ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGVmZTNhMDkuLjE1ZDcyYTEgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTUsOSArMTUsMTEgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9NT0RVTEUgOj0gYW50bHIKK0xPQ0FMX01PRFVMRSA6PSBhbnRsci1ydW50aW1lCiAjTE9DQUxfU0RLX1ZFUlNJT04gOj0gOAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhKQorI1JlbW92ZSBET1RUcmVlR2VuZXJhdG9yLmphdmEsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aGUgU3RyaW5nVGVtcGxhdGUgbGlicmFyeSBhcyBhIGRlcGVuZGVuY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGZpbHRlci1vdXQgYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvRE9UVHJlZUdlbmVyYXRvci5qYXZhLCAkKExPQ0FMX1NSQ19GSUxFUykpCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBpbmNsdWRlICQoQlVJTERfSE9TVF9KQVZBX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9NT0RVTEVfTElDRU5TRV9CU0QgYi9NT0RVTEVfTElDRU5TRV9CU0QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL01PRFVMRV9MSUNFTlNFX0JTRApkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxY2M5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RJQ0UKQEAgLTAsMCArMSwyNiBAQAorW1RoZSAiQlNEIGxpY2Vuc2UiXQorQ29weXJpZ2h0IChjKSAyMDEgVGVyZW5jZSBQYXJyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9CVUlMRC50eHQgYi9hbnRsci0zLjQvQlVJTEQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTQxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvQlVJTEQudHh0CkBAIC0wLDAgKzEsNDkzIEBACisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyBNYXZlbiBQbHVnaW4gLSBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKaW0gSWRsZQorCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJ1aWxkIGluc3RydWN0aW9ucyBmb3IgdGhlIEFOVExSIHRvb2xzZXQgYXMKK29mIHZlcnNpb24gMy4xLjMgYW5kIGJleW9uZC4KKworVGhlIEFOVExSIHRvb2xzZXQgbXVzdCBiZSBidWlsdCB1c2luZyB0aGUgTWF2ZW4gYnVpbGQgc3lzdGVtIGFzCit0aGlzIGJ1aWxkIHN5c3RlbSB1cGRhdGVzIHRoZSB2ZXJzaW9uIG51bWJlcnMgYW5kIGNvbnRyb2xzIHRoZQord2hvbGUgYnVpbGQgcHJvY2Vzcy4gSG93ZXZlciwgaWYgeW91IGp1c3Qgd2FudCB0aGUgbGF0ZXN0IGJ1aWxkCithbmQgZG8gbm90IGNhcmUgdG8gbGVhcm4gYW55dGhpbmcgYWJvdXQgTWF2ZW4sIHRoZW4gdmlzaXQgdGhlICd0YXJnZXQnCitkaXJlY3RvcmllcyAoZm9yIGphcnMpIHVuZGVyIHRoZSBkZXBvdCBtaXJyb3Igcm9vdCBoZXJlOgorCisgICBodHRwOi8vYW50bHIub3JnL2RlcG90CisKK0lmIHlvdSBhcmUgbG9va2luZyBmb3IgdGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIEFOVExSLCB0aGVuCit2aXNpdCB0aGUgZG93bmxvYWRzIHBhZ2Ugb24gdGhlIG1haW4gYW50bHIub3JnIHdlYnNpdGUuCisKK1RoZXNlIGluc3RydWN0aW9ucyBhcmUgbWFpbmx5IGZvciB0aGUgQU5UTFIgZGV2ZWxvcG1lbnQgdGVhbSwKK3Rob3VnaCB5b3UgYXJlIGZyZWUgdG8gYnVpbGQgQU5UTFIgeW91cnNlbGYgb2YgY291cnNlLgorCitTb3VyY2UgY29kZSBTdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtYWluIGRldmVsb3BtZW50IGJyYW5jaCBvZiBBTlRMUiBpcyBzdG9yZWQgd2l0aGluIHRoZSBQZXJmb3JjZSBTQ00gYXQ6CisKKyAgIC8vZGVwb3QvY29kZS9hbnRsci9tYWluLy4uLgorCityZWxlYXNlIGJyYW5jaGVzIGFyZSBzdG9yZWQgaW4gUGVyZm9yY2UgbGlrZSBzbzoKKworICAgLy9kZXBvdC9jb2RlL2FudGxyL3JlbGVhc2UtMy4xLjMvLi4uCisKK0luIHRoaXMgdG9wIGxldmVsIGRpcmVjdG9yeSwgeW91IHdpbGwgZmluZCBhIG1hc3RlciBidWlsZCBmaWxlIGZvcgorTWF2ZW4gY2FsbGVkIHBvbS54bWwgYW5kIHlvdSB3aWxsIGFsc28gbm90ZSB0aGF0IHRoZXJlIGFyZSBhIG51bWJlciBvZgorc3ViZGlyZWN0b3JpZXM6CisKKyB0b29sICAgICAgICAgICAgICAgICAgLSBUaGUgQU5UTFIgdG9vbCBpdHNlbGYKKyBydW50aW1lL0phdmEgICAgICAgICAgLSBUaGUgQU5UTFIgSmF2YSBydW50aW1lCisgcnVudGltZS9YICAgICAgICAgICAgIC0gVGhlIHJ1bnRpbWUgZm9yIGxhbmd1YWdlIHRhcmdldCBYCisgZ3VuaXQgICAgICAgICAgICAgICAgIC0gVGhlIGdyYW1tYXIgdGVzdCB0b29sCisgYW50bHIzLW1hdmVuLXBsdWdpbiAgIC0gVGhlIHBsdWdpbiB0b29sIGZvciBNYXZlbiBhbGxvd2luZyBNYXZlbgorIAkJICAgICAgICAgIHByb2plY3RzIHRvIHByb2Nlc3MgQU5UTFIgZ3JhbW1hcnMuCisKK0VhY2ggb2YgdGhlc2Ugc3ViLWRpcmVjdG9yaWVzIGFsc28gY29udGFpbnMgYSBmaWxlIHBvbS54bWwgdGhhdAorY29udHJvbHMgdGhlIGJ1aWxkIG9mIGVhY2ggc3ViLWNvbXBvbmVudCAob3IgbW9kdWxlIGluIE1hdmVuCitwYXJsYW5jZSkuCisKK0J1aWxkIFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0Fsb25nc2lkZSBlYWNoIHBvbS54bWwgKG90aGVyIHRoYW4gZm9yIHRoZSBhbnRscjMtbWF2ZW4tcGx1Z2luKSwgeW91Cit3aWxsIHNlZSB0aGF0IHRoZXJlIGlzIGEgZmlsZSBjYWxsZWQgYW50bHIuY29uZmlnLiBUaGlzIGZpbGUgaXMgY2FsbGVkCithIGZpbHRlciBhbmQgc2hvdWxkIGNvbnRhaW4gYSBzZXQgb2Yga2V5L3ZhbHVlIHBhaXJzIGluIHRoZSBzYW1lCittYW5uZXIgYXMgSmF2YSBwcm9wZXJ0aWVzIGZpbGVzOgorCithbnRsci5zb21ldGhpbmc9IlNvbWUgY29uZmlnIHRoYW5nISIKKworV2hlbiB0aGUgYnVpbGQgb2YgYW55IGNvbXBvbmVudCBoYXBwZW5zLCBhbnkgdmFsdWVzIGluIHRoZQorYW50bHIuY29uZmlnIGZvciB0aGUgbWFzdGVyIGJ1aWxkIGZpbGUgYW5kIGFueSB2YWx1ZXMgaW4gdGhlCithbnRsci5jb25maWcgZmlsZSBmb3IgZWFjaCBjb21wb25lbnQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZQorYnVpbGQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgdGhlIHJlc291cmNlIHByb2Nlc3Nvciwgd2hpY2ggd2lsbAorZmlsdGVyIGFueSBmaWxlIGl0IGZpbmRzIHVuZGVyOiBzcmMvbWFpbi9yZXNvdXJjZXMvKiogYW5kIHJlcGxhY2UgYW55CityZWZlcmVuY2VzIHN1Y2ggYXMgJHthbnRsci5zb21ldGhpbmd9IHdpdGggdGhlIGFjdHVhbCB2YWx1ZSBhdCB0aGUKK3RpbWUgb2YgdGhlIGJ1aWxkLgorCitCdWlsZGluZworLS0tLS0tLS0KKworQnVpbGRpbmcgQU5UTFIgaXMgdHJpdmlhbCwgYXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSBsb2FkZWQgTWF2ZW4gdmVyc2lvbgorMy4wLjMgb3IgYmV0dGVyIG9uIHRvIHlvdXIgYnVpbGQgc3lzdGVtIGFuZCBpbnN0YWxsZWQgaXQgYXMgZXhwbGFpbmVkCitoZXJlOgorCitodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sCisKK05vdGUgdGhhdCB0aGUgQU5UTFIgdG9vbHNldCB3aWxsIE9OTFkgYnVpbGQgd2l0aCB2ZXJzaW9uIDMuMC4zIG9mIE1hdmVuCithcyBvZiByZWxlYXNlIDMuNC4KKworSWYgeW91IGFyZSB1bmZhbWlsaWFyIHdpdGggTWF2ZW4gKGFuZCBldmVuIGlmIHlvdSBhcmUpLCB0aGUgYmVzdAorcmVzb3VyY2UgZm9yIGxlYXJuaW5nIGFib3V0IGl0IGlzIFRoZSBEZWZpbml0aXZlIEd1aWRlOgorCitodHRwOi8vd3d3LnNvbmF0eXBlLmNvbS9ib29rcy9tYXZlbi1ib29rL3JlZmVyZW5jZS9wdWJsaWMtYm9vay5odG1sCisKK1RoZSBpbnN0cnVjdGlvbnMgaGVyZSBhc3N1bWUgdGhhdCBNYXZlbiBpcyBpbnN0YWxsZWQgYW5kIHdvcmtpbmcgY29ycmVjdGx5LgorCitJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlIGJ1aWx0IHRoZSBBTlRMUiB0b29sc2V0LCB5b3Ugd2lsbAorcG9zc2libHkgbmVlZCB0byBpbnN0YWxsIHRoZSBtYXN0ZXIgcG9tIGluIHlvdXIgbG9jYWwgcmVwb3NpdG9yeQorKGhvd2V2ZXIgdGhlIGJ1aWxkIG1heSBiZSBhYmxlIHRvIGxvY2F0ZSB0aGlzIGluIHRoZSBBTlRMUiBzbmFwc2hvdCBvcgorcmVsZWFzZSByZXBvc2l0b3J5KS4gSWYgeW91IHRyeSB0byBidWlsZCBzdWItbW9kdWxlcyBvbiB0aGVpciBvd24gKGFzCitpbiBydW4gdGhlIG12biBjb21tYW5kIGluIHRoZSBzdWIgZGlyZWN0b3J5IGZvciB0aGF0IHRvb2wsIHN1Y2ggYXMKK3J1bnRpbWUvSmF2YSksIGFuZCB5b3UgcmVjZWl2ZSBhIG1lc3NhZ2UgdGhhdCBtYXZlbiBjYW5ub3QgZmluZCB0aGUKK21hc3RlciBwb20sIHRoZW4gZXhlY3V0ZSB0aGlzIGluIHRoZSBtYWluIChvciByZWxlYXNlKSBkaXJlY3Rvcnk6CisKK212biAtTiBpbnN0YWxsCisKK1RoaXMgY29tbWFuZCB3aWxsIGluc3RhbGwgdGhlIG1hc3RlciBidWlsZCBwb20gaW4geW91ciBsb2NhbCBtYXZlbgorcmVwb3NpdG9yeSAoaXQncyB+Ly5tMiBvbiBVTklYKSBhbmQgaW5kaXZpZHVhbCBidWlsZHMgb2Ygc3ViLW1vZHVsZXMKK3dpbGwgbm93IHdvcmsgY29ycmVjdGx5LgorCitUbyBidWlsZCB0aGVuLCBzaW1wbHkgY2QgaW50byB0aGUgbWFzdGVyIGJ1aWxkIGRpcmVjdG9yeQorKGUuZy4gJFA0Uk9PVC8vY29kZS9hbnRsci9tYWluKSBhbmQgdHlwZToKKworbXZuIC1EbWF2ZW4udGVzdC5za2lwPXRydWUKKworQXNzdW1pbmcgdGhhdCBldmVyeXRoaW5nIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQgYW5kIHN5bmNocm9uaXplZCwgdGhlbgorQU5UTFIgd2lsbCBidWlsZCBhbmQgc2tpcCBhbnkgdW5pdCB0ZXN0cyBpbiB0aGUgbW9kdWxlcyAodGhlIEFOVExSCit0b29sIHRlc3RzIGNhbiB0YWtlIGEgbG9uZyB0aW1lKS4KKworVGhpcyBjb21tYW5kIHdpbGwgYnVpbGQgZWFjaCBvZiB0aGUgdG9vbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kCit3aWxsIGNyZWF0ZSB0aGUgamFyIGFydGlmYWN0cyBvZiBhbGwgdGhlIGNvbXBvbmVudHMgaW4geW91ciBsb2NhbAorZGV2ZWxvcG1lbnQgTWF2ZW4gcmVwb3NpdG9yeSAod2hpY2ggdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHJlbW90ZQorcmVwb3NpdG9yaWVzIGJ5IGRlZmF1bHQpLiBBdCB0aGUgZW5kIG9mIHRoZSBidWlsZCB5b3Ugc2hvdWxkIHNlZToKKworW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW0lORk9dIFJlYWN0b3IgU3VtbWFyeToKK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSBBTlRMUiBNYXN0ZXIgYnVpbGQgY29udHJvbCBQT00gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzEuMzczc10KK1tJTkZPXSBBbnRsciAzIFJ1bnRpbWUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzAuODc5c10KK1tJTkZPXSBBTlRMUiBHcmFtbWFyIFRvb2wgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzUuNDMxc10KK1tJTkZPXSBNYXZlbiBwbHVnaW4gZm9yIEFOVExSIFYzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzEuMjc3c10KK1tJTkZPXSBBTlRMUiBnVW5pdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzEuNTY2c10KK1tJTkZPXSBNYXZlbiBwbHVnaW4gZm9yIGdVbml0IEFOVExSIFYzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIFNVQ0NFU1MgWzAuMDc5c10KK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSBCVUlMRCBTVUNDRVNTRlVMCitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbSU5GT10gVG90YWwgdGltZTogMTEgc2Vjb25kcworCitIb3dldmVyLCB1bmxlc3MgeW91IGFyZSB1c2luZyBNYXZlbiBleGNsdXNpdmVseSBpbiB5b3VyIHByb2plY3RzLCB5b3UKK3dpbGwgbW9zdCBsaWtlbHkgd2FudCB0byBidWlsZCB0aGUgQU5UTFIgVWJlciBKYXIsIHdoaWNoIGlzIGFuCitleGVjdXRhYmxlIGphciBjb250YWluaW5nIGFsbCB0aGUgY29tcG9uZW50cyB0aGF0IEFOVExSIG5lZWRzIHRvIGJ1aWxkCithbmQgcnVuIHBhcnNlcnMgKG5vdGUgdGhhdCBhdCBydW50aW1lLCB5b3UgbmVlZCBvbmx5IHRoZSBydW50aW1lCitjb21wb25lbnRzIHlvdSB1c2UsIHN1Y2ggYXMgdGhlIEphdmEgcnVudGltZSBhbmQgc2F5IHN0cmluZ3RlbXBsYXRlKS4KKworQmVjYXVzZSB0aGUgVWJlciBqYXIgaXMgbm90IHNvbWV0aGluZyB3ZSB3YW50IHRvIGRlcGxveSB0byBNYXZlbgorcmVwb3NpdG9yaWVzIGl0IGlzIGJ1aWx0IHdpdGggYSBzcGVjaWFsIGludm9jYXRpb24gb2YgTWF2ZW46CisKK212biAtRG1hdmVuLnRlc3Quc2tpcD10cnVlIHBhY2thZ2UgYXNzZW1ibHk6YXNzZW1ibHkKKworTm90ZSB0aGF0IE1hdmVuIHdpbGwgYXBwZWFyIHRvIGJ1aWxkIGV2ZXJ5dGhpbmcgdHdpY2UsIHdoaWNoIGlzIGEKK3F1aXJrIG9mIGhvdyBpdCBjYWxjdWxhdGVzIHRoZSBkZXBlbmRlbmNpZXMgYW5kIG1ha2VzIHN1cmUgaXQgaGFzCitldmVyeXRoaW5nIHBhY2thZ2VkIHVwIHNvIGl0IGNhbiBidWlsZCB0aGUgdWJlci1qYXIgYXNzZW1ibHkuCisKK1NvbWV3aGVyZSBpbiB0aGUgYnVpbGQgb3V0cHV0ICh0b3dhcmRzIHRoZSBlbmQpLCB5b3Ugd2lsbCBmaW5kIGEgbGluZQorbGlrZSB0aGlzOgorCitbSU5GT10gQnVpbGRpbmcgamFyOiAvaG9tZS9qaW1pL2FudGxyc3JjL2NvZGUvYW50bHIvbWFpbi90YXJnZXQvYW50bHItbWFzdGVyLTMuNC1TTkFQU0hPVC1jb21wbGV0ZWphci5qYXIKKworVGhpcyBpcyB0aGUgZXhlY3V0YWJsZSBqYXIgdGhhdCB5b3UgbmVlZCBhbmQgeW91IGNhbiBlaXRoZXIgY29weSBpdAorc29tZXdoZXJlIG9yLCBsaWtlIG1lLCB5b3UgY2FuIGNyZWF0ZSB0aGlzIHNjcmlwdCAoYXNzdW1pbmcgVU5JWCkKK3NvbWV3aGVyZSBpbiB5b3VyIFBBVEg6CisKKyMhIC9iaW4vYmFzaAoramF2YSAtamFyIH4vYW50bHJzcmMvY29kZS9hbnRsci9tYWluL3RhcmdldC9hbnRsci1tYXN0ZXItMy40LVNOQVBTSE9ULWNvbXBsZXRlamFyLmphciAkKgorCitWZXJzaW9uIE51bWJlcmluZworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlyc3QgYW5kIEdvbGRlbiBydWxlIGlzIHRoYXQgYW55IHBvbSBmaWxlcyBzdG9yZWQgdW5kZXIgdGhlIG1haW4KK2JyYW5jaCBvZiB0aGUgdG9vbHNldCBzaG91bGQgbmV2ZXIgYmUgbW9kaWZpZWQgdG8gY29udGFpbiBhIHJlbGVhc2UKK3ZlcnNpb24gbnVtYmVyLiBUaGV5IHNob3VsZCBhbHdheXMgY29udGFpbiBhLmIuYy1TTkFQU0hPVAorKGUuZy4gMy4xLjMtU05BUFNIT1QpLiBPbmx5IHJlbGVhc2UgYnJhbmNoZXMgc2hvdWxkIGhhdmUgdGhlaXIgcG9tCit2ZXJzaW9uIG51bWJlcnMgc2V0IHRvIGEgcmVsZWFzZSB2ZXJzaW9uLiBZb3UgY2FuIHJlbGVhc2UgYXMgbWFueQorU05BUFNIT1RTIGFzIHlvdSBsaWtlLCBidXQgb25seSBvbmUgcmVsZWFzZSB2ZXJzaW9uLiBIb3dldmVyLCByZWxlYXNlCit2ZXJzaW9ucyBtYXkgYmUgdXBkYXRlZCB3aXRoIGEgcGF0Y2ggbGV2ZWw6IDMuMS4zLTEsIDMuMS4zLTIgYW5kIHNvCitvbi4KKworRm9ydHVuYXRlbHksIE1hdmVuIGhlbHBzIHVzIHdpdGggdGhlIHZlcnNpb24gbnVtYmVyaW5nIGluIGEgbnVtYmVyIG9mCit3YXlzLiBGaXJzdGx5LCB0aGUgcG9tLnhtbCBmaWxlcyBmb3IgdGhlIHZhcmlvdXMgbW9kdWxlcyBkbyBub3QKK3NwZWNpZnkgYSB2ZXJzaW9uIG9mIHRoZSBhcnRpZmFjdHMgdGhlbXNlbHZlcy4gVGhleSBwaWNrIHVwIHRoZWlyCit2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBtYXN0ZXIgYnVpbGQgcG9tLiAgSG93ZXZlciwgdGhlcmUgaXMgYSBjYXRjaCwKK2JlY2F1c2UgdGhleSBuZWVkIHRvIGtub3cgd2hhdCB2ZXJzaW9uIG9mIHRoZSBwYXJlbnQgcG9tIHRoZXkgaW5oZXJpdAorZnJvbSBhbmQgc28gdGhleSBETyBtZW50aW9uIHRoZSB2ZXJzaW9uIG51bWJlci4gSG93ZXZlciwgdGhpcyBkb2VzCitwcmV2ZW50IGFjY2lkZW50YWxseSByZWxlYXNpbmcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHN1Yi1tb2R1bGVzIHRoYW4KK3RoZSBtYXN0ZXIgcG9tIGRlc2NyaWJlcy4KKworRm9ydHVuYXRlbHkgb25jZSBhZ2FpbiwgTWF2ZW4gaGFzIGEgbmVhdCB3YXkgb2YgaGVscGluZyB1cyBjaGFuZ2UgdGhlCit2ZXJzaW9uLiAgQWxsIHlvdSBuZWVkIGRvIGlzIGNoZWNrIG91dCBhbGwgdGhlIHBvbS54bWwgZmlsZXMgZnJvbQorcGVyZm9yY2UsIHRoZW4gbW9kaWZ5IHRoZSA8dmVyc2lvbj5hLmIuYy1TTkFQU0hPVDwvdmVyc2lvbj4gaW4gdGhlCittYXN0ZXIgcG9tLiBXaGVuIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBjb3JyZWN0IGluIHRoZSBtYXN0ZXIgcG9tLCB5b3UKK21ha2Ugc3VyZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbWFzdGVyIHBvbSBhbmQKK3R5cGU6CisKK212biB2ZXJzaW9uczp1cGRhdGUtY2hpbGQtbW9kdWxlcworCitUaGlzIGNvbW1hbmQgd2lsbCB0aGVuIHVwZGF0ZSB0aGUgY2hpbGQgcG9tLnhtbCBmaWxlcyB0byByZWZsZWN0IHRoZQordmVyc2lvbiBudW1iZXIgZGVmaW5lZCBpbiB0aGUgbWFzdGVyIHBvbS54bWwuCisKK1RoZXJlIGlzIHVuZm9ydHVuYXRlbHkgb25lIGxhc3QgY2F0Y2ggaGVyZSB0aG91Z2ggYW5kIHRoYXQgaXMgdGhhdCB0aGUKK2FudGxyMy1tYXZlbi1wbHVnaW4gYW5kIHRoZSBndW5pdC1tYXZlbi1wbHVnaW4gYXJlIG5vdCBhYmxlIHRvIHVzZSB0aGUKK3BhcmVudCBwb20uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgc3VidGxlIGJ1dCBtYWtlcyBzZW5zZSBhcyBkb2luZyBzbword291bGQgY3JlYXRlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBBTlRMUiB0b29sICh3aGljaCB1c2VzCit0aGUgcGx1Z2luIHRvIGJ1aWxkIGl0cyBvd24gZ3JhbW1hciBmaWxlcyksIGFuZCB0aGUgcGx1Z2lucyAod2hpY2gKK3VzZXMgdGhlIHRvb2wgdG8gYnVpbGQgZ3JhbW1hciBmaWxlcyBhbmQgZ3VuaXQgdG8gdGVzdCkuCisKK1RoaXMgY2F0Y2gtMjIgc2l0dWF0aW9uIG1lYW5zIHRoYXQgdGhlIHBvbS54bWwgZmlsZSBpbiB0aGUKK2FudGxyMy1tYXZlbi1wbHVnaW4gZGlyZWN0b3J5IGFuZCB0aGUgb25lIGluIHRoZSBndW5pdC1tYXZlbi1wbHVnaW4KK2RpcmVjdG9yeSBNVVNUIGJlIHVwZGF0ZWQgbWFudWFsbHkgKG9yIHdlIG11c3Qgd3JpdGUgYSBzY3JpcHQgdG8gZG8KK3RoaXMpLgorCitGaW5hbGx5LCB3ZSBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgYmVjYXVzZSB0aGUgdG9vbCBpcyBkZXBlbmRlbnQgb24gdGhlCithbnRscjMtbWF2ZW4tcGx1Z2luIGFuZCB0aGUgcGx1Z2luIGlzIGl0c2VsZiBkZXBlbmRlbnQgb24gdGhlCit0b29sLCB0aGF0IHdlIG11c3QgbWFudWFsbHkgdXBkYXRlIHRoZSB2ZXJzaW9ucyBvZiBlYWNoIHRoYXQgdGhleQorcmVmZXJlbmNlLiBTbywgd2hlbiB3ZSBidW1wIHRoZSB2ZXJzaW9uIG9mIHRoZSB0b29sc2V0IHRvIHNheQorMy4xLjQtU05BUFNIT1QsIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBhbnRscjMtbWF2ZW4tcGx1Z2luIHBvbS54bWwgYW5kCit0aGUgZ3VuaXQtbWF2ZW4tcGx1Z2luIHBvbS54bWwgdG8gcmVmZXJlbmNlIHRoYXQgdmVyc2lvbiBvZiB0aGUgYW50bHIKK3Rvb2wuIFRoZSB0b29sIGl0c2VsZiBpcyBhbHdheXMgYnVpbHQgd2l0aCB0aGUgcHJpb3IgcmVsZWFzZWQgdmVyc2lvbgorb2YgdGhlIHBsdWdpbiwgc28gd2hlbiB3ZSByZWxlYXNlIHdlIG11c3QgY2hhbmdlIHRoZSBtYWluIGJyYW5jaCBvZgordGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ld2x5IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIHBsdWdpbi4gVGhpcyBpcworY292ZXJlZCBpbiB0aGUgcmVsZWFzZSBjaGVja2xpc3QuCisKK0RlcGxveWluZworLS0tLS0tLS0tLQorCitEZXBsb3lpbmcgdGhlIHRvb2xzIGF0IHRoZSBjdXJyZW50IHZlcnNpb24gaXMgcmVsYXRpdmVseSBlYXN5LCBidXQgdG8KK2RlcGxveSB0byB0aGUgQU5UTFIgcmVwb3NpdG9yaWVzIChzbmFwc2hvdCBvciByZWxlYXNlKSB5b3UgbXVzdCBoYXZlCitiZWVuIGdyYW50ZWQgYWNjZXNzIHRvIHRoZSBTb25hdHlwZSBPU1MgcmVwb3NpdG9yaWVzJyBBTlRMUiBsb2dpbi4gCitGZXcgcGVvcGxlIHdpbGwgaGF2ZSB0aGlzIGFjY2VzcyBvZiBjb3Vyc2UuCisKK05leHQsIGJlY2F1c2Ugd2UgZG8gbm90IHB1Ymxpc2ggYWNjZXNzIGluZm9ybWF0aW9uIGZvciBhbnRsci5vcmcsIHlvdQord2lsbCBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgcmVwb3NpdG9yeSBzZXJ2ZXIgbmFtZXMgbG9jYWxseS4gWW91IGRvCit0aGlzIGJ5IGNyZWF0aW5nIChvciBhZGRpbmcgdG8pIHRoZSBmaWxlOgorCit+Ly5tMi9zZXR0aW5ncy54bWwKKworV2hpY2ggc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgorCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNldHRpbmdzPgorICA8c2VydmVycz4KKyAgICA8c2VydmVyPgorICAgICAgPGlkPnNvbmF0eXBlLW5leHVzLXNuYXBzaG90czwvaWQ+CisgICAgICA8dXNlcm5hbWU+eHh4eHh4eDwvdXNlcm5hbWU+CisgICAgICA8cGFzc3dvcmQ+eHh4eHh4eDwvcGFzc3dvcmQ+CisgICAgPC9zZXJ2ZXI+CisgICAgPHNlcnZlcj4KKyAgICAgIDxpZD5zb25hdHlwZS1uZXh1cy1zdGFnaW5nPC9pZD4KKyAgICAgIDx1c2VybmFtZT54eHh4eHh4PC91c2VybmFtZT4KKyAgICAgIDxwYXNzd29yZD54eHh4eHh4PC9wYXNzd29yZD4KKyAgICA8L3NlcnZlcj4KKyAgPC9zZXJ2ZXJzPgorPC9zZXR0aW5ncz4KKworV2hlbiB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgaW4gcGxhY2UsIHlvdSB3aWxsIGJlIGFibGUgdG8gZGVwbG95IHRoZSBjb21wb25lbnRzLAorZWl0aGVyIGluZGl2aWR1YWxseSBvciBmcm9tIHRoZSBtYXN0ZXIgZGlyZWN0b3J5OgorCittdm4gLURtYXZlbi50ZXN0LnNraXA9dHJ1ZSAtRGRlcGxvdCBkZXBsb3kKKworWW91IHdpbGwgdGhlbiBzZWUgbG90cyBvZiBpbmZvcm1hdGlvbiBhYm91dCBjaGVja2luZyBleGlzdGluZyB2ZXJzaW9uCitpbmZvcm1hdGlvbiBhbmQgc28gb24sIGFuZCB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGRlcGxveWVkIG9uY2UgeW91CitzdXBwbHkgdGhlIEFOVExSIHB1YmxpYyBrZXkgcGFzc3BocmFzZSB0byBzaWduIHRoZSBqYXJzLgorCitOb3RlIHRoYXQgc28gbG9uZyBhcyB0aGUgYXJ0aWZhY3RzIGFyZSB2ZXJzaW9uZWQgd2l0aCBhLmIuYy1TTkFQU0hPVAordGhlbiBkZXBsb3ltZW50IHdpbGwgYWx3YXlzIGJlIHRvIHRoZSBkZXZlbG9wbWVudCBzbmFwc2hvdAorZGlyZWN0b3J5LiBXaGVuIHRoZSBhcnRpZmFjdHMgYXJlIHZlcnNpb25lZCB3aXRoIGEgcmVsZWFzZSB2ZXJzaW9uCit0aGVuIGRlcGxveW1lbnQgd2lsbCBiZSB0byB0aGUgcmVsZWFzZSBzdGFoaW5oIHJlcG9zaXRvcnksIHdoaWNoCit3aWxsIHRoZW4gYmUgbWlycm9yZWQgYXJvdW5kIHRoZSB3b3JsZCBpZiBjbG9zZWQgYW5kIHJlbGVhc2UuCitUaGUgc29uYXR5cGUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgY29uc3VsdGVkLgorCitSZWxlYXNlIENoZWNrbGlzdAorLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgaXMgdGhlIHByb2NlZHVyZSB0byB1c2UgdG8gbWFrZSBhIHJlbGVhc2Ugb2YgQU5UTFIuIE5vdGUgdGhhdCB3ZQorc2hvdWxkIHJlYWxseSB1c2UgdGhlIG12biByZWxlYXNlOnJlbGVhc2UgY29tbWFuZCwgYnV0IHRoZSBwZXJmb3JjZQorcGx1Z2luIGZvciBNYXZlbiBpcyBub3QgY29tbWVyY2lhbCBxdWFsaXR5IGFuZCBJIHdhbnQgdG8gcmV3cml0ZSBpdC4KKworRm9yIHRoaXMgY2hlY2tsaXN0LCBsZXQncyBhc3N1bWUgdGhhdCB0aGUgY3VycmVudCBkZXZlbG9wbWVudCB2ZXJzaW9uCitvZiBBTlRMUiBpcyAzLjEuMy1TTkFQU0hPVC4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgcHJvYmFibHkgKGJ1dCBub3QKK25lY2Vzc2FyaWx5KSBiZWNvbWUgcmVsZWFzZSB2ZXJzaW9uIDMuMS4zIGFuZCB0aGF0IHRoZSBkZXZlbG9wbWVudAordmVyc2lvbiB3aWxsIGJ1bXAgdG8gMy4xLjQtU05BUFNIT1QuCisKKzApIFJ1biBhIGJ1aWxkIG9mIHRoZSBtYWluIGJyYW5jaCBhbmQgY2hlY2sgdGhhdCBpdCBpcyBidWlsZHMgYW5kCisgICBwYXNzZXMgYXMgbWFueSB0ZXN0cyBhcyB5b3Ugd2FudCBpdCB0by4KKworMSkgRmlyc3QgbWFrZSBhIGJyYW5jaCBmcm9tIG1haW4gaW50byB0aGUgdGFyZ2V0IHJlbGVhc2UKKyAgIGRpcmVjdG9yeS4gVGhlbiBzdWJtaXQgdGhpcyB0byBwZXJmb3JjZS4gWW91IGNvdWxkIGNoYW5nZSB2ZXJzaW9ucworICAgbnVtYmVycyBiZWZvcmUgc3VibWl0dGluZywgYnV0IGRvaW5nIHRoYXQgaW4gc2VwYXJhdGUgc3RhZ2VzIHdpbGwKKyAgIGtlZXAgdGhpbmdzIHNhbmU7CisKKy0tLSBVc2UgbWFpbiBkZXZlbG9wbWVudCBicmFuY2ggZnJvbSBoZXJlIC0tLQorCisyKSBCZWZvcmUgd2UgZGVwbG95IHRoZSByZWxlYXNlLCB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgdmVyc2lvbnMgb2YgdGhlCisgICBkZXZlbG9wbWVudCBicmFuY2gsIHNvIHdlIGRvbid0IGRlcGxveSB3aGF0IGlzIG5vdyB0aGUgbmV3IHJlbGVhc2UKKyAgIGFzIGFuIG9sZGVyIHNuYXBzaG90ICh0aGlzIGlzIG5vdCBzdXBlciBpbXBvcnRhbnQsIGJ1dCBwcm9jZWR1cmUgaXMKKyAgIGdvb2QgcmlnaHQ/KS4KKworICAgQ2hlY2sgb3V0IGFsbCB0aGUgcG9tLnhtbCBmaWxlcyAoYW5kIGlmIHlvdSBhcmUgdXNpbmcgYW55CisgICBhbnRsci5jb25maWcgcGFyYW1ldGVycyB0aGF0IG11c3QgY2hhbmdlLCB0aGVuIGRvIHRoYXQgdG9vKS4KKworMykgRWRpdCB0aGUgbWFzdGVyIHBvbS54bWwgaW4gdGhlIG1haW4gZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdGhlIHZlcnNpb24gZnJvbQorICAgMy4xLjMtU05BUFNIT1QgdG8gMy4xLjQtU05BUFNIT1QuCisKKzQpIEVkaXQgdGhlIHBvbS54bWwgZmlsZSBmb3IgYW50bHIzLW1hdmVuLXBsdWdpbiB1bmRlciB0aGUgbWFpbgorICAgZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdGhlIHZlcnNpb24gZnJvbSAzLjEuMy1TTkFQU0hPVCB0bworICAgMy4xLjQtU05BUFNIT1QuIERvIHRoZSBzYW1lIGZvciB0aGUgcG9tLnhtbCBpbiB0aGUKKyAgIGd1bml0LW1hdmVuLXBsdWdpbiBkaXJlY3RvcnkuCisKKyAgIFVwZGF0ZSB0aGUgcG9tLnhtbCBmb3IgdGhlIGFyY2hldHlwZSBtYW51YWxseSB0b28uCisKKzUpIE5vdyAoZnJvbSB0aGUgbWFpbiBkaXJlY3RvcnkpLCBydW4gdGhlIGNvbW1hbmQ6CisKKyAgICAgICAgIG12biB2ZXJzaW9uczp1cGRhdGUtY2hpbGQtbW9kdWxlcworCisgICAgICBZb3Ugc2hvdWxkIHNlZToKKworICAgICAgICAgW0lORk9dIFt2ZXJzaW9uczp1cGRhdGUtY2hpbGQtbW9kdWxlc10KKyAgICAgICAgIFtJTkZPXSBNb2R1bGU6IGd1bml0CisgICAgICAgICBbSU5GT10gICBQYXJlbnQgaXMgb3JnLmFudGxyOmFudGxyLW1hc3RlcjozLjEuNC1TTkFQU0hPVAorICAgICAgICAgW0lORk9dIE1vZHVsZTogcnVudGltZS9KYXZhCisgICAgICAgICBbSU5GT10gICBQYXJlbnQgaXMgb3JnLmFudGxyOmFudGxyLW1hc3RlcjozLjEuNC1TTkFQU0hPVAorICAgICAgICAgW0lORk9dIE1vZHVsZTogdG9vbAorICAgICAgICAgW0lORk9dICAgUGFyZW50IGlzIG9yZy5hbnRscjphbnRsci1tYXN0ZXI6My4xLjQtU05BUFNIT1QKKworNikgUnVuIGEgYnVpbGQgb2YgdGhlIG1haW4gYnJhbmNoOgorCisgICAgICAgICBtdm4gLURtYXZlbi50ZXN0LnNraXA9dHJ1ZQorCisgICAgICAgQWxsIHNob3VsZCBiZSBnb29kLgorCis3KSBTdWJtaXQgdGhlIHBvbSBjaGFuZ2VzIG9mIHRoZSBtYWluIGJyYW5jaCB0byBwZXJmb3JjZS4KKworOCkgRGVwbG95IHRoZSBuZXcgc25hcHNob3QgYXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIG5leHQgcmVsZWFzZS4gSXQKKyAgIHdpbGwgZ28gdG8gdGhlIHNuYXBzaG90IHJlcG9zaXRvcnkgb2YgY291cnNlOgorCisJICBtdm4gLU4gZGVwbG95CisgICAgICAgICAgbXZuIC1EbWF2ZW4udGVzdC5za2lwPXRydWUgZGVwbG95CisKKzkpIFlvdSBhcmUgbm93IGZpbmlzaGVkIHdpdGggdGhlIG1haW4gZGV2ZWxvcG1lbnQgYnJhbmNoIGFuZCBzaG91bGQgY2hhbmdlCisgICB3b3JraW5nIGRpcmVjdG9yaWVzIHRvIHRoZSByZWxlYXNlIGJyYW5jaCB5b3UgbWFkZSBlYXJsaWVyLgorCistLS0gVXNlIHJlbGVhc2UgYnJhbmNoIGZyb20gaGVyZSAtLS0KKworMTApIENoZWNrIG91dCBhbGwgdGhlIHBvbS54bWwgZmlsZXMgaW4gdGhlIHJlbGVhc2UgYnJhbmNoIChhbmQgaWYgeW91IGFyZQorICAgIHVzaW5nIGFueSBhbnRsci5jb25maWcgcGFyYW1ldGVycyB0aGF0IG11c3QgY2hhbmdlLCB0aGVuIGRvIHRoYXQgdG9vKS4KKworMTEpIEVkaXQgdGhlIG1hc3RlciBwb20ueG1sIGluIHRoZSByZWxlYXNlLTMuMS4zIGRpcmVjdG9yeSBhbmQgY2hhbmdlCisgICAgdGhlIHZlcnNpb24gZnJvbSAzLjEuMy1TTkFQU0hPVCB0byAzLjEuMy4KKworMTIpIEVkaXQgdGhlIHBvbS54bWwgZmlsZSBmb3IgYW50bHIzLW1hdmVuLXBsdWdpbiB1bmRlciB0aGUKKyAgICByZWxlYXNlLTMuMS4zIGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRoZSB2ZXJzaW9uIGZyb20gMy4xLjMtU05BUFNIT1QKKyAgICB0byAzLjEuMy4gQWxzbyBjaGFuZ2UgdGhlIHZlcnNpb24gb2YgdGhlIHRvb2wgdGhhdCB0aGUgdGhpcworICAgIHBvbS54bWwgcmVmZXJlbmNlcyBmcm9tIDMuMS4zLVNOQVBTSE9UIHRvIDMuMS4zIGFzIHdlIGFyZSBub3cKKyAgICByZWxlYXNpbmcgdGhlIHBsdWdpbiBvZiBjb3Vyc2UgYW5kIGl0IG5lZWRzIHRvIHJlZmVyZW5jZSB0aGUKKyAgICB2ZXJzaW9uIHdlIGFyZSBhYm91dCB0byByZWxlYXNlLiBZb3Ugd2lsbCBmaW5kIHRoaXMgcmVmZXJlbmNlIGluCisgICAgdGhlIGRlcGVuZGVuY2llcyBzZWN0aW9uIG9mIHRoZSBhbnRscjMtbWF2ZW4tcGx1Z2luIHBvbS54bWwuIEFsc28KKyAgICBjaGFuZ2UgdGhlIHZlcnNpb24gcmVmZXJlbmNlcyBpbiB0aGUgcG9tIGZvciBndW5pdC1tYXZlbi1wbHVnaW4uCisKKzEzKSAgTm93IChmcm9tIHRoZSByZWxlYXNlLTMuMS4zIGRpcmVjdG9yeSksIHJ1biB0aGUgY29tbWFuZDoKKworICAgICAgICAgICBtdm4gdmVyc2lvbnM6dXBkYXRlLWNoaWxkLW1vZHVsZXMKKworICAgICAgICBZb3Ugc2hvdWxkIHNlZToKKworCVtJTkZPXSBbdmVyc2lvbnM6dXBkYXRlLWNoaWxkLW1vZHVsZXNdCisJW0lORk9dIE1vZHVsZTogZ3VuaXQKKwlbSU5GT10gICBQYXJlbnQgd2FzIG9yZy5hbnRscjphbnRsci1tYXN0ZXI6My4xLjMtU05BUFNIT1QsCisJICAgICAgIG5vdyBvcmcuYW50bHI6YW50bHItbWFzdGVyOjMuMS4zCisJW0lORk9dIE1vZHVsZTogcnVudGltZS9KYXZhCisJW0lORk9dICAgUGFyZW50IHdhcyBvcmcuYW50bHI6YW50bHItbWFzdGVyOjMuMS4zLVNOQVBTSE9ULAorCSAgICAgICBub3cgb3JnLmFudGxyOmFudGxyLW1hc3RlcjozLjEuMworCVtJTkZPXSBNb2R1bGU6IHRvb2wKKwlbSU5GT10gICBQYXJlbnQgd2FzIG9yZy5hbnRscjphbnRsci1tYXN0ZXI6My4xLjMtU05BUFNIT1QsCisJICAgICAgIG5vdyBvcmcuYW50bHI6YW50bHItbWFzdGVyOjMuMS4zCisKKzE0KSAgUnVuIGEgYnVpbGQgb2YgdGhlIHJlbGVhc2UtMy4xLjMgYnJhbmNoOgorCisgICAgICAgICAgIG12biAgICMgTm90ZSBJIGFtIGxldHRpbmcgdW5pdCB0ZXN0cyBydW4gaGVyZSEKKworICAgICAgICBBbGwgc2hvdWxkIGJlIGdvb2QsIG9yIGFzIGdvb2QgYXMgaXQgZ2V0cyA7LSkKKworMTUpICBTdWJtaXQgdGhlIHBvbSBjaGFuZ2VzIG9mIHRoZSByZWxlYXNlLTMuMS4zIGJyYW5jaCB0byBwZXJmb3JjZS4KKworMTYpICBEZXBsb3kgdGhlIG5ldyByZWxlYXNlICh0aGlzIGlzIGl0IGd1eXMsIG1ha2Ugc3VyZSB5b3UgYXJlIGhhcHB5KToKKworCSAgbXZuIC1OIGRlcGxveQorICAgICAgICAgIG12biAtRG1hdmVuLnRlc3Quc2tpcD10cnVlIGRlcGxveQorCisgICAgICAgIE5vdGUgdGhhdCB3ZSBtdXN0IHNraXAgdGhlIHRlc3RzIGFzIE1hdmVuIHdpbGwgbm90IGxldCB5b3UKKyAgICAgICAgZGVwbG95IHJlbGVhc2VzIHRoYXQgZmFpbCBhbnkganVuaXQgdGVzdHMuCisKKzE3KSBUaGUgZmluYWwgc3RlcCBpcyB0aGF0IHdlIG11c3QgdXBkYXRlIHRoZSBtYWluIGJyYW5jaCBwb20ueG1sIGZvcgorICAgICB0aGUgdG9vbCB0byByZWZlcmVuY2UgdGhlIG5ld2x5IHJlbGVhc2UgdmVyc2lvbiBvZiB0aGUKKyAgICAgYW50bHIzLW1hdmVuLXBsdWdpbi4gVGhpcyBpcyBiZWNhdXNlIGVhY2ggcmVsZWFzZSBvZiBBTlRMUiBpcworICAgICBidWlsdCB3aXRoIHRoZSBwcmlvciByZWxlYXNlIG9mIEFOVExSLCBhbmQgd2UgaGF2ZSBqdXN0IHJlbGVhc2VkCisgICAgIGEgbmV3IHZlcnNpb24uIEVkaXQgdGhlIHBvbS54bWwgZm9yIHRoZSB0b29sIChtYWluL3Rvb2wvcG9tLnhtbCkKKyAgICAgdW5kZXIgdGhlIG1haW4gKHRoYXQncyB0aGUgTUFJTiBicmFuY2gsIG5vdCB0aGUgcmVsZWFzZSBicmFuY2gpCisgICAgIGFuZCBmaW5kIHRoZSBkZXBlbmRlbmN5IHJlZmVyZW5jZSB0byB0aGUgYW50bHIgcGx1Z2luLiBJZiB5b3UKKyAgICAganVzdCByZWxlYXNlZCBzYXkgMy4xLjMsIHRoZW4gdGhlIHRvb2wgc2hvdWxkIG5vdyByZWZlcmVuY2UKKyAgICAgdmVyc2lvbiAzLjEuMyBvZiB0aGUgcGx1Z2luLiBIYXZpbmcgZG9uZSB0aGlzLCB5b3Ugc2hvdWxkCisgICAgIHByb2JhYmx5IHJlYnVpbGQgdGhlIG1haW4gYnJhbmNoIGFuZCBsZXQgaXQgcnVuIHRoZSBqdW5pdAorICAgICB0ZXN0cy4gTGF0ZXIsIEkgd2lsbCBhdXRvbWF0ZSB0aGlzIGRlcGVuZGVuY3kgdXBkYXRlIGFzIG12biBjYW4KKyAgICAgZG8gdGhpcyBmb3IgdXMuCisKKzE4KSAgSGF2aW5nIGRlcGxveWVkIHRoZSByZWxlYXNlIHRvIG1hdmVuLCB5b3Ugd2lsbCB3YW50IHRvIGNyZWF0ZSB0aGUKKyAgICAgdWJlciBqYXIgZm9yIHRoZSBuZXcgcmVsZWFzZSwgdG8gbWFrZSBpdCBkb3dubG9hZGFibGUgZnJvbSB0aGUKKyAgICAgYW50bHIub3JnIHdlYnNpdGUuIFRoaXMgaXMgYSByZXBlYXQgb2YgdGhlIGVhcmxpZXIgZGVzY3JpYmVkIHN0ZXAKKyAgICAgdG8gYnVpbGQgdGhlIHViZXIgamFyOgorCisgICAgICAgbXZuIC1EbWF2ZW4udGVzdC5za2lwPXRydWUgcGFja2FnZSBhc3NlbWJseTphc3NlbWJseQorCisgICAgIE1BdmVuIHdpbGwgcHJvZHVjZSB0aGUgdWJlciBqYXIgaW4gdGhlIHRhcmdldCBkaXJlY3Rvcnk6CisKKwlhbnRsci1tYXN0ZXItMy4xLjMtY29tcGxldGVqYXIuamFyCisKKyAgICAgQW5kIHRoaXMgaXMgdGhlIGNvbXBsZXRlIGphciB0aGF0IGNhbiBiZSBkb3dubG9hZGVkIGZyb20gdGhlIHdlYiBzaXRlLiBZb3UKKyAgICAgbWF5IHdpc2ggdG8gcHJvZHVjZSBhbiBtZDUgY2hlY2tzdW0gdG8gZ28gd2l0aCB0aGUgamFyOgorCisgICAgIG1kNXN1bSB0YXJnZXQvYW50bHItbWFzdGVyLTMuMS4zLWNvbXBsZXRlamFyLmphcgorICAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCAgdGFyZ2V0L2FudGxyLW1hc3Rlci0zLjEuNC1TTkFQU0hPVC1jb21wbGV0ZWphci5qYXIKKworICAgICBUaGUgY29tbWFuZCB5b3UganVzdCByYW4gd2lsbCBhbHNvIHByb2R1Y2UgYSBzZWNvbmQgamFyOgorCisgICAgICAgIGFudGxyLW1hc3Rlci0zLjEuMy1zcmMuamFyCisKKyAgICAgVGhpcyBpcyB0aGUgc291cmNlIGNvZGUgZm9yIGV2ZXJ5dGhpZ24geW91IGp1c3QgZGVwbG95ZWQgYW5kIGNhbgorICAgICBiZSB1bmphcnJlZCBhbmQgYnVpbHQgZnJvbSBzY3JhdGNoIHVzaW5nIHRoZSB2ZXJ5IHByb2NlZHVyZXMKKyAgICAgZGVzY3JpYmVkIGhlcmUsIHdoaWNoIG1lYW5zIHlvdSB3aWxsIG5vdyBiZSByZWFkaW5nIHRoaXMKKyAgICAgQlVJTEQudHh0IGZpbGUgZm9yIGV2ZXIuCisKKzE5KSAgUmV3YXJkIGFueW9uZSBhcm91bmQgeW91IHdpdGggZ29vZCBiZWVyLgorCisKK01pc2NlbGxhbnkKKy0tLS0tLS0tLS0tCisKK0l0IHdhcyBhIGxpdHRsZSB0cmlja3kgdG8gZ2V0IGFsbCB0aGUgaW50ZXJkZXBlbmRlbmNpZXMgY29ycmVjdAorYmVjYXVzZSBBTlRMUiBidWlsZHMgaXRzZWxmIHVzaW5nIGl0c2VsZiBhbmQgdGhlIG1hdmVuIHBsdWdpbgorcmVmZXJlbmNlcyB0aGUgQU5UTFIgVG9vbCBhcyB3ZWxsLiBIZW5jZSB0aGUgbWF2ZW4gdG9vbCBpcyBub3QgYSBjaGlsZAorcHJvamVjdCBvZiB0aGUgbWFzdGVyIHBvbS54bWwgZmlsZSwgZXZlbiB0aG91Z2ggaXQgaXMgYnVpbHQgYnkgaXQuCisKK0FuIG9ic2VydmFudCBwZXJzb24gd2lsbCBub3QgdGhhdCB3aGVuIHRoZSBhc3NlbWJseTphc3NlbWJseSBwaGFzZSBpcworcnVuLCB0aGF0IGl0IGludm9rZXMgdGhlIGJ1aWxkIG9mIHRoZSBBTlRMUiB0b29sIHVzaW5nIHRoZSB2ZXJzaW9uIG9mCit0aGUgTWF2ZW4gcGx1Z2luIHRoYXQgaXQgaGFzIGp1c3QgYnVpbHQsIGFuZCB0aGlzIHJlc3VsdHMgaW4gdGhlCitwbHVnaW4gdXNpbmcgdGhlIHZlcnNpb24gb2YgQU5UTFIgdG9vbCB0aGF0IGl0IGhhcyBqdXN0IGJ1aWx0LiBUaGlzIGlzCitzYWZlIGJlY2F1c2UgZXZlcnl0aGluZyB3aWxsIGFscmVhZHkgYmUgdXAgdG8gZGF0ZSBhbmQgc28gd2UgcGFja2FnZQordXAgdGhlIHZlcnNpb24gb2YgdGhlIHRvb2wgdGhhdCB3ZSBleHBlY3QsIGJ1dCB0aGUgTWF2ZW4gcGx1Z2luIHdlCitkZXBsb3kgd2lsbCB1c2UgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBBTlRMUiwgZXZlbiB0aG91Z2ggdGhlcmUgaXMKK3RlY2huaWNhbGx5IGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KKworVGhlIG1hc3RlciBwb20ueG1sIGRvZXMgZ2l2ZSB1cyBhIHdheSB0byBjYXVzZSB0aGUgYnVpbGQgb2YgdGhlIEFOVExSCit0b29sIHRvIHVzZSBpdHNlbGYgdG8gYnVpbGQgaXRzZWxmLiBUaGlzIGlzIGJlY2F1c2UgaW4KK2RlcGVuZGVuY3lNYW5hZ2VtZW50IGluIHRoZSBtYXN0ZXIgcG9tLnhtbCwgd2UgY2FuIHJlZmVyZW5jZSB0aGUKK2N1cnJlbnQgdmVyc2lvbiBvZiB0aGUgVG9vbCBhbmQgdGhlIE1hdmVuIHBsdWdpbiwgZXZlbiB0aG91Z2ggaW4gdGhlCitwb20ueG1sIGZvciB0aGUgdG9vbCBpdHNlbGYgcmVmZXJzIHRvIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZQorcGx1Z2luLgorCitXaGF0IGhhcHBlbnMgaXMgdGhhdCBpZiB3ZSBmaXJzdCBjZCBpbnRvIHRoZSB0b29sIGFuZCBtYXZlbgorZGlyZWN0b3JpZXMgYW5kIGJ1aWxkIEFOVExSLCBpdCB3aWxsIGJ1aWxkIGl0c2VsZiB3aXRoIHRoZSBwcmlvcgordmVyc2lvbiBhbmQgdGhpcyB3aWxsIGRlcGxveSBsb2NhbGx5ICgubTIpLiBXZSBjYW4gdGhlbiBjbGVhbiBidWlsZAorZnJvbSB0aGUgbWFzdGVyIHBvbSBhbmQgd2hlbiBBTlRMUiBhc2tzIGZvciB0aGUgcHJpb3IgdmVyc2lvbiBvZiB0aGUKK3Rvb2wsIHRoZSBtYXN0ZXIgcG9tLnhtbCB3aWxsIG92ZXJyaWRlIGl0IGFuZCBidWlsZCB3aXRoIHRoZSBpbnRlcmltCit2ZXJzaW9ucyB3ZSBqdXN0IGJ1aWx0IG1hbnVhbGx5LgorCitIb3dldmVyLCBzdHJpY3RseSBzcGVha2luZywgd2UgbmVlZCBhIHRoaXJkIGJ1aWxkIHdoZXJlIHdlIHJlYnVpbGQgdGhlCit0b29sIGFnYWluIHdpdGggdGhlIHZlcnNpb24gb2YgdGhlIHRvb2wgdGhhdCB3YXMgYnVpbHQgd2l0aCBpdHNlbGYgYW5kCitub3QgZGVwbG95IHRoZSB2ZXJzaW9uIHRoYXQgd2FzIGJ1aWx0IGJ5IHRoZSB2ZXJzaW9uIG9mIGl0c2VsZiB0aGF0Cit3YXMgYnVpbHQgYnkgYSBwcmlvciB2ZXJzaW9uIG9mIGl0c2VsZi4gSSBkZWNpZGVkIHRoYXQgdGhpcyB3YXMgbm90CitwYXJ0aWN1bGFybHkgdXNlZnVsIGFuZCBjb21wbGljYXRlcyB0aGluZ3MgdG9vIG11Y2guIEJ1aWxkaW5nIHdpdGggYQorcHJpb3IgdmVyc2lvbiBvZiB0aGUgdG9vbCBpcyBmaW5lIGFuZCBpZiB0aGVyZSB3YXMgZXZlciBhIG5lZWQgdG8sIHdlCitjb3VsZCByZWxlYXNlIHR3aWNlIGluIHF1aWNrIHN1Y2Nlc3Npb24uCisKK0kgaGF2ZSBvY2Nhc2lvbmFsbHkgc2VlbiB0aGUgTUF2ZW4gcmVhY3RvciBzY3JldyB1cCAob3IgcGVyaGFwcyBpdCBpcwordGhlIEFOVExSIHRvb2wpIHdoZW4gYnVpbGRpbmcuIElmIHRoaXMgaGFwcGVucyB5b3Ugd2lsbCBzZWUgYW4gQU5UTFIKK1BhbmljIC0gY2Fubm90IGZpbmQgZW4uc3RnIG1lc3NhZ2UuIElmIHRoaXMgaGFwcGVucyB0byB5b3UsIHRoZW4ganVzdAorcmVydW4gdGhlIGJ1aWxkIGFuZCBpdCB3aWxsIGV2ZW50dWFsbHkgd29yay4KKworSmltIElkbGUgLSBNYXJjaCAyMDA5CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9SZWFkbWUudHh0IGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL1JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4ZDJlNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9SZWFkbWUudHh0CkBAIC0wLDAgKzEsNjEgQEAKKyBDaGFuZ2VzOgorIAorIDE5LjA4LjIwMDgKKyBEZXBlbmRlbmN5IGNoZWNrIGZvciBjb21wb3NlZCBncmFtbWFycyBhZGRlZC4KKyBNaWdodCBuZWVkIHNvbWUgZnVydGhlciBpbXByb3ZlbWVudHMuCisgCisgMDkuMDguMjAwOAorIEluc3BlY3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UTFJfSE9NRSB0byBkZXRlY3QgYW5kIGFkZAorIGFudGxyLSBhbmQgc3RyaW5ndGVtcGxhdGUgbGlicmFyaWVzIHRvIHRoZSBjbGFzc3BhdGgKKyAKKyAwOS4wOC4yMDA4CisgUmVtb3ZlZCByb3V0aW5lIGNoZWNrR2VuZXJhdGVGaWxlLiBJdCBnb3QgZmVlYmxlIHdpdGggdGhlCisgaW50cm9kdWN0aW9uIG9mIGNvbXBvc2VkIGdyYW1tYXJzLCBlLmcuICJpbXBvcnQgVC5nIi4KKyBGcm9tIG5vdyBvbmUgaXQgaXMgYWx3YXlzIGFudGxyIGl0c2VsZiB2aWEgdGhlIGRlcGVuZCBvcHRpb24KKyB3aGljaCBkZWNpZGVzIGFib3V0IGRlcGVuZGVjaWVzCisgCisgMzEuMTIuMjAwNworIFdpdGggb3B0aW9uICJkZXBlbmQ9dHJ1ZSIgcHJvY2VlZCBldmVuIGlmIGZpcnN0IHBhc3MgZmFpbGVkIHNvCisgdGhhdCBBTlRMUiBjYW4gc3BpdCBvdXQgaXRzIGVycm9ycworCisgMzEuMTIuMjAwNyAKKyBTdXBwb3J0IHRoZSAtWGNvbnZlcnNpb250aW1lb3V0IG9wdGlvbiAoSmltIElkbGUpCisKKyAyMS4xMC4yMDA3CisgRXZhbHVhdGlvbiBvZiBkZXBlbmRlbmNpZXMgdmlhIEFOVExScyAnZGVwZW5kJyBvcHRpb24uCisgQWRkZWQgbm9wcnVuZSBhbmQgbm9jb2xsYXBzZSBvcHRpb24uCisgJ2dyYW1tYXIgcGFyc2VyJyB3aWxsIGJlIHJlY29nbml6ZWQuCisgCisgMTcuMDUuMjAwNworIEFkYXB0ZWQgdGhlIGdyYW1tYXIgdHlwZSByZWNvZ25pdGlvbiB0byB0aGUgY2hhbmdlZCBuYW1pbmcgY29udmVudGlvbnMgZm9yIHRyZWUgcGFyc2Vycy4KKyBDb21waWxlZCB0aGUgYW50bHIzIHRha3Mgd2l0aCAtc291cmNlIDUgLXRhcmdldCA1IGZvciBjb21wYXRpYmlsaXR5IHdpdGggSmF2YSA1LgorIERyb3BwZWQgdHJhY2UsIHRyYWNlbGV4ZXIgYW5kIHRyYWNlcGFyc2VyIG9wdGlvbnMgYXMgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBieSBhbnRsciBhbnkgbW9yZS4KKyBBZGRlZCBkZXBlbmQgYW5kIGRiZ1NUIG9wdGlvbnMuCisgQWRkZWQgcHJvamVjdCAiU2ltcGxlVHJlZVdhbGtlciIgYXMgYW4gZXhhbXBsZSBmb3IgYSBtdWx0aSBncmFtbWFyIHByb2plY3QuCisgCisgSG93IHRvIGJ1aWxkIHRoZSBhbnRscjMgdGFzazoKKyAKKyBQcmVyZXF1aXNpdGVzOgorIDEpIGFwYWNoZS1hbnQtMS43LjAgaW5zdGFsbGVkCisgMikgYW50bHIgamFyIGZpbGVzIChhbnRsci0zLjFiMS5qYXIsIGFudGxyLTIuNy43LmphciBhbmQgc3RyaW5ndGVtcGxhdGUtMy4xYjEuamFyKSAKKyAgICBjb250YWluZWQgaW4gdGhlIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQorIDMpIEphdmEgNSBvciBKYXZhIDYgaW5zdGFsbGVkCisgICAgCisgamF2YWMgLXNvdXJjZSA1IC10YXJnZXQgNSAtY2xhc3NwYXRoIEM6L1Byb2dyYW1tZS9hcGFjaGUtYW50LTEuNy4wL2xpYi9hbnQuamFyIG9yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxyL0FOVExSMy5qYXZhCisgamFyIGN2ZiBhbnRscjMuamFyIG9yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxyL2FudGxpYi54bWwgb3JnL2FwYWNoZS90b29scy9hbnQvYW50bHIvQU5UTFIzLmNsYXNzCisgCisgYSkgZDJ1LnRwCisgCisgU2ltcGxlIGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGUgYW50bHIzIHRhc2sgd2l0aCBhbnQKKyAKKyBiKSBzaW1wbGVjVHJlZVBhcnNlci50cAorIAorIEV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgbXVsdGkgZ3JhbW1hciBwcm9qZWN0IHdpdGggYW50LgorIAorIGMpIHBvbHlkaWZmX2J1aWxkLnppcAorIAorIEV4YW1wbGUgYnVpbGQgZmlsZSBmb3IgcG9seWRpZmYgZXhhbXBsZSBncmFtbWFyIGFkZGVkLgorIAorIGQpIGNvbXBvc2l0ZS1qYXZhX2J1aWxkLnppcAorIAorICBFeGFtcGxlIGJ1aWxkIGZpbGUgZm9yIGNvbXBvc2l0ZS1qYXZhIGV4YW1wbGUgZ3JhbW1hciBhZGRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMtc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxyL0FOVExSMy5qYXZhIGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2FudGxyMy1zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvYW50bHIvQU5UTFIzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3Mjk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMtc3JjL29yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxyL0FOVExSMy5qYXZhCkBAIC0wLDAgKzEsNzc2IEBACisvKgorICogQ29weXJpZ2h0ICAyMDAwLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogIDIwMDYtMTItMjk6IE1vZGlmaWVkIHRvIHdvcmsgZm9yIGFudGxyMyBieSBK/HJnZW4gUGZ1bmR0CisgKiAgMjAwNy0wMS0wNDogU29tZSBtaW5vciBjb3JyZWN0aW9uIGFmdGVyIGNoZWNraW5nIGNvZGUgd2l0aCBmaW5kQnVncyB0b29sCisgKiAgMjAwNy0wMi0xMDogQWRhcHRlZCB0aGUgZ3JhbW1hciB0eXBlIHJlY29nbml0aW9uIHRvIHRoZSBjaGFuZ2VkIG5hbWluZworICogICAgICAgICAgICAgIGNvbnZlbnRpb25zIGZvciBUcmVlIFBhcnNlcgorICogIDIwMDctMTAtMTc6IE9wdGlvbnMgInRyYWNlIiwgInRyYWNlTGV4ZXIiLCAidHJhY2VQYXJzZXIiIGFuZCAiZ2xpYiIgZW1pdAorICogICAgICAgICAgICAgIHdhcm5pbmdzIHdoZW4gYmVpbmcgdXNlZC4KKyAqICAgICAgICAgICAgICBBZGRlZCByZWNvZ25pdGlvbiBvZiAicGFyc2VyIGdyYW1tYXIgVCIuCisgKiAgICAgICAgICAgICAgQWRkZWQgb3B0aW9ucyAibm9jb2xsYXBzZSIsICJub3BydW5lIi4KKyAqICAgICAgICAgICAgICBBTlRMUiBvcHRpb24gImRlcGVuZCIgaXMgYmVpbmcgdXNlZCB0byByZXNvbHZlIGJ1aWxkIGRlcGVuZGVuY2llcy4KKyAqICAyMDA3LTExLTE1OiBFbWJlZGRlZCBDbGFzc3BhdGggc3RhdGVtZW50IGhhZCBub3QgYmVlbiBvYnNlcnZlZAorICogICAgICAgICAgICAgIHdpdGggb3B0aW9uIGRlcGVuZD0idHJ1ZSIgKFJlcG9ydGVkIGJ5IE1hdHMgQmVocmUpCisgKiAgMjAwOC0wMy0zMTogU3VwcG9ydCB0aGUgb3B0aW9uIGNvbnZlcnNpb250aW1lb3V0LiAoSmltIElkbGUpCisgKiAgMjAwNy0xMi0zMTogV2l0aCBvcHRpb24gImRlcGVuZD10cnVlIiBwcm9jZWVkIGV2ZW4gaWYgZmlyc3QgcGFzcyBmYWlsZWQgc28KKyAqICAgICAgICAgICAgICB0aGF0IEFOVExSIGNhbiBzcGl0IG91dCBpdHMgZXJyb3JzCisgKiAgMjAwOC0wOC0wOTogSW5zcGVjdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTlRMUl9IT01FIHRvIGRldGVjdCBhbmQgYWRkCisgKiAgICAgICAgICAgICAgYW50bHItIGFuZCBzdHJpbmd0ZW1wbGF0ZSBsaWJyYXJpZXMgdG8gdGhlIGNsYXNzcGF0aAorICogIDIwMDgtMDgtMDk6IFJlbW92ZWQgcm91dGluZSBjaGVja0dlbmVyYXRlRmlsZS4gSXQgZ290IGZlZWJsZSB3aXRoIHRoZQorICogICAgICAgICAgICAgIGludHJvZHVjdGlvbiBvZiBjb21wb3NlZCBncmFtbWFycywgZS5nLiAiaW1wb3J0IFQuZyIgYW5kIGFmdGVyCisgKiAgICAgICAgICAgICAgYSBzaG9ydCBzdHJ1Z2dsZSBpdCBzdGFydGVkIGl0J3Mgam91cm5leSB0byAvZGV2L251bGwuCisgKiAgICAgICAgICAgICAgRnJvbSBub3cgb25lIGl0IGlzIGFsd2F5cyBhbnRsciBpdHNlbGYgdmlhIHRoZSBkZXBlbmQgb3B0aW9uCisgKiAgICAgICAgICAgICAgd2hpY2ggZGVjaWRlcyBhYm91dCBkZXBlbmRlY2llcworICogIDIwMDgtMDgtMTk6IERlcGVuZGVuY3kgY2hlY2sgZm9yIGNvbXBvc2VkIGdyYW1tYXJzIGFkZGVkLgorICogICAgICAgICAgICAgIE1pZ2h0IG5lZWQgc29tZSBmdXJ0aGVyIGltcHJvdmVtZW50cy4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5hbnRscjsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlB1bXBTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJlZGlyZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmVKYXZhOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Mb2FkZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlRlZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiAgSW52b2tlcyB0aGUgQU5UTFIzIFRyYW5zbGF0b3IgZ2VuZXJhdG9yIG9uIGEgZ3JhbW1hciBmaWxlLgorICoKKyAqLworcHVibGljIGNsYXNzIEFOVExSMyBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmUgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgLyoqIHRoZSBmaWxlIHRvIHByb2Nlc3MgKi8KKyAgICBwcml2YXRlIEZpbGUgdGFyZ2V0ID0gbnVsbDsKKyAgICAvKiogd2hlcmUgdG8gb3V0cHV0IHRoZSByZXN1bHQgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbnVsbDsKKyAgICAvKiogbG9jYXRpb24gb2YgdG9rZW4gZmlsZXMgKi8KKyAgICBwcml2YXRlIEZpbGUgbGliRGlyZWN0b3J5ID0gbnVsbDsKKyAgICAvKiogYW4gb3B0aW9uYWwgc3VwZXIgZ3JhbW1hciBmaWxlICovCisgICAgcHJpdmF0ZSBGaWxlIHN1cGVyR3JhbW1hcjsKKyAgICAvKiogZGVwZW5kICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlcGVuZCA9IGZhbHNlOworICAgIC8qKiBmb3JrICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZvcms7CisgICAgLyoqIG5hbWUgb2Ygb3V0cHV0IHN0eWxlIGZvciBtZXNzYWdlcyAqLworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VGb3JtYXROYW1lOworICAgIC8qKiBvcHRpb25hbCBmbGFnIHRvIHByaW50IG91dCBhIGRpYWdub3N0aWMgZmlsZSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkaWFnbm9zdGljOworICAgIC8qKiBvcHRpb25hbCBmbGFnIHRvIGFkZCBtZXRob2RzICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRyYWNlOworICAgIC8qKiBvcHRpb25hbCBmbGFnIHRvIGFkZCB0cmFjZSBtZXRob2RzIHRvIHRoZSBwYXJzZXIgb25seSAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0cmFjZVBhcnNlcjsKKyAgICAvKiogb3B0aW9uYWwgZmxhZyB0byBhZGQgdHJhY2UgbWV0aG9kcyB0byB0aGUgbGV4ZXIgb25seSAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0cmFjZUxleGVyOworICAgIC8qKiB3b3JraW5nIGRpcmVjdG9yeSAqLworICAgIHByaXZhdGUgRmlsZSB3b3JraW5nZGlyID0gbnVsbDsKKyAgICAvKiogY2FwdHVyZXMgQU5UTFIncyBvdXRwdXQgKi8KKyAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgLyoqIFRoZSBkZWJ1ZyBhdHRyaWJ1dGUgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7CisgICAgLyoqIFRoZSByZXBvcnQgYXR0cmlidXRlICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydDsKKyAgICAvKiogVGhlIHByaW50IGF0dHJpYnV0ZSAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwcmludDsKKyAgICAvKiogVGhlIHByb2ZpbGUgYXR0cmlidXRlICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2ZpbGU7CisgICAgLyoqIFRoZSBuZmEgYXR0cmlidXRlICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5mYTsKKyAgICAvKiogVGhlIGRmYSBhdHRyaWJ1dGUgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGZhOworICAgIC8qKiBtdWx0aSB0aHJlYWRlZCBhbmFseXNpcyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtdWx0aVRocmVhZGVkOworICAgIC8qKiBjb2xsYXBzZSBpbmNpZGVudCBlZGdlcyBpbnRvIERGQSBzdGF0ZXMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm9jb2xsYXBzZTsKKyAgICAvKiogdGVzdCBsb29rYWhlYWQgYWdhaW5zdCBFQk5GIGJsb2NrIGV4aXQgYnJhbmNoZXMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbm9wcnVuZTsKKyAgICAvKiogcHV0IHRhZ3MgYXQgc3RhcnQvc3RvcCBvZiBhbGwgdGVtcGxhdGVzIGluIG91dHB1dCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkYmdTVDsKKyAgICAvKiogcHJpbnQgQVNUICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdyYW1tYXJUcmVlOworICAgIC8qKiBJbnN0YW5jZSBvZiBhIHV0aWxpdHkgY2xhc3MgdG8gdXNlIGZvciBmaWxlIG9wZXJhdGlvbnMuICovCisgICAgcHJpdmF0ZSBGaWxlVXRpbHMgZmlsZVV0aWxzOworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29udmVyc2lvbiB0aW1lb3V0IHdpdGggLVhjb252ZXJzaW9udGltZW91dCBubm5uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udmVyc2lvbnRpbWVvdXQ7CisKKyAgICBwdWJsaWMgQU5UTFIzKCkgeworICAgICAgICBjb21tYW5kbGluZS5zZXRWbShKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiamF2YSIpKTsKKyAgICAgICAgY29tbWFuZGxpbmUuc2V0Q2xhc3NuYW1lKCJvcmcuYW50bHIuVG9vbCIpOworICAgICAgICBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChGaWxlIHRhcmdldEZpbGUpIHsKKyAgICAgICAgbG9nKCJTZXR0aW5nIHRhcmdldCB0bzogIiArIHRhcmdldEZpbGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0ZGlyZWN0b3J5KEZpbGUgb3V0cHV0RGlyZWN0b3J5RmlsZSkgeworICAgICAgICBsb2coIlNldHRpbmcgb3V0cHV0IGRpcmVjdG9yeSB0bzogIiArIG91dHB1dERpcmVjdG9yeUZpbGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0ZGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0b2tlbiBmaWxlcyBvdXRwdXQgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpYmRpcmVjdG9yeShGaWxlIGxpYkRpcmVjdG9yeUZpbGUpIHsKKyAgICAgICAgbG9nKCJTZXR0aW5nIGxpYiBkaXJlY3RvcnkgdG86ICIgKyBsaWJEaXJlY3RvcnlGaWxlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB0aGlzLmxpYkRpcmVjdG9yeSA9IGxpYkRpcmVjdG9yeUZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBzdHlsZSBmb3IgbWVzc2FnZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZWZvcm1hdChTdHJpbmcgbmFtZSkgeworICAgICAgICBsb2coIlNldHRpbmcgbWVzc2FnZS1mb3JtYXQgdG86ICIgKyBuYW1lLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlRm9ybWF0TmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBvcHRpb25hbCBzdXBlciBncmFtbWFyIGZpbGUKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdsaWIoRmlsZSBzdXBlckdyYW1tYXJGaWxlKSB7CisgICAgICAgIHRoaXMuc3VwZXJHcmFtbWFyID0gc3VwZXJHcmFtbWFyRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmxhZyB0byBlbmFibGUgUGFyc2VWaWV3IGRlYnVnZ2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGZsYWcgdG8gZW5hYmxlIHJlcG9ydCBzdGF0aXN0aWNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3J0KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHRoaXMucmVwb3J0ID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBmbGFnIHRvIHByaW50IG91dCB0aGUgZ3JhbW1hciB3aXRob3V0IGFjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludChib29sZWFuIGVuYWJsZSkgeworICAgICAgICB0aGlzLnByaW50ID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBmbGFnIHRvIGVuYWJsZSBwcm9maWxpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9maWxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHRoaXMucHJvZmlsZSA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmxhZyB0byBlbmFibGUgbmZhIGdlbmVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZmEoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgdGhpcy5uZmEgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGZsYWcgdG8gZW5hYmxlIG5mYSBnZW5lcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGZhKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHRoaXMuZGZhID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgYW5hbHlzaXMgbXVsdGl0aHJlYWRlZAorICAgICAqIEBwYXJhbSBlbmFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aXRocmVhZGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG11bHRpVGhyZWFkZWQgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29sbGFwc2UgaW5jaWRlbnQgZWRnZXMgaW50byBERkEgc3RhdGVzCisgICAgICogQHBhcmFtIGVuYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vY29sbGFwc2UoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbm9jb2xsYXBzZSA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IGxvb2thaGVhZCBhZ2FpbnN0IEVCTkYgYmxvY2sgZXhpdCBicmFuY2hlcworICAgICAqIEBwYXJhbSBlbmFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3BydW5lKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG5vcHJ1bmUgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCBsb29rYWhlYWQgYWdhaW5zdCBFQk5GIGJsb2NrIGV4aXQgYnJhbmNoZXMKKyAgICAgKiBAcGFyYW0gZW5hYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGJnU1QoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZGJnU1QgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29udmVyc2lvbiB0aW1lb3V0IHdpdGggLVhjb252ZXJzaW9udGltZW91dCBubm5uCisgICAgICogQHBhcmFtIGNvbnZlcnNpb250aW1lb3V0U3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udmVyc2lvbnRpbWVvdXQoU3RyaW5nIGNvbnZlcnNpb250aW1lb3V0U3RyaW5nKSB7CisgICAgICAgIGxvZygiU2V0dGluZyBjb252ZXJzaW9udGltZW91dCB0bzogIiArIGNvbnZlcnNpb250aW1lb3V0U3RyaW5nLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCB0aW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGNvbnZlcnNpb250aW1lb3V0U3RyaW5nKTsKKyAgICAgICAgICAgIHRoaXMuY29udmVyc2lvbnRpbWVvdXQgPSBjb252ZXJzaW9udGltZW91dFN0cmluZzsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiT3B0aW9uIENvbnZlcnNpb25UaW1lT3V0IGlnbm9yZWQgZHVlIHRvIGlsbGVnYWwgdmFsdWU6ICciICsgY29udmVyc2lvbnRpbWVvdXRTdHJpbmcgKyAiJyIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIHRvIGVuYWJsZSBwcmludGluZyBvZiB0aGUgZ3JhbW1hciB0cmVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JhbW1hcnRyZWUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZ3JhbW1hclRyZWUgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyB0byBlbmFibGUgZGVwZW5kZW5jeSBjaGVja2luZyBieSBBTlRMUiBpdHNlbGYKKyAgICAgKiBUaGUgZGVwZW5kIG9wdGlvbiBpcyBhbHdheXMgdXNlZCBpbXBsaWNpdGVseSBpbnNpZGUgdGhlIGFudGxyMyB0YXNrCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXBlbmQoYm9vbGVhbiBzKSB7CisgICAgICAgIHRoaXMuZGVwZW5kID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmxhZyB0byBlbWl0IGRpYWdub3N0aWMgdGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpYWdub3N0aWMoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZGlhZ25vc3RpYyA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBlbmFibGVzIGFsbCB0cmFjaW5nLgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhY2UoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgdHJhY2UgPSBlbmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgZW5hYmxlcyBwYXJzZXIgdHJhY2luZy4KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlUGFyc2VyKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHRyYWNlUGFyc2VyID0gZW5hYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGVuYWJsZXMgbGV4ZXIgdHJhY2luZy4KKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlTGV4ZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgdHJhY2VMZXhlciA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvLyB3ZSBhcmUgZm9yY2VkIHRvIGZvcmsgQU5UTFIgc2luY2UgdGhlcmUgaXMgYSBjYWxsCisgICAgLy8gdG8gU3lzdGVtLmV4aXQoKSBhbmQgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8KKyAgICAvLyByaWdodCBub3cgdG8gYXZvaWQgdGhpcy4gOi0oIChTQmEpCisgICAgLy8gSSdtIG5vdCByZW1vdmluZyB0aGlzIG1ldGhvZCB0byBrZWVwIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAvKioKKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yayhib29sZWFuIHMpIHsKKyAgICAgICAgdGhpcy5mb3JrID0gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBkKSB7CisgICAgICAgIHRoaXMud29ya2luZ2RpciA9IGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNsYXNzcGF0aCB0byBiZSBzZXQKKyAgICAgKiBiZWNhdXNlIGEgZGlyZWN0b3J5IG1pZ2h0IGJlIGdpdmVuIGZvciBBbnRsciBkZWJ1Zy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kbGluZS5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKS5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBKVk0gYXJndW1lbnQuCisgICAgICogQHJldHVybiAgY3JlYXRlIGEgbmV3IEpWTSBhcmd1bWVudCBzbyB0aGF0IGFueSBhcmd1bWVudCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBKVk0uCisgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBDb21tYW5kbGluZS5Bcmd1bWVudCBjcmVhdGVKdm1hcmcoKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kbGluZS5jcmVhdGVWbUFyZ3VtZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgamFycyBvciBkaXJlY3RvcmllcyBjb250YWluaW5nIEFudGxyIGFuZCBhc3NvY2lhdGVzLgorICAgICAqIFRoaXMgc2hvdWxkIG1ha2UgdGhlIGZvcmtlZCBKVk0gd29yayB3aXRob3V0IGhhdmluZyB0bworICAgICAqIHNwZWNpZnkgaXQgZGlyZWN0bHkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8qIElucXVpcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFyaWFibGVzID0gU3lzdGVtLmdldGVudigpOworICAgICAgICAvKiBHZXQgdmFsdWUgZm9yIGtleSAiQU5UTFJfSE9NRSIgd2hpY2ggc2hvdWxkIGhvcGVmdWxseSBwb2ludCB0bworICAgICAgICAgKiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgYW50bHIzIGlzIGluc3RhbGxlZCAqLworICAgICAgICBTdHJpbmcgYW50bHJIb21lID0gdmFyaWFibGVzLmdldCgiQU5UTFJfSE9NRSIpOworICAgICAgICBpZiAoYW50bHJIb21lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIEVudmlyb25tZW50IHZhcmlhYmxlIEFOVExSX0hPTUUgaGFzIGJlZW4gZGVmaW5lZC4KKyAgICAgICAgICAgICAqIE5vdyBhZGQgYWxsIGFudGxyIGFuZCBzdHJpbmd0ZW1wbGF0ZSBsaWJyYXJpZXMgdG8gdGhlCisgICAgICAgICAgICAgKiBjbGFzc3BhdGggKi8KKyAgICAgICAgICAgIGFkZEFudGxySmFyc1RvQ2xhc3NwYXRoKGFudGxySG9tZSArICIvbGliIik7CisgICAgICAgIH0KKyAgICAgICAgYWRkQ2xhc3NwYXRoRW50cnkoIi9hbnRsci9BTlRMUkdyYW1tYXJQYXJzZUJlaGF2aW9yLmNsYXNzIiwgIkFudExSMiIpOworICAgICAgICBhZGRDbGFzc3BhdGhFbnRyeSgiL29yZy9hbnRsci90b29sL0FOVExSUGFyc2VyLmNsYXNzIiwgIkFudExSMyIpOworICAgICAgICBhZGRDbGFzc3BhdGhFbnRyeSgiL29yZy9hbnRsci9zdHJpbmd0ZW1wbGF0ZS9TdHJpbmdUZW1wbGF0ZS5jbGFzcyIsICJTdHJpbmd0ZW1wbGF0ZSIpOworCisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkIHRoZSBkaXJlY3Rvcnkgb3IgYXJjaGl2ZQorICAgICAqIHRoYXQgY29udGFpbnMgaXQgdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIDxwPkRvZXNuJ3Qgd29yayBmb3IgYXJjaGl2ZXMgaW4gSkRLIDEuMSBhcyB0aGUgVVJMIHJldHVybmVkIGJ5CisgICAgICogZ2V0UmVzb3VyY2UgZG9lc24ndCBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlLjwvcD4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeShTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogcHJlIEFudCAxLjYgdGhpcyBtZXRob2QgdXNlZCB0byBjYWxsIGdldENsYXNzKCkuZ2V0UmVzb3VyY2UKKyAgICAgICAgICogd2hpbGUgQW50IDEuNiB3aWxsIGNhbGwgQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UoKS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBDbGFzcy5nZXRSZXNvdXJjZSBleHBlY3RzIGEgbGVhZGluZworICAgICAgICAgKiBzbGFzaCBmb3IgImFic29sdXRlIiByZXNvdXJjZXMgYW5kIHdpbGwgc3RyaXAgaXQgYmVmb3JlCisgICAgICAgICAqIGRlbGVnYXRpbmcgdG8gQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UgLSBzbyB3ZSBub3cgaGF2ZSB0bworICAgICAgICAgKiBlbXVsYXRlIENsYXNzJ3MgYmVoYXZpb3IuCisgICAgICAgICAqLworICAgICAgICBpZiAocmVzb3VyY2Uuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLnN1YnN0cmluZygxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlID0gIm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsLyIgKyByZXNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZiA9IExvYWRlclV0aWxzLmdldFJlc291cmNlU291cmNlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgcmVzb3VyY2UpOworICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkZvdW5kIHZpYSBjbGFzc3BhdGg6ICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldExvY2F0aW9uKGYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKCJDb3VsZG5cJ3QgZmluZCByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIGZvciBsaWJyYXJ5ICIgKyBtc2cgKyAiIGluIGV4dGVybmFsIGNsYXNzcGF0aCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEFOVExSX0hPTUUgaXMgZGVmaW5lZCBhbmQgcG9pbnRzCisgICAgICogdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYW50bHIzIHRoZW4gbG9vayBmb3IgYWxsIGFudGxyLSouamFyIGFuZAorICAgICAqIHN0cmluZ3RlbXBsYXRlLSouamFyIGZpbGVzIGluIHRoZSBsaWIgZGlyZWN0b3J5IGFuZCBhZGQgdGhlbQorICAgICAqIHRvIHRoZSBjbGFzc3BhdGguCisgICAgICogVGhpcyBmZWF0dXJlIHNob3VsZCBtYWtlIHdvcmtpbmcgd2l0aCBlY2xpcHNlIG9yIG5ldGJlYW5zIHByb2plY3RzIGEKKyAgICAgKiBsaXR0bGUgYml0IGVhc2llci4gQXMgd2lsZGNhcmRzIGFyZSBiZWluZyB1c2VkIGZvciB0aGUgdmVyc2lvbiBwYXJ0CisgICAgICogb2YgdGhlIGphci1hcmNoaXZlcyBpdCBtYWtlcyB0aGUgdGFzayBpbmRlcGVuZGVudCBvZgorICAgICAqIG5ldyByZWxlYXNlcy4gSnVzdCBsZXQgQU5UTFJfSE9NRSBwb2ludCB0byB0aGUgbmV3IGluc3RhbGxhdGlvbgorICAgICAqIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkQW50bHJKYXJzVG9DbGFzc3BhdGgoU3RyaW5nIGFudGxyTGliRGlyKSB7CisgICAgICAgIFN0cmluZ1tdIGluY2x1ZGVzID0geyJhbnRsci0qLmphciIsICJzdHJpbmd0ZW1wbGF0ZS0qLmphciJ9OworCisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworICAgICAgICBkcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7CisgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYW50bHJMaWJEaXIpKTsKKyAgICAgICAgZHMuc2V0Q2FzZVNlbnNpdGl2ZSh0cnVlKTsKKyAgICAgICAgZHMuc2NhbigpOworCisgICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOworICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGFudGxyTGliRGlyICsgc2VwYXJhdG9yICsgZmlsZSk7CisgICAgICAgICAgICBsb2coIkZvdW5kIHZpYSBBTlRMUl9IT01FOiAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRMb2NhdGlvbihmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlcygpOworCisgICAgICAgIC8vIFVzZSBBTlRMUiBpdHNlbGYgdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXMgYW5kIGRlY2lkZSB3aGV0aGVyCisgICAgICAgIC8vIHRvIGludm9rZSBBTlRMUiBmb3IgY29tcGlsYXRpb24KKyAgICAgICAgaWYgKGRlcGVuZGVuY3lDaGVjaygpKSB7CisgICAgICAgICAgICBwb3B1bGF0ZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFyZ2V0LnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBsb2coY29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVyciA9IHJ1bihjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpLCBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0lORk8pLCBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX1dBUk4pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkFOVExSIHJldHVybmVkOiAiICsgZXJyLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJlcnJvclxcKFswLTldK1xcKToiKTsKKyAgICAgICAgICAgICAgICBNYXRjaGVyIG0gPSBwLm1hdGNoZXIoYm9zLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChtLmZpbmQoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkFOVExSIHNpZ25hbGVkIGFuIGVycm9yLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9nKCJBbGwgZGVwZW5kZW5jaWVzIG9mIGdyYW1tYXIgZmlsZSBcJyIgKyB0YXJnZXQuZ2V0Q2Fub25pY2FsUGF0aCgpICsgIlwnIGFyZSB1cCB0byBkYXRlLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBsb2coIkFsbCBkZXBlbmRlbmNpZXMgb2YgZ3JhbW1hciBmaWxlIFwnIiArIHRhcmdldC50b1N0cmluZygpICsgIlwnIGFyZSB1cCB0byBkYXRlLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZWZhY3RvcmVkIG1ldGhvZCBmb3IgcG9wdWxhdGluZyBhbGwgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdXNlci1zcGVjaWZpZWQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKCkgeworCisgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1vIik7CisgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUob3V0cHV0RGlyZWN0b3J5LnRvU3RyaW5nKCkpOworCisgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1saWIiKTsKKyAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShsaWJEaXJlY3RvcnkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgaWYgKHN1cGVyR3JhbW1hciAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2coIk9wdGlvbiAnZ2xpYicgaXMgbm90IHN1cHBvcnRlZCBieSBBTlRMUiB2My4gT3B0aW9uIGlnbm9yZWQhIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlhZ25vc3RpYykgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRpYWdub3N0aWMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwZW5kKSB7CisgICAgICAgICAgICBsb2coIk9wdGlvbiAnZGVwZW5kJyBpcyBpbXBsaWNpdGVseSBhbHdheXMgdXNlZCBieSBBTlRMUiB2My4gT3B0aW9uIGNhbiBzYWZlbHkgYmUgb21pdHRlZCEiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2UpIHsKKyAgICAgICAgICAgIGxvZygiT3B0aW9uICd0cmFjZScgaXMgbm90IHN1cHBvcnRlZCBieSBBTlRMUiB2My4gT3B0aW9uIGlnbm9yZWQhIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNlUGFyc2VyKSB7CisgICAgICAgICAgICBsb2coIk9wdGlvbiAndHJhY2VQYXJzZXInIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQU5UTFIgdjMuIE9wdGlvbiBpZ25vcmVkISIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFjZUxleGVyKSB7CisgICAgICAgICAgICBsb2coIk9wdGlvbiAndHJhY2VMZXhlcicgaXMgbm90IHN1cHBvcnRlZCBieSBBTlRMUiB2My4gT3B0aW9uIGlnbm9yZWQhIiwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVidWciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVwb3J0KSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItcmVwb3J0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByaW50KSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItcHJpbnQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvZmlsZSkgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXByb2ZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVzc2FnZUZvcm1hdE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW1lc3NhZ2UtZm9ybWF0Iik7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG1lc3NhZ2VGb3JtYXROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmZhKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbmZhIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRmYSkgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRmYSIpOworICAgICAgICB9CisgICAgICAgIGlmIChtdWx0aVRocmVhZGVkKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItWG11bHRpdGhyZWFkZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9jb2xsYXBzZSkgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVhub2NvbGxhcHNlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vcHJ1bmUpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1Ybm9wcnVuZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChkYmdTVCkgeworICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVhkYmdTVCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb252ZXJzaW9udGltZW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItWGNvbnZlcnNpb250aW1lb3V0Iik7CisgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGNvbnZlcnNpb250aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3JhbW1hclRyZWUpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1YZ3J0cmVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdGFyZ2V0IGdyYW1tYXIsIGxleGVyIGdyYW1tYXIgb3IgdHJlZSBwYXJzZXIgc3BlY2lmaWVkISIpOworICAgICAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGFyZ2V0OiAiICsgdGFyZ2V0ICsgIiBpcyBub3QgYSBmaWxlISIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm8gb3V0cHV0IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgdGFyZ2V0J3MgZGlyZWN0b3J5CisgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0T3V0cHV0ZGlyZWN0b3J5KG5ldyBGaWxlKHRhcmdldC5nZXRQYXJlbnQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvdXRwdXREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIG91dHB1dCBkaXJlY3Rvcnk6ICIgKyBvdXRwdXREaXJlY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdvcmtpbmdkaXIgIT0gbnVsbCAmJiAhd29ya2luZ2Rpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgd29ya2luZyBkaXJlY3Rvcnk6ICIgKyB3b3JraW5nZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vIGxpYkRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgdGFyZ2V0J3MgZGlyZWN0b3J5CisgICAgICAgIGlmIChsaWJEaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TGliZGlyZWN0b3J5KG5ldyBGaWxlKHRhcmdldC5nZXRQYXJlbnQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaWJEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIGxpYiBkaXJlY3Rvcnk6ICIgKyBsaWJEaXJlY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRlcGVuZGVuY3lDaGVjaygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHVzaW5nICJhbnRsciAtbyA8T3V0cHV0RGlyZWN0b3J5PiAtbGliIDxMaWJEaXJlY3Rvcnk+IC1kZXBlbmQgPFQ+IgorICAgICAgICAvLyB0byBnZXQgdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzCisgICAgICAgIENvbW1hbmRsaW5lSmF2YSBjbWRsaW5lOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY21kbGluZSA9IChDb21tYW5kbGluZUphdmEpIGNvbW1hbmRsaW5lLmNsb25lKCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5DbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNsb25lIG9mIGNvbW1hbmRsaW5lIGZhaWxlZDogIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgY21kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZGVwZW5kIik7CisgICAgICAgIGNtZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLW8iKTsKKyAgICAgICAgY21kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG91dHB1dERpcmVjdG9yeS50b1N0cmluZygpKTsKKyAgICAgICAgY21kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGliIik7CisgICAgICAgIGNtZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShsaWJEaXJlY3RvcnkudG9TdHJpbmcoKSk7CisgICAgICAgIGNtZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh0YXJnZXQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbG9nKGNtZGxpbmUuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIC8vIHJlZGlyZWN0IG91dHB1dCBnZW5lcmF0ZWQgYnkgQU5UTFIgdG8gdGVtcG9yYXJ5IGZpbGUKKyAgICAgICAgUmVkaXJlY3RvciByID0gbmV3IFJlZGlyZWN0b3IodGhpcyk7CisgICAgICAgIEZpbGUgZjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJkZXBlbmQiLCBudWxsLCBnZXRPdXRwdXRkaXJlY3RvcnkoKSk7CisgICAgICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgbG9nKCJXcml0ZSBkZXBlbmRlbmNpZXMgZm9yICciICsgdGFyZ2V0LnRvU3RyaW5nKCkgKyAiJyB0byBmaWxlICciICsgZi5nZXRDYW5vbmljYWxQYXRoKCkgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgci5zZXRPdXRwdXQoZik7CisgICAgICAgICAgICByLnNldEFsd2F5c0xvZyhmYWxzZSk7CisgICAgICAgICAgICByLmNyZWF0ZVN0cmVhbXMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZWRpcmVjdGlvbiBvZiBvdXRwdXQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleGVjdXRlIGFudGxyIC1kZXBlbmQgLi4uCisgICAgICAgIGludCBlcnIgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyID0gcnVuKGNtZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSwgci5nZXRPdXRwdXRTdHJlYW0oKSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIGxvZygiUmVkaXJlY3Rpb24gb2Ygb3V0cHV0IHRlcm1pbmF0ZWQuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGxvZygiVGVybWluYXRpb24gb2Ygb3V0cHV0IHJlZGlyZWN0aW9uIGZhaWxlZDogIiArIGV4LCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBib3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBsb2coIlJlZGlyZWN0aW9uIG9mIG91dHB1dCB0ZXJtaW5hdGVkLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIlRlcm1pbmF0aW9uIG9mIG91dHB1dCByZWRpcmVjdGlvbiBmYWlsZWQ6ICIgKyBlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21kbGluZS5nZXRDbGFzc3BhdGgoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKCJBbnRsciBsaWJyYXJpZXMgbm90IGZvdW5kIGluIGV4dGVybmFsIGNsYXNzcGF0aCBvciBlbWJlZGRlZCBjbGFzc3BhdGggc3RhdGVtZW50ICIsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkRlcGVuZGVuY3kgY2hlY2sgZmFpbGVkLiBBTlRMUiByZXR1cm5lZDogIiArIGVyciwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJlcnJvclxcKFswLTldK1xcKToiKTsKKyAgICAgICAgICAgIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihib3MudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBPbiBlcnJvciBhbHdheXMgcmVjb21waWxlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNvbXBpbGUgPSBmYWxzZTsKKworICAgICAgICAvLyBvcGVuIHRlbXBvcmFyeSBmaWxlCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGYpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgY2xvc2UgZmlsZVwnIiArIGYudG9TdHJpbmcoKSArICJcJy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiBcJyIgKyBmLmdldENhbm9uaWNhbFBhdGgoKSArICJcJyBmb3IgcmVhZGluZy4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3Qgb3BlbiBcJyIgKyBmLnRvU3RyaW5nKCkgKyAiXCcgZm9yIHJlYWRpbmcuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBldmFsdWF0ZSBkZXBlbmRlbmNpZXMgaW4gdGVtcG9yYXJ5IGZpbGUKKyAgICAgICAgU3RyaW5nIHM7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICgocyA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYjsKKyAgICAgICAgICAgICAgICAvLyBBcyB0aGUgc2VwYXJhdG9yIHN0cmluZyBpbiBsaW5lcyBlbWl0dGVkIGJ5IHRoZSBkZXBlbmQgb3B0aW9uCisgICAgICAgICAgICAgICAgLy8gaXMgZWl0aGVyICIgOiAiIG9yICI6ICIgdHJpbSBpcyBpbnZva2VkIGZvciB0aGUgZmlyc3QgZmlsZSBuYW1lIG9mIGEgbGluZQorICAgICAgICAgICAgICAgIGludCB0byA9IHMuaW5kZXhPZigiOiAiKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBhID0gcy5zdWJzdHJpbmcoMCwgdG8pLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBsaHMgPSBuZXcgRmlsZShhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsaHMuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmlsZSAnIiArIGEgKyAiJyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbGhzLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gc3BsaXRSaWdodEhhbmRTaWRlKG5hbWUsICJcXHUwMDJFIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoIDw9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICs9ICIuamF2YSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhzID0gbmV3IEZpbGUoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxocy5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZpbGUgJyIgKyBhICsgIicgaXMgYSByZWd1bGFyIGZpbGUgbGFzdCBtb2RpZmllZCBhdCAiICsgbGhzLmxhc3RNb2RpZmllZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiID0gcy5zdWJzdHJpbmcodG8gKyAiOiAiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBzcGxpdFJpZ2h0SGFuZFNpZGUoYiwgIiwgPyIpOworICAgICAgICAgICAgICAgICAgICBGaWxlIGFGaWxlID0gbmV3IEZpbGUoYSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBiRmlsZSA9IG5ldyBGaWxlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlICciICsgYSArICInIGRlcGVuZHMgb24gZmlsZSAnIiArIG5hbWUgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlICciICsgYSArICInIG1vZGlmaWVkIGF0ICIgKyBhRmlsZS5sYXN0TW9kaWZpZWQoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZpbGUgJyIgKyBuYW1lICsgIicgbW9kaWZpZWQgYXQgIiArIGJGaWxlLmxhc3RNb2RpZmllZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlVXRpbHMuaXNVcFRvRGF0ZShhRmlsZSwgYkZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDb21waWxpbmcgIiArIHRhcmdldCArICIgYXMgJyIgKyBuYW1lICsgIicgaXMgbmV3ZXIgdGhhbiAnIiArIGEgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZlZWxpbmcgbm90IHF1aXRlIGNvbWZvcnRhYmxlIHdpdGggdG91Y2hpbmcgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVXRpbHMuc2V0RmlsZUxhc3RNb2RpZmllZChhRmlsZSwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiVG91Y2hpbmcgZmlsZSAnIiArIGEgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21waWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgcmVhZGluZyBmaWxlICciICsgZi50b1N0cmluZygpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbXBpbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBzcGxpdFJpZ2h0SGFuZFNpZGUoU3RyaW5nIGZpbGVOYW1lcywgU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBmaWxlTmFtZXMuc3BsaXQocGF0dGVybik7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgeworICAgICAgICAgICAgbG9nKCJTcGxpdCByaWdodCBoYW5kIHNpZGUgJyIgKyBuYW1lICsgIiciLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgfQorCisgICAgLyoqIGV4ZWN1dGUgaW4gYSBmb3JrZWQgVk0gKi8KKyAgICBwcml2YXRlIGludCBydW4oU3RyaW5nW10gY29tbWFuZCwgT3V0cHV0U3RyZWFtIG91dCwgT3V0cHV0U3RyZWFtIGVycikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHVtcFN0cmVhbUhhbmRsZXIgcHNoOworICAgICAgICBpZiAoZXJyID09IG51bGwpIHsKKyAgICAgICAgICAgIHBzaCA9IG5ldyBQdW1wU3RyZWFtSGFuZGxlcihvdXQsIGJvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwc2ggPSBuZXcgUHVtcFN0cmVhbUhhbmRsZXIob3V0LCBuZXcgVGVlT3V0cHV0U3RyZWFtKGVyciwgYm9zKSk7CisgICAgICAgIH0KKworICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKHBzaCwgbnVsbCk7CisKKyAgICAgICAgZXhlLnNldEFudFJ1bihnZXRQcm9qZWN0KCkpOworICAgICAgICBpZiAod29ya2luZ2RpciAhPSBudWxsKSB7CisgICAgICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGV4ZS5zZXRDb21tYW5kbGluZShjb21tYW5kKTsKKworICAgICAgICByZXR1cm4gZXhlLmV4ZWN1dGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svYW50bHIzLXNyYy9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hbnRsci9hbnRsaWIueG1sIGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2FudGxyMy1zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvYW50bHIvYW50bGliLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDMwYTgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2FudGxyMy1zcmMvb3JnL2FwYWNoZS90b29scy9hbnQvYW50bHIvYW50bGliLnhtbApAQCAtMCwwICsxLDcgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPGFudGxpYj4NCisgIDx0YXNrZGVmDQorICAgIG5hbWU9ImFudGxyMyINCisgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5hbnRsci5BTlRMUjMiDQorICAgIC8+DQorPC9hbnRsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2FudGxyMy10YXNrLmRvYyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMtdGFzay5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwY2EzZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMtdGFzay5kb2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2FudGxyMy10YXNrLmh0bSBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMtdGFzay5odG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmNTliNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMtdGFzay5odG0KQEAgLTAsMCArMSwxOTU3IEBACis8aHRtbCB4bWxuczp2PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIKK3htbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKK3htbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCit4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxMSI+Cis8bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTEiPgorPGxpbmsgcmVsPUZpbGUtTGlzdCBocmVmPSJhbnRscjMtdGFzay1EYXRlaWVuL2ZpbGVsaXN0LnhtbCI+Cis8dGl0bGU+Jmx0O3Byb2plY3QgbmFtZT0mcXVvdDtEMlUmcXVvdDsgZGVmYXVsdD0mcXVvdDtkaXN0JnF1b3Q7IGJhc2VkaXI9JnF1b3Q7PC90aXRsZT4KKzwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDxvOkRvY3VtZW50UHJvcGVydGllcz4KKyAgPG86QXV0aG9yPkp1ZXJnZW48L286QXV0aG9yPgorICA8bzpMYXN0QXV0aG9yPkp1ZXJnZW48L286TGFzdEF1dGhvcj4KKyAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KKyAgPG86Q3JlYXRlZD4yMDA4LTA4LTI1VDIyOjUzOjAwWjwvbzpDcmVhdGVkPgorICA8bzpMYXN0U2F2ZWQ+MjAwOC0wOC0yNVQyMjo1MzowMFo8L286TGFzdFNhdmVkPgorICA8bzpQYWdlcz4xPC9vOlBhZ2VzPgorICA8bzpXb3Jkcz4xNjk2PC9vOldvcmRzPgorICA8bzpDaGFyYWN0ZXJzPjEwNjg1PC9vOkNoYXJhY3RlcnM+CisgIDxvOkNvbXBhbnk+UHJpdmF0ZTwvbzpDb21wYW55PgorICA8bzpMaW5lcz44OTwvbzpMaW5lcz4KKyAgPG86UGFyYWdyYXBocz4yNDwvbzpQYXJhZ3JhcGhzPgorICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMjM1NzwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KKyAgPG86VmVyc2lvbj4xMS45OTk5PC9vOlZlcnNpb24+CisgPC9vOkRvY3VtZW50UHJvcGVydGllcz4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OldvcmREb2N1bWVudD4KKyAgPHc6U3BlbGxpbmdTdGF0ZT5DbGVhbjwvdzpTcGVsbGluZ1N0YXRlPgorICA8dzpHcmFtbWFyU3RhdGU+Q2xlYW48L3c6R3JhbW1hclN0YXRlPgorICA8dzpIeXBoZW5hdGlvblpvbmU+MjE8L3c6SHlwaGVuYXRpb25ab25lPgorICA8dzpWYWxpZGF0ZUFnYWluc3RTY2hlbWFzLz4KKyAgPHc6U2F2ZUlmWE1MSW52YWxpZD5mYWxzZTwvdzpTYXZlSWZYTUxJbnZhbGlkPgorICA8dzpJZ25vcmVNaXhlZENvbnRlbnQ+ZmFsc2U8L3c6SWdub3JlTWl4ZWRDb250ZW50PgorICA8dzpBbHdheXNTaG93UGxhY2Vob2xkZXJUZXh0PmZhbHNlPC93OkFsd2F5c1Nob3dQbGFjZWhvbGRlclRleHQ+CisgIDx3OkNvbXBhdGliaWxpdHk+CisgICA8dzpTZWxlY3RFbnRpcmVGaWVsZFdpdGhTdGFydE9yRW5kLz4KKyAgIDx3OlVzZVdvcmQyMDAyVGFibGVTdHlsZVJ1bGVzLz4KKyAgPC93OkNvbXBhdGliaWxpdHk+CisgIDx3OkJyb3dzZXJMZXZlbD5NaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyNDwvdzpCcm93c2VyTGV2ZWw+CisgPC93OldvcmREb2N1bWVudD4KKzwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgorIDx3OkxhdGVudFN0eWxlcyBEZWZMb2NrZWRTdGF0ZT0iZmFsc2UiIExhdGVudFN0eWxlQ291bnQ9IjE1NiI+CisgPC93OkxhdGVudFN0eWxlcz4KKzwveG1sPjwhW2VuZGlmXS0tPgorPHN0eWxlPgorPCEtLQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCisgcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttc28tc3R5bGUtcGFyZW50OiIiOworCW1hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK2gyCisJe21zby1tYXJnaW4tdG9wLWFsdDphdXRvOworCW1hcmdpbi1yaWdodDowY207CisJbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87CisJbWFyZ2luLWxlZnQ6MGNtOworCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKKwltc28tb3V0bGluZS1sZXZlbDoyOworCWZvbnQtc2l6ZToxOC4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitoMworCXttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOworCW1hcmdpbi1sZWZ0OjBjbTsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJbXNvLW91dGxpbmUtbGV2ZWw6MzsKKwlmb250LXNpemU6MTMuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworCWZvbnQtd2VpZ2h0OmJvbGQ7fQoraDQKKwl7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowY207CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCW1zby1vdXRsaW5lLWxldmVsOjQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwlmb250LXdlaWdodDpib2xkO30KK2E6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKKwl7Y29sb3I6Ymx1ZTsKKwl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOworCXRleHQtdW5kZXJsaW5lOnNpbmdsZTt9CithOnZpc2l0ZWQsIHNwYW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQKKwl7Y29sb3I6cHVycGxlOworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7CisJdGV4dC11bmRlcmxpbmU6c2luZ2xlO30KK3AKKwl7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKKwltYXJnaW4tbGVmdDowY207CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQorY29kZQorCXtmb250LWZhbWlseToiQ291cmllciBOZXciOworCW1zby1hc2NpaS1mb250LWZhbWlseToiQ291cmllciBOZXciOworCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7CisJbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7CisJbXNvLWJpZGktZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijt9CitwcmUKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOworCXRhYi1zdG9wczo0NS44cHQgOTEuNnB0IDEzNy40cHQgMTgzLjJwdCAyMjkuMHB0IDI3NC44cHQgMzIwLjZwdCAzNjYuNHB0IDQxMi4ycHQgNDU4LjBwdCA1MDMuOHB0IDU0OS42cHQgNTk1LjRwdCA2NDEuMnB0IDY4Ny4wcHQgNzMyLjhwdDsKKwlmb250LXNpemU6MTAuMHB0OworCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7CisJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijt9CitzcGFuLlNwZWxsRQorCXttc28tc3R5bGUtbmFtZToiIjsKKwltc28tc3BsLWU6eWVzO30KK3NwYW4uR3JhbUUKKwl7bXNvLXN0eWxlLW5hbWU6IiI7CisJbXNvLWdyYW0tZTp5ZXM7fQorQHBhZ2UgU2VjdGlvbjEKKwl7c2l6ZTo1OTUuM3B0IDg0MS45cHQ7CisJbWFyZ2luOjcwLjg1cHQgNzAuODVwdCAyLjBjbSA3MC44NXB0OworCW1zby1oZWFkZXItbWFyZ2luOjM1LjRwdDsKKwltc28tZm9vdGVyLW1hcmdpbjozNS40cHQ7CisJbXNvLXBhcGVyLXNvdXJjZTowO30KK2Rpdi5TZWN0aW9uMQorCXtwYWdlOlNlY3Rpb24xO30KKy0tPgorPC9zdHlsZT4KKzwhLS1baWYgZ3RlIG1zbyAxMF0+Cis8c3R5bGU+CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KKyB0YWJsZS5Nc29Ob3JtYWxUYWJsZQorCXttc28tc3R5bGUtbmFtZToiTm9ybWFsZSBUYWJlbGxlIjsKKwltc28tdHN0eWxlLXJvd2JhbmQtc2l6ZTowOworCW1zby10c3R5bGUtY29sYmFuZC1zaXplOjA7CisJbXNvLXN0eWxlLW5vc2hvdzp5ZXM7CisJbXNvLXN0eWxlLXBhcmVudDoiIjsKKwltc28tcGFkZGluZy1hbHQ6MGNtIDUuNHB0IDBjbSA1LjRwdDsKKwltc28tcGFyYS1tYXJnaW46MGNtOworCW1zby1wYXJhLW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47CisJZm9udC1zaXplOjEwLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKKwltc28tYW5zaS1sYW5ndWFnZTojMDQwMDsKKwltc28tZmFyZWFzdC1sYW5ndWFnZTojMDQwMDsKKwltc28tYmlkaS1sYW5ndWFnZTojMDQwMDt9Cis8L3N0eWxlPgorPCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRpdCIgc3BpZG1heD0iMjA1MCIvPgorPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+CisgPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPgorICA8bzppZG1hcCB2OmV4dD0iZWRpdCIgZGF0YT0iMSIvPgorIDwvbzpzaGFwZWxheW91dD48L3htbD48IVtlbmRpZl0tLT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz1ERSBsaW5rPWJsdWUgdmxpbms9cHVycGxlIHN0eWxlPSd0YWItaW50ZXJ2YWw6MzUuNHB0Jz4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPGgyPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5BTlRMUjM8bzpwPjwvbzpwPjwvc3Bhbj48L2gyPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkRlc2NyaXB0aW9uPG86cD48L286cD48L3NwYW4+PC9oMz4KKworPHA+PHNwYW4gY2xhc3M9R3JhbUU+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkludm9rZXMKK3RoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFudGxyLm9yZy92My9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPkFOVExSMzwvYT4KK1RyYW5zbGF0b3IgZ2VuZXJhdG9yIG9uIGEgZ3JhbW1hciBmaWxlLjwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz1FTi1HQgorc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz4gPG86cD48L286cD48L3NwYW4+PC9wPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPlByZXJlcXVpc2l0ZXM8bzpwPjwvbzpwPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDttc28tYW5zaS1sYW5ndWFnZTpFTi1HQjsKK2ZvbnQtd2VpZ2h0Om5vcm1hbCc+QXBhY2hlIGFudCB2ZXJzaW9uIDEuNy4wIGFuZCBsYXRlciBpcyByZXF1aXJlZCwgYnV0IGFudAordmVyc2lvbiAxLjYuNSBzaG91bGQgc3VwcG9ydCA8c3BhbiBjbGFzcz1TcGVsbEU+YW50bGliczwvc3Bhbj4sIHRvby48L3NwYW4+PHNwYW4KK2xhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48bzpwPjwvbzpwPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkluc3RhbGxhdGlvbjxvOnA+PC9vOnA+PC9zcGFuPjwvaDM+CisKKzxoMz48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O21zby1hbnNpLWxhbmd1YWdlOkVOLUdCOworZm9udC13ZWlnaHQ6bm9ybWFsJz5UaGUgcmVjb21tZW5kZWQgcHJvY2VkdXJlIGlzIHRvIGNvcHkgdGhlIGFudGxyMy5qYXIgaW4geW91cgorJEFOVF9IT01FL2xpYiBkaXJlY3RvcnksIGJ1dCBpdCBzdWZmaWNlcyB0byBoYXZlIGl0IGluIHlvdXIgPHNwYW4gY2xhc3M9U3BlbGxFPmNsYXNzcGF0aDwvc3Bhbj4uPC9zcGFuPjxzcGFuCitsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9oMz4KKworPGgzPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5QYXJhbWV0ZXJzPG86cD48L286cD48L3NwYW4+PC9oMz4KKworPHRhYmxlIGNsYXNzPU1zb05vcm1hbFRhYmxlIGJvcmRlcj0xIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MAorIHN0eWxlPSdtc28tY2VsbHNwYWNpbmc6MGNtO21zby1wYWRkaW5nLWFsdDoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjA7bXNvLXlmdGktZmlyc3Ryb3c6eWVzJz4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PGI+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkF0dHJpYnV0ZTwvc3Bhbj48L2I+PHNwYW4KKyAgbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PGI+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkRlc2NyaXB0aW9uPC9zcGFuPjwvYj48c3BhbgorICBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj48c3BhbgorICBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+UmVxdWlyZWQ8L3NwYW4+PC9iPjxzcGFuCisgIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J21zby15ZnRpLWlyb3c6MSc+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz50YXJnZXQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5UaGUKKyAgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48c3BhbiBsYW5nPUVOLUdCCisgIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+WWVzPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjInPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6CisgIEVOLUdCJz5vdXRwdXRkaXJlY3Rvcnk8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOgorICBFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+VGhlCisgIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLiBJZiBub3Qgc2V0LCB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4KKyAgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuIDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjMnPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6CisgIEVOLUdCJz5saWJkaXJlY3Rvcnk8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOgorICBFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+VGhlCisgIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRva2VuIGZpbGVzLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjQnPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+ZGVwZW5kPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+V2hlbiBzZXQKKyAgdG8gk3RydWWULCA8c3BhbiBjbGFzcz1TcGVsbEU+QU5UTFJzPC9zcGFuPiCRZGVwZW5kkiBvcHRpb24gaXMgdXNlZCB0bworICByZXNvbHZlIGRlcGVuZGVuY2llcyBhbmQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW52b2tlIEFOVExSIGZvciBjb21waWxhdGlvbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+V2hlbiBzZXQKKyAgdG8gk2ZhbHNllCwgdHJ5IHRvIGZpZ3VyZSBvdXQgaWYgYW4gQU5UTFIgZ2VuZXJhdGVkIGZpbGUgaXMgb3V0IG9mIGRhdGUKKyAgd2l0aG91dCBpbnZva2luZyBBTlRMUiB3aXRoIGl0cyCRZGVwZW5kkiBvcHRpb24uPG86cD48L286cD48L3NwYW4+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkRlZmF1bHQKKyAgc2V0dGluZyBpcyCTZmFsc2WUIHRvIGtlZXAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48c3BhbiBsYW5nPUVOLUdCCisgIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+Tm88bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J21zby15ZnRpLWlyb3c6NSc+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5yZXBvcnQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5XaGVuIHNldAorICB0byAmcXVvdDt0cnVlJnF1b3Q7LCBwcmludHMgb3V0IGEgcmVwb3J0IGFib3V0IHRoZSBncmFtbWFyIHByb2Nlc3NlZC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+RGVmYXVsdAorICBpcyCTZmFsc2WULjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjYnPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+cHJpbnQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5XaGVuIHNldAorICB0byAmcXVvdDt0cnVlJnF1b3Q7LCBwcmludCBvdXQgdGhlIGdyYW1tYXIgd2l0aG91dCBhY3Rpb25zLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5EZWZhdWx0CisgIGlzIJNmYWxzZZQuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48c3BhbiBsYW5nPUVOLUdCCisgIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+Tm88bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J21zby15ZnRpLWlyb3c6Nyc+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5kZWJ1ZzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPldoZW4gc2V0CisgIHRvICZxdW90O3RydWUmcXVvdDssIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIGVtaXRzIGRlYnVnZ2luZyBldmVudHMuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkRlZmF1bHQKKyAgaXMgk2ZhbHNllDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjgnPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+cHJvZmlsZTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPldoZW4gc2V0CisgIHRvICZxdW90O3RydWUmcXVvdDssIGdlbmVyYXRlcyBhIHBhcnNlciB0aGF0IGNvbXB1dGVzIHByb2ZpbGluZyBpbmZvcm1hdGlvbi4gPG86cD48L286cD48L3NwYW4+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkRlZmF1bHQKKyAgaXMgk2ZhbHNllC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxzcGFuIGxhbmc9SVQKKyAgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOklUJz5ObzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBzdHlsZT0nbXNvLXlmdGktaXJvdzo5Jz4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1JVCBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6SVQnPm5mYTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPldoZW4gc2V0CisgIHRvICZxdW90O3RydWUmcXVvdDssIGdlbmVyYXRlIGFuIE5GQSBmb3IgZWFjaCBydWxlLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5EZWZhdWx0CisgIGlzIJNmYWxzZZQuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48c3BhbiBsYW5nPUVOLUdCCisgIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+Tm88bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J21zby15ZnRpLWlyb3c6MTAnPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6CisgIEVOLUdCJz5kZmE8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5XaGVuIHNldAorICB0byAmcXVvdDt0cnVlJnF1b3Q7LCBnZW5lcmF0ZSA8c3BhbiBjbGFzcz1HcmFtRT5hbjwvc3Bhbj4gREZBIGZvciBlYWNoIHJ1bGUuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkRlZmF1bHQKKyAgaXMgk2ZhbHNllC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxzcGFuIGxhbmc9RU4tR0IKKyAgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5ObzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBzdHlsZT0nbXNvLXlmdGktaXJvdzoxMSc+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGNsYXNzPVNwZWxsRT48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZToKKyAgRU4tR0InPm1lc3NhZ2VGb3JtYXQ8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOgorICBFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+V2hlbiBzZXQKKyAgdG8gYSBtZXNzYWdlIGZvcm1hdCB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHlsZSBmb3IgbWVzc2FnZXMgaXMgdXNlZC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+RGVmYXVsdAorICBpcyCTZmFsc2WULjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjEyJz4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPm11bHRpdGhyZWFkZWQ8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5XaGVuIHNldAorICB0byAmcXVvdDt0cnVlJnF1b3Q7LCBydW4gdGhlIGFuYWx5c2lzIGluIDIgdGhyZWFkcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+RGVmYXVsdAorICBpcyCTZmFsc2WULjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjEzJz4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPmRpcjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPlRoZQorICBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxzcGFuIGxhbmc9RU4tR0IKKyAgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5ObzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBzdHlsZT0nbXNvLXlmdGktaXJvdzoxNCc+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGNsYXNzPVNwZWxsRT48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZToKKyAgRU4tR0InPmRiZ1NUPC9zcGFuPjwvc3Bhbj48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+V2hlbiBzZXQKKyAgdG8gk3RydWWULCBwdXQgdGFncyBhdCBzdGFydC9zdG9wIG9mIGFsbCB0ZW1wbGF0ZXMgaW4gb3V0cHV0LjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5EZWZhdWx0CisgIGlzIJNmYWxzZZQuPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48c3BhbiBsYW5nPUVOLUdCCisgIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+Tm88bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J21zby15ZnRpLWlyb3c6MTUnPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6CisgIEVOLUdCJz5ub3BydW5lPC9zcGFuPjwvc3Bhbj48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+VGVzdCA8c3BhbgorICBjbGFzcz1TcGVsbEU+bG9va2FoZWFkPC9zcGFuPiBhZ2FpbnN0IEVCTkYgYmxvY2sgZXhpdCBicmFuY2hlcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+RGVmYXVsdAorICBpcyCTZmFsc2WULjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjE2Jz4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOgorICBFTi1HQic+bm9jb2xsYXBzZTwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6CisgIEVOLUdCJz48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDwvdGQ+CisgIDx0ZCB2YWxpZ249dG9wIHN0eWxlPSdwYWRkaW5nOjEuMnB0IDEuMnB0IDEuMnB0IDEuMnB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5jb2xsYXBzZQorICBpbmNpZGVudCBlZGdlcyBpbnRvIERGQSBzdGF0ZXM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+RGVmYXVsdAorICBpcyCTZmFsc2WULjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdtc28teWZ0aS1pcm93OjE3O21zby15ZnRpLWxhc3Ryb3c6eWVzJz4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOgorICBFTi1HQic+Y29udmVyc2lvbnRpbWVvdXQ8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOgorICBFTi1HQic+PG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorICA8dGQgdmFsaWduPXRvcCBzdHlsZT0ncGFkZGluZzoxLjJwdCAxLjJwdCAxLjJwdCAxLjJwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+U2V0IHRoZQorICBORkEgY29udmVyc2lvbiB0aW1lb3V0IGZvciBlYWNoIDxzcGFuIGNsYXNzPVNwZWxsRT5kZWNpc2l0aW9uPC9zcGFuPiB0byB0aGUKKyAgc3VwcGxpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+RGVmYXVsdAorICBpcyAxMDAgYXMgcGVyIEFOVExSMzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHZhbGlnbj10b3Agc3R5bGU9J3BhZGRpbmc6MS4ycHQgMS4ycHQgMS4ycHQgMS4ycHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1HQgorICBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5vPG86cD48L286cD48L3NwYW4+PC9wPgorICA8L3RkPgorIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDttc28tYW5zaS1sYW5ndWFnZTpFTi1HQjsKK2ZvbnQtd2VpZ2h0Om5vcm1hbCc+QXMgbmVhcmx5IGV2ZXJ5d2hlcmUgaW4gYW50IJN0cnVllCByZXNwZWN0aXZlbHkgk2ZhbHNllCBjYW4KK2JlIHVzZWQgaW5zdGVhZCBvZiCTeWVzlCBhbmQgk25vlCB0byBhY3RpdmF0ZSBvciBkZWFjdGl2YXRlIGFuIGF0dHJpYnV0ZS48bzpwPjwvbzpwPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPk5lc3RlZCBFbGVtZW50czxvOnA+PC9vOnA+PC9zcGFuPjwvaDM+CisKKzxwPjxjb2RlPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPkFOVExSMzwvc3Bhbj48L2NvZGU+PHNwYW4KK2xhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz4gc3VwcG9ydHMgYSBuZXN0ZWQgPC9zcGFuPjxjb2RlPjxzcGFuCitsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz4mbHQ7PHNwYW4KK2NsYXNzPVNwZWxsRT5jbGFzc3BhdGg8L3NwYW4+Jmd0Ozwvc3Bhbj48L2NvZGU+PHNwYW4gbGFuZz1FTi1HQgorc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz4gPHNwYW4gY2xhc3M9R3JhbUU+ZWxlbWVudCwgdGhhdCByZXByZXNlbnRzIGEgPHNwYW4KK2xhbmc9REUgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkRFJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI3BhdGgiPjxzcGFuIGxhbmc9RU4tR0IKK3N0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+UEFUSDwvc3Bhbj48L2E+PC9zcGFuPjwvc3Bhbj48c3BhbgorY2xhc3M9TXNvSHlwZXJsaW5rPiBsaWtlIHN0cnVjdHVyZTwvc3Bhbj48L3NwYW4+PC9wPgorCis8c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0I7bXNvLWZhcmVhc3QtbGFuZ3VhZ2U6CitERTttc28tYmlkaS1sYW5ndWFnZTpBUi1TQSc+LiBJdCBpcyBnaXZlbiBhcyBhIGNvbnZlbmllbmNlIGlmIHlvdSBoYXZlIHRvCitzcGVjaWZ5IHRoZSBvcmlnaW5hbCBBTlRMUiBkaXJlY3RvcnkuIEluIG1vc3QgY2FzZXMsIGhhdmluZyB0aGUgYW50bHItMy54LmphciwKK3RoZSBhbnRsci0yLjcuNy5qYXIgYW5kIHRoZSBzdHJpbmd0ZW1wbGF0ZS0zLnguamFyIHJlZmVyZW5jZWQgaW4gdGhlIDxzcGFuCitjbGFzcz1TcGVsbEU+Y2xhc3NwYXRoPC9zcGFuPiBvciB2aWEgdGhlIEFOVExSX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbAorYmUgZW5vdWdoLjwvc3Bhbj48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOworbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0I7bXNvLWZhcmVhc3QtbGFuZ3VhZ2U6REU7bXNvLWJpZGktbGFuZ3VhZ2U6QVItU0EnPjxvOnA+PC9vOnA+PC9zcGFuPgorCis8aDQ+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcGF0aCI+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuCitjbGFzcz1HcmFtRT48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZToKK25vbmUnPmp2bWFyZzwvc3Bhbj48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O3RleHQtZGVjb3JhdGlvbjoKK25vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2g0PgorCis8cD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNwYXRoIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPkFkZGl0aW9uYWwgcGFyYW1ldGVycyBtYXkgYmUgcGFzc2VkCit0byB0aGUgbmV3IFZNIHZpYSBuZXN0ZWQgPC9zcGFuPjxjb2RlPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPmp2bWFyZzwvc3Bhbj4mZ3Q7PC9zcGFuPjwvY29kZT48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+IGF0dHJpYnV0ZXMsCitmb3IgZXhhbXBsZTo8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHByZT48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNwYXRoIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPiZsdDthbnRscjxzcGFuIGNsYXNzPUdyYW1FPjphbnRscjM8L3NwYW4+IDxzcGFuCitjbGFzcz1TcGVsbEU+eG1sbnM6YW50bHI8L3NwYW4+PSZxdW90OzxzcGFuIGNsYXNzPVNwZWxsRT5hbnRsaWI6b3JnL2FwYWNoZS90b29scy9hbnQvYW50bHI8L3NwYW4+JnF1b3Q7IHRhcmdldD0mcXVvdDsuLi4mcXVvdDsmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3ByZT48cHJlPjxzcGFuCitsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNwYXRoIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6gIDwvc3Bhbj4mbHQ7PHNwYW4KK2NsYXNzPVNwZWxsRT5qdm1hcmc8L3NwYW4+IHZhbHVlPSZxdW90Oy1YbXg1MTJNJnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcHJlPjxwcmU+PHNwYW4KK2xhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI3BhdGgiPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqAgPC9zcGFuPi4uLjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wcmU+PHByZT48c3BhbgorbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcGF0aCI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7L2FudGxyPHNwYW4gY2xhc3M9R3JhbUU+OmFudGxyMzwvc3Bhbj4mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3ByZT4KKworPHA+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcGF0aCI+PHNwYW4gY2xhc3M9R3JhbUU+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPndvdWxkPC9zcGFuPjwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+IHNldCB0aGUKK21heGltdW0gSmF2YSBoZWFwIHNpemUgdG8gNTEyIE1lZ2FieXRlIHdoZW4gcnVubmluZyBBTlRMUjMuPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwPjxjb2RlPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjcGF0aCI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuCitjbGFzcz1HcmFtRT5qdm1hcmc8L3NwYW4+PC9zcGFuPiZndDs8L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7Citmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjttc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKK2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+IGFsbG93cyBhbGwKK2F0dHJpYnV0ZXMgZGVzY3JpYmVkIGluIDwvc3Bhbj48c3BhbiBsYW5nPURFIHN0eWxlPSdmb250LXNpemU6MTIuMHB0OworZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Citjb2xvcjp3aW5kb3d0ZXh0O21zby1hbnNpLWxhbmd1YWdlOkRFO3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLWZpZWxkLWNvZGU6IiBIWVBFUkxJTksgXDAwMjJodHRwXDpcL1wvYW50XC5hcGFjaGVcLm9yZ1wvbWFudWFsXC91c2luZ1wuaHRtbFwwMDIyIFxcbCBcMDAyMmFyZ1wwMDIyICInPjx1PjxzcGFuCitsYW5nPUVOLUdCIHN0eWxlPSdjb2xvcjpibHVlO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz5Db21tYW5kIGxpbmUgYXJndW1lbnRzPC9zcGFuPjwvdT48L3NwYW4+PC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjttc28tZmFyZWFzdC1mb250LWZhbWlseToKKyJUaW1lcyBOZXcgUm9tYW4iO2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Ljwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6CisiVGltZXMgTmV3IFJvbWFuIjtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9jb2RlPjwvcD4KKworPGgzPjxzcGFuIGxhbmc9RlIgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkZSJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz5FeGFtcGxlPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2gzPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Jmx0O2FudGxyPHNwYW4gY2xhc3M9R3JhbUU+OmFudGxyMzwvc3Bhbj4KKzxzcGFuIGNsYXNzPVNwZWxsRT54bWxuczphbnRscjwvc3Bhbj49JnF1b3Q7PHNwYW4gY2xhc3M9U3BlbGxFPmFudGxpYjpvcmcvYXBhY2hlL3Rvb2xzL2FudC9hbnRscjwvc3Bhbj4mcXVvdDs8YnI+Cis8L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Y29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6Citub25lJz50YXJnZXQ9JnF1b3Q7ZXRjLzxzcGFuIGNsYXNzPVNwZWxsRT5qYXZhLmc8L3NwYW4+JnF1b3Q7PGJyPgorPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVNwZWxsRT48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246Citub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPm91dHB1dGRpcmVjdG9yeTwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz49JnF1b3Q7YnVpbGQvPHNwYW4gY2xhc3M9U3BlbGxFPnNyYzwvc3Bhbj4mcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVNwZWxsRT48c3BhbiBjbGFzcz1HcmFtRT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+bGliZGlyZWN0b3J5PC9zcGFuPjwvc3Bhbj48L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsKK2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PSZxdW90O2J1aWxkLzxzcGFuCitjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPiZxdW90OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTsKK3RleHQtdW5kZXJsaW5lOm5vbmUnPm11bHRpdGhyZWFkZWQ8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworbXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz49JnF1b3Q7dHJ1ZSZxdW90OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Jmx0Oy9hbnRscjxzcGFuIGNsYXNzPUdyYW1FPjphbnRscjM8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+VGhpcyBpbnZva2VzIEFOVExSMyBvbiBncmFtbWFyIGZpbGUKK2V0Yy88c3BhbiBjbGFzcz1TcGVsbEU+amF2YS5nPC9zcGFuPiwgd3JpdGluZyB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvIGJ1aWxkLzxzcGFuCitjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPi4gVGhlIGFuYWx5c2lzIGlzIGJlaW5nIGRvbmUgaW4gdHdvIHRocmVhZHMuPGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+CitBIGNvbXBsZXRlIGJ1aWxkIGZpbGUgc2hvd2luZyB0aGUgdXNhZ2Ugb2YgdGhlIEFOVExSMyB0YXNrIG1pZ2h0IGxvb2sgbGlrZQordGhpczo8L3NwYW4+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseToKKyJDb3VyaWVyIE5ldyI7Y29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPiZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7ZDJ1JnF1b3Q7CitkZWZhdWx0PSZxdW90O2Rpc3QmcXVvdDsgPHNwYW4gY2xhc3M9U3BlbGxFPmJhc2VkaXI8L3NwYW4+PSZxdW90Oy4mcXVvdDsmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPUdyYW1FPmRlc2NyaXB0aW9uPC9zcGFuPiZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+TW9yZSB0aGFuIGEgRE9TIHRvIFVOSVggY29udmVyc2lvbiBvZgorbGluZSBlbmRzLjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvZGVzY3JpcHRpb24mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7PHNwYW4gY2xhc3M9U3BlbGxFPnByb2plY3QubmFtZTwvc3Bhbj4mcXVvdDsKK3ZhbHVlPSZxdW90O2QydSZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IHByb2dyYW0gdmVyc2lvbiAtLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt2ZXJzaW9uJnF1b3Q7IHZhbHVlPSZxdW90OzEuMDAmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiBzZXQgZ2xvYmFsIHByb3BlcnRpZXMgZm9yIHRoaXMgYnVpbGQKKy0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2J1aWxkJnF1b3Q7IGxvY2F0aW9uPSZxdW90Oy4mcXVvdDsvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90OzxzcGFuIGNsYXNzPVNwZWxsRT5zcmM8L3NwYW4+JnF1b3Q7Citsb2NhdGlvbj0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPiZxdW90Oy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7Y2xhc3NlcyZxdW90OyBsb2NhdGlvbj0mcXVvdDtjbGFzc2VzJnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtkaXN0JnF1b3Q7IGxvY2F0aW9uPSZxdW90O2Rpc3QmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtkb2MmcXVvdDsgbG9jYXRpb249JnF1b3Q7ZG9jcy88c3BhbgorY2xhc3M9U3BlbGxFPmFwaTwvc3Bhbj4mcXVvdDsvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2dyYW1tYXImcXVvdDsgbG9jYXRpb249JnF1b3Q7Z3JhbW1hciZxdW90Oy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtwYWNrYWdlJnF1b3Q7IHZhbHVlPSZxdW90O29yZy88c3BhbgorY2xhc3M9U3BlbGxFPm15b3JnPC9zcGFuPi8kezxzcGFuIGNsYXNzPVNwZWxsRT5wcm9qZWN0Lm5hbWU8L3NwYW4+fSZxdW90Oy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+Jmx0OyEtLTwvc3Bhbj4gd2hlcmUgdG8gd3JpdGUvZmluZCB0b2tlbiBmaWxlcyAtLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+dG9rZW4ubGliPC9zcGFuPiZxdW90OworbG9jYXRpb249JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPn0vJHtwYWNrYWdlfSZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+Jmx0OyEtLTwvc3Bhbj4gPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPiBvcHRpb25zCistLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtwcm9maWxlJnF1b3Q7IHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7cmVwb3J0JnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDttdWx0aXRocmVhZGVkJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IHdoZXJlIHRvIGZpbmQgPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPgorYW5kIGFzc29jaWF0ZXMgLS0mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiBJZiB0aGUgamFyLWFyY2hpdmVzIGxpc3RlZCBiZWxvdyBhcmUKK2FscmVhZHkgaW4gdGhlIDxzcGFuIGNsYXNzPVNwZWxsRT5jbGFzc3BhdGg8L3NwYW4+IC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IHRoZSBkZWZpbml0aW9uIG9mIDxzcGFuIGNsYXNzPVNwZWxsRT5hbnRsci5wYXRoPC9zcGFuPgorY291bGQgYmUgZHJvcHBlZCwgYmVjYXVzZSAtLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiBhbnRscjMuamFyIHdpbGwgcmVzb2x2ZSB0aGUgbGlicmFyaWVzCitieSBpdHNlbGYuIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IEFzIDxzcGFuIGNsYXNzPVNwZWxsRT5hbnRsci5saWJkaXI8L3NwYW4+CithbmQgPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyLmxpYnM8L3NwYW4+IGFyZSBqdXN0IGF1eGlsaWFyeSAtLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiBwYXJhbWV0ZXJzIGhlbHBpbmcgdG8gY3JlYXRlIDxzcGFuCitjbGFzcz1TcGVsbEU+YW50bHIucGF0aDwvc3Bhbj4sIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IHRoZXkgY291bGQgYmUgZWxpbWluYXRlZCBpbiB0aGlzIGNhc2UsCit0b28uIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7PHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyLmxpYmRpcjwvc3Bhbj4mcXVvdDsKK2xvY2F0aW9uPSZxdW90O0M8c3BhbiBjbGFzcz1HcmFtRT46Lzwvc3Bhbj5Qcm9ncmFtbWUvPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPi9saWImcXVvdDsKKy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPnBhdHRlcm5zZXQ8L3NwYW4+IGlkPSZxdW90OzxzcGFuIGNsYXNzPVNwZWxsRT5hbnRsci5saWJzPC9zcGFuPiZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoAorPC9zcGFuPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goDwvc3Bhbj4mbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2FudGxyLTMuMS5qYXImcXVvdDsKKy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDtpbmNsdWRlCituYW1lPSZxdW90O2FudGxyLTIuNy43LmphciZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7aW5jbHVkZQorbmFtZT0mcXVvdDtzdHJpbmd0ZW1wbGF0ZS0zLjIuamFyJnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7YW50bHItcnVudGltZS0zLjEuamFyJnF1b3Q7CisvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvPHNwYW4gY2xhc3M9U3BlbGxFPnBhdHRlcm5zZXQ8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3BhdGggaWQ9JnF1b3Q7PHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyLnBhdGg8L3NwYW4+JnF1b3Q7Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPmZpbGVzZXQ8L3NwYW4+CitkaXI9JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bHIubGliZGlyPC9zcGFuPn0mcXVvdDsgPHNwYW4gY2xhc3M9U3BlbGxFPmNhc2VzZW5zaXRpdmU8L3NwYW4+PSZxdW90O3llcyZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoCA8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPVNwZWxsRT5wYXR0ZXJuc2V0PC9zcGFuPgorPHNwYW4gY2xhc3M9U3BlbGxFPnJlZmlkPC9zcGFuPj0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bHIubGliczwvc3Bhbj4mcXVvdDsKKy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDsvPHNwYW4gY2xhc3M9U3BlbGxFPmZpbGVzZXQ8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvcGF0aCZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtpbml0JnF1b3Q7Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiBDcmVhdGUKK3RoZSB0aW1lIHN0YW1wIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPnRzdGFtcDwvc3Bhbj4KKy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IENyZWF0ZQordGhlIGJ1aWxkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdXNlZCBieSBjb21waWxlIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz1ERSBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK21zby1hbnNpLWxhbmd1YWdlOkRFO3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPiZsdDs8c3BhbgorY2xhc3M9U3BlbGxFPm1rZGlyPC9zcGFuPiBkaXI9JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+Z3JhbW1hcjwvc3Bhbj59JnF1b3Q7CisvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPjxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz1TcGVsbEU+bWtkaXI8L3NwYW4+CitkaXI9JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPn0vJHs8c3BhbiBjbGFzcz1TcGVsbEU+cGFja2FnZTwvc3Bhbj59JnF1b3Q7CisvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPjxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz1TcGVsbEU+bWtkaXI8L3NwYW4+CitkaXI9JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+Y2xhc3Nlczwvc3Bhbj59LyR7PHNwYW4gY2xhc3M9U3BlbGxFPnBhY2thZ2U8L3NwYW4+fSZxdW90OworLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz48YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz1JVCBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK21zby1hbnNpLWxhbmd1YWdlOklUO3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPiZsdDtta2RpcgorZGlyPSZxdW90OyR7Y2xhc3Nlc30vTUVUQS1JTkYmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9SVQgc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6SVQnPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0O21rZGlyIGRpcj0mcXVvdDske2Rpc3R9L2xpYiZxdW90OworLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9SVQgc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6SVQnPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0O21rZGlyCitkaXI9JnF1b3Q7JHtkb2N9LyR7cGFja2FnZX0mcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9SVQgc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6SVQnPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48L3NwYW4+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDttc28tYW5zaS1sYW5ndWFnZTpFTi1HQjsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPiZsdDsvdGFyZ2V0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3RhcmdldCBuYW1lPSZxdW90OzxzcGFuIGNsYXNzPVNwZWxsRT5hbnRscjwvc3Bhbj4mcXVvdDsKK2RlcGVuZHM9JnF1b3Q7aW5pdCZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtydW4gPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPgorb24gZ3JhbW1hciZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0O2VjaG8gbWVzc2FnZT0mcXVvdDs8c3BhbgorY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPiAke2dyYW1tYXJ9LyR7PHNwYW4gY2xhc3M9U3BlbGxFPmdyYW1tYXIubmFtZTwvc3Bhbj59JnF1b3Q7CisvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7YW50bHI8c3BhbiBjbGFzcz1HcmFtRT46YW50bHIzPC9zcGFuPgorPHNwYW4gY2xhc3M9U3BlbGxFPnhtbG5zOmFudGxyPC9zcGFuPj0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bGliOm9yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxyPC9zcGFuPiZxdW90OworPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT50YXJnZXQ8L3NwYW4+PSZxdW90OyR7Z3JhbW1hcn0vJHs8c3BhbgorY2xhc3M9U3BlbGxFPmdyYW1tYXIubmFtZTwvc3Bhbj59JnF1b3Q7IDxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoCA8L3NwYW4+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuCitjbGFzcz1HcmFtRT5vdXRwdXRkaXJlY3Rvcnk8L3NwYW4+PC9zcGFuPj0mcXVvdDskezxzcGFuIGNsYXNzPVNwZWxsRT5zcmM8L3NwYW4+fS8ke3BhY2thZ2V9JnF1b3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT5tdWx0aXRocmVhZGVkPC9zcGFuPj0mcXVvdDske211bHRpdGhyZWFkZWR9JnF1b3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT5yZXBvcnQ8L3NwYW4+PSZxdW90OyR7cmVwb3J0fSZxdW90OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoCA8L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+cHJvZmlsZTwvc3Bhbj49JnF1b3Q7JHtwcm9maWxlfSZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0Oy9hbnRscjxzcGFuIGNsYXNzPUdyYW1FPjphbnRscjM8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvdGFyZ2V0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbXBpbGUmcXVvdDsgZGVwZW5kcz0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bHI8L3NwYW4+JnF1b3Q7CitkZXNjcmlwdGlvbj0mcXVvdDtjb21waWxlJnF1b3Q7Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPgorQ29tcGlsZSB0aGUgamF2YSBjb2RlIGZyb20gJHs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPn0gaW50byAke2NsYXNzZXN9CistLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPVNwZWxsRT5qYXZhYzwvc3Bhbj4KK2RlYnVnPSZxdW90O3RydWUmcXVvdDsgPHNwYW4gY2xhc3M9U3BlbGxFPnNyY2Rpcjwvc3Bhbj49JnF1b3Q7JHs8c3BhbgorY2xhc3M9U3BlbGxFPnNyYzwvc3Bhbj59JnF1b3Q7IDxzcGFuIGNsYXNzPVNwZWxsRT5kZXN0ZGlyPC9zcGFuPj0mcXVvdDske2NsYXNzZXN9JnF1b3Q7PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKAgPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoCA8L3NwYW4+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuCitjbGFzcz1HcmFtRT5saXN0ZmlsZXM8L3NwYW4+PC9zcGFuPj0mcXVvdDtZZXMmcXVvdDsKK2RlcHJlY2F0aW9uPSZxdW90O1llcyZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKAgPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4KK2NsYXNzPUdyYW1FPmNsYXNzcGF0aDwvc3Bhbj48L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKAgPC9zcGFuPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgPC9zcGFuPiZsdDtwYXRoIDxzcGFuIGNsYXNzPVNwZWxsRT5yZWZpZDwvc3Bhbj49JnF1b3Q7PHNwYW4KK2NsYXNzPVNwZWxsRT5hbnRsci5wYXRoPC9zcGFuPiZxdW90Oy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgIDwvc3Bhbj4mbHQ7LzxzcGFuIGNsYXNzPVNwZWxsRT5jbGFzc3BhdGg8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoCA8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPVNwZWxsRT5jb21waWxlcmFyZzwvc3Bhbj4KK3ZhbHVlPSZxdW90Oy08c3BhbiBjbGFzcz1TcGVsbEU+WGxpbnQ8c3BhbiBjbGFzcz1HcmFtRT46dW5jaGVja2VkPC9zcGFuPjwvc3Bhbj4mcXVvdDsvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7LzxzcGFuIGNsYXNzPVNwZWxsRT5qYXZhYzwvc3Bhbj4mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0Oy90YXJnZXQmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7bWFuaWZlc3QmcXVvdDsmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDttYW5pZmVzdAorZmlsZT0mcXVvdDske2NsYXNzZXN9L01FVEEtSU5GL01BTklGRVNULk1GJnF1b3Q7Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoCA8L3NwYW4+Jmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O01haW4tQ2xhc3MmcXVvdDsKK3ZhbHVlPSZxdW90OyR7cGFja2FnZX0uTWFpbiZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7L21hbmlmZXN0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvdGFyZ2V0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3RhcmdldCBuYW1lPSZxdW90O2Rpc3QmcXVvdDsgZGVwZW5kcz0mcXVvdDtjb21waWxlLCBtYW5pZmVzdCZxdW90OyA8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT5kZXNjcmlwdGlvbjwvc3Bhbj49JnF1b3Q7Z2VuZXJhdGUgZm9yCitkaXN0cmlidXRpb24mcXVvdDsmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgCis8L3NwYW4+Jmx0O2phciA8c3BhbiBjbGFzcz1TcGVsbEU+amFyZmlsZTwvc3Bhbj49JnF1b3Q7JHtkaXN0fS9saWIvJHs8c3BhbgorY2xhc3M9U3BlbGxFPnByb2plY3QubmFtZTwvc3Bhbj59LmphciZxdW90OyA8c3BhbiBjbGFzcz1TcGVsbEU+YmFzZWRpcjwvc3Bhbj49JnF1b3Q7JHtjbGFzc2VzfSZxdW90OworPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKAKKzwvc3Bhbj48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgPC9zcGFuPjwvc3Bhbj48c3BhbiBsYW5nPUlUCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDttc28tYW5zaS1sYW5ndWFnZTpJVDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZToKK25vbmUnPm1hbmlmZXN0PSZxdW90OyR7Y2xhc3Nlc30vTUVUQS1JTkYvTUFOSUZFU1QuTUYmcXVvdDsvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1JVCBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpJVCc+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjwvc3Bhbj48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O21zby1hbnNpLWxhbmd1YWdlOkVOLUdCOwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Jmx0Oy90YXJnZXQmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7ZG9jJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O2dlbmVyYXRlCitkb2N1bWVudGF0aW9uJnF1b3Q7Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoAorPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz1TcGVsbEU+amF2YWRvYzwvc3Bhbj4gPHNwYW4gY2xhc3M9U3BlbGxFPmRlc3RkaXI8L3NwYW4+PSZxdW90OyR7ZG9jfSZxdW90OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoKAgPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPmF1dGhvcjwvc3Bhbj49JnF1b3Q7dHJ1ZSZxdW90OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoKAgPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPnZlcnNpb248L3NwYW4+PSZxdW90O3RydWUmcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT51c2U8L3NwYW4+PSZxdW90O3RydWUmcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoDwvc3Bhbj48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4gY2xhc3M9R3JhbUU+d2luZG93dGl0bGU8L3NwYW4+PC9zcGFuPj0mcXVvdDskezxzcGFuCitjbGFzcz1TcGVsbEU+cHJvamVjdC5uYW1lPC9zcGFuPn0mcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4KK2NsYXNzPUdyYW1FPnNvdXJjZWZpbGVzPC9zcGFuPjwvc3Bhbj49JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPn0vJHtwYWNrYWdlfS8qLmphdmEmcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKCgIDwvc3Bhbj5Qcm90ZWN0ZWQ9JnF1b3Q7QWxsJnF1b3Q7CitQcml2YXRlPSZxdW90O0FsbCZxdW90OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoKAgPC9zcGFuPlB1YmxpYz0mcXVvdDtBbGwmcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4KK2NsYXNzPUdyYW1FPmxpbmtzb3VyY2U8L3NwYW4+PC9zcGFuPj0mcXVvdDt5ZXMmcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4KK2NsYXNzPUdyYW1FPmJyZWFraXRlcmF0b3I8L3NwYW4+PC9zcGFuPj0mcXVvdDtZZXMmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7L3RhcmdldCZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6gPC9zcGFuPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goAorPC9zcGFuPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtjbGVhbiZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtjbGVhbiB1cCZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKAKKzwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9R3JhbUU+ZGVsZXRlPC9zcGFuPiZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgIDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPmZpbGVzZXQ8L3NwYW4+CitkaXI9JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPn0mcXVvdDsgPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgoKCgoCA8L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+aW5jbHVkZXM8L3NwYW4+PSZxdW90OyoqLyouY2xhc3MsKiovKi50b2tlbnMsKiovKi5nKiZxdW90OworLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgIDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPmZpbGVzZXQ8L3NwYW4+CitkaXI9JnF1b3Q7JHtjbGFzc2VzfSZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKAgPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz1TcGVsbEU+ZmlsZXNldDwvc3Bhbj4KK2Rpcj0mcXVvdDske2Rpc3R9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamFyJnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKAKKzwvc3Bhbj48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPmZpbGVzZXQ8L3NwYW4+CitkaXI9JnF1b3Q7JHtkb2N9JnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgCis8L3NwYW4+Jmx0Oy9kZWxldGUmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0Oy90YXJnZXQmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3RhcmdldCBuYW1lPSZxdW90O2FsbCZxdW90OyBkZXBlbmRzPSZxdW90O2NsZWFuLCBkaXN0LCBkb2MmcXVvdDsKK2Rlc2NyaXB0aW9uPSZxdW90O2NsZWFuIHVwJnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKAgPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1GUiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpGUic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Jmx0Oy9wcm9qZWN0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1GUiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpGUic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+VGhlIHNhbWUgYnVpbGQgZmlsZSBhc3N1bWluZworYW50bHItMy4xLmphciwgc3RyaW5ndGVtcGxhdGUtMy4yLmphciBhbmQgYW50bHItMi43LjcuamFyIGFyZSBwYXJ0IG9mIHRoZSBqYXZhIDxzcGFuCitjbGFzcz1TcGVsbEU+Y2xhc3NwYXRoPC9zcGFuPi4gSGF2ZSBhIGxvb2sgYXQgdGhlIDxzcGFuIGNsYXNzPVNwZWxsRT5hbnRscjwvc3Bhbj4KK2FuZCBjb21waWxlIHRhcmdldHMgd2hpY2ggZG9uknQgcmVmZXJlbmNlIDxzcGFuIGNsYXNzPVNwZWxsRT5hbnRsci5wYXRoPC9zcGFuPgorYW55IG1vcmUuPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6Citub25lJz48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Jmx0O3Byb2plY3QgbmFtZT0mcXVvdDtkMnUmcXVvdDsKK2RlZmF1bHQ9JnF1b3Q7ZGlzdCZxdW90OyA8c3BhbiBjbGFzcz1TcGVsbEU+YmFzZWRpcjwvc3Bhbj49JnF1b3Q7LiZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9R3JhbUU+ZGVzY3JpcHRpb248L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj5Nb3JlIHRoYW4gYSBET1MgdG8gVU5JWCBjb252ZXJzaW9uIG9mCitsaW5lIGVuZHMuPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0Oy9kZXNjcmlwdGlvbiZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+cHJvamVjdC5uYW1lPC9zcGFuPiZxdW90OwordmFsdWU9JnF1b3Q7ZDJ1JnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+Jmx0OyEtLTwvc3Bhbj4gcHJvZ3JhbSB2ZXJzaW9uIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3ZlcnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7MS4wMCZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPiZsdDshLS08L3NwYW4+IHNldCBnbG9iYWwgcHJvcGVydGllcyBmb3IgdGhpcyBidWlsZAorLS0mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7YnVpbGQmcXVvdDsgbG9jYXRpb249JnF1b3Q7LiZxdW90Oy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7PHNwYW4gY2xhc3M9U3BlbGxFPnNyYzwvc3Bhbj4mcXVvdDsKK2xvY2F0aW9uPSZxdW90OzxzcGFuIGNsYXNzPVNwZWxsRT5zcmM8L3NwYW4+JnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtjbGFzc2VzJnF1b3Q7IGxvY2F0aW9uPSZxdW90O2NsYXNzZXMmcXVvdDsvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2Rpc3QmcXVvdDsgbG9jYXRpb249JnF1b3Q7ZGlzdCZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2RvYyZxdW90OyBsb2NhdGlvbj0mcXVvdDtkb2NzLzxzcGFuCitjbGFzcz1TcGVsbEU+YXBpPC9zcGFuPiZxdW90Oy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7Z3JhbW1hciZxdW90OyBsb2NhdGlvbj0mcXVvdDtncmFtbWFyJnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3BhY2thZ2UmcXVvdDsgdmFsdWU9JnF1b3Q7b3JnLzxzcGFuCitjbGFzcz1TcGVsbEU+bXlvcmc8L3NwYW4+LyR7PHNwYW4gY2xhc3M9U3BlbGxFPnByb2plY3QubmFtZTwvc3Bhbj59JnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiB3aGVyZSB0byB3cml0ZS9maW5kIHRva2VuIGZpbGVzIC0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90OzxzcGFuIGNsYXNzPVNwZWxsRT50b2tlbi5saWI8L3NwYW4+JnF1b3Q7Citsb2NhdGlvbj0mcXVvdDskezxzcGFuIGNsYXNzPVNwZWxsRT5zcmM8L3NwYW4+fS8ke3BhY2thZ2V9JnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiA8c3BhbiBjbGFzcz1TcGVsbEU+YW50bHI8L3NwYW4+IG9wdGlvbnMKKy0tJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3Byb2ZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsgLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtyZXBvcnQmcXVvdDsgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6gPC9zcGFuPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O211bHRpdGhyZWFkZWQmcXVvdDsgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90OyAvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2RlcGVuZCZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuIHN0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKAKKzwvc3Bhbj4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7aW5pdCZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+PHNwYW4gY2xhc3M9R3JhbUU+Jmx0OyEtLTwvc3Bhbj4gQ3JlYXRlCit0aGUgdGltZSBzdGFtcCAtLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPVNwZWxsRT50c3RhbXA8L3NwYW4+CisvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPiBDcmVhdGUKK3RoZSBidWlsZCBkaXJlY3Rvcnkgc3RydWN0dXJlIHVzZWQgYnkgY29tcGlsZSAtLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9REUgc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cittc28tYW5zaS1sYW5ndWFnZTpERTt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7PHNwYW4KK2NsYXNzPVNwZWxsRT5ta2Rpcjwvc3Bhbj4gZGlyPSZxdW90OyR7PHNwYW4gY2xhc3M9U3BlbGxFPmdyYW1tYXI8L3NwYW4+fSZxdW90OworLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz48YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPm1rZGlyPC9zcGFuPgorZGlyPSZxdW90OyR7PHNwYW4gY2xhc3M9U3BlbGxFPnNyYzwvc3Bhbj59LyR7PHNwYW4gY2xhc3M9U3BlbGxFPnBhY2thZ2U8L3NwYW4+fSZxdW90OworLyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz48YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7PHNwYW4gY2xhc3M9U3BlbGxFPm1rZGlyPC9zcGFuPgorZGlyPSZxdW90OyR7PHNwYW4gY2xhc3M9U3BlbGxFPmNsYXNzZXM8L3NwYW4+fS8kezxzcGFuIGNsYXNzPVNwZWxsRT5wYWNrYWdlPC9zcGFuPn0mcXVvdDsKKy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6MTIuMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+PGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9SVQgc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cittc28tYW5zaS1sYW5ndWFnZTpJVDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7bWtkaXIKK2Rpcj0mcXVvdDske2NsYXNzZXN9L01FVEEtSU5GJnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUlUIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOklUJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDtta2RpciBkaXI9JnF1b3Q7JHtkaXN0fS9saWImcXVvdDsKKy8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUlUIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOklUJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDtta2RpcgorZGlyPSZxdW90OyR7ZG9jfS8ke3BhY2thZ2V9JnF1b3Q7IC8mZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUlUIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOklUJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+PC9zcGFuPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0I7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7L3RhcmdldCZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bHI8L3NwYW4+JnF1b3Q7CitkZXBlbmRzPSZxdW90O2luaXQmcXVvdDsgZGVzY3JpcHRpb249JnF1b3Q7cnVuIDxzcGFuIGNsYXNzPVNwZWxsRT5hbnRscjwvc3Bhbj4KK29uIGdyYW1tYXImcXVvdDsmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKAgPC9zcGFuPiZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7PHNwYW4KK2NsYXNzPVNwZWxsRT5hbnRscjwvc3Bhbj4gJHtncmFtbWFyfS8kezxzcGFuIGNsYXNzPVNwZWxsRT5wcm9qZWN0Lm5hbWU8L3NwYW4+fS5nJnF1b3Q7CisvJmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj4mbHQ7YW50bHI8c3BhbiBjbGFzcz1HcmFtRT46YW50bHIzPC9zcGFuPgorPHNwYW4gY2xhc3M9U3BlbGxFPnhtbG5zOmFudGxyPC9zcGFuPj0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bGliOm9yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxyPC9zcGFuPiZxdW90OworPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT50YXJnZXQ8L3NwYW4+PSZxdW90OyR7Z3JhbW1hcn0vJHs8c3BhbgorY2xhc3M9U3BlbGxFPnByb2plY3QubmFtZTwvc3Bhbj59LmcmcXVvdDsgPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1TcGVsbEU+PHNwYW4KK2NsYXNzPUdyYW1FPm91dHB1dGRpcmVjdG9yeTwvc3Bhbj48L3NwYW4+PSZxdW90OyR7PHNwYW4gY2xhc3M9U3BlbGxFPnNyYzwvc3Bhbj59LyR7cGFja2FnZX0mcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKAgPC9zcGFuPjxzcGFuIGNsYXNzPVNwZWxsRT48c3BhbgorY2xhc3M9R3JhbUU+bGliZGlyZWN0b3J5PC9zcGFuPjwvc3Bhbj49JnF1b3Q7JHs8c3BhbiBjbGFzcz1TcGVsbEU+dG9rZW4ubGliPC9zcGFuPn0mcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKAgPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPm11bHRpdGhyZWFkZWQ8L3NwYW4+PSZxdW90OyR7bXVsdGl0aHJlYWRlZH0mcXVvdDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKCgoKAgPC9zcGFuPjxzcGFuIGNsYXNzPUdyYW1FPnJlcG9ydDwvc3Bhbj49JnF1b3Q7JHtyZXBvcnR9JnF1b3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT5wcm9maWxlPC9zcGFuPj0mcXVvdDske3Byb2ZpbGV9JnF1b3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoKCgoKCgoKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT5kZXBlbmQ8L3NwYW4+PSZxdW90OyR7ZGVwZW5kfSZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0Oy9hbnRscjxzcGFuIGNsYXNzPUdyYW1FPjphbnRscjM8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvdGFyZ2V0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz48c3BhbiBzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgCis8L3NwYW4+Jmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbXBpbGUmcXVvdDsgZGVwZW5kcz0mcXVvdDs8c3BhbiBjbGFzcz1TcGVsbEU+YW50bHI8L3NwYW4+JnF1b3Q7CitkZXNjcmlwdGlvbj0mcXVvdDtjb21waWxlJnF1b3Q7Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgIDwvc3Bhbj48c3BhbiBjbGFzcz1HcmFtRT4mbHQ7IS0tPC9zcGFuPgorQ29tcGlsZSB0aGUgamF2YSBjb2RlIGZyb20gJHs8c3BhbiBjbGFzcz1TcGVsbEU+c3JjPC9zcGFuPn0gaW50byAke2NsYXNzZXN9CistLSZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0OzxzcGFuIGNsYXNzPVNwZWxsRT5qYXZhYzwvc3Bhbj4KK2RlYnVnPSZxdW90O3RydWUmcXVvdDsgPHNwYW4gY2xhc3M9U3BlbGxFPnNyY2Rpcjwvc3Bhbj49JnF1b3Q7JHs8c3BhbgorY2xhc3M9U3BlbGxFPnNyYzwvc3Bhbj59JnF1b3Q7IDxzcGFuIGNsYXNzPVNwZWxsRT5kZXN0ZGlyPC9zcGFuPj0mcXVvdDske2NsYXNzZXN9JnF1b3Q7PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKAgPC9zcGFuPjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoKCgoCA8L3NwYW4+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuCitjbGFzcz1HcmFtRT5saXN0ZmlsZXM8L3NwYW4+PC9zcGFuPj0mcXVvdDtZZXMmcXVvdDsKK2RlcHJlY2F0aW9uPSZxdW90O1llcyZxdW90OyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoKCgoKAgPC9zcGFuPiZsdDs8c3BhbiBjbGFzcz1TcGVsbEU+Y29tcGlsZXJhcmc8L3NwYW4+Cit2YWx1ZT0mcXVvdDstPHNwYW4gY2xhc3M9U3BlbGxFPlhsaW50PHNwYW4gY2xhc3M9R3JhbUU+OnVuY2hlY2tlZDwvc3Bhbj48L3NwYW4+JnF1b3Q7LyZndDs8bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOgorMTIuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0InPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPjxzcGFuCitzdHlsZT0nbXNvLXNwYWNlcnVuOnllcyc+oKCgoKCgoCA8L3NwYW4+Jmx0Oy88c3BhbiBjbGFzcz1TcGVsbEU+amF2YWM8L3NwYW4+Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4gc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqCgoAorPC9zcGFuPiZsdDsvdGFyZ2V0Jmd0OzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+LjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+LjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+LjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6CisxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PHNwYW4KK3N0eWxlPSdtc28tc3BhY2VydW46eWVzJz6goKCgoKCgoKCgoCA8L3NwYW4+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToKKzEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO21zby1hbnNpLWxhbmd1YWdlOkVOLUdCJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4mbHQ7L3Byb2plY3QmZ3Q7PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxoMz48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+SG93IGRvZXMgdGhlIGFudCB0YXNrIGZvciBBbnRscjMKK2ZpbmRzIHRoZSBBbnRscjMgbGlicmFyaWVzPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDttc28tYmlkaS1mb250LXNpemU6MTMuNXB0OworbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0I7Zm9udC13ZWlnaHQ6bm9ybWFsJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz5UaGUgYW50IHRhc2sgZm9yIEFudGxyMyBpbnNwZWN0cyB0aGUKK2Vudmlyb25tZW50IHZhcmlhYmxlIEFOVExSX0hPTUUuIEl0IGxvb2tzIGluIHRoZSBBTlRMUl9IT01FL2xpYiBkaXJlY3RvcnkgYW5kCithZGRzIHRoZSBsaWJyYXJpZXMgd2hpY2ggZml0IHRoZSBwYXR0ZXJucyCTPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPi0qLmphcpQKK2FuZCCTPHNwYW4gY2xhc3M9U3BlbGxFPnN0cmluZ3RlbXBsYXRlPC9zcGFuPi0qLmphcpQgdG8gdGhlIDxzcGFuIGNsYXNzPVNwZWxsRT5jbGFzc3BhdGg8L3NwYW4+Ljxicj4KK1RoZW4gaXQgPHNwYW4gY2xhc3M9U3BlbGxFPmNoZWNrZXM8L3NwYW4+IGlmIDxzcGFuIGNsYXNzPVNwZWxsRT5BTlRMUkdyYW1tYXJQYXJzZUJlaGF2aW9yLmNsYXNzPC9zcGFuPiwKKzxzcGFuIGNsYXNzPVNwZWxsRT5BTlRMUlBhcnNlci5jbGFzczwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPVNwZWxsRT5TdHJpbmdUZW1wbGF0ZS5jbGFzczwvc3Bhbj4KK2NhbiBiZSByZXNvbHZlZCB2aWEgdGhlIDxzcGFuIGNsYXNzPVNwZWxsRT5jbGFzc3BhdGg8L3NwYW4+LjxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9oMz4KKworPGgzPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEzLjVwdDsKK21zby1hbnNpLWxhbmd1YWdlOkVOLUdCO2ZvbnQtd2VpZ2h0Om5vcm1hbCc+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+V2FybmluZzogSWYgdGhlIEFubHRyMyBsaWJyYXJpZXMgaGF2ZQorYWxyZWFkeSBiZWVuIGxpc3RlZCBpbiB0aGUgPHNwYW4gY2xhc3M9U3BlbGxFPmNsYXNzcGF0aDwvc3Bhbj4gbWFrZSBzdXJlIHRoZXkKK3BvaW50IHRvIHRoZSBzYW1lIHZlcnNpb24gQU5UTFJfSE9NRSByZWZlcnMgdG8sIGVsc2UgeW91IG1pZ2h0IGdldCB1bmV4cGVjdGVkCityZXN1bHRzLjxicj4KK0VpdGhlciB1c2UgQU5UTFJfSE9NRSB0byByZXNvbHZlIHRoZSBBTlRMUjMgbGlicmFyaWVzIG9yIGFkZCB0aGVtIHRvIHRoZQorQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgZG8gbm90IHVzZSBib3RoIHdheXMgYXQgdGhlIHNhbWUgdGltZS48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvaDM+CisKKzxoMz48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1HQic+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+VHJvdWJsZS1TaG9vdGluZzxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9oMz4KKworPGgzPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEzLjVwdDsKK21zby1hbnNpLWxhbmd1YWdlOkVOLUdCO2ZvbnQtd2VpZ2h0Om5vcm1hbCc+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OwordGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+Rmlyc3QgY2hlY2sgaWYgdGhlIGFudGxyMy5qYXIgY2FuIGJlCityZXNvbHZlZCBieSBhbnQuIFRoZSBjb21tYW5kPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6MTIuMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQjtmb250LXdlaWdodDpub3JtYWwnPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBjbGFzcz1HcmFtRT48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+YW50PC9zcGFuPjwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+IJZkaWFnbm9zdGljczxvOnA+PC9vOnA+PC9zcGFuPjwvYT48L3NwYW4+PC9oMz4KKworPGgzPjxzcGFuIGxhbmc9RU4tR0Igc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEzLjVwdDsKK21zby1hbnNpLWxhbmd1YWdlOkVOLUdCO2ZvbnQtd2VpZ2h0Om5vcm1hbCc+PGEKK2hyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNhcmciPjxzcGFuIGNsYXNzPUdyYW1FPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz5zaG91bGQ8L3NwYW4+PC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz4gbGlzdAorYW50bHIzLmphciBpbiB0aGUgk0FOVF9IT01FL2xpYiBqYXIgbGlzdGluZ5Qgc2VjdGlvbiwgaWY8c3Bhbgorc3R5bGU9J21zby1zcGFjZXJ1bjp5ZXMnPqAgPC9zcGFuPnRoZSBpbnN0YWxsYXRpb24gcmVjb21tZW5kYXRpb24gaGFkIGJlZW4KK2FkaGVyZWQgdG8uPG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDttc28tYmlkaS1mb250LXNpemU6MTMuNXB0OworbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0I7Zm9udC13ZWlnaHQ6bm9ybWFsJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz5TZWNvbmQgdHJ5IHRoZSBhbnQgdmVyYm9zZSBvcHRpb24KK5MtdpQ6PC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6CisiQ291cmllciBOZXciO2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDttc28tYmlkaS1mb250LXNpemU6MTIuMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijttc28tYW5zaS1sYW5ndWFnZTpFTi1HQjtmb250LXdlaWdodDpub3JtYWwnPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBjbGFzcz1HcmFtRT48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+YW50PC9zcGFuPjwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+IJZ2PG86cD48L286cD48L3NwYW4+PC9hPjwvc3Bhbj48L2gzPgorCis8aDM+PHNwYW4gbGFuZz1FTi1HQiBzdHlsZT0nZm9udC1zaXplOjEyLjBwdDttc28tYmlkaS1mb250LXNpemU6MTMuNXB0OworbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tR0I7Zm9udC13ZWlnaHQ6bm9ybWFsJz48YQoraHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI2FyZyI+PHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz5UaGlzIHdpbGwgb3V0cHV0IHNvbWUgaW5mb3JtYXRpb24gb2YKK3RoZSBpbnRlcm5hbCA8c3BhbiBjbGFzcz1TcGVsbEU+cHJvY2Vzc2luZ3M8L3NwYW4+IG9mIHRoZSBBTlRMUjMgdGFzay48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvaDM+CisKKzxoMz48c3BhbiBsYW5nPUVOLUdCIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMy41cHQ7Cittc28tYW5zaS1sYW5ndWFnZTpFTi1HQjtmb250LXdlaWdodDpub3JtYWwnPjxhCitocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3VzaW5nLmh0bWwjYXJnIj48c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdW5kZXJsaW5lOm5vbmUnPlRoaXJkIG1ha2Ugc3VyZSB0aGF0IHRoZSBqYXItYXJjaGl2ZXMKK29mIHRoZSBhY3R1YWwgPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPiBkaXN0cmlidXRpb24gYXJlIGNvbnRhaW5lZCBpbgoreW91ciA8c3BhbiBjbGFzcz1TcGVsbEU+Y2xhc3NwYXRoPC9zcGFuPi4gQXQgdGhlIG1vbWVudCB0aGlzIHdvdWxkIHJlZmVyIHRvCithbnRsci0zLnguamFyLCBhbnRsci0yLjcuNy5qYXIgYW5kIHN0cmluZ3RlbXBsYXRlLTMueC5qYXIuIEFzIGEgY29uc2VxdWVuY2UgdGhlCitkZWZpbml0aW9uIG9mIHRoZSA8L3NwYW4+PHNwYW4gY2xhc3M9U3BlbGxFPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworbXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOndpbmRvd3RleHQ7Cit0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXVuZGVybGluZTpub25lJz5hbnRsci5wYXRoPC9zcGFuPjwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC11bmRlcmxpbmU6bm9uZSc+IDxzcGFuCitjbGFzcz1HcmFtRT5wcm9wZXJ0eSAsPC9zcGFuPiBhcyBzaG93biBpbiB0aGUgZXhhbXBsZSwgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGUKK2J1aWxkIGZpbGUgaGFzIG5vIGRlcGVuZGVuY3kgb24gdGhlIDxzcGFuIGNsYXNzPVNwZWxsRT5hbnRscjwvc3Bhbj4gdmVyc2lvbi4KK1RoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHVwZGF0ZXMgb2YgPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPgorYW5kIHBvc3NpYmx5IGxpbmtlZCBjaGFuZ2VzIGluIHRoZSBuYW1pbmcgb2YgdGhlIGJlZm9yZSBtZW50aW9uZWQgPHNwYW4KK2NsYXNzPVNwZWxsRT5hbnRscjwvc3Bhbj4gamFyLWFyY2hpdmVzIHJlc3VsdCBpbiBubyBjaGFuZ2VzIG9mIGV4aXN0aW5nIGFudAorYnVpbGQtZmlsZXMuIFNvbGVseSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSA8c3BhbiBjbGFzcz1TcGVsbEU+Y2xhc3NwYXRoPC9zcGFuPgordmFyaWFibGUgZW5hYmxlcyB5b3UgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgPHNwYW4gY2xhc3M9U3BlbGxFPmFudGxyPC9zcGFuPi48bzpwPjwvbzpwPjwvc3Bhbj48L2E+PC9zcGFuPjwvaDM+CisKKzwvZGl2PgorCis8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMuamFyIGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2FudGxyMy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyNTY2NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9hbnRscjMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9jb21wb3NpdGUtamF2YV9idWlsZC56aXAgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svY29tcG9zaXRlLWphdmFfYnVpbGQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZGNiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svY29tcG9zaXRlLWphdmFfYnVpbGQuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9jb21wb3NpdGUtbmV0YmVhbnMuemlwIGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2NvbXBvc2l0ZS1uZXRiZWFucy56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4NDZmYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9jb21wb3NpdGUtbmV0YmVhbnMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9kMnUuemlwIGIvYW50bHItMy40L2FudGxyLWFudC9tYWluL2FudGxyMy10YXNrL2QydS56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNWM2YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9kMnUuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9wb2x5ZGlmZi1uZXRiZWFucy56aXAgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svcG9seWRpZmYtbmV0YmVhbnMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzIzODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svcG9seWRpZmYtbmV0YmVhbnMuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9wb2x5ZGlmZl9idWlsZC56aXAgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svcG9seWRpZmZfYnVpbGQuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTg2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svcG9seWRpZmZfYnVpbGQuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci1hbnQvbWFpbi9hbnRscjMtdGFzay9zaW1wbGVjVHJlZVBhcnNlci56aXAgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svc2ltcGxlY1RyZWVQYXJzZXIuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWI5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHItYW50L21haW4vYW50bHIzLXRhc2svc2ltcGxlY1RyZWVQYXJzZXIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRsci5jb25maWcgYi9hbnRsci0zLjQvYW50bHIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWM1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHIuY29uZmlnCkBAIC0wLDAgKzEgQEAKK2ZyZWQ9OTkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL2FudGxyLmNvbmZpZyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL2FudGxyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvYW50bHIuY29uZmlnCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9wb20ueG1sIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUzNDljCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvcG9tLnhtbApAQCAtMCwwICsxLDEzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CisKKyAgICAKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFudGxyMy1tYXZlbi1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+My40PC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+bWF2ZW4tYXJjaGV0eXBlPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+QU5UTFIzIE1hdmVuIEFyY2hldHlwZSAzLjQ8L25hbWU+CisgICAgCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKyAgICAKKyAgICA8IS0tCisKKyAgICBJbmhlcml0IGZyb20gdGhlIEFOVExSIG1hc3RlciBwb20sIHdoaWNoIHRlbGxzIHVzIHdoYXQKKyAgICB2ZXJzaW9uIHdlIGFyZSBhbmQgYWxsb3dzIHVzIHRvIGluaGVyaXQgZGVwZW5kZW5jaWVzCisgICAgYW5kIHNvIG9uLgorCisgICAgVW5mb3J0dW5hdGVseSwgYmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgYXJjaGV0eXBlIHBsdWdpbgorICAgIHdlIGNhbm5vdCB1c2UgdGhlIHBhcmVudCBwb20gYmVjYXVzZSBpdCBjYXVzZXMgdGhlCisgICAgYXJ0aWZhY3RJZCBpbiB0aGUgZ2VuZXJhdGVkIHBvbSB0byBiZSBzZXQgdG8gYW50bHIzLW1hdmVuLWFyY2hldHlwZQorICAgIFdlIHdpbGwgcmVpbnN0YXRlIHRoaXMgcGFyZW50IHVzYWdlIHdoZW4gdGhhdCBpcyBmaXhlZC4KKyAgICAKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFudGxyLW1hc3RlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My40PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIC0tPgorICAgIDwhLS0KKyAgICAgICAgVGhlIEFOVExSIE1hdmVuIGFydGlmYWN0cyBhcmUgbm93IHJlbGVhc2VkIHZpYSB0aGUgU29ub3R5cGUgT1NTCisgICAgICAgIHJlcG9zaXRvcnksIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBhcmUgc3luY2VkIHRvIE1hdmVuIGNlbnRyYWwgCisgICAgICAgIHdpdGhpbiBhIGZldyBtaW51dGVzIG9mIGhpdHRpbmcgdGhlIHJlbGVhc2UgcmVwbyBmb3IgU29ub3R5cGUuCisgICAgICAgIFRvIGVuYWJsZSB0aGlzLCB3ZSBpbmhlcml0IGZyb20gdGhlIFNvbm90eXBlIHByb3ZpZGVkIHBhcmVudAorICAgICAgICBwb20uIEhvd2V2ZXIsIHdlIG11c3QgYWxzbyBjb25maWd1cmUgb3VyIC5tMi9zZXR0aW5ncy54bWwgdG8gaW5jbHVkZQorICAgICAgICB0aGUgc25hcHNob3QgYW5kIHN0YWdpbmcgc2VydmVyIGFuZCB0aGUgc29ub3R5cGUgcGFzc3dvcmQuIFRoaXMgCisgICAgICAgIG1lYW5zIHRoYXQgb25seSBBTlRMUiBkZXZlbG9wZXJzIGNhbiByZWxlYXNlZCB0aGUgYXJ0aWZhY3RzLCBidXQKKyAgICAgICAgYW55b25lIGNhbiBidWlsZCBsb2NhbGx5LgorICAgICAgLS0+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLm9zczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3NzLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NzwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4gCisgICAgCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlLXNpZ24tYXJ0aWZhY3RzPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGVwbG95PC9uYW1lPgorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICAKKyAgPGJ1aWxkPgorCisgICAgPGV4dGVuc2lvbnM+CisKKyAgICAgIDxleHRlbnNpb24+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uYXJjaGV0eXBlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hcmNoZXR5cGUtcGFja2FnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICA8L2V4dGVuc2lvbj4KKworICAgIDwvZXh0ZW5zaW9ucz4KKworICAgICAgICA8cGx1Z2lucz4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoZXR5cGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCQkJCisgICAgICAgICAgICA8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjg8L3ZlcnNpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5qYXI8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKyAgICAgICAgICAgIAorICAgICAgICA8L3BsdWdpbnM+CisKKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM2ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YXJjaGV0eXBlLWRlc2NyaXB0b3IgbmFtZT0iYW50bHIzLW1hdmVuLWFyY2hldHlwZSI+CisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiIGVuY29kaW5nPSJVVEYtOCI+CisgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KiovKi5qYXZhPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIiBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9hbnRscjM8L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KiovKi5nPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICA8ZXhjbHVkZT4qKi9pbXBvcnRzLyouKjwvZXhjbHVkZT4KKyAgICAgIDwvZXhjbHVkZXM+CisgICAgPC9maWxlU2V0PgorICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9hbnRscjMvaW1wb3J0czwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qLmc8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKzwvYXJjaGV0eXBlLWRlc2NyaXB0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS54bWwgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZjN2RmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxhcmNoZXR5cGU+CisgIDxpZD5hbnRscjMtbWF2ZW4tYXJjaGV0eXBlPC9pZD4KKyAgPHNvdXJjZXM+CisgICAgPHNvdXJjZT5zcmNcbWFpblxqYXZhXG9yZ1xhbnRsclxkZW1vXEFic3RyYWN0VExleGVyLmphdmE8L3NvdXJjZT4KKyAgICA8c291cmNlPnNyY1xtYWluXGphdmFcb3JnXGFudGxyXGRlbW9cQWJzdHJhY3RUUGFyc2VyLmphdmE8L3NvdXJjZT4KKyAgICA8c291cmNlPnNyY1xtYWluXGphdmFcb3JnXGFudGxyXGRlbW9cTWFpbi5qYXZhPC9zb3VyY2U+CisgIDwvc291cmNlcz4KKyAgPHJlc291cmNlcz4KKyAgICA8cmVzb3VyY2U+c3JjXG1haW5cYW50bHIzXGltcG9ydHNcUnVsZWIuZzwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlPnNyY1xtYWluXGFudGxyM1xUTGV4ZXIuZzwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlPnNyY1xtYWluXGFudGxyM1xUUGFyc2VyLmc8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZT5zcmNcbWFpblxhbnRscjNcVFRyZWUuZzwvcmVzb3VyY2U+CisgIDwvcmVzb3VyY2VzPgorPC9hcmNoZXR5cGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkYjExNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTAsMCArMSwxODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICBBIHF1aWNrc3RhcnQgcG9tLnhtbCB0aGF0IGNyZWF0ZXMgYSBzYW1wbGUgcHJvamVjdCB0aGF0IHVzZXMgQU5UTFIgMy54CisgICAgICAgICBncmFtbWFycy4gWW91IHNob3VsZCByZXBsYWNlIHRoZSBzYW1wbGUgZ3JhbW1hcnMgaW4gc3JjL21haW4vYW50bHIzCisgICAgICAgICB3aXRoIHlvdXIgb3duIGdyYW1tYXIgZmlsZXMgYW5kIHVzZSBwYWNrYWdlcy4KKworICAgICAgICAgQSAuZyBmaWxlIGluCisgICAgICAgICAgCisgICAgICAgICAgICBzcmMvbWFpbi9hbnRscjMvY29tL3RlbXBvcmFsd2F2ZQorCisgICAgICAgICAgYmVsb25ncyBpbiB0aGUgcGFja2FnZQorICAgICAgICAgIAorICAgICAgICAgICAgY29tLnRlbXBvcmFsd2F2ZQorCisgICAgICAgICBTZWUgaHR0cDovL2FudGxyLm9yZy9hbnRscjMtbWF2ZW4tcGx1Z2luIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICAgICAgIFRoaXMgcHJvamVjdCBwcm9kdWNlcyBib3RoIGEgamFyIGZpbGUgb2YgdGhlIHByb2plY3QgYW5kIGFuIGV4ZWN1dGVhYmxlCisgICAgICAgICBqYXIgZmlsZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZGVwZW5kZW5jaWVzIHNvIHlvdSBjYW4gcnVuIGl0IHN0YW5kYWxvbmUuCisgICAgICAgICBTZWUgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAgIAorICAgICAgICAgQXJjaGV0eXBlIGJ5IEppbSBJZGxlIChqaW1pQHRlbXBvcmFsLXdhdmUuY29tKSAtIE9jdCAyMDA5CisgICAgICAgICBSZXBvcnQgYnVncyB0byB0aGUgQU5UTFIgaW50ZXJlc3QgbGlzdCBhdCBodHRwOi8vd3d3LmFudGxyLm9yZworCisgICAgICAgICBHZW5lcmF0ZWQgYnkgYW50bHIzLW1hdmVuLWFyY2hldHlwZSB2ZXJzaW9uIDMuNAorICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIC0tPgorCisgICAgPCEtLSBUaGlzIGlzIHlvdXIgb3JnYW5pemF0aW9ucyBub3JtYWwgZ3JvdXAgbmFtZQorICAgICAgICAgc3VjaCBhcyBvcmcuYW50bHIKKyAgICAgICAgIEFsbCB0aGUgYXJ0aWZhY3RzIHlvdSBjcmVhdGUgd2lsbCBiZSB1bmRlciB0aGlzCisgICAgICAgICBncm91cCBpZC4KKyAgICAgIC0tPgorICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisKKyAgICA8IS0tIFRoaXMgaXMgaG93IG1hdmVuIGtub3dzIHlvdXIgYXJ0aWZhY3QKKyAgICAgIC0tPgorICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisKKyAgICA8IS0tIFRoaXMgaXMgdGhlIGh1bWFuIG9yaWVudGVkIG5hbWUgZm9yIHRoZSBwYWNrYWdlCisgICAgICAgICBzbyB5b3UgY2FuIGNhbGwgaXQgYW55dGhpbmcgeW91IGxpa2UKKyAgICAgIC0tPgorICAgIDxuYW1lPkFOVExSMyBwcm9qZWN0OiAke3BhY2thZ2V9PC9uYW1lPgorCisgICAgPCEtLSBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIFlPVVIgcHJvamVjdCAtLT4KKyAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorCisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8dXJsPmh0dHA6Ly9hbnRsci5vcmc8L3VybD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPCEtLQorICAgICAgICAgIFdlIG5lZWQgdG8gaGF2ZSB0aGUgQU5UTFIgcnVudGltZSBqYXIgd2hlbiBydW5uaW5nIGFuZCBjb21waWxpbmcuCisgICAgICAgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgIDwhLS0KKworICAgIFRlbGwgTWF2ZW4gd2hpY2ggb3RoZXIgYXJ0aWZhY3RzIHdlIG5lZWQgaW4gb3JkZXIgdG8KKyAgICBidWlsZCB3aXRoIHRoZSBBTlRMUiBUb29sLiBIZXJlIHdlIGFsc28gbWFrZSB0aGUgZGVmYXVsdAorICAgIGdvYWwgYmUgaW5zdGFsbCBzbyB0aGF0IHlvdSBjYW4ganVzdCB0eXBlIG12biBhdCB0aGUgY29tbWFuZAorICAgIGxpbmUgaW5zdGVhZCBvZiBtdm4gaW5zdGFsbC4gQW5kIHdlIGFkZCB0aGUgamF2YSBjb21waWxlciBwbHVnaW4KKyAgICBmb3IgY29udmVuaWVuY2UgdG8gc2hvdyBob3cgeW91IGNhbiB1c2UgMS42IHNvdXJjZSBmaWxlcyBidXQKKyAgICBnZW5lcmF0ZSAxLjQgY29tcGF0aWJsZSAuY2xhc3MgZmlsZXMgKGFzIGZldyBwZW9wbGUgc2VlbSB0bworICAgIGtub3cgYWJvdXQgdGhlIGpzcjE0IHRhcmdldCkuCisgICAgLS0+CisgICAgPGJ1aWxkPgorCisgICAgICAgIDxkZWZhdWx0R29hbD5pbnN0YWxsPC9kZWZhdWx0R29hbD4KKworICAgICAgICA8cGx1Z2lucz4KKworICAgICAgICAgICAgPHBsdWdpbj4KKworICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hbnRscjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKworICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgU3RyaWN0bHkgc3BlYWtpbmcsIHdlIGRpZCBub3QgbmVlZCB0byBnZW5lcmF0ZSB0aGlzIGZvciB5b3UgZnJvbQorICAgICAgICAgICAgICB0aGUgcHJvdG90eXBlLCBidXQgd2UgdXNlIGl0IHRvIGlsbHVzdHJhdGUgaG93IHlvdSBjYW4gZ2V0CisgICAgICAgICAgICAgIHRoZSBKREsgNiBKYXZhIGNvbXBpbGVyIHRvIGFjY2VwdCAxLjUgb3IgMS42IHRhcmdldGVkIHNvdXJjZSBjb2RlCisgICAgICAgICAgICAgIGJ1dCBwcm9kdWNlIGNsYXNzIGZpbGVzIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBKUkUgMS40LiBBcworICAgICAgICAgICAgICBNaWNoYWVsIENhaW5lIG1pZ2h0IG5vdCBzYXksICJOb3QgYSBsb3Qgb2YgcGVvcGxlIGtub3cgdGhhdCEiCisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+anNyMTQ8L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8IS0tCisKKyAgICAgICAgICAgICAgICAgICAgQnVpbGQgYW4gdWJlci1qYXIgdGhhdCBpcyBwYWNrYWdlZCB3aXRoIGFsbCB0aGUgb3RoZXIgZGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIHRoZSBhbnRsci1ydW50aW1lIGFuZCBzbyBvbi4gVGhpcyB3aWxsIGJlIHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICBmb3IgZGV2ZWxvcGVycywgd2hvIHRoZW4gZG8gbm90IG5lZWQgdG8gZG93bmxvYWQgYW55dGhpbmcgZWxzZSBvcgorICAgICAgICAgICAgICAgICAgICByZW1lbWJlciB0aGF0IHRoZXkgbmVlZCBhbnRsci5qYXIgaW4gdGhlaXIgQ0xBU1NQQVRIIGFuZCBzbworICAgICAgICAgICAgICAgICAgICBvbi4KKworICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGRlbGV0ZSB0aGlzIHBsdWdpbiBvZiBjb3Vyc2UgYW5kIHlvdSB3aWxsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZ2V0IGEgamFyIGZpbGUgd2l0aCBvbmx5IHRoZSBjb2RlIGdlbmVyYXRlZCBhbmQgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgaW4gdGhpcyBwcm9qZWN0LiBXaXRoIHRoaXMgcGx1Z2luIHRob3VnaCB5b3Ugd2lsbAorICAgICAgICAgICAgICAgICAgICBmaW5kIHRoYXQgd2hlbiB5b3UgYnVpbGQgd2l0aDoKKworICAgICAgICAgICAgICAgICAgICAgICBtdm4gaW5zdGFsbAorCisgICAgICAgICAgICAgICAgICAgIFRoZXJlIHdpbGwgYmUgYW4gZXhlY3V0YWJsZSBqYXIgZ2VuZXJhdGVkLiBZb3UgY2FuIHJ1biB0aGlzCisgICAgICAgICAgICAgICAgICAgIGFzOgorCisgICAgICAgICAgICAgICAgICAgICAgamF2YSAtamFyICR7YXJ0aWZhY3RJZH0tJHt2ZXJzaW9ufS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIGRlbW9zb3VyY2UuZG1vCisKKyAgICAgICAgICAgICAgICAgICAgYXNzdW1pbmcgeW91IGhhdmUgYSBmaWxlIGNhbGxlZCBkZW1vc291cmNlLmRtbyB0byBhdHRlbXB0IGEgcGFyc2UuCisKKyAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKworICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5qYXItd2l0aC1kZXBlbmRlbmNpZXM8L2Rlc2NyaXB0b3JSZWY+CisgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+CisgICAgICAgICAgICAgICAgICAgIDwhLS0KKworICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSB0aGF0IHdlIHdhbnQgdGhlIHJlc3VsdGluZyBqYXIgdG8gYmUgZXhlY3V0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGphdmEgLWphciwgd2hpY2ggd2UgZG8gYnkgbW9kaWZ5aW5nIHRoZSBtYW5pZmVzdAorICAgICAgICAgICAgICAgICAgICAgICAgb2YgY291cnNlLgorICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+JHtwYWNrYWdlfS5NYWluPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisKKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisKKyAgICAgICAgICAgICAgICA8IS0tCisKKyAgICAgICAgICAgICAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvIHNwZWNpZmljYWxseSBhc2sgZm9yIHRoZSB1YmVyIGphciwgc28gd2UgYXR0YWNoIHRoZQorICAgICAgICAgICAgICAgICAgICBydW5uaW5nIG9mIHRoaXMgcGx1Z2luIHRvIHRoZSBleGVjdXRpb24gb2YgdGhlIHBhY2thZ2UgbGlmZS1jeWNsZQorICAgICAgICAgICAgICAgICAgICBwaGFzZS4KKyAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorCisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL1RMZXhlci5nIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL1RMZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWQ4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9hbnRscjMvVExleGVyLmcKQEAgLTAsMCArMSw4MCBAQAorLy8gVGhpcyBpcyBhIHNhbXBsZSBsZXhlciBnZW5lcmF0ZWQgYnkgdGhlIEFOVExSMyBNYXZlbiBBcmNoZXR5cGUKKy8vIGdlbmVyYXRvci4gSXQgc2hvd3MgaG93IHRvIHVzZSBhIHN1cGVyY2xhc3MgdG8gaW1wbGVtZW50CisvLyBzdXBwb3J0IG1ldGhvZHMgYW5kIHZhcmlhYmxlcyB5b3UgbWF5IHVzZSBpbiB0aGUgbGV4ZXIgYWN0aW9ucworLy8gcmF0aGVyIHRoYW4gY3JlYXRlIGEgbWVzc3kgbGV4ZXIgdGhhdCBoYXMgdGhlIEphdmEgY29kZSBlbWJlZGRlZAorLy8gaW4gaXQuCisvLworCitsZXhlciBncmFtbWFyIFRMZXhlcjsKKworb3B0aW9ucyB7CisKKyAgIGxhbmd1YWdlPUphdmE7ICAvLyBEZWZhdWx0CisKKyAgIC8vIFRlbGwgQU5UTFIgdG8gbWFrZSB0aGUgZ2VuZXJhdGVkIGxleGVyIGNsYXNzIGV4dGVuZCB0aGUKKyAgIC8vIHRoZSBuYW1lZCBjbGFzcywgd2hpY2ggaXMgd2hlcmUgYW55IHN1cHBvcnRpbmcgY29kZSBhbmQgCisgICAvLyB2YXJpYWJsZXMgd2lsbCBiZSBwbGFjZWQuCisgICAvLworICAgc3VwZXJDbGFzcyA9IEFic3RyYWN0VExleGVyOworfQorCisvLyBXaGF0IHBhY2thZ2Ugc2hvdWxkIHRoZSBnZW5lcmF0ZWQgc291cmNlIGV4aXN0IGluPworLy8KK0BoZWFkZXIgeworCisgICAgcGFja2FnZSAke3BhY2thZ2V9OworfQorCisvLyBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgbGV4ZXIgdGhhdCBtYXRjaGVzIHRoZSB1c3VhbCBzdXNwZWN0cworLy8KKworS0VZU0VSIDogJ0tleXNlcicgOworU09aRSAgIDogJ1NvemUnIDsKKworQUREIDogJysnIDsKK1NFTUk6ICc7JyA7CisKK0lEICA6CSgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJJzAnLi4nOScrCisgICAgOworCitDT01NRU5UCisgICAgOiAgICcvLycgfignXG4nfCdccicpKiAnXHInPyAnXG4nIHtza2lwKCk7fQorICAgIHwgICAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqICcqLycge3NraXAoKTt9CisgICAgOworCitXUyAgOiAgICggJyAnCisgICAgICAgIHwgJ1x0JworICAgICAgICB8ICdccicKKyAgICAgICAgfCAnXG4nCisgICAgICAgICkge3NraXAoKTt9CisgICAgOworCitTVFJJTkcKKyAgICA6ICAnIicgKCBFU0NfU0VRIHwgfignXFwnfCciJykgKSogJyInCisgICAgOworCitmcmFnbWVudAorSEVYX0RJR0lUIDogKCcwJy4uJzknfCdhJy4uJ2YnfCdBJy4uJ0YnKSA7CisKK2ZyYWdtZW50CitFU0NfU0VRCisgICAgOiAgICdcXCcgKCdiJ3wndCd8J24nfCdmJ3wncid8J1wiJ3wnXCcnfCdcXCcpCisgICAgfCAgIFVOSUNPREVfRVNDCisgICAgfCAgIE9DVEFMX0VTQworICAgIDsKKworZnJhZ21lbnQKK09DVEFMX0VTQworICAgIDogICAnXFwnICgnMCcuLiczJykgKCcwJy4uJzcnKSAoJzAnLi4nNycpCisgICAgfCAgICdcXCcgKCcwJy4uJzcnKSAoJzAnLi4nNycpCisgICAgfCAgICdcXCcgKCcwJy4uJzcnKQorICAgIDsKKworZnJhZ21lbnQKK1VOSUNPREVfRVNDCisgICAgOiAgICdcXCcgJ3UnIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVAorICAgIDsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL1RQYXJzZXIuZyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2FudGxyMy9UUGFyc2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhMDg1MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2FudGxyMy9UUGFyc2VyLmcKQEAgLTAsMCArMSw3NCBAQAorcGFyc2VyIGdyYW1tYXIgVFBhcnNlcjsKKworb3B0aW9ucyB7CisKKyAgICAvLyBEZWZhdWx0IGxhbmd1YWdlIGJ1dCBuYW1lIGl0IGFueXdheQorICAgIC8vCisgICAgbGFuZ3VhZ2UgID0gSmF2YTsKKworICAgIC8vIFByb2R1Y2UgYW4gQVNUCisgICAgLy8KKyAgICBvdXRwdXQgICAgPSBBU1Q7CisKKyAgICAvLyBVc2UgYSBzdXBlcmNsYXNzIHRvIGltcGxlbWVudCBhbGwgaGVscGVyCisgICAgLy8gbWV0aG9kcywgaW5zdGFuY2UgdmFyaWFibGVzIGFuZCBvdmVycmlkZXMKKyAgICAvLyBvZiBBTlRMUiBkZWZhdWx0IG1ldGhvZHMsIHN1Y2ggYXMgZXJyb3IKKyAgICAvLyBoYW5kbGluZy4KKyAgICAvLworICAgIHN1cGVyQ2xhc3MgPSBBYnN0cmFjdFRQYXJzZXI7CisKKyAgICAvLyBVc2UgdGhlIHZvY2FidWxhcnkgZ2VuZXJhdGVkIGJ5IHRoZSBhY2NvbXBhbnlpbmcKKyAgICAvLyBsZXhlci4gTWF2ZW4ga25vd3MgaG93IHRvIHdvcmsgb3V0IHRoZSByZWxhdGlvbnNoaXAKKyAgICAvLyBiZXR3ZWVuIHRoZSBsZXhlciBhbmQgcGFyc2VyIGFuZCB3aWxsIGJ1aWxkIHRoZSAKKyAgICAvLyBsZXhlciBiZWZvcmUgdGhlIHBhcnNlci4gSXQgd2lsbCBhbHNvIHJlYnVpbGQgdGhlCisgICAgLy8gcGFyc2VyIGlmIHRoZSBsZXhlciBjaGFuZ2VzLgorICAgIC8vCisgICAgdG9rZW5Wb2NhYiA9IFRMZXhlcjsKK30KKworLy8gSW1wb3J0IGEgZ3JhbW1hciBmaWxlLCBldmVuIHRob3VnaCBpdCBkb2VzIG5vdCByZWFsbHkgbmVlZCBpdCBpbiB0aGlzCisvLyBzaW1sZSBkZW1vIHBhcnNlci4gV2UgZG8gdGhlIGltcG9ydCB0byBzaG93IHdoZXJlIGltcG9ydGVkIGdyYW1tYXJzIHNob3VsZCBiZQorLy8gc3RvcmVkIGZvciBtYXZlbiBidWlsZHMuCisvLworaW1wb3J0IFJ1bGViOworCisvLyBTb21lIGltYWdpbmFyeSB0b2tlbnMgZm9yIHRyZWUgcmV3cml0ZXMKKy8vCit0b2tlbnMgeworICAgIFNDUklQVDsKK30KKworLy8gV2hhdCBwYWNrYWdlIHNob3VsZCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBleGlzdCBpbj8KKy8vCitAaGVhZGVyIHsKKworICAgIHBhY2thZ2UgJHtwYWNrYWdlfTsKK30KKworCisKKworLy8gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHBhcnNlciBmb3IgZGVtbyBwdXJwb3NlCisvLworYSAgOiBiKiBFT0YKKworICAgICAgLT4gXihTQ1JJUFQgYiopCisgICA7CisKKworCitrZXlzZXIKKyAgIDogS0VZU0VSXiBTT1pFCisgICA7CisKK2V4cHJlc3Npb24KKyAgIDogYWRkRXhwciAoQUREXiBhZGRFeHByKSoKKyAgIDsKKworYWRkRXhwcgorICAgOiBJRAorICAgfCBJTlQKKyAgIHwgU1RSSU5HCisgICA7CisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL1RUcmVlLmcgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9hbnRscjMvVFRyZWUuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTE0ZjZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL1RUcmVlLmcKQEAgLTAsMCArMSw0OSBAQAordHJlZSBncmFtbWFyIFRUcmVlOworCitvcHRpb25zIHsKKworICAgIC8vIERlZmF1bHQgYnV0IG5hbWUgaXQgYW55d2F5CisgICAgLy8KKyAgICBsYW5ndWFnZSAgID0gSmF2YTsKKworICAgIC8vIFVzZSB0aGUgdm9jYWIgZnJvbSB0aGUgcGFyc2VyIChub3QgdGhlIGxleGVyKQorICAgIC8vIFRoZSBBTlRMUiBNYXZlbiBwbHVnaW4ga25vd3MgaG93IHRvIHdvcmsgb3V0IHRoZQorICAgIC8vIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgLmcgZmlsZXMgYW5kIGl0IHdpbGwgYnVpbGQKKyAgICAvLyB0aGUgdHJlZSBwYXJzZXIgYWZ0ZXIgdGhlIHBhcnNlci4gSXQgd2lsbCBhbHNvIHJlYnVpbGQKKyAgICAvLyB0aGUgdHJlZSBwYXJzZXIgaWYgdGhlIHBhcnNlciBpcyByZWJ1aWx0LgorICAgIC8vCisgICAgdG9rZW5Wb2NhYiA9IFRQYXJzZXI7CisKKyAgICAvLyBVc2UgQU5UTFIgYnVpbHQtaW4gQ29tbW9uVG9rZW4gZm9yIHRyZWUgbm9kZXMKKyAgICAvLworICAgIEFTVExhYmVsVHlwZSA9IENvbW1vblRva2VuOworfQorCisvLyBXaGF0IHBhY2thZ2Ugc2hvdWxkIHRoZSBnZW5lcmF0ZWQgc291cmNlIGV4aXN0IGluPworLy8KK0BoZWFkZXIgeworCisgICAgcGFja2FnZSAke3BhY2thZ2V9OworfQorCithIDogXihTQ1JJUFQgc3R1ZmYrKQorICB8IFNDUklQVAorICA7CisKK3N0dWZmCisgIDoga2V5c2VyCisgIHwgZXhwcmVzc2lvbgorICA7CisKK2tleXNlcgorICA6IF4oS0VZU0VSIFNPWkUpCisgICAgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIEtleXNlciBTb3plISEiKTsgfQorICA7CisKK2V4cHJlc3Npb24KKyAgOiBeKEFERCBleHByZXNzaW9uIGV4cHJlc3Npb24pCisgIHwgSUQKKyAgfCBJTlQKKyAgfCBTVFJJTkcKKyAgOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9hbnRscjMvaW1wb3J0cy9SdWxlYi5nIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL2ltcG9ydHMvUnVsZWIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgzNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYW50bHIzL2ltcG9ydHMvUnVsZWIuZwpAQCAtMCwwICsxLDExIEBACisvLyBBIHNpbmdsZSBydWxlIGluIGEgZ3JhbW1hciB0aGF0IG11c3QgYmUgaW1wb3J0ZWQgYnkgdGhlIGRlbW8KKy8vIHBhcnNlciBUcGFyc2VyLmcKKy8vIFRoaXMgaXMganVzdCBoZXJlIHRvIHNob3cgdGhhdCBpbXBvcnQgZ3JhbW1hcnMgYXJlIHN0b3JlZCBpbiB0aGVpcgorLy8gb3duIGltcG9ydHMgZGlyZWN0b3J5OiBzcmMvbWFpbi9hbnRscjMvaW1wb3J0cworLy8KK3BhcnNlciBncmFtbWFyIFJ1bGViOworCitiCisgICA6IGtleXNlciBTRU1JIQorICAgfCBleHByZXNzaW9uIFNFTUkhCisgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0Fic3RyYWN0VExleGVyLmphdmEgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0Fic3RyYWN0VExleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmY2FkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvQWJzdHJhY3RUTGV4ZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisjc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKKyNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKKyNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKK3BhY2thZ2UgJHtwYWNrYWdlfTsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW07CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuTGV4ZXI7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXplclNoYXJlZFN0YXRlOworCisvKioKKworICogVGhpcyBpcyB0aGUgc3VwZXIgY2xhc3MgZm9yIHRoZSBsZXhlci4gSXQgaXMgZXh0ZW5kZWQgYnkgdGhlIGxleGVyIGNsYXNzCisgKiBnZW5lcmF0ZWQgZnJvbSBUTGV4ZXIuZy4KKyAqCisgKiBEbyBub3QgcGxhY2UgY29kZSBhbmQgZGVjbGFyYXRpb25zIGluIHRoZSBsZXhlciAuZyBmaWxlcywgdXNlCisgKiBhIHN1cGVyY2xhc3MgbGlrZSB0aGlzIGFuZCBwbGFjZSBhbGwgdGhlIHN1cHBvcnQgbWV0aG9kcyBhbmQKKyAqIGVycm9yIG92ZXJyaWRlcyBldGMgaW4gdGhlIHN1cGVyIGNsYXNzLiBUaGlzIHdheSB5b3Ugd2lsbCBrZWVwCisgKiB0aGUgbGV4ZXIgZ3JhbW1hciBjbGVhbiBhbmQgaHVua3kgZG9yeS4KKyAqCisgKiBAYXV0aG9yIEppbSBJZGxlIC0gVGVtcG9yYWwgV2F2ZSBMTEMgKGppbWlAaWRsZS53cykKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VExleGVyCisgICAgZXh0ZW5kcyBMZXhlcgorCit7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIGxleGVyLCB3aGVuIHlvdSBkbyBub3QgeWV0IGtub3cgd2hhdAorICAgICAqIHRoZSBjaGFyYWN0ZXIgc3RyZWFtIHRvIGJlIHByb3ZpZGVkIGlzLgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdFRMZXhlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGxleGVyIHVzaW5nIHRoZSBnaXZlbiBjaGFyYWN0ZXIgc3RyZWFtIGFzCisgICAgICogdGhlIGlucHV0IHRvIGxleCBpbnRvIHRva2Vucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBBIHZhbGlkIGNoYXJhY3RlciBzdHJlYW0gdGhhdCBjb250YWlucyB0aGUgcnVsZVNyYyBjb2RlIHlvdQorICAgICAqICAgICAgICAgICAgICB3aXNoIHRvIGNvbXBpbGUgKG9yIGxleCBhdCBsZWFzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RUTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCkgeworICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGNvbnN0cnVjdG9yIGZvciBBTlRMUiAtIGRvIG5vdCB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGNoYXJhY3RlciBzdHJlYW0gd2UgYXJlIGdvaW5nIHRvIGxleAorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc2hhcmVkIHN0YXRlIG9iamVjdCwgc2hhcmVkIGJldHdlZW4gYWxsIGxleGVyIGNvbW9uZW50cworICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdFRMZXhlcihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc3VwZXIoaW5wdXQsc3RhdGUpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0Fic3RyYWN0VFBhcnNlci5qYXZhIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9BYnN0cmFjdFRQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IyOTRmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9BYnN0cmFjdFRQYXJzZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisjc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKKyNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKKyNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKK3BhY2thZ2UgJHtwYWNrYWdlfTsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CisKKy8qKgorICogVGhlIHN1cGVyIGNsYXNzIG9mIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiBJdCBpcyBleHRlbmRlZCBieSB0aGUgZ2VuZXJhdGVkCisgKiBjb2RlIGJlY2F1c2Ugb2YgdGhlIHN1cGVyQ2xhc3Mgb3B0b2luIGluIHRoZSAuZyBmaWxlLgorICoKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgYW55IGhlbHBlciBmdW5jdGlvbnMgdXNlZCB3aXRoaW4gdGhlIHBhcnNlcgorICogZ3JhbW1hciBpdHNlbGYsIGFzIHdlbGwgYXMgYW55IG92ZXJyaWRlcyBvZiB0aGUgc3RhbmRhcmQgQU5UTFIgSmF2YQorICogcnVudGltZSBtZXRob2RzLCBzdWNoIGFzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgY3VzdG9tIGVycm9yIHJlcG9ydGluZworICogbWV0aG9kLCBzeW1ib2wgdGFibGUgcG9wdWxhdGluZyBtZXRob2RzIGFuZCBzbyBvbi4KKyAqCisgKiBAYXV0aG9yIEppbSBJZGxlIC0gVGVtcG9yYWwgV2F2ZSBMTEMgLSBqaW1pQHRlbXBvcmFsLXdhdmUuY29tCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRQYXJzZXIKKworICAgICAgICBleHRlbmRzIFBhcnNlcgorCit7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHBhcnNlciBpbnN0YW5jZSwgcHJlLXN1cHBseWluZyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyZWFtIG9mIHRva2VucyB0aGF0IHdpbGwgYmUgcHVsbGVkIGZyb20gdGhlIGxleGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0VFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCkgeworICAgICAgICBzdXBlcihpbnB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHBhcnNlciBpbnN0YW5jZSwgcHJlLXN1cHBseWluZyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtCisgICAgICogYW5kIHRoZSBzaGFyZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIGEgZ3JhbW1hciBpcyBpbXBvcnRlZCBpbnRvIGFub3RoZXIgZ3JhbW1hciwgYnV0CisgICAgICogd2UgbXVzdCBzdXBwbHkgdGhpcyBjb25zdHJ1Y3RvciB0byBzYXRpc2Z5IHRoZSBzdXBlciBjbGFzcyBjb250cmFjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyZWFtIG9mIHRva2VzbiB0aGF0IHdpbGwgYmUgcHVsbGVkIGZyb20gdGhlIGxleGVyCisgICAgICogQHBhcmFtIHN0YXRlIFRoZSBzaGFyZWQgc3RhdGUgb2JqZWN0IGNyZWF0ZWQgYnkgYW4gaW50ZXJjb25uZWN0ZCBncmFtbWFyCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0VFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN1cGVyKGlucHV0LCBzdGF0ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBlcnJvci93YXJuaW5nIG1lc3NhZ2UgdGhhdCB3ZSBuZWVkIHRvIHNob3cgdXNlcnMvSURFcyB3aGVuCisgICAgICogQU5UTFIgaGFzIGZvdW5kIGEgcGFyc2luZyBlcnJvciwgaGFzIHJlY292ZXJlZCBmcm9tIGl0IGFuZCBpcyBub3cKKyAgICAgKiB0ZWxsaW5nIHVzIHRoYXQgYSBwYXJzaW5nIGV4Y2VwdGlvbiBvY2N1cnJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbk5hbWVzIHRva2VuIG5hbWVzIGFzIGtub3duIGJ5IEFOVExSICh3aGljaCB3ZSBpZ25vcmUpCisgICAgICogQHBhcmFtIGUgVGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwbGF5UmVjb2duaXRpb25FcnJvcihTdHJpbmdbXSB0b2tlbk5hbWVzLCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGEgcGxhY2UgaG9sZGVyIHRoYXQgc2hvd3MgaG93IHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kCisgICAgICAgIC8vCisgICAgICAgIHN1cGVyLmRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKHRva2VuTmFtZXMsIGUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NYWluLmphdmEgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q4MTNjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NYWluLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKKyNzZXQoICRzeW1ib2xfcG91bmQgPSAnIycgKQorI3NldCggJHN5bWJvbF9kb2xsYXIgPSAnJCcgKQorI3NldCggJHN5bWJvbF9lc2NhcGUgPSAnXCcgKQorcGFja2FnZSAke3BhY2thZ2V9OworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLio7CitpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLio7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgJHtwYWNrYWdlfS5UUGFyc2VyLmFfcmV0dXJuOworCisKKy8qKgorICogVGVzdCBkcml2ZXIgcHJvZ3JhbSBmb3IgdGhlIEFOVExSMyBNYXZlbiBBcmNoaXR5cGUgZGVtbworICoKKyAqIEBhdXRob3IgSmltIElkbGUgKGppbWlAdGVtcG9yYWwtd2F2ZS5jb20pCisgKi8KK2NsYXNzIE1haW4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYWtlRG90ID0gZmFsc2U7CisKKyAgICBzdGF0aWMgIFRMZXhlciBsZXhlcjsKKworICAgIC8qKiBKdXN0IGEgc2ltcGxlIHRlc3QgZHJpdmVyIGZvciB0aGUgQVNQIHBhcnNlcgorICAgICAqIHRvIHNob3cgaG93IHRvIGNhbGwgaXQuCisgICAgICovCisKKyAgICAJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBsZXhlciwgd2hpY2ggd2UgY2FuIGtlZXAgcmV1c2luZyBpZiB3ZSBsaWtlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoKTsKKworICAgICAgICAgICAgICAgIGlmICAoYXJncy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmICAoYXJnc1swXS5zdGFydHNXaXRoKCItZG90IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VEb3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcGFyc2UgZWFjaCBkaXJlY3RvcnksIGFuZCBlYWNoIGZpbGUgb24gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgbGluZQorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPXM7IGk8YXJncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UobmV3IEZpbGUoYXJnc1tpXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IGphdmEgLWphciAke2FydGlmYWN0SWR9LSR7dmVyc2lvbn0tamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphciA8ZGlyZWN0b3J5IHwgZmlsZW5hbWUuZG1vPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJBTlRMUiBkZW1vIHBhcnNlciB0aHJldyBleGNlcHRpb246Iik7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoRmlsZSBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworCisgICAgICAgICAgICAvLyBPcGVuIHRoZSBzdXBwbGllZCBmaWxlIG9yIGRpcmVjdG9yeQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBoZXJlLCBhbnkgZXhjZXB0aW9ucyBhcmUganVzdCB0aHJvd24gYmFjayB1cCB0aGUgY2hhaW4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGlyZWN0b3J5OiAiICsgc291cmNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBzb3VyY2UubGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UobmV3IEZpbGUoc291cmNlLCBmaWxlc1tpXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRWxzZSBmaW5kIG91dCBpZiBpdCBpcyBhbiBBU1AuTmV0IGZpbGUgYW5kIHBhcnNlIGl0IGlmIGl0IGlzCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHdpdGhvdXQgcGF0aHMgZXRjCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlID0gc291cmNlLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAgKHNvdXJjZUZpbGUubGVuZ3RoKCkgPiAzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gc291cmNlRmlsZS5zdWJzdHJpbmcoc291cmNlRmlsZS5sZW5ndGgoKS00KS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGlzIGEgREVNTyBzY3JpcHQgKG9yIHNlZW1pbmdseSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAgKHN1ZmZpeC5jb21wYXJlVG8oIi5kbW8iKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlU291cmNlKHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQU5UTFIgZGVtbyBwYXJzZXIgY2F1Z2h0IGVycm9yIG9uIGZpbGUgb3BlbjoiKTsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlU291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gUGFyc2UgYW4gQU5UTFIgZGVtbyBmaWxlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgY3JlYXRlIGEgZmlsZSBzdHJlYW0gdXNpbmcgdGhlIHBvdmlkZWQgZmlsZS9wYXRoCisgICAgICAgICAgICAgICAgLy8gYW5kIHRlbGwgdGhlIGxleGVyIHRoYXQgdGhhdCBpcyB0aGUgY2hhcmFjdGVyIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGFsc28gdXNlIHRleHQgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHJlYWQgb2YgY291cnNlCisgICAgICAgICAgICAgICAgLy8gYnkgdXNpbmcgdGhlIHN0cmluZyBzdHJlYW0uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBsZXhlci5zZXRDaGFyU3RyZWFtKG5ldyBBTlRMUkZpbGVTdHJlYW0oc291cmNlLCAiVVRGOCIpKTsKKworICAgICAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBsZXhlciBhcyB0aGUgdG9rZW4gc291cmNlLCB3ZSBjcmVhdGUgYSB0b2tlbgorICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB0byBiZSBjb25zdW1lZCBieSB0aGUgcGFyc2VyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpOworCisgICAgICAgICAgICAgICAgLy8gTm93IHdlIG5lZWQgYW4gaW5zdGFuY2Ugb2Ygb3VyIHBhcnNlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgVFBhcnNlciBwYXJzZXIgPSBuZXcgVFBhcnNlcih0b2tlbnMpOworCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWxlOiAiICsgc291cmNlKTsKKworICAgICAgICAgICAgICAgIC8vIFByb3ZpZGUgc29tZSB1c2VyIGZlZWRiYWNrCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBMZXhlciBTdGFydCIpOworICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGb3JjZSB0b2tlbiBsb2FkIGFuZCBsZXggKGRvbid0IGRvIHRoaXMgbm9ybWFsbHksIAorICAgICAgICAgICAgICAgIC8vIGl0IGlzIGp1c3QgZm9yIHRpbWluZyB0aGUgbGV4ZXIpCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB0b2tlbnMuTFQoMSk7CisgICAgICAgICAgICAgICAgbG9uZyBsZXhlclN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIGxleGVkIGluICIgKyAobGV4ZXJTdG9wIC0gc3RhcnQpICsgIm1zLiIpOworCisgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyB3ZSBtZXJlbHkgaW52b2tlIHRoZSBzdGFydCBydWxlIGZvciB0aGUgcGFyc2VyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBQYXJzZXIgU3RhcnQiKTsKKyAgICAgICAgICAgICAgICBsb25nIHBTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGFfcmV0dXJuIHBzclJldHVybiA9IHBhcnNlci5hKCk7CisgICAgICAgICAgICAgICAgbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICBQYXJzZWQgaW4gIiArIChzdG9wIC0gcFN0YXJ0KSArICJtcy4iKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGdvdCBhIHZhbGlkIGEgdHJlZSAodGhlIHN5bnRhY3RpYyB2YWxpZGl0eSBvZiB0aGUgc291cmNlIGNvZGUKKyAgICAgICAgICAgICAgICAvLyB3YXMgZm91bmQgdG8gYmUgc29saWQpLCB0aGVuIGxldCdzIHByaW50IHRoZSB0cmVlIHRvIHNob3cgd2UKKyAgICAgICAgICAgICAgICAvLyBkaWQgc29tZXRoaW5nOyBvdXIgdGVzdGluZyBwdWJsaWMgd2FudHMgdG8ga25vdyEKKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBzb21ldGhpbmcgZmFpcmx5IGNvb2wgaGVyZSBhbmQgZ2VuZXJhdGUgYSBncmFwaHZpei9kb3QKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgdHJlZSwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgdXNlcnMgdG8gdmlzdWFsaXplCisgICAgICAgICAgICAgICAgLy8gaXQgOi0pIHdlIG9ubHkgZG8gdGhhdCBpZiBhc2tlZCB2aWEgdGhlIC1kb3Qgb3B0aW9uIHRob3VnaCBhcyBub3QKKyAgICAgICAgICAgICAgICAvLyBhbGwgdXNlcnMgd2lsbCBoc3ZlIGluc3RhbGxlZCB0aGUgZ3JhcGh2aXogdG9vbHNldCBmcm9tCisgICAgICAgICAgICAgICAgLy8gaHR0cDovL3d3dy5ncmFwaHZpei5vcmcKKyAgICAgICAgICAgICAgICAvLworCisgICAgICAgICAgICAgICAgLy8gUGljayB1cCB0aGUgZ2VuZXJpYyB0cmVlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBUcmVlIHQgPSAoVHJlZSlwc3JSZXR1cm4uZ2V0VHJlZSgpOworCisgICAgICAgICAgICAgICAgLy8gTk93IHdhbGsgaXQgd2l0aCB0aGUgZ2VuZXJpYyB0cmVlIHdhbGtlciwgd2hpY2ggZG9lcyBub3RoaW5nIGJ1dAorICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGUgdHJlZSByZWFsbHkuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0TnVtYmVyT2ZTeW50YXhFcnJvcnMoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUVHJlZSB3YWxrZXIgPSBuZXcgVFRyZWUobmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIEFTVCBXYWxrIFN0YXJ0JHtzeW1ib2xfZXNjYXBlfW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa2VyLmEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiJHtzeW1ib2xfZXNjYXBlfW4gICAgICBBU1QgV2Fsa2VkIGluICIgKyAoc3RvcCAtIHBTdGFydCkgKyAibXMuIik7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiB3KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBU1Qgd2FsayBjYXVzZWQgZXhjZXB0aW9uLiIpOworICAgICAgICAgICAgICAgICAgICB3LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICAobWFrZURvdCAmJiB0b2tlbnMuc2l6ZSgpIDwgNDA5NikKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHN0cmluZ2lmeSBpdCBpZiB5b3Ugd2FudCB0by4uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4odC50b1N0cmluZ1RyZWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBBTkxUUiBidWlsdCBpbiBkb3QgZ2VuZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIERPVFRyZWVHZW5lcmF0b3IgZ2VuID0gbmV3IERPVFRyZWVHZW5lcmF0b3IoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXaGljaCB3ZSBjYW4gY2F1c2UgdG8gZ2VuZXJhdGUgdGhlIERPVCBzcGVjaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGlucHV0IGZpbGUgbmFtZSBzdWZmaXhlZCB3aXRoIC5kb3QuIFlvdSBjYW4gdGhlbiB1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGdyYXBodml6IHRvb2xzIG9yIHpncnZpZXdlciAoSmF2YSkgdG8gdmlldyB0aGUgZ3JhcGhpY2FsCisgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gb2YgdGhlIGRvdCBmaWxlLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIHNvdXJjZS5sZW5ndGgoKS0zKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dE5hbWUgPSBzb3VyY2UgKyAiZG90IjsKKworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBQcm9kdWNpbmcgQVNUIGRvdCAoZ3JhcGh2aXopIGZpbGUiKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJdCBwcm9kdWNlcyBhIGpndXJ1IHN0cmluZyB0ZW1wbGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nVGVtcGxhdGUgc3QgPSBnZW4udG9ET1QodCwgbmV3IENvbW1vblRyZWVBZGFwdG9yKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgYW5kIHdyaXRlIHRoZSBkb3Qgc3BlYyB0byBpdAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBGaWxlV3JpdGVyIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlV3JpdGVyKG91dHB1dE5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoc3QudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEludm9rZSBkb3QgdG8gZ2VuZXJhdGUgYSAucG5nIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgUHJvZHVjaW5nIHBuZyBncmFwaGljIGZvciB0cmVlIik7CisgICAgICAgICAgICAgICAgICAgIHBTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBQcm9jZXNzIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJkb3QgLVRwbmcgLW8iICsgc291cmNlICsgInBuZyAiICsgb3V0cHV0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Mud2FpdEZvcigpOworICAgICAgICAgICAgICAgICAgICBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgUE5HIGdyYXBoaWMgcHJvZHVjZWQgaW4gIiArIChzdG9wIC0gcFN0YXJ0KSArICJtcy4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlIHdlIHRyaWVkIHRvIHBhcnNlIGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiR7c3ltYm9sX2VzY2FwZX1uICAhIVRoZSBmaWxlICIgKyBzb3VyY2UgKyAiIGRvZXMgbm90IGV4aXN0ISEke3N5bWJvbF9lc2NhcGV9biIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUgcGFyc2VyLCByZXBvcnQgdGhpcworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQYXJzZXIgdGhyZXcgYW4gZXhjZXB0aW9uOiR7c3ltYm9sX2VzY2FwZX1uJHtzeW1ib2xfZXNjYXBlfW4iKTsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGRjOTgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vcG9tLnhtbApAQCAtMCwwICsxLDM2MSBAQAorPCEtLQorCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorCisgQU5UTFIgICAgICAgIC0gQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgVGVyZW5jZSBQYXJyCisgTWF2ZW4gUGx1Z2luIC0gQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSmltIElkbGUKKworIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgLS0+CisKKworCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworCisgICAgPCEtLQorICAgICAgICBUaGUgQU5UTFIgTWF2ZW4gYXJ0aWZhY3RzIGFyZSBub3cgcmVsZWFzZWQgdmlhIHRoZSBTb25vdHlwZSBPU1MKKyAgICAgICAgcmVwb3NpdG9yeSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGFyZSBzeW5jZWQgdG8gTWF2ZW4gY2VudHJhbCAKKyAgICAgICAgd2l0aGluIGEgZmV3IG1pbnV0ZXMgb2YgaGl0dGluZyB0aGUgcmVsZWFzZSByZXBvIGZvciBTb25vdHlwZS4KKyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHdlIGluaGVyaXQgZnJvbSB0aGUgU29ub3R5cGUgcHJvdmlkZWQgcGFyZW50CisgICAgICAgIHBvbS4gSG93ZXZlciwgd2UgbXVzdCBhbHNvIGNvbmZpZ3VyZSBvdXIgLm0yL3NldHRpbmdzLnhtbCB0byBpbmNsdWRlCisgICAgICAgIHRoZSBzbmFwc2hvdCBhbmQgc3RhZ2luZyBzZXJ2ZXIgYW5kIHRoZSBzb25vdHlwZSBwYXNzd29yZC4gVGhpcyAKKyAgICAgICAgbWVhbnMgdGhhdCBvbmx5IEFOVExSIGRldmVsb3BlcnMgY2FuIHJlbGVhc2VkIHRoZSBhcnRpZmFjdHMsIGJ1dAorICAgICAgICBhbnlvbmUgY2FuIGJ1aWxkIGxvY2FsbHkuCisgICAgICAtLT4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXR5cGUub3NzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vc3MtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj43PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PiAgCisgICAgCisgICAgPCEtLSBNYXZlbiBtb2RlbCB3ZSBhcmUgaW5oZXJpdGluZyBmcm9tCisgICAgICAtLT4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8IS0tCisKKyAgICAgTm93IHRoYXQgdGhlIEFOVExSIHByb2plY3QgaGFzIGFkb3B0ZWQgTWF2ZW4gd2l0aCBhIHZlbmdlbmNlLAorICAgICBhbGwgQU5UTFIgdG9vbHMgd2lsbCBiZSBncm91cGVkIHVuZGVyIG9yZy5hbnRsciBhbmQgd2lsbCBiZQorICAgICBjb250cm9sbGVkIGJ5IGEgcHJvamVjdCBtZW1iZXIuCisgICAgIC0tPgorICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKworCisgICAgPCEtLQorCisgICAgIFRoaXMgaXMgdGhlIEFOVExSIHBsdWdpbiBmb3IgQU5UTFIgdmVyc2lvbiAzLjEuMyBhbmQgYWJvdmUuIEl0IG1pZ2h0CisgICAgIGhhdmUgYmVlbiBiZXN0IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIGFzIHRoZSAzLjEuMiBwbHVnaW5zCisgICAgIGJlaGF2ZSBhIGxpdHRsZSBkaWZmZXJlbnRseSwgaG93ZXZlciBmb3IgdGhlIHNha2Ugb2Ygb25lIHRyYW5zaXRpb25hbAorICAgICBwaGFzZSB0byBhIG11Y2ggYmV0dGVyIHBsdWdpbiwgaXQgd2FzIGRlY2lkZWQgdGhhdCB0aGUgbmFtZSBzaG91bGQKKyAgICAgcmVtYWluIHRoZSBzYW1lLgorICAgICAgLS0+CisgICAgPGFydGlmYWN0SWQ+YW50bHIzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorCisgICAgPCEtLSBOb3RlIHRoYXQgYXMgdGhpcyBwbHVnaW4gZGVwZW5kcyBvbiB0aGUgQU5UTFIgdG9vbCBpdHNlbGYKKyAgICAgICAgIHdlIGNhbm5vdCB1c2UgdGhlIHBhcmVuIHBvbSB0byBjb250cm9sIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgICAgICAgYW5kIE1VU1QgdXBkYXRlIDx2ZXJzaW9uPiBpbiB0aGlzIHBvbSBtYW51YWxseSEKKyAgICAgICAgIC0tPgorICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgICA8bmFtZT5NYXZlbiBwbHVnaW4gZm9yIEFOVExSIFYzLjQ8L25hbWU+CisgICAgPHByZXJlcXVpc2l0ZXM+CisgICAgICAgIDxtYXZlbj4yLjA8L21hdmVuPgorICAgIDwvcHJlcmVxdWlzaXRlcz4KKworICAgIDwhLS0KKyAgICAgV2hlcmUgZG9lcyBvdXIgYWN0dWFsIHByb2plY3QgbGl2ZSBvbiB0aGUgaW50ZXJ3ZWJzLgorICAgICAgLS0+CisgICAgPHVybD5odHRwOi8vYW50bHIub3JnPC91cmw+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlc2NyaXB0aW9uPgorCitUaGlzIGlzIHRoZSBicmFuZCBuZXcsIHJlLXdyaXR0ZW4gZnJvbSBzY3JhdGNoIHBsdWdpbiBmb3IgQU5UTFIgdjMuCisKK1ByZXZpb3VzIHZhbGlhbnQgZWZmb3J0cyBhbGwgc3VmZmVyZWQgZnJvbSBiZWluZyB1bmFibGUgdG8gbW9kaWZ5IHRoZSBBTlRMUiBUb29sCitpdHNlbGYgdG8gcHJvdmlkZSBzdXBwb3J0IG5vdCBqdXN0IGZvciBNYXZlbiBvcmllbnRlZCB0aGluZ3MgYnV0IGFueSBvdGhlciB0b29sCit0aGF0IG1pZ2h0IHdpc2ggdG8gaW52b2tlIEFOVExSIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgorCitSYXRoZXIgdGhhbiB0cnkgdG8gc2hvZS1ob3JuIG5ldyBjb2RlIGludG8gdGhlIGV4aXN0aW5nIE1vam8gKGluIGZhY3QgSSB0aGluayB0aGF0CitieSBpbmNvcnBvcmF0aW5nIGEgcGF0Y2ggc3VwcGxpZWQgYnkgc29tZW9uZSBJIGVuZGVkIHVwIHdpdGggdG93IHZlcnNpb25zIG9mIHRoZQorTW9qbywgSSBlbGVjdGVkIHRvIHJld3JpdGUgZXZlcnl0aGluZyBmcm9tIHNjcmF0Y2gsIGluY2x1ZGluZyB0aGUgZG9jdW1lbnRhdGlvbiwgc28KK3RoYXQgd2UgbWlnaHQgZW5kIHVwIHdpdGggYSBwZXJmZWN0IE1vam8gdGhhdCBjYW4gZG8gZXZlcnl0aGluZyB0aGF0IEFOVExSIHYzIHN1cHBvcnRzCitzdWNoIGFzIGltcG9ydGVkIGdyYW1tYXIgcHJvY2Vzc2luZywgcHJvcGVyIHN1cHBvcnQgZm9yIGxpYnJhcnkgZGlyZWN0b3JpZXMgYW5kCitsb2NhdGluZyB0b2tlbiBmaWxlcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2VzLCBhbmQgc28gb24uCisKK0luIHRoZSBlbmQgSSBkZWNpZGVkIHRvIGFsc28gY2hhbmdlIHRoZSB0aGUgQU5UTFIgVG9vbC5qYXZhIGNvZGUgc28gdGhhdCBpdAord291bGQgYmUgdGhlIHByb3ZpZGVyIG9mIGFsbCB0aGUgdGhpbmdzIHRoYXQgYSBidWlsZCB0b29sIG5lZWRzLCByYXRoZXIgdGhhbgorZGVsZWdhdGluZyB0aGluZ3MgdG8gNSBkaWZmZXJlbnQgdG9vbHMuIFNvLCB0aGluZ3MgbGlrZSBkZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kKK3NvcnRpbmcsIG9wdGlvbiB0cmFja2luZywgZ2VuZXJhdGluZyBzb3VyY2VzIGFuZCBzbyBvbiBhcmUgYWxsIGZvbGRlZCBiYWNrCitpbiB0byBBTlRMUidzIFRvb2wuamF2YSBjb2RlLCB3aGVyZSB0aGV5IGJlbG9uZywgYW5kIHRoZXkgbm93IHByb3ZpZGUgYQorcHVibGljIGludGVyZmFjZSB0byBhbnlvbmUgdGhhdCBtaWdodCB3YW50IHRvIGludGVyZmFjZSB3aXRoIHRoZW0uCisKK09uZSBvdGhlciBnb2FsIG9mIHRoaXMgcmV3cml0ZSB3YXMgdG8gY29tcGxldGVseSBkb2N1bWVudCB0aGUgd2hvbGUgdGhpbmcKK3RvIGRlYXRoLiBIZW5jZSBldmVuIHRoaXMgcG9tIGhhcyBtb3JlIGNvbW1lbnRzIHRoYW4gZnVuY2l0b25hbCBlbGVtZW50cywKK2luIGNhc2UgSSBnZXQgcnVuIG92ZXIgYnkgYSBidXMgb3IgZmFsbCBvZmYgYSBjbGlmZiB3aGlsZSBza2lpbmcuCisKK0ppbSBJZGxlIC0gTWFyY2ggMjAwOQorCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZS1zaWduLWFydGlmYWN0czwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlcGxveTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKworICAgIDxkZXZlbG9wZXJzPgorCisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5KaW0gSWRsZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbTwvdXJsPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPk9yaWdpbmF0b3IsIHZlcnNpb24gMy4xLjMrPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisKKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlRlcmVuY2UgUGFycjwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL2FudGxyLm9yZy93aWtpL2Rpc3BsYXkvfmFkbWluL0hvbWU8L3VybD4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5Qcm9qZWN0IGxlYWQgLSBBTlRMUjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorCisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5EYXZpZCBIb2xyb3lkPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vZGF2aWQuaG9scm95ZC5tZS51ay88L3VybD4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5PcmlnaW5hdG9yIC0gcHJpb3IgdmVyc2lvbjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorCisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5LZW5ueSBNYWNEZXJtaWQ8L25hbWU+CisgICAgICAgICAgICA8dXJsPm1haWx0bzprZW5ueSAiYXQiIGttZGNvbnN1bHRpbmcuY2E8L3VybD4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5Db250cmlidXRvciAtIHByaW9yIHZlcnNpb25zPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisKKyAgICA8L2RldmVsb3BlcnM+CisKKyAgICA8IS0tIFdoZXJlIGRvIHdlIHRyYWNrIGJ1Z3MgZm9yIHRoaXMgcHJvamVjdD8KKyAgICAgIC0tPgorICAgIDxpc3N1ZU1hbmFnZW1lbnQ+CisgICAgICAgIDxzeXN0ZW0+SklSQTwvc3lzdGVtPgorICAgICAgICA8dXJsPmh0dHA6Ly9hbnRsci5vcmcvamlyYS9icm93c2UvQU5UTFI8L3VybD4KKyAgICA8L2lzc3VlTWFuYWdlbWVudD4KKworICAgIDwhLS0gTG9jYXRpb24gb2YgdGhlIGxpY2Vuc2UgZGVzY3JpcHRpb24gZm9yIHRoaXMgcHJvamVjdAorICAgICAgLS0+CisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPG5hbWU+VGhlIEJTRCBMaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFudGxyLm9yZy9MSUNFTlNFLnR4dCA8L3VybD4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisgICAgCisgICAgPCEtLSBBbmNpbGxpYXJ5IGluZm9ybWF0aW9uIGZvciBjb21wbGV0ZW5lc3MKKyAgICAgIC0tPgorICAgIDxpbmNlcHRpb25ZZWFyPjIwMDk8L2luY2VwdGlvblllYXI+CisKKyAgICA8bWFpbGluZ0xpc3RzPgorICAgICAgICA8bWFpbGluZ0xpc3Q+CisgICAgICAgICAgICA8YXJjaGl2ZT5odHRwOi8vYW50bHIubWFya21haWwub3JnLzwvYXJjaGl2ZT4KKyAgICAgICAgICAgIDxvdGhlckFyY2hpdmVzPgorICAgICAgICAgICAgICAgIDxvdGhlckFyY2hpdmU+aHR0cDovL3d3dy5hbnRsci5vcmcvcGlwZXJtYWlsL2FudGxyLWludGVyZXN0Lzwvb3RoZXJBcmNoaXZlPgorICAgICAgICAgICAgPC9vdGhlckFyY2hpdmVzPgorICAgICAgICAgICAgPG5hbWU+QU5UTFIgVXNlcnM8L25hbWU+CisgICAgICAgICAgICA8c3Vic2NyaWJlPmh0dHA6Ly93d3cuYW50bHIub3JnL21haWxtYW4vbGlzdGluZm8vYW50bHItaW50ZXJlc3QvPC9zdWJzY3JpYmU+CisgICAgICAgICAgICA8dW5zdWJzY3JpYmU+aHR0cDovL3d3dy5hbnRsci5vcmcvbWFpbG1hbi9vcHRpb25zL2FudGxyLWludGVyZXN0LzwvdW5zdWJzY3JpYmU+CisgICAgICAgICAgICA8cG9zdD5hbnRsci1pbnRlcmVzdEBhbnRsci5vcmc8L3Bvc3Q+CisgICAgICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgPC9tYWlsaW5nTGlzdHM+CisKKyAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5BTlRMUi5vcmc8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hbnRsci5vcmc8L3VybD4KKyAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLQorCisgICAgIFdoYXQgYXJlIHdlIGRlcGVkZW50IG9uIGZvciB0aGUgTW9qb3MgdG8gZXhlY3V0ZT8gV2UgbmVlZCB0aGUKKyAgICAgcGx1Z2luIEFQSSBpdHNlbGYgYW5kIG9mIGNvdXJzZSB3ZSBuZWVkIHRoZSBBTlRMUiBUb29sIGFuZCBydW50aW1lCisgICAgIGFuZCBhbnkgb2YgdGhlaXIgZGVwZW5kZW5jaWVzLCB3aGljaCB3ZSBpbmhlcml0LiBUaGUgVG9vbCBpdHNlbGYgcHJvdmlkZXMKKyAgICAgdXMgd2l0aCBhbGwgdGhlIGRlcGVuZGVuY2llcywgc28gd2UgbmVlZCBvbmx5IG5hbWUgaXQgaGVyZS4KKyAgICAgIC0tPgorICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPCEtLQorICAgICAgICAgIFRoZSB0aGluZ3Mgd2UgbmVlZCB0byBidWlsZCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHJlY29nbml6ZXIKKyAgICAgICAgICAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS41LjM8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tCisgICAgICAgICBUaGUgdmVyc2lvbiBvZiBBTlRMUiB0b29sIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4gY29udHJvbHMuCisgICAgICAgICBXZSBoYXZlIGRlY2lkZWQgdGhhdCB0aGlzIHNob3VsZCBiZSBpbiBsb2Nrc3RlcCB3aXRoIEFOVExSIGl0c2VsZiwgb3RoZXIKKyAgICAgICAgIHRoYW4gLTEgLTIgLTMgZXRjIHBhdGNoIHJlbGVhc2VzLgorICAgICAgICAgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My40PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLQorICAgICAgICAgIFRlc3RpbmcgcmVxdWlyZW1lbnRzLi4uCisgICAgICAgICAgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC44LjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisKKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdGVzdGluZy1oYXJuZXNzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIAorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIAorICAgIDxidWlsZD4KKworICAgICAgICA8ZGVmYXVsdEdvYWw+aW5zdGFsbDwvZGVmYXVsdEdvYWw+CisKKyAgICAgICAgPHBsdWdpbnM+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PmpzcjE0PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNpdGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5TG9jYXRpb25zRW5hYmxlZD5mYWxzZTwvZGVwZW5kZW5jeUxvY2F0aW9uc0VuYWJsZWQ+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisJCQk8cGx1Z2luPgorCQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjg8L3ZlcnNpb24+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KKwkJCQkJCTxnb2Fscz4KKwkJCQkJCQk8Z29hbD5qYXI8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKyAgICAgICAgICAgIAorICAgICAgICA8L3BsdWdpbnM+CisKKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9tb2pvL2FudGxyMy9BbnRscjNFcnJvckxvZy5qYXZhIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYW50bHIvbW9qby9hbnRscjMvQW50bHIzRXJyb3JMb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJjM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYW50bHIvbW9qby9hbnRscjMvQW50bHIzRXJyb3JMb2cuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioKKyBbVGhlICJCU0QgbGljZW5jZSJdCisKKyBBTlRMUiAgICAgICAgLSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyBNYXZlbiBQbHVnaW4gLSBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKaW0gSWRsZQorCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5tb2pvLmFudGxyMzsKKworaW1wb3J0IG9yZy5hbnRsci50b29sLkFOVExSRXJyb3JMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5NZXNzYWdlOworaW1wb3J0IG9yZy5hbnRsci50b29sLlRvb2xNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOworCisvKioKKyAqIFRoZSBNYXZlbiBwbGV4dXMgY29udGFpbmVyIGdpdmVzIHVzIGEgTG9nIGxvZ2dpbmcgcHJvdmlkZXIKKyAqIHdoaWNoIHdlIGNhbiB1c2UgdG8gaW5zdGFsbCBhbiBlcnJvciBsaXN0ZW5lciBmb3IgdGhlIEFOVExSCisgKiB0b29sIHRvIHJlcG9ydCBlcnJvcnMgYnkuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRscjNFcnJvckxvZyBpbXBsZW1lbnRzIEFOVExSRXJyb3JMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIExvZyBsb2c7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZSBhbiBBTlRMUiBFcnJvckxpc3RuZXIgdGhhdCBjb21tdW5pY2F0ZXMgYW55IG1lc3NhZ2VzCisgICAgICogaXQgcmVjZWl2ZXMgdG8gdGhlIE1hdmVuIGVycm9yIHNpbmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nIFRoZSBNYXZlbiBFcnJvciBMb2cKKyAgICAgKi8KKyAgICBwdWJsaWMgQW50bHIzRXJyb3JMb2coTG9nIGxvZykgeworICAgICAgICB0aGlzLmxvZyA9IGxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgdG8gdGhlIE1hdmVuIGxvZyBzaW5rLgorICAgICAqIEBwYXJhbSBzIFRoZSBtZXNzYWdlIHRvIHNlbmQgdG8gTWF2ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmZvKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGFuIGVycm9yIG1lc3NhZ2UgZnJvbSBBTlRMUiBhbmFseXNpcyB0byB0aGUgTWF2ZW4gTG9nIHNpbmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIE1hdmVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVycm9yKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBsb2cuZXJyb3IobWVzc2FnZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgTWF2ZW4gbG9nIHNpbmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIGxvZy53YXJuKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYW4gZXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBBTlRMUiB0b29sIHRvIHRoZSBNYXZlbiBMb2cgc2luay4KKyAgICAgKiBAcGFyYW0gdG9vbE1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcihUb29sTWVzc2FnZSB0b29sTWVzc2FnZSkgeworICAgICAgICBsb2cuZXJyb3IodG9vbE1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYW50bHIvbW9qby9hbnRscjMvQW50bHIzTW9qby5qYXZhIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYW50bHIvbW9qby9hbnRscjMvQW50bHIzTW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjI1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9tb2pvL2FudGxyMy9BbnRscjNNb2pvLmphdmEKQEAgLTAsMCArMSw0OTMgQEAKKy8qKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorCitBTlRMUiAgICAgICAgLSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKK01hdmVuIFBsdWdpbiAtIENvcHlyaWdodCAoYykgMjAwOSAgICAgIEppbSBJZGxlCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCitkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCitkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyBpcyB0aGUgZGVmaW5pdGl2ZSBBTlRMUjMgTW9qbyBzZXQuIEFsbCBvdGhlciBzZXRzIGFyZSBiZWxvbmcgdG8gdXMuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLm1vam8uYW50bHIzOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLkluY2x1c2lvblNjYW5FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci51dGlsLnNjYW4uU2ltcGxlU291cmNlSW5jbHVzaW9uU2Nhbm5lcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5Tb3VyY2VJbmNsdXNpb25TY2FubmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLm1hcHBpbmcuU291cmNlTWFwcGluZzsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5tYXBwaW5nLlN1ZmZpeE1hcHBpbmc7CisKKy8qKgorICogR29hbCB0aGF0IHBpY2tzIHVwIGFsbCB0aGUgQU5UTFIgZ3JhbW1hcnMgaW4gYSBwcm9qZWN0IGFuZCBtb3ZlcyB0aG9zZSB0aGF0CisgKiBhcmUgcmVxdWlyZWQgZm9yIGdlbmVyYXRpb24gb2YgdGhlIGNvbXBpbGFibGUgc291cmNlcyBpbnRvIHRoZSBsb2NhdGlvbgorICogdGhhdCB3ZSB1c2UgdG8gY29tcGlsZSB0aGVtLCBzdWNoIGFzIHRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9hbnRscjMgLi4uCisgKgorICogQGdvYWwgYW50bHIKKyAqIAorICogQHBoYXNlIHByb2Nlc3Mtc291cmNlcworICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQorICogQHJlcXVpcmVzUHJvamVjdCB0cnVlCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmppbWlAdGVtcG9yYWwtd2F2ZS5jb20iPkppbSBJZGxlPC9hPgorICovCitwdWJsaWMgY2xhc3MgQW50bHIzTW9qbworICAgICAgICBleHRlbmRzIEFic3RyYWN0TW9qbyB7CisKKyAgICAvLyBGaXJzdCwgbGV0J3MgZGVhbCB3aXRoIHRoZSBvcHRpb25zIHRoYXQgdGhlIEFOVExSIHRvb2wgaXRzZWxmCisgICAgLy8gY2FuIGJlIGNvbmZpZ3VyZWQgYnkuCisgICAgLy8KKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiBhZnRlciB0aGUgdG9vbCBoYXMgcHJvY2Vzc2VkIGFuIGlucHV0IGdyYW1tYXIgZmlsZQorICAgICAqIGl0IHdpbGwgcmVwb3J0IHZhcmlvdXMgc3RhdGlzdGljcyBhYm91dCB0aGUgcGFyc2VyLCBzdWNoIGFzIGluZm9ybWF0aW9uCisgICAgICogb24gY3ljbGljIERGQXMsIHdoaWNoIHJ1bGVzIG1heSB1c2UgYmFja3RyYWNraW5nLCBhbmQgc28gb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlcG9ydDsKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgQU5UTFIgdG9vbCB3aWxsIHByaW50IGEgdmVyc2lvbiBvZiB0aGUgaW5wdXQKKyAgICAgKiBncmFtbWFyIHdoaWNoIGlzIGRldm9pZCBvZiBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZSBwcmVzZW50IGluIHRoZSBpbnB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmludEdyYW1tYXI7CisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHRydWUsIHRoZW4gdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBBTlRMUiBjb2RlIGdlbmVyYXRvciB3aWxsCisgICAgICogYmUgc2V0IHRvIGRlYnVnIG1vZGUuIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHJ1biwgdGhlIGNvZGUgd2lsbCAnaGFuZycgYW5kCisgICAgICogd2FpdCBmb3IgYSBkZWJ1ZyBjb25uZWN0aW9uIG9uIGEgVENQIHBvcnQgKDQ5MTAwIGJ5IGRlZmF1bHQpLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGVuIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgY29tcHV0ZSBhbmQgcmVwb3J0IG9uCisgICAgICogcHJvZmlsZSBpbmZvcm1hdGlvbiBhdCBydW50aW1lLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9maWxlOworICAgIC8qKgorICAgICAqIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIEFOVExSIHRvb2wgd2lsbCBnZW5lcmF0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBuZmEKKyAgICAgKiBmb3IgZWFjaCBydWxlIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnIj5Eb3QgZm9ybWF0PC9hPgorICAgICAqIAorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbmZhOworICAgIC8qKgorICAgICAqIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIEFOVExSIHRvb2wgd2lsbCBnZW5lcmF0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBERkEKKyAgICAgKiBmb3IgZWFjaCBkZWNpc2lvbiBpbiB0aGUgZ3JhbW1hciBpbiA8YSBocmVmPSJodHRwOi8vd3d3LmdyYXBodml6Lm9yZyI+RG90IGZvcm1hdDwvYT4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRmYTsKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGdlbmVyYXRlZCBwYXJzZXIgY29kZSB3aWxsIGxvZyBydWxlIGVudHJ5IGFuZCBleGl0IHBvaW50cworICAgICAqIHRvIHN0ZG91dCBhcyBhbiBhaWQgdG8gZGVidWdnaW5nLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cmFjZTsKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IGFueSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2VzIHJldHVybmVkCisgICAgICogYnkgQU5MVFIsIHNob3VsZCBiZSBmb3JtYXR0ZWQgaW4gdGhlIHNwZWNpZmllZCB3YXkuIEN1cnJlbnRseSwgQU5UTFIgc3VwcG9ydHMgdGhlCisgICAgICogYnVpbHQtaW4gZm9ybWF0cyBvZiBhbnRsciwgZ251IGFuZCB2czIwMDUuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImFudGxyIgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZUZvcm1hdDsKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBBTlRMUiB3aWxsIHJlcG9ydCBhbGwgc29ydHMgb2YgdGhpbmdzCisgICAgICogYWJvdXQgd2hhdCBpdCBpcyBkb2luZyBzdWNoIGFzIHRoZSBuYW1lcyBvZiBmaWxlcyBhbmQgdGhlIHZlcnNpb24gb2YgQU5UTFIgYW5kIHNvIG9uLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGFsdHMsIGJleW9uZCB3aGljaCBBTlRMUiB3aWxsIG5vdCBnZW5lcmF0ZSBhIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgKiBmb3IgdGhlIERGQS4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iMzAwIgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1heFN3aXRjaENhc2VMYWJlbHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGFsdHMsIGJlbG93IHdoaWNoIEFOVExSIHdpbGwgbm90IGNob29zZSB0byBnZW5lcmF0ZSBhIHN3aXRjaAorICAgICAqIHN0YXRlbWVudCBvdmVyIGFuIGlmIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtaW5Td2l0Y2hBbHRzOworCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBUaGUgZm9sbG93aW5nIGFyZSBNYXZlbiBzcGVjaWZpYyBwYXJhbWV0ZXJzLCByYXRoZXIgdGhhbiBzcGVjaWZpY2xseQorICAgICAqIG9wdGlvbnMgdGhhdCB0aGUgQU5UTFIgdG9vbCBjYW4gdXNlLgorICAgICAqLworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgYWxsIHRoZSBncmFtbWFycyB0aGF0IHNob3VsZAorICAgICAqIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZSBwaGFzZSBvZiB0aGUgcGx1Z2luLiBOb3RlIHRoYXQgdGhlIHBsdWdpbgorICAgICAqIGlzIHNtYXJ0IGVub3VnaCB0byByZWFsaXplIHRoYXQgaW1wb3J0ZWQgZ3JhbW1hcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGJ1dAorICAgICAqIG5vdCBhY3RlZCB1cG9uIGRpcmVjdGx5IGJ5IHRoZSBBTlRMUiBUb29sLgorICAgICAqCisgICAgICogVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZSBpbmNsdWRlIGxpc3Qgc2NhbnMgZm9yIGFuZCBpbmNsdWRlcyBhbGwKKyAgICAgKiBmaWxlcyB0aGF0IGVuZCBpbiAiLmciIGluIGFueSBkaXJlY3RvcnkgYmVuZWF0aCBzcmMvbWFpbi9hbnRscjMuIE5vdGUgdGhhdAorICAgICAqIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIGxvb2tzIGZvciB0aGUgZGlyZWN0b3J5IGFudGxyMyBhbmQgbm90IHRoZSBkaXJlY3RvcnkKKyAgICAgKiBhbnRsciwgc28gYXMgdG8gYXZvaWQgY2xhc2hlcyBhbmQgY29uZnVzaW9uIGZvciBwcm9qZWN0cyB0aGF0IHVzZSBib3RoIHYyIGFuZCB2MyBncmFtbWFycworICAgICAqIHN1Y2ggYXMgQU5UTFIgaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQgaW5jbHVkZXMgPSBuZXcgSGFzaFNldCgpOworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGFuIGV4cGxpY2l0IGxpc3Qgb2YgYW55IGdyYW1tYXJzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20KKyAgICAgKiB0aGUgZ2VuZXJhdGUgcGhhc2Ugb2YgdGhlIHBsdWdpbi4gRmlsZXMgbGlzdGVkIGhlcmUgd2lsbCBub3QgYmUgc2VudCBmb3IKKyAgICAgKiBwcm9jZXNzaW5nIGJ5IHRoZSBBTlRMUiB0b29sLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCisgICAgICogQHJlcXVpcmVkCisgICAgICogQHJlYWRvbmx5CisgICAgICovCisgICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBwcm9qZWN0OworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgQW50bHIgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZ3JhbW1hciBmaWxlcy4gRm9yCisgICAgICogYW50bHIgdmVyc2lvbiAzLnggd2UgZGVmYXVsdCB0aGlzIHRvIGEgZGlyZWN0b3J5IGluIHRoZSB0cmVlCisgICAgICogY2FsbGVkIGFudGxyMyBiZWNhdXNlIHRoZSBhbnRsciBkaXJlY3RvcnkgaXMgb2NjdXBpZWQgYnkgdmVyc2lvbgorICAgICAqIDIueCBncmFtbWFycy4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtiYXNlZGlyfS9zcmMvbWFpbi9hbnRscjMiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZURpcmVjdG9yeTsKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIEphdmEgZmlsZXMuIEZvciBhbnRsciB2ZXJzaW9uIDMueCB3ZSBkZWZhdWx0CisgICAgICogdGhpcyB0byBhIGRpcmVjdG9yeSBpbiB0aGUgdHJlZSBjYWxsZWQgYW50bHIzIGJlY2F1c2UgdGhlIGFudGxyCisgICAgICogZGlyZWN0b3J5IGlzIG9jY3VwaWVkIGJ5IHZlcnNpb24gMi54IGdyYW1tYXJzLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9hbnRscjMiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiBmb3IgaW1wb3J0ZWQgdG9rZW4gZmlsZXMsIGUuZy4gPGNvZGU+LnRva2VuczwvY29kZT4gYW5kIGltcG9ydGVkIGdyYW1tYXJzLgorICAgICAqIE5vdGUgdGhhdCBBTlRMUiB3aWxsIG5vdCB0cnkgdG8gcHJvY2VzcyBncmFtbWFycyB0aGF0IGl0IGZpbmRzIHRvIGJlIGltcG9ydGVkCisgICAgICogaW50byBvdGhlciBncmFtbWFycyAoaW4gdGhlIHNhbWUgcHJvY2Vzc2luZyBzZXNzaW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtiYXNlZGlyfS9zcmMvbWFpbi9hbnRscjMvaW1wb3J0cyIKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgbGliRGlyZWN0b3J5OworCisgICAgcHVibGljIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc291cmNlRGlyZWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRMaWJEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBsaWJEaXJlY3Rvcnk7CisgICAgfQorCisgICAgdm9pZCBhZGRTb3VyY2VSb290KEZpbGUgb3V0cHV0RGlyKSB7CisgICAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3Qob3V0cHV0RGlyLmdldFBhdGgoKSk7CisgICAgfQorICAgIC8qKgorICAgICAqIEFuIGluc3RhbmNlIG9mIHRoZSBBTlRMUiB0b29sIGJ1aWxkCisgICAgICovCisgICAgcHJvdGVjdGVkIFRvb2wgdG9vbDsKKworICAgIC8qKgorICAgICAqIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGlzIE1vam8sIGl0IGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nCisgICAgICogQU5UTFIgMy54IGdyYW1tYXJzIGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBzcGVjaWZpZWQgYnkgdGhlIGdyYW1tYXIuCisgICAgICogCisgICAgICogQHRocm93cyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uIFdoZW4gc29tZXRoaW5nIGlzIGRpc2NvdmVyZWQgc3VjaCBhcyBhIG1pc3Npbmcgc291cmNlCisgICAgICogQHRocm93cyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbiBXaGVuIHNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbnMgc3VjaCBhcyBub3QgYmVpbmcgYWJsZSB0byBjcmVhdGUgdGhlIEFOVExSIFRvb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgTG9nIGxvZyA9IGdldExvZygpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdXNlciBhc2tlZCBmb3IgZGVidWcgaW5mb3JtYXRpb24sIHRoZW4gZHVtcCBhbGwgdGhlCisgICAgICAgIC8vIHBhcmFtZXRlcnMgd2UgaGF2ZSBwaWNrZWQgdXAgaWYgdGhleSBkaWQuCisgICAgICAgIC8vCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCisgICAgICAgICAgICAvLyBFeGNsdWRlcworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGUgOiAoU2V0PFN0cmluZz4pIGV4Y2x1ZGVzKSB7CisKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBFeGNsdWRlOiAiICsgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluY2x1ZGVzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZm9yIChTdHJpbmcgZSA6IChTZXQ8U3RyaW5nPikgaW5jbHVkZXMpIHsKKworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQU5UTFI6IEluY2x1ZGU6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT3V0cHV0IGxvY2F0aW9uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbG9nLmRlYnVnKCJBTlRMUjogT3V0cHV0OiAiICsgb3V0cHV0RGlyZWN0b3J5KTsKKworICAgICAgICAgICAgLy8gTGlicmFyeSBkaXJlY3RvcnkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBMaWJyYXJ5OiAiICsgbGliRGlyZWN0b3J5KTsKKworICAgICAgICAgICAgLy8gRmxhZ3MKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiByZXBvcnQgICAgICAgICAgICAgIDogIiArIHJlcG9ydCk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBwcmludEdyYW1tYXIgICAgICAgIDogIiArIHByaW50R3JhbW1hcik7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBkZWJ1ZyAgICAgICAgICAgICAgIDogIiArIGRlYnVnKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQU5UTFI6IHByb2ZpbGUgICAgICAgICAgICAgOiAiICsgcHJvZmlsZSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBuZmEgICAgICAgICAgICAgICAgIDogIiArIG5mYSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBkZmEgICAgICAgICAgICAgICAgIDogIiArIGRmYSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiB0cmFjZSAgICAgICAgICAgICAgIDogIiArIHRyYWNlKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQU5UTFI6IG1lc3NhZ2VGb3JtYXQgICAgICAgOiAiICsgbWVzc2FnZUZvcm1hdCk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkFOVExSOiBtYXhTd2l0Y2hDYXNlTGFiZWxzIDogIiArIG1heFN3aXRjaENhc2VMYWJlbHMpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJBTlRMUjogbWluU3dpdGNoQWx0cyAgICAgICA6ICIgKyBtaW5Td2l0Y2hBbHRzKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQU5UTFI6IHZlcmJvc2UgICAgICAgICAgICAgOiAiICsgdmVyYm9zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBwYXRoIGlzIGFsbCBpbiB0YWN0IHNvIHRoYXQKKyAgICAgICAgLy8gQU5UTFIgY2FuIGp1c3Qgd3JpdGUgaW50byBpdC4KKyAgICAgICAgLy8KKyAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKKworICAgICAgICBpZiAoIW91dHB1dERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlyc3QgdGhpbmcgd2UgbmVlZCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgQU5UTFIgMy4xIGJ1aWxkIHRvb2wKKyAgICAgICAgLy8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEFOVExSIFRvb2wgYnVsZCBpbnRlcmZhY2UKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB0b29sID0gbmV3IFRvb2woKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVGhlIGF0dGVtcHQgdG8gY3JlYXRlIHRoZSBBTlRMUiBidWlsZCB0b29sIGZhaWxlZCwgc2VlIGV4Y2VwdGlvbiByZXBvcnQgZm9yIGRldGFpbHMiKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKCJKaW0gZmFpbGVkIHlvdSEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5leHQgd2UgbmVlZCB0byBzZXQgdGhlIG9wdGlvbnMgZ2l2ZW4gdG8gdXMgaW4gdGhlIHBvbSBpbnRvIHRoZQorICAgICAgICAvLyB0b29sIGluc3RhbmNlIHdlIGhhdmUgY3JlYXRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgdG9vbC5zZXREZWJ1ZyhkZWJ1Zyk7CisgICAgICAgIHRvb2wuc2V0R2VuZXJhdGVfREZBX2RvdChkZmEpOworICAgICAgICB0b29sLnNldEdlbmVyYXRlX05GQV9kb3QobmZhKTsKKyAgICAgICAgdG9vbC5zZXRQcm9maWxlKHByb2ZpbGUpOworICAgICAgICB0b29sLnNldFJlcG9ydChyZXBvcnQpOworICAgICAgICB0b29sLnNldFByaW50R3JhbW1hcihwcmludEdyYW1tYXIpOworICAgICAgICB0b29sLnNldFRyYWNlKHRyYWNlKTsKKyAgICAgICAgdG9vbC5zZXRWZXJib3NlKHZlcmJvc2UpOworICAgICAgICB0b29sLnNldE1lc3NhZ2VGb3JtYXQobWVzc2FnZUZvcm1hdCk7CisgICAgICAgIHRvb2wuc2V0TWF4U3dpdGNoQ2FzZUxhYmVscyhtYXhTd2l0Y2hDYXNlTGFiZWxzKTsKKyAgICAgICAgdG9vbC5zZXRNaW5Td2l0Y2hBbHRzKG1pblN3aXRjaEFsdHMpOworCisgICAgICAgIC8vIFdoZXJlIGRvIHdlIHdhbnQgQU5UTFIgdG8gcHJvZHVjZSBpdHMgb3V0cHV0PyAoQmFzZSBkaXJlY3RvcnkpCisgICAgICAgIC8vCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJPdXRwdXQgZGlyZWN0b3J5IGJhc2Ugd2lsbCBiZSAiICsgb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICB0b29sLnNldE91dHB1dERpcmVjdG9yeShvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIC8vIFRlbGwgQU5UTFIgdGhhdCB3ZSBhbHdheXMgd2FudCB0aGUgb3V0cHV0IGZpbGVzIHRvIGJlIHByb2R1Y2VkIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgICAgIC8vIHVzaW5nIHRoZSBzYW1lIHJlbGF0aXZlIHBhdGggYXMgdGhlIGlucHV0IGZpbGUgd2FzIHRvIHRoZSBpbnB1dCBkaXJlY3RvcnkuCisgICAgICAgIC8vCisgICAgICAgIHRvb2wuc2V0Rm9yY2VSZWxhdGl2ZU91dHB1dCh0cnVlKTsKKworICAgICAgICAvLyBXaGVyZSBkbyB3ZSB3YW50IEFOVExSIHRvIGxvb2sgZm9yIC50b2tlbnMgYW5kIGltcG9ydCBncmFtbWFycz8KKyAgICAgICAgLy8KKyAgICAgICAgdG9vbC5zZXRMaWJEaXJlY3RvcnkobGliRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBpZiAoIXNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0luZm9FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiTm8gQU5UTFIgZ3JhbW1hcnMgdG8gY29tcGlsZSBpbiAiICsgc291cmNlRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkFOVExSOiBQcm9jZXNzaW5nIHNvdXJjZSBkaXJlY3RvcnkgIiArIHNvdXJjZURpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgd29ya2luZyBkaXJlY3RvcnkgZm9yIEFOVExSIHRvIGJlIHRoZSBiYXNlIHNvdXJjZSBkaXJlY3RvcnkKKyAgICAgICAgLy8KKyAgICAgICAgdG9vbC5zZXRJbnB1dERpcmVjdG9yeShzb3VyY2VEaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIE5vdyBwaWNrIHVwIGFsbCB0aGUgZmlsZXMgYW5kIHByb2Nlc3MgdGhlbSB3aXRoIHRoZSBUb29sCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcHJvY2Vzc0dyYW1tYXJGaWxlcyhzb3VyY2VEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSk7CisKKyAgICAgICAgfSBjYXRjaCAoSW5jbHVzaW9uU2NhbkV4Y2VwdGlvbiBpZSkgeworCisgICAgICAgICAgICBsb2cuZXJyb3IoaWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhdGFsIGVycm9yIG9jY3VyZWQgd2hpbGUgZXZhbHVhdGluZyB0aGUgbmFtZXMgb2YgdGhlIGdyYW1tYXIgZmlsZXMgdG8gYW5hbHl6ZSIpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldExvZygpLmVycm9yKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKworCisgICAgICAgIHRvb2wucHJvY2VzcygpOworCisgICAgICAgIC8vIElmIGFueSBvZiB0aGUgZ3JhbW1hciBmaWxlcyBjYXVzZWQgZXJyb3JzIGJ1dCBkaWQgbnRvIHRocm93IGV4Y2VwdGlvbnMKKyAgICAgICAgLy8gdGhlbiB3ZSBzaG91bGQgaGF2ZSBhY2N1bXVsYXRlZCBlcnJvcnMgaW4gdGhlIGNvdW50cworICAgICAgICAvLworICAgICAgICBpZiAodG9vbC5nZXROdW1FcnJvcnMoKSA+IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJBTlRMUiBjYXVnaHQgIiArIHRvb2wuZ2V0TnVtRXJyb3JzKCkgKyAiIGJ1aWxkIGVycm9ycy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbCBsb29rcyBnb29kLCBzbyB3ZSBuZWVkIHRvIHRlbCBNYXZlbiBhYm91dCB0aGUgc291cmNlcyB0aGF0CisgICAgICAgIC8vIHdlIGp1c3QgY3JlYXRlZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGVsbCBNYXZlbiB0aGF0IHRoZXJlIGFyZSBzb21lIG5ldyBzb3VyY2UgZmlsZXMgdW5kZXJuZWF0aAorICAgICAgICAgICAgLy8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYWRkU291cmNlUm9vdCh0aGlzLmdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VEaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gb3V0cHV0RGlyZWN0b3J5CisgICAgICogQHRocm93cyBhbnRsci5Ub2tlblN0cmVhbUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgYW50bHIuUmVjb2duaXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLkluY2x1c2lvblNjYW5FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyYW1tYXJGaWxlcyhGaWxlIHNvdXJjZURpcmVjdG9yeSwgRmlsZSBvdXRwdXREaXJlY3RvcnkpCisgICAgICAgICAgICB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBJbmNsdXNpb25TY2FuRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gV2hpY2ggZmlsZXMgdW5kZXIgdGhlIHNvdXJjZSBzZXQgc2hvdWxkIHdlIGJlIGxvb2tpbmcgZm9yIGFzIGdyYW1tYXIgZmlsZXMKKyAgICAgICAgLy8KKyAgICAgICAgU291cmNlTWFwcGluZyBtYXBwaW5nID0gbmV3IFN1ZmZpeE1hcHBpbmcoImciLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOworCisgICAgICAgIC8vIFdoYXQgYXJlIHRoZSBzZXRzIG9mIGluY2x1ZGVzIChkZWZhdWx0ZWQgb3Igb3RoZXJ3aXNlKS4KKyAgICAgICAgLy8KKyAgICAgICAgU2V0IGluY2x1ZGVzID0gZ2V0SW5jbHVkZXNQYXR0ZXJucygpOworCisgICAgICAgIC8vIE5vdywgdG8gdGhlIGV4Y2x1ZGVzLCB3ZSBuZWVkIHRvIGFkZCB0aGUgaW1wb3J0cyBkaXJlY3RvcnkKKyAgICAgICAgLy8gYXMgdGhpcyBpcyBhdXRvc2Nhbm5lZCBmb3IgaW1wb3J0ZCBncmFtbWFycyBhbmQgc28gaXMgYXV0by1leGNsdWRlZCBmcm9tIHRoZQorICAgICAgICAvLyBzZXQgb2YgZ3JhbWFtciBmaWVscyB3ZSBzaHVvbGQgYmUgYW5hbHl6aW5nLgorICAgICAgICAvLworICAgICAgICBleGNsdWRlcy5hZGQoImltcG9ydHMvKioiKTsKKworICAgICAgICBTb3VyY2VJbmNsdXNpb25TY2FubmVyIHNjYW4gPSBuZXcgU2ltcGxlU291cmNlSW5jbHVzaW9uU2Nhbm5lcihpbmNsdWRlcywgZXhjbHVkZXMpOworCisgICAgICAgIHNjYW4uYWRkU291cmNlTWFwcGluZyhtYXBwaW5nKTsKKyAgICAgICAgU2V0IGdyYW1tYXJGaWxlcyA9IHNjYW4uZ2V0SW5jbHVkZWRTb3VyY2VzKHNvdXJjZURpcmVjdG9yeSwgbnVsbCk7CisKKyAgICAgICAgaWYgKGdyYW1tYXJGaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRMb2coKS5pc0luZm9FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJObyBncmFtbWFycyB0byBwcm9jZXNzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIEFOVExSIHRvb2wgdGhhdCB3ZSB3YW50IHNvcnRlZCBidWlsZCBtb2RlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdG9vbC5zZXRNYWtlKHRydWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJdGVyYXRlIGVhY2ggZ3JhbW1hciBmaWxlIHdlIHdlcmUgZ2l2ZW4gYW5kIGFkZCBpdCBpbnRvIHRoZSB0b29sJ3MgbGlzdCBvZgorICAgICAgICAgICAgLy8gZ3JhbW1hcnMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmb3IgKEZpbGUgZ3JhbW1hciA6IChTZXQ8RmlsZT4pIGdyYW1tYXJGaWxlcykgeworCisgICAgICAgICAgICAgICAgaWYgKGdldExvZygpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkdyYW1tYXIgZmlsZSAnIiArIGdyYW1tYXIuZ2V0UGF0aCgpICsgIicgZGV0ZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVsUGF0aCA9IGZpbmRTb3VyY2VTdWJkaXIoc291cmNlRGlyZWN0b3J5LCBncmFtbWFyLmdldFBhdGgoKSkgKyBncmFtbWFyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChnZXRMb2coKS5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCIgIC4uLiByZWxhdGl2ZSBwYXRoIGlzOiAiICsgcmVsUGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvb2wuYWRkR3JhbW1hckZpbGUocmVsUGF0aCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZ2V0SW5jbHVkZXNQYXR0ZXJucygpIHsKKyAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwgfHwgaW5jbHVkZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCIqKi8qLmciKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5jbHVkZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgRmlsZSBvYmplY3QgYW5kIHRoZSBmdWxsIFBBVEggdG8gYQorICAgICAqIGdyYW1tYXIsIHByb2R1Y2UgdGhlIHBhdGggdG8gdGhlIG5hbWVkIGdyYW1tYXIgZmlsZSBpbiByZWxhdGl2ZQorICAgICAqIHRlcm1zIHRvIHRoZSBzb3VyY2VEaXJlY3RvcnkuIFRoaXMgd2lsbCB0aGVuIGFsbG93IEFOVExSIHRvCisgICAgICogcHJvZHVjZSBvdXRwdXQgcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb2YgdGhlIG91dHB1dCBkaXJlY3RvcnkgYW5kCisgICAgICogcmVmbGVjdCB0aGUgaW5wdXQgb3JnYW5pemF0aW9uIG9mIHRoZSBncmFtbWFyIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSBUaGUgc291cmNlIGRpcmVjdG9yeSBGaWxlIG9iamVjdAorICAgICAqIEBwYXJhbSBncmFtbWFyRmlsZU5hbWUgVGhlIGZ1bGwgcGF0aCB0byB0aGUgaW5wdXQgZ3JhbW1hciBmaWxlCisgICAgICogQHJldHVybiBUaGUgcGF0aCB0byB0aGUgZ3JhbW1hciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmluZFNvdXJjZVN1YmRpcihGaWxlIHNvdXJjZURpcmVjdG9yeSwgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSkgeworICAgICAgICBTdHJpbmcgc3JjUGF0aCA9IHNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcjsKKworICAgICAgICBpZiAoIWdyYW1tYXJGaWxlTmFtZS5zdGFydHNXaXRoKHNyY1BhdGgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleHBlY3RlZCAiICsgZ3JhbW1hckZpbGVOYW1lICsgIiB0byBiZSBwcmVmaXhlZCB3aXRoICIgKyBzb3VyY2VEaXJlY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSB1bnByZWZpeGVkR3JhbW1hckZpbGVOYW1lID0gbmV3IEZpbGUoZ3JhbW1hckZpbGVOYW1lLnN1YnN0cmluZyhzcmNQYXRoLmxlbmd0aCgpKSk7CisKKyAgICAgICAgcmV0dXJuIHVucHJlZml4ZWRHcmFtbWFyRmlsZU5hbWUuZ2V0UGFyZW50KCkgKyBGaWxlLnNlcGFyYXRvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvaW1wb3J0LmFwdCBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9leGFtcGxlcy9pbXBvcnQuYXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTQ5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvaW1wb3J0LmFwdApAQCAtMCwwICsxLDggQEAKK0ltcG9ydGVkIEdyYW1tYXIgRmlsZXMKKworIEluIG9yZGVyIHRvIGhhdmUgdGhlIEFOVExSIHBsdWdpbiBhdXRvbWF0aWNhbGx5IGxvY2F0ZSBhbmQgdXNlIGdyYW1tYXJzIHVzZWQKKyBhcyBpbXBvcnRzIGluIHlvdXIgbWFpbiAuZyBmaWxlcywgeW91IG5lZWQgdG8gcGxhY2UgdGhlIGltcG9ydGVkIGdyYW1tYXIKKyBmaWxlcyBpbiB0aGUgaW1wb3J0cyBkaXJlY3RvcnkgYmVuZWF0aCB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgeW91ciBncmFtbWFyCisgZmlsZXMgKHdoaWNoIGlzIDw8PHNyYy9tYWluL2FudGxyMz4+PiBieSBkZWZhdWx0IG9mIGNvdXJzZSkuCisKKyBGb3IgYSBkZWZhdWx0IGxheW91dCwgcGxhY2UgeW91ciBpbXBvcnQgZ3JhbW1hcnMgaW4gdGhlIGRpcmVjdG9yeTogPDw8c3JjL21haW4vYW50bHIzL2ltcG9ydHM+Pj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9leGFtcGxlcy9saWJyYXJpZXMuYXB0IGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2V4YW1wbGVzL2xpYnJhcmllcy5hcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjZTc5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9leGFtcGxlcy9saWJyYXJpZXMuYXB0CkBAIC0wLDAgKzEsNDcgQEAKK0xpYnJhcmllcworCisgVGhlIGludHJvZHVjdGlvbiBvZiB0aGUgaW1wb3J0IGRpcmVjdGl2ZSBpbiBhIGdyYW1tYXIgYWxsb3dzIHJldXNlIG9mIGNvbW1vbiBncmFtbWFyIGZpbGVzCisgYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byBkaXZpZGUgdXAgZnVuY3Rpb25hbCBjb21wb25lbnRzIG9mIGxhcmdlIGdyYW1tYXJzLiBIb3dldmVyIGl0IGhhcworIGNhdXNlZCBzb21lIGNvbmZ1c2lvbiBpbiByZWdhcmQgdG8gdGhlIGZhY3QgdGhhdCBnZW5lcmF0ZWQgdm9jYWIgZmlsZXMgKDw8PHh4eC50b2tlbnM+Pj4pIGNhbiBhbHNvCisgYmUgc2VhcmNoZWQgZm9yIHdpdGggdGhlIDw8PDxsaWJEaXJlY3Rvcnk+Pj4+IGRpcmVjdGl2ZS4KKworIFRoaXMgaGFzIGNvbmZ1c2VkIHR3byBzZXBhcmF0ZSBmdW5jdGlvbnMgYW5kIGltcG9zZXMgYSBzdHJ1Y3R1cmUgdXBvbiB0aGUgbGF5b3V0IG9mCisgeW91ciBncmFtbWFyIGZpbGVzIGluIGNlcnRhaW4gY2FzZXMuIElmIHlvdSBoYXZlIGdyYW1tYXJzIHRoYXQgYm90aCB1c2UgdGhlIGltcG9ydAorIGRpcmVjdGl2ZSBhbmQgYWxzbyByZXF1aXJlIHRoZSB1c2Ugb2YgYSB2b2NhYiBmaWxlIHRoZW4geW91IHdpbGwgbmVlZCB0byBsb2NhdGUKKyB0aGUgZ3JhbW1hciB0aGF0IGdlbmVyYXRlcyB0aGUgLnRva2VucyBmaWxlIGFsb25nc2lkZSB0aGUgZ3JhbW1hciB0aGF0IHVzZXMgaXQuIFRoaXMKKyBpcyBiZWNhdXNlIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSA8PDw8bGliRGlyZWN0b3J5Pj4+PiBkaXJlY3RpdmUgdG8gc3BlY2lmeSB0aGUKKyBsb2NhdGlvbiBvZiB5b3VyIGltcG9ydGVkIGdyYW1tYXJzIGFuZCBBTlRMUiB3aWxsIG5vdCBmaW5kIGFueSB2b2NhYiBmaWxlcyBpbgorIHRoaXMgZGlyZWN0b3J5LgorCisgVGhlIC50b2tlbnMgZmlsZXMgZm9yIGFueSBncmFtbWFycyBhcmUgZ2VuZXJhdGVkIHdpdGhpbiB0aGUgc2FtZSBvdXRwdXQgZGlyZWN0b3J5IHN0cnVjdHVyZQorIGFzIHRoZSAuamF2YSBmaWxlcy4gU28sIHdoZXJlZXZlciB0aGUgLmphdmEgZmlsZXMgYXJlIGdlbmVyYXRlZCwgeW91IHdpbGwgYWxzbyBmaW5kIHRoZSAudG9rZW5zCisgZmlsZXMuIEFOVExSIGxvb2tzIGZvciAudG9rZW5zIGZpbGVzIGluIGJvdGggdGhlIDw8PDxsaWJEaXJlY3Rvcnk+Pj4+IGFuZCB0aGUgb3V0cHV0IGRpcmVjdG9yeQorIHdoZXJlIGl0IGlzIHBsYWNpbmcgdGhlIGdlZW5yYXRlZCAuamF2YSBmaWxlcy4gSGVuY2Ugd2hlbiB5b3UgbG9jYXRlIHRoZSBncmFtbWFycyB0aGF0IGdlbmVyYXRlCisgLnRva2VucyBmaWxlcyBpbiB0aGUgc2FtZSBzb3VyY2UgZGlyZWN0b3J5IGFzIHRoZSBvbmVzIHRoYXQgdXNlIHRoZSAudG9rZW5zIGZpbGVzLCB0aGVuCisgdGhlIE1hdmVuIHBsdWdpbiB3aWxsIGZpbmQgdGhlIGV4cGVjdGVkIC50b2tlbnMgZmlsZXMuCisKKyBUaGUgPDw8PGxpYkRpcmVjdG9yeT4+Pj4gaXMgc3BlY2lmaWVkIGxpa2UgYW55IG90aGVyIGRpcmVjdG9yeSBwYXJhbWV0ZXIgaW4gTWF2ZW4uIEhlcmUgaXMgYW4KKyBleGFtcGxlOgorCisrLS0KKzxwbHVnaW4+CisgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFudGxyMy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+My4xLjMtMTwvdmVyc2lvbj4KKworICAgIDxleGVjdXRpb25zPgorCisgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFudGxyPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgPGxpYkRpcmVjdG9yeT5zcmMvbWFpbi9hbnRscl9pbXBvcnRzPC9saWJEaXJlY3Rvcnk+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9uPgorICAgIDwvZXhlY3V0aW9ucz4KKzwvcGx1Z2luPgorKy0tCisKKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2ltcGxlLmFwdCBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9leGFtcGxlcy9zaW1wbGUuYXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2ltcGxlLmFwdApAQCAtMCwwICsxLDQwIEBACitTaW1wbGUgY29uZmlndXJhdGlvbgorCisgSWYgeW91ciBncmFtbWFyIGZpbGVzIGFyZSBvcmdhbml6ZWQgaW50byB0aGUgZGVmYXVsdCBsb2NhdGlvbnMgYXMgZGVzY3JpYmVkIGluIHRoZSB7e3suLi9pbmRleC5odG1sfWludHJvZHVjdGlvbn19LAorIHRoZW4gY29uZmlndXJpbmcgdGhlIHBvbS54bWwgZmlsZSBmb3IgeW91ciBwcm9qZWN0IGlzIGFzIHNpbXBsZSBhcyBhZGRpbmcgdGhpcyB0byBpdAorCisrLS0KKzxwbHVnaW5zPgorPHBsdWdpbj4KKyAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+YW50bHIzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4zLjEuMy0xPC92ZXJzaW9uPgorICAgIDxleGVjdXRpb25zPgorICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgIDxnb2FsPmFudGxyPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgPC9leGVjdXRpb24+CisgICAgPC9leGVjdXRpb25zPgorPC9wbHVnaW4+CisuLi4KKzwvcGx1Z2lucz4KKystLQorCisgV2hlbiB0aGUgbXZuIGNvbW1hbmQgaXMgZXhlY3V0ZWQgYWxsIGdyYW1tYXIgZmlsZXMgdW5kZXIgPDw8c3JjL21haW4vYW50bHIzPj4+LCBleGNlcHQgYW55CisgaW1wb3J0IGdyYW1tYXJzIHVuZGVyIDw8PHNyYy9tYWluL2FudGxyMy9pbXBvcnRzPj4+IHdpbGwgYmUgYW5hbHl6ZWQgYW5kIGNvbnZlcnRlZCB0bworIGphdmEgc291cmNlIGNvZGUgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkgPDw8dGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2FudGxyMz4+Pi4KKworIFlvdXIgaW5wdXQgZmlsZXMgdW5kZXIgPDw8YW50bHIzPj4+IHNob3VsZCBiZSBzdG9yZWQgaW4gc3ViIGRpcmVjdG9yaWVzIHRoYXQKKyByZWZsZWN0IHRoZSBwYWNrYWdlIHN0cnVjdHVyZSBvZiB5b3VyIGphdmEgcGFyc2Vycy4gSWYgeW91ciBncmFtbWFyIGZpbGUgcGFyc2VyLmcgY29udGFpbnM6CisKKystLS0KK0BoZWFkZXIgeworcGFja2FnZSBvcmcuamltaS50aGVtdXNzOworfQorKy0tLQorCisgVGhlbiB0aGUgLmcgZmlsZSBzaG91bGQgYmUgc3RvcmVkIGluOiA8PDxzcmMvbWFpbi9hbnRscjMvb3JnL2ppbWkvdGhlbXVzcy9wYXJzZXIuZz4+Pi4gVEhpcyB3YXkKKyB0aGUgZ2VuZXJhdGVkIC5qYXZhIGZpbGVzIHdpbGwgY29ycmVjdGx5IHJlZmxlY3QgdGhlIHBhY2thZ2Ugc3RydWN0dXJlIGluIHdoaWNoIHRoZXkgd2lsbAorIGZpbmFsbHkgcmVzdCBhcyBjbGFzc2VzLgorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI0OTVhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApAQCAtMCwwICsxLDYzIEBACisgICAgICAgICAtLS0tLS0tLS0tLS0tCisgICAgICAgICBBTlRMUiB2MyBNYXZlbiBQbHVnaW4KKyAgICAgICAgIC0tLS0tLS0tLS0tLS0KKyAgICAgICAgIEppbSBJZGxlCisgICAgICAgICAtLS0tLS0tLS0tLS0tCisgICAgICAgICBNYXJjaCAyMDA5CisgICAgICAgICAtLS0tLS0tLS0tLS0tCisKK0FOVExSIHYzIE1hdmVuIHBsdWdpbgorCisgVGhlIEFOVExSIHYzIE1hdmVuIHBsdWdpbiBpcyBjb21wbGV0ZWx5IHJlLXdyaXR0ZW4gYXMgb2YgdmVyc2lvbiAzLjEuMzsgaWYgeW91IGFyZSBmYW1pbGlhcgorIHdpdGggcHJpb3IgdmVyc2lvbnMsIHlvdSBzaG91bGQgbm90ZSB0aGF0IHRoZXJlIGFyZSBzb21lIGJlaGF2aW9yYWwgZGlmZmVyZW5jZXMgdGhhdCBtYWtlCisgaXQgd29ydGh3aGlsZSByZWFkaW5nIHRoaXMgZG9jdW1lbnRhdGlvbi4gCisKKyBUaGUgam9iIG9mIHRoZSBwbHVnaW4gaXMgZXNzZW50aWFsbHkgdG8gdGVsbCB0aGUgc3RhbmRhcmQgQU5UTFIgcGFyc2VyIGdlbmVyYXRvciB3aGVyZSB0aGUKKyBpbnB1dCBncmFtbWFyIGZpbGVzIGFyZSBhbmQgd2hlcmUgdGhlIG91dHB1dCBmaWxlcyBzaG91bGQgYmUgZ2VuZXJhdGVkLiBBcyB3aXRoIGFsbCBNYXZlbgorIHBsdWdpbnMsIHRoZXJlIGFyZSBkZWZhdWx0cywgd2hpY2ggeW91IGFyZSBhZHZpc2VkIHRvIGNvbXBseSB0bywgYnV0IGFyZSBub3QgZm9yY2VkIHRvCisgY29tcGx5IHRvLgorCisgVGhpcyB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4gYWxsb3dzIGZ1bGwgY29udHJvbCBvdmVyIEFOVExSIGFuZCBhbGxvd3MgY29uZmlndXJhdGlvbiBvZiBhbGwKKyBvcHRpb25zIHRoYXQgYXJlIHVzZWZ1bCBmb3IgYSBidWlsZCBzeXN0ZW0uIFRoZSBjb2RlIHJlcXVpcmVkIHRvIGNhbGN1bGF0ZSBkZXBlbmRlbmNpZXMsCisgY2hlY2sgdGhlIGJ1aWxkIG9yZGVyLCBhbmQgb3RoZXJ3aXNlIHdvcmsgd2l0aCB5b3VyIGdyYW1tYXIgZmlsZXMgaXMgYnVpbHQgaW50byB0aGUgQU5UTFIKKyB0b29sIGFzIG9mIHZlcnNpb24gMy4xLjMgb2YgQU5UTFIgYW5kIHRoaXMgcGx1Z2luLgorCisqIFBsdWdpbiBWZXJzaW9uaW5nCisKKyBUaGUgcGx1Z2luIHZlcnNpb24gdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBBTlRMUiB0b29sIHRoYXQgaXQgY29udHJvbHMuIEhlbmNlIGlmIHlvdQorIHVzZSB2ZXJzaW9uIDMuMS4zIG9mIHRoZSBwbHVnaW4sIHlvdSB3aWxsIGJ1aWxkIHlvdXIgZ3JhbW1hcnMgdXNpbmcgdmVyc2lvbiAzLjEuMyBvZiB0aGUKKyBBTlRMUiB0b29sLCB2ZXJzaW9uIDMuMiBvZiB0aGUgcGx1Z2luIHdpbGwgdXNlIHZlcnNpb24gMy4yIG9mIHRoZSBBTlRMUiB0b29sIGFuZCBzbyBvbi4KKworIFlvdSBtYXkgYWxzbyBmaW5kIHRoYXQgdGhlcmUgYXJlIHBhdGNoIHZlcnNpb25zIG9mIHRoZSBwbHVnaW4gc3VjaGFzIDMuMS4zLTEgMy4xLjMtMiBhbmQKKyBzbyBvbi4gVXNlIHRoZSBsYXRlc3QgcGF0Y2ggcmVsZWFzZSBvZiB0aGUgcGx1Z2luLgorCisgVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIGlzIHNob3duIGF0IHRoZSB0b3Agb2YgdGhpcyBwYWdlIGFmdGVyIHRoZSA8PExhc3QgRGVwbG95ZWQ+PiBkYXRlLgorIAorCisqIERlZmF1bHQgZGlyZWN0b3JpZXMKKworIEFzIHdpdGggYWxsIE1hdmVuIHBsdWdpbnMsIHRoaXMgcGx1Z2luIHdpbGwgYXV0b21hdGljYWxseSBkZWZhdWx0IHRvIHN0YW5kYXJkIGxvY2F0aW9ucworIGZvciB5b3VyIGdyYW1tYXIgYW5kIGltcG9ydCBmaWxlcy4gT3JnYW5pemluZyB5b3VyIHNvdXJjZSBjb2RlIHRvIHJlZmxlY3QgdGhpcyBzdGFuZGFyZAorIGxheW91dCB3aWxsIGdyZWF0bHkgcmVkdWNlIHRoZSBjb25maWd1cmF0aW9uIGVmZm9ydCByZXF1aXJlZC4gVGhlIHN0YW5kYXJkIGxheW91dCBsb29rZAorIGxpa2UgdGhpczoKKworKy0tCisgc3JjL21haW4vCisgICAgICB8CisgICAgICArLS0tIGFudGxyMy8uLi4gLmcgZmlsZXMgb3JnYW5pemVkIGluIHRoZSByZXF1aXJlZCBwYWNrYWdlIHN0cnVjdHVyZQorICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICArLS0tIGltcG9ydHMvICAuZyBmaWxlcyB0aGF0IGFyZSBpbXBvcnRlZCBieSBvdGhlciBncmFtbWFycy4KKystLQorCisgSWYgeW91ciBncmFtbWFyIGlzIGludGVuZGVkIHRvIGJlIHBhcnQgb2YgYSBwYWNrYWdlIGNhbGxlZCBvcmcuZm9vLmJhciB0aGVuIHlvdSB3b3VsZAorIHBsYWNlIGl0IGluIHRoZSBkaXJlY3RvcnkgPDw8c3JjL21haW4vYW50bHIzL29yZy9mb28vYmFyPj4+LiBUaGUgcGx1Z2luIHdpbGwgdGhlbiBwcm9kdWNlCisgLmphdmEgYW5kIC50b2tlbnMgZmlsZXMgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkgPDw8dGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2FudGxyMy9vcmcvZm9vL2Jhcj4+PgorIFdoZW4gdGhlIEphdmEgZmlsZXMgYXJlIGNvbXBpbGVkIHRoZXkgd2lsbCBiZSBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgdGhlIGphdmFjCisgY29tcGlsZXIgd2l0aG91dCBhbnkgc3BlY2lhbCBjb25maWd1cmF0aW9uLiBUaGUgZ2VuZXJhdGVkIGphdmEgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkKKyBzdWJtaXR0ZWQgZm9yIGNvbXBpbGF0aW9uIGJ5IHRoZSBwbHVnaW4uCisKKyBUaGUgPDw8c3JjL21haW4vYW50bHIzL2ltcG9ydHM+Pj4gZGlyZWN0b3J5IGlzIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheS4gSXQgc2hvdWxkIGNvbnRhaW4KKyBhbnkgZ3JhbW1hciBmaWxlcyB0aGF0IGFyZSBpbXBvcnRlZCBieSBvdGhlciBncmFtbWFyIGZpbGVzIChkbyBub3QgbWFrZSBzdWJkaXJlY3RvcmllcyBoZXJlLikKKyBTdWNoIGZpbGVzIGFyZSBuZXZlciBidWlsdCBvbiB0aGVpciBvd24sIGJ1dCB0aGUgcGx1Z2luIHdpbGwgYXV0b21hdGljYWxseSB0ZWxsIHRoZSBBTlRMUgorIHRvb2wgdG8gbG9vayBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcy4KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L3VzYWdlLmFwdC52bSBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC91c2FnZS5hcHQudm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YWQwZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9hbnRscjMtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC91c2FnZS5hcHQudm0KQEAgLTAsMCArMSwxOTMgQEAKK1VzYWdlCisKKyBUaGUgTWF2ZW4gcGx1Z2luIGZvciBhbnRsciBpcyBzaW1wbGUgdG8gdXNlIGJ1dCBpcyBhdCBpdHMgc2ltcGxlc3Qgd2hlbiB5b3UgdXNlIHRoZSBkZWZhdWx0CisgbGF5b3V0cyBmb3IgeW91ciBncmFtbWFycywgYXMgc286CisKKystLQorIHNyYy9tYWluLworICAgICAgfAorICAgICAgKy0tLSBhbnRscjMvLi4uIC5nIGZpbGVzIG9yZ2FuaXplZCBpbiB0aGUgcmVxdWlyZWQgcGFja2FnZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKy0tLSBpbXBvcnRzLyAgLmcgZmlsZXMgdGhhdCBhcmUgaW1wb3J0ZWQgYnkgb3RoZXIgZ3JhbW1hcnMuCisrLS0KKworIEhvd2V2ZXIsIGlmIHlvdSBhcmUgbm90IGFibGUgdG8gdXNlIHRoaXMgc3RydWN0dXJlIGZvciB3aGF0ZXZlciByZWFzb24sIHlvdQorIGNhbiBjb25maWd1cmUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgZ3JhbW1hciBmaWxlcywgd2hlcmUgbGlicmFyeS9pbXBvcnQgZmlsZXMKKyBhcmUgbG9jYXRlZCBhbmQgd2hlcmUgdGhlIG91dHB1dCBmaWxlcyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorCisqIFBsdWdpbiBEZXNjcmlwdG9yCisKKyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4gaXMgc2hvd24gYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UgYWZ0ZXIgdGhlIDw8TGFzdCBEZXBsb3llZD4+IGRhdGUuCisKKyBUaGUgZnVsbCBsYXlvdXQgb2YgdGhlIGRlc2NyaXB0b3IgKGF0IGxlYXN0LCB0aG9zZSBwYXJ0cyB0aGF0IGFyZSBub3Qgc3RhbmRhcmQgTWF2ZW4gdGhpbmdzKSwKKyBzaG93aW5nIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBpcyBhcyBmb2xsb3dzOgorCisrLS0KKzxwbHVnaW4+CisgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFudGxyMy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+My4xLjMtMTwvdmVyc2lvbj4KKworICAgIDxleGVjdXRpb25zPgorICAgICAgICAKKyAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPGdvYWw+YW50bHI8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICA8Y29udmVyc2lvblRpbWVvdXQ+MTAwMDA8L2NvbnZlcnNpb25UaW1lb3V0PgorICAgICAgICAgICAgICAgIDxkZWJ1Zz5mYWxzZTwvZGVidWc+CisgICAgICAgICAgICAgICAgPGRmYT5mYWxzZTwvZGZhPgorICAgICAgICAgICAgICAgIDxuZmE+ZmFsc2U8L25mYT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+PGV4Y2x1ZGUvPjwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPjxpbmNsdWRlLz48L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxsaWJEaXJlY3Rvcnk+c3JjL21haW4vYW50bHIzL2ltcG9ydHM8L2xpYkRpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZUZvcm1hdD5hbnRscjwvbWVzc2FnZUZvcm1hdD4KKyAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9hbnRscjM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8cHJpbnRHcmFtbWFyPmZhbHNlPC9wcmludEdyYW1tYXI+CisgICAgICAgICAgICAgICAgPHByb2ZpbGU+ZmFsc2U8L3Byb2ZpbGU+CisgICAgICAgICAgICAgICAgPHJlcG9ydD5mYWxzZTwvcmVwb3J0PgorICAgICAgICAgICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW4vYW50bHIzPC9zb3VyY2VEaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPHRyYWNlPmZhbHNlPC90cmFjZT4KKyAgICAgICAgICAgICAgICA8dmVyYm9zZT50cnVlPC92ZXJib3NlPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICA8L2V4ZWN1dGlvbnM+CisKKzwvcGx1Z2luPgorKy0tCisKKyBOb3RlIHRoYXQgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZXhlY3V0aW9ucywgYW5kIHRodXMgYnVpbGQgc29tZSBncmFtbWFycyB3aXRoIGRpZmZlcmVudAorIG9wdGlvbnMgdG8gb3RoZXJzIChzdWNoIGFzIHNldHRpbmcgdGhlIGRlYnVnIG9wdGlvbiBmb3IgaW5zdGFuY2UpLgorCisqKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKworKioqIHJlcG9ydAorCisgICAgSWYgc2V0IHRvIHRydWUsIHRoZW4gYWZ0ZXIgdGhlIHRvb2wgaGFzIHByb2Nlc3NlZCBhbiBpbnB1dCBncmFtbWFyIGZpbGUKKyAgICBpdCB3aWxsIHJlcG9ydCB2YXJpYW91cyBzdGF0aXN0aWNzIGFib3V0IHRoZSBwYXJzZXIsIHN1Y2ggYXMgaW5mb3JtYXRpb24KKyAgICBvbiBjeWNsaWMgREZBcywgd2hpY2ggcnVsZXMgbWF5IHVzZSBiYWNrdHJhY2tpbmcsIGFuZCBzbyBvbi4KKworICAgIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorCisqKiogcHJpbnRHcmFtbWFyCisKKyAgICBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgQU5UTFIgdG9vbCB3aWxsIHByaW50IGEgdmVyc2lvbiBvZiB0aGUgaW5wdXQKKyAgICBncmFtbWFyIHdoaWNoIGlzIGRldm9pZCBvZiBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZSBwcmVzZW50IGluIHRoZSBpbnB1dCBmaWxlLgorCisgICAgZGVmYXVsdC12YWx1ZSA9ICJmYWxzZSIKKworKioqIGRlYnVnCisKKyAgICAgSWYgc2V0IHRvIHRydWUsIHRoZW4gdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBBTlRMUiBjb2RlIGdlbmVyYXRvciB3aWxsCisgICAgIGJlIHNldCB0byBkZWJ1ZyBtb2RlLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiBydW4sIHRoZSBjb2RlIHdpbGwgJ2hhbmcnIGFuZAorICAgICB3YWl0IGZvciBhIGRlYnVnIGNvbm5lY3Rpb24gb24gYSBUQ1AgcG9ydCAoNDkxMDAgYnkgZGVmYXVsdCkuCisgICAgIAorICAgICBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKKyAgICAgCisqKiogcHJvZmlsZQorCisgICAgIElmIHNldCB0byB0cnVlLCB0aGVuIHRoZW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIgd2lsbCBjb21wdXRlIGFuZCByZXBvcnQgb24KKyAgICAgcHJvZmlsZSBpbmZvcm1hdGlvbiBhdCBydW50aW1lLgorICAgICAKKyAgICAgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCisgICAgIAorKioqIG5mYQorCisgICAgIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIEFOVExSIHRvb2wgd2lsbCBnZW5lcmF0ZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBuZmEKKyAgICAgZm9yIGVhY2ggcnVsZSBpbiA8YSBocmVmPSJodHRwOi8vd3d3LmdyYXBodml6Lm9yZyI+RG90IGZvcm1hdDwvYT4KKyAgICAgCisgICAgIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorICAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZmE7CisgICAgCisqKiogZGZhCisKKyAgICAgSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgQU5UTFIgdG9vbCB3aWxsIGdlbmVyYXRlIGEgZGVzY3JpcHRpb24gb2YgdGhlIERGQQorICAgICBmb3IgZWFjaCBkZWNpc2lvbiBpbiB0aGUgZ3JhbW1hciBpbiA8YSBocmVmPSJodHRwOi8vd3d3LmdyYXBodml6Lm9yZyI+RG90IGZvcm1hdDwvYT4KKyAgICAgCisgICAgIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorICAgICAKKyoqKiB0cmFjZQorCisgICAgIElmIHNldCB0byB0cnVlLCB0aGUgZ2VuZXJhdGVkIHBhcnNlciBjb2RlIHdpbGwgbG9nIHJ1bGUgZW50cnkgYW5kIGV4aXQgcG9pbnRzCisgICAgIHRvIHN0ZG91dCBhcyBhbiBhaWQgdG8gZGVidWdnaW5nLgorICAgICAKKyAgICAgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCisgICAgIAorKioqIG1lc3NhZ2VGb3JtYXQKKworICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IGFueSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2VzIHJldHVybmVkCisgICAgIGJ5IEFOTFRSLCBzaG9vdWxkIGJlIGZvcm1hdHRlZCBpbiB0aGUgc3BlY2lmaWVkIHdheS4gQ3VycmVudGx5LCBBTlRMUiBzdXBwb3J0cyB0aGUKKyAgICAgYnVpbHQtaW4gZm9ybWF0cyBvZiBhbnRsciwgZ251IGFuZCB2czIwMDUuCisKKyAgICAgZGVmYXVsdC12YWx1ZT0iYW50bHIiCisgICAgIAorKioqIHZlcmJvc2UKKworICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBBTlRMUiB3aWxsIHJlcG9ydCBhbGwgc29ydHMgb2YgdGhpbmdzCisgICAgIGFib3V0IHdoYXQgaXQgaXMgZG9pbmcgc3VjaCBhcyB0aGUgbmFtZXMgb2YgZmlsZXMgYW5kIHRoZSB2ZXJzaW9uIG9mIEFOVExSIGFuZCBzbyBvbi4KKyAgICAgCisgICAgIGRlZmF1bHQtdmFsdWU9InRydWUiCisgICAgIAorKioqIGNvbnZlcnNpb25UaW1lb3V0CisKKyAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgQU5UTFIgd2lsbCB3YWl0IGZvciBhbmFseXNpcyBvZiBlYWNoCisgICAgIGFsdGVybmF0aXZlIGluIHRoZSBncmFtbWFyIHRvIGNvbXBsZXRlIGJlZm9yZSBnaXZpbmcgdXAuIFlvdSBtYXkgcmFpc2UKKyAgICAgdGhpcyB2YWx1ZSBpZiBBTlRMUiBnaXZlcyB1cCBvbiBhIGNvbXBsaWNhdGVkIGFsdCBhbmQgdGVsbHMgeW91IHRoYXQKKyAgICAgdGhlcmUgYXJlIGxvdHMgb2YgYW1iaWd1dGllcywgYnV0IHlvdSBrbm93IHRoYXQgaXQganVzdCBuZWVkZWQgdG8gc3BlbmQKKyAgICAgbW9yZSB0aW1lIG9uIGl0LiBOb3RlIHRoYXQgdGhpcyBpcyBhbiBhYnNvbHV0ZSB0aW1lIGFuZCBub3QgQ1BVIHRpbWUuCisgICAgIAorICAgICBkZWZhdWx0LXZhbHVlPSIxMDAwMCIKKyAgICAgCisqKiogaW5jbHVkZXMKKworICAgICBQcm92aWRlcyBhbiBleHBsaWNpdCBsaXN0IG9mIGFsbCB0aGUgZ3JhbW1hcnMgdGhhdCBzaG91bGQKKyAgICAgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlIHBoYXNlIG9mIHRoZSBwbHVnaW4uIE5vdGUgdGhhdCB0aGUgcGx1Z2luCisgICAgIGlzIHNtYXJ0IGVub3VnaCB0byByZWFsaXplIHRoYXQgaW1wb3J0ZWQgZ3JhbW1hcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGJ1dAorICAgICBub3QgYWN0ZWQgdXBvbiBkaXJlY3RseSBieSB0aGUgQU5UTFIgVG9vbC4KKyAgICAgCisgICAgIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgaW5jbHVkZSBsaXN0IHNjYW5zIGZvciBhbmQgaW5jbHVkZXMgYWxsCisgICAgIGZpbGVzIHRoYXQgZW5kIGluICIuZyIgaW4gYW55IGRpcmVjdG9yeSBiZW5lYXRoIHNyYy9tYWluL2FudGxyMy4gTm90ZSB0aGF0CisgICAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIGxvb2tzIGZvciB0aGUgZGlyZWN0b3J5IGFudGxyMyBhbmQgbm90IHRoZSBkaXJlY3RvcnkKKyAgICAgYW50bHIsIHNvIGFzIHRvIGF2b2lkIGNsYXNoZXMgYW5kIGNvbmZ1c2lvbiBmb3IgcHJvamVjdHMgdGhhdCB1c2UgYm90aCB2MiBhbmQgdjMgZ3JhbW1hcnMKKyAgICAgc3VjaCBhcyBBTlRMUiBpdHNlbGYuCisgICAgIAorKioqIGV4Y2x1ZGVzCisKKyAgICAgUHJvdmlkZXMgYW4gZXhwbGljaXQgbGlzdCBvZiBhbnkgZ3JhbW1hcnMgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbQorICAgICB0aGUgZ2VuZXJhdGUgcGhhc2Ugb2YgdGhlIHBsdWdpbi4gRmlsZXMgbGlzdGVkIGhlcmUgd2lsbCBub3QgYmUgc2VudCBmb3IKKyAgICAgcHJvY2Vzc2luZyBieSB0aGUgQU5UTFIgdG9vbC4KKyAgICAgCisqKiogc291cmNlRGlyZWN0b3J5CisKKyAgICAgU3BlY2lmaWVzIHRoZSBBbnRsciBkaXJlY3RvcnkgY29udGFpbmluZyBncmFtbWFyIGZpbGVzLiBGb3IKKyAgICAgYW50bHIgdmVyc2lvbiAzLnggd2UgZGVmYXVsdCB0aGlzIHRvIGEgZGlyZWN0b3J5IGluIHRoZSB0cmVlCisgICAgIGNhbGxlZCBhbnRscjMgYmVjYXVzZSB0aGUgYW50bHIgZGlyZWN0b3J5IGlzIG9jY3VwaWVkIGJ5IHZlcnNpb24KKyAgICAgMi54IGdyYW1tYXJzLgorCisgICAgIDw8TkI+PiBUYWtlIGNhcmVmdWwgbm90ZSB0aGF0IHRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciBhbnRsciBncmFtbWFycworICAgICBpcyBub3cgPDxhbnRscjM+PiBhbmQgTk9UIDw8YW50bHI+PgorCisgICAgIGRlZmF1bHQtdmFsdWU9Ijw8PCR7YmFzZWRpcn0vc3JjL21haW4vYW50bHIzPj4+IgorICAgICAKKyoqKiBvdXRwdXREaXJlY3RvcnkKKworICAgICBMb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIEphdmEgZmlsZXMuIEZvciBhbnRsciB2ZXJzaW9uIDMueCB3ZSBkZWZhdWx0CisgICAgIHRoaXMgdG8gYSBkaXJlY3RvcnkgaW4gdGhlIHRyZWUgY2FsbGVkIGFudGxyMyBiZWNhdXNlIHRoZSBhbnRscgorICAgICBkaXJlY3RvcnkgaXMgb2NjdXBpZWQgYnkgdmVyc2lvbiAyLnggZ3JhbW1hcnMuCisgICAgIAorICAgICBkZWZhdWx0LXZhbHVlPSI8PDwke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9hbnRscjM+Pj4iCisgICAgIAorKioqIGxpYkRpcmVjdG9yeQorCisgICAgIExvY2F0aW9uIGZvciBpbXBvcnRlZCB0b2tlbiBmaWxlcywgZS5nLiA8Y29kZT4udG9rZW5zPC9jb2RlPiBhbmQgaW1wb3J0ZWQgZ3JhbW1hcnMuCisgICAgIE5vdGUgdGhhdCBBTlRMUiB3aWxsIG5vdCB0cnkgdG8gcHJvY2VzcyBncmFtbWFycyB0aGF0IGl0IGZpbmRzIGluIHRoaXMgZGlyZWN0b3J5LCBidXQKKyAgICAgd2lsbCBpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggZm9yIC50b2tlbnMgZmlsZXMgYW5kIGltcG9ydCBncmFtbWFycy4KKworICAgICA8PE5CPj4gSWYgeW91IGNoYW5nZSB0aGUgbGliIGRpcmVjdG9yeSBmcm9tIHRoZSBkZWZhdWx0IGJ1dCB0aGUgZGlyZWN0b3J5IGlzCisgICAgIHN0aWxsIHVuZGVyPDw8JHtiYXNlZGlyfS9zcmMvbWFpbi9hbnRscjM+Pj4sIHRoZW4geW91IHdpbGwgbmVlZCB0byBleGNsdWRlCisgICAgIHRoZSBncmFtbWFycyBmcm9tIHByb2Nlc3Npbmcgc3BlY2lmaWNhbGx5LCB1c2luZyB0aGUgPDw8PGV4Y2x1ZGVzPj4+PiBvcHRpb24uCisKKyAgICAgZGVmYXVsdC12YWx1ZT0iPDw8JHtiYXNlZGlyfS9zcmMvbWFpbi9hbnRscjMvaW1wb3J0cz4+PiIKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi9hbnRsci0zLjQvYW50bHIzLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDBjNTJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPHByb2plY3QgbmFtZT0iQU5UTFIgdjMgTWF2ZW4gcGx1Z2luIj4KKworICA8cHVibGlzaERhdGUgcG9zaXRpb249ImxlZnQiLz4KKyAgPHZlcnNpb24gcG9zaXRpb249ImxlZnQiLz4KKworICA8cG93ZXJlZEJ5PgorICAgIDxsb2dvIG5hbWU9IkFOVExSIFdlYiBTaXRlIiBocmVmPSJodHRwOi8vYW50bHIub3JnLyIKKyAgICAgICAgICBpbWc9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZG93bmxvYWQvYXR0YWNobWVudHMvMjkyL0FOVExSMyIvPgorICA8L3Bvd2VyZWRCeT4KKworICA8Ym9keT4KKyAgICA8bGlua3M+CisgICAgICA8aXRlbSBuYW1lPSJBbnRsciBXZWIgU2l0ZSIgaHJlZj0iaHR0cDovL3d3dy5hbnRsci5vcmcvIi8+CisgICAgPC9saW5rcz4KKworICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KKyAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iVXNhZ2UiIGhyZWY9InVzYWdlLmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJFeGFtcGxlcyI+CisgICAgICA8aXRlbSBuYW1lPSJTaW1wbGUgY29uZmlndXJhdGlvbnMiIGhyZWY9ImV4YW1wbGVzL3NpbXBsZS5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJVc2luZyBsaWJyYXJ5IGRpcmVjdG9yaWVzIiBocmVmPSJleGFtcGxlcy9saWJyYXJpZXMuaHRtbCIvPgorICAgICAgPGl0ZW0gbmFtZT0iVXNpbmcgaW1wb3J0ZWQgZ3JhbW1hcnMiIGhyZWY9ImV4YW1wbGVzL2ltcG9ydC5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiAvPgorICAgIDxtZW51IHJlZj0ibW9kdWxlcyIgLz4KKworICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHJqYXIueG1sIGIvYW50bHItMy40L2FudGxyamFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg4Zjk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2FudGxyamFyLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCisgICAgVGhpcyBmaWxlIGRlZmluZXMgd2hhdCBnb2VzIGluIHRvIEFOVExSIFViZXIgamFyLCB3aGljaCBpbmNsdWRlcworICAgIGFsbCBvZiB0aGUgY2xhc3NlcyB3ZSBuZWVkIHRvIHJ1biBhbiBleGVjdXRhYmxlIGphciBpbiBzdGFuZGFsb25lCisgICAgbW9kZS4KKyAgLS0+Cis8YXNzZW1ibHk+CisKKyAgICA8IS0tCisgICAgICAgIFRoaXMgaXMgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZSB1YmVyIGphcgorICAgICAgICBvbmNlIGl0IGlzIGphcmVkIHVwLgorICAgICAgLS0+CisgICAgPGlkPmNvbXBsZXRlamFyPC9pZD4KKworICAgIDwhLS0KKyAgICAgICAgVGhlIG9ubHkgb3V0cHV0IGZvcm1hdCB3ZSBuZWVkIGlzIHRoZSBleGVjdXRhYmxlIGphciBmaWxlCisgICAgICAtLT4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisKKyAgICA8IS0tCisgICAgICAgIE1ha2UgYWxsIGphcnMgdW5wYWNrIGF0IHRoZSBzYW1lIGxldmVsIGFuZCBkb24ndCBpbmNsdWRlCisgICAgICAgIGFueSBleHRyYW5lb3VzIGRpcmVjdG9yaWVzLgorICAgICAgLS0+CisgICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKworICAgIDwhLS0KKyAgICAgICAgV2hpY2ggb2YgdGhlIG1vZHVsZXMgdGhhdCB0aGUgbWFzdGVyIHBvbSBidWlsZHMgZG8gd2UKKyAgICAgICAgd2lzaCB0byBpbmNsdWRlIGluIHRoZSB1YmVyIGphci4gV2UgYXJlIGluY2x1ZGluZworICAgICAgICBkZXBlbmRlbmNpZXMsIHNvIHdlIG9ubHkgbmVlZCB0byBuYW1lIHRoZSBUb29sIG1vZHVsZQorICAgICAgICBhbmQgdGhlIGd1bml0IG1vZHVsZS4KKyAgICAgIC0tPgorICAgIDxtb2R1bGVTZXRzPgorCisgICAgICAgIDxtb2R1bGVTZXQ+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYW50bHI6YW50bHI8L2luY2x1ZGU+CisgICAgICAgICAgCisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIE9mIHRoZSBiaW5hcmllcywgc3VjaCBhcyB0aGUgZGVwZW5kZW5jaWVzIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgYWJvdmUgbW9kdWxlcyBuZWVkLCB3aGljaCBkbyB3ZSB3YW50IGFuZCB3aGljaCBkbyB3ZSBub3QuCisgICAgICAgICAgICAgICAgQ3VycmVudGx5IHdlIHdhbnQgYWxsIHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIFRvb2wgamFyLgorICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDxiaW5hcmllcz4KKworICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjbHVkZSB0aGUgYW50bHItbWFzdGVyIHBvbSBmcm9tIHRoZSBqYXIgLSB3ZSBkb24ndCBuZWVkIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0IGNhdXNlcyBzaWxseSB0aGluZ3MgdG8gaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5wYWNrIHRoZSBiaW5hcnkgZGVwZW5kZW5jaWVzIHNvIHdlIGhhdmUgYSBuaWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWJlciBqYXIgdGhhdCBjYW4gcnVuIHdpdGggamF2YSAtamFyIGFuZCBuZWVkIG5vdCBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xBU1NQQVRIIGNvbmZpZ3VyZWQgYW5kIHNvIG9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5U2V0cz4KKworCisgICAgICAgICAgICA8L2JpbmFyaWVzPgorCisgICAgICAgIDwvbW9kdWxlU2V0PgorICAgICAgIAorICAgIDwvbW9kdWxlU2V0cz4KKworICAgIDwhLS0KKyAgICAgICAgV2hhdCBkbyB3ZSB3YW50IHRvIGluY2x1ZGUgaW4gdGhlIGphciBmcm9tIGVhY2ggcHJvamVjdAorICAgICAgLS0+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKworICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIFdlIG5lZWQgdGhlIG91dHB1dCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZXRjLgorICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX08L2RpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+CisKKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvYW50bHJzb3VyY2VzLnhtbCBiL2FudGxyLTMuNC9hbnRscnNvdXJjZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2M3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvYW50bHJzb3VyY2VzLnhtbApAQCAtMCwwICsxLDE3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorCisgICAgVGhpcyBpcyB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBmb3IgYnVpbGRpbmcgYSBmdWxsIHNvdXJjZSBjb2RlCisgICAgZGlzdHJpYnV0aW9uIG9mIEFOVExSIGFuZCBhbGwgaXRzIHJlbGF0ZWQgY29tcG9uZW50cy4gVGhpcyBhc3NlbWJseQorICAgIG9ubHkgaW5jbHVkZXMgdGhlIEphdmEgb3JpZW50ZWQgc291cmNlIGNvZGUsIGhlbmNlIG9ubHkgdGhlIEphdmEgcnVudGltZQorICAgIGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgamFyLgorCisgICAgVGhlIHJlc3VsdGluZyBqYXIgaXMgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIGV4cGFuZGVkIHdpdGg6CisKKyAgICAgIGphciB4dmYgYW50bHItbWFzdGVyLTMueC54LXNyYy5qYXIKKworICAgIFRoZSBvdXRwdXQgZGlyZWN0b3J5IHdpbGwgYmUgYW50bHItbWFzdGVyLTMueC54IGFuZCBpbiBoZXJlIHdpbGwgYmUKKyAgICB0aGUgQlVJTEQudHh0IGZpZSwgd2hpY2ggZXhwbGFpbnMgaG93IHRvIGJ1aWxkIEFOVExSLgorCisgICAgSmltIElkbGUgLSBNYXksIDIwMDkKKyAtLT4KKzxhc3NlbWJseT4KKworICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhpcyBhc3NlbWJseSBkZXNjcmlwdG9yLCB3aGljaCBpcyByZWZlcmVuY2VkIGluCisgICAgICAgICB0aGUgbWFzdGVyIHBvbS54bWwgdXNpbmcgPGFzc2VtYmx5UmVmPiAoYWx0aG91Z2ggaW4gZmFjdCB3ZQorICAgICAgICAgcmVmZXJlbmNlIHRoZSBmaWxlIG5hbWUgdGhhdCBjb250YWlucyBpdCB0byBhdm9pZCBjbHV0dGVyaW5nCisgICAgICAgICB0aGUgcG9tLgorICAgICAgLS0+CisgICAgPGlkPnNyYzwvaWQ+CisKKyAgICA8IS0tIFdlIGhhdmUgZWxlY3RlZCB0byBwcm9kdWNlIG9ubHkgYSBqYXIgb3V0cHV0IGFuZCB0byB1c2UgdGhlIGxpbmUKKyAgICAgICAgIGVuZGluZ3Mgb2Ygd2hhdGV2ZXIgcGxhdGZvcm0gd2UgYXJlIHJ1bm5pbmcgb24uIE1vcmUgZm9ybWF0cworICAgICAgICAgY2FuIGJlIGFkZGVkIGZvciBzaW11bHRhbmVvdXMgcHJvZHVjdGlvbiwgc3VjaCBhcyA8Zm9ybWF0PnppcDwvZm9ybWF0PgorICAgICAgLS0+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorCisgICAgPCEtLQorICAgICAgICBUaGUgcmVzdWx0aW5nIGFyY2hpdmVzIHdpbGwgaGF2ZSBhIGJhc2UgZGlyZWN0b3J5IG5hbWVkIGFmdGVyIHRoZSBtYXN0ZXIKKyAgICAgICAgYXJ0aWZhY3QsIHJhdGhlciB0aGFuIGp1c3QgZXh0cmFjdCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgIC0tPgorICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKworICAgIDwhLS0gV2UgbmVlZCB0byBkZXNjcmliZWQgdGhlIHNvdXJjZSBjb2RlIG9mIGVhY2ggb2YgdGhlIG1vZHVsZXMgd2Ugd2FudAorICAgICAgICAgaW5jbHVkaW5nIGluIHRoZSBhcmNoaXZlLiBJbiB0aGUgbWFpbiB0aGlzIGlzIGJlY2F1c2Ugd2UgZGlkIG5vdCBzdG9yZQorICAgICAgICAgdGhlIG1vZHVsZXMgaW4gcGVyZm9yY2UgdXNpbmcgZGlyZWN0b3J5IG5hbWVzIHRoYXQgbWF0Y2ggdGhlIG1vZHVsZQorICAgICAgICAgbmFtZXMuIFRoaXMgd2FzIGZvciBoaXN0b3JpYyByZWFzb25zIGFzIHdlIGFscmVhZHkgbW92ZWQgZXZlcnl0aGluZworICAgICAgICAgYWJvdXQgbWFzc2l2ZWx5LCBqdXN0IHRvIG1vdmUgdG8gTWF2ZW4gaW4gdGhlIGZpcnN0IHBsYWNlLgorICAgICAgLS0+CisgICAgPG1vZHVsZVNldHM+CisKKyAgICAgICAgPCEtLSBEZXNjcmliZSB0aGUgZ1VuaXQgc291cmNlIGNvZGUuCisgICAgICAgICAgLS0+CisgICAgICAgIDxtb2R1bGVTZXQ+CisKKyAgICAgICAgICAgIDwhLS0gVGhlIE1hdmVuIGFydGlmYWN0IG5hbWUgdGVsbHMgdGhlIGFzc2VtYmx5IGFydGlmYWN0IGEgYnVuY2gKKyAgICAgICAgICAgICAgICAgb2YgaW5mb3JtYXRpb24gdG8gc3RhcnQgd2l0aCwgc3VjaCBhcyBpdHMgbG9jYXRpb24gaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgdHJlZSBhbmQgc28gb24uCisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hbnRscjphbnRsci1ydW50aW1lPC9pbmNsdWRlPgorICAgICAgICAgICAgPC9pbmNsdWRlcz4KKworICAgICAgICAgICAgPCEtLSBXaGF0IHNvdXJjZXMgZG8gd2Ugd2lzaCB0byBpbmNsdWRlIGZyb20gdGhpcyBtb2R1bGU/CisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPHNvdXJjZXM+CisKKyAgICAgICAgICAgICAgICA8IS0tIEJlY2F1c2UgdGhlIEphdmEgcnVudGltZSBzb3VyY2UgaXMgbm90IGluIGEgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgYW50bHItcnVudGltZSwgZGlyZWN0bHkgdW5kZXJuZWF0aCB0aGUgbWFzdGVyCisgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnksIHdlIG5lZWQgdG8gbWFwIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHNvIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2Ygc3RhcnRpbmcgd2l0aCB0aGUgbmFtZSBvZiB0aGUgYXJ0aWZhY3QsIGl0CisgICAgICAgICAgICAgICAgICAgICBpcyBpbiB0aGUgcGxhY2Ugd2hlcmUgdGhlIGJ1aWxkIGV4cGVjdHMgaXQuCisgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5TWFwcGluZz5ydW50aW1lL0phdmE8L291dHB1dERpcmVjdG9yeU1hcHBpbmc+CisKKyAgICAgICAgICAgICAgICA8ZmlsZVNldHM+CisgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIGhhdmUgb25lIGZpbGUgc2V0LCBiZWluZyB0aGUgc3JjIHN1Yi1kaXJlY3RvcnksIHdoaWNoIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgYXJjaGl2ZSwgd2UgYWxzbyB3YW50IHRvIGJlIGNhbGxlZCBzcmMvCisgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICA8L2ZpbGVTZXQ+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLSBJbiB0aGUgYmFzZSBydW50aW1lL0phdmEgZGlyZWN0b3J5LCB3ZSBuZWVkIHRvIGluY2x1ZGUgYSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZiBmaWxlcyB0aGF0IGVpdGhlciBkb2N1bWVudCB0aGUgbW9kdWxlIG9yIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGQuIFRoZXNlIGFyZSBub3QgdW5kZXJuZWF0aCB0aGUgc3JjIGRpcmVjdG9yeSBvZiBjb3Vyc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGV5IG5lZWQgdG8gYmUgbmFtZWQgaGVyZSAod2hpY2ggbmljZWx5IGRvY3VtZW50cyB3aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW5jbHVkZWQuCisgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+ZG94eWZpbGU8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+YW50bHIuY29uZmlnPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPC9maWxlU2V0PgorICAgICAgICAgICAgICAgIDwvZmlsZVNldHM+CisgICAgICAgICAgICA8L3NvdXJjZXM+CisKKyAgICAgICAgPC9tb2R1bGVTZXQ+CisKKyAgICAgICAgPCEtLSBEZXNjcmliZSB0aGUgQU5UTFIgdG9vbCBzb3VyY2UgY29kZS4KKyAgICAgICAgICAtLT4KKyAgICAgICAgPG1vZHVsZVNldD4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYW50bHI6YW50bHI8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorCisgICAgICAgICAgICA8IS0tIFdoYXQgc291cmNlcyBkbyB3ZSB3aXNoIHRvIGluY2x1ZGUgZnJvbSB0aGlzIG1vZHVsZT8KKyAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8c291cmNlcz4KKworICAgICAgICAgICAgICAgIDwhLS0gQmVjYXVzZSB0aGUgdG9vbCBzb3VyY2UgY29kZSBpcyBub3QgaW4gYSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhbnRsciwgbm9yIGRpcmVjdGx5IHVuZGVybmVhdGggdGhlIG1hc3RlcgorICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LCB3ZSBuZWVkIHRvIG1hcCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHN0YXJ0aW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIGFydGlmYWN0LCBpdAorICAgICAgICAgICAgICAgICAgICAgaXMgaW4gdGhlIHBsYWNlIHdoZXJlIHRoZSBidWlsZCBleHBlY3RzIGl0LgorICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeU1hcHBpbmc+dG9vbDwvb3V0cHV0RGlyZWN0b3J5TWFwcGluZz4KKworCisgICAgICAgICAgICAgICAgPGZpbGVTZXRzPgorCisgICAgICAgICAgICAgICAgICAgIDwhLS0gV2UgaGF2ZSBvbmUgZmlsZSBzZXQsIGJlaW5nIHRoZSBzcmMgc3ViLWRpcmVjdG9yeSwgd2hpY2ggaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGFyY2hpdmUsIHdlIGFsc28gd2FudCB0byBiZSBjYWxsZWQgc3JjLworICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNyYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICA8L2ZpbGVTZXQ+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLSBJbiB0aGUgYmFzZSB0b29sIGRpcmVjdG9yeSwgd2UgbmVlZCB0byBpbmNsdWRlIGEgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZmlsZXMgdGhhdCBlaXRoZXIgZG9jdW1lbnQgdGhlIG1vZHVsZSBvciBjb250cm9sIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkLiBUaGVzZSBhcmUgbm90IHVuZGVybmVhdGggdGhlIHNyYyBkaXJlY3Rvcnkgb2YgY291cnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhleSBuZWVkIHRvIGJlIG5hbWVkIGhlcmUgKHdoaWNoIG5pY2VseSBkb2N1bWVudHMgd2hhdAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluY2x1ZGVkLgorICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5wb20ueG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkNIQU5HRVMudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFQURNRS50eHQ8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+YW50bHIuY29uZmlnPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPC9maWxlU2V0PgorCisgICAgICAgICAgICAgICAgPC9maWxlU2V0cz4KKworICAgICAgICAgICAgPC9zb3VyY2VzPgorCisgICAgICAgIDwvbW9kdWxlU2V0PgorCisgICAgPC9tb2R1bGVTZXRzPgorCisgICAgPCEtLSBJbiB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIG1hc3RlciBidWlsZCBkaXJlY3RvcnkgKHRoZSByb290IG9mIGFsbAorICAgICAgICAgdGhlIG90aGVyIHNvdXJjZXMpLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZmlsZXMgdGhhdCBkZXNjcmliZSBvciBjb250cm9sCisgICAgICAgICB0aGUgYnVpbGQgKHN1Y2ggYXMgdGhlIG1hc3RlciBwb20ueG1sIGFuZCB0aGUgQlVJTEQudHh0IGZpbGVzKS4gSGVuY2UKKyAgICAgICAgIHdlIG5lZWQgdG8gZGVzY3JpYmUgdGhlbSBpbiB0aGVpciBvd24gZmlsZXNldC4gTm8gb3V0cHV0IG1hcHBpbmcgaXMgcmVxdWlyZWQgaGVyZQorICAgICAgICAgb2YgY291cnNlLgorICAgICAgLS0+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5wb20ueG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPmFudGxyamFyLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5hbnRscnNvdXJjZXMueG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPkJVSUxELnR4dDwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorCis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0LW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvYW50bHItMy40L2d1bml0LW1hdmVuLXBsdWdpbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWE1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKQEAgLTAsMCArMSwyNjkgQEAKKzwhLS0KKworIFtUaGUgIkJTRCBsaWNlbnNlIl0KKworIEFOVExSICAgICAgICAtIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIFRlcmVuY2UgUGFycgorIE1hdmVuIFBsdWdpbiAtIENvcHlyaWdodCAoYykgMjAwOSAgICAgIEppbSBJZGxlCisKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgIC0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDwhLS0KKyAgICAgICAgVGhlIEFOVExSIE1hdmVuIGFydGlmYWN0cyBhcmUgbm93IHJlbGVhc2VkIHZpYSB0aGUgU29ub3R5cGUgT1NTCisgICAgICAgIHJlcG9zaXRvcnksIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBhcmUgc3luY2VkIHRvIE1hdmVuIGNlbnRyYWwgCisgICAgICAgIHdpdGhpbiBhIGZldyBtaW51dGVzIG9mIGhpdHRpbmcgdGhlIHJlbGVhc2UgcmVwbyBmb3IgU29ub3R5cGUuCisgICAgICAgIFRvIGVuYWJsZSB0aGlzLCB3ZSBpbmhlcml0IGZyb20gdGhlIFNvbm90eXBlIHByb3ZpZGVkIHBhcmVudAorICAgICAgICBwb20uIEhvd2V2ZXIsIHdlIG11c3QgYWxzbyBjb25maWd1cmUgb3VyIC5tMi9zZXR0aW5ncy54bWwgdG8gaW5jbHVkZQorICAgICAgICB0aGUgc25hcHNob3QgYW5kIHN0YWdpbmcgc2VydmVyIGFuZCB0aGUgc29ub3R5cGUgcGFzc3dvcmQuIFRoaXMgCisgICAgICAgIG1lYW5zIHRoYXQgb25seSBBTlRMUiBkZXZlbG9wZXJzIGNhbiByZWxlYXNlZCB0aGUgYXJ0aWZhY3RzLCBidXQKKyAgICAgICAgYW55b25lIGNhbiBidWlsZCBsb2NhbGx5LgorICAgICAgLS0+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLm9zczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3NzLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NzwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4gCisgICAgCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHByZXJlcXVpc2l0ZXM+CisgICAgICAgIDxtYXZlbj4yLjA8L21hdmVuPgorICAgIDwvcHJlcmVxdWlzaXRlcz4KKworICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ndW5pdC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KKyAgICA8dmVyc2lvbj4zLjQ8L3ZlcnNpb24+CisKKyAgICA8bmFtZT5NYXZlbiBwbHVnaW4gZm9yIGdVbml0IEFOVExSIFYzLjQ8L25hbWU+CisJPGRlc2NyaXB0aW9uPkEgTWF2ZW4gcGx1Z2luIGZvciBpbmNvcnBvcmF0aW5nIGdVbml0IHRlc3Rpbmcgb2YgZ3JhbW1hcnM8L2Rlc2NyaXB0aW9uPgorICAgIDx1cmw+aHR0cDovL2FudGxyLm9yZzwvdXJsPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDwhLS0gV2hlcmUgZG8gd2UgdHJhY2sgYnVncyBmb3IgdGhpcyBwcm9qZWN0PworICAgICAgLS0+CisgICAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5KSVJBPC9zeXN0ZW0+CisgICAgICAgIDx1cmw+aHR0cDovL2FudGxyLm9yZy9qaXJhL2Jyb3dzZS9BTlRMUjwvdXJsPgorICAgIDwvaXNzdWVNYW5hZ2VtZW50PgorCisgICAgPCEtLSBMb2NhdGlvbiBvZiB0aGUgbGljZW5zZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBwcm9qZWN0CisgICAgICAtLT4KKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8bmFtZT5UaGUgQlNEIExpY2Vuc2U8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYW50bHIub3JnL0xJQ0VOU0UudHh0IDwvdXJsPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZS1zaWduLWFydGlmYWN0czwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmRlcGxveTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisgICAgCisgICAgPCEtLSBBbmNpbGxpYXJ5IGluZm9ybWF0aW9uIGZvciBjb21wbGV0ZW5lc3MKKyAgICAgIC0tPgorICAgIDxpbmNlcHRpb25ZZWFyPjIwMDk8L2luY2VwdGlvblllYXI+CisKKyAgICA8bWFpbGluZ0xpc3RzPgorICAgICAgICA8bWFpbGluZ0xpc3Q+CisgICAgICAgICAgICA8YXJjaGl2ZT5odHRwOi8vYW50bHIubWFya21haWwub3JnLzwvYXJjaGl2ZT4KKyAgICAgICAgICAgIDxvdGhlckFyY2hpdmVzPgorICAgICAgICAgICAgICAgIDxvdGhlckFyY2hpdmU+aHR0cDovL3d3dy5hbnRsci5vcmcvcGlwZXJtYWlsL2FudGxyLWludGVyZXN0Lzwvb3RoZXJBcmNoaXZlPgorICAgICAgICAgICAgPC9vdGhlckFyY2hpdmVzPgorICAgICAgICAgICAgPG5hbWU+QU5UTFIgVXNlcnM8L25hbWU+CisgICAgICAgICAgICA8c3Vic2NyaWJlPmh0dHA6Ly93d3cuYW50bHIub3JnL21haWxtYW4vbGlzdGluZm8vYW50bHItaW50ZXJlc3QvPC9zdWJzY3JpYmU+CisgICAgICAgICAgICA8dW5zdWJzY3JpYmU+aHR0cDovL3d3dy5hbnRsci5vcmcvbWFpbG1hbi9vcHRpb25zL2FudGxyLWludGVyZXN0LzwvdW5zdWJzY3JpYmU+CisgICAgICAgICAgICA8cG9zdD5hbnRsci1pbnRlcmVzdEBhbnRsci5vcmc8L3Bvc3Q+CisgICAgICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgPC9tYWlsaW5nTGlzdHM+CisKKyAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5BTlRMUi5vcmc8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hbnRsci5vcmc8L3VybD4KKyAgICA8L29yZ2FuaXphdGlvbj4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLQorCisgICAgIFdoYXQgYXJlIHdlIGRlcGVkZW50IG9uIGZvciB0aGUgTW9qb3MgdG8gZXhlY3V0ZT8gV2UgbmVlZCB0aGUKKyAgICAgcGx1Z2luIEFQSSBpdHNlbGYgYW5kIG9mIGNvdXJzZSB3ZSBuZWVkIHRoZSBBTlRMUiBUb29sIGFuZCBydW50aW1lCisgICAgIGFuZCBhbnkgb2YgdGhlaXIgZGVwZW5kZW5jaWVzLCB3aGljaCB3ZSBpbmhlcml0LiBUaGUgVG9vbCBpdHNlbGYgcHJvdmlkZXMKKyAgICAgdXMgd2l0aCBhbGwgdGhlIGRlcGVuZGVuY2llcywgc28gd2UgbmVlZCBvbmx5IG5hbWUgaXQgaGVyZS4KKyAgICAgIC0tPgorICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPCEtLQorICAgICAgICAgIFRoZSB0aGluZ3Mgd2UgbmVlZCB0byBidWlsZCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHJlY29nbml6ZXIKKyAgICAgICAgICAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS41LjM8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tCisgICAgICAgICBUaGUgdmVyc2lvbiBvZiBBTlRMUiB0b29sIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4gY29udHJvbHMuCisgICAgICAgICBXZSBoYXZlIGRlY2lkZWQgdGhhdCB0aGlzIHNob3VsZCBiZSBpbiBsb2Nrc3RlcCB3aXRoIEFOVExSIGl0c2VsZiwgb3RoZXIKKyAgICAgICAgIHRoYW4gLTEgLTIgLTMgZXRjIHBhdGNoIHJlbGVhc2VzLgorICAgICAgICAgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My40PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLQorICAgICAgICAgRGVwZW5kZW5jeSBvbiB0aGUgZ1VuaXQgYXJ0aWZhY3QuCisgICAgICAgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0KKyAgICAgICAgICBUZXN0aW5nIHJlcXVpcmVtZW50cy4uLgorICAgICAgICAgIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuOC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorCisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXRlc3RpbmctaGFybmVzczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAKKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAKKyAgICA8YnVpbGQ+CisKKyAgICAgICAgPGRlZmF1bHRHb2FsPmluc3RhbGw8L2RlZmF1bHRHb2FsPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+anNyMTQ8L3RhcmdldD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3lMb2NhdGlvbnNFbmFibGVkPmZhbHNlPC9kZXBlbmRlbmN5TG9jYXRpb25zRW5hYmxlZD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4gIAorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1zb3VyY2VzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKwkJCQorICAgICAgICAgICAgPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44PC92ZXJzaW9uPgorCQkJCTxleGVjdXRpb25zPgorCQkJCQk8ZXhlY3V0aW9uPgorCQkJCQkJPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+amFyPC9nb2FsPgorCQkJCQkJPC9nb2Fscz4KKwkJCQkJPC9leGVjdXRpb24+CisJCQkJPC9leGVjdXRpb25zPgorCQkJPC9wbHVnaW4+CisgICAgICAgICAgICAKKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9tb2pvL2FudGxyMy9HVW5pdEV4ZWN1dGVNb2pvLmphdmEgYi9hbnRsci0zLjQvZ3VuaXQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21vam8vYW50bHIzL0dVbml0RXhlY3V0ZU1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjNmNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9tb2pvL2FudGxyMy9HVW5pdEV4ZWN1dGVNb2pvLmphdmEKQEAgLTAsMCArMSw0MTAgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLm1vam8uYW50bHIzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuQXJ0aWZhY3RWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5EZWZhdWx0QXJ0aWZhY3RWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5PdmVyQ29uc3RyYWluZWRWZXJzaW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLm1hcHBpbmcuU291cmNlTWFwcGluZzsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5tYXBwaW5nLlN1ZmZpeE1hcHBpbmc7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci51dGlsLnNjYW4uU291cmNlSW5jbHVzaW9uU2Nhbm5lcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5TaW1wbGVTb3VyY2VJbmNsdXNpb25TY2FubmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLkluY2x1c2lvblNjYW5FeGNlcHRpb247CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJGaWxlU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5HcmFtbWFySW5mbzsKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuZ1VuaXRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuQWJzdHJhY3RUZXN0OworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5JbnRlcnA7CisKKy8qKgorICogVGFrZXMgZ1VuaXQgc2NyaXB0cyBhbmQgZGlyZWN0bHkgcGVyZm9ybXMgdGVzdGluZy4KKyAqCisgKiBAZ29hbCBndW5pdAorICoKKyAqIEBwaGFzZSB0ZXN0CisgKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiB0ZXN0CisgKiBAcmVxdWlyZXNQcm9qZWN0IHRydWUKKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEViZXJzb2xlCisgKi8KK3B1YmxpYyBjbGFzcyBHVW5pdEV4ZWN1dGVNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRMUl9HUk9VUF9JRCA9ICJvcmcuYW50bHIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVExSX0FSVElGQUNUX05BTUUgPSAiYW50bHIiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVExSX1JVTlRJTUVfQVJUSUZBQ1RfTkFNRSA9ICJhbnRsci1ydW50aW1lIjsKKworCS8qKgorICAgICAqIElOVEVSTkFMIDogVGhlIE1hdmVuIFByb2plY3QgdG8gd2hpY2ggd2UgYXJlIGF0dGFjaGVkCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKKworCS8qKgorCSAqIElOVEVSTkFMIDogVGhlIGFydGlmYWN0cyBhc3NvY2lhdGVkIHRvIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lZCBhcyBwYXJ0CisJICogb2Ygb3VyIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHdlIGFyZSBiZWluZyBhdHRhY2hlZC4KKwkgKgorCSAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwbHVnaW4uYXJ0aWZhY3RzfSIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKiBAcmVhZG9ubHkKKwkgKi8KKwlwcml2YXRlIExpc3Q8QXJ0aWZhY3Q+IHBsdWdpbkFydGlmYWN0czsKKworCS8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdVbml0IHRlc3RpbmcgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YmFzZWRpcn0vc3JjL3Rlc3QvZ3VuaXQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZURpcmVjdG9yeTsKKworICAgIC8qKgorICAgICAqIEEgc2V0IG9mIHBhdHRlcm5zIGZvciBtYXRjaGluZyBmaWxlcyBmcm9tIHRoZSBzb3VyY2VEaXJlY3RvcnkgdGhhdAorICAgICAqIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBnVW5pdCBzb3VyY2UgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQgaW5jbHVkZXM7CisKKyAgICAvKioKKyAgICAgKiBBIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU2V0IGV4Y2x1ZGVzOworCisJLyoqCisgICAgICogU3BlY2lmaWVzIGRpcmVjdG9yeSB0byB3aGljaCBnVW5pdCByZXBvcnRzIHNob3VsZCBnZXQgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtiYXNlZGlyfS90YXJnZXQvZ3VuaXQtcmVwb3J0IgorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByaXZhdGUgRmlsZSByZXBvcnREaXJlY3Rvcnk7CisKKwkvKioKKwkgKiBTaG91bGQgZ1VuaXQgZnVuY3Rpb25hbGl0eSBiZSBjb21wbGV0ZWx5IGJ5LXBhc3NlZD8KKwkgKiA8cC8+CisJICogQnkgZGVmYXVsdCB3ZSBza2lwIGdVbml0IHRlc3RzIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCB0aGF0IGFsbCB0ZXN0aW5nIGJlIHNraXBwZWQgdXNpbmcgJ21hdmVuLnRlc3Quc2tpcCcKKwkgKgorCSAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHttYXZlbi50ZXN0LnNraXB9IgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBza2lwOworCisJcHVibGljIFNldCBnZXRJbmNsdWRlUGF0dGVybnMoKSB7CisJCXJldHVybiBpbmNsdWRlcyA9PSBudWxsIHx8IGluY2x1ZGVzLmlzRW1wdHkoKQorCQkJCT8gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCAiKiovKi50ZXN0c3VpdGUiICkKKwkJCQk6IGluY2x1ZGVzOworCX0KKworCXB1YmxpYyBTZXQgZ2V0RXhjbHVkZVBhdHRlcm5zKCkgeworCQlyZXR1cm4gZXhjbHVkZXMgPT0gbnVsbAorCQkJCT8gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKQorCQkJCTogZXhjbHVkZXM7CisJfQorCisKKwlwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKwkJaWYgKCBza2lwICkgeworCQkJZ2V0TG9nKCkuaW5mbyggIlNraXBwaW5nIGdVbml0IHByb2Nlc3NpbmciICk7CisJCQlyZXR1cm47CisJCX0KKwkJQXJ0aWZhY3QgcGx1Z2luQW50bHJBcnRpZmFjdCA9IGRldGVybWluZVBsdWdpbkFudGxyQXJ0aWZhY3QoKTsKKworCQl2YWxpZGF0ZVByb2plY3RzQW50bHJWZXJzaW9uKCBkZXRlcm1pbmVBcnRpZmFjdFZlcnNpb24oIHBsdWdpbkFudGxyQXJ0aWZhY3QgKSApOworCisJCXBlcmZvcm1FeGVjdXRpb24oIGRldGVybWluZVByb2plY3RDb21waWxlU2NvcGVDbGFzc0xvYWRlciggcGx1Z2luQW50bHJBcnRpZmFjdCApICk7CisJfQorCisJcHJpdmF0ZSBBcnRpZmFjdCBkZXRlcm1pbmVQbHVnaW5BbnRsckFydGlmYWN0KCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworCQlmb3IgKCBBcnRpZmFjdCBhcnRpZmFjdCA6IHBsdWdpbkFydGlmYWN0cyApIHsKKwkJCWJvb2xlYW4gbWF0Y2ggPSBBTlRMUl9HUk9VUF9JRC5lcXVhbHMoIGFydGlmYWN0LmdldEdyb3VwSWQoKSApCisJCQkJCSYmIEFOVExSX0FSVElGQUNUX05BTUUuZXF1YWxzKCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKTsKKwkJCWlmICggbWF0Y2ggKSB7CisJCQkJcmV0dXJuIGFydGlmYWN0OworCQkJfQorCQl9CisJCXRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAorCQkJCSJVbmV4cGVjdGVkIHN0YXRlIDogY291bGQgbm90IGxvY2F0ZSAiICsgQU5UTFJfR1JPVVBfSUQgKyAnOicgKyBBTlRMUl9BUlRJRkFDVF9OQU1FICsKKwkJCQkJCSIgaW4gcGx1Z2luIGRlcGVuZGVuY2llcyIKKwkJKTsKKwl9CisKKwlwcml2YXRlIEFydGlmYWN0VmVyc2lvbiBkZXRlcm1pbmVBcnRpZmFjdFZlcnNpb24oQXJ0aWZhY3QgYXJ0aWZhY3QpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBhcnRpZmFjdC5nZXRWZXJzaW9uKCkgIT0gbnVsbAorCQkJCQk/IG5ldyBEZWZhdWx0QXJ0aWZhY3RWZXJzaW9uKCBhcnRpZmFjdC5nZXRWZXJzaW9uKCkgKQorCQkJCQk6IGFydGlmYWN0LmdldFNlbGVjdGVkVmVyc2lvbigpOworCQl9CisJCWNhdGNoICggT3ZlckNvbnN0cmFpbmVkVmVyc2lvbkV4Y2VwdGlvbiBlICkgeworCQkJdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJhcnRpZmFjdCBbIiArIGFydGlmYWN0LmdldElkKCkgKyAiXSBkZWZpbmVkIGFuIG92ZXJseSBjb25zdHJhaW5lZCB2ZXJzaW9uIHJhbmdlIiApOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvamVjdHNBbnRsclZlcnNpb24oQXJ0aWZhY3RWZXJzaW9uIHBsdWdpbkFudGxyVmVyc2lvbikgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworCQlBcnRpZmFjdCBhbnRsckFydGlmYWN0ID0gbnVsbDsKKwkJQXJ0aWZhY3QgYW50bHJSdW50aW1lQXJ0aWZhY3QgPSBudWxsOworCisJCWlmICggcHJvamVjdC5nZXRDb21waWxlQXJ0aWZhY3RzKCkgIT0gbnVsbCApIHsKKwkJCWZvciAoIE9iamVjdCBvIDogcHJvamVjdC5nZXRDb21waWxlQXJ0aWZhY3RzKCkgKSB7CisJCQkJZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoIEFydGlmYWN0ICkgbzsKKwkJCQlpZiAoIEFOVExSX0dST1VQX0lELmVxdWFscyggYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpICkgKSB7CisJCQkJCWlmICggQU5UTFJfQVJUSUZBQ1RfTkFNRS5lcXVhbHMoIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSApICkgeworCQkJCQkJYW50bHJBcnRpZmFjdCA9IGFydGlmYWN0OworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKCBBTlRMUl9SVU5USU1FX0FSVElGQUNUX05BTUUuZXF1YWxzKCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKSApIHsKKwkJCQkJCWFudGxyUnVudGltZUFydGlmYWN0ID0gYXJ0aWZhY3Q7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQl2YWxpZGF0ZUJ1aWxkVGltZUFydGlmYWN0KCBhbnRsckFydGlmYWN0LCBwbHVnaW5BbnRsclZlcnNpb24gKTsKKwkJdmFsaWRhdGVSdW5UaW1lQXJ0aWZhY3QoIGFudGxyUnVudGltZUFydGlmYWN0LCBwbHVnaW5BbnRsclZlcnNpb24gKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZSA9ICJ1bmNoZWNrZWQiKQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQnVpbGRUaW1lQXJ0aWZhY3QoQXJ0aWZhY3QgYW50bHJBcnRpZmFjdCwgQXJ0aWZhY3RWZXJzaW9uIHBsdWdpbkFudGxyVmVyc2lvbikKKwkJCXRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKCBhbnRsckFydGlmYWN0ID09IG51bGwgKSB7CisJCQl2YWxpZGF0ZU1pc3NpbmdCdWlsZHRpbWVBcnRpZmFjdCgpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gb3RoZXJ3aXNlLCBsZXRzIG1ha2Ugc3VyZSB0aGV5IG1hdGNoLi4uCisJCUFydGlmYWN0VmVyc2lvbiBwcm9qZWN0QW50bHJWZXJzaW9uID0gZGV0ZXJtaW5lQXJ0aWZhY3RWZXJzaW9uKCBhbnRsckFydGlmYWN0ICk7CisJCWlmICggcGx1Z2luQW50bHJWZXJzaW9uLmNvbXBhcmVUbyggcHJvamVjdEFudGxyVmVyc2lvbiApICE9IDAgKSB7CisJCQlnZXRMb2coKS53YXJuKAorCQkJCQkiRW5jb3VudGVyZWQgIiArIEFOVExSX0dST1VQX0lEICsgJzonICsgQU5UTFJfQVJUSUZBQ1RfTkFNRSArICc6JyArIHByb2plY3RBbnRsclZlcnNpb24udG9TdHJpbmcoKSArCisJCQkJCQkJIiB3aGljaCBkaWQgbm90IG1hdGNoIEFudGxyIHZlcnNpb24gdXNlZCBieSBwbHVnaW4gWyIgKyBwbHVnaW5BbnRsclZlcnNpb24udG9TdHJpbmcoKSArICJdIgorCQkJKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWlzc2luZ0J1aWxkdGltZUFydGlmYWN0KCkgeworCQkvLyBnZW5lcmFsbHkgc3BlYWtpbmcsIGl0cyBvayBmb3IgdGhlIHByb2plY3QgdG8gbm90IGRlZmluZSBhIGRlcCBvbiB0aGUgYnVpbGQtdGltZSBhcnRpZmFjdC4uLgorCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKHZhbHVlID0gInVuY2hlY2tlZCIpCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSdW5UaW1lQXJ0aWZhY3QoQXJ0aWZhY3QgYW50bHJSdW50aW1lQXJ0aWZhY3QsIEFydGlmYWN0VmVyc2lvbiBwbHVnaW5BbnRsclZlcnNpb24pCisJCQl0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCWlmICggYW50bHJSdW50aW1lQXJ0aWZhY3QgPT0gbnVsbCApIHsKKwkJCS8vIGl0cyBwb3NzaWJsZSwgaWYgdGhlIHByb2plY3QgaW5zdGVhZCBkZXBlbmRzIG9uIHRoZSBidWlsZC10aW1lIChvciBmdWxsKSBhcnRpZmFjdC4KKwkJCXJldHVybjsKKwkJfQorCisJCUFydGlmYWN0VmVyc2lvbiBwcm9qZWN0QW50bHJWZXJzaW9uID0gZGV0ZXJtaW5lQXJ0aWZhY3RWZXJzaW9uKCBhbnRsclJ1bnRpbWVBcnRpZmFjdCApOworCQlpZiAoIHBsdWdpbkFudGxyVmVyc2lvbi5jb21wYXJlVG8oIHByb2plY3RBbnRsclZlcnNpb24gKSAhPSAwICkgeworCQkJZ2V0TG9nKCkud2FybigKKwkJCQkJIkVuY291bnRlcmVkICIgKyBBTlRMUl9HUk9VUF9JRCArICc6JyArIEFOVExSX1JVTlRJTUVfQVJUSUZBQ1RfTkFNRSArICc6JyArIHByb2plY3RBbnRsclZlcnNpb24udG9TdHJpbmcoKSArCisJCQkJCQkJIiB3aGljaCBkaWQgbm90IG1hdGNoIEFudGxyIHZlcnNpb24gdXNlZCBieSBwbHVnaW4gWyIgKyBwbHVnaW5BbnRsclZlcnNpb24udG9TdHJpbmcoKSArICJdIgorCQkJKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEJ1aWxkcyB0aGUgY2xhc3Nsb2FkZXIgdG8gcGFzcyB0byBnVW5pdC4KKwkgKgorCSAqIEBwYXJhbSBhbnRsckFydGlmYWN0IFRoZSBwbHVnaW4ncyAob3VyKSBBbnRsciBkZXBlbmRlbmN5IGFydGlmYWN0LgorCSAqCisJICogQHJldHVybiBUaGUgY2xhc3Nsb2FkZXIgZm9yIGdVbml0IHRvIHVzZQorCSAqCisJICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIFByb2JsZW0gcmVzb2x2aW5nIGFydGlmYWN0cyB0byB7QGxpbmsgamF2YS5uZXQuVVJMIHVybHN9LgorCSAqLworCXByaXZhdGUgQ2xhc3NMb2FkZXIgZGV0ZXJtaW5lUHJvamVjdENvbXBpbGVTY29wZUNsYXNzTG9hZGVyKEFydGlmYWN0IGFudGxyQXJ0aWZhY3QpCisJCQl0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdDxVUkw+IGNsYXNzUGF0aFVybHMgPSBuZXcgQXJyYXlMaXN0PFVSTD4oKTsKKwkJZ2V0TG9nKCkuaW5mbyggIkFkZGluZyBBbnRsciBhcnRpZmFjdCA6ICIgKyBhbnRsckFydGlmYWN0LmdldElkKCkgKTsKKwkJY2xhc3NQYXRoVXJscy5hZGQoIHJlc29sdmVMb2NhbFVSTCggYW50bHJBcnRpZmFjdCApICk7CisKKwkJZm9yICggU3RyaW5nIHBhdGggOiBjbGFzc3BhdGhFbGVtZW50cygpICkgeworCQkJdHJ5IHsKKwkJCQlnZXRMb2coKS5pbmZvKCAiQWRkaW5nIHByb2plY3QgY29tcGlsZSBjbGFzc3BhdGggZWxlbWVudCA6ICIgKyBwYXRoICk7CisJCQkJY2xhc3NQYXRoVXJscy5hZGQoIG5ldyBGaWxlKCBwYXRoICkudG9VUkkoKS50b1VSTCgpICk7CisJCQl9CisJCQljYXRjaCAoIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlICkgeworCQkJCXRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGJ1aWxkIHBhdGggVVJMIFsiICsgcGF0aCArICJdIiApOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG5ldyBVUkxDbGFzc0xvYWRlciggY2xhc3NQYXRoVXJscy50b0FycmF5KCBuZXcgVVJMW2NsYXNzUGF0aFVybHMuc2l6ZSgpXSApLCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFVSTCByZXNvbHZlTG9jYWxVUkwoQXJ0aWZhY3QgYXJ0aWZhY3QpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBhcnRpZmFjdC5nZXRGaWxlKCkudG9VUkkoKS50b1VSTCgpOworCQl9CisJCWNhdGNoICggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUgKSB7CisJCQl0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byByZXNvbHZlIGFydGlmYWN0IHVybCA6ICIgKyBhcnRpZmFjdC5nZXRJZCgpLCBlICk7CisJCX0KKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQorCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNsYXNzcGF0aEVsZW1lbnRzKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworCQl0cnkgeworCQkJLy8gdG9kbyA6IHNob3VsZCB3ZSBjb21iaW5lIGJvdGggY29tcGlsZSBhbmQgdGVzdCBzY29wZWQgZWxlbWVudHM/CisJCQlyZXR1cm4gKCBMaXN0PFN0cmluZz4gKSBwcm9qZWN0LmdldFRlc3RDbGFzc3BhdGhFbGVtZW50cygpOworCQl9CisJCWNhdGNoICggRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlICkgeworCQkJdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJDYWxsIHRvIFByb2plY3QjZ2V0Q29tcGlsZUNsYXNzcGF0aEVsZW1lbnRzIHJlcXVpcmVkIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiIgKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwZXJmb3JtRXhlY3V0aW9uKENsYXNzTG9hZGVyIHByb2plY3RDb21waWxlU2NvcGVDbGFzc0xvYWRlcikgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworCQlnZXRMb2coKS5pbmZvKCAiZ1VuaXQgcmVwb3J0IGRpcmVjdG9yeSA6ICIgKyByZXBvcnREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKKwkJaWYgKCAhcmVwb3J0RGlyZWN0b3J5LmV4aXN0cygpICkgeworCQkJYm9vbGVhbiBkaXJlY3RvcnlDcmVhdGVkID0gcmVwb3J0RGlyZWN0b3J5Lm1rZGlycygpOworCQkJaWYgKCAhZGlyZWN0b3J5Q3JlYXRlZCApIHsKKwkJCQlnZXRMb2coKS53YXJuKCAibWtkaXJzKCkgcmVwb3J0ZWQgcHJvYmxlbSBjcmVhdGluZyByZXBvcnQgZGlyZWN0b3J5IiApOworCQkJfQorCQl9CisKKwkJUmVzdWx0IHJ1bm5pbmdSZXN1bHRzID0gbmV3IFJlc3VsdCgpOworCQlBcnJheUxpc3Q8U3RyaW5nPiBmYWlsdXJlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iICk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggIiBHIFUgTiBJIFQgICBSIEUgUyBVIEwgVCBTIiApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKTsKKworCQlmb3IgKCBGaWxlIHNjcmlwdCA6IGNvbGxlY3RJbmNsdWRlZFNvdXJjZUdyYW1tYXJzKCkgKSB7CisJCQlmaW5hbCBTdHJpbmcgc2NyaXB0UGF0aCA9IHNjcmlwdC5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbiggIkV4ZWN1dGluZyBzY3JpcHQgIiArIHNjcmlwdFBhdGggKTsKKwkJCXRyeSB7CisJCQkJU3RyaW5nIHNjcmlwdEJhc2VOYW1lID0gU3RyaW5nVXRpbHMuY2hvbXBMYXN0KCBGaWxlVXRpbHMuYmFzZW5hbWUoIHNjcmlwdC5nZXROYW1lKCkgKSwgIi4iICk7CisKKwkJCQlBTlRMUkZpbGVTdHJlYW0gYW50bHJTdHJlYW0gPSBuZXcgQU5UTFJGaWxlU3RyZWFtKCBzY3JpcHRQYXRoICk7CisJCQkJR3JhbW1hckluZm8gZ3JhbW1hckluZm8gPSBJbnRlcnAucGFyc2UoIGFudGxyU3RyZWFtICk7CisJCQkJZ1VuaXRFeGVjdXRvciBleGVjdXRvciA9IG5ldyBnVW5pdEV4ZWN1dG9yKAorCQkJCQkJZ3JhbW1hckluZm8sCisJCQkJCQlwcm9qZWN0Q29tcGlsZVNjb3BlQ2xhc3NMb2FkZXIsCisJCQkJCQlzY3JpcHQuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpCisJCQkJKTsKKworCQkJCVN0cmluZyByZXBvcnQgPSBleGVjdXRvci5leGVjVGVzdCgpOworCQkJCXdyaXRlUmVwb3J0RmlsZSggbmV3IEZpbGUoIHJlcG9ydERpcmVjdG9yeSwgc2NyaXB0QmFzZU5hbWUgKyAiLnR4dCIgKSwgcmVwb3J0ICk7CisKKwkJCQlSZXN1bHQgdGVzdFJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKKwkJCQl0ZXN0UmVzdWx0LnRlc3RzID0gZXhlY3V0b3IubnVtT2ZUZXN0OworCQkJCXRlc3RSZXN1bHQuZmFpbHVyZXMgPSBleGVjdXRvci5udW1PZkZhaWx1cmU7CisJCQkJdGVzdFJlc3VsdC5pbnZhbGlkcyA9IGV4ZWN1dG9yLm51bU9mSW52YWxpZElucHV0OworCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCB0ZXN0UmVzdWx0LnJlbmRlcigpICk7CisKKwkJCQlydW5uaW5nUmVzdWx0cy5hZGQoIHRlc3RSZXN1bHQgKTsKKwkJCQlmb3IgKCBBYnN0cmFjdFRlc3QgdGVzdCA6IGV4ZWN1dG9yLmZhaWx1cmVzICkgeworCQkJCQlmYWlsdXJlTmFtZXMuYWRkKCBzY3JpcHRCYXNlTmFtZSArICIjIiArIHRlc3QuZ2V0SGVhZGVyKCkgKTsKKwkJCQl9CisJCQl9CisJCQljYXRjaCAoIElPRXhjZXB0aW9uIGUgKSB7CisJCQkJdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJDb3VsZCBub3Qgb3BlbiBzcGVjaWZpZWQgc2NyaXB0IGZpbGUiLCBlICk7CisJCQl9CisJCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKSB7CisJCQkJdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJDb3VsZCBub3QgcGFyc2UgZ1VuaXQgc2NyaXB0IiwgZSApOworCQkJfQorCQl9CisKKwkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbiggIlN1bW1hcnkgOiIgKTsKKwkJaWYgKCAhIGZhaWx1cmVOYW1lcy5pc0VtcHR5KCkgKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oICIgIEZvdW5kICIgKyBmYWlsdXJlTmFtZXMuc2l6ZSgpICsgIiBmYWlsdXJlcyIgKTsKKwkJCWZvciAoIFN0cmluZyBuYW1lIDogZmFpbHVyZU5hbWVzICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbiggIiAgICAtICIgKyBuYW1lICk7CisJCQl9CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCBydW5uaW5nUmVzdWx0cy5yZW5kZXIoKSApOworCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKworCQlpZiAoIHJ1bm5pbmdSZXN1bHRzLmZhaWx1cmVzID4gMCApIHsKKwkJCXRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRm91bmQgZ1VuaXQgdGVzdCBmYWlsdXJlcyIgKTsKKwkJfQorCisJCWlmICggcnVubmluZ1Jlc3VsdHMuaW52YWxpZHMgPiAwICkgeworCQkJdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJGb3VuZCBpbnZhbGlkIGdVbml0IHRlc3RzIiApOworCQl9CisJfQorCisJcHJpdmF0ZSBTZXQ8RmlsZT4gY29sbGVjdEluY2x1ZGVkU291cmNlR3JhbW1hcnMoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCVNvdXJjZU1hcHBpbmcgbWFwcGluZyA9IG5ldyBTdWZmaXhNYXBwaW5nKCAiZyIsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCApOworICAgICAgICBTb3VyY2VJbmNsdXNpb25TY2FubmVyIHNjYW4gPSBuZXcgU2ltcGxlU291cmNlSW5jbHVzaW9uU2Nhbm5lciggZ2V0SW5jbHVkZVBhdHRlcm5zKCksIGdldEV4Y2x1ZGVQYXR0ZXJucygpICk7CisgICAgICAgIHNjYW4uYWRkU291cmNlTWFwcGluZyggbWFwcGluZyApOworCQl0cnkgeworCQkJU2V0IHNjYW5SZXN1bHRzID0gc2Nhbi5nZXRJbmNsdWRlZFNvdXJjZXMoIHNvdXJjZURpcmVjdG9yeSwgbnVsbCApOworCQkJU2V0PEZpbGU+IHJlc3VsdHMgPSBuZXcgSGFzaFNldDxGaWxlPigpOworCQkJZm9yICggT2JqZWN0IHJlc3VsdCA6IHNjYW5SZXN1bHRzICkgeworCQkJCWlmICggcmVzdWx0IGluc3RhbmNlb2YgRmlsZSApIHsKKwkJCQkJcmVzdWx0cy5hZGQoICggRmlsZSApIHJlc3VsdCApOworCQkJCX0KKwkJCQllbHNlIGlmICggcmVzdWx0IGluc3RhbmNlb2YgU3RyaW5nICkgeworCQkJCQlyZXN1bHRzLmFkZCggbmV3IEZpbGUoICggU3RyaW5nICkgcmVzdWx0ICkgKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiVW5leHBlY3RlZCByZXN1bHQgdHlwZSBmcm9tIHNjYW5uaW5nIFsiICsgcmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iICk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHJlc3VsdHM7CisJCX0KKwkJY2F0Y2ggKCBJbmNsdXNpb25TY2FuRXhjZXB0aW9uIGUgKSB7CisJCQl0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIGRldGVybWluaW5nIGdVbml0IHNvdXJjZXMiLCBlICk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVSZXBvcnRGaWxlKEZpbGUgcmVwb3J0RmlsZSwgU3RyaW5nIHJlc3VsdHMpIHsKKwkJdHJ5IHsKKwkJCVdyaXRlciB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlciggcmVwb3J0RmlsZSApOworCQkJd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKCB3cml0ZXIgKTsKKwkJCXRyeSB7CisJCQkJd3JpdGVyLndyaXRlKCByZXN1bHRzICk7CisJCQkJd3JpdGVyLmZsdXNoKCk7CisJCQl9CisJCQlmaW5hbGx5IHsKKwkJCQl0cnkgeworCQkJCQl3cml0ZXIuY2xvc2UoKTsKKwkJCQl9CisJCQkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpZ25vcmUgKSB7CisJCQkJfQorCQkJfQorCQl9CisJCWNhdGNoICggSU9FeGNlcHRpb24gZSApIHsKKwkJCWdldExvZygpLndhcm4oICAiRXJyb3Igd3JpdGluZyBnVW5pdCByZXBvcnQgZmlsZSIsIGUgKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc3VsdCB7CisJCXByaXZhdGUgaW50IHRlc3RzID0gMDsKKwkJcHJpdmF0ZSBpbnQgZmFpbHVyZXMgPSAwOworCQlwcml2YXRlIGludCBpbnZhbGlkcyA9IDA7CisKKwkJcHVibGljIFN0cmluZyByZW5kZXIoKSB7CisJCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCggIlRlc3RzIHJ1bjogJWQsICBGYWlsdXJlczogJWQsICBJbnZhbGlkOiAlZCIsIHRlc3RzLCBmYWlsdXJlcywgaW52YWxpZHMgKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGFkZChSZXN1bHQgcmVzdWx0KSB7CisJCQl0aGlzLnRlc3RzICs9IHJlc3VsdC50ZXN0czsKKwkJCXRoaXMuZmFpbHVyZXMgKz0gcmVzdWx0LmZhaWx1cmVzOworCQkJdGhpcy5pbnZhbGlkcyArPSByZXN1bHQuaW52YWxpZHM7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9DSEFOR0VTLnR4dCBiL2FudGxyLTMuNC9ndW5pdC9DSEFOR0VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EyN2YxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L0NIQU5HRVMudHh0CkBAIC0wLDAgKzEsMTI3IEBACitnVW5pdAorCitMZW9uLCBKZW4tWXVhbiBTdQorbGVvbnN1IGF0IG1hYyBjb20KKworQ0hBTkdFUworCitEZWNlbWJlciAxNSwgMjAxMAorCisqIFRKUCBndW5pdCBjaGVja2VkIHRva2Vucy5pbmRleCgpICE9IHNpemUgaW5zdGVhZCBvZiBzaXplKCktMQorCitOb3ZlbWJlciAyNiwgMjAxMAorCisqIEFkZGVkIC1wIHBhY2thZ2UtbmFtZS1mb3ItanVuaXQtb3V0cHV0IHNpbmNlIHRlc3QgcGFja2FnZSBpcyB1c3VhbGx5CisgIGRpZmZlcmVudCB0aGFuIHBhcnNlciBwYWNrYWdlLiBUSlAKKworSmFudWFyeSAyNCwgMjAwOQorCisqIEltcHJvdmVkIGVycm9yIG1lc3NhZ2VzCisKKyogc3RkZXJyIHdhcyBiZWluZyBpZ25vcmVkIHVwb24gZXhjZXB0aW9uLgorCisqIGdlbmVyYXRlZCBqdW5pdCB0ZXN0IGNvZGUgaW5kaWNhdGUgbGluZXMgaW4gZ3VuaXQgc2NyaXB0LiBhbHNvIGVycm9yCisgIG1lc3NhZ2VzIGR1cmluZyBwYXJzZSB0aW1lIHNob3cgbGluZSBudW1iZXIgZnJvbSBndW5pdCBzY3JpcHQuCisKKyogcmVmYWN0b3JlZCB0ZW1wbGF0ZSBnZW5lcmF0aW9uIC8gcGFyYW1ldGVycworCisqIEFsbG93IHN0cmluZ3MgaW4gQVNUIGRlc2NyaXB0aW9ucyAoZ1VuaXQuZykuIEUuZy4sIGl0IGhhbmRsZSB0aGlzIHJ1bGUKKyAgKEkgaGFkIHRvIHF1b3RlIHRoZSAiXigiIHJvb3QgdG9rZW5zKToKKworICBibG9jazoKKwkiKCBeKEEgQikgfCBeKGIgQykgKSIgLT4gKEJMT0NLIChBTFQgKCJeKCIgQSBCKSkgKEFMVCAoIl4oIiBiIEMpKSkKKworCitKYW51YXJ5IDIzLCAyMDA5CisKKyogd2hpdGVzcGFjZSBpZ25vcmVkIGFuZCAieCB5IHoiIHR1cm5lZCBpbnRvIHggeSB6IG5vdyBpbglleHBlY3RlZCB0cmVlIHBcCithdHRlcm4uIEUuZy4sCisKK3J1bGU6CisgICAgImEgOiBBPFgsWT1hLmIuYz47IiAtPiAoUlVMRSBhIChCTE9DSyAoQUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEEgKEVMRU1FTlRfT1BUSU9OUyBYICg9IFkgImEuYi5jIikpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK0p1bHkgMzEsIDIwMDkKKworKiBzdXBwb3J0IGN1c3RvbSB0cmVlIGFkYXB0b3IgaW4gZ1VuaXQgc2NyaXB0CisKK01hcmNoIDIxLCAyMDA5CisKKyogZ1VuaXRUZXN0U3VpdGUuamF2YTogdXNlIGxleGVyIHJ1bGUgbmFtZSBpZiBwYXJzZXIgcnVsZSBuYW1lIGlzIG51bGwgKGJ5IFNoYW90aW5nKQorCisqIGFkZCBndW5pdC9zd2luZ3VpIHBhY2thZ2UgZm9yIGdVbml0RWRpdG9yIEdVSQorCitGZWIgMTcsIDIwMDkKKworKiBhZGRlZCBuZXcgaW50ZXJmYWNlcyBmb3IgR1VJIGVkaXRvcgorCisqIHJlY29nbml6ZXMgaW52YWxpZCBpbnB1dCBhcyBhIEZBSUwgY2FzZSBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorCitTdGV2ZSBFYmVyc29sZSBwcm92aWRlZCBhIHBhdGNoIGZvciB0aGUgZm9sbG93aW5nIHR3byBmaXhlcy4KKyogYWxsb3dzIHNldHRpbmcgYW4gb3V0cHV0IGRpcmVjdG9yeSAoZm9yIEpVbml0Q29kZUdlbikKKworKiBhbGxvd3MgcHJvdmlkaW5nIGEgY2xhc3Nsb2FkZXIgKGZvciBib3RoIEpVbml0Q29kZUdlbiBhbmQgZ1VuaXRFeGVjdXRvcikgCisKK05vdiAyNSwgMjAwOAorCisqIGZpeGVkIGV4dGVybmFsIHRlc3QgZmlsZSBwYXRoIGlzc3VlLiBpZiBhbiBpbnB1dCB0ZXN0IGZpbGUgaXMgbm90IGZvdW5kIHVuZGVyIHRoZSBjdXJyZW50IGRpciwgdGhlbiB0cnkgdG8gbG9vayBmb3IgaXQgdW5kZXIgdGhlIHBhY2thZ2UgZGlyIGFsc28uCisKKyogZml4ZWQgbXVsdGlwbGUtbGluZSBpbnB1dCBpbmRlbnRhdGlvbiBpc3N1ZS4KKworKiBmaXhlZCBidWc6IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB0ZXJtaW5hdGVkIGdVbml0IHRlc3RzIGR1ZSB0byBhbnkgbm9uLWV4aXN0ZW50IGlucHV0IHRlc3QgZmlsZS4KKworKiBkaXNwbGF5IGVzY2FwZWQgdGV4dCBmb3IgbmV3bGluZSBjaGFyYWN0ZXJzIGluIHRoZSB0ZXN0IHJlc3VsdCBmb3IgY29tcGFyaW5nIGV4cGVjdGVkIGFuZCBhY3R1YWwgc3RyaW5nLgorCitOb3YgMjAsIDIwMDgKKworKiBhZGRlZCBuZXcgZnVuY3Rpb25hbGl0eSBvZiB0ZXN0aW5nIGxleGljYWwgcnVsZXMKKworKiBmaXhlZCBidWcgb2YgdXNpbmcgUGlwZWRJbnB1dC9PdXRwdXQgU3RyZWFtIGFuZCBjaGFuZ2VkIHRvIEJ5dGVBcnJheU91dHB1dFN0cmVhbS4gSmFyZWQgQnVudGluZyBwcm92aWRlZCBhIHBhdGNoIG9uIHRoaXMgaXNzdWUuCisKKyogaW1wcm92ZWQgalVuaXQgdHJhbnNsYXRpb24gbW9kZSBhbmQgbW92ZWQgc3VwcG9ydGluZyBjb2RlcyBpbnRvIGdVbml0QmFzZVRlc3QuCisKK09jdCAzMSwgMjAwOAorCisqIGZpeGVkIGJ1ZyBvZiB0ZXN0aW5nIGEgdHJlZSBncmFtbWFyJ3MgdGVtcGxhdGUgb3V0cHV0CisKK0p1bHkgOSwgMjAwOAorCisqIGZpeGVkIGJ1ZzogcHJvZ3JhbSBleGl0ZWQgdXBvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIAorICBTdW1hbnRvIEJpc3dhcyBwb2ludGVkIG91dCB0aGUgaXNzdWUgYW5kIHByb3ZpZGVkIHN1Z2dlc3Rpb25zLgorCisqIEJldHRlciBoYW5kbGUgb24gdGVzdCBydWxlJ3MgU3RyaW5nVGVtcGxhdGUgb3V0cHV0CisKK01heSAxMCwgMjAwOAorCisqIGFkZGVkIGV4aXQgY29kZSBmdW5jdGlvbmFsaXR5CisKKyogZml4ZWQgc3RyaW5nIGVzY2FwaW5nIGJ1ZyBmb3IganVuaXQgZ2VuZXJhdG9yCisKKzEuMC4yIC0gQXByIDAxLCAyMDA4CisKKyogZml4ZWQgZ3JhbW1hciBidWc6IG11bHRpcGxlLWxpbmUgaW5wdXQsIEFTVCBvdXRwdXQKKworKiBhZGp1c3RlZCB0aGUgb3V0cHV0IG9mIHRlc3QgcmVzdWx0CisKK01hciAyMCwgMjAwOAorCisqIG1vdmVkIHRlc3QgcmVzdWx0IHRvIHN0cmluZyB0ZW1wbGF0ZSAoZ1VuaXRUZXN0UmVzdWx0LnN0ZykKKworKiBhZGRlZCB0aGUgZGlzcGxheSBvZiBsaW5lIG9mIHRlc3QgaW4gdGhlIHRlc3QgcmVzdWx0CisKK0ZlYiAxOSwgMjAwOAorCisqIGZpeGVkIGJ1ZyBvZiBkaXNwbGF5aW5nIHRlc3Qgc2VxdWVuY2UgYW5kIGVycm9yIG1lc3NhZ2UgZnJvbSBBTlRMUgorCitGZWIgOCwgMjAwOAorCisqIG1hZGUgY29tcGF0aWJsZSB3aXRoIEFOVExSIDMuMWIxCisKKzEuMC4xIC0gSmFuIDExLCAyMDA4CisKKyogS2VubnkgTWFjRGVybWlkIGhlbHBzIHdpdGggY29kZSByZWZhY3RvcmluZworCisxLjAgLSBBdWcgMjAsIDIwMDcKKworSW5pdGlhbCBlYXJseSBhY2Nlc3MgcmVsZWFzZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L0xJQ0VOU0UudHh0IGIvYW50bHItMy40L2d1bml0L0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWEyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyNiBAQAorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTGVvbiwgSmVuLVl1YW4gU3UKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L1JFQURNRS50eHQgYi9hbnRsci0zLjQvZ3VuaXQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2ExNTIyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L1JFQURNRS50eHQKQEAgLTAsMCArMSw1NiBAQAorZ1VuaXQKK0ZlYiAyMSwgMjAwOQorCitMZW9uLCBKZW4tWXVhbiBTdQorbGVvbnN1IGF0IG1hYyBjb20KKworSU5UUk9EVUNUSU9OCisKK1dlbGNvbWUgdG8gZ1VuaXQhIEkndmUgYmVlbiB3b3JraW5nIG9uIGdVbml0IGZyb20gMjAwNyBzdW1tZXIgYW5kIAordGhpcyBpcyBhIHByb2plY3QgaW4gVVNGIENTLCBzcG9uc29yZWQgYnkgcHJvZmVzc29yIFRlcmVuY2UgUGFyci4KKworWW91IHNob3VsZCB1c2UgdGhlIGxhdGVzdCBBTlRMUiB2MyB3aXRoIGdVbml0OgorCitodHRwOi8vd3d3LmFudGxyLm9yZy9kb3dubG9hZC5odG1sCisKK1NlZSB0aGUgd2lraSBkb2N1bWVudDoKKworaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9nVW5pdCstK0dyYW1tYXIrVW5pdCtUZXN0aW5nIAorCitQZXIgdGhlIGxpY2Vuc2UgaW4gTElDRU5TRS50eHQsIHRoaXMgc29mdHdhcmUgaXMgbm90IGd1YXJhbnRlZWQgdG8KK3dvcmsgYW5kIG1pZ2h0IGV2ZW4gZGVzdHJveSBhbGwgbGlmZSBvbiB0aGlzIHBsYW5ldDoKKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCitJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCitTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKK0lOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVhBTVBMRVMKKworU2VlIHRoZSB3aWtpIHR1dG9yaWFsIG9mIGdVbml0OgorCisgICAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9nVW5pdCstK0dyYW1tYXIrVW5pdCtUZXN0aW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdCBpcyBnVW5pdD8KKworZ1VuaXQgaXMgYW4gdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBmb3IgQU5UTFIgZ3JhbW1hcnMuIEl0IHByb3ZpZGVzIGEgCitzaW1wbGUgd2F5IHRvIHdyaXRlIGFuZCBydW4gYXV0b21hdGVkIHRlc3RzIGZvciBncmFtbWFycyBpbiBhIG1hbm5lciAKK3NpbWlsYXIgdG8gd2hhdCBqVW5pdCBkb2VzIGZvciB1bml0IHRlc3RpbmcuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSG93IGRvIEkgaW5zdGFsbCBnVW5pdD8KKworSXQgaXMgaW5jbHVkZWQgaW4gQU5UTFIgdjM7IGl0IG5lZWRzIGJvdGggQU5UTFIgYW5kIFN0cmluZ1RlbXBsYXRlIGphcnMKK2luIENMQVNTUEFUSC4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9hbnRsci5jb25maWcgYi9hbnRsci0zLjQvZ3VuaXQvYW50bHIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvYW50bHIuY29uZmlnCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvcG9tLnhtbCBiL2FudGxyLTMuNC9ndW5pdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzViNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvcG9tLnhtbApAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+Z3VuaXQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgCisgICAgPG5hbWU+QU5UTFIgZ1VuaXQgdjMuNDwvbmFtZT4KKyAgPCEtLQorCisgICAgSW5oZXJpdCBmcm9tIHRoZSBBTlRMUiBtYXN0ZXIgcG9tLCB3aGljaCB0ZWxscyB1cyB3aGF0CisgICAgdmVyc2lvbiB3ZSBhcmUgYW5kIGFsbG93cyB1cyB0byBpbmhlcml0IGRlcGVuZGVuY2llcworICAgIGFuZCBzbyBvbi4KKworICAgIC0tPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YW50bHItbWFzdGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjQ8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8dXJsPmh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvZ1VuaXQrLStHcmFtbWFyK1VuaXQrVGVzdGluZzwvdXJsPgorICAKKyAgPCEtLQorCisgICAgVGVsbCBNYXZlbiB3aGljaCBvdGhlciBhcnRpZmFjdHMgd2UgbmVlZCBpbiBvcmRlciB0bworICAgIGJ1aWxkLCBydW4gYW5kIHRlc3QgdGhlIEFOVExSIFRvb2wuIFRoZSBBTlRMUiBUb29sIHVzZXMgZWFybGllciB2ZXJzaW9ucworICAgIG9mIEFOVExSIGF0IHJ1bnRpbWUgKGZvciB0aGUgbW9tZW50KSwgdXNlcyB0aGUgY3VycmVudAorICAgIHJlbGVhc2VkIHZlcnNpb24gb2YgQU5UTFIgU3RyaW5nIHRlbXBsYXRlLCBidXQgb2J2aW91c2x5IGlzCisgICAgcmVsaWFudCBvbiB0aGUgbGF0ZXN0IHNuYXBzaG90IG9mIHRoZSBydW50aW1lLCB3aGljaCB3aWxsIGVpdGhlciBiZQorICAgIHRha2VuIGZyb20gdGhlIGFudGxyLXNuYXBzaG90IHJlcG9zaXRvcnksIG9yIHlvdXIgbG9jYWwgLm0yCisgICAgcmVwb3NpdG9yeSBpZiB5b3UgYnVpbHQgYW5kIGluc3RhbGxlZCB0aGF0IGxvY2FsbHkuCisKKyAgICAtLT4KKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuOC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIAorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5TVDQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj40LjAuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RyaW5ndGVtcGxhdGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjIuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKworICAgICAgICA8ZGVmYXVsdEdvYWw+aW5zdGFsbDwvZGVmYXVsdEdvYWw+CisKKyAgICAgICAgPHBsdWdpbnM+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyMy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPjwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hbnRscjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD5qc3IxNDwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5maW5kYnVncy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmaW5kYnVnc1htbE91dHB1dD50cnVlPC9maW5kYnVnc1htbE91dHB1dD4KKyAgICAgICAgICAgICAgICAgICAgPGZpbmRidWdzWG1sV2l0aE1lc3NhZ2VzPnRydWU8L2ZpbmRidWdzWG1sV2l0aE1lc3NhZ2VzPgorICAgICAgICAgICAgICAgICAgICA8eG1sT3V0cHV0PnRydWU8L3htbE91dHB1dD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisKKyAgICAgICAgPGV4dGVuc2lvbnM+CisgICAgICAgICAgICA8ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1iZXRhLTI8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPC9leHRlbnNpb25zPgorCisgICAgCisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3VuaXQvZ1VuaXQuZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2d1bml0L2dVbml0LmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzZTI2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2d1bml0L2dVbml0LmcKQEAgLTAsMCArMSwzNTIgQEAKKy8qCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBMZW9uIEplbi1ZdWFuIFN1CitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitncmFtbWFyIGdVbml0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YTt9Cit0b2tlbnMgeworCU9LID0gJ09LJzsKKwlGQUlMID0gJ0ZBSUwnOworCURPQ19DT01NRU5UOworfQorQGhlYWRlciB7cGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7fQorQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworfQorQG1lbWJlcnMgeworcHVibGljIEdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvOworcHVibGljIGdVbml0UGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBHcmFtbWFySW5mbyBncmFtbWFySW5mbykgeworCXN1cGVyKGlucHV0KTsKKwl0aGlzLmdyYW1tYXJJbmZvID0gZ3JhbW1hckluZm87Cit9Cit9CisKK2dVbml0RGVmOgknZ3VuaXQnIGcxPWlkICgnd2Fsa3MnIGcyPWlkKT8gJzsnIAorCQl7CisJCWlmICggJGcyLnRleHQhPW51bGwgKSB7CisJCQlncmFtbWFySW5mby5zZXRHcmFtbWFyTmFtZSgkZzIudGV4dCk7CisJCQlncmFtbWFySW5mby5zZXRUcmVlR3JhbW1hck5hbWUoJGcxLnRleHQpOworCQl9CisJCWVsc2UgeworCQkJZ3JhbW1hckluZm8uc2V0R3JhbW1hck5hbWUoJGcxLnRleHQpOworCQl9CisJCX0KKwkJb3B0aW9uc1NwZWM/IGhlYWRlcj8gdGVzdHN1aXRlKgorCTsKKwkKK29wdGlvbnNTcGVjIAorCToJT1BUSU9OUyAob3B0aW9uICc7JykrICd9JworCTsKKworLy8gTm90ZTogY3VycmVudGx5LCB0aGlzIGlzIHRoZSBvbmx5IHZhbGlkIG9wdGlvbiBmb3Igc2V0dGluZyBjdXN0b21pemVkIHRyZWUgYWRhcHRvcgkKK29wdGlvbgk6CWlkICc9JyB0cmVlQWRhcHRvcgorCQl7CisJCWlmICggJGlkLnRleHQuZXF1YWxzKCJUcmVlQWRhcHRvciIpICkgeworCQkgICAgZ3JhbW1hckluZm8uc2V0QWRhcHRvcigkdHJlZUFkYXB0b3IudGV4dCk7CisJCX0KKwkJLy8gVE9ETzogbmVlZCBhIGJldHRlciBlcnJvciBsb2dnaW5nIHN0cmF0ZWd5CisJCWVsc2UgU3lzdGVtLmVyci5wcmludGxuKCJJbnZhbGlkIG9wdGlvbiBkZXRlY3RlZDogIiskdGV4dCk7CisJCX0KKwk7CisJCit0cmVlQWRhcHRvcgorCToJaWQgRVhUKgorCTsKKworaGVhZGVyCToJJ0BoZWFkZXInIEFDVElPTgorCQl7CisJCWludCBwb3MxLCBwb3MyOworCQlpZiAoIChwb3MxPSRBQ1RJT04udGV4dC5pbmRleE9mKCJwYWNrYWdlIikpIT0tMSAmJiAocG9zMj0kQUNUSU9OLnRleHQuaW5kZXhPZignOycpKSE9LTEgKSB7CisJCQlncmFtbWFySW5mby5zZXRHcmFtbWFyUGFja2FnZSgkQUNUSU9OLnRleHQuc3Vic3RyaW5nKHBvczErOCwgcG9zMikudHJpbSgpKTsJLy8gc3Vic3RyaW5nIHRoZSBwYWNrYWdlIHBhdGgKKwkJfQorCQllbHNlIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiZXJyb3IobGluZSAiKyRBQ1RJT04uZ2V0TGluZSgpKyIpOiBpbnZhbGlkIGhlYWRlciIpOworCQl9CisJCX0KKwk7CisJCQordGVzdHN1aXRlCS8vIGdVbml0IHRlc3Qgc3VpdGUgYmFzZWQgb24gaW5kaXZpZHVhbCBydWxlCitzY29wZSB7Citib29sZWFuIGlzTGV4aWNhbFJ1bGU7Cit9CitAaW5pdCB7CitnVW5pdFRlc3RTdWl0ZSB0cyA9IG51bGw7CiskdGVzdHN1aXRlOjppc0xleGljYWxSdWxlID0gZmFsc2U7Cit9CisJOgkoCXIxPVJVTEVfUkVGICgnd2Fsa3MnIHIyPVJVTEVfUkVGKT8gCisJCQl7CisJCQlpZiAoICRyMj09bnVsbCApIHRzID0gbmV3IGdVbml0VGVzdFN1aXRlKCRyMS50ZXh0KTsKKwkJCWVsc2UgdHMgPSBuZXcgZ1VuaXRUZXN0U3VpdGUoJHIxLnRleHQsICRyMi50ZXh0KTsKKwkJCX0KKwkJfAl0PVRPS0VOX1JFRiAKKwkJCXsKKwkJCXRzID0gbmV3IGdVbml0VGVzdFN1aXRlKCk7CisJCQl0cy5zZXRMZXhpY2FsUnVsZU5hbWUoJHQudGV4dCk7CisJCQkkdGVzdHN1aXRlOjppc0xleGljYWxSdWxlID0gdHJ1ZTsKKwkJCX0KKwkJKQorCQknOicKKwkJdGVzdGNhc2VbdHNdKyB7Z3JhbW1hckluZm8uYWRkUnVsZVRlc3RTdWl0ZSh0cyk7fQorCTsKKworLy8gVE9ETyA6IGN1cnJlbnRseSBnVW5pdCBqdXN0IGlnbm9yZXMgaWxsZWdhbCB0ZXN0IGZvciBsZXhlciBydWxlLCBidXQgc2hvdWxkIGFsc28gZW1pdCBhIHJlbWluZGluZyBtZXNzYWdlCit0ZXN0Y2FzZVtnVW5pdFRlc3RTdWl0ZSB0c10JLy8gaW5kaXZpZHVhbCB0ZXN0IHdpdGhpbiBhIChydWxlKXRlc3RzdWl0ZQorCToJaW5wdXQgZXhwZWN0IHskdHMuYWRkVGVzdENhc2UoJGlucHV0LmluLCAkZXhwZWN0Lm91dCk7fQorCTsKKworaW5wdXQgcmV0dXJucyBbZ1VuaXRUZXN0SW5wdXQgaW5dCitAaW5pdCB7CitTdHJpbmcgdGVzdElucHV0ID0gbnVsbDsKK2Jvb2xlYW4gaW5wdXRJc0ZpbGUgPSBmYWxzZTsKK2ludCBsaW5lID0gLTE7Cit9CitAYWZ0ZXIgeworaW4gPSBuZXcgZ1VuaXRUZXN0SW5wdXQodGVzdElucHV0LCBpbnB1dElzRmlsZSwgbGluZSk7Cit9CisJOglTVFJJTkcgCisJCXsKKwkJdGVzdElucHV0ID0gJFNUUklORy50ZXh0LnJlcGxhY2UoIlxcbiIsICJcbiIpLnJlcGxhY2UoIlxcciIsICJcciIpLnJlcGxhY2UoIlxcdCIsICJcdCIpCisJCS5yZXBsYWNlKCJcXGIiLCAiXGIiKS5yZXBsYWNlKCJcXGYiLCAiXGYiKS5yZXBsYWNlKCJcXFwiIiwgIlwiIikucmVwbGFjZSgiXFwnIiwgIlwnIikucmVwbGFjZSgiXFxcXCIsICJcXCIpOworCQlsaW5lID0gJFNUUklORy5saW5lOworCQl9CisJfAlNTF9TVFJJTkcKKwkJeworCQl0ZXN0SW5wdXQgPSAkTUxfU1RSSU5HLnRleHQ7CisJCWxpbmUgPSAkTUxfU1RSSU5HLmxpbmU7CisJCX0KKwl8CWZpbGUKKwkJeworCQl0ZXN0SW5wdXQgPSAkZmlsZS50ZXh0OworCQlpbnB1dElzRmlsZSA9IHRydWU7CisJCWxpbmUgPSAkZmlsZS5saW5lOworCQl9CisJOworCQorZXhwZWN0IHJldHVybnMgW0Fic3RyYWN0VGVzdCBvdXRdCisJOglPSyB7JG91dCA9IG5ldyBCb29sZWFuVGVzdCh0cnVlKTt9CisJfAlGQUlMIHskb3V0ID0gbmV3IEJvb2xlYW5UZXN0KGZhbHNlKTt9CisJfAkncmV0dXJucycgUkVUVkFMIHtpZiAoICEkdGVzdHN1aXRlOjppc0xleGljYWxSdWxlICkgJG91dCA9IG5ldyBSZXR1cm5UZXN0KCRSRVRWQUwpO30KKwl8CSctPicgb3V0cHV0IHtpZiAoICEkdGVzdHN1aXRlOjppc0xleGljYWxSdWxlICkgJG91dCA9IG5ldyBPdXRwdXRUZXN0KCRvdXRwdXQudG9rZW4pO30KKwk7CisKK291dHB1dCByZXR1cm5zIFtUb2tlbiB0b2tlbl0KKwk6CVNUUklORyAKKwkJeworCQkkU1RSSU5HLnNldFRleHQoJFNUUklORy50ZXh0LnJlcGxhY2UoIlxcbiIsICJcbiIpLnJlcGxhY2UoIlxcciIsICJcciIpLnJlcGxhY2UoIlxcdCIsICJcdCIpCisJCS5yZXBsYWNlKCJcXGIiLCAiXGIiKS5yZXBsYWNlKCJcXGYiLCAiXGYiKS5yZXBsYWNlKCJcXFwiIiwgIlwiIikucmVwbGFjZSgiXFwnIiwgIlwnIikucmVwbGFjZSgiXFxcXCIsICJcXCIpKTsKKwkJJHRva2VuID0gJFNUUklORzsKKwkJfQorCXwJTUxfU1RSSU5HIHskdG9rZW4gPSAkTUxfU1RSSU5HO30KKwl8CUFTVCB7JHRva2VuID0gJEFTVDt9CisJfAlBQ1RJT04geyR0b2tlbiA9ICRBQ1RJT047fQorCTsKKworZmlsZSByZXR1cm5zIFtpbnQgbGluZV0JCisJOglpZCBFWFQ/IHskbGluZSA9ICRpZC5saW5lO30KKwk7CisKK2lkIHJldHVybnMgW2ludCBsaW5lXSAKKwk6CVRPS0VOX1JFRiB7JGxpbmUgPSAkVE9LRU5fUkVGLmxpbmU7fQorCXwJUlVMRV9SRUYgeyRsaW5lID0gJFJVTEVfUkVGLmxpbmU7fQorCTsKKworLy8gTCBFIFggSSBDIEEgTCAgIFIgVSBMIEUgUworCitTTF9DT01NRU5UCisgCToJJy8vJyB+KCdccid8J1xuJykqICdccic/ICdcbicgeyRjaGFubmVsPUhJRERFTjt9CisJOworCitNTF9DT01NRU5UCisJOgknLyonIHskY2hhbm5lbD1ISURERU47fSAuKiAnKi8nCisJOworCitTVFJJTkcJOgknIicgKCBFU0MgfCB+KCdcXCd8JyInKSApKiAnIicge3NldFRleHQoZ2V0VGV4dCgpLnN1YnN0cmluZygxLCBnZXRUZXh0KCkubGVuZ3RoKCktMSkpO30KKwk7CisKK01MX1NUUklORworCToJey8vIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3BhY2VzIG9yIHRhYnMgKGluZGVudGF0aW9uKSBmb3IgbXVsdGktbGluZSBpbnB1dAorCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpbnQgaSA9IC0xOworCQlpbnQgYyA9IGlucHV0LkxBKC0xKTsKKwkJd2hpbGUgKCBjPT0nICcgfHwgYz09J1x0JyApIHsKKwkJCWJ1Zi5hcHBlbmQoKGNoYXIpYyk7CisJCQljID0gaW5wdXQuTEEoLS1pKTsKKwkJfQorCQlTdHJpbmcgaW5kZW50YXRpb24gPSBidWYucmV2ZXJzZSgpLnRvU3RyaW5nKCk7CisJCX0KKwkJJzw8JyAuKiAnPj4nIAorCQl7Ly8gYWxzbyBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIG5ld2xpbmUgc2VwYXJhdG9yIGFuZCBnZXQgaW5mbyBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgMiBjaGFyYWN0ZXJzIChleGNsdWRlICc8PCcgYW5kICc+PicpCisJCVN0cmluZyBuZXdsaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCQlTdHJpbmcgZnJvbnQsIGVuZDsKKwkJaW50IG9sZEZyb250SW5kZXggPSAyOworCQlpbnQgb2xkRW5kSW5kZXggPSBnZXRUZXh0KCkubGVuZ3RoKCktMjsKKwkJaW50IG5ld0Zyb250SW5kZXgsIG5ld0VuZEluZGV4OworCQlpZiAoIG5ld2xpbmUubGVuZ3RoKCk9PTEgKSB7CisJCQlmcm9udCA9IGdldFRleHQoKS5zdWJzdHJpbmcoMiwgMyk7CisJCQllbmQgPSBnZXRUZXh0KCkuc3Vic3RyaW5nKGdldFRleHQoKS5sZW5ndGgoKS0zLCBnZXRUZXh0KCkubGVuZ3RoKCktMik7CisJCQluZXdGcm9udEluZGV4ID0gMzsKKwkJCW5ld0VuZEluZGV4ID0gZ2V0VGV4dCgpLmxlbmd0aCgpLTM7CisJCX0KKwkJZWxzZSB7Ly8gbXVzdCBiZSAyLCBlLmcuIFdpbmRvd3MgU3lzdGVtIHdoaWNoIHVzZXMgXHJcbiBhcyBhIGxpbmUgc2VwYXJhdG9yCisJCQlmcm9udCA9IGdldFRleHQoKS5zdWJzdHJpbmcoMiwgNCk7CisJCQllbmQgPSBnZXRUZXh0KCkuc3Vic3RyaW5nKGdldFRleHQoKS5sZW5ndGgoKS00LCBnZXRUZXh0KCkubGVuZ3RoKCktMik7CisJCQluZXdGcm9udEluZGV4ID0gNDsKKwkJCW5ld0VuZEluZGV4ID0gZ2V0VGV4dCgpLmxlbmd0aCgpLTQ7CisJCX0KKwkJLy8gc3RyaXAgdW53YW50ZWQgY2hhcmFjdGVycywgZS5nLiAnPDwnIChpbmNsdWRpbmcgYSBuZXdsaW5lIGFmdGVyIGl0KSBvciAnPj4nICAoaW5jbHVkaW5nIGEgbmV3bGluZSBiZWZvcmUgaXQpCisJCVN0cmluZyB0ZW1wID0gbnVsbDsKKwkJaWYgKCBmcm9udC5lcXVhbHMobmV3bGluZSkgJiYgZW5kLmVxdWFscyhuZXdsaW5lKSApIHsKKwkJCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2U6IDw8XG4+PiBvciA8PFxyXG4+PgorCQkJaWYgKCBuZXdsaW5lLmxlbmd0aCgpPT0xICYmIGdldFRleHQoKS5sZW5ndGgoKT09NSApIHRlbXAgPSAiIjsKKwkJCWVsc2UgaWYgKCBuZXdsaW5lLmxlbmd0aCgpPT0yICYmIGdldFRleHQoKS5sZW5ndGgoKT09NiApIHRlbXAgPSAiIjsKKwkJCWVsc2UgdGVtcCA9IGdldFRleHQoKS5zdWJzdHJpbmcobmV3RnJvbnRJbmRleCwgbmV3RW5kSW5kZXgpOworCQl9CisJCWVsc2UgaWYgKCBmcm9udC5lcXVhbHMobmV3bGluZSkgKSB7CisJCQl0ZW1wID0gZ2V0VGV4dCgpLnN1YnN0cmluZyhuZXdGcm9udEluZGV4LCBvbGRFbmRJbmRleCk7CisJCX0KKwkJZWxzZSBpZiAoIGVuZC5lcXVhbHMobmV3bGluZSkgKSB7CisJCQl0ZW1wID0gZ2V0VGV4dCgpLnN1YnN0cmluZyhvbGRGcm9udEluZGV4LCBuZXdFbmRJbmRleCk7CisJCX0KKwkJZWxzZSB7CisJCQl0ZW1wID0gZ2V0VGV4dCgpLnN1YnN0cmluZyhvbGRGcm9udEluZGV4LCBvbGRFbmRJbmRleCk7CisJCX0KKwkJLy8gZmluYWxseSB3ZSBuZWVkIHRvIHBycGNlc3MgdGhlIGluZGVudGF0aW9uIGxpbmUgYnkgbGluZQorCQlCdWZmZXJlZFJlYWRlciBidWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0ZW1wKSk7CisJCWJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJU3RyaW5nIGxpbmUgPSBudWxsOworCQlpbnQgY291bnQgPSAwOworCQl0cnkgeworCQkJd2hpbGUoKGxpbmUgPSBidWZSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCWlmICggbGluZS5zdGFydHNXaXRoKGluZGVudGF0aW9uKSApIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhpbmRlbnRhdGlvbi5sZW5ndGgoKSk7CisJCQkJaWYgKCBjb3VudD4wICkgYnVmLmFwcGVuZChuZXdsaW5lKTsKKwkJCQlidWYuYXBwZW5kKGxpbmUpOworCQkJCWNvdW50Kys7CisJCQl9CisJCQlzZXRUZXh0KGJ1Zi50b1N0cmluZygpKTsKKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQlzZXRUZXh0KHRlbXApOworCQl9CisJCX0KKwk7CisKK1RPS0VOX1JFRgorCToJJ0EnLi4nWicgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisJOworCitSVUxFX1JFRgorCToJJ2EnLi4neicgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisJOworCitFWFQJOgknLicoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOScpKzsKKworUkVUVkFMCToJTkVTVEVEX1JFVFZBTCB7c2V0VGV4dChnZXRUZXh0KCkuc3Vic3RyaW5nKDEsIGdldFRleHQoKS5sZW5ndGgoKS0xKSk7fQorCTsKKworZnJhZ21lbnQKK05FU1RFRF9SRVRWQUwgOgorCSdbJworCSgJb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30KKwk6CU5FU1RFRF9SRVRWQUwKKwl8CS4KKwkpKgorCSddJworCTsKKworQVNUCToJTkVTVEVEX0FTVCAoJyAnPyBORVNURURfQVNUKSo7CisKK2ZyYWdtZW50CitORVNURURfQVNUIDoKKwknKCcKKwkoCU5FU1RFRF9BU1QKKwl8ICAgU1RSSU5HX0xJVEVSQUwKKwl8CX4oJygnfCcpJ3wnIicpCisJKSoKKwknKScKKwk7CisKK09QVElPTlMJOgknb3B0aW9ucycgV1MqICd7JworCTsKKworQUNUSU9OCisJOglORVNURURfQUNUSU9OIHtzZXRUZXh0KGdldFRleHQoKS5zdWJzdHJpbmcoMSwgZ2V0VGV4dCgpLmxlbmd0aCgpLTEpKTt9CisJOworCitmcmFnbWVudAorTkVTVEVEX0FDVElPTiA6CisJJ3snCisJKAlvcHRpb25zIHtncmVlZHk9ZmFsc2U7IGs9Mzt9CisJOglORVNURURfQUNUSU9OCisJfAlTVFJJTkdfTElURVJBTAorCXwJQ0hBUl9MSVRFUkFMCisJfAkuCisJKSoKKwknfScKKwk7CisKK2ZyYWdtZW50CitDSEFSX0xJVEVSQUwKKwk6CSdcJycgKCBFU0MgfCB+KCdcJyd8J1xcJykgKSAnXCcnCisJOworCitmcmFnbWVudAorU1RSSU5HX0xJVEVSQUwKKwk6CSciJyAoIEVTQyB8IH4oJ1xcJ3wnIicpICkqICciJworCTsKKworZnJhZ21lbnQKK0VTQwk6CSdcXCcKKwkJKAknbicKKwkJfAkncicKKwkJfAkndCcKKwkJfAknYicKKwkJfAknZicKKwkJfAknIicKKwkJfAknXCcnCisJCXwJJ1xcJworCQl8CSc+JworCQl8CSd1JyBYRElHSVQgWERJR0lUIFhESUdJVCBYRElHSVQKKwkJfAkuIC8vIHVua25vd24sIGxlYXZlIGFzIGl0IGlzCisJCSkKKwk7CisJCitmcmFnbWVudAorWERJR0lUIDoKKwkJJzAnIC4uICc5JworCXwJJ2EnIC4uICdmJworCXwJJ0EnIC4uICdGJworCTsKKworV1MJOgkoCScgJworCQl8CSdcdCcKKwkJfAknXHInPyAnXG4nCisJCSkrCisJCXskY2hhbm5lbD1ISURERU47fQorCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvcGFyc2Vycy9BTlRMUnYzLmcgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3BhcnNlcnMvQU5UTFJ2My5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTcwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3BhcnNlcnMvQU5UTFJ2My5nCkBAIC0wLDAgKzEsNjE5IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIEFOVExSIHYzIGdyYW1tYXIgd3JpdHRlbiBpbiBBTlRMUiB2MyB3aXRoIEFTVCBjb25zdHJ1Y3Rpb24gKi8KK2dyYW1tYXIgQU5UTFJ2MzsKKworb3B0aW9ucyB7CisJb3V0cHV0PUFTVDsKKwlBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgCit9CisKK3Rva2VucyB7CisJRE9DX0NPTU1FTlQ7CisJUEFSU0VSOwkKKyAgICBMRVhFUjsKKyAgICBSVUxFOworICAgIEJMT0NLOworICAgIE9QVElPTkFMOworICAgIENMT1NVUkU7CisgICAgUE9TSVRJVkVfQ0xPU1VSRTsKKyAgICBTWU5QUkVEOworICAgIFJBTkdFOworICAgIENIQVJfUkFOR0U7CisgICAgRVBTSUxPTjsKKyAgICBBTFQ7CisgICAgRU9SOworICAgIEVPQjsKKyAgICBFT0E7IC8vIGVuZCBvZiBhbHQKKyAgICBJRDsKKyAgICBBUkc7CisgICAgQVJHTElTVDsKKyAgICBSRVQ7CisgICAgTEVYRVJfR1JBTU1BUjsKKyAgICBQQVJTRVJfR1JBTU1BUjsKKyAgICBUUkVFX0dSQU1NQVI7CisgICAgQ09NQklORURfR1JBTU1BUjsKKyAgICBJTklUQUNUSU9OOworICAgIExBQkVMOyAvLyAkeCB1c2VkIGluIHJld3JpdGUgcnVsZXMKKyAgICBURU1QTEFURTsKKyAgICBTQ09QRT0nc2NvcGUnOworICAgIFNFTVBSRUQ7CisgICAgR0FURURfU0VNUFJFRDsgLy8ge3B9PyA9PgorICAgIFNZTl9TRU1QUkVEOyAvLyAoLi4uKSA9PiAgIGl0J3MgYSBtYW51YWxseS1zcGVjaWZpZWQgc3lucHJlZCBjb252ZXJ0ZWQgdG8gc2VtcHJlZAorICAgIEJBQ0tUUkFDS19TRU1QUkVEOyAvLyBhdXRvIGJhY2t0cmFja2luZyBtb2RlIHN5biBwcmVkIGNvbnZlcnRlZCB0byBzZW1wcmVkCisgICAgRlJBR01FTlQ9J2ZyYWdtZW50JzsKKyAgICBUUkVFX0JFR0lOPSdeKCc7CisgICAgUk9PVD0nXic7CisgICAgQkFORz0nISc7CisgICAgUkFOR0U9Jy4uJzsKKyAgICBSRVdSSVRFPSctPic7Cit9CisKK0BtZW1iZXJzIHsKKwlpbnQgZ3R5cGU7CisJcHVibGljIExpc3Q8U3RyaW5nPiBydWxlczsKK30KKworQGhlYWRlciB7CitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLnBhcnNlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK30KKworQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5wYXJzZXJzOworfSAKKworCitncmFtbWFyRGVmCisgICAgOiAgIERPQ19DT01NRU5UPworICAgIAkoCSdsZXhlcicgIHtndHlwZT1MRVhFUl9HUkFNTUFSO30gICAgLy8gcHVyZSBsZXhlcgorICAgIAl8ICAgJ3BhcnNlcicge2d0eXBlPVBBUlNFUl9HUkFNTUFSO30gICAvLyBwdXJlIHBhcnNlcgorICAgIAl8ICAgJ3RyZWUnICAge2d0eXBlPVRSRUVfR1JBTU1BUjt9ICAgICAvLyBhIHRyZWUgcGFyc2VyCisgICAgCXwJCSAgICAge2d0eXBlPUNPTUJJTkVEX0dSQU1NQVI7fSAvLyBtZXJnZWQgcGFyc2VyL2xleGVyCisgICAgCSkKKyAgICAJZz0nZ3JhbW1hcicgaWQgJzsnIG9wdGlvbnNTcGVjPyB0b2tlbnNTcGVjPyBhdHRyU2NvcGUqIGFjdGlvbioKKyAgICAJcnVsZSsKKyAgICAJRU9GCisgICAgCS0+IF4oIHthZGFwdG9yLmNyZWF0ZShndHlwZSwkZyl9CisgICAgCQkgIGlkIERPQ19DT01NRU5UPyBvcHRpb25zU3BlYz8gdG9rZW5zU3BlYz8gYXR0clNjb3BlKiBhY3Rpb24qIHJ1bGUrCisgICAgCQkpCisgICAgOworCit0b2tlbnNTcGVjCisJOglUT0tFTlMgdG9rZW5TcGVjKyAnfScgLT4gXihUT0tFTlMgdG9rZW5TcGVjKykKKwk7CisKK3Rva2VuU3BlYworCToJVE9LRU5fUkVGCisJCSgJJz0nIChsaXQ9U1RSSU5HX0xJVEVSQUx8bGl0PUNIQVJfTElURVJBTCkJLT4gXignPScgVE9LRU5fUkVGICRsaXQpCisJCXwJCQkJCQkJCQkJCQktPiBUT0tFTl9SRUYKKwkJKQorCQknOycKKwk7CisKK2F0dHJTY29wZQorCToJJ3Njb3BlJyBpZCBBQ1RJT04gLT4gXignc2NvcGUnIGlkIEFDVElPTikKKwk7CisKKy8qKiBNYXRjaCBzdHVmZiBsaWtlIEBwYXJzZXI6Om1lbWJlcnMge2ludCBpO30gKi8KK2FjdGlvbgorCToJJ0AnIChhY3Rpb25TY29wZU5hbWUgJzo6Jyk/IGlkIEFDVElPTiAtPiBeKCdAJyBhY3Rpb25TY29wZU5hbWU/IGlkIEFDVElPTikKKwk7CisKKy8qKiBTb21ldGltZXMgdGhlIHNjb3BlIG5hbWVzIHdpbGwgY29sbGlkZSB3aXRoIGtleXdvcmRzOyBhbGxvdyB0aGVtIGFzCisgKiAgaWRzIGZvciBhY3Rpb24gc2NvcGVzLgorICovCithY3Rpb25TY29wZU5hbWUKKwk6CWlkCisJfAlsPSdsZXhlcicJLT4gSURbJGxdCisgICAgfCAgIHA9J3BhcnNlcicJLT4gSURbJHBdCisJOworCitvcHRpb25zU3BlYworCToJT1BUSU9OUyAob3B0aW9uICc7JykrICd9JyAtPiBeKE9QVElPTlMgb3B0aW9uKykKKwk7CisKK29wdGlvbgorICAgIDogICBpZCAnPScgb3B0aW9uVmFsdWUgLT4gXignPScgaWQgb3B0aW9uVmFsdWUpCisgCTsKKyAJCitvcHRpb25WYWx1ZQorICAgIDogICBpZAorICAgIHwgICBTVFJJTkdfTElURVJBTAorICAgIHwgICBDSEFSX0xJVEVSQUwKKyAgICB8ICAgSU5UCisgICAgfAlzPScqJyAtPiBTVFJJTkdfTElURVJBTFskc10gIC8vIHVzZWQgZm9yIGs9KgorICAgIDsKKworcnVsZQorc2NvcGUgeworCVN0cmluZyBuYW1lOworfQorQGFmdGVyeworCXRoaXMucnVsZXMuYWRkKCRydWxlOjpuYW1lKTsKK30KKwk6CURPQ19DT01NRU5UPworCQkoIG1vZGlmaWVyPSgncHJvdGVjdGVkJ3wncHVibGljJ3wncHJpdmF0ZSd8J2ZyYWdtZW50JykgKT8KKwkJaWQgeyRydWxlOjpuYW1lID0gJGlkLnRleHQ7fQorCQknISc/CisJCSggYXJnPUFSR19BQ1RJT04gKT8KKwkJKCAncmV0dXJucycgcnQ9QVJHX0FDVElPTiAgKT8KKwkJdGhyb3dzU3BlYz8gb3B0aW9uc1NwZWM/IHJ1bGVTY29wZVNwZWM/IHJ1bGVBY3Rpb24qCisJCSc6JwlhbHRMaXN0CSc7JworCQlleGNlcHRpb25Hcm91cD8KKwkgICAgLT4gXiggUlVMRSBpZCB7bW9kaWZpZXIhPW51bGw/YWRhcHRvci5jcmVhdGUobW9kaWZpZXIpOm51bGx9IF4oQVJHICRhcmcpPyBeKFJFVCAkcnQpPworCSAgICAJICBvcHRpb25zU3BlYz8gcnVsZVNjb3BlU3BlYz8gcnVsZUFjdGlvbioKKwkgICAgCSAgYWx0TGlzdAorCSAgICAJICBleGNlcHRpb25Hcm91cD8KKwkgICAgCSAgRU9SWyJFT1IiXQorCSAgICAJKQorCTsKKworLyoqIE1hdGNoIHN0dWZmIGxpa2UgQGluaXQge2ludCBpO30gKi8KK3J1bGVBY3Rpb24KKwk6CSdAJyBpZCBBQ1RJT04gLT4gXignQCcgaWQgQUNUSU9OKQorCTsKKwordGhyb3dzU3BlYworCToJJ3Rocm93cycgaWQgKCAnLCcgaWQgKSogLT4gXigndGhyb3dzJyBpZCspCisJOworCitydWxlU2NvcGVTcGVjCisJOgknc2NvcGUnIEFDVElPTiAtPiBeKCdzY29wZScgQUNUSU9OKQorCXwJJ3Njb3BlJyBpZCAoJywnIGlkKSogJzsnIC0+IF4oJ3Njb3BlJyBpZCspCisJfAknc2NvcGUnIEFDVElPTgorCQknc2NvcGUnIGlkICgnLCcgaWQpKiAnOycKKwkJLT4gXignc2NvcGUnIEFDVElPTiBpZCsgKQorCTsKKworYmxvY2sKKyAgICA6ICAgbHA9JygnCisJCSggKG9wdHM9b3B0aW9uc1NwZWMpPyAnOicgKT8KKwkJYTE9YWx0ZXJuYXRpdmUgcmV3cml0ZSAoICd8JyBhMj1hbHRlcm5hdGl2ZSByZXdyaXRlICkqCisgICAgICAgIHJwPScpJworICAgICAgICAtPiBeKCBCTE9DS1skbHAsIkJMT0NLIl0gb3B0aW9uc1NwZWM/IChhbHRlcm5hdGl2ZSByZXdyaXRlPykrIEVPQlskcnAsIkVPQiJdICkKKyAgICA7CisKK2FsdExpc3QKK0Bpbml0IHsKKwkvLyBtdXN0IGNyZWF0ZSByb290IG1hbnVhbGx5IGFzIGl0J3MgdXNlZCBieSBpbnZva2VkIHJ1bGVzIGluIHJlYWwgYW50bHIgdG9vbC4KKwkvLyBsZWF2ZSBoZXJlIHRvIGRlbW9uc3RyYXRlIHVzZSBvZiB7Li4ufSBpbiByZXdyaXRlIHJ1bGUKKwkvLyBpdCdzIHJlYWxseSBCTE9DS1tmaXJzdFRva2VuLCJCTE9DSyJdOyBzZXQgbGluZS9jb2wgdG8gcHJldmlvdXMgKCBvciA6IHRva2VuLgorICAgIENvbW1vblRyZWUgYmxrUm9vdCA9IChDb21tb25UcmVlKWFkYXB0b3IuY3JlYXRlKEJMT0NLLGlucHV0LkxUKC0xKSwiQkxPQ0siKTsKK30KKyAgICA6ICAgYTE9YWx0ZXJuYXRpdmUgcmV3cml0ZSAoICd8JyBhMj1hbHRlcm5hdGl2ZSByZXdyaXRlICkqCisJCS0+IF4oIHtibGtSb290fSAoYWx0ZXJuYXRpdmUgcmV3cml0ZT8pKyBFT0JbIkVPQiJdICkKKyAgICA7CisKK2FsdGVybmF0aXZlCitAaW5pdCB7CisJVG9rZW4gZmlyc3RUb2tlbiA9IGlucHV0LkxUKDEpOworCVRva2VuIHByZXZUb2tlbiA9IGlucHV0LkxUKC0xKTsgLy8gZWl0aGVyIDogb3IgfCBJIHRoaW5rCit9CisgICAgOiAgIGVsZW1lbnQrIC0+IF4oQUxUW2ZpcnN0VG9rZW4sIkFMVCJdIGVsZW1lbnQrIEVPQVsiRU9BIl0pCisgICAgfCAgIC0+IF4oQUxUW3ByZXZUb2tlbiwiQUxUIl0gRVBTSUxPTltwcmV2VG9rZW4sIkVQU0lMT04iXSBFT0FbIkVPQSJdKQorICAgIDsKKworZXhjZXB0aW9uR3JvdXAKKwk6CSggZXhjZXB0aW9uSGFuZGxlciApKyAoIGZpbmFsbHlDbGF1c2UgKT8KKwl8CWZpbmFsbHlDbGF1c2UKKyAgICA7CisKK2V4Y2VwdGlvbkhhbmRsZXIKKyAgICA6ICAgICdjYXRjaCcgQVJHX0FDVElPTiBBQ1RJT04gLT4gXignY2F0Y2gnIEFSR19BQ1RJT04gQUNUSU9OKQorICAgIDsKKworZmluYWxseUNsYXVzZQorICAgIDogICAgJ2ZpbmFsbHknIEFDVElPTiAtPiBeKCdmaW5hbGx5JyBBQ1RJT04pCisgICAgOworCitlbGVtZW50CisJOgllbGVtZW50Tm9PcHRpb25TcGVjCisJOworCitlbGVtZW50Tm9PcHRpb25TcGVjCisJOglpZCAobGFiZWxPcD0nPSd8bGFiZWxPcD0nKz0nKSBhdG9tCisJCSgJZWJuZlN1ZmZpeAktPiBeKCBlYm5mU3VmZml4IF4oQkxPQ0tbIkJMT0NLIl0gXihBTFRbIkFMVCJdIF4oJGxhYmVsT3AgaWQgYXRvbSkgRU9BWyJFT0EiXSkgRU9CWyJFT0IiXSkpCisJCXwJCQkJLT4gXigkbGFiZWxPcCBpZCBhdG9tKQorCQkpCisJfAlpZCAobGFiZWxPcD0nPSd8bGFiZWxPcD0nKz0nKSBibG9jaworCQkoCWVibmZTdWZmaXgJLT4gXiggZWJuZlN1ZmZpeCBeKEJMT0NLWyJCTE9DSyJdIF4oQUxUWyJBTFQiXSBeKCRsYWJlbE9wIGlkIGJsb2NrKSBFT0FbIkVPQSJdKSBFT0JbIkVPQiJdKSkKKwkJfAkJCQktPiBeKCRsYWJlbE9wIGlkIGJsb2NrKQorCQkpCisJfAlhdG9tCisJCSgJZWJuZlN1ZmZpeAktPiBeKCBlYm5mU3VmZml4IF4oQkxPQ0tbIkJMT0NLIl0gXihBTFRbIkFMVCJdIGF0b20gRU9BWyJFT0EiXSkgRU9CWyJFT0IiXSkgKQorCQl8CQkJCS0+IGF0b20KKwkJKQorCXwJZWJuZgorCXwgICBBQ1RJT04KKwl8ICAgU0VNUFJFRCAoICc9PicgLT4gR0FURURfU0VNUFJFRCB8IC0+IFNFTVBSRUQgKQorCXwgICB0cmVlU3BlYworCQkoCWVibmZTdWZmaXgJLT4gXiggZWJuZlN1ZmZpeCBeKEJMT0NLWyJCTE9DSyJdIF4oQUxUWyJBTFQiXSB0cmVlU3BlYyBFT0FbIkVPQSJdKSBFT0JbIkVPQiJdKSApCisJCXwJCQkJLT4gdHJlZVNwZWMKKwkJKQorCTsKKworYXRvbTogICByYW5nZSAoIChvcD0nXid8b3A9JyEnKSAtPiBeKCRvcCByYW5nZSkgfCAtPiByYW5nZSApCisgICAgfCAgIHRlcm1pbmFsCisgICAgfAlub3RTZXQgKCAob3A9J14nfG9wPSchJykgLT4gXigkb3Agbm90U2V0KSB8IC0+IG5vdFNldCApCisgICAgfCAgIFJVTEVfUkVGICggYXJnPUFSR19BQ1RJT04gKT8gKCAob3A9J14nfG9wPSchJykgKT8KKyAgICAJLT4geyRhcmchPW51bGwmJm9wIT1udWxsfT8JXigkb3AgUlVMRV9SRUYgJGFyZykKKyAgICAJLT4geyRhcmchPW51bGx9PwkJCV4oUlVMRV9SRUYgJGFyZykKKyAgICAJLT4geyRvcCE9bnVsbH0/CQkJCV4oJG9wIFJVTEVfUkVGKQorICAgIAktPiBSVUxFX1JFRgorICAgIDsKKworbm90U2V0CisJOgknficKKwkJKAlub3RUZXJtaW5hbAktPiBeKCd+JyBub3RUZXJtaW5hbCkKKwkJfAlibG9jawkJLT4gXignficgYmxvY2spCisJCSkKKwk7CisKK3RyZWVTcGVjCisJOgknXignIGVsZW1lbnQgKCBlbGVtZW50ICkrICcpJyAtPiBeKFRSRUVfQkVHSU4gZWxlbWVudCspCisJOworCisvKiogTWF0Y2hlcyBFTkJGIGJsb2NrcyAoYW5kIHRva2VuIHNldHMgdmlhIGJsb2NrIHJ1bGUpICovCitlYm5mCitAaW5pdCB7CisgICAgVG9rZW4gZmlyc3RUb2tlbiA9IGlucHV0LkxUKDEpOworfQorQGFmdGVyIHsKKwkkZWJuZi50cmVlLmdldFRva2VuKCkuc2V0TGluZShmaXJzdFRva2VuLmdldExpbmUoKSk7CisJJGVibmYudHJlZS5nZXRUb2tlbigpLnNldENoYXJQb3NpdGlvbkluTGluZShmaXJzdFRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpKTsKK30KKwk6CWJsb2NrCisJCSgJb3A9Jz8nCS0+IF4oT1BUSU9OQUxbb3BdIGJsb2NrKQorCQl8CW9wPScqJwktPiBeKENMT1NVUkVbb3BdIGJsb2NrKQorCQl8CW9wPScrJwktPiBeKFBPU0lUSVZFX0NMT1NVUkVbb3BdIGJsb2NrKQorCQl8ICAgJz0+JwkvLyBzeW50YWN0aWMgcHJlZGljYXRlCisJCQkJCS0+IHtndHlwZT09Q09NQklORURfR1JBTU1BUiAmJgorCQkJCQkgICAgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKCRydWxlOjpuYW1lLmNoYXJBdCgwKSl9PworCQkJCQkgICAvLyBpZiBsZXhlciBydWxlIGluIGNvbWJpbmVkLCBsZWF2ZSBhcyBwcmVkIGZvciBsZXhlcgorCQkJCQkgICBeKFNZTlBSRURbIj0+Il0gYmxvY2spCisJCQkJCS8vIGluIHJlYWwgYW50bHIgdG9vbCwgdGV4dCBmb3IgU1lOX1NFTVBSRUQgaXMgcHJlZG5hbWUKKwkJCQkJLT4gU1lOX1NFTVBSRUQKKyAgICAgICAgfAkJCS0+IGJsb2NrCisJCSkKKwk7CisKK3JhbmdlIQorCToJYzE9Q0hBUl9MSVRFUkFMIFJBTkdFIGMyPUNIQVJfTElURVJBTCAtPiBeKENIQVJfUkFOR0VbJGMxLCIuLiJdICRjMSAkYzIpCisJOworCit0ZXJtaW5hbAorICAgIDogICAoCUNIQVJfTElURVJBTAkJCQktPiBDSEFSX0xJVEVSQUwKKyAgICAJCS8vIEFyZ3MgYXJlIG9ubHkgdmFsaWQgZm9yIGxleGVyIHJ1bGVzCisJCXwgICBUT0tFTl9SRUYKKwkJCSggQVJHX0FDVElPTgkJCQktPiBeKFRPS0VOX1JFRiBBUkdfQUNUSU9OKQorCQkJfAkJCQkJCQktPiBUT0tFTl9SRUYKKwkJCSkKKwkJfCAgIFNUUklOR19MSVRFUkFMCQkJCS0+IFNUUklOR19MSVRFUkFMCisJCXwgICAnLicJCQkJCQkJLT4gJy4nCisJCSkJCisJCSgJJ14nCQkJCQkJCS0+IF4oJ14nICR0ZXJtaW5hbCkKKwkJfAknIScgCQkJCQkJLT4gXignIScgJHRlcm1pbmFsKQorCQkpPworCTsKKworbm90VGVybWluYWwKKwk6ICAgQ0hBUl9MSVRFUkFMCisJfAlUT0tFTl9SRUYKKwl8CVNUUklOR19MSVRFUkFMCisJOworCQorZWJuZlN1ZmZpeAorQGluaXQgeworCVRva2VuIG9wID0gaW5wdXQuTFQoMSk7Cit9CisJOgknPycJLT4gT1BUSU9OQUxbb3BdCisgIAl8CScqJyAtPiBDTE9TVVJFW29wXQorICAgCXwJJysnIC0+IFBPU0lUSVZFX0NMT1NVUkVbb3BdCisJOworCQorCisKKy8vIFIgRSBXIFIgSSBUIEUgIFMgWSBOIFQgQSBYCisKK3Jld3JpdGUKK0Bpbml0IHsKKwlUb2tlbiBmaXJzdFRva2VuID0gaW5wdXQuTFQoMSk7Cit9CisJOgkocmV3Kz0nLT4nIHByZWRzKz1TRU1QUkVEIHByZWRpY2F0ZWQrPXJld3JpdGVfYWx0ZXJuYXRpdmUpKgorCQlyZXcyPSctPicgbGFzdD1yZXdyaXRlX2FsdGVybmF0aXZlCisgICAgICAgIC0+IF4oJHJldyAkcHJlZHMgJHByZWRpY2F0ZWQpKiBeKCRyZXcyICRsYXN0KQorCXwKKwk7CisKK3Jld3JpdGVfYWx0ZXJuYXRpdmUKK29wdGlvbnMge2JhY2t0cmFjaz10cnVlO30KKwk6CXJld3JpdGVfdGVtcGxhdGUKKwl8CXJld3JpdGVfdHJlZV9hbHRlcm5hdGl2ZQorICAgCXwgICAvKiBlbXB0eSByZXdyaXRlICovIC0+IF4oQUxUWyJBTFQiXSBFUFNJTE9OWyJFUFNJTE9OIl0gRU9BWyJFT0EiXSkKKwk7CisJCityZXdyaXRlX3RyZWVfYmxvY2sKKyAgICA6ICAgbHA9JygnIHJld3JpdGVfdHJlZV9hbHRlcm5hdGl2ZSAnKScKKyAgICAJLT4gXihCTE9DS1skbHAsIkJMT0NLIl0gcmV3cml0ZV90cmVlX2FsdGVybmF0aXZlIEVPQlskbHAsIkVPQiJdKQorICAgIDsKKworcmV3cml0ZV90cmVlX2FsdGVybmF0aXZlCisgICAgOglyZXdyaXRlX3RyZWVfZWxlbWVudCsgLT4gXihBTFRbIkFMVCJdIHJld3JpdGVfdHJlZV9lbGVtZW50KyBFT0FbIkVPQSJdKQorICAgIDsKKworcmV3cml0ZV90cmVlX2VsZW1lbnQKKwk6CXJld3JpdGVfdHJlZV9hdG9tCisJfAlyZXdyaXRlX3RyZWVfYXRvbSBlYm5mU3VmZml4CisJCS0+IF4oIGVibmZTdWZmaXggXihCTE9DS1siQkxPQ0siXSBeKEFMVFsiQUxUIl0gcmV3cml0ZV90cmVlX2F0b20gRU9BWyJFT0EiXSkgRU9CWyJFT0IiXSkpCisJfCAgIHJld3JpdGVfdHJlZQorCQkoCWVibmZTdWZmaXgKKwkJCS0+IF4oZWJuZlN1ZmZpeCBeKEJMT0NLWyJCTE9DSyJdIF4oQUxUWyJBTFQiXSByZXdyaXRlX3RyZWUgRU9BWyJFT0EiXSkgRU9CWyJFT0IiXSkpCisJCXwJLT4gcmV3cml0ZV90cmVlCisJCSkKKwl8ICAgcmV3cml0ZV90cmVlX2VibmYKKwk7CisKK3Jld3JpdGVfdHJlZV9hdG9tCisgICAgOiAgIENIQVJfTElURVJBTAorCXwgICBUT0tFTl9SRUYgQVJHX0FDVElPTj8gLT4gXihUT0tFTl9SRUYgQVJHX0FDVElPTj8pIC8vIGZvciBpbWFnaW5hcnkgbm9kZXMKKyAgICB8ICAgUlVMRV9SRUYKKwl8ICAgU1RSSU5HX0xJVEVSQUwKKwl8ICAgZD0nJCcgaWQgLT4gTEFCRUxbJGQsJGlkLnRleHRdIC8vIHJlZmVyZW5jZSB0byBhIGxhYmVsIGluIGEgcmV3cml0ZSBydWxlCisJfAlBQ1RJT04KKwk7CisKK3Jld3JpdGVfdHJlZV9lYm5mCitAaW5pdCB7CisgICAgVG9rZW4gZmlyc3RUb2tlbiA9IGlucHV0LkxUKDEpOworfQorQGFmdGVyIHsKKwkkcmV3cml0ZV90cmVlX2VibmYudHJlZS5nZXRUb2tlbigpLnNldExpbmUoZmlyc3RUb2tlbi5nZXRMaW5lKCkpOworCSRyZXdyaXRlX3RyZWVfZWJuZi50cmVlLmdldFRva2VuKCkuc2V0Q2hhclBvc2l0aW9uSW5MaW5lKGZpcnN0VG9rZW4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkpOworfQorCToJcmV3cml0ZV90cmVlX2Jsb2NrIGVibmZTdWZmaXggLT4gXihlYm5mU3VmZml4IHJld3JpdGVfdHJlZV9ibG9jaykKKwk7CisJCityZXdyaXRlX3RyZWUKKwk6CSdeKCcgcmV3cml0ZV90cmVlX2F0b20gcmV3cml0ZV90cmVlX2VsZW1lbnQqICcpJworCQktPiBeKFRSRUVfQkVHSU4gcmV3cml0ZV90cmVlX2F0b20gcmV3cml0ZV90cmVlX2VsZW1lbnQqICkKKwk7CisKKy8qKiBCdWlsZCBhIHRyZWUgZm9yIGEgdGVtcGxhdGUgcmV3cml0ZToKKyAgICAgIF4oVEVNUExBVEUgKElEfEFDVElPTikgXihBUkdMSVNUIF4oQVJHIElEIEFDVElPTikgLi4uKSApCisgICAgd2hlcmUgQVJHTElTVCBpcyBhbHdheXMgdGhlcmUgZXZlbiBpZiBubyBhcmdzIGV4aXN0LgorICAgIElEIGNhbiBiZSAidGVtcGxhdGUiIGtleXdvcmQuICBJZiBmaXJzdCBjaGlsZCBpcyBBQ1RJT04gdGhlbiBpdCdzCisgICAgYW4gaW5kaXJlY3QgdGVtcGxhdGUgcmVmCisKKyAgICAtPiBmb28oYT17Li4ufSwgYj17Li4ufSkKKyAgICAtPiAoe3N0cmluZy1lfSkoYT17Li4ufSwgYj17Li4ufSkgIC8vIGUgZXZhbHVhdGVzIHRvIHRlbXBsYXRlIG5hbWUKKyAgICAtPiB7JXskSUQudGV4dH19IC8vIGNyZWF0ZSBsaXRlcmFsIHRlbXBsYXRlIGZyb20gc3RyaW5nIChkb25lIGluIEFjdGlvblRyYW5zbGF0b3IpCisJLT4ge3N0LWV4cHJ9IC8vIHN0LWV4cHIgZXZhbHVhdGVzIHRvIFNUCisgKi8KK3Jld3JpdGVfdGVtcGxhdGUKKwk6ICAgLy8gLT4gdGVtcGxhdGUoYT17Li4ufSwuLi4pICIuLi4iICAgIGlubGluZSB0ZW1wbGF0ZQorCQlpZCBscD0nKCcgcmV3cml0ZV90ZW1wbGF0ZV9hcmdzCScpJworCQkoIHN0cj1ET1VCTEVfUVVPVEVfU1RSSU5HX0xJVEVSQUwgfCBzdHI9RE9VQkxFX0FOR0xFX1NUUklOR19MSVRFUkFMICkKKwkJLT4gXihURU1QTEFURVskbHAsIlRFTVBMQVRFIl0gaWQgcmV3cml0ZV90ZW1wbGF0ZV9hcmdzICRzdHIpCisKKwl8CS8vIC0+IGZvbyhhPXsuLi59LCAuLi4pCisJCXJld3JpdGVfdGVtcGxhdGVfcmVmCisKKwl8CS8vIC0+ICh7ZXhwcn0pKGE9ey4uLn0sIC4uLikKKwkJcmV3cml0ZV9pbmRpcmVjdF90ZW1wbGF0ZV9oZWFkCisKKwl8CS8vIC0+IHsuLi59CisJCUFDVElPTgorCTsKKworLyoqIC0+IGZvbyhhPXsuLi59LCAuLi4pICovCityZXdyaXRlX3RlbXBsYXRlX3JlZgorCToJaWQgbHA9JygnIHJld3JpdGVfdGVtcGxhdGVfYXJncwknKScKKwkJLT4gXihURU1QTEFURVskbHAsIlRFTVBMQVRFIl0gaWQgcmV3cml0ZV90ZW1wbGF0ZV9hcmdzKQorCTsKKworLyoqIC0+ICh7ZXhwcn0pKGE9ey4uLn0sIC4uLikgKi8KK3Jld3JpdGVfaW5kaXJlY3RfdGVtcGxhdGVfaGVhZAorCToJbHA9JygnIEFDVElPTiAnKScgJygnIHJld3JpdGVfdGVtcGxhdGVfYXJncyAnKScKKwkJLT4gXihURU1QTEFURVskbHAsIlRFTVBMQVRFIl0gQUNUSU9OIHJld3JpdGVfdGVtcGxhdGVfYXJncykKKwk7CisKK3Jld3JpdGVfdGVtcGxhdGVfYXJncworCToJcmV3cml0ZV90ZW1wbGF0ZV9hcmcgKCcsJyByZXdyaXRlX3RlbXBsYXRlX2FyZykqCisJCS0+IF4oQVJHTElTVCByZXdyaXRlX3RlbXBsYXRlX2FyZyspCisJfAktPiBBUkdMSVNUCisJOworCityZXdyaXRlX3RlbXBsYXRlX2FyZworCTogICBpZCAnPScgQUNUSU9OIC0+IF4oQVJHWyRpZC5zdGFydF0gaWQgQUNUSU9OKQorCTsKKworaWQJOglUT0tFTl9SRUYgLT4gSURbJFRPS0VOX1JFRl0KKwl8CVJVTEVfUkVGICAtPiBJRFskUlVMRV9SRUZdCisJOworCisvLyBMIEUgWCBJIEMgQSBMICAgUiBVIEwgRSBTCisKK1NMX0NPTU1FTlQKKyAJOgknLy8nCisgCSAJKAknICRBTlRMUiAnIFNSQyAvLyBzcmMgZGlyZWN0aXZlCisgCQl8CX4oJ1xyJ3wnXG4nKSoKKwkJKQorCQknXHInPyAnXG4nCisJCXskY2hhbm5lbD1ISURERU47fQorCTsKKworTUxfQ09NTUVOVAorCToJJy8qJyB7aWYgKGlucHV0LkxBKDEpPT0nKicpICR0eXBlPURPQ19DT01NRU5UOyBlbHNlICRjaGFubmVsPUhJRERFTjt9IC4qICcqLycKKwk7CisKK0NIQVJfTElURVJBTAorCToJJ1wnJyBMSVRFUkFMX0NIQVIgJ1wnJworCTsKKworU1RSSU5HX0xJVEVSQUwKKwk6CSdcJycgTElURVJBTF9DSEFSIExJVEVSQUxfQ0hBUiogJ1wnJworCTsKKworZnJhZ21lbnQKK0xJVEVSQUxfQ0hBUgorCToJRVNDCisJfAl+KCdcJyd8J1xcJykKKwk7CisKK0RPVUJMRV9RVU9URV9TVFJJTkdfTElURVJBTAorCToJJyInIChFU0MgfCB+KCdcXCd8JyInKSkqICciJworCTsKKworRE9VQkxFX0FOR0xFX1NUUklOR19MSVRFUkFMCisJOgknPDwnIC4qICc+PicKKwk7CisKK2ZyYWdtZW50CitFU0MJOgknXFwnCisJCSgJJ24nCisJCXwJJ3InCisJCXwJJ3QnCisJCXwJJ2InCisJCXwJJ2YnCisJCXwJJyInCisJCXwJJ1wnJworCQl8CSdcXCcKKwkJfAknPicKKwkJfAkndScgWERJR0lUIFhESUdJVCBYRElHSVQgWERJR0lUCisJCXwJLiAvLyB1bmtub3duLCBsZWF2ZSBhcyBpdCBpcworCQkpCisJOworCitmcmFnbWVudAorWERJR0lUIDoKKwkJJzAnIC4uICc5JworCXwJJ2EnIC4uICdmJworCXwJJ0EnIC4uICdGJworCTsKKworSU5UCToJJzAnLi4nOScrCisJOworCitBUkdfQUNUSU9OCisJOglORVNURURfQVJHX0FDVElPTgorCTsKKworZnJhZ21lbnQKK05FU1RFRF9BUkdfQUNUSU9OIDoKKwknWycKKwkoCW9wdGlvbnMge2dyZWVkeT1mYWxzZTsgaz0xO30KKwk6CU5FU1RFRF9BUkdfQUNUSU9OCisJfAlBQ1RJT05fU1RSSU5HX0xJVEVSQUwKKwl8CUFDVElPTl9DSEFSX0xJVEVSQUwKKwl8CS4KKwkpKgorCSddJworCXtzZXRUZXh0KGdldFRleHQoKS5zdWJzdHJpbmcoMSwgZ2V0VGV4dCgpLmxlbmd0aCgpLTEpKTt9CisJOworCitBQ1RJT04KKwk6CU5FU1RFRF9BQ1RJT04gKCAnPycgeyR0eXBlID0gU0VNUFJFRDt9ICk/CisJOworCitmcmFnbWVudAorTkVTVEVEX0FDVElPTiA6CisJJ3snCisJKAlvcHRpb25zIHtncmVlZHk9ZmFsc2U7IGs9Mjt9CisJOglORVNURURfQUNUSU9OCisJfAlTTF9DT01NRU5UCisJfAlNTF9DT01NRU5UCisJfAlBQ1RJT05fU1RSSU5HX0xJVEVSQUwKKwl8CUFDVElPTl9DSEFSX0xJVEVSQUwKKwl8CS4KKwkpKgorCSd9JworICAgOworCitmcmFnbWVudAorQUNUSU9OX0NIQVJfTElURVJBTAorCToJJ1wnJyAoQUNUSU9OX0VTQ3x+KCdcXCd8J1wnJykpICdcJycKKwk7CisKK2ZyYWdtZW50CitBQ1RJT05fU1RSSU5HX0xJVEVSQUwKKwk6CSciJyAoQUNUSU9OX0VTQ3x+KCdcXCd8JyInKSkqICciJworCTsKKworZnJhZ21lbnQKK0FDVElPTl9FU0MKKwk6CSdcXFwnJworCXwJJ1xcJyAnIicgLy8gQU5UTFIgZG9lc24ndCBsaWtlOiAnXFwiJworCXwJJ1xcJyB+KCdcJyd8JyInKQorCTsKKworVE9LRU5fUkVGCisJOgknQScuLidaJyAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKwk7CisKK1JVTEVfUkVGCisJOgknYScuLid6JyAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKwk7CisKKy8qKiBNYXRjaCB0aGUgc3RhcnQgb2YgYW4gb3B0aW9ucyBzZWN0aW9uLiAgRG9uJ3QgYWxsb3cgbm9ybWFsCisgKiAgYWN0aW9uIHByb2Nlc3Npbmcgb24gdGhlIHsuLi59IGFzIGl0J3Mgbm90IGEgYWN0aW9uLgorICovCitPUFRJT05TCisJOgknb3B0aW9ucycgV1NfTE9PUCAneycKKwk7CisJCitUT0tFTlMKKwk6CSd0b2tlbnMnIFdTX0xPT1AgJ3snCisJOworCisvKiogUmVzZXQgdGhlIGZpbGUgYW5kIGxpbmUgaW5mb3JtYXRpb247IHVzZWZ1bCB3aGVuIHRoZSBncmFtbWFyCisgKiAgaGFzIGJlZW4gZ2VuZXJhdGVkIHNvIHRoYXQgZXJyb3JzIGFyZSBzaG93biByZWxhdGl2ZSB0byB0aGUKKyAqICBvcmlnaW5hbCBmaWxlIGxpa2UgdGhlIG9sZCBDIHByZXByb2Nlc3NvciB1c2VkIHRvIGRvLgorICovCitmcmFnbWVudAorU1JDCToJJ3NyYycgJyAnIGZpbGU9QUNUSU9OX1NUUklOR19MSVRFUkFMICcgJyBsaW5lPUlOVAorCTsKKworV1MJOgkoCScgJworCQl8CSdcdCcKKwkJfAknXHInPyAnXG4nCisJCSkrCisJCXskY2hhbm5lbD1ISURERU47fQorCTsKKworZnJhZ21lbnQKK1dTX0xPT1AKKwk6CSgJV1MKKwkJfAlTTF9DT01NRU5UCisJCXwJTUxfQ09NTUVOVAorCQkpKgorCTsKKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3BhcnNlcnMvU3RHVW5pdC5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9wYXJzZXJzL1N0R1VuaXQuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzAxMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9wYXJzZXJzL1N0R1VuaXQuZwpAQCAtMCwwICsxLDIxMyBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNy0yMDA4IExlb24gSmVuLVl1YW4gU3UKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworZ3JhbW1hciBTdEdVbml0OworCitvcHRpb25zIHtsYW5ndWFnZT1KYXZhO30KKwordG9rZW5zIHsKKwlPSyA9ICdPSyc7CisJRkFJTCA9ICdGQUlMJzsKKwlET0NfQ09NTUVOVDsKK30KKworQGhlYWRlciB7CitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLnBhcnNlcnM7CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWwuKjsKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5ydW5uZXIuKjsKK30KKworQGxleGVyOjpoZWFkZXIge3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWkucGFyc2Vyczt9CisKK0BtZW1iZXJzIHsKK3B1YmxpYyBUZXN0U3VpdGVBZGFwdGVyIGFkYXB0ZXIgOzsKK30KKworZ1VuaXREZWYKKwk6CSdndW5pdCcgbmFtZT1pZCB7YWRhcHRlci5zZXRHcmFtbWFyTmFtZSgkbmFtZS50ZXh0KTt9CisJICAgICgnd2Fsa3MnIGlkKT8gJzsnIAorCQloZWFkZXI/IHN1aXRlKgorCTsKKworaGVhZGVyCisJOgknQGhlYWRlcicgQUNUSU9OCisJOworCQkKK3N1aXRlCisJOgkoCXBhcnNlclJ1bGU9UlVMRV9SRUYgKCd3YWxrcycgUlVMRV9SRUYpPyAKKwkgICAgICAgIHthZGFwdGVyLnN0YXJ0UnVsZSgkcGFyc2VyUnVsZS50ZXh0KTt9CisJCXwJbGV4ZXJSdWxlPVRPS0VOX1JFRiAKKwkJCXthZGFwdGVyLnN0YXJ0UnVsZSgkbGV4ZXJSdWxlLnRleHQpO30KKwkJKQorCQknOicKKwkJdGVzdCsKKwkJe2FkYXB0ZXIuZW5kUnVsZSgpO30KKwk7CisKK3Rlc3QKKwk6CWlucHV0IGV4cGVjdAorCQl7YWRhcHRlci5hZGRUZXN0Q2FzZSgkaW5wdXQuaW4sICRleHBlY3Qub3V0KTt9CisJOworCQorZXhwZWN0IHJldHVybnMgW0lUZXN0Q2FzZU91dHB1dCBvdXRdCisJOglPSwkJCXskb3V0ID0gYWRhcHRlci5jcmVhdGVCb29sT3V0cHV0KHRydWUpO30KKwl8CUZBSUwJCXskb3V0ID0gYWRhcHRlci5jcmVhdGVCb29sT3V0cHV0KGZhbHNlKTt9CisJfAkncmV0dXJucycgUkVUVkFMIHskb3V0ID0gYWRhcHRlci5jcmVhdGVSZXR1cm5PdXRwdXQoJFJFVFZBTC50ZXh0KTt9CisJfAknLT4nIG91dHB1dCB7JG91dCA9IGFkYXB0ZXIuY3JlYXRlU3RkT3V0cHV0KCRvdXRwdXQudGV4dCk7fQorCXwJJy0+JyBBU1QJeyRvdXQgPSBhZGFwdGVyLmNyZWF0ZUFzdE91dHB1dCgkQVNULnRleHQpO30KKwk7CisKK2lucHV0IHJldHVybnMgW0lUZXN0Q2FzZUlucHV0IGluXQorCToJU1RSSU5HIAkJeyRpbiA9IGFkYXB0ZXIuY3JlYXRlU3RyaW5nSW5wdXQoJFNUUklORy50ZXh0KTt9CisJfAlNTF9TVFJJTkcJeyRpbiA9IGFkYXB0ZXIuY3JlYXRlTXVsdGlJbnB1dCgkTUxfU1RSSU5HLnRleHQpO30KKwl8CWZpbGVJbnB1dAl7JGluID0gYWRhcHRlci5jcmVhdGVGaWxlSW5wdXQoJGZpbGVJbnB1dC5wYXRoKTt9CisJOworCitvdXRwdXQKKwk6CVNUUklORworCXwJTUxfU1RSSU5HCisJfAlBQ1RJT04KKwk7CisJCitmaWxlSW5wdXQgcmV0dXJucyBbU3RyaW5nIHBhdGhdCisJOglpZCB7JHBhdGggPSAkaWQudGV4dDt9IChFWFQgeyRwYXRoICs9ICRFWFQudGV4dDt9KT8gCisJOworCitpZCAJOglUT0tFTl9SRUYKKwl8CVJVTEVfUkVGCisJOworCisvLyBMIEUgWCBJIEMgQSBMICAgUiBVIEwgRSBTCisKK1NMX0NPTU1FTlQKKyAJOgknLy8nIH4oJ1xyJ3wnXG4nKSogJ1xyJz8gJ1xuJyB7JGNoYW5uZWw9SElEREVOO30KKwk7CisKK01MX0NPTU1FTlQKKwk6CScvKicgeyRjaGFubmVsPUhJRERFTjt9IC4qICcqLycKKwk7CisKK1NUUklORworCToJJyInICggRVNDIHwgfignXFwnfCciJykgKSogJyInCisJOworCitNTF9TVFJJTkcKKwk6CSc8PCcgLiogJz4+JyAKKwk7CisKK1RPS0VOX1JFRgorCToJJ0EnLi4nWicgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisJOworCitSVUxFX1JFRgorCToJJ2EnLi4neicgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisJOworCitFWFQJOgknLicoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOScpKzsKKworUkVUVkFMCToJTkVTVEVEX1JFVFZBTAorCTsKKworZnJhZ21lbnQKK05FU1RFRF9SRVRWQUwgOgorCSdbJworCSgJb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30KKwk6CU5FU1RFRF9SRVRWQUwKKwl8CS4KKwkpKgorCSddJworCTsKKworQVNUCToJTkVTVEVEX0FTVCAoJyAnPyBORVNURURfQVNUKSo7CisKK2ZyYWdtZW50CitORVNURURfQVNUIDoKKwknKCcKKwkoCW9wdGlvbnMge2dyZWVkeT1mYWxzZTt9CisJOglORVNURURfQVNUCisJfAkuCisJKSoKKwknKScKKwk7CisKK0FDVElPTgorCToJTkVTVEVEX0FDVElPTgorCTsKKworZnJhZ21lbnQKK05FU1RFRF9BQ1RJT04gOgorCSd7JworCSgJb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyBrPTM7fQorCToJTkVTVEVEX0FDVElPTgorCXwJU1RSSU5HX0xJVEVSQUwKKwl8CUNIQVJfTElURVJBTAorCXwJLgorCSkqCisJJ30nCisJOworCitmcmFnbWVudAorQ0hBUl9MSVRFUkFMCisJOgknXCcnICggRVNDIHwgfignXCcnfCdcXCcpICkgJ1wnJworCTsKKworZnJhZ21lbnQKK1NUUklOR19MSVRFUkFMCisJOgknIicgKCBFU0MgfCB+KCdcXCd8JyInKSApKiAnIicKKwk7CisKK2ZyYWdtZW50CitFU0MJOgknXFwnCisJCSgJJ24nCisJCXwJJ3InCisJCXwJJ3QnCisJCXwJJ2InCisJCXwJJ2YnCisJCXwJJyInCisJCXwJJ1wnJworCQl8CSdcXCcKKwkJfAknPicKKwkJfAkndScgWERJR0lUIFhESUdJVCBYRElHSVQgWERJR0lUCisJCXwJLiAvLyB1bmtub3duLCBsZWF2ZSBhcyBpdCBpcworCQkpCisJOworCQorZnJhZ21lbnQKK1hESUdJVCA6CisJCScwJyAuLiAnOScKKwl8CSdhJyAuLiAnZicKKwl8CSdBJyAuLiAnRicKKwk7CisKK1dTCToJKAknICcKKwkJfAknXHQnCisJCXwJJ1xyJz8gJ1xuJworCQkpKworCQl7JGNoYW5uZWw9SElEREVOO30KKwk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvQWJzdHJhY3RUZXN0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvQWJzdHJhY3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YmYwNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9BYnN0cmFjdFRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDcgS2VubnkgTWFjRGVybWlkCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdCBpbXBsZW1lbnRzIElUZXN0Q2FzZSB7CisJLy8gc3RvcmUgZXNzZW50aWFsIGluZGl2aWR1YWwgdGVzdCByZXN1bHQgZm9yIHN0cmluZyB0ZW1wbGF0ZQorCXByb3RlY3RlZCBTdHJpbmcgaGVhZGVyOworCXByb3RlY3RlZCBTdHJpbmcgYWN0dWFsOworCQorCXByb3RlY3RlZCBib29sZWFuIGhhc0Vycm9yTXNnOworCQorCXByaXZhdGUgU3RyaW5nIHRlc3RlZFJ1bGVOYW1lOworCXByaXZhdGUgaW50IHRlc3RDYXNlSW5kZXg7CisJCisJLy8gVE9ETzogcmVtb3ZlIHRoZXNlLiBUaGV5J3JlIG9ubHkgdXNlZCBhcyBwYXJ0IG9mIGEgcmVmYWN0b3IgdG8ga2VlcCB0aGUKKwkvLyAgICAgICBjb2RlIGNsZWFuZXIuIEl0IGlzIGEgbW9jay1pbnN0YW5jZU9mKCkgcmVwbGFjZW1lbnQuCisJcHVibGljIGFic3RyYWN0IGludCBnZXRUeXBlKCk7CisJcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0KCk7CisJCisJcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFeHBlY3RlZCgpOworCS8vIHJldHVybiBhbiBlc2NhcGVkIHN0cmluZyBvZiB0aGUgZXhwZWN0ZWQgcmVzdWx0CisJcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZFJlc3VsdCgpIHsKKwkJU3RyaW5nIGV4cGVjdGVkID0gZ2V0RXhwZWN0ZWQoKTsKKwkJaWYgKCBleHBlY3RlZCE9bnVsbCApIGV4cGVjdGVkID0gSlVuaXRDb2RlR2VuLmVzY2FwZUZvckphdmEoZXhwZWN0ZWQpOworCQlyZXR1cm4gZXhwZWN0ZWQ7CisJfQorCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVzdWx0KGdVbml0VGVzdFJlc3VsdCB0ZXN0UmVzdWx0KTsKKwlwdWJsaWMgU3RyaW5nIGdldEhlYWRlcigpIHsgcmV0dXJuIHRoaXMuaGVhZGVyOyB9CisJcHVibGljIFN0cmluZyBnZXRBY3R1YWwoKSB7IHJldHVybiB0aGlzLmFjdHVhbDsgfQorCS8vIHJldHVybiBhbiBlc2NhcGVkIHN0cmluZyBvZiB0aGUgYWN0dWFsIHJlc3VsdAorCXB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsUmVzdWx0KCkgeworCQlTdHJpbmcgYWN0dWFsID0gZ2V0QWN0dWFsKCk7CisJCS8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXNjYXBlIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gQU5UTFIgCisJCWlmICggYWN0dWFsIT1udWxsICYmICFoYXNFcnJvck1zZyApIGFjdHVhbCA9IEpVbml0Q29kZUdlbi5lc2NhcGVGb3JKYXZhKGFjdHVhbCk7CisJCXJldHVybiBhY3R1YWw7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdGVkUnVsZU5hbWUoKSB7IHJldHVybiB0aGlzLnRlc3RlZFJ1bGVOYW1lOyB9CisJcHVibGljIGludCBnZXRUZXN0Q2FzZUluZGV4KCkgeyByZXR1cm4gdGhpcy50ZXN0Q2FzZUluZGV4OyB9CisJCisJcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBydWxlLCBTdHJpbmcgbGV4aWNhbFJ1bGUsIFN0cmluZyB0cmVlUnVsZSwgaW50IG51bU9mVGVzdCwgaW50IGxpbmUpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmLmFwcGVuZCgidGVzdCIgKyBudW1PZlRlc3QgKyAiICgiKTsKKwkJaWYgKCB0cmVlUnVsZSE9bnVsbCApIHsKKwkJCWJ1Zi5hcHBlbmQodHJlZVJ1bGUrIiB3YWxrcyAiKTsKKwkJfQorCQlpZiAoIGxleGljYWxSdWxlIT1udWxsICkgeworCQkJYnVmLmFwcGVuZChsZXhpY2FsUnVsZSArICIsIGxpbmUiK2xpbmUrIikiICsgIiAtICIpOworCQl9CisJCWVsc2UgYnVmLmFwcGVuZChydWxlICsgIiwgbGluZSIrbGluZSsiKSIgKyAiIC0gIik7CisJCXRoaXMuaGVhZGVyID0gYnVmLnRvU3RyaW5nKCk7CisJfQorCXB1YmxpYyB2b2lkIHNldEFjdHVhbChTdHJpbmcgYWN0dWFsKSB7IHRoaXMuYWN0dWFsID0gYWN0dWFsOyB9CisJCisJcHVibGljIHZvaWQgc2V0VGVzdGVkUnVsZU5hbWUoU3RyaW5nIHRlc3RlZFJ1bGVOYW1lKSB7IHRoaXMudGVzdGVkUnVsZU5hbWUgPSB0ZXN0ZWRSdWxlTmFtZTsgfQorCXB1YmxpYyB2b2lkIHNldFRlc3RDYXNlSW5kZXgoaW50IHRlc3RDYXNlSW5kZXgpIHsgdGhpcy50ZXN0Q2FzZUluZGV4ID0gdGVzdENhc2VJbmRleDsgfQorCQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0Jvb2xlYW5UZXN0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvQm9vbGVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0Jvb2xlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3IEtlbm55IE1hY0Rlcm1pZAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CisKK3B1YmxpYyBjbGFzcyBCb29sZWFuVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisJcHJpdmF0ZSBib29sZWFuIG9rOworCQorCXB1YmxpYyBCb29sZWFuVGVzdChib29sZWFuIG9rKSB7CisJCXRoaXMub2sgPSBvazsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiAob2spPyAiT0siIDogIkZBSUwiOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCXJldHVybiAob2spPyBnVW5pdFBhcnNlci5PSyA6IGdVbml0UGFyc2VyLkZBSUw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRSZXN1bHQoZ1VuaXRUZXN0UmVzdWx0IHRlc3RSZXN1bHQpIHsKKwkJaWYgKCB0ZXN0UmVzdWx0LmlzTGV4ZXJUZXN0KCkgKSB7CisJCQlpZiAoIHRlc3RSZXN1bHQuaXNTdWNjZXNzKCkgKSByZXR1cm4gIk9LIjsKKwkJCWVsc2UgeworCQkJCWhhc0Vycm9yTXNnID0gdHJ1ZTsJLy8gcmV0dXJuIGVycm9yIG1lc3NhZ2UgZm9yIGJvb2xlYW4gdGVzdCBvZiBsZXhlcgorCQkJCXJldHVybiB0ZXN0UmVzdWx0LmdldEVycm9yKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuICh0ZXN0UmVzdWx0LmlzU3VjY2VzcygpKT8gIk9LIiA6ICJGQUlMIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkKCkgeworCQlyZXR1cm4gKG9rKT8gIk9LIiA6ICJGQUlMIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvR3JhbW1hckluZm8uamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9HcmFtbWFySW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODA1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvR3JhbW1hckluZm8uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTGVvbiwgSmVuLVl1YW4gU3UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHcmFtbWFySW5mbyB7CisKKwlwcml2YXRlIFN0cmluZyBncmFtbWFyTmFtZTsJCQkJCS8vIHRhcmdldGVkIGdyYW1tYXIgZm9yIHVuaXQgdGVzdAorCXByaXZhdGUgU3RyaW5nIHRyZWVHcmFtbWFyTmFtZSA9IG51bGw7CQkvLyBvcHRpb25hbCwgcmVxdWlyZWQgZm9yIHRlc3RpbmcgdHJlZSBncmFtbWFyCisgICAgcHJpdmF0ZSBTdHJpbmcgZ3JhbW1hclBhY2thZ2UgPSBudWxsOwkJLy8gb3B0aW9uYWwsIHBhY2thZ2UgcGFyc2VyIGxpdmVzIGluCisgICAgcHJpdmF0ZSBTdHJpbmcgdGVzdFBhY2thZ2UgPSBudWxsOwkJICAgIC8vIG9wdGlvbmFsLCBwYWNrYWdlIG9mIGp1bml0IGNvZGUKKwlwcml2YXRlIFN0cmluZyBhZGFwdG9yID0gbnVsbDsgICAgICAgICAgICAgIC8vIG9wdGlvbmFsLCByZXF1aXJlZCBpZiB1c2luZyBjdXN0b21pemVkIHRyZWUgYWRhcHRvcgorCXByaXZhdGUgTGlzdDxnVW5pdFRlc3RTdWl0ZT4gcnVsZVRlc3RTdWl0ZXMgPSBuZXcgQXJyYXlMaXN0PGdVbml0VGVzdFN1aXRlPigpOwkvLyB0ZXN0c3VpdGVzIGZvciBlYWNoIHRlc3RpbmcgcnVsZQorCXByaXZhdGUgU3RyaW5nQnVmZmVyIHVuaXRUZXN0UmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisJcHVibGljIFN0cmluZyBnZXRHcmFtbWFyTmFtZSgpIHsKKwkJcmV0dXJuIGdyYW1tYXJOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJOYW1lKFN0cmluZyBncmFtbWFyTmFtZSkgeworCQl0aGlzLmdyYW1tYXJOYW1lID0gZ3JhbW1hck5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUcmVlR3JhbW1hck5hbWUoKSB7CisJCXJldHVybiB0cmVlR3JhbW1hck5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VHJlZUdyYW1tYXJOYW1lKFN0cmluZyB0cmVlR3JhbW1hck5hbWUpIHsKKwkJdGhpcy50cmVlR3JhbW1hck5hbWUgPSB0cmVlR3JhbW1hck5hbWU7CisJfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0UGFja2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRlc3RQYWNrYWdlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRlc3RQYWNrYWdlKFN0cmluZyB0ZXN0UGFja2FnZSkgeworICAgICAgICB0aGlzLnRlc3RQYWNrYWdlID0gdGVzdFBhY2thZ2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyUGFja2FnZSgpIHsKKwkJcmV0dXJuIGdyYW1tYXJQYWNrYWdlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJQYWNrYWdlKFN0cmluZyBncmFtbWFyUGFja2FnZSkgeworCQl0aGlzLmdyYW1tYXJQYWNrYWdlID0gZ3JhbW1hclBhY2thZ2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRBZGFwdG9yKCkgeworCQlyZXR1cm4gYWRhcHRvcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBZGFwdG9yKFN0cmluZyBhZGFwdG9yKSB7CisJCXRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisJfQorCisJcHVibGljIExpc3Q8Z1VuaXRUZXN0U3VpdGU+IGdldFJ1bGVUZXN0U3VpdGVzKCkgeworCQkvLyBNYWtlIHRoaXMgbGlzdCB1bm1vZGlmaWFibGUgc28gdGhhdCB3ZSBjYW4gcmVmYWN0b3Iga25vd2luZyBpdCdzIG5vdCBjaGFuZ2VkLgorCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChydWxlVGVzdFN1aXRlcyk7CisJfQorCisJcHVibGljIHZvaWQgYWRkUnVsZVRlc3RTdWl0ZShnVW5pdFRlc3RTdWl0ZSB0ZXN0U3VpdGUpIHsKKwkJdGhpcy5ydWxlVGVzdFN1aXRlcy5hZGQodGVzdFN1aXRlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhcHBlbmRVbml0VGVzdFJlc3VsdChTdHJpbmcgcmVzdWx0KSB7CisJCXRoaXMudW5pdFRlc3RSZXN1bHQuYXBwZW5kKHJlc3VsdCk7CisJfQorCisJLy8gV2UgZG9uJ3Qgd2FudCBwZW9wbGUgbWVzc2luZyB3aXRoIHRoZSBzdHJpbmcgYnVmZmVyIGhlcmUsIHNvIGRvbid0IHJldHVybiBpdC4KKwlwdWJsaWMgU3RyaW5nIGdldFVuaXRUZXN0UmVzdWx0KCkgeworCQlyZXR1cm4gdW5pdFRlc3RSZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbml0VGVzdFJlc3VsdChTdHJpbmdCdWZmZXIgdW5pdFRlc3RSZXN1bHQpIHsKKwkJdGhpcy51bml0VGVzdFJlc3VsdCA9IHVuaXRUZXN0UmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9JVGVzdENhc2UuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9JVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzdiNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0lUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0OworCisvKioKKyAqIElUZXN0Q2FzZSBvYmplY3QgbG9jYXRlcyBvbmUgdGVzdCBjYXNlIGluIGEgZ1VuaXQgc2NyaXB0IGJ5IHNwZWNpZnlpbmcgdGhlCisgKiB0ZXN0ZWQgcnVsZSBhbmQgdGhlIGluZGV4IG51bWJlciBvZiB0aGUgdGVzdCBjYXNlIGluIHRoYXQgZ3JvdXAuCisgKgorICogRm9yIGV4YW1wbGU6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAuLi4KKyAqIHZhckRlZjoKKyAqICJpbnQgaTsiIE9LCisgKiAiZmxvYXQgMmY7IiBGQUlMCisgKiAuLi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSAidGVzdGVkUnVsZU5hbWUiIGZvciB0aGVzZSB0d28gdGVzdCBjYXNlcyB3aWxsIGJlICJ2YXJEZWYiLgorICogVGhlICJpbmRleCIgZm9yIHRoZSAiaW50Ii10ZXN0IHdpbGwgYmUgMC4KKyAqIFRoZSAiaW5kZXgiIGZvciB0aGUgImZsb2F0Ii10ZXN0IHdpbGwgYmUgMS4gIEFuZCBzbyBvbi4KKyAqCisgKiBAc2VlIElUZXN0U3VpdGUKKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBydWxlIHRoYXQgaXMgdGVzdGVkIGJ5IHRoaXMgdGVzdCBjYXNlLgorICAgICAqIEByZXR1cm4gbmFtZSBvZiB0aGUgdGVzdGVkIHJ1bGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0ZWRSdWxlTmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGUgdGVzdCBjYXNlIGluIHRoZSB0ZXN0IGdyb3VwIGZvciBhIHJ1bGUuIFN0YXJ0aW5nCisgICAgICogZnJvbSAwLgorICAgICAqIEByZXR1cm4gaW5kZXggbnVtYmVyIG9mIHRoZSB0ZXN0IGNhc2UuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZXN0Q2FzZUluZGV4KCk7CisJCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvSVRlc3RTdWl0ZS5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0lUZXN0U3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE2NzNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0lUZXN0U3VpdGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdDsKKworLyoqCisgKiBBIGdVbml0IHNjcmlwdCBmaWxlIGlzIGFuIEFudGxyICJ0ZXN0IHN1aXRlIi4gIFRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZCB0bworICogYWxsb3cgdGhlIFN3aW5nIEdVSSB0ZXN0IHJ1bm5lciBiZSBub3RpZmllZCB3aGVuIGdVbml0IGludGVycHJldGVyIHJ1bm5lcgorICogcnVucyBhIHBhc3NlZC9mYWlsZWQgdGVzdCBjYXNlLgorICoKKyAqIENIQU5HRVM6CisgKiAyMDA5LTAzLTAxOiBTSEFPVElORworICogICAgICAtIGNoYW5nZSBtZXRob2QgcmV0dXJuIHZvaWQsIHBhcmFtZXRlciB0ZXN0IG9iamVjdC4KKyAqLworcHVibGljIGludGVyZmFjZSBJVGVzdFN1aXRlIHsKKwkKKyAgICBwdWJsaWMgdm9pZCBvblBhc3MoSVRlc3RDYXNlIHBhc3NUZXN0KTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBvbkZhaWwoSVRlc3RDYXNlIGZhaWxUZXN0KTsKKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0ludGVycC5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0ludGVycC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGMwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvSW50ZXJwLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IExlb24gSmVuLVl1YW4gU3UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKKworLyoqIFRoZSBtYWluIGdVbml0IGludGVycHJldGVyIGVudHJ5IHBvaW50LgorICogCVJlYWQgYSBnVW5pdCBzY3JpcHQsIHJ1biB1bml0IHRlc3RzIG9yIGdlbmVyYXRlIGEganVuaXQgZmlsZS4KKyAqLworcHVibGljIGNsYXNzIEludGVycCB7CisgICAgc3RhdGljIFN0cmluZyB0ZXN0UGFja2FnZTsKKyAgICBzdGF0aWMgYm9vbGVhbiBnZW5KVW5pdDsKKyAgICBzdGF0aWMgU3RyaW5nIGd1bml0RmlsZTsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgUmVjb2duaXRpb25FeGNlcHRpb24geworCQkvKiogUHVsbCBjaGFyIGZyb20gd2hlcmU/ICovCisJCUNoYXJTdHJlYW0gaW5wdXQgPSBudWxsOworCQkvKiogSWYgdGhlIGlucHV0IHNvdXJjZSBpcyBhIHRlc3RzdWl0ZSBmaWxlLCB3aGVyZSBpcyBpdD8gKi8KKwkJU3RyaW5nIHRlc3RzdWl0ZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKworICAgICAgICBwcm9jZXNzQXJncyhhcmdzKTsKKworCSAgICBpZiAoIGdlbkpVbml0ICkgeworCQkJaWYgKCBndW5pdEZpbGUhPW51bGwgKSB7CisJCQkJaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGd1bml0RmlsZSk7CisJCQkJRmlsZSBmID0gbmV3IEZpbGUoZ3VuaXRGaWxlKTsKKwkJCQl0ZXN0c3VpdGVEaXIgPSBnZXRUZXN0c3VpdGVEaXIoZi5nZXRDYW5vbmljYWxQYXRoKCksIGYuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlucHV0ID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oU3lzdGVtLmluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvID0gcGFyc2UoaW5wdXQpOworICAgICAgICAgICAgZ3JhbW1hckluZm8uc2V0VGVzdFBhY2thZ2UodGVzdFBhY2thZ2UpOworICAgICAgICAgICAgSlVuaXRDb2RlR2VuIGdlbmVyYXRlciA9IG5ldyBKVW5pdENvZGVHZW4oZ3JhbW1hckluZm8sIHRlc3RzdWl0ZURpcik7CisgICAgICAgICAgICBnZW5lcmF0ZXIuY29tcGlsZSgpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCBndW5pdEZpbGUhPW51bGwgKSB7CisJCQlpbnB1dCA9IG5ldyBBTlRMUkZpbGVTdHJlYW0oZ3VuaXRGaWxlKTsKKwkJCUZpbGUgZiA9IG5ldyBGaWxlKGd1bml0RmlsZSk7CisJCQl0ZXN0c3VpdGVEaXIgPSBnZXRUZXN0c3VpdGVEaXIoZi5nZXRDYW5vbmljYWxQYXRoKCksIGYuZ2V0TmFtZSgpKTsKKwkJfQorCQllbHNlCisJCQlpbnB1dCA9IG5ldyBBTlRMUklucHV0U3RyZWFtKFN5c3RlbS5pbik7CisKKwkJZ1VuaXRFeGVjdXRvciBleGVjdXRlciA9IG5ldyBnVW5pdEV4ZWN1dG9yKHBhcnNlKGlucHV0KSwgdGVzdHN1aXRlRGlyKTsKKworCQlTeXN0ZW0ub3V0LnByaW50KGV4ZWN1dGVyLmV4ZWNUZXN0KCkpOwkvLyB1bml0IHRlc3QgcmVzdWx0CisKKwkJLy9yZXR1cm4gYW4gZXJyb3IgY29kZSBvZiB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzCisJCVN5c3RlbS5leGl0KGV4ZWN1dGVyLmZhaWx1cmVzLnNpemUoKSArIGV4ZWN1dGVyLmludmFsaWRzLnNpemUoKSk7CisJfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKSByZXR1cm47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgKyAxID49IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibWlzc2luZyBsaWJyYXJ5IGRpcmVjdG9yeSB3aXRoIC1saWIgb3B0aW9uOyBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB0ZXN0UGFja2FnZSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1vIikpIGdlbkpVbml0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgZ3VuaXRGaWxlID0gYXJnc1tpXTsgLy8gTXVzdCBiZSB0aGUgZ3VuaXQgZmlsZQorICAgICAgICB9CisgICAgfQorCisJcHVibGljIHN0YXRpYyBHcmFtbWFySW5mbyBwYXJzZShDaGFyU3RyZWFtIGlucHV0KSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCQlnVW5pdExleGVyIGxleGVyID0gbmV3IGdVbml0TGV4ZXIoaW5wdXQpOworCQlDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpOworCisJCUdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvID0gbmV3IEdyYW1tYXJJbmZvKCk7CisJCWdVbml0UGFyc2VyIHBhcnNlciA9IG5ldyBnVW5pdFBhcnNlcih0b2tlbnMsIGdyYW1tYXJJbmZvKTsKKwkJcGFyc2VyLmdVbml0RGVmKCk7CS8vIHBhcnNlIGd1bml0IHNjcmlwdCBhbmQgc2F2ZSBlbGVtZW50cyB0byBncmFtbWFySW5mbworCQlyZXR1cm4gZ3JhbW1hckluZm87CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdHN1aXRlRGlyKFN0cmluZyBmdWxsUGF0aCwgU3RyaW5nIGZpbGVOYW1lKSB7CisJCXJldHVybiBmdWxsUGF0aC5zdWJzdHJpbmcoMCwgZnVsbFBhdGgubGVuZ3RoKCktZmlsZU5hbWUubGVuZ3RoKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0ludmFsaWRJbnB1dEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTlkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvSW52YWxpZElucHV0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3IEtlbm55IE1hY0Rlcm1pZAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CisKK3B1YmxpYyBjbGFzcyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9KVW5pdENvZGVHZW4uamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9KVW5pdENvZGVHZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzEzY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L0pVbml0Q29kZUdlbi5qYXZhCkBAIC0wLDAgKzEsNDA1IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBMZW9uIEplbi1ZdWFuIFN1CisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdDsKKworaW1wb3J0IG9yZy5hbnRsci5zdHJpbmd0ZW1wbGF0ZS5TdHJpbmdUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUuU3RyaW5nVGVtcGxhdGVHcm91cDsKK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUuU3RyaW5nVGVtcGxhdGVHcm91cExvYWRlcjsKK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUuQ29tbW9uR3JvdXBMb2FkZXI7CitpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLmxhbmd1YWdlLkFuZ2xlQnJhY2tldFRlbXBsYXRlTGV4ZXI7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworcHVibGljIGNsYXNzIEpVbml0Q29kZUdlbiB7CisgICAgcHVibGljIEdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvOworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHJ1bGVXaXRoUmV0dXJuOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRlc3RzdWl0ZURpcjsKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJlY3RvcnlQYXRoID0gIi4iOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFuZGxlciBjb25zb2xlID0gbmV3IENvbnNvbGVIYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSlVuaXRDb2RlR2VuLmNsYXNzLmdldE5hbWUoKSk7CisgICAgc3RhdGljIHsKKyAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSk7CisgICAgfQorCisgICAgcHVibGljIEpVbml0Q29kZUdlbihHcmFtbWFySW5mbyBncmFtbWFySW5mbywgU3RyaW5nIHRlc3RzdWl0ZURpcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0aGlzKCBncmFtbWFySW5mbywgZGV0ZXJtaW5lQ2xhc3NMb2FkZXIoKSwgdGVzdHN1aXRlRGlyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBkZXRlcm1pbmVDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAoIGNsYXNzTG9hZGVyID09IG51bGwgKSB7CisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IEpVbml0Q29kZUdlbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgSlVuaXRDb2RlR2VuKEdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgU3RyaW5nIHRlc3RzdWl0ZURpcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0aGlzLmdyYW1tYXJJbmZvID0gZ3JhbW1hckluZm87CisgICAgICAgIHRoaXMudGVzdHN1aXRlRGlyID0gdGVzdHN1aXRlRGlyOworICAgICAgICAvKiogTWFwIHRoZSBuYW1lIG9mIHJ1bGVzIGhhdmluZyByZXR1cm4gdmFsdWUgdG8gaXRzIHJldHVybiB0eXBlICovCisgICAgICAgIHJ1bGVXaXRoUmV0dXJuID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIENsYXNzIHBhcnNlckNsYXNzID0gbG9jYXRlUGFyc2VyQ2xhc3MoIGdyYW1tYXJJbmZvLCBjbGFzc0xvYWRlciApOworICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gcGFyc2VyQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgIGZvcihNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworICAgICAgICAgICAgaWYgKCAhbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJ2b2lkIikgKSB7CisgICAgICAgICAgICAgICAgcnVsZVdpdGhSZXR1cm4ucHV0KG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3MgbG9jYXRlUGFyc2VyQ2xhc3MoR3JhbW1hckluZm8gZ3JhbW1hckluZm8sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXJzZXJDbGFzc05hbWUgPSBncmFtbWFySW5mby5nZXRHcmFtbWFyTmFtZSgpICsgIlBhcnNlciI7CisgICAgICAgIGlmICggZ3JhbW1hckluZm8uZ2V0R3JhbW1hclBhY2thZ2UoKSAhPSBudWxsICkgeworICAgICAgICAgICAgcGFyc2VyQ2xhc3NOYW1lID0gZ3JhbW1hckluZm8uZ2V0R3JhbW1hclBhY2thZ2UoKSsgIi4iICsgcGFyc2VyQ2xhc3NOYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoIHBhcnNlckNsYXNzTmFtZSApOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeVBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5UGF0aChTdHJpbmcgb3V0cHV0RGlyZWN0b3J5UGF0aCkgeworICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeVBhdGggPSBvdXRwdXREaXJlY3RvcnlQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgIFN0cmluZyBqdW5pdEZpbGVOYW1lOworICAgICAgICBpZiAoIGdyYW1tYXJJbmZvLmdldFRyZWVHcmFtbWFyTmFtZSgpIT1udWxsICkgeworICAgICAgICAgICAganVuaXRGaWxlTmFtZSA9ICJUZXN0IitncmFtbWFySW5mby5nZXRUcmVlR3JhbW1hck5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGp1bml0RmlsZU5hbWUgPSAiVGVzdCIrZ3JhbW1hckluZm8uZ2V0R3JhbW1hck5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbGV4ZXJOYW1lID0gZ3JhbW1hckluZm8uZ2V0R3JhbW1hck5hbWUoKSsiTGV4ZXIiOworICAgICAgICBTdHJpbmcgcGFyc2VyTmFtZSA9IGdyYW1tYXJJbmZvLmdldEdyYW1tYXJOYW1lKCkrIlBhcnNlciI7CisKKyAgICAgICAgU3RyaW5nVGVtcGxhdGVHcm91cExvYWRlciBsb2FkZXIgPSBuZXcgQ29tbW9uR3JvdXBMb2FkZXIoIm9yZy9hbnRsci9ndW5pdCIsIG51bGwpOworICAgICAgICBTdHJpbmdUZW1wbGF0ZUdyb3VwLnJlZ2lzdGVyR3JvdXBMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgU3RyaW5nVGVtcGxhdGVHcm91cC5yZWdpc3RlckRlZmF1bHRMZXhlcihBbmdsZUJyYWNrZXRUZW1wbGF0ZUxleGVyLmNsYXNzKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IGNvbXBpbGVUb0J1ZmZlcihqdW5pdEZpbGVOYW1lLCBsZXhlck5hbWUsIHBhcnNlck5hbWUpOworICAgICAgICB3cml0ZVRlc3RGaWxlKCIuIiwganVuaXRGaWxlTmFtZSsiLmphdmEiLCBidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ0J1ZmZlciBjb21waWxlVG9CdWZmZXIoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGxleGVyTmFtZSwgU3RyaW5nIHBhcnNlck5hbWUpIHsKKyAgICAgICAgU3RyaW5nVGVtcGxhdGVHcm91cCBncm91cCA9IFN0cmluZ1RlbXBsYXRlR3JvdXAubG9hZEdyb3VwKCJqdW5pdCIpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKGdlbkNsYXNzSGVhZGVyKGdyb3VwLCBjbGFzc05hbWUsIGxleGVyTmFtZSwgcGFyc2VyTmFtZSkpOworICAgICAgICBidWYuYXBwZW5kKGdlblRlc3RSdWxlTWV0aG9kcyhncm91cCkpOworICAgICAgICBidWYuYXBwZW5kKCJcblxufSIpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2VuQ2xhc3NIZWFkZXIoU3RyaW5nVGVtcGxhdGVHcm91cCBncm91cCwgU3RyaW5nIGp1bml0RmlsZU5hbWUsIFN0cmluZyBsZXhlck5hbWUsIFN0cmluZyBwYXJzZXJOYW1lKSB7CisgICAgICAgIFN0cmluZ1RlbXBsYXRlIGNsYXNzSGVhZGVyU1QgPSBncm91cC5nZXRJbnN0YW5jZU9mKCJjbGFzc0hlYWRlciIpOworICAgICAgICBpZiAoIGdyYW1tYXJJbmZvLmdldFRlc3RQYWNrYWdlKCkhPW51bGwgKSB7CS8vIFNldCB1cCBjbGFzcyBwYWNrYWdlIGlmIHRoZXJlIGlzCisgICAgICAgICAgICBjbGFzc0hlYWRlclNULnNldEF0dHJpYnV0ZSgiaGVhZGVyIiwgInBhY2thZ2UgIitncmFtbWFySW5mby5nZXRUZXN0UGFja2FnZSgpKyI7Iik7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3NIZWFkZXJTVC5zZXRBdHRyaWJ1dGUoImp1bml0RmlsZU5hbWUiLCBqdW5pdEZpbGVOYW1lKTsKKworICAgICAgICBTdHJpbmcgbGV4ZXJQYXRoID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhcnNlclBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgdHJlZVBhcnNlclBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgcGFja2FnZVBhdGggPSBudWxsOworICAgICAgICBib29sZWFuIGlzVHJlZUdyYW1tYXIgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBoYXNQYWNrYWdlID0gZmFsc2U7CisgICAgICAgIC8qKiBTZXQgdXAgYXBwcm9wcmlhdGUgY2xhc3MgcGF0aCBmb3IgcGFyc2VyL3RyZWUgcGFyc2VyIGlmIHVzaW5nIHBhY2thZ2UgKi8KKyAgICAgICAgaWYgKCBncmFtbWFySW5mby5nZXRHcmFtbWFyUGFja2FnZSgpIT1udWxsICkgeworICAgICAgICAgICAgaGFzUGFja2FnZSA9IHRydWU7CisgICAgICAgICAgICBwYWNrYWdlUGF0aCA9ICIuLyIrZ3JhbW1hckluZm8uZ2V0R3JhbW1hclBhY2thZ2UoKS5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICAgICAgICAgIGxleGVyUGF0aCA9IGdyYW1tYXJJbmZvLmdldEdyYW1tYXJQYWNrYWdlKCkrIi4iK2xleGVyTmFtZTsKKyAgICAgICAgICAgIHBhcnNlclBhdGggPSBncmFtbWFySW5mby5nZXRHcmFtbWFyUGFja2FnZSgpKyIuIitwYXJzZXJOYW1lOworICAgICAgICAgICAgaWYgKCBncmFtbWFySW5mby5nZXRUcmVlR3JhbW1hck5hbWUoKSE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICB0cmVlUGFyc2VyUGF0aCA9IGdyYW1tYXJJbmZvLmdldEdyYW1tYXJQYWNrYWdlKCkrIi4iK2dyYW1tYXJJbmZvLmdldFRyZWVHcmFtbWFyTmFtZSgpOworICAgICAgICAgICAgICAgIGlzVHJlZUdyYW1tYXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGV4ZXJQYXRoID0gbGV4ZXJOYW1lOworICAgICAgICAgICAgcGFyc2VyUGF0aCA9IHBhcnNlck5hbWU7CisgICAgICAgICAgICBpZiAoIGdyYW1tYXJJbmZvLmdldFRyZWVHcmFtbWFyTmFtZSgpIT1udWxsICkgeworICAgICAgICAgICAgICAgIHRyZWVQYXJzZXJQYXRoID0gZ3JhbW1hckluZm8uZ2V0VHJlZUdyYW1tYXJOYW1lKCk7CisgICAgICAgICAgICAgICAgaXNUcmVlR3JhbW1hciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWxzbyBzZXQgdXAgY3VzdG9tIHRyZWUgYWRhcHRvciBpZiBuZWNlc3NhcnkKKyAgICAgICAgU3RyaW5nIHRyZWVBZGFwdG9yUGF0aCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaGFzVHJlZUFkYXB0b3IgPSBmYWxzZTsKKyAgICAgICAgaWYgKCBncmFtbWFySW5mby5nZXRBZGFwdG9yKCkhPW51bGwgKSB7CisgICAgICAgICAgICBoYXNUcmVlQWRhcHRvciA9IHRydWU7CisgICAgICAgICAgICB0cmVlQWRhcHRvclBhdGggPSBncmFtbWFySW5mby5nZXRBZGFwdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3NIZWFkZXJTVC5zZXRBdHRyaWJ1dGUoImhhc1RyZWVBZGFwdG9yIiwgaGFzVHJlZUFkYXB0b3IpOworICAgICAgICBjbGFzc0hlYWRlclNULnNldEF0dHJpYnV0ZSgidHJlZUFkYXB0b3JQYXRoIiwgdHJlZUFkYXB0b3JQYXRoKTsKKyAgICAgICAgY2xhc3NIZWFkZXJTVC5zZXRBdHRyaWJ1dGUoImhhc1BhY2thZ2UiLCBoYXNQYWNrYWdlKTsKKyAgICAgICAgY2xhc3NIZWFkZXJTVC5zZXRBdHRyaWJ1dGUoInBhY2thZ2VQYXRoIiwgcGFja2FnZVBhdGgpOworICAgICAgICBjbGFzc0hlYWRlclNULnNldEF0dHJpYnV0ZSgibGV4ZXJQYXRoIiwgbGV4ZXJQYXRoKTsKKyAgICAgICAgY2xhc3NIZWFkZXJTVC5zZXRBdHRyaWJ1dGUoInBhcnNlclBhdGgiLCBwYXJzZXJQYXRoKTsKKyAgICAgICAgY2xhc3NIZWFkZXJTVC5zZXRBdHRyaWJ1dGUoInRyZWVQYXJzZXJQYXRoIiwgdHJlZVBhcnNlclBhdGgpOworICAgICAgICBjbGFzc0hlYWRlclNULnNldEF0dHJpYnV0ZSgiaXNUcmVlR3JhbW1hciIsIGlzVHJlZUdyYW1tYXIpOworICAgICAgICByZXR1cm4gY2xhc3NIZWFkZXJTVC50b1N0cmluZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2VuVGVzdFJ1bGVNZXRob2RzKFN0cmluZ1RlbXBsYXRlR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKCBncmFtbWFySW5mby5nZXRUcmVlR3JhbW1hck5hbWUoKSE9bnVsbCApIHsJLy8gR2VuZXJhdGUganVuaXQgY29kZXMgb2YgZm9yIHRyZWUgZ3JhbW1hciBydWxlCisgICAgICAgICAgICBnZW5UcmVlTWV0aG9kcyhncm91cCwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsJLy8gR2VuZXJhdGUganVuaXQgY29kZXMgb2YgZm9yIGdyYW1tYXIgcnVsZQorICAgICAgICAgICAgZ2VuUGFyc2VyTWV0aG9kcyhncm91cCwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlblBhcnNlck1ldGhvZHMoU3RyaW5nVGVtcGxhdGVHcm91cCBncm91cCwgU3RyaW5nQnVmZmVyIGJ1ZikgeworICAgICAgICBmb3IgKCBnVW5pdFRlc3RTdWl0ZSB0czogZ3JhbW1hckluZm8uZ2V0UnVsZVRlc3RTdWl0ZXMoKSApIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoIGdVbml0VGVzdElucHV0IGlucHV0OiB0cy50ZXN0U3VpdGVzLmtleVNldCgpICkgewkvLyBlYWNoIHJ1bGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgdGVzdHMKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgU3RyaW5nVGVtcGxhdGUgdGVzdFJ1bGVNZXRob2RTVDsKKyAgICAgICAgICAgICAgICAvKiogSWYgcnVsZSBoYXMgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBvciBhc3QqLworICAgICAgICAgICAgICAgIGlmICggdHMudGVzdFN1aXRlcy5nZXQoaW5wdXQpLmdldFR5cGUoKT09IGdVbml0UGFyc2VyLkFDVElPTiAmJiBydWxlV2l0aFJldHVybi5jb250YWluc0tleSh0cy5nZXRSdWxlTmFtZSgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVCA9IGdyb3VwLmdldEluc3RhbmNlT2YoInRlc3RSdWxlTWV0aG9kMiIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0U3RyaW5nID0gdHMudGVzdFN1aXRlcy5nZXQoaW5wdXQpLmdldFRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoIm1ldGhvZE5hbWUiLCAidGVzdCIrY2hhbmdlRmlyc3RDYXBpdGFsKHRzLmdldFJ1bGVOYW1lKCkpK2kpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgidGVzdFJ1bGVOYW1lIiwgJyInK3RzLmdldFJ1bGVOYW1lKCkrJyInKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoInRlc3QiLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJyZXR1cm5UeXBlIiwgcnVsZVdpdGhSZXR1cm4uZ2V0KHRzLmdldFJ1bGVOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoImV4cGVjdGluZyIsIG91dHB1dFN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdFJ1bGVOYW1lOworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGl0J3MgYSB0ZXN0IGZvciBwYXJzZXIgcnVsZSBvciBsZXhlciBydWxlCisgICAgICAgICAgICAgICAgICAgIGlmICggdHMuaXNMZXhpY2FsUnVsZSgpICkgdGVzdFJ1bGVOYW1lID0gdHMuZ2V0TGV4aWNhbFJ1bGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgdGVzdFJ1bGVOYW1lID0gdHMuZ2V0UnVsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVCA9IGdyb3VwLmdldEluc3RhbmNlT2YoInRlc3RSdWxlTWV0aG9kIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXRTdHJpbmcgPSB0cy50ZXN0U3VpdGVzLmdldChpbnB1dCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiaXNMZXhpY2FsUnVsZSIsIHRzLmlzTGV4aWNhbFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJtZXRob2ROYW1lIiwgInRlc3QiK2NoYW5nZUZpcnN0Q2FwaXRhbCh0ZXN0UnVsZU5hbWUpK2kpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgidGVzdFJ1bGVOYW1lIiwgJyInK3Rlc3RSdWxlTmFtZSsnIicpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgidGVzdCIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoInRva2VuVHlwZSIsIGdldFR5cGVTdHJpbmcodHMudGVzdFN1aXRlcy5nZXQoaW5wdXQpLmdldFR5cGUoKSkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmluZyA9IG5vcm1hbGl6ZVRyZWVTcGVjKG91dHB1dFN0cmluZyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0cy50ZXN0U3VpdGVzLmdldChpbnB1dCkuZ2V0VHlwZSgpPT1nVW5pdFBhcnNlci5BQ1RJT04gKSB7CS8vIHRyaW0gJzsnIGF0IHRoZSBlbmQgb2YgQUNUSU9OIGlmIHRoZXJlIGlzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAvL3Rlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJleHBlY3RpbmciLCBvdXRwdXRTdHJpbmcuc3Vic3RyaW5nKDAsIG91dHB1dFN0cmluZy5sZW5ndGgoKS0xKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiZXhwZWN0aW5nIiwgb3V0cHV0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggdHMudGVzdFN1aXRlcy5nZXQoaW5wdXQpLmdldFR5cGUoKT09Z1VuaXRQYXJzZXIuUkVUVkFMICkgewkvLyBFeHBlY3RlZDogUkVUVkFMCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiZXhwZWN0aW5nIiwgb3V0cHV0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsJLy8gQXR0YWNoICIiIHRvIGV4cGVjdGVkIFNUUklORyBvciBBU1QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIG5ld2xpbmVzIGZvciAoLi4uKSB0cmVlIHN0dWZmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJpbmcgPSBvdXRwdXRTdHJpbmcucmVwbGFjZUFsbCgiXG4iLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiZXhwZWN0aW5nIiwgJyInK2VzY2FwZUZvckphdmEob3V0cHV0U3RyaW5nKSsnIicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGVzdFJ1bGVNZXRob2RTVC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5UcmVlTWV0aG9kcyhTdHJpbmdUZW1wbGF0ZUdyb3VwIGdyb3VwLCBTdHJpbmdCdWZmZXIgYnVmKSB7CisgICAgICAgIGZvciAoIGdVbml0VGVzdFN1aXRlIHRzOiBncmFtbWFySW5mby5nZXRSdWxlVGVzdFN1aXRlcygpICkgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yICggZ1VuaXRUZXN0SW5wdXQgaW5wdXQ6IHRzLnRlc3RTdWl0ZXMua2V5U2V0KCkgKSB7CS8vIGVhY2ggcnVsZSBtYXkgY29udGFpbiBtdWx0aXBsZSB0ZXN0cworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBTdHJpbmdUZW1wbGF0ZSB0ZXN0UnVsZU1ldGhvZFNUOworICAgICAgICAgICAgICAgIC8qKiBJZiBydWxlIGhhcyBtdWx0aXBsZSByZXR1cm4gdmFsdWVzIG9yIGFzdCovCisgICAgICAgICAgICAgICAgaWYgKCB0cy50ZXN0U3VpdGVzLmdldChpbnB1dCkuZ2V0VHlwZSgpPT0gZ1VuaXRQYXJzZXIuQUNUSU9OICYmIHJ1bGVXaXRoUmV0dXJuLmNvbnRhaW5zS2V5KHRzLmdldFRyZWVSdWxlTmFtZSgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVCA9IGdyb3VwLmdldEluc3RhbmNlT2YoInRlc3RUcmVlUnVsZU1ldGhvZDIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dFN0cmluZyA9IHRzLnRlc3RTdWl0ZXMuZ2V0KGlucHV0KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJtZXRob2ROYW1lIiwgInRlc3QiK2NoYW5nZUZpcnN0Q2FwaXRhbCh0cy5nZXRUcmVlUnVsZU5hbWUoKSkrIl93YWxrc18iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUZpcnN0Q2FwaXRhbCh0cy5nZXRSdWxlTmFtZSgpKStpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoInRlc3RUcmVlUnVsZU5hbWUiLCAnIicrdHMuZ2V0VHJlZVJ1bGVOYW1lKCkrJyInKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoInRlc3RSdWxlTmFtZSIsICciJyt0cy5nZXRSdWxlTmFtZSgpKyciJyk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJ0ZXN0IiwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgicmV0dXJuVHlwZSIsIHJ1bGVXaXRoUmV0dXJuLmdldCh0cy5nZXRUcmVlUnVsZU5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiZXhwZWN0aW5nIiwgb3V0cHV0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1QgPSBncm91cC5nZXRJbnN0YW5jZU9mKCJ0ZXN0VHJlZVJ1bGVNZXRob2QiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dFN0cmluZyA9IHRzLnRlc3RTdWl0ZXMuZ2V0KGlucHV0KS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJtZXRob2ROYW1lIiwgInRlc3QiK2NoYW5nZUZpcnN0Q2FwaXRhbCh0cy5nZXRUcmVlUnVsZU5hbWUoKSkrIl93YWxrc18iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUZpcnN0Q2FwaXRhbCh0cy5nZXRSdWxlTmFtZSgpKStpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoInRlc3RUcmVlUnVsZU5hbWUiLCAnIicrdHMuZ2V0VHJlZVJ1bGVOYW1lKCkrJyInKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bGVNZXRob2RTVC5zZXRBdHRyaWJ1dGUoInRlc3RSdWxlTmFtZSIsICciJyt0cy5nZXRSdWxlTmFtZSgpKyciJyk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJ0ZXN0IiwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgidG9rZW5UeXBlIiwgZ2V0VHlwZVN0cmluZyh0cy50ZXN0U3VpdGVzLmdldChpbnB1dCkuZ2V0VHlwZSgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0cy50ZXN0U3VpdGVzLmdldChpbnB1dCkuZ2V0VHlwZSgpPT1nVW5pdFBhcnNlci5BQ1RJT04gKSB7CS8vIHRyaW0gJzsnIGF0IHRoZSBlbmQgb2YgQUNUSU9OIGlmIHRoZXJlIGlzLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAvL3Rlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJleHBlY3RpbmciLCBvdXRwdXRTdHJpbmcuc3Vic3RyaW5nKDAsIG91dHB1dFN0cmluZy5sZW5ndGgoKS0xKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiZXhwZWN0aW5nIiwgb3V0cHV0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggdHMudGVzdFN1aXRlcy5nZXQoaW5wdXQpLmdldFR5cGUoKT09Z1VuaXRQYXJzZXIuUkVUVkFMICkgewkvLyBFeHBlY3RlZDogUkVUVkFMCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVsZU1ldGhvZFNULnNldEF0dHJpYnV0ZSgiZXhwZWN0aW5nIiwgb3V0cHV0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsJLy8gQXR0YWNoICIiIHRvIGV4cGVjdGVkIFNUUklORyBvciBBU1QKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSdWxlTWV0aG9kU1Quc2V0QXR0cmlidXRlKCJleHBlY3RpbmciLCAnIicrZXNjYXBlRm9ySmF2YShvdXRwdXRTdHJpbmcpKyciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh0ZXN0UnVsZU1ldGhvZFNULnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmV0dXJuIGEgbWVhbmluZ2Z1bCBnVW5pdCB0b2tlbiB0eXBlIG5hbWUgaW5zdGVhZCBvZiB1c2luZyB0aGUgbWFnaWMgbnVtYmVyCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKGludCB0eXBlKSB7CisgICAgICAgIFN0cmluZyB0eXBlVGV4dDsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIGdVbml0UGFyc2VyLk9LIDoKKyAgICAgICAgICAgICAgICB0eXBlVGV4dCA9ICJvcmcuYW50bHIuZ3VuaXQuZ1VuaXRQYXJzZXIuT0siOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBnVW5pdFBhcnNlci5GQUlMIDoKKyAgICAgICAgICAgICAgICB0eXBlVGV4dCA9ICJvcmcuYW50bHIuZ3VuaXQuZ1VuaXRQYXJzZXIuRkFJTCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGdVbml0UGFyc2VyLlNUUklORyA6CisgICAgICAgICAgICAgICAgdHlwZVRleHQgPSAib3JnLmFudGxyLmd1bml0LmdVbml0UGFyc2VyLlNUUklORyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGdVbml0UGFyc2VyLk1MX1NUUklORyA6CisgICAgICAgICAgICAgICAgdHlwZVRleHQgPSAib3JnLmFudGxyLmd1bml0LmdVbml0UGFyc2VyLk1MX1NUUklORyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGdVbml0UGFyc2VyLlJFVFZBTCA6CisgICAgICAgICAgICAgICAgdHlwZVRleHQgPSAib3JnLmFudGxyLmd1bml0LmdVbml0UGFyc2VyLlJFVFZBTCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGdVbml0UGFyc2VyLkFTVCA6CisgICAgICAgICAgICAgICAgdHlwZVRleHQgPSAib3JnLmFudGxyLmd1bml0LmdVbml0UGFyc2VyLkFTVCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICB0eXBlVGV4dCA9ICJvcmcuYW50bHIuZ3VuaXQuZ1VuaXRQYXJzZXIuRU9GIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZVRleHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVUZXN0RmlsZShTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIEZpbGVXcml0ZXIgdyA9IG5ldyBGaWxlV3JpdGVyKGYpOworICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIodyk7CisgICAgICAgICAgICBidy53cml0ZShjb250ZW50KTsKKyAgICAgICAgICAgIGJ3LmNsb3NlKCk7CisgICAgICAgICAgICB3LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJjYW4ndCB3cml0ZSBmaWxlIiwgaW9lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZUZvckphdmEoU3RyaW5nIGlucHV0U3RyaW5nKSB7CisgICAgICAgIC8vIEdvdHRhIGVzY2FwZSBsaXRlcmFsIGJhY2tzbGFzaCBiZWZvcmUgcHV0dGluZyBpbiBzcGVjaWFscyB0aGF0IHVzZSBlc2NhcGUuCisgICAgICAgIGlucHV0U3RyaW5nID0gaW5wdXRTdHJpbmcucmVwbGFjZSgiXFwiLCAiXFxcXCIpOworICAgICAgICAvLyBUaGVuIGRvdWJsZSBxdW90ZXMgbmVlZCBlc2NhcGluZyAoc2luZ2xlcyBhcmUgT0sgb2YgY291cnNlKS4KKyAgICAgICAgaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZy5yZXBsYWNlKCJcIiIsICJcXFwiIik7CisgICAgICAgIC8vIG5vdGU6IHJlcGxhY2UgbmV3bGluZSB0byBTdHJpbmcgIi5cbiIsIHJlcGxhY2UgdGFiIHRvIFN0cmluZyAiLlx0IgorICAgICAgICBpbnB1dFN0cmluZyA9IGlucHV0U3RyaW5nLnJlcGxhY2UoIlxuIiwgIlxcbiIpLnJlcGxhY2UoIlx0IiwgIlxcdCIpLnJlcGxhY2UoIlxyIiwgIlxcciIpLnJlcGxhY2UoIlxiIiwgIlxcYiIpLnJlcGxhY2UoIlxmIiwgIlxcZiIpOworCisgICAgICAgIHJldHVybiBpbnB1dFN0cmluZzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZUZpcnN0Q2FwaXRhbChTdHJpbmcgcnVsZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGZpcnN0Q2hhciA9IFN0cmluZy52YWx1ZU9mKHJ1bGVOYW1lLmNoYXJBdCgwKSk7CisgICAgICAgIHJldHVybiBmaXJzdENoYXIudG9VcHBlckNhc2UoKStydWxlTmFtZS5zdWJzdHJpbmcoMSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplVHJlZVNwZWMoU3RyaW5nIHQpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHdvcmRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB3b3JkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgd2hpbGUgKCBpPHQubGVuZ3RoKCkgKSB7CisgICAgICAgICAgICBpZiAoIHQuY2hhckF0KGkpPT0nKCcgfHwgdC5jaGFyQXQoaSk9PScpJyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHdvcmQubGVuZ3RoKCk+MCApIHsKKyAgICAgICAgICAgICAgICAgICAgd29yZHMuYWRkKHdvcmQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmQuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3Jkcy5hZGQoU3RyaW5nLnZhbHVlT2YodC5jaGFyQXQoaSkpKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIENoYXJhY3Rlci5pc1doaXRlc3BhY2UodC5jaGFyQXQoaSkpICkgeworICAgICAgICAgICAgICAgIC8vIHVwb24gV1MsIHNhdmUgd29yZAorICAgICAgICAgICAgICAgIGlmICggd29yZC5sZW5ndGgoKT4wICkgeworICAgICAgICAgICAgICAgICAgICB3b3Jkcy5hZGQod29yZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgd29yZC5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4uICJ4IiBvciAuLi4oIngiCisgICAgICAgICAgICBpZiAoIHQuY2hhckF0KGkpPT0nIicgJiYgKGktMSk+PTAgJiYKKyAgICAgICAgICAgICAgICAgKHQuY2hhckF0KGktMSk9PScoJyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHQuY2hhckF0KGktMSkpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHdoaWxlICggaTx0Lmxlbmd0aCgpICYmIHQuY2hhckF0KGkpIT0nIicgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggdC5jaGFyQXQoaSk9PSdcXCcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaSsxKTx0Lmxlbmd0aCgpICYmIHQuY2hhckF0KGkrMSk9PSciJyApIC8vIGhhbmRsZSBcIgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLmFwcGVuZCgnIicpOworICAgICAgICAgICAgICAgICAgICAgICAgaSs9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdvcmQuYXBwZW5kKHQuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7IC8vIHNraXAgZmluYWwgIgorICAgICAgICAgICAgICAgIHdvcmRzLmFkZCh3b3JkLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHdvcmQuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yZC5hcHBlbmQodC5jaGFyQXQoaSkpOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmICggd29yZC5sZW5ndGgoKT4wICkgeworICAgICAgICAgICAgd29yZHMuYWRkKHdvcmQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIndvcmRzPSIrd29yZHMpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGo9MDsgajx3b3Jkcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgaWYgKCBqPjAgJiYgIXdvcmRzLmdldChqKS5lcXVhbHMoIikiKSAmJgorICAgICAgICAgICAgICAgICAhd29yZHMuZ2V0KGotMSkuZXF1YWxzKCIoIikgKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCh3b3Jkcy5nZXQoaikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9PdXRwdXRUZXN0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvT3V0cHV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzU5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvT3V0cHV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNyBLZW5ueSBNYWNEZXJtaWQKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0OworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CisKKy8qKiBPdXRwdXRUZXN0IHJlcHJlc2VudHMgYSB0ZXN0IGZvciBub3Qgb25seSBzdGFuZGFyZCBvdXRwdXQgc3RyaW5nLCAKKyAqICBidXQgYWxzbyBBU1Qgb3V0cHV0IHdoaWNoIGlzIGFjdHVhbGx5IGEgcmV0dXJuIHZhbHVlIGZyb20gYSBwYXJzZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRwdXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKwlwcml2YXRlIGZpbmFsIFRva2VuIHRva2VuOworCQorCXB1YmxpYyBPdXRwdXRUZXN0KFRva2VuIHRva2VuKSB7CisJCXRoaXMudG9rZW4gPSB0b2tlbjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiB0b2tlbi5nZXRUZXh0KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXRUeXBlKCkgeworCQlyZXR1cm4gdG9rZW4uZ2V0VHlwZSgpOworCX0KKworCUBPdmVycmlkZQorCS8vIHJldHVybiBBTlRMUiBlcnJvciBtc2cgaWYgdGVzdCBmYWlsZWQKKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdChnVW5pdFRlc3RSZXN1bHQgdGVzdFJlc3VsdCkgeworCQkvLyBOb3RlOiB3ZSB0cmVhdCB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmluZyBhcyBhIHJldHVybiB2YWx1ZSBhbHNvCisJCWlmICggdGVzdFJlc3VsdC5pc1N1Y2Nlc3MoKSApIHJldHVybiB0ZXN0UmVzdWx0LmdldFJldHVybmVkKCk7CisJCWVsc2UgeworCQkJaGFzRXJyb3JNc2cgPSB0cnVlOworCQkJcmV0dXJuIHRlc3RSZXN1bHQuZ2V0RXJyb3IoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWQoKSB7CisJCXJldHVybiB0b2tlbi5nZXRUZXh0KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L1JldHVyblRlc3QuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9SZXR1cm5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjNWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9SZXR1cm5UZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3IEtlbm55IE1hY0Rlcm1pZAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKKworcHVibGljIGNsYXNzIFJldHVyblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCXByaXZhdGUgZmluYWwgVG9rZW4gcmV0dmFsOworCQorCXB1YmxpYyBSZXR1cm5UZXN0KFRva2VuIHJldHZhbCkgeworCQl0aGlzLnJldHZhbCA9IHJldHZhbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiByZXR2YWwuZ2V0VGV4dCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHJldHZhbC5nZXRUeXBlKCk7CisJfQorCisJQE92ZXJyaWRlCisJLy8gcmV0dXJuIEFOVExSIGVycm9yIG1zZyBpZiB0ZXN0IGZhaWxlZAorCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KGdVbml0VGVzdFJlc3VsdCB0ZXN0UmVzdWx0KSB7CisJCWlmICggdGVzdFJlc3VsdC5pc1N1Y2Nlc3MoKSApIHJldHVybiB0ZXN0UmVzdWx0LmdldFJldHVybmVkKCk7CisJCWVsc2UgeworCQkJaGFzRXJyb3JNc2cgPSB0cnVlOworCQkJcmV0dXJuIHRlc3RSZXN1bHQuZ2V0RXJyb3IoKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWQoKSB7CisJCVN0cmluZyBleHBlY3QgPSByZXR2YWwuZ2V0VGV4dCgpOworCQkKKwkJaWYgKCBleHBlY3QuY2hhckF0KDApPT0nIicgJiYgZXhwZWN0LmNoYXJBdChleHBlY3QubGVuZ3RoKCktMSk9PSciJyApIHsKKwkJCWV4cGVjdCA9IGV4cGVjdC5zdWJzdHJpbmcoMSwgZXhwZWN0Lmxlbmd0aCgpLTEpOworCQl9CisJCQorCQlyZXR1cm4gZXhwZWN0OworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9nVW5pdEJhc2VUZXN0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRCYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDg5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRCYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDg5IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBMZW9uLCBKZW4tWXVhbiBTdQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWU7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVBZGFwdG9yOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZU5vZGVTdHJlYW07CitpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLlN0cmluZ1RlbXBsYXRlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKiBBbGwgZ1VuaXQtZ2VuZXJhdGVkIEpVbml0IGNsYXNzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyAKKyAqICB3aGljaCBpbXBsZW1lbnRzIHRoZSBlc3NlbnRpYWwgbWV0aG9kcyBmb3IgdHJpZ2dlcmluZworICogIEFOVExSIHBhcnNlci90cmVlIHdhbGtlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgZ1VuaXRCYXNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkKKwlwdWJsaWMgU3RyaW5nIHRyZWVBZGFwdG9yUGF0aDsKKwlwdWJsaWMgU3RyaW5nIHBhY2thZ2VQYXRoOworCXB1YmxpYyBTdHJpbmcgbGV4ZXJQYXRoOworCXB1YmxpYyBTdHJpbmcgcGFyc2VyUGF0aDsKKwlwdWJsaWMgU3RyaW5nIHRyZWVQYXJzZXJQYXRoOworCQorCXByb3RlY3RlZCBTdHJpbmcgc3Rkb3V0OworCXByb3RlY3RlZCBTdHJpbmcgc3RkZXJyOworCQorCXByaXZhdGUgUHJpbnRTdHJlYW0gY29uc29sZSA9IFN5c3RlbS5vdXQ7CisJcHJpdmF0ZSBQcmludFN0cmVhbSBjb25zb2xlRXJyID0gU3lzdGVtLmVycjsKKwkKKwkvLyBJbnZva2UgdGFyZ2V0IGxleGVyLnJ1bGUKKwlwdWJsaWMgU3RyaW5nIGV4ZWNMZXhlcihTdHJpbmcgdGVzdFJ1bGVOYW1lLCBpbnQgbGluZSwgU3RyaW5nIHRlc3RJbnB1dCwgYm9vbGVhbiBpc0ZpbGUpIHRocm93cyBFeGNlcHRpb24geworCQlDaGFyU3RyZWFtIGlucHV0OworCQkvKiogU2V0IHVwIEFOVExSIGlucHV0IHN0cmVhbSBiYXNlZCBvbiBpbnB1dCBzb3VyY2UsIGZpbGUgb3IgU3RyaW5nICovCisJCWlmICggaXNGaWxlICkgeworCQkJU3RyaW5nIGZpbGVQYXRoID0gdGVzdElucHV0OworCQkJRmlsZSB0ZXN0SW5wdXRGaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOworCQkJLy8gaWYgaW5wdXQgdGVzdCBmaWxlIGlzIG5vdCBmb3VuZCB1bmRlciB0aGUgY3VycmVudCBkaXIsIGFsc28gdHJ5IHRvIGxvb2sgZm9yIGl0IHVuZGVyIHRoZSBwYWNrYWdlIGRpcgorCQkJaWYgKCAhdGVzdElucHV0RmlsZS5leGlzdHMoKSAmJiBwYWNrYWdlUGF0aCE9bnVsbCApIHsKKwkJCQl0ZXN0SW5wdXRGaWxlID0gbmV3IEZpbGUocGFja2FnZVBhdGgsIGZpbGVQYXRoKTsKKwkJCQlpZiAoIHRlc3RJbnB1dEZpbGUuZXhpc3RzKCkgKSBmaWxlUGF0aCA9IHRlc3RJbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworCQkJfQorCQkJaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGZpbGVQYXRoKTsKKwkJfQorCQllbHNlIHsKKwkJCWlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKHRlc3RJbnB1dCk7CisJCX0KKwkJQ2xhc3MgbGV4ZXIgPSBudWxsOworCQlQcmludFN0cmVhbSBwcyA9IG51bGw7CQkvLyBmb3IgcmVkaXJlY3Rpbmcgc3Rkb3V0IGxhdGVyCisJCVByaW50U3RyZWFtIHBzMiA9IG51bGw7CQkvLyBmb3IgcmVkaXJlY3Rpbmcgc3RkZXJyIGxhdGVyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvKiogVXNlIFJlZmxlY3Rpb24gdG8gY3JlYXRlIGluc3RhbmNlcyBvZiBsZXhlciBhbmQgcGFyc2VyICovCisgICAgICAgIAlsZXhlciA9IENsYXNzLmZvck5hbWUobGV4ZXJQYXRoKTsKKyAgICAgICAgICAgIENsYXNzW10gbGV4QXJnVHlwZXMgPSBuZXcgQ2xhc3NbXXtDaGFyU3RyZWFtLmNsYXNzfTsJCQkJLy8gYXNzaWduIHR5cGUgdG8gbGV4ZXIncyBhcmdzCisgICAgICAgICAgICBDb25zdHJ1Y3RvciBsZXhDb25zdHJ1Y3RvciA9IGxleGVyLmdldENvbnN0cnVjdG9yKGxleEFyZ1R5cGVzKTsgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0W10gbGV4QXJncyA9IG5ldyBPYmplY3RbXXtpbnB1dH07CQkJCQkJCQkvLyBhc3NpZ24gdmFsdWUgdG8gbGV4ZXIncyBhcmdzICAgCisgICAgICAgICAgICBMZXhlciBsZXhPYmogPSAoTGV4ZXIpbGV4Q29uc3RydWN0b3IubmV3SW5zdGFuY2UobGV4QXJncyk7CQkJCS8vIG1ha2VzIG5ldyBpbnN0YW5jZSBvZiBsZXhlciAgICAKKyAgICAgICAgICAgIGlucHV0LnNldExpbmUobGluZSk7CisKKyAgICAgICAgICAgIE1ldGhvZCBydWxlTmFtZSA9IGxleGVyLmdldE1ldGhvZCgibSIrdGVzdFJ1bGVOYW1lLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiogU3RhcnQgb2YgSS9PIFJlZGlyZWN0aW5nICovCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHBzID0gbmV3IFByaW50U3RyZWFtKG91dCk7CisgICAgICAgICAgICBwczIgPSBuZXcgUHJpbnRTdHJlYW0oZXJyKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQocHMpOworICAgICAgICAgICAgU3lzdGVtLnNldEVycihwczIpOworICAgICAgICAgICAgLyoqIEVuZCBvZiByZWRpcmVjdGluZyAqLworCisgICAgICAgICAgICAvKiogSW52b2tlIGxleGVyIHJ1bGUsIGFuZCBnZXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gQ2hhclN0cmVhbSAqLworICAgICAgICAgICAgcnVsZU5hbWUuaW52b2tlKGxleE9iaiwgbmV3IE9iamVjdFswXSk7CisgICAgICAgICAgICBNZXRob2QgcnVsZU5hbWUyID0gbGV4ZXIuZ2V0TWV0aG9kKCJnZXRDaGFySW5kZXgiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgaW50IGN1cnJlbnRJbmRleCA9IChJbnRlZ2VyKSBydWxlTmFtZTIuaW52b2tlKGxleE9iaiwgbmV3IE9iamVjdFswXSk7CisgICAgICAgICAgICBpZiAoIGN1cnJlbnRJbmRleCE9aW5wdXQuc2l6ZSgpICkgeworICAgICAgICAgICAgCXBzMi5wcmludGxuKCJleHRyYSB0ZXh0IGZvdW5kLCAnIitpbnB1dC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpbnB1dC5zaXplKCktMSkrIiciKTsKKyAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgdGhpcy5zdGRvdXQgPSBudWxsOworCQkJdGhpcy5zdGRlcnIgPSBudWxsOworICAgICAgICAgICAgCisJCQlpZiAoIGVyci50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJdGhpcy5zdGRlcnIgPSBlcnIudG9TdHJpbmcoKTsKKwkJCQlyZXR1cm4gdGhpcy5zdGRlcnI7CisJCQl9CisJCQlpZiAoIG91dC50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJdGhpcy5zdGRvdXQgPSBvdXQudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWlmICggZXJyLnRvU3RyaW5nKCkubGVuZ3RoKCk9PTAgJiYgb3V0LnRvU3RyaW5nKCkubGVuZ3RoKCk9PTAgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CS8vIFRoaXMgZXhjZXB0aW9uIGNvdWxkIGJlIGNhdXNlZCBmcm9tIEFOVExSIFJ1bnRpbWUgRXhjZXB0aW9uLCBlLmcuIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbgorICAgICAgICAJaWYgKCBlLmdldENhdXNlKCkhPW51bGwgKSB0aGlzLnN0ZGVyciA9IGUuZ2V0Q2F1c2UoKS50b1N0cmluZygpOworCQkJZWxzZSB0aGlzLnN0ZGVyciA9IGUudG9TdHJpbmcoKTsKKyAgICAgICAgCXJldHVybiB0aGlzLnN0ZGVycjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgCXRyeSB7CisgICAgICAgIAkJaWYgKCBwcyE9bnVsbCApIHBzLmNsb3NlKCk7CisgICAgCQkJaWYgKCBwczIhPW51bGwgKSBwczIuY2xvc2UoKTsKKyAgICAJCQlTeXN0ZW0uc2V0T3V0KGNvbnNvbGUpOwkJCS8vIFJlc2V0IHN0YW5kYXJkIG91dHB1dAorICAgIAkJCVN5c3RlbS5zZXRFcnIoY29uc29sZUVycik7CQkvLyBSZXNldCBzdGFuZGFyZCBlcnIgb3V0CisgICAgICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuc3Rkb3V0OworCX0KKwkKKwkvLyBJbnZva2UgdGFyZ2V0IHBhcnNlci5ydWxlCisJCisJcHVibGljIE9iamVjdCBleGVjUGFyc2VyKFN0cmluZyB0ZXN0UnVsZU5hbWUsIGludCBsaW5lLCBTdHJpbmcgdGVzdElucHV0LCBib29sZWFuIGlzRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNoYXJTdHJlYW0gaW5wdXQ7CisJCS8qKiBTZXQgdXAgQU5UTFIgaW5wdXQgc3RyZWFtIGJhc2VkIG9uIGlucHV0IHNvdXJjZSwgZmlsZSBvciBTdHJpbmcgKi8KKwkJaWYgKCBpc0ZpbGUgKSB7CisJCQlTdHJpbmcgZmlsZVBhdGggPSB0ZXN0SW5wdXQ7CisJCQlGaWxlIHRlc3RJbnB1dEZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7CisJCQkvLyBpZiBpbnB1dCB0ZXN0IGZpbGUgaXMgbm90IGZvdW5kIHVuZGVyIHRoZSBjdXJyZW50IGRpciwgYWxzbyB0cnkgdG8gbG9vayBmb3IgaXQgdW5kZXIgdGhlIHBhY2thZ2UgZGlyCisJCQlpZiAoICF0ZXN0SW5wdXRGaWxlLmV4aXN0cygpICYmIHBhY2thZ2VQYXRoIT1udWxsICkgeworCQkJCXRlc3RJbnB1dEZpbGUgPSBuZXcgRmlsZShwYWNrYWdlUGF0aCwgZmlsZVBhdGgpOworCQkJCWlmICggdGVzdElucHV0RmlsZS5leGlzdHMoKSApIGZpbGVQYXRoID0gdGVzdElucHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisJCQl9CisJCQlpbnB1dCA9IG5ldyBBTlRMUkZpbGVTdHJlYW0oZmlsZVBhdGgpOworCQl9CisJCWVsc2UgeworCQkJaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0odGVzdElucHV0KTsKKwkJfQorCQlDbGFzcyBsZXhlciA9IG51bGw7CisJCUNsYXNzIHBhcnNlciA9IG51bGw7CisJCVByaW50U3RyZWFtIHBzID0gbnVsbDsJCS8vIGZvciByZWRpcmVjdGluZyBzdGRvdXQgbGF0ZXIKKwkJUHJpbnRTdHJlYW0gcHMyID0gbnVsbDsJCS8vIGZvciByZWRpcmVjdGluZyBzdGRlcnIgbGF0ZXIKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnIgPSBudWxsOworCQl0cnkgeworCQkJLyoqIFVzZSBSZWZsZWN0aW9uIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgbGV4ZXIgYW5kIHBhcnNlciAqLworCQkJbGV4ZXIgPSBDbGFzcy5mb3JOYW1lKGxleGVyUGF0aCk7CisgICAgICAgICAgICBDbGFzc1tdIGxleEFyZ1R5cGVzID0gbmV3IENsYXNzW117Q2hhclN0cmVhbS5jbGFzc307CQkJCS8vIGFzc2lnbiB0eXBlIHRvIGxleGVyJ3MgYXJncworICAgICAgICAgICAgQ29uc3RydWN0b3IgbGV4Q29uc3RydWN0b3IgPSBsZXhlci5nZXRDb25zdHJ1Y3RvcihsZXhBcmdUeXBlcyk7CisgICAgICAgICAgICBPYmplY3RbXSBsZXhBcmdzID0gbmV3IE9iamVjdFtde2lucHV0fTsJCQkJCQkJCS8vIGFzc2lnbiB2YWx1ZSB0byBsZXhlcidzIGFyZ3MgICAKKyAgICAgICAgICAgIExleGVyIGxleE9iaiA9IChMZXhlcilsZXhDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShsZXhBcmdzKTsJCQkJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIGxleGVyCisgICAgICAgICAgICBpbnB1dC5zZXRMaW5lKGxpbmUpOworCisgICAgICAgICAgICBDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4T2JqKTsKKyAgICAgICAgICAgIHBhcnNlciA9IENsYXNzLmZvck5hbWUocGFyc2VyUGF0aCk7CisgICAgICAgICAgICBDbGFzc1tdIHBhckFyZ1R5cGVzID0gbmV3IENsYXNzW117VG9rZW5TdHJlYW0uY2xhc3N9OwkJCQkvLyBhc3NpZ24gdHlwZSB0byBwYXJzZXIncyBhcmdzCisgICAgICAgICAgICBDb25zdHJ1Y3RvciBwYXJDb25zdHJ1Y3RvciA9IHBhcnNlci5nZXRDb25zdHJ1Y3RvcihwYXJBcmdUeXBlcyk7CisgICAgICAgICAgICBPYmplY3RbXSBwYXJBcmdzID0gbmV3IE9iamVjdFtde3Rva2Vuc307CQkJCQkJCS8vIGFzc2lnbiB2YWx1ZSB0byBwYXJzZXIncyBhcmdzICAKKyAgICAgICAgICAgIFBhcnNlciBwYXJPYmogPSAoUGFyc2VyKXBhckNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHBhckFyZ3MpOwkJCQkvLyBtYWtlcyBuZXcgaW5zdGFuY2Ugb2YgcGFyc2VyCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHNldCB1cCBjdXN0b21pemVkIHRyZWUgYWRhcHRvciBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmICggdHJlZUFkYXB0b3JQYXRoIT1udWxsICkgeworICAgICAgICAgICAgCXBhckFyZ1R5cGVzID0gbmV3IENsYXNzW117VHJlZUFkYXB0b3IuY2xhc3N9OworICAgICAgICAgICAgCU1ldGhvZCBfc2V0VHJlZUFkYXB0b3IgPSBwYXJzZXIuZ2V0TWV0aG9kKCJzZXRUcmVlQWRhcHRvciIsIHBhckFyZ1R5cGVzKTsKKyAgICAgICAgICAgIAlDbGFzcyBfdHJlZUFkYXB0b3IgPSBDbGFzcy5mb3JOYW1lKHRyZWVBZGFwdG9yUGF0aCk7CisgICAgICAgICAgICAJX3NldFRyZWVBZGFwdG9yLmludm9rZShwYXJPYmosIF90cmVlQWRhcHRvci5uZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0aG9kIHJ1bGVOYW1lID0gcGFyc2VyLmdldE1ldGhvZCh0ZXN0UnVsZU5hbWUpOworCisgICAgICAgICAgICAvKiogU3RhcnQgb2YgSS9PIFJlZGlyZWN0aW5nICovCisgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBlcnIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBwcyA9IG5ldyBQcmludFN0cmVhbShvdXQpOworICAgICAgICAgICAgcHMyID0gbmV3IFByaW50U3RyZWFtKGVycik7CisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHBzKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIocHMyKTsKKyAgICAgICAgICAgIC8qKiBFbmQgb2YgcmVkaXJlY3RpbmcgKi8KKworCQkJLyoqIEludm9rZSBncmFtbWFyIHJ1bGUsIGFuZCBzdG9yZSBpZiB0aGVyZSBpcyBhIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgICAgT2JqZWN0IHJ1bGVSZXR1cm4gPSBydWxlTmFtZS5pbnZva2UocGFyT2JqKTsKKyAgICAgICAgICAgIFN0cmluZyBhc3RTdHJpbmcgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHN0U3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIC8qKiBJZiBydWxlIGhhcyByZXR1cm4gdmFsdWUsIGRldGVybWluZSBpZiBpdCBjb250YWlucyBhbiBBU1Qgb3IgYSBTVCAqLworICAgICAgICAgICAgaWYgKCBydWxlUmV0dXJuIT1udWxsICkgeworICAgICAgICAgICAgICAgIGlmICggcnVsZVJldHVybi5nZXRDbGFzcygpLnRvU3RyaW5nKCkuaW5kZXhPZih0ZXN0UnVsZU5hbWUrIl9yZXR1cm4iKT4wICkgeworICAgICAgICAgICAgICAgIAl0cnkgewkvLyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtYXkgaGFwcGVuIGhlcmUuLi4KKyAgICAgICAgICAgICAgICAJCUNsYXNzIF9yZXR1cm4gPSBDbGFzcy5mb3JOYW1lKHBhcnNlclBhdGgrIiQiK3Rlc3RSdWxlTmFtZSsiX3JldHVybiIpOworICAgICAgICAgICAgICAgIAkJTWV0aG9kW10gbWV0aG9kcyA9IF9yZXR1cm4uZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgICAgICAgICAgCQlmb3IoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKwkJCSAgICAgICAgICAgICAgICBpZiAoIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRUcmVlIikgKSB7CisJCQkgICAgICAgICAgICAgICAgCU1ldGhvZCByZXR1cm5OYW1lID0gX3JldHVybi5nZXRNZXRob2QoImdldFRyZWUiKTsKKwkJICAgICAgICAgICAgICAgICAgICAJQ29tbW9uVHJlZSB0cmVlID0gKENvbW1vblRyZWUpIHJldHVybk5hbWUuaW52b2tlKHJ1bGVSZXR1cm4pOworCQkgICAgICAgICAgICAgICAgICAgIAlhc3RTdHJpbmcgPSB0cmVlLnRvU3RyaW5nVHJlZSgpOworCQkJICAgICAgICAgICAgICAgIH0KKwkJCSAgICAgICAgICAgICAgICBlbHNlIGlmICggbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFRlbXBsYXRlIikgKSB7CisJCQkgICAgICAgICAgICAgICAgCU1ldGhvZCByZXR1cm5OYW1lID0gX3JldHVybi5nZXRNZXRob2QoImdldFRlbXBsYXRlIik7CisJCQkgICAgICAgICAgICAgICAgCVN0cmluZ1RlbXBsYXRlIHN0ID0gKFN0cmluZ1RlbXBsYXRlKSByZXR1cm5OYW1lLmludm9rZShydWxlUmV0dXJuKTsKKwkJCSAgICAgICAgICAgICAgICAJc3RTdHJpbmcgPSBzdC50b1N0cmluZygpOworCQkJICAgICAgICAgICAgICAgIH0KKwkJCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIAljYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIAkJU3lzdGVtLmVyci5wcmludGxuKGUpOwkvLyBOb3RlOiBJZiBhbnkgZXhjZXB0aW9uIG9jY3VycywgdGhlIHRlc3QgaXMgdmlld2VkIGFzIGZhaWxlZC4KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCQkJdGhpcy5zdGRvdXQgPSAiIjsKKwkJCXRoaXMuc3RkZXJyID0gIiI7CisJCQkKKwkJCS8qKiBJbnZhbGlkIGlucHV0ICovCisgICAgICAgICAgICBpZiAoIHRva2Vucy5pbmRleCgpIT10b2tlbnMuc2l6ZSgpLTEgKSB7CisgICAgICAgICAgICAJLy90aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAJdGhpcy5zdGRlcnIgKz0gIlN0b3BwZWQgcGFyc2luZyBhdCB0b2tlbiBpbmRleCAiK3Rva2Vucy5pbmRleCgpKyI6ICI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKwkJCS8vIHJldFZhbCBjb3VsZCBiZSBhY3R1YWwgcmV0dXJuIG9iamVjdCBmcm9tIHJ1bGUsIHN0ZGVyciBvciBzdGRvdXQKKyAgICAgICAgICAgIHRoaXMuc3Rkb3V0ICs9IG91dC50b1N0cmluZygpOworICAgICAgICAgICAgdGhpcy5zdGRlcnIgKz0gZXJyLnRvU3RyaW5nKCk7CisKKwkJCWlmICggZXJyLnRvU3RyaW5nKCkubGVuZ3RoKCk+MCApIHJldHVybiB0aGlzLnN0ZGVycjsKKwkJCWlmICggb3V0LnRvU3RyaW5nKCkubGVuZ3RoKCk+MCApIHJldHVybiB0aGlzLnN0ZG91dDsKKwkJCWlmICggYXN0U3RyaW5nIT1udWxsICkgewkvLyBSZXR1cm4gdG9TdHJpbmdUcmVlIG9mIEFTVAorCQkJCXJldHVybiBhc3RTdHJpbmc7CisJCQl9CisJCQllbHNlIGlmICggc3RTdHJpbmchPW51bGwgKSB7Ly8gUmV0dXJuIHRvU3RyaW5nIG9mIFNUCisJCQkJcmV0dXJuIHN0U3RyaW5nOworCQkJfQorCQkJaWYgKCBydWxlUmV0dXJuIT1udWxsICkgeworCQkJCXJldHVybiBydWxlUmV0dXJuOworCQkJfQorCQkJaWYgKCBlcnIudG9TdHJpbmcoKS5sZW5ndGgoKT09MCAmJiBvdXQudG9TdHJpbmcoKS5sZW5ndGgoKT09MCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKwkJfQorICAgICAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisJCX0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKwkJfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKwkJfQorICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aGlzLnN0ZG91dCA9IG91dC50b1N0cmluZygpOworICAgICAgICAgICAgdGhpcy5zdGRlcnIgPSBlcnIudG9TdHJpbmcoKTsKKworCQkJaWYgKCBlLmdldENhdXNlKCkhPW51bGwgKSB0aGlzLnN0ZGVyciArPSBlLmdldENhdXNlKCkudG9TdHJpbmcoKTsKKwkJCWVsc2UgdGhpcy5zdGRlcnIgKz0gZS50b1N0cmluZygpOworICAgICAgICAJcmV0dXJuIHRoaXMuc3RkZXJyOworCQl9IGZpbmFsbHkgeworICAgICAgICAJdHJ5IHsKKyAgICAgICAgCQlpZiAoIHBzIT1udWxsICkgcHMuY2xvc2UoKTsKKyAgICAJCQlpZiAoIHBzMiE9bnVsbCApIHBzMi5jbG9zZSgpOworICAgIAkJCVN5c3RlbS5zZXRPdXQoY29uc29sZSk7CQkJLy8gUmVzZXQgc3RhbmRhcmQgb3V0cHV0CisgICAgCQkJU3lzdGVtLnNldEVycihjb25zb2xlRXJyKTsJCS8vIFJlc2V0IHN0YW5kYXJkIGVyciBvdXQKKyAgICAgICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorCQlyZXR1cm4gdGhpcy5zdGRvdXQ7CisJfQorCQorCS8vIEludm9rZSB0YXJnZXQgcGFyc2VyLnJ1bGUKKwlwdWJsaWMgT2JqZWN0IGV4ZWNUcmVlUGFyc2VyKFN0cmluZyB0ZXN0VHJlZVJ1bGVOYW1lLCBTdHJpbmcgdGVzdFJ1bGVOYW1lLCBTdHJpbmcgdGVzdElucHV0LCBib29sZWFuIGlzRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNoYXJTdHJlYW0gaW5wdXQ7CisJCWlmICggaXNGaWxlICkgeworCQkJU3RyaW5nIGZpbGVQYXRoID0gdGVzdElucHV0OworCQkJRmlsZSB0ZXN0SW5wdXRGaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOworCQkJLy8gaWYgaW5wdXQgdGVzdCBmaWxlIGlzIG5vdCBmb3VuZCB1bmRlciB0aGUgY3VycmVudCBkaXIsIGFsc28gdHJ5IHRvIGxvb2sgZm9yIGl0IHVuZGVyIHRoZSBwYWNrYWdlIGRpcgorCQkJaWYgKCAhdGVzdElucHV0RmlsZS5leGlzdHMoKSAmJiBwYWNrYWdlUGF0aCE9bnVsbCApIHsKKwkJCQl0ZXN0SW5wdXRGaWxlID0gbmV3IEZpbGUocGFja2FnZVBhdGgsIGZpbGVQYXRoKTsKKwkJCQlpZiAoIHRlc3RJbnB1dEZpbGUuZXhpc3RzKCkgKSBmaWxlUGF0aCA9IHRlc3RJbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworCQkJfQorCQkJaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGZpbGVQYXRoKTsKKwkJfQorCQllbHNlIHsKKwkJCWlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKHRlc3RJbnB1dCk7CisJCX0KKwkJQ2xhc3MgbGV4ZXIgPSBudWxsOworCQlDbGFzcyBwYXJzZXIgPSBudWxsOworCQlDbGFzcyB0cmVlUGFyc2VyID0gbnVsbDsKKwkJUHJpbnRTdHJlYW0gcHMgPSBudWxsOwkJLy8gZm9yIHJlZGlyZWN0aW5nIHN0ZG91dCBsYXRlcgorCQlQcmludFN0cmVhbSBwczIgPSBudWxsOwkJLy8gZm9yIHJlZGlyZWN0aW5nIHN0ZGVyciBsYXRlcgorCQl0cnkgeworCQkJLyoqIFVzZSBSZWZsZWN0aW9uIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgbGV4ZXIgYW5kIHBhcnNlciAqLworICAgICAgICAJbGV4ZXIgPSBDbGFzcy5mb3JOYW1lKGxleGVyUGF0aCk7CisgICAgICAgICAgICBDbGFzc1tdIGxleEFyZ1R5cGVzID0gbmV3IENsYXNzW117Q2hhclN0cmVhbS5jbGFzc307CQkJCS8vIGFzc2lnbiB0eXBlIHRvIGxleGVyJ3MgYXJncworICAgICAgICAgICAgQ29uc3RydWN0b3IgbGV4Q29uc3RydWN0b3IgPSBsZXhlci5nZXRDb25zdHJ1Y3RvcihsZXhBcmdUeXBlcyk7ICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdFtdIGxleEFyZ3MgPSBuZXcgT2JqZWN0W117aW5wdXR9OwkJCQkJCQkJLy8gYXNzaWduIHZhbHVlIHRvIGxleGVyJ3MgYXJncyAgIAorICAgICAgICAgICAgT2JqZWN0IGxleE9iaiA9IGxleENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGxleEFyZ3MpOwkJCQkvLyBtYWtlcyBuZXcgaW5zdGFuY2Ugb2YgbGV4ZXIgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbSgoTGV4ZXIpIGxleE9iaik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBhcnNlciA9IENsYXNzLmZvck5hbWUocGFyc2VyUGF0aCk7CisgICAgICAgICAgICBDbGFzc1tdIHBhckFyZ1R5cGVzID0gbmV3IENsYXNzW117VG9rZW5TdHJlYW0uY2xhc3N9OwkJCQkvLyBhc3NpZ24gdHlwZSB0byBwYXJzZXIncyBhcmdzCisgICAgICAgICAgICBDb25zdHJ1Y3RvciBwYXJDb25zdHJ1Y3RvciA9IHBhcnNlci5nZXRDb25zdHJ1Y3RvcihwYXJBcmdUeXBlcyk7CisgICAgICAgICAgICBPYmplY3RbXSBwYXJBcmdzID0gbmV3IE9iamVjdFtde3Rva2Vuc307CQkJCQkJCS8vIGFzc2lnbiB2YWx1ZSB0byBwYXJzZXIncyBhcmdzICAKKyAgICAgICAgICAgIE9iamVjdCBwYXJPYmogPSBwYXJDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShwYXJBcmdzKTsJCQkJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIHBhcnNlciAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXQgdXAgY3VzdG9taXplZCB0cmVlIGFkYXB0b3IgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBUcmVlQWRhcHRvciBjdXN0b21UcmVlQWRhcHRvciA9IG51bGw7IAorICAgICAgICAgICAgaWYgKCB0cmVlQWRhcHRvclBhdGghPW51bGwgKSB7CisgICAgICAgICAgICAJcGFyQXJnVHlwZXMgPSBuZXcgQ2xhc3NbXXtUcmVlQWRhcHRvci5jbGFzc307CisgICAgICAgICAgICAJTWV0aG9kIF9zZXRUcmVlQWRhcHRvciA9IHBhcnNlci5nZXRNZXRob2QoInNldFRyZWVBZGFwdG9yIiwgcGFyQXJnVHlwZXMpOworICAgICAgICAgICAgCUNsYXNzIF90cmVlQWRhcHRvciA9IENsYXNzLmZvck5hbWUodHJlZUFkYXB0b3JQYXRoKTsKKyAgICAgICAgICAgIAljdXN0b21UcmVlQWRhcHRvciA9IChUcmVlQWRhcHRvcikgX3RyZWVBZGFwdG9yLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAJX3NldFRyZWVBZGFwdG9yLmludm9rZShwYXJPYmosIGN1c3RvbVRyZWVBZGFwdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTWV0aG9kIHJ1bGVOYW1lID0gcGFyc2VyLmdldE1ldGhvZCh0ZXN0UnVsZU5hbWUpOworCisgICAgICAgICAgICAvKiogU3RhcnQgb2YgSS9PIFJlZGlyZWN0aW5nICovCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHBzID0gbmV3IFByaW50U3RyZWFtKG91dCk7CisgICAgICAgICAgICBwczIgPSBuZXcgUHJpbnRTdHJlYW0oZXJyKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQocHMpOworICAgICAgICAgICAgU3lzdGVtLnNldEVycihwczIpOworICAgICAgICAgICAgLyoqIEVuZCBvZiByZWRpcmVjdGluZyAqLworCisgICAgICAgICAgICAvKiogSW52b2tlIGdyYW1tYXIgcnVsZSwgYW5kIGdldCB0aGUgcmV0dXJuIHZhbHVlICovCisgICAgICAgICAgICBPYmplY3QgcnVsZVJldHVybiA9IHJ1bGVOYW1lLmludm9rZShwYXJPYmopOworICAgICAgICAgICAgCisgICAgICAgICAgICBDbGFzcyBfcmV0dXJuID0gQ2xhc3MuZm9yTmFtZShwYXJzZXJQYXRoKyIkIit0ZXN0UnVsZU5hbWUrIl9yZXR1cm4iKTsgICAgICAgICAgICAJCisgICAgICAgIAlNZXRob2QgcmV0dXJuTmFtZSA9IF9yZXR1cm4uZ2V0TWV0aG9kKCJnZXRUcmVlIik7CisgICAgICAgIAlDb21tb25UcmVlIHRyZWUgPSAoQ29tbW9uVHJlZSkgcmV0dXJuTmFtZS5pbnZva2UocnVsZVJldHVybik7CisKKyAgICAgICAgCS8vIFdhbGsgcmVzdWx0aW5nIHRyZWU7IGNyZWF0ZSB0cmVlIG5vZGVzIHN0cmVhbSBmaXJzdAorICAgICAgICAJQ29tbW9uVHJlZU5vZGVTdHJlYW0gbm9kZXM7CisgICAgICAgIAlpZiAoIGN1c3RvbVRyZWVBZGFwdG9yIT1udWxsICkgeworICAgICAgICAJCW5vZGVzID0gbmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKGN1c3RvbVRyZWVBZGFwdG9yLCB0cmVlKTsKKyAgICAgICAgCX0KKyAgICAgICAgCWVsc2UgeworICAgICAgICAJCW5vZGVzID0gbmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHRyZWUpOworICAgICAgICAJfQorICAgICAgICAJLy8gQVNUIG5vZGVzIGhhdmUgcGF5bG9hZCB0aGF0IHBvaW50IGludG8gdG9rZW4gc3RyZWFtCisgICAgICAgIAlub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOworICAgICAgICAJLy8gQ3JlYXRlIGEgdHJlZSB3YWxrZXIgYXR0YWNoZWQgdG8gdGhlIG5vZGVzIHN0cmVhbQorICAgICAgICAJdHJlZVBhcnNlciA9IENsYXNzLmZvck5hbWUodHJlZVBhcnNlclBhdGgpOworICAgICAgICAgICAgQ2xhc3NbXSB0cmVlUGFyQXJnVHlwZXMgPSBuZXcgQ2xhc3NbXXtUcmVlTm9kZVN0cmVhbS5jbGFzc307CQkvLyBhc3NpZ24gdHlwZSB0byB0cmVlIHBhcnNlcidzIGFyZ3MKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIHRyZWVQYXJDb25zdHJ1Y3RvciA9IHRyZWVQYXJzZXIuZ2V0Q29uc3RydWN0b3IodHJlZVBhckFyZ1R5cGVzKTsKKyAgICAgICAgICAgIE9iamVjdFtdIHRyZWVQYXJBcmdzID0gbmV3IE9iamVjdFtde25vZGVzfTsJCQkJCQkJLy8gYXNzaWduIHZhbHVlIHRvIHRyZWUgcGFyc2VyJ3MgYXJncyAgCisgICAgICAgICAgICBPYmplY3QgdHJlZVBhck9iaiA9IHRyZWVQYXJDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0cmVlUGFyQXJncyk7CS8vIG1ha2VzIG5ldyBpbnN0YW5jZSBvZiB0cmVlIHBhcnNlciAgICAgIAorICAgICAgICAJLy8gSW52b2tlIHRoZSB0cmVlIHJ1bGUsIGFuZCBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGlmIHRoZXJlIGlzCisgICAgICAgICAgICBNZXRob2QgdHJlZVJ1bGVOYW1lID0gdHJlZVBhcnNlci5nZXRNZXRob2QodGVzdFRyZWVSdWxlTmFtZSk7CisgICAgICAgICAgICBPYmplY3QgdHJlZVJ1bGVSZXR1cm4gPSB0cmVlUnVsZU5hbWUuaW52b2tlKHRyZWVQYXJPYmopOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXN0U3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzdFN0cmluZyA9IG51bGw7CisgICAgICAgICAgICAvKiogSWYgdHJlZSBydWxlIGhhcyByZXR1cm4gdmFsdWUsIGRldGVybWluZSBpZiBpdCBjb250YWlucyBhbiBBU1Qgb3IgYSBTVCAqLworICAgICAgICAgICAgaWYgKCB0cmVlUnVsZVJldHVybiE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRyZWVSdWxlUmV0dXJuLmdldENsYXNzKCkudG9TdHJpbmcoKS5pbmRleE9mKHRlc3RUcmVlUnVsZU5hbWUrIl9yZXR1cm4iKT4wICkgeworICAgICAgICAgICAgICAgIAl0cnkgewkvLyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtYXkgaGFwcGVuIGhlcmUuLi4KKyAgICAgICAgICAgICAgICAJCUNsYXNzIF90cmVlUmV0dXJuID0gQ2xhc3MuZm9yTmFtZSh0cmVlUGFyc2VyUGF0aCsiJCIrdGVzdFRyZWVSdWxlTmFtZSsiX3JldHVybiIpOworICAgICAgICAgICAgICAgIAkJTWV0aG9kW10gbWV0aG9kcyA9IF90cmVlUmV0dXJuLmdldERlY2xhcmVkTWV0aG9kcygpOworCQkJICAgICAgICAgICAgZm9yKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisJCQkgICAgICAgICAgICAgICAgaWYgKCBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0VHJlZSIpICkgeworCQkJICAgICAgICAgICAgICAgIAlNZXRob2QgdHJlZVJldHVybk5hbWUgPSBfdHJlZVJldHVybi5nZXRNZXRob2QoImdldFRyZWUiKTsKKwkJICAgICAgICAgICAgICAgICAgICAJQ29tbW9uVHJlZSByZXR1cm5UcmVlID0gKENvbW1vblRyZWUpIHRyZWVSZXR1cm5OYW1lLmludm9rZSh0cmVlUnVsZVJldHVybik7CisJCSAgICAgICAgICAgICAgICAgICAgICAgIGFzdFN0cmluZyA9IHJldHVyblRyZWUudG9TdHJpbmdUcmVlKCk7CisJCQkgICAgICAgICAgICAgICAgfQorCQkJICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0VGVtcGxhdGUiKSApIHsKKwkJCSAgICAgICAgICAgICAgICAJTWV0aG9kIHRyZWVSZXR1cm5OYW1lID0gX3JldHVybi5nZXRNZXRob2QoImdldFRlbXBsYXRlIik7CisJCQkgICAgICAgICAgICAgICAgCVN0cmluZ1RlbXBsYXRlIHN0ID0gKFN0cmluZ1RlbXBsYXRlKSB0cmVlUmV0dXJuTmFtZS5pbnZva2UodHJlZVJ1bGVSZXR1cm4pOworCQkJICAgICAgICAgICAgICAgIAlzdFN0cmluZyA9IHN0LnRvU3RyaW5nKCk7CisJCQkgICAgICAgICAgICAgICAgfQorCQkJICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgCWNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CS8vIE5vdGU6IElmIGFueSBleGNlcHRpb24gb2NjdXJzLCB0aGUgdGVzdCBpcyB2aWV3ZWQgYXMgZmFpbGVkLgorICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisJCQl0aGlzLnN0ZG91dCA9IG51bGw7CisJCQl0aGlzLnN0ZGVyciA9IG51bGw7CisJCQkKKwkJCS8qKiBJbnZhbGlkIGlucHV0ICovCisgICAgICAgICAgICBpZiAoIHRva2Vucy5pbmRleCgpIT10b2tlbnMuc2l6ZSgpLTEgKSB7CisgICAgICAgICAgICAJdGhyb3cgbmV3IEludmFsaWRJbnB1dEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCQkJCisJCQkvLyByZXRWYWwgY291bGQgYmUgYWN0dWFsIHJldHVybiBvYmplY3QgZnJvbSBydWxlLCBzdGRlcnIgb3Igc3Rkb3V0CisJCQlpZiAoIGVyci50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJdGhpcy5zdGRlcnIgPSBlcnIudG9TdHJpbmcoKTsKKwkJCQlyZXR1cm4gdGhpcy5zdGRlcnI7CisJCQl9CisJCQlpZiAoIG91dC50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJdGhpcy5zdGRvdXQgPSBvdXQudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWlmICggYXN0U3RyaW5nIT1udWxsICkgewkvLyBSZXR1cm4gdG9TdHJpbmdUcmVlIG9mIEFTVAorCQkJCXJldHVybiBhc3RTdHJpbmc7CisJCQl9CisJCQllbHNlIGlmICggc3RTdHJpbmchPW51bGwgKSB7Ly8gUmV0dXJuIHRvU3RyaW5nIG9mIFNUCisJCQkJcmV0dXJuIHN0U3RyaW5nOworCQkJfQorCQkJaWYgKCB0cmVlUnVsZVJldHVybiE9bnVsbCApIHsKKwkJCQlyZXR1cm4gdHJlZVJ1bGVSZXR1cm47CisJCQl9CisJCQlpZiAoIGVyci50b1N0cmluZygpLmxlbmd0aCgpPT0wICYmIG91dC50b1N0cmluZygpLmxlbmd0aCgpPT0wICkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKwkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCWlmICggZS5nZXRDYXVzZSgpIT1udWxsICkgdGhpcy5zdGRlcnIgPSBlLmdldENhdXNlKCkudG9TdHJpbmcoKTsKKwkJCWVsc2UgdGhpcy5zdGRlcnIgPSBlLnRvU3RyaW5nKCk7CisgICAgICAgIAlyZXR1cm4gdGhpcy5zdGRlcnI7CisJCX0gZmluYWxseSB7CisgICAgICAgIAl0cnkgeworICAgICAgICAJCWlmICggcHMhPW51bGwgKSBwcy5jbG9zZSgpOworICAgIAkJCWlmICggcHMyIT1udWxsICkgcHMyLmNsb3NlKCk7CisgICAgCQkJU3lzdGVtLnNldE91dChjb25zb2xlKTsJCQkvLyBSZXNldCBzdGFuZGFyZCBvdXRwdXQKKyAgICAJCQlTeXN0ZW0uc2V0RXJyKGNvbnNvbGVFcnIpOwkJLy8gUmVzZXQgc3RhbmRhcmQgZXJyIG91dAorICAgICAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAJfQorICAgICAgICB9CisJCXJldHVybiBzdGRvdXQ7CisJfQorCQorCS8vIE1vZGlmeSB0aGUgcmV0dXJuIHZhbHVlIGlmIHRoZSBleHBlY3RlZCB0b2tlbiB0eXBlIGlzIE9LIG9yIEZBSUwKKwlwdWJsaWMgT2JqZWN0IGV4YW1pbmVFeGVjUmVzdWx0KGludCB0b2tlblR5cGUsIE9iamVjdCByZXRWYWwpIHsJCisJCWlmICggdG9rZW5UeXBlPT1nVW5pdFBhcnNlci5PSyApIHsJLy8gZXhwZWN0ZWQgVG9rZW46IE9LCisJCQlpZiAoIHRoaXMuc3RkZXJyPT1udWxsICkgeworCQkJCXJldHVybiAiT0siOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmV0dXJuICJGQUlMLCAiK3RoaXMuc3RkZXJyOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCB0b2tlblR5cGU9PWdVbml0UGFyc2VyLkZBSUwgKSB7CS8vIGV4cGVjdGVkIFRva2VuOiBGQUlMCisJCQlpZiAoIHRoaXMuc3RkZXJyIT1udWxsICkgeworCQkJCXJldHVybiAiRkFJTCI7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZXR1cm4gIk9LIjsKKwkJCX0KKwkJfQorCQllbHNlIHsJLy8gcmV0dXJuIHRoZSBzYW1lIG9iamVjdCBmb3IgdGhlIG90aGVyIHRva2VuIHR5cGVzCisJCQlyZXR1cm4gcmV0VmFsOworCQl9CQkKKwl9CisJCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRFeGVjdXRvci5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L2dVbml0RXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk4YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L2dVbml0RXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDY1MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTGVvbiBKZW4tWXVhbiBTdQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWVOb2RlU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3I7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUuQ29tbW9uR3JvdXBMb2FkZXI7CitpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLlN0cmluZ1RlbXBsYXRlOworaW1wb3J0IG9yZy5hbnRsci5zdHJpbmd0ZW1wbGF0ZS5TdHJpbmdUZW1wbGF0ZUdyb3VwOworaW1wb3J0IG9yZy5hbnRsci5zdHJpbmd0ZW1wbGF0ZS5TdHJpbmdUZW1wbGF0ZUdyb3VwTG9hZGVyOworaW1wb3J0IG9yZy5hbnRsci5zdHJpbmd0ZW1wbGF0ZS5sYW5ndWFnZS5BbmdsZUJyYWNrZXRUZW1wbGF0ZUxleGVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgZ1VuaXRFeGVjdXRvciBpbXBsZW1lbnRzIElUZXN0U3VpdGUgeworCXB1YmxpYyBHcmFtbWFySW5mbyBncmFtbWFySW5mbzsKKworCXByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgZ3JhbW1hckNsYXNzTG9hZGVyOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGVzdHN1aXRlRGlyOworCisJcHVibGljIGludCBudW1PZlRlc3Q7CisKKwlwdWJsaWMgaW50IG51bU9mU3VjY2VzczsKKworCXB1YmxpYyBpbnQgbnVtT2ZGYWlsdXJlOworCisJcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisKKwlwdWJsaWMgaW50IG51bU9mSW52YWxpZElucHV0OworCisJcHJpdmF0ZSBTdHJpbmcgcGFyc2VyTmFtZTsKKworCXByaXZhdGUgU3RyaW5nIGxleGVyTmFtZTsKKworCXB1YmxpYyBMaXN0PEFic3RyYWN0VGVzdD4gZmFpbHVyZXM7CisJcHVibGljIExpc3Q8QWJzdHJhY3RUZXN0PiBpbnZhbGlkczsKKworCXByaXZhdGUgUHJpbnRTdHJlYW0gY29uc29sZSA9IFN5c3RlbS5vdXQ7CisgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBjb25zb2xlRXJyID0gU3lzdGVtLmVycjsKKworICAgIHB1YmxpYyBnVW5pdEV4ZWN1dG9yKEdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvLCBTdHJpbmcgdGVzdHN1aXRlRGlyKSB7CisgICAgCXRoaXMoIGdyYW1tYXJJbmZvLCBkZXRlcm1pbmVDbGFzc0xvYWRlcigpLCB0ZXN0c3VpdGVEaXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGRldGVybWluZUNsYXNzTG9hZGVyKCkgeworICAgIAlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgCWlmICggY2xhc3NMb2FkZXIgPT0gbnVsbCApIHsKKyAgICAJCWNsYXNzTG9hZGVyID0gZ1VuaXRFeGVjdXRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgIAl9CisgICAgCXJldHVybiBjbGFzc0xvYWRlcjsKKyAgICB9CisKKwlwdWJsaWMgZ1VuaXRFeGVjdXRvcihHcmFtbWFySW5mbyBncmFtbWFySW5mbywgQ2xhc3NMb2FkZXIgZ3JhbW1hckNsYXNzTG9hZGVyLCBTdHJpbmcgdGVzdHN1aXRlRGlyKSB7CisJCXRoaXMuZ3JhbW1hckluZm8gPSBncmFtbWFySW5mbzsKKwkJdGhpcy5ncmFtbWFyQ2xhc3NMb2FkZXIgPSBncmFtbWFyQ2xhc3NMb2FkZXI7CisJCXRoaXMudGVzdHN1aXRlRGlyID0gdGVzdHN1aXRlRGlyOworCQludW1PZlRlc3QgPSAwOworCQludW1PZlN1Y2Nlc3MgPSAwOworCQludW1PZkZhaWx1cmUgPSAwOworCQludW1PZkludmFsaWRJbnB1dCA9IDA7CisJCWZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFRlc3Q+KCk7CisJCWludmFsaWRzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFRlc3Q+KCk7CisJfQorCisJcHJvdGVjdGVkIENsYXNzTG9hZGVyIGdldEdyYW1tYXJDbGFzc0xvYWRlcigpIHsKKwkJcmV0dXJuIGdyYW1tYXJDbGFzc0xvYWRlcjsKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgY2xhc3NGb3JOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRHcmFtbWFyQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIG5hbWUgKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGV4ZWNUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9ueworCQkvLyBTZXQgdXAgc3RyaW5nIHRlbXBsYXRlIGZvciB0ZXN0aW5nIHJlc3VsdAorCQlTdHJpbmdUZW1wbGF0ZSB0ZXN0UmVzdWx0U1QgPSBnZXRUZW1wbGF0ZUdyb3VwKCkuZ2V0SW5zdGFuY2VPZigidGVzdFJlc3VsdCIpOworCQl0cnkgeworCQkJLyoqIFNldCB1cCBhcHByb3ByaWF0ZSBwYXRoIGZvciBwYXJzZXIvbGV4ZXIgaWYgdXNpbmcgcGFja2FnZSAqLworCQkJaWYgKGdyYW1tYXJJbmZvLmdldEdyYW1tYXJQYWNrYWdlKCkhPW51bGwgKSB7CisJCQkJcGFyc2VyTmFtZSA9IGdyYW1tYXJJbmZvLmdldEdyYW1tYXJQYWNrYWdlKCkrIi4iK2dyYW1tYXJJbmZvLmdldEdyYW1tYXJOYW1lKCkrIlBhcnNlciI7CisJCQkJbGV4ZXJOYW1lID0gZ3JhbW1hckluZm8uZ2V0R3JhbW1hclBhY2thZ2UoKSsiLiIrZ3JhbW1hckluZm8uZ2V0R3JhbW1hck5hbWUoKSsiTGV4ZXIiOworCQkJfQorCQkJZWxzZSB7CisJCQkJcGFyc2VyTmFtZSA9IGdyYW1tYXJJbmZvLmdldEdyYW1tYXJOYW1lKCkrIlBhcnNlciI7CisJCQkJbGV4ZXJOYW1lID0gZ3JhbW1hckluZm8uZ2V0R3JhbW1hck5hbWUoKSsiTGV4ZXIiOworCQkJfQorCisJCQkvKioqIFN0YXJ0IFVuaXQvRnVuY3Rpb25hbCBUZXN0aW5nICoqKi8KKwkJCS8vIEV4ZWN1dGUgdW5pdCB0ZXN0IG9mIGZvciBwYXJzZXIsIGxleGVyIGFuZCB0cmVlIGdyYW1tYXIKKwkJCWlmICggZ3JhbW1hckluZm8uZ2V0VHJlZUdyYW1tYXJOYW1lKCkhPW51bGwgKSB7CisJCQkJdGl0bGUgPSAiZXhlY3V0aW5nIHRlc3RzdWl0ZSBmb3IgdHJlZSBncmFtbWFyOiIrZ3JhbW1hckluZm8uZ2V0VHJlZUdyYW1tYXJOYW1lKCkrIiB3YWxrcyAiK3BhcnNlck5hbWU7CisJCQl9CisJCQllbHNlIHsKKwkJCQl0aXRsZSA9ICJleGVjdXRpbmcgdGVzdHN1aXRlIGZvciBncmFtbWFyOiIrZ3JhbW1hckluZm8uZ2V0R3JhbW1hck5hbWUoKTsKKwkJCX0KKwkJCWV4ZWN1dGVUZXN0cygpOworCQkJLy8gRW5kIG9mIGV4ZWN0aW9uIG9mIHVuaXQgdGVzdGluZworCisJCQkvLyBGaWxsIGluIHRoZSB0ZW1wbGF0ZSBob2xlcyB3aXRoIHRoZSB0ZXN0IHJlc3VsdHMKKwkJCXRlc3RSZXN1bHRTVC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGl0bGUpOworCQkJdGVzdFJlc3VsdFNULnNldEF0dHJpYnV0ZSgibnVtX29mX3Rlc3QiLCBudW1PZlRlc3QpOworCQkJdGVzdFJlc3VsdFNULnNldEF0dHJpYnV0ZSgibnVtX29mX2ZhaWx1cmUiLCBudW1PZkZhaWx1cmUpOworCQkJaWYgKCBudW1PZkZhaWx1cmU+MCApIHsKKwkJCQl0ZXN0UmVzdWx0U1Quc2V0QXR0cmlidXRlKCJmYWlsdXJlIiwgZmFpbHVyZXMpOworCQkJfQorCQkJaWYgKCBudW1PZkludmFsaWRJbnB1dD4wICkgeworCQkJCXRlc3RSZXN1bHRTVC5zZXRBdHRyaWJ1dGUoImhhc19pbnZhbGlkIiwgdHJ1ZSk7CisJCQkJdGVzdFJlc3VsdFNULnNldEF0dHJpYnV0ZSgibnVtX29mX2ludmFsaWQiLCBudW1PZkludmFsaWRJbnB1dCk7CisJCQkJdGVzdFJlc3VsdFNULnNldEF0dHJpYnV0ZSgiaW52YWxpZCIsIGludmFsaWRzKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCQlyZXR1cm4gdGVzdFJlc3VsdFNULnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdUZW1wbGF0ZUdyb3VwIGdldFRlbXBsYXRlR3JvdXAoKSB7CisJCVN0cmluZ1RlbXBsYXRlR3JvdXBMb2FkZXIgbG9hZGVyID0gbmV3IENvbW1vbkdyb3VwTG9hZGVyKCJvcmcvYW50bHIvZ3VuaXQiLCBudWxsKTsKKwkJU3RyaW5nVGVtcGxhdGVHcm91cC5yZWdpc3Rlckdyb3VwTG9hZGVyKGxvYWRlcik7CisJCVN0cmluZ1RlbXBsYXRlR3JvdXAucmVnaXN0ZXJEZWZhdWx0TGV4ZXIoQW5nbGVCcmFja2V0VGVtcGxhdGVMZXhlci5jbGFzcyk7CisJCVN0cmluZ1RlbXBsYXRlR3JvdXAgZ3JvdXAgPSBTdHJpbmdUZW1wbGF0ZUdyb3VwLmxvYWRHcm91cCgiZ1VuaXRUZXN0UmVzdWx0Iik7CisJCXJldHVybiBncm91cDsKKwl9CisKKwkvLyBUT0RPOiB0aHJvdyBtb3JlIHNwZWNpZmljIGV4Y2VwdGlvbnMKKwlwcml2YXRlIGdVbml0VGVzdFJlc3VsdCBydW5Db3JyZWN0UGFyc2VyKFN0cmluZyBwYXJzZXJOYW1lLCBTdHJpbmcgbGV4ZXJOYW1lLCBTdHJpbmcgcnVsZSwgU3RyaW5nIGxleGljYWxSdWxlLCBTdHJpbmcgdHJlZVJ1bGUsIGdVbml0VGVzdElucHV0IGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uCisJeworCQlpZiAoIGxleGljYWxSdWxlIT1udWxsICkgcmV0dXJuIHJ1bkxleGVyKGxleGVyTmFtZSwgbGV4aWNhbFJ1bGUsIGlucHV0KTsKKwkJZWxzZSBpZiAoIHRyZWVSdWxlIT1udWxsICkgcmV0dXJuIHJ1blRyZWVQYXJzZXIocGFyc2VyTmFtZSwgbGV4ZXJOYW1lLCBydWxlLCB0cmVlUnVsZSwgaW5wdXQpOworCQllbHNlIHJldHVybiBydW5QYXJzZXIocGFyc2VyTmFtZSwgbGV4ZXJOYW1lLCBydWxlLCBpbnB1dCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlmb3IgKCBnVW5pdFRlc3RTdWl0ZSB0czogZ3JhbW1hckluZm8uZ2V0UnVsZVRlc3RTdWl0ZXMoKSApIHsKKwkJCVN0cmluZyBydWxlID0gdHMuZ2V0UnVsZU5hbWUoKTsKKwkJCVN0cmluZyBsZXhpY2FsUnVsZSA9IHRzLmdldExleGljYWxSdWxlTmFtZSgpOworCQkJU3RyaW5nIHRyZWVSdWxlID0gdHMuZ2V0VHJlZVJ1bGVOYW1lKCk7CisJCQlmb3IgKCBnVW5pdFRlc3RJbnB1dCBpbnB1dDogdHMudGVzdFN1aXRlcy5rZXlTZXQoKSApIHsJLy8gZWFjaCBydWxlIG1heSBjb250YWluIG11bHRpcGxlIHRlc3RzCisJCQkJbnVtT2ZUZXN0Kys7CisJCQkJLy8gUnVuIHBhcnNlciwgYW5kIGdldCB0aGUgcmV0dXJuIHZhbHVlIG9yIHN0ZG91dCBvciBzdGRlcnIgaWYgdGhlcmUgaXMKKwkJCQlnVW5pdFRlc3RSZXN1bHQgcmVzdWx0ID0gbnVsbDsKKwkJCQlBYnN0cmFjdFRlc3QgdGVzdCA9IHRzLnRlc3RTdWl0ZXMuZ2V0KGlucHV0KTsKKwkJCQl0cnkgeworCQkJCQkvLyBUT0RPOiBjcmVhdGUgYSAtZGVidWcgb3B0aW9uIHRvIHR1cm4gb24gbG9nZ2luZywgd2hpY2ggc2hvd3MgcHJvZ3Jlc3Mgb2YgcnVubmluZyB0ZXN0cworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnQobnVtT2ZUZXN0ICsgIi4gUnVubmluZyBydWxlOiAiICsgcnVsZSArICI7IGlucHV0OiAnIiArIGlucHV0LnRlc3RJbnB1dCArICInIik7CisJCQkJCXJlc3VsdCA9IHJ1bkNvcnJlY3RQYXJzZXIocGFyc2VyTmFtZSwgbGV4ZXJOYW1lLCBydWxlLCBsZXhpY2FsUnVsZSwgdHJlZVJ1bGUsIGlucHV0KTsKKwkJCQkJLy8gVE9ETzogY3JlYXRlIGEgLWRlYnVnIG9wdGlvbiB0byB0dXJuIG9uIGxvZ2dpbmcsIHdoaWNoIHNob3dzIHByb2dyZXNzIG9mIHJ1bm5pbmcgdGVzdHMKKwkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIjsgRXhwZWN0aW5nICIgKyB0ZXN0LmdldEV4cGVjdGVkKCkgKyAiOyBTdWNjZXNzPzogIiArIHRlc3QuZ2V0RXhwZWN0ZWQoKS5lcXVhbHModGVzdC5nZXRSZXN1bHQocmVzdWx0KSkpOworCQkJCX0gY2F0Y2ggKCBJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgeworCQkJCQludW1PZkludmFsaWRJbnB1dCsrOworICAgICAgICAgICAgICAgICAgICB0ZXN0LnNldEhlYWRlcihydWxlLCBsZXhpY2FsUnVsZSwgdHJlZVJ1bGUsIG51bU9mVGVzdCwgaW5wdXQubGluZSk7CisJCQkJCXRlc3Quc2V0QWN0dWFsKGlucHV0LmlucHV0KTsKKwkJCQkJaW52YWxpZHMuYWRkKHRlc3QpOworCQkJCQljb250aW51ZTsKKwkJCQl9CS8vIFRPRE86IGVuc3VyZSB0aGVyZSdzIG5vIG90aGVyIGV4Y2VwdGlvbnMgcmVxdWlyZWQgdG8gYmUgaGFuZGxlZCBoZXJlLi4uCisKKwkJCQlTdHJpbmcgZXhwZWN0ZWQgPSB0ZXN0LmdldEV4cGVjdGVkKCk7CisJCQkJU3RyaW5nIGFjdHVhbCA9IHRlc3QuZ2V0UmVzdWx0KHJlc3VsdCk7CisJCQkJdGVzdC5zZXRBY3R1YWwoYWN0dWFsKTsKKworCQkJCWlmIChhY3R1YWwgPT0gbnVsbCkgeworCQkJCQludW1PZkZhaWx1cmUrKzsKKyAgICAgICAgICAgICAgICAgICAgdGVzdC5zZXRIZWFkZXIocnVsZSwgbGV4aWNhbFJ1bGUsIHRyZWVSdWxlLCBudW1PZlRlc3QsIGlucHV0LmxpbmUpOworCQkJCQl0ZXN0LnNldEFjdHVhbCgibnVsbCIpOworCQkJCQlmYWlsdXJlcy5hZGQodGVzdCk7CisJCQkJCW9uRmFpbCh0ZXN0KTsKKwkJCQl9CisJCQkJLy8gdGhlIDJuZCBjb25kaXRpb24gaXMgdXNlZCBmb3IgdGhlIGFzc2VydEZBSUwgdGVzdCBvZiBsZXhlciBydWxlIGJlY2F1c2UgQm9vbGVhblRlc3QgcmV0dXJuIGVyciBtc2cgaW5zdGVhZCBvZiAnRkFJTCcgaWYgaXNMZXhlclRlc3QKKwkJCQllbHNlIGlmICggZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkgfHwgKGV4cGVjdGVkLmVxdWFscygiRkFJTCIpJiYhYWN0dWFsLmVxdWFscygiT0siKSApICkgeworCQkJCQludW1PZlN1Y2Nlc3MrKzsKKwkJCQkJb25QYXNzKHRlc3QpOworCQkJCX0KKwkJCQkvLyBUT0RPOiBzb21ldGhpbmcgd2l0aCBBQ1RJT05TIC0gYXQgbGVhc3QgY3JlYXRlIGFjdGlvbiB0ZXN0IHR5cGUgYW5kIHRocm93IGV4Y2VwdGlvbi4KKwkJCQllbHNlIGlmICggdHMudGVzdFN1aXRlcy5nZXQoaW5wdXQpLmdldFR5cGUoKT09Z1VuaXRQYXJzZXIuQUNUSU9OICkgewkvLyBleHBlY3RlZCBUb2tlbjogQUNUSU9OCisJCQkJCW51bU9mRmFpbHVyZSsrOworICAgICAgICAgICAgICAgICAgICB0ZXN0LnNldEhlYWRlcihydWxlLCBsZXhpY2FsUnVsZSwgdHJlZVJ1bGUsIG51bU9mVGVzdCwgaW5wdXQubGluZSk7CisJCQkJCXRlc3Quc2V0QWN0dWFsKCJcdCIrIntBQ1RJT059IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGdyYW1tYXJJbmZvIHlldC4uLiIpOworCQkJCQlmYWlsdXJlcy5hZGQodGVzdCk7CisJCQkJCW9uRmFpbCh0ZXN0KTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW51bU9mRmFpbHVyZSsrOworICAgICAgICAgICAgICAgICAgICB0ZXN0LnNldEhlYWRlcihydWxlLCBsZXhpY2FsUnVsZSwgdHJlZVJ1bGUsIG51bU9mVGVzdCwgaW5wdXQubGluZSk7CisJCQkJCWZhaWx1cmVzLmFkZCh0ZXN0KTsKKwkJCQkJb25GYWlsKHRlc3QpOworCQkJCX0KKwkJCX0JLy8gZW5kIG9mIDJuZCBmb3ItbG9vcDogdGVzdHMgZm9yIGluZGl2aWR1YWwgcnVsZQorCQl9CS8vIGVuZCBvZiAxc3QgZm9yLWxvb3A6IHRlc3RzdWl0ZXMgZm9yIGdyYW1tYXIKKwl9CisKKwkvLyBUT0RPOiB0aHJvdyBwcm9wZXIgZXhjZXB0aW9ucworCXByb3RlY3RlZCBnVW5pdFRlc3RSZXN1bHQgcnVuTGV4ZXIoU3RyaW5nIGxleGVyTmFtZSwgU3RyaW5nIHRlc3RSdWxlTmFtZSwgZ1VuaXRUZXN0SW5wdXQgdGVzdElucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2hhclN0cmVhbSBpbnB1dDsKKwkJQ2xhc3MgbGV4ZXIgPSBudWxsOworCQlQcmludFN0cmVhbSBwcyA9IG51bGw7CQkvLyBmb3IgcmVkaXJlY3Rpbmcgc3Rkb3V0IGxhdGVyCisJCVByaW50U3RyZWFtIHBzMiA9IG51bGw7CQkvLyBmb3IgcmVkaXJlY3Rpbmcgc3RkZXJyIGxhdGVyCisJCXRyeSB7CisJCQkvKiogU2V0IHVwIEFOVExSIGlucHV0IHN0cmVhbSBiYXNlZCBvbiBpbnB1dCBzb3VyY2UsIGZpbGUgb3IgU3RyaW5nICovCisJCQlpbnB1dCA9IGdldEFOVExSSW5wdXRTdHJlYW0odGVzdElucHV0KTsKKworICAgICAgICAgICAgLyoqIFVzZSBSZWZsZWN0aW9uIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgbGV4ZXIgYW5kIHBhcnNlciAqLworICAgICAgICAJbGV4ZXIgPSBjbGFzc0Zvck5hbWUobGV4ZXJOYW1lKTsKKyAgICAgICAgICAgIENsYXNzW10gbGV4QXJnVHlwZXMgPSBuZXcgQ2xhc3NbXXtDaGFyU3RyZWFtLmNsYXNzfTsJCQkJLy8gYXNzaWduIHR5cGUgdG8gbGV4ZXIncyBhcmdzCisgICAgICAgICAgICBDb25zdHJ1Y3RvciBsZXhDb25zdHJ1Y3RvciA9IGxleGVyLmdldENvbnN0cnVjdG9yKGxleEFyZ1R5cGVzKTsKKyAgICAgICAgICAgIE9iamVjdFtdIGxleEFyZ3MgPSBuZXcgT2JqZWN0W117aW5wdXR9OwkJCQkJCQkJLy8gYXNzaWduIHZhbHVlIHRvIGxleGVyJ3MgYXJncworICAgICAgICAgICAgT2JqZWN0IGxleE9iaiA9IGxleENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGxleEFyZ3MpOwkJCQkvLyBtYWtlcyBuZXcgaW5zdGFuY2Ugb2YgbGV4ZXIKKworICAgICAgICAgICAgTWV0aG9kIHJ1bGVOYW1lID0gbGV4ZXIuZ2V0TWV0aG9kKCJtIit0ZXN0UnVsZU5hbWUsIG5ldyBDbGFzc1swXSk7CisKKyAgICAgICAgICAgIC8qKiBTdGFydCBvZiBJL08gUmVkaXJlY3RpbmcgKi8KKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3V0KTsKKyAgICAgICAgICAgIHBzMiA9IG5ldyBQcmludFN0cmVhbShlcnIpOworICAgICAgICAgICAgU3lzdGVtLnNldE91dChwcyk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKHBzMik7CisgICAgICAgICAgICAvKiogRW5kIG9mIHJlZGlyZWN0aW5nICovCisKKyAgICAgICAgICAgIC8qKiBJbnZva2UgbGV4ZXIgcnVsZSwgYW5kIGdldCB0aGUgY3VycmVudCBpbmRleCBpbiBDaGFyU3RyZWFtICovCisgICAgICAgICAgICBydWxlTmFtZS5pbnZva2UobGV4T2JqLCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgIE1ldGhvZCBydWxlTmFtZTIgPSBsZXhlci5nZXRNZXRob2QoImdldENoYXJJbmRleCIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICBpbnQgY3VycmVudEluZGV4ID0gKEludGVnZXIpIHJ1bGVOYW1lMi5pbnZva2UobGV4T2JqLCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgIGlmICggY3VycmVudEluZGV4IT1pbnB1dC5zaXplKCkgKSB7CisgICAgICAgICAgICAJcHMyLnByaW50KCJleHRyYSB0ZXh0IGZvdW5kLCAnIitpbnB1dC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpbnB1dC5zaXplKCktMSkrIiciKTsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKCBlcnIudG9TdHJpbmcoKS5sZW5ndGgoKT4wICkgeworCQkJCWdVbml0VGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gbmV3IGdVbml0VGVzdFJlc3VsdChmYWxzZSwgZXJyLnRvU3RyaW5nKCksIHRydWUpOworCQkJCXRlc3RSZXN1bHQuc2V0RXJyb3IoZXJyLnRvU3RyaW5nKCkpOworCQkJCXJldHVybiB0ZXN0UmVzdWx0OworCQkJfQorCQkJU3RyaW5nIHN0ZG91dCA9IG51bGw7CisJCQlpZiAoIG91dC50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJc3Rkb3V0ID0gb3V0LnRvU3RyaW5nKCk7CisJCQl9CisJCQlyZXR1cm4gbmV3IGdVbml0VGVzdFJlc3VsdCh0cnVlLCBzdGRvdXQsIHRydWUpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZ2V0VGVzdEV4Y2VwdGlvblJlc3VsdChlKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsJLy8gVGhpcyBleGNlcHRpb24gY291bGQgYmUgY2F1c2VkIGZyb20gQU5UTFIgUnVudGltZSBFeGNlcHRpb24sIGUuZy4gTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uCisgICAgICAgIAlyZXR1cm4gZ2V0VGVzdEV4Y2VwdGlvblJlc3VsdChlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgCXRyeSB7CisgICAgICAgIAkJaWYgKCBwcyE9bnVsbCApIHBzLmNsb3NlKCk7CisgICAgCQkJaWYgKCBwczIhPW51bGwgKSBwczIuY2xvc2UoKTsKKyAgICAJCQlTeXN0ZW0uc2V0T3V0KGNvbnNvbGUpOwkJCS8vIFJlc2V0IHN0YW5kYXJkIG91dHB1dAorICAgIAkJCVN5c3RlbS5zZXRFcnIoY29uc29sZUVycik7CQkvLyBSZXNldCBzdGFuZGFyZCBlcnIgb3V0CisgICAgICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogdmVyaWZ5IHRoaXM6CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIHVucmVhY2hhYmxlPyIpOworCX0KKworCS8vIFRPRE86IHRocm93IHByb3BlciBleGNlcHRpb25zCisJcHJvdGVjdGVkIGdVbml0VGVzdFJlc3VsdCBydW5QYXJzZXIoU3RyaW5nIHBhcnNlck5hbWUsIFN0cmluZyBsZXhlck5hbWUsIFN0cmluZyB0ZXN0UnVsZU5hbWUsIGdVbml0VGVzdElucHV0IHRlc3RJbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNoYXJTdHJlYW0gaW5wdXQ7CisJCUNsYXNzIGxleGVyID0gbnVsbDsKKwkJQ2xhc3MgcGFyc2VyID0gbnVsbDsKKwkJUHJpbnRTdHJlYW0gcHMgPSBudWxsOwkJLy8gZm9yIHJlZGlyZWN0aW5nIHN0ZG91dCBsYXRlcgorCQlQcmludFN0cmVhbSBwczIgPSBudWxsOwkJLy8gZm9yIHJlZGlyZWN0aW5nIHN0ZGVyciBsYXRlcgorCQl0cnkgeworCQkJLyoqIFNldCB1cCBBTlRMUiBpbnB1dCBzdHJlYW0gYmFzZWQgb24gaW5wdXQgc291cmNlLCBmaWxlIG9yIFN0cmluZyAqLworCQkJaW5wdXQgPSBnZXRBTlRMUklucHV0U3RyZWFtKHRlc3RJbnB1dCk7CisKKyAgICAgICAgICAgIC8qKiBVc2UgUmVmbGVjdGlvbiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGxleGVyIGFuZCBwYXJzZXIgKi8KKyAgICAgICAgCWxleGVyID0gY2xhc3NGb3JOYW1lKGxleGVyTmFtZSk7CisgICAgICAgICAgICBDbGFzc1tdIGxleEFyZ1R5cGVzID0gbmV3IENsYXNzW117Q2hhclN0cmVhbS5jbGFzc307CQkJCS8vIGFzc2lnbiB0eXBlIHRvIGxleGVyJ3MgYXJncworICAgICAgICAgICAgQ29uc3RydWN0b3IgbGV4Q29uc3RydWN0b3IgPSBsZXhlci5nZXRDb25zdHJ1Y3RvcihsZXhBcmdUeXBlcyk7CisgICAgICAgICAgICBPYmplY3RbXSBsZXhBcmdzID0gbmV3IE9iamVjdFtde2lucHV0fTsJCQkJCQkJCS8vIGFzc2lnbiB2YWx1ZSB0byBsZXhlcidzIGFyZ3MKKyAgICAgICAgICAgIE9iamVjdCBsZXhPYmogPSBsZXhDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShsZXhBcmdzKTsJCQkJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIGxleGVyCisKKyAgICAgICAgICAgIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbSgoTGV4ZXIpIGxleE9iaik7CisKKyAgICAgICAgICAgIHBhcnNlciA9IGNsYXNzRm9yTmFtZShwYXJzZXJOYW1lKTsKKyAgICAgICAgICAgIENsYXNzW10gcGFyQXJnVHlwZXMgPSBuZXcgQ2xhc3NbXXtUb2tlblN0cmVhbS5jbGFzc307CQkJCS8vIGFzc2lnbiB0eXBlIHRvIHBhcnNlcidzIGFyZ3MKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIHBhckNvbnN0cnVjdG9yID0gcGFyc2VyLmdldENvbnN0cnVjdG9yKHBhckFyZ1R5cGVzKTsKKyAgICAgICAgICAgIE9iamVjdFtdIHBhckFyZ3MgPSBuZXcgT2JqZWN0W117dG9rZW5zfTsJCQkJCQkJLy8gYXNzaWduIHZhbHVlIHRvIHBhcnNlcidzIGFyZ3MKKyAgICAgICAgICAgIE9iamVjdCBwYXJPYmogPSBwYXJDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShwYXJBcmdzKTsJCQkJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIHBhcnNlcgorCisgICAgICAgICAgICAvLyBzZXQgdXAgY3VzdG9taXplZCB0cmVlIGFkYXB0b3IgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoIGdyYW1tYXJJbmZvLmdldEFkYXB0b3IoKSE9bnVsbCApIHsKKyAgICAgICAgICAgIAlwYXJBcmdUeXBlcyA9IG5ldyBDbGFzc1tde1RyZWVBZGFwdG9yLmNsYXNzfTsKKyAgICAgICAgICAgIAlNZXRob2QgX3NldFRyZWVBZGFwdG9yID0gcGFyc2VyLmdldE1ldGhvZCgic2V0VHJlZUFkYXB0b3IiLCBwYXJBcmdUeXBlcyk7CisgICAgICAgICAgICAJQ2xhc3MgX3RyZWVBZGFwdG9yID0gY2xhc3NGb3JOYW1lKGdyYW1tYXJJbmZvLmdldEFkYXB0b3IoKSk7CisgICAgICAgICAgICAJX3NldFRyZWVBZGFwdG9yLmludm9rZShwYXJPYmosIF90cmVlQWRhcHRvci5uZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0aG9kIHJ1bGVOYW1lID0gcGFyc2VyLmdldE1ldGhvZCh0ZXN0UnVsZU5hbWUpOworCisgICAgICAgICAgICAvKiogU3RhcnQgb2YgSS9PIFJlZGlyZWN0aW5nICovCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHBzID0gbmV3IFByaW50U3RyZWFtKG91dCk7CisgICAgICAgICAgICBwczIgPSBuZXcgUHJpbnRTdHJlYW0oZXJyKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQocHMpOworICAgICAgICAgICAgU3lzdGVtLnNldEVycihwczIpOworICAgICAgICAgICAgLyoqIEVuZCBvZiByZWRpcmVjdGluZyAqLworCisgICAgICAgICAgICAvKiogSW52b2tlIGdyYW1tYXIgcnVsZSwgYW5kIHN0b3JlIGlmIHRoZXJlIGlzIGEgcmV0dXJuIHZhbHVlICovCisgICAgICAgICAgICBPYmplY3QgcnVsZVJldHVybiA9IHJ1bGVOYW1lLmludm9rZShwYXJPYmopOworICAgICAgICAgICAgU3RyaW5nIGFzdFN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgc3RTdHJpbmcgPSBudWxsOworICAgICAgICAgICAgLyoqIElmIHJ1bGUgaGFzIHJldHVybiB2YWx1ZSwgZGV0ZXJtaW5lIGlmIGl0IGNvbnRhaW5zIGFuIEFTVCBvciBhIFNUICovCisgICAgICAgICAgICBpZiAoIHJ1bGVSZXR1cm4hPW51bGwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBydWxlUmV0dXJuLmdldENsYXNzKCkudG9TdHJpbmcoKS5pbmRleE9mKHRlc3RSdWxlTmFtZSsiX3JldHVybiIpPjAgKSB7CisgICAgICAgICAgICAgICAgCXRyeSB7CS8vIE51bGxQb2ludGVyRXhjZXB0aW9uIG1heSBoYXBwZW4gaGVyZS4uLgorICAgICAgICAgICAgICAgIAkJQ2xhc3MgX3JldHVybiA9IGNsYXNzRm9yTmFtZShwYXJzZXJOYW1lKyIkIit0ZXN0UnVsZU5hbWUrIl9yZXR1cm4iKTsKKyAgICAgICAgICAgICAgICAJCU1ldGhvZFtdIG1ldGhvZHMgPSBfcmV0dXJuLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgICAgICAgICAgICAgIAkJZm9yKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisJCQkgICAgICAgICAgICAgICAgaWYgKCBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0VHJlZSIpICkgeworCQkJICAgICAgICAgICAgICAgIAlNZXRob2QgcmV0dXJuTmFtZSA9IF9yZXR1cm4uZ2V0TWV0aG9kKCJnZXRUcmVlIik7CisJCSAgICAgICAgICAgICAgICAgICAgCUNvbW1vblRyZWUgdHJlZSA9IChDb21tb25UcmVlKSByZXR1cm5OYW1lLmludm9rZShydWxlUmV0dXJuKTsKKwkJICAgICAgICAgICAgICAgICAgICAJYXN0U3RyaW5nID0gdHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJCSAgICAgICAgICAgICAgICB9CisJCQkgICAgICAgICAgICAgICAgZWxzZSBpZiAoIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXRUZW1wbGF0ZSIpICkgeworCQkJICAgICAgICAgICAgICAgIAlNZXRob2QgcmV0dXJuTmFtZSA9IF9yZXR1cm4uZ2V0TWV0aG9kKCJnZXRUZW1wbGF0ZSIpOworCQkJICAgICAgICAgICAgICAgIAlTdHJpbmdUZW1wbGF0ZSBzdCA9IChTdHJpbmdUZW1wbGF0ZSkgcmV0dXJuTmFtZS5pbnZva2UocnVsZVJldHVybik7CisJCQkgICAgICAgICAgICAgICAgCXN0U3RyaW5nID0gc3QudG9TdHJpbmcoKTsKKwkJCSAgICAgICAgICAgICAgICB9CisJCQkgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAJY2F0Y2goRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsJLy8gTm90ZTogSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMsIHRoZSB0ZXN0IGlzIHZpZXdlZCBhcyBmYWlsZWQuCisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiBJbnZhbGlkIGlucHV0ICovCisgICAgICAgICAgICBpZiAoIHRva2Vucy5pbmRleCgpIT10b2tlbnMuc2l6ZSgpLTEgKSB7CisgICAgICAgICAgICAJLy90aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAJcHMyLnByaW50KCJJbnZhbGlkIGlucHV0Iik7CisgICAgICAgICAgICB9CisKKwkJCWlmICggZXJyLnRvU3RyaW5nKCkubGVuZ3RoKCk+MCApIHsKKwkJCQlnVW5pdFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IG5ldyBnVW5pdFRlc3RSZXN1bHQoZmFsc2UsIGVyci50b1N0cmluZygpKTsKKwkJCQl0ZXN0UmVzdWx0LnNldEVycm9yKGVyci50b1N0cmluZygpKTsKKwkJCQlyZXR1cm4gdGVzdFJlc3VsdDsKKwkJCX0KKwkJCVN0cmluZyBzdGRvdXQgPSBudWxsOworCQkJLy8gVE9ETzogbmVlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hpY2ggaGFzIGJvdGggU1QgcmV0dXJuIHZhbHVlIGFuZCBzdGRvdXQKKwkJCWlmICggb3V0LnRvU3RyaW5nKCkubGVuZ3RoKCk+MCApIHsKKwkJCQlzdGRvdXQgPSBvdXQudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWlmICggYXN0U3RyaW5nIT1udWxsICkgewkvLyBSZXR1cm4gdG9TdHJpbmdUcmVlIG9mIEFTVAorCQkJCXJldHVybiBuZXcgZ1VuaXRUZXN0UmVzdWx0KHRydWUsIHN0ZG91dCwgYXN0U3RyaW5nKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCBzdFN0cmluZyE9bnVsbCApIHsvLyBSZXR1cm4gdG9TdHJpbmcgb2YgU1QKKwkJCQlyZXR1cm4gbmV3IGdVbml0VGVzdFJlc3VsdCh0cnVlLCBzdGRvdXQsIHN0U3RyaW5nKTsKKwkJCX0KKworCQkJaWYgKCBydWxlUmV0dXJuIT1udWxsICkgeworCQkJCS8vIFRPRE86IGN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciBhIHNpbmdsZSByZXR1cm4gd2l0aCBpbnQgb3IgU3RyaW5nIHZhbHVlCisJCQkJcmV0dXJuIG5ldyBnVW5pdFRlc3RSZXN1bHQodHJ1ZSwgc3Rkb3V0LCBTdHJpbmcudmFsdWVPZihydWxlUmV0dXJuKSk7CisJCQl9CisJCQlyZXR1cm4gbmV3IGdVbml0VGVzdFJlc3VsdCh0cnVlLCBzdGRvdXQsIHN0ZG91dCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBnZXRUZXN0RXhjZXB0aW9uUmVzdWx0KGUpOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewkvLyBUaGlzIGV4Y2VwdGlvbiBjb3VsZCBiZSBjYXVzZWQgZnJvbSBBTlRMUiBSdW50aW1lIEV4Y2VwdGlvbiwgZS5nLiBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24KKyAgICAgICAgCXJldHVybiBnZXRUZXN0RXhjZXB0aW9uUmVzdWx0KGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAJdHJ5IHsKKyAgICAgICAgCQlpZiAoIHBzIT1udWxsICkgcHMuY2xvc2UoKTsKKyAgICAJCQlpZiAoIHBzMiE9bnVsbCApIHBzMi5jbG9zZSgpOworICAgIAkJCVN5c3RlbS5zZXRPdXQoY29uc29sZSk7CQkJLy8gUmVzZXQgc3RhbmRhcmQgb3V0cHV0CisgICAgCQkJU3lzdGVtLnNldEVycihjb25zb2xlRXJyKTsJCS8vIFJlc2V0IHN0YW5kYXJkIGVyciBvdXQKKyAgICAgICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgdGhpczoKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgdW5yZWFjaGFibGU/Iik7CisJfQorCisJcHJvdGVjdGVkIGdVbml0VGVzdFJlc3VsdCBydW5UcmVlUGFyc2VyKFN0cmluZyBwYXJzZXJOYW1lLCBTdHJpbmcgbGV4ZXJOYW1lLCBTdHJpbmcgdGVzdFJ1bGVOYW1lLCBTdHJpbmcgdGVzdFRyZWVSdWxlTmFtZSwgZ1VuaXRUZXN0SW5wdXQgdGVzdElucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2hhclN0cmVhbSBpbnB1dDsKKwkJU3RyaW5nIHRyZWVQYXJzZXJQYXRoOworCQlDbGFzcyBsZXhlciA9IG51bGw7CisJCUNsYXNzIHBhcnNlciA9IG51bGw7CisJCUNsYXNzIHRyZWVQYXJzZXIgPSBudWxsOworCQlQcmludFN0cmVhbSBwcyA9IG51bGw7CQkvLyBmb3IgcmVkaXJlY3Rpbmcgc3Rkb3V0IGxhdGVyCisJCVByaW50U3RyZWFtIHBzMiA9IG51bGw7CQkvLyBmb3IgcmVkaXJlY3Rpbmcgc3RkZXJyIGxhdGVyCisJCXRyeSB7CisJCQkvKiogU2V0IHVwIEFOVExSIGlucHV0IHN0cmVhbSBiYXNlZCBvbiBpbnB1dCBzb3VyY2UsIGZpbGUgb3IgU3RyaW5nICovCisJCQlpbnB1dCA9IGdldEFOVExSSW5wdXRTdHJlYW0odGVzdElucHV0KTsKKworCQkJLyoqIFNldCB1cCBhcHByb3ByaWF0ZSBwYXRoIGZvciB0cmVlIHBhcnNlciBpZiB1c2luZyBwYWNrYWdlICovCisJCQlpZiAoIGdyYW1tYXJJbmZvLmdldEdyYW1tYXJQYWNrYWdlKCkhPW51bGwgKSB7CisJCQkJdHJlZVBhcnNlclBhdGggPSBncmFtbWFySW5mby5nZXRHcmFtbWFyUGFja2FnZSgpKyIuIitncmFtbWFySW5mby5nZXRUcmVlR3JhbW1hck5hbWUoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRyZWVQYXJzZXJQYXRoID0gZ3JhbW1hckluZm8uZ2V0VHJlZUdyYW1tYXJOYW1lKCk7CisJCQl9CisKKyAgICAgICAgICAgIC8qKiBVc2UgUmVmbGVjdGlvbiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGxleGVyIGFuZCBwYXJzZXIgKi8KKyAgICAgICAgCWxleGVyID0gY2xhc3NGb3JOYW1lKGxleGVyTmFtZSk7CisgICAgICAgICAgICBDbGFzc1tdIGxleEFyZ1R5cGVzID0gbmV3IENsYXNzW117Q2hhclN0cmVhbS5jbGFzc307CQkJCS8vIGFzc2lnbiB0eXBlIHRvIGxleGVyJ3MgYXJncworICAgICAgICAgICAgQ29uc3RydWN0b3IgbGV4Q29uc3RydWN0b3IgPSBsZXhlci5nZXRDb25zdHJ1Y3RvcihsZXhBcmdUeXBlcyk7CisgICAgICAgICAgICBPYmplY3RbXSBsZXhBcmdzID0gbmV3IE9iamVjdFtde2lucHV0fTsJCQkJCQkJCS8vIGFzc2lnbiB2YWx1ZSB0byBsZXhlcidzIGFyZ3MKKyAgICAgICAgICAgIE9iamVjdCBsZXhPYmogPSBsZXhDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShsZXhBcmdzKTsJCQkJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIGxleGVyCisKKyAgICAgICAgICAgIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbSgoTGV4ZXIpIGxleE9iaik7CisKKyAgICAgICAgICAgIHBhcnNlciA9IGNsYXNzRm9yTmFtZShwYXJzZXJOYW1lKTsKKyAgICAgICAgICAgIENsYXNzW10gcGFyQXJnVHlwZXMgPSBuZXcgQ2xhc3NbXXtUb2tlblN0cmVhbS5jbGFzc307CQkJCS8vIGFzc2lnbiB0eXBlIHRvIHBhcnNlcidzIGFyZ3MKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIHBhckNvbnN0cnVjdG9yID0gcGFyc2VyLmdldENvbnN0cnVjdG9yKHBhckFyZ1R5cGVzKTsKKyAgICAgICAgICAgIE9iamVjdFtdIHBhckFyZ3MgPSBuZXcgT2JqZWN0W117dG9rZW5zfTsJCQkJCQkJLy8gYXNzaWduIHZhbHVlIHRvIHBhcnNlcidzIGFyZ3MKKyAgICAgICAgICAgIE9iamVjdCBwYXJPYmogPSBwYXJDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShwYXJBcmdzKTsJCQkJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIHBhcnNlcgorCisgICAgICAgICAgICAvLyBzZXQgdXAgY3VzdG9taXplZCB0cmVlIGFkYXB0b3IgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBUcmVlQWRhcHRvciBjdXN0b21UcmVlQWRhcHRvciA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGdyYW1tYXJJbmZvLmdldEFkYXB0b3IoKSE9bnVsbCApIHsKKyAgICAgICAgICAgIAlwYXJBcmdUeXBlcyA9IG5ldyBDbGFzc1tde1RyZWVBZGFwdG9yLmNsYXNzfTsKKyAgICAgICAgICAgIAlNZXRob2QgX3NldFRyZWVBZGFwdG9yID0gcGFyc2VyLmdldE1ldGhvZCgic2V0VHJlZUFkYXB0b3IiLCBwYXJBcmdUeXBlcyk7CisgICAgICAgICAgICAJQ2xhc3MgX3RyZWVBZGFwdG9yID0gY2xhc3NGb3JOYW1lKGdyYW1tYXJJbmZvLmdldEFkYXB0b3IoKSk7CisgICAgICAgICAgICAJY3VzdG9tVHJlZUFkYXB0b3IgPSAoVHJlZUFkYXB0b3IpIF90cmVlQWRhcHRvci5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgCV9zZXRUcmVlQWRhcHRvci5pbnZva2UocGFyT2JqLCBjdXN0b21UcmVlQWRhcHRvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldGhvZCBydWxlTmFtZSA9IHBhcnNlci5nZXRNZXRob2QodGVzdFJ1bGVOYW1lKTsKKworICAgICAgICAgICAgLyoqIFN0YXJ0IG9mIEkvTyBSZWRpcmVjdGluZyAqLworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBwcyA9IG5ldyBQcmludFN0cmVhbShvdXQpOworICAgICAgICAgICAgcHMyID0gbmV3IFByaW50U3RyZWFtKGVycik7CisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHBzKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIocHMyKTsKKyAgICAgICAgICAgIC8qKiBFbmQgb2YgcmVkaXJlY3RpbmcgKi8KKworICAgICAgICAgICAgLyoqIEludm9rZSBncmFtbWFyIHJ1bGUsIGFuZCBnZXQgdGhlIHJldHVybiB2YWx1ZSAqLworICAgICAgICAgICAgT2JqZWN0IHJ1bGVSZXR1cm4gPSBydWxlTmFtZS5pbnZva2UocGFyT2JqKTsKKworICAgICAgICAgICAgQ2xhc3MgX3JldHVybiA9IGNsYXNzRm9yTmFtZShwYXJzZXJOYW1lKyIkIit0ZXN0UnVsZU5hbWUrIl9yZXR1cm4iKTsKKyAgICAgICAgCU1ldGhvZCByZXR1cm5OYW1lID0gX3JldHVybi5nZXRNZXRob2QoImdldFRyZWUiKTsKKyAgICAgICAgCUNvbW1vblRyZWUgdHJlZSA9IChDb21tb25UcmVlKSByZXR1cm5OYW1lLmludm9rZShydWxlUmV0dXJuKTsKKworICAgICAgICAJLy8gV2FsayByZXN1bHRpbmcgdHJlZTsgY3JlYXRlIHRyZWUgbm9kZXMgc3RyZWFtIGZpcnN0CisgICAgICAgIAlDb21tb25UcmVlTm9kZVN0cmVhbSBub2RlczsKKyAgICAgICAgCWlmICggY3VzdG9tVHJlZUFkYXB0b3IhPW51bGwgKSB7CisgICAgICAgIAkJbm9kZXMgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oY3VzdG9tVHJlZUFkYXB0b3IsIHRyZWUpOworICAgICAgICAJfQorICAgICAgICAJZWxzZSB7CisgICAgICAgIAkJbm9kZXMgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0odHJlZSk7CisgICAgICAgIAl9CisgICAgICAgIAkvLyBBU1Qgbm9kZXMgaGF2ZSBwYXlsb2FkIHRoYXQgcG9pbnQgaW50byB0b2tlbiBzdHJlYW0KKyAgICAgICAgCW5vZGVzLnNldFRva2VuU3RyZWFtKHRva2Vucyk7CisgICAgICAgIAkvLyBDcmVhdGUgYSB0cmVlIHdhbGtlciBhdHRhY2hlZCB0byB0aGUgbm9kZXMgc3RyZWFtCisgICAgICAgIAl0cmVlUGFyc2VyID0gY2xhc3NGb3JOYW1lKHRyZWVQYXJzZXJQYXRoKTsKKyAgICAgICAgICAgIENsYXNzW10gdHJlZVBhckFyZ1R5cGVzID0gbmV3IENsYXNzW117VHJlZU5vZGVTdHJlYW0uY2xhc3N9OwkJLy8gYXNzaWduIHR5cGUgdG8gdHJlZSBwYXJzZXIncyBhcmdzCisgICAgICAgICAgICBDb25zdHJ1Y3RvciB0cmVlUGFyQ29uc3RydWN0b3IgPSB0cmVlUGFyc2VyLmdldENvbnN0cnVjdG9yKHRyZWVQYXJBcmdUeXBlcyk7CisgICAgICAgICAgICBPYmplY3RbXSB0cmVlUGFyQXJncyA9IG5ldyBPYmplY3RbXXtub2Rlc307CQkJCQkJCS8vIGFzc2lnbiB2YWx1ZSB0byB0cmVlIHBhcnNlcidzIGFyZ3MKKyAgICAgICAgICAgIE9iamVjdCB0cmVlUGFyT2JqID0gdHJlZVBhckNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRyZWVQYXJBcmdzKTsJLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIHRyZWUgcGFyc2VyCisgICAgICAgIAkvLyBJbnZva2UgdGhlIHRyZWUgcnVsZSwgYW5kIHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlcmUgaXMKKyAgICAgICAgICAgIE1ldGhvZCB0cmVlUnVsZU5hbWUgPSB0cmVlUGFyc2VyLmdldE1ldGhvZCh0ZXN0VHJlZVJ1bGVOYW1lKTsKKyAgICAgICAgICAgIE9iamVjdCB0cmVlUnVsZVJldHVybiA9IHRyZWVSdWxlTmFtZS5pbnZva2UodHJlZVBhck9iaik7CisKKyAgICAgICAgICAgIFN0cmluZyBhc3RTdHJpbmcgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHN0U3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIC8qKiBJZiB0cmVlIHJ1bGUgaGFzIHJldHVybiB2YWx1ZSwgZGV0ZXJtaW5lIGlmIGl0IGNvbnRhaW5zIGFuIEFTVCBvciBhIFNUICovCisgICAgICAgICAgICBpZiAoIHRyZWVSdWxlUmV0dXJuIT1udWxsICkgeworICAgICAgICAgICAgICAgIGlmICggdHJlZVJ1bGVSZXR1cm4uZ2V0Q2xhc3MoKS50b1N0cmluZygpLmluZGV4T2YodGVzdFRyZWVSdWxlTmFtZSsiX3JldHVybiIpPjAgKSB7CisgICAgICAgICAgICAgICAgCXRyeSB7CS8vIE51bGxQb2ludGVyRXhjZXB0aW9uIG1heSBoYXBwZW4gaGVyZS4uLgorICAgICAgICAgICAgICAgIAkJQ2xhc3MgX3RyZWVSZXR1cm4gPSBjbGFzc0Zvck5hbWUodHJlZVBhcnNlclBhdGgrIiQiK3Rlc3RUcmVlUnVsZU5hbWUrIl9yZXR1cm4iKTsKKyAgICAgICAgICAgICAgICAJCU1ldGhvZFtdIG1ldGhvZHMgPSBfdHJlZVJldHVybi5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKwkJCSAgICAgICAgICAgIGZvcihNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworCQkJICAgICAgICAgICAgICAgIGlmICggbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFRyZWUiKSApIHsKKwkJCSAgICAgICAgICAgICAgICAJTWV0aG9kIHRyZWVSZXR1cm5OYW1lID0gX3RyZWVSZXR1cm4uZ2V0TWV0aG9kKCJnZXRUcmVlIik7CisJCSAgICAgICAgICAgICAgICAgICAgCUNvbW1vblRyZWUgcmV0dXJuVHJlZSA9IChDb21tb25UcmVlKSB0cmVlUmV0dXJuTmFtZS5pbnZva2UodHJlZVJ1bGVSZXR1cm4pOworCQkgICAgICAgICAgICAgICAgICAgICAgICBhc3RTdHJpbmcgPSByZXR1cm5UcmVlLnRvU3RyaW5nVHJlZSgpOworCQkJICAgICAgICAgICAgICAgIH0KKwkJCSAgICAgICAgICAgICAgICBlbHNlIGlmICggbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFRlbXBsYXRlIikgKSB7CisJCQkgICAgICAgICAgICAgICAgCU1ldGhvZCB0cmVlUmV0dXJuTmFtZSA9IF9yZXR1cm4uZ2V0TWV0aG9kKCJnZXRUZW1wbGF0ZSIpOworCQkJICAgICAgICAgICAgICAgIAlTdHJpbmdUZW1wbGF0ZSBzdCA9IChTdHJpbmdUZW1wbGF0ZSkgdHJlZVJldHVybk5hbWUuaW52b2tlKHRyZWVSdWxlUmV0dXJuKTsKKwkJCSAgICAgICAgICAgICAgICAJc3RTdHJpbmcgPSBzdC50b1N0cmluZygpOworCQkJICAgICAgICAgICAgICAgIH0KKwkJCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIAljYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIAkJU3lzdGVtLmVyci5wcmludGxuKGUpOwkvLyBOb3RlOiBJZiBhbnkgZXhjZXB0aW9uIG9jY3VycywgdGhlIHRlc3QgaXMgdmlld2VkIGFzIGZhaWxlZC4KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIEludmFsaWQgaW5wdXQgKi8KKyAgICAgICAgICAgIGlmICggdG9rZW5zLmluZGV4KCkhPXRva2Vucy5zaXplKCktMSApIHsKKyAgICAgICAgICAgIAkvL3Rocm93IG5ldyBJbnZhbGlkSW5wdXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIAlwczIucHJpbnQoIkludmFsaWQgaW5wdXQiKTsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKCBlcnIudG9TdHJpbmcoKS5sZW5ndGgoKT4wICkgeworCQkJCWdVbml0VGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gbmV3IGdVbml0VGVzdFJlc3VsdChmYWxzZSwgZXJyLnRvU3RyaW5nKCkpOworCQkJCXRlc3RSZXN1bHQuc2V0RXJyb3IoZXJyLnRvU3RyaW5nKCkpOworCQkJCXJldHVybiB0ZXN0UmVzdWx0OworCQkJfQorCisJCQlTdHJpbmcgc3Rkb3V0ID0gbnVsbDsKKwkJCS8vIFRPRE86IG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoaWNoIGhhcyBib3RoIFNUIHJldHVybiB2YWx1ZSBhbmQgc3Rkb3V0CisJCQlpZiAoIG91dC50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJc3Rkb3V0ID0gb3V0LnRvU3RyaW5nKCk7CisJCQl9CisJCQlpZiAoIGFzdFN0cmluZyE9bnVsbCApIHsJLy8gUmV0dXJuIHRvU3RyaW5nVHJlZSBvZiBBU1QKKwkJCQlyZXR1cm4gbmV3IGdVbml0VGVzdFJlc3VsdCh0cnVlLCBzdGRvdXQsIGFzdFN0cmluZyk7CisJCQl9CisJCQllbHNlIGlmICggc3RTdHJpbmchPW51bGwgKSB7Ly8gUmV0dXJuIHRvU3RyaW5nIG9mIFNUCisJCQkJcmV0dXJuIG5ldyBnVW5pdFRlc3RSZXN1bHQodHJ1ZSwgc3Rkb3V0LCBzdFN0cmluZyk7CisJCQl9CisKKwkJCWlmICggdHJlZVJ1bGVSZXR1cm4hPW51bGwgKSB7CisJCQkJLy8gVE9ETzogYWdhaW4sIGN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciBhIHNpbmdsZSByZXR1cm4gd2l0aCBpbnQgb3IgU3RyaW5nIHZhbHVlCisJCQkJcmV0dXJuIG5ldyBnVW5pdFRlc3RSZXN1bHQodHJ1ZSwgc3Rkb3V0LCBTdHJpbmcudmFsdWVPZih0cmVlUnVsZVJldHVybikpOworCQkJfQorCQkJcmV0dXJuIG5ldyBnVW5pdFRlc3RSZXN1bHQodHJ1ZSwgc3Rkb3V0LCBzdGRvdXQpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZ2V0VGVzdEV4Y2VwdGlvblJlc3VsdChlKTsKKwkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7IFN5c3RlbS5leGl0KDEpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsJLy8gbm90ZTogVGhpcyBleGNlcHRpb24gY291bGQgYmUgY2F1c2VkIGZyb20gQU5UTFIgUnVudGltZSBFeGNlcHRpb24uLi4KKyAgICAgICAgCXJldHVybiBnZXRUZXN0RXhjZXB0aW9uUmVzdWx0KGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAJdHJ5IHsKKyAgICAgICAgCQlpZiAoIHBzIT1udWxsICkgcHMuY2xvc2UoKTsKKyAgICAJCQlpZiAoIHBzMiE9bnVsbCApIHBzMi5jbG9zZSgpOworICAgIAkJCVN5c3RlbS5zZXRPdXQoY29uc29sZSk7CQkJLy8gUmVzZXQgc3RhbmRhcmQgb3V0cHV0CisgICAgCQkJU3lzdGVtLnNldEVycihjb25zb2xlRXJyKTsJCS8vIFJlc2V0IHN0YW5kYXJkIGVyciBvdXQKKyAgICAgICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgdGhpczoKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2hvdWxkIG5vdCBiZSByZWFjaGFibGU/Iik7CisJfQorCisJLy8gQ3JlYXRlIEFOVExSIGlucHV0IHN0cmVhbSBiYXNlZCBvbiBpbnB1dCBzb3VyY2UsIGZpbGUgb3IgU3RyaW5nCisJcHJpdmF0ZSBDaGFyU3RyZWFtIGdldEFOVExSSW5wdXRTdHJlYW0oZ1VuaXRUZXN0SW5wdXQgdGVzdElucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDaGFyU3RyZWFtIGlucHV0OworCQlpZiAoIHRlc3RJbnB1dC5pc0ZpbGUpIHsKKwkJCVN0cmluZyBmaWxlUGF0aCA9IHRlc3RJbnB1dC5pbnB1dDsKKwkJCUZpbGUgdGVzdElucHV0RmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKKwkJCS8vIGlmIGlucHV0IHRlc3QgZmlsZSBpcyBub3QgZm91bmQgdW5kZXIgdGhlIGN1cnJlbnQgZGlyLCB0cnkgdG8gbG9vayBmb3IgaXQgZnJvbSBkaXIgd2hlcmUgdGhlIHRlc3RzdWl0ZSBmaWxlIGxvY2F0ZXMKKwkJCWlmICggIXRlc3RJbnB1dEZpbGUuZXhpc3RzKCkgKSB7CisJCQkJdGVzdElucHV0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVzdHN1aXRlRGlyLCBmaWxlUGF0aCk7CisJCQkJaWYgKCB0ZXN0SW5wdXRGaWxlLmV4aXN0cygpICkgZmlsZVBhdGggPSB0ZXN0SW5wdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKwkJCQkvLyBpZiBzdGlsbCBub3QgZm91bmQsIGFsc28gdHJ5IHRvIGxvb2sgZm9yIGl0IHVuZGVyIHRoZSBwYWNrYWdlIGRpcgorCQkJCWVsc2UgaWYgKCBncmFtbWFySW5mby5nZXRHcmFtbWFyUGFja2FnZSgpIT1udWxsICkgeworCQkJCQl0ZXN0SW5wdXRGaWxlID0gbmV3IEZpbGUoIi4iK0ZpbGUuc2VwYXJhdG9yK2dyYW1tYXJJbmZvLmdldEdyYW1tYXJQYWNrYWdlKCkucmVwbGFjZSgiLiIsIEZpbGUuc2VwYXJhdG9yKSwgZmlsZVBhdGgpOworCQkJCQlpZiAoIHRlc3RJbnB1dEZpbGUuZXhpc3RzKCkgKSBmaWxlUGF0aCA9IHRlc3RJbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworCQkJCX0KKwkJCX0KKwkJCWlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShmaWxlUGF0aCk7CisJCX0KKwkJZWxzZSB7CisJCQlpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSh0ZXN0SW5wdXQuaW5wdXQpOworCQl9CisJCXJldHVybiBpbnB1dDsKKwl9CisKKwkvLyBzZXQgdXAgdGhlIGNhdXNlIG9mIGV4Y2VwdGlvbiBvciB0aGUgZXhjZXB0aW9uIG5hbWUgaW50byBhIGdVbml0VGVzdFJlc3VsdCBpbnN0YW5jZQorCXByaXZhdGUgZ1VuaXRUZXN0UmVzdWx0IGdldFRlc3RFeGNlcHRpb25SZXN1bHQoRXhjZXB0aW9uIGUpIHsKKwkJZ1VuaXRUZXN0UmVzdWx0IHRlc3RSZXN1bHQ7CisgICAgCWlmICggZS5nZXRDYXVzZSgpIT1udWxsICkgeworICAgIAkJdGVzdFJlc3VsdCA9IG5ldyBnVW5pdFRlc3RSZXN1bHQoZmFsc2UsIGUuZ2V0Q2F1c2UoKS50b1N0cmluZygpLCB0cnVlKTsKKyAgICAJCXRlc3RSZXN1bHQuc2V0RXJyb3IoZS5nZXRDYXVzZSgpLnRvU3RyaW5nKCkpOworICAgIAl9CisgICAgCWVsc2UgeworICAgIAkJdGVzdFJlc3VsdCA9IG5ldyBnVW5pdFRlc3RSZXN1bHQoZmFsc2UsIGUudG9TdHJpbmcoKSwgdHJ1ZSk7CisgICAgCQl0ZXN0UmVzdWx0LnNldEVycm9yKGUudG9TdHJpbmcoKSk7CisgICAgCX0KKyAgICAJcmV0dXJuIHRlc3RSZXN1bHQ7CisJfQorCisKKyAgICBwdWJsaWMgdm9pZCBvblBhc3MoSVRlc3RDYXNlIHBhc3NUZXN0KSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkZhaWwoSVRlc3RDYXNlIGZhaWxUZXN0KSB7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9nVW5pdFRlc3RJbnB1dC5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L2dVbml0VGVzdElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlODE4OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9nVW5pdFRlc3RJbnB1dC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IExlb24sIEplbi1ZdWFuIFN1CisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdDsKKworLyoqIEEgY2xhc3Mgd2hpY2ggY29udGFpbnMgaW5wdXQgaW5mb3JtYXRpb24gb2YgYW4gaW5kaXZpZHVhbCB0ZXN0dWl0ZSAqLworcHVibGljIGNsYXNzIGdVbml0VGVzdElucHV0IHsKKwlwdWJsaWMgU3RyaW5nIGlucHV0OwkJLy8gYSB0ZXN0IGlucHV0IHN0cmluZyBmb3IgYSB0ZXN0c3VpdGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZpbGU7CSAgICAvLyBpZiB0cnVlLCB0aGUgaW5wdXQgcmVwcmVzZW50cyBhIGZpbGVuYW1lCisJcHVibGljIGludCBsaW5lOwkJCS8vIGxpbmUgbnVtYmVyIGluIHRoZSBzY3JpcHQKKworICAgIHB1YmxpYyBnVW5pdFRlc3RJbnB1dChTdHJpbmcgaW5wdXQsIGJvb2xlYW4gaXNGaWxlLCBpbnQgbGluZSkgeworCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisJCXRoaXMuaXNGaWxlID0gaXNGaWxlOworCQl0aGlzLmxpbmUgPSBsaW5lOworCX0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRFc2NhcGVkKCkgeworICAgICAgICByZXR1cm4gSlVuaXRDb2RlR2VuLmVzY2FwZUZvckphdmEoaW5wdXQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L2dVbml0VGVzdFJlc3VsdC5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L2dVbml0VGVzdFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjYzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRUZXN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3IEtlbm55IE1hY0Rlcm1pZAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQ7CisKK3B1YmxpYyBjbGFzcyBnVW5pdFRlc3RSZXN1bHQgeworCQorCXByaXZhdGUgYm9vbGVhbiBzdWNjZXNzOworCXByaXZhdGUgU3RyaW5nIG91dHB1dDsJCS8vIHN0ZG91dAorCXByaXZhdGUgU3RyaW5nIGVycm9yOwkJLy8gc3RkZXJyCisJcHJpdmF0ZSBTdHJpbmcgcmV0dXJuZWQ7CS8vIEFTVCAodG9TdHJpbmdUcmVlKSBvciBTVCAodG9TdHJpbmcpCisJcHJpdmF0ZSBib29sZWFuIGlzTGV4ZXJUZXN0OworCQorCXB1YmxpYyBnVW5pdFRlc3RSZXN1bHQoYm9vbGVhbiBzdWNjZXNzLCBTdHJpbmcgb3V0cHV0KSB7CisJCXRoaXMuc3VjY2VzcyA9IHN1Y2Nlc3M7CisJCXRoaXMub3V0cHV0ID0gb3V0cHV0OworCX0KKwkKKwlwdWJsaWMgZ1VuaXRUZXN0UmVzdWx0KGJvb2xlYW4gc3VjY2VzcywgU3RyaW5nIG91dHB1dCwgYm9vbGVhbiBpc0xleGVyVGVzdCkgeworCQl0aGlzKHN1Y2Nlc3MsIG91dHB1dCk7CisJCXRoaXMuaXNMZXhlclRlc3QgPSBpc0xleGVyVGVzdDsKKwl9CisJCisJcHVibGljIGdVbml0VGVzdFJlc3VsdChib29sZWFuIHN1Y2Nlc3MsIFN0cmluZyBvdXRwdXQsIFN0cmluZyByZXR1cm5lZCkgeworCQl0aGlzKHN1Y2Nlc3MsIG91dHB1dCk7CisJCXRoaXMucmV0dXJuZWQgPSByZXR1cm5lZDsKKwl9CisJCQorCXB1YmxpYyBib29sZWFuIGlzU3VjY2VzcygpIHsKKwkJcmV0dXJuIHN1Y2Nlc3M7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgeworCQlyZXR1cm4gb3V0cHV0OworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuZWQoKSB7CisJCXJldHVybiByZXR1cm5lZDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNMZXhlclRlc3QoKSB7CisJCXJldHVybiBpc0xleGVyVGVzdDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RXJyb3IoU3RyaW5nIGVycm9yKSB7CisJCXRoaXMuZXJyb3IgPSBlcnJvcjsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRUZXN0U3VpdGUuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9nVW5pdFRlc3RTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmY4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRUZXN0U3VpdGUuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBMZW9uIEplbi1ZdWFuIFN1CisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdDsKKworLyoqIEEgY2xhc3Mgd2hpY2ggd3JhcHMgYWxsIHRlc3RzdWl0ZXMgZm9yIGFuIGluZGl2aWR1YWwgcnVsZSAqLworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBnVW5pdFRlc3RTdWl0ZSB7CisJcHJvdGVjdGVkIFN0cmluZyBydWxlID0gbnVsbDsJCQkvLyBwYWVzZXIgcnVsZSBuYW1lIGZvciB1bml0IHRlc3RpbmcKKwlwcm90ZWN0ZWQgU3RyaW5nIGxleGljYWxSdWxlID0gbnVsbDsJLy8gbGV4aWNhbCBydWxlIG5hbWUKKwlwcm90ZWN0ZWQgU3RyaW5nIHRyZWVSdWxlID0gbnVsbDsJCS8vIG9wdGlvbmFsLCByZXF1aXJlZCBmb3IgdGVzdGluZyB0cmVlIGdyYW1tYXIgcnVsZQorCXByb3RlY3RlZCBib29sZWFuIGlzTGV4aWNhbFJ1bGUgPSBmYWxzZTsKKwkKKwkvKiogQSBtYXAgd2hpY2ggc3RvcmVzIGlucHV0L291dHB1dCBwYWlycyAoaW5kaXZpZHVhbCB0ZXN0c3VpdGVzKS4gCisJICogIEluIG90aGVyIHdvcmRzLCBpdCBtYXBzIGlucHV0IGRhdGEgZm9yIHVuaXQgdGVzdCAoZ1VuaXRUZXN0SW5wdXQgb2JqZWN0KQorCSAqICB0byBhbiBleHBlY3RlZCBvdXRwdXQgKFRva2VuIG9iamVjdCkuCisJICovCisJcHJvdGVjdGVkIE1hcDxnVW5pdFRlc3RJbnB1dCwgQWJzdHJhY3RUZXN0PiB0ZXN0U3VpdGVzID0gbmV3IExpbmtlZEhhc2hNYXA8Z1VuaXRUZXN0SW5wdXQsIEFic3RyYWN0VGVzdD4oKTsKKwkKKwlwdWJsaWMgZ1VuaXRUZXN0U3VpdGUoKSB7CisJfQorCQorCXB1YmxpYyBnVW5pdFRlc3RTdWl0ZShTdHJpbmcgcnVsZSkgeworCQl0aGlzLnJ1bGUgPSBydWxlOworCX0KKwkKKwlwdWJsaWMgZ1VuaXRUZXN0U3VpdGUoU3RyaW5nIHRyZWVSdWxlLCBTdHJpbmcgcnVsZSkgeworCQl0aGlzLnJ1bGUgPSBydWxlOworCQl0aGlzLnRyZWVSdWxlID0gdHJlZVJ1bGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFJ1bGVOYW1lKFN0cmluZyBydWxlTmFtZSkgeyB0aGlzLnJ1bGUgPSBydWxlTmFtZTsgfQorCXB1YmxpYyB2b2lkIHNldExleGljYWxSdWxlTmFtZShTdHJpbmcgbGV4aWNhbFJ1bGUpIHsgdGhpcy5sZXhpY2FsUnVsZSA9IGxleGljYWxSdWxlOyB0aGlzLmlzTGV4aWNhbFJ1bGUgPSB0cnVlOyB9CisJcHVibGljIHZvaWQgc2V0VHJlZVJ1bGVOYW1lKFN0cmluZyB0cmVlUnVsZU5hbWUpIHsgdGhpcy50cmVlUnVsZSA9IHRyZWVSdWxlTmFtZTsgfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0UnVsZU5hbWUoKSB7IHJldHVybiB0aGlzLnJ1bGU7IH0KKwlwdWJsaWMgU3RyaW5nIGdldExleGljYWxSdWxlTmFtZSgpIHsgcmV0dXJuIHRoaXMubGV4aWNhbFJ1bGU7IH0KKwlwdWJsaWMgU3RyaW5nIGdldFRyZWVSdWxlTmFtZSgpIHsgcmV0dXJuIHRoaXMudHJlZVJ1bGU7IH0KKwlwdWJsaWMgYm9vbGVhbiBpc0xleGljYWxSdWxlKCkgeyByZXR1cm4gdGhpcy5pc0xleGljYWxSdWxlOyB9CisJCisJcHVibGljIHZvaWQgYWRkVGVzdENhc2UoZ1VuaXRUZXN0SW5wdXQgaW5wdXQsIEFic3RyYWN0VGVzdCBleHBlY3QpIHsKKwkJaWYgKCBpbnB1dCE9bnVsbCAmJiBleHBlY3QhPW51bGwgKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbW9kaWZpZWQgYnkgc2hhb3RpbmcKKyAgICAgICAgICAgICAqIGlmIHJ1bGUgaXMgbnVsbCwgdXNlIGxleFJ1bGUgbmFtZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvL2V4cGVjdC5zZXRUZXN0ZWRSdWxlTmFtZSh0aGlzLnJ1bGUpOworCQkJZXhwZWN0LnNldFRlc3RlZFJ1bGVOYW1lKHRoaXMucnVsZSA9PW51bGwgPyB0aGlzLmxleGljYWxSdWxlIDogdGhpcy5ydWxlKTsKKwkJCWV4cGVjdC5zZXRUZXN0Q2FzZUluZGV4KHRoaXMudGVzdFN1aXRlcy5zaXplKCkpOworCQkJdGhpcy50ZXN0U3VpdGVzLnB1dChpbnB1dCwgZXhwZWN0KTsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL0Fic3RyYWN0SW5wdXRFZGl0b3IuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL0Fic3RyYWN0SW5wdXRFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGIwNGRkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvQWJzdHJhY3RJbnB1dEVkaXRvci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aTsKKworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsLklUZXN0Q2FzZUlucHV0OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7CisKKy8qKgorICoKKyAqIEBhdXRob3Igc2NhaQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbnB1dEVkaXRvciB7CisKKyAgICBwcm90ZWN0ZWQgSVRlc3RDYXNlSW5wdXQgaW5wdXQ7CisgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVRlc3RDYXNlSW5wdXQgaW5wdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0KKworICAgIHByb3RlY3RlZCBKQ29tcG9uZW50IGNvbXA7CisgICAgcHVibGljIEpDb21wb25lbnQgZ2V0Q29udHJvbCgpIHsgcmV0dXJuIGNvbXA7IH0KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGFkZEFjdGlvbkxpc3RlbmVyKEFjdGlvbkxpc3RlbmVyIGwpIDsKKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvSUNvbnRyb2xsZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL0lDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyNzNkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL0lDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW90aW5nIENhaQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aTsKKworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKKworcHVibGljIGludGVyZmFjZSBJQ29udHJvbGxlciB7CisgICAgcHVibGljIE9iamVjdCBnZXRNb2RlbCgpIDsKKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldFZpZXcoKSA7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9JbWFnZUZhY3RvcnkuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL0ltYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2UyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9JbWFnZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSW1hZ2VJY29uOworCitwdWJsaWMgY2xhc3MgSW1hZ2VGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIEltYWdlRmFjdG9yeSBzaW5nbGV0b24gOworCisgICAgcHVibGljIHN0YXRpYyBJbWFnZUZhY3RvcnkgZ2V0U2luZ2xldG9uKCkgeworICAgICAgICBpZihzaW5nbGV0b24gPT0gbnVsbCkgc2luZ2xldG9uID0gbmV3IEltYWdlRmFjdG9yeSgpOworICAgICAgICByZXR1cm4gc2luZ2xldG9uOworICAgIH0KKworICAgIHByaXZhdGUgSW1hZ2VGYWN0b3J5KCkgeworICAgICAgICBBQ0NFUFQgPSBnZXRJbWFnZSgiYWNjZXB0LnBuZyIpOworICAgICAgICBBREQgPSBnZXRJbWFnZSgiYWRkLnBuZyIpOworICAgICAgICBERUxFVEUgPSBnZXRJbWFnZSgiZGVsZXRlMjQucG5nIik7CisgICAgICAgIFRFWFRGSUxFID0gZ2V0SW1hZ2UoInRleHRmaWxlMjQucG5nIik7CisgICAgICAgIFRFWFRGSUxFMTYgPSBnZXRJbWFnZSgidGV4dGZpbGUxNi5wbmciKTsKKyAgICAgICAgQURERklMRSA9IGdldEltYWdlKCJhZGRmaWxlMjQucG5nIik7CisgICAgICAgIFdJTkRPVzE2ID0gZ2V0SW1hZ2UoIndpbmRvd2IxNi5wbmciKTsKKyAgICAgICAgRkFWMTYgPSBnZXRJbWFnZSgiZmF2YjE2LnBuZyIpOworICAgICAgICBTQVZFID0gZ2V0SW1hZ2UoImZsb3BweTI0LnBuZyIpOworICAgICAgICBPUEVOID0gZ2V0SW1hZ2UoImZvbGRlcjI0LnBuZyIpOworICAgICAgICBFRElUMTYgPSBnZXRJbWFnZSgiZWRpdDE2LnBuZyIpOworICAgICAgICBGSUxFMTYgPSBnZXRJbWFnZSgiZmlsZTE2LnBuZyIpOworICAgICAgICBSVU5fUEFTUyA9IGdldEltYWdlKCJydW5wYXNzLnBuZyIpOworICAgICAgICBSVU5fRkFJTCA9IGdldEltYWdlKCJydW5mYWlsLnBuZyIpOworICAgICAgICBURVNUU1VJVEUgPSBnZXRJbWFnZSgidGVzdHN1aXRlLnBuZyIpOworICAgICAgICBURVNUR1JPVVAgPSBnZXRJbWFnZSgidGVzdGdyb3VwLnBuZyIpOworICAgICAgICBURVNUR1JPVVBYID0gZ2V0SW1hZ2UoInRlc3Rncm91cHgucG5nIik7CisgICAgICAgIE5FWFQgPSBnZXRJbWFnZSgibmV4dDI0LnBuZyIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEltYWdlSWNvbiBnZXRJbWFnZShTdHJpbmcgbmFtZSkgeworICAgICAgICBuYW1lID0gSU1HX0RJUiArIG5hbWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIgPSBJbWFnZUZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlW2luLmF2YWlsYWJsZSgpXTsKKyAgICAgICAgICAgIGluLnJlYWQoZGF0YSk7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUljb24oZGF0YSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGxvYWQgaW1hZ2UgZmlsZTogIiArIG5hbWUpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGxvYWQgaW1hZ2UgZmlsZTogIiArIG5hbWUpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRElSID0gIm9yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy8iOworCisgICAgcHVibGljIEltYWdlSWNvbiBBQ0NFUFQ7CisgICAgcHVibGljIEltYWdlSWNvbiBBREQ7CisgICAgcHVibGljIEltYWdlSWNvbiBERUxFVEU7CisgICAgcHVibGljIEltYWdlSWNvbiBURVhURklMRSA7CisgICAgcHVibGljIEltYWdlSWNvbiBBRERGSUxFOworCisgICAgcHVibGljIEltYWdlSWNvbiBURVhURklMRTE2IDsKKyAgICBwdWJsaWMgSW1hZ2VJY29uIFdJTkRPVzE2OworICAgIHB1YmxpYyBJbWFnZUljb24gRkFWMTY7CisgICAgcHVibGljIEltYWdlSWNvbiBTQVZFIDsKKworICAgIHB1YmxpYyBJbWFnZUljb24gT1BFTiA7CisgICAgcHVibGljIEltYWdlSWNvbiBFRElUMTY7CisgICAgcHVibGljIEltYWdlSWNvbiBGSUxFMTY7CisgICAgcHVibGljIEltYWdlSWNvbiBORVhUOworCisgICAgcHVibGljIEltYWdlSWNvbiBSVU5fUEFTUzsKKyAgICBwdWJsaWMgSW1hZ2VJY29uIFJVTl9GQUlMOworICAgIHB1YmxpYyBJbWFnZUljb24gVEVTVFNVSVRFOworICAgIHB1YmxpYyBJbWFnZUljb24gVEVTVEdST1VQIDsKKyAgICBwdWJsaWMgSW1hZ2VJY29uIFRFU1RHUk9VUFg7CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1J1bGVMaXN0Q29udHJvbGxlci5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvUnVsZUxpc3RDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyNzVhNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1J1bGVMaXN0Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWk7CisKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsLlJ1bGU7CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkuSW1hZ2VGYWN0b3J5OworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOworaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFJ1bGVMaXN0Q29udHJvbGxlciBpbXBsZW1lbnRzIElDb250cm9sbGVyIHsKKworICAgIC8qIFN1Yi1jb250cm9scyAqLworICAgIHByaXZhdGUgZmluYWwgSkxpc3QgbGlzdCA9IG5ldyBKTGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgSlNjcm9sbFBhbmUgc2Nyb2xsID0gbmV3IEpTY3JvbGxQYW5lKCBsaXN0LAorICAgICAgICAgICAgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FMV0FZUywKKyAgICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisKKyAgICAvKiBNb2RlbCAqLworICAgIHByaXZhdGUgTGlzdE1vZGVsIG1vZGVsID0gbnVsbDsKKyAgICBwcml2YXRlIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBudWxsOworCisgICAgcHVibGljIFJ1bGVMaXN0Q29udHJvbGxlcigpIHsKKyAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIHB1YmxpYyBKU2Nyb2xsUGFuZSBnZXRWaWV3KCkgeworICAgICAgICByZXR1cm4gc2Nyb2xsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRUZXN0U3VpdGUoVGVzdFN1aXRlIG5ld1Rlc3RTdWl0ZSkgeworICAgICAgICB0ZXN0U3VpdGUgPSBuZXdUZXN0U3VpdGU7CisgICAgICAgIG1vZGVsID0gbmV3IFJ1bGVMaXN0TW9kZWwoKTsKKyAgICAgICAgbGlzdC5zZXRNb2RlbChtb2RlbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoVGVzdFN1aXRlIHRzKSB7CisgICAgICAgIHNldFRlc3RTdWl0ZSh0cyk7CisgICAgICAgIGlmKG1vZGVsLmdldFNpemUoKSA+IDApIGxpc3Quc2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICAgICAgbGlzdC51cGRhdGVVSSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKworICAgICAgICBzY3JvbGwuc2V0Vmlld3BvcnRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSk7CisgICAgICAgIHNjcm9sbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoCisgICAgICAgICAgICAgICAgQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpLCAiUnVsZXMiKSk7CisgICAgICAgIHNjcm9sbC5zZXRPcGFxdWUoZmFsc2UpOworCisgICAgICAgIGxpc3Quc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgbGlzdC5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfSU5URVJWQUxfU0VMRUNUSU9OKTsKKyAgICAgICAgbGlzdC5zZXRMYXlvdXRPcmllbnRhdGlvbihKTGlzdC5WRVJUSUNBTCk7CisgICAgICAgIGxpc3Quc2V0Q2VsbFJlbmRlcmVyKG5ldyBSdWxlTGlzdEl0ZW1SZW5kZXJlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKKyAgICAgICAgdGhpcy5saXN0LmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgeworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQorCisKKyAgICAvKiBJVEVNIFJFTkRFUkVSICovCisKKyAgICBwcml2YXRlIGNsYXNzIFJ1bGVMaXN0SXRlbVJlbmRlcmVyIGV4dGVuZHMgSkxhYmVsIGltcGxlbWVudHMgTGlzdENlbGxSZW5kZXJlcnsKKworICAgICAgICBwdWJsaWMgUnVsZUxpc3RJdGVtUmVuZGVyZXIoKSB7CisgICAgICAgICAgICB0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig1MCwgMTgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMpIHsKKworICAgICAgICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBSdWxlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUnVsZSBpdGVtID0gKFJ1bGUpIHZhbHVlOworICAgICAgICAgICAgICAgIHNldFRleHQoaXRlbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKGxpc3QuZ2V0Rm9yZWdyb3VuZCgpKTsKKworICAgICAgICAgICAgICAgIHNldEljb24oaXRlbS5nZXROb3RFbXB0eSgpID8gSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLkZBVjE2IDogbnVsbCk7CisKKyAgICAgICAgICAgICAgICBpZihsaXN0LmdldFNlbGVjdGVkVmFsdWUoKSA9PSBpdGVtICkgeworICAgICAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKENvbG9yLkxJR0hUX0dSQVkpOworICAgICAgICAgICAgICAgICAgICBzZXRPcGFxdWUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0KCJFcnJvciEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSdWxlTGlzdE1vZGVsIGltcGxlbWVudHMgTGlzdE1vZGVsIHsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBSdWxlTGlzdE1vZGVsKCkgeworICAgICAgICAgICAgaWYodGVzdFN1aXRlID09IG51bGwpIAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTnVsbCB0ZXN0IHN1aXRlIik7CisgICAgICAgIH0gCisgICAgICAgIAorICAgICAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdFN1aXRlLmdldFJ1bGVDb3VudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdFN1aXRlLmdldFJ1bGUoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3REYXRhTGlzdGVuZXIoTGlzdERhdGFMaXN0ZW5lciBsKSB7fQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1J1bm5lckNvbnRyb2xsZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1J1bm5lckNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q5MGM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvUnVubmVyQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjQwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dEFyZWE7CitpbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVNb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVDZWxsUmVuZGVyZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5JbWFnZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWwuKjsKKworLyoqCisgKgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5uZXJDb250cm9sbGVyIGltcGxlbWVudHMgSUNvbnRyb2xsZXIgeworCisgICAgLyogTU9ERUwgKi8KKyAgICAvL3ByaXZhdGUgVGVzdFN1aXRlIHRlc3RTdWl0ZTsKKworICAgIC8qIFZJRVcgKi8KKyAgICBwcml2YXRlIFJ1bm5lclZpZXcgdmlldyA9IG5ldyBSdW5uZXJWaWV3KCk7CisgICAgcHVibGljIGNsYXNzIFJ1bm5lclZpZXcgZXh0ZW5kcyBKUGFuZWwgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBKVGV4dEFyZWEgdGV4dEFyZWEgPSBuZXcgSlRleHRBcmVhKCk7CisKKyAgICAgICAgcHJpdmF0ZSBKVHJlZSB0cmVlID0gbmV3IEpUcmVlKCk7CisKKyAgICAgICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGwgPSBuZXcgSlNjcm9sbFBhbmUodHJlZSwKKyAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQUxXQVlTLAorICAgICAgICAgICAgICAgIEpTY3JvbGxQYW5lLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisgICAgICAgICAgICAvL3RleHRBcmVhLnNldE9wYXF1ZShmYWxzZSk7CisgICAgICAgICAgICB0cmVlLnNldE9wYXF1ZShmYWxzZSk7CisgICAgICAgICAgICBzY3JvbGwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihDb2xvci5MSUdIVF9HUkFZKSk7CisgICAgICAgICAgICBzY3JvbGwuc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LllfQVhJUykpOworICAgICAgICAgICAgdGhpcy5hZGQoc2Nyb2xsKTsKKyAgICAgICAgICAgIHRoaXMuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSk7CisgICAgICAgICAgICB0aGlzLnNldE9wYXF1ZShmYWxzZSk7CisgICAgICAgIH0KKworICAgIH07CisKKyAgICBwdWJsaWMgUnVubmVyQ29udHJvbGxlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldFZpZXcoKSB7CisgICAgICAgIHJldHVybiB2aWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKyAgICAgICAgdmlldy5pbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIE9uU2hvd1N1aXRlUmVzdWx0KFRlc3RTdWl0ZSBzdWl0ZSkgeworICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgdmlldy50cmVlLnNldE1vZGVsKG5ldyBSdW5uZXJUcmVlTW9kZWwoc3VpdGUpKTsKKyAgICAgICAgdmlldy50cmVlLnNldENlbGxSZW5kZXJlcihuZXcgUnVubmVyVHJlZVJlbmRlcmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIE9uU2hvd1J1bGVSZXN1bHQoUnVsZSBydWxlKSB7CisgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlRlc3RpbmcgcmVzdWx0IGZvciBydWxlOiAiICsgcnVsZS5nZXROYW1lKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOworCisgICAgICAgIGZvcihUZXN0Q2FzZSB0ZXN0Q2FzZTogcnVsZS5nZXRUZXN0Q2FzZXMoKSl7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRlc3RDYXNlLmlzUGFzcygpID8gIlBBU1MiIDogIkZBSUwiKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgIHZpZXcudGV4dEFyZWEuc2V0VGV4dChyZXN1bHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAqLworICAgIH0KKworCisKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RTdWl0ZVRyZWVOb2RlIGV4dGVuZHMgRGVmYXVsdE11dGFibGVUcmVlTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0U3VpdGUgZGF0YSA7CisKKyAgICAgICAgcHVibGljIFRlc3RTdWl0ZVRyZWVOb2RlKFRlc3RTdWl0ZSBzdWl0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VpdGUuZ2V0R3JhbW1hck5hbWUoKSk7CisgICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxzdWl0ZS5nZXRSdWxlQ291bnQoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUnVsZSBydWxlID0gc3VpdGUuZ2V0UnVsZShpKTsKKyAgICAgICAgICAgICAgICBpZihydWxlLmdldE5vdEVtcHR5KCkpIHRoaXMuYWRkKG5ldyBUZXN0R3JvdXBUcmVlTm9kZShydWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gc3VpdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyAoJWQgdGVzdCBncm91cHMpIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRHcmFtbWFyTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENoaWxkQ291bnQoKSk7CisgICAgICAgIH0KKworICAgIH0gOworCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0R3JvdXBUcmVlTm9kZSBleHRlbmRzIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgeworCisgICAgICAgIHByaXZhdGUgUnVsZSBkYXRhOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzRmFpbCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgVGVzdEdyb3VwVHJlZU5vZGUoUnVsZSBydWxlKSB7CisgICAgICAgICAgICBzdXBlcihydWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBmb3IoVGVzdENhc2UgdGM6IHJ1bGUuZ2V0VGVzdENhc2VzKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZChuZXcgVGVzdENhc2VUcmVlTm9kZSh0YykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhID0gcnVsZTsKKyAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIGludCBpUGFzcyA9IDA7CisgICAgICAgICAgICBpbnQgaUZhaWwgPSAwOworICAgICAgICAgICAgZm9yKFRlc3RDYXNlIHRjOiBkYXRhLmdldFRlc3RDYXNlcygpKSB7CisgICAgICAgICAgICAgICAgaWYodGMuaXNQYXNzKCkpCisgICAgICAgICAgICAgICAgICAgICsraVBhc3M7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICArK2lGYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXNGYWlsID0gaUZhaWwgPiAwOworCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgKHBhc3MgJWQsIGZhaWwgJWQpIiwKKyAgICAgICAgICAgICAgICBkYXRhLmdldE5hbWUoKSwgaVBhc3MsIGlGYWlsKTsKKyAgICAgICAgfQorICAgIH0gOworCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q2FzZVRyZWVOb2RlIGV4dGVuZHMgRGVmYXVsdE11dGFibGVUcmVlTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0Q2FzZSBkYXRhOworCisgICAgICAgIHByaXZhdGUgVGVzdENhc2VUcmVlTm9kZShUZXN0Q2FzZSB0YykgeworICAgICAgICAgICAgc3VwZXIodGMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBkYXRhID0gdGM7CisgICAgICAgIH0KKyAgICB9IDsKKworICAgIHByaXZhdGUgY2xhc3MgUnVubmVyVHJlZU1vZGVsIGV4dGVuZHMgRGVmYXVsdFRyZWVNb2RlbCB7CisKKyAgICAgICAgcHVibGljIFJ1bm5lclRyZWVNb2RlbChUZXN0U3VpdGUgdGVzdFN1aXRlKSB7CisgICAgICAgICAgICBzdXBlcihuZXcgVGVzdFN1aXRlVHJlZU5vZGUodGVzdFN1aXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJ1bm5lclRyZWVSZW5kZXJlciBpbXBsZW1lbnRzIFRyZWVDZWxsUmVuZGVyZXIgeworCisgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVHJlZSB0cmVlLCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBleHBhbmRlZCwgYm9vbGVhbiBsZWFmLCBpbnQgcm93LAorICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzRm9jdXMpIHsKKworICAgICAgICAgICAgSkxhYmVsIGxhYmVsID0gbmV3IEpMYWJlbCgpOworCisgICAgICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIFRlc3RTdWl0ZVRyZWVOb2RlKSB7CisKKyAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGxhYmVsLnNldEljb24oSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLlRFU1RTVUlURSk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZih2YWx1ZSBpbnN0YW5jZW9mIFRlc3RHcm91cFRyZWVOb2RlKSB7CisKKyAgICAgICAgICAgICAgICBUZXN0R3JvdXBUcmVlTm9kZSBub2RlID0gKFRlc3RHcm91cFRyZWVOb2RlKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGxhYmVsLnNldEljb24oIG5vZGUuaGFzRmFpbCA/IAorICAgICAgICAgICAgICAgICAgICBJbWFnZUZhY3RvcnkuZ2V0U2luZ2xldG9uKCkuVEVTVEdST1VQWCA6CisgICAgICAgICAgICAgICAgICAgIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5URVNUR1JPVVApOworCisgICAgICAgICAgICB9IGVsc2UgaWYodmFsdWUgaW5zdGFuY2VvZiBUZXN0Q2FzZVRyZWVOb2RlKSB7CisKKyAgICAgICAgICAgICAgICBUZXN0Q2FzZVRyZWVOb2RlIG5vZGUgPSAoVGVzdENhc2VUcmVlTm9kZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgbGFiZWwuc2V0SWNvbiggKG5vZGUuZGF0YS5pc1Bhc3MoKSk/CisgICAgICAgICAgICAgICAgICAgIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5SVU5fUEFTUyA6CisgICAgICAgICAgICAgICAgICAgIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5SVU5fRkFJTCk7CisgICAgICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCh2YWx1ZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZGUgdHJlZSBub2RlIHR5cGUgKyAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1N0YXR1c0JhckNvbnRyb2xsZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1N0YXR1c0JhckNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y0ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvU3RhdHVzQmFyQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQcm9ncmVzc0JhcjsKKworcHVibGljIGNsYXNzIFN0YXR1c0JhckNvbnRyb2xsZXIgaW1wbGVtZW50cyBJQ29udHJvbGxlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKworICAgIHByaXZhdGUgZmluYWwgSkxhYmVsIGxhYmVsVGV4dCA9IG5ldyBKTGFiZWwoIlJlYWR5Iik7CisgICAgcHJpdmF0ZSBmaW5hbCBKTGFiZWwgbGFiZWxSdWxlTmFtZSA9IG5ldyBKTGFiZWwoIiIpOworICAgIHByaXZhdGUgZmluYWwgSlByb2dyZXNzQmFyIHByb2dyZXNzID0gbmV3IEpQcm9ncmVzc0JhcigpOworICAgIAorICAgIHB1YmxpYyBTdGF0dXNCYXJDb250cm9sbGVyKCkgeworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKyAgICAgICAgbGFiZWxUZXh0LnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigzMDAsIDIwKSk7CisgICAgICAgIGxhYmVsVGV4dC5zZXRIb3Jpem9udGFsVGV4dFBvc2l0aW9uKEpMYWJlbC5MRUZUKTsKKyAgICAgICAgcHJvZ3Jlc3Muc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDEwMCwgMTUpKTsKKworICAgICAgICBmaW5hbCBKTGFiZWwgbGFiUnVsZUhpbnQgPSBuZXcgSkxhYmVsKCJSdWxlOiAiKTsKKworICAgICAgICBGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7CisgICAgICAgIGxheW91dC5zZXRBbGlnbm1lbnQoRmxvd0xheW91dC5MRUZUKTsKKyAgICAgICAgcGFuZWwuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIHBhbmVsLmFkZChsYWJlbFRleHQpOworICAgICAgICBwYW5lbC5hZGQocHJvZ3Jlc3MpOworICAgICAgICBwYW5lbC5hZGQobGFiUnVsZUhpbnQpOworICAgICAgICBwYW5lbC5hZGQobGFiZWxSdWxlTmFtZSk7CisgICAgICAgIHBhbmVsLnNldE9wYXF1ZShmYWxzZSk7CisgICAgICAgIHBhbmVsLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICBsYWJlbFRleHQuc2V0VGV4dCh0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSdWxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubGFiZWxSdWxlTmFtZS5zZXRUZXh0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgfQorCisgICAgcHVibGljIEpQYW5lbCBnZXRWaWV3KCkgeworICAgICAgICByZXR1cm4gcGFuZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NJbmRldGVybWluZWQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnByb2dyZXNzLnNldEluZGV0ZXJtaW5hdGUodmFsdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzcyhpbnQgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5wcm9ncmVzcy5zZXRJbmRldGVybWluYXRlKGZhbHNlKTsKKyAgICAgICAgdGhpcy5wcm9ncmVzcy5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1Rlc3RDYXNlRWRpdENvbnRyb2xsZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1Rlc3RDYXNlRWRpdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGNmMGFlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvVGVzdENhc2VFZGl0Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsNjMzIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWk7CisKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbC4qOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLkltYWdlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOworCisvKioKKyAqCisgKiBAYXV0aG9yIHNjYWkKKyAqLworcHVibGljIGNsYXNzIFRlc3RDYXNlRWRpdENvbnRyb2xsZXIgaW1wbGVtZW50cyBJQ29udHJvbGxlciB7CisKKyAgICBwcml2YXRlIEpQYW5lbCB2aWV3ID0gbmV3IEpQYW5lbCgpOworCisgICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGw7CisgICAgcHJpdmF0ZSBKUGFuZWwgcGFuZURldGFpbDsKKyAgICBwcml2YXRlIEFic3RyYWN0RWRpdG9yUGFuZSBwYW5lRGV0YWlsSW5wdXQsIHBhbmVEZXRhaWxPdXRwdXQ7CisgICAgcHJpdmF0ZSBKVG9vbEJhciB0b29sYmFyOworICAgIHByaXZhdGUgSkxpc3QgbGlzdENhc2VzOworICAgIHByaXZhdGUgTGlzdE1vZGVsIGxpc3RNb2RlbCA7CisKKyAgICBwdWJsaWMgQWN0aW9uTGlzdGVuZXIgb25UZXN0Q2FzZU51bWJlckNoYW5nZTsKKworICAgIC8qIEVESVRPUlMgKi8KKyAgICBwcml2YXRlIElucHV0RmlsZUVkaXRvciBlZGl0SW5wdXRGaWxlOworICAgIHByaXZhdGUgSW5wdXRTdHJpbmdFZGl0b3IgZWRpdElucHV0U3RyaW5nOworICAgIHByaXZhdGUgSW5wdXRNdWx0aUVkaXRvciBlZGl0SW5wdXRNdWx0aTsKKyAgICBwcml2YXRlIE91dHB1dFJlc3VsdEVkaXRvciBlZGl0T3V0cHV0UmVzdWx0OworICAgIHByaXZhdGUgT3V0cHV0QXN0RWRpdG9yIGVkaXRPdXRwdXRBU1Q7CisgICAgcHJpdmF0ZSBPdXRwdXRTdGRFZGl0b3IgZWRpdE91dHB1dFN0ZDsKKyAgICBwcml2YXRlIE91dHB1dFJldHVybkVkaXRvciBlZGl0T3V0cHV0UmV0dXJuOworICAgIAorICAgIHByaXZhdGUgSkNvbWJvQm94IGNvbWJvSW5wdXRUeXBlLCBjb21ib091dHB1dFR5cGU7CisKKyAgICAvKiBUWVBFIE5BTUUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fVFlQRV9TVFJJTkcgPSAiU2luZ2xlLWxpbmUgVGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOX1RZUEVfTVVMVEkgPSAiTXVsdGktbGluZSBUZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fVFlQRV9GSUxFID0gIkRpc2sgRmlsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVF9UWVBFX0JPT0wgPSAiT0sgb3IgRmFpbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVF9UWVBFX0FTVCA9ICJBU1QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRfVFlQRV9TVEQgPSAiU3RhbmRhcmQgT3V0cHV0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUX1RZUEVfUkVUID0gIlJldHVybiBWYWx1ZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTl9TQ1JJUFQgPSAiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PVVRfU0NSSVBUID0gIiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBJTlBVVF9UWVBFID0gIHsKKyAgICAgICAgSU5fVFlQRV9TVFJJTkcsIElOX1RZUEVfTVVMVEksIElOX1RZUEVfRklMRQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBPVVRQVVRfVFlQRSA9IHsKKyAgICAgICAgT1VUX1RZUEVfQk9PTCwgT1VUX1RZUEVfQVNULCBPVVRfVFlQRV9TVEQsIE9VVF9UWVBFX1JFVAorICAgIH07CisKKyAgICAvKiBTSVpFICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfQ0FTRV9ERVRBSUxfV0lEVEggPSAzMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfRURJVE9SX1dJRFRIID0gMjgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX0NBU0VfREVUQUlMX0hFSUdIVCA9IDI1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9FRElUT1JfSEVJR0hUID0gMTIwOworCisgICAgLyogTU9ERUwgKi8KKyAgICBwcml2YXRlIFJ1bGUgY3VycmVudFJ1bGUgPSBudWxsOworICAgIHByaXZhdGUgVGVzdENhc2UgY3VycmVudFRlc3RDYXNlID0gbnVsbDsKKworICAgIC8qIEVORCBPRiBNT0RFTCovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBTdHJpbmc+IFR5cGVOYW1lVGFibGU7CisgICAgc3RhdGljIHsKKyAgICAgICAgVHlwZU5hbWVUYWJsZSA9IG5ldyBIYXNoTWFwPENsYXNzLCBTdHJpbmc+ICgpOworICAgICAgICBUeXBlTmFtZVRhYmxlLnB1dChUZXN0Q2FzZUlucHV0U3RyaW5nLmNsYXNzLCBJTl9UWVBFX1NUUklORyk7CisgICAgICAgIFR5cGVOYW1lVGFibGUucHV0KFRlc3RDYXNlSW5wdXRNdWx0aVN0cmluZy5jbGFzcywgSU5fVFlQRV9NVUxUSSk7CisgICAgICAgIFR5cGVOYW1lVGFibGUucHV0KFRlc3RDYXNlSW5wdXRGaWxlLmNsYXNzLCBJTl9UWVBFX0ZJTEUpOworCisgICAgICAgIFR5cGVOYW1lVGFibGUucHV0KFRlc3RDYXNlT3V0cHV0UmVzdWx0LmNsYXNzLCBPVVRfVFlQRV9CT09MKTsKKyAgICAgICAgVHlwZU5hbWVUYWJsZS5wdXQoVGVzdENhc2VPdXRwdXRBU1QuY2xhc3MsIE9VVF9UWVBFX0FTVCk7CisgICAgICAgIFR5cGVOYW1lVGFibGUucHV0KFRlc3RDYXNlT3V0cHV0U3RkT3V0LmNsYXNzLCBPVVRfVFlQRV9TVEQpOworICAgICAgICBUeXBlTmFtZVRhYmxlLnB1dChUZXN0Q2FzZU91dHB1dFJldHVybi5jbGFzcywgT1VUX1RZUEVfUkVUKTsKKyAgICB9CisKKyAgICAvL3ByaXZhdGUgV29ya1NwYWNlVmlldyBvd25lcjsKKworICAgIHB1YmxpYyBUZXN0Q2FzZUVkaXRDb250cm9sbGVyKFdvcmtTcGFjZVZpZXcgd29ya3NwYWNlKSB7CisgICAgICAgIC8vdGhpcy5vd25lciA9IHdvcmtzcGFjZTsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdENhc2VFZGl0Q29udHJvbGxlcigpIHsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBPbkxvYWRSdWxlKFJ1bGUgcnVsZSkgeworICAgICAgICBpZihydWxlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwiKTsKKyAgICAgICAgdGhpcy5jdXJyZW50UnVsZSA9IHJ1bGU7CisgICAgICAgIHRoaXMuY3VycmVudFRlc3RDYXNlID0gbnVsbDsKKyAgICAgICAgdGhpcy5saXN0TW9kZWwgPSBydWxlOworICAgICAgICB0aGlzLmxpc3RDYXNlcy5zZXRNb2RlbCh0aGlzLmxpc3RNb2RlbCk7ICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFRlc3RDYXNlKFRlc3RDYXNlIHRlc3RDYXNlKSB7CisgICAgICAgIGlmKHRlc3RDYXNlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwiKTsKKyAgICAgICAgdGhpcy5saXN0Q2FzZXMuc2V0U2VsZWN0ZWRWYWx1ZSh0ZXN0Q2FzZSwgdHJ1ZSk7CisgICAgICAgIHRoaXMuY3VycmVudFRlc3RDYXNlID0gdGVzdENhc2U7CisgICAgfQorCisgICAgcHVibGljIFJ1bGUgZ2V0Q3VycmVudFJ1bGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRSdWxlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisKKyAgICAgICAgLyogQ0FTRSBMSVNUICovCisgICAgICAgIGxpc3RDYXNlcyA9IG5ldyBKTGlzdCgpOworICAgICAgICBsaXN0Q2FzZXMuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBUZXN0Q2FzZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcigpKTsKKyAgICAgICAgbGlzdENhc2VzLnNldENlbGxSZW5kZXJlcihsaXN0UmVuZGVyZXIpOworICAgICAgICBsaXN0Q2FzZXMuc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgIHNjcm9sbCA9IG5ldyBKU2Nyb2xsUGFuZShsaXN0Q2FzZXMpOworICAgICAgICBzY3JvbGwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKAorICAgICAgICAgICAgICAgIEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSwgIlRlc3QgQ2FzZXMiKSk7CisgICAgICAgIHNjcm9sbC5zZXRPcGFxdWUoZmFsc2UpOworICAgICAgICBzY3JvbGwuc2V0Vmlld3BvcnRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSk7CisKKyAgICAgICAgLyogQ0FTRSBERVRBSUwgKi8KKworICAgICAgICBlZGl0SW5wdXRTdHJpbmcgPSBuZXcgSW5wdXRTdHJpbmdFZGl0b3IoKTsKKyAgICAgICAgZWRpdElucHV0TXVsdGkgPSBuZXcgSW5wdXRNdWx0aUVkaXRvcigpOworICAgICAgICBlZGl0SW5wdXRGaWxlID0gbmV3IElucHV0RmlsZUVkaXRvcigpOworCisgICAgICAgIGVkaXRPdXRwdXRSZXN1bHQgPSBuZXcgT3V0cHV0UmVzdWx0RWRpdG9yKCk7CisgICAgICAgIGVkaXRPdXRwdXRBU1QgPSBuZXcgT3V0cHV0QXN0RWRpdG9yKCk7CisgICAgICAgIGVkaXRPdXRwdXRTdGQgPSBuZXcgT3V0cHV0U3RkRWRpdG9yKCk7CisgICAgICAgIGVkaXRPdXRwdXRSZXR1cm4gPSBuZXcgT3V0cHV0UmV0dXJuRWRpdG9yKCk7CisgICAgICAgIAorICAgICAgICBwYW5lRGV0YWlsID0gbmV3IEpQYW5lbCgpOworICAgICAgICBwYW5lRGV0YWlsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpOworICAgICAgICBwYW5lRGV0YWlsLnNldE9wYXF1ZShmYWxzZSk7CisKKyAgICAgICAgY29tYm9JbnB1dFR5cGUgPSBuZXcgSkNvbWJvQm94KElOUFVUX1RZUEUpOworICAgICAgICBjb21ib0lucHV0VHlwZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBPbklucHV0VGVzdENhc2VUeXBlQ2hhbmdlZChjb21ib0lucHV0VHlwZS5nZXRTZWxlY3RlZEl0ZW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBjb21ib091dHB1dFR5cGUgPSBuZXcgSkNvbWJvQm94KE9VVFBVVF9UWVBFKTsKKyAgICAgICAgY29tYm9PdXRwdXRUeXBlLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIE9uT3V0cHV0VGVzdENhc2VUeXBlQ2hhbmdlZChjb21ib091dHB1dFR5cGUuZ2V0U2VsZWN0ZWRJdGVtKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcGFuZURldGFpbElucHV0ID0gbmV3IElucHV0RWRpdG9yUGFuZShjb21ib0lucHV0VHlwZSk7CisgICAgICAgIHBhbmVEZXRhaWxPdXRwdXQgPSBuZXcgT3V0cHV0RWRpdG9yUGFuZShjb21ib091dHB1dFR5cGUpOworCisgICAgICAgIEJveExheW91dCBsYXlvdXQgPSBuZXcgQm94TGF5b3V0KHBhbmVEZXRhaWwsIEJveExheW91dC5QQUdFX0FYSVMpOworICAgICAgICBwYW5lRGV0YWlsLnNldExheW91dChsYXlvdXQpOworICAgICAgICAKKyAgICAgICAgcGFuZURldGFpbC5hZGQodGhpcy5wYW5lRGV0YWlsSW5wdXQpOworICAgICAgICBwYW5lRGV0YWlsLmFkZCh0aGlzLnBhbmVEZXRhaWxPdXRwdXQpOworCisgICAgICAgIC8qIFRPT0xCQVIgKi8KKyAgICAgICAgdG9vbGJhciA9IG5ldyBKVG9vbEJhcigiRWRpdCBUZXN0Q2FzZXMiLCBKVG9vbEJhci5WRVJUSUNBTCk7CisgICAgICAgIHRvb2xiYXIuc2V0RmxvYXRhYmxlKGZhbHNlKTsKKyAgICAgICAgdG9vbGJhci5hZGQobmV3IEFkZFRlc3RDYXNlQWN0aW9uKCkpOworICAgICAgICB0b29sYmFyLmFkZChuZXcgUmVtb3ZlVGVzdENhc2VBY3Rpb24oKSk7CisKKyAgICAgICAgLyogQ09NUE9TSVRFICovCisgICAgICAgIHZpZXcuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIHZpZXcuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSk7CisgICAgICAgIHZpZXcuc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgdmlldy5hZGQodG9vbGJhciwgQm9yZGVyTGF5b3V0LldFU1QpOworICAgICAgICB2aWV3LmFkZChzY3JvbGwsIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICB2aWV3LmFkZChwYW5lRGV0YWlsLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUlucHV0RWRpdG9yKCkgeworICAgICAgICBKQ29tcG9uZW50IGVkaXRvciA9IG51bGw7CisKKyAgICAgICAgaWYoY3VycmVudFRlc3RDYXNlICE9IG51bGwgKSB7CisgICAgICAgICAgICBJVGVzdENhc2VJbnB1dCBpbnB1dCA9IHRoaXMuY3VycmVudFRlc3RDYXNlLmdldElucHV0KCk7CisgICAgICAgICAgICBpZihpbnB1dCBpbnN0YW5jZW9mIFRlc3RDYXNlSW5wdXRTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVkaXRJbnB1dFN0cmluZy5zZXRUZXh0KGlucHV0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmVkaXRJbnB1dFN0cmluZzsKKyAgICAgICAgICAgICAgICBjb21ib0lucHV0VHlwZS5zZXRTZWxlY3RlZEl0ZW0oSU5fVFlQRV9TVFJJTkcpOworICAgICAgICAgICAgfSBlbHNlIGlmKGlucHV0IGluc3RhbmNlb2YgVGVzdENhc2VJbnB1dE11bHRpU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgdGhpcy5lZGl0SW5wdXRNdWx0aS5zZXRUZXh0KGlucHV0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmVkaXRJbnB1dE11bHRpLmdldFZpZXcoKTsKKyAgICAgICAgICAgICAgICBjb21ib0lucHV0VHlwZS5zZXRTZWxlY3RlZEl0ZW0oSU5fVFlQRV9NVUxUSSk7CisgICAgICAgICAgICB9IGVsc2UgaWYoaW5wdXQgaW5zdGFuY2VvZiBUZXN0Q2FzZUlucHV0RmlsZSkgeworICAgICAgICAgICAgICAgIHRoaXMuZWRpdElucHV0RmlsZS5zZXRUZXh0KGlucHV0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmVkaXRJbnB1dEZpbGU7CisgICAgICAgICAgICAgICAgY29tYm9JbnB1dFR5cGUuc2V0U2VsZWN0ZWRJdGVtKElOX1RZUEVfRklMRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV3JvbmcgdHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwYW5lRGV0YWlsSW5wdXQuc2V0RWRpdG9yKGVkaXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU91dHB1dEVkaXRvcigpIHsKKyAgICAgICAgSkNvbXBvbmVudCBlZGl0b3IgPSBudWxsOworICAgICAgICAKKyAgICAgICAgaWYoY3VycmVudFRlc3RDYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgSVRlc3RDYXNlT3V0cHV0IG91dHB1dCA9IHRoaXMuY3VycmVudFRlc3RDYXNlLmdldE91dHB1dCgpOworCisgICAgICAgICAgICBpZihvdXRwdXQgaW5zdGFuY2VvZiBUZXN0Q2FzZU91dHB1dEFTVCkgeworCisgICAgICAgICAgICAgICAgdGhpcy5lZGl0T3V0cHV0QVNULnNldFRleHQob3V0cHV0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmVkaXRPdXRwdXRBU1QuZ2V0VmlldygpOworICAgICAgICAgICAgICAgIGNvbWJvT3V0cHV0VHlwZS5zZXRTZWxlY3RlZEl0ZW0oT1VUX1RZUEVfQVNUKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmKG91dHB1dCBpbnN0YW5jZW9mIFRlc3RDYXNlT3V0cHV0UmVzdWx0KSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVkaXRPdXRwdXRSZXN1bHQuc2V0VmFsdWUob3V0cHV0LmdldFNjcmlwdCgpKTsKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSB0aGlzLmVkaXRPdXRwdXRSZXN1bHQ7CisgICAgICAgICAgICAgICAgY29tYm9PdXRwdXRUeXBlLnNldFNlbGVjdGVkSXRlbShPVVRfVFlQRV9CT09MKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmKG91dHB1dCBpbnN0YW5jZW9mIFRlc3RDYXNlT3V0cHV0U3RkT3V0KSB7CisKKyAgICAgICAgICAgICAgICB0aGlzLmVkaXRPdXRwdXRTdGQuc2V0VGV4dChvdXRwdXQuZ2V0U2NyaXB0KCkpOworICAgICAgICAgICAgICAgIGVkaXRvciA9IHRoaXMuZWRpdE91dHB1dFN0ZC5nZXRWaWV3KCk7CisgICAgICAgICAgICAgICAgY29tYm9PdXRwdXRUeXBlLnNldFNlbGVjdGVkSXRlbShPVVRfVFlQRV9TVEQpOworCisgICAgICAgICAgICB9IGVsc2UgaWYob3V0cHV0IGluc3RhbmNlb2YgVGVzdENhc2VPdXRwdXRSZXR1cm4pIHsKKworICAgICAgICAgICAgICAgIHRoaXMuZWRpdE91dHB1dFJldHVybi5zZXRUZXh0KG91dHB1dC5nZXRTY3JpcHQoKSk7CisgICAgICAgICAgICAgICAgZWRpdG9yID0gdGhpcy5lZGl0T3V0cHV0UmV0dXJuLmdldFZpZXcoKTsKKyAgICAgICAgICAgICAgICBjb21ib091dHB1dFR5cGUuc2V0U2VsZWN0ZWRJdGVtKE9VVF9UWVBFX1JFVCk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHRoaXMucGFuZURldGFpbE91dHB1dC5zZXRFZGl0b3IoZWRpdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgT25JbnB1dFRlc3RDYXNlVHlwZUNoYW5nZWQoT2JqZWN0IGlucHV0VHlwZVN0cikgeworICAgICAgICBpZih0aGlzLmN1cnJlbnRUZXN0Q2FzZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJVGVzdENhc2VJbnB1dCBpbnB1dCA7CisgICAgICAgICAgICBpZihpbnB1dFR5cGVTdHIgPT0gSU5fVFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBUZXN0Q2FzZUlucHV0U3RyaW5nKERFRkFVTFRfSU5fU0NSSVBUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihpbnB1dFR5cGVTdHIgPT0gSU5fVFlQRV9NVUxUSSkgeworICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IFRlc3RDYXNlSW5wdXRNdWx0aVN0cmluZyhERUZBVUxUX0lOX1NDUklQVCk7CisgICAgICAgICAgICB9IGVsc2UgaWYoaW5wdXRUeXBlU3RyID09IElOX1RZUEVfRklMRSkgeworICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IFRlc3RDYXNlSW5wdXRGaWxlKERFRkFVTFRfSU5fU0NSSVBUKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBUeXBlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGlucHV0LmdldENsYXNzKCkuZXF1YWxzKHRoaXMuY3VycmVudFRlc3RDYXNlLmdldElucHV0KCkuZ2V0Q2xhc3MoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKworICAgICAgICAgICAgdGhpcy5jdXJyZW50VGVzdENhc2Uuc2V0SW5wdXQoaW5wdXQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudXBkYXRlSW5wdXRFZGl0b3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgT25PdXRwdXRUZXN0Q2FzZVR5cGVDaGFuZ2VkKE9iamVjdCBvdXRwdXRUeXBlU3RyKSB7CisgICAgICAgIGlmKHRoaXMuY3VycmVudFRlc3RDYXNlICE9IG51bGwpIHsKKworICAgICAgICAgICAgSVRlc3RDYXNlT3V0cHV0IG91dHB1dCA7CisgICAgICAgICAgICBpZihvdXRwdXRUeXBlU3RyID09IE9VVF9UWVBFX0FTVCkgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBUZXN0Q2FzZU91dHB1dEFTVChERUZBVUxUX09VVF9TQ1JJUFQpOworICAgICAgICAgICAgfSBlbHNlIGlmKG91dHB1dFR5cGVTdHIgPT0gT1VUX1RZUEVfQk9PTCkgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBUZXN0Q2FzZU91dHB1dFJlc3VsdChmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYob3V0cHV0VHlwZVN0ciA9PSBPVVRfVFlQRV9TVEQpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBuZXcgVGVzdENhc2VPdXRwdXRTdGRPdXQoREVGQVVMVF9PVVRfU0NSSVBUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihvdXRwdXRUeXBlU3RyID09IE9VVF9UWVBFX1JFVCkgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBUZXN0Q2FzZU91dHB1dFJldHVybihERUZBVUxUX09VVF9TQ1JJUFQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIFR5cGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYob3V0cHV0LmdldENsYXNzKCkuZXF1YWxzKHRoaXMuY3VycmVudFRlc3RDYXNlLmdldE91dHB1dCgpLmdldENsYXNzKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiA7CisKKyAgICAgICAgICAgIHRoaXMuY3VycmVudFRlc3RDYXNlLnNldE91dHB1dChvdXRwdXQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudXBkYXRlT3V0cHV0RWRpdG9yKCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgT25UZXN0Q2FzZVNlbGVjdGVkKFRlc3RDYXNlIHRlc3RDYXNlKSB7CisgICAgICAgIC8vaWYodGVzdENhc2UgPT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk51bGwgVGVzdENhc2UiKTsKKyAgICAgICAgdGhpcy5jdXJyZW50VGVzdENhc2UgPSB0ZXN0Q2FzZTsKKyAgICAgICAgdXBkYXRlSW5wdXRFZGl0b3IoKTsKKyAgICAgICAgdXBkYXRlT3V0cHV0RWRpdG9yKCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgT25BZGRUZXN0Q2FzZSgpIHsKKyAgICAgICAgaWYoY3VycmVudFJ1bGUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgZmluYWwgVGVzdENhc2UgbmV3Q2FzZSA9IG5ldyBUZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBuZXcgVGVzdENhc2VJbnB1dFN0cmluZygiIiksCisgICAgICAgICAgICAgICAgbmV3IFRlc3RDYXNlT3V0cHV0UmVzdWx0KHRydWUpKTsKKyAgICAgICAgdGhpcy5jdXJyZW50UnVsZS5hZGRUZXN0Q2FzZShuZXdDYXNlKTsKKyAgICAgICAgc2V0Q3VycmVudFRlc3RDYXNlKG5ld0Nhc2UpOworCisgICAgICAgIHRoaXMubGlzdENhc2VzLnNldFNlbGVjdGVkVmFsdWUobmV3Q2FzZSwgdHJ1ZSk7CisgICAgICAgIHRoaXMubGlzdENhc2VzLnVwZGF0ZVVJKCk7CisgICAgICAgIHRoaXMuT25UZXN0Q2FzZVNlbGVjdGVkKG5ld0Nhc2UpOworICAgICAgICB0aGlzLm9uVGVzdENhc2VOdW1iZXJDaGFuZ2UuYWN0aW9uUGVyZm9ybWVkKG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBPblJlbW92ZVRlc3RDYXNlKCkgeworICAgICAgICBpZihjdXJyZW50VGVzdENhc2UgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBjdXJyZW50UnVsZS5yZW1vdmVFbGVtZW50KGN1cnJlbnRUZXN0Q2FzZSk7CisgICAgICAgIGxpc3RDYXNlcy51cGRhdGVVSSgpOworCisgICAgICAgIGZpbmFsIFRlc3RDYXNlIG5leHRBY3RpdmVDYXNlID0gbGlzdENhc2VzLmlzU2VsZWN0aW9uRW1wdHkoKSA/CisgICAgICAgICAgICBudWxsIDogKFRlc3RDYXNlKSBsaXN0Q2FzZXMuZ2V0U2VsZWN0ZWRWYWx1ZSgpIDsKKyAgICAgICAgT25UZXN0Q2FzZVNlbGVjdGVkKG5leHRBY3RpdmVDYXNlKTsKKyAgICAgICAgdGhpcy5vblRlc3RDYXNlTnVtYmVyQ2hhbmdlLmFjdGlvblBlcmZvcm1lZChudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgeworICAgICAgICByZXR1cm4gY3VycmVudFJ1bGU7CisgICAgfQorCisgICAgcHVibGljIENvbXBvbmVudCBnZXRWaWV3KCkgeworICAgICAgICByZXR1cm4gdmlldzsKKyAgICB9CisKKyAgICAvKiBFRElUT1IgQ09OVEFJTkVSICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RFZGl0b3JQYW5lIGV4dGVuZHMgSlBhbmVsIHsKKworICAgICAgICBwcml2YXRlIEpDb21ib0JveCBjb21ibzsKKyAgICAgICAgcHJpdmF0ZSBKQ29tcG9uZW50IGVkaXRvcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgICAgICAgIHByaXZhdGUgSkxhYmVsIHBsYWNlSG9sZGVyID0gbmV3IEpMYWJlbCgpOworCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdEVkaXRvclBhbmUoSkNvbWJvQm94IGNvbWJvQm94LCBTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIHRoaXMuY29tYm8gPSBjb21ib0JveDsKKyAgICAgICAgICAgIHRoaXMuZWRpdG9yID0gcGxhY2VIb2xkZXI7CisgICAgICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgICAgICB0aGlzLmluaXRDb21wb25lbnRzKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisgICAgICAgICAgICBwbGFjZUhvbGRlci5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oCisgICAgICAgICAgICAgICAgICAgIFRFU1RfQ0FTRV9ERVRBSUxfV0lEVEgsIFRFU1RfQ0FTRV9ERVRBSUxfSEVJR0hUKSk7CisgICAgICAgICAgICB0aGlzLnNldExheW91dChuZXcgQm94TGF5b3V0KHRoaXMsIEJveExheW91dC5ZX0FYSVMpKTsKKyAgICAgICAgICAgIHRoaXMuYWRkKGNvbWJvLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgICAgICAgdGhpcy5hZGQoZWRpdG9yLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgICAgIHRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKHRpdGxlKSk7CisgICAgICAgICAgICB0aGlzLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICAgICAgVEVTVF9DQVNFX0RFVEFJTF9XSURUSCwgVEVTVF9DQVNFX0RFVEFJTF9IRUlHSFQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVkaXRvcihKQ29tcG9uZW50IG5ld0VkaXRvcikgeworICAgICAgICAgICAgaWYobmV3RWRpdG9yID09IG51bGwpIG5ld0VkaXRvciA9IHBsYWNlSG9sZGVyOworICAgICAgICAgICAgdGhpcy5yZW1vdmUoZWRpdG9yKTsKKyAgICAgICAgICAgIHRoaXMuYWRkKG5ld0VkaXRvcik7CisgICAgICAgICAgICB0aGlzLmVkaXRvciA9IG5ld0VkaXRvcjsKKyAgICAgICAgICAgIHRoaXMudXBkYXRlVUkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBJbnB1dEVkaXRvclBhbmUgZXh0ZW5kcyBBYnN0cmFjdEVkaXRvclBhbmUgeworICAgICAgICBwdWJsaWMgSW5wdXRFZGl0b3JQYW5lKEpDb21ib0JveCBjb21ib0JveCkgeworICAgICAgICAgICAgc3VwZXIoY29tYm9Cb3gsICJJbnB1dCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE91dHB1dEVkaXRvclBhbmUgZXh0ZW5kcyBBYnN0cmFjdEVkaXRvclBhbmUgeworICAgICAgICBwdWJsaWMgT3V0cHV0RWRpdG9yUGFuZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbWJvQm94LCAiT3V0cHV0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJTlBVVCBFRElUT1JTICovCisKKyAgICBwdWJsaWMgY2xhc3MgSW5wdXRTdHJpbmdFZGl0b3IgZXh0ZW5kcyBKVGV4dEZpZWxkIGltcGxlbWVudHMgQ2FyZXRMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmluZ0VkaXRvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgICAgIHRoaXMuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihDb2xvci5MSUdIVF9HUkFZKSk7CisgICAgICAgICAgICB0aGlzLmFkZENhcmV0TGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYXJldFVwZGF0ZShDYXJldEV2ZW50IGFyZzApIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZS5nZXRJbnB1dCgpLnNldFNjcmlwdChnZXRUZXh0KCkpOworICAgICAgICAgICAgbGlzdENhc2VzLnVwZGF0ZVVJKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgSW5wdXRNdWx0aUVkaXRvciBpbXBsZW1lbnRzIENhcmV0TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIEpUZXh0QXJlYSB0ZXh0QXJlYSA9IG5ldyBKVGV4dEFyZWEoMjAsIDMwKTsKKyAgICAgICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGwgPSBuZXcgSlNjcm9sbFBhbmUodGV4dEFyZWEsCisgICAgICAgICAgICAgICAgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FMV0FZUywKKyAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZS5IT1JJWk9OVEFMX1NDUk9MTEJBUl9BTFdBWVMpOworCisgICAgICAgIHB1YmxpYyBJbnB1dE11bHRpRWRpdG9yKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHNjcm9sbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKENvbG9yLkxJR0hUX0dSQVkpKTsKKyAgICAgICAgICAgIHRleHRBcmVhLmFkZENhcmV0TGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYXJldFVwZGF0ZShDYXJldEV2ZW50IGFyZzApIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZS5nZXRJbnB1dCgpLnNldFNjcmlwdChnZXRUZXh0KCkpOworICAgICAgICAgICAgbGlzdENhc2VzLnVwZGF0ZVVJKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dEFyZWEuZ2V0VGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgdGV4dEFyZWEuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKQ29tcG9uZW50IGdldFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gc2Nyb2xsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIElucHV0RmlsZUVkaXRvciBleHRlbmRzIElucHV0U3RyaW5nRWRpdG9yIHt9OworCisgICAgcHVibGljIGNsYXNzIE91dHB1dFJlc3VsdEVkaXRvciBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgSlRvZ2dsZUJ1dHRvbiB0YkZhaWwsIHRiT2s7CisKKyAgICAgICAgcHVibGljIE91dHB1dFJlc3VsdEVkaXRvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgICAgIHRiRmFpbCA9IG5ldyBKVG9nZ2xlQnV0dG9uKCJGYWlsIik7CisgICAgICAgICAgICB0Yk9rID0gbmV3IEpUb2dnbGVCdXR0b24oIk9LIik7CisgICAgICAgICAgICBCdXR0b25Hcm91cCBncm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOworICAgICAgICAgICAgZ3JvdXAuYWRkKHRiRmFpbCk7CisgICAgICAgICAgICBncm91cC5hZGQodGJPayk7CisKKyAgICAgICAgICAgIHRoaXMuYWRkKHRiRmFpbCk7CisgICAgICAgICAgICB0aGlzLmFkZCh0Yk9rKTsKKworICAgICAgICAgICAgdGhpcy50YkZhaWwuYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB0aGlzLnRiT2suYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IERpbWVuc2lvbihURVNUX0VESVRPUl9XSURUSCwgMTAwKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgVGVzdENhc2VPdXRwdXRSZXN1bHQgb3V0cHV0ID0KKyAgICAgICAgICAgICAgICAgICAgKFRlc3RDYXNlT3V0cHV0UmVzdWx0KSBjdXJyZW50VGVzdENhc2UuZ2V0T3V0cHV0KCk7CisKKyAgICAgICAgICAgIGlmKGUuZ2V0U291cmNlKCkgPT0gdGJGYWlsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldFNjcmlwdChmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dC5zZXRTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3RDYXNlcy51cGRhdGVVSSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpZihUZXN0Q2FzZU91dHB1dFJlc3VsdC5PSy5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgdGhpcy50Yk9rLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRiRmFpbC5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKworICAgIHB1YmxpYyBjbGFzcyBPdXRwdXRBc3RFZGl0b3IgaW1wbGVtZW50cyBDYXJldExpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBKVGV4dEFyZWEgdGV4dEFyZWEgPSBuZXcgSlRleHRBcmVhKDIwLCAzMCk7CisgICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgc2Nyb2xsID0gbmV3IEpTY3JvbGxQYW5lKHRleHRBcmVhLAorICAgICAgICAgICAgICAgIEpTY3JvbGxQYW5lLlZFUlRJQ0FMX1NDUk9MTEJBUl9BTFdBWVMsCisgICAgICAgICAgICAgICAgSlNjcm9sbFBhbmUuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQUxXQVlTKTsKKworICAgICAgICBwdWJsaWMgT3V0cHV0QXN0RWRpdG9yKCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHNjcm9sbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKENvbG9yLkxJR0hUX0dSQVkpKTsKKyAgICAgICAgICAgIHRleHRBcmVhLmFkZENhcmV0TGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYXJldFVwZGF0ZShDYXJldEV2ZW50IGFyZzApIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZS5nZXRPdXRwdXQoKS5zZXRTY3JpcHQoZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIGxpc3RDYXNlcy51cGRhdGVVSSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgdGhpcy50ZXh0QXJlYS5zZXRUZXh0KHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dEFyZWEuZ2V0VGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpTY3JvbGxQYW5lIGdldFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBjbGFzcyBPdXRwdXRTdGRFZGl0b3IgZXh0ZW5kcyBPdXRwdXRBc3RFZGl0b3Ige30KKyAgICBwdWJsaWMgY2xhc3MgT3V0cHV0UmV0dXJuRWRpdG9yIGV4dGVuZHMgT3V0cHV0QXN0RWRpdG9yIHt9CisKKyAgICAvKiBFVkVOVCBIQU5ETEVSUyAqLworCisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q2FzZUxpc3RTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RTZWxlY3Rpb25MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKGUuZ2V0VmFsdWVJc0FkanVzdGluZygpKSByZXR1cm47CisgICAgICAgICAgICBmaW5hbCBKTGlzdCBsaXN0ID0gKEpMaXN0KSBlLmdldFNvdXJjZSgpOworICAgICAgICAgICAgZmluYWwgVGVzdENhc2UgdmFsdWUgPSAoVGVzdENhc2UpIGxpc3QuZ2V0U2VsZWN0ZWRWYWx1ZSgpOworICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkgT25UZXN0Q2FzZVNlbGVjdGVkKHZhbHVlKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiBBQ1RJT05TICovCisKKyAgICBwcml2YXRlIGNsYXNzIEFkZFRlc3RDYXNlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geworICAgICAgICBwdWJsaWMgQWRkVGVzdENhc2VBY3Rpb24oKSB7CisgICAgICAgICAgICBzdXBlcigiQWRkIiwgSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLkFERCk7CisgICAgICAgICAgICBwdXRWYWx1ZShTSE9SVF9ERVNDUklQVElPTiwgIkFkZCBhIGdVbml0IHRlc3QgY2FzZS4iKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgT25BZGRUZXN0Q2FzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdmVUZXN0Q2FzZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKKyAgICAgICAgcHVibGljIFJlbW92ZVRlc3RDYXNlQWN0aW9uKCkgeworICAgICAgICAgICAgc3VwZXIoIlJlbW92ZSIsIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5ERUxFVEUpOworICAgICAgICAgICAgcHV0VmFsdWUoU0hPUlRfREVTQ1JJUFRJT04sICJSZW1vdmUgYSBnVW5pdCB0ZXN0IGNhc2UuIik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgIE9uUmVtb3ZlVGVzdENhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENFTEwgUkVOREVSRVJTICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBUZXN0Q2FzZUxpc3RSZW5kZXJlciBsaXN0UmVuZGVyZXIKKyAgICAgICAgICAgID0gbmV3IFRlc3RDYXNlTGlzdFJlbmRlcmVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Q2FzZUxpc3RSZW5kZXJlciBpbXBsZW1lbnRzIExpc3RDZWxsUmVuZGVyZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIEZvbnQgSU5fRk9OVCA9IG5ldyBGb250KCJtb25vIiwgRm9udC5QTEFJTiwgMTIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBGb250IE9VVF9GT05UID0gbmV3IEZvbnQoImRlZmF1bHQiLCBGb250LkJPTEQsIDEyKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFtcChTdHJpbmcgdGV4dCwgaW50IGxlbikgeworICAgICAgICAgICAgaWYodGV4dC5sZW5ndGgoKSA+IGxlbikgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBsZW4gLSAzKS5jb25jYXQoIi4uLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYW1wQXROZXdMaW5lKFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICBpbnQgcG9zID0gdGV4dC5pbmRleE9mKCdcbicpOworICAgICAgICAgICAgaWYocG9zID49IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgcG9zKS5jb25jYXQoIi4uLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMpIHsKKworICAgICAgICAgICAgZmluYWwgSlBhbmVsIHBhbmUgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlc3RDYXNlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGVzdENhc2UgaXRlbSA9IChUZXN0Q2FzZSkgdmFsdWU7CisKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgY29tcG9uZW50cworICAgICAgICAgICAgICAgIGZpbmFsIEpMYWJlbCBsYWJJbiA9IG5ldyBKTGFiZWwoCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFtcChjbGFtcEF0TmV3TGluZShpdGVtLmdldElucHV0KCkuZ2V0U2NyaXB0KCkpLCAxOCkpOworICAgICAgICAgICAgICAgIGZpbmFsIEpMYWJlbCBsYWJPdXQgPSBuZXcgSkxhYmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAoY2xhbXBBdE5ld0xpbmUoaXRlbS5nZXRPdXRwdXQoKS5nZXRTY3JpcHQoKSksIDE4KSk7CisgICAgICAgICAgICAgICAgbGFiT3V0LnNldEZvbnQoT1VUX0ZPTlQpOworICAgICAgICAgICAgICAgIGxhYkluLnNldEZvbnQoSU5fRk9OVCk7CisKKyAgICAgICAgICAgICAgICBsYWJJbi5zZXRJY29uKGl0ZW0uZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFRlc3RDYXNlSW5wdXRGaWxlID8KKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLkZJTEUxNiA6CisgICAgICAgICAgICAgICAgICAgIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5FRElUMTYpOworCisgICAgICAgICAgICAgICAgcGFuZS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSk7CisgICAgICAgICAgICAgICAgcGFuZS5zZXRMYXlvdXQobmV3IEJveExheW91dChwYW5lLCBCb3hMYXlvdXQuWV9BWElTKSk7CisgICAgICAgICAgICAgICAgcGFuZS5hZGQobGFiSW4pOworICAgICAgICAgICAgICAgIHBhbmUuYWRkKGxhYk91dCk7CisgICAgICAgICAgICAgICAgcGFuZS5zZXRCYWNrZ3JvdW5kKGlzU2VsZWN0ZWQgPyBDb2xvci5MSUdIVF9HUkFZIDogQ29sb3IuV0hJVEUpOworICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgcmV0dXJuIHBhbmU7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1Rvb2wuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1Rvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWEyNzkxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvVG9vbC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOworaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKKworcHVibGljIGNsYXNzIFRvb2wgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZihhcmdzLmxlbmd0aCA9PSAxICYmICItdmVyc2lvbiIuZXF1YWxzKGFyZ3NbMF0pKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdVbml0RWRpdG9yIFN3aW5nIEdVSVxuYnkgU2hhb3RpbmcgQ2FpXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNob3dVSSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93VUkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFdvcmtTcGFjZUNvbnRyb2xsZXIgY29udHJvbCA9IG5ldyBXb3JrU3BhY2VDb250cm9sbGVyKCk7CisgICAgICAgICAgICAgICAgY29udHJvbC5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1dvcmtTcGFjZUNvbnRyb2xsZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1dvcmtTcGFjZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVhZTIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvV29ya1NwYWNlQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWk7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkucnVubmVyLmdVbml0QWRhcHRlcjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWwuKjsKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5JbWFnZUZhY3Rvcnk7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOworaW1wb3J0IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXI7CisKKy8qKgorICoKKyAqIEBhdXRob3Igc2NhaQorICovCitwdWJsaWMgY2xhc3MgV29ya1NwYWNlQ29udHJvbGxlciBpbXBsZW1lbnRzIElDb250cm9sbGVyeworCisgICAgLyogTU9ERUwgKi8KKyAgICBwcml2YXRlIFRlc3RTdWl0ZSBjdXJyZW50VGVzdFN1aXRlOworICAgIHByaXZhdGUgU3RyaW5nIHRlc3RTdWl0ZUZpbGVOYW1lID0gbnVsbDsgICAgLy8gcGF0aCArIGZpbGUKKworICAgIC8qIFZJRVcgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTcGFjZVZpZXcgdmlldyA9IG5ldyBXb3JrU3BhY2VWaWV3KCk7CisKKyAgICAvKiBTVUItQ09OVFJPTCAqLworICAgIHByaXZhdGUgZmluYWwgUnVubmVyQ29udHJvbGxlciBydW5uZXIgPSBuZXcgUnVubmVyQ29udHJvbGxlcigpOworCisgICAgcHVibGljIFdvcmtTcGFjZUNvbnRyb2xsZXIoKSB7CisgICAgICAgIHZpZXcucmVzdWx0UGFuZSA9IChKUGFuZWwpIHJ1bm5lci5nZXRWaWV3KCk7CisgICAgICAgIHZpZXcuaW5pdENvbXBvbmVudHMoKTsKKyAgICAgICAgdGhpcy5pbml0RXZlbnRIYW5kbGVycygpOworICAgICAgICB0aGlzLmluaXRUb29sYmFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgdGhpcy52aWV3LnNldFRpdGxlKCJnVW5pdEVkaXRvciIpOworICAgICAgICB0aGlzLnZpZXcuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgdGhpcy52aWV3LnBhY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcG9uZW50IGdldEVtYmVkZGVkVmlldygpIHsKKyAgICAgICAgcmV0dXJuIHZpZXcucGFuZUVkaXRvci5nZXRWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRFdmVudEhhbmRsZXJzKCkgeworICAgICAgICB0aGlzLnZpZXcudGFiRWRpdG9ycy5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGFiQ2hhbmdlTGlzdGVuZXIoKSk7CisgICAgICAgIHRoaXMudmlldy5saXN0UnVsZXMuc2V0TGlzdFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBSdWxlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkpOworICAgICAgICB0aGlzLnZpZXcucGFuZUVkaXRvci5vblRlc3RDYXNlTnVtYmVyQ2hhbmdlID0gbmV3IEFjdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICB2aWV3Lmxpc3RSdWxlcy5nZXRWaWV3KCkudXBkYXRlVUkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgT25DcmVhdGVUZXN0KCkgeworICAgICAgICBKRmlsZUNob29zZXIgamZjID0gbmV3IEpGaWxlQ2hvb3NlcigpOworICAgICAgICBqZmMuc2V0RGlhbG9nVGl0bGUoIkNyZWF0ZSB0ZXN0IHN1aXRlIGZyb20gZ3JhbW1hciIpOworICAgICAgICBqZmMuc2V0RGlhbG9nVHlwZShKRmlsZUNob29zZXIuT1BFTl9ESUFMT0cpOworICAgICAgICBqZmMuc2V0RmlsZUZpbHRlcihuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgIHJldHVybiBmLmlzRGlyZWN0b3J5KCkgfHwgZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChUZXN0U3VpdGVGYWN0b3J5LkdSQU1NQVJfRVhUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiQU5UTFIgZ3JhbW1hciBmaWxlICgqLmcpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7ICAgICAgICAKKyAgICAgICAgaWYoIGpmYy5zaG93T3BlbkRpYWxvZyh2aWV3KSAhPSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04gKSByZXR1cm47CisKKyAgICAgICAgdmlldy5wYW5lU3RhdHVzLnNldFByb2dyZXNzSW5kZXRlcm1pbmVkKHRydWUpOworICAgICAgICBmaW5hbCBGaWxlIGdyYW1tYXJGaWxlID0gamZjLmdldFNlbGVjdGVkRmlsZSgpOworCisgICAgICAgIGN1cnJlbnRUZXN0U3VpdGUgPSBUZXN0U3VpdGVGYWN0b3J5LmNyZWF0ZVRlc3RTdWl0ZShncmFtbWFyRmlsZSk7CisKKyAgICAgICAgdmlldy5saXN0UnVsZXMuaW5pdGlhbGl6ZShjdXJyZW50VGVzdFN1aXRlKTsKKyAgICAgICAgdmlldy50YWJFZGl0b3JzLnNldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgICAgIHZpZXcucGFuZVN0YXR1cy5zZXRUZXh0KCJHcmFtbWFyOiAiICsgY3VycmVudFRlc3RTdWl0ZS5nZXRHcmFtbWFyTmFtZSgpKTsKKyAgICAgICAgdmlldy5wYW5lU3RhdHVzLnNldFByb2dyZXNzSW5kZXRlcm1pbmVkKGZhbHNlKTsKKworICAgICAgICB0ZXN0U3VpdGVGaWxlTmFtZSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIE9uU2F2ZVRlc3QoKSB7CisgICAgICAgIFRlc3RTdWl0ZUZhY3Rvcnkuc2F2ZVRlc3RTdWl0ZShjdXJyZW50VGVzdFN1aXRlKTsKKyAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codmlldywgIlRlc3RzdWl0ZSBzYXZlZCB0bzpcbiIgKyBjdXJyZW50VGVzdFN1aXRlLmdldFRlc3RTdWl0ZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIE9uT3BlblRlc3QoKSAgeworCisgICAgICAgIEpGaWxlQ2hvb3NlciBqZmMgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisgICAgICAgIGpmYy5zZXREaWFsb2dUaXRsZSgiT3BlbiBleGlzdGluZyBnVW5pdCB0ZXN0IHN1aXRlIik7CisgICAgICAgIGpmYy5zZXREaWFsb2dUeXBlKEpGaWxlQ2hvb3Nlci5PUEVOX0RJQUxPRyk7CisgICAgICAgIGpmYy5zZXRGaWxlRmlsdGVyKG5ldyBGaWxlRmlsdGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZi5pc0RpcmVjdG9yeSgpIHx8IGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoVGVzdFN1aXRlRmFjdG9yeS5URVNUX1NVSVRFX0VYVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkFOVExSIHVuaXQgdGVzdCBmaWxlICgqLmd1bml0KSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBpZiggamZjLnNob3dPcGVuRGlhbG9nKHZpZXcpICE9IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTiApIHJldHVybjsKKworICAgICAgICBmaW5hbCBGaWxlIHRlc3RTdWl0ZUZpbGUgPSBqZmMuZ2V0U2VsZWN0ZWRGaWxlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0U3VpdGVGaWxlTmFtZSA9IHRlc3RTdWl0ZUZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpZXcucGFuZVN0YXR1cy5zZXRQcm9ncmVzc0luZGV0ZXJtaW5lZCh0cnVlKTsKKworICAgICAgICBjdXJyZW50VGVzdFN1aXRlID0gVGVzdFN1aXRlRmFjdG9yeS5sb2FkVGVzdFN1aXRlKHRlc3RTdWl0ZUZpbGUpOworICAgICAgICB2aWV3Lmxpc3RSdWxlcy5pbml0aWFsaXplKGN1cnJlbnRUZXN0U3VpdGUpOworICAgICAgICB2aWV3LnBhbmVTdGF0dXMuc2V0VGV4dChjdXJyZW50VGVzdFN1aXRlLmdldEdyYW1tYXJOYW1lKCkpOworICAgICAgICB2aWV3LnRhYkVkaXRvcnMuc2V0U2VsZWN0ZWRJbmRleCgwKTsKKworICAgICAgICB2aWV3LnBhbmVTdGF0dXMuc2V0UHJvZ3Jlc3NJbmRldGVybWluZWQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBPblNlbGVjdFJ1bGUoUnVsZSBydWxlKSB7CisgICAgICAgIGlmKHJ1bGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCIpOworICAgICAgICB0aGlzLnZpZXcucGFuZUVkaXRvci5PbkxvYWRSdWxlKHJ1bGUpOworICAgICAgICB0aGlzLnZpZXcucGFuZVN0YXR1cy5zZXRSdWxlKHJ1bGUuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBydW4gcmVzdWx0CisgICAgICAgIHRoaXMucnVubmVyLk9uU2hvd1J1bGVSZXN1bHQocnVsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIE9uU2VsZWN0VGV4dFBhbmUoKSB7CisgICAgICAgIFRocmVhZCB3b3JrZXIgPSBuZXcgVGhyZWFkICgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHZpZXcucGFuZVN0YXR1cy5zZXRQcm9ncmVzc0luZGV0ZXJtaW5lZCh0cnVlKTsKKyAgICAgICAgICAgICAgICB2aWV3LnR4dEVkaXRvci5zZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGVGYWN0b3J5LmdldFNjcmlwdChjdXJyZW50VGVzdFN1aXRlKSk7CisgICAgICAgICAgICAgICAgdmlldy5wYW5lU3RhdHVzLnNldFByb2dyZXNzSW5kZXRlcm1pbmVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB3b3JrZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgT25SdW5UZXN0KCkgeworICAgICAgICAvLyBzYXZlIGJlZm9yZSBydW4KKyAgICAgICAgVGVzdFN1aXRlRmFjdG9yeS5zYXZlVGVzdFN1aXRlKGN1cnJlbnRUZXN0U3VpdGUpOworCisgICAgICAgIC8vIHJ1bgorICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgZ1VuaXRBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgZ1VuaXRBZGFwdGVyKGN1cnJlbnRUZXN0U3VpdGUpOworICAgICAgICAgICAgaWYoY3VycmVudFRlc3RTdWl0ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICBhZGFwdGVyLnJ1bigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBydW5uZXIuT25TaG93U3VpdGVSZXN1bHQoY3VycmVudFRlc3RTdWl0ZSk7CisgICAgICAgICAgICB2aWV3LnRhYkVkaXRvcnMuYWRkVGFiKCJUZXN0IFJlc3VsdCIsIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5GSUxFMTYsIHJ1bm5lci5nZXRWaWV3KCkpOworICAgICAgICAgICAgdmlldy50YWJFZGl0b3JzLnNldFNlbGVjdGVkQ29tcG9uZW50KHJ1bm5lci5nZXRWaWV3KCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHZpZXcsICJGYWlsIHRvIHJ1biB0ZXN0OlxuIiArIGV4LmdldE1lc3NhZ2UoKSwgIkVycm9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisgICAgICAgIH0gCisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRvb2xiYXIoKSB7CisgICAgICAgIHZpZXcudG9vbGJhci5hZGQobmV3IEpCdXR0b24obmV3IENyZWF0ZUFjdGlvbigpKSk7CisgICAgICAgIHZpZXcudG9vbGJhci5hZGQobmV3IEpCdXR0b24obmV3IE9wZW5BY3Rpb24oKSkpOworICAgICAgICB2aWV3LnRvb2xiYXIuYWRkKG5ldyBKQnV0dG9uKG5ldyBTYXZlQWN0aW9uKCkpKTsKKyAgICAgICAgdmlldy50b29sYmFyLmFkZChuZXcgSkJ1dHRvbihuZXcgUnVuQWN0aW9uKCkpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgfQorCisgICAgcHVibGljIENvbXBvbmVudCBnZXRWaWV3KCkgeworICAgICAgICByZXR1cm4gdmlldzsKKyAgICB9CisKKworICAgIC8qKiBFdmVudCBoYW5kbGVyIGZvciBydWxlIGxpc3Qgc2VsZWN0aW9uLiAqLworICAgIHByaXZhdGUgY2xhc3MgUnVsZUxpc3RTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RTZWxlY3Rpb25MaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmKGV2ZW50LmdldFZhbHVlSXNBZGp1c3RpbmcoKSkgcmV0dXJuOworICAgICAgICAgICAgZmluYWwgSkxpc3QgbGlzdCA9IChKTGlzdCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgICAgICBmaW5hbCBSdWxlIHJ1bGUgPSAoUnVsZSkgbGlzdC5nZXRTZWxlY3RlZFZhbHVlKCk7CisgICAgICAgICAgICBpZihydWxlICE9IG51bGwpIE9uU2VsZWN0UnVsZShydWxlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqIEV2ZW50IGhhbmRsZXIgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIGVkaXRvciB2aWV3IGFuZCBzY3JpcHQgdmlldy4gKi8KKyAgICBwdWJsaWMgY2xhc3MgVGFiQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldnQpIHsKKyAgICAgICAgICAgIGlmKHZpZXcudGFiRWRpdG9ycy5nZXRTZWxlY3RlZEluZGV4KCkgPT0gMSkgeworICAgICAgICAgICAgICAgIE9uU2VsZWN0VGV4dFBhbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisKKyAgICAvKiogQ3JlYXRlIHRlc3Qgc3VpdGUgYWN0aW9uLiAqLworICAgIHByaXZhdGUgY2xhc3MgQ3JlYXRlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geworICAgICAgICBwdWJsaWMgQ3JlYXRlQWN0aW9uKCkgeworICAgICAgICAgICAgc3VwZXIoIkNyZWF0ZSIsIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5BRERGSUxFKTsKKyAgICAgICAgICAgIHB1dFZhbHVlKFNIT1JUX0RFU0NSSVBUSU9OLCAiQ3JlYXRlIGEgdGVzdCBzdWl0ZSBmcm9tIGFuIEFOVExSIGdyYW1tYXIiKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgT25DcmVhdGVUZXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiBTYXZlIHRlc3Qgc3VpdGUgYWN0aW9uLiAqLworICAgIHByaXZhdGUgY2xhc3MgU2F2ZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKKyAgICAgICAgcHVibGljIFNhdmVBY3Rpb24oKSB7CisgICAgICAgICAgICBzdXBlcigiU2F2ZSIsIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5TQVZFKTsKKyAgICAgICAgICAgIHB1dFZhbHVlKFNIT1JUX0RFU0NSSVBUSU9OLCAiU2F2ZSB0aGUgdGVzdCBzdWl0ZSIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICBPblNhdmVUZXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiBPcGVuIHRlc3Qgc3VpdGUgYWN0aW9uLiAqLworICAgIHByaXZhdGUgY2xhc3MgT3BlbkFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKKyAgICAgICAgcHVibGljIE9wZW5BY3Rpb24oKSB7CisgICAgICAgICAgICBzdXBlcigiT3BlbiIsIEltYWdlRmFjdG9yeS5nZXRTaW5nbGV0b24oKS5PUEVOKTsKKyAgICAgICAgICAgIHB1dFZhbHVlKFNIT1JUX0RFU0NSSVBUSU9OLCAiT3BlbiBhbiBleGlzdGluZyB0ZXN0IHN1aXRlIik7CisgICAgICAgICAgICBwdXRWYWx1ZShBQ0NFTEVSQVRPUl9LRVksIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LlZLX08sIElucHV0RXZlbnQuQ1RSTF9NQVNLKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgIE9uT3BlblRlc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSdW4gdGVzdCBzdWl0ZSBhY3Rpb24uICovCisgICAgcHJpdmF0ZSBjbGFzcyBSdW5BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7CisgICAgICAgIHB1YmxpYyBSdW5BY3Rpb24oKSB7CisgICAgICAgICAgICBzdXBlcigiUnVuIiwgSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLk5FWFQpOworICAgICAgICAgICAgcHV0VmFsdWUoU0hPUlRfREVTQ1JJUFRJT04sICJSdW4gdGhlIGN1cnJlbnQgdGVzdCBzdWl0ZSIpOworICAgICAgICAgICAgcHV0VmFsdWUoQUNDRUxFUkFUT1JfS0VZLCBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5WS19SLCBJbnB1dEV2ZW50LkNUUkxfTUFTSykpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICBPblJ1blRlc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1dvcmtTcGFjZVZpZXcuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL1dvcmtTcGFjZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDIyMGQyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvV29ya1NwYWNlVmlldy5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKgorICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcworICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aTsKKworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLkltYWdlRmFjdG9yeTsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKKy8qKgorICoKKyAqIEBhdXRob3Igc2NhaQorICovCitwdWJsaWMgY2xhc3MgV29ya1NwYWNlVmlldyBleHRlbmRzIEpGcmFtZSB7CisKKyAgICBwcm90ZWN0ZWQgSlNwbGl0UGFuZSBzcGxpdExpc3RDbGllbnQgOworICAgIHByb3RlY3RlZCBKVGFiYmVkUGFuZSB0YWJFZGl0b3JzOworICAgIHByb3RlY3RlZCBKUGFuZWwgcGFuZVRvb2xCYXI7CisgICAgcHJvdGVjdGVkIFN0YXR1c0JhckNvbnRyb2xsZXIgcGFuZVN0YXR1czsKKyAgICBwcm90ZWN0ZWQgVGVzdENhc2VFZGl0Q29udHJvbGxlciBwYW5lRWRpdG9yOworICAgIHByb3RlY3RlZCBKVG9vbEJhciB0b29sYmFyOworICAgIHByb3RlY3RlZCBKVGV4dEFyZWEgdHh0RWRpdG9yOworICAgIHByb3RlY3RlZCBSdWxlTGlzdENvbnRyb2xsZXIgbGlzdFJ1bGVzOworICAgIHByb3RlY3RlZCBKTWVudUJhciBtZW51QmFyOworICAgIHByb3RlY3RlZCBKU2Nyb2xsUGFuZSBzY3JvbGxDb2RlOworICAgIHByb3RlY3RlZCBKUGFuZWwgcmVzdWx0UGFuZTsKKworICAgIHByb3RlY3RlZCBKQnV0dG9uIGJ0bk9wZW5HcmFtbWFyOworCisgICAgcHVibGljIFdvcmtTcGFjZVZpZXcoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisKKyAgICAgICAgdGhpcy5wYW5lRWRpdG9yID0gbmV3IFRlc3RDYXNlRWRpdENvbnRyb2xsZXIodGhpcyk7CisgICAgICAgIHRoaXMucGFuZVN0YXR1cyA9IG5ldyBTdGF0dXNCYXJDb250cm9sbGVyKCk7CisKKyAgICAgICAgdGhpcy50b29sYmFyID0gbmV3IEpUb29sQmFyKCk7CisgICAgICAgIHRoaXMudG9vbGJhci5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKTsKKyAgICAgICAgdGhpcy50b29sYmFyLnNldEZsb2F0YWJsZShmYWxzZSk7CisgICAgICAgIHRoaXMudG9vbGJhci5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKTsKKworICAgICAgICB0aGlzLnR4dEVkaXRvciA9IG5ldyBKVGV4dEFyZWEoKTsKKyAgICAgICAgdGhpcy50eHRFZGl0b3Iuc2V0TGluZVdyYXAoZmFsc2UpOworICAgICAgICB0aGlzLnR4dEVkaXRvci5zZXRGb250KG5ldyBGb250KCJDb3VyaWVyIE5ldyIsIEZvbnQuUExBSU4sIDEzKSk7CisgICAgICAgIHRoaXMuc2Nyb2xsQ29kZSA9IG5ldyBKU2Nyb2xsUGFuZSh0eHRFZGl0b3IsCisgICAgICAgICAgICAgICAgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FMV0FZUywKKyAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZS5IT1JJWk9OVEFMX1NDUk9MTEJBUl9BU19ORUVERUQpOworICAgICAgICB0aGlzLnNjcm9sbENvZGUuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihDb2xvci5MSUdIVF9HUkFZKSk7CisKKyAgICAgICAgdGhpcy50YWJFZGl0b3JzID0gbmV3IEpUYWJiZWRQYW5lKCk7CisgICAgICAgIHRoaXMudGFiRWRpdG9ycy5hZGRUYWIoIkNhc2UgRWRpdG9yIiwgSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLlRFWFRGSUxFMTYsIHRoaXMucGFuZUVkaXRvci5nZXRWaWV3KCkpOworICAgICAgICB0aGlzLnRhYkVkaXRvcnMuYWRkVGFiKCJTY3JpcHQgU291cmNlIiwgSW1hZ2VGYWN0b3J5LmdldFNpbmdsZXRvbigpLldJTkRPVzE2LCB0aGlzLnNjcm9sbENvZGUpOworCisgICAgICAgIHRoaXMubGlzdFJ1bGVzID0gbmV3IFJ1bGVMaXN0Q29udHJvbGxlcigpOworCisgICAgICAgIHRoaXMuc3BsaXRMaXN0Q2xpZW50ID0gbmV3IEpTcGxpdFBhbmUoIEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCwKKyAgICAgICAgICAgICAgICB0aGlzLmxpc3RSdWxlcy5nZXRWaWV3KCksIHRoaXMudGFiRWRpdG9ycyk7CisgICAgICAgIHRoaXMuc3BsaXRMaXN0Q2xpZW50LnNldFJlc2l6ZVdlaWdodCgwLjQpOworICAgICAgICB0aGlzLnNwbGl0TGlzdENsaWVudC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKTsKKworCisgICAgICAgIAorICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMudG9vbGJhciwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKyAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLnNwbGl0TGlzdENsaWVudCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5wYW5lU3RhdHVzLmdldFZpZXcoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKworICAgICAgICAvLyBzZWxmCisgICAgICAgIHRoaXMuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDkwMCwgNTAwKSk7CisgICAgICAgIHRoaXMuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL0lUZXN0Q2FzZUlucHV0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9JVGVzdENhc2VJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmJhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9JVGVzdENhc2VJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVRlc3RDYXNlSW5wdXQgeworCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBzY3JpcHQpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0KCk7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9JVGVzdENhc2VPdXRwdXQuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL0lUZXN0Q2FzZU91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGU4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9JVGVzdENhc2VPdXRwdXQuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKgorICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcworICogYW5kIG9wZW4gdGhlIHRlbXBsYXRlIGluIHRoZSBlZGl0b3IuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworLyoqCisgKgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVRlc3RDYXNlT3V0cHV0IHsKKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdCk7CisgICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSA7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9SdWxlLmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9SdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExYWViOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1J1bGUuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKKworLyoqCisgKiBBTlRMUiB2MyBSdWxlIEluZm9ybWF0aW9uLgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBjbGFzcyBSdWxlIGV4dGVuZHMgRGVmYXVsdExpc3RNb2RlbCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIFJ1bGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiBuYW1lOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb3RFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuICF0aGlzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRlc3RDYXNlKFRlc3RDYXNlIG5ld0l0ZW0pIHsKKyAgICAgICAgdGhpcy5hZGRFbGVtZW50KG5ld0l0ZW0pOworICAgIH0KKyAgICAKKyAgICAvLyBmb3Igc3RyaW5nIHRlbXBsYXRlCisgICAgcHVibGljIExpc3Q8VGVzdENhc2U+IGdldFRlc3RDYXNlcygpIHsKKyAgICAgICAgTGlzdDxUZXN0Q2FzZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUZXN0Q2FzZT4oKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8dGhpcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LmFkZCgoVGVzdENhc2UpdGhpcy5nZXRFbGVtZW50QXQoaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdENhc2UuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlMGY3YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW90aW5nIENhaQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworcHVibGljIGNsYXNzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgSVRlc3RDYXNlSW5wdXQgaW5wdXQ7CisgICAgcHJpdmF0ZSBJVGVzdENhc2VPdXRwdXQgb3V0cHV0OworICAgIHByaXZhdGUgYm9vbGVhbiBwYXNzOworCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXNzKCkgeworICAgICAgICByZXR1cm4gcGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgcGFzcyA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBJVGVzdENhc2VJbnB1dCBnZXRJbnB1dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQ7CisgICAgfQorCisgICAgcHVibGljIElUZXN0Q2FzZU91dHB1dCBnZXRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm91dHB1dDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdENhc2UoSVRlc3RDYXNlSW5wdXQgaW5wdXQsIElUZXN0Q2FzZU91dHB1dCBvdXRwdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVzXS0+WyVzXSIsIGlucHV0LmdldFNjcmlwdCgpLCBvdXRwdXQuZ2V0U2NyaXB0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElucHV0KElUZXN0Q2FzZUlucHV0IGluKSB7CisgICAgICAgIHRoaXMuaW5wdXQgPSBpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoSVRlc3RDYXNlT3V0cHV0IG91dCkgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0UHJlc2VydmVkQ2hhcnMoU3RyaW5nIGlucHV0KSB7CisgICAgICAgIC8vcmV0dXJuIGlucHV0LnJlcGxhY2UoIlwiIiwgIlxcXCIiKTsKKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdENhc2VJbnB1dEZpbGUuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlSW5wdXRGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlSW5wdXRGaWxlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW90aW5nIENhaQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsOworCitpbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CisKKy8qKgorICoKKyAqIEBhdXRob3Igc2NhaQorICovCitwdWJsaWMgY2xhc3MgVGVzdENhc2VJbnB1dEZpbGUgaW1wbGVtZW50cyBJVGVzdENhc2VJbnB1dCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKKworICAgIHB1YmxpYyBUZXN0Q2FzZUlucHV0RmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gIkZJTEU6IiArIGZpbGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdChTdHJpbmcgc2NyaXB0KSB7CisgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBzY3JpcHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5maWxlTmFtZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdENhc2VJbnB1dE11bHRpU3RyaW5nLmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZUlucHV0TXVsdGlTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU2OTZlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdENhc2VJbnB1dE11bHRpU3RyaW5nLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW90aW5nIENhaQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsOworCisKKy8qKgorICoKKyAqIEBhdXRob3Igc2NhaQorICovCitwdWJsaWMgY2xhc3MgVGVzdENhc2VJbnB1dE11bHRpU3RyaW5nIGltcGxlbWVudHMgSVRlc3RDYXNlSW5wdXQgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0OworCisgICAgcHVibGljIFRlc3RDYXNlSW5wdXRNdWx0aVN0cmluZyhTdHJpbmcgdGV4dCkgeworICAgICAgICB0aGlzLnNjcmlwdCA9IHRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICI8PCIgKyBUZXN0Q2FzZS5jb252ZXJ0UHJlc2VydmVkQ2hhcnMoc2NyaXB0KSArICI+PiI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBzY3JpcHQpIHsKKyAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNjcmlwdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlSW5wdXRTdHJpbmcuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlSW5wdXRTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmNmMDZkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdENhc2VJbnB1dFN0cmluZy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworLyoqCisgKgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZUlucHV0U3RyaW5nIGltcGxlbWVudHMgSVRlc3RDYXNlSW5wdXQgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0OworCisgICAgcHVibGljIFRlc3RDYXNlSW5wdXRTdHJpbmcoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgdGhpcy5zY3JpcHQgPSB0ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAnIicgKyBUZXN0Q2FzZS5jb252ZXJ0UHJlc2VydmVkQ2hhcnMoc2NyaXB0KSArICciJzsKKyAgICB9CisKKworCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBzY3JpcHQpIHsKKyAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNjcmlwdDsKKyAgICB9CisKKyAgICAKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlT3V0cHV0QVNULmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZU91dHB1dEFTVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjJiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZU91dHB1dEFTVC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworLyoqCisgKgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZU91dHB1dEFTVCBpbXBsZW1lbnRzIElUZXN0Q2FzZU91dHB1dCB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0cmVlU3RyaW5nOworCisgICAgcHVibGljIFRlc3RDYXNlT3V0cHV0QVNUKFN0cmluZyBzY3JpcHQpIHsKKyAgICAgICAgdGhpcy50cmVlU3RyaW5nID0gc2NyaXB0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdChTdHJpbmcgc2NyaXB0KSB7CisgICAgICAgIHRoaXMudHJlZVN0cmluZyA9IHNjcmlwdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjcmlwdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHJlZVN0cmluZzsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIgLT4gJXMiLCB0cmVlU3RyaW5nKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlT3V0cHV0UmVzdWx0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZU91dHB1dFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWE0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZU91dHB1dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworLyoqCisgKgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZU91dHB1dFJlc3VsdCBpbXBsZW1lbnRzIElUZXN0Q2FzZU91dHB1dCB7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPSyA9ICJPSyI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRkFJTCA9ICJGQUlMIjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzdWNjZXNzIDsKKworICAgIHB1YmxpYyBUZXN0Q2FzZU91dHB1dFJlc3VsdChib29sZWFuIHJlc3VsdCkgeworICAgICAgICB0aGlzLnN1Y2Nlc3MgPSByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldFNjcmlwdCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0KCkgeworICAgICAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogRkFJTDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnN1Y2Nlc3MgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoU3RyaW5nIHNjcmlwdCkgeworICAgICAgICBzdWNjZXNzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oc2NyaXB0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlT3V0cHV0UmV0dXJuLmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZU91dHB1dFJldHVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxN2MzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0Q2FzZU91dHB1dFJldHVybi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZU91dHB1dFJldHVybiBpbXBsZW1lbnRzIElUZXN0Q2FzZU91dHB1dCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0OworCisgICAgcHVibGljIFRlc3RDYXNlT3V0cHV0UmV0dXJuKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHRoaXMuc2NyaXB0ID0gdGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiIHJldHVybnMgWyVzXSIsIHNjcmlwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBzY3JpcHQpIHsKKyAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNjcmlwdDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdENhc2VPdXRwdXRTdGRPdXQuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlT3V0cHV0U3RkT3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkOTc0MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RDYXNlT3V0cHV0U3RkT3V0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW90aW5nIENhaQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworLyoqCisgKgorICogQGF1dGhvciBzY2FpCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q2FzZU91dHB1dFN0ZE91dCBpbXBsZW1lbnRzIElUZXN0Q2FzZU91dHB1dCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0OworCisgICAgcHVibGljIFRlc3RDYXNlT3V0cHV0U3RkT3V0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHRoaXMuc2NyaXB0ID0gdGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiIC0+IFwiJXNcIiIsIHNjcmlwdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0KFN0cmluZyBzY3JpcHQpIHsKKyAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTY3JpcHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNjcmlwdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0U3VpdGUuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL21vZGVsL1Rlc3RTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTUyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0U3VpdGUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW90aW5nIENhaQorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworCitwdWJsaWMgY2xhc3MgVGVzdFN1aXRlIHsKKworICAgIHByb3RlY3RlZCBMaXN0PFJ1bGU+IHJ1bGVzIDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdyYW1tYXJOYW1lIDsKKyAgICBwcm90ZWN0ZWQgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zOworICAgIHByb3RlY3RlZCBGaWxlIHRlc3RTdWl0ZUZpbGU7ICAgICAgCisKKyAgICBwcm90ZWN0ZWQgVGVzdFN1aXRlKFN0cmluZyBnbmFtZSwgRmlsZSB0ZXN0RmlsZSkgeworICAgICAgICBncmFtbWFyTmFtZSA9IGduYW1lOworICAgICAgICB0ZXN0U3VpdGVGaWxlID0gdGVzdEZpbGU7CisgICAgICAgIHJ1bGVzID0gbmV3IEFycmF5TGlzdDxSdWxlPigpOworICAgIH0KKyAgICAKKyAgICAvKiBHZXQgdGhlIGdVbml0IHRlc3Qgc3VpdGUgZmlsZSBuYW1lLiAqLworICAgIHB1YmxpYyBGaWxlIGdldFRlc3RTdWl0ZUZpbGUoKSB7CisgICAgICAgIHJldHVybiB0ZXN0U3VpdGVGaWxlOworICAgIH0gICAgICAgCisKKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlKFJ1bGUgY3VycmVudFJ1bGUpIHsKKyAgICAgICAgaWYoY3VycmVudFJ1bGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBydWxlIik7CisgICAgICAgIHJ1bGVzLmFkZChjdXJyZW50UnVsZSk7CisgICAgfQorCisgICAgLy8gdGVzdCBydWxlIG5hbWUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSdWxlKFJ1bGUgcnVsZSkgeworICAgICAgICBmb3IoUnVsZSByOiBydWxlcykgeworICAgICAgICAgICAgaWYoci5nZXROYW1lKCkuZXF1YWxzKHJ1bGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJ1bGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHJ1bGVzLnNpemUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0UnVsZXMoTGlzdDxSdWxlPiBuZXdSdWxlcykgeworICAgICAgICBydWxlcy5jbGVhcigpOworICAgICAgICBydWxlcy5hZGRBbGwobmV3UnVsZXMpOworICAgIH0KKworICAgIC8qIEdFVFRFUlMgQU5EIFNFVFRFUlMgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJOYW1lKFN0cmluZyBuYW1lKSB7IGdyYW1tYXJOYW1lID0gbmFtZTt9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJOYW1lKCkgeyByZXR1cm4gZ3JhbW1hck5hbWU7IH0KKworICAgIHB1YmxpYyBSdWxlIGdldFJ1bGUoaW50IGluZGV4KSB7IHJldHVybiBydWxlcy5nZXQoaW5kZXgpOyB9CisKKyAgICBwdWJsaWMgQ29tbW9uVG9rZW5TdHJlYW0gZ2V0VG9rZW5zKCkgeyByZXR1cm4gdG9rZW5zOyB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VG9rZW5zKENvbW1vblRva2VuU3RyZWFtIHRzKSB7IHRva2VucyA9IHRzOyB9CisKKyAgICBwdWJsaWMgUnVsZSBnZXRSdWxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvcihSdWxlIHJ1bGU6IHJ1bGVzKSB7CisgICAgICAgICAgICBpZihydWxlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcnVsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLy8gb25seSBmb3Igc3RyaW5ndGVtcGxhdGUgdXNlCisgICAgcHVibGljIExpc3QgZ2V0UnVsZXNGb3JTdHJpbmdUZW1wbGF0ZSgpIHtyZXR1cm4gcnVsZXM7fQorICAgIAorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdFN1aXRlRmFjdG9yeS5qYXZhIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvbW9kZWwvVGVzdFN1aXRlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5N2MzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9tb2RlbC9UZXN0U3VpdGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWw7CisKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5wYXJzZXJzLkFOVExSdjNMZXhlcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuc3dpbmd1aS5wYXJzZXJzLkFOVExSdjNQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkucGFyc2Vycy5TdEdVbml0TGV4ZXI7CitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkucGFyc2Vycy5TdEdVbml0UGFyc2VyOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLnJ1bm5lci5UZXN0U3VpdGVBZGFwdGVyOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkFOVExSUmVhZGVyU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5zdHJpbmd0ZW1wbGF0ZS5TdHJpbmdUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUuU3RyaW5nVGVtcGxhdGVHcm91cDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgVGVzdFN1aXRlRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVNUExBVEVfRklMRSA9ICJvcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9ndW5pdC5zdGciOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1RlbXBsYXRlR3JvdXAgdGVtcGxhdGVzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1VJVEVfRVhUID0gIi5ndW5pdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTU1BUl9FWFQgPSAiLmciOworCisgICAgc3RhdGljICB7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IFRlc3RTdWl0ZUZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShURU1QTEFURV9GSUxFKTsKKyAgICAgICAgaWYgKCBpbiA9PSBudWxsICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludGVybmFsIGVycm9yOiBDYW4ndCBmaW5kIHRlbXBsYXRlcyAiK1RFTVBMQVRFX0ZJTEUpOworICAgICAgICB9CisgICAgICAgIFJlYWRlciByZCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7CisgICAgICAgIHRlbXBsYXRlcyA9IG5ldyBTdHJpbmdUZW1wbGF0ZUdyb3VwKHJkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZDogY3JlYXRlIGEgdGVzdHN1aXRlIGZyb20gQU5UTFIgZ3JhbW1hci4gIFNhdmUgdGhlIHRlc3QKKyAgICAgKiBzdWl0ZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBvZiB0aGUgZ3JhbW1hciBmaWxlLgorICAgICAqIEBwYXJhbSBncmFtbWFyRmlsZSBBTlRMUnYzIGdyYW1tYXIgZmlsZS4KKyAgICAgKiBAcmV0dXJuIHRlc3Qgc3VpdGUgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgY3JlYXRlVGVzdFN1aXRlKEZpbGUgZ3JhbW1hckZpbGUpIHsKKyAgICAgICAgaWYoZ3JhbW1hckZpbGUgIT0gbnVsbCAmJiBncmFtbWFyRmlsZS5leGlzdHMoKSAmJiBncmFtbWFyRmlsZS5pc0ZpbGUoKSkgeworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZU5hbWUgPSBncmFtbWFyRmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ3JhbW1hck5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ3JhbW1hckRpciA9IGdyYW1tYXJGaWxlLmdldFBhcmVudCgpOworICAgICAgICAgICAgZmluYWwgRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGdyYW1tYXJEaXIgKyBGaWxlLnNlcGFyYXRvciArIGdyYW1tYXJOYW1lICsgVEVTVF9TVUlURV9FWFQpOworCisgICAgICAgICAgICBmaW5hbCBUZXN0U3VpdGUgcmVzdWx0ID0gbmV3IFRlc3RTdWl0ZShncmFtbWFyTmFtZSwgdGVzdEZpbGUpOworICAgICAgICAgICAgcmVzdWx0LnJ1bGVzID0gbG9hZFJ1bGVzRnJvbUdyYW1tYXIoZ3JhbW1hckZpbGUpOworCisgICAgICAgICAgICBpZihzYXZlVGVzdFN1aXRlKHJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3Qgc2F2ZSB0ZXN0IHN1aXRlIGZpbGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBncmFtbWFyIGZpbGUuIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIExvYWQgcnVsZXMgZnJvbSBhbiBBTlRMUiBncmFtbWFyIGZpbGUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxSdWxlPiBsb2FkUnVsZXNGcm9tR3JhbW1hcihGaWxlIGdyYW1tYXJGaWxlKSB7CisKKyAgICAgICAgLy8gZ2V0IGFsbCB0aGUgcnVsZSBuYW1lcworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcnVsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGdyYW1tYXJGaWxlKSk7CisgICAgICAgICAgICBmaW5hbCBBTlRMUnYzTGV4ZXIgbGV4ZXIgPSBuZXcgQU5UTFJ2M0xleGVyKG5ldyBBTlRMUlJlYWRlclN0cmVhbShyZWFkZXIpKTsKKyAgICAgICAgICAgIGZpbmFsIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXhlcik7CisgICAgICAgICAgICBmaW5hbCBBTlRMUnYzUGFyc2VyIHBhcnNlciA9IG5ldyBBTlRMUnYzUGFyc2VyKHRva2Vucyk7CisgICAgICAgICAgICBwYXJzZXIucnVsZXMgPSBydWxlTmFtZXM7CisgICAgICAgICAgICBwYXJzZXIuZ3JhbW1hckRlZigpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29udmVydCB0byBydWxlIG9iamVjdAorICAgICAgICBmaW5hbCBMaXN0PFJ1bGU+IHJ1bGVMaXN0ID0gbmV3IEFycmF5TGlzdDxSdWxlPigpOworICAgICAgICBmb3IoU3RyaW5nIHN0cjogcnVsZU5hbWVzKSB7CisgICAgICAgICAgICBydWxlTGlzdC5hZGQobmV3IFJ1bGUoc3RyKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVsZUxpc3Q7CisgICAgfQorCisgICAgLyogU2F2ZSB0ZXN0c3VpdGUgdG8gKi5ndW5pdCBmaWxlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlVGVzdFN1aXRlKFRlc3RTdWl0ZSB0ZXN0U3VpdGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSBnZXRTY3JpcHQodGVzdFN1aXRlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0ZXN0U3VpdGUuZ2V0VGVzdFN1aXRlRmlsZSgpKTsKKyAgICAgICAgICAgIGZ3LndyaXRlKGRhdGEpOworICAgICAgICAgICAgZncuZmx1c2goKTsKKyAgICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0ZXh0IHNjcmlwdCBmcm9tIHRoZSB0ZXN0U3VpdGUuCisgICAgICogQHBhcmFtIHRlc3RTdWl0ZQorICAgICAqIEByZXR1cm4gdGVzdCBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTY3JpcHQoVGVzdFN1aXRlIHRlc3RTdWl0ZSkgeworICAgICAgICBpZih0ZXN0U3VpdGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZ1RlbXBsYXRlIGdVbml0U2NyaXB0ID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImdVbml0RmlsZSIpOworICAgICAgICBnVW5pdFNjcmlwdC5zZXRBdHRyaWJ1dGUoInRlc3RTdWl0ZSIsIHRlc3RTdWl0ZSk7CisKKyAgICAgICAgcmV0dXJuIGdVbml0U2NyaXB0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnJvbSB0ZXh0dWFsIHNjcmlwdCB0byBwcm9ncmFtIG1vZGVsLgorICAgICAqIEBwYXJhbSBmaWxlIHRlc3RzdWl0ZSBmaWxlICguZ3VuaXQpCisgICAgICogQHJldHVybiB0ZXN0IHN1aXRlIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIGxvYWRUZXN0U3VpdGUoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICggZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoR1JBTU1BUl9FWFQpICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZmlsZS5nZXROYW1lKCkrIiBpcyBhIGdyYW1tYXIgZmlsZSBub3QgYSBndW5pdCBmaWxlIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgZ3JhbW1hciBmaWxlCisgICAgICAgIGZpbmFsIEZpbGUgZ3JhbW1hckZpbGUgPSBnZXRHcmFtbWFyRmlsZShmaWxlKTsKKyAgICAgICAgaWYoZ3JhbW1hckZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBmaW5kIGdyYW1tYXIgZmlsZSBhc3NvY2lhdGVkIHdpdGggZ3VuaXQgZmlsZTogIitmaWxlLmdldEFic29sdXRlRmlsZSgpKTsKKworICAgICAgICBUZXN0U3VpdGUgcmVzdWx0ID0gbmV3IFRlc3RTdWl0ZSgiIiwgZmlsZSk7CisKKyAgICAgICAgLy8gcmVhZCBpbiB0ZXN0IHN1aXRlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0R1VuaXRMZXhlciBsZXhlciA9IG5ldyBTdEdVbml0TGV4ZXIobmV3IEFOVExSUmVhZGVyU3RyZWFtKHJlYWRlcikpOworICAgICAgICAgICAgZmluYWwgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleGVyKTsKKyAgICAgICAgICAgIGZpbmFsIFN0R1VuaXRQYXJzZXIgcGFyc2VyID0gbmV3IFN0R1VuaXRQYXJzZXIodG9rZW5zKTsKKyAgICAgICAgICAgIGZpbmFsIFRlc3RTdWl0ZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBUZXN0U3VpdGVBZGFwdGVyKHJlc3VsdCk7CisgICAgICAgICAgICBwYXJzZXIuYWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgICAgICBwYXJzZXIuZ1VuaXREZWYoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUb2tlbnModG9rZW5zKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIHRlc3Qgc3VpdGUgZmlsZS5cbiIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbG9hZCB1bi10ZXN0ZWQgcnVsZXMgZnJvbSBncmFtbWFyCisgICAgICAgIGZpbmFsIExpc3Q8UnVsZT4gY29tcGxldGVSdWxlTGlzdCA9IGxvYWRSdWxlc0Zyb21HcmFtbWFyKGdyYW1tYXJGaWxlKTsKKyAgICAgICAgZm9yKFJ1bGUgcnVsZTogY29tcGxldGVSdWxlTGlzdCkgeworICAgICAgICAgICAgaWYoIXJlc3VsdC5oYXNSdWxlKHJ1bGUpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJ1bGUocnVsZSk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZCBydWxlOiIgKyBydWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBncmFtbWFyIGZpbGUgb2YgdGhlIHRlc3RzdWl0ZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAgICAgKiBAcGFyYW0gdGVzdHN1aXRlRmlsZQorICAgICAqIEByZXR1cm4gZ3JhbW1hciBmaWxlIG9yIG51bGwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEdyYW1tYXJGaWxlKEZpbGUgdGVzdHN1aXRlRmlsZSkgeworICAgICAgICBTdHJpbmcgc1Rlc3RGaWxlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1Rlc3RGaWxlID0gdGVzdHN1aXRlRmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIFRyeSBGb28uZyBmcm9tIEZvby5ndW5pdAorICAgICAgICBTdHJpbmcgZm5hbWUgPQorICAgICAgICAgICAgc1Rlc3RGaWxlLnN1YnN0cmluZygwLCBzVGVzdEZpbGUubGFzdEluZGV4T2YoJy4nKSkgKyBHUkFNTUFSX0VYVDsKKyAgICAgICAgRmlsZSBmaWxlR3JhbW1hciA9IG5ldyBGaWxlKGZuYW1lKTsKKyAgICAgICAgaWYoZmlsZUdyYW1tYXIuZXhpc3RzKCkgJiYgZmlsZUdyYW1tYXIuaXNGaWxlKCkpIHJldHVybiBmaWxlR3JhbW1hcjsKKyAgICAgICAgLy8gVHJ5IEZvb1BhcnNlci5nIGZyb20gRm9vLmd1bml0CisgICAgICAgIGZuYW1lID0gc1Rlc3RGaWxlLnN1YnN0cmluZygwLCBzVGVzdEZpbGUubGFzdEluZGV4T2YoJy4nKSkrIlBhcnNlciIrR1JBTU1BUl9FWFQ7CisgICAgICAgIGlmKGZpbGVHcmFtbWFyLmV4aXN0cygpICYmIGZpbGVHcmFtbWFyLmlzRmlsZSgpKSByZXR1cm4gZmlsZUdyYW1tYXI7CisgICAgICAgIHJldHVybiBmaWxlR3JhbW1hcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9ydW5uZXIvTm90aWZpZWRUZXN0RXhlY3V0ZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3J1bm5lci9Ob3RpZmllZFRlc3RFeGVjdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjEwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9ydW5uZXIvTm90aWZpZWRUZXN0RXhlY3V0ZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLnJ1bm5lcjsKKworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC4qOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsLio7CisKKy8qKgorICogVGhlIGdVbml0IHRlc3QgZXhlY3V0ZXIgdGhhdCB3aWxsIHJlc3BvbmQgdG8gdGhlIGZhaWwvcGFzcyBldmVudCBkdXJpbmcgdGhlCisgKiBleGVjdXRpb24uICBUaGUgZXhlY3V0ZXIgaXMgcGFzc2VkIGludG8gZ1VuaXQgSW50ZXJwIGZvciBleGVjdXRpb24uCisgKiBAYXV0aG9yIHNjYWkKKyAqLworcHVibGljIGNsYXNzIE5vdGlmaWVkVGVzdEV4ZWN1dGVyIGV4dGVuZHMgZ1VuaXRFeGVjdXRvciB7CisKKyAgICBwcml2YXRlIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgOworCisgICAgcHVibGljIE5vdGlmaWVkVGVzdEV4ZWN1dGVyKEdyYW1tYXJJbmZvIGdyYW1tYXJJbmZvLCBDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyB0ZXN0c3VpdGVEaXIsIFRlc3RTdWl0ZSBzdWl0ZSkgeworICAgIAlzdXBlcihncmFtbWFySW5mbywgbG9hZGVyLCB0ZXN0c3VpdGVEaXIpOworICAgICAgICAKKyAgICAgICAgdGVzdFN1aXRlID0gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GYWlsKElUZXN0Q2FzZSBmYWlsVGVzdCkgeworICAgICAgICBpZihmYWlsVGVzdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGZhaWwgdGVzdCIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBydWxlTmFtZSA9IGZhaWxUZXN0LmdldFRlc3RlZFJ1bGVOYW1lKCk7CisgICAgICAgIGlmKHJ1bGVOYW1lID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTnVsbCBydWxlIG5hbWUiKTsKKworICAgICAgICBmaW5hbCBSdWxlIHJ1bGUgPSB0ZXN0U3VpdGUuZ2V0UnVsZShydWxlTmFtZSk7CisgICAgICAgIGZpbmFsIFRlc3RDYXNlIGZhaWxDYXNlID0gKFRlc3RDYXNlKSBydWxlLmdldEVsZW1lbnRBdChmYWlsVGVzdC5nZXRUZXN0Q2FzZUluZGV4KCkpOworICAgICAgICBmYWlsQ2FzZS5zZXRQYXNzKGZhbHNlKTsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiW0ZBSUxdICVzICglZCkgIiwgZmFpbFRlc3QuZ2V0VGVzdGVkUnVsZU5hbWUoKSwgZmFpbFRlc3QuZ2V0VGVzdENhc2VJbmRleCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXNzKElUZXN0Q2FzZSBwYXNzVGVzdCkgeworICAgICAgICBpZihwYXNzVGVzdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIHBhc3MgdGVzdCIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBydWxlTmFtZSA9IHBhc3NUZXN0LmdldFRlc3RlZFJ1bGVOYW1lKCk7CisgICAgICAgIGlmKHJ1bGVOYW1lID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTnVsbCBydWxlIG5hbWUiKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIFJ1bGUgcnVsZSA9IHRlc3RTdWl0ZS5nZXRSdWxlKHJ1bGVOYW1lKTsKKyAgICAgICAgZmluYWwgVGVzdENhc2UgcGFzc0Nhc2UgPSAoVGVzdENhc2UpIHJ1bGUuZ2V0RWxlbWVudEF0KHBhc3NUZXN0LmdldFRlc3RDYXNlSW5kZXgoKSk7CisgICAgICAgIHBhc3NDYXNlLnNldFBhc3ModHJ1ZSk7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIltQQVNTXSAlcyAoJWQpICIsIHBhc3NUZXN0LmdldFRlc3RlZFJ1bGVOYW1lKCksIHBhc3NUZXN0LmdldFRlc3RDYXNlSW5kZXgoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3J1bm5lci9QYXJzZXJMb2FkZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3J1bm5lci9QYXJzZXJMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Y1YWEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvcnVubmVyL1BhcnNlckxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLnJ1bm5lcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBDbGFzcyBsb2FkZXIgZm9yIHBhcnNlciAmIGxleGVyIGdlbmVyYXRlZCBieSBhbnRsci4KKyAqIEBhdXRob3IgU2hhb3RpbmcKKyAqLworcHVibGljIGNsYXNzIFBhcnNlckxvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKworICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIENsYXNzPiBjbGFzc0xpc3Q7CisgICAgcHJpdmF0ZSBTdHJpbmcgZ3JhbW1hcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNsYXNzIGxvYWRlciBmb3IgYW50bHIgcGFyc2VyL2xleGVyLgorICAgICAqIEBwYXJhbSBncmFtbWFyTmFtZQorICAgICAqIEBwYXJhbSBjbGFzc0RpcgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZXJMb2FkZXIoU3RyaW5nIGdyYW1tYXJOYW1lLCBTdHJpbmcgY2xhc3NEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxleGVyTmFtZSA9IGdyYW1tYXJOYW1lICsgIkxleGVyIjsKKworICAgICAgICAvLyBsb2FkIGFsbCB0aGUgY2xhc3MgZmlsZXMgaW4gdGhlICJjbGFzc0RpciIgcmVsYXRlZCB0byB0aGUgZ3JhbW1hck5hbWUKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShjbGFzc0Rpcik7CisgICAgICAgIGlmKGRpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBjbGFzc0xpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOworICAgICAgICAgICAgZ3JhbW1hciA9IGdyYW1tYXJOYW1lOworICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhuZXcgQ2xhc3NGaWxlbmFtZUZpbHRlcihncmFtbWFyTmFtZSkpOworICAgICAgICAgICAgZm9yKEZpbGUgZiA6IGZpbGVzKSB7CisKKyAgICAgICAgICAgICAgICAvLyBsb2FkIGNsYXNzIGRhdGEKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBjbGFzc0RhdGEgPSBuZXcgYnl0ZVtpbi5hdmFpbGFibGUoKV07CisgICAgICAgICAgICAgICAgaW4ucmVhZChjbGFzc0RhdGEpOworICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBkZWZpbmUgY2xhc3MKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBuZXdDbGFzcyA9IGRlZmluZUNsYXNzKG51bGwsIGNsYXNzRGF0YSwgMCwgY2xhc3NEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KG5ld0NsYXNzICE9IG51bGwpOworICAgICAgICAgICAgICAgIHJlc29sdmVDbGFzcyhuZXdDbGFzcyk7CisKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIGhhc2h0YWJsZQorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKSk7CisgICAgICAgICAgICAgICAgY2xhc3NMaXN0LnB1dChjbGFzc05hbWUsIG5ld0NsYXNzKTsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nOiAiICsgY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihjbGFzc0RpciArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoY2xhc3NMaXN0LmlzRW1wdHkoKSB8fCAhY2xhc3NMaXN0LmNvbnRhaW5zS2V5KGxleGVyTmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGxleGVyTmFtZSArICIgbm90IGZvdW5kLiIpOworICAgICAgICB9CisKKyAgICB9CisKKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoImxvYWRpbmc6ICIgKyBuYW1lKTsKKyAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKGdyYW1tYXIpKSB7CisgICAgICAgICAgICBpZihjbGFzc0xpc3QuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiIC4uLi4gZm91bmQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NMaXN0LmdldChuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAuLi4uIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzcyBjID0gZmluZFN5c3RlbUNsYXNzKG5hbWUpOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAuLi4uIHN5c3RlbSBmb3VuZCAiICsgYy5nZXROYW1lKCkpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIGdyYW1tYXJuYW1lLi4uKCQuLi4pPy5jbGFzcworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ2xhc3NGaWxlbmFtZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBncmFtbWFyTmFtZTsKKworICAgICAgICBwcm90ZWN0ZWQgQ2xhc3NGaWxlbmFtZUZpbHRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgZ3JhbW1hck5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChncmFtbWFyTmFtZSkgJiYgbmFtZS5lbmRzV2l0aCgiLmNsYXNzIik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvcnVubmVyL1Rlc3RTdWl0ZUFkYXB0ZXIuamF2YSBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3J1bm5lci9UZXN0U3VpdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3ZDk1MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3J1bm5lci9UZXN0U3VpdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwOSBTaGFvdGluZyBDYWkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWkucnVubmVyOworCitpbXBvcnQgb3JnLmFudGxyLmd1bml0LnN3aW5ndWkubW9kZWwuKjsKKworLyoqCisgKiBBZGFwdGVyIGNsYXNzIGZvciBndW5pdCBwYXJzZXIgdG8gc2F2ZSBpbmZvcm1hdGlvbiBpbnRvIHRlc3RzdWl0ZSBvYmplY3QuCisgKiBAYXV0aG9yIFNoYW90aW5nCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3VpdGVBZGFwdGVyIHsKKworICAgIHByaXZhdGUgVGVzdFN1aXRlIG1vZGVsIDsKKyAgICBwcml2YXRlIFJ1bGUgY3VycmVudFJ1bGU7CisKKyAgICBwdWJsaWMgVGVzdFN1aXRlQWRhcHRlcihUZXN0U3VpdGUgdGVzdFN1aXRlKSB7CisgICAgICAgIG1vZGVsID0gdGVzdFN1aXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1vZGVsLnNldEdyYW1tYXJOYW1lKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UnVsZShTdHJpbmcgbmFtZSkgeworICAgICAgICBjdXJyZW50UnVsZSA9IG5ldyBSdWxlKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZFJ1bGUoKSB7CisgICAgICAgIG1vZGVsLmFkZFJ1bGUoY3VycmVudFJ1bGUpOworICAgICAgICBjdXJyZW50UnVsZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGVzdENhc2UoSVRlc3RDYXNlSW5wdXQgaW4sIElUZXN0Q2FzZU91dHB1dCBvdXQpIHsKKyAgICAgICAgVGVzdENhc2UgdGVzdENhc2UgPSBuZXcgVGVzdENhc2UoaW4sIG91dCk7CisgICAgICAgIGN1cnJlbnRSdWxlLmFkZFRlc3RDYXNlKHRlc3RDYXNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJpbUNoYXJzKFN0cmluZyB0ZXh0LCBpbnQgbnVtT2ZDaGFycykgeworICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcobnVtT2ZDaGFycywgdGV4dC5sZW5ndGgoKSAtIG51bU9mQ2hhcnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSVRlc3RDYXNlSW5wdXQgY3JlYXRlRmlsZUlucHV0KFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZihmaWxlTmFtZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIik7CisgICAgICAgIHJldHVybiBuZXcgVGVzdENhc2VJbnB1dEZpbGUoZmlsZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSVRlc3RDYXNlSW5wdXQgY3JlYXRlU3RyaW5nSW5wdXQoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgaWYobGluZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIik7CisgICAgICAgIC8vIHRyaW0gZG91YmxlIHF1b3RlcworICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlSW5wdXRTdHJpbmcodHJpbUNoYXJzKGxpbmUsIDEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIElUZXN0Q2FzZUlucHV0IGNyZWF0ZU11bHRpSW5wdXQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaWYodGV4dCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIik7CisgICAgICAgIC8vIHRyaW0gPDwgYW5kID4+CisgICAgICAgIHJldHVybiBuZXcgVGVzdENhc2VJbnB1dE11bHRpU3RyaW5nKHRyaW1DaGFycyh0ZXh0LCAyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJVGVzdENhc2VPdXRwdXQgY3JlYXRlQm9vbE91dHB1dChib29sZWFuIGJvb2wpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0Q2FzZU91dHB1dFJlc3VsdChib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIElUZXN0Q2FzZU91dHB1dCBjcmVhdGVBc3RPdXRwdXQoU3RyaW5nIGFzdCkgeworICAgICAgICBpZihhc3QgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOworICAgICAgICByZXR1cm4gbmV3IFRlc3RDYXNlT3V0cHV0QVNUKGFzdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJVGVzdENhc2VPdXRwdXQgY3JlYXRlU3RkT3V0cHV0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGlmKHRleHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOworICAgICAgICAvLyB0cmltIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0Q2FzZU91dHB1dFN0ZE91dCh0cmltQ2hhcnModGV4dCwgMSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSVRlc3RDYXNlT3V0cHV0IGNyZWF0ZVJldHVybk91dHB1dChTdHJpbmcgdGV4dCkgeworICAgICAgICBpZih0ZXh0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwiKTsKKyAgICAgICAgLy8gdHJpbSBzcXVhcmUgYnJhY2tldHMKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0Q2FzZU91dHB1dFJldHVybih0cmltQ2hhcnModGV4dCwgMSkpOworICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9ydW5uZXIvZ1VuaXRBZGFwdGVyLmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vamF2YS9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9ydW5uZXIvZ1VuaXRBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkNjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL3J1bm5lci9nVW5pdEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhb3RpbmcgQ2FpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmd1bml0LnN3aW5ndWkucnVubmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC4qOworaW1wb3J0IG9yZy5hbnRsci5ndW5pdC5zd2luZ3VpLm1vZGVsLlRlc3RTdWl0ZTsKKworLyoqCisgKiBBZGFwdGVyIGJldHdlZW4gZ1VuaXRFZGl0b3IgU3dpbmcgR1VJIGFuZCBnVW5pdCBjb21tYW5kLWxpbmUgdG9vbC4KKyAqIEBhdXRob3Igc2NhaQorICovCitwdWJsaWMgY2xhc3MgZ1VuaXRBZGFwdGVyIHsKKworICAgIHByaXZhdGUgUGFyc2VyTG9hZGVyIGxvYWRlciA7CisgICAgcHJpdmF0ZSBUZXN0U3VpdGUgdGVzdFN1aXRlOworCisgICAgcHVibGljIGdVbml0QWRhcHRlcihUZXN0U3VpdGUgc3VpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gMzsKKyAgICAgICAgbG9hZGVyID0gbmV3IFBhcnNlckxvYWRlcihzdWl0ZS5nZXRHcmFtbWFyTmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZS5nZXRUZXN0U3VpdGVGaWxlKCkuZ2V0UGFyZW50KCkpOworICAgICAgICB0ZXN0U3VpdGUgPSBzdWl0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGlmICh0ZXN0U3VpdGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgdGVzdHN1aXRlLiIpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIGdVbml0IHRlc3Qgc3VpdGUgZmlsZQorICAgICAgICAgICAgZmluYWwgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUkZpbGVTdHJlYW0odGVzdFN1aXRlLmdldFRlc3RTdWl0ZUZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgZmluYWwgZ1VuaXRMZXhlciBsZXhlciA9IG5ldyBnVW5pdExleGVyKGlucHV0KTsKKyAgICAgICAgICAgIGZpbmFsIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXhlcik7CisgICAgICAgICAgICBmaW5hbCBHcmFtbWFySW5mbyBncmFtbWFySW5mbyA9IG5ldyBHcmFtbWFySW5mbygpOworICAgICAgICAgICAgZmluYWwgZ1VuaXRQYXJzZXIgcGFyc2VyID0gbmV3IGdVbml0UGFyc2VyKHRva2VucywgZ3JhbW1hckluZm8pOworICAgICAgICAgICAgcGFyc2VyLmdVbml0RGVmKCk7CS8vIHBhcnNlIGd1bml0IHNjcmlwdCBhbmQgc2F2ZSBlbGVtZW50cyB0byBncmFtbWFySW5mbworCisgICAgICAgICAgICAvLyBFeGVjdXRlIHRlc3Qgc3VpdGUKKyAgICAgICAgICAgIGZpbmFsIGdVbml0RXhlY3V0b3IgZXhlY3V0ZXIgPSBuZXcgTm90aWZpZWRUZXN0RXhlY3V0ZXIoCisgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJJbmZvLCBsb2FkZXIsIAorICAgICAgICAgICAgICAgICAgICB0ZXN0U3VpdGUuZ2V0VGVzdFN1aXRlRmlsZSgpLmdldFBhcmVudCgpLCB0ZXN0U3VpdGUpOworICAgICAgICAgICAgZXhlY3V0ZXIuZXhlY1Rlc3QoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvZ1VuaXRUZXN0UmVzdWx0LnN0ZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L2dVbml0VGVzdFJlc3VsdC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhZWM1NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L2dVbml0VGVzdFJlc3VsdC5zdGcKQEAgLTAsMCArMSw0OSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTGVvbiwgSmVuLVl1YW4gU3UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK2dyb3VwIGdVbml0VGVzdFJlc3VsdDsKKwordGVzdFJlc3VsdCh0aXRsZSwgbnVtX29mX3Rlc3QsIG51bV9vZl9mYWlsdXJlLCBmYWlsdXJlLCBoYXNfaW52YWxpZCwgbnVtX29mX2ludmFsaWQsIGludmFsaWQpIDo6PSA8PAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzx0aXRsZT4gd2l0aCA8bnVtX29mX3Rlc3Q+IHRlc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPG51bV9vZl9mYWlsdXJlPiBmYWlsdXJlcyBmb3VuZDoKKzxmYWlsdXJlOns8aXQuaGVhZGVyPgorZXhwZWN0ZWQ6IDxpdC5leHBlY3RlZFJlc3VsdD4KK2FjdHVhbDogPGl0LmFjdHVhbFJlc3VsdD4KKworfT4KKzxpZihoYXNfaW52YWxpZCk+Cis8bnVtX29mX2ludmFsaWQ+IGludmFsaWQgaW5wdXRzIGZvdW5kOgorPGludmFsaWQ6ezxpdC5oZWFkZXI+CitpbnZhbGlkIGlucHV0OiA8aXQuYWN0dWFsPgorfT4KKzxlbmRpZj4KKworVGVzdHMgcnVuOiA8bnVtX29mX3Rlc3Q+LCBGYWlsdXJlczogPG51bV9vZl9mYWlsdXJlPgorCis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvanVuaXQuc3RnIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvanVuaXQuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTU0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9qdW5pdC5zdGcKQEAgLTAsMCArMSw4NSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggTGVvbiwgSmVuLVl1YW4gU3UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK2dyb3VwIGp1bml0OworCitjbGFzc0hlYWRlcihoZWFkZXIsanVuaXRGaWxlTmFtZSxoYXNUcmVlQWRhcHRvcix0cmVlQWRhcHRvclBhdGgsCisgICAgaGFzUGFja2FnZSxwYWNrYWdlUGF0aCxsZXhlclBhdGgscGFyc2VyUGF0aCx0cmVlUGFyc2VyUGF0aCxpc1RyZWVHcmFtbWFyKSA6Oj0gPDwKKzxoZWFkZXI+CisKK2ltcG9ydCBvcmcuYW50bHIuZ3VuaXQuZ1VuaXRCYXNlVGVzdDsKKworcHVibGljIGNsYXNzIDxqdW5pdEZpbGVOYW1lPiBleHRlbmRzIGdVbml0QmFzZVRlc3QgeworCQorCXB1YmxpYyB2b2lkIHNldFVwKCkgeworCQk8aWYoaGFzVHJlZUFkYXB0b3IpPjxcdD48XHQ+dGhpcy50cmVlQWRhcHRvclBhdGggPSAiPHRyZWVBZGFwdG9yUGF0aD4iOzxlbmRpZj4KKwkJPGlmKGhhc1BhY2thZ2UpPjxcdD48XHQ+dGhpcy5wYWNrYWdlUGF0aCA9ICI8cGFja2FnZVBhdGg+Ijs8ZW5kaWY+CisJCXRoaXMubGV4ZXJQYXRoID0gIjxsZXhlclBhdGg+IjsKKwkJdGhpcy5wYXJzZXJQYXRoID0gIjxwYXJzZXJQYXRoPiI7CisJCTxpZihpc1RyZWVHcmFtbWFyKT48XHQ+PFx0PnRoaXMudHJlZVBhcnNlclBhdGggPSAiPHRyZWVQYXJzZXJQYXRoPiI7PGVuZGlmPgorCX08XG4+PFxuPgorPj4KKwordGVzdFRyZWVSdWxlTWV0aG9kKG1ldGhvZE5hbWUsdGVzdFRyZWVSdWxlTmFtZSx0ZXN0UnVsZU5hbWUsdGVzdCx0b2tlblR5cGUsZXhwZWN0aW5nKSA6Oj0gPDwKKwlwdWJsaWMgdm9pZCA8bWV0aG9kTmFtZT4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gZ3VuaXQgdGVzdCBvbiBsaW5lIDx0ZXN0LmxpbmU+CisJCU9iamVjdCByZXR2YWwgPSBleGVjVHJlZVBhcnNlcig8dGVzdFRyZWVSdWxlTmFtZT4sIDx0ZXN0UnVsZU5hbWU+LCAiPHRlc3QuaW5wdXRFc2NhcGVkPiIsIDx0ZXN0LmlzRmlsZT4pOworCQlPYmplY3QgYWN0dWFsID0gZXhhbWluZUV4ZWNSZXN1bHQoPHRva2VuVHlwZT4sIHJldHZhbCk7CisJCU9iamVjdCBleHBlY3RpbmcgPSA8ZXhwZWN0aW5nPjsKKwkJCisJCWFzc2VydEVxdWFscygidGVzdGluZyBydWxlICIrPHRlc3RUcmVlUnVsZU5hbWU+LCBleHBlY3RpbmcsIGFjdHVhbCk7CisJfTxcbj48XG4+Cis+PgorCit0ZXN0VHJlZVJ1bGVNZXRob2QyKG1ldGhvZE5hbWUsdGVzdFRyZWVSdWxlTmFtZSx0ZXN0UnVsZU5hbWUsdGVzdCxyZXR1cm5UeXBlLGV4cGVjdGluZykgOjo9IDw8CisJcHVibGljIHZvaWQgPG1ldGhvZE5hbWU+KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGd1bml0IHRlc3Qgb24gbGluZSA8dGVzdC5saW5lPgorCQk8cmV0dXJuVHlwZT4gcmV0dmFsID0gKDxyZXR1cm5UeXBlPilleGVjVHJlZVBhcnNlcig8dGVzdFRyZWVSdWxlTmFtZT4sIDx0ZXN0UnVsZU5hbWU+LCAiPHRlc3QuaW5wdXRFc2NhcGVkPiIsIDx0ZXN0LmlzRmlsZT4pOworCQkKKwkJYXNzZXJ0VHJ1ZSgidGVzdGluZyBydWxlICIrPHRlc3RUcmVlUnVsZU5hbWU+LCA8ZXhwZWN0aW5nPik7CisJfTxcbj48XG4+Cis+PgorCit0ZXN0UnVsZU1ldGhvZChpc0xleGljYWxSdWxlLG1ldGhvZE5hbWUsdGVzdFJ1bGVOYW1lLHRlc3QsdG9rZW5UeXBlLGV4cGVjdGluZykgOjo9IDw8CisJcHVibGljIHZvaWQgPG1ldGhvZE5hbWU+KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGd1bml0IHRlc3Qgb24gbGluZSA8dGVzdC5saW5lPgorCQlPYmplY3QgcmV0dmFsID0gPGlmKGlzTGV4aWNhbFJ1bGUpPmV4ZWNMZXhlcjxlbHNlPmV4ZWNQYXJzZXI8ZW5kaWY+KDx0ZXN0UnVsZU5hbWU+LCA8dGVzdC5saW5lPiwgIjx0ZXN0LmlucHV0RXNjYXBlZD4iLCA8dGVzdC5pc0ZpbGU+KTsKKwkJT2JqZWN0IGFjdHVhbCA9IGV4YW1pbmVFeGVjUmVzdWx0KDx0b2tlblR5cGU+LCByZXR2YWwpOworCQlPYmplY3QgZXhwZWN0aW5nID0gPGV4cGVjdGluZz47CisKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0aW5nIHJ1bGUgIis8dGVzdFJ1bGVOYW1lPiwgZXhwZWN0aW5nLCBhY3R1YWwpOworCX08XG4+PFxuPgorPj4KKwordGVzdFJ1bGVNZXRob2QyKG1ldGhvZE5hbWUsdGVzdFJ1bGVOYW1lLHRlc3QscmV0dXJuVHlwZSxleHBlY3RpbmcpIDo6PSA8PAorCXB1YmxpYyB2b2lkIDxtZXRob2ROYW1lPigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBndW5pdCB0ZXN0IG9uIGxpbmUgPHRlc3QubGluZT4KKwkJPHJldHVyblR5cGU+IHJldHZhbCA9ICg8cmV0dXJuVHlwZT4pZXhlY1BhcnNlcig8dGVzdFJ1bGVOYW1lPiwgPHRlc3QubGluZT4sICI8dGVzdC5pbnB1dEVzY2FwZWQ+IiwgPHRlc3QuaXNGaWxlPik7CisKKwkJYXNzZXJ0VHJ1ZSgidGVzdGluZyBydWxlICIrPHRlc3RSdWxlTmFtZT4sIDxleHBlY3Rpbmc+KTsKKwl9PFxuPjxcbj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2d1bml0LnN0ZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvZ3VuaXQuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzE3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2d1bml0LnN0ZwpAQCAtMCwwICsxLDE5IEBACitncm91cCBndW5pdDsKKworZ1VuaXRGaWxlKHRlc3RTdWl0ZSkgOjo9IDw8Z3VuaXQgPHRlc3RTdWl0ZS5ncmFtbWFyTmFtZT47CisKKzx0ZXN0U3VpdGUucnVsZXNGb3JTdHJpbmdUZW1wbGF0ZTp0ZXN0R3JvdXAoKT4KKz4+CisKK3Rlc3RHcm91cCgpIDo6PSA8PAorPGlmKGl0Lm5vdEVtcHR5KT4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tIDxpdC5uYW1lPgorPGl0Lm5hbWU+OgorCis8aXQudGVzdENhc2VzOiB0ZXN0Q2FzZSgpOyBzZXBhcmF0b3I9IlxuXG4iPgorCis8ZW5kaWY+Cis+PgorCit0ZXN0Q2FzZSgpIDo6PSAiPGl0LmlucHV0PiA8aXQub3V0cHV0PiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9hY2NlcHQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvYWNjZXB0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q5MWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvYWNjZXB0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9hZGQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvYWRkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmYwOTBiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvYWRkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9hZGRmaWxlMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvYWRkZmlsZTI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhiNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvYWRkZmlsZTI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9kZWxldGUyNC5wbmcgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9kZWxldGUyNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NTJiYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL2RlbGV0ZTI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9lZGl0MTYucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZWRpdDE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTgyYzJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZWRpdDE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9mYXZiMTYucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmF2YjE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI1MmRlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmF2YjE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9mYXZiMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmF2YjI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWY3ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmF2YjI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9maWxlMTYucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmlsZTE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTEzMjQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmlsZTE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9maWxlc2VhcmNoMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmlsZXNlYXJjaDI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGEyZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvZmlsZXNlYXJjaDI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9mbG9wcHkyNC5wbmcgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9mbG9wcHkyNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0NjQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL2Zsb3BweTI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9mb2xkZXIyNC5wbmcgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9mb2xkZXIyNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5OTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL2ZvbGRlcjI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9oZWxwMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvaGVscDI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2RmYjQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvaGVscDI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9uZXh0MjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvbmV4dDI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjU4NjIyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvbmV4dDI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9yZWRvMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvcmVkbzI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWVhNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvcmVkbzI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9yZWZyZXNoMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvcmVmcmVzaDI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjgzZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvcmVmcmVzaDI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9ydW5mYWlsLnBuZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL3J1bmZhaWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4NmYxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9ydW5mYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9ydW5wYXNzLnBuZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL3J1bnBhc3MucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0YzM4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9ydW5wYXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9zYXZlYXMyNC5wbmcgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy9zYXZlYXMyNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlODgwMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL3NhdmVhczI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXN0Z3JvdXAucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvdGVzdGdyb3VwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NWFhYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvdGVzdGdyb3VwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXN0Z3JvdXB4LnBuZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL3Rlc3Rncm91cHgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXN0Z3JvdXB4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXN0c3VpdGUucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvdGVzdHN1aXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODVmZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvdGVzdHN1aXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXh0ZmlsZTE2LnBuZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL3RleHRmaWxlMTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXh0ZmlsZTE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXh0ZmlsZTI0LnBuZyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2d1bml0L3N3aW5ndWkvaW1hZ2VzL3RleHRmaWxlMjQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTY3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy90ZXh0ZmlsZTI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy91bmRvMjQucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvdW5kbzI0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBjNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvdW5kbzI0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9ndW5pdC9zd2luZ3VpL2ltYWdlcy93aW5kb3diMTYucG5nIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvd2luZG93YjE2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTk1ZjliCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L2d1bml0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvZ3VuaXQvc3dpbmd1aS9pbWFnZXMvd2luZG93YjE2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvZ3VuaXQvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvZ3VuaXQvR3VuaXRUZXN0LmphdmEgYi9hbnRsci0zLjQvZ3VuaXQvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvZ3VuaXQvR3VuaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmODZkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ndW5pdC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci9ndW5pdC9HdW5pdFRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIG9yZy5hbnRsci5ndW5pdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgZ1VuaXQgaXRzZWxmLi4uLgorICovCitwdWJsaWMgY2xhc3MgR3VuaXRUZXN0CisgICAgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgICAgICovCisgICAgcHVibGljIEd1bml0VGVzdCggU3RyaW5nIHRlc3ROYW1lICkKKyAgICB7CisgICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggR3VuaXRUZXN0LmNsYXNzICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEd1bml0VGVzdCgpCisgICAgeworICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L2xpYi9hbnRsci0zLjQtY29tcGxldGUuamFyIGIvYW50bHItMy40L2xpYi9hbnRsci0zLjQtY29tcGxldGUuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTg1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvbGliL2FudGxyLTMuNC1jb21wbGV0ZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3BvbS54bWwgYi9hbnRsci0zLjQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY5Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3BvbS54bWwKQEAgLTAsMCArMSwzMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworCisgICAgPCEtLQorICAgICAgICBUaGUgQU5UTFIgTWF2ZW4gYXJ0aWZhY3RzIGFyZSBub3cgcmVsZWFzZWQgdmlhIHRoZSBTb25vdHlwZSBPU1MKKyAgICAgICAgcmVwb3NpdG9yeSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGFyZSBzeW5jZWQgdG8gTWF2ZW4gY2VudHJhbCAKKyAgICAgICAgd2l0aGluIGEgZmV3IG1pbnV0ZXMgb2YgaGl0dGluZyB0aGUgcmVsZWFzZSByZXBvIGZvciBTb25vdHlwZS4KKyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHdlIGluaGVyaXQgZnJvbSB0aGUgU29ub3R5cGUgcHJvdmlkZWQgcGFyZW50CisgICAgICAgIHBvbS4gSG93ZXZlciwgd2UgbXVzdCBhbHNvIGNvbmZpZ3VyZSBvdXIgLm0yL3NldHRpbmdzLnhtbCB0byBpbmNsdWRlCisgICAgICAgIHRoZSBzbmFwc2hvdCBhbmQgc3RhZ2luZyBzZXJ2ZXIgYW5kIHRoZSBzb25vdHlwZSBwYXNzd29yZC4gVGhpcyAKKyAgICAgICAgbWVhbnMgdGhhdCBvbmx5IEFOVExSIGRldmVsb3BlcnMgY2FuIHJlbGVhc2VkIHRoZSBhcnRpZmFjdHMsIGJ1dAorICAgICAgICBhbnlvbmUgY2FuIGJ1aWxkIGxvY2FsbHkuCisgICAgICAtLT4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXR5cGUub3NzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vc3MtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj43PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PiAgICAKKyAgICAKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFudGxyLW1hc3RlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgICA8bmFtZT5BTlRMUiBNYXN0ZXIgYnVpbGQgY29udHJvbCBQT00gMy40PC9uYW1lPgorICAgIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KKworCisKKyAgPCEtLQorICAgIFdoYXQgdmVyc2lvbiBvZiBBTlRMUiBhcmUgd2UgYnVpbGRpbmc/IFRoaXMgc2V0cyB0aGUKKyAgICB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIGFsbCBvdGhlciB0aGluZ3MgdGhhdCBhcmUgYnVpbHQKKyAgICBhcyBwYXJ0IG9mIGFuIEFOVExSIHJlbGVhc2UsIHVubGVzcyB0aGV5IG92ZXJyaWRlIG9yCisgICAgaWdub3JlIGl0LiBXZSBkbyB0aGlzIHZpYSBhIHByb3Blcml0ZXMgZmlsZSBmb3IgdGhpcworICAgIHBvbS4KKyAgICAtLT4KKworICA8IS0tCisgICAgIFRoaXMgaXMgdGhlIG1hc3RlciBwb20gZm9yIGJ1aWxkaW5nIHRoZSBBTlRMUgorICAgICB0b29sc2V0IGFuZCBydW50aW1lIChKYXZhKSBhdCB0aGUgc3BlY2lmaWMgbGV2ZWwKKyAgICAgZGVmaW5lZCBhYm92ZS4gSGVuY2Ugd2Ugc3BlY2lmeSBoZXJlIHRoZSBtb2R1bGVzIHRoYXQKKyAgICAgdGhpcyBwb20gd2lsbCBidWlsZCB3aGVuIHdlIGJ1aWxkIHRoaXMgcG9tIGluIGNlcnRhaW4gcHJvZmlsZXMuCisgICAgLS0+CisKKyAgPCEtLQorICAgIE1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50IChJLkUgc2hvdyB0aGF0CisgICAgYWxsIHRoZSBmaWxlcyBpbiB0aGUgc291cmNlIHRyZWUgYXJlIGluIFVURi04IGZvcm1hdC4KKyAgICAtLT4KKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgICAgIDxwcm9maWxlcz4KKyAgICAgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgICAgIDxpZD5zdGFuZGFyZDwvaWQ+CisgICAgICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZT5ydW50aW1lL0phdmE8L21vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZT50b29sPC9tb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGU+YW50bHIzLW1hdmVuLXBsdWdpbjwvbW9kdWxlPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlPmd1bml0PC9tb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGU+Z3VuaXQtbWF2ZW4tcGx1Z2luPC9tb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGU+YW50bHIzLW1hdmVuLWFyY2hldHlwZTwvbW9kdWxlPgorICAgICAgICAgICAgICAgIDwvbW9kdWxlcz4KKyAgICAgICAgICAgIDwvcHJvZmlsZT4KKworICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIEFjdGl2YXRlIHRoaXMgcHJvZmlsZSB0byBidWlsZCBPTkxZIHRoZSBVYmVyIGphciwgd2hpY2ggaXMgdGhlCisgICAgICAgICAgICAgICAgQU5UTFIgdG9vbCBhbmQgaXRzIGRlcGVuZGVuY2llcyAobm8gcGx1Z2lucyBldGMpLgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG12biAtRHViZXIgLURza2lwVGVzdHMgcGFja2FnZSBhc3NlbWJseTphc3NlbWJseQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgICAgIDxpZD51YmVyPC9pZD4KKyAgICAgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+dWJlcjwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPG1vZHVsZXM+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGU+cnVudGltZS9KYXZhPC9tb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGU+dG9vbDwvbW9kdWxlPgorICAgICAgICAgICAgICAgIDwvbW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGQgYW4gdWJlci1qYXIgZm9yIHRoZSBBTlRMUiBUb29sIHRoYXQgaXMgcGFja2FnZWQgd2l0aCBhbGwgdGhlIG90aGVyIGRlcGVuZGVuY2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIHRoZSBhbnRsci1ydW50aW1lIGFuZCBzdHJpbmd0ZW1wbGF0ZSBldGMuIFRoaXMgd2lsbCBiZSB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV2ZWxvcGVycywgd2hvIHRoZW4gZG8gbm90IG5lZWQgdG8gZG93bmxvYWQgYW55dGhpbmcgZWxzZSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyIHRoYXQgdGhleSBuZWVkIHN0cmluZ3RlbXBsYXRlLmphciBpbiB0aGVpciBDTEFTU1BBVEggYW5kIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRvZXMgbm90IHByZWNsdWRlIGFueSBvZiB0aGUgbW9kdWxlIGdlbmVyYXRlZCBqYXJzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyB1c2VkIG9uIHRoZWlyIG93biBvZiBjb3Vyc2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXJlLCB3ZSBhbHNvIGJ1aWxkIGEgbWFzdGVyIHNvdXJjZSBqYXIgYXMgSSB3YXMgdW5hYmxlIHRvIHB1cnN1YWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwbHVnaW4gdG8gdXNlIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zIGFuZCBub3QgaGF2ZSB0aGUgdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JldyB1cCBiZWNhdXNlIG9mIG11bHRpcGxlIG1vZHVsZXMgOi0oCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbyBub3QgbWFrZSB0aGUgY2hpbGQgbW9kdWxlcyBidWlsZCBhbiBhc3NlbWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPmFudGxyamFyLnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPmFudGxyc291cmNlcy54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IHRoYXQgd2Ugd2FudCB0aGUgcmVzdWx0aW5nIGphciB0byBiZSBleGVjdXRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGphdmEgLWphciwgd2hpY2ggd2UgZG8gYnkgbW9kaWZ5aW5nIHRoZSBtYW5pZmVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNvdXJzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmFudGxyLlRvb2w8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICAgICAgPGlkPnJlbGVhc2Utc2lnbi1hcnRpZmFjdHM8L2lkPgorICAgICAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZXBsb3k8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxtb2R1bGVzPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlPnJ1bnRpbWUvSmF2YTwvbW9kdWxlPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlPnRvb2w8L21vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZT5hbnRscjMtbWF2ZW4tcGx1Z2luPC9tb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGU+Z3VuaXQ8L21vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZT5ndW5pdC1tYXZlbi1wbHVnaW48L21vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZT5hbnRscjMtbWF2ZW4tYXJjaGV0eXBlPC9tb2R1bGU+CisgICAgICAgICAgICAgICAgPC9tb2R1bGVzPgorICAgICAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjg8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjEuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgICAgIAorICAgIDwvcHJvZmlsZXM+CisKKyAgPCEtLQorCisgICAgVGVsbCBNYXZlbiB3aGljaCBvdGhlciBhcnRpZmFjdHMgd2UgbmVlZCBpbiBvcmRlciB0bworICAgIGJ1aWxkLCBydW4gYW5kIHRlc3QgdGhlIEFOVExSIGphcnMuCisgICAgVGhpcyBpcyB0aGUgbWFzdGVyIHBvbSwgYW5kIHNvIGl0IG9ubHkgY29udGFpbnMgdGhvc2UKKyAgICBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0aGUgbW9kdWxlcyBiZWxvdworICAgIG9yIGFyZSBqdXN0IGluY2x1ZGVkIGZvciB0ZXN0CisgICAgLS0+CisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorCisgICAgICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjQuOC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworCisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KKworICAgIDxidWlsZD4KKworICAgICAgICA8ZGVmYXVsdEdvYWw+aW5zdGFsbDwvZGVmYXVsdEdvYWw+CisKKyAgICAgICAgPCEtLQorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmaWx0ZXIgZGVmaW5pdGlvbiBtZWFucyB0aGF0IGJvdGggdGhlIG1hc3RlcgorICAgICAgICAgICAgcHJvamVjdCBhbmQgdGhlIHN1YiBwcm9qZWN0cyB3aWxsIHJlYWQgaW4gYSBmaWxlIGluIHRoZSBzYW1lCisgICAgICAgICAgICBkaXJlY3RvcnkgYXMgdGhlIHBvbS54bWwgaXMgbG9jYXRlZCBhbmQgc2V0IGFueSBwcm9wZXJ0aWVzCisgICAgICAgICAgICB0aGF0IGFyZSBkZWZpbmVkIHRoZXJlIGluIHRoZSBzdGFuZGFyZCB4PXkgZm9ybWF0LiBUaGVzZQorICAgICAgICAgICAgcHJvcGVydGllcyBjYW4gdGhlbiBiZSByZWZlcmVuY2VkIHZpYSAke3h9IGluIGFueSByZXNvdXJjZQorICAgICAgICAgICAgZmlsZSBzcGVjaWZpZWQgaW4gYW55IHBvbS4gU28sIHRoZXJlIGlzIGEgbWFzdGVyIGFudGxyLmNvbmZpZworICAgICAgICAgICAgZmlsZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGlzIHBvbS54bWwgZmlsZSBhbmQgaGVyZSB5b3UgY2FuCisgICAgICAgICAgICBkZWZpbmUgYW55dGhpbmcgdGhhdCBpcyByZWxldmFudCB0byBhbGwgdGhlIG1vZHVsZXMgdGhhdCB3ZQorICAgICAgICAgICAgYnVpbGQgaGVyZS4gSG93ZXZlciBlYWNoIG1vZHVsZSBhbHNvIGhhcyBhbiBhbnRsci5jb25maWcgZmlsZQorICAgICAgICAgICAgd2hlcmUgeW91IGNhbiBvdmVycmlkZSBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSB0aGUgbWFzdGVyIGZpbGUgb3IKKyAgICAgICAgICAgIGRlZmluZSB0aGluZ3MgdGhhdCBhcmUgb25seSByZWxldmFudCB0byB0aGF0IG1vZHVsZS4KKyAgICAgICAgICAtLT4KKyAgICAgICAgPGZpbHRlcnM+CisgICAgICAgICAgICA8ZmlsdGVyPmFudGxyLmNvbmZpZzwvZmlsdGVyPgorICAgICAgICA8L2ZpbHRlcnM+CisKKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisKKyAgICAgICAgPHBsdWdpbnM+CisKKyAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkbnVtYmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYmV0YS0yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGZvcm1hdD57MCxkYXRlLE1NTSBkZCwgeXl5eX0gezAsdGltZSxrazptbTpzc308L2Zvcm1hdD4KKyAgICAgICAgICAgICAgICAgIDxpdGVtcz4KKyAgICAgICAgICAgICAgICAgICAgPGl0ZW0+dGltZXN0YW1wPC9pdGVtPgorICAgICAgICAgICAgICAgICAgPC9pdGVtcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y3JlYXRlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD5qc3IxNDwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5maW5kYnVncy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmaW5kYnVnc1htbE91dHB1dD50cnVlPC9maW5kYnVnc1htbE91dHB1dD4KKyAgICAgICAgICAgICAgICAgICAgPGZpbmRidWdzWG1sV2l0aE1lc3NhZ2VzPnRydWU8L2ZpbmRidWdzWG1sV2l0aE1lc3NhZ2VzPgorICAgICAgICAgICAgICAgICAgICA8eG1sT3V0cHV0PnRydWU8L3htbE91dHB1dD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIAorICAgICAgICA8L3BsdWdpbnM+CisKKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L0FVVEhPUlMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWEwZmFhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L0FVVEhPUlMKQEAgLTAsMCArMSBAQAorR2VvcmdlIFNjb3R0IDxnZW9yZ2UgZG90IHNjb3R0IGRhc2ggYW50bHIgYXQgZ21haWwgZG90IGNvbT46IE1haW4gZGV2ZWxvcGVyIG9mIEFjdGlvblNjcmlwdCB0YXJnZXQuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvTElDRU5TRSBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWQ1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvTElDRU5TRQpAQCAtMCwwICsxLDI2IEBACitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNiBUZXJlbmNlIFBhcnIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L1JFQURNRSBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2ZDZmMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9SRUFETUUKQEAgLTAsMCArMSw2NiBAQAorMSkgQUJPVVQKKz09PT09PT09CisKK1RoaXMgaXMgdGhlIEFjdGlvblNjcmlwdCBwYWNrYWdlICdhbnRscjMnLCB3aGljaCBpcyByZXF1aXJlZCB0byB1c2UgcGFyc2VycyBjcmVhdGVkCitieSB0aGUgQU5UTFIzIHRvb2wuIFNlZSA8aHR0cDovL3d3dy5hbnRsci5vcmcvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorQU5UTFIzLgorCisKKzIpIFNUQVRVUworPT09PT09PT09CisKK1RoZSBBY3Rpb25TY3JpcHQgdGFyZ2V0IGZvciBBTlRMUjMgaXMgY29uc2lkZXJlZCBhIHNvbGlkIGJldGEgYXQgdGhpcyBwb2ludC4gIE1vc3QgdGhpbmdzCitzaG91bGQgd29yaywgYnV0IGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiB0ZXN0cyBoYXMgbm90IGJlZW4gYnVpbHQgeWV0LCBzbyBzb21lIGFyZWFzIG1heQorYmUgdW50ZXN0ZWQuCisKKzMpIERPV05MT0FECis9PT09PT09PT09PQorCitUaGlzIHJ1bnRpbWUgaXMgcGFydCBvZiB0aGUgQU5UTFIgZGlzdHJpYnV0aW9uLiBUaGUgbGF0ZXN0IHZlcnNpb24gY2FuIGJlIGZvdW5kCithdCA8aHR0cDovL3d3dy5hbnRsci5vcmcvZG93bmxvYWQuaHRtbD4uCisKK0lmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgbGF0ZXN0LCBtb3N0IGJsZWVkaW5nIGVkZ2UgdmVyc2lvbiwgaGF2ZSBhIGxvb2sgYXQKK3RoZSBwZXJmb3JjZSBkZXBvdCBhdCA8aHR0cDovL2Zpc2hleWUyLmNlbnF1YS5jb20vYnJvd3NlL2FudGxyPi4gVGhlcmUgYXJlCit0YXJiYWxscyByZWFkeSB0byBkb3dubG9hZCwgc28geW91IGRvbid0IGhhdmUgdG8gaW5zdGFsbCB0aGUgcGVyZm9yY2UgY2xpZW50LgorCisKKzQpIFVTQUdFCis9PT09PT09PT09PT09PT0KKworSW5jbHVkZSB0aGUgYW50bHIzLnN3YyBmcm9tIHRoZSBsaWIgZGlyZWN0b3J5IGludG8geW91ciBmbGV4IHByb2plY3QuCisKKzUpIERPQ1VNRU5UQVRJT04KKz09PT09PT09PT09PT09PT0KKworQVBJIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBmaWxlICJhbnRscjMtYXNkb2MuemlwIiAgVXNlciBkb2N1bWVudGF0aW9uCisoYXMgZmFyIGFzIGl0IGV4aXN0cykgY2FuIGJlIGZvdW5kIGluIHRoZSB3aWtpCis8aHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9BbnRscjNBY3Rpb25TY3JpcHRUYXJnZXQ+CisKKworNikgUkVQT1JUSU5HIEJVR1MKKz09PT09PT09PT09PT09PT09CisKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBBTlRMUiBtYWlsaW5nIGxpc3QgCis8aHR0cDovL3d3dy5hbnRsci5vcmc6ODA4MC9tYWlsbWFuL2xpc3RpbmZvL2FudGxyLWludGVyZXN0PiBvcgorPGdlb3JnZS5zY290dC1hbnRybEBnbWFpbC5jb20+LiAgRGlyZWN0IGUtbWFpbCBpcyBwcmVmZXJhYmxlIGFzIHRoZSBhbnRsci1pbnRlcmVzdAorbGlzdCBpcyBub3QgcmVhZCBvbiBhIGRhaWx5IGJhc2lzIGJ5IHRoZSBtYWludGFpbmVycy4KKworRXhpc3RpbmcgYnVncyBtYXkgYXBwZWFyIHNvbWVkYXkgaW4gdGhlIGJ1Z3RyYWNrZXI6Cis8aHR0cDovL3d3dy5hbnRsci5vcmc6ODg4OC9icm93c2UvQU5UTFI+CisKKworNykgSEFDS0lORworPT09PT09PT09PQorCitPbmx5IHRoZSBydW50aW1lIHBhY2thZ2UgY2FuIGJlIGZvdW5kIGhlcmUuIFRoZXJlIGFyZSBhbHNvIHNvbWUgU3RyaW5nVGVtcGxhdGUKK2ZpbGVzIGluICdzcmMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0FjdGlvblNjcmlwdC8nIGFuZCBzb21lIEphdmEgY29kZSBpbgorJ3NyYy9vcmcvYW50bHIvY29kZWdlbi9BY3Rpb25TY3JpcHRUYXJnZXQuamF2YScgKG9mIHRoZSBtYWluIEFOVExSMyBzb3VyY2UKK2Rpc3RyaWJ1dGlvbikuCisKK1RoZSAncHJvamVjdCcgZGlyZWN0b3J5IGNvbnRhaW5zIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gcmVidWlsZCB0aGUgbGlicmFyeSBmcm9tIHNvdXJjZS4KK0l0IGFsc28gaW5jbHVkZXMgYWxsIHVuaXQgdGVzdHMuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGdlb3JnZS5zY290dC1hbnRsckBnbWFpbC5jb20+LiBGb3IgbGFyZ2VyIGNvZGUgY29udHJpYnV0aW9ucyB5b3UnbGwKK2hhdmUgdG8gc2lnbiB0aGUgIkRldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiIsIHdoaWNoIGNhbiBiZSBmb3VuZCBvbgorPGh0dHA6Ly93d3cuYW50bHIub3JnL2xpY2Vuc2UuaHRtbD4gb3IgdXNlIHRoZSBmZWVkYmFjayBmb3JtIGF0Cis8aHR0cDovL3d3dy5hbnRsci5vcmcvbWlzYy9mZWVkYmFjaz4uCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvbGliL2FudGxyMy5zd2MgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvbGliL2FudGxyMy5zd2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMGYyZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9saWIvYW50bHIzLnN3YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC8uYWN0aW9uU2NyaXB0UHJvcGVydGllcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0Ly5hY3Rpb25TY3JpcHRQcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2I4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC8uYWN0aW9uU2NyaXB0UHJvcGVydGllcwpAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGFjdGlvblNjcmlwdFByb3BlcnRpZXMgbWFpbkFwcGxpY2F0aW9uUGF0aD0iQW50bHIzUnVudGltZS5hcyIgdmVyc2lvbj0iMyI+Cis8Y29tcGlsZXIgYWRkaXRpb25hbENvbXBpbGVyQXJndW1lbnRzPSIiIGNvcHlEZXBlbmRlbnRGaWxlcz0iZmFsc2UiIGVuYWJsZU1vZHVsZURlYnVnPSJ0cnVlIiBnZW5lcmF0ZUFjY2Vzc2libGU9ImZhbHNlIiBodG1sRXhwcmVzc0luc3RhbGw9InRydWUiIGh0bWxHZW5lcmF0ZT0iZmFsc2UiIGh0bWxIaXN0b3J5TWFuYWdlbWVudD0iZmFsc2UiIGh0bWxQbGF5ZXJWZXJzaW9uPSI5LjAuMjgiIGh0bWxQbGF5ZXJWZXJzaW9uQ2hlY2s9InRydWUiIG91dHB1dEZvbGRlclBhdGg9ImJ1aWxkIiBzb3VyY2VGb2xkZXJQYXRoPSJzcmMiIHN0cmljdD0idHJ1ZSIgdXNlQXBvbGxvQ29uZmlnPSJ0cnVlIiB2ZXJpZnlEaWdlc3RzPSJ0cnVlIiB3YXJuPSJ0cnVlIj4KKzxjb21waWxlclNvdXJjZVBhdGgvPgorPGxpYnJhcnlQYXRoIGRlZmF1bHRMaW5rVHlwZT0iMSI+Cis8bGlicmFyeVBhdGhFbnRyeSBraW5kPSI0IiBwYXRoPSIiPgorPG1vZGlmaWVkRW50cmllcz4KKzxsaWJyYXJ5UGF0aEVudHJ5IGtpbmQ9IjMiIGxpbmtUeXBlPSI0IiBwYXRoPSIke1BST0pFQ1RfRlJBTUVXT1JLU30vbGlicy9mcmFtZXdvcmsuc3djIiB1c2VEZWZhdWx0TGlua1R5cGU9InRydWUiPgorPGNyb3NzRG9tYWluUnNscz4KKzxjcm9zc0RvbWFpblJzbEVudHJ5IGF1dG9FeHRyYWN0PSJ0cnVlIiBwb2xpY3lGaWxlVXJsPSIiIHJzbFVybD0iZnJhbWV3b3JrXzMuMC4wLjQ3Ny5zd3oiLz4KKzxjcm9zc0RvbWFpblJzbEVudHJ5IGF1dG9FeHRyYWN0PSJ0cnVlIiBwb2xpY3lGaWxlVXJsPSIiIHJzbFVybD0iZnJhbWV3b3JrXzMuMC4wLjQ3Ny5zd2YiLz4KKzwvY3Jvc3NEb21haW5Sc2xzPgorPC9saWJyYXJ5UGF0aEVudHJ5PgorPC9tb2RpZmllZEVudHJpZXM+Cis8L2xpYnJhcnlQYXRoRW50cnk+Cis8bGlicmFyeVBhdGhFbnRyeSBraW5kPSIxIiBsaW5rVHlwZT0iMSIgcGF0aD0ibGliIi8+Cis8L2xpYnJhcnlQYXRoPgorPHNvdXJjZUF0dGFjaG1lbnRQYXRoLz4KKzwvY29tcGlsZXI+Cis8YXBwbGljYXRpb25zPgorPGFwcGxpY2F0aW9uIHBhdGg9IkFudGxyM1J1bnRpbWUuYXMiLz4KKzxhcHBsaWNhdGlvbiBwYXRoPSJBbnRscjNUZXN0Lm14bWwiLz4KKzwvYXBwbGljYXRpb25zPgorPG1vZHVsZXMvPgorPGJ1aWxkQ1NTRmlsZXMvPgorPC9hY3Rpb25TY3JpcHRQcm9wZXJ0aWVzPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvLmZsZXhMaWJQcm9wZXJ0aWVzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvLmZsZXhMaWJQcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTA0NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC8uZmxleExpYlByb3BlcnRpZXMKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmbGV4TGliUHJvcGVydGllcyB2ZXJzaW9uPSIxIj4KKzxpbmNsdWRlQ2xhc3Nlcz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLkJpdFNldCIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25FcnJvck5vZGUiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZUFkYXB0b3IiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLnRyZWUuQmFzZVRyZWUiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRTZXRFeGNlcHRpb24iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuUGFyc2VyIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlTm9kZVN0cmVhbSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5SZXdyaXRlU3RyZWFtIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5MZXhlciIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5Ub2tlbkNvbnN0YW50cyIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3IiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLlBhcnNlclJ1bGVSZXR1cm5TY29wZSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuUnVsZVJldHVyblNjb3BlIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbiIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLlJlY29nbml6ZXJTaGFyZWRTdGF0ZSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQ29uc3RhbnRzIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtQ29uc3RhbnRzIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5Ub2tlblNvdXJjZSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVSdWxlUmV0dXJuU2NvcGUiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5FYXJseUV4aXRFeGNlcHRpb24iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW1TdGF0ZSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLkFOVExSRmlsZVN0cmVhbSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbSIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlUGFyc2VyIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS50cmVlLkJhc2VUcmVlQWRhcHRvciIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuSW50U3RyZWFtIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWUiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLk1pc3NpbmdUb2tlbkV4Y2VwdGlvbiIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiIvPgorPGNsYXNzRW50cnkgcGF0aD0ib3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5ERkEiLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLlRva2VuIi8+Cis8Y2xhc3NFbnRyeSBwYXRoPSJvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24iLz4KKzxjbGFzc0VudHJ5IHBhdGg9Im9yZy5hbnRsci5ydW50aW1lLlRva2VuU3RyZWFtIi8+Cis8L2luY2x1ZGVDbGFzc2VzPgorPGluY2x1ZGVSZXNvdXJjZXMvPgorPG5hbWVzcGFjZU1hbmlmZXN0cy8+Cis8L2ZsZXhMaWJQcm9wZXJ0aWVzPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvLnByb2plY3QgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM5Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvLnByb2plY3QKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+QW50bHIzUnVudGltZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPmNvbS5hZG9iZS5mbGV4YnVpbGRlci5wcm9qZWN0LmZsZXhidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5jb20uYWRvYmUuZmxleGJ1aWxkZXIucHJvamVjdC5mbGV4bGlibmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+Y29tLmFkb2JlLmZsZXhidWlsZGVyLnByb2plY3QuYWN0aW9uc2NyaXB0bmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2ZGE5OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNUdWUgRGVjIDExIDE2OjAxOjEzIFBTVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PXV0Zi04CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9SRUFETUUudHh0IGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQxZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvUkVBRE1FLnR4dApAQCAtMCwwICsxLDE0IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGZpbGVzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGFuZCB0aGUgYXNzb2NpYXRlZCB0ZXN0cy4KKworUnVubmluZyBVbml0IFRlc3RzCis9PT09PT09PT09PT09PT09PT0KK1RoZSB1bml0IHRlc3RzIGNhbiBiZSBydW4gdXNpbmcgdGhlIGFudCAidGVzdCIgdGFyZ2V0LiAgVGhlIHRlc3RzIHVzZSBmbGV4VW5pdCBhbmQgdGhlIGZsZXhVbml0IGFudCBpbnRlZ3JhdGlvbiBwcm92aWRlZCBieSBQZXRlciBNYXJ0aW4uCitGbGV4VW5pdCBpcyBhdmFpbGFibGUgYXQ6CisKK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hczNmbGV4dW5pdGxpYi8KKworVGhlIGxhdGVzdCBhbnQgaW50ZWdyYXRpb24gZnJvbSBQZXRlciBNYXJ0aW4gY2FuIGJlIGZvdW5kIG9uIGhpcyBibG9nOgorCitodHRwOi8vd2VibG9ncy5tYWNyb21lZGlhLmNvbS9wbWFydGluL2FyY2hpdmVzLzIwMDcvMDkvZmxleHVuaXRfZm9yX2FuXzIuY2ZtCisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvYnVpbGQueG1sIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmM2EyMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9idWlsZC54bWwKQEAgLTAsMCArMSw4NCBAQAorPHByb2plY3QgbmFtZT0iQW50bHIzQWN0aW9uU2NyaXB0UnVudGltZSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYWxsIj4KKworCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CisJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9saWIiLz4KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZG9jLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9kb2MiLz4KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdC5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vdGVzdCIvPgorCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC50ZXN0Lm91dHB1dC5kaXIiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfS9vdXRwdXQiLz4KKwk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjIi8+CisJCisJPHByb3BlcnR5IG5hbWU9IkZMRVhfSE9NRSIgdmFsdWU9IiR7ZW52LkZMRVhfSE9NRX0iLz4KKwkKKwk8IS0tIEFzc3VtZSBTREsgMy4wIG9yIGdyZWF0ZXIgaGFzIHRoZSBhbnQgdGFza3MgLS0+CisJPHRhc2tkZWYgcmVzb3VyY2U9ImZsZXhUYXNrcy50YXNrcyIgY2xhc3NwYXRoPSIke0ZMRVhfSE9NRX0vYW50L2xpYi9mbGV4VGFza3MuamFyIi8+CisJPHRhc2tkZWYgcmVzb3VyY2U9ImNvbS9hZG9iZS9hYy9hbnQvdGFza3MvdGFza3MucHJvcGVydGllcyIgY2xhc3NwYXRoPSIke2Jhc2VkaXJ9L2xpYi9GbGV4QW50VGFza3MuamFyIi8+CisKKwk8ZmlsZXNldCBpZD0ic291cmNlcyIgZGlyPSIke3NyYy5kaXJ9Ij4KKwkJPGluY2x1ZGUgbmFtZT0iKiovKi5hcyIvPgorCTwvZmlsZXNldD4KKwkKKwk8cGF0aGNvbnZlcnQgcHJvcGVydHk9InNvdXJjZUNsYXNzZXMiIHJlZmlkPSJzb3VyY2VzIiBwYXRoc2VwPSIgIj4KKwkJPGZpbHRlcm1hcHBlcj4KKwkJCTxyZXBsYWNlc3RyaW5nIGZyb209IiR7c3JjLmRpcn0vIiB0bz0iIi8+CQk8IS0tIFN0cmlwIG9mZiBkaXJlY3RvcnkgLS0+CisJCQk8cmVwbGFjZXN0cmluZyBmcm9tPSIuYXMiIHRvPSIiLz4JCQkJPCEtLSBTdHJpcCBvZmYgZXh0ZW5zaW9uIC0tPgorCQkJPHJlcGxhY2VzdHJpbmcgZnJvbT0iLyIgdG89Ii4iLz4JCQkJPCEtLSBDb252ZXJ0IHBhdGggdG8gcGFja2FnZSAtLT4KKwkJPC9maWx0ZXJtYXBwZXI+CisJPC9wYXRoY29udmVydD4KKwkKKwk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQiLz4KKwkKKwk8dGFyZ2V0IG5hbWU9ImNoZWNrLWVudiI+CisJCTxmYWlsPgorCSAgICAgPGNvbmRpdGlvbj4KKwkgICAgICAgPG5vdD4KKwkgICAgICAgICA8aXNzZXQgcHJvcGVydHk9IkZMRVhfSE9NRSIvPgorCSAgICAgICA8L25vdD4KKwkgICAgIDwvY29uZGl0aW9uPgorCSAgIDwvZmFpbD4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJjaGVjay1lbnYiPgorCQk8ZWNobz5GaWxlIGFyZSAke3NvdXJjZUNsYXNzZXN9PC9lY2hvPgorCQk8Y29tcGMgb3V0cHV0PSIke2J1aWxkLmxpYi5kaXJ9L2FudGxyMy5zd2MiIGluY2x1ZGUtY2xhc3Nlcz0iJHtzb3VyY2VDbGFzc2VzfSI+CisJCQk8bG9hZC1jb25maWcgZmlsZW5hbWU9IiR7RkxFWF9IT01FfS9mcmFtZXdvcmtzL2Fpci1jb25maWcueG1sIi8+CisJCQk8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke2Jhc2VkaXJ9L3NyYyIvPgorCQk8L2NvbXBjPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0cyI+CisJCTxteG1sYyBkZWJ1Zz0idHJ1ZSIgZmlsZT0iJHtiYXNlZGlyfS90ZXN0L0FudGxyM1Rlc3QubXhtbCIgb3V0cHV0PSIke2J1aWxkLnRlc3QuZGlyfS90ZXN0QW50bHIzLnN3ZiI+CisJCQk8c291cmNlLXBhdGggcGF0aC1lbGVtZW50PSIke2Jhc2VkaXJ9L3Rlc3QiLz4KKyAgICAgICAgICAgIDwhLS0gTGlzdCBvZiBTV0MgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIFNXQyBmaWxlcy4gLS0+CisgICAgICAgICAgICA8Y29tcGlsZXIubGlicmFyeS1wYXRoIGRpcj0iJHtiYXNlZGlyfSIgYXBwZW5kPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWIvKi5zd2MiIC8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbGQvbGliLyouc3djIiAvPgorICAgICAgICAgICAgPC9jb21waWxlci5saWJyYXJ5LXBhdGg+CisJCTwvbXhtbGM+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3RzIj4KKwkJPGZsZXh1bml0IHRpbWVvdXQ9IjAiIHN3Zj0iJHtidWlsZC50ZXN0LmRpcn0vdGVzdEFudGxyMy5zd2YiIHRvRGlyPSIke2J1aWxkLnRlc3Qub3V0cHV0LmRpcn0iIGhhbHRvbmZhaWx1cmU9ImZhbHNlIi8+IAorCQk8anVuaXRyZXBvcnQgdG9EaXI9IiR7YnVpbGQudGVzdC5vdXRwdXQuZGlyfSI+CisJCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGQudGVzdC5vdXRwdXQuZGlyfSI+CisJCQkgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvPgorCQkJICA8L2ZpbGVzZXQ+CisJCQkgIDxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke2J1aWxkLnRlc3Qub3V0cHV0LmRpcn0vaHRtbCIvPgorCQk8L2p1bml0cmVwb3J0PgorCTwvdGFyZ2V0PgorCQkKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKwkJPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iZG9jcyI+CisJCTxleGVjIGV4ZWN1dGFibGU9IiR7RkxFWF9IT01FfS9iaW4vYWFzZG9jIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisJCQk8YXJnIGxpbmU9Ii1kb2Mtc291cmNlcyAke3NyYy5kaXJ9Ii8+CisJCQk8YXJnIGxpbmU9Ii13aW5kb3ctdGl0bGUgJ0FOVExSIDMgUnVudGltZSciLz4KKwkJCTxhcmcgbGluZT0iLW91dHB1dCAke2J1aWxkLmRvYy5kaXJ9Ii8+CisJCTwvZXhlYz4KKwkJPHppcCBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L2FudGxyMy1hc2RvYy56aXAiPgorCQkJPHppcGZpbGVzZXQgZGlyPSIke2J1aWxkLmRvYy5kaXJ9IiBwcmVmaXg9ImFzZG9jIi8+CisJCTwvemlwPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvbGliL0ZsZXhBbnRUYXNrcy5qYXIgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9saWIvRmxleEFudFRhc2tzLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2YyNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvbGliL0ZsZXhBbnRUYXNrcy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvbGliL0ZsZXhVbml0T3B0aW9uYWwuc3djIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvbGliL0ZsZXhVbml0T3B0aW9uYWwuc3djCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjU1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9saWIvRmxleFVuaXRPcHRpb25hbC5zd2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvbGliL2ZsZXh1bml0LnN3YyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L2xpYi9mbGV4dW5pdC5zd2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBiZDBjZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L2xpYi9mbGV4dW5pdC5zd2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0FOVExSRmlsZVN0cmVhbS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUkZpbGVTdHJlYW0uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyZTAwNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUkZpbGVTdHJlYW0uYXMKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisJaW1wb3J0IGZsYXNoLmZpbGVzeXN0ZW0uRmlsZTsKKwlpbXBvcnQgZmxhc2guZmlsZXN5c3RlbS5GaWxlTW9kZTsKKwlpbXBvcnQgZmxhc2guZmlsZXN5c3RlbS5GaWxlU3RyZWFtOworCWltcG9ydCBmbGFzaC5zeXN0ZW0uU3lzdGVtOworCQorCXB1YmxpYyBjbGFzcyBBTlRMUkZpbGVTdHJlYW0gZXh0ZW5kcyBBTlRMUlN0cmluZ1N0cmVhbSB7CisJCXByb3RlY3RlZCB2YXIgX2ZpbGU6RmlsZTsKKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBBTlRMUkZpbGVTdHJlYW0oZmlsZTpGaWxlLCBlbmNvZGluZzpTdHJpbmcgPSBudWxsKSB7CisJCQlsb2FkKGZpbGUsIGVuY29kaW5nKTsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBsb2FkKGZpbGU6RmlsZSwgZW5jb2Rpbmc6U3RyaW5nID0gbnVsbCk6dm9pZCB7CisJCQlfZmlsZSA9IGZpbGU7CisJCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworCQkJCWVuY29kaW5nID0gRmlsZS5zeXN0ZW1DaGFyc2V0OworCQkJfQorCQkJCisJCQl2YXIgc3RyZWFtOkZpbGVTdHJlYW0gPSBuZXcgRmlsZVN0cmVhbSgpOworCQkJCisJCQl0cnkgeworCQkJCXN0cmVhbS5vcGVuKGZpbGUsIEZpbGVNb2RlLlJFQUQpOworCQkJCWRhdGEgPSBzdHJlYW0ucmVhZE11bHRpQnl0ZShmaWxlLnNpemUsIGVuY29kaW5nKTsKKwkJCQluID0gZGF0YS5sZW5ndGg7CisJCQl9CisJCQlmaW5hbGx5IHsKKwkJCQlzdHJlYW0uY2xvc2UoKTsKKwkJCX0KKwkJfQorCQkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCBzb3VyY2VOYW1lKCk6U3RyaW5nIHsKKwkJCXJldHVybiBfZmlsZS5uYW1lOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM3NWEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0FOVExSU3RyaW5nU3RyZWFtLmFzCkBAIC0wLDAgKzEsMjEyIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCisJcHVibGljIGNsYXNzIEFOVExSU3RyaW5nU3RyZWFtIGltcGxlbWVudHMgQ2hhclN0cmVhbSB7CisJCS8qKiBUaGUgZGF0YSBiZWluZyBzY2FubmVkICovCisJCXByb3RlY3RlZCB2YXIgZGF0YTpTdHJpbmc7CisJCisJCS8qKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSBpbiB0aGUgYnVmZmVyICovCisJCXByb3RlY3RlZCB2YXIgbjppbnQ7CisJCisJCS8qKiAwLi5uLTEgaW5kZXggaW50byBzdHJpbmcgb2YgbmV4dCBjaGFyICovCisJCXByb3RlY3RlZCB2YXIgcDppbnQgPSAwOworCQorCQkvKiogbGluZSBudW1iZXIgMS4ubiB3aXRoaW4gdGhlIGlucHV0ICovCisJCXByb3RlY3RlZCB2YXIgX2xpbmU6aW50ID0gMTsKKwkKKwkJLyoqIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgMC4ubi0xICovCisJCXByb3RlY3RlZCB2YXIgX2NoYXJQb3NpdGlvbkluTGluZTppbnQgPSAwOworCQorCQkvKiogdHJhY2tzIGhvdyBkZWVwIG1hcmsoKSBjYWxscyBhcmUgbmVzdGVkICovCisJCXByb3RlY3RlZCB2YXIgbWFya0RlcHRoOmludCA9IDA7CisJCisJCS8qKiBBIGxpc3Qgb2YgQ2hhclN0cmVhbVN0YXRlIG9iamVjdHMgdGhhdCB0cmFja3MgdGhlIHN0cmVhbSBzdGF0ZQorCQkgKiAgdmFsdWVzIGxpbmUsIGNoYXJQb3NpdGlvbkluTGluZSwgYW5kIHAgdGhhdCBjYW4gY2hhbmdlIGFzIHlvdQorCQkgKiAgbW92ZSB0aHJvdWdoIHRoZSBpbnB1dCBzdHJlYW0uICBJbmRleGVkIGZyb20gMS4ubWFya0RlcHRoLgorCSAgICAgKiAgQSBudWxsIGlzIGtlcHQgQCBpbmRleCAwLiAgQ3JlYXRlIHVwb24gZmlyc3QgY2FsbCB0byBtYXJrKCkuCisJCSAqLworCQlwcm90ZWN0ZWQgdmFyIG1hcmtlcnM6QXJyYXk7CisJCisJCS8qKiBUcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS4gKi8KKwkJcHJvdGVjdGVkIHZhciBsYXN0TWFya2VyOmludDsKKwkKKwkJcHJvdGVjdGVkIHZhciBfc291cmNlTmFtZTpTdHJpbmc7CisJCQorCSAgICBwcm90ZWN0ZWQgdmFyIF9saW5lRGVsaW1pdGVyOlN0cmluZzsKKwkgICAgCisJCS8qKiBDb3B5IGRhdGEgaW4gc3RyaW5nIHRvIGEgbG9jYWwgY2hhciBhcnJheSAqLworCQlwdWJsaWMgZnVuY3Rpb24gQU5UTFJTdHJpbmdTdHJlYW0oaW5wdXQ6U3RyaW5nID0gbnVsbCwgbGluZURlbGltaXRlcjpTdHJpbmcgPSAiXG4iKSB7CisJCQl0aGlzLl9saW5lRGVsaW1pdGVyID0gbGluZURlbGltaXRlcjsKKwkJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQkJdGhpcy5kYXRhID0gaW5wdXQ7CisJCQkJdGhpcy5uID0gaW5wdXQubGVuZ3RoOworCQkJfQorCQl9CisJCisJCS8qKiBSZXNldCB0aGUgc3RyZWFtIHNvIHRoYXQgaXQncyBpbiB0aGUgc2FtZSBzdGF0ZSBpdCB3YXMKKwkJICogIHdoZW4gdGhlIG9iamVjdCB3YXMgY3JlYXRlZCAqZXhjZXB0KiB0aGUgZGF0YSBhcnJheSBpcyBub3QKKwkJICogIHRvdWNoZWQuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTp2b2lkIHsKKwkJCXAgPSAwOworCQkJX2xpbmUgPSAxOworCQkJX2NoYXJQb3NpdGlvbkluTGluZSA9IDA7CisJCQltYXJrRGVwdGggPSAwOworCQl9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBjb25zdW1lKCk6dm9pZCB7CisJICAgICAgICBpZiAoIHAgPCBuICkgeworCQkJCV9jaGFyUG9zaXRpb25JbkxpbmUrKzsKKwkJCQlpZiAoIGRhdGEuY2hhckF0KHApPT1fbGluZURlbGltaXRlciApIHsKKwkJCQkJX2xpbmUrKzsKKwkJCQkJX2NoYXJQb3NpdGlvbkluTGluZT0wOworCQkJCX0KKwkgICAgICAgICAgICBwKys7CisJICAgICAgICB9CisJICAgIH0KKwkKKwkgICAgcHVibGljIGZ1bmN0aW9uIExBKGk6aW50KTppbnQgeworCQkJaWYgKCBpPT0wICkgeworCQkJCXJldHVybiAwOyAvLyB1bmRlZmluZWQKKwkJCX0KKwkJCWlmICggaTwwICkgeworCQkJCWkrKzsgLy8gZS5nLiwgdHJhbnNsYXRlIExBKC0xKSB0byB1c2Ugb2Zmc2V0IGk9MDsgdGhlbiBkYXRhW3ArMC0xXQorCQkJCWlmICggKHAraS0xKSA8IDAgKSB7CisJCQkJCXJldHVybiBDaGFyU3RyZWFtQ29uc3RhbnRzLkVPRjsgLy8gaW52YWxpZDsgbm8gY2hhciBiZWZvcmUgZmlyc3QgY2hhcgorCQkJCX0KKwkJCX0KKwkKKwkJCWlmICggKHAraS0xKSA+PSBuICkgeworCSAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtQ29uc3RhbnRzLkVPRjsKKwkgICAgICAgIH0KKwkJCXJldHVybiBkYXRhLmNoYXJDb2RlQXQocCtpLTEpOworCSAgICB9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBMVChpOmludCk6aW50IHsKKwkJCXJldHVybiBMQShpKTsKKwkJfQorCQorCQkvKiogUmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCBpbmRleCAwLi5uIHdoZXJlIG4gaW5kaWNhdGVzIHRoZQorCSAgICAgKiAgbGFzdCBzeW1ib2wgaGFzIGJlZW4gcmVhZC4gIFRoZSBpbmRleCBpcyB0aGUgaW5kZXggb2YgY2hhciB0bworCQkgKiAgYmUgcmV0dXJuZWQgZnJvbSBMQSgxKS4KKwkgICAgICovCisJICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgaW5kZXgoKTppbnQgeworCSAgICAgICAgcmV0dXJuIHA7CisJICAgIH0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBzaXplKCk6aW50IHsKKwkJCXJldHVybiBuOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBtYXJrKCk6aW50IHsKKwkgICAgICAgIGlmICggbWFya2Vycz09bnVsbCApIHsKKwkgICAgICAgICAgICBtYXJrZXJzID0gbmV3IEFycmF5KCk7CisJICAgICAgICAgICAgbWFya2Vycy5wdXNoKG51bGwpOyAvLyBkZXB0aCAwIG1lYW5zIG5vIGJhY2t0cmFja2luZywgbGVhdmUgYmxhbmsKKwkgICAgICAgIH0KKwkgICAgICAgIG1hcmtEZXB0aCsrOworCQkJdmFyIHN0YXRlOkNoYXJTdHJlYW1TdGF0ZSA9IG51bGw7CisJCQlpZiAoIG1hcmtEZXB0aD49bWFya2Vycy5sZW5ndGggKSB7CisJCQkJc3RhdGUgPSBuZXcgQ2hhclN0cmVhbVN0YXRlKCk7CisJCQkJbWFya2Vycy5wdXNoKHN0YXRlKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXN0YXRlID0gQ2hhclN0cmVhbVN0YXRlKG1hcmtlcnNbbWFya0RlcHRoXSk7CisJCQl9CisJCQlzdGF0ZS5wID0gcDsKKwkJCXN0YXRlLmxpbmUgPSBfbGluZTsKKwkJCXN0YXRlLmNoYXJQb3NpdGlvbkluTGluZSA9IF9jaGFyUG9zaXRpb25JbkxpbmU7CisJCQlsYXN0TWFya2VyID0gbWFya0RlcHRoOworCQkJcmV0dXJuIG1hcmtEZXB0aDsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gcmV3aW5kVG8obTppbnQpOnZvaWQgeworCQkJdmFyIHN0YXRlOkNoYXJTdHJlYW1TdGF0ZSA9IENoYXJTdHJlYW1TdGF0ZShtYXJrZXJzW21dKTsKKwkJCS8vIHJlc3RvcmUgc3RyZWFtIHN0YXRlCisJCQlzZWVrKHN0YXRlLnApOworCQkJX2xpbmUgPSBzdGF0ZS5saW5lOworCQkJX2NoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLmNoYXJQb3NpdGlvbkluTGluZTsKKwkJCXJlbGVhc2UobSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJld2luZCgpOnZvaWQgeworCQkJcmV3aW5kVG8obGFzdE1hcmtlcik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJlbGVhc2UobWFya2VyOmludCk6dm9pZCB7CisJCQkvLyB1bndpbmQgYW55IG90aGVyIG1hcmtlcnMgbWFkZSBhZnRlciBtIGFuZCByZWxlYXNlIG0KKwkJCW1hcmtEZXB0aCA9IG1hcmtlcjsKKwkJCS8vIHJlbGVhc2UgdGhpcyBtYXJrZXIKKwkJCW1hcmtEZXB0aC0tOworCQl9CisJCisJCS8qKiBjb25zdW1lKCkgYWhlYWQgdW50aWwgcD09aW5kZXg7IGNhbid0IGp1c3Qgc2V0IHA9aW5kZXggYXMgd2UgbXVzdAorCQkgKiAgdXBkYXRlIGxpbmUgYW5kIGNoYXJQb3NpdGlvbkluTGluZS4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBzZWVrKGluZGV4OmludCk6dm9pZCB7CisJCQlpZiAoIGluZGV4PD1wICkgeworCQkJCXAgPSBpbmRleDsgLy8ganVzdCBqdW1wOyBkb24ndCB1cGRhdGUgc3RyZWFtIHN0YXRlIChsaW5lLCAuLi4pCisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8gc2VlayBmb3J3YXJkLCBjb25zdW1lIHVudGlsIHAgaGl0cyBpbmRleAorCQkJd2hpbGUgKCBwPGluZGV4ICkgeworCQkJCWNvbnN1bWUoKTsKKwkJCX0KKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gc3Vic3RyaW5nKHN0YXJ0OmludCwgc3RvcDppbnQpOlN0cmluZyB7CisJCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcoc3RhcnQsIHN0b3AgKyAxKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGxpbmUoKTppbnQgeworCQkJcmV0dXJuIF9saW5lOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgY2hhclBvc2l0aW9uSW5MaW5lKCk6aW50IHsKKwkJCXJldHVybiBfY2hhclBvc2l0aW9uSW5MaW5lOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgbGluZShsaW5lOmludCk6dm9pZCB7CisJCQl0aGlzLl9saW5lID0gbGluZTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGNoYXJQb3NpdGlvbkluTGluZShwb3M6aW50KTp2b2lkIHsKKwkJCXRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9IHBvczsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBzb3VyY2VOYW1lKCk6U3RyaW5nIHsKKwkJCXJldHVybiBfc291cmNlTmFtZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIHNldCBzb3VyY2VOYW1lKHNvdXJjZU5hbWU6U3RyaW5nKTp2b2lkIHsKKwkJCV9zb3VyY2VOYW1lID0gc291cmNlTmFtZTsKKwkJfQorCQkKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQmFzZVJlY29nbml6ZXIuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQmFzZVJlY29nbml6ZXIuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1MzNjNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9CYXNlUmVjb2duaXplci5hcwpAQCAtMCwwICsxLDgxMyBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisJCisJLyoqIEEgZ2VuZXJpYyByZWNvZ25pemVyIHRoYXQgY2FuIGhhbmRsZSByZWNvZ25pemVycyBnZW5lcmF0ZWQgZnJvbQorCSAqICBsZXhlciwgcGFyc2VyLCBhbmQgdHJlZSBncmFtbWFycy4gIFRoaXMgaXMgYWxsIHRoZSBwYXJzaW5nCisJICogIHN1cHBvcnQgY29kZSBlc3NlbnRpYWxseTsgbW9zdCBvZiBpdCBpcyBlcnJvciByZWNvdmVyeSBzdHVmZiBhbmQKKwkgKiAgYmFja3RyYWNraW5nLgorCSAqLworCXB1YmxpYyBjbGFzcyBCYXNlUmVjb2duaXplciB7CisJCXB1YmxpYyBzdGF0aWMgY29uc3QgTUVNT19SVUxFX0ZBSUxFRDppbnQgPSAtMjsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBNRU1PX1JVTEVfVU5LTk9XTjppbnQgPSAtMTsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBJTklUSUFMX0ZPTExPV19TVEFDS19TSVpFOmludCA9IDEwMDsKKwkKKwkJLy8gY29waWVzIGZyb20gVG9rZW4gb2JqZWN0IGZvciBjb252ZW5pZW5jZSBpbiBhY3Rpb25zCisJCXB1YmxpYyBzdGF0aWMgY29uc3QgREVGQVVMVF9UT0tFTl9DSEFOTkVMOmludCA9IFRva2VuQ29uc3RhbnRzLkRFRkFVTFRfQ0hBTk5FTDsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBISURERU46aW50ID0gVG9rZW5Db25zdGFudHMuSElEREVOX0NIQU5ORUw7CisJCisJCXB1YmxpYyBzdGF0aWMgY29uc3QgTkVYVF9UT0tFTl9SVUxFX05BTUU6U3RyaW5nID0gIm5leHRUb2tlbiI7CisJCisJCS8qKiBTdGF0ZSBvZiBhIGxleGVyLCBwYXJzZXIsIG9yIHRyZWUgcGFyc2VyIGFyZSBjb2xsZWN0ZWQgaW50byBhIHN0YXRlCisJCSAqICBvYmplY3Qgc28gdGhlIHN0YXRlIGNhbiBiZSBzaGFyZWQuICBUaGlzIHNoYXJpbmcgaXMgbmVlZGVkIHRvCisJCSAqICBoYXZlIG9uZSBncmFtbWFyIGltcG9ydCBvdGhlcnMgYW5kIHNoYXJlIHNhbWUgZXJyb3IgdmFyaWFibGVzCisJCSAqICBhbmQgb3RoZXIgc3RhdGUgdmFyaWFibGVzLiAgSXQncyBhIGtpbmQgb2YgZXhwbGljaXQgbXVsdGlwbGUKKwkJICogIGluaGVyaXRhbmNlIHZpYSBkZWxlZ2F0aW9uIG9mIG1ldGhvZHMgYW5kIHNoYXJlZCBzdGF0ZS4KKwkJICogCisJCSAqLworCQlwdWJsaWMgdmFyIHN0YXRlOlJlY29nbml6ZXJTaGFyZWRTdGF0ZTsgIC8vIFRPRE8gLSBQbGFjZSBpbiBwcml2YXRlIE5hbWVzcGFjZSAtIGNhbm5vdCBiZSBwcml2YXRlIAorCQorCQlwdWJsaWMgZnVuY3Rpb24gQmFzZVJlY29nbml6ZXIoc3RhdGU6UmVjb2duaXplclNoYXJlZFN0YXRlID0gbnVsbCkgeworCQkJaWYgKCBzdGF0ZSA9PSBudWxsICkgeyAvLyBkb24ndCBldmVyIGxldCB1cyBoYXZlIGEgbnVsbCBzdGF0ZQorCQkJCXN0YXRlID0gbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpOworCQkJfQorCQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwkJCQorCQl9CisJCisJCS8qKiByZXNldCB0aGUgcGFyc2VyJ3Mgc3RhdGU7IHN1YmNsYXNzZXMgbXVzdCByZXdpbmRzIHRoZSBpbnB1dCBzdHJlYW0gKi8KKwkJcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6dm9pZCB7CisJCQkvLyB3YWNrIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBlcnJvciByZWNvdmVyeQorCQkJaWYgKHN0YXRlID09IG51bGwpIHsKKwkJCSAgICByZXR1cm47CisJCQl9CisJCQlzdGF0ZS5fZnNwID0gLTE7CisJCQlzdGF0ZS5lcnJvclJlY292ZXJ5ID0gZmFsc2U7CisJCQlzdGF0ZS5sYXN0RXJyb3JJbmRleCA9IC0xOworCQkJc3RhdGUuZmFpbGVkID0gZmFsc2U7CisJCQlzdGF0ZS5zeW50YXhFcnJvcnMgPSAwOworCQkJLy8gd2FjayBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gYmFja3RyYWNraW5nIGFuZCBtZW1vaXphdGlvbgorCQkJc3RhdGUuYmFja3RyYWNraW5nID0gMDsKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgc3RhdGUucnVsZU1lbW8hPW51bGwgJiYgaSA8IHN0YXRlLnJ1bGVNZW1vLmxlbmd0aDsgaSsrKSB7IC8vIHdpcGUgY2FjaGUKKwkJCQlzdGF0ZS5ydWxlTWVtb1tpXSA9IG51bGw7CisJCQl9CisJCX0KKwkKKyAgICAJLyoqIE1hdGNoIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFnYWluc3QgdHR5cGUuICBBdHRlbXB0CisJCSAqICBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIGVycm9yIHJlY292ZXJ5LiAgSWYKKwkJICogIHRoYXQgZmFpbHMsIHRocm93IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi4KKwkJICoKKwkJICogIFRvIHR1cm4gb2ZmIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IKKwkJICogIHJlY292ZXJ5LCBvdmVycmlkZSBtaXNtYXRjaFJlY292ZXIoKSBhbmQgaGF2ZSBpdCBjYWxsCisJCSAqICBwbGFpbiBtaXNtYXRjaCgpLCB3aGljaCBkb2VzIG5vdCByZWNvdmVyLiAgVGhlbiBhbnkgZXJyb3IKKwkJICogIGluIGEgcnVsZSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBhbmQgaW1tZWRpYXRlIGV4aXQgZnJvbQorCQkgKiAgcnVsZS4gIFJ1bGUgd291bGQgcmVjb3ZlciBieSByZXN5bmNocm9uaXppbmcgdG8gdGhlIHNldCBvZgorCQkgKiAgc3ltYm9scyB0aGF0IGNhbiBmb2xsb3cgcnVsZSByZWYuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gbWF0Y2hTdHJlYW0oaW5wdXQ6SW50U3RyZWFtLCB0dHlwZTppbnQsIGZvbGxvdzpCaXRTZXQpOk9iamVjdCB7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWF0Y2ggIisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgxKSk7CisJCQl2YXIgbWF0Y2hlZFN5bWJvbDpPYmplY3QgPSBnZXRDdXJyZW50SW5wdXRTeW1ib2woaW5wdXQpOworCQkJaWYgKCBpbnB1dC5MQSgxKT09dHR5cGUgKSB7CisJCQkJaW5wdXQuY29uc3VtZSgpOworCQkJCXN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKwkJCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKwkJCQlyZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKwkJCX0KKwkJCWlmICggc3RhdGUuYmFja3RyYWNraW5nPjAgKSB7CisJCQkJc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKwkJCQlyZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKwkJCX0KKwkJCW1hdGNoZWRTeW1ib2wgPSByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbihpbnB1dCwgdHR5cGUsIGZvbGxvdyk7CisJCQlyZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKwkJfQorCQorCQkvKiogTWF0Y2ggdGhlIHdpbGRjYXJkOiBpbiBhIHN5bWJvbCAqLworCQlwdWJsaWMgZnVuY3Rpb24gbWF0Y2hBbnlTdHJlYW0oaW5wdXQ6SW50U3RyZWFtKTp2b2lkIHsKKwkJCXN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKwkJCXN0YXRlLmZhaWxlZCA9IGZhbHNlOworCQkJaW5wdXQuY29uc3VtZSgpOworCQl9CisKKyAgICAJcHVibGljIGZ1bmN0aW9uIG1pc21hdGNoSXNVbndhbnRlZFRva2VuKGlucHV0OkludFN0cmVhbSwgdHR5cGU6aW50KTpCb29sZWFuIHsKKyAgICAJCXJldHVybiBpbnB1dC5MQSgyKT09dHR5cGU7CisgICAgCX0KKwkKKyAgICAJcHVibGljIGZ1bmN0aW9uIG1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQ6SW50U3RyZWFtLCBmb2xsb3c6Qml0U2V0KTpCb29sZWFuIHsKKyAgICAJCWlmICggZm9sbG93PT1udWxsICkgeworICAgIAkJCS8vIHdlIGhhdmUgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvbGxvdzsgd2UgY2FuIG9ubHkgY29uc3VtZQorICAgIAkJCS8vIGEgc2luZ2xlIHRva2VuIGFuZCBob3BlIGZvciB0aGUgYmVzdAorICAgIAkJCXJldHVybiBmYWxzZTsKKyAgICAJCX0KKyAgICAgCQkvLyBjb21wdXRlIHdoYXQgY2FuIGZvbGxvdyB0aGlzIGdyYW1tYXIgZWxlbWVudCByZWZlcmVuY2UKKyAgICAJCWlmICggZm9sbG93Lm1lbWJlcihUb2tlbkNvbnN0YW50cy5FT1JfVE9LRU5fVFlQRSkgKSB7CisJCQkJdmFyIHZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlOkJpdFNldCA9IGNvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVygpOworCQkJCWZvbGxvdyA9IGZvbGxvdy5vcih2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSk7CisJCQkJaWYgKCBzdGF0ZS5fZnNwPj0wICkgeyAvLyByZW1vdmUgRU9SIGlmIHdlJ3JlIG5vdCB0aGUgc3RhcnQgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgIGZvbGxvdy5yZW1vdmUoVG9rZW5Db25zdGFudHMuRU9SX1RPS0VOX1RZUEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAJCX0KKyAgICAJCS8vIGlmIGN1cnJlbnQgdG9rZW4gaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgY291bGQgY29tZSBhZnRlciBzZXQKKwkJCS8vIHRoZW4gd2Uga25vdyB3ZSdyZSBtaXNzaW5nIGEgdG9rZW47IGVycm9yIHJlY292ZXJ5IGlzIGZyZWUgdG8KKwkJCS8vICJpbnNlcnQiIHRoZSBtaXNzaW5nIHRva2VuCisKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMVCgxKT0iKygoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKTsKKwkKKwkJCS8vIEJpdFNldCBjYW5ub3QgaGFuZGxlIG5lZ2F0aXZlIG51bWJlcnMgbGlrZSAtMSAoRU9GKSBzbyBJIGxlYXZlIEVPUgorCQkJLy8gaW4gZm9sbG93IHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmYWxsIG9mIHRoZSBzdGFydCBzeW1ib2wgaXMKKwkJCS8vIGluIHRoZSBzZXQgKEVPRiBjYW4gZm9sbG93KS4KKwkJCWlmICggZm9sbG93Lm1lbWJlcihpbnB1dC5MQSgxKSkgfHwgZm9sbG93Lm1lbWJlcihUb2tlbkNvbnN0YW50cy5FT1JfVE9LRU5fVFlQRSkgKSB7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxUKDEpPT0iKygoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKyIgaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgZm9sbG93czsgaW5zZXJ0aW5nLi4uIik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisgICAgCX0KKyAgICAKKyAgICAJLyoqIEZhY3RvciBvdXQgd2hhdCB0byBkbyB1cG9uIHRva2VuIG1pc21hdGNoIHNvIHRyZWUgcGFyc2VycyBjYW4gYmVoYXZlCisJCSAqICBkaWZmZXJlbnRseS4gIE92ZXJyaWRlIGFuZCBjYWxsIG1pc21hdGNoUmVjb3ZlcihpbnB1dCwgdHR5cGUsIGZvbGxvdykKKwkJICogIHRvIGdldCBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbi4gIFVzZSB0aGlzIHRvIHR1cm4gb2YKKwkJICogIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gYW5kIGRlbGV0aW9uLiBPdmVycmlkZSBtaXNtYXRjaFJlY292ZXIKKwkJICogIHRvIGNhbGwgdGhpcyBpbnN0ZWFkLgorCQkgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIG1pc21hdGNoKGlucHV0OkludFN0cmVhbSwgdHR5cGU6aW50LCBmb2xsb3c6Qml0U2V0KTp2b2lkCisJCXsKKyAgICAJCWlmICggbWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4oaW5wdXQsIHR0eXBlKSApIHsKKyAgICAJCQl0aHJvdyBuZXcgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpOworICAgIAkJfQorICAgIAkJZWxzZSBpZiAoIG1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQsIGZvbGxvdykgKSB7CisgICAgCQkJdGhyb3cgbmV3IE1pc3NpbmdUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQsIG51bGwpOworICAgIAkJfQorICAgIAkJdGhyb3cgbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpOworCQl9CisJCisgICAgCS8qKiBSZXBvcnQgYSByZWNvZ25pdGlvbiBwcm9ibGVtLgorICAgIAkgKgorICAgIAkgKiAgVGhpcyBtZXRob2Qgc2V0cyBlcnJvclJlY292ZXJ5IHRvIGluZGljYXRlIHRoZSBwYXJzZXIgaXMgcmVjb3ZlcmluZworICAgIAkgKiAgbm90IHBhcnNpbmcuICBPbmNlIGluIHJlY292ZXJ5IG1vZGUsIG5vIGVycm9ycyBhcmUgZ2VuZXJhdGVkLgorICAgIAkgKiAgVG8gZ2V0IG91dCBvZiByZWNvdmVyeSBtb2RlLCB0aGUgcGFyc2VyIG11c3Qgc3VjY2Vzc2Z1bGx5IG1hdGNoCisgICAgCSAqICBhIHRva2VuIChhZnRlciBhIHJlc3luYykuICBTbyBpdCB3aWxsIGdvOgorICAgIAkgKgorICAgIAkgKiAJCTEuIGVycm9yIG9jY3VycworICAgIAkgKiAJCTIuIGVudGVyIHJlY292ZXJ5IG1vZGUsIHJlcG9ydCBlcnJvcgorICAgIAkgKiAJCTMuIGNvbnN1bWUgdW50aWwgdG9rZW4gZm91bmQgaW4gcmVzeW5jaCBzZXQKKyAgICAJICogCQk0LiB0cnkgdG8gcmVzdW1lIHBhcnNpbmcKKyAgICAJICogCQk1LiBuZXh0IG1hdGNoKCkgd2lsbCByZXNldCBlcnJvclJlY292ZXJ5IG1vZGUKKyAgICAJICoKKyAgICAJICogIElmIHlvdSBvdmVycmlkZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSBzeW50YXhFcnJvcnMgaWYgeW91IGNhcmUgYWJvdXQgdGhhdC4KKyAgICAJICovCisJCXB1YmxpYyBmdW5jdGlvbiByZXBvcnRFcnJvcihlOlJlY29nbml0aW9uRXhjZXB0aW9uKTp2b2lkIHsKKwkJCS8vIGlmIHdlJ3ZlIGFscmVhZHkgcmVwb3J0ZWQgYW4gZXJyb3IgYW5kIGhhdmUgbm90IG1hdGNoZWQgYSB0b2tlbgorCQkJLy8geWV0IHN1Y2Nlc3NmdWxseSwgZG9uJ3QgcmVwb3J0IGFueSBlcnJvcnMuCisJCQlpZiAoIHN0YXRlLmVycm9yUmVjb3ZlcnkgKSB7CisJCQkJLy9TeXN0ZW0uZXJyLnByaW50KCJbU1BVUklPVVNdICIpOworCQkJCXJldHVybjsKKwkJCX0KKwkgICAgCXN0YXRlLnN5bnRheEVycm9ycysrOyAvLyBkb24ndCBjb3VudCBzcHVyaW91cworCQkJc3RhdGUuZXJyb3JSZWNvdmVyeSA9IHRydWU7CisJCisJCQlkaXNwbGF5UmVjb2duaXRpb25FcnJvcih0aGlzLnRva2VuTmFtZXMsIGUpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBkaXNwbGF5UmVjb2duaXRpb25FcnJvcih0b2tlbk5hbWVzOkFycmF5LAorCQkJCQkJCQkJCQllOlJlY29nbml0aW9uRXhjZXB0aW9uKTp2b2lkCisJCXsKKwkJCXZhciBoZHI6U3RyaW5nID0gZ2V0RXJyb3JIZWFkZXIoZSk7CisJCQl2YXIgbXNnOlN0cmluZyA9IGdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKKwkJCWVtaXRFcnJvck1lc3NhZ2UoaGRyKyIgIittc2cpOworCQl9CisJCisJCS8qKiBXaGF0IGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIHZhcmlvdXMKKwkJICogIGV4Y2VwdGlvbiB0eXBlcz8KKwkJICoKKwkJICogIE5vdCB2ZXJ5IG9iamVjdC1vcmllbnRlZCBjb2RlLCBidXQgSSBsaWtlIGhhdmluZyBhbGwgZXJyb3IgbWVzc2FnZQorCQkgKiAgZ2VuZXJhdGlvbiB3aXRoaW4gb25lIG1ldGhvZCByYXRoZXIgdGhhbiBzcHJlYWQgYW1vbmcgYWxsIG9mIHRoZQorCQkgKiAgZXhjZXB0aW9uIGNsYXNzZXMuIFRoaXMgYWxzbyBtYWtlcyBpdCBtdWNoIGVhc2llciBmb3IgdGhlIGV4Y2VwdGlvbgorCQkgKiAgaGFuZGxpbmcgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgZG8gbm90IGhhdmUgdG8gaGF2ZSBwb2ludGVycyBiYWNrCisJCSAqICB0byB0aGlzIG9iamVjdCB0byBhY2Nlc3MgdXRpbGl0eSByb3V0aW5lcyBhbmQgc28gb24uIEFsc28sIGNoYW5naW5nCisJCSAqICB0aGUgbWVzc2FnZSBmb3IgYW4gZXhjZXB0aW9uIHR5cGUgd291bGQgYmUgZGlmZmljdWx0IGJlY2F1c2UgeW91CisJCSAqICB3b3VsZCBoYXZlIHRvIHN1YmNsYXNzaW5nIGV4Y2VwdGlvbiwgYnV0IHRoZW4gc29tZWhvdyBnZXQgQU5UTFIKKwkJICogIHRvIG1ha2UgdGhvc2Uga2luZHMgb2YgZXhjZXB0aW9uIG9iamVjdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdC4KKwkJICogIFRoaXMgbG9va3Mgd2VpcmQsIGJ1dCB0cnVzdCBtZS0taXQgbWFrZXMgdGhlIG1vc3Qgc2Vuc2UgaW4gdGVybXMKKwkJICogIG9mIGZsZXhpYmlsaXR5LgorCQkgKgorCQkgKiAgRm9yIGdyYW1tYXIgZGVidWdnaW5nLCB5b3Ugd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoaXMgdG8gYWRkCisJCSAqICBtb3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YWNrIGZyYW1lIHdpdGgKKwkJICogIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2soZSwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSkgYW5kLAorCQkgKiAgZm9yIG5vIHZpYWJsZSBhbHRzLCB0aGUgZGVjaXNpb24gZGVzY3JpcHRpb24gYW5kIHN0YXRlIGV0Yy4uLgorCQkgKgorCQkgKiAgT3ZlcnJpZGUgdGhpcyB0byBjaGFuZ2UgdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkIGZvciBvbmUgb3IgbW9yZQorCQkgKiAgZXhjZXB0aW9uIHR5cGVzLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlOlJlY29nbml0aW9uRXhjZXB0aW9uLCB0b2tlbk5hbWVzOkFycmF5KTpTdHJpbmcgeworCQkJdmFyIG1zZzpTdHJpbmcgPSBlLm1lc3NhZ2U7CisJCQl2YXIgdG9rZW5OYW1lOlN0cmluZyA9IG51bGw7CisgICAgCQlpZiAoIGUgaXMgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiApIHsKKyAgICAJCQl2YXIgdXRlOlVud2FudGVkVG9rZW5FeGNlcHRpb24gPSBVbndhbnRlZFRva2VuRXhjZXB0aW9uKGUpOworICAgIAkJCXRva2VuTmFtZT0iPHVua25vd24+IjsKKyAgICAJCQlpZiAoIHV0ZS5leHBlY3Rpbmc9PSBUb2tlbkNvbnN0YW50cy5FT0YgKSB7CisgICAgCQkJCXRva2VuTmFtZSA9ICJFT0YiOworICAgIAkJCX0KKyAgICAJCQllbHNlIHsKKyAgICAJCQkJdG9rZW5OYW1lID0gdG9rZW5OYW1lc1t1dGUuZXhwZWN0aW5nXTsKKyAgICAJCQl9CisgICAgCQkJbXNnID0gImV4dHJhbmVvdXMgaW5wdXQgIitnZXRUb2tlbkVycm9yRGlzcGxheSh1dGUudW5leHBlY3RlZFRva2VuKSsKKyAgICAJCQkJIiBleHBlY3RpbmcgIit0b2tlbk5hbWU7CisgICAgCQl9CisgICAgCQllbHNlIGlmICggZSBpcyBNaXNzaW5nVG9rZW5FeGNlcHRpb24gKSB7CisgICAgCQkJdmFyIG1pdGU6TWlzc2luZ1Rva2VuRXhjZXB0aW9uID0gTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGUpOworICAgIAkJCXRva2VuTmFtZT0iPHVua25vd24+IjsKKyAgICAJCQlpZiAoIG1pdGUuZXhwZWN0aW5nID09IFRva2VuQ29uc3RhbnRzLkVPRiApIHsKKyAgICAJCQkJdG9rZW5OYW1lID0gIkVPRiI7CisgICAgCQkJfQorICAgIAkJCWVsc2UgeworICAgIAkJCQl0b2tlbk5hbWUgPSB0b2tlbk5hbWVzW21pdGUuZXhwZWN0aW5nXTsKKyAgICAJCQl9CisgICAgCQkJbXNnID0gIm1pc3NpbmcgIit0b2tlbk5hbWUrIiBhdCAiK2dldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pOworICAgIAkJfSAgCQkJCisJCQllbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKSB7CisJCQkJdmFyIG10ZTpNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gPSBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oZSk7CisJCQkJdG9rZW5OYW1lPSI8dW5rbm93bj4iOworCQkJCWlmICggbXRlLmV4cGVjdGluZz09IFRva2VuQ29uc3RhbnRzLkVPRiApIHsKKwkJCQkJdG9rZW5OYW1lID0gIkVPRiI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl0b2tlbk5hbWUgPSB0b2tlbk5hbWVzW210ZS5leHBlY3RpbmddOworCQkJCX0KKwkJCQltc2cgPSAibWlzbWF0Y2hlZCBpbnB1dCAiK2dldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pKworCQkJCQkiIGV4cGVjdGluZyAiK3Rva2VuTmFtZTsKKwkJCX0KKwkJCWVsc2UgaWYgKCBlIGlzIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiApIHsKKwkJCQl2YXIgbXRuZTpNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24gPSBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oZSk7CisJCQkJdG9rZW5OYW1lPSI8dW5rbm93bj4iOworCQkJCWlmICggbXRuZS5leHBlY3Rpbmc9PVRva2VuQ29uc3RhbnRzLkVPRiApIHsKKwkJCQkJdG9rZW5OYW1lID0gIkVPRiI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl0b2tlbk5hbWUgPSB0b2tlbk5hbWVzW210bmUuZXhwZWN0aW5nXTsKKwkJCQl9CisJCQkJbXNnID0gIm1pc21hdGNoZWQgdHJlZSBub2RlOiAiK210bmUubm9kZSsKKwkJCQkJIiBleHBlY3RpbmcgIit0b2tlbk5hbWU7CisJCQl9CisJCQllbHNlIGlmICggZSBpcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApIHsKKwkJCQl2YXIgbnZhZTpOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA9IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGUpOworCQkJCS8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiZGVjaXNpb249PDwiK252YWUuZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIj4+IgorCQkJCS8vIGFuZCAiKGRlY2lzaW9uPSIrbnZhZS5kZWNpc2lvbk51bWJlcisiKSBhbmQKKwkJCQkvLyAic3RhdGUgIitudmFlLnN0YXRlTnVtYmVyCisJCQkJbXNnID0gIm5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBpbnB1dCAiK2dldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pOworCQkJfQorCQkJZWxzZSBpZiAoIGUgaXMgRWFybHlFeGl0RXhjZXB0aW9uICkgeworCQkJCXZhciBlZWU6RWFybHlFeGl0RXhjZXB0aW9uID0gRWFybHlFeGl0RXhjZXB0aW9uKGUpOworCQkJCS8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiKGRlY2lzaW9uPSIrZWVlLmRlY2lzaW9uTnVtYmVyKyIpIgorCQkJCW1zZyA9ICJyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGlucHV0ICIrCisJCQkJCWdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pOworCQkJfQorCQkJZWxzZSBpZiAoIGUgaXMgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiApIHsKKwkJCQl2YXIgbXNlOk1pc21hdGNoZWRTZXRFeGNlcHRpb24gPSBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKGUpOworCQkJCW1zZyA9ICJtaXNtYXRjaGVkIGlucHV0ICIrZ2V0VG9rZW5FcnJvckRpc3BsYXkoZS50b2tlbikrCisJCQkJCSIgZXhwZWN0aW5nIHNldCAiK21zZS5leHBlY3Rpbmc7CisJCQl9CisJCQllbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICkgeworCQkJCXZhciBtbnNlOk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gPSBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKGUpOworCQkJCW1zZyA9ICJtaXNtYXRjaGVkIGlucHV0ICIrZ2V0VG9rZW5FcnJvckRpc3BsYXkoZS50b2tlbikrCisJCQkJCSIgZXhwZWN0aW5nIHNldCAiK21uc2UuZXhwZWN0aW5nOworCQkJfQorCQkJZWxzZSBpZiAoIGUgaXMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uICkgeworCQkJCXZhciBmcGU6RmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uID0gRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGUpOworCQkJCW1zZyA9ICJydWxlICIrZnBlLnJ1bGVOYW1lKyIgZmFpbGVkIHByZWRpY2F0ZTogeyIrCisJCQkJCWZwZS5wcmVkaWNhdGVUZXh0KyJ9PyI7CisJCQl9CisJCQlyZXR1cm4gbXNnOworCQl9CisKKyAgICAJLyoqIEdldCBudW1iZXIgb2YgcmVjb2duaXRpb24gZXJyb3JzIChsZXhlciwgcGFyc2VyLCB0cmVlIHBhcnNlcikuICBFYWNoCisgICAgCSAqICByZWNvZ25pemVyIHRyYWNrcyBpdHMgb3duIG51bWJlci4gIFNvIHBhcnNlciBhbmQgbGV4ZXIgZWFjaCBoYXZlCisgICAgCSAqICBzZXBhcmF0ZSBjb3VudC4gIERvZXMgbm90IGNvdW50IHRoZSBzcHVyaW91cyBlcnJvcnMgZm91bmQgYmV0d2VlbgorICAgIAkgKiAgYW4gZXJyb3IgYW5kIG5leHQgdmFsaWQgdG9rZW4gbWF0Y2gKKyAgICAJICoKKyAgICAJICogIFNlZSBhbHNvIHJlcG9ydEVycm9yKCkKKyAgICAJICovCisgICAgCXB1YmxpYyBmdW5jdGlvbiBnZXQgbnVtYmVyT2ZTeW50YXhFcnJvcnMoKTppbnQgeworICAgIAkJcmV0dXJuIHN0YXRlLnN5bnRheEVycm9yczsKKyAgICAJfQorCQorCQkvKiogV2hhdCBpcyB0aGUgZXJyb3IgaGVhZGVyLCBub3JtYWxseSBsaW5lL2NoYXJhY3RlciBwb3NpdGlvbiBpbmZvcm1hdGlvbj8gKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldEVycm9ySGVhZGVyKGU6UmVjb2duaXRpb25FeGNlcHRpb24pOlN0cmluZyB7CisJCQlyZXR1cm4gImxpbmUgIitlLmxpbmUrIjoiK2UuY2hhclBvc2l0aW9uSW5MaW5lOworCQl9CisJCisJCS8qKiBIb3cgc2hvdWxkIGEgdG9rZW4gYmUgZGlzcGxheWVkIGluIGFuIGVycm9yIG1lc3NhZ2U/IFRoZSBkZWZhdWx0CisJCSAqICBpcyB0byBkaXNwbGF5IGp1c3QgdGhlIHRleHQsIGJ1dCBkdXJpbmcgZGV2ZWxvcG1lbnQgeW91IG1pZ2h0CisJCSAqICB3YW50IHRvIGhhdmUgYSBsb3Qgb2YgaW5mb3JtYXRpb24gc3BpdCBvdXQuICBPdmVycmlkZSBpbiB0aGF0IGNhc2UKKwkJICogIHRvIHVzZSB0LnRvU3RyaW5nKCkgKHdoaWNoLCBmb3IgQ29tbW9uVG9rZW4sIGR1bXBzIGV2ZXJ5dGhpbmcgYWJvdXQKKwkJICogIHRoZSB0b2tlbikuIFRoaXMgaXMgYmV0dGVyIHRoYW4gZm9yY2luZyB5b3UgdG8gb3ZlcnJpZGUgYSBtZXRob2QgaW4KKwkJICogIHlvdXIgdG9rZW4gb2JqZWN0cyBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIHRvIGdvIG1vZGlmeSB5b3VyIGxleGVyCisJCSAqICBzbyB0aGF0IGl0IGNyZWF0ZXMgYSBuZXcgSmF2YSB0eXBlLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldFRva2VuRXJyb3JEaXNwbGF5KHQ6VG9rZW4pOlN0cmluZyB7CisJCQl2YXIgczpTdHJpbmcgPSB0LnRleHQ7CisJCQlpZiAoIHM9PW51bGwgKSB7CisJCQkJaWYgKCB0LnR5cGU9PVRva2VuQ29uc3RhbnRzLkVPRiApIHsKKwkJCQkJcyA9ICI8RU9GPiI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzID0gIjwiK3QudHlwZSsiPiI7CisJCQkJfQorCQkJfQorCQkJcyA9IHMucmVwbGFjZSgiXG4iLCJcXFxcbiIpOworCQkJcyA9IHMucmVwbGFjZSgiXHIiLCJcXFxcciIpOworCQkJcyA9IHMucmVwbGFjZSgiXHQiLCJcXFxcdCIpOworCQkJcmV0dXJuICInIitzKyInIjsKKwkJfQorCQorCQkvKiogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHdoZXJlIGVycm9yIG1lc3NhZ2VzIGdvICovCisJCXB1YmxpYyBmdW5jdGlvbiBlbWl0RXJyb3JNZXNzYWdlKG1zZzpTdHJpbmcpOnZvaWQgeworCQkJICAgIHRyYWNlKG1zZyk7CisJCX0KKwkKKyAgICAJLyoqIFJlY292ZXIgZnJvbSBhbiBlcnJvciBmb3VuZCBvbiB0aGUgaW5wdXQgc3RyZWFtLiAgVGhpcyBpcworICAgIAkgKiAgZm9yIE5vVmlhYmxlQWx0IGFuZCBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zLiAgSWYgeW91IGVuYWJsZQorICAgIAkgKiAgc2luZ2xlIHRva2VuIGluc2VydGlvbiBhbmQgZGVsZXRpb24sIHRoaXMgd2lsbCB1c3VhbGx5IG5vdAorICAgIAkgKiAgaGFuZGxlIG1pc21hdGNoZWQgc3ltYm9sIGV4Y2VwdGlvbnMgYnV0IHRoZXJlIGNvdWxkIGJlIGEgbWlzbWF0Y2hlZAorICAgIAkgKiAgdG9rZW4gdGhhdCB0aGUgbWF0Y2goKSByb3V0aW5lIGNvdWxkIG5vdCByZWNvdmVyIGZyb20uCisgICAgCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gcmVjb3ZlclN0cmVhbShpbnB1dDpJbnRTdHJlYW0sIHJlOlJlY29nbml0aW9uRXhjZXB0aW9uKTp2b2lkIHsKKwkJCWlmICggc3RhdGUubGFzdEVycm9ySW5kZXg9PWlucHV0LmluZGV4KSB7CisJCQkJLy8gdWggb2gsIGFub3RoZXIgZXJyb3IgYXQgc2FtZSB0b2tlbiBpbmRleDsgbXVzdCBiZSBhIGNhc2UKKwkJCQkvLyB3aGVyZSBMVCgxKSBpcyBpbiB0aGUgcmVjb3ZlcnkgdG9rZW4gc2V0IHNvIG5vdGhpbmcgaXMKKwkJCQkvLyBjb25zdW1lZDsgY29uc3VtZSBhIHNpbmdsZSB0b2tlbiBzbyBhdCBsZWFzdCB0byBwcmV2ZW50CisJCQkJLy8gYW4gaW5maW5pdGUgbG9vcDsgdGhpcyBpcyBhIGZhaWxzYWZlLgorCQkJCWlucHV0LmNvbnN1bWUoKTsKKwkJCX0KKwkJCXN0YXRlLmxhc3RFcnJvckluZGV4ID0gaW5wdXQuaW5kZXg7CisJCQl2YXIgZm9sbG93U2V0OkJpdFNldCA9IGNvbXB1dGVFcnJvclJlY292ZXJ5U2V0KCk7CisJCQliZWdpblJlc3luYygpOworCQkJY29uc3VtZVVudGlsKGlucHV0LCBmb2xsb3dTZXQpOworCQkJZW5kUmVzeW5jKCk7CisJCX0KKwkKKwkJLyoqIEEgaG9vayB0byBsaXN0ZW4gaW4gb24gdGhlIHRva2VuIGNvbnN1bXB0aW9uIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKwkJICogIFRoZSBEZWJ1Z1BhcnNlciBzdWJjbGFzc2VzIHRoaXMgdG8gZmlyZSBldmVudHMgdG8gdGhlIGxpc3RlbnRlci4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBiZWdpblJlc3luYygpOnZvaWQgeworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBlbmRSZXN5bmMoKTp2b2lkIHsKKwkJfQorCQorCQkvKiAgQ29tcHV0ZSB0aGUgZXJyb3IgcmVjb3Zlcnkgc2V0IGZvciB0aGUgY3VycmVudCBydWxlLiAgRHVyaW5nCisJCSAqICBydWxlIGludm9jYXRpb24sIHRoZSBwYXJzZXIgcHVzaGVzIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuCisJCSAqICBmb2xsb3cgdGhhdCBydWxlIHJlZmVyZW5jZSBvbiB0aGUgc3RhY2s7IHRoaXMgYW1vdW50cyB0bworCQkgKiAgY29tcHV0aW5nIEZJUlNUIG9mIHdoYXQgZm9sbG93cyB0aGUgcnVsZSByZWZlcmVuY2UgaW4gdGhlCisJCSAqICBlbmNsb3NpbmcgcnVsZS4gVGhpcyBsb2NhbCBmb2xsb3cgc2V0IG9ubHkgaW5jbHVkZXMgdG9rZW5zCisJCSAqICBmcm9tIHdpdGhpbiB0aGUgcnVsZTsgaS5lLiwgdGhlIEZJUlNUIGNvbXB1dGF0aW9uIGRvbmUgYnkKKwkJICogIEFOVExSIHN0b3BzIGF0IHRoZSBlbmQgb2YgYSBydWxlLgorCQkgKgorCQkgKiAgRVhBTVBMRQorCQkgKgorCQkgKiAgV2hlbiB5b3UgZmluZCBhICJubyB2aWFibGUgYWx0IGV4Y2VwdGlvbiIsIHRoZSBpbnB1dCBpcyBub3QKKwkJICogIGNvbnNpc3RlbnQgd2l0aCBhbnkgb2YgdGhlIGFsdGVybmF0aXZlcyBmb3IgcnVsZSByLiAgVGhlIGJlc3QKKwkJICogIHRoaW5nIHRvIGRvIGlzIHRvIGNvbnN1bWUgdG9rZW5zIHVudGlsIHlvdSBzZWUgc29tZXRoaW5nIHRoYXQKKwkJICogIGNhbiBsZWdhbGx5IGZvbGxvdyBhIGNhbGwgdG8gciAqb3IqIGFueSBydWxlIHRoYXQgY2FsbGVkIHIuCisJCSAqICBZb3UgZG9uJ3Qgd2FudCB0aGUgZXhhY3Qgc2V0IG9mIHZpYWJsZSBuZXh0IHRva2VucyBiZWNhdXNlIHRoZQorCQkgKiAgaW5wdXQgbWlnaHQganVzdCBiZSBtaXNzaW5nIGEgdG9rZW4tLXlvdSBtaWdodCBjb25zdW1lIHRoZQorCQkgKiAgcmVzdCBvZiB0aGUgaW5wdXQgbG9va2luZyBmb3Igb25lIG9mIHRoZSBtaXNzaW5nIHRva2Vucy4KKwkJICoKKwkJICogIENvbnNpZGVyIGdyYW1tYXI6CisJCSAqCisJCSAqICBhIDogJ1snIGIgJ10nCisJCSAqICAgIHwgJygnIGIgJyknCisJCSAqICAgIDsKKwkJICogIGIgOiBjICdeJyBJTlQgOworCQkgKiAgYyA6IElECisJCSAqICAgIHwgSU5UCisJCSAqICAgIDsKKwkJICoKKwkJICogIEF0IGVhY2ggcnVsZSBpbnZvY2F0aW9uLCB0aGUgc2V0IG9mIHRva2VucyB0aGF0IGNvdWxkIGZvbGxvdworCQkgKiAgdGhhdCBydWxlIGlzIHB1c2hlZCBvbiBhIHN0YWNrLiAgSGVyZSBhcmUgdGhlIHZhcmlvdXMgImxvY2FsIgorCQkgKiAgZm9sbG93IHNldHM6CisJCSAqCisJCSAqICBGT0xMT1coYjFfaW5fYSkgPSBGSVJTVCgnXScpID0gJ10nCisJCSAqICBGT0xMT1coYjJfaW5fYSkgPSBGSVJTVCgnKScpID0gJyknCisJCSAqICBGT0xMT1coY19pbl9iKSA9IEZJUlNUKCdeJykgPSAnXicKKwkJICoKKwkJICogIFVwb24gZXJyb25lb3VzIGlucHV0ICJbXSIsIHRoZSBjYWxsIGNoYWluIGlzCisJCSAqCisJCSAqICBhIC0+IGIgLT4gYworCQkgKgorCQkgKiAgYW5kLCBoZW5jZSwgdGhlIGZvbGxvdyBjb250ZXh0IHN0YWNrIGlzOgorCQkgKgorCQkgKiAgZGVwdGggIGxvY2FsIGZvbGxvdyBzZXQgICAgIGFmdGVyIGNhbGwgdG8gcnVsZQorCQkgKiAgICAwICAgICAgICAgPEVPRj4gICAgICAgICAgICAgICAgICAgIGEgKGZyb20gbWFpbigpKQorCQkgKiAgICAxICAgICAgICAgICddJyAgICAgICAgICAgICAgICAgICAgIGIKKwkJICogICAgMyAgICAgICAgICAnXicgICAgICAgICAgICAgICAgICAgICBjCisJCSAqCisJCSAqICBOb3RpY2UgdGhhdCAnKScgaXMgbm90IGluY2x1ZGVkLCBiZWNhdXNlIGIgd291bGQgaGF2ZSB0byBoYXZlCisJCSAqICBiZWVuIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IGNvbnRleHQgaW4gcnVsZSBhIGZvciAnKScgdG8gYmUKKwkJICogIGluY2x1ZGVkLgorCQkgKgorCQkgKiAgRm9yIGVycm9yIHJlY292ZXJ5LCB3ZSBjYW5ub3QgY29uc2lkZXIgRk9MTE9XKGMpCisJCSAqICAoY29udGV4dC1zZW5zaXRpdmUgb3Igb3RoZXJ3aXNlKS4gIFdlIG5lZWQgdGhlIGNvbWJpbmVkIHNldCBvZgorCQkgKiAgYWxsIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXRzLS10aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdAorCQkgKiAgY291bGQgZm9sbG93IGFueSByZWZlcmVuY2UgaW4gdGhlIGNhbGwgY2hhaW4uICBXZSBuZWVkIHRvCisJCSAqICByZXN5bmMgdG8gb25lIG9mIHRob3NlIHRva2Vucy4gIE5vdGUgdGhhdCBGT0xMT1coYyk9J14nIGFuZCBpZgorCQkgKiAgd2UgcmVzeW5jJ2QgdG8gdGhhdCB0b2tlbiwgd2UnZCBjb25zdW1lIHVudGlsIEVPRi4gIFdlIG5lZWQgdG8KKwkJICogIHN5bmMgdG8gY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XcyBmb3IgYSwgYiwgYW5kIGM6IHsnXScsJ14nfS4KKwkJICogIEluIHRoaXMgY2FzZSwgZm9yIGlucHV0ICJbXSIsIExBKDEpIGlzIGluIHRoaXMgc2V0IHNvIHdlIHdvdWxkCisJCSAqICBub3QgY29uc3VtZSBhbnl0aGluZyBhbmQgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgcnVsZSBjIHdvdWxkCisJCSAqICByZXR1cm4gbm9ybWFsbHkuICBJdCB3b3VsZCBub3QgZmluZCB0aGUgcmVxdWlyZWQgJ14nIHRob3VnaC4KKwkJICogIEF0IHRoaXMgcG9pbnQsIGl0IGdldHMgYSBtaXNtYXRjaGVkIHRva2VuIGVycm9yIGFuZCB0aHJvd3MgYW4KKwkJICogIGV4Y2VwdGlvbiAoc2luY2UgTEEoMSkgaXMgbm90IGluIHRoZSB2aWFibGUgZm9sbG93aW5nIHRva2VuCisJCSAqICBzZXQpLiAgVGhlIHJ1bGUgZXhjZXB0aW9uIGhhbmRsZXIgdHJpZXMgdG8gcmVjb3ZlciwgYnV0IGZpbmRzCisJCSAqICB0aGUgc2FtZSByZWNvdmVyeSBzZXQgYW5kIGRvZXNuJ3QgY29uc3VtZSBhbnl0aGluZy4gIFJ1bGUgYgorCQkgKiAgZXhpdHMgbm9ybWFsbHkgcmV0dXJuaW5nIHRvIHJ1bGUgYS4gIE5vdyBpdCBmaW5kcyB0aGUgJ10nIChhbmQKKwkJICogIHdpdGggdGhlIHN1Y2Nlc3NmdWwgbWF0Y2ggZXhpdHMgZXJyb3JSZWNvdmVyeSBtb2RlKS4KKwkJICoKKwkJICogIFNvLCB5b3UgY25hIHNlZSB0aGF0IHRoZSBwYXJzZXIgd2Fsa3MgdXAgY2FsbCBjaGFpbiBsb29raW5nCisJCSAqICBmb3IgdGhlIHRva2VuIHRoYXQgd2FzIGEgbWVtYmVyIG9mIHRoZSByZWNvdmVyeSBzZXQuCisJCSAqCisJCSAqICBFcnJvcnMgYXJlIG5vdCBnZW5lcmF0ZWQgaW4gZXJyb3JSZWNvdmVyeSBtb2RlLgorCQkgKgorCQkgKiAgQU5UTFIncyBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gaXMgYmFzZWQgdXBvbiBvcmlnaW5hbCBpZGVhczoKKwkJICoKKwkJICogICJBbGdvcml0aG1zICsgRGF0YSBTdHJ1Y3R1cmVzID0gUHJvZ3JhbXMiIGJ5IE5pa2xhdXMgV2lydGgKKwkJICoKKwkJICogIGFuZAorCQkgKgorCQkgKiAgIkEgbm90ZSBvbiBlcnJvciByZWNvdmVyeSBpbiByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXJzIjoKKwkJICogIGh0dHA6Ly9wb3J0YWwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9OTQ3OTAyLjk0NzkwNQorCQkgKgorCQkgKiAgTGF0ZXIsIEpvc2VmIEdyb3NjaCBoYWQgc29tZSBnb29kIGlkZWFzOgorCQkgKgorCQkgKiAgIkVmZmljaWVudCBhbmQgQ29tZm9ydGFibGUgRXJyb3IgUmVjb3ZlcnkgaW4gUmVjdXJzaXZlIERlc2NlbnQKKwkJICogIFBhcnNlcnMiOgorCQkgKiAgZnRwOi8vd3d3LmNvY29sYWIuY29tL3Byb2R1Y3RzL2NvY2t0YWlsL2RvY2E0LnBzL2VsbC5wcy56aXAKKwkJICoKKwkJICogIExpa2UgR3Jvc2NoIEkgaW1wbGVtZW50ZWQgbG9jYWwgRk9MTE9XIHNldHMgdGhhdCBhcmUgY29tYmluZWQKKwkJICogIGF0IHJ1bi10aW1lIHVwb24gZXJyb3IgdG8gYXZvaWQgb3ZlcmhlYWQgZHVyaW5nIHBhcnNpbmcuCisJCSAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQoKTpCaXRTZXQgeworCQkJcmV0dXJuIGNvbWJpbmVGb2xsb3dzKGZhbHNlKTsKKwkJfQorCQorCQkvKiogQ29tcHV0ZSB0aGUgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldCBmb3IgY3VycmVudCBydWxlLgorCQkgKiAgVGhpcyBpcyBzZXQgb2YgdG9rZW4gdHlwZXMgdGhhdCBjYW4gZm9sbG93IGEgc3BlY2lmaWMgcnVsZQorCQkgKiAgcmVmZXJlbmNlIGdpdmVuIGEgc3BlY2lmaWMgY2FsbCBjaGFpbi4gIFlvdSBnZXQgdGhlIHNldCBvZgorCQkgKiAgdmlhYmxlIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBjb21lIG5leHQgKGxvb2thaGVhZCBkZXB0aCAxKQorCQkgKiAgZ2l2ZW4gdGhlIGN1cnJlbnQgY2FsbCBjaGFpbi4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUKKwkJICogIGRlZmluaXRpb24gb2YgcGxhaW4gRk9MTE9XIGZvciBydWxlIHI6CisJCSAqCisJCSAqICAgRk9MTE9XKHIpPXt4IHwgUz0+KmFscGhhIHIgYmV0YSBpbiBHIGFuZCB4IGluIEZJUlNUKGJldGEpfQorCQkgKgorCQkgKiAgd2hlcmUgeCBpbiBUKiBhbmQgYWxwaGEsIGJldGEgaW4gVio7IFQgaXMgc2V0IG9mIHRlcm1pbmFscyBhbmQKKwkJICogIFYgaXMgdGhlIHNldCBvZiB0ZXJtaW5hbHMgYW5kIG5vbnRlcm1pbmFscy4gIEluIG90aGVyIHdvcmRzLAorCQkgKiAgRk9MTE9XKHIpIGlzIHRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBmb2xsb3cKKwkJICogIHJlZmVyZW5jZXMgdG8gciBpbiAqYW55KiBzZW50ZW50aWFsIGZvcm0gKGNvbnRleHQpLiAgQXQKKwkJICogIHJ1bnRpbWUsIGhvd2V2ZXIsIHdlIGtub3cgcHJlY2lzZWx5IHdoaWNoIGNvbnRleHQgYXBwbGllcyBhcworCQkgKiAgd2UgaGF2ZSB0aGUgY2FsbCBjaGFpbi4gIFdlIG1heSBjb21wdXRlIHRoZSBleGFjdCAocmF0aGVyCisJCSAqICB0aGFuIGNvdmVyaW5nIHN1cGVyc2V0KSBzZXQgb2YgZm9sbG93aW5nIHRva2Vucy4KKwkJICoKKwkJICogIEZvciBleGFtcGxlLCBjb25zaWRlciBncmFtbWFyOgorCQkgKgorCQkgKiAgc3RhdCA6IElEICc9JyBleHByICc7JyAgICAgIC8vIEZPTExPVyhzdGF0KT09e0VPRn0KKwkJICogICAgICAgfCAicmV0dXJuIiBleHByICcuJworCQkgKiAgICAgICA7CisJCSAqICBleHByIDogYXRvbSAoJysnIGF0b20pKiA7ICAgLy8gRk9MTE9XKGV4cHIpPT17JzsnLCcuJywnKSd9CisJCSAqICBhdG9tIDogSU5UICAgICAgICAgICAgICAgICAgLy8gRk9MTE9XKGF0b20pPT17JysnLCcpJywnOycsJy4nfQorCQkgKiAgICAgICB8ICcoJyBleHByICcpJworCQkgKiAgICAgICA7CisJCSAqCisJCSAqICBUaGUgRk9MTE9XIHNldHMgYXJlIGFsbCBpbmNsdXNpdmUgd2hlcmVhcyBjb250ZXh0LXNlbnNpdGl2ZQorCQkgKiAgRk9MTE9XIHNldHMgYXJlIHByZWNpc2VseSB3aGF0IGNvdWxkIGZvbGxvdyBhIHJ1bGUgcmVmZXJlbmNlLgorCQkgKiAgRm9yIGlucHV0IGlucHV0ICJpPSgzKTsiLCBoZXJlIGlzIHRoZSBkZXJpdmF0aW9uOgorCQkgKgorCQkgKiAgc3RhdCA9PiBJRCAnPScgZXhwciAnOycKKwkJICogICAgICAgPT4gSUQgJz0nIGF0b20gKCcrJyBhdG9tKSogJzsnCisJCSAqICAgICAgID0+IElEICc9JyAnKCcgZXhwciAnKScgKCcrJyBhdG9tKSogJzsnCisJCSAqICAgICAgID0+IElEICc9JyAnKCcgYXRvbSAnKScgKCcrJyBhdG9tKSogJzsnCisJCSAqICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAoJysnIGF0b20pKiAnOycKKwkJICogICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICc7JworCQkgKgorCQkgKiAgQXQgdGhlICIzIiB0b2tlbiwgeW91J2QgaGF2ZSBhIGNhbGwgY2hhaW4gb2YKKwkJICoKKwkJICogICAgc3RhdCAtPiBleHByIC0+IGF0b20gLT4gZXhwciAtPiBhdG9tCisJCSAqCisJCSAqICBXaGF0IGNhbiBmb2xsb3cgdGhhdCBzcGVjaWZpYyBuZXN0ZWQgcmVmIHRvIGF0b20/ICBFeGFjdGx5ICcpJworCQkgKiAgYXMgeW91IGNhbiBzZWUgYnkgbG9va2luZyBhdCB0aGUgZGVyaXZhdGlvbiBvZiB0aGlzIHNwZWNpZmljCisJCSAqICBpbnB1dC4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgRk9MTE9XKGF0b20pPXsnKycsJyknLCc7JywnLid9LgorCQkgKgorCQkgKiAgWW91IHdhbnQgdGhlIGV4YWN0IHZpYWJsZSB0b2tlbiBzZXQgd2hlbiByZWNvdmVyaW5nIGZyb20gYQorCQkgKiAgdG9rZW4gbWlzbWF0Y2guICBVcG9uIHRva2VuIG1pc21hdGNoLCBpZiBMQSgxKSBpcyBtZW1iZXIgb2YKKwkJICogIHRoZSB2aWFibGUgbmV4dCB0b2tlbiBzZXQsIHRoZW4geW91IGtub3cgdGhlcmUgaXMgbW9zdCBsaWtlbHkKKwkJICogIGEgbWlzc2luZyB0b2tlbiBpbiB0aGUgaW5wdXQgc3RyZWFtLiAgIkluc2VydCIgb25lIGJ5IGp1c3Qgbm90CisJCSAqICB0aHJvd2luZyBhbiBleGNlcHRpb24uCisJCSAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKCk6Qml0U2V0IHsKKwkJCXJldHVybiBjb21iaW5lRm9sbG93cyh0cnVlKTsKKwkJfQorCQorCQlwcm90ZWN0ZWQgZnVuY3Rpb24gY29tYmluZUZvbGxvd3MoZXhhY3Q6Qm9vbGVhbik6Qml0U2V0IHsKKwkJCXZhciB0b3A6aW50ID0gc3RhdGUuX2ZzcDsKKwkJCXZhciBmb2xsb3dTZXQ6Qml0U2V0ID0gbmV3IEJpdFNldCgpOworCQkJZm9yICh2YXIgaTppbnQ9dG9wOyBpPj0wOyBpLS0pIHsKKwkJCQl2YXIgbG9jYWxGb2xsb3dTZXQ6Qml0U2V0ID0gc3RhdGUuZm9sbG93aW5nW2ldOworCQkJCWZvbGxvd1NldC5vckluUGxhY2UobG9jYWxGb2xsb3dTZXQpOworCQkJCWlmICggZXhhY3QgKSB7CisJCQkJCS8vIGNhbiB3ZSBzZWUgZW5kIG9mIHJ1bGU/CisJCQkJCWlmICggbG9jYWxGb2xsb3dTZXQubWVtYmVyKFRva2VuQ29uc3RhbnRzLkVPUl9UT0tFTl9UWVBFKSApIHsKKwkJCQkJCS8vIE9ubHkgbGVhdmUgRU9SIGluIHNldCBpZiBhdCB0b3AgKHN0YXJ0IHJ1bGUpOyB0aGlzIGxldHMKKwkJCQkJCS8vIHVzIGtub3cgaWYgaGF2ZSB0byBpbmNsdWRlIGZvbGxvdyhzdGFydCBydWxlKTsgaS5lLiwgRU9GCisJCQkJCQlpZiAoIGk+MCApIHsKKwkJCQkJCQlmb2xsb3dTZXQucmVtb3ZlKFRva2VuQ29uc3RhbnRzLkVPUl9UT0tFTl9UWVBFKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIHsgLy8gY2FuJ3Qgc2VlIGVuZCBvZiBydWxlLCBxdWl0CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmb2xsb3dTZXQ7CisJCX0KKwkKKwkJLyoqIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGEgc2luZ2xlIG1pc3Npbmcgb3IgZXh0cmEgdG9rZW4uCisJCSAqCisJCSAqICBFWFRSQSBUT0tFTgorCQkgKgorCQkgKiAgTEEoMSkgaXMgbm90IHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgSWYgTEEoMikgaGFzIHRoZSByaWdodCB0b2tlbiwKKwkJICogIGhvd2V2ZXIsIHRoZW4gYXNzdW1lIExBKDEpIGlzIHNvbWUgZXh0cmEgc3B1cmlvdXMgdG9rZW4uICBEZWxldGUgaXQKKwkJICogIGFuZCBMQSgyKSBhcyBpZiB3ZSB3ZXJlIGRvaW5nIGEgbm9ybWFsIG1hdGNoKCksIHdoaWNoIGFkdmFuY2VzIHRoZQorCQkgKiAgaW5wdXQuCisJCSAqCisJCSAqICBNSVNTSU5HIFRPS0VOCisJCSAqCisJCSAqICBJZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIKKwkJICogIHR0eXBlIHRoZW4gaXQgaXMgb2sgdG8gImluc2VydCIgdGhlIG1pc3NpbmcgdG9rZW4sIGVsc2UgdGhyb3cKKwkJICogIGV4Y2VwdGlvbiBGb3IgZXhhbXBsZSwgSW5wdXQgImk9KDM7IiBpcyBjbGVhcmx5IG1pc3NpbmcgdGhlCisJCSAqICAnKScuICBXaGVuIHRoZSBwYXJzZXIgcmV0dXJucyBmcm9tIHRoZSBuZXN0ZWQgY2FsbCB0byBleHByLCBpdAorCQkgKiAgd2lsbCBoYXZlIGNhbGwgY2hhaW46CisJCSAqCisJCSAqICAgIHN0YXQgLT4gZXhwciAtPiBhdG9tCisJCSAqCisJCSAqICBhbmQgaXQgd2lsbCBiZSB0cnlpbmcgdG8gbWF0Y2ggdGhlICcpJyBhdCB0aGlzIHBvaW50IGluIHRoZQorCQkgKiAgZGVyaXZhdGlvbjoKKwkJICoKKwkJICogICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JworCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCQkgKiAgbWF0Y2goKSB3aWxsIHNlZSB0aGF0ICc7JyBkb2Vzbid0IG1hdGNoICcpJyBhbmQgcmVwb3J0IGEKKwkJICogIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IuICBUbyByZWNvdmVyLCBpdCBzZWVzIHRoYXQgTEEoMSk9PSc7JworCQkgKiAgaXMgaW4gdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZSAnKScgdG9rZW4KKwkJICogIHJlZmVyZW5jZSBpbiBydWxlIGF0b20uICBJdCBjYW4gYXNzdW1lIHRoYXQgeW91IGZvcmdvdCB0aGUgJyknLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKGlucHV0OkludFN0cmVhbSwKKwkJCQkJCQkJCQkJICAgCSAgIHR0eXBlOmludCwKKwkJCQkJCQkJCQkJICAgICAgIGZvbGxvdzpCaXRTZXQpOk9iamVjdCB7CQorICAgIAkJdmFyIGU6UmVjb2duaXRpb25FeGNlcHRpb24gPSBudWxsOworCQkJLy8gaWYgbmV4dCB0b2tlbiBpcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvciB0aGVuICJkZWxldGUiIHRoaXMgdG9rZW4KKwkJCWlmICggbWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4oaW5wdXQsIHR0eXBlKSApIHsKKwkJCQllID0gbmV3IFVud2FudGVkVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0KTsKKwkJCQkvKgorCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4gZGVsZXRpbmcgIisKKwkJCQkJCQkJICAgKChUb2tlblN0cmVhbSlpbnB1dCkuTFQoMSkrCisJCQkJCQkJCSAgICIgc2luY2UgIisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgyKSsiIGlzIHdoYXQgd2Ugd2FudCIpOworCQkJCSAqLworCQkJCWJlZ2luUmVzeW5jKCk7CisJCQkJaW5wdXQuY29uc3VtZSgpOyAvLyBzaW1wbHkgZGVsZXRlIGV4dHJhIHRva2VuCisJCQkJZW5kUmVzeW5jKCk7CisJCQkJcmVwb3J0RXJyb3IoZSk7ICAvLyByZXBvcnQgYWZ0ZXIgY29uc3VtaW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKwkJCQkvLyB3ZSB3YW50IHRvIHJldHVybiB0aGUgdG9rZW4gd2UncmUgYWN0dWFsbHkgbWF0Y2hpbmcKKwkJCQl2YXIgbWF0Y2hlZFN5bWJvbDpPYmplY3QgPSBnZXRDdXJyZW50SW5wdXRTeW1ib2woaW5wdXQpOworCQkJCWlucHV0LmNvbnN1bWUoKTsgLy8gbW92ZSBwYXN0IHR0eXBlIHRva2VuIGFzIGlmIGFsbCB3ZXJlIG9rCisJCQkJcmV0dXJuIG1hdGNoZWRTeW1ib2w7CisJCQl9CisJCQkvLyBjYW4ndCByZWNvdmVyIHdpdGggc2luZ2xlIHRva2VuIGRlbGV0aW9uLCB0cnkgaW5zZXJ0aW9uCisJCQlpZiAoIG1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQsIGZvbGxvdykgKSB7CisJCQkJdmFyIGluc2VydGVkOk9iamVjdCA9IGdldE1pc3NpbmdTeW1ib2woaW5wdXQsIGUsIHR0eXBlLCBmb2xsb3cpOworCQkJCWUgPSBuZXcgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKHR0eXBlLCBpbnB1dCwgaW5zZXJ0ZWQpOworCQkJCXJlcG9ydEVycm9yKGUpOyAgLy8gcmVwb3J0IGFmdGVyIGluc2VydGluZyBzbyBBVyBzZWVzIHRoZSB0b2tlbiBpbiB0aGUgZXhjZXB0aW9uCisJCQkJcmV0dXJuIGluc2VydGVkOworCQkJfQorCQkJLy8gZXZlbiB0aGF0IGRpZG4ndCB3b3JrOyBtdXN0IHRocm93IHRoZSBleGNlcHRpb24KKwkJCWUgPSBuZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHR0eXBlLCBpbnB1dCk7CisJCQl0aHJvdyBlOworCQl9CisJCisJCS8qKiBOb3QgY3VycmVudGx5IHVzZWQgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldChpbnB1dDpJbnRTdHJlYW0sCisJCQkJCQkJCQkJCSAgICAgZTpSZWNvZ25pdGlvbkV4Y2VwdGlvbiwKKwkJCQkJCQkJCQkJICAgICBmb2xsb3c6Qml0U2V0KTpPYmplY3QKKwkJeworICAgIAkJaWYgKCBtaXNtYXRjaElzTWlzc2luZ1Rva2VuKGlucHV0LCBmb2xsb3cpICkgeworCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibWlzc2luZyB0b2tlbiIpOworCQkJCXJlcG9ydEVycm9yKGUpOworCQkJCS8vIHdlIGRvbid0IGtub3cgaG93IHRvIGNvbmp1cmUgdXAgYSB0b2tlbiBmb3Igc2V0cyB5ZXQKKwkJCQlyZXR1cm4gZ2V0TWlzc2luZ1N5bWJvbChpbnB1dCwgZSwgVG9rZW5Db25zdGFudHMuSU5WQUxJRF9UT0tFTl9UWVBFLCBmb2xsb3cpOworCQkJfQorCQkJLy8gVE9ETyBkbyBzaW5nbGUgdG9rZW4gZGVsZXRpb24gbGlrZSBhYm92ZSBmb3IgVG9rZW4gbWlzbWF0Y2gKKwkJCXRocm93IGU7CisJCX0KKwkKKwkJLyoqIE1hdGNoIG5lZWRzIHRvIHJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wsIHdoaWNoIGdldHMgcHV0CisJCSAqICBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKwkJICogIGFuZCB0cmVlIHBhcnNlcnMgbmVlZCB0byByZXR1cm4gZGlmZmVyZW50IG9iamVjdHMuIFJhdGhlciB0aGFuIHRlc3QKKwkJICogIGZvciBpbnB1dCBzdHJlYW0gdHlwZSBvciBjaGFuZ2UgdGhlIEludFN0cmVhbSBpbnRlcmZhY2UsIEkgdXNlCisJCSAqICBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorCQkgKiAgaW5wdXQgc3ltYm9sIGlzLgorCQkgKiAKKwkJICogIFRoaXMgaXMgaWdub3JlZCBmb3IgbGV4ZXJzLgorCQkgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEN1cnJlbnRJbnB1dFN5bWJvbChpbnB1dDpJbnRTdHJlYW0pOk9iamVjdCB7IHJldHVybiBudWxsOyB9CisJCisJCS8qKiBDb25qdXJlIHVwIGEgbWlzc2luZyB0b2tlbiBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuCisJCSAqCisJCSAqICBUaGUgcmVjb2duaXplciBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gc2luZ2xlIG1pc3NpbmcKKwkJICogIHN5bWJvbHMuIEJ1dCwgYWN0aW9ucyBtaWdodCByZWZlciB0byB0aGF0IG1pc3Npbmcgc3ltYm9sLgorCQkgKiAgRm9yIGV4YW1wbGUsIHg9SUQge2YoJHgpO30uIFRoZSBhY3Rpb24gY2xlYXJseSBhc3N1bWVzCisJCSAqICB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGlkZW50aWZpZXIgbWF0Y2hlZCBwcmV2aW91c2x5IGFuZCB0aGF0CisJCSAqICAkeCBwb2ludHMgYXQgdGhhdCB0b2tlbi4gSWYgdGhhdCB0b2tlbiBpcyBtaXNzaW5nLCBidXQKKwkJICogIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gaXMgd2hhdCB3ZSB3YW50IHdlIGFzc3VtZSB0aGF0CisJCSAqICB0aGlzIHRva2VuIGlzIG1pc3NpbmcgYW5kIHdlIGtlZXAgZ29pbmcuIEJlY2F1c2Ugd2UKKwkJICogIGhhdmUgdG8gcmV0dXJuIHNvbWUgdG9rZW4gdG8gcmVwbGFjZSB0aGUgbWlzc2luZyB0b2tlbiwKKwkJICogIHdlIGhhdmUgdG8gY29uanVyZSBvbmUgdXAuIFRoaXMgbWV0aG9kIGdpdmVzIHRoZSB1c2VyIGNvbnRyb2wKKwkJICogIG92ZXIgdGhlIHRva2VucyByZXR1cm5lZCBmb3IgbWlzc2luZyB0b2tlbnMuIE1vc3RseSwKKwkJICogIHlvdSB3aWxsIHdhbnQgdG8gY3JlYXRlIHNvbWV0aGluZyBzcGVjaWFsIGZvciBpZGVudGlmaWVyCisJCSAqICB0b2tlbnMuIEZvciBsaXRlcmFscyBzdWNoIGFzICd7JyBhbmQgJywnLCB0aGUgZGVmYXVsdAorCQkgKiAgYWN0aW9uIGluIHRoZSBwYXJzZXIgb3IgdHJlZSBwYXJzZXIgd29ya3MuIEl0IHNpbXBseSBjcmVhdGVzCisJCSAqICBhIENvbW1vblRva2VuIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgdGV4dCB3aWxsIGJlIHRoZSB0b2tlbi4KKwkJICogIElmIHlvdSBjaGFuZ2Ugd2hhdCB0b2tlbnMgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBsZXhlciwKKwkJICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdG9rZW5zLgorCQkgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE1pc3NpbmdTeW1ib2woaW5wdXQ6SW50U3RyZWFtLAorCQkJCQkJCQkJCSAgICBlOlJlY29nbml0aW9uRXhjZXB0aW9uLAorCQkJCQkJCQkJCSAgICBleHBlY3RlZFRva2VuVHlwZTppbnQsCisJCQkJCQkJCQkJICAgIGZvbGxvdzpCaXRTZXQpOk9iamVjdAorCQl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbFRva2VuKGlucHV0OkludFN0cmVhbSwgdG9rZW5UeXBlOmludCk6dm9pZCB7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uc3VtZVVudGlsICIrdG9rZW5UeXBlKTsKKwkJCXZhciB0dHlwZTppbnQgPSBpbnB1dC5MQSgxKTsKKwkJCXdoaWxlICh0dHlwZSAhPSBUb2tlbkNvbnN0YW50cy5FT0YgJiYgdHR5cGUgIT0gdG9rZW5UeXBlKSB7CisJCQkJaW5wdXQuY29uc3VtZSgpOworCQkJCXR0eXBlID0gaW5wdXQuTEEoMSk7CisJCQl9CisJCX0KKwkKKwkJLyoqIENvbnN1bWUgdG9rZW5zIHVudGlsIG9uZSBtYXRjaGVzIHRoZSBnaXZlbiB0b2tlbiBzZXQgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbChpbnB1dDpJbnRTdHJlYW0sIGJpdFNldDpCaXRTZXQpOnZvaWQgeworCQkJLy90cmFjZSgiY29uc3VtZVVudGlsKCIrYml0U2V0LnRvU3RyaW5nRnJvbVRva2Vucyh0b2tlbk5hbWVzKSsiKSIpOworCQkJdmFyIHR0eXBlOmludCA9IGlucHV0LkxBKDEpOworCQkJd2hpbGUgKHR0eXBlICE9IFRva2VuQ29uc3RhbnRzLkVPRiAmJiAhYml0U2V0Lm1lbWJlcih0dHlwZSkgKSB7CisJCQkJLy90cmFjZSgiY29uc3VtZSBkdXJpbmcgcmVjb3ZlciBMQSgxKT0iK3Rva2VuTmFtZXNbaW5wdXQuTEEoMSldKTsKKwkJCQlpbnB1dC5jb25zdW1lKCk7CisJCQkJdHR5cGUgPSBpbnB1dC5MQSgxKTsKKwkJCX0KKwkJfQorCQorCQkvKiogUHVzaCBhIHJ1bGUncyBmb2xsb3cgc2V0IHVzaW5nIG91ciBvd24gaGFyZGNvZGVkIHN0YWNrICovCisJCXByb3RlY3RlZCBmdW5jdGlvbiBwdXNoRm9sbG93KGZzZXQ6Qml0U2V0KTp2b2lkIHsKKwkJCXN0YXRlLmZvbGxvd2luZ1srK3N0YXRlLl9mc3BdID0gZnNldDsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGJhY2t0cmFja2luZ0xldmVsKCk6aW50IHsKKwkJCXJldHVybiBzdGF0ZS5iYWNrdHJhY2tpbmc7CisJCX0KKwkKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNldCBiYWNrdHJha2luZ0xldmVsKG46aW50KTp2b2lkIHsKKyAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZyA9IG47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm4gd2hldGhlciBvciBub3QgYSBiYWNrdHJhY2tpbmcgYXR0ZW1wdCBmYWlsZWQuICovCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgZmFpbGVkKCk6Qm9vbGVhbiB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUuZmFpbGVkOworICAgICAgICB9CisgICAgICAgIAorCQkvKiogVXNlZCB0byBwcmludCBvdXQgdG9rZW4gbmFtZXMgbGlrZSBJRCBkdXJpbmcgZGVidWdnaW5nIGFuZAorCQkgKiAgZXJyb3IgcmVwb3J0aW5nLiAgVGhlIGdlbmVyYXRlZCBwYXJzZXJzIGltcGxlbWVudCBhIG1ldGhvZAorCQkgKiAgdGhhdCBvdmVycmlkZXMgdGhpcyB0byBwb2ludCB0byB0aGVpciBTdHJpbmdbXSB0b2tlbk5hbWVzLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCB0b2tlbk5hbWVzKCk6QXJyYXkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkKKwkJLyoqIEZvciBkZWJ1Z2dpbmcgYW5kIG90aGVyIHB1cnBvc2VzLCBtaWdodCB3YW50IHRoZSBncmFtbWFyIG5hbWUuCisJCSAqICBIYXZlIEFOVExSIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIG1ldGhvZC4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgZ3JhbW1hckZpbGVOYW1lKCk6U3RyaW5nIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZyB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJLyoqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB1c2UgbW9zdCBvZnRlbiB3aXRoIHRlbXBsYXRlIHJld3JpdGVzLgorCQkgKiAgQ29udmVydCBhIExpc3Q8VG9rZW4+IHRvIExpc3Q8U3RyaW5nPgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5ncyh0b2tlbnM6QXJyYXkpOkFycmF5IHsKKwkJCWlmICggdG9rZW5zPT1udWxsICkgcmV0dXJuIG51bGw7CisJCQl2YXIgc3RyaW5nczpBcnJheSA9IG5ldyBBcnJheSgpOworCQkJZm9yICh2YXIgaTppbnQgPSAwOyBpPHRva2Vucy5sZW5ndGg7IGkrKykgeworCQkJCXN0cmluZ3MucHVzaCh0b2tlbnNbaV0udGV4dCk7CisJCQl9CisJCQlyZXR1cm4gc3RyaW5nczsKKwkJfQorCQorCQkvKiogR2l2ZW4gYSBydWxlIG51bWJlciBhbmQgYSBzdGFydCB0b2tlbiBpbmRleCBudW1iZXIsIHJldHVybgorCQkgKiAgTUVNT19SVUxFX1VOS05PV04gaWYgdGhlIHJ1bGUgaGFzIG5vdCBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgZnJvbQorCQkgKiAgc3RhcnQgaW5kZXguICBJZiB0aGlzIHJ1bGUgaGFzIHBhcnNlZCBpbnB1dCBzdGFydGluZyBmcm9tIHRoZQorCQkgKiAgc3RhcnQgaW5kZXggYmVmb3JlLCB0aGVuIHJldHVybiB3aGVyZSB0aGUgcnVsZSBzdG9wcGVkIHBhcnNpbmcuCisJCSAqICBJdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0b2tlbiBtYXRjaGVkIGJ5IHRoZSBydWxlLgorCQkgKgorCQkgKiAgRm9yIG5vdyB3ZSB1c2UgYSBoYXNodGFibGUgYW5kIGp1c3QgdGhlIHNsb3cgT2JqZWN0LWJhc2VkIG9uZS4KKwkJICogIExhdGVyLCB3ZSBjYW4gbWFrZSBhIHNwZWNpYWwgb25lIGZvciBpbnRzIGFuZCBhbHNvIG9uZSB0aGF0CisJCSAqICB0b3NzZXMgb3V0IGRhdGEgYWZ0ZXIgd2UgY29tbWl0IHBhc3QgaW5wdXQgcG9zaXRpb24gaS4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRSdWxlTWVtb2l6YXRpb24ocnVsZUluZGV4OmludCwgcnVsZVN0YXJ0SW5kZXg6aW50KTppbnQgeworCQkJaWYgKCBzdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdPT11bmRlZmluZWQgKSB7CisJCQkJc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XSA9IG5ldyBBcnJheSgpOworCQkJfQorCQkJdmFyIHN0b3BJbmRleDoqID0gc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XVtydWxlU3RhcnRJbmRleF07CisJCQlpZiAoIHN0b3BJbmRleCA9PSB1bmRlZmluZWQgKSB7CisJCQkJcmV0dXJuIE1FTU9fUlVMRV9VTktOT1dOOworCQkJfQorCQkJcmV0dXJuIHN0b3BJbmRleCBhcyBpbnQ7CisJCX0KKwkKKwkJLyoqIEhhcyB0aGlzIHJ1bGUgYWxyZWFkeSBwYXJzZWQgaW5wdXQgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlCisJCSAqICBpbnB1dCBzdHJlYW0/ICBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gaW5kZXggb3IgTUVNT19SVUxFX1VOS05PV04uCisJCSAqICBJZiB3ZSBhdHRlbXB0ZWQgYnV0IGZhaWxlZCB0byBwYXJzZSBwcm9wZXJseSBiZWZvcmUsIHJldHVybgorCQkgKiAgTUVNT19SVUxFX0ZBSUxFRC4KKwkJICoKKwkJICogIFRoaXMgbWV0aG9kIGhhcyBhIHNpZGUtZWZmZWN0OiBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBpbnB1dCBmb3IKKwkJICogIHRoaXMgcnVsZSBhbmQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBiZWZvcmUsIHRoZW4gc2VlayBhaGVhZCB0bworCQkgKiAgMSBwYXN0IHRoZSBzdG9wIHRva2VuIG1hdGNoZWQgZm9yIHRoaXMgcnVsZSBsYXN0IHRpbWUuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gYWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQ6SW50U3RyZWFtLCBydWxlSW5kZXg6aW50KTpCb29sZWFuIHsKKwkJCXZhciBzdG9wSW5kZXg6aW50ID0gZ2V0UnVsZU1lbW9pemF0aW9uKHJ1bGVJbmRleCwgaW5wdXQuaW5kZXgpOworCQkJaWYgKCBzdG9wSW5kZXg9PU1FTU9fUlVMRV9VTktOT1dOICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmICggc3RvcEluZGV4PT1NRU1PX1JVTEVfRkFJTEVEICkgeworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJydWxlICIrcnVsZUluZGV4KyIgd2lsbCBuZXZlciBzdWNjZWVkIik7CisJCQkJc3RhdGUuZmFpbGVkPXRydWU7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2VlbiBydWxlICIrcnVsZUluZGV4KyIgYmVmb3JlOyBza2lwcGluZyBhaGVhZCB0byBAIisoc3RvcEluZGV4KzEpKyIgZmFpbGVkPSIrZmFpbGVkKTsKKwkJCQlpbnB1dC5zZWVrKHN0b3BJbmRleCsxKTsgLy8ganVtcCB0byBvbmUgcGFzdCBzdG9wIHRva2VuCisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQorCQkvKiogUmVjb3JkIHdoZXRoZXIgb3Igbm90IHRoaXMgcnVsZSBwYXJzZWQgdGhlIGlucHV0IGF0IHRoaXMgcG9zaXRpb24KKwkJICogIHN1Y2Nlc3NmdWxseS4gIFVzZSBhIHN0YW5kYXJkIGphdmEgaGFzaHRhYmxlIGZvciBub3cuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gbWVtb2l6ZShpbnB1dDpJbnRTdHJlYW0sCisJCQkJCQkJcnVsZUluZGV4OmludCwKKwkJCQkJCQlydWxlU3RhcnRJbmRleDppbnQpOnZvaWQKKwkJeworCQkJdmFyIHN0b3BUb2tlbkluZGV4OmludCA9IHN0YXRlLmZhaWxlZCA/IE1FTU9fUlVMRV9GQUlMRUQgOiBpbnB1dC5pbmRleCAtIDE7CisJCQlpZiAoIHN0YXRlLnJ1bGVNZW1vPT1udWxsICkgeworICAgIAkJCXRyYWNlKCIhISEhISEhISEgbWVtbyBhcnJheSBpcyBudWxsIGZvciAiKyBncmFtbWFyRmlsZU5hbWUpOworICAgIAkJfQorICAgIAkJaWYgKCBydWxlSW5kZXggPj0gc3RhdGUucnVsZU1lbW8ubGVuZ3RoICkgeworICAgIAkJCXRyYWNlKCIhISEhISEhISEgbWVtbyBzaXplIGlzICIrc3RhdGUucnVsZU1lbW8ubGVuZ3RoKyIsIGJ1dCBydWxlIGluZGV4IGlzICIrcnVsZUluZGV4KTsKKyAgICAJCX0KKworCQkJaWYgKCBzdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdIT1udWxsICkgeworCQkJCXN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF1bcnVsZVN0YXJ0SW5kZXhdID0gc3RvcFRva2VuSW5kZXg7CisJCQl9CisJCX0KKwkKKwkJLyoqIHJldHVybiBob3cgbWFueSBydWxlL2lucHV0LWluZGV4IHBhaXJzIHRoZXJlIGFyZSBpbiB0b3RhbC4KKwkJICogIFRPRE86IHRoaXMgaW5jbHVkZXMgc3lucHJlZHMuIDooCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZU1lbW9pemF0aW9uQ2FjaGVTaXplKCk6aW50IHsKKwkJCXZhciBuOmludCA9IDA7CisJCQlmb3IgKHZhciBpOmludCA9IDA7IHN0YXRlLnJ1bGVNZW1vIT1udWxsICYmIGkgPCBzdGF0ZS5ydWxlTWVtby5sZW5ndGg7IGkrKykgeworCQkJCXZhciBydWxlTWFwOk9iamVjdCA9IHN0YXRlLnJ1bGVNZW1vW2ldOworCQkJCWlmICggcnVsZU1hcCE9bnVsbCApIHsKKwkJCQkJbiArPSBydWxlTWFwLmxlbmd0aDsgLy8gaG93IG1hbnkgaW5wdXQgaW5kZXhlcyBhcmUgcmVjb3JkZWQ/CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG47CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRyYWNlSW5TeW1ib2wocnVsZU5hbWU6U3RyaW5nLCBydWxlSW5kZXg6aW50LCBpbnB1dFN5bWJvbDpPYmplY3QpOnZvaWQgIHsKKwkJCXRyYWNlKCJlbnRlciAiK3J1bGVOYW1lKyIgIitpbnB1dFN5bWJvbCk7CisJCQlpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICkgeworCQkJCXRyYWNlKCIgYmFja3RyYWNraW5nPSIrc3RhdGUuYmFja3RyYWNraW5nKTsKKwkJCX0KKwkJCXRyYWNlKCk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRyYWNlT3V0U3ltYm9sKHJ1bGVOYW1lOlN0cmluZywKKwkJCQkJCQkgIHJ1bGVJbmRleDppbnQsCisJCQkJCQkJICBpbnB1dFN5bWJvbDpPYmplY3QpOnZvaWQKKwkJeworCQkJdHJhY2UoImV4aXQgIitydWxlTmFtZSsiICIraW5wdXRTeW1ib2wpOworCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKKwkJCQl0cmFjZSgiIGJhY2t0cmFja2luZz0iK3N0YXRlLmJhY2t0cmFja2luZyk7CisJCQkJaWYgKCBzdGF0ZS5mYWlsZWQgKSB0cmFjZSgiIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGVsc2UgdHJhY2UoIiBzdWNjZWVkZWQiKTsKKwkJCX0KKwkJCXRyYWNlKCk7CisJCX0KKwkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0JpdFNldC5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9CaXRTZXQuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjZTc4OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9CaXRTZXQuYXMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisKKwkvKipBIHN0cmlwcGVkLWRvd24gdmVyc2lvbiBvZiBvcmcuYW50bHIubWlzYy5CaXRTZXQgdGhhdCBpcyBqdXN0CisJICogZ29vZCBlbm91Z2ggdG8gaGFuZGxlIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIHN1Y2ggYXMgRk9MTE9XIHNldHMKKwkgKiBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5LgorCSAqLworCXB1YmxpYyBjbGFzcyBCaXRTZXQgeworCSAgICBwcm90ZWN0ZWQgc3RhdGljIGNvbnN0IEJJVFM6dWludCA9IDMyOyAgICAvLyBudW1iZXIgb2YgYml0cyAvIGludAorCSAgICBwcm90ZWN0ZWQgc3RhdGljIGNvbnN0IExPR19CSVRTOnVpbnQgPSA1OyAvLyAyXjUgPT0gMzIKKwkKKwkgICAgLyogV2Ugd2lsbCBvZnRlbiBuZWVkIHRvIGRvIGEgbW9kIG9wZXJhdG9yIChpIG1vZCBuYml0cykuICBJdHMKKwkgICAgICogdHVybnMgb3V0IHRoYXQsIGZvciBwb3dlcnMgb2YgdHdvLCB0aGlzIG1vZCBvcGVyYXRpb24gaXMKKwkgICAgICogc2FtZSBhcyAoaSAmIChuYml0cy0xKSkuICBTaW5jZSBtb2QgaXMgc2xvdywgd2UgdXNlIGEKKwkgICAgICogcHJlY29tcHV0ZWQgbW9kIG1hc2sgdG8gZG8gdGhlIG1vZCBpbnN0ZWFkLgorCSAgICAgKi8KKwkgICAgcHJvdGVjdGVkIHN0YXRpYyBjb25zdCBNT0RfTUFTSzp1aW50ID0gQklUUyAtIDE7CisKKwkgICAgLyoqIFRoZSBhY3R1YWwgZGF0YSBiaXRzICovCisJICAgIHByb3RlY3RlZCB2YXIgYml0czpBcnJheTsKKwkKKwkgICAgLyoqIENvbnN0cnVjdGlvbiBmcm9tIGEgc3RhdGljIGFycmF5IG9mIGxvbmdzICovCisJICAgIHB1YmxpYyBmdW5jdGlvbiBCaXRTZXQoYml0czpBcnJheSA9IG51bGwpIHsKKwkgICAgICAgIGlmIChiaXRzID09IG51bGwpIHsKKwkgICAgICAgICAgICB0aGlzLmJpdHMgPSBuZXcgQXJyYXkoKTsKKwkgICAgICAgIH0KKwkgICAgICAgIGVsc2UgeworICAgIAkgICAgICAgIHRoaXMuYml0cyA9IG5ldyBBcnJheSgpOworICAgIAkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IGJpdHMubGVuZ3RoOyBpKyspIHsKKyAgICAJCQkJdGhpcy5iaXRzW2ldID0gYml0c1tpXTsKKyAgICAJICAgIAl9CisJICAgICAgICB9CisJICAgIH0KKwkKKwkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvZiguLi4gYXJncyk6Qml0U2V0IHsKKwkJCXZhciBzOkJpdFNldCA9IG5ldyBCaXRTZXQoKTsKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlzLmFkZChhcmdzW2ldKTsKKwkJCX0KKwkJCXJldHVybiBzOworCQl9CisJCisJCS8qKiByZXR1cm4gdGhpcyB8IGEgaW4gYSBuZXcgc2V0ICovCisJCXB1YmxpYyBmdW5jdGlvbiBvcihhOkJpdFNldCk6Qml0U2V0IHsKKwkJCWlmICggYT09bnVsbCApIHsKKwkJCQlyZXR1cm4gdGhpczsKKwkJCX0KKwkJCXZhciBzOkJpdFNldCA9IHRoaXMuY2xvbmUoKTsKKwkJCXMub3JJblBsYWNlKGEpOworCQkJcmV0dXJuIHM7CisJCX0KKwkKKwkJLyoqIG9yIHRoaXMgZWxlbWVudCBpbnRvIHRoaXMgc2V0IChncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGFkZChlbDppbnQpOnZvaWQgeworCQkJdmFyIG46aW50ID0gd29yZE51bWJlcihlbCk7CisJCQlpZiAobiA+PSBiaXRzLmxlbmd0aCkgeworCQkJCWdyb3dUb0luY2x1ZGUoZWwpOworCQkJfQorCQkJYml0c1tuXSB8PSBiaXRNYXNrKGVsKTsKKwkJfQorCQorCQkvKioKKwkJICogR3Jvd3MgdGhlIHNldCB0byBhIGxhcmdlciBudW1iZXIgb2YgYml0cy4KKwkJICogQHBhcmFtIGJpdCBlbGVtZW50IHRoYXQgbXVzdCBmaXQgaW4gc2V0CisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ3Jvd1RvSW5jbHVkZShiaXQ6aW50KTp2b2lkIHsKKwkJCXZhciBuZXdTaXplOmludCA9IE1hdGgubWF4KGJpdHMubGVuZ3RoIDw8IDEsIG51bVdvcmRzVG9Ib2xkKGJpdCkpOworCQkJYml0cy5sZW5ndGggPSBuZXdTaXplOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBvckluUGxhY2UoYTpCaXRTZXQpOnZvaWQgeworCQkJaWYgKCBhPT1udWxsICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8vIElmIHRoaXMgaXMgc21hbGxlciB0aGFuIGEsIGdyb3cgdGhpcyBmaXJzdAorCQkJaWYgKGEuYml0cy5sZW5ndGggPiBiaXRzLmxlbmd0aCkgeworCQkJCXRoaXMuYml0cy5sZW5ndGggPSBhLmJpdHMubGVuZ3RoOworCQkJfQorCQkJdmFyIG1pbjppbnQgPSBNYXRoLm1pbihiaXRzLmxlbmd0aCwgYS5iaXRzLmxlbmd0aCk7CisJCQlmb3IgKHZhciBpOmludCA9IG1pbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJYml0c1tpXSB8PSBhLmJpdHNbaV07CisJCQl9CisJCX0KKwkKKwkJLyoqCisJCSAqIFNldHMgdGhlIHNpemUgb2YgYSBzZXQuCisJCSAqIEBwYXJhbSBud29yZHMgaG93IG1hbnkgd29yZHMgdGhlIG5ldyBzZXQgc2hvdWxkIGJlCisJCSAqLworCQlwcml2YXRlIGZ1bmN0aW9uIHNldCBzaXplKG53b3JkczppbnQpOnZvaWQgeworCQkJYml0cy5sZW5ndGggPSBud29yZHM7CisJCX0KKwkKKwkgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYml0TWFzayhiaXROdW1iZXI6aW50KTppbnQgeworCSAgICAgICAgdmFyIGJpdFBvc2l0aW9uOmludCA9IGJpdE51bWJlciAmIE1PRF9NQVNLOyAvLyBiaXROdW1iZXIgbW9kIEJJVFMKKwkgICAgICAgIHJldHVybiAxIDw8IGJpdFBvc2l0aW9uOworCSAgICB9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9uZSgpOkJpdFNldCB7CisJICAgICAgICB2YXIgczpCaXRTZXQgPSBuZXcgQml0U2V0KGJpdHMpOworCQkJcmV0dXJuIHM7CisJICAgIH0KKwkKKwkgICAgcHVibGljIGZ1bmN0aW9uIGdldCBzaXplKCk6aW50IHsKKwkgICAgICAgIHZhciBkZWc6dWludCA9IDA7CisJICAgICAgICBmb3IgKHZhciBpOmludCA9IGJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkgICAgICAgICAgICB2YXIgd29yZDp1aW50ID0gYml0c1tpXTsKKwkgICAgICAgICAgICBpZiAod29yZCAhPSAwKSB7CisJICAgICAgICAgICAgICAgIGZvciAodmFyIGJpdDppbnQgPSBCSVRTIC0gMTsgYml0ID49IDA7IGJpdC0tKSB7CisJICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmQgJiAoMSA8PCBiaXQpKSAhPSAwKSB7CisJICAgICAgICAgICAgICAgICAgICAgICAgZGVnKys7CisJICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJICAgICAgICByZXR1cm4gZGVnOworCSAgICB9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob3RoZXI6T2JqZWN0KTpCb29sZWFuIHsKKwkgICAgICAgIGlmICggb3RoZXIgPT0gbnVsbCB8fCAhKG90aGVyIGlzIEJpdFNldCkgKSB7CisJICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCSAgICAgICAgfQorCQorCSAgICAgICAgdmFyIG90aGVyU2V0OkJpdFNldCA9IEJpdFNldChvdGhlcik7CisJCisJICAgICAgICB2YXIgbjppbnQgPSBNYXRoLm1pbih0aGlzLmJpdHMubGVuZ3RoLCBvdGhlclNldC5iaXRzLmxlbmd0aCk7CisJCisJICAgICAgICAvLyBmb3IgYW55IGJpdHMgaW4gY29tbW9uLCBjb21wYXJlCisJICAgICAgICBmb3IgKHZhciBpOmludD0wOyBpPG47IGkrKykgeworCSAgICAgICAgICAgIGlmICh0aGlzLmJpdHNbaV0gIT0gb3RoZXJTZXQuYml0c1tpXSkgeworCSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorCQorCSAgICAgICAgLy8gbWFrZSBzdXJlIGFueSBleHRyYSBiaXRzIGFyZSBvZmYKKwkKKwkgICAgICAgIGlmICh0aGlzLmJpdHMubGVuZ3RoID4gbikgeworCSAgICAgICAgICAgIGZvciAoaSA9IG4rMTsgaTx0aGlzLmJpdHMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgICAgICAgICAgaWYgKHRoaXMuYml0c1tpXSAhPSAwKSB7CisJICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJICAgICAgICBlbHNlIGlmIChvdGhlclNldC5iaXRzLmxlbmd0aCA+IG4pIHsKKwkgICAgICAgICAgICBmb3IgKGkgPSBuKzE7IGk8b3RoZXJTZXQuYml0cy5sZW5ndGg7IGkrKykgeworCSAgICAgICAgICAgICAgICBpZiAob3RoZXJTZXQuYml0c1tpXSAhPSAwKSB7CisJICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJCisJICAgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gbWVtYmVyKGVsOmludCk6Qm9vbGVhbiB7CisJCQlpZiAoIGVsPDAgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCSAgICAgICAgdmFyIG46aW50ID0gd29yZE51bWJlcihlbCk7CisJICAgICAgICBpZiAobiA+PSBiaXRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOworCSAgICAgICAgcmV0dXJuIChiaXRzW25dICYgYml0TWFzayhlbCkpICE9IDA7CisJICAgIH0KKwkKKwkJLy8gcmVtb3ZlIHRoaXMgZWxlbWVudCBmcm9tIHRoaXMgc2V0CisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmUoZWw6aW50KTp2b2lkIHsKKwkJCXZhciBuOmludCA9IHdvcmROdW1iZXIoZWwpOworCQkJaWYgKG4gPCBiaXRzLmxlbmd0aCkgeworCQkJCWJpdHNbbl0gJj0gfmJpdE1hc2soZWwpOworCQkJfQorCQl9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgaXNOaWwoKTpCb29sZWFuIHsKKwkgICAgICAgIGZvciAodmFyIGk6aW50ID0gYml0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworCSAgICAgICAgICAgIGlmIChiaXRzW2ldICE9IDApIHJldHVybiBmYWxzZTsKKwkgICAgICAgIH0KKwkgICAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJCisJICAgIHByaXZhdGUgZmluYWwgZnVuY3Rpb24gbnVtV29yZHNUb0hvbGQoZWw6aW50KTppbnQgeworCSAgICAgICAgcmV0dXJuIChlbCA+PiBMT0dfQklUUykgKyAxOworCSAgICB9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgbnVtQml0cygpOmludCB7CisJICAgICAgICByZXR1cm4gYml0cy5sZW5ndGggPDwgTE9HX0JJVFM7IC8vIG51bSB3b3JkcyAqIGJpdHMgcGVyIHdvcmQKKwkgICAgfQorCQorCSAgICAvKiogcmV0dXJuIGhvdyBtdWNoIHNwYWNlIGlzIGJlaW5nIHVzZWQgYnkgdGhlIGJpdHMgYXJyYXkgbm90CisJICAgICAqICBob3cgbWFueSBhY3R1YWxseSBoYXZlIG1lbWJlciBiaXRzIG9uLgorCSAgICAgKi8KKwkgICAgcHVibGljIGZ1bmN0aW9uIGdldCBsZW5ndGhJbkxvbmdXb3JkcygpOmludCB7CisJICAgICAgICByZXR1cm4gYml0cy5sZW5ndGg7CisJICAgIH0KKwkKKwkgICAgcHVibGljIGZ1bmN0aW9uIHRvQXJyYXkoKTpBcnJheSB7CisJICAgICAgICB2YXIgZWxlbXM6QXJyYXkgPSBuZXcgQXJyYXlbdGhpcy5iaXRzLmxlbmd0aF07CisJICAgICAgICB2YXIgZW46aW50ID0gMDsKKwkgICAgICAgIGZvciAodmFyIGk6aW50ID0gMDsgaSA8IChiaXRzLmxlbmd0aCA8PCBMT0dfQklUUyk7IGkrKykgeworCSAgICAgICAgICAgIGlmIChtZW1iZXIoaSkpIHsKKwkgICAgICAgICAgICAgICAgZWxlbXNbZW4rK10gPSBpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgIH0KKwkgICAgICAgIHJldHVybiBlbGVtczsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gdG9QYWNrZWRBcnJheSgpOkFycmF5IHsKKwkgICAgICAgIHJldHVybiBiaXRzOworCSAgICB9CisJCisJCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHdvcmROdW1iZXIoYml0OnVpbnQpOnVpbnQgeworCQkJcmV0dXJuIGJpdCA+PiBMT0dfQklUUzsgLy8gYml0IC8gQklUUworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCQlyZXR1cm4gdG9TdHJpbmdGcm9tVG9rZW5zKG51bGwpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZ0Zyb21Ub2tlbnModG9rZW5OYW1lczpBcnJheSk6U3RyaW5nIHsKKwkJCXZhciBidWY6U3RyaW5nID0gIiI7CisJCQljb25zdCBzZXBhcmF0b3I6U3RyaW5nID0gIiwiOworCQkJdmFyIGhhdmVQcmludGVkQW5FbGVtZW50OkJvb2xlYW4gPSBmYWxzZTsKKwkJCWJ1ZiA9IGJ1ZiArICd7JzsKKwkKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IChiaXRzLmxlbmd0aCA8PCBMT0dfQklUUyk7IGkrKykgeworCQkJCWlmIChtZW1iZXIoaSkpIHsKKwkJCQkJaWYgKGkgPiAwICYmIGhhdmVQcmludGVkQW5FbGVtZW50ICkgeworCQkJCQkJYnVmICs9IHNlcGFyYXRvcjsKKwkJCQkJfQorCQkJCQlpZiAoIHRva2VuTmFtZXMhPW51bGwgKSB7CisJCQkJCQlidWYgKz0gdG9rZW5OYW1lc1tpXTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWJ1ZiArPSBpOworCQkJCQl9CisJCQkJCWhhdmVQcmludGVkQW5FbGVtZW50ID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlidWYgKz0gJ30nOworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ2hhclN0cmVhbS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2EwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ2hhclN0cmVhbS5hcwpAQCAtMCwwICsxLDU3IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCS8qKiBBIHNvdXJjZSBvZiBjaGFyYWN0ZXJzIGZvciBhbiBBTlRMUiBsZXhlciAqLworCXB1YmxpYyBpbnRlcmZhY2UgQ2hhclN0cmVhbSBleHRlbmRzIEludFN0cmVhbSB7CisJCisJCS8qKiBGb3IgaW5maW5pdGUgc3RyZWFtcywgeW91IGRvbid0IG5lZWQgdGhpczsgcHJpbWFyaWx5IEknbSBwcm92aWRpbmcKKwkJICogIGEgdXNlZnVsIGludGVyZmFjZSBmb3IgYWN0aW9uIGNvZGUuICBKdXN0IG1ha2Ugc3VyZSBhY3Rpb25zIGRvbid0CisJCSAqICB1c2UgdGhpcyBvbiBzdHJlYW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdC4KKwkJICovCisJCWZ1bmN0aW9uIHN1YnN0cmluZyhzdGFydDppbnQsIHN0b3A6aW50KTpTdHJpbmc7CisJCisJCS8qKiBHZXQgdGhlIGl0aCBjaGFyYWN0ZXIgb2YgbG9va2FoZWFkLiAgVGhpcyBpcyB0aGUgc2FtZSB1c3VhbGx5IGFzCisJCSAqICBMQShpKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZAorCQkgKiAgbGV4ZXIgY29kZS4gIEknZCBwcmVmZXIgdG8gcmV0dXJuIGEgY2hhciBoZXJlIHR5cGUtd2lzZSwgYnV0IGl0J3MKKwkJICogIHByb2JhYmx5IGJldHRlciB0byBiZSAzMi1iaXQgY2xlYW4gYW5kIGJlIGNvbnNpc3RlbnQgd2l0aCBMQS4KKwkJICovCisJCWZ1bmN0aW9uIExUKGk6aW50KTppbnQ7CisJCisJCS8qKiBBTlRMUiB0cmFja3MgdGhlIGxpbmUgaW5mb3JtYXRpb24gYXV0b21hdGljYWxseSAqLworCQlmdW5jdGlvbiBnZXQgbGluZSgpOmludDsKKwkKKwkJLyoqIEJlY2F1c2UgdGhpcyBzdHJlYW0gY2FuIHJld2luZCwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlc2V0IHRoZSBsaW5lICovCisJCWZ1bmN0aW9uIHNldCBsaW5lKGxpbmU6aW50KTp2b2lkOworCQorCQlmdW5jdGlvbiBzZXQgY2hhclBvc2l0aW9uSW5MaW5lKHBvczppbnQpOnZvaWQ7CisJCisJCS8qKiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIDAuLm4tMSAqLworCQlmdW5jdGlvbiBnZXQgY2hhclBvc2l0aW9uSW5MaW5lKCk6aW50OworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtQ29uc3RhbnRzLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW1Db25zdGFudHMuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtQ29uc3RhbnRzLmFzCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZQoreworCXB1YmxpYyBjbGFzcyBDaGFyU3RyZWFtQ29uc3RhbnRzCisJeworCQlwdWJsaWMgc3RhdGljIGNvbnN0IEVPRjppbnQgPSAtMTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW1TdGF0ZS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtU3RhdGUuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMDUzYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtU3RhdGUuYXMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKworCS8qKiBXaGVuIHdhbGtpbmcgYWhlYWQgd2l0aCBjeWNsaWMgREZBIG9yIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcywKKwkgKiAgd2UgbmVlZCB0byByZWNvcmQgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0gKGNoYXIgaW5kZXgsCisJICogIGxpbmUsIGV0Yy4uLikgc28gdGhhdCB3ZSBjYW4gcmV3aW5kIHRoZSBzdGF0ZSBhZnRlciBzY2FubmluZyBhaGVhZC4KKwkgKgorCSAqICBUaGlzIGlzIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiBhIHN0cmVhbS4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgQ2hhclN0cmVhbVN0YXRlIHsKKwkJLyoqIEluZGV4IGludG8gdGhlIGNoYXIgc3RyZWFtIG9mIG5leHQgbG9va2FoZWFkIGNoYXIgKi8KKwkJcHVibGljIHZhciBwOmludDsKKwkKKwkJLyoqIFdoYXQgbGluZSBudW1iZXIgaXMgdGhlIHNjYW5uZXIgYXQgYmVmb3JlIHByb2Nlc3NpbmcgYnVmZmVyW3BdPyAqLworCQlwdWJsaWMgdmFyIGxpbmU6aW50OworCQkKKwkJLyoqIFdoYXQgY2hhciBwb3NpdGlvbiAwLi5uLTEgaW4gbGluZSBpcyBzY2FubmVyIGJlZm9yZSBwcm9jZXNzaW5nIGJ1ZmZlcltwXT8gKi8KKwkJcHVibGljIHZhciBjaGFyUG9zaXRpb25JbkxpbmU6aW50OworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlbi5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlbi5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg0NWMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuLmFzCkBAIC0wLDAgKzEsMTgzIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCQorCQorCitwdWJsaWMgY2xhc3MgQ29tbW9uVG9rZW4gaW1wbGVtZW50cyBUb2tlbiB7CisJcHJvdGVjdGVkIHZhciBfdHlwZTppbnQ7CisJcHJvdGVjdGVkIHZhciBfbGluZTppbnQ7CisJcHJvdGVjdGVkIHZhciBfY2hhclBvc2l0aW9uSW5MaW5lOmludCA9IC0xOyAvLyBzZXQgdG8gaW52YWxpZCBwb3NpdGlvbgorCXByb3RlY3RlZCB2YXIgX2NoYW5uZWw6aW50ID0gVG9rZW5Db25zdGFudHMuREVGQVVMVF9DSEFOTkVMOworCXByb3RlY3RlZCB2YXIgX2lucHV0OkNoYXJTdHJlYW07CisJCisJLyoqIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHRleHQgb25jZSBpbiBhIHdoaWxlLiAgSWYKKwkgKiAgdGhpcyBpcyBub24tbnVsbCwgdGhlbiBnZXRUZXh0IHNob3VsZCByZXR1cm4gdGhpcy4gIE5vdGUgdGhhdAorCSAqICBzdGFydC9zdG9wIGFyZSBub3QgYWZmZWN0ZWQgYnkgY2hhbmdpbmcgdGhpcy4KKwkgKi8KKwlwcm90ZWN0ZWQgdmFyIF90ZXh0OlN0cmluZzsKKworCS8qKiBXaGF0IHRva2VuIG51bWJlciBpcyB0aGlzIGZyb20gMC4ubi0xIHRva2VuczsgPCAwIGltcGxpZXMgaW52YWxpZCBpbmRleCAqLworCXByb3RlY3RlZCB2YXIgX2luZGV4OmludCA9IC0xOworCisJLyoqIFRoZSBjaGFyIHBvc2l0aW9uIGludG8gdGhlIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGlzIHRva2VuIHN0YXJ0cyAqLworCXByb3RlY3RlZCB2YXIgX3N0YXJ0OmludDsKKworCS8qKiBUaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdG9wcyAqLworCXByb3RlY3RlZCB2YXIgX3N0b3A6aW50OworCisJcHVibGljIGZ1bmN0aW9uIENvbW1vblRva2VuKHR5cGU6aW50LCB0ZXh0OlN0cmluZyA9IG51bGwpIHsKKwkJdGhpcy5fdHlwZSA9IHR5cGU7CisJCXRoaXMuX3RleHQgPSB0ZXh0OworCX0KKworCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRnJvbVN0cmVhbShpbnB1dDpDaGFyU3RyZWFtLCB0eXBlOmludCwgY2hhbm5lbDppbnQsIHN0YXJ0OmludCwgc3RvcDppbnQpOkNvbW1vblRva2VuIHsKKwkJdmFyIHRva2VuOkNvbW1vblRva2VuID0gbmV3IENvbW1vblRva2VuKHR5cGUpOworCQl0b2tlbi5faW5wdXQgPSBpbnB1dDsKKwkJdG9rZW4uX2NoYW5uZWwgPSBjaGFubmVsOworCQl0b2tlbi5fc3RhcnQgPSBzdGFydDsKKwkJdG9rZW4uX3N0b3AgPSBzdG9wOworCQlyZXR1cm4gdG9rZW47CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xvbmVUb2tlbihvbGRUb2tlbjpUb2tlbik6Q29tbW9uVG9rZW4geworCQl2YXIgdG9rZW46Q29tbW9uVG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4ob2xkVG9rZW4udHlwZSwgb2xkVG9rZW4udGV4dCk7CisJCXRva2VuLl9saW5lID0gb2xkVG9rZW4ubGluZTsKKwkJdG9rZW4uX2luZGV4ID0gb2xkVG9rZW4udG9rZW5JbmRleDsKKwkJdG9rZW4uX2NoYXJQb3NpdGlvbkluTGluZSA9IG9sZFRva2VuLmNoYXJQb3NpdGlvbkluTGluZTsKKwkJdG9rZW4uX2NoYW5uZWwgPSBvbGRUb2tlbi5jaGFubmVsOworCQlpZiAoIG9sZFRva2VuIGlzIENvbW1vblRva2VuICkgeworCQkJdG9rZW4uX3N0YXJ0ID0gQ29tbW9uVG9rZW4ob2xkVG9rZW4pLnN0YXJ0SW5kZXg7CisJCQl0b2tlbi5fc3RvcCA9IENvbW1vblRva2VuKG9sZFRva2VuKS5zdG9wSW5kZXg7CisJCX0KKwkJcmV0dXJuIHRva2VuOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBnZXQgdHlwZSgpOmludCB7CisJCXJldHVybiBfdHlwZTsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gc2V0IGxpbmUobGluZTppbnQpOnZvaWQgeworCQlfbGluZSA9IGxpbmU7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCB0ZXh0KCk6U3RyaW5nIHsKKwkJaWYgKCBfdGV4dCE9bnVsbCApIHsKKwkJCXJldHVybiBfdGV4dDsKKwkJfQorCQlpZiAoIF9pbnB1dD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCV90ZXh0ID0gX2lucHV0LnN1YnN0cmluZyhfc3RhcnQsIF9zdG9wKTsKKwkJcmV0dXJuIF90ZXh0OworCX0KKworCS8qKiBPdmVycmlkZSB0aGUgdGV4dCBmb3IgdGhpcyB0b2tlbi4gIGdldFRleHQoKSB3aWxsIHJldHVybiB0aGlzIHRleHQKKwkgKiAgcmF0aGVyIHRoYW4gcHVsbGluZyBmcm9tIHRoZSBidWZmZXIuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuCisJICogIHRoYXQgc3RhcnQvc3RvcCBpbmRleGVzIGFyZSBub3QgdmFsaWQuICBJdCBtZWFucyB0aGF0IHRoYXQgaW5wdXQKKwkgKiAgd2FzIGNvbnZlcnRlZCB0byBhIG5ldyBzdHJpbmcgaW4gdGhlIHRva2VuIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgZnVuY3Rpb24gc2V0IHRleHQodGV4dDpTdHJpbmcpOnZvaWQgeworCQlfdGV4dCA9IHRleHQ7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCBsaW5lKCk6aW50IHsKKwkJcmV0dXJuIF9saW5lOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBnZXQgY2hhclBvc2l0aW9uSW5MaW5lKCk6aW50IHsKKwkJcmV0dXJuIF9jaGFyUG9zaXRpb25JbkxpbmU7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIHNldCBjaGFyUG9zaXRpb25JbkxpbmUoY2hhclBvc2l0aW9uSW5MaW5lOmludCk6dm9pZCB7CisJCV9jaGFyUG9zaXRpb25JbkxpbmUgPSBjaGFyUG9zaXRpb25JbkxpbmU7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCBjaGFubmVsKCk6aW50IHsKKwkJcmV0dXJuIF9jaGFubmVsOworCX0KKworCXB1YmxpYyBmdW5jdGlvbiBzZXQgY2hhbm5lbChjaGFubmVsOmludCk6dm9pZCB7CisJCV9jaGFubmVsID0gY2hhbm5lbDsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gc2V0IHR5cGUodHlwZTppbnQpOnZvaWQgeworCQlfdHlwZSA9IHR5cGU7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCBzdGFydEluZGV4KCk6aW50IHsKKwkJcmV0dXJuIF9zdGFydDsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gc2V0IHN0YXJ0SW5kZXgoc3RhcnQ6aW50KTp2b2lkIHsKKwkJX3N0YXJ0ID0gc3RhcnQ7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCBzdG9wSW5kZXgoKTppbnQgeworCQlyZXR1cm4gX3N0b3A7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIHNldCBzdG9wSW5kZXgoc3RvcDppbnQpOnZvaWQgeworCQlfc3RvcCA9IHN0b3A7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCB0b2tlbkluZGV4KCk6aW50IHsKKwkJcmV0dXJuIF9pbmRleDsKKwl9CisKKwlwdWJsaWMgZnVuY3Rpb24gc2V0IHRva2VuSW5kZXgoaW5kZXg6aW50KTp2b2lkIHsKKwkJX2luZGV4ID0gaW5kZXg7CisJfQorCisJcHVibGljIGZ1bmN0aW9uIGdldCBpbnB1dFN0cmVhbSgpOkNoYXJTdHJlYW0geworCQlyZXR1cm4gX2lucHV0OworCX0KKwkKKwlwdWJsaWMgZnVuY3Rpb24gc2V0IGlucHV0U3RyZWFtKGlucHV0OkNoYXJTdHJlYW0pOnZvaWQgeworCQlfaW5wdXQgPSBpbnB1dDsKKwl9CisJCisJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsKKwkJdmFyIGNoYW5uZWxTdHI6U3RyaW5nID0gIiI7CisJCWlmICggY2hhbm5lbD4wICkgeworCQkJY2hhbm5lbFN0cj0iLGNoYW5uZWw9IitjaGFubmVsOworCQl9CisJCXZhciB0eHQ6U3RyaW5nID0gdGV4dDsKKwkJaWYgKCB0eHQhPW51bGwgKSB7CisJCQl0eHQgPSB0eHQucmVwbGFjZSgiXG4iLCAiXFxcXG4iKTsKKwkJCXR4dCA9IHR4dC5yZXBsYWNlKCJcciIsICJcXFxcciIpOworCQkJdHh0ID0gdHh0LnJlcGxhY2UoIlx0IiwgIlxcXFx0Iik7CisJCX0KKwkJZWxzZSB7CisJCQl0eHQgPSAiPG5vIHRleHQ+IjsKKwkJfQorCQlyZXR1cm4gIltAIit0b2tlbkluZGV4KyIsIitzdGFydEluZGV4KyI6IitzdG9wSW5kZXgrIj0nIit0eHQrIicsPCIrdHlwZSsiPiIrY2hhbm5lbFN0cisiLCIrbGluZSsiOiIrY2hhclBvc2l0aW9uSW5MaW5lKyJdIjsKKwl9Cit9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlYmMwOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5hcwpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKworCS8qKiBUaGUgbW9zdCBjb21tb24gc3RyZWFtIG9mIHRva2VucyBpcyBvbmUgd2hlcmUgZXZlcnkgdG9rZW4gaXMgYnVmZmVyZWQgdXAKKwkgKiAgYW5kIHRva2VucyBhcmUgcHJlZmlsdGVyZWQgZm9yIGEgY2VydGFpbiBjaGFubmVsICh0aGUgcGFyc2VyIHdpbGwgb25seQorCSAqICBzZWUgdGhlc2UgdG9rZW5zIGFuZCBjYW5ub3QgY2hhbmdlIHRoZSBmaWx0ZXIgY2hhbm5lbCBudW1iZXIgZHVyaW5nIHRoZQorCSAqICBwYXJzZSkuCisJICoKKwkgKiAgVE9ETzogaG93IHRvIGFjY2VzcyB0aGUgZnVsbCB0b2tlbiBzdHJlYW0/ICBIb3cgdG8gdHJhY2sgYWxsIHRva2VucyBtYXRjaGVkIHBlciBydWxlPworCSAqLworCXB1YmxpYyBjbGFzcyBDb21tb25Ub2tlblN0cmVhbSBpbXBsZW1lbnRzIFRva2VuU3RyZWFtIHsKKwkgICAgcHJvdGVjdGVkIHZhciBfdG9rZW5Tb3VyY2U6VG9rZW5Tb3VyY2U7CisKKwkJLyoqIFJlY29yZCBldmVyeSBzaW5nbGUgdG9rZW4gcHVsbGVkIGZyb20gdGhlIHNvdXJjZSBzbyB3ZSBjYW4gcmVwcm9kdWNlCisJCSAqICBjaHVua3Mgb2YgaXQgbGF0ZXIuCisJCSAqLworCQlwcm90ZWN0ZWQgdmFyIHRva2VuczpBcnJheSA9IG5ldyBBcnJheSgpOworCQorCQkvKiogTWFwPHRva2VudHlwZSwgY2hhbm5lbD4gdG8gb3ZlcnJpZGUgc29tZSBUb2tlbnMnIGNoYW5uZWwgbnVtYmVycyAqLworCQlwcm90ZWN0ZWQgdmFyIGNoYW5uZWxPdmVycmlkZU1hcDpBcnJheTsKKwkKKwkJLyoqIFNldDx0b2tlbnR5cGU+OyBkaXNjYXJkIGFueSB0b2tlbnMgd2l0aCB0aGlzIHR5cGUgKi8KKwkJcHJvdGVjdGVkIHZhciBkaXNjYXJkU2V0OkFycmF5OworCQorCQkvKiogU2tpcCB0b2tlbnMgb24gYW55IGNoYW5uZWwgYnV0IHRoaXMgb25lOyB0aGlzIGlzIGhvdyB3ZSBza2lwIHdoaXRlc3BhY2UuLi4gKi8KKwkJcHJvdGVjdGVkIHZhciBjaGFubmVsOmludCA9IFRva2VuQ29uc3RhbnRzLkRFRkFVTFRfQ0hBTk5FTDsKKwkKKwkJLyoqIEJ5IGRlZmF1bHQsIHRyYWNrIGFsbCBpbmNvbWluZyB0b2tlbnMgKi8KKwkJcHJvdGVjdGVkIHZhciBfZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnM6Qm9vbGVhbiA9IGZhbHNlOworCQorCQkvKiogVHJhY2sgdGhlIGxhc3QgbWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gcmV3aW5kKCkuICovCisJCXByb3RlY3RlZCB2YXIgbGFzdE1hcmtlcjppbnQ7CisJCisJCS8qKiBUaGUgaW5kZXggaW50byB0aGUgdG9rZW5zIGxpc3Qgb2YgdGhlIGN1cnJlbnQgdG9rZW4gKG5leHQgdG9rZW4KKwkgICAgICogIHRvIGNvbnN1bWUpLiAgcD09LTEgaW5kaWNhdGVzIHRoYXQgdGhlIHRva2VucyBsaXN0IGlzIGVtcHR5CisJICAgICAqLworCSAgICBwcm90ZWN0ZWQgdmFyIHA6aW50ID0gLTE7CisKKwkJcHVibGljIGZ1bmN0aW9uIENvbW1vblRva2VuU3RyZWFtKHRva2VuU291cmNlOlRva2VuU291cmNlID0gbnVsbCwgY2hhbm5lbDppbnQgPSBUb2tlbkNvbnN0YW50cy5ERUZBVUxUX0NIQU5ORUwpIHsKKwkJCV90b2tlblNvdXJjZSA9IHRva2VuU291cmNlOworCQkJdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKwkJfQorCQorCQkvKiogUmVzZXQgdGhpcyB0b2tlbiBzdHJlYW0gYnkgc2V0dGluZyBpdHMgdG9rZW4gc291cmNlLiAqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHRva2VuU291cmNlKHRva2VuU291cmNlOlRva2VuU291cmNlKTp2b2lkIHsKKwkJCV90b2tlblNvdXJjZSA9IHRva2VuU291cmNlOworCQkJdG9rZW5zLmNsZWFyKCk7CisJCQlwID0gLTE7CisJCQljaGFubmVsID0gVG9rZW5Db25zdGFudHMuREVGQVVMVF9DSEFOTkVMOworCQl9CisJCisJCS8qKiBMb2FkIGFsbCB0b2tlbnMgZnJvbSB0aGUgdG9rZW4gc291cmNlIGFuZCBwdXQgaW4gdG9rZW5zLgorCQkgKiAgVGhpcyBpcyBkb25lIHVwb24gZmlyc3QgTFQgcmVxdWVzdCBiZWNhdXNlIHlvdSBtaWdodCB3YW50IHRvCisJCSAqICBzZXQgc29tZSB0b2tlbiB0eXBlIC8gY2hhbm5lbCBvdmVycmlkZXMgYmVmb3JlIGZpbGxpbmcgYnVmZmVyLgorCQkgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbGxCdWZmZXIoKTp2b2lkIHsKKwkJCXZhciBpbmRleDppbnQgPSAwOworCQkJdmFyIHQ6VG9rZW4gPSB0b2tlblNvdXJjZS5uZXh0VG9rZW4oKTsKKwkJCXdoaWxlICggdCE9bnVsbCAmJiB0LnR5cGUgIT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FT0YgKSB7CisJCQkJdmFyIGRpc2NhcmQ6Qm9vbGVhbiA9IGZhbHNlOworCQkJCS8vIGlzIHRoZXJlIGEgY2hhbm5lbCBvdmVycmlkZSBmb3IgdG9rZW4gdHlwZT8KKwkJCQlpZiAoIGNoYW5uZWxPdmVycmlkZU1hcCAhPSBudWxsICkgeworCQkJCQlpZiAoY2hhbm5lbE92ZXJyaWRlTWFwW3QudHlwZV0gIT0gdW5kZWZpbmVkKSB7CisJCQkJCQl0LmNoYW5uZWwgPSBjaGFubmVsT3ZlcnJpZGVNYXBbdC50eXBlXTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIGRpc2NhcmRTZXQgIT1udWxsICYmCisJCQkJCSBkaXNjYXJkU2V0W3QudHlwZV0gPT0gdHJ1ZSApCisJCQkJeworCQkJCQlkaXNjYXJkID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIF9kaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyAmJiB0LmNoYW5uZWwgIT0gdGhpcy5jaGFubmVsICkgeworCQkJCQlkaXNjYXJkID0gdHJ1ZTsKKwkJCQl9CisJCQkJaWYgKCAhZGlzY2FyZCApCXsKKwkJCQkJdC50b2tlbkluZGV4ID0gaW5kZXg7CisJCQkJCXRva2Vucy5wdXNoKHQpOworCQkJCQlpbmRleCsrOworCQkJCX0KKwkJCQl0ID0gdG9rZW5Tb3VyY2UubmV4dFRva2VuKCk7CisJCQl9CisJCQkvLyBsZWF2ZSBwIHBvaW50aW5nIGF0IGZpcnN0IHRva2VuIG9uIGNoYW5uZWwKKwkJCXAgPSAwOworCQkJcCA9IHNraXBPZmZUb2tlbkNoYW5uZWxzKHApOworCSAgICB9CisJCisJCS8qKiBNb3ZlIHRoZSBpbnB1dCBwb2ludGVyIHRvIHRoZSBuZXh0IGluY29taW5nIHRva2VuLiAgVGhlIHN0cmVhbQorCQkgKiAgbXVzdCBiZWNvbWUgYWN0aXZlIHdpdGggTFQoMSkgYXZhaWxhYmxlLiAgY29uc3VtZSgpIHNpbXBseQorCQkgKiAgbW92ZXMgdGhlIGlucHV0IHBvaW50ZXIgc28gdGhhdCBMVCgxKSBwb2ludHMgYXQgdGhlIG5leHQKKwkJICogIGlucHV0IHN5bWJvbC4gQ29uc3VtZSBhdCBsZWFzdCBvbmUgdG9rZW4uCisJCSAqCisJCSAqICBXYWxrIHBhc3QgYW55IHRva2VuIG5vdCBvbiB0aGUgY2hhbm5lbCB0aGUgcGFyc2VyIGlzIGxpc3RlbmluZyB0by4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBjb25zdW1lKCk6dm9pZCB7CisJCQlpZiAoIHA8dG9rZW5zLmxlbmd0aCApIHsKKwkgICAgICAgICAgICBwKys7CisJCQkJcCA9IHNraXBPZmZUb2tlbkNoYW5uZWxzKHApOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisJICAgICAgICB9CisJICAgIH0KKwkKKwkJLyoqIEdpdmVuIGEgc3RhcnRpbmcgaW5kZXgsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uLWNoYW5uZWwKKwkJICogIHRva2VuLgorCQkgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIHNraXBPZmZUb2tlbkNoYW5uZWxzKGk6aW50KTppbnQgeworCQkJdmFyIG46aW50ID0gdG9rZW5zLmxlbmd0aDsKKwkJCXdoaWxlICggaTxuICYmIChUb2tlbih0b2tlbnNbaV0pKS5jaGFubmVsICE9IGNoYW5uZWwpIHsKKwkJCQlpKys7CisJCQl9CisJCQlyZXR1cm4gaTsKKwkJfQorCQorCQlwcm90ZWN0ZWQgZnVuY3Rpb24gc2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGk6aW50KTppbnQgeworCQkJd2hpbGUgKCBpPj0gMCAmJiAoVG9rZW4odG9rZW5zW2ldKSkuY2hhbm5lbCAhPSBjaGFubmVsKSB7CisJCQkJaS0tOworCQkJfQorCQkJcmV0dXJuIGk7CisJCX0KKwkKKwkJLyoqIEEgc2ltcGxlIGZpbHRlciBtZWNoYW5pc20gd2hlcmVieSB5b3UgY2FuIHRlbGwgdGhpcyB0b2tlbiBzdHJlYW0KKwkJICogIHRvIGZvcmNlIGFsbCB0b2tlbnMgb2YgdHlwZSB0dHlwZSB0byBiZSBvbiBjaGFubmVsLiAgRm9yIGV4YW1wbGUsCisJCSAqICB3aGVuIGludGVycHJldGluZywgd2UgY2Fubm90IGV4ZWMgYWN0aW9ucyBzbyB3ZSBuZWVkIHRvIHRlbGwKKwkJICogIHRoZSBzdHJlYW0gdG8gZm9yY2UgYWxsIFdTIGFuZCBORVdMSU5FIHRvIGJlIGEgZGlmZmVyZW50LCBpZ25vcmVkCisJCSAqICBjaGFubmVsLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIHNldFRva2VuVHlwZUNoYW5uZWwodHR5cGU6aW50LCBjaGFubmVsOmludCk6dm9pZCB7CisJCQlpZiAoIGNoYW5uZWxPdmVycmlkZU1hcD09bnVsbCApIHsKKwkJCQljaGFubmVsT3ZlcnJpZGVNYXAgPSBuZXcgQXJyYXkoKTsKKwkJCX0KKwkgICAgICAgIGNoYW5uZWxPdmVycmlkZU1hcFt0dHlwZV0gPSBjaGFubmVsOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBkaXNjYXJkVG9rZW5UeXBlKHR0eXBlOmludCk6dm9pZCB7CisJCQlpZiAoIGRpc2NhcmRTZXQ9PW51bGwgKSB7CisJCQkJZGlzY2FyZFNldCA9IG5ldyBBcnJheSgpOworCQkJfQorCSAgICAgICAgZGlzY2FyZFNldFt0dHlwZV0gPSB0cnVlOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBkaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyhkaXNjYXJkT2ZmQ2hhbm5lbFRva2VuczpCb29sZWFuKTp2b2lkIHsKKwkJCV9kaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyA9IGRpc2NhcmRPZmZDaGFubmVsVG9rZW5zOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlbnMoKTpBcnJheSB7CisJCQlpZiAoIHAgPT0gLTEgKSB7CisJCQkJZmlsbEJ1ZmZlcigpOworCQkJfQorCQkJcmV0dXJuIHRva2VuczsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW5zUmFuZ2Uoc3RhcnQ6aW50LCBzdG9wOmludCk6QXJyYXkgeworCQkJcmV0dXJuIGdldFRva2Vuc0JpdFNldChzdGFydCwgc3RvcCwgbnVsbCk7CisJCX0KKwkKKwkJLyoqIEdpdmVuIGEgc3RhcnQgYW5kIHN0b3AgaW5kZXgsIHJldHVybiBhIExpc3Qgb2YgYWxsIHRva2VucyBpbgorCQkgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisJCSAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorCQkgKiAKKwkJICogUmVuYW1lZCBmcm9tIGdldFRva2VucworCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldFRva2Vuc0JpdFNldChzdGFydDppbnQsIHN0b3A6aW50LCB0eXBlczpCaXRTZXQpOkFycmF5IHsKKwkJCWlmICggcCA9PSAtMSApIHsKKwkJCQlmaWxsQnVmZmVyKCk7CisJCQl9CisJCQlpZiAoIHN0b3A+PXRva2Vucy5sZW5ndGggKSB7CisJCQkJc3RvcD10b2tlbnMubGVuZ3RoLTE7CisJCQl9CisJCQlpZiAoIHN0YXJ0PDAgKSB7CisJCQkJc3RhcnQ9MDsKKwkJCX0KKwkJCWlmICggc3RhcnQ+c3RvcCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkKKwkJCS8vIGxpc3QgPSB0b2tlbnNbc3RhcnQ6c3RvcF06e1Rva2VuIHQsIHQuZ2V0VHlwZSgpIGluIHR5cGVzfQorCQkJdmFyIGZpbHRlcmVkVG9rZW5zOkFycmF5ID0gbmV3IEFycmF5KCk7CisJCQlmb3IgKHZhciBpOmludD1zdGFydDsgaTw9c3RvcDsgaSsrKSB7CisJCQkJdmFyIHQ6VG9rZW4gPSBUb2tlbih0b2tlbnNbaV0pOworCQkJCWlmICggdHlwZXM9PW51bGwgfHwgdHlwZXMubWVtYmVyKHQudHlwZSkgKSB7CisJCQkJCWZpbHRlcmVkVG9rZW5zLnB1c2godCk7CisJCQkJfQorCQkJfQorCQkJaWYgKCBmaWx0ZXJlZFRva2Vucy5sZW5ndGg9PTAgKSB7CisJCQkJZmlsdGVyZWRUb2tlbnMgPSBudWxsOworCQkJfQorCQkJcmV0dXJuIGZpbHRlcmVkVG9rZW5zOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlbnNBcnJheShzdGFydDppbnQsIHN0b3A6aW50LCB0eXBlczpBcnJheSk6QXJyYXkgeworCQkJcmV0dXJuIGdldFRva2Vuc0JpdFNldChzdGFydCxzdG9wLG5ldyBCaXRTZXQodHlwZXMpKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW5zSW50KHN0YXJ0OmludCwgc3RvcDppbnQsIHR0eXBlOmludCk6QXJyYXkgeworCQkJcmV0dXJuIGdldFRva2Vuc0JpdFNldChzdGFydCxzdG9wLEJpdFNldC5vZih0dHlwZSkpOworCQl9CisJCisJCS8qKiBHZXQgdGhlIGl0aCB0b2tlbiBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIDEuLm4gd2hlcmUgaz0xIGlzIHRoZQorCQkgKiAgZmlyc3Qgc3ltYm9sIG9mIGxvb2thaGVhZC4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBMVChrOmludCk6VG9rZW4geworCQkJaWYgKCBwID09IC0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCWlmICggaz09MCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmICggazwwICkgeworCQkJCXJldHVybiBMQigtayk7CisJCQl9CisJCQkvL1N5c3RlbS5vdXQucHJpbnQoIkxUKHA9IitwKyIsIitrKyIpPSIpOworCQkJaWYgKCAocCtrLTEpID49IHRva2Vucy5sZW5ndGggKSB7CisJCQkJcmV0dXJuIFRva2VuQ29uc3RhbnRzLkVPRl9UT0tFTjsKKwkJCX0KKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy5nZXQocCtrLTEpKTsKKwkJCXZhciBpOmludCA9IHA7CisJCQl2YXIgbjppbnQgPSAxOworCQkJLy8gZmluZCBrIGdvb2QgdG9rZW5zCisJCQl3aGlsZSAoIG48ayApIHsKKwkJCQkvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworCQkJCWkgPSBza2lwT2ZmVG9rZW5DaGFubmVscyhpKzEpOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisJCQkJbisrOworCQkJfQorCQkJaWYgKCBpPj10b2tlbnMubGVuZ3RoICkgeworCQkJCXJldHVybiBUb2tlbkNvbnN0YW50cy5FT0ZfVE9LRU47CisJCQl9CisJICAgICAgICByZXR1cm4gVG9rZW4odG9rZW5zW2ldKTsKKwkgICAgfQorCQorCQkvKiogTG9vayBiYWNrd2FyZHMgayB0b2tlbnMgb24tY2hhbm5lbCB0b2tlbnMgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIExCKGs6aW50KTpUb2tlbiB7CisJCQkvL1N5c3RlbS5vdXQucHJpbnQoIkxCKHA9IitwKyIsIitrKyIpICIpOworCQkJaWYgKCBwID09IC0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCWlmICggaz09MCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmICggKHAtayk8MCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkKKwkJCXZhciBpOmludCA9IHA7CisJCQl2YXIgbjppbnQgPSAxOworCQkJLy8gZmluZCBrIGdvb2QgdG9rZW5zIGxvb2tpbmcgYmFja3dhcmRzCisJCQl3aGlsZSAoIG48PWsgKSB7CisJCQkJLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKwkJCQlpID0gc2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGktMSk7IC8vIGxlYXZlIHAgb24gdmFsaWQgdG9rZW4KKwkJCQluKys7CisJCQl9CisJCQlpZiAoIGk8MCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBUb2tlbih0b2tlbnNbaV0pOworCQl9CisJCisJCS8qKiBSZXR1cm4gYWJzb2x1dGUgdG9rZW4gaTsgaWdub3JlIHdoaWNoIGNoYW5uZWwgdGhlIHRva2VucyBhcmUgb247CisJCSAqICB0aGF0IGlzLCBjb3VudCBhbGwgdG9rZW5zIG5vdCBqdXN0IG9uLWNoYW5uZWwgdG9rZW5zLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldFRva2VuKGk6aW50KTpUb2tlbiB7CisJCQlyZXR1cm4gVG9rZW4odG9rZW5zW2ldKTsKKwkJfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gTEEoaTppbnQpOmludCB7CisJICAgICAgICByZXR1cm4gTFQoaSkudHlwZTsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gbWFyaygpOmludCB7CisJCQlpZiAoIHAgPT0gLTEgKSB7CisJCQkJZmlsbEJ1ZmZlcigpOworCQkJfQorCQkJbGFzdE1hcmtlciA9IGluZGV4OworCQkJcmV0dXJuIGxhc3RNYXJrZXI7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJlbGVhc2UobWFya2VyOmludCk6dm9pZCB7CisJCQkvLyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgc2l6ZSgpOmludCB7CisJCQlyZXR1cm4gdG9rZW5zLmxlbmd0aDsKKwkJfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0IGluZGV4KCk6aW50IHsKKwkgICAgICAgIHJldHVybiBwOworCSAgICB9CisJCisJCXB1YmxpYyBmdW5jdGlvbiByZXNldCgpOnZvaWQgeworCQkJcCA9IDA7CisJCQlsYXN0TWFya2VyID0gMDsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gcmV3aW5kVG8obWFya2VyOmludCk6dm9pZCB7CisJCQlzZWVrKG1hcmtlcik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJld2luZCgpOnZvaWQgeworCQkJc2VlayhsYXN0TWFya2VyKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gc2VlayhpbmRleDppbnQpOnZvaWQgeworCQkJcCA9IGluZGV4OworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdG9rZW5Tb3VyY2UoKTpUb2tlblNvdXJjZSB7CisJCQlyZXR1cm4gX3Rva2VuU291cmNlOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZyB7CisJCQlyZXR1cm4gdG9rZW5Tb3VyY2Uuc291cmNlTmFtZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsKKwkJCWlmICggcCA9PSAtMSApIHsKKwkJCQlmaWxsQnVmZmVyKCk7CisJCQl9CisJCQlyZXR1cm4gdG9TdHJpbmdXaXRoUmFuZ2UoMCwgdG9rZW5zLmxlbmd0aC0xKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmdXaXRoUmFuZ2Uoc3RhcnQ6aW50LCBzdG9wOmludCk6U3RyaW5nIHsKKwkJCWlmICggc3RhcnQ8MCB8fCBzdG9wPDAgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZiAoIHAgPT0gLTEgKSB7CisJCQkJZmlsbEJ1ZmZlcigpOworCQkJfQorCQkJaWYgKCBzdG9wPj10b2tlbnMubGVuZ3RoICkgeworCQkJCXN0b3AgPSB0b2tlbnMubGVuZ3RoLTE7CisJCQl9CisJIAkJdmFyIGJ1ZjpTdHJpbmcgPSAiIjsKKwkJCWZvciAodmFyIGk6aW50ID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSsrKSB7CisJCQkJdmFyIHQ6VG9rZW4gPSBUb2tlbih0b2tlbnNbaV0pOworCQkJCWJ1ZiArPSB0LnRleHQ7CisJCQl9CisJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nV2l0aFRva2VuUmFuZ2Uoc3RhcnQ6VG9rZW4sIHN0b3A6VG9rZW4pOlN0cmluZyB7CisJCQlpZiAoIHN0YXJ0IT1udWxsICYmIHN0b3AhPW51bGwgKSB7CisJCQkJcmV0dXJuIHRvU3RyaW5nV2l0aFJhbmdlKHN0YXJ0LnRva2VuSW5kZXgsIHN0b3AudG9rZW5JbmRleCk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9ERkEuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvREZBLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDcxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvREZBLmFzCkBAIC0wLDAgKzEsMjI1IEBACitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKwkKKwkvKiogQSBERkEgaW1wbGVtZW50ZWQgYXMgYSBzZXQgb2YgdHJhbnNpdGlvbiB0YWJsZXMuCisJICoKKwkgKiAgQW55IHN0YXRlIHRoYXQgaGFzIGEgc2VtYW50aWMgcHJlZGljYXRlIGVkZ2UgaXMgc3BlY2lhbDsgdGhvc2Ugc3RhdGVzCisJICogIGFyZSBnZW5lcmF0ZWQgd2l0aCBpZi10aGVuLWVsc2Ugc3RydWN0dXJlcyBpbiBhIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oKQorCSAqICB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgY3ljbGljREZBIHRlbXBsYXRlLgorCSAqCisJICogIFRoZXJlIGFyZSBhdCBtb3N0IDMyNzY3IHN0YXRlcyAoMTYtYml0IHNpZ25lZCBzaG9ydCkuCisJICogIENvdWxkIGdldCBhd2F5IHdpdGggYnl0ZSBzb21ldGltZXMgYnV0IHdvdWxkIGhhdmUgdG8gZ2VuZXJhdGUgZGlmZmVyZW50CisJICogIHR5cGVzIGFuZCB0aGUgc2ltdWxhdGlvbiBjb2RlIHRvby4gIEZvciBhIHBvaW50IG9mIHJlZmVyZW5jZSwgdGhlIEphdmEKKwkgKiAgbGV4ZXIncyBUb2tlbnMgcnVsZSBERkEgaGFzIDMyNiBzdGF0ZXMgcm91Z2hseS4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgREZBIHsKKwkJcHJvdGVjdGVkIHZhciBlb3Q6QXJyYXk7IC8vIHNob3J0W10KKwkJcHJvdGVjdGVkIHZhciBlb2Y6QXJyYXk7IC8vIHNob3J0W10KKwkJcHJvdGVjdGVkIHZhciBtaW46QXJyYXk7IC8vIGNoYXJbXQorCSAgICBwcm90ZWN0ZWQgdmFyIG1heDpBcnJheTsgLy8gY2hhcltdCisJICAgIHByb3RlY3RlZCB2YXIgYWNjZXB0OkFycmF5OyAvL3Nob3J0W10KKwkgICAgcHJvdGVjdGVkIHZhciBzcGVjaWFsOkFycmF5OyAvLyBzaG9ydFtdCisJICAgIHByb3RlY3RlZCB2YXIgdHJhbnNpdGlvbjpBcnJheTsgLy8gc2hvcnRbXVtdCisJCisJCXByb3RlY3RlZCB2YXIgZGVjaXNpb25OdW1iZXI6aW50OworCQorCQkvKiogV2hpY2ggcmVjb2duaXplciBlbmNsb3NlcyB0aGlzIERGQT8gIE5lZWRlZCB0byBjaGVjayBiYWNrdHJhY2tpbmcgKi8KKwkJcHJvdGVjdGVkIHZhciByZWNvZ25pemVyOkJhc2VSZWNvZ25pemVyOworCQorCQlwcml2YXRlIHZhciBfZGVzY3JpcHRpb246U3RyaW5nOworCQkKKwkJcHVibGljIHN0YXRpYyBjb25zdCBkZWJ1ZzpCb29sZWFuID0gZmFsc2U7CisKKwkJcHVibGljIGZ1bmN0aW9uIERGQShyZWNvZ25pemVyOkJhc2VSZWNvZ25pemVyLCBkZWNpc2lvbk51bWJlcjppbnQsIGRlc2NyaXB0aW9uOlN0cmluZywKKwkJCQkJCQllb3Q6QXJyYXksIGVvZjpBcnJheSwgbWluOkFycmF5LCBtYXg6QXJyYXksIGFjY2VwdDpBcnJheSwgc3BlY2lhbDpBcnJheSwgdHJhbnNpdGlvbjpBcnJheSwKKwkJCQkJCQlzcGVjaWFsU3RhdGVUcmFuc2l0aW9uRnVuY3Rpb246RnVuY3Rpb24gPSBudWxsLCBlcnJvckZ1bmN0aW9uOkZ1bmN0aW9uID0gbnVsbCkgewkJCQorCQkJdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKwkJCXRoaXMuZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKKwkJCXRoaXMuX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCQkKKwkJCXRoaXMuZW90ID0gZW90OworCQkJdGhpcy5lb2YgPSBlb2Y7CisJCQl0aGlzLm1pbiA9IG1pbjsKKwkJCXRoaXMubWF4ID0gbWF4OworCQkJdGhpcy5hY2NlcHQgPSBhY2NlcHQ7CisJCQl0aGlzLnNwZWNpYWwgPSBzcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKKwkJCQkJCQorCQkJaWYgKHNwZWNpYWxTdGF0ZVRyYW5zaXRpb25GdW5jdGlvbiAhPSBudWxsKSB7CisJCQkJc3BlY2lhbFN0YXRlVHJhbnNpdGlvbiA9IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb25GdW5jdGlvbjsKKwkJCX0KKwkJCQorCQkJaWYgKGVycm9yRnVuY3Rpb24gIT0gbnVsbCkgeworCQkJCWVycm9yID0gZXJyb3JGdW5jdGlvbjsKKwkJCX0KKwkJCQkJCQorCQl9CisJCS8qKiBGcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHByZWRpY3Qgd2hhdCBhbHRlcm5hdGl2ZSB3aWxsIHN1Y2NlZWQKKwkJICogIHVzaW5nIHRoaXMgREZBIChyZXByZXNlbnRpbmcgdGhlIGNvdmVyaW5nIHJlZ3VsYXIgYXBwcm94aW1hdGlvbgorCQkgKiAgdG8gdGhlIHVuZGVybHlpbmcgQ0ZMKS4gIFJldHVybiBhbiBhbHRlcm5hdGl2ZSBudW1iZXIgMS4ubi4gIFRocm93CisJCSAqICBhbiBleGNlcHRpb24gdXBvbiBlcnJvci4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBwcmVkaWN0KGlucHV0OkludFN0cmVhbSk6aW50CXsKKyAgICAJCWlmICggZGVidWcgKSB7CisgICAgCQkJdHJhY2UoIkVudGVyIERGQS5wcmVkaWN0IGZvciBkZWNpc2lvbiAiK2RlY2lzaW9uTnVtYmVyKTsKKyAgICAJCX0KKworCQkJdmFyIG1hcms6aW50ID0gaW5wdXQubWFyaygpOyAvLyByZW1lbWJlciB3aGVyZSBkZWNpc2lvbiBzdGFydGVkIGluIGlucHV0CisJCQl2YXIgczppbnQgPSAwOyAvLyB3ZSBhbHdheXMgc3RhcnQgYXQgczAKKwkJCXRyeSB7CisJCQkJd2hpbGUgKCB0cnVlICkgeworCQkJCQlpZiAoIGRlYnVnICkgdHJhY2UoIkRGQSAiK2RlY2lzaW9uTnVtYmVyKyIgc3RhdGUgIitzKyIgTEEoMSk9IitTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0LkxBKDEpKSsiKCIraW5wdXQuTEEoMSkrCisJCQkJCQkJCQkJCQkJIiksIGluZGV4PSIraW5wdXQuaW5kZXgpOworCQkJCQl2YXIgc3BlY2lhbFN0YXRlOmludCA9IHNwZWNpYWxbc107CisJCQkJCWlmICggc3BlY2lhbFN0YXRlPj0wICkgeworCQkJCQkJaWYgKCBkZWJ1ZyApIHsKKwkJCQkJCSAgICB0cmFjZSgiREZBICIrZGVjaXNpb25OdW1iZXIrCisJCQkJCQkJIiBzdGF0ZSAiK3MrIiBpcyBzcGVjaWFsIHN0YXRlICIrc3BlY2lhbFN0YXRlKTsKKwkJCQkJCX0KKwkJCQkJCXMgPSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKHRoaXMsIHNwZWNpYWxTdGF0ZSxpbnB1dCk7CisJCQkJCQlpZiAoIGRlYnVnICkgeworCQkJCQkJICAgIHRyYWNlKCJERkEgIitkZWNpc2lvbk51bWJlcisKKwkJCQkJCQkiIHJldHVybnMgZnJvbSBzcGVjaWFsIHN0YXRlICIrc3BlY2lhbFN0YXRlKyIgdG8gIitzKTsKKwkJCQkJICAgIH0KKwkJCQkJCWlmICggcz09LTEgKSB7CisJCQkJCQkgICAgbm9WaWFibGVBbHQocyxpbnB1dCk7CisJCQkJCQkgICAgcmV0dXJuIDA7CisJCQkJCSAgICB9CisJCQkJCQlpbnB1dC5jb25zdW1lKCk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZiAoIGFjY2VwdFtzXSA+PSAxICkgeworCQkJCQkJaWYgKCBkZWJ1ZyApIHRyYWNlKCJhY2NlcHQ7IHByZWRpY3QgIithY2NlcHRbc10rIiBmcm9tIHN0YXRlICIrcyk7CisJCQkJCQlyZXR1cm4gYWNjZXB0W3NdOworCQkJCQl9CisJCQkJCS8vIGxvb2sgZm9yIGEgbm9ybWFsIGNoYXIgdHJhbnNpdGlvbgorCQkJCQl2YXIgYzppbnQgPSBpbnB1dC5MQSgxKTsgLy8gLTEgPT0gXHVGRkZGLCBhbGwgdG9rZW5zIGZpdCBpbiA2NTAwMCBzcGFjZQorCQkJCQlpZiAoYz49bWluW3NdICYmIGM8PW1heFtzXSkgeworCQkJCQkJdmFyIHNuZXh0OmludCA9IHRyYW5zaXRpb25bc11bYy1taW5bc11dOyAvLyBtb3ZlIHRvIG5leHQgc3RhdGUKKwkJCQkJCWlmICggc25leHQgPCAwICkgeworCQkJCQkJCS8vIHdhcyBpbiByYW5nZSBidXQgbm90IGEgbm9ybWFsIHRyYW5zaXRpb24KKwkJCQkJCQkvLyBtdXN0IGNoZWNrIEVPVCwgd2hpY2ggaXMgbGlrZSB0aGUgZWxzZSBjbGF1c2UuCisJCQkJCQkJLy8gZW90W3NdPj0wIGluZGljYXRlcyB0aGF0IGFuIEVPVCBlZGdlIGdvZXMgdG8gYW5vdGhlcgorCQkJCQkJCS8vIHN0YXRlLgorCQkJCQkJCWlmICggZW90W3NdPj0wICkgeyAgLy8gRU9UIFRyYW5zaXRpb24gdG8gYWNjZXB0IHN0YXRlPworCQkJCQkJCQlpZiAoIGRlYnVnICkgdHJhY2UoIkVPVCB0cmFuc2l0aW9uIik7CisJCQkJCQkJCXMgPSBlb3Rbc107CisJCQkJCQkJCWlucHV0LmNvbnN1bWUoKTsKKwkJCQkJCQkJLy8gVE9ETzogSSBoYWQgdGhpcyBhcyByZXR1cm4gYWNjZXB0W2VvdFtzXV0KKwkJCQkJCQkJLy8gd2hpY2ggYXNzdW1lZCBoZXJlIHRoYXQgdGhlIEVPVCBlZGdlIGFsd2F5cworCQkJCQkJCQkvLyB3ZW50IHRvIGFuIGFjY2VwdC4uLmZhc3RlciB0byBkbyB0aGlzLCBidXQKKwkJCQkJCQkJLy8gd2hhdCBhYm91dCBwcmVkaWNhdGVkIGVkZ2VzIGNvbWluZyBmcm9tIEVPVAorCQkJCQkJCQkvLyB0YXJnZXQ/CisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKwkJCQkJCQlub1ZpYWJsZUFsdChzLGlucHV0KTsKKwkJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCX0KKwkJCQkJCXMgPSBzbmV4dDsKKwkJCQkJCWlucHV0LmNvbnN1bWUoKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWlmICggZW90W3NdPj0wICkgeyAgLy8gRU9UIFRyYW5zaXRpb24/CisJCQkJCQlpZiAoIGRlYnVnICkgdHJhY2UoIkVPVCB0cmFuc2l0aW9uIik7CisJCQkJCQlzID0gZW90W3NdOworCQkJCQkJaW5wdXQuY29uc3VtZSgpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJaWYgKCBjPT1Ub2tlbkNvbnN0YW50cy5FT0YgJiYgZW9mW3NdPj0wICkgeyAgLy8gRU9GIFRyYW5zaXRpb24gdG8gYWNjZXB0IHN0YXRlPworCQkJCQkJaWYgKCBkZWJ1ZyApIHRyYWNlKCJhY2NlcHQgdmlhIEVPRjsgcHJlZGljdCAiK2FjY2VwdFtlb2Zbc11dKyIgZnJvbSAiK2VvZltzXSk7CisJCQkJCQlyZXR1cm4gYWNjZXB0W2VvZltzXV07CisJCQkJCX0KKwkJCQkJLy8gbm90IGluIHJhbmdlIGFuZCBub3QgRU9GL0VPVCwgbXVzdCBiZSBpbnZhbGlkIHN5bWJvbAorCQkJCQlpZiAoIGRlYnVnICkgeworCQkJCQkJdHJhY2UoIm1pblsiK3MrIl09IittaW5bc10pOworCQkJCQkJdHJhY2UoIm1heFsiK3MrIl09IittYXhbc10pOworCQkJCQkJdHJhY2UoImVvdFsiK3MrIl09Iitlb3Rbc10pOworCQkJCQkJdHJhY2UoImVvZlsiK3MrIl09Iitlb2Zbc10pOworCQkJCQkJZm9yICh2YXIgcDppbnQ9MDsgcDx0cmFuc2l0aW9uW3NdLmxlbmd0aDsgcCsrKSB7CisJCQkJCQkJdHJhY2UodHJhbnNpdGlvbltzXVtwXSsiICIpOworCQkJCQkJfQorCQkJCQkJdHJhY2UoKTsKKwkJCQkJfQorCQkJCQlub1ZpYWJsZUFsdChzLGlucHV0KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJZmluYWxseSB7CisJCQkJaW5wdXQucmV3aW5kVG8obWFyayk7CisJCQl9CisJCQkvLyBub3QgcmVhY2hlZCAtLSBhZGRlZCBkdWUgdG8gYnVnIGluIEZsZXggY29tcGlsZXIgcmVhY2hhYmlsaXR5IGFuYWx5c2lzIG9mIHdoaWxlIGxvb3Agd2l0aCBubyBicmVha3MKKwkJCXJldHVybiAtMTsKKwkJfQorCQorCQlwcm90ZWN0ZWQgZnVuY3Rpb24gbm9WaWFibGVBbHQoczppbnQsIGlucHV0OkludFN0cmVhbSk6dm9pZCB7CisJCQlpZiAocmVjb2duaXplci5zdGF0ZS5iYWNrdHJhY2tpbmc+MCkgeworCQkJCXJlY29nbml6ZXIuc3RhdGUuZmFpbGVkPXRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdmFyIG52YWU6Tm9WaWFibGVBbHRFeGNlcHRpb24gPQorCQkJCW5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihkZXNjcmlwdGlvbiwKKwkJCQkJCQkJCQkgZGVjaXNpb25OdW1iZXIsCisJCQkJCQkJCQkJIHMsCisJCQkJCQkJCQkJIGlucHV0KTsKKwkJCWVycm9yKG52YWUpOworCQkJdGhyb3cgbnZhZTsKKwkJfQorCQorCQkvKiogQSBob29rIGZvciBkZWJ1Z2dpbmcgaW50ZXJmYWNlICovCisJCXB1YmxpYyB2YXIgZXJyb3I6RnVuY3Rpb24gPSBmdW5jdGlvbihudmFlOk5vVmlhYmxlQWx0RXhjZXB0aW9uKTpOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7IHJldHVybiBudmFlOyB9CisJCisJCXB1YmxpYyB2YXIgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbjpGdW5jdGlvbiA9IGZ1bmN0aW9uKGRmYTpERkEsIHM6aW50LCBpbnB1dDpJbnRTdHJlYW0pOmludCB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBkZXNjcmlwdGlvbigpOlN0cmluZyB7CisJCQlyZXR1cm4gX2Rlc2NyaXB0aW9uOwkKKwkJfQorCQorCQkvKiogR2l2ZW4gYSBTdHJpbmcgdGhhdCBoYXMgYSBydW4tbGVuZ3RoLWVuY29kaW5nIG9mIHNvbWUgdW5zaWduZWQgc2hvcnRzCisJCSAqICBsaWtlICJcMVwyXDNcOSIsIGNvbnZlcnQgdG8gc2hvcnRbXSB7Miw5LDksOX0uICBXZSBkbyB0aGlzIHRvIGF2b2lkCisJCSAqICBzdGF0aWMgc2hvcnRbXSB3aGljaCBnZW5lcmF0ZXMgc28gbXVjaCBpbml0IGNvZGUgdGhhdCB0aGUgY2xhc3Mgd29uJ3QKKwkJICogIGNvbXBpbGUuIDooCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVucGFja0VuY29kZWRTdHJpbmcoZW5jb2RlZFN0cmluZzpTdHJpbmcsIHVuc2lnbmVkOkJvb2xlYW4gPSBmYWxzZSk6QXJyYXkgeworCQkJLy8gd2FsayBmaXJzdCB0byBmaW5kIGhvdyBiaWcgaXQgaXMuCisJCQkvKiBEb24ndCBwcmUtYWxsb2NhdGUKKwkJCXZhciBzaXplOmludCA9IDA7CisJCQlmb3IgKHZhciBpOmludD0wOyBpPGVuY29kZWRTdHJpbmcubGVuZ3RoOyBpKz0yKSB7CisJCQkJc2l6ZSArPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSk7CisJCQl9CisJCQkqLworCQkJdmFyIGRhdGE6QXJyYXkgPSBuZXcgQXJyYXkoKTsKKwkJCXZhciBkaTppbnQgPSAwOworCQkJZm9yICh2YXIgaTppbnQ9MDsgaTxlbmNvZGVkU3RyaW5nLmxlbmd0aDsgaSs9MikgeworCQkJCXZhciBuOmludCA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKTsKKwkJCQlpZiAobiA+IDB4ODAwMCkgeworCQkJCSAgICAvLyBuZWVkIHRvIHJlYWQgYW5vdGhlciBieXRlCisJCQkJICAgIGkrKzsKKwkJCQkgICAgdmFyIGxvd0JpdHM6aW50ID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpOworCQkJCSAgICBuICY9IDB4ZmY7CisJCQkJICAgIG4gPDw9IDg7CisJCQkJICAgIG4gfD0gbG93Qml0czsKKwkJCQl9CisJCQkJdmFyIHY6aW50ID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkrMSk7CisJCQkJaWYgKHYgPiAweDgwMDApIHsKKwkJCQkgICAgLy8gbmVlZCB0byByZWFkIGFub3RoZXIgYnl0ZQorCQkJCSAgICBpKys7CisJCQkJICAgIGxvd0JpdHMgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSk7CisJCQkJICAgIHYgJj0gMHhmZjsKKwkJCQkgICAgdiA8PD0gODsKKwkJCQkgICAgdiB8PSBsb3dCaXRzOworCQkJCX0KKwkJCQlpZiAoIXVuc2lnbmVkICYmIHYgPiAweDdmZmYpIHsKKwkJCQkgICAgdiA9IC0oMHhmZmZmIC0gdiArIDEpOworCQkJCX0KKwkJCQkvLyBhZGQgdiBuIHRpbWVzIHRvIGRhdGEKKwkJCQlmb3IgKHZhciBqOmludD0xOyBqPD1uOyBqKyspIHsKKwkJCQkJZGF0YVtkaSsrXSA9IHY7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGRhdGE7CisJCX0KKwkKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvRWFybHlFeGl0RXhjZXB0aW9uLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjA0ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDM5IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUKK3sKKwkvKiogIFRoZSByZWNvZ25pemVyIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgZm9yIGEgKC4uKSsgbG9vcC4gKi8KKwlwdWJsaWMgY2xhc3MgRWFybHlFeGl0RXhjZXB0aW9uIGV4dGVuZHMgUmVjb2duaXRpb25FeGNlcHRpb24geworCQlwdWJsaWMgdmFyIGRlY2lzaW9uTnVtYmVyOmludDsKKwkKKwkJcHVibGljIGZ1bmN0aW9uIEVhcmx5RXhpdEV4Y2VwdGlvbihkZWNpc2lvbk51bWJlcjppbnQsIGlucHV0OkludFN0cmVhbSkgeworCQkJc3VwZXIoaW5wdXQpOworCQkJdGhpcy5kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzEzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmFzCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisKKwkvKiogQSBzZW1hbnRpYyBwcmVkaWNhdGUgZmFpbGVkIGR1cmluZyB2YWxpZGF0aW9uLiAgVmFsaWRhdGlvbiBvZiBwcmVkaWNhdGVzCisJICogIG9jY3VycyB3aGVuIG5vcm1hbGx5IHBhcnNpbmcgdGhlIGFsdGVybmF0aXZlIGp1c3QgbGlrZSBtYXRjaGluZyBhIHRva2VuLgorCSAqICBEaXNhbWJpZ3VhdGluZyBwcmVkaWNhdGUgZXZhbHVhdGlvbiBvY2N1cnMgd2hlbiB3ZSBob2lzdCBhIHByZWRpY2F0ZSBpbnRvCisJICogIGEgcHJlZGljdGlvbiBkZWNpc2lvbi4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIGV4dGVuZHMgUmVjb2duaXRpb25FeGNlcHRpb24geworCQlwdWJsaWMgdmFyIHJ1bGVOYW1lOlN0cmluZzsKKwkJcHVibGljIHZhciBwcmVkaWNhdGVUZXh0OlN0cmluZzsKKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQ6SW50U3RyZWFtLAorCQkJCQkJCQkJCXJ1bGVOYW1lOlN0cmluZywKKwkJCQkJCQkJCQlwcmVkaWNhdGVUZXh0OlN0cmluZykKKwkJeworCQkJc3VwZXIoaW5wdXQpOworCQkJdGhpcy5ydWxlTmFtZSA9IHJ1bGVOYW1lOworCQkJdGhpcy5wcmVkaWNhdGVUZXh0ID0gcHJlZGljYXRlVGV4dDsKKwkJfQorCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9JbnRTdHJlYW0uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvSW50U3RyZWFtLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTE5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvSW50U3RyZWFtLmFzCkBAIC0wLDAgKzEsMTIyIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCS8qKiBBIHNpbXBsZSBzdHJlYW0gb2YgaW50ZWdlcnMgdXNlZCB3aGVuIGFsbCBJIGNhcmUgYWJvdXQgaXMgdGhlIGNoYXIKKwkgKiAgb3IgdG9rZW4gdHlwZSBzZXF1ZW5jZSAoc3VjaCBhcyBpbnRlcnByZXRhdGlvbikuCisJICovCisJcHVibGljIGludGVyZmFjZSBJbnRTdHJlYW0geworCQlmdW5jdGlvbiBjb25zdW1lKCk6dm9pZDsKKwkKKwkJLyoqIEdldCBpbnQgYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBpbnQuCisJCSAqICBOZWdhdGl2ZSBpbmRleGVzIGFyZSBhbGxvd2VkLiAgTEEoLTEpIGlzIHByZXZpb3VzIHRva2VuICh0b2tlbgorCQkgKiAganVzdCBtYXRjaGVkKS4gIExBKC1pKSB3aGVyZSBpIGlzIGJlZm9yZSBmaXJzdCB0b2tlbiBzaG91bGQKKwkJICogIHlpZWxkIC0xLCBpbnZhbGlkIGNoYXIgLyBFT0YuCisJCSAqLworCQlmdW5jdGlvbiBMQShpOmludCk6aW50OworCQorCQkvKiogVGVsbCB0aGUgc3RyZWFtIHRvIHN0YXJ0IGJ1ZmZlcmluZyBpZiBpdCBoYXNuJ3QgYWxyZWFkeS4gIFJldHVybgorCSAgICAgKiAgY3VycmVudCBpbnB1dCBwb3NpdGlvbiwgaW5kZXgoKSwgb3Igc29tZSBvdGhlciBtYXJrZXIgc28gdGhhdAorCQkgKiAgd2hlbiBwYXNzZWQgdG8gcmV3aW5kKCkgeW91IGdldCBiYWNrIHRvIHRoZSBzYW1lIHNwb3QuCisJCSAqICByZXdpbmQobWFyaygpKSBzaG91bGQgbm90IGFmZmVjdCB0aGUgaW5wdXQgY3Vyc29yLiAgVGhlIExleGVyCisJCSAqICB0cmFjayBsaW5lL2NvbCBpbmZvIGFzIHdlbGwgYXMgaW5wdXQgaW5kZXggc28gaXRzIG1hcmtlcnMgYXJlCisJCSAqICBub3QgcHVyZSBpbnB1dCBpbmRleGVzLiAgU2FtZSBmb3IgdHJlZSBub2RlIHN0cmVhbXMuCisJICAgICAqLworCQlmdW5jdGlvbiBtYXJrKCk6aW50OworCQorCQkvKiogUmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCBpbmRleCAwLi5uIHdoZXJlIG4gaW5kaWNhdGVzIHRoZQorCSAgICAgKiAgbGFzdCBzeW1ib2wgaGFzIGJlZW4gcmVhZC4gIFRoZSBpbmRleCBpcyB0aGUgc3ltYm9sIGFib3V0IHRvIGJlCisJCSAqICByZWFkIG5vdCB0aGUgbW9zdCByZWNlbnRseSByZWFkIHN5bWJvbC4KKwkgICAgICovCisJCWZ1bmN0aW9uIGdldCBpbmRleCgpOmludDsKKwkKKwkJLyoqIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBuZXh0IGNhbGwgdG8gaW5kZXggd291bGQgcmV0dXJuIG1hcmtlci4KKwkJICogIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIGluZGV4KCkgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS4gIEl0J3MKKwkJICogIGp1c3QgYSBtYXJrZXIgdG8gaW5kaWNhdGUgd2hhdCBzdGF0ZSB0aGUgc3RyZWFtIHdhcyBpbi4gIFRoaXMgaXMKKwkJICogIGVzc2VudGlhbGx5IGNhbGxpbmcgcmVsZWFzZSgpIGFuZCBzZWVrKCkuICBJZiB0aGVyZSBhcmUgbWFya2VycworCQkgKiAgY3JlYXRlZCBhZnRlciB0aGlzIG1hcmtlciBhcmd1bWVudCwgdGhpcyByb3V0aW5lIG11c3QgdW5yb2xsIHRoZW0KKwkJICogIGxpa2UgYSBzdGFjay4gIEFzc3VtZSB0aGUgc3RhdGUgdGhlIHN0cmVhbSB3YXMgaW4gd2hlbiB0aGlzIG1hcmtlcgorCQkgKiAgd2FzIGNyZWF0ZWQuCisJCSAqLworCQlmdW5jdGlvbiByZXdpbmRUbyhtYXJrZXI6aW50KTp2b2lkOworCQorCQkvKiogUmV3aW5kIHRvIHRoZSBpbnB1dCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBtYXJrZXIuCisJCSAqICBVc2VkIGN1cnJlbnRseSBvbmx5IGFmdGVyIGEgY3ljbGljIERGQSBhbmQganVzdAorCQkgKiAgYmVmb3JlIHN0YXJ0aW5nIGEgc2VtL3N5biBwcmVkaWNhdGUgdG8gZ2V0IHRoZQorCQkgKiAgaW5wdXQgcG9zaXRpb24gYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGRlY2lzaW9uLgorCQkgKiAgRG8gbm90ICJwb3AiIHRoZSBtYXJrZXIgb2ZmIHRoZSBzdGF0ZS4gIG1hcmsoaSkKKwkJICogIGFuZCByZXdpbmQoaSkgc2hvdWxkIGJhbGFuY2Ugc3RpbGwuIEl0IGlzCisJCSAqICBsaWtlIGludm9raW5nIHJld2luZChsYXN0IG1hcmtlcikgYnV0IGl0IHNob3VsZCBub3QgInBvcCIKKwkJICogIHRoZSBtYXJrZXIgb2ZmLiAgSXQncyBsaWtlIHNlZWsobGFzdCBtYXJrZXIncyBpbnB1dCBwb3NpdGlvbikuCisJCSAqLworCQlmdW5jdGlvbiByZXdpbmQoKTp2b2lkOworCQorCQkvKiogWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKwkJICogIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisJCSAqICBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKwkJICogIHJld2luZCgpIGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dCB0aGUgYmFja3dhcmQgc2Vlay4KKwkJICogIFRoaXMgbXVzdCB0aHJvdyBhd2F5IHJlc291cmNlcyBmb3IgYWxsIG1hcmtlcnMgYmFjayB0byB0aGUgbWFya2VyCisJCSAqICBhcmd1bWVudC4gIFNvIGlmIHlvdSdyZSBuZXN0ZWQgNSBsZXZlbHMgb2YgbWFyaygpLCBhbmQgdGhlbiByZWxlYXNlKDIpCisJCSAqICB5b3UgaGF2ZSB0byByZWxlYXNlIHJlc291cmNlcyBmb3IgZGVwdGhzIDIuLjUuCisJCSAqLworCQlmdW5jdGlvbiByZWxlYXNlKG1hcmtlcjppbnQpOnZvaWQ7CisJCisJCS8qKiBTZXQgdGhlIGlucHV0IGN1cnNvciB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IGluZGV4LiAgVGhpcyBpcworCQkgKiAgbm9ybWFsbHkgdXNlZCB0byBzZWVrIGFoZWFkIGluIHRoZSBpbnB1dCBzdHJlYW0uICBObyBidWZmZXJpbmcgaXMKKwkJICogIHJlcXVpcmVkIHRvIGRvIHRoaXMgdW5sZXNzIHlvdSBrbm93IHlvdXIgc3RyZWFtIHdpbGwgdXNlIHNlZWsgdG8KKwkJICogIG1vdmUgYmFja3dhcmRzIHN1Y2ggYXMgd2hlbiBiYWNrdHJhY2tpbmcuCisJCSAqCisJCSAqICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHJld2luZCBpbiBpdHMgbXVsdGktZGlyZWN0aW9uYWwKKwkJICogIHJlcXVpcmVtZW50IGFuZCBpbiB0aGF0IGl0cyBhcmd1bWVudCBpcyBzdHJpY3RseSBhbiBpbnB1dCBjdXJzb3IgKGluZGV4KS4KKwkJICoKKwkJICogIEZvciBjaGFyIHN0cmVhbXMsIHNlZWtpbmcgZm9yd2FyZCBtdXN0IHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIHN1Y2gKKwkJICogIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisJCSAqICBiYWNrdHJhY2tpbmcgdXNpbmcgdGhlIG1hcmsvcmV3aW5kIG1lY2hhbmlzbSB0aGF0IHJlc3RvcmVzIHN0YXRlIGFuZAorCQkgKiAgc28gdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byB1cGRhdGUgc3RhdGUgd2hlbiBzZWVraW5nIGJhY2t3YXJkcy4KKwkJICoKKwkJICogIEN1cnJlbnRseSwgdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGZvciBlZmZpY2llbnQgYmFja3RyYWNraW5nIHVzaW5nCisJCSAqICBtZW1vaXphdGlvbiwgYnV0IGluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHVzZWQgZm9yIGluY3JlbWVudGFsIHBhcnNpbmcuCisJCSAqCisJCSAqICBUaGUgaW5kZXggaXMgMC4ubi0xLiAgQSBzZWVrIHRvIHBvc2l0aW9uIGkgbWVhbnMgdGhhdCBMQSgxKSB3aWxsCisJCSAqICByZXR1cm4gdGhlIGl0aCBzeW1ib2wuICBTbywgc2Vla2luZyB0byAwIG1lYW5zIExBKDEpIHdpbGwgcmV0dXJuIHRoZQorCQkgKiAgZmlyc3QgZWxlbWVudCBpbiB0aGUgc3RyZWFtLiAKKwkJICovCisJCWZ1bmN0aW9uIHNlZWsoaW5kZXg6aW50KTp2b2lkOworCQorCQkvKiogT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCBidXQKKwkJICogIG1pZ2h0IGJlIHVzZWZ1bCB0byBkaXNwbGF5IHRoZSBlbnRpcmUgc3RyZWFtIG9yIGZvciB0ZXN0aW5nLiAgVGhpcworCQkgKiAgdmFsdWUgaW5jbHVkZXMgYSBzaW5nbGUgRU9GLgorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IHNpemUoKTppbnQ7CisJCQorCQkvKiogV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorCQkgKiAgcGFzcyB0aGUgYnVjayBhbGwgdGhlIHdheSB0byB0aGUgbGV4ZXIgd2hvIGNhbiBhc2sgaXRzIGlucHV0IHN0cmVhbQorCQkgKiAgZm9yIHRoZSBmaWxlIG5hbWUgb3Igd2hhdGV2ZXIuCisJCSAqLworCQlmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZzsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0xleGVyLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL0xleGVyLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzQ5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTGV4ZXIuYXMKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisJCisJLyoqIEEgbGV4ZXIgaXMgcmVjb2duaXplciB0aGF0IGRyYXdzIGlucHV0IHN5bWJvbHMgZnJvbSBhIGNoYXJhY3RlciBzdHJlYW0uCisJICogIGxleGVyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LiBBIExleGVyIG9iamVjdAorCSAqICB1c2VzIHNpbXBsaWZpZWQgbWF0Y2goKSBhbmQgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtcyBpbiB0aGUgaW50ZXJlc3QKKwkgKiAgb2Ygc3BlZWQuCisJICovCisJcHVibGljIGNsYXNzIExleGVyIGV4dGVuZHMgQmFzZVJlY29nbml6ZXIgaW1wbGVtZW50cyBUb2tlblNvdXJjZSB7CisJCS8qKiBXaGVyZSBpcyB0aGUgbGV4ZXIgZHJhd2luZyBjaGFyYWN0ZXJzIGZyb20/ICovCisJICAgIHByb3RlY3RlZCB2YXIgaW5wdXQ6Q2hhclN0cmVhbTsKKwkKKwkJcHVibGljIGZ1bmN0aW9uIExleGVyKGlucHV0OkNoYXJTdHJlYW0gPSBudWxsLCBzdGF0ZTpSZWNvZ25pemVyU2hhcmVkU3RhdGUgPSBudWxsKSB7CisJCSAgICBzdXBlcihzdGF0ZSk7CisJCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisJCX0KKwkJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiByZXNldCgpOnZvaWQgeworCQkJc3VwZXIucmVzZXQoKTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgCQkvLyB3YWNrIExleGVyIHN0YXRlIHZhcmlhYmxlcworICAgIAkJaWYgKCBpbnB1dCE9bnVsbCApIHsKKyAgICAJCQlpbnB1dC5zZWVrKDApOyAvLyByZXdpbmQgdGhlIGlucHV0CisgICAgCQl9CisgICAgCQlpZiAoIHN0YXRlPT1udWxsICkgeworICAgIAkJCXJldHVybjsgLy8gbm8gc2hhcmVkIHN0YXRlIHdvcmsgdG8gZG8KKyAgICAJCX0KKyAgICAJCXN0YXRlLnRva2VuID0gbnVsbDsKKyAgICAJCXN0YXRlLnR5cGUgPSBUb2tlbkNvbnN0YW50cy5JTlZBTElEX1RPS0VOX1RZUEU7CisgICAgCQlzdGF0ZS5jaGFubmVsID0gVG9rZW5Db25zdGFudHMuREVGQVVMVF9DSEFOTkVMOworICAgIAkJc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IC0xOworICAgIAkJc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IC0xOworICAgIAkJc3RhdGUudG9rZW5TdGFydExpbmUgPSAtMTsKKyAgICAJCXN0YXRlLnRleHQgPSBudWxsOworCQl9CisJCisJCS8qKiBSZXR1cm4gYSB0b2tlbiBmcm9tIHRoaXMgc291cmNlOyBpLmUuLCBtYXRjaCBhIHRva2VuIG9uIHRoZSBjaGFyCisJCSAqICBzdHJlYW0uCisJCSAqLworCSAgICBwdWJsaWMgZnVuY3Rpb24gbmV4dFRva2VuKCk6VG9rZW4geworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlzdGF0ZS50b2tlbiA9IG51bGw7CisJCQkJc3RhdGUuY2hhbm5lbCA9IFRva2VuQ29uc3RhbnRzLkRFRkFVTFRfQ0hBTk5FTDsKKwkJCQlzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gaW5wdXQuaW5kZXg7CisJCQkJc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LmNoYXJQb3NpdGlvbkluTGluZTsKKwkJCQlzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LmxpbmU7CisJCQkJc3RhdGUudGV4dCA9IG51bGw7CisJCQkJaWYgKCBpbnB1dC5MQSgxKT09Q2hhclN0cmVhbUNvbnN0YW50cy5FT0YgKSB7CisJICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbkNvbnN0YW50cy5FT0ZfVE9LRU47CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIHRyeSB7CisJICAgICAgICAgICAgICAgIG1Ub2tlbnMoKTsKKwkJCQkJaWYgKCBzdGF0ZS50b2tlbj09bnVsbCApIHsKKwkJCQkJCWVtaXQoKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmICggc3RhdGUudG9rZW49PVRva2VuQ29uc3RhbnRzLlNLSVBfVE9LRU4gKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gc3RhdGUudG9rZW47CisJCQkJfQorCSAgICAgICAgICAgIGNhdGNoIChudmE6Tm9WaWFibGVBbHRFeGNlcHRpb24pIHsKKyAgICAJCQkJcmVwb3J0RXJyb3IobnZhKTsKKyAgICAJCQkJcmVjb3ZlcihudmEpOyAvLyB0aHJvdyBvdXQgY3VycmVudCBjaGFyIGFuZCB0cnkgYWdhaW4KKyAgICAJCQl9CisgICAgCQkJY2F0Y2ggKHJlOlJlY29nbml0aW9uRXhjZXB0aW9uKSB7CisgICAgCQkJCXJlcG9ydEVycm9yKHJlKTsKKyAgICAJCQkJLy8gbWF0Y2goKSByb3V0aW5lIGhhcyBhbHJlYWR5IGNhbGxlZCByZWNvdmVyKCkKKyAgICAJCQl9CisJICAgICAgICB9CisJICAgICAgICAvLyBDYW4ndCBoYXBwZW4sIGJ1dCB3aWxsIHF1aWV0IGNvbXBsaWVyIGVycm9yCisJICAgICAgICByZXR1cm4gbnVsbDsKKwkgICAgfQorCQorCQkvKiogSW5zdHJ1Y3QgdGhlIGxleGVyIHRvIHNraXAgY3JlYXRpbmcgYSB0b2tlbiBmb3IgY3VycmVudCBsZXhlciBydWxlCisJCSAqICBhbmQgbG9vayBmb3IgYW5vdGhlciB0b2tlbi4gIG5leHRUb2tlbigpIGtub3dzIHRvIGtlZXAgbG9va2luZyB3aGVuCisJCSAqICBhIGxleGVyIHJ1bGUgZmluaXNoZXMgd2l0aCB0b2tlbiBzZXQgdG8gU0tJUF9UT0tFTi4gIFJlY2FsbCB0aGF0CisJCSAqICBpZiB0b2tlbj09bnVsbCBhdCBlbmQgb2YgYW55IHRva2VuIHJ1bGUsIGl0IGNyZWF0ZXMgb25lIGZvciB5b3UKKwkJICogIGFuZCBlbWl0cyBpdC4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBza2lwKCk6dm9pZCB7CisJCQlzdGF0ZS50b2tlbiA9IFRva2VuQ29uc3RhbnRzLlNLSVBfVE9LRU47CisJCX0KKwkKKwkJLyoqIFRoaXMgaXMgdGhlIGxleGVyIGVudHJ5IHBvaW50IHRoYXQgc2V0cyBpbnN0YW5jZSB2YXIgJ3Rva2VuJyAqLworCQlwdWJsaWMgZnVuY3Rpb24gbVRva2VucygpOnZvaWQgeworCQkJLy8gYWJzdHJhY3QgZnVuY3Rpb24KKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7CisJCX0gCQorCQorCQkvKiogU2V0IHRoZSBjaGFyIHN0cmVhbSBhbmQgcmVzZXQgdGhlIGxleGVyICovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgY2hhclN0cmVhbShpbnB1dDpDaGFyU3RyZWFtKTp2b2lkIHsKKwkJCXRoaXMuaW5wdXQgPSBudWxsOworCQkJcmVzZXQoKTsKKwkJCXRoaXMuaW5wdXQgPSBpbnB1dDsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjaGFyU3RyZWFtKCk6Q2hhclN0cmVhbSB7CisJCQlyZXR1cm4gaW5wdXQ7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCBzb3VyY2VOYW1lKCk6U3RyaW5nIHsKKwkJCXJldHVybiBpbnB1dC5zb3VyY2VOYW1lOworCQl9CisJCQorCQkvKiogQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgZW1pdHMgcGVyIG5leHRUb2tlbiBpbnZvY2F0aW9uCisJCSAqICBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAgU3ViY2xhc3MgYW5kIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAorCQkgKiAgbmV4dFRva2VuICh0byBwdXNoIHRva2VucyBpbnRvIGEgbGlzdCBhbmQgcHVsbCBmcm9tIHRoYXQgbGlzdCByYXRoZXIKKwkJICogIHRoYW4gYSBzaW5nbGUgdmFyaWFibGUgYXMgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzKS4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBlbWl0VG9rZW4odG9rZW46VG9rZW4pOnZvaWQgeworCQkJc3RhdGUudG9rZW4gPSB0b2tlbjsKKwkJfQorCQorCQkvKiogVGhlIHN0YW5kYXJkIG1ldGhvZCBjYWxsZWQgdG8gYXV0b21hdGljYWxseSBlbWl0IGEgdG9rZW4gYXQgdGhlCisJCSAqICBvdXRlcm1vc3QgbGV4aWNhbCBydWxlLiAgVGhlIHRva2VuIG9iamVjdCBzaG91bGQgcG9pbnQgaW50byB0aGUKKwkJICogIGNoYXIgYnVmZmVyIHN0YXJ0Li5zdG9wLiAgSWYgdGhlcmUgaXMgYSB0ZXh0IG92ZXJyaWRlIGluICd0ZXh0JywKKwkJICogIHVzZSB0aGF0IHRvIHNldCB0aGUgdG9rZW4ncyB0ZXh0LiAgT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZW1pdAorCQkgKiAgY3VzdG9tIFRva2VuIG9iamVjdHMuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZW1pdCgpOlRva2VuIHsKKwkJCXZhciB0OlRva2VuID0gQ29tbW9uVG9rZW4uY3JlYXRlRnJvbVN0cmVhbShpbnB1dCwgc3RhdGUudHlwZSwgc3RhdGUuY2hhbm5lbCwgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCwgY2hhckluZGV4IC0gMSk7CisJCQl0LmxpbmUgPSBzdGF0ZS50b2tlblN0YXJ0TGluZTsKKwkJCXQudGV4dCA9IHN0YXRlLnRleHQ7CisJCQl0LmNoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisJCQllbWl0VG9rZW4odCk7CisJCQlyZXR1cm4gdDsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gbWF0Y2hTdHJpbmcoczpTdHJpbmcpOnZvaWQgeworCSAgICAgICAgdmFyIGk6aW50ID0gMDsKKwkgICAgICAgIHdoaWxlICggaTxzLmxlbmd0aCApIHsKKwkgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpICE9IHMuY2hhckNvZGVBdChpKSApIHsKKwkJCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKKwkJCQkJCXN0YXRlLmZhaWxlZCA9IHRydWU7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJdmFyIG10ZTpNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gPQorCQkJCQkJbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzLmNoYXJDb2RlQXQoaSksIGlucHV0KTsKKwkJCQkJcmVjb3ZlcihtdGUpOworCQkJCQl0aHJvdyBtdGU7CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIGkrKzsKKwkgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisJCQkJc3RhdGUuZmFpbGVkID0gZmFsc2U7CisJICAgICAgICB9CisJICAgIH0KKwkKKwkgICAgcHVibGljIGZ1bmN0aW9uIG1hdGNoQW55KCk6dm9pZCB7CisJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisJICAgIH0KKwkKKwkgICAgcHVibGljIGZ1bmN0aW9uIG1hdGNoKGM6aW50KTp2b2lkIHsKKwkgICAgICAgIGlmICggaW5wdXQuTEEoMSkhPWMgKSB7CisJCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKKwkJCQkJc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQl2YXIgbXRlOk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiA9CisJCQkJCW5ldyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oYywgaW5wdXQpOworCQkJCXJlY292ZXIobXRlKTsgIC8vIGRvbid0IHJlYWxseSByZWNvdmVyOyBqdXN0IGNvbnN1bWUgaW4gbGV4ZXIKKwkJCQl0aHJvdyBtdGU7CisJICAgICAgICB9CisJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisJCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKwkgICAgfQorCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gbWF0Y2hSYW5nZShhOmludCwgYjppbnQpOnZvaWQKKwkJeworCSAgICAgICAgaWYgKCBpbnB1dC5MQSgxKTxhIHx8IGlucHV0LkxBKDEpPmIgKSB7CisJCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKKwkJCQkJc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkgICAgICAgICAgICB2YXIgbXJlOk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiA9CisJCQkJCW5ldyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oYSxiLGlucHV0KTsKKwkJCQlyZWNvdmVyKG1yZSk7CisJCQkJdGhyb3cgbXJlOworCSAgICAgICAgfQorCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCQkJc3RhdGUuZmFpbGVkID0gZmFsc2U7CisJICAgIH0KKwkKKwkgICAgcHVibGljIGZ1bmN0aW9uIGdldCBsaW5lKCk6aW50IHsKKwkgICAgICAgIHJldHVybiBpbnB1dC5saW5lOworCSAgICB9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgY2hhclBvc2l0aW9uSW5MaW5lKCk6aW50IHsKKwkgICAgICAgIHJldHVybiBpbnB1dC5jaGFyUG9zaXRpb25JbkxpbmU7CisJICAgIH0KKwkKKwkJLyoqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlciBvZiBsb29rYWhlYWQ/ICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgY2hhckluZGV4KCk6aW50IHsKKwkJCXJldHVybiBpbnB1dC5pbmRleDsKKwkJfQorCQorCQkvKiogUmV0dXJuIHRoZSB0ZXh0IG1hdGNoZWQgc28gZmFyIGZvciB0aGUgY3VycmVudCB0b2tlbiBvciBhbnkKKwkJICogIHRleHQgb3ZlcnJpZGUuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHRleHQoKTpTdHJpbmcgeworCQkJaWYgKCBzdGF0ZS50ZXh0IT1udWxsICkgeworCQkJCXJldHVybiBzdGF0ZS50ZXh0OworCQkJfQorCQkJcmV0dXJuIGlucHV0LnN1YnN0cmluZyhzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LCBjaGFySW5kZXgtMSk7CisJCX0KKwkKKwkJLyoqIFNldCB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHRva2VuOyBpdCB3aXBlcyBhbnkgcHJldmlvdXMKKwkJICogIGNoYW5nZXMgdG8gdGhlIHRleHQuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHRleHQodGV4dDpTdHJpbmcpOnZvaWQgeworCQkJc3RhdGUudGV4dCA9IHRleHQ7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlcG9ydEVycm9yKGU6UmVjb2duaXRpb25FeGNlcHRpb24pOnZvaWQgeworCQkJZGlzcGxheVJlY29nbml0aW9uRXJyb3IodGhpcy50b2tlbk5hbWVzLCBlKTsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGU6UmVjb2duaXRpb25FeGNlcHRpb24sIHRva2VuTmFtZXM6QXJyYXkpOlN0cmluZyB7CisJCQl2YXIgbXNnOlN0cmluZyA9IG51bGw7CisJCQlpZiAoIGUgaXMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICkgeworCQkJCXZhciBtdGU6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uID0gTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGUpOworCQkJCW1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK2dldENoYXJFcnJvckRpc3BsYXkoZS5jKSsiIGV4cGVjdGluZyAiK2dldENoYXJFcnJvckRpc3BsYXkobXRlLmV4cGVjdGluZyk7CisJCQl9CisJCQllbHNlIGlmICggZSBpcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApIHsKKwkJCQl2YXIgbnZhZTpOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA9IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGUpOworCQkJCS8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiZGVjaXNpb249PDwiK252YWUuZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIj4+IgorCQkJCS8vIGFuZCAiKGRlY2lzaW9uPSIrbnZhZS5kZWNpc2lvbk51bWJlcisiKSBhbmQKKwkJCQkvLyAic3RhdGUgIitudmFlLnN0YXRlTnVtYmVyCisJCQkJbXNnID0gIm5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgIitnZXRDaGFyRXJyb3JEaXNwbGF5KGUuYyk7CisJCQl9CisJCQllbHNlIGlmICggZSBpcyBFYXJseUV4aXRFeGNlcHRpb24gKSB7CisJCQkJdmFyIGVlZTpFYXJseUV4aXRFeGNlcHRpb24gPSBFYXJseUV4aXRFeGNlcHRpb24oZSk7CisJCQkJLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICIoZGVjaXNpb249IitlZWUuZGVjaXNpb25OdW1iZXIrIikiCisJCQkJbXNnID0gInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpOworCQkJfQorCQkJZWxzZSBpZiAoIGUgaXMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiApIHsKKwkJCQl2YXIgbW5zZTpNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uID0gTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihlKTsKKwkJCQltc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIitnZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykrIiBleHBlY3Rpbmcgc2V0ICIrbW5zZS5leHBlY3Rpbmc7CisJCQl9CisJCQllbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICkgeworCQkJCXZhciBtc2U6TWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiA9IE1pc21hdGNoZWRTZXRFeGNlcHRpb24oZSk7CisJCQkJbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiK21zZS5leHBlY3Rpbmc7CisJCQl9CisJCQllbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gKSB7CisJCQkJdmFyIG1yZTpNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gPSBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oZSk7CisJCQkJbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiKworCQkJCQlnZXRDaGFyRXJyb3JEaXNwbGF5KG1yZS5hKSsiLi4iK2dldENoYXJFcnJvckRpc3BsYXkobXJlLmIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJbXNnID0gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKGUsIHRva2VuTmFtZXMpOworCQkJfQorCQkJcmV0dXJuIG1zZzsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhckVycm9yRGlzcGxheShjOmludCk6U3RyaW5nIHsKKwkJCXZhciBzOlN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7CisJCQlzd2l0Y2ggKCBjICkgeworCQkJCWNhc2UgVG9rZW5Db25zdGFudHMuRU9GIDoKKwkJCQkJcyA9ICI8RU9GPiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xuJyA6CisJCQkJCXMgPSAiXFxuIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHQnIDoKKwkJCQkJcyA9ICJcXHQiOworCQkJCQlicmVhazsKKwkJCQljYXNlICdccicgOgorCQkJCQlzID0gIlxcciI7CisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuICInIitzKyInIjsKKwkJfQorCQorCQkvKiogTGV4ZXJzIGNhbiBub3JtYWxseSBtYXRjaCBhbnkgY2hhciBpbiBpdCdzIHZvY2FidWxhcnkgYWZ0ZXIgbWF0Y2hpbmcKKwkJICogIGEgdG9rZW4sIHNvIGRvIHRoZSBlYXN5IHRoaW5nIGFuZCBqdXN0IGtpbGwgYSBjaGFyYWN0ZXIgYW5kIGhvcGUKKwkJICogIGl0IGFsbCB3b3JrcyBvdXQuICBZb3UgY2FuIGluc3RlYWQgdXNlIHRoZSBydWxlIGludm9jYXRpb24gc3RhY2sKKwkJICogIHRvIGRvIHNvcGhpc3RpY2F0ZWQgZXJyb3IgcmVjb3ZlcnkgaWYgeW91IGFyZSBpbiBhIGZyYWdtZW50IHJ1bGUuCisJCSAqIAorCQkgKiAgQHJldHVybiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBleGNlcHRpb24gaXQgd2FzIHByb3ZpZGVkIGFzIGFuCisJCSAqICBhcmd1bWVudC4gIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBKYXZhIHJ1bnRpbWUgc28gdGhhdCBhbiBleGNlcHRpb24gdmFyaWFibGUKKwkJICogIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLCB0aHVzIHJlZHVjaW5nIGEgbGFyZ2UKKwkJICogIG51bWJlciBvZiBjb21waWxlciB3YXJuaW5ncyBpbiBnZW5lcmF0ZWQgY29kZS4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiByZWNvdmVyKHJlOlJlY29nbml0aW9uRXhjZXB0aW9uKTpSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJCQlpbnB1dC5jb25zdW1lKCk7CisJCQlyZXR1cm4gcmU7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRyYWNlSW4ocnVsZU5hbWU6U3RyaW5nLCBydWxlSW5kZXg6aW50KTp2b2lkIHsKKwkJCXZhciBpbnB1dFN5bWJvbDpTdHJpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0LkxUKDEpKSsiIGxpbmU9IisgbGluZSArIjoiKyBjaGFyUG9zaXRpb25JbkxpbmU7CisJCQlzdXBlci50cmFjZUluU3ltYm9sKHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gdHJhY2VPdXQocnVsZU5hbWU6U3RyaW5nLCBydWxlSW5kZXg6aW50KTp2b2lkIHsKKwkJCXZhciBpbnB1dFN5bWJvbDpTdHJpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0LkxUKDEpKSsiIGxpbmU9IisgbGluZSArIjoiKyBjaGFyUG9zaXRpb25JbkxpbmU7CisJCQlzdXBlci50cmFjZU91dFN5bWJvbChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRiYjljCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uYXMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKworCXB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIGV4dGVuZHMgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiB7CisJCisJCXB1YmxpYyBmdW5jdGlvbiBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKGV4cGVjdGluZzpCaXRTZXQsIGlucHV0OkludFN0cmVhbSkgeworCQkJc3VwZXIoZXhwZWN0aW5nLCBpbnB1dCk7CisJCX0KKworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODY0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmFzCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZQoreworCXB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJCXB1YmxpYyB2YXIgYTppbnQsIGI6aW50OworCQorCQlwdWJsaWMgZnVuY3Rpb24gTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKGE6aW50LCBiOmludCwgaW5wdXQ6SW50U3RyZWFtKSB7CisJCQlzdXBlcihpbnB1dCk7CisJCQl0aGlzLmEgPSBhOworCQkJdGhpcy5iID0gYjsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeworCQkJcmV0dXJuICJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKCIrdW5leHBlY3RlZFR5cGUrIiBub3QgaW4gWyIrYSsiLCIrYisiXSkiOworCQl9CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBkMjBmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uYXMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKworCXB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGV4dGVuZHMgUmVjb2duaXRpb25FeGNlcHRpb24geworCQlwdWJsaWMgdmFyIGV4cGVjdGluZzpCaXRTZXQ7CisJCisJCXB1YmxpYyBmdW5jdGlvbiBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKGV4cGVjdGluZzpCaXRTZXQsIGlucHV0OkludFN0cmVhbSkgeworCQkJc3VwZXIoaW5wdXQpOworCQkJdGhpcy5leHBlY3RpbmcgPSBleHBlY3Rpbmc7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsKKwkJCXJldHVybiAiTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigiK3VuZXhwZWN0ZWRUeXBlKyIhPSIrZXhwZWN0aW5nKyIpIjsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZiMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDQ1IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCisgICAgLyoqIEEgbWlzbWF0Y2hlZCBjaGFyIG9yIFRva2VuIG9yIHRyZWUgbm9kZSAqLworCXB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gZXh0ZW5kcyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJCXB1YmxpYyB2YXIgZXhwZWN0aW5nOmludCA9IFRva2VuQ29uc3RhbnRzLklOVkFMSURfVE9LRU5fVFlQRTsKKworCQlwdWJsaWMgZnVuY3Rpb24gTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGV4cGVjdGluZzppbnQsIGlucHV0OkludFN0cmVhbSkgeworCQkJc3VwZXIoaW5wdXQpOworCQkJdGhpcy5leHBlY3RpbmcgPSBleHBlY3Rpbmc7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsKKwkJCXJldHVybiAiTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKCIrdW5leHBlY3RlZFR5cGUrIiE9IitleHBlY3RpbmcrIikiOworCQl9CisJfQorCisJCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwODUzMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uYXMKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZU5vZGVTdHJlYW07CisJCisJcHVibGljIGNsYXNzIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiBleHRlbmRzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwkJcHVibGljIHZhciBleHBlY3Rpbmc6aW50OworCQorCQlwdWJsaWMgZnVuY3Rpb24gTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKGV4cGVjdGluZzppbnQsIGlucHV0OlRyZWVOb2RlU3RyZWFtKSB7CisJCQlzdXBlcihpbnB1dCk7CisJCQl0aGlzLmV4cGVjdGluZyA9IGV4cGVjdGluZzsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeworCQkJcmV0dXJuICJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oIit1bmV4cGVjdGVkVHlwZSsiIT0iK2V4cGVjdGluZysiKSI7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNzaW5nVG9rZW5FeGNlcHRpb24uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxYWJmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNzaW5nVG9rZW5FeGNlcHRpb24uYXMKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisJCisgICAgcHVibGljIGNsYXNzIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbiBleHRlbmRzIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiB7CisgICAgCQorICAgIAlwdWJsaWMgdmFyIGluc2VydGVkOk9iamVjdDsKKyAgICAJCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBNaXNzaW5nVG9rZW5FeGNlcHRpb24oZXhwZWN0aW5nOmludCwgaW5wdXQ6SW50U3RyZWFtLCBpbnNlcnRlZDpPYmplY3QpIHsKKyAgICAgICAgICAgIHN1cGVyKGV4cGVjdGluZywgaW5wdXQpOworICAgICAgICAgICAgdGhpcy5pbnNlcnRlZCA9IGluc2VydGVkOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0IG1pc3NpbmdUeXBlKCk6aW50IHsKKyAgICAgICAgICAgIHJldHVybiBleHBlY3Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisgICAgICAgICAgICBpZiAoIGluc2VydGVkIT1udWxsICYmIHRva2VuIT1udWxsICkgeworCQkJCXJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGluc2VydGVkICIraW5zZXJ0ZWQrIiBhdCAiK3Rva2VuLnRleHQrIikiOworCQkJfQorCQkJaWYgKCB0b2tlbiE9bnVsbCApIHsKKwkJCQlyZXR1cm4gIk1pc3NpbmdUb2tlbkV4Y2VwdGlvbihhdCAiK3Rva2VuLnRleHQrIikiOworCQkJfQorCQkJcmV0dXJuICJNaXNzaW5nVG9rZW5FeGNlcHRpb24iOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlN2E2NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDU2IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCisJcHVibGljIGNsYXNzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIGV4dGVuZHMgUmVjb2duaXRpb25FeGNlcHRpb24geworCQlwdWJsaWMgdmFyIGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOlN0cmluZzsKKwkJcHVibGljIHZhciBkZWNpc2lvbk51bWJlcjppbnQ7CisJCXB1YmxpYyB2YXIgc3RhdGVOdW1iZXI6aW50OworCQkKKwkJcHVibGljIGZ1bmN0aW9uIE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOlN0cmluZywKKwkJCQkJCQkJCWRlY2lzaW9uTnVtYmVyOmludCwKKwkJCQkJCQkJCXN0YXRlTnVtYmVyOmludCwKKwkJCQkJCQkJCWlucHV0OkludFN0cmVhbSkKKwkJeworCQkJc3VwZXIoaW5wdXQpOworCQkJdGhpcy5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiA9IGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOworCQkJdGhpcy5kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyOworCQkJdGhpcy5zdGF0ZU51bWJlciA9IHN0YXRlTnVtYmVyOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCQlpZiAoIGlucHV0IGlzIENoYXJTdHJlYW0gKSB7CisJCQkJcmV0dXJuICJOb1ZpYWJsZUFsdEV4Y2VwdGlvbignIitTdHJpbmcuZnJvbUNoYXJDb2RlKHVuZXhwZWN0ZWRUeXBlKSsiJ0BbIitncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbisiXSkiOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmV0dXJuICJOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiK3VuZXhwZWN0ZWRUeXBlKyJAWyIrZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIl0pIjsKKwkJCX0KKwkJfQorCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1BhcnNlci5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTU4MzM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1BhcnNlci5hcwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKyAgICBpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvcjsKKyAgICAKKwkvKiogQSBwYXJzZXIgZm9yIFRva2VuU3RyZWFtcy4gICJwYXJzZXIgZ3JhbW1hcnMiIHJlc3VsdCBpbiBhIHN1YmNsYXNzCisJICogIG9mIHRoaXMuCisJICovCisJcHVibGljIGNsYXNzIFBhcnNlciBleHRlbmRzIEJhc2VSZWNvZ25pemVyIHsKKwkgICAgcHJvdGVjdGVkIHZhciBpbnB1dDpUb2tlblN0cmVhbTsKKwkKKwkJcHVibGljIGZ1bmN0aW9uIFBhcnNlcihpbnB1dDpUb2tlblN0cmVhbSwgc3RhdGU6UmVjb2duaXplclNoYXJlZFN0YXRlID0gbnVsbCkgeworCQkJc3VwZXIoc3RhdGUpOworCQkJdG9rZW5TdHJlYW0gPSBpbnB1dDsKKwkgICAgfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVzZXQoKTp2b2lkIHsKKwkJCXN1cGVyLnJlc2V0KCk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworCQkJaWYgKCBpbnB1dCE9bnVsbCApIHsKKwkJCQlpbnB1dC5zZWVrKDApOyAvLyByZXdpbmQgdGhlIGlucHV0CisJCQl9CisJCX0KKworCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0Q3VycmVudElucHV0U3ltYm9sKGlucHV0OkludFN0cmVhbSk6T2JqZWN0IHsKKwkJCXJldHVybiBUb2tlblN0cmVhbShpbnB1dCkuTFQoMSk7CisJCX0KKwkKKwkJcHJvdGVjdGVkIG92ZXJyaWRlIGZ1bmN0aW9uIGdldE1pc3NpbmdTeW1ib2woaW5wdXQ6SW50U3RyZWFtLAorCQkJCQkJCQkJCSAgICBlOlJlY29nbml0aW9uRXhjZXB0aW9uLAorCQkJCQkJCQkJCSAgICBleHBlY3RlZFRva2VuVHlwZTppbnQsCisJCQkJCQkJCQkJICAgIGZvbGxvdzpCaXRTZXQpOk9iamVjdCB7CisJCSAgICB2YXIgdG9rZW5UZXh0OlN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGV4cGVjdGVkVG9rZW5UeXBlPT1Ub2tlbkNvbnN0YW50cy5FT0YgKSB0b2tlblRleHQgPSAiPG1pc3NpbmcgRU9GPiI7CisgICAgICAgICAgICBlbHNlIHRva2VuVGV4dCA9ICI8bWlzc2luZyAiK3Rva2VuTmFtZXNbZXhwZWN0ZWRUb2tlblR5cGVdKyI+IjsKKwkJCXZhciB0OkNvbW1vblRva2VuID0gbmV3IENvbW1vblRva2VuKGV4cGVjdGVkVG9rZW5UeXBlLCB0b2tlblRleHQpOworCQkJdmFyIGN1cnJlbnQ6VG9rZW4gPSBUb2tlblN0cmVhbShpbnB1dCkuTFQoMSk7CisJCQlpZiAoIGN1cnJlbnQudHlwZSA9PSBUb2tlbkNvbnN0YW50cy5FT0YgKSB7CisJCQkJY3VycmVudCA9IFRva2VuU3RyZWFtKGlucHV0KS5MVCgtMSk7CisJCQl9CisJCQl0LmxpbmUgPSBjdXJyZW50LmxpbmU7CisJCQl0LmNoYXJQb3NpdGlvbkluTGluZSA9IGN1cnJlbnQuY2hhclBvc2l0aW9uSW5MaW5lOworCQkJdC5jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworCQkJcmV0dXJuIHQ7CisJCX0KKwkKKwkJLyoqIFNldCB0aGUgdG9rZW4gc3RyZWFtIGFuZCByZXNldCB0aGUgcGFyc2VyICovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgdG9rZW5TdHJlYW0oaW5wdXQ6VG9rZW5TdHJlYW0pOnZvaWQgeworCQkJdGhpcy5pbnB1dCA9IG51bGw7CisJCQlyZXNldCgpOworCQkJdGhpcy5pbnB1dCA9IGlucHV0OworCQl9CisJCQorCSAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0IHRva2VuU3RyZWFtKCk6VG9rZW5TdHJlYW0geworCQkJcmV0dXJuIGlucHV0OworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZyB7CisJCQlyZXR1cm4gaW5wdXQuc291cmNlTmFtZTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIHNldCB0cmVlQWRhcHRvcihhZGFwdG9yOlRyZWVBZGFwdG9yKTp2b2lkIHsKKwkJICAgIC8vIGRvIG5vdGhpbmcsIGltcGxlbWVudGVkIGluIGdlbmVyYXRlZCBjb2RlCisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdHJlZUFkYXB0b3IoKTpUcmVlQWRhcHRvciB7CisJCSAgICAvLyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiBnZW5lcmF0ZWQgY29kZQorCQkgICAgcmV0dXJuIG51bGw7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiB0cmFjZUluKHJ1bGVOYW1lOlN0cmluZywgcnVsZUluZGV4OmludCk6dm9pZCAgeworCQkJc3VwZXIudHJhY2VJblN5bWJvbChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRyYWNlT3V0KHJ1bGVOYW1lOlN0cmluZywgcnVsZUluZGV4OmludCk6dm9pZCB7CisJCQlzdXBlci50cmFjZU91dFN5bWJvbChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTMxNTQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5hcwpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lCit7CisJLyoqIFJ1bGVzIHRoYXQgcmV0dXJuIG1vcmUgdGhhbiBhIHNpbmdsZSB2YWx1ZSBtdXN0IHJldHVybiBhbiBvYmplY3QKKwkgKiAgY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcy4gIEJlc2lkZXMgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbgorCSAqICBSdWxlTGFiZWxTY29wZS5wcmVkZWZpbmVkUnVsZVByb3BlcnRpZXNTY29wZSB0aGVyZSBtYXkgYmUgdXNlci1kZWZpbmVkCisJICogIHJldHVybiB2YWx1ZXMuICBUaGlzIGNsYXNzIHNpbXBseSBkZWZpbmVzIHRoZSBtaW5pbXVtIHByb3BlcnRpZXMgdGhhdAorCSAqICBhcmUgYWx3YXlzIGRlZmluZWQgYW5kIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBvdGhlcnMgdGhhdCBtaWdodCBiZQorCSAqICBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIG91dHB1dCBvcHRpb24gc3VjaCBhcyB0ZW1wbGF0ZSBhbmQgdHJlZS4KKwkgKgorCSAqICBOb3RlIHRleHQgaXMgbm90IGFuIGFjdHVhbCBwcm9wZXJ0eSBvZiB0aGUgcmV0dXJuIHZhbHVlLCBpdCBpcyBjb21wdXRlZAorCSAqICBmcm9tIHN0YXJ0IGFuZCBzdG9wIHVzaW5nIHRoZSBpbnB1dCBzdHJlYW0ncyB0b1N0cmluZygpIG1ldGhvZC4gIEkKKwkgKiAgY291bGQgYWRkIGEgY3RvciB0byB0aGlzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaW4gYW5kIHN0b3JlIHRoZSBpbnB1dAorCSAqICBzdHJlYW0sIGJ1dCBJJ20gbm90IHN1cmUgd2Ugd2FudCB0byBkbyB0aGF0LiAgSXQgd291bGQgc2VlbSB0byBiZSB1bmRlZmluZWQKKwkgKiAgdG8gZ2V0IHRoZSAudGV4dCBwcm9wZXJ0eSBhbnl3YXkgaWYgdGhlIHJ1bGUgbWF0Y2hlcyB0b2tlbnMgZnJvbSBtdWx0aXBsZQorCSAqICBpbnB1dCBzdHJlYW1zLgorCSAqCisJICogIEkgZG8gbm90IHVzZSBnZXR0ZXJzIGZvciBmaWVsZHMgb2Ygb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHNpbXBseSB0bworCSAqICBncm91cCB2YWx1ZXMgc3VjaCBhcyB0aGlzIGFnZ3JlZ2F0ZS4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgUGFyc2VyUnVsZVJldHVyblNjb3BlIGV4dGVuZHMgUnVsZVJldHVyblNjb3BlIHsKKwkJcHJpdmF0ZSB2YXIgX3N0YXJ0VG9rZW46VG9rZW47CisJCXByaXZhdGUgdmFyIF9zdG9wVG9rZW46VG9rZW47CisJCXByaXZhdGUgdmFyIF90cmVlOk9iamVjdDsgIC8vIGlmIG91dHB1dD1BU1QgdGhpcyBjb250YWlucyB0aGUgdHJlZQorCQlwcml2YXRlIHZhciBfdmFsdWVzOk9iamVjdCA9IG5ldyBPYmplY3QoKTsgLy8gY29udGFpbnMgdGhlIHJldHVybiB2YWx1ZXMKKwkJCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHN0YXJ0KCk6T2JqZWN0IHsKKwkJCXJldHVybiBfc3RhcnRUb2tlbjsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgc3RhcnQodG9rZW46T2JqZWN0KTp2b2lkIHsKKwkJCV9zdGFydFRva2VuID0gVG9rZW4odG9rZW4pOworCQl9CQkKKwkJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgc3RvcCgpOk9iamVjdCB7IAorCQkJcmV0dXJuIF9zdG9wVG9rZW47CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgc3RvcCh0b2tlbjpPYmplY3QpOnZvaWQgeworCQkJX3N0b3BUb2tlbiA9IFRva2VuKHRva2VuKTsKKwkJfQorCQkKKwkJLyoqIEhhcyBhIHZhbHVlIHBvdGVudGlhbGx5IGlmIG91dHB1dD1BU1Q7ICovCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgdHJlZSgpOk9iamVjdCB7CisJCQkgcmV0dXJuIF90cmVlOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHRyZWUodHJlZTpPYmplY3QpOnZvaWQgeworCQkJX3RyZWUgPSB0cmVlOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHZhbHVlcygpOk9iamVjdCB7CisJCQlyZXR1cm4gX3ZhbHVlczsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxMGI5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9SZWNvZ25pdGlvbkV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKwlpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVBZGFwdG9yOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWU7CisJLyoqIFRoZSByb290IG9mIHRoZSBBTlRMUiBleGNlcHRpb24gaGllcmFyY2h5LgorCSAqCisJICogIFRvIGF2b2lkIEVuZ2xpc2gtb25seSBlcnJvciBtZXNzYWdlcyBhbmQgdG8gZ2VuZXJhbGx5IG1ha2UgdGhpbmdzCisJICogIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLCB0aGVzZSBleGNlcHRpb25zIGFyZSBub3QgY3JlYXRlZCB3aXRoIHN0cmluZ3MsCisJICogIGJ1dCByYXRoZXIgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBnZW5lcmF0ZSBhbiBlcnJvci4gIFRoZW4KKwkgKiAgdGhlIHZhcmlvdXMgcmVwb3J0aW5nIG1ldGhvZHMgaW4gUGFyc2VyIGFuZCBMZXhlciBjYW4gYmUgb3ZlcnJpZGRlbgorCSAqICB0byBnZW5lcmF0ZSBhIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlLiAgRm9yIGV4YW1wbGUsIE1pc21hdGNoZWRUb2tlbgorCSAqICBleGNlcHRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBleHBlY3RlZCB0b2tlbiB0eXBlLgorCSAqICBTbywgZG9uJ3QgZXhwZWN0IGdldE1lc3NhZ2UoKSB0byByZXR1cm4gYW55dGhpbmcuCisJICoKKwkgKiAgTm90ZSB0aGF0IGFzIG9mIEphdmEgMS40LCB5b3UgY2FuIGFjY2VzcyB0aGUgc3RhY2sgdHJhY2UsIHdoaWNoIG1lYW5zCisJICogIHRoYXQgeW91IGNhbiBjb21wdXRlIHRoZSBjb21wbGV0ZSB0cmFjZSBvZiBydWxlcyBmcm9tIHRoZSBzdGFydCBzeW1ib2wuCisJICogIFRoaXMgZ2l2ZXMgeW91IGNvbnNpZGVyYWJsZSBjb250ZXh0IGluZm9ybWF0aW9uIHdpdGggd2hpY2ggdG8gZ2VuZXJhdGUKKwkgKiAgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLgorCSAqCisJICogIEFOVExSIGdlbmVyYXRlcyBjb2RlIHRoYXQgdGhyb3dzIGV4Y2VwdGlvbnMgdXBvbiByZWNvZ25pdGlvbiBlcnJvciBhbmQKKwkgKiAgYWxzbyBnZW5lcmF0ZXMgY29kZSB0byBjYXRjaCB0aGVzZSBleGNlcHRpb25zIGluIGVhY2ggcnVsZS4gIElmIHlvdQorCSAqICB3YW50IHRvIHF1aXQgdXBvbiBmaXJzdCBlcnJvciwgeW91IGNhbiB0dXJuIG9mZiB0aGUgYXV0b21hdGljIGVycm9yCisJICogIGhhbmRsaW5nIG1lY2hhbmlzbSB1c2luZyBydWxlY2F0Y2ggYWN0aW9uLCBidXQgeW91IHN0aWxsIG5lZWQgdG8KKwkgKiAgb3ZlcnJpZGUgbWV0aG9kcyBtaXNtYXRjaCBhbmQgcmVjb3ZlckZyb21NaXNtYXRjaFNldC4KKwkgKgorCSAqICBJbiBnZW5lcmFsLCB0aGUgcmVjb2duaXRpb24gZXhjZXB0aW9ucyBjYW4gdHJhY2sgd2hlcmUgaW4gYSBncmFtbWFyIGEKKwkgKiAgcHJvYmxlbSBvY2N1cnJlZCBhbmQvb3Igd2hhdCB3YXMgdGhlIGV4cGVjdGVkIGlucHV0LiAgV2hpbGUgdGhlIHBhcnNlcgorCSAqICBrbm93cyBpdHMgc3RhdGUgKHN1Y2ggYXMgY3VycmVudCBpbnB1dCBzeW1ib2wgYW5kIGxpbmUgaW5mbykgdGhhdAorCSAqICBzdGF0ZSBjYW4gY2hhbmdlIGJlZm9yZSB0aGUgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIHNvIGN1cnJlbnQgdG9rZW4gaW5kZXgKKwkgKiAgaXMgY29tcHV0ZWQgYW5kIHN0b3JlZCBhdCBleGNlcHRpb24gdGltZS4gIEZyb20gdGhpcyBpbmZvLCB5b3UgY2FuCisJICogIHBlcmhhcHMgcHJpbnQgYW4gZW50aXJlIGxpbmUgb2YgaW5wdXQgbm90IGp1c3QgYSBzaW5nbGUgdG9rZW4sIGZvciBleGFtcGxlLgorCSAqICBCZXR0ZXIgdG8ganVzdCBzYXkgdGhlIHJlY29nbml6ZXIgaGFkIGEgcHJvYmxlbSBhbmQgdGhlbiBsZXQgdGhlIHBhcnNlcgorCSAqICBmaWd1cmUgb3V0IGEgZmFuY3kgcmVwb3J0LgorCSAqLworCXB1YmxpYyBjbGFzcyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHsKKwkJLyoqIFdoYXQgaW5wdXQgc3RyZWFtIGRpZCB0aGUgZXJyb3Igb2NjdXIgaW4/ICovCisJCXB1YmxpYyB2YXIgaW5wdXQ6SW50U3RyZWFtOworCQorCQkvKiogV2hhdCBpcyBpbmRleCBvZiB0b2tlbi9jaGFyIHdlcmUgd2UgbG9va2luZyBhdCB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZD8gKi8KKwkJcHVibGljIHZhciBpbmRleDppbnQ7CisJCisJCS8qKiBUaGUgY3VycmVudCBUb2tlbiB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiAgU2luY2Ugbm90IGFsbCBzdHJlYW1zCisJCSAqICBjYW4gcmV0cmlldmUgdGhlIGl0aCBUb2tlbiwgd2UgaGF2ZSB0byB0cmFjayB0aGUgVG9rZW4gb2JqZWN0LgorCQkgKiAgRm9yIHBhcnNlcnMuICBFdmVuIHdoZW4gaXQncyBhIHRyZWUgcGFyc2VyLCB0b2tlbiBtaWdodCBiZSBzZXQuCisJCSAqLworCQlwdWJsaWMgdmFyIHRva2VuOlRva2VuOworCQorCQkvKiogSWYgdGhpcyBpcyBhIHRyZWUgcGFyc2VyIGV4Y2VwdGlvbiwgbm9kZSBpcyBzZXQgdG8gdGhlIG5vZGUgd2l0aAorCQkgKiAgdGhlIHByb2JsZW0uCisJCSAqLworCQlwdWJsaWMgdmFyIG5vZGU6T2JqZWN0OworCQorCQkvKiogVGhlIGN1cnJlbnQgY2hhciB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiBGb3IgbGV4ZXJzLiAqLworCQlwdWJsaWMgdmFyIGM6aW50OworCQorCQkvKiogVHJhY2sgdGhlIGxpbmUgYXQgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkIGluIGNhc2UgdGhpcyBpcworCQkgKiAgZ2VuZXJhdGVkIGZyb20gYSBsZXhlci4gIFdlIG5lZWQgdG8gdHJhY2sgdGhpcyBzaW5jZSB0aGUKKwkJICogIHVuZXhwZWN0ZWQgY2hhciBkb2Vzbid0IGNhcnJ5IHRoZSBsaW5lIGluZm8uCisJCSAqLworCQlwdWJsaWMgdmFyIGxpbmU6aW50OworCQorCQlwdWJsaWMgdmFyIGNoYXJQb3NpdGlvbkluTGluZTppbnQ7CisJCisJCS8qKiBJZiB5b3UgYXJlIHBhcnNpbmcgYSB0cmVlIG5vZGUgc3RyZWFtLCB5b3Ugd2lsbCBlbmNvdW50ZXIgc29tCisJCSAqICBpbWFnaW5hcnkgbm9kZXMgdy9vIGxpbmUvY29sIGluZm8uICBXZSBub3cgc2VhcmNoIGJhY2t3YXJkcyBsb29raW5nCisJCSAqICBmb3IgbW9zdCByZWNlbnQgdG9rZW4gd2l0aCBsaW5lL2NvbCBpbmZvLCBidXQgbm90aWZ5IGdldEVycm9ySGVhZGVyKCkKKwkJICogIHRoYXQgaW5mbyBpcyBhcHByb3hpbWF0ZS4KKwkJICovCisJCXB1YmxpYyB2YXIgYXBwcm94aW1hdGVMaW5lSW5mbzpCb29sZWFuOworCQorCQlwdWJsaWMgZnVuY3Rpb24gUmVjb2duaXRpb25FeGNlcHRpb24oaW5wdXQ6SW50U3RyZWFtID0gbnVsbCkgeworCQkJaWYgKGlucHV0ID09IG51bGwpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisJCQl0aGlzLmluZGV4ID0gaW5wdXQuaW5kZXg7CisJCQlpZiAoIGlucHV0IGlzIFRva2VuU3RyZWFtICkgeworCQkJCXRoaXMudG9rZW4gPSBUb2tlblN0cmVhbShpbnB1dCkuTFQoMSk7CisJCQkJdGhpcy5saW5lID0gdG9rZW4ubGluZTsKKwkJCQl0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IHRva2VuLmNoYXJQb3NpdGlvbkluTGluZTsKKwkJCX0KKwkJCWlmICggaW5wdXQgaXMgVHJlZU5vZGVTdHJlYW0gKSB7CisJCQkJZXh0cmFjdEluZm9ybWF0aW9uRnJvbVRyZWVOb2RlU3RyZWFtKGlucHV0KTsKKwkJCX0KKwkJCWVsc2UgaWYgKCBpbnB1dCBpcyBDaGFyU3RyZWFtICkgeworCQkJCXRoaXMuYyA9IGlucHV0LkxBKDEpOworCQkJCXRoaXMubGluZSA9IENoYXJTdHJlYW0oaW5wdXQpLmxpbmU7CisJCQkJdGhpcy5jaGFyUG9zaXRpb25JbkxpbmUgPSBDaGFyU3RyZWFtKGlucHV0KS5jaGFyUG9zaXRpb25JbkxpbmU7CisJCQl9CisJCQllbHNlIHsKKwkJCQl0aGlzLmMgPSBpbnB1dC5MQSgxKTsKKwkJCX0KKwkJfQorCQorCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdEluZm9ybWF0aW9uRnJvbVRyZWVOb2RlU3RyZWFtKGlucHV0OkludFN0cmVhbSk6dm9pZCB7CisJCQl2YXIgbm9kZXM6VHJlZU5vZGVTdHJlYW0gPSBUcmVlTm9kZVN0cmVhbShpbnB1dCk7CisJCQl0aGlzLm5vZGUgPSBub2Rlcy5MVCgxKTsKKwkJCXZhciBhZGFwdG9yOlRyZWVBZGFwdG9yID0gbm9kZXMudHJlZUFkYXB0b3I7CisJCQl2YXIgcGF5bG9hZDpUb2tlbiA9IGFkYXB0b3IuZ2V0VG9rZW4obm9kZSk7CisJCQlpZiAoIHBheWxvYWQhPW51bGwgKSB7CisJCQkJdGhpcy50b2tlbiA9IHBheWxvYWQ7CisJCQkJaWYgKCBwYXlsb2FkLmxpbmU8PSAwICkgeworCQkJCQkvLyBpbWFnaW5hcnkgbm9kZTsgbm8gbGluZS9wb3MgaW5mbzsgc2NhbiBiYWNrd2FyZHMKKwkJCQkJdmFyIGk6aW50ID0gLTE7CisJCQkJCXZhciBwcmlvck5vZGU6T2JqZWN0ID0gbm9kZXMuTFQoaSk7CisJCQkJCXdoaWxlICggcHJpb3JOb2RlIT1udWxsICkgeworCQkJCQkJdmFyIHByaW9yUGF5bG9hZDpUb2tlbiA9IGFkYXB0b3IuZ2V0VG9rZW4ocHJpb3JOb2RlKTsKKwkJCQkJCWlmICggcHJpb3JQYXlsb2FkIT1udWxsICYmIHByaW9yUGF5bG9hZC5saW5lID4gMCApIHsKKwkJCQkJCQkvLyB3ZSBmb3VuZCB0aGUgbW9zdCByZWNlbnQgcmVhbCBsaW5lIC8gcG9zIGluZm8KKwkJCQkJCQl0aGlzLmxpbmUgPSBwcmlvclBheWxvYWQubGluZTsKKwkJCQkJCQl0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IHByaW9yUGF5bG9hZC5jaGFyUG9zaXRpb25JbkxpbmU7CisJCQkJCQkJdGhpcy5hcHByb3hpbWF0ZUxpbmVJbmZvID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCS0taTsKKwkJCQkJCXByaW9yTm9kZSA9IG5vZGVzLkxUKGkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvLyBub2RlIGNyZWF0ZWQgZnJvbSByZWFsIHRva2VuCisJCQkJCXRoaXMubGluZSA9IHBheWxvYWQubGluZTsKKwkJCQkJdGhpcy5jaGFyUG9zaXRpb25JbkxpbmUgPSBwYXlsb2FkLmNoYXJQb3NpdGlvbkluTGluZTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmICggdGhpcy5ub2RlIGlzIFRyZWUpIHsKKwkJCQl0aGlzLmxpbmUgPSB0aGlzLm5vZGUubGluZTsKKwkJCQl0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IHRoaXMubm9kZS5jaGFyUG9zaXRpb25JbkxpbmU7CisJCQkJaWYgKCB0aGlzLm5vZGUgaXMgQ29tbW9uVHJlZSkgeworCQkJCQl0aGlzLnRva2VuID0gdGhpcy5ub2RlLnRva2VuOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXZhciB0eXBlOmludCA9IGFkYXB0b3IuZ2V0VHlwZSh0aGlzLm5vZGUpOworCQkJCXZhciB0ZXh0OlN0cmluZyA9IGFkYXB0b3IuZ2V0VGV4dCh0aGlzLm5vZGUpOworCQkJCXRoaXMudG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4odHlwZSwgdGV4dCk7CisJCQl9CisJCX0KKwkKKwkJLyoqIFJldHVybiB0aGUgdG9rZW4gdHlwZSBvciBjaGFyIG9mIHRoZSB1bmV4cGVjdGVkIGlucHV0IGVsZW1lbnQgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCB1bmV4cGVjdGVkVHlwZSgpOmludCB7CisJCQlpZiAoIGlucHV0IGlzIFRva2VuU3RyZWFtICkgeworCQkJCXJldHVybiB0b2tlbi50eXBlOworCQkJfQorCQkJZWxzZSBpZiAoIGlucHV0IGlzIFRyZWVOb2RlU3RyZWFtICkgeworCQkJCXZhciBub2RlczpUcmVlTm9kZVN0cmVhbSA9IFRyZWVOb2RlU3RyZWFtKGlucHV0KTsKKwkJCQl2YXIgYWRhcHRvcjpUcmVlQWRhcHRvciA9IG5vZGVzLnRyZWVBZGFwdG9yOworCQkJCXJldHVybiBhZGFwdG9yLmdldFR5cGUobm9kZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZXR1cm4gYzsKKwkJCX0KKwkKKwkJfQorCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODU2MTVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5hcwpAQCAtMCwwICsxLDkzIEBACitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKwkKKwkvKiogVGhlIHNldCBvZiBmaWVsZHMgbmVlZGVkIGJ5IGFuIGFic3RyYWN0IHJlY29nbml6ZXIgdG8gcmVjb2duaXplIGlucHV0CisJICogIGFuZCByZWNvdmVyIGZyb20gZXJyb3JzIGV0Yy4uLiAgQXMgYSBzZXBhcmF0ZSBzdGF0ZSBvYmplY3QsIGl0IGNhbiBiZQorCSAqICBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgZ3JhbW1hcnM7IGUuZy4sIHdoZW4gb25lIGdyYW1tYXIgaW1wb3J0cyBhbm90aGVyLgorCSAqCisJICogIFRoZXNlIGZpZWxkcyBhcmUgcHVibGljYWxseSB2aXNpYmxlIGJ1dCB0aGUgYWN0dWFsIHN0YXRlIHBvaW50ZXIgcGVyCisJICogIHBhcnNlciBpcyBwcm90ZWN0ZWQuCisJICovCisJcHVibGljIGNsYXNzIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSB7CisJCS8qKiBUcmFjayB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhbnkgcnVsZSBpbnZvY2F0aW9uLgorCQkgKiAgU3RhY2sgZ3Jvd3MgdXB3YXJkcy4gIFdoZW4gaXQgaGl0cyB0aGUgbWF4LCBpdCBncm93cyAyeCBpbiBzaXplCisJCSAqICBhbmQga2VlcHMgZ29pbmcuCisJCSAqLworCQlwdWJsaWMgdmFyIGZvbGxvd2luZzpBcnJheSA9IG5ldyBBcnJheSgpOworCQlwdWJsaWMgdmFyIF9mc3A6aW50ID0gLTE7CisJCisJCS8qKiBUaGlzIGlzIHRydWUgd2hlbiB3ZSBzZWUgYW4gZXJyb3IgYW5kIGJlZm9yZSBoYXZpbmcgc3VjY2Vzc2Z1bGx5CisJCSAqICBtYXRjaGVkIGEgdG9rZW4uICBQcmV2ZW50cyBnZW5lcmF0aW9uIG9mIG1vcmUgdGhhbiBvbmUgZXJyb3IgbWVzc2FnZQorCQkgKiAgcGVyIGVycm9yLgorCQkgKi8KKwkJcHVibGljIHZhciBlcnJvclJlY292ZXJ5OkJvb2xlYW4gPSBmYWxzZTsKKwkKKwkJLyoqIFRoZSBpbmRleCBpbnRvIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIGxhc3QgZXJyb3Igb2NjdXJyZWQuCisJCSAqIAlUaGlzIGlzIHVzZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVyZSBhbiBlcnJvciBpcyBmb3VuZAorCQkgKiAgYnV0IG5vIHRva2VuIGlzIGNvbnN1bWVkIGR1cmluZyByZWNvdmVyeS4uLmFub3RoZXIgZXJyb3IgaXMgZm91bmQsCisJCSAqICBhZCBuYXNldW0uICBUaGlzIGlzIGEgZmFpbHNhZmUgbWVjaGFuaXNtIHRvIGd1YXJhbnRlZSB0aGF0IGF0IGxlYXN0CisJCSAqICBvbmUgdG9rZW4vdHJlZSBub2RlIGlzIGNvbnN1bWVkIGZvciB0d28gZXJyb3JzLgorCQkgKi8KKwkJcHVibGljIHZhciBsYXN0RXJyb3JJbmRleDppbnQgPSAtMTsKKwkKKwkJLyoqIEluIGxpZXUgb2YgYSByZXR1cm4gdmFsdWUsIHRoaXMgaW5kaWNhdGVzIHRoYXQgYSBydWxlIG9yIHRva2VuCisJCSAqICBoYXMgZmFpbGVkIHRvIG1hdGNoLiAgUmVzZXQgdG8gZmFsc2UgdXBvbiB2YWxpZCB0b2tlbiBtYXRjaC4KKwkJICovCisJCXB1YmxpYyB2YXIgZmFpbGVkOkJvb2xlYW4gPSBmYWxzZTsKKworICAgICAgICAvKiogRGlkIHRoZSByZWNvZ25pemVyIGVuY291bnRlciBhIHN5bnRheCBlcnJvcj8gIFRyYWNrIGhvdyBtYW55LiAqLworICAgIAlwdWJsaWMgdmFyIHN5bnRheEVycm9yczppbnQgPSAwOworCQorCQkvKiogSWYgMCwgbm8gYmFja3RyYWNraW5nIGlzIGdvaW5nIG9uLiAgU2FmZSB0byBleGVjIGFjdGlvbnMgZXRjLi4uCisJCSAqICBJZiA+MCB0aGVuIGl0J3MgdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZy4KKwkJICovCisJCXB1YmxpYyB2YXIgYmFja3RyYWNraW5nOmludCA9IDA7CisJCisJCS8qKiBBbiBBcnJheVtzaXplIG51bSBydWxlc10gb2YgQXJyYXlzIHRoYXQgdHJhY2tzCisJCSAqICB0aGUgc3RvcCB0b2tlbiBpbmRleCBmb3IgZWFjaCBydWxlLiAgcnVsZU1lbW9bcnVsZUluZGV4XSBpcworCQkgKiAgdGhlIG1lbW9pemF0aW9uIHRhYmxlIGZvciBydWxlSW5kZXguICBGb3Iga2V5IHJ1bGVTdGFydEluZGV4LCB5b3UKKwkJICogIGdldCBiYWNrIHRoZSBzdG9wIHRva2VuIGZvciBhc3NvY2lhdGVkIHJ1bGUgb3IgTUVNT19SVUxFX0ZBSUxFRC4KKwkJICoKKwkJICogIFRoaXMgaXMgb25seSB1c2VkIGlmIHJ1bGUgbWVtb2l6YXRpb24gaXMgb24gKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpLgorCQkgKi8KKwkJcHVibGljIHZhciBydWxlTWVtbzpBcnJheTsKKwkKKwkKKwkJLy8gTEVYRVIgRklFTERTIChtdXN0IGJlIGluIHNhbWUgc3RhdGUgb2JqZWN0IHRvIGF2b2lkIGNhc3RpbmcKKwkJLy8gICAgICAgICAgICAgICBjb25zdGFudGx5IGluIGdlbmVyYXRlZCBjb2RlIGFuZCBMZXhlciBvYmplY3QpIDooCisJCisJCisJCS8qKiBUaGUgZ29hbCBvZiBhbGwgbGV4ZXIgcnVsZXMvbWV0aG9kcyBpcyB0byBjcmVhdGUgYSB0b2tlbiBvYmplY3QuCisJCSAqICBUaGlzIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlIGFzIG11bHRpcGxlIHJ1bGVzIG1heSBjb2xsYWJvcmF0ZSB0bworCQkgKiAgY3JlYXRlIGEgc2luZ2xlIHRva2VuLiAgbmV4dFRva2VuIHdpbGwgcmV0dXJuIHRoaXMgb2JqZWN0IGFmdGVyCisJCSAqICBtYXRjaGluZyBsZXhlciBydWxlKHMpLiAgSWYgeW91IHN1YmNsYXNzIHRvIGFsbG93IG11bHRpcGxlIHRva2VuCisJCSAqICBlbWlzc2lvbnMsIHRoZW4gc2V0IHRoaXMgdG8gdGhlIGxhc3QgdG9rZW4gdG8gYmUgbWF0Y2hlZCBvcgorCQkgKiAgc29tZXRoaW5nIG5vbm51bGwgc28gdGhhdCB0aGUgYXV0byB0b2tlbiBlbWl0IG1lY2hhbmlzbSB3aWxsIG5vdAorCQkgKiAgZW1pdCBhbm90aGVyIHRva2VuLgorCQkgKi8KKwkgICAgcHVibGljIHZhciB0b2tlbjpUb2tlbjsKKwkKKwkJLyoqIFdoYXQgY2hhcmFjdGVyIGluZGV4IGluIHRoZSBzdHJlYW0gZGlkIHRoZSBjdXJyZW50IHRva2VuIHN0YXJ0IGF0PworCQkgKiAgTmVlZGVkLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSB0ZXh0IGZvciBjdXJyZW50IHRva2VuLiAgU2V0IGF0CisJCSAqICB0aGUgc3RhcnQgb2YgbmV4dFRva2VuLgorCSAJICovCisJCXB1YmxpYyB2YXIgdG9rZW5TdGFydENoYXJJbmRleDppbnQgPSAtMTsKKwkKKwkJLyoqIFRoZSBsaW5lIG9uIHdoaWNoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHRva2VuIHJlc2lkZXMgKi8KKwkJcHVibGljIHZhciB0b2tlblN0YXJ0TGluZTppbnQ7CisJCisJCS8qKiBUaGUgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIGZpcnN0IGNoYXJhY3RlciB3aXRoaW4gdGhlIGxpbmUgKi8KKwkJcHVibGljIHZhciB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOmludDsKKwkKKwkJLyoqIFRoZSBjaGFubmVsIG51bWJlciBmb3IgdGhlIGN1cnJlbnQgdG9rZW4gKi8KKwkJcHVibGljIHZhciBjaGFubmVsOmludDsKKwkKKwkJLyoqIFRoZSB0b2tlbiB0eXBlIGZvciB0aGUgY3VycmVudCB0b2tlbiAqLworCQlwdWJsaWMgdmFyIHR5cGU6aW50OworCQorCQkvKiogWW91IGNhbiBzZXQgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHRva2VuIHRvIG92ZXJyaWRlIHdoYXQgaXMgaW4KKwkJICogIHRoZSBpbnB1dCBjaGFyIGJ1ZmZlci4gIFVzZSBzZXRUZXh0KCkgb3IgY2FuIHNldCB0aGlzIGluc3RhbmNlIHZhci4KKwkgCSAqLworCQlwdWJsaWMgdmFyIHRleHQ6U3RyaW5nOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9SdWxlUmV0dXJuU2NvcGUuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUnVsZVJldHVyblNjb3BlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMWZjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUnVsZVJldHVyblNjb3BlLmFzCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUKK3sKKwkvKiogUnVsZXMgY2FuIHJldHVybiBzdGFydC9zdG9wIGluZm8gYXMgd2VsbCBhcyBwb3NzaWJsZSB0cmVlcyBhbmQgdGVtcGxhdGVzICovCisJcHVibGljIGNsYXNzIFJ1bGVSZXR1cm5TY29wZSB7CisJCS8qKiBSZXR1cm4gdGhlIHN0YXJ0IHRva2VuIG9yIHRyZWUgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBzdGFydCgpOk9iamVjdCB7IHJldHVybiBudWxsOyB9CisJCS8qKiBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gb3IgdHJlZSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHN0b3AoKTpPYmplY3QgeyByZXR1cm4gbnVsbDsgfQorCQkvKiogSGFzIGEgdmFsdWUgcG90ZW50aWFsbHkgaWYgb3V0cHV0PUFTVDsgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCB0cmVlKCk6T2JqZWN0IHsgcmV0dXJuIG51bGw7IH0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW4uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW4uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjYzliMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Ub2tlbi5hcwpAQCAtMCwwICsxLDY0IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCXB1YmxpYyBpbnRlcmZhY2UgVG9rZW4geworCQkKKwkJLyoqIEdldCB0aGUgdGV4dCBvZiB0aGUgdG9rZW4gKi8KKwkJZnVuY3Rpb24gZ2V0IHRleHQoKTpTdHJpbmc7CisJCWZ1bmN0aW9uIHNldCB0ZXh0KHRleHQ6U3RyaW5nKTp2b2lkOworCQorCQlmdW5jdGlvbiBnZXQgdHlwZSgpOmludDsKKwkJZnVuY3Rpb24gc2V0IHR5cGUodHR5cGU6aW50KTp2b2lkOworCQkKKwkJLyoqICBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhpcyB0b2tlbiB3YXMgbWF0Y2hlZDsgbGluZT0xLi5uICovCisJCWZ1bmN0aW9uIGdldCBsaW5lKCk6aW50OworCSAgICBmdW5jdGlvbiBzZXQgbGluZShsaW5lOmludCk6dm9pZDsKKwkKKwkJLyoqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgMC4ubi0xICovCisJCWZ1bmN0aW9uIGdldCBjaGFyUG9zaXRpb25JbkxpbmUoKTppbnQ7CisJCWZ1bmN0aW9uIHNldCBjaGFyUG9zaXRpb25JbkxpbmUocG9zOmludCk6dm9pZDsKKwkKKwkJZnVuY3Rpb24gZ2V0IGNoYW5uZWwoKTppbnQ7CisJCWZ1bmN0aW9uIHNldCBjaGFubmVsKGNoYW5uZWw6aW50KTp2b2lkOworCQorCQkvKiogQW4gaW5kZXggZnJvbSAwLi5uLTEgb2YgdGhlIHRva2VuIG9iamVjdCBpbiB0aGUgaW5wdXQgc3RyZWFtLgorCQkgKiAgVGhpcyBtdXN0IGJlIHZhbGlkIGluIG9yZGVyIHRvIHVzZSB0aGUgQU5UTFJXb3JrcyBkZWJ1Z2dlci4KKwkJICovCisJCWZ1bmN0aW9uIGdldCB0b2tlbkluZGV4KCk6aW50OworCQlmdW5jdGlvbiBzZXQgdG9rZW5JbmRleChpbmRleDppbnQpOnZvaWQ7CisJCQorCQkvKiogRnJvbSB3aGF0IGNoYXJhY3RlciBzdHJlYW0gd2FzIHRoaXMgdG9rZW4gY3JlYXRlZD8gIFlvdSBkb24ndCBoYXZlIHRvCisJCSAqICBpbXBsZW1lbnQgYnV0IGl0J3MgbmljZSB0byBrbm93IHdoZXJlIGEgVG9rZW4gY29tZXMgZnJvbSBpZiB5b3UgaGF2ZQorCQkgKiAgaW5jbHVkZSBmaWxlcyBldGMuLi4gb24gdGhlIGlucHV0LgorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IGlucHV0U3RyZWFtKCk6Q2hhclN0cmVhbTsKKwkJZnVuY3Rpb24gc2V0IGlucHV0U3RyZWFtKGlucHV0OkNoYXJTdHJlYW0pOnZvaWQ7CisJCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuQ29uc3RhbnRzLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuQ29uc3RhbnRzLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjg4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5Db25zdGFudHMuYXMKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZSB7CisJcHVibGljIGNsYXNzIFRva2VuQ29uc3RhbnRzCXsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBFT1JfVE9LRU5fVFlQRTppbnQgPSAxOworCQorCQkvKiogaW1hZ2luYXJ5IHRyZWUgbmF2aWdhdGlvbiB0eXBlOyB0cmF2ZXJzZSAiZ2V0IGNoaWxkIiBsaW5rICovCisJCXB1YmxpYyBzdGF0aWMgY29uc3QgRE9XTjppbnQgPSAyOworCQkvKiogaW1hZ2luYXJ5IHRyZWUgbmF2aWdhdGlvbiB0eXBlOyBmaW5pc2ggd2l0aCBhIGNoaWxkIGxpc3QgKi8KKwkJcHVibGljIHN0YXRpYyBjb25zdCBVUDppbnQgPSAzOworCQorCQlwdWJsaWMgc3RhdGljIGNvbnN0IE1JTl9UT0tFTl9UWVBFOmludCA9IFVQKzE7CisJCisJICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgRU9GOmludCA9IENoYXJTdHJlYW1Db25zdGFudHMuRU9GOworCQlwdWJsaWMgc3RhdGljIGNvbnN0IEVPRl9UT0tFTjpUb2tlbiA9IG5ldyBDb21tb25Ub2tlbihFT0YpOworCQkKKwkJcHVibGljIHN0YXRpYyBjb25zdCBJTlZBTElEX1RPS0VOX1RZUEU6aW50ID0gMDsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBJTlZBTElEX1RPS0VOOlRva2VuID0gbmV3IENvbW1vblRva2VuKElOVkFMSURfVE9LRU5fVFlQRSk7CisJCisJCS8qKiBJbiBhbiBhY3Rpb24sIGEgbGV4ZXIgcnVsZSBjYW4gc2V0IHRva2VuIHRvIHRoaXMgU0tJUF9UT0tFTiBhbmQgQU5UTFIKKwkJICogIHdpbGwgYXZvaWQgY3JlYXRpbmcgYSB0b2tlbiBmb3IgdGhpcyBzeW1ib2wgYW5kIHRyeSB0byBmZXRjaCBhbm90aGVyLgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBjb25zdCBTS0lQX1RPS0VOOlRva2VuID0gbmV3IENvbW1vblRva2VuKElOVkFMSURfVE9LRU5fVFlQRSk7CisJCisJCS8qKiBBbGwgdG9rZW5zIGdvIHRvIHRoZSBwYXJzZXIgKHVubGVzcyBza2lwKCkgaXMgY2FsbGVkIGluIHRoYXQgcnVsZSkKKwkJICogIG9uIGEgcGFydGljdWxhciAiY2hhbm5lbCIuICBUaGUgcGFyc2VyIHR1bmVzIHRvIGEgcGFydGljdWxhciBjaGFubmVsCisJCSAqICBzbyB0aGF0IHdoaXRlc3BhY2UgZXRjLi4uIGNhbiBnbyB0byB0aGUgcGFyc2VyIG9uIGEgImhpZGRlbiIgY2hhbm5lbC4KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgY29uc3QgREVGQVVMVF9DSEFOTkVMOmludCA9IDA7CisJCQorCQkvKiogQW55dGhpbmcgb24gZGlmZmVyZW50IGNoYW5uZWwgdGhhbiBERUZBVUxUX0NIQU5ORUwgaXMgbm90IHBhcnNlZAorCQkgKiAgYnkgcGFyc2VyLgorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBjb25zdCBISURERU5fQ0hBTk5FTDppbnQgPSA5OTsKKworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5SZXdyaXRlU3RyZWFtLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuUmV3cml0ZVN0cmVhbS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTVlZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuUmV3cml0ZVN0cmVhbS5hcwpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKwlpbXBvcnQgZmxhc2gudXRpbHMuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lOworCQorCQorCS8qKiBVc2VmdWwgZm9yIGR1bXBpbmcgb3V0IHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgZG9pbmcgc29tZQorCSAqICBhdWdtZW50YXRpb24gb3Igb3RoZXIgbWFuaXB1bGF0aW9ucy4KKwkgKgorCSAqICBZb3UgY2FuIGluc2VydCBzdHVmZiwgcmVwbGFjZSwgYW5kIGRlbGV0ZSBjaHVua3MuICBOb3RlIHRoYXQgdGhlCisJICogIG9wZXJhdGlvbnMgYXJlIGRvbmUgbGF6aWx5LS1vbmx5IGlmIHlvdSBjb252ZXJ0IHRoZSBidWZmZXIgdG8gYQorCSAqICBTdHJpbmcuICBUaGlzIGlzIHZlcnkgZWZmaWNpZW50IGJlY2F1c2UgeW91IGFyZSBub3QgbW92aW5nIGRhdGEgYXJvdW5kCisJICogIGFsbCB0aGUgdGltZS4gIEFzIHRoZSBidWZmZXIgb2YgdG9rZW5zIGlzIGNvbnZlcnRlZCB0byBzdHJpbmdzLCB0aGUKKwkgKiAgdG9TdHJpbmcoKSBtZXRob2QocykgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIG9wZXJhdGlvbiBhdCB0aGUKKwkgKiAgY3VycmVudCBpbmRleC4gIElmIHNvLCB0aGUgb3BlcmF0aW9uIGlzIGRvbmUgYW5kIHRoZW4gbm9ybWFsIFN0cmluZworCSAqICByZW5kZXJpbmcgY29udGludWVzIG9uIHRoZSBidWZmZXIuICBUaGlzIGlzIGxpa2UgaGF2aW5nIG11bHRpcGxlIFR1cmluZworCSAqICBtYWNoaW5lIGluc3RydWN0aW9uIHN0cmVhbXMgKHByb2dyYW1zKSBvcGVyYXRpbmcgb24gYSBzaW5nbGUgaW5wdXQgdGFwZS4gOikKKwkgKgorCSAqICBTaW5jZSB0aGUgb3BlcmF0aW9ucyBhcmUgZG9uZSBsYXppbHkgYXQgdG9TdHJpbmctdGltZSwgb3BlcmF0aW9ucyBkbyBub3QKKwkgKiAgc2NyZXcgdXAgdGhlIHRva2VuIGluZGV4IHZhbHVlcy4gIFRoYXQgaXMsIGFuIGluc2VydCBvcGVyYXRpb24gYXQgdG9rZW4KKwkgKiAgaW5kZXggaSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGluZGV4IHZhbHVlcyBmb3IgdG9rZW5zIGkrMS4ubi0xLgorCSAqCisJICogIEJlY2F1c2Ugb3BlcmF0aW9ucyBuZXZlciBhY3R1YWxseSBhbHRlciB0aGUgYnVmZmVyLCB5b3UgbWF5IGFsd2F5cyBnZXQKKwkgKiAgdGhlIG9yaWdpbmFsIHRva2VuIHN0cmVhbSBiYWNrIHdpdGhvdXQgdW5kb2luZyBhbnl0aGluZy4gIFNpbmNlCisJICogIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHF1ZXVlZCB1cCwgeW91IGNhbiBlYXNpbHkgc2ltdWxhdGUgdHJhbnNhY3Rpb25zIGFuZAorCSAqICByb2xsIGJhY2sgYW55IGNoYW5nZXMgaWYgdGhlcmUgaXMgYW4gZXJyb3IganVzdCBieSByZW1vdmluZyBpbnN0cnVjdGlvbnMuCisJICogIEZvciBleGFtcGxlLAorCSAqCisJICogICB2YXIgaW5wdXQ6Q2hhclN0cmVhbSA9IG5ldyBBTlRMUkZpbGVTdHJlYW0oImlucHV0Iik7CisJICogICB2YXIgbGV4OlRMZXhlciA9IG5ldyBUTGV4ZXIoaW5wdXQpOworCSAqICAgdmFyIHRva2VuczpUb2tlblJld3JpdGVTdHJlYW0gPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleCk7CisJICogICB2YXIgcGFyc2VyOlQgPSBuZXcgVCh0b2tlbnMpOworCSAqICAgcGFyc2VyLnN0YXJ0UnVsZSgpOworCSAqCisJICogCSBUaGVuIGluIHRoZSBydWxlcywgeW91IGNhbiBleGVjdXRlCisJICogICAgICB2YXIgdDpUb2tlbiB0LCB1OlRva2VuOworCSAqICAgICAgLi4uCisJICogICAgICBpbnB1dC5pbnNlcnRBZnRlcih0LCAidGV4dCB0byBwdXQgYWZ0ZXIgdCIpO30KKwkgKiAJCWlucHV0Lmluc2VydEFmdGVyKHUsICJ0ZXh0IGFmdGVyIHUiKTt9CisJICogCQl0cmFjZSh0b2tlbnMudG9TdHJpbmcoKSk7CisJICoKKwkgKiAgQWN0dWFsbHksIHlvdSBoYXZlIHRvIGNhc3QgdGhlICdpbnB1dCcgdG8gYSBUb2tlblJld3JpdGVTdHJlYW0uIDooCisJICoKKwkgKiAgWW91IGNhbiBhbHNvIGhhdmUgbXVsdGlwbGUgImluc3RydWN0aW9uIHN0cmVhbXMiIGFuZCBnZXQgbXVsdGlwbGUKKwkgKiAgcmV3cml0ZXMgZnJvbSBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIGlucHV0LiAgSnVzdCBuYW1lIHRoZSBpbnN0cnVjdGlvbgorCSAqICBzdHJlYW1zIGFuZCB1c2UgdGhhdCBuYW1lIGFnYWluIHdoZW4gcHJpbnRpbmcgdGhlIGJ1ZmZlci4gIFRoaXMgY291bGQgYmUKKwkgKiAgdXNlZnVsIGZvciBnZW5lcmF0aW5nIGEgQyBmaWxlIGFuZCBhbHNvIGl0cyBoZWFkZXIgZmlsZS0tYWxsIGZyb20gdGhlCisJICogIHNhbWUgYnVmZmVyOgorCSAqCisJICogICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoInBhc3MxIiwgdCwgInRleHQgdG8gcHV0IGFmdGVyIHQiKTt9CisJICogCQl0b2tlbnMuaW5zZXJ0QWZ0ZXIoInBhc3MyIiwgdSwgInRleHQgYWZ0ZXIgdSIpO30KKwkgKiAJCXRyYWNlKHRva2Vucy50b1N0cmluZygicGFzczEiKSk7CisJICogCQl0cmFjZSh0b2tlbnMudG9TdHJpbmcoInBhc3MyIikpOworCSAqCisJICogIElmIHlvdSBkb24ndCB1c2UgbmFtZWQgcmV3cml0ZSBzdHJlYW1zLCBhICJkZWZhdWx0IiBzdHJlYW0gaXMgdXNlZCBhcworCSAqICB0aGUgZmlyc3QgZXhhbXBsZSBzaG93cy4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgVG9rZW5SZXdyaXRlU3RyZWFtIGV4dGVuZHMgQ29tbW9uVG9rZW5TdHJlYW0geworCQlwdWJsaWMgc3RhdGljIGNvbnN0IERFRkFVTFRfUFJPR1JBTV9OQU1FOlN0cmluZyA9ICJkZWZhdWx0IjsKKwkJcHVibGljIHN0YXRpYyBjb25zdCBNSU5fVE9LRU5fSU5ERVg6aW50ID0gMDsKKwkKKwkJLyoqIFlvdSBtYXkgaGF2ZSBtdWx0aXBsZSwgbmFtZWQgc3RyZWFtcyBvZiByZXdyaXRlIG9wZXJhdGlvbnMuCisJCSAqICBJJ20gY2FsbGluZyB0aGVzZSB0aGluZ3MgInByb2dyYW1zLiIKKwkJICogIE1hcHMgU3RyaW5nIChuYW1lKSAtPiByZXdyaXRlIChMaXN0KQorCQkgKi8KKwkJcHJvdGVjdGVkIHZhciBwcm9ncmFtczpPYmplY3QgPSBuZXcgT2JqZWN0KCk7CisJCisJCS8qKiBNYXAgU3RyaW5nIChwcm9ncmFtIG5hbWUpIC0+IEludGVnZXIgaW5kZXggKi8KKwkJcHJvdGVjdGVkIHZhciBsYXN0UmV3cml0ZVRva2VuSW5kZXhlczpPYmplY3QgPSBuZXcgT2JqZWN0KCk7CisJCisJCXB1YmxpYyBmdW5jdGlvbiBUb2tlblJld3JpdGVTdHJlYW0odG9rZW5Tb3VyY2U6VG9rZW5Tb3VyY2UgPSBudWxsLCBjaGFubmVsOmludCA9IFRva2VuQ29uc3RhbnRzLkRFRkFVTFRfQ0hBTk5FTCkgeworCQkJc3VwZXIodG9rZW5Tb3VyY2UsIGNoYW5uZWwpOworCQkJcHJvZ3JhbXNbREVGQVVMVF9QUk9HUkFNX05BTUVdID0gbmV3IEFycmF5KCk7CisJCX0KKwkKKwkgICAgLyoqIFJvbGxiYWNrIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gZm9yIGEgcHJvZ3JhbSBzbyB0aGF0CisJCSAqICB0aGUgaW5kaWNhdGVkIGluc3RydWN0aW9uICh2aWEgaW5zdHJ1Y3Rpb25JbmRleCkgaXMgbm8KKwkJICogIGxvbmdlciBpbiB0aGUgc3RyZWFtLiAgVU5URVNURUQhCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gcm9sbGJhY2soaW5zdHJ1Y3Rpb25JbmRleDppbnQsIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXZhciBpc246QXJyYXkgPSBwcm9ncmFtc1twcm9ncmFtTmFtZV0gYXMgQXJyYXk7CisJCQlpZiAoIGlzbiAhPSBudWxsICkgeworCQkJCXByb2dyYW1zW3Byb2dyYW1OYW1lXSA9IGlzbi5zbGljZShNSU5fVE9LRU5fSU5ERVgsaW5zdHJ1Y3Rpb25JbmRleCk7CisJCQl9CisJCX0KKwkKKwkJLyoqIFJlc2V0IHRoZSBwcm9ncmFtIHNvIHRoYXQgbm8gaW5zdHJ1Y3Rpb25zIGV4aXN0ICovCisJCXB1YmxpYyBmdW5jdGlvbiBkZWxldGVQcm9ncmFtKHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXJvbGxiYWNrKE1JTl9UT0tFTl9JTkRFWCwgcHJvZ3JhbU5hbWUpOworCQl9CQorCQorCQlwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0QWZ0ZXJUb2tlbih0OlRva2VuLCB0ZXh0Ok9iamVjdCwgcHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOnZvaWQgeworCQkJaW5zZXJ0QWZ0ZXIodC50b2tlbkluZGV4LCB0ZXh0LCBwcm9ncmFtTmFtZSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGluc2VydEFmdGVyKGluZGV4OmludCwgdGV4dDpPYmplY3QsIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCS8vIHRvIGluc2VydCBhZnRlciwganVzdCBpbnNlcnQgYmVmb3JlIG5leHQgaW5kZXggKGV2ZW4gaWYgcGFzdCBlbmQpCisJCQlpbnNlcnRCZWZvcmUoaW5kZXgrMSwgdGV4dCwgcHJvZ3JhbU5hbWUpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBpbnNlcnRCZWZvcmVUb2tlbih0OlRva2VuLCB0ZXh0Ok9iamVjdCwgcHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOnZvaWQgeworCQkJaW5zZXJ0QmVmb3JlKHQudG9rZW5JbmRleCwgdGV4dCwgcHJvZ3JhbU5hbWUpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBpbnNlcnRCZWZvcmUoaW5kZXg6aW50LCB0ZXh0Ok9iamVjdCwgcHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOnZvaWQgeworCQkJdmFyIG9wOlJld3JpdGVPcGVyYXRpb24gPSBuZXcgSW5zZXJ0QmVmb3JlT3AoaW5kZXgsdGV4dCk7CisJCQl2YXIgcmV3cml0ZXM6QXJyYXkgPSBnZXRQcm9ncmFtKHByb2dyYW1OYW1lKTsKKwkJCW9wLmluc3RydWN0aW9uSW5kZXggPSByZXdyaXRlcy5sZW5ndGg7CisJCQlyZXdyaXRlcy5wdXNoKG9wKTsKKwkJfQorCQkJCisJCXB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKGluZGV4OmludCwgdGV4dDpPYmplY3QsIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXJlcGxhY2VSYW5nZShpbmRleCwgaW5kZXgsIHRleHQsIHByb2dyYW1OYW1lKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZVJhbmdlKGZyb21JbmRleDppbnQsIHRvSW5kZXg6aW50LCB0ZXh0Ok9iamVjdCwgcHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOnZvaWQgeworCQkJaWYgKCBmcm9tSW5kZXggPiB0b0luZGV4IHx8IGZyb21JbmRleDwwIHx8IHRvSW5kZXg8MCB8fCB0b0luZGV4ID49IHRva2Vucy5sZW5ndGggKSB7CisJCQkJdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlOiByYW5nZSBpbnZhbGlkOiAiK2Zyb21JbmRleCsiLi4iK3RvSW5kZXgrIihzaXplPSIrdG9rZW5zLmxlbmd0aCsiKSIpOworCQkJfQorCQkJdmFyIG9wOlJld3JpdGVPcGVyYXRpb24gPSBuZXcgUmVwbGFjZU9wKGZyb21JbmRleCwgdG9JbmRleCwgdGV4dCk7CisJCQl2YXIgcmV3cml0ZXM6QXJyYXkgPSBnZXRQcm9ncmFtKHByb2dyYW1OYW1lKTsKKwkJCW9wLmluc3RydWN0aW9uSW5kZXggPSByZXdyaXRlcy5sZW5ndGg7CisJCQlyZXdyaXRlcy5wdXNoKG9wKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZVRva2VuKGluZGV4VDpUb2tlbiwgdGV4dDpPYmplY3QsIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXJlcGxhY2VUb2tlblJhbmdlKGluZGV4VCwgaW5kZXhULCB0ZXh0LCBwcm9ncmFtTmFtZSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VUb2tlblJhbmdlKGZyb21Ub2tlbjpUb2tlbiwgdG9Ub2tlbjpUb2tlbiwgdGV4dDpPYmplY3QsIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXJlcGxhY2VSYW5nZShmcm9tVG9rZW4udG9rZW5JbmRleCwgdG9Ub2tlbi50b2tlbkluZGV4LCB0ZXh0LCBwcm9ncmFtTmFtZSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJlbW92ZShpbmRleDppbnQsIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXJlbW92ZVJhbmdlKGluZGV4LCBpbmRleCwgcHJvZ3JhbU5hbWUpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVSYW5nZShmcm9tSW5kZXg6aW50LCB0b0luZGV4OmludCwgcHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOnZvaWQgeworCQkJcmVwbGFjZVJhbmdlKGZyb21JbmRleCwgdG9JbmRleCwgbnVsbCwgcHJvZ3JhbU5hbWUpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiByZW1vdmVUb2tlbih0b2tlbjpUb2tlbiwgcHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOnZvaWQgeworCQkJcmVtb3ZlVG9rZW5SYW5nZSh0b2tlbiwgdG9rZW4sIHByb2dyYW1OYW1lKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlVG9rZW5SYW5nZShmcm9tVG9rZW46VG9rZW4sIHRvVG9rZW46VG9rZW4sIHByb2dyYW1OYW1lOlN0cmluZyA9IERFRkFVTFRfUFJPR1JBTV9OQU1FKTp2b2lkIHsKKwkJCXJlcGxhY2VUb2tlblJhbmdlKGZyb21Ub2tlbiwgdG9Ub2tlbiwgbnVsbCwgcHJvZ3JhbU5hbWUpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0UmV3cml0ZVRva2VuSW5kZXgocHJvZ3JhbU5hbWU6U3RyaW5nID0gREVGQVVMVF9QUk9HUkFNX05BTUUpOmludCB7CisJCQl2YXIgaToqID0gbGFzdFJld3JpdGVUb2tlbkluZGV4ZXNbcHJvZ3JhbU5hbWVdOworCQkJaWYgKCBpID09IHVuZGVmaW5lZCApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gaSBhcyBpbnQ7CisJCX0KKwkKKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIHNldExhc3RSZXdyaXRlVG9rZW5JbmRleChwcm9ncmFtTmFtZTpTdHJpbmcsIGk6aW50KTp2b2lkIHsKKwkJCWxhc3RSZXdyaXRlVG9rZW5JbmRleGVzW3Byb2dyYW1OYW1lXSA9IGk7CisJCX0KKwkKKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFByb2dyYW0obmFtZTpTdHJpbmcpOkFycmF5IHsKKwkJCXZhciBpc246QXJyYXkgPSBwcm9ncmFtc1tuYW1lXSBhcyBBcnJheTsKKwkJCWlmICggaXNuPT1udWxsICkgeworCQkJCWlzbiA9IGluaXRpYWxpemVQcm9ncmFtKG5hbWUpOworCQkJfQorCQkJcmV0dXJuIGlzbjsKKwkJfQorCQorCQlwcml2YXRlIGZ1bmN0aW9uIGluaXRpYWxpemVQcm9ncmFtKG5hbWU6U3RyaW5nKTpBcnJheSB7CisJCQl2YXIgaXNuOkFycmF5ID0gbmV3IEFycmF5KCk7CisJCQlwcm9ncmFtc1tuYW1lXSA9ICBpc247CisJCQlyZXR1cm4gaXNuOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiB0b09yaWdpbmFsU3RyaW5nKCk6U3RyaW5nIHsKKwkJCXJldHVybiB0b09yaWdpbmFsU3RyaW5nV2l0aFJhbmdlKE1JTl9UT0tFTl9JTkRFWCwgc2l6ZS0xKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gdG9PcmlnaW5hbFN0cmluZ1dpdGhSYW5nZShzdGFydDppbnQsIGVuZDppbnQpOlN0cmluZyB7CisJCQl2YXIgYnVmOlN0cmluZyA9IG5ldyBTdHJpbmcoKTsKKwkJCWZvciAodmFyIGk6aW50PXN0YXJ0OyBpPj1NSU5fVE9LRU5fSU5ERVggJiYgaTw9ZW5kICYmIGk8dG9rZW5zLmxlbmd0aDsgaSsrKSB7CisJCQkJYnVmICs9IGdldFRva2VuKGkpLnRleHQ7CisJCQl9CisJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsKKwkJCXJldHVybiB0b1N0cmluZ1dpdGhSYW5nZShNSU5fVE9LRU5fSU5ERVgsIHNpemUtMSk7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHRvU3RyaW5nV2l0aFJhbmdlKHN0YXJ0OmludCwgZW5kOmludCk6U3RyaW5nIHsKKwkJCXJldHVybiB0b1N0cmluZ1dpdGhSYW5nZUFuZFByb2dyYW0oc3RhcnQsIGVuZCwgREVGQVVMVF9QUk9HUkFNX05BTUUpOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmdXaXRoUmFuZ2VBbmRQcm9ncmFtKHN0YXJ0OmludCwgZW5kOmludCwgcHJvZ3JhbU5hbWU6U3RyaW5nKTpTdHJpbmcgeworCQkJdmFyIHJld3JpdGVzOkFycmF5ID0gcHJvZ3JhbXNbcHJvZ3JhbU5hbWVdIGFzIEFycmF5OworCQkJCisJCQkvLyBlbnN1cmUgc3RhcnQvZW5kIGFyZSBpbiByYW5nZQorCSAgICAgICAgaWYgKCBlbmQgPiB0b2tlbnMubGVuZ3RoLTEgKSBlbmQgPSB0b2tlbnMubGVuZ3RoLTE7CisJICAgICAgICBpZiAoIHN0YXJ0IDwgMCApIHN0YXJ0ID0gMDsKKyAgICAgICAgCisJCQlpZiAoIHJld3JpdGVzPT1udWxsIHx8IHJld3JpdGVzLmxlbmd0aD09MCApIHsKKwkJCQlyZXR1cm4gdG9PcmlnaW5hbFN0cmluZ1dpdGhSYW5nZShzdGFydCxlbmQpOyAvLyBubyBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZQorCQkJfQorCQkJdmFyIHN0YXRlOlJld3JpdGVTdGF0ZSA9IG5ldyBSZXdyaXRlU3RhdGUoKTsKKwkJCXN0YXRlLnRva2VucyA9IHRva2VuczsKKwkJCQorCQkJLy8gRmlyc3QsIG9wdGltaXplIGluc3RydWN0aW9uIHN0cmVhbQorCSAgICAgICAgdmFyIGluZGV4VG9PcDpBcnJheSA9IHJlZHVjZVRvU2luZ2xlT3BlcmF0aW9uUGVySW5kZXgocmV3cml0ZXMpOworCisJICAgICAgICAvLyBXYWxrIGJ1ZmZlciwgZXhlY3V0aW5nIGluc3RydWN0aW9ucyBhbmQgZW1pdHRpbmcgdG9rZW5zCisJICAgICAgICB2YXIgaTppbnQgPSBzdGFydDsKKwkgICAgICAgIHdoaWxlICggaSA8PSBlbmQgJiYgaSA8IHRva2Vucy5sZW5ndGggKSB7CisJICAgICAgICAgICAgdmFyIG9wOlJld3JpdGVPcGVyYXRpb24gPSBSZXdyaXRlT3BlcmF0aW9uKGluZGV4VG9PcFtpXSk7CisJICAgICAgICAgICAgaW5kZXhUb09wW2ldID0gdW5kZWZpbmVkOyAvLyByZW1vdmUgc28gYW55IGxlZnQgaGF2ZSBpbmRleCBzaXplLTEKKwkgICAgICAgICAgICB2YXIgdDpUb2tlbiA9IFRva2VuKHRva2Vuc1tpXSk7CisJICAgICAgICAgICAgaWYgKCBvcD09bnVsbCApIHsKKwkgICAgICAgICAgICAgICAgLy8gbm8gb3BlcmF0aW9uIGF0IHRoYXQgaW5kZXgsIGp1c3QgZHVtcCB0b2tlbgorCSAgICAgICAgICAgICAgICBzdGF0ZS5idWYgKz0gdC50ZXh0OworCSAgICAgICAgICAgICAgICBpKys7IC8vIG1vdmUgdG8gbmV4dCB0b2tlbgorCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIHsKKwkgICAgICAgICAgICAgICAgaSA9IG9wLmV4ZWN1dGUoc3RhdGUpOyAvLyBleGVjdXRlIG9wZXJhdGlvbiBhbmQgc2tpcAorCSAgICAgICAgICAgIH0KKwkgICAgICAgIH0KKwkgICAgICAgIAorCSAgICAgICAgLy8gaW5jbHVkZSBzdHVmZiBhZnRlciBlbmQgaWYgaXQncyBsYXN0IGluZGV4IGluIGJ1ZmZlcgorCSAgICAgICAgLy8gU28sIGlmIHRoZXkgZGlkIGFuIGluc2VydEFmdGVyKGxhc3RWYWxpZEluZGV4LCAiZm9vIiksIGluY2x1ZGUKKwkgICAgICAgIC8vIGZvbyBpZiBlbmQ9PWxhc3RWYWxpZEluZGV4LgorCSAgICAgICAgaWYgKCBlbmQ9PXRva2Vucy5sZW5ndGgtMSApIHsKKwkgICAgICAgICAgICAvLyBTY2FuIGFueSByZW1haW5pbmcgb3BlcmF0aW9ucyBhZnRlciBsYXN0IHRva2VuCisJICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGluY2x1ZGVkICh0aGV5IHdpbGwgYmUgaW5zZXJ0cykuCisJICAgICAgICAgICAgZm9yIGVhY2ggKG9wIGluIGluZGV4VG9PcCkgeworCSAgICAgICAgICAgIAlpZiAob3AgPT0gbnVsbCkgY29udGludWU7CisJICAgICAgICAgICAgICAgIGlmICggb3AuaW5kZXggPj0gdG9rZW5zLmxlbmd0aC0xICkgc3RhdGUuYnVmICs9IG9wLnRleHQ7CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICByZXR1cm4gc3RhdGUuYnVmOworCQl9CisJCQorCSAgICAvKiogV2UgbmVlZCB0byBjb21iaW5lIG9wZXJhdGlvbnMgYW5kIHJlcG9ydCBpbnZhbGlkIG9wZXJhdGlvbnMgKGxpa2UKKwkgICAgICogIG92ZXJsYXBwaW5nIHJlcGxhY2VzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWQgbmVzdGVkKS4gIEluc2VydHMgdG8KKwkgICAgICogIHNhbWUgaW5kZXggbmVlZCB0byBiZSBjb21iaW5lZCBldGMuLi4gICBIZXJlIGFyZSB0aGUgY2FzZXM6CisJICAgICAqCisJICAgICAqICBJLmkudSBJLmoudiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisJICAgICAqICBJLmkudSBJLmkudiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZTogSWl2dQorCSAgICAgKgorCSAgICAgKiAgUi5pLWoudSBSLngteS52IHwgaS1qIGluIHgteSAgICAgICAgICAgIGRlbGV0ZSBmaXJzdCBSCisJICAgICAqICBSLmktai51IFIuaS1qLnYgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGZpcnN0IFIKKwkgICAgICogIFIuaS1qLnUgUi54LXkudiB8IHgteSBpbiBpLWogICAgICAgICAgICBFUlJPUgorCSAgICAgKiAgUi5pLWoudSBSLngteS52IHwgYm91bmRhcmllcyBvdmVybGFwICAgIEVSUk9SCisJICAgICAqCisJICAgICAqICBJLmkudSBSLngteS52IHwgaSBpbiB4LXkgICAgICAgICAgICAgICAgZGVsZXRlIEkKKwkgICAgICogIEkuaS51IFIueC15LnYgfCBpIG5vdCBpbiB4LXkgICAgICAgICAgICBsZWF2ZSBhbG9uZSwgbm9ub3ZlcmxhcHBpbmcKKwkgICAgICogIFIueC15LnYgSS5pLnUgfCBpIGluIHgteSAgICAgICAgICAgICAgICBFUlJPUgorCSAgICAgKiAgUi54LXkudiBJLngudSAgICAgICAgICAgICAgICAgICAgICAgICAgIFIueC15LnV2IChjb21iaW5lLCBkZWxldGUgSSkKKwkgICAgICogIFIueC15LnYgSS5pLnUgfCBpIG5vdCBpbiB4LXkgICAgICAgICAgICBsZWF2ZSBhbG9uZSwgbm9ub3ZlcmxhcHBpbmcKKwkgICAgICoKKwkgICAgICogIEkuaS51ID0gaW5zZXJ0IHUgYmVmb3JlIG9wIEAgaW5kZXggaQorCSAgICAgKiAgUi54LXkudSA9IHJlcGxhY2UgeC15IGluZGV4ZWQgdG9rZW5zIHdpdGggdQorCSAgICAgKgorCSAgICAgKiAgRmlyc3Qgd2UgbmVlZCB0byBleGFtaW5lIHJlcGxhY2VzLiAgRm9yIGFueSByZXBsYWNlIG9wOgorCSAgICAgKgorCSAgICAgKiAgICAgIDEuIHdpcGUgb3V0IGFueSBpbnNlcnRpb25zIGJlZm9yZSBvcCB3aXRoaW4gdGhhdCByYW5nZS4KKwkgICAgICogICAgICAyLiBEcm9wIGFueSByZXBsYWNlIG9wIGJlZm9yZSB0aGF0IGlzIGNvbnRhaW5lZCBjb21wbGV0ZWx5IHdpdGhpbgorCSAgICAgKiAgICAgICAgIHRoYXQgcmFuZ2UuCisJICAgICAqICAgICAgMy4gVGhyb3cgZXhjZXB0aW9uIHVwb24gYm91bmRhcnkgb3ZlcmxhcCB3aXRoIGFueSBwcmV2aW91cyByZXBsYWNlLgorCSAgICAgKgorCSAgICAgKiAgVGhlbiB3ZSBjYW4gZGVhbCB3aXRoIGluc2VydHM6CisJICAgICAqCisJICAgICAqICAgICAgMS4gZm9yIGFueSBpbnNlcnRzIHRvIHNhbWUgaW5kZXgsIGNvbWJpbmUgZXZlbiBpZiBub3QgYWRqYWNlbnQuCisJICAgICAqICAgICAgMi4gZm9yIGFueSBwcmlvciByZXBsYWNlIHdpdGggc2FtZSBsZWZ0IGJvdW5kYXJ5LCBjb21iaW5lIHRoaXMKKwkgICAgICogICAgICAgICBpbnNlcnQgd2l0aCByZXBsYWNlIGFuZCBkZWxldGUgdGhpcyByZXBsYWNlLgorCSAgICAgKiAgICAgIDMuIHRocm93IGV4Y2VwdGlvbiBpZiBpbmRleCBpbiBzYW1lIHJhbmdlIGFzIHByZXZpb3VzIHJlcGxhY2UKKwkgICAgICoKKwkgICAgICogIERvbid0IGFjdHVhbGx5IGRlbGV0ZTsgbWFrZSBvcCBudWxsIGluIGxpc3QuIEVhc2llciB0byB3YWxrIGxpc3QuCisJICAgICAqICBMYXRlciB3ZSBjYW4gdGhyb3cgYXMgd2UgYWRkIHRvIGluZGV4IC0+IG9wIG1hcC4KKwkgICAgICoKKwkgICAgICogIE5vdGUgdGhhdCBJLjIgUi4yLTIgd2lsbCB3aXBlIG91dCBJLjIgZXZlbiB0aG91Z2gsIHRlY2huaWNhbGx5LCB0aGUKKwkgICAgICogIGluc2VydGVkIHN0dWZmIHdvdWxkIGJlIGJlZm9yZSB0aGUgcmVwbGFjZSByYW5nZS4gIEJ1dCwgaWYgeW91CisJICAgICAqICBhZGQgdG9rZW5zIGluIGZyb250IG9mIGEgbWV0aG9kIGJvZHkgJ3snIGFuZCB0aGVuIGRlbGV0ZSB0aGUgbWV0aG9kCisJICAgICAqICBib2R5LCBJIHRoaW5rIHRoZSBzdHVmZiBiZWZvcmUgdGhlICd7JyB5b3UgYWRkZWQgc2hvdWxkIGRpc2FwcGVhciB0b28uCisJICAgICAqCisJICAgICAqICBSZXR1cm4gYSBtYXAgZnJvbSB0b2tlbiBpbmRleCB0byBvcGVyYXRpb24uCisJICAgICAqLworCSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVPcGVyYXRpb25QZXJJbmRleChyZXdyaXRlczpBcnJheSk6QXJyYXkgeworCSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJld3JpdGVzPSIrcmV3cml0ZXMpOworCQorCSAgICAgICAgLy8gV0FMSyBSRVBMQUNFUworCSAgICAgICAgZm9yICh2YXIgaTppbnQgPSAwOyBpIDwgcmV3cml0ZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgICAgICB2YXIgb3A6UmV3cml0ZU9wZXJhdGlvbiA9IFJld3JpdGVPcGVyYXRpb24ocmV3cml0ZXNbaV0pOworCSAgICAgICAgICAgIGlmICggb3A9PW51bGwgKSBjb250aW51ZTsKKwkgICAgICAgICAgICBpZiAoICEob3AgaXMgUmVwbGFjZU9wKSApIGNvbnRpbnVlOworCSAgICAgICAgICAgIHZhciByb3A6UmVwbGFjZU9wID0gUmVwbGFjZU9wKHJld3JpdGVzW2ldKTsKKwkgICAgICAgICAgICAvLyBXaXBlIHByaW9yIGluc2VydHMgd2l0aGluIHJhbmdlCisJICAgICAgICAgICAgdmFyIGluc2VydHM6QXJyYXkgPSBnZXRLaW5kT2ZPcHMocmV3cml0ZXMsIEluc2VydEJlZm9yZU9wLCBpKTsKKwkgICAgICAgICAgICBmb3IgKHZhciBqOmludCA9IDA7IGogPCBpbnNlcnRzLmxlbmd0aDsgaisrKSB7CisJICAgICAgICAgICAgICAgIHZhciBpb3A6SW5zZXJ0QmVmb3JlT3AgPSBJbnNlcnRCZWZvcmVPcChpbnNlcnRzW2pdKTsKKwkgICAgICAgICAgICAgICAgaWYgKCBpb3AuaW5kZXggPj0gcm9wLmluZGV4ICYmIGlvcC5pbmRleCA8PSByb3AubGFzdEluZGV4ICkgeworCSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXNbaW9wLmluc3RydWN0aW9uSW5kZXhdID0gbnVsbDsgIC8vIGRlbGV0ZSBpbnNlcnQgYXMgaXQncyBhIG5vLW9wLgorCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIC8vIERyb3AgYW55IHByaW9yIHJlcGxhY2VzIGNvbnRhaW5lZCB3aXRoaW4KKwkgICAgICAgICAgICB2YXIgcHJldlJlcGxhY2VzOkFycmF5ID0gZ2V0S2luZE9mT3BzKHJld3JpdGVzLCBSZXBsYWNlT3AsIGkpOworCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcmV2UmVwbGFjZXMubGVuZ3RoOyBqKyspIHsKKwkgICAgICAgICAgICAgICAgdmFyIHByZXZSb3A6UmVwbGFjZU9wID0gUmVwbGFjZU9wKHByZXZSZXBsYWNlc1tqXSk7CisJICAgICAgICAgICAgICAgIGlmICggcHJldlJvcC5pbmRleD49cm9wLmluZGV4ICYmIHByZXZSb3AubGFzdEluZGV4IDw9IHJvcC5sYXN0SW5kZXggKSB7CisJICAgICAgICAgICAgICAgICAgICByZXdyaXRlc1twcmV2Um9wLmluc3RydWN0aW9uSW5kZXhdID0gbnVsbDsgIC8vIGRlbGV0ZSByZXBsYWNlIGFzIGl0J3MgYSBuby1vcC4KKwkgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiB1bmxlc3MgZGlzam9pbnQgb3IgaWRlbnRpY2FsCisJICAgICAgICAgICAgICAgIHZhciBkaXNqb2ludDpCb29sZWFuID0KKwkgICAgICAgICAgICAgICAgICAgIHByZXZSb3AubGFzdEluZGV4PHJvcC5pbmRleCB8fCBwcmV2Um9wLmluZGV4ID4gcm9wLmxhc3RJbmRleDsKKwkgICAgICAgICAgICAgICAgdmFyIHNhbWU6Qm9vbGVhbiA9CisJICAgICAgICAgICAgICAgICAgICBwcmV2Um9wLmluZGV4PT1yb3AuaW5kZXggJiYgcHJldlJvcC5sYXN0SW5kZXg9PXJvcC5sYXN0SW5kZXg7CisJICAgICAgICAgICAgICAgIGlmICggIWRpc2pvaW50ICYmICFzYW1lICkgeworCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJyZXBsYWNlIG9wIGJvdW5kYXJpZXMgb2YgIityb3ArCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb3ZlcmxhcCB3aXRoIHByZXZpb3VzICIrcHJldlJvcCk7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9CisJICAgICAgICB9CisJCisJICAgICAgICAvLyBXQUxLIElOU0VSVFMKKwkgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXdyaXRlcy5sZW5ndGg7IGkrKykgeworCSAgICAgICAgICAgIG9wID0gUmV3cml0ZU9wZXJhdGlvbihyZXdyaXRlc1tpXSk7CisJICAgICAgICAgICAgaWYgKCBvcD09bnVsbCApIGNvbnRpbnVlOworCSAgICAgICAgICAgIGlmICggIShvcCBpcyBJbnNlcnRCZWZvcmVPcCkgKSBjb250aW51ZTsKKwkgICAgICAgICAgICBpb3AgPSBJbnNlcnRCZWZvcmVPcChyZXdyaXRlc1tpXSk7CisJICAgICAgICAgICAgLy8gY29tYmluZSBjdXJyZW50IGluc2VydCB3aXRoIHByaW9yIGlmIGFueSBhdCBzYW1lIGluZGV4CisJICAgICAgICAgICAgdmFyIHByZXZJbnNlcnRzOkFycmF5ID0gZ2V0S2luZE9mT3BzKHJld3JpdGVzLCBJbnNlcnRCZWZvcmVPcCwgaSk7CisJICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZXZJbnNlcnRzLmxlbmd0aDsgaisrKSB7CisJICAgICAgICAgICAgICAgIHZhciBwcmV2SW9wOkluc2VydEJlZm9yZU9wID0gSW5zZXJ0QmVmb3JlT3AocHJldkluc2VydHNbal0pOworCSAgICAgICAgICAgICAgICBpZiAoIHByZXZJb3AuaW5kZXggPT0gaW9wLmluZGV4ICkgeyAvLyBjb21iaW5lIG9iamVjdHMKKwkgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5ncy4uLndlJ3JlIGluIHByb2Nlc3Mgb2YgdG9TdHJpbmcnaW5nCisJICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSB0b2tlbiBidWZmZXIgc28gbm8gbGF6eSBldmFsIGlzc3VlIHdpdGggYW55IHRlbXBsYXRlcworCSAgICAgICAgICAgICAgICAgICAgaW9wLnRleHQgPSBjYXRPcFRleHQoaW9wLnRleHQscHJldklvcC50ZXh0KTsKKwkgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW3ByZXZJb3AuaW5zdHJ1Y3Rpb25JbmRleF0gPSBudWxsOyAgLy8gZGVsZXRlIHJlZHVuZGFudCBwcmlvciBpbnNlcnQKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAvLyBsb29rIGZvciByZXBsYWNlcyB3aGVyZSBpb3AuaW5kZXggaXMgaW4gcmFuZ2U7IGVycm9yCisJICAgICAgICAgICAgcHJldlJlcGxhY2VzID0gZ2V0S2luZE9mT3BzKHJld3JpdGVzLCBSZXBsYWNlT3AsIGkpOworCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcmV2UmVwbGFjZXMubGVuZ3RoOyBqKyspIHsKKwkgICAgICAgICAgICAgICAgcm9wID0gUmVwbGFjZU9wKHByZXZSZXBsYWNlc1tqXSk7CisJICAgICAgICAgICAgICAgIGlmICggaW9wLmluZGV4ID09IHJvcC5pbmRleCApIHsKKwkgICAgICAgICAgICAgICAgICAgIHJvcC50ZXh0ID0gY2F0T3BUZXh0KGlvcC50ZXh0LHJvcC50ZXh0KTsKKwkgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW2ldID0gbnVsbDsgIC8vIGRlbGV0ZSBjdXJyZW50IGluc2VydAorCSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgaWYgKCBpb3AuaW5kZXggPj0gcm9wLmluZGV4ICYmIGlvcC5pbmRleCA8PSByb3AubGFzdEluZGV4ICkgeworCSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnNlcnQgb3AgIitpb3ArCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aGluIGJvdW5kYXJpZXMgb2YgcHJldmlvdXMgIityb3ApOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorCSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJyZXdyaXRlcyBhZnRlcj0iK3Jld3JpdGVzKTsKKwkgICAgICAgIHZhciBtOkFycmF5ID0gbmV3IEFycmF5KCk7CisJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmV3cml0ZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgICAgICBvcCA9IFJld3JpdGVPcGVyYXRpb24ocmV3cml0ZXNbaV0pOworCSAgICAgICAgICAgIGlmICggb3A9PW51bGwgKSBjb250aW51ZTsgLy8gaWdub3JlIGRlbGV0ZWQgb3BzCisJICAgICAgICAgICAgaWYgKCBtW29wLmluZGV4XSAhPSB1bmRlZmluZWQgKSB7CisJICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic2hvdWxkIG9ubHkgYmUgb25lIG9wIHBlciBpbmRleCIpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBtW29wLmluZGV4XSA9IG9wOworCSAgICAgICAgfQorCSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImluZGV4IHRvIG9wOiAiK20pOworCSAgICAgICAgcmV0dXJuIG07CisJICAgIH0KKwkKKwkgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNhdE9wVGV4dChhOk9iamVjdCwgYjpPYmplY3QpOlN0cmluZyB7CisJICAgICAgICB2YXIgeDpTdHJpbmcgPSAiIjsKKwkgICAgICAgIHZhciB5OlN0cmluZyA9ICIiOworCSAgICAgICAgaWYgKCBhIT1udWxsICkgeCA9IGEudG9TdHJpbmcoKTsKKwkgICAgICAgIGlmICggYiE9bnVsbCApIHkgPSBiLnRvU3RyaW5nKCk7CisJICAgICAgICByZXR1cm4geCt5OworCSAgICB9CisJICAgIAorCSAgICAvKiogR2V0IGFsbCBvcGVyYXRpb25zIGJlZm9yZSBhbiBpbmRleCBvZiBhIHBhcnRpY3VsYXIga2luZCAqLworCSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0S2luZE9mT3BzKHJld3JpdGVzOkFycmF5LCBraW5kOkNsYXNzLCBiZWZvcmU6aW50ID0gLTEpOkFycmF5IHsKKwkgICAgCWlmIChiZWZvcmUgPT0gLTEpIHsKKwkgICAgCQliZWZvcmUgPSByZXdyaXRlcy5sZW5ndGg7CisJICAgIAl9CisJICAgIAl2YXIgb3BzOkFycmF5ID0gbmV3IEFycmF5KCk7CisJICAgICAgICBmb3IgKHZhciBpOmludD0wOyBpPGJlZm9yZSAmJiBpPHJld3JpdGVzLmxlbmd0aDsgaSsrKSB7CisJICAgICAgICAgICAgdmFyIG9wOlJld3JpdGVPcGVyYXRpb24gPSBSZXdyaXRlT3BlcmF0aW9uKHJld3JpdGVzW2ldKTsKKwkgICAgICAgICAgICBpZiAoIG9wPT1udWxsICkgY29udGludWU7IC8vIGlnbm9yZSBkZWxldGVkCisJICAgICAgICAgICAgaWYgKCBnZXRRdWFsaWZpZWRDbGFzc05hbWUob3ApID09IGdldFF1YWxpZmllZENsYXNzTmFtZShraW5kKSApIG9wcy5wdXNoKG9wKTsKKwkgICAgICAgIH0gICAgICAgCisJICAgICAgICByZXR1cm4gb3BzOworCSAgICB9CisKKworCQlwdWJsaWMgZnVuY3Rpb24gdG9EZWJ1Z1N0cmluZygpOlN0cmluZyB7CisJCQlyZXR1cm4gdG9EZWJ1Z1N0cmluZ1dpdGhSYW5nZShNSU5fVE9LRU5fSU5ERVgsIHNpemUtMSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHRvRGVidWdTdHJpbmdXaXRoUmFuZ2Uoc3RhcnQ6aW50LCBlbmQ6aW50KTpTdHJpbmcgeworCQkJdmFyIGJ1ZjpTdHJpbmcgPSBuZXcgU3RyaW5nKCk7CisJCQlmb3IgKHZhciBpOmludD1zdGFydDsgaT49TUlOX1RPS0VOX0lOREVYICYmIGk8PWVuZCAmJiBpPHRva2Vucy5sZW5ndGg7IGkrKykgeworCQkJCWJ1ZiArPSBnZXRUb2tlbihpKTsKKwkJCX0KKwkJCXJldHVybiBidWY7CisJCX0KKwkJCisKKwl9Cit9CisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworCQorCisvLyBEZWZpbmUgdGhlIHJld3JpdGUgb3BlcmF0aW9uIGhpZXJhcmNoeQorCitjbGFzcyBSZXdyaXRlU3RhdGUgeworCXB1YmxpYyB2YXIgYnVmOlN0cmluZyA9IG5ldyBTdHJpbmcoKTsKKwlwdWJsaWMgdmFyIHRva2VuczpBcnJheTsKK30KKworY2xhc3MgUmV3cml0ZU9wZXJhdGlvbiB7CisJLyoqIFdoYXQgaW5kZXggaW50byByZXdyaXRlcyBMaXN0IGFyZSB3ZT8gKi8KKyAgICBpbnRlcm5hbCB2YXIgaW5zdHJ1Y3Rpb25JbmRleDppbnQ7CisgICAgLyoqIFRva2VuIGJ1ZmZlciBpbmRleC4gKi8KKwlwdWJsaWMgdmFyIGluZGV4OmludDsKKwlpbnRlcm5hbCB2YXIgdGV4dDpPYmplY3Q7CisJcHVibGljIGZ1bmN0aW9uIFJld3JpdGVPcGVyYXRpb24oaW5kZXg6aW50LCB0ZXh0Ok9iamVjdCkgeworCQl0aGlzLmluZGV4ID0gaW5kZXg7CisJCXRoaXMudGV4dCA9IHRleHQ7CisJfQorCS8qKiBFeGVjdXRlIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBieSBwb3NzaWJseSBhZGRpbmcgdG8gdGhlIGJ1ZmZlci4KKwkgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB0b2tlbiB0byBvcGVyYXRlIG9uLgorCSAqLworCXB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKHN0YXRlOlJld3JpdGVTdGF0ZSk6aW50IHsKKwkJcmV0dXJuIGluZGV4OworCX0KK30KKworY2xhc3MgSW5zZXJ0QmVmb3JlT3AgZXh0ZW5kcyBSZXdyaXRlT3BlcmF0aW9uIHsKKwlwdWJsaWMgZnVuY3Rpb24gSW5zZXJ0QmVmb3JlT3AoaW5kZXg6aW50LCB0ZXh0Ok9iamVjdCkgeworCQlzdXBlcihpbmRleCx0ZXh0KTsKKwl9CisJCisJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGV4ZWN1dGUoc3RhdGU6UmV3cml0ZVN0YXRlKTppbnQgeworCQlzdGF0ZS5idWYgKz0gdGV4dDsKKwkJc3RhdGUuYnVmICs9IFRva2VuKHN0YXRlLnRva2Vuc1tpbmRleF0pLnRleHQ7CisJCXJldHVybiBpbmRleCArIDE7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCXJldHVybiAiPEluc2VydEJlZm9yZU9wQCIgKyBpbmRleCArICI6XCIiICsgdGV4dCArICJcIj4iOworCX0KK30KKworLyoqIEknbSBnb2luZyB0byB0cnkgcmVwbGFjaW5nIHJhbmdlIGZyb20geC4ueSB3aXRoICh5LXgpKzEgUmVwbGFjZU9wCisgKiAgaW5zdHJ1Y3Rpb25zLgorICovCitjbGFzcyBSZXBsYWNlT3AgZXh0ZW5kcyBSZXdyaXRlT3BlcmF0aW9uIHsKKwlwdWJsaWMgdmFyIGxhc3RJbmRleDppbnQ7CisJCisJcHVibGljIGZ1bmN0aW9uIFJlcGxhY2VPcChmcm9tSW5kZXg6aW50LCB0b0luZGV4OmludCwgdGV4dDpPYmplY3QpIHsKKwkJc3VwZXIoZnJvbUluZGV4LCB0ZXh0KTsKKwkJbGFzdEluZGV4ID0gdG9JbmRleDsKKwl9CisJCisJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGV4ZWN1dGUoc3RhdGU6UmV3cml0ZVN0YXRlKTppbnQgeworCQlpZiAoIHRleHQhPW51bGwgKSB7CisJCQlzdGF0ZS5idWYgKz0gdGV4dDsKKwkJfQorCQlyZXR1cm4gbGFzdEluZGV4KzE7CisJfQorCQorCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCXJldHVybiAiPFJlcGxhY2VPcEAiICsgaW5kZXggKyAiLi4iICsgbGFzdEluZGV4ICsgIjpcIiIgKyB0ZXh0ICsgIlwiPiI7CisJfQorfQorCitjbGFzcyBEZWxldGVPcCBleHRlbmRzIFJlcGxhY2VPcCB7CisJcHVibGljIGZ1bmN0aW9uIERlbGV0ZU9wKGZyb21JbmRleDppbnQsIHRvSW5kZXg6aW50KSB7CisJCXN1cGVyKGZyb21JbmRleCwgdG9JbmRleCwgbnVsbCk7CisJfQorCQorCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCXJldHVybiAiPERlbGV0ZU9wQCIgKyBpbmRleCArICIuLiIgKyBsYXN0SW5kZXggKyAiPiI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU291cmNlLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU291cmNlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMWI5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5Tb3VyY2UuYXMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCS8qKiBBIHNvdXJjZSBvZiB0b2tlbnMgbXVzdCBwcm92aWRlIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIHZpYSBuZXh0VG9rZW4oKQorCSAqICBhbmQgYWxzbyBtdXN0IHJldmVhbCBpdCdzIHNvdXJjZSBvZiBjaGFyYWN0ZXJzOyBDb21tb25Ub2tlbidzIHRleHQgaXMKKwkgKiAgY29tcHV0ZWQgZnJvbSBhIENoYXJTdHJlYW07IGl0IG9ubHkgc3RvcmUgaW5kaWNlcyBpbnRvIHRoZSBjaGFyIHN0cmVhbS4KKwkgKgorCSAqICBFcnJvcnMgZnJvbSB0aGUgbGV4ZXIgYXJlIG5ldmVyIHBhc3NlZCB0byB0aGUgcGFyc2VyLiAgRWl0aGVyIHlvdSB3YW50CisJICogIHRvIGtlZXAgZ29pbmcgb3IgeW91IGRvIG5vdCB1cG9uIHRva2VuIHJlY29nbml0aW9uIGVycm9yLiAgSWYgeW91IGRvIG5vdAorCSAqICB3YW50IHRvIGNvbnRpbnVlIGxleGluZyB0aGVuIHlvdSBkbyBub3Qgd2FudCB0byBjb250aW51ZSBwYXJzaW5nLiAgSnVzdAorCSAqICB0aHJvdyBhbiBleGNlcHRpb24gbm90IHVuZGVyIFJlY29nbml0aW9uRXhjZXB0aW9uIGFuZCBKYXZhIHdpbGwgbmF0dXJhbGx5CisJICogIHRvc3MgeW91IGFsbCB0aGUgd2F5IG91dCBvZiB0aGUgcmVjb2duaXplcnMuICBJZiB5b3Ugd2FudCB0byBjb250aW51ZQorCSAqICBsZXhpbmcgdGhlbiB5b3Ugc2hvdWxkIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gdG8gdGhlIHBhcnNlci0taXQgaGFzIGFscmVhZHkKKwkgKiAgcmVxdWVzdGVkIGEgdG9rZW4uICBLZWVwIGxleGluZyB1bnRpbCB5b3UgZ2V0IGEgdmFsaWQgb25lLiAgSnVzdCByZXBvcnQKKwkgKiAgZXJyb3JzIGFuZCBrZWVwIGdvaW5nLCBsb29raW5nIGZvciBhIHZhbGlkIHRva2VuLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgVG9rZW5Tb3VyY2UgeworCQkvKiogUmV0dXJuIGEgVG9rZW4gb2JqZWN0IGZyb20geW91ciBpbnB1dCBzdHJlYW0gKHVzdWFsbHkgYSBDaGFyU3RyZWFtKS4KKwkJICogIERvIG5vdCBmYWlsL3JldHVybiB1cG9uIGxleGluZyBlcnJvcjsga2VlcCBjaGV3aW5nIG9uIHRoZSBjaGFyYWN0ZXJzCisJCSAqICB1bnRpbCB5b3UgZ2V0IGEgZ29vZCBvbmU7IGVycm9ycyBhcmUgbm90IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwYXJzZXIuCisJCSAqLworCQlmdW5jdGlvbiBuZXh0VG9rZW4oKTpUb2tlbjsKKwkJCisJCS8qKiBXaGVyZSBhcmUgeW91IGdldHRpbmcgdG9rZW5zIGZyb20/IG5vcm1hbGx5IHRoZSBpbXBsaWNhdGlvbiB3aWxsIHNpbXBseQorCQkgKiAgYXNrIGxleGVycyBpbnB1dCBzdHJlYW0uCisJCSAqLworCQlmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZzsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU3RyZWFtLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU3RyZWFtLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjM3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5TdHJlYW0uYXMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lIHsKKworCS8qKiBBIHN0cmVhbSBvZiB0b2tlbnMgYWNjZXNzaW5nIHRva2VucyBmcm9tIGEgVG9rZW5Tb3VyY2UgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFRva2VuU3RyZWFtIGV4dGVuZHMgSW50U3RyZWFtIHsKKwkgICAgLyoqIEdldCBUb2tlbiBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkIHdoZXJlIGk9MSBpcyBuZXh0IFRva2VuLgorCQkgKiAgaTwwIGluZGljYXRlcyB0b2tlbnMgaW4gdGhlIHBhc3QuICBTbyAtMSBpcyBwcmV2aW91cyB0b2tlbiBhbmQgLTIgaXMKKwkJICogIHR3byB0b2tlbnMgYWdvLiBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgaT49biwgcmV0dXJuIFRva2VuLkVPRlRva2VuLgorCQkgKiAgUmV0dXJuIG51bGwgZm9yIExUKDApIGFuZCBhbnkgaW5kZXggdGhhdCByZXN1bHRzIGluIGFuIGFic29sdXRlIGFkZHJlc3MKKwkJICogIHRoYXQgaXMgbmVnYXRpdmUuCisJCSAqLworCSAgICBmdW5jdGlvbiBMVChrOmludCk6VG9rZW47CisJCisJCS8qKiBHZXQgYSB0b2tlbiBhdCBhbiBhYnNvbHV0ZSBpbmRleCBpOyAwLi5uLTEuICBUaGlzIGlzIHJlYWxseSBvbmx5CisJCSAqICBuZWVkZWQgZm9yIHByb2ZpbGluZyBhbmQgZGVidWdnaW5nIGFuZCB0b2tlbiBzdHJlYW0gcmV3cml0aW5nLgorCQkgKiAgSWYgeW91IGRvbid0IHdhbnQgdG8gYnVmZmVyIHVwIHRva2VucywgdGhlbiB0aGlzIG1ldGhvZCBtYWtlcyBubworCQkgKiAgc2Vuc2UgZm9yIHlvdS4gIE5hdHVyYWxseSB5b3UgY2FuJ3QgdXNlIHRoZSByZXdyaXRlIHN0cmVhbSBmZWF0dXJlLgorCQkgKiAgSSBiZWxpZXZlIERlYnVnVG9rZW5TdHJlYW0gY2FuIGVhc2lseSBiZSBhbHRlcmVkIHRvIG5vdCB1c2UKKwkJICogIHRoaXMgbWV0aG9kLCByZW1vdmluZyB0aGUgZGVwZW5kZW5jeS4KKwkJICovCisJCWZ1bmN0aW9uIGdldFRva2VuKGk6aW50KTpUb2tlbjsKKwkKKwkJLyoqIFdoZXJlIGlzIHRoaXMgc3RyZWFtIHB1bGxpbmcgdG9rZW5zIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisJCSAqICB0aGUgb2JqZWN0IHRoYXQgcHJvdmlkZXMgVG9rZW4gb2JqZWN0cy4KKwkJICovCisJCWZ1bmN0aW9uIGdldCB0b2tlblNvdXJjZSgpOlRva2VuU291cmNlOworCQorCQkvKiogUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisJCSAqICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIHRva2VucyB0aGVuIGl0IGNhbiBqdXN0CisJCSAqICByZXR1cm4gIiIgb3IgbnVsbDsgIFVzZXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorCQkgKiAgYW4gYWN0aW9uIG9mIGNvdXJzZSBpbiB0aGF0IGNhc2UuCisJCSAqLworCQlmdW5jdGlvbiB0b1N0cmluZ1dpdGhSYW5nZShzdGFydDppbnQsIHN0b3A6aW50KTpTdHJpbmc7CisJCisJCS8qKiBCZWNhdXNlIHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UgYSB0b2tlbiB3aXRoIGFuIGluZGV4IHN0b3JlZAorCQkgKiAgaW4gaXQsIHdlIG11c3QgcHJvdmlkZSBhIG1lYW5zIGZvciB0d28gdG9rZW4gb2JqZWN0cyB0aGVtc2VsdmVzIHRvCisJCSAqICBpbmRpY2F0ZSB0aGUgc3RhcnQvZW5kIGxvY2F0aW9uLiAgTW9zdCBvZnRlbiB0aGlzIHdpbGwganVzdCBkZWxlZ2F0ZQorCQkgKiAgdG8gdGhlIG90aGVyIHRvU3RyaW5nKGludCxpbnQpLiAgVGhpcyBpcyBhbHNvIHBhcmFsbGVsIHdpdGgKKwkJICogIHRoZSBUcmVlTm9kZVN0cmVhbS50b1N0cmluZyhPYmplY3QsT2JqZWN0KS4KKwkJICovCisJCWZ1bmN0aW9uIHRvU3RyaW5nV2l0aFRva2VuUmFuZ2Uoc3RhcnQ6VG9rZW4sIHN0b3A6VG9rZW4pOlN0cmluZzsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDFiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lCit7CisgICAgcHVibGljIGNsYXNzIFVud2FudGVkVG9rZW5FeGNlcHRpb24gZXh0ZW5kcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBVbndhbnRlZFRva2VuRXhjZXB0aW9uKGV4cGVjdGluZzppbnQsIGlucHV0OkludFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZXhwZWN0aW5nLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICAgCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgdW5leHBlY3RlZFRva2VuKCk6VG9rZW4geworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeworICAgIAkJdmFyIGV4cDpTdHJpbmcgPSAiLCBleHBlY3RlZCAiK2V4cGVjdGluZzsKKwkJCWlmICggZXhwZWN0aW5nPT1Ub2tlbkNvbnN0YW50cy5JTlZBTElEX1RPS0VOX1RZUEUgKSB7CisJCQkJZXhwID0gIiI7CisJCQl9CisJCQlpZiAoIHRva2VuPT1udWxsICkgeworCQkJCXJldHVybiAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0iK251bGwrZXhwKyIpIjsKKwkJCX0KKwkJCXJldHVybiAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0iK3Rva2VuLnRleHQrZXhwKyIpIjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzc4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZS5hcwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUgeworCS8qKiBBIGdlbmVyaWMgdHJlZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG5vIHBheWxvYWQuICBZb3UgbXVzdCBzdWJjbGFzcyB0bworCSAqICBhY3R1YWxseSBoYXZlIGFueSB1c2VyIGRhdGEuICBBTlRMUiB2MyB1c2VzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcHByb2FjaAorCSAqICBpbnN0ZWFkIG9mIHRoZSBjaGlsZC1zaWJsaW5nIGFwcHJvYWNoIGluIHYyLiAgQSBmbGF0IHRyZWUgKGEgbGlzdCkgaXMKKwkgKiAgYW4gZW1wdHkgbm9kZSB3aG9zZSBjaGlsZHJlbiByZXByZXNlbnQgdGhlIGxpc3QuICBBbiBlbXB0eSwgYnV0CisJICogIG5vbi1udWxsIG5vZGUgaXMgY2FsbGVkICJuaWwiLgorCSAqLworCXB1YmxpYyBjbGFzcyBCYXNlVHJlZSBpbXBsZW1lbnRzIFRyZWUgeworCQlwcm90ZWN0ZWQgdmFyIF9jaGlsZHJlbjpBcnJheTsKKwkKKwkJLyoqIENyZWF0ZSBhIG5ldyBub2RlIGZyb20gYW4gZXhpc3Rpbmcgbm9kZSBkb2VzIG5vdGhpbmcgZm9yIEJhc2VUcmVlCisJCSAqICBhcyB0aGVyZSBhcmUgbm8gZmllbGRzIG90aGVyIHRoYW4gdGhlIGNoaWxkcmVuIGxpc3QsIHdoaWNoIGNhbm5vdAorCQkgKiAgYmUgY29waWVkIGFzIHRoZSBjaGlsZHJlbiBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGlzIG5vZGUuIAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIEJhc2VUcmVlKG5vZGU6VHJlZSA9IG51bGwpIHsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hpbGQoaTppbnQpOlRyZWUgeworCQkJaWYgKCBfY2hpbGRyZW49PW51bGwgfHwgaT49X2NoaWxkcmVuLmxlbmd0aCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBCYXNlVHJlZShfY2hpbGRyZW5baV0pOworCQl9CisJCQorCQkvKiogR2V0IHRoZSBjaGlsZHJlbiBpbnRlcm5hbCBMaXN0OyBub3RlIHRoYXQgaWYgeW91IGRpcmVjdGx5IG1lc3Mgd2l0aAorCQkgKiAgdGhlIGxpc3QsIGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGNoaWxkcmVuKCk6QXJyYXkgeworCQkJcmV0dXJuIF9jaGlsZHJlbjsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldEZpcnN0Q2hpbGRXaXRoVHlwZSh0eXBlOmludCk6VHJlZSB7CisJCQlmb3IgKHZhciBpOmludCA9IDA7IF9jaGlsZHJlbiE9bnVsbCAmJiBpIDwgX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIHQ6VHJlZSA9IFRyZWUoX2NoaWxkcmVuW2ldKTsKKwkJCQlpZiAoIHQudHlwZT09dHlwZSApIHsKKwkJCQkJcmV0dXJuIHQ7CisJCQkJfQorCQkJfQkKKwkJCXJldHVybiBudWxsOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgY2hpbGRDb3VudCgpOmludCB7CisJCQlpZiAoIF9jaGlsZHJlbj09bnVsbCApIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiBfY2hpbGRyZW4ubGVuZ3RoOworCQl9CisJCisJCS8qKiBBZGQgdCBhcyBjaGlsZCBvZiB0aGlzIG5vZGUuCisJCSAqCisJCSAqICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKwkJICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHRoaXMgcm91dGluZSBtb3ZlcyBjaGlsZHJlbiB0byB0IHZpYQorCQkgKiAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGFkZENoaWxkKHQ6VHJlZSk6dm9pZCB7CisJCQlpZiAoIHQ9PW51bGwgKSB7CisJCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nIHVwb24gYWRkQ2hpbGQobnVsbCkKKwkJCX0KKwkJCXZhciBjaGlsZFRyZWU6QmFzZVRyZWUgPSBCYXNlVHJlZSh0KTsKKwkJCWlmICggY2hpbGRUcmVlLmlzTmlsICkgeyAvLyB0IGlzIGFuIGVtcHR5IG5vZGUgcG9zc2libHkgd2l0aCBjaGlsZHJlbgorCQkJCWlmICggdGhpcy5fY2hpbGRyZW4hPW51bGwgJiYgdGhpcy5fY2hpbGRyZW4gPT0gY2hpbGRUcmVlLl9jaGlsZHJlbiApIHsKKwkJCQkJdGhyb3cgbmV3IEVycm9yKCJhdHRlbXB0IHRvIGFkZCBjaGlsZCBsaXN0IHRvIGl0c2VsZiIpOworCQkJCX0KKwkJCQkvLyBqdXN0IGFkZCBhbGwgb2YgY2hpbGRUcmVlJ3MgY2hpbGRyZW4gdG8gdGhpcworCQkJCWlmICggY2hpbGRUcmVlLl9jaGlsZHJlbiE9bnVsbCApIHsKKwkJCQkJaWYgKCB0aGlzLl9jaGlsZHJlbiE9bnVsbCApIHsgLy8gbXVzdCBjb3B5LCB0aGlzIGhhcyBjaGlsZHJlbiBhbHJlYWR5CisJCQkJCQl2YXIgbjppbnQgPSBjaGlsZFRyZWUuX2NoaWxkcmVuLmxlbmd0aDsKKwkJCQkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IG47IGkrKykgeworCQkJCQkJCXZhciBjOlRyZWUgPSBUcmVlKGNoaWxkVHJlZS5fY2hpbGRyZW5baV0pOworCQkJCQkJCXRoaXMuY2hpbGRyZW4ucHVzaChjKTsKKwkJCQkJCQkvLyBoYW5kbGUgZG91YmxlLWxpbmsgc3R1ZmYgZm9yIGVhY2ggY2hpbGQgb2YgbmlsIHJvb3QKKwkJCQkJCQljLnBhcmVudCA9IHRoaXM7CisJCQkJCQkJYy5jaGlsZEluZGV4ID0gY2hpbGRyZW4ubGVuZ3RoLTE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvLyBubyBjaGlsZHJlbiBmb3IgdGhpcyBidXQgdCBoYXMgY2hpbGRyZW47IGp1c3Qgc2V0IHBvaW50ZXIKKwkJCQkJCS8vIGNhbGwgZ2VuZXJhbCBmcmVzaGVuZXIgcm91dGluZQorCQkJCQkJdGhpcy5fY2hpbGRyZW4gPSBjaGlsZFRyZWUuY2hpbGRyZW47CisJCQkJCQl0aGlzLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeyAvLyBjaGlsZCBpcyBub3QgbmlsIChkb24ndCBjYXJlIGFib3V0IGNoaWxkcmVuKQorCQkJCWlmICggX2NoaWxkcmVuPT1udWxsICkgeworCQkJCQlfY2hpbGRyZW4gPSBuZXcgQXJyYXkoKTsgLy8gY3JlYXRlIGNoaWxkcmVuIGxpc3Qgb24gZGVtYW5kCisJCQkJfQorCQkJCV9jaGlsZHJlbi5wdXNoKHQpOworCQkJCWNoaWxkVHJlZS5wYXJlbnQgPSB0aGlzOworCQkJCWNoaWxkVHJlZS5jaGlsZEluZGV4ID0gY2hpbGRyZW4ubGVuZ3RoLTE7CisJCQl9CisJCX0KKwkKKwkJLyoqIEFkZCBhbGwgZWxlbWVudHMgb2Yga2lkcyBsaXN0IGFzIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSAqLworCQlwdWJsaWMgZnVuY3Rpb24gYWRkQ2hpbGRyZW4oa2lkczpBcnJheSk6dm9pZCB7CisJCQlmb3IgKHZhciBpOmludCA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIHQ6VHJlZSA9IFRyZWUoa2lkc1tpXSk7CisJCQkJYWRkQ2hpbGQodCk7CisJCQl9CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHNldENoaWxkKGk6aW50LCB0OlRyZWUpOnZvaWQgeworCQkJaWYgKCB0PT1udWxsICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICggdC5pc05pbCApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IHNldCBzaW5nbGUgY2hpbGQgdG8gYSBsaXN0Iik7CisJCQl9CisJCQlpZiAoIF9jaGlsZHJlbj09bnVsbCApIHsKKwkJCQlfY2hpbGRyZW4gPSBuZXcgQXJyYXkoKTsKKwkJCX0KKwkJCV9jaGlsZHJlbltpXSA9IHQ7CisJCQl0LnBhcmVudCA9IHRoaXM7CisJCQl0LmNoaWxkSW5kZXggPSBpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBkZWxldGVDaGlsZChpOmludCk6T2JqZWN0IHsKKwkJCWlmICggX2NoaWxkcmVuPT1udWxsICkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJdmFyIGtpbGxlZDpCYXNlVHJlZSA9IEJhc2VUcmVlKGNoaWxkcmVuLnJlbW92ZShpKSk7CisJCQkvLyB3YWxrIHJlc3QgYW5kIGRlY3JlbWVudCB0aGVpciBjaGlsZCBpbmRleGVzCisJCQl0aGlzLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXNGcm9tKGkpOworCQkJcmV0dXJuIGtpbGxlZDsKKwkJfQorCisJCS8qKiBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKwkJICogIGEgbGlzdCAobmlsLXJvb3QgdHJlZSkuICBudW0gb2YgY2hpbGRyZW4gY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlLgorCQkgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisJCSAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiByZXBsYWNlQ2hpbGRyZW4oc3RhcnRDaGlsZEluZGV4OmludCwgc3RvcENoaWxkSW5kZXg6aW50LCB0Ok9iamVjdCk6dm9pZCB7CisJCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgeworCQkJCXRocm93IG5ldyBFcnJvcigiaW5kZXhlcyBpbnZhbGlkOyBubyBjaGlsZHJlbiBpbiBsaXN0Iik7CisJCQl9CisJCQl2YXIgcmVwbGFjaW5nSG93TWFueTppbnQgPSBzdG9wQ2hpbGRJbmRleCAtIHN0YXJ0Q2hpbGRJbmRleCArIDE7CisJCQl2YXIgcmVwbGFjaW5nV2l0aEhvd01hbnk6aW50OworCQkJdmFyIG5ld1RyZWU6QmFzZVRyZWUgPSBCYXNlVHJlZSh0KTsKKwkJCXZhciBuZXdDaGlsZHJlbjpBcnJheSA9IG51bGw7CisJCQkvLyBub3JtYWxpemUgdG8gYSBsaXN0IG9mIGNoaWxkcmVuIHRvIGFkZDogbmV3Q2hpbGRyZW4KKwkJCWlmICggbmV3VHJlZS5pc05pbCApIHsKKwkJCQluZXdDaGlsZHJlbiA9IG5ld1RyZWUuY2hpbGRyZW47CisJCQl9CisJCQllbHNlIHsKKwkJCQluZXdDaGlsZHJlbiA9IG5ldyBBcnJheSgpOworCQkJCW5ld0NoaWxkcmVuLnB1c2gobmV3VHJlZSk7CisJCQl9CisJCQlyZXBsYWNpbmdXaXRoSG93TWFueSA9IG5ld0NoaWxkcmVuLmxlbmd0aDsKKwkJCXZhciBudW1OZXdDaGlsZHJlbjppbnQgPSBuZXdDaGlsZHJlbi5sZW5ndGg7CisJCQl2YXIgZGVsdGE6aW50ID0gcmVwbGFjaW5nSG93TWFueSAtIHJlcGxhY2luZ1dpdGhIb3dNYW55OworCQkJLy8gaWYgc2FtZSBudW1iZXIgb2Ygbm9kZXMsIGRvIGRpcmVjdCByZXBsYWNlCisJCQlpZiAoIGRlbHRhID09IDAgKSB7CisJCQkJdmFyIGo6aW50ID0gMDsgLy8gaW5kZXggaW50byBuZXcgY2hpbGRyZW4KKwkJCQlmb3IgKHZhciBpOmludD1zdGFydENoaWxkSW5kZXg7IGk8PXN0b3BDaGlsZEluZGV4OyBpKyspIHsKKwkJCQkJdmFyIGNoaWxkOkJhc2VUcmVlID0gQmFzZVRyZWUobmV3Q2hpbGRyZW5bal0pOworCQkJCQljaGlsZHJlbltpXSA9IGNoaWxkOworCQkJCQljaGlsZC5wYXJlbnQgPSB0aGlzOworCQkJCQljaGlsZC5jaGlsZEluZGV4PSBpOworCSAgICAgICAgICAgICAgICBqKys7CisJICAgICAgICAgICAgfQorCQkJfQorCQkJZWxzZSBpZiAoIGRlbHRhID4gMCApIHsgLy8gZmV3ZXIgbmV3IG5vZGVzIHRoYW4gdGhlcmUgd2VyZQorCQkJCS8vIHNldCBjaGlsZHJlbiBhbmQgdGhlbiBkZWxldGUgZXh0cmEKKwkJCQlmb3IgKGo9MDsgajxudW1OZXdDaGlsZHJlbjsgaisrKSB7CisJCQkJCWNoaWxkcmVuW3N0YXJ0Q2hpbGRJbmRleCtqXSA9IG5ld0NoaWxkcmVuW2pdOworCQkJCX0KKwkJCQl2YXIgaW5kZXhUb0RlbGV0ZTppbnQgPSBzdGFydENoaWxkSW5kZXgrbnVtTmV3Q2hpbGRyZW47CisJCQkJZm9yICh2YXIgYzppbnQ9aW5kZXhUb0RlbGV0ZTsgYzw9c3RvcENoaWxkSW5kZXg7IGMrKykgeworCQkJCQkvLyBkZWxldGUgc2FtZSBpbmRleCwgc2hpZnRpbmcgZXZlcnlib2R5IGRvd24gZWFjaCB0aW1lCisJCQkJCXZhciBraWxsZWQ6QmFzZVRyZWUgPSBCYXNlVHJlZShjaGlsZHJlbi5yZW1vdmUoaW5kZXhUb0RlbGV0ZSkpOworCQkJCX0KKwkJCQlmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzRnJvbShzdGFydENoaWxkSW5kZXgpOworCQkJfQorCQkJZWxzZSB7IC8vIG1vcmUgbmV3IG5vZGVzIHRoYW4gd2VyZSB0aGVyZSBiZWZvcmUKKwkJCQkvLyBmaWxsIGluIGFzIG1hbnkgY2hpbGRyZW4gYXMgd2UgY2FuIChyZXBsYWNpbmdIb3dNYW55KSB3L28gbW92aW5nIGRhdGEKKwkJCQlmb3IgKGo9MDsgajxyZXBsYWNpbmdIb3dNYW55OyBqKyspIHsKKwkJCQkJY2hpbGRyZW5bc3RhcnRDaGlsZEluZGV4K2pdID0gbmV3Q2hpbGRyZW5bal07CisJCQkJfQorCQkJCXZhciBudW1Ub0luc2VydDppbnQgPSByZXBsYWNpbmdXaXRoSG93TWFueS1yZXBsYWNpbmdIb3dNYW55OworCQkJCWZvciAoaj1yZXBsYWNpbmdIb3dNYW55OyBqPHJlcGxhY2luZ1dpdGhIb3dNYW55OyBqKyspIHsKKwkJCQkJY2hpbGRyZW4uc3BsaWNlKHN0YXJ0Q2hpbGRJbmRleCtqLCAwLCBuZXdDaGlsZHJlbltqXSk7CisJCQkJfQorCQkJCWZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXNGcm9tKHN0YXJ0Q2hpbGRJbmRleCk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGlzTmlsKCk6Qm9vbGVhbiB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkKKwkJLyoqIFNldCB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbmRleCB2YWx1ZXMgZm9yIGFsbCBjaGlsZCBvZiB0ICovCisJCXB1YmxpYyBmdW5jdGlvbiBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk6dm9pZCB7CisJCQlmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzRnJvbSgwKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlc0Zyb20ob2Zmc2V0OmludCk6dm9pZCB7CisJCQl2YXIgbjppbnQgPSBjaGlsZENvdW50OworCQkJZm9yICh2YXIgYzppbnQgPSBvZmZzZXQ7IGMgPCBuOyBjKyspIHsKKwkJCQl2YXIgY2hpbGQ6VHJlZSA9IFRyZWUoZ2V0Q2hpbGQoYykpOworCQkJCWNoaWxkLmNoaWxkSW5kZXggPSBjOworCQkJCWNoaWxkLnBhcmVudCA9IHRoaXM7CisJCQl9CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk6dm9pZCB7CisJCQlzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlc0Zyb20obnVsbCwgLTEpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlc0Zyb20ocGFyZW50OlRyZWUsIGk6aW50KTp2b2lkIHsKKwkJCWlmICggcGFyZW50IT10aGlzLnBhcmVudCApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoInBhcmVudHMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICIrcGFyZW50KyIgZm91bmQgIit0aGlzLnBhcmVudCk7CisJCQl9CisJCQlpZiAoIGkhPXRoaXMuY2hpbGRJbmRleCApIHsKKwkJCQl0aHJvdyBuZXcgRXJyb3IoImNoaWxkIGluZGV4ZXMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICIraSsiIGZvdW5kICIrdGhpcy5jaGlsZEluZGV4KTsKKwkJCX0KKwkJCXZhciBuOmludCA9IHRoaXMuY2hpbGRDb3VudDsKKwkJCWZvciAodmFyIGM6aW50ID0gMDsgYyA8IG47IGMrKykgeworCQkJCXZhciBjaGlsZDpDb21tb25UcmVlID0gQ29tbW9uVHJlZSh0aGlzLmdldENoaWxkKGMpKTsKKwkJCQljaGlsZC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlc0Zyb20odGhpcywgYyk7CisJCQl9CisJCX0KKwkKKwkJLyoqIEJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy4gKi8KKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjaGlsZEluZGV4KCk6aW50IHsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IGNoaWxkSW5kZXgoaW5kZXg6aW50KTp2b2lkIHsKKwkJfQorCQorCQkvKiogQmFzZVRyZWUgZG9lc24ndCB0cmFjayBwYXJlbnQgcG9pbnRlcnMuICovCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgcGFyZW50KCk6VHJlZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHBhcmVudCh0OlRyZWUpOnZvaWQgeworCQl9CisKKyAgICAgICAgLyoqIFdhbGsgdXB3YXJkcyBsb29raW5nIGZvciBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS4gKi8KKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGhhc0FuY2VzdG9yKHR0eXBlOmludCk6Qm9vbGVhbiB7IHJldHVybiBnZXRBbmNlc3Rvcih0dHlwZSkhPW51bGw7IH0KKyAgICAKKyAgICAgICAgLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QW5jZXN0b3IodHR5cGU6aW50KTpUcmVlIHsKKyAgICAgICAgICAgIHZhciB0OlRyZWUgPSB0aGlzOworICAgICAgICAgICAgdCA9IHQucGFyZW50OworICAgICAgICAgICAgd2hpbGUgKCB0IT1udWxsICkgeworICAgICAgICAgICAgICAgIGlmICggdC50eXBlPT10dHlwZSApIHJldHVybiB0OworICAgICAgICAgICAgICAgIHQgPSB0LnBhcmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgCisgICAgICAgIC8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAgICAgICAgICogIGxpc3QgaXMgdGhlIHJvb3QgYW5kIHRoZSBsYXN0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldCBhbmNlc3RvcnMoKTpBcnJheSB7CisgICAgICAgICAgICBpZiAoIHBhcmVudD09bnVsbCApIHJldHVybiBudWxsOworICAgICAgICAgICAgdmFyIGFuY2VzdG9yczpBcnJheSA9IG5ldyBBcnJheSgpOworICAgICAgICAgICAgdmFyIHQ6VHJlZSA9IHRoaXM7CisgICAgICAgICAgICB0ID0gdC5wYXJlbnQ7CisgICAgICAgICAgICB3aGlsZSAoIHQhPW51bGwgKSB7CisgICAgICAgICAgICAgICAgYW5jZXN0b3JzLnVuc2hpZnQodCk7IC8vIGluc2VydCBhdCBzdGFydAorICAgICAgICAgICAgICAgIHQgPSB0LnBhcmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbmNlc3RvcnM7CisgICAgICAgIH0KKworCQkvKiogUHJpbnQgb3V0IGEgd2hvbGUgdHJlZSBub3QganVzdCBhIG5vZGUgKi8KKwkgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nVHJlZSgpOlN0cmluZyB7CisJCQlpZiAoIF9jaGlsZHJlbj09bnVsbCB8fCBfY2hpbGRyZW4ubGVuZ3RoPT0wICkgeworCQkJCXJldHVybiBTdHJpbmcodGhpcyk7CisJCQl9CisJCQl2YXIgYnVmOlN0cmluZyA9ICIiOworCQkJaWYgKCAhaXNOaWwgKSB7CisJCQkJYnVmICs9ICIoIjsKKwkJCQlidWYgKz0gU3RyaW5nKHRoaXMpOworCQkJCWJ1ZiArPSAnICc7CisJCQl9CisJCQlmb3IgKHZhciBpOmludCA9IDA7IF9jaGlsZHJlbiE9bnVsbCAmJiBpIDwgX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFyIHQ6QmFzZVRyZWUgPSBCYXNlVHJlZShfY2hpbGRyZW5baV0pOworCQkJCWlmICggaT4wICkgeworCQkJCQlidWYgKz0gJyAnOworCQkJCX0KKwkJCQlidWYgKz0gdC50b1N0cmluZ1RyZWUoKTsKKwkJCX0KKwkJCWlmICggIWlzTmlsICkgeworCQkJCWJ1ZiArPSAiKSI7CisJCQl9CisJCQlyZXR1cm4gYnVmOworCQl9CisJCisJICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgbGluZSgpOmludCB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGNoYXJQb3NpdGlvbkluTGluZSgpOmludCB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8vICJBYnN0cmFjdCIgZnVuY3Rpb25zIHNpbmNlIHRoZXJlIGFyZSBubyBhYnN0cmFjdCBjbGFzc2VzIGluIGFjdGlvbnNjcmlwdAorCQkgCisJCXB1YmxpYyBmdW5jdGlvbiBkdXBOb2RlKCk6VHJlZSB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdHlwZSgpOmludCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdGV4dCgpOlN0cmluZyB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdG9rZW5TdGFydEluZGV4KCk6aW50IHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHNldCB0b2tlblN0YXJ0SW5kZXgoaW5kZXg6aW50KTp2b2lkIHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCB0b2tlblN0b3BJbmRleCgpOmludCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgdG9rZW5TdG9wSW5kZXgoaW5kZXg6aW50KTp2b2lkIHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7CisJCX0KKwkKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWVBZGFwdG9yLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWVBZGFwdG9yLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjVjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZUFkYXB0b3IuYXMKQEAgLTAsMCArMSwzMTMgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisgICAgCisJaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7CisJCisJaW1wb3J0IG14LnV0aWxzLk9iamVjdFV0aWw7CisJCisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CisKKwkvKiogQSBUcmVlQWRhcHRvciB0aGF0IHdvcmtzIHdpdGggYW55IFRyZWUgaW1wbGVtZW50YXRpb24uICovCQorCXB1YmxpYyBjbGFzcyBCYXNlVHJlZUFkYXB0b3IgaW1wbGVtZW50cyBUcmVlQWRhcHRvciB7CisJCS8qKiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSgpIGlzIG5vdCBhbHdheXMgdW5pcXVlOyB3ZSBoYXZlIHRvCisJCSAqICB0cmFjayBvdXJzZWx2ZXMuICBUaGF0J3Mgb2ssIGl0J3Mgb25seSBmb3IgZGVidWdnaW5nLCB0aG91Z2ggaXQncworCQkgKiAgZXhwZW5zaXZlOiB3ZSBoYXZlIHRvIGNyZWF0ZSBhIGhhc2h0YWJsZSB3aXRoIGFsbCB0cmVlIG5vZGVzIGluIGl0LgorCQkgKi8KKwkJcHJvdGVjdGVkIHZhciB0cmVlVG9VbmlxdWVJRE1hcDpEaWN0aW9uYXJ5OworCQlwcm90ZWN0ZWQgdmFyIHVuaXF1ZU5vZGVJRDppbnQgPSAxOworCQorCQlwdWJsaWMgZnVuY3Rpb24gbmlsKCk6T2JqZWN0IHsKKwkJCXJldHVybiBjcmVhdGVXaXRoUGF5bG9hZChudWxsKTsKKwkJfQorCQorCQkvKiogY3JlYXRlIHRyZWUgbm9kZSB0aGF0IGhvbGRzIHRoZSBzdGFydCBhbmQgc3RvcCB0b2tlbnMgYXNzb2NpYXRlZAorICAgIAkgKiAgd2l0aCBhbiBlcnJvci4KKyAgICAJICoKKyAgICAJICogIElmIHlvdSBzcGVjaWZ5IHlvdXIgb3duIGtpbmQgb2YgdHJlZSBub2RlcywgeW91IHdpbGwgbGlrZWx5IGhhdmUgdG8KKyAgICAJICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBDb21tb25UcmVlIHJldHVybnMgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFCisgICAgCSAqICBpZiBubyB0b2tlbiBwYXlsb2FkIGJ1dCB5b3UgbWlnaHQgaGF2ZSB0byBzZXQgdG9rZW4gdHlwZSBmb3IgZGlmZgorICAgIAkgKiAgbm9kZSB0eXBlLgorICAgIAkgKiAKKyAgICAgICAgICogIFlvdSBkb24ndCBoYXZlIHRvIHN1YmNsYXNzIENvbW1vbkVycm9yTm9kZTsgeW91IHdpbGwgbGlrZWx5IG5lZWQgdG8KKyAgICAgICAgICogIHN1YmNsYXNzIHlvdXIgb3duIHRyZWUgbm9kZSBjbGFzcyB0byBhdm9pZCBjbGFzcyBjYXN0IGV4Y2VwdGlvbi4KKyAgICAJICovCisgICAgCXB1YmxpYyBmdW5jdGlvbiBlcnJvck5vZGUoaW5wdXQ6VG9rZW5TdHJlYW0sIHN0YXJ0OlRva2VuLCBzdG9wOlRva2VuLAorICAgIAkJCQkJCQllOlJlY29nbml0aW9uRXhjZXB0aW9uKTpPYmplY3QgeworICAgIAkJdmFyIHQ6Q29tbW9uRXJyb3JOb2RlID0gbmV3IENvbW1vbkVycm9yTm9kZShpbnB1dCwgc3RhcnQsIHN0b3AsIGUpOworICAgIAkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBlcnJvciBub2RlICciK3QrIicgQGluZGV4PSIraW5wdXQuaW5kZXgoKSk7CisgICAgCQlyZXR1cm4gdDsKKyAgICAJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBpc05pbCh0cmVlOk9iamVjdCk6Qm9vbGVhbiB7CisJCQlyZXR1cm4gVHJlZSh0cmVlKS5pc05pbDsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZHVwVHJlZSh0cmVlOk9iamVjdCk6T2JqZWN0IHsKKwkJCXJldHVybiBkdXBUcmVlV2l0aFBhcmVudCh0cmVlLCBudWxsKTsKKwkJfQorCQorCQkvKiogVGhpcyBpcyBnZW5lcmljIGluIHRoZSBzZW5zZSB0aGF0IGl0IHdpbGwgd29yayB3aXRoIGFueSBraW5kIG9mCisJCSAqICB0cmVlIChub3QganVzdCBUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisJCSAqICBub3QgdGhlIHRyZWUgbm9kZSByb3V0aW5lcyB0byBkbyB0aGUgY29uc3RydWN0aW9uLiAgCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gZHVwVHJlZVdpdGhQYXJlbnQodDpPYmplY3QsIHBhcmVudDpPYmplY3QpOk9iamVjdCB7CisJCQlpZiAoIHQ9PW51bGwgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQl2YXIgbmV3VHJlZTpPYmplY3QgPSBkdXBOb2RlKHQpOworCQkJLy8gZW5zdXJlIG5ldyBzdWJ0cmVlIHJvb3QgaGFzIHBhcmVudC9jaGlsZCBpbmRleCBzZXQKKwkJCXNldENoaWxkSW5kZXgobmV3VHJlZSwgZ2V0Q2hpbGRJbmRleCh0KSk7IC8vIHNhbWUgaW5kZXggaW4gbmV3IHRyZWUKKwkJCXNldFBhcmVudChuZXdUcmVlLCBwYXJlbnQpOworCQkJdmFyIG46aW50ID0gZ2V0Q2hpbGRDb3VudCh0KTsKKwkJCWZvciAodmFyIGk6aW50ID0gMDsgaSA8IG47IGkrKykgeworCQkJCXZhciBjaGlsZDpPYmplY3QgPSBnZXRDaGlsZCh0LCBpKTsKKwkJCQl2YXIgbmV3U3ViVHJlZTpPYmplY3QgPSBkdXBUcmVlV2l0aFBhcmVudChjaGlsZCwgdCk7CisJCQkJYWRkQ2hpbGQobmV3VHJlZSwgbmV3U3ViVHJlZSk7CisJCQl9CisJCQlyZXR1cm4gbmV3VHJlZTsKKwkJfQorCQkKKwkJLyoqIEFkZCBhIGNoaWxkIHRvIHRoZSB0cmVlIHQuICBJZiBjaGlsZCBpcyBhIGZsYXQgdHJlZSAoYSBsaXN0KSwgbWFrZSBhbGwKKwkJICogIGluIGxpc3QgY2hpbGRyZW4gb2YgdC4gIFdhcm5pbmc6IGlmIHQgaGFzIG5vIGNoaWxkcmVuLCBidXQgY2hpbGQgZG9lcworCQkgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorCQkgKiAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LiAgSnVzdAorCQkgKiAgbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggaGF2ZSB0aGUgdXNlciB3aWxsIGJ1aWxkCisJCSAqICBBU1RzLgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGFkZENoaWxkKHQ6T2JqZWN0LCBjaGlsZDpPYmplY3QpOnZvaWQgeworCQkJaWYgKCB0IT1udWxsICYmIGNoaWxkIT1udWxsICkgeworCQkJCVRyZWUodCkuYWRkQ2hpbGQoVHJlZShjaGlsZCkpOworCQkJfQorCQl9CisJCisJCS8qKiBJZiBvbGRSb290IGlzIGEgbmlsIHJvb3QsIGp1c3QgY29weSBvciBtb3ZlIHRoZSBjaGlsZHJlbiB0byBuZXdSb290LgorCQkgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisJCSAqCisJCSAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1yIHlpZWxkcyBeKHIgYSBiIGMpCisJCSAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKwkJICoKKwkJICogIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorCQkgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisJCSAqCisJCSAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIGEgYiBjKQorCQkgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorCQkgKgorCQkgKiAgSWYgb2xkUm9vdCB3YXMgbnVsbCwgaXQncyBvaywganVzdCByZXR1cm4gbmV3Um9vdCAoZXZlbiBpZiBpc05pbCkuCisJCSAqCisJCSAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorCQkgKiAgICBvbGQ9bnVsbCwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKG5pbCByKQorCQkgKgorCQkgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorCQkgKiAgc2ltcGxlIG5vZGUgb3IgbmlsIHJvb3Qgd2l0aCBhIHNpbmdsZSBjaGlsZCBub2RlLS1pdCBtdXN0IGJlIGEgcm9vdAorCQkgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKwkJICoKKwkJICogIEJlIGFkdmlzZWQgdGhhdCBpdCdzIG9rIGZvciBuZXdSb290IHRvIHBvaW50IGF0IG9sZFJvb3QncworCQkgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKwkJICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisJCSAqICBlZmZpY2llbmN5LgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGJlY29tZVJvb3QobmV3Um9vdDpPYmplY3QsIG9sZFJvb3Q6T2JqZWN0KTpPYmplY3QgewkJCQorCQkJLy8gSWYgbmV3IFJvb3QgaXMgdG9rZW4sIHRoZW4gY3JlYXRlIGEgVHJlZS4KKwkJCWlmIChuZXdSb290IGlzIFRva2VuKSB7CisJCQkJbmV3Um9vdCA9IGNyZWF0ZVdpdGhQYXlsb2FkKFRva2VuKG5ld1Jvb3QpKTsKKwkJCX0KKworCQkJdmFyIG5ld1Jvb3RUcmVlOlRyZWUgPSBUcmVlKG5ld1Jvb3QpOworCQkJdmFyIG9sZFJvb3RUcmVlOlRyZWUgPSBUcmVlKG9sZFJvb3QpOworCQkJaWYgKCBvbGRSb290PT1udWxsICkgeworCQkJCXJldHVybiBuZXdSb290OworCQkJfQorCQkJLy8gaGFuZGxlIF4obmlsIHJlYWwtbm9kZSkKKwkJCWlmICggbmV3Um9vdFRyZWUuaXNOaWwgKSB7CisJCQkJdmFyIG5jOmludCA9IG5ld1Jvb3RUcmVlLmNoaWxkQ291bnQ7CisJICAgICAgICAgICAgaWYgKCBuYz09MSApIG5ld1Jvb3RUcmVlID0gVHJlZShuZXdSb290VHJlZS5nZXRDaGlsZCgwKSk7CisJICAgICAgICAgICAgZWxzZSBpZiAoIG5jID4xICkgeworCQkJCQkvLyBUT0RPOiBtYWtlIHRyZWUgcnVuIHRpbWUgZXhjZXB0aW9ucyBoaWVyYXJjaHkKKwkJCQkJdGhyb3cgbmV3IEVycm9yKCJtb3JlIHRoYW4gb25lIG5vZGUgYXMgcm9vdCAoVE9ETzogbWFrZSBleGNlcHRpb24gaGllcmFyY2h5KSIpOworCQkJCX0KKwkJCX0KKwkJCS8vIGFkZCBvbGRSb290IHRvIG5ld1Jvb3Q7IGFkZENoaWxkIHRha2VzIGNhcmUgb2YgY2FzZSB3aGVyZSBvbGRSb290CisJCQkvLyBpcyBhIGZsYXQgbGlzdCAoaS5lLiwgbmlsLXJvb3RlZCB0cmVlKS4gIEFsbCBjaGlsZHJlbiBvZiBvbGRSb290CisJCQkvLyBhcmUgYWRkZWQgdG8gbmV3Um9vdC4KKwkJCW5ld1Jvb3RUcmVlLmFkZENoaWxkKG9sZFJvb3RUcmVlKTsKKwkJCXJldHVybiBuZXdSb290VHJlZTsKKwkJfQorCQorCQkvKiogVHJhbnNmb3JtIF4obmlsIHgpIHRvIHggYW5kIG5pbCB0byBudWxsICovCisJCXB1YmxpYyBmdW5jdGlvbiBydWxlUG9zdFByb2Nlc3Npbmcocm9vdDpPYmplY3QpOk9iamVjdCB7CisJCQl2YXIgcjpUcmVlID0gVHJlZShyb290KTsKKwkJCWlmICggciE9bnVsbCAmJiByLmlzTmlsICkgeworCQkJCWlmICggci5jaGlsZENvdW50PT0wICkgeworCQkJCQlyID0gbnVsbDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIHIuY2hpbGRDb3VudD09MSApIHsKKwkJCQkJciA9IFRyZWUoci5nZXRDaGlsZCgwKSk7CisJCQkJCS8vIHdob2V2ZXIgaW52b2tlcyBydWxlIHdpbGwgc2V0IHBhcmVudCBhbmQgY2hpbGQgaW5kZXgKKwkJCQkJci5wYXJlbnQgPSBudWxsOworCQkJCQlyLmNoaWxkSW5kZXggPSAtMTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcjsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlRnJvbVRva2VuKHRva2VuVHlwZTppbnQsIGZyb21Ub2tlbjpUb2tlbiwgdGV4dDpTdHJpbmcgPSBudWxsKTpPYmplY3QgeworCQkJZnJvbVRva2VuID0gY3JlYXRlVG9rZW4oZnJvbVRva2VuKTsKKwkJCWZyb21Ub2tlbi50eXBlID0gdG9rZW5UeXBlOworCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCWZyb21Ub2tlbi50ZXh0ID0gdGV4dDsKKwkJCX0KKwkJCXJldHVybiBjcmVhdGVXaXRoUGF5bG9hZChmcm9tVG9rZW4pOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVGcm9tVHlwZSh0b2tlblR5cGU6aW50LCB0ZXh0OlN0cmluZyk6T2JqZWN0IHsKKwkJCXZhciBmcm9tVG9rZW46VG9rZW4gPSBjcmVhdGVUb2tlbkZyb21UeXBlKHRva2VuVHlwZSwgdGV4dCk7CisJCQlyZXR1cm4gY3JlYXRlV2l0aFBheWxvYWQoZnJvbVRva2VuKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSh0Ok9iamVjdCk6aW50IHsKKwkJCXJldHVybiBUcmVlKHQpLnR5cGU7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHNldFR5cGUodDpPYmplY3QsIHR5cGU6aW50KTp2b2lkIHsKKwkJCXRocm93IG5ldyBFcnJvcigiZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgVHJlZSBub2RlIik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGdldFRleHQodDpPYmplY3QpOlN0cmluZyB7CisJCQlyZXR1cm4gVHJlZSh0KS50ZXh0OworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXRUZXh0KHQ6T2JqZWN0LCB0ZXh0OlN0cmluZyk6dm9pZCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoImRvbid0IGtub3cgZW5vdWdoIGFib3V0IFRyZWUgbm9kZSIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZCh0Ok9iamVjdCwgaTppbnQpOk9iamVjdCB7CisJCQlyZXR1cm4gVHJlZSh0KS5nZXRDaGlsZChpKTsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBzZXRDaGlsZCh0Ok9iamVjdCwgaTppbnQsIGNoaWxkOk9iamVjdCk6dm9pZCB7CisJCQlUcmVlKHQpLnNldENoaWxkKGksIFRyZWUoY2hpbGQpKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZGVsZXRlQ2hpbGQodDpPYmplY3QsIGk6aW50KTpPYmplY3QgeworCQkJcmV0dXJuIFRyZWUodCkuZGVsZXRlQ2hpbGQoaSk7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZENvdW50KHQ6T2JqZWN0KTppbnQgeworCQkJcmV0dXJuIFRyZWUodCkuY2hpbGRDb3VudDsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VW5pcXVlSUQobm9kZTpPYmplY3QpOmludCB7CisJCQlpZiAoIHRyZWVUb1VuaXF1ZUlETWFwPT1udWxsICkgeworCQkJCSB0cmVlVG9VbmlxdWVJRE1hcCA9IG5ldyBEaWN0aW9uYXJ5KCk7CisJCQl9CisJCQlpZiAodHJlZVRvVW5pcXVlSURNYXAuaGFzT3duUHJvcGVydHkobm9kZSkpIHsKKwkJCQlyZXR1cm4gdHJlZVRvVW5pcXVlSURNYXBbbm9kZV07CisJCQl9CisKKwkJCXZhciBJRDppbnQgPSB1bmlxdWVOb2RlSUQ7CisJCQl0cmVlVG9VbmlxdWVJRE1hcFtub2RlXSA9IElEOworCQkJdW5pcXVlTm9kZUlEKys7CisJCQlyZXR1cm4gSUQ7CisKKwkJfQorCQorCQkvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKwkJICogIEZvciBleGFtcGxlLCB0aGVyZSBpcyBwcm9iYWJseSBubyBpbnB1dCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGltYWdpbmFyeQorCQkgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisJCSAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKwkJICoKKwkJICogIElmIHlvdSBjYXJlIHdoYXQgdGhlIHRva2VuIHBheWxvYWQgb2JqZWN0cycgdHlwZSBpcywgeW91IHNob3VsZAorCQkgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVRva2VuRnJvbVR5cGUodG9rZW5UeXBlOmludCwgdGV4dDpTdHJpbmcpOlRva2VuIHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIC0gYWJzdHJhY3QgZnVuY3Rpb24iKTsKKwkJfQorCQorCQkvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKwkJICogIEZvciBleGFtcGxlLCB0aGVyZSBpcyBwcm9iYWJseSBubyBpbnB1dCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGltYWdpbmFyeQorCQkgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisJCSAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKwkJICoKKwkJICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisJCSAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworCQkgKiAgdG9rZW5zIHRvIEJMT0NLIGV0Yy4uLiAgWW91J2xsIHNlZQorCQkgKgorCQkgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworCQkgKgorCQkgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisJCSAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisJCSAqIAorCQkgKi8KKwkJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVRva2VuKGZyb21Ub2tlbjpUb2tlbik6VG9rZW4geworCQkJdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQgLSBhYnN0cmFjdCBmdW5jdGlvbiIpOworCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlV2l0aFBheWxvYWQocGF5bG9hZDpUb2tlbik6T2JqZWN0IHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIC0gYWJzdHJhY3QgZnVuY3Rpb24iKTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGR1cE5vZGUodDpPYmplY3QpOk9iamVjdCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCAtIGFic3RyYWN0IGZ1bmN0aW9uIik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGdldFRva2VuKHQ6T2JqZWN0KTpUb2tlbiB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCAtIGFic3RyYWN0IGZ1bmN0aW9uIik7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHNldFRva2VuQm91bmRhcmllcyh0Ok9iamVjdCwgc3RhcnRUb2tlbjpUb2tlbiwgc3RvcFRva2VuOlRva2VuKTp2b2lkIHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIC0gYWJzdHJhY3QgZnVuY3Rpb24iKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW5TdGFydEluZGV4KHQ6T2JqZWN0KTppbnQgeworCQkJdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQgLSBhYnN0cmFjdCBmdW5jdGlvbiIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlblN0b3BJbmRleCh0Ok9iamVjdCk6aW50IHsKKwkJCXRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIC0gYWJzdHJhY3QgZnVuY3Rpb24iKTsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiBnZXRQYXJlbnQodDpPYmplY3QpOk9iamVjdCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCAtIGFic3RyYWN0IGZ1bmN0aW9uIik7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXRQYXJlbnQodDpPYmplY3QsIHBhcmVudDpPYmplY3QpOnZvaWQgeworCQkJdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQgLSBhYnN0cmFjdCBmdW5jdGlvbiIpOworCQl9CisKKwkJcHVibGljIGZ1bmN0aW9uIGdldENoaWxkSW5kZXgodDpPYmplY3QpOmludCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCAtIGFic3RyYWN0IGZ1bmN0aW9uIik7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXRDaGlsZEluZGV4KHQ6T2JqZWN0LCBpbmRleDppbnQpOnZvaWQgeworCQkJdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQgLSBhYnN0cmFjdCBmdW5jdGlvbiIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiByZXBsYWNlQ2hpbGRyZW4ocGFyZW50Ok9iamVjdCwgc3RhcnRDaGlsZEluZGV4OmludCwgc3RvcENoaWxkSW5kZXg6aW50LCB0Ok9iamVjdCk6dm9pZCB7CisJCQl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCAtIGFic3RyYWN0IGZ1bmN0aW9uIik7CisJCX0JCisJCQorCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKC4uLiBhcmdzKTpPYmplY3QgeworCQkJaWYgKGFyZ3MubGVuZ3RoID09IDEgJiYgYXJnc1swXSBpcyBUb2tlbikgeworCQkJCXJldHVybiBjcmVhdGVXaXRoUGF5bG9hZChhcmdzWzBdKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIgJiYKKwkJCQkJIGFyZ3NbMF0gaXMgaW50ICYmCisJCQkJCSBhcmdzWzFdIGlzIFRva2VuKSB7CisJCQkgCXJldHVybiBjcmVhdGVGcm9tVG9rZW4oYXJnc1swXSwgYXJnc1sxXSk7CisJCSAJfQorCQkJZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMyAmJgorCQkJCQkgYXJnc1swXSBpcyBpbnQgJiYKKwkJCQkJIGFyZ3NbMV0gaXMgVG9rZW4gJiYKKwkJCQkJIGFyZ3NbMl0gaXMgU3RyaW5nKSB7CisJCQkgCXJldHVybiBjcmVhdGVGcm9tVG9rZW4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJCQl9CisJCQllbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAyICYmCisJCQkJCSBhcmdzWzBdIGlzIGludCAmJgorCQkJCQkgYXJnc1sxXSBpcyBTdHJpbmcpIHsKKwkJCSAJcmV0dXJuIGNyZWF0ZUZyb21UeXBlKGFyZ3NbMF0sIGFyZ3NbMV0pOworCQkJfSAJCQkJCSAKKwkJCXRocm93IG5ldyBFcnJvcigiTm8gbWV0aG9kcyBzaWduYXR1cmUgZm9yIGFyZ3VtZW50cyA6ICIgKyBPYmplY3RVdGlsLnRvU3RyaW5nKGFyZ3MpKTsKKwkJfQorCX0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWI4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25FcnJvck5vZGUuYXMKQEAgLTAsMCArMSw4NCBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlCit7CisgICAgCisgICAgaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CisgICAgCisgICAgcHVibGljIGNsYXNzIENvbW1vbkVycm9yTm9kZSBleHRlbmRzIENvbW1vblRyZWUgeworICAgIAorICAgIAlwdWJsaWMgdmFyIGlucHV0OkludFN0cmVhbTsKKyAgICAJcHVibGljIHZhciBzdGFydDpUb2tlbjsKKyAgICAJcHVibGljIHZhciBzdG9wOlRva2VuOworICAgIAlwdWJsaWMgdmFyIHRyYXBwZWRFeGNlcHRpb246UmVjb2duaXRpb25FeGNlcHRpb247CisgICAgCisgICAgCXB1YmxpYyBmdW5jdGlvbiBDb21tb25FcnJvck5vZGUoaW5wdXQ6VG9rZW5TdHJlYW0sIHN0YXJ0OlRva2VuLCBzdG9wOlRva2VuLAorICAgIAkJCQkJCSAgIGU6UmVjb2duaXRpb25FeGNlcHRpb24pCisgICAgCXsKKyAgICAJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdGFydDogIitzdGFydCsiLCBzdG9wOiAiK3N0b3ApOworICAgIAkJaWYgKCBzdG9wPT1udWxsIHx8CisgICAgCQkJIChzdG9wLnRva2VuSW5kZXggPCBzdGFydC50b2tlbkluZGV4ICYmCisgICAgCQkJICBzdG9wLnR5cGUhPVRva2VuQ29uc3RhbnRzLkVPRikgKQorICAgIAkJeworICAgIAkJCS8vIHNvbWV0aW1lcyByZXN5bmMgZG9lcyBub3QgY29uc3VtZSBhIHRva2VuICh3aGVuIExUKDEpIGlzCisgICAgCQkJLy8gaW4gZm9sbG93IHNldC4gIFNvLCBzdG9wIHdpbGwgYmUgMSB0byBsZWZ0IHRvIHN0YXJ0LiBhZGp1c3QuCisgICAgCQkJLy8gQWxzbyBoYW5kbGUgY2FzZSB3aGVyZSBzdGFydCBpcyB0aGUgZmlyc3QgdG9rZW4gYW5kIG5vIHRva2VuCisgICAgCQkJLy8gaXMgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5OyBMVCgtMSkgd2lsbCByZXR1cm4gbnVsbC4KKyAgICAJCQlzdG9wID0gc3RhcnQ7CisgICAgCQl9CisgICAgCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgCQl0aGlzLnN0b3AgPSBzdG9wOworICAgIAkJdGhpcy50cmFwcGVkRXhjZXB0aW9uID0gZTsKKyAgICAJfQorICAgIAorICAgIAlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IGlzTmlsKCk6Qm9vbGVhbiB7CisgICAgCQlyZXR1cm4gZmFsc2U7CisgICAgCX0KKyAgICAKKyAgICAJcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTppbnQgeworICAgIAkJcmV0dXJuIFRva2VuQ29uc3RhbnRzLklOVkFMSURfVE9LRU5fVFlQRTsKKyAgICAJfQorICAgIAorICAgIAlwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dCgpOlN0cmluZyB7CisgICAgCQl2YXIgYmFkVGV4dDpTdHJpbmcgPSBudWxsOworICAgIAkJaWYgKCBzdGFydCBpcyBUb2tlbiApIHsKKyAgICAJCQl2YXIgaTppbnQgPSBUb2tlbihzdGFydCkudG9rZW5JbmRleDsKKyAgICAJCQl2YXIgajppbnQgPSBUb2tlbihzdG9wKS50b2tlbkluZGV4OworICAgIAkJCWlmICggVG9rZW4oc3RvcCkudHlwZSA9PSBUb2tlbkNvbnN0YW50cy5FT0YgKSB7CisgICAgCQkJCWogPSBUb2tlblN0cmVhbShpbnB1dCkuc2l6ZTsKKyAgICAJCQl9CisgICAgCQkJYmFkVGV4dCA9IFRva2VuU3RyZWFtKGlucHV0KS50b1N0cmluZ1dpdGhSYW5nZShpLCBqKTsKKyAgICAJCX0KKyAgICAJCWVsc2UgaWYgKCBzdGFydCBpcyBUcmVlICkgeworICAgIAkJCWJhZFRleHQgPSBUcmVlTm9kZVN0cmVhbShpbnB1dCkudG9TdHJpbmdXaXRoUmFuZ2Uoc3RhcnQsIHN0b3ApOworICAgIAkJfQorICAgIAkJZWxzZSB7CisgICAgCQkJLy8gcGVvcGxlIHNob3VsZCBzdWJjbGFzcyBpZiB0aGV5IGFsdGVyIHRoZSB0cmVlIHR5cGUgc28gdGhpcworICAgIAkJCS8vIG5leHQgb25lIGlzIGZvciBzdXJlIGNvcnJlY3QuCisgICAgCQkJYmFkVGV4dCA9ICI8dW5rbm93bj4iOworICAgIAkJfQorICAgIAkJcmV0dXJuIGJhZFRleHQ7CisgICAgCX0KKyAgICAKKyAgICAJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsKKyAgICAJCWlmICggdHJhcHBlZEV4Y2VwdGlvbiBpcyBNaXNzaW5nVG9rZW5FeGNlcHRpb24gKSB7CisgICAgCQkJcmV0dXJuICI8bWlzc2luZyB0eXBlOiAiKworICAgIAkJCQkgICBNaXNzaW5nVG9rZW5FeGNlcHRpb24odHJhcHBlZEV4Y2VwdGlvbikubWlzc2luZ1R5cGUrCisgICAgCQkJCSAgICI+IjsKKyAgICAJCX0KKyAgICAJCWVsc2UgaWYgKCB0cmFwcGVkRXhjZXB0aW9uIGlzIFVud2FudGVkVG9rZW5FeGNlcHRpb24gKSB7CisgICAgCQkJcmV0dXJuICI8ZXh0cmFuZW91czogIisKKyAgICAJCQkJICAgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbih0cmFwcGVkRXhjZXB0aW9uKS51bmV4cGVjdGVkVG9rZW4rCisgICAgCQkJCSAgICIsIHJlc3luYz0iK2dldFRleHQoKSsiPiI7CisgICAgCQl9CisgICAgCQllbHNlIGlmICggdHJhcHBlZEV4Y2VwdGlvbiBpcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKSB7CisgICAgCQkJcmV0dXJuICI8bWlzbWF0Y2hlZCB0b2tlbjogIit0cmFwcGVkRXhjZXB0aW9uLnRva2VuKyIsIHJlc3luYz0iK2dldFRleHQoKSsiPiI7CisgICAgCQl9CisgICAgCQllbHNlIGlmICggdHJhcHBlZEV4Y2VwdGlvbiBpcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApIHsKKyAgICAJCQlyZXR1cm4gIjx1bmV4cGVjdGVkOiAiK3RyYXBwZWRFeGNlcHRpb24udG9rZW4rCisgICAgCQkJCSAgICIsIHJlc3luYz0iK2dldFRleHQoKSsiPiI7CisgICAgCQl9CisgICAgCQlyZXR1cm4gIjxlcnJvcjogIitnZXRUZXh0KCkrIj4iOworICAgIAl9CisgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWUuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTQyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlLmFzCkBAIC0wLDAgKzEsMTY2IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbkNvbnN0YW50czsKKwkKKwkvKiogQSB0cmVlIG5vZGUgdGhhdCBpcyB3cmFwcGVyIGZvciBhIFRva2VuIG9iamVjdC4gIEFmdGVyIDMuMCByZWxlYXNlCisJICogIHdoaWxlIGJ1aWxkaW5nIHRyZWUgcmV3cml0ZSBzdHVmZiwgaXQgYmVjYW1lIGNsZWFyIHRoYXQgY29tcHV0aW5nCisJICogIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggaXMgdmVyeSBkaWZmaWN1bHQgYW5kIGN1bWJlcnNvbWUuICBCZXR0ZXIgdG8KKwkgKiAgc3BlbmQgdGhlIHNwYWNlIGluIGV2ZXJ5IHRyZWUgbm9kZS4gIElmIHlvdSBkb24ndCB3YW50IHRoZXNlIGV4dHJhCisJICogIGZpZWxkcywgaXQncyBlYXN5IHRvIGN1dCB0aGVtIG91dCBpbiB5b3VyIG93biBCYXNlVHJlZSBzdWJjbGFzcy4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgQ29tbW9uVHJlZSBleHRlbmRzIEJhc2VUcmVlIHsKKwkJLyoqIEEgc2luZ2xlIHRva2VuIGlzIHRoZSBwYXlsb2FkICovCisJCXByb3RlY3RlZCB2YXIgX3Rva2VuOlRva2VuOworCQkKKwkJLyoqIFdoYXQgdG9rZW4gaW5kZXhlcyBicmFja2V0IGFsbCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZQorCQkgKiAgYW5kIGJlbG93PworCQkgKi8KKwkJcHVibGljIHZhciBzdGFydEluZGV4OmludD0tMSwgc3RvcEluZGV4OmludD0tMTsKKwkKKwkJLyoqIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdCAqLworCQlwcm90ZWN0ZWQgdmFyIF9wYXJlbnQ6Q29tbW9uVHJlZTsKKwkKKwkJLyoqIFdoYXQgaW5kZXggaXMgdGhpcyBub2RlIGluIHRoZSBjaGlsZCBsaXN0PyBSYW5nZTogMC4ubi0xICovCisJCXByb3RlY3RlZCB2YXIgX2NoaWxkSW5kZXg6aW50ID0gLTE7CisJCQkKKwkJcHVibGljIGZ1bmN0aW9uIENvbW1vblRyZWUobm9kZTpDb21tb25UcmVlID0gbnVsbCkgeworCQkJaWYgKG5vZGUgIT0gbnVsbCkgeworCQkJCXN1cGVyKG5vZGUpOworCQkJCXRoaXMuX3Rva2VuID0gbm9kZS5fdG9rZW47CisJCQkJdGhpcy5zdGFydEluZGV4ID0gbm9kZS5zdGFydEluZGV4OworCQkJCXRoaXMuc3RvcEluZGV4ID0gbm9kZS5zdG9wSW5kZXg7CisJCQl9CisJCX0KKwkKKwkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tVG9rZW4odDpUb2tlbik6Q29tbW9uVHJlZSB7CisJCQl2YXIgY3Q6Q29tbW9uVHJlZSA9IG5ldyBDb21tb25UcmVlKCk7CisJCQljdC5fdG9rZW4gPSB0OworCQkJcmV0dXJuIGN0OworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdG9rZW4oKTpUb2tlbiB7CisJCQlyZXR1cm4gX3Rva2VuOworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBkdXBOb2RlKCk6VHJlZSB7CisJCQlyZXR1cm4gbmV3IENvbW1vblRyZWUodGhpcyk7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCBpc05pbCgpOkJvb2xlYW4geworCQkJcmV0dXJuIF90b2tlbj09bnVsbDsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHR5cGUoKTppbnQgeworCQkJaWYgKCBfdG9rZW49PW51bGwgKSB7CisJCQkJcmV0dXJuIFRva2VuQ29uc3RhbnRzLklOVkFMSURfVE9LRU5fVFlQRTsKKwkJCX0KKwkJCXJldHVybiBfdG9rZW4udHlwZTsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHRleHQoKTpTdHJpbmcgeworCQkJaWYgKCBfdG9rZW49PW51bGwgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gX3Rva2VuLnRleHQ7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCBsaW5lKCk6aW50IHsKKwkJCWlmICggX3Rva2VuPT1udWxsIHx8IF90b2tlbi5saW5lPT0wICkgeworCQkJCWlmICggY2hpbGRDb3VudCA+MCApIHsKKwkJCQkJcmV0dXJuIGdldENoaWxkKDApLmxpbmU7CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIF90b2tlbi5saW5lOworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgY2hhclBvc2l0aW9uSW5MaW5lKCk6aW50IHsKKwkJCWlmICggX3Rva2VuPT1udWxsIHx8IF90b2tlbi5jaGFyUG9zaXRpb25JbkxpbmU9PS0xICkgeworCQkJCWlmICggY2hpbGRDb3VudD4wICkgeworCQkJCQlyZXR1cm4gZ2V0Q2hpbGQoMCkuY2hhclBvc2l0aW9uSW5MaW5lOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiBfdG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lOworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgdG9rZW5TdGFydEluZGV4KCk6aW50IHsKKwkJCWlmICggc3RhcnRJbmRleD09LTEgJiYgX3Rva2VuIT1udWxsICkgeworCQkJCXJldHVybiBfdG9rZW4udG9rZW5JbmRleDsKKwkJCX0KKwkJCXJldHVybiBzdGFydEluZGV4OworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBzZXQgdG9rZW5TdGFydEluZGV4KGluZGV4OmludCk6dm9pZCB7CisJCQlzdGFydEluZGV4ID0gaW5kZXg7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCB0b2tlblN0b3BJbmRleCgpOmludCB7CisJCQlpZiAoIHN0b3BJbmRleD09LTEgJiYgX3Rva2VuIT1udWxsICkgeworCQkJCXJldHVybiBfdG9rZW4udG9rZW5JbmRleDsKKwkJCX0KKwkJCXJldHVybiBzdG9wSW5kZXg7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHNldCB0b2tlblN0b3BJbmRleChpbmRleDppbnQpOnZvaWQgeworCQkJc3RvcEluZGV4ID0gaW5kZXg7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IGNoaWxkSW5kZXgoKTppbnQgeworCQkJcmV0dXJuIF9jaGlsZEluZGV4OworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgcGFyZW50KCk6VHJlZSB7CisJCQlyZXR1cm4gX3BhcmVudDsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gc2V0IHBhcmVudCh0OlRyZWUpOnZvaWQgeworCQkJdGhpcy5fcGFyZW50ID0gQ29tbW9uVHJlZSh0KTsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gc2V0IGNoaWxkSW5kZXgoaW5kZXg6aW50KTp2b2lkIHsKKwkJCXRoaXMuX2NoaWxkSW5kZXggPSBpbmRleDsKKwkJfQorCisJCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCQlpZiAoIGlzTmlsICkgeworCQkJCXJldHVybiAibmlsIjsKKwkJCX0KKwkJCWlmICggdHlwZT09VG9rZW5Db25zdGFudHMuSU5WQUxJRF9UT0tFTl9UWVBFICkgeworICAgIAkJCXJldHVybiAiPGVycm9ybm9kZT4iOworICAgIAkJfQorICAgIAkJaWYgKCB0b2tlbj09bnVsbCApIHsKKyAgICAJCQlyZXR1cm4gbnVsbDsKKyAgICAJCX0KKwkJCXJldHVybiBfdG9rZW4udGV4dDsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlQWRhcHRvci5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODlmYzNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuYXMKQEAgLTAsMCArMSwxNzIgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKKwlpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5Db25zdGFudHM7CisJCisJLyoqIEEgVHJlZUFkYXB0b3IgdGhhdCB3b3JrcyB3aXRoIGFueSBUcmVlIGltcGxlbWVudGF0aW9uLiAgSXQgcHJvdmlkZXMKKwkgKiAgcmVhbGx5IGp1c3QgZmFjdG9yeSBtZXRob2RzOyBhbGwgdGhlIHdvcmsgaXMgZG9uZSBieSBCYXNlVHJlZUFkYXB0b3IuCisJICogIElmIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgZGlmZmVyZW50IHRva2VucyBjcmVhdGVkIHRoYW4gQ2xhc3NpY1Rva2VuCisJICogIG9iamVjdHMsIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgYW5kIHRoZW4gc2V0IHRoZSBwYXJzZXIgdHJlZSBhZGFwdG9yIHRvCisJICogIHVzZSB5b3VyIHN1YmNsYXNzLgorCSAqCisJICogIFRvIGdldCB5b3VyIHBhcnNlciB0byBidWlsZCBub2RlcyBvZiBhIGRpZmZlcmVudCB0eXBlLCBvdmVycmlkZQorICAgICAqICBjcmVhdGUoVG9rZW4pLCBlcnJvck5vZGUoKSwgYW5kIHRvIGJlIHNhZmUsIFlvdXJUcmVlQ2xhc3MuZHVwTm9kZSgpLgorICAgICAqICBkdXBOb2RlIGlzIGNhbGxlZCB0byBkdXBsaWNhdGUgbm9kZXMgZHVyaW5nIHJld3JpdGUgb3BlcmF0aW9ucy4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgQ29tbW9uVHJlZUFkYXB0b3IgZXh0ZW5kcyBCYXNlVHJlZUFkYXB0b3IgeworCQkvKiogRHVwbGljYXRlIGEgbm9kZS4gIFRoaXMgaXMgcGFydCBvZiB0aGUgZmFjdG9yeTsKKwkJICoJb3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuCisJCSAqCisJCSAqICBJIGNvdWxkIHVzZSByZWZsZWN0aW9uIHRvIHByZXZlbnQgaGF2aW5nIHRvIG92ZXJyaWRlIHRoaXMKKwkJICogIGJ1dCByZWZsZWN0aW9uIGlzIHNsb3cuCisJCSAqLworCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZHVwTm9kZSh0Ok9iamVjdCk6T2JqZWN0IHsKKwkJCWlmICggdD09bnVsbCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiAoVHJlZSh0KSkuZHVwTm9kZSgpOworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjcmVhdGVXaXRoUGF5bG9hZChwYXlsb2FkOlRva2VuKTpPYmplY3QgeworCQkJcmV0dXJuIENvbW1vblRyZWUuY3JlYXRlRnJvbVRva2VuKHBheWxvYWQpOworCQl9CisJCisJCS8qKiBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorCQkgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisJCSAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKwkJICogIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorCQkgKgorCQkgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisJCSAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisJCSAqLworCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY3JlYXRlVG9rZW5Gcm9tVHlwZSh0b2tlblR5cGU6aW50LCB0ZXh0OlN0cmluZyk6VG9rZW4geworCQkJcmV0dXJuIG5ldyBDb21tb25Ub2tlbih0b2tlblR5cGUsIHRleHQpOworCQl9CisJCisJCS8qKiBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorCQkgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisJCSAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKwkJICogIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorCQkgKgorCQkgKiAgVGhpcyBpcyBhIHZhcmlhbnQgb2YgY3JlYXRlVG9rZW4gd2hlcmUgdGhlIG5ldyB0b2tlbiBpcyBkZXJpdmVkIGZyb20KKwkJICogIGFuIGFjdHVhbCByZWFsIGlucHV0IHRva2VuLiAgVHlwaWNhbGx5IHRoaXMgaXMgZm9yIGNvbnZlcnRpbmcgJ3snCisJCSAqICB0b2tlbnMgdG8gQkxPQ0sgZXRjLi4uICBZb3UnbGwgc2VlCisJCSAqCisJCSAqICAgIHIgOiBsYz0neycgSUQrICd9JyAtPiBeKEJMT0NLWyRsY10gSUQrKSA7CisJCSAqCisJCSAqICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKwkJICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnkgb3RoZXIgY3JlYXRlVG9rZW4gdmFyaWFudC4KKwkJICovCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjcmVhdGVUb2tlbihmcm9tVG9rZW46VG9rZW4pOlRva2VuIHsKKwkJCXJldHVybiBDb21tb25Ub2tlbi5jbG9uZVRva2VuKGZyb21Ub2tlbik7CisJCX0KKwkKKwkJLyoqIFRyYWNrIHN0YXJ0L3N0b3AgdG9rZW4gZm9yIHN1YnRyZWUgcm9vdCBjcmVhdGVkIGZvciBhIHJ1bGUuCisJCSAqICBPbmx5IHdvcmtzIHdpdGggVHJlZSBub2Rlcy4gIEZvciBydWxlcyB0aGF0IG1hdGNoIG5vdGhpbmcsCisJCSAqICBzZWVtcyBsaWtlIHRoaXMgd2lsbCB5aWVsZCBzdGFydD1pIGFuZCBzdG9wPWktMSBpbiBhIG5pbCBub2RlLgorCQkgKiAgTWlnaHQgYmUgdXNlZnVsIGluZm8gc28gSSdsbCBub3QgZm9yY2UgdG8gYmUgaS4uaS4KKwkJICovCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBzZXRUb2tlbkJvdW5kYXJpZXModDpPYmplY3QsIHN0YXJ0VG9rZW46VG9rZW4sIHN0b3BUb2tlbjpUb2tlbik6dm9pZCB7CisJCQlpZiAoIHQ9PW51bGwgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdmFyIHN0YXJ0OmludCA9IDA7CisJCQl2YXIgc3RvcDppbnQgPSAwOworCQkJaWYgKCBzdGFydFRva2VuIT1udWxsICkgeworCQkJCXN0YXJ0ID0gc3RhcnRUb2tlbi50b2tlbkluZGV4OworCQkJfQorCQkJaWYgKCBzdG9wVG9rZW4hPW51bGwgKSB7CisJCQkJc3RvcCA9IHN0b3BUb2tlbi50b2tlbkluZGV4OworCQkJfQorCQkJVHJlZSh0KS50b2tlblN0YXJ0SW5kZXggPSBzdGFydDsKKwkJCVRyZWUodCkudG9rZW5TdG9wSW5kZXggPSBzdG9wOworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRUb2tlblN0YXJ0SW5kZXgodDpPYmplY3QpOmludCB7CisJCQlpZiAoIHQ9PW51bGwgKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJcmV0dXJuIFRyZWUodCkudG9rZW5TdGFydEluZGV4OworCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRUb2tlblN0b3BJbmRleCh0Ok9iamVjdCk6aW50IHsKKwkJCWlmICggdD09bnVsbCApIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlyZXR1cm4gVHJlZSh0KS50b2tlblN0b3BJbmRleDsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VGV4dCh0Ok9iamVjdCk6U3RyaW5nIHsKKwkJCWlmICggdD09bnVsbCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBUcmVlKHQpLnRleHQ7CisJCX0KKwkKKwkgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldFR5cGUodDpPYmplY3QpOmludCB7CisJCQlpZiAoIHQ9PW51bGwgKSB7CisJCQkJcmV0dXJuIFRva2VuQ29uc3RhbnRzLklOVkFMSURfVE9LRU5fVFlQRTsKKwkJCX0KKwkJCXJldHVybiBUcmVlKHQpLnR5cGU7OworCQl9CisJCisJCS8qKiBXaGF0IGlzIHRoZSBUb2tlbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlPyAgSWYKKwkJICogIHlvdSBhcmUgbm90IHVzaW5nIENvbW1vblRyZWUsIHRoZW4geW91IG11c3QKKwkJICogIG92ZXJyaWRlIHRoaXMgaW4geW91ciBvd24gYWRhcHRvci4KKwkJICovCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRUb2tlbih0Ok9iamVjdCk6VG9rZW4geworCQkJaWYgKCB0IGlzIENvbW1vblRyZWUgKSB7CisJCQkJcmV0dXJuIENvbW1vblRyZWUodCkudG9rZW47CisJCQl9CisJCQlyZXR1cm4gbnVsbDsgLy8gbm8gaWRlYSB3aGF0IHRvIGRvCisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldENoaWxkKHQ6T2JqZWN0LCBpOmludCk6T2JqZWN0IHsKKwkJCWlmICggdD09bnVsbCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkgICAgICAgIHJldHVybiBUcmVlKHQpLmdldENoaWxkKGkpOworCSAgICB9CisJCisJICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRDaGlsZENvdW50KHQ6T2JqZWN0KTppbnQgeworCQkJaWYgKCB0PT1udWxsICkgeworCQkJCXJldHVybiAwOworCQkJfQorCSAgICAgICAgcmV0dXJuIFRyZWUodCkuY2hpbGRDb3VudDsKKwkgICAgfQorCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRQYXJlbnQodDpPYmplY3QpOk9iamVjdCB7CisJCSAgICBpZiAodCA9PSBudWxsKSB7CisJCSAgICAgICAgcmV0dXJuIG51bGw7CisJCSAgICB9CisJCQlyZXR1cm4gVHJlZSh0KS5wYXJlbnQ7CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHNldFBhcmVudCh0Ok9iamVjdCwgcGFyZW50Ok9iamVjdCk6dm9pZCB7CisJCQlpZiAodCAhPSBudWxsKSB7CisJCQkgICAgIFRyZWUodCkucGFyZW50ID0gVHJlZShwYXJlbnQpOworCQkJfQorCQl9CisJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRDaGlsZEluZGV4KHQ6T2JqZWN0KTppbnQgeworCQkgICAgaWYgKHQgPT0gbnVsbCkgeworCQkgICAgICAgIHJldHVybiAwOworCQkgICAgfQorCQkJcmV0dXJuIFRyZWUodCkuY2hpbGRJbmRleDsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gc2V0Q2hpbGRJbmRleCh0Ok9iamVjdCwgaW5kZXg6aW50KTp2b2lkIHsKKwkJCWlmICh0ICE9IG51bGwpIHsKKwkJCSAgICAgVHJlZSh0KS5jaGlsZEluZGV4ID0gaW5kZXg7CisJCQl9CisJCX0KKwkKKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlcGxhY2VDaGlsZHJlbihwYXJlbnQ6T2JqZWN0LCBzdGFydENoaWxkSW5kZXg6aW50LCBzdG9wQ2hpbGRJbmRleDppbnQsIHQ6T2JqZWN0KTp2b2lkIHsKKwkJCWlmICggcGFyZW50IT1udWxsICkgeworCQkJCVRyZWUocGFyZW50KS5yZXBsYWNlQ2hpbGRyZW4oc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7CisJCQl9CisJCX0KKwkJCisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZU5vZGVTdHJlYW0uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmZDc3OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmFzCkBAIC0wLDAgKzEsNDM4IEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUgeworCisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuQ29uc3RhbnRzOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlblN0cmVhbTsKKwkKKworCS8qKiBBIGJ1ZmZlcmVkIHN0cmVhbSBvZiB0cmVlIG5vZGVzLiAgTm9kZXMgY2FuIGJlIGZyb20gYSB0cmVlIG9mIEFOWSBraW5kLgorCSAqCisJICogIFRoaXMgbm9kZSBzdHJlYW0gc3Vja3MgYWxsIG5vZGVzIG91dCBvZiB0aGUgdHJlZSBzcGVjaWZpZWQgaW4KKwkgKiAgdGhlIGNvbnN0cnVjdG9yIGR1cmluZyBjb25zdHJ1Y3Rpb24gYW5kIG1ha2VzIHBvaW50ZXJzIGludG8KKwkgKiAgdGhlIHRyZWUgdXNpbmcgYW4gYXJyYXkgb2YgT2JqZWN0IHBvaW50ZXJzLiBUaGUgc3RyZWFtIG5lY2Vzc2FyaWx5CisJICogIGluY2x1ZGVzIHBvaW50ZXJzIHRvIERPV04gYW5kIFVQIGFuZCBFT0Ygbm9kZXMuCisJICoKKwkgKiAgVGhpcyBzdHJlYW0ga25vd3MgaG93IHRvIG1hcmsvcmVsZWFzZSBmb3IgYmFja3RyYWNraW5nLgorCSAqCisJICogIFRoaXMgc3RyZWFtIGlzIG1vc3Qgc3VpdGFibGUgZm9yIHRyZWUgaW50ZXJwcmV0ZXJzIHRoYXQgbmVlZCB0bworCSAqICBqdW1wIGFyb3VuZCBhIGxvdCBvciBmb3IgdHJlZSBwYXJzZXJzIHJlcXVpcmluZyBzcGVlZCAoYXQgY29zdCBvZiBtZW1vcnkpLgorCSAqICBUaGVyZSBpcyBzb21lIGR1cGxpY2F0ZWQgZnVuY3Rpb25hbGl0eSBoZXJlIHdpdGggVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtCisJICogIGJ1dCBqdXN0IGluIGJvb2trZWVwaW5nLCBub3QgdHJlZSB3YWxraW5nIGV0Yy4uLgorCSAqCisJICogIEBzZWUgVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtCisJICovCisJcHVibGljIGNsYXNzIENvbW1vblRyZWVOb2RlU3RyZWFtIGltcGxlbWVudHMgVHJlZU5vZGVTdHJlYW0geworCQlwdWJsaWMgc3RhdGljIGNvbnN0IERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRTppbnQgPSAxMDA7CisJCXB1YmxpYyBzdGF0aWMgY29uc3QgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkU6aW50ID0gMTA7CisKKwkJLy8gYWxsIHRoZXNlIG5hdmlnYXRpb24gbm9kZXMgYXJlIHNoYXJlZCBhbmQgaGVuY2UgdGhleQorCQkvLyBjYW5ub3QgY29udGFpbiBhbnkgbGluZS9jb2x1bW4gaW5mbworCQorCQlwcm90ZWN0ZWQgdmFyIGRvd246T2JqZWN0OworCQlwcm90ZWN0ZWQgdmFyIHVwOk9iamVjdDsKKwkJcHJvdGVjdGVkIHZhciBlb2Y6T2JqZWN0OworCQorCQkvKiogVGhlIGNvbXBsZXRlIG1hcHBpbmcgZnJvbSBzdHJlYW0gaW5kZXggdG8gdHJlZSBub2RlLgorCQkgKiAgVGhpcyBidWZmZXIgaW5jbHVkZXMgcG9pbnRlcnMgdG8gRE9XTiwgVVAsIGFuZCBFT0Ygbm9kZXMuCisJCSAqICBJdCBpcyBidWlsdCB1cG9uIGN0b3IgaW52b2NhdGlvbi4gIFRoZSBlbGVtZW50cyBhcmUgdHlwZQorCQkgKiAgT2JqZWN0IGFzIHdlIGRvbid0IHdoYXQgdGhlIHRyZWVzIGxvb2sgbGlrZS4KKwkJICoKKwkJICogIExvYWQgdXBvbiBmaXJzdCBuZWVkIG9mIHRoZSBidWZmZXIgc28gd2UgY2FuIHNldCB0b2tlbiB0eXBlcworCQkgKiAgb2YgaW50ZXJlc3QgZm9yIHJldmVyc2VJbmRleGluZy4gIFNsb3dzIHVzIGRvd24gYSB3ZWUgYml0IHRvCisJCSAqICBkbyBhbGwgb2YgdGhlIGlmIHA9PS0xIHRlc3RpbmcgZXZlcnl3aGVyZSB0aG91Z2guCisJCSAqLworCQlwcm90ZWN0ZWQgdmFyIG5vZGVzOkFycmF5OworCQorCQkvKiogUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/ICovCisJCXByb3RlY3RlZCB2YXIgcm9vdDpPYmplY3Q7CisJCisJCS8qKiBJRiB0aGlzIHRyZWUgKHJvb3QpIHdhcyBjcmVhdGVkIGZyb20gYSB0b2tlbiBzdHJlYW0sIHRyYWNrIGl0LiAqLworCQlwcm90ZWN0ZWQgdmFyIHRva2VuczpUb2tlblN0cmVhbTsKKwkKKwkJLyoqIFdoYXQgdHJlZSBhZGFwdG9yIHdhcyB1c2VkIHRvIGJ1aWxkIHRoZXNlIHRyZWVzICovCisJCWludGVybmFsIHZhciBhZGFwdG9yOlRyZWVBZGFwdG9yOworCQorCQkvKiogUmV1c2Ugc2FtZSBET1dOLCBVUCBuYXZpZ2F0aW9uIG5vZGVzIHVubGVzcyB0aGlzIGlzIHRydWUgKi8KKwkJcHJvdGVjdGVkIHZhciB1bmlxdWVOYXZpZ2F0aW9uTm9kZXM6Qm9vbGVhbiA9IGZhbHNlOworCQorCQkvKiogVGhlIGluZGV4IGludG8gdGhlIG5vZGVzIGxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSAobmV4dCBub2RlCisJCSAqICB0byBjb25zdW1lKS4gIElmIC0xLCBub2RlcyBhcnJheSBub3QgZmlsbGVkIHlldC4KKwkJICovCisJCXByb3RlY3RlZCB2YXIgcDppbnQgPSAtMTsKKwkKKwkJLyoqIFRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLiAqLworCQlwcm90ZWN0ZWQgdmFyIGxhc3RNYXJrZXI6aW50OworCQorCQkvKiogU3RhY2sgb2YgaW5kZXhlcyB1c2VkIGZvciBwdXNoL3BvcCBjYWxscyAqLworCQlwcm90ZWN0ZWQgdmFyIGNhbGxzOkFycmF5OworCQorCQlwdWJsaWMgZnVuY3Rpb24gQ29tbW9uVHJlZU5vZGVTdHJlYW0odHJlZTpPYmplY3QsIGFkYXB0b3I6VHJlZUFkYXB0b3IgPSBudWxsLCBpbml0aWFsQnVmZmVyU2l6ZTppbnQgPSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUpIHsKKwkJICAgIGlmICh0cmVlID09IG51bGwpIHsKKwkJICAgICAgICAvLyByZXR1cm4gdW5pbml0YWxpemVkIGZvciBzdGF0aWMgcmVzdXNlIGZ1bmN0aW9uCisJCSAgICAgICAgcmV0dXJuOworCQkgICAgfQorCQkJdGhpcy5yb290ID0gdHJlZTsKKwkJCXRoaXMuYWRhcHRvciA9IGFkYXB0b3IgPT0gbnVsbCA/IG5ldyBDb21tb25UcmVlQWRhcHRvcigpIDogYWRhcHRvcjsKKwkJCQorCQkJbm9kZXMgPSBuZXcgQXJyYXkoKTsKKwkJCWRvd24gPSB0aGlzLmFkYXB0b3IuY3JlYXRlRnJvbVR5cGUoVG9rZW5Db25zdGFudHMuRE9XTiwgIkRPV04iKTsKKwkJCXVwID0gdGhpcy5hZGFwdG9yLmNyZWF0ZUZyb21UeXBlKFRva2VuQ29uc3RhbnRzLlVQLCAiVVAiKTsKKwkJCWVvZiA9IHRoaXMuYWRhcHRvci5jcmVhdGVGcm9tVHlwZShUb2tlbkNvbnN0YW50cy5FT0YsICJFT0YiKTsKKwkJfQorCQorICAgICAgICAvKiogUmV1c2UgYW4gZXhpc3Rpbmcgbm9kZSBzdHJlYW0ncyBidWZmZXIgb2Ygbm9kZXMuICBEbyBub3QgcG9pbnQgYXQgYQorICAgICAgICAgKiAgbm9kZSBzdHJlYW0gdGhhdCBjYW4gY2hhbmdlLiAgTXVzdCBoYXZlIHN0YXRpYyBub2RlIGxpc3QuICBzdGFydC9zdG9wCisgICAgICAgICAqICBhcmUgaW5kZXhlcyBpbnRvIHRoZSBwYXJlbnQubm9kZXMgc3RyZWFtLiAgV2UgYXZvaWQgbWFraW5nIGEgbmV3CisgICAgICAgICAqICBsaXN0IG9mIG5vZGVzIGxpa2UgdGhpcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmV1c2UocGFyZW50OkNvbW1vblRyZWVOb2RlU3RyZWFtLCBzdGFydDppbnQsIHN0b3A6aW50KTpDb21tb25UcmVlTm9kZVN0cmVhbSB7CisgICAgICAgICAgICB2YXIgc3RyZWFtOkNvbW1vblRyZWVOb2RlU3RyZWFtID0gbmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKG51bGwpOworICAgICAgICAgICAgc3RyZWFtLnJvb3QgPSBwYXJlbnQucm9vdDsKKyAgICAgICAgICAgIHN0cmVhbS5hZGFwdG9yID0gcGFyZW50LmFkYXB0b3I7CisgICAgICAgICAgICBzdHJlYW0ubm9kZXMgPSBwYXJlbnQubm9kZXMuc2xpY2Uoc3RhcnQsIHN0b3ApOworICAgICAgICAgICAgc3RyZWFtLmRvd24gPSBwYXJlbnQuZG93bjsKKyAgICAgICAgICAgIHN0cmVhbS51cCA9IHBhcmVudC51cDsKKyAgICAgICAgICAgIHN0cmVhbS5lb2YgPSBwYXJlbnQuZW9mOworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsgICAgCisgICAgICAgIH0KKyAgICAgICAgCisJCS8qKiBXYWxrIHRyZWUgd2l0aCBkZXB0aC1maXJzdC1zZWFyY2ggYW5kIGZpbGwgbm9kZXMgYnVmZmVyLgorCQkgKiAgRG9uJ3QgZG8gRE9XTiwgVVAgbm9kZXMgaWYgaXRzIGEgbGlzdCAodCBpcyBpc05pbCkuCisJCSAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZmlsbEJ1ZmZlcigpOnZvaWQgeworCQkJZmlsbEJ1ZmZlclRvKHJvb3QpOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJldkluZGV4PSIrdG9rZW5UeXBlVG9TdHJlYW1JbmRleGVzTWFwKTsKKwkJCXAgPSAwOyAvLyBidWZmZXIgb2Ygbm9kZXMgaW50aWFsaXplZCBub3cKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZmlsbEJ1ZmZlclRvKHQ6T2JqZWN0KTp2b2lkIHsKKwkJCXZhciBuaWw6Qm9vbGVhbiA9IGFkYXB0b3IuaXNOaWwodCk7CisJCQlpZiAoICFuaWwgKSB7CisJCQkJbm9kZXMucHVzaCh0KTsgLy8gYWRkIHRoaXMgbm9kZQorCQkJfQorCQkJLy8gYWRkIERPV04gbm9kZSBpZiB0IGhhcyBjaGlsZHJlbgorCQkJdmFyIG46aW50ID0gYWRhcHRvci5nZXRDaGlsZENvdW50KHQpOworCQkJaWYgKCAhbmlsICYmIG4+MCApIHsKKwkJCQlhZGROYXZpZ2F0aW9uTm9kZShUb2tlbkNvbnN0YW50cy5ET1dOKTsKKwkJCX0KKwkJCS8vIGFuZCBub3cgYWRkIGFsbCBpdHMgY2hpbGRyZW4KKwkJCWZvciAodmFyIGM6aW50PTA7IGM8bjsgYysrKSB7CisJCQkJdmFyIGNoaWxkOk9iamVjdCA9IGFkYXB0b3IuZ2V0Q2hpbGQodCxjKTsKKwkJCQlmaWxsQnVmZmVyVG8oY2hpbGQpOworCQkJfQorCQkJLy8gYWRkIFVQIG5vZGUgaWYgdCBoYXMgY2hpbGRyZW4KKwkJCWlmICggIW5pbCAmJiBuPjAgKSB7CisJCQkJYWRkTmF2aWdhdGlvbk5vZGUoVG9rZW5Db25zdGFudHMuVVApOworCQkJfQorCQl9CisJCisJCS8qKiBXaGF0IGlzIHRoZSBzdHJlYW0gaW5kZXggZm9yIG5vZGU/IDAuLm4tMQorCQkgKiAgUmV0dXJuIC0xIGlmIG5vZGUgbm90IGZvdW5kLgorCQkgKi8KKwkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE5vZGVJbmRleChub2RlOk9iamVjdCk6aW50IHsKKwkJCWlmICggcD09LTEgKSB7CisJCQkJZmlsbEJ1ZmZlcigpOworCQkJfQorCQkJZm9yICh2YXIgaTppbnQgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCQl2YXIgdDpPYmplY3QgPSBub2Rlc1tpXTsKKwkJCQlpZiAoIHQ9PT1ub2RlICkgeworCQkJCQlyZXR1cm4gaTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJCQorCQkvKiogQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorCQkgKiAgdGhlIHRyZWUgc3RydWN0dXJlLiAgV2hlbiBkZWJ1Z2dpbmcgd2UgbmVlZCB1bmlxdWUgbm9kZXMKKwkJICogIHNvIGluc3RhbnRpYXRlIG5ldyBvbmVzIHdoZW4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzIGlzIHRydWUuCisJCSAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkTmF2aWdhdGlvbk5vZGUodHR5cGU6aW50KTp2b2lkIHsKKwkJCXZhciBuYXZOb2RlOk9iamVjdCA9IG51bGw7CisJCQlpZiAoIHR0eXBlPT1Ub2tlbkNvbnN0YW50cy5ET1dOICkgeworCQkJCWlmICggaGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKSB7CisJCQkJCW5hdk5vZGUgPSBhZGFwdG9yLmNyZWF0ZUZyb21UeXBlKFRva2VuQ29uc3RhbnRzLkRPV04sICJET1dOIik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQluYXZOb2RlID0gZG93bjsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoIGhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcyApIHsKKwkJCQkJbmF2Tm9kZSA9IGFkYXB0b3IuY3JlYXRlRnJvbVR5cGUoVG9rZW5Db25zdGFudHMuVVAsICJVUCIpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbmF2Tm9kZSA9IHVwOworCQkJCX0KKwkJCX0KKwkJCW5vZGVzLnB1c2gobmF2Tm9kZSk7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIGdldE5vZGUoaTppbnQpOk9iamVjdCB7CisJCQlpZiAoIHA9PS0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCXJldHVybiBub2Rlc1tpXTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gTFQoazppbnQpOk9iamVjdCB7CisJCQlpZiAoIHA9PS0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCWlmICggaz09MCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmICggazwwICkgeworCQkJCXJldHVybiBMQigtayk7CisJCQl9CisJCQkvL1N5c3RlbS5vdXQucHJpbnQoIkxUKHA9IitwKyIsIitrKyIpPSIpOworCQkJaWYgKCAocCtrLTEpID49IG5vZGVzLmxlbmd0aCApIHsKKwkJCQlyZXR1cm4gZW9mOworCQkJfQorCQkJcmV0dXJuIG5vZGVzW3Aray0xXTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIGdldCBjdXJyZW50U3ltYm9sKCk6T2JqZWN0IHsgcmV0dXJuIExUKDEpOyB9CisJCQorCQkvKiogTG9vayBiYWNrd2FyZHMgayBub2RlcyAqLworCQlwcm90ZWN0ZWQgZnVuY3Rpb24gTEIoazppbnQpOk9iamVjdCB7CisJCQlpZiAoIGs9PTAgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlpZiAoIChwLWspPDAgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gbm9kZXNbcC1rXTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHRyZWVTb3VyY2UoKTpPYmplY3QgeworCQkJcmV0dXJuIHJvb3Q7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZyB7CisJCQlyZXR1cm4gdG9rZW5TdHJlYW0uc291cmNlTmFtZTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHRva2VuU3RyZWFtKCk6VG9rZW5TdHJlYW0geworCQkJcmV0dXJuIHRva2VuczsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gc2V0IHRva2VuU3RyZWFtKHRva2VuczpUb2tlblN0cmVhbSk6dm9pZCB7CisJCQl0aGlzLnRva2VucyA9IHRva2VuczsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHRyZWVBZGFwdG9yKCk6VHJlZUFkYXB0b3IgeworCQkJcmV0dXJuIGFkYXB0b3I7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHNldCB0cmVlQWRhcHRvcihhZGFwdG9yOlRyZWVBZGFwdG9yKTp2b2lkIHsKKwkJCXRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgaGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKCk6Qm9vbGVhbiB7CisJCQlyZXR1cm4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgaGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKHVuaXF1ZU5hdmlnYXRpb25Ob2RlczpCb29sZWFuKTp2b2lkIHsKKwkJCXRoaXMudW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gdW5pcXVlTmF2aWdhdGlvbk5vZGVzOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBjb25zdW1lKCk6dm9pZCB7CisJCQlpZiAoIHA9PS0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCXArKzsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gTEEoaTppbnQpOmludCB7CisJCQlyZXR1cm4gYWRhcHRvci5nZXRUeXBlKExUKGkpKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gbWFyaygpOmludCB7CisJCQlpZiAoIHA9PS0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCWxhc3RNYXJrZXIgPSBpbmRleDsKKwkJCXJldHVybiBsYXN0TWFya2VyOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiByZWxlYXNlKG1hcmtlcjppbnQpOnZvaWQgeworCQkJLy8gbm8gcmVzb3VyY2VzIHRvIHJlbGVhc2UKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IGluZGV4KCk6aW50IHsKKwkJCXJldHVybiBwOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiByZXdpbmRUbyhtYXJrZXI6aW50KTp2b2lkIHsKKwkJCXNlZWsobWFya2VyKTsKKwkJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gcmV3aW5kKCk6dm9pZCB7CisJCQlzZWVrKGxhc3RNYXJrZXIpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBzZWVrKGluZGV4OmludCk6dm9pZCB7CisJCQlpZiAoIHA9PS0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCXAgPSBpbmRleDsKKwkJfQorCQorCQkvKiogTWFrZSBzdHJlYW0ganVtcCB0byBhIG5ldyBsb2NhdGlvbiwgc2F2aW5nIG9sZCBsb2NhdGlvbi4KKwkJICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisJCSAqLworCQlwdWJsaWMgZnVuY3Rpb24gcHVzaChpbmRleDppbnQpOnZvaWQgeworCQkJaWYgKCBjYWxscz09bnVsbCApIHsKKwkJCQljYWxscyA9IG5ldyBBcnJheSgpOworCQkJfQorCQkJY2FsbHMucHVzaChwKTsgLy8gc2F2ZSBjdXJyZW50IGluZGV4CisJCQlzZWVrKGluZGV4KTsKKwkJfQorCQorCQkvKiogU2VlayBiYWNrIHRvIHByZXZpb3VzIGluZGV4IHNhdmVkIGR1cmluZyBsYXN0IHB1c2goKSBjYWxsLgorCQkgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBwb3AoKTppbnQgeworCQkJdmFyIHJldDppbnQgPSBjYWxscy5wb3AoKTsKKwkJCXNlZWsocmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkKKwkJcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6dm9pZCB7CisJCQlwID0gMDsKKwkJCWxhc3RNYXJrZXIgPSAwOworCSAgICAgICAgaWYgKGNhbGxzICE9IG51bGwpIHsKKwkgICAgICAgICAgICBjYWxscyA9IG5ldyBBcnJheSgpOworCSAgICAgICAgfQorCSAgICB9CisJICAgIAorCQlwdWJsaWMgZnVuY3Rpb24gZ2V0IHNpemUoKTppbnQgeworCQkJaWYgKCBwPT0tMSApIHsKKwkJCQlmaWxsQnVmZmVyKCk7CisJCQl9CisJCQlyZXR1cm4gbm9kZXMubGVuZ3RoOworCQl9CisJCisJCS8vIFRSRUUgUkVXUklURSBJTlRFUkZBQ0UKKwkJcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VDaGlsZHJlbihwYXJlbnQ6T2JqZWN0LCBzdGFydENoaWxkSW5kZXg6aW50LCBzdG9wQ2hpbGRJbmRleDppbnQsIHQ6T2JqZWN0KTp2b2lkIHsKKwkJCWlmICggcGFyZW50IT1udWxsICkgeworCQkJCWFkYXB0b3IucmVwbGFjZUNoaWxkcmVuKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7CisJCQl9CisJCX0KKworCQkvKiogVXNlZCBmb3IgdGVzdGluZywganVzdCByZXR1cm4gdGhlIHRva2VuIHR5cGUgc3RyZWFtICovCisJCXB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7CisJCQlpZiAoIHA9PS0xICkgeworCQkJCWZpbGxCdWZmZXIoKTsKKwkJCX0KKwkJCXZhciBidWY6U3RyaW5nID0gIiI7CisJCQlmb3IgKHZhciBpOmludCA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgeworCQkJCXZhciB0Ok9iamVjdCA9IG5vZGVzW2ldOworCQkJCWJ1ZiArPSAiICI7CisJCQkJYnVmICs9IChhZGFwdG9yLmdldFR5cGUodCkpOworCQkJfQorCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCQl9CisJCisgICAgCS8qKiBEZWJ1Z2dpbmcgKi8KKyAgICAJcHVibGljIGZ1bmN0aW9uIHRvVG9rZW5TdHJpbmcoc3RhcnQ6aW50LCBzdG9wOmludCk6U3RyaW5nIHsKKyAgICAJCWlmICggcD09LTEgKSB7CisgICAgCQkJZmlsbEJ1ZmZlcigpOworICAgIAkJfQorICAgIAkJdmFyIGJ1ZjpTdHJpbmcgPSAiIjsKKyAgICAJCWZvciAodmFyIGk6aW50ID0gc3RhcnQ7IGkgPCBub2Rlcy5sZW5ndGggJiYgaSA8PSBzdG9wOyBpKyspIHsKKyAgICAJCQl2YXIgdDpPYmplY3QgPSBub2Rlc1tpXTsKKyAgICAJCQlidWYgKz0gIiAiOworICAgIAkJCWJ1ZiArPSBhZGFwdG9yLmdldFRva2VuKHQpOworICAgIAkJfQorICAgIAkJcmV0dXJuIGJ1ZjsKKyAgICAJfQorCQorCQlwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmdXaXRoUmFuZ2Uoc3RhcnQ6T2JqZWN0LCBzdG9wOk9iamVjdCk6U3RyaW5nIHsKKwkJCWlmICggc3RhcnQ9PW51bGwgfHwgc3RvcD09bnVsbCApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWlmICggcD09LTEgKSB7CisJCQkJZmlsbEJ1ZmZlcigpOworCQkJfQorCQkJdHJhY2UoInN0b3A6ICIrc3RvcCk7CisJCQlpZiAoIHN0YXJ0IGlzIENvbW1vblRyZWUgKQorCQkJCXRyYWNlKCJ0b1N0cmluZzogIitDb21tb25UcmVlKHN0YXJ0KS50b2tlbisiLCAiKTsKKwkJCWVsc2UKKwkJCQl0cmFjZShzdGFydCk7CisJCQlpZiAoIHN0b3AgaXMgQ29tbW9uVHJlZSApCisJCQkJdHJhY2UoQ29tbW9uVHJlZShzdG9wKS50b2tlbik7CisJCQllbHNlCisJCQkJdHJhY2Uoc3RvcCk7CisJCQkvLyBpZiB3ZSBoYXZlIHRoZSB0b2tlbiBzdHJlYW0sIHVzZSB0aGF0IHRvIGR1bXAgdGV4dCBpbiBvcmRlcgorCQkJaWYgKCB0b2tlbnMhPW51bGwgKSB7CisJCQkJdmFyIGJlZ2luVG9rZW5JbmRleDppbnQgPSBhZGFwdG9yLmdldFRva2VuU3RhcnRJbmRleChzdGFydCk7CisJCQkJdmFyIGVuZFRva2VuSW5kZXg6aW50ID0gYWRhcHRvci5nZXRUb2tlblN0b3BJbmRleChzdG9wKTsKKwkJCQkvLyBpZiBpdCdzIGEgdHJlZSwgdXNlIHN0YXJ0L3N0b3AgaW5kZXggZnJvbSBzdGFydCBub2RlCisJCQkJLy8gZWxzZSB1c2UgdG9rZW4gcmFuZ2UgZnJvbSBzdGFydC9zdG9wIG5vZGVzCisJCQkJaWYgKCBhZGFwdG9yLmdldFR5cGUoc3RvcCk9PVRva2VuQ29uc3RhbnRzLlVQICkgeworCQkJCQllbmRUb2tlbkluZGV4ID0gYWRhcHRvci5nZXRUb2tlblN0b3BJbmRleChzdGFydCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKCBhZGFwdG9yLmdldFR5cGUoc3RvcCk9PVRva2VuQ29uc3RhbnRzLkVPRiApIHsKKwkJCQkJZW5kVG9rZW5JbmRleCA9IHNpemUtMjsgLy8gZG9uJ3QgdXNlIEVPRgorCQkJCX0KKwkJCQlyZXR1cm4gdG9rZW5zLnRvU3RyaW5nV2l0aFJhbmdlKGJlZ2luVG9rZW5JbmRleCwgZW5kVG9rZW5JbmRleCk7CisJCQl9CisJCQkvLyB3YWxrIG5vZGVzIGxvb2tpbmcgZm9yIHN0YXJ0CisJCQl2YXIgdDpPYmplY3QgPSBudWxsOworCQkJdmFyIGk6aW50ID0gMDsKKwkJCWZvciAoOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKKwkJCQl0ID0gbm9kZXNbaV07CisJCQkJaWYgKCB0PT1zdGFydCApIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gbm93IHdhbGsgdW50aWwgd2Ugc2VlIHN0b3AsIGZpbGxpbmcgc3RyaW5nIGJ1ZmZlciB3aXRoIHRleHQKKwkJCSB2YXIgYnVmOlN0cmluZyA9ICIiOworCQkJdCA9IG5vZGVzW2ldOworCQkJd2hpbGUgKCB0IT1zdG9wICkgeworCQkJCXZhciB0ZXh0OlN0cmluZyA9IGFkYXB0b3IuZ2V0VGV4dCh0KTsKKwkJCQlpZiAoIHRleHQ9PW51bGwgKSB7CisJCQkJCXRleHQgPSAiICIrIGFkYXB0b3IuZ2V0VHlwZSh0KTsKKwkJCQl9CisJCQkJYnVmICs9IHRleHQ7CisJCQkJaSsrOworCQkJCXQgPSBub2Rlc1tpXTsKKwkJCX0KKwkJCS8vIGluY2x1ZGUgc3RvcCBub2RlIHRvbworCQkJdGV4dCA9IGFkYXB0b3IuZ2V0VGV4dChzdG9wKTsKKwkJCWlmICggdGV4dD09bnVsbCApIHsKKwkJCQl0ZXh0ID0gIiAiICsgYWRhcHRvci5nZXRUeXBlKHN0b3ApOworCQkJfQorCQkJYnVmICs9IHRleHQ7CisJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5Mjc0NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDQ5IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisgICAgLyoqIEJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHRocm93biBkdXJpbmcgQVNUIHJld3JpdGUgY29uc3RydWN0aW9uLgorICAgICAqICBUaGlzIHNpZ25pZmllcyBhIGNhc2Ugd2hlcmUgdGhlIGNhcmRpbmFsaXR5IG9mIHR3byBvciBtb3JlIGVsZW1lbnRzCisgICAgICogIGluIGEgc3VicnVsZSBhcmUgZGlmZmVyZW50OiAoSUQgSU5UKSsgd2hlcmUgfElEfCE9fElOVHwKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uIGV4dGVuZHMgRXJyb3IgeworICAgICAgICAKKyAgICAgICAgcHVibGljIHZhciBlbGVtZW50RGVzY3JpcHRpb246U3RyaW5nOworCisgICAgCXB1YmxpYyBmdW5jdGlvbiBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24oZWxlbWVudERlc2NyaXB0aW9uOlN0cmluZykgeworICAgIAkgICAgc3VwZXIoZWxlbWVudERlc2NyaXB0aW9uKTsKKyAgICAJCXRoaXMuZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgIAl9CisgICAgCisgICAgCXB1YmxpYyBmdW5jdGlvbiBnZXRNZXNzYWdlKCk6U3RyaW5nIHsKKyAgICAJCWlmICggZWxlbWVudERlc2NyaXB0aW9uIT1udWxsICkgeworICAgIAkJCXJldHVybiBlbGVtZW50RGVzY3JpcHRpb247CisgICAgCQl9CisgICAgCQlyZXR1cm4gbnVsbDsKKyAgICAJfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE5MzU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDM4IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisgICAgCisgICAgLyoqIE5vIGVsZW1lbnRzIHdpdGhpbiBhICguLi4pKyBpbiBhIHJld3JpdGUgcnVsZSAqLworICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uIGV4dGVuZHMgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKGVsZW1lbnREZXNjcmlwdGlvbjpTdHJpbmcgPSBudWxsKSB7CisgICAgICAgICAgICBzdXBlcihlbGVtZW50RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlOTkwMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5hcwpAQCAtMCwwICsxLDM3IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZQoreworICAgIC8qKiBSZWYgdG8gSUQgb3IgZXhwciBidXQgbm8gdG9rZW5zIGluIElEIHN0cmVhbSBvciBzdWJ0cmVlcyBpbiBleHByIHN0cmVhbSAqLworICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24gZXh0ZW5kcyBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKGVsZW1lbnREZXNjcmlwdGlvbjpTdHJpbmcpIHsKKyAgICAgICAgICAgIHN1cGVyKGVsZW1lbnREZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzI0MmU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmFzCkBAIC0wLDAgKzEsMjAwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisgICAgCisgICAgLyoqIEEgZ2VuZXJpYyBsaXN0IG9mIGVsZW1lbnRzIHRyYWNrZWQgaW4gYW4gYWx0ZXJuYXRpdmUgdG8gYmUgdXNlZCBpbgorICAgICAqICBhIC0+IHJld3JpdGUgcnVsZS4gIFdlIG5lZWQgdG8gc3ViY2xhc3MgdG8gZmlsbCBpbiB0aGUgbmV4dCgpIG1ldGhvZCwKKyAgICAgKiAgd2hpY2ggcmV0dXJucyBlaXRoZXIgYW4gQVNUIG5vZGUgd3JhcHBlZCBhcm91bmQgYSB0b2tlbiBwYXlsb2FkIG9yCisgICAgICogIGFuIGV4aXN0aW5nIHN1YnRyZWUuCisgICAgICoKKyAgICAgKiAgT25jZSB5b3Ugc3RhcnQgbmV4dCgpaW5nLCBkbyBub3QgdHJ5IHRvIGFkZCBtb3JlIGVsZW1lbnRzLiAgSXQgd2lsbAorICAgICAqICBicmVhayB0aGUgY3Vyc29yIHRyYWNraW5nIEkgYmVsaWV2ZS4KKyAgICAgKgorICAgICAqICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtCisgICAgICogIEBzZWUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtCisgICAgICoKKyAgICAgKiAgVE9ETzogYWRkIG1lY2hhbmlzbSB0byBkZXRlY3QvcHVrZSBvbiBtb2RpZmljYXRpb24gYWZ0ZXIgcmVhZGluZyBmcm9tIHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworICAgIAkvKiogQ3Vyc29yIDAuLm4tMS4gIElmIHNpbmdsZUVsZW1lbnQhPW51bGwsIGN1cnNvciBpcyAwIHVudGlsIHlvdSBuZXh0KCksCisgICAgCSAqICB3aGljaCBidW1wcyBpdCB0byAxIG1lYW5pbmcgbm8gbW9yZSBlbGVtZW50cy4KKyAgICAJICovCisgICAgCXByb3RlY3RlZCB2YXIgY3Vyc29yOmludCA9IDA7CisgICAgCisgICAgCS8qKiBUcmFjayBzaW5nbGUgZWxlbWVudHMgdy9vIGNyZWF0aW5nIGEgbGlzdC4gIFVwb24gMm5kIGFkZCwgYWxsb2MgbGlzdCAqLworICAgIAlwcm90ZWN0ZWQgdmFyIHNpbmdsZUVsZW1lbnQ6T2JqZWN0OworICAgIAorICAgIAkvKiogVGhlIGxpc3Qgb2YgdG9rZW5zIG9yIHN1YnRyZWVzIHdlIGFyZSB0cmFja2luZyAqLworICAgIAlwcm90ZWN0ZWQgdmFyIGVsZW1lbnRzOkFycmF5OworICAgIAorICAgIAkvKiogT25jZSBhIG5vZGUgLyBzdWJ0cmVlIGhhcyBiZWVuIHVzZWQgaW4gYSBzdHJlYW0sIGl0IG11c3QgYmUgZHVwJ2QKKyAgICAJICogIGZyb20gdGhlbiBvbi4gIFN0cmVhbXMgYXJlIHJlc2V0IGFmdGVyIHN1YnJ1bGVzIHNvIHRoYXQgdGhlIHN0cmVhbXMKKyAgICAJICogIGNhbiBiZSByZXVzZWQgaW4gZnV0dXJlIHN1YnJ1bGVzLiAgU28sIHJlc2V0IG11c3Qgc2V0IGEgZGlydHkgYml0LgorICAgIAkgKiAgSWYgZGlydHksIHRoZW4gbmV4dCgpIGFsd2F5cyByZXR1cm5zIGEgZHVwLgorICAgIAkgKgorICAgIAkgKiAgSSB3YW50ZWQgdG8gdXNlICJuYXVnaHR5IGJpdCIgaGVyZSwgYnV0IGNvdWxkbid0IHRoaW5rIG9mIGEgd2F5CisgICAgCSAqICB0byB1c2UgIm5hdWdodHkiLgorICAgIAkgKi8KKyAgICAJcHJvdGVjdGVkIHZhciBkaXJ0eTpCb29sZWFuID0gZmFsc2U7CisgICAgCisgICAgCS8qKiBUaGUgZWxlbWVudCBvciBzdHJlYW0gZGVzY3JpcHRpb247IHVzdWFsbHkgaGFzIG5hbWUgb2YgdGhlIHRva2VuIG9yCisgICAgCSAqICBydWxlIHJlZmVyZW5jZSB0aGF0IHRoaXMgbGlzdCB0cmFja3MuICBDYW4gaW5jbHVkZSBydWxlbmFtZSB0b28sIGJ1dAorICAgIAkgKiAgdGhlIGV4Y2VwdGlvbiB3b3VsZCB0cmFjayB0aGF0IGluZm8uCisgICAgCSAqLworICAgIAlwcm90ZWN0ZWQgdmFyIGVsZW1lbnREZXNjcmlwdGlvbjpTdHJpbmc7CisgICAgCXByb3RlY3RlZCB2YXIgYWRhcHRvcjpUcmVlQWRhcHRvcjsKKyAgICAKKyAgICAJcHVibGljIGZ1bmN0aW9uIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbShhZGFwdG9yOlRyZWVBZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb246U3RyaW5nLCBlbGVtZW50Ok9iamVjdCA9IG51bGwpIHsKKyAgICAJCXRoaXMuZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgIAkJdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAJCSAgICBpZiAoZWxlbWVudCBpcyBBcnJheSkgeworICAgIAkJICAgICAgICAvKiogQ3JlYXRlIGEgc3RyZWFtLCBidXQgZmVlZCBvZmYgYW4gZXhpc3RpbmcgbGlzdCAqLworICAgIAkJICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudCBhcyBBcnJheTsKKyAgICAJCSAgICB9CisgICAgCQkgICAgZWxzZSB7CisgICAgCQkgICAgICAgIC8qKiBDcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudCAqLworICAgIAkJICAgICAgICBhZGQoZWxlbWVudCk7CisgICAgCQkgICAgfQorICAgIAkJfQorICAgIAl9CisgICAgCisgICAgCS8qKiBSZXNldCB0aGUgY29uZGl0aW9uIG9mIHRoaXMgc3RyZWFtIHNvIHRoYXQgaXQgYXBwZWFycyB3ZSBoYXZlCisgICAgCSAqICBub3QgY29uc3VtZWQgYW55IG9mIGl0cyBlbGVtZW50cy4gIEVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHVudG91Y2hlZC4KKyAgICAJICogIE9uY2Ugd2UgcmVzZXQgdGhlIHN0cmVhbSwgYW55IGZ1dHVyZSB1c2Ugd2lsbCBuZWVkIGR1cGxpY2F0ZXMuICBTZXQKKyAgICAJICogIHRoZSBkaXJ0eSBiaXQuCisgICAgCSAqLworICAgIAlwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTp2b2lkIHsKKyAgICAJCWN1cnNvciA9IDA7CisgICAgCQlkaXJ0eSA9IHRydWU7CisgICAgCX0KKyAgICAKKyAgICAJcHVibGljIGZ1bmN0aW9uIGFkZChlbDpPYmplY3QpOnZvaWQgeworICAgIAkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFkZCAnIitlbGVtZW50RGVzY3JpcHRpb24rIicgaXMgIitlbCk7CisgICAgCQlpZiAoIGVsPT1udWxsICkgeworICAgIAkJCXJldHVybjsKKyAgICAJCX0KKyAgICAJCWlmICggZWxlbWVudHMhPW51bGwgKSB7IC8vIGlmIGluIGxpc3QsIGp1c3QgYWRkCisgICAgCQkJZWxlbWVudHMucHVzaChlbCk7CisgICAgCQkJcmV0dXJuOworICAgIAkJfQorICAgIAkJaWYgKCBzaW5nbGVFbGVtZW50ID09IG51bGwgKSB7IC8vIG5vIGVsZW1lbnRzIHlldCwgdHJhY2sgdy9vIGxpc3QKKyAgICAJCQlzaW5nbGVFbGVtZW50ID0gZWw7CisgICAgCQkJcmV0dXJuOworICAgIAkJfQorICAgIAkJLy8gYWRkaW5nIDJuZCBlbGVtZW50LCBtb3ZlIHRvIGxpc3QKKyAgICAJCWVsZW1lbnRzID0gbmV3IEFycmF5KCk7CisgICAgCQllbGVtZW50cy5wdXNoKHNpbmdsZUVsZW1lbnQpOworICAgIAkJc2luZ2xlRWxlbWVudCA9IG51bGw7CisgICAgCQllbGVtZW50cy5wdXNoKGVsKTsKKyAgICAJfQorICAgIAorICAgIAkvKiogUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHN0cmVhbS4gIElmIG91dCBvZiBlbGVtZW50cywgdGhyb3cKKyAgICAJICogIGFuIGV4Y2VwdGlvbiB1bmxlc3Mgc2l6ZSgpPT0xLiAgSWYgc2l6ZSBpcyAxLCB0aGVuIHJldHVybiBlbGVtZW50c1swXS4KKyAgICAJICogIFJldHVybiBhIGR1cGxpY2F0ZSBub2RlL3N1YnRyZWUgaWYgc3RyZWFtIGlzIG91dCBvZiBlbGVtZW50cyBhbmQKKyAgICAJICogIHNpemU9PTEuICBJZiB3ZSd2ZSBhbHJlYWR5IHVzZWQgdGhlIGVsZW1lbnQsIGR1cCAoZGlydHkgYml0IHNldCkuCisgICAgCSAqLworICAgIAlwdWJsaWMgZnVuY3Rpb24gbmV4dFRyZWUoKTpPYmplY3QgeworICAgIAkJdmFyIG46aW50ID0gc2l6ZTsKKyAgICAJCXZhciBlbDpPYmplY3Q7CisgICAgCQlpZiAoIGRpcnR5IHx8IChjdXJzb3I+PW4gJiYgbj09MSkgKSB7CisgICAgCQkJLy8gaWYgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIGlzIDEsIGR1cAorICAgIAkJCWVsID0gX25leHQoKTsKKyAgICAJCQlyZXR1cm4gZHVwKGVsKTsKKyAgICAJCX0KKyAgICAJCS8vIHRlc3Qgc2l6ZSBhYm92ZSB0aGVuIGZldGNoCisgICAgCQllbCA9IF9uZXh0KCk7CisgICAgCQlyZXR1cm4gZWw7CisgICAgCX0KKyAgICAKKyAgICAJLyoqIGRvIHRoZSB3b3JrIG9mIGdldHRpbmcgdGhlIG5leHQgZWxlbWVudCwgbWFraW5nIHN1cmUgdGhhdCBpdCdzCisgICAgCSAqICBhIHRyZWUgbm9kZSBvciBzdWJ0cmVlLiAgRGVhbCB3aXRoIHRoZSBvcHRpbWl6YXRpb24gb2Ygc2luZ2xlLQorICAgIAkgKiAgZWxlbWVudCBsaXN0IHZlcnN1cyBsaXN0IG9mIHNpemUgPiAxLiAgVGhyb3cgYW4gZXhjZXB0aW9uCisgICAgCSAqICBpZiB0aGUgc3RyZWFtIGlzIGVtcHR5IG9yIHdlJ3JlIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZT4xLgorICAgIAkgKiAgcHJvdGVjdGVkIHNvIHlvdSBjYW4gb3ZlcnJpZGUgaW4gYSBzdWJjbGFzcyBpZiBuZWNlc3NhcnkuCisgICAgCSAqLworICAgIAlwcm90ZWN0ZWQgZnVuY3Rpb24gX25leHQoKTpPYmplY3QgeworICAgIAkJdmFyIG46aW50ID0gc2l6ZTsKKyAgICAJCWlmICggbiA9PTAgKSB7CisgICAgCQkJdGhyb3cgbmV3IFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbihlbGVtZW50RGVzY3JpcHRpb24pOworICAgIAkJfQorICAgIAkJaWYgKCBjdXJzb3I+PSBuKSB7IC8vIG91dCBvZiBlbGVtZW50cz8KKyAgICAJCQlpZiAoIG4gPT0xICkgeyAgLy8gaWYgc2l6ZSBpcyAxLCBpdCdzIG9rOyByZXR1cm4gYW5kIHdlJ2xsIGR1cAorICAgIAkJCQlyZXR1cm4gdG9UcmVlKHNpbmdsZUVsZW1lbnQpOworICAgIAkJCX0KKyAgICAJCQkvLyBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemUgd2FzIG5vdCAxLCBzbyB3ZSBjYW4ndCBkdXAKKyAgICAJCQl0aHJvdyBuZXcgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uKGVsZW1lbnREZXNjcmlwdGlvbik7CisgICAgCQl9CisgICAgCQkvLyB3ZSBoYXZlIGVsZW1lbnRzCisgICAgCQlpZiAoIHNpbmdsZUVsZW1lbnQhPW51bGwgKSB7CisgICAgCQkJY3Vyc29yKys7IC8vIG1vdmUgY3Vyc29yIGV2ZW4gZm9yIHNpbmdsZSBlbGVtZW50IGxpc3QKKyAgICAJCQlyZXR1cm4gdG9UcmVlKHNpbmdsZUVsZW1lbnQpOworICAgIAkJfQorICAgIAkJLy8gbXVzdCBoYXZlIG1vcmUgdGhhbiBvbmUgaW4gbGlzdCwgcHVsbCBmcm9tIGVsZW1lbnRzCisgICAgCQl2YXIgbzpPYmplY3QgPSB0b1RyZWUoZWxlbWVudHNbY3Vyc29yXSk7CisgICAgCQljdXJzb3IrKzsKKyAgICAJCXJldHVybiBvOworICAgIAl9CisgICAgCisgICAgCS8qKiBXaGVuIGNvbnN0cnVjdGluZyB0cmVlcywgc29tZXRpbWVzIHdlIG5lZWQgdG8gZHVwIGEgdG9rZW4gb3IgQVNUCisgICAgCSAqIAlzdWJ0cmVlLiAgRHVwJ2luZyBhIHRva2VuIG1lYW5zIGp1c3QgY3JlYXRpbmcgYW5vdGhlciBBU1Qgbm9kZQorICAgIAkgKiAgYXJvdW5kIGl0LiAgRm9yIHRyZWVzLCB5b3UgbXVzdCBjYWxsIHRoZSBhZGFwdG9yLmR1cFRyZWUoKSB1bmxlc3MKKyAgICAJICogIHRoZSBlbGVtZW50IGlzIGZvciBhIHRyZWUgcm9vdDsgdGhlbiBpdCBtdXN0IGJlIGEgbm9kZSBkdXAuCisgICAgCSAqLworICAgIAlwcm90ZWN0ZWQgZnVuY3Rpb24gZHVwKGVsOk9iamVjdCk6T2JqZWN0IHsKKyAgICAJICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIik7ICAvLyBzaG91bGQgYmUgYWJzdHJhY3QKKyAgICAJfQorICAgIAorICAgIAkvKiogRW5zdXJlIHN0cmVhbSBlbWl0cyB0cmVlczsgdG9rZW5zIG11c3QgYmUgY29udmVydGVkIHRvIEFTVCBub2Rlcy4KKyAgICAJICogIEFTVCBub2RlcyBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5tb2xlc3RlZC4KKyAgICAJICovCisgICAgCXByb3RlY3RlZCBmdW5jdGlvbiB0b1RyZWUoZWw6T2JqZWN0KTpPYmplY3QgeworICAgIAkJcmV0dXJuIGVsOworICAgIAl9CisgICAgCisgICAgCXB1YmxpYyBmdW5jdGlvbiBnZXQgaGFzTmV4dCgpOkJvb2xlYW4geworICAgIAkJIHJldHVybiAoc2luZ2xlRWxlbWVudCAhPSBudWxsICYmIGN1cnNvciA8IDEpIHx8CisgICAgCQkJICAgKGVsZW1lbnRzIT1udWxsICYmIGN1cnNvciA8IGVsZW1lbnRzLmxlbmd0aCk7CisgICAgCX0KKyAgICAKKyAgICAJcHVibGljIGZ1bmN0aW9uIGdldCBzaXplKCk6aW50IHsKKyAgICAJCXZhciBuOmludCA9IDA7CisgICAgCQlpZiAoIHNpbmdsZUVsZW1lbnQgIT0gbnVsbCApIHsKKyAgICAJCQluID0gMTsKKyAgICAJCX0KKyAgICAJCWlmICggZWxlbWVudHMhPW51bGwgKSB7CisgICAgCQkJcmV0dXJuIGVsZW1lbnRzLmxlbmd0aDsKKyAgICAJCX0KKyAgICAJCXJldHVybiBuOworICAgIAl9CisgICAgCisgICAgCXB1YmxpYyBmdW5jdGlvbiBnZXQgZGVzY3JpcHRpb24oKTpTdHJpbmcgeworICAgIAkJcmV0dXJuIGVsZW1lbnREZXNjcmlwdGlvbjsKKyAgICAJfSAgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2FiMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmFzCkBAIC0wLDAgKzEsMjcgQEAKKworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlIHsKKyAgICAKKyAgICAvKiogUXVldWVzIHVwIG5vZGVzIG1hdGNoZWQgb24gbGVmdCBzaWRlIG9mIC0+IGluIGEgdHJlZSBwYXJzZXIuIFRoaXMgaXMKKyAgICAgKiAgdGhlIGFuYWxvZyBvZiBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIGZvciBub3JtYWwgcGFyc2Vycy4gCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJld3JpdGVSdWxlTm9kZVN0cmVhbSBleHRlbmRzIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZnVuY3Rpb24gUmV3cml0ZVJ1bGVOb2RlU3RyZWFtKGFkYXB0b3I6VHJlZUFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbjpTdHJpbmcsIGVsZW1lbnQ6T2JqZWN0ID0gbnVsbCkgeworICAgICAgICAgICAgc3VwZXIoYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIG5leHROb2RlKCk6T2JqZWN0IHsKKwkJICAgIHJldHVybiBfbmV4dCgpOworICAgIAl9CisgICAgCisgICAgCXByb3RlY3RlZCBvdmVycmlkZSBmdW5jdGlvbiB0b1RyZWUoZWw6T2JqZWN0KTpPYmplY3QgeworICAgIAkJcmV0dXJuIGFkYXB0b3IuZHVwTm9kZShlbCk7CisgICAgCX0KKyAgICAKKyAgICAJcHJvdGVjdGVkIG92ZXJyaWRlIGZ1bmN0aW9uIGR1cChlbDpPYmplY3QpOk9iamVjdCB7CisgICAgCQkvLyB3ZSBkdXAgZXZlcnkgbm9kZSwgc28gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBjYWxsaW5nIGR1cDsgc2hvcnQtCisgICAgCQkvLyBjaXJjdWl0ZWQgbmV4dCgpIHNvIGl0IGRvZXNuJ3QgY2FsbC4KKyAgICAJCXRocm93IG5ldyBFcnJvcigiZHVwIGNhbid0IGJlIGNhbGxlZCBmb3IgYSBub2RlIHN0cmVhbS4iKTsKKyAgICAJfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5OWZlZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5hcwpAQCAtMCwwICsxLDY3IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisgICAgCisgICAgcHVibGljIGNsYXNzIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBleHRlbmRzIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZnVuY3Rpb24gUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3I6VHJlZUFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbjpTdHJpbmcsIGVsZW1lbnQ6T2JqZWN0PW51bGwpIHsKKyAgICAgICAgICAgIHN1cGVyKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgCS8qKiBUcmVhdCBuZXh0IGVsZW1lbnQgYXMgYSBzaW5nbGUgbm9kZSBldmVuIGlmIGl0J3MgYSBzdWJ0cmVlLgorICAgIAkgKiAgVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YgbmV4dCgpIHdoZW4gdGhlIHJlc3VsdCBoYXMgdG8gYmUgYQorICAgIAkgKiAgdHJlZSByb290IG5vZGUuICBBbHNvIHByZXZlbnRzIHVzIGZyb20gZHVwbGljYXRpbmcgcmVjZW50bHktYWRkZWQKKyAgICAJICogIGNoaWxkcmVuOyBlLmcuLCBeKHR5cGUgSUQpKyBhZGRzIElEIHRvIHR5cGUgYW5kIHRoZW4gMm5kIGl0ZXJhdGlvbgorICAgIAkgKiAgbXVzdCBkdXAgdGhlIHR5cGUgbm9kZSwgYnV0IElEIGhhcyBiZWVuIGFkZGVkLgorICAgIAkgKgorICAgIAkgKiAgUmVmZXJlbmNpbmcgYSBydWxlIHJlc3VsdCB0d2ljZSBpcyBvazsgZHVwIGVudGlyZSB0cmVlIGFzCisgICAgCSAqICB3ZSBjYW4ndCBiZSBhZGRpbmcgdHJlZXMgYXMgcm9vdDsgZS5nLiwgZXhwciBleHByLgorICAgIAkgKgorICAgIAkgKiAgSGlkZW91cyBjb2RlIGR1cGxpY2F0aW9uIGhlcmUgd2l0aCBzdXBlci5uZXh0KCkuICBDYW4ndCB0aGluayBvZgorICAgIAkgKiAgYSBwcm9wZXIgd2F5IHRvIHJlZmFjdG9yLiAgVGhpcyBuZWVkcyB0byBhbHdheXMgY2FsbCBkdXAgbm9kZQorICAgIAkgKiAgYW5kIHN1cGVyLm5leHQoKSBkb2Vzbid0IGtub3cgd2hpY2ggdG8gY2FsbDogZHVwIG5vZGUgb3IgZHVwIHRyZWUuCisgICAgCSAqLworICAgIAlwdWJsaWMgZnVuY3Rpb24gbmV4dE5vZGUoKTpPYmplY3QgeworICAgIAkJdmFyIG46aW50ID0gc2l6ZTsKKyAgICAJCXZhciBlbDpPYmplY3Q7CisgICAgCQlpZiAoIGRpcnR5IHx8IChjdXJzb3I+PW4gJiYgbj09MSkgKSB7CisgICAgCQkJLy8gaWYgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIGlzIDEsIGR1cCAoYXQgbW9zdCBhIHNpbmdsZSBub2RlCisgICAgCQkJLy8gc2luY2UgdGhpcyBpcyBmb3IgbWFraW5nIHJvb3Qgbm9kZXMpLgorICAgIAkJCWVsID0gX25leHQoKTsKKyAgICAJCQlyZXR1cm4gYWRhcHRvci5kdXBOb2RlKGVsKTsKKyAgICAJCX0KKyAgICAJCS8vIHRlc3Qgc2l6ZSBhYm92ZSB0aGVuIGZldGNoCisgICAgCQllbCA9IF9uZXh0KCk7CisgICAgCQlyZXR1cm4gZWw7CisgICAgCX0KKyAgICAKKyAgICAJcHJvdGVjdGVkIG92ZXJyaWRlIGZ1bmN0aW9uIGR1cChlbDpPYmplY3QpOk9iamVjdCB7CisgICAgCQlyZXR1cm4gYWRhcHRvci5kdXBUcmVlKGVsKTsKKyAgICAJfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVRva2VuU3RyZWFtLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWFjMjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5hcwpAQCAtMCwwICsxLDYwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisgICAgaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworICAgIAorICAgIAorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIGV4dGVuZHMgUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKGFkYXB0b3I6VHJlZUFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbjpTdHJpbmcsIGVsZW1lbnQ6T2JqZWN0PW51bGwpIHsKKyAgICAgICAgICAgIHN1cGVyKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgCS8qKiBHZXQgbmV4dCB0b2tlbiBmcm9tIHN0cmVhbSBhbmQgbWFrZSBhIG5vZGUgZm9yIGl0ICovCisgICAgCXB1YmxpYyBmdW5jdGlvbiBuZXh0Tm9kZSgpOk9iamVjdCB7CisgICAgCQl2YXIgdDpUb2tlbiA9IFRva2VuKF9uZXh0KCkpOworICAgIAkJcmV0dXJuIGFkYXB0b3IuY3JlYXRlV2l0aFBheWxvYWQodCk7CisgICAgCX0KKyAgICAKKyAgICAJcHVibGljIGZ1bmN0aW9uIG5leHRUb2tlbigpOlRva2VuIHsKKyAgICAJCXJldHVybiBUb2tlbihfbmV4dCgpKTsKKyAgICAJfQorICAgIAorICAgIAkvKiogRG9uJ3QgY29udmVydCB0byBhIHRyZWUgdW5sZXNzIHRoZXkgZXhwbGljaXRseSBjYWxsIG5leHRUcmVlLgorICAgIAkgKiAgVGhpcyB3YXkgd2UgY2FuIGRvIGhldGVybyB0cmVlIG5vZGVzIGluIHJld3JpdGUuCisgICAgCSAqLworICAgIAlwcm90ZWN0ZWQgb3ZlcnJpZGUgZnVuY3Rpb24gdG9UcmVlKGVsOk9iamVjdCk6T2JqZWN0IHsKKyAgICAJCXJldHVybiBlbDsKKyAgICAJfQorICAgIAorICAgIAlwcm90ZWN0ZWQgb3ZlcnJpZGUgZnVuY3Rpb24gZHVwKGVsOk9iamVjdCk6T2JqZWN0IHsKKyAgICAJCXRocm93IG5ldyBFcnJvcigiZHVwIGNhbid0IGJlIGNhbGxlZCBmb3IgYSB0b2tlbiBzdHJlYW0uIik7CisgICAgCX0KKyAgICAgICAgCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWUuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDAyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmFzCkBAIC0wLDAgKzEsOTYgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZSB7CisJLyoqIFdoYXQgZG9lcyBhIHRyZWUgbG9vayBsaWtlPyAgQU5UTFIgaGFzIGEgbnVtYmVyIG9mIHN1cHBvcnQgY2xhc3NlcworCSAqICBzdWNoIGFzIENvbW1vblRyZWVOb2RlU3RyZWFtIHRoYXQgd29yayBvbiB0aGVzZSBraW5kcyBvZiB0cmVlcy4gIFlvdQorCSAqICBkb24ndCBoYXZlIHRvIG1ha2UgeW91ciB0cmVlcyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGJ1dCBpZiB5b3UgZG8sCisJICogIHlvdSdsbCBiZSBhYmxlIHRvIHVzZSBtb3JlIHN1cHBvcnQgY29kZS4KKwkgKgorCSAqICBOT1RFOiBXaGVuIGNvbnN0cnVjdGluZyB0cmVlcywgQU5UTFIgY2FuIGJ1aWxkIGFueSBraW5kIG9mIHRyZWU7IGl0IGNhbgorCSAqICBldmVuIHVzZSBUb2tlbiBvYmplY3RzIGFzIHRyZWVzIGlmIHlvdSBhZGQgYSBjaGlsZCBsaXN0IHRvIHlvdXIgdG9rZW5zLgorCSAqCisJICogIFRoaXMgaXMgYSB0cmVlIG5vZGUgd2l0aG91dCBhbnkgcGF5bG9hZDsganVzdCBuYXZpZ2F0aW9uIGFuZCBmYWN0b3J5IHN0dWZmLgorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgVHJlZSB7CisJCisJCWZ1bmN0aW9uIGdldENoaWxkKGk6aW50KTpUcmVlOworCQorCQlmdW5jdGlvbiBnZXQgY2hpbGRDb3VudCgpOmludDsKKwkKKwkJLy8gVHJlZSB0cmFja3MgcGFyZW50IGFuZCBjaGlsZCBpbmRleCBub3cgPiAzLjAKKwkKKwkJZnVuY3Rpb24gZ2V0IHBhcmVudCgpOlRyZWU7CisJCisJCWZ1bmN0aW9uIHNldCBwYXJlbnQodDpUcmVlKTp2b2lkOworCQkKKwkJLyoqIElzIHRoZXJlIGlzIGEgbm9kZSBhYm92ZSB3aXRoIHRva2VuIHR5cGUgdHR5cGU/ICovCisgICAgICAgIGZ1bmN0aW9uIGhhc0FuY2VzdG9yKHR0eXBlOmludCk6Qm9vbGVhbjsKKyAgICAKKyAgICAgICAgLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworICAgICAgICBmdW5jdGlvbiBnZXRBbmNlc3Rvcih0dHlwZTppbnQpOlRyZWU7CisgICAgCisgICAgICAgIC8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAgICAgICAgICogIGxpc3QgaXMgdGhlIHJvb3QgYW5kIHRoZSBsYXN0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgZnVuY3Rpb24gZ2V0IGFuY2VzdG9ycygpOkFycmF5OworCisJCisJCS8qKiBUaGlzIG5vZGUgaXMgd2hhdCBjaGlsZCBpbmRleD8gMC4ubi0xICovCisJCWZ1bmN0aW9uIGdldCBjaGlsZEluZGV4KCk6aW50OworCQorCQlmdW5jdGlvbiBzZXQgY2hpbGRJbmRleChpbmRleDppbnQpOnZvaWQ7CisJCisJCS8qKiBTZXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggdmFsdWVzIGZvciBhbGwgY2hpbGRyZW4gKi8KKwkJZnVuY3Rpb24gZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcygpOnZvaWQ7CisJCisJCS8qKiBBZGQgdCBhcyBhIGNoaWxkIHRvIHRoaXMgbm9kZS4gIElmIHQgaXMgbnVsbCwgZG8gbm90aGluZy4gIElmIHQKKwkJICogIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCQkgKi8KKwkJZnVuY3Rpb24gYWRkQ2hpbGQodDpUcmVlKTp2b2lkOworCQorCQkvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworCQlmdW5jdGlvbiBzZXRDaGlsZChpOmludCwgdDpUcmVlKTp2b2lkOworCQorCQlmdW5jdGlvbiBkZWxldGVDaGlsZChpOmludCk6T2JqZWN0OworCQorCQkvKiogRGVsZXRlIGNoaWxkcmVuIGZyb20gc3RhcnQgdG8gc3RvcCBhbmQgcmVwbGFjZSB3aXRoIHQgZXZlbiBpZiB0IGlzCisJCSAqICBhIGxpc3QgKG5pbC1yb290IHRyZWUpLiAgbnVtIG9mIGNoaWxkcmVuIGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZS4KKwkJICogIEZvciBodWdlIGNoaWxkIGxpc3RzLCBpbnNlcnRpbmcgY2hpbGRyZW4gY2FuIGZvcmNlIHdhbGtpbmcgcmVzdCBvZgorCQkgKiAgY2hpbGRyZW4gdG8gc2V0IHRoZWlyIGNoaWxkaW5kZXg7IGNvdWxkIGJlIHNsb3cuCisJCSAqLworCQlmdW5jdGlvbiByZXBsYWNlQ2hpbGRyZW4oc3RhcnRDaGlsZEluZGV4OmludCwgc3RvcENoaWxkSW5kZXg6aW50LCB0Ok9iamVjdCk6dm9pZDsJCisKKwkJLyoqIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhIG5pbCBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworCQkgKiAgdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisJCSAqLworCQlmdW5jdGlvbiBnZXQgaXNOaWwoKTpCb29sZWFuOworCQorCQkvKiogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKwkJICogICBhbmQgaXRzIGNoaWxkcmVuPworCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IHRva2VuU3RhcnRJbmRleCgpOmludDsKKwkKKwkJZnVuY3Rpb24gc2V0IHRva2VuU3RhcnRJbmRleChpbmRleDppbnQpOnZvaWQ7CisJCisJCS8qKiAgV2hhdCBpcyB0aGUgbGFyZ2VzdCB0b2tlbiBpbmRleCAoaW5kZXhpbmcgZnJvbSAwKSBmb3IgdGhpcyBub2RlCisJCSAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKwkJICovCisJCWZ1bmN0aW9uIGdldCB0b2tlblN0b3BJbmRleCgpOmludDsKKwkKKwkJZnVuY3Rpb24gc2V0IHRva2VuU3RvcEluZGV4KGluZGV4OmludCk6dm9pZDsKKwkKKwkJZnVuY3Rpb24gZHVwTm9kZSgpOlRyZWU7CisJCisJCS8qKiBSZXR1cm4gYSB0b2tlbiB0eXBlOyBuZWVkZWQgZm9yIHRyZWUgcGFyc2luZyAqLworCQlmdW5jdGlvbiBnZXQgdHlwZSgpOmludDsKKwkKKwkJZnVuY3Rpb24gZ2V0IHRleHQoKTpTdHJpbmc7CisJCisJCS8qKiBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/ICovCisJCWZ1bmN0aW9uIGdldCBsaW5lKCk6aW50OworCQorCQlmdW5jdGlvbiBnZXQgY2hhclBvc2l0aW9uSW5MaW5lKCk6aW50OworCQorCQlmdW5jdGlvbiB0b1N0cmluZ1RyZWUoKTpTdHJpbmc7CisKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlQWRhcHRvci5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVBZGFwdG9yLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDVkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlQWRhcHRvci5hcwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUgeworCQorCWltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworCQorCS8qKiBIb3cgdG8gY3JlYXRlIGFuZCBuYXZpZ2F0ZSB0cmVlcy4gIFJhdGhlciB0aGFuIGhhdmUgYSBzZXBhcmF0ZSBmYWN0b3J5CisJICogIGFuZCBhZGFwdG9yLCBJJ3ZlIG1lcmdlZCB0aGVtLiAgTWFrZXMgc2Vuc2UgdG8gZW5jYXBzdWxhdGUuCisJICoKKwkgKiAgVGhpcyB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHRyZWUgY29uc3RydWN0aW9uIGNvZGUgZ2VuZXJhdGVkIGluIHRoZQorCSAqICBnZW5lcmF0ZWQgY29kZSBpbiAyLnggYW5kIHRoZSBBU1RGYWN0b3J5LgorCSAqCisJICogIEkgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiBhIHRyZWUgYXQgYWxsIHNvIHRoZXkgYXJlIGFsbAorCSAqICBnZW5lcmljIE9iamVjdHMuICBUaGlzIG1heSBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIHR5cGVjYXN0aW5nIG5lZWRlZC4gOigKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFRyZWVBZGFwdG9yIHsKKwkJLy8gQyBvIG4gcyB0IHIgdSBjIHQgaSBvIG4KKwkKKwkJLyoqIENyZWF0ZSBhIHRyZWUgbm9kZSBmcm9tIFRva2VuIG9iamVjdDsgZm9yIENvbW1vblRyZWUgdHlwZSB0cmVlcywKKwkJICogIHRoZW4gdGhlIHRva2VuIGp1c3QgYmVjb21lcyB0aGUgcGF5bG9hZC4gIFRoaXMgaXMgdGhlIG1vc3QKKwkJICogIGNvbW1vbiBjcmVhdGUgY2FsbC4KKwkJICogCisJCSAqIAlPdmVycmlkZSBpZiB5b3Ugd2FudCBhbm90aGVyIGtpbmQgb2Ygbm9kZSB0byBiZSBidWlsdC4KKwkgICAgICovCisJCWZ1bmN0aW9uIGNyZWF0ZVdpdGhQYXlsb2FkKHBheWxvYWQ6VG9rZW4pOk9iamVjdDsKKwkKKwkJLyoqIER1cGxpY2F0ZSBhIHNpbmdsZSB0cmVlIG5vZGUuCisJIAkgKiAgT3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuCisJIAkgKi8KKwkgCWZ1bmN0aW9uIGR1cE5vZGUodHJlZU5vZGU6T2JqZWN0KTpPYmplY3Q7CisJIAkKKwkJLyoqIER1cGxpY2F0ZSB0cmVlIHJlY3Vyc2l2ZWx5LCB1c2luZyBkdXBOb2RlKCkgZm9yIGVhY2ggbm9kZSAqLworCQlmdW5jdGlvbiBkdXBUcmVlKHRyZWU6T2JqZWN0KTpPYmplY3Q7CisJCisJCS8qKiBSZXR1cm4gYSBuaWwgbm9kZSAoYW4gZW1wdHkgYnV0IG5vbi1udWxsIG5vZGUpIHRoYXQgY2FuIGhvbGQKKwkJICogIGEgbGlzdCBvZiBlbGVtZW50IGFzIHRoZSBjaGlsZHJlbi4gIElmIHlvdSB3YW50IGEgZmxhdCB0cmVlIChhIGxpc3QpCisJCSAqICB1c2UgInQ9YWRhcHRvci5uaWwoKTsgdC5hZGRDaGlsZCh4KTsgdC5hZGRDaGlsZCh5KTsiCisJCSAqLworCQlmdW5jdGlvbiBuaWwoKTpPYmplY3Q7CisJCisgICAgCS8qKiBSZXR1cm4gYSB0cmVlIG5vZGUgcmVwcmVzZW50aW5nIGFuIGVycm9yLiAgVGhpcyBub2RlIHJlY29yZHMgdGhlCisgICAgCSAqICB0b2tlbnMgY29uc3VtZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5LiAgVGhlIHN0YXJ0IHRva2VuIGluZGljYXRlcyB0aGUKKyAgICAJICogIGlucHV0IHN5bWJvbCBhdCB3aGljaCB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLiAgVGhlIHN0b3AgdG9rZW4gaW5kaWNhdGVzCisgICAgCSAqICB0aGUgbGFzdCBzeW1ib2wgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5LgorICAgIAkgKgorICAgIAkgKiAgWW91IG11c3Qgc3BlY2lmeSB0aGUgaW5wdXQgc3RyZWFtIHNvIHRoYXQgdGhlIGVycm9uZW91cyB0ZXh0IGNhbgorICAgIAkgKiAgYmUgcGFja2FnZWQgdXAgaW4gdGhlIGVycm9yIG5vZGUuICBUaGUgZXhjZXB0aW9uIGNvdWxkIGJlIHVzZWZ1bAorICAgIAkgKiAgdG8gc29tZSBhcHBsaWNhdGlvbnM7IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3RvcmVzIHB0ciB0byBpdCBpbgorICAgIAkgKiAgdGhlIENvbW1vbkVycm9yTm9kZS4KKyAgICAJICoKKyAgICAJICogIFRoaXMgb25seSBtYWtlcyBzZW5zZSBkdXJpbmcgdG9rZW4gcGFyc2luZywgbm90IHRyZWUgcGFyc2luZy4KKyAgICAJICogIFRyZWUgcGFyc2luZyBzaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBwYXJzaW5nIGFuZCB0cmVlIGNvbnN0cnVjdGlvbgorICAgIAkgKiAgc3VjY2VlZC4KKyAgICAJICovCisgICAgCWZ1bmN0aW9uIGVycm9yTm9kZShpbnB1dDpUb2tlblN0cmVhbSwgc3RhcnQ6VG9rZW4sIHN0b3A6VG9rZW4sIGU6UmVjb2duaXRpb25FeGNlcHRpb24pOk9iamVjdDsKKworCQkvKiogSXMgdHJlZSBjb25zaWRlcmVkIGEgbmlsIG5vZGUgdXNlZCB0byBtYWtlIGxpc3RzIG9mIGNoaWxkIG5vZGVzPyAqLyAKKwkJZnVuY3Rpb24gaXNOaWwodHJlZTpPYmplY3QpOkJvb2xlYW47CisJCisJCS8qKiBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisJCSAqICBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKwkJICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHlvdSBjYW4gZGVjaWRlIGl0IGlzIG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB2aWEKKwkJICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKwkJICogIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZAorCQkgKiAgQVNUcy4gIERvIG5vdGhpbmcgaWYgdCBvciBjaGlsZCBpcyBudWxsLgorCQkgKi8KKwkJZnVuY3Rpb24gYWRkQ2hpbGQodDpPYmplY3QsIGNoaWxkOk9iamVjdCk6dm9pZDsKKwkKKwkJLyoqIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisJCSAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKwkJICoKKwkJICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKwkJICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorCQkgKgorCQkgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisJCSAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKwkJICoKKwkJICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisJCSAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisJCSAqCisJCSAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKwkJICoKKwkJICogICAgb2xkPW51bGwsIG5ldz1yIHlpZWxkcyByCisJCSAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisJCSAqCisJCSAqICBSZXR1cm4gbmV3Um9vdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBuZXdSb290IGlzIG5vdCBhCisJCSAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisJCSAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorCQkgKgorCQkgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisJCSAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorCQkgKiAgY29uc3RydWN0aW5nIHRoZXNlIG5vZGVzIHNvIHdlIHNob3VsZCBoYXZlIHRoaXMgY29udHJvbCBmb3IKKwkJICogIGVmZmljaWVuY3kuCisJCSAqLworCQlmdW5jdGlvbiBiZWNvbWVSb290KG5ld1Jvb3Q6T2JqZWN0LCBvbGRSb290Ok9iamVjdCk6T2JqZWN0OworCQorCQkvKiogR2l2ZW4gdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUgY3JlYXRlZCBmb3IgdGhpcyBydWxlLCBwb3N0IHByb2Nlc3MKKwkJICogIGl0IHRvIGRvIGFueSBzaW1wbGlmaWNhdGlvbnMgb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBBIHJlcXVpcmVkCisJCSAqICBiZWhhdmlvciBpcyB0byBjb252ZXJ0IF4obmlsIHNpbmdsZVN1YnRyZWUpIHRvIHNpbmdsZVN1YnRyZWUKKwkJICogIGFzIHRoZSBzZXR0aW5nIG9mIHN0YXJ0L3N0b3AgaW5kZXhlcyByZWxpZXMgb24gYSBzaW5nbGUgbm9uLW5pbCByb290CisJCSAqICBmb3Igbm9uLWZsYXQgdHJlZXMuCisJCSAqCisJCSAqICBGbGF0IHRyZWVzIHN1Y2ggYXMgZm9yIGxpc3RzIGxpa2UgImlkbGlzdCA6IElEKyA7IiBhcmUgbGVmdCBhbG9uZQorCQkgKiAgdW5sZXNzIHRoZXJlIGlzIG9ubHkgb25lIElELiAgRm9yIGEgbGlzdCwgdGhlIHN0YXJ0L3N0b3AgaW5kZXhlcworCQkgKiAgYXJlIHNldCBpbiB0aGUgbmlsIG5vZGUuCisJCSAqCisJCSAqICBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhZnRlciBhbGwgcnVsZSB0cmVlIGNvbnN0cnVjdGlvbiBhbmQgcmlnaHQKKwkJICogIGJlZm9yZSBzZXRUb2tlbkJvdW5kYXJpZXMoKS4KKwkJICovCisJCWZ1bmN0aW9uIHJ1bGVQb3N0UHJvY2Vzc2luZyhyb290Ok9iamVjdCk6T2JqZWN0OworCQorCQkvKiogRm9yIGlkZW50aWZ5aW5nIHRyZWVzLgorCQkgKgorCQkgKiAgSG93IHRvIGlkZW50aWZ5IG5vZGVzIHNvIHdlIGNhbiBzYXkgImFkZCBub2RlIHRvIGEgcHJpb3Igbm9kZSI/CisJCSAqICBFdmVuIGJlY29tZVJvb3QgaXMgYW4gaXNzdWUuICBVc2UgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZSkKKwkJICogIHVzdWFsbHkuCisJCSAqLworCQlmdW5jdGlvbiBnZXRVbmlxdWVJRChub2RlOk9iamVjdCk6aW50OworCQorCQorCQkvLyBSIGUgdyByIGkgdCBlICBSIHUgbCBlIHMKKwkKKwkJLyoqIENyZWF0ZSBhIG5ldyBub2RlIGRlcml2ZWQgZnJvbSBhIHRva2VuLCB3aXRoIGEgbmV3IHRva2VuIHR5cGUuCisJCSAqICBUaGlzIGlzIGludm9rZWQgZnJvbSBhbiBpbWFnaW5hcnkgbm9kZSByZWYgb24gcmlnaHQgc2lkZSBvZiBhCisJCSAqICByZXdyaXRlIHJ1bGUgYXMgSU1BR1skdG9rZW5MYWJlbF0gb3IgSU1BR1skdG9rZW5MYWJlbCwgIklNQUciXS4KKwkJICoKKwkJICogIFRoaXMgc2hvdWxkIGludm9rZSBjcmVhdGVUb2tlbihUb2tlbikuCisJCSAqLworCQlmdW5jdGlvbiBjcmVhdGVGcm9tVG9rZW4odG9rZW5UeXBlOmludCwgZnJvbVRva2VuOlRva2VuLCB0ZXh0OlN0cmluZyA9IG51bGwpOk9iamVjdDsKKwkKKwkJLyoqIENyZWF0ZSBhIG5ldyBub2RlIGRlcml2ZWQgZnJvbSBhIHRva2VuLCB3aXRoIGEgbmV3IHRva2VuIHR5cGUuCisJCSAqICBUaGlzIGlzIGludm9rZWQgZnJvbSBhbiBpbWFnaW5hcnkgbm9kZSByZWYgb24gcmlnaHQgc2lkZSBvZiBhCisJCSAqICByZXdyaXRlIHJ1bGUgYXMgSU1BR1siSU1BRyJdLgorCQkgKgorCQkgKiAgVGhpcyBzaG91bGQgaW52b2tlIGNyZWF0ZVRva2VuKGludCxTdHJpbmcpLgorCQkgKi8KKwkJZnVuY3Rpb24gY3JlYXRlRnJvbVR5cGUodG9rZW5UeXBlOmludCwgdGV4dDpTdHJpbmcpOk9iamVjdDsKKwkKKwkKKwkJLy8gQyBvIG4gdCBlIG4gdAorCQorCQkvKiogRm9yIHRyZWUgcGFyc2luZywgSSBuZWVkIHRvIGtub3cgdGhlIHRva2VuIHR5cGUgb2YgYSBub2RlICovCisJCWZ1bmN0aW9uIGdldFR5cGUodDpPYmplY3QpOmludDsKKwkKKwkJLyoqIE5vZGUgY29uc3RydWN0b3JzIGNhbiBzZXQgdGhlIHR5cGUgb2YgYSBub2RlICovCisJCWZ1bmN0aW9uIHNldFR5cGUodDpPYmplY3QsIHR5cGU6aW50KTp2b2lkOworCQorCQlmdW5jdGlvbiBnZXRUZXh0KHQ6T2JqZWN0KTpTdHJpbmc7CisJCisJCS8qKiBOb2RlIGNvbnN0cnVjdG9ycyBjYW4gc2V0IHRoZSB0ZXh0IG9mIGEgbm9kZSAqLworCQlmdW5jdGlvbiBzZXRUZXh0KHQ6T2JqZWN0LCB0ZXh0OlN0cmluZyk6dm9pZDsKKwkKKwkJLyoqIFJldHVybiB0aGUgdG9rZW4gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBub2RlIHdhcyBjcmVhdGVkLgorCQkgKiAgQ3VycmVudGx5IHVzZWQgb25seSBmb3IgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4KKwkJICogIFRoZSBlcnJvciBkaXNwbGF5IHJvdXRpbmUgaW4gQmFzZVJlY29nbml6ZXIgbmVlZHMgdG8KKwkJICogIGRpc3BsYXkgd2hlcmUgdGhlIGlucHV0IHRoZSBlcnJvciBvY2N1cnJlZC4gSWYgeW91cgorCQkgKiAgdHJlZSBvZiBsaW1pdGF0aW9uIGRvZXMgbm90IHN0b3JlIGluZm9ybWF0aW9uIHRoYXQgY2FuCisJCSAqICBsZWFkIHlvdSB0byB0aGUgdG9rZW4sIHlvdSBjYW4gY3JlYXRlIGEgdG9rZW4gZmlsbGVkIHdpdGgKKwkJICogIHRoZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiBhbmQgcGFzcyB0aGF0IGJhY2suICBTZWUKKwkJICogIEJhc2VSZWNvZ25pemVyLmdldEVycm9yTWVzc2FnZSgpLgorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0VG9rZW4odDpPYmplY3QpOlRva2VuOworCQorCQkvKiogV2hlcmUgYXJlIHRoZSBib3VuZHMgaW4gdGhlIGlucHV0IHRva2VuIHN0cmVhbSBmb3IgdGhpcyBub2RlIGFuZAorCQkgKiAgYWxsIGNoaWxkcmVuPyAgRWFjaCBydWxlIHRoYXQgY3JlYXRlcyBBU1Qgbm9kZXMgd2lsbCBjYWxsIHRoaXMKKwkJICogIG1ldGhvZCByaWdodCBiZWZvcmUgcmV0dXJuaW5nLiAgRmxhdCB0cmVlcyAoaS5lLiwgbGlzdHMpIHdpbGwKKwkJICogIHN0aWxsIHVzdWFsbHkgaGF2ZSBhIG5pbCByb290IG5vZGUganVzdCB0byBob2xkIHRoZSBjaGlsZHJlbiBsaXN0LgorCQkgKiAgVGhhdCBub2RlIHdvdWxkIGNvbnRhaW4gdGhlIHN0YXJ0L3N0b3AgaW5kZXhlcyB0aGVuLgorCQkgKi8KKwkJZnVuY3Rpb24gc2V0VG9rZW5Cb3VuZGFyaWVzKHQ6T2JqZWN0LCBzdGFydFRva2VuOlRva2VuLCBzdG9wVG9rZW46VG9rZW4pOnZvaWQ7CisJCisJCS8qKiBHZXQgdGhlIHRva2VuIHN0YXJ0IGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4ICovCisJCWZ1bmN0aW9uIGdldFRva2VuU3RhcnRJbmRleCh0Ok9iamVjdCk6aW50OworCQorCQkvKiogR2V0IHRoZSB0b2tlbiBzdG9wIGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4ICovCisJCWZ1bmN0aW9uIGdldFRva2VuU3RvcEluZGV4KHQ6T2JqZWN0KTppbnQ7CisJCisJCisJCS8vIE4gYSB2IGkgZyBhIHQgaSBvIG4gIC8gIFQgciBlIGUgIFAgYSByIHMgaSBuIGcKKwkKKwkJLyoqIEdldCBhIGNoaWxkIDAuLm4tMSBub2RlICovCisJCWZ1bmN0aW9uIGdldENoaWxkKHQ6T2JqZWN0LCBpOmludCk6T2JqZWN0OworCQkKKwkJLyoqIFNldCBpdGggY2hpbGQgKDAuLm4tMSkgdG8gdDsgdCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tbmlsIG5vZGUgKi8KKwkJZnVuY3Rpb24gc2V0Q2hpbGQodDpPYmplY3QsIGk6aW50LCBjaGlsZDpPYmplY3QpOnZvaWQ7CisJCisJCS8qKiBSZW1vdmUgaXRoIGNoaWxkIGFuZCBzaGlmdCBjaGlsZHJlbiBkb3duIGZyb20gcmlnaHQuICovCisJCWZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHQ6T2JqZWN0LCBpOmludCk6T2JqZWN0OworCQorCQkvKiogSG93IG1hbnkgY2hpbGRyZW4/ICBJZiAwLCB0aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUgKi8KKwkJZnVuY3Rpb24gZ2V0Q2hpbGRDb3VudCh0Ok9iamVjdCk6aW50OworCQkKKwkJLyoqIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdC4KKwkJICogIElmIHlvdXIgbm9kZSB0eXBlIGRvZXNuJ3QgaGFuZGxlIHRoaXMsIGl0J3Mgb2sgYnV0IHRoZSB0cmVlIHJld3JpdGVzCisJCSAqICBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisJCSAqLworCQlmdW5jdGlvbiBnZXRQYXJlbnQodDpPYmplY3QpOk9iamVjdDsKKwkJZnVuY3Rpb24gc2V0UGFyZW50KHQ6T2JqZWN0LCBwYXJlbnQ6T2JqZWN0KTp2b2lkOworCQorCQkvKiogV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKwkJICogIElmIHlvdXIgbm9kZSB0eXBlIGRvZXNuJ3QgaGFuZGxlIHRoaXMsIGl0J3Mgb2sgYnV0IHRoZSB0cmVlIHJld3JpdGVzCisJCSAqICBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisJCSAqLworCQlmdW5jdGlvbiBnZXRDaGlsZEluZGV4KHQ6T2JqZWN0KTppbnQ7CisJCWZ1bmN0aW9uIHNldENoaWxkSW5kZXgodDpPYmplY3QsIGluZGV4OmludCk6dm9pZDsKKwkKKwkJLyoqIFJlcGxhY2UgZnJvbSBzdGFydCB0byBzdG9wIGNoaWxkIGluZGV4IG9mIHBhcmVudCB3aXRoIHQsIHdoaWNoIG1pZ2h0CisJCSAqICBiZSBhIGxpc3QuICBOdW1iZXIgb2YgY2hpbGRyZW4gbWF5IGJlIGRpZmZlcmVudAorCQkgKiAgYWZ0ZXIgdGhpcyBjYWxsLgorCQkgKgorCQkgKiAgSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorCQkgKiAgQ2FuJ3QgcmVwbGFjZSB3aGF0ZXZlciBwb2ludHMgdG8gdGhlIHBhcmVudCBleHRlcm5hbGx5LiAgRG8gbm90aGluZy4KKwkJICovCisJCWZ1bmN0aW9uIHJlcGxhY2VDaGlsZHJlbihwYXJlbnQ6T2JqZWN0LCBzdGFydENoaWxkSW5kZXg6aW50LCBzdG9wQ2hpbGRJbmRleDppbnQsIHQ6T2JqZWN0KTp2b2lkOwkKKwkJCisJCQorCQkvLyBDb2RlIC0gZ2VuZXJhdG9yIHN1cHBvcnQgLSBUT0RPIHBsYWNlIGluIHNlcGFyYXRlIG5hbWVzcGFjZQorCQkKKwkJLyoqCisJCSAqIFByaXZhdGUgbWV0aG9kIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUuICBCYXNlZCBvbiB0eXBlIGFuZCBudW1iZXIgb2YgYXJndW1lbnRzIHdpbGwgY2FsbCBvbmUgb2Y6CisJCSAqIAorCQkgKiAJKiBjcmVhdGVXaXRoUGF5bG9hZAorCQkgKiAgKiBjcmVhdGVGcm9tVG9rZW4KKwkJICogICogY3JlYXRlRnJvbVR5cGUgCisJCSAqLworCQlmdW5jdGlvbiBjcmVhdGUoLi4uIGFyZ3MpOk9iamVjdDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZUNvbnN0YW50cy5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVDb25zdGFudHMuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmYWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVDb25zdGFudHMuYXMKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUKK3sKKwlpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5Db25zdGFudHM7CisJCisJcHVibGljIGNsYXNzIFRyZWVDb25zdGFudHMgeworCQlwdWJsaWMgc3RhdGljIGNvbnN0IElOVkFMSURfTk9ERTpDb21tb25UcmVlID0gQ29tbW9uVHJlZS5jcmVhdGVGcm9tVG9rZW4oVG9rZW5Db25zdGFudHMuSU5WQUxJRF9UT0tFTik7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVOb2RlU3RyZWFtLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZU5vZGVTdHJlYW0uYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxM2NjOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVOb2RlU3RyZWFtLmFzCkBAIC0wLDAgKzEsMTAyIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUgeworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5JbnRTdHJlYW07CisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuU3RyZWFtOworCQorCS8qKiBBIHN0cmVhbSBvZiB0cmVlIG5vZGVzLCBhY2Nlc3Npbmcgbm9kZXMgZnJvbSBhIHRyZWUgb2Ygc29tZSBraW5kICovCisJcHVibGljIGludGVyZmFjZSBUcmVlTm9kZVN0cmVhbSBleHRlbmRzIEludFN0cmVhbSB7CisJCS8qKiBHZXQgYSB0cmVlIG5vZGUgYXQgYW4gYWJzb2x1dGUgaW5kZXggaTsgMC4ubi0xLgorCQkgKiAgSWYgeW91IGRvbid0IHdhbnQgdG8gYnVmZmVyIHVwIG5vZGVzLCB0aGVuIHRoaXMgbWV0aG9kIG1ha2VzIG5vCisJCSAqICBzZW5zZSBmb3IgeW91LgorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0Tm9kZShpOmludCk6T2JqZWN0OworCQorCQkvKiogR2V0IHRyZWUgbm9kZSBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkIHdoZXJlIGk9MSBpcyBuZXh0IG5vZGUuCisJCSAqICBpPDAgaW5kaWNhdGVzIG5vZGVzIGluIHRoZSBwYXN0LiAgU28gTFQoLTEpIGlzIHByZXZpb3VzIG5vZGUsIGJ1dAorCQkgKiAgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gcHJvdmlkZSByZXN1bHRzIGZvciBrIDwgLTEuCisJCSAqICBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgaT49biwgcmV0dXJuIG51bGwuCisJCSAqICBSZXR1cm4gbnVsbCBmb3IgTFQoMCkgYW5kIGFueSBpbmRleCB0aGF0IHJlc3VsdHMgaW4gYW4gYWJzb2x1dGUgYWRkcmVzcworCQkgKiAgdGhhdCBpcyBuZWdhdGl2ZS4KKwkJICoKKwkJICogIFRoaXMgaXMgYW5hbG9ndXMgdG8gdGhlIExUKCkgbWV0aG9kIG9mIHRoZSBUb2tlblN0cmVhbSwgYnV0IHRoaXMKKwkJICogIHJldHVybnMgYSB0cmVlIG5vZGUgaW5zdGVhZCBvZiBhIHRva2VuLiAgTWFrZXMgY29kZSBnZW4gaWRlbnRpY2FsCisJCSAqICBmb3IgYm90aCBwYXJzZXIgYW5kIHRyZWUgZ3JhbW1hcnMuIDopCisJCSAqLworCQlmdW5jdGlvbiBMVChrOmludCk6T2JqZWN0OworCQorCQkvKiogV2hlcmUgaXMgdGhpcyBzdHJlYW0gcHVsbGluZyBub2RlcyBmcm9tPyAgVGhpcyBpcyBub3QgdGhlIG5hbWUsIGJ1dAorCQkgKiAgdGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG5vZGUgb2JqZWN0cy4KKwkJICovCisJCWZ1bmN0aW9uIGdldCB0cmVlU291cmNlKCk6T2JqZWN0OworCQorCQkvKiogSWYgdGhlIHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtIHdhcyBjcmVhdGVkIGZyb20gYSBUb2tlblN0cmVhbSwKKwkJICogIHlvdSBjYW4gc3BlY2lmeSBpdCBoZXJlLiAgVXNlZCB0byBkbyBydWxlICR0ZXh0IGF0dHJpYnV0ZSBpbiB0cmVlCisJCSAqICBwYXJzZXIuICBPcHRpb25hbCB1bmxlc3MgeW91IHVzZSB0cmVlIHBhcnNlciBydWxlIHRleHQgYXR0cmlidXRlCisJCSAqICBvciBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBvcHRpb25zLgorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IHRva2VuU3RyZWFtKCk6VG9rZW5TdHJlYW07CisJCisJCS8qKiBXaGF0IGFkYXB0b3IgY2FuIHRlbGwgbWUgaG93IHRvIGludGVycHJldC9uYXZpZ2F0ZSBub2RlcyBhbmQKKwkJICogIHRyZWVzLiAgRS5nLiwgZ2V0IHRleHQgb2YgYSBub2RlLgorCQkgKi8KKwkJZnVuY3Rpb24gZ2V0IHRyZWVBZGFwdG9yKCk6VHJlZUFkYXB0b3I7CisJCisJCS8qKiBBcyB3ZSBmbGF0dGVuIHRoZSB0cmVlLCB3ZSB1c2UgVVAsIERPV04gbm9kZXMgdG8gcmVwcmVzZW50CisJCSAqICB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworCQkgKiAgc28gd2UgaGF2ZSB0byBpbnN0YW50aWF0ZSBuZXcgb25lcy4gIFdoZW4gZG9pbmcgbm9ybWFsIHRyZWUKKwkJICogIHBhcnNpbmcsIGl0J3Mgc2xvdyBhbmQgYSB3YXN0ZSBvZiBtZW1vcnkgdG8gY3JlYXRlIHVuaXF1ZQorCQkgKiAgbmF2aWdhdGlvbiBub2Rlcy4gIERlZmF1bHQgc2hvdWxkIGJlIGZhbHNlOworCQkgKi8KKwkJZnVuY3Rpb24gc2V0IGhhc1VuaXF1ZU5hdmlnYXRpb25Ob2Rlcyh1bmlxdWVOYXZpZ2F0aW9uTm9kZXM6Qm9vbGVhbik6dm9pZDsKKwkKKwkJLyoqIFJldHVybiB0aGUgdGV4dCBvZiBhbGwgbm9kZXMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisJCSAqICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIG5vZGVzIHRoZW4gaXQgY2FuIHN0aWxsCisJCSAqICB3YWxrIHJlY3Vyc2l2ZWx5IGZyb20gc3RhcnQgdW50aWwgc3RvcC4gIFlvdSBjYW4gYWx3YXlzIHJldHVybgorCQkgKiAgbnVsbCBvciAiIiB0b28sIGJ1dCB1c2VycyBzaG91bGQgbm90IGFjY2VzcyAkcnVsZUxhYmVsLnRleHQgaW4KKwkJICogIGFuIGFjdGlvbiBvZiBjb3Vyc2UgaW4gdGhhdCBjYXNlLgorCQkgKi8KKwkJZnVuY3Rpb24gdG9TdHJpbmdXaXRoUmFuZ2Uoc3RhcnQ6T2JqZWN0LCBzdG9wOk9iamVjdCk6U3RyaW5nOworCQkKKwkJLy8gUkVXUklUSU5HIFRSRUVTICh1c2VkIGJ5IHRyZWUgcGFyc2VyKQorCisJCS8qKiBSZXBsYWNlIGZyb20gc3RhcnQgdG8gc3RvcCBjaGlsZCBpbmRleCBvZiBwYXJlbnQgd2l0aCB0LCB3aGljaCBtaWdodAorCQkgKiAgYmUgYSBsaXN0LiAgTnVtYmVyIG9mIGNoaWxkcmVuIG1heSBiZSBkaWZmZXJlbnQKKwkJICogIGFmdGVyIHRoaXMgY2FsbC4gIFRoZSBzdHJlYW0gaXMgbm90aWZpZWQgYmVjYXVzZSBpdCBpcyB3YWxraW5nIHRoZQorCQkgKiAgdHJlZSBhbmQgbWlnaHQgbmVlZCB0byBrbm93IHlvdSBhcmUgbW9ua2V5aW5nIHdpdGggdGhlIHVuZGVybHlpbmcKKwkJICogIHRyZWUuICBBbHNvLCBpdCBtaWdodCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgbm9kZSBzdHJlYW0gdG8gYXZvaWQKKwkJICogIHJlc3RyZWFtaW5nIGZvciBmdXR1cmUgcGhhc2VzLgorCQkgKgorCQkgKiAgSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorCQkgKiAgQ2FuJ3QgcmVwbGFjZSB3aGF0ZXZlciBwb2ludHMgdG8gdGhlIHBhcmVudCBleHRlcm5hbGx5LiAgRG8gbm90aGluZy4KKwkJICovCisJCWZ1bmN0aW9uIHJlcGxhY2VDaGlsZHJlbihwYXJlbnQ6T2JqZWN0LCBzdGFydENoaWxkSW5kZXg6aW50LCBzdG9wQ2hpbGRJbmRleDppbnQsIHQ6T2JqZWN0KTp2b2lkOworCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3Qvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXJzZXIuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwZmIzYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXJzZXIuYXMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlIHsKKwlpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKKwkKKwkvKiogQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKKwkgKiAgb2YgdGhpcy4gIEFsbCB0aGUgZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeSBpcyBzaGFyZWQgd2l0aCBQYXJzZXIgdmlhCisJICogIHRoZSBCYXNlUmVjb2duaXplciBzdXBlcmNsYXNzLgorCSovCisJcHVibGljIGNsYXNzIFRyZWVQYXJzZXIgZXh0ZW5kcyBCYXNlUmVjb2duaXplciB7CisJCXB1YmxpYyBzdGF0aWMgY29uc3QgRE9XTjppbnQgPSBUb2tlbkNvbnN0YW50cy5ET1dOOworCQlwdWJsaWMgc3RhdGljIGNvbnN0IFVQOmludCA9IFRva2VuQ29uc3RhbnRzLlVQOworCQorCQlwcm90ZWN0ZWQgdmFyIGlucHV0OlRyZWVOb2RlU3RyZWFtOworCQorCQlwdWJsaWMgZnVuY3Rpb24gVHJlZVBhcnNlcihpbnB1dDpUcmVlTm9kZVN0cmVhbSwgc3RhdGU6UmVjb2duaXplclNoYXJlZFN0YXRlID0gbnVsbCkgeworCQkJc3VwZXIoc3RhdGUpOworCQkJdHJlZU5vZGVTdHJlYW0gPSBpbnB1dDsKKwkJfQorCQorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVzZXQoKTp2b2lkIHsKKwkJCXN1cGVyLnJlc2V0KCk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworCQkJaWYgKCBpbnB1dCE9bnVsbCApIHsKKwkJCQlpbnB1dC5zZWVrKDApOyAvLyByZXdpbmQgdGhlIGlucHV0CisJCQl9CisJCX0KKwkKKwkJLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtICovCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgdHJlZU5vZGVTdHJlYW0oaW5wdXQ6VHJlZU5vZGVTdHJlYW0pOnZvaWQgeworCQkJdGhpcy5pbnB1dCA9IGlucHV0OworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiBnZXQgdHJlZU5vZGVTdHJlYW0oKTpUcmVlTm9kZVN0cmVhbSB7CisJCQlyZXR1cm4gaW5wdXQ7CisJCX0KKwkJCisJCXB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgc291cmNlTmFtZSgpOlN0cmluZyB7CisJCQlyZXR1cm4gaW5wdXQuc291cmNlTmFtZTsKKwkJfQorCQorCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0Q3VycmVudElucHV0U3ltYm9sKGlucHV0OkludFN0cmVhbSk6T2JqZWN0IHsKKwkJCXJldHVybiBUcmVlTm9kZVN0cmVhbShpbnB1dCkuTFQoMSk7CisJCX0KKwkKKwkJcHJvdGVjdGVkIG92ZXJyaWRlIGZ1bmN0aW9uIGdldE1pc3NpbmdTeW1ib2woaW5wdXQ6SW50U3RyZWFtLAorCQkJCQkJCQkJCSAgIGU6UmVjb2duaXRpb25FeGNlcHRpb24sCisJCQkJCQkJCQkJICAgZXhwZWN0ZWRUb2tlblR5cGU6aW50LAorCQkJCQkJCQkJCSAgIGZvbGxvdzpCaXRTZXQpOk9iamVjdCB7CisJCQl2YXIgdG9rZW5UZXh0OlN0cmluZyA9CisJCQkJIjxtaXNzaW5nICIrdG9rZW5OYW1lc1tleHBlY3RlZFRva2VuVHlwZV0rIj4iOworCQkJcmV0dXJuIENvbW1vblRyZWUuY3JlYXRlRnJvbVRva2VuKG5ldyBDb21tb25Ub2tlbihleHBlY3RlZFRva2VuVHlwZSwgdG9rZW5UZXh0KSk7CisJCX0JCisJCQorCQkvKiogTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKwkJICogIGVudGlyZSB0cmVlIGlmIG5vZGUgaGFzIGNoaWxkcmVuLiAgSWYgY2hpbGRyZW4sIHNjYW4gdW50aWwKKwkJICogIGNvcnJlc3BvbmRpbmcgVVAgbm9kZS4KKwkJICovCisJCXB1YmxpYyBmdW5jdGlvbiBtYXRjaEFueShpZ25vcmU6SW50U3RyZWFtKTp2b2lkIHsgLy8gaWdub3JlIHN0cmVhbSwgY29weSBvZiB0aGlzLmlucHV0CisJCQlzdGF0ZS5lcnJvclJlY292ZXJ5ID0gZmFsc2U7CisJCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKwkJCXZhciBsb29rOk9iamVjdCA9IGlucHV0LkxUKDEpOworCQkJaWYgKCBpbnB1dC50cmVlQWRhcHRvci5nZXRDaGlsZENvdW50KGxvb2spPT0wICkgeworCQkJCWlucHV0LmNvbnN1bWUoKTsgLy8gbm90IHN1YnRyZWUsIGNvbnN1bWUgMSBub2RlIGFuZCByZXR1cm4KKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBjdXJyZW50IG5vZGUgaXMgYSBzdWJ0cmVlLCBza2lwIHRvIGNvcnJlc3BvbmRpbmcgVVAuCisJCQkvLyBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCisJCQl2YXIgbGV2ZWw6aW50PTA7CisJCQl2YXIgdG9rZW5UeXBlOmludCA9IGlucHV0LnRyZWVBZGFwdG9yLmdldFR5cGUobG9vayk7CisJCQl3aGlsZSAoIHRva2VuVHlwZSE9VG9rZW5Db25zdGFudHMuRU9GICYmICEodG9rZW5UeXBlPT1VUCAmJiBsZXZlbD09MCkgKSB7CisJCQkJaW5wdXQuY29uc3VtZSgpOworCQkJCWxvb2sgPSBpbnB1dC5MVCgxKTsKKwkJCQl0b2tlblR5cGUgPSBpbnB1dC50cmVlQWRhcHRvci5nZXRUeXBlKGxvb2spOworCQkJCWlmICggdG9rZW5UeXBlID09IERPV04gKSB7CisJCQkJCWxldmVsKys7CisJCQkJfQorCQkJCWVsc2UgaWYgKCB0b2tlblR5cGUgPT0gVVAgKSB7CisJCQkJCWxldmVsLS07CisJCQkJfQorCQkJfQorCQkJaW5wdXQuY29uc3VtZSgpOyAvLyBjb25zdW1lIFVQCisJCX0KKwkKKwkJLyoqIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgorCQkgKiAgcGx1cyB3ZSB3YW50IHRvIGFsdGVyIHRoZSBleGNlcHRpb24gdHlwZS4gRG9uJ3QgdHJ5IHRvIHJlY292ZXIKKwkgCSAqICBmcm9tIHRyZWUgcGFyc2VyIGVycm9ycyBpbmxpbmUuLi4KKwkJICovCisJCXByb3RlY3RlZCBvdmVycmlkZSBmdW5jdGlvbiBtaXNtYXRjaChpbnB1dDpJbnRTdHJlYW0sIHR0eXBlOmludCwgZm9sbG93OkJpdFNldCk6dm9pZCB7CisJCQl0aHJvdyBuZXcgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKHR0eXBlLCBUcmVlTm9kZVN0cmVhbShpbnB1dCkpOworCQl9CisJCisJCS8qKiBQcmVmaXggZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBncmFtbWFyIG5hbWUgYmVjYXVzZSBtZXNzYWdlIGlzCisJCSAqICBhbHdheXMgaW50ZW5kZWQgZm9yIHRoZSBwcm9ncmFtbWVyIGJlY2F1c2UgdGhlIHBhcnNlciBidWlsdAorCQkgKiAgdGhlIGlucHV0IHRyZWUgbm90IHRoZSB1c2VyLgorCQkgKi8KKwkJcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldEVycm9ySGVhZGVyKGU6UmVjb2duaXRpb25FeGNlcHRpb24pOlN0cmluZyB7CisJCQlyZXR1cm4gZ3JhbW1hckZpbGVOYW1lKyI6IG5vZGUgZnJvbSAiKworCQkJCSAgIChlLmFwcHJveGltYXRlTGluZUluZm8/ImFmdGVyICI6IiIpKyJsaW5lICIrZS5saW5lKyI6IitlLmNoYXJQb3NpdGlvbkluTGluZTsKKwkJfQorCQorCQkvKiogVHJlZSBwYXJzZXJzIHBhcnNlIG5vZGVzIHRoZXkgdXN1YWxseSBoYXZlIGEgdG9rZW4gb2JqZWN0IGFzCisJCSAqICBwYXlsb2FkLiBTZXQgdGhlIGV4Y2VwdGlvbiB0b2tlbiBhbmQgZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisJCSAqLworCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGU6UmVjb2duaXRpb25FeGNlcHRpb24sIHRva2VuTmFtZXM6QXJyYXkpOlN0cmluZyB7CisJCQlpZiAoIHRoaXMgaXMgVHJlZVBhcnNlciApIHsKKwkJCQl2YXIgYWRhcHRvcjpUcmVlQWRhcHRvciA9IFRyZWVOb2RlU3RyZWFtKGUuaW5wdXQpLnRyZWVBZGFwdG9yOworCQkJCWUudG9rZW4gPSBhZGFwdG9yLmdldFRva2VuKGUubm9kZSk7CisJCQkJaWYgKCBlLnRva2VuPT1udWxsICkgeyAvLyBjb3VsZCBiZSBhbiBVUC9ET1dOIG5vZGUKKwkJCQkJZS50b2tlbiA9IG5ldyBDb21tb25Ub2tlbihhZGFwdG9yLmdldFR5cGUoZS5ub2RlKSwKKwkJCQkJCQkJCQkJICBhZGFwdG9yLmdldFRleHQoZS5ub2RlKSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKKwkJfQorCQorCSAgIHB1YmxpYyBmdW5jdGlvbiBzZXQgdHJlZUFkYXB0b3IoYWRhcHRvcjpUcmVlQWRhcHRvcik6dm9pZCB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBpbXBsZW1lbnRlZCBpbiBnZW5lcmF0ZWQgY29kZQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0IHRyZWVBZGFwdG9yKCk6VHJlZUFkYXB0b3IgeworICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorCQlwdWJsaWMgZnVuY3Rpb24gdHJhY2VJbihydWxlTmFtZTpTdHJpbmcsIHJ1bGVJbmRleDppbnQpOnZvaWQgIHsKKwkJCXN1cGVyLnRyYWNlSW5TeW1ib2wocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoMSkpOworCQl9CisJCisJCXB1YmxpYyBmdW5jdGlvbiB0cmFjZU91dChydWxlTmFtZTpTdHJpbmcsIHJ1bGVJbmRleDppbnQpOnZvaWQgIHsKKwkJCXN1cGVyLnRyYWNlT3V0U3ltYm9sKHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0LkxUKDEpKTsKKwkJfQorCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUnVsZVJldHVyblNjb3BlLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUnVsZVJldHVyblNjb3BlLmFzCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlIHsKKwkKKwlpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUnVsZVJldHVyblNjb3BlOworCisJLyoqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgZXhjZXB0IHRoYXQKKwkgKiAgdGhlIHN0YXJ0IHByb3BlcnR5IGlzIGEgdHJlZSBub2RlcyBub3QgVG9rZW4gb2JqZWN0CisJICogIHdoZW4geW91IGFyZSBwYXJzaW5nIHRyZWVzLiAgVG8gYmUgZ2VuZXJpYyB0aGUgdHJlZSBub2RlIHR5cGVzCisJICogIGhhdmUgdG8gYmUgT2JqZWN0LgorCSAqLworCXB1YmxpYyBjbGFzcyBUcmVlUnVsZVJldHVyblNjb3BlIGV4dGVuZHMgUnVsZVJldHVyblNjb3BlIHsKKwkJCisJCS8qKiBGaXJzdCBub2RlIG9yIHJvb3Qgbm9kZSBvZiB0cmVlIG1hdGNoZWQgZm9yIHRoaXMgcnVsZS4gKi8KKwkJcHJvdGVjdGVkIHZhciBfc3RhcnQ6T2JqZWN0OworCQlwcml2YXRlIHZhciBfdHJlZTpPYmplY3Q7ICAvLyBpZiBvdXRwdXQ9QVNUIHRoaXMgY29udGFpbnMgdGhlIHRyZWUKKwkJcHJpdmF0ZSB2YXIgX3ZhbHVlczpPYmplY3QgPSBuZXcgT2JqZWN0KCk7IC8vIGNvbnRhaW5zIHRoZSByZXR1cm4gdmFsdWVzCisJCQorCQkvKiogSGFzIGEgdmFsdWUgcG90ZW50aWFsbHkgaWYgb3V0cHV0PUFTVDsgKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGdldCB0cmVlKCk6T2JqZWN0IHsKKyAgICAgICAgICAgICByZXR1cm4gX3RyZWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQgdHJlZSh0cmVlOk9iamVjdCk6dm9pZCB7CisgICAgICAgICAgICBfdHJlZSA9IHRyZWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBnZXQgdmFsdWVzKCk6T2JqZWN0IHsKKyAgICAgICAgICAgIHJldHVybiBfdmFsdWVzOworICAgICAgICB9CisgICAgICAgIAorCQlwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHN0YXJ0KCk6T2JqZWN0IHsKKwkJCXJldHVybiBfc3RhcnQ7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiBzZXQgc3RhcnQodmFsdWU6T2JqZWN0KTp2b2lkIHsKKwkJCV9zdGFydCA9IHZhbHVlOworCQl9CisJCQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdmVyc2lvbi5hcyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3NyYy9vcmcvYW50bHIvcnVudGltZS92ZXJzaW9uLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjc1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdmVyc2lvbi5hcwpAQCAtMCwwICsxLDMgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUgeworCXB1YmxpYyBjb25zdCB2ZXJzaW9uOlN0cmluZyA9ICIzLjEuMy4yIjsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3Rlc3QvQW50bHIzVGVzdC5teG1sIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvdGVzdC9BbnRscjNUZXN0Lm14bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNWI3MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3Rlc3QvQW50bHIzVGVzdC5teG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bXg6QXBwbGljYXRpb24geG1sbnM6bXg9Imh0dHA6Ly93d3cuYWRvYmUuY29tLzIwMDYvbXhtbCIgbGF5b3V0PSJ2ZXJ0aWNhbCIgY3JlYXRpb25Db21wbGV0ZT0ib25DcmVhdGlvbkNvbXBsZXRlKCkiPgorCisJPG14OlNjcmlwdD4KKyAgICAgICAgICAgIDwhW0NEQVRBWworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudGVzdC5BbGxUZXN0czsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGZsZXh1bml0Lmp1bml0LkpVbml0VGVzdFJ1bm5lcjsKKworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgW0JpbmRhYmxlXQorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZhciBydW5uZXIgOiBKVW5pdFRlc3RSdW5uZXI7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGZ1bmN0aW9uIG9uQ3JlYXRpb25Db21wbGV0ZSgpIDogdm9pZAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gIlBsZWFzZSB3YWl0IHJ1bm5pbmcgdGVzdCBzdWl0ZS4uLiI7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5lciA9IG5ldyBKVW5pdFRlc3RSdW5uZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uZXIucnVuKCBuZXcgQWxsVGVzdHMoKSwgb25UZXN0Q29tcGxldGUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBmdW5jdGlvbiBvblRlc3RDb21wbGV0ZSgpIDogdm9pZAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gIkZpbmlzaGVkIHJ1bm5pbmcgdGVzdCBzdWl0ZS4iOworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc2NvbW1hbmQoICJxdWl0IiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgXV0+CisgICA8L214OlNjcmlwdD4KKyAgICAgICAgCisgICAgPG14OkxhYmVsIGlkPSJzdGF0dXMiIC8+CisJCis8L214OkFwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvdGVzdC9vcmcvYW50bHIvcnVudGltZS90ZXN0L0FsbFRlc3RzLmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvdGVzdC9vcmcvYW50bHIvcnVudGltZS90ZXN0L0FsbFRlc3RzLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOWFiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC90ZXN0L29yZy9hbnRsci9ydW50aW1lL3Rlc3QvQWxsVGVzdHMuYXMKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50ZXN0IHsKKwlpbXBvcnQgZmxleHVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKwkKKwkKKwlwdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgeworCQkKKwkJcHVibGljIGZ1bmN0aW9uIEFsbFRlc3RzKCkgeworCQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RBTlRMUlN0cmluZ1N0cmVhbSkpOworCQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RCaXRTZXQpKTsKKwkJCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0REZBKSk7CisJCX0KKwkJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3Rlc3Qvb3JnL2FudGxyL3J1bnRpbWUvdGVzdC9UZXN0QU5UTFJTdHJpbmdTdHJlYW0uYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC90ZXN0L29yZy9hbnRsci9ydW50aW1lL3Rlc3QvVGVzdEFOVExSU3RyaW5nU3RyZWFtLmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjVhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC90ZXN0L29yZy9hbnRsci9ydW50aW1lL3Rlc3QvVGVzdEFOVExSU3RyaW5nU3RyZWFtLmFzCkBAIC0wLDAgKzEsMTMxIEBACitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRlc3QgeworCWltcG9ydCBmbGV4dW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisJCisJaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtOworCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtQ29uc3RhbnRzOworCQorCXB1YmxpYyBjbGFzcyBUZXN0QU5UTFJTdHJpbmdTdHJlYW0gZXh0ZW5kcyBUZXN0Q2FzZSB7CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gVGVzdEFOVExSU3RyaW5nU3RyZWFtKCkJeworCQkJc3VwZXIoKTsKKwkJfQorCQkKKwkJcHVibGljIGZ1bmN0aW9uIHRlc3RDb25zdW1lKCk6dm9pZCB7CisJCQl2YXIgc3RyZWFtOkNoYXJTdHJlYW0gPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5zaXplLCAzKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAwKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0ubGluZSwgMSk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmluZGV4LCAwKTsKKwkJCQorCQkJZm9yICh2YXIgaTppbnQgPSAwOyBpIDwgc3RyZWFtLnNpemU7IGkrKykgeworCQkJCXN0cmVhbS5jb25zdW1lKCk7CisJCQkJCisJCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5zaXplLCAzKTsgLy8gaW52YXJpYW50CisJCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIGkgKyAxKTsgIAorCQkJCWFzc2VydEVxdWFscyhzdHJlYW0ubGluZSwgMSk7IC8vIGludmFyaWFudAorCQkJCWFzc2VydEVxdWFscyhzdHJlYW0uaW5kZXgsIGkgKyAxKTsKKwkJCX0KKwkJCQorCQkJLy8gbm93IGNvbnN1bWUgcGFzdCBFT0YgZm9yIGEgZmV3IHRpY2tzLCBub3RoaW5nIHNob3VsZCBjaGFuZ2UKKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQlzdHJlYW0uY29uc3VtZSgpOworCQkJCQorCQkJCWFzc2VydEVxdWFscyhzdHJlYW0uc2l6ZSwgMyk7IC8vIGludmFyaWFudAorCQkJCWFzc2VydEVxdWFscyhzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAzKTsgIAorCQkJCWFzc2VydEVxdWFscyhzdHJlYW0ubGluZSwgMSk7IC8vIGludmFyaWFudAorCQkJCWFzc2VydEVxdWFscyhzdHJlYW0uaW5kZXgsIDMpOworCQkJfQorCQkJCQorCQl9CisJCQorCQlwdWJsaWMgZnVuY3Rpb24gdGVzdExBKCk6dm9pZCB7CisJCQl2YXIgc3RyZWFtOkNoYXJTdHJlYW0gPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5MQSgtMSksIENoYXJTdHJlYW1Db25zdGFudHMuRU9GKTsgIC8vIHNob3VsZCBiZSBFT0YKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uTEEoMCksIDApOyAvLyBzaG91bGQgYmUgMCAodW5kZWZpbmVkKQorCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5MQSgxKSwgImEiLmNoYXJDb2RlQXQoMCkpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5MQSgyKSwgImIiLmNoYXJDb2RlQXQoMCkpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5MQSgzKSwgImMiLmNoYXJDb2RlQXQoMCkpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5MQSg0KSwgQ2hhclN0cmVhbUNvbnN0YW50cy5FT0YpOworCQkJCisJCQkvLyBub3cgY29uc3VtZSgpIG9uZSBieXRlIGFuZCBydW4gc29tZSBtb3JlIHRlc3RzLgorCQkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uTEEoLTIpLCBDaGFyU3RyZWFtQ29uc3RhbnRzLkVPRik7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLkxBKC0xKSwgImEiLmNoYXJDb2RlQXQoMCkpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5MQSgwKSwgMCk7IC8vIHNob3VsZCBiZSAwICh1bmRlZmluZWQpCisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLkxBKDEpLCAiYiIuY2hhckNvZGVBdCgwKSk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLkxBKDIpLCAiYyIuY2hhckNvZGVBdCgwKSk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLkxBKDMpLCBDaGFyU3RyZWFtQ29uc3RhbnRzLkVPRik7CisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVzZXQoKTp2b2lkIHsKKwkJCXZhciBzdHJlYW06QU5UTFJTdHJpbmdTdHJlYW0gPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5zaXplLCAzKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAwKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0ubGluZSwgMSk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmluZGV4LCAwKTsKKwkJCQorCQkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJCXN0cmVhbS5jb25zdW1lKCk7CisJCQkKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uc2l6ZSwgMyk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMik7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmxpbmUsIDEpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5pbmRleCwgMik7CisJCQkKKwkJCXN0cmVhbS5yZXNldCgpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLnNpemUsIDMpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDApOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5saW5lLCAxKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uaW5kZXgsIDApOworCQkJCisJCX0KKwkJCisJCXB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFyaygpOnZvaWQgeworCQkJdmFyIHN0cmVhbTpBTlRMUlN0cmluZ1N0cmVhbSA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYVxuYmMiKTsKKwkJCQorCQkJLy8gc2V0dXAgYSBjb3VwbGUgb2YgbWFya2VycworCQkJdmFyIG1hcmsxOmludCA9IHN0cmVhbS5tYXJrKCk7CisJCQlzdHJlYW0uY29uc3VtZSgpOworCQkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJCXZhciBtYXJrMjppbnQgPSBzdHJlYW0ubWFyaygpOworCQkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJCQorCQkJLy8gbWFrZSBzdXJlIHdlIGFyZSB3aGVyZSB3ZSBleHBlY3QgdG8gYmUKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAxKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0ubGluZSwgMik7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmluZGV4LCAzKTsKKwkJCQorCQkJYXNzZXJ0RXF1YWxzKG1hcmsxLCAxKTsKKwkJCWFzc2VydFRydWUobWFyazEgIT0gbWFyazIpOworCQkJCisJCQlzdHJlYW0ucmV3aW5kVG8obWFyazIpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDApOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5saW5lLCAyKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uaW5kZXgsIDIpOworCQkJCisJCQlzdHJlYW0ucmV3aW5kVG8obWFyazEpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5pbmRleCwgMCk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMCk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmxpbmUsIDEpOworCQkJCisJCQkvLyB0ZXN0IHR3by1sZXZlbCByZXdpbmQKKwkJCW1hcmsxID0gc3RyZWFtLm1hcmsoKTsKKwkJCXN0cmVhbS5jb25zdW1lKCk7CisJCQlzdHJlYW0uY29uc3VtZSgpOworCQkJc3RyZWFtLm1hcmsoKTsKKwkJCXN0cmVhbS5jb25zdW1lKCk7CisJCQkKKwkJCS8vIG1ha2Ugc3VyZSB3ZSBhcmUgd2hlcmUgd2UgZXhwZWN0IHRvIGJlCisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMSk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmxpbmUsIDIpOworCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbS5pbmRleCwgMyk7CisJCQkKKwkJCXN0cmVhbS5yZXdpbmRUbyhtYXJrMSk7CisJCQlhc3NlcnRFcXVhbHMoc3RyZWFtLmluZGV4LCAwKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAwKTsKKwkJCWFzc2VydEVxdWFscyhzdHJlYW0ubGluZSwgMSk7CQorCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3Rlc3Qvb3JnL2FudGxyL3J1bnRpbWUvdGVzdC9UZXN0Qml0U2V0LmFzIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvdGVzdC9vcmcvYW50bHIvcnVudGltZS90ZXN0L1Rlc3RCaXRTZXQuYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0MDYzNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0FjdGlvblNjcmlwdC9wcm9qZWN0L3Rlc3Qvb3JnL2FudGxyL3J1bnRpbWUvdGVzdC9UZXN0Qml0U2V0LmFzCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudGVzdCB7CisJaW1wb3J0IGZsZXh1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKwkKKwlpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0OworCQorCXB1YmxpYyBjbGFzcyBUZXN0Qml0U2V0IGV4dGVuZHMgVGVzdENhc2UgeworCQorCQlwdWJsaWMgZnVuY3Rpb24gdGVzdENvbnN0cnVjdG9yKCk6dm9pZCB7CisJCQkvLyBlbXB0eQorCQkJdmFyIGJpdFNldDpCaXRTZXQgPSBuZXcgQml0U2V0KCk7CisJCQkKKwkJCWFzc2VydEVxdWFscygwLCBiaXRTZXQubnVtQml0cyk7CisJCQlhc3NlcnRFcXVhbHMoMCwgYml0U2V0LnRvUGFja2VkQXJyYXkoKS5sZW5ndGgpOworCQkJYXNzZXJ0RXF1YWxzKDAsIGJpdFNldC5zaXplKTsKKwkJCWFzc2VydFRydWUoYml0U2V0LmlzTmlsKTsKKwkJCWFzc2VydEVxdWFscygie30iLCBiaXRTZXQudG9TdHJpbmcoKSk7CisJCQkKKwkJCWJpdFNldCA9IEJpdFNldC5vZigwLCAxLCAyKTsKKwkJCWFzc2VydEVxdWFscygzMiwgYml0U2V0Lm51bUJpdHMpOworCQkJYXNzZXJ0RXF1YWxzKDEsIGJpdFNldC50b1BhY2tlZEFycmF5KCkubGVuZ3RoKTsKKwkJCS8vYXNzZXJ0RXF1YWxzKDEsIGJpdFNldC5zaXplKTsKKwkJCWFzc2VydEZhbHNlKGJpdFNldC5pc05pbCk7CisJCQlhc3NlcnRFcXVhbHMoNywgaW50KGJpdFNldC50b1BhY2tlZEFycmF5KClbMF0pKTsKKwkJCWFzc2VydEVxdWFscygiezAsMSwyfSIsIGJpdFNldC50b1N0cmluZygpKTsKKwkJCQorCQkJCisJCX0JCisKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvdGVzdC9vcmcvYW50bHIvcnVudGltZS90ZXN0L1Rlc3RERkEuYXMgYi9hbnRsci0zLjQvcnVudGltZS9BY3Rpb25TY3JpcHQvcHJvamVjdC90ZXN0L29yZy9hbnRsci9ydW50aW1lL3Rlc3QvVGVzdERGQS5hcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTIzYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQWN0aW9uU2NyaXB0L3Byb2plY3QvdGVzdC9vcmcvYW50bHIvcnVudGltZS90ZXN0L1Rlc3RERkEuYXMKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50ZXN0IHsKKwlpbXBvcnQgZmxleHVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCQorCWltcG9ydCBvcmcuYW50bHIucnVudGltZS5ERkE7CisJCisJcHVibGljIGNsYXNzIFRlc3RERkEgZXh0ZW5kcyBUZXN0Q2FzZSB7CisJCisJCXB1YmxpYyBmdW5jdGlvbiB0ZXN0VW5wYWNrKCk6dm9pZCB7CisJCQkvLyBlbXB0eQorCQkJdmFyIHRlc3RWYWw6U3RyaW5nID0gIlx4MDFceDAyXHgwM1x4MDkiOworCQkJYXNzZXJ0RXF1YWxzKDQsIHRlc3RWYWwubGVuZ3RoKTsKKwkJCWFzc2VydEVxdWFscygiMiw5LDksOSIsIERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKCJceDAxXHgwMlx4MDNceDA5IikpOworCQkJCisJCQl0ZXN0VmFsID0gIlx4MDNcdTdmZmYiOworCQkJLy90ZXN0VmFsID0gU3RyaW5nLmZyb21DaGFyQ29kZSgzLCAweDdmZmYpOworCQkJCisJCQlhc3NlcnRFcXVhbHMoMiwgdGVzdFZhbC5sZW5ndGgpOworCQkJYXNzZXJ0RXF1YWxzKCIzMjc2NywzMjc2NywzMjc2NyIsIERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKHRlc3RWYWwpKTsKKwkJCWFzc2VydEVxdWFscygiMzI3NjcsMzI3NjcsMzI3NjciLCBERkEudW5wYWNrRW5jb2RlZFN0cmluZyh0ZXN0VmFsLCB0cnVlKSk7CisJCQkKKwkJCXRlc3RWYWwgPSAiXHgwMlx1ODBmZlx4ZmYiOworCQkJYXNzZXJ0RXF1YWxzKDMsIHRlc3RWYWwubGVuZ3RoKTsKKwkJCWFzc2VydEVxdWFscygiLTEsLTEiLCBERkEudW5wYWNrRW5jb2RlZFN0cmluZyh0ZXN0VmFsKSk7CisJCQlhc3NlcnRFcXVhbHMoIjY1NTM1LDY1NTM1IiwgREZBLnVucGFja0VuY29kZWRTdHJpbmcodGVzdFZhbCwgdHJ1ZSkpOworCisJCX0JCisKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9BVVRIT1JTIGIvYW50bHItMy40L3J1bnRpbWUvQy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTVhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL0FVVEhPUlMKQEAgLTAsMCArMSw0MSBAQAorVGhlIEFOVExSIHJlY29nbml6ZXIgZ2VuZXJhdG9yIHRvb2wgd2FzIHdyaXR0ZW4gYnkgKHdpdGggbWFueSBjb250cmlidXRpb25zKSAKKworICAgICBQcm9mLiBUZXJlbmNlIFBhcnIgYXQgVVNGCisKK1RoZSBDIHJ1bnRpbWUgYW5kIHJlbGF0ZWQgQyBjb2RlIGdlbmVyYXRpb24gZWxlbWVudHMgd2VyZSB3cml0dGVuIGJ5CisKKyAgICBKaW0gSWRsZSAoamltaSBpZGxlIHdzIHMvIC8uL2cpIHdpdGggbm8gY29udHJpYnV0aW9ucyBhdCBhbGwgYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ib2R5IGVsc2Ugd2FzIGNyYXp5IGVub3VnaCB0byBkbyBpdC4KKworVGhlIEMgcnVudGltZSBhbmQgdGhlIEFOTFRSIHRvb2wgaXRzZWxmIGFyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UKK3doaWNoIGJhc2ljYWxseSBnaXZlcyB0aGUgcmlnaHQgdG8gc28gYW55dGhpZ24gd2l0aCBpdCwgc28gbG9uZyBhcyB5b3UKK3JlY29nbml6ZSB0aGUgYXV0aG9ycy4gU2VlIGhlcmU6CisKKyBbVGhlICJCU0QgbGljZW5jZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisgaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKworIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL0Muc2xuIGIvYW50bHItMy40L3J1bnRpbWUvQy9DLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQxMTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9DLnNsbgpAQCAtMCwwICsxLDUzIEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMDgKK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiQyIsICJDLnZjcHJvaiIsICJ7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU291cmNlQ29kZUNvbnRyb2wpID0gcHJlU29sdXRpb24KKwkJU2NjTnVtYmVyT2ZQcm9qZWN0cyA9IDIKKwkJU2NjUHJvamVjdE5hbWUwID0gUGVyZm9yY2VcdTAwMjBQcm9qZWN0CisJCVNjY0xvY2FsUGF0aDAgPSAuLlxcLi4KKwkJU2NjUHJvdmlkZXIwID0gTVNTQ0NJOlBlcmZvcmNlXHUwMDIwU0NNCisJCVNjY1Byb2plY3RGaWxlUGF0aFJlbGF0aXZpemVkRnJvbUNvbm5lY3Rpb24wID0gcnVudGltZVxcQ1xcCisJCVNjY1Byb2plY3RVbmlxdWVOYW1lMSA9IEMudmNwcm9qCisJCVNjY0xvY2FsUGF0aDEgPSAuLlxcLi4KKwkJU2NjUHJvamVjdEZpbGVQYXRoUmVsYXRpdml6ZWRGcm9tQ29ubmVjdGlvbjEgPSBydW50aW1lXFxDXFwKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMgorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWdETEx8V2luMzIgPSBEZWJ1Z0RMTHxXaW4zMgorCQlEZWJ1Z0RMTHx4NjQgPSBEZWJ1Z0RMTHx4NjQKKwkJRGVwbG95bWVudHxXaW4zMiA9IERlcGxveW1lbnR8V2luMzIKKwkJRGVwbG95bWVudHx4NjQgPSBEZXBsb3ltZW50fHg2NAorCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMgorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2VETEx8V2luMzIgPSBSZWxlYXNlRExMfFdpbjMyCisJCVJlbGVhc2VETEx8eDY0ID0gUmVsZWFzZURMTHx4NjQKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWdETEx8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWdETEx8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWdETEx8V2luMzIuQnVpbGQuMCA9IERlYnVnRExMfFdpbjMyCisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LkRlYnVnRExMfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z0RMTHx4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWdETEx8eDY0LkJ1aWxkLjAgPSBEZWJ1Z0RMTHx4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVwbG95bWVudHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z0RMTHxXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZXBsb3ltZW50fFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z0RMTHxXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZXBsb3ltZW50fHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z0RMTHx4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVwbG95bWVudHx4NjQuQnVpbGQuMCA9IERlYnVnRExMfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uUmVsZWFzZURMTHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlRExMfFdpbjMyCisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LlJlbGVhc2VETEx8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VETEx8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uUmVsZWFzZURMTHx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZURMTHx4NjQKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uUmVsZWFzZURMTHx4NjQuQnVpbGQuMCA9IFJlbGVhc2VETEx8eDY0CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9DLnZjcHJvaiBiL2FudGxyLTMuNC9ydW50aW1lL0MvQy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkOWMyYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvQy52Y3Byb2oKQEAgLTAsMCArMSwxMDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOS4wMCIKKwlOYW1lPSJDIgorCVByb2plY3RHVUlEPSJ7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfSIKKwlSb290TmFtZXNwYWNlPSJDIgorCVNjY1Byb2plY3ROYW1lPSJQZXJmb3JjZSBQcm9qZWN0IgorCVNjY0xvY2FsUGF0aD0iLi5cLi4iCisJU2NjUHJvdmlkZXI9Ik1TU0NDSTpQZXJmb3JjZSBTQ00iCisJS2V5d29yZD0iV2luMzJQcm9qIgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJ4NjQiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IkRlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChTb2x1dGlvbkRpcilcaW5jbHVkZSZxdW90OzsmcXVvdDskKFNvbHV0aW9uRGlyKVwuLlwuLlxpbmNsdWRlJnF1b3Q7IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlNaW5pbWFsUmVidWlsZD0iZmFsc2UiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVN0cnVjdE1lbWJlckFsaWdubWVudD0iMCIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIwIgorCQkJCUZsb2F0aW5nUG9pbnRNb2RlbD0iMCIKKwkJCQlGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlFeHBhbmRBdHRyaWJ1dGVkU291cmNlPSJ0cnVlIgorCQkJCUFzc2VtYmxlck91dHB1dD0iMiIKKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjQiCisJCQkJV2FybkFzRXJyb3I9ImZhbHNlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDYWxsaW5nQ29udmVudGlvbj0iMCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iV3MyXzMyLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvYW50bHIzY2QubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3x4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChTb2x1dGlvbkRpcilcaW5jbHVkZSZxdW90OzsmcXVvdDskKFNvbHV0aW9uRGlyKVwuLlwuLlxpbmNsdWRlJnF1b3Q7IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlNaW5pbWFsUmVidWlsZD0iZmFsc2UiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVN0cnVjdE1lbWJlckFsaWdubWVudD0iMCIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIwIgorCQkJCUZsb2F0aW5nUG9pbnRNb2RlbD0iMCIKKwkJCQlGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlFeHBhbmRBdHRyaWJ1dGVkU291cmNlPSJ0cnVlIgorCQkJCUFzc2VtYmxlck91dHB1dD0iMiIKKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjQiCisJCQkJV2FybkFzRXJyb3I9ImZhbHNlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDYWxsaW5nQ29udmVudGlvbj0iMCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iV3MyXzMyLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvYW50bHIzY2QubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSJSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjMiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIgorCQkJCUZhdm9yU2l6ZU9yU3BlZWQ9IjEiCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiCisJCQkJRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz0idHJ1ZSIKKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChTb2x1dGlvbkRpcilcaW5jbHVkZSZxdW90OyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjEiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMiIKKwkJCQlGbG9hdGluZ1BvaW50TW9kZWw9IjIiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiCisJCQkJUnVudGltZVR5cGVJbmZvPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cYXNtXHJlbGVhc2UiCisJCQkJV2FybmluZ0xldmVsPSI0IgorCQkJCVdhcm5Bc0Vycm9yPSJ0cnVlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDYWxsaW5nQ29udmVudGlvbj0iMCIKKwkJCQlDb21waWxlQXM9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9MVENHIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IldzMl8zMi5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2FudGxyM2MubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJCVZhbGlkYXRlSW50ZWxsaVNlbnNlPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSIKKwkJCQlFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPSJ0cnVlIgorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFNvbHV0aW9uRGlyKVxpbmNsdWRlJnF1b3Q7IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIwIgorCQkJCUZsb2F0aW5nUG9pbnRNb2RlbD0iMiIKKwkJCQlSdW50aW1lVHlwZUluZm89ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxhc21ccmVsZWFzZSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjQiCisJCQkJV2FybkFzRXJyb3I9InRydWUiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL0xUQ0ciCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iV3MyXzMyLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvYW50bHIzYy5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkJVmFsaWRhdGVJbnRlbGxpU2Vuc2U9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2VETEx8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIgorCQkJCUVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM9InRydWUiCisJCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIxIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIgorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjIiCisJCQkJRmxvYXRpbmdQb2ludE1vZGVsPSIyIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIgorCQkJCVJ1bnRpbWVUeXBlSW5mbz0iZmFsc2UiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXGFzbVxyZWxlYXNlIgorCQkJCVdhcm5pbmdMZXZlbD0iNCIKKwkJCQlXYXJuQXNFcnJvcj0idHJ1ZSIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9ImZhbHNlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ2FsbGluZ0NvbnZlbnRpb249IjAiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IldzMl8zMi5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXGFudGxyM2MuZGxsIgorCQkJCVZlcnNpb249IjMuMS4xIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSIKKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCQlWYWxpZGF0ZUludGVsbGlTZW5zZT0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlRExMfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSIKKwkJCQlFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPSJ0cnVlIgorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFNvbHV0aW9uRGlyKVxpbmNsdWRlJnF1b3Q7IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIwIgorCQkJCUZsb2F0aW5nUG9pbnRNb2RlbD0iMiIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIKKwkJCQlSdW50aW1lVHlwZUluZm89ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxhc21ccmVsZWFzZSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjQiCisJCQkJV2FybkFzRXJyb3I9InRydWUiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxhbnRscjNjNjQuZGxsIgorCQkJCVZlcnNpb249IjMuMS4xIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSIKKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCQlWYWxpZGF0ZUludGVsbGlTZW5zZT0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z0RMTHxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlPdXRwdXRzPSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCU1pbmltYWxSZWJ1aWxkPSJmYWxzZSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjAiCisJCQkJRmxvYXRpbmdQb2ludE1vZGVsPSIwIgorCQkJCUZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUV4cGFuZEF0dHJpYnV0ZWRTb3VyY2U9InRydWUiCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iNCIKKwkJCQlXYXJuQXNFcnJvcj0iZmFsc2UiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxhbnRscjNjZC5kbGwiCisJCQkJVmVyc2lvbj0iMy4xLjEiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSIKKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z0RMTHx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlPdXRwdXRzPSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCU1pbmltYWxSZWJ1aWxkPSJmYWxzZSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjAiCisJCQkJRmxvYXRpbmdQb2ludE1vZGVsPSIwIgorCQkJCUZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUV4cGFuZEF0dHJpYnV0ZWRTb3VyY2U9InRydWUiCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iNCIKKwkJCQlXYXJuQXNFcnJvcj0iZmFsc2UiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxhbnRscjNjNjRkLmRsbCIKKwkJCQlWZXJzaW9uPSIzLjEuMSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJCUltcG9ydExpYnJhcnk9IiQoVGFyZ2V0RGlyKSQoVGFyZ2V0TmFtZSlfZGxsLmxpYiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwk8L0NvbmZpZ3VyYXRpb25zPgorCTxSZWZlcmVuY2VzPgorCTwvUmVmZXJlbmNlcz4KKwk8RmlsZXM+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiCisJCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNiYXNlcmVjb2duaXplci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNiYXNldHJlZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNiYXNldHJlZWFkYXB0b3IuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzYml0c2V0LmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2NvbGxlY3Rpb25zLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2NvbW1vbnRva2VuLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2NvbW1vbnRyZWUuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzY29tbW9udHJlZWFkYXB0b3IuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzY29tbW9udHJlZW5vZGVzdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzY29udmVydHV0Zi5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNjeWNsaWNkZmEuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzZGVidWdoYW5kbGVycy5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNlbmNvZGluZ3MuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzZXhjZXB0aW9uLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2ZpbGVzdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzaW5wdXRzdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzaW50c3RyZWFtLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2xleGVyLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM3BhcnNlci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNyZXdyaXRlc3RyZWFtcy5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNzdHJpbmcuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzdG9rZW5zdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzdHJlZXBhcnNlci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIgorCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyMy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzYmFzZXJlY29nbml6ZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2Jhc2V0cmVlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNiYXNldHJlZWFkYXB0b3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2JpdHNldC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzY29sbGVjdGlvbnMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2NvbW1vbnRva2VuLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNjb21tb250cmVlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNjb21tb250cmVlYWRhcHRvci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzY29tbW9udHJlZW5vZGVzdHJlYW0uaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2NvbnZlcnR1dGYuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2N5Y2xpY2RmYS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzZGVidWdldmVudGxpc3RlbmVyLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNkZWZzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNlbmNvZGluZ3MuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2Vycm9ycy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzZXhjZXB0aW9uLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNmaWxlc3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNpbnB1dC5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzaW50ZXJmYWNlcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzaW50c3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNsZXhlci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzbWVtb3J5LmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNwYXJzZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM3BhcnNldHJlZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzcmVjb2duaXplcnNoYXJlZHN0YXRlLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNyZXdyaXRlc3RyZWFtcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzc3RyaW5nLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjN0b2tlbnN0cmVhbS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzdHJlZXBhcnNlci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlRlbXBsYXRlcyIKKwkJCUZpbHRlcj0iLnN0ZyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx0b29sXHNyY1xtYWluXHJlc291cmNlc1xvcmdcYW50bHJcY29kZWdlblx0ZW1wbGF0ZXNcQ1xBU1Quc3RnIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx0b29sXHNyY1xtYWluXHJlc291cmNlc1xvcmdcYW50bHJcY29kZWdlblx0ZW1wbGF0ZXNcQ1xBU1REYmcuc3RnIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx0b29sXHNyY1xtYWluXHJlc291cmNlc1xvcmdcYW50bHJcY29kZWdlblx0ZW1wbGF0ZXNcQ1xBU1RQYXJzZXIuc3RnIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx0b29sXHNyY1xtYWluXHJlc291cmNlc1xvcmdcYW50bHJcY29kZWdlblx0ZW1wbGF0ZXNcQ1xBU1RUcmVlUGFyc2VyLnN0ZyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cdG9vbFxzcmNcbWFpblxyZXNvdXJjZXNcb3JnXGFudGxyXGNvZGVnZW5cdGVtcGxhdGVzXENcQy5zdGciCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHRvb2xcc3JjXG1haW5ccmVzb3VyY2VzXG9yZ1xhbnRsclxjb2RlZ2VuXHRlbXBsYXRlc1xDXERiZy5zdGciCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSmF2YSIKKwkJCUZpbHRlcj0iKi5qYXZhIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHRvb2xcc3JjXG1haW5camF2YVxvcmdcYW50bHJcY29kZWdlblxDVGFyZ2V0LmphdmEiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iRG94eWdlbiIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cYXRzZWN0aW9ucy5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxidWlsZC5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxidWlsZHJlYy5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxjaGFuZ2VzMzEuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cZG94eWdlbmdyb3Vwcy5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxnZW5lcmF0ZS5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxpbnRlcm9wLmRveCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkb3h5Z2VuXG1haW5wYWdlLmRveCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkb3h5Z2VuXHJ1bnRpbWUuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cdXNpbmcuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwkJPEdsb2JhbAorCQkJTmFtZT0iRGV2UGFydG5lcl9Jc0luc3RydW1lbnRlZCIKKwkJCVZhbHVlPSIwIgorCQkvPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvQy52Y3Byb2oudnNwc2NjIGIvYW50bHItMy40L3J1bnRpbWUvQy9DLnZjcHJvai52c3BzY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYTFiOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvQy52Y3Byb2oudnNwc2NjCkBAIC0wLDAgKzEsMTQgQEAKK++7vyIiCit7CisiRklMRV9WRVJTSU9OIiA9ICI5MjM3IgorIkVOTElTVE1FTlRfQ0hPSUNFIiA9ICJORVZFUiIKKyJQUk9KRUNUX0ZJTEVfUkVMQVRJVkVfUEFUSCIgPSAiIgorIk5VTUJFUl9PRl9FWENMVURFRF9GSUxFUyIgPSAiNCIKKyJFWENMVURFRF9GSUxFMCIgPSAiZGVidWdkbGxcXGFudGxyM2NkX2RsbC5saWIiCisiRVhDTFVERURfRklMRTEiID0gInJlbGVhc2VkbGxcXGFudGxyM2NfZGxsLmxpYiIKKyJFWENMVURFRF9GSUxFMiIgPSAiZGVidWdkbGxcXGFudGxyM2NkX2RsbC5leHAiCisiRVhDTFVERURfRklMRTMiID0gInJlbGVhc2VkbGxcXGFudGxyM2NfZGxsLmV4cCIKKyJPUklHSU5BTF9QUk9KRUNUX0ZJTEVfUEFUSCIgPSAiIgorIk5VTUJFUl9PRl9ORVNURURfUFJPSkVDVFMiID0gIjAiCisiU09VUkNFX0NPTlRST0xfU0VUVElOR1NfUFJPVklERVIiID0gIlBST1ZJREVSIgorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9DLnZzc3NjYyBiL2FudGxyLTMuNC9ydW50aW1lL0MvQy52c3NzY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiMDMxYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvQy52c3NzY2MKQEAgLTAsMCArMSwxMCBAQAor77u/IiIKK3sKKyJGSUxFX1ZFUlNJT04iID0gIjkyMzciCisiRU5MSVNUTUVOVF9DSE9JQ0UiID0gIk5FVkVSIgorIlBST0pFQ1RfRklMRV9SRUxBVElWRV9QQVRIIiA9ICIiCisiTlVNQkVSX09GX0VYQ0xVREVEX0ZJTEVTIiA9ICIwIgorIk9SSUdJTkFMX1BST0pFQ1RfRklMRV9QQVRIIiA9ICIiCisiTlVNQkVSX09GX05FU1RFRF9QUk9KRUNUUyIgPSAiMCIKKyJTT1VSQ0VfQ09OVFJPTF9TRVRUSU5HU19QUk9WSURFUiIgPSAiUFJPSkVDVCIKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvQ09QWUlORyBiL2FudGxyLTMuNC9ydW50aW1lL0MvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJmODk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9DT1BZSU5HCkBAIC0wLDAgKzEsMjkgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9DaGFuZ2VMb2cgYi9hbnRsci0zLjQvcnVudGltZS9DL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU0MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1NTAgQEAKK1RoZSBmb2xsb3dpbmcgY2hhbmdlcyAoY2hhbmdlIG51bWJlcnMgcmVmZXIgdG8gcGVyZm9yY2UpIHdlcmUKK21hZGUgZnJvbSB2ZXJzaW9uIDMuMS4xIHRvIDMuMS4yCisKK1J1bnRpbWUKKy0tLS0tLS0KKworQ2hhbmdlIDU2NDEgb24gMjAwOS8wMi8yMCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCVJlbGVhc2UgdmVyc2lvbiAzLjEuMiBvZiB0aGUgQU5UTFIgQyBydW50aW1lLgorCQorCVVwZGF0ZWQgZG9jdW1lbnRzIGFuZCByZWxlYXNlIG5vdGVzIHdpbGwgaGF2ZSB0byBmb2xsb3cgbGF0ZXIuCisKK0NoYW5nZSA1NjM5IG9uIDIwMDkvMDIvMjAgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZDogQU5UTFItMzU2CisJCisJRW5zdXJlIHRoYXQgY29kZSBnZW5lcmF0aW9uIGZvciBDKysgZG9lcyBub3QgcmVxdWlyZSBjYXN0cworCitDaGFuZ2UgNTU3NyBvbiAyMDA5LzAyLzEyIGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJQyBSdW50aW1lIC0gQnVnIGZpeGVzLgorCQorCSBvIEhhdmluZyBtb3ZlZCB0byB1c2UgYW4gZXh0cmFjdCBkaXJlY3RseSBmcm9tIGEgdmVjdG9yIGZvciByZXR1cm5pbmcgCisJICAgdG9rZW5zLCBpdCBleHBvc2VkIGEKKwkgICBidWcgd2hlcmVieSB0aGUgRU9GIGJvdWRhcnkgY2FsY3VsYXRpb24gaW4gdG9rTFQgd2FzIGluY29ycmVjdGx5IAorCSAgIGNoZWNraW5nID4gcmF0aGVyIHRoYW4gPj0uIAorCSBvIENoYW5naW5nIHRvIEFQSSBpbml0aWFsaXphdGlvbiBvZiB0b2tlbnMgcmF0aGVyIHRoYW4gbWVtY21wKCkgCisJICAgaW5jb3JyZWN0bHkgZm9yZ290IHRvIHNldCB0ZWggaW5wdXQgc3RyZWFtIHBvaW50ZXIgZm9yIHRoZSAKKwkgICBtYW51ZmFjdHVyZWQgdG9rZW5zIGluIHRoZSB0b2tlbiBmYWN0b3J5OworCSBvIFJld3JpdGUgc3RyZWFtcyBmb3IgcmV3cml0aW5nIHRyZWUgcGFyc2VycyBkaWQgbm90IGNoZWNrIHdoZXRoZXIgdGhlIAorCSAgIHJld3JpdGUgc3RyZWFtIHdhcyBldmVyIGFzc2lnbmVkIGJlZm9yZSB0cnlpbmcgdG8gZnJlZSBpdCwgaXQgaXMgbm93IAorCSAgIGluIGxpbmUgd2l0aCB0aGUgb3JkaW5hcnkgcGFyc2VyIGNvZGUuCisKK0NoYW5nZSA1NTc2IG9uIDIwMDkvMDIvMTEgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlDIFJ1bnRpbWU6IEVuc3VyZSB0aGF0IHdoZW4gd2UgbWFudWZhY3R1cmUgYSBuZXcgdG9rZW4gZm9yIGEgbWlzc2luZyAKKwl0b2tlbiwgdGhhdCB0aGUgdXNlciBzdXBsaWVkIGN1c3RvbSBpbmZvcm1hdGlvbiAoaWYgYW55KSBpcyBjb3BpZWQgCisJZnJvbSB0aGUgY3VycmVudCB0b2tlbi4KKworQ2hhbmdlIDU1NzUgb24gMjAwOS8wMi8wOCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUMgUnVudGltZSAtIFZhc3RseSBpbXByb3ZlIHRoZSByZXVzZSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGZvciBub2RlcyBpbiAKKwkgIHRyZWUgcmV3cml0aW5nLgorCQorCUEgcHJvYmxlbSBmb3IgYWxsIHRhcmdldHMgYXQgdGhlIG1vbWVudCBzaSB0aGF0IHRoZSByZXdyaXRlIGxvZ2ljIAorCWdlbmVyYXRlZCBieSBBTlRMUiBtYWtlcyBubyBhdHRlbXB0CisJdG8gcmV1c2UgYW55IHJlc291cmNlcywgaXQgbWVyZWx5IGd1cmFudGVlcyB0aGF0IHRoZSB0cmVlIHNoYXBlIGF0IHRoZSAKKwllbmQgaXMgY29ycmVjdC4gVG8gc29tZSBleHRlbnQgdGhpcyBpcyBtaXRpZ2F0ZWQgYnkgdGhlIGdhcmJhZ2UgCisJY29sbGVjdGlvbiBzeXN0ZW1zIG9mIEphdmEgYW5kIC5OZXQsIGV2ZW4gdGhvZ3VoIGl0IGlzIHN0aWxsIGFuIG92ZXJoZWFkIHRvCisJa2VlcCBjcmVhdGluZyBzbyBtYW55IG1vZGVzLgorCQorCVRoaXMgY2hhbmdlIGltcGxlbWVudHMgdGhlIGZpcnN0IG9mIHR3byBDIHJ1bnRpbWUgY2hhbmdlcyB0aGF0IG1ha2UgCisJYmVzdCBlZmZvcnN0IHRvIHRyYWNrIHdoZW4gYSBub2RlIGhhcyBiZWNvbWUgb3JwaGFuZWQgYW5kIHdpbGwgbmV2ZXIgCisJYmUgcmV1c2VkLCBiYXNlZCBvbiBpbmhlcmVudCBrbm93bGVkZ2Ugb2YgdGhlIHJld3JpdGUgbG9naWMgKHdoaWNoIGluCisJdGhlIGxvbmcgdGVybSBpcyBub3QgYSBncmVhdCBzb2xvdXRpb24pLiAKKwkKKwlNdWNoIG9mIHRoZSByZXdyaXRlIGxvZ2ljIGNvbnNpc3RzIG9mIGNyZWF0aW5nIGEgbmlpbG5vZGUgaW50byB3aGljaCAKKwljaGlsZCBub2RlcyBhcmUgYXBwZW5kZWQuIEF0OiBydWxlUG9zdCBwcm9jZXNzaW5nIHRpbWU7IHdoZW4gYSByZXdyaXRlIAorCXN0cmVhbSBpcyBjbG9zZWQ7IGFuZCB3aGVuIGJlY29tZVJvb3QgaXMgY2FsbGVkLCB0aGVyZSBhcmUgbWFueSBzaXR1YXRpb25zCisJd2hlcmUgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgdGhhdCB3aWxsIGJlIG1hbmlwdWx0ZWQsIG9yIGlzIGZpbmlzaGVkIHdpdGggCisJKGluIHRoZSBjYXNlIG9mIHJld3J0aWUgc3RyZWFtcyksIHdoZXJlIHRoZSBuaWxOb2RlIHdhcyBqdXN0IGEgdGVtcG9yYXJ5IAorCWNyZWF0aW9uIGZvciB0aGUgc2FrZSBvZiB0aGUgcmV3cml0ZSBpdHNlbGYuIAorCQorCUluIHRoZXNlIGNhc2VzIHdlIGNhbiBzZWUgdGhhdCB0aGUgbmlsTm9kZSB3b3VsZCBqdXN0IGJlIGxlZnQgb3Qgcm90IGluIAorCXRoZSBub2RlIGZhY3RvcnkgdGhhdCB0cmFja3MgYWxsIHRoZSB0cmVlIG5vZGVzLgorCVJhdGhlciB0aGFuIGxlYXZlIHRoZXNlIGluIHRoZSBmYWN0b3J5IHRvIHJvdCwgd2Ugbm93IGtlZXAgYSByZXN1c2UgCisJc3RjayBhbmQgYWx3YXlzIHJldXNlIGFueSBub2RlIG9uIHRoaXMKKwlzdGFjayBiZWZvcmUgY2xhaW1pbiBhIG5ldyBub2RlIGZyb20gdGhlIGZhY3RvcnkgcG9vbC4KKwkKKwlUaGlzIHNpbmdsZSBjaGFuZ2UgYWxvbmUgcmVkdWNlcyBtZW1vcnkgdXNhZ2UgaW4gdGhlIHRlc3QgY2FzZSAoMjAsNjA0IAorCWxpbmUgQyBwcm9ncmFtIGFuZCBhIEdOVSBDIHBhcnNlcikgCisJZnJvbSBuZWFybHkgYSBHQiwgdG8gMjc2TUIuIFRoaXMgaXMgc3RpbGwgd2F5IG1vcmUgbWVtb3J5IHRoYW4gd2UgCisJc2hvdWRsIG5lZWQgdG8gZG8gdGhpcyBvcGVyYXRpb24sIGV2ZW4gb24gc3VjaCBhIGxhcmdlIGlucHV0IGZpbGUsCisJYnV0IHRoZSByZWR1Y3Rpb24gcmVzdWx0cyBpbiBhIGh1Z2UgcGVyZm9ybWFuY2UgaW5jcmVhc2UgYW5kIGdyZWF0bHkgCisJcmVkdWNlZCBzeXN0ZW0gdGltZSBzcGVudCBvbiBhbGxvY2F0aW9ucy4KKwkKKwlBZnRlciB0aGlzIG9wdGltaXphdG9pbiwgY29tcGFyaXNvbiB3aXRoIGdjYyB5ZWlsZHM6CisJCisJdGltZSBnY2MgLVMgYS5jCisJYS5jOjEwMjY6IHdhcm5pbmc6IGNvbmZsaWN0aW5nIHR5cGVzIGZvciBidWlsdC1pbiBmdW5jdGlvbiDigJh2c3ByaW50ZuKAmQorCWEuYzoxMDMwOiB3YXJuaW5nOiBjb25mbGljdGluZyB0eXBlcyBmb3IgYnVpbHQtaW4gZnVuY3Rpb24g4oCYdnNucHJpbnRm4oCZCisJYS5jOjEwNDE6IHdhcm5pbmc6IGNvbmZsaWN0aW5nIHR5cGVzIGZvciBidWlsdC1pbiBmdW5jdGlvbiDigJh2c3NjYW5m4oCZCisJMC4yMXVzZXIgMC4wMXN5c3RlbSAwOjAwLjIyZWxhcHNlZCA5NyVDUFUgKDBhdmd0ZXh0KzBhdmdkYXRhIDBtYXhyZXNpZGVudClrCisJMGlucHV0cysyNDBvdXRwdXRzICgwbWFqb3IrODM0NW1pbm9yKXBhZ2VmYXVsdHMgMHN3YXBzCisJCisJYW5kCisJCisJdGltZSAuL2ppbWkKKwlSZWFkaW5nIGEuYworCTAuMjh1c2VyIDAuMTFzeXN0ZW0gMDowMC4zOWVsYXBzZWQgOTglQ1BVICgwYXZndGV4dCswYXZnZGF0YSAwbWF4cmVzaWRlbnQpaworCTBpbnB1dHMrMG91dHB1dHMgKDBtYWpvcis2NjYwOW1pbm9yKXBhZ2VmYXVsdHMgMHN3YXBzCisJCisJQW5kIHdlIGNhbiBub3cgaW50ZXJwb2xhdGUgdGhlIGZhY3QgdGhhdCB0aGUgb25seSBtYWpvciBkaWZmZXJuY2UgaXMgCisJbm93IHRoZSBodWdlIGRpc3Bhcml0eSBpbiBtZW1vcnkgYWxsb2NhdGlvbnMuIEEKKwlmdXR1cmUgb3B0aW1pemF0aW9uIG9mIHZlY3RvciBwb29saW5nLCB0byBzZXBhdGUgbm9kZSByZXN1ZSBmcm9tIHZlY3RvciAKKwlyZXVzZSwgY3VycmVudGx5IGxvb2tzIHByb21pc2luZyBmb3IgZnVydGhlciByZXVzZSBvZiBtZW1vcnkuCisJCisJRmluYWxseSwgYSBzdGF0aWMgYW5hbHlzaXMgb2YgdGhlIHJld3J0ZSBjb2RlLCBwbHVzIGEgcmVhbHRpbWUgYW5hbHlzaXMgCisJb2YgdGhlIGhlYXAgYXQgcnVudGltZSwgbWF5IHdlbGwgZ2l2ZSB1cyBhIHJlYXNvbmFibGUgbWVtb3J5IHVzYWdlIAorCXBhdHRlcm4uIEluIHJlYWxpdHkgdGhvdWdoLCBpdCBpcyB0aGUgZ2VuZXJhdGVkIHJld3JpdGUgbG9naWMKKwl0aGF0IG11c3QgYmVjb20gb3B0aW9uYWwgYXQgbm90IGNvbnRpbnVvdXNseSByZXdyaXRpbmcgdGhpbmdzIHRoYXQgaXQgCisJbmVlZCBub3QsIGFzIGl0IGFzY2VuZHMgdGhlIHJ1bGUgY2hhaW4uCisKK0NoYW5nZSA1NTYzIG9uIDIwMDkvMDEvMjggYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlBbGxvdyByZXdyaXRlIHN0cmVhbXMgdG8gdXNlIHRoZSBiYXNlIGFkYXB0b3JzIHZlY3RvciBmYWN0b3J5IGFuZCBub3QgCisJdHJ5IHRvIG1hbGxvYyBuZXcgdmVjdG9ycyB0aGVtc2VsdmVzLgorCitDaGFuZ2UgNTU2MiBvbiAyMDA5LzAxLzI4IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJRG9uJ3QgdXNlIENBTExPQyB0byBhbGxvY2F0ZSB0cmVlIHBvb2xzLCB1c2UgbWFsbG9jIGFzIHRoZXJlIGlzIG5vIG5lZWQgCisJZm9yIGNhbGxvYy4KKworQ2hhbmdlIDU1NjEgb24gMjAwOS8wMS8yOCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCVByZXZlbnQgd2Fybmlnc24gYWJvdXQgcmV0dmFsLnN0b3Agbm90IGJlaW5nIGluaXRpYWxpemVkIHdoZW4gYSBydWxlIAorCXJldHVybnMgZXJhbHkgYmVjYXVzZSBpdCBpcyBpbiBiYWNrdHJhY2tpbmcgbW9kZQorCitDaGFuZ2UgNTU1OCBvbiAyMDA5LzAxLzI4IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJTG90cyBvZiBvcHRpbWl6YXRpb25zICh0aG91Z2ggdGhlIG5leHQgb25lIHRvIGJlIGNoZWNrZWQgaW4gaXMgdGhlIGh1Z2UgCisJd2luKSBmb3IgQVNUIGJ1aWxkaW5nIGFuZCB2ZWN0b3IgZmFjdG9yaWVzLgorCQorCUEgbGFyZ2UgcGFydCBvZiB0cmVlIHJld3JpdGluZyB3YXMgdGhlIGNyZWF0aW9uIG9mIHZlY3RvcnMgdG8gaG9sZCBBU1QgCisJbm9kZXMuIEFsdGhvdWdoIEkgaGFkIGNyZWF0ZWQgYSB2ZWN0b3IgZmFjdG9yeSwgZm9yIHNvbWUgcmVhc29uIEkgbmV2ZXIgZ290IAorCWFyb3VuZCB0byBjcmVhdGluZyBhIHByb3BlciBvbmUsIHRoYXQgcHJlLWFsbG9jYXRlZCB0aGUgdmVjdG9ycyBpbiBjaHVua3MgYW5kIAorCXNvIG9uLiBJIGd1ZXNzIEkganVzdCBmb3Jnb3QgdG8uIEhlbmNlIGEgYmlnIHdpbiBoZXJlIGlzIHByZXZlbnRpb24gb2YgY2FsbGluZyAKKwltYWxsb2MgbG90cyBhbmQgbG90cyBvZiB0aW1lcyB0byBjcmVhdGUgdmVjdG9ycy4KKwkKKwlBIHNlY29uZCBpbnByb3ZlbWVudCB3YXMgdG8gY2hhbmdlIHRlaCB2ZWN0b3IgZGVmaW5pdGlvbiBzdWNoIHRoYXQgaXQgCisJaG9sZHMgYSBjZXJ0YWluIG51bWJlciBvZiBlbGVtZW50cyB3aWh0aW4gdGhlIHZlY3RvciBzdHJ1Y3R1cmUgaXRzZWxmLCByYXRoZXIgCisJdGhhbiBtYWxsb2MgYW5kIGZyZWVpbmcgdGhlc2UuIEN1cnJlbnRseSB0aGlzIGlzIHNldCB0byA4LCBidXQgbWF5IGluY3JlYXNlLiAKKwlGb3IgQVNUIGNvbnN0cnVjdGlvbiwgdGhpcyBpcyBnZW5lcmFsbHkgYSBiaWcgd2luIGJlY2F1c2UgQVNUIG5vZGVzIGRvbid0IG9mdGVuIAorCWhhdmUgbWFueSBpbmRpdmlkdWFsIGNoaWxkcmVuIHVubGVzcyB0aGVyZSBoYXMgbm90IGJlZW4gYW55IHNoYXBpbmcgZ29pbmcgb24gaW4gCisJdGhlIHBhcnNlci4gQnV0IGlmIHlvdSBhcmUgbm90IHNoYXBpbmcsIHRoZW4geW91IGRvbid0IHJlYWxseSBuZWVkIGEgdHJlZS4KKwkKKwlPdGhlciBwZXJmb3JhbW5jZSBpbnByb3ZlbWVudHMgaGVyZSBpbmNsdWRlIG5vdCBjYWxsaW5nIGZ1bmN0aW9ucyAKKwlpbmRpcmVjdGx5IHdpdGhpbiB0b2tlbiBzdHJlYW0gYW5kIGNvbW1vbiB0b2tlbiBzdHJlYW0uIEhlbmNlIHRva2VucyBhcmUgCisJY2xhaW1lZCBkaXJlY3RseSBmcm9tIHRoZSB2ZWN0b3JzLiBVc2VycyBjYW4gb3ZlcnJpZGUgdGhlc2UgZnVuY2l0b25zIG9mIGNvdXJzZSAKKwlhbmQgYWxsIHRoaXMgbWVhbnMgaXMgdGhhdCBpZiB5b3Ugb3ZlcnJpZGUgdG9rZW5zdHJlYW1zIHRoZW4geW91IHByZXR0eSBtdWNoIAorCWhhdmUgdG8gcHJvdmlkZSBhbGwgdGhlIG1laHRvZHMsIGJ1dCB0aGVuIEkgdGhpbmsgeW91IHdvdWRsIGhhdmUgdG8gYW55d2F5IChhbmQgCisJSSBkb24ndCBrbm93IG9mIGFueW9uZSB0aGF0IGhhcyB3YW50ZWQgdG8gZG8gdGhpcyBhcyB5b3UgY2FuIGNhcnJ5IHlvdXIgb3duIAorCXN0cnVjdHVyZSBhcm91bmQgd2l0aCB0aGUgdG9rZW5zIGFueXdheSBhbmQgdGhhdCBpcyBtdWNoIGVhc2llcikuCisKK0NoYW5nZSA1NTU1IG9uIDIwMDkvMDEvMjYgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZDogQU5UTFItMjg4CisJQ29ycmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHNraXAgdG9rZW4gc3VjaCB0aGF0IGNoYW5uZWwsIHN0YXJ0IAorCWluZGV4LCBjaGFyIHBvcyBpbiBsaWUsIHN0YXJ0IGxpbmUgYW5kIHRleHQgYXJlIGNvcnJlY3RseSByZXNldCB0byB0aGUgc3RhcnQgb2YgCisJdGhlIG5ldyB0b2tlbiB3aGVuIHRoZSBvbmUgdGhhdCB3ZSBqdXN0IHRyYXZlcnNlZCB3YXMgbWFya2VkIGFzIGJlaW5nIHNraXBwZWQuIAorCQorCVRoaXMgY29ycmVjdGx5IGV4Y2x1ZGVzIHRoZSB0ZXh0IHRoYXQgd2FzIG1hdGNoZWQgYXMgcGFydCBvZiB0aGUgCisJU0tJUCgpZWQgdG9rZW4gZnJvbSB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgdG9rZW4gc3RyZWFtIGFuZCBzbyBoYXMgdGhlIHNpZGUgCisJZWZmZWN0IHRoYXQgYXNraW5nIGZvciAkdGV4dCBvZiBhIHJ1bGUgbm8gbG9uZ2VyIGluY2x1ZGVzIHRoZSB0ZXh0IHRoYXQgc2h1b2RsIAorCWJlIHNraXBwZWQsIGJ1dCBET0VTIGluY2x1ZGUgdGhlIHRleHQgb2YgdG9rZW5zIHRoYXQgd2VyZSBtZXJlbHkgcGxhY2VkIG9mZiB0aGUgCisJZGVmYXVsdCBjaGFubmVsLgorCitDaGFuZ2UgNTU1MSBvbiAyMDA5LzAxLzI1IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTI4NworCU1vc3Qgb2YgdGhlIHNvdXJjZSBmaWxlcyBkaWQgbm90IGluY2x1ZGUgdGhlIEJTRCBsaWNlbnNlLiBUSGlzIG1pZ2h0CisJbm90IGJlIHRoYXQgYmlnIGEgZGVhbCBnaXZlbiB0aGF0IEkgZG9uJ3QgY2FyZSB3aGF0IHBlb3BsZSBkbyB3aXRoIGl0CisJb3RoZXIgdGhhbiB0YWtlIG15IG5hbWUgb2ZmIGl0LCBidXQgaGF2aW5nIHRoZSBsaWNlbnNlIHJlcHJvZHVjZWQgCisJZXZlcnl3aGVyZQorCWF0IGxlYXN0IG1ha2VzIHRoaW5ncyBwZXJmZWN0bHkgY2xlYXIuIEhlbmNlIHRoaXMgbWFzcyBjaGFuZ2Ugb2YgCisJc291cmNlcyBhbmQgdGVtcGxhdGVzCisJdG8gaW5jbHVkZSB0aGUgbGljZW5zZS4KKworQ2hhbmdlIDU1NTAgb24gMjAwOS8wMS8yNSBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUZpeGVkOiBBTlRMUi0zNjUKKwlFbnN1cmUgdGhhdCBhcyBzb29uIGFzIHdlIGtub3duIGFib3V0IGFuIGlucHV0IHN0cmVhbSBvbiB0aGUgbGV4ZXIgdGhhdAorCXdlIGJvcnJvdyBpdHMgc3RyaW5nIGZhY3Ryb3kgYWRuIHVzZSBpdCBpbiBvdXIgRU9GIHRva2VuIGluIGNhc2UKKwlhbnlvbmUgdHJpZXMgdG8gbWFrZSBpdCBhIHN0cmluZywgc3VjaCBhcyBpbiBlcnJvciBtZXNzYWdlcyBmb3IgCisJaW5zdGFuY2UuCisKK0NoYW5nZSA1NTQ4IG9uIDIwMDkvMDEvMjUgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZDogQU5UTFItMzYzCisgICAgICAgIEF0IHNvbWUgcG9pbnQgdGhlIEphdmEgcnVudGltZSBkZWZhdWx0IGNoYW5nZWQgZnJvbSBkaXNjYXJkaW5nIG9mZmNoYW5uZWwKKyAgICAgICAgdG9rZW5zIHRvIHByZXNlcnZpbmcgdGhlbS4gVGhlIGZpeCBpcyB0byBtYWtlIHRoZSBDIHJ1bnRpbWUgYWxzbyAKKwlkZWZhdWx0IHRvIHByZXNlcnZpbmcgb2ZmLWNoYW5uZWwgdG9rZW5zLgorCitDaGFuZ2UgNTU0NCBvbiAyMDA5LzAxLzI0IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTM2MAorCUVuc3VyZSB0aGF0IHRoZSBmaWxsQnVmZmVyIGZ1bnRpaW9uIGRvZXMgbm90IGNhbGwgYW55IG1ldGhvZHMKKwl0aGF0IHJlcXVpcmUgdGhlIGNhY2hlZCBidWZmZXIgc2l6ZSB0byBiZSByZWNvcmRlZCBiZWZvcmUgd2UKKwloYXZlIGFjdHVhbGx5IHJlY29yZGVkIGl0LgorCitDaGFuZ2UgNTU0MyBvbiAyMDA5LzAxLzI0IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTM2MgorCVNvbWUgdXNlcnMgaGF2ZSBzdGFydGVkIHVzaW5nIHN0cmluZyBmYWN0b3JpZXMgdGhlbXNlbHZlcyBhbmQKKwlleHBvc2VkIGEgZmxhdyBpbiB0aGUgZGVzdHJveSBtZXRob2QsIHRoYXQgaXMgaW50ZW5kZWQgdG8gcmVtb3ZlCisJYSBzdHJuZyBodGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSBmYWN0b3J5IGFuZCBpcyBubyBsb25nZXIgbmVlZGVkLgorCVRoZSBzdHJpbmcgd2FzIGNvcnJlY3RseSByZW1vdmVkIGZyb20gdGhlIHZlY3RvciB0aGF0IHRyYWNrcyB0aGVtCisJYnV0IGFmdGVyIHRoZSBmaXJzdCBvbmUsIGFsbCB0aGUgcmVtYWluaW5nIHN0cmluZ3MgYXJlIHRoZW4gbnVtYmVyZWQKKwlpbmNvcnJlY3RseS4gSGVuY2UgdGhlIGRlc3Ryb3kgbWV0aG9kIGhhcyBiZWVuIHJlY29kZWQgdG8gcmVpbmRleAorCXRoZSBzdHJpbmdzIGluIHRoZSBmYWN0b3J5IGFmdGVyIG9uZSBpcyByZW1vdmVkIGFuZCBldmVyeXRoaWcgaXMgb25jZQorCW1vcmUgaHVua3kgZG9yeS4KKwlVc2VyIHN1Z2dlc3RlZCBmaXggcmVqZWN0ZWQuCisKK0NoYW5nZSA1NTQyIG9uIDIwMDkvMDEvMjQgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZCBBTlRMUi0zNjYKKwlUaGUgcmVjb2duaXplciBzdGF0ZSBub3cgZW5zdXJlcyB0aGF0IGFsbCBmaWVsZHMgYXJlIHNldCB0byBOVUxMIHVwb24gCitjcmVhdGlvbgorCWFuZCB0aGUgcmVzZXQgZG9lcyBub3Qgb3ZlcndyaXRlIHRoZSB0b2tlbm5hbWUgYXJyYXkKKworQ2hhbmdlIDU1Mjcgb24gMjAwOS8wMS8xNSBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUFkZCB0aGUgQyBydW50aW1lIGZvciAzLjEuMiBiZXRhMiB0byBwZXJmb3JjZQorCitDaGFuZ2UgNTUyNiBvbiAyMDA5LzAxLzE1IGJ5IGppbWlAamltaS5qaW1pdmlzdGEuYW50bHIzCisKKwlDb3JyZWN0bHkgZGVmaW5lIHRoZSBNRU1NT1ZFIG1hY3JvIHdoaWNoIHdhcyBpbmFkdmVydGVudGx5IGxlZnQgdG8gYmUgCisJbWVtY3B5LgorCitDaGFuZ2UgNTUwMyBvbiAyMDA4LzEyLzEyIGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJQ2hhbmdlIEMgcnVudGltZSByZWxlYXNlIG51bWJlciB0byAzLjEuMiBiZXRhCisKK0NoYW5nZSA1NDczIG9uIDIwMDgvMTIvMDEgYnkgamltaUBqaW1pLmppbWl2aXN0YS5hbnRscjMKKworCUZpeGVkOiBBTlRMUi0zNTAgLSBDIHJ1bnRpbWUgdXNlIG9mIG1lbWNweQorCVByaW9yIGNoYW5nZSB0byB1c2UgbWVtY3B5IGluc3RlYWQgb2YgbWVtbW92ZSBpbiBhbGwgY2FzZXMgbWlzc2VkIHRoZSAKKwlmYWN0IHRoYXQgdGhlIHN0cmluZyBmYWN0b3J5IGNhbiBiZSBpbiBhIHNpdHVhdGlvbiB3aGVyZSBvdmVybGFwcyBvY2N1ci4gV2Ugbm93IAorCWhhdmUgQU5UTFIzX01FTUNQWSBhbmQgQU5UTFIzX01FTU1PVkUgYW5kIHVzZSB0aGUgdHdvIGFwcHJvcHJpYXRlbHkuCisKK0NoYW5nZSA1NDcxIG9uIDIwMDgvMTIvMDEgYnkgamltaUBqaW1pLmppbWl2aXN0YS5hbnRscjMKKworCUZpeGVkIEFOVExSLTM2MQorCSAtIEVuc3VyZSB0aGF0IEFOVExSM19CT09MRUFOIGlzIHR5cGVkZWYnZWQgY29ycmVjdGx5IHdoZW4gYnVpbGRpbmcgZm9yIAorCSAgIE1pbmdXCisKK1RlbXBsYXRlcworLS0tLS0tLS0tCisKK0NoYW5nZSA1NjM3IG9uIDIwMDkvMDIvMjAgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlDIHJ0dW5pbWUgLSBtYWtlIHN1cmUgdGhhdCBBREFQVE9SIHJlc3VsdHMgYXJlIGNhc3QgdG8gdGhlIHRyZWUgdHlwZSBvbiAKKwlhIHJld3JpdGUKKworQ2hhbmdlIDU2MjAgb24gMjAwOS8wMi8xOCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCVJlbmFtZS9Nb3ZlOgorCUZyb206IC8vZGVwb3QvY29kZS9hbnRsci9tYWluL3NyYy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvLi4uCisJVG86IC8vZGVwb3QvY29kZS9hbnRsci9tYWluL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvLi4uCisJCisJUmVsb2NhdGUgdGhlIGNvZGUgZ2VuZXJhdGluZyB0ZW1wbGF0ZXMgdG8gZXhpc3QgaW4gdGhlIGRpcmVjdG9yeSBzZXQgCisJdGhhdCBtYXZlbiBleHBlY3RzLgorCQorCVdoZW4gY2hlY2tpbmcgaW4geW91ciB0ZW1wbGF0ZXMsIHlvdSBtYXkgZmluZCBpdCBlYXNpZXN0IHRvIG1ha2UgYSBjb3B5IAorCW9mIHdoYXQgeW91IGhhdmUsIHJldmVydCB0aGUgY2hhbmdlIGluIHBlcmZvcmNlLCB0aGVuIGp1c3QgY2hlY2sgb3V0IHRoZSAKKwl0ZW1wbGF0ZSBpbiB0aGUgbmV3IGxvY2F0aW9uLCBhbmQgY29weSB0aGUgY2hhbmdlcyBiYWNrIG92ZXIuIE5vYm9keSBoYXMgb29yZSAKKwl0aGFuIHR3byBmaWxlcyBvcGVuIGF0IHRoZSBtb21lbnQuCisKK0NoYW5nZSA1NTc4IG9uIDIwMDkvMDIvMTIgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlDb3JyZWN0IHRoZSBzdHJpbmcgdGVtcGxhdGUgZXNjYXBlIHNlcXVlbmNlcyBmb3IgZ2VuZXJhdGluZyBzY29wZQorCWNvZGUgaW4gdGhlIEMgdGVtcGxhdGVzLgorCitDaGFuZ2UgNTU3NyBvbiAyMDA5LzAyLzEyIGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJQyBSdW50aW1lIC0gQnVnIGZpeGVzLgorCQorCSBvIEhhdmluZyBtb3ZlZCB0byB1c2UgYW4gZXh0cmFjdCBkaXJlY3RseSBmcm9tIGEgdmVjdG9yIGZvciByZXR1cm5pbmcgCisJICAgIHRva2VucywgaXQgZXhwb3NlZCBhCisJICAgIGJ1ZyB3aGVyZWJ5IHRoZSBFT0YgYm91ZGFyeSBjYWxjdWxhdGlvbiBpbiB0b2tMVCB3YXMgaW5jb3JyZWN0bHkgCisJICAgIGNoZWNraW5nID4gcmF0aGVyIHRoYW4KKwkgICAgPj0uIAorCSBvIENoYW5naW5nIHRvIEFQSSBpbml0aWFsaXphdGlvbiBvZiB0b2tlbnMgcmF0aGVyIHRoYW4gbWVtY21wKCkgCisJICAgIGluY29ycmVjdGx5IGZvcmdvdCB0byAKKwkgICAgc2V0IHRlaCBpbnB1dCBzdHJlYW0gcG9pbnRlciBmb3IgdGhlIG1hbnVmYWN0dXJlZCB0b2tlbnMgaW4gdGhlIAorCSAgICB0b2tlbiBmYWN0b3J5OworCSBvIFJld3JpdGUgc3RyZWFtcyBmb3IgcmV3cml0aW5nIHRyZWUgcGFyc2VycyBkaWQgbm90IGNoZWNrIHdoZXRoZXIgdGhlIAorCSAgICByZXdyaXRlIHN0cmVhbQorCSAgICB3YXMgZXZlciBhc3NpZ25lZCBiZWZvcmUgdHJ5aW5nIHRvIGZyZWUgaXQsIGl0IGlzIG5vdyBpbiBsaW5lIHdpdGggCisJICAgIHRoZSBvcmRpbmFyeSBwYXJzZXIgY29kZS4KKworQ2hhbmdlIDU1Njcgb24gMjAwOS8wMS8yOSBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUMgUnVudGltZSAtIEZ1cnRoZXIgT3B0aW1pemF0aW9ucworCQorCVdpdGhpbiBncmFtbWFycyB0aGF0IHVzZWQgc2NvcGVzIGFuZCB3ZXJlIGludGVuZGVkIHRvIHBhcnNlIGxhcmdlIAorCWlucHV0cyB3aXRoIG1hbnkgcnVsZSBuZXN0cywKKwl0aGUgY3JlYXRpb24gYW5mIGRlbGV0aW9uIG9mIHRoZSBzY29wZXMgdGhlbXNlbHZlcyBiZWNhbWUgc2lnbmlmaWNhbnQuIAorCUNhcmVmdWwgYW5hbHlzaXMgc2hvd3MgdGhhdAorCWZvciBtb3N0IGdyYW1tYXJzLCB3aGlsZSBhIHBhcnNlIGNvdWxkIGNyZWF0ZSBhbmQgZGVsZXRlIDIwLDAwMCBzY29wZXMsIAorCXRoZSBtYXhpdW0gZGVwdGggb2YKKwlhbnkgc2NvcGUgd2FzIG9ubHkgOC4gCisJCisJVGhpcyBjaGFuZ2UgdGhlcmVmb3JlIGNoYW5nZXMgdGhlIHNjb3BlIGltcGxlbWVudGF0aW9uIHNvIHRoYXQgaXQgZG9lcyAKKwlub3QgZnJlZSBzY29wZSBtZW1vcnkgd2hlbgorCWl0IGlzIHBvcHBlZCBidXQganVzdCB0cmFja3MgaXQgaW4gYSBDIHJ1bnRpbWUgc3RhY2ssIGV2ZW50dWFsbHkgCisJZnJlZWluZyBpdCB3aGVuIHRoZSBzdGFjayBpcyBmcmVlZC4gVGhpcyBjaGFuZ2UKKwljYXVzZWQgdGhlIGFsbG9jYXRpb24gb2Ygb25seSAxMiBzY29wZSBzdHJ1Y3R1cmVzIGluc3RlYWQgb2YgMjAsMDAwIGZvciAKKwl0aGUgZXh0cmVtZSBleGFtcGxlIGNhc2UuCisJCisJVGhpcyBjaGFuZ2UgbWVhbnMgdGhhdCBzY29wZSB1c2VycyBtdXN0IGJlIGNhcmVmdWxlIChhcyBldmVyIGluIEMpIHRvIAorCWluaXRpYWxpemFlIHRoZWlyIHNjb3BlIGVsZW1lbnRzCisJY29ycmVjdGx5IGFzOgorCQorCTEpIElmIG5vdCB5b3UgbWF5IGluaGVyaXQgdmFsdWVzIGZyb20gYSBwcmlvciB1c2Ugb2YgdGhlIHNjb3BlIAorCSAgICBzdHJ1Y3R1cmU7CisJMikgU0NvcGUgc3RydWN0dXJlIGFyZSBub3cgYWxsb2NhdGVkIHdpdGggbWFsbG9jIGFuZCBub3QgY2FsbG9jOworCQorCUFsc28sIHdoZW4gdXNpbmcgYSBjdXN0b20gZnJlZSBmdW5jdGlvbiB0byBjbGVhbiBhIHNjb3BlIHdoZW4gaXQgaXMgCisJcG9wcGVkLCBpdCBpcyBwcm9iYWJseSBhIGdvb2QgaWRlYQorCXRvIHNldCBhbnkgZnJlZSdkIHBvaW50ZXJzIHRvIE5VTEwgKHRoaXMgaXMgZ2VuZXJhbGx5IGdvb2QgQyBwcm9ncmFtbWlnIAorCXByYWN0aWNlIGluIGFueSBjYXNlKQorCitDaGFuZ2UgNTU2NiBvbiAyMDA5LzAxLzI5IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJUmVtb3ZlIHJlZHVuZGFudCBCQUNLVFJBQ0sgY2hlY2tpbmcgc28gdGhhdCBNU1ZDOSBkb2VzIG5vdCBnZXQgY29uZnVzZWQgCisJYWJvdXQgcG9zc2libHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKKworQ2hhbmdlIDU1NjUgb24gMjAwOS8wMS8yOCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCVVzZSBtYWxsb2MgcmF0aGVyIHRoYW4gY2FsbG9jIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IHNjb3Blcy4gTm90ZSAKKwl0aGF0IHRoaXMgbWVhbnMgdXNlcnMgd2lsbCBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gaW5pdGlhbGl6ZSBhbnkgdmFsdWVzIGluIHRoZWlyIAorCXNjb3BlcyB0aGF0IHRoZXkgZXhwZWN0IHRvIGJlIDAgb3IgTlVMTCBhbmQgSSBtdXN0IGRvY3VtZW50IHRoaXMuCisKK0NoYW5nZSA1NTY0IG9uIDIwMDkvMDEvMjggYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlVc2UgbWFsbG9jIHJhdGhlciB0aGFuIGNhbGxvYyBmb3IgY29weWluZyBsaXN0IGxhYmxlIHRva2VucyBmb3IgCisJcmV3cml0ZXMuCisKK0NoYW5nZSA1NTYxIG9uIDIwMDkvMDEvMjggYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlQcmV2ZW50IHdhcm5pZ3NuIGFib3V0IHJldHZhbC5zdG9wIG5vdCBiZWluZyBpbml0aWFsaXplZCB3aGVuIGEgcnVsZSAKKwlyZXR1cm5zIGVyYWx5IGJlY2F1c2UgaXQgaXMgaW4gYmFja3RyYWNraW5nIG1vZGUKKworQ2hhbmdlIDU1NjAgb24gMjAwOS8wMS8yOCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUFkZCBhIE5VTEwgY2hlY2sgYmVmb3JlIGZyZWVpbmcgcmV3cml0ZSBzdHJlYW1zIHVzZWQgaW4gQVNUIHJld3JpdGVzIAorCXJhdGhlciB0aGFuIGF1dG8tcmV3cml0ZXMuCisJCisJV2hpbGUgdGhlIE5VTEwgY2hlY2sgaXMgcmVkdW5kYW50IGFzIHRoZSBmcmVlIGNhbm5vdCBiZSBjYWxsZWQgdW5sZXNzIAorCWl0IGlzIGFzc2lnbmVkLCBWaXN1YWwgU3R1ZGlvIEMgMjAwOAorCWdldHMgaXQgd3JvbmcgYW5kIHRoaW5rcyB0aGF0IHRoZXJlIGlzIGEgUEFUSCB0aGFuIGNhbiBhcnJpdmUgYXQgdGhlIAorCWZyZWUgd2lodG91dCBpdCBiZWluZyBhc3NpZ25lZCBhbmQgdGhhdCBpcyB0b28gYW5ub3lpbmcgdG8gaWdub3JlLgorCitDaGFuZ2UgNTU1OSBvbiAyMDA5LzAxLzI4IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJQyB0YXJnZXQgVHJlZSByZXdyaXRlIG9wdGltaXphdGlvbgorCQorCVRoZXJlIGlzIG9ubHkgb25lIG9wdGltaXphdGlvbiBpbiB0aGlzIGNoYW5nZSwgYnV0IGl0IGlzIGEgaHVnZSBvbmUuCisJCisJVGhlIGNvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMgd2VyZSBzZXQgdXAgc28gdGhhdCBhdCB0aGUgc3RhcnQgb2YgYSBydWxlLAorCWFueSByZXdyaXRlIHN0cmVhbXMgbWVudGlvbmVkIGluIHRoZSBydWxlIHdlciBwcmUtY3JlYXRlZC4gSG93ZXZlciwgdGhpcworCWlzIGEgbWFzc2l2ZSBvdmVyaGVhZCBmb3IgcnVsZXMgd2hlcmUgb25seSBvbmUgb3IgdHdvIG9mIHRoZSBzdHJlYW1zIGFyZQorCWFjdHVhbGx5IHVzZWQsIGFzIHdlIGNyZWF0ZSB0aGVtIHRoZW4gZnJlZSB0aGVtIHdpdGhvdXQgZXZlciB1c2luZyB0aGVtLgorCVRoaXMgd2FzIGNvcGllZCBmcm9tIHRoZSBKYXZhIHRlbXBsYXRlcyBiYXNpY2FsbHkuCisJVGhpcyBjYXVzZWQgbGl0ZXJhbGx5IG1pbGxpb25zIG9mIGV4dHJhIGNhbGxzIGFuZCB2ZWN0b3IgYWxsb2NhdGlvbnMKKwlpbiB0aGUgY2FzZSBvZiB0aGUgR05VIEMgcGFyc2VyIGdpdmVuIHRvIG1lIGZvciB0ZXN0aW5nIHdpdGggYSAyMCwwMDAgCisJbGluZSBwcm9ncmFtLgorCQorCUFmdGVyIHRoaXMgY2hhbmdlLCB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gaXMgYXZhaWFibGUgYWdhaW5zdCB0aGUgZ2NjIAorCWNvbXBpbGVyOgorCQorCUJlZm9yZSAoZGlmZmVyZW50IG1hY2hpbmVzIGhlcmUgc28gdXNlIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGZvciAKKwljb21wYXJpc29uKToKKwkKKwlnY2M6CisJCisJcmVhbCAgICAwbTAuNDI1cworCXVzZXIgICAgMG0wLjM4NHMKKwlzeXMgICAgIDBtMC4wMzZzCisJCisJQU5UTFIgQworCXJlYWwgICAgMG0xLjk1OHMKKwl1c2VyICAgIDBtMS4yODRzCisJc3lzICAgICAwbTAuNjU2cworCQorCUFmdGVyIHRoZSBwcmV2aW91cyBvcHRpbWl6YXRpb25zIGZvciB2ZWN0b3IgcG9vbGluZyB2aWEgYSBmYWN0b3J5LAorCXBsdXMgdGhpcyBodWdlIHdpbiBpbiByZW1vdmluZyByZWR1bmRhbnQgY29kZSwgd2UgaGF2ZSB0aGUgZm9sbG93aW5nCisJKGRpZmZlcmVudCBtYWNoaW5lIHRvIHRoZSBvbmUgYWJvdmUpOgorCQorCWdjYzoKKwkwLjIxdXNlciAwLjAxc3lzdGVtIDA6MDAuMjNlbGFwc2VkIDk5JUNQVSAoMGF2Z3RleHQrMGF2Z2RhdGEgMG1heHJlc2lkZW50KWsKKwkwaW5wdXRzKzMyOG91dHB1dHMgKDBtYWpvcis5OTIybWlub3IpcGFnZWZhdWx0cyAwc3dhcHMKKwkKKwlBTlRMUiBDOgorCQorCTAuMzd1c2VyIDAuMjZzeXN0ZW0gMDowMC42NGVsYXBzZWQgOTklQ1BVICgwYXZndGV4dCswYXZnZGF0YSAwbWF4cmVzaWRlbnQpaworCTBpbnB1dHMrMG91dHB1dHMgKDBtYWpvcisxMzA5NDRtaW5vcilwYWdlZmF1bHRzIDBzd2FwcworCQorCVRoZSBleHRyYSBzeXN0ZW0gdGltZSBjb21pbmcgZnJvbSB0aGUgZmFjdCB0aGF0IGFsdGhvdWdoIHRoZSB0cmVlIAorCXJld3JpdGluZyBpcyBub3cgb3B0aW1hbCBpbiB0ZXJtcyBvZiBub3QgYWxsb2NhdGluZyB0aGluZ3MgaXQgZG9lcyAKKwlub3QgbmVlZCwgdGhlcmUgaXMgc3RpbGwgYSBsb3QgbW9yZSBvdmVyaGVhZCBpbiBhIHBhcnNlciB0aGF0IGlzIGdlbmVyYXRlZCAKKwlmb3IgZ2VuZXJpYyB1c2UsIGluY2x1ZGluZyBtdWNoIG1vcmUgdXNlIG9mIHN0cnVjdHVyZXMgZm9yIHRva2VucyBhbmQgZXh0cmEgCisJY29weWluZyBhbmQgc28gb24uIEkgd2lsbAorCWNvbnRpbnVlIHRvIHdvcmsgb24gaW1wcm92aWluZyB0aGluZ3Mgd2hlcmUgSSBjYW4sIGJ1dCB0aGUgbmV4dCBiaWcgCisJaW1wcm92ZW1lbnQgd2lsbCBjb21lIGZyb20gVGVyJ3Mgb3B0aW1pemF0aW9uIG9mIHRoZSBhY3R1YWwgY29kZSBzdHJ1Y3R1cmVzIHdlIAorCWdlbmVyYXRlIGluY2x1ZGluZyBub3QgZG9pbmcgdGhpbmdzIHdpdGggcmV3cml0ZSBzdHJlYW1zIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gCisJZG8gYXQgYWxsLgorCQorCVRoZSBzZWNvbmQgbWFjaGluZSBJIHVzZWQgaXMgYWJvdXQgdHdpY2UgYXMgZmFzdCBDUFUgd2lzZSBhcyB0aGUgc3lzdGVtIAorCXRoYXQgd2FzIHVzZWQgb3JpZ2luYWxseSBieSB0aGUgdXNlciB0aGF0IGFza2VkIGFib3V0IHRoaXMgcGVyZm9ybWFuY2UuCisKK0NoYW5nZSA1NTU4IG9uIDIwMDkvMDEvMjggYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlMb3RzIG9mIG9wdGltaXphdGlvbnMgKHRob3VnaCB0aGUgbmV4dCBvbmUgdG8gYmUgY2hlY2tlZCBpbiBpcyB0aGUgaHVnZSAKKwl3aW4pIGZvciBBU1QgYnVpbGRpbmcgYW5kIHZlY3RvciBmYWN0b3JpZXMuCisJCisJQSBsYXJnZSBwYXJ0IG9mIHRyZWUgcmV3cml0aW5nIHdhcyB0aGUgY3JlYXRpb24gb2YgdmVjdG9ycyB0byBob2xkIEFTVCAKKwlub2Rlcy4gQWx0aG91Z2ggSSBoYWQgY3JlYXRlZCBhIHZlY3RvciBmYWN0b3J5LCBmb3Igc29tZSByZWFzb24gSSBuZXZlciBnb3QgCisJYXJvdW5kIHRvIGNyZWF0aW5nIGEgcHJvcGVyIG9uZSwgdGhhdCBwcmUtYWxsb2NhdGVkIHRoZSB2ZWN0b3JzIGluIGNodW5rcyBhbmQgCisJc28gb24uIEkgZ3Vlc3MgSSBqdXN0IGZvcmdvdCB0by4gSGVuY2UgYSBiaWcgd2luIGhlcmUgaXMgcHJldmVudGlvbiBvZiBjYWxsaW5nIAorCW1hbGxvYyBsb3RzIGFuZCBsb3RzIG9mIHRpbWVzIHRvIGNyZWF0ZSB2ZWN0b3JzLgorCQorCUEgc2Vjb25kIGlucHJvdmVtZW50IHdhcyB0byBjaGFuZ2UgdGVoIHZlY3RvciBkZWZpbml0aW9uIHN1Y2ggdGhhdCBpdCAKKwlob2xkcyBhIGNlcnRhaW4gbnVtYmVyIG9mIGVsZW1lbnRzIHdpaHRpbiB0aGUgdmVjdG9yIHN0cnVjdHVyZSBpdHNlbGYsIHJhdGhlciAKKwl0aGFuIG1hbGxvYyBhbmQgZnJlZWluZyB0aGVzZS4gQ3VycmVudGx5IHRoaXMgaXMgc2V0IHRvIDgsIGJ1dCBtYXkgaW5jcmVhc2UuIAorCUZvciBBU1QgY29uc3RydWN0aW9uLCB0aGlzIGlzIGdlbmVyYWxseSBhIGJpZyB3aW4gYmVjYXVzZSBBU1Qgbm9kZXMgZG9uJ3Qgb2Z0ZW4gCisJaGF2ZSBtYW55IGluZGl2aWR1YWwgY2hpbGRyZW4gdW5sZXNzIHRoZXJlIGhhcyBub3QgYmVlbiBhbnkgc2hhcGluZyBnb2luZyBvbiBpbiAKKwl0aGUgcGFyc2VyLiBCdXQgaWYgeW91IGFyZSBub3Qgc2hhcGluZywgdGhlbiB5b3UgZG9uJ3QgcmVhbGx5IG5lZWQgYSB0cmVlLgorCQorCU90aGVyIHBlcmZvcmFtbmNlIGlucHJvdmVtZW50cyBoZXJlIGluY2x1ZGUgbm90IGNhbGxpbmcgZnVuY3Rpb25zIAorCWluZGlyZWN0bHkgd2l0aGluIHRva2VuIHN0cmVhbSBhbmQgY29tbW9uIHRva2VuIHN0cmVhbS4gSGVuY2UgdG9rZW5zIGFyZSAKKwljbGFpbWVkIGRpcmVjdGx5IGZyb20gdGhlIHZlY3RvcnMuIFVzZXJzIGNhbiBvdmVycmlkZSB0aGVzZSBmdW5jaXRvbnMgb2YgY291cnNlIAorCWFuZCBhbGwgdGhpcyBtZWFucyBpcyB0aGF0IGlmIHlvdSBvdmVycmlkZSB0b2tlbnN0cmVhbXMgdGhlbiB5b3UgcHJldHR5IG11Y2ggCisJaGF2ZSB0byBwcm92aWRlIGFsbCB0aGUgbWVodG9kcywgYnV0IHRoZW4gSSB0aGluayB5b3Ugd291ZGwgaGF2ZSB0byBhbnl3YXkgKGFuZCAKKwlJIGRvbid0IGtub3cgb2YgYW55b25lIHRoYXQgaGFzIHdhbnRlZCB0byBkbyB0aGlzIGFzIHlvdSBjYW4gY2FycnkgeW91ciBvd24gCisJc3RydWN0dXJlIGFyb3VuZCB3aXRoIHRoZSB0b2tlbnMgYW55d2F5IGFuZCB0aGF0IGlzIG11Y2ggZWFzaWVyKS4KKworQ2hhbmdlIDU1NTQgb24gMjAwOS8wMS8yNiBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUZpeGVkOiBBTlRMUi0zNzkKKwlGb3Igc29tZSByZWFzb24gaW4gdGhlIHBhc3QsIHRoZSBydWxlTWVtb3phdGlvbigpIHRlbXBsYXRlIGhhZCByZXF1aXJlZCAKKwl0aGF0IHRoZSBuYW1lIHBhcmFtZXRlciBiZSBzZXQgdG8gdGhlIHJ1bGUgbmFtZS4gVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgCisJcmVxdWlyZW1lbnQgYW55IG1vcmUuIFRoZSBuYW1lPXh4eCBvdmVycmlkZSB3aGVuIGludm9raW5nIHRoZSB0ZW1wbGF0ZSB3YXMgCisJY2F1c2luZyBhbGwgdGhlIHNjb3BlIG5hbWVzIGRlcml2ZWQgd2hlbiBjbGVhbmluZyB1cCBpbiBtZW1vaXphdGlvbiB0byBiZSAKKwljYWxsZWQgYWZ0ZXIgdGhlIHJ1bGUgbmFtZSwgd2hpY2ggd2FzIG5vdCBjb3JyZWN0LiBIb3d2ZXIsIHRoaXMgb25seSBhZmZlY3RlZCAKKwl0aGUgb3V0cHV0IHdoZW4gaW4gb3V0cHV0PUFTVCBtb2RlLgorCQorCVRoaXMgdGVtcGxhdGUgaW52b2NhdGlvbiBpcyBub3cgY29ycmVjdGVkLgorCitDaGFuZ2UgNTU1MyBvbiAyMDA5LzAxLzI2IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTMzMAorCU1hbmFnZWQgdG8gZ2V0IHRoZSBvbmUgcnVsZSB0aGF0IGNvdWxkIG5vdCBzZWUgdGhlIEFTVExhYmVsVHlwZSB0byBjYWxsIAorCWJhY2sgaW4gdG8gdGhlIHN1cGVyIHRlbXBsYXRlIEMuc3RnIGFuZCBhc2sgaXQgdG8gY29uc3RydWN0IGh0ZSBuYW1lLiBJIGFtIG5vdCAKKwkxMDAlIHN1cmUgdGhhdCB0aGlzIGZpeGVzIGFsbCBjYXNlcywgYnV0IEkgY2Fubm90IGZpbmQgYW55IHRoYXQgZmFpbC4gUExlYXNlIAorCWxldCBtZSBrbm93IGlmIHlvdSBmaW5kIGFueSBleGFtcG9sZXMgb2YgYmVpbmcgdW5hYmxlIHRvIGRlZmF1bHQgdGhlIAorCUFTVExhYmVsVHlwZSBvcHRpb24gaW4gdGhlIEMgdGFyZ2V0LgorCitDaGFuZ2UgNTU1MiBvbiAyMDA5LzAxLzI1IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJUHJvZ3Jlc3M6IEFOVExSLTMyNworCUZpeCBkZWJ1ZyBjb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzIHdoZW4gb3V0cHV0PUFTVCBzdWNoIHRoYXQgY29kZQorCWNhbiBhdCBsZWFzdCBiZSBnZW5lcmF0ZWQgYW5kIEkgY2FuIGRlYnVnIHRoZSBvdXRwdXQgY29kZSBjb3JyZWN0bHkuCisJTm90ZSB0aGF0IHRoaXMgY2hlY2tpbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGRlYnVnZ2luZyByZXF1aXJlbWVudHMKKwlmb3IgdHJlZSBnZW5lcmF0aW5nIHBhcnNlcnMuCisKK0NoYW5nZSA1NTUxIG9uIDIwMDkvMDEvMjUgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZDogQU5UTFItMjg3CisJTW9zdCBvZiB0aGUgc291cmNlIGZpbGVzIGRpZCBub3QgaW5jbHVkZSB0aGUgQlNEIGxpY2Vuc2UuIFRIaXMgbWlnaHQKKwlub3QgYmUgdGhhdCBiaWcgYSBkZWFsIGdpdmVuIHRoYXQgSSBkb24ndCBjYXJlIHdoYXQgcGVvcGxlIGRvIHdpdGggaXQKKwlvdGhlciB0aGFuIHRha2UgbXkgbmFtZSBvZmYgaXQsIGJ1dCBoYXZpbmcgdGhlIGxpY2Vuc2UgcmVwcm9kdWNlZCAKKwlldmVyeXdoZXJlIGF0IGxlYXN0IG1ha2VzIHRoaW5ncyBwZXJmZWN0bHkgY2xlYXIuIEhlbmNlIHRoaXMgbWFzcyBjaGFuZ2Ugb2YgCisJc291cmNlcyBhbmQgdGVtcGxhdGVzIHRvIGluY2x1ZGUgdGhlIGxpY2Vuc2UuCisKK0NoYW5nZSA1NTQ5IG9uIDIwMDkvMDEvMjUgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZDogQU5UTFItMzU0CisJVXNpbmcgMC4wRCBhcyB0aGUgZGVmYXVsdCBpbml0aWFsaXplIHZhbHVlIGZvciBhIGRvdWJsZSBjYXVzZWQKKwlWUyAyMDAzIEMgY29tcGlsZXIgdG8gYm9tYiBvdXQuIFRoZXJlIHNlZXNtIHRvIGJlIG5vIHJlYXNvbiBvdGhlcgorCXRoYW4gZm9yY2Ugb2YgaGFiaXQgdG8gc2V0IHRoaXMgdG8gMC4wRCBzbyBJIGhhdmUgZHJvcHBlZCB0aGUgRCBzbworCXRoYXQgb2xkZXIgY29tcGlsZXJzIGRvIG5vdCBjb21wbGFpbi4KKworQ2hhbmdlIDU1NDcgb24gMjAwOS8wMS8yNSBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUZpeGVkOiBBTlRMUi0yODIKKwlBbGwgcmVmZXJlbmNlcyBhcmUgbm93IHVuYWRvcm5lZCB3aXRoIGFueSB0eXBlIG9mIE5VTEwgY2hlY2sgZm9yIHRoZSAKKwlmb2xsb3dpbmcgcmVhc29uczoKKwkKKwkJMSkgQSBOVUxMIHJlZmVyZW5jZSBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSAKKwkJICAgZ3JhbW1hciBhbmQgd2UgbmVlZCB0aGUgcHJvZ3JhbSB0byBmYWlsIGltbWVkaWF0ZWx5IHNvIAorCQkgICB0aGF0IHRoZSBwcm9ncmFtbWVyIGNhbiB3b3JrIG91dCB3aGVyZSB0aGUgcHJvYmxlbSBvY2N1cmVkOworCQkyKSBNb3N0IG9mIHRoZSB0aW1lLCB0aGUgb25seSBzZW5zaWJsZSB2YWx1ZSB0aGF0IGNhbiBiZSAKKwkJICAgcmV0dXJuZWQgaXMgTlVMTCBvciAwIHdoaWNoCisJCSAgIG9idmlhdGVzIHRoZSBOVUxMIGNoZWNrIGluIHRoZSBmaXJzdCBwbGFjZTsKKwkJMykgSWYgd2UgcmVwbGFjZSBhIE5VTEwgcmVmZXJlbmNlIHdpdGggc29tZSB2YWx1ZSBzdWNoIGFzIDAsIAorCQkgICB0aGVuIHRoZSBwcm9ncmFtIG1heSBibGl0aGVseSBjb250aW51ZSBidXQganVzdCBkbyBzb21ldGhpbmcgCisJCSAgIGxvZ2ljYWxseSB3cm9uZywgd2hpY2ggd2lsbCBiZSB2ZXJ5IGRpZmZpY3VsdCBmb3IgdGhlIAorCQkgICBncmFtbWFyIHByb2dyYW1tZXIgdG8gZGV0ZWN0IGFuZCBjb3JyZWN0LgorCitDaGFuZ2UgNTU0NSBvbiAyMDA5LzAxLzI0IGJ5IGppbWlAamltaS5qaW1pLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTM1NworCVRoZSBidWcgcmVwb3J0IHdhcyBjb3JyZWN0IGluIHRoYXQgdGhlIHR5cGVzIG9mIHJlZmVyZW5jZXMgdG8gdGhpbmdzCisJbGlrZSAkc3RhcnQgd2VyZSBiZWluZyBpbmNvcnJlY3RseSBjYXN0IGFzIHRoZXkgd2VyIG5vdCBjaGFuZ2VkIGZyb20gCisJSmF2YSBzdHlsZSBjYXN0cyAoYW5kIHRoZSBjYXN0cyBhcmUgdW5uZWNjZXNzYXJ5KS4gdGhpcyBpcyBub3cgZml4ZWQgCisJYW5kIHJlZmVyZW5jZXMgYXJlIHJlZmVyZW5jaW5nIHRoZSBjb3JyZWN0LCB1bmNhc3QsIHR5cGVzLgorCUhvd2V2ZXIsIHRoZSBidWcgcmVwb3J0IHdhcyB3cm9uZyBpbiB0aGF0IHRoZSByZWZlcmVuY2UgaW4gdGhlIGJvayB0byAKKwkkc3RhcnQucG9zIHdpbGwgb25seSB3b3JrIGZvciBKYXZhIGFuZCByZWFsbHksIGl0IGlzIGluY29ycmVjdCBpbiB0aGUgCisJYm9vayBiZWNhdXNlIGl0IHNob3VkbCBub3QgYWNjZXNzIHRoZSAucG9zIG1lbWJlciBkaXJlY3RseSBidXQgc2h1ZGwgCisJYmUgdXNpbmcgJHN0YXJ0LmdldENoYXJQb3NpdGlvbkluTGluZSgpLgorCUJlY2F1c2UgdGhlcmUgaXMgbm8gYWNjZXNzIHF1YWxpZmljYXRpb24gaW4gQywgb25lIGNvdWxkIHVzZSAKKwkkc3RhcnQuY2hhclBvc2l0aW9uLCBob3dldmVyCisJcmVhbGx5IHRoaXMgc2hvdWxkIGJlICRzdGFydC0+Z2V0Q2hhclBvc2l0aW9uSW5MaW5lKCRzdGFydCk7CisKK0NoYW5nZSA1NTQxIG9uIDIwMDkvMDEvMjQgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZCAtIEFOVExSLTM2NworCVRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBmcmVlIG1ldGhvZCBvZiBhIHJlY29nbml6ZXIgd2FzIG5vdCAKKwlkaXN0aW5ndWlzaGluZyB0cmVlIHBhcnNlcnMgZnJvbSBwYXJzZXJzIHdoZW4gaXQgY2FtZSB0byBjYWxsaW5nIGRlbGVnYXRlIGZyZWUgCisJZnVuY3Rpb25zLgorCVRoaXMgaXMgbm93IGNvcnJlY3RlZC4KKworQ2hhbmdlIDU1NDAgb24gMjAwOS8wMS8yNCBieSBqaW1pQGppbWkuamltaS5hbnRscjMKKworCUZpeGVkIEFOVExSLTM1NQorCUVuc3VyZSB0aGF0IHdlIGRvIG5vdCBhdHRlbXB0IHRvIGZyZWUgYW55IG1lbW9yeSB0aGF0IHdlIGRpZCBub3QKKwlhY3R1YWxseSBhbGxvY2F0ZSBiZWNhdXNlIHRoZSBwYXJzZXIgcnVsZSB3YXMgYmVpbmcgZXhlY3V0ZWQgaW4KKwliYWNrdHJhY2tpbmcgbW9kZS4KKworQ2hhbmdlIDU1Mzkgb24gMjAwOS8wMS8yNCBieSBqaW1pQGppbWkuamltaXZpc3RhLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTM1NQorCVdoZW4gYSBDIHRhcmdldHRlZCBwYXJzZXIgaXMgcHJvZHVjaW5nIGluIGJhY2t0cmFja2luZyBtb2RlLCB0aGVuIHRoZSAKKwljcmVhdGlvbiBvZiBuZXcgc3RyZWFtIHJld3JpdGUgc3RydWN0dXJlcyBzaG91ZGwgbm90IGhhcHBlbiBpZiB0aGUgcnVsZSBpcyAKKwljdXJyZW50bHkgYmFja3RyYWNraW5nCisKK0NoYW5nZSA1NTAyIG9uIDIwMDgvMTIvMTEgYnkgamltaUBqaW1pLmppbWkuYW50bHIzCisKKwlGaXhlZDogQU5UTFItMzQ5IEVuc3VyZSB0aGF0IGFsbCBtYXJrZXIgbGFiZWxzIGluIHRoZSBsZXhlciBhcmUgNjQgYml0IAorCWNvbXBhdGlibGUKKworQ2hhbmdlIDU0NzMgb24gMjAwOC8xMi8wMSBieSBqaW1pQGppbWkuamltaXZpc3RhLmFudGxyMworCisJRml4ZWQ6IEFOVExSLTM1MCAtIEMgcnVudGltZSB1c2Ugb2YgbWVtY3B5CisJUHJpb3IgY2hhbmdlIHRvIHVzZSBtZW1jcHkgaW5zdGVhZCBvZiBtZW1tb3ZlIGluIGFsbCBjYXNlcyBtaXNzZWQgdGhlIAorCWZhY3QgdGhhdCB0aGUgc3RyaW5nIGZhY3RvcnkgY2FuIGJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIG92ZXJsYXBzIG9jY3VyLiBXZSBub3cgCisJaGF2ZSBBTlRMUjNfTUVNQ1BZIGFuZCBBTlRMUjNfTUVNTU9WRSBhbmQgdXNlIHRoZSB0d28gYXBwcm9wcmlhdGVseS4KKworQ2hhbmdlIDUzODcgb24gMjAwOC8xMS8wNSBieSBwYXJydEBwYXJydC5zcG9yaworCisJRml4ZWQgeCs9LiBpc3N1ZSB3aXRoIHRyZWUgZ3JhbW1hcnM7IGFkZGVkIHVuaXQgdGVzdAorCitDaGFuZ2UgNTMyNSBvbiAyMDA4LzEwLzIzIGJ5IHBhcnJ0QHBhcnJ0LnNwb3JrCisKKwlXZSB3ZXJlIGFsbCByZWYnaW5nIGJhY2t0cmFja2luZz09MCBoYXJkY29kZWQgaW5zdGVhZCBjaGVja2luZyB0aGUgCisJQHN5bnByZWRnYXRlIGFjdGlvbi4KKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL0N2czIwMDUuc2xuIGIvYW50bHItMy40L3J1bnRpbWUvQy9DdnMyMDA1LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA1MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9DdnMyMDA1LnNsbgpAQCAtMCwwICsxLDUzIEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwCisjIFZpc3VhbCBTdHVkaW8gMjAwNQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJDIiwgIkN2czIwMDUudmNwcm9qIiwgInswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb3VyY2VDb2RlQ29udHJvbCkgPSBwcmVTb2x1dGlvbgorCQlTY2NOdW1iZXJPZlByb2plY3RzID0gMgorCQlTY2NQcm9qZWN0TmFtZTAgPSBQZXJmb3JjZVx1MDAyMFByb2plY3QKKwkJU2NjTG9jYWxQYXRoMCA9IC4uXFwuLgorCQlTY2NQcm92aWRlcjAgPSBNU1NDQ0k6UGVyZm9yY2VcdTAwMjBTQ00KKwkJU2NjUHJvamVjdEZpbGVQYXRoUmVsYXRpdml6ZWRGcm9tQ29ubmVjdGlvbjAgPSBydW50aW1lXFxDXFwKKwkJU2NjUHJvamVjdFVuaXF1ZU5hbWUxID0gQ3ZzMjAwNS52Y3Byb2oKKwkJU2NjTG9jYWxQYXRoMSA9IC4uXFwuLgorCQlTY2NQcm9qZWN0RmlsZVBhdGhSZWxhdGl2aXplZEZyb21Db25uZWN0aW9uMSA9IHJ1bnRpbWVcXENcXAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z0RMTHxXaW4zMiA9IERlYnVnRExMfFdpbjMyCisJCURlYnVnRExMfHg2NCA9IERlYnVnRExMfHg2NAorCQlEZXBsb3ltZW50fFdpbjMyID0gRGVwbG95bWVudHxXaW4zMgorCQlEZXBsb3ltZW50fHg2NCA9IERlcGxveW1lbnR8eDY0CisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZURMTHxXaW4zMiA9IFJlbGVhc2VETEx8V2luMzIKKwkJUmVsZWFzZURMTHx4NjQgPSBSZWxlYXNlRExMfHg2NAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZWJ1Z0RMTHxXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z0RMTHxXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZWJ1Z0RMTHxXaW4zMi5CdWlsZC4wID0gRGVidWdETEx8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uRGVidWdETEx8eDY0LkFjdGl2ZUNmZyA9IERlYnVnRExMfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZWJ1Z0RMTHx4NjQuQnVpbGQuMCA9IERlYnVnRExMfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZXBsb3ltZW50fFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnRExMfFdpbjMyCisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LkRlcGxveW1lbnR8V2luMzIuQnVpbGQuMCA9IERlYnVnRExMfFdpbjMyCisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LkRlcGxveW1lbnR8eDY0LkFjdGl2ZUNmZyA9IERlYnVnRExMfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5EZXBsb3ltZW50fHg2NC5CdWlsZC4wID0gRGVidWdETEx8eDY0CisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0CisJCXswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlRExMfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VETEx8V2luMzIKKwkJezBGMEZFMDNBLTc4RjMtNEIzNC05RENFLTBDREZGMUZCNUM0MH0uUmVsZWFzZURMTHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZURMTHxXaW4zMgorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlRExMfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlRExMfHg2NAorCQl7MEYwRkUwM0EtNzhGMy00QjM0LTlEQ0UtMENERkYxRkI1QzQwfS5SZWxlYXNlRExMfHg2NC5CdWlsZC4wID0gUmVsZWFzZURMTHx4NjQKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL0N2czIwMDUudmNwcm9qIGIvYW50bHItMy40L3J1bnRpbWUvQy9DdnMyMDA1LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA4MDdjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9DdnMyMDA1LnZjcHJvagpAQCAtMCwwICsxLDEwNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI4LjAwIgorCU5hbWU9IkMiCisJUHJvamVjdEdVSUQ9InswRjBGRTAzQS03OEYzLTRCMzQtOURDRS0wQ0RGRjFGQjVDNDB9IgorCVJvb3ROYW1lc3BhY2U9IkMiCisJU2NjUHJvamVjdE5hbWU9IlBlcmZvcmNlIFByb2plY3QiCisJU2NjTG9jYWxQYXRoPSIuLlwuLiIKKwlTY2NQcm92aWRlcj0iTVNTQ0NJOlBlcmZvcmNlIFNDTSIKKwlLZXl3b3JkPSJXaW4zMlByb2oiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0ieDY0IgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IkRlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDs7JnF1b3Q7JChTb2x1dGlvbkRpcilcLi5cLi5caW5jbHVkZSZxdW90OyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJTWluaW1hbFJlYnVpbGQ9ImZhbHNlIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlTdHJ1Y3RNZW1iZXJBbGlnbm1lbnQ9IjAiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMCIKKwkJCQlGbG9hdGluZ1BvaW50TW9kZWw9IjAiCisJCQkJRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJRXhwYW5kQXR0cmlidXRlZFNvdXJjZT0idHJ1ZSIKKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjIiCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSI0IgorCQkJCVdhcm5Bc0Vycm9yPSJmYWxzZSIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9ImZhbHNlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ2FsbGluZ0NvbnZlbnRpb249IjAiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IldzMl8zMi5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2FudGxyM2NkLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDs7JnF1b3Q7JChTb2x1dGlvbkRpcilcLi5cLi5caW5jbHVkZSZxdW90OyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJTWluaW1hbFJlYnVpbGQ9ImZhbHNlIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlTdHJ1Y3RNZW1iZXJBbGlnbm1lbnQ9IjAiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMCIKKwkJCQlGbG9hdGluZ1BvaW50TW9kZWw9IjAiCisJCQkJRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJRXhwYW5kQXR0cmlidXRlZFNvdXJjZT0idHJ1ZSIKKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjIiCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSI0IgorCQkJCVdhcm5Bc0Vycm9yPSJmYWxzZSIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9ImZhbHNlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ2FsbGluZ0NvbnZlbnRpb249IjAiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IldzMl8zMi5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2FudGxyM2NkLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0IgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIzIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlGYXZvclNpemVPclNwZWVkPSIxIgorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIgorCQkJCUVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM9InRydWUiCisJCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIxIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIgorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjIiCisJCQkJRmxvYXRpbmdQb2ludE1vZGVsPSIyIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIgorCQkJCVJ1bnRpbWVUeXBlSW5mbz0iZmFsc2UiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXGFzbVxyZWxlYXNlIgorCQkJCVdhcm5pbmdMZXZlbD0iNCIKKwkJCQlXYXJuQXNFcnJvcj0idHJ1ZSIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9ImZhbHNlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ2FsbGluZ0NvbnZlbnRpb249IjAiCisJCQkJQ29tcGlsZUFzPSIxIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTFRDRyIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9hbnRscjNjLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCQlWYWxpZGF0ZUludGVsbGlTZW5zZT0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjMiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIgorCQkJCUZhdm9yU2l6ZU9yU3BlZWQ9IjEiCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiCisJCQkJRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz0idHJ1ZSIKKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChTb2x1dGlvbkRpcilcaW5jbHVkZSZxdW90OyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjEiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMCIKKwkJCQlGbG9hdGluZ1BvaW50TW9kZWw9IjIiCisJCQkJUnVudGltZVR5cGVJbmZvPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cYXNtXHJlbGVhc2UiCisJCQkJV2FybmluZ0xldmVsPSI0IgorCQkJCVdhcm5Bc0Vycm9yPSJ0cnVlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDYWxsaW5nQ29udmVudGlvbj0iMCIKKwkJCQlDb21waWxlQXM9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9MVENHIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IldzMl8zMi5saWIiCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL2FudGxyM2MubGliIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJCVZhbGlkYXRlSW50ZWxsaVNlbnNlPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlRExMfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMyIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMiIKKwkJCQlFbmFibGVJbnRyaW5zaWNGdW5jdGlvbnM9InRydWUiCisJCQkJRmF2b3JTaXplT3JTcGVlZD0iMSIKKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSIKKwkJCQlFbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPSJ0cnVlIgorCQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFNvbHV0aW9uRGlyKVxpbmNsdWRlJnF1b3Q7IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSIKKwkJCQlFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PSIyIgorCQkJCUZsb2F0aW5nUG9pbnRNb2RlbD0iMiIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIKKwkJCQlSdW50aW1lVHlwZUluZm89ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlxhc21ccmVsZWFzZSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjQiCisJCQkJV2FybkFzRXJyb3I9InRydWUiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxhbnRscjNjLmRsbCIKKwkJCQlWZXJzaW9uPSIzLjBiNCIKKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCQlWYWxpZGF0ZUludGVsbGlTZW5zZT0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZURMTHx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjMiCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjIiCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIgorCQkJCUZhdm9yU2l6ZU9yU3BlZWQ9IjEiCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiCisJCQkJRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz0idHJ1ZSIKKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJnF1b3Q7JChTb2x1dGlvbkRpcilcaW5jbHVkZSZxdW90OyIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjEiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiCisJCQkJRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD0iMCIKKwkJCQlGbG9hdGluZ1BvaW50TW9kZWw9IjIiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiCisJCQkJUnVudGltZVR5cGVJbmZvPSJmYWxzZSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cYXNtXHJlbGVhc2UiCisJCQkJV2FybmluZ0xldmVsPSI0IgorCQkJCVdhcm5Bc0Vycm9yPSJ0cnVlIgorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0iZmFsc2UiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDYWxsaW5nQ29udmVudGlvbj0iMCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iV3MyXzMyLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcYW50bHIzYzY0LmRsbCIKKwkJCQlWZXJzaW9uPSIzLjAuMC4xIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCUltcG9ydExpYnJhcnk9IiQoVGFyZ2V0RGlyKSQoVGFyZ2V0TmFtZSlfZGxsLmxpYiIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJCVZhbGlkYXRlSW50ZWxsaVNlbnNlPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z0RMTHxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlPdXRwdXRzPSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCU1pbmltYWxSZWJ1aWxkPSJmYWxzZSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjAiCisJCQkJRmxvYXRpbmdQb2ludE1vZGVsPSIwIgorCQkJCUZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUV4cGFuZEF0dHJpYnV0ZWRTb3VyY2U9InRydWUiCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iNCIKKwkJCQlXYXJuQXNFcnJvcj0iZmFsc2UiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxhbnRscjNjZC5kbGwiCisJCQkJVmVyc2lvbj0iMS4wYjQiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCUltcG9ydExpYnJhcnk9IiQoVGFyZ2V0RGlyKSQoVGFyZ2V0TmFtZSlfZGxsLmxpYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z0RMTHx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlPdXRwdXRzPSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiZxdW90OyQoU29sdXRpb25EaXIpXGluY2x1ZGUmcXVvdDsiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ09OU09MRSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCU1pbmltYWxSZWJ1aWxkPSJmYWxzZSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJU3RydWN0TWVtYmVyQWxpZ25tZW50PSIwIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCUVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ9IjAiCisJCQkJRmxvYXRpbmdQb2ludE1vZGVsPSIwIgorCQkJCUZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCUV4cGFuZEF0dHJpYnV0ZWRTb3VyY2U9InRydWUiCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iNCIKKwkJCQlXYXJuQXNFcnJvcj0iZmFsc2UiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJmYWxzZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNhbGxpbmdDb252ZW50aW9uPSIwIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJXczJfMzIubGliIgorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVxhbnRscjNjNjRkLmRsbCIKKwkJCQlWZXJzaW9uPSIzLjAuMC4xIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKFRhcmdldERpcikkKFRhcmdldE5hbWUpX2RsbC5saWIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2Jhc2VyZWNvZ25pemVyLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2Jhc2V0cmVlLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2Jhc2V0cmVlYWRhcHRvci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNiaXRzZXQuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzY29sbGVjdGlvbnMuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzY29tbW9udG9rZW4uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzY29tbW9udHJlZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNjb21tb250cmVlYWRhcHRvci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNjb21tb250cmVlbm9kZXN0cmVhbS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNjb252ZXJ0dXRmLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2N5Y2xpY2RmYS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNkZWJ1Z2hhbmRsZXJzLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM2VuY29kaW5ncy5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNleGNlcHRpb24uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzZmlsZXN0cmVhbS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNpbnB1dHN0cmVhbS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNpbnRzdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzbGV4ZXIuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzcGFyc2VyLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM3Jld3JpdGVzdHJlYW1zLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3JjXGFudGxyM3N0cmluZy5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjNzdHJpbmdzdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzdG9rZW5zdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzcmNcYW50bHIzdHJlZXBhcnNlci5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHNyY1xhbnRscjN1Y3MyaW5wdXRzdHJlYW0uYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCIKKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2Jhc2VyZWNvZ25pemVyLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNiYXNldHJlZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzYmFzZXRyZWVhZGFwdG9yLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNiaXRzZXQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2NvbGxlY3Rpb25zLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNjb21tb250b2tlbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzY29tbW9udHJlZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzY29tbW9udHJlZWFkYXB0b3IuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNjb252ZXJ0dXRmLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNjeWNsaWNkZmEuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzZGVmcy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzZW5jb2RpbmdzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNlcnJvcnMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2V4Y2VwdGlvbi5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzZmlsZXN0cmVhbS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzaW5wdXQuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2ludGVyZmFjZXMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM2ludHN0cmVhbS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzbGV4ZXIuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM21lbW9yeS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzcGFyc2VyLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjNwYXJzZXRyZWUuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM3JlY29nbml6ZXJzaGFyZWRzdGF0ZS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzcmV3cml0ZXN0cmVhbXMuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxpbmNsdWRlXGFudGxyM3N0cmluZy5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzc3RyaW5nc3RyZWFtLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5caW5jbHVkZVxhbnRscjN0b2tlbnN0cmVhbS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGluY2x1ZGVcYW50bHIzdHJlZXBhcnNlci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlRlbXBsYXRlcyIKKwkJCUZpbHRlcj0iLnN0ZyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcb3JnXGFudGxyXGNvZGVnZW5cdGVtcGxhdGVzXENcQVNULnN0ZyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXG9yZ1xhbnRsclxjb2RlZ2VuXHRlbXBsYXRlc1xDXEFTVERiZy5zdGciCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xvcmdcYW50bHJcY29kZWdlblx0ZW1wbGF0ZXNcQ1xBU1RQYXJzZXIuc3RnIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcb3JnXGFudGxyXGNvZGVnZW5cdGVtcGxhdGVzXENcQVNUVHJlZVBhcnNlci5zdGciCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHNyY1xvcmdcYW50bHJcY29kZWdlblx0ZW1wbGF0ZXNcQ1xDLnN0ZyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cc3JjXG9yZ1xhbnRsclxjb2RlZ2VuXHRlbXBsYXRlc1xDXERiZy5zdGciCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbHRlcgorCQkJCU5hbWU9IkludGVyZmFjZXMiCisJCQkJRmlsdGVyPSIqLnN0aSIKKwkJCQk+CisJCQkJPEZpbGUKKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcb3JnXGFudGxyXGNvZGVnZW5cdGVtcGxhdGVzXEFOVExSQ29yZS5zdGkiCisJCQkJCT4KKwkJCQk8L0ZpbGU+CisJCQk8L0ZpbHRlcj4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkphdmEiCisJCQlGaWx0ZXI9IiouamF2YSIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxzcmNcb3JnXGFudGxyXGNvZGVnZW5cQ1RhcmdldC5qYXZhIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkRveHlnZW4iCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkb3h5Z2VuXGF0c2VjdGlvbnMuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cYnVpbGQuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cYnVpbGRyZWMuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cY2hhbmdlczMxLmRveCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkb3h5Z2VuXGRveHlnZW5ncm91cHMuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5cZ2VuZXJhdGUuZG94IgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGRveHlnZW5caW50ZXJvcC5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxtYWlucGFnZS5kb3giCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZG94eWdlblxydW50aW1lLmRveCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxkb3h5Z2VuXHVzaW5nLmRveCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJCTxHbG9iYWwKKwkJCU5hbWU9IkRldlBhcnRuZXJfSXNJbnN0cnVtZW50ZWQiCisJCQlWYWx1ZT0iMCIKKwkJLz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL0lOU1RBTEwgYi9hbnRsci0zLjQvcnVudGltZS9DL0lOU1RBTEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxYzMyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvSU5TVEFMTApAQCAtMCwwICsxLDM2NSBAQAorSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsCisyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywKK3dpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQuCisKK0Jhc2ljIEluc3RhbGxhdGlvbgorPT09PT09PT09PT09PT09PT09CisKKyAgIEJyaWVmbHksIHRoZSBzaGVsbCBjb21tYW5kcyBgLi9jb25maWd1cmU7IG1ha2U7IG1ha2UgaW5zdGFsbCcgc2hvdWxkCitjb25maWd1cmUsIGJ1aWxkLCBhbmQgaW5zdGFsbCB0aGlzIHBhY2thZ2UuICBUaGUgZm9sbG93aW5nCittb3JlLWRldGFpbGVkIGluc3RydWN0aW9ucyBhcmUgZ2VuZXJpYzsgc2VlIHRoZSBgUkVBRE1FJyBmaWxlIGZvcgoraW5zdHJ1Y3Rpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZS4gIFNvbWUgcGFja2FnZXMgcHJvdmlkZSB0aGlzCitgSU5TVEFMTCcgZmlsZSBidXQgZG8gbm90IGltcGxlbWVudCBhbGwgb2YgdGhlIGZlYXR1cmVzIGRvY3VtZW50ZWQKK2JlbG93LiAgVGhlIGxhY2sgb2YgYW4gb3B0aW9uYWwgZmVhdHVyZSBpbiBhIGdpdmVuIHBhY2thZ2UgaXMgbm90CituZWNlc3NhcmlseSBhIGJ1Zy4gIE1vcmUgcmVjb21tZW5kYXRpb25zIGZvciBHTlUgcGFja2FnZXMgY2FuIGJlIGZvdW5kCitpbiAqbm90ZSBNYWtlZmlsZSBDb252ZW50aW9uczogKHN0YW5kYXJkcylNYWtlZmlsZSBDb252ZW50aW9ucy4KKworICAgVGhlIGBjb25maWd1cmUnIHNoZWxsIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBjb3JyZWN0IHZhbHVlcyBmb3IKK3ZhcmlvdXMgc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uICBJdCB1c2VzCit0aG9zZSB2YWx1ZXMgdG8gY3JlYXRlIGEgYE1ha2VmaWxlJyBpbiBlYWNoIGRpcmVjdG9yeSBvZiB0aGUgcGFja2FnZS4KK0l0IG1heSBhbHNvIGNyZWF0ZSBvbmUgb3IgbW9yZSBgLmgnIGZpbGVzIGNvbnRhaW5pbmcgc3lzdGVtLWRlcGVuZGVudAorZGVmaW5pdGlvbnMuICBGaW5hbGx5LCBpdCBjcmVhdGVzIGEgc2hlbGwgc2NyaXB0IGBjb25maWcuc3RhdHVzJyB0aGF0Cit5b3UgY2FuIHJ1biBpbiB0aGUgZnV0dXJlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGFuZCBhCitmaWxlIGBjb25maWcubG9nJyBjb250YWluaW5nIGNvbXBpbGVyIG91dHB1dCAodXNlZnVsIG1haW5seSBmb3IKK2RlYnVnZ2luZyBgY29uZmlndXJlJykuCisKKyAgIEl0IGNhbiBhbHNvIHVzZSBhbiBvcHRpb25hbCBmaWxlICh0eXBpY2FsbHkgY2FsbGVkIGBjb25maWcuY2FjaGUnCithbmQgZW5hYmxlZCB3aXRoIGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJyBvciBzaW1wbHkgYC1DJykgdGhhdCBzYXZlcwordGhlIHJlc3VsdHMgb2YgaXRzIHRlc3RzIHRvIHNwZWVkIHVwIHJlY29uZmlndXJpbmcuICBDYWNoaW5nIGlzCitkaXNhYmxlZCBieSBkZWZhdWx0IHRvIHByZXZlbnQgcHJvYmxlbXMgd2l0aCBhY2NpZGVudGFsIHVzZSBvZiBzdGFsZQorY2FjaGUgZmlsZXMuCisKKyAgIElmIHlvdSBuZWVkIHRvIGRvIHVudXN1YWwgdGhpbmdzIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UsIHBsZWFzZSB0cnkKK3RvIGZpZ3VyZSBvdXQgaG93IGBjb25maWd1cmUnIGNvdWxkIGNoZWNrIHdoZXRoZXIgdG8gZG8gdGhlbSwgYW5kIG1haWwKK2RpZmZzIG9yIGluc3RydWN0aW9ucyB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgYFJFQURNRScgc28gdGhleSBjYW4KK2JlIGNvbnNpZGVyZWQgZm9yIHRoZSBuZXh0IHJlbGVhc2UuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBjYWNoZSwgYW5kIGF0Citzb21lIHBvaW50IGBjb25maWcuY2FjaGUnIGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91CittYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisKKyAgIFRoZSBmaWxlIGBjb25maWd1cmUuYWMnIChvciBgY29uZmlndXJlLmluJykgaXMgdXNlZCB0byBjcmVhdGUKK2Bjb25maWd1cmUnIGJ5IGEgcHJvZ3JhbSBjYWxsZWQgYGF1dG9jb25mJy4gIFlvdSBuZWVkIGBjb25maWd1cmUuYWMnIGlmCit5b3Ugd2FudCB0byBjaGFuZ2UgaXQgb3IgcmVnZW5lcmF0ZSBgY29uZmlndXJlJyB1c2luZyBhIG5ld2VyIHZlcnNpb24KK29mIGBhdXRvY29uZicuCisKKyAgIFRoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6CisKKyAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQorICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uCisKKyAgICAgUnVubmluZyBgY29uZmlndXJlJyBtaWdodCB0YWtlIGEgd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMKKyAgICAgc29tZSBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KKworICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgorCisgIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAorICAgICB0aGUgcGFja2FnZSwgZ2VuZXJhbGx5IHVzaW5nIHRoZSBqdXN0LWJ1aWx0IHVuaW5zdGFsbGVkIGJpbmFyaWVzLgorCisgIDQuIFR5cGUgYG1ha2UgaW5zdGFsbCcgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIGFueSBkYXRhIGZpbGVzIGFuZAorICAgICBkb2N1bWVudGF0aW9uLiAgV2hlbiBpbnN0YWxsaW5nIGludG8gYSBwcmVmaXggb3duZWQgYnkgcm9vdCwgaXQgaXMKKyAgICAgcmVjb21tZW5kZWQgdGhhdCB0aGUgcGFja2FnZSBiZSBjb25maWd1cmVkIGFuZCBidWlsdCBhcyBhIHJlZ3VsYXIKKyAgICAgdXNlciwgYW5kIG9ubHkgdGhlIGBtYWtlIGluc3RhbGwnIHBoYXNlIGV4ZWN1dGVkIHdpdGggcm9vdAorICAgICBwcml2aWxlZ2VzLgorCisgIDUuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgaW5zdGFsbGNoZWNrJyB0byByZXBlYXQgYW55IHNlbGYtdGVzdHMsIGJ1dAorICAgICB0aGlzIHRpbWUgdXNpbmcgdGhlIGJpbmFyaWVzIGluIHRoZWlyIGZpbmFsIGluc3RhbGxlZCBsb2NhdGlvbi4KKyAgICAgVGhpcyB0YXJnZXQgZG9lcyBub3QgaW5zdGFsbCBhbnl0aGluZy4gIFJ1bm5pbmcgdGhpcyB0YXJnZXQgYXMgYQorICAgICByZWd1bGFyIHVzZXIsIHBhcnRpY3VsYXJseSBpZiB0aGUgcHJpb3IgYG1ha2UgaW5zdGFsbCcgcmVxdWlyZWQKKyAgICAgcm9vdCBwcml2aWxlZ2VzLCB2ZXJpZmllcyB0aGF0IHRoZSBpbnN0YWxsYXRpb24gY29tcGxldGVkCisgICAgIGNvcnJlY3RseS4KKworICA2LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCisgICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCisgICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgorICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKKyAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5CisgICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0CisgICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQorICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgNy4gT2Z0ZW4sIHlvdSBjYW4gYWxzbyB0eXBlIGBtYWtlIHVuaW5zdGFsbCcgdG8gcmVtb3ZlIHRoZSBpbnN0YWxsZWQKKyAgICAgZmlsZXMgYWdhaW4uICBJbiBwcmFjdGljZSwgbm90IGFsbCBwYWNrYWdlcyBoYXZlIHRlc3RlZCB0aGF0CisgICAgIHVuaW5zdGFsbGF0aW9uIHdvcmtzIGNvcnJlY3RseSwgZXZlbiB0aG91Z2ggaXQgaXMgcmVxdWlyZWQgYnkgdGhlCisgICAgIEdOVSBDb2RpbmcgU3RhbmRhcmRzLgorCisgIDguIFNvbWUgcGFja2FnZXMsIHBhcnRpY3VsYXJseSB0aG9zZSB0aGF0IHVzZSBBdXRvbWFrZSwgcHJvdmlkZSBgbWFrZQorICAgICBkaXN0Y2hlY2snLCB3aGljaCBjYW4gYnkgdXNlZCBieSBkZXZlbG9wZXJzIHRvIHRlc3QgdGhhdCBhbGwgb3RoZXIKKyAgICAgdGFyZ2V0cyBsaWtlIGBtYWtlIGluc3RhbGwnIGFuZCBgbWFrZSB1bmluc3RhbGwnIHdvcmsgY29ycmVjdGx5LgorICAgICBUaGlzIHRhcmdldCBpcyBnZW5lcmFsbHkgbm90IHJ1biBieSBlbmQgdXNlcnMuCisKK0NvbXBpbGVycyBhbmQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisKKyAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Cit0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBSdW4gYC4vY29uZmlndXJlIC0taGVscCcKK2ZvciBkZXRhaWxzIG9uIHNvbWUgb2YgdGhlIHBlcnRpbmVudCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKyAgIFlvdSBjYW4gZ2l2ZSBgY29uZmlndXJlJyBpbml0aWFsIHZhbHVlcyBmb3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCitieSBzZXR0aW5nIHZhcmlhYmxlcyBpbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIHRoZSBlbnZpcm9ubWVudC4gIEhlcmUKK2lzIGFuIGV4YW1wbGU6CisKKyAgICAgLi9jb25maWd1cmUgQ0M9Yzk5IENGTEFHUz0tZyBMSUJTPS1scG9zaXgKKworICAgKk5vdGUgRGVmaW5pbmcgVmFyaWFibGVzOjosIGZvciBtb3JlIGRldGFpbHMuCisKK0NvbXBpbGluZyBGb3IgTXVsdGlwbGUgQXJjaGl0ZWN0dXJlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFlvdSBjYW4gY29tcGlsZSB0aGUgcGFja2FnZSBmb3IgbW9yZSB0aGFuIG9uZSBraW5kIG9mIGNvbXB1dGVyIGF0IHRoZQorc2FtZSB0aW1lLCBieSBwbGFjaW5nIHRoZSBvYmplY3QgZmlsZXMgZm9yIGVhY2ggYXJjaGl0ZWN0dXJlIGluIHRoZWlyCitvd24gZGlyZWN0b3J5LiAgVG8gZG8gdGhpcywgeW91IGNhbiB1c2UgR05VIGBtYWtlJy4gIGBjZCcgdG8gdGhlCitkaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdGhlIG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMgdG8gZ28gYW5kIHJ1bgordGhlIGBjb25maWd1cmUnIHNjcmlwdC4gIGBjb25maWd1cmUnIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGZvciB0aGUKK3NvdXJjZSBjb2RlIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBgY29uZmlndXJlJyBpcyBpbiBhbmQgaW4gYC4uJy4gIFRoaXMKK2lzIGtub3duIGFzIGEgIlZQQVRIIiBidWlsZC4KKworICAgV2l0aCBhIG5vbi1HTlUgYG1ha2UnLCBpdCBpcyBzYWZlciB0byBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBvbmUKK2FyY2hpdGVjdHVyZSBhdCBhIHRpbWUgaW4gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yeS4gIEFmdGVyIHlvdSBoYXZlCitpbnN0YWxsZWQgdGhlIHBhY2thZ2UgZm9yIG9uZSBhcmNoaXRlY3R1cmUsIHVzZSBgbWFrZSBkaXN0Y2xlYW4nIGJlZm9yZQorcmVjb25maWd1cmluZyBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUuCisKKyAgIE9uIE1hY09TIFggMTAuNSBhbmQgbGF0ZXIgc3lzdGVtcywgeW91IGNhbiBjcmVhdGUgbGlicmFyaWVzIGFuZAorZXhlY3V0YWJsZXMgdGhhdCB3b3JrIG9uIG11bHRpcGxlIHN5c3RlbSB0eXBlcy0ta25vd24gYXMgImZhdCIgb3IKKyJ1bml2ZXJzYWwiIGJpbmFyaWVzLS1ieSBzcGVjaWZ5aW5nIG11bHRpcGxlIGAtYXJjaCcgb3B0aW9ucyB0byB0aGUKK2NvbXBpbGVyIGJ1dCBvbmx5IGEgc2luZ2xlIGAtYXJjaCcgb3B0aW9uIHRvIHRoZSBwcmVwcm9jZXNzb3IuICBMaWtlCit0aGlzOgorCisgICAgIC4vY29uZmlndXJlIENDPSJnY2MgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQgLWFyY2ggcHBjIC1hcmNoIHBwYzY0IiBcCisgICAgICAgICAgICAgICAgIENYWD0iZysrIC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0IC1hcmNoIHBwYyAtYXJjaCBwcGM2NCIgXAorICAgICAgICAgICAgICAgICBDUFA9ImdjYyAtRSIgQ1hYQ1BQPSJnKysgLUUiCisKKyAgIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gcHJvZHVjZSB3b3JraW5nIG91dHB1dCBpbiBhbGwgY2FzZXMsIHlvdQorbWF5IGhhdmUgdG8gYnVpbGQgb25lIGFyY2hpdGVjdHVyZSBhdCBhIHRpbWUgYW5kIGNvbWJpbmUgdGhlIHJlc3VsdHMKK3VzaW5nIHRoZSBgbGlwbycgdG9vbCBpZiB5b3UgaGF2ZSBwcm9ibGVtcy4KKworSW5zdGFsbGF0aW9uIE5hbWVzCis9PT09PT09PT09PT09PT09PT0KKworICAgQnkgZGVmYXVsdCwgYG1ha2UgaW5zdGFsbCcgaW5zdGFsbHMgdGhlIHBhY2thZ2UncyBjb21tYW5kcyB1bmRlcgorYC91c3IvbG9jYWwvYmluJywgaW5jbHVkZSBmaWxlcyB1bmRlciBgL3Vzci9sb2NhbC9pbmNsdWRlJywgZXRjLiAgWW91CitjYW4gc3BlY2lmeSBhbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gYC91c3IvbG9jYWwnIGJ5IGdpdmluZworYGNvbmZpZ3VyZScgdGhlIG9wdGlvbiBgLS1wcmVmaXg9UFJFRklYJywgd2hlcmUgUFJFRklYIG11c3QgYmUgYW4KK2Fic29sdXRlIGZpbGUgbmFtZS4KKworICAgWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKK2FyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYgeW91CitwYXNzIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UFJFRklYJyB0byBgY29uZmlndXJlJywgdGhlIHBhY2thZ2UgdXNlcworUFJFRklYIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KK0RvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgc3RpbGwgdXNlIHRoZSByZWd1bGFyIHByZWZpeC4KKworICAgSW4gYWRkaXRpb24sIGlmIHlvdSB1c2UgYW4gdW51c3VhbCBkaXJlY3RvcnkgbGF5b3V0IHlvdSBjYW4gZ2l2ZQorb3B0aW9ucyBsaWtlIGAtLWJpbmRpcj1ESVInIHRvIHNwZWNpZnkgZGlmZmVyZW50IHZhbHVlcyBmb3IgcGFydGljdWxhcgora2luZHMgb2YgZmlsZXMuICBSdW4gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBhIGxpc3Qgb2YgdGhlIGRpcmVjdG9yaWVzCit5b3UgY2FuIHNldCBhbmQgd2hhdCBraW5kcyBvZiBmaWxlcyBnbyBpbiB0aGVtLiAgSW4gZ2VuZXJhbCwgdGhlCitkZWZhdWx0IGZvciB0aGVzZSBvcHRpb25zIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBgJHtwcmVmaXh9Jywgc28gdGhhdAorc3BlY2lmeWluZyBqdXN0IGAtLXByZWZpeCcgd2lsbCBhZmZlY3QgYWxsIG9mIHRoZSBvdGhlciBkaXJlY3RvcnkKK3NwZWNpZmljYXRpb25zIHRoYXQgd2VyZSBub3QgZXhwbGljaXRseSBwcm92aWRlZC4KKworICAgVGhlIG1vc3QgcG9ydGFibGUgd2F5IHRvIGFmZmVjdCBpbnN0YWxsYXRpb24gbG9jYXRpb25zIGlzIHRvIHBhc3MgdGhlCitjb3JyZWN0IGxvY2F0aW9ucyB0byBgY29uZmlndXJlJzsgaG93ZXZlciwgbWFueSBwYWNrYWdlcyBwcm92aWRlIG9uZSBvcgorYm90aCBvZiB0aGUgZm9sbG93aW5nIHNob3J0Y3V0cyBvZiBwYXNzaW5nIHZhcmlhYmxlIGFzc2lnbm1lbnRzIHRvIHRoZQorYG1ha2UgaW5zdGFsbCcgY29tbWFuZCBsaW5lIHRvIGNoYW5nZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zIHdpdGhvdXQKK2hhdmluZyB0byByZWNvbmZpZ3VyZSBvciByZWNvbXBpbGUuCisKKyAgIFRoZSBmaXJzdCBtZXRob2QgaW52b2x2ZXMgcHJvdmlkaW5nIGFuIG92ZXJyaWRlIHZhcmlhYmxlIGZvciBlYWNoCithZmZlY3RlZCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgYG1ha2UgaW5zdGFsbAorcHJlZml4PS9hbHRlcm5hdGUvZGlyZWN0b3J5JyB3aWxsIGNob29zZSBhbiBhbHRlcm5hdGUgbG9jYXRpb24gZm9yIGFsbAorZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHRoYXQgd2VyZSBleHByZXNzZWQgaW4gdGVybXMgb2YKK2Ake3ByZWZpeH0nLiAgQW55IGRpcmVjdG9yaWVzIHRoYXQgd2VyZSBzcGVjaWZpZWQgZHVyaW5nIGBjb25maWd1cmUnLAorYnV0IG5vdCBpbiB0ZXJtcyBvZiBgJHtwcmVmaXh9JywgbXVzdCBlYWNoIGJlIG92ZXJyaWRkZW4gYXQgaW5zdGFsbAordGltZSBmb3IgdGhlIGVudGlyZSBpbnN0YWxsYXRpb24gdG8gYmUgcmVsb2NhdGVkLiAgVGhlIGFwcHJvYWNoIG9mCittYWtlZmlsZSB2YXJpYWJsZSBvdmVycmlkZXMgZm9yIGVhY2ggZGlyZWN0b3J5IHZhcmlhYmxlIGlzIHJlcXVpcmVkIGJ5Cit0aGUgR05VIENvZGluZyBTdGFuZGFyZHMsIGFuZCBpZGVhbGx5IGNhdXNlcyBubyByZWNvbXBpbGF0aW9uLgorSG93ZXZlciwgc29tZSBwbGF0Zm9ybXMgaGF2ZSBrbm93biBsaW1pdGF0aW9ucyB3aXRoIHRoZSBzZW1hbnRpY3Mgb2YKK3NoYXJlZCBsaWJyYXJpZXMgdGhhdCBlbmQgdXAgcmVxdWlyaW5nIHJlY29tcGlsYXRpb24gd2hlbiB1c2luZyB0aGlzCittZXRob2QsIHBhcnRpY3VsYXJseSBub3RpY2VhYmxlIGluIHBhY2thZ2VzIHRoYXQgdXNlIEdOVSBMaWJ0b29sLgorCisgICBUaGUgc2Vjb25kIG1ldGhvZCBpbnZvbHZlcyBwcm92aWRpbmcgdGhlIGBERVNURElSJyB2YXJpYWJsZS4gIEZvcgorZXhhbXBsZSwgYG1ha2UgaW5zdGFsbCBERVNURElSPS9hbHRlcm5hdGUvZGlyZWN0b3J5JyB3aWxsIHByZXBlbmQKK2AvYWx0ZXJuYXRlL2RpcmVjdG9yeScgYmVmb3JlIGFsbCBpbnN0YWxsYXRpb24gbmFtZXMuICBUaGUgYXBwcm9hY2ggb2YKK2BERVNURElSJyBvdmVycmlkZXMgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcywgYW5kCitkb2VzIG5vdCB3b3JrIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgZHJpdmUgbGV0dGVycy4gIE9uIHRoZSBvdGhlciBoYW5kLAoraXQgZG9lcyBiZXR0ZXIgYXQgYXZvaWRpbmcgcmVjb21waWxhdGlvbiBpc3N1ZXMsIGFuZCB3b3JrcyB3ZWxsIGV2ZW4KK3doZW4gc29tZSBkaXJlY3Rvcnkgb3B0aW9ucyB3ZXJlIG5vdCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgYCR7cHJlZml4fScKK2F0IGBjb25maWd1cmUnIHRpbWUuCisKK09wdGlvbmFsIEZlYXR1cmVzCis9PT09PT09PT09PT09PT09PQorCisgICBJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKK3dpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCitvcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgorCisgICBTb21lIHBhY2thZ2VzIHBheSBhdHRlbnRpb24gdG8gYC0tZW5hYmxlLUZFQVRVUkUnIG9wdGlvbnMgdG8KK2Bjb25maWd1cmUnLCB3aGVyZSBGRUFUVVJFIGluZGljYXRlcyBhbiBvcHRpb25hbCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgorVGhleSBtYXkgYWxzbyBwYXkgYXR0ZW50aW9uIHRvIGAtLXdpdGgtUEFDS0FHRScgb3B0aW9ucywgd2hlcmUgUEFDS0FHRQoraXMgc29tZXRoaW5nIGxpa2UgYGdudS1hcycgb3IgYHgnIChmb3IgdGhlIFggV2luZG93IFN5c3RlbSkuICBUaGUKK2BSRUFETUUnIHNob3VsZCBtZW50aW9uIGFueSBgLS1lbmFibGUtJyBhbmQgYC0td2l0aC0nIG9wdGlvbnMgdGhhdCB0aGUKK3BhY2thZ2UgcmVjb2duaXplcy4KKworICAgRm9yIHBhY2thZ2VzIHRoYXQgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0sIGBjb25maWd1cmUnIGNhbiB1c3VhbGx5CitmaW5kIHRoZSBYIGluY2x1ZGUgYW5kIGxpYnJhcnkgZmlsZXMgYXV0b21hdGljYWxseSwgYnV0IGlmIGl0IGRvZXNuJ3QsCit5b3UgY2FuIHVzZSB0aGUgYGNvbmZpZ3VyZScgb3B0aW9ucyBgLS14LWluY2x1ZGVzPURJUicgYW5kCitgLS14LWxpYnJhcmllcz1ESVInIHRvIHNwZWNpZnkgdGhlaXIgbG9jYXRpb25zLgorCisgICBTb21lIHBhY2thZ2VzIG9mZmVyIHRoZSBhYmlsaXR5IHRvIGNvbmZpZ3VyZSBob3cgdmVyYm9zZSB0aGUKK2V4ZWN1dGlvbiBvZiBgbWFrZScgd2lsbCBiZS4gIEZvciB0aGVzZSBwYWNrYWdlcywgcnVubmluZyBgLi9jb25maWd1cmUKKy0tZW5hYmxlLXNpbGVudC1ydWxlcycgc2V0cyB0aGUgZGVmYXVsdCB0byBtaW5pbWFsIG91dHB1dCwgd2hpY2ggY2FuIGJlCitvdmVycmlkZGVuIHdpdGggYG1ha2UgVj0xJzsgd2hpbGUgcnVubmluZyBgLi9jb25maWd1cmUKKy0tZGlzYWJsZS1zaWxlbnQtcnVsZXMnIHNldHMgdGhlIGRlZmF1bHQgdG8gdmVyYm9zZSwgd2hpY2ggY2FuIGJlCitvdmVycmlkZGVuIHdpdGggYG1ha2UgVj0wJy4KKworUGFydGljdWxhciBzeXN0ZW1zCis9PT09PT09PT09PT09PT09PT0KKworICAgT24gSFAtVVgsIHRoZSBkZWZhdWx0IEMgY29tcGlsZXIgaXMgbm90IEFOU0kgQyBjb21wYXRpYmxlLiAgSWYgR05VCitDQyBpcyBub3QgaW5zdGFsbGVkLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGZvbGxvd2luZyBvcHRpb25zIGluCitvcmRlciB0byB1c2UgYW4gQU5TSSBDIGNvbXBpbGVyOgorCisgICAgIC4vY29uZmlndXJlIENDPSJjYyAtQWUgLURfWE9QRU5fU09VUkNFPTUwMCIKKworYW5kIGlmIHRoYXQgZG9lc24ndCB3b3JrLCBpbnN0YWxsIHByZS1idWlsdCBiaW5hcmllcyBvZiBHQ0MgZm9yIEhQLVVYLgorCisgICBPbiBPU0YvMSBhLmsuYS4gVHJ1NjQsIHNvbWUgdmVyc2lvbnMgb2YgdGhlIGRlZmF1bHQgQyBjb21waWxlciBjYW5ub3QKK3BhcnNlIGl0cyBgPHdjaGFyLmg+JyBoZWFkZXIgZmlsZS4gIFRoZSBvcHRpb24gYC1ub2R0aycgY2FuIGJlIHVzZWQgYXMKK2Egd29ya2Fyb3VuZC4gIElmIEdOVSBDQyBpcyBub3QgaW5zdGFsbGVkLCBpdCBpcyB0aGVyZWZvcmUgcmVjb21tZW5kZWQKK3RvIHRyeQorCisgICAgIC4vY29uZmlndXJlIENDPSJjYyIKKworYW5kIGlmIHRoYXQgZG9lc24ndCB3b3JrLCB0cnkKKworICAgICAuL2NvbmZpZ3VyZSBDQz0iY2MgLW5vZHRrIgorCisgICBPbiBTb2xhcmlzLCBkb24ndCBwdXQgYC91c3IvdWNiJyBlYXJseSBpbiB5b3VyIGBQQVRIJy4gIFRoaXMKK2RpcmVjdG9yeSBjb250YWlucyBzZXZlcmFsIGR5c2Z1bmN0aW9uYWwgcHJvZ3JhbXM7IHdvcmtpbmcgdmFyaWFudHMgb2YKK3RoZXNlIHByb2dyYW1zIGFyZSBhdmFpbGFibGUgaW4gYC91c3IvYmluJy4gIFNvLCBpZiB5b3UgbmVlZCBgL3Vzci91Y2InCitpbiB5b3VyIGBQQVRIJywgcHV0IGl0IF9hZnRlcl8gYC91c3IvYmluJy4KKworICAgT24gSGFpa3UsIHNvZnR3YXJlIGluc3RhbGxlZCBmb3IgYWxsIHVzZXJzIGdvZXMgaW4gYC9ib290L2NvbW1vbicsCitub3QgYC91c3IvbG9jYWwnLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworICAgICAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vYm9vdC9jb21tb24KKworU3BlY2lmeWluZyB0aGUgU3lzdGVtIFR5cGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFRoZXJlIG1heSBiZSBzb21lIGZlYXR1cmVzIGBjb25maWd1cmUnIGNhbm5vdCBmaWd1cmUgb3V0CithdXRvbWF0aWNhbGx5LCBidXQgbmVlZHMgdG8gZGV0ZXJtaW5lIGJ5IHRoZSB0eXBlIG9mIG1hY2hpbmUgdGhlIHBhY2thZ2UKK3dpbGwgcnVuIG9uLiAgVXN1YWxseSwgYXNzdW1pbmcgdGhlIHBhY2thZ2UgaXMgYnVpbHQgdG8gYmUgcnVuIG9uIHRoZQorX3NhbWVfIGFyY2hpdGVjdHVyZXMsIGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKK2EgbWVzc2FnZSBzYXlpbmcgaXQgY2Fubm90IGd1ZXNzIHRoZSBtYWNoaW5lIHR5cGUsIGdpdmUgaXQgdGhlCitgLS1idWlsZD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCit0eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aGljaCBoYXMgdGhlIGZvcm06CisKKyAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCisKK3doZXJlIFNZU1RFTSBjYW4gaGF2ZSBvbmUgb2YgdGhlc2UgZm9ybXM6CisKKyAgICAgT1MKKyAgICAgS0VSTkVMLU9TCisKKyAgIFNlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCitgY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0CituZWVkIHRvIGtub3cgdGhlIG1hY2hpbmUgdHlwZS4KKworICAgSWYgeW91IGFyZSBfYnVpbGRpbmdfIGNvbXBpbGVyIHRvb2xzIGZvciBjcm9zcy1jb21waWxpbmcsIHlvdSBzaG91bGQKK3VzZSB0aGUgb3B0aW9uIGAtLXRhcmdldD1UWVBFJyB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAorcHJvZHVjZSBjb2RlIGZvci4KKworICAgSWYgeW91IHdhbnQgdG8gX3VzZV8gYSBjcm9zcyBjb21waWxlciwgdGhhdCBnZW5lcmF0ZXMgY29kZSBmb3IgYQorcGxhdGZvcm0gZGlmZmVyZW50IGZyb20gdGhlIGJ1aWxkIHBsYXRmb3JtLCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlCisiaG9zdCIgcGxhdGZvcm0gKGkuZS4sIHRoYXQgb24gd2hpY2ggdGhlIGdlbmVyYXRlZCBwcm9ncmFtcyB3aWxsCitldmVudHVhbGx5IGJlIHJ1bikgd2l0aCBgLS1ob3N0PVRZUEUnLgorCitTaGFyaW5nIERlZmF1bHRzCis9PT09PT09PT09PT09PT09CisKKyAgIElmIHlvdSB3YW50IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgYGNvbmZpZ3VyZScgc2NyaXB0cyB0byBzaGFyZSwKK3lvdSBjYW4gY3JlYXRlIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FsbGVkIGBjb25maWcuc2l0ZScgdGhhdCBnaXZlcworZGVmYXVsdCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBsaWtlIGBDQycsIGBjYWNoZV9maWxlJywgYW5kIGBwcmVmaXgnLgorYGNvbmZpZ3VyZScgbG9va3MgZm9yIGBQUkVGSVgvc2hhcmUvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cywgdGhlbgorYFBSRUZJWC9ldGMvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cy4gIE9yLCB5b3UgY2FuIHNldCB0aGUKK2BDT05GSUdfU0lURScgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaXRlIHNjcmlwdC4KK0Egd2FybmluZzogbm90IGFsbCBgY29uZmlndXJlJyBzY3JpcHRzIGxvb2sgZm9yIGEgc2l0ZSBzY3JpcHQuCisKK0RlZmluaW5nIFZhcmlhYmxlcworPT09PT09PT09PT09PT09PT09CisKKyAgIFZhcmlhYmxlcyBub3QgZGVmaW5lZCBpbiBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbiBiZSBzZXQgaW4gdGhlCitlbnZpcm9ubWVudCBwYXNzZWQgdG8gYGNvbmZpZ3VyZScuICBIb3dldmVyLCBzb21lIHBhY2thZ2VzIG1heSBydW4KK2NvbmZpZ3VyZSBhZ2FpbiBkdXJpbmcgdGhlIGJ1aWxkLCBhbmQgdGhlIGN1c3RvbWl6ZWQgdmFsdWVzIG9mIHRoZXNlCit2YXJpYWJsZXMgbWF5IGJlIGxvc3QuICBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHlvdSBzaG91bGQgc2V0Cit0aGVtIGluIHRoZSBgY29uZmlndXJlJyBjb21tYW5kIGxpbmUsIHVzaW5nIGBWQVI9dmFsdWUnLiAgRm9yIGV4YW1wbGU6CisKKyAgICAgLi9jb25maWd1cmUgQ0M9L3Vzci9sb2NhbDIvYmluL2djYworCitjYXVzZXMgdGhlIHNwZWNpZmllZCBgZ2NjJyB0byBiZSB1c2VkIGFzIHRoZSBDIGNvbXBpbGVyICh1bmxlc3MgaXQgaXMKK292ZXJyaWRkZW4gaW4gdGhlIHNpdGUgc2hlbGwgc2NyaXB0KS4KKworVW5mb3J0dW5hdGVseSwgdGhpcyB0ZWNobmlxdWUgZG9lcyBub3Qgd29yayBmb3IgYENPTkZJR19TSEVMTCcgZHVlIHRvCithbiBBdXRvY29uZiBidWcuICBVbnRpbCB0aGUgYnVnIGlzIGZpeGVkIHlvdSBjYW4gdXNlIHRoaXMgd29ya2Fyb3VuZDoKKworICAgICBDT05GSUdfU0hFTEw9L2Jpbi9iYXNoIC9iaW4vYmFzaCAuL2NvbmZpZ3VyZSBDT05GSUdfU0hFTEw9L2Jpbi9iYXNoCisKK2Bjb25maWd1cmUnIEludm9jYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT0KKworICAgYGNvbmZpZ3VyZScgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gY29udHJvbCBob3cgaXQKK29wZXJhdGVzLgorCitgLS1oZWxwJworYC1oJworICAgICBQcmludCBhIHN1bW1hcnkgb2YgYWxsIG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KKworYC0taGVscD1zaG9ydCcKK2AtLWhlbHA9cmVjdXJzaXZlJworICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSdzCisgICAgIGBjb25maWd1cmUnLCBhbmQgZXhpdC4gIFRoZSBgc2hvcnQnIHZhcmlhbnQgbGlzdHMgb3B0aW9ucyB1c2VkCisgICAgIG9ubHkgaW4gdGhlIHRvcCBsZXZlbCwgd2hpbGUgdGhlIGByZWN1cnNpdmUnIHZhcmlhbnQgbGlzdHMgb3B0aW9ucworICAgICBhbHNvIHByZXNlbnQgaW4gYW55IG5lc3RlZCBwYWNrYWdlcy4KKworYC0tdmVyc2lvbicKK2AtVicKKyAgICAgUHJpbnQgdGhlIHZlcnNpb24gb2YgQXV0b2NvbmYgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYGNvbmZpZ3VyZScKKyAgICAgc2NyaXB0LCBhbmQgZXhpdC4KKworYC0tY2FjaGUtZmlsZT1GSUxFJworICAgICBFbmFibGUgdGhlIGNhY2hlOiB1c2UgYW5kIHNhdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGluIEZJTEUsCisgICAgIHRyYWRpdGlvbmFsbHkgYGNvbmZpZy5jYWNoZScuICBGSUxFIGRlZmF1bHRzIHRvIGAvZGV2L251bGwnIHRvCisgICAgIGRpc2FibGUgY2FjaGluZy4KKworYC0tY29uZmlnLWNhY2hlJworYC1DJworICAgICBBbGlhcyBmb3IgYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnLgorCitgLS1xdWlldCcKK2AtLXNpbGVudCcKK2AtcScKKyAgICAgRG8gbm90IHByaW50IG1lc3NhZ2VzIHNheWluZyB3aGljaCBjaGVja3MgYXJlIGJlaW5nIG1hZGUuICBUbworICAgICBzdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dCwgcmVkaXJlY3QgaXQgdG8gYC9kZXYvbnVsbCcgKGFueSBlcnJvcgorICAgICBtZXNzYWdlcyB3aWxsIHN0aWxsIGJlIHNob3duKS4KKworYC0tc3JjZGlyPURJUicKKyAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQorICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCisKK2AtLXByZWZpeD1ESVInCisgICAgIFVzZSBESVIgYXMgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXguICAqbm90ZSBJbnN0YWxsYXRpb24gTmFtZXM6OgorICAgICBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgb3RoZXIgb3B0aW9ucyBhdmFpbGFibGUgZm9yIGZpbmUtdHVuaW5nCisgICAgIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zLgorCitgLS1uby1jcmVhdGUnCitgLW4nCisgICAgIFJ1biB0aGUgY29uZmlndXJlIGNoZWNrcywgYnV0IHN0b3AgYmVmb3JlIGNyZWF0aW5nIGFueSBvdXRwdXQKKyAgICAgZmlsZXMuCisKK2Bjb25maWd1cmUnIGFsc28gYWNjZXB0cyBzb21lIG90aGVyLCBub3Qgd2lkZWx5IHVzZWZ1bCwgb3B0aW9ucy4gIFJ1bgorYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBtb3JlIGRldGFpbHMuCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvTWFrZWZpbGUuYW0gYi9hbnRsci0zLjQvcnVudGltZS9DL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNzggQEAKK0FVVE9NQUtFX09QVElPTlMgPSBnbnUKK0FNX0xJQlRPT0xGTEFHUyA9CisjIyAtLXNpbGVudAorQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKK2xpYl9MVExJQlJBUklFUyA9IGxpYmFudGxyM2MubGEKKworTElCU09VUkNFUwkJPQlzcmMvYW50bHIzYmFzZXJlY29nbml6ZXIuYwkJCVwKKwkJCQkJc3JjL2FudGxyM2Jhc2V0cmVlLmMJCQkJXAorCQkJCQlzcmMvYW50bHIzYmFzZXRyZWVhZGFwdG9yLmMJCQlcCisJCQkJCXNyYy9hbnRscjNiaXRzZXQuYwkJCQkJXAorCQkJCQlzcmMvYW50bHIzY29sbGVjdGlvbnMuYwkJCQlcCisJCQkJCXNyYy9hbnRscjNjb21tb250b2tlbi5jCQkJCVwKKwkJCQkJc3JjL2FudGxyM2NvbW1vbnRyZWUuYwkJCQlcCisJCQkJCXNyYy9hbnRscjNjb21tb250cmVlYWRhcHRvci5jCQlcCisJCQkJCXNyYy9hbnRscjNjb21tb250cmVlbm9kZXN0cmVhbS5jCVwKKwkJCQkJc3JjL2FudGxyM2NvbnZlcnR1dGYuYwkJCQlcCisJCQkJCXNyYy9hbnRscjNjeWNsaWNkZmEuYwkJCQlcCisJCQkJCXNyYy9hbnRscjNkZWJ1Z2hhbmRsZXJzLmMJCQlcCisJCQkJCXNyYy9hbnRscjNlbmNvZGluZ3MuYwkJCQlcCisJCQkJCXNyYy9hbnRscjNleGNlcHRpb24uYwkJCQlcCisJCQkJCXNyYy9hbnRscjNmaWxlc3RyZWFtLmMJCQkJXAorCQkJCQlzcmMvYW50bHIzaW5wdXRzdHJlYW0uYwkJCQlcCisJCQkJCXNyYy9hbnRscjNpbnRzdHJlYW0uYwkJCQlcCisJCQkJCXNyYy9hbnRscjNsZXhlci5jCQkJCQlcCisJCQkJCXNyYy9hbnRscjNwYXJzZXIuYwkJCQkJXAorCQkJCQlzcmMvYW50bHIzcmV3cml0ZXN0cmVhbXMuYwkJCVwKKwkJCQkJc3JjL2FudGxyM3N0cmluZy5jCQkJCQlcCisJCQkJCXNyYy9hbnRscjN0b2tlbnN0cmVhbS5jCQkJCVwKKwkJCQkJc3JjL2FudGxyM3RyZWVwYXJzZXIuYworCitsaWJhbnRscjNjX2xhX1NPVVJDRVMgPSAkKExJQlNPVVJDRVMpCisKK2luY2x1ZGVfSEVBREVSUyA9CWluY2x1ZGUvYW50bHIzLmgJCQkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzYmFzZXJlY29nbml6ZXIuaAkJCVwKKwkJCQkJaW5jbHVkZS9hbnRscjNiYXNldHJlZS5oCQkJCVwKKwkJCQkJaW5jbHVkZS9hbnRscjNiYXNldHJlZWFkYXB0b3IuaAkJCVwKKwkJCQkJaW5jbHVkZS9hbnRscjNiaXRzZXQuaAkJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2NvbGxlY3Rpb25zLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2NvbW1vbnRva2VuLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2NvbW1vbnRyZWUuaAkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzY29tbW9udHJlZWFkYXB0b3IuaAkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLmgJXAorCQkJCQlpbmNsdWRlL2FudGxyM2NvbnZlcnR1dGYuaAkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzY3ljbGljZGZhLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzZGVmcy5oCQkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzZW5jb2RpbmdzLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2Vycm9ycy5oCQkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzZXhjZXB0aW9uLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2ZpbGVzdHJlYW0uaAkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzaW5wdXQuaAkJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2ludGVyZmFjZXMuaAkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzaW50c3RyZWFtLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM2xleGVyLmgJCQkJCVwKKwkJCQkJaW5jbHVkZS9hbnRscjNtZW1vcnkuaAkJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM3BhcnNlci5oCQkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzcGFyc2V0cmVlLmgJCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM3JlY29nbml6ZXJzaGFyZWRzdGF0ZS5oCVwKKwkJCQkJaW5jbHVkZS9hbnRscjNyZXdyaXRlc3RyZWFtcy5oCQkJXAorCQkJCQlpbmNsdWRlL2FudGxyM3N0cmluZy5oCQkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzdG9rZW5zdHJlYW0uaAkJCQlcCisJCQkJCWluY2x1ZGUvYW50bHIzdHJlZXBhcnNlci5oCQkJCVwKKwkJCQkJYW50bHIzY29uZmlnLmgKKworbGliYW50bHIzY19sYV9MREZMQUdTID0gLWF2b2lkLXZlcnNpb24KKworSU5DTFVERVMgPSAtSWluY2x1ZGUKKworRVhUUkFfRElTVCA9IAlcCisJCQkJdnNydWxlZmlsZXMvYW50bHIzbGV4ZXJhbmRwYXJzZXIucnVsZXMJCVwKKwkJCQl2c3J1bGVmaWxlcy9hbnRscjNsZXhlci5ydWxlcwkJCQlcCisJCQkJdnNydWxlZmlsZXMvYW50bHIzcGFyc2VyLnJ1bGVzCQkJCVwKKwkJCQl2c3J1bGVmaWxlcy9hbnRscjN0cmVlcGFyc2VyLnJ1bGVzCQkJXAorCQkJIAlDLnNsbiBDLnZjcHJvaiBDLnZjcHJvai52c3BzY2MJCQkJXAorCQkJCUMudnNzc2NjIGRveHlmaWxlIGRveHlnZW4KKworZXhwb3J0IE9CSkVDVF9NT0RFCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvTkVXUyBiL2FudGxyLTMuNC9ydW50aW1lL0MvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWE4MmZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9ORVdTCkBAIC0wLDAgKzEsMiBAQAorU2VlIHd3dy5hbnRsci5vcmcgYW5kIHRoZSBhc3NvY2lhdGVkIGVtYWlsIGZvcnVtcyBmb3IgcmVsZWFzZSBkYXRlcyBhbmQKK290aGVyIGFubm91bmNlbWVudHMuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL1JFQURNRSBiL2FudGxyLTMuNC9ydW50aW1lL0MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzA1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL1JFQURNRQpAQCAtMCwwICsxLDE5MjQgQEAKK0FOVExSIHYzLjAuMSBDIFJ1bnRpbWUKK0FOVExSIDMuMC4xCitKYW51YXJ5IDEsIDIwMDgKKworQXQgdGhlIG1vbWVudCwgdGhlIHVzZSBvZiB0aGUgQyBydW50aW1lIGVuZ2luZSBmb3IgdGhlIHBhcnNlciBpcyBub3QgZ2VuZXJhbGx5Citmb3IgdGhlIGluZXhwZXJpZW5jZWQgQyBwcm9ncmFtbWVyLiBIb3dldmVyIHRoaXMgaXMgbWFpbmx5IGJlY2F1c2Ugb2YgdGhlIGxhY2sKK29mIGRvY3VtZW50YXRpb24gb24gdXNlLCB3aGljaCB3aWxsIGJlIGNvcnJlY3RlZCBzaG9ydGx5LiBUaGUgQyBydW50aW1lCitjb2RlIGl0c2VsZiBpcyBob3dldmVyIHdlbGwgZG9jdW1lbnRlZCB3aXRoIGRveHlnZW4gc3R5bGUgY29tbWVudHMgYW5kIGEgCityZWFzb25hYmx5IGV4cGVyaWVuY2VkIEMgcHJvZ3JhbW1lciBzaG91bGQgYmUgYWJsZSB0byBwaWVjZSBpdCB0b2dldGhlci4gWW91CitjYW4gdmlzaXQgdGhlIGRvY3VtZW50YXRpb24gYXQ6IGh0dHA6Ly93d3cuYW50bHIub3JnL2FwaS9DL2luZGV4Lmh0bWwKKworVGhlIGdlbmVyYWwgbWFrZSB1cCBpcyB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW1wbGVtZW50ZWQgYXMgYSBwc2V1ZG8gY2xhc3Mvb2JqZWN0Citpbml0aWFsaXplZCB3aXRoIHBvaW50ZXJzIHRvIGl0cyAnbWVtYmVyJyBmdW5jdGlvbnMgYW5kIGRhdGEuIEFsbCBvYmplY3RzIGFyZSAKKyh1c3VhbGx5KSBjcmVhdGVkIGJ5IGZhY3Rvcmllcywgd2hpY2ggYXV0byBtYW5hZ2UgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAorcmVsZWFzZSBhbmQgZ2VuZXJhbGx5IG1ha2UgbGlmZSBlYXNpZXIuIElmIHlvdSByZW1lbWJlciB0aGlzIHJ1bGUsIGV2ZXJ5dGhpbmcKK3Nob3VsZCBmYWxsIGluIHRvIHBsYWNlLgorCitKaW0gSWRsZSAtIFBvcnRsYW5kIE9yZWdvbiwgSmFuIDIwMDgKK2ppbWkgICAgIGlkbGUgd3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUZXJlbmNlIFBhcnIsIHBhcnJ0IGF0IGNzIHVzZmNhIGVkdQorQU5UTFIgcHJvamVjdCBsZWFkIGFuZCBzdXByZW1lIGRpY3RhdG9yIGZvciBsaWZlCitVbml2ZXJzaXR5IG9mIFNhbiBGcmFuY2lzY28KKworSU5UUk9EVUNUSU9OIAorCitXZWxjb21lIHRvIEFOVExSIHYzISAgSSd2ZSBiZWVuIHdvcmtpbmcgb24gdGhpcyBmb3IgbmVhcmx5IDQgeWVhcnMgYW5kIGl0J3MKK2FsbW9zdCByZWFkeSEgIEkgcGxhbiBubyBmZWF0dXJlIGFkZGl0aW9ucyBiZXR3ZWVuIHRoaXMgYmV0YSBhbmQgZmlyc3QKKzMuMCByZWxlYXNlLiAgSSBoYXZlIGxvdHMgb2YgZmVhdHVyZXMgdG8gYWRkIGxhdGVyLCBidXQgdGhpcyB3aWxsIGJlCit0aGUgZmlyc3Qgc2V0LiAgVWx0aW1hdGVseSwgSSBuZWVkIHRvIHJld3JpdGUgQU5UTFIgdjMgaW4gaXRzZWxmIChpdCdzCit3cml0dGVuIGluIDIuNy43IGF0IHRoZSBtb21lbnQgYW5kIGFsc28gbmVlZHMgU3RyaW5nVGVtcGxhdGUgMy4wIG9yCitsYXRlcikuCisKK1lvdSBzaG91bGQgdXNlIHYzIGluIGNvbmp1bmN0aW9uIHdpdGggQU5UTFJXb3JrczoKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL3dvcmtzL2luZGV4Lmh0bWwgCisKK1dBUk5JTkc6IFdlIGhhdmUgYml0cyBvZiBkb2N1bWVudGF0aW9uIHN0YXJ0ZWQsIGJ1dCBub3RoaW5nIHN1cGVyLWNvbXBsZXRlCit5ZXQuICBUaGUgYm9vayB3aWxsIGJlIHByaW50ZWQgTWF5IDIwMDc6CisKK2h0dHA6Ly93d3cucHJhZ21hdGljcHJvZ3JhbW1lci5jb20vdGl0bGVzL3RwYW50bHIvaW5kZXguaHRtbAorCitidXQgd2Ugc2hvdWxkIGhhdmUgYSBiZXRhIFBERiBhdmFpbGFibGUgb24gdGhhdCBwYWdlIGluIEZlYiAyMDA3LgorCitZb3UgYWxzbyBoYXZlIHRoZSBleGFtcGxlcyBwbHVzIHRoZSBzb3VyY2UgdG8gZ3VpZGUgeW91LgorCitTZWUgdGhlIG5ldyB3aWtpIEZBUToKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQU5UTFIrdjMrRkFRCisKK2FuZCBnZW5lcmFsIGRvYyByb290OgorCisgICAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9BTlRMUiszK1dpa2krSG9tZQorCitQbGVhc2UgaGVscCBhZGQvdXBkYXRlIEZBUSBlbnRyaWVzLgorCitJIGhhdmUgbWFkZSB2ZXJ5IGxpdHRsZSBlZmZvcnQgYXQgdGhpcyBwb2ludCB0byBkZWFsIHdlbGwgd2l0aAorZXJyb25lb3VzIGlucHV0IChlLmcuLCBiYWQgc3ludGF4IG1pZ2h0IG1ha2UgQU5UTFIgY3Jhc2gpLiAgSSB3aWxsIGNsZWFuCit0aGlzIHVwIGFmdGVyIEkndmUgcmV3cml0dGVuIHYzIGluIHYzLgorCitQZXIgdGhlIGxpY2Vuc2UgaW4gTElDRU5TRS50eHQsIHRoaXMgc29mdHdhcmUgaXMgbm90IGd1YXJhbnRlZWQgdG8KK3dvcmsgYW5kIG1pZ2h0IGV2ZW4gZGVzdHJveSBhbGwgbGlmZSBvbiB0aGlzIHBsYW5ldDoKKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCitJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCitTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKK0lOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0VYQU1QTEVTCisKK0FOVExSIHYzIHNhbXBsZSBncmFtbWFyczoKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL2Rvd25sb2FkL2V4YW1wbGVzLXYzLnRhci5negorCitjb250YWlucyB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOiBMTC1zdGFyLCBjbWludXMsIGR5bmFtaWMtc2NvcGUsCitmdXp6eSwgaG9pc3RlZFByZWRpY2F0ZXMsIGlzbGFuZC1ncmFtbWFyLCBqYXZhLCBweXRob24sIHNjb3BlcywKK3NpbXBsZWNUcmVlUGFyc2VyLCB0cmVlcGFyc2VyLCB0d2VhaywgeG1sTGV4ZXIuCisKK0Fsc28gY2hlY2sgb3V0IE1hbnRyYSBQcm9ncmFtbWluZyBMYW5ndWFnZSBmb3IgYSBwcm90b3R5cGUgKHdvcmsgaW4KK3Byb2dyZXNzKSB1c2luZyB2MzoKKworICAgIGh0dHA6Ly93d3cubGluZ3VhbWFudHJhLm9yZy8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0IGlzIEFOVExSPworCitBTlRMUiBzdGFuZHMgZm9yIChBTilvdGhlciAoVClvb2wgZm9yIChMKWFuZ3VhZ2UgKFIpZWNvZ25pdGlvbiBhbmQgd2FzCitvcmlnaW5hbGx5IGtub3duIGFzIFBDQ1RTLiAgQU5UTFIgaXMgYSBsYW5ndWFnZSB0b29sIHRoYXQgcHJvdmlkZXMgYQorZnJhbWV3b3JrIGZvciBjb25zdHJ1Y3RpbmcgcmVjb2duaXplcnMsIGNvbXBpbGVycywgYW5kIHRyYW5zbGF0b3JzCitmcm9tIGdyYW1tYXRpY2FsIGRlc2NyaXB0aW9ucyBjb250YWluaW5nIGFjdGlvbnMuICBUYXJnZXQgbGFuZ3VhZ2UgbGlzdDoKKworaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db2RlK0dlbmVyYXRpb24rVGFyZ2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hvdyBpcyBBTlRMUiB2MyBkaWZmZXJlbnQgdGhhbiBBTlRMUiB2Mj8KKworU2VlIG1pZ3JhdGlvbiBndWlkZToKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL01pZ3JhdGluZytmcm9tK0FOVExSKzIrdG8rQU5UTFIrMworCitBTlRMUiB2MyBoYXMgYSBmYXIgc3VwZXJpb3IgcGFyc2luZyBhbGdvcml0aG0gY2FsbGVkIExMKCopIHRoYXQKK2hhbmRsZXMgbWFueSBtb3JlIGdyYW1tYXJzIHRoYW4gdjIgZG9lcy4gIEluIHByYWN0aWNlLCBpdCBtZWFucyB5b3UKK2NhbiB0aHJvdyBhbG1vc3QgYW55IGdyYW1tYXIgYXQgQU5UTFIgdGhhdCBpcyBub24tbGVmdC1yZWN1cnNpdmUgYW5kCit1bmFtYmlndW91cyAoc2FtZSBpbnB1dCBjYW4gYmUgbWF0Y2hlZCBieSBtdWx0aXBsZSBydWxlcyk7IHRoZSBjb3N0IGlzCitwZXJoYXBzIGEgdGlueSBiaXQgb2YgYmFja3RyYWNraW5nLCBidXQgd2l0aCBhIERGQSBub3QgYSBmdWxsIHBhcnNlci4KK1lvdSBjYW4gbWFudWFsbHkgc2V0IHRoZSBtYXggbG9va2FoZWFkIGsgYXMgYW4gb3B0aW9uIGZvciBhbnkgZGVjaXNpb24KK3Rob3VnaC4gIFRoZSBMTCgqKSBhbGdvcml0aG0gcmFtcHMgdXAgdG8gdXNlIG1vcmUgbG9va2FoZWFkIHdoZW4gaXQKK25lZWRzIHRvIGFuZCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gbm9ybWFsIExMIGJhY2t0cmFja2luZy4gVGhlcmUKK2lzIHN1cHBvcnQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGUgKGZ1bGwgTEwgYmFja3RyYWNraW5nKSB3aGVuIExMKCopCitmYWlscy4KKworTGV4ZXJzIGFyZSBtdWNoIGVhc2llciBkdWUgdG8gdGhlIExMKCopIGFsZ29yaXRobSBhcyB3ZWxsLiAgUHJldmlvdXNseQordGhlc2UgdHdvIGxleGVyIHJ1bGVzIHdvdWxkIGNhdXNlIHRyb3VibGUgYmVjYXVzZSBBTlRMUiBjb3VsZG4ndAorZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIHdpdGggZmluaXRlIGxvb2thaGVhZCB0byBzZWUgdGhlIGRlY2ltYWwKK3BvaW50OgorCitJTlQgOiAoJzAnLi4nOScpKyA7CitGTE9BVCA6IElOVCAnLicgSU5UIDsKKworVGhlIHN5bnRheCBpcyBhbG1vc3QgaWRlbnRpY2FsIGZvciBmZWF0dXJlcyBpbiBjb21tb24sIGJ1dCB5b3Ugc2hvdWxkCitub3RlIHRoYXQgbGFiZWxzIGFyZSBhbHdheXMgJz0nIG5vdCAnOicuICBTbyBkbyBpZD1JRCBub3QgaWQ6SUQuCisKK1lvdSBjYW4gZG8gY29tYmluZWQgbGV4ZXIvcGFyc2VyIGdyYW1tYXJzIGFnYWluIChhbGEgUENDVFMpIGJvdGggbGV4ZXIKK2FuZCBwYXJzZXIgcnVsZXMgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZS4gIFNlZSB0aGUgZXhhbXBsZXMuCitSZWFsbHkgbmljZS4gIFlvdSBjYW4gcmVmZXJlbmNlIHN0cmluZ3MgYW5kIGNoYXJhY3RlcnMgaW4gdGhlIGdyYW1tYXIKK2FuZCBBTlRMUiB3aWxsIGdlbmVyYXRlIHRoZSBsZXhlciBmb3IgeW91LgorCitUaGUgYXR0cmlidXRlIHN0cnVjdHVyZSBoYXMgYmVlbiBlbmhhbmNlZC4gIFJ1bGVzIG1heSBoYXZlIG11bHRpcGxlCityZXR1cm4gdmFsdWVzLCBmb3IgZXhhbXBsZS4gIEZ1cnRoZXIsIHRoZXJlIGFyZSBkeW5hbWljYWxseSBzY29wZWQKK2F0dHJpYnV0ZXMgd2hlcmVieSBhIHJ1bGUgbWF5IGRlZmluZSBhIHZhbHVlIHVzYWJsZSBieSBhbnkgcnVsZSBpdAoraW52b2tlcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHcvbyBoYXZpbmcgdG8gcGFzcyBhIHBhcmFtZXRlciBhbGwgdGhlCit3YXkgZG93bi4KKworQU5UTFIgdjMgdHJlZSBjb25zdHJ1Y3Rpb24gaXMgZmFyIHN1cGVyaW9yLS1pdCBwcm92aWRlcyB0cmVlIHJld3JpdGUKK3J1bGVzIHdoZXJlIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgc2ltcGx5IHRoZSB0cmVlIGdyYW1tYXIgZnJhZ21lbnQKK2Rlc2NyaWJpbmcgdGhlIHRyZWUgeW91IHdhbnQgdG8gYnVpbGQ6CisKK2Zvcm1hbEFyZ3MKKwk6CXR5cGVuYW1lIGRlY2xhcmF0b3IgKCcsJyB0eXBlbmFtZSBkZWNsYXJhdG9yICkqCisJCS0+IF4oQVJHIHR5cGVuYW1lIGRlY2xhcmF0b3IpKworCTsKKworVGhhdCBidWlsZHMgdHJlZSBzZXF1ZW5jZXMgbGlrZToKKworXihBUkcgaW50IHYxKSBeKEFSRyBpbnQgdjIpCisKK0FOVExSIHYzIGFsc28gaW5jb3Jwb3JhdGVzIFN0cmluZ1RlbXBsYXRlOgorCisgICAgICBodHRwOi8vd3d3LnN0cmluZ3RlbXBsYXRlLm9yZworCitqdXN0IGxpa2UgQVNUIHN1cHBvcnQuICBJdCBpcyB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgb3V0cHV0LiAgRm9yCitleGFtcGxlIHRoaXMgcnVsZSBjcmVhdGVzIGEgdGVtcGxhdGUgY2FsbGVkICdpbXBvcnQnIGZvciBlYWNoIGltcG9ydAorZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgaW5wdXQgc3RyZWFtOgorCitncmFtbWFyIEphdmE7CitvcHRpb25zIHsKKyAgb3V0cHV0PXRlbXBsYXRlOworfQorLi4uCitpbXBvcnREZWZpbml0aW9uCisgICAgOiAgICdpbXBvcnQnIGlkZW50aWZpZXJTdGFyIFNFTUkKKyAgICAgICAgLT4gaW1wb3J0KG5hbWU9eyRpZGVudGlmaWVyU3Rhci5zdH0sCisgICAgICAgICAgICAgICAgYmVnaW49eyRpZGVudGlmaWVyU3Rhci5zdGFydH0sCisgICAgICAgICAgICAgICAgZW5kPXskaWRlbnRpZmllclN0YXIuc3RvcH0pCisgICAgOworCitUaGUgYXR0cmlidXRlcyBhcmUgc2V0IHZpYSBhc3NpZ25tZW50cyBpbiB0aGUgYXJndW1lbnQgbGlzdC4gIFRoZQorYXJndW1lbnRzIGFyZSBhY3Rpb25zIHdpdGggYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGluIHRoZSB0YXJnZXQKK2xhbmd1YWdlLiAgVGhlIC5zdCBsYWJlbCBwcm9wZXJ0eSBpcyB0aGUgcmVzdWx0IHRlbXBsYXRlIGZyb20gYSBydWxlCityZWZlcmVuY2UuICBUaGVyZSBpcyBhIG5pY2Ugc2hvcnRoYW5kIGluIGFjdGlvbnMgdG9vOgorCisgICAgJWZvbyhhPXt9LGI9e30sLi4uKSBjdG9yCisgICAgJSh7bmFtZS1leHByfSkoYT17fSwuLi4pIGluZGlyZWN0IHRlbXBsYXRlIGN0b3IgcmVmZXJlbmNlCisgICAgJXtzdHJpbmctZXhwcn0gYW5vbnltb3VzIHRlbXBsYXRlIGZyb20gc3RyaW5nIGV4cHIKKyAgICAle2V4cHJ9LnkgPSB6OyB0ZW1wbGF0ZSBhdHRyaWJ1dGUgeSBvZiBTdHJpbmdUZW1wbGF0ZS10eXBlZCBleHByIHRvIHoKKyAgICAleC55ID0gejsgc2V0IHRlbXBsYXRlIGF0dHJpYnV0ZSB5IG9mIHggKGFsd2F5cyBzZXQgbmV2ZXIgZ2V0IGF0dHIpCisgICAgICAgICAgICAgIHRvIHogW2xhbmd1YWdlcyBsaWtlIHB5dGhvbiB3aXRob3V0ICc7JyBtdXN0IHN0aWxsIHVzZSB0aGUKKyAgICAgICAgICAgICAgJzsnIHdoaWNoIHRoZSBjb2RlIGdlbmVyYXRvciBpcyBmcmVlIHRvIHJlbW92ZSBkdXJpbmcgY29kZSBnZW5dCisgICAgICAgICAgICAgIFNhbWUgYXMgJyh4KS5zZXRBdHRyaWJ1dGUoInkiLCB6KTsnCisKK0ZvciBBTlRMUiB2MyBJIGRlY2lkZWQgdG8gbWFrZSB0aGUgbW9zdCBjb21tb24gdGFza3MgZWFzeSBieSBkZWZhdWx0CityYXRoZXIuICBUaGlzIG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgYmFzaWMgb2JqZWN0cyBhcmUgaGVhdmllciB3ZWlnaHQKK3RoYW4gc29tZSBzcGVlZCBkZW1vbnMgd291bGQgbGlrZSwgYnV0IHRoZXkgYXJlIGZyZWUgdG8gcGFyZSBpdCBkb3duCitsZWF2aW5nIG1vc3QgcHJvZ3JhbW1lcnMgdGhlIGx1eHVyeSBvZiBoYXZpbmcgaXQgImp1c3Qgd29yay4iICBGb3IKK2V4YW1wbGUsIHRvIHJlYWQgaW4gc29tZSBpbnB1dCwgdHdlYWsgaXQsIGFuZCB3cml0ZSBpdCBiYWNrIG91dAorcHJlc2VydmluZyB3aGl0ZXNwYWNlLCBpcyBlYXN5IGluIHYzLgorCitUaGUgQU5UTFIgc291cmNlIGNvZGUgaXMgbXVjaCBwcmV0dGllci4gIFlvdSdsbCBhbHNvIG5vdGUgdGhhdCB0aGUKK3J1bi10aW1lIGNsYXNzZXMgYXJlIGNvbnZlbmllbnRseSBlbmNhcHN1bGF0ZWQgaW4gdGhlCitvcmcuYW50bHIucnVudGltZSBwYWNrYWdlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hvdyBkbyBJIGluc3RhbGwgdGhpcyBkYW1uIHRoaW5nPworCitKdXN0IHVudGFyIGFuZCB5b3UnbGwgZ2V0OgorCithbnRsci0zLjBiNi9SRUFETUUudHh0ICh0aGlzIGZpbGUpCithbnRsci0zLjBiNi9MSUNFTlNFLnR4dAorYW50bHItMy4wYjYvc3JjL29yZy9hbnRsci8uLi4KK2FudGxyLTMuMGI2L2xpYi9zdHJpbmd0ZW1wbGF0ZS0zLjAuamFyICgzLjBiNiBuZWVkcyAzLjApCithbnRsci0zLjBiNi9saWIvYW50bHItMi43LjcuamFyCithbnRsci0zLjBiNi9saWIvYW50bHItMy4wYjYuamFyCisKK1RoZW4geW91IG5lZWQgdG8gYWRkIGFsbCB0aGUgamFycyBpbiBsaWIgdG8geW91ciBDTEFTU1BBVEguCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSG93IGRvIEkgdXNlIEFOVExSIHYzPworCitbSSBhbSBhc3N1bWluZyB5b3UgYXJlIG9ubHkgdXNpbmcgdGhlIGNvbW1hbmQtbGluZSAoYW5kIG5vdCB0aGUKK0FOVExSV29ya3MgR1VJKV0uCisKK1J1bm5pbmcgQU5UTFIgd2l0aCBubyBwYXJhbWV0ZXJzIHNob3dzIHlvdToKKworQU5UTFIgUGFyc2VyIEdlbmVyYXRvciAgIEVhcmx5IEFjY2VzcyBWZXJzaW9uIDMuMGI2IChKYW4gMzEsIDIwMDcpIDE5ODktMjAwNwordXNhZ2U6IGphdmEgb3JnLmFudGxyLlRvb2wgW2FyZ3NdIGZpbGUuZyBbZmlsZTIuZyBmaWxlMy5nIC4uLl0KKyAgLW8gb3V0cHV0RGlyICAgICAgICAgIHNwZWNpZnkgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSBhbGwgb3V0cHV0IGlzIGdlbmVyYXRlZAorICAtbGliIGRpciAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBvZiB0b2tlbiBmaWxlcworICAtcmVwb3J0ICAgICAgICAgICAgICAgcHJpbnQgb3V0IGEgcmVwb3J0IGFib3V0IHRoZSBncmFtbWFyKHMpIHByb2Nlc3NlZAorICAtcHJpbnQgICAgICAgICAgICAgICAgcHJpbnQgb3V0IHRoZSBncmFtbWFyIHdpdGhvdXQgYWN0aW9ucworICAtZGVidWcgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYSBwYXJzZXIgdGhhdCBlbWl0cyBkZWJ1Z2dpbmcgZXZlbnRzCisgIC1wcm9maWxlICAgICAgICAgICAgICBnZW5lcmF0ZSBhIHBhcnNlciB0aGF0IGNvbXB1dGVzIHByb2ZpbGluZyBpbmZvcm1hdGlvbgorICAtbmZhICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYW4gTkZBIGZvciBlYWNoIHJ1bGUKKyAgLWRmYSAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgREZBIGZvciBlYWNoIGRlY2lzaW9uIHBvaW50CisgIC1tZXNzYWdlLWZvcm1hdCBuYW1lICBzcGVjaWZ5IG91dHB1dCBzdHlsZSBmb3IgbWVzc2FnZXMKKyAgLVggICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgZXh0ZW5kZWQgYXJndW1lbnQgbGlzdAorCitGb3IgZXhhbXBsZSwgY29uc2lkZXIgaG93IHRvIG1ha2UgdGhlIExMLXN0YXIgZXhhbXBsZSBmcm9tIHRoZSBleGFtcGxlcwordGFyYmFsbCB5b3UgY2FuIGdldCBhdCBodHRwOi8vd3d3LmFudGxyLm9yZy9kb3dubG9hZC9leGFtcGxlcy12My50YXIuZ3oKKworJCBjZCBleGFtcGxlcy9qYXZhL0xMLXN0YXIKKyQgamF2YSBvcmcuYW50bHIuVG9vbCBzaW1wbGVjLmcKKyQgamlrZXMgKi5qYXZhCisKK0ZvciBpbnB1dDoKKworY2hhciBjOworaW50IHg7Cit2b2lkIGJhcihpbnQgeCk7CitpbnQgZm9vKGludCB5LCBjaGFyIGQpIHsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPDM7IGk9aSsxKSB7CisgICAgeD0zOworICAgIHk9NTsKKyAgfQorfQorCit5b3Ugd2lsbCBzZWUgb3V0cHV0IGFzIGZvbGxvd3M6CisKKyQgamF2YSBNYWluIGlucHV0CitiYXIgaXMgYSBkZWNsYXJhdGlvbgorZm9vIGlzIGEgZGVmaW5pdGlvbgorCitXaGF0IGlmIEkgd2FudCB0byB0ZXN0IG15IHBhcnNlciB3aXRob3V0IGdlbmVyYXRpbmcgY29kZT8gIEVhc3kuICBKdXN0CitydW4gQU5UTFIgaW4gaW50ZXJwcmV0ZXIgbW9kZS4gIEl0IGNhbid0IGV4ZWN1dGUgeW91ciBhY3Rpb25zLCBidXQgaXQKK2NhbiBjcmVhdGUgYSBwYXJzZSB0cmVlIGZyb20geW91ciBpbnB1dCB0byBzaG93IHlvdSBob3cgaXQgd291bGQgYmUKK21hdGNoZWQuICBVc2UgdGhlIG9yZy5hbnRsci50b29sLkludGVycCBtYWluIGNsYXNzLiAgSW4gdGhlIGZvbGxvd2luZywKK0kgaW50ZXJwcmV0IHNpbXBsZWMuZyBvbiB0LmMsIHdoaWNoIGNvbnRhaW5zICJpbnQgeDsiCisKKyQgamF2YSBvcmcuYW50bHIudG9vbC5JbnRlcnAgc2ltcGxlYy5nIFdTIHByb2dyYW0gdC5jCisoIDxncmFtbWFyIFNpbXBsZUM+CisgICggcHJvZ3JhbQorICAgICggZGVjbGFyYXRpb24KKyAgICAgICggdmFyaWFibGUKKyAgICAgICAgKCB0eXBlIFtAMCwwOjI9J2ludCcsPDE0PiwxOjBdICkKKyAgICAgICAgKCBkZWNsYXJhdG9yIFtAMiw0OjQ9J3gnLDwyPiwxOjRdICkKKyAgICAgICAgW0AzLDU6NT0nOycsPDU+LDE6NV0KKyAgICAgICkKKyAgICApCisgICkKKykKKword2hlcmUgSSBoYXZlIGZvcm1hdHRlZCB0aGUgb3V0cHV0IHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZS4gIEkgaGF2ZQordG9sZCBpdCB0byBpZ25vcmUgYWxsIFdTIHRva2Vucy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIb3cgZG8gSSByZWJ1aWxkIEFOVExSIHYzPworCitNYWtlIHN1cmUgdGhlIGZvbGxvd2luZyB0d28gamFycyBhcmUgaW4geW91ciBDTEFTU1BBVEgKKworYW50bHItMy4wYjYvbGliL3N0cmluZ3RlbXBsYXRlLTMuMC5qYXIKK2FudGxyLTMuMGI2L2xpYi9hbnRsci0yLjcuNy5qYXIKK2p1bml0LmphciBbaWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIHRlc3QgZGlyZWN0b3JpZXNdCisKK3RoZW4ganVtcCBpbnRvIGFudGxyLTMuMGI2L3NyYyBkaXJlY3RvcnkgYW5kIHRoZW4gdHlwZToKKworJCBqYXZhYyAtZCAuIG9yZy9hbnRsci9Ub29sLmphdmEgb3JnL2FudGxyLyovKi5qYXZhIG9yZy9hbnRsci8qLyovKi5qYXZhCisKK1Rha2VzIDkgc2Vjb25kcyBvbiBteSAxR2h6IGxhcHRvcCBvciA0IHNlY29uZHMgd2l0aCBqaWtlcy4gIExhdGVyIEknbGwKK2hhdmUgYSByZWFsIGJ1aWxkIG1lY2hhbmlzbSwgdGhvdWdoIEkgbXVzdCBhZG1pdCB0aGUgb25lLWxpbmVyIGFwcGVhbHMKK3RvIG1lLiAgSSB1c2UgSW50ZWxsaWogc28gSSBuZXZlciB0eXBlIGFueXRoaW5nIGFjdHVhbGx5IHRvIGJ1aWxkLgorCitUaGVyZSBpcyBhbHNvIGFuIEFOVCBidWlsZC54bWwgZmlsZSwgYnV0IEkga25vdyBub3RoaW5nIG9mIEFOVDsgY29udHJpYnV0ZWQKK2J5IG90aGVycyAoSSdtIG9wcG9zZWQgdG8gYW55IHRvb2wgd2l0aCBhbiBYTUwgaW50ZXJmYWNlIGZvciBIdW1hbnMpLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQyMgVGFyZ2V0IE5vdGVzCisKKzEuIEF1dG8tZ2VuZXJhdGVkIGxleGVycyBkbyBub3QgaW5oZXJpdCBwYXJlbnQgcGFyc2VyJ3MgQG5hbWVzcGFjZQorICAgey4uLn0gdmFsdWUuICBVc2UgQGxleGVyOjpuYW1lc3BhY2V7Li4ufS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ0hBTkdFUworCitNYXJjaCAxNywgMjAwNworCisqIEpvbmF0aGFuIERlS2xvdHogdXBkYXRlZCBDIyB0ZW1wbGF0ZXMgdG8gYmUgMy4wYjYgY3VycmVudAorCitNYXJjaCAxNCwgMjAwNworCisqIE1hbnVhbGx5LXNwZWNpZmllZCAoLi4uKT0+IGZvcmNlIGJhY2t0cmFja2luZyBldmFsIG9mIHRoYXQgcHJlZGljYXRlLgorICBiYWNrdHJhY2tpbmc9dHJ1ZSBtb2RlIGRvZXMgbm90IGhvd2V2ZXIuICBBZGRlZCB1bml0IHRlc3QuCisKK01hcmNoIDE0LCAyMDA3CisKKyogRml4ZWQgYnVnIGluIGxleGVyIHdoZXJlIH5UIGRpZG4ndCBjb21wdXRlIHRoZSBzZXQgZnJvbSBydWxlIFQuCisKKyogQWRkZWQgLVhub2lubGluZWRmYSBtYWtlIGFsbCBERkEgd2l0aCB0YWJsZXM7IG5vIGlubGluZSBwcmVkaWN0aW9uIHdpdGggSUZzCisKKyogRml4ZWQgaHR0cDovL3d3dy5hbnRsci5vcmc6ODg4OC9icm93c2UvQU5UTFItODAuCisgIFNlbSBwcmVkIHN0YXRlcyBkaWRuJ3QgZGVmaW5lIGxvb2thaGVhZCB2YXJzLgorCisqIEZpeGVkIGh0dHA6Ly93d3cuYW50bHIub3JnOjg4ODgvYnJvd3NlL0FOVExSLTkxLiAgCisgIFdoZW4gZm9yY2luZyBzb21lIGFjeWNsaWMgREZBIHRvIGJlIHN0YXRlIHRhYmxlcywgdGhleSBicm9rZS4KKyAgRm9yY2luZyBhbGwgREZBIHRvIGJlIHN0YXRlIHRhYmxlcyBzaG91bGQgZ2l2ZSBzYW1lIHJlc3VsdHMuCisKK01hcmNoIDEyLCAyMDA3CisKKyogc2V0VG9rZW5Tb3VyY2UgaW4gQ29tbW9uVG9rZW5TdHJlYW0gZGlkbid0IGNsZWFyIHRva2VucyBsaXN0LgorICBzZXRDaGFyU3RyZWFtIGNhbGxzIHJlc2V0IGluIExleGVyLgorCisqIEFsdGVyZWQgLWRlcGVuZC4gIE5vIGxvbmdlciBwcmludGluZyBncmFtbWFyIGZpbGVzIGZvciBtdWx0aXBsZSBpbnB1dAorICBmaWxlcyB3aXRoIC1kZXBlbmQuICBEb2Vzbid0IHNob3cgVF9fLmcgdGVtcCBmaWxlIGFueW1vcmUuIEFkZGVkCisgIFRMZXhlci50b2tlbnMuICBBZGRlZCAuaCBmaWxlcyBpZiBkZWZpbmVkLgorCitGZWJydWFyeSAxMSwgMjAwNworCisqIEFkZGVkIC1kZXBlbmQgY29tbWFuZC1saW5lIG9wdGlvbiB0aGF0LCBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgZmlsZXMsCisgIGl0IHNob3dzIHlvdSB3aGF0IGZpbGVzIHRoZSBpbnB1dCBncmFtbWFyKHMpIGRlcGVuZCBvbiBhbmQgd2hhdCBmaWxlcworICB0aGV5IGdlbmVyYXRlLiBGb3IgY29tYmluZWQgZ3JhbW1hciBULmc6CisKKyAgJCBqYXZhIG9yZy5hbnRsci5Ub29sIC1kZXBlbmQgVC5nCisKKyAgWW91IGdldDoKKworICBUUGFyc2VyLmphdmEgOiBULmcKKyAgVC50b2tlbnMgOiBULmcKKyAgVF9fLmcgOiBULmcKKworICBOb3csIGFzc3VtaW5nIFUuZyBpcyBhIHRyZWUgZ3JhbW1hciByZWYnZCBUJ3MgdG9rZW5zOgorCisgICQgamF2YSBvcmcuYW50bHIuVG9vbCAtZGVwZW5kIFQuZyBVLmcKKworICBUUGFyc2VyLmphdmEgOiBULmcKKyAgVC50b2tlbnMgOiBULmcKKyAgVF9fLmcgOiBULmcKKyAgVS5nOiBULnRva2VucworICBVLmphdmEgOiBVLmcKKyAgVS50b2tlbnMgOiBVLmcKKworICBIYW5kbGVzIHNwYWNlcyBieSBlc2NhcGluZyB0aGVtLiAgUGF5cyBhdHRlbnRpb24gdG8gLW8sIC1mbyBhbmQgLWxpYi4KKyAgRGlyICd4IHknIGlzIGEgdmFsaWQgZGlyIGluIGN1cnJlbnQgZGlyLgorCisgICQgamF2YSBvcmcuYW50bHIuVG9vbCAtZGVwZW5kIC1saWIgL3Vzci9sb2NhbC9saWIgLW8gJ3ggeScgVC5nIFUuZworICB4XCB5L1RQYXJzZXIuamF2YSA6IFQuZworICB4XCB5L1QudG9rZW5zIDogVC5nCisgIHhcIHkvVF9fLmcgOiBULmcKKyAgVS5nOiAvdXNyL2xvY2FsL2xpYi9ULnRva2VucworICB4XCB5L1UuamF2YSA6IFUuZworICB4XCB5L1UudG9rZW5zIDogVS5nCisKKyAgWW91IGhhdmUgQVBJIGFjY2VzcyB2aWEgb3JnLmFudGxyLnRvb2wuQnVpbGREZXBlbmRlbmN5R2VuZXJhdG9yIGNsYXNzOgorICBnZXRHZW5lcmF0ZWRGaWxlTGlzdCgpLCBnZXREZXBlbmRlbmNpZXNGaWxlTGlzdCgpLiAgWW91IGNhbiBhbHNvIGFjY2VzcworICB0aGUgb3V0cHV0IHRlbXBsYXRlOiBnZXREZXBlbmRlbmNpZXMoKS4gIFRoZSBmaWxlCisgIG9yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kZXBlbmQuc3RnIGNvbnRhaW5zIHRoZSB0ZW1wbGF0ZS4gIFlvdSBjYW4KKyAgbW9kaWZ5IGFzIHlvdSB3YW50LiAgRmlsZSBvYmplY3RzIGdvIGluIHNvIHlvdSBjYW4gcGxheSB3aXRoIHBhdGggZXRjLi4uCisKK0ZlYnJ1YXJ5IDEwLCAyMDA3CisKKyogbm8gbW9yZSAuZ2wgZmlsZXMgZ2VuZXJhdGVkLiAgQWxsIC5nIGFsbCB0aGUgdGltZS4KKworKiBjaGFuZ2VkIEBmaW5hbGx5IHRvIGJlIEBhZnRlciBhbmQgYWRkZWQgYSBmaW5hbGx5IGNsYXVzZSB0byB0aGUKKyAgZXhjZXB0aW9uIHN0dWZmLiAgSSBhbHNvIHJlbW92ZWQgdGhlIHN1cGVyZmx1b3VzICJleGNlcHRpb24iCisgIGtleXdvcmQuICBIZXJlJ3Mgd2hhdCB0aGUgbmV3IHN5bnRheCBsb29rcyBsaWtlOgorCisgIGEKKyAgQGFmdGVyIHsgU3lzdGVtLm91dC5wcmludGxuKCJpY2siKTsgfQorICAgIDogJ2EnCisgICAgOyAgICAgICAgCisgICAgY2F0Y2hbUmVjb2duaXRpb25FeGNlcHRpb24gZV0geyBTeXN0ZW0ub3V0LnByaW50bG4oImZvbyIpOyB9CisgICAgY2F0Y2hbSU9FeGNlcHRpb24gZV0geyBTeXN0ZW0ub3V0LnByaW50bG4oImlvIik7IH0KKyAgICBmaW5hbGx5IHsgU3lzdGVtLm91dC5wcmludGxuKCJmb29iYXIiKTsgfQorCisgIEBhZnRlciBleGVjdXRlcyBhZnRlciBib29ra2VlcGluZyB0byBzZXQgJHJ1bGUuc3RvcCwgJHJ1bGUudHJlZSBidXQKKyAgYmVmb3JlIHNjb3BlcyBwb3AgYW5kIGFueSBtZW1vaXphdGlvbiBoYXBwZW5zLiAgRHluYW1pYyBzY29wZXMgYW5kCisgIG1lbW9pemF0aW9uIGFyZSBzdGlsbCBpbiBnZW5lcmF0ZWQgZmluYWxseSBibG9jayBiZWNhdXNlIHRoZXkgbXVzdAorICBleGVjIGV2ZW4gaWYgZXJyb3IgaW4gcnVsZS4gIFRoZSBAYWZ0ZXIgYWN0aW9uIGFuZCB0cmVlIHNldHRpbmcKKyAgc3R1ZmYgY2FuIHRlY2huaWNhbGx5IGJlIHNraXBwZWQgdXBvbiBzeW50YXggZXJyb3IgaW4gcnVsZS4gIFtMYXRlcgorICB3ZSBtaWdodCBhZGQgc29tZXRoaW5nIHRvIGZpbmFsbHkgdG8gc3RpY2sgYW4gRVJST1IgdG9rZW4gaW4gdGhlCisgIHRyZWUgYW5kIHNldCB0aGUgcmV0dXJuIHZhbHVlLl0gIFNlcXVlbmNlIGdvZXM6IHNldCAkc3RvcCwgJHRyZWUgKGlmCisgIGFueSksIEBhZnRlciAoaWYgYW55KSwgcG9wIHNjb3BlcyAoaWYgYW55KSwgbWVtb2l6ZSAoaWYgbmVlZGVkKSwKKyAgZ3JhbW1hciBmaW5hbGx5IGNsYXVzZS4gIExhc3QgMyBhcmUgaW4gZ2VuZXJhdGVkIGNvZGUncyBmaW5hbGx5CisgIGNsYXVzZS4KKworMy4wYjYgLSBKYW51YXJ5IDMxLCAyMDA3CisKK0phbnVhcnkgMzAsIDIwMDcKKworKiBGaXhlZCBidWcgaW4gSW50ZXJ2YWxTZXQuYW5kOiBpdCByZXR1cm5lZCB0aGUgc2FtZSBlbXB0eSBzZXQgYWxsIHRoZSB0aW1lCisgIHJhdGhlciB0aGFuIG5ldyBlbXB0eSBzZXQuICBDb2RlIGFsdGVyZWQgdGhlIHNhbWUgZW1wdHkgc2V0LgorCisqIE1hZGUgYW5hbHlzaXMgdGVybWluYXRlIGZhc3RlciB1cG9uIGEgZGVjaXNpb24gdGhhdCB0YWtlcyB0b28gbG9uZzsKKyAgaXQgc2VlbWVkIHRvIGtlZXAgZG9pbmcgd29yayBmb3IgYSB3aGlsZS4gIFJlZmFjdG9yZWQgc29tZSBuYW1lcworICBhbmQgdXBkYXRlZCBjb21tZW50cy4gIEFsc28gbWFkZSBpdCB0ZXJtaW5hdGUgd2hlbiBpdCByZWFsaXplcyBpdCdzCisgIG5vbi1MTCgqKSBkdWUgdG8gcmVjdXJzaW9uLiAganVzdCBhZGRlZCB0ZXJtaW5hdGUgY29uZGl0aW9ucyB0byBsb29wCisgIGluIGNvbnZlcnQoKS4KKworKiBTb21ldGltZXMgZmF0YWwgbm9uLUxMKCopIG1lc3NhZ2VzIGRpZG4ndCBhcHBlYXI7IGluc3RlYWQgeW91IGdvdAorICAiYW50bHIgY291bGRuJ3QgYW5hbHl6ZSIsIHdoaWNoIGlzIGFjdHVhbGx5IHVudHJ1ZS4gIEkgaGFkIHRoZQorICBvcmRlciBvZiBzb21lIHByaW50cyB3cm9uZyBpbiB0aGUgRGVjaXNpb25Qcm9iZS4KKworKiBUaGUgY29kZSBnZW5lcmF0b3IgaW5jb3JyZWN0bHkgZGV0ZWN0ZWQgd2hlbiBpdCBjb3VsZCB1c2UgYSBmaXhlZCwKKyAgYWN5Y2xpYyBpbmxpbmUgREZBIChpLmUuLCB1c2luZyBhbiBJRikuICBVcG9uIG5vbi1MTCgqKSBkZWNpc2lvbnMKKyAgd2l0aCBwcmVkaWNhdGVzLCBhbmFseXNpcyBtYWRlIGN5Y2xpYyBERkEuICBCdXQgdGhpcyBzdG9wcworICB0aGUgY29tcHV0YXRpb24gZGV0ZWN0aW5nIHdoZXRoZXIgdGhleSBhcmUgY3ljbGljLiAgSSBqdXN0IGFkZGVkCisgIGEgcHJvdGVjdGlvbiBpbiBmcm9udCBvZiB0aGUgYWN5Y2xpYyBERkEgZ2VuZXJhdG9yIHRvIGF2b2lkIGlmCisgIG5vbi1MTCgqKS4gIFVwZGF0ZWQgY29tbWVudHMuCisKK0phbnVhcnkgMjMsIDIwMDcKKworKiBNYWRlIHRyZWUgbm9kZSBzdHJlYW1zIHVzZSBhZGFwdG9yIHRvIGNyZWF0ZSBuYXZpZ2F0aW9uIG5vZGVzLgorICBUaGFua3MgdG8gRW1vbmQgUGFwZWdhYWlqLgorCitKYW51YXJ5IDIyLCAyMDA3CisKKyogQWRkZWQgbGV4ZXIgcnVsZSBwcm9wZXJ0aWVzOiBzdGFydCwgc3RvcAorCitKYW51YXJ5IDEsIDIwMDcKKworKiBhbmFseXNpcyBmYWlsc2FmZSBpcyBiYWNrIG9uOyBpZiBhIGRlY2lzaW9uIHRha2VzIHRvbyBsb25nLCBpdCBiYWlscyBvdXQKKyAgYW5kIHVzZXMgaz0xCisKK0phbnVhcnkgMSwgMjAwNworCisqICs9IGxhYmVscyBmb3IgcnVsZXMgb25seSB3b3JrIGZvciBvdXRwdXQgb3B0aW9uOyBwcmV2aW91c2x5IGVsZW1lbnRzCisgIG9mIGxpc3Qgd2VyZSB0aGUgcmV0dXJuIHZhbHVlIHN0cnVjdHMsIGJ1dCBhcmUgbm93IGVpdGhlciB0aGUgdHJlZSBvcgorICBTdHJpbmdUZW1wbGF0ZSByZXR1cm4gdmFsdWUuICBZb3UgY2FuIGxhYmVsIGRpZmZlcmVudCBydWxlcyBub3cKKyAgeCs9YSB4Kz1iLgorCitEZWNlbWJlciAzMCwgMjAwNgorCisqIEFsbG93IFwiIHRvIHdvcmsgY29ycmVjdGx5IGluICIuLi4iIHRlbXBsYXRlLgorCitEZWNlbWJlciAyOCwgMjAwNgorCisqIGVycm9ycyB0aGF0IGFyZSBub3cgd2FybmluZ3M6IG1pc3NpbmcgQVNUIGxhYmVsIHR5cGUgaW4gdHJlZXMuCisgIEFsc28gIm5vIHN0YXJ0IHJ1bGUgZGV0ZWN0ZWQiIGlzIHdhcm5pbmcuCisKKyogdHJlZSBncmFtbWFycyBhbHNvIGNhbiBkbyByZXdyaXRlPXRydWUgZm9yIG91dHB1dD10ZW1wbGF0ZS4KKyAgT25seSB3b3JrcyBmb3IgYWx0cyB3aXRoIHNpbmdsZSBub2RlIG9yIHRyZWUgYXMgYWx0IGVsZW1lbnRzLgorICBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSAkdGV4dCBpbiBhIHRyZWUgZ3JhbW1hciBvciBkbyByZXdyaXRlPXRydWUKKyAgZm9yIHRlbXBsYXRlcywgeW91IG11c3QgdXNlIGluIHlvdXIgbWFpbjoKKworICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOworCisqIFlvdSBnZXQgYSB3YXJuaW5nIGZvciB0cmVlIGdyYW1tYXJzIHRoYXQgZG8gcmV3cml0ZT10cnVlIGFuZAorICBvdXRwdXQ9dGVtcGxhdGUgYW5kIGhhdmUgLT4gZm9yIGFsdHMgdGhhdCBhcmUgbm90IHNpbXBsZSBub2RlcworICBvciBzaW1wbGUgdHJlZXMuICBuZXcgdW5pdCB0ZXN0cyBpbiBUZXN0UmV3cml0ZVRlbXBsYXRlcyBhdCBlbmQuCisKK0RlY2VtYmVyIDI3LCAyMDA2CisKKyogRXJyb3IgbWVzc2FnZSBhcHBlYXJzIHdoZW4geW91IHVzZSAtPiBpbiB0cmVlIGdyYW1tYXIgd2l0aAorICBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBmb3IgYWx0IHRoYXQgaXMgbm90IHNpbXBsZQorICBub2RlIG9yIHRyZWUgcmVmLgorCisqIG5vIG1vcmUgJHN0b3AgYXR0cmlidXRlIGZvciB0cmVlIHBhcnNlcnM7IG1lYW5pbmdsZXNzL3VzZWxlc3MuCisgIFJlbW92ZWQgZnJvbSBUcmVlUnVsZVJldHVyblNjb3BlIGFsc28uCisKKyogcnVsZSB0ZXh0IGF0dHJpYnV0ZSBpbiB0cmVlIHBhcnNlciBtdXN0IHB1bGwgZnJvbSB0b2tlbiBidWZmZXIuCisgIE1ha2VzIG5vIHNlbnNlIG90aGVyd2lzZS4gIGFkZGVkIGdldFRva2VuU3RyZWFtIHRvIFRyZWVOb2RlU3RyZWFtCisgIHNvIHJ1bGUgJHRleHQgYXR0ciB3b3Jrcy4gIENvbW1vblRyZWVOb2RlU3RyZWFtIGV0Yy4uLiBub3cgbGV0CisgIHlvdSBzZXQgdGhlIHRva2VuIHN0cmVhbSBzbyB5b3UgY2FuIGFjY2VzcyBsYXRlciBmcm9tIHRyZWUgcGFyc2VyLgorICAkdGV4dCBpcyBub3Qgd2VsbC1kZWZpbmVkIGZvciBydWxlcyBsaWtlCisKKyAgICAgc2xpc3QgOiBzdGF0KyA7CisKKyAgYmVjYXVzZSBzdGF0IGlzIG5vdCBhIHNpbmdsZSBub2RlIG5vciByb290ZWQgd2l0aCBhIHNpbmdsZSBub2RlLgorICAkc2xpc3QudGV4dCB3aWxsIGdldCBvbmx5IGZpcnN0IHN0YXQuICBJIG5lZWQgdG8gYWRkIGEgd2FybmluZyBhYm91dAorICB0aGlzLi4uCisKKyogRml4ZWQgaHR0cDovL3d3dy5hbnRsci5vcmc6ODg4OC9icm93c2UvQU5UTFItNzYgZm9yIEphdmEuCisgIEVuaGFuY2VkIFRva2VuUmV3cml0ZVN0cmVhbSBzbyBpdCBhY2NlcHRzIGFueSBvYmplY3Q7IGNvbnZlcnRzCisgIHRvIHN0cmluZyBhdCBsYXN0IHNlY29uZC4gIEFsbG93cyB5b3UgdG8gcmV3cml0ZSB3aXRoIFN0cmluZ1RlbXBsYXRlCisgIHRlbXBsYXRlcyBub3cgOikKKworKiBhZGRlZCByZXdyaXRlIG9wdGlvbiB0aGF0IG1ha2VzIC0+IHRlbXBsYXRlIHJld3JpdGVzIGRvIHJlcGxhY2Ugb3BzIGZvcgorICBUb2tlblJld3JpdGVTdHJlYW0gaW5wdXQgc3RyZWFtLiAgSW4gb3V0cHV0PXRlbXBsYXRlIGFuZCByZXdyaXRlPXRydWUgbW9kZQorICBzYW1lIGFzIGJlZm9yZSAnY2VwdCB0aGF0IHRoZSBwYXJzZXIgZG9lcworCisgICAgKChUb2tlblJld3JpdGVTdHJlYW0paW5wdXQpLnJlcGxhY2UoCisJICAgICAgKChUb2tlbilyZXR2YWwuc3RhcnQpLmdldFRva2VuSW5kZXgoKSwKKwkgICAgICBpbnB1dC5MVCgtMSkuZ2V0VG9rZW5JbmRleCgpLAorCSAgICAgIHJldHZhbC5zdCk7CisKKyAgYWZ0ZXIgZWFjaCByZXdyaXRlIHNvIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpcyBhbHRlcmVkLiAgTGF0ZXIgcmVmcyB0bworICAkdGV4dCB3aWxsIGhhdmUgcmV3cml0ZXMuICBIZXJlJ3MgYSBzYW1wbGUgdGVzdCBwcm9ncmFtIGZvciBncmFtbWFyIFJldy4KKworICAgICAgICBGaWxlUmVhZGVyIGdyb3VwRmlsZVIgPSBuZXcgRmlsZVJlYWRlcigiUmV3LnN0ZyIpOworICAgICAgICBTdHJpbmdUZW1wbGF0ZUdyb3VwIHRlbXBsYXRlcyA9IG5ldyBTdHJpbmdUZW1wbGF0ZUdyb3VwKGdyb3VwRmlsZVIpOworICAgICAgICBBTlRMUklucHV0U3RyZWFtIGlucHV0ID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oU3lzdGVtLmluKTsKKyAgICAgICAgUmV3TGV4ZXIgbGV4ZXIgPSBuZXcgUmV3TGV4ZXIoaW5wdXQpOworICAgICAgICBUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhlcik7CisgICAgICAgIFJld1BhcnNlciBwYXJzZXIgPSBuZXcgUmV3UGFyc2VyKHRva2Vucyk7CisgICAgICAgIHBhcnNlci5zZXRUZW1wbGF0ZUxpYih0ZW1wbGF0ZXMpOworICAgICAgICBwYXJzZXIucHJvZ3JhbSgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLnRvU3RyaW5nKCkpOworICAgICAgICBncm91cEZpbGVSLmNsb3NlKCk7CisKK0RlY2VtYmVyIDI2LCAyMDA2CisKKyogQmFzZVRyZWUuZHVwVHJlZSBkaWRuJ3QgZHVwIHJlY3Vyc2l2ZWx5LgorCitEZWNlbWJlciAyNCwgMjAwNgorCisqIENsZWFuZWQgdXAgc29tZSBjb21tZW50cyBhbmQgcmVtb3ZlZCBmaWVsZCB0cmVlTm9kZQorICBmcm9tIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiBjbGFzcy4gIEl0IGlzICJub2RlIiBpbgorICBSZWNvZ25pdGlvbkV4Y2VwdGlvbi4KKworKiBDaGFuZ2VkIHR5cGUgZnJvbSBPYmplY3QgdG8gQml0U2V0IGZvciBleHBlY3RpbmcgZmllbGRzIGluCisgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gYW5kIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24KKworKiBDbGVhbmVkIHVwIGVycm9yIHByaW50aW5nIGluIGxleGVycyBhbmQgdGhlIG1lc3NhZ2VzIHRoYXQgaXQgY3JlYXRlcy4KKworKiBBZGRlZCB0aGlzIHRvIFRyZWVBZGFwdG9yOgorCS8qKiBSZXR1cm4gdGhlIHRva2VuIG9iamVjdCBmcm9tIHdoaWNoIHRoaXMgbm9kZSB3YXMgY3JlYXRlZC4KKwkgKiAgQ3VycmVudGx5IHVzZWQgb25seSBmb3IgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4KKwkgKiAgVGhlIGVycm9yIGRpc3BsYXkgcm91dGluZSBpbiBCYXNlUmVjb2duaXplciBuZWVkcyB0bworCSAqICBkaXNwbGF5IHdoZXJlIHRoZSBpbnB1dCB0aGUgZXJyb3Igb2NjdXJyZWQuIElmIHlvdXIKKwkgKiAgdHJlZSBvZiBsaW1pdGF0aW9uIGRvZXMgbm90IHN0b3JlIGluZm9ybWF0aW9uIHRoYXQgY2FuCisJICogIGxlYWQgeW91IHRvIHRoZSB0b2tlbiwgeW91IGNhbiBjcmVhdGUgYSB0b2tlbiBmaWxsZWQgd2l0aAorCSAqICB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gYW5kIHBhc3MgdGhhdCBiYWNrLiAgU2VlCisJICogIEJhc2VSZWNvZ25pemVyLmdldEVycm9yTWVzc2FnZSgpLgorCSAqLworCXB1YmxpYyBUb2tlbiBnZXRUb2tlbihPYmplY3QgdCk7CisKK0RlY2VtYmVyIDIzLCAyMDA2CisKKyogbWFkZSBCYXNlUmVjb2duaXplci5kaXNwbGF5UmVjb2duaXRpb25FcnJvciBub25zdGF0aWMgc28gcGVvcGxlIGNhbgorICBvdmVycmlkZSBpdC4gTm90IHN1cmUgd2h5IGl0IHdhcyBzdGF0aWMgYmVmb3JlLgorCisqIFJlbW92ZWQgc3RhdGUvZGVjaXNpb24gbWVzc2FnZSB0aGF0IGNvbWVzIG91dCBvZiBubyAKKyAgdmlhYmxlIGFsdGVybmF0aXZlIGV4Y2VwdGlvbnMsIGFzIHRoYXQgd2FzIHRvbyBtdWNoLgorICByZW1vdmVkIHRoZSBkZWNpc2lvbiBudW1iZXIgZnJvbSB0aGUgZWFybHkgZXhpdCBleGNlcHRpb24KKyAgYWxzby4gIER1cmluZyBkZXZlbG9wbWVudCwgeW91IGNhbiBzaW1wbHkgb3ZlcnJpZGUKKyAgZGlzcGxheVJlY29nbml0aW9uRXJyb3IgZnJvbSBCYXNlUmVjb2duaXplciB0byBhZGQgdGhlIHN0dWZmCisgIGJhY2sgaW4gaWYgeW91IHdhbnQuCisKKyogbWFkZSBvdXRwdXQgZ28gdG8gYW4gb3V0cHV0IG1ldGhvZCB5b3UgY2FuIG92ZXJyaWRlOiBlbWl0RXJyb3JNZXNzYWdlKCkKKworKiBnZW5lcmFsIGNsZWFudXAgb2YgdGhlIGVycm9yIGVtaXR0aW5nIGNvZGUgaW4gQmFzZVJlY29nbml6ZXIuICBMb3RzCisgIG1vcmUgc3R1ZmYgeW91IGNhbiBvdmVycmlkZTogZ2V0RXJyb3JIZWFkZXIsIGdldFRva2VuRXJyb3JEaXNwbGF5LAorICBlbWl0RXJyb3JNZXNzYWdlLCBnZXRFcnJvck1lc3NhZ2UuCisKK0RlY2VtYmVyIDIyLCAyMDA2CisKKyogQWx0ZXJlZCBUcmVlLlBhcnNlci5tYXRjaEFueSgpIHNvIHRoYXQgaXQgc2tpcHMgZW50aXJlIHRyZWVzIGlmCisgIG5vZGUgaGFzIGNoaWxkcmVuIG90aGVyd2lzZSBza2lwcyBvbmUgbm9kZS4gIE5vdyB0aGlzIHdvcmtzIHRvCisgIHNraXAgZW50aXJlIGJvZHkgb2YgZnVuY3Rpb24gaWYgc2luZ2xlLXJvb3RlZCBzdWJ0cmVlOgorICBeKEZVTkMgbmFtZT1JRCBhcmc9SUQgLikKKworKiBBZGRlZCAicmV2ZXJzZSBpbmRleCIgZnJvbSBub2RlIHRvIHN0cmVhbSBpbmRleC4gIE92ZXJyaWRlCisgIGZpbGxSZXZlcnNlSW5kZXgoKSBpbiBDb21tb25UcmVlTm9kZVN0cmVhbSBpZiB5b3Ugd2FudCB0byBjaGFuZ2UuCisgIFVzZSBnZXROb2RlSW5kZXgobm9kZSkgdG8gZmluZCBzdHJlYW0gaW5kZXggZm9yIGEgc3BlY2lmaWMgdHJlZSBub2RlLgorICBTZWUgZ2V0Tm9kZUluZGV4KCksIHJldmVyc2VJbmRleChTZXQgdG9rZW5UeXBlcyksCisgIHJldmVyc2VJbmRleChpbnQgdG9rZW5UeXBlKSwgZmlsbFJldmVyc2VJbmRleCgpLiAgVGhlIGluZGV4aW5nCisgIGNvc3RzIHRpbWUgYW5kIG1lbW9yeSB0byBmaWxsLCBidXQgcHVsbGluZyBzdHVmZiBvdXQgd2lsbCBiZSBsb3RzCisgIGZhc3RlciBhcyBpdCBjYW4ganVtcCBmcm9tIGEgbm9kZSBwdHIgc3RyYWlnaHQgdG8gYSBzdHJlYW0gaW5kZXguCisKKyogQWRkZWQgVHJlZU5vZGVTdHJlYW0uZ2V0KGluZGV4KSB0byBtYWtlIGl0IGVhc2llciBmb3IgaW50ZXJwcmV0ZXJzIHRvCisgIGp1bXAgYXJvdW5kIGluIHRyZWUgbm9kZSBzdHJlYW0uCisKKyogTmV3IENvbW1vblRyZWVOb2RlU3RyZWFtIGJ1ZmZlcnMgYWxsIG5vZGVzIGluIHN0cmVhbSBmb3IgZmFzdCBqdW1waW5nCisgIGFyb3VuZC4gIEl0IG5vdyBoYXMgcHVzaC9wb3AgbWV0aG9kcyB0byBpbnZva2Ugb3RoZXIgbG9jYXRpb25zIGluCisgIHRoZSBzdHJlYW0gZm9yIGJ1aWxkaW5nIGludGVycHJldGVycy4KKworKiBNb3ZlZCBDb21tb25UcmVlTm9kZVN0cmVhbSB0byBVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gYW5kIHJlbW92ZWQKKyAgSXRlcmF0b3IgaW1wbGVtZW50YXRpb24uICBtb3ZlZCB0b05vZGVzT25seVN0cmluZygpIHRvIFRlc3RUcmVlTm9kZVN0cmVhbQorCisqIFtCUkVBS1MgQU5ZIFRSRUUgSU1QTEVNRU5UQVRJT05dCisgIG1hZGUgQ29tbW9uVHJlZU5vZGVTdHJlYW0gd29yayB3aXRoIGFueSB0cmVlIG5vZGUgdHlwZS4gIFRyZWVBZGFwdG9yCisgIG5vdyBpbXBsZW1lbnRzIGlzTmlsIHNvIG11c3QgYWRkOyB0cml2aWFsLCBidXQgZG9lcyBicmVhayBiYWNrCisgIGNvbXBhdGliaWxpdHkuCisKK0RlY2VtYmVyIDE3LCAyMDA2CisKKyogQWRkZWQgdHJhY2VJbi9PdXQgbWV0aG9kcyB0byByZWNvZ25pemVycyBzbyB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdGhlbTsKKyAgcHJldmlvdXNseSB0aGV5IHdlcmUgaW4tbGluZSBwcmludCBzdGF0ZW1lbnRzLiBUaGUgbWVzc2FnZSBoYXMgYWxzbworICBiZWVuIHNsaWdodGx5IGltcHJvdmVkLgorCisqIEZhY3RvcmVkIEJ1aWxkUGFyc2VUcmVlIGludG8gZGVidWcgcGFja2FnZTsgY2xlYW5lZCBzdHVmZiB1cC4gRml4ZWQKKyAgdW5pdCB0ZXN0cy4KKworRGVjZW1iZXIgMTUsIDIwMDYKKworKiBbQlJFQUtTIEFOWSBUUkVFIElNUExFTUVOVEFUSU9OXQorICBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7IG5lZWRlZCB0byBhZGQgZ2V0L3NldCBmb3IgdG9rZW4gc3RhcnQvc3RvcAorICBpbmRleCBzbyBDb21tb25UcmVlQWRhcHRvciBjYW4gYXNzdW1lIFRyZWUgaW50ZXJmYWNlIG5vdCBDb21tb25UcmVlCisgIGltcGxlbWVudGF0aW9uLiAgT3RoZXJ3aXNlLCBubyB3YXkgdG8gY3JlYXRlIHlvdXIgb3duIG5vZGVzIHRoYXQgc2F0aXNmeQorICBUcmVlIGJlY2F1c2UgQ29tbW9uVHJlZUFkYXB0b3Igd2FzIGRvaW5nIAorCisJcHVibGljIGludCBnZXRUb2tlblN0YXJ0SW5kZXgoT2JqZWN0IHQpIHsKKwkJcmV0dXJuICgoQ29tbW9uVHJlZSl0KS5zdGFydEluZGV4OworCX0KKworICBBZGRlZCB0byBUcmVlOgorCisJLyoqICBXaGF0IGlzIHRoZSBzbWFsbGVzdCB0b2tlbiBpbmRleCAoaW5kZXhpbmcgZnJvbSAwKSBmb3IgdGhpcyBub2RlCisJICogICBhbmQgaXRzIGNoaWxkcmVuPworCSAqLworCWludCBnZXRUb2tlblN0YXJ0SW5kZXgoKTsKKworCXZvaWQgc2V0VG9rZW5TdGFydEluZGV4KGludCBpbmRleCk7CisKKwkvKiogIFdoYXQgaXMgdGhlIGxhcmdlc3QgdG9rZW4gaW5kZXggKGluZGV4aW5nIGZyb20gMCkgZm9yIHRoaXMgbm9kZQorCSAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKwkgKi8KKwlpbnQgZ2V0VG9rZW5TdG9wSW5kZXgoKTsJCisKKwl2b2lkIHNldFRva2VuU3RvcEluZGV4KGludCBpbmRleCk7CisKK0RlY2VtYmVyIDEzLCAyMDA2CisgCisqIEFkZGVkIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuRE9UVHJlZUdlbmVyYXRvciBzbyB5b3UgY2FuIGdlbmVyYXRlIERPVAorICBkaWFncmFtcyBlYXNpbHkgZnJvbSB0cmVlcy4KKworCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJJbnB1dFN0cmVhbShTeXN0ZW0uaW4pOworCVRMZXhlciBsZXggPSBuZXcgVExleGVyKGlucHV0KTsKKwlDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTsKKwlUUGFyc2VyIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRva2Vucyk7CisJVFBhcnNlci5lX3JldHVybiByID0gcGFyc2VyLmUoKTsKKwlUcmVlIHQgPSAoVHJlZSlyLnRyZWU7CisJU3lzdGVtLm91dC5wcmludGxuKHQudG9TdHJpbmdUcmVlKCkpOworCURPVFRyZWVHZW5lcmF0b3IgZ2VuID0gbmV3IERPVFRyZWVHZW5lcmF0b3IoKTsKKwlTdHJpbmdUZW1wbGF0ZSBzdCA9IGdlbi50b0RPVCh0KTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oc3QpOworCisqIENoYW5nZWQgdGhlIHdheSBtYXJrKCkvcmV3aW5kKCkgd29yayBpbiBDb21tb25UcmVlTm9kZSBzdHJlYW0gdG8gbWlycm9yCisgIG1vcmUgZmxleGlibGUgc29sdXRpb24gaW4gQU5UTFJTdHJpbmdTdHJlYW0uICBGb3Jnb3QgdG8gc2V0IGxhc3RNYXJrZXIKKyAgYW55d2F5LiAgTm93IHlvdSBjYW4gcmV3aW5kIHRvIG5vbi1tb3N0LXJlY2VudCBtYXJrZXIuCisKK0RlY2VtYmVyIDEyLCAyMDA2CisKKyogVGVtcCBsZXhlciBub3cgZW5kIGluIC5nbCAoVF9fLmdsLCBmb3IgZXhhbXBsZSkKKworKiBUcmVlUGFyc2VyIHN1ZmZpeCBubyBsb25nZXIgZ2VuZXJhdGVkIGZvciB0cmVlIGdyYW1tYXJzCisKKyogRGVmaW5lZCByZXNldCBmb3IgbGV4ZXIsIHBhcnNlciwgdHJlZSBwYXJzZXI7IHJld2luZHMgdGhlIGlucHV0IHN0cmVhbSBhbHNvCisKK0RlY2VtYmVyIDEwLCAyMDA2CisKKyogTWFkZSBHcmFtbWFyLmFib3J0TkZBVG9ERkFDb252ZXJzaW9uKCkgYWJvcnQgaW4gbWlkZGxlIG9mIGEgREZBLgorCitEZWNlbWJlciA5LCAyMDA2CisKKyogZml4ZWQgYnVnIGluIE9yZGVyZWRIYXNoU2V0LmFkZCgpLiAgSXQgZGlkbid0IHRyYWNrIGVsZW1lbnRzIGNvcnJlY3RseS4KKworRGVjZW1iZXIgNiwgMjAwNgorCisqIHVwZGF0ZWQgYnVpbGQueG1sIGZvciBmdXR1cmUgQW50IGNvbXBhdGliaWxpdHksIHRoYW5rcyB0byBNYXR0IEJlbnNvbi4KKworKiB2YXJpb3VzIHRlc3RzIGluIFRlc3RSZXdyaXRlVGVtcGxhdGUgYW5kIFRlc3RTeW50YWN0aWNQcmVkaWNhdGVFdmFsdWF0aW9uCisgIHdlcmUgdXNpbmcgdGhlIG9sZCAnY2hhbm5lbCcgdnMuIG5ldyAnJGNoYW5uZWwnIG5vdGF0aW9uLgorICBUZXN0SW50ZXJwcmV0ZWRQYXJzaW5nIGRpZG4ndCBwaWNrIHVwIGFuIGVhcmxpZXIgY2hhbmdlIHRvIENvbW1vblRva2VuLgorICBSZXBvcnRlZCBieSBNYXR0IEJlbnNvbi4KKworKiBmaXhlZCBwbGF0Zm9ybSBkZXBlbmRlbnQgdGVzdCBmYWlsdXJlcyBpbiBUZXN0VGVtcGxhdGVzLCBzdXBwbGllZCBieSBNYXR0CisgIEJlbnNvbi4KKworTm92ZW1iZXIgMjksIDIwMDYKKworKiAgb3B0aW1pemVkIHNlbWFudGljIHByZWRpY2F0ZSBldmFsdWF0aW9uIHNvIHRoYXQgcHx8IXAgeWllbGRzIHRydWUuCisKK05vdmVtYmVyIDIyLCAyMDA2CisKKyogZml4ZWQgYnVnIHRoYXQgcHJldmVudGVkIHZhciA9ICRydWxlLnNvbWVfcmV0dmFsIGZyb20gd29ya2luZyBpbiBhbnl0aGluZworICBidXQgdGhlIGZpcnN0IGFsdGVybmF0aXZlIG9mIGEgcnVsZSBvciBzdWJydWxlLgorCisqIGF0dHJpYnV0ZSBuYW1lcyBjb250YWluaW5nIGRpZ2l0cyB3ZXJlIG5vdCBhbGxvd2VkLCB0aGlzIGlzIG5vdyBmaXhlZCwKKyAgYWxsb3dpbmcgYXR0cmlidXRlcyBsaWtlICduYW1lMScgYnV0IG5vdCAnMW5hbWUxJy4KKworTm92ZW1iZXIgMTksIDIwMDYKKworKiBSZW1vdmVkIExlZnRSZWN1cnNpb25NZXNzYWdlIGFuZCBhcHBhcmF0dXMgYmVjYXVzZSBpdCBzZWVtcyB0aGF0IEkgY2hlY2sKKyAgZm9yIGxlZnQgcmVjdXJzaW9uIHVwZnJvbnQgYmVmb3JlIGFuYWx5c2lzIGFuZCBldmVyeXRoaW5nIGdldHMgc3BlY2lmaWVkIGFzCisgIHJlY3Vyc2lvbiBjeWNsZXMgYXQgdGhpcyBwb2ludC4KKworTm92ZW1iZXIgMTYsIDIwMDYKKworKiBUb2tlblJld3JpdGVTdHJlYW0ucmVwbGFjZSB3YXMgbm90IHBhc3NpbmcgcHJvZ3JhbU5hbWUgdG8gbmV4dCBtZXRob2QuCisKK05vdmVtYmVyIDE1LCAyMDA2CisKKyogdXBkYXRlZCBET1QgZmlsZXMgZm9yIERGQSBnZW5lcmF0aW9uIHRvIG1ha2Ugc21hbGxlciBjaXJjbGVzLgorCisqIG1hZGUgZXBzaWxvbiBlZGdlcyBpdGFsaWNzIGluIHRoZSBORkEgZGlhZ3JhbXMuCisKKzMuMGI1IC0gTm92ZW1iZXIgMTUsIDIwMDYKKworVGhlIGJpZ2dlc3QgdGhpbmcgaXMgdGhhdCB5b3VyIGdyYW1tYXIgZmlsZSBuYW1lcyBtdXN0IG1hdGNoIHRoZSBncmFtbWFyIG5hbWUKK2luc2lkZSAoeW91ciBnZW5lcmF0ZWQgY2xhc3MgbmFtZXMgd2lsbCBhbHNvIGJlIGRpZmZlcmVudCkgYW5kIHdlIHVzZQorJGNoYW5uZWw9SElEREVOIG5vdyBpbnN0ZWFkIG9mIGNoYW5uZWw9OTkgaW5zaWRlIGxleGVyIGFjdGlvbnMuCitTaG91bGQgYmUgY29tcGF0aWJsZSBvdGhlciB0aGFuIHRoYXQuICAgUGxlYXNlIGxvb2sgYXQgY29tcGxldGUgbGlzdCBvZgorY2hhbmdlcy4KKworTm92ZW1iZXIgMTQsIDIwMDYKKworKiBGb3JjZSB0b2tlbiBpbmRleCB0byBiZSAtMSBmb3IgQ29tbW9uSW5kZXggaW4gY2FzZSBub3Qgc2V0LgorCitOb3ZlbWJlciAxMSwgMjAwNgorCisqIGdldFVuaXF1ZUlEIGZvciBUcmVlQWRhcHRvciBub3cgdXNlcyBpZGVudGl0eUhhc2hDb2RlIGluc3RlYWQgb2YgaGFzaENvZGUuCisKK05vdmVtYmVyIDEwLCAyMDA2CisKKyogTm8gZ3JhbW1hciBub25kZXRlcm1pbmlzbSB3YXJuaW5nIG5vdyB3aGVuIHdpbGRjYXJkICcuJyBpcyBmaW5hbCBhbHQuCisgIEV4YW1wbGVzOgorCisJYSA6IEEgfCBCIHwgLiA7CisKKwlBIDogJ2EnCisJICB8IC4KKwkgIDsKKworCVNMX0NPTU1FTlQKKwkgICAgOiAnLy8nIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnXHInPyAnXG4nCisJICAgIDsKKworCVNMX0NPTU1FTlQyCisJICAgIDogJy8vJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAneCd8LikqICdccic/ICdcbicKKwkgICAgOworCisKK05vdmVtYmVyIDgsIDIwMDYKKworKiBTeW50YWN0aWMgcHJlZGljYXRlcyBkaWQgbm90IGdldCBob2lzdGluZyBwcm9wZXJseSB1cG9uIG5vbi1MTCgqKSBkZWNpc2lvbi4gIE90aGVyIGhvaXN0aW5nIGlzc3VlcyBmaXhlZC4gIENsZWFuZWQgdXAgY29kZS4KKworKiBSZW1vdmVkIGZhaWxzYWZlIHRoYXQgY2hlY2sgdG8gc2VlIGlmIEknbSBzcGVuZGluZyB0b28gbXVjaCB0aW1lIG9uIGEgc2luZ2xlIERGQTsgSSBkb24ndCB0aGluayB3ZSBuZWVkIGl0IGFueW1vcmUuCisKK05vdmVtYmVyIDMsIDIwMDYKKworKiAkdGV4dCwgJGxpbmUsIGV0Yy4uLiB3ZXJlIG5vdCB3b3JraW5nIGluIGFzc2lnbm1lbnRzLiBGaXhlZCBhbmQgYWRkZWQKKyAgdGVzdCBjYXNlLgorCisqICRsYWJlbC50ZXh0IHRyYW5zbGF0ZWQgdG8gbGFiZWwuZ2V0VGV4dCBpbiBsZXhlciBldmVuIGlmIGxhYmVsIHdhcyBvbiBhIGNoYXIKKworTm92ZW1iZXIgMiwgMjAwNgorCisqIEFkZGVkIGVycm9yIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHdoYXQgdGhlIEFTVCB0eXBlIGlzOyBhY3Rpb25zIGluIHRyZWUKKyAgZ3JhbW1hciB3b24ndCB3b3JrIHdpdGhvdXQgaXQuCisKKyAgJCBjYXQgeC5nCisgIHRyZWUgZ3JhbW1hciB4OworICBhIDogSUQge1N0cmluZyBzID0gJElELnRleHQ7fSA7CisKKyAgQU5UTFIgUGFyc2VyIEdlbmVyYXRvciAgIEVhcmx5IEFjY2VzcyBWZXJzaW9uIDMuMGI1ICg/PywgMjAwNikgIDE5ODktMjAwNgorICBlcnJvcjogeC5nOjA6MDogKDE1MikgdHJlZSBncmFtbWFyIHggaGFzIG5vIEFTVExhYmVsVHlwZSBvcHRpb24KKworTm92ZW1iZXIgMSwgMjAwNgorCisqICR0ZXh0LCAkbGluZSwgZXRjLi4uIHdlcmUgbm90IHdvcmtpbmcgcHJvcGVybHkgd2l0aGluIGxleGVyIHJ1bGUuCisKK09jdG9iZXIgMzIsIDIwMDYKKworKiBGaW5hbGx5IGFjdGlvbnMgbm93IGV4ZWN1dGUgYmVmb3JlIGR5bmFtaWMgc2NvcGVzIGFyZSBwb3BwZWQgaXQgaW4gdGhlCisgIHJ1bGUuIFByZXZpb3VzbHkgd2FzIG5vdCBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIHJ1bGVzIHNjb3BlZCB2YXJpYWJsZXMKKyAgaW4gYSBmaW5hbGx5IGFjdGlvbi4KKworT2N0b2JlciAyOSwgMjAwNgorCisqIEFsdGVyZWQgQWN0aW9uVHJhbnNsYXRvciB0byBlbWl0IGVycm9ycyBvbiBzZXR0aW5nIHJlYWQtb25seSBhdHRyaWJ1dGVzCisgIHN1Y2ggYXMgJHN0YXJ0LCAkc3RvcCwgJHRleHQgaW4gYSBydWxlLiBBbHNvIGZvcmJpZCBzZXR0aW5nIGFueSBhdHRyaWJ1dGVzCisgIGluIHJ1bGVzL3Rva2VucyByZWZlcmVuY2VkIGJ5IGEgbGFiZWwgb3IgbmFtZS4KKyAgU2V0dGluZyBkeW5hbWljIHNjb3BlcydzIGF0dHJpYnV0ZXMgYW5kIHlvdXIgb3duIHBhcmFtZXRlciBhdHRyaWJ1dGVzCisgIGlzIGxlZ2FsLgorCitPY3RvYmVyIDI3LCAyMDA2CisKKyogQWx0ZXJlZCBob3cgQU5UTFIgZmlndXJlcyBvdXQgd2hhdCBkZWNpc2lvbiBpcyBhc3NvY2lhdGVkIHdpdGggd2hpY2gKKyAgYmxvY2sgb2YgZ3JhbW1hci4gIE1ha2VzIEFOVExSV29ya3MgY29ycmVjdGx5IGZpbmQgREZBIGZvciBhIGJsb2NrLgorCitPY3RvYmVyIDI2LCAyMDA2CisKKyogRml4ZWQgYnVnIHdoZXJlIEVPVCB0cmFuc2l0aW9ucyBsZWQgdG8gbm8gTkZBIGNvbmZpZ3MgaW4gYSBERkEgc3RhdGUsCisgIHlpZWxkaW5nIGFuIGVycm9yIGluIERGQSB0YWJsZSBnZW5lcmF0aW9uLgorCisqIHJlbmFtZWQgYWN0aW9uLmcgdG8gQWN0aW9uVHJhbnNsYXRvci5nCisgIHRoZSBBY3Rpb25UcmFuc2xhdG9yIGNsYXNzIGlzIG5vdyBjYWxsZWQgQWN0aW9uVHJhbnNsYXRvckxleGVyLCBhcyBBTlRMUgorICBnZW5lcmF0ZXMgdGhpcyBjbGFzc25hbWUgbm93LiBGaXhlZCByZXN0IG9mIGNvZGViYXNlIGFjY29yZGluZ2x5LgorCisqIGFkZGVkIHJ1bGVzIHJlY29nbml6aW5nIHNldHRpbmcgb2Ygc2NvcGVzJyBhdHRyaWJ1dGVzIHRvIEFjdGlvblRyYW5zbGF0b3IuZworICB0aGUgT2JqZWN0aXZlIEMgdGFyZ2V0IG5lZWRlZCBhY2Nlc3MgdG8gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudAorICBpbiBvcmRlciB0byBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUKKworKiBjaGFuZ2VkIEFOVExSQ29yZS5zdGkgdG8gcmVmbGVjdCB0aGUgbmV3IG1hbmRhdG9yeSB0ZW1wbGF0ZXMgdG8gc3VwcG9ydCB0aGUgYWJvdmUKKyAgbmFtZWx5OiBzY29wZVNldEF0dHJpYnV0ZVJlZiwgcmV0dXJuU2V0QXR0cmlidXRlUmVmIGFuZCB0aGUgcnVsZVNldFByb3BlcnR5UmVmXyoKKyAgdGVtcGxhdGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgcnVsZVNldFByb3BlcnR5UmVmX3RleHQuIHdlIGNhbm5vdCBzZXQgdGhpcyBhdHRyaWJ1dGUKKworT2N0b2JlciAxOSwgMjAwNgorCisqIEZpeGVkIDIgYnVncyBpbiBERkEgY29udmVyc2lvbiB0aGF0IGNhdXNlZCBleGNlcHRpb25zLgorICBhbHRlcmVkIGZ1bmN0aW9uYWxpdHkgb2YgZ2V0TWluRWxlbWVudCBzbyBpdCBpZ25vcmVzIGVsZW1lbnRzPDAuCisKK09jdG9iZXIgMTgsIDIwMDYKKworKiBtb3ZlZCByZXNldFN0YXRlTnVtYmVyc1RvQmVDb250aWd1b3VzKCkgdG8gYWZ0ZXIgaXNzdWluZyBvZiB3YXJuaW5nczsKKyAgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhhdCByb3V0aW5lIHNob3VsZCBtYWtlIG1vcmUgc2Vuc2UgYXMgaXNzdWVzCisgIHdpdGggZGVjaXNpb24gd2lsbCBhcHBlYXIgZmlyc3QuCisKKyogZml4ZWQgY3V0L3Bhc3RlIGJ1ZyBJIGludHJvZHVjZWQgd2hlbiBmaXhlZCBFT0YgaW4gbWluL21heAorICBidWcuIFByZXZlbnRlZCBDIGdyYW1tYXIgZnJvbSB3b3JraW5nIGJyaWVmbHkuCisKK09jdG9iZXIgMTcsIDIwMDYKKworKiBSZW1vdmVkIGEgZmFpbHNhZmUgdGhhdCBzZWVtcyB0byBiZSB1bm5lY2Vzc2FyeSB0aGF0IGVuc3VyZSBERkEgZGlkbid0CisgIGdldCB0b28gYmlnLiAgSXQgd2FzIHJlc3VsdGluZyBpbiBzb21lIGZhaWx1cmVzIGluIGNvZGUgZ2VuZXJhdGlvbiB0aGF0CisgIGxlZCBtZSBvbiBxdWl0ZSBhIHN0cmFuZ2UgZGVidWdnaW5nIHRyaXAuCisKK09jdG9iZXIgMTYsIDIwMDYKKworKiBVc2UgY2hhbm5lbD1ISURERU4gbm90IGNoYW5uZWw9OTkgdG8gcHV0IHRva2VucyBvbiBoaWRkZW4gY2hhbm5lbC4KKworT2N0b2JlciAxMiwgMjAwNgorCisqIEFOVExSIG5vdyBoYXMgYSBjdXN0b21pemFibGUgbWVzc2FnZSBmb3JtYXQgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MsCisgIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGZ1bGZpbGwgcmVxdWlyZW1lbnRzIGJ5IElERXMgYW5kIHN1Y2guCisgIFRoZSBmb3JtYXQgdG8gYmUgdXNlZCBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgJy1tZXNzYWdlLWZvcm1hdCBuYW1lJworICBjb21tYW5kIGxpbmUgc3dpdGNoLiBUaGUgZGVmYXVsdCBmb3IgbmFtZSBpcyAnYW50bHInLCBhbHNvIGF2YWlsYWJsZQorICBhdCB0aGUgbW9tZW50IGlzICdnbnUnLiBUaGlzIGlzIGRvbmUgdmlhIFN0cmluZ1RlbXBsYXRlLCBmb3IgZGV0YWlscworICBvbiB0aGUgcmVxdWlyZW1lbnRzIGxvb2sgaW4gb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL21lc3NhZ2VzL2Zvcm1hdHMvCisKKyogbGluZSBudW1iZXJzIGZvciBsZXhlcnMgaW4gY29tYmluZWQgZ3JhbW1hcnMgYXJlIG5vdyByZXBvcnRlZCBjb3JyZWN0bHkuCisKK1NlcHRlbWJlciAyOSwgMjAwNgorCisqIEFOVExSUmVhZGVyU3RyZWFtIGltcHJvcGVybHkgY2hlY2tlZCBmb3IgZW5kIG9mIGlucHV0LgorCitTZXB0ZW1iZXIgMjgsIDIwMDYKKworKiBGb3IgQU5UTFJTdHJpbmdTdHJlYW0sIExBKC0xKSB3YXMgb2ZmIGJ5IG9uZS4uLmdhdmUgeW91IExBKC0yKS4KKworMy4wYjQgLSBBdWd1c3QgMjQsIDIwMDYKKworKiBlcnJvciB3aGVuIG5vIHJ1bGVzIGluIGdyYW1tYXIuICBkb2Vzbid0IGNyYXNoIG5vdy4KKworKiBUb2tlbiBpcyBub3cgYW4gaW50ZXJmYWNlLgorCisqIHJlbW92ZSBkZXBlbmRlbmNlIG9uIG5vbiBydW50aW1lIGNsYXNzZXMgaW4gcnVudGltZSBwYWNrYWdlLgorCisqIGZpbGVuYW1lIGFuZCBncmFtbWFyIG5hbWUgbXVzdCBiZSBzYW1lIEZvbyBpbiBGb28uZy4gIEdlbmVyYXRlcyBGb29QYXJzZXIsCisgIEZvb0xleGVyLCAuLi4gIENvbWJpbmVkIGdyYW1tYXIgRm9vIGdlbmVyYXRlcyBGb28kTGV4ZXIuZyB3aGljaCBnZW5lcmF0ZXMKKyAgRm9vTGV4ZXIuamF2YS4gIHRyZWUgZ3JhbW1hcnMgZ2VuZXJhdGUgRm9vVHJlZVBhcnNlci5qYXZhCisKK0F1Z3VzdCAyNCwgMjAwNgorCisqIGFkZGVkIEMjIHRhcmdldCB0byBsaWIsIGNvZGVnZW4sIHRlbXBsYXRlcworCitBdWd1c3QgMTEsIDIwMDYKKworKiBhZGRlZCB0cmVlIGFyZyB0byBuYXZpZ2F0aW9uIG1ldGhvZHMgaW4gdHJlZWFkYXB0b3IKKworQXVndXN0IDA3LCAyMDA2CisKKyogZml4ZWQgYnVnIHJlbGF0ZWQgdG8gKGF8KSsgb24gZW5kIG9mIGxleGVyIHJ1bGVzLiAgY3Jhc2hlZCBpbnN0ZWFkCisgIG9mIHdhcm5pbmcuCisKKyogYWRkZWQgd2FybmluZyB0aGF0IGludGVycHJldGVyIGRvZXNuJ3QgZG8gc3lucHJlZHMgeWV0CisKKyogYWxsb3cgZGlmZmVyZW50IHNvdXJjZSBvZiBjbGFzc2xvYWRlcjoKK0NsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKK2lmICggY2w9PW51bGwgKSB7CisgICAgY2wgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKK30KKworCitKdWx5IDI2LCAyMDA2CisKKyogY29tcHJlc3NlZCBERkEgZWRnZSB0YWJsZXMgc2lnbmlmaWNhbnRseS4gIEFsbCBlZGdlIHRhYmxlcyBhcmUKKyAgdW5pcXVlLiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBjYW4gcmV1c2UgYXJyYXlzLiAgTG9vayBsaWtlIHRoaXMgbm93OgorCisgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREZBMzBfdHJhbnNpdGlvbjAgPQorICAgICAJbmV3IHNob3J0W10geyA0NiwgNDYsIC0xLCA0NiwgNDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLC4uLn07CisgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERGQTMwX3RyYW5zaXRpb24xID0KKyAgICAgCW5ldyBzaG9ydFtdIHsgMjEgfTsKKyAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXVtdIERGQTMwX3RyYW5zaXRpb24gPSB7CisgICAgIAkgIERGQTMwX3RyYW5zaXRpb24wLAorICAgICAJICBERkEzMF90cmFuc2l0aW9uMCwKKyAgICAgCSAgREZBMzBfdHJhbnNpdGlvbjEsCisgICAgIAkgIC4uLgorICAgICAgfTsKKworKiBJZiB5b3UgZGVmaW5lZCBib3RoIGEgbGFiZWwgbGlrZSBFUSBhbmQgJz0nLCBzb21ldGltZXMgdGhlICc9JyB3YXMKKyAgdXNlZCBpbnN0ZWFkIG9mIHRoZSBFUSBsYWJlbC4KKworKiBtYWRlIGhlYWRlckZpbGUgdGVtcGxhdGUgaGF2ZSBzYW1lIGFyZyBsaXN0IGFzIG91dHB1dEZpbGUgZm9yIGNvbnNpc3RlbmN5CisKKyogb3V0cHV0RmlsZSwgbGV4ZXIsIGdlbmVyaWNQYXJzZXIsIHBhcnNlciwgdHJlZVBhcnNlciB0ZW1wbGF0ZXMKKyAgcmVmZXJlbmNlIGN5Y2xpY0RGQXMgYXR0cmlidXRlIHdoaWNoIHdhcyBubyBsb25nZXIgdXNlZCBhZnRlciBJCisgIHN0YXJ0ZWQgdGhlIG5ldyB0YWJsZS1iYXNlZCBERkEuICBJIG1hZGUgY3ljbGljREZBRGVzY3JpcHRvcnMKKyAgYXJndW1lbnQgdG8gb3V0cHV0RmlsZSBhbmQgaGVhZGVyRmlsZSAob25seSkuICBJIHRoaW5rIHRoaXMgaXMKKyAgY29ycmVjdCBhcyBvbmx5IE9PIGxhbmd1YWdlcyB3aWxsIHdhbnQgdGhlIERGQSBpbiB0aGUgcmVjb2duaXplci4KKyAgQXQgdGhlIHRvcCBsZXZlbCwgQyBhbmQgZnJpZW5kcyBjYW4gdXNlIGl0LiAgQ2hhbmdlZCBuYW1lIHRvIHVzZQorICBjeWNsaWNERkFzIGFnYWluIGFzIGl0J3MgYSBiZXR0ZXIgbmFtZSBwcm9iYWJseS4gIFJlbW92ZWQgcGFyYW1ldGVyCisgIGZyb20gdGhlIGxleGVyLCAuLi4gIEZvciBleGFtcGxlLCBteSBwYXJzZXIgdGVtcGxhdGUgc2F5cyB0aGlzIG5vdzoKKworICAgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCisqIG1hZGUgYWxsIHRva2VuIHJlZiB0b2tlbiB0eXBlcyBnbyB0aHJ1IGNvZGUgZ2VuJ3MKKyAgZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbCgpCisKKyogbm8gbW9yZSBjb21wdXRpbmcgREZBIHRyYW5zaXRpb24gdGFibGVzIGZvciBhY3ljbGljIERGQS4KKworSnVseSAyNSwgMjAwNgorCisqIGZpeGVkIGEgcGxhY2Ugd2hlcmUgSSB3YXMgYWRkaW5nIHN5biBwcmVkaWNhdGVzIGludG8gcmV3cml0ZSBzdHVmZi4KKworKiB0dXJuZWQgb2ZmIGludmFsaWQgdG9rZW4gaW5kZXggd2FybmluZyBpbiBBVyBzdXBwb3J0OyBoYWQgYSBwcm9ibGVtLgorCisqIGJhZCBsb2NhdGlvbiBldmVudCBnZW5lcmF0ZWQgd2l0aCAtZGVidWcgZm9yIHN5bnByZWRzIGluIGF1dG9iYWNrdHJhY2sgbW9kZS4KKworSnVseSAyNCwgMjAwNgorCisqIGNoYW5nZWQgcnVudGltZS5ERkEgc28gdGhhdCBpdCB0cmVhdHMgYWxsIGNoYXJzIGFuZCB0b2tlbiB0eXBlcyBhcworICBjaGFyICh1bnNpZ25lZCAxNiBiaXQgaW50KS4gIC0xIGJlY29tZXMgJ1x1RkZGRicgdGhlbiBvciA2NTUzNS4KKworKiBjaGFuZ2VkIE1BWF9TVEFURV9UUkFOU0lUSU9OU19GT1JfVEFCTEUgdG8gYmUgNjU1MzQgYnkgZGVmYXVsdAorICBub3cuIFRoaXMgbWVhbnMgdGhhdCBhbGwgc3RhdGVzIGNhbiB1c2UgYSB0YWJsZSB0byBkbyB0cmFuc2l0aW9ucy4KKworKiB3YXMgbm90IG1ha2luZyBzeW5wcmVkcyBvbiAoQykqIHR5cGUgbG9vcHMgd2l0aCBiYWNrdHJhY2s9dHJ1ZQorCisqIHdhcyBjb3B5aW5nIHRyZWUgc3R1ZmYgYW5kIGFjdGlvbnMgaW50byBzeW5wcmVkcyB3aXRoIGJhY2t0cmFjaz10cnVlCisKKyogd2FzIG1ha2luZyBzeW5wcmVkcyBvbiBldmVuIHNpbmdsZSBhbHQgcnVsZXMgLyBibG9ja3Mgd2l0aCBiYWNrdHJhY2s9dHJ1ZQorCiszLjBiMyAtIEp1bHkgMjEsIDIwMDYKKworKiBBTlRMUiBmYWlscyB0byBhbmFseXplIGNvbXBsZXggZGVjaXNpb25zIG11Y2ggbGVzcyBmcmVxdWVudGx5LiAgSXQKKyAgdHVybnMgb3V0IHRoYXQgdGhlIHNldCBvZiBkZWNpc2lvbnMgZm9yIHdoaWNoIEFOVExSIGZhaWxzICh0aW1lcworICBvdXQpIGlzIHRoZSBzYW1lIHNldCAoc28gZmFyKSBvZiBub24tTEwoKikgZGVjaXNpb25zLiAgTW9yZXZlciwgSSdtCisgIGFibGUgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uIHF1aWNrbHkgYW5kIHJlcG9ydCByYXRoZXIgdGhhbiB0aW1pbmcKKyAgb3V0LiBFcnJvcnMgbG9vayBsaWtlOgorCisgIGphdmEuZzo0Njg6MjM6IFtmYXRhbF0gcnVsZSBjb25jcmV0ZURpbWVuc2lvbnMgaGFzIG5vbi1MTCgqKQorICAgIGRlY2lzaW9uIGR1ZSB0byByZWN1cnNpdmUgcnVsZSBpbnZvY2F0aW9ucyBpbiBhbHRzIDEsMi4gIFJlc29sdmUKKyAgICBieSBsZWZ0LWZhY3RvcmluZyBvciB1c2luZyBzeW50YWN0aWMgcHJlZGljYXRlcyB3aXRoIGZpeGVkIGsKKyAgICBsb29rYWhlYWQgb3IgdXNlIGJhY2t0cmFjaz10cnVlIG9wdGlvbi4KKworICBUaGlzIG1lc3NhZ2Ugb25seSBhcHBlYXJzIHdoZW4gaz0qLgorCisqIFNob3J0ZW5lZCBubyB2aWFibGUgYWx0IG1lc3NhZ2VzIHRvIG5vdCBpbmNsdWRlIGRlY2lzaW9uCisgIGRlc2NyaXB0aW9uOgorCitbY29tcGlsYXRpb25Vbml0LCBkZWNsYXJhdGlvbl06IGxpbmUgODo4IGRlY2lzaW9uPTw8Njc6MTogZGVjbGFyYXRpb24KKzogKCAoIGZpZWxkRGVjbGFyYXRpb24gKT0+IGZpZWxkRGVjbGFyYXRpb24gfCAoIG1ldGhvZERlY2xhcmF0aW9uICk9PgorbWV0aG9kRGVjbGFyYXRpb24gfCAoIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gKT0+Citjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgKCBjbGFzc0RlY2xhcmF0aW9uICk9PiBjbGFzc0RlY2xhcmF0aW9uIHwgKAoraW50ZXJmYWNlRGVjbGFyYXRpb24gKT0+IGludGVyZmFjZURlY2xhcmF0aW9uIHwgKCBibG9ja0RlY2xhcmF0aW9uICk9PgorYmxvY2tEZWNsYXJhdGlvbiB8IGVtcHR5RGVjbGFyYXRpb24gKTs+PiBzdGF0ZSAzIChkZWNpc2lvbj0xNCkgbm8KK3ZpYWJsZSBhbHQ7IHRva2VuPVtAMSwxODQ6MTg3PSdqYXZhJyw8MTIyPiw4OjhdCisKKyAgdG9vIGxvbmcgYW5kIGhhcmQgdG8gcmVhZC4KKworSnVseSAxOSwgMjAwNgorCisqIENvZGUgZ2VuIGJ1Zzogc3RhdGVzIHdpdGggbm8gZW1hbmF0aW5nIGVkZ2VzIHdlcmUgaWdub3JlZCBieSBTVC4KKyAgTm93IGFuIGVtcHR5IGxpc3QgaXMgdXNlZC4KKworKiBBZGRlZCBncmFtbWFyIHBhcmFtZXRlciB0byByZWNvZ25pemVyIHRlbXBsYXRlcyBzbyB0aGV5IGNhbiBhY2Nlc3MKKyAgcHJvcGVydGllcyBsaWtlIGdldE5hbWUoKSwgLi4uCisKK0p1bHkgMTAsIDIwMDYKKworKiBGaXhlZCB0aGUgZ2F0ZWQgcHJlZCBtZXJnZWQgc3RhdGUgYnVnLiAgQWRkZWQgdW5pdCB0ZXN0LgorCisqIGFkZGVkIG5ldyBtZXRob2QgdG8gVGFyZ2V0OiBnZXRUb2tlblR5cGVBc1RhcmdldExhYmVsKCkKKworSnVseSA3LCAyMDA2CisKKyogSSB3YXMgZG9pbmcgYW4gQU5EIGluc3RlYWQgb2YgT1IgaW4gdGhlIGdhdGVkIHByZWRpY2F0ZSBzdHVmZi4KKyAgVGhhbmtzIHRvIFN0ZXBoZW4gS291IQorCisqIFJlZHVjZSBvcCBmb3IgY29tYmluaW5nIHByZWRpY2F0ZXMgd2FzIGluc2FuZWx5IHNsb3cgc29tZXRpbWVzIGFuZAorICBkaWRuJ3QgYWN0dWFsbHkgd29yayB3ZWxsLiAgTm93IGl0J3MgZmFzdCBhbmQgd29ya3MuCisKKyogVGhlcmUgaXMgYSBidWcgaW4gbWVyZ2luZyBvZiBERkEgc3RvcCBzdGF0ZXMgcmVsYXRlZCB0byBnYXRlZAorICBwcmVkcy4uLnR1cm5lZCBpdCBvZmYgZm9yIG5vdy4KKworMy4wYjIgLSBKdWx5IDUsIDIwMDYKKworSnVseSA1LCAyMDA2CisKKyogdG9rZW4gZW1pc3Npb24gbm90IHByb3Blcmx5IHByb3RlY3RlZCBpbiBsZXhlciBmaWx0ZXIgbW9kZS4KKworKiBFT1QsIEVPVCBERkEgc3RhdGUgdHJhbnNpdGlvbiB0YWJsZXMgc2hvdWxkIGJlIGluaXQnZCB0byAtMSAob25seQorICB3YXMgZG9pbmcgdGhpcyBmb3IgY29tcHJlc3NlZCB0YWJsZXMpLiAgRml4ZWQuCisKKyogaW4gdHJhY2UgbW9kZSwgZXhpdCBtZXRob2Qgbm90IHNob3duIGZvciBtZW1vaXplZCBydWxlcworCisqIGFkZGVkIC1YbWF4ZGZhZWRnZXMgdG8gYWxsb3cgeW91IHRvIGluY3JlYXNlIG51bWJlciBvZiBlZGdlcyBhbGxvd2VkCisgIGZvciBhIHNpbmdsZSBERkEgc3RhdGUgYmVmb3JlIGl0IGJlY29tZXMgInNwZWNpYWwiIGFuZCBjYW4ndCBmaXQgaW4KKyAgYSBzaW1wbGUgdGFibGUuCisKKyogQnVnIGluIHRhYmxlcy4gIFNob3J0IGFyZSBzaWduZWQgc28gbWluL21heCB0YWJsZXMgZm9yIERGQSBhcmUgbm93CisgIGNoYXJbXS4gIEJpemFycmUuCisKK0p1bHkgMywgMjAwNgorCisqIEFkZGVkIGEgbWV0aG9kIHRvIHJlc2V0IHRoZSB0b29sIGVycm9yIHN0YXRlIGZvciBjdXJyZW50IHRocmVhZC4KKyAgU2VlIEVycm9yTWFuYWdlci5qYXZhCisKKyogW0dvdCB0aGlzIHdvcmtpbmcgcHJvcGVybHkgdG9kYXldIGJhY2t0cmFjayBtb2RlIHRoYXQgbGV0J3MgeW91IHR5cGUKKyAgaW4gYW55IG9sZCBjcmFwIGFuZCBBTlRMUiB3aWxsIGJhY2t0cmFjayBpZiBpdCBjYW4ndCBmaWd1cmUgb3V0IHdoYXQKKyAgeW91IG1lYW50LiAgTm8gZXJyb3JzIGFyZSByZXBvcnRlZCBieSBhbnRsciBkdXJpbmcgYW5hbHlzaXMuICBJdAorICBpbXBsaWNpdGx5IGFkZHMgYSBzeW4gcHJlZCBpbiBmcm9udCBvZiBldmVyeSBwcm9kdWN0aW9uLCB1c2luZyB0aGVtCisgIG9ubHkgaWYgc3RhdGljIGdyYW1tYXIgTEwoKikgYW5hbHlzaXMgZmFpbHMuICBTeW4gcHJlZCBjb2RlIGlzIG5vdAorICBnZW5lcmF0ZWQgaWYgdGhlIHByZWQgaXMgbm90IHVzZWQgaW4gYSBkZWNpc2lvbi4KKworICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgcmFwaWQgcHJvdG90eXBpbmcgbW9kZS4KKworKiBBZGRlZCBiYWNrdHJhY2tpbmcgcmVwb3J0IHRvIHRoZSAtcmVwb3J0IG9wdGlvbgorCisqIEFkZGVkIE5GQS0+REZBIGNvbnZlcnNpb24gZWFybHkgdGVybWluYXRpb24gcmVwb3J0IHRvIHRoZSAtcmVwb3J0IG9wdGlvbgorCisqIEFkZGVkIGdyYW1tYXIgbGV2ZWwgayBhbmQgYmFja3RyYWNrIG9wdGlvbnMgdG8gLXJlcG9ydAorCisqIEFkZGVkIGEgZG96ZW4gdW5pdCB0ZXN0cyB0byB0ZXN0IGF1dG9iYWNrdHJhY2sgTkZBIGNvbnN0cnVjdGlvbi4KKworKiBJZiB5b3UgYXJlIHVzaW5nIGZpbHRlciBtb2RlLCB5b3UgbXVzdCBtYW51YWxseSB1c2Ugb3B0aW9uCisgIG1lbW9pemU9dHJ1ZSBub3cuCisKK0p1bHkgMiwgMjAwNgorCisqIEFkZGVkIGs9KiBvcHRpb24gc28geW91IGNhbiBzZXQgaz0yLCBmb3IgZXhhbXBsZSwgb24gd2hvbGUgZ3JhbW1hciwKKyAgYnV0IGFuIGluZGl2aWR1YWwgZGVjaXNpb24gY2FuIGJlIExMKCopLgorCisqIG1lbW9pemUgb3B0aW9uIGZvciBncmFtbWFycywgcnVsZXMsIGJsb2Nrcy4gIFJlbW92ZSAtbm9tZW1vIGNtZC1saW5lIG9wdGlvbgorCisqIGJ1dCBpbiBET1QgZ2VuZXJhdG9yIGZvciBERkE7IGZpeGVkLgorCisqIHJ1bnRpbWUuREZBIHJlcG9ydGVkIGVycm9ycyBldmVuIHdoZW4gYmFja3RyYWNraW5nCisKK0p1bHkgMSwgMjAwNgorCisqIEFkZGVkIC1YIG9wdGlvbiBsaXN0IHRvIGhlbHAKKworKiBTeW4gcHJlZHMgd2VyZSBiZWluZyBob2lzdGVkIGludG8gb3RoZXIgcnVsZXMsIGNhdXNpbmcgbG90cyBvZiBleHRyYQorICBiYWNrdHJhY2tpbmcuCisKK0p1bmUgMjksIDIwMDYKKworKiB1bm5lY2Vzc2FyeSBmaWxlcyByZW1vdmVkIGR1cmluZyBidWlsZC4KKworKiBNYXR0IEJlbnNvbiB1cGRhdGVkIGJ1aWxkLnhtbAorCisqIERldGVjdGluZyB1c2Ugb2Ygc3lucHJlZHMgaW4gYW5hbHlzaXMgbm93IGluc3RlYWQgb2YgY29kZWdlbi4gIEluCisgIHRoaXMgd2F5LCBJIGNhbiBhdm9pZCBhbmFseXppbmcgZGVjaXNpb25zIGluIHN5bnByZWRzIGZvciBzeW5wcmVkcworICBub3QgdXNlZCBpbiBhIERGQSBmb3IgYSByZWFsIHJ1bGUuICBUaGlzIGlzIHVzZWQgdG8gb3B0aW1pemUgdGhpbmdzCisgIGZvciBiYWNrdHJhY2sgb3B0aW9uLgorCisqIENvZGUgZ2VuIG11c3QgYWRkIF9mcmFnbWVudCBvciB3aGF0ZXZlciB0byBlbmQgb2YgcHJlZCBuYW1lIGluCisgIHRlbXBsYXRlIHN5bnByZWRSdWxlIHRvIGF2b2lkIGhhdmluZyBBTlRMUiBrbm93IGFueXRoaW5nIGFib3V0CisgIG1ldGhvZCBuYW1lcy4KKworKiBBZGRlZCAtSWRiZ1NUIG9wdGlvbiB0byBlbWl0IFNUIGRlbGltaXRlcnMgYXQgc3RhcnQvc3RvcCBvZiBhbGwKKyAgdGVtcGxhdGVzIHNwaXQgb3V0LgorCitKdW5lIDI4LCAyMDA2CisKKyogVHdlYWtlZCBtZXNzYWdlIHdoZW4gQU5UTFIgY2Fubm90IGhhbmRsZSBhbmFseXNpcy4KKworMy4wYjEgLSBKdW5lIDI3LCAyMDA2CisKK0p1bmUgMjQsIDIwMDYKKworKiBzeW4gcHJlZHMgbm8gbG9uZ2VyIGdlbmVyYXRlIGxpdHRsZSBzdGF0aWMgY2xhc3NlczsgdGhleSBhbHNvIGRvbid0CisgIGdlbmVyYXRlIGEgd2hvbGUgYnVuY2ggb2YgZXh0cmEgY3JhcCBpbiB0aGUgcnVsZXMgYnVpbHQgdG8gdGVzdCBzeW4KKyAgcHJlZHMuICBSZW1vdmVkIEdyYW1tYXJGcmFnbWVudFBvaW50ZXIgY2xhc3MgZnJvbSBydW50aW1lLgorCitKdW5lIDIzLTI0LCAyMDA2CisKKyogYWRkZWQgb3V0cHV0IG9wdGlvbiB0byAtcmVwb3J0IG91dHB1dC4KKworKiBhZGRlZCBwcm9maWxpbmcgaW5mbzoKKyAgTnVtYmVyIG9mIHJ1bGUgaW52b2NhdGlvbnMgaW4gImd1ZXNzaW5nIiBtb2RlCisgIG51bWJlciBvZiBydWxlIG1lbW9pemF0aW9uIGNhY2hlIGhpdHMKKyAgbnVtYmVyIG9mIHJ1bGUgbWVtb2l6YXRpb24gY2FjaGUgbWlzc2VzCisKKyogbWFkZSBERkEgRE9UIGRpYWdyYW1zIGdvIGxlZnQgdG8gcmlnaHQgbm90IHRvcCB0byBib3R0b20KKworKiBJIHRyeSB0byByZWN1cnNpdmUgb3ZlcmZsb3cgc3RhdGVzIG5vdyBieSByZXNvbHZpbmcgdGhlc2Ugc3RhdGVzCisgIHdpdGggc2VtYW50aWMvc3ludGFjdGljIHByZWRpY2F0ZXMgaWYgdGhleSBleGlzdC4gIFRoZSBERkEgaXMgdGhlbgorICBkZXRlcm1pbmlzdGljIHJhdGhlciB0aGFuIHNpbXBseSByZXNvbHZpbmcgYnkgY2hvb3NpbmcgZmlyc3QKKyAgbm9uZGV0ZXJtaW5pc3RpYyBhbHQuICBJIHVzZWQgdG8gZ2VuZXJhdGVkIGVycm9yczoKKworfi90bXAgJCBqYXZhIG9yZy5hbnRsci5Ub29sIC1kZmEgdC5nCitBTlRMUiBQYXJzZXIgR2VuZXJhdG9yICAgRWFybHkgQWNjZXNzIFZlcnNpb24gMy4wYjIgKEp1bHkgNSwgMjAwNikgIDE5ODktMjAwNgordC5nOjI6NTogQWx0ZXJuYXRpdmUgMTogYWZ0ZXIgbWF0Y2hpbmcgaW5wdXQgc3VjaCBhcyBBIEEgQSBBIEEgZGVjaXNpb24gY2Fubm90IHByZWRpY3Qgd2hhdCBjb21lcyBuZXh0IGR1ZSB0byByZWN1cnNpb24gb3ZlcmZsb3cgdG8gYiBmcm9tIGIKK3QuZzoyOjU6IEFsdGVybmF0aXZlIDI6IGFmdGVyIG1hdGNoaW5nIGlucHV0IHN1Y2ggYXMgQSBBIEEgQSBBIGRlY2lzaW9uIGNhbm5vdCBwcmVkaWN0IHdoYXQgY29tZXMgbmV4dCBkdWUgdG8gcmVjdXJzaW9uIG92ZXJmbG93IHRvIGIgZnJvbSBiCisKKyAgTm93LCBJIHVzZXMgcHJlZGljYXRlcyBpZiBhdmFpbGFibGUgYW5kIGVtaXRzIG5vIHdhcm5pbmdzLgorCisqIG1hZGUgc2VtIHByZWRzIHNoYXJlIGFjY2VwdCBzdGF0ZXMuICBQcmV2aW91c2x5LCBtdWx0aXBsZSBwcmVkcyBpbiBhCitkZWNpc2lvbiBmb3JrZWQgbmV3IGFjY2VwdHMgZWFjaCB0aW1lIGZvciBlYWNoIG5vbmRldCBzdGF0ZS4KKworSnVuZSAxOSwgMjAwNgorCisqIE5lZWQgcGFyZW5zIGFyb3VuZCB0aGUgcHJlZGljdGlvbiBleHByZXNzaW9ucyBpbiB0ZW1wbGF0ZXMuCisKKyogUmVmZXJlbmNpbmcgJElELnRleHQgaW4gYW4gYWN0aW9uIGZvcmNlZCBiYWQgY29kZSBnZW4gaW4gbGV4ZXIgcnVsZSBJRC4KKworKiBGaXhlZCBhIGJ1ZyBpbiBob3cgcHJlZGljYXRlcyBhcmUgY29sbGVjdGVkLiAgVGhlIGRlZmluaXRpb24gb2YKKyAgImxhc3QgcHJlZGljYXRlZCBhbHRlcm5hdGl2ZSIgd2FzIGluY29ycmVjdCBpbiB0aGUgYW5hbHlzaXMuICBGdXJ0aGVyLAorICBnYXRlZCBwcmVkaWNhdGVzIGluY29ycmVjdGx5IG1pc3NlZCBhIGNhc2Ugd2hlcmUgYW4gZWRnZSBzaG91bGQgYmVjb21lCisgIHRydWUgKGEgdGF1dG9sb2d5KS4KKworKiBSZW1vdmVkIGFuIHVubmVjZXNzYXJ5IGlucHV0LmNvbnN1bWUoKSByZWZlcmVuY2UgaW4gdGhlIHJ1bnRpbWUvREZBIGNsYXNzLgorCitKdW5lIDE0LCAyMDA2CisKKyogLT4gKCRydWxlbGFiZWwpPyBkaWRuJ3QgZ2VuZXJhdGUgcHJvcGVyIGNvZGUgZm9yIEFTVHMuCisKKyogYnVnIGluIGNvZGUgZ2VuIChkaWQgbm90IGNvbXBpbGUpCithIDogSUQgLT4gSUQKKyAgfCBJRCAtPiBJRAorICA7CitQcm9ibGVtIGlzIHJlcGVhdGVkIHJlZiB0byBJRCBmcm9tIGxlZnQgc2lkZS4gIEp1ZXJnZW4gcG9pbnRlZCB0aGlzIG91dC4KKworKiB1c2Ugb2YgdG9rZW5Wb2NhYiB3aXRoIG1pc3NpbmcgZmlsZSB5aWVsZGVkIGV4Y2VwdGlvbgorCisqIChBfEIpPT4gZm9vIHlpZWxkZWQgYW4gZXhjZXB0aW9uIGFzIChBfEIpIGlzIGEgc2V0IG5vdCBhIGJsb2NrLiBGaXhlZC4KKworKiBEaWRuJ3Qgc2V0IElEMT0gYW5kIElOVDE9IGZvciB0aGlzIGFsdDoKKyAgfCBeKElEIElOVCsge1N5c3RlbS5vdXQucHJpbnQoXCJeKFwiKyRJRCtcIiBcIiskSU5UK1wiKVwiKTt9KQorCisqIEZpeGVkIHNvIHJlcGVhdGVkIGRhbmdsaW5nIHN0YXRlIGVycm9ycyBvbmx5IG9jY3VyIG9uY2UgbGlrZToKK3QuZzo0OjE3OiB0aGUgZGVjaXNpb24gY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYWx0ZXJuYXRpdmUocykgMiwxIGZvciBhdCBsZWFzdCBvbmUgaW5wdXQgc2VxdWVuY2UKKworKiB0cmFja2luZyBvZiBydWxlIGVsZW1lbnRzIHdhcyBvbiAobWFraW5nIGxpc3QgZGVmcyBhdCBzdGFydCBvZgorICBtZXRob2QpIHdpdGggdGVtcGxhdGVzIGluc3RlYWQgb2YganVzdCB3aXRoIEFTVHMuICBUdXJuZWQgb2ZmLgorCisqIERvZXNuJ3QgY3Jhc2ggd2hlbiB5b3UgZ2l2ZSBpdCBhIG1pc3NpbmcgZmlsZSBub3cuCisKKyogLXJlcG9ydDogYWRkIG91dHB1dCBpbmZvOiBob3cgbWFueSBMTCgxKSBkZWNpc2lvbnMuCisKK0p1bmUgMTMsIDIwMDYKKworKiBeKFJPT1QgSUQ/KSBEaWRuJ3Qgd29yazsgbm9yIGRpZCBhbnkgb3RoZXIgbnVsbGFibGUgY2hpbGQgbGlzdCBzdWNoIGFzCisgIF4oUk9PVCBJRCogSU5UPykuICBOb3csIEkgY2hlY2sgdG8gc2VlIGlmIGNoaWxkIGxpc3QgaXMgbnVsbGFibGUgdXNpbmcKKyAgR3JhbW1hci5MT09LKCkgYW5kLCBpZiBzbywgSSBnZW5lcmF0ZSBhbiAiSUYgbG9va2FoZWFkIGlzIERPV04iIGdhdGUKKyAgYXJvdW5kIHRoZSBjaGlsZCBsaXN0IHNvIHRoZSB3aG9sZSB0aGluZyBpcyBvcHRpb25hbC4KKworKiBGaXhlZCBhIGJ1ZyBpbiBMT09LIHRoYXQgbWFkZSBpdCBub3QgbG9vayB0aHJvdWdoIG51bGxhYmxlIHJ1bGVzLgorCisqIFVzaW5nIEFTVCBzdWZmaXhlcyBvciAtPiByZXdyaXRlIHN5bnRheCBub3cgZ2l2ZXMgYW4gZXJyb3Igdy9vIGEgZ3JhbW1hcgorICBvdXRwdXQgb3B0aW9uLiAgVXNlZCB0byBjcmFzaCA7KQorCisqIFJlZmVyZW5jZXMgdG8gRU9GIGVuZGVkIHVwIHdpdGggaW1wcm9wZXIgLTEgcmVmcyBpbnN0ZWFkIG9mIEVPRiBpbiBvdXRwdXQuCisKKyogZGlkbid0IHdhcm4gb2YgYW1iaWcgcmVmIHRvICRleHByIGluIHJld3JpdGU7IGZpeGVkLgorbGlzdAorICAgICA6CSdbJyBleHByICdmb3InIHR5cGUgSUQgJ2luJyBleHByICddJworCS0+IGNvbXByZWhlbnNpb24oZXhwcj17JGV4cHIuc3R9LHR5cGU9e30sbGlzdD17fSxpPXt9KQorCTsKKworSnVuZSAxMiwgMjAwNgorCisqIEVPRiB3b3JrcyBpbiB0aGUgcGFyc2VyIGFzIGEgdG9rZW4gbmFtZS4KKworKiBSdWxlIGI6KEEgQj8pKjsgZGlkbid0IGRpc3BsYXkgcHJvcGVybHkgaW4gQVcgZHVlIHRvIHRoZSB3YXkgQU5UTFIKKyAgZ2VuZXJhdGVkIE5GQS4KKworKiAic2NvcGUgeDsiIGluIGEgcnVsZSBmb3IgdW5rbm93biB4IGdpdmVzIG5vIGVycm9yLiAgRml4ZWQuICBBZGRlZCB1bml0IHRlc3QuCisKKyogTGFiZWwgdHlwZSBmb3IgcmVmcyB0byBzdGFydC9zdG9wIGluIHRyZWUgcGFyc2VyIGFuZCBvdGhlciBwYXJzZXJzIHdlcmUKKyAgbm90IHVzZWQuICBMb3RzIG9mIGNhc3RpbmcuICBJY2suIEZpeGVkLgorCisqIGNvdWxkbid0IHJlZmVyIHRvICR0b2tlbmxhYmVsIGluIGlzb2xhdGlvbjsgYnV0IG5lZWQgc28gd2UgY2FuIHRlc3QgaWYKKyAgc29tZXRoaW5nIHdhcyBtYXRjaGVkLiAgRml4ZWQuCisKKyogTG90cyBvZiBsaXR0bGUgYnVncyBmaXhlZCBpbiAkeC55LCAlLi4uIHRyYW5zbGF0aW9uIGR1ZSB0byBuZXcKKyAgYWN0aW9uIHRyYW5zbGF0b3IuCisKKyogSW1wcm9wZXJseSB0cmFja2luZyBibG9jayBuZXN0aW5nIGxldmVsOyByZXN1bHQgd2FzIHRoYXQgeW91IGNvdWxkbid0CisgIHNlZSAkSUQgaW4gYWN0aW9uIG9mIHJ1bGUgImEgOiBBKyB8IElEIHtUb2tlbiB0ID0gJElEO30gfCBDIDsiCisKKyogYSA6IElEIElEIHskSUQudGV4dDt9IDsgZGlkIG5vdCBnZXQgYSB3YXJuaW5nIGFib3V0IGFtYmlndW91cyAkSUQgcmVmLgorCisqIE5vIGVycm9yIHdhcyBmb3VuZCBvbiAkQ09NTUVOVC50ZXh0OgorCitDT01NRU5UCisgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgICAgIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIG1ldGhvZCAiKyRDT01NRU5ULnRleHQpO30KKyAgICA7CisKKyAgJGVuY2xvc2luZ2xleGVycnVsZSBzY29wZSBkb2VzIG5vdCBleGlzdC4gIFVzZSB0ZXh0IG9yIHNldFRleHQoKSBoZXJlLgorCitKdW5lIDExLCAyMDA2CisKKyogU2luZ2xlIHJldHVybiB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG5vdyB0byBkZWZhdWx0IG9yIHRvIHlvdXIgc3BlYy4KKworKiBjbGVhbmVkIHVwIGlucHV0IHN0cmVhbSBzdHVmZi4gIEFkZGVkIEFOVExSUmVhZGVyU3RyZWFtLCBBTlRMUklucHV0U3RyZWFtCisgIGFuZCByZWZhY3RvcmVkLiAgWW91IGNhbiBzcGVjaWZ5IGVuY29kaW5ncyBub3cgb24gQU5UTFJGaWxlU3RyZWFtIChhbmQKKyAgQU5UTFJJbnB1dFN0cmVhbSkgbm93LgorCisqIFlvdSBjYW4gc2V0IHRleHQgbG9jYWwgdmFyIG5vdyBpbiBhIGxleGVyIHJ1bGUgYW5kIHRva2VuIGdldHMgdGhhdCB0ZXh0LgorICBzdGFydC9zdG9wIGluZGV4ZXMgYXJlIHN0aWxsIHNldCBmb3IgdGhlIHRva2VuLgorCisqIENoYW5nZWQgbGV4ZXIgc2xpZ2h0bHkuICBDYWxsaW5nIGEgbm9uZnJhZ21lbnQgcnVsZSBmcm9tIGEKKyAgbm9uZnJhZ21lbnQgcnVsZSBkb2VzIG5vdCBzZXQgdGhlIG92ZXJhbGwgdG9rZW4uCisKK0p1bmUgMTAsIDIwMDYKKworKiBGaXhlZCBidWcgd2hlcmUgdW5uZWNlc3NhcnkgZXNjYXBlcyB5aWVsZCBjaGFyPT0wIGxpa2UgJ1x7Jy4KKworKiBGaXhlZCBhbmFseXNpcyBidWcuICBUaGlzIGdyYW1tYXIgZGlkbid0IHJlcG9ydCBhIHJlY3Vyc2lvbiB3YXJuaW5nOgoreCAgIDogeSBYCisgICAgfCB5IFkKKyAgICA7Cit5ICAgOiBMIHkgUgorICAgIHwgQgorICAgIDsKKyAgVGhlIERGQVN0YXRlLmVxdWFscygpIG1ldGhvZCB3YXMgbWVzc2VkIHVwLgorCisqIEFkZGVkIEBzeW5wcmVkZ2F0ZSB7Li4ufSBhY3Rpb24gc28geW91IGNhbiB0ZWxsIEFOVExSIGhvdyB0byBnYXRlIGFjdGlvbnMKKyAgaW4vb3V0IGR1cmluZyBzeW50YWN0aWMgcHJlZGljYXRlIGV2YWx1YXRpb24uCisKKyogRnV6enkgcGFyc2luZyBzaG91bGQgYmUgbW9yZSBlZmZpY2llbnQuICBJdCBzaG91bGQgYmFja3RyYWNrIG92ZXIgYSBydWxlCisgIGFuZCB0aGVuIHJld2luZCBhbmQgZG8gaXQgYWdhaW4gIndpdGggZmVlbGluZyIgdG8gZXhlYyBhY3Rpb25zLiAgSXQgd2FzCisgIGFjdHVhbGx5IGRvaW5nIGl0IDN4IG5vdCAyeC4KKworSnVuZSA5LCAyMDA2CisKKyogR3V0dGVkIGFuZCByZWJ1aWx0IHRoZSBhY3Rpb24gdHJhbnNsYXRvciBmb3IgJHgueSwgJHg6OnksIC4uLgorICBVc2VzIEFOVExSIHYzIG5vdyBmb3IgdGhlIGZpcnN0IHRpbWUgaW5zaWRlIHYzIHNvdXJjZS4gOikKKyAgQWN0aW9uVHJhbnNsYXRvci5qYXZhCisKKyogRml4ZWQgYSBidWcgd2hlcmUgcmVmZXJlbmNpbmcgYSByZXR1cm4gdmFsdWUgb24gYSBydWxlIGRpZG4ndCB3b3JrCisgIGJlY2F1c2UgbGF0ZXIgYSByZWYgdG8gdGhhdCBydWxlJ3MgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzIGRpZG4ndAorICBwcm9wZXJseSBmb3JjZSBhIHJldHVybiB2YWx1ZSBzdHJ1Y3QgdG8gYmUgYnVpbHQuICBBZGRlZCB1bml0IHRlc3QuCisKK0p1bmUgNiwgMjAwNgorCisqIE5ldyBERkEgbWVjaGFuaXNtcy4gIEN5Y2xpYyBERkEgYXJlIGltcGxlbWVudGVkIGFzIHN0YXRlIHRhYmxlcywKKyAgZW5jb2RlZCB2aWEgc3RyaW5ncyBhcyBqYXZhIGNhbm5vdCBoYW5kbGUgbGFyZ2Ugc3RhdGljIGFycmF5cyA6KAorICBTdGF0ZXMgd2l0aCBlZGdlcyBlbWFuYXRpbmcgdGhhdCBoYXZlIHByZWRpY2F0ZXMgYXJlIHNwZWNpYWxseQorICB0cmVhdGVkLiAgQSBtZXRob2QgaXMgZ2VuZXJhdGVkIHRvIGRvIHRoZXNlIHN0YXRlcy4gIFRoZSBERkEKKyAgc2ltdWxhdGlvbiByb3V0aW5lIHVzZXMgdGhlICJzcGVjaWFsIiBhcnJheSB0byBmaWd1cmUgb3V0IGlmIHRoZQorICBzdGF0ZSBpcyBzcGVjaWFsLiAgU2VlIE1hcmNoIDI1LCAyMDA2IGVudHJ5IGZvciBkZXNjcmlwdGlvbjoKKyAgaHR0cDovL3d3dy5hbnRsci5vcmcvYmxvZy9hbnRscjMvY29kZWdlbi50bWwuICBhbmFseXNpcy5ERkEgbm93IGhhcworICBhbGwgdGhlIHN0YXRlIHRhYmxlcyBnZW5lcmF0ZWQgZm9yIGNvZGUgZ2VuLiAgQ3ljbGljQ29kZUdlbmVyYXRvci5qYXZhCisgIGRpc2FwcGVhcmVkIGFzIGl0J3MgdW5uZWVkZWQgY29kZS4gOikKKworKiBJbnRlcm5hbCBnZW5lcmFsIGNsZWFuIHVwIG9mIHRoZSBERkEuc3RhdGVzIHZzIHVuaXF1ZVN0YXRlcyB0aGluZy4KKyAgRml4ZWQgbG9va2FoZWFkIGRlY2lzaW9ucyBubyBsb25nZXIgZmlsbCB1bmlxdWVTdGF0ZXMuICBXYXN0ZSBvZgorICB0aW1lLiAgQWxzbyBub3RlZCB0aGF0IHdoZW4gYWRkaW5nIHNlbSBwcmVkIGVkZ2VzLCBJIGRpZG4ndCBjaGVjaworICBmb3Igc3RhdGUgcmV1c2UuICBGaXhlZC4KKworSnVuZSA0LCAyMDA2CisKKyogV2hlbiByZXNvbHZpbmcgYW1iaWcgREZBIHN0YXRlcyBwcmVkaWNhdGVzLCBJIGRpZCBub3QgYWRkIHRoZSBuZXcgc3RhdGVzCisgIHRvIHRoZSBsaXN0IG9mIHVuaXF1ZSBERkEgc3RhdGVzLiAgTm8gb2JzZXJ2YWJsZSBlZmZlY3Qgb24gb3V0cHV0IGV4Y2VwdAorICB0aGF0IERGQSBzdGF0ZSBudW1iZXJzIHdlcmUgbm90IGFsd2F5cyBjb250aWd1b3VzIGZvciBwcmVkaWNhdGVkIGRlY2lzaW9ucy4KKyAgSSBuZWVkZWQgdGhpcyBmaXggZm9yIG5ldyBERkEgdGFibGVzLgorCiszLjBlYTEwIC0gSnVuZSAyLCAyMDA2CisKK0p1bmUgMiwgMjAwNgorCisqIEltcHJvdmVkIGdyYW1tYXIgc3RhdHMgYW5kIGFkZGVkIHN5bnRhY3RpYyBwcmVkIHRyYWNraW5nLgorCitKdW5lIDEsIDIwMDYKKworKiBEdWUgdG8gYSB0eXBlIG1pc21hdGNoLCB0aGUgRGVidWdQYXJzZXIucmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oKQorICBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuICBEZWJ1ZyBldmVudHMgZm9yIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IKKyAgbm90aWZpY2F0aW9uIHdlcmUgbm90IHNlbnQgdG8gQU5UTFJXb3JrcyBwcm9iYWJseQorCisqIEFkZGVkIGdldEJhY2t0cmFja2luZ0xldmVsKCkgZm9yIGFueSByZWNvZ25pemVyOyBuZWVkZWQgZm9yIHByb2ZpbGVyLgorCisqIE9ubHkgd3JpdGVzIHByb2ZpbGluZyBkYXRhIGZvciBhbnRsciBncmFtbWFyIGFuYWx5c2lzIHdpdGggLXByb2ZpbGUgc2V0CisKKyogTWFqb3IgdXBkYXRlIGFuZCBidWcgZml4IHRvIChydW50aW1lKSBQcm9maWxlci4KKworTWF5IDI3LCAyMDA2CisKKyogQWRkZWQgTGV4ZXIuc2tpcCgpIHRvIGZvcmNlIGxleGVyIHRvIGlnbm9yZSBjdXJyZW50IHRva2VuIGFuZCBsb29rIGZvcgorICBhbm90aGVyOyBubyB0b2tlbiBpcyBjcmVhdGVkIGZvciBjdXJyZW50IHJ1bGUgYW5kIGlzIG5vdCBwYXNzZWQgb24gdG8KKyAgcGFyc2VyIChvciBvdGhlciBjb25zdW1lciBvZiB0aGUgbGV4ZXIpLgorCisqIFBhcnNlcnMgYXJlIG11Y2ggZmFzdGVyIG5vdy4gIEkgcmVtb3ZlZCB1c2Ugb2YgamF2YS51dGlsLlN0YWNrIGZvciBwdXNoaW5nCisgIGZvbGxvdyBzZXRzIGFuZCB1c2UgYSBoYXJkY29kZWQgYXJyYXkgc3RhY2sgaW5zdGVhZC4gIERyb3BwZWQgZnJvbQorICA1OTAwbXMgdG8gMzkwMG1zIGZvciBwYXJzZStsZXggdGltZSBwYXJzaW5nIGVudGlyZSBqYXZhIDEuNC4yIHNvdXJjZS4gIExleAorICB0aW1lIGFsb25lIHdhcyBhYm91dCAxNTAwbXMuICBKdXN0IGxvb2tpbmcgYXQgcGFyc2UgdGltZSwgd2UgZ2V0IGFib3V0IDJ4CisgIHNwZWVkIGltcHJvdmVtZW50LiA6KQorCitNYXkgMjYsIDIwMDYKKworKiBGaXhlZCBORkEgY29uc3RydWN0aW9uIHNvIGl0IGdlbmVyYXRlcyBORkEgZm9yIChBKikqIHN1Y2ggdGhhdCBBTlRMUldvcmtzCisgIGNhbiBkaXNwbGF5IGl0IHByb3Blcmx5LgorCitNYXkgMjUsIDIwMDYKKworKiBhZGRlZCBhYm9ydCBtZXRob2QgdG8gR3JhbW1hciBzbyBBVyBjYW4gdGVybWluYXRlIHRoZSBjb252ZXJzaW9uIGlmIGl0J3MKKyAgdGFraW5nIHRvbyBsb25nLgorCitNYXkgMjQsIDIwMDYKKworKiBhZGRlZCBtZXRob2QgdG8gZ2V0IGxlZnQgcmVjdXJzaXZlIHJ1bGVzIGZyb20gZ3JhbW1hciB3aXRob3V0IGRvaW5nIGZ1bGwKKyAgZ3JhbW1hciBhbmFseXNpcy4KKworKiBhbmFseXNpcywgY29kZSBnZW4gbm90IGF0dGVtcHRlZCBpZiBzZXJpb3VzIGVycm9yIChsaWtlCisgIGxlZnQtcmVjdXJzaW9uIG9yIG1pc3NpbmcgcnVsZSBkZWZpbml0aW9uKSBvY2N1cnJlZCB3aGlsZSByZWFkaW5nCisgIHRoZSBncmFtbWFyIGluIGFuZCBkZWZpbmluZyBzeW1ib2xzLgorCisqIGFkZGVkIGFtYXppbmcgb3B0aW1pemF0aW9uOyByZWR1Y2VzIGFuYWx5c2lzIHRpbWUgYnkgOTAlIGZvciBqYXZhCisgIGdyYW1tYXI7IHNpbXBsZSBJRiBzdGF0ZW1lbnQgYWRkaXRpb24hCisKKzMuMGVhOSAtIE1heSAyMCwgMjAwNgorCisqIGFkZGVkIGdsb2JhbCBrIHZhbHVlIGZvciBncmFtbWFyIHRvIGxpbWl0IGxvb2thaGVhZCBmb3IgYWxsIGRlY2lzaW9ucyB1bmxlc3MKK292ZXJyaWRkZW4gaW4gYSBwYXJ0aWN1bGFyIGRlY2lzaW9uLgorCisqIGFkZGVkIGZhaWxzYWZlIHNvIHRoYXQgYW55IGRlY2lzaW9uIHRha2luZyBsb25nZXIgdGhhbiAyIHNlY29uZHMgdG8gY3JlYXRlCit0aGUgREZBIHdpbGwgZmFsbCBiYWNrIG9uIGs9MS4gIFVzZSAtSW1heHRpbWVmb3JERkEgbiAoaW4gbXMpIHRvIHNldCB0aGUgdGltZS4KKworKiBhZGRlZCBhbiBvcHRpb24gKHR1cm5lZCBvZmYgZm9yIG5vdykgdG8gdXNlIG11bHRpcGxlIHRocmVhZHMgdG8KK3BlcmZvcm0gZ3JhbW1hciBhbmFseXNpcy4gIE5vdCBtdWNoIGhlbHAgb24gYSAyLUNQVSBjb21wdXRlciBhcworZ2FyYmFnZSBjb2xsZWN0aW9uIHNlZW1zIHRvIHBlZyB0aGUgMm5kIENQVSBhbHJlYWR5LiA6KCBHb3R0YSB3YWl0IGZvcgorYSA0IENQVSBib3ggOykKKworKiBzd2l0Y2hlZCBmcm9tICNzcmMgdG8gLy8gJEFOVExSIHNyYyBkaXJlY3RpdmUuCisKKyogQ29tbW9uVG9rZW5TdHJlYW0uZ2V0VG9rZW5zKCkgbG9va2VkIHBhc3QgZW5kIG9mIGJ1ZmZlciBzb21ldGltZXMuIGZpeGVkLgorCisqIHVuaWNvZGUgbGl0ZXJhbHMgZGlkbid0IHJlYWxseSB3b3JrIGluIERPVCBvdXRwdXQgYW5kIGdlbmVyYXRlZCBjb2RlLiBmaXhlZC4KKworKiBmaXhlZCB0aGUgdW5pdCB0ZXN0IHJpZyBzbyBpdCBjb21waWxlcyBuaWNlbHkgd2l0aCBKYXZhIDEuNQorCisqIEFkZGVkIGFudCBidWlsZC54bWwgZmlsZSAocmVhZHMgYnVpbGQucHJvcGVydGllcyBmaWxlKQorCisqIHByZWRpY2F0ZXMgc29tZXRpbWVzIGZhaWxlZCB0byBjb21waWxlL2V2YWwgcHJvcGVybHkgZHVlIHRvIG1pc3NpbmcgKC4uLikKKyAgaW4gSUYgZXhwcmVzc2lvbnMuICBGb3JjZWQgKC4uKQorCisqICguLi4pPyB3aXRoIG9ubHkgb25lIGFsdCB3ZXJlIG5vdCBvcHRpbWl6ZWQuICBXYXM6CisKKyAgICAgICAgLy8gdC5nOjQ6NzogKCBCICk/CisgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICBpZiAoIExBMV8wPT1CICkgeworICAgICAgICAgICAgYWx0MT0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBMQTFfMD09LTEgKSB7CisgICAgICAgICAgICBhbHQxPTI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjQ6NzogKCBCICk/IiwgMSwgMCwgaW5wdXQpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorCitpcyBub3c6CisKKyAgICAgICAgLy8gdC5nOjQ6NzogKCBCICk/CisgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICBpZiAoIExBMV8wPT1CICkgeworICAgICAgICAgICAgYWx0MT0xOworICAgICAgICB9CisKKyAgU21hbGxlciwgZmFzdGVyIGFuZCBtb3JlIHJlYWRhYmxlLgorCisqIEFsbG93IG1hbnVhbCBpbml0IG9mIHJldHVybiB2YWx1ZXMgbm93OgorICBmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtpbnQgeD0zKjQsIGNoYXIgKCpmKSgpPW51bGxdIDogLi4uIDsKKworKiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIERGQXMgdGhhdCBmaXhlZCBhIGNvZGVnZW4gYnVnIHdpdGggcnVsZXMgaW4gbGV4ZXI6CisgICBFUQkJCSA6ICc9JyA7CisgICBBU1NJR05PUAkJIDogJz0nIHwgJys9JyA7CisgIEVRIGlzIGEgc3Vic2V0IG9mIG90aGVyIHJ1bGUuICBJdCBkaWQgbm90IGdpdmVuIGFuIGVycm9yIHdoaWNoIGlzCisgIGNvcnJlY3QsIGJ1dCBnZW5lcmF0ZWQgYmFkIGNvZGUuCisKKyogQU5UTFIgd2FzIHNlbmRpbmcgY29sdW1uIG5vdCBjaGFyIHBvc2l0aW9uIHRvIEFOVExSV29ya3MuCisKKyogQnVnIGZpeDogbG9jYXRpb24gMCwgMCBlbWl0dGVkIGZvciBzeW5wcmVkcyBhbmQgZW1wdHkgYWx0cy4KKworKiBkZWJ1Z2dpbmcgZXZlbnQgaGFuZHNoYWtlIGhvdyBzZW5kcyBncmFtbWFyIGZpbGUgbmFtZS4gIEFkZGVkIGdldEdyYW1tYXJGaWxlTmFtZSgpIHRvIHJlY29nbml6ZXJzLiAgSmF2YS5zdGcgZ2VuZXJhdGVzIGl0OgorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiPGZpbGVOYW1lPiI7IH0KKworKiB0cmVlIHBhcnNlcnMgY2FuIGRvIGFyYml0cmFyeSBsb29rYWhlYWQgbm93IGluY2x1ZGluZyBiYWNrdHJhY2tpbmcuICBJCisgIHVwZGF0ZWQgQ29tbW9uVHJlZU5vZGVTdHJlYW0uCisKKyogYWRkZWQgZXZlbnRzIGZvciBkZWJ1Z2dpbmcgdHJlZSBwYXJzZXJzOgorCisJLyoqIElucHV0IGZvciBhIHRyZWUgcGFyc2VyIGlzIGFuIEFTVCwgYnV0IHdlIGtub3cgbm90aGluZyBmb3Igc3VyZQorCSAqICBhYm91dCBhIG5vZGUgZXhjZXB0IGl0cyB0eXBlIGFuZCB0ZXh0IChvYnRhaW5lZCBmcm9tIHRoZSBhZGFwdG9yKS4KKwkgKiAgVGhpcyBpcyB0aGUgYW5hbG9nIG9mIHRoZSBjb25zdW1lVG9rZW4gbWV0aG9kLiAgQWdhaW4sIHRoZSBJRCBpcworCSAqICB0aGUgaGFzaENvZGUgdXN1YWxseSBvZiB0aGUgbm9kZSBzbyBpdCBvbmx5IHdvcmtzIGlmIGhhc2hDb2RlIGlzCisJICogIG5vdCBpbXBsZW1lbnRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25zdW1lTm9kZShpbnQgSUQsIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSk7CisKKwkvKiogVGhlIHRyZWUgcGFyc2VyIGxvb2tlZCBhaGVhZCAqLworCXB1YmxpYyB2b2lkIExUKGludCBpLCBpbnQgSUQsIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSk7CisKKwkvKiogVGhlIHRyZWUgcGFyc2VyIGhhcyBwb3BwZWQgYmFjayB1cCBmcm9tIHRoZSBjaGlsZCBsaXN0IHRvIHRoZQorCSAqICByb290IG5vZGUuCisJICovCisJcHVibGljIHZvaWQgZ29VcCgpOworCisJLyoqIFRoZSB0cmVlIHBhcnNlciBoYXMgZGVzY2VuZGVkIHRvIHRoZSBmaXJzdCBjaGlsZCBvZiBhIHRoZSBjdXJyZW50CisJICogIHJvb3Qgbm9kZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBnb0Rvd24oKTsKKworKiBBZGRlZCBEZWJ1Z1RyZWVOb2RlU3RyZWFtIGFuZCBEZWJ1Z1RyZWVQYXJzZXIgY2xhc3NlcworCisqIEFkZGVkIGN0b3IgYmVjYXVzZSB0aGUgZGVidWcgdHJlZSBub2RlIHN0cmVhbSB3aWxsIG5lZWQgdG8gYXNrIHF1ZXNpdG9ucyBhYm91dCBub2RlcyBhbmQgc2luY2UgIG5vZGVzIGFyZSBqdXN0IE9iamVjdCwgaXQgbmVlZHMgYW4gYWRhcHRvciB0byBkZWNvZGUgdGhlIG5vZGVzIGFuZCBnZXQgdGV4dC90eXBlIGluZm8gZm9yIHRoZSBkZWJ1Z2dlci4KKworcHVibGljIENvbW1vblRyZWVOb2RlU3RyZWFtKFRyZWVBZGFwdG9yIGFkYXB0b3IsIFRyZWUgdHJlZSk7CisKKyogYWRkZWQgZ2V0dGVyIHRvIFRyZWVOb2RlU3RyZWFtOgorCXB1YmxpYyBUcmVlQWRhcHRvciBnZXRUcmVlQWRhcHRvcigpOworCisqIEltcGxlbWVudGVkIGdldFRleHQvZ2V0VHlwZSBpbiBDb21tb25UcmVlQWRhcHRvci4KKworKiBBZGRlZCBUcmFjZURlYnVnRXZlbnRMaXN0ZW5lciB0aGF0IGNhbiBkdW1wIGFsbCBldmVudHMgdG8gc3Rkb3V0LgorCisqIEkgYnJva2UgZG93biBhbmQgbWFrZSBUcmVlIGltcGxlbWVudCBnZXRUZXh0CisKKyogdHJlZSByZXdyaXRlcyBub3cgZ2VuIGxvY2F0aW9uIGRlYnVnIGV2ZW50cy4KKworKiBhZGRlZCBBU1QgZGVidWcgZXZlbnRzIHRvIGxpc3RlbmVyOyBhZGRlZCBibGFuayBsaXN0ZW5lciBmb3IgY29udmVuaWVuY2UKKworKiB1cGRhdGVkIGRlYnVnIGV2ZW50cyB0byBzZW5kIGJlZ2luL2VuZCBiYWNrdHJhY2sgZXZlbnRzIGZvciBkZWJ1Z2dpbmcKKworKiB3aXRoIGEgOiAoYi0+YikgKCcrJyBiIC0+IF4oUExVUyAkYSBiKSkqIDsgeW91IGdldCBiWzBdIGVhY2ggdGltZSBhcworICB0aGVyZSBpcyBubyBsb29wIGluIHJld3JpdGUgcnVsZSBpdHNlbGYuICBOZWVkIHRvIGtub3cgY29udGV4dCB0aGF0CisgIHRoZSAtPiBpcyBpbnNpZGUgdGhlIHJ1bGUgYW5kIGhlbmNlIGIgbWVhbnMgbGFzdCB2YWx1ZSBvZiBiIG5vdCBhbGwKKyAgdmFsdWVzLgorCisqIEJ1ZyBpbiBUb2tlblJld3JpdGVTdHJlYW07IG9wcyBhdCBpbmRleGVzIDwgc3RhcnQgaW5kZXggYmxvY2tlZCBwcm9wZXIgb3AuCisKKyogQWN0aW9ucyBpbiBTVCByZXdyaXRlcyAiLT4gKHskb3B9KSgpIiB3ZXJlIG5vdCB0cmFuc2xhdGVkCisKKyogQWRkZWQgbmV3IGFjdGlvbiBuYW1lOgorCitAcnVsZWNhdGNoIHsKK2NhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICByZWNvdmVyKGlucHV0LHJlKTsKK30KK2NhdGNoIChUaHJvd2FibGUgdCkgeworICAgIFN5c3RlbS5lcnIucHJpbnRsbih0KTsKK30KK30KK092ZXJyaWRlcyBydWxlIGNhdGNoIHN0dWZmLgorCisqIElzb2xhdGVkICQgcmVmcyBjYXVzZWQgZXhjZXB0aW9uCisKKzMuMGVhOCAtIE1hcmNoIDExLCAyMDA2CisKKyogYWRkZWQgQGZpbmFsbHkgey4uLn0gYWN0aW9uIGxpa2UgQGluaXQgZm9yIHJ1bGVzLiAgRXhlY3V0ZXMgaW4KKyAgZmluYWxseSBibG9jayAoamF2YSB0YXJnZXQpIGFmdGVyIGFsbCBvdGhlciBzdHVmZiBsaWtlIHJ1bGUgbWVtb2l6YXRpb24uCisgIE5vIGNvZGUgY2hhbmdlcyBuZWVkczsgU1QganVzdCByZWZzIGEgbmV3IGFjdGlvbjoKKyAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmZpbmFsbHk+CisKKyogaGlkZW91cyBidWcgZml4ZWQ6IFBMVVM9JysnIGRpZG4ndCByZXN1bHQgaW4gJysnIHJ1bGUgaW4gbGV4ZXIKKworKiBUb2tlblJld3JpdGVTdHJlYW0gZGlkbid0IGRvIHRvU3RyaW5nKCkgcmlnaHQgd2hlbiBubyByZXdyaXRlcyBoYWQgYmVlbiBkb25lLgorCisqIGxleGVyIGVycm9ycyBpbiBpbnRlcnByZXRlciB3ZXJlIG5vdCBwcmludGVkIHByb3Blcmx5CisKKyogYml0c2V0cyBhcmUgZHVtcGVkIGluIGhleCBub3QgZGVjaW1hbCBub3cgZm9yIEZPTExPVyBzZXRzCisKKyogLyogZXBzaWxvbiAqLyBpcyBub3QgcHJpbnRlZCBub3cgd2hlbiBwcmludGluZyBvdXQgZ3JhbW1hcnMgd2l0aCBlbXB0eSBhbHRzCisKKyogRml4ZWQgYW5vdGhlciBidWcgaW4gdHJlZSByZXdyaXRlIHN0dWZmIHdoZXJlIGl0IHdhcyBjaGVja2luZyB0aGF0IGVsZW1lbnRzCisgIGhhZCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gIFN0cmFuZ2UuLi5jb21tZW50ZWQgb3V0IGZvciBub3cgdG8gc2VlIGlmIEkgY2FuIHJlbWVtYmVyIHdoYXQncyB1cC4KKworKiBUcmVlIHJld3JpdGVzIGhhZCBwcm9ibGVtcyB3aGVuIHlvdSBkaWRuJ3QgaGF2ZSB4Kz1GT08gdmFyaWFibGVzLiAgUnVsZXMKKyAgbGlrZSB0aGlzIHdvcmsgbm93OgorCisgIGEgOiAoeD1JRCk/IHk9SUQgLT4gKCR4ICR5KT87CisKKyogZmlsdGVyPXRydWUgZm9yIGxleGVycyB0dXJucyBvbiBrPTEgYW5kIGJhY2t0cmFja2luZyBmb3IgZXZlcnkgdG9rZW4KKyAgYWx0ZXJuYXRpdmUuICBQdXQgdGhlIHJ1bGVzIGluIHByaW9yaXR5IG9yZGVyLgorCisqIGFkZGVkIGdldExpbmUoKSBldGMuLi4gdG8gVHJlZSB0byBzdXBwb3J0IGJldHRlciBlcnJvciByZXBvcnRpbmcgZm9yCisgIHRyZWVzLiAgQWRkZWQgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLgorCisqICR0ZW1wbGF0ZXM6OmZvbygpIGlzIGdvbmUuICBhZGRlZCAlIGFzIHNwZWNpYWwgdGVtcGxhdGUgc3ltYm9sLgorICAlZm9vKGE9e30sYj17fSwuLi4pIGN0b3IgKGV2ZW4gc2hvcnRlciB0aGFuICR0ZW1wbGF0ZXM6OmZvbyguLi4pKQorICAlKHtuYW1lLWV4cHJ9KShhPXt9LC4uLikgaW5kaXJlY3QgdGVtcGxhdGUgY3RvciByZWZlcmVuY2UKKworICBUaGUgYWJvdmUgYXJlIHBhcnNlZCBieSBhbnRsci5nIGFuZCB0cmFuc2xhdGVkIGJ5IGNvZGVnZW4uZworICBUaGUgZm9sbG93aW5nIGFyZSBwYXJzZWQgbWFudWFsbHkgaGVyZToKKworICAle3N0cmluZy1leHByfSBhbm9ueW1vdXMgdGVtcGxhdGUgZnJvbSBzdHJpbmcgZXhwcgorICAle2V4cHJ9LnkgPSB6OyB0ZW1wbGF0ZSBhdHRyaWJ1dGUgeSBvZiBTdHJpbmdUZW1wbGF0ZS10eXBlZCBleHByIHRvIHoKKyAgJXgueSA9IHo7IHNldCB0ZW1wbGF0ZSBhdHRyaWJ1dGUgeSBvZiB4IChhbHdheXMgc2V0IG5ldmVyIGdldCBhdHRyKQorICAgICAgICAgICAgdG8geiBbbGFuZ3VhZ2VzIGxpa2UgcHl0aG9uIHdpdGhvdXQgJzsnIG11c3Qgc3RpbGwgdXNlIHRoZQorICAgICAgICAgICAgJzsnIHdoaWNoIHRoZSBjb2RlIGdlbmVyYXRvciBpcyBmcmVlIHRvIHJlbW92ZSBkdXJpbmcgY29kZSBnZW5dCisKKyogLT4gKHtleHByfSkoYT17fSwuLi4pIG5vdGF0aW9uIGZvciBpbmRpcmVjdCB0ZW1wbGF0ZSByZXdyaXRlLgorICBleHByIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZS4KKworKiAkeFtpXTo6eSBhbmQgJHhbLWldOjp5IG5vdGF0aW9uIGZvciBhY2Nlc3NzaW5nIGFic29sdXRlIHNjb3BlIHN0YWNrCisgIGluZGV4ZXMgYW5kIHJlbGF0aXZlIG5lZ2F0aXZlIHNjb3Blcy4gICR4Wy0xXTo6eSBpcyB0aGUgeSBhdHRyaWJ1dGUKKyAgb2YgdGhlIHByZXZpb3VzIHNjb3BlIChzdGFjayB0b3AgLSAxKS4KKworKiBmaWx0ZXI9dHJ1ZSBtb2RlIGZvciBsZXhlcnM7IGNhbiBkbyB0aGlzIG5vdy4uLnVwb24gbWlzbWF0Y2gsIGp1c3QKKyAgY29uc3VtZXMgYSBjaGFyIGFuZCB0cmllcyBhZ2FpbjoKK2xleGVyIGdyYW1tYXIgRnV6enlKYXZhOworb3B0aW9ucyB7ZmlsdGVyPXRydWU7fQorCitGSUVMRAorICAgIDogICBUWVBFIFdTPyBuYW1lPUlEIFdTPyAoJzsnfCc9JykKKyAgICAgICAge1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgdmFyICIrJG5hbWUudGV4dCk7fQorICAgIDsKKworKiByZWZhY3RvcmVkIGNoYXIgc3RyZWFtcyBzbyBBTlRMUkZpbGVTdHJlYW0gaXMgbm93IGEgc3ViY2xhc3Mgb2YKKyAgQU5UTFJTdHJpbmdTdHJlYW0uCisKKyogY2hhciBzdHJlYW1zIGZvciBsZXhlciBub3cgYWxsb3dlZCBuZXN0ZWQgYmFja3RyYWNraW5nIGluIGxleGVyLgorCisqIGFkZGVkIFRva2VuTGFiZWxUeXBlIGZvciBsZXhlci9wYXJzZXIgZm9yIGFsbCB0b2tlbiBsYWJlbHMKKworKiBsaW5lIG51bWJlcnMgZm9yIGVycm9yIG1lc3NhZ2VzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkgaW4gYW50bHIuZworICBmb3Igc3RyaW5ncywgY2hhciBsaXRlcmFscyBhbmQgPDwuLi4+PgorCisqIGluaXQgYWN0aW9uIGluIGxleGVyIHJ1bGVzIHdhcyBiZWZvcmUgdGhlIHR5cGUsc3RhcnQsbGluZSwuLi4gZGVjbHMuCisKKyogVHJlZSBncmFtbWFycyBjYW4gbm93IHNwZWNpZnkgb3V0cHV0OyBJJ3ZlIG9ubHkgdGVzdGVkIG91dHB1dD10ZW1wbGF0CisgIHRob3VnaC4KKworKiBZb3UgY2FuIHJlZmVyZW5jZSBFT0Ygbm93IGluIHRoZSBwYXJzZXIgYW5kIGxleGVyLiAgSXQncyBqdXN0IHRva2VuIHR5cGUKKyAgb3IgY2hhciB2YWx1ZSAtMS4KKworKiBCdWcgZml4OiAkSUQgcmVmcyBpbiB0aGUgKmxleGVyKiB3ZXJlIGFsbCBtZXNzZWQgdXAuICBDbGVhbmVkIHVwIHRoZQorICBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUuLi4KKworKiBCdWcgZml4OiAuc3Qgbm90IGZvdW5kIGluIHJ1bGUgcmVmIHdoZW4gcnVsZSBoYXMgc2NvcGU6CitmaWVsZAorc2NvcGUgeworCVN0cmluZ1RlbXBsYXRlIGZ1bmNEZWY7Cit9CisgICAgOiAgIC4uLgorCXskZmllbGQ6OmZ1bmNEZWYgPSAkZmllbGQuc3Q7fQorICAgIDsKK2l0IGdldHMgZmllbGRfc3RhY2suc3QgaW5zdGVhZAorCisqIHJldHVybiBpbiBiYWNrdHJhY2tpbmcgbXVzdCByZXR1cm4gcmV0dmFsIG9yIG51bGwgaWYgcmV0dXJuIHZhbHVlLgorCisqICRwcm9wZXJ0eSB3aXRoaW4gYSBydWxlIG5vdyB3b3JrcyBsaWtlICR0ZXh0LCAkc3QsIC4uLgorCisqIEFTVC9UZW1wbGF0ZSBSZXdyaXRlcyB3ZXJlIG5vdCBnYXRlZCBieSBiYWNrdHJhY2tpbmc9PTAgc28gdGhleQorICBleGVjdXRlZCBldmVuIHdoZW4gZ3Vlc3NpbmcuICBBdXRvIEFTVCBjb25zdHJ1Y3Rpb24gaXMgbm93IGdhdGVkIGFsc28uCisKKyogQ29tbW9uVG9rZW5TdHJlYW0gd2FzIHNvbWVob3cgcmV0dXJuaW5nIHRva2VucyBub3QgdGV4dCBpbiB0b1N0cmluZygpCisKKyogYWRkZWQgdXNlZnVsIG1ldGhvZHMgdG8gcnVudGltZS5CaXRTZXQgYW5kIGFsc28gdG8gQ29tbW9uVG9rZW4gc28geW91IGNhbgorICB1cGRhdGUgdGhlIHRleHQuICBBZGRlZCBuaWNlIFRva2VuIHN0cmVhbSBtZXRob2Q6CisKKyAgLyoqIEdpdmVuIGEgc3RhcnQgYW5kIHN0b3AgaW5kZXgsIHJldHVybiBhIExpc3Qgb2YgYWxsIHRva2VucyBpbgorICAgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgICAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0VG9rZW5zKGludCBzdGFydCwgaW50IHN0b3AsIEJpdFNldCB0eXBlcyk7CisKKyogbGl0ZXJhbHMgYXJlIG5vdyBwYXNzZWQgaW4gdGhlIC50b2tlbnMgZmlsZXMgc28geW91IGNhbiByZWYgdGhlbSBpbgorICB0cmVlIHBhcnNlcywgZm9yIGV4YW1wbGUuCisKKyogYWRkZWQgYmFzaWMgZXhjZXB0aW9uIGhhbmRsaW5nOyBubyBsYWJlbHMsIGp1c3QgZ2VuZXJhbCBjYXRjaGVzOgorCithIDogezt9QSB8IEIgOworICAgICAgICBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBjYXRjaFtSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZV0geworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNvZyBlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaFtFeGNlcHRpb24gZV0geworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKworKiBBZGRlZCBtZXRob2QgdG8gVG9rZW5TdHJlYW06CisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVG9rZW4gc3RhcnQsIFRva2VuIHN0b3ApOworCisqIGFudGxyIGdlbmVyYXRlcyAjc3JjIGxpbmVzIGluIGxleGVyIGdyYW1tYXJzIGdlbmVyYXRlZCBmcm9tIGNvbWJpbmVkIGdyYW1tYXJzCisgIHNvIGVycm9yIG1lc3NhZ2VzIHJlZmVyIHRvIG9yaWdpbmFsIGZpbGUuCisKKyogbGV4ZXJzIGdlbmVyYXRlZCBmcm9tIGNvbWJpbmVkIGdyYW1tYXJzIG5vdyB1c2Ugb3JpZ2luYWxseSBmb3JtYXR0aW5nLgorCisqIHByZWRpY2F0ZXMgaGF2ZSAkeC55IHN0dWZmIHRyYW5zbGF0ZWQgbm93LiAgV2FybmluZzogcHJlZGljYXRlcyBtaWdodCBiZQorICBob2lzdGVkIG91dCBvZiBjb250ZXh0LgorCisqIHJldHVybiB2YWx1ZXMgaW4gcmV0dXJuIHZhbCBzdHJ1Y3RzIGFyZSBub3cgcHVibGljLgorCisqIG91dHB1dD10ZW1wbGF0ZSB3aXRoIHJldHVybiB2YWx1ZXMgb24gcnVsZXMgd2FzIGJyb2tlbi4gIEkgYXNzdW1lIHJldHVybiB2YWx1ZXMgd2l0aCBBU1RzIHdhcyBicm9rZW4gdG9vLiAgRml4ZWQuCisKKzMuMGVhNyAtIERlY2VtYmVyIDE0LCAyMDA1CisKKyogQWRkZWQgLXByaW50IG9wdGlvbiB0byBwcmludCBvdXQgZ3JhbW1hciB3L28gYWN0aW9ucworCisqIFJlbmFtZWQgQmFzZVBhcnNlciB0byBiZSBCYXNlUmVjb2duaXplciBhbmQgZXZlbiBtYWRlIExleGVyIGRlcml2ZSBmcm9tCisgIHRoaXM7IG5pY2UgYXMgaXQgbm93IHNoYXJlcyBiYWNrdHJhY2tpbmcgc3VwcG9ydCBjb2RlLgorCisqIEFkZGVkIHN5bnRhY3RpYyBwcmVkaWNhdGVzICguLi4pPT4uICBTZWUgRGVjZW1iZXIgNCwgMjAwNSBlbnRyeToKKworICBodHRwOi8vd3d3LmFudGxyLm9yZy9ibG9nL2FudGxyMy9sb29rYWhlYWQudG1sCisKKyAgTm90ZSB0aGF0IHdlIGhhdmUgYSBuZXcgb3B0aW9uIGZvciB0dXJuaW5nIG9mZiBydWxlIG1lbW9pemF0aW9uIGR1cmluZworICBiYWNrdHJhY2tpbmc6CisKKyAgLW5vbWVtbyAgICAgICAgd2hlbiBiYWNrdHJhY2tpbmcgZG9uJ3QgZ2VuZXJhdGUgbWVtb2l6YXRpb24gY29kZQorCisqIFByZWRpY2F0ZXMgYXJlIG5vdyB0ZXN0ZWQgaW4gb3JkZXIgdGhhdCB5b3Ugc3BlY2lmeSB0aGUgYWx0cy4gIElmIHlvdQorICBsZWF2ZSB0aGUgbGFzdCBhbHQgIm5ha2VkIiAody9vIHByZWQpLCBpdCB3aWxsIGFzc3VtZSBhIHRydWUgcHJlZCByYXRoZXIKKyAgdGhhbiB1bmlvbiBvZiBvdGhlciBwcmVkcy4KKworKiBBZGRlZCBnYXRlZCBwcmVkaWNhdGVzICJ7cH0/PT4iIHRoYXQgbGl0ZXJhbGx5IHR1cm4gb2ZmIGEgcHJvZHVjdGlvbiB3aGVyZWFzCitkaXNhbWJpZ3VhdGluZyBwcmVkaWNhdGVzIGFyZSBvbmx5IGhvaXN0ZWQgaW50byB0aGUgcHJlZGljdG9yIHdoZW4gc3ludGF4IGFsb25lCitpcyBub3Qgc3VmZmljaWVudCB0byB1bmlxdWVseSBwcmVkaWN0IGFsdGVybmF0aXZlcy4KKworQSA6IHtwfT8gID0+ICJhIiA7CitCIDogeyFwfT8gPT4gKCJhInwiYiIpKyA7CisKKyogYnVnIGZpeGVkIHJlbGF0ZWQgdG8gcHJlZGljYXRlcyBpbiBwcmVkaWN0b3IKK2xleGVyIGdyYW1tYXIgdzsKK0EgOiB7cH0/ICJhIiA7CitCIDogeyFwfT8gKCJhInwiYiIpKyA7CitERkEgaXMgY29ycmVjdC4gIEEgc3RhdGUgc3BsaXRzIGZvciBpbnB1dCAiYSIgb24gdGhlIHByZWQuCitHZW5lcmF0ZWQgY29kZSB0aG91Z2ggd2FzIGhvc2VkLiAgTm8gcHJlZCB0ZXN0cyBpbiBwcmVkaWN0aW9uIGNvZGUhCitJIGFkZGVkIHRlc3RMZXhlclByZWRzKCkgYW5kIG90aGVycyBpbiBUZXN0U2VtYW50aWNQcmVkaWNhdGVFdmFsdWF0aW9uLmphdmEKKworKiBhZGRlZCBleGVjQWN0aW9uIHRlbXBsYXRlIGluIGNhc2Ugd2Ugd2FudCB0byBkbyBzb21ldGhpbmcgaW4gZnJvbnQgb2YKKyAgZWFjaCBhY3Rpb24gZXhlY3V0aW9uIG9yIHNvbWV0aGluZy4KKworKiBsZWZ0LXJlY3Vyc2l2ZSBjeWNsZXMgZnJvbSBydWxlcyB3L28gZGVjaXNpb25zIHdlcmUgbm90IGRldGVjdGVkLgorCisqIHVuZGVmaW5lZCBsZXhlciBydWxlcyB3ZXJlIG5vdCBhbm5vdW5jZWQhIGZpeGVkLgorCisqIHVucmVhY2hhYmxlIG1lc3NhZ2VzIGZvciBUb2tlbnMgcnVsZSBub3cgaW5kaWNhdGUgcnVsZSBuYW1lIG5vdCBhbHQuIEUuZy4sCisKKyAgUnVieS5sZXhlci5nOjI0OjE6IFRoZSBmb2xsb3dpbmcgdG9rZW4gZGVmaW5pdGlvbnMgYXJlIHVucmVhY2hhYmxlOiBJVkFSCisKKyogbm9uZGV0ZXJtaW5pc20gd2FybmluZ3MgaW1wcm92ZWQgZm9yIFRva2VucyBydWxlOgorCitSdWJ5LmxleGVyLmc6MTA6MTogTXVsdGlwbGUgdG9rZW4gcnVsZXMgY2FuIG1hdGNoIGlucHV0IHN1Y2ggYXMgIiIwIi4uIjkiIjogSU5ULCBGTE9BVAorQXMgYSByZXN1bHQsIHRva2VucyhzKSBGTE9BVCB3ZXJlIGRpc2FibGVkIGZvciB0aGF0IGlucHV0CisKKworKiBET1QgZGlhZ3JhbXMgZGlkbid0IHNob3cgZXNjYXBlZCBjaGFyIHByb3Blcmx5LgorCisqIENoYXIvc3RyaW5nIGxpdGVyYWxzIGFyZSBub3cgYWxsICdhYmMnIG5vdCAiYWJjIi4KKworKiBhY3Rpb24gc3ludGF4IGNoYW5nZWQgIkBzY29wZTo6YWN0aW9ubmFtZSB7YWN0aW9ufSIgd2hlcmUgc2NvcGUgZGVmYXVsdHMKKyAgdG8gInBhcnNlciIgaWYgcGFyc2VyIGdyYW1tYXIgb3IgY29tYmluZWQgZ3JhbW1hciwgImxleGVyIiBpZiBsZXhlciBncmFtbWFyLAorICBhbmQgInRyZWVwYXJzZXIiIGlmIHRyZWUgZ3JhbW1hci4gIFRoZSBjb2RlIGdlbmVyYXRpb24gdGFyZ2V0cyBkZWNpZGUKKyAgd2hhdCBzY29wZXMgYXJlIGF2YWlsYWJsZS4gIEVhY2ggInNjb3BlIiB5aWVsZHMgYSBoYXNodGFibGUgZm9yIHVzZSBpbgorICB0aGUgb3V0cHV0IHRlbXBsYXRlcy4gIFRoZSBzY29wZXMgZnVsbCBvZiBhY3Rpb25zIGFyZSBzZW50IHRvIGFsbCBvdXRwdXQKKyAgZmlsZSB0ZW1wbGF0ZXMgKGN1cnJlbnRseSBoZWFkZXJGaWxlIGFuZCBvdXRwdXRGaWxlKSBhcyBhdHRyaWJ1dGUgYWN0aW9ucy4KKyAgVGhlbiB5b3UgY2FuIHJlZmVyZW5jZSA8YWN0aW9ucy5zY29wZT4gdG8gZ2V0IHRoZSBtYXAgb2YgYWN0aW9ucyBhc3NvY2lhdGVkCisgIHdpdGggc2NvcGUgYW5kIDxhY3Rpb25zLnBhcnNlci5oZWFkZXI+IHRvIGdldCB0aGUgcGFyc2VyJ3MgaGVhZGVyIGFjdGlvbgorICBmb3IgZXhhbXBsZS4gIFRoaXMgc2hvdWxkIGJlIHZlcnkgZmxleGlibGUuICBUaGUgdGFyZ2V0IHNob3VsZCBvbmx5IGhhdmUKKyAgdG8gZGVmaW5lIHdoaWNoIHNjb3BlcyBhcmUgdmFsaWQsIGJ1dCB0aGUgYWN0aW9uIG5hbWVzIHNob3VsZCBiZSB2YXJpYWJsZQorICBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlY29tcGlsZSBBTlRMUiB0byBhZGQgYWN0aW9ucyB0byBjb2RlIGdlbiB0ZW1wbGF0ZXMuCisKKyAgZ3JhbW1hciBUOworICBvcHRpb25zIHtsYW5ndWFnZT1KYXZhO30KKyAgQGhlYWRlciB7IHBhY2thZ2UgZm9vOyB9CisgIEBwYXJzZXI6OnN0dWZmIHsgaW50IGk7IH0gLy8gbmFtZXMgd2l0aGluIHNjb3BlIG5vdCBjaGVja2VkOyB0YXJnZXQgZGVwZW5kZW50CisgIEBtZW1iZXJzIHsgaW50IGk7IH0KKyAgQGxleGVyOjpoZWFkZXIge2hlYWR9CisgIEBsZXhlcjo6bWVtYmVycyB7IGludCBqOyB9CisgIEBoZWFkZXJmaWxlOjpibG9ydCB7Li4ufSAvLyBlcnJvcjogdGhpcyB0YXJnZXQgZG9lc24ndCBoYXZlIGhlYWRlcmZpbGUKKyAgQHRyZWVwYXJzZXI6Om1lbWJlcnMgey4uLn0gLy8gZXJyb3I6IHRoaXMgaXMgbm90IGEgdHJlZSBwYXJzZXIKKyAgYQorICBAaW5pdCB7aW50IGk7fQorICAgIDogSUQKKyAgICA7CisgIElEIDogJ2EnLi4neic7CisKKyAgRm9yIG5vdywgdGhlIEphdmEgdGFyZ2V0IHVzZXMgbWVtYmVycyBhbmQgaGVhZGVyIGFzIGEgdmFsaWQgbmFtZS4gIFdpdGhpbiBhCisgIHJ1bGUsIHRoZSBpbml0IGFjdGlvbiBuYW1lIGlzIHZhbGlkLgorCisqIGNoYW5nZWQgJGR5bmFtaWNzY29wZS52YWx1ZSB0byAkZHluYW1pY3Njb3BlOjp2YWx1ZSBldmVuIGlmIHZhbHVlIGlzIGRlZmluZWQKKyAgaW4gc2FtZSBydWxlIHN1Y2ggYXMgJGZ1bmN0aW9uOjpuYW1lIHdoZXJlIHJ1bGUgZnVuY3Rpb24gZGVmaW5lcyBuYW1lLgorCisqICRkeW5hbWljc2NvcGUgZ2V0cyB5b3UgdGhlIHN0YWNrCisKKyogcnVsZSBzY29wZXMgZ28gbGlrZSB0aGlzIG5vdzoKKworICBydWxlCisgIHNjb3BlIHsuLi59CisgIHNjb3BlIHNsaXN0LFN5bWJvbHM7CisgIAk6IC4uLgorCTsKKworKiBDcmVhdGVkIFJ1bGVSZXR1cm5TY29wZSBhcyBhIGdlbmVyaWMgcnVsZSByZXR1cm4gdmFsdWUuICBNYWtlcyBpdCBlYXNpZXIKKyAgdG8gZG8gdGhpczoKKyAgICBSdWxlUmV0dXJuU2NvcGUgciA9IHBhcnNlci5wcm9ncmFtKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKHIuZ2V0VGVtcGxhdGUoKS50b1N0cmluZygpKTsKKworKiAkdGVtcGxhdGUsICR0cmVlLCAkc3RhcnQsIGV0Yy4uLgorCisqICRyLnggaW4gY3VycmVudCBydWxlLiAgJHIgaXMgaWdub3JlZCBhcyBmdWxseS1xdWFsaWZpZWQgbmFtZS4gJHIuc3RhcnQgd29ya3MgdG9vCisKKyogYWRkZWQgd2FybmluZyBhYm91dCAkciByZWZlcnJpbmcgdG8gYm90aCByZXR1cm4gdmFsdWUgb2YgcnVsZSBhbmQgZHluYW1pYyBzY29wZSBvZiBydWxlCisKKyogaW50ZWdyYXRlZCBTdHJpbmdUZW1wbGF0ZSBpbiBhIHZlcnkgc2ltcGxlIG1hbm5lcgorCitTeW50YXg6CistPiB0ZW1wbGF0ZShhcmdsaXN0KSAiLi4uIgorLT4gdGVtcGxhdGUoYXJnbGlzdCkgPDwuLi4+PgorLT4gbmFtZWRUZW1wbGF0ZShhcmdsaXN0KQorLT4ge2ZyZWUgZXhwcmVzc2lvbn0KKy0+IC8vIGVtcHR5CisKK1ByZWRpY2F0ZSBzeW50YXg6CithIDogQSBCIC0+IHtwMX0/IGZvbyhhPXskQS50ZXh0fSkKKyAgICAgICAgLT4ge3AyfT8gZm9vKGE9eyRCLnRleHR9KQorICAgICAgICAtPiAvLyByZXR1cm4gbm90aGluZworCitBbiBhcmcgbGlzdCBpcyBqdXN0IGEgbGlzdCBvZiB0ZW1wbGF0ZSBhdHRyaWJ1dGUgYXNzaWdubWVudHMgdG8gYWN0aW9ucyBpbiBjdXJsaWVzLgorCitUaGVyZSBpcyBhIHNldFRlbXBsYXRlTGliKCkgbWV0aG9kIGZvciB5b3UgdG8gdXNlIHdpdGggbmFtZWQgdGVtcGxhdGUgcmV3cml0ZXMuCisKK1VzZSBhIG5ldyBvcHRpb246CisKK2dyYW1tYXIgdDsKK29wdGlvbnMge291dHB1dD10ZW1wbGF0ZTt9CisuLi4KKworVGhpcyBhbGwgc2hvdWxkIHdvcmsgZm9yIHRyZWUgZ3JhbW1hcnMgdG9vLCBidXQgSSdtIHN0aWxsIHRlc3RpbmcuCisKKyogZml4ZWQgYnVncyB3aGVyZSBzdHJpbmdzIHdlcmUgaW1wcm9wZXJseSBlc2NhcGVkIGluIGV4Y2VwdGlvbnMsIGNvbW1lbnRzLCBldGMuLiAgRm9yIGV4YW1wbGUsIG5ld2xpbmVzIGNhbWUgb3V0IGFzIG5ld2xpbmVzIG5vdCB0aGUgZXNjYXBlZCB2ZXJzaW9uCisKKzMuMGVhNiAtIE5vdmVtYmVyIDEzLCAyMDA1CisKKyogdHVybmVkIG9mZiAtZGVidWcvLXByb2ZpbGUsIHdoaWNoIHdhcyBvbiBieSBkZWZhdWx0CisKKyogY29tcGxldGVseSByZWZhY3RvcmVkIHRoZSBvdXRwdXQgdGVtcGxhdGVzOyBhZGRlZCBzb21lIG1pc3NpbmcgdGVtcGxhdGVzLgorCisqIGRyYW1hdGljYWxseSBpbXByb3ZlZCBpbmZpbml0ZSByZWN1cnNpb24gZXJyb3IgbWVzc2FnZXMgKGFjdHVhbGx5CisgIGxlZnQtcmVjdXJzaW9uIG5ldmVyIGV2ZW4gd2FzIHByaW50ZWQgb3V0IGJlZm9yZSkuCisKKyogd2Fzbid0IHByaW50aW5nIGRhbmdsaW5nIHN0YXRlIG1lc3NhZ2VzIHdoZW4gaXQgcmVhbmFseXplcyB3aXRoIGs9MS4KKworKiBmaXhlZCBhIG5hc3R5IGJ1ZyBpbiB0aGUgYW5hbHlzaXMgZW5naW5lIGRlYWxpbmcgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24uCisgIFNwZW50IGFsbCBkYXkgdGhpbmtpbmcgYWJvdXQgaXQgYW5kIGNsZWFuZWQgdXAgdGhlIGNvZGUgZHJhbWF0aWNhbGx5LgorICBCdWcgZml4ZWQgYW5kIHNvZnR3YXJlIGlzIG1vcmUgcG93ZXJmdWwgYW5kIEkgdW5kZXJzdGFuZCBpdCBiZXR0ZXIhIDopCisKKyogaW1wcm92ZWQgdmVyYm9zZSBERkEgbm9kZXM7IG9yZ2FuaXplZCBieSBhbHQKKworKiBnb3QgbXVjaCBiZXR0ZXIgcmFuZG9tIHBocmFzZSBnZW5lcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAkIGphdmEgb3JnLmFudGxyLnRvb2wuUmFuZG9tUGhyYXNlIHNpbXBsZS5nIHByb2dyYW0KKyBpbnQgS3RjZG4gJzsnIG1ldGhvZCB3aCAnKCcgJyknICd7JyByZXR1cm4gNSAnOycgJ30nCisKKyogZW1wdHkgcnVsZXMgbGlrZSAiYSA6IDsiIGdlbmVyYXRlZCBjb2RlIHRoYXQgZGlkbid0IGNvbXBpbGUgZHVlIHRvCisgIHRyeS9jYXRjaCBmb3IgUmVjb2duaXRpb25FeGNlcHRpb24uICBHZW5lcmF0ZWQgY29kZSBjb3VsZG4ndCBwb3NzaWJseQorICB0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KKworKiB3aGVuIHByaW50aW5nIG91dCBhIGdyYW1tYXIsIHN1Y2ggYXMgaW4gY29tbWVudHMgaW4gZ2VuZXJhdGVkIGNvZGUsCisgIEFOVExSIGRpZG4ndCBwcmludCBhc3Qgc3VmZml4IHN0dWZmIGJhY2sgb3V0IGZvciBsaXRlcmFscy4KKworKiBUaGlzIG5ldmVyIGV4aXRlZCBsb29wOgorICBEQVRBIDogKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OiAuKiAnXG4nICkqICdcbicgJy4nIDsKKyAgYW5kIG5vdyBpdCB3b3JrcyBkdWUgdG8gbmV3IGRlZmF1bHQgbm9uZ3JlZWR5IC4qICBBbHNvIHRoaXMgd29ya3M6CisgIERBVEEgOiAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IC4qICdcbicgKSogJy4nIDsKKworKiBEb3Qgc3RhciAiLioiIHN5bnRheCBkaWRuJ3Qgd29yazsgaW4gbGV4ZXIgaXQgaXMgbm9uZ3JlZWR5IGJ5CisgIGRlZmF1bHQuICBJbiBwYXJzZXIgaXQgaXMgb24gZ3JlZWR5IGJ1dCBhbHNvIGs9MSBieSBkZWZhdWx0LiAgQWRkZWQKKyAgdW5pdCB0ZXN0cy4gIEFkZGVkIGJsb2cgZW50cnkgdG8gZGVzY3JpYmUuCisKKyogflQgd2hlcmUgVCBpcyB0aGUgb25seSB0b2tlbiB5aWVsZGVkIGFuIGVtcHR5IHNldCBidXQgbm8gZXJyb3IKKworKiBVc2VkIHRvIGdlbmVyYXRlIHVucmVhY2hhYmxlIG1lc3NhZ2UgaGVyZToKKworICBwYXJzZXIgZ3JhbW1hciB0OworICBhIDogSUQgYQorICAgIHwgSUQKKyAgICA7CisKKyAgei5nOjM6MTE6IFRoZSBmb2xsb3dpbmcgYWx0ZXJuYXRpdmVzIGFyZSB1bnJlYWNoYWJsZTogMgorCisgIEluIGZhY3QgaXQgc2hvdWxkIHJlYWxseSBiZSBhbiBlcnJvcjsgbm93IGl0IGdlbmVyYXRlczoKKworICBubyBzdGFydCBydWxlIGluIGdyYW1tYXIgdCAobm8gcnVsZSBjYW4gb2J2aW91c2x5IGJlIGZvbGxvd2VkIGJ5IEVPRikKKworICBQZXIgbmV4dCBjaGFuZ2UgaXRlbSwgQU5UTFIgY2Fubm90IGtub3cgdGhhdCBFT0YgZm9sbG93cyBydWxlICdhJy4KKworKiBhZGRlZCBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBBTlRMUiBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgeW91cgorICBzdGFydCBydWxlIGlzLiAgUmVxdWlyZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgY29kZSBpbiBzb21lIGNhc2VzLgorCisqIHZhbGlkYXRpbmcgc2VtYW50aWMgcHJlZGljYXRlcyBub3cgd29yayAoaWYgdGhleSBhcmUgZmFsc2UsIHRoZXkKKyAgdGhyb3cgYSBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uCisKKyogdHdvIGhpZGVvdXMgYnVnIGZpeGVzIGluIHRoZSBJbnRlcnZhbFNldCwgd2hpY2ggbWFkZSBhbmFseXNpcyBnbyB3cm9uZworICBpbiBhIGZldyBjYXNlcy4gIFRoYW5rcyB0byBPbGl2ZXIgWmVpZ2VybWFubiBmb3IgZmluZGluZyBsb3RzIG9mIGJ1Z3MKKyAgYW5kIG1ha2luZyBzdWdnZXN0ZWQgZml4ZXMgKGluY2x1ZGluZyB0aGUgbmV4dCB0d28gaXRlbXMpIQorCisqIGN5Y2xpYyBERkFzIGFyZSBub3cgbm9uc3RhdGljIGFuZCBoZW5jZSBjYW4gYWNjZXNzIGluc3RhbmNlIHZhcmlhYmxlcworCisqIGxhYmVscyBhcmUgbm93IGFsbG93ZWQgb24gbGV4aWNhbCBlbGVtZW50cyAoaW4gdGhlIGxleGVyKQorCisqIGFkZGVkIHNvbWUgaW50ZXJuYWwgZGVidWdnaW5nIG9wdGlvbnMKKworKiB+J2EnKiBhbmQgfignYScpKiB3ZXJlIG5vdCB3b3JraW5nIHByb3Blcmx5OyByZWZhY3RvcmVkIGFudGxyLmcgZ3JhbW1hcgorCiszLjBlYTUgLSBKdWx5IDUsIDIwMDUKKworKiBVc2luZyAnXG4nIGluIGEgcGFyc2VyIGdyYW1tYXIgcmVzdWx0ZWQgaW4gYSBub25lc2NhcGVkIHZlcnNpb24gb2YgJ1xuJyBpbiB0aGUgdG9rZW4gbmFtZXMgdGFibGUgbWFraW5nIGNvbXBpbGF0aW9uIGZhaWwuICBJIGZpeGVkIHRoaXMgYnkgcmVvcmdhbml6aW5nL2NsZWFuaW5nIHVwIHBvcnRpb24gb2YgQU5UTFIgdGhhdCBkZWFscyB3aXRoIGxpdGVyYWxzLiAgU2VlIGNvbW1lbnQgb3JnLmFudGxyLmNvZGVnZW4uVGFyZ2V0LgorCisqIFRhcmdldC5nZXRNYXhDaGFyVmFsdWUoKSBkaWQgbm90IHVzZSB0aGUgYXBwcm9wcmlhdGUgbWF4IHZhbHVlIGNvbnN0YW50LgorCisqIEFMTENIQVIgd2FzIGEgY29uc3RhbnQgd2hlbiBpdCBzaG91bGQgdXNlIHRoZSBUYXJnZXQgbWF4IHZhbHVlIGRlZi4gIHNldCBjb21wbGVtZW50IGZvciB3aWxkY2FyZCBhbHNvIGRpZG4ndCB1c2UgdGhlIFRhcmdldCBkZWYuICBHZW5lcmFsbHkgY2xlYW5lZCB1cCB0aGUgbWF4IGNoYXIgdmFsdWUgc3R1ZmYuCisKKyogQ29kZSBnZW4gZGlkbid0IGRlYWwgd2l0aCBBU1RMYWJlbFR5cGUgcHJvcGVybHkuLi5JIHRoaW5rIGV2ZW4gdGhlIDMuMGVhNyBleGFtcGxlIHRyZWUgcGFyc2VyIHdhcyBicm9rZW4hIDooCisKKyogQWRkZWQgYSBmZXcgbW9yZSB1bml0IHRlc3RzIGRlYWxpbmcgd2l0aCBlc2NhcGVkIGxpdGVyYWxzCisKKzMuMGVhNCAtIEp1bmUgMjksIDIwMDUKKworKiB0cmVlIHBhcnNlcnMgd29yazsgYWRkZWQgQ29tbW9uVHJlZU5vZGVTdHJlYW0uICBTZWUgc2ltcGxlY1RyZWVQYXJzZXIKKyAgZXhhbXBsZSBpbiBleGFtcGxlcy12MyB0YXJiYWxsLgorCisqIGFkZGVkIHN1cGVyQ2xhc3MgYW5kIEFTVExhYmVsVHlwZSBvcHRpb25zCisKKyogcmVmYWN0b3JlZCBQYXJzZXIgdG8gaGF2ZSBhIEJhc2VQYXJzZXIgYW5kIGFkZGVkIFRyZWVQYXJzZXIKKworKiBidWcgZml4OiBhY3Rpb25zIGJlaW5nIGR1bXBlZCBpbiBkZXNjcmlwdGlvbiBzdHJpbmdzOyBjb21waWxlIGVycm9ycworICByZXN1bHRlZAorCiszLjBlYTMgLSBKdW5lIDIzLCAyMDA1CisKK0VuaGFuY2VtZW50cworCisqIEF1dG9tYXRpYyB0cmVlIGNvbnN0cnVjdGlvbiBvcGVyYXRvcnMgYXJlIGluOiAhIF4gXl4KKworKiBUcmVlIGNvbnN0cnVjdGlvbiByZXdyaXRlIHJ1bGVzIGFyZSBpbgorCS0+IHtwcmVkMX0/IHJld3JpdGUxCisJLT4ge3ByZWQyfT8gcmV3cml0ZTIKKwkuLi4KKwktPiByZXdyaXRlTgorCisgIFRoZSByZXdyaXRlIHJ1bGVzIG1heSBiZSBlbGVtZW50cyBsaWtlIElELCBleHByLCAkbGFiZWwsIHtub2RlIGV4cHJ9CisgIGFuZCB0cmVlcyBeKCA8cm9vdD4gPGNoaWxkcmVuPiApLiAgWW91IGhhdmUgaGF2ZSAoLi4uKT8sICguLi4pKiwgKC4uLikrCisgIHN1YnJ1bGVzIGFzIHdlbGwuCisKKyAgWW91IG1heSBoYXZlIHJld3JpdGVzIGluIHN1YnJ1bGVzIG5vdCBqdXN0IGF0IG91dGVyIGxldmVsIG9mIHJ1bGUsIGJ1dAorICBhbnkgLT4gcmV3cml0ZSBmb3JjZXMgYXV0byBBU1QgY29uc3RydWN0aW9uIG9mZiBmb3IgdGhhdCBhbHRlcm5hdGl2ZQorICBvZiB0aGF0IHJ1bGUuCisKKyAgVG8gYXZvaWQgY3ljbGVzLCBjb3B5IHNlbWFudGljcyBhcmUgdXNlZDoKKworICByIDogSU5UIC0+IElOVCBJTlQgOworCisgIG1lYW5zIG1ha2UgdHdvIG5ldyBub2RlcyBmcm9tIHRoZSBzYW1lIElOVCB0b2tlbi4KKworICBSZXBlYXRlZCByZWZlcmVuY2VzIHRvIGEgcnVsZSBlbGVtZW50IGltcGxpZXMgYSBjb3B5IGZvciBhdCBsZWFzdCBvbmUKKyAgdHJlZToKKworICBhIDogYXRvbSAtPiBeKGF0b20gYXRvbSkgOyAvLyBOT1QgQ1lDTEUhIChkdXAgYXRvbSB0cmVlKQorCisqICRydWxlTGFiZWwudHJlZSByZWZlcnMgdG8gdHJlZSBjcmVhdGVkIGJ5IG1hdGNoaW5nIHRoZSBsYWJlbGVkIGVsZW1lbnQuCisKKyogQSBkZXNjcmlwdGlvbiBvZiB0aGUgYmxvY2tzL2FsdHMgaXMgZ2VuZXJhdGVkIGFzIGEgY29tbWVudCBpbiBvdXRwdXQgY29kZQorCisqIEEgdGltZXN0YW1wIC8gc2lnbmF0dXJlIGlzIHB1dCBhdCB0b3Agb2YgZWFjaCBnZW5lcmF0ZWQgY29kZSBmaWxlCisKKzMuMGVhMiAtIEp1bmUgMTIsIDIwMDUKKworQnVnIGZpeGVzCisKKyogU29tZSBlcnJvciBtZXNzYWdlcyB3ZXJlIG1pc3NpbmcgdGhlIHN0YWNrVHJhY2UgcGFyYW1ldGVyCisKKyogUmVtb3ZlZCB0aGUgZmlsZSBsb2NraW5nIG1lY2hhbmlzbSBhcyBpdCdzIG5vdCBjcm9zcyBwbGF0Zm9ybQorCisqIFNvbWUgYWJzb2x1dGUgdnMgcmVsYXRpdmUgcGF0aCBuYW1lIHByb2JsZW1zIHdpdGggd3JpdGluZyBvdXRwdXQKKyAgZmlsZXMuICBSdWxlcyBhcmUgbm93IG1vcmUgY29uY3JldGUuICAtbyBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZQorICAvLyAtbyAvdG1wIC92YXIvbGliL3QuZyA9PiAvdG1wL1QuamF2YQorICAvLyAtbyBzdWJkaXIvb3V0cHV0IC91c3IvbGliL3QuZyA9PiBzdWJkaXIvb3V0cHV0L1QuamF2YQorICAvLyAtbyAuIC91c3IvbGliL3QuZyA9PiAuL1QuamF2YQorICAvLyAtbyAvdG1wIHN1YmRpci90LmcgPT4gL3RtcC9zdWJkaXIvdC5nCisgIC8vIElmIHRoZXkgZGlkbid0IHNwZWNpZnkgYSAtbyBkaXIgc28ganVzdCB3cml0ZSB0byBsb2NhdGlvbgorICAvLyB3aGVyZSBncmFtbWFyIGlzLCBhYnNvbHV0ZSBvciByZWxhdGl2ZQorCisqIGRvZXMgZXJyb3IgY2hlY2tpbmcgb24gdW5rbm93biBvcHRpb24gbmFtZXMgbm93CisKKyogVXNpbmcganVzdCBsYW5ndWFnZSBjb2RlIG5vdCBsb2NhbGUgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZSBmaWxlLiAgSS5lLiwKKyAgdGhlIGRlZmF1bHQgKGFuZCBmb3IgYW55IEVuZ2xpc2ggc3BlYWtpbmcgbG9jYWxlKSBpcyBlbi5zdGcgbm90IGVuX1VTLnN0ZworICBhbnltb3JlLgorCisqIFRoZSBlcnJvciBtYW5hZ2VyIG5vdyBhc2tzIHRoZSBUb29sIHRvIHBhbmljIHJhdGhlciB0aGFuIHNpbXBseSBkb2luZworICBhIFN5c3RlbS5leGl0KCkuCisKKyogTG90cyBvZiByZWZhY3RvcmluZyBjb25jZXJuaW5nIGdyYW1tYXIsIHJ1bGUsIHN1YnJ1bGUgb3B0aW9ucy4gIE5vdworICBkZXRlY3RzIGludmFsaWQgb3B0aW9ucy4KKworMy4wZWExIC0gSnVuZSAxLCAyMDA1CisKK0luaXRpYWwgZWFybHkgYWNjZXNzIHJlbGVhc2UKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9jb25maWd1cmUuYWMgYi9hbnRsci0zLjQvcnVudGltZS9DL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Q5YzNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwyMTcgQEAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KKworQUNfSU5JVChsaWJhbnRscjNjLCAzLjQsIGppbWlAdGVtcG9yYWwtd2F2ZS5jb20pCitBQ19QUkVSRVEoMi42MCkKK0FDX0NPUFlSSUdIVChbCisgKFRoZSAiQlNEIGxpY2VuY2UiKQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK10pCitBQ19DT05GSUdfU1JDRElSKHNyYy9hbnRscjNwYXJzZXIuYykKKworCitBQ19BUkdfRU5BQkxFKFtkZWJ1Z2luZm9dLAorCQlbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRlYnVnaW5mb10sIFtDb21waWxlcyBkZWJ1ZyBpbmZvIGludG8gdGhlIGxpYnJhcnkgKGRlZmF1bHQgLS1kaXNhYmxlLWRlYnVnaW5mbyldKV0sCisJCVtdLCBbZW5hYmxlX2RlYnVnaW5mbz1ub10pCisKK0FDX0FSR19FTkFCTEUoWzY0Yml0XSwKKwkJW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS02NGJpdF0sIFtUdXJucyBvbiBmbGFncyB0aGF0IHByb2R1Y2UgNjQgYml0IG9iamVjdCBjb2RlIGlmIGFueSBhcmUgcmVxdWlyZWQgKGRlZmF1bHQgLS1kaXNhYmxlLTY0Yml0KV0pXSwKKwkJW10sIFtlbmFibGVfNjRiaXQ9bm9dKQorCitBQ19BUkdfRU5BQkxFKFthYmlmbGFnc10sCisJCVtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWFiaWZsYWdzXSwgW0RvZXMgbm90IGFkZCBBQkkgZmxhZ3MgLW0zMiBvciAtbTY0IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MsIHN1Y2ggYXMgaXRhbml1bSAzLnggKGRlZmF1bHQgLS1lbmFibGUtYWJpZmxhZ3M9eWVzKV0pXSwKKwkJW10sIFtlbmFibGVfYWJpZmxhZ3M9eWVzXSkKKworQUNfQVJHX0VOQUJMRShbYW50bHJkZWJ1Z10sCisJCVtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWFudGxyZGVidWddLCBbVHVybnMgb2ZmIGRlZmF1bHQgZmxhZ3MgdGhhdCBpbmNsdWRlIHRoZSBhbnRsciBkZWJ1Z2dlciBpbiB0aGUgcnVudGltZS4gU3BlY2lmeSB0byByZW1vdmUgZGVidWdnZXIgYW5kIHRoZSBzb2NrZXQgZGVwZW5kYW5jaWVzIChkZWZhdWx0IC0tZW5hYmxlLWFudGxyZGVidWcpXSldLAorCQlbXSwgW2VuYWJsZV9hbnRscmRlYnVnPXllc10pCisKK0FNX0lOSVRfQVVUT01BS0UoZm9yZWlnbikKK0FDX0xBTkcoQykKK0FDX1BST0dfQ0MoW3hsYyBhQ0MgZ2NjIGNjXSkKK0FNX01BSU5UQUlORVJfTU9ERQorQU1fUFJPR19MSUJUT09MCisKK0FDX0NBTk9OSUNBTF9CVUlMRAorQUNfQ0FOT05JQ0FMX0hPU1QKKworT0JKRUNUX01PREU9CisjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbXBpbGVyIGZsYWdzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgQU5UTFIgd2l0aCAkQ0MgQyBjb21waWxlciBvbiBob3N0ICRob3N0XSkKK1dBUk5GTEFHUz0KK2Nhc2UgJENDIGluCit4bGMqKQorIENQUENNTlRGTEFHUz0iLXFjcGx1c2NtdCIKKyBpZiB0ZXN0IHgiJGVuYWJsZV82NGJpdCIgPSB4eWVzOyB0aGVuCisgIENDRkxBR1M2ND0iLXE2NCAtV2wsLWI2NCIKKyAgT0JKRUNUX01PREU9IjY0IgorIGVsc2UKKyAgT0JKRUNUX01PREU9IjMyIgorIGZpCisgT1BUSU1GTEFHUz0iLU8yIgorIGlmIHRlc3QgeCIkZW5hYmxlX2RlYnVnaW5mbyIgPSB4eWVzOyB0aGVuCisgIERFQlVHRkxBR1M9Ii1nIgorIGZpCisgOzsKKworYUNDKikKKyBDUFBDTU5URkxBR1M9CisgaWYgdGVzdCB4IiRlbmFibGVfNjRiaXQiID0geHllczsgdGhlbgorICBDQ0ZMQUdTNjQ9IitERDY0IgorIGZpCisgT1BUSU1GTEFHUz0iLU8iCisgaWYgdGVzdCAkREVCVUdJTkYgPSAxOyB0aGVuCisgIERFQlVHRkxBR1M9Ii1nIgorIGZpCisgOzsKKworZ2NjKikKKyBDUFBDTU5URkxBR1M9CisgaWYgdGVzdCB4IiRlbmFibGVfNjRiaXQiID0geHllczsgdGhlbgorICBHQ0NBQklGTEFHUz0iLW02NCIKKyBlbHNlCisgIEdDQ0FCSUZMQUdTPSItbTMyIgorIGZpCisgaWYgdGVzdCB4IiRlbmFibGVfYWJpZmxhZ3MiID0geHllczsgdGhlbgorICBDQ0ZMQUdTNjQ9JEdDQ0FCSUZMQUdTCisgZmkKKyBPUFRJTUZMQUdTPSItTzIiCisgaWYgdGVzdCB4IiRlbmFibGVfZGVidWdpbmZvIiA9IHh5ZXM7IHRoZW4KKyAgREVCVUdGTEFHUz0iLWciCisgZmkKKyBXQVJORkxBR1M9LVdhbGwKKyA7OworCisqKQorCitjYXNlICRob3N0IGluCitzcGFyYyotKnNvbGFyaXMqKQorIENQUENNTlRGTEFHUz0KKyBpZiB0ZXN0IHgiJGVuYWJsZV82NGJpdCIgPSB4eWVzOyB0aGVuCisgIENDRkxBR1M2ND0iLWZhc3QgLXh0YXJnZXQ9dWx0cmE0IC1tNjQgLXhhcmNoPXNwYXJjdmlzIgorIGZpCisgT1BUSU1GTEFHUz0iLU8iCisgaWYgdGVzdCB4IiRlbmFibGVfZGVidWdpbmZvIiA9IHh5ZXM7IHRoZW4KKyAgREVCVUdGTEFHUz0nLWcnCisgZmkKKyA7OworCisqKQorIENQUENNTlRGTEFHUz0KKyBDQ0ZMQUdTNjQ9CisgT1BUSU1GTEFHUz0iLU8iCisgaWYgdGVzdCB4IiRlbmFibGVfZGVidWdpbmZvIiA9IHh5ZXM7IHRoZW4KKyAgREVCVUdGTEFHUz0nLWcnCisgZmkKKyA7OworZXNhYworCisgOzsKK2VzYWMKKworQ0ZMQUdTPSIkQ0NGTEFHUzY0ICRDUFBDTU5URkxBR1MgJE9QVElNRkxBR1MgJERFQlVHRkxBR1MgJFdBUk5GTEFHUyIKK0FDX01TR19SRVNVTFQoWyRDRkxBR1NdKQorQUNfU1VCU1QoW09CSkVDVF9NT0RFXSkKKworQVNfSUYoW3Rlc3QgIngkZW5hYmxlX2FudGxyZGVidWciID0geG5vXSwgW0FDX0RFRklORShbQU5UTFIzX05PREVCVUdHRVJdLCBbMV0sIFtEZWZpbmUgaWYgQU5UTFIgZGVidWdnZXIgbm90IHJlcXVpcmVkXSldLCBbXSkKK0FTX0lGKFt0ZXN0IHgiJGVuYWJsZV82NGJpdCIgPSB4eWVzXSwgW0FDX0RFRklORShbQU5UTFIzX1VTRV82NEJJVF0sIFsxXSwgW0RlZmluZSBpZiA2NCBiaXQgbW9kZSByZXF1aXJlZF0pXSwgW10pCisKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19MTl9TCitBQ19QUk9HX01BS0VfU0VUCisKKyMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCisKKyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19JTkNMVURFU19ERUZBVUxUKCkKK0FDX0hFQURFUl9SRVNPTFYKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9tYWxsb2MuaCBtYWxsb2MuaF0sIFtdLCBbXSwKK1tbI2lmZGVmIEhBVkVfU1lTX01BTExPQ19ICisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9NQUxMT0NfSAorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2VuZGlmCitdXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N0ZGFyZy5oXSwgW10sIFtdLAorW1sjaWZkZWYgSEFWRV9TVERBUkdfSAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2VuZGlmCitdXSkKKworQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3N0YXQuaF0sIFtdLCBbXSwKK1tbI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKK11dKQorCitBQ19DSEVDS19IRUFERVJTKFtjdHlwZS5oXSwgW10sIFtdLAorW1sjaWZkZWYgSEFWRV9DVFlQRV9ICisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorXV0pCisKK0FDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvdGNwLmhdLCBbXSwgW10sCitbWyNpZmRlZiBIQVZFX05FVElORVRfVENQX0gKKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCitdXSkKKworQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3NvY2tldC5oIHNvY2tldC5oXSwgW10sIFtdLAorW1sjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NPQ0tFVF9ICisjaW5jbHVkZSA8c29ja2V0Lmg+CisjZW5kaWYKK11dKQorCisjIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3MuCitBQ19DX0NPTlNUCitBQ19UWVBFX1NJWkVfVAorQUNfVFlQRV9JTlQ4X1QKK0FDX1RZUEVfSU5UMTZfVAorQUNfVFlQRV9JTlQzMl9UCitBQ19UWVBFX0lOVDY0X1QKK0FDX1RZUEVfSU5UUFRSX1QKK0FDX1RZUEVfVUlOVDhfVAorQUNfVFlQRV9VSU5UMTZfVAorQUNfVFlQRV9VSU5UMzJfVAorQUNfVFlQRV9VSU5UNjRfVAorQUNfVFlQRV9VSU5UUFRSX1QKK0FDX0NfSU5MSU5FCisKKworIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfQ0hFQ0tfRlVOQ1MoW21lbW1vdmUgbWVtc2V0IHN0cmR1cCBhY2NlcHRdKQorCitBQ19DT05GSUdfTUFDUk9fRElSKFttNF0pCisKK0FDX0NPTkZJR19IRUFERVJTKGFudGxyM2NvbmZpZy5oKQorQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZV0pCitBQ19PVVRQVVQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvZGlzdC9saWJhbnRscjNjLTMuNC50YXIuZ3ogYi9hbnRsci0zLjQvcnVudGltZS9DL2Rpc3QvbGliYW50bHIzYy0zLjQudGFyLmd6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWIzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2Rpc3QvbGliYW50bHIzYy0zLjQudGFyLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWZpbGUgYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWY2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlmaWxlCkBAIC0wLDAgKzEsMTY1OSBAQAorIyBEb3h5ZmlsZSAxLjcuMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdAorIworIyBBbGwgdGV4dCBhZnRlciBhIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQKKyMgVGhlIGZvcm1hdCBpczoKKyMgICAgICAgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzICgiICIpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlIAorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIAorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIAorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIAorIyBieSBxdW90ZXMpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBwcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gQU5UTFIzQworCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gMy4zLjEKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIAorIyBiYXNlIHBhdGggd2hlcmUgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIAorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBhcGkKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSAKKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCAKKyMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiAKKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mIAorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgCisjIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbCAKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMgCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4gCisjIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2gsIG90aGVyIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOiAKKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwgCisjIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRXNwZXJhbnRvLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIAorIyBHcmVlaywgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCAKKyMgbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLCAKKyMgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGljLCBTbG92YWssIAorIyBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBVa3JhaW5pYW4sIGFuZCBWaWV0bmFtZXNlLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiAKKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuIAorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kIAorIyB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gCisjIE5vdGU6IGlmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUgCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciAKKyMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgCisjIGluIHRoaXMgbGlzdCwgaWYgZm91bmQgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUgCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMgCisjIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiAKKyMgSWYgbGVmdCBibGFuaywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCIkbmFtZSIgaXMgYXV0b21hdGljYWxseSAKKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiIAorIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiIAorIyAicmVwcmVzZW50cyIgImEiICJhbiIgInRoZSIKKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4gCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYgCisjIGRlc2NyaXB0aW9uLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwgCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZSAKKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQgCisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgCisjIHBhdGggYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0IAorIyB0byBOTyB0aGUgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZC4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZyAKKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzIAorIyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQgcGFydCBvZiAKKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LiAKKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgCisjIHBhdGggdG8gc3RyaXAuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSAKKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiAKKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzIAorIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIAorIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIAorIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdCAKKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIAorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUgCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jIAorIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAKKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSAKKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIGNvbW1lbnRzIAorIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbiAKKyMgdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIAorIyBjb21tZW50cykgYXMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4gCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCAKKyMgZGVzY3JpcHRpb24uIFNldCB0aGlzIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW91ciBpbnN0ZWFkLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhbiB1bmRvY3VtZW50ZWQgCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IAorIyByZS1pbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSAKKyMgYSBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCAKKyMgYmUgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIAorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMgCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiAKKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0byAKKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoIAorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4gCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLgorCitBTElBU0VTICAgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyAKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLiAKKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCAKKyMgb2YgYWxsIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBZRVMKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgCisjIEphdmEuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkIAorIyBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4gCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgCisjIEZvcnRyYW4uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETCAKKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIAorIyBWSERMLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0IAorIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbiBleHRlbnNpb24uIAorIyBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdCB1c2luZyB0aGlzIAorIyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kIGxhbmd1YWdlIAorIyBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwgSmF2YXNjcmlwdCwgQ1NoYXJwLCBDLCAKKyMgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwsIEMsIEMrKy4gRm9yIGluc3RhbmNlIHRvIG1ha2UgCisjIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIAorIyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgCisjIHlvdSBhbHNvIG5lZWQgdG8gc2V0IEZJTEVfUEFUVEVSTlMgb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90IHJlYWQgYnkgZG94eWdlbi4KKworRVhURU5TSU9OX01BUFBJTkcgICAgICA9IAorCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQgCisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCAKKyMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZCAKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4gCisjIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIAorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIAorIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuIAorIyBEb3h5Z2VuIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgCisjIGluc3RlYWQgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUgZ2V0dGVyIAorIyBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkgCisjIHdpbGwgbWFrZSBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24uIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIAorIyBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSAKKyMgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQyAKKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdCAKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0IAorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIAorIyB0aGUgc2FtZSB0eXBlIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYSAKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIAorIyB0aGUgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4KKworU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IgZW51bSAKKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvIAorIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QgCisjIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsIAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgCisjIGJlIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kIAorIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTworCisjIFRoZSBTWU1CT0xfQ0FDSEVfU0laRSBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSB1c2UgdG8gCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLiAKKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suIAorIyBGb3Igc21hbGwgdG8gbWVkaXVtIHNpemUgcHJvamVjdHMgKDwxMDAwIGlucHV0IGZpbGVzKSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UgCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZSAKKyMgY2F1c2luZyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsaXR5LiAKKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlIAorIyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIG1vcmUgc3ltYm9scyBpbiBtZW1vcnkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgd29ya3Mgb24gCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnbHkgZG91YmxlIHRoZSAKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IAorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCAKKyMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMKKworU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbiAKKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIAorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIAorIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyAKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIAorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gCisjIElmIHNldCB0byBOTyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwgCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4gCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZSAKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkIAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIAorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgCisjIGFub255bW91cyBuYW1lc3BhY2UgYXJlIGhpZGRlbi4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIAorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbCAKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIAorIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLiAKKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIAorIyBkb2N1bWVudGF0aW9uLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueSAKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiAKKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCAKKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuIAorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBEb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSAKKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvIAorIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyIAorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MgCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIAorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBwdXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gCisjIG9mIHRoYXQgZmlsZS4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gCisjIHdpbGwgbGlzdCBpbmNsdWRlIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiAKKyMgcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXSAKKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSAKKyMgYnJpZWYgZG9jdW1lbnRhdGlvbiBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgCisjIGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiAKKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgc29ydCB0aGUgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgCisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgCisjIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkgCisjIFNPUlRfTUVNQkVSX0RPQ1MgYW5kIFNPUlRfQlJJRUZfRE9DUy4gCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PIAorIyBhbmQgaWdub3JlZCBmb3IgZGV0YWlsZWQgZG9jcyBpZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTy4KKworU09SVF9NRU1CRVJTX0NUT1JTXzFTVCA9IE5PCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIAorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIAorIyBOTyAodGhlIGRlZmF1bHQpLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4gCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuIAorIyBOb3RlOiBUaGlzIG9wdGlvbiBhcHBsaWVzIG9ubHkgdG8gdGhlIGNsYXNzIGxpc3QsIG5vdCB0byB0aGUgCisjIGFscGhhYmV0aWNhbCBsaXN0LgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciAKKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyAKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciAKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgCisjIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCAKKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgZGVmaW5lIGNvbnNpc3RzIG9mIGZvciBpdCB0byBhcHBlYXIgaW4gCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCAKKyMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiAKKyMgVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluaXRpYWxpemVyIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBkZWZpbmVzIGluIHRoZSAKKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgCisjIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCAKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZSAKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIHNvdXJjZXMgaW4geW91ciBwcm9qZWN0IGFyZSBkaXN0cmlidXRlZCBvdmVyIG11bHRpcGxlIGRpcmVjdG9yaWVzIAorIyB0aGVuIHNldHRpbmcgdGhlIFNIT1dfRElSRUNUT1JJRVMgdGFnIHRvIFlFUyB3aWxsIHNob3cgdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgCisjIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyBOTy4KKworU0hPV19ESVJFQ1RPUklFUyAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4gCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSAKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIAorIyBOYW1lc3BhY2VzIHBhZ2UuICBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IAorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0IAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20gCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYSAKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZiAKKyMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUgCisjIHByb3ZpZGVkIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgCisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQgCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkIAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRoZSBjcmVhdGUgdGhlIGxheW91dCBmaWxlIAorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uIAorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIAorIyBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIAorIyBOTyBpcyB1c2VkLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsIAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvciAKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSAKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCAKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBhYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIAorIyBmdW5jdGlvbnMgdGhhdCBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycyAKKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIAorIyBkb2N1bWVudGF0aW9uLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gWUVTCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCAKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgCisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIAorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAKKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIAorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikKKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyAKKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiAKKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gZG9jd2Fybi50eHQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3IgCisjIGRpcmVjdG9yaWVzIGxpa2UgIi91c3Ivc3JjL215cHJvamVjdCIuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyAKKyMgd2l0aCBzcGFjZXMuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBzcmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGRveHlnZW4KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcyAKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLCB3aGljaCBpcyAKKyMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQgCisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgCisjIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IAorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6IAorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaCAqLmh4eCAKKyMgKi5ocHAgKi5oKysgKi5pZGwgKi5vZGwgKi5jcyAqLnBocCAqLnBocDMgKi5pbmMgKi5tICoubW0gKi5weSAqLmY5MAorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmN4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouYysrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouamF2YSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5paSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5peHggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaXBwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmkrKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pbmwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oeHggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaHBwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmgrKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pZGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoub2RsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnBocCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5waHAzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmluYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5tIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm1tIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmRveCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5weQorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyAKKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIAorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhIAorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9IAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZXN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQgCisjIGZyb20gdGhlIGlucHV0LgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlIAorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgCisjIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0byBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIAorIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IAorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzIAorIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSAKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlIAorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLCAKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0gCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciAKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSAKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUgCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCAKKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlIAorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUgCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuIAorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIAorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0gCisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZCAKKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbSAKKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPiAKKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIAorIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMgCisjIHRvIHN0YW5kYXJkIG91dHB1dC4gIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUgCisjIGlnbm9yZWQuCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuIAorIyBiYXNpcy4gIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZSAKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guICBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiAKKyMgcGF0dGVybj1maWx0ZXIgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSwgSU5QVVRfRklMVEVSIAorIyBpcyBhcHBsaWVkIHRvIGFsbCBmaWxlcy4KKworRklMVEVSX1BBVFRFUk5TICAgICAgICA9IAorCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcgCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlIAorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsIAorIyBiZSBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4gCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgYWxzbyAKKyMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IAorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QgCisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZSAKKyMgZnJhZ21lbnRzLiBOb3JtYWwgQyBhbmQgQysrIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCAKKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgCisjIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyAKKyMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgCisjIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIAorIyBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsIAorIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gIE90aGVyd2lzZSB0aGV5IHdpbGwgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSAKKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIAorIyBidWlsdC1pbiBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlIAorIyB0YWdnaW5nIHN5c3RlbSAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3UgCisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3IgCisjIHdoaWNoIGFuIGluY2x1ZGUgaXMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4IAorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCAKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4gCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyAKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIAorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiAKKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdCAKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gLgorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuayAKKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3IgCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSAKKyMgc3RhbmRhcmQgaGVhZGVyLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yIAorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGZvb3Rlci4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIAorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIAorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIGNvcHkgCisjIHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHNvIGRvbid0IHB1dCB5b3VyIG93biAKKyMgc3R5bGVzaGVldCBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGFzIHdlbGwsIG9yIGl0IHdpbGwgYmUgZXJhc2VkIQorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIAorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIAorIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsIAorIyBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIAorIyBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAKKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4gCisjIFRoZSBhbGxvd2VkIHJhbmdlIGlzIDAgdG8gMzU5LgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIAorIyB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIAorIyBncmF5c2NhbGVzIG9ubHkuIEEgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIAorIyB0aGUgbHVtaW5hbmNlIGNvbXBvbmVudCBvZiB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gVmFsdWVzIGJlbG93IAorIyAxMDAgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSAKKyMgdGhlIG91dHB1dCBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIAorIyBzbyA4MCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMC44LCBUaGUgdmFsdWUgMjIwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAyLjIsIAorIyBhbmQgMTAwIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2FtbWEuCisKK0hUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MAorCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTCAKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIAorIyB0aGlzIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKworSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0FMSUdOX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGNsYXNzZXMsIAorIyBmaWxlcyBvciBuYW1lc3BhY2VzIHdpbGwgYmUgYWxpZ25lZCBpbiBIVE1MIHVzaW5nIHRhYmxlcy4gSWYgc2V0IHRvIAorIyBOTyBhIGJ1bGxldCBsaXN0IHdpbGwgYmUgdXNlZC4KKworSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwgCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlIAorIyBwYWdlIGhhcyBsb2FkZWQuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgCisjIEphdmFTY3JpcHQgYW5kIERIVE1MIGlzIHJlcXVpcmVkIChmb3IgaW5zdGFuY2UgTW96aWxsYSAxLjArLCBGaXJlZm94IAorIyBOZXRzY2FwZSA2LjArLCBJbnRlcm5ldCBleHBsb3JlciA1LjArLCBLb25xdWVyb3IsIG9yIFNhZmFyaSkuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyAKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4gCisjIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBNYWtlZmlsZSBpbiB0aGUgCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQgCisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbiAKKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIAorIyBpdCBhdCBzdGFydHVwLiAKKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwgCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIAorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgCisjIGNhbiBiZSBncm91cGVkLgorCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCisKKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IAorIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSAKKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiAKKyMgd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KKworRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBXaGVuIEdFTkVSQVRFX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IAorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSAKKyMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBHRU5FUkFURV9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlIAorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pIAorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdSAKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlIAorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiAKKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biAKKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnIAorIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdCAKKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9JTkRFWF9FTkNPRElORyAKKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZSAKKyMgY29udGVudC4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZyAKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYSAKKyMgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQgCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgCisjIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSAKKyMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIAorIyBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8gdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIAorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIAorIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZQorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8gCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSAKKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycworCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0gCisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgCisjIGN1c3RvbSBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIAorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj4gCisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzIAorIyBwcm9qZWN0J3MgCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIAorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzIj4gCisjIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzIHFoZWxwZ2VuZXJhdG9yLiAKKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQgCisjIC5xaHAgZmlsZS4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyAgCisjIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGljaCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCBmb3JtIGFuIEVjbGlwc2UgaGVscCAKKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cyAKKyMgbWVudSBpbiBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgCisjIGZpbGVzIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiAKKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyAKKyMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLiBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZSAKKyMgdGhlIGhlbHAgYXBwZWFycy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luIAorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUgCisjIHRoaXMgbmFtZS4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCBhdCAKKyMgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQgCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuCisKK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIChyYW5nZSBbMS4uMjBdKSAKKyMgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleCAKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uIAorIyBJZiB0aGUgdGFnIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZCAKKyMgY29udGFpbmluZyBhIHRyZWUtbGlrZSBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgCisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyAKKyMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuIAorIyBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBIVE1MIGhlbHAgZmVhdHVyZS4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIEJ5IGVuYWJsaW5nIFVTRV9JTkxJTkVfVFJFRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgR3JvdXBzLCBEaXJlY3RvcmllcywgCisjIGFuZCBDbGFzcyBIaWVyYXJjaHkgcGFnZXMgdXNpbmcgYSB0cmVlIHZpZXcgaW5zdGVhZCBvZiBhbiBvcmRlcmVkIGxpc3QuCisKK1VTRV9JTkxJTkVfVFJFRVMgICAgICAgPSBOTworCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIAorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgCisjIGlzIHNob3duLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMzAwCisKKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3BlbiAKKyMgbGlua3MgdG8gZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGF0ZXggZm9ybXVsYXMgaW5jbHVkZWQgCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0IAorIyB3aGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZG94eWdlbiBydW4geW91IG5lZWQgCisjIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IAorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMgCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIAorIyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuIAorIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMgCisjIGluIHRoZSBIVE1MIG91dHB1dCBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuCisKK0ZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCAKKyMgZm9yIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQgCisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyAKKyMgSFRNTCBoZWxwIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgCisjIChHRU5FUkFURV9ET0NTRVQpIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkIAorIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIAorIyBjYW4gYmUgc2xvdywgdGhlbiBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLgorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUgCisjIGltcGxlbWVudGVkIHVzaW5nIGEgUEhQIGVuYWJsZWQgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGF0IHRoZSB3ZWIgY2xpZW50IAorIyB1c2luZyBKYXZhc2NyaXB0LiBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIHNlYXJjaCBQSFAgc2NyaXB0IGFuZCBpbmRleCAKKyMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlciAKKyMgYmFzZWQgYXBwcm9hY2ggaXMgdGhhdCBpdCBzY2FsZXMgYmV0dGVyIHRvIGxhcmdlIHByb2plY3RzIGFuZCBhbGxvd3MgCisjIGZ1bGwgdGV4dCBzZWFyY2guIFRoZSBkaXNhZHZhbmNlcyBpcyB0aGF0IGl0IGlzIG1vcmUgZGlmZmljdWx0IHRvIHNldHVwIAorIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuCisKK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSAKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlIAorIyBpbnZva2VkLiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGNvbW1hbmQgbmFtZS4gCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIAorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgCisjIE1ha2VmaWxlIHRoYXQgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIAorIyBnZW5lcmF0ZSBpbmRleCBmb3IgTGFUZVguIElmIGxlZnQgYmxhbmsgYG1ha2VpbmRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSAKKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgCisjIExhVGVYIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCAKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBhNHdpZGUsIGxldHRlciwgbGVnYWwgYW5kIAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVggCisjIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuCisKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciAKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIAorIyB0aGUgZmlyc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSAKKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKworTEFURVhfSEVBREVSICAgICAgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIAorIyBpcyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBwZGYgKHVzaW5nIHBzMnBkZikuIFRoZSBwZGYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcyAKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAKKyMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYSAKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLiAKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCAKKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiAKKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgCisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSAKKyMgaW4gdGhlIG91dHB1dC4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgTEFURVhfU09VUkNFX0NPREUgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIAorIyBzb3VyY2UgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4gCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MgCisjIHN1Y2ggYXMgU09VUkNFX0JST1dTRVIuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dCAKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aCAKKyMgb3RoZXIgUlRGIHJlYWRlcnMgb3IgZWRpdG9ycy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IAorIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byAKKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCAKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXIgCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLiAKKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyAKKyMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSAKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuIAorIyBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBZRVMKKworIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gCisjIHRoZSBnZW5lcmF0ZWQgbWFuIHBhZ2VzIChkZWZhdWx0IGlzIHRoZSBzdWJyb3V0aW5lJ3Mgc2VjdGlvbiAuMykKKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgRG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwgCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgCisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgCisjIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dCB0aGVtIHRoZSBtYW4gY29tbWFuZCAKKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSAKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGB4bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCisKKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIHNjaGVtYSwgCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSAKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPSAKKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELCAKKyMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIAorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyAKKyMgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0byB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IAorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlIAorIyB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCAKKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSAKKyMgbW9tZW50LgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgCisjIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIAorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIAorIyBuaWNlbHkgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuICBUaGlzIGlzIHVzZWZ1bCAKKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciAKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgCisjIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIAorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyAKKyMgbmFtZXMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IGNvbmRpdGlvbmFsIAorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCAKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyAKKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgCisjIFBSRURFRklORUQgYW5kIEVYUEFORF9BU19ERUZJTkVEIHRhZ3MuCisKK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBOTworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMgCisjIGluIHRoZSBJTkNMVURFX1BBVEggKHNlZSBiZWxvdykgd2lsbCBiZSBzZWFyY2ggaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdCAKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieSAKKyMgdGhlIHByZXByb2Nlc3Nvci4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUgCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIAorIyBiZSB1c2VkLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCAKKyMgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mIAorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIAorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUgCisjIG9taXR0ZWQgPTEgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyAKKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvciAKKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiAKKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIAorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gCisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiAKKyMgZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsIHJlbW92ZSBhbGwgZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgCisjIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggCisjIGZ1bmN0aW9uIG1hY3JvcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlIAorIyB0aGUgcGFyc2VyIGlmIG5vdCByZW1vdmVkLgorCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4gCisjIE9wdGlvbmFsbHkgYW4gaW5pdGlhbCBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiAKKyMgY2FuIGJlIGFkZGVkIGZvciBlYWNoIHRhZ2ZpbGUuIFRoZSBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0IAorIyB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6IAorIyAgIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uIAorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOiAKKyMgICBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uIAorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgCisjIFVSTHMuIElmIGEgbG9jYXRpb24gaXMgcHJlc2VudCBmb3IgZWFjaCB0YWcsIHRoZSBpbnN0YWxsZG94IHRvb2wgCisjIGRvZXMgbm90IGhhdmUgdG8gYmUgcnVuIHRvIGNvcnJlY3QgdGhlIGxpbmtzLiAKKyMgTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgCisjICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwYXRoKSAKKyMgSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gCisjIGlzIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIAorIyBhIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLgorCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZCAKKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgCisjIHdpbGwgYmUgbGlzdGVkLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQgCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsIAorIyBiZSBsaXN0ZWQuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQgCisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4KKworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIAorIyBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IAorIyB0aGlzIG9wdGlvbiBpcyBzdXBlcnNlZGVkIGJ5IHRoZSBIQVZFX0RPVCBvcHRpb24gYmVsb3cuIFRoaXMgaXMgb25seSBhIAorIyBmYWxsYmFjay4gSXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUgCisjIHBvd2VyZnVsIGdyYXBocy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjIAorIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUgCisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIAorIyBkZWZhdWx0IHNlYXJjaCBwYXRoLgorCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzIAorIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbiAKKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiAKKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgCisjIGFsbG93ZWQgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIAorIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCAKKyMgZXhwbGljaXRseSB0byBhIHZhbHVlIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZSAKKyMgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZyBzcGVlZC4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB3cml0ZSBhIGZvbnQgY2FsbGVkIEZyZWVTYW5zLnR0ZiB0byB0aGUgb3V0cHV0IAorIyBkaXJlY3RvcnkgYW5kIHJlZmVyZW5jZSBpdCBpbiBhbGwgZG90IGZpbGVzIHRoYXQgZG94eWdlbiBnZW5lcmF0ZXMuIFRoaXMgCisjIGZvbnQgZG9lcyBub3QgaW5jbHVkZSBhbGwgcG9zc2libGUgdW5pY29kZSBjaGFyYWN0ZXJzIGhvd2V2ZXIsIHNvIHdoZW4geW91IG5lZWQgCisjIHRoZXNlIChvciBqdXN0IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQpIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIAorIyB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIAorIyB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgCisjIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgCisjIGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBGcmVlU2Fucy50dGYKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4gCisjIFRoZSBkZWZhdWx0IHNpemUgaXMgMTBwdC4KKworRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIGxvb2sgZm9yIHRoZSAKKyMgRnJlZVNhbnMudHRmIGZvbnQgKHdoaWNoIGRveHlnZW4gd2lsbCBwdXQgdGhlcmUgaXRzZWxmKS4gSWYgeW91IHNwZWNpZnkgYSAKKyMgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCAKKyMgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCisKK0RPVF9GT05UUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIAorIyBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIAorIyB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIAorIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZ3JvdXBzLCBzaG93aW5nIHRoZSBkaXJlY3QgZ3JvdXBzIGRlcGVuZGVuY2llcworCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQgCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nIAorIyBMYW5ndWFnZS4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIAorIyByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGluc3RhbmNlcy4KKworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVCAKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIAorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQgCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCAKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IgCisjIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuCisKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0FMTF9HUkFQSCBhbmQgSEFWRV9ET1Qgb3B0aW9ucyBhcmUgc2V0IHRvIFlFUyB0aGVuIAorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiAKKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIAorIyB0aGUgdGltZSBvZiBhIHJ1bi4gU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMgCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIAorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIAorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIgCisjIGdyYXBocyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIGdyYXBoaWNhbCBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCisKKyMgSWYgdGhlIERJUkVDVE9SWV9HUkFQSCwgU0hPV19ESVJFQ1RPUklFUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyAKKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcyAKKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIAorIyByZWxhdGlvbnMgYmV0d2VlbiB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMgCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgcG5nLCBqcGcsIG9yIGdpZiAKKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgVGhlIHRhZyBET1RfUEFUSCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUgCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQgCisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIAorIyBcZG90ZmlsZSBjb21tYW5kKS4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIAorIyBub2RlcyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMgCisjIHZpc3VhbGl6ZWQgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSAKKyMgbnVtYmVyIG9mIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbiAKKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZSAKKyMgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgCisjIGdyYXBocyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSAKKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMgCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyAKKyMgb3B0aW9uIHRvIDEgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSAKKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IAorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50IAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3QgCisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIAorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZiAKKyMgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvIHJlYWQpLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dCAKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcyAKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkgCisjIHN1cHBvcnQgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBZRVMKKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIAorIyBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQgZ3JhcGhzLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSAKKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vYXRzZWN0aW9ucy5kb3ggYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vYXRzZWN0aW9ucy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0ZWExMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9hdHNlY3Rpb25zLmRveApAQCAtMCwwICsxLDE0MyBAQAorLy8vIFxwYWdlIGF0c2VjdGlvbnMgVXNpbmcgU2VjdGlvbnMgV2l0aGluIEdyYW1tYXIgRmlsZXMKKy8vLworLy8vIFxzZWN0aW9uIGludHJvIEludHJvZHVjdGlvbgorLy8vCisvLy8gQSBDIHRhcmdldGVkIGdyYW1tYXIgY2FuIG1ha2UgdXNlIG9mIHNwZWNpYWwgYW5ub3RhdGlvbnMgd2l0aGluIGEgZ3JhbW1hcgorLy8vIGZpbGUsIHdoaWNoIGFyZSBwcmVmaXhlZCB3aXRoIHRoZSA8Yj5cQDwvYj4gY2hhcmFjdGVyLiBUaGVzZSBzZWN0aW9ucyBjYXVzZSB0aGUgCisvLy8gdGhlIHBsYWNlbWVudCBvZiB0aGVpciBjb250ZW50cyB3aXRoaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGF0IGRlZmluZWQgcG9pbnRzCisvLy8gc3VjaCBhcyB3aXRoaW4gdGhlIGdlbmVyYXRlZCBDIGhlYWRlciBmaWxlLgorLy8vCisvLy8gVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGVzZSBhbm5vdGF0aW9ucyBpczoKKy8vLworLy8vIFxjb2RlCisvLy8gc2VjdGlvbgorLy8vICAgOiAnQCcgKCggJ3BhcnNlcicgfCAnbGV4ZXInICkgJzo6Jyk/IFNFQ1RJT05OQU1FICd7JyB5b3VyY29kZSAnfScKKy8vLyAgIDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gSWYgdGhlICdwYXJzZXInIG9yIGxleGVyIGtleXdvcmRzIGFyZSBsZWZ0IG91dCBvZiB0aGUgc3BlY2lmaWNhdGlvbiwgdGhlbiB0aGUKKy8vLyBBTlRMUiB0b29sIGFzc3VtZXMgYSBsZXhlciB0YXJnZXQgZm9yIGEgbGV4ZXIgZ3JhbW1hciwgYSBwYXJzZXIgdGFyZ2V0IGZvciBhIHBhcnNlcgorLy8vIG9yIHRyZWUgcGFyc2VyIGdyYW1tYXIsIGFuZCBhIHBhcnNlciB0YXJnZXQgZm9yIGEgY29tYmluZWQgbGV4ZXIvcGFyc2VyIGdyYW1tYXIuIFlvdQorLy8vIGFyZSBhZHZpc2VkIGFzIGEgbWF0dGVyIG9mIGNvdXJzZSB0byBpbmNsdWRlIHRoZSBwYXJzZXIgb3IgbGV4ZXIgdGFyZ2V0IGtleXdvcmQuCisvLy8KKy8vLyBEb2N1bWVudGF0aW9uIHJlZ2FyZGluZyB0aGUgXEBzZWN0aW9ucyBhdmFpbGFibGUgZm9yIGEgZ3JhbW1hciB0YXJnZXRlZCBhdCBDIG5vdworLy8vIGZvbGxvd3MuCisvLy8KKy8vLyBcc3Vic2VjdGlvbiBwc3Jpbml0IFNlY3Rpb25zIFxAaW5pdCBhbmQgXEBkZWNsYXJhdGlvbnMKKy8vLworLy8vIEphdmEgdGFyZ2V0ZWQgZ3JhbW1hcnMgYWxsb3cgdGhlIHNwZWNpYWwgc2VjdGlvbiA8Y29kZT5cQGluaXQ8L2NvZGU+IHRvIGJlIHBsYWNlZCBhZnRlciB0aGUgZGVjbGFyYXRpb24KKy8vLyBvZiBhIHJ1bGUgKGxleGVyLCBwYXJzZXIgYW5kIHRyZWUgcGFyc2VyIHJ1bGVzKS4gVGhpcyBhbGxvd3MgeW91IHRvIGJvdGggZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZQorLy8vIHZhcmlhYmxlcyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIHRoYXQgcnVsZS4gWW91IGNhbiB0aGVuIHJlZmVyZW5jZSB0aGVtIHdpdGhpbgorLy8vIHlvdXIgcnVsZSBhY3Rpb24gY29kZS4KKy8vLworLy8vIFdpdGggdGhlIEMgdGFyZ2V0LCB0aGUgZ2VuZXJhdGVkIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgcmVzdHJpY3Rpb25zIG9mIEMgc2VtYW50aWNzIGFuZCB0aGlzCisvLy8gbWVhbnMgdGhhdCB5b3UgbXVzdCBkZWNsYXJlIGFueSBsb2NhbCB2YXJpYWJsZXMsIHRoZW4gYXNzaWduIHRvIHRoZW0gYWZ0ZXJ3YXJkcy4gQXMgd2VsbCBhcyB0aGUKKy8vLyA8Y29kZT5cQGluaXQ8L2NvZGU+IHNlY3Rpb24sIHdoaWNoIEMgcHJvZ3JhbW1lcnMgc2hvdWxkIHVzZSB0byBpbml0aWFsaXplIHRoZWlyIGxvY2FsIHZhcmlhYmxlcywgdGhlIEMKKy8vLyB0YXJnZXQgcHJvdmlkZXMgdGhlIDxjb2RlPlxAZGVjbGFyYXRpb25zPC9jb2RlPiBzZWN0aW9uLCB3aGljaCBpcyBhbHNvIGEgcnVsZSBiYXNlZCBzZWN0aW9uLiBUaGlzIHNlY3Rpb24KKy8vLyBpcyB3aGVyZSB0aGUgQyBwcm9ncmFtbWVyIHNob3VsZCBkZWNsYXJlIHRoZSBsb2NhbCB2YXJpYWJsZXMsIHRodXMgc2VwYXJhdGluZyB0aGVpciBkZWNsYXJhdGlvbgorLy8vIGZyb20gdGhlaXIgaW5pdGlhbGl6YXRpb24uIEhlcmUgaXMgYW4gZXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gdHJhbnNsYXRpb25fdW5pdAorLy8vIEBkZWNsYXJhdGlvbnMKKy8vLyB7CisvLy8gCXBBTlRMUjNfQk9PTEVBTgloYXNVc2luZzsKKy8vLyB9CisvLy8gQGluaXQKKy8vLyB7CisvLy8gCisvLy8gCS8vIEFzc3VtZSBubyBVc2luZyBkaXJlY3RpdmVzCisvLy8gCS8vCisvLy8gCWhhc1VzaW5nID0gQU5UTFIzX0ZBTFNFOworLy8vIAorLy8vIH0KKy8vLyAgICAgOiBydWxlYSBydWxlYiAuLi4KKy8vLworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBVc2luZyB0aGUgPGNvZGU+XEBkZWNsYXJhdGlvbnM8L2NvZGU+IGFuZCA8Y29kZT5cQGluaXQ8L2NvZGU+IHNlY3Rpb25zIGd1YXJhbnRlZXMgdGhhdCB5b3VyIGdlbmVyYXRlZCBjb2RlIHdpbGwKKy8vLyBjb21waWxlIGNvcnJlY3RseSBvbiBhbnkgc3RhbmRhcmQgQyBjb21waWxlciAoYXNzdW1pbmcsIG9mIGNvdXJzZSwgdGhhdCB5b3UgdHlwZSBpbiB2YWxpZCBDIGNvZGUuKQorLy8vCisvLy8gXHN1YnNlY3Rpb24gcHNyaGVhZGVyIFxAaGVhZGVyIHNlY3Rpb24uCisvLy8KKy8vLyBUaGUgPGNvZGU+XEBwYXJzZXI6OmhlYWRlcjwvY29kZT4gb3IgPGNvZGU+XEBsZXhlcjo6aGVhZGVyPC9jb2RlPiBhbm5vdGF0aW9ucyBjYXVzZSB0aGUgY29kZSB0aGV5IGVuY2Fwc3VsYXRlCisvLy8gdG8gYmUgcGxhY2VkIGF0IHRoZSBzdGFydCBvZiBlYWNoIGdlbmVyYXRlZCBmaWxlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSAuYyBvciAuaCBmaWxlLiBUaGlzIGNhbgorLy8vIGJlIHVzZWZ1bCBmb3IgaW5zZXJ0aW5nIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBhbmQgc28gb24gaW4gYWxsIHlvdXIgZ2VuZXJhdGVkIGZpbGVzLgorLy8vCisvLy8gXGJOT1RFOiBCZSBjYXJlZnVsIG5vdCB0byBjb25mdXNlIHRoaXMgY29uY2VwdCB3aXRoIHBsYWNpbmcgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIC5oIGhlYWRlciBmaWxlLiBUaGUgbmFtZSBjaG9pY2UgaXMKKy8vLyB1bmZvcnR1bmF0ZSwgYnV0IHdhcyBhbHJlYWR5IHVzZWQgaW4gdGhlIEphdmEgdGFyZ2V0IHRvIGFsbG93IHRoZSBwbGFjZW1lbnQgb2YgXGMgaW1wb3J0cyBzdGF0ZW1lbnRzCisvLy8gaW4gZ2VuZXJhdGVkIGphdmEgY2xhc3Nlcy4gV2UgaGF2ZSB0aGVyZWZvcmUga2VwdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0aGUgc2FtZS4KKy8vLworLy8vIEhlcmUgaXMgYW4gZXhhbXBsZToKKy8vLy8KKy8vLyBcY29kZQorLy8vIEBsZXhlcjo6aGVhZGVyCisvLy8geworLy8vICAgLy8gQ29weXJpZ2h0IChjKSBKaW0gSWRsZSAyMDA3IC0gQWxsIHlvdXIgZ3JhbW1hciBhcmUgYmVsb25nIHRvIHVzLgorLy8vIH0KKy8vLworLy8vIEBwYXJzZXI6OmhlYWRlcgorLy8vIHsKKy8vLyAgIC8vIENvcHlyaWdodCAoYykgSmltIElkbGUgMjAwNyAtIEFsbCB5b3VyIGdyYW1tYXIgYXJlIGJlbG9uZyB0byB1cy4KKy8vLyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vCisvLy8gXHN1YnNlY3Rpb24gaGRyaW5jbHVkZSBcQGluY2x1ZGVzIHNlY3Rpb24KKy8vLworLy8vIFRoZSA8Y29kZT5cQHBhcnNlcjo6aW5jbHVkZXM8L2NvZGU+IG9yIDxjb2RlPlxAbGV4ZXI6OmluY2x1ZGVzPC9jb2RlPiBhbm5vdGF0aW9ucyBjYXVzZQorLy8vIHRoZSBjb2RlIHRoZXkgZW5jYXBzdWxhdGUgdG8gYmUgcGxhY2VkIGluIHRoZSBnZW5lcmF0ZWQgLmggZmlsZSwgXGIgYWZ0ZXIgdGhlIHN0YW5kYXJkCisvLy8gaW5jbHVkZXMgcmVxdWlyZWQgYnkgdGhlIEFOVExSIGdlbmVyYXRlZCBjb2RlLgorLy8vCisvLy8gSGVyZSB5b3UgY291bGQgZm9yIGluc3RhbmNlIHBsYWNlIGEgPGNvZGU+XCNpbmNsdWRlPC9jb2RlPgorLy8vIHN0YXRlbWVudCB0byBjYXVzZSB5b3VyIGdyYW1tYXIgY29kZSB0byBpbmNsdWRlIHNvbWUgc3RhbmRhcmQgZGVmaW5pdGlvbnMuIEJlY2F1c2UgeW91CisvLy8gbWF5IHVzZSBtdWx0aXBsZSBwYXJzZXJzIGFuZCBsZXhlcnMgaW4geW91ciBzb2x1dGlvbiwgeW91IHNob3VsZCBwcm9iYWJseSBub3QgcGxhY2UKKy8vLyA8Y29kZT4jZGVmaW5lPC9jb2RlPiBzdGF0ZW1lbnRzIGhlcmUsIGJ1dCBpbiB0aGUgPGNvZGU+XEBwb3N0aW5jbHVkZTwvY29kZT4gc2VjdGlvbi4gVGhlbiB5b3UKKy8vLyBtYXkgY3JlYXRlIGRpZmZlcmVudCA8Y29kZT5cI2RlZmluZXM8L2NvZGU+IGZvciBkaWZmZXJlbnQgcmVjb2duaXplcnMuIAorLy8vCisvLy8gSGVyZSBpcyBhbiBleGFtcGxlOgorLy8vLworLy8vIFxjb2RlCisvLy8gQGxleGVyOjppbmNsdWRlcworLy8vIHsKKy8vLyAgICNpbmNsdWRlICJteXByb2plY3Rjb21tb25kZWZzLmgiCisvLy8gfQorLy8vCisvLy8gQHBhcnNlcjo6aW5jbHVkZXMKKy8vLyB7CisvLy8gICAjaW5jbHVkZSAibXlwcm9qZWN0Y29tbW9uZGVmcy5oIgorLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gCisvLy8gXHN1YnNlY3Rpb24gaGRycHJlaW5jbHVkZSBcQHByZWluY2x1ZGVzIHNlY3Rpb24KKy8vLworLy8vIFRoZSA8Y29kZT5cQHBhcnNlcjo6cHJlaW5jbHVkZXM8L2NvZGU+IG9yIDxjb2RlPlxAbGV4ZXI6OnByZWluY2x1ZGVzPC9jb2RlPiBhbm5vdGF0aW9ucyBjYXVzZQorLy8vIHRoZSBjb2RlIHRoZXkgZW5jYXBzdWxhdGUgdG8gYmUgcGxhY2VkIGluIHRoZSBnZW5lcmF0ZWQgLmggZmlsZSwgXGIgYmVmb3JlIHRoZSBzdGFuZGFyZAorLy8vIGluY2x1ZGVzIHJlcXVpcmVkIGJ5IHRoZSBBTlRMUiBnZW5lcmF0ZWQgY29kZS4KKy8vLworLy8vIFlvdSBzaG91bGQgdXNlIHRoaXMgc2VjdGlvbiB3aGVuIHlvdSB3aXNoIHRvIHBsYWNlICNkZWZpbmVzIGFuZCBvdGhlciBkZWZpbml0aW9ucworLy8vIGluIHRoZSBjb2RlIGJlZm9yZSB0aGUgc3RhbmRhcmQgQU5UTFIgcnVudGltZSBpbmNsdWRlcyBkZWZpbmVkIHRoZW0uIFRoaXMgYWxsb3dzIHlvdQorLy8vIHRvIG92ZXJyaWRlIGFueSBwcmVkZWZpbmVkIHN5bWJvbHMgYW5kIG9wdGlvbnMgdGhhdCB0aGUgaW5jbHVkZXMgb3RoZXJ3aXNlIHRha2UKKy8vLyBkZWZhdWx0cyBmb3IuIEZvciBpbnN0YW5jZSwgaWYgeW91IGhhdmUgYnVpbHQgYSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lIHdpdGggYSAKKy8vLyBzcGVjaWFsIHZlcnNpb24gb2YgbWFsbG9jLCB5b3UgY2FuIDxjb2RlPlwjZGVmaW5lPC9jb2RlPiAjQU5UTFIzX01BTExPQyB0byBtYXRjaCB0aGUgZGVmaW5pdGlvbgorLy8vIHlvdSB1c2VkIGZvciB0aGUgQU5UTFIgcnVudGltZSBsaWJyYXJ5LgorLy8vCisvLy8gXHN1YnNlY3Rpb24gaGRycG9zdGluY2x1ZGUgXEBwb3N0aW5jbHVkZSBzZWN0aW9uCisvLy8KKy8vLyBUaGUgPGNvZGU+XEBwYXJzZXI6OnBvc3RpbmNsdWRlPC9jb2RlPiBvciA8Y29kZT5cQGxleGVyOjpwb3N0aW5jbHVkZTwvY29kZT4gYW5ub3RhdGlvbnMgY2F1c2UKKy8vLyB0aGUgY29kZSB0aGV5IGVuY2Fwc3VsYXRlIHRvIGJlIHBsYWNlZCBpbiB0aGUgZ2VuZXJhdGVkIDxiPi5DPC9iPiBmaWxlLCBhZnRlciB0aGUgZ2VuZXJhdGVkIGluY2x1ZGUKKy8vLyBmaWxlICh3aGljaCBpbmNsdWRlcyB0aGUgc3RhbmRhcmQgQU5UTFIzQyBsaWJyYXJ5IGluY2x1ZGVzLgorLy8vCisvLy8gQ29kZSB5b3UgcGxhY2UgaGVyZSB0aGVuIHdpbGwgYmUgc3ViamVjdCB0byBhbnkgbWFjcm9zIGRlZmluZWQgYnkgeW91ciBvd24gaW5jbHVkZXMsIGJ5IHRoZSAKKy8vLyBnZW5lcmF0ZWQgaW5jbHVkZSBhbmQgYnkgdGhlIHN0YW5kYXJkIEFOVExSMyBpbmNsdWRlcy4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gPGNvZGU+XCN1bmRlZjwvY29kZT4gCisvLy8gYW55dGhpbmcgdGhhdCB5b3UgZG9uO3QgbGlrZSB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YsIGJ1dCBjYW5ub3Qgb3ZlcnJpZGUgYmVmb3JlIHRoZSBpbmNsdWRlcworLy8vIGRlZmluZSB0aGVtLgorLy8vCisvLy8gVGhpcyBpcyBhbHNvIGEgZ29vZCBwbGFjZSB0byA8Y29kZT4jZGVmaW5lPC9jb2RlPiBhbnkgbWFjcm9zIHlvdSBtYXkgd2lzaCB0byB1c2UgaW4gdGhlIGdlbmVyYXRlZAorLy8vIC5jIGZpbGUuIEFzIHlvdSBjYW4gaW5jbHVkZSBtdWx0aXBsZSBwYXJzZXJzIGluIHlvdXIgcHJvamVjdHMsIHlvdSB3aWxsIG5lZWQgdG8gaW5jbHVkZSB0aGUKKy8vLyBnZW5lcmF0ZWQgLmggZmlsZSBvZiBlYWNoIG9mIHRoZW0sIHBvc3NpYmx5IGdsb2JhbGx5LCBidXQgYWxtb3N0IGNlcnRhaW5seSBpbiBhIGNvbnRleHQgd2hlcmUgeW91CisvLy8gYXJlIGluY2x1ZGluZyBtb3JlIHRoYW4gb25lIC5oIGZpbGUgc2ltdWx0YW5lb3VzbHkuIEhlbmNlIGlmIHlvdSBjb21tb25seSB1c2UgdGhlIHNhbWUgbWFjcm8KKy8vLyBuYW1lcyBmb3IgYWNjZXNzaW5nIHN0cnVjdHVyZXMgYW5kIHNvIG9uLCBhbmQgdGhleSBjaGFuZ2UgZnJvbSBncmFtbWFyIHRvIGdyYW1tYXIsIHlvdSBzaG91bGQgCisvLy8gZGVmaW5lIHRoZW0gaGVyZSB0byBhdm9pZCBjcmVhdGluZyBjb25mbGljdGluZyBkZWZpbml0aW9ucyBpbiB0aGUgaGVhZGVyIGZpbGVzLgorLy8vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2J1aWxkLmRveCBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9idWlsZC5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjM2M2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9idWlsZC5kb3gKQEAgLTAsMCArMSwyMDcgQEAKKy8vLyBccGFnZSBidWlsZCBCdWlsZGluZyBGcm9tIFNvdXJjZQorLy8vCisvLy8gVGhlIEMgcnVudGltZSBpcyBwcm92aWRlZCBpbiBzb3VyY2UgY29kZSBmb3JtIG9ubHkgYXMgdGhlcmUgYXJlIHRvbyBtYW55IGJpbmFyeQorLy8vIHZlcnNpb25zIHRvIHNlbnNpYmx5IG1haW50YWluIGJpbmFyaWVzIG9uIHd3dy5hbnRsci5vcmcuIAorLy8vCisvLy8gVGhlIHJ1bnRpbWUgY29kZSBpcyBwcm92aWRlZCB3aXRoIC5zbG4gYW5kIC52Y3Byb2ogZmlsZXMgZm9yIFZpc3VhbCBTdHVkaW8gMjAwNSBhbmQgMjAwOCwKKy8vLyBhbmQgXGIgY29uZmlndXJlIGZpbGVzIGZvciBidWlsZGluZyBhbmQgaW5zdGFsbGF0aW9uIG9uIFVOSVggb3Igb3RoZXIgc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhpcyB0b29sLiBJZiB5b3VyCisvLy8gc3lzdGVtIGlzIG5laXRoZXIgV2luZG93cyBub3IgXGIgY29uZmlndXJlIGNvbXBhdGlibGUsIHRoZW4geW91IHNob3VsZCBmaW5kIGl0CisvLy8gcmVhc29uYWJsZSB0byBidWlsZCB0aGUgY29kZSBtYW51YWxseSAoc2VlIHNlY3Rpb24gIkJ1aWxkaW5nIE1hbnVhbGx5Ii4pCisvLy8KKy8vLyBcc2VjdGlvbiBzcmMgU291cmNlIENvZGUgT3JnYW5pemF0aW9uCisvLy8KKy8vLyBUaGUgc291cmNlIGNvZGUgZXhwYW5kcyBmcm9tIGEgdGFyL3ppcCBmaWxlIHRvIGdpdmUgeW91IHRoZSBmb2xsb3dpbmcKKy8vLyBkaXJlY3RvcmllczoKKy8vLworLy8vIC0gPGI+Li88L2I+IFRoZSBsb2NhdGlvbiBvZiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgdGhlIGFudGxyM2NvbmZpZy5oIGZpbGUKKy8vLyAgIGdlbmVyYXRlZCBieSB0aGUgcnVubmluZyB0aGUgY29uZmlndXJlIHNjcmlwdC5UaGlzIGRpcmVjdG9yeSBhbHNvIAorLy8vICAgY29udGFpbnMgdGhlIHNvbHV0aW9uIGFuZCBwcm9qZWN0IGZpbGVzIGZvciB2aXN1YWwgc3R1ZGlvIDIwMDUgYW5kCisvLy8gICAyMDA4LgorLy8vIC0gPGI+Li9zcmM8L2I+IFRoZSBsb2NhdGlvbiBvZiBhbGwgdGhlIEMgZmlsZXMgaW4gdGhlIHByb2plY3QuCisvLy8gLSA8Yj4uL2luY2x1ZGU8L2I+IFRoZSBsb2NhdGlvbiBvZiBhbGwgdGhlIGhlYWRlciBmaWxlcyBmb3IgdGhlIHByb2plY3QKKy8vLyAtIDxiPi4vZG94eWdlbjwvYj4gVGhlIGxvY2F0aW9uIG9mIGRvY3VtZW50YXRpb24gZmlsZXMgc3VjaCBhcyB0aGUgb25lIHRoYXQgZ2VuZXJhdGVzIHRoaXMgcGFnZQorLy8vIC0gT3RoZXIgYW5jaWxsYXJ5IGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIGJ1aWxkIG9yIGRvY3VtZW50YXRpb24gcHJvY2Vzcy4KKy8vLworLy8vIFxzZWN0aW9uIHdpbmJ1aWxkIEJ1aWxkaW5nIGZvciBXaW5kb3dzCisvLy8KKy8vLyBJZiB5b3UgYXJlIGJ1aWxkaW5nIGZvciBDeWd3aW4sIG9yIGEgc2ltaWxhciBVTklYIG9uIFdpbmRvd3MgU3lzdGVtLCBmb2xsb3cgdGhlICJCdWlsZGluZyBXaXRoIENvbmZpZ3VyZSIgaW5zdHJ1Y3Rpb25zIGJlbG93LgorLy8vIAorLy8vIE5vdGUgdGhhdCB0aGUgcnVudGltZSBpcyBubyBsb25nZXIgY29tcGF0aWJsZSB3aXRoIHRoZSBWQzYgTWljcm9zb2Z0IGNvbXBpbGVyLiBJZiB5b3UgYWJzb2x1dGVseSBuZWVkIHRvIGJ1aWxkIHdpdGgKKy8vLyB0aGlzIGNvbXBpbGVyLCB5b3UgY2FuIHByb2JhYmx5IGhhY2sgdGhlIHNvdXJjZSBjb2RlIHRvIGRlYWxsIHdpdGggdGhlIHBpZWNlcyB0aGF0IFZDNiBjYW5ub3QgaGFuZGxlIHN1Y2ggYXMgdGhlCisvLy8gVUxMIHN1ZmZpeCBmb3IgY29uc3RhbnRzLgorLy8vCisvLy8gSWYgeW91IHdpc2ggdG8gYnVpbGQgdGhlIGJpbmFyaWVzIGZvciBXaW5kb3dzIHVzaW5nIFZpc3VhbCBTdHVkaW8gMjAwNSwgb3IgMjAwOCB5b3UgbWF5IGJ1aWxkIHVzaW5nIHRoZSBJREU6CisvLy8gIC0jIE9wZW4gdGhlIEMuc2xuIGZpbGUKKy8vLyAgLSMgU2VsZWN0IGJhdGNoIEJ1aWxkIGZyb20gdGhlIEJ1aWxkIG1lbnUKKy8vLyAgLSMgU2VsZWN0IGFsbCBjb25maWd1cmF0aW9ucyBhbmQgcHJlc3MgdGhlIGJ1aWxkIGJ1dHRvbi4KKy8vLworLy8vIElmIHlvdSB3aXNoIG9yIG5lZWQgdG8gYnVpbGQgdGhlIGxpYnJhcmllcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4geW91IG11c3QgCisvLy8gdXNlIGEgV2luZG93cyBjb21tYW5kIHNoZWxsIGNvbmZpZ3VyZWQgZm9yIGFjY2VzcyB0byBWUzIwMDUvVlMyMDA4IGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIHRoYXQgaXMgCisvLy8gc3RhcnRlZCBmcm9tOgorLy8vCisvLy8gPGk+U3RhcnQtPk1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMDUtPlZpc3VhbCBTdHVkaW8gVG9vbHMtPlZpc3VhbCBTdHVkaW8gMjAwNSBDb21tYW5kIFByb21wdDwvaT4KKy8vLworLy8vIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gd2F5IHRvIGJ1aWxkIGFsbCB0YXJnZXRzIGF0IG9uY2UgaW4gYSBiYXRjaCBtb2RlIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgCisvLy8gc28geW91IG1heSBidWlsZCBvbmUgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmc6CisvLy8gXHZlcmJhdGltCisgICBDOlxhbnRscnNyY1xjb2RlXGFudGxyXG1haW5ccnVudGltZVxDPiBERVZFTlYgQy5zbG4gL0J1aWxkIFJlbGVhc2VETEwKKyAgIEM6XGFudGxyc3JjXGNvZGVcYW50bHJcbWFpblxydW50aW1lXEM+IERFVkVOViBDLnNsbiAvQnVpbGQgUmVsZWFzZQorICAgQzpcYW50bHJzcmNcY29kZVxhbnRsclxtYWluXHJ1bnRpbWVcQz4gREVWRU5WIEMuc2xuIC9CdWlsZCBEZWJ1Z0RMTAorICAgQzpcYW50bHJzcmNcY29kZVxhbnRsclxtYWluXHJ1bnRpbWVcQz4gREVWRU5WIEMuc2xuIC9CdWlsZCBEZWJ1ZworXGVuZHZlcmJhdGltCisvLy8KKy8vLyBBZnRlciB0aGUgYnVpbGQgaXMgY29tcGxldGUgeW91IHdpbGwgZmluZCB0aGUgXGMuXGNETEwgYW5kIFxjLlxjTElCIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBDLnNsbiwgCisvLy8gaW4gYSBzdWJkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgdGhlIC9CdWlsZCB0YXJnZXQuIEluIHRoZSBSZWxlYXNlIGFuZCBEZWJ1ZyB0YXJnZXRzLCB5b3Ugd2lsbCBmaW5kIHRoYXQgdGhlcmUgaXMgb25seSBhIFxjLlxjTElCIGFyY2hpdmUgZmlsZSwgCisvLy8gd2hpY2ggeW91IGNhbiBsaW5rIGRpcmVjdGx5IGludG8geW91ciBvd24gcHJvamVjdHMgaWYgeW91IHdpc2ggdG8gYXZvaWQgdGhlIERMTC4gSW4gXGMgUmVsZWFzZURMTCBhbmQgXGMgRGVidWdETEwgeW91IHdpbGwgZmluZCBib3RoIGEgCisvLy8gXGMgLkxJQiBmaWxlIHdoaWNoIHlvdSBzaG91bGQgbGluayB5b3VyIHByb2plY3RzIHdpdGggYW5kIGEgRExMLiBUaGUgbGlicmFyeSBhbmQgbmFtZXMgb24gV2luZG93cyBhcmUgYXMgZm9sbG93czoKKy8vLworLy8vIFx2ZXJiYXRpbQorICAtIFJlbGVhc2VETEwgIDogICBBTlRMUjNDLkRMTCBhbmQgQU5UTFIzQ19ETEwuTElCCisgIC0gRGVidWdETEwgICAgOiAgQU5UTFIzQ0QuRExMIGFuZCBBTlRMUjNDRF9ETEwuTElCCisgIC0gUmVsZWFzZSAgICAgOiAgIEFOVExSM0MuTElCCisgIC0gRGVidWcgICAgICAgOiAgQU5UTFIzQ0QuTElCCitcZW5kdmVyYmF0aW0KKy8vLworLy8vIFRoZXJlIGN1cnJlbnRseSBubyAubXNpIG1vZHVsZXMgb3Igb3RoZXIgaW5zdGFsbHMgYnVpbHQgZm9yIFdpbmRvd3MsIHNvIHlvdSBtdXN0IHBsYWNlIHRoZSBETExzIGluIGEgZGlyZWN0b3J5IHJlZmVyZW5jZWQgCisvLy8gYnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIG1ha2UgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IGF2YWlsYWJsZSB0byB5b3VyIHByb2plY3QgY29uZmlndXJhdGlvbnMuCisvLy8KKy8vLworLy8vIFxzZWN0aW9uIGNvbmZpZ3VyZSBCdWlsZGluZyB3aXRoIGNvbmZpZ3VyZQorLy8vCisvLy8gQmVmb3JlIHN0YXJ0aW5nLCBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIHVzaW5nIGEgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9uIGFuZCBub3QgdGhlIHNvdXJjZSBjb2RlIGRpcmVjdGx5IGZyb20gdGhlCisvLy8gUGVyZm9yY2UgcmVwb3NpdG9yeS4gSWYgeW91IHVzZSB0aGUgc291cmNlIGZyb20gdGhlIHBlcmZvcmNlIHRyZWUgZGlyZWN0bHksIHlvdSB3aWxsIGZpbmQgdGhhdCB0aGVyZSBpcyBubyBjb25maWd1cmUKKy8vLyBzY3JpcHQgYXMgdGhpcyBpcyBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGUgZGlzdHJpYnV0aW9uIGJ1aWxkIGJ5IHRoZSBtYWludGFpbmVycy4gSWYgeW91IGZlZWwgdGhlIG5lZWQgdG8gYnVpbGQgZnJvbQorLy8vIHRoZSBkaXN0cmlidXRpb24gdHJlZSB0aGVuIHlvdSBtdXN0IGhhdmUgYWxsIHRoZSBhdXRvYnVpbGQgcGFja2FnZXMgYXZhaWxhYmxlIG9uIHlvdXIgc3lzdGVtIGFuZCBjYW4gZ2VuZXJhdGUgdGhlCisvLy8gY29uZmlndXJlIHNjcmlwdCB1c2luZyBhdXRvcmVjb25mLiBJZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIHRoZXNlIHRvb2xzLCB0aGVuIHBsZWFzZSB1c2UgdGhlIHRneiBmaWxlcyBpbiB0aGUKKy8vLyBkaXN0IHN1YmRpcmVjdG9yeSAob3IgZG93bmxvYWRlZCBmcm9tIHRoZSBBTlRMUiB3ZWIgc2l0ZSkuCisvLy8KKy8vLyBUaGUgc291cmNlIGNvZGUgZmlsZSBzaG91bGQgYmUgZXhwYW5kZWQgaW4gYSBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UgKHByb2JhYmx5IHlvdXIgd29ya2luZyBkaXJlY3RvcnkpIHVzaW5nIHRoZSBjb21tYW5kOgorLy8vIAorLy8vIFx2ZXJiYXRpbQorZ3ppcCAtZGMgYW50bHJ0Z3puYW1lLnRhci5neiB8IHRhciB4dmYgLQorXGVuZHZlcmJhdGltCisvLy8KKy8vLyBXaGVyZTogPGI+YW50bHJ0Z3puYW1lLnRhci5nejwvYj4gaXMgb2YgY291cnNlIHRoZSBuYW1lIG9mIHRoZSB0YXIgd2hlbiB5b3UgZG93bmxvYWRlZCBpdC4gWW91IHNob3VsZCBmaW5kIGEgXGIgY29uZmlndXJlIHNjcmlwdCBpbiB0aGUgc3ViIGRpcmVjdG9yeSB0aHVzIGNyZWF0ZWQuCisvLy8KKy8vLyBUaGUgY29uZmlndXJlIHNjcmlwdCBhY2NlcHRzIHRoZSB1c3VhbCBvcHRpb25zLCBzdWNoIGFzIC0tcHJlZml4PSBidXQgdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHRvIHBsYWNlIGxpYnJhcmllcyBpbiAKKy8vLyA8Yj4vdXNyL2xvY2FsL2xpYjwvYj4gYW5kIGluY2x1ZGUgZmlsZXMgKGZvciBidWlsZGluZyB5b3VyIHJlY29nbml6ZXJzKSBpbiA8Yj4vdXNyL2xvY2FsL2luY2x1ZGU8L2I+LiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBhbnRsciBzcGVjaWZpYyBvcHRpb25zLCB3aGljaCB5b3UgbWF5IHdpc2ggdG8gdXRpbGl6ZS4gVGhlIGNvbW1hbmQ6CisvLy8gXHZlcmJhdGltCisuL2NvbmZpZ3VyZSAtLWhlbHAKK1xlbmR2ZXJiYXRpbQorLy8vCisvLy8gV2lsbCBkb2N1bWVudCB0aGUgbGF0ZXN0IGluY2FybmF0aW9ucyBvZiB0aGVzZSBvcHRpb25zIGluIGNhc2UgdGhpcyBkb2N1bWVudGF0aW9uIGlzIGV2ZXIgb3V0IG9mIGRhdGUuIEF0IHRoaXMgdGltZSB0aGUgb3B0aW9ucyBhcmU6CisvLy8KKy8vLyBcdmVyYmF0aW0KKyAgLS1lbmFibGUtZGVidWdpbmZvICAgQ29tcGlsZXMgZGVidWcgaW5mbyBpbnRvIHRoZSBsaWJyYXJ5IChkZWZhdWx0IG5vKQorICAtLWVuYWJsZS02NGJpdCAgICAgICBUdXJucyBvbiBmbGFncyB0aGF0IHByb2R1Y2UgNjQgYml0IG9iamVjdCBjb2RlIGlmCisgICAgICAgICAgICAgICAgICAgICAgIGFueSBhcmUgcmVxdWlyZWQgKGRlZmF1bHQgbm8pCitcZW5kdmVyYmF0aW0KKy8vLworLy8vIFVubGVzcyB5b3UgbmVlZCA2NCBiaXQgYnVpbGRzLCBvciBhIGNoYW5nZSBpbiBsaWJyYXJ5IHR5cGVzLCB5b3Ugd2lsbCBnZW5lcmFsbHkgdXNlIHRoZSBjb25maWd1cmUgY29tbWFuZCB3aXRob3V0IG9wdGlvbnM6CisvLy8KKy8vLyBIZXJlIGlzIGEgc2FtcGxlIGNvbmZpZ3VyZSBvdXRwdXQ6CisvLy8KKy8vLyBcdmVyYmF0aW0KK1tqaW1pQGxvY2FsaG9zdCBkaXN0XSQgdGFyIHp2eGYgbGliYW50bHIzYy0zLjAuMC1yYzgudGFyLmd6CisKK2xpYmFudGxyM2MtMy4wLjAtcmM4LworbGliYW50bHIzYy0zLjAuMC1yYzgvYW50bHIzY29uZmlnLmgKK2xpYmFudGxyM2MtMy4wLjAtcmM4L3NyYy8KK2xpYmFudGxyM2MtMy4wLjAtcmM4L3NyYy9hbnRscjNzdHJpbmdzdHJlYW0uYworLi4uCitsaWJhbnRscjNjLTMuMC4wLXJjOC9hbnRscjNjb25maWcuaC5pbgorXGVuZHZlcmJhdGltCisvLy8gXHZlcmJhdGltCitbamltaUBsb2NhbGhvc3QgZGlzdF0kIGNkIGxpYmFudGxyM2MtMy4wLjAtcmMgCitcZW5kdmVyYmF0aW0KKy8vLyBcdmVyYmF0aW0KK1tqaW1pQGxvY2FsaG9zdCBsaWJhbnRscjNjLTMuMC4wLXJjOF0kIC4vY29uZmlndXJlCisKK2NoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4vaW5zdGFsbCAtYworY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uIHllcworY2hlY2tpbmcgZm9yIGEgdGhyZWFkLXNhZmUgbWtkaXIgLXAuLi4gL2Jpbi9ta2RpciAtcAorY2hlY2tpbmcgZm9yIGdhd2suLi4gZ2F3aworY2hlY2tpbmcgd2hldGhlciBtYWtlIHNldHMgJChNQUtFKS4uLiB5ZXMKK2NoZWNraW5nIGZvciB4bGMuLi4gbm8KK2NoZWNraW5nIGZvciBhQ0MuLi4gbm8KK2NoZWNraW5nIGZvciBnY2MuLi4gZ2NjCisuLi4KK2NoZWNraW5nIGZvciBzdHJkdXAuLi4geWVzCitjb25maWd1cmU6IGNyZWF0aW5nIC4vY29uZmlnLnN0YXR1cworY29uZmlnLnN0YXR1czogY3JlYXRpbmcgTWFrZWZpbGUKK2NvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIGFudGxyM2NvbmZpZy5oCitjb25maWcuc3RhdHVzOiBhbnRscjNjb25maWcuaCBpcyB1bmNoYW5nZWQKK2NvbmZpZy5zdGF0dXM6IGV4ZWN1dGluZyBkZXBmaWxlcyBjb21tYW5kcworXGVuZHZlcmJhdGltCisvLy8KKy8vLyBIYXZpbmcgY29uZmlndXJlZCB0aGUgbGlicmFyeSBzdWNjZXNzZnVsbHksIHlvdSBuZWVkIG9ubHkgbWFrZSBpdCwgYW5kIGluc3RhbGwgaXQ6CisvLy8KKy8vLyBcdmVyYmF0aW0KK1tqaW1pQGxvY2FsaG9zdCBsaWJhbnRscjNjLTMuMC4wLXJjOF0kIG1ha2UKK1xlbmR2ZXJiYXRpbQorLy8vIFx2ZXJiYXRpbQorbWFrZSAgYWxsLWFtCittYWtlWzFdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC9ob21lL2ppbWkvYW50bHJzcmMvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvQy9kaXN0L2xpYmFudGxyM2MtMy4wLjAtcmM4JworL2Jpbi9zaCAuL2xpYnRvb2wgLS10YWc9Q0MgICAtLW1vZGU9Y29tcGlsZSBnY2MgLURIQVZFX0NPTkZJR19IIC1JLiAtSWluY2x1ZGUgLUlpbmNsdWRlICAgIC1PMiAgLU1UIGFudGxyM2Jhc2VyZWNvZ25pemVyLmxvIC1NRCAtTVAgLU1GIC5kZXBzL2FudGxyM2Jhc2VyZWNvZ25pemVyLlRwbyAtYyAtbyBhbnRscjNiYXNlcmVjb2duaXplci5sbyBgdGVzdCAtZiAnc3JjL2FudGxyM2Jhc2VyZWNvZ25pemVyLmMnIHx8IGVjaG8gJy4vJ2BzcmMvYW50bHIzYmFzZXJlY29nbml6ZXIuYworLi4uCitnY2MgIC1zaGFyZWQgIC5saWJzL2FudGxyM2Jhc2VyZWNvZ25pemVyLm8gLmxpYnMvYW50bHIzYmFzZXRyZWUubyAubGlicy9hbnRscjNiYXNldHJlZWFkYXB0b3IubyAubGlicy9hbnRscjNiaXRzZXQubyAubGlicy9hbnRscjNjb2xsZWN0aW9ucy5vIC5saWJzL2FudGxyM2NvbW1vbnRva2VuLm8gLmxpYnMvYW50bHIzY29tbW9udHJlZS5vIC5saWJzL2FudGxyM2NvbW1vbnRyZWVhZGFwdG9yLm8gLmxpYnMvYW50bHIzY29tbW9udHJlZW5vZGVzdHJlYW0ubyAubGlicy9hbnRscjNjeWNsaWNkZmEubyAubGlicy9hbnRscjNlbmNvZGluZ3MubyAubGlicy9hbnRscjNleGNlcHRpb24ubyAubGlicy9hbnRscjNmaWxlc3RyZWFtLm8gLmxpYnMvYW50bHIzaW5wdXRzdHJlYW0ubyAubGlicy9hbnRscjNpbnRzdHJlYW0ubyAubGlicy9hbnRscjNsZXhlci5vIC5saWJzL2FudGxyM3BhcnNlci5vIC5saWJzL2FudGxyM3N0cmluZy5vIC5saWJzL2FudGxyM3N0cmluZ3N0cmVhbS5vIC5saWJzL2FudGxyM3Rva2Vuc3RyZWFtLm8gLmxpYnMvYW50bHIzdHJlZXBhcnNlci5vIC5saWJzL2FudGxyM3Jld3JpdGVzdHJlYW1zLm8gLmxpYnMvYW50bHIzdWNzMmlucHV0c3RyZWFtLm8gICAtV2wsLXNvbmFtZSAtV2wsbGliYW50bHIzYy5zbyAtbyAubGlicy9saWJhbnRscjNjLnNvCithciBjcnUgLmxpYnMvbGliYW50bHIzYy5hICBhbnRscjNiYXNlcmVjb2duaXplci5vIGFudGxyM2Jhc2V0cmVlLm8gYW50bHIzYmFzZXRyZWVhZGFwdG9yLm8gYW50bHIzYml0c2V0Lm8gYW50bHIzY29sbGVjdGlvbnMubyBhbnRscjNjb21tb250b2tlbi5vIGFudGxyM2NvbW1vbnRyZWUubyBhbnRscjNjb21tb250cmVlYWRhcHRvci5vIGFudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLm8gYW50bHIzY3ljbGljZGZhLm8gYW50bHIzZW5jb2RpbmdzLm8gYW50bHIzZXhjZXB0aW9uLm8gYW50bHIzZmlsZXN0cmVhbS5vIGFudGxyM2lucHV0c3RyZWFtLm8gYW50bHIzaW50c3RyZWFtLm8gYW50bHIzbGV4ZXIubyBhbnRscjNwYXJzZXIubyBhbnRscjNzdHJpbmcubyBhbnRscjNzdHJpbmdzdHJlYW0ubyBhbnRscjN0b2tlbnN0cmVhbS5vIGFudGxyM3RyZWVwYXJzZXIubyBhbnRscjNyZXdyaXRlc3RyZWFtcy5vIGFudGxyM3VjczJpbnB1dHN0cmVhbS5vCityYW5saWIgLmxpYnMvbGliYW50bHIzYy5hCitjcmVhdGluZyBsaWJhbnRscjNjLmxhCisKKyhjZCAubGlicyAmJiBybSAtZiBsaWJhbnRscjNjLmxhICYmIGxuIC1zIC4uL2xpYmFudGxyM2MubGEgbGliYW50bHIzYy5sYSkKK21ha2VbMV06IExlYXZpbmcgZGlyZWN0b3J5IGAvaG9tZS9qaW1pL2FudGxyc3JjL2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL0MvZGlzdC9saWJhbnRscjNjLTMuMC4wLXJjOCcgCitcZW5kdmVyYmF0aW0KKy8vLyBcdmVyYmF0aW0KK1tqaW1pQGxvY2FsaG9zdCBsaWJhbnRscjNjLTMuMC4wLXJjOF0kIHN1ZG8gbWFrZSBpbnN0YWxsCitcZW5kdmVyYmF0aW0KKy8vLyBcdmVyYmF0aW0KK21ha2VbMV06IEVudGVyaW5nIGRpcmVjdG9yeSBgL2hvbWUvamltaS9hbnRscnNyYy9jb2RlL2FudGxyL21haW4vcnVudGltZS9DL2Rpc3QvbGliYW50bHIzYy0zLjAuMC1yYzgnCit0ZXN0IC16ICIvdXNyL2xvY2FsL2xpYiIgfHwgL2Jpbi9ta2RpciAtcCAiL3Vzci9sb2NhbC9saWIiCisgL2Jpbi9zaCAuL2xpYnRvb2wgLS1tb2RlPWluc3RhbGwgL3Vzci9iaW4vaW5zdGFsbCAtYyAgJ2xpYmFudGxyM2MubGEnICcvdXNyL2xvY2FsL2xpYi9saWJhbnRscjNjLmxhJworL3Vzci9iaW4vaW5zdGFsbCAtYyAubGlicy9saWJhbnRscjNjLnNvIC91c3IvbG9jYWwvbGliL2xpYmFudGxyM2Muc28KKy91c3IvYmluL2luc3RhbGwgLWMgLmxpYnMvbGliYW50bHIzYy5sYWkgL3Vzci9sb2NhbC9saWIvbGliYW50bHIzYy5sYQorL3Vzci9iaW4vaW5zdGFsbCAtYyAubGlicy9saWJhbnRscjNjLmEgL3Vzci9sb2NhbC9saWIvbGliYW50bHIzYy5hCisuLi4KKyAvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDY0NCAnaW5jbHVkZS9hbnRscjNzdHJpbmdzdHJlYW0uaCcgJy91c3IvbG9jYWwvaW5jbHVkZS9hbnRscjNzdHJpbmdzdHJlYW0uaCcKKy4uLgorIC91c3IvYmluL2luc3RhbGwgLWMgLW0gNjQ0ICdhbnRscjNjb25maWcuaCcgJy91c3IvbG9jYWwvaW5jbHVkZS9hbnRscjNjb25maWcuaCcKK21ha2VbMV06IExlYXZpbmcgZGlyZWN0b3J5IGAvaG9tZS9qaW1pL2FudGxyc3JjL2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL0MvZGlzdC9saWJhbnRscjNjLTMuMC4wLXJjOCcKKworW2ppbWlAbG9jYWxob3N0IGxpYmFudGxyM2MtMy4wLjAtcmM4XSQKK1xlbmR2ZXJiYXRpbQorLy8vCisvLy8gWW91IGFyZSBub3cgcmVhZHkgdG8gZ2VuZXJhdGUgQyByZWNvZ25pemVycyBhbmQgY29tcGlsZSBhbmQgbGluayB0aGVtIHdpdGggdGhlIEFOVExSIDMgQyBSdW50aW1lLgorLy8vCisvLy8KKy8vLyBcc2VjdGlvbiBidWlsZG1hbiBCdWlsZGluZyBNYW51YWxseQorLy8vCisvLy8gVGhlIG9ubHkgc3RlcCB0aGF0IGNvbmZpZ3VyZSBwZXJmb3JtcyB0aGF0IGNhbm5vdCBiZSBkb25lCisvLy8gbWFudWFsbHkgKHdpdGhvdXQgZWZmb3J0KSBpcyB0byBwcm9kdWNlIHRoZSBoZWFkZXIgZmlsZQorLy8vIFxjIGFudGxyM2NvbmZpZy5oLCB3aGljaCBjb250YWlucyB0eXBlZGVmcyBvZiB0aGUgZnVuZGFtZW50YWwgdHlwZXMKKy8vLyB0aGF0IHlvdXIgbG9jYWwgQyBjb21waWxlciBzdXBwb3J0cy4gVGhlIGVhc2llc3Qgd2F5IHRvIHByb2R1Y2UKKy8vLyB0aGlzIGZpbGUgZm9yIHlvdXIgc3lzdGVtLCBpZiB5b3UgY2Fubm90IHBvcnQgXGIgYXV0b21ha2UgYW5kIFxiIGNvbmZpZ3VyZQorLy8vIHRvIHRoZSBzeXN0ZW0gaXM6CisvLy8KKy8vLyAtIyBSdW4gY29uZmlndXJlIG9uIGEgc3lzdGVtIHRoYXQgZG9lcyBzdXBwb3J0IGNvbmZpZ3VyZQorLy8vIC0jIENvcHkgdGhlIGdlbmVyYXRlZCBcYyBhbnRscjNjb25maWcuaCBmaWxlIHRvIHRoZSB0YXJnZXQgc3lzdGVtCisvLy8gLSMgRWRpdCB0aGUgZmlsZSBsb2NhbGx5IGFuZCBjaGFuZ2UgYW55IHR5cGVzIHRoYXQgZGlmZmVyIG9uIHRoaXMKKy8vLyAgIHN5c3RlbSB0byB0aGUgdGFyZ2V0IHN5c3RlbXMuIFRoZXJlIGFyZSBvbmx5IGEgZmV3IHR5cGVzIGFuZCB5b3Ugc2hvdWxkCisvLy8gICBmaW5kIHRoaXMgcmVsYXRpdmVseSBlYXN5LgorLy8vCisvLy8gSGF2aW5nIHByb2R1Y2VkIGEgY29tcGF0aWJsZSBhbnRscjNjb25maWcuaCBmaWxlLCB0aGVuIHlvdSBzaG91bGQgYmUgYWJsZSB0bworLy8vIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlcyBpbiB0aGUgXGMgLi9zcmMgc3ViZGlyZWN0b3J5LCBwcm92aWRpbmcgYW4gaW5jbHVkZSBwYXRoCisvLy8gdG8gdGhlIGxvY2F0aW9uIG9mIFxjIGFudGxyM2NvbmZpZy5oIGFuZCB0aGUgXGMgLi9pbmNsdWRlIHN1YmRpcmVjdG9yeS4gU29tZXRoaW5nIGFraW4KKy8vLyB0bzoKKy8vLyBcdmVyYmF0aW0KKworfi9DL3NyYzogY2MgLWMgLU8gLUkuLiAtSS4uL2luY2x1ZGUgKi5jCisKK1xlbmR2ZXJiYXRpbQorLy8vCisvLy8gSGF2aW5nIHByb2R1Y2VkIHRoZSAubyAob3IgZXF1aXZhbGVudCkgZmlsZXMgZm9yIHRoZSBsb2NhbCBzeXN0ZW0geW91IGNhbiB0aGVuCisvLy8gYnVpbGQgYW4gYXJjaGl2ZSBvciBzaGFyZWQgbGlicmFyeSBmb3IgdGhlIEMgcnVudGltZS4KKy8vLworLy8vIFdoZW4geW91IHdpc2ggdG8gYnVpbGQgYW5kIGxpbmsgd2l0aCB0aGUgQyBydW50aW1lLCBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZQorLy8vIHN1cHBsaWVkIGhlYWRlciBmaWxlcywgYW5kIHRoZSBwYXRoIHRvIHRoZSBsaWJyYXJ5IHRoYXQgeW91IGJ1aWx0LgorLy8vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2J1aWxkcmVjLmRveCBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9idWlsZHJlYy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2YTg0NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9idWlsZHJlYy5kb3gKQEAgLTAsMCArMSwyNjkgQEAKKy8vLyBccGFnZSBidWlsZHJlYyBIb3cgdG8gYnVpbGQgR2VuZXJhdGVkIEMgQ29kZQorLy8vCisvLy8gXHNlY3Rpb24gZ2VuZXJhdGVkIEdlbmVyYXRlZCBGaWxlcworLy8vCisvLy8gVGhlIGFudGxyIHRvb2wgamFyLCBydW4gYWdhaW5zdCBhIGdyYW1tYXIgZmlsZSB0aGF0IHRhcmdldHMgdGhlIEMgbGFuZ3VhZ2UsIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBmaWxlcyAKKy8vLyBhY2NvcmRpbmcgdG8gd2hldGhlciB5b3VyIGdyYW1tYXIgZmlsZSBjb250YWlucyBhIGxleGVyLCBwYXJzZXIsIGNvbWJpbmVkIG9yIHRyZWVwYXJzZXIgc3BlY2lmaWNhdGlvbi4gCisvLy8gWW91ciBncmFtbWFyIGZpbGUgbmFtZSBhbmQgdGhlIHN1YmplY3Qgb2YgdGhlIGdyYW1tYXIgbGluZSBpbiB5b3VyIGZpbGUgYXJlIGV4cGVjdGVkIHRvIG1hdGNoLiBIZXJlIHRoZSBnZW5lcmljIG5hbWUgRyBpcyB1c2VkOgorLy8vCisvLy8gPHRhYmxlPgorLy8vIDx0cj4KKy8vLyA8dGg+IFN1ZmZpeCA8L3RoPgorLy8vIDx0aD4gR2VuZXJhdGVkIGZpbGVzIDwvdGg+CisvLy8gPC90cj4KKy8vLyA8dHI+CisvLy8gPHRkPiBsZXhlciBncmFtbWFyIChHLmczbCkgPC90ZD4KKy8vLyA8dGQ+IEdMZXhlci5jIEdMZXhlci5oPC90ZD4KKy8vLyA8L3RyPgorLy8vIDx0cj4KKy8vLyA8dGQ+IHBhcnNlciBncmFtbWFyIChHLmczcCkgPC90ZD4KKy8vLyA8dGQ+IEdQYXJzZXIuYyBHUGFyc2VyLmggPC90ZD4KKy8vLyA8L3RyPgorLy8vIDx0cj4KKy8vLyA8dGQ+IGdyYW1tYXIgRyAoRy5nM3BsKSA8L3RkPgorLy8vIDx0ZD4gR1BhcnNlci5jIEdQYXJzZXIuaCBHTGV4ZXIuYyBHTGV4ZXIuaDwvdGQ+CisvLy8gPC90cj4KKy8vLyA8dHI+CisvLy8gPHRkPiB0cmVlIGdyYW1tYXIgRzsgKEcuZzN0KSA8L3RkPgorLy8vIDx0ZD4gRy5jIEcuaCA8L3RkPgorLy8vIDwvdHI+CisvLy8gPC90YWJsZT4KKy8vLworLy8vIFRoZSBnZW5lcmF0ZWQgLmMgZmlsZXMgcmVmZXJlbmNlIHRoZSAuaCBmaWxlcyB1c2luZyA8Ry5oPiwgc28geW91IG11c3QgdXNlIDxjb2RlPi1JLjwvY29kZT4gb24geW91ciBjb21waWxlciBjb21tYW5kIGxpbmUgCisvLy8gKG9yIGluY2x1ZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGluIHlvdXIgaW5jbHVkZSBwYXRocyBpbiBWaXN1YWwgU3R1ZGlvKS4gQWRkaXRpb25hbGx5LCB0aGUgZ2VuZXJhdGVkIC5oIGZpbGVzIHJlZmVyZW5jZSAKKy8vLyA8Y29kZT5hbnRscjMuaDwvY29kZT4sIHNvIHlvdSBtdXN0IHVzZSA8Y29kZT4tSS9wYXRoL3RvL2FudGxyL2luY2x1ZGU8L2NvZGU+IChFLmcuIDxjb2RlPi1JIC91c3IvbG9jYWwvaW5jbHVkZTwvY29kZT4pIHRvIHJlZmVyZW5jZSB0aGUgc3RhbmRhcmQgQU5UTFIgaW5jbHVkZSBmaWxlcy4KKy8vLworLy8vIEluIG9yZGVyIHRvIHJlZmVyZW5jZSB0aGUgbGlicmFyeSBmaWxlIGF0IGNvbXBpbGUgdGltZSAoeW91IGNhbi9zaG91bGQgb25seSByZWZlcmVuY2Ugb25lKSB5b3UgbmVlZCB0byB1c2UgdGhlIAorLy8vIDxjb2RlPi1ML3BhdGgvdG8vYW50bHIvbGliPC9jb2RlPiAoRS5nLiA8Y29kZT4tTCAvdXNyL2xvY2FsL2xpYjwvY29kZT4pIG9uIFVuaXgsIG9yIGFkZCB0aGUgcGF0aCB0byB5b3VyICJBZGRpdGlvbmFsIExpYnJhcnkgUGF0aCIgaW4gCisvLy8gVmlzdWFsIFN0dWRpby4gWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBsaWJyYXJ5IHVzaW5nIDxjb2RlPi1MPC9jb2RlPiBvbiBVbml4IChFLmcuIDxjb2RlPi1MIC91c3IvbG9jYWwvbGliIC1sIGFudGxyM2M8L2NvZGU+KSBvciBhZGQgPGNvZGU+YW50bHIzY19kbGwubGliPC9jb2RlPgorLy8vIHRvIHlvdXIgQWRkaXRpb25hbCBMaWJyYXJ5IERlcGVuZGVuY2llcyBpbiBWaXN1YWwgU3R1ZGlvLgorLy8vCisvLy8gSW4gY2FzZSBpdCBpc24ndCBvYnZpb3VzLCB0aGUgZ2VuZXJhdGVkIGZpbGVzIG1heSBiZSB1c2VkIHRvIHByb2R1Y2UgZWl0aGVyIGEgbGlicmFyeSBvciBhbiBleGVjdXRhYmxlICguRVhFIG9uIFdpbmRvd3MpIGZpbGUuCisvLy8KKy8vLyBJZiB5b3UgdXNlIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyaWVzLCBETEwgb3IgLnNvLy5zby8uYSB0aGVuIHlvdSBtdXN0IHNoaXAgdGhlIGxpYnJhcnkgd2l0aCB5b3VyIAorLy8vIGFwcGxpY2F0aW9uIG11c3QgcnVuIGluIGFuIGVudmlyb25tZW50IHdoZXJlYnkgdGhlIGxpYnJhcnkgY2FuIGJlIGZvdW5kIGJ5IHRoZSBydW50aW1lIGxpbmtlci9sb2FkZXIuIAorLy8vIFRoaXMgdXN1YWxseSBpbnZvbHZlcyBzcGVjaWZ5aW5nIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGxpYnJhcnkgbGl2ZXMgdG8gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuIAorLy8vIE9uIFdpbmRvd3MsIFg6e3lvdXJ3aW5pbnN0YWxsZGlyfVxzeXN0ZW0zMiB3aWxsIGJlIHNlYXJjaGVkIGF1dG9tYXRpY2FsbHkuCisvLy8KKy8vLyBcc2VjdGlvbiBpbnZva2UgSW52b2tpbmcgWW91ciBHZW5lcmF0ZWQgUmVjb2duaXplcgorLy8vCisvLy8gSW4gb3JkZXIgdG8gcnVuIHlvdXIgbGV4ZXIvcGFyc2VyL3RyZWUgcGFyc2VyIGNvbWJpbmF0aW9uLCB5b3Ugd2lsbCBuZWVkIGEgc21hbGwgZnVuY3Rpb24gKG9yIG1haW4pCisvLy8gZnVuY3Rpb24gdGhhdCBjb250cm9scyB0aGUgc2VxdWVuY2Ugb2YgZXZlbnRzLCBmcm9tIHJlYWRpbmcgdGhlIGlucHV0IGZpbGUgb3Igc3RyaW5nLCB0aHJvdWdoIHRvCisvLy8gaW52b2tpbmcgdGhlIHRyZWUgcGFyc2VyKHMpIGFuZCByZXRyaWV2aW5nIHRoZSByZXN1bHRzLiBTZWUgIlVzaW5nIHRoZSBBTlRMUjNDIEMgVGFyZ2V0IiBmb3IgbW9yZQorLy8vIGRldGFpbGVkIGluc3RydWN0aW9ucywgYnV0IGlmIHlvdSBqdXN0IHdhbnQgdG8gZ2V0IGdvaW5nIGFzIGZhc3QgYXMgcG9zc2libGUsIHN0dWR5IHRoZSBmb2xsb3dpbmcKKy8vLyBjb2RlIGV4YW1wbGUuCisvLy8KKy8vLyBcY29kZQorLy8vCisvLy8gLy8gWW91IG1heSBhZG9wdCB5b3VyIG93biBwcmFjdGljZXMgYnkgYWxsIG1lYW5zLCBidXQgaW4gZ2VuZXJhbCBpdCBpcyBiZXN0CisvLy8gLy8gdG8gY3JlYXRlIGEgc2luZ2xlIGluY2x1ZGUgZm9yIHlvdXIgcHJvamVjdCwgdGhhdCB3aWxsIGluY2x1ZGUgdGhlIEFOVExSMyBDCisvLy8gLy8gcnVudGltZSBoZWFkZXIgZmlsZXMsIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGVzIChhbGwgb2Ygd2hpY2ggYXJlIHNhZmUgdG8gaW5jbHVkZQorLy8vIC8vIG11bHRpcGxlIHRpbWVzKSBhbmQgeW91ciBvd24gcHJvamVjdCByZWxhdGVkIGhlYWRlciBmaWxlcy4gVXNlIDw+IHRvIGluY2x1ZGUgYW5kCisvLy8gLy8gLUkgb24gdGhlIGNvbXBpbGUgbGluZSAod2hpY2ggdnMyMDA1IG5vdyBoYW5kbGVzLCB3aGVyZSB2czIwMDMgZGlkIG5vdCkuCisvLy8gLy8KKy8vLyAjaW5jbHVkZSAgICA8dHJlZXBhcnNlci5oPgorLy8vIAorLy8vIC8vIE1haW4gZW50cnkgcG9pbnQgZm9yIHRoaXMgZXhhbXBsZQorLy8vIC8vCisvLy8gaW50IEFOVExSM19DREVDTAorLy8vIG1haW4JKGludCBhcmdjLCBjaGFyICphcmd2W10pCisvLy8geworLy8vICAgICAvLyBOb3cgd2UgZGVjbGFyZSB0aGUgQU5UTFIgcmVsYXRlZCBsb2NhbCB2YXJpYWJsZXMgd2UgbmVlZC4KKy8vLyAgICAgLy8gTm90ZSB0aGF0IHVubGVzcyB5b3UgYXJlIGNvbnZpbmNlZCB5b3Ugd2lsbCBuZXZlciBuZWVkIHRocmVhZCBzYWZlCisvLy8gICAgIC8vIHZlcnNpb25zIGZvciB5b3VyIHByb2plY3QsIHRoZW4geW91IHNob3VsZCBhbHdheXMgY3JlYXRlIHN1Y2ggdGhpbmdzCisvLy8gICAgIC8vIGFzIGluc3RhbmNlIHZhcmlhYmxlcyBmb3IgZWFjaCBpbnZvY2F0aW9uLgorLy8vICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gCisvLy8gICAgIC8vIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUuIE5vdGUgdGhhdCB3ZSBhbHdheXMgdXNlIHRoZSBhYnN0cmFjdCB0eXBlIHBBTlRMUjNfVUlOVDgKKy8vLyAgICAgLy8gZm9yIEFTQ0lJLzggYml0IHN0cmluZ3MgLSB0aGUgcnVudGltZSBsaWJyYXJ5IGd1YXJhbnRlZXMgdGhhdCB0aGlzIHdpbGwgYmUKKy8vLyAgICAgLy8gZ29vZCBvbiBhbGwgcGxhdGZvcm1zLiBUaGlzIGlzIGEgZ2VuZXJhbCBydWxlIC0gYWx3YXlzIHVzZSB0aGUgQU5UTFIzIHN1cHBsaWVkCisvLy8gICAgIC8vIHR5cGVkZWZzIGZvciBwb2ludGVycy90eXBlcy9ldGMuCisvLy8gICAgIC8vCisvLy8gICAgIHBBTlRMUjNfVUlOVDgJICAgIGZOYW1lOworLy8vIAorLy8vICAgICAvLyBUaGUgQU5UTFIzIGNoYXJhY3RlciBpbnB1dCBzdHJlYW0sIHdoaWNoIGFic3RyYWN0cyB0aGUgaW5wdXQgc291cmNlIHN1Y2ggdGhhdAorLy8vICAgICAvLyBpdCBpcyBlYXN5IHRvIHByaXZpZGUgaW5wcHV0IGZyb20gZGlmZmVyZW50IHNvdXJjZXMgc3VjaCBhcyBmaWxlcywgb3IgCisvLy8gICAgIC8vIG1lbW9yeSBzdHJpbmdzLgorLy8vICAgICAvLworLy8vICAgICAvLyBGb3IgYW4gOEJpdC9sYXRpbi0xL2V0YyBtZW1vcnkgc3RyaW5nIHVzZToKKy8vLyAgICAgLy8JICAgIGlucHV0ID0gYW50bHIzTmV3OEJpdFN0cmluZ0luUGxhY2VTdHJlYW0gKHN0cmluZ3RvdXNlLCAoQU5UTFIzX1VJTlQzMikgbGVuZ3RoLCBOVUxMKTsKKy8vLyAgICAgLy8KKy8vLyAgICAgLy8gRm9yIGEgVVRGMTYgbWVtb3J5IHN0cmluZyB1c2U6CisvLy8gICAgIC8vCSAgICBpbnB1dCA9IGFudGxyM05ld1VURjE2U3RyaW5nSW5QbGFjZVN0cmVhbSAoc3RyaW5ndG91c2UsIChBTlRMUjNfVUlOVDMyKSBsZW5ndGgsIE5VTEwpOworLy8vICAgICAvLworLy8vICAgICAvLyBGb3IgaW5wdXQgZnJvbSBhIGZpbGUsIHNlZSBjb2RlIGJlbG93CisvLy8gICAgIC8vCisvLy8gICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIGVzc2VudGlhbGx5IGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KKy8vLyAgICAgLy8gWW91IGNhbiBjcmVhdGUgeW91ciBvd24gaW5wdXQgc3RyZWFtIHR5cGUgKGNvcHkgb25lIG9mIHRoZSBleGlzdGluZyBvbmVzKSBhbmQgb3ZlcnJpZGUgYW55CisvLy8gICAgIC8vIGluZGl2aWR1YWwgZnVuY3Rpb24gYnkgaW5zdGFsbGluZyB5b3VyIG93biBwb2ludGVyIGFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHN0YW5kYXJkIAorLy8vICAgICAvLyB2ZXJzaW9uLgorLy8vICAgICAvLworLy8vICAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTQkgICAgaW5wdXQ7CisvLy8gCisvLy8gICAgIC8vIFRoZSBsZXhlciBpcyBvZiBjb3Vyc2UgZ2VuZXJhdGVkIGJ5IEFOVExSLCBhbmQgc28gdGhlIGxleGVyIHR5cGUgaXMgbm90IHVwcGVyIGNhc2UuCisvLy8gICAgIC8vIFRoZSBsZXhlciBpcyBzdXBwbGllZCB3aXRoIGEgcEFOVExSM19JTlBVVF9TVFJFQU0gZnJvbSB3aGVuY2UgaXQgY29uc3VtZXMgaXRzCisvLy8gICAgIC8vIGlucHV0IGFuZCBnZW5lcmF0ZXMgYSB0b2tlbiBzdHJlYW0gYXMgb3V0cHV0LiBUaGlzIGlzIHRoZSBjdHggKENUWCBtYWNybykgcG9pbnRlcgorLy8vCQkvLyBmb3IgeW91ciBsZXhlci4KKy8vLyAgICAgLy8KKy8vLyAgICAgcExhbmdMZXhlcgkJCSAgICBseHI7CisvLy8gCisvLy8gICAgIC8vIFRoZSB0b2tlbiBzdHJlYW0gaXMgcHJvZHVjZWQgYnkgdGhlIEFOVExSMyBnZW5lcmF0ZWQgbGV4ZXIuIEFnYWluIGl0IGlzIGEgc3RydWN0dXJlIGJhc2VkCisvLy8gICAgIC8vIEFQSS9PYmplY3QsIHdoaWNoIHlvdSBjYW4gY3VzdG9taXNlIGFuZCBvdmVycmlkZSBtZXRob2RzIG9mIGFzIHlvdSB3aXNoLiBhIFRva2VuIHN0cmVhbSBpcworLy8vICAgICAvLyBzdXBwbGllZCB0byB0aGUgZ2VuZXJhdGVkIHBhcnNlciwgYW5kIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gdG9rZW4gc3RyZWFtIGFuZCBwYXNzIHRoaXMgaW4KKy8vLyAgICAgLy8gaWYgeW91IHdpc2guCisvLy8gICAgIC8vCisvLy8gICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTQkgICAgdHN0cmVhbTsKKy8vLyAKKy8vLyAgICAgLy8gVGhlIExhbmcgcGFyc2VyIGlzIGFsc28gZ2VuZXJhdGVkIGJ5IEFOVExSIGFuZCBhY2NlcHRzIGEgdG9rZW4gc3RyZWFtIGFzIGV4cGxhaW5lZAorLy8vICAgICAvLyBhYm92ZS4gVGhlIHRva2VuIHN0cmVhbSBjYW4gYmUgYW55IHNvdXJjZSBpbiBmYWN0LCBzbyBsb25nIGFzIGl0IGltcGxlbWVudHMgdGhlIAorLy8vICAgICAvLyBBTlRMUjNfVE9LRU5fU09VUkNFIGludGVyZmFjZS4gSW4gdGhpcyBjYXNlIHRoZSBwYXJzZXIgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nCisvLy8gICAgIC8vIGJ1dCBpdCBjYW4gb2YgY291cnNlIHNwZWNpZnkgYW55IGtpbmQgb2YgcmV0dXJuIHR5cGUgZnJvbSB0aGUgcnVsZSB5b3UgaW52b2tlCisvLy8gICAgIC8vIHdoZW4gY2FsbGluZyBpdC4gVGhpcyBpcyB0aGUgY3R4IChDVFggbWFjcm8pIHBvaW50ZXIgZm9yIHlvdXIgcGFyc2VyLgorLy8vICAgICAvLworLy8vICAgICBwTGFuZ1BhcnNlcgkJCSAgICBwc3I7CisvLy8gCisvLy8gICAgIC8vIFRoZSBwYXJzZXIgcHJvZHVjZXMgYW4gQVNULCB3aGljaCBpcyByZXR1cm5lZCBhcyBhIG1lbWJlciBvZiB0aGUgcmV0dXJuIHR5cGUgb2YKKy8vLyAgICAgLy8gdGhlIHN0YXJ0aW5nIHJ1bGUgKGFueSBydWxlIGNhbiBzdGFydCBmaXJzdCBvZiBjb3Vyc2UpLiBUaGlzIGlzIGEgZ2VuZXJhdGVkIHR5cGUKKy8vLyAgICAgLy8gYmFzZWQgdXBvbiB0aGUgcnVsZSB3ZSBzdGFydCB3aXRoLgorLy8vICAgICAvLworLy8vICAgICBMYW5nUGFyc2VyX2RlY2xfcmV0dXJuCSAgICBsYW5nQVNUOworLy8vIAorLy8vIAorLy8vICAgICAvLyBUaGUgdHJlZSBub2RlcyBhcmUgbWFuYWdlZCBieSBhIHRyZWUgYWRhcHRvciwgd2hpY2ggZG9sZXMKKy8vLyAgICAgLy8gb3V0IHRoZSBub2RlcyB1cG9uIHJlcXVlc3QuIFlvdSBjYW4gbWFrZSB5b3VyIG93biB0cmVlIHR5cGVzIGFuZCBhZGFwdG9ycworLy8vICAgICAvLyBhbmQgb3ZlcnJpZGUgdGhlIGJ1aWx0IGluIHZlcnNpb25zLiBTZWUgcnVudGltZSBzb3VyY2UgZm9yIGRldGFpbHMgYW5kCisvLy8gICAgIC8vIGV2ZW50dWFsbHkgdGhlIHdpa2kgZW50cnkgZm9yIHRoZSBDIHRhcmdldC4KKy8vLyAgICAgLy8KKy8vLyAgICAgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTQlub2RlczsKKy8vLyAKKy8vLyAgICAgLy8gRmluYWxseSwgd2hlbiB0aGUgcGFyc2VyIHJ1bnMsIGl0IHdpbGwgcHJvZHVjZSBhbiBBU1QgdGhhdCBjYW4gYmUgdHJhdmVyc2VkIGJ5IHRoZSAKKy8vLyAgICAgLy8gdGhlIHRyZWUgcGFyc2VyOiBjLmYuIExhbmdEdW1wRGVjbC5nM3QgVGhpcyBpcyB0aGUgY3R4IChDVFggbWFjcm8pIHBvaW50ZXIgZm9yIHlvdXIKKy8vLwkJLy8gdHJlZSBwYXJzZXIuCisvLy8gICAgIC8vCisvLy8gICAgIHBMYW5nRHVtcERlY2wJCSAgICB0cmVlUHNyOworLy8vIAorLy8vICAgICAvLyBDcmVhdGUgdGhlIGlucHV0IHN0cmVhbSBiYXNlZCB1cG9uIHRoZSBhcmd1bWVudCBzdXBwbGllZCB0byB1cyBvbiB0aGUgY29tbWFuZCBsaW5lCisvLy8gICAgIC8vIGZvciB0aGlzIGV4YW1wbGUsIHRoZSBpbnB1dCB3aWxsIGFsd2F5cyBkZWZhdWx0IHRvIC4vaW5wdXQgaWYgdGhlcmUgaXMgbm8gZXhwbGljaXQKKy8vLyAgICAgLy8gYXJndW1lbnQuCisvLy8gICAgIC8vCisvLy8gCWlmIChhcmdjIDwgMiB8fCBhcmd2WzFdID09IE5VTEwpCisvLy8gCXsKKy8vLyAJCWZOYW1lCT0ocEFOVExSM19VSU5UOCkiLi9pbnB1dCI7IC8vIE5vdGUgaW4gVlMyMDA1IGRlYnVnLCB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIGNvbmZpZ3VyZWQKKy8vLyAJfQorLy8vIAllbHNlCisvLy8gCXsKKy8vLyAJCWZOYW1lCT0gKHBBTlRMUjNfVUlOVDgpYXJndlsxXTsKKy8vLyAJfQorLy8vIAorLy8vICAgICAvLyBDcmVhdGUgdGhlIGlucHV0IHN0cmVhbSB1c2luZyB0aGUgc3VwcGxpZWQgZmlsZSBuYW1lCisvLy8gICAgIC8vIChVc2UgYW50bHIzOEJpdEZpbGVTdHJlYW1OZXcgZm9yIFVURjE2IGlucHV0KS4KKy8vLyAgICAgLy8KKy8vLyAgICAgaW5wdXQJPSBhbnRscjM4Qml0RmlsZVN0cmVhbU5ldyhmTmFtZSk7CisvLy8gCisvLy8gICAgIC8vIFRoZSBpbnB1dCB3aWxsIGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCBwcm92aWRpbmcgdGhhdCB0aGVyZSBpcyBlbm91Z2gKKy8vLyAgICAgLy8gbWVtb3J5IGFuZCB0aGUgZmlsZSBleGlzdHMgZXRjCisvLy8gICAgIC8vCisvLy8gICAgIGlmICggaW5wdXQgPT0gTlVMTCApCisvLy8gICAgIHsKKy8vLyAJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiBmaWxlICVzIGR1ZSB0byBtYWxsb2MoKSBmYWlsdXJlMVxuIiwgKGNoYXIgKilmTmFtZSk7CisvLy8gICAgIH0KKy8vLyAKKy8vLyAgICAgLy8gT3VyIGlucHV0IHN0cmVhbSBpcyBub3cgb3BlbiBhbmQgYWxsIHNldCB0byBnbywgc28gd2UgY2FuIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBvdXIKKy8vLyAgICAgLy8gbGV4ZXIgYW5kIHNldCB0aGUgbGV4ZXIgaW5wdXQgdG8gb3VyIGlucHV0IHN0cmVhbToKKy8vLyAgICAgLy8gIChmaWxlIHwgbWVtb3J5IHwgPykgLS0+IGlucHV0c3RyZWFtIC0+IGxleGVyIC0tPiB0b2tlbnN0cmVhbSAtLT4gcGFyc2VyICggLS0+IHRyZWVwYXJzZXIgKT8KKy8vLyAgICAgLy8KKy8vLyAgICAgbHhyCSAgICA9IExhbmdMZXhlck5ldyhpbnB1dCk7CSAgICAvLyBDTGV4ZXJOZXcgaXMgZ2VuZXJhdGVkIGJ5IEFOVExSCisvLy8gCisvLy8gICAgIC8vIE5lZWQgdG8gY2hlY2sgZm9yIGVycm9ycworLy8vICAgICAvLworLy8vICAgICBpZiAoIGx4ciA9PSBOVUxMICkKKy8vLyAgICAgeworLy8vIAkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgdGhlIGxleGVyIGR1ZSB0byBtYWxsb2MoKSBmYWlsdXJlMVxuIik7CisvLy8gCQkJZXhpdChBTlRMUjNfRVJSX05PTUVNKTsKKy8vLyAgICAgfQorLy8vIAorLy8vICAgICAvLyBPdXIgbGV4ZXIgaXMgaW4gcGxhY2UsIHNvIHdlIGNhbiBjcmVhdGUgdGhlIHRva2VuIHN0cmVhbSBmcm9tIGl0CisvLy8gICAgIC8vIE5COiBOb3RoaW5nIGhhcHBlbnMgeWV0IG90aGVyIHRoYW4gdGhlIGZpbGUgaGFzIGJlZW4gcmVhZC4gV2UgYXJlIGp1c3QgCisvLy8gICAgIC8vIGNvbm5lY3RpbmcgYWxsIHRoZXNlIHRoaW5ncyB0b2dldGhlciBhbmQgdGhleSB3aWxsIGJlIGludm9rZWQgd2hlbiB3ZQorLy8vICAgICAvLyBjYWxsIHRoZSBwYXJzZXIgcnVsZS4gQU5UTFIzX1NJWkVfSElOVCBjYW4gYmUgbGVmdCBhdCB0aGUgZGVmYXVsdCB1c3VhbGx5CisvLy8gICAgIC8vIHVubGVzcyB5b3UgaGF2ZSBhIHZlcnkgbGFyZ2UgdG9rZW4gc3RyZWFtL2lucHV0LiBFYWNoIGdlbmVyYXRlZCBsZXhlcgorLy8vICAgICAvLyBwcm92aWRlcyBhIHRva2VuIHNvdXJjZSBpbnRlcmZhY2UsIHdoaWNoIGlzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlCisvLy8gICAgIC8vIHRva2VuIHN0cmVhbSBjcmVhdG9yLgorLy8vICAgICAvLyBOb3RlIHRoYSBldmVuIGlmIHlvdSBpbXBsZW1lbnQgeW91ciBvd24gdG9rZW4gc3RydWN0dXJlLCBpdCB3aWxsIGFsd2F5cworLy8vICAgICAvLyBjb250YWluIGEgc3RhbmRhcmQgY29tbW9uIHRva2VuIHdpdGhpbiBpdCBhbmQgdGhpcyBpcyB0aGUgcG9pbnRlciB0aGF0CisvLy8gICAgIC8vIHlvdSBwYXNzIGFyb3VuZCB0byBldmVyeXRoaW5nIGVsc2UuIEEgY29tbW9uIHRva2VuIGFzIGEgcG9pbnRlciB3aXRoaW4KKy8vLyAgICAgLy8gaXQgdGhhdCBzaG91bGQgcG9pbnQgdG8geW91ciBvd24gb3V0ZXIgdG9rZW4gc3RydWN0dXJlLgorLy8vICAgICAvLworLy8vICAgICB0c3RyZWFtID0gYW50bHIzQ29tbW9uVG9rZW5TdHJlYW1Tb3VyY2VOZXcoQU5UTFIzX1NJWkVfSElOVCwgbHhyLT5wTGV4ZXItPnRva1NvdXJjZSk7CisvLy8gCisvLy8gICAgIGlmICh0c3RyZWFtID09IE5VTEwpCisvLy8gICAgIHsKKy8vLyAJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkgdHJ5aW5nIHRvIGFsbG9jYXRlIHRva2VuIHN0cmVhbVxuIik7CisvLy8gCQlleGl0KEFOVExSM19FUlJfTk9NRU0pOworLy8vICAgICB9CisvLy8gCisvLy8gICAgIC8vIEZpbmFsbHksIG5vdyB0aGF0IHdlIGhhdmUgb3VyIGxleGVyIGNvbnN0cnVjdGVkLCB3ZSBjYW4gY3JlYXRlIHRoZSBwYXJzZXIKKy8vLyAgICAgLy8KKy8vLyAgICAgcHNyCSAgICA9IExhbmdQYXJzZXJOZXcodHN0cmVhbSk7ICAvLyBDUGFyc2VyTmV3IGlzIGdlbmVyYXRlZCBieSBBTlRMUjMKKy8vLyAKKy8vLyAgICAgaWYgKHBzciA9PSBOVUxMKQorLy8vICAgICB7CisvLy8gCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJPdXQgb2YgbWVtb3J5IHRyeWluZyB0byBhbGxvY2F0ZSBwYXJzZXJcbiIpOworLy8vIAkJZXhpdChBTlRMUjNfRVJSX05PTUVNKTsKKy8vLyAgICAgfQorLy8vIAorLy8vICAgICAvLyBXZSBhcmUgYWxsIHJlYWR5IHRvIGdvLiBUaG91Z2ggdGhhdCBsb29rZWQgY29tcGxpY2F0ZWQgYXQgZmlyc3QgZ2xhbmNlLAorLy8vICAgICAvLyBJIGFtIHN1cmUsIHlvdSB3aWxsIHNlZSB0aGF0IGluIGZhY3QgbW9zdCBvZiB0aGUgY29kZSBhYm92ZSBpcyBkZWFsaW5nCisvLy8gICAgIC8vIHdpdGggZXJyb3JzIGFuZCB0aGVyZSBpc247dCByZWFsbHkgdGhhdCBtdWNoIHRvIGRvIChpc247dCB0aGlzIGFsd2F5cyB0aGUKKy8vLyAgICAgLy8gY2FzZSBpbiBDPyA7LSkuCisvLy8gICAgIC8vCisvLy8gICAgIC8vIFNvLCB3ZSBub3cgaW52b2tlIHRoZSBwYXJzZXIuIEFsbCBlbGVtZW50cyBvZiBBTlRMUjMgZ2VuZXJhdGVkIEMgY29tcG9uZW50cworLy8vICAgICAvLyBhcyB3ZWxsIGFzIHRoZSBBTlRMUiBDIHJ1bnRpbWUgbGlicmFyeSBpdHNlbGYgYXJlIHBzZXVkbyBvYmplY3RzLiBUaGlzIG1lYW5zCisvLy8gICAgIC8vIHRoYXQgdGhleSBhcmUgcmVwcmVzZW50ZWQgYXMgcG9pbnRlcnMgdG8gc3RydWN0dXJlcywgd2hpY2ggY29udGFpbiBhbnkKKy8vLyAgICAgLy8gaW5zdGFuY2UgZGF0YSB0aGV5IG5lZWQsIGFuZCBhIHNldCBvZiBwb2ludGVycyB0byBvdGhlciBpbnRlcmZhY2VzIG9yCisvLy8gICAgIC8vICdtZXRob2RzJy4gTm90ZSB0aGF0IGluIGdlbmVyYWwsIHRoZXNlIGZldyBwb2ludGVycyB3ZSBoYXZlIGNyZWF0ZWQgaGVyZSBhcmUKKy8vLyAgICAgLy8gdGhlIG9ubHkgdGhpbmdzIHlvdSB3aWxsIGV2ZXIgZXhwbGljaXRseSBmcmVlKCkgYXMgZXZlcnl0aGluZyBlbHNlIGlzIGNyZWF0ZWQKKy8vLyAgICAgLy8gdmlhIGZhY3RvcmllcywgdGhhdCBhbGxvY2F0ZSBtZW1vcnkgZWZmaWNpZW50bHkgYW5kIGZyZWUoKSBldmVyeXRoaW5nIHRoZXkgdXNlCisvLy8gICAgIC8vIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgY2xvc2UgdGhlIHBhcnNlci9sZXhlci9ldGMuCisvLy8gICAgIC8vCisvLy8gICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1lYW5zIG9ubHkgdGhhdCB0aGUgbWV0aG9kcyBhcmUgYWx3YXlzIGNhbGxlZCB2aWEgdGhlIG9iamVjdAorLy8vICAgICAvLyBwb2ludGVyIGFuZCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYW55IG1ldGhvZCwgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmLgorLy8vICAgICAvLyBJdCBhbHNvIGhhcyB0aGUgc2lkZSBhZHZhbnRhZ2UsIGlmIHlvdSBhcmUgdXNpbmcgYW4gSURFIHN1Y2ggYXMgVlMyMDA1IHRoYXQgY2FuIGRvIGl0CisvLy8gICAgIC8vIHRoYXQgd2hlbiB5b3UgdHlwZSAtPiwgeW91IHdpbGwgc2VlIGEgbGlzdCBvZiBhbGwgdGhlIG1ldGhvZHMgdGhlIG9iamVjdCBzdXBwb3J0cy4KKy8vLyAgICAgLy8KKy8vLyAgICAgbGFuZ0FTVCA9IHBzci0+ZGVjbChwc3IpOworLy8vIAorLy8vICAgICAvLyBJZiB0aGUgcGFyc2VyIHJhbiBjb3JyZWN0bHksIHdlIHdpbGwgaGF2ZSBhIHRyZWUgdG8gcGFyc2UuIEluIGdlbmVyYWwgSSByZWNvbW1lbmQKKy8vLyAgICAgLy8ga2VlcGluZyB5b3VyIG93biBmbGFncyBhcyBwYXJ0IG9mIHRoZSBlcnJvciB0cmFwcGluZywgYnV0IGhlcmUgaXMgaG93IHlvdSBjYW4KKy8vLyAgICAgLy8gd29yayBvdXQgaWYgdGhlcmUgd2VyZSBlcnJvcnMgaWYgeW91IGFyZSB1c2luZyB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlcworLy8vICAgICAvLworLy8vIAlpZiAocHNyLT5wUGFyc2VyLT5yZWMtPmVycm9yQ291bnQgPiAwKQorLy8vIAl7CisvLy8gCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJUaGUgcGFyc2VyIHJldHVybmVkICVkIGVycm9ycywgdHJlZSB3YWxraW5nIGFib3J0ZWQuXG4iLCBwc3ItPnBQYXJzZXItPnJlYy0+ZXJyb3JDb3VudCk7CisvLy8gCisvLy8gCX0KKy8vLyAJZWxzZQorLy8vIAl7CisvLy8gCQlub2Rlcwk9IGFudGxyM0NvbW1vblRyZWVOb2RlU3RyZWFtTmV3VHJlZShsYW5nQVNULnRyZWUsIEFOVExSM19TSVpFX0hJTlQpOyAvLyBzSVpFIEhJTlQgV0lMTCBTT09OIEJFIERFUFJFQ0FURUQhIQorLy8vIAorLy8vIAkJLy8gVHJlZSBwYXJzZXJzIGFyZSBnaXZlbiBhIGNvbW1vbiB0cmVlIG5vZGUgc3RyZWFtIChvciB5b3VyIG92ZXJyaWRlKQorLy8vIAkJLy8KKy8vLyAJCXRyZWVQc3IJPSBMYW5nRHVtcERlY2xOZXcobm9kZXMpOworLy8vIAorLy8vIAkJdHJlZVBzci0+ZGVjbCh0cmVlUHNyKTsKKy8vLyAJCW5vZGVzICAgLT5mcmVlICAobm9kZXMpOwkgICAgbm9kZXMJPSBOVUxMOworLy8vIAkJdHJlZVBzciAtPmZyZWUgICh0cmVlUHNyKTsJICAgIHRyZWVQc3IJPSBOVUxMOworLy8vIAl9CisvLy8gCisvLy8gCS8vIFdlIGRpZCBub3QgcmV0dXJuIGFueXRoaW5nIGZyb20gdGhpcyBwYXJzZXIgcnVsZSwgc28gd2UgY2FuIGZpbmlzaC4gSXQgb25seSByZW1haW5zCisvLy8gCS8vIHRvIGNsb3NlIGRvd24gb3VyIG9wZW4gb2JqZWN0cywgaW4gdGhlIHJldmVyc2Ugb3JkZXIgd2UgY3JlYXRlZCB0aGVtCisvLy8gCS8vCisvLy8gCXBzcgkgICAgLT5mcmVlICAocHNyKTsJCXBzcgkJPSBOVUxMOworLy8vIAl0c3RyZWFtIC0+ZnJlZSAgKHRzdHJlYW0pOwl0c3RyZWFtCT0gTlVMTDsKKy8vLyAJbHhyCSAgICAtPmZyZWUgIChseHIpOwkgICAgbHhyCQk9IE5VTEw7CisvLy8gCWlucHV0ICAgLT5jbG9zZSAoaW5wdXQpOwlpbnB1dAk9IE5VTEw7CisvLy8gCisvLy8gICAgIHJldHVybiAwOworLy8vIH0KKy8vLyBcZW5kY29kZQorLy8vIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2NoYW5nZXMzMS5kb3ggYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vY2hhbmdlczMxLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTc5M2RiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2NoYW5nZXMzMS5kb3gKQEAgLTAsMCArMSw1NiBAQAorLy8vIFxwYWdlIGNoYW5nZXMzMSBDaGFuZ2VzIGluIDMuMSBmcm9tIDMuMAorLy8vCisvLy8gVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGhhdmUgdGFrZW4gcGxhY2UgZnJvbSAzLjAgdG8gMy4xLiBTb21lIG9mCisvLy8gdGhlbSBtYXkgcmVxdWlyZSBtaW5vciBjaGFuZ2VzIHRvIHlvdXIgZ3JhbW1hciBmaWxlcyBvciB0aGUKKy8vLyBwcm9ncmFtcyB0aGF0IGludm9rZSB5b3VyIGdyYW1tYXIuIFBsZWFzZSB0YWtlIHRoZSB0aW1lIHRvIHJlYWQKKy8vLyB0aHJvdWdoIHRoaXMgbGlzdCBhcyBpdCBtYXkgc2F2ZSB5b3UgdGltZSBsYXRlci4KKy8vLworLy8vIFxzZWN0aW9uIHJldHVybnMgQ29uc3RydWN0b3IgUmV0dXJuIFZhbHVlcworLy8vCisvLy8gSW4gcHJldmlvdXMgcmVsZWFzZXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGJvdGggdGhlIGdlbmVyYXRlZCBjb25zdHJ1Y3RvcnMgYW5kCisvLy8gYnVpbHQgaW4gY29uc3RydWN0b3IgZnVuY3Rpb25zIHdvdWxkIHJldHVybiBhIHZhbHVlIG9mIC0xIG9yIC0yIGlmIGEgcHJvYmxlbQorLy8vIG9jY3VycmVkLiBIb3dldmVyLCB0aGUgb25seSBwcm9ibGVtIHRoYXQgY2FuIHJlYWxseSBvY2N1ciBpcyBsYWNrIG9mIG1lbW9yeSwgCisvLy8gaGVuY2UgdG8gYXZvaWQgdGhlIHJlbW90ZSBjaGFuZ2UgdGhhdCBzb21lIG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZSB3b3VsZCByZXR1cm4KKy8vLyBhbiBhZGRyZXNzIG9mIC0xIGZvciBhIHBvaW50ZXIsIHRoZSByZXR1cm4gYWRkcmVzcyBpcyBub3cgTlVMTCBpZiB0aGVyZSB3YXMKKy8vLyBubyBtZW1vcnkgYXZhaWxhYmxlLiBUaGUgb2xkIG1hY3JvcyBmb3IgdGhpcyBtZWNoYW5pc20gaGF2ZSBiZWVuIHJlbW92ZWQgd2hpY2gKKy8vLyB3aWxsIGZvcmNlIHlvdSB0byByZWFkIHRoaXMgaW5mb3JtYXRpb24uIFlvdSBub3cgbmVlZCBvbmx5IGNoZWNrIHRoZSByZXR1cm4KKy8vLyBhZGRyZXNzIGZvciBOVUxMLCBvciB5b3UgY291bGQgbm90IGJvdGhlciBkb2luZyB0aGF0IGFuZCBqb2luIHdpdGggOTUlIG9mIHRoZSB3b3JsZCdzCisvLy8gQyBjb2RlLgorLy8vCisvLy8gXHNlY3Rpb24gdHJlZXMgVHJlZSBQYXJzZXIgUmV3cml0ZXMKKy8vLworLy8vIFRoZSAzLjEgcnVudGltZSBub3cgc3VwcG9ydHMgdHJlZSByZXdyaXRlcyBmcm9tIHRyZWUgcGFyc2Vycy4gU2VlIHRoZSBtYWluIEFOVExSCisvLy8gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIGJldGEgdmVyc2lvbiBjb250YWlucyBcc3VicGFnZSBrbm93bmlzc3VlcyByZWdhcmRpbmcKKy8vLyB0aGUgcmVsZWFzZSBvZiBtbWVvcnkgYWxsb2NhdGVkIHRvIHRyZWUgbm9kZXMgd2hlbiB0aGV5IGFyZSByZXdyaXR0ZW4gaW4gc29tZSBjb21iaW5hdGlvbnMKKy8vLyBvZiByZS13cml0aW5nIHRyZWUgcGFyc2Vycy4gVGhlc2UgaXNzdWVzIHdpbGwgYmUgY29ycmVjdGVkIGJlZm9yZSByZWxlYXNlLgorLy8vCisvLy8gXHNlY3Rpb24gZGVidWdnZXIgQU5UTFJXb3JrcyBEZWJ1Z2dlcgorLy8vCisvLy8gVGhlIEFOVExSV29ya3MgZGVidWdnZXIgaXMgbm93IGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUuIEl0CisvLy8gc3VwcG9ydHMgcmVtb3RlIGRlYnVnZ2luZyBvbmx5ICh5b3UgY2Fubm90IGdlbmVyYXRlIEMsIGNvbXBpbGUgYW5kIGRlYnVnIGl0IGZyb20gdGhlCisvLy8gQU5UTFJXb3JrcyBJREUuKSBIb3dldmVyIGJvdGggcGFyc2VyIGFuZCB0cmVlIHBhcnNlciBkZWJ1Z2dpbmcgaXMgc3VwcG9ydGVkIHByb3ZpZGluZyAKKy8vLyB5b3UgYXJlIHVzaW5nIGEgdmVyc2lvbiBvZiBBTlRMUldvcmtzIHRoYXQgc3VwcG9ydHMgdHJlZSBwYXJzZXIgZGVidWdnaW5nLiBHZW5lcmF0ZQorLy8vIHRoZSBDIGNvZGUgd2l0aCB0aGUgLWRlYnVnIG9wdGlvbiBvZiB0aGUgQU5UTFIgdG9vbCwgYXMgcGVyIGFueSBvdGhlciB0YXJnZXQuCisvLy8KKy8vLyBOb3RlIHRoYXQgd2hlbiB5b3UgaW52b2tlIHlvdXIgZGVidWdnaW5nIHZlcnNpb24gb2YgdGhlIHBhcnNlciwgaXQgd2lsbCBhcHBlYXIgdG8gaGFuZworLy8vIGJ1dCBpcyBpbiBmYWN0IHdhaXRpbmcgb24gYSBsb2NhbCBUQ1Agc29ja2V0IGNvbm5lY3Rpb24gZnJvbSB0aGUgQU5UTFJXb3JrcyBkZWJ1Z2dlci4gQXMgdGhlCisvLy8gdGFyZ2V0IGVudmlyb25tZW50IGlzIHVua25vd24sIGl0IGlzIG5vdCBwcnVkZW50IHRvIGdlbmVyYXRlIG5vdGlmaWNhdGlvbiBzdGF0dXMgbWVzc2FnZXMKKy8vLyB1c2luZyBzb21ldGhpbmcgbGlrZSBwcmludGYsIGFzIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgbWF5IG5vdCBoYXZlIGEgY29uc29sZSBvciBpbXBsZW1lbnQKKy8vLyBwcmludGYuCisvLy8KKy8vLyBcc2VjdGlvbiBtYWNyb3MgTWFjcm8gQ2hhbmdlcworLy8vCisvLy8gUHJpb3IgdG8gdGhlIDMuMSByZWxlYXNlLCBhY2Nlc3NpbmcgdGhlIHRva2VuIHNvdXJjZSBvZiBhIGxleGVyIHJlcXVpcmVkIGtub3dsZWRnZSBvZiB3aGVyZQorLy8vIHRoZSB0b2tlbiBzb3VyY2UgcG9pbnRlciB3YXMgbG9jYXRlZCB3aWh0aW4gdGhlIGxleGVyLiBJbiAzLjEsIHRoZSB0b2tlbiBzb3VyY2Ugd2FzIGJ1cnJpZWQKKy8vLyBmdXJ0aGVyIGluIHRoZSBpbm5hcmRzIG9mIHRoZSBDIHJ1bnRpbWUgYW5kIHN1Y2gga25vd2xlZGdlIGlzIGNvbnNpZGVyZCBpcnJlbGVhdmFudCBhbmQgY29uZnVzaW5nLgorLy8vIEhlbmNlLCB3aGVuIGNyZWF0aW5nIGEgdG9rZW4gc3RyZWFtIGZyb20gYSB0b2tlbiBzb3VyY2UsIGl0IGlzIG5vdyBtYW5kYXRvcnkgdG8gdXNlIHRoZSBuZXcKKy8vLyBDIG1hY3JvIFRPS0VOU09VUkNFKGx4ciksIHdoaWNoIHdpbGwgZXhwYW5kIHRvIHBvaW50IGF0IHRoZSB0b2tlbiBzb3VyY2UgaW50ZXJmYWNlLiBUaGlzIE1BQ1JPCisvLy8gd2lsbCBiZSBtYWludGFpbmVkIGFjcm9zcyBmdXR1cmUgdmVyc2lvbnMuIFlvdSBjYW4gc2VlIGhvdyB0byB1c2UgaXQgaW4gdGhlIGRvd25sb2FkYWJsZSAKKy8vLyBleGFtcGxlcywgYXZhaWFibGUgZnJvbSB0aGUgZG93bmxvYWRzIHBhZ2Ugb2YgdGhlIEFOVExSIHdlYiBzaXRlLiBIZXJlIGlzIHRoZSByZWxldmFudCBjb2RlCisvLy8gZm9yIGNyZWF0aW5nIGEgdG9rZW4gc3RyZWFtLCBleHRyYWN0ZWQgZnJvbSB0aG9zZSBleGFtcGxlczoKKy8vLworLy8vIFxjb2RlCisvLy8gdHN0cmVhbSA9IGFudGxyM0NvbW1vblRva2VuU3RyZWFtU291cmNlTmV3KEFOVExSM19TSVpFX0hJTlQsIFRPS0VOU09VUkNFKGx4cikpOworLy8vIFxlbmRjb2RlCisvLy8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2RveHlnZW5ncm91cHMuZG94IGIvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2RveHlnZW5ncm91cHMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjU5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vZG94eWdlbmdyb3Vwcy5kb3gKQEAgLTAsMCArMSwyNDMgQEAKKy8vIERlZmluaXRpb25zIG9mIGRvY3VtZW50YXRpb24gZ3JvdXBzIHNvIHdlIGNhbiBvcmdhbml6ZSB0aGUgQVBJIGFuZAorLy8gdXNhZ2UgZG9jdW1lbnRhdGlvbiBuaWNlbHkuCisKKy8vLyBcZGVmZ3JvdXAgYXBpY2xhc3NlcyBBUEkgQ2xhc3NlcworLy8vCisvLy8gVGhlIEFQSSBjbGFzc2VzIGFyZSBkaXZpZGVkIGludG8gdGhlIHR5cGRlZnMgKGFuZCB0aGVpciB1bmRlcmx5aW5nIHN0cnVjdHMpCisvLy8gdGhhdCBhcmUgdGhlIGNvbnRhaW5lcnMgZm9yIGVhY2ggJ29iamVjdCcgd2l0aGluIHRoZSBBTlRMUjNDIHJ1bnRpbWUsIGFuZAorLy8vIHRoZWlyIGltcGxlbWVudGF0aW9ucyAodGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCBpbiB0bworLy8vIHRoZXNlIHN0cnVjdHVyZXMgd2hlbiB5b3UgY3JlYXRlIHRoZW0uKQorLy8vCisvLy8gVGhlIHR5cGVkZWZzIGNvbnRhaW4gZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMsIHdoaWNoIHRvZ2V0aGVyIGRlZmluZQorLy8vIHRoZSBvYmplY3QuIFRoZSBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMgYXJlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucworLy8vIG9mIHRoZSAnbWV0aGRzJyBlbmNhcHN1bGF0ZWQgYnkgdGhlIHR5cGRlZiBzdHJ1Y3R1cmVzLllvdSBtYXkgb3ZlcnJpZGUgCisvLy8gYW55IG9mIHRoZSBtZXRob2RzIG9uY2UgdGhlaXIgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBpbnN0YWxsaW5nIGEgcG9pbnRlciB0byAKKy8vLyB5b3VyIG93biBmdW5jdGlvbi4gU29tZSBvZiB0aGVzZSBtZXRob2RzIGNyZWF0ZSBvdGhlciAnb2JqZWN0cycgKGluc3RhbmNlcyBvZgorLy8vIHR5cGVkZWYgc3RydWN0dXJlcyksIHdoaWNoIGFsbG93cyB5b3UgaW5zdGFsbCB5b3VyIG93biBtZXRob2QgYW5kIGNyZWF0ZSB5b3VyCisvLy8gb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlLgorLy8vCisKKwkvLy8gXGRlZmdyb3VwIGFwaXN0cnVjdHVyZXMgQVBJIFR5cGVkZWZzIGFuZCBTdHJ1Y3RzCisJLy8vIFxpbmdyb3VwIGFwaWNsYXNzZXMKKwkvLy8KKwkvLy8gVGhlc2Ugc3RydWN0dXJlcyAoYW5kIHRoZSB0eXBlZGVmcyB0aGF0IHlvdSB1c2UgdG8gcmVmZXJlbmNlIHRoZW0KKwkvLy8gYW5kIHRoZWlyIHBvaW50ZXJzKSBhcmUgdGhlIEMgZXF1aXZhbGVudCBvZiBvYmplY3RzLiBUaGV5IGNvcnJlc3BvbmQKKwkvLy8gKHJvdWdobHkpIHRvIHRoZSBKYXZhIHJ1bnRpbWUgc3lzdGVtIGNsYXNzZXMgYW5kIGNvbnRhaW4gYWxsIHRoZQorCS8vLyBkYXRhIGVsZW1lbnRzIGZvciBhIHBhcnRpY3VsYXIgaW50ZXJmYWNlIGFzIHdlbGwgYXMgYWxsIHRoZSBwb2ludGVycworCS8vLyB0byBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgdGhlc2UgaW50ZXJmYWNlcy4KKwkvLy8KKwkvLy8gVGhlcmUgYXJlIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBleHBvcnRlZCBmcm9tIHRoZSBDIHJ1bnRpbWUsIHdoaWNoIHlvdQorCS8vLyB1c2UgdG8gY3JlYXRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBvbmUgb2YgdGhlc2UgJ2NsYXNzZXMnLiBZb3UgY2FuCisJLy8vIHRoZW4gb3ZlcnJpZGUgYW55IHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIGJ5IGluc3RhbGxpbmcgeW91ciBvd24KKwkvLy8gZnVuY3Rpb24gcG9pbnRlcnMsIGJlZm9yZSB1c2luZyB0aGUgaW50ZXJmYWNlICdvYmplY3QnIHlvdSBoYXZlIGNyZWF0ZWQuCisJLy8vCisJLy8vIEZvciBpbnN0YW5jZSwgeW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlIHJlcG9ydGluZyBmdW5jdGlvbgorCS8vLyBieSByZXBsYWNpbmcgdGhlIHN0YW5kYXJkIChleGFtcGxlKSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHdpdGgKKwkvLy8geW91ciBvd24uIEluIHlvdXIgZ3JhbW1hciwgeW91IHdvdWxkIHBsYWNlIHRoZSBmb2xsb3dpbmcKKwkvLy8KKwkvLy8gXGNvZGUKKwkvLy8gQHBhcnNlcjo6YXBpZnVuY3MKKwkvLy8geworCS8vLyAgICAvLyBJbnN0YWxsIGN1c3RvbSBlcnJvciBtZXNzYWdlIGRpc3BsYXkKKwkvLy8gICAgLy8KKwkvLy8gICAgUkVDT0dOSVpFUi0+ZGlzcGxheVJlY29nbml0aW9uRXJyb3IgPSBwcm9kdWNlRXJyb3I7CisJLy8vIH0KKwkvLy8gXGVuZGNvZGUKKwkvLy8KKwkvLy8gVGhlIHNwZWNpYWwgc2VjdGlvbiBAcGFyc2VyOjphcGlGdW5jcyBpcyBndWFyYW50ZWVkIHRvIGJlIGdlbmVyYXRlZCBhZnRlcgorCS8vLyB0aGUgUkVDT05HSVpFUiAnb2JqZWN0JyBoYXMgYWxyZWFkeSBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCwgc28geW91IG1heQorCS8vLyBpbnN0YWxsIHlvdXIgb3duIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgI0FOVExSM19CQVNFX1JFQ09HTklaRVIgaW50ZXJmYWNlCisJLy8vIGZ1bmN0aW9ucy4gVGhlIGVycm9yIGRpc3BsYXkgZnVuY3Rpb24gaXMgbGlrZWx5IHRvIGJlIHRoZSBvbmx5IG9uZSB5b3UgYXJlCisJLy8vIGludGVyZXN0ZWQgaW4gcmVwbGFjaW5nLgorCS8vLworCS8vLyBTb21lIHR5cGVkZWYgc3RydWN0dXJlcyBjb250YWluIGVpdGhlciBwb2ludGVycyB0byAnaW5oZXJpdGVkJyBvYmplY3RzICh1c3VhbCkKKwkvLy8gb3IgZW1iZWRkZWQgc3RydWN0dXJlcy90eXBlZGVmcyAodW51c3VhbCkuIEluIHNvbWUgY2FzZXMsIHRoZSBwb2ludGVycyBwYXNzZWQKKwkvLy8gYXJvdW5kIGJ5IHRoZSBwYXJlc3Igb3IgdHJlZSBwYXJzZXIgYXJlIGFjdHVhbGx5IHRoZSBwb2ludGVycyB0byB0aGVzZSBlbWJlZGRlZAorCS8vLyBzdHJ1Y3R1cmVzIChzdWNoIGFzICNwQU5UTFIzX0JBU0VfVFJFRSksIGFuZCB0aGVzZSBlbWJlZGRlZCAnb2JqZWN0cycgY29udGFpbgorCS8vLyBwb2ludGVycyB0byB0aGVpciBlbmNhcHN1bGF0aW5nIG9iamVjdHMuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgcGFzc2luZworCS8vLyBpbnRlcmZhY2Ugb2JqZWN0cyBhcm91bmQgaW4gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlcy4KKwkvLy8KKwkKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIEFOVExSM19CQVNFX1JFQ09HTklaRVIgLSBCYXNlIFJlY29nbml6ZXIgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8KKwkJLy8vIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGJhc2UgcmVjb2duaXplciBpbnRlcmZhY2UsIGluc3RhbnRpYXRpb25zCisJCS8vLyBvZiB3aGljaCBhcmUgcmVmZXJyZWQgdG8gdmlhICNwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUi4KKwkJLy8vCisJCS8vLyBJbiBnZW5lcmFsIHlvdSB3aWxsIG5vdCByZWZlciB0byBvbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBkaXJlY3RseSBhcyBhCisJCS8vLyBhICNwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiB3aWxsIGJlIGVtYmVkZGVkIHdpdGhpbiBhIGhpZ2hlciBsZXZlbAorCQkvLy8gb2JqZWN0IHN1Y2ggYXMgI3BBTlRMUjNfUEFSU0VSCisJCS8vLworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgUmVjb2duaXplciBTaGFyZWQgU3RhdGUgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19CSVRTRVQJQU5UTFIzX0JJVFNFVCAtIEJpdHNldCBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgLSBUb2tlbiBGYWN0b3J5IENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQ09NTU9OX1RPS0VOIEFOVExSM19DT01NT05fVE9LRU4gLSBDb21tb24gVG9rZW4gQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19FWENFUFRJT04gQU5UTFIzX0VYQ0VQVElPTiAtIEV4Y2VwdGlvbiBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX0hBU0hfQlVDS0VUIEFOVExSM19IQVNIX0JVQ0tFVCAtIEhhc2ggVGFibGUgQnVja2V0IENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfSEFTSF9FTlRSWSBBTlRMUjNfSEFTSF9FTlRSWSAtIEhhc2ggVGFibGUgRW50cnkgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19IQVNIX0VOVU0gQU5UTFIzX0hBU0hfRU5VTSAtIEhhc2ggVGFibGUgRW51bWVyYXRvciBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX0hBU0hfVEFCTEUgQU5UTFIzX0hBU0hfVEFCTEUgLSBIYXNoIFRhYmxlIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfTElTVCBBTlRMUjNfTElTVCAtIExpc3QgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19WRUNUT1JfRkFDVE9SWSBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlkgLSBWZWN0b3IgRmFjdG9yeSBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX1ZFQ1RPUiBBTlRMUjNfVkVDVE9SIC0gVmVjdG9yIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfU1RBQ0sgQU5UTFIzX1NUQUNLIC0gU3RhY2sgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19JTlBVVF9TVFJFQU0gQU5UTFIzX0lOUFVUX1NUUkVBTSAtIElucHV0IFN0cmVhbSBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX0xFWF9TVEFURSBBTlRMUjNfTEVYX1NUQVRFIC0gTGV4ZXIgU3RhdGUgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19TVFJJTkdfRkFDVE9SWSBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgLSBTdHJpbmcgRmFjdG9yeSBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX1NUUklORyBBTlRMUjNfU1RSSU5HIC0gU3RyaW5nIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfVE9LRU5fU09VUkNFIEFOVExSM19UT0tFTl9TT1VSQ0UgLSBUb2tlbiBTb3VyY2UgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19UT0tFTl9TVFJFQU0gQU5UTFIzX1RPS0VOX1NUUkVBTSAtIFRva2VuIFN0cmVhbSBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gLSBDb21tb24gVG9rZW4gU3RyZWFtIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQ1lDTElDX0RGQSBBTlRMUjNfQ1lDTElDX0RGQSAtIEN5Y2xpYyBERkEgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19MRVhFUiBBTlRMUjNfTEVYRVIgLSBMZXhlciBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX1BBUlNFUiBBTlRMUjNfUEFSU0VSIC0gUGFyc2VyIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQkFTRV9UUkVFIEFOVExSM19CQVNFX1RSRUUgLSBCYXNlIFRyZWUgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19DT01NT05fVFJFRSBBTlRMUjNfQ09NTU9OX1RSRUUgLSBDb21tb24gVHJlZSBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX0FSQk9SRVRVTSBBTlRMUjNfQVJCT1JFVFVNIC0gVHJlZSBGYWN0b3J5IENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfUEFSU0VfVFJFRSBBTlRMUjNfUEFSU0VfVFJFRSAtIFBhcnNlIFRyZWUgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19UUkVFX05PREVfU1RSRUFNIEFOVExSM19UUkVFX05PREVfU1RSRUFNIC0gVHJlZSBOb2RlIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIC0gQ29tbW9uIFRyZWUgTm9kZSBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX1RSRUVfV0FMS19TVEFURSBBTlRMUjNfVFJFRV9XQUxLX1NUQVRFIC0gVHJlZSBXYWxrIFN0YXRlIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIC0gQmFzZSBUcmVlIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKwkJLy8vIFxkZWZncm91cCBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUiBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUiAtIENvbW1vbiBUcmVlIEFkYXB0b3IgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19UUkVFX1BBUlNFUiBBTlRMUjNfVFJFRV9QQVJTRVIgLSBUcmVlIFBhcnNlciBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisJCS8vLyBcZGVmZ3JvdXAgQU5UTFIzX0lOVF9UUklFIEFOVExSM19JTlRfVFJJRSAtIFRyaWUgQ2xhc3MgRGVmaW5pdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpc3RydWN0dXJlcworCQkvLy8gXGRlZmdyb3VwIEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSAtIFRva2VuIFJld3JpdGUgU3RyZWFtIENsYXNzIERlZmluaXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKyAgCQkvLy8gXGRlZmdyb3VwIEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgLSBEZWJ1Z2dlciBDbGFzcyBEZWZpbml0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlzdHJ1Y3R1cmVzCisgIAorCS8vLyBcZGVmZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zIEFQSSBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKKwkvLy8gXGluZ3JvdXAgYXBpY2xhc3NlcworCS8vLworCS8vLyBBUEkgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zIGFyZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBlYWNoIG9mIHRoZQorCS8vLyBtZXRob2RzIGluIGEgcGFydGljdWxhciB0eXBlZGVmIHN0cnVjdHVyZS4gCisJLy8vCisJLy8vIFRoZXkgYXJlIGdlbmVyYWxseSBncm91cGVkIHRvZ2V0aGVyIGluIHRoZSBzYW1lIHNvdXJjZSBjb2RlIGZpbGUuIAorCS8vLyBGb3IgaW5zdGFuY2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZQorCS8vLyBtZXRob2RzIGNvbnRhaW5lZCBieSBhICNwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiB3aWxsIGJlIGZvdW5kIGluIHRoZSBmaWxlCisJLy8vIGFudGxyM2Jhc2VyZWNvZ25pemVyLmMKKwkvLy8KKwkvLy8gQSBzb3VyY2UgZmlsZSB0aGF0IHByb3ZpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiBmdW5jdGlvbnMgd2lsbCB1c3VhbGx5CisJLy8vIGFsc28gc3VwcGx5IHRoZSBwdWJsaWMgKGV4cG9ydGVkIGZyb20gdGhlIC5ETEwgb3IgY29kZSBsaWJyYXJ5KSAnY29uc3RydWN0b3InIGZ1bmN0aW9ucworCS8vLyB0aGF0IGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgdHlwZWRlZiBzdHJ1Y3R1cmUgdGhhdCB0aGV5IGltcGxlbWVudC4gRm9yIGluc3RhbmNlLAorCS8vLyBpbiB0aGUgYW50bHIzYmFzZXJlY29nbml6ZXIuYyBmaWxlLCB5b3Ugd2lsbCBmaW5kIHRoZSBmdW5jdGlvbiBhbnRscjNCYXNlUmVjb2duaXplck5ldygpCisJLy8vCisKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiBCYXNlIFJlY29nbml6ZXIgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8KKwkJLy8vIFRoZSBiYXNlIHJlY29nbml6ZXIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBoaWdoZXIgbGV2ZWwgcmVjb2duaXplcnMKKwkJLy8vIHN1Y2ggYXMgI3BBTlRMUjNfUEFSU0VSIGFuZCBwcm92aWRlcyBtZXRob2RzIGNvbW1vbiB0byBhbGwgcmVjb2duaXplcnMuCisJCS8vLworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSAtIFJlY29nbml6ZXIgU2hhcmVkIFN0YXRlIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vCisJCS8vLyBUaGUgcmVjb2duaXplciBzaGFyZWQgc3RhdGUgY2xhc3MgZG9lcyBub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIGl0IGNvbnRhaW5zIG9ubHkKKwkJLy8vIGRhdGEgZmllbGRzLCBkb2N1bWVudGVkIGF0ICNBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUKKwkJLy8vCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19CSVRTRVQgcEFOVExSM19CSVRTRVQgLSBCaXRzZXQgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfVE9LRU5fRkFDVE9SWSBwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgLSBUb2tlbiBGYWN0b3J5IEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBwQU5UTFIzX0NPTU1PTl9UT0tFTiAtIENvbW1vbiBUb2tlbiBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19FWENFUFRJT04JcEFOVExSM19FWENFUFRJT04gLSBFeGNlcHRpb24gSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfSEFTSF9CVUNLRVQgcEFOVExSM19IQVNIX0JVQ0tFVCAtIEhhc2ggVGFibGUgQnVja2V0IEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0hBU0hfRU5UUlkgcEFOVExSM19IQVNIX0VOVFJZIC0gSGFzaCBUYWJsZSBFbnRyeSBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19IQVNIX0VOVU0gcEFOVExSM19IQVNIX0VOVU0gLSBIYXNoIFRhYmxlIEVudW1lcmF0b3IgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfSEFTSF9UQUJMRSBwQU5UTFIzX0hBU0hfVEFCTEUgLSBIYXNoIFRhYmxlIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0xJU1QgcEFOVExSM19MSVNUIC0gTGlzdCBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19WRUNUT1JfRkFDVE9SWSBwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZIC0gVmVjdG9yIEZhY3RvcnkgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfVkVDVE9SIHBBTlRMUjNfVkVDVE9SIC0gVmVjdG9yIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX1NUQUNLIHBBTlRMUjNfU1RBQ0sgLSBTdGFjayBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19JTlBVVF9TVFJFQU0gcEFOVExSM19JTlBVVF9TVFJFQU0gLSBJbnB1dCBTdHJlYW0gSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfTEVYX1NUQVRFIHBBTlRMUjNfTEVYX1NUQVRFIC0gTGV4ZXIgU3RhdGUgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgcEFOVExSM19TVFJJTkdfRkFDVE9SWSAtIFN0cmluZyBGYWN0b3J5IEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX1NUUklORyBwQU5UTFIzX1NUUklORyAtIFN0cmluZyBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19UT0tFTl9TT1VSQ0UgcEFOVExSM19UT0tFTl9TT1VSQ0UgLSBUb2tlbiBTb3VyY2UgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfVE9LRU5fU1RSRUFNIHBBTlRMUjNfVE9LRU5fU1RSRUFNIC0gVG9rZW4gU3RyZWFtIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIC0gQ29tbW9uIFRva2VuIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0NZQ0xJQ19ERkEgcEFOVExSM19DWUNMSUNfREZBIC0gQ3ljbGljIERGQSBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19MRVhFUiBwQU5UTFIzX0xFWEVSIC0gTGV4ZXIgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfUEFSU0VSIHBBTlRMUjNfUEFSU0VSIC0gUGFyc2VyIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0JBU0VfVFJFRSBwQU5UTFIzX0JBU0VfVFJFRSAtIEJhc2UgVHJlZSBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19DT01NT05fVFJFRSBwQU5UTFIzX0NPTU1PTl9UUkVFIC0gQ29tbW9uIFRyZWUgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfQVJCT1JFVFVNIHBBTlRMUjNfQVJCT1JFVFVNIC0gVHJlZSBGYWN0b3J5IEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX1BBUlNFX1RSRUUgcEFOVExSM19QQVJTRV9UUkVFIC0gUGFyc2UgVHJlZSBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19UUkVFX05PREVfU1RSRUFNIHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTSAtIFRyZWUgTm9kZSBTdHJlYW0gSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSAtIENvbW1vbiBUcmVlIE5vZGUgU3RyZWFtIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX1RSRUVfV0FMS19TVEFURSBwQU5UTFIzX1RSRUVfV0FMS19TVEFURSAtIFRyZWUgV2FsayBTdGF0ZSBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCS8vLyBcZGVmZ3JvdXAgcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIC0gQmFzZSBUcmVlIEFkYXB0b3IgSW1wbGVtZW50YXRpb24KKwkJLy8vIFxpbmdyb3VwIGFwaWltcGxlbWVudGF0aW9ucworCQkvLy8gXGRlZmdyb3VwIHBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUiBwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1IgLSBDb21tb24gVHJlZSBBZGFwdG9yIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX1RSRUVfUEFSU0VSIHBBTlRMUjNfVFJFRV9QQVJTRVIgLSBUcmVlIFBhcnNlckltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0lOVF9UUklFIHBBTlRMUjNfSU5UX1RSSUUgLSBUcmllIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSAtIFRva2VuIFJld3JpdGUgU3RyZWFtIEltcGxlbWVudGF0aW9uCisJCS8vLyBcaW5ncm91cCBhcGlpbXBsZW1lbnRhdGlvbnMKKwkJLy8vIFxkZWZncm91cCBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgLSBEZWJ1Z2dlciBJbXBsZW1lbnRhdGlvbgorCQkvLy8gXGluZ3JvdXAgYXBpaW1wbGVtZW50YXRpb25zCisJCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9nZW5lcmF0ZS5kb3ggYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vZ2VuZXJhdGUuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzNkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vZ2VuZXJhdGUuZG94CkBAIC0wLDAgKzEsNTcgQEAKKy8vLyBccGFnZSBnZW5lcmF0ZSBHZW5lcmF0aW5nIENvZGUgZm9yIHRoZSBDIFRhcmdldAorLy8vCisvLy8gXHNlY3Rpb24gZ2VuZXJhdGUgR2VuZXJhdGluZyBDCisvLy8KKy8vLyBCZWZvcmUgZGlzY3Vzc2luZyBob3cgd2UgY29tcGlsZSBvciBjYWxsIHRoZSBnZW5lcmF0ZWQgQyBjb2RlLCB3ZSBuZWVkIHRvIGtub3cgaG93IHRvIGludm9rZSB0aGUgQyBjb2RlIGdlbmVyYXRvci4gCisvLy8gVGhpcyBpcyBhY2hpZXZlZCB3aXRoaW4gdGhlIGdyYW1tYXIgZmlsZSBpdHNlbGYsIHVzaW5nIHRoZSBsYW5ndWFnZSBvcHRpb246CisvLy8KKy8vLyBcdmVyYmF0aW0KK29wdGlvbnMgewlsYW5ndWFnZSA9IEM7fQorXGVuZHZlcmJhdGltCisvLy8KKy8vLyBUaGUgY29kZSBnZW5lcmF0b3IgY29uc2lzdHMgb2YgYSBzaW5nbGUgLmphdmEgZmlsZSB3aXRoaW4gdGhlIHN0YW5kYXJkIEFOVExSIHRvb2wgamFyLCBhbmQgYSBjb2RlIGdlbmVyYXRpb24gdGVtcGxhdGUsIAorLy8vIHVzZWQgYnkgdGhlIFN0cmluZ1RlbXBsYXRlIGVuZ2luZSwgd2hpY2ggZHJpdmVzIGNvZGUgZ2VuZXJhdGlvbiBmb3IgYWxsIGxhbmd1YWdlIHRhcmdldHMuIEluIGZhY3QgeW91IGNhbiBtYWtlIGNvcGllcyBvZiB0aGUgQy5zdGcgCisvLy8gYW5kIEFTVC5zdGcgdGVtcGxhdGVzIGFuZCBtYWtlIGNoYW5nZXMgdG8gdGhlbSAodGhvdWdoIHlvdSBhcmUgZW5jb3VyYWdlZCBub3QgdG8sIGFzIGl0IGlzIGJldHRlciB0byBwcm92aWRlIGJ1ZyBmaXhlcyBvciAKKy8vLyBlbmhhbmNlbWVudHMgd2hpY2ggd2UgYXJlIGhhcHB5IHRvIHJlY2VpdmUgcmVxdWVzdHMgZm9yIGFuZCB3aWxsIGRvIG91dCBiZXN0IHRvIGluY29ycG9yYXRlLgorLy8vCisvLy8gSWYgeW91IGFyZSB3b3JraW5nIGluIHRoZSBXaW5kb3dzIGVudmlyb25tZW50LCB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwNSBvciBsYXRlciwgeW91IG1heSB3aXNoIHRvIHV0aWxpemUgdGhlIGN1c3RvbSBydWxlZmlsZSAKKy8vLyBwcm92aWRlZCBpbiB0aGUgQyBzb3VyY2UgY29kZSBkaXN0cmlidXRpb24gdW5kZXIgdGhlIDxjb2RlPi4vdnMyMDA1PC9jb2RlPiBkaXJlY3RvcnkgZm9yIHRoaXMgcHVycG9zZS4gSWYgeW91IGFyZSB1c2luZyBhIHByZS1idWlsdCAKKy8vLyBsaWJyYXJ5IHRoZW4geW91IGNhbiBhbHNvIGRvd25sb2FkIHRoaXMgcnVsZSBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIEZpc2hFeWUgc291cmNlIGNvZGUgYnJvd3NlciBmb3IgQU5UTFIzLgorLy8vIAorLy8vIEluIG9yZGVyIHRvIHVzZSB0aGUgcnVsZWZpbGUsIHlvdSBtdXN0IGFkb3B0IHRoZSBmb2xsb3dpbmcgc3VmZml4ZXMgZm9yIHlvdXIgZ3JhbW1hciBmaWxlcywgdGhvdWdoIHRoZXkgYXJlIG90aGVyd2lzZSBvcHRpb25hbDoKKy8vLworLy8vIDx0YWJsZT4KKy8vLyAKKy8vLyA8dHI+CisvLy8gPHRoPiBTdWZmaXggPC90aD4KKy8vLyA8dGg+IEdyYW1tYXIgc2hvdWxkIGNvbnRhaW4uLi4gPC90aD4KKy8vLyA8L3RyPgorLy8vIDx0cj4KKy8vLyA8dGQ+IC5nM2wgPC90ZD4KKy8vLyA8dGQ+IEEgbGV4ZXIgZ3JhbW1hciBzcGVjaWZpY2F0aW9uIG9ubHkuIDwvdGQ+CisvLy8gPC90cj4KKy8vLyA8dHI+CisvLy8gPHRkPiAuZzNwIDwvdGQ+CisvLy8gPHRkPiBBIHBhcnNlciBncmFtbWFyIHNwZWNpZmljYXRpb24gb25seS4gPC90ZD4KKy8vLyA8L3RyPgorLy8vIDx0cj4KKy8vLyA8dGQ+IC5nM3BsIDwvdGQ+CisvLy8gPHRkPiBBIGNvbWJpbmVkIGxleGVyIGFuZCBwYXJzZXIgc3BlY2lmaWNhdGlvbi4gPC90ZD4KKy8vLyA8L3RyPgorLy8vIDx0cj4KKy8vLyA8dGQ+IC5nM3QgPC90ZD4KKy8vLyA8dGQ+IEEgdHJlZSBncmFtbWFyIHNwZWNpZmljYXRpb24uIDwvdGQ+CisvLy8gPC90cj4KKy8vLyAKKy8vLyA8L3RhYmxlPgorLy8vIAorLy8vIFlvdSBtYXkgYWxzbyB3aXNoIHRvIHVzZSB0aGVzZSBzdWZmaXhlcyBpZiB5b3UgYXJlIGJ1aWxkaW5nIHlvdXIgcHJvamVjdHMgdXNpbmcgTWFrZWZpbGVzLCBhcyB0aGlzIG1ha2VzIHRoZSBvdXRwdXQgZGV0ZXJtaW5pc3RpYy4gCisvLy8gSG93ZXZlciBpbiB0aGlzIGNhc2UgYSBtdWNoIGJldHRlciBzb2x1dGlvbiBpcyBwcm9iYWJseSB0byB1dGlsaXplIHRoZSAtZGVwZW5kIG9wdGlvbiBvZiB0aGUgQW50bHIgdG9vbCwgd2hpY2ggc2hvdWxkIHRlbGwgeW91ciAKKy8vLyBNYWtlZmlsZSB3aGF0IHRoZSBncmFtbWFyIGZpbGVzIGdlbmVyYXRlcywgaXJyZXNwZWN0aXZlIG9mIGl0cyBzdWZmaXguIEFOVExSIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGFjdHVhbCBzdWZmaXggeW91IHVzZSBmb3IgCisvLy8geW91ciBncmFtbWFyIGZpbGUsIHNvIGJ1aWxkaW5nIGZvciBtdWx0aXBsZSBwbGF0Zm9ybXMgaXMgcmVsYXRpdmVseSBlYXN5LgorLy8vCisvLy8gPGI+Tk9URTo8L2I+IFlvdXIgZ3JhbW1hciBzb3VyY2UsIHJlZ2FyZGxlc3Mgb2Ygc3VmZml4IG11c3QgYmUgbmFtZWQgdGhlIHNhbWUgYXMgdGhlIGdyYW1tYXIgc3RhdGVtZW50IHdpdGhpbiBpdC4gR3JhbW1hciB4eXoKKy8vLyBtdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBmaWxlIGNhbGxlZCB4eXouPGk+YW55dGhpbmc8L2k+CisvLy8KKy8vLyAKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2ludGVyb3AuZG94IGIvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL2ludGVyb3AuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDE1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vaW50ZXJvcC5kb3gKQEAgLTAsMCArMSwzMjcgQEAKKy8vLyBccGFnZSBpbnRlcm9wIEludGVyYWN0aW5nIHdpdGggdGhlIEdlbmVyYXRlZCBDb2RlCisvLy8KKy8vLyBcc2VjdGlvbiBpbnRybyBJbnRyb2R1Y3Rpb24KKy8vLworLy8vIFRoZSBtYWluIHdheSB0byBpbnRlcmFjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyB2aWEgYWN0aW9uIGNvZGUgcGxhY2VkIHdpdGhpbiA8Y29kZT57PC9jb2RlPiBhbmQKKy8vLyA8Y29kZT59PC9jb2RlPiBjaGFyYWN0ZXJzIGluIHlvdXIgcnVsZXMuIEluIGdlbmVyYWwsIHlvdSBhcmUgYWR2aXNlZCB0byBrZWVwIHRoZSBjb2RlIHlvdSBlbWJlZCB3aXRoaW4KKy8vLyB0aGVzZSBhY3Rpb25zLCBhbmQgdGhlIGdyYW1tYXIgaXRzZWxmIHRvIGFuIGFic29sdXRlIG1pbmltdW0uIFJhdGhlciB0aGFuIGVtYmVkIGNvZGUgZGlyZWN0bHkgaW4geW91cgorLy8vIGdyYW1tYXIsIHlvdSBzaG91bGQgY29uc3RydWN0IGFuIEFQSSwgdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgYWN0aW9ucyB3aXRoaW4geW91ciBncmFtbWFyLiBUaGlzIHdheQorLy8vIHlvdSB3aWxsIGtlZXAgdGhlIGdyYW1tYXIgY2xlYW4gYW5kIG1haW50YWluYWJsZSBhbmQgc2VwYXJhdGUgdGhlIGNvZGUgZ2VuZXJhdG9ycyBvciBvdGhlciBjb2RlCisvLy8gZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZ3JhbW1hciBpdHNlbGYuCisvLy8KKy8vLyBIb3dldmVyLCB3aGVuIHlvdSB3aXNoIHRvIGNhbGwgeW91ciBBUEkgZnVuY3Rpb25zLCBvciBpbnNlcnQgc21hbGwgcGllY2VzIG9mIGNvZGUgdGhhdCBkbyBub3QgCisvLy8gd2FycmFudCBleHRlcm5hbCBmdW5jdGlvbnMsIHlvdSB3aWxsIG5lZWQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mIHRva2VucywgcmV0dXJuIGVsZW1lbnRzIGZyb20gCisvLy8gcGFyc2VyIHJ1bGVzIGFuZCBwZXJoYXBzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHJlY29nbml6ZXIgaXRzZWxmLiBUaGUgQyBydW50aW1lIHByb3ZpZGVzIGEgbnVtYmVyCisvLy8gb2YgTUFDUk9zIHRoYXQgeW91IGNhbiB1c2Ugd2l0aGluIHlvdXIgYWN0aW9uIGNvZGUuIEl0IGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YgcGVyZm9ybWFudAorLy8vIHN0cnVjdHVyZXMgdGhhdCB5b3UgbWF5IGZpbmQgdXNlZnVsIGZvciBidWlsZGluZyBzeW1ib2wgdGFibGVzLCBsaXN0cywgdHJpZXMsIHN0YWNrcywgYXJyYXlzIGFuZCBzbyBvbiAoYWxsCisvLy8gb2Ygd2hpY2ggYXJlIG1hbmFnZWQgc28gdGhhdCB5b3VyIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW1zIGFyZSBtaW5pbWl6ZWQuKQorLy8vCisvLy8gXHNlY3Rpb24gcnVsZXMgUGFyYW1ldGVycyBhbmQgUmV0dXJucyBmcm9tIFBhcnNlciBSdWxlcworLy8vCisvLy8gVGhlIEMgdGFyZ2V0IGRvZXMgbm90IGRpZmZlciBmcm9tIHRoZSBKYXZhIHRhcmdldCBpbiBhbnkgbWFqb3Igd2F5cyBoZXJlLCBhbmQgeW91IHNob3VsZCBjb25zdWx0CisvLy8gdGhlIHN0YW5kYXJkIGRvY3VtZW50YXRpb24gZm9yIHRoZSB1c2Ugb2YgcGFyYW1ldGVycyBvbiBydWxlcyBhbmQgdGhlIHJldHVybnMgY2xhdXNlLiBZb3Ugc2hvdWxkCisvLy8gYmUgYXdhcmUgdGhvdWdoLCB0aGF0IHRoZSBydWxlcyBnZW5lcmF0ZSBDIGZ1bmN0aW9uIGNhbGxzIGFuZCB0aGVyZWZvcmUgdGhlIGlucHV0IGFuZCByZXR1cm5zCisvLy8gY2xhdXNlcyBhcmUgc3ViamVjdCB0byB0aGUgY29uc3RyYWludHMgb2YgQyBzY29waW5nLgorLy8vCisvLy8gWW91IHNob3VsZCBub3RlIHRoYXQgaWYgeW91ciBwYXJzZXIgcnVsZSByZXR1cm5zIG1vcmUgdGhhbiBhIHNpbmdsZSBlbnRpdHksIHRoZW4gdGhlIHJldHVybgorLy8vIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCBydWxlIGZ1bmN0aW9uIGlzIGEgc3RydWN0LCB3aGljaCBpcyByZXR1cm5lZCBieSB2YWx1ZS4gVGhpcyBpcyBhbHNvIHRoZSBjYXNlCisvLy8gaWYgeW91ciBydWxlIGlzIHBhcnQgb2YgYSB0cmVlIGJ1aWxkaW5nIGdyYW1tYXIgKHVzZXMgdGhlIDxjb2RlPm91dHB1dD1BU1Q7PC9jb2RlPiBvcHRpb24uCisvLy8KKy8vLyBPdGhlciB0aGFuIHRoZSBub3RlcyBhYm92ZSwgeW91IGNhbiB1c2UgYW55IHByZS1kZWNsYXJlZCB0eXBlIGFzIGFuIGlucHV0IG9yIG91dHB1dCBwYXJhbWV0ZXIKKy8vLyBmb3IgeW91ciBydWxlLiAKKy8vLworLy8vIFxzZWN0aW9uIG1lbW9yeSBNZW1vcnkgTWFuYWdlbWVudAorLy8vCisvLy8gWW91IGFyZSByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBhbmQgZnJlZWluZyBhbnkgbWVtb3J5IHVzZWQgYnkgeW91ciBvd24KKy8vLyBjb25zdHJ1Y3RzLCBBTlRMUiB3aWxsIHRyYWNrIGFuZCByZWxlYXNlIGFueSBtZW1vcnkgYWxsb2NhdGVkIGludGVybmFsbHkgZm9yIHRva2VucywgdHJlZXMsIHN0YWNrcywgc2NvcGVzCisvLy8gYW5kIHNvIG9uLiBUaGlzIG1lbW9yeSBpcyByZXR1cm5lZCB0byB0aGUgbWFsbG9jIHBvb2wgd2hlbiB5b3UgY2FsbCB0aGUgZnJlZSBtZXRob2Qgb2YgYW55CisvLy8gQU5UTFIzIHByb2R1Y2VkIHN0cnVjdHVyZS4KKy8vLworLy8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdG8gYXZvaWQgdGhyYXNoaW5nIHRoZSBtYWxsb2MgYWxsb2NhdGlvbiBzeXN0ZW0sIG1lbW9yeSBmb3IgYW15IGVsZW1lbnRzCisvLy8gb2YgeW91ciBnZW5lcmF0ZWQgcGFyc2VyIGlzIGFsbG9jYXRlZCBpbiBjaHVua3MgYW5kIHBhcmNlbGxlZCBvdXQgYnkgZmFjdG9yaWVzLiBGb3IgaW5zdGFuY2UgbWVtb3J5CisvLy8gZm9yIHRva2VucyBpcyBjcmVhdGVkIGFzIGFuIGFycmF5IG9mIHRva2VucywgYW5kIGEgdG9rZW4gZmFjdG9yeSBoYW5kcyBvdXQgdGhlIG5leHQgYXZhaWxhYmxlIHNsb3QKKy8vLyB0byB0aGUgbGV4ZXIuIFdoZW4geW91IGZyZWUgdGhlIGxleGVyLCB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyByZXR1cm5lZCB0byB0aGUgcG9vbC4gVGhlIHNhbWUgYXBwbGllcworLy8vIHRvICdzdHJpbmdzJyB0aGF0IGNvbnRhaW4gdGhlIHRva2VuIHRleHQgYW5kIHZhcmlvdXMgb3RoZXIgdGV4dCBlbGVtZW50cyBhY2Nlc3NlZCB3aXRoaW4gdGhlIGxleGVyLgorLy8vCisvLy8gVGhlIG9ubHkgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGFmdGVyIHlvdXIgcGFyc2UgYW5kIGFuYWx5c2lzIGlzIGNvbXBsZXRlLCBpZiB5b3Ugd2lzaCB0byByZXRhaW4KKy8vLyBhbnl0aGluZyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSwgeW91IG11c3QgY29weSBpdCBiZWZvcmUgZnJlZWluZyB0aGUgcmVjb2duaXplciBzdHJ1Y3R1cmVzLiBJbiBwcmFjdGljZQorLy8vIGl0IGlzIHVzdWFsbHkgcHJhY3RpY2FsIHRvIHJldGFpbiB0aGUgcmVjb2duaXplciBjb250ZXh0IG9iamVjdHMgdW50aWwgeW91ciBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlIG9yCisvLy8gdG8gdXNlIHlvdXIgb3duIGFsbG9jYXRpb24gc2NoZW1lIGZvciBnZW5lcmF0aW5nIG91dHB1dCBldGMuCisvLy8KKy8vLyBUaGUgYWR2YW50YWdlIG9mIHVzaW5nIG9iamVjdCBmYWN0b3JpZXMgaXMgb2YgY291cnNlIHRoYXQgbWVtb3J5IGxlYWtzIGFuZCBhY2Nlc3NpbmcgZGUtYWxsb2NhdGVkCisvLy8gbWVtb3J5IGFyZSBidWdzIHRoYXQgcmFyZWx5IG9jY3VyIHdpdGhpbiB0aGUgQU5UTFIzIEMgcnVudGltZS4gRnVydGhlciwgYWxsb2NhdGluZyBtZW1vcnkgZm9yIAorLy8vIHRva2VucywgdHJlZXMgYW5kIHNvIG9uIGlzIHZlcnkgZmFzdC4KKy8vLworLy8vIFxzZWN0aW9uIGN0eCBUaGUgQ1RYIE1hY3JvCisvLy8KKy8vLyBUaGUgQ1RYIG1hY3JvIGlzIGEgZnVuZGFtZW50YWwgcGFyYW1ldGVyIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYW55IGdlbmVyYXRlZCBmdW5jdGlvbgorLy8vIGNvbmNlcm5lZCB3aXRoIHlvdXIgbGV4ZXIsIHBhcnNlciwgb3IgdHJlZSBwYXJzZXIuIFRoZSBpcyBpcyB0aGUgY29udGV4dCBwb2ludGVyIGZvciB5b3VyIGdlbmVyYXRlZAorLy8vIHJlY29nbml6ZXIgYW5kIGlzIGhvdyB5b3UgaW52b2tlIHRoZSBnZW5lcmF0ZWQgZnVuY3Rpb25zLCBhbmQgYWNjZXNzIHRoZSBkYXRhIGVtYmVkZGVkIHdpdGhpbiB5b3VyIGdlbmVyYXRlZAorLy8vIHJlY29nbml6ZXIuIFdoaWxlIHlvdSBjYW4gdXNlIGl0IHRvIGRpcmVjdGx5IGFjY2VzcyBzdGFja3MsIHNjb3BlcyBhbmQgc28gb24sIHRoaXMgaXMgbm90IHJlYWxseSByZWNvbW1lbmRlZAorLy8vIGFzIHlvdSBzaG91bGQgdXNlIHRoZSAkeHh4IHJlZmVyZW5jZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGdlbmVyaWNhbGx5IHdpdGhpbiBBTlRMUiBncmFtbWFycy4KKy8vLworLy8vIFRoZSBjb250ZXh0IHBvaW50ZXIgaXMgdXNlZCBiZWNhdXNlIHRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgYW55IGdsb2JhbC9zdGF0aWMgdmFyaWFibGVzIGF0IGFsbCwgZWl0aGVyCisvLy8gd2l0aGluIHRoZSBnZW5lcmF0ZWQgY29kZSwgb3IgdGhlIEMgcnVudGltZS4gVGhpcyBpcyBvZiBjb3Vyc2UgZnVuZGFtZW50YWwgdG8gY3JlYXRpbmcgZnJlZSB0aHJlYWRpbmcKKy8vLyByZWNvZ25pemVycy4gV2hlcmV2ZXIgYSBmdW5jdGlvbiBjYWxsIG9yIHJ1bGUgY2FsbCByZXF1aXJlZCB0aGUgY3R4IHBhcmFtZXRlciwgeW91IGVpdGhlciByZWZlcmVuY2UgaXQKKy8vLyB2aWEgdGhlIENUWCBtYWNybywgb3IgdGhlIGN0eCBwYXJhbWV0ZXIgaXMgaW4gZmFjdCB0aGUgcmV0dXJuIHR5cGUgZnJvbSBjYWxsaW5nIHRoZSAnY29uc3RydWN0b3InCisvLy8gZnVuY3Rpb24gZm9yIHlvdXIgcGFyc2VyL2xleGVyL3RyZWUgcGFyc2VyIChzZWUgY29kZSBleGFtcGxlIGluICJIb3cgdG8gYnVpbGQgR2VuZXJhdGVkIENvZGUiIC4pCisvLy8KKy8vLyBcc2VjdGlvbiBtYWNyb3MgUHJlLURlZmluZWQgY29udmVuaWVuY2UgTUFDUk9zIAorLy8vCisvLy8gV2hpbGUgdGhlIGF1dGhvciBpcyBub3QgZm9uZCBvZiB1c2luZyBDIE1BQ1JPcyB0byBoaWRlIGNvZGUgb3Igc3RydWN0dXJlIGFjY2VzcywgaW4gdGhlIGNhc2Ugb2YgZ2VuZXJhdGVkCisvLy8gY29kZSwgdGhleSBzZXJ2ZSB0d28gdXNlZnVsIHB1cnBvc2VzLiBUaGUgZmlyc3QgaXMgdG8gc2ltcGxpZnkgdGhlIHJlZmVyZW5jZXMgdG8gaW50ZXJuYWwgY29uc3RydWN0cywKKy8vLyB0aGUgc2Vjb25kIGlzIHRvIGZhY2lsaXRhdGUgdGhlIGNoYW5nZSBvZiBhbnkgaW50ZXJuYWwgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHlvdSB0byBwb3J0IGdyYW1tYXJzCisvLy8gZnJvbSBlYXJsaWVyIHZlcnNpb25zIChqdXN0IHJlZ2VuZXJhdGUgYW5kIHJlY29tcGlsZSkuIEFzIG9mIHJlbGVhc2UgMy4xLCB0aGVzZSBtYWNyb3MgYXJlIHN0YWJsZSBhbmQKKy8vLyB3aWxsIG9ubHkgY2hhbmdlIHRoZWlyIHVzYWdlIGludGVyZmFjZSBpbiB0aGUgZXZlbnQgb2YgYnVncyBiZWluZyBkaXNjb3ZlcmVkLiBZb3UgYXJlIGVuY291cmFnZWQgdG8gCisvLy8gdXNlIHRoZXNlIG1hY3JvcyBpbiB5b3VyIGNvZGUsIHJhdGhlciB0aGFuIGFjY2VzcyB0aGUgcmF3IGludGVyZmFjZS4KKy8vLworLy8vIFxiTkI6IE1hY3JvcyB0aGF0IGFjdCBsaWtlIHN0YXRlbWVudHMgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSAnOycuIFRoZSBtYWNybyBib2R5IGRvZXMgbm90CisvLy8gc3VwcGx5IHRoaXMsIG5vciBzaG91bGQgaXQuIE1hY3JvcyB0aGF0IGNhbGwgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCB3aXRoICgpIGV2ZW4gaWYgdGhleQorLy8vIGhhdmUgbm8gcGFyYW1ldGVycywgbWFjcm9zIHRoYXQgcmVmZXJlbmNlIGZpZWxkcyBkbyBub3QgaGF2ZSBhICgpIGRlY2xhcmF0aW9uLgorLy8vCisvLy8gXHNlY3Rpb24gbGV4ZXJtYWNyb3MgTGV4ZXIgTWFjcm9zCisvLy8KKy8vLyBUaGVyZSBhcmUgYSBudW1iZXIgb2YgbWFjcm9zIHRoYXQgYXJlIHVzZWZ1bCBleGNsdXNpdmVseSB3aXRoaW4gbGV4ZXIgcnVsZXMuIFRoZXJlIGFyZSBhZGRpdGlvbmFsCisvLy8gbWFjcm9zLCBjb21tb24gdG8gYWxsIHJlY29nbml6ZXIsIGFuZCB0aGVzZSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgc2VjdGlvbiBDb21tb24gTWFjcm9zLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gbGV4ZXIgTEVYRVIKKy8vLworLy8vIFRoZSA8Y29kZT5MRVhFUjwvY29kZT4gbWFjcm8gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJhc2UgbGV4ZXIgb2JqZWN0LCB3aGljaCBpcyBvZiB0eXBlICNwQU5UTFIzX0xFWEVSLiBUaGlzIGlzCisvLy8gbm90IHRoZSBwb2ludGVyIHRvIHlvdXIgZ2VuZXJhdGVkIGxleGVyLCB3aGljaCBpcyBzdXBwbGllZCBieSB0aGUgQ1RYIG1hY3JvLAorLy8vIGJ1dCB0byB0aGUgY29tbW9uIGltcGxlbWVudGF0aW9uIG9mIGEgbGV4ZXIgaW50ZXJmYWNlLAorLy8vIHdoaWNoIGlzIHN1cHBsaWVkIHRvIGFsbCBnZW5lcmF0ZWQgbGV4ZXJzLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gbGV4c3RhdGUgTEVYU1RBVEUKKy8vLworLy8vIFByb3ZpZGVzIGEgcG9pbnRlciB0byB0aGUgbGV4ZXIgc2hhcmVkIHN0YXRlIHN0cnVjdHVyZSwgd2hpY2ggaXMgd2hlcmUgdGhlIHRva2VucyBmb3IgYQorLy8vIHJ1bGUgYXJlIGNvbnN0cnVjdGVkIGFuZCB0aGUgc3RhdHVzIGVsZW1lbnRzIG9mIHRoZSBsZXhlciBhcmUga2VwdC4gVGhpcyBwb2ludGVyIGlzIG9mIHR5cGUKKy8vLyAjcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURS5JbiBnZW5lcmFsIHlvdSBzaG91bGQgb25seSBhY2Nlc3MgZWxlbWVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUKKy8vLyBpZiB0aGVyZSBpcyBub3QgYWxyZWFkeSBhbm90aGVyIE1BQ1JPIG9yIHN0YW5kYXJkICR4eHh4IGFudGxyIHJlZmVyZW5jZSB0aGF0IHJlZmVycyB0byBpdC4KKy8vLworLy8vIFxzdWJzZWN0aW9uIGxhIExBKG4pCisvLy8KKy8vLyBUaGUgPGNvZGU+TEE8L2NvZGU+IG1hY3JvIHJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBpbmRleCBuIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtIGluZGV4LiBUaGUgcmV0dXJuIAorLy8vIHR5cGUgaXMgI0FOVExSM19VSU5UMzIuIEhlbmNlIDxjb2RlPkxBKDEpPC9jb2RlPiByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24gKHRoZQorLy8vIGNoYXJhY3RlciB0aGF0IHdpbGwgYmUgY29uc3VtZWQgbmV4dCksIDxjb2RlPkxBKC0xKTwvY29kZT4gcmV0dXJucyB0aGUgY2hhcmFjdGVyIHRoYXQgaGFzIGp1c3QgYmVlbiBjb25zdW1lZAorLy8vIGFuZCBzbyBvbi4gVGhlIDxjb2RlPkxBKG4pPC9jb2RlPiBtYWNybyBpcyB1c2VmdWwgZm9yIGNvbnN0cnVjdGluZyBzZW1hbnRpYyBwcmVkaWNhdGVzIGluIGxleGVyIHJ1bGVzLiBUaGUKKy8vLyByZWZlcmVuY2UgPGNvZGU+TEEoMCk8L2NvZGU+IGlzIHVuZGVmaW5lZCBhbmQgd2lsbCBjYXVzZSBhbiBlcnJvciBpbiB5b3VyIGxleGVyLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gZ2V0Y2hhcmluZGV4IEdFVENIQVJJTkRFWCgpCisvLy8KKy8vLyBUaGUgPGNvZGU+R0VUQ0hBUklOREVYPC9jb2RlPiBtYWNybyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgcG9zaXRpb24gYXMgYSAwIGJhc2VkCisvLy8gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzdHJlYW0uIEl0IHJldHVybnMgYSB2YWx1ZSB0eXBlIG9mICNBTlRMUjNfVUlOVDMyLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gZ2V0bGluZSBHRVRMSU5FKCkKKy8vLworLy8vIFRoZSA8Y29kZT5HRVRMSU5FPC9jb2RlPiBtYWNybyByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiBjdXJyZW50IGNoYXJhY3RlciAoPGNvZGU+TEEoMSk8L2NvZGU+IGluIHRoZSBpbnB1dAorLy8vIHN0cmVhbS4gSXQgcmV0dXJucyBhIHZhbHVlIHR5cGUgb2YgI0FOVExSM19VSU5UMzIuIE5vdGUgdGhhdCB0aGUgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQKKy8vLyBhdXRvbWF0aWNhbGx5IGJ5IGFuIGlucHV0IHN0cmVhbSB3aGVuIGl0IHNlZXMgdGhlIGlucHV0IGNoYXJhY3RlciAnXG4nLiBUaGUgY2hhcmFjdGVyIHRoYXQgY2F1c2VzCisvLy8gdGhlIGxpbmUgbnVtYmVyIHRvIGluY3JlbWVudCBjYW4gYmUgY2hhbmdlZCBieSBjYWxsaW5nIHRoZSBTZXROZXdMaW5lQ2hhcigpIG1ldGhvZCBvbiB0aGUgaW5wdXQKKy8vLyBzdHJlYW0gYmVmb3JlIGludm9raW5nIHRoZSBsZXhlciBhbmQgYWZ0ZXIgY3JlYXRpbmcgdGhlIGlucHV0IHN0cmVhbS4KKy8vLworLy8vIFxzdWJzZWN0aW9uIGdldHRleHQgR0VUVEVYVCgpCisvLy8KKy8vLyBUaGUgPGNvZGU+R0VUVEVYVDwvY29kZT4gbWFjcm8gcmV0dXJucyB0aGUgdGV4dCBjdXJyZW50bHkgbWF0Y2hlZCBieSB0aGUgbGV4ZXIgcnVsZS4gSW4gZ2VuZXJhbCB5b3Ugc2hvdWxkIHVzZSB0aGUKKy8vLyBnZW5lcmljICR0ZXh0IHJlZmVyZW5jZSBpbiBBTlRMUiB0byByZXRyaWV2ZSB0aGlzLiBUaGUgcmV0dXJuIHR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZSBvZiAjcEFOVExSM19TVFJJTkcKKy8vLyB3aGljaCBhbGxvd3MgeW91IHRvIG1hbmlwdWxhdGUgdGhlIHRleHQgeW91IGhhdmUgcmV0cmlldmVkIChcYiBOQiB0aGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgaW5wdXQgc3RyZWFtCisvLy8gb25seSB0aGUgdGV4dCB5b3UgY29weSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gd2hlbiB5b3UgdXNlIHRoaXMgTUFDUk8gb3IgJHRleHQpLiAKKy8vLworLy8vIFRoZSByZWZlcmVuY2UgJHRleHQtPmNoYXJzIG9yIEdFVFRFWFQoKS0+Y2hhcnMgd2lsbCByZWZlcmVuY2UgYSBwb2ludGVyIHRvIHRoZSAnXFwwJyB0ZXJtaW5hdGVkIGNoYXJhY3RlcgorLy8vIHN0cmluZyB0aGF0IHRoZSBBTlRMUjMgI3BBTlRMUjNfU1RSSU5HIHJlcHJlc2VudHMuIFN0cmluZyBzcGFjZSBpcyBhbGxvY2F0ZWQgYXV0b21hdGljYWxseSBhcyB3ZWxsIGFzCisvLy8gdGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBzdHJpbmcuIFRoZSAjcEFOVExSM19TVFJJTkdfRkFDVE9SWSBhc3NvY2lhdGVkIHdpdGggdGhlIGxleGVyIGhhbmRsZXMgdGhpcworLy8vIGFuZCB3aGVuIHlvdSBjbG9zZSB0aGUgbGV4ZXIsIGl0IHdpbGwgYXV0b21hdGljYWxseSBmcmVlIGFueSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHN0cmluZ3MgYW5kIHRoZWlyIHN0cnVjdHVyZXMuCisvLy8KKy8vLyBcc3Vic2VjdGlvbiBnZXRjaGFycG9zaXRpb25pbmxpbmUgR0VUQ0hBUlBPU0lUSU9OSU5MSU5FKCkKKy8vLworLy8vIFRoZSA8Y29kZT5HRVRDSEFSUE9TSVRJT05JTkxJTkU8L2NvZGU+IHJldHVybnMgdGhlIHplcm8gYmFzZWQgb2Zmc2V0IG9mIGNoYXJhY3RlciA8Y29kZT5MQSgxKTwvY29kZT4gCisvLy8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5wdXQgbGluZS4gU2VlIHRoZSBtYWNybyA8Y29kZT5HRVRMSU5FPC9jb2RlPiBmb3IgZGV0YWlscyBvbiB3aGF0IHRoZSAKKy8vLyBsaW5lIG51bWJlciBtZWFucy4KKy8vLworLy8vIFxzdWJzZWN0aW9uIGVtaXQgRU1JVCgpCisvLy8KKy8vLyBUaGUgbWFjcm8gPGNvZGU+RU1JVDwvY29kZT4gY2F1c2VzIHRoZSB0ZXh0IHJhbmdlIGN1cnJlbnRseSBtYXRjaGVkIHRvIHRoZSBsZXhlciBydWxlIHRvIGJlIGVtaXR0ZWQKKy8vLyBpbW1lZGlhdGVseSBhcyB0aGUgdG9rZW4gZm9yIHRoZSBydWxlLiBTdWJzZXF1ZW50IHRleHQgaXMgbWF0Y2hlZCBidXQgaWdub3JlZC4gVGhlIHR5cGUgdXNlZCBmb3IgdGhlCisvLy8gdGhlIHRva2VuIGlzIHRoZSBuYW1lIG9mIHRoZSBsZXhlciBydWxlIG9yLCBpZiB5b3UgaGF2ZSBjaGFuZ2UgdGhpcyBieSB1c2luZyAkdHlwZSA9IFhYWDssIHRoZSB0eXBlCisvLy8gWFhYIGlzIHVzZWQuCisvLy8KKy8vLyBcc3Vic2VjdGlvbiBlbWl0bmV3IEVNSVRORVcodCkKKy8vLworLy8vIFRoZSBtYWNybyA8Y29kZT5FTUlUTkVXPC9jb2RlPiBjYXVzZXMgdGhlIHN1cHBsaWVkIHRva2VuIHJlZmVyZW5jZSA8Y29kZT50PC9jb2RlPiB0byBiZSB1c2VkIGFzIHRoZQorLy8vIHRva2VuIGVtaXR0ZWQgYnkgdGhlIHJ1bGUuIFRoZSBwYXJhbWV0ZXIgPGNvZGU+dCA8L2NvZGU+IG11c3QgYmUgb2YgdHlwZSAjcEFOVExSM19DT01NT05fVE9LRU4uCisvLy8KKy8vLyBcc3Vic2VjdGlvbiBpbmRleCBJTkRFWCgpCisvLy8gCisvLy8gVGhlIDxjb2RlPklOREVYPC9jb2RlPiBtYWNybyByZXR1cm5zIHRoZSBjdXJyZW50IGlucHV0IHBvc2l0aW9uIGFjY29yZGluZyB0byB0aGUgaW5wdXQgc3RyZWFtLiBJdCBpcyBub3QKKy8vLyBndWFyYW50ZWVkIHRvIGJlIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSBpbnB1dCBzdHJlYW0gYnV0IGlzIGluc3RlYWQgdXNlZCBhcyBhIHZhbHVlCisvLy8gZm9yIG1hcmtpbmcgYW5kIHJld2luZGluZyB0byBzcGVjaWZpYyBwb2ludHMgaW4gdGhlIGlucHV0IHN0cmVhbS4gVXNlIHRoZSBtYWNybyA8Y29kZT5HRVRDSEFSSU5ERVgoKTwvY29kZT4KKy8vLyB0byBmaW5kIG91dCB0aGUgcG9zaXRpb24gb2YgdGhlIDxjb2RlPkxBKDEpPC9jb2RlPiBpbiB0aGUgaW5wdXQgc3RyZWFtLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gcHVzaHN0cmVhbSBQVVNIU1RSRUFNKHN0cikKKy8vLworLy8vIFRoZSA8Y29kZT5QVVNIU1RSRUFNPC9jb2RlPiBtYWNybywgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgPGNvZGU+UE9QU1RSRUFNPC9jb2RlPiBtYWNybyAoY2FsbGVkIGludGVybmFsbHkgaW4gdGhlIHJ1bnRpbWUgdXN1YWxseSkKKy8vLyBjYW4gYmUgdXNlZCB0byBzdGFjayBtYW55IGlucHV0IHN0cmVhbXMgdG8gdGhlIGxleGVyLCBhbmQgaW1wbGVtZW50IGNvbnN0cnVjdHMgc3VjaCBhcyB0aGUgQyBwcmUtcHJvY2Vzc29yCisvLy8gXCNpbmNsdWRlIGRpcmVjdGl2ZS4gCisvLy8gCisvLy8gQW4gaW5wdXQgc3RyZWFtIHRoYXQgaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjayBiZWNvbWVzIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSBmb3IgdGhlIGxleGVyIGFuZCAKKy8vLyB0aGUgc3RhdGUgb2YgdGhlIHByZXZpb3VzIHN0cmVhbSBpcyBhdXRvbWF0aWNhbGx5IHNhdmVkLiBUaGUgaW5wdXQgc3RyZWFtIHdpbGwgYmUgYXV0b21hdGljYWxseQorLy8vIHBvcHBlZCBmcm9tIHRoZSBzdGFjayB3aGVuIGl0IGlzIGV4aGF1c3RlZCBieSB0aGUgbGV4ZXIuIFlvdSBtYXkgdXNlIHRoZSBtYWNybyA8Y29kZT5QT1BTVFJFQU08L2NvZGU+CisvLy8gdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBpbnB1dCBzdHJlYW0gcHJpb3IgdG8gZXhoYXVzdGluZyB0aGUgY3VycmVudGx5IHN0YWNrZWQgaW5wdXQgc3RyZWFtLgorLy8vCisvLy8gSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZSBtYWNybyBpbiBhIGxleGVyIHRvIGltcGxlbWVudCB0aGUgQyBcI2luY2x1ZGUgcHJlLXByb2Nlc3NvciBkaXJlY3RpdmU6CisvLy8KKy8vLyBcY29kZQorLy8vIGZyYWdtZW50CisvLy8gU1RSSU5HX0dVVFMgOgkofignXFwnfCciJykgKSogOworLy8vCisvLy8gTElORV9DT01NQU5EIAorLy8vIDogJyMnICgnICcgfCAnXHQnKSoKKy8vLyAJKAorLy8vIAkgICAgJ2luY2x1ZGUnICgnICcgfCAnXHQnKSsgJyInIGZpbGUgPSBTVFJJTkdfR1VUUyAnIicgKCcgJyB8ICdcdCcpKiAnXHInPyAnXG4nCisvLy8gCQl7CisvLy8gCQkgICAgcEFOVExSM19TVFJJTkcJICAgIGZOYW1lOworLy8vIAkJICAgIHBBTlRMUjNfSU5QVVRfU1RSRUFNICAgIGluOworLy8vIAorLy8vIAkJICAgIC8vIENyZWF0ZSBhbiBpbml0aWFsIHN0cmluZywgdGhlbiB0YWtlIGEgc3Vic3RyaW5nCisvLy8gCQkgICAgLy8gV2UgY2FuIGRvIHRoaXMgYnkgbWVzc2luZyB3aXRoIHRoZSBzdGFydCBhbmQgZW5kCisvLy8gCQkgICAgLy8gcG9pbnRlcnMgb2YgdG9rZW5zIGFuZCBzbyBvbi4gVGhpcyBzaG93cyBhIHJlYXNvbmFibGUgd2F5IHRvCisvLy8gCQkgICAgLy8gbWFuaXB1bGF0ZSBzdHJpbmdzLgorLy8vIAkJICAgIC8vCisvLy8gCQkgICAgZk5hbWUgPSAkZmlsZS50ZXh0OworLy8vIAkJICAgIHByaW50ZigiSW5jbHVkaW5nIGZpbGUgJ1wlcydcbiIsIGZOYW1lLT5jaGFycyk7CisvLy8gCisvLy8gCQkgICAgLy8gQ3JlYXRlIGEgbmV3IGlucHV0IHN0cmVhbSBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2YgYnVpbHQgaW4gc3RyZWFtIHN0YWNraW5nCisvLy8gCQkgICAgLy8gaW4gQyB0YXJnZXQgcnVudGltZS4KKy8vLyAJCSAgICAvLworLy8vIAkJICAgIGluID0gYW50bHIzOEJpdEZpbGVTdHJlYW1OZXcoZk5hbWUtPmNoYXJzKTsKKy8vLyAJCSAgICBQVVNIU1RSRUFNKGluKTsKKy8vLyAKKy8vLyAJCSAgICAvLyBOb3RlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpcyBub3QgY2xvc2VkIHdoZW4gaXQgRU9GcywgSSBkb24ndCBib3RoZXIKKy8vLyAJCSAgICAvLyB0byBkbyBpdCBoZXJlLCBidXQgaXQgaXMgdXAgdG8geW91IHRvIHRyYWNrIHN0cmVhbXMgY3JlYXRlZCBsaWtlIHRoaXMKKy8vLyAJCSAgICAvLyBhbmQgZGVzdHJveSB0aGVtIHdoZW4gdGhlIHdob2xlIHBhcnNlIHNlc3Npb24gaXMgY29tcGxldGUuIFJlbWVtYmVyIHRoYXQgeW91CisvLy8gCQkgICAgLy8gZG9uJ3Qgd2FudCB0byBkbyB0aGlzIHVudGlsIGFsbCB0b2tlbnMgaGF2ZSBiZWVuIG1hbmlwdWxhdGVkIGFsbCB0aGUgd2F5IHRocm91Z2ggCisvLy8gCQkgICAgLy8geW91ciB0cmVlIHBhcnNlcnMgZXRjIGFzIHRoZSB0b2tlbiBkb2VzIG5vdCBzdG9yZSB0aGUgdGV4dCBpdCBqdXN0IHJlZmVycworLy8vIAkJICAgIC8vIGJhY2sgdG8gdGhlIGlucHV0IHN0cmVhbSBhbmQgdHJ5aW5nIHRvIGdldCB0aGUgdGV4dCBmb3IgaXQgd2lsbCBhYm9ydCBpZiB5b3UKKy8vLyAJCSAgICAvLyBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtIHRvbyBlYXJseS4KKy8vLyAJCSAgICAvLworLy8vIAorLy8vIAkJfQorLy8vICAgICAgICAgICAgIHwgKCgnMCcuLic5Jyk9PignMCcuLic5JykpKyB+KCdcbid8J1xyJykqICdccic/ICdcbicKKy8vLyAJICAgICkKKy8vLyAJIHskY2hhbm5lbD1ISURERU47fQorLy8vICAgICA7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFxzdWJzZWN0aW9uIHBvcHN0cmVhbSBQT1BTVFJFQU0oKQorLy8vCisvLy8gQXNzdW1pbmcgdGhhdCB5b3UgaGF2ZSBzdGFja2VkIGFuIGlucHV0IHN0cmVhbSB1c2luZyB0aGUgUFVTSFNUUkVBTSBtYWNybywgeW91IGNhbiAKKy8vLyByZW1vdmUgaXQgZnJvbSB0aGUgc3RyZWFtIHN0YWNrIGFuZCByZXZlcnQgdG8gdGhlIHByZXZpb3VzIGlucHV0IHN0cmVhbS4gWW91IHNob3VsZCBiZSBjYXJlZnVsCisvLy8gdG8gcG9wIHRoZSBzdHJlYW0gYXQgYW4gYXBwcm9wcmlhdGUgcG9pbnQgaW4geW91ciBsZXhlciBhY3Rpb24sIHNvIHlvdSBkbyBub3QgbWF0Y2ggY2hhcmFjdGVycworLy8vIGZyb20gb25lIHN0cmVhbSB3aXRoIHRob3NlIGZyb20gYW5vdGhlciBpbiB0aGUgc2FtZSBydWxlICh1bmxlc3MgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvKQorLy8vCisvLy8gXHN1YnNlY3Rpb24gc2V0dGV4dCBTRVRURVhUKHN0cikKKy8vLworLy8vIEEgdG9rZW4gbWFudWZhY3R1cmVkIGJ5IHRoZSBsZXhlciBkb2VzIG5vdCBhY3R1YWxseSBwaHlzaWNhbGx5IHN0b3JlIHRoZSB0ZXh0IGZyb20gdGhlCisvLy8gaW5wdXQgc3RyZWFtIHRvIHdoaWNoIGl0IG1hdGNoZXMuIFRoZSB0b2tlbiBzdHJpbmcgaXMgaW5zdGVhZCBjcmVhdGVkIG9ubHkgaWYgeW91IGFzayBmb3IKKy8vLyB0aGUgdGV4dC4gSG93ZXZlciBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIHRleHQgdGhhdCB0aGUgdG9rZW4gcmVwcmVzZW50cyB5b3UgY2FuIHVzZQorLy8vIHRoaXMgbWFjcm8gdG8gc2V0IGl0IGV4cGxpY2l0bHkuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgaW5wdXQgc3RyZWFtIHRleHQKKy8vLyBidXQgYXNzb2NpYXRlcyB0aGUgc3VwcGxpZWQgI3BBTlRMUjNfU1RSSU5HIHdpdGggdGhlIHRva2VuLiBUaGlzIHN0cmluZyBpcyB0aGVuIHJldHVybmVkCisvLy8gd2hlbiBwYXJzZXIgYW5kIHRyZWUgcGFyc2VyIHJlZmVyZW5jZSB0aGUgdG9rZW5zIHZpYSB0aGUgJHh4eC50ZXh0IHJlZmVyZW5jZS4KKy8vLworLy8vIFxzdWJzZWN0aW9uIHVzZXIxIFVTRVIxIFVTRVIyIFVTRVIzIGFuZCBDVVNUT00KKy8vLworLy8vIFdoaWxlIHlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIGN1c3RvbSB0b2tlbiBjbGFzcyBhbmQgaGF2ZSB0aGUgbGV4ZXIgZGVhbCB3aXRoIHRoaXMsIHRoaXMKKy8vLyBpcyBhIGxvdCBvZiB3b3JrIGNvbXBhcmVkIHRvIHRoZSB0cml2aWFsIGluaGVyaXRhbmNlIHRoYXQgY2FuIGJlIGFjaGlldmVkIGluIHRoZSBKYXZhIHRhcmdldC4KKy8vLyBJbiBtYW55IGNhc2VzIHRob3VnaCwgYWxsIHRoYXQgaXMgbmVlZGVkIGlzIHRoZSBhZGRpdGlvbiBvZiBhIGZldyBkYXRhIGl0ZW1zIHN1Y2ggYXMgYW4KKy8vLyBpbnRlZ2VyIG9yIGEgcG9pbnRlci4gUmF0aGVyIHRoYW4gcmVxdWlyZSBDIHByb2dyYW1tZXJzIHRvIGNyZWF0ZSBjb21wbGljYXRlZCBzdHJ1Y3R1cmVzCisvLy8ganVzdCB0byBhZGQgYSBmZXcgZGF0YSBpdGVtcywgdGhlIEMgdGFyZ2V0IHByb3ZpZGVzIGEgZmV3IGN1c3RvbSBmaWVsZHMgaW4gdGhlIHN0YW5kYXJkCisvLy8gdG9rZW4sIHdoaWNoIHdpbGwgZnVsZmlsIHRoZSBuZWVkcyBvZiBtb3N0IGxleGVycyBhbmQgcGFyc2Vycy4KKy8vLworLy8vIFRoZSB0b2tlbiBmaWVsZHMgdXNlcjEsIHVzZXIyLCBhbmQgdXNlcjMgYXJlIGFsbCB2YWx1ZSB0eXBlcyBvZiAjQU5UTFJfVUlOVDMyLiBJbiB0aGUKKy8vLyBwYXJzZXIgeW91IGNhbiByZWZlcmVuY2UgdGhlc2UgZmllbGRzIGRpcmVjdGx5IGZyb20gdGhlIHRva2VuOiA8Y29kZT54PVRPS05BTUUgeyAkeC0+dXNlcjEgLi4uPC9jb2RlPgorLy8vIGJ1dCB3aGVuIHlvdSBhcmUgYnVpbGRpbmcgdGhlIHRva2VuIGluIHRoZSBsZXhlciwgeW91IG11c3QgYXNzaWduIHRvIHRoZSBmaWVsZHMgdXNpbmcgdGhlCisvLy8gbWFjcm9zIDxjb2RlPlVTRVIxPC9jb2RlPiwgPGNvZGU+VVNFUjI8L2NvZGU+LCBvciA8Y29kZT5VU0VSMzwvY29kZT4uIEFzIGluOgorLy8vCisvLy8gXGNvZGUKKy8vLyBMRVhUT0s6ICdBQUFBQScgeyBVU0VSMSA9IDk5OyB9IDsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8KKy8vLyBcc2VjdGlvbiBwYXJzZXJtYWNyb3MgUGFyc2VyIGFuZCBUcmVlIFBhcnNlciBNYWNyb3MKKy8vLworLy8vIFxzdWJzZWN0aW9uIHBhcnNlciBQQVJTRVIKKy8vLworLy8vIFRoZSA8Y29kZT5QQVJTRVI8L2NvZGU+IG1hY3JvIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiYXNlIHBhcnNlciBvciB0cmVlIHBhcnNlciBvYmplY3QsIHdoaWNoIGlzIG9mIHR5cGUgI3BBTlRMUjNfUEFSU0VSCisvLy8gb3IgI3BBTlRMUjNfVFJFRV9QQVJTRVIgLiBUaGlzIGlzIG5vdCB0aGUgcG9pbnRlciB0byB5b3VyIGdlbmVyYXRlZCBwYXJzZXIsIHdoaWNoIGlzIHN1cHBsaWVkIGJ5IHRoZSA8Y29kZT5DVFg8L2NvZGU+IG1hY3JvLAorLy8vIGJ1dCB0byB0aGUgY29tbW9uIGltcGxlbWVudGF0aW9uIG9mIGEgcGFyc2VyIG9yIHRyZWUgcGFyc2VyIGludGVyZmFjZSwgd2hpY2ggaXMgc3VwcGxpZWQgdG8gYWxsIGdlbmVyYXRlZCBwYXJzZXJzLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gaW5kZXggSU5ERVgoKQorLy8vCisvLy8gV2hlbiB1c2VkIGluIHRoZSBwYXJzZXIsIHRoZSA8Y29kZT5JTkRFWDwvY29kZT4gbWFjcm8gcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQKKy8vLyB0b2tlbiAoIExUKDEpICkgaW4gdGhlIGlucHV0IHRva2VuIHN0cmVhbS4gSXQgY2FuIGJlIHVzZWQgZm9yIDxjb2RlPk1BUks8L2NvZGU+IGFuZCA8Y29kZT5SRVdJTkQ8L2NvZGU+IAorLy8vIG9wZXJhdGlvbnMuCisvLy8KKy8vLyBcc3Vic2VjdGlvbiBsdCBMVChuKSBhbmQgTEEobikKKy8vLworLy8vIEluIHRoZSBwYXJzZXIsIHRoZSBtYWNybyA8Y29kZT5MVChuKTwvY29kZT4gcmV0dXJucyB0aGUgI3BBTlRMUjNfQ09NTU9OX1RPS0VOIGF0IG9mZnNldCA8Y29kZT5uPC9jb2RlPiBmcm9tCisvLy8gdGhlIGN1cnJlbnQgdG9rZW4gc3RyZWFtIGlucHV0IHBvc2l0aW9uLiBUaGUgbWFjcm8gPGNvZGU+TEEobik8L2NvZGU+IHJldHVybnMgdGhlIHRva2VuIHR5cGUgb2YgdGhlIHRva2VuCisvLy8gYXQgcG9zaXRpb24gPGNvZGU+bjwvY29kZT4uIFRoZSB2YWx1ZSA8Y29kZT5uPC9jb2RlPiBjYW5ub3QgYmUgemVybywgYW5kIHN1Y2ggYSByZWZlcmVuY2Ugd2lsbCByZXR1cm4gCisvLy8gPGNvZGU+TlVMTDwvY29kZT4gYW5kIHBvc3NpYmx5IGNhdXNlIGFuIGVycm9yLiA8Y29kZT5MQSgxKTwvY29kZT4gaXMgdGhlIHRva2VuIHRoYXQgaXMgYWJvdXQgdG8gYmUKKy8vLyByZWNvZ25pemVkIGFuZCA8Y29kZT5MQSgtMSk8L2NvZGU+IGlzIHRoZSB0b2tlbiB0aGF0IGhhcyBqdXN0IGJlZW4gcmVjb2duaXplZC4gVmFsdWVzIG9mIG4gdGhhdCBleGNlZWQgdGhlCisvLy8gbGltaXRzIG9mIHRoZSB0b2tlbiBzdHJlYW0gYm91bmRhcmllcyB3aWxsIHJldHVybiA8Y29kZT5OVUxMPC9jb2RlPi4KKy8vLworLy8vIFxzdWJzZWN0aW9uIHBzcnN0YXRlIFBTUlNUQVRFCisvLy8KKy8vLyBSZXR1cm5zIHRoZSBzaGFyZWQgc3RhdGUgcG9pbnRlciBvZiB0eXBlICNwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFLiBUaGlzIGlzIG5vdCBnZW5lcmFsbHkKKy8vLyB1c2VmdWwgdG8gdGhlIGdyYW1tYXIgcHJvZ3JhbW1lciBhcyB0aGUgdXNlZnVsIGVsZW1lbnRzIGhhdmUgZ2VuZXJpYyAkeHh4IHJlZmVyZW5jZXMgYnVpbHQgaW4gdG8KKy8vLyBBTlRMUi4KKy8vLworLy8vIFxzdWJzZWN0aW9uIGFkYXB0b3IgQURBUFRPUgorLy8vCisvLy8gV2hlbiBidWlsZGluZyBhbiBBU1QgdmlhIGEgcGFyc2VyLCB0aGUgd29yayBvZiBjb25zdHJ1Y3RpbmcgYW5kIG1hbmlwdWxhdGluZyB0cmVlcyBpcyBkb25lCisvLy8gYnkgYSBzdXBwbGllZCBhZGFwdG9yIGNsYXNzLiBUaGUgZGVmYXVsdCBjbGFzcyBpcyB1c3VhbGx5IGZpbmUgZm9yIG1vc3QgdHJlZSBvcGVyYXRpb25zIGJ1dAorLy8vIGlmIHlvdSB3aXNoIHRvIGJ1aWxkIHlvdXIgb3duIHNwZWNpYWxpemVkIGxpbmtlZC90cmVlIHN0cnVjdHVyZSwgdGhlbiB5b3UgbWF5IG5lZWQgdG8gcmVmZXJlbmNlCisvLy8gdGhlIGFkYXB0b3IgeW91IHN1cHBseSBkaXJlY3RseS4gVGhlIDxjb2RlPkFEQVBUT1I8L2NvZGU+IG1hY3JvIHJldHVybnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgdHJlZSBhZGFwdG9yCisvLy8gd2hpY2ggaXMgYWx3YXlzIG9mIHR5cGUgI3BBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIGV2ZW4gaWYgaXQgaXMgeW91ciBjdXN0b20gYWRhcHRlci4KKy8vLworLy8vIFxzZWN0aW9uIGNvbW1vbm1hY3JvcyBNYWNyb3MgQ29tbW9uIHRvIEFsbCBSZWNvZ25pemVycworLy8vCisvLy8gXHN1YnNlY3Rpb24gcmVjb2duaXplciBSRUNPR05JWkVSCisvLy8KKy8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHR5cGUgb2YgI3BBTlRSTDNfQkFTRV9SRUNPR05JWkVSLCB3aGljaCBpcyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5IHN1cHBsaWVkCisvLy8gdG8gYWxsIHJlY29nbml6ZXJzLCB3aGV0aGVyIGxleGVycywgcGFyc2VycyBvciB0cmVlIHBhcnNlcnMuIFlvdSBjYW4gb3ZlcnJpZGUgbWV0aG9kcyBpbiB0aGlzCisvLy8gaW50ZXJmYWNlIGJ5IGluc3RhbGxpbmcgeW91ciBvd24gZnVuY3Rpb24gcG9pbnRlcnMgKG9uY2UgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nKS4KKy8vLworLy8vIFxzdWJzZWN0aW9uIGlucHV0IElOUFVUCisvLy8KKy8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoZSByZWNvZ25pemVyLiBJbiBhIGxleGVyCisvLy8gdGhpcyBtYWNybyByZXR1cm5zIGEgcmVmZXJlbmNlIHR5cGUgb2YgI3BBTlRMUjNfSU5QVVRfU1RSRUFNLCBpbiBhIHBhcnNlciB0aGlzIGlzIHR5cGUKKy8vLyAjcEFOVExSM19UT0tFTl9TVFJFQU0gYW5kIGluIGEgdHJlZSBwYXJzZXIgdGhpcyBpcyB0eXBlICNwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNLgorLy8vIFlvdSBjYW4gb2YgY291cnNlIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb25zIG9mIGFueSBvZiB0aGVzZSBpbnRlcmZhY2VzLgorLy8vIAorLy8vIFxzdWJzZWN0aW9uIG1hcmsgTUFSSygpCisvLy8KKy8vLyBUaGlzIG1hY3JvIHdpbGwgY2F1c2UgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGN1cnJlbnQgcmVjb2duaXplciB0byBiZSBtYXJrZWQgd2l0aCBhCisvLy8gY2hlY2twb2ludC4gSXQgd2lsbCByZXR1cm4gYSB2YWx1ZSB0eXBlIG9mICNBTlRMUjNfTUFSS0VSIHdoaWNoIHlvdSBjYW4gdXNlIGFzIHRoZSAKKy8vLyBwYXJhbWV0ZXIgdG8gYSA8Y29kZT5SRVdJTkQ8L2NvZGU+IG1hY3JvIHRvIHJldHVybiB0byB0aGUgbWFya2VkIHBvaW50IGluIHRoZSBpbnB1dC4KKy8vLyAKKy8vLyBJZiB5b3Uga25vdyB5b3Ugd2lsbCBvbmx5IGV2ZXIgcmV3aW5kIHRvIHRoZSBsYXN0IDxjb2RlPk1BUks8L2NvZGU+LCB0aGVuIHlvdSBjYW4gaWdub3JlIHRoZSByZXR1cm4KKy8vLyB2YWx1ZSBvZiB0aGlzIG1hY3JvIGFuZCBqdXN0IHVzZSB0aGUgPGNvZGU+UkVXSU5ETEFTVDwvY29kZT4gbWFjcm8gdG8gcmV0dXJuIHRvIHRoZSBsYXN0IDxjb2RlPk1BUks8L2NvZGU+IHRoYXQKKy8vLyB3YXMgc2V0IGluIHRoZSBpbnB1dCBzdHJlYW0uCisvLy8KKy8vLyBcc3Vic2VjdGlvbiByZXdpbmQgUkVXSU5EKG0pCisvLy8KKy8vLyBSZXdpbmRzIHRoZSBhcHByb3ByaWF0ZSBpbnB1dCBzdHJlYW0gYmFjayB0byB0aGUgbWFya2VkIGNoZWNrcG9pbnQgcmV0dXJuZWQgZnJvbSBhIHByaW9yCisvLy8gTUFSSyBtYWNybyBjYWxsIGFuZCBzdXBwbGllZCBhcyB0aGUgcGFyYW1ldGVyIDxjb2RlPm08L2NvZGU+IHRvIHRoZSA8Y29kZT5SRVdJTkQobSk8L2NvZGU+IAorLy8vIG1hY3JvLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gcmV3aW5kbGFzdCBSRVdJTkRMQVNUKCkKKy8vLworLy8vIFJld2luZHMgdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtIChjaGFyYWN0ZXIsIHRva2VucywgdHJlZSBub2RlcykgYmFjayB0byB0aGUgbGFzdCBjaGVja3BvaW50CisvLy8gbWFya2VyIGNyZWF0ZWQgYnkgYSA8Y29kZT5NQVJLPC9jb2RlPiBtYWNybyBjYWxsLiBGYWlscyBzaWxlbnRseSBpZiB0aGVyZSB3YXMgbm8gcHJpb3IKKy8vLyA8Y29kZT5NQVJLPC9jb2RlPiBjYWxsLgorLy8vCisvLy8gXHN1YnNlY3Rpb24gc2VlayBTRUVLKG4pCisvLy8KKy8vLyBDYXVzZXMgdGhlIGlucHV0IHN0cmVhbSB0byBwb3NpdGlvbiBpdHNlbGYgZGlyZWN0bHkgYXQgb2Zmc2V0IDxjb2RlPm48L2NvZGU+IGluIHRoZSBzdHJlYW0uIFdvcmtzIGZvciBhbGwKKy8vLyBpbnB1dCBzdHJlYW0gdHlwZXMsIGJvdGggbGV4ZXIsIHBhcnNlciBhbmQgdHJlZSBwYXJzZXIuCisvLy8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9rbm93bmlzc3Vlcy5kb3ggYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4va25vd25pc3N1ZXMuZG94Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2M0MDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4va25vd25pc3N1ZXMuZG94CkBAIC0wLDAgKzEsMyBAQAorLy8vIFxwYWdlIGtub3duaXNzdWVzIEtub3duIElzc3VlcworLy8vCisvLy8gVGhlIGZvbGxvd2luZyBpc3N1ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2RveHlnZW4vbWFpbnBhZ2UuZG94IGIvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL21haW5wYWdlLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDUyYjVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL21haW5wYWdlLmRveApAQCAtMCwwICsxLDEwNCBAQAorLy8gTWFpbiBwYWdlIGRvY3VtZW50YXRpb24gZm9yIEFOVExSM0MgcnVudGltZS4gQ29udGFpbnMKKy8vIGRveHlnZW4gdGhpbmdzIG9ubHkuCisvLworCisvLy8gXG1haW5wYWdlIEFOVExSMyBDIFJ1bnRpbWUgQVBJIGFuZCBVc2FnZSBHdWlkZS4KKy8vLworLy8vIFxzZWN0aW9uIHZlcnNpb24gVmVyc2lvbiAzLjMuMQorLy8vCisvLy8gVGhpcyBkb2N1bWVudGF0aW9uIGlzIHNwZWNpZmljYWxseSBmb3IgdGhlIEMgcnV0aW1lIHZlcnNpb24gMy4xLngueCwgd2hpY2ggaXMKKy8vLyBzcGVjaWZpY2FsbHkgZm9yIHVzZSB3aXRoIHZlcnNpb24gMy4xLngueCBvZiB0aGUgQU5UTFIgcmVjb2duaXplciBnZW5lcmF0aW9uCisvLy8gdG9vbC4gV2hpbGUgc29tZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBtYXkgd2VsbCBhcHBseSB0byBwcmlvciBvciBmdXR1cmUgdmVyc2lvbnMKKy8vLyB5b3Ugc2hvdWxkIGNvbnN1bHQgdGhlIG1hbnVhbHMgZm9yIHRoZSBjb3JyZWN0IHZlcnNpb24gd2hlbmV2ZXIgcG9zc2libGUuCisvLy8KKy8vLyBcc2VjdGlvbiBjaGNoY2hjaGFuZ2Vlc3NzIENoYW5nZXMgZnJvbSAzLjIgdG8gMy4zLjEKKy8vLyAKKy8vLyBTb21lIGNoYW5nZXMgaW4gMy4zLjEgbWF5IHJlcXVpcmUgc21hbGwgY2hhbmdlcyBpbiB5b3VyIGludm9raW5nIHByb2dyYW1zIG9yCisvLy8gaW4gdGhlIGdyYW1tYXIgaXRzZWxmLiBQbGVhc2UgcmVhZCBhYm91dCB0aGVtIGhlcmUgYmVmb3JlIGVtYWlsaW5nIHRoZSB1c2VyIGdyb3VwLAorLy8vIHdoZXJlIHlvdSB3aWxsIGJlIHRvbGQgdG8gY29tZSBhbmQgcmVhZCBhYm91dCB0aGVtIGhlcmUsIHVubGVzcyB0aGV5IHdlcmUgbWlzc2VkCisvLy8gZnJvbSB0aGlzIGxpc3QuCisvLy8KKy8vLyAtIFxzdWJwYWdlIGNoYW5nZXMzMzEgQ2hlY2sgaGVyZSBmb3IgQVBJIGNoYW5nZXMKKy8vLworLy8vIFxzZWN0aW9uIGludHJvIEludHJvZHVjdGlvbgorLy8vCisvLy8gVGhlIEFOVExSMyByZWNvZ25pemVyIGdlbmVyYXRpb24gdG9vbCBpcyB3cml0dGVuIGluIEphdmEsIGJ1dCBhbGxvd3MgdGhlIGdlbmVyYXRpb24KKy8vLyBvZiBjb2RlIHRhcmdldGVkIGZvciBhIG51bWJlciBvZiBvdGhlciBsYW5ndWFnZXMuIEVhY2ggdGFyZ2V0IGxhbmd1YWdlIHByb3ZpZGVzIGEgY29kZQorLy8vIGdlbmVyYXRpb24gdGVtcGxhdGUgZm9yIHRoZSB0b29sIGFuZCBhIHJ1bnRpbWUgbGlicmFyeSBmb3IgdXNlIGJ5IGdlbmVyYXRlZCByZWNvZ25pemVycy4KKy8vLyBUaGUgQyBydW50aW1lIHRyYWNrcyB0aGUgSmF2YSBydW50aW1lIHJlbGVhc2VzIGFuZCBpbiBnZW5lcmFsIHdoZW4gYSBuZXcgdmVyc2lvbiBvZiB0aGUKKy8vLyB0b29sIGlzIHJlbGVhc2VkLCBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBDIHJ1bnRpbWUgd2lsbCBiZSByZWxlYXNlZCBhdCB0aGUgc2FtZSB0aW1lLgorLy8vCisvLy8gVGhlIGRvY3VtZW50YXRpb24gaGVyZSBpcyBpbiB0aHJlZSBwYXJ0czoKKy8vLworLy8vIC0gXHN1YnBhZ2UgYnVpbGQgQnVpbGRpbmcgdGhlIHJ1bnRpbWUgaXRzZWxmIGZyb20gc291cmNlIGNvZGU7CisvLy8gLSBcc3VicGFnZSBnZW5lcmF0ZSBIb3cgdG8gdGVsbCBBTlRMUiB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgQyB0YXJnZXQ7CisvLy8gLSBcc3VicGFnZSBidWlsZHJlYyBIb3cgdG8gYnVpbGQgdGhlIGdlbmVyYXRlZCBjb2RlCisvLy8gLSBcc3VicGFnZSB1c2luZyBVc2luZyB0aGUgcnVudGltZSBhbmQgdGhlIGxpYnJhcmllcyBhbmQgc28gb247CisvLy8gLSBcc3VicGFnZSBydW50aW1lIFRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBydW50aW1lIGNvZGUgYW5kIGZ1bmN0aW9uczsKKy8vLworLy8vIFxzZWN0aW9uIGJhY2tncm91bmQgQmFja2dyb3VuZCBJbmZvcm1hdGlvbgorLy8vCisvLy8gVGhlIEFOVExSIDMgQyBydW50aW1lIGFuZCBjb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzIHdlcmUgd3JpdHRlbiBieSA8YSBocmVmPSJodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlIj4gSmltIElkbGU8L2E+CisvLy8gKGppbWl8YXR8dGVtcG9yYWwtd2F2ZXxkb3R0L2NvbSkgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbSI+VGVtcG9yYWwgV2F2ZSBMTEM8L2E+LgorLy8vCisvLy8gVGhlIEMgcnVudGltZSBhbmQgdGhlcmVmb3JlIHRoZSBjb2RlIGdlbmVyYXRlZCB0byB1dGlsaXplIHRoZSBydW50aW1lIHJlZmxlY3RzIHRoZSBvYmplY3QgbW9kZWwgb2YgdGhlIAorLy8vIEphdmEgdmVyc2lvbiBvZiB0aGUgcnVudGltZSBhcyBjbG9zZWx5IGFzIGEgbGFuZ3VhZ2Ugd2l0aG91dCBjbGFzcyBzdHJ1Y3R1cmVzIGFuZCBpbmhlcml0YW5jZSBjYW4uIAorLy8vIENvbXByb21pc2VzIGhhdmUgb25seSBiZWVuIG1hZGUgd2hlcmUgcGVyZm9ybWFuY2Ugd291bGQgYmUgYWR2ZXJzZWx5IGFmZmVjdGVkIHN1Y2ggYXMgbWluaW1pemluZyB0aGUgCisvLy8gbnVtYmVyIG9mIHBvaW50ZXIgdG8gcG9pbnRlciB0byBwb2ludGVyIHRvIGZ1bmN0aW9uIHR5cGUgc3RydWN0dXJlcyB0aGF0IGNvdWxkIGVuc3VlIHRocm91Z2ggdHJ5aW5nIHRvCisvLy8gbW9kZWwgaW5oZXJpdGFuY2UgdG9vIGV4YWN0bHkuIE90aGVyIGRpZmZlcmVuY2VzIGluY2x1ZGUgdGhlIHVzZSBvZiB0b2tlbiBhbmQgc3RyaW5nIGZhY3RvcmllcyB0byBtaW5pbWl6ZSAKKy8vLyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHN5c3RlbSBmdW5jdGlvbnMgc3VjaCBhcyBjYWxsb2MoKS5UaGlzIG1vZGVsIHdhcyBhZG9wdGVkIHNvIHRoYXQgb3ZlcnJpZGluZyBhbnkKKy8vLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgZnVuY3Rpb24gaXMgcmVsYXRpdmVseSBzaW1wbGUgZm9yIHRoZSBncmFtbWFyIHByb2dyYW1tZXIuCisvLy8KKy8vLyBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgZnJlZSB0aHJlYWRpbmcgKHN1YmplY3QgdG8gdGhlIHN5c3RlbXMgY2FsbHMgdXNlZCBvbiBhbnkgcGFydGljdWxhciBwbGF0Zm9ybSAKKy8vLyBiZWluZyBsaWtld2lzZSBmcmVlIHRocmVhZGluZy4pCisvLy8KKy8vLyBcc3Vic2VjdGlvbiBtb2RlbCBSdW50aW1lIE1vZGVsCisvLy8KKy8vLyBBcyB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGFuIG9iamVjdCByZWZlcmVuY2UgaW4gQywgdGhlIHJ1bnRpbWUgZGVmaW5lcyBhIG51bWJlciBvZiB0eXBlZGVmIHN0cnVjdHMgdGhhdCByZWZsZWN0IAorLy8vIHRoZSBjYWxsaW5nIGludGVyZmFjZSBjaG9zZW4gYnkgVGVyZW5jZSBQYXJyIGZvciB0aGUgSmF2YSB2ZXJzaW9uIG9mIHRoZSBzYW1lLiBUaGUgaW5pdGlhbGl6YXRpb24gb2YgYSBwYXJzZXIsIAorLy8vIGxleGVyLCBpbnB1dCBzdHJlYW0gb3Igb3RoZXIgaW50ZXJuYWwgc3RydWN0dXJlIHRoZXJlZm9yZSBjb25zaXN0cyBvZiBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgcmVxdWlyZWQgZm9yIAorLy8vIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlZGVmIHN0cnVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGludGVyZmFjZSwgaW5pdGlhbGl6aW5nIGFueSBjb3VudGVycywgYW5kIGJ1ZmZlcnMgZXRjLAorLy8vIHRoZW4gcG9wdWxhdGluZyBhIG51bWJlciBvZiBwb2ludGVycyB0byBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmEgY2xhc3MuCisvLy8KKy8vLyBUaGUgdXNlIGFuZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgQyB2ZXJzaW9ucyBvZiBhIHBhcnNlciBpcyB0aGVyZWZvcmUgc2ltaWxhciB0byB0aGUgZXhhbXBsZXMgZ2l2ZW4gZm9yIEphdmEsIAorLy8vIGJ1dCB3aXRoIGEgYmVudCB0b3dhcmRzIEMgb2YgY291cnNlLiBZb3UgbWF5IG5lZWQgdG8gYmUgYXdhcmUgb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgb3BlcmF0aW9ucyAKKy8vLyBpbiBjZXJ0YWluIGVudmlyb25tZW50cyBzdWNoIGFzIFdpbmRvd3MsIHdoZXJlIHlvdSBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGluIG9uZSBETEwgYW5kIGZyZWUgaXQgaW4gYW5vdGhlci4KKy8vLworLy8vIFRoZSBydW50aW1lIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cnVjdHVyZXMgYW5kIGludGVyZmFjZXMgdGhhdCB0aGUgYXV0aG9yIGhhcyBmb3VuZCB1c2VmdWwgd2hlbiB3cml0aW5nIGFjdGlvbiBhbmQgCisvLy8gcHJvY2Vzc2luZyBjb2RlIHdpdGhpbiBqYXZhIHBhcnNlcnMsIGFuZCBmdXJ0aGVybW9yZSB3ZXJlIHJlcXVpcmVkIGJ5IHRoZSBDIHJ1bnRpbWUgY29kZSBpZiBpdCB3YXMgbm90IHRvIAorLy8vIGRlcGFydCB0b28gZmFyIGZyb20gdGhlIGxvZ2ljYWwgbGF5b3V0IG9mIHRoZSBKYXZhIG1vZGVsLiBUaGVzZSBpbmNsdWRlIHRoZSBDIGVxdWl2YWxlbnRzIG9mIFN0cmluZywgTGlzdCwgCisvLy8gSGFzaHRhYmxlLCBWZWN0b3IgYW5kIFRyaWUsIGltcGxlbWVudGVkIGJ5IHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMuIFRoZXNlIGFyZSBmcmVlbHkgYXZhaWxhYmxlIGZvciB5b3VyIG93biBwcm9ncmFtbWluZyBuZWVkcy4KKy8vLworLy8vIEEgZ29hbCBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2FzIHRvIG1pbmltaXplIHRoZSB0cmFja2luZywgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBvZiBtZW1vcnkgZm9yIHJlYXNvbnMgb2YgYm90aCAKKy8vLyBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIEluIGVzc2VuY2UgYW55IG1lbW9yeSB1c2VkIGJ5IGEgbGV4ZXIsIHBhcnNlciBvciB0cmVlIHBhcnNlciBpcyBhdXRvbWF0aWNhbGx5IHRyYWNrZWQgYW5kIAorLy8vIGZyZWVkIHdoZW4gdGhlIGluc3RhbmNlIG9mIGl0IGlzIHJlbGVhc2VkLiBUaGVyZSBhcmUgdGhlcmVmb3JlIGZhY3RvcnkgZnVuY3Rpb25zIGZvciB0b2tlbnMgYW5kIHNvIG9uIHN1Y2ggdGhhdCB0aGV5IAorLy8vIGNhbiBiZSBhbGxvY2F0ZWQgaW4gYmxvY2tzIGFuZCBwYXJjZWxlZCBvdXQgYXMgdGhleSBhcmUgcmVxdWlyZWQuIFRoZXkgYXJlIGFsbCB0aGVuIGZyZWVkIGluIG9uZSBnbywgbWluaW1pemluZyB0aGUgCisvLy8gcmlzayBvZiBtZW1vcnkgbGVha3MgYW5kIGFsbG9jL2ZyZWUgdGhyYXNoaW5nLiBUaGlzIGhhcyBvbmx5IG9uZSBzaWRlIGVmZmVjdCwgYmVpbmcgdGhhdCBpZiB5b3Ugd2lzaCB0byBwcmVzZXJ2ZSBzb21lIHN0cnVjdHVyZSBnZW5lcmF0ZWQgYnkgCisvLy8gdGhlIGxleGVyLCBwYXJzZXIgb3IgdHJlZSBwYXJzZXIsIHRoZW4geW91IG11c3QgbWFrZSBhIGNvcHkgb2YgaXQgYmVmb3JlIGZyZWVpbmcgdGhvc2Ugc3RydWN0dXJlcywgYW5kIHRyYWNrIGl0IHlvdXJzZWxmIAorLy8vIGFmdGVyIHRoYXQuIEluIHByYWN0aWNlLCBpdCBpcyBlYXN5IGVub3VnaCBqdXN0IG5vdCB0byByZWxlYXNlIHRoZSBhbnRsciBnZW5lcmF0ZWQgY29tcG9uZW50cyB1bnRpbCB5b3UgYXJlIAorLy8vIGZpbmlzaGVkIHdpdGggdGhlaXIgcmVzdWx0cy4KKy8vLworLy8vIFxzZWN0aW9uIHRhcmdldHMgVGFyZ2V0IFBsYXRmb3JtcworLy8vCisvLy8gVGhlIEMgcHJvamVjdCBpcyBjb25zdHJ1Y3RlZCBzdWNoIHRoYXQgaXQgd2lsbCBjb21waWxlIG9uIGFueSByZWFzb25hYmxlIEFOU0kgQyBjb21waWxlciBpbiBlaXRoZXIgNjQgb3IgMzIgYml0IG1vZGUsIAorLy8vIHdpdGggYWxsIHdhcm5pbmdzIHR1cm5lZCBvbi4gVGhpcyBpcyB0cnVlIG9mIGJvdGggdGhlIHJ1bnRpbWUgY29kZSBhbmQgdGhlIGdlbmVyYXRlZCBjb2RlIGFuZCBoYXMgYmVlbiBzdW1tYXJpbHkgdGVzdGVkIAorLy8vIHdpdGggVmlzdWFsIFN0dWRpbyAuTmV0ICgyMDAzLCAyMDA1IGFuZCAyMDA4KSBhbmQgbGF0ZXIgdmVyc2lvbnMgb2YgZ2NjIG9uIFJlZGhhdCBMaW51eCwgYXMgd2VsbCBhcyBvbiBBSVggNS4yLzUuMywgU29sYXJpcyA5LzEwLCAKKy8vLyBIUFVYIDExLnh4LCBPU1ggKFBvd2VyUEMgYW5kIEludGVsKSBhbmQgQ3lnd2luLgorLy8vCisvLy8gXGIgTm90ZXMKKy8vLyAgIC0gVGhlIEMgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCBzdWNoIHRoYXQgdGhlIGxpYnJhcnkgY2FuIGJlIGludGVncmF0ZWQgYXMgYW4gYXJjaGl2ZSBsaWJyYXJ5LCBvciBhIHNoYXJlZCBsaWJyYXJ5L0RMTC4KKy8vLyAgIC0gVGhlIEMgbGFuZ3VhZ2UgdGFyZ2V0IGNvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgQU5UTFIgdG9vbCBpdHNlbGYuCisvLy8KKy8vLyBcc2VjdGlvbiBwZXJmb3JtYW5jZSBQZXJmb3JtYW5jZQorLy8vCisvLy8gSXQgaXMgQyA6LSkuIEJhc2ljIHRlc3Rpbmcgb2YgcGVyZm9ybWFuY2UgYWdhaW5zdCB0aGUgSmF2YSBydW50aW1lLCAKKy8vLyB1c2luZyB0aGUgSkRLMS42IGphdmEgc291cmNlIGNvZGUsIGFuZCB0aGUgSmF2YSBwYXJzZXIgcHJvdmlkZWQgaW4gdGhlIGV4YW1wbGVzICh3aGljaCBpcyBhIHRvdWdoIHRlc3QgYXMgaXQgaW5jbHVkZXMgCisvLy8gYmFja3RyYWNraW5nIGFuZCBtZW1vaXphdGlvbikgc2hvdyB0aGF0IHRoZSBDIHJ1bnRpbWUgdXNlcyBhYm91dCBoYWxmIHRoZSBtZW1vcnkgYW5kIGlzIGJldHdlZW4gMiBhbmQgMyB0aW1lcyB0aGUgc3BlZWQuIAorLy8vIFRlc3RzIG9mIG5vbi1iYWNrdHJhY2tpbmcsIG5vbi1tZW1vaXppbmcgcGFyc2VycywgaW5kaWNhdGUgcmVzdWx0cyBzaWduaWZpY2FudGx5IGJldHRlciB0aGFuIHRoaXMuCisvLy8KKy8vLyBcc2VjdGlvbiBleGFtcGxlcyBEb3dubG9hZGluZyBFeGFtcGxlcworLy8vCisvLy8gVGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW50bHIub3JnL2Rvd25sb2FkLmh0bWwiPmRvd25sb2FkcyBwYWdlPC9hPiBvZiB0aGUgQU5UTFIgd2ViIHNpdGUgY29udGFpbnMgYSBkb3dubG9hZGFibGUKKy8vLyB6aXAvdGFyIG9mIGV4YW1wbGVzIHByb2plY3RzIGZvciB1c2Ugd2l0aCB0aGUgQyBydW50aW1lIG1vZGVsLiBJdCBjb250YWlucyAuc2xuIGZpbGVzIGFuZCBzb3VyY2UgY29kZSBmb3IgYSAKKy8vLyBudW1iZXIgb2YgZXhhbXBsZSBncmFtbWFycyBhbmQgaGVscHMgdG8gc2VlIGhvdyB0byBpbnZva2UgYW5kIGNhbGwgdGhlIGdlbmVyYXRlZCByZWNvZ25pemVycy4KKy8vLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9ydW50aW1lLmRveCBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi9ydW50aW1lLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDIzNDAzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL3J1bnRpbWUuZG94CkBAIC0wLDAgKzEsMzUgQEAKKy8vLyBccGFnZSBydW50aW1lIE5hdmlnYXRpbmcgdGhlIEMgUnVudGltZSBEb2N1bWVudGF0aW9uCisvLy8KKy8vLyBJZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGggRG94eWdlbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwgdGhlbiB0aGUgbGF5b3V0IG9mIHRoZSBmaWxlcywgdHlwZWRlZnMKKy8vLyBhbmQgc28gb24gd2lsbCBiZSBmYW1pbGlhciB0byB5b3UuIEhvd2V2ZXIgdGhlcmUgaXMgYWxzbyBhZGRpdGlvbmFsIHN0cnVjdHVyZSBhcHBsaWVkIHRoYXQgaGVscHMKKy8vLyB0aGUgcHJvZ3JhbW1lciB0byBzZWUgaG93IHRoZSBydW50aW1lIGlzIG1hZGUgdXAuCisvLy8KKy8vLyBcc2VjdGlvbiBtb2R1bGVzIE1vZHVsZXMKKy8vLworLy8vIFVuZGVyIHRoZSBNb2R1bGVzIG1lbnUgdHJlZSB5b3Ugd2lsbCBmaW5kIHRoZSBlbnRyeSBBUEkgQ2xhc3Nlcy4gVGhpcyBzZWN0aW9uIGlzIGZ1cnRoZXIgCisvLy8gZGl2aWRlZCBpbnRvIHR5cGVkZWZzIGFuZCBzdHJ1Y3RzIGFuZCB0aGUgc3RhbmRhcmQgcnVudGltZSBzdXBwbGllZCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKy8vLyBtZXRob2RzLgorLy8vCisvLy8gVGhlIHR5cGVkZWZzIGFyZSB0aGUgdHlwZXMgdGhhdCB5b3UgZGVjbGFyZSBpbiB5b3VyIGNvZGUgYW5kIHdoaWNoIGFyZSByZXR1cm5lZCBieSB0aGUgCisvLy8gJ2NvbnN0cnVjdG9ycycgc3VjaCBhcyBhbnRscjM4Qml0RmlsZVN0cmVhbU5ldygpLiBUaGUgdW5kZXJseWluZyBzdHJ1Y3R1cmVzIGRvY3VtZW50CisvLy8gdGhlIGRhdGEgZWxlbWVudHMgb2YgdGhlIHR5cGUgYW5kIHdoYXQgYSBmdW5jdGlvbiBwb2ludGVyIGluc3RhbGxlZCBpbiBhbnkgcGFydGljdWxhcgorLy8vIHNsb3Qgc2hvdWxkIGRvLgorLy8vCisvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGFyZSB0aGUgc3RhdGljIG1ldGhvZHMgd2l0aGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZpbGUKKy8vLyBmb3IgYSAnY2xhc3MnLCB3aGljaCBhcmUgaW5zdGFsbGVkIGJ5IHRoZSBydW50aW1lIHdoZW4gYSBkZWZhdWx0IGluc3RhbmNlIG9mIG9uZSB0aGUgCisvLy8gdHlwZWRlZnMgKGNsYXNzZXMpIGlzIGNyZWF0ZWQuIAorLy8vCisvLy8gV2hlbiBuYXZpZ2F0aW5nIHRoZSBzb3VyY2UgY29kZSwgZmluZCB0aGUgdHlwZWRlZiB5b3Ugd2FudCB0byBjb25zdWx0IGFuZCBpbnNwZWN0IHRoZSBkb2N1bWVudGF0aW9uCisvLy8gZm9yIGl0cyBmdW5jdGlvbiBwb2ludGVycywgdGhlbiBsb29rIGF0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZGVmYXVsdCBtZXRob2RzIHRoYXQgaW1wbGVtZW50CisvLy8gdGhhdCAnbWV0aG9kJy4gCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgdW5kZXIgIkFQSSBUeXBlZGVmcyBhbmQgU3RydWN0cyIgeW91IHdpbGwgZmluZCAiQmFzZSBSZWNvZ25pemVyIERlZmluaXRpb24iLCB3aGljaCB0ZWxscworLy8vIHlvdSBhbGwgdGhlIG1ldGhvZHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBpbnRlcmZhY2UuIFVuZGVyICJBUEkgSW1wbGVtZW50YXRpb24gRnVuY3Rpb25zIiwgeW91IHdpbGwKKy8vLyBmaW5kICJCYXNlIFJlY29nbml6ZXIgSW1wbGVtZW50YXRpb24iLCB3aGljaCBkb2N1bWVudHMgdGhlIGFjdHVhbCBmdW5jdGlvbnMgdGhhdCBhcmUgaW5zdGFsbGVkCisvLy8gdG8gaW1wbGVtZW50IHRoZSBjbGFzcyBtZXRob2RzLgorLy8vCisvLy8gRnJvbSBoZXJlLCB0aGUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgb2J2aW91cy4gSWYgaXQgaXMgbm90LCB0aGVuIHlvdSBjb3VsZCB0cnkgcmVhZGluZworLy8vIHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGJ1dCBwbGVhc2UgZG9uJ3QgZW1haWwgdGhlIGF1dGhvciBkaXJlY3RseSwgdXNlIHRoZSBBTlRMUiBJbnRlcmVzdAorLy8vIGVtYWlsIGdyb3VwLCB3aGljaCB5b3Ugc2hvdWxkIHByb2JhYmx5IGhhdmUgc2lnbmVkIHVwIGZvciBpZiB5b3UgaGF2ZSByZWFkIHRoaXMgZmFyIGludG8gdGhlIAorLy8vIEMgcnVudGltZSBkb2N1bWVudGF0aW9uLgorLy8vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9kb3h5Z2VuL3VzaW5nLmRveCBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi91c2luZy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4NDI0YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvZG94eWdlbi91c2luZy5kb3gKQEAgLTAsMCArMSw2MiBAQAorLy8vIFxwYWdlIHVzaW5nIFVzaW5nIHRoZSBBTlRMUjMgQyBUYXJnZXQKKy8vLworLy8vIFxzZWN0aW9uIGludHJvIEludHJvZHVjdGlvbgorLy8vCisvLy8gVXNpbmcgdGhlIEFOVExSIHRhcmdldCBpbnZvbHZlcyBnYWluaW5nIGtub3dsZWRnZSBvZiBhIG51bWJlciBvZiBlbGVtZW50czoKKy8vLworLy8vIC0jIFdyaXRpbmcgQU5UTFIgZ3JhbW1hcnMgKG5vdCBjb3ZlcmVkIGluIHRoaXMgbWFudWFsKTsKKy8vLyAtIyBIb3cgQU5UTFIgd29ya3MgKG5vdCBjb3ZlcmVkIGluIHRoaXMgbWFudWFsKTsKKy8vLyAtIyBIb3cgdG8gdXNlIHRoZSBcQHNlY3Rpb25zIHdpdGggdGhlIEMgdGFyZ2V0CisvLy8gLSMgSW50ZXJvcGVyYXRpb24gd2l0aCB0aGUgcnVudGltZSB3aXRoaW4gcnVsZSBhY3Rpb25zOworLy8vIC0jIEltcGxlbWVudGluZyBjdXN0b20gdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgbWV0aG9kczsKKy8vLworLy8vIElmIHlvdSBhcmUgYXMgeWV0IHVuZmFtaWxpYXIgd2l0aCBob3cgQU5UTFIgd29ya3MgaW4gZ2VuZXJhbCwgdGhlbgorLy8vIGl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSByZWFkIHRoZSB2YXJpb3VzIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kiPndpa2kgcGFnZXM8L2E+IGNvbmNlcm5lZCB3aXRoCisvLy8gZ2V0dGluZyBzdGFydGVkLiBIb3dldmVyIHRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdGhhdCB5b3Ugc2hvdWxkIG5vdGU6CisvLy8KKy8vLyAtIFRoZSBsZXhlciBpcyBpbmRlcGVuZGVudCBvZiB0aGUgcGFyc2VyLiBZb3UgXGIgY2Fubm90IGNvbnRyb2wgdGhlIGxleGVyIGZyb20gd2l0aGluIHRoZSBwYXJzZXI7CisvLy8gLSBUaGUgdHJlZSBwYXJzZXIgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcnNlci4gWW91IFxiIGNhbm5vdCBjb250cm9sIHRoZSBwYXJzZXIgZnJvbSB3aXRoaW4gdGhlIHRyZWUgcGFyc2VyKHMpOworLy8vIC0gRWFjaCB0cmVlIHBhcnNlciBpcyBpbmRlcGVuZGVudCBvZiBvdGhlciB0cmVlIHBhcnNlcnMuCisvLy8KKy8vLyBUaGlzIG1lYW5zIHRoYXQgeW91ciBsZXhlciBydW5zIGZpcnN0IGFuZCBjb25zdW1lcyBhbGwgdGhlIGlucHV0IHN0cmVhbSB1bnRpbCAKKy8vLyB5b3Ugc3RvcCBpdCBwcm9ncmFtbWF0aWNhbGx5LCBvciBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbS4gSXQgcHJvZHVjZXMKKy8vLyBhIGNvbXBsZXRlIHN0cmVhbSBvZiB0b2tlbnMsIHdoaWNoIHRoZSBwYXJzZXIgdGhlbiBjb25zdW1lcy4KKy8vLworLy8vIFxzZWN0aW9uIFVzaW5nIFxAc2VjdGlvbnMgaW4gYSBDIFRhcmdldGVkIEdyYW1tYXIKKy8vLworLy8vIFdpdGhpbiBhIGdyYW1tYXIgZmlsZSB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygc3BlY2lhbCBzZWN0aW9ucyB5b3UgY2FuIGFkZCB0aGF0IGNhdXNlIHRoZQorLy8vIGNvZGUgd2l0aGluIHRoZW0gdG8gYmUgcGxhY2VkIGF0IHN0cmF0ZWdpYyBwb2ludHMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHN1Y2ggYXMKKy8vLyBiZWZvcmUgb3IgYWZ0ZXIgdGhlICNpbmNsdWRlIHN0YXRlbWVudHMgaW4gdGhlIC5jIGZpbGUsIHdpdGhpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlCisvLy8gb3Igd2l0aGluIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHJlY29nbml6ZXIuCisvLy8KKy8vLyBNYW55IG9mIHRoZSBcQHNlY3Rpb25zIHVzZWQgd2l0aGluIGEgSmF2YSB0YXJnZXRlZCBncmFtbWFyIGhhdmUgc29tZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHdpdGhpbiBhIAorLy8vIEMgdGFyZ2V0ZWQgZ3JhbW1hciwgYnV0IHRoZWlyIHVzZSBtYXkgd2VsbCBiZSBzdWJ0bHkgZGlmZmVyZW50LiBUaGVyZSBhcmUgYWxzbyBhZGRpdGlvbmFsIHNlY3Rpb25zCisvLy8gdGhhdCBoYXZlIG1lYW5pbmcgb25seSB3aXRoaW4gYSBncmFtbWFyIHRhcmdldGVkIGZvciB0aGUgQyBydW50aW1lLgorLy8vCisvLy8gRGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiB0aGVzZSBzZWN0aW9ucyBpcyBnaXZlbiBoZXJlOiBcc3VicGFnZSBhdHNlY3Rpb25zCisvLy8KKy8vLyBcc2VjdGlvbiBpbnRlcm9wIEludGVyb3BlcmF0aW9uIFdpdGhpbiBSdWxlIEFjdGlvbnMKKy8vLworLy8vIFJ1bGUgYWN0aW9ucyBoYXZlIGEgbGltaXRlZCBudW1iZXIgb2YgZWxlbWVudHMgdGhleSBjYW4gYWNjZXNzIGJ5IG5hbWUsIGluZGVwZW5kZW50bHkgb2YgdGhlCisvLy8gdGFyZ2V0IGxhbmd1YWdlIGdlbmVyYXRlZC4gVGhlc2UgYXJlIGVsZW1lbnRzIHN1Y2ggYXMgJGxpbmUsICRwb3MsICR0ZXh0IGFuZCBzbyBvbi4gV2hlcmUgdGhlCisvLy8gJHh4eCByZXR1cm5zIGEgYmFzaWMgdHlwZSBzdWNoIGFzIFxjIGludCwgdGhlbiB5b3UgY2FuIHVzZSB0aGVzZSBpbiBDIGFzIHlvdSB3b3VsZCBpbiB0aGUgSmF2YQorLy8vIHRhcmdldCwgYnV0IHdoZXJlIGEgcmVmZXJlbmNlIHJldHVybnMgYSBzdHJpbmcsIHlvdSB3aWxsIGdldCBhIHBvaW50ZXIgdG8gdGhlIEMgcnVudGltZQorLy8vIHN0cmluZyBpbXBsZW1lbnRhdGlvbiAjcEFOVExSM19TVFJJTkcuIFRoaXMgd2lsbCBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhpbmdzIGxpa2UgdG9rZW4gdGV4dAorLy8vIGJ1dCBhbHNvIHByb3ZpZGVzIHNvbWUgY29udmVuaWVuY2UgbWV0aG9kcyBzdWNoIGFzICNwQU5UTFIzX1NUUklORy0+c3Vic3RyaW5nKCkgYW5kICNwQU5UTFIzX1NUUklORy0+dG9VVEY4KCkuCisvLy8KKy8vLyBUaGUgZ2VuZXJhdGVkIGNvZGUgcHJvdmlkZXMgYSBudW1iZXIgb2YgQyBNQUNST3MsIHdoaWNoIG1ha2UgaXQgZWFzaWVyIHRvIGFjY2VzcyBydW50aW1lCisvLy8gY29tcG9uZW50cy4gQWx3YXlzIHVzZSB0aGVzZSBtYWNyb3Mgd2hlbiBhdmFpbGFibGUsIHRvIHByb3RlY3QgeW91ciBhY3Rpb24gY29kZSBmcm9tIGNoYW5nZXMKKy8vLyB0byB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKy8vLworLy8vIERldGFpbGVkIGRvY3VtZW50YXRpb24gb2YgbWFjcm9zIGFuZCBydWxlIGFjdGlvbiBpbnRlcm9wZXJhdGlvbiBpcyBnaXZlbiBoZXJlOiBcc3VicGFnZSBpbnRlcm9wCisvLy8KKy8vLyBcc2VjdGlvbiBDdXN0b20gSW1wbGVtZW50aW5nIEN1c3RvbWl6ZWQgTWV0aG9kcworLy8vCisvLy8gVW5sZXNzIHlvdSB3aXNoIHRvIGNyZWF0ZSB5b3VyIG93biB0cmVlIHN0cnVjdHVyZXMgdXNpbmcgdGhlIGJ1aWx0IGluIEFOVExSIEFTVCByZXdyaXRpbmcKKy8vLyBub3RhdGlvbiwgeW91IHdpbGwgcmFyZWx5IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcnVudGltZSBtZXRob2RzLiBUaGUKKy8vLyBleGNlcHRpb24gdG8gdGhpcyB3aWxsIGJlIHRoZSBzeW50YXggZXJyIHJlcG9ydGluZyBtZXRob2QsIHdoaWNoIGlzIGVzc2VudGlhbGx5IGEgc3R1YiBmdW5jdGlvbgorLy8vIHRoYXQgeW91IHdpbGwgdXN1YWxseSB3YW50IHRvIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24gZm9yLiBZb3Ugc2hvdWxkIGNvbnNpZGVyIHRoZSBidWlsdCBpbiBmdW5jdGlvbgorLy8vIGRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKCkgYXMgYW4gZXhhbXBsZSBvZiB3aGVyZSB0byBzdGFydCBhcyB0aGVyZSBjYW4gYmUgbm8gcmVhbGx5IHVzZWZ1bAorLy8vIGdlbmVyaWMgZXJyb3IgbWVzc2FnZSBkaXNwbGF5LgorLy8vCisvLy8gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyMy5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYWQ5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZglfQU5UTFIzX0gKKyNkZWZpbmUJX0FOVExSM19ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKworI2luY2x1ZGUgICAgPGFudGxyM2Vycm9ycy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgICAgPGFudGxyM2VuY29kaW5ncy5oPgorI2luY2x1ZGUgICAgPGFudGxyM3N0cmluZy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2lucHV0Lmg+CisjaW5jbHVkZSAgICA8YW50bHIzY3ljbGljZGZhLmg+CisjaW5jbHVkZSAgICA8YW50bHIzaW50c3RyZWFtLmg+CisjaW5jbHVkZSAgICA8YW50bHIzZmlsZXN0cmVhbS5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbGxlY3Rpb25zLmg+CisjaW5jbHVkZQk8YW50bHIzcmVjb2duaXplcnNoYXJlZHN0YXRlLmg+CisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXJlY29nbml6ZXIuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250b2tlbi5oPgorI2luY2x1ZGUgICAgPGFudGxyM3Rva2Vuc3RyZWFtLmg+CisjaW5jbHVkZSAgICA8YW50bHIzYml0c2V0Lmg+CisjaW5jbHVkZSAgICA8YW50bHIzbGV4ZXIuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNwYXJzZXIuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNiYXNldHJlZWFkYXB0b3IuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250cmVlYWRhcHRvci5oPgorI2luY2x1ZGUgICAgPGFudGxyM3Jld3JpdGVzdHJlYW1zLmg+CisjaW5jbHVkZQk8YW50bHIzZGVidWdldmVudGxpc3RlbmVyLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2Jhc2VyZWNvZ25pemVyLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzYmFzZXJlY29nbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI2OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2Jhc2VyZWNvZ25pemVyLmgKQEAgLTAsMCArMSwzNzEgQEAKKy8qKiBcZmlsZQorICogRGVmaW5lcyB0aGUgYmFzaWMgc3RydWN0dXJlIHRvIHN1cHBvcnQgcmVjb2duaXppbmcgYnkgZWl0aGVyIGEgbGV4ZXIsCisgKiBwYXJzZXIsIG9yIHRyZWUgcGFyc2VyLgorICogXGFkZHRvZ3JvdXAgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUgorICogQHsKKyAqLworI2lmbmRlZglfQU5UTFIzX0JBU0VSRUNPR05JWkVSX0gKKyNkZWZpbmUJX0FOVExSM19CQVNFUkVDT0dOSVpFUl9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNleGNlcHRpb24uaD4KKyNpbmNsdWRlICAgIDxhbnRscjNpbnB1dC5oPgorI2luY2x1ZGUgICAgPGFudGxyM3Rva2Vuc3RyZWFtLmg+CisjaW5jbHVkZSAgICA8YW50bHIzY29tbW9udG9rZW4uaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250cmVlbm9kZXN0cmVhbS5oPgorI2luY2x1ZGUJPGFudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oPgorI2luY2x1ZGUJPGFudGxyM3JlY29nbml6ZXJzaGFyZWRzdGF0ZS5oPgorCisvKiogVHlwZSBpbmRpY2F0b3IgZm9yIGEgbGV4ZXIgcmVjb2duaXplcgorICovCisjZGVmaW5lCSAgICBBTlRMUjNfVFlQRV9MRVhFUgkJMHgwMDAxCisKKy8qKiBUeXBlIGluZGljYXRvciBmb3IgYSBwYXJzZXIgcmVjb2duaXplcgorICovCisjZGVmaW5lCSAgICBBTlRMUjNfVFlQRV9QQVJTRVIJCTB4MDAwMgorCisvKiogVHlwZSBpbmRpY2F0b3IgZm9yIGEgdHJlZSBwYXJzZXIgcmVjb2duaXplcgorICovCisjZGVmaW5lCSAgICBBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUgkweDAwMDQKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogXGJyaWVmIEJhc2UgdHJhY2tpbmcgY29udGV4dCBzdHJ1Y3R1cmUgZm9yIGFsbCB0eXBlcyBvZgorICogcmVjb2duaXplcnMuCisgKi8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0Cit7CisgICAgLy8vIFdoYXRldmVyIHN1cGVyIHN0cnVjdHVyZSBpcyBwcm92aWRpbmcgdGhpcyBpbnRlcmZhY2UgbmVlZHMgYSBwb2ludGVyIHRvIGl0c2VsZgorICAgIC8vLyBzbyB0aGF0IHRoaXMgY2FuIGJlIHBhc3NlZCBiYWNrIHRvIGl0IHdoZW5ldmVyIHRoZSBhcGkgZnVuY3Rpb25zCisgICAgLy8vIGFyZSBjYWxsZWQgYmFjayBmcm9tIGhlcmUuCisgICAgLy8vCisgICAgdm9pZAkgICAgICAqIHN1cGVyOworICAgIAorCS8vLyBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgcmVjb2duaXplciB0aGF0IHdlIGFyZSBhbiBpbnN0YW5jZSBvZi4KKyAgICAvLy8gVGhlIHByb2dyYW1tZXIgbWF5IHNldCB0aGlzIHRvIGFueXRoaW5nIG9mIGNvdXJzZSwgYnV0IHRoZSBkZWZhdWx0IAorICAgIC8vLyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGludGVyZmFjZSBvbmx5IHJlYWxseSB1bmRlcnN0YW5kIHRoZSBidWlsdCBpbgorICAgIC8vLyB0eXBlcywgc28gbmV3IGVycm9yIGhhbmRsZXJzIGV0YyB3b3VsZCBwcm9iYWJseSBiZSByZXF1aXJlZCB0byBhcyB3ZWxsLgorICAgIC8vLyAKKyAgICAvLy8gIFZhbGlkIHR5cGVzIGFyZToKKyAgICAvLy8KKyAgICAvLy8gICAtICNBTlRMUjNfVFlQRV9MRVhFUiAgCisJLy8vCSAgLSAjQU5UTFIzX1RZUEVfUEFSU0VSCisgICAgLy8vICAgLSAjQU5UTFIzX1RZUEVfVFJFRV9QQVJTRVIKKyAgICAvLy8KKyAgICBBTlRMUjNfVUlOVDMyCXR5cGU7CisKKwkvLy8gQSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgcmVjb2duaXplciBzdGF0ZSwgc3VjaCB0aGF0IG11bHRpcGxlCisJLy8vIHJlY29nbml6ZXJzIGNhbiB1c2UgdGhlIHNhbWUgaW5wdXRzIHN0cmVhbXMgYW5kIHNvIG9uIChpbgorCS8vLyB0aGUgY2FzZSBvZiBncmFtbWFyIGluaGVyaXRhbmNlIGZvciBpbnN0YW5jZS4KKwkvLy8KKwlwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFCXN0YXRlOworCisJLy8vIElmIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBOVUxMLCB0aGVuIHRoaXMgc3RydWN0dXJlIGlzCisJLy8vIHBvaW50cyB0byBhbiBpbnN0YW5jZSBvZiB0aGUgZGVidWdnZXIgaW50ZXJmYWNlLiBJbiBnZW5lcmFsLCB0aGUKKwkvLy8gZGVidWdnZXIgaXMgb25seSByZWZlcmVuY2VkIGludGVybmFsbHkgaW4gcmVjb3ZlcnkvZXJyb3Igb3BlcmF0aW9ucworCS8vLyBzbyB0aGF0IGl0IGRvZXMgbm90IGNhdXNlIG92ZXJoZWFkIGJ5IGhhdmluZyB0byBjaGVjayB0aGlzIHBvaW50ZXIKKwkvLy8gaW4gZXZlcnkgZnVuY3Rpb24vbWV0aG9kCisJLy8vCisJcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUglkZWJ1Z2dlcjsKKworCisgICAgLy8vIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sCisgICAgLy8vIGFnYWluc3QgdGhlIHN1cHBsaWVkIHR5cGUuIHRoZSBmdW5jdGlvbiBjYXVzZXMgYW4gZXJyb3IgaWYgYQorICAgIC8vLyBtYXRjaCBpcyBub3QgZm91bmQgYW5kIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgYWxzbworICAgIC8vLyBhdHRlbXB0IHRvIHBlcmZvcm0gb25lIHRva2VuIGluc2VydGlvbiBvciBkZWxldGlvbiBpZiB0aGF0IGlzCisgICAgLy8vIHBvc3NpYmxlIHdpdGggdGhlIGlucHV0IHN0cmVhbS4gWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdAorICAgIC8vLyBpbXBsZW1lbnRhdGlvbiBieSBpbnN0YWxsaW5nIGEgcG9pbnRlciB0byB5b3VyIG93biBmdW5jdGlvbgorICAgIC8vLyBpbiB0aGlzIGludGVyZmFjZSBhZnRlciB0aGUgcmVjb2duaXplciBoYXMgaW5pdGlhbGl6ZWQuIFRoaXMgY2FuCisgICAgLy8vIHBlcmZvcm0gZGlmZmVyZW50IHJlY292ZXJ5IG9wdGlvbnMgb3Igbm90IHJlY292ZXIgYXQgYWxsIGFuZCBzbyBvbi4KKyAgICAvLy8gVG8gaWdub3JlIHJlY292ZXJ5IGFsdG9nZXRoZXIsIHNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGRlZmF1bHQKKyAgICAvLy8gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBpbiBhbnRscjNiYXNlcmVjb2duaXplci5jCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCBlcnJvcnMgYXJlIHNpZ25hbGxlZCBieSBzZXR0aW5nIHRoZSBlcnJvciBmbGFnIGJlbG93CisgICAgLy8vIGFuZCBjcmVhdGluZyBhIG5ldyBleGNlcHRpb24gc3RydWN0dXJlIGFuZCBpbnN0YWxsaW5nIGl0IGluIHRoZQorICAgIC8vLyBleGNlcHRpb24gcG9pbnRlciBiZWxvdyAoeW91IGNhbiBjaGFpbiB0aGVzZSBpZiB5b3UgbGlrZSBhbmQgaGFuZGxlIHRoZW0KKyAgICAvLy8gaW4gc29tZSBjdXN0b21pemVkIHdheSkuCisgICAgLy8vCisgICAgdm9pZCAqCQkoKm1hdGNoKQkoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwKKwkJCQkJCQkgICAgQU5UTFIzX1VJTlQzMiB0dHlwZSwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpOworCisgICAgLy8vIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhlIG5leHQgdG9rZW4vY2hhciBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgLy8vIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpdCBhY3R1YWxseSBpcy4KKyAgICAvLy8KKyAgICB2b2lkCQkoKm1hdGNoQW55KQkoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplcik7CisgICAgCisJLy8vIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGRlY2lkZXMgaWYgdGhlIHRva2VuIGFoZWFkIG9mIHRoZSBjdXJyZW50IG9uZSBpcyB0aGUgCisJLy8vIG9uZSB3ZSB3ZXJlIGxva2luZyBmb3IsIGluIHdoaWNoIGNhc2UgdGhlIGN1cmVybnQgb25lIGlzIHZlcnkgbGlrZWx5IGV4dHJhbmVvdXMKKwkvLy8gYW5kIGNhbiBiZSByZXBvcnRlZCB0aGF0IHdheS4KKwkvLy8KKwlBTlRMUjNfQk9PTEVBTgorCQkJCSgqbWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4pCShzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaW5wdXQsIEFOVExSM19VSU5UMzIgdHR5cGUpOworCisJLy8vIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGRlY2lkZXMgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgb25lIHRoYXQgY2FuIGxvZ2ljYWxseQorCS8vLyBmb2xsb3cgdGhlIG9uZSB3ZSB3ZXJlIGxvb2tpbmcgZm9yLCBpbiB3aGljaCBjYXNlIHRoZSBvbmUgd2Ugd2VyZSBsb29raW5nIGZvciBpcyAKKwkvLy8gcHJvYmFibHkgbWlzc2luZyBmcm9tIHRoZSBpbnB1dC4KKwkvLy8KKwlBTlRMUjNfQk9PTEVBTgorCQkJCSgqbWlzbWF0Y2hJc01pc3NpbmdUb2tlbikJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsIHBBTlRMUjNfSU5UX1NUUkVBTSBpbnB1dCwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHdvcmtzIG91dCB3aGF0IHRvIGRvIHdoZW4gYSB0b2tlbiBtaXNtYXRjaAorICAgICAqICBvY2N1cnMsIHNvIHRoYXQgVHJlZSBwYXJzZXJzIGNhbiBiZWhhdmUgZGlmZmVyZW50bHkgdG8gb3RoZXIgcmVjb2duaXplcnMuCisgICAgICovCisgICAgdm9pZAkJKCptaXNtYXRjaCkJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsCisJCQkJCSAgICBBTlRMUjNfVUlOVDMyIHR0eXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdyk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIGNhbGwgdG8gcmVwb3J0IGEgcmVjb2duaXRpb24gcHJvYmxlbS4gWW91IG1heSBvdmVycmlkZQorICAgICAqICB0aGlzIGZ1bmN0aW9uIHdpdGggeW91ciBvd24gZnVuY3Rpb24sIGJ1dCByZWZlciB0byB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgaW4gYW50bHIzYmFzZXJlY29nbml6ZXIuYyBmb3IgZ3VpZGFuY2UuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmVjb2duaXplIHdoZXRoZXIgCisgICAgICogIGVycm9yIHJlY292ZXJ5IGlzIGluIGZvcmNlLCBzbyB0aGF0IGl0IGRvZXMgbm90IHByaW50IG91dCBtb3JlIHRoYW4gb25lIGVycm9yIG1lc3NhZ2VzCisgICAgICogIGZvciB0aGUgc2FtZSBlcnJvci4gRnJvbSB0aGUgamF2YSBjb21tZW50cyBpbiBCYXNlUmVjb2duaXplci5qYXZhOgorICAgICAqCisgICAgICogIFRoaXMgbWV0aG9kIHNldHMgZXJyb3JSZWNvdmVyeSB0byBpbmRpY2F0ZSB0aGUgcGFyc2VyIGlzIHJlY292ZXJpbmcKKyAgICAgKiAgbm90IHBhcnNpbmcuICBPbmNlIGluIHJlY292ZXJ5IG1vZGUsIG5vIGVycm9ycyBhcmUgZ2VuZXJhdGVkLgorICAgICAqICBUbyBnZXQgb3V0IG9mIHJlY292ZXJ5IG1vZGUsIHRoZSBwYXJzZXIgbXVzdCBzdWNjZXNzZnVsbHkgbWF0Y2gKKyAgICAgKiAgYSB0b2tlbiAoYWZ0ZXIgYSByZXN5bmMpLiAgU28gaXQgd2lsbCBnbzoKKyAgICAgKgorICAgICAqIAkJMS4gZXJyb3Igb2NjdXJzCisgICAgICogCQkyLiBlbnRlciByZWNvdmVyeSBtb2RlLCByZXBvcnQgZXJyb3IKKyAgICAgKiAJCTMuIGNvbnN1bWUgdW50aWwgdG9rZW4gZm91bmQgaW4gcmVzeW5jaCBzZXQKKyAgICAgKiAJCTQuIHRyeSB0byByZXN1bWUgcGFyc2luZworICAgICAqIAkJNS4gbmV4dCBtYXRjaCgpIHdpbGwgcmVzZXQgZXJyb3JSZWNvdmVyeSBtb2RlCisgICAgICovCisgICAgdm9pZAkJKCpyZXBvcnRFcnJvcikJCSAgICAoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplcik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIGRpc3BsYXkgYSByZWNvZ25pdGlvbiBlcnJvciBtZXNzYWdlLiBZb3UgbWF5CisgICAgICogIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW5kZXBlbmRlbnRseSBvZiAoKnJlcG9ydEVycm9yKSgpIGFib3ZlIGFzIHRoYXQgZnVuY3Rpb24gY2FsbHMKKyAgICAgKiAgdGhpcyBvbmUgdG8gZG8gdGhlIGFjdHVhbCBleGNlcHRpb24gcHJpbnRpbmcuCisgICAgICovCisgICAgdm9pZAkJKCpkaXNwbGF5UmVjb2duaXRpb25FcnJvcikgIChzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyLCBwQU5UTFIzX1VJTlQ4ICogdG9rZW5OYW1lcyk7CisKKwkvLy8gR2V0IG51bWJlciBvZiByZWNvZ25pdGlvbiBlcnJvcnMgKGxleGVyLCBwYXJzZXIsIHRyZWUgcGFyc2VyKS4gIEVhY2gKKwkvLy8gcmVjb2duaXplciB0cmFja3MgaXRzIG93biBudW1iZXIuICBTbyBwYXJzZXIgYW5kIGxleGVyIGVhY2ggaGF2ZQorCS8vLyBzZXBhcmF0ZSBjb3VudC4gIERvZXMgbm90IGNvdW50IHRoZSBzcHVyaW91cyBlcnJvcnMgZm91bmQgYmV0d2VlbgorCS8vLyBhbiBlcnJvciBhbmQgbmV4dCB2YWxpZCB0b2tlbiBtYXRjaAorCS8vLworCS8vLyBcc2VlIHJlcG9ydEVycm9yKCkKKwkvLy8KKwlBTlRMUjNfVUlOVDMyCisJCQkJKCpnZXROdW1iZXJPZlN5bnRheEVycm9ycykJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJlY292ZXJzIGZyb20gYW4gZXJyb3IgZm91bmQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiAgR2VuZXJhbGx5LCB0aGlzIHdpbGwgYmUgYSAjQU5UTFIzX0VYQ0VQVElPTl9OT1ZJQUJMRV9BTFQgYnV0IGl0IGNvdWxkIGFsc28KKyAgICAgKiAgYmUgZnJvbSBhIG1pc21hdGNoZWQgdG9rZW4gdGhhdCB0aGUgKCptYXRjaCkoKSBjb3VsZCBub3QgcmVjb3ZlciBmcm9tLgorICAgICAqLworICAgIHZvaWQJCSgqcmVjb3ZlcikJCSAgICAoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplcik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgaXMgYSBob29rIHRvIGxpc3RlbiB0byB0b2tlbiBjb25zdW1wdGlvbiBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuCisgICAgICogIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgdGhlIGRlYnVnIHBhcnNlciB0byBzZW5kIGV2ZW50cyB0byB0aGUgbGlzdGVuZXIuCisgICAgICovCisgICAgdm9pZAkJKCpiZWdpblJlc3luYykJCSAgICAoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplcik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgaXMgYSBob29rIHRvIGxpc3RlbiB0byB0b2tlbiBjb25zdW1wdGlvbiBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuCisgICAgICogIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgdGhlIGRlYnVnIHBhcnNlciB0byBzZW5kIGV2ZW50cyB0byB0aGUgbGlzdGVuZXIuCisgICAgICovCisgICAgdm9pZAkJKCplbmRSZXN5bmMpCQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworCisJLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGlzIGEgaG9vayB0byBsaXN0ZW4gdG8gdG9rZW4gY29uc3VtcHRpb24gZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorICAgICAqICBUaGlzIGlzIG1haW5seSB1c2VkIGJ5IHRoZSBkZWJ1ZyBwYXJzZXIgdG8gc2VuZCBldmVudHMgdG8gdGhlIGxpc3RlbmVyLgorICAgICAqLworICAgIHZvaWQJCSgqYmVnaW5CYWNrdHJhY2spCQkoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiBsZXZlbCk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgaXMgYSBob29rIHRvIGxpc3RlbiB0byB0b2tlbiBjb25zdW1wdGlvbiBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuCisgICAgICogIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgdGhlIGRlYnVnIHBhcnNlciB0byBzZW5kIGV2ZW50cyB0byB0aGUgbGlzdGVuZXIuCisgICAgICovCisgICAgdm9pZAkJKCplbmRCYWNrdHJhY2spCQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsIEFOVExSM19VSU5UMzIgbGV2ZWwsIEFOVExSM19CT09MRUFOIHN1Y2Nlc3NmdWwpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBjb21wdXRlciB0aGUgZXJyb3IgcmVjb3Zlcnkgc2V0IGZvciB0aGUgY3VycmVudCBydWxlLgorICAgICAqICBcc2VlIGFudGxyM0NvbXB1dGVFcnJvclJlY292ZXJ5U2V0KCkgZm9yIGRldGFpbHMuCisgICAgICovCisgICAgcEFOVExSM19CSVRTRVQJKCpjb21wdXRlRXJyb3JSZWNvdmVyeVNldCkgIChzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0aGUgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldCBmb3IgdGhlIAorICAgICAqICBjdXJyZW50IHJ1bGUuCisgICAgICogXHNlZSBhbnRscjNDb21wdXRlQ1NSdWxlRm9sbG93KCkgZm9yIGRldGFpbHMuCisgICAgICovCisgICAgcEFOVExSM19CSVRTRVQJKCpjb21wdXRlQ1NSdWxlRm9sbG93KQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBjb21iaW5lIGZvbGxvdyBiaXRzZXRzLgorICAgICAqIFxzZWUgYW50bHIzQ29tYmluZUZvbGxvd3MoKSBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0JJVFNFVAkoKmNvbWJpbmVGb2xsb3dzKQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsIAorCQkJCQkJCSAgICBBTlRMUjNfQk9PTEVBTiBleGFjdCk7CisgCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJlY292ZXJzIGZyb20gYSBtaXNtYXRjaGVkIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogXHNlZSBhbnRscjNSZWNvdmVyTWlzbWF0Y2goKSBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICB2b2lkCQkqICgqcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4pCisJCQkJCQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsCisJCQkJCQkJICAgIEFOVExSM19VSU5UMzIJdHR5cGUsCisJCQkJCQkJICAgIHBBTlRMUjNfQklUU0VUX0xJU1QJZm9sbG93KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZWNvdmVycyBmcm9tIGEgbWlzbWF0Y2hlZCBzZXQgaW4gdGhlIHRva2VuIHN0cmVhbSwgaW4gYSBzaW1pbGFyIG1hbm5lcgorICAgICAqICB0byAoKnJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKQorICAgICAqLworICAgIHZvaWQJCSogKCpyZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQpIChzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyLAorCQkJCQkJCSAgICBwQU5UTFIzX0JJVFNFVF9MSVNUCWZvbGxvdyk7CisKKyAgICAvKiogUG9pbnRlciB0byBjb21tb24gcm91dGluZSB0byBoYW5kbGUgc2luZ2xlIHRva2VuIGluc2VydGlvbiBmb3IgcmVjb3ZlcnkgZnVuY3Rpb25zLgorICAgICAqLworICAgIEFOVExSM19CT09MRUFOCSgqcmVjb3ZlckZyb21NaXNtYXRjaGVkRWxlbWVudCkKKwkJCQkJCSAgICAoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwKKwkJCQkJCQkgICAgcEFOVExSM19CSVRTRVRfTElTVAlmb2xsb3cpOworICAgIAorICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgY29uc3VtZXMgaW5wdXQgdW50aWwgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcworICAgICAqICB0aGUgZ2l2ZW4gdG9rZW4uCisgICAgICovCisgICAgdm9pZAkJKCpjb25zdW1lVW50aWwpCQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsCisJCQkJCQkJICAgIEFOVExSM19VSU5UMzIgICB0b2tlblR5cGUpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBjb25zdW1lcyBpbnB1dCB1bnRpbCB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzCisgICAgICogIG9uZSBpbiB0aGUgZ2l2ZW4gc2V0LgorICAgICAqLworICAgIHZvaWQJCSgqY29uc3VtZVVudGlsU2V0KQkgICAgKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsCisJCQkJCQkJICAgIHBBTlRMUjNfQklUU0VUCXNldCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gQU5UTFIzX0xJU1Qgb2YgdGhlIHN0cmluZ3MgdGhhdCBpZGVudGlmeQorICAgICAqICB0aGUgcnVsZXMgaW4gdGhlIHBhcnNlciB0aGF0IGdvdCB5b3UgdG8gdGhpcyBwb2ludC4gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgaW5zdGFsbGluZyB5b3VyCisgICAgICoJb3duIGZ1bmN0aW9uIHNldC4KKyAgICAgKgorICAgICAqIFx0b2RvIERvY3VtZW50IGhvdyB0byBvdmVycmlkZSBpbnZvY2F0aW9uIHN0YWNrIGZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUQUNLCSgqZ2V0UnVsZUludm9jYXRpb25TdGFjaykJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworICAgIHBBTlRMUjNfU1RBQ0sJKCpnZXRSdWxlSW52b2NhdGlvblN0YWNrTmFtZWQpICAoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwKKwkJCQkJCQkJcEFOVExSM19VSU5UOAkgICAgbmFtZSk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gQU5MUjNfTElTVCBvZiB0b2tlbnMgdG8gYW4gQU5UTFIzX0xJU1Qgb2YKKyAgICAgKiAgc3RyaW5nIHRva2VuIG5hbWVzLiBBcyB0aGlzIGlzIG1vc3RseSB1c2VkIGluIHN0cmluZyB0ZW1wbGF0ZSBwcm9jZXNzaW5nIGl0IG1heSBub3QgYmUgdXNlZnVsCisgICAgICogIGluIHRoZSBDIHJ1bnRpbWUuCisgICAgICovCisgICAgcEFOVExSM19IQVNIX1RBQkxFCSgqdG9TdHJpbmdzKQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyLAorCQkJCQkJCQlwQU5UTFIzX0hBU0hfVEFCTEUpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byByZXR1cm4gd2hldGhlciB0aGUgcnVsZSBoYXMgcGFyc2VkIGlucHV0IHN0YXJ0aW5nIGF0IHRoZSBzdXBwbGllZCAKKyAgICAgKiAgc3RhcnQgaW5kZXggYmVmb3JlLiBJZiB0aGUgcnVsZSBoYXMgbm90IHBhcnNlZCBpbnB1dCBzdGFydGluZyBmcm9tIHRoZSBzdXBwbGllZCBzdGFydCBpbmRleCwKKyAgICAgKiAgdGhlbiBpdCB3aWxsIHJldHVybiBBTlRMUjNfTUVNT19SVUxFX1VOS05PV04uIElmIGl0IGhhcyBwYXJzZWQgZnJvbSB0aGUgc3VwcGxlZCBzdGFydCBwb2ludAorICAgICAqICB0aGVuIGl0IHdpbGwgcmV0dXJuIHRoZSBwb2ludCB3aGVyZSBpdCBsYXN0IHN0b3BwZWQgcGFyc2luZyBhZnRlciB0aGF0IHN0YXJ0IHBvaW50LgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIJKCpnZXRSdWxlTWVtb2l6YXRpb24pCQkoc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwKKwkJCQkJCQkJQU5UTFIzX0lOVEtFWQlydWxlSW5kZXgsCisJCQkJCQkJCUFOVExSM19NQVJLRVIJcnVsZVBhcnNlU3RhcnQpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJ1bGUgaGFzIHBhcnNlZCBpbnB1dCBhdCB0aGUgY3VycmVudCBpbmRleAorICAgICAqICBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgQU5UTFIzX0JPT0xFQU4JKCphbHJlYWR5UGFyc2VkUnVsZSkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyLAorCQkJCQkJCQlBTlRMUjNfTUFSS0VSCXJ1bGVJbmRleCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJlY29yZHMgd2hldGhlciB0aGUgcnVsZSBoYXMgcGFyc2VkIHRoZSBpbnB1dCBhdCBhIAorICAgICAqICBjdXJyZW50IHBvc2l0aW9uIHN1Y2Nlc3NmdWxseSBvciBub3QuCisgICAgICovCisgICAgdm9pZAkJKCptZW1vaXplKQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QgKiByZWNvZ25pemVyLAorCQkJCQkJCQlBTlRMUjNfTUFSS0VSCXJ1bGVJbmRleCwKKwkJCQkJCQkJQU5UTFIzX01BUktFUglydWxlUGFyc2VTdGFydCk7CisKKwkvLy8gUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wuCisgICAgLy8vIFRoZSBpcyBwbGFjZWQgaW50byBhbnkgbGFiZWwgZm9yIHRoZSBhc3NvY2lhdGVkIHRva2VuIHJlZjsgZS5nLiwgeD1JRC4gIFRva2VuCisJLy8vIGFuZCB0cmVlIHBhcnNlcnMgbmVlZCB0byByZXR1cm4gZGlmZmVyZW50IG9iamVjdHMuIFJhdGhlciB0aGFuIHRlc3QKKwkvLy8gZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKwkvLy8gYSBzaW1wbGUgbWV0aG9kIHRvIGFzayB0aGUgcmVjb2duaXplciB0byB0ZWxsIG1lIHdoYXQgdGhlIGN1cnJlbnQKKwkvLy8gaW5wdXQgc3ltYm9sIGlzLgorCS8vLworCS8vLyBUaGlzIGlzIGlnbm9yZWQgZm9yIGxleGVycyBhbmQgdGhlIGxleGVyIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKKwkvLy8gZnVuY3Rpb24gc2hvdWxkIHJldHVybiBOVUxMLgorCS8vLworCXZvaWQgKgkJKCpnZXRDdXJyZW50SW5wdXRTeW1ib2wpCSgJc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwgCisJCQkJCQkJCQkJCQlwQU5UTFIzX0lOVF9TVFJFQU0gaXN0cmVhbSk7CisKKwkvLy8gQ29uanVyZSB1cCBhIG1pc3NpbmcgdG9rZW4gZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorCS8vLworCS8vLyBUaGUgcmVjb2duaXplciBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gc2luZ2xlIG1pc3NpbmcKKwkvLy8gc3ltYm9scy4gQnV0LCBhY3Rpb25zIG1pZ2h0IHJlZmVyIHRvIHRoYXQgbWlzc2luZyBzeW1ib2wuCisJLy8vIEZvciBleGFtcGxlLCB4PUlEIHtmKCR4KTt9LiBUaGUgYWN0aW9uIGNsZWFybHkgYXNzdW1lcworCS8vLyB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGlkZW50aWZpZXIgbWF0Y2hlZCBwcmV2aW91c2x5IGFuZCB0aGF0CisJLy8vICR4IHBvaW50cyBhdCB0aGF0IHRva2VuLiBJZiB0aGF0IHRva2VuIGlzIG1pc3NpbmcsIGJ1dAorCS8vLyB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtIGlzIHdoYXQgd2Ugd2FudCB3ZSBhc3N1bWUgdGhhdAorCS8vLyB0aGlzIHRva2VuIGlzIG1pc3NpbmcgYW5kIHdlIGtlZXAgZ29pbmcuIEJlY2F1c2Ugd2UKKwkvLy8gaGF2ZSB0byByZXR1cm4gc29tZSB0b2tlbiB0byByZXBsYWNlIHRoZSBtaXNzaW5nIHRva2VuLAorCS8vLyB3ZSBoYXZlIHRvIGNvbmp1cmUgb25lIHVwLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdXNlciBjb250cm9sCisJLy8vIG92ZXIgdGhlIHRva2VucyByZXR1cm5lZCBmb3IgbWlzc2luZyB0b2tlbnMuIE1vc3RseSwKKwkvLy8geW91IHdpbGwgd2FudCB0byBjcmVhdGUgc29tZXRoaW5nIHNwZWNpYWwgZm9yIGlkZW50aWZpZXIKKwkvLy8gdG9rZW5zLiBGb3IgbGl0ZXJhbHMgc3VjaCBhcyAneycgYW5kICcsJywgdGhlIGRlZmF1bHQKKwkvLy8gYWN0aW9uIGluIHRoZSBwYXJzZXIgb3IgdHJlZSBwYXJzZXIgd29ya3MuIEl0IHNpbXBseSBjcmVhdGVzCisJLy8vIGEgQ29tbW9uVG9rZW4gb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuIFRoZSB0ZXh0IHdpbGwgYmUgdGhlIHRva2VuLgorCS8vLyBJZiB5b3UgY2hhbmdlIHdoYXQgdG9rZW5zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgbGV4ZXIsCisJLy8vIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdG9rZW5zLgorCS8vLworCXZvaWQgKgkJKCpnZXRNaXNzaW5nU3ltYm9sKQkJCSgJc3RydWN0IEFOVExSM19CQVNFX1JFQ09HTklaRVJfc3RydWN0ICogcmVjb2duaXplciwKKwkJCQkJCQkJCQkJCXBBTlRMUjNfSU5UX1NUUkVBTQkJaXN0cmVhbSwKKwkJCQkJCQkJCQkJCXBBTlRMUjNfRVhDRVBUSU9OCQllLAorCQkJCQkJCQkJCQkJQU5UTFIzX1VJTlQzMgkJCWV4cGVjdGVkVG9rZW5UeXBlLAorCQkJCQkJCQkJCQkJcEFOVExSM19CSVRTRVRfTElTVAkJZm9sbG93KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHdoZXRoZXIgdGhlIHN1cHBsaWVkIGdyYW1tYXIgZnVuY3Rpb24KKyAgICAgKiAgd2lsbCBwYXJzZSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0gb3Igbm90LiBUaGlzIGlzIHRoZSB3YXkgdGhhdCBzeW50YWN0aWMKKyAgICAgKiAgcHJlZGljYXRlcyBhcmUgZXZhbHVhdGVkLiBVbmxpa2UgamF2YSwgQyBpcyBwZXJmZWN0bHkgaGFwcHkgdG8gaW52b2tlIGNvZGUKKyAgICAgKiAgdmlhIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIChoZW5jZSB0aGF0J3Mgd2hhdCBhbGwgdGhlIEFOVExSMyBDIGludGVyZmFjZXMgCisgICAgICogIGRvLgorICAgICAqLworICAgIEFOVExSM19CT09MRUFOCSgqc3lucHJlZCkJCQkoCXN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIsICB2b2lkICogY3R4LAorCQkJCQkJCQkJCQl2b2lkICgqcHJlZGljYXRlKSh2b2lkICogY3R4KSk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGNvbnN0cnVjdCBhIGdlbmVyaWMgZXhjZXB0aW9uIHN0cnVjdHVyZQorICAgICAqIHdpdGggc3VjaCBpbmZvcm1hdGlvbiBhcyB0aGUgaW5wdXQgc3RyZWFtIGNhbiBwcm92aWRlLgorICAgICAqLworICAgIHZvaWQJCSAgICAoKmV4Q29uc3RydWN0KQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworCisgICAgLyoqIFJlc2V0IHRoZSByZWNvZ25pemVyCisgICAgICovCisgICAgdm9pZAkJICAgICgqcmVzZXQpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBmcmVlIHRoZSByZXNvdXJjZXMgb2YgYSBiYXNlIHJlY29nbml6ZXIuCisgICAgICovCisgICAgdm9pZAkJCSgqZnJlZSkJCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9SRUNPR05JWkVSX3N0cnVjdCAqIHJlY29nbml6ZXIpOworCit9CisgICAgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2luY2x1ZGUgICAgPGFudGxyM2xleGVyLmg+CisjaW5jbHVkZSAgICA8YW50bHIzcGFyc2VyLmg+CisjaW5jbHVkZSAgICA8YW50bHIzdHJlZXBhcnNlci5oPgorCisvLy8gQH0KKy8vLworCisjZW5kaWYJICAgIC8qIF9BTlRMUjNfQkFTRVJFQ09HTklaRVJfSAkqLworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzYmFzZXRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNiYXNldHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2M0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzYmFzZXRyZWUuaApAQCAtMCwwICsxLDE0MyBAQAorLy8vIFxmaWxlCisvLy8gRGVmaW5pdGlvbiBvZiB0aGUgQU5UTFIzIGJhc2UgdHJlZS4KKy8vLworCisjaWZuZGVmCV9BTlRMUjNfQkFTRV9UUkVFX0gKKyNkZWZpbmUJX0FOVExSM19CQVNFX1RSRUVfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzY29sbGVjdGlvbnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNzdHJpbmcuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy8gQSBnZW5lcmljIHRyZWUgaW1wbGVtZW50YXRpb24gd2l0aCBubyBwYXlsb2FkLiAgWW91IG11c3Qgc3ViY2xhc3MgdG8KKy8vLyBhY3R1YWxseSBoYXZlIGFueSB1c2VyIGRhdGEuICBBTlRMUiB2MyB1c2VzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcHByb2FjaAorLy8vIGluc3RlYWQgb2YgdGhlIGNoaWxkLXNpYmxpbmcgYXBwcm9hY2ggaW4gdjIuICBBIGZsYXQgdHJlZSAoYSBsaXN0KSBpcworLy8vIGFuIGVtcHR5IG5vZGUgd2hvc2UgY2hpbGRyZW4gcmVwcmVzZW50IHRoZSBsaXN0LiAgQW4gZW1wdHkgKGFzIGluIGl0IGRvZXMgbm90CisvLy8gaGF2ZSBwYXlsb2FkIGl0c2VsZiksIGJ1dCBub24tbnVsbCBub2RlIGlzIGNhbGxlZCAibmlsIi4KKy8vLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QKK3sKKworICAgIC8vLyBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc29tZXRpbWVzIHJlcXVpcmUgYSBwb2ludGVyIHRvIHRoZWlyIHNlbHZlcy4KKyAgICAvLy8KKyAgICB2b2lkICAgICoJICAgIHN1cGVyOworCisgICAgLy8vIEdlbmVyaWMgdm9pZCBwb2ludGVyIGFsbG93cyB0aGUgZ3JhbW1hciBwcm9ncmFtbWVyIHRvIGF0dGFjaCBhbnkgc3RydWN0dXJlIHRoZXkKKyAgICAvLy8gbGlrZSB0byBhIHRyZWUgbm9kZSwgaW4gbWFueSBjYXNlcyBzYXZpbmcgdGhlIG5lZWQgdG8gY3JlYXRlIHRoZWlyIG93biB0cmVlCisgICAgLy8vIGFuZCB0cmVlIGFkYXB0b3JzLiBBTlRMUiBkb2VzIG5vdCB1c2UgdGhpcyBwb2ludGVyLCBidXQgd2lsbCBjb3B5IGl0IGZvciB5b3UgYW5kIHNvIG9uLgorICAgIC8vLworICAgIHZvaWQgICAgKgkgICAgdTsKKworICAgIC8vLyBUaGUgbGlzdCBvZiBhbGwgdGhlIGNoaWxkcmVuIHRoYXQgYmVsb25nIHRvIHRoaXMgbm9kZS4gVGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIG5vZGUKKyAgICAvLy8gYXMgdGhleSBiZWxvbmcgdG8gdGhlIGNvbW1vbiB0cmVlIG5vZGUgdGhhdCBpbXBsZW1lbnRzIHRoaXMuCisgICAgLy8vCisgICAgcEFOVExSM19WRUNUT1IgIGNoaWxkcmVuOworCisgICAgLy8vIFRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBjaGlsZCBpbmRleCBwb3NpdGlvbiB3aGlsZSBkZXNjZW5kaW5nCisgICAgLy8vIGFuZCBhc2NlbmRpbmcgdHJlZXMgYXMgdGhlIHRyZWUgd2FsayBwcm9ncmVzc2VzLgorICAgIC8vLworICAgIEFOVExSM19NQVJLRVIgICBzYXZlZEluZGV4OworCisgICAgLy8vIEEgc3RyaW5nIGZhY3RvcnkgdG8gcHJvZHVjZSBzdHJpbmdzIGZvciB0b1N0cmluZyBldGMKKyAgICAvLy8KKyAgICBwQU5UTFIzX1NUUklOR19GQUNUT1JZIHN0ckZhY3Rvcnk7CisKKyAgICAvLy8gQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjb21tb24gdG9rZW4gcG9pbnRlcgorICAgIC8vLyBmb3IgdGhlIHBheWxvYWQgaW4gdGhlIHN1cHBsaWVkIHRyZWUuCisgICAgLy8vCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgICAgICAgICAgICAgKCpnZXRUb2tlbikJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKKyAgICB2b2lkCQkJCSgqYWRkQ2hpbGQpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUsIHZvaWQgKiBjaGlsZCk7CisKKyAgICB2b2lkCQkJCSgqYWRkQ2hpbGRyZW4pCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUsIHBBTlRMUjNfTElTVCBraWRzKTsKKworICAgIHZvaWQgICAgCQkJCSgqY3JlYXRlQ2hpbGRyZW5MaXN0KQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUpOworCisgICAgdm9pZCAgICAqCQkJCSgqZGVsZXRlQ2hpbGQpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUsIEFOVExSM19VSU5UMzIgaSk7CisKKyAgICB2b2lkCQkJCSgqcmVwbGFjZUNoaWxkcmVuKQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHBhcmVudCwgQU5UTFIzX0lOVDMyIHN0YXJ0Q2hpbGRJbmRleCwgQU5UTFIzX0lOVDMyIHN0b3BDaGlsZEluZGV4LCBzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0KTsKKworICAgIHZvaWQgICAgKgkJCQkoKmR1cE5vZGUpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIGR1cE5vZGUpOworCisgICAgdm9pZCAgICAqCQkJCSgqZHVwVHJlZSkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKKyAgICBBTlRMUjNfVUlOVDMyCQkJKCpnZXRDaGFyUG9zaXRpb25JbkxpbmUpCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlKTsKKworICAgIHZvaWQgICAgKgkJCQkoKmdldENoaWxkKQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlLCBBTlRMUjNfVUlOVDMyIGkpOworCisgICAgdm9pZCAgICAJCQkJKCpzZXRDaGlsZEluZGV4KQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUsIEFOVExSM19JTlQzMiApOworCisgICAgQU5UTFIzX0lOVDMyCQkJKCpnZXRDaGlsZEluZGV4KQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUgKTsKKworICAgIEFOVExSM19VSU5UMzIJCQkoKmdldENoaWxkQ291bnQpCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKKyAgICBzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiAgICAoKmdldFBhcmVudCkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKKyAgICB2b2lkICAgIAkJCQkoKnNldFBhcmVudCkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSwgc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogcGFyZW50KTsKKworICAgIEFOVExSM19VSU5UMzIJCQkoKmdldFR5cGUpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUpOworCisgICAgdm9pZCAgICAqCQkJCSgqZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlKQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSwgQU5UTFIzX1VJTlQzMiB0eXBlKTsKKworICAgIEFOVExSM19VSU5UMzIJCQkoKmdldExpbmUpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUpOworCisgICAgcEFOVExSM19TVFJJTkcJCQkoKmdldFRleHQpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUpOworCisgICAgQU5UTFIzX0JPT0xFQU4JCQkoKmlzTmlsTm9kZSkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKKyAgICB2b2lkCQkJCSgqc2V0Q2hpbGQpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUsIEFOVExSM19VSU5UMzIgaSwgdm9pZCAqIGNoaWxkKTsKKworICAgIHBBTlRMUjNfU1RSSU5HCQkJKCp0b1N0cmluZ1RyZWUpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUpOworCisgICAgcEFOVExSM19TVFJJTkcJCQkoKnRvU3RyaW5nKQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlKTsKKworICAgIHZvaWQJCQkJKCpmcmVzaGVuUEFDSW5kZXhlc0FsbCkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlKTsKKworICAgIHZvaWQJCQkJKCpmcmVzaGVuUEFDSW5kZXhlcykJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlLCBBTlRMUjNfVUlOVDMyIG9mZnNldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnJldXNlKSAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlKTsKKworICAgIHZvaWQgICAgCQkJCSgqZnJlZSkJCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX3N0cnVjdCAqIHRyZWUpOworCit9CisgICAgQU5UTFIzX0JBU0VfVFJFRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNiYXNldHJlZWFkYXB0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNiYXNldHJlZWFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjlhNzJhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2Jhc2V0cmVlYWRhcHRvci5oCkBAIC0wLDAgKzEsMTUyIEBACisvKiogXGZpbGUKKyAqIERlZmluaXRpb24gb2YgdGhlIEFOVExSMyBiYXNlIHRyZWUgYWRhcHRvci4KKyAqLworCisjaWZuZGVmCV9BTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1JfSAorI2RlZmluZQlfQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzZGVmcy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbGxlY3Rpb25zLmg+CisjaW5jbHVkZSAgICA8YW50bHIzc3RyaW5nLmg+CisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXRyZWUuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250b2tlbi5oPgorI2luY2x1ZGUJPGFudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYJc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QKK3sKKyAgICAvKiogUG9pbnRlciB0byBhbnkgZW5jbG9zaW5nIHN0cnVjdHVyZS9pbnRlcmZhY2UgdGhhdAorICAgICAqICBjb250YWlucyB0aGlzIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICB2b2lkCQkJCQkJCSogc3VwZXI7CisKKyAgICAvKiogV2UgbmVlZCBhIHN0cmluZyBmYWN0b3J5IGZvciBjcmVhdGluZyBpbWFnaW5hcnkgdG9rZW5zLCB3ZSB0YWtlIHRoaXMKKyAgICAgKiAgZnJvbSB0aGUgc3RyZWFtIHdlIGFyZSBzdXBwbGllZCB0byB3YWxrLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkJCQlzdHJGYWN0b3J5OworCisgICAgLyogQW5kIHdlIGFsc28gbmVlZCBhIHRva2VuIGZhY3RvcnkgZm9yIGNyZWF0aW5nIGltYWdpbmFyeSB0b2tlbnMKKyAgICAgKiB0aGlzIGlzIGFsc28gdGFrZW4gZnJvbSB0aGUgaW5wdXQgc291cmNlLgorICAgICAqLworICAgIHBBTlRMUjNfVE9LRU5fRkFDVE9SWQkJCXRva2VuRmFjdG9yeTsKKworCS8vLyBJZiBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gTlVMTCwgdGhlbiB0aGlzIHN0cnVjdHVyZSBpcworCS8vLyBwb2ludHMgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGRlYnVnZ2VyIGludGVyZmFjZS4gSW4gZ2VuZXJhbCwgdGhlCisJLy8vIGRlYnVnZ2VyIGlzIG9ubHkgcmVmZXJlbmNlZCBpbnRlcm5hbGx5IGluIHJlY292ZXJ5L2Vycm9yIG9wZXJhdGlvbnMKKwkvLy8gc28gdGhhdCBpdCBkb2VzIG5vdCBjYXVzZSBvdmVyaGVhZCBieSBoYXZpbmcgdG8gY2hlY2sgdGhpcyBwb2ludGVyCisJLy8vIGluIGV2ZXJ5IGZ1bmN0aW9uL21ldGhvZAorCS8vLworCXBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIJZGVidWdnZXI7CisKKyAgICB2b2lkICoJICAgCQkgCQkoKm5pbE5vZGUpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IpOworCisKKyAgICB2b2lkICoJICAgCQkgCQkoKmR1cFRyZWUpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiB0cmVlKTsKKyAgICB2b2lkICoJICAgCQkgCQkoKmR1cFRyZWVUVCkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCwgdm9pZCAqIHRyZWUpOworCisgICAgdm9pZAkJCQkJKCphZGRDaGlsZCkJCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIHQsIHZvaWQgKiBjaGlsZCk7CisgICAgdm9pZAkJCQkJKCphZGRDaGlsZFRva2VuKQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIHQsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIGNoaWxkKTsKKyAgICB2b2lkCQkJCQkoKnNldFBhcmVudCkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogY2hpbGQsIHZvaWQgKiBwYXJlbnQpOworICAgIHZvaWQgKgkJCQkJKCpnZXRQYXJlbnQpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIGNoaWxkKTsKKworCXZvaWQgKgkJCQkJKCplcnJvck5vZGUpCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgcEFOVExSM19UT0tFTl9TVFJFQU0gdG5zdHJlYW0sIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0YXJ0VG9rZW4sIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0b3BUb2tlbiwgcEFOVExSM19FWENFUFRJT04gZSk7CisJQU5UTFIzX0JPT0xFQU4JCQkoKmlzTmlsTm9kZSkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCk7CisKKyAgICB2b2lkICoJICAgIAkJCSgqYmVjb21lUm9vdCkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogbmV3Um9vdCwgdm9pZCAqIG9sZFJvb3QpOworCisgICAgdm9pZCAqCSAgIAkJCSAJKCpydWxlUG9zdFByb2Nlc3NpbmcpCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiByb290KTsKKworICAgIHZvaWQgKgkgICAJCQkgCSgqYmVjb21lUm9vdFRva2VuKQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIG5ld1Jvb3QsIHZvaWQgKiBvbGRSb290KTsKKworICAgIHZvaWQgKgkgICAJCSAJCSgqY3JlYXRlKQkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBwYXlsb2FkKTsKKyAgICB2b2lkICoJICAgCQkgCQkoKmNyZWF0ZVR5cGVUb2tlbikJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBmcm9tVG9rZW4pOworICAgIHZvaWQgKgkgICAJCQkJKCpjcmVhdGVUeXBlVG9rZW5UZXh0KQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCBBTlRMUjNfVUlOVDMyIHRva2VuVHlwZSwgcEFOVExSM19DT01NT05fVE9LRU4gZnJvbVRva2VuLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworICAgIHZvaWQgKgkgICAgCQkJKCpjcmVhdGVUeXBlVGV4dCkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworCisgICAgdm9pZCAqCSAgICAJCQkoKmR1cE5vZGUpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiB0cmVlTm9kZSk7CisKKyAgICBBTlRMUjNfVUlOVDMyCQkJKCpnZXRUeXBlKQkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCk7CisKKyAgICB2b2lkCQkJCQkoKnNldFR5cGUpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiB0LCBBTlRMUjNfVUlOVDMyIHR5cGUpOworICAgIAorICAgIHBBTlRMUjNfU1RSSU5HCQkJKCpnZXRUZXh0KQkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCk7CisKKyAgICB2b2lkCQkJCQkoKnNldFRleHQpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHBBTlRMUjNfU1RSSU5HIHQpOworICAgIHZvaWQJCQkJCSgqc2V0VGV4dDgpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHBBTlRMUjNfVUlOVDggdCk7CisKKyAgICB2b2lkICoJICAgIAkJCSgqZ2V0Q2hpbGQpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiB0LCBBTlRMUjNfVUlOVDMyIGkpOworICAgIHZvaWQJCQkJCSgqc2V0Q2hpbGQpCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiB0LCBBTlRMUjNfVUlOVDMyIGksIHZvaWQgKiBjaGlsZCk7CisgICAgdm9pZAkJCQkJKCpkZWxldGVDaGlsZCkJCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCwgQU5UTFIzX1VJTlQzMiBpKTsKKyAgICB2b2lkCQkJCSAgICAoKnNldENoaWxkSW5kZXgpCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCwgQU5UTFIzX1VJTlQzMiBpKTsKKyAgICBBTlRMUjNfSU5UMzIJCSAgICAoKmdldENoaWxkSW5kZXgpCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCk7CisKKyAgICBBTlRMUjNfVUlOVDMyCQkJKCpnZXRDaGlsZENvdW50KQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqKTsKKworICAgIEFOVExSM19VSU5UMzIJCQkoKmdldFVuaXF1ZUlEKQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKik7CisKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICAoKmNyZWF0ZVRva2VuKQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgICgqY3JlYXRlVG9rZW5Gcm9tVG9rZW4pCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIGZyb21Ub2tlbik7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgKCpnZXRUb2tlbikJCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIHQpOyAgCisKKyAgICB2b2lkCQkJCQkoKnNldFRva2VuQm91bmRhcmllcykJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIHQsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0YXJ0VG9rZW4sIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0b3BUb2tlbik7CisKKyAgICBBTlRMUjNfTUFSS0VSCQkJKCpnZXRUb2tlblN0YXJ0SW5kZXgpCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IsIHZvaWQgKiB0KTsKKworICAgIEFOVExSM19NQVJLRVIJCQkoKmdldFRva2VuU3RvcEluZGV4KQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogdCk7CisKKwl2b2lkCQkJCQkoKnNldERlYnVnRXZlbnRMaXN0ZW5lcikoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlYnVnZ2VyKTsKKworCS8vLyBQcm9kdWNlIGEgRE9UIChzZWUgZ3JhcGh2aXogZnJlZXdhcmUgc3VpdGUpIGZyb20gYSBiYXNlIHRyZWUKKwkvLy8KKwlwQU5UTFIzX1NUUklORwkJCSgqbWFrZURvdCkJCQkJKHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0ICogYWRhcHRvciwgdm9pZCAqIHRoZVRyZWUpOworCisJLy8vIFJlcGxhY2UgZnJvbSBzdGFydCB0byBzdG9wIGNoaWxkIGluZGV4IG9mIHBhcmVudCB3aXRoIHQsIHdoaWNoIG1pZ2h0CisJLy8vIGJlIGEgbGlzdC4gIE51bWJlciBvZiBjaGlsZHJlbiBtYXkgYmUgZGlmZmVyZW50CisJLy8vIGFmdGVyIHRoaXMgY2FsbC4gIAorCS8vLworCS8vLyBJZiBwYXJlbnQgaXMgbnVsbCwgZG9uJ3QgZG8gYW55dGhpbmc7IG11c3QgYmUgYXQgcm9vdCBvZiBvdmVyYWxsIHRyZWUuCisJLy8vIENhbid0IHJlcGxhY2Ugd2hhdGV2ZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgZXh0ZXJuYWxseS4gIERvIG5vdGhpbmcuCisJLy8vCisJdm9pZAkJCQkJKCpyZXBsYWNlQ2hpbGRyZW4pCQkoc3RydWN0IEFOVExSM19CQVNFX1RSRUVfQURBUFRPUl9zdHJ1Y3QgKiBhZGFwdG9yLCB2b2lkICogcGFyZW50LCBBTlRMUjNfSU5UMzIgc3RhcnRDaGlsZEluZGV4LCBBTlRMUjNfSU5UMzIgc3RvcENoaWxkSW5kZXgsIHZvaWQgKiB0KTsKKworICAgIHZvaWQJCQkJCSgqZnJlZSkJCQkJCShzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SX3N0cnVjdCAqIGFkYXB0b3IpOworCit9CisgICAgQU5UTFIzX1RSRUVfQURBUFRPUiwgKnBBTlRMUjNfVFJFRV9BREFQVE9SOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzYml0c2V0LmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzYml0c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MTZhYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNiaXRzZXQuaApAQCAtMCwwICsxLDExOSBAQAorLyoqCisgKiBcZmlsZQorICogRGVmaW5lcyB0aGUgYmFzaWMgc3RydWN0dXJlcyBvZiBhbiBBTlRMUjMgYml0c2V0LiB0aGlzIGlzIGEgQyB2ZXJzaW9uIG9mIHRoZSAKKyAqIGN1dCBkb3duIEJpdHNldCBjbGFzcyBwcm92aWRlZCB3aXRoIHRoZSBqYXZhIHZlcnNpb24gb2YgYW50bHIgMy4KKyAqIAorICogCisgKi8KKyNpZm5kZWYJX0FOVExSM19CSVRTRVRfSAorI2RlZmluZQlfQU5UTFIzX0JJVFNFVF9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb2xsZWN0aW9ucy5oPgorCisvKiogSG93IG1hbnkgYml0cyBpbiB0aGUgZWxlbWVudHMKKyAqLworI2RlZmluZQlBTlRMUjNfQklUU0VUX0JJVFMJNjQKKworLyoqIEhvdyBtYW55IGJpdHMgaW4gYSBuaWJsZSBvZiBiaXRzCisgKi8KKyNkZWZpbmUJQU5UTFIzX0JJVFNFVF9OSUJCTEUJNAorCisvKiogbG9nMiBvZiBBTlRMUjNfQklUU0VUX0JJVFMgMl5BTlRMUjNfQklUU0VUX0xPR19CSVRTID0gQU5UTFIzX0JJVFNFVF9CSVRTCisgKi8KKyNkZWZpbmUJQU5UTFIzX0JJVFNFVF9MT0dfQklUUwk2CisKKy8qKiBXZSB3aWxsIG9mdGVuIG5lZWQgdG8gZG8gYSBtb2Qgb3BlcmF0b3IgKGkgbW9kIG5iaXRzKS4KKyAqICBGb3IgcG93ZXJzIG9mIHR3bywgdGhpcyBtb2Qgb3BlcmF0aW9uIGlzIHRoZQorICogIHNhbWUgYXM6CisgKiAgIC0gKGkgJiAobmJpdHMtMSkpLiAgCisgKgorICogU2luY2UgbW9kIGlzIHJlbGF0aXZlbHkgc2xvdywgd2UgdXNlIGFuIGVhc2lseQorICogcHJlY29tcHV0ZWQgbW9kIG1hc2sgdG8gZG8gdGhlIG1vZCBpbnN0ZWFkLgorICovCisjZGVmaW5lCUFOVExSM19CSVRTRVRfTU9EX01BU0sJQU5UTFIzX0JJVFNFVF9CSVRTIC0gMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEFOVExSM19CSVRTRVRfTElTVF9zdHJ1Y3QKK3sKKwkvLy8gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGFycmF5IG9mIGJpdHMgZm9yIHRoaXMgYml0IHNldCwgd2hpY2gKKyAgICAvLy8gaXMgYW4gYXJyYXkgb2YgNjQgYml0IGVsZW1lbnRzIChvZiB0aGUgYXJjaGl0ZWN0dXJlKS4gSWYgd2UgZmluZCBhIAorICAgIC8vLyBtYWNoaW5lL0MgY29tcGlsZXIgdGhhdCBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IDY0IGJpdCB2YWx1ZXMKKyAgICAvLy8JdGhlbiBpdCBzaG91bGQgYmUgZWFzeSBlbm91Z2ggdG8gcHJvZHVjZSBhIDMyIGJpdCAob3IgbGVzcykgdmVyc2lvbgorICAgIC8vLyBvZiB0aGUgYml0c2V0IGNvZGUuIE5vdGUgdGhhdCB0aGUgcG9pbnRlciBoZXJlIG1heSBiZSBzdGF0aWMgaWYgbGFpZCBkb3duCisJLy8vIGJ5IHRoZSBjb2RlIGdlbmVyYXRpb24sIGFuZCBpdCBtdXN0IGJlIGNvcGllZCBpZiBpdCBpcyB0byBiZSBtYW5pcHVsYXRlZAorCS8vLyB0byBwZXJmb3JtIGZvbGxvd3NldCBjYWxjdWxhdGlvbnMuCisgICAgLy8vCisgICAgcEFOVExSM19CSVRXT1JEICAgYml0czsKKworICAgIC8vLyBMZW5ndGggb2YgdGhlIGN1cnJlbnQgYml0IHNldCBpbiBBTlRMUjNfVUlOVDY0IHVuaXRzLgorICAgIC8vLworICAgIEFOVExSM19VSU5UMzIgICAgbGVuZ3RoOworfQorCUFOVExSM19CSVRTRVRfTElTVDsKKwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QKK3sKKwkvLy8gVGhlIGFjdHVhbCBiaXRzIHRoZW1zZWx2ZXMKKwkvLy8KKwlBTlRMUjNfQklUU0VUX0xJU1QJCQkJYmxpc3Q7CisKKyAgICBwQU5UTFIzX0JJVFNFVAkJCQkJKCpjbG9uZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogaW5TZXQpOworICAgIHBBTlRMUjNfQklUU0VUCQkJCQkoKmJvcikJCQkoc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0ICAqIGJpdHNldDEsIHN0cnVjdCBBTlRMUjNfQklUU0VUX3N0cnVjdCAqIGJpdHNldDIpOworICAgIHZvaWQJCQkJCQkJKCpib3JJblBsYWNlKSAgIChzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0LCAgc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0ICogYml0c2V0Mik7CisgICAgQU5UTFIzX1VJTlQzMgkJCQkJKCpzaXplKQkJCShzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0KTsKKyAgICB2b2lkCQkJCQkJCSgqYWRkKQkJCShzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0LCBBTlRMUjNfSU5UMzIgYml0KTsKKyAgICB2b2lkCQkJCQkJCSgqZ3JvdykJCQkoc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0ICAqIGJpdHNldCwgQU5UTFIzX0lOVDMyIG5ld1NpemUpOworICAgIEFOVExSM19CT09MRUFOCQkJCQkoKmVxdWFscykJICAgIChzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0MSwgc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0ICogYml0c2V0Mik7CisgICAgQU5UTFIzX0JPT0xFQU4JCQkJCSgqaXNNZW1iZXIpCSAgICAoc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0ICAqIGJpdHNldCwgQU5UTFIzX1VJTlQzMiBiaXQpOworICAgIEFOVExSM19VSU5UMzIJCQkJCSgqbnVtQml0cykJICAgIChzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0KTsKKyAgICB2b2lkCQkJCQkJCSgqcmVtb3ZlKQkgICAgKHN0cnVjdCBBTlRMUjNfQklUU0VUX3N0cnVjdCAgKiBiaXRzZXQsIEFOVExSM19VSU5UMzIgYml0KTsKKyAgICBBTlRMUjNfQk9PTEVBTgkJCQkJKCppc05pbE5vZGUpCSAgICAoc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0ICAqIGJpdHNldCk7CisgICAgcEFOVExSM19JTlQzMgkJCQkJKCp0b0ludExpc3QpICAgIChzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0KTsKKworICAgIHZvaWQJCQkJCQkJKCpmcmVlKQkJCShzdHJ1Y3QgQU5UTFIzX0JJVFNFVF9zdHJ1Y3QgICogYml0c2V0KTsKKworCit9CisgICAgQU5UTFIzX0JJVFNFVDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29sbGVjdGlvbnMuaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNjb2xsZWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzNlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29sbGVjdGlvbnMuaApAQCAtMCwwICsxLDUxMyBAQAorI2lmbmRlZglBTlRMUjNDT0xMRUNUSU9OU19ICisjZGVmaW5lCUFOVExSM0NPTExFQ1RJT05TX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzZGVmcy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2JpdHNldC5oPgorCisjZGVmaW5lCUFOVExSM19IQVNIX1RZUEVfSU5UCTAgICAvKio8IEluZGljYXRlcyB0aGUgaGFzaGVkIGZpbGUgaGFzIGludGVnZXIga2V5cyAqLworI2RlZmluZQlBTlRMUjNfSEFTSF9UWVBFX1NUUgkxICAgLyoqPCBJbmRpY2F0ZXMgdGhlIGhhc2hlZCBmaWxlIGhhcyBudW1lcmljIGtleXMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfSEFTSF9LRVlfc3RydWN0Cit7CisJQU5UTFIzX1VJTlQ4CXR5cGU7CS8qKjwgT25lIG9mICMjQU5UTFIzX0hBU0hfVFlQRV9JTlQgb3IgIyNBTlRMUjNfSEFTSF9UWVBFX1NUUgkqLworCisJdW5pb24KKwl7CisJCXBBTlRMUjNfVUlOVDggICBzS2V5OwkvKio8IFVzZWQgaWYgdHlwZSBpcyBBTlRMUjNfSEFTSF9UWVBFX1NUUgkJCSovCisJCUFOVExSM19JTlRLRVkgICBpS2V5OwkvKio8IHVzZWQgaWYgdHlwZSBpcyBBTlRMUjNfSEFTSF9UWVBFX0lOVAkJCSovCisJfQorCWtleTsKKworfSBBTlRMUjNfSEFTSF9LRVksICpwQU5UTFIzX0hBU0hfS0VZOworCisvKiogSW50ZXJuYWwgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBlbGVtZW50IGluIGEgaGFzaCBidWNrZXQuCisgKiAgU3RvcmVzIHRoZSBvcmlnaW5hbCBrZXkgc28gdGhhdCBkdXBsaWNhdGUga2V5cyBjYW4gYmUgcmVqZWN0ZWQKKyAqICBpZiBuZWNlc3NhcnksIGFuZCBjb250YWlucyBmdW5jdGlvbiBjYW4gYmUgc3VwcG9ydGVkLiBJZiB0aGUgaGFzaCBrZXkKKyAqICBjb3VsZCBiZSB1bmlxdWUgSSB3b3VsZCBoYXZlIGludmVudGVkIHRoZSBwZXJmZWN0IGNvbXByZXNzaW9uIGFsZ29yaXRobSA7LSkKKyAqLwordHlwZWRlZglzdHJ1Y3QJQU5UTFIzX0hBU0hfRU5UUllfc3RydWN0Cit7CisgICAgLyoqIEtleSB0aGF0IGNyZWF0ZWQgdGhpcyBwYXJ0aWN1bGFyIGVudHJ5CisgICAgICovCisgICAgQU5UTFIzX0hBU0hfS0VZIAlrZXliYXNlOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIGRhdGEgZm9yIHRoaXMgcGFydGljdWxhciBlbnRyeQorICAgICAqLworICAgIHZvaWQJICAgICogZGF0YTsKKworICAgIC8qKiBQb2ludGVyIHRvIHJvdXRpbmUgdGhhdCBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGUgbWVtb3J5CisgICAgICogIHN0cnVjdHVyZSBwb2ludGVkIGF0IGJ5IGRhdGEuIElmIHRoaXMgaXMgTlVMTCB0aGVuIHdlIGFzc3VtZQorICAgICAqICB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgZG9lcyBub3QgbmVlZCB0byBiZSBmcmVlZCB3aGVuIHRoZSBlbnRyeQorICAgICAqICBpcyBkZWxldGVkIGZyb20gdGhlIHRhYmxlLgorICAgICAqLworICAgIHZvaWQJICAgIChBTlRMUjNfQ0RFQ0wgKmZyZWUpKHZvaWQgKiBkYXRhKTsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgYnVja2V0IGlmIHRoZXJlCisgICAgICogIGlzIG9uZS4gU29tZXRpbWVzIGRpZmZlcmVudCBrZXlzIHdpbGwgaGFzaCB0byB0aGUgc2FtZSBidWNrZXQgKGVzcGVjaWFsbHkKKyAgICAgKiAgaWYgdGhlIG51bWJlciBvZiBidWNrZXRzIGlzIHNtYWxsKS4gV2UgY291bGQgaW1wbGVtZW50IGR1YWwgaGFzaGluZyBhbGdvcml0aG1zCisgICAgICogIHRvIG1pbmltaXplIHRoaXMsIGJ1dCB0aGF0IHNlZW1zIG92ZXIgdGhlIHRvcCBmb3Igd2hhdCB0aGlzIGlzIG5lZWRlZCBmb3IuCisgICAgICovCisgICAgc3RydWN0CUFOVExSM19IQVNIX0VOVFJZX3N0cnVjdCAqIG5leHRFbnRyeTsKK30KKyAgICBBTlRMUjNfSEFTSF9FTlRSWTsKKworLyoqIEludGVybmFsIHN0cnVjdHVyZSBvZiBhIGhhc2ggdGFibGUgYnVja2V0LCB3aGljaCB0cmFja3MKKyAqICBhbGwga2V5cyB0aGF0IGhhc2ggdG8gdGhlIHNhbWUgYnVja2V0LgorICovCit0eXBlZGVmIHN0cnVjdAlBTlRMUjNfSEFTSF9CVUNLRVRfc3RydWN0Cit7CisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBidWNrZXQgKGlmIGFueSwgaXQKKyAgICAgKiAgbWF5IGJlIE5VTEwpLiBEdXBsaWNhdGUgZW50cmllcyBhcmUgY2hhaW5lZCBmcm9tCisgICAgICogaGVyZS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0hBU0hfRU5UUlkJZW50cmllczsKKyAgICAKK30KKyAgICBBTlRMUjNfSEFTSF9CVUNLRVQ7CisKKy8qKiBTdHJ1Y3R1cmUgdGhhdCB0cmFja3MgYSBoYXNoIHRhYmxlCisgKi8KK3R5cGVkZWYJc3RydWN0CUFOVExSM19IQVNIX1RBQkxFX3N0cnVjdAoreworICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFibGUgYWxsb3dzIGR1cGxpY2F0ZSBrZXlzCisgICAgICovCisgICAgaW50CQkJCQlhbGxvd0R1cHM7CisKKyAgICAvKiogTnVtYmVyIG9mIGJ1Y2tldHMgYXZhaWxhYmxlIGluIHRoaXMgdGFibGUKKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCQltb2R1bG87CisKKyAgICAvKiogUG9pbnRzIHRvIHRoZSBtZW1vcnkgd2hlcmUgdGhlIGFycmF5IG9mIGJ1Y2tldHMKKyAgICAgKiBzdGFydHMuCisgICAgICovCisgICAgcEFOVExSM19IQVNIX0JVQ0tFVAlidWNrZXRzOworCisgICAgLyoqIEhvdyBtYW55IGVsZW1lbnRzIGN1cnJlbnRseSBleGlzdCBpbiB0aGUgdGFibGUuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkJY291bnQ7CisKKyAgICAvKiogV2hldGhlciB0aGUgaGFzaCB0YWJsZSBzaG91bGQgc3RyZHVwIHRoZSBrZXlzIGl0IGlzIGdpdmVuIG9yIG5vdC4KKyAgICAgKi8KKyAgICBBTlRMUjNfQk9PTEVBTiAgICAgICAgICAgICAgZG9TdHJkdXA7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0byBjb21wbGV0ZWx5IGRlbGV0ZSB0aGlzIHRhYmxlCisgICAgICovCisgICAgdm9pZAkJCQkoKmZyZWUpCSAgICAoc3RydWN0IEFOVExSM19IQVNIX1RBQkxFX3N0cnVjdCAqIHRhYmxlKTsKKyAgICAKKyAgICAvKiBTdHJpbmcga2V5ZWQgaGFzaHRhYmxlIGZ1bmN0aW9ucyAqLworICAgIHZvaWQJCQkJKCpkZWwpCSAgICAoc3RydWN0IEFOVExSM19IQVNIX1RBQkxFX3N0cnVjdCAqIHRhYmxlLCB2b2lkICoga2V5KTsKKyAgICBwQU5UTFIzX0hBU0hfRU5UUlkJKCpyZW1vdmUpICAgKHN0cnVjdCBBTlRMUjNfSEFTSF9UQUJMRV9zdHJ1Y3QgKiB0YWJsZSwgdm9pZCAqIGtleSk7CisgICAgdm9pZCAqCQkJCSgqZ2V0KQkgICAgKHN0cnVjdCBBTlRMUjNfSEFTSF9UQUJMRV9zdHJ1Y3QgKiB0YWJsZSwgdm9pZCAqIGtleSk7CisgICAgQU5UTFIzX0lOVDMyCQkoKnB1dCkJICAgIChzdHJ1Y3QgQU5UTFIzX0hBU0hfVEFCTEVfc3RydWN0ICogdGFibGUsIHZvaWQgKiBrZXksIHZvaWQgKiBlbGVtZW50LCB2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVwdHIpKHZvaWQgKikpOworCisgICAgLyogSW50ZWdlciBiYXNlZCBoYXNoIGZ1bmN0aW9ucyAqLworICAgIHZvaWQJCQkJKCpkZWxJKQkgICAgKHN0cnVjdCBBTlRMUjNfSEFTSF9UQUJMRV9zdHJ1Y3QgKiB0YWJsZSwgQU5UTFIzX0lOVEtFWSBrZXkpOworICAgIHBBTlRMUjNfSEFTSF9FTlRSWQkoKnJlbW92ZUkpICAoc3RydWN0IEFOVExSM19IQVNIX1RBQkxFX3N0cnVjdCAqIHRhYmxlLCBBTlRMUjNfSU5US0VZIGtleSk7CisgICAgdm9pZCAqCQkJCSgqZ2V0SSkJICAgIChzdHJ1Y3QgQU5UTFIzX0hBU0hfVEFCTEVfc3RydWN0ICogdGFibGUsIEFOVExSM19JTlRLRVkga2V5KTsKKyAgICBBTlRMUjNfSU5UMzIJCSgqcHV0SSkJICAgIChzdHJ1Y3QgQU5UTFIzX0hBU0hfVEFCTEVfc3RydWN0ICogdGFibGUsIEFOVExSM19JTlRLRVkga2V5LCB2b2lkICogZWxlbWVudCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKTsKKworICAgIEFOVExSM19VSU5UMzIJCSgqc2l6ZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0hBU0hfVEFCTEVfc3RydWN0ICogdGFibGUpOworfQorICAgIEFOVExSM19IQVNIX1RBQkxFOworCisKKy8qKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGFuIGVudW1lcmF0aW9uIG9mIGEgdGFibGUuCisgKiAgVGhpcyBpcyByZXR1cm5lZCBieSBhbnRscjNFbnVtZXJhdGlvbigpCisgKiAgQWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvIHRyYXZlcnNlIHRoZSB0YWJsZSBpbiBoYXNoIG9yZGVyIHdpdGhvdXQgCisgKiAga25vd2luZyB3aGF0IGlzIGluIHRoZSBhY3R1YWwgdGFibGUuCisgKgorICogIE5vdGUgdGhhdCBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHRoZSB0YWJsZQorICogIHN0cnVjdHVyZSBkb2VzIG5vdCBjaGFuZ2UgaW4gdGhlIGhhc2ggYnVja2V0IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisgKiAgZW51bWVyYXRlZCBhcyB0aGlzIHN0cnVjdHVyZSBqdXN0IHRyYWNrcyB0aGUgbmV4dCBwb2ludGVycyBpbiB0aGUKKyAqICBidWNrZXQgc2VyaWVzLgorICovCit0eXBlZGVmIHN0cnVjdAlBTlRMUjNfSEFTSF9FTlVNX3N0cnVjdAoreworICAgIC8qIFBvaW50ZXIgdG8gdGhlIHRhYmxlIHdlIGFyZSBlbnVtZXJhdGluZworICAgICAqLworICAgIHBBTlRMUjNfSEFTSF9UQUJMRQl0YWJsZTsKKworICAgIC8qIEJ1Y2tldCB3ZSBhcmUgY3VycmVudGx5IGVudW1lcmF0aW5nIChpZiBOVUxMIHRoZW4gd2UgYXJlIGRvbmUpCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMglidWNrZXQ7CisKKyAgICAvKiBOZXh0IGVudHJ5IHRvIHJldHVybiwgaWYgTlVMTCwgdGhlbiBtb3ZlIHRvIG5leHQgYnVja2V0IGlmIGFueQorICAgICAqLworICAgIHBBTlRMUjNfSEFTSF9FTlRSWQllbnRyeTsKKworICAgIC8qIEludGVyZmFjZQorICAgICAqLworICAgIGludAkJKCpuZXh0KQkgICAgKHN0cnVjdCBBTlRMUjNfSEFTSF9FTlVNX3N0cnVjdCAqIGVuLCBwQU5UTFIzX0hBU0hfS0VZICprZXksIHZvaWQgKiogZGF0YSk7CisgICAgdm9pZAkoKmZyZWUpCSAgICAoc3RydWN0IEFOVExSM19IQVNIX0VOVU1fc3RydWN0ICogdGFibGUpOworfQorICAgIEFOVExSM19IQVNIX0VOVU07CisKKy8qKiBTdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgTElTVCBjb2xsZWN0aW9uCisgKi8KK3R5cGVkZWYJc3RydWN0CUFOVExSM19MSVNUX3N0cnVjdAoreworICAgIC8qKiBIYXNoIHRhYmxlIHRoYXQgaXMgc3RvcmluZyB0aGUgbGlzdCBlbGVtZW50cworICAgICAqLworICAgIHBBTlRMUjNfSEFTSF9UQUJMRQl0YWJsZTsKKworICAgIHZvaWQJCQkoKmZyZWUpCQkoc3RydWN0IEFOVExSM19MSVNUX3N0cnVjdCAqIGxpc3QpOworICAgIHZvaWQJCQkoKmRlbCkJCShzdHJ1Y3QgQU5UTFIzX0xJU1Rfc3RydWN0ICogbGlzdCwgQU5UTFIzX0lOVEtFWSBrZXkpOworICAgIHZvaWQgKgkJCSgqZ2V0KQkJKHN0cnVjdCBBTlRMUjNfTElTVF9zdHJ1Y3QgKiBsaXN0LCBBTlRMUjNfSU5US0VZIGtleSk7CisgICAgdm9pZCAqCQkJKCpyZW1vdmUpCShzdHJ1Y3QgQU5UTFIzX0xJU1Rfc3RydWN0ICogbGlzdCwgQU5UTFIzX0lOVEtFWSBrZXkpOworICAgIEFOVExSM19JTlQzMiAgICAoKmFkZCkJCShzdHJ1Y3QgQU5UTFIzX0xJU1Rfc3RydWN0ICogbGlzdCwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CisgICAgQU5UTFIzX0lOVDMyICAgICgqcHV0KQkJKHN0cnVjdCBBTlRMUjNfTElTVF9zdHJ1Y3QgKiBsaXN0LCBBTlRMUjNfSU5US0VZIGtleSwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CisgICAgQU5UTFIzX1VJTlQzMiAgICgqc2l6ZSkJCShzdHJ1Y3QgQU5UTFIzX0xJU1Rfc3RydWN0ICogbGlzdCk7CisgICAgCit9CisgICAgQU5UTFIzX0xJU1Q7CisKKy8qKiBTdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgU3RhY2sgY29sbGVjdGlvbgorICovCit0eXBlZGVmCXN0cnVjdAlBTlRMUjNfU1RBQ0tfc3RydWN0Cit7CisgICAgLyoqIExpc3QgdGhhdCBzdXBwb3J0cyB0aGUgc3RhY2sgc3RydWN0dXJlCisgICAgICovCisgICAgcEFOVExSM19WRUNUT1IgIHZlY3RvcjsKKworICAgIC8qKiBVc2VkIGZvciBxdWljayBhY2Nlc3MgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICB2b2lkICoJICAgIHRvcDsKKyAgICB2b2lkCQkJKCpmcmVlKQkoc3RydWN0IEFOVExSM19TVEFDS19zdHJ1Y3QgKiBzdGFjayk7CisgICAgdm9pZCAqCQkJKCpwb3ApCShzdHJ1Y3QgQU5UTFIzX1NUQUNLX3N0cnVjdCAqIHN0YWNrKTsKKyAgICB2b2lkICoJCQkoKmdldCkJKHN0cnVjdCBBTlRMUjNfU1RBQ0tfc3RydWN0ICogc3RhY2ssIEFOVExSM19JTlRLRVkga2V5KTsKKyAgICBBTlRMUjNfQk9PTEVBTiAgKCpwdXNoKQkoc3RydWN0IEFOVExSM19TVEFDS19zdHJ1Y3QgKiBzdGFjaywgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CisgICAgQU5UTFIzX1VJTlQzMiAgICgqc2l6ZSkJKHN0cnVjdCBBTlRMUjNfU1RBQ0tfc3RydWN0ICogc3RhY2spOworICAgIHZvaWQgKgkJCSgqcGVlaykJKHN0cnVjdCBBTlRMUjNfU1RBQ0tfc3RydWN0ICogc3RhY2spOworCit9CisgICAgQU5UTFIzX1NUQUNLOworCisvKiBTdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgdmVjdG9yIGVsZW1lbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9FTEVNRU5UX3N0cnVjdAoreworICAgIHZvaWQgICAgKiBlbGVtZW50OworICAgIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKTsKK30KKyAgICBBTlRMUjNfVkVDVE9SX0VMRU1FTlQsICpwQU5UTFIzX1ZFQ1RPUl9FTEVNRU5UOworCisjZGVmaW5lIEFOVExSM19WRUNUT1JfSU5URVJOQUxfU0laRSAgICAgMTYKKy8qIFN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSB2ZWN0b3IgY29sbGVjdGlvbi4gQSB2ZWN0b3IgaXMgYSBzaW1wbGUgbGlzdAorICogdGhhdCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgYW5kIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQKKyAqIHRoYXQgY2FuIGZyZWUgdGhlIGVsZW1lbnQgaWYgaXQgaXMgcmVtb3ZlZC4gSXQgYXV0byByZXNpemVzIGJ1dCBkb2VzIG5vdAorICogdXNlIGhhc2ggdGVjaG5pcXVlcyBhcyBpdCBpcyByZWZlcmVuY2VkIGJ5IGEgc2ltcGxlIG51bWVyaWMgaW5kZXguIEl0IGlzIG5vdCBhIAorICogc3BhcnNlIGxpc3QsIHNvIGlmIGFueSBlbGVtZW50IGlzIGRlbGV0ZWQsIHRoZW4gdGhlIG9uZXMgZm9sbG93aW5nIGFyZSBtb3ZlZAorICogZG93biBpbiBtZW1vcnkgYW5kIHRoZSBjb3VudCBpcyBhZGp1c3RlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9zdHJ1Y3QKK3sKKyAgICAvKiogQXJyYXkgb2YgcG9pbnRlcnMgdG8gdmVjdG9yIGVsZW1lbnRzCisgICAgICovCisgICAgcEFOVExSM19WRUNUT1JfRUxFTUVOVCAgZWxlbWVudHM7CisKKyAgICAvKiogTnVtYmVyIG9mIGVudHJpZXMgY3VycmVudGx5IGluIHRoZSBsaXN0OworICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICBjb3VudDsKKworICAgIC8qKiBNYW55IHRpbWVzLCBhIHZlY3RvciBob2xkcyBqdXN0IGEgZmV3IG5vZGVzIGluIGFuIEFTVCBhbmQgaXQKKyAgICAgKiBpcyB0b28gbXVjaCBvdmVyaGVhZCB0byBtYWxsb2MgdGhlIHNwYWNlIGZvciBlbGVtZW50cyBzbworICAgICAqIGF0IHRoZSBleHBlbnNlIG9mIGEgZmV3IGJ5dGVzIG9mIG1lbW9yeSwgd2UgaG9sZCB0aGUgZmlyc3QKKyAgICAgKiBmZXcgZWxlbWVudHMgaW50ZXJuYWxseS4gSXQgbWVhbnMgd2UgbXVzdCBjb3B5IHRoZW0gd2hlbgorICAgICAqIHdlIGdyb3cgYmV5b25kIHRoaXMgaW5pdGlhbCBzaXplLCBidXQgdGhhdCBpcyBsZXNzIG92ZXJoZWFkIHRoYW4KKyAgICAgKiB0aGUgbWFsbG9jL2ZyZWUgY2FsbGFzIHdlIHdvdWxkIG90aGVyd2lzZSByZXF1aXJlLgorICAgICAqLworICAgIEFOVExSM19WRUNUT1JfRUxFTUVOVCAgIGludGVybmFsW0FOVExSM19WRUNUT1JfSU5URVJOQUxfU0laRV07CisKKyAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBzdHJ1Y3R1cmUgd2FzIG1hZGUgYnkgYSBmYWN0b3J5LCBpbiB3aGljaAorICAgICAqICBjYXNlIG9ubHkgdGhlIGZhY3RvcnkgY2FuIGZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIGFjdHVhbCB2ZWN0b3IsCisgICAgICogIHRob3VnaCB0aGUgdmVjdG9yIGZyZWUgZnVuY3Rpb24gaXMgY2FsbGVkIGFuZCB3aWxsIHJlY3Vyc2UgdGhyb3VnaCBpdHMKKyAgICAgKiAgZW50cmllcyBjYWxsaW5nIGFueSBmcmVlIHBvaW50ZXJzIGZvciBlYWNoIGVudHJ5LgorICAgICAqLworICAgIEFOVExSM19CT09MRUFOICBmYWN0b3J5TWFkZTsKKworICAgIC8qKiBUb3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBlbGVtZW50cyBhdCBhbnkgcG9pbnQgaW4gdGltZQorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICBlbGVtZW50c1NpemU7CisKKyAgICB2b2lkCQkJKEFOVExSM19DREVDTCAqZnJlZSkJKHN0cnVjdCBBTlRMUjNfVkVDVE9SX3N0cnVjdCAqIHZlY3Rvcik7CisgICAgdm9pZAkJCSgqZGVsKQkJCQkJKHN0cnVjdCBBTlRMUjNfVkVDVE9SX3N0cnVjdCAqIHZlY3RvciwgQU5UTFIzX1VJTlQzMiBlbnRyeSk7CisgICAgdm9pZCAqCQkJKCpnZXQpCQkJCQkoc3RydWN0IEFOVExSM19WRUNUT1Jfc3RydWN0ICogdmVjdG9yLCBBTlRMUjNfVUlOVDMyIGVudHJ5KTsKKyAgICB2b2lkICoJCQkoKnJlbW92ZSkJCQkJKHN0cnVjdCBBTlRMUjNfVkVDVE9SX3N0cnVjdCAqIHZlY3RvciwgQU5UTFIzX1VJTlQzMiBlbnRyeSk7CisgICAgdm9pZAkJCSgqY2xlYXIpCQkJCShzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9zdHJ1Y3QgKiB2ZWN0b3IpOworICAgIEFOVExSM19CT09MRUFOICAgICAgICAgICAgICAoKnN3YXApICAgICAgICAgICAgICAgICAoc3RydWN0IEFOVExSM19WRUNUT1Jfc3RydWN0ICosIEFOVExSM19VSU5UMzIgZW50cnkxLCBBTlRMUjNfVUlOVDMyIGVudHJ5Mik7CisgICAgQU5UTFIzX1VJTlQzMiAgICgqYWRkKQkJCQkJKHN0cnVjdCBBTlRMUjNfVkVDVE9SX3N0cnVjdCAqIHZlY3Rvciwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CisgICAgQU5UTFIzX1VJTlQzMiAgICgqc2V0KQkJCQkJKHN0cnVjdCBBTlRMUjNfVkVDVE9SX3N0cnVjdCAqIHZlY3RvciwgQU5UTFIzX1VJTlQzMiBlbnRyeSwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSwgQU5UTFIzX0JPT0xFQU4gZnJlZUV4aXN0aW5nKTsKKyAgICBBTlRMUjNfVUlOVDMyICAgKCpzaXplKQkJCQkJKHN0cnVjdCBBTlRMUjNfVkVDVE9SX3N0cnVjdCAqIHZlY3Rvcik7Cit9CisgICAgQU5UTFIzX1ZFQ1RPUjsKKworLyoqIERlZmF1bHQgdmVjdG9yIHBvb2wgc2l6ZSBpZiBvdGhlcndpc2UgdW5zcGVjaWZpZWQKKyAqLworI2RlZmluZSBBTlRMUjNfRkFDVE9SWV9WUE9PTF9TSVpFIDI1NgorCisvKiogU3RydWN0dXJlIHRoYXQgdHJhY2tzIHZlY3RvcnMgaW4gYSB2ZWN0b3IgYW5kIGF1dG8gZGVsZXRlcyB0aGUgdmVjdG9ycworICogIGluIHRoZSB2ZWN0b3IgZmFjdG9yeSB3aGVuIGNsb3NlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZX3N0cnVjdAoreworCisgICAgICAgIC8qKiBMaXN0IG9mIGFsbCB2ZWN0b3IgcG9vbHMgYWxsb2NhdGVkIHNvIGZhcgorICAgICAgICAgKi8KKyAgICAgICAgcEFOVExSM19WRUNUT1IgICAgICAqcG9vbHM7CisKKyAgICAgICAgLyoqIENvdW50IG9mIHRoZSB2ZWN0b3IgcG9vbHMgYWxsb2NhdGVkIHNvIGZhciAoY3VycmVudCBhY3RpdmUgcG9vbCkKKyAgICAgICAgICovCisgICAgICAgIEFOVExSM19JTlQzMiAgICAgICAgIHRoaXNQb29sOworCisgICAgICAgIC8qKiBUaGUgbmV4dCB2ZWN0b3IgYXZhaWxhYmxlIGluIHRoZSBwb29sCisgICAgICAgICAqLworICAgICAgICBBTlRMUjNfVUlOVDMyICAgICAgICBuZXh0VmVjdG9yOworCisgICAgICAgIC8qKiBUcmljayB0byBxdWlja2x5IGluaXRpYWxpemUgYSBuZXcgdmVjdG9yIHZpYSBtZW1jcHkgYW5kIG5vdCBhIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICovCisgICAgICAgIEFOVExSM19WRUNUT1IgICAgICAgIHVuVHJ1YzsKKworCQkvKiogQ29uc3VtZXJzIGZyb20gdGhlIGZhY3RvcnkgY2FuIHJlbGVhc2UgYSBmYWN0b3J5IHByb2R1Y2VkIHZlY3RvciAKKwkJICogYmFjayB0byB0aGUgZmFjdG9yeSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgKGFuZCB0aHVzIGNvbnNlcnZlIG1lbW9yeSkKKwkJICogYnkgYW5vdGhlciBjYWxsZXIuIFRoZSBhdmFpbGFibGUgdmVjdG9ycyBhcmUgc3RvcmVkIGhlcmUuIE5vdGUgdGhhdAorCQkgKiB0aGUgb25seSB2ZWN0b3JzIGF2YWlibGUgaW4gdGhlIGZyZWUgY2hhaW4gYXJlIHByb2R1Y2VkIGJ5IHRoaXMgZmFjdG9yeSwgc28gdGhleQorCQkgKiBuZWVkIG5vdCBiZSBleHBsaWNpdGx5IGZyZWVkIHdoZW4gdGhlIGZhY3RvcnkgaXMgY2xvc2VkLgorCQkgKi8KKwkJcEFOVExSM19TVEFDSwkJIGZyZWVTdGFjazsKKworICAgICAgIAkvKiogRnVuY3Rpb24gdG8gY2xvc2UgdGhlIHZlY3RvciBmYWN0b3J5CisJICovCisJdm9pZCAgICAgICAgICAgICAgICAoKmNsb3NlKQkgICAgKHN0cnVjdCBBTlRMUjNfVkVDVE9SX0ZBQ1RPUllfc3RydWN0ICogZmFjdG9yeSk7CisKKwkvKiogRnVuY3Rpb24gdG8gc3VwcGx5IGEgbmV3IHZlY3RvcgorCSAqLworCXBBTlRMUjNfVkVDVE9SICAgICAgKCpuZXdWZWN0b3IpICAgIChzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnkpOworCisJLy8vIEZ1bmN0aW9uIHRvIHJldHVybiBhIHZlY3RvciB0byB0aGUgZmFjdG9yeSBmb3IgcmV1c2UKKwkvLy8KKwl2b2lkCQkJCSgqcmV0dXJuVmVjdG9yKQkoc3RydWN0IEFOVExSM19WRUNUT1JfRkFDVE9SWV9zdHJ1Y3QgKiBmYWN0b3J5LCBwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpOworCit9CitBTlRMUjNfVkVDVE9SX0ZBQ1RPUlk7IAorICAgIAorICAgIAorLyogLS0tLS0tLS0tLS0tLS0gVFJJRSBJbnRlcmZhY2VzIC0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiogU3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHBheWxvYWQgZW50cnkgaW4gYW4gQU5UTFIzX0lOVF9UUklFIG9yIEFOVExSM19TVFJJTkdfVFJJRQorICovCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfVFJJRV9FTlRSWV9zdHJ1Y3QKK3sKKwlBTlRMUjNfVUlOVDMyICAgdHlwZTsKKwl2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVwdHIpKHZvaWQgKik7CisJdW5pb24KKwl7CisJCUFOVExSM19JTlRLRVkgICAgIGludFZhbDsKKwkJdm9pZAkJKiBwdHI7CisJfSBkYXRhOworCisJc3RydWN0IEFOVExSM19UUklFX0VOVFJZX3N0cnVjdAkqIG5leHQ7CSAgICAvKiBBbGxvd3MgZHVwbGljYXRlIGVudHJpZXMgZm9yIHNhbWUga2V5IGluIGluc2VydGlvbiBvcmRlcgkqLworfQorQU5UTFIzX1RSSUVfRU5UUlksICogcEFOVExSM19UUklFX0VOVFJZOworCisKKy8qKiBTdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIGFuIGVsZW1lbnQvbm9kZSBpbiBhbiBBTlRMUjNfSU5UX1RSSUUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0lOVF9UUklFX05PREVfc3RydWN0Cit7CisgICAgQU5UTFIzX1VJTlQzMgkJCQkJCQkgIGJpdE51bTsJLyoqPCBUaGlzIGlzIHRoZSBsZWZ0L3JpZ2h0IGJpdCBpbmRleCBmb3IgdHJhdmVyc2FsIGFsb25nIHRoZSBub2RlcwkJCQkqLworICAgIEFOVExSM19JTlRLRVkJCQkJCQkJICBrZXk7CQkvKio8IFRoaXMgaXMgdGhlIGFjdHVhbCBrZXkgdGhhdCB0aGUgZW50cnkgcmVwcmVzZW50cyBpZiBpdCBpcyBhIHRlcm1pbmFsIG5vZGUgICovCisgICAgcEFOVExSM19UUklFX0VOVFJZCQkJCQkJICBidWNrZXRzOwkvKio8IFRoaXMgaXMgdGhlIGRhdGEgYnVja2V0KHMpIHRoYXQgdGhlIGtleSBpbmRleGVzLCB3aGljaCBtYXkgYmUgTlVMTAkJCSovCisgICAgc3RydWN0IEFOVExSM19JTlRfVFJJRV9OT0RFX3N0cnVjdAkgICAgKiBsZWZ0TjsJLyoqPCBQb2ludGVyIHRvIHRoZSBsZWZ0IG5vZGUgZnJvbSBoZXJlIHdoZW4gc0tleSAmIGJpdE51bSA9IDAJCQkJCSovCisgICAgc3RydWN0IEFOVExSM19JTlRfVFJJRV9OT0RFX3N0cnVjdAkgICAgKiByaWdodE47CS8qKjwgUG9pbnRlciB0byB0aGUgcmlnaHQgbm9kZSBmcm9tIGhlcmUgd2hlbiBzS2V5ICYgYml0TnVtLCA9IDEJCQkJKi8KK30KKyAgICBBTlRMUjNfSU5UX1RSSUVfTk9ERSwgKiBwQU5UTFIzX0lOVF9UUklFX05PREU7CisKKy8qKiBTdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIGFuIEFOVExSM19JTlRfVFJJRS4gRm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiwKKyAqICBhcyB5b3UgbWlnaHQgZXhwZWN0LCB0aGUga2V5IGlzIHR1cm5lZCBpbnRvIGEgInN0cmluZyIgYnkgbG9va2luZyBhdCBiaXQoa2V5LCBkZXB0aCkKKyAqICBvZiB0aGUgaW50ZWdlciBrZXkuIFVzaW5nIDY0IGJpdCBrZXlzIGdpdmVzIHVzIGEgZGVwdGggbGltaXQgb2YgNjQgKG9yIGJpdCAwLi42MykKKyAqICBhbmQgcG90ZW50aWFsbHkgYSBodWdlIHRyaWUuIFRoaXMgaXMgdGhlIGFsZ29yaXRobSBmb3IgYSBQYXRyaWNpYSBUcmllLgorICogIE5vdGUgYWxzbyB0aGF0IHRoaXMgdHJpZSBbY2FuXSBhY2NlcHQgbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUga2V5IGFuZCBpcworICogIHRoZXJlZm9yZSBhIGtpbmQgb2YgZWxhc3RpYyBidWNrZXQgcGF0cmljaWEgdHJpZS4KKyAqCisgKiAgSWYgeW91IGZpbmQgdGhpcyBjb2RlIHVzZWZ1bCwgcGxlYXNlIGZlZWwgZnJlZSB0byAnc3RlYWwnIGl0IGZvciBhbnkgcHVycG9zZQorICogIGFzIGNvdmVyZWQgYnkgdGhlIEJTRCBsaWNlbnNlIHVuZGVyIHdoaWNoIEFOVExSIGlzIGlzc3VlZC4gWW91IGNhbiBjdXQgdGhlIGNvZGUKKyAqICBidXQgYXMgdGhlIEFOVExSIGxpYnJhcnkgaXMgb25seSBhYm91dCA1MEsgKFdpbmRvd3MgVmlzdGEpLCB5b3UgbWlnaHQgZmluZCBpdCAKKyAqICBlYXNpZXIgdG8ganVzdCBsaW5rIHRoZSBsaWJyYXJ5LiBQbGVhc2Uga2VlcCBhbGwgY29tbWVudHMgYW5kIGxpY2Vuc2VzIGFuZCBzbyBvbgorICogIGluIGFueSB2ZXJzaW9uIG9mIHRoaXMgeW91IGNyZWF0ZSBvZiBjb3Vyc2UuCisgKgorICogIEppbSBJZGxlLgorICogIAorICovCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfSU5UX1RSSUVfc3RydWN0Cit7CisgICAgcEFOVExSM19JTlRfVFJJRV9OT0RFICAgcm9vdDsJCQkvKiBSb290IG5vZGUgb2YgdGhpcyBpbnRlZ2VyIHRyaWUJCQkJCSovCisgICAgcEFOVExSM19JTlRfVFJJRV9OT0RFICAgY3VycmVudDsJCS8qIFVzZWQgdG8gdHJhdmVyc2UgdGhlIFRSSUUgd2l0aCB0aGUgbmV4dCgpIG1ldGhvZAkqLworICAgIEFOVExSM19VSU5UMzIJCQljb3VudDsJCQkvKiBDdXJyZW50IGVudHJ5IGNvdW50CQkJCQkJCQkqLworICAgIEFOVExSM19CT09MRUFOCQkJYWxsb3dEdXBzOwkJLyogV2hldGhlciB0aGlzIHRyaWUgYWNjZXB0cyBkdXBsaWNhdGUga2V5cwkJCSovCisKKyAgICAKKyAgICBwQU5UTFIzX1RSSUVfRU5UUlkJKCpnZXQpCShzdHJ1Y3QgQU5UTFIzX0lOVF9UUklFX3N0cnVjdCAqIHRyaWUsIEFOVExSM19JTlRLRVkga2V5KTsKKyAgICBBTlRMUjNfQk9PTEVBTgkJKCpkZWwpCShzdHJ1Y3QgQU5UTFIzX0lOVF9UUklFX3N0cnVjdCAqIHRyaWUsIEFOVExSM19JTlRLRVkga2V5KTsKKyAgICBBTlRMUjNfQk9PTEVBTgkJKCphZGQpCShzdHJ1Y3QgQU5UTFIzX0lOVF9UUklFX3N0cnVjdCAqIHRyaWUsIEFOVExSM19JTlRLRVkga2V5LCBBTlRMUjNfVUlOVDMyIHR5cGUsIEFOVExSM19JTlRLRVkgaW50VmFsLCB2b2lkICogZGF0YSwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKTsKKyAgICB2b2lkCQkJCSgqZnJlZSkJKHN0cnVjdCBBTlRMUjNfSU5UX1RSSUVfc3RydWN0ICogdHJpZSk7CisKK30KKyAgICBBTlRMUjNfSU5UX1RSSUU7CisKKy8qKgorICogQSB0b3BvbG9naWNhbCBzb3J0IHN5c3RlbSB0aGF0IGdpdmVuIGEgc2V0IG9mIGRlcGVuZGVuY2llcyBvZiBhIG5vZGUgbSBvbiBub2RlIG4sCisgKiBjYW4gc29ydCB0aGVtIGluIGRlcGVuZGVuY3kgb3JkZXIuIFRoaXMgaXMgYSBnZW5lcmFsbHkgdXNlZnVsIHV0aWxpdHkgb2JqZWN0CisgKiB0aGF0IGRvZXMgbm90IGNhcmUgd2hhdCB0aGUgdGhpbmdzIGFyZSBpdCBpcyBzb3J0aW5nLiBHZW5lcmFsbHkgdGhlIHNldAorICogdG8gYmUgc29ydGVkIHdpbGwgYmUgbnVtZXJpYyBpbmRleGVzIGludG8gc29tZSBvdGhlciBzdHJ1Y3R1cmUgc3VjaCBhcyBhbiBBTlRMUjNfVkVDVE9SLgorICogSSBoYXZlIHByb3ZpZGVkIGEgc29ydCBtZXRob2QgdGhhdCBnaXZlbiBBTlRMUjNfVkVDVE9SIGFzIGFuIGlucHV0IHdpbGwgc29ydAorICogdGhlIHZlY3RvciBlbnRyaWVzIGluIHBsYWNlLCBhcyB3ZWxsIGFzIGEgc29ydCBtZXRob2QgdGhhdCBqdXN0IHJldHVybnMgYW4KKyAqIGFycmF5IG9mIHRoZSBzb3J0ZWQgbm9kZWQgaW5kZXhlcywgaW4gY2FzZSB5b3UgYXJlIG5vdCBzb3J0aW5nIEFOVExSM19WRUNUT1JTIGJ1dAorICogc29tZSBzZXQgb2YgeW91ciBvd24gZGV2aWNlLgorICoKKyAqIE9mIHRoZSB0d28gbWFpbiBhbGdvcml0aG1zIHRoYXQgY291bGQgYmUgdXNlZCwgSSBjaG9zZSB0byB1c2UgdGhlIGRlcHRoIGZpcnN0CisgKiBzZWFyY2ggZm9yIHVudmlzaXRlZCBub2RlcyBhcyBhKSBUaGlzIHJ1bnMgaW4gbGluZWFyIHRpbWUsIGFuZCBiKSBpdCBpcyB3aGF0CisgKiB3ZSB1c2VkIGluIHRoZSBBTlRMUiBUb29sIHRvIHBlcmZvcm0gYSB0b3BvbG9naWNhbCBzb3J0IG9mIHRoZSBpbnB1dCBncmFtbWFyIGZpbGVzCisgKiBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19UT1BPX3N0cnVjdAoreworICAgIC8qKgorICAgICAqIEEgdmVjdG9yIG9mIHZlY3RvcnMgb2YgZWRnZXMsIGJ1aWx0IGJ5IGNhbGxpbmcgdGhlIGFkZEVkZ2UgbWV0aG9kKCkKKyAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IG5vZGUgbnVtYmVyIG4gZGVwZW5kcyBvbiBub2RlIG51bWJlciBtLiBFYWNoIGVudHJ5IGluIHRoZSB2ZWN0b3IKKyAgICAgKiBjb250YWlucyBhIGJpdHNldCwgd2hpY2ggaGFzIGEgYml0IGluZGV4IHNldCBmb3IgZWFjaCBub2RlIHVwb24gd2hpY2ggdGhlCisgICAgICogZW50cnkgbm9kZSBkZXBlbmRzLgorICAgICAqLworICAgIHBBTlRMUjNfQklUU0VUICAqIGVkZ2VzOworCisgICAgLyoqCisgICAgICogQSB2ZWN0b3IgdXNlZCB0byBidWlsZCB1cCB0aGUgc29ydGVkIG91dHB1dCBvcmRlci4gTm90ZSB0aGF0CisgICAgICogYXMgdGhlIHZlY3RvciBjb250YWlucyBVSU5UMzIgdGhlbiB0aGUgbWF4aW11bSBub2RlIGluZGV4IGlzCisgICAgICogJ2xpbWl0ZWQnIHRvIDJeMzIsIGFzIG5vZGVzIHNob3VsZCBiZSB6ZXJvIGJhc2VkLgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDMyICAgIHNvcnRlZDsKKworICAgIC8qKgorICAgICAqIEEgdmVjdG9yIHVzZWQgdG8gZGV0ZWN0IGN5Y2xlcyBpbiB0aGUgZWRnZSBkZXBlbmRlY2llcy4gSXQgaXMgdXNlZAorICAgICAqIGFzIGEgc3RhY2sgYW5kIGVhY2ggdGltZSB3ZSBkZXNjZW5kIGEgbm9kZSB0byBvbmUgb2YgaXRzIGVkZ2VzIHdlCisgICAgICogYWRkIHRoZSBub2RlIGludG8gdGhpcyBzdGFjay4gSWYgd2UgZmluZCBhIG5vZGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkKKyAgICAgKiB2aXNpdGVkIGluIHRoZSBzdGFjaywgdGhlbiBpdCBtZWFucyB0aGVyZSB3YXNhIGN5Y2xlIHN1Y2ggYXMgOS0+OC0+MS0+OQorICAgICAqIGFzIHRoZSBvbmx5IHdheSBhIG5vZGUgY2FuIGJlIG9uIHRoZSBzdGFjayBpcyBpZiB3ZSBhcmUgY3VycmVudGx5CisgICAgICogZGVzY25kaW5nIGZyb20gaXQgYXMgd2UgcmVtb3ZlIGl0IGZyb20gdGhlIHN0YWNrIGFzIHdlIGV4aXQgZnJvbQorICAgICAqIGRlc2NlbmRpbmcgaXRzIGRlcGVuZGVuY2llcworICAgICAqLworICAgIHBBTlRMUjNfVUlOVDMyICAgIGN5Y2xlOworCisgICAgLyoqCisgICAgICogQSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBhbGdvcml0aG0gZm91bmQgYSBjeWNsZSBpbiB0aGUgZWRnZXMKKyAgICAgKiBzdWNoIGFzIDktPjgtPjEtPjkKKyAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0IGFmdGVyIHlvdSBoYXZlIGNhbGxlZCBvbmUgb2YgdGhlIHNvcnQgcm91dGluZXMKKyAgICAgKiB0aGVuIHRoZSBkZXRlY3RlZCBjeWNsZSB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUgY3ljbGUgYXJyYXkgYW5kCisgICAgICogY3ljbGVMaW1pdCB3aWxsIHBvaW50IHRvIHRoZSBvbmUgYWZ0ZXIgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGN5Y2xlLgorICAgICAqLworICAgIEFOVExSM19CT09MRUFOICAgIGhhc0N5Y2xlOworCisgICAgLyoqCisgICAgICogQSB3YXRlcm1hcmsgdXNlZCB0byBhY2N1bXVsYXRlIHBvdGVudGlhbCBjeWNsZXMgaW4gdGhlIGN5Y2xlIGFycmF5LgorICAgICAqIFRoaXMgc2hvdWxkIGJlIHplcm8gd2hlbiB3ZSBhcmUgZG9uZS4gQ2hlY2sgaGFzQ3ljbGUgYWZ0ZXIgY2FsbGluZyBvbmUKKyAgICAgKiBvZiB0aGUgc29ydCBtZXRob2RzIGFuZCBpZiBpdCBpcyBBTlRMUjNfVFJVRSB0aGVuIHlvdSBjYW4gZmluZCB0aGUgY3ljbGUKKyAgICAgKiBpbiBjeWNsZVswXS4uLmN5Y2xlW2N5Y2xlTWFyay0xXQorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICAgIGN5Y2xlTWFyazsKKyAgICAKKyAgICAvKioKKyAgICAgKiBPbmUgbW9yZSB0aGFuIHRoZSBsYXJnZXN0IG5vZGUgaW5kZXggdGhhdCBpcyBjb250YWluZWQgaW4gZWRnZXMvc29ydGVkLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICAgIGxpbWl0OworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiB2aXNpdGVkIG5vZGVzIGFzIGRldGVybWluZWQgYnkgYSBzZXQgZW50cnkgaW4KKyAgICAgKiB0aGUgYml0bWFwLgorICAgICAqLworICAgIHBBTlRMUjNfQklUU0VUICAgIHZpc2l0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB0aGF0IGFkZHMgYW4gZWRnZSBmcm9tIG9uZSBub2RlIHRvIGFub3RoZXIuIEFuIGVkZ2UKKyAgICAgKiBvZiBuIC0+IG0gaW5kaWNhdGVzIHRoYXQgbm9kZSBuIGlzIGRlcGVuZGVudCBvbiBub2RlIG0uIE5vdGUgdGhhdAorICAgICAqIHdoaWxlIGJ1aWxkaW5nIHRoZXNlIGVkZ2VzLCBpdCBpcyBwZXJmZWN0bHkgT0sgdG8gYWRkIG5vZGVzIG91dCBvZgorICAgICAqIHNlcXVlbmNlLiBTbywgaWYgeW91IGhhdmUgZWRnZXM6CisgICAgICoKKyAgICAgKiAzIC0+IDAKKyAgICAgKiAyIC0+IDEKKyAgICAgKiAxIC0+IDMKKyAgICAgKgorICAgICAqIFRoZSB5b3UgY2FuIGFkZCB0aGVtIGluIHRoYXQgb3JkZXIgYW5kIHNvIGFkZCBub2RlIDMgYmVmb3JlIG5vZGVzIDIgYW5kIDEKKyAgICAgKgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAoKmFkZEVkZ2UpICAgICAgICAgIChzdHJ1Y3QgQU5UTFIzX1RPUE9fc3RydWN0ICogdG9wbywgQU5UTFIzX1VJTlQzMiBlZGdlLCBBTlRMUjNfVUlOVDMyIGRlcGVuZGVuY3kpOworCisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB0aGF0IHJldHVybnMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNvcnRlZCBub2RlIGluZGV4ZXMuCisgICAgICogVGhlIGFycmF5IGlzIHNvcnRlZCBpbiB0b3BvbG9naWNhbCBzb3J0ZWQgb3JkZXIuIE5vdGUgdGhhdCB0aGUgYXJyYXkKKyAgICAgKiBpcyBvbmx5IGFzIGxhcmdlIGFzIHRoZSBsYXJnZXN0IG5vZGUgaW5kZXggeW91IGNyZWF0ZWQgYW4gZWRnZSBmb3IuIFRoaXMgbWVhbnMKKyAgICAgKiB0aGF0IGlmIHlvdSBoYWQgYW4gaW5wdXQgb2YgMzIgbm9kZXMsIGJ1dCB0aGF0IGxhcmdlc3Qgbm9kZSB3aXRoIGFuIGVkZ2UKKyAgICAgKiB3YXMgMTYsIHRoZW4gdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgdGhlIHNvcnRlZCBvcmRlciBvZiB0aGUgZmlyc3QgMTYKKyAgICAgKiBub2RlcyBhbmQgdGhlIGxhc3QgMTYgbm9kZXMgb2YgeW91ciBhcnJheSBhcmUgYmFzaWNhbGx5IGZpbmUgYXMgdGhleSBhcmUKKyAgICAgKiBhcyB0aGV5IGhhZCBubyBkZXBlbmRlbmNpZXMgYW5kIGRvIG5vdCBuZWVkIGFueSBwYXJ0aWN1bGFyIHNvcnQgb3JkZXIuCisgICAgICoKKyAgICAgKiBOQjogSWYgdGhlIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBhcnJheSBpcyBmcmVlZCwgdGhlbiB0aGUgc29ydGVkCisgICAgICogYXJyYXkgd2lsbCBiZSBmcmVlZCB0b28gc28geW91IHNob3VsZCB1c2UgdGhlIHZhbHVlIG9mIGxpbWl0IHRvCisgICAgICogbWFrZSBhIGxvbmcgdGVybSBjb3B5IG9mIHRoaXMgYXJyYXkgaWYgeW91IGRvIG5vdCB3YW50IHRvIGtlZXAgdGhlIHRvcG8KKyAgICAgKiBzdHJ1Y3R1cmUgYXJvdW5kIGFzIHdlbGwuCisgICAgICovCisgICAgcEFOVExSM19VSU5UMzIgICgqc29ydFRvQXJyYXkpICAgICAgKHN0cnVjdCBBTlRMUjNfVE9QT19zdHJ1Y3QgKiB0b3BvKTsKKworICAgIC8qKiAKKyAgICAgKiBBIG1ldGhvZCB0aGF0IHNvcnRzIHRoZSBzdXBwbGllZCBBTlRMUjNfVkVDVE9SIGluIHBsYWNlIGJhc2VkCisgICAgICogb24gdGhlIHByZXZpb3VzbHkgc3VwcGxpZWQgZWRnZSBkYXRhLgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAoKnNvcnRWZWN0b3IpICAgICAgIChzdHJ1Y3QgQU5UTFIzX1RPUE9fc3RydWN0ICogdG9wbywgcEFOVExSM19WRUNUT1Igdik7CisKKyAgICAvKioKKyAgICAgKiAgQSBtZXRob2QgdG8gZnJlZSB0aGlzIHN0cnVjdHVyZSBhbmQgYW55IGFzc29jaWF0ZWQgbWVtb3J5LgorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAoKmZyZWUpICAgICAgICAgICAgIChzdHJ1Y3QgQU5UTFIzX1RPUE9fc3RydWN0ICogdG9wbyk7Cit9CisgICAgQU5UTFIzX1RPUE87CisgICAgCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29tbW9udG9rZW4uaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNjb21tb250b2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODA2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29tbW9udG9rZW4uaApAQCAtMCwwICsxLDM2NyBAQAorLyoqIFxmaWxlCisgKiBcYnJpZWYgRGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNvbW1vbiB0b2tlbi4KKyAqCisgKiBBbGwgdG9rZW4gc3RyZWFtcyBzaG91bGQgcHJvdmlkZSB0aGVpciB0b2tlbnMgdXNpbmcgYW4gaW5zdGFuY2UKKyAqIG9mIHRoaXMgY29tbW9uIHRva2VuLiBBIGN1c3RvbSBwb2ludGVyIGlzIHByb3ZpZGVkLCB3aGVyIHlvdSBtYXkgYXR0YWNoCisgKiBhIGZ1cnRoZXIgc3RydWN0dXJlIHRvIGVuaGFuY2UgdGhlIGNvbW1vbiB0b2tlbiBpZiB5b3UgZmVlbCB0aGUgbmVlZAorICogdG8gZG8gc28uIFRoZSBDIHJ1bnRpbWUgd2lsbCBhc3N1bWUgdGhhdCBhIHRva2VuIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucworICogb2YgdGhlIGludGVyZmFjZSBmdW5jdGlvbnMsIGJ1dCBhbGwgb2YgdGhlbSBtYXkgYmUgcnBsYWNlZCBieSB5b3VyIG93bgorICogaW1wbGVtZW50YXRpb24gaWYgeW91IHJlcXVpcmUgaXQuCisgKi8KKyNpZm5kZWYJX0FOVExSM19DT01NT05fVE9LRU5fSAorI2RlZmluZQlfQU5UTFIzX0NPTU1PTl9UT0tFTl9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKworLyoqIEhvdyBtYW55IHRva2VucyB0byBhbGxvY2F0ZSBhdCBvbmNlIGluIHRoZSB0b2tlbiBmYWN0b3J5CisgKi8KKyNkZWZpbmUJQU5UTFIzX0ZBQ1RPUllfUE9PTF9TSVpFICAgIDEwMjQKKworLyogQmFzZSB0b2tlbiB0eXBlcywgd2hpY2ggYWxsIGxleGVyL3BhcnNlciB0b2tlbnMgY29tZSBhZnRlciBpbiBzZXF1ZW5jZS4KKyAqLworCisvKiogSW5kaWNhdG9yIG9mIGFuIGludmFsaWQgdG9rZW4KKyAqLworI2RlZmluZQlBTlRMUjNfVE9LRU5fSU5WQUxJRAkwCisKKyNkZWZpbmUJQU5UTFIzX0VPUl9UT0tFTl9UWVBFCTEKKworLyoqIEltYWdpbmFyeSB0b2tlbiB0eXBlIHRvIGNhdXNlIGEgdHJhdmVyc2FsIG9mIGNoaWxkIG5vZGVzIGluIGEgdHJlZSBwYXJzZXIKKyAqLworI2RlZmluZQlBTlRMUjNfVE9LRU5fRE9XTgkJMgorCisvKiogSW1hZ2luYXJ5IHRva2VuIHR5cGUgdG8gc2lnbmFsIHRoZSBlbmQgb2YgYSBzdHJlYW0gb2YgY2hpbGQgbm9kZXMuCisgKi8KKyNkZWZpbmUJQU5UTFIzX1RPS0VOX1VQCQkzCisKKy8qKiBGaXJzdCB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHVzZXJzL2dlbmVyYXRlZCBjb2RlCisgKi8KKworI2RlZmluZQlBTlRMUjNfTUlOX1RPS0VOX1RZUEUJQU5UTFIzX1RPS0VOX1VQICsgMQorCisvKiogRW5kIG9mIGZpbGUgdG9rZW4KKyAqLworI2RlZmluZQlBTlRMUjNfVE9LRU5fRU9GCShBTlRMUjNfQ0hBUlNUUkVBTV9FT0YgJiAweEZGRkZGRkZGKQorCisvKiogRGVmYXVsdCBjaGFubmVsIGZvciBhIHRva2VuCisgKi8KKyNkZWZpbmUJQU5UTFIzX1RPS0VOX0RFRkFVTFRfQ0hBTk5FTAkwCisKKy8qKiBSZXNlcnZlZCBjaGFubmVsIG51bWJlciBmb3IgYSBISURERU4gdG9rZW4gLSBhIHRva2VuIHRoYXQKKyAqICBpcyBoaWRkZW4gZnJvbSB0aGUgcGFyc2VyLgorICovCisjZGVmaW5lCUhJRERFTgkJCQk5OQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdG9rZW4gaXMgY2Fycnlpbmc6CisvLworLy8gU3RhdGUgfCBNZWFuaW5nCisvLyAtLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAwIHwgTm90aGluZyAobmVpdGhlciByZXdyaXRlIHRleHQsIG5vciBzZXRUZXh0KQorLy8gICAgIDEgfCBjaGFyICogdG8gdXNlciBzdXBwbGllZCByZXdyaXRlIHRleHQKKy8vICAgICAyIHwgcEFOVExSM19TVFJJTkcgYmVjYXVzZSBvZiBzZXRUZXh0IG9yIHNpbWlsYXIgYWN0aW9uCisvLworI2RlZmluZQlBTlRMUjNfVEVYVF9OT05FCTAKKyNkZWZpbmUJQU5UTFIzX1RFWFRfQ0hBUlAJMQorI2RlZmluZQlBTlRMUjNfVEVYVF9TVFJJTkcJMgorCisvKiogVGhlIGRlZmluaXRpb24gb2YgYW4gQU5UTFIzIGNvbW1vbiB0b2tlbiBzdHJ1Y3R1cmUsIHdoaWNoIGFsbCBpbXBsZW1lbnRhdGlvbnMKKyAqIG9mIGEgdG9rZW4gc3RyZWFtIHNob3VsZCBwcm92aWRlLCBpbnN0YWxsaW5nIGFueSBmdXJ0aGVyIHN0cnVjdHVyZXMgaW4gdGhlCisgKiBjdXN0b20gcG9pbnRlciBlbGVtZW50IG9mIHRoaXMgc3RydWN0dXJlLgorICoKKyAqIFxyZW1hcmsKKyAqIFRva2VuIHN0cmVhbXMgYXJlIGluIGVzc2VuY2UgcHJvdmlkZWQgYnkgbGV4ZXJzIG9yIG90aGVyIHByb2dyYW1zIHRoYXQgc2VydmUKKyAqIGFzIGxleGVycy4KKyAqLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QKK3sKKyAgICAvKiogVGhlIGFjdHVhbCB0eXBlIG9mIHRoaXMgdG9rZW4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgdHlwZTsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhhdCBhIHRva2VuIHdhcyBwcm9kdWNlZCBmcm9tIHRoZSB0b2tlbiBmYWN0b3J5IGFuZCB0aGVyZWZvcmUKKyAgICAgKiAgdGhlIHRoZSBmcmVlVG9rZW4oKSBtZXRob2Qgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyBpdHNlbGYgYmVjYXVzZQorICAgICAqICB0b2tlbiBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyBpdC4KKyAgICAgKi8KKyAgICBBTlRMUjNfQk9PTEVBTiAgZmFjdG9yeU1hZGU7CisKKwkvLy8gQSBzdHJpbmcgZmFjdG9yeSB0aGF0IHdlIGNhbiB1c2UgaWYgd2UgZXZlciBuZWVkIHRoZSB0ZXh0IG9mIGEgdG9rZW4KKwkvLy8gYW5kIG5lZWQgdG8gbWFudWZhY3R1cmUgYSBwQU5UTFIzX1NUUklORworCS8vLworCXBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkJc3RyRmFjdG9yeTsKKworICAgIC8qKiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGlucHV0IHN0cmVhbSB3aGVyZSB0aGlzIHRva2VuIHdhcyBkZXJpdmVkIGZyb20KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgbGluZTsKKworICAgIC8qKiBUaGUgb2Zmc2V0IGludG8gdGhlIGlucHV0IHN0cmVhbSB0aGF0IHRoZSBsaW5lIGluIHdoaWNoIHRoaXMKKyAgICAgKiAgdG9rZW4gcmVzaWRlcyBzdGFydHMuCisgICAgICovCisgICAgdm9pZAkgICAgKiBsaW5lU3RhcnQ7CisKKyAgICAvKiogVGhlIGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgbGluZSB0aGF0IHRoaXMgdG9rZW4gd2FzIGRlcml2ZWQgZnJvbQorICAgICAqLworICAgIEFOVExSM19JTlQzMiAgICBjaGFyUG9zaXRpb247CisKKyAgICAvKiogVGhlIHZpcnR1YWwgY2hhbm5lbCB0aGF0IHRoaXMgdG9rZW4gZXhpc3RzIGluLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICBjaGFubmVsOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIGlucHV0IHN0cmVhbSB0aGF0IHRoaXMgdG9rZW4gb3JpZ2luYXRlZCBpbi4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dDsKKworICAgIC8qKiBXaGF0IHRoZSBpbmRleCBvZiB0aGlzIHRva2VuIGlzLCAwLCAxLCAuLiwgbi0yLCBuLTEgdG9rZW5zCisgICAgICovCisgICAgQU5UTFIzX01BUktFUiAgIGluZGV4OworCisgICAgLyoqIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGluIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4KKyAgICAgKiAgc3RhcnRzLgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKworICAgIC8qKiBUaGUgY2hhcmFjdGVyIG9mZnNldCBpbiB0aGUgaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSB0ZXh0IGZvciB0aGlzIHRva2VuCisgICAgICogIHN0b3BzLgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIgICBzdG9wOworCisJLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdG9rZW4gaXMgY2Fycnlpbmc6CisJLy8vCisJLy8vIFN0YXRlIHwgTWVhbmluZworCS8vLyAtLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLy8gICAgIDAgfCBOb3RoaW5nIChuZWl0aGVyIHJld3JpdGUgdGV4dCwgbm9yIHNldFRleHQpCisJLy8vICAgICAxIHwgY2hhciAqIHRvIHVzZXIgc3VwcGxpZWQgcmV3cml0ZSB0ZXh0CisJLy8vICAgICAyIHwgcEFOVExSM19TVFJJTkcgYmVjYXVzZSBvZiBzZXRUZXh0IG9yIHNpbWlsYXIgYWN0aW9uCisJLy8vCisJLy8vIEFmZmVjdHMgdGhlIHVuaW9uIHN0cnVjdHVyZSB0b2tUZXh0IGJlbG93CisJLy8vICh1c2VzIDMyIGJpdCBzbyBhbGlnbm1lbnQgaXMgYWx3YXlzIGdvb2QpCisJLy8vCisJQU5UTFIzX1VJTlQzMgl0ZXh0U3RhdGU7CisKKwl1bmlvbgorCXsKKwkJLy8vIFBvaW50ZXIgdGhhdCBpcyB1c2VkIHdoZW4gdGhlIHRva2VuIGp1c3QgaGFzIGEgcG9pbnRlciB0bworCQkvLy8gYSBjaGFyICosIHN1Y2ggYXMgd2hlbiBhIHJld3JpdGUgb2YgYW4gaW1hZ2luYXJ5IHRva2VuIHN1cHBsaWVzCisJCS8vLyBhIHN0cmluZyBpbiB0aGUgZ3JhbW1hci4gTm8gc2Vuc2UgaW4gY29uc3RydWN0aW5nIGEgcEFOVExSM19TVFJJTkcganVzdAorCQkvLy8gZm9yIHRoYXQsIGFzIG1vc3RseSB0aGUgdGV4dCB3aWxsIG5vdCBiZSBhY2Nlc3NlZCAtIGlmIGl0IGlzLCB0aGVuCisJCS8vLyB3ZSB3aWxsIGJ1aWxkIGEgcEFOVExSM19TVFJJTkcgZm9yIGl0IGEgdGhhdCBwb2ludC4KKwkJLy8vCisJCXBBTlRMUjNfVUNIQVIJY2hhcnM7CisKKwkJLy8vIFNvbWUgdG9rZW4gdHlwZXMgYWN0dWFsbHkgZG8gY2FycnkgYXJvdW5kIHRoZWlyIGFzc29jaWF0ZWQgdGV4dCwgaGVuY2UKKwkJLy8vICgqZ2V0VGV4dCkoKSB3aWxsIHJldHVybiB0aGlzIHBvaW50ZXIgaWYgaXQgaXMgbm90IE5VTEwKKwkJLy8vCisJCXBBTlRMUjNfU1RSSU5HCXRleHQ7CisJfQorCQl0b2tUZXh0OworCisgICAgLyoqICBCZWNhdXNlIGl0IGlzIGEgYml0IG1vcmUgb2YgYSBoYXNzbGUgdG8gb3ZlcnJpZGUgYW4gQU5UTFIzX0NPTU1PTl9UT0tFTgorICAgICAqICAgYXMgdGhlIHN0YW5kYXJkIHN0cnVjdHVyZSBmb3IgYSB0b2tlbiwgYSBudW1iZXIgb2YgdXNlciBwcm9ncmFtbWFibGUgCisgICAgICoJIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGEgdG9rZW4uIFRoaXMgaXMgb25lIG9mIHRoZW0uCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMiAgIHVzZXIxOworICAgIAorICAgIC8qKiAgQmVjYXVzZSBpdCBpcyBhIGJpdCBtb3JlIG9mIGEgaGFzc2xlIHRvIG92ZXJyaWRlIGFuIEFOVExSM19DT01NT05fVE9LRU4KKyAgICAgKiAgIGFzIHRoZSBzdGFuZGFyZCBzdHJ1Y3R1cmUgZm9yIGEgdG9rZW4sIGEgbnVtYmVyIG9mIHVzZXIgcHJvZ3JhbW1hYmxlIAorICAgICAqCSBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhIHRva2VuLiBUaGlzIGlzIG9uZSBvZiB0aGVtLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICB1c2VyMjsKKworICAgIC8qKiAgQmVjYXVzZSBpdCBpcyBhIGJpdCBtb3JlIG9mIGEgaGFzc2xlIHRvIG92ZXJyaWRlIGFuIEFOVExSM19DT01NT05fVE9LRU4KKyAgICAgKiAgIGFzIHRoZSBzdGFuZGFyZCBzdHJ1Y3R1cmUgZm9yIGEgdG9rZW4sIGEgbnVtYmVyIG9mIHVzZXIgcHJvZ3JhbW1hYmxlIAorICAgICAqCSBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhIHRva2VuLiBUaGlzIGlzIG9uZSBvZiB0aGVtLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICB1c2VyMzsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgY3VzdG9tIGVsZW1lbnQgdGhhdCB0aGUgQU5UTFIzIHByb2dyYW1tZXIgbWF5IGRlZmluZSBhbmQgaW5zdGFsbAorICAgICAqLworICAgIHZvaWQgICAgKiBjdXN0b207CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIGZyZWUgdGhlIGN1c3RvbSBzdHJ1Y3R1cmUgd2hlbiB0aGUgCisgICAgICogIHRva2VuIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICB2b2lkICAgICgqZnJlZUN1c3RvbSkodm9pZCAqIGN1c3RvbSk7CisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBBUEkgCisgICAgICovCisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHRleHQgcG9pbnRlciBvZiBhIHRva2VuLCB1c2UKKyAgICAgKiAgdG9TdHJpbmcoKSBpZiB5b3Ugd2FudCBhIHBBTlRMUjNfU1RSSU5HIHZlcnNpb24gb2YgdGhlIHRva2VuLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HICAoKmdldFRleHQpKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdCAqIHRva2VuKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCAnbWlnaHQnIGJlIGFibGUgdG8gc2V0IHRoZSB0ZXh0IGFzc29jaWF0ZWQKKyAgICAgKiAgd2l0aCBhIHRva2VuLiBJbWFnaW5hcnkgdG9rZW5zIHN1Y2ggYXMgYW4gQU5UTFIzX0NMQVNTSUNfVE9LRU4gbWF5IGFjdHVhbGx5CisgICAgICogIGRvIHRoaXMsIGhvd2V2ZXIgbWFueSB0b2tlbnMgc3VjaCBhcyBBTlRMUjNfQ09NTU9OX1RPS0VOIGRvIG5vdCBhY3RhdWxseSBoYXZlCisgICAgICogIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0gYnV0IGp1c3QgcG9pbnQgaW50byB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0uIFRoZXNlCisgICAgICogIHRva2VucyB3aWxsIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBmdW5jdGlvbiB0aGF0IGVycm9ycyBvdXQgKHByb2JhYmx5CisgICAgICogIGRyYXN0aWNhbGx5LgorICAgICAqLworICAgIHZvaWQJICAgICgqc2V0VGV4dCkoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fc3RydWN0ICogdG9rZW4sIHBBTlRMUjNfU1RSSU5HIHRleHQpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0ICdtaWdodCcgYmUgYWJsZSB0byBzZXQgdGhlIHRleHQgYXNzb2NpYXRlZAorICAgICAqICB3aXRoIGEgdG9rZW4uIEltYWdpbmFyeSB0b2tlbnMgc3VjaCBhcyBhbiBBTlRMUjNfQ0xBU1NJQ19UT0tFTiBtYXkgYWN0dWFsbHkKKyAgICAgKiAgZG8gdGhpcywgaG93ZXZlciBtYW55IHRva2VucyBzdWNoIGFzIEFOVExSM19DT01NT05fVE9LRU4gZG8gbm90IGFjdHVsbHkgaGF2ZQorICAgICAqICBzdHJpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGVtIGJ1dCBqdXN0IHBvaW50IGludG8gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiBUaGVzZQorICAgICAqICB0b2tlbnMgd2lsbCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB3aXRoIGEgZnVuY3Rpb24gdGhhdCBlcnJvcnMgb3V0IChwcm9iYWJseQorICAgICAqICBkcmFzdGljYWxseS4KKyAgICAgKi8KKyAgICB2b2lkCSAgICAoKnNldFRleHQ4KShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QgKiB0b2tlbiwgcEFOVExSM19VSU5UOCB0ZXh0KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB0b2tlbiB0eXBlIG9mIHRoaXMgdG9rZW4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgKCpnZXRUeXBlKShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QgKiB0b2tlbik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgc2V0cyB0aGUgdHlwZSBvZiB0aGlzIHRva2VuCisgICAgICovCisgICAgdm9pZAkgICAgKCpzZXRUeXBlKShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QgKiB0b2tlbiwgQU5UTFIzX1VJTlQzMiB0dHlwZSk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgJ2xpbmUnIG51bWJlciB3aGVyZSB0aGlzIHRva2VuIHJlc2lkZXMKKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgKCpnZXRMaW5lKShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QgKiB0b2tlbik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgc2V0cyB0aGUgJ2xpbmUnIG51bWJlciB3aGVyZSB0aGlzIHRva2VuIHJlc2lkZQorICAgICAqLworICAgIHZvaWQJICAgICgqc2V0TGluZSkoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fc3RydWN0ICogdG9rZW4sIEFOVExSM19VSU5UMzIgbGluZSk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgb2Zmc2V0IGluIHRoZSBsaW5lIHdoZXJlIHRoaXMgdG9rZW4gZXhpc3RzCisgICAgICovIAorICAgIEFOVExSM19JTlQzMiAgICAoKmdldENoYXJQb3NpdGlvbkluTGluZSkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdCAqIHRva2VuKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUgd2hlcmUgdGhpcyB0b2tlbiBleGlzdHMKKyAgICAgKi8KKyAgICB2b2lkCSAgICAoKnNldENoYXJQb3NpdGlvbkluTGluZSkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdCAqIHRva2VuLCBBTlRMUjNfSU5UMzIgcG9zKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBjaGFubmVsIHRoYXQgdGhpcyB0b2tlbiB3YXMgcGxhY2VkIGluIChwYXJzZXJzCisgICAgICogIGNhbiAndHVuZScgdG8gdGhlc2UgY2hhbm5lbHMuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMiAgICgqZ2V0Q2hhbm5lbCkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdCAqIHRva2VuKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBjaGFubmVsIHRoYXQgdGhpcyB0b2tlbiBzaG91bGQgYmVsb25nIHRvCisgICAgICovCisgICAgdm9pZAkgICAgKCpzZXRDaGFubmVsKQkoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fc3RydWN0ICogdG9rZW4sIEFOVExSM19VSU5UMzIgY2hhbm5lbCk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBpbmRleCAwLi4ubi0xIG9mIHRoZSB0b2tlbiBpbiB0aGUgdG9rZW4KKyAgICAgKiAgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIgICAoKmdldFRva2VuSW5kZXgpCShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QgKiB0b2tlbik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIHNldCB0aGUgdG9rZW4gaW5kZXggb2YgdGhpcyB0b2tlbiBpbiB0aGUgdG9rZW4KKyAgICAgKiAgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHZvaWQJCQkoKnNldFRva2VuSW5kZXgpCShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9zdHJ1Y3QgKiB0b2tlbiwgQU5UTFIzX01BUktFUik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgc3RhcnQgaW5kZXggaW4gdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhpcyB0b2tlbi4KKyAgICAgKi8KKyAgICBBTlRMUjNfTUFSS0VSICAgKCpnZXRTdGFydEluZGV4KQkoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fc3RydWN0ICogdG9rZW4pOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHNldHMgdGhlIHN0YXJ0IGluZGV4IGluIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgdG9rZW4uCisgICAgICovCisgICAgdm9pZAkJCSgqc2V0U3RhcnRJbmRleCkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdCAqIHRva2VuLCBBTlRMUjNfTUFSS0VSIGluZGV4KTsKKyAgICAKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgc3RvcCBpbmRleCBpbiB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGlzIHRva2VuLgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIgICAoKmdldFN0b3BJbmRleCkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdCAqIHRva2VuKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBzdG9wIGluZGV4IGluIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgdG9rZW4uCisgICAgICovCisgICAgdm9pZAkJCSgqc2V0U3RvcEluZGV4KQkoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fc3RydWN0ICogdG9rZW4sIEFOVExSM19NQVJLRVIgaW5kZXgpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhpcyB0b2tlbiBhcyBhIHRleHQgcmVwcmVzZW50YXRpb24gdGhhdCBjYW4gYmUgCisgICAgICogIHByaW50ZWQgd2l0aCBlbWJlZGRlZCBjb250cm9sIGNvZGVzIHN1Y2ggYXMgXG4gcmVwbGFjZWQgd2l0aCB0aGUgcHJpbnRhYmxlIHNlcXVlbmNlICJcXG4iCisgICAgICogIFRoaXMgYWxzbyB5aWVsZHMgYSBzdHJpbmcgc3RydWN0dXJlIHRoYXQgY2FuIGJlIHVzZWQgbW9yZSBlYXNpbHkgdGhhbiB0aGUgcG9pbnRlciB0byAKKyAgICAgKiAgdGhlIGlucHV0IHN0cmVhbSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICovCisgICAgcEFOVExSM19TVFJJTkcgICgqdG9TdHJpbmcpCQkoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fc3RydWN0ICogdG9rZW4pOworfQorICAgIEFOVExSM19DT01NT05fVE9LRU47CisKKy8qKiBcYnJpZWYgQU5UTFIzIFRva2VuIGZhY3RvcnkgaW50ZXJmYWNlIHRvIGNyZWF0ZSBsb3RzIG9mIHRva2VucyBlZmZpY2llbnRseQorICogIHJhdGhlciB0aGFuIGNyZWF0aW5nIGFuZCBmcmVlaW5nIGxvdHMgb2YgbGl0dGxlIGJpdHMgb2YgbWVtb3J5LgorICovCit0eXBlZGVmCXN0cnVjdCBBTlRMUjNfVE9LRU5fRkFDVE9SWV9zdHJ1Y3QKK3sKKyAgICAvKiogUG9pbnRlcnMgdG8gdGhlIGFycmF5IG9mIHRva2VucyB0aGF0IHRoaXMgZmFjdG9yeSBoYXMgcHJvZHVjZWQgc28gZmFyCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgKnBvb2xzOworCisgICAgLyoqIEN1cnJlbnQgcG9vbCB0b2tlbnMgd2UgYXJlIGFsbG9jYXRpbmcgZnJvbQorICAgICAqLworICAgIEFOVExSM19JTlQzMgkgICAgdGhpc1Bvb2w7CisKKyAgICAvKiogTWF4aW11bSBwb29sIGNvdW50IHdlIGhhdmUgYXZhaWxhYmxlCisgICAgICovCisgICAgQU5UTFIzX0lOVDMyICAgICAgICAgICAgbWF4UG9vbDsKKworICAgIC8qKiBUaGUgbmV4dCB0b2tlbiB0byB0aHJvdyBvdXQgZnJvbSB0aGUgcG9vbCwgd2lsbCBjYXVzZSBhIG5ldyBwb29sIGFsbG9jYXRpb24KKyAgICAgKiAgaWYgdGhpcyBleGNlZWRzIHRoZSBhdmFpbGFibGUgdG9rZW5Db3VudAorICAgICAqLworICAgIEFOVExSM19VSU5UMzIJICAgIG5leHRUb2tlbjsKKworICAgIC8qKiBUcmljayB0byBpbml0aWFsaXplIHRva2VucyBhbmQgdGhlaXIgQVBJIHF1aWNrbHksIHdlIHNldCB1cCB0aGlzIHRva2VuIHdoZW4gdGhlCisgICAgICogIGZhY3RvcnkgaXMgY3JlYXRlZCwgdGhlbiBqdXN0IGNvcHkgdGhlIG1lbW9yeSBpdCB1c2VzIGludG8gdGhlIG5ldyB0b2tlbi4KKyAgICAgKi8KKyAgICBBTlRMUjNfQ09NTU9OX1RPS0VOCSAgICB1blRydWM7CisKKyAgICAvKiogUG9pbnRlciB0byBhbiBpbnB1dCBzdHJlYW0gdGhhdCBpcyB1c2luZyB0aGlzIHRva2VuIGZhY3RvcnkgKG1heSBiZSBOVUxMKQorICAgICAqICB3aGljaCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSB0b2tlbnMgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dDsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IHRva2VuCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgKCpuZXdUb2tlbikJICAgIChzdHJ1Y3QgQU5UTFIzX1RPS0VOX0ZBQ1RPUllfc3RydWN0ICogZmFjdG9yeSk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgcmVzZXRzIHRoZSBmYWN0b3J5IHNvIHlvdSBjYW4gcmV1c2UgdGhlIHBvb2xzIGl0CisgICAgICogIGhhcyBsYXJlYWR5IGFsbG9jYXRlZAorICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcmVzZXQpCSAgICAoc3RydWN0IEFOVExSM19UT0tFTl9GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnkpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGNoYW5nZXMgdGVoIGN1cmVudCBpbnB0dSBzdHJlYW0gc28gdGhhdAorICAgICAqICBuZXcgdG9rZW5zIGFyZSBjcmVhdGVkIHdpdGggcmVmZXJlbmNlIHRvIHRoZWlyIG9yaWdpbmF0aW5nIHRleHQuCisgICAgICovCisgICAgdm9pZAkJICAgICgqc2V0SW5wdXRTdHJlYW0pCShzdHJ1Y3QgQU5UTFIzX1RPS0VOX0ZBQ1RPUllfc3RydWN0ICogZmFjdG9yeSwgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpOworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhlIGRlc3Ryb3lzIHRoZSBmYWN0b3J5CisgICAgICovCisgICAgdm9pZAkJICAgICgqY2xvc2UpCSAgICAoc3RydWN0IEFOVExSM19UT0tFTl9GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnkpOworfQorICAgIEFOVExSM19UT0tFTl9GQUNUT1JZOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNjb21tb250cmVlLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29tbW9udHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTZlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29tbW9udHJlZS5oCkBAIC0wLDAgKzEsMTY3IEBACisvKiogSW50ZXJmYWNlIGZvciBhbiBBTlRMUjMgY29tbW9uIHRyZWUgd2hpY2ggaXMgd2hhdCBnZXRzCisgKiAgcGFzc2VkIGFyb3VuZCBieSB0aGUgQVNUIHByb2R1Y2luZyBwYXJzZXIuCisgKi8KKworI2lmbmRlZglfQU5UTFIzX0NPTU1PTl9UUkVFX0gKKyNkZWZpbmUJX0FOVExSM19DT01NT05fVFJFRV9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNiYXNldHJlZS5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbW1vbnRva2VuLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UUkVFX3N0cnVjdAoreworCisJLy8vIE5vdCB1c2VkIGJ5IEFOVExSLCBidXQgaWYgYSBzdXBlciBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCBhYm92ZQorICAgIC8vLyB0aGlzIHN0cnVjdHVyZSwgaXQgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdXBlcgorICAgIC8vLyBzdHJ1Y3R1cmUsIHdoZXJlIGFkZGl0aW9uYWwgZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMgY2FuIGJlIHN0b3JlZC4KKyAgICAvLy8KKyAgICB2b2lkCQkJCQkqIHN1cGVyOworCisgICAgLy8vIFN0YXJ0IHRva2VuIGluZGV4IHRoYXQgZW5jYXNlcyB0aGlzIHRyZWUKKyAgICAvLy8KKyAgICBBTlRMUjNfTUFSS0VSCQkJICBzdGFydEluZGV4OworCisgICAgLy8vIEVuZCB0b2tlbiB0aGF0IGVuY2FzZXMgdGhpcyB0cmVlCisgICAgLy8vCisgICAgQU5UTFIzX01BUktFUgkJCSAgc3RvcEluZGV4OworCisgICAgLy8vIEEgc2luZ2xlIHRva2VuLCB0aGlzIGlzIHRoZSBwYXlsb2FkIGZvciB0aGUgdHJlZQorICAgIC8vLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgICAgdG9rZW47CisKKwkvLy8gUG9pbnRzIHRvIHRoZSBub2RlIHRoYXQgaGFzIHRoaXMgbm9kZSBhcyBhIGNoaWxkLgorCS8vLyBJZiB0aGlzIGlzIE5VTEwsIHRoZW4gdGhpcyBpcyB0aGUgcm9vdCBub2RlLgorCS8vLworCXBBTlRMUjNfQ09NTU9OX1RSRUUJCSAgcGFyZW50OworCisJLy8vIFdoYXQgaW5kZXggaXMgdGhpcyBwYXJ0aWN1bGFyIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3QgaXQKKwkvLy8gYmVsb25ncyB0bz8KKwkvLy8KKwlBTlRMUjNfSU5UMzIJCQkgIGNoaWxkSW5kZXg7CisJCisJLy8vIFBvaW50ZXIgdG8gdGhlIHRyZWUgZmFjdG9yeSB0aGF0IG1hbnVmYWN0dXJlZCB0aGlzCisJLy8vIHRva2VuLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IGR1cGxpY2F0aW9uIG1ldGhvZHMgYW5kIHNvIG9uCisJLy8vIHRvIG1hbnVmYWN0dXJlIGFub3RoZXIgYXV0by10cmFja2VkIGNvbW1vbiB0cmVlIHN0cnVjdHVyZQorCS8vLworCXBBTlRMUjNfQVJCT1JFVFVNCWZhY3Rvcnk7CisKKyAgICAvLy8gQW4gZW5jYXBzdWxhdGVkIEJBU0UgVFJFRSBzdHJ1Y3R1cmUgKE5PVCBhIHBvaW50ZXIpCisgICAgLy8vIHRoYXQgcGVyZm9ybXMgYSBsb3Qgb2YgdGhlIGRpcnR5IHdvcmsgb2Ygbm9kZSBtYW5hZ2VtZW50CisgICAgLy8vIFRvIHRoaXMgd2UgYWRkIGp1c3QgYSBmZXcgZnVuY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSAKKyAgICAvLy8gcGF5bG9hZC4gWW91IGNhbiBmdXJ0aGVyIGFic3RyYWN0IGNvbW1vbiB0cmVlIHNvIGxvbmcKKyAgICAvLy8gYXMgeW91IGFsd2F5cyBoYXZlIGEgYmFzZVRyZWUgcG9pbnRlciBpbiB0aGUgdG9wIHN0cnVjdHVyZQorICAgIC8vLyBhbmQgY29weSBpdCBmcm9tIHRoZSBuZXh0IG9uZSBkb3duLiAKKyAgICAvLy8gU28sIGxldHMgc2F5IHdlIGhhdmUgYSBzdHJ1Y3R1cmUgSklNU19UUkVFLiAKKyAgICAvLy8gSXQgbmVlZHMgYW4gQU5UTFIzX0JBU0VfVFJFRSB0aGF0IHdpbGwgc3VwcG9ydCBhbGwgdGhlCisgICAgLy8vIGdlbmVyYWwgdHJlZSBkdXBsaWNhdGlvbiBzdHVmZi4KKyAgICAvLy8gSXQgbmVlZHMgYSBBTlRMUjNfQ09NTU9OX1RSRUUgc3RydWN0dXJlIGVtYmVkZGVkIG9yIGNvbXBsZXRlbHkKKyAgICAvLy8gcHJvdmlkZXMgdGhlIGVxdWl2YWxlbnQgaW50ZXJmYWNlLgorICAgIC8vLyBJdCBwcm92aWRlcyBpdCdzIG93biBtZXRob2RzIGFuZCBkYXRhLgorICAgIC8vLyBUbyBjcmVhdGUgYSBuZXcgb25lIG9mIHRoZXNlLCB0aGUgZnVuY3Rpb24gcHJvdmlkZWQgdG8KKyAgICAvLy8gdGhlIHRyZWUgYWRhcHRvciAoc2VlIGNvbW1lbnRzIHRoZXJlKSBzaG91bGQgYWxsb2NhdGUgdGhlCisgICAgLy8vIG1lbW9yeSBmb3IgYSBuZXcgSklNU19UUkVFIHN0cnVjdHVyZSwgdGhlbiBjYWxsCisgICAgLy8vIGFudGxyM0luaXRDb21tb25UcmVlKDxhZGRyZXNzb2ZlbWJlZGRlZENPTU1PTl9UUkVFPikKKyAgICAvLy8gYW50bHIzQmFzZVRyZWVOZXcoPGFkZHJlc3NvZkJBU0VUUkVFPikKKyAgICAvLy8gVGhlIGludGVyZmFjZXMgZm9yIEJBU0VfVFJFRSBhbmQgQ09NTU9OX1RSRUUgd2lsbCB0aGVuCisgICAgLy8vIGJlIGluaXRpYWxpemVkLiBZb3UgdGhlbiBjYWxsIGFuZCB5b3UgY2FuIG92ZXJyaWRlIHRoZW0gb3IganVzdCBpbml0CisgICAgLy8vIEpJTVNfVFJFRSAobm90ZSB0aGF0IHRoZSBiYXNlIHRyZWUgaW4gY29tbW9uIHRyZWUgd2lsbCBiZSBpZ25vcmVkKQorICAgIC8vLyBqdXN0IHRoZSB0b3AgbGV2ZWwgYmFzZSB0cmVlIGlzIHVzZWQpLiBDb2RlZ2VuIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LgorICAgIC8vLyAKKyAgICBBTlRMUjNfQkFTRV9UUkVFCSAgICBiYXNlVHJlZTsKKyAgICAgCit9CisgICAgQU5UTFIzX0NPTU1PTl9UUkVFOworCisvLy8gXGJyaWVmIEFOVExSMyBUcmVlIGZhY3RvcnkgaW50ZXJmYWNlIHRvIGNyZWF0ZSBsb3RzIG9mIHRyZWVzIGVmZmljaWVudGx5CisvLy8gIHJhdGhlciB0aGFuIGNyZWF0aW5nIGFuZCBmcmVlaW5nIGxvdHMgb2YgbGl0dGxlIGJpdHMgb2YgbWVtb3J5LgorLy8vCit0eXBlZGVmCXN0cnVjdCBBTlRMUjNfQVJCT1JFVFVNX3N0cnVjdAoreworICAgIC8vLyBQb2ludGVycyB0byB0aGUgYXJyYXkgb2YgdG9rZW5zIHRoYXQgdGhpcyBmYWN0b3J5IGhhcyBwcm9kdWNlZCBzbyBmYXIKKyAgICAvLy8KKyAgICBwQU5UTFIzX0NPTU1PTl9UUkVFICAgICpwb29sczsKKworICAgIC8vLyBDdXJyZW50IHBvb2wgdG9rZW5zIHdlIGFyZSBhbGxvY2F0aW5nIGZyb20KKyAgICAvLy8KKyAgICBBTlRMUjNfSU5UMzIJCQl0aGlzUG9vbDsKKworICAgIC8vLyBUaGUgbmV4dCB0b2tlbiB0byB0aHJvdyBvdXQgZnJvbSB0aGUgcG9vbCwgd2lsbCBjYXVzZSBhIG5ldyBwb29sIGFsbG9jYXRpb24KKyAgICAvLy8gIGlmIHRoaXMgZXhjZWVkcyB0aGUgYXZhaWxhYmxlIHRva2VuQ291bnQKKyAgICAvLy8KKyAgICBBTlRMUjNfVUlOVDMyCQkJbmV4dFRyZWU7CisKKyAgICAvLy8gVHJpY2sgdG8gaW5pdGlhbGl6ZSB0b2tlbnMgYW5kIHRoZWlyIEFQSSBxdWlja2x5LCB3ZSBzZXQgdXAgdGhpcyB0b2tlbiB3aGVuIHRoZQorICAgIC8vLyBmYWN0b3J5IGlzIGNyZWF0ZWQsIHRoZW4ganVzdCBjb3B5IHRoZSBtZW1vcnkgaXQgdXNlcyBpbnRvIHRoZSBuZXcgdG9rZW4uCisgICAgLy8vCisgICAgQU5UTFIzX0NPTU1PTl9UUkVFCSAgICB1blRydWM7CisKKyAgICAvLy8gUG9pbnRlciB0byBhIHZlY3RvciBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgY2hpbGQgbGlzdCB2ZWN0b3JzCisgICAgLy8vIGZvciBhbnkgY2hpbGQgbm9kZXMgdGhhdCBuZWVkIHRoZW0uIFRoaXMgbWVhbnMgdGhhdCB3ZSBhdXRvIHRyYWNrIHRoZQorICAgIC8vLyB2ZWN0b3JzIGFuZCBhdXRvIGZyZWUgdGhlbSB3aGVuIHdlIGNsb3NlIHRoZSBmYWN0b3J5LiBJdCBhbHNvIG1lYW5zCisgICAgLy8vIHRoYXQgYWxsIHJld3JpdGluZyB0cmVlcyBjYW4gdXNlIHRoZSBzYW1lIHRyZWUgZmFjdG9yeSBhbmQgdGhlIHNhbWUKKyAgICAvLy8gdmVjdG9yIGZhY3RvcnkgYW5kIHdlIGRvIG5vdCBkdXAgYW55IG5vZGVzIHVubGVzcyB3ZSBtdXN0IGRvIHNvCisgICAgLy8vIGV4cGxpY2l0bHkgYmVjYXVzZSBvZiBjb250ZXh0IHN1Y2ggYXMgYW4gZW1wdHkgcmV3cml0ZSBzdHJlYW0gYW5kCisgICAgLy8vIC0+SU1BR0lOQVJZW0lEXSBzbyBvbi4gVGhpcyBtYWtlcyBtZW1vcnkgdHJhY2tpbmcgbXVjaCBzaW1wbGVyIGFuZAorICAgIC8vLyB0ZW1wdHMgbm8gZXJyb3JzLgorICAgIC8vLworICAgIHBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlkgICB2RmFjdG9yeTsKKworICAgIC8vLyBBIHJlc3VzZSBzdGFjayBmb3IgcmVjbGFpbWluZyBOaWwgbm9kZXMgdGhhdCB3ZXJlIHVzZWQgaW4gcmV3cml0ZXMKKyAgICAvLy8gYW5kIGFyZSBub3cgZGVhZC4gVGhlIG5pbE5vZGUoKSBtZXRob2Qgd2lsbCBlYXQgb25lIG9mIHRoZXNlIGJlZm9yZQorICAgIC8vLyBjcmVhdGluZyBhIG5ldyBub2RlLgorICAgIC8vLworICAgIHBBTlRMUjNfU1RBQ0sgICAgICAgICAgIG5pbFN0YWNrOworCisgICAgLy8vIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgdHJlZQorICAgIC8vLworICAgIHBBTlRMUjNfQkFTRV9UUkVFCSAgICAoKm5ld1RyZWUpCQkoc3RydWN0IEFOVExSM19BUkJPUkVUVU1fc3RydWN0ICogZmFjdG9yeSk7CisgICAgcEFOVExSM19CQVNFX1RSRUUJICAgICgqbmV3RnJvbVRyZWUpCShzdHJ1Y3QgQU5UTFIzX0FSQk9SRVRVTV9zdHJ1Y3QgKiBmYWN0b3J5LCBwQU5UTFIzX0NPTU1PTl9UUkVFIHRyZWUpOworICAgIHBBTlRMUjNfQkFTRV9UUkVFCSAgICAoKm5ld0Zyb21Ub2tlbikJKHN0cnVjdCBBTlRMUjNfQVJCT1JFVFVNX3N0cnVjdCAqIGZhY3RvcnksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKKworICAgIC8vLyBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhlIGRlc3Ryb3lzIHRoZSBmYWN0b3J5CisgICAgLy8vCisgICAgdm9pZAkJICAgICgqY2xvc2UpCSAgICAoc3RydWN0IEFOVExSM19BUkJPUkVUVU1fc3RydWN0ICogZmFjdG9yeSk7Cit9CisgICAgQU5UTFIzX0FSQk9SRVRVTTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2NvbW1vbnRyZWVhZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29tbW9udHJlZWFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI3OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2NvbW1vbnRyZWVhZGFwdG9yLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqIFxmaWxlCisgKiBEZWZpbml0aW9uIG9mIHRoZSBBTlRMUjMgY29tbW9uIHRyZWUgYWRhcHRvci4KKyAqLworCisjaWZuZGVmCV9BTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUl9ICisjZGVmaW5lCV9BTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUl9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb2xsZWN0aW9ucy5oPgorI2luY2x1ZGUgICAgPGFudGxyM3N0cmluZy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2Jhc2V0cmVlYWRhcHRvci5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbW1vbnRyZWUuaD4KKyNpbmNsdWRlCTxhbnRscjNkZWJ1Z2V2ZW50bGlzdGVuZXIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmCXN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUl9zdHJ1Y3QKK3sKKyAgICAvKiogQW55IGVuY2xvc2luZyBzdHJ1Y3R1cmUvY2xhc3MgY2FuIHVzZSB0aGlzIHBvaW50ZXIgdG8gcG9pbnQgdG8gaXRzIG93biBpbnRlcmZhY2UuCisgICAgICovCisgICAgdm9pZCAgICAqIHN1cGVyOworCisgICAgLyoqIEJhc2UgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCBlbWJlZGRlZCBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBBTlRMUjNfVFJFRV9BREFQVE9SCWJhc2VBZGFwdG9yOworCisgICAgLyoqIFRyZWUgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIG5ldyBub2RlcyBhcyByZXF1aXJlZCB3aXRob3V0IG5lZWRpbmcgdG8gdHJhY2sKKyAgICAgKiAgbWVtb3J5IGFsbG9jYXRpb24gcGVyIG5vZGUuCisgICAgICovCisgICAgcEFOVExSM19BUkJPUkVUVU0JYXJib3JldHVtOworCit9CisgICAgQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1I7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29tbW9udHJlZW5vZGVzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIwNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLmgKQEAgLTAsMCArMSwzMzYgQEAKKy8vLyBcZmlsZQorLy8vIERlZmluaXRpb24gb2YgdGhlIEFOVExSMyBjb21tb24gdHJlZSBub2RlIHN0cmVhbS4KKy8vLworCisjaWZuZGVmCV9BTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fX0gKKyNkZWZpbmUJX0FOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9fSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzY29tbW9udHJlZWFkYXB0b3IuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250cmVlLmg+CisjaW5jbHVkZSAgICA8YW50bHIzY29sbGVjdGlvbnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNpbnRzdHJlYW0uaD4KKyNpbmNsdWRlICAgIDxhbnRscjNzdHJpbmcuaD4KKworLy8vIFRva2VuIGJ1ZmZlciBpbml0aWFsIHNpemUgc2V0dGluZ3MgKCB3aWxsIGF1dG8gaW5jcmVhc2UpCisvLy8KKyNkZWZpbmUJREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFCQkxMDAKKyNkZWZpbmUJSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUJCQkxMAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYJc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdAoreworICAgIC8vLyBBbnkgaW50ZXJmYWNlIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSAoaXMgYSAKKyAgICAvLy8gIHN1cGVyIHN0cnVjdHVyZSBjb250YWluaW5nIHRoaXMgc3RydWN0dXJlKSwgbWF5IHN0b3JlIHRoZSBwb2ludGVyCisgICAgLy8vICB0byBpdHNlbGYgaGVyZSBpbiB0aGUgc3VwZXIgcG9pbnRlciwgd2hpY2ggaXMgbm90IHVzZWQgYnkgCisgICAgLy8vICB0aGUgdHJlZSBub2RlIHN0cmVhbS4gVGhpcyB3aWxsIHBvaW50IHRvIGFuIGltcGxlbWVudGF0aW9uCisgICAgLy8vICBvZiBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gaW4gdGhpcyBjYXNlLgorICAgIC8vLworICAgIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0JY3RuczsKKworICAgIC8vLyBBbGwgaW5wdXQgc3RyZWFtcyBpbXBsZW1lbnQgdGhlIEFOVExSM19JTlRfU1RSRUFNIGludGVyZmFjZS4uLgorICAgIC8vLworICAgIHBBTlRMUjNfSU5UX1NUUkVBTQkJCWlzdHJlYW07CisKKwkvLy8gR2V0IHRyZWUgbm9kZSBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkIHdoZXJlIGk9MSBpcyBuZXh0IG5vZGUuCisJLy8vIGk8MCBpbmRpY2F0ZXMgbm9kZXMgaW4gdGhlIHBhc3QuICBTbyBMVCgtMSkgaXMgcHJldmlvdXMgbm9kZSwgYnV0CisJLy8vIGltcGxlbWVudGF0aW9ucyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgcmVzdWx0cyBmb3IgayA8IC0xLgorCS8vLyBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgaT49biwgcmV0dXJuIG51bGwuCisJLy8vIFJldHVybiBOVUxMIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisJLy8vIHRoYXQgaXMgbmVnYXRpdmUgKGJleW9uZCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QpLgorCS8vLworCS8vLyBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUgTFQoKSBtZXRob2Qgb2YgdGhlIFRva2VuU3RyZWFtLCBidXQgdGhpcworCS8vLyByZXR1cm5zIGEgdHJlZSBub2RlIGluc3RlYWQgb2YgYSB0b2tlbi4gIE1ha2VzIGNvZGUgZ2VuIGlkZW50aWNhbAorCS8vLyBmb3IgYm90aCBwYXJzZXIgYW5kIHRyZWUgZ3JhbW1hcnMuIDopCisJLy8vCisgICAgcEFOVExSM19CQVNFX1RSRUUJCQkoKl9MVCkJCQkJCQkJKHN0cnVjdCBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiB0bnMsIEFOVExSM19JTlQzMiBrKTsKKworCS8vLyBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIG5vZGVzIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisJLy8vIHRoZSBvYmplY3QgdGhhdCBwcm92aWRlcyBub2RlIG9iamVjdHMuCisJLy8vCisgICAgcEFOVExSM19CQVNFX1RSRUUJCQkoKmdldFRyZWVTb3VyY2UpCQkJCShzdHJ1Y3QgQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogdG5zKTsKKworCS8vLyBXaGF0IGFkYXB0b3IgY2FuIHRlbGwgbWUgaG93IHRvIGludGVycHJldC9uYXZpZ2F0ZSBub2RlcyBhbmQKKwkvLy8gdHJlZXMuICBFLmcuLCBnZXQgdGV4dCBvZiBhIG5vZGUuCisJLy8vCisgICAgcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUgkoKmdldFRyZWVBZGFwdG9yKQkJCQkoc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIHRucyk7CisKKwkvLy8gQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorCS8vLyB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworCS8vLyBzbyB3ZSBoYXZlIHRvIGluc3RhbnRpYXRlIG5ldyBvbmVzLiAgV2hlbiBkb2luZyBub3JtYWwgdHJlZQorCS8vLyBwYXJzaW5nLCBpdCdzIHNsb3cgYW5kIGEgd2FzdGUgb2YgbWVtb3J5IHRvIGNyZWF0ZSB1bmlxdWUKKwkvLy8gbmF2aWdhdGlvbiBub2Rlcy4gIERlZmF1bHQgc2hvdWxkIGJlIGZhbHNlOworCS8vLworICAgIHZvaWQJCQkJCQkoKnNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlcykJCShzdHJ1Y3QgQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogdG5zLCBBTlRMUjNfQk9PTEVBTiB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMpOworCisgICAgcEFOVExSM19TVFJJTkcJCQkJKCp0b1N0cmluZykJCQkJCQkoc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIHRucyk7CisKKwkvLy8gUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCBub2RlcyBmcm9tIHN0YXJ0IHRvIHN0b3AsIGluY2x1c2l2ZS4KKwkvLy8gSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSBub2RlcyB0aGVuIGl0IGNhbiBzdGlsbAorCS8vLyB3YWxrIHJlY3Vyc2l2ZWx5IGZyb20gc3RhcnQgdW50aWwgc3RvcC4gIFlvdSBjYW4gYWx3YXlzIHJldHVybgorCS8vLyBudWxsIG9yICIiIHRvbywgYnV0IHVzZXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorCS8vLyBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKwkvLy8KKyAgICBwQU5UTFIzX1NUUklORwkJCQkoKnRvU3RyaW5nU1MpCQkJCQkoc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIHRucywgcEFOVExSM19CQVNFX1RSRUUgc3RhcnQsIHBBTlRMUjNfQkFTRV9UUkVFIHN0b3ApOworCisJLy8vIFJldHVybiB0aGUgdGV4dCBvZiBhbGwgbm9kZXMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUsIGludG8gdGhlCisJLy8vIHN1cHBsaWVkIGJ1ZmZlci4KKwkvLy8gSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSBub2RlcyB0aGVuIGl0IGNhbiBzdGlsbAorCS8vLyB3YWxrIHJlY3Vyc2l2ZWx5IGZyb20gc3RhcnQgdW50aWwgc3RvcC4gIFlvdSBjYW4gYWx3YXlzIHJldHVybgorCS8vLyBudWxsIG9yICIiIHRvbywgYnV0IHVzZXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorCS8vLyBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKwkvLy8KKyAgICB2b2lkCQkJCQkJKCp0b1N0cmluZ1dvcmspCQkJCQkoc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIHRucywgcEFOVExSM19CQVNFX1RSRUUgc3RhcnQsIHBBTlRMUjNfQkFTRV9UUkVFIHN0b3AsIHBBTlRMUjNfU1RSSU5HIGJ1Zik7CisKKwkvLy8gUmVsZWFzZSB1cCBhbnkgYW5kIGFsbCBzcGFjZSB0aGUgdGhlIGludGVyZmFjZSBhbGxvY2F0ZSwgaW5jbHVkaW5nIGZvciB0aGlzIHN0cnVjdHVyZS4KKwkvLy8KKyAgICB2b2lkCQkJCQkJKCpmcmVlKQkJCQkJCQkoc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIHRucyk7CisKKwkvLy8gR2V0IGEgdHJlZSBub2RlIGF0IGFuIGFic29sdXRlIGluZGV4IGk7IDAuLm4tMS4KKwkvLy8gSWYgeW91IGRvbid0IHdhbnQgdG8gYnVmZmVyIHVwIG5vZGVzLCB0aGVuIHRoaXMgbWV0aG9kIG1ha2VzIG5vCisJLy8vIHNlbnNlIGZvciB5b3UuCisJLy8vCisJcEFOVExSM19CQVNFX1RSRUUJCQkoKmdldCkJCQkJCQkJKHN0cnVjdCBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiB0bnMsIEFOVExSM19JTlQzMiBpKTsKKworCS8vIFJFV1JJVElORyBUUkVFUyAodXNlZCBieSB0cmVlIHBhcnNlcikKKworCS8vLyBSZXBsYWNlIGZyb20gc3RhcnQgdG8gc3RvcCBjaGlsZCBpbmRleCBvZiBwYXJlbnQgd2l0aCB0LCB3aGljaCBtaWdodAorCS8vLyBiZSBhIGxpc3QuICBOdW1iZXIgb2YgY2hpbGRyZW4gbWF5IGJlIGRpZmZlcmVudAorCS8vLyBhZnRlciB0aGlzIGNhbGwuICBUaGUgc3RyZWFtIGlzIG5vdGlmaWVkIGJlY2F1c2UgaXQgaXMgd2Fsa2luZyB0aGUKKwkvLy8gdHJlZSBhbmQgbWlnaHQgbmVlZCB0byBrbm93IHlvdSBhcmUgbW9ua2V5aW5nIHdpdGggdGhlIHVuZGVybHlpbmcKKwkvLy8gdHJlZS4gIEFsc28sIGl0IG1pZ2h0IGJlIGFibGUgdG8gbW9kaWZ5IHRoZSBub2RlIHN0cmVhbSB0byBhdm9pZAorCS8vLyByZXN0cmVhbWluZyBmb3IgZnV0dXJlIHBoYXNlcy4KKwkvLy8KKwkvLy8gSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorCS8vLyBDYW4ndCByZXBsYWNlIHdoYXRldmVyIHBvaW50cyB0byB0aGUgcGFyZW50IGV4dGVybmFsbHkuICBEbyBub3RoaW5nLgorCS8vLworCXZvaWQJCQkJCQkoKnJlcGxhY2VDaGlsZHJlbikJCQkJKHN0cnVjdCBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiB0bnMsIHBBTlRMUjNfQkFTRV9UUkVFIHBhcmVudCwgQU5UTFIzX0lOVDMyIHN0YXJ0Q2hpbGRJbmRleCwgQU5UTFIzX0lOVDMyIHN0b3BDaGlsZEluZGV4LCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKKworfQorICAgIEFOVExSM19UUkVFX05PREVfU1RSRUFNOworCit0eXBlZGVmCXN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0Cit7CisgICAgLy8vIEFueSBpbnRlcmZhY2UgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIChpcyBhIAorICAgIC8vLyBzdXBlciBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGlzIHN0cnVjdHVyZSksIG1heSBzdG9yZSB0aGUgcG9pbnRlcgorICAgIC8vLyB0byBpdHNlbGYgaGVyZSBpbiB0aGUgc3VwZXIgcG9pbnRlciwgd2hpY2ggaXMgbm90IHVzZWQgYnkgCisgICAgLy8vIHRoZSBjb21tb24gdHJlZSBub2RlIHN0cmVhbS4KKyAgICAvLy8KKyAgICB2b2lkCQkJCQkJKiBzdXBlcjsKKworICAgIC8vLyBQb2ludGVyIHRvIHRoZSB0cmVlIG5vZGUgc3RyZWFtIGludGVyZmFjZQorICAgIC8vLworICAgIHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTQl0bnN0cmVhbTsKKworICAgIC8vLyBTdHJpbmcgZmFjdG9yeSBmb3IgdXNlIGJ5IGFueXRoaW5nIHRoYXQgd2lzaGVzIHRvIGNyZWF0ZSBzdHJpbmdzCisgICAgLy8vIHN1Y2ggYXMgYSB0cmVlIHJlcHJlc2VudGF0aW9uIG9yIHNvbWUgY29weSBvZiB0aGUgdGV4dCBldGMuCisgICAgLy8vCisgICAgcEFOVExSM19TVFJJTkdfRkFDVE9SWQkJc3RyaW5nRmFjdG9yeTsKKworICAgIC8vLyBEdW1teSB0cmVlIG5vZGUgdGhhdCBpbmRpY2F0ZXMgYSBkZXNjZW50IGludG8gYSBjaGlsZAorICAgIC8vLyB0cmVlLiBJbml0aWFsaXplZCBieSBhIGNhbGwgdG8gY3JlYXRlIGEgbmV3IGludGVyZmFjZS4KKyAgICAvLy8KKyAgICBBTlRMUjNfQ09NTU9OX1RSRUUJCQlET1dOOworCisgICAgLy8vIER1bW15IHRyZWUgbm9kZSB0aGF0IGluZGljYXRlcyBhIGRlc2NlbnQgdXAgdG8gYSBwYXJlbnQKKyAgICAvLy8gdHJlZS4gSW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGNyZWF0ZSBhIG5ldyBpbnRlcmZhY2UuCisgICAgLy8vCisgICAgQU5UTFIzX0NPTU1PTl9UUkVFCQkJVVA7CisKKyAgICAvLy8gRHVtbXkgdHJlZSBub2RlIHRoYXQgaW5kaWNhdGVzIHRoZSB0ZXJtaW5hdGlvbiBwb2ludCBvZiB0aGUKKyAgICAvLy8gdHJlZS4gSW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGNyZWF0ZSBhIG5ldyBpbnRlcmZhY2UuCisgICAgLy8vCisgICAgQU5UTFIzX0NPTU1PTl9UUkVFCQkJRU9GX05PREU7CisKKyAgICAvLy8gRHVtbXkgbm9kZSB0aGF0IGlzIHJldHVybmVkIGlmIHdlIG5lZWQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZCBub2RlCisgICAgLy8vIGZvciBhbnkgcmVhc29uLgorICAgIC8vLworICAgIEFOVExSM19DT01NT05fVFJFRQkJCUlOVkFMSURfTk9ERTsKKworCS8vLyBUaGUgY29tcGxldGUgbWFwcGluZyBmcm9tIHN0cmVhbSBpbmRleCB0byB0cmVlIG5vZGUuCisJLy8vIFRoaXMgYnVmZmVyIGluY2x1ZGVzIHBvaW50ZXJzIHRvIERPV04sIFVQLCBhbmQgRU9GIG5vZGVzLgorCS8vLyBJdCBpcyBidWlsdCB1cG9uIGN0b3IgaW52b2NhdGlvbi4gIFRoZSBlbGVtZW50cyBhcmUgdHlwZQorCS8vLyBPYmplY3QgYXMgd2UgZG9uJ3Qgd2hhdCB0aGUgdHJlZXMgbG9vayBsaWtlLgorCS8vLworCS8vLyBMb2FkIHVwb24gZmlyc3QgbmVlZCBvZiB0aGUgYnVmZmVyIHNvIHdlIGNhbiBzZXQgdG9rZW4gdHlwZXMKKwkvLy8gb2YgaW50ZXJlc3QgZm9yIHJldmVyc2VJbmRleGluZy4gIFNsb3dzIHVzIGRvd24gYSB3ZWUgYml0IHRvCisJLy8vIGRvIGFsbCBvZiB0aGUgaWYgcD09LTEgdGVzdGluZyBldmVyeXdoZXJlIHRob3VnaCwgdGhvdWdoIGluIEMKKwkvLy8geW91IHdvbid0IHJlYWxseSBiZSBhYmxlIHRvIG1lYXN1cmUgdGhpcy4KKwkvLy8KKwkvLy8gTXVzdCBiZSBmcmVlZCB3aGVuIHRoZSB0cmVlIG5vZGUgc3RyZWFtIGlzIHRvcm4gZG93bi4KKwkvLy8KKwlwQU5UTFIzX1ZFQ1RPUgkJCQlub2RlczsKKworICAgIC8vLyBJZiBzZXQgdG8gQU5UTFIzX1RSVUUgdGhlbiB0aGUgbmF2aWdhdGlvbiBub2RlcyBVUCwgRE9XTiBhcmUKKyAgICAvLy8gZHVwbGljYXRlZCByYXRoZXIgdGhhbiByZXVzZWQgd2l0aGluIHRoZSB0cmVlLgorICAgIC8vLworICAgIEFOVExSM19CT09MRUFOCQkJCXVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKworICAgIC8vLyBXaGljaCB0cmVlIGFyZSB3ZSBuYXZpZ2F0aW5nID8KKyAgICAvLy8KKyAgICBwQU5UTFIzX0JBU0VfVFJFRQkJCXJvb3Q7CisKKyAgICAvLy8gUG9pbnRlciB0byB0cmVlIGFkYXB0b3IgaW50ZXJmYWNlIHRoYXQgbWFuaXB1bGF0ZXMvYnVpbGRzCisgICAgLy8vIHRoZSB0cmVlLgorICAgIC8vLworICAgIHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IJYWRhcHRvcjsKKworICAgIC8vLyBBcyB3ZSB3YWxrIGRvd24gdGhlIG5vZGVzLCB3ZSBtdXN0IHRyYWNrIHBhcmVudCBub2RlcyBzbyB3ZSBrbm93CisgICAgLy8vIHdoZXJlIHRvIGdvIGFmdGVyIHdhbGtpbmcgdGhlIGxhc3QgY2hpbGQgb2YgYSBub2RlLiAgV2hlbiB2aXNpdGluZworICAgIC8vLyBhIGNoaWxkLCBwdXNoIGN1cnJlbnQgbm9kZSBhbmQgY3VycmVudCBpbmRleCAoY3VycmVudCBpbmRleAorICAgIC8vLyBpcyBmaXJzdCBzdG9yZWQgaW4gdGhlIHRyZWUgbm9kZSBzdHJ1Y3R1cmUgdG8gYXZvaWQgdHdvIHN0YWNrcy4KKyAgICAvLy8KKyAgICBwQU5UTFIzX1NUQUNLCQkJCW5vZGVTdGFjazsKKworCS8vLyBUaGUgY3VycmVudCBpbmRleCBpbnRvIHRoZSBub2RlcyB2ZWN0b3Igb2YgdGhlIGN1cnJlbnQgdHJlZQorCS8vLyB3ZSBhcmUgcGFyc2luZyBhbmQgcG9zc2libHkgcmV3cml0aW5nLgorCS8vLworCUFOVExSM19JTlQzMgkJCQlwOworCisgICAgLy8vIFdoaWNoIG5vZGUgYXJlIHdlIGN1cnJlbnRseSB2aXNpdGluZz8KKyAgICAvLy8KKyAgICBwQU5UTFIzX0JBU0VfVFJFRQkJCWN1cnJlbnROb2RlOworCisgICAgLy8vIFdoaWNoIG5vZGUgZGlkIHdlIGxhc3QgdmlzaXQ/IFVzZWQgZm9yIExUKC0xKQorICAgIC8vLworICAgIHBBTlRMUjNfQkFTRV9UUkVFCQkJcHJldmlvdXNOb2RlOworCisgICAgLy8vIFdoaWNoIGNoaWxkIGFyZSB3ZSBjdXJyZW50bHkgdmlzaXRpbmc/ICBJZiAtMSB3ZSBoYXZlIG5vdCB2aXNpdGVkCisgICAgLy8vIHRoaXMgbm9kZSB5ZXQ7IG5leHQgY29uc3VtZSgpIHJlcXVlc3Qgd2lsbCBzZXQgY3VycmVudEluZGV4IHRvIDAuCisgICAgLy8vCisgICAgQU5UTFIzX0lOVDMyCQkJCWN1cnJlbnRDaGlsZEluZGV4OworCisgICAgLy8vIFdoYXQgbm9kZSBpbmRleCBkaWQgd2UganVzdCBjb25zdW1lPyAgaT0wLi5uLTEgZm9yIG4gbm9kZSB0cmVlcy4KKyAgICAvLy8gSW50U3RyZWFtLm5leHQgaXMgaGVuY2UgMSArIHRoaXMgdmFsdWUuICBTaXplIHdpbGwgYmUgc2FtZS4KKyAgICAvLy8KKyAgICBBTlRMUjNfTUFSS0VSCQkJCWFic29sdXRlTm9kZUluZGV4OworCisgICAgLy8vIEJ1ZmZlciB0cmVlIG5vZGUgc3RyZWFtIGZvciB1c2Ugd2l0aCBMVChpKS4gIFRoaXMgbGlzdCBncm93cworICAgIC8vLyB0byBmaXQgbmV3IGxvb2thaGVhZCBkZXB0aHMsIGJ1dCBjb25zdW1lKCkgd3JhcHMgbGlrZSBhIGNpcmN1bGFyCisgICAgLy8vIGJ1ZmZlci4KKyAgICAvLy8KKyAgICBwQU5UTFIzX0JBU0VfVFJFRQkgICAgICAqIGxvb2tBaGVhZDsKKworICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIGF0IGFueSBwb2ludCBpbgorICAgIC8vLyAgdGltZS4gVGhpcyBpcyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBhcnJheS4KKyAgICAvLy8KKyAgICBBTlRMUjNfVUlOVDMyCQkJCWxvb2tBaGVhZExlbmd0aDsKKworICAgIC8vLyBsb29rQWhlYWRbaGVhZF0gaXMgdGhlIGZpcnN0IHN5bWJvbCBvZiBsb29rYWhlYWQsIExUKDEpLiAKKyAgICAvLy8KKyAgICBBTlRMUjNfVUlOVDMyCQkJCWhlYWQ7CisKKyAgICAvLy8gQWRkIG5ldyBsb29rYWhlYWQgYXQgbG9va2FoZWFkW3RhaWxdLiAgdGFpbCB3cmFwcyBhcm91bmQgYXQgdGhlCisgICAgLy8vIGVuZCBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBzbyB0YWlsIGNvdWxkIGJlIGxlc3MgdGhhbiBoZWFkLgorICAgIC8vLworICAgIEFOVExSM19VSU5UMzIJCQkJdGFpbDsKKworICAgIC8vLyBDYWxscyB0byBtYXJrKCkgbWF5IGJlIG5lc3RlZCBzbyB3ZSBoYXZlIHRvIHRyYWNrIGEgc3RhY2sgb2YKKyAgICAvLy8gdGhlbS4gIFRoZSBtYXJrZXIgaXMgYW4gaW5kZXggaW50byB0aGlzIHN0YWNrLiAgSW5kZXggMCBpcworICAgIC8vLyB0aGUgZmlyc3QgbWFya2VyLiAgVGhpcyBpcyBhIExpc3Q8VHJlZVdhbGtTdGF0ZT4KKyAgICAvLy8KKyAgICBwQU5UTFIzX1ZFQ1RPUgkJCQltYXJrZXJzOworCisgICAgLy8gSU5URVJGQUNFCisJLy8KKyAgICB2b2lkCQkJCSgqZmlsbCkJCQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zLCBBTlRMUjNfSU5UMzIgayk7CisKKyAgICB2b2lkCQkJCSgqYWRkTG9va2FoZWFkKQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zLCBwQU5UTFIzX0JBU0VfVFJFRSBub2RlKTsKKworICAgIEFOVExSM19CT09MRUFOCSAgICAoKmhhc05leHQpCQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zKTsKKworICAgIHBBTlRMUjNfQkFTRV9UUkVFCSgqbmV4dCkJCQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zKTsKKworICAgIHBBTlRMUjNfQkFTRV9UUkVFCSgqaGFuZGxlUm9vdG5vZGUpCQkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogY3Rucyk7CisKKyAgICBwQU5UTFIzX0JBU0VfVFJFRQkoKnZpc2l0Q2hpbGQpCQkJCShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIGN0bnMsIEFOVExSM19VSU5UMzIgY2hpbGQpOworCisgICAgdm9pZAkJCQkoKmFkZE5hdmlnYXRpb25Ob2RlKQkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogY3RucywgQU5UTFIzX1VJTlQzMiB0dHlwZSk7CisKKyAgICBwQU5UTFIzX0JBU0VfVFJFRQkoKm5ld0Rvd25Ob2RlKQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zKTsKKworCXBBTlRMUjNfQkFTRV9UUkVFCSgqbmV3VXBOb2RlKQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zKTsKKworICAgIHZvaWQJCQkJKCp3YWxrQmFja1RvTW9zdFJlY2VudE5vZGVXaXRoVW52aXNpdGVkQ2hpbGRyZW4pCisJCQkJCQkJCQkJCQkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogY3Rucyk7CisKKyAgICBBTlRMUjNfQk9PTEVBTgkgICAgKCpoYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMpCShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIGN0bnMpOworCisgICAgQU5UTFIzX1VJTlQzMgkgICAgKCpnZXRMb29rYWhlYWRTaXplKQkJCShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIGN0bnMpOworCisJdm9pZAkJCQkoKnB1c2gpCQkJCQkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogY3RucywgQU5UTFIzX0lOVDMyIGluZGV4KTsKKworCUFOVExSM19JTlQzMgkJKCpwb3ApCQkJCQkJKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU1fc3RydWN0ICogY3Rucyk7CisKKyAgICB2b2lkCQkJCSgqcmVzZXQpCQkJCQkoc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QgKiBjdG5zKTsKKworICAgIHZvaWQJCQkJKCpmcmVlKQkJCQkJCShzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNX3N0cnVjdCAqIGN0bnMpOworCisJLy8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbm9kZSBzdHJlYW0gd2FzIGRlcml2ZWQgZnJvbSBhIHByaW9yCisJLy8vIG5vZGUgc3RyZWFtIHRvIGJlIHVzZWQgYnkgYSByZXdyaXRpbmcgdHJlZSBwYXJzZXIgZm9yIGluc3RhbmNlLgorCS8vLyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIEFOVExSM19UUlVFLCB0aGVuIHdoZW4gdGhpcyBzdHJlYW0gaXMKKwkvLy8gY2xvc2VkIGl0IHdpbGwgbm90IGZyZWUgdGhlIHJvb3QgdHJlZSBhcyB0aGlzIHRyZWUgYWx3YXlzCisJLy8vIGJlbG9uZ3MgdG8gdGhlIG9yaWduaWF0aW5nIG5vZGUgc3RyZWFtLgorCS8vLworCUFOVExSM19CT09MRUFOCQkJCWlzUmV3cml0ZXI7CisKK30KKyAgICBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU07CisKKy8qKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNhdmUgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGluIHRoZSB0cmVlbm9kZXN0cmVhbQorICogIHdoZW4gd2Fsa2luZyBhaGVhZCB3aXRoIGN5Y2xpYyBERkEgb3IgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLAorICogIHdlIG5lZWQgdG8gcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSBub2RlIHN0cmVhbS4gIFRoaXMKKyAqICBjbGFzcyB3cmFwcyB1cCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ29tbW9uVHJlZU5vZGVTdHJlYW0uCisgKiAgQ2FsbGluZyBtYXJrKCkgd2lsbCBwdXNoIGFub3RoZXIgb2YgdGhlc2Ugb24gdGhlIG1hcmtlcnMgc3RhY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19UUkVFX1dBTEtfU1RBVEVfc3RydWN0Cit7CisgICAgQU5UTFIzX1VJTlQzMgkJCSAgY3VycmVudENoaWxkSW5kZXg7CisgICAgQU5UTFIzX01BUktFUgkJCSAgYWJzb2x1dGVOb2RlSW5kZXg7CisgICAgcEFOVExSM19CQVNFX1RSRUUJCSAgY3VycmVudE5vZGU7CisgICAgcEFOVExSM19CQVNFX1RSRUUJCSAgcHJldmlvdXNOb2RlOworICAgIEFOVExSM19VSU5UMzIJCQkgIG5vZGVTdGFja1NpemU7CisgICAgcEFOVExSM19CQVNFX1RSRUUJICAgICogbG9va0FoZWFkOworICAgIEFOVExSM19VSU5UMzIJCQkgIGxvb2tBaGVhZExlbmd0aDsKKyAgICBBTlRMUjNfVUlOVDMyCQkJICB0YWlsOworICAgIEFOVExSM19VSU5UMzIJCQkgIGhlYWQ7Cit9CisgICAgQU5UTFIzX1RSRUVfV0FMS19TVEFURTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY29udmVydHV0Zi5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2NvbnZlcnR1dGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNjODJjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2NvbnZlcnR1dGYuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgVW5pY29kZSwgSW5jLgorICogCisgKiBEaXNjbGFpbWVyCisgKiAKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgcHJvdmlkZWQgYXMgaXMgYnkgVW5pY29kZSwgSW5jLiBObyBjbGFpbXMgYXJlCisgKiBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIE5vIHdhcnJhbnRpZXMgb2YgYW55CisgKiBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gVGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gZGV0ZXJtaW5lCisgKiBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiBJZiB0aGlzIGZpbGUgaGFzIGJlZW4KKyAqIHB1cmNoYXNlZCBvbiBtYWduZXRpYyBvciBvcHRpY2FsIG1lZGlhIGZyb20gVW5pY29kZSwgSW5jLiwgdGhlCisgKiBzb2xlIHJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhCisgKiB3aXRoaW4gOTAgZGF5cyBvZiByZWNlaXB0LgorICogCisgKiBMaW1pdGF0aW9ucyBvbiBSaWdodHMgdG8gUmVkaXN0cmlidXRlIFRoaXMgQ29kZQorICogCisgKiBVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisgKiBzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisgKiBVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtCisgKiBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UKKyAqIHJlbWFpbnMgYXR0YWNoZWQuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBDb252ZXJzaW9ucyBiZXR3ZWVuIFVURjMyLCBVVEYtMTYsIGFuZCBVVEYtOC4gIEhlYWRlciBmaWxlLgorCisgICAgU2V2ZXJhbCBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkIGhlcmUsIGZvcm1pbmcgYSBjb21wbGV0ZSBzZXQgb2YKKyAgICBjb252ZXJzaW9ucyBiZXR3ZWVuIHRoZSB0aHJlZSBmb3JtYXRzLiAgVVRGLTcgaXMgbm90IGluY2x1ZGVkCisgICAgaGVyZSwgYnV0IGlzIGhhbmRsZWQgaW4gYSBzZXBhcmF0ZSBzb3VyY2UgZmlsZS4KKworICAgIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgdGFrZXMgcG9pbnRlcnMgdG8gaW5wdXQgYnVmZmVycyBhbmQgb3V0cHV0CisgICAgYnVmZmVycy4gIFRoZSBpbnB1dCBidWZmZXJzIGFyZSBjb25zdC4KKworICAgIEVhY2ggcm91dGluZSBjb252ZXJ0cyB0aGUgdGV4dCBiZXR3ZWVuICpzb3VyY2VTdGFydCBhbmQgc291cmNlRW5kLAorICAgIHB1dHRpbmcgdGhlIHJlc3VsdCBpbnRvIHRoZSBidWZmZXIgYmV0d2VlbiAqdGFyZ2V0U3RhcnQgYW5kCisgICAgdGFyZ2V0RW5kLiBOb3RlOiB0aGUgZW5kIHBvaW50ZXJzIGFyZSAqYWZ0ZXIqIHRoZSBsYXN0IGl0ZW06IGUuZy4gCisgICAgKihzb3VyY2VFbmQgLSAxKSBpcyB0aGUgbGFzdCBpdGVtLgorCisgICAgVGhlIHJldHVybiByZXN1bHQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsCisgICAgYW5kIGlmIG5vdCwgd2hldGhlciB0aGUgcHJvYmxlbSB3YXMgaW4gdGhlIHNvdXJjZSBvciB0YXJnZXQgYnVmZmVycy4KKyAgICAoT25seSB0aGUgZmlyc3QgZW5jb3VudGVyZWQgcHJvYmxlbSBpcyBpbmRpY2F0ZWQuKQorCisgICAgQWZ0ZXIgdGhlIGNvbnZlcnNpb24sICpzb3VyY2VTdGFydCBhbmQgKnRhcmdldFN0YXJ0IGFyZSBib3RoCisgICAgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZW5kIG9mIGxhc3QgdGV4dCBzdWNjZXNzZnVsbHkgY29udmVydGVkIGluCisgICAgdGhlIHJlc3BlY3RpdmUgYnVmZmVycy4KKworICAgIElucHV0IHBhcmFtZXRlcnM6CisJc291cmNlU3RhcnQgLSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byB0aGUgc291cmNlIGJ1ZmZlci4KKwkJVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJlIG1vZGlmaWVkIG9uIHJldHVybiBzbyB0aGF0CisJCWl0IHBvaW50cyBhdCB0aGUgbmV4dCB0aGluZyB0byBiZSBjb252ZXJ0ZWQuCisJdGFyZ2V0U3RhcnQgLSBzaW1pbGFybHksIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlci4KKwlzb3VyY2VFbmQsIHRhcmdldEVuZCAtIHJlc3BlY3RpdmVseSBwb2ludGVycyB0byB0aGUgZW5kcyBvZiB0aGUKKwkJdHdvIGJ1ZmZlcnMsIGZvciBvdmVyZmxvdyBjaGVja2luZyBvbmx5LgorCisgICAgVGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgdGFrZSBhIENvbnZlcnNpb25GbGFncyBhcmd1bWVudC4gV2hlbiB0aGlzCisgICAgZmxhZyBpcyBzZXQgdG8gc3RyaWN0LCBib3RoIGlycmVndWxhciBzZXF1ZW5jZXMgYW5kIGlzb2xhdGVkIHN1cnJvZ2F0ZXMKKyAgICB3aWxsIGNhdXNlIGFuIGVycm9yLiAgV2hlbiB0aGUgZmxhZyBpcyBzZXQgdG8gbGVuaWVudCwgYm90aCBpcnJlZ3VsYXIKKyAgICBzZXF1ZW5jZXMgYW5kIGlzb2xhdGVkIHN1cnJvZ2F0ZXMgYXJlIGNvbnZlcnRlZC4KKworICAgIFdoZXRoZXIgdGhlIGZsYWcgaXMgc3RyaWN0IG9yIGxlbmllbnQsIGFsbCBpbGxlZ2FsIHNlcXVlbmNlcyB3aWxsIGNhdXNlCisgICAgYW4gZXJyb3IgcmV0dXJuLiBUaGlzIGluY2x1ZGVzIHNlcXVlbmNlcyBzdWNoIGFzOiA8RjQgOTAgODAgODA+LCA8QzAgODA+LAorICAgIG9yIDxBMD4gaW4gVVRGLTgsIGFuZCB2YWx1ZXMgYWJvdmUgMHgxMEZGRkYgaW4gVVRGLTMyLiBDb25mb3JtYW50IGNvZGUKKyAgICBtdXN0IGNoZWNrIGZvciBpbGxlZ2FsIHNlcXVlbmNlcy4KKworICAgIFdoZW4gdGhlIGZsYWcgaXMgc2V0IHRvIGxlbmllbnQsIGNoYXJhY3RlcnMgb3ZlciAweDEwRkZGRiBhcmUgY29udmVydGVkCisgICAgdG8gdGhlIHJlcGxhY2VtZW50IGNoYXJhY3Rlcjsgb3RoZXJ3aXNlICh3aGVuIHRoZSBmbGFnIGlzIHNldCB0byBzdHJpY3QpCisgICAgdGhleSBjb25zdGl0dXRlIGFuIGVycm9yLgorCisgICAgT3V0cHV0IHBhcmFtZXRlcnM6CisJVGhlIHZhbHVlICJzb3VyY2VJbGxlZ2FsIiBpcyByZXR1cm5lZCBmcm9tIHNvbWUgcm91dGluZXMgaWYgdGhlIGlucHV0CisJc2VxdWVuY2UgaXMgbWFsZm9ybWVkLiAgV2hlbiAic291cmNlSWxsZWdhbCIgaXMgcmV0dXJuZWQsIHRoZSBzb3VyY2UKKwl2YWx1ZSB3aWxsIHBvaW50IHRvIHRoZSBpbGxlZ2FsIHZhbHVlIHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtLiBFLmcuLAorCWluIFVURi04IHdoZW4gYSBzZXF1ZW5jZSBpcyBtYWxmb3JtZWQsIGl0IHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlCisJbWFsZm9ybWVkIHNlcXVlbmNlLiAgCisKKyAgICBBdXRob3I6IE1hcmsgRS4gRGF2aXMsIDE5OTQuCisgICAgUmV2IEhpc3Rvcnk6IFJpY2sgTWNHb3dhbiwgZml4ZXMgJiB1cGRhdGVzIE1heSAyMDAxLgorCQkgRml4ZXMgJiB1cGRhdGVzLCBTZXB0IDIwMDEuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUaGUgZm9sbG93aW5nIDQgZGVmaW5pdGlvbnMgYXJlIGNvbXBpbGVyLXNwZWNpZmljLgorICAgIFRoZSBDIHN0YW5kYXJkIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHdjaGFyX3QgaGFzIGF0IGxlYXN0CisgICAgMTYgYml0cywgc28gd2NoYXJfdCBpcyBubyBsZXNzIHBvcnRhYmxlIHRoYW4gdW5zaWduZWQgc2hvcnQhCisgICAgQWxsIHNob3VsZCBiZSB1bnNpZ25lZCB2YWx1ZXMgdG8gYXZvaWQgc2lnbiBleHRlbnNpb24gZHVyaW5nCisgICAgYml0IG1hc2sgJiBzaGlmdCBvcGVyYXRpb25zLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLy8gQ2hhbmdlcyBmb3IgQU5UTFIzIC0gSmltIElkbGUsIEphbnVhcnkgMjAwOC4KKy8vIGJ1aWx0aW4gdHlwZXMgZGVmaW5lZCBmb3IgVW5pY29kZSB0eXBlcyBjaGFuZ2VkIHRvCisvLyBhbGlhc2VzIGZvciB0aGUgdHlwZXMgdGhhdCBhcmUgc3lzdGVtIGRldGVybWluZWQgYnkKKy8vIEFOVExSIGF0IGNvbXBpbGUgdGltZS4KKy8vCisvLyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcJVVRGMzI7CS8qIGF0IGxlYXN0IDMyIGJpdHMgKi8KKy8vIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQJVVRGMTY7CS8qIGF0IGxlYXN0IDE2IGJpdHMgKi8KKy8vIHR5cGVkZWYgdW5zaWduZWQgY2hhcglVVEY4OwkvKiB0eXBpY2FsbHkgOCBiaXRzICovCisvLyB0eXBlZGVmIHVuc2lnbmVkIGNoYXIJQm9vbGVhbjsgLyogMCBvciAxICovCisKKyNpZm5kZWYJX0FOVExSM19DT05WRVJUVVRGX0gKKyNkZWZpbmUJX0FOVExSM19DT05WRVJUVVRGX0gKKworI2luY2x1ZGUJPGFudGxyM2RlZnMuaD4KKwordHlwZWRlZiBBTlRMUjNfVUlOVDMyCVVURjMyOwkvKiBhdCBsZWFzdCAzMiBiaXRzICovCit0eXBlZGVmIEFOVExSM19VSU5UMTYJVVRGMTY7CS8qIGF0IGxlYXN0IDE2IGJpdHMgKi8KK3R5cGVkZWYgQU5UTFIzX1VJTlQ4CVVURjg7CS8qIHR5cGljYWxseSA4IGJpdHMgKi8KKworLyogU29tZSBmdW5kYW1lbnRhbCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVU5JX1JFUExBQ0VNRU5UX0NIQVIgKFVURjMyKTB4MDAwMEZGRkQKKyNkZWZpbmUgVU5JX01BWF9CTVAgKFVURjMyKTB4MDAwMEZGRkYKKyNkZWZpbmUgVU5JX01BWF9VVEYxNiAoVVRGMzIpMHgwMDEwRkZGRgorI2RlZmluZSBVTklfTUFYX1VURjMyIChVVEYzMikweDdGRkZGRkZGCisjZGVmaW5lIFVOSV9NQVhfTEVHQUxfVVRGMzIgKFVURjMyKTB4MDAxMEZGRkYKKworI2RlZmluZSBVTklfU1VSX0hJR0hfU1RBUlQgIChVVEYzMikweEQ4MDAKKyNkZWZpbmUgVU5JX1NVUl9ISUdIX0VORCAgICAoVVRGMzIpMHhEQkZGCisjZGVmaW5lIFVOSV9TVVJfTE9XX1NUQVJUICAgKFVURjMyKTB4REMwMAorI2RlZmluZSBVTklfU1VSX0xPV19FTkQgICAgIChVVEYzMikweERGRkYKKyNkZWZpbmUgZmFsc2UJICAgICAgICAgICAgQU5UTFIzX0ZBTFNFCisjZGVmaW5lIHRydWUJICAgICAgICAgICAgQU5UTFIzX1RSVUUKKyNkZWZpbmUgaGFsZlNoaWZ0ICAgICAgICAgICAoKFVURjMyKTEwKQorI2RlZmluZSBoYWxmQmFzZSAgICAgICAgICAgICgoVVRGMzIpMHgwMDEwMDAwVUwpCisjZGVmaW5lIGhhbGZNYXNrICAgICAgICAgICAgKChVVEYzMikweDNGRlVMKQorCit0eXBlZGVmIGVudW0geworCWNvbnZlcnNpb25PSywgCQkvKiBjb252ZXJzaW9uIHN1Y2Nlc3NmdWwgKi8KKwlzb3VyY2VFeGhhdXN0ZWQsCS8qIHBhcnRpYWwgY2hhcmFjdGVyIGluIHNvdXJjZSwgYnV0IGhpdCBlbmQgKi8KKwl0YXJnZXRFeGhhdXN0ZWQsCS8qIGluc3VmZi4gcm9vbSBpbiB0YXJnZXQgZm9yIGNvbnZlcnNpb24gKi8KKwlzb3VyY2VJbGxlZ2FsCQkvKiBzb3VyY2Ugc2VxdWVuY2UgaXMgaWxsZWdhbC9tYWxmb3JtZWQgKi8KK30gQ29udmVyc2lvblJlc3VsdDsKKwordHlwZWRlZiBlbnVtIHsKKwlzdHJpY3RDb252ZXJzaW9uID0gMCwKKwlsZW5pZW50Q29udmVyc2lvbgorfSBDb252ZXJzaW9uRmxhZ3M7CisKKy8qIFRoaXMgaXMgZm9yIEMrKyBhbmQgZG9lcyBubyBoYXJtIGluIEMgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGOHRvVVRGMTYgKAorCQljb25zdCBVVEY4Kiogc291cmNlU3RhcnQsIGNvbnN0IFVURjgqIHNvdXJjZUVuZCwgCisJCVVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEY4ICgKKwkJY29uc3QgVVRGMTYqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMTYqIHNvdXJjZUVuZCwgCisJCVVURjgqKiB0YXJnZXRTdGFydCwgVVRGOCogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCQkKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjMyICgKKwkJY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsIAorCQlVVEYzMioqIHRhcmdldFN0YXJ0LCBVVEYzMiogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpOworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYzMnRvVVRGOCAoCisJCWNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsIAorCQlVVEY4KiogdGFyZ2V0U3RhcnQsIFVURjgqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKTsKKwkJCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYxNnRvVVRGMzIgKAorCQljb25zdCBVVEYxNioqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEYxNiogc291cmNlRW5kLCAKKwkJVVRGMzIqKiB0YXJnZXRTdGFydCwgVVRGMzIqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKTsKKworQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGMzJ0b1VURjE2ICgKKwkJY29uc3QgVVRGMzIqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMzIqIHNvdXJjZUVuZCwgCisJCVVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0FOVExSM19CT09MRUFOIGlzTGVnYWxVVEY4U2VxdWVuY2UoY29uc3QgVVRGOCAqc291cmNlLCBjb25zdCBVVEY4ICpzb3VyY2VFbmQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY3ljbGljZGZhLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzY3ljbGljZGZhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3MDhhMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNjeWNsaWNkZmEuaApAQCAtMCwwICsxLDk3IEBACisvLy8gRGVmaW5pdGlvbiBvZiBhIGN5Y2xpYyBkZmEgc3RydWN0dXJlIHN1Y2ggdGhhdCBpdCBjYW4gYmUKKy8vLyBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUgYW5kIGhhdmUgb25seSBhIHNpbmdsZQorLy8vIHJ1bnRpbWUgZnVuY3Rpb24gdGhhdCBjYW4gZGVhbCB3aXRoIGFsbCBjeWNsaWMgZGZhCisvLy8gc3RydWN0dXJlcyBhbmQgc2hvdyBKYXZhIGhvdyBpdCBpcyBkb25lIDstKQorLy8vCisjaWZuZGVmCUFOVExSM19DWUNMSUNERkFfSAorI2RlZmluZQlBTlRMUjNfQ1lDTElDREZBX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXJlY29nbml6ZXIuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNpbnRzdHJlYW0uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKworLy8gSWYgdGhpcyBoZWFkZXIgZmlsZSBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIGEgZ2VuZXJhdGVkIHJlY29nbml6ZXIgdGhhdAorLy8gaXMgYmVpbmcgY29tcGlsZWQgYXMgaWYgaXQgd2VyZSBDKyssIGFuZCB0aGlzIGlzIFdpbmRvd3MsIHRoZW4gdGhlIGNvbnN0IGVsZW1lbnRzCisvLyBvZiB0aGUgc3RydWN0dXJlIGNhdXNlIHRoZSBDKysgY29tcGlsZXIgdG8gKHJpZ2h0bHkpIHBvaW50IG91dCB0aGF0CisvLyB0aGVyZSBjYW4gYmUgbm8gaW5zdGFudGlhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGJlY2F1c2UgaXQgbmVlZHMgYSBjb25zdHJ1Y3RvcgorLy8gdGhhdCBjYW4gaW5pdGlhbGl6ZSB0aGUgZGF0YSwgaG93ZXZlciB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBub3QKKy8vIHVzZWZ1bCBmb3IgQysrIGFzIHRoZXkgYXJlIHByZS1nZW5lcmF0ZWQgYW5kIHN0YXRpYyBpbiB0aGUgcmVjb2duaXplci4KKy8vIFNvLCB3ZSB0dXJuIG9mZiB0aG9zZSB3YXJuaW5ncywgd2hpY2ggYXJlIG9ubHkgYXQgL1c0IGFueXdheS4KKy8vCisjaWZkZWYgQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZwkocHVzaCkKKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQ1MTApCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0NTEyKQorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDYxMCkKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEFOVExSM19DWUNMSUNfREZBX3N0cnVjdAoreworICAgIC8vLyBEZWNpc2lvbiBudW1iZXIgdGhhdCBhIHBhcnRpY3VsYXIgc3RhdGljIHN0cnVjdHVyZQorICAgIC8vLyAgcmVwcmVzZW50cy4KKyAgICAvLy8KKyAgICBjb25zdCBBTlRMUjNfSU5UMzIJCWRlY2lzaW9uTnVtYmVyOworCisgICAgLy8vIFdoYXQgdGhpcyBkZWNpc2lvbiByZXByZXNlbnRzCisgICAgLy8vCisgICAgY29uc3QgcEFOVExSM19VQ0hBUgkJZGVzY3JpcHRpb247CisKKyAgICBBTlRMUjNfSU5UMzIJCQkoKnNwZWNpYWxTdGF0ZVRyYW5zaXRpb24pICAgKHZvaWQgKiBjdHgsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgc3RydWN0IEFOVExSM19DWUNMSUNfREZBX3N0cnVjdCAqIGRmYSwgQU5UTFIzX0lOVDMyIHMpOworCisgICAgQU5UTFIzX0lOVDMyCQkJKCpzcGVjaWFsVHJhbnNpdGlvbikJICAgICh2b2lkICogY3R4LCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIHN0cnVjdCBBTlRMUjNfQ1lDTElDX0RGQV9zdHJ1Y3QgKiBkZmEsIEFOVExSM19JTlQzMiBzKTsKKworICAgIEFOVExSM19JTlQzMgkJCSgqcHJlZGljdCkJCQkJCSh2b2lkICogY3R4LCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIHN0cnVjdCBBTlRMUjNfQ1lDTElDX0RGQV9zdHJ1Y3QgKiBkZmEpOworCisgICAgY29uc3QgQU5UTFIzX0lOVDMyCQkgICAgKiBjb25zdCBlb3Q7CisgICAgY29uc3QgQU5UTFIzX0lOVDMyCQkgICAgKiBjb25zdCBlb2Y7CisgICAgY29uc3QgQU5UTFIzX0lOVDMyCQkgICAgKiBjb25zdCBtaW47CisgICAgY29uc3QgQU5UTFIzX0lOVDMyCQkgICAgKiBjb25zdCBtYXg7CisgICAgY29uc3QgQU5UTFIzX0lOVDMyCQkgICAgKiBjb25zdCBhY2NlcHQ7CisgICAgY29uc3QgQU5UTFIzX0lOVDMyCQkgICAgKiBjb25zdCBzcGVjaWFsOworICAgIGNvbnN0IEFOVExSM19JTlQzMgkJCSogY29uc3QgKiBjb25zdCB0cmFuc2l0aW9uOworCit9CisgICAgQU5UTFIzX0NZQ0xJQ19ERkE7CisKK3R5cGVkZWYgQU5UTFIzX0lOVDMyCQkoKkNERkFfU1BFQ0lBTF9GVU5DKSAgICh2b2lkICogLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiAsIHBBTlRMUjNfSU5UX1NUUkVBTSAsIHN0cnVjdCBBTlRMUjNfQ1lDTElDX0RGQV9zdHJ1Y3QgKiAsIEFOVExSM19JTlQzMik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2lmZGVmIEFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcJKHBvcCkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Y2Q2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzZGVidWdldmVudGxpc3RlbmVyLmgKQEAgLTAsMCArMSwzOTggQEAKKy8qKgorICogXGZpbGUKKyAqIFRoZSBkZWZpbml0aW9uIG9mIGFsbCBkZWJ1Z2dpbmcgZXZlbnRzIHRoYXQgYSByZWNvZ25pemVyIGNhbiB0cmlnZ2VyLgorICoKKyAqIFxyZW1hcmsKKyAqICBGcm9tIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uIGJ5IFRlcmVuY2UgUGFyci4uLgorICogIEkgZGlkIG5vdCBjcmVhdGUgYSBzZXBhcmF0ZSBBU1QgZGVidWdnaW5nIGludGVyZmFjZSBhcyBpdCB3b3VsZCBjcmVhdGUKKyAqICBsb3RzIG9mIGV4dHJhIGNsYXNzZXMgYW5kIERlYnVnUGFyc2VyIGhhcyBhIGRiZyB2YXIgZGVmaW5lZCwgd2hpY2ggbWFrZXMKKyAqICBpdCBoYXJkIHRvIGNoYW5nZSB0byBBU1REZWJ1Z0V2ZW50TGlzdGVuZXIuICBJIGxvb2tlZCBoYXJkIGF0IHRoaXMgaXNzdWUKKyAqICBhbmQgaXQgaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYXMgb25lIG1vbm9saXRoaWMgZXZlbnQgaW50ZXJmYWNlIGZvciBhbGwKKyAqICBwb3NzaWJsZSBldmVudHMuICBIb3BlZnVsbHksIGFkZGluZyBTVCBkZWJ1Z2dpbmcgc3R1ZmYgd29uJ3QgYmUgYmFkLiAgTGVhdmUKKyAqICBmb3IgZnV0dXJlLiA0LzI2LzIwMDYuCisgKi8KKworI2lmbmRlZglBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVJfSAorI2RlZmluZQlBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVJfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXRyZWUuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250b2tlbi5oPgorCisKKy8vLyBEZWZhdWx0IGRlYnVnZ2luZyBwb3J0CisvLy8KKyNkZWZpbmUgREVGQVVMVF9ERUJVR0dFUl9QT1JUCQkweEJGQ0M7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIFRoZSBBTlRMUjMgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgY29tbXVuaWNhdGluZyB3aXRoIEFOTFRSIFdvcmtzLiBGdW5jdGlvbiBjb21tZW50cworICogIG1vc3RseSB0YWtlbiBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUl9zdHJ1Y3QKK3sKKwkvLy8gVGhlIHBvcnQgbnVtYmVyIHdoaWNoIHRoZSBkZWJ1ZyBsaXN0ZW5lciBzaG91bGQgbGlzdGVuIG9uIGZvciBhIGNvbm5lY3Rpb24KKwkvLy8KKwlBTlRMUjNfVUlOVDMyCQlwb3J0OworCisJLy8vIFRoZSBzb2NrZXQgc3RydWN0dXJlIHdlIHJlY2VpdmUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGFjY2VwdCBvbiB0aGUgc2VydmVyU29ja2V0CisJLy8vCisJU09DS0VUCQkJCXNvY2tldDsKKworCS8qKiBUaGUgdmVyc2lvbiBvZiB0aGUgZGVidWdnaW5nIHByb3RvY29sIHN1cHBvcnRlZCBieSB0aGUgcHJvdmlkaW5nCisJICogIGluc3RhbmNlIG9mIHRoZSBkZWJ1ZyBldmVudCBsaXN0ZW5lci4KKwkgKi8KKwlpbnQJCQkJCVBST1RPQ09MX1ZFUlNJT047CisKKwkvLy8gVGhlIG5hbWUgb2YgdGhlIGdyYW1tYXIgZmlsZSB0aGF0IHdlIGFyZSBkZWJ1Z2dpbmcKKwkvLy8KKwlwQU5UTFIzX1NUUklORwkJZ3JhbW1hckZpbGVOYW1lOworCisJLy8vIEluZGljYXRlcyB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBjb25uZWN0ZWQgb3Igbm90CisJLy8vCisJQU5UTFIzX0JPT0xFQU4JCWluaXRpYWxpemVkOworCisJLy8vIFVzZWQgdG8gc2VyaWFsaXplIHRoZSB2YWx1ZXMgb2YgYW55IHBhcnRpY3VsYXIgdG9rZW4gd2UgbmVlZCB0bworCS8vLyBzZW5kIGJhY2sgdG8gdGhlIGRlYnVnZ2VyLgorCS8vLworCXBBTlRMUjNfU1RSSU5HCQl0b2tlblN0cmluZzsKKworCisJLy8vIEFsbG93cyB0aGUgZGVidWcgZXZlbnQgc3lzdGVtIHRvIGFjY2VzcyB0aGUgYWRhcHRlciBpbiB1c2UKKwkvLy8gYnkgdGhlIHJlY29nbml6ZXIsIGlmIHRoaXMgaXMgYSB0cmVlIHBhcnNlciBvZiBzb21lIHNvcnQuCisJLy8vCisJcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUglhZGFwdG9yOworCisJLy8vIFdhaXQgZm9yIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBkZWJ1Z2dlciBhbmQgaW5pdGlhdGUgdGhlCisJLy8vIGRlYnVnZ2luZyBzZXNzaW9uLgorCS8vLworCUFOVExSM19CT09MRUFOCSgqaGFuZHNoYWtlKQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KTsKKworCS8qKiBUaGUgcGFyc2VyIGhhcyBqdXN0IGVudGVyZWQgYSBydWxlLiAgTm8gZGVjaXNpb24gaGFzIGJlZW4gbWFkZSBhYm91dAorCSAqICB3aGljaCBhbHQgaXMgcHJlZGljdGVkLiAgVGhpcyBpcyBmaXJlZCBBRlRFUiBpbml0IGFjdGlvbnMgaGF2ZSBiZWVuCisJICogIGV4ZWN1dGVkLiAgQXR0cmlidXRlcyBhcmUgZGVmaW5lZCBhbmQgYXZhaWxhYmxlIGV0Yy4uLgorCSAqLworCXZvaWQJCQkoKmVudGVyUnVsZSkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgY29uc3QgY2hhciAqIGdyYW1tYXJGaWxlTmFtZSwgY29uc3QgY2hhciAqIHJ1bGVOYW1lKTsKKworCS8qKiBCZWNhdXNlIHJ1bGVzIGNhbiBoYXZlIGxvdHMgb2YgYWx0ZXJuYXRpdmVzLCBpdCBpcyB2ZXJ5IHVzZWZ1bCB0bworCSAqICBrbm93IHdoaWNoIGFsdCB5b3UgYXJlIGVudGVyaW5nLiAgVGhpcyBpcyAxLi5uIGZvciBuIGFsdHMuCisJICovCisJdm9pZAkJCSgqZW50ZXJBbHQpCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgYWx0KTsKKworCS8qKiBUaGlzIGlzIHRoZSBsYXN0IHRoaW5nIGV4ZWN1dGVkIGJlZm9yZSBsZWF2aW5nIGEgcnVsZS4gIEl0IGlzCisJICogIGV4ZWN1dGVkIGV2ZW4gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4gIFRoaXMgaXMgdHJpZ2dlcmVkIGFmdGVyCisJICogIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaGF2ZSBvY2N1cnJlZCAodW5sZXNzIHRoZSBleGNlcHRpb24gaXMKKwkgKiAgbm90IGNhdWdodCBpbiB0aGlzIHJ1bGUpLiAgVGhpcyBpbXBsaWVzIGFuICJleGl0QWx0IiBldmVudC4KKwkgKi8KKwl2b2lkCQkJKCpleGl0UnVsZSkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGNvbnN0IGNoYXIgKiBncmFtbWFyRmlsZU5hbWUsIGNvbnN0IGNoYXIgKiBydWxlTmFtZSk7CisKKwkvKiogVHJhY2sgZW50cnkgaW50byBhbnkgKC4uLikgc3VicnVsZSBvdGhlciBFQk5GIGNvbnN0cnVjdCAKKwkgKi8KKwl2b2lkCQkJKCplbnRlclN1YlJ1bGUpCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBkZWNpc2lvbk51bWJlcik7CisJCisJdm9pZAkJCSgqZXhpdFN1YlJ1bGUpCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBkZWNpc2lvbk51bWJlcik7CisKKwkvKiogRXZlcnkgZGVjaXNpb24sIGZpeGVkIGsgb3IgYXJiaXRyYXJ5LCBoYXMgYW4gZW50ZXIvZXhpdCBldmVudAorCSAqICBzbyB0aGF0IGEgR1VJIGNhbiBlYXNpbHkgdHJhY2sgd2hhdCBMVC9jb25zdW1lIGV2ZW50cyBhcmUKKwkgKiAgYXNzb2NpYXRlZCB3aXRoIHByZWRpY3Rpb24uICBZb3Ugd2lsbCBzZWUgYSBzaW5nbGUgZW50ZXIvZXhpdAorCSAqICBzdWJydWxlIGJ1dCBtdWx0aXBsZSBlbnRlci9leGl0IGRlY2lzaW9uIGV2ZW50cywgb25lIGZvciBlYWNoCisJICogIGxvb3AgaXRlcmF0aW9uLgorCSAqLworCXZvaWQJCQkoKmVudGVyRGVjaXNpb24pCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGRlY2lzaW9uTnVtYmVyKTsKKworCXZvaWQJCQkoKmV4aXREZWNpc2lvbikJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGRlY2lzaW9uTnVtYmVyKTsKKworCS8qKiBBbiBpbnB1dCB0b2tlbiB3YXMgY29uc3VtZWQ7IG1hdGNoZWQgYnkgYW55IGtpbmQgb2YgZWxlbWVudC4KKwkgKiAgVHJpZ2dlciBhZnRlciB0aGUgdG9rZW4gd2FzIG1hdGNoZWQgYnkgdGhpbmdzIGxpa2UgbWF0Y2goKSwgbWF0Y2hBbnkoKS4KKwkgKi8KKwl2b2lkCQkJKCpjb25zdW1lVG9rZW4pCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHQpOworCisJLyoqIEFuIG9mZi1jaGFubmVsIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZC4KKwkgKiAgVHJpZ2dlciBhZnRlciB0aGUgdG9rZW4gd2FzIG1hdGNoZWQgYnkgdGhpbmdzIGxpa2UgbWF0Y2goKSwgbWF0Y2hBbnkoKS4KKwkgKiAgKHVubGVzcyBvZiBjb3Vyc2UgdGhlIGhpZGRlbiB0b2tlbiBpcyBmaXJzdCBzdHVmZiBpbiB0aGUgaW5wdXQgc3RyZWFtKS4KKwkgKi8KKwl2b2lkCQkJKCpjb25zdW1lSGlkZGVuVG9rZW4pCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19DT01NT05fVE9LRU4gdCk7CisKKwkvKiogU29tZWJvZHkgKGFueWJvZHkpIGxvb2tlZCBhaGVhZC4gIE5vdGUgdGhhdCB0aGlzIGFjdHVhbGx5IGdldHMKKwkgKiAgdHJpZ2dlcmVkIGJ5IGJvdGggTEEgYW5kIExUIGNhbGxzLiAgVGhlIGRlYnVnZ2VyIHdpbGwgd2FudCB0byBrbm93CisJICogIHdoaWNoIFRva2VuIG9iamVjdCB3YXMgZXhhbWluZWQuICBMaWtlIGNvbnN1bWVUb2tlbiwgdGhpcyBpbmRpY2F0ZXMKKwkgKiAgd2hhdCB0b2tlbiB3YXMgc2VlbiBhdCB0aGF0IGRlcHRoLiAgQSByZW1vdGUgZGVidWdnZXIgY2Fubm90IGxvb2sKKwkgKiAgYWhlYWQgaW50byBhIGZpbGUgaXQgZG9lc24ndCBoYXZlIHNvIExUIGV2ZW50cyBtdXN0IHBhc3MgdGhlIHRva2VuCisJICogIGV2ZW4gaWYgdGhlIGluZm8gaXMgcmVkdW5kYW50LgorCSAqLworCXZvaWQJCQkoKkxUKQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBpLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiB0KTsKKworCS8qKiBUaGUgcGFyc2VyIGlzIGdvaW5nIHRvIGxvb2sgYXJiaXRyYXJpbHkgYWhlYWQ7IG1hcmsgdGhpcyBsb2NhdGlvbiwKKwkgKiAgdGhlIHRva2VuIHN0cmVhbSdzIG1hcmtlciBpcyBzZW50IGluIGNhc2UgeW91IG5lZWQgaXQuCisJICovCisJdm9pZAkJCSgqbWFyaykJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBBTlRMUjNfTUFSS0VSIG1hcmtlcik7CisKKwkvKiogQWZ0ZXIgYW4gYXJiaXRyYXJpbHkgbG9uZyBsb29rYWhlYWQgYXMgd2l0aCBhIGN5Y2xpYyBERkEgKG9yIHdpdGgKKwkgKiAgYW55IGJhY2t0cmFjayksIHRoaXMgaW5mb3JtcyB0aGUgZGVidWdnZXIgdGhhdCBzdHJlYW0gc2hvdWxkIGJlCisJICogIHJld291bmQgdG8gdGhlIHBvc2l0aW9uIGFzc29jaWF0ZWQgd2l0aCBtYXJrZXIuCisJICovCisJdm9pZAkJCSgqcmV3aW5kKQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgQU5UTFIzX01BUktFUiBtYXJrZXIpOworCisJLyoqIFJld2luZCB0byB0aGUgaW5wdXQgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWFya2VyLgorCSAqICBVc2VkIGN1cnJlbnRseSBvbmx5IGFmdGVyIGEgY3ljbGljIERGQSBhbmQganVzdAorCSAqICBiZWZvcmUgc3RhcnRpbmcgYSBzZW0vc3luIHByZWRpY2F0ZSB0byBnZXQgdGhlCisJICogIGlucHV0IHBvc2l0aW9uIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkZWNpc2lvbi4KKwkgKiAgRG8gbm90ICJwb3AiIHRoZSBtYXJrZXIgb2ZmIHRoZSBzdGF0ZS4gIG1hcmsoaSkKKwkgKiAgYW5kIHJld2luZChpKSBzaG91bGQgYmFsYW5jZSBzdGlsbC4KKwkgKi8KKwl2b2lkCQkJKCpyZXdpbmRMYXN0KQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KTsKKworCXZvaWQJCQkoKmJlZ2luQmFja3RyYWNrKQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBsZXZlbCk7CisKKwl2b2lkCQkJKCplbmRCYWNrdHJhY2spCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBsZXZlbCwgQU5UTFIzX0JPT0xFQU4gc3VjY2Vzc2Z1bCk7CisKKwkvKiogVG8gd2F0Y2ggYSBwYXJzZXIgbW92ZSB0aHJvdWdoIHRoZSBncmFtbWFyLCB0aGUgcGFyc2VyIG5lZWRzIHRvCisJICogIGluZm9ybSB0aGUgZGVidWdnZXIgd2hhdCBsaW5lL2NoYXJQb3MgaXQgaXMgcGFzc2luZyBpbiB0aGUgZ3JhbW1hci4KKwkgKiAgRm9yIG5vdywgdGhpcyBkb2VzIG5vdCBrbm93IGhvdyB0byBzd2l0Y2ggZnJvbSBvbmUgZ3JhbW1hciB0byB0aGUKKwkgKiAgb3RoZXIgYW5kIGJhY2sgZm9yIGlzbGFuZCBncmFtbWFycyBldGMuLi4KKwkgKgorCSAqICBUaGlzIHNob3VsZCBhbHNvIGFsbG93IGJyZWFrcG9pbnRzIGJlY2F1c2UgdGhlIGRlYnVnZ2VyIGNhbiBzdG9wCisJICogIHRoZSBwYXJzZXIgd2hlbmV2ZXIgaXQgaGl0cyB0aGlzIGxpbmUvcG9zLgorCSAqLworCXZvaWQJCQkoKmxvY2F0aW9uKQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGxpbmUsIGludCBwb3MpOworCisJLyoqIEEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFeGNlcHRpb24uICBJIG1hZGUKKwkgKiAgdGhpcyBhIGdlbmVyaWMgZXZlbnQgc28gdGhhdCBJIGNhbiBhbHRlciB0aGUgZXhjZXB0aW9uIGhpZXJhcmNoeSBsYXRlcgorCSAqICB3aXRob3V0IGhhdmluZyB0byBhbHRlciBhbGwgdGhlIGRlYnVnIG9iamVjdHMuCisJICoKKwkgKiAgVXBvbiBlcnJvciwgdGhlIHN0YWNrIG9mIGVudGVyIHJ1bGUvc3VicnVsZSBtdXN0IGJlIHByb3Blcmx5IHVud291bmQuCisJICogIElmIG5vIHZpYWJsZSBhbHQgb2NjdXJzIGl0IGlzIHdpdGhpbiBhbiBlbnRlci9leGl0IGRlY2lzaW9uLCB3aGljaAorCSAqICBhbHNvIG11c3QgYmUgcmV3b3VuZC4gIEV2ZW4gdGhlIHJld2luZCBmb3IgZWFjaCBtYXJrIG11c3QgYmUgdW53b3VuZC4KKwkgKiAgSW4gdGhlIEphdmEgdGFyZ2V0IHRoaXMgaXMgcHJldHR5IGVhc3kgdXNpbmcgdHJ5L2ZpbmFsbHksIGlmIGEgYml0CisJICogIHVnbHkgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVGhlIHJld2luZCBpcyBnZW5lcmF0ZWQgaW4gREZBLnByZWRpY3QoKQorCSAqICBhY3R1YWxseSBzbyBubyBjb2RlIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBmb3IgdGhhdC4gIEZvciBsYW5ndWFnZXMKKwkgKiAgdy9vIHRoaXMgImZpbmFsbHkiIGZlYXR1cmUgKEMrKz8pLCB0aGUgdGFyZ2V0IGltcGxlbWVudG9yIHdpbGwgaGF2ZQorCSAqICB0byBidWlsZCBhbiBldmVudCBzdGFjayBvciBzb21ldGhpbmcuCisJICoKKwkgKiAgQWNyb3NzIGEgc29ja2V0IGZvciByZW1vdGUgZGVidWdnaW5nLCBvbmx5IHRoZSBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorCSAqICBkYXRhIGZpZWxkcyBhcmUgdHJhbnNtaXR0ZWQuICBUaGUgdG9rZW4gb2JqZWN0IG9yIHdoYXRldmVyIHRoYXQKKwkgKiAgY2F1c2VkIHRoZSBwcm9ibGVtIHdhcyB0aGUgbGFzdCBvYmplY3QgcmVmZXJlbmNlZCBieSBMVC4gIFRoZQorCSAqICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgTFQgZXZlbnQgc2hvdWxkIGhvbGQgdGhlIHVuZXhwZWN0ZWQgVG9rZW4gb3IKKwkgKiAgY2hhci4KKwkgKgorCSAqICBIZXJlIGlzIGEgc2FtcGxlIGV2ZW50IHRyYWNlIGZvciBncmFtbWFyOgorCSAqCisJICogIGIgOiBDICh7O31BfEIpIC8vIHs7fSBpcyB0aGVyZSB0byBwcmV2ZW50IEF8QiBiZWNvbWluZyBhIHNldAorICAgICAqICAgIHwgRAorICAgICAqICAgIDsKKyAgICAgKgorCSAqICBUaGUgc2VxdWVuY2UgZm9yIHRoaXMgcnVsZSAod2l0aCBubyB2aWFibGUgYWx0IGluIHRoZSBzdWJydWxlKSBmb3IKKwkgKiAgaW5wdXQgJ2MgYycgKHRoZXJlIGFyZSAzIHRva2VucykgaXM6CisJICoKKwkgKgkJY29tbWVuY2UKKwkgKgkJTFQoMSkKKwkgKgkJZW50ZXJSdWxlIGIKKwkgKgkJbG9jYXRpb24gNyAxCisJICoJCWVudGVyIGRlY2lzaW9uIDMKKwkgKgkJTFQoMSkKKwkgKgkJZXhpdCBkZWNpc2lvbiAzCisJICoJCWVudGVyQWx0MQorCSAqCQlsb2NhdGlvbiA3IDUKKwkgKgkJTFQoMSkKKwkgKgkJY29uc3VtZVRva2VuIFtjLzw0PiwxOjBdCisJICoJCWxvY2F0aW9uIDcgNworCSAqCQllbnRlclN1YlJ1bGUgMgorCSAqCQllbnRlciBkZWNpc2lvbiAyCisJICoJCUxUKDEpCisJICoJCUxUKDEpCisJICoJCXJlY29nbml0aW9uRXhjZXB0aW9uIE5vVmlhYmxlQWx0RXhjZXB0aW9uIDIgMSAyCisJICoJCWV4aXQgZGVjaXNpb24gMgorCSAqCQlleGl0U3ViUnVsZSAyCisJICoJCWJlZ2luUmVzeW5jCisJICoJCUxUKDEpCisJICoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMToxXQorCSAqCQlMVCgxKQorCSAqCQllbmRSZXN5bmMKKwkgKgkJTFQoLTEpCisJICoJCWV4aXRSdWxlIGIKKwkgKgkJdGVybWluYXRlCisJICovCisJdm9pZAkJCSgqcmVjb2duaXRpb25FeGNlcHRpb24pCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19FWENFUFRJT04gZSk7CisKKwkvKiogSW5kaWNhdGVzIHRoZSByZWNvZ25pemVyIGlzIGFib3V0IHRvIGNvbnN1bWUgdG9rZW5zIHRvIHJlc3luY2hyb25pemUKKwkgKiAgdGhlIHBhcnNlci4gIEFueSBjb25zdW1lIGV2ZW50cyBmcm9tIGhlcmUgdW50aWwgdGhlIHJlY292ZXJlZCBldmVudAorCSAqICBhcmUgbm90IHBhcnQgb2YgdGhlIHBhcnNlLS10aGV5IGFyZSBkZWFkIHRva2Vucy4KKwkgKi8KKwl2b2lkCQkJKCpiZWdpblJlc3luYykJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpOworCisJLyoqIEluZGljYXRlcyB0aGF0IHRoZSByZWNvZ25pemVyIGhhcyBmaW5pc2hlZCBjb25zdW1pbmcgdG9rZW5zIGluIG9yZGVyCisJICogIHRvIHJlc3luY2hyb25pemUuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXJzCisJICogIGJlZm9yZSB0aGUgcmVjb2duaXplciBjb21lcyBvdXQgb2YgZXJyb3JSZWNvdmVyeSBtb2RlIChpbiB3aGljaAorCSAqICBtdWx0aXBsZSBlcnJvcnMgYXJlIHN1cHByZXNzZWQpLiAgVGhpcyB3aWxsIGJlIHVzZWZ1bAorCSAqICBpbiBhIGd1aSB3aGVyZSB5b3Ugd2FudCB0byBwcm9iYWJseSBncmV5IG91dCB0b2tlbnMgdGhhdCBhcmUgY29uc3VtZWQKKwkgKiAgYnV0IG5vdCBtYXRjaGVkIHRvIGFueXRoaW5nIGluIGdyYW1tYXIuICBBbnl0aGluZyBiZXR3ZWVuCisJICogIGEgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXIgd2FzIHRvc3NlZCBvdXQgYnkgdGhlIHBhcnNlci4KKwkgKi8KKwl2b2lkCQkJKCplbmRSZXN5bmMpCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KTsKKworCS8qKiBBIHNlbWFudGljIHByZWRpY2F0ZSB3YXMgZXZhbHVhdGUgd2l0aCB0aGlzIHJlc3VsdCBhbmQgYWN0aW9uIHRleHQgCisJKi8KKwl2b2lkCQkJKCpzZW1hbnRpY1ByZWRpY2F0ZSkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBBTlRMUjNfQk9PTEVBTiByZXN1bHQsIGNvbnN0IGNoYXIgKiBwcmVkaWNhdGUpOworCisJLyoqIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKwkgKiAgc2VuZGluZyBldmVudHMgb3ZlciBhIHNvY2tldC4gIEEgR1VJIGZvciBleGFtcGxlIHdpbGwgbGF1bmNoIGEgdGhyZWFkCisJICogIHRvIGNvbm5lY3QgYW5kIGNvbW11bmljYXRlIHdpdGggYSByZW1vdGUgcGFyc2VyLiAgVGhlIHRocmVhZCB3aWxsIHdhbnQKKwkgKiAgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKwkgKiAgdHJpZ2dlciB0aGlzIHVwb24gZW50cnkgdG8gdGhlIGZpcnN0IHJ1bGUgKHRoZSBydWxlTGV2ZWwgaXMgdXNlZCB0bworCSAqICBmaWd1cmUgdGhpcyBvdXQpLgorCSAqLworCXZvaWQJCQkoKmNvbW1lbmNlKQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpOworCisJLyoqIFBhcnNpbmcgaXMgb3Zlcjsgc3VjY2Vzc2Z1bGx5IG9yIG5vdC4gIE1vc3RseSB1c2VmdWwgZm9yIHRlbGxpbmcKKwkgKiAgcmVtb3RlIGRlYnVnZ2luZyBsaXN0ZW5lcnMgdGhhdCBpdCdzIHRpbWUgdG8gcXVpdC4gIFdoZW4gdGhlIHJ1bGUKKwkgKiAgaW52b2NhdGlvbiBsZXZlbCBnb2VzIHRvIHplcm8gYXQgdGhlIGVuZCBvZiBhIHJ1bGUsIHdlIGFyZSBkb25lCisJICogIHBhcnNpbmcuCisJICovCisJdm9pZAkJCSgqdGVybWluYXRlKQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSk7CisKKwkvLy8gUmV0cmlldmUgYWNrbm93bGVkZ2UgcmVzcG9uc2UgZnJvbSB0aGUgZGVidWdnZXIuIGluIGZhY3QgdGhpcworCS8vLyByZXNwb25zZSBpcyBuZXZlciB1c2VkIGF0IHRoZSBtb21lbnQuIFNvIHdlIGp1c3QgcmVhZCB3aGF0ZXZlcgorCS8vLyBpcyBpbiB0aGUgc29ja2V0IGJ1ZmZlciBhbmQgdGhyb3cgaXQgYXdheS4KKwkvLy8KKwl2b2lkCQkJKCphY2spCQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpOworCisJLy8gVCByIGUgZSAgUCBhIHIgcyBpIG4gZworCisJLyoqIElucHV0IGZvciBhIHRyZWUgcGFyc2VyIGlzIGFuIEFTVCwgYnV0IHdlIGtub3cgbm90aGluZyBmb3Igc3VyZQorCSAqICBhYm91dCBhIG5vZGUgZXhjZXB0IGl0cyB0eXBlIGFuZCB0ZXh0IChvYnRhaW5lZCBmcm9tIHRoZSBhZGFwdG9yKS4KKwkgKiAgVGhpcyBpcyB0aGUgYW5hbG9nIG9mIHRoZSBjb25zdW1lVG9rZW4gbWV0aG9kLiAgVGhlIElEIGlzIHVzdWFsbHkgCisJICogIHRoZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgbm9kZS4KKwkgKiAgSWYgdGhlIHR5cGUgaXMgVVAgb3IgRE9XTiwgdGhlbgorCSAqICB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisJICogIGp1c3Qgb25lIFVQIG5vZGUgYW5kIG9uZSBET1dOIG5hdmlnYXRpb24gbm9kZS4KKwkgKgorCSAqICBOb3RlIHRoYXQgdW5saWtlIHRoZSBKYXZhIHZlcnNpb24sIHRoZSBub2RlIHR5cGUgb2YgdGhlIEMgcGFyc2VycworCSAqICBpcyBhbHdheXMgZml4ZWQgYXMgcEFOVExSM19CQVNFX1RSRUUgYmVjYXVzZSBhbGwgc3VjaCBzdHJ1Y3R1cmVzCisJICogIGNvbnRhaW4gYSBzdXBlciBwb2ludGVyIHRvIHRoZWlyIHBhcmVudCwgd2hpY2ggaXMgZ2VuZXJhbGx5IENPTU1PTl9UUkVFIGFuZCB3aXRoaW4KKwkgKiAgdGhhdCB0aGVyZSBpcyBhIHN1cGVyIHBvaW50ZXIgdGhhdCBjYW4gcG9pbnQgdG8gYSB1c2VyIHR5cGUgdGhhdCBlbmNhcHN1bGF0ZXMgaXQuCisJICogIEFsbW9zdCBha2luIHRvIHNheWluZyB0aGF0IGl0IGlzIGFuIGludGVyZmFjZSBwb2ludGVyIGV4Y2VwdCB3ZSBkb24ndCBuZWVkIHRvCisJICogIGtub3cgd2hhdCB0aGUgaW50ZXJmYWNlIGlzIGluIGZ1bGwsIGp1c3QgdGhvc2UgYml0cyB0aGF0IGFyZSB0aGUgYmFzZS4KKwkgKiBAcGFyYW0gdAorCSAqLworCXZvaWQJCQkoKmNvbnN1bWVOb2RlKQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKKwkvKiogVGhlIHRyZWUgcGFyc2VyIGxvb2tlZCBhaGVhZC4gIElmIHRoZSB0eXBlIGlzIFVQIG9yIERPV04sCisJICogIHRoZW4gdGhlIElEIGlzIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCBhcyBpdCdzIGZpeGVkLS10aGVyZSBpcworCSAqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisJICovCisJdm9pZAkJCSgqTFRUKQkJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgaSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKKworCS8vIEEgUyBUICBFIHYgZSBuIHQgcworCisJLyoqIEEgbmlsIHdhcyBjcmVhdGVkIChldmVuIG5pbCBub2RlcyBoYXZlIGEgdW5pcXVlIElELi4uCisJICogIHRoZXkgYXJlIG5vdCAibnVsbCIgcGVyIHNlKS4gIEFzIG9mIDQvMjgvMjAwNiwgdGhpcworCSAqICBzZWVtcyB0byBiZSB1bmlxdWVseSB0cmlnZ2VyZWQgd2hlbiBzdGFydGluZyBhIG5ldyBzdWJ0cmVlCisJICogIHN1Y2ggYXMgd2hlbiBlbnRlcmluZyBhIHN1YnJ1bGUgaW4gYXV0b21hdGljIG1vZGUgYW5kIHdoZW4KKwkgKiAgYnVpbGRpbmcgYSB0cmVlIGluIHJld3JpdGUgbW9kZS4KKyAgICAgKgorIAkgKiAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorCSAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHQuSUQgaXMgc2V0LgorCSAqLworCXZvaWQJCQkoKm5pbE5vZGUpCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKKwkvKiogSWYgYSBzeW50YXggZXJyb3Igb2NjdXJzLCByZWNvZ25pemVycyBicmFja2V0IHRoZSBlcnJvcgorCSAqICB3aXRoIGFuIGVycm9yIG5vZGUgaWYgdGhleSBhcmUgYnVpbGRpbmcgQVNUcy4gVGhpcyBldmVudAorCSAqICBub3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCB0aGlzIGlzIHRoZSBjYXNlCisJICovCisJdm9pZAkJCSgqZXJyb3JOb2RlKQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKKwkvKiogQW5ub3VuY2UgYSBuZXcgbm9kZSBidWlsdCBmcm9tIHRva2VuIGVsZW1lbnRzIHN1Y2ggYXMgdHlwZSBldGMuLi4KKwkgKiAKKwkgKiAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorCSAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHQuSUQsIHR5cGUsIHRleHQgYXJlCisJICogIHNldC4KKwkgKi8KKwl2b2lkCQkJKCpjcmVhdGVOb2RlKQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKKwkvKiogQW5ub3VuY2UgYSBuZXcgbm9kZSBidWlsdCBmcm9tIGFuIGV4aXN0aW5nIHRva2VuLgorCSAqCisJICogIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKwkgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSBub2RlLklEIGFuZCB0b2tlbi50b2tlbkluZGV4CisJICogIGFyZSBzZXQuCisJICovCisJdm9pZAkJCSgqY3JlYXRlTm9kZVRvaykJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgbm9kZSwgcEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworCisJLyoqIE1ha2UgYSBub2RlIHRoZSBuZXcgcm9vdCBvZiBhbiBleGlzdGluZyByb290LiAgU2VlCisJICoKKwkgKiAgTm90ZTogdGhlIG5ld1Jvb3RJRCBwYXJhbWV0ZXIgaXMgcG9zc2libHkgZGlmZmVyZW50CisJICogIHRoYW4gdGhlIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBuZXdSb290IHBhcmFtZXRlci4KKwkgKiAgSW4gb3VyIGNhc2UsIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZworCSAqICBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgYW5kIG5vdCByb290X24gb3Igd2hhdGV2ZXIuCisJICoKKwkgKiAgVGhlIGxpc3RlbmVyIHNob3VsZCBhc3N1bWUgdGhhdCB0aGlzIGV2ZW50IG9jY3VycworCSAqICBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgc3VicnVsZSAob3IgcnVsZSkgc3VidHJlZSBpcworCSAqICBiZWluZyByZXNldCB0byBuZXdSb290SUQuCisJICogCisJICogIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKwkgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSBJRHMgYXJlIHNldC4KKwkgKgorCSAqICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3IuYmVjb21lUm9vdCgpCisJICovCisJdm9pZAkJCSgqYmVjb21lUm9vdCkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIG5ld1Jvb3QsIHBBTlRMUjNfQkFTRV9UUkVFIG9sZFJvb3QpOworCisJLyoqIE1ha2UgY2hpbGRJRCBhIGNoaWxkIG9mIHJvb3RJRC4KKwkgKgorCSAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisJICogIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgSURzIGFyZSBzZXQuCisJICogCisJICogIEBzZWUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvci5hZGRDaGlsZCgpCisJICovCisJdm9pZAkJCSgqYWRkQ2hpbGQpCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgcm9vdCwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpOworCisJLyoqIFNldCB0aGUgdG9rZW4gc3RhcnQvc3RvcCB0b2tlbiBpbmRleCBmb3IgYSBzdWJ0cmVlIHJvb3Qgb3Igbm9kZS4KKwkgKgorCSAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisJICogIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgdC5JRCBpcyBzZXQuCisJICovCisJdm9pZAkJCSgqc2V0VG9rZW5Cb3VuZGFyaWVzKQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19NQVJLRVIgdG9rZW5TdGFydEluZGV4LCBBTlRMUjNfTUFSS0VSIHRva2VuU3RvcEluZGV4KTsKKworCS8vLyBGcmVlIHVwIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIHRoaXMgc3RydWN0dXJlCisJLy8vCisJdm9pZAkJCSgqZnJlZSkJCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSk7CisKK30KKwlBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVI7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzZGVmcy5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM1YjAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2RlZnMuaApAQCAtMCwwICsxLDYzMiBAQAorLyoqIFxmaWxlCisgKiBCYXNpYyB0eXBlIGFuZCBjb25zdGFudCBkZWZpbml0aW9ucyBmb3IgQU5UTFIzIFJ1bnRpbWUuCisgKi8KKyNpZm5kZWYJX0FOVExSM0RFRlNfSAorI2RlZmluZQlfQU5UTFIzREVGU19ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLyogRm9sbG93aW5nIGFyZSBmb3IgZ2VuZXJhdGVkIGNvZGUsIHRoZXkgYXJlIG5vdCByZWZlcmVuY2VkIGludGVybmFsbHkhISEKKyAqLworI2lmICFkZWZpbmVkKEFOVExSM19IVUdFKSAmJiAhZGVmaW5lZChBTlRMUjNfQVZFUkFHRSkgJiYgIWRlZmluZWQoQU5UTFIzX1NNQUxMKQorI2RlZmluZQlBTlRMUjNfQVZFUkFHRQorI2VuZGlmCisKKyNpZmRlZglBTlRMUjNfSFVHRQorI2lmbmRlZglBTlRMUjNfU0laRV9ISU5UCisjZGVmaW5lCUFOVExSM19TSVpFX0hJTlQgICAgICAgIDIwNDkKKyNlbmRpZgorI2lmbmRlZglBTlRMUjNfTElTVF9TSVpFX0hJTlQKKyNkZWZpbmUJQU5UTFIzX0xJU1RfU0laRV9ISU5UICAgMTI3CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJQU5UTFIzX0FWRVJBR0UKKyNpZm5kZWYJQU5UTFIzX1NJWkVfSElOVAorI2RlZmluZQlBTlRMUjNfU0laRV9ISU5UICAgICAgICAxMDI1CisjZGVmaW5lCUFOVExSM19MSVNUX1NJWkVfSElOVCAgIDYzCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJQU5UTFIzX1NNQUxMCisjaWZuZGVmCUFOVExSM19TSVpFX0hJTlQKKyNkZWZpbmUJQU5UTFIzX1NJWkVfSElOVCAgICAgICAgMjExCisjZGVmaW5lCUFOVExSM19MSVNUX1NJWkVfSElOVCAgIDMxCisjZW5kaWYKKyNlbmRpZgorCisvLyBEZWZpbml0aW9ucyB0aGF0IGluZGljYXRlIHRoZSBlbmNvZGluZyBzY2hlbWUgY2hhcmFjdGVyIHN0cmVhbXMgYW5kIHN0cmluZ3MgZXRjCisvLworLy8vIEluZGljYXRlcyBCaWcgRW5kaWFuIGZvciBlbmNvZGluZ3Mgd2hlcmUgdGhpcyBtYWtlcyBzZW5zZQorLy8vCisjZGVmaW5lIEFOVExSM19CRSAgICAgICAgICAgMQorCisvLy8gSW5kaWNhdGVzIExpdHRsZSBFbmRpYW4gZm9yIGVuY29pZG5ncyB3aGVyZSB0aGlzIG1ha2VzIHNlbnNlCisvLy8KKyNkZWZpbmUgQU5UTFIzX0xFICAgICAgICAgICAyCisKKy8vLyBHZW5lcmFsIGxhdGluLTEgb3Igb3RoZXIgOCBiaXQgZW5jb2Rpbmcgc2NoZW1lIHN1Y2ggYXMgc3RyYWlnaHQgQVNDSUkKKy8vLworI2RlZmluZSBBTlRMUjNfRU5DXzhCSVQgICAgIDQKKworLy8vIFVURi04IGVuY29kaW5nIHNjaGVtZQorLy8vCisjZGVmaW5lIEFOVExSM19FTkNfVVRGOCAgICAgOAorCisvLy8gVVRGLTE2IGVuY29kaW5nIHNjaGVtZSAod2hpY2ggYWxzbyBjb3ZlcnMgVUNTMiBhcyB0aGF0IGRvZXMgbm90IGhhdmUgc3Vycm9nYXRlcykKKy8vLworI2RlZmluZSBBTlRMUjNfRU5DX1VURjE2ICAgICAgICAxNgorI2RlZmluZSBBTlRMUjNfRU5DX1VURjE2QkUgICAgICAxNiArIEFOVExSM19CRQorI2RlZmluZSBBTlRMUjNfRU5DX1VURjE2TEUgICAgICAxNiArIEFOVExSM19MRQorCisvLy8gVVRGLTMyIGVuY29kaW5nIHNjaGVtZSAoYmFzaWNhbGx5IHN0cmFpZ2h0IDMyIGJpdCkKKy8vLworI2RlZmluZSBBTlRMUjNfRU5DX1VURjMyICAgICAgICAzMgorI2RlZmluZSBBTlRMUjNfRU5DX1VURjMyQkUgICAgICAzMiArIEFOVExSM19CRQorI2RlZmluZSBBTlRMUjNfRU5DX1VURjMyTEUgICAgICAzMiArIEFOVExSM19MRQorCisvLy8gSW5wdXQgaXMgOCBiaXQgRUJDRElDICh3aGljaCB3ZSBjb252ZXJ0IHRvIDggYml0IEFTQ0lJIG9uIHRoZSBmbHkKKy8vLworI2RlZmluZSBBTlRMUjNfRU5DX0VCQ0RJQyAgICAgICA2NAorCisvKiBDb21tb24gZGVmaW5pdGlvbnMgY29tZSBmaXJzdAorICovCisjaW5jbHVkZSAgICA8YW50bHIzZXJyb3JzLmg+CisKKy8qIFdvcmsgb3V0IHdoYXQgb3BlcmF0aW5nIHN5c3RlbS9jb21waWxlciB0aGlzIGlzLiBXZSBqdXN0IGRvIHRoaXMgb25jZQorICogaGVyZSBhbmQgdXNlIGFuIGludGVybmFsIHN5bWJvbCBhZnRlciB0aGlzLgorICovCisjaWZkZWYJX1dJTjY0CisKKyMgaWZuZGVmCUFOVExSM19XSU5ET1dTCisjICAgZGVmaW5lCUFOVExSM19XSU5ET1dTCisjIGVuZGlmCisjIGRlZmluZQlBTlRMUjNfV0lONjQKKyMgZGVmaW5lCUFOVExSM19VU0VfNjRCSVQKKworI2Vsc2UKKworI2lmZGVmCV9XSU4zMgorIyBpZm5kZWYJQU5UTFIzX1dJTkRPV1MKKyMgIGRlZmluZQlBTlRMUjNfV0lORE9XUworIyBlbmRpZgorCisjZGVmaW5lCUFOVExSM19XSU4zMgorI2VuZGlmCisKKyNlbmRpZgorCisjaWZkZWYJQU5UTFIzX1dJTkRPV1MgCisKKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZQlXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworLyogQWxsb3cgVkMgOCAodnMyMDA1KSBhbmQgYWJvdmUgdG8gdXNlICdzZWN1cmUnIHZlcnNpb25zIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHN1Y2ggYXMgc3ByaW50ZgorICovCisjaWZuZGVmCV9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAKKyNkZWZpbmUJX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIAorI2VuZGlmCisKKyNpbmNsdWRlICAgIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAgICA8c3RkbGliLmg+CisjaW5jbHVkZSAgICA8d2luc29jay5oPgorI2luY2x1ZGUgICAgPHN0ZGlvLmg+CisjaW5jbHVkZSAgICA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAgICA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICAgIDxzdGRhcmcuaD4KKworI2RlZmluZQlBTlRMUjNfQVBJICAgICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lCUFOVExSM19DREVDTCAgICBfX2NkZWNsCisjZGVmaW5lIEFOVExSM19GQVNUQ0FMTCBfX2Zhc3RjYWxsCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBfX01JTkdXMzJfXworLy8gU3RhbmRhcmQgV2luZG93cyB0eXBlcworLy8KK3R5cGVkZWYJSU5UMzIJQU5UTFIzX0NIQVIsCSpwQU5UTFIzX0NIQVI7Cit0eXBlZGVmCVVJTlQzMglBTlRMUjNfVUNIQVIsCSpwQU5UTFIzX1VDSEFSOworCit0eXBlZGVmCUlOVDgJQU5UTFIzX0lOVDgsCSpwQU5UTFIzX0lOVDg7Cit0eXBlZGVmCUlOVDE2CUFOVExSM19JTlQxNiwJKnBBTlRMUjNfSU5UMTY7Cit0eXBlZGVmCUlOVDMyCUFOVExSM19JTlQzMiwJKnBBTlRMUjNfSU5UMzI7Cit0eXBlZGVmCUlOVDY0CUFOVExSM19JTlQ2NCwJKnBBTlRMUjNfSU5UNjQ7Cit0eXBlZGVmCVVJTlQ4CUFOVExSM19VSU5UOCwJKnBBTlRMUjNfVUlOVDg7Cit0eXBlZGVmCVVJTlQxNglBTlRMUjNfVUlOVDE2LAkqcEFOVExSM19VSU5UMTY7Cit0eXBlZGVmCVVJTlQzMglBTlRMUjNfVUlOVDMyLAkqcEFOVExSM19VSU5UMzI7Cit0eXBlZGVmCVVJTlQ2NAlBTlRMUjNfVUlOVDY0LAkqcEFOVExSM19VSU5UNjQ7Cit0eXBlZGVmIFVJTlQ2NCAgQU5UTFIzX0JJVFdPUkQsICpwQU5UTFIzX0JJVFdPUkQ7Cit0eXBlZGVmCVVJTlQ4CUFOVExSM19CT09MRUFOLCAqcEFOVExSM19CT09MRUFOOworCisjZWxzZQorLy8gTWluZ3cgdXNlcyBzdGRpbnQuaCBhbmQgZmFpbHMgdG8gZGVmaW5lIHN0YW5kYXJkIE1pY3Jvc29mdCB0eXBlZGVmcworLy8gc3VjaCBhcyBVSU5UMTYsIGhlbmNlIHdlIG11c3QgdXNlIHN0ZGludC5oIGZvciBNaW5ndy4KKy8vCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDMyX3QgICAgIEFOVExSM19DSEFSLCAgICAqcEFOVExSM19DSEFSOwordHlwZWRlZiB1aW50MzJfdCAgICBBTlRMUjNfVUNIQVIsICAgKnBBTlRMUjNfVUNIQVI7CisKK3R5cGVkZWYgaW50OF90CSAgICBBTlRMUjNfSU5UOCwgICAgKnBBTlRMUjNfSU5UODsKK3R5cGVkZWYgaW50MTZfdAkgICAgQU5UTFIzX0lOVDE2LCAgICpwQU5UTFIzX0lOVDE2OwordHlwZWRlZiBpbnQzMl90CSAgICBBTlRMUjNfSU5UMzIsICAgKnBBTlRMUjNfSU5UMzI7Cit0eXBlZGVmIGludDY0X3QJICAgIEFOVExSM19JTlQ2NCwgICAqcEFOVExSM19JTlQ2NDsKKwordHlwZWRlZiB1aW50OF90CSAgICBBTlRMUjNfVUlOVDgsICAgKnBBTlRMUjNfVUlOVDg7Cit0eXBlZGVmIHVpbnQxNl90ICAgIEFOVExSM19VSU5UMTYsICAqcEFOVExSM19VSU5UMTY7Cit0eXBlZGVmIHVpbnQzMl90ICAgIEFOVExSM19VSU5UMzIsICAqcEFOVExSM19VSU5UMzI7Cit0eXBlZGVmIHVpbnQ2NF90ICAgIEFOVExSM19VSU5UNjQsICAqcEFOVExSM19VSU5UNjQ7Cit0eXBlZGVmIHVpbnQ2NF90ICAgIEFOVExSM19CSVRXT1JELCAqcEFOVExSM19CSVRXT1JEOworCit0eXBlZGVmCXVpbnQ4X3QJICAgIEFOVExSM19CT09MRUFOLCAqcEFOVExSM19CT09MRUFOOworCisjZW5kaWYKKworCisKKyNkZWZpbmUJQU5UTFIzX1VJTlQ2NF9MSVQobGl0KSAgbGl0IyNVTEwKKworI2RlZmluZQlBTlRMUjNfSU5MSU5FCSAgICAgICAgX19pbmxpbmUKKwordHlwZWRlZiBGSUxFICoJICAgIEFOVExSM19GRFNDOwordHlwZWRlZglzdHJ1Y3Qgc3RhdCBBTlRMUjNfRlNUQVRfU1RSVUNUOworCisjaWZkZWYJQU5UTFIzX1VTRV82NEJJVAorI2RlZmluZQlBTlRMUjNfRlVOQ19QVFIocHRyKQkodm9pZCAqKSgoQU5UTFIzX1VJTlQ2NCkocHRyKSkKKyNkZWZpbmUgQU5UTFIzX1VJTlQ2NF9DQVNUKHB0cikgKEFOVExSM19VSU5UNjQpKHB0cikpCisjZGVmaW5lCUFOVExSM19VSU5UMzJfQ0FTVChwdHIpCShBTlRMUjNfVUlOVDMyKSgoQU5UTFIzX1VJTlQ2NCkocHRyKSkKK3R5cGVkZWYgQU5UTFIzX0lOVDY0CQlBTlRMUjNfTUFSS0VSOwkJCQordHlwZWRlZiBBTlRMUjNfVUlOVDY0CQlBTlRMUjNfSU5US0VZOworI2Vsc2UKKyNkZWZpbmUJQU5UTFIzX0ZVTkNfUFRSKHB0cikJKHZvaWQgKikoKEFOVExSM19VSU5UMzIpKHB0cikpCisjZGVmaW5lIEFOVExSM19VSU5UNjRfQ0FTVChwdHIpIChBTlRMUjNfVUlOVDY0KSgoQU5UTFIzX1VJTlQzMikocHRyKSkKKyNkZWZpbmUJQU5UTFIzX1VJTlQzMl9DQVNUKHB0cikJKEFOVExSM19VSU5UMzIpKHB0cikKK3R5cGVkZWYJQU5UTFIzX0lOVDMyCQlBTlRMUjNfTUFSS0VSOwordHlwZWRlZiBBTlRMUjNfVUlOVDMyCQlBTlRMUjNfSU5US0VZOworI2VuZGlmCisKKyNpZmRlZglBTlRMUjNfV0lOMzIKKyNlbmRpZgorCisjaWZkZWYJQU5UTFIzX1dJTjY0CisjZW5kaWYKKworCit0eXBlZGVmCWludAkJCUFOVExSM19TQUxFTlQ7CQkJCQkJCQkvLyBUeXBlIHVzZWQgZm9yIHNpemUgb2YgYWNjZXB0IHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHJfaW4JQU5UTFIzX1NPQ0tBRERSVCwgKiBwQU5UTFIzX1NPQ0tBRERSVDsJLy8gVHlwZSB1c2VkIGZvciBzb2NrZXQgYWRkcmVzcyBkZWNsYXJhdGlvbgordHlwZWRlZiBzdHJ1Y3Qgc29ja2FkZHIJCUFOVExSM19TT0NLQUREUkMsICogcEFOVExSM19TT0NLQUREUkM7CS8vIFR5cGUgdXNlZCBmb3IgY2FzdCBvbiBhY2NlcHQoKQorCisjZGVmaW5lCUFOVExSM19DTE9TRVNPQ0tFVAljbG9zZXNvY2tldAorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBXYXJuaW5ncyB0aGF0IGFyZSBvdmVyLXplYWxvdXMgc3VjaCBhcyBjb21wbGFpbmluZyBhYm91dCBzdHJkdXAsIHdlCisgKiBjYW4gdHVybiBvZmYuCisgKi8KKworLyogRG9uJ3QgY29tcGxhaW4gYWJvdXQgImRlcHJlY2F0ZWQiIGZ1bmN0aW9ucyBzdWNoIGFzIHN0cmR1cAorICovCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0OTk2ICkKKworI2Vsc2UKKworLyogSW5jbHVkZSBjb25maWd1cmUgZ2VuZXJhdGVkIGhlYWRlciBmaWxlCisgKi8KKyNpbmNsdWRlCTxhbnRscjNjb25maWcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgICA8c3RkbGliLmg+CisjIGluY2x1ZGUgICA8c3RkZGVmLmg+CisjIGluY2x1ZGUgICA8c3RkYXJnLmg+CisjZWxzZQorIyBpZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlICA8c3RkbGliLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfU1REQVJHX0gKKyMgIGluY2x1ZGUgIDxzdGRhcmcuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhU1REQ19IRUFERVJTICYmIEhBVkVfTUVNT1JZX0gKKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorIyBlbmRpZgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisKKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKKyNpbmNsdWRlCTxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU09DS0VUX0gKKyMgaW5jbHVkZQk8c29ja2V0Lmg+CisjZWxzZQorIyBpZiBIQVZFX1NZU19TT0NLRVRfSAorIyAgaW5jbHVkZQk8c3lzL3NvY2tldC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX05FVElORVRfVENQX0gKKyNpbmNsdWRlCTxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0FSUEFfTkFNRVNFUl9ICisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+IC8qIEROUyBIRUFERVIgc3RydWN0ICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKworCisjaWZkZWYgSEFWRV9TWVNfUkVTT0xWRV9ICisjaW5jbHVkZQk8c3lzL3Jlc29sdi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1JFU09MVkVfSAorI2luY2x1ZGUJPHJlc29sdi5oPgorI2VuZGlmCisKKworI2lmZGVmCUhBVkVfTUFMTE9DX0gKKyMgaW5jbHVkZSAgICA8bWFsbG9jLmg+CisjZWxzZQorIyBpZmRlZglIQVZFX1NZU19NQUxMT0NfSAorIyAgaW5jbHVkZSAgICA8c3lzL21hbGxvYy5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiAgSEFWRV9DVFlQRV9ICisjIGluY2x1ZGUgICA8Y3R5cGUuaD4KKyNlbmRpZgorCisvKiBTb21lIHBsYXRmb3JtcyBkZWZpbmUgYSBtYWNybywgaW5kZXgoKSBpbiBzdHJpbmcuaC4gQUlYIGlzCisgKiBvbmUgb2YgdGhlc2UgZm9yIGluc3RhbmNlLiBXZSBtdXN0IGdldCByaWQgb2YgdGhhdCBkZWZpbml0aW9uCisgKiBhcyB3ZSB1c2UgLT5pbmRleCBhbGwgb3ZlciB0aGUgcGxhY2UuIGRlZmluaW5nIG1hY3JvcyBsaWtlIHRoaXMgaW4gc3lzdGVtIGhlYWRlcgorICogZmlsZXMgaXMgYSByZWFsbHkgYmFkIGlkZWEsIGJ1dCBJIGRvdWJ0IHRoYXQgSUJNIHdpbGwgbGlzdGVuIHRvIG1lIDstKQorICovCisjaWZkZWYJaW5kZXgKKyN1bmRlZglpbmRleAorI2VuZGlmCisKKyNkZWZpbmUgX3N0YXQgICBzdGF0CisKKy8vIFNPQ0tFVCBub3QgZGVmaW5lZCBvbiBVbml4CisvLyAKK3R5cGVkZWYJaW50CVNPQ0tFVDsKKworI2RlZmluZSBBTlRMUjNfQVBJCisjZGVmaW5lCUFOVExSM19DREVDTAorI2RlZmluZSBBTlRMUjNfRkFTVENBTEwKKworI2lmZGVmCV9faHB1eAorCisgLy8gSFBVWCBpcyBhbHdheXMgZGlmZmVyZW50IHVzdWFsbHkgZm9yIG5vIGdvb2QgcmVhc29uLiBUcnU2NCBzaG91bGQgaGF2ZSBraWNrZWQgaXQKKyAvLyBpbnRvIHRvdWNoIGFuZCBldmVyeW9uZSBrbm93cyBpdCA7LSkKKyAvLworIHR5cGVkZWYgc3RydWN0IHNvY2thZGRyX2luIEFOVExSM19TT0NLQUREUlQsICogcEFOVExSM19TT0NLQUREUlQ7CS8vIFR5cGUgdXNlZCBmb3Igc29ja2V0IGFkZHJlc3MgZGVjbGFyYXRpb24KKyB0eXBlZGVmIHZvaWQgKgkJICAgIHBBTlRMUjNfU09DS0FERFJDOwkJCQkvLyBUeXBlIHVzZWQgZm9yIGNhc3Qgb24gYWNjZXB0KCkKKyB0eXBlZGVmIGludAkJICAgIEFOVExSM19TQUxFTlQ7CisKKyNlbHNlCisKKyMgaWYgZGVmaW5lZChfQUlYKSB8fCBfX0dOVUNfXyA+IDMgCisKKyAgIHR5cGVkZWYgIHNvY2tsZW5fdCAgIEFOVExSM19TQUxFTlQ7CisKKyMgZWxzZQorCisgICB0eXBlZGVmICBzaXplX3QJQU5UTFIzX1NBTEVOVDsKKworIyBlbmRpZgorCisgICB0eXBlZGVmIHN0cnVjdCBzb2NrYWRkcl9pbiAgIEFOVExSM19TT0NLQUREUlQsICogcEFOVExSM19TT0NLQUREUlQ7CS8vIFR5cGUgdXNlZCBmb3Igc29ja2V0IGFkZHJlc3MgZGVjbGFyYXRpb24KKyAgIHR5cGVkZWYgc3RydWN0IHNvY2thZGRyCSogcEFOVExSM19TT0NLQUREUkM7ICAgICAgICAgICAgICAgICAgICAvLyBUeXBlIHVzZWQgZm9yIGNhc3Qgb24gYWNjZXB0KCkKKworI2VuZGlmCisKKyNkZWZpbmUgSU5WQUxJRF9TT0NLRVQgICAgICAoKFNPQ0tFVCktMSkKKyNkZWZpbmUJQU5UTFIzX0NMT1NFU09DS0VUICBjbG9zZQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluaGVyaXQgdHlwZSBkZWZpbml0aW9ucyBmb3IgYXV0b2NvbmYKKyAqLwordHlwZWRlZiBpbnQzMl90CSAgICBBTlRMUjNfQ0hBUiwgICAgKnBBTlRMUjNfQ0hBUjsKK3R5cGVkZWYgdWludDMyX3QgICAgQU5UTFIzX1VDSEFSLCAgICpwQU5UTFIzX1VDSEFSOworCit0eXBlZGVmIGludDhfdAkgICAgQU5UTFIzX0lOVDgsICAgICpwQU5UTFIzX0lOVDg7Cit0eXBlZGVmIGludDE2X3QJICAgIEFOVExSM19JTlQxNiwgICAqcEFOVExSM19JTlQxNjsKK3R5cGVkZWYgaW50MzJfdAkgICAgQU5UTFIzX0lOVDMyLCAgICpwQU5UTFIzX0lOVDMyOwordHlwZWRlZiBpbnQ2NF90CSAgICBBTlRMUjNfSU5UNjQsICAgKnBBTlRMUjNfSU5UNjQ7CisKK3R5cGVkZWYgdWludDhfdAkgICAgQU5UTFIzX1VJTlQ4LCAgICpwQU5UTFIzX1VJTlQ4OwordHlwZWRlZiB1aW50MTZfdCAgICBBTlRMUjNfVUlOVDE2LCAgKnBBTlRMUjNfVUlOVDE2OwordHlwZWRlZiB1aW50MzJfdCAgICBBTlRMUjNfVUlOVDMyLCAgKnBBTlRMUjNfVUlOVDMyOwordHlwZWRlZiB1aW50NjRfdCAgICBBTlRMUjNfVUlOVDY0LCAgKnBBTlRMUjNfVUlOVDY0OwordHlwZWRlZiB1aW50NjRfdCAgICBBTlRMUjNfQklUV09SRCwgKnBBTlRMUjNfQklUV09SRDsKKwordHlwZWRlZiB1aW50MzJfdCAgICBBTlRMUjNfQk9PTEVBTiwgKnBBTlRMUjNfQk9PTEVBTjsKKworI2RlZmluZSBBTlRMUjNfSU5MSU5FICAgaW5saW5lCisjZGVmaW5lCUFOVExSM19BUEkKKwordHlwZWRlZiBGSUxFICoJICAgIEFOVExSM19GRFNDOwordHlwZWRlZglzdHJ1Y3Qgc3RhdCBBTlRMUjNfRlNUQVRfU1RSVUNUOworCisjaWZkZWYJQU5UTFIzX1VTRV82NEJJVAorI2RlZmluZQlBTlRMUjNfRlVOQ19QVFIocHRyKSAgICAodm9pZCAqKSgoQU5UTFIzX1VJTlQ2NCkocHRyKSkKKyNkZWZpbmUgQU5UTFIzX1VJTlQ2NF9DQVNUKHB0cikJKEFOVExSM19VSU5UNjQpKHB0cikpCisjZGVmaW5lCUFOVExSM19VSU5UMzJfQ0FTVChwdHIpIChBTlRMUjNfVUlOVDMyKSgoQU5UTFIzX1VJTlQ2NCkocHRyKSkKK3R5cGVkZWYgQU5UTFIzX0lOVDY0CQlBTlRMUjNfTUFSS0VSOwordHlwZWRlZiBBTlRMUjNfVUlOVDY0CQlBTlRMUjNfSU5US0VZOworI2Vsc2UKKyNkZWZpbmUJQU5UTFIzX0ZVTkNfUFRSKHB0cikJKHZvaWQgKikoKEFOVExSM19VSU5UMzIpKHB0cikpCisjZGVmaW5lIEFOVExSM19VSU5UNjRfQ0FTVChwdHIpIChBTlRMUjNfVUlOVDY0KSgoQU5UTFIzX1VJTlQzMikocHRyKSkKKyNkZWZpbmUJQU5UTFIzX1VJTlQzMl9DQVNUKHB0cikJKEFOVExSM19VSU5UMzIpKHB0cikKK3R5cGVkZWYJQU5UTFIzX0lOVDMyCQlBTlRMUjNfTUFSS0VSOwordHlwZWRlZiBBTlRMUjNfVUlOVDMyCQlBTlRMUjNfSU5US0VZOworI2VuZGlmCisjZGVmaW5lCUFOVExSM19VSU5UNjRfTElUKGxpdCkJbGl0IyNVTEwKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBBTlRMUjNfVVNFXzY0QklUCisjZGVmaW5lIEFOVExSM19UUklFX0RFUFRIIDYzCisjZWxzZQorI2RlZmluZSBBTlRMUjNfVFJJRV9ERVBUSCAzMQorI2VuZGlmCisvKiBQcmUgZGVjbGFyZSB0aGUgdHlwZWRlZnMgZm9yIGFsbCB0aGUgaW50ZXJmYWNlcywgdGhlbiAKKyAqIHRoZXkgY2FuIGJlIGludGVyLWRlcGVuZGFudCBhbmQgd2Ugd2lsbCBsZXQgdGhlIGxpbmtlcgorICogc29ydCBpdCBvdXQgZm9yIHVzLgorICovCisjaW5jbHVkZSAgICA8YW50bHIzaW50ZXJmYWNlcy5oPgorCisvLyBJbmNsdWRlIHRoZSB1bmljb2RlLm9yZyBjb252ZXJzaW9uIGxpYnJhcnkgaGVhZGVyLgorLy8KKyNpbmNsdWRlICAgIDxhbnRscjNjb252ZXJ0dXRmLmg+CisKKy8qIFByb3RvdHlwZXMKKyAqLworI2lmbmRlZiBBTlRMUjNfTUFMTE9DCisvLy8gRGVmYXVsdCBkZWZpbml0aW9uIG9mIEFOVExSM19NQUxMT0MuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWZvcmUgaW5jbHVkaW5nCisvLy8gYW50bHIzLmggaWYgeW91IHdpc2ggdG8gdXNlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uLgorLy8vCisjZGVmaW5lCUFOVExSM19NQUxMT0MocmVxdWVzdCkgICAgICAgICAgbWFsbG9jICAoKHNpemVfdCkocmVxdWVzdCkpCisjZW5kaWYKKworI2lmbmRlZiBBTlRMUjNfQ0FMTE9DCisvLy8gRGVmYXVsdCBkZWZpbml0aW9uIG9mIEFOVExSM19DQUxMT0MuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWZvcmUgaW5jbHVkaW5nCisvLy8gYW50bHIzLmggaWYgeW91IHdpc2ggdG8gdXNlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uLgorLy8vCisjZGVmaW5lCUFOVExSM19DQUxMT0MobnVtRWwsIGVsU2l6ZSkgICAgY2FsbG9jICAobnVtRWwsIChzaXplX3QpKGVsU2l6ZSkpCisjZW5kaWYKKworI2lmbmRlZiBBTlRMUjNfUkVBTExPQworLy8vIERlZmF1bHQgZGVmaW5pdGlvbiBvZiBBTlRMUjNfUkVBTExPQy4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcKKy8vLyBhbnRscjMuaCBpZiB5b3Ugd2lzaCB0byB1c2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24uCisvLy8KKyNkZWZpbmUgQU5UTFIzX1JFQUxMT0MoY3VycmVudCwgcmVxdWVzdCkgICAgcmVhbGxvYyAoKHZvaWQgKikoY3VycmVudCksIChzaXplX3QpKHJlcXVlc3QpKQorI2VuZGlmCisjaWZuZGVmIEFOVExSM19GUkVFCisvLy8gRGVmYXVsdCBkZWZpbml0aW9uIG9mIEFOVExSM19GUkVFLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVmb3JlIGluY2x1ZGluZworLy8vIGFudGxyMy5oIGlmIHlvdSB3aXNoIHRvIHVzZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbi4KKy8vLworI2RlZmluZQlBTlRMUjNfRlJFRShwdHIpCQlmcmVlICAgICgodm9pZCAqKShwdHIpKQorI2VuZGlmCisjaWZuZGVmIEFOVExSM19GUkVFX0ZVTkMJCQkJCQkKKy8vLyBEZWZhdWx0IGRlZmluaXRpb24gb2YgQU5UTFIzX0ZSRUVfRlVOQy4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcKKy8vLyBhbnRscjMuaCBpZiB5b3Ugd2lzaCB0byB1c2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24uCisvLy8KKyNkZWZpbmUJQU5UTFIzX0ZSRUVfRlVOQwkJZnJlZQorI2VuZGlmCisjaWZuZGVmIEFOVExSM19TVFJEVVAKKy8vLyBEZWZhdWx0IGRlZmluaXRpb24gb2YgQU5UTFIzX1NUUkRVUC4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcKKy8vLyBhbnRscjMuaCBpZiB5b3Ugd2lzaCB0byB1c2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24uCisvLy8KKyNkZWZpbmUJQU5UTFIzX1NUUkRVUChpbnN0cikJCShwQU5UTFIzX1VJTlQ4KShzdHJkdXAgICgoY29uc3QgY2hhciAqKShpbnN0cikpKQorI2VuZGlmCisjaWZuZGVmIEFOVExSM19NRU1DUFkKKy8vLyBEZWZhdWx0IGRlZmluaXRpb24gb2YgQU5UTFIzX01FTUNQWS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcKKy8vLyBhbnRscjMuaCBpZiB5b3Ugd2lzaCB0byB1c2UgeW91ciBvd24gaW1wbGVtZW50YXRpb24uCisvLy8KKyNkZWZpbmUJQU5UTFIzX01FTUNQWSh0YXJnZXQsIHNvdXJjZSwgc2l6ZSkgbWVtY3B5KCh2b2lkICopKHRhcmdldCksIChjb25zdCB2b2lkICopKHNvdXJjZSksIChzaXplX3QpKHNpemUpKQorI2VuZGlmCisjaWZuZGVmIEFOVExSM19NRU1NT1ZFCisvLy8gRGVmYXVsdCBkZWZpbml0aW9uIG9mIEFOVExSM19NRU1NT1ZFLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVmb3JlIGluY2x1ZGluZworLy8vIGFudGxyMy5oIGlmIHlvdSB3aXNoIHRvIHVzZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbi4KKy8vLworI2RlZmluZQlBTlRMUjNfTUVNTU9WRSh0YXJnZXQsIHNvdXJjZSwgc2l6ZSkgICAgbWVtbW92ZSgodm9pZCAqKSh0YXJnZXQpLCAoY29uc3Qgdm9pZCAqKShzb3VyY2UpLCAoc2l6ZV90KShzaXplKSkKKyNlbmRpZgorI2lmbmRlZiBBTlRMUjNfTUVNU0VUCisvLy8gRGVmYXVsdCBkZWZpbml0aW9uIG9mIEFOVExSM19NRU1TRVQuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWZvcmUgaW5jbHVkaW5nCisvLy8gYW50bHIzLmggaWYgeW91IHdpc2ggdG8gdXNlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uLgorLy8vCisjZGVmaW5lCUFOVExSM19NRU1TRVQodGFyZ2V0LCBieXRlLCBzaXplKSAgIG1lbXNldCgodm9pZCAqKSh0YXJnZXQpLCAoaW50KShieXRlKSwgKHNpemVfdCkoc2l6ZSkpCisjZW5kaWYKKworI2lmbmRlZglBTlRMUjNfUFJJTlRGCisvLy8gRGVmYXVsdCBkZWZpbml0aW9uIG9mIHByaW50Ziwgc2V0IHRoaXMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gcHJpbnRmIGJlZm9yZSBpbmNsdWRpbmcgYW50bHIzLmgKKy8vLyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgcHJpbnRmLiBOb3RlIHRoYXQgeW91IGNhbiBkZWZpbmUgdGhpcyB0byBiZSA8Y29kZT4vLzwvY29kZT4KKy8vLyB3aXRob3V0IGhhcm1pbmcgdGhlIHJ1bnRpbWUuCisvLy8KKyNkZWZpbmUJQU5UTFIzX1BSSU5URiAgIHByaW50ZgorI2VuZGlmCisKKyNpZm5kZWYJQU5UTFIzX0ZQUklOVEYKKy8vLyBEZWZhdWx0IGRlZmluaXRpb24gb2YgZnByaW50Ziwgc2V0IHRoaXMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gZnByaW50ZiBiZWZvcmUgaW5jbHVkaW5nIGFudGxyMy5oCisvLy8gaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIGZwcmludGYuIE5vdGUgdGhhdCB5b3UgY2FuIGRlZmluZSB0aGlzIHRvIGJlIDxjb2RlPi8vPC9jb2RlPgorLy8vIHdpdGhvdXQgaGFybWluZyB0aGUgcnVudGltZS4gCisvLy8KKyNkZWZpbmUJQU5UTFIzX0ZQUklOVEYJZnByaW50ZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworQU5UTFIzX0FQSSBwQU5UTFIzX0lOVF9UUklFIGFudGxyM0ludFRyaWVOZXcgICAgKEFOVExSM19VSU5UMzIgZGVwdGgpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfQklUU0VUICAgYW50bHIzQml0c2V0TmV3CShBTlRMUjNfVUlOVDMyIG51bUJpdHMpOworQU5UTFIzX0FQSSBwQU5UTFIzX0JJVFNFVCAgIGFudGxyM0JpdHNldE9mCShBTlRMUjNfSU5UMzIgYml0LCAuLi4pOworQU5UTFIzX0FQSSBwQU5UTFIzX0JJVFNFVCAgIGFudGxyM0JpdHNldExpc3QJKHBBTlRMUjNfSEFTSF9UQUJMRSBsaXN0KTsKK0FOVExSM19BUEkgcEFOVExSM19CSVRTRVQgICBhbnRscjNCaXRzZXRDb3B5CShwQU5UTFIzX0JJVFNFVF9MSVNUIGJsaXN0KTsKK0FOVExSM19BUEkgcEFOVExSM19CSVRTRVQgICBhbnRscjNCaXRzZXRMb2FkICAgIChwQU5UTFIzX0JJVFNFVF9MSVNUIGJsaXN0KTsKK0FOVExSM19BUEkgdm9pZCAgICAgICAgICAgICBhbnRscjNCaXRzZXRTZXRBUEkgIChwQU5UTFIzX0JJVFNFVCBiaXRzZXQpOworCisKK0FOVExSM19BUEkgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgIGFudGxyM0Jhc2VSZWNvZ25pemVyTmV3ICAgICAgICAgICAgICAgICAgICAgKEFOVExSM19VSU5UMzIgdHlwZSwgQU5UTFIzX1VJTlQzMiBzaXplSGludCwgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZSk7CitBTlRMUjNfQVBJIHZvaWQJCQkgICAgYW50bHIzUmVjb2duaXRpb25FeGNlcHRpb25OZXcgICAgICAgICAgICAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcik7CitBTlRMUjNfQVBJIHZvaWQJCQkgICAgYW50bHIzTVRFeGNlcHRpb25OZXcgICAgICAgICAgICAgICAgICAgICAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcik7CitBTlRMUjNfQVBJIHZvaWQJCQkgICAgYW50bHIzTVRORXhjZXB0aW9uTmV3ICAgICAgICAgICAgICAgICAgICAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcik7CitBTlRMUjNfQVBJIHBBTlRMUjNfSEFTSF9UQUJMRQkgICAgYW50bHIzSGFzaFRhYmxlTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAoQU5UTFIzX1VJTlQzMiBzaXplSGludCk7CitBTlRMUjNfQVBJIEFOVExSM19VSU5UMzIJICAgIGFudGxyM0hhc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiBrZXksIEFOVExSM19VSU5UMzIga2V5bGVuKTsKK0FOVExSM19BUEkgcEFOVExSM19IQVNIX0VOVU0JICAgIGFudGxyM0VudW1OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfTElTVAkJICAgIGFudGxyM0xpc3ROZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQpOworQU5UTFIzX0FQSSBwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZICAgYW50bHIzVmVjdG9yRmFjdG9yeU5ldyAgICAgICAgICAgICAgICAgICAgICAoQU5UTFIzX1VJTlQzMiBzaXplSGludCk7CitBTlRMUjNfQVBJIHBBTlRMUjNfVkVDVE9SCSAgICBhbnRscjNWZWN0b3JOZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTlRMUjNfVUlOVDMyIHNpemVIaW50KTsKK0FOVExSM19BUEkgcEFOVExSM19TVEFDSwkgICAgYW50bHIzU3RhY2tOZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQU5UTFIzX1VJTlQzMiBzaXplSGludCk7CitBTlRMUjNfQVBJIHZvaWQgICAgICAgICAgICAgICAgICAgICBhbnRscjNTZXRWZWN0b3JBcGkgICAgICAgICAgICAgICAgICAgICAgICAgIChwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IsIEFOVExSM19VSU5UMzIgc2l6ZUhpbnQpOworQU5UTFIzX0FQSSBBTlRMUjNfVUNIQVIJCSAgICBhbnRscjNjOHRvQW50bHJjICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTlRMUjNfSU5UOCBpbmMpOworQU5UTFIzX0FQSSBwQU5UTFIzX1RPUE8gICAgICAgICAgICAgYW50bHIzVG9wb05ldygpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfRVhDRVBUSU9OCSAgICBhbnRscjNFeGNlcHRpb25OZXcgICAgICAgICAgICAgICAgICAgICAgICAgIChBTlRMUjNfVUlOVDMyIGV4Y2VwdGlvbiwgdm9pZCAqIG5hbWUsIHZvaWQgKiBtZXNzYWdlLCBBTlRMUjNfQk9PTEVBTiBmcmVlTWVzc2FnZSk7CisKKworQU5UTFIzX0FQSSBwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICAgYW50bHIzRmlsZVN0cmVhbU5ldyAgICAgICAgICAgICAgICAgICAgICAgICAocEFOVExSM19VSU5UOCBmaWxlTmFtZSwgQU5UTFIzX1VJTlQzMiBlbmNvZGluZyk7CitBTlRMUjNfQVBJIHBBTlRMUjNfSU5QVVRfU1RSRUFNICAgICBhbnRscjNTdHJpbmdTdHJlYW1OZXcgICAgICAgICAgICAgICAgICAgICAgIChwQU5UTFIzX1VJTlQ4IGRhdGEsIEFOVExSM19VSU5UMzIgZW5jb2RpbmcsIEFOVExSM19VSU5UMzIgc2l6ZSwgcEFOVExSM19VSU5UOCBuYW1lKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX0lOVF9TVFJFQU0JICAgIGFudGxyM0ludFN0cmVhbU5ldyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgICBhbnRscjNTdHJpbmdGYWN0b3J5TmV3ICAgICAgICAgICAgICAgICAgICAgIChBTlRMUjNfVUlOVDMyIGVuY29kaW5nKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UT0tFTgkgICAgYW50bHIzQ29tbW9uVG9rZW5OZXcgICAgICAgICAgICAgICAgICAgICAgICAoQU5UTFIzX1VJTlQzMiB0dHlwZSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfVE9LRU5fRkFDVE9SWSAgICBhbnRscjNUb2tlbkZhY3RvcnlOZXcgICAgICAgICAgICAgICAgICAgICAgIChwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCk7CitBTlRMUjNfQVBJIHZvaWQJCQkgICAgYW50bHIzU2V0VG9rZW5BUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworCitBTlRMUjNfQVBJIHBBTlRMUjNfTEVYRVIJICAgIGFudGxyM0xleGVyTmV3U3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQsIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKTsKK0FOVExSM19BUEkgcEFOVExSM19MRVhFUgkgICAgYW50bHIzTGV4ZXJOZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQU5UTFIzX1VJTlQzMiBzaXplSGludCwgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfUEFSU0VSCSAgICBhbnRscjNQYXJzZXJOZXdTdHJlYW1EYmcgICAgICAgICAgICAgICAgICAgIChBTlRMUjNfVUlOVDMyIHNpemVIaW50LCBwQU5UTFIzX1RPS0VOX1NUUkVBTSB0c3RyZWFtLCBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRiZywgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfUEFSU0VSCSAgICBhbnRscjNQYXJzZXJOZXdTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgIChBTlRMUjNfVUlOVDMyIHNpemVIaW50LCBwQU5UTFIzX1RPS0VOX1NUUkVBTSB0c3RyZWFtLCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKTsKK0FOVExSM19BUEkgcEFOVExSM19QQVJTRVIgICAgICAgICAgIGFudGxyM1BhcnNlck5ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQsIHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgc3RhdGUpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSAgYW50bHIzQ29tbW9uVG9rZW5TdHJlYW1Tb3VyY2VOZXcgICAgICAgIChBTlRMUjNfVUlOVDMyIGhpbnQsIHBBTlRMUjNfVE9LRU5fU09VUkNFIHNvdXJjZSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTQlhbnRscjNDb21tb25Ub2tlblN0cmVhbU5ldyAgICAgICAgICAgICAgKEFOVExSM19VSU5UMzIgaGludCk7CitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTQlhbnRscjNDb21tb25Ub2tlbkRlYnVnU3RyZWFtU291cmNlTmV3ICAgKEFOVExSM19VSU5UMzIgaGludCwgcEFOVExSM19UT0tFTl9TT1VSQ0Ugc291cmNlLCBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlYnVnZ2VyKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SCUFOVExSM19UUkVFX0FEQVBUT1JOZXcgICAgICAgICAgICAgICAgICAocEFOVExSM19TVFJJTkdfRkFDVE9SWSBzdHJGYWN0b3J5KTsKK0FOVExSM19BUEkgcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUglBTlRMUjNfVFJFRV9BREFQVE9SRGVidWdOZXcgICAgICAgICAgICAgKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgc3RyRmFjdG9yeSwgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUglkZWJ1Z2dlcik7CitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RSRUUJCWFudGxyM0NvbW1vblRyZWVOZXcgICAgICAgICAgICAgICAgICAgICAodm9pZCk7CitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RSRUUJCWFudGxyM0NvbW1vblRyZWVOZXdGcm9tVHJlZSAgICAgICAgICAgICAocEFOVExSM19DT01NT05fVFJFRSB0cmVlKTsKK0FOVExSM19BUEkgcEFOVExSM19DT01NT05fVFJFRQkJYW50bHIzQ29tbW9uVHJlZU5ld0Zyb21Ub2tlbiAgICAgICAgICAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTiB0cmVlKTsKK0FOVExSM19BUEkgcEFOVExSM19BUkJPUkVUVU0JCWFudGxyM0FyYm9yZXR1bU5ldyAgICAgICAgICAgICAgICAgICAgICAocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5KTsKK0FOVExSM19BUEkgdm9pZAkJCQlhbnRscjNTZXRDVEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgKHBBTlRMUjNfQ09NTU9OX1RSRUUgdHJlZSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfQkFTRV9UUkVFCQlhbnRscjNCYXNlVHJlZU5ldyAgICAgICAgICAgICAgICAgICAgICAgKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpOworCitBTlRMUjNfQVBJIHZvaWQJCQkJYW50bHIzQmFzZVRyZWVBZGFwdG9ySW5pdCAgICAgICAgICAgICAgIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVidWdnZXIpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfVFJFRV9QQVJTRVIJCWFudGxyM1RyZWVQYXJzZXJOZXdTdHJlYW0gICAgICAgICAgICAgICAoQU5UTFIzX1VJTlQzMiBzaXplSGludCwgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zdHJlYW0sIHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgc3RhdGUpOworCitBTlRMUjNfQVBJIEFOVExSM19JTlQzMgkJCWFudGxyM2RmYXNwZWNpYWxUcmFuc2l0aW9uICAgICAgICAgICAgICAodm9pZCAqIGN0eCwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIHBBTlRMUjNfQ1lDTElDX0RGQSBkZmEsIEFOVExSM19JTlQzMiBzKTsKK0FOVExSM19BUEkgQU5UTFIzX0lOVDMyCQkJYW50bHIzZGZhc3BlY2lhbFN0YXRlVHJhbnNpdGlvbiAgICAgICAgICh2b2lkICogY3R4LCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgcEFOVExSM19DWUNMSUNfREZBIGRmYSwgQU5UTFIzX0lOVDMyIHMpOworQU5UTFIzX0FQSSBBTlRMUjNfSU5UMzIJCQlhbnRscjNkZmFwcmVkaWN0ICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiBjdHgsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19JTlRfU1RSRUFNIGlzLCBwQU5UTFIzX0NZQ0xJQ19ERkEgY2RmYSk7CisKK0FOVExSM19BUEkgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSAgYW50bHIzQ29tbW9uVHJlZU5vZGVTdHJlYW1OZXdUcmVlICAgKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgaGludCk7CitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gIGFudGxyM0NvbW1vblRyZWVOb2RlU3RyZWFtTmV3ICAgICAgIChwQU5UTFIzX1NUUklOR19GQUNUT1JZIHN0ckZhY3RvcnksIEFOVExSM19VSU5UMzIgaGludCk7CitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gIGFudGxyM1VuYnVmVHJlZU5vZGVTdHJlYW1OZXdUcmVlICAgIChwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBBTlRMUjNfVUlOVDMyIGhpbnQpOworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNICBhbnRscjNVbmJ1ZlRyZWVOb2RlU3RyZWFtTmV3ICAgICAgICAocEFOVExSM19TVFJJTkdfRkFDVE9SWSBzdHJGYWN0b3J5LCBBTlRMUjNfVUlOVDMyIGhpbnQpOworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNICBhbnRscjNDb21tb25UcmVlTm9kZVN0cmVhbU5ld1N0cmVhbSAocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBpblN0cmVhbSk7CitBTlRMUjNfQVBJIHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTSAgICAgICAgIGFudGxyM1RyZWVOb2RlU3RyZWFtTmV3ICAgICAgICAgICAgICgpOworQU5UTFIzX0FQSSB2b2lkCQkJCSAgICBmaWxsQnVmZmVyRXh0ICAgICAgICAgICAgICAgICAgICAgICAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9UT0tFTl9TVFJFQU0gCisgICAgYW50bHIzUmV3cml0ZVJ1bGVUT0tFTlN0cmVhbU5ld0FFCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbik7CitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX1RPS0VOX1NUUkVBTSAKKyAgICBhbnRscjNSZXdyaXRlUnVsZVRPS0VOU3RyZWFtTmV3QUVFCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbiwgdm9pZCAqIG9uZUVsZW1lbnQpOworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9UT0tFTl9TVFJFQU0gCisgICAgYW50bHIzUmV3cml0ZVJ1bGVUT0tFTlN0cmVhbU5ld0FFVgkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24sIHBBTlRMUjNfVkVDVE9SIHZlY3Rvcik7CisKK0FOVExSM19BUEkgcEFOVExSM19SRVdSSVRFX1JVTEVfTk9ERV9TVFJFQU0gCisgICAgYW50bHIzUmV3cml0ZVJ1bGVOT0RFU3RyZWFtTmV3QUUJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX1VJTlQ4IGRlc2NyaXB0aW9uKTsKK0FOVExSM19BUEkgcEFOVExSM19SRVdSSVRFX1JVTEVfTk9ERV9TVFJFQU0gCisgICAgYW50bHIzUmV3cml0ZVJ1bGVOT0RFU3RyZWFtTmV3QUVFCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbiwgdm9pZCAqIG9uZUVsZW1lbnQpOworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9OT0RFX1NUUkVBTSAKKyAgICBhbnRscjNSZXdyaXRlUnVsZU5PREVTdHJlYW1OZXdBRVYJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX1VJTlQ4IGRlc2NyaXB0aW9uLCBwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNIAorICAgIGFudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbik7CitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNIAorICAgIGFudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFRShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbiwgdm9pZCAqIG9uZUVsZW1lbnQpOworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9TVUJUUkVFX1NUUkVBTSAKKyAgICBhbnRscjNSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW1OZXdBRVYocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24sIHBBTlRMUjNfVkVDVE9SIHZlY3Rvcik7CisKK0FOVExSM19BUEkgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBhbnRscjNEZWJ1Z0xpc3RlbmVyTmV3KCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBfQU5UTFIzREVGU19ICSovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzZW5jb2RpbmdzLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzZW5jb2RpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwNjczNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNlbmNvZGluZ3MuaApAQCAtMCwwICsxLDM4IEBACisjaWZuZGVmCV9BTlRMUjNfRU5DT0RJTkdTX0gKKyNkZWZpbmUJX0FOVExSM19FTkNPRElOR1NfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlIDxhbnRscjNkZWZzLmg+CisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2Vycm9ycy5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2Vycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTllZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzZXJyb3JzLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZglfQU5UTFIzRVJST1JTX0gKKyNkZWZpbmUJX0FOVExSM0VSUk9SU19ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZQlBTlRMUjNfU1VDQ0VTUwkwCisjZGVmaW5lCUFOVExSM19GQUlMCTEKKworI2RlZmluZQlBTlRMUjNfVFJVRQkxCisjZGVmaW5lCUFOVExSM19GQUxTRQkwCisKKy8qKiBJbmRpY2F0ZXMgZW5kIG9mIGNoYXJhY3RlciBzdHJlYW0gYW5kIGlzIGFuIGludmFsaWQgVW5pY29kZSBjb2RlIHBvaW50LiAqLworI2RlZmluZSBBTlRMUjNfQ0hBUlNUUkVBTV9FT0YJMHhGRkZGRkZGRgorCisvKiogSW5kaWNhdGVzICBtZW1vaXppbmcgb24gYSBydWxlIGZhaWxlZC4KKyAqLworI2RlZmluZQlNRU1PX1JVTEVfRkFJTEVECTB4RkZGRkZGRkUKKyNkZWZpbmUJTUVNT19SVUxFX1VOS05PV04JMHhGRkZGRkZGRgorCisKKyNkZWZpbmUJQU5UTFIzX0VSUl9CQVNFCSAgICAwCisjZGVmaW5lCUFOVExSM19FUlJfTk9NRU0gICAgKEFOVExSM19FUlJfQkFTRSArIDEpCisjZGVmaW5lCUFOVExSM19FUlJfTk9GSUxFICAgKEFOVExSM19FUlJfQkFTRSArIDIpCisjZGVmaW5lCUFOVExSM19FUlJfSEFTSERVUCAgKEFOVExSM19FUlJfQkFTRSArIDMpCisKKyNlbmRpZgkvKiBfQU5UTFIzRVJST1JTX0ggKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNleGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNleGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmFiOGRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMjE4IEBACisvKiogXGZpbGUKKyAqICBDb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIGJhc2ljIEFOVExSMyBleGNlcHRpb24gc3RydWN0dXJlIGNyZWF0ZWQKKyAqICBieSBhIHJlY29nbml6ZXIgd2hlbiBlcnJvcnMgYXJlIGZvdW5kL3ByZWRpY3RlZC4KKyAqLworI2lmbmRlZglfQU5UTFIzX0VYQ0VQVElPTl9ICisjZGVmaW5lCV9BTlRMUjNfRVhDRVBUSU9OX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzZGVmcy5oPgorCisvKiogSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZWQgYSB0b2tlbgorICogIGluIHRoZSBpbnB1dCB0aGF0IHdhcyBub3QgcHJlZGljdGVkLgorICovCisjZGVmaW5lCUFOVExSM19SRUNPR05JVElPTl9FWENFUFRJT04JICAgIDEKKworLyoqIE5hbWUgb2YgZXhjZXB0aW9uICNBTlRMUjNfUkVDT0dOSVRJT05fRVhDRVBUSU9OCisgKi8KKyNkZWZpbmUJQU5UTFIzX1JFQ09HTklUSU9OX0VYX05BTUUgICJvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbiIKKworLyoqIEluZGljYXRlcyB0aGF0IHRoZSByZWNvZ25pemVyIHdhcyBleHBlY3Rpbmcgb25lIHRva2VuIGFuZCBmb3VuZCBhCisgKiAgYSBkaWZmZXJlbnQgb25lLgorICovCisjZGVmaW5lCUFOVExSM19NSVNNQVRDSEVEX1RPS0VOX0VYQ0VQVElPTiAgIDIKKworLyoqIE5hbWUgb2YgI0FOVExSM19NSVNNQVRDSEVEX1RPS0VOX0VYQ0VQVElPTgorICovCisjZGVmaW5lCUFOVExSM19NSVNNQVRDSEVEX0VYX05BTUUgICAib3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIgorCisvKiogUmVjb2duaXplciBjb3VsZCBub3QgZmluZCBhIHZhbGlkIGFsdGVybmF0aXZlIGZyb20gdGhlIGlucHV0CisgKi8KKyNkZWZpbmUJQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OCSAgICAzCisKKy8qKiBOYW1lIG9mICNBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT04KKyAqLworI2RlZmluZQlBTlRMUjNfTk9fVklBQkxFX0FMVF9OQU1FICAgIm9yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uIgorCisvKiBDaGFyYWN0ZXIgaW4gYSBzZXQgd2FzIG5vdCBmb3VuZAorICovCisjZGVmaW5lCUFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT04JICAgIDQKKworLyogTmFtZSBvZiAjQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTgorICovCisjZGVmaW5lCUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FICAib3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiIKKworLyogQSBydWxlIHByZWRpY3RpbmcgYXQgbGVhc3QgbiBlbGVtZW50cyBmb3VuZCBsZXNzIHRoYW4gdGhhdCwKKyAqIHN1Y2ggYXM6IFdTOiAiICIrOworICovCisjZGVmaW5lCUFOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTgkgICAgNQorCisvKiBOYW1lIG9mICNBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT04KKyAqLworI2RlZmluZQlBTlRMUjNfRUFSTFlfRVhJVF9OQU1FCSAgICAgIm9yZy5hbnRsci5ydW50aW1lLkVhcmx5RXhpdEV4Y2VwdGlvbiIKKworI2RlZmluZQlBTlRMUjNfRkFJTEVEX1BSRURJQ0FURV9FWENFUFRJT04gICA2CisjZGVmaW5lCUFOVExSM19GQUlMRURfUFJFRElDQVRFX05BTUUJICAgICJvcmcuYW50bHIucnVudGltZS5GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24iCisKKyNkZWZpbmUJQU5UTFIzX01JU01BVENIRURfVFJFRV9OT0RFX0VYQ0VQVElPTgk3CisjZGVmaW5lCUFOVExSM19NSVNNQVRDSEVEX1RSRUVfTk9ERV9OQU1FICAgICJvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24iCisKKyNkZWZpbmUJQU5UTFIzX1JFV1JJVEVfRUFSTFlfRVhDRVBUSU9OCTgKKyNkZWZpbmUJQU5UTFIzX1JFV1JJVEVfRUFSTFlfRVhDRVBUSU9OX05BTUUgICAgIm9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbiIKKworI2RlZmluZQlBTlRMUjNfVU5XQU5URURfVE9LRU5fRVhDRVBUSU9OCTkKKyNkZWZpbmUJQU5UTFIzX1VOV0FOVEVEX1RPS0VOX0VYQ0VQVElPTl9OQU1FICAgICJvcmcuYW50bHIucnVudGltZS5VbndhbnRlZFRva2VuRXhjZXB0aW9uIgorCisjZGVmaW5lCUFOVExSM19NSVNTSU5HX1RPS0VOX0VYQ0VQVElPTgkxMAorI2RlZmluZQlBTlRMUjNfTUlTU0lOR19UT0tFTl9FWENFUFRJT05fTkFNRSAgICAib3JnLmFudGxyLnJ1bnRpbWUuTWlzc2luZ1Rva2VuRXhjZXB0aW9uIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBCYXNlIHN0cnVjdHVyZSBmb3IgYW4gQU5UTFIzIGV4Y2VwdGlvbiB0cmFja2VyCisgKi8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19FWENFUFRJT05fc3RydWN0Cit7CisJLy8vIFNldCB0byBvbmUgb2YgdGhlIGV4Y2VwdGlvbiB0eXBlIGRlZmluZXM6CisJLy8vCisJLy8vICAtICNBTlRMUjNfUkVDT0dOSVRJT05fRVhDRVBUSU9OCisJLy8vICAtICNBTlRMUjNfTUlTTUFUQ0hFRF9UT0tFTl9FWENFUFRJT04KKwkvLy8gIC0gI0FOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTgorCS8vLyAgLSAjQU5UTFIzX01JU01BVENIRURfU0VUX0VYQ0VQVElPTgorCS8vLyAgLSAjQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OCisJLy8vICAtICNBTlRMUjNfRkFJTEVEX1BSRURJQ0FURV9FWENFUFRJT04KKwkvLy8gIC0gI0FOVExSM19FQVJMWV9FWElUX0VYQ0VQVElPTgorICAgIC8vLworICAgIEFOVExSM19VSU5UMzIgICB0eXBlOworCisgICAgLyoqIFRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgZXhjZXB0aW9uCisgICAgICovCisgICAgdm9pZCAgICAqCSAgICBuYW1lOworCisgICAgLyoqIFRoZSBwcmludGFibGUgbWVzc2FnZSB0aGF0IGdvZXMgd2l0aCB0aGlzIGV4Y2VwdGlvbiwgaW4geW91ciBwcmVmZXJyZWQKKyAgICAgKiAgZW5jb2RpbmcgZm9ybWF0LiBBTlRMUiBqdXN0IHVzZXMgQVNDSUkgYnkgZGVmYXVsdCBidXQgeW91IGNhbiBpZ25vcmUgdGhlc2UKKyAgICAgKiAgbWVzc2FnZXMgb3IgY29udmVydCB0aGVtIHRvIGFub3RoZXIgZm9ybWF0IG9yIHdoYXRldmVyIG9mIGNvdXJzZS4gVGhleSBhcmUKKyAgICAgKiAgcmVhbGx5IGludGVybmFsIG1lc3NhZ2VzIHRoYXQgeW91IHRoZW4gZGVjaWRlIGhvdyB0byBwcmludCBvdXQgaW4gYSBmb3JtIHRoYXQKKyAgICAgKiAgdGhlIHVzZXJzIG9mIHlvdXIgcHJvZHVjdCB3aWxsIHVuZGVyc3RhbmQsIGFzIHRoZXkgYXJlIHVubGlrZWx5IHRvIGtub3cgd2hhdAorICAgICAqICB0byBkbyB3aXRoICJSZWNvZ25pdGlvbiBleGNlcHRpb24gYXQ6IFtbVE9LX0dFUlVORC4uLi4uICIgOy0pCisgICAgICovCisgICAgdm9pZCAgICAqCSAgICBtZXNzYWdlOworCisgICAgLyoqIE5hbWUgb2YgdGhlIGZpbGUvaW5wdXQgc291cmNlIGZvciByZXBvcnRpbmcuIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBOVUxMISEKKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORyBzdHJlYW1OYW1lOworCisgICAgLyoqIElmIHNldCB0byBBTlRMUjNfVFJVRSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVzc2FnZSBlbGVtZW50IG9mIHRoaXMgc3RydWN0dXJlCisgICAgICogIHNob3VsZCBiZSBmcmVlZCBieSBjYWxsaW5nIEFOVExSM19GUkVFKCkgd2hlbiB0aGUgZXhjZXB0aW9uIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBBTlRMUjNfQk9PTEVBTiAgZnJlZU1lc3NhZ2U7CisKKyAgICAvKiogSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgJ3Rva2VuJyB3ZSB3ZXJlIGxvb2tpbmcgYXQgd2hlbiB0aGUKKyAgICAgKiAgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIgIGluZGV4OworCisgICAgLyoqIEluZGljYXRlcyB3aGF0IHRoZSBjdXJyZW50IHRva2VuL3RyZWUgd2FzIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkLiBTaW5jZSBub3QKKyAgICAgKiAgYWxsIGlucHV0IHN0cmVhbXMgd2lsbCBiZSBhYmxlIHRvIHJldHJpZXZlIHRoZSBudGggdG9rZW4sIHdlIHRyYWNrIGl0IGhlcmUKKyAgICAgKiAgaW5zdGVhZC4gVGhpcyBpcyBmb3IgcGFyc2VycywgYW5kIGV2ZW4gdHJlZSBwYXJzZXJzIG1heSBzZXQgdGhpcy4KKyAgICAgKi8KKyAgICB2b2lkCSogdG9rZW47CisKKyAgICAvKiogSW5kaWNhdGVzIHRoZSB0b2tlbiB3ZSB3ZXJlIGV4cGVjdGluZyB0byBzZWUgbmV4dCB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICBleHBlY3Rpbmc7CisKKyAgICAvKiogSW5kaWNhdGVzIGEgc2V0IG9mIHRva2VucyB0aGF0IHdlIHdlcmUgZXhwZWN0aW5nIHRvIHNlZSBvbmUgb2Ygd2hlbiB0aGUKKyAgICAgKiAgZXJyb3Igb2NjdXJyZWQuIEl0IGlzIGEgZm9sbG93aW5nIGJpdHNldCBsaXN0LCBzbyB5b3UgY2FuIHVzZSBsb2FkIGl0IGFuZCB1c2UgLT50b0ludExpc3QoKSBvbiBpdAorICAgICAqICB0byBnZW5lcmF0ZSBhbiBhcnJheSBvZiBpbnRlZ2VyIHRva2VucyB0aGF0IGl0IHJlcHJlc2VudHMuCisgICAgICovCisgICAgcEFOVExSM19CSVRTRVRfTElTVCAgZXhwZWN0aW5nU2V0OworCisgICAgLyoqIElmIHRoaXMgaXMgYSB0cmVlIHBhcnNlciBleGNlcHRpb24gdGhlbiB0aGUgbm9kZSBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIG5vZGUKKyAgICAgKiB0aGF0IGNhdXNlZCB0aGUgaXNzdWUuCisgICAgICovCisgICAgdm9pZAkqIG5vZGU7CisKKyAgICAvKiogVGhlIGN1cnJlbnQgY2hhcmFjdGVyIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgLSBmb3IgbGV4ZXJzLgorICAgICAqLworICAgIEFOVExSM19VQ0hBUiAgIGM7CisKKyAgICAvKiogVHJhY2sgdGhlIGxpbmUgYXQgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkIGluIGNhc2UgdGhpcyBpcworICAgICAqICBnZW5lcmF0ZWQgZnJvbSBhIGxleGVyLiAgV2UgbmVlZCB0byB0cmFjayB0aGlzIHNpbmNlIHRoZQorICAgICAqICB1bmV4cGVjdGVkIGNoYXIgZG9lc24ndCBjYXJyeSB0aGUgbGluZSBpbmZvLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIgICBsaW5lOworCisgICAgLyoqIENoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgbGluZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICovCisgICAgQU5UTFIzX0lOVDMyICAgY2hhclBvc2l0aW9uSW5MaW5lOworCisgICAgLyoqIGRlY2lzaW9uIG51bWJlciBmb3IgTlZFCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMiAgIGRlY2lzaW9uTnVtOworCisgICAgLyoqIFN0YXRlIGZvciBOVkUKKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgc3RhdGU7CisKKyAgICAvKiogUnVsZSBuYW1lIGZvciBmYWlsZWQgcHJlZGljYXRlIGV4Y2VwdGlvbgorICAgICAqLworICAgIHZvaWQJICAgICogcnVsZU5hbWU7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgbmV4dCBleGNlcHRpb24gaW4gdGhlIGNoYWluIChpZiBhbnkpCisgICAgICovCisgICAgc3RydWN0IEFOVExSM19FWENFUFRJT05fc3RydWN0ICogbmV4dEV4Y2VwdGlvbjsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBzdHJlYW0gdGhhdCB0aGlzIGV4Y2VwdGlvbiBvY2N1cnJlZCBpbi4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0lOVF9TVFJFQU0gICAgaW5wdXQ7CisKKyAgICAvKiogUG9pbnRlciBmb3IgeW91LCB0aGUgcHJvZ3JhbW1lciB0byBhZGQgYW55dGhpbmcgeW91IGxpa2UgdG8gYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHZvaWQgICAgKgkgICAgY3VzdG9tOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSByb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHRvIGZyZWUgdGhlIGN1c3RvbSBleGNlcHRpb24gc3RydWN0dXJlCisgICAgICogIHdoZW4gdGhlIGV4Y2VwdGlvbiBpcyBkZXN0cm95ZWQuIFNldCB0byBOVUxMIGlmIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuCisgICAgICovCisgICAgdm9pZAkgICAgKCpmcmVlQ3VzdG9tKSAgICh2b2lkICogY3VzdG9tKTsKKyAgICB2b2lkCSAgICAoKnByaW50KQkgICAgKHN0cnVjdCBBTlRMUjNfRVhDRVBUSU9OX3N0cnVjdCAqIGV4KTsKKyAgICB2b2lkCSAgICAoKmZyZWVFeCkJICAgIChzdHJ1Y3QgQU5UTFIzX0VYQ0VQVElPTl9zdHJ1Y3QgKiBleCk7CisKK30KKyAgICBBTlRMUjNfRVhDRVBUSU9OOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2ZpbGVzdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNmaWxlc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2ZWI0NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNmaWxlc3RyZWFtLmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZglfQU5UTFIzX0ZJTEVTVFJFQU1fSAorI2RlZmluZQlfQU5UTFIzX0ZJTEVTVFJFQU1fSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworQU5UTFIzX0FQSSBBTlRMUjNfRkRTQwlhbnRscjNGb3BlbgkocEFOVExSM19VSU5UOCBmaWxlbmFtZSwgY29uc3QgY2hhciAqIG1vZGUpOworQU5UTFIzX0FQSSB2b2lkCQlhbnRscjNGY2xvc2UJKEFOVExSM19GRFNDIGZkKTsKKworQU5UTFIzX0FQSSBBTlRMUjNfVUlOVDMyCWFudGxyM0ZzaXplCShwQU5UTFIzX1VJTlQ4IGZpbGVuYW1lKTsKK0FOVExSM19BUEkgQU5UTFIzX1VJTlQzMglhbnRscjNyZWFkOEJpdAkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIHBBTlRMUjNfVUlOVDggZmlsZU5hbWUpOworQU5UTFIzX0FQSSBBTlRMUjNfVUlOVDMyCWFudGxyM0ZyZWFkCShBTlRMUjNfRkRTQyBmZHNjLCBBTlRMUjNfVUlOVDMyIGNvdW50LCAgdm9pZCAqIGRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNpbnB1dC5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwMWFlNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNpbnB1dC5oCkBAIC0wLDAgKzEsMjgxIEBACisvKiogXGZpbGUKKyAqIERlZmluZXMgdGhlIGJhc2ljIHN0cnVjdHVyZXMgdXNlZCB0byBtYW5pcHVsYXRlIGNoYXJhY3RlcgorICogc3RyZWFtcyBmcm9tIGFueSBpbnB1dCBzb3VyY2UuIEFueSBjaGFyYWN0ZXIgc2l6ZSBhbmQgZW5jb2RpbmcKKyAqIGNhbiBpbiB0aGVvcnkgYmUgdXNlZCwgc28gbG9uZyBhcyBhIHNldCBvZiBmdW5jdGlub3MgaXMgcHJvdmlkZWQgdGhhdAorICogY2FuIHJldHVybiBhIDMyIGJpdCBJbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZWlyIGNoYXJhY3RlcnMgYW1kIGVmZmljaWVudGx5IG1hcmsgYW5kIHJldmVydAorICogdG8gc3BlY2lmaWMgb2Zmc2V0cyBpbnRvIHRoZWlyIGlucHV0IHN0cmVhbXMuCisgKi8KKyNpZm5kZWYJX0FOVExSM19JTlBVVF9ICisjZGVmaW5lCV9BTlRMUjNfSU5QVVRfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzc3RyaW5nLmg+CisjaW5jbHVkZSAgICA8YW50bHIzY29tbW9udG9rZW4uaD4KKyNpbmNsdWRlICAgIDxhbnRscjNpbnRzdHJlYW0uaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb252ZXJ0dXRmLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKy8vLyBNYXN0ZXIgY29udGV4dCBzdHJ1Y3R1cmUgZm9yIGFuIEFOVExSMyBDIHJ1bnRpbWUgYmFzZWQgaW5wdXQgc3RyZWFtLgorLy8vIFxpbmdyb3VwIGFwaXN0cnVjdHVyZXMKKy8vLwordHlwZWRlZglzdHJ1Y3QJQU5UTFIzX0lOUFVUX1NUUkVBTV9zdHJ1Y3QKK3sKKyAgICAvKiogSW50ZXJmYWNlcyB0aGF0IHByb3ZpZGUgc3RyZWFtcyBtdXN0IGFsbCBwcm92aWRlCisgICAgICogIGEgZ2VuZXJpYyBBTlRMUjNfSU5UX1NUUkVBTSBpbnRlcmZhY2UgYW5kIGFuIEFOVExSM19JTlBVVF9TVFJFQU0KKyAgICAgKiAgaXMgbm8gZGlmZmVyZW50LgorICAgICAqLworICAgIHBBTlRMUjNfSU5UX1NUUkVBTQlpc3RyZWFtOworCisgICAgLyoqIFdoYXRldmVyIHN1cGVyIHN0cnVjdHVyZSBpcyBwcm92aWRpbmcgdGhlIElOUFVUIHN0cmVhbSBuZWVkcyBhIHBvaW50ZXIgdG8gaXRzZWxmCisgICAgICogIHNvIHRoYXQgdGhpcyBjYW4gYmUgcGFzc2VkIGJhY2sgdG8gaXQgd2hlbmV2ZXIgdGhlIGFwaSBmdW5jdGlvbnMKKyAgICAgKiAgYXJlIGNhbGxlZCBiYWNrIGZyb20gdGhpcyBpbnRlcmZhY2UuCisgICAgICovCisgICAgdm9pZAkgICAgICAqIHN1cGVyOworCisgICAgLyoqIFBvaW50ZXIgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBzdHJpbmcsIGNoYXJhY3RlcnMgbWF5IGJlCisgICAgICogIHRha2VuIGFzIG9mZnNldHMgZnJvbSBoZXJlIGFuZCBpbiBvcmlnaW5hbCBpbnB1dCBmb3JtYXQgZW5jb2RpbmcuCisgICAgICovCisgICAgdm9pZAkgICAgICAqCWRhdGE7CisKKyAgICAvKiogSW5kaWNhdGVzIGlmIHRoZSBkYXRhIHBvaW50ZXIgd2FzIGFsbG9jYXRlZCBieSB1cywgYW5kIHNvIHNob3VsZCBiZSBmcmVlZAorICAgICAqICB3aGVuIHRoZSBzdHJlYW0gZGllcy4KKyAgICAgKi8KKyAgICBpbnQJCQlpc0FsbG9jYXRlZDsKKworICAgIC8qKiBTdHJpbmcgZmFjdG9yeSBmb3IgdGhpcyBpbnB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklOR19GQUNUT1JZICBzdHJGYWN0b3J5OworCisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQgZnJvbSB0aGUgaW5wdXQgZGF0YQorICAgICAqICBUaGlzIGlzIGNhc3QgdG8gcG9pbnQgYXQgdGhlIGVuY29kaW5nIG9mIHRoZSBvcmlnaW5hbCBmaWxlIHRoYXQKKyAgICAgKiAgd2FzIHJlYWQgYnkgdGhlIGZ1bmN0aW9ucyBpbnN0YWxsZWQgYXMgcG9pbnRlciBpbiB0aGlzIGlucHV0IHN0cmVhbQorICAgICAqICBjb250ZXh0IGluc3RhbmNlIGF0IGZpbGUvc3RyaW5nL3doYXRldmVyIGxvYWQgdGltZS4KKyAgICAgKi8KKyAgICB2b2lkCSAgICAgICogbmV4dENoYXI7CisKKyAgICAvKiogTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgY29uc3VtZWQgYXQgdGhpcyBwb2ludCBpbiB0aW1lLgorICAgICAqICBNb3N0bHkgdGhpcyBpcyBqdXN0IHdoYXQgaXMgbGVmdCBpbiB0aGUgcHJlLXJlYWQgYnVmZmVyLCBidXQgaWYgdGhlCisgICAgICogIGlucHV0IHNvdXJjZSBpcyBhIHN0cmVhbSBzdWNoIGFzIGEgc29ja2V0IG9yIHNvbWV0aGluZyB0aGVuIHdlIG1heQorICAgICAqICBjYWxsIHNwZWNpYWwgcmVhZCBjb2RlIHRvIHdhaXQgZm9yIG1vcmUgaW5wdXQuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMglzaXplQnVmOworCisgICAgLyoqIFRoZSBsaW5lIG51bWJlciB3ZSBhcmUgdHJhdmVyc2luZyBpbiB0aGUgaW5wdXQgZmlsZS4gVGhpcyBnZXRzIGluY3JlbWVudGVkCisgICAgICogIGJ5IGEgbmV3bGluZSgpIGNhbGwgaW4gdGhlIGxleGVyIGdyYW1tYXIgYWN0aW9ucy4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCWxpbmU7CisKKyAgICAvKiogUG9pbnRlciBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhlIGN1cnJlbnQgbGluZQorICAgICAqICBzdGFydGVkLgorICAgICAqLworICAgIHZvaWQJICAgICAgKiBjdXJyZW50TGluZTsKKworICAgIC8qKiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlcgorICAgICAqLworICAgIEFOVExSM19JTlQzMgljaGFyUG9zaXRpb25JbkxpbmU7CisKKyAgICAvKiogVHJhY2tzIGhvdyBkZWVwIG1hcmsoKSBjYWxscyBhcmUgbmVzdGVkCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgltYXJrRGVwdGg7CisKKyAgICAvKiogTGlzdCBvZiBtYXJrKCkgcG9pbnRzIGluIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwQU5UTFIzX1ZFQ1RPUgltYXJrZXJzOworCisgICAgLyoqIEZpbGUgbmFtZSBzdHJpbmcsIHNldCB0byBwb2ludGVyIHRvIG1lbW9yeSBpZgorICAgICAqIHlvdSBzZXQgaXQgbWFudWFsbHkgYXMgaXQgd2lsbCBiZSBmcmVlKClkCisgICAgICovCisgICAgcEFOVExSM19TVFJJTkcJZmlsZU5hbWU7CisKKyAgICAvKiogRmlsZSBudW1iZXIsIG5lZWRzIHRvIGJlIHNldCBtYW51YWxseSB0byBzb21lIGZpbGUgaW5kZXggb2YgeW91ciBkZXZpc2luZy4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCWZpbGVObzsKKworICAgIC8qIEFQSSAqLworCisKKyAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgY2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICB2b2lkCQkoKmNsb3NlKQkoc3RydWN0CUFOVExSM19JTlBVVF9TVFJFQU1fc3RydWN0ICogaW5wdXQpOworICAgIHZvaWQJCSgqZnJlZSkJCShzdHJ1Y3QJQU5UTFIzX0lOUFVUX1NUUkVBTV9zdHJ1Y3QgKiBpbnB1dCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJlc2V0cyB0aGUgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgdm9pZAkJKCpyZXNldCkJKHN0cnVjdAlBTlRMUjNfSU5QVVRfU1RSRUFNX3N0cnVjdCAqIGlucHV0KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXVzZXMgYW5kIHJlc2V0cyBhbiBpbnB1dCBzdHJlYW0gYnkKKyAgICAgKiAgc3VwcGx5aW5nIGEgbmV3ICdzb3VyY2UnCisgICAgICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAoKnJldXNlKSAgICAgICAgKHN0cnVjdAlBTlRMUjNfSU5QVVRfU1RSRUFNX3N0cnVjdCAqIGlucHV0LCBwQU5UTFIzX1VJTlQ4IGluU3RyaW5nLCBBTlRMUjNfVUlOVDMyIHNpemUsIHBBTlRMUjNfVUlOVDggbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgaW5zdGFsbHMgYSB2ZXJzaW9uIG9mIExBIHRoYXQgYWx3YXlzCisgICAgICogcmV0dXJucyB1cHBlciBjYXNlLiBPbmx5IHZhbGlkIGZvciBjaGFyYWN0ZXIgc3RyZWFtcyBhbmQgY3JlYXRlcyBhIGNhc2UKKyAgICAgKiBpbnNlbnNpdGl2ZSBsZXhlciBpZiB0aGUgbGV4ZXIgdG9rZW5zIGFyZSBkZXNjcmliZWQgaW4gdXBwZXIgY2FzZS4gVGhlCisgICAgICogdG9rZW5zIHdpbGwgcHJlc2VydmUgY2FzZSBpbiB0aGUgdG9rZW4gdGV4dC4KKyAgICAgKi8KKyAgICB2b2lkCQkoKnNldFVjYXNlTEEpCQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19CT09MRUFOIGZsYWcpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gcmV0dXJuIGlucHV0IHN0cmVhbSBlbGVtZW50IGF0IDEgYmFzZWQKKyAgICAgKiAgb2Zmc2V0IGZyb20gbmV4dENoYXIuIFNhbWUgYXMgX0xBIGZvciBjaGFyIHN0cmVhbSwgYnV0IHRva2VuCisgICAgICogIHN0cmVhbXMgZXRjLiBoYXZlIG9uZSBvZiB0aGVzZSB0aGF0IGRvZXMgb3RoZXIgc3R1ZmYgb2YgY291cnNlLgorICAgICAqLworICAgIHZvaWQgKgkJKCpfTFQpCQkoc3RydWN0CUFOVExSM19JTlBVVF9TVFJFQU1fc3RydWN0ICogaW5wdXQsIEFOVExSM19JTlQzMiBsdCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHRvdGFsIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci4gRm9yIHN0cmVhbXMKKyAgICAgKiAgdGhpcyBtYXkgYmUganVzdCB0aGUgdG90YWwgd2UgaGF2ZSBhdmFpbGFibGUgc28gZmFyLiBUaGlzIG1lYW5zIG9mIGNvdXJzZSB0aGF0CisgICAgICogIHRoZSBpbnB1dCBzdHJlYW0gbXVzdCBiZSBjYXJlZnVsIHRvIGFjY3VtdWxhdGUgZW5vdWdoIGlucHV0IHNvIHRoYXQgYW55IGJhY2t0cmFja2luZworICAgICAqICBjYW4gYmUgc2F0aXNmaWVkLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIJKCpzaXplKQkJKHN0cnVjdCBBTlRMUjNfSU5QVVRfU1RSRUFNX3N0cnVjdCAqIGlucHV0KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRvIHJldHVybiBhIHN1YnN0cmluZyBvZiB0aGUgaW5wdXQgc3RyZWFtLiBTdHJpbmcgaXMgcmV0dXJuZWQgaW4gYWxsb2NhdGVkCisgICAgICogIG1lbW9yeSBhbmQgaXMgaW4gc2FtZSBlbmNvZGluZyBhcyB0aGUgaW5wdXQgc3RyZWFtIGl0c2VsZiwgTk9UIGludGVybmFsIEFOVExSM19VQ0hBUiBmb3JtLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HCSgqc3Vic3RyKQkoc3RydWN0IEFOVExSM19JTlBVVF9TVFJFQU1fc3RydWN0ICogaW5wdXQsIEFOVExSM19NQVJLRVIgc3RhcnQsIEFOVExSM19NQVJLRVIgc3RvcCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gdGhlIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIEFOVExSM19VSU5UMzIJKCpnZXRMaW5lKQkoc3RydWN0IEFOVExSM19JTlBVVF9TVFJFQU1fc3RydWN0ICogaW5wdXQpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBjdXJyZW50IGxpbmUgYnVmZmVyIGluIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKiAgVGhlIHBvaW50ZXIgcmV0dXJuZWQgaXMgZGlyZWN0bHkgaW50byB0aGUgaW5wdXQgc3RyZWFtIHNvIHlvdSBtdXN0IGNvcHkKKyAgICAgKiAgaXQgaWYgeW91IHdpc2ggdG8gbWFuaXB1bGF0ZSBpdCB3aXRob3V0IGRhbWFnaW5nIHRoZSBpbnB1dCBzdHJlYW0uIEVuY29kaW5nCisgICAgICogIGlzIG9idmlvdXNseSBpbiB0aGUgc2FtZSBmb3JtIGFzIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogIFxyZW1hcmsKKyAgICAgKiAgICAtIE5vdGUgdGFodCB0aGlzIGZ1bmN0aW9uIHdpbCBsYmUgaW5hY2N1cmF0ZSBpZiBzZXRMaW5lIGlzIGNhbGxlZCBhcyB0aGVyZQorICAgICAqICAgICAgaXMgbm8gd2F5IGF0IHRoZSBtb21lbnQgdG8gcG9zaXRpb24gdGhlIGlucHV0IHN0cmVhbSBhdCBhIHBhcnRpY3VsYXIgbGluZSAKKyAgICAgKgkgICAgbnVtYmVyIG9mZnNldC4KKyAgICAgKi8KKyAgICB2b2lkCSAgKgkoKmdldExpbmVCdWYpCShzdHJ1Y3QgQU5UTFIzX0lOUFVUX1NUUkVBTV9zdHJ1Y3QgKiBpbnB1dCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSBsaW5lCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkoKmdldENoYXJQb3NpdGlvbkluTGluZSkgIChzdHJ1Y3QgQU5UTFIzX0lOUFVUX1NUUkVBTV9zdHJ1Y3QgKiBpbnB1dCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0byBzZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gdGhlIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIHZvaWQJCSgqc2V0TGluZSkJCSAgKHN0cnVjdCBBTlRMUjNfSU5QVVRfU1RSRUFNX3N0cnVjdCAqIGlucHV0LCBBTlRMUjNfVUlOVDMyIGxpbmUpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICovCisgICAgdm9pZAkJKCpzZXRDaGFyUG9zaXRpb25JbkxpbmUpICAoc3RydWN0IEFOVExSM19JTlBVVF9TVFJFQU1fc3RydWN0ICogaW5wdXQsIEFOVExSM19VSU5UMzIgcG9zaXRpb24pOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbmV3bGluZSBjaGFyYWN0ZXIgdGhhdCB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogIGxvb2tzIGZvciB0byB0cmlnZ2VyIHRoZSBsaW5lL29mZnNldCBhbmQgbGluZSBidWZmZXIgcmVjb3JkaW5nIGluZm9ybWF0aW9uLgorICAgICAqICBccmVtYXJrCisgICAgICogICAtIEJ5IGRlZmF1bHQgdGhlIGNocmFjdGVyICdcbicgd2lsbCBiZSBpbnN0YWxsZWQgYXMgdGhlIG5ld2xpbmUgdHJpZ2dlciBjaGFyYWN0ZXIuIFdoZW4gdGhpcworICAgICAqICAgICBjaGFyYWN0ZXIgaXMgc2VlbiBieSB0aGUgY29uc3VtZSgpIGZ1bmN0aW9uIHRoZW4gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYW5kIHRoZQorICAgICAqICAgICBjdXJyZW50IGxpbmUgb2Zmc2V0IGlzIHJlc2V0IHRvIDAuIFRoZSBQb2ludGVyIGZvciB0aGUgbGluZSBvZiBpbnB1dCB3ZSBhcmUgY29uc3VtaW5nCisgICAgICogICAgIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyIHRoaXMgb25lIGluIHRoZSBpbnB1dCBzdHJlYW0gKHdoaWNoIG1lYW5zIGl0CisgICAgICogICAgIG1heSBiZWNvbWUgaW52YWxpZCBpZiB0aGUgbGFzdCBuZXdsaW5lIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBpcyBzZWVuIChzbyB3YXRjaCBvdXQpLgorICAgICAqICAgLSBJZiBmb3Igc29tZSByZWFzb24geW91IGRvIG5vdCB3YW50IHRoZSBjb3VudGVycyBhbmQgcG9pbnRlcnMgdG8gYmUgcmVzdGVlLCB5b3UgY2FuIHNldCB0aGUgCisgICAgICogICAgIGNocmFjdGVyIHRvIHNvbWUgaW1wb3NzaWJsZSBjaGFyYWN0ZXIgc3VjaCBhcyAnXDAnIG9yIHdoYXRldmVyLgorICAgICAqICAgLSBUaGlzIGlzIGEgc2luZ2xlIGNoYXJhY3RlciBvbmx5LCBzbyBjaG9vc2UgdGhlIGxhc3QgY2hhcmFjdGVyIGluIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUuCisgICAgICogICAtIFRoaXMgaXMgb25seSBhIHNpbXBsZSBhaWQgdG8gZXJyb3IgcmVwb3J0aW5nIC0gaWYgeW91IGhhdmUgYSBjb21wbGljYXRlZCBiaW5hcnkgaW5wdXQgc3RydWN0dXJlCisgICAgICogICAgIGl0IG1heSBub3QgYmUgYWRlcXVhdGUsIGJ1dCB5b3UgY2FuIGFsd2F5cyBvdmVycmlkZSBldmVyeSBmdW5jdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtIHdpdGggeW91cgorICAgICAqICAgICBvd24gb2YgY291cnNlLCBhbmQgY2FuIGV2ZW4gd3JpdGUgeW91ciBvd24gY29tcGxldGUgaW5wdXQgc3RyZWFtIHNldCBpZiB5b3UgbGlrZS4KKyAgICAgKiAgIC0gSXQgaXMgeW91ciByZXNwb25zaWJsaXR5IHRvIHNldCBhIHZhbGlkIGNoYXJhY3RlciBmb3IgdGhlIGlucHV0IHN0cmVhbSB0eXBlLiBUaGVyZSBpcyBubyBwb2ludCAKKyAgICAgKiAgICAgc2V0dGluZyB0aGlzIHRvIDB4RkZGRkZGRkYgaWYgdGhlIGlucHV0IHN0cmVhbSBpcyA4IGJpdCBBU0NJSSwgYXMgdGhpcyB3aWxsIGp1c3QgYmUgdHJ1bmNhdGVkIGFuZCBuZXZlcgorICAgICAqCSAgIHRyaWdnZXIgYXMgdGhlIGNvbXBhcmlzb24gd2lsbCBiZSAoSU5UMzIpMHhGRiA9PSAoSU5UMzIpMHhGRkZGRkZGRgorICAgICAqLworICAgIHZvaWQJCSgqU2V0TmV3TGluZUNoYXIpCSAgICAoc3RydWN0IEFOVExSM19JTlBVVF9TVFJFQU1fc3RydWN0ICogaW5wdXQsIEFOVExSM19VSU5UMzIgbmV3bGluZUNoYXIpOworCisgICAgLy8vIENoYXJhY3RlciB0aGF0IGF1dG9tYXRpY2FsbHkgY2F1c2VzIGFuIGludGVybmFsIGxpbmUgY291bnQKKyAgICAvLy8gIGluY3JlbWVudC4KKyAgICAvLy8KKyAgICBBTlRMUjNfVUNIQVIJbmV3bGluZUNoYXI7CisKKyAgICAvLy8gSW5kaWNhdGVzIHRoZSBzaXplLCBpbiA4IGJpdCB1bml0cywgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBOb3RlIHRoYXQKKyAgICAvLy8gdGhlIEMgcnVudGltZSBkb2VzIG5vdCBkZWFsIHdpdGggc3Vycm9nYXRlcyBhcyB0aGlzIHdvdWxkIGJlCisgICAgLy8vIHNsb3cgYW5kIGNvbXBsaWNhdGVkLiBJZiB0aGlzIGlzIGEgVVRGLTggc3RyZWFtIHRoZW4gdGhpcyBmaWVsZAorICAgIC8vLyB3aWxsIGJlIHNldCB0byAwLiBHZW5lcmFsbHkgeW91IGFyZSBiZXN0IHdvcmtpbmcgaW50ZXJuYWxseSB3aXRoIDMyIGJpdCBjaGFyYWN0ZXJzCisgICAgLy8vIGFzIHRoaXMgaXMgdGhlIG1vc3QgZWZmaWNpZW50LgorICAgIC8vLworICAgIEFOVExSM19VSU5UOAljaGFyQnl0ZVNpemU7CisKKyAgICAvLy8gSW5kaWNhdGVzIHRoZSBlbmNvZGluZyBzY2hlbWUgdXNlZCBpbiB0aGlzIGlucHV0IHN0cmVhbQorICAgIC8vLworICAgIEFOVExSM19VSU5UMzIgICAgICAgZW5jb2Rpbmc7Cit9CisKKyAgICBBTlRMUjNfSU5QVVRfU1RSRUFNOworCisKKy8qKiBcYnJpZWYgU3RydWN0dXJlIGZvciB0cmFjayBsZXggaW5wdXQgc3RhdGVzIGFzIHBhcnQgb2YgbWFyaygpCisgKiAgYW5kIHJld2luZCgpIG9mIGxleGVyLgorICovCit0eXBlZGVmCXN0cnVjdAlBTlRMUjNfTEVYX1NUQVRFX3N0cnVjdAoreworICAgICAgICAvKiogUG9pbnRlciB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQgZnJvbSB0aGUgaW5wdXQgZGF0YQorICAgICAqICBUaGlzIGlzIGNhc3QgdG8gcG9pbnQgYXQgdGhlIGVuY29kaW5nIG9mIHRoZSBvcmlnaW5hbCBmaWxlIHRoYXQKKyAgICAgKiAgd2FzIHJlYWQgYnkgdGhlIGZ1bmN0aW9ucyBpbnN0YWxsZWQgYXMgcG9pbnRlciBpbiB0aGlzIGlucHV0IHN0cmVhbQorICAgICAqICBjb250ZXh0IGluc3RhbmNlIGF0IGZpbGUvc3RyaW5nL3doYXRldmVyIGxvYWQgdGltZS4KKyAgICAgKi8KKyAgICB2b2lkCSAgICAgICogbmV4dENoYXI7CisKKyAgICAvKiogVGhlIGxpbmUgbnVtYmVyIHdlIGFyZSB0cmF2ZXJzaW5nIGluIHRoZSBpbnB1dCBmaWxlLiBUaGlzIGdldHMgaW5jcmVtZW50ZWQKKyAgICAgKiAgYnkgYSBuZXdsaW5lKCkgY2FsbCBpbiB0aGUgbGV4ZXIgZ3JhbW1lciBhY3Rpb25zLgorICAgICAqLworICAgIEFOVExSM19VSU5UMzIJbGluZTsKKworICAgIC8qKiBQb2ludGVyIGludG8gdGhlIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgY3VycmVudCBsaW5lCisgICAgICogIHN0YXJ0ZWQuCisgICAgICovCisgICAgdm9pZAkgICAgICAqIGN1cnJlbnRMaW5lOworCisgICAgLyoqIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICovCisgICAgQU5UTFIzX0lOVDMyCWNoYXJQb3NpdGlvbkluTGluZTsKKworfQorICAgIEFOVExSM19MRVhfU1RBVEU7CisKKy8qIFByb3RvdHlwZXMgCisgKi8KK3ZvaWQJICAgIGFudGxyMzhCaXRTZXR1cFN0cmVhbQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpOwordm9pZAkgICAgYW50bHIzVVRGMTZTZXR1cFN0cmVhbQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19CT09MRUFOIG1hY2hpbmVCaWdFbmRpYW4sIEFOVExSM19CT09MRUFOIGlucHV0QmlnRW5kaWFuKTsKK3ZvaWQJICAgIGFudGxyM1VURjMyU2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfQk9PTEVBTiBtYWNoaW5lQmlnRW5kaWFuLCBBTlRMUjNfQk9PTEVBTiBpbnB1dEJpZ0VuZGlhbik7Cit2b2lkCSAgICBhbnRscjNVVEY4U2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKK3ZvaWQJICAgIGFudGxyM0VCQ0RJQ1NldHVwU3RyZWFtCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCk7Cit2b2lkICAgICAgICBhbnRscjNHZW5lcmljU2V0dXBTdHJlYW0gICAgKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBfQU5UTFIzX0lOUFVUX0ggICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzaW50ZXJmYWNlcy5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2ludGVyZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBlMDRkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2ludGVyZmFjZXMuaApAQCAtMCwwICsxLDIzOSBAQAorLyoqIFxmaWxlCisgKiBEZWNsYXJhdGlvbnMgZm9yIGFsbCB0aGUgYW50bHIzIEMgcnVudGltZSBpbnRlcmZhY2VzL2NsYXNzZXMuIFRoaXMKKyAqIGFsbG93cyB0aGUgc3RydWN0dXJlcyB0aGF0IGRlZmluZSB0aGUgaW50ZXJmYWNlcyB0byBjb250YWluIHBvaW50ZXJzIHRvCisgKiBlYWNoIG90aGVyIHdpdGhvdXQgdHJ5aW5nIHRvIHNvcnQgb3V0IHRoZSBjeWNsaWMgaW50ZXJkZXBlbmRlbmNpZXMgdGhhdAorICogd291bGQgb3RoZXJ3aXNlIHJlc3VsdC4KKyAqLworI2lmbmRlZglfQU5UTFIzX0lOVEVSRkFDRVNfSAorI2RlZmluZQlfQU5UTFIzX0lOVEVSRkFDRVNfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0CQkJCQkJKnBBTlRMUjNfSU5UX1NUUkVBTTsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgJ2NsYXNzJyAjQU5UTFIzX0JBU0VfUkVDT0dOSVpFUgorLy8vIFxpbmdyb3VwIEFOVExSM19CQVNFX1JFQ09HTklaRVIKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0JBU0VfUkVDT0dOSVpFUl9zdHJ1Y3QJCQkJKnBBTlRMUjNfQkFTRV9SRUNPR05JWkVSOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUJCQorLy8vIFxpbmdyb3VwIEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURQkJCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURV9zdHJ1Y3QJCSpwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19CSVRTRVRfTElTVAorLy8vIFxpbmdyb3VwIEFOVExSM19CSVRTRVRfTElTVAorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfQklUU0VUX0xJU1Rfc3RydWN0CQkJCQkqcEFOVExSM19CSVRTRVRfTElTVDsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfQklUU0VUCQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19CSVRTRVQJCQkJCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19CSVRTRVRfc3RydWN0CQkJCQkJCSpwQU5UTFIzX0JJVFNFVDsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfVE9LRU5fRkFDVE9SWQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX1RPS0VOX0ZBQ1RPUlkJCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfVE9LRU5fRkFDVE9SWV9zdHJ1Y3QJCQkJCSpwQU5UTFIzX1RPS0VOX0ZBQ1RPUlk7CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19DT01NT05fVE9LRU4JCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19DT01NT05fVE9LRU4JCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX3N0cnVjdAkJCQkJKnBBTlRMUjNfQ09NTU9OX1RPS0VOOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19FWENFUFRJT04JCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfRVhDRVBUSU9OCQkJCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19FWENFUFRJT05fc3RydWN0CQkJCQkJKnBBTlRMUjNfRVhDRVBUSU9OOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19IQVNIX0JVQ0tFVAkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0hBU0hfQlVDS0VUCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0hBU0hfQlVDS0VUX3N0cnVjdAkJCQkJKnBBTlRMUjNfSEFTSF9CVUNLRVQ7CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19IQVNIX0VOVFJZCQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0hBU0hfRU5UUlkJCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0hBU0hfRU5UUllfc3RydWN0CQkJCQkJKnBBTlRMUjNfSEFTSF9FTlRSWTsKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX0hBU0hfRU5VTQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19IQVNIX0VOVU0JCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0hBU0hfRU5VTV9zdHJ1Y3QJCQkJCQkqcEFOVExSM19IQVNIX0VOVU07CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19IQVNIX1RBQkxFCQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0hBU0hfVEFCTEUJCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0hBU0hfVEFCTEVfc3RydWN0CQkJCQkJKnBBTlRMUjNfSEFTSF9UQUJMRTsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfTElTVAkJCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfTElTVAkJCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0xJU1Rfc3RydWN0CQkJCQkJCSpwQU5UTFIzX0xJU1Q7CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19WRUNUT1JfRkFDVE9SWQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZX3N0cnVjdAkJCQkJKnBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlk7CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19WRUNUT1IJCQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX1ZFQ1RPUgkJCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1ZFQ1RPUl9zdHJ1Y3QJCQkJCQkJKnBBTlRMUjNfVkVDVE9SOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfU1RBQ0sJCQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX1NUQUNLCQkJCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfU1RBQ0tfc3RydWN0CQkJCQkJCSpwQU5UTFIzX1NUQUNLOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19UT1BPCisvLy8gXGluZ3JvdXAgQU5UTFIzX1RPUE8KKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1RPUE9fc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEFOVExSM19UT1BPOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19JTlBVVF9TVFJFQU0JCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19JTlBVVF9TVFJFQU0JCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfSU5QVVRfU1RSRUFNX3N0cnVjdAkJCQkJKnBBTlRMUjNfSU5QVVRfU1RSRUFNOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfTEVYX1NUQVRFCQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0xFWF9TVEFURQkJCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfTEVYX1NUQVRFX3N0cnVjdAkJCQkJCSpwQU5UTFIzX0xFWF9TVEFURTsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19TVFJJTkdfRkFDVE9SWQkJCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19TVFJJTkdfRkFDVE9SWV9zdHJ1Y3QJCQkJCSpwQU5UTFIzX1NUUklOR19GQUNUT1JZOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfU1RSSU5HCQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19TVFJJTkcJCQkJCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0CQkJCQkJCSpwQU5UTFIzX1NUUklORzsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfVE9LRU5fU09VUkNFCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfVE9LRU5fU09VUkNFCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1RPS0VOX1NPVVJDRV9zdHJ1Y3QJCQkJCSpwQU5UTFIzX1RPS0VOX1NPVVJDRTsKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX1RPS0VOX1NUUkVBTQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX1RPS0VOX1NUUkVBTQkJCQkJCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19UT0tFTl9TVFJFQU1fc3RydWN0CQkJCQkqcEFOVExSM19UT0tFTl9TVFJFQU07CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19DT01NT05fVE9LRU5fU1RSRUFNCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0JCQkKKy8vLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0CQkJKnBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTTsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfQ1lDTElDX0RGQQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19DWUNMSUNfREZBCQkJCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19DWUNMSUNfREZBX3N0cnVjdAkJCQkJCSpwQU5UTFIzX0NZQ0xJQ19ERkE7CisKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX0xFWEVSCQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19MRVhFUgkJCQkJCQkKKy8vLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdAkJCQkJCQkqcEFOVExSM19MRVhFUjsKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX1BBUlNFUgkJCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfUEFSU0VSCQkJCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfUEFSU0VSX3N0cnVjdAkJCQkJCQkqcEFOVExSM19QQVJTRVI7CisKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX0JBU0VfVFJFRQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19CQVNFX1RSRUUJCQkJCQkKKy8vLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0JBU0VfVFJFRV9zdHJ1Y3QJCQkJCQkqcEFOVExSM19CQVNFX1RSRUU7CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19DT01NT05fVFJFRQkJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0NPTU1PTl9UUkVFCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UUkVFX3N0cnVjdAkJCQkJKnBBTlRMUjNfQ09NTU9OX1RSRUU7CisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19BUkJPUkVUVU0JCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfQVJCT1JFVFVNCQkJCQkJCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19BUkJPUkVUVU1fc3RydWN0CQkJCQkJKnBBTlRMUjNfQVJCT1JFVFVNOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfUEFSU0VfVFJFRQkJCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19QQVJTRV9UUkVFCQkJCQkJCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19QQVJTRV9UUkVFX3N0cnVjdAkJCQkJCSpwQU5UTFIzX1BBUlNFX1RSRUU7CisKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0JCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0JCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19UUkVFX05PREVfU1RSRUFNX3N0cnVjdAkJCQkqcEFOVExSM19UUkVFX05PREVfU1RSRUFNOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0JCQorLy8vIFxpbmdyb3VwIEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTQkJCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTV9zdHJ1Y3QJCSpwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfVFJFRV9XQUxLX1NUQVRFCQkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19UUkVFX1dBTEtfU1RBVEUJCQkJCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19UUkVFX1dBTEtfU1RBVEVfc3RydWN0CQkJCSpwQU5UTFIzX1RSRUVfV0FMS19TVEFURTsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IJCQkJCisvLy8gXGluZ3JvdXAgQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1Jfc3RydWN0CQkJCSpwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUgkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19DT01NT05fVFJFRV9BREFQVE9SCQkJCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19DT01NT05fVFJFRV9BREFQVE9SX3N0cnVjdAkJCSpwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1I7CisKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX1RSRUVfUEFSU0VSCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfVFJFRV9QQVJTRVIJCQkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfVFJFRV9QQVJTRVJfc3RydWN0CQkJCQkqcEFOVExSM19UUkVFX1BBUlNFUjsKKworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfSU5UX1RSSUUJCQkJCQkKKy8vLyBcaW5ncm91cCBBTlRMUjNfSU5UX1RSSUUJCQkJCQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX0lOVF9UUklFX3N0cnVjdAkJCQkJCSpwQU5UTFIzX0lOVF9UUklFOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0JCisvLy8gXGluZ3JvdXAgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTQkKKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QJKnBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNOworLy8vIFBvaW50ZXIgdG8gYW4gaW5zdGFudGlhdGlvbiBvZiAnY2xhc3MnICNBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNCQorLy8vIFxpbmdyb3VwIEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0JCisvLy8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0CSpwQU5UTFIzX1JFV1JJVEVfUlVMRV9UT0tFTl9TVFJFQU07CisKKy8vLyBQb2ludGVyIHRvIGFuIGluc3RhbnRpYXRpb24gb2YgJ2NsYXNzJyAjQU5UTFIzX1JFV1JJVEVfUlVMRV9TVUJTVFJFRV9TVFJFQU0JCisvLy8gXGluZ3JvdXAgQU5UTFIzX1JFV1JJVEVfUlVMRV9TVUJUUkVFX1NUUkVBTQkKKy8vLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QJKnBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19SRVdSSVRFX1JVTEVfTk9ERV9TVFJFQU0JCisvLy8gXGluZ3JvdXAgQU5UTFIzX1JFV1JJVEVfUlVMRV9OT0RFX1NUUkVBTQkKKy8vLwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QJKnBBTlRMUjNfUkVXUklURV9SVUxFX05PREVfU1RSRUFNOworCisvLy8gUG9pbnRlciB0byBhbiBpbnN0YW50aWF0aW9uIG9mICdjbGFzcycgI0FOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUgkJCQorLy8vIFxpbmdyb3VwIEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUgkJCQorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVJfc3RydWN0CQkJKnBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVI7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2ludHN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2ludHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmFjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzaW50c3RyZWFtLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qKiBcZmlsZQorICogRGVmaW5lcyB0aGUgdGhlIGNsYXNzIGludGVyZmFjZSBmb3IgYW4gYW50bHIzIElOVFNUUkVBTS4KKyAqIAorICogQ2VydGFpbiBmdW5jdGlvbmFsaXR5IChzdWNoIGFzIERGQXMgZm9yIGluc3RhbmNlKSBhYnN0cmFjdCB0aGUgc3RyZWFtIG9mIHRva2VucworICogb3IgY2hhcmFjdGVycyBpbiB0byBhIHN0ZWFtIG9mIGludGVnZXJzLiBIZW5jZSB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgaW5jbHVkZWQKKyAqIGluIGFueSBzdHJlYW0gdGhhdCBpcyBhYmxlIHRvIHByb3ZpZGUgdGhlIG91dHB1dCBhcyBhIHN0cmVhbSBvZiBpbnRlZ2VycyAod2hpY2ggaXMgYW55dGhpbmcKKyAqIGJhc2ljYWxseS4KKyAqCisgKiBUaGVyZSBhcmUgbm8gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIGluIGdlbmVyYWwuIFRob3VnaAorICogZm9yIHB1cnBvc2VzIG9mIGNhc3RpbmcgYW5kIHNvIG9uLCBpdCBtYXkgYmUgbmVjZXNzc2FyeSB0byBpbXBsZW1lbnQgYSBmdW5jdGlvbiB3aXRoCisgKiB0aGUgc2lnbmF0dXJlIGluIHRoaXMgaW50ZXJmYWNlIHdoaWNoIGFic3RyYWN0cyB0aGUgYmFzZSBpbW1wbGVtZW50YXRpb24uIEluIGVzc2VuY2UgdGhvdWdoCisgKiB0aGUgYmFzZSBzdHJlYW0gcHJvdmlkZXMgYSBwb2ludGVyIHRvIHRoaXMgaW50ZXJmYWNlLCB3aXRoaW4gd2hpY2ggaXQgaW5zdGFsbHMgaXRzCisgKiBub3JtYWwgbWF0Y2goKSBmdW5jdGlvbnMgYW5kIHNvIG9uLiBJbnRlcmFjZXMgc3VjaCBhcyBERkEgYXJlIHRoZW4gcGFzc2VkIHRoZSBwQU5UTFIzX0lOVF9TVFJFQU0KKyAqIGFuZCBjYW4gdHJlYXQgYW55IGlucHV0IGFzIGFuIGludCBzdHJlYW0uIAorICoKKyAqIEZvciBpbnN0YW5jZSwgYSBsZXhlciBpbXBsZW1lbnRzIGEgcEFOVExSM19CQVNFX1JFQ09HTklaRVIsIHdpdGhpbiB3aGljaCB0aGVyZSBpcyBhIHBBTlRMUjNfSU5UX1NUUkVBTS4KKyAqIEhvd2V2ZXIsIGEgcEFOVExSM19JTlBVVF9TVFJFQU0gYWxzbyBwcm92aWRlcyBhIHBBTlRMUjNfSU5UX1NUUkVBTSwgd2hpY2ggaXQgaGFzIGNvbnN0cnVjdGVkIGZyb20KKyAqIGl0J3Mgbm9ybWFsIGludGVyZmFjZSB3aGVuIGl0IHdhcyBjcmVhdGVkLiBUaGlzIGlzIHRoZW4gcG9pbnRlZCBhdCBieSB0aGUgcEFOVExSX0JBU0VfUkVDT0dOSVpFUgorICogd2hlbiBpdCBpcyBpbnRpYWxpemVkIHdpdGggYSBwQU5UTFIzX0lOUFVUX1NUUkVBTS4KKyAqCisgKiBTaW1pbGFybHkgaWYgYSBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiBpcyBpbml0aWFsaXplZCB3aXRoIGEgcEFOVExSM19UT0tFTl9TVFJFQU0sIHRoZW4gdGhlIAorICogcEFOVExSM19JTlRfU1RSRUFNIGlzIHRha2VuIGZyb20gdGhlIHBBTlRMUjNfVE9LRU5fU1RSRUFNLiAKKyAqCisgKiBJZiBhIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIGlzIGluaXRpYWxpemVkIHdpdGggYSBwQU5UTFIzX1RSRUVOT0RFX1NUUkVBTSwgdGhlbiBndWVzcyB3aGVyZQorICogdGhlIHBBTlRMUjNfSU5UX1NUUkVBTSBjb21lcyBmcm9tPworICoKKyAqIE5vdGUgdGhhdCBiZWNhdXNlIHRoZSBjb250ZXh0IHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBhY3R1YWwgaW50ZXJmYWNlIHN0cnVjdHVyZSB0aGF0IGlzIHByb3ZpZGluZworICogdGhlIEFOVExSM19JTlRfU1RSRUFNIGl0IGlzIGRlZmluZWQgYXMgYSAodm9pZCAqKSBpbiB0aGlzIGludGVyZmFjZS4gVGhlcmUgaXMgbm8gZGlyZWN0IGltcGxlbWVudGF0aW9uCisgKiBvZiBhbiBBTlRMUjNfSU5UX1NUUkVBTSAodW5sZXNzIHNvbWVvbmUgZGlkIG5vdCB1bmRlcnN0YW5kIHdoYXQgSSB3YXMgZG9pbmcgaGVyZSA9Oz9QCisgKi8KKyNpZm5kZWYJX0FOVExSM19JTlRTVFJFQU1fSAorI2RlZmluZQlfQU5UTFIzX0lOVFNUUkVBTV9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250b2tlbi5oPgorCisvKiogVHlwZSBpbmRpY2F0b3IgZm9yIGEgY2hhcmFjdGVyIHN0cmVhbQorICogXHJlbWFyayBpZiBhIGN1c3RvbSBzdHJlYW0gaXMgY3JlYXRlZCBidXQgaXQgY2FuIGJlIHRyZWF0ZWQgYXMKKyAqIGEgY2hhciBzdHJlYW0sIHRoZW4geW91IG1heSBPUiBpbiB0aGlzIHZhbHVlIHRvIHlvdXIgdHlwZSBpbmRpY2F0b3IKKyAqLworI2RlZmluZQlBTlRMUjNfQ0hBUlNUUkVBTQkweDAwMDEKKworLyoqIFR5cGUgaW5kaWNhdG9yIGZvciBhIFRva2VuIHN0cmVhbQorICogXHJlbWFyayBpZiBhIGN1c3RvbSBzdHJlYW0gaXMgY3JlYXRlZCBidXQgaXQgY2FuIGJlIHRyZWF0ZWQgYXMKKyAqIGEgdG9rZW4gc3RyZWFtLCB0aGVuIHlvdSBtYXkgT1IgaW4gdGhpcyB2YWx1ZSB0byB5b3VyIHR5cGUgaW5kaWNhdG9yCisgKi8KKyNkZWZpbmUJQU5UTFIzX1RPS0VOU1RSRUFNCTB4MDAwMgorCisvKiogVHlwZSBpbmRpY2F0b3IgZm9yIGEgY29tbW9uIHRyZWUgbm9kZSBzdHJlYW0KKyAqIFxyZW1hcmsgaWYgYSBjdXN0b20gc3RyZWFtIGlzIGNyZWF0ZWQgYnV0IGl0IGNhbiBiZSB0cmVhdGVkIGFzCisgKiBhIGNvbW1vbiB0cmVlIG5vZGUgc3RyZWFtLCB0aGVuIHlvdSBtYXkgT1IgaW4gdGhpcyB2YWx1ZSB0byB5b3VyIHR5cGUgaW5kaWNhdG9yCisgKi8KKyNkZWZpbmUJQU5UTFIzX0NPTU1PTlRSRUVOT0RFCTB4MDAwNAorCisvKiogVHlwZSBtYXNrIGZvciBpbnB1dCBzdHJlYW0gc28gd2UgY2FuIHN3aXRjaCBpbiB0aGUgYWJvdmUgdHlwZXMKKyAqICBccmVtYXJrIERPIE5PVCBVU0UgMHgwMDAwIGFzIGEgc3RyZWFtIHR5cGUhCisgKi8KKyNkZWZpbmUJQU5UTFIzX0lOUFVUX01BU0sJMHgwMDA3CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZglzdHJ1Y3QgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0Cit7CisgICAgLyoqIElucHV0IHN0cmVhbSB0eXBlIGluZGljYXRvci4gU29tZXRpbWVzIHVzZWZ1bCBmb3IgZXJyb3IgcmVwb3J0aW5nIGV0Yy4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCSAgICB0eXBlOworCisgICAgLyoqIFBvdGVudGlhbGx5IHVzZWZ1bCBpbiBlcnJvciByZXBvcnRpbmcgYW5kIHNvIG9uLCB0aGlzIHN0cmluZyBpcworICAgICAqICBhbiBpZGVudGlmaWNhdGlvbiBvZiB0aGUgaW5wdXQgc291cmNlLiBJdCBtYXkgYmUgTlVMTCwgc28gYW55dGhpbmcKKyAgICAgKiAgYXR0ZW1wdGluZyB0byBhY2Nlc3MgaXQgbmVlZHMgdG8gY2hlY2sgdGhpcyBhbmQgc3Vic3RpdHV0ZSBhIHNlbnNpYmxlCisgICAgICogIGRlZmF1bHQuCisgICAgICovCisgICAgcEFOVExSM19TVFJJTkcJICAgICAgc3RyZWFtTmFtZTsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBzdXBlciBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGludGVyZmFjZS4gVGhpcworICAgICAqICB3aWxsIHVzdWFsbHkgYmUgYSB0b2tlbiBzdHJlYW0gb3IgYSB0cmVlIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2b2lkCQkgICAgKiBzdXBlcjsKKworICAgIC8qKiBMYXN0IG1hcmtlciBwb3NpdGlvbiBhbGxvY2F0ZWQKKyAgICAgKi8KKyAgICBBTlRMUjNfTUFSS0VSCSAgICBsYXN0TWFya2VyOworCisJLy8gUmV0dXJuIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgaW5wdXQgc291cmNlCisJLy8KKwlwQU5UTFIzX1NUUklORwkJKCpnZXRTb3VyY2VOYW1lKQkoc3RydWN0IEFOVExSM19JTlRfU1RSRUFNX3N0cnVjdCAqIGludFN0cmVhbSk7CisKKyAgICAvKiogQ29uc3VtZSB0aGUgbmV4dCAnQU5UUjNfVUlOVDMyJyBpbiB0aGUgc3RyZWFtCisgICAgICovCisgICAgdm9pZAkJICAgICgqY29uc3VtZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0ICogaW50U3RyZWFtKTsKKworICAgIC8qKiBHZXQgQU5UTFIzX1VJTlQzMiBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkIHdoZXJlIGk9MSBpcyBuZXh0IEFOVExSM19VSU5UMzIgCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkgICAgKCpfTEEpCSAgICAoc3RydWN0IEFOVExSM19JTlRfU1RSRUFNX3N0cnVjdCAqIGludFN0cmVhbSwgQU5UTFIzX0lOVDMyIGkpOworCisgICAgLyoqIFRlbGwgdGhlIHN0cmVhbSB0byBzdGFydCBidWZmZXJpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkuICBSZXR1cm4KKyAgICAgKiAgY3VycmVudCBpbnB1dCBwb3NpdGlvbiwgaW5kZXgoKSwgb3Igc29tZSBvdGhlciBtYXJrZXIgc28gdGhhdAorICAgICAqICB3aGVuIHBhc3NlZCB0byByZXdpbmQoKSB5b3UgZ2V0IGJhY2sgdG8gdGhlIHNhbWUgc3BvdC4KKyAgICAgKiAgcmV3aW5kKG1hcmsoKSkgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGlucHV0IGN1cnNvci4KKyAgICAgKi8KKyAgICBBTlRMUjNfTUFSS0VSCSAgICAoKm1hcmspCSAgICAoc3RydWN0IEFOVExSM19JTlRfU1RSRUFNX3N0cnVjdCAqIGludFN0cmVhbSk7CisgICAgCisgICAgLyoqIFJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wgaW5kZXggMC4ubiB3aGVyZSBuIGluZGljYXRlcyB0aGUKKyAgICAgKiAgbGFzdCBzeW1ib2wgaGFzIGJlZW4gcmVhZC4KKyAgICAgKi8KKyAgICBBTlRMUjNfTUFSS0VSCSAgICAoKmluZGV4KQkgICAgKHN0cnVjdCBBTlRMUjNfSU5UX1NUUkVBTV9zdHJ1Y3QgKiBpbnRTdHJlYW0pOworCisgICAgLyoqIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBuZXh0IGNhbGwgdG8gaW5kZXggd291bGQgcmV0dXJuIG1hcmtlci4KKyAgICAgKiAgVGhlIG1hcmtlciB3aWxsIHVzdWFsbHkgYmUgaW5kZXgoKSBidXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSXQncworICAgICAqICBqdXN0IGEgbWFya2VyIHRvIGluZGljYXRlIHdoYXQgc3RhdGUgdGhlIHN0cmVhbSB3YXMgaW4uICBUaGlzIGlzCisgICAgICogIGVzc2VudGlhbGx5IGNhbGxpbmcgcmVsZWFzZSgpIGFuZCBzZWVrKCkuICBJZiB0aGVyZSBhcmUgbWFya2VycworICAgICAqICBjcmVhdGVkIGFmdGVyIHRoaXMgbWFya2VyIGFyZ3VtZW50LCB0aGlzIHJvdXRpbmUgbXVzdCB1bnJvbGwgdGhlbQorICAgICAqICBsaWtlIGEgc3RhY2suICBBc3N1bWUgdGhlIHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluIHdoZW4gdGhpcyBtYXJrZXIKKyAgICAgKiAgd2FzIGNyZWF0ZWQuCisgICAgICovCisgICAgdm9pZAkJICAgICgqcmV3aW5kKQkgICAgKHN0cnVjdCBBTlRMUjNfSU5UX1NUUkVBTV9zdHJ1Y3QgKiBpbnRTdHJlYW0sIEFOVExSM19NQVJLRVIgbWFya2VyKTsKKworICAgIC8qKiBSZXNldCB0aGUgc3RyZWFtIHRvIHRoZSBsYXN0IG1hcmtlciBwb3NpdGlvbiwgd2l0b3VoIGRlc3RyeW9pbmcgdGhlCisgICAgICogIGxhc3QgbWFya2VyIHBvc2l0aW9uLgorICAgICAqLworICAgIHZvaWQJCSAgICAoKnJld2luZExhc3QpICAgKHN0cnVjdCBBTlRMUjNfSU5UX1NUUkVBTV9zdHJ1Y3QgKiBpbnRTdHJlYW0pOworCisgICAgLyoqIFlvdSBtYXkgd2FudCB0byBjb21taXQgdG8gYSBiYWNrdHJhY2sgYnV0IGRvbid0IHdhbnQgdG8gZm9yY2UgdGhlCisgICAgICogIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisgICAgICogIG5vIGxvbmdlciBuZWNlc3NhcnkuICBUaGlzIHdpbGwgaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBhcworICAgICAqICByZXdpbmQoKSBleGNlcHQgaXQgcmVsZWFzZXMgcmVzb3VyY2VzIHdpdGhvdXQgdGhlIGJhY2t3YXJkIHNlZWsuCisgICAgICovCisgICAgdm9pZAkJICAgICgqcmVsZWFzZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0ICogaW50U3RyZWFtLCBBTlRMUjNfTUFSS0VSIG1hcmspOworCisgICAgLyoqIFNldCB0aGUgaW5wdXQgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXguICBUaGlzIGlzCisgICAgICogIG5vcm1hbGx5IHVzZWQgdG8gc2VlayBhaGVhZCBpbiB0aGUgaW5wdXQgc3RyZWFtLiAgTm8gYnVmZmVyaW5nIGlzCisgICAgICogIHJlcXVpcmVkIHRvIGRvIHRoaXMgdW5sZXNzIHlvdSBrbm93IHlvdXIgc3RyZWFtIHdpbGwgdXNlIHNlZWsgdG8KKyAgICAgKiAgbW92ZSBiYWNrd2FyZHMgc3VjaCBhcyB3aGVuIGJhY2t0cmFja2luZy4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHJld2luZCBpbiBpdHMgbXVsdGktZGlyZWN0aW9uYWwKKyAgICAgKiAgcmVxdWlyZW1lbnQgYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorICAgICAqCisgICAgICogIEZvciBjaGFyIHN0cmVhbXMsIHNlZWtpbmcgZm9yd2FyZCBtdXN0IHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIHN1Y2gKKyAgICAgKiAgYXMgbGluZSBudW1iZXIuICBGb3Igc2Vla2luZyBiYWNrd2FyZHMsIHlvdSB3aWxsIGJlIHByZXN1bWFibHkKKyAgICAgKiAgYmFja3RyYWNraW5nIHVzaW5nIHRoZSBtYXJrL3Jld2luZCBtZWNoYW5pc20gdGhhdCByZXN0b3JlcyBzdGF0ZSBhbmQKKyAgICAgKiAgc28gdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byB1cGRhdGUgc3RhdGUgd2hlbiBzZWVraW5nIGJhY2t3YXJkcy4KKyAgICAgKgorICAgICAqICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBmb3IgZWZmaWNpZW50IGJhY2t0cmFja2luZywgYnV0CisgICAgICogIGluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHVzZWQgZm9yIGluY3JlbWVudGFsIHBhcnNpbmcuCisgICAgICovCisgICAgdm9pZAkJICAgICgqc2VlaykJICAgIChzdHJ1Y3QgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0ICogaW50U3RyZWFtLCBBTlRMUjNfTUFSS0VSIGluZGV4KTsKKworICAgIC8qKiBPbmx5IG1ha2VzIHNlbnNlIGZvciBzdHJlYW1zIHRoYXQgYnVmZmVyIGV2ZXJ5dGhpbmcgdXAgcHJvYmFibHksIGJ1dAorICAgICAqICBtaWdodCBiZSB1c2VmdWwgdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmVhbSBvciBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCSAgICAoKnNpemUpCSAgICAoc3RydWN0IEFOVExSM19JTlRfU1RSRUFNX3N0cnVjdCAqIGludFN0cmVhbSk7CisKKyAgICAvKiogQmVjYXVzZSB0aGUgaW5kaXJlY3QgY2FsbCwgdGhvdWdoIHNtYWxsIGluIGluZGl2aWR1YWwgY2FzZXMgY2FuCisgICAgICogIG1vdW50IHVwIGlmIHRoZXJlIGFyZSB0aG91c2FuZHMgb2YgdG9rZW5zICh2ZXJ5IGxhcmdlIGlucHV0IHN0cmVhbXMpLCBjYWxsZXJzCisgICAgICogIG9mIHNpemUgY2FuIG9wdGlvbmFsbHkgdXNlIHRoaXMgY2FjaGVkIHNpemUgZmllbGQuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkgICAgY2FjaGVkU2l6ZTsKKworICAgIC8qKiBGcmVlcyBhbnkgcmVzb3VyY2VzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCisgICAgICogIGludGVyZmFjZS4gVXN1YWxseSB0aGlzIGlzIGp1c3QgcmVsZWFzaW5nIHRoZSBtZW1vcnkgYWxsb2NhdGVkCisgICAgICogIGZvciB0aGUgc3RydWN0dXJlIGl0c2VsZiwgYnV0IGl0IG1heSBvZiBjb3Vyc2UgZG8gYW55dGhpbmcgaXQgbmVlZCB0bworICAgICAqICBzbyBsb25nIGFzIGl0IGRvZXMgbm90IHN0YW1wIG9uIGFueXRoaW5nIGVsc2UuCisgICAgICovCisgICAgdm9pZAkJICAgICgqZnJlZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0ICogc3RyZWFtKTsKKworfQorICAgIEFOVExSM19JTlRfU1RSRUFNOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2xleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzbGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MxMGVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM2xleGVyLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qKiBcZmlsZSAKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbnkgQU5UTFIzIGxleGVyLgorICoKKyAqIEFuIEFOTFRSMyBsZXhlciBidWlsZHMgZnJvbSB0d28gc2V0cyBvZiBjb21wb25lbnRzOgorICoKKyAqICAtIFRoZSBydW50aW1lIGNvbXBvbmVudHMgdGhhdCBwcm92aWRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMKKyAqICAgIHRyYXZlcnNpbmcgY2hhcmFjdGVyIHN0cmVhbXMsIGJ1aWxkaW5nIHRva2VucyBmb3Igb3V0cHV0IGFuZCBzbyBvbi4KKyAqICAtIFRoZSBnZW5lcmF0ZWQgcnVsZXMgYW5kIHN0cnV1dHJlIG9mIHRoZSBhY3R1YWwgbGV4ZXIsIHdoaWNoIGNhbGwgdXBvbiB0aGUKKyAqICAgIHJ1bnRpbWUgY29tcG9uZW50cy4KKyAqCisgKiBBIGxleGVyIGNsYXNzIGNvbnRhaW5zICBhIGNoYXJhY3RlciBpbnB1dCBzdHJlYW0sIGEgYmFzZSByZWNvZ25pemVyIGludGVyZmFjZSAKKyAqICh3aGljaCBpdCB3aWxsIG5vcm1hbGx5IGltcGxlbWVudCkgYW5kIGEgdG9rZW4gc291cmNlIGludGVyZmFjZSAod2hpY2ggaXQgYWxzbworICogaW1wbGVtZW50cy4gVGhlIFRva2Vuc291cmNlIGludGVyZmFjZSBpcyBjYWxsZWQgYnkgYSB0b2tlbiBjb25zdW1lciAoc3VjaCBhcworICogYSBwYXJzZXIsIGJ1dCBpbiB0aGVvcnkgaXQgY2FuIGJlIGFueXRoaW5nIHRoYXQgd2FudHMgYSBzZXQgb2YgYWJzdHJhY3QKKyAqIHRva2VucyBpbiBwbGFjZSBvZiBhIHJhdyBjaGFyYWN0ZXIgc3RyZWFtLgorICoKKyAqIFNvIHRoZW4sIHdlIHNldCB1cCBhIGxleGVyIGluIGEgc2VxdWVuY2UgYWtpbiB0bzoKKyAqCisgKiAgLSBDcmVhdGUgYSBjaGFyYWN0ZXIgc3RyZWFtIChzb21ldGhpbmcgd2hpY2ggaW1wbGVtZW50cyBBTlRMUjNfSU5QVVRfU1RSRUFNKQorICogICAgYW5kIGluaXRpYWxpemUgaXQuCisgKiAgLSBDcmVhdGUgYSBsZXhlciBpbnRlcmZhY2UgYW5kIHRlbGwgaXQgd2hlcmUgaXQgaXRzIGlucHV0IHN0cmVhbSBpcy4KKyAqICAgIFRoaXMgd2lsbCBjYXVzZSB0aGUgY3JlYXRpb24gb2YgYSBiYXNlIHJlY29nbml6ZXIgY2xhc3MsIHdoaWNoIGl0IHdpbGwgCisgKiAgICBvdmVycmlkZSB3aXRoIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIG9mIHNvbWUgbWV0aG9kcy4gVGhlIGxleGVyIGNyZWF0b3IKKyAqICAgIGNhbiBhbHNvIHRoZW4gaW4gdHVybiBvdmVycmlkZSBhbnl0aGluZyBpdCBsaWtlcy4gCisgKiAgLSBUaGUgbGV4ZXIgdG9rZW4gc291cmNlIGludGVyZmFjZSBpcyB0aGVuIHBhc3NlZCB0byBzb21lIGludGVyZmFjZSB0aGF0CisgKiAgICBrbm93cyBob3cgdG8gdXNlIGl0LCBieXRlIGNhbGxpbmcgZm9yIGEgbmV4dCB0b2tlbi4gCisgKiAgLSBXaGVuIGEgbmV4dCB0b2tlbiBpcyBjYWxsZWQsIGxldCB6ZSBsZXhpbmcgYmVnaW4uCisgKgorICovCisjaWZuZGVmCV9BTlRMUjNfTEVYRVIKKyNkZWZpbmUJX0FOVExSM19MRVhFUgorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8qIERlZmluaXRpb25zCisgKi8KKyNkZWZpbmUJQU5UTFIzX1NUUklOR19URVJNSU5BVE9SCTB4RkZGRkZGRkYKKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNpbnB1dC5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbW1vbnRva2VuLmg+CisjaW5jbHVkZSAgICA8YW50bHIzdG9rZW5zdHJlYW0uaD4KKyNpbmNsdWRlICAgIDxhbnRscjNiYXNlcmVjb2duaXplci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYJc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QKK3sKKyAgICAvKiogSWYgdGhlcmUgaXMgYSBzdXBlciBzdHJ1Y3R1cmUgdGhhdCBpcyBpbXBsZW1lbnRpbmcgdGhlCisgICAgICogIGxleGVyLCB0aGVuIGEgcG9pbnRlciB0byBpdCBjYW4gYmUgc3RvcmVkIGhlcmUgaW4gY2FzZQorICAgICAqICBpbXBsZW1lbnRpbmcgZnVuY3Rpb25zIGFyZSBvdmVycmlkZGVuIGJ5IHRoaXMgc3VwZXIgc3RydWN0dXJlLgorICAgICAqLworICAgIHZvaWQJKiBzdXBlcjsKKworICAgIC8qKiBBIGdlbmVyYXRlZCBsZXhlciBoYXMgYW4gbVRva2VucygpIGZ1bmN0aW9uLCB3aGljaCBuZWVkcworICAgICAqICB0aGUgY29udGV4dCBwb2ludGVyIG9mIHRoZSBnZW5lcmF0ZWQgbGV4ZXIsIG5vdCB0aGUgYmFzZSBsZXhlciBpbnRlcmZhY2UKKyAgICAgKiAgdGhpcyBpcyBzdG9yZWQgaGVyZSBhbmQgaW5pdGlhbGl6ZWQgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIChvciBtYW51YWxseQorICAgICAqICBpZiB0aGlzIGlzIGEgbWFudWFsbHkgYnVpbHQgbGV4ZXIuCisgICAgICovCisgICAgdm9pZAkqIGN0eDsKKworICAgIC8qKiBBIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBzdHJlYW0gd2hlbmNlIHRoaXMgbGV4ZXIgaXMgcmVjZWl2aW5nCisgICAgICogIGNoYXJhY3RlcnMuIAorICAgICAqICBUT0RPOiBJIG1heSBjb21lIGJhY2sgdG8gdGhpcyBhbmQgaW1wbGVtZW50IGNoYXJzdHJlYW0gb3V0c2lkZQorICAgICAqICB0aGUgaW5wdXQgc3RyZWFtIGFzIHBlciB0aGUgamF2YSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTQlpbnB1dDsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJhc2UgcmVjb2duaXplciwgd2hpY2ggdGhlIGxleGVyCisgICAgICogIGNyZWF0ZXMgYW5kIHRoZW4gb3ZlcnJpZGVzIHdpdGggaXRzIG93biBsZXhlciBvcmllbnRlZCBmdW5jdGlvbnMgKHRoZSAKKyAgICAgKiAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwYXJzZXIgb3JpZW50ZWQpLiBUaGlzIGFsc28gY29udGFpbnMgYQorICAgICAqICB0b2tlbiBzb3VyY2UgaW50ZXJmYWNlLCB3aGljaCB0aGUgbGV4ZXIgaW5zdGFuY2Ugd2lsbCBwcm92aWRlIHRvIGFueXRoaW5nIAorICAgICAqICB0aGF0IG5lZWRzIGl0LCB3aGljaCBpcyBhbnl0aGluZyBlbHNlIHRoYXQgaW1wbGVtZW50cyBhIGJhc2UgcmVjb2duaXplciwKKyAgICAgKiAgc3VjaCBhcyBhIHBhcnNlci4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUglyZWM7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgc2V0cyB0aGUgY2hhcnN0cmVhbSBzb3VyY2UgZm9yIHRoZSBsZXhlciBhbmQKKyAgICAgKiAgY2F1c2VzIGl0IHRvICBiZSByZXNldC4KKyAgICAgKi8KKyAgICB2b2lkCQkJKCpzZXRDaGFyU3RyZWFtKSAgICAoc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QgKiBsZXhlciwgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpOworICAgIAorICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBzd2l0Y2hlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaW5wdXQgc3RyZWFtIHRvIAorICAgICAqICBhIG5ldyBvbmUsIHNhdmluZyB0aGUgb2xkIG9uZSwgd2hpY2ggd2Ugd2lsbCByZXZlcnQgdG8gYXQgdGhlIGVuZCBvZiB0aGlzIAorICAgICAqICBuZXcgb25lLgorICAgICAqLworICAgIHZvaWQJCQkoKnB1c2hDaGFyU3RyZWFtKSAgIChzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyLCBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgYWJhbmRvbnMgdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB3aGV0aGVyIGl0CisgICAgICogIGlzIGVtcHR5IG9yIG5vdCBhbmQgcmV2ZXJ0cyB0byB0aGUgcHJldmlvdXMgc3RhY2tlZCBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgdm9pZAkJCSgqcG9wQ2hhclN0cmVhbSkgICAgKHN0cnVjdCBBTlRMUjNfTEVYRVJfc3RydWN0ICogbGV4ZXIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGVtaXRzIHRoZSBzdXBwbGllZCB0b2tlbiBhcyB0aGUgbmV4dCB0b2tlbiBpbgorICAgICAqICB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHZvaWQJCQkoKmVtaXROZXcpCSAgICAoc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QgKiBsZXhlciwgcEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGNvbnN0cnVjdHMgYSBuZXcgdG9rZW4gZnJvbSB0aGUgbGV4ZXIgc3RvcmVkIGluZm9ybWF0aW9uIAorICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOCSgqZW1pdCkJCSAgICAoc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QgKiBsZXhlcik7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgdXNlciBwcm92aWRlZCAoZWl0aGVyIG1hbnVhbGx5IG9yIHRocm91Z2ggY29kZSBnZW5lcmF0aW9uCisgICAgICogIGZ1bmN0aW9uIHRoYXQgY2F1c2VzIHRoZSBsZXhlciBydWxlcyB0byBydW4gdGhlIGxleGluZyBydWxlcyBhbmQgcHJvZHVjZSAKKyAgICAgKiAgdGhlIG5leHQgdG9rZW4gaWYgdGhlcmUgaXNzIG9uZS4gVGhpcyBpcyBjYWxsZWQgZnJvbSBuZXh0VG9rZW4oKSBpbiB0aGUKKyAgICAgKiAgcEFOVExSM19UT0tFTl9TT1VSQ0UuIE5vdGUgdGhhdCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZvciB0aGlzIGZ1bmNpdG9uIGlzIAorICAgICAqICB0aGUgZ2VuZXJhdGVkIGxleGVyIGNvbnRleHQgKHN0b3JlZCBpbiBjdHggaW4gdGhpcyBpbnRlcmZhY2UpIGl0IGlzIGEgZ2VuZXJhdGVkCisgICAgICogIGZ1bmN0aW9uIGFuZCBleHBlY3RzIHRoZSBjb250ZXh0IHRvIGJlIHRoZSBnZW5lcmF0ZWQgbGV4ZXIuIAorICAgICAqLworICAgIHZvaWQJICAgICAgICAoKm1Ub2tlbnMpCQkgICAgKHZvaWQgKiBjdHgpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGF0dGVtcHRzIHRvIG1hdGNoIGFuZCBjb25zdW1lIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGZyb20gdGhlIGlucHV0CisgICAgICogIHN0cmVhbS4gTm90ZSB0aGF0IHN0cmluZ3MgbXVzZSBiZSBwYXNzZWQgYXMgdGVybWluYXRlZCBhcnJheXMgb2YgQU5UTFIzX1VDSEFSLiBTdHJpbmdzIGFyZSB0ZXJtaW5hdGVkCisgICAgICogIHdpdGggMHhGRkZGRkZGRiwgd2hpY2ggaXMgYW4gaW52YWxpZCBVVEYzMiBjaGFyYWN0ZXIKKyAgICAgKi8KKyAgICBBTlRMUjNfQk9PTEVBTgkoKm1hdGNocykJICAgIChzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyLCBBTlRMUjNfVUNIQVIgKiBzdHJpbmcpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgYW5kIGNvbnN1bWVzIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiAgVGhlIGlucHV0IHN0cmVhbSBpcyByZXF1aXJlZCB0byBwcm92aWRlIGNoYXJhY3RlcnMgdmlhIExBKCkgYXMgVVRGMzIgY2hhcmFjdGVycy4gVGhlIGRlZmF1bHQgbGV4ZXIKKyAgICAgKiAgaW1wbGVtZW50YXRpb24gaXMgc291cmNlIGVuY29kaW5nIGFnbm9zdGljIGFuZCBzbyBpbnB1dCBzdHJlYW1zIGRvIG5vdCBnZW5lcmFsbHkgbmVlZCB0byAKKyAgICAgKiAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbG1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBBTlRMUjNfQk9PTEVBTgkoKm1hdGNoYykJICAgIChzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyLCBBTlRMUjNfVUNIQVIgYyk7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluIHRoZSBzdXBwbGllZCByYW5nZSAoSSBzdXBwb3NlIGl0IGNvdWxkIGJlIGEgdG9rZW4gcmFuZ2UgdG9vCisgICAgICogIGJ1dCB0aGlzIHdvdWxkIG9ubHkgYmUgdXNlZnVsIGlmIHRoZSB0b2tlbnMgd2VyZSBpbiB0c29tZSBndWFyYW50ZWVkIG9yZGVyIHdoaWNoIGlzCisgICAgICogIG9ubHkgZ29pbmcgdG8gaGFwcGVuIHdpdGggYSBoYW5kIGNyYWZ0ZWQgdG9rZW4gc2V0KS4KKyAgICAgKi8KKyAgICBBTlRMUjNfQk9PTEVBTgkoKm1hdGNoUmFuZ2UpCSAgICAoc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QgKiBsZXhlciwgQU5UTFIzX1VDSEFSIGxvdywgQU5UTFIzX1VDSEFSIGhpZ2gpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhlIG5leHQgdG9rZW4vY2hhciBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICogIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpdCBhY3RhdWxseSBpcy4KKyAgICAgKi8KKyAgICB2b2lkCQkoKm1hdGNoQW55KQkgICAgKHN0cnVjdCBBTlRMUjNfTEVYRVJfc3RydWN0ICogbGV4ZXIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJlY292ZXJzIGZyb20gYW4gZXJyb3IgZm91bmQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiAgR2VuZXJhbGx5LCB0aGlzIHdpbGwgYmUgYSAjQU5UTFIzX0VYQ0VQVElPTl9OT1ZJQUJMRV9BTFQgYnV0IGl0IGNvdWxkIGFsc28KKyAgICAgKiAgYmUgZnJvbSBhIG1pc21hdGNoZWQgdG9rZW4gdGhhdCB0aGUgKCptYXRjaCkoKSBjb3VsZCBub3QgcmVjb3ZlciBmcm9tLgorICAgICAqLworICAgIHZvaWQJCSgqcmVjb3ZlcikJICAgIChzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY3VycmVudCBsaW5lIG51bWJlciBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkoKmdldExpbmUpCQkoc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QgKiBsZXhlcik7CisgICAgQU5UTFIzX01BUktFUgkoKmdldENoYXJJbmRleCkJCShzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyKTsKKyAgICBBTlRMUjNfVUlOVDMyCSgqZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKShzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgdGV4dCBzbyBmYXIgZm9yIHRoZSBjdXJyZW50IHRva2VuIGJlaW5nIGdlbmVyYXRlZAorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HCSgqZ2V0VGV4dCkJICAgIChzdHJ1Y3QgQU5UTFIzX0xFWEVSX3N0cnVjdCAqIGxleGVyKTsKKworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBmcmVlIHRoZSByZXNvdXJjZXMgb2YgYSBsZXhlcgorICAgICAqLworICAgIHZvaWQJCSgqZnJlZSkJCSAgICAoc3RydWN0IEFOVExSM19MRVhFUl9zdHJ1Y3QgKiBsZXhlcik7CisKK30KKyAgICBBTlRMUjNfTEVYRVI7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM21lbW9yeS5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM21lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmQ0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzbWVtb3J5LmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZglfQU5UTFIzTUVNT1JZX0gKKyNkZWZpbmUJX0FOVExSM01FTU9SWV9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKworCisjZW5kaWYJLyogX0FOVExSM01FTU9SWV9IICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViN2QxOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNwYXJzZXIuaApAQCAtMCwwICsxLDkzIEBACisvKiogXGZpbGUKKyAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYW4gQU5UTFIzIHBhcnNlci4KKyAqCisgKgorICovCisjaWZuZGVmCV9BTlRMUjNfUEFSU0VSX0gKKyNkZWZpbmUJX0FOVExSM19QQVJTRVJfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXJlY29nbml6ZXIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogVGhpcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgZm9yIGFuIEFOVExSMyBwYXJzZXIuCisgKi8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19QQVJTRVJfc3RydWN0Cit7CisgICAgLyoqIEFsbCBzdXBlcnN0cnVjdHVyZSBpbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgcmVxdWlyZSBhIHBvaW50ZXIgdG8gdGhlaXIgc2VsdmVzLAorICAgICAqICB3aGljaCB0aGV5IGNhbiByZWZlcmVuY2UgdXNpbmcgdGhlIHN1cGVyIHBvaW50ZXIgaGVyZS4KKyAgICAgKi8KKyAgICB2b2lkCQkJKiBzdXBlcjsKKworICAgIC8qKiBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgcmVjb2duaXplciwgd2hlcmUgbW9zdCBvZiB0aGUgcGFyc2VyIGZ1bmN0aW9ucyBhY3R1YWxseQorICAgICAqICBsaXZlIGJlY2F1c2UgdGhleSBhcmUgc2hhcmVkIGJldHdlZW4gcGFyc2VyIGFuZCB0cmVlIHBhcnNlciBhbmQgdGhpcyBpcyB0aGUKKyAgICAgKiAgZWFzaWVyIHdheSB0aGFuIGNvcHlpbmcgdGhlIGludGVyZmFjZSBhbGwgb3ZlciB0aGUgcGxhY2UuIE1hY3JvcyBoaWRlIHRoaXMKKyAgICAgKiAgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZSBzbyBpdCBpcyBlYXNpZXIgb24gdGhlIGV5ZSAodGhvdWdoIG5vdCB0aGUgZGVidWdnZXIgOy0pLgorICAgICAqLworICAgIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSCQkJcmVjOworCisgICAgLyoqIEEgcHJvdmlkZXIgb2YgYSB0b2tlbnN0cmVhbSBpbnRlcmZhY2UsIGZvciB0aGUgcGFyc2VyIHRvIGNvbnN1bWUKKyAgICAgKiAgdG9rZW5zIGZyb20uCisgICAgICovCisgICAgcEFOVExSM19UT0tFTl9TVFJFQU0JCQl0c3RyZWFtOworCisJLyoqIEEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgaW5zdGFsbHMgYSBkZWJ1Z2dlciBvYmplY3QgKGl0IGFsc28KKwkgKiAgaW5zdGFsbHMgdGhlIGRlYnVnZ2luZyB2ZXJzaW9ucyBvZiB0aGUgcGFyc2VyIG1ldGhvZHMuIFRoaXMgbWVhbnMgdGhhdCAKKwkgKiAgYSBub24gZGVidWcgcGFyc2VyIGluY3VycyBubyBvdmVyaGVhZCBiZWNhdXNlIG9mIHRoZSBkZWJ1Z2dpbmcgc3R1ZmYuCisJICovCisJdm9pZAkJCQkJKCpzZXREZWJ1Z0xpc3RlbmVyKQkoc3RydWN0IEFOVExSM19QQVJTRVJfc3RydWN0CSogcGFyc2VyLCBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRiZyk7CisKKyAgICAvKiogQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBpbnN0YWxscyBhIHRva2VuIHN0cmVhbSAKKyAgICAgKiBmb3IgdGhlIHBhcnNlci4KKyAgICAgKi8KKyAgICB2b2lkCQkJCQkoKnNldFRva2VuU3RyZWFtKQkoc3RydWN0IEFOVExSM19QQVJTRVJfc3RydWN0CSogcGFyc2VyLCBwQU5UTFIzX1RPS0VOX1NUUkVBTSk7CisKKyAgICAvKiogQSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB0b2tlbiBzdHJlYW0gZm9yIHRoaXMgCisgICAgICogIHBhcnNlci4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1RPS0VOX1NUUkVBTQkoKmdldFRva2VuU3RyZWFtKQkoc3RydWN0IEFOVExSM19QQVJTRVJfc3RydWN0CSogcGFyc2VyKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gZnJlZSByZXNvdXJjZXMgb2YgYW4gQU5UTFIzIHBhcnNlci4KKyAgICAgKi8KKyAgICB2b2lkCQkJKCpmcmVlKQkJCShzdHJ1Y3QgQU5UTFIzX1BBUlNFUl9zdHJ1Y3QJKiBwYXJzZXIpOworCit9CisgICAgQU5UTFIzX1BBUlNFUjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcGFyc2V0cmVlLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcGFyc2V0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4YzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNwYXJzZXRyZWUuaApAQCAtMCwwICsxLDg1IEBACisvKiogXGZpbGUKKyAqICBBYnN0cmFjdGlvbiBvZiBDb21tb24gdHJlZSB0byBwcm92aWRlIHBheWxvYWQgYW5kIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBub2RlLgorICoKKyAqIFx0b2RvIE1heSBub3QgbmVlZCB0aGlzIGluIHRoZSBlbmQKKyAqLworCisjaWZuZGVmCUFOVExSM19QQVJTRVRSRUVfSAorI2RlZmluZQlBTlRMUjNfUEFSU0VUUkVFX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXRyZWUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfUEFSU0VfVFJFRV9zdHJ1Y3QKK3sKKyAgICAvKiogQW55IGludGVyZmFjZSB0aGF0IGltcGxlbWVudHMgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZQorICAgICAqICBtYXkgbmVlZCB0byBwb2ludCBiYWNrIHRvIGl0c2VsZiB1c2luZyB0aGlzIHBvaW50ZXIgdG8gaXRzCisgICAgICogIHN1cGVyIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICB2b2lkICAgICogc3VwZXI7CisKKyAgICAvKiogVGhlIHBheWxvYWQgdGhhdCB0aGUgcGFyc2UgdHJlZSBub2RlIHBhc3NlcyBhcm91bmQKKyAgICAgKi8KKyAgICB2b2lkICAgICogcGF5bG9hZDsKKworICAgIC8qKiBBbiBlbmNhcHN1bGF0ZWQgQkFTRSBUUkVFIHN0cmN1dHVyZSAoTk9UIGEgcG9pbnRlcikKKyAgICAgICogdGhhdCBwZXJmb21zIGEgbG90IG9mIHRoZSBkaXJ0eSB3b3JrIG9mIG5vZGUgbWFuYWdlbWVudAorICAgICAgKi8KKyAgICBBTlRMUjNfQkFTRV9UUkVFCSAgICBiYXNlVHJlZTsKKworICAgIC8qKiBIb3cgdG8gZHVwIHRoaXMgbm9kZQorICAgICAqLworICAgIHBBTlRMUjNfQkFTRV9UUkVFCSAgICAoKmR1cE5vZGUpCShzdHJ1Y3QgQU5UTFIzX1BBUlNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKKyAgICAvKiogUmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZQorICAgICAqLworICAgIEFOVExSM19VSU5UMzIJICAgICgqZ2V0VHlwZSkJKHN0cnVjdCBBTlRMUjNfUEFSU0VfVFJFRV9zdHJ1Y3QgKiB0cmVlKTsKKworICAgIC8qKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF5bG9hZCAobXVzdCBiZSBpbnN0YWxsZWQKKyAgICAgKiAgd2hlbiB0aGUgcGF5bG9hZCBpcyBhZGRlZCBhbmQgcG9pbnQgdG8gYSBmdW5jdGlvbiB0aGF0IGtud29zIGhvdyB0byAKKyAgICAgKiAgbWFuaWZlc3QgYSBwQU5UTFIzX1NUUklORyBmcm9tIGEgbm9kZS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORwkgICAgKCp0b1N0cmluZykJKHN0cnVjdCBBTlRMUjNfUEFSU0VfVFJFRV9zdHJ1Y3QgKiBwYXlsb2FkKTsKKworICAgIHZvaWQJCSAgICAoKmZyZWUpCShzdHJ1Y3QgQU5UTFIzX1BBUlNFX1RSRUVfc3RydWN0ICogdHJlZSk7CisKK30KKyAgICBBTlRMUjNfUEFSU0VfVFJFRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcmVjb2duaXplcnNoYXJlZHN0YXRlLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcmVjb2duaXplcnNoYXJlZHN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwMjRkOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNyZWNvZ25pemVyc2hhcmVkc3RhdGUuaApAQCAtMCwwICsxLDIxOCBAQAorLyoqIFxmaWxlCisgKiBXaGlsZSB0aGUgQyBydW50aW1lIGRvZXMgbm90IG5lZWQgdG8gbW9kZWwgdGhlIHN0YXRlIG9mCisgKiBtdWx0aXBsZSBsZXhlcnMgYW5kIHBhcnNlcnMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBKYXZhIHJ1bnRpbWUgZG9lcworICogaXQgaXMgbm8gb3ZlcmhlYWQgdG8gcmVmbGVjdCB0aGF0IG1vZGVsLiBJbiBmYWN0IHRoZQorICogQyBydW50aW1lIGhhcyBhbHdheXMgYmVlbiBhYmxlIHRvIHNoYXJlIHJlY29nbml6ZXIgc3RhdGUuCisgKgorICogVGhpcyAnY2xhc3MnIHRoZXJlZm9yZSBkZWZpbmVzIGFsbCB0aGUgZWxlbWVudHMgb2YgYSByZWNvZ25pemVyCisgKiAoZWl0aGVyIGxleGVyLCBwYXJzZXIgb3IgdHJlZSBwYXJzZXIpIHRoYXQgYXJlIG5lZWQgdG8KKyAqIHRyYWNrIHRoZSBjdXJyZW50IHJlY29nbml0aW9uIHN0YXRlLiBNdWx0aXBsZSByZWNvZ25pemVycworICogbWF5IHRoZW4gc2hhcmUgdGhpcyBzdGF0ZSwgZm9yIGluc3RhbmNlIHdoZW4gb25lIGdyYW1tYXIKKyAqIGltcG9ydHMgYW5vdGhlci4KKyAqLworCisjaWZuZGVmCV9BTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEVfSAorI2RlZmluZQlfQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzZGVmcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBBbGwgdGhlIGRhdGEgZWxlbWVudHMgcmVxdWlyZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUKKyAqICBvZiBhbnkgcmVjb2duaXplciAobGV4ZXIsIHBhcnNlciwgdHJlZSBwYXJzZXIpLgorICogTWF5IGJlIHNoYXJlIGJldHdlZW4gbXVsdGlwbGUgcmVjb2duaXplcnMgc3VjaCB0aGF0IAorICogZ3JhbW1hciBpbmhlcml0YW5jZSBpcyBlYXNpbHkgc3VwcG9ydGVkLgorICovCit0eXBlZGVmCXN0cnVjdCBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEVfc3RydWN0Cit7CisgICAgLyoqIElmIHNldCB0byBBTlRMUjNfVFJVRSB0aGVuIHRoZSByZWNvZ25pemVyIGhhcyBhbiBleGNlcHRpb24KKyAgICAgKiBjb25kaXRpb24gKHRoaXMgaXMgdGVzdGVkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIHJ1bGVzIG9mCisgICAgICogdGhlIGdyYW1tYXIpLgorICAgICAqLworICAgIEFOVExSM19CT09MRUFOCSAgICBlcnJvcjsKKworICAgIC8qKiBQb2ludHMgdG8gdGhlIGZpcnN0IGluIGEgcG9zc2libGUgY2hhaW4gb2YgZXhjZXB0aW9ucyB0aGF0IHRoZQorICAgICAqICByZWNvZ25pemVyIGhhcyBkaXNjb3ZlcmVkLgorICAgICAqLworICAgIHBBTlRMUjNfRVhDRVBUSU9OCSAgICBleGNlcHRpb247CisKKyAgICAvKiogVHJhY2sgYXJvdW5kIGEgaGludCBmcm9tIHRoZSBjcmVhdG9yIG9mIHRoZSByZWNvZ25pemVyIGFzIHRvIGhvdyBiaWcgdGhpcworICAgICAqICB0aGluZyBpcyBnb2luZyB0byBnZXQsIGFzIHRoZSBhY3RyZXNzIHNhaWQgdG8gdGhlIGJpc2hvcC4gVGhpcyBhbGxvd3MgdXMKKyAgICAgKiAgdG8gdHVuZSBoYXNoIHRhYmxlcyBhY2NvcmRpbmdseS4gVGhpcyBtaWdodCBub3QgYmUgdGhlIGJlc3QgcGxhY2UgZm9yIHRoaXMKKyAgICAgKiAgaW4gdGhlIGVuZCBidXQgd2Ugd2lsbCBzZWUuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMglzaXplSGludDsKKworICAgIC8qKiBUcmFjayB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhbnkgcnVsZSBpbnZvY2F0aW9uLgorICAgICAqICBTdGFjayBzdHJ1Y3R1cmUsIHRvIHN1cHBvcnQ6IExpc3Q8Qml0U2V0Pi4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUQUNLCWZvbGxvd2luZzsKKworCisgICAgLyoqIFRoaXMgaXMgdHJ1ZSB3aGVuIHdlIHNlZSBhbiBlcnJvciBhbmQgYmVmb3JlIGhhdmluZyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgbWF0Y2hlZCBhIHRva2VuLiAgUHJldmVudHMgZ2VuZXJhdGlvbiBvZiBtb3JlIHRoYW4gb25lIGVycm9yIG1lc3NhZ2UKKyAgICAgKiAgcGVyIGVycm9yLgorICAgICAqLworICAgIEFOVExSM19CT09MRUFOCWVycm9yUmVjb3Zlcnk7CisgICAgCisgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIGxhc3QgZXJyb3Igb2NjdXJyZWQuCisgICAgICogCVRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZXJlIGFuIGVycm9yIGlzIGZvdW5kCisgICAgICogIGJ1dCBubyB0b2tlbiBpcyBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuLi5hbm90aGVyIGVycm9yIGlzIGZvdW5kLAorICAgICAqICBhZCBuYXVzZWFtLiAgVGhpcyBpcyBhIGZhaWxzYWZlIG1lY2hhbmlzbSB0byBndWFyYW50ZWUgdGhhdCBhdCBsZWFzdAorICAgICAqICBvbmUgdG9rZW4vdHJlZSBub2RlIGlzIGNvbnN1bWVkIGZvciB0d28gZXJyb3JzLgorICAgICAqLworICAgIEFOVExSM19NQVJLRVIJbGFzdEVycm9ySW5kZXg7CisKKyAgICAvKiogSW4gbGlldSBvZiBhIHJldHVybiB2YWx1ZSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHJ1bGUgb3IgdG9rZW4KKyAgICAgKiAgaGFzIGZhaWxlZCB0byBtYXRjaC4gIFJlc2V0IHRvIGZhbHNlIHVwb24gdmFsaWQgdG9rZW4gbWF0Y2guCisgICAgICovCisgICAgQU5UTFIzX0JPT0xFQU4JZmFpbGVkOworCisgICAgLyoqIFdoZW4gdGhlIHJlY29nbml6ZXIgdGVybWluYXRlcywgdGhlIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucworICAgICAqICB3aWxsIGhhdmUgaW5jcmVtZW50ZWQgdGhpcyB2YWx1ZSBpZiBhbnkgZXJyb3Igb2NjdXJyZWQgKHRoYXQgd2FzIGRpc3BsYXllZCkuIEl0IGNhbiB0aGVuIGJlCisgICAgICogIHVzZWQgYnkgdGhlIGdyYW1tYXIgcHJvZ3JhbW1lciB3aXRob3V0IGhhdmluZyB0byB1c2Ugc3RhdGljIGdsb2JhbHMuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgllcnJvckNvdW50OworCisgICAgLyoqIElmIDAsIG5vIGJhY2t0cmFja2luZyBpcyBnb2luZyBvbi4gIFNhZmUgdG8gZXhlYyBhY3Rpb25zIGV0Yy4uLgorICAgICAqICBJZiA+MCB0aGVuIGl0J3MgdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZy4KKyAgICAgKi8KKyAgICBBTlRMUjNfSU5UMzIJYmFja3RyYWNraW5nOworCisgICAgLyoqIEFOVExSM19WRUNUT1Igb2YgQU5UTFIzX0xJU1QgZm9yIHJ1bGUgbWVtb2l6aW5nLgorICAgICAqICBUcmFja3MgIHRoZSBzdG9wIHRva2VuIGluZGV4IGZvciBlYWNoIHJ1bGUuICBydWxlTWVtb1tydWxlSW5kZXhdIGlzCisgICAgICogIHRoZSBtZW1vaXphdGlvbiB0YWJsZSBmb3IgcnVsZUluZGV4LiAgRm9yIGtleSBydWxlU3RhcnRJbmRleCwgeW91CisgICAgICogIGdldCBiYWNrIHRoZSBzdG9wIHRva2VuIGZvciBhc3NvY2lhdGVkIHJ1bGUgb3IgTUVNT19SVUxFX0ZBSUxFRC4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIG9ubHkgdXNlZCBpZiBydWxlIG1lbW9pemF0aW9uIGlzIG9uLgorICAgICAqLworICAgIHBBTlRMUjNfSU5UX1RSSUUJcnVsZU1lbW87CisKKyAgICAvKiogUG9pbnRlciB0byBhbiBhcnJheSBvZiB0b2tlbiBuYW1lcworICAgICAqICB0aGF0IGFyZSBnZW5lcmFsbHkgdXNlZnVsIGluIGVycm9yIHJlcG9ydGluZy4gVGhlIGdlbmVyYXRlZCBwYXJzZXJzIGluc3RhbGwKKyAgICAgKiAgdGhpcyBwb2ludGVyLiBUaGUgdGFibGUgaXQgcG9pbnRzIHRvIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFzIDggYml0IGFzY2lpCisgICAgICogIGF0IHBhcnNlciBjb21waWxlIHRpbWUgLSBncmFtbWFyIHRva2VuIG5hbWVzIGFyZSB0aHVzIHJlc3RyaWN0ZWQgaW4gY2hhcmFjdGVyCisgICAgICogIHNldHMsIHdoaWNoIGRvZXMgbm90IHNlZW0gdG8gdGVycmlibGUuCisgICAgICovCisgICAgcEFOVExSM19VSU5UOAkqIHRva2VuTmFtZXM7CisKKyAgICAvKiogVXNlciBwcm9ncmFtbWFibGUgcG9pbnRlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBhcyBhIHBsYWNlIHRvCisgICAgICogIHN0b3JlIHNvbWUgdHJhY2tpbmcgc3RydWN0dXJlIHNwZWNpZmljIHRvIHRoZSBncmFtbWFyIHRoYXQgd291bGQgbm90IG5vcm1hbGx5CisgICAgICogIGJlIGF2YWlsYWJsZSB0byB0aGUgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zLgorICAgICAqLworICAgIHZvaWQJCSogdXNlcnA7CisKKwkgICAgLyoqIFRoZSBnb2FsIG9mIGFsbCBsZXhlciBydWxlcy9tZXRob2RzIGlzIHRvIGNyZWF0ZSBhIHRva2VuIG9iamVjdC4KKyAgICAgKiAgVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSBhcyBtdWx0aXBsZSBydWxlcyBtYXkgY29sbGFib3JhdGUgdG8KKyAgICAgKiAgY3JlYXRlIGEgc2luZ2xlIHRva2VuLiAgRm9yIGV4YW1wbGUsIE5VTSA6IElOVCB8IEZMT0FUIDsKKyAgICAgKiAgSW4gdGhpcyBjYXNlLCB5b3Ugd2FudCB0aGUgSU5UIG9yIEZMT0FUIHJ1bGUgdG8gc2V0IHRva2VuIGFuZCBub3QKKyAgICAgKiAgaGF2ZSBpdCByZXNldCB0byBhIE5VTSB0b2tlbiBpbiBydWxlIE5VTS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTgl0b2tlbjsKKworICAgIC8qKiBUaGUgZ29hbCBvZiBhbGwgbGV4ZXIgcnVsZXMgYmVpbmcgdG8gY3JlYXRlIGEgdG9rZW4sIHRoZW4gYSBsZXhlcgorICAgICAqICBuZWVkcyB0byBidWlsZCBhIHRva2VuIGZhY3RvcnkgdG8gY3JlYXRlIHRoZW0uCisgICAgICovCisgICAgcEFOVExSM19UT0tFTl9GQUNUT1JZCXRva0ZhY3Rvcnk7CisKKyAgICAvKiogQSBsZXhlciBpcyBhIHNvdXJjZSBvZiB0b2tlbnMsIHByb2R1Y2VkIGJ5IGFsbCB0aGUgZ2VuZXJhdGVkIChvcgorICAgICAqICBoYW5kIGNyYWZ0ZWQgaWYgeW91IGxpa2UpIG1hdGNoaW5nIHJ1bGVzLiBBcyBzdWNoIGl0IG5lZWRzIHRvIHByb3ZpZGUKKyAgICAgKiAgYSB0b2tlbiBzb3VyY2UgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHBBTlRMUjNfVE9LRU5fU09VUkNFCXRva1NvdXJjZTsKKworICAgIC8qKiBUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHRva2VuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkJY2hhbm5lbDsKKworICAgIC8qKiBUaGUgdG9rZW4gdHlwZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCQl0eXBlOworICAgIAorICAgIC8qKiBUaGUgaW5wdXQgbGluZSAod2hlcmUgaXQgbWFrZXMgc2Vuc2UpIG9uIHdoaWNoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiAgdG9rZW4gcmVzaWRlcy4KKyAgICAgKi8KKyAgICBBTlRMUjNfSU5UMzIJCXRva2VuU3RhcnRMaW5lOworCisgICAgLyoqIFRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY3VycmVudCB0b2tlbgorICAgICAqICB3aXRoaW4gdGhlIGxpbmUgc3BlY2lmaWVkIGJ5IHRva2VuU3RhcnRMaW5lCisgICAgICovCisgICAgQU5UTFIzX0lOVDMyCQl0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworCisgICAgLyoqIFdoYXQgY2hhcmFjdGVyIGluZGV4IGluIHRoZSBzdHJlYW0gZGlkIHRoZSBjdXJyZW50IHRva2VuIHN0YXJ0IGF0PworICAgICAqICBOZWVkZWQsIGZvciBleGFtcGxlLCB0byBnZXQgdGhlIHRleHQgZm9yIGN1cnJlbnQgdG9rZW4uICBTZXQgYXQKKyAgICAgKiAgdGhlIHN0YXJ0IG9mIG5leHRUb2tlbi4KKyAgICAgKi8KKyAgICBBTlRMUjNfTUFSS0VSCQl0b2tlblN0YXJ0Q2hhckluZGV4OworCisgICAgLyoqIFRleHQgZm9yIHRoZSBjdXJyZW50IHRva2VuLiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgdGhpcyAKKyAgICAgKiAgdmFyaWFibGUgZGlyZWN0bHkgb3IgYnkgdXNpbmcgdGhlIFNFVFRFWFQoKSBtYWNybyAocHJlZmVycmVkKSBpbiB5b3VyCisgICAgICogIGxleGVyIHJ1bGVzLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HCQl0ZXh0OworCisJLyoqIFVzZXIgY29udHJvbGxlZCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluc3RhbGxlZCBpbiBhIG5ld2x5IGNyZWF0ZWQKKwkgKiB0b2tlbi4KKwkgKi8KKwlBTlRMUjNfVUlOVDMyCQl1c2VyMSwgdXNlcjIsIHVzZXIzOworCXZvaWQJCQkJKiBjdXN0b207CisKKyAgICAvKiogSW5wdXQgc3RyZWFtIHN0YWNrLCB3aGljaCBhbGxvd3MgdGhlIEMgcHJvZ3JhbW1lciB0byBzd2l0Y2ggaW5wdXQgc3RyZWFtcyAKKyAgICAgKiAgZWFzaWx5IGFuZCBhbGxvdyB0aGUgc3RhbmRhcmQgbmV4dFRva2VuKCkgaW1wbGVtZW50YXRpb24gdG8gZGVhbCB3aXRoIGl0CisgICAgICogIGFzIHRoaXMgaXMgYSBjb21tb24gcmVxdWlyZW1lbnQuCisgICAgICovCisgICAgcEFOVExSM19TVEFDSwkJc3RyZWFtczsKKworCS8vLyBBIHN0YWNrIG9mIHRva2VuL3RyZWUgcmV3cml0ZSBzdHJlYW1zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdXNlCisJLy8vIGJ5IGEgcGFyc2VyIG9yIHRyZWUgcGFyc2VyIHRoYXQgaXMgdXNpbmcgcmV3cml0ZXMgdG8gZ2VuZXJhdGUKKwkvLy8gYW4gQVNULiBUaGlzIHNhdmVzIGVhY2ggcnVsZSBpbiB0aGUgcmVjb25naXplciBmcm9tIGhhdmluZyB0byAKKwkvLy8gYWxsb2NhdGUgYW5kIGRlYWxsb2NhdGUgcmV3dGlyZSBzdHJlYW1zIG9uIGVudHJ5IGFuZCBleGl0LiBBcworCS8vLyB0aGUgcGFyc2VyIHJlY3Vyc2VzIHRocm9naCB0aGUgcnVsZXMgaXQgd2lsbCByZWFjaCBhIHN0ZWFkeSBzdGF0ZQorCS8vLyBvZiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWxsb2NhdGVkIHN0cmVhbXMsIHdoaWNoIGluc3RlYWQgb2YKKwkvLy8gZGVhbGxvY2F0aW5nIHRoZW0gYXQgcnVsZSBleGl0LCBpdCB3aWxsIHBsYWNlIG9uIHRoaXMgc3RhY2sgZm9yCisJLy8vIHJldXNlLiBUaGUgc3RyZWFtcyBhcmUgdGhlbiBhbGwgZmluYWxseSBmcmVlZCB3aGVuIHRoaXMgc3RhY2sKKwkvLy8gaXMgZnJlZWQuCisJLy8vCisJcEFOVExSM19WRUNUT1IJCXJTdHJlYW1zOworCit9CisJQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcmV3cml0ZXN0cmVhbXMuaCBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNyZXdyaXRlc3RyZWFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODNmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzcmV3cml0ZXN0cmVhbXMuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZglBTlRMUjNSRVdSSVRFU1RSRUFNX0gKKyNkZWZpbmUJQU5UTFIzUkVXUklURVNUUkVBTV9ICisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb2xsZWN0aW9ucy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbW1vbnRyZWVhZGFwdG9yLmg+CisjaW5jbHVkZQk8YW50bHIzYmFzZXJlY29nbml6ZXIuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy8gQSBnZW5lcmljIGxpc3Qgb2YgZWxlbWVudHMgdHJhY2tlZCBpbiBhbiBhbHRlcm5hdGl2ZSB0byBiZSB1c2VkIGluCisvLy8gYSAtPiByZXdyaXRlIHJ1bGUuICAKKy8vLworLy8vIEluIHRoZSBDIGltcGxlbWVudGF0aW9uLCBhbGwgdHJlZSBvcmllbnRlZCBzdHJlYW1zIHJldHVybiBhIHBvaW50ZXIgdG8gCisvLy8gdGhlIHNhbWUgdHlwZTogcEFOVExSM19CQVNFX1RSRUUuIEFueXRoaW5nIHRoYXQgaGFzIHN1YmNsYXNzZWQgZnJvbSB0aGlzCisvLy8gc3RpbGwgcGFzc2VzIHRoaXMgdHlwZSwgd2l0aGluIHdoaWNoIHRoZXJlIGlzIGEgc3VwZXIgcG9pbnRlciwgd2hpY2ggcG9pbnRzCisvLy8gdG8gaXQncyBvd24gZGF0YSBhbmQgbWV0aG9kcy4gSGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgYXMKKy8vLyB0aGUgZXF1aXZhbGVudCBvZiBhbiBhYnN0cmFjdCBjbGFzcywgYnV0IGp1c3QgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlCisvLy8gYXMgdXN1YWwgd2l0aCB0aGlzIG1vZGVsLgorLy8vCisvLy8gT25jZSB5b3Ugc3RhcnQgbmV4dCgpaW5nLCBkbyBub3QgdHJ5IHRvIGFkZCBtb3JlIGVsZW1lbnRzLiAgSXQgd2lsbAorLy8vIGJyZWFrIHRoZSBjdXJzb3IgdHJhY2tpbmcgSSBiZWxpZXZlLgorLy8vCisvLy8gCisvLy8gXHNlZSAjcEFOVExSM19SRVdSSVRFX1JVTEVfTk9ERV9TVFJFQU0KKy8vLyBcc2VlICNwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTQorLy8vIFxzZWUgI3BBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNCisvLy8KKy8vLyBUT0RPOiBhZGQgbWVjaGFuaXNtIHRvIGRldGVjdC9wdWtlIG9uIG1vZGlmaWNhdGlvbiBhZnRlciByZWFkaW5nIGZyb20gc3RyZWFtCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0Cit7CisKKyAgICAvLy8gQ3Vyc29yIDAuLm4tMS4gIElmIHNpbmdsZUVsZW1lbnQhPU5VTEwsIGN1cnNvciBpcyAwIHVudGlsIHlvdSBuZXh0KCksCisgICAgLy8vIHdoaWNoIGJ1bXBzIGl0IHRvIDEgbWVhbmluZyBubyBtb3JlIGVsZW1lbnRzLgorICAgIC8vLworICAgIEFOVExSM19VSU5UMzIJCSAgY3Vyc29yOworCisgICAgLy8vIFRyYWNrIHNpbmdsZSBlbGVtZW50cyB3L28gY3JlYXRpbmcgYSBsaXN0LiAgVXBvbiAybmQgYWRkLCBhbGxvYyBsaXN0IAorICAgIC8vLworICAgIHZvaWQJCQkqIHNpbmdsZUVsZW1lbnQ7CisKKyAgICAvLy8gVGhlIGxpc3Qgb2YgdG9rZW5zIG9yIHN1YnRyZWVzIHdlIGFyZSB0cmFja2luZyAKKyAgICAvLy8KKyAgICBwQU5UTFIzX1ZFQ1RPUgkJICBlbGVtZW50czsKKworICAgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgZnJlZSB0aGUgdmVjdG9yIG9yIGl0IHdhcyBzdXBwbGllZCB0byB1cworICAgIC8vLworICAgIEFOVExSM19CT09MRUFOCQkgIGZyZWVFbGVtZW50czsKKworICAgIC8vLyBUaGUgZWxlbWVudCBvciBzdHJlYW0gZGVzY3JpcHRpb247IHVzdWFsbHkgaGFzIG5hbWUgb2YgdGhlIHRva2VuIG9yCisgICAgLy8vIHJ1bGUgcmVmZXJlbmNlIHRoYXQgdGhpcyBsaXN0IHRyYWNrcy4gIENhbiBpbmNsdWRlIHJ1bGVuYW1lIHRvbywgYnV0CisgICAgLy8vIHRoZSBleGNlcHRpb24gd291bGQgdHJhY2sgdGhhdCBpbmZvLgorICAgIC8vLworICAgIHZvaWQJCQkJKiBlbGVtZW50RGVzY3JpcHRpb247CisKKwkvLy8gUG9pbnRlciB0byB0aGUgdHJlZSBhZGFwdG9yIGluIHVzZSBmb3IgdGhpcyBzdHJlYW0KKwkvLy8KKyAgICBwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SCSAgYWRhcHRvcjsKKworCS8vLyBPbmNlIGEgbm9kZSAvIHN1YnRyZWUgaGFzIGJlZW4gdXNlZCBpbiBhIHN0cmVhbSwgaXQgbXVzdCBiZSBkdXAnZWQKKwkvLy8gZnJvbSB0aGVuIG9uLiAgU3RyZWFtcyBhcmUgcmVzZXQgYWZ0ZXIgc3ViIHJ1bGVzIHNvIHRoYXQgdGhlIHN0cmVhbXMKKwkvLy8gY2FuIGJlIHJldXNlZCBpbiBmdXR1cmUgc3ViIHJ1bGVzLiAgU28sIHJlc2V0IG11c3Qgc2V0IGEgZGlydHkgYml0LgorCS8vLyBJZiBkaXJ0eSwgdGhlbiBuZXh0KCkgYWx3YXlzIHJldHVybnMgYSBkdXAuCisJLy8vCisJQU5UTFIzX0JPT0xFQU4JCQkJZGlydHk7CisKKwkvLyBQb2ludGVyIHRvIHRoZSByZWNvZ25pemVyIHNoYXJlZCBzdGF0ZSB0byB3aGljaCB0aGlzIHN0cmVhbSBiZWxvbmdzCisJLy8KKwlwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUgkJcmVjOworCisgICAgLy8gICBNZXRob2RzIAorCisgICAgLy8vIFJlc2V0IHRoZSBjb25kaXRpb24gb2YgdGhpcyBzdHJlYW0gc28gdGhhdCBpdCBhcHBlYXJzIHdlIGhhdmUKKyAgICAvLy8gIG5vdCBjb25zdW1lZCBhbnkgb2YgaXRzIGVsZW1lbnRzLiAgRWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgdW50b3VjaGVkLgorICAgIC8vLworICAgIHZvaWQJCSgqcmVzZXQpCQkJCShzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgKiBzdHJlYW0pOyAKKworICAgIC8vLyBBZGQgYSBuZXcgcEFOVExSM19CQVNFX1RSRUUgdG8gdGhpcyBzdHJlYW0KKyAgICAvLy8KKyAgICB2b2lkCQkoKmFkZCkJCQkJCShzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgKiBzdHJlYW0sIHZvaWQgKmVsLCB2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVQdHIpKHZvaWQgKikpOworCisgICAgLy8vIFJldHVybiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBzdHJlYW0uICBJZiBvdXQgb2YgZWxlbWVudHMsIHRocm93CisgICAgLy8vIGFuIGV4Y2VwdGlvbiB1bmxlc3Mgc2l6ZSgpPT0xLiAgSWYgc2l6ZSBpcyAxLCB0aGVuIHJldHVybiBlbGVtZW50c1swXS4KKyAgICAvLy8KKwl2b2lkICoJCQkJCSgqbmV4dCkJCQkJCShzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgKiBzdHJlYW0pOworICAgIHBBTlRMUjNfQkFTRV9UUkVFCQkoKm5leHRUcmVlKQkJCQkoc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0ICogc3RyZWFtKTsKKyAgICB2b2lkICoJCQkJCSgqbmV4dFRva2VuKQkJCShzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgKiBzdHJlYW0pOworICAgIHZvaWQgKgkJCQkJKCpfbmV4dCkJCQkJKHN0cnVjdCBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNX3N0cnVjdCAqIHN0cmVhbSk7CisKKyAgICAvLy8gV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGR1cCBhIHRva2VuIG9yIEFTVAorICAgIC8vLwlzdWJ0cmVlLiAgRHVwJ2luZyBhIHRva2VuIG1lYW5zIGp1c3QgY3JlYXRpbmcgYW5vdGhlciBBU1Qgbm9kZQorICAgIC8vLyBhcm91bmQgaXQuICBGb3IgdHJlZXMsIHlvdSBtdXN0IGNhbGwgdGhlIGFkYXB0b3IuZHVwVHJlZSgpLgorICAgIC8vLworICAgIHZvaWQgKgkJKCpkdXApCQkJCQkoc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0ICogc3RyZWFtLCB2b2lkICogZWwpOworCisgICAgLy8vIEVuc3VyZSBzdHJlYW0gZW1pdHMgdHJlZXM7IHRva2VucyBtdXN0IGJlIGNvbnZlcnRlZCB0byBBU1Qgbm9kZXMuCisgICAgLy8vIEFTVCBub2RlcyBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5tb2xlc3RlZC4KKyAgICAvLy8KKyAgICBwQU5UTFIzX0JBU0VfVFJFRQkoKnRvVHJlZSkJCShzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgKiBzdHJlYW0sIHZvaWQgKiBlbCk7CisKKyAgICAvLy8gUmV0dXJucyBBTlRMUjNfVFJVRSBpZiB0aGVyZSBpcyBhIG5leHQgZWxlbWVudCBhdmFpbGFibGUKKyAgICAvLy8KKyAgICBBTlRMUjNfQk9PTEVBTgkoKmhhc05leHQpCQkJKHN0cnVjdCBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNX3N0cnVjdCAqIHN0cmVhbSk7CisKKyAgICAvLy8gVHJlYXQgbmV4dCBlbGVtZW50IGFzIGEgc2luZ2xlIG5vZGUgZXZlbiBpZiBpdCdzIGEgc3VidHJlZS4KKyAgICAvLy8gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YgbmV4dCgpIHdoZW4gdGhlIHJlc3VsdCBoYXMgdG8gYmUgYQorICAgIC8vLyB0cmVlIHJvb3Qgbm9kZS4gIEFsc28gcHJldmVudHMgdXMgZnJvbSBkdXBsaWNhdGluZyByZWNlbnRseS1hZGRlZAorICAgIC8vLyBjaGlsZHJlbjsgZS5nLiwgXih0eXBlIElEKSsgYWRkcyBJRCB0byB0eXBlIGFuZCB0aGVuIDJuZCBpdGVyYXRpb24KKyAgICAvLy8gbXVzdCBkdXAgdGhlIHR5cGUgbm9kZSwgYnV0IElEIGhhcyBiZWVuIGFkZGVkLgorICAgIC8vLworICAgIC8vLyBSZWZlcmVuY2luZyB0byBhIHJ1bGUgcmVzdWx0IHR3aWNlIGlzIG9rOyBkdXAgZW50aXJlIHRyZWUgYXMKKyAgICAvLy8gd2UgY2FuJ3QgYmUgYWRkaW5nIHRyZWVzOyBlLmcuLCBleHByIGV4cHIuIAorICAgIC8vLworICAgIHBBTlRMUjNfQkFTRV9UUkVFCSgqbmV4dE5vZGUpCQkoc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0ICogc3RyZWFtKTsKKworICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgYXZhaWxhYmxlIGluIHRoZSBzdHJlYW0KKyAgICAvLy8KKyAgICBBTlRMUjNfVUlOVDMyCSgqc2l6ZSkJCQkJKHN0cnVjdCBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNX3N0cnVjdCAqIHN0cmVhbSk7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGlmIHRoZXJlIGlzIG9uZSBhdmFpbGFibGUgKGNoZWNrIGZvciBOVUxMKS4KKyAgICAvLy8KKyAgICB2b2lkICoJCQkoKmdldERlc2NyaXB0aW9uKQkoc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0ICogc3RyZWFtKTsKKworICAgIHZvaWQJCSgqZnJlZSkJCQkJCShzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgKiBzdHJlYW0pOworCit9CisgICAgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTTsKKworLy8vIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYSB0b2tlbiBzdHJlYW0sIHdoaWNoIGlzIGJhc2ljYWxseSBhbiBlbGVtZW50CisvLy8gIHN0cmVhbSB0aGF0IGRlYWxzIHdpdGggdG9rZW5zIG9ubHkuCisvLy8KK3R5cGVkZWYgc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU1fc3RydWN0IEFOVExSM19SRVdSSVRFX1JVTEVfVE9LRU5fU1RSRUFNOworCisvLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIHN1YnRyZWUgc3RyZWFtIHdoaWNoIGlzIGEgc2V0IG9mIHRyZWVzCisvLy8gIG1vZGVsbGVkIGFzIGFuIGVsZW1lbnQgc3RyZWFtLgorLy8vCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNX3N0cnVjdCBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNOworCisvLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIG5vZGUgc3RyZWFtLCB3aGljaCBpcyBiYXNpY2FsbHkgYW4gZWxlbWVudAorLy8vICBzdHJlYW0gdGhhdCBkZWFscyB3aXRoIHRyZWUgbm9kZXMgb25seS4KKy8vLwordHlwZWRlZiBzdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTV9zdHJ1Y3QgQU5UTFIzX1JFV1JJVEVfUlVMRV9OT0RFX1NUUkVBTTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzc3RyaW5nLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5NmU3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjNzdHJpbmcuaApAQCAtMCwwICsxLDI3MiBAQAorLyoqIFxmaWxlCisgKiBTaW1wbGUgc3RyaW5nIGludGVyZmFjZSBhbGxvd3MgaW5kaXNjcmltaW5hdGUgYWxsb2NhdGlvbiBvZiBzdHJpbmdzCisgKiBzdWNoIHRoYXQgdGhleSBjYW4gYmUgYWxsb2NhdGVkIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgcmVsZWFzZWQgaW4gCisgKiBvbmUgY2h1bmsgdmlhIGEgc3RyaW5nIGZhY3RvcnkgLSBzYXZlcyBsb3RzIG9mIGhhc3NsZSBpbiByZW1lbWJlcmluZyB3aGF0CisgKiBzdHJpbmdzIHdlcmUgYWxsb2NhdGVkIHdoZXJlLgorICovCisjaWZuZGVmCV9BTlRMUjNfU1RSSU5HX0gKKyNkZWZpbmUJX0FOVExSM19TVFJJTkdfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzY29sbGVjdGlvbnMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQmFzZSBzdHJpbmcgY2xhc3MgdHJhY2tzIHRoZSBhbGxvY2F0aW9ucyBhbmQgcHJvdmlkZXMgc2ltcGxlIHN0cmluZworICogIHRyYWNraW5nIGZ1bmN0aW9ucy4gTW9zdGx5IHlvdSBjYW4gd29yayBkaXJlY3RseSBvbiB0aGUgc3RyaW5nIGZvciB0aGluZ3MKKyAqICB0aGF0IGRvbid0IHJlYWxsb2NhdGUgaXQsIGxpa2Ugc3RyY2hyKCkgZXRjLiBQZXJoYXBzIHNvbWVvbmUgd2lsbCB3YW50IHRvIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIGZvciBVVEY4CisgKiAgYW5kIHNvIG9uLgorICovCit0eXBlZGVmCXN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdAoreworCisgICAgLyoqIFRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlZCB0aGlzIHN0cmluZworICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkJZmFjdG9yeTsKKworICAgIC8qKiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHN0cmluZyB2YWx1ZSAoc3RhcnRzIGF0IE5VTEwgdW5sZXNzCisgICAgICogIHRoZSBzdHJpbmcgYWxsb2NhdG9yIGlzIHRvbGQgdG8gY3JlYXRlIGl0IHdpdGggYSBwcmUga25vd24gc2l6ZS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1VJTlQ4CQljaGFyczsKKworICAgIC8qKiBDdXJyZW50IGxlbmd0aCBvZiB0aGUgc3RyaW5nIHVwIHRvIGFuZCBub3QgaW5jbHVkaW5nLCB0aGUgdHJhaWxpbmcgJ1wwJworICAgICAqICBOb3RlIHRoYXQgdGhlIGFjdHVhbCBhbGxvY2F0aW9uICgtPnNpemUpCisgICAgICogIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUgYnl0ZSBtb3JlIHRoYW4gdGhpcyB0byBhY2NvbW1vZGF0ZSB0cmFpbGluZyAnXDAnCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkJbGVuOworCisgICAgLyoqIEN1cnJlbnQgc2l6ZSBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJworICAgICAqLworICAgIEFOVExSM19VSU5UMzIJCXNpemU7CisKKyAgICAvKiogSW5kZXggb2Ygc3RyaW5nIChhbGxvY2F0aW9uIG51bWJlcikgaW4gY2FzZSBzb21lb25lIHdhbnRzCisgICAgICogIHRvIGV4cGxpY2l0bHkgcmVsZWFzZSBpdC4KKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyCQlpbmRleDsKKworICAgIC8qKiBPY2Nhc2lvbmFsbHkgaXQgaXMgdXNlZnVsIHRvIGtub3cgd2hhdCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHN0cmluZworICAgICAqICBhY3R1YWxseSBpcywgaGVuY2UgaXQgaXMgc3RvcmVkIGhlcmUgYXMgb25lIHRoZSBBTlRMUjNfRU5DT0RJTkdfIHZhbHVlcworICAgICAqLworICAgIEFOVExSM19VSU5UOAkJZW5jb2Rpbmc7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHNldHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIHNwZWNpZmljIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBlbmNvZGluZworICAgICAqICBmb3IgdGhpcyBzdHJpbmcuIEZvciBpbnN0YW5jZSwgaWYgdGhpcyBpcyA4IGJpdCwgdGhlbiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBzYW1lIGFzIHNldDgKKyAgICAgKiAgYnV0IGlmIHRoZSBlbmNvZGluZyBpcyBVVEYxNiwgdGhlbiB0aGUgcG9pbnRlciBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIFVURjE2IGNoYXJhY3RlcnMsIG5vdAorICAgICAqICA4IGJpdC4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1VJTlQ4ICAgKCpzZXQpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIGNvbnN0IGNoYXIgKiBjaGFycyk7CisgICAKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHNldHMgdGhlIHN0cmluZyB2YWx1ZSB0byBhIHNwZWNpZmljIDggYml0IHN0cmluZyBpbiB0aGUgZGVmYXVsdCBlbmNvZGluZworICAgICAqICBmb3IgdGhpcyBzdHJpbmcuIEZvciBpbnN0YW5jZSwgaWYgdGhpcyBpcyBhbiA4IGJpdCBzdHJpbmcsIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBzZXQ4CisgICAgICogIGJ1dCBpZiB0aGUgZW5jb2RpbmcgaXMgVVRGMTYsIHRoZW4gdGhlIHBvaW50ZXIgaXMgYXNzdW1lZCB0byBwb2ludCB0byA4IGJpdCBjaGFyYWN0ZXJzIHRoYXQgbXVzdAorICAgICAqICBiZSBjb252ZXJ0ZWQgdG8gVVRGMTYgY2hhcmFjdGVycyBvbiB0aGUgZmx5LgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDggICAoKnNldDgpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIGNvbnN0IGNoYXIgKiBjaGFycyk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiBhZGRzIGEgcmF3IGNoYXIgKiB0eXBlIHBvaW50ZXIgaW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcKKyAgICAgKiAgZm9yIHRoaXMgc3RyaW5nLiBGb3IgaW5zdGFuY2UsIGlmIHRoaXMgaXMgOCBiaXQsIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBhcHBlbmQ4CisgICAgICogIGJ1dCBpZiB0aGUgZW5jb2RpbmcgaXMgVVRGMTYsIHRoZW4gdGhlIHBvaW50ZXIgaXMgYXNzdW1lZCB0byBwb2ludCB0byBVVEYxNiBjaGFyYWN0ZXJzIG5vdAorICAgICAqICA4IGJpdC4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1VJTlQ4ICAgKCphcHBlbmQpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIGNvbnN0IGNoYXIgKiBuZXdiaXQpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gYWRkcyBhIHJhdyBjaGFyICogdHlwZSBwb2ludGVyIGluIHRoZSBkZWZhdWx0IGVuY29kaW5nCisgICAgICogIGZvciB0aGlzIHN0cmluZy4gRm9yIGluc3RhbmNlLCBpZiB0aGlzIGlzIGEgVVRGMTYgc3RyaW5nLCB0aGVuIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgcG9pbnRlcgorICAgICAqICBwb2ludHMgdG8gOCBiaXQgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgY29udmVydGVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgcEFOVExSM19VSU5UOCAgICgqYXBwZW5kOCkJKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgY29uc3QgY2hhciAqIG5ld2JpdCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IGluc2VydHMgdGhlIHN1cHBsaWVkIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogIG9mZnNldCBpbiB0aGUgY3VycmVudCBzdHJpbmcgaW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoaXMgc3RyaW5nLiBGb3IgaW5zdGFuY2UsIGlmIHRoaXMgaXMgYW4gOAorICAgICAqICBiaXQgc3RyaW5nLCB0aGVuIHRoaXMgaXMgdGhlIHNhbWUgYXMgaW5zZXJ0OCwgYnV0IGlmIHRoaXMgaXMgYSBVVEYxNiBzdHJpbmcsIHRoZW4gdGhlIHBvaW50ZXIKKyAgICAgKiAgbXVzdCBwb2ludCB0byBVVEYxNiBjaGFyYWN0ZXJzLgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDggICAoKmluc2VydCkJKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgY29uc3QgY2hhciAqIG5ld2JpdCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IGluc2VydHMgdGhlIHN1cHBsaWVkIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogIG9mZnNldCBpbiB0aGUgY3VycmVudCBzdHJpbmcgaW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoaXMgc3RyaW5nLiBGb3IgaW5zdGFuY2UsIGlmIHRoaXMgaXMgYSBVVEYxNiBzdHJpbmcKKyAgICAgKiAgdGhlbiB0aGUgcG9pbnRlciBpcyBhc3N1bWVkIHRvIHBvaW50IGF0IDggYml0IGNoYXJhY3RlcmVzIHRoYXQgbXVzdCBiZSBjb252ZXJ0ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1VJTlQ4ICAgKCppbnNlcnQ4KQkoc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICogc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHBvaW50LCBjb25zdCBjaGFyICogbmV3Yml0KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgc2V0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nIChzdHJpbmdzIG11c3QgYmUgaW4gdGhlIAorICAgICAqICBzYW1lIGVuY29kaW5nLgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDggICAoKnNldFMpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIGNoYXJzKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIGFwcGVuZHMgYSBjb3B5IG9mIHRoZSBjaGFyYWN0ZXJzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHN0cmluZy4gU3RyaW5ncyBtdXN0IGJlIGluIHRoZQorICAgICAqICBzYW1lIGVuY29kaW5nLgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDggICAoKmFwcGVuZFMpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIG5ld2JpdCk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IGluc2VydHMgYSBjb3B5IG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdXBwbGllZCBzdHJpbmcgYXQgdGhlIHNwZWNpZmllZAorICAgICAqICBvZmZzZXQgaW4gdGhlIGN1cnJlbnQgc3RyaW5nLiBzdHJpbmdzIG11c3QgYmUgaW4gdGhlIHNhbWUgZW5jb2RpbmcuCisgICAgICovCisgICAgcEFOVExSM19VSU5UOCAgICgqaW5zZXJ0UykJKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICogbmV3Yml0KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgc3VwcGxpZWQgaW50ZWdlciBpbiBzdHJpbmcgZm9ybSBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogIG9mZnNldCBpbiB0aGUgY3VycmVudCBzdHJpbmcuCisgICAgICovCisgICAgcEFOVExSM19VSU5UOCAgICgqaW5zZXJ0aSkJKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgQU5UTFIzX0lOVDMyIGkpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBhZGRzIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIGluIHRoZSBlbmNvZGluZyBvZiB0aGUKKyAgICAgKiAgc3RyaW5nIC0gOCBiaXQsIFVURjE2LCB1dGYtOCBldGMuIElucHV0IGlzIGEgc2luZ2xlIFVURjMyICgzMiBiaXRzIHdpZGUgaW50ZWdlcikgY2hhcmFjdGVyLgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDggICAoKmFkZGMpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIEFOVExSM19VSU5UMzIgYyk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IGFkZHMgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIKKyAgICAgKiAgdG8gdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1VJTlQ4ICAgKCphZGRpKQkoc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICogc3RyaW5nLCBBTlRMUjNfSU5UMzIgaSk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHRoZSB0ZXh0IG9mIGEgc3RyaW5nIHRvIHRoZSBzdXBwbGllZAorICAgICAqICA4IGJpdCBjaGFyYWN0ZXIgc3RyaW5nIGFuZCByZXR1cm5zIGEgcmVzdWx0IGEgbGEgc3RyY21wKCkKKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgKCpjb21wYXJlOCkJKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgY29uc3QgY2hhciAqIGNvbXBTdHIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHRoZSB0ZXh0IG9mIGEgc3RyaW5nIHdpdGggdGhlIHN1cHBsaWVkIGNoYXJhY3RlciBzdHJpbmcKKyAgICAgKiAgKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHN0cmluZyBpdHNlbGYpIGFuZCByZXR1cm5zIGEgcmVzdWx0CisgICAgICogIGEgbGEgc3RyY21wKCkKKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgKCpjb21wYXJlKQkoc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICogc3RyaW5nLCBjb25zdCBjaGFyICogY29tcFN0cik7CisKKyAgICAvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdGhlIHRleHQgb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3VwcGxpZWQgc3RyaW5nCisgICAgICogICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSBzYW1lIGVuY29kaW5nIGFzIHRoZSBzdHJpbmcgaXRzZWxmKSBhbmQgcmV0dXJucyBhIHJlc3VsdAorICAgICAqICBhIGxhIHN0cmNtcCgpCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMiAgICgqY29tcGFyZVMpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcsIHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIGNvbXBTdHIpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNoYXJhY3RlciBpbmRleGVkIGF0IHRoZSBzdXBwbGllZAorICAgICAqICBvZmZzZXQgYXMgYSAzMiBiaXQgY2hhcmFjdGVyLgorICAgICAqLworICAgIEFOVExSM19VQ0hBUiAgICAoKmNoYXJBdCkJKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgQU5UTFIzX1VJTlQzMiBvZmZzZXQpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzdWJzdHJpbmcgb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBhIGxhIC5zdWJTdHJpbmcocyxlKQorICAgICAqICBpbiB0aGUgSmF2YSBsYW5ndWFnZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKgorCQkJCQkoKnN1YlN0cmluZykgICAgKHN0cnVjdCBBTlRMUjNfU1RSSU5HX3N0cnVjdCAqIHN0cmluZywgQU5UTFIzX1VJTlQzMiBzdGFydEluZGV4LCBBTlRMUjNfVUlOVDMyIGVuZEluZGV4KTsKKworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGFueSBudW1lcmljIGNoYXJhY3RlcnMKKyAgICAgKiAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nCisgICAgICovCisgICAgQU5UTFIzX0lOVDMyCSgqdG9JbnQzMikJICAgIChzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcpOworCisgICAgLyoqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IHlpZWxkcyBhbiA4IGJpdCBzdHJpbmcgcmVnYXJkbGVzcyBvZiB0aGUgZW5jb2Rpbmcgb2YgdGhlIHN1cHBsaWVkCisgICAgICogIHN0cmluZy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byB1c2UgdGhlIHRleHQgb2YgYSB0b2tlbiBpbiBzb21lIHdheSB0aGF0IHJlcXVpcmVzIGFuIDggYml0CisgICAgICogIHZhbHVlLCBzdWNoIGFzIHRoZSBrZXkgZm9yIGEgaGFzaHRhYmxlLiBUaGUgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSBhIHVzYWJsZSBzdHJpbmcgZXZlbgorICAgICAqICBpZiB0aGUgdGV4dCBnaXZlbiBhcyBpbnB1dCBoYXMgY2hhcmFjdGVycyB0aGF0IGRvIG5vdCBmaXQgaW4gOCBiaXQgc3BhY2UsIGl0IHdpbGwgcmVwbGFjZSB0aGVtCisgICAgICogIHdpdGggc29tZSBhcmJpdHJhcnkgY2hhcmFjdGVyIHN1Y2ggYXMgJz8nCisgICAgICovCisgICAgc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICoKKwkJCQkJKCp0bzgpCSAgICAoc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICogc3RyaW5nKTsKKworCS8vLyBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB5aWVsZHMgYSBVVDggZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGN1cnJlbnQgc3RyaW5nLAorCS8vLyByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IGVuY29kaW5nIG9mIHRoZSBzdHJpbmcuIEJlY2F1c2UgdGhlcmUgaXMgY3VycmVudGx5IG5vIFVURjgKKwkvLy8gaGFuZGxpbmcgaW4gdGhlIHN0cmluZyBjbGFzcywgaXQgY3JlYXRlcyB0aGVyZWZvcmUsIGEgc3RyaW5nIHRoYXQgaXMgdXNlZnVsIG9ubHkgZm9yIHJlYWQgb25seSAKKwkvLy8gYXBwbGljYXRpb25zIGFzIGl0IHdpbGwgbm90IGNvbnRhaW4gbWV0aG9kcyB0aGF0IGRlYWwgd2l0aCBVVEY4IGF0IHRoZSBtb21lbnQuCisJLy8vCisJc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICoKKwkJCQkJKCp0b1VURjgpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcpOworCQorfQorICAgIEFOVExSM19TVFJJTkc7CisKKy8qKiBEZWZpbml0aW9uIG9mIHRoZSBzdHJpbmcgZmFjdG9yeSBpbnRlcmZhY2UsIHdoaWNoIGNyZWF0ZXMgYW5kIHRyYWNrcworICogIHN0cmluZ3MgZm9yIHlvdSBvZiB2YXJpb3VzIHNoYXBlcyBhbmQgc2l6ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0CUFOVExSM19TVFJJTkdfRkFDVE9SWV9zdHJ1Y3QKK3sKKyAgICAvKiogTGlzdCBvZiBhbGwgdGhlIHN0cmluZ3MgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBmYWN0b3J5CisgICAgICovCisgICAgcEFOVExSM19WRUNUT1IgICAgc3RyaW5nczsKKworICAgIC8qIEluZGV4IG9mIG5leHQgc3RyaW5nIHRoYXQgd2UgYWxsb2NhdGUKKyAgICAgKi8KKyAgICBBTlRMUjNfVUlOVDMyICAgaW5kZXg7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IG1hbnVmYWN0dXJlcyBhbiBlbXB0eSBzdHJpbmcKKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORyAgKCpuZXdSYXcpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnkpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBtYW51ZmFjdHVyZXMgYSByYXcgc3RyaW5nIHdpdGggbm8gdGV4dCBpbiBpdCBidXQgc3BhY2UgZm9yIHNpemUKKyAgICAgKiAgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORyAgKCpuZXdTaXplKQkoc3RydWN0IEFOVExSM19TVFJJTkdfRkFDVE9SWV9zdHJ1Y3QgKiBmYWN0b3J5LCBBTlRMUjNfVUlOVDMyIHNpemUpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBtYW51ZmFjdHVyZXMgYSBzdHJpbmcgZnJvbSBhIGdpdmVuIHBvaW50ZXIgYW5kIGxlbmd0aC4gVGhlIHBvaW50ZXIgaXMgYXNzdW1lZAorICAgICAqICB0byBwb2ludCB0byBjaGFyYWN0ZXJzIGluIHRoZSBzYW1lIGVuY29kaW5nIGFzIHRoZSBzdHJpbmcgdHlwZSwgaGVuY2UgaWYgdGhpcyBpcyBhIFVURjE2IHN0cmluZyB0aGUKKyAgICAgKiAgcG9pbnRlciBzaG91bGQgcG9pbnQgdG8gVVRGMTYgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORyAgKCpuZXdQdHIpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHNpemUpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBtYW51ZmFjdHVyZXMgYSBzdHJpbmcgZnJvbSBhIGdpdmVuIHBvaW50ZXIgYW5kIGxlbmd0aC4gVGhlIHBvaW50ZXIgaXMgYXNzdW1lZCB0bworICAgICAqICBwb2ludCBhdCA4IGJpdCBjaGFyYWN0ZXJzIHdoaWNoIG11c3QgYmUgY29udmVydGVkIG9uIHRoZSBmbHkgdG8gdGhlIGVuY29kaW5nIG9mIHRoZSBhY3R1YWwgc3RyaW5nLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HICAoKm5ld1B0cjgpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHNpemUpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBtYW51ZmFjdHVyZXMgYSBzdHJpbmcgZnJvbSBhIGdpdmVuIHBvaW50ZXIgYW5kIHdvcmtzIG91dCB0aGUgbGVuZ3RoLiBUaGUgcG9pbnRlciBpcyAKKyAgICAgKiAgYXNzdW1lZCB0byBwb2ludCB0byBjaGFyYWN0ZXJzIGluIHRoZSBzYW1lIGVuY29kaW5nIGFzIHRoZSBzdHJpbmcgaXRzZWxmLCBpLmUuIFVURjE2IGlmIGEgVVRGMTYKKyAgICAgKiAgc3RyaW5nIGFuZCBzbyBvbi4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORyAgKCpuZXdTdHIpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggc3RyaW5nKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgbWFudWZhY3R1cmVzIGEgc3RyaW5nIGZyb20gYSBnaXZlbiBwb2ludGVyIGFuZCBsZW5ndGguIFRoZSBwb2ludGVyIHNob3VsZAorICAgICAqICBwb2ludCB0byA4IGJpdCBjaGFyYWN0ZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBlbmNvZGluZyBvZiB0aGUgc3RyaW5nLiBUaGUgOCBiaXQgY2hhcmFjdGVycworICAgICAqICB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgYWN0dWFsIHN0cmluZyBlbmNvZGluZyBvbiB0aGUgZmx5LgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HICAoKm5ld1N0cjgpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggc3RyaW5nKTsKKworICAgIC8qKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgZGVsZXRlcyB0aGUgc3RyaW5nIGFsdG9nZXRoZXIKKyAgICAgKi8KKyAgICB2b2lkCSAgICAoKmRlc3Ryb3kpCShzdHJ1Y3QgQU5UTFIzX1NUUklOR19GQUNUT1JZX3N0cnVjdCAqIGZhY3RvcnksIHBBTlRMUjNfU1RSSU5HIHN0cmluZyk7CisKKyAgICAvKiogUG9pbnRlciB0byBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgaW4gcHJpbnRhYmxlIGZvcm0gd2l0aG91dCBhbnkgY29udHJvbAorICAgICAqICBjaGFyYWN0ZXJzIGluIGl0LgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HICAoKnByaW50YWJsZSkoc3RydWN0IEFOVExSM19TVFJJTkdfRkFDVE9SWV9zdHJ1Y3QgKiBmYWN0b3J5LCBwQU5UTFIzX1NUUklORyBzdHJpbmcpOworCisgICAgLyoqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBjbG9zZXMgdGhlIGZhY3RvcnkKKyAgICAgKi8KKyAgICB2b2lkCSAgICAoKmNsb3NlKQkoc3RydWN0IEFOVExSM19TVFJJTkdfRkFDVE9SWV9zdHJ1Y3QgKiBmYWN0b3J5KTsKKworfQorICAgIEFOVExSM19TVFJJTkdfRkFDVE9SWTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjN0b2tlbnN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvQy9pbmNsdWRlL2FudGxyM3Rva2Vuc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMzdhZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjN0b2tlbnN0cmVhbS5oCkBAIC0wLDAgKzEsMzAzIEBACisvKiogXGZpbGUKKyAqIERlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgYW4gQU5UTFIzIGNvbW1vbiB0b2tlbiBzdHJlYW0uIEN1c3RvbSB0b2tlbiBzdHJlYW1zIHNob3VsZCBjcmVhdGUKKyAqIG9uZSBvZiB0aGVzZSBhbmQgdGhlbiBvdmVycmlkZSBhbnkgZnVuY3Rpb25zIGJ5IGluc3RhbGxpbmcgdGhlaXIgb3duIHBvaW50ZXJzCisgKiB0byBpbXBsZW1lbnQgdGhlIHZhcmlvdXMgZnVuY3Rpb25zLgorICovCisjaWZuZGVmCV9BTlRMUjNfVE9LRU5TVFJFQU1fSAorI2RlZmluZQlfQU5UTFIzX1RPS0VOU1RSRUFNX0gKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzZGVmcy5oPgorI2luY2x1ZGUgICAgPGFudGxyM3N0cmluZy5oPgorI2luY2x1ZGUgICAgPGFudGxyM2NvbGxlY3Rpb25zLmg+CisjaW5jbHVkZSAgICA8YW50bHIzaW5wdXQuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250b2tlbi5oPgorI2luY2x1ZGUgICAgPGFudGxyM2JpdHNldC5oPgorI2luY2x1ZGUJPGFudGxyM2RlYnVnZXZlbnRsaXN0ZW5lci5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBEZWZpbml0aW9uIG9mIGEgdG9rZW4gc291cmNlLCB3aGljaCBoYXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCAKKyAqICByZXR1cm5zIHRoZSBuZXh0IHRva2VuICh1c2luZyBhIHRva2VuIGZhY3RvcnkgaWYgaXQgaXMgZ29pbmcgdG8gYmUKKyAqICBlZmZpY2llbnQpIGFuZCBhIHBvaW50ZXIgdG8gYW4gQU5UTFIzX0lOUFVUX1NUUkVBTS4gVGhpcyBpcyBzbGlnaHRseQorICogIGRpZmZlcmVudCB0byB0aGUgSmF2YSBpbnRlcmZhY2UgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBpbXBsZW1lbnQKKyAqICBtdWx0aXBsZSBpbnRlcmZhY2VzIHdpdGhvdXQgZGVmaW5pbmcgdGhlbSBpbiB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZQorICogIG9yIGNhc3RpbmcgKHZvaWQgKiksIHdoaWNoIGlzIHRvbyBjb252b2x1dGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBBTlRMUjNfVE9LRU5fU09VUkNFX3N0cnVjdAoreworICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0uIAorICAgICAqLworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgICgqbmV4dFRva2VuKShzdHJ1Y3QgQU5UTFIzX1RPS0VOX1NPVVJDRV9zdHJ1Y3QgKiB0b2tlblNvdXJjZSk7CisKKyAgICAvKiogV2hvZXZlciBpcyBwcm92aWRpbmcgdG9rZW5zLCBuZWVkcyB0byBwcm92aWRlIGEgc3RyaW5nIGZhY3RvcnkgdG9vCisgICAgICovCisgICAgcEFOVExSM19TVFJJTkdfRkFDVE9SWSAgc3RyRmFjdG9yeTsKKworICAgIC8qKiBBIHNwZWNpYWwgcHJlLWFsbG9jYXRlZCB0b2tlbiwgd2hpY2ggc2lnbmlmaWVzIEVuZCBPZiBUb2tlbnMuIEJlY2F1c2UgdGhpcyBtdXN0CisgICAgICogIGJlIHNldCB1cCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IGluZGV4IGFuZCBzbyBvbiwgd2UgZW1iZWQgdGhlIHN0cnVjdHVyZSBhbmQgCisgICAgICogIHJldHVybiB0aGUgYWRkcmVzcyBvZiBpdC4gSXQgaXMgbWFya2VkIGFzIGZhY3RvcnlNYWRlLCBzbyB0aGF0IGl0IGlzIG5ldmVyCisgICAgICogIGF0dGVtcHRlZCB0byBiZSBmcmVlZC4KKyAgICAgKi8KKyAgICBBTlRMUjNfQ09NTU9OX1RPS0VOCSAgICBlb2ZUb2tlbjsKKworCS8vLyBBIHNwZWNpYWwgcHJlLWFsbG9jYXRlZCB0b2tlbiwgd2hpY2ggaXMgcmV0dXJuZWQgYnkgbVRva2VucygpIGlmIHRoZQorCS8vLyBsZXhlciBydWxlIHNhaWQgdG8ganVzdCBza2lwIHRoZSBnZW5lcmF0ZWQgdG9rZW4gYWx0b2dldGhlci4KKwkvLy8gSGF2aW5nIHRoaXMgc2luZ2xlIHRva2VuIHN0b3BzIHVzIHdhc3RpbmcgbWVtb3J5IGJ5IGhhdmUgdGhlIHRva2VuIGZhY3RvcnkKKwkvLy8gYWN0dWFsbHkgY3JlYXRlIHNvbWV0aGluZyB0aGF0IHdlIGFyZSBnb2luZyB0byBTS0lQKCk7IGFueXdheS4KKwkvLy8KKwlBTlRMUjNfQ09NTU9OX1RPS0VOCQlza2lwVG9rZW47CisKKyAgICAvKiogV2hhdGV2ZXIgaXMgc3VwcGx5aW5nIHRoZSB0b2tlbiBzb3VyY2UgaW50ZXJmYWNlLCBuZWVkcyBhIHBvaW50ZXIgdG8gCisgICAgICogIGl0c2VsZiBzbyB0aGF0IHRoaXMgcG9pbnRlciBjYW4gYmUgcGFzc2VkIHRvIGl0IHdoZW4gdGhlIG5leHRUb2tlbgorICAgICAqICBmdW5jdGlvbiBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZAkJICAgICogc3VwZXI7CisKKyAgICAvKiogV2hlbiB0aGUgdG9rZW4gc291cmNlIGlzIGNvbnN0cnVjdGVkLCBpdCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgZmlsZQorICAgICAqICBuYW1lIGZyb20gd2hlbmNlIHRoZSB0b2tlbnMgd2VyZSBwcm9kdWNlZCBieSB0aGUgbGV4ZXIuIFRoaXMgcG9pbnRlciBpcyBhCisgICAgICogIGNvcHkgb2YgdGhlIG9uZSBzdXBwbGllZCBieSB0aGUgQ2hhclN0cmVhbSAoYW5kIG1heSBiZSBOVUxMKSBzbyBzaG91bGQKKyAgICAgKiAgbm90IGJlIG1hbmlwdWxhdGVkIG90aGVyIHRoYW4gdG8gY29weSBvciBwcmludCBpdC4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORwkgICAgZmlsZU5hbWU7Cit9CisgICAgQU5UTFIzX1RPS0VOX1NPVVJDRTsKKworLyoqIERlZmluaXRpb24gb2YgdGhlIEFOVExSMyBjb21tb24gdG9rZW4gc3RyZWFtIGludGVyZmFjZS4KKyAqIFxyZW1hcmsKKyAqIE11Y2ggb2YgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGlzIHN0b2xlbiBmcm9tIFRlcidzIEphdmEgaW1wbGVtZW50YXRpb24uCisgKi8KK3R5cGVkZWYJc3RydWN0IEFOVExSM19UT0tFTl9TVFJFQU1fc3RydWN0Cit7CisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIHRva2VuIHNvdXJjZSBmb3IgdGhpcyBzdHJlYW0KKyAgICAgKi8KKyAgICBwQU5UTFIzX1RPS0VOX1NPVVJDRSAgICB0b2tlblNvdXJjZTsKKworICAgIC8qKiBXaGF0ZXZlciBpcyBwcm92aWRpbmcgdGhpcyBpbnRlcmZhY2UgbmVlZHMgYSBwb2ludGVyIHRvIGl0c2VsZgorICAgICAqICBzbyB0aGF0IHRoaXMgY2FuIGJlIHBhc3NlZCBiYWNrIHRvIGl0IHdoZW5ldmVyIHRoZSBhcGkgZnVuY3Rpb25zCisgICAgICogIGFyZSBjYWxsZWQuCisgICAgICovCisgICAgdm9pZAkgICAgICAqIHN1cGVyOworCisgICAgLyoqIEFsbCBpbnB1dCBzdHJlYW1zIGltcGxlbWVudCB0aGUgQU5UTFIzX0lOVF9TVFJFQU0gaW50ZXJmYWNlLi4uCisgICAgICovCisgICAgcEFOVExSM19JTlRfU1RSRUFNCSAgICBpc3RyZWFtOworCisJLy8vIERlYnVnZ2VyIGludGVyZmFjZSwgaXMgdGhpcyBpcyBhIGRlYnVnZ2luZyB0b2tlbiBzdHJlYW0KKwkvLy8KKwlwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSCQlkZWJ1Z2dlcjsKKworCS8vLyBJbmRpY2F0ZXMgdGhlIGluaXRpYWwgc3RyZWFtIHN0YXRlIGZvciBkYmdDb25zdW1lKCkKKwkvLy8KKwlBTlRMUjNfQk9PTEVBTgkJCWluaXRpYWxTdHJlYW1TdGF0ZTsKKworICAgIC8qKiBHZXQgVG9rZW4gYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBUb2tlbi4KKyAgICAgKiAgaTwwIGluZGljYXRlcyB0b2tlbnMgaW4gdGhlIHBhc3QuICBTbyAtMSBpcyBwcmV2aW91cyB0b2tlbiBhbmQgLTIgaXMKKyAgICAgKiAgdHdvIHRva2VucyBhZ28uIExUKDApIGlzIHVuZGVmaW5lZC4gIEZvciBpPj1uLCByZXR1cm4gVG9rZW4uRU9GVG9rZW4uCisgICAgICogIFJldHVybiBudWxsIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgICAgICogIHRoYXQgaXMgbmVnYXRpdmUuCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgKCpfTFQpCQkoc3RydWN0IEFOVExSM19UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIEFOVExSM19JTlQzMiBrKTsKKworICAgIC8qKiBHZXQgYSB0b2tlbiBhdCBhbiBhYnNvbHV0ZSBpbmRleCBpOyAwLi5uLTEuICBUaGlzIGlzIHJlYWxseSBvbmx5CisgICAgICogIG5lZWRlZCBmb3IgcHJvZmlsaW5nIGFuZCBkZWJ1Z2dpbmcgYW5kIHRva2VuIHN0cmVhbSByZXdyaXRpbmcuCisgICAgICogIElmIHlvdSBkb24ndCB3YW50IHRvIGJ1ZmZlciB1cCB0b2tlbnMsIHRoZW4gdGhpcyBtZXRob2QgbWFrZXMgbm8KKyAgICAgKiAgc2Vuc2UgZm9yIHlvdS4gIE5hdHVyYWxseSB5b3UgY2FuJ3QgdXNlIHRoZSByZXdyaXRlIHN0cmVhbSBmZWF0dXJlLgorICAgICAqICBJIGJlbGlldmUgRGVidWdUb2tlblN0cmVhbSBjYW4gZWFzaWx5IGJlIGFsdGVyZWQgdG8gbm90IHVzZQorICAgICAqICB0aGlzIG1ldGhvZCwgcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kuCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgKCpnZXQpCQkoc3RydWN0IEFOVExSM19UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIEFOVExSM19VSU5UMzIgaSk7CisKKyAgICAvKiogV2hlcmUgaXMgdGhpcyBzdHJlYW0gcHVsbGluZyB0b2tlbnMgZnJvbT8gIFRoaXMgaXMgbm90IHRoZSBuYW1lLCBidXQKKyAgICAgKiAgYSBwb2ludGVyIGludG8gYW4gaW50ZXJmYWNlIHRoYXQgY29udGFpbnMgYSBBTlRMUjNfVE9LRU5fU09VUkNFIGludGVyZmFjZS4KKyAgICAgKiAgVGhlIFRva2VuIFNvdXJjZSBpbnRlcmZhY2UgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBzdHJlYW0gYW5kIGEgcG9pbnRlcgorICAgICAqICB0byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCB0b2tlbi4KKyAgICAgKi8KKyAgICBwQU5UTFIzX1RPS0VOX1NPVVJDRSAgICAoKmdldFRva2VuU291cmNlKQkoc3RydWN0IEFOVExSM19UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0pOworCisgICAgLyoqIEZ1bmN0aW9uIHRoYXQgaW5zdGFsbHMgYSB0b2tlbiBzb3VyY2UgZm9yIHRlaCBzdHJlYW0KKyAgICAgKi8KKyAgICB2b2lkCQkgICAgKCpzZXRUb2tlblNvdXJjZSkJKHN0cnVjdCBBTlRMUjNfVE9LRU5fU1RSRUFNX3N0cnVjdCAqIHRva2VuU3RyZWFtLAorCQkJCQkJIHBBTlRMUjNfVE9LRU5fU09VUkNFCQkgICB0b2tlblNvdXJjZSk7CisKKyAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0aGUgdG9rZW5zIGluIHRoZSBzdHJlYW0sIGFzIHRoZSBvbGQgdHJhbXAgaW4gCisgICAgICogIExlZWRzIG1hcmtldCB1c2VkIHRvIHNheTsgIkdldCB0aGUgbG90ISIKKyAgICAgKi8KKyAgICBwQU5UTFIzX1NUUklORwkgICAgKCp0b1N0cmluZykJCShzdHJ1Y3QgQU5UTFIzX1RPS0VOX1NUUkVBTV9zdHJ1Y3QgKiB0b2tlblN0cmVhbSk7CisKKyAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgICAgICogIElmIHRoZSBzdHJlYW0gZG9lcyBub3QgYnVmZmVyIGFsbCB0aGUgdG9rZW5zIHRoZW4gaXQgY2FuIGp1c3QKKyAgICAgKiAgcmV0dXJuIGFuIGVtcHR5IEFOVExSM19TVFJJTkcgb3IgTlVMTDsgIEdyYW1tYXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorICAgICAqICBhbiBhY3Rpb24gaW4gdGhhdCBjYXNlLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HCSAgICAoKnRvU3RyaW5nU1MpCShzdHJ1Y3QgQU5UTFIzX1RPS0VOX1NUUkVBTV9zdHJ1Y3QgKiB0b2tlblN0cmVhbSwgQU5UTFIzX1VJTlQzMiBzdGFydCwgQU5UTFIzX1VJTlQzMiBzdG9wKTsKKworICAgIC8qKiBCZWNhdXNlIHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UgYSB0b2tlbiB3aXRoIGFuIGluZGV4IHN0b3JlZAorICAgICAqICBpbiBpdCwgd2UgbXVzdCBwcm92aWRlIGEgbWVhbnMgZm9yIHR3byB0b2tlbiBvYmplY3RzIHRoZW1zZWx2ZXMgdG8KKyAgICAgKiAgaW5kaWNhdGUgdGhlIHN0YXJ0L2VuZCBsb2NhdGlvbi4gIE1vc3Qgb2Z0ZW4gdGhpcyB3aWxsIGp1c3QgZGVsZWdhdGUKKyAgICAgKiAgdG8gdGhlIG90aGVyIHRvU3RyaW5nKGludCxpbnQpLiAgVGhpcyBpcyBhbHNvIHBhcmFsbGVsIHdpdGgKKyAgICAgKiAgdGhlIHBUUkVFTk9ERV9TVFJFQU0tPnRvU3RyaW5nKE9iamVjdCxPYmplY3QpLgorICAgICAqLworICAgIHBBTlRMUjNfU1RSSU5HCSAgICAoKnRvU3RyaW5nVFQpCShzdHJ1Y3QgQU5UTFIzX1RPS0VOX1NUUkVBTV9zdHJ1Y3QgKiB0b2tlblN0cmVhbSwgcEFOVExSM19DT01NT05fVE9LRU4gc3RhcnQsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0b3ApOworCisKKyAgICAvKiogRnVuY3Rpb24gdGhhdCBzZXRzIHRoZSB0b2tlbiBzdHJlYW0gaW50byBkZWJ1Z2dpbmcgbW9kZQorICAgICAqLworICAgIHZvaWQJCSAgICAoKnNldERlYnVnTGlzdGVuZXIpCSAgICAoc3RydWN0IEFOVExSM19UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVidWdnZXIpOworCisKKworICAgIC8qKiBGdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBmcmVlIHRoZSBtZW1vcnkgZm9yIGFuIEFOVExSM19UT0tFTl9TVFJFQU0KKyAgICAgKi8KKyAgICB2b2lkCQkgICAgKCpmcmVlKQkJKHN0cnVjdCBBTlRMUjNfVE9LRU5fU1RSRUFNX3N0cnVjdCAqIHRva2VuU3RyZWFtKTsKK30KKyAgICBBTlRMUjNfVE9LRU5fU1RSRUFNOworCisvKiogQ29tbW9uIHRva2VuIHN0cmVhbSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBBTlRMUl9UT0tFTl9TVFJFQU0gZm9yIHRoZSBkZWZhdWx0CisgKiAgcGFyc2VycyBhbmQgcmVjb2duaXplcnMuIFlvdSBtYXkgb2YgY291cnNlIGJ1aWxkIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIGlmCisgKiAgeW91IGFyZSBzbyBpbmNsaW5lZC4KKyAqLwordHlwZWRlZglzdHJ1Y3QJQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0Cit7CisgICAgLyoqIFRoZSBBTlRMUjNfVE9LRU5fU1RSRUFNIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBpbmNsdWRlcworICAgICAqICB0aGUgaW50c3RyZWFtIGltcGxlbWVudGF0aW9uLiBXZSBjb3VsZCBkdXBsaWNhdGUgdGhlIHBBTlRMUl9JTlRfU1RSRUFNCisgICAgICogIGluIHRoaXMgaW50ZXJmYWNlIGFuZCBpbml0aWFsaXplIGl0IHRvIGEgY29weSwgYnV0IHRoaXMgY291bGQgYmUgY29uZnVzaW5nCisgICAgICogIGl0IGp1c3QgcmVzdWx0cyBpbiBvbmUgbW9yZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbmQgSSB0aGluayB0aGF0IHdpdGgKKyAgICAgKiAganVkaWNpYWwgdXNlIG9mICdjb25zdCcgbGF0ZXIsIHRoZSBvcHRpbWl6ZXIgd2lsbCBkbyBkZWNlbnQgam9iLgorICAgICAqLworICAgIHBBTlRMUjNfVE9LRU5fU1RSRUFNICAgIHRzdHJlYW07CisKKyAgICAvKiogV2hhdGV2ZXIgaXMgc3VwcGx5aW5nIHRoZSBDT01NT05fVE9LRU5fU1RSRUFNIG5lZWRzIGEgcG9pbnRlciB0byBpdHNlbGYKKyAgICAgKiAgc28gdGhhdCB0aGlzIGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgb2YgdGhlIEFQSSBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cy4KKyAgICAgKi8KKyAgICB2b2lkCQkgICAgKiBzdXBlcjsKKworICAgIC8qKiBSZWNvcmRzIGV2ZXJ5IHNpbmdsZSB0b2tlbiBwdWxsZWQgZnJvbSB0aGUgc291cmNlIGluZGV4ZWQgYnkgdGhlIHRva2VuIGluZGV4LgorICAgICAqICBUaGVyZSBtaWdodCBiZSBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGRvIHRoaXMsIHN1Y2ggYXMgcmVmZXJlbmNpbmcgZGlyZWN0bHkgaW4gdG8KKyAgICAgKiAgdGhlIHRva2VuIGZhY3RvcnkgcG9vbHMsIGJ1dCBmb3Igbm93IHRoaXMgaXMgY29udmVuaWVudCBhbmQgdGhlIEFOVExSM19MSVNUIGlzIG5vdAorICAgICAqICBhIGh1Z2Ugb3ZlcmhlYWQgYXMgaXQgb25seSBzdG9yZXMgcG9pbnRlcnMgYW55d2F5LCBidXQgYWxsb3dzIGZvciBpdGVyYXRpb25zIGFuZCAKKyAgICAgKiAgc28gb24uCisgICAgICovCisgICAgcEFOVExSM19WRUNUT1IJICAgIHRva2VuczsKKworICAgIC8qKiBPdmVycmlkZSBtYXAgb2YgdG9rZW5zLiBJZiBhIHRva2VuIHR5cGUgaGFzIGFuIGVudHJ5IGluIGhlcmUsIHRoZW4KKyAgICAgKiAgdGhlIHBvaW50ZXIgaW4gdGhlIHRhYmxlIHBvaW50cyB0byBhbiBpbnQsIGJlaW5nIHRoZSBvdmVycmlkZSBjaGFubmVsIG51bWJlcgorICAgICAqICB0aGF0IHNob3VsZCBhbHdheXMgYmUgdXNlZCBmb3IgdGhpcyB0b2tlbiB0eXBlLgorICAgICAqLworICAgIHBBTlRMUjNfTElTVAkgICAgY2hhbm5lbE92ZXJyaWRlczsKKworICAgIC8qKiBEaXNjYXJlZCBzZXQuIElmIGEgdG9rZW4gaGFzIGFuIGVudHJ5IGluIHRoaXMgdGFibGUsIHRoZW4gaXQgaXMgdGhyb3duCisgICAgICogIGF3YXkgKGRhdGEgcG9pbnRlciBpcyBhbHdheXMgTlVMTCkuCisgICAgICovCisgICAgcEFOVExSM19MSVNUCSAgICBkaXNjYXJkU2V0OworCisgICAgLyogVGhlIGNoYW5uZWwgbnVtYmVyIHRoYXQgdGhpcyB0b2tlbiBzdHJlYW0gaXMgdHVuZWQgdG8uIEZvciBpbnN0YW5jZSwgd2hpdGVzcGFjZQorICAgICAqIGlzIHVzdWFsbHkgdHVuZWQgdG8gY2hhbm5lbCA5OSwgd2hpY2ggbm8gdG9rZW4gc3RyZWFtIHdvdWxkIG5vcm1hbGx5IHR1bmUgdG8gYW5kCisgICAgICogc28gaXQgaXMgdGhyb3duIGF3YXkuCisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMgkgICAgY2hhbm5lbDsKKworICAgIC8qKiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIEFOVExSM19UUlVFLCB0aGVuIHRva2VucyB0aGF0IHRoZSBzdHJlYW0gc2VlcyB0aGF0IGFyZSBub3QKKyAgICAgKiAgaW4gdGhlIGNoYW5uZWwgdGhhdCB0aGlzIHN0cmVhbSBpcyB0dW5lZCB0bywgYXJlIG5vdCB0cmFja2VkIGluIHRoZQorICAgICAqICB0b2tlbnMgdGFibGUuIFdoZW4gc2V0IHRvIGZhbHNlLCBBTEwgdG9rZW5zIGFyZSBhZGRlZCB0byB0aGUgdHJhY2tpbmcuCisgICAgICovCisgICAgQU5UTFIzX0JPT0xFQU4JICAgIGRpc2NhcmRPZmZDaGFubmVsOworCisgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAodGhlIG5leHQgb25lIHRoYXQgd2lsbCBiZQorICAgICAqICBjb25zdW1lZC4gcCA9IC0xIGluZGljYXRlcyB0aGF0IHRoZSB0b2tlbiBsaXN0IGlzIGVtcHR5LgorICAgICAqLworICAgIEFOVExSM19JTlQzMgkgICAgcDsKKworICAgIC8qKiBBIHNpbXBsZSBmaWx0ZXIgbWVjaGFuaXNtIHdoZXJlYnkgeW91IGNhbiB0ZWxsIHRoaXMgdG9rZW4gc3RyZWFtCisgICAgICogIHRvIGZvcmNlIGFsbCB0b2tlbnMgb2YgdHlwZSB0dHlwZSB0byBiZSBvbiBjaGFubmVsLiAgRm9yIGV4YW1wbGUsCisgICAgICogIHdoZW4gaW50ZXJwcmV0aW5nLCB3ZSBjYW5ub3QgZXhlYyBhY3Rpb25zIHNvIHdlIG5lZWQgdG8gdGVsbAorICAgICAqICB0aGUgc3RyZWFtIHRvIGZvcmNlIGFsbCBXUyBhbmQgTkVXTElORSB0byBiZSBhIGRpZmZlcmVudCwgaWdub3JlZAorICAgICAqICBjaGFubmVsLgorICAgICAqLworICAgIHZvaWQJCSAgICAoKnNldFRva2VuVHlwZUNoYW5uZWwpICAoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNX3N0cnVjdCAqIHRva2VuU3RyZWFtLCAKKwkJCQkJCQlBTlRMUjNfVUlOVDMyIHR0eXBlLCBBTlRMUjNfVUlOVDMyIGNoYW5uZWwpOworCisgICAgLyoqIEFkZCBhIHBhcnRpY3VsYXIgdG9rZW4gdHlwZSB0byB0aGUgZGlzY2FyZCBzZXQuIElmIGEgdG9rZW4gaXMgZm91bmQgdG8gYmVsb25nIAorICAgICAqICB0byB0aGlzIHNldCwgdGhlbiBpdCBpcyBza2lwcGVkL3Rocm93biBhd2F5CisgICAgICovCisgICAgdm9pZAkJICAgICgqZGlzY2FyZFRva2VuVHlwZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIEFOVExSM19JTlQzMiB0dHlwZSk7CisKKyAgICAvKiogU2lnbmFsIHRvIGRpc2NhcmQgb2ZmIGNoYW5uZWwgdG9rZW5zIGZyb20gaGVyZSBvbiBpbi4KKyAgICAgKi8KKyAgICB2b2lkCQkgICAgKCpkaXNjYXJkT2ZmQ2hhbm5lbFRva3MpKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTV9zdHJ1Y3QgKiB0b2tlblN0cmVhbSwgQU5UTFIzX0JPT0xFQU4gZGlzY2FyZCk7CisKKyAgICAvKiogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQU5UTFIzX0xJU1Qgb2YgYWxsIHRva2VucworICAgICAqICBpbiB0aGUgc3RyZWFtICh0aGlzIGNhdXNlcyB0aGUgYnVmZmVyIHRvIGZpbGwgaWYgd2UgaGF2ZSBub3QgZ2V0IGFueSB5ZXQpCisgICAgICovCisgICAgcEFOVExSM19WRUNUT1IJICAgICgqZ2V0VG9rZW5zKQkgICAgKHN0cnVjdCBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTV9zdHJ1Y3QgKiB0b2tlblN0cmVhbSk7CisKKyAgICAvKiogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFsbCB0aGUgdG9rZW5zIGJldHdlZW4gYSBzdGFydCBhbmQgYSBzdG9wIGluZGV4LgorICAgICAqICBUT0RPOiBUaGlzIGlzIGEgbmV3IGxpc3QgKEFjayEgTWF5YmUgdGhpcyBpcyBhIHJlYXNvbiB0byBoYXZlIGZhY3RvcmllcyBmb3IgTElTVFMgYW5kIEhBU0hUQUJMRVMgZXRjIDotKCBjb21lIGJhY2sgdG8gdGhpcykKKyAgICAgKi8KKyAgICBwQU5UTFIzX0xJU1QJICAgICgqZ2V0VG9rZW5SYW5nZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIEFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCk7CisKKyAgICAvKiogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFsbCB0aGUgdG9rZW5zIGluZGljYXRlZCBieSB0aGUgc3BlY2lmaWVkIGJpdHNldCwgd2l0aGluIGEgcmFuZ2Ugb2YgdG9rZW5zCisgICAgICovCisgICAgcEFOVExSM19MSVNUCSAgICAoKmdldFRva2Vuc1NldCkJICAgIChzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIAorCQkJCQkJCUFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCwgcEFOVExSM19CSVRTRVQgdHlwZXMpOworICAgIAorICAgIC8qKiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYWxsIHRoZSB0b2tlbnMgaW5kaWNhdGVkIGJ5IGJlaW5nIGEgbWVtYmVyIG9mIHRoZSBzdXBwbGllZCBMaXN0CisgICAgICovCisgICAgcEFOVExSM19MSVNUCSAgICAoKmdldFRva2Vuc0xpc3QpCSAgICAoc3RydWN0IEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNX3N0cnVjdCAqIHRva2VuU3RyZWFtLCAKKwkJCQkJCQlBTlRMUjNfVUlOVDMyIHN0YXJ0LCBBTlRMUjNfVUlOVDMyIHN0b3AsIHBBTlRMUjNfTElTVCBsaXN0KTsKKworICAgIC8qKiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYWxsIHRva2VucyBvZiBhIGNlcnRhaW4gdHlwZSB3aXRoaW4gYSByYW5nZS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0xJU1QJICAgICgqZ2V0VG9rZW5zVHlwZSkJICAgIChzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0sIAorCQkJCQkJCUFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCwgQU5UTFIzX1VJTlQzMiB0eXBlKTsKKworICAgIC8qKiBGdW5jdGlvbiB0aGF0IHJlc2V0cyB0aGUgdG9rZW4gc3RyZWFtIHNvIHRoYXQgaXQgY2FuIGJlIHJldXNlZCwgYnV0CisgICAgICogIGJ1dCB0aGF0IGRvZXMgbm90IGZyZWUgdXAgYW55IHJlc291cmNlcywgc3VjaCBhcyB0aGUgdG9rZW4gZmFjdG9yeQorICAgICAqICB0aGUgZmFjdG9yeSBwb29sIGFuZCBzbyBvbi4gVGhpcyBwcmV2ZW50cyB0aGUgbmVlZCB0byBrZWVwIGZyZWVpbmcKKyAgICAgKiAgYW5kIHJlYWxsb2NhdGluZyB0aGUgdG9rZW4gcG9vbHMgaWYgdGhlIHRoaW5nIHlvdSBhcmUgYnVpbGRpbmcgaXMKKyAgICAgKiAgYSBtdWx0aS1zaG90IGRhbWVvbiBvciBzb21ldGhpZ24gbGlrZSB0aGF0LiBJdCBpcyBtdWNoIGZhc3RlciB0bworICAgICAqICBqdXN0IHJldXNlIGFsbCB0aGUgdmVjdG9ycy4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnJlc2V0KSAgICAgICAgICAgIChzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0pOworCisgICAgLyoqIEZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIGZyZWUgYW4gQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0KKyAgICAgKi8KKyAgICB2b2lkCQkgICAgKCpmcmVlKQkJICAgIChzdHJ1Y3QgQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU1fc3RydWN0ICogdG9rZW5TdHJlYW0pOworfQorICAgIEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvaW5jbHVkZS9hbnRscjN0cmVlcGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzdHJlZXBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTBlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL2luY2x1ZGUvYW50bHIzdHJlZXBhcnNlci5oCkBAIC0wLDAgKzEsODEgQEAKKyNpZm5kZWYJQU5UTFIzVFJFRVBBUlNFUl9ICisjZGVmaW5lCUFOVExSM1RSRUVQQVJTRVJfSAorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjNkZWZzLmg+CisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXJlY29nbml6ZXIuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjb21tb250cmVlbm9kZXN0cmVhbS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGFuIGVsZW1lbnQgaW4gYSBoYXNoIGJ1Y2tldC4KKyAqICBTdG9yZXMgdGhlIG9yaWdpbmFsIGtleSBzbyB0aGF0IGR1cGxpY2F0ZSBrZXlzIGNhbiBiZSByZWplY3RlZAorICogIGlmIG5lY2Vzc2FyeSwgYW5kIGNvbnRhaW5zIGZ1bmN0aW9uIGNhbiBiZSBzdXBwb3J0ZWQgSWYgdGhlIGhhc2gga2V5CisgKiAgY291bGQgYmUgdW5pcXVlIEkgd291bGQgaGF2ZSBpbnZlbnRlZCB0aGUgcGVyZmVjdCBjb21wcmVzc2lvbiBhbGdvcml0aG0gOy0pCisgKi8KK3R5cGVkZWYJc3RydWN0CUFOVExSM19UUkVFX1BBUlNFUl9zdHJ1Y3QKK3sKKyAgICAvKiogUG9pbnRlciB0byBhbnkgc3VwZXIgY2xhc3MKKyAgICAgKi8KKyAgICB2b2lkICAgICogc3VwZXI7CisKKyAgICAvKiogQSBwb2ludGVyIHRvIHRoZSBiYXNlIHJlY29nbml6ZXIsIHdoZXJlIG1vc3Qgb2YgdGhlIHBhcnNlciBmdW5jdGlvbnMgYWN0dWFsbHkKKyAgICAgKiAgbGl2ZSBiZWNhdXNlIHRoZXkgYXJlIHNoYXJlZCBiZXR3ZWVuIHBhcnNlciBhbmQgdHJlZSBwYXJzZXIgYW5kIHRoaXMgaXMgdGhlCisgICAgICogIGVhc2llciB3YXkgdGhhbiBjb3B5aW5nIHRoZSBpbnRlcmZhY2UgYWxsIG92ZXIgdGhlIHBsYWNlLiBNYWNyb3MgaGlkZSB0aGlzCisgICAgICogIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUgc28gaXQgaXMgZWFzaWVyIG9uIHRoZSBleWUgKHRob3VnaCBub3QgdGhlIGRlYnVnZ2VyIDstKS4KKyAgICAgKi8KKyAgICBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUgkJcmVjOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiB0cmVlIG5vZGUgc3RyZWFtIGZvciB0aGUgcGFyc2VyCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTQljdG5zdHJlYW07CisKKyAgICAvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJlc2V0IHRoZSBwYXJzZXIKKyAgICAgKi8KKyAgICB2b2lkCQkJICAgICgqc2V0VHJlZU5vZGVTdHJlYW0pICAgIChzdHJ1Y3QgQU5UTFIzX1RSRUVfUEFSU0VSX3N0cnVjdCAqIHBhcnNlciwgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBpbnB1dCk7CisKKyAgICAvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSAoKmdldFRyZWVOb2RlU3RyZWFtKSAgICAoc3RydWN0IEFOVExSM19UUkVFX1BBUlNFUl9zdHJ1Y3QgKiBwYXJzZXIpOworICAgIAorICAgIC8qKiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gZnJlZSByZXNvdXJjZXMgb2YgYW4gQU5UTFIzIHRyZWUgcGFyc2VyLgorICAgICAqLworICAgIHZvaWQJCQkgICAgKCpmcmVlKQkJICAgIChzdHJ1Y3QgQU5UTFIzX1RSRUVfUEFSU0VSX3N0cnVjdCAqIHBhcnNlcik7Cit9CisgICAgQU5UTFIzX1RSRUVfUEFSU0VSOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvbTQvZHVtbXkgYi9hbnRsci0zLjQvcnVudGltZS9DL200L2R1bW15Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMWQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL200L2R1bW15CkBAIC0wLDAgKzEgQEAKK0hlcmUgdG8gbWFrZSBzdXJlIGF1dG9jb25mIGRvZXMgbm90IHNjcmV3IHVwCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNiYXNlcmVjb2duaXplci5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzYmFzZXJlY29nbml6ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVjY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzYmFzZXJlY29nbml6ZXIuYwpAQCAtMCwwICsxLDIyMzUgQEAKKy8qKiBcZmlsZQorICogQ29udGFpbnMgdGhlIGJhc2UgZnVuY3Rpb25zIHRoYXQgYWxsIHJlY29nbml6ZXJzIHJlcXVpcmUuCisgKiBBbnkgZnVuY3Rpb24gY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBsZXhlci9wYXJzZXIvdHJlZSBwYXJzZXIgb3IgYnkgdGhlCisgKiBBTlRMUjMgcHJvZ3JhbW1lci4KKyAqIAorICogXGFkZHRvZ3JvdXAgcEFOVExSM19CQVNFX1JFQ09HTklaRVIKKyAqIEB7CisgKi8KKyNpbmNsdWRlICAgIDxhbnRscjNiYXNlcmVjb2duaXplci5oPgorCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZmRlZglBTlRMUjNfV0lORE9XUworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApCisjZW5kaWYKKworLyogSW50ZXJmYWNlIGZ1bmN0aW9ucyAtc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIGNvdmVyIHBhcnNlciBhbmQgdHJlZXBhcnNlcgorICogYWxtb3N0IGNvbXBsZXRlbHkgYnV0IGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBwYXJzZXIgb3IgdHJlZSBwYXJzZXIgYXMgbmVlZGVkLiBMZXhlciBvdmVycmlkZXMKKyAqIG1vc3Qgb2YgdGhlc2UgZnVuY3Rpb25zLgorICovCitzdGF0aWMgdm9pZAkJCQkJYmVnaW5SZXN5bmMJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKK3N0YXRpYyBwQU5UTFIzX0JJVFNFVAkJY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKK3N0YXRpYyB2b2lkCQkJCQllbmRSZXN5bmMJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKK3N0YXRpYyB2b2lkCQkJCQliZWdpbkJhY2t0cmFjawkJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiBsZXZlbCk7CitzdGF0aWMgdm9pZAkJCQkJZW5kQmFja3RyYWNrCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBBTlRMUjNfVUlOVDMyIGxldmVsLCBBTlRMUjNfQk9PTEVBTiBzdWNjZXNzZnVsKTsKKworc3RhdGljIHZvaWQgKgkJCQltYXRjaAkJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBBTlRMUjNfVUlOVDMyIHR0eXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdyk7CitzdGF0aWMgdm9pZAkJCQkJbWF0Y2hBbnkJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKK3N0YXRpYyB2b2lkCQkJCQltaXNtYXRjaAkJCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19VSU5UMzIgdHR5cGUsIHBBTlRMUjNfQklUU0VUX0xJU1QgZm9sbG93KTsKK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgkJbWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4JCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19VSU5UMzIgdHR5cGUpOworc3RhdGljIEFOVExSM19CT09MRUFOCQltaXNtYXRjaElzTWlzc2luZ1Rva2VuCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNIGlzLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdyk7CitzdGF0aWMgdm9pZAkJCQkJcmVwb3J0RXJyb3IJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKK3N0YXRpYyBwQU5UTFIzX0JJVFNFVAkJY29tcHV0ZUNTUnVsZUZvbGxvdwkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKK3N0YXRpYyBwQU5UTFIzX0JJVFNFVAkJY29tYmluZUZvbGxvd3MJCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19CT09MRUFOIGV4YWN0KTsKK3N0YXRpYyB2b2lkCQkJCQlkaXNwbGF5UmVjb2duaXRpb25FcnJvcgkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfVUlOVDggKiB0b2tlbk5hbWVzKTsKK3N0YXRpYyB2b2lkCQkJCQlyZWNvdmVyCQkJCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpOworc3RhdGljIHZvaWQJKgkJCQlyZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbiAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19VSU5UMzIgdHR5cGUsIHBBTlRMUjNfQklUU0VUX0xJU1QgZm9sbG93KTsKK3N0YXRpYyB2b2lkCSoJCQkJcmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0ICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdyk7CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4JCXJlY292ZXJGcm9tTWlzbWF0Y2hlZEVsZW1lbnQocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpOworc3RhdGljIHZvaWQJCQkJCWNvbnN1bWVVbnRpbAkJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiB0b2tlblR5cGUpOworc3RhdGljIHZvaWQJCQkJCWNvbnN1bWVVbnRpbFNldAkJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19CSVRTRVQgc2V0KTsKK3N0YXRpYyBwQU5UTFIzX1NUQUNLCQlnZXRSdWxlSW52b2NhdGlvblN0YWNrCSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcik7CitzdGF0aWMgcEFOVExSM19TVEFDSwkJZ2V0UnVsZUludm9jYXRpb25TdGFja05hbWVkIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX1VJTlQ4IG5hbWUpOworc3RhdGljIHBBTlRMUjNfSEFTSF9UQUJMRQl0b1N0cmluZ3MJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0hBU0hfVEFCTEUpOworc3RhdGljIEFOVExSM19NQVJLRVIJCWdldFJ1bGVNZW1vaXphdGlvbgkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBBTlRMUjNfSU5US0VZIHJ1bGVJbmRleCwgQU5UTFIzX01BUktFUiBydWxlUGFyc2VTdGFydCk7CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4JCWFscmVhZHlQYXJzZWRSdWxlCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19NQVJLRVIgcnVsZUluZGV4KTsKK3N0YXRpYyB2b2lkCQkJCQltZW1vaXplCQkJCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19NQVJLRVIgcnVsZUluZGV4LCBBTlRMUjNfTUFSS0VSIHJ1bGVQYXJzZVN0YXJ0KTsKK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgkJc3lucHJlZAkJCQkJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCB2b2lkICogY3R4LCB2b2lkICgqcHJlZGljYXRlKSh2b2lkICogY3R4KSk7CitzdGF0aWMgdm9pZAkJCQkJcmVzZXQJCQkJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcik7CitzdGF0aWMgdm9pZAkJCQkJZnJlZUJSCQkJCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpOworc3RhdGljIHZvaWQgKgkJCQlnZXRDdXJyZW50SW5wdXRTeW1ib2wJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXN0cmVhbSk7CitzdGF0aWMgdm9pZCAqCQkJCWdldE1pc3NpbmdTeW1ib2wJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNCWlzdHJlYW0sIHBBTlRMUjNfRVhDRVBUSU9OCWUsCisJCQkJCQkJCQkJCQkJCQlBTlRMUjNfVUlOVDMyIGV4cGVjdGVkVG9rZW5UeXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdyk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMgkJZ2V0TnVtYmVyT2ZTeW50YXhFcnJvcnMJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUgorYW50bHIzQmFzZVJlY29nbml6ZXJOZXcoQU5UTFIzX1VJTlQzMiB0eXBlLCBBTlRMUjNfVUlOVDMyIHNpemVIaW50LCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKQoreworICAgIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXI7CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKKyAgICAvLworICAgIHJlY29nbml6ZXIJICAgID0gKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSKSBBTlRMUjNfTUFMTE9DKChzaXplX3Qpc2l6ZW9mKEFOVExSM19CQVNFX1JFQ09HTklaRVIpKTsKKworICAgIGlmCShyZWNvZ25pemVyID09IE5VTEwpCisgICAgeworCQkvLyBBbGxvY2F0aW9uIGZhaWxlZAorCQkvLworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKwkKKwkvLyBJZiB3ZSBoYXZlIGJlZW4gc3VwcGxpZWQgd2l0aCBhIHByZS1leGlzdGluZyByZWNvZ25pemVyIHN0YXRlCisJLy8gdGhlbiB3ZSBqdXN0IGluc3RhbGwgaXQsIG90aGVyd2lzZSB3ZSBtdXN0IGNyZWF0ZSBvbmUgZnJvbSBzY3JhdGNoCisJLy8KKwlpZgkoc3RhdGUgPT0gTlVMTCkKKwl7CisJCXJlY29nbml6ZXItPnN0YXRlID0gKHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUpIEFOVExSM19DQUxMT0MoMSwgKHNpemVfdClzaXplb2YoQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFKSk7CisKKwkJaWYJKHJlY29nbml6ZXItPnN0YXRlID09IE5VTEwpCisJCXsKKwkJCUFOVExSM19GUkVFKHJlY29nbml6ZXIpOworCQkJcmV0dXJuCU5VTEw7CisJCX0KKworCQkvLyBJbml0aWFsaXplIGFueSBuZXcgcmVjb2duaXplciBzdGF0ZQorCQkvLworCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3JSZWNvdmVyeQk9IEFOVExSM19GQUxTRTsKKwkJcmVjb2duaXplci0+c3RhdGUtPmxhc3RFcnJvckluZGV4CT0gLTE7CisJCXJlY29nbml6ZXItPnN0YXRlLT5mYWlsZWQJCT0gQU5UTFIzX0ZBTFNFOworCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3JDb3VudAkJPSAwOworCQlyZWNvZ25pemVyLT5zdGF0ZS0+YmFja3RyYWNraW5nCQk9IDA7CisJCXJlY29nbml6ZXItPnN0YXRlLT5mb2xsb3dpbmcJCT0gTlVMTDsKKwkJcmVjb2duaXplci0+c3RhdGUtPnJ1bGVNZW1vCQk9IE5VTEw7CisJCXJlY29nbml6ZXItPnN0YXRlLT50b2tlbk5hbWVzCQk9IE5VTEw7CisJCXJlY29nbml6ZXItPnN0YXRlLT5zaXplSGludCAgICAgICAgICAgICA9IHNpemVIaW50OworCQlyZWNvZ25pemVyLT5zdGF0ZS0+dG9rU291cmNlCQk9IE5VTEw7CisgICAgICAgICAgICAgICAgcmVjb2duaXplci0+c3RhdGUtPnRva0ZhY3RvcnkgICAgICAgICAgID0gTlVMTDsKKworCQkvLyBSYXRoZXIgdGhhbiBjaGVjayB0byBzZWUgaWYgd2UgbXVzdCBpbml0aWFsaXplCisJCS8vIHRoZSBzdGFjayBldmVyeSB0aW1lIHdlIGFyZSBhc2tlZCBmb3IgYW4gbmV3IHJld3JpdGUgc3RyZWFtCisJCS8vIHdlIGp1c3QgYWx3YXlzIGNyZWF0ZSBhbiBlbXB0eSBzdGFjayBhbmQgdGhlbiBqdXN0CisJCS8vIGZyZWUgaXQgd2hlbiB0aGUgYmFzZSByZWNvZ25pemVyIGlzIGZyZWVkLgorCQkvLworCQlyZWNvZ25pemVyLT5zdGF0ZS0+clN0cmVhbXMJCT0gYW50bHIzVmVjdG9yTmV3KDApOyAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgc2l6ZS4KKworCQlpZgkocmVjb2duaXplci0+c3RhdGUtPnJTdHJlYW1zID09IE5VTEwpCisJCXsKKwkJCS8vIE91dCBvZiBtZW1vcnkKKwkJCS8vCisJCQlBTlRMUjNfRlJFRShyZWNvZ25pemVyLT5zdGF0ZSk7CisJCQlBTlRMUjNfRlJFRShyZWNvZ25pemVyKTsKKwkJCXJldHVybglOVUxMOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIEluc3RhbGwgdGhlIG9uZSB3ZSB3ZXJlIGdpdmVuLCBhbmQgZG8gbm90IHJlc2V0IGl0IGhlcmUKKwkJLy8gYXMgaXQgd2lsbCBlaXRoZXIgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgb3Igd2lsbAorCQkvLyBiZSBpbiBhIHN0YXRlIHRoYXQgbmVlZHMgdG8gYmUgcHJlc2VydmVkLgorCQkvLworCQlyZWNvZ25pemVyLT5zdGF0ZSA9IHN0YXRlOworCX0KKwkJCisgICAgLy8gSW5zdGFsbCB0aGUgQlIgQVBJCisgICAgLy8KKyAgICByZWNvZ25pemVyLT5hbHJlYWR5UGFyc2VkUnVsZSAgICAgICAgICAgPSBhbHJlYWR5UGFyc2VkUnVsZTsKKyAgICByZWNvZ25pemVyLT5iZWdpblJlc3luYyAgICAgICAgICAgICAgICAgPSBiZWdpblJlc3luYzsKKyAgICByZWNvZ25pemVyLT5jb21iaW5lRm9sbG93cyAgICAgICAgICAgICAgPSBjb21iaW5lRm9sbG93czsKKyAgICByZWNvZ25pemVyLT5iZWdpbkJhY2t0cmFjayAgICAgICAgICAgICAgPSBiZWdpbkJhY2t0cmFjazsKKyAgICByZWNvZ25pemVyLT5lbmRCYWNrdHJhY2sgICAgICAgICAgICAgICAgPSBlbmRCYWNrdHJhY2s7CisgICAgcmVjb2duaXplci0+Y29tcHV0ZUNTUnVsZUZvbGxvdyAgICAgICAgID0gY29tcHV0ZUNTUnVsZUZvbGxvdzsKKyAgICByZWNvZ25pemVyLT5jb21wdXRlRXJyb3JSZWNvdmVyeVNldCAgICAgPSBjb21wdXRlRXJyb3JSZWNvdmVyeVNldDsKKyAgICByZWNvZ25pemVyLT5jb25zdW1lVW50aWwgICAgICAgICAgICAgICAgPSBjb25zdW1lVW50aWw7CisgICAgcmVjb2duaXplci0+Y29uc3VtZVVudGlsU2V0ICAgICAgICAgICAgID0gY29uc3VtZVVudGlsU2V0OworICAgIHJlY29nbml6ZXItPmRpc3BsYXlSZWNvZ25pdGlvbkVycm9yICAgICA9IGRpc3BsYXlSZWNvZ25pdGlvbkVycm9yOworICAgIHJlY29nbml6ZXItPmVuZFJlc3luYyAgICAgICAgICAgICAgICAgICA9IGVuZFJlc3luYzsKKyAgICByZWNvZ25pemVyLT5leENvbnN0cnVjdCAgICAgICAgICAgICAgICAgPSBhbnRscjNNVEV4Y2VwdGlvbk5ldzsKKyAgICByZWNvZ25pemVyLT5nZXRSdWxlSW52b2NhdGlvblN0YWNrICAgICAgPSBnZXRSdWxlSW52b2NhdGlvblN0YWNrOworICAgIHJlY29nbml6ZXItPmdldFJ1bGVJbnZvY2F0aW9uU3RhY2tOYW1lZCA9IGdldFJ1bGVJbnZvY2F0aW9uU3RhY2tOYW1lZDsKKyAgICByZWNvZ25pemVyLT5nZXRSdWxlTWVtb2l6YXRpb24gICAgICAgICAgPSBnZXRSdWxlTWVtb2l6YXRpb247CisgICAgcmVjb2duaXplci0+bWF0Y2ggICAgICAgICAgICAgICAgICAgICAgID0gbWF0Y2g7CisgICAgcmVjb2duaXplci0+bWF0Y2hBbnkgICAgICAgICAgICAgICAgICAgID0gbWF0Y2hBbnk7CisgICAgcmVjb2duaXplci0+bWVtb2l6ZSAgICAgICAgICAgICAgICAgICAgID0gbWVtb2l6ZTsKKyAgICByZWNvZ25pemVyLT5taXNtYXRjaCAgICAgICAgICAgICAgICAgICAgPSBtaXNtYXRjaDsKKyAgICByZWNvZ25pemVyLT5taXNtYXRjaElzVW53YW50ZWRUb2tlbiAgICAgPSBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjsKKyAgICByZWNvZ25pemVyLT5taXNtYXRjaElzTWlzc2luZ1Rva2VuICAgICAgPSBtaXNtYXRjaElzTWlzc2luZ1Rva2VuOworICAgIHJlY29nbml6ZXItPnJlY292ZXIgICAgICAgICAgICAgICAgICAgICA9IHJlY292ZXI7CisgICAgcmVjb2duaXplci0+cmVjb3ZlckZyb21NaXNtYXRjaGVkRWxlbWVudD0gcmVjb3ZlckZyb21NaXNtYXRjaGVkRWxlbWVudDsKKyAgICByZWNvZ25pemVyLT5yZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQgICAgPSByZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ7CisgICAgcmVjb2duaXplci0+cmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4gID0gcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW47CisgICAgcmVjb2duaXplci0+Z2V0TnVtYmVyT2ZTeW50YXhFcnJvcnMgICAgID0gZ2V0TnVtYmVyT2ZTeW50YXhFcnJvcnM7CisgICAgcmVjb2duaXplci0+cmVwb3J0RXJyb3IgICAgICAgICAgICAgICAgID0gcmVwb3J0RXJyb3I7CisgICAgcmVjb2duaXplci0+cmVzZXQgICAgICAgICAgICAgICAgICAgICAgID0gcmVzZXQ7CisgICAgcmVjb2duaXplci0+c3lucHJlZCAgICAgICAgICAgICAgICAgICAgID0gc3lucHJlZDsKKyAgICByZWNvZ25pemVyLT50b1N0cmluZ3MgICAgICAgICAgICAgICAgICAgPSB0b1N0cmluZ3M7CisgICAgcmVjb2duaXplci0+Z2V0Q3VycmVudElucHV0U3ltYm9sICAgICAgID0gZ2V0Q3VycmVudElucHV0U3ltYm9sOworICAgIHJlY29nbml6ZXItPmdldE1pc3NpbmdTeW1ib2wgICAgICAgICAgICA9IGdldE1pc3NpbmdTeW1ib2w7CisgICAgcmVjb2duaXplci0+ZGVidWdnZXIgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKworICAgIHJlY29nbml6ZXItPmZyZWUgPSBmcmVlQlI7CisKKyAgICAvKiBJbml0aWFsaXplIHZhcmlhYmxlcworICAgICAqLworICAgIHJlY29nbml6ZXItPnR5cGUJCQk9IHR5cGU7CisKKworICAgIHJldHVybiAgcmVjb2duaXplcjsKK30KK3N0YXRpYyB2b2lkCQorZnJlZUJSCSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcikKK3sKKyAgICBwQU5UTFIzX0VYQ0VQVElPTiB0aGlzRTsKKworCS8vIERpZCB3ZSBoYXZlIGEgc3RhdGUgYWxsb2NhdGVkPworCS8vCisJaWYJKHJlY29nbml6ZXItPnN0YXRlICE9IE5VTEwpCisJeworCQkvLyBGcmVlIGFueSBydWxlIG1lbW9pemF0aW9uIHdlIHNldCB1cAorCQkvLworCQlpZgkocmVjb2duaXplci0+c3RhdGUtPnJ1bGVNZW1vICE9IE5VTEwpCisJCXsKKwkJCXJlY29nbml6ZXItPnN0YXRlLT5ydWxlTWVtby0+ZnJlZShyZWNvZ25pemVyLT5zdGF0ZS0+cnVsZU1lbW8pOworCQkJcmVjb2duaXplci0+c3RhdGUtPnJ1bGVNZW1vID0gTlVMTDsKKwkJfQorCisJCS8vIEZyZWUgYW55IGV4Y2VwdGlvbiBzcGFjZSB3ZSBoYXZlIGxlZnQgYXJvdW5kCisJCS8vCisJCXRoaXNFID0gcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbjsKKwkJaWYJKHRoaXNFICE9IE5VTEwpCisJCXsKKwkJCXRoaXNFLT5mcmVlRXgodGhpc0UpOworCQl9CisKKwkJLy8gRnJlZSBhbnkgcmV3cml0ZSBzdHJlYW1zIHdlIGhhdmUgYWxsb2NhdGVkCisJCS8vCisJCWlmCShyZWNvZ25pemVyLT5zdGF0ZS0+clN0cmVhbXMgIT0gTlVMTCkKKwkJeworCQkJcmVjb2duaXplci0+c3RhdGUtPnJTdHJlYW1zLT5mcmVlKHJlY29nbml6ZXItPnN0YXRlLT5yU3RyZWFtcyk7CisJCX0KKworCQkvLyBGcmVlIHVwIGFueSB0b2tlbiBmYWN0b3J5IHdlIGNyZWF0ZWQgKGVycm9yIHJlY292ZXJ5IGZvciBpbnN0YW5jZSkKKwkJLy8KKwkJaWYJKHJlY29nbml6ZXItPnN0YXRlLT50b2tGYWN0b3J5ICE9IE5VTEwpCisJCXsKKwkJCXJlY29nbml6ZXItPnN0YXRlLT50b2tGYWN0b3J5LT5jbG9zZShyZWNvZ25pemVyLT5zdGF0ZS0+dG9rRmFjdG9yeSk7CisJCX0KKwkJLy8gRnJlZSB0aGUgc2hhcmVkIHN0YXRlIG1lbW9yeQorCQkvLworCQlBTlRMUjNfRlJFRShyZWNvZ25pemVyLT5zdGF0ZSk7CisJfQorCisJLy8gRnJlZSB0aGUgYWN0dWFsIHJlY29nbml6ZXIgc3BhY2UKKwkvLworICAgIEFOVExSM19GUkVFKHJlY29nbml6ZXIpOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgTWlzbWF0Y2hlZCBUb2tlbiBFeGNlcHRpb24gYW5kIGluc2VydHMgaW4gdGhlIHJlY29nbml6ZXIKKyAqIGV4Y2VwdGlvbiBzdGFjay4KKyAqIAorICogXHBhcmFtIHJlY29nbml6ZXIKKyAqIENvbnRleHQgcG9pbnRlciBmb3IgdGhpcyByZWNvZ25pemVyCisgKiAKKyAqLworQU5UTFIzX0FQSQl2b2lkCithbnRscjNNVEV4Y2VwdGlvbk5ldyhwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKQoreworICAgIC8qIENyZWF0ZSBhIGJhc2ljIHJlY29nbml0aW9uIGV4Y2VwdGlvbiBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBhbnRscjNSZWNvZ25pdGlvbkV4Y2VwdGlvbk5ldyhyZWNvZ25pemVyKTsKKworICAgIC8qIE5vdyB1cGRhdGUgaXQgdG8gaW5kaWNhdGUgdGhpcyBpcyBhIE1pc21hdGNoZWQgdG9rZW4gZXhjZXB0aW9uCisgICAgICovCisgICAgcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bmFtZQkJPSBBTlRMUjNfTUlTTUFUQ0hFRF9FWF9OQU1FOworICAgIHJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPnR5cGUJCT0gQU5UTFIzX01JU01BVENIRURfVE9LRU5fRVhDRVBUSU9OOworCisgICAgcmV0dXJuOworfQorCitBTlRMUjNfQVBJCXZvaWQKK2FudGxyM1JlY29nbml0aW9uRXhjZXB0aW9uTmV3KHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpCit7CisJcEFOVExSM19FWENFUFRJT04JCQkJZXg7CisJcEFOVExSM19MRVhFUgkJCQkJbGV4ZXI7CisJcEFOVExSM19QQVJTRVIJCQkJCXBhcnNlcjsKKwlwQU5UTFIzX1RSRUVfUEFSU0VSCQkJCXRwYXJzZXI7CisKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTQkJCWluczsKKwlwQU5UTFIzX0lOVF9TVFJFQU0JCQkJaXM7CisJcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNCSAgICBjdHM7CisJcEFOVExSM19UUkVFX05PREVfU1RSRUFNCSAgICB0bnM7CisKKwlpbnMJICAgID0gTlVMTDsKKwljdHMJICAgID0gTlVMTDsKKwl0bnMJICAgID0gTlVMTDsKKwlpcwkgICAgPSBOVUxMOworCWxleGVyICAgPSBOVUxMOworCXBhcnNlciAgPSBOVUxMOworCXRwYXJzZXIgPSBOVUxMOworCisJc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorCXsKKwljYXNlCUFOVExSM19UWVBFX0xFWEVSOgorCisJCWxleGVyCT0gKHBBTlRMUjNfTEVYRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCWlucwk9IGxleGVyLT5pbnB1dDsKKwkJaXMJPSBpbnMtPmlzdHJlYW07CisKKwkJYnJlYWs7CisKKwljYXNlCUFOVExSM19UWVBFX1BBUlNFUjoKKworCQlwYXJzZXIgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQljdHMJPSAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNKShwYXJzZXItPnRzdHJlYW0tPnN1cGVyKTsKKwkJaXMJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisKKwkJYnJlYWs7CisKKwljYXNlCUFOVExSM19UWVBFX1RSRUVfUEFSU0VSOgorCisJCXRwYXJzZXIgPSAocEFOVExSM19UUkVFX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJdG5zCT0gdHBhcnNlci0+Y3Ruc3RyZWFtLT50bnN0cmVhbTsKKwkJaXMJPSB0bnMtPmlzdHJlYW07CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkJhc2UgcmVjb2duaXplciBmdW5jdGlvbiBhbnRscjNSZWNvZ25pdGlvbkV4Y2VwdGlvbk5ldyBjYWxsZWQgYnkgdW5rbm93biBwYXJzZXIgdHlwZSAtIHByb3ZpZGUgb3ZlcnJpZGUgZm9yIHRoaXMgZnVuY3Rpb25cbiIpOworCQlyZXR1cm47CisKKwkJYnJlYWs7CisJfQorCisJLyogQ3JlYXRlIGEgYmFzaWMgZXhjZXB0aW9uIHN0cnVjdHVyZQorCSAqLworCWV4ID0gYW50bHIzRXhjZXB0aW9uTmV3KEFOVExSM19SRUNPR05JVElPTl9FWENFUFRJT04sCisJCSh2b2lkICopQU5UTFIzX1JFQ09HTklUSU9OX0VYX05BTUUsCisJCU5VTEwsCisJCUFOVExSM19GQUxTRSk7CisKKwkvKiBSZXN0IG9mIGluZm9ybWF0aW9uIGRlcGVuZHMgb24gdGhlIGJhc2UgdHlwZSBvZiB0aGUgCisJICogaW5wdXQgc3RyZWFtLgorCSAqLworCXN3aXRjaCAgKGlzLT50eXBlICYgQU5UTFIzX0lOUFVUX01BU0spCisJeworCWNhc2UgICAgQU5UTFIzX0NIQVJTVFJFQU06CisKKwkJZXgtPmMJCQk9IGlzLT5fTEEJCSAgICAJKGlzLCAxKTsJCQkJCS8qIEN1cnJlbnQgaW5wdXQgY2hhcmFjdGVyCQkJKi8KKwkJZXgtPmxpbmUJCT0gaW5zLT5nZXRMaW5lCQkJKGlucyk7CQkJCQkJLyogTGluZSBudW1iZXIgY29tZXMgZnJvbSBzdHJlYW0JCSovCisJCWV4LT5jaGFyUG9zaXRpb25JbkxpbmUJPSBpbnMtPmdldENoYXJQb3NpdGlvbkluTGluZQkoaW5zKTsJICAgIC8qIExpbmUgb2Zmc2V0IGFsc28gY29tZXMgZnJvbSB0aGUgc3RyZWFtICAgKi8KKwkJZXgtPmluZGV4CQk9IGlzLT5pbmRleAkJCShpcyk7CisJCWV4LT5zdHJlYW1OYW1lCQk9IGlucy0+ZmlsZU5hbWU7CisJCWV4LT5tZXNzYWdlCQk9ICJVbmV4cGVjdGVkIGNoYXJhY3RlciI7CisJCWJyZWFrOworCisJY2FzZSAgICBBTlRMUjNfVE9LRU5TVFJFQU06CisKKwkJZXgtPnRva2VuCQk9IGN0cy0+dHN0cmVhbS0+X0xUCQkJCQkJKGN0cy0+dHN0cmVhbSwgMSk7CSAgICAvKiBDdXJyZW50IGlucHV0IHRva2VuCQkJICAgICovCisJCWV4LT5saW5lCQk9ICgocEFOVExSM19DT01NT05fVE9LRU4pKGV4LT50b2tlbikpLT5nZXRMaW5lCQkJKGV4LT50b2tlbik7CisJCWV4LT5jaGFyUG9zaXRpb25JbkxpbmUJPSAoKHBBTlRMUjNfQ09NTU9OX1RPS0VOKShleC0+dG9rZW4pKS0+Z2V0Q2hhclBvc2l0aW9uSW5MaW5lCShleC0+dG9rZW4pOworCQlleC0+aW5kZXgJCT0gY3RzLT50c3RyZWFtLT5pc3RyZWFtLT5pbmRleAkJCQkJKGN0cy0+dHN0cmVhbS0+aXN0cmVhbSk7CisJCWlmCSgoKHBBTlRMUjNfQ09NTU9OX1RPS0VOKShleC0+dG9rZW4pKS0+dHlwZSA9PSBBTlRMUjNfVE9LRU5fRU9GKQorCQl7CisJCQlleC0+c3RyZWFtTmFtZQkJPSBOVUxMOworCQl9CisJCWVsc2UKKwkJeworCQkJZXgtPnN0cmVhbU5hbWUJCT0gKChwQU5UTFIzX0NPTU1PTl9UT0tFTikoZXgtPnRva2VuKSktPmlucHV0LT5maWxlTmFtZTsKKwkJfQorCQlleC0+bWVzc2FnZQkJPSAiVW5leHBlY3RlZCB0b2tlbiI7CisJCWJyZWFrOworCisJY2FzZSAgICBBTlRMUjNfQ09NTU9OVFJFRU5PREU6CisKKwkJZXgtPnRva2VuCQk9IHRucy0+X0xUCQkJCQkJICAgICh0bnMsIDEpOwkgICAgLyogQ3VycmVudCBpbnB1dCB0cmVlIG5vZGUJCQkgICAgKi8KKwkJZXgtPmxpbmUJCT0gKChwQU5UTFIzX0JBU0VfVFJFRSkoZXgtPnRva2VuKSktPmdldExpbmUJCSAgICAoZXgtPnRva2VuKTsKKwkJZXgtPmNoYXJQb3NpdGlvbkluTGluZQk9ICgocEFOVExSM19CQVNFX1RSRUUpKGV4LT50b2tlbikpLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUgICAoZXgtPnRva2VuKTsKKwkJZXgtPmluZGV4CQk9IHRucy0+aXN0cmVhbS0+aW5kZXgJCQkJCSAgICAodG5zLT5pc3RyZWFtKTsKKworCQkvLyBBcmUgeW91IHJlYWR5IGZvciB0aGlzPyBEZWVwIGJyZWF0aCBub3cuLi4KKwkJLy8KKwkJeworCQkJcEFOVExSM19DT01NT05fVFJFRSB0bm9kZTsKKworCQkJdG5vZGUJCT0gKChwQU5UTFIzX0NPTU1PTl9UUkVFKSgoKHBBTlRMUjNfQkFTRV9UUkVFKShleC0+dG9rZW4pKS0+c3VwZXIpKTsKKworCQkJaWYJKHRub2RlLT50b2tlbiAgICA9PSBOVUxMKQorCQkJeworCQkJCWV4LT5zdHJlYW1OYW1lID0gKChwQU5UTFIzX0JBU0VfVFJFRSkoZXgtPnRva2VuKSktPnN0ckZhY3RvcnktPm5ld1N0cigoKHBBTlRMUjNfQkFTRV9UUkVFKShleC0+dG9rZW4pKS0+c3RyRmFjdG9yeSwgKHBBTlRMUjNfVUlOVDgpIi11bmtub3duIHNvdXJjZS0iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZgkodG5vZGUtPnRva2VuLT5pbnB1dCA9PSBOVUxMKQorCQkJCXsKKwkJCQkJZXgtPnN0cmVhbU5hbWUJCT0gTlVMTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXgtPnN0cmVhbU5hbWUJCT0gdG5vZGUtPnRva2VuLT5pbnB1dC0+ZmlsZU5hbWU7CisJCQkJfQorCQkJfQorCQkJZXgtPm1lc3NhZ2UJCT0gIlVuZXhwZWN0ZWQgbm9kZSI7CisJCX0KKwkJYnJlYWs7CisJfQorCisJZXgtPmlucHV0CQkJCQkJPSBpczsKKwlleC0+bmV4dEV4Y2VwdGlvbgkJCQk9IHJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb247CS8qIFNvIHdlIGRvbid0IGxlYWsgdGhlIG1lbW9yeSAqLworCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24JPSBleDsKKwlyZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3IJICAgID0gQU5UTFIzX1RSVUU7CSAgICAvKiBFeGNlcHRpb24gaXMgb3V0c3RhbmRpbmcJKi8KKworCXJldHVybjsKK30KKworCisvLy8gTWF0Y2ggY3VycmVudCBpbnB1dCBzeW1ib2wgYWdhaW5zdCB0dHlwZS4gIFVwb24gZXJyb3IsIGRvIG9uZSB0b2tlbgorLy8vIGluc2VydGlvbiBvciBkZWxldGlvbiBpZiBwb3NzaWJsZS4gIAorLy8vIFRvIHR1cm4gb2ZmIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IKKy8vLyByZWNvdmVyeSwgb3ZlcnJpZGUgbWlzbWF0Y2hSZWNvdmVyKCkgYW5kIGhhdmUgaXQgY2FsbAorLy8vIHBsYWluIG1pc21hdGNoKCksIHdoaWNoIGRvZXMgbm90IHJlY292ZXIuICBUaGVuIGFueSBlcnJvcgorLy8vIGluIGEgcnVsZSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBhbmQgaW1tZWRpYXRlIGV4aXQgZnJvbQorLy8vIHJ1bGUuICBSdWxlIHdvdWxkIHJlY292ZXIgYnkgcmVzeW5jaHJvbml6aW5nIHRvIHRoZSBzZXQgb2YKKy8vLyBzeW1ib2xzIHRoYXQgY2FuIGZvbGxvdyBydWxlIHJlZi4KKy8vLworc3RhdGljIHZvaWQgKgorbWF0Y2goCXBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsCisJCUFOVExSM19VSU5UMzIgdHR5cGUsIHBBTlRMUjNfQklUU0VUX0xJU1QgZm9sbG93KQoreworICAgIHBBTlRMUjNfUEFSU0VSCQkJcGFyc2VyOworICAgIHBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisgICAgcEFOVExSM19JTlRfU1RSRUFNCSAgICBpczsKKwl2b2lkCQkJCQkqIG1hdGNoZWRTeW1ib2w7CisKKyAgICBzd2l0Y2gJKHJlY29nbml6ZXItPnR5cGUpCisgICAgeworCQljYXNlCUFOVExSM19UWVBFX1BBUlNFUjoKKworCQkJcGFyc2VyICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJCXRwYXJzZXIJPSBOVUxMOworCQkJaXMJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisKKwkJCWJyZWFrOworCisJCWNhc2UJQU5UTFIzX1RZUEVfVFJFRV9QQVJTRVI6CisKKwkJCXRwYXJzZXIgPSAocEFOVExSM19UUkVFX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJCXBhcnNlcgk9IE5VTEw7CisJCQlpcwk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgICAKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkJhc2UgcmVjb2duaXplciBmdW5jdGlvbiAnbWF0Y2gnIGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCQlyZXR1cm4gQU5UTFIzX0ZBTFNFOworCisJCQlicmVhazsKKyAgICB9CisKKwkvLyBQaWNrIHVwIHRoZSBjdXJyZW50IGlucHV0IHRva2VuL25vZGUgZm9yIGFzc2lnbm1lbnQgdG8gbGFiZWxzCisJLy8KKwltYXRjaGVkU3ltYm9sID0gcmVjb2duaXplci0+Z2V0Q3VycmVudElucHV0U3ltYm9sKHJlY29nbml6ZXIsIGlzKTsKKworICAgIGlmCShpcy0+X0xBKGlzLCAxKSA9PSB0dHlwZSkKKyAgICB7CisJCS8vIFRoZSB0b2tlbiB3YXMgdGhlIG9uZSB3ZSB3ZXJlIHRvbGQgdG8gZXhwZWN0CisJCS8vCisJCWlzLT5jb25zdW1lKGlzKTsJCQkJCQkJCQkvLyBDb25zdW1lIHRoYXQgdG9rZW4gZnJvbSB0aGUgc3RyZWFtCisJCXJlY29nbml6ZXItPnN0YXRlLT5lcnJvclJlY292ZXJ5CT0gQU5UTFIzX0ZBTFNFOwkvLyBOb3QgaW4gZXJyb3IgcmVjb3Zlcnkgbm93IChpZiB3ZSB3ZXJlKQorCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZmFpbGVkCQkJPSBBTlRMUjNfRkFMU0U7CS8vIFRoZSBtYXRjaCB3YXMgYSBzdWNjZXNzCisJCXJldHVybiBtYXRjaGVkU3ltYm9sOwkJCQkJCQkJLy8gV2UgYXJlIGRvbmUKKyAgICB9CisKKyAgICAvLyBXZSBkaWQgbm90IGZpbmQgdGhlIGV4cGVjdGVkIHRva2VuIHR5cGUsIGlmIHdlIGFyZSBiYWNrdHJhY2tpbmcgdGhlbgorICAgIC8vIHdlIGp1c3Qgc2V0IHRoZSBmYWlsZWQgZmxhZyBhbmQgcmV0dXJuLgorICAgIC8vCisgICAgaWYJKHJlY29nbml6ZXItPnN0YXRlLT5iYWNrdHJhY2tpbmcgPiAwKQorICAgIHsKKwkJLy8gQmFja3RyYWNraW5nIGlzIGdvaW5nIG9uCisJCS8vCisJCXJlY29nbml6ZXItPnN0YXRlLT5mYWlsZWQgID0gQU5UTFIzX1RSVUU7CisJCXJldHVybiBtYXRjaGVkU3ltYm9sOworCX0KKworICAgIC8vIFdlIGRpZCBub3QgZmluZCB0aGUgZXhwZWN0ZWQgdG9rZW4gYW5kIHRoZXJlIGlzIG5vIGJhY2t0cmFja2luZworICAgIC8vIGdvaW5nIG9uLCBzbyB3ZSBtaXNtYXRjaCwgd2hpY2ggY3JlYXRlcyBhbiBleGNlcHRpb24gaW4gdGhlIHJlY29nbml6ZXIgZXhjZXB0aW9uCisgICAgLy8gc3RhY2suCisgICAgLy8KKwltYXRjaGVkU3ltYm9sID0gcmVjb2duaXplci0+cmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4ocmVjb2duaXplciwgdHR5cGUsIGZvbGxvdyk7CisgICAgcmV0dXJuIG1hdGNoZWRTeW1ib2w7Cit9CisKKy8vLyBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiwgd2hhdGV2ZXIgaXQgaXMsIGFuZCByZXNldHMgdGhlIHJlY29nbml6ZXIgc3RhdGUKKy8vLyBzbyB0aGF0IGl0IGlzIG5vdCBpbiBlcnJvci4KKy8vLworLy8vIFxwYXJhbSByZWNvZ25pemVyCisvLy8gUmVjb2duaXplciBjb250ZXh0IHBvaW50ZXIKKy8vLworc3RhdGljIHZvaWQKK21hdGNoQW55KHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpCit7CisgICAgcEFOVExSM19QQVJTRVIJICAgIHBhcnNlcjsKKyAgICBwQU5UTFIzX1RSRUVfUEFSU0VSCSAgICB0cGFyc2VyOworICAgIHBBTlRMUjNfSU5UX1NUUkVBTQkgICAgaXM7CisKKyAgICBzd2l0Y2gJKHJlY29nbml6ZXItPnR5cGUpCisgICAgeworCQljYXNlCUFOVExSM19UWVBFX1BBUlNFUjoKKworCQkJcGFyc2VyICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJCXRwYXJzZXIJPSBOVUxMOworCQkJaXMJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisKKwkJCWJyZWFrOworCisJCWNhc2UJQU5UTFIzX1RZUEVfVFJFRV9QQVJTRVI6CisKKwkJCXRwYXJzZXIgPSAocEFOVExSM19UUkVFX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJCXBhcnNlcgk9IE5VTEw7CisJCQlpcwk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgICAKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkJhc2UgcmVjb2duaXplciBmdW5jdGlvbiAnbWF0Y2hBbnknIGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCQlyZXR1cm47CisKKwkJYnJlYWs7CisgICAgfQorICAgIHJlY29nbml6ZXItPnN0YXRlLT5lcnJvclJlY292ZXJ5CT0gQU5UTFIzX0ZBTFNFOworICAgIHJlY29nbml6ZXItPnN0YXRlLT5mYWlsZWQJCSAgICA9IEFOVExSM19GQUxTRTsKKyAgICBpcy0+Y29uc3VtZShpcyk7CisKKyAgICByZXR1cm47Cit9CisvLy8KKy8vLworc3RhdGljIEFOVExSM19CT09MRUFOCittaXNtYXRjaElzVW53YW50ZWRUb2tlbihwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19VSU5UMzIgdHR5cGUpCit7CisJQU5UTFIzX1VJTlQzMiBuZXh0dDsKKworCW5leHR0ID0gaXMtPl9MQShpcywgMik7CisKKwlpZgkobmV4dHQgPT0gdHR5cGUpCisJeworCQlpZgkocmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbiAhPSBOVUxMKQorCQl7CisJCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5leHBlY3RpbmcgPSBuZXh0dDsKKwkJfQorCQlyZXR1cm4gQU5UTFIzX1RSVUU7CQkvLyBUaGlzIHRva2VuIGlzIHVua25vd24sIGJ1dCB0aGUgbmV4dCBvbmUgaXMgdGhlIG9uZSB3ZSB3YW50ZWQKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIEFOVExSM19GQUxTRTsJLy8gTmVpdGhlciB0aGlzIHRva2VuLCBub3IgdGhlIG9uZSBmb2xsb3dpbmcgaXMgdGhlIG9uZSB3ZSB3YW50ZWQKKwl9Cit9CisKKy8vLworLy8vCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK21pc21hdGNoSXNNaXNzaW5nVG9rZW4ocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNIGlzLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdykKK3sKKwlBTlRMUjNfQk9PTEVBTglyZXRjb2RlOworCXBBTlRMUjNfQklUU0VUCWZvbGxvd0Nsb25lOworCXBBTlRMUjNfQklUU0VUCXZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlOworCisJaWYJKGZvbGxvdyA9PSBOVUxMKQorCXsKKwkJLy8gVGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRva2VucyB0aGF0IGNhbiBmb2xsb3cgdGhlIGxhc3Qgb25lCisJCS8vIGhlbmNlIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGN1cnJlbnQgb25lIHdlIGZvdW5kIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgCisJCS8vIGZvbGxvdyBzZXQgYW5kIGRvZXMgbm90IGluZGljYXRlIGEgbWlzc2luZyB0b2tlbi4gV2Ugd2lsbCBqdXN0IGNvbnN1bWUgdGhpcworCQkvLyBzaW5nbGUgdG9rZW4gYW5kIHNlZSBpZiB0aGUgcGFyc2VyIHdvcmtzIGl0IG91dCBmcm9tIHRoZXJlLgorCQkvLworCQlyZXR1cm4JQU5UTFIzX0ZBTFNFOworCX0KKworCWZvbGxvd0Nsb25lCQkJCQkJPSBOVUxMOworCXZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlCT0gTlVMTDsKKworCS8vIFRoZSBDIGJpdHNldCBtYXBzIGFyZSBsYWlkIGRvd24gYXQgY29tcGlsZSB0aW1lIGJ5IHRoZQorCS8vIEMgY29kZSBnZW5lcmF0aW9uLiBIZW5jZSB3ZSBjYW5ub3QgcmVtb3ZlIHRoaW5ncyBmcm9tIHRoZW0KKwkvLyBhbmQgc28gb24uIFNvLCBpbiBvcmRlciB0byByZW1vdmUgRU9SIChpZiB3ZSBuZWVkIHRvKSB0aGVuCisJLy8gd2UgY2xvbmUgdGhlIHN0YXRpYyBiaXRzZXQuCisJLy8KKwlmb2xsb3dDbG9uZSA9IGFudGxyM0JpdHNldExvYWQoZm9sbG93KTsKKwlpZgkoZm9sbG93Q2xvbmUgPT0gTlVMTCkKKwl7CisJCXJldHVybiBBTlRMUjNfRkFMU0U7CisJfQorCisJLy8gQ29tcHV0ZSB3aGF0IGNhbiBmb2xsb3cgdGhpcyBncmFtbWFyIHJlZmVyZW5jZQorCS8vCisJaWYJKGZvbGxvd0Nsb25lLT5pc01lbWJlcihmb2xsb3dDbG9uZSwgQU5UTFIzX0VPUl9UT0tFTl9UWVBFKSkKKwl7CisJCS8vIEVPUiBjYW4gZm9sbG93LCBidXQgaWYgd2UgYXJlIG5vdCB0aGUgc3RhcnQgc3ltYm9sLCB3ZQorCQkvLyBuZWVkIHRvIHJlbW92ZSBpdC4KKwkJLy8KKwkJaWYJKHJlY29nbml6ZXItPnN0YXRlLT5mb2xsb3dpbmctPnZlY3Rvci0+Y291bnQgPj0gMCkKKwkJeworCQkJZm9sbG93Q2xvbmUtPnJlbW92ZShmb2xsb3dDbG9uZSwgQU5UTFIzX0VPUl9UT0tFTl9UWVBFKTsKKwkJfQorCisJCS8vIE5vdyBjb21wdXRlIHRoZSB2aXNpYWJsZSB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoaXMgcnVsZSwgYWNjb3JkaW5nIHRvIGNvbnRleHQKKwkJLy8gYW5kIG1ha2UgdGhlbSBwYXJ0IG9mIHRoZSBmb2xsb3cgc2V0LgorCQkvLworCQl2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSA9IHJlY29nbml6ZXItPmNvbXB1dGVDU1J1bGVGb2xsb3cocmVjb2duaXplcik7CisJCWZvbGxvd0Nsb25lLT5ib3JJblBsYWNlKGZvbGxvd0Nsb25lLCB2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSk7CisJfQorCisJLy8vIGlmIGN1cnJlbnQgdG9rZW4gaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgY291bGQgY29tZSBhZnRlciBzZXQKKwkvLy8gdGhlbiB3ZSBrbm93IHdlJ3JlIG1pc3NpbmcgYSB0b2tlbjsgZXJyb3IgcmVjb3ZlcnkgaXMgZnJlZSB0bworCS8vLyAiaW5zZXJ0IiB0aGUgbWlzc2luZyB0b2tlbgorCS8vLworCS8vLyBCaXRTZXQgY2Fubm90IGhhbmRsZSBuZWdhdGl2ZSBudW1iZXJzIGxpa2UgLTEgKEVPRikgc28gSSBsZWF2ZSBFT1IKKwkvLy8gaW4gZm9sbG93IHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmYWxsIG9mIHRoZSBzdGFydCBzeW1ib2wgaXMKKwkvLy8gaW4gdGhlIHNldCAoRU9GIGNhbiBmb2xsb3cpLgorCS8vLworCWlmCSgJCWZvbGxvd0Nsb25lLT5pc01lbWJlcihmb2xsb3dDbG9uZSwgaXMtPl9MQShpcywgMSkpCisJCQl8fAlmb2xsb3dDbG9uZS0+aXNNZW1iZXIoZm9sbG93Q2xvbmUsIEFOVExSM19FT1JfVE9LRU5fVFlQRSkKKwkJKQorCXsKKwkJcmV0Y29kZSA9IEFOVExSM19UUlVFOworCX0KKwllbHNlCisJeworCQlyZXRjb2RlCT0gQU5UTFIzX0ZBTFNFOworCX0KKworCWlmCSh2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSAhPSBOVUxMKQorCXsKKwkJdmlhYmxlVG9rZW5zRm9sbG93aW5nVGhpc1J1bGUtPmZyZWUodmlhYmxlVG9rZW5zRm9sbG93aW5nVGhpc1J1bGUpOworCX0KKwlpZgkoZm9sbG93Q2xvbmUgIT0gTlVMTCkKKwl7CisJCWZvbGxvd0Nsb25lLT5mcmVlKGZvbGxvd0Nsb25lKTsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKKworfQorCisvLy8gRmFjdG9yIG91dCB3aGF0IHRvIGRvIHVwb24gdG9rZW4gbWlzbWF0Y2ggc28gdHJlZSBwYXJzZXJzIGNhbiBiZWhhdmUKKy8vLyBkaWZmZXJlbnRseS4gIE92ZXJyaWRlIGFuZCBjYWxsIG1pc21hdGNoUmVjb3ZlcihpbnB1dCwgdHR5cGUsIGZvbGxvdykKKy8vLyB0byBnZXQgc2luZ2xlIHRva2VuIGluc2VydGlvbiBhbmQgZGVsZXRpb24uICBVc2UgdGhpcyB0byB0dXJuIG9mZgorLy8vIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gYW5kIGRlbGV0aW9uLiBPdmVycmlkZSBtaXNtYXRjaFJlY292ZXIKKy8vLyB0byBjYWxsIHRoaXMgaW5zdGVhZC4KKy8vLworLy8vIFxyZW1hcmsgbWlzbWF0Y2ggb25seSB3b3JrcyBmb3IgcGFyc2VycyBhbmQgbXVzdCBiZSBvdmVycmlkZGVuIGZvciBhbnl0aGluZyBlbHNlLgorLy8vCitzdGF0aWMJdm9pZAorbWlzbWF0Y2gocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiB0dHlwZSwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpCit7CisgICAgcEFOVExSM19QQVJTRVIJICAgIHBhcnNlcjsKKyAgICBwQU5UTFIzX1RSRUVfUEFSU0VSCSAgICB0cGFyc2VyOworICAgIHBBTlRMUjNfSU5UX1NUUkVBTQkgICAgaXM7CisKKyAgICAvLyBJbnN0YWxsIGEgbWlzbWF0Y2hlZCB0b2tlbiBleGNlcHRpb24gaW4gdGhlIGV4Y2VwdGlvbiBzdGFjaworICAgIC8vCisgICAgYW50bHIzTVRFeGNlcHRpb25OZXcocmVjb2duaXplcik7CisgICAgcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+ZXhwZWN0aW5nICAgID0gdHR5cGU7CisKKyAgICBzd2l0Y2gJKHJlY29nbml6ZXItPnR5cGUpCisgICAgeworCQljYXNlCUFOVExSM19UWVBFX1BBUlNFUjoKKworCQkJcGFyc2VyICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJCXRwYXJzZXIJPSBOVUxMOworCQkJaXMJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCSAgICAKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkJhc2UgcmVjb2duaXplciBmdW5jdGlvbiAnbWlzbWF0Y2gnIGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCQlyZXR1cm47CisKKwkJCWJyZWFrOworICAgIH0KKworCWlmCShtaXNtYXRjaElzVW53YW50ZWRUb2tlbihyZWNvZ25pemVyLCBpcywgdHR5cGUpKQorCXsKKwkJLy8gQ3JlYXRlIGEgYmFzaWMgcmVjb2duaXRpb24gZXhjZXB0aW9uIHN0cnVjdHVyZQorCQkvLworCSAgICBhbnRscjNSZWNvZ25pdGlvbkV4Y2VwdGlvbk5ldyhyZWNvZ25pemVyKTsKKwkJCisJCS8vIE5vdyB1cGRhdGUgaXQgdG8gaW5kaWNhdGUgdGhpcyBpcyBhbiB1bndhbnRlZCB0b2tlbiBleGNlcHRpb24KKwkJLy8KKwkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bmFtZQkJPSBBTlRMUjNfVU5XQU5URURfVE9LRU5fRVhDRVBUSU9OX05BTUU7CisJCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPnR5cGUJCT0gQU5UTFIzX1VOV0FOVEVEX1RPS0VOX0VYQ0VQVElPTjsKKworCQlyZXR1cm47CisJfQorCQorCWlmCShtaXNtYXRjaElzTWlzc2luZ1Rva2VuKHJlY29nbml6ZXIsIGlzLCBmb2xsb3cpKQorCXsKKwkJLy8gQ3JlYXRlIGEgYmFzaWMgcmVjb2duaXRpb24gZXhjZXB0aW9uIHN0cnVjdHVyZQorCQkvLworCSAgICBhbnRscjNSZWNvZ25pdGlvbkV4Y2VwdGlvbk5ldyhyZWNvZ25pemVyKTsKKwkJCisJCS8vIE5vdyB1cGRhdGUgaXQgdG8gaW5kaWNhdGUgdGhpcyBpcyBhbiB1bndhbnRlZCB0b2tlbiBleGNlcHRpb24KKwkJLy8KKwkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bmFtZQkJPSBBTlRMUjNfTUlTU0lOR19UT0tFTl9FWENFUFRJT05fTkFNRTsKKwkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dHlwZQkJPSBBTlRMUjNfTUlTU0lOR19UT0tFTl9FWENFUFRJT047CisKKwkJcmV0dXJuOworCX0KKworCS8vIEp1c3QgYSBtaXNtYXRjaGVkIHRva2VuIGlzIGFsbCB3ZSBjYW4gZHRlcm1pbmUKKwkvLworCWFudGxyM01URXhjZXB0aW9uTmV3KHJlY29nbml6ZXIpOworCisJcmV0dXJuOworfQorLy8vIFJlcG9ydCBhIHJlY29nbml0aW9uIHByb2JsZW0uCisvLy8KKy8vLyBUaGlzIG1ldGhvZCBzZXRzIGVycm9yUmVjb3ZlcnkgdG8gaW5kaWNhdGUgdGhlIHBhcnNlciBpcyByZWNvdmVyaW5nCisvLy8gbm90IHBhcnNpbmcuICBPbmNlIGluIHJlY292ZXJ5IG1vZGUsIG5vIGVycm9ycyBhcmUgZ2VuZXJhdGVkLgorLy8vIFRvIGdldCBvdXQgb2YgcmVjb3ZlcnkgbW9kZSwgdGhlIHBhcnNlciBtdXN0IHN1Y2Nlc3NmdWxseSBtYXRjaAorLy8vIGEgdG9rZW4gKGFmdGVyIGEgcmVzeW5jKS4gIFNvIGl0IHdpbGwgZ286CisvLy8KKy8vLwkJMS4gZXJyb3Igb2NjdXJzCisvLy8JCTIuIGVudGVyIHJlY292ZXJ5IG1vZGUsIHJlcG9ydCBlcnJvcgorLy8vCQkzLiBjb25zdW1lIHVudGlsIHRva2VuIGZvdW5kIGluIHJlc3luY2ggc2V0CisvLy8JCTQuIHRyeSB0byByZXN1bWUgcGFyc2luZworLy8vCQk1LiBuZXh0IG1hdGNoKCkgd2lsbCByZXNldCBlcnJvclJlY292ZXJ5IG1vZGUKKy8vLworLy8vIElmIHlvdSBvdmVycmlkZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSBlcnJvckNvdW50IGlmIHlvdSBjYXJlIGFib3V0IHRoYXQuCisvLy8KK3N0YXRpYyB2b2lkCQkJCityZXBvcnRFcnJvcgkJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKQoreworICAgIAkvLyBJbnZva2UgdGhlIGRlYnVnZ2VyIGV2ZW50IGlmIHRoZXJlIGlzIGEgZGVidWdnZXIgbGlzdGVuaW5nIHRvIHVzCisJLy8KKwlpZgkocmVjb2duaXplci0+ZGVidWdnZXIgIT0gTlVMTCkKKwl7CisJCXJlY29nbml6ZXItPmRlYnVnZ2VyLT5yZWNvZ25pdGlvbkV4Y2VwdGlvbihyZWNvZ25pemVyLT5kZWJ1Z2dlciwgcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbik7CisJfQorCisgICAgaWYJKHJlY29nbml6ZXItPnN0YXRlLT5lcnJvclJlY292ZXJ5ID09IEFOVExSM19UUlVFKQorICAgIHsKKwkJLy8gQWxyZWFkeSBpbiBlcnJvciByZWNvdmVyeSBzbyBkb24ndCBkaXNwbGF5IGFub3RoZXIgZXJyb3Igd2hpbGUgZG9pbmcgc28KKwkJLy8KKwkJcmV0dXJuOworICAgIH0KKworICAgIC8vIFNpZ25hbCB3ZSBhcmUgaW4gZXJyb3IgcmVjb3Zlcnkgbm93CisgICAgLy8KKyAgICByZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3JSZWNvdmVyeSA9IEFOVExSM19UUlVFOworCQorCS8vIEluZGljYXRlIHRoaXMgcmVjb2duaXplciBoYWQgYW4gZXJyb3Igd2hpbGUgcHJvY2Vzc2luZy4KKwkvLworCXJlY29nbml6ZXItPnN0YXRlLT5lcnJvckNvdW50Kys7CisKKwkvLyBDYWxsIHRoZSBlcnJvciBkaXNwbGF5IHJvdXRpbmUKKwkvLworICAgIHJlY29nbml6ZXItPmRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKHJlY29nbml6ZXIsIHJlY29nbml6ZXItPnN0YXRlLT50b2tlbk5hbWVzKTsKK30KKworc3RhdGljIHZvaWQKK2JlZ2luQmFja3RyYWNrCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiBsZXZlbCkKK3sKKwlpZgkocmVjb2duaXplci0+ZGVidWdnZXIgIT0gTlVMTCkKKwl7CisJCXJlY29nbml6ZXItPmRlYnVnZ2VyLT5iZWdpbkJhY2t0cmFjayhyZWNvZ25pemVyLT5kZWJ1Z2dlciwgbGV2ZWwpOworCX0KK30KKworc3RhdGljIHZvaWQKK2VuZEJhY2t0cmFjawkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19VSU5UMzIgbGV2ZWwsIEFOVExSM19CT09MRUFOIHN1Y2Nlc3NmdWwpCit7CisJaWYJKHJlY29nbml6ZXItPmRlYnVnZ2VyICE9IE5VTEwpCisJeworCQlyZWNvZ25pemVyLT5kZWJ1Z2dlci0+ZW5kQmFja3RyYWNrKHJlY29nbml6ZXItPmRlYnVnZ2VyLCBsZXZlbCwgc3VjY2Vzc2Z1bCk7CisJfQorfQorc3RhdGljIHZvaWQJCQkKK2JlZ2luUmVzeW5jCQkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpCit7CisJaWYJKHJlY29nbml6ZXItPmRlYnVnZ2VyICE9IE5VTEwpCisJeworCQlyZWNvZ25pemVyLT5kZWJ1Z2dlci0+YmVnaW5SZXN5bmMocmVjb2duaXplci0+ZGVidWdnZXIpOworCX0KK30KKworc3RhdGljIHZvaWQJCQkKK2VuZFJlc3luYwkJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKQoreworCWlmCShyZWNvZ25pemVyLT5kZWJ1Z2dlciAhPSBOVUxMKQorCXsKKwkJcmVjb2duaXplci0+ZGVidWdnZXItPmVuZFJlc3luYyhyZWNvZ25pemVyLT5kZWJ1Z2dlcik7CisJfQorfQorCisvLy8gQ29tcHV0ZSB0aGUgZXJyb3IgcmVjb3Zlcnkgc2V0IGZvciB0aGUgY3VycmVudCBydWxlLgorLy8vIERvY3VtZW50YXRpb24gYmVsb3cgaXMgZnJvbSB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4KKy8vLworLy8vIER1cmluZyBydWxlIGludm9jYXRpb24sIHRoZSBwYXJzZXIgcHVzaGVzIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuCisvLy8gZm9sbG93IHRoYXQgcnVsZSByZWZlcmVuY2Ugb24gdGhlIHN0YWNrOyB0aGlzIGFtb3VudHMgdG8KKy8vLyBjb21wdXRpbmcgRklSU1Qgb2Ygd2hhdCBmb2xsb3dzIHRoZSBydWxlIHJlZmVyZW5jZSBpbiB0aGUKKy8vLyBlbmNsb3NpbmcgcnVsZS4gVGhpcyBsb2NhbCBmb2xsb3cgc2V0IG9ubHkgaW5jbHVkZXMgdG9rZW5zCisvLy8gZnJvbSB3aXRoaW4gdGhlIHJ1bGU7IGkuZS4sIHRoZSBGSVJTVCBjb21wdXRhdGlvbiBkb25lIGJ5CisvLy8gQU5UTFIgc3RvcHMgYXQgdGhlIGVuZCBvZiBhIHJ1bGUuCisvLworLy8vIEVYQU1QTEUKKy8vCisvLy8gV2hlbiB5b3UgZmluZCBhICJubyB2aWFibGUgYWx0IGV4Y2VwdGlvbiIsIHRoZSBpbnB1dCBpcyBub3QKKy8vLyBjb25zaXN0ZW50IHdpdGggYW55IG9mIHRoZSBhbHRlcm5hdGl2ZXMgZm9yIHJ1bGUgci4gIFRoZSBiZXN0CisvLy8gdGhpbmcgdG8gZG8gaXMgdG8gY29uc3VtZSB0b2tlbnMgdW50aWwgeW91IHNlZSBzb21ldGhpbmcgdGhhdAorLy8vIGNhbiBsZWdhbGx5IGZvbGxvdyBhIGNhbGwgdG8gciAqb3IqIGFueSBydWxlIHRoYXQgY2FsbGVkIHIuCisvLy8gWW91IGRvbid0IHdhbnQgdGhlIGV4YWN0IHNldCBvZiB2aWFibGUgbmV4dCB0b2tlbnMgYmVjYXVzZSB0aGUKKy8vLyBpbnB1dCBtaWdodCBqdXN0IGJlIG1pc3NpbmcgYSB0b2tlbi0teW91IG1pZ2h0IGNvbnN1bWUgdGhlCisvLy8gcmVzdCBvZiB0aGUgaW5wdXQgbG9va2luZyBmb3Igb25lIG9mIHRoZSBtaXNzaW5nIHRva2Vucy4KKy8vLworLy8vIENvbnNpZGVyIGdyYW1tYXI6CisvLy8KKy8vLyBhIDogJ1snIGIgJ10nCisvLy8gICB8ICcoJyBiICcpJworLy8vICAgOworLy8vIGIgOiBjICdeJyBJTlQgOworLy8vIGMgOiBJRAorLy8vICAgfCBJTlQKKy8vLyAgIDsKKy8vLworLy8vIEF0IGVhY2ggcnVsZSBpbnZvY2F0aW9uLCB0aGUgc2V0IG9mIHRva2VucyB0aGF0IGNvdWxkIGZvbGxvdworLy8vIHRoYXQgcnVsZSBpcyBwdXNoZWQgb24gYSBzdGFjay4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzICJsb2NhbCIKKy8vLyBmb2xsb3cgc2V0czoKKy8vLworLy8vIEZPTExPVyhiMV9pbl9hKSA9IEZJUlNUKCddJykgPSAnXScKKy8vLyBGT0xMT1coYjJfaW5fYSkgPSBGSVJTVCgnKScpID0gJyknCisvLy8gRk9MTE9XKGNfaW5fYikgPSBGSVJTVCgnXicpID0gJ14nCisvLy8KKy8vLyBVcG9uIGVycm9uZW91cyBpbnB1dCAiW10iLCB0aGUgY2FsbCBjaGFpbiBpcworLy8vCisvLy8gYSAtPiBiIC0+IGMKKy8vLworLy8vIGFuZCwgaGVuY2UsIHRoZSBmb2xsb3cgY29udGV4dCBzdGFjayBpczoKKy8vLworLy8vIGRlcHRoICBsb2NhbCBmb2xsb3cgc2V0ICAgICBhZnRlciBjYWxsIHRvIHJ1bGUKKy8vLyAgIDAgICAgICAgICA8RU9GPiAgICAgICAgICAgICAgICAgICAgYSAoZnJvbSBtYWluKCkpCisvLy8gICAxICAgICAgICAgICddJyAgICAgICAgICAgICAgICAgICAgIGIKKy8vLyAgIDMgICAgICAgICAgJ14nICAgICAgICAgICAgICAgICAgICAgYworLy8vCisvLy8gTm90aWNlIHRoYXQgJyknIGlzIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSBiIHdvdWxkIGhhdmUgdG8gaGF2ZQorLy8vIGJlZW4gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCBpbiBydWxlIGEgZm9yICcpJyB0byBiZQorLy8vIGluY2x1ZGVkLgorLy8vCisvLy8gRm9yIGVycm9yIHJlY292ZXJ5LCB3ZSBjYW5ub3QgY29uc2lkZXIgRk9MTE9XKGMpCisvLy8gKGNvbnRleHQtc2Vuc2l0aXZlIG9yIG90aGVyd2lzZSkuICBXZSBuZWVkIHRoZSBjb21iaW5lZCBzZXQgb2YKKy8vLyBhbGwgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldHMtLXRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0CisvLy8gY291bGQgZm9sbG93IGFueSByZWZlcmVuY2UgaW4gdGhlIGNhbGwgY2hhaW4uICBXZSBuZWVkIHRvCisvLy8gcmVzeW5jIHRvIG9uZSBvZiB0aG9zZSB0b2tlbnMuICBOb3RlIHRoYXQgRk9MTE9XKGMpPSdeJyBhbmQgaWYKKy8vLyB3ZSByZXN5bmMnZCB0byB0aGF0IHRva2VuLCB3ZSdkIGNvbnN1bWUgdW50aWwgRU9GLiAgV2UgbmVlZCB0bworLy8vIHN5bmMgdG8gY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XcyBmb3IgYSwgYiwgYW5kIGM6IHsnXScsJ14nfS4KKy8vLyBJbiB0aGlzIGNhc2UsIGZvciBpbnB1dCAiW10iLCBMQSgxKSBpcyBpbiB0aGlzIHNldCBzbyB3ZSB3b3VsZAorLy8vIG5vdCBjb25zdW1lIGFueXRoaW5nIGFuZCBhZnRlciBwcmludGluZyBhbiBlcnJvciBydWxlIGMgd291bGQKKy8vLyByZXR1cm4gbm9ybWFsbHkuICBJdCB3b3VsZCBub3QgZmluZCB0aGUgcmVxdWlyZWQgJ14nIHRob3VnaC4KKy8vLyBBdCB0aGlzIHBvaW50LCBpdCBnZXRzIGEgbWlzbWF0Y2hlZCB0b2tlbiBlcnJvciBhbmQgdGhyb3dzIGFuCisvLy8gZXhjZXB0aW9uIChzaW5jZSBMQSgxKSBpcyBub3QgaW4gdGhlIHZpYWJsZSBmb2xsb3dpbmcgdG9rZW4KKy8vLyBzZXQpLiAgVGhlIHJ1bGUgZXhjZXB0aW9uIGhhbmRsZXIgdHJpZXMgdG8gcmVjb3ZlciwgYnV0IGZpbmRzCisvLy8gdGhlIHNhbWUgcmVjb3Zlcnkgc2V0IGFuZCBkb2Vzbid0IGNvbnN1bWUgYW55dGhpbmcuICBSdWxlIGIKKy8vLyBleGl0cyBub3JtYWxseSByZXR1cm5pbmcgdG8gcnVsZSBhLiAgTm93IGl0IGZpbmRzIHRoZSAnXScgKGFuZAorLy8vIHdpdGggdGhlIHN1Y2Nlc3NmdWwgbWF0Y2ggZXhpdHMgZXJyb3JSZWNvdmVyeSBtb2RlKS4KKy8vLworLy8vIFNvLCB5b3UgY2FuIHNlZSB0aGF0IHRoZSBwYXJzZXIgd2Fsa3MgdXAgY2FsbCBjaGFpbiBsb29raW5nCisvLy8gZm9yIHRoZSB0b2tlbiB0aGF0IHdhcyBhIG1lbWJlciBvZiB0aGUgcmVjb3Zlcnkgc2V0LgorLy8vCisvLy8gRXJyb3JzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGVycm9yUmVjb3ZlcnkgbW9kZS4KKy8vLworLy8vIEFOVExSJ3MgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtIGlzIGJhc2VkIHVwb24gb3JpZ2luYWwgaWRlYXM6CisvLy8KKy8vLyAiQWxnb3JpdGhtcyArIERhdGEgU3RydWN0dXJlcyA9IFByb2dyYW1zIiBieSBOaWtsYXVzIFdpcnRoCisvLy8KKy8vLyBhbmQKKy8vLworLy8vICJBIG5vdGUgb24gZXJyb3IgcmVjb3ZlcnkgaW4gcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VycyI6CisvLy8gaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD05NDc5MDIuOTQ3OTA1CisvLy8KKy8vLyBMYXRlciwgSm9zZWYgR3Jvc2NoIGhhZCBzb21lIGdvb2QgaWRlYXM6CisvLy8KKy8vLyAiRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudAorLy8vIFBhcnNlcnMiOgorLy8vIGZ0cDovL3d3dy5jb2NvbGFiLmNvbS9wcm9kdWN0cy9jb2NrdGFpbC9kb2NhNC5wcy9lbGwucHMuemlwCisvLy8KKy8vLyBMaWtlIEdyb3NjaCBJIGltcGxlbWVudGVkIGxvY2FsIEZPTExPVyBzZXRzIHRoYXQgYXJlIGNvbWJpbmVkCisvLy8gYXQgcnVuLXRpbWUgdXBvbiBlcnJvciB0byBhdm9pZCBvdmVyaGVhZCBkdXJpbmcgcGFyc2luZy4KKy8vLworc3RhdGljIHBBTlRMUjNfQklUU0VUCQkKK2NvbXB1dGVFcnJvclJlY292ZXJ5U2V0CSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcikKK3sKKyAgICByZXR1cm4gICByZWNvZ25pemVyLT5jb21iaW5lRm9sbG93cyhyZWNvZ25pemVyLCBBTlRMUjNfRkFMU0UpOworfQorCisvLy8gQ29tcHV0ZSB0aGUgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldCBmb3IgY3VycmVudCBydWxlLgorLy8vIERvY3VtZW50YXRpb24gYmVsb3cgaXMgZnJvbSB0aGUgSmF2YSBydW50aW1lLgorLy8vCisvLy8gVGhpcyBpcyB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhIHNwZWNpZmljIHJ1bGUKKy8vLyByZWZlcmVuY2UgZ2l2ZW4gYSBzcGVjaWZpYyBjYWxsIGNoYWluLiAgWW91IGdldCB0aGUgc2V0IG9mCisvLy8gdmlhYmxlIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBjb21lIG5leHQgKGxvb2sgYWhlYWQgZGVwdGggMSkKKy8vLyBnaXZlbiB0aGUgY3VycmVudCBjYWxsIGNoYWluLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorLy8vIGRlZmluaXRpb24gb2YgcGxhaW4gRk9MTE9XIGZvciBydWxlIHI6CisvLy8KKy8vLyAgRk9MTE9XKHIpPXt4IHwgUz0+KmFscGhhIHIgYmV0YSBpbiBHIGFuZCB4IGluIEZJUlNUKGJldGEpfQorLy8vCisvLy8gd2hlcmUgeCBpbiBUKiBhbmQgYWxwaGEsIGJldGEgaW4gVio7IFQgaXMgc2V0IG9mIHRlcm1pbmFscyBhbmQKKy8vLyBWIGlzIHRoZSBzZXQgb2YgdGVybWluYWxzIGFuZCBub24gdGVybWluYWxzLiAgSW4gb3RoZXIgd29yZHMsCisvLy8gRk9MTE9XKHIpIGlzIHRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBmb2xsb3cKKy8vLyByZWZlcmVuY2VzIHRvIHIgaW4vLy9hbnkqIHNlbnRlbnRpYWwgZm9ybSAoY29udGV4dCkuICBBdAorLy8vIHJ1bnRpbWUsIGhvd2V2ZXIsIHdlIGtub3cgcHJlY2lzZWx5IHdoaWNoIGNvbnRleHQgYXBwbGllcyBhcworLy8vIHdlIGhhdmUgdGhlIGNhbGwgY2hhaW4uICBXZSBtYXkgY29tcHV0ZSB0aGUgZXhhY3QgKHJhdGhlcgorLy8vIHRoYW4gY292ZXJpbmcgc3VwZXJzZXQpIHNldCBvZiBmb2xsb3dpbmcgdG9rZW5zLgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGdyYW1tYXI6CisvLy8KKy8vLyBzdGF0IDogSUQgJz0nIGV4cHIgJzsnICAgICAgLy8gRk9MTE9XKHN0YXQpPT17RU9GfQorLy8vICAgICAgfCAicmV0dXJuIiBleHByICcuJworLy8vICAgICAgOworLy8vIGV4cHIgOiBhdG9tICgnKycgYXRvbSkqIDsgICAvLyBGT0xMT1coZXhwcik9PXsnOycsJy4nLCcpJ30KKy8vLyBhdG9tIDogSU5UICAgICAgICAgICAgICAgICAgLy8gRk9MTE9XKGF0b20pPT17JysnLCcpJywnOycsJy4nfQorLy8vICAgICAgfCAnKCcgZXhwciAnKScKKy8vLyAgICAgIDsKKy8vLworLy8vIFRoZSBGT0xMT1cgc2V0cyBhcmUgYWxsIGluY2x1c2l2ZSB3aGVyZWFzIGNvbnRleHQtc2Vuc2l0aXZlCisvLy8gRk9MTE9XIHNldHMgYXJlIHByZWNpc2VseSB3aGF0IGNvdWxkIGZvbGxvdyBhIHJ1bGUgcmVmZXJlbmNlLgorLy8vIEZvciBpbnB1dCBpbnB1dCAiaT0oMyk7IiwgaGVyZSBpcyB0aGUgZGVyaXZhdGlvbjoKKy8vLworLy8vIHN0YXQgPT4gSUQgJz0nIGV4cHIgJzsnCisvLy8gICAgICA9PiBJRCAnPScgYXRvbSAoJysnIGF0b20pKiAnOycKKy8vLyAgICAgID0+IElEICc9JyAnKCcgZXhwciAnKScgKCcrJyBhdG9tKSogJzsnCisvLy8gICAgICA9PiBJRCAnPScgJygnIGF0b20gJyknICgnKycgYXRvbSkqICc7JworLy8vICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JworLy8vICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICc7JworLy8vCisvLy8gQXQgdGhlICIzIiB0b2tlbiwgeW91J2QgaGF2ZSBhIGNhbGwgY2hhaW4gb2YKKy8vLworLy8vICAgc3RhdCAtPiBleHByIC0+IGF0b20gLT4gZXhwciAtPiBhdG9tCisvLy8KKy8vLyBXaGF0IGNhbiBmb2xsb3cgdGhhdCBzcGVjaWZpYyBuZXN0ZWQgcmVmIHRvIGF0b20/ICBFeGFjdGx5ICcpJworLy8vIGFzIHlvdSBjYW4gc2VlIGJ5IGxvb2tpbmcgYXQgdGhlIGRlcml2YXRpb24gb2YgdGhpcyBzcGVjaWZpYworLy8vIGlucHV0LiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSBGT0xMT1coYXRvbSk9eycrJywnKScsJzsnLCcuJ30uCisvLy8KKy8vLyBZb3Ugd2FudCB0aGUgZXhhY3QgdmlhYmxlIHRva2VuIHNldCB3aGVuIHJlY292ZXJpbmcgZnJvbSBhCisvLy8gdG9rZW4gbWlzbWF0Y2guICBVcG9uIHRva2VuIG1pc21hdGNoLCBpZiBMQSgxKSBpcyBtZW1iZXIgb2YKKy8vLyB0aGUgdmlhYmxlIG5leHQgdG9rZW4gc2V0LCB0aGVuIHlvdSBrbm93IHRoZXJlIGlzIG1vc3QgbGlrZWx5CisvLy8gYSBtaXNzaW5nIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uICAiSW5zZXJ0IiBvbmUgYnkganVzdCBub3QKKy8vLyB0aHJvd2luZyBhbiBleGNlcHRpb24uCisvLy8KK3N0YXRpYyBwQU5UTFIzX0JJVFNFVAkJCitjb21wdXRlQ1NSdWxlRm9sbG93CSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplcikKK3sKKyAgICByZXR1cm4gICByZWNvZ25pemVyLT5jb21iaW5lRm9sbG93cyhyZWNvZ25pemVyLCBBTlRMUjNfRkFMU0UpOworfQorCisvLy8gQ29tcHV0ZSB0aGUgY3VycmVudCBmb2xsb3dzZXQgZm9yIHRoZSBpbnB1dCBzdHJlYW0uCisvLy8KK3N0YXRpYyBwQU5UTFIzX0JJVFNFVAkJCitjb21iaW5lRm9sbG93cwkJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBBTlRMUjNfQk9PTEVBTiBleGFjdCkKK3sKKyAgICBwQU5UTFIzX0JJVFNFVAlmb2xsb3dTZXQ7CisgICAgcEFOVExSM19CSVRTRVQJbG9jYWxGb2xsb3dTZXQ7CisgICAgQU5UTFIzX1VJTlQzMgl0b3A7CisgICAgQU5UTFIzX1VJTlQzMglpOworCisgICAgdG9wCT0gcmVjb2duaXplci0+c3RhdGUtPmZvbGxvd2luZy0+c2l6ZShyZWNvZ25pemVyLT5zdGF0ZS0+Zm9sbG93aW5nKTsKKworICAgIGZvbGxvd1NldAkgICAgPSBhbnRscjNCaXRzZXROZXcoMCk7CisJbG9jYWxGb2xsb3dTZXQJPSBOVUxMOworCisgICAgZm9yIChpID0gdG9wOyBpPjA7IGktLSkKKyAgICB7CisJCWxvY2FsRm9sbG93U2V0ID0gYW50bHIzQml0c2V0TG9hZCgocEFOVExSM19CSVRTRVRfTElTVCkgcmVjb2duaXplci0+c3RhdGUtPmZvbGxvd2luZy0+Z2V0KHJlY29nbml6ZXItPnN0YXRlLT5mb2xsb3dpbmcsIGktMSkpOworCisJCWlmICAobG9jYWxGb2xsb3dTZXQgIT0gTlVMTCkKKwkJeworCQkJZm9sbG93U2V0LT5ib3JJblBsYWNlKGZvbGxvd1NldCwgbG9jYWxGb2xsb3dTZXQpOworCisJCQlpZgkoZXhhY3QgPT0gQU5UTFIzX1RSVUUpCisJCQl7CisJCQkJaWYJKGxvY2FsRm9sbG93U2V0LT5pc01lbWJlcihsb2NhbEZvbGxvd1NldCwgQU5UTFIzX0VPUl9UT0tFTl9UWVBFKSA9PSBBTlRMUjNfRkFMU0UpCisJCQkJeworCQkJCQkvLyBPbmx5IGxlYXZlIEVPUiBpbiB0aGUgc2V0IGlmIGF0IHRvcCAoc3RhcnQgcnVsZSk7IHRoaXMgbGV0cyB1cyBrbm93CisJCQkJCS8vIGlmIHdlIGhhdmUgdG8gaW5jbHVkZSB0aGUgZm9sbG93KHN0YXJ0IHJ1bGUpOyBJLkUuLCBFT0YKKwkJCQkJLy8KKwkJCQkJaWYJKGk+MSkKKwkJCQkJeworCQkJCQkJZm9sbG93U2V0LT5yZW1vdmUoZm9sbG93U2V0LCBBTlRMUjNfRU9SX1RPS0VOX1RZUEUpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWJyZWFrOwkvLyBDYW5ub3Qgc2VlIEVuZCBPZiBSdWxlIGZyb20gaGVyZSwganVzdCBkcm9wIG91dAorCQkJCX0KKwkJCX0KKwkJCWxvY2FsRm9sbG93U2V0LT5mcmVlKGxvY2FsRm9sbG93U2V0KTsKKwkJCWxvY2FsRm9sbG93U2V0ID0gTlVMTDsKKwkJfQorICAgIH0KKworCWlmCShsb2NhbEZvbGxvd1NldCAhPSBOVUxMKQorCXsKKwkJbG9jYWxGb2xsb3dTZXQtPmZyZWUobG9jYWxGb2xsb3dTZXQpOworCX0KKyAgICByZXR1cm4gIGZvbGxvd1NldDsKK30KKworLy8vIFN0YW5kYXJkL0V4YW1wbGUgZXJyb3IgZGlzcGxheSBtZXRob2QuCisvLy8gTm8gZ2VuZXJpYyBlcnJvciBtZXNzYWdlIGRpc3BsYXkgZnVuY2l0b24gY291ZGwgcG9zc2libHkgZG8gZXZlcnl0aGluZyBjb3JyZWN0bHkKKy8vLyBmb3IgYWxsIHBvc3NpYmxlIHBhcnNlcnMuIEhlbmNlIHlvdSBhcmUgcHJvdmlkZWQgd2l0aCB0aGlzIGV4YW1wbGUgcm91dGluZSwgd2hpY2gKKy8vLyB5b3Ugc2hvdWxkIG92ZXJyaWRlIGluIHlvdXIgcGFyc2VyL3RyZWUgcGFyc2VyIHRvIGRvIGFzIHlvdSB3aWxsLgorLy8vCisvLy8gSGVyZSB3ZSBkZXBhcnQgc29tZXdoYXQgZnJvbSB0aGUgSmF2YSBydW50aW1lIGFzIHRoYXQgaGFzIG5vdyBzcGxpdCB1cCBhIGxvdAorLy8vIG9mIHRoZSBlcnJvciBkaXNwbGF5IHJvdXRpbmVzIGludG8gc3BlYXJhdGUgdW5pdHMuIEhvd2V2ZXIsIHRoZXIgaXMgbGl0dGxlIGFkdmFudGFnZQorLy8vIHRvIHRoaXMgaW4gdGhlIEMgdmVyc2lvbiBhcyB5b3Ugd2lsbCBwcm9iYWJseSBpbXBsZW1lbnQgYWxsIHN1Y2ggcm91dGluZXMgYXMgYSAKKy8vLyBzZXBhcmF0ZSB0cmFuc2xhdGlvbiB1bml0LCByYXRoZXIgdGhhbiBpbnN0YWxsIHRoZW0gYWxsIGFzIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucworLy8vIGluIHRoZSBiYXNlIHJlY29nbml6ZXIuCisvLy8KK3N0YXRpYyB2b2lkCQkJCitkaXNwbGF5UmVjb2duaXRpb25FcnJvcgkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfVUlOVDggKiB0b2tlbk5hbWVzKQoreworCXBBTlRMUjNfUEFSU0VSCQkJcGFyc2VyOworCXBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisJcEFOVExSM19JTlRfU1RSRUFNCSAgICBpczsKKwlwQU5UTFIzX1NUUklORwkJCXR0ZXh0OworCXBBTlRMUjNfU1RSSU5HCQkJZnRleHQ7CisJcEFOVExSM19FWENFUFRJT04JICAgIGV4OworCXBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHRoZVRva2VuOworCXBBTlRMUjNfQkFTRV9UUkVFCSAgICB0aGVCYXNlVHJlZTsKKwlwQU5UTFIzX0NPTU1PTl9UUkVFCSAgICB0aGVDb21tb25UcmVlOworCisJLy8gUmV0cmlldmUgc29tZSBpbmZvIGZvciBlYXN5IHJlYWRpbmcuCisJLy8KKwlleAkgICAgPQkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbjsKKwl0dGV4dCAgID0JCU5VTEw7CisKKwkvLyBTZWUgaWYgdGhlcmUgaXMgYSAnZmlsZW5hbWUnIHdlIGNhbiB1c2UKKwkvLworCWlmCShleC0+c3RyZWFtTmFtZSA9PSBOVUxMKQorCXsKKwkJaWYJKCgocEFOVExSM19DT01NT05fVE9LRU4pKGV4LT50b2tlbikpLT50eXBlID09IEFOVExSM19UT0tFTl9FT0YpCisJCXsKKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIi1lbmQgb2YgaW5wdXQtKCIpOworCQl9CisJCWVsc2UKKwkJeworCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLXVua25vd24gc291cmNlLSgiKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlmdGV4dCA9IGV4LT5zdHJlYW1OYW1lLT50bzgoZXgtPnN0cmVhbU5hbWUpOworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIlcygiLCBmdGV4dC0+Y2hhcnMpOworCX0KKworCS8vIE5leHQgY29tZXMgdGhlIGxpbmUgbnVtYmVyCisJLy8KKworCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiVkKSAiLCByZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5saW5lKTsKKwlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBlcnJvciAlZCA6ICVzIiwgCisJCQkJCQkJCQkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dHlwZSwKKwkJCQkJKHBBTlRMUjNfVUlOVDgpCSAgIChyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5tZXNzYWdlKSk7CisKKworCS8vIEhvdyB3ZSBkZXRlcm1pbmUgdGhlIG5leHQgcGllY2UgaXMgZGVwZW5kZW50IG9uIHdoaWNoIHRoaW5nIHJhaXNlZCB0aGUKKwkvLyBlcnJvci4KKwkvLworCXN3aXRjaAkocmVjb2duaXplci0+dHlwZSkKKwl7CisJY2FzZQlBTlRMUjNfVFlQRV9QQVJTRVI6CisKKwkJLy8gUHJlcGFyZSB0aGUga25vd2xlZGdlIHdlIGtub3cgd2UgaGF2ZQorCQkvLworCQlwYXJzZXIJICAgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQl0cGFyc2VyCSAgICA9IE5VTEw7CisJCWlzCQkJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisJCXRoZVRva2VuICAgID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKShyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT50b2tlbik7CisJCXR0ZXh0CSAgICA9IHRoZVRva2VuLT50b1N0cmluZyh0aGVUb2tlbik7CisKKwkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBhdCBvZmZzZXQgJWQiLCByZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5jaGFyUG9zaXRpb25JbkxpbmUpOworCQlpZiAgKHRoZVRva2VuICE9IE5VTEwpCisJCXsKKwkJCWlmICh0aGVUb2tlbi0+dHlwZSA9PSBBTlRMUjNfVE9LRU5fRU9GKQorCQkJeworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiwgYXQgPEVPRj4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBHdWFyZCBhZ2FpbnN0IG51bGwgdGV4dCBpbiBhIHRva2VuCisJCQkJLy8KKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJcbiAgICBuZWFyICVzXG4gICAgIiwgdHRleHQgPT0gTlVMTCA/IChwQU5UTFIzX1VJTlQ4KSI8bm8gdGV4dCBmb3IgdGhlIHRva2VuPiIgOiB0dGV4dC0+Y2hhcnMpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQl0cGFyc2VyCQk9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQlwYXJzZXIJCT0gTlVMTDsKKwkJaXMJCQk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisJCXRoZUJhc2VUcmVlCT0gKHBBTlRMUjNfQkFTRV9UUkVFKShyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT50b2tlbik7CisJCXR0ZXh0CQk9IHRoZUJhc2VUcmVlLT50b1N0cmluZ1RyZWUodGhlQmFzZVRyZWUpOworCisJCWlmICAodGhlQmFzZVRyZWUgIT0gTlVMTCkKKwkJeworCQkJdGhlQ29tbW9uVHJlZQk9IChwQU5UTFIzX0NPTU1PTl9UUkVFKQkgICAgdGhlQmFzZVRyZWUtPnN1cGVyOworCisJCQlpZgkodGhlQ29tbW9uVHJlZSAhPSBOVUxMKQorCQkJeworCQkJCXRoZVRva2VuCT0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOKSAgICB0aGVCYXNlVHJlZS0+Z2V0VG9rZW4odGhlQmFzZVRyZWUpOworCQkJfQorCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiLCBhdCBvZmZzZXQgJWQiLCB0aGVCYXNlVHJlZS0+Z2V0Q2hhclBvc2l0aW9uSW5MaW5lKHRoZUJhc2VUcmVlKSk7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIsIG5lYXIgJXMiLCB0dGV4dC0+Y2hhcnMpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gZGlzcGxheVJlY29nbml0aW9uRXJyb3IgY2FsbGVkIGJ5IHVua25vd24gcGFyc2VyIHR5cGUgLSBwcm92aWRlIG92ZXJyaWRlIGZvciB0aGlzIGZ1bmN0aW9uXG4iKTsKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwkvLyBBbHRob3VnaCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBnZW5lcmFsbHkgYmUgcHJvdmlkZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLCB0aGlzIG9uZQorCS8vIHNob3VsZCBiZSBhcyBoZWxwZnVsIGFzIHBvc3NpYmxlIGZvciBncmFtbWFyIGRldmVsb3BlcnMgYW5kIHNlcnZlIGFzIGFuIGV4YW1wbGUKKwkvLyBvZiB3aGF0IHlvdSBjYW4gZG8gd2l0aCBlYWNoIGV4Y2VwdGlvbiB0eXBlLiBJbiBnZW5lcmFsLCB3aGVuIHlvdSBtYWtlIHVwIHlvdXIKKwkvLyAncmVhbCcgaGFuZGxlciwgeW91IHNob3VsZCBkZWJ1ZyB0aGUgcm91dGluZSB3aXRoIGFsbCBwb3NzaWJsZSBlcnJvcnMgeW91IGV4cGVjdAorCS8vIHdoaWNoIHdpbGwgdGhlbiBsZXQgeW91IGJlIGFzIHNwZWNpZmljIGFzIHBvc3NpYmxlIGFib3V0IGFsbCBjaXJjdW1zdGFuY2VzLgorCS8vCisJLy8gTm90ZSB0aGF0IGluIHRoZSBnZW5lcmFsIGNhc2UsIGVycm9ycyB0aHJvd24gYnkgdHJlZSBwYXJzZXJzIGluZGljYXRlIGEgcHJvYmxlbQorCS8vIHdpdGggdGhlIG91dHB1dCBvZiB0aGUgcGFyc2VyIG9yIHdpdGggdGhlIHRyZWUgZ3JhbW1hciBpdHNlbGYuIFRoZSBqb2Igb2YgdGhlIHBhcnNlcgorCS8vIGlzIHRvIHByb2R1Y2UgYSBwZXJmZWN0IChpbiB0cmF2ZXJzYWwgdGVybXMpIHN5bnRhY3RpY2FsbHkgY29ycmVjdCB0cmVlLCBzbyBlcnJvcnMKKwkvLyBhdCB0aGF0IHN0YWdlIHNob3VsZCByZWFsbHkgYmUgc2VtYW50aWMgZXJyb3JzIHRoYXQgeW91ciBvd24gY29kZSBkZXRlcm1pbmVzIGFuZCBoYW5kbGVzCisJLy8gaW4gd2hhdGV2ZXIgd2F5IGlzIGFwcHJvcHJpYXRlLgorCS8vCisJc3dpdGNoICAoZXgtPnR5cGUpCisJeworCWNhc2UJQU5UTFIzX1VOV0FOVEVEX1RPS0VOX0VYQ0VQVElPTjoKKworCQkvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb2duaXplciB3YXMgZmVkIGEgdG9rZW4gd2hpY2ggc2Vlc20gdG8gYmUKKwkJLy8gc3B1cmlvdXMgaW5wdXQuIFdlIGNhbiBkZXRlY3QgdGhpcyB3aGVuIHRoZSB0b2tlbiB0aGF0IGZvbGxvd3MKKwkJLy8gdGhpcyB1bndhbnRlZCB0b2tlbiB3b3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBzeW50YWN0aWNhbGx5CisJCS8vIGNvcnJlY3Qgc3RyZWFtLiBUaGVuIHdlIGNhbiBzZWUgdGhhdCB0aGUgdG9rZW4gd2UgYXJlIGxvb2tpbmcgYXQKKwkJLy8gaXMganVzdCBzb21ldGhpbmcgdGhhdCBzaG91bGQgbm90IGJlIHRoZXJlIGFuZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbi4KKwkJLy8KKwkJaWYJKHRva2VuTmFtZXMgPT0gTlVMTCkKKwkJeworCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogRXh0cmFuZW91cyBpbnB1dC4uLiIpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYJKGV4LT5leHBlY3RpbmcgPT0gQU5UTFIzX1RPS0VOX0VPRikKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBFeHRyYW5lb3VzIGlucHV0IC0gZXhwZWN0ZWQgPEVPRj5cbiIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IEV4dHJhbmVvdXMgaW5wdXQgLSBleHBlY3RlZCAlcyAuLi5cbiIsIHRva2VuTmFtZXNbZXgtPmV4cGVjdGluZ10pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZQlBTlRMUjNfTUlTU0lOR19UT0tFTl9FWENFUFRJT046CisKKwkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgZGV0ZWN0ZWQgdGhhdCB0aGUgdG9rZW4gd2UganVzdAorCQkvLyBoaXQgd291bGQgYmUgdmFsaWQgc3ludGFjdGljYWxseSBpZiBwcmVjZWVkZWQgYnkgYSBwYXJ0aWN1bGFyIAorCQkvLyB0b2tlbi4gUGVyaGFwcyBhIG1pc3NpbmcgJzsnIGF0IGxpbmUgZW5kIG9yIGEgbWlzc2luZyAnLCcgaW4gYW4KKwkJLy8gZXhwcmVzc2lvbiBsaXN0LCBhbmQgc3VjaCBsaWtlLgorCQkvLworCQlpZgkodG9rZW5OYW1lcyA9PSBOVUxMKQorCQl7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nIHRva2VuICglZCkuLi5cbiIsIGV4LT5leHBlY3RpbmcpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYJKGV4LT5leHBlY3RpbmcgPT0gQU5UTFIzX1RPS0VOX0VPRikKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nIDxFT0Y+XG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBNaXNzaW5nICVzIFxuIiwgdG9rZW5OYW1lc1tleC0+ZXhwZWN0aW5nXSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlCUFOVExSM19SRUNPR05JVElPTl9FWENFUFRJT046CisKKwkJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZWQgYSB0b2tlbgorCQkvLyBpbiB0aGUgaW5wdXQgdGhhdCB3YXMgbm90IHByZWRpY3RlZC4gVGhpcyBpcyB0aGUgYmFzaWMgZXhjZXB0aW9uIHR5cGUgCisJCS8vIGZyb20gd2hpY2ggYWxsIG90aGVycyBhcmUgZGVyaXZlZC4gU28gd2UgYXNzdW1lIGl0IHdhcyBhIHN5bnRheCBlcnJvci4KKwkJLy8gWW91IG1heSBnZXQgdGhpcyBpZiB0aGVyZSBhcmUgbm90IG1vcmUgdG9rZW5zIGFuZCBtb3JlIGFyZSBuZWVkZWQKKwkJLy8gdG8gY29tcGxldGUgYSBwYXJzZSBmb3IgaW5zdGFuY2UuCisJCS8vCisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiA6IHN5bnRheCBlcnJvci4uLlxuIik7ICAgIAorCQlicmVhazsKKworCWNhc2UgICAgQU5UTFIzX01JU01BVENIRURfVE9LRU5fRVhDRVBUSU9OOgorCisJCS8vIFdlIHdlcmUgZXhwZWN0aW5nIHRvIHNlZSBvbmUgdGhpbmcgYW5kIGdvdCBhbm90aGVyLiBUaGlzIGlzIHRoZQorCQkvLyBtb3N0IGNvbW1vbiBlcnJvciBpZiB3ZSBjb3VkbCBub3QgZGV0ZWN0IGEgbWlzc2luZyBvciB1bndhbnRlZCB0b2tlbi4KKwkJLy8gSGVyZSB5b3UgY2FuIHNwZW5kIHlvdXIgZWZmb3J0cyB0bworCQkvLyBkZXJpdmUgbW9yZSB1c2VmdWwgZXJyb3IgbWVzc2FnZXMgYmFzZWQgb24gdGhlIGV4cGVjdGVkCisJCS8vIHRva2VuIHNldCBhbmQgdGhlIGxhc3QgdG9rZW4gYW5kIHNvIG9uLiBUaGUgZXJyb3IgZm9sbG93aW5nCisJCS8vIGJpdG1hcHMgZG8gYSBnb29kIGpvYiBvZiByZWR1Y2luZyB0aGUgc2V0IHRoYXQgd2Ugd2VyZSBsb29raW5nCisJCS8vIGZvciBkb3duIHRvIHNvbWV0aGluZyBzbWFsbC4gS25vd2luZyB3aGF0IHlvdSBhcmUgcGFyc2luZyBtYXkgYmUKKwkJLy8gYWJsZSB0byBhbGxvdyB5b3UgdG8gYmUgZXZlbiBtb3JlIHNwZWNpZmljIGFib3V0IGFuIGVycm9yLgorCQkvLworCQlpZgkodG9rZW5OYW1lcyA9PSBOVUxMKQorCQl7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBzeW50YXggZXJyb3IuLi5cbiIpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYJKGV4LT5leHBlY3RpbmcgPT0gQU5UTFIzX1RPS0VOX0VPRikKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBleHBlY3RlZCA8RU9GPlxuIik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogZXhwZWN0ZWQgJXMgLi4uXG4iLCB0b2tlbk5hbWVzW2V4LT5leHBlY3RpbmddKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UJQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOgorCisJCS8vIFdlIGNvdWxkIG5vdCBwaWNrIGFueSBhbHQgZGVjaXNpb24gZnJvbSB0aGUgaW5wdXQgZ2l2ZW4KKwkJLy8gc28gZ29kIGtub3dzIHdoYXQgaGFwcGVuZWQgLSBob3dldmVyIHdoZW4geW91IGV4YW1pbmUgeW91ciBncmFtbWFyLAorCQkvLyB5b3Ugc2hvdWxkLiBJdCBtZWFucyB0aGF0IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgY3VycmVudCB0b2tlbiBvY2N1cnJlZAorCQkvLyB0aGF0IHRoZSBERkEgaW5kaWNhdGVzIG5vd2hlcmUgdG8gZ28gZnJvbSBoZXJlLgorCQkvLworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBjYW5ub3QgbWF0Y2ggdG8gYW55IHByZWRpY3RlZCBpbnB1dC4uLlxuIik7CisKKwkJYnJlYWs7CisKKwljYXNlCUFOVExSM19NSVNNQVRDSEVEX1NFVF9FWENFUFRJT046CisKKwkJeworCQkJQU5UTFIzX1VJTlQzMgkgIGNvdW50OworCQkJQU5UTFIzX1VJTlQzMgkgIGJpdDsKKwkJCUFOVExSM19VSU5UMzIJICBzaXplOworCQkJQU5UTFIzX1VJTlQzMgkgIG51bWJpdHM7CisJCQlwQU5UTFIzX0JJVFNFVAkgIGVyckJpdHM7CisKKwkJCS8vIFRoaXMgbWVhbnMgd2Ugd2VyZSBhYmxlIHRvIGRlYWwgd2l0aCBvbmUgb2YgYSBzZXQgb2YKKwkJCS8vIHBvc3NpYmxlIHRva2VucyBhdCB0aGlzIHBvaW50LCBidXQgd2UgZGlkIG5vdCBzZWUgYW55CisJCQkvLyBtZW1iZXIgb2YgdGhhdCBzZXQuCisJCQkvLworCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiIDogdW5leHBlY3RlZCBpbnB1dC4uLlxuICBleHBlY3RlZCBvbmUgb2YgOiAiKTsKKworCQkJLy8gV2hhdCB0b2tlbnMgY291bGQgd2UgaGF2ZSBhY2NlcHRlZCBhdCB0aGlzIHBvaW50IGluIHRoZQorCQkJLy8gcGFyc2U/CisJCQkvLworCQkJY291bnQgICA9IDA7CisJCQllcnJCaXRzID0gYW50bHIzQml0c2V0TG9hZAkJKGV4LT5leHBlY3RpbmdTZXQpOworCQkJbnVtYml0cyA9IGVyckJpdHMtPm51bUJpdHMJCShlcnJCaXRzKTsKKwkJCXNpemUgICAgPSBlcnJCaXRzLT5zaXplCQkJKGVyckJpdHMpOworCisJCQlpZiAgKHNpemUgPiAwKQorCQkJeworCQkJCS8vIEhvd2V2ZXIgbWFueSB0b2tlbnMgd2UgY291bGQgaGF2ZSBkZWFsdCB3aXRoIGhlcmUsIGl0IGlzIHVzdWFsbHkKKwkJCQkvLyBub3QgdXNlZnVsIHRvIHByaW50IEFMTCBvZiB0aGUgc2V0IGhlcmUuIEkgYXJiaXRyYXJpbHkgY2hvc2UgOAorCQkJCS8vIGhlcmUsIGJ1dCB5b3Ugc2hvdWxkIGRvIHdoYXRldmVyIG1ha2VzIHNlbnNlIGZvciB5b3Ugb2YgY291cnNlLgorCQkJCS8vIE5vIHRva2VuIG51bWJlciAwLCBzbyBsb29rIGZvciBiaXQgMSBhbmQgb24uCisJCQkJLy8KKwkJCQlmb3IJKGJpdCA9IDE7IGJpdCA8IG51bWJpdHMgJiYgY291bnQgPCA4ICYmIGNvdW50IDwgc2l6ZTsgYml0KyspCisJCQkJeworCQkJCQkvLyBUT0RPOiBUaGlzIGRvZXNuO3QgbG9vayByaWdodCAtIHNob3VsZCBiZSBhc2tpbmcgaWYgdGhlIGJpdCBpcyBzZXQhIQorCQkJCQkvLworCQkJCQlpZiAgKHRva2VuTmFtZXNbYml0XSkKKwkJCQkJeworCQkJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiJXMlcyIsIGNvdW50ID4gMCA/ICIsICIgOiAiIiwgdG9rZW5OYW1lc1tiaXRdKTsgCisJCQkJCQljb3VudCsrOworCQkJCQl9CisJCQkJfQorCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIlxuIik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiQWN0dWFsbHkgZHVkZSwgd2UgZGlkbid0IHNlZW0gdG8gYmUgZXhwZWN0aW5nIGFueXRoaW5nIGhlcmUsIG9yIGF0IGxlYXN0XG4iKTsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJJIGNvdWxkIG5vdCB3b3JrIG91dCB3aGF0IEkgd2FzIGV4cGVjdGluZywgbGlrZSBzbyBtYW55IG9mIHVzIHRoZXNlIGRheXMhXG4iKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UJQU5UTFIzX0VBUkxZX0VYSVRfRVhDRVBUSU9OOgorCisJCS8vIFdlIGVudGVyZWQgYSBsb29wIHJlcXVpcmluZyBhIG51bWJlciBvZiB0b2tlbiBzZXF1ZW5jZXMKKwkJLy8gYnV0IGZvdW5kIGEgdG9rZW4gdGhhdCBlbmRlZCB0aGF0IHNlcXVlbmNlIGVhcmxpZXIgdGhhbgorCQkvLyB3ZSBzaG91bGQgaGF2ZSBkb25lLgorCQkvLworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBtaXNzaW5nIGVsZW1lbnRzLi4uXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8vIFdlIGRvbid0IGhhbmRsZSBhbnkgb3RoZXIgZXhjZXB0aW9ucyBoZXJlLCBidXQgeW91IGNhbgorCQkvLyBpZiB5b3Ugd2lzaC4gSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiB0aGF0IGhpdHMgdGhpcyBwb2ludAorCQkvLyB0aGVuIHdlIGFyZSBqdXN0IGdvaW5nIHRvIHJlcG9ydCB3aGF0IHdlIGtub3cgYWJvdXQgdGhlCisJCS8vIHRva2VuLgorCQkvLworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIgOiBzeW50YXggbm90IHJlY29nbml6ZWQuLi5cbiIpOworCQlicmVhazsKKwl9CisKKwkvLyBIZXJlIHlvdSBoYXZlIHRoZSB0b2tlbiB0aGF0IHdhcyBpbiBlcnJvciB3aGljaCBpZiB0aGlzIGlzCisJLy8gdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHdpbGwgdGVsbCB5b3UgdGhlIGxpbmUgYW5kIG9mZnNldAorCS8vIGFuZCBhbHNvIHJlY29yZCB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlCisJLy8gaW5wdXQgc3RyZWFtLiBZb3UgY291bGQgdGhlcmVmb3JlIHByaW50IHRoZSBzb3VyY2UgbGluZSBhbmQgc28gb24uCisJLy8gR2VuZXJhbGx5IHRob3VnaCwgSSB3b3VsZCBleHBlY3QgdGhhdCB5b3VyIGxleGVyL3BhcnNlciB3aWxsIGtlZXAKKwkvLyBpdHMgb3duIG1hcCBvZiBsaW5lcyBhbmQgc291cmNlIHBvaW50ZXJzIG9yIHdoYXRldmVyIGFzIHRoZXJlCisJLy8gYXJlIGEgbG90IG9mIHNwZWNpZmljIHRoaW5ncyB5b3UgbmVlZCB0byBrbm93IGFib3V0IHRoZSBpbnB1dAorCS8vIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoYXQuCisJLy8gSGVyZSBpcyB3aGVyZSB5b3UgZG8gaXQgdGhvdWdoIDotKS4KKwkvLworfQorCisvLy8gUmV0dXJuIGhvdyBtYW55IHN5bnRheCBlcnJvcnMgd2VyZSBkZXRlY3RlZCBieSB0aGlzIHJlY29nbml6ZXIKKy8vLworc3RhdGljIEFOVExSM19VSU5UMzIKK2dldE51bWJlck9mU3ludGF4RXJyb3JzKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpCit7CisJcmV0dXJuCXJlY29nbml6ZXItPnN0YXRlLT5lcnJvckNvdW50OworfQorCisvLy8gUmVjb3ZlciBmcm9tIGFuIGVycm9yIGZvdW5kIG9uIHRoZSBpbnB1dCBzdHJlYW0uICBNb3N0bHkgdGhpcyBpcworLy8vIE5vVmlhYmxlQWx0IGV4Y2VwdGlvbnMsIGJ1dCBjb3VsZCBiZSBhIG1pc21hdGNoZWQgdG9rZW4gdGhhdAorLy8vIHRoZSBtYXRjaCgpIHJvdXRpbmUgY291bGQgbm90IHJlY292ZXIgZnJvbS4KKy8vLworc3RhdGljIHZvaWQJCQkKK3JlY292ZXIJCQkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpCit7CisgICAgLy8gVXNlZCB0byBjb21wdXRlIHRoZSBmb2xsb3cgc2V0IG9mIHRva2VucworICAgIC8vCisgICAgcEFOVExSM19CSVRTRVQJCQlmb2xsb3dTZXQ7CisgICAgcEFOVExSM19QQVJTRVIJCQlwYXJzZXI7CisgICAgcEFOVExSM19UUkVFX1BBUlNFUgkgICAgdHBhcnNlcjsKKyAgICBwQU5UTFIzX0lOVF9TVFJFQU0JICAgIGlzOworCisgICAgc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorICAgIHsKKwkJY2FzZQlBTlRMUjNfVFlQRV9QQVJTRVI6CisKKwkJcGFyc2VyICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJdHBhcnNlcgk9IE5VTEw7CisJCWlzCQk9IHBhcnNlci0+dHN0cmVhbS0+aXN0cmVhbTsKKworCWJyZWFrOworCisgICAgY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQl0cGFyc2VyID0gKHBBTlRMUjNfVFJFRV9QQVJTRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCXBhcnNlcgk9IE5VTEw7CisJCWlzCQk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJICAgIAorCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gcmVjb3ZlciBjYWxsZWQgYnkgdW5rbm93biBwYXJzZXIgdHlwZSAtIHByb3ZpZGUgb3ZlcnJpZGUgZm9yIHRoaXMgZnVuY3Rpb25cbiIpOworCQlyZXR1cm47CisKKwlicmVhazsKKyAgICB9CisKKwkvLyBBcmUgd2UgYWJvdXQgdG8gcmVwZWF0IHRoZSBzYW1lIGVycm9yPworCS8vCisgICAgaWYJKHJlY29nbml6ZXItPnN0YXRlLT5sYXN0RXJyb3JJbmRleCA9PSBpcy0+aW5kZXgoaXMpKQorICAgIHsKKwkJLy8gVGhlIGxhc3QgZXJyb3Igd2FzIGF0IHRoZSBzYW1lIHRva2VuIGluZGV4IHBvaW50LiBUaGlzIG11c3QgYmUgYSBjYXNlCisJCS8vIHdoZXJlIExUKDEpIGlzIGluIHRoZSByZWNvdmVyeSB0b2tlbiBzZXQgc28gbm90aGluZyBpcworCQkvLyBjb25zdW1lZC4gQ29uc3VtZSBhIHNpbmdsZSB0b2tlbiBzbyBhdCBsZWFzdCB0byBwcmV2ZW50CisJCS8vIGFuIGluZmluaXRlIGxvb3A7IHRoaXMgaXMgYSBmYWlsc2FmZS4KKwkJLy8KKwkJaXMtPmNvbnN1bWUoaXMpOworICAgIH0KKworICAgIC8vIFJlY29yZCBlcnJvciBpbmRleCBwb3NpdGlvbgorICAgIC8vCisgICAgcmVjb2duaXplci0+c3RhdGUtPmxhc3RFcnJvckluZGV4CSA9IGlzLT5pbmRleChpcyk7CisgICAgCisgICAgLy8gV29yayBvdXQgdGhlIGZvbGxvd3Mgc2V0IGZvciBlcnJvciByZWNvdmVyeQorICAgIC8vCisgICAgZm9sbG93U2V0CT0gcmVjb2duaXplci0+Y29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQocmVjb2duaXplcik7CisKKyAgICAvLyBDYWxsIHJlc3luYyBob29rIChmb3IgZGVidWdnZXJzIGFuZCBzbyBvbikKKyAgICAvLworICAgIHJlY29nbml6ZXItPmJlZ2luUmVzeW5jKHJlY29nbml6ZXIpOworCisgICAgLy8gQ29uc3VtZSB0b2tlbnMgdW50aWwgd2UgaGF2ZSByZXN5bmNlZCB0byBzb21ldGhpbmcgaW4gdGhlIGZvbGxvd3Mgc2V0CisgICAgLy8KKyAgICByZWNvZ25pemVyLT5jb25zdW1lVW50aWxTZXQocmVjb2duaXplciwgZm9sbG93U2V0KTsKKworICAgIC8vIEVuZCByZXN5bmMgaG9vayAKKyAgICAvLworICAgIHJlY29nbml6ZXItPmVuZFJlc3luYyhyZWNvZ25pemVyKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIHRlbXBvcmFyeSBiaXRzZXQgd2UgcHJvZHVjZWQuCisgICAgLy8KKyAgICBmb2xsb3dTZXQtPmZyZWUoZm9sbG93U2V0KTsKKworICAgIC8vIFJlc2V0IHRoZSBpbkVycm9yIGZsYWcgc28gd2UgZG9uJ3QgcmUtcmVwb3J0IHRoZSBleGNlcHRpb24KKyAgICAvLworICAgIHJlY29nbml6ZXItPnN0YXRlLT5lcnJvcgk9IEFOVExSM19GQUxTRTsKKyAgICByZWNvZ25pemVyLT5zdGF0ZS0+ZmFpbGVkCT0gQU5UTFIzX0ZBTFNFOworfQorCisKKy8vLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhIHNpbmdsZSBtaXNzaW5nIG9yIGV4dHJhIHRva2VuLgorLy8vCisvLy8gRVhUUkEgVE9LRU4KKy8vLworLy8vIExBKDEpIGlzIG5vdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gIElmIExBKDIpIGhhcyB0aGUgcmlnaHQgdG9rZW4sCisvLy8gaG93ZXZlciwgdGhlbiBhc3N1bWUgTEEoMSkgaXMgc29tZSBleHRyYSBzcHVyaW91cyB0b2tlbi4gIERlbGV0ZSBpdAorLy8vIGFuZCBMQSgyKSBhcyBpZiB3ZSB3ZXJlIGRvaW5nIGEgbm9ybWFsIG1hdGNoKCksIHdoaWNoIGFkdmFuY2VzIHRoZQorLy8vIGlucHV0LgorLy8vCisvLy8gTUlTU0lORyBUT0tFTgorLy8vCisvLy8gSWYgY3VycmVudCB0b2tlbiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBjb3VsZCBjb21lIGFmdGVyCisvLy8gdHR5cGUgdGhlbiBpdCBpcyBvayB0byAiaW5zZXJ0IiB0aGUgbWlzc2luZyB0b2tlbiwgZWxzZSB0aHJvdworLy8vIGV4Y2VwdGlvbiBGb3IgZXhhbXBsZSwgSW5wdXQgImk9KDM7IiBpcyBjbGVhcmx5IG1pc3NpbmcgdGhlCisvLy8gJyknLiAgV2hlbiB0aGUgcGFyc2VyIHJldHVybnMgZnJvbSB0aGUgbmVzdGVkIGNhbGwgdG8gZXhwciwgaXQKKy8vLyB3aWxsIGhhdmUgY2FsbCBjaGFpbjoKKy8vLworLy8vICAgIHN0YXQgLT4gZXhwciAtPiBhdG9tCisvLy8KKy8vLyBhbmQgaXQgd2lsbCBiZSB0cnlpbmcgdG8gbWF0Y2ggdGhlICcpJyBhdCB0aGlzIHBvaW50IGluIHRoZQorLy8vIGRlcml2YXRpb246CisvLy8KKy8vLyAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgKCcrJyBhdG9tKSogJzsnCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy8vLyBtYXRjaCgpIHdpbGwgc2VlIHRoYXQgJzsnIGRvZXNuJ3QgbWF0Y2ggJyknIGFuZCByZXBvcnQgYQorLy8vIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IuICBUbyByZWNvdmVyLCBpdCBzZWVzIHRoYXQgTEEoMSk9PSc7JworLy8vIGlzIGluIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuIGZvbGxvdyB0aGUgJyknIHRva2VuCisvLy8gcmVmZXJlbmNlIGluIHJ1bGUgYXRvbS4gIEl0IGNhbiBhc3N1bWUgdGhhdCB5b3UgZm9yZ290IHRoZSAnKScuCisvLy8KKy8vLyBUaGUgZXhjZXB0aW9uIHRoYXQgd2FzIHBhc3NlZCBpbiwgaW4gdGhlIGphdmEgaW1wbGVtZW50YXRpb24gaXMKKy8vLyBzb3J0ZWQgaW4gdGhlIHJlY29nbml6ZXIgZXhjZXB0aW9uIHN0YWNrIGluIHRoZSBDIHZlcnNpb24uIFRvICd0aHJvdycgaXQgd2Ugc2V0IHRoZQorLy8vIGVycm9yIGZsYWcgYW5kIHJ1bGVzIGNhc2NhZGUgYmFjayB3aGVuIHRoaXMgaXMgc2V0LgorLy8vCitzdGF0aWMgdm9pZCAqCQorcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4gIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBBTlRMUjNfVUlOVDMyIHR0eXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdykKK3sKKwlwQU5UTFIzX1BBUlNFUgkJCSAgcGFyc2VyOworCXBBTlRMUjNfVFJFRV9QQVJTRVIJICAgICAgdHBhcnNlcjsKKwlwQU5UTFIzX0lOVF9TVFJFQU0JICAgICAgaXM7CisJdm9pZAkJCQkJKiBtYXRjaGVkU3ltYm9sOworCisKKworCXN3aXRjaAkocmVjb2duaXplci0+dHlwZSkKKwl7CisJY2FzZQlBTlRMUjNfVFlQRV9QQVJTRVI6CisKKwkJcGFyc2VyICA9IChwQU5UTFIzX1BBUlNFUikgKHJlY29nbml6ZXItPnN1cGVyKTsKKwkJdHBhcnNlcgk9IE5VTEw7CisJCWlzCT0gcGFyc2VyLT50c3RyZWFtLT5pc3RyZWFtOworCisJCWJyZWFrOworCisJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQl0cGFyc2VyID0gKHBBTlRMUjNfVFJFRV9QQVJTRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCXBhcnNlcgk9IE5VTEw7CisJCWlzCT0gdHBhcnNlci0+Y3Ruc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiQmFzZSByZWNvZ25pemVyIGZ1bmN0aW9uIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuIGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCXJldHVybiBOVUxMOworCisJCWJyZWFrOworCX0KKworCS8vIENyZWF0ZSBhbiBleGNlcHRpb24gaWYgd2UgbmVlZCBvbmUKKwkvLworCWlmCShyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uID09IE5VTEwpCisJeworCQlhbnRscjNSZWNvZ25pdGlvbkV4Y2VwdGlvbk5ldyhyZWNvZ25pemVyKTsKKwl9CisKKwkvLyBJZiB0aGUgbmV4dCB0b2tlbiBhZnRlciB0aGUgb25lIHdlIGFyZSBsb29raW5nIGF0IGluIHRoZSBpbnB1dCBzdHJlYW0KKwkvLyBpcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvciB0aGVuIHdlIHJlbW92ZSB0aGUgb25lIHdlIGhhdmUgZGlzY292ZXJlZAorCS8vIGZyb20gdGhlIHN0cmVhbSBieSBjb25zdW1pbmcgaXQsIHRoZW4gY29uc3VtZSB0aGlzIG5leHQgb25lIGFsb25nIHRvbyBhcworCS8vIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLgorCS8vCisJaWYJKCByZWNvZ25pemVyLT5taXNtYXRjaElzVW53YW50ZWRUb2tlbihyZWNvZ25pemVyLCBpcywgdHR5cGUpID09IEFOVExSM19UUlVFKQorCXsKKwkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+dHlwZQkJPSBBTlRMUjNfVU5XQU5URURfVE9LRU5fRVhDRVBUSU9OOworCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5tZXNzYWdlCT0gQU5UTFIzX1VOV0FOVEVEX1RPS0VOX0VYQ0VQVElPTl9OQU1FOworCisJCS8vIENhbGwgcmVzeW5jIGhvb2sgKGZvciBkZWJ1Z2dlcnMgYW5kIHNvIG9uKQorCQkvLworCQlpZgkocmVjb2duaXplci0+ZGVidWdnZXIgIT0gTlVMTCkKKwkJeworCQkJcmVjb2duaXplci0+ZGVidWdnZXItPmJlZ2luUmVzeW5jKHJlY29nbml6ZXItPmRlYnVnZ2VyKTsKKwkJfQorCisJCS8vICJkZWxldGUiIHRoZSBleHRyYSB0b2tlbgorCQkvLworCQlyZWNvZ25pemVyLT5iZWdpblJlc3luYyhyZWNvZ25pemVyKTsKKwkJaXMtPmNvbnN1bWUoaXMpOworCQlyZWNvZ25pemVyLT5lbmRSZXN5bmMocmVjb2duaXplcik7CisJCS8vIEVuZCByZXN5bmMgaG9vayAKKwkJLy8KKwkJaWYJKHJlY29nbml6ZXItPmRlYnVnZ2VyICE9IE5VTEwpCisJCXsKKwkJCXJlY29nbml6ZXItPmRlYnVnZ2VyLT5lbmRSZXN5bmMocmVjb2duaXplci0+ZGVidWdnZXIpOworCQl9CisKKwkJLy8gUHJpbnQgb3V0IHRoZSBlcnJvciBhZnRlciB3ZSBjb25zdW1lIHNvIHRoYXQgQU5UTFJXb3JrcyBzZWVzIHRoZQorCQkvLyB0b2tlbiBpbiB0aGUgZXhjZXB0aW9uLgorCQkvLworCQlyZWNvZ25pemVyLT5yZXBvcnRFcnJvcihyZWNvZ25pemVyKTsKKworCQkvLyBSZXR1cm4gdGhlIHRva2VuIHdlIGFyZSBhY3R1YWxseSBtYXRjaGluZworCQkvLworCQltYXRjaGVkU3ltYm9sID0gcmVjb2duaXplci0+Z2V0Q3VycmVudElucHV0U3ltYm9sKHJlY29nbml6ZXIsIGlzKTsKKworCQkvLyBDb25zdW1lIHRoZSB0b2tlbiB0aGF0IHRoZSBydWxlIGFjdHVhbGx5IGV4cGVjdGVkIHRvIGdldCBhcyBpZiBldmVyeXRoaW5nCisJCS8vIHdhcyBodW5reSBkb3J5LgorCQkvLworCQlpcy0+Y29uc3VtZShpcyk7CisKKwkJcmVjb2duaXplci0+c3RhdGUtPmVycm9yICA9IEFOVExSM19GQUxTRTsJLy8gRXhjZXB0aW9uIGlzIG5vdCBvdXRzdGFuZGluZyBhbnkgbW9yZQorCisJCXJldHVybgltYXRjaGVkU3ltYm9sOworCX0KKworCS8vIFNpbmdsZSB0b2tlbiBkZWxldGlvbiAoVW53YW50ZWQgYWJvdmUpIGRpZCBub3Qgd29yaworCS8vIHNvIHdlIHNlZSBpZiB3ZSBjYW4gaW5zZXJ0IGEgdG9rZW4gaW5zdGVhZCBieSBjYWxjdWxhdGluZyB3aGljaAorCS8vIHRva2VuIHdvdWxkIGJlIG1pc3NpbmcKKwkvLworCWlmCShtaXNtYXRjaElzTWlzc2luZ1Rva2VuKHJlY29nbml6ZXIsIGlzLCBmb2xsb3cpKQorCXsKKwkJLy8gV2UgY2FuIGZha2UgdGhlIG1pc3NpbmcgdG9rZW4gYW5kIHByb2NlZWQKKwkJLy8KKwkJbWF0Y2hlZFN5bWJvbCA9IHJlY29nbml6ZXItPmdldE1pc3NpbmdTeW1ib2wocmVjb2duaXplciwgaXMsIHJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24sIHR0eXBlLCBmb2xsb3cpOworCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT50eXBlCQk9IEFOVExSM19NSVNTSU5HX1RPS0VOX0VYQ0VQVElPTjsKKwkJcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bWVzc2FnZQk9IEFOVExSM19NSVNTSU5HX1RPS0VOX0VYQ0VQVElPTl9OQU1FOworCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT50b2tlbgkJPSBtYXRjaGVkU3ltYm9sOworCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT5leHBlY3RpbmcJPSB0dHlwZTsKKworCQkvLyBQcmludCBvdXQgdGhlIGVycm9yIGFmdGVyIHdlIGluc2VydCBzbyB0aGF0IEFOVExSV29ya3Mgc2VlcyB0aGUKKwkJLy8gdG9rZW4gaW4gdGhlIGV4Y2VwdGlvbi4KKwkJLy8KKwkJcmVjb2duaXplci0+cmVwb3J0RXJyb3IocmVjb2duaXplcik7CisKKwkJcmVjb2duaXplci0+c3RhdGUtPmVycm9yICA9IEFOVExSM19GQUxTRTsJLy8gRXhjZXB0aW9uIGlzIG5vdCBvdXRzdGFuZGluZyBhbnkgbW9yZQorCisJCXJldHVybgltYXRjaGVkU3ltYm9sOworCX0KKworCisJLy8gTmVpdGhlciBkZWxldGluZyBub3IgaW5zZXJ0aW5nIHRva2VucyBhbGxvd3MgcmVjb3ZlcnkKKwkvLyBtdXN0IGp1c3QgcmVwb3J0IHRoZSBleGNlcHRpb24uCisJLy8KKwlyZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3IJICAgID0gQU5UTFIzX1RSVUU7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICoKK3JlY292ZXJGcm9tTWlzbWF0Y2hlZFNldAkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfQklUU0VUX0xJU1QgZm9sbG93KQoreworICAgIHBBTlRMUjNfUEFSU0VSCQkJcGFyc2VyOworICAgIHBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisgICAgcEFOVExSM19JTlRfU1RSRUFNCSAgICBpczsKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTgltYXRjaGVkU3ltYm9sOworCisgICAgc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorICAgIHsKKyAgICBjYXNlCUFOVExSM19UWVBFX1BBUlNFUjoKKworCQlwYXJzZXIgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQl0cGFyc2VyCT0gTlVMTDsKKwkJaXMJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisKKwlicmVhazsKKworICAgIGNhc2UJQU5UTFIzX1RZUEVfVFJFRV9QQVJTRVI6CisKKwkJdHBhcnNlciA9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQlwYXJzZXIJPSBOVUxMOworCQlpcwk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJICAgIAorCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gcmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0IGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCXJldHVybiBOVUxMOworCisJYnJlYWs7CisgICAgfQorCisJaWYJKHJlY29nbml6ZXItPm1pc21hdGNoSXNNaXNzaW5nVG9rZW4ocmVjb2duaXplciwgaXMsIGZvbGxvdykgPT0gQU5UTFIzX1RSVUUpCisJeworCQkvLyBXZSBjYW4gZmFrZSB0aGUgbWlzc2luZyB0b2tlbiBhbmQgcHJvY2VlZAorCQkvLworCQltYXRjaGVkU3ltYm9sID0gcmVjb2duaXplci0+Z2V0TWlzc2luZ1N5bWJvbChyZWNvZ25pemVyLCBpcywgcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbiwgQU5UTFIzX1RPS0VOX0lOVkFMSUQsIGZvbGxvdyk7CisJCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPnR5cGUJPSBBTlRMUjNfTUlTU0lOR19UT0tFTl9FWENFUFRJT047CisJCXJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPnRva2VuCT0gbWF0Y2hlZFN5bWJvbDsKKworCQkvLyBQcmludCBvdXQgdGhlIGVycm9yIGFmdGVyIHdlIGluc2VydCBzbyB0aGF0IEFOVExSV29ya3Mgc2VlcyB0aGUKKwkJLy8gdG9rZW4gaW4gdGhlIGV4Y2VwdGlvbi4KKwkJLy8KKwkJcmVjb2duaXplci0+cmVwb3J0RXJyb3IocmVjb2duaXplcik7CisKKwkJcmVjb2duaXplci0+c3RhdGUtPmVycm9yICA9IEFOVExSM19GQUxTRTsJLy8gRXhjZXB0aW9uIGlzIG5vdCBvdXRzdGFuZGluZyBhbnkgbW9yZQorCisJCXJldHVybgltYXRjaGVkU3ltYm9sOworCX0KKworICAgIC8vIFRPRE8gLSBTaW5nbGUgdG9rZW4gZGVsZXRpb24gbGlrZSBpbiByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbigpCisgICAgLy8KKyAgICByZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3IJPSBBTlRMUjNfVFJVRTsKKwlyZWNvZ25pemVyLT5zdGF0ZS0+ZmFpbGVkCT0gQU5UTFIzX1RSVUU7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8vLyBUaGlzIGNvZGUgaXMgZmFjdG9yZWQgb3V0IGZyb20gbWlzbWF0Y2hlZCB0b2tlbiBhbmQgbWlzbWF0Y2hlZCBzZXQKKy8vLyAgcmVjb3ZlcnkuICBJdCBoYW5kbGVzICJzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIiBlcnJvciByZWNvdmVyeSBmb3IKKy8vLyBib3RoLiAgTm8gdG9rZW5zIGFyZSBjb25zdW1lZCB0byByZWNvdmVyIGZyb20gaW5zZXJ0aW9ucy4gIFJldHVybgorLy8vIHRydWUgaWYgcmVjb3Zlcnkgd2FzIHBvc3NpYmxlIGVsc2UgcmV0dXJuIGZhbHNlLgorLy8vCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4JCityZWNvdmVyRnJvbU1pc21hdGNoZWRFbGVtZW50CSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3dCaXRzKQoreworICAgIHBBTlRMUjNfQklUU0VUCSAgICB2aWFibGVUb2tzRm9sbG93aW5nUnVsZTsKKyAgICBwQU5UTFIzX0JJVFNFVAkgICAgZm9sbG93OworICAgIHBBTlRMUjNfUEFSU0VSCSAgICBwYXJzZXI7CisgICAgcEFOVExSM19UUkVFX1BBUlNFUgkgICAgdHBhcnNlcjsKKyAgICBwQU5UTFIzX0lOVF9TVFJFQU0JICAgIGlzOworCisgICAgc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorICAgIHsKKyAgICBjYXNlCUFOVExSM19UWVBFX1BBUlNFUjoKKworCQlwYXJzZXIgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQl0cGFyc2VyCT0gTlVMTDsKKwkJaXMJPSBwYXJzZXItPnRzdHJlYW0tPmlzdHJlYW07CisKKwlicmVhazsKKworICAgIGNhc2UJQU5UTFIzX1RZUEVfVFJFRV9QQVJTRVI6CisKKwkJdHBhcnNlciA9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQlwYXJzZXIJPSBOVUxMOworCQlpcwk9IHRwYXJzZXItPmN0bnN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW07CisKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJICAgIAorCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gcmVjb3ZlciBjYWxsZWQgYnkgdW5rbm93biBwYXJzZXIgdHlwZSAtIHByb3ZpZGUgb3ZlcnJpZGUgZm9yIHRoaXMgZnVuY3Rpb25cbiIpOworCQlyZXR1cm4gQU5UTFIzX0ZBTFNFOworCisJYnJlYWs7CisgICAgfQorCisgICAgZm9sbG93CT0gYW50bHIzQml0c2V0TG9hZChmb2xsb3dCaXRzKTsKKworICAgIGlmCShmb2xsb3cgPT0gTlVMTCkKKyAgICB7CisJCS8qIFRoZSBmb2xsb3cgc2V0IGlzIE5VTEwsIHdoaWNoIG1lYW5zIHdlIGRvbid0IGtub3cgd2hhdCBjYW4gY29tZSAKKwkJICogbmV4dCwgc28gd2UgImhpdCBhbmQgaG9wZSIgYnkganVzdCBzaWduaWZ5aW5nIHRoYXQgd2UgY2Fubm90CisJCSAqIHJlY292ZXIsIHdoaWNoIHdpbGwganVzdCBjYXVzZSB0aGUgbmV4dCB0b2tlbiB0byBiZSBjb25zdW1lZCwKKwkJICogd2hpY2ggbWlnaHQgZGlnIHVzIG91dC4KKwkJICovCisJCXJldHVybglBTlRMUjNfRkFMU0U7CisgICAgfQorCisgICAgLyogV2UgaGF2ZSBhIGJpdG1hcCBmb3IgdGhlIGZvbGxvdyBzZXQsIGhlbmNlIHdlIGNhbiBjb21wdXRlIAorICAgICAqIHdoYXQgY2FuIGZvbGxvdyB0aGlzIGdyYW1tYXIgZWxlbWVudCByZWZlcmVuY2UuCisgICAgICovCisgICAgaWYJKGZvbGxvdy0+aXNNZW1iZXIoZm9sbG93LCBBTlRMUjNfRU9SX1RPS0VOX1RZUEUpID09IEFOVExSM19UUlVFKQorICAgIHsKKwkJLyogRmlyc3Qgd2UgbmVlZCB0byBrbm93IHdoaWNoIG9mIHRoZSBhdmFpbGFibGUgdG9rZW5zIGFyZSB2aWFibGUKKwkJICogdG8gZm9sbG93IHRoaXMgcmVmZXJlbmNlLgorCQkgKi8KKwkJdmlhYmxlVG9rc0ZvbGxvd2luZ1J1bGUJPSByZWNvZ25pemVyLT5jb21wdXRlQ1NSdWxlRm9sbG93KHJlY29nbml6ZXIpOworCisJCS8qIFJlbW92ZSB0aGUgRU9SIHRva2VuLCB3aGljaCB3ZSBkbyBub3Qgd2lzaCB0byBjb21wdXRlIHdpdGgKKwkJICovCisJCWZvbGxvdy0+cmVtb3ZlKGZvbGxvdywgQU5UTFIzX0VPUl9UT0tFTl9UWVBFKTsKKwkJdmlhYmxlVG9rc0ZvbGxvd2luZ1J1bGUtPmZyZWUodmlhYmxlVG9rc0ZvbGxvd2luZ1J1bGUpOworCQkvKiBXZSBub3cgaGF2ZSB0aGUgY29tcHV0ZWQgc2V0IG9mIHdoYXQgY2FuIGZvbGxvdyB0aGUgY3VycmVudCB0b2tlbgorCQkgKi8KKyAgICB9CisKKyAgICAvKiBXZSBjYW4gbm93IHNlZSBpZiB0aGUgY3VycmVudCB0b2tlbiB3b3JrcyB3aXRoIHRoZSBzZXQgb2YgdG9rZW5zCisgICAgICogdGhhdCBjb3VsZCBmb2xsb3cgdGhlIGN1cnJlbnQgZ3JhbW1hciByZWZlcmVuY2UuIElmIGl0IGxvb2tzIGxpa2UgaXQKKyAgICAgKiBpcyBjb25zaXN0ZW50LCB0aGVuIHdlIGNhbiAiaW5zZXJ0IiB0aGF0IHRva2VuIGJ5IG5vdCB0aHJvd2luZworICAgICAqIGFuIGV4Y2VwdGlvbiBhbmQgYXNzdW1pbmcgdGhhdCB3ZSBzYXcgaXQuIAorICAgICAqLworICAgIGlmCSggZm9sbG93LT5pc01lbWJlcihmb2xsb3csIGlzLT5fTEEoaXMsIDEpKSA9PSBBTlRMUjNfVFJVRSkKKyAgICB7CisJCS8qIHJlcG9ydCB0aGUgZXJyb3IsIGJ1dCBkb24ndCBjYXVzZSBhbnkgcnVsZXMgdG8gYWJvcnQgYW5kIHN0dWZmCisJCSAqLworCQlyZWNvZ25pemVyLT5yZXBvcnRFcnJvcihyZWNvZ25pemVyKTsKKwkJaWYJKGZvbGxvdyAhPSBOVUxMKQorCQl7CisJCQlmb2xsb3ctPmZyZWUoZm9sbG93KTsKKwkJfQorCQlyZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3IJCQk9IEFOVExSM19GQUxTRTsKKwkJcmVjb2duaXplci0+c3RhdGUtPmZhaWxlZAkJCT0gQU5UTFIzX0ZBTFNFOworCQlyZXR1cm4gQU5UTFIzX1RSVUU7CS8qIFN1Y2Nlc3MgaW4gcmVjb3ZlcnkJKi8KKyAgICB9CisKKyAgICBpZgkoZm9sbG93ICE9IE5VTEwpCisgICAgeworCQlmb2xsb3ctPmZyZWUoZm9sbG93KTsKKyAgICB9CisKKyAgICAvKiBXZSBjb3VsZCBub3QgZmluZCBhbnl0aGluZyB2aWFibGUgdG8gZG8sIHNvIHRoaXMgaXMgZ29pbmcgdG8gCisgICAgICogY2F1c2UgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHJldHVybiAgQU5UTFIzX0ZBTFNFOworfQorCisvLy8gRWF0IHRva2VucyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gdW50aWwgd2UgZ2V0IG9uZSBvZiBKVVNUIHRoZSByaWdodCB0eXBlCisvLy8KK3N0YXRpYyB2b2lkCQkKK2NvbnN1bWVVbnRpbAkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiB0b2tlblR5cGUpCit7CisgICAgQU5UTFIzX1VJTlQzMgkJCXR0eXBlOworICAgIHBBTlRMUjNfUEFSU0VSCQkJcGFyc2VyOworICAgIHBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisgICAgcEFOVExSM19JTlRfU1RSRUFNCSAgICBpczsKKworICAgIHN3aXRjaAkocmVjb2duaXplci0+dHlwZSkKKyAgICB7CisJCWNhc2UJQU5UTFIzX1RZUEVfUEFSU0VSOgorCisJCQlwYXJzZXIgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQkJdHBhcnNlcgk9IE5VTEw7CisJCQlpcwk9IHBhcnNlci0+dHN0cmVhbS0+aXN0cmVhbTsKKworCQkJYnJlYWs7CisKKwkJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQkJdHBhcnNlciA9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQkJcGFyc2VyCT0gTlVMTDsKKwkJCWlzCT0gdHBhcnNlci0+Y3Ruc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbTsKKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICAgIAorCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiQmFzZSByZWNvZ25pemVyIGZ1bmN0aW9uICdjb25zdW1lVW50aWwnIGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCQlyZXR1cm47CisKKwkJCWJyZWFrOworICAgIH0KKworICAgIC8vIFdoYXQgZG8gaGF2ZSBhdCB0aGUgbW9tZW50PworICAgIC8vCisgICAgdHR5cGUJPSBpcy0+X0xBKGlzLCAxKTsKKworICAgIC8vIFN0YXJ0IGVhdGluZyB0b2tlbnMgdW50aWwgd2UgZ2V0IHRvIHRoZSBvbmUgd2Ugd2FudC4KKyAgICAvLworICAgIHdoaWxlICAgKHR0eXBlICE9IEFOVExSM19UT0tFTl9FT0YgJiYgdHR5cGUgIT0gdG9rZW5UeXBlKQorICAgIHsKKwkJaXMtPmNvbnN1bWUoaXMpOworCQl0dHlwZQk9IGlzLT5fTEEoaXMsIDEpOworICAgIH0KK30KKworLy8vIEVhdCB0b2tlbnMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHVudGlsIHdlIGZpbmQgb25lIHRoYXQKKy8vLyBiZWxvbmdzIHRvIHRoZSBzdXBwbGllZCBzZXQuCisvLy8KK3N0YXRpYyB2b2lkCQkKK2NvbnN1bWVVbnRpbFNldAkJCSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19CSVRTRVQgc2V0KQoreworICAgIEFOVExSM19VSU5UMzIJICAgIHR0eXBlOworICAgIHBBTlRMUjNfUEFSU0VSCSAgICBwYXJzZXI7CisgICAgcEFOVExSM19UUkVFX1BBUlNFUgkgICAgdHBhcnNlcjsKKyAgICBwQU5UTFIzX0lOVF9TVFJFQU0JICAgIGlzOworCisgICAgc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorICAgIHsKKwkJY2FzZQlBTlRMUjNfVFlQRV9QQVJTRVI6CisKKwkJCXBhcnNlciAgPSAocEFOVExSM19QQVJTRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCQl0cGFyc2VyCT0gTlVMTDsKKwkJCWlzCT0gcGFyc2VyLT50c3RyZWFtLT5pc3RyZWFtOworCisJCQlicmVhazsKKworCQljYXNlCUFOVExSM19UWVBFX1RSRUVfUEFSU0VSOgorCisJCQl0cGFyc2VyID0gKHBBTlRMUjNfVFJFRV9QQVJTRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCQlwYXJzZXIJPSBOVUxMOworCQkJaXMJPSB0cGFyc2VyLT5jdG5zdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtOworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkgICAgCisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gJ2NvbnN1bWVVbnRpbFNldCcgY2FsbGVkIGJ5IHVua25vd24gcGFyc2VyIHR5cGUgLSBwcm92aWRlIG92ZXJyaWRlIGZvciB0aGlzIGZ1bmN0aW9uXG4iKTsKKwkJCXJldHVybjsKKworCQkJYnJlYWs7CisgICAgfQorCisgICAgLy8gV2hhdCBkbyBoYXZlIGF0IHRoZSBtb21lbnQ/CisgICAgLy8KKyAgICB0dHlwZQk9IGlzLT5fTEEoaXMsIDEpOworCisgICAgLy8gU3RhcnQgZWF0aW5nIHRva2VucyB1bnRpbCB3ZSBnZXQgdG8gb25lIHdlIHdhbnQuCisgICAgLy8KKyAgICB3aGlsZSAgICh0dHlwZSAhPSBBTlRMUjNfVE9LRU5fRU9GICYmIHNldC0+aXNNZW1iZXIoc2V0LCB0dHlwZSkgPT0gQU5UTFIzX0ZBTFNFKQorICAgIHsKKwkJaXMtPmNvbnN1bWUoaXMpOworCQl0dHlwZQk9IGlzLT5fTEEoaXMsIDEpOworICAgIH0KK30KKworLyoqIFJldHVybiB0aGUgcnVsZSBpbnZvY2F0aW9uIHN0YWNrIChob3cgd2UgZ290IGhlcmUgaW4gdGhlIHBhcnNlLgorICogIEluIHRoZSBqYXZhIHZlcnNpb24gVGVyIGp1c3QgYXNrcyB0aGUgSlZNIGZvciBhbGwgdGhlIGluZm9ybWF0aW9uCisgKiAgYnV0IGluIEMgd2UgZG9uJ3QgZ2V0IHRoaXMgaW5mb3JtYXRpb24sIHNvIEkgYW0gZ29pbmcgdG8gZG8gbm90aGluZyAKKyAqICByaWdodCBub3cuCisgKi8KK3N0YXRpYyBwQU5UTFIzX1NUQUNLCQorZ2V0UnVsZUludm9jYXRpb25TdGFjawkJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKQoreworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgcEFOVExSM19TVEFDSwkKK2dldFJ1bGVJbnZvY2F0aW9uU3RhY2tOYW1lZAkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfVUlOVDggbmFtZSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdGVtcGxhdGUgcmV3cml0ZXMgLSBOWUkuCisgKi8KK3N0YXRpYyBwQU5UTFIzX0hBU0hfVEFCTEUJCit0b1N0cmluZ3MJCQkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfSEFTSF9UQUJMRSB0b2tlbnMpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYwl2b2lkIEFOVExSM19DREVDTAorZnJlZUludFRyaWUgICAgKHZvaWQgKiB0cmllKQoreworICAgICgocEFOVExSM19JTlRfVFJJRSl0cmllKS0+ZnJlZSgocEFOVExSM19JTlRfVFJJRSl0cmllKTsKK30KKworCisvKiogUG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIHJldHVybiB3aGV0aGVyIHRoZSBydWxlIGhhcyBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgYXQgdGhlIHN1cHBsaWVkIAorICogIHN0YXJ0IGluZGV4IGJlZm9yZS4gSWYgdGhlIHJ1bGUgaGFzIG5vdCBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgZnJvbSB0aGUgc3VwcGxpZWQgc3RhcnQgaW5kZXgsCisgKiAgdGhlbiBpdCB3aWxsIHJldHVybiBBTlRMUjNfTUVNT19SVUxFX1VOS05PV04uIElmIGl0IGhhcyBwYXJzZWQgZnJvbSB0aGUgc3VwcGxlZCBzdGFydCBwb2ludAorICogIHRoZW4gaXQgd2lsbCByZXR1cm4gdGhlIHBvaW50IHdoZXJlIGl0IGxhc3Qgc3RvcHBlZCBwYXJzaW5nIGFmdGVyIHRoYXQgc3RhcnQgcG9pbnQuCisgKgorICogXHJlbWFyaworICogVGhlIHJ1bGUgbWVtb3MgYXJlIGFuIEFOVExSM19MSVNUIG9mIEFOVExSM19MSVNUUywgaG93ZXZlciBpZiB0aGlzIGJlY29tZXMgYW55IGtpbmQgb2YgcGVyZm9ybWFuY2UKKyAqIGlzc3VlIChpdCBwcm9iYWJseSB3b24ndCwgdGhlIGhhc2ggdGFibGVzIGFyZSBwcmV0dHkgcXVpY2spIHRoZW4gd2UgY291bGQgbWFrZSBhIHNwZWNpYWwgaW50IG9ubHkKKyAqIHZlcnNpb24gb2YgdGhlIHRhYmxlLgorICovCitzdGF0aWMgQU5UTFIzX01BUktFUgkKK2dldFJ1bGVNZW1vaXphdGlvbgkJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBBTlRMUjNfSU5US0VZIHJ1bGVJbmRleCwgQU5UTFIzX01BUktFUiBydWxlUGFyc2VTdGFydCkKK3sKKyAgICAvKiBUaGUgcnVsZSBtZW1vcyBhcmUgYW4gQU5UTFIzX0xJU1Qgb2YgQU5UTFIzX0xJU1QuCisgICAgICovCisgICAgcEFOVExSM19JTlRfVFJJRQlydWxlTGlzdDsKKyAgICBBTlRMUjNfTUFSS0VSCXN0b3BJbmRleDsKKyAgICBwQU5UTFIzX1RSSUVfRU5UUlkJZW50cnk7CisKKyAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhIGxpc3QgaW4gdGhlIHJ1bGVNZW1vcyBmb3IgdGhpcyBydWxlLCBhbmQgaWYgbm90LCB0aGVuIGNyZWF0ZSBvbmUKKyAgICAgKiBhcyB3ZSB3aWxsIG5lZWQgaXQgZXZlbnR1YWxseSBpZiB3ZSBhcmUgYmVpbmcgYXNrZWQgZm9yIHRoZSBtZW1vIGhlcmUuCisgICAgICovCisgICAgZW50cnkJPSByZWNvZ25pemVyLT5zdGF0ZS0+cnVsZU1lbW8tPmdldChyZWNvZ25pemVyLT5zdGF0ZS0+cnVsZU1lbW8sIChBTlRMUjNfSU5US0VZKXJ1bGVJbmRleCk7CisKKyAgICBpZgkoZW50cnkgPT0gTlVMTCkKKyAgICB7CisJCS8qIERpZCBub3QgZmluZCBpdCwgc28gY3JlYXRlIGEgbmV3IG9uZSBmb3IgaXQsIHdpdGggYSBiaXQgZGVwdGggYmFzZWQgb24gdGhlIAorCQkgKiBzaXplIG9mIHRoZSBpbnB1dCBzdHJlYW0uIFdlIG5lZWQgdGhlIGJpdCBkZXB0aCB0byBpbmNvcnBvcmF0ZSB0aGUgbnVtYmVyIGlmCisJCSAqIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBsYXJnZXN0IHBvc3NpYmxlIHN0b3AgaW5kZXggaW4gdGhlIGlucHV0LCB3aGljaCBpcyB0aGUKKwkJICogbGFzdCBjaGFyYWN0ZXIuIEFuIGludCBzdHJlYW0gaXMgZnJlZSB0byByZXR1cm4gdGhlIGxhcmdlc3QgNjQgYml0IG9mZnNldCBpZiBpdCBoYXMKKwkJICogbm8gaWRlYSBvZiB0aGUgc2l6ZSwgYnV0IHlvdSBzaG91bGQgcmVtZW1iZXIgdGhhdCB0aGlzIHdpbGwgY2F1c2UgdGhlIGxlZnRtb3N0CisJCSAqIGJpdCBtYXRjaCBhbGdvcml0aG0gdG8gcnVuIHRvIDYzIGJpdHMsIHdoaWNoIHdpbGwgYmUgdGhlIHdob2xlIHRpbWUgc3BlbnQgaW4gdGhlIHRyaWUgOy0pCisJCSAqLworCQlydWxlTGlzdCAgICA9IGFudGxyM0ludFRyaWVOZXcoNjMpOwkvKiBEZXB0aCBpcyB0aGVvcmV0aWNhbGx5IDY0IGJpdHMsIGJ1dCBwcm9iYWJseSBub3QgOy0pCSovCisKKwkJaWYgKHJ1bGVMaXN0ICE9IE5VTEwpCisJCXsKKwkJCXJlY29nbml6ZXItPnN0YXRlLT5ydWxlTWVtby0+YWRkKHJlY29nbml6ZXItPnN0YXRlLT5ydWxlTWVtbywgKEFOVExSM19JTlRLRVkpcnVsZUluZGV4LCBBTlRMUjNfSEFTSF9UWVBFX1NUUiwgMCwgQU5UTFIzX0ZVTkNfUFRSKHJ1bGVMaXN0KSwgZnJlZUludFRyaWUpOworCQl9CisKKwkJLyogV2UgY2Fubm90IGhhdmUgYSBzdG9wSW5kZXggaW4gYSB0cmllIHdlIGhhdmUganVzdCBjcmVhdGVkIG9mIGNvdXJzZQorCQkgKi8KKwkJcmV0dXJuCU1FTU9fUlVMRV9VTktOT1dOOworICAgIH0KKworICAgIHJ1bGVMaXN0CT0gKHBBTlRMUjNfSU5UX1RSSUUpIChlbnRyeS0+ZGF0YS5wdHIpOworCisgICAgLyogU2VlIGlmIHRoZXJlIGlzIGEgc3RvcCBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIHN0YXJ0IGluZGV4LgorICAgICAqLworICAgIHN0b3BJbmRleAk9IDA7CisKKyAgICBlbnRyeSA9IHJ1bGVMaXN0LT5nZXQocnVsZUxpc3QsIHJ1bGVQYXJzZVN0YXJ0KTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisJCXN0b3BJbmRleCA9IChBTlRMUjNfTUFSS0VSKShlbnRyeS0+ZGF0YS5pbnRWYWwpOworICAgIH0KKworICAgIGlmCShzdG9wSW5kZXggPT0gMCkKKyAgICB7CisJCXJldHVybiBNRU1PX1JVTEVfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gIHN0b3BJbmRleDsKK30KKworLyoqIEhhcyB0aGlzIHJ1bGUgYWxyZWFkeSBwYXJzZWQgaW5wdXQgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlCisgKiAgaW5wdXQgc3RyZWFtPyAgUmV0dXJuIEFOVExSM19UUlVFIGlmIHdlIGhhdmUgYW5kIEFOVExSM19GQUxTRQorICogIGlmIHdlIGhhdmUgbm90LgorICoKKyAqICBUaGlzIG1ldGhvZCBoYXMgYSBzaWRlLWVmZmVjdDogaWYgd2UgaGF2ZSBzZWVuIHRoaXMgaW5wdXQgZm9yCisgKiAgdGhpcyBydWxlIGFuZCBzdWNjZXNzZnVsbHkgcGFyc2VkIGJlZm9yZSwgdGhlbiBzZWVrIGFoZWFkIHRvCisgKiAgMSBwYXN0IHRoZSBzdG9wIHRva2VuIG1hdGNoZWQgZm9yIHRoaXMgcnVsZSBsYXN0IHRpbWUuCisgKi8KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgkKK2FscmVhZHlQYXJzZWRSdWxlCQkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIEFOVExSM19NQVJLRVIgcnVsZUluZGV4KQoreworICAgIEFOVExSM19NQVJLRVIJCQlzdG9wSW5kZXg7CisgICAgcEFOVExSM19MRVhFUgkJCWxleGVyOworICAgIHBBTlRMUjNfUEFSU0VSCQkJcGFyc2VyOworICAgIHBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisgICAgcEFOVExSM19JTlRfU1RSRUFNCSAgICBpczsKKworICAgIHN3aXRjaAkocmVjb2duaXplci0+dHlwZSkKKyAgICB7CisJCWNhc2UJQU5UTFIzX1RZUEVfUEFSU0VSOgorCisJCQlwYXJzZXIgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQkJdHBhcnNlcgk9IE5VTEw7CisJCQlsZXhlcgk9IE5VTEw7CisJCQlpcwk9IHBhcnNlci0+dHN0cmVhbS0+aXN0cmVhbTsKKworCQkJYnJlYWs7CisKKwkJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQkJdHBhcnNlciA9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQkJcGFyc2VyCT0gTlVMTDsKKwkJCWxleGVyCT0gTlVMTDsKKwkJCWlzCT0gdHBhcnNlci0+Y3Ruc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbTsKKworCQkJYnJlYWs7CisKKwkJY2FzZQlBTlRMUjNfVFlQRV9MRVhFUjoKKworCQkJbGV4ZXIJPSAocEFOVExSM19MRVhFUikgICAocmVjb2duaXplci0+c3VwZXIpOworCQkJcGFyc2VyCT0gTlVMTDsKKwkJCXRwYXJzZXIJPSBOVUxMOworCQkJaXMJPSBsZXhlci0+aW5wdXQtPmlzdHJlYW07CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkgICAgCisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gJ2FscmVhZHlQYXJzZWRSdWxlJyBjYWxsZWQgYnkgdW5rbm93biBwYXJzZXIgdHlwZSAtIHByb3ZpZGUgb3ZlcnJpZGUgZm9yIHRoaXMgZnVuY3Rpb25cbiIpOworCQkJcmV0dXJuIEFOVExSM19GQUxTRTsKKworCQkJYnJlYWs7CisgICAgfQorCisgICAgLyogU2VlIGlmIHdlIGhhdmUgYSBtZW1vIG1hcmtlciBmb3IgdGhpcy4KKyAgICAgKi8KKyAgICBzdG9wSW5kZXgJICAgID0gcmVjb2duaXplci0+Z2V0UnVsZU1lbW9pemF0aW9uKHJlY29nbml6ZXIsIHJ1bGVJbmRleCwgaXMtPmluZGV4KGlzKSk7CisKKyAgICBpZgkoc3RvcEluZGV4ICA9PSBNRU1PX1JVTEVfVU5LTk9XTikKKyAgICB7CisJCXJldHVybiBBTlRMUjNfRkFMU0U7CisgICAgfQorCisgICAgaWYJKHN0b3BJbmRleCA9PSBNRU1PX1JVTEVfRkFJTEVEKQorICAgIHsKKwkJcmVjb2duaXplci0+c3RhdGUtPmZhaWxlZCA9IEFOVExSM19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlpcy0+c2Vlayhpcywgc3RvcEluZGV4KzEpOworICAgIH0KKworICAgIC8qIElmIGhlcmUgdGhlbiB0aGUgcnVsZSB3YXMgZXhlY3V0ZWQgZm9yIHRoaXMgaW5wdXQgYWxyZWFkeQorICAgICAqLworICAgIHJldHVybiAgQU5UTFIzX1RSVUU7Cit9CisKKy8qKiBSZWNvcmQgd2hldGhlciBvciBub3QgdGhpcyBydWxlIHBhcnNlZCB0aGUgaW5wdXQgYXQgdGhpcyBwb3NpdGlvbgorICogIHN1Y2Nlc3NmdWxseS4KKyAqLworc3RhdGljIHZvaWQJCQorbWVtb2l6ZQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX01BUktFUiBydWxlSW5kZXgsIEFOVExSM19NQVJLRVIgcnVsZVBhcnNlU3RhcnQpCit7CisgICAgLyogVGhlIHJ1bGUgbWVtb3MgYXJlIGFuIEFOVExSM19MSVNUIG9mIEFOVExSM19MSVNULgorICAgICAqLworICAgIHBBTlRMUjNfSU5UX1RSSUUJICAgIHJ1bGVMaXN0OworICAgIHBBTlRMUjNfVFJJRV9FTlRSWQkgICAgZW50cnk7CisgICAgQU5UTFIzX01BUktFUgkgICAgc3RvcEluZGV4OworICAgIHBBTlRMUjNfTEVYRVIJICAgIGxleGVyOworICAgIHBBTlRMUjNfUEFSU0VSCSAgICBwYXJzZXI7CisgICAgcEFOVExSM19UUkVFX1BBUlNFUgkgICAgdHBhcnNlcjsKKyAgICBwQU5UTFIzX0lOVF9TVFJFQU0JICAgIGlzOworCisgICAgc3dpdGNoCShyZWNvZ25pemVyLT50eXBlKQorICAgIHsKKwkJY2FzZQlBTlRMUjNfVFlQRV9QQVJTRVI6CisKKwkJCXBhcnNlciAgPSAocEFOVExSM19QQVJTRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCQl0cGFyc2VyCT0gTlVMTDsKKwkJCWlzCT0gcGFyc2VyLT50c3RyZWFtLT5pc3RyZWFtOworCisJCQlicmVhazsKKworCQljYXNlCUFOVExSM19UWVBFX1RSRUVfUEFSU0VSOgorCisJCQl0cGFyc2VyID0gKHBBTlRMUjNfVFJFRV9QQVJTRVIpIChyZWNvZ25pemVyLT5zdXBlcik7CisJCQlwYXJzZXIJPSBOVUxMOworCQkJaXMJPSB0cGFyc2VyLT5jdG5zdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtOworCisJCQlicmVhazsKKworCQljYXNlCUFOVExSM19UWVBFX0xFWEVSOgorCisJCQlsZXhlcgk9IChwQU5UTFIzX0xFWEVSKSAgIChyZWNvZ25pemVyLT5zdXBlcik7CisJCQlwYXJzZXIJPSBOVUxMOworCQkJdHBhcnNlcgk9IE5VTEw7CisJCQlpcwkJPSBsZXhlci0+aW5wdXQtPmlzdHJlYW07CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkgICAgCisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJCYXNlIHJlY29nbml6ZXIgZnVuY3Rpb24gY29uc3VtZVVudGlsU2V0IGNhbGxlZCBieSB1bmtub3duIHBhcnNlciB0eXBlIC0gcHJvdmlkZSBvdmVycmlkZSBmb3IgdGhpcyBmdW5jdGlvblxuIik7CisJCQlyZXR1cm47CisKKwkJCWJyZWFrOworICAgIH0KKyAgICAKKyAgICBzdG9wSW5kZXgJPSByZWNvZ25pemVyLT5zdGF0ZS0+ZmFpbGVkID09IEFOVExSM19UUlVFID8gTUVNT19SVUxFX0ZBSUxFRCA6IGlzLT5pbmRleChpcykgLSAxOworCisgICAgZW50cnkJPSByZWNvZ25pemVyLT5zdGF0ZS0+cnVsZU1lbW8tPmdldChyZWNvZ25pemVyLT5zdGF0ZS0+cnVsZU1lbW8sIChBTlRMUjNfSU5US0VZKXJ1bGVJbmRleCk7CisKKyAgICBpZgkoZW50cnkgIT0gTlVMTCkKKyAgICB7CisJCXJ1bGVMaXN0ID0gKHBBTlRMUjNfSU5UX1RSSUUpKGVudHJ5LT5kYXRhLnB0cik7CisKKwkJLyogSWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIHRoaXMgZW50cnksIGFwcGVuZCBpdC4gVGhlIG1lbW9pemUgdHJpZSBkb2VzIG5vdAorCQkgKiBhY2NlcHQgZHVwbGljYXRlcyBzbyBpdCB3b24ndCBhZGQgaXQgaWYgYWxyZWFkeSB0aGVyZSBhbmQgd2UganVzdCBpZ25vcmUgdGhlCisJCSAqIHJldHVybiBjb2RlIGFzIHdlIGRvbid0IGNhcmUgaWYgaXQgaXMgdGhlcmUgYWxyZWFkeS4KKwkJICovCisJCXJ1bGVMaXN0LT5hZGQocnVsZUxpc3QsIHJ1bGVQYXJzZVN0YXJ0LCBBTlRMUjNfSEFTSF9UWVBFX0lOVCwgc3RvcEluZGV4LCBOVUxMLCBOVUxMKTsKKyAgICB9Cit9CisvKiogQSBzeW50YWN0aWMgcHJlZGljYXRlLiAgUmV0dXJucyB0cnVlL2ZhbHNlIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgKiAgdGhlIHNwZWNpZmllZCBncmFtbWFyIGZyYWdtZW50IG1hdGNoZXMgdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLgorICogIFRoaXMgcmVzZXRzIHRoZSBmYWlsZWQgaW5zdGFuY2UgdmFyIGFmdGVyd2FyZHMuCisgKi8KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgkKK3N5bnByZWQJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHZvaWQgKiBjdHgsIHZvaWQgKCpwcmVkaWNhdGUpKHZvaWQgKiBjdHgpKQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBwQU5UTFIzX1BBUlNFUgkgICAgcGFyc2VyOworICAgIHBBTlRMUjNfVFJFRV9QQVJTRVIJICAgIHRwYXJzZXI7CisgICAgcEFOVExSM19JTlRfU1RSRUFNCSAgICBpczsKKworICAgIHN3aXRjaAkocmVjb2duaXplci0+dHlwZSkKKyAgICB7CisJCWNhc2UJQU5UTFIzX1RZUEVfUEFSU0VSOgorCisJCQlwYXJzZXIgID0gKHBBTlRMUjNfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQkJdHBhcnNlcgk9IE5VTEw7CisJCQlpcwk9IHBhcnNlci0+dHN0cmVhbS0+aXN0cmVhbTsKKworCQkJYnJlYWs7CisKKwkJY2FzZQlBTlRMUjNfVFlQRV9UUkVFX1BBUlNFUjoKKworCQkJdHBhcnNlciA9IChwQU5UTFIzX1RSRUVfUEFSU0VSKSAocmVjb2duaXplci0+c3VwZXIpOworCQkJcGFyc2VyCT0gTlVMTDsKKwkJCWlzCT0gdHBhcnNlci0+Y3Ruc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbTsKKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJICAgIAorCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiQmFzZSByZWNvZ25pemVyIGZ1bmN0aW9uICdzeW5QcmVkJyBjYWxsZWQgYnkgdW5rbm93biBwYXJzZXIgdHlwZSAtIHByb3ZpZGUgb3ZlcnJpZGUgZm9yIHRoaXMgZnVuY3Rpb25cbiIpOworCQkJcmV0dXJuIEFOVExSM19GQUxTRTsKKworCQkJYnJlYWs7CisgICAgfQorCisgICAgLyogQmVnaW4gYmFja3RyYWNraW5nIHNvIHdlIGNhbiBnZXQgYmFjayB0byB3aGVyZSB3ZSBzdGFydGVkIGFmdGVyIHRyeWluZyBvdXQKKyAgICAgKiB0aGUgc3ludGFjdGljIHByZWRpY2F0ZS4KKyAgICAgKi8KKyAgICBzdGFydCAgID0gaXMtPm1hcmsoaXMpOworICAgIHJlY29nbml6ZXItPnN0YXRlLT5iYWNrdHJhY2tpbmcrKzsKKworICAgIC8qIFRyeSB0aGUgc3ludGFjdGljYWwgcHJlZGljYXRlCisgICAgICovCisgICAgcHJlZGljYXRlKGN0eCk7CisKKyAgICAvKiBSZXNldAorICAgICAqLworICAgIGlzLT5yZXdpbmQoaXMsIHN0YXJ0KTsKKyAgICByZWNvZ25pemVyLT5zdGF0ZS0+YmFja3RyYWNraW5nLS07CisKKyAgICBpZgkocmVjb2duaXplci0+c3RhdGUtPmZhaWxlZCA9PSBBTlRMUjNfVFJVRSkKKyAgICB7CisJCS8qIFByZWRpY2F0ZSBmYWlsZWQKKwkJICovCisJCXJlY29nbml6ZXItPnN0YXRlLT5mYWlsZWQgPSBBTlRMUjNfRkFMU0U7CisJCXJldHVybglBTlRMUjNfRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCS8qIFByZWRpY2F0ZSB3YXMgc3VjY2Vzc2Z1bAorCQkgKi8KKwkJcmVjb2duaXplci0+c3RhdGUtPmZhaWxlZAk9IEFOVExSM19GQUxTRTsKKwkJcmV0dXJuCUFOVExSM19UUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Jlc2V0KHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIpCit7CisgICAgaWYJKHJlY29nbml6ZXItPnN0YXRlLT5mb2xsb3dpbmcgIT0gTlVMTCkKKyAgICB7CisJCXJlY29nbml6ZXItPnN0YXRlLT5mb2xsb3dpbmctPmZyZWUocmVjb2duaXplci0+c3RhdGUtPmZvbGxvd2luZyk7CisgICAgfQorCisJLy8gUmVzZXQgdGhlIHN0YXRlIGZsYWdzCisJLy8KKwlyZWNvZ25pemVyLT5zdGF0ZS0+ZXJyb3JSZWNvdmVyeQk9IEFOVExSM19GQUxTRTsKKwlyZWNvZ25pemVyLT5zdGF0ZS0+bGFzdEVycm9ySW5kZXgJPSAtMTsKKwlyZWNvZ25pemVyLT5zdGF0ZS0+ZmFpbGVkCQkJPSBBTlRMUjNfRkFMU0U7CisJcmVjb2duaXplci0+c3RhdGUtPmVycm9yQ291bnQJCT0gMDsKKwlyZWNvZ25pemVyLT5zdGF0ZS0+YmFja3RyYWNraW5nCQk9IDA7CisJcmVjb2duaXplci0+c3RhdGUtPmZvbGxvd2luZwkJPSBOVUxMOworCisJaWYJKHJlY29nbml6ZXItPnN0YXRlICE9IE5VTEwpCisJeworCQlpZgkocmVjb2duaXplci0+c3RhdGUtPnJ1bGVNZW1vICE9IE5VTEwpCisJCXsKKwkJCXJlY29nbml6ZXItPnN0YXRlLT5ydWxlTWVtby0+ZnJlZShyZWNvZ25pemVyLT5zdGF0ZS0+cnVsZU1lbW8pOworCQkJcmVjb2duaXplci0+c3RhdGUtPnJ1bGVNZW1vID0gYW50bHIzSW50VHJpZU5ldygxNSk7CS8qIDE2IGJpdCBkZXB0aCBpcyBlbm91Z2ggZm9yIDMyNzY4IHJ1bGVzISAqLworCQl9CisJfQorCQorCisgICAgLy8gSW5zdGFsbCBhIG5ldyBmb2xsb3dpbmcgc2V0CisgICAgLy8KKyAgICByZWNvZ25pemVyLT5zdGF0ZS0+Zm9sbG93aW5nICAgPSBhbnRscjNTdGFja05ldyg4KTsKKworfQorCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciBwYXJzZXIgYW5kIGFzc3VtZXMgYSB0b2tlbiBzdHJlYW0gYXMgc3VwcGxpZWQgYnkgdGhlIHJ1bnRpbWUuCisvLyBZb3UgTUFZIG5lZWQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpZiB0aGUgc3RhbmRhcmQgVE9LRU5fU1RSRUFNIGlzIG5vdCB3aGF0IHlvdSBhcmUgdXNpbmcuCisvLworc3RhdGljIHZvaWQgKgkJCQkKK2dldEN1cnJlbnRJbnB1dFN5bWJvbAkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfSU5UX1NUUkVBTSBpc3RyZWFtKQoreworCXJldHVybiAoKHBBTlRMUjNfVE9LRU5fU1RSRUFNKWlzdHJlYW0tPnN1cGVyKS0+X0xUKChwQU5UTFIzX1RPS0VOX1NUUkVBTSlpc3RyZWFtLT5zdXBlciwgMSk7Cit9CisKKy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZm9yIHBhcnNlciBhbmQgYXNzdW1lcyBhIHRva2VuIHN0cmVhbSBhcyBzdXBwbGllZCBieSB0aGUgcnVudGltZS4KKy8vIFlvdSBNQVkgbmVlZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZSBzdGFuZGFyZCBDT01NT05fVE9LRU5fU1RSRUFNIGlzIG5vdCB3aGF0IHlvdSBhcmUgdXNpbmcuCisvLworc3RhdGljIHZvaWQgKgkJCQkKK2dldE1pc3NpbmdTeW1ib2wJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNCWlzdHJlYW0sIHBBTlRMUjNfRVhDRVBUSU9OCWUsCisJCQkJCQkJCQlBTlRMUjNfVUlOVDMyIGV4cGVjdGVkVG9rZW5UeXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdykKK3sKKwlwQU5UTFIzX1RPS0VOX1NUUkVBTQkJCXRzOworCXBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTQkJY3RzOworCXBBTlRMUjNfQ09NTU9OX1RPS0VOCQkJdG9rZW47CisJcEFOVExSM19DT01NT05fVE9LRU4JCQljdXJyZW50OworCXBBTlRMUjNfU1RSSU5HCQkJCQl0ZXh0OworCisJLy8gRGVyZWZlcmVuY2UgdGhlIHN0YW5kYXJkIHBvaW50ZXJzCisJLy8KKwl0cwkJPSAocEFOVExSM19UT0tFTl9TVFJFQU0paXN0cmVhbS0+c3VwZXI7CisJY3RzCQk9IChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0pdHMtPnN1cGVyOworCQorCS8vIFdvcmsgb3V0IHdoYXQgdG8gdXNlIGFzIHRoZSBjdXJyZW50IHN5bWJvbCB0byBtYWtlIGEgbGluZSBhbmQgb2Zmc2V0IGV0YworCS8vIElmIHdlIGFyZSBhdCBFT0YsIHdlIHVzZSB0aGUgdG9rZW4gYmVmb3JlIEVPRgorCS8vCisJY3VycmVudAk9IHRzLT5fTFQodHMsIDEpOworCWlmCShjdXJyZW50LT5nZXRUeXBlKGN1cnJlbnQpID09IEFOVExSM19UT0tFTl9FT0YpCisJeworCQljdXJyZW50ID0gdHMtPl9MVCh0cywgLTEpOworCX0KKworCS8vIENyZWF0ZSBhIG5ldyBlbXB0eSB0b2tlbgorCS8vCisJaWYJKHJlY29nbml6ZXItPnN0YXRlLT50b2tGYWN0b3J5ID09IE5VTEwpCisJeworCQkvLyBXZSBkb24ndCB5ZXQgaGF2ZSBhIHRva2VuIGZhY3RvcnkgZm9yIG1ha2luZyB0b2tlbnMKKwkJLy8gd2UganVzdCBuZWVkIGEgZmFrZSBvbmUgdXNpbmcgdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgY3VycmVudAorCQkvLyB0b2tlbi4KKwkJLy8KKwkJcmVjb2duaXplci0+c3RhdGUtPnRva0ZhY3RvcnkgPSBhbnRscjNUb2tlbkZhY3RvcnlOZXcoY3VycmVudC0+aW5wdXQpOworCX0KKwl0b2tlbgk9IHJlY29nbml6ZXItPnN0YXRlLT50b2tGYWN0b3J5LT5uZXdUb2tlbihyZWNvZ25pemVyLT5zdGF0ZS0+dG9rRmFjdG9yeSk7CisKKwkvLyBTZXQgc29tZSBvZiB0aGUgdG9rZW4gcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCB0b2tlbgorCS8vCisJdG9rZW4tPnNldExpbmUJCQkJCSh0b2tlbiwgY3VycmVudC0+Z2V0TGluZShjdXJyZW50KSk7CisJdG9rZW4tPnNldENoYXJQb3NpdGlvbkluTGluZQkodG9rZW4sIGN1cnJlbnQtPmdldENoYXJQb3NpdGlvbkluTGluZShjdXJyZW50KSk7CisJdG9rZW4tPnNldENoYW5uZWwJCQkJKHRva2VuLCBBTlRMUjNfVE9LRU5fREVGQVVMVF9DSEFOTkVMKTsKKwl0b2tlbi0+c2V0VHlwZQkJCQkJKHRva2VuLCBleHBlY3RlZFRva2VuVHlwZSk7CisgICAgdG9rZW4tPnVzZXIxICAgICAgICAgICAgICAgICAgICA9IGN1cnJlbnQtPnVzZXIxOworICAgIHRva2VuLT51c2VyMiAgICAgICAgICAgICAgICAgICAgPSBjdXJyZW50LT51c2VyMjsKKyAgICB0b2tlbi0+dXNlcjMgICAgICAgICAgICAgICAgICAgID0gY3VycmVudC0+dXNlcjM7CisgICAgdG9rZW4tPmN1c3RvbSAgICAgICAgICAgICAgICAgICA9IGN1cnJlbnQtPmN1c3RvbTsKKyAgICB0b2tlbi0+bGluZVN0YXJ0ICAgICAgICAgICAgICAgID0gY3VycmVudC0+bGluZVN0YXJ0OworICAgIAorCS8vIENyZWF0ZSB0aGUgdG9rZW4gdGV4dCB0aGF0IHNob3dzIGl0IGhhcyBiZWVuIGluc2VydGVkCisJLy8KKwl0b2tlbi0+c2V0VGV4dDgodG9rZW4sIChwQU5UTFIzX1VJTlQ4KSI8bWlzc2luZyAiKTsKKwl0ZXh0ID0gdG9rZW4tPmdldFRleHQodG9rZW4pOworCisJaWYJKHRleHQgIT0gTlVMTCkKKwl7CisJCXRleHQtPmFwcGVuZDgodGV4dCwgKGNvbnN0IGNoYXIgKilyZWNvZ25pemVyLT5zdGF0ZS0+dG9rZW5OYW1lc1tleHBlY3RlZFRva2VuVHlwZV0pOworCQl0ZXh0LT5hcHBlbmQ4KHRleHQsIChjb25zdCBjaGFyICopIj4iKTsKKwl9CisJCisJLy8gRmluYWxseSByZXR1cm4gdGhlIHBvaW50ZXIgdG8gb3VyIG5ldyB0b2tlbgorCS8vCisJcmV0dXJuCXRva2VuOworfQorCisKKyNpZmRlZglBTlRMUjNfV0lORE9XUworI3ByYWdtYSB3YXJuaW5nKCBkZWZhdWx0IDogNDEwMCApCisjZW5kaWYKKworLy8vIEB9CisvLy8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzYmFzZXRyZWUuYyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2Jhc2V0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjODFlNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2Jhc2V0cmVlLmMKQEAgLTAsMCArMSw0ODkgQEAKKyNpbmNsdWRlICAgIDxhbnRscjNiYXNldHJlZS5oPgorCisjaWZkZWYJQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDAgKQorI2VuZGlmCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworc3RhdGljIHZvaWQJCQkJKglnZXRDaGlsZAkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBBTlRMUjNfVUlOVDMyIGkpOworc3RhdGljIEFOVExSM19VSU5UMzIJCWdldENoaWxkQ291bnQJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCQlnZXRDaGFyUG9zaXRpb25JbkxpbmUKKyhwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCQlnZXRMaW5lCQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKTsKK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRSAgICAKK2dldEZpcnN0Q2hpbGRXaXRoVHlwZQorKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgdHlwZSk7CitzdGF0aWMgdm9pZAkJCQkJYWRkQ2hpbGQJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpOworc3RhdGljIHZvaWQJCQkJCWFkZENoaWxkcmVuCQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIHBBTlRMUjNfTElTVCBraWRzKTsKK3N0YXRpYyB2b2lkCQkJCQlyZXBsYWNlQ2hpbGRyZW4JCShwQU5UTFIzX0JBU0VfVFJFRSBwYXJlbnQsIEFOVExSM19JTlQzMiBzdGFydENoaWxkSW5kZXgsIEFOVExSM19JTlQzMiBzdG9wQ2hpbGRJbmRleCwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKK3N0YXRpYwl2b2lkCQkJCWZyZXNoZW5QQUNJbmRleGVzQWxsKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpOworc3RhdGljCXZvaWQJCQkJZnJlc2hlblBBQ0luZGV4ZXMJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgb2Zmc2V0KTsKKworc3RhdGljIHZvaWQJCQkJCXNldENoaWxkCQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgaSwgdm9pZCAqIGNoaWxkKTsKK3N0YXRpYyB2b2lkCQkJCSoJZGVsZXRlQ2hpbGQJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSwgQU5UTFIzX1VJTlQzMiBpKTsKK3N0YXRpYyB2b2lkCQkJCSoJZHVwVHJlZQkJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgcEFOVExSM19TVFJJTkcJCXRvU3RyaW5nVHJlZQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpOworCisKK0FOVExSM19BUEkgcEFOVExSM19CQVNFX1RSRUUKK2FudGxyM0Jhc2VUcmVlTmV3KHBBTlRMUjNfQkFTRV9UUkVFICB0cmVlKQoreworCS8qIGFwaSAqLworCXRyZWUtPmdldENoaWxkCQkJCT0gZ2V0Q2hpbGQ7CisJdHJlZS0+Z2V0Q2hpbGRDb3VudAkJCT0gZ2V0Q2hpbGRDb3VudDsKKwl0cmVlLT5hZGRDaGlsZAkJCQk9ICh2b2lkICgqKShwQU5UTFIzX0JBU0VfVFJFRSwgdm9pZCAqKSkoYWRkQ2hpbGQpOworCXRyZWUtPmFkZENoaWxkcmVuCQkJPSBhZGRDaGlsZHJlbjsKKwl0cmVlLT5zZXRDaGlsZAkJCQk9IHNldENoaWxkOworCXRyZWUtPmRlbGV0ZUNoaWxkCQkJPSBkZWxldGVDaGlsZDsKKwl0cmVlLT5kdXBUcmVlCQkJCT0gZHVwVHJlZTsKKwl0cmVlLT50b1N0cmluZ1RyZWUJCQk9IHRvU3RyaW5nVHJlZTsKKwl0cmVlLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUJPSBnZXRDaGFyUG9zaXRpb25JbkxpbmU7CisJdHJlZS0+Z2V0TGluZQkJCQk9IGdldExpbmU7CisJdHJlZS0+cmVwbGFjZUNoaWxkcmVuCQk9IHJlcGxhY2VDaGlsZHJlbjsKKwl0cmVlLT5mcmVzaGVuUEFDSW5kZXhlc0FsbAk9IGZyZXNoZW5QQUNJbmRleGVzQWxsOworCXRyZWUtPmZyZXNoZW5QQUNJbmRleGVzCQk9IGZyZXNoZW5QQUNJbmRleGVzOworCXRyZWUtPmdldEZpcnN0Q2hpbGRXaXRoVHlwZQk9ICh2b2lkICooKikocEFOVExSM19CQVNFX1RSRUUsIEFOVExSM19VSU5UMzIpKShnZXRGaXJzdENoaWxkV2l0aFR5cGUpOworCXRyZWUtPmNoaWxkcmVuCQkJCT0gTlVMTDsKKwl0cmVlLT5zdHJGYWN0b3J5CQkJPSBOVUxMOworCisJLyogUmVzdCBtdXN0IGJlIGZpbGxlZCBpbiBieSBjYWxsZXIuCisJKi8KKwlyZXR1cm4gIHRyZWU7Cit9CisKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCQorZ2V0Q2hhclBvc2l0aW9uSW5MaW5lCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCXJldHVybiAgMDsKK30KKworc3RhdGljIEFOVExSM19VSU5UMzIJCitnZXRMaW5lCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCXJldHVybiAgMDsKK30KK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRQorZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBBTlRMUjNfVUlOVDMyIHR5cGUpCit7CisJQU5UTFIzX1VJTlQzMiAgIGk7CisJQU5UTFIzX1VJTlQzMiAgIGNzOworCisJcEFOVExSM19CQVNFX1RSRUUJdDsKKwlpZgkodHJlZS0+Y2hpbGRyZW4gIT0gTlVMTCkKKwl7CisJCWNzCT0gdHJlZS0+Y2hpbGRyZW4tPnNpemUodHJlZS0+Y2hpbGRyZW4pOworCQlmb3IJKGkgPSAwOyBpIDwgY3M7IGkrKykKKwkJeworCQkJdCA9IChwQU5UTFIzX0JBU0VfVFJFRSkgKHRyZWUtPmNoaWxkcmVuLT5nZXQodHJlZS0+Y2hpbGRyZW4sIGkpKTsKKwkJCWlmICAodHJlZS0+Z2V0VHlwZSh0KSA9PSB0eXBlKQorCQkJeworCQkJCXJldHVybiAgKHBBTlRMUjNfQkFTRV9UUkVFKXQ7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuICBOVUxMOworfQorCisKKworc3RhdGljIHZvaWQgICAgKgorZ2V0Q2hpbGQJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBBTlRMUjNfVUlOVDMyIGkpCit7CisJaWYJKCAgICAgIHRyZWUtPmNoaWxkcmVuID09IE5VTEwKKwkJfHwgaSA+PSB0cmVlLT5jaGlsZHJlbi0+c2l6ZSh0cmVlLT5jaGlsZHJlbikpCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICB0cmVlLT5jaGlsZHJlbi0+Z2V0KHRyZWUtPmNoaWxkcmVuLCBpKTsKK30KKworCitzdGF0aWMgQU5UTFIzX1VJTlQzMgorZ2V0Q2hpbGRDb3VudAkocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKwlpZgkodHJlZS0+Y2hpbGRyZW4gPT0gTlVMTCkKKwl7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJeworCQlyZXR1cm4JdHJlZS0+Y2hpbGRyZW4tPnNpemUodHJlZS0+Y2hpbGRyZW4pOworCX0KK30KKwordm9pZAkgICAgCithZGRDaGlsZCAocEFOVExSM19CQVNFX1RSRUUgdHJlZSwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpCit7CisJQU5UTFIzX1VJTlQzMiAgIG47CisJQU5UTFIzX1VJTlQzMiAgIGk7CisKKwlpZgkoY2hpbGQgPT0gTlVMTCkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZgkoY2hpbGQtPmlzTmlsTm9kZShjaGlsZCkgPT0gQU5UTFIzX1RSVUUpCisJeworCQlpZiAgKGNoaWxkLT5jaGlsZHJlbiAhPSBOVUxMICYmIGNoaWxkLT5jaGlsZHJlbiA9PSB0cmVlLT5jaGlsZHJlbikKKwkJeworCQkJLy8gVE9ETzogQ2hhbmdlIHRvIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiBBTlRMUjNfRlBSSU5URj8KKwkJCS8vCisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJBTlRMUjM6IEFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYWRkIGEgY2hpbGQgbGlzdCB0byBpdHNlbGYhXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisgICAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIGNoaWxkcmVuJ3MgY2hpbGRyZW4gdG8gdGhpcyBsaXN0CisgICAgICAgIC8vCisgICAgICAgIGlmIChjaGlsZC0+Y2hpbGRyZW4gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyZWUtPmNoaWxkcmVuID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGJ1aWxkIGluZyB0aGUgdHJlZSBzdHJ1Y3R1cmUgaGVyZSwgc28gd2UgbmVlZCBub3QKKyAgICAgICAgICAgICAgICAvLyB3b3JyeSBhYm91dCBkdXBsaWNhdGlvbiBvZiBwb2ludGVycyBhcyB0aGUgdHJlZSBub2RlCisgICAgICAgICAgICAgICAgLy8gZmFjdG9yeSB3aWxsIG9ubHkgY2xlYW4gdXAgZWFjaCBub2RlIG9uY2UuIFNvIHdlIGp1c3QKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGluIHRoZSBjaGlsZCdzIGNoaWxkcmVuIHBvaW50ZXIgYXMgdGhlIGNoaWxkIGlzCisgICAgICAgICAgICAgICAgLy8gYSBuaWwgbm9kZSAoaGFzIG5vdCByb290IGl0c2VsZikuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB0cmVlLT5jaGlsZHJlbiA9IGNoaWxkLT5jaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBjaGlsZC0+Y2hpbGRyZW4gPSBOVUxMOworICAgICAgICAgICAgICAgIGZyZXNoZW5QQUNJbmRleGVzQWxsKHRyZWUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29weSB0aGUgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIG4gPSBjaGlsZC0+Y2hpbGRyZW4tPnNpemUoY2hpbGQtPmNoaWxkcmVuKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQU5UTFIzX0JBU0VfVFJFRSBlbnRyeTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBjaGlsZC0+Y2hpbGRyZW4tPmdldChjaGlsZC0+Y2hpbGRyZW4sIGkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFOVExSMyBsaXN0cyBjYW4gYmUgc3BhcnNlLCB1bmxpa2UgQXJyYXkgTGlzdHMKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUtPmNoaWxkcmVuLT5hZGQodHJlZS0+Y2hpbGRyZW4sIGVudHJ5LCAodm9pZCAoQU5UTFIzX0NERUNMICopICh2b2lkICopKWNoaWxkLT5mcmVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBUcmVlIHdlIGFyZSBhZGRpbmcgaXMgbm90IGEgTmlsIGFuZCBtaWdodCBoYXZlIGNoaWxkcmVuIHRvIGNvcHkKKwkJLy8KKwkJaWYgICh0cmVlLT5jaGlsZHJlbiA9PSBOVUxMKQorCQl7CisJCQkvLyBObyBjaGlsZHJlbiBpbiB0aGUgdHJlZSB3ZSBhcmUgYWRkaW5nIHRvLCBzbyBjcmVhdGUgYSBuZXcgbGlzdCBvbgorCQkJLy8gdGhlIGZseSB0byBob2xkIHRoZW0uCisJCQkvLworCQkJdHJlZS0+Y3JlYXRlQ2hpbGRyZW5MaXN0KHRyZWUpOworCQl9CisKKwkJdHJlZS0+Y2hpbGRyZW4tPmFkZCh0cmVlLT5jaGlsZHJlbiwgY2hpbGQsICh2b2lkIChBTlRMUjNfQ0RFQ0wgKikodm9pZCAqKSljaGlsZC0+ZnJlZSk7CisJCQorCX0KK30KKworLy8vIEFkZCBhbGwgZWxlbWVudHMgb2YgdGhlIHN1cHBsaWVkIGxpc3QgYXMgY2hpbGRyZW4gb2YgdGhpcyBub2RlCisvLy8KK3N0YXRpYyB2b2lkCithZGRDaGlsZHJlbgkocEFOVExSM19CQVNFX1RSRUUgdHJlZSwgcEFOVExSM19MSVNUIGtpZHMpCit7CisJQU5UTFIzX1VJTlQzMiAgICBpOworCUFOVExSM19VSU5UMzIgICAgczsKKworCXMgPSBraWRzLT5zaXplKGtpZHMpOworCWZvcgkoaSA9IDA7IGk8czsgaSsrKQorCXsKKwkJdHJlZS0+YWRkQ2hpbGQodHJlZSwgKHBBTlRMUjNfQkFTRV9UUkVFKShraWRzLT5nZXQoa2lkcywgaSsxKSkpOworCX0KK30KKworCitzdGF0aWMgICAgdm9pZAorc2V0Q2hpbGQJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgaSwgdm9pZCAqIGNoaWxkKQoreworCWlmCSh0cmVlLT5jaGlsZHJlbiA9PSBOVUxMKQorCXsKKwkJdHJlZS0+Y3JlYXRlQ2hpbGRyZW5MaXN0KHRyZWUpOworCX0KKwl0cmVlLT5jaGlsZHJlbi0+c2V0KHRyZWUtPmNoaWxkcmVuLCBpLCBjaGlsZCwgTlVMTCwgQU5UTFIzX0ZBTFNFKTsKK30KKworc3RhdGljIHZvaWQgICAgKgorZGVsZXRlQ2hpbGQJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgaSkKK3sKKwlpZgkoIHRyZWUtPmNoaWxkcmVuID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwlyZXR1cm4gIHRyZWUtPmNoaWxkcmVuLT5yZW1vdmUodHJlZS0+Y2hpbGRyZW4sIGkpOworfQorCitzdGF0aWMgdm9pZCAgICAqCitkdXBUcmVlCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRQluZXdUcmVlOworCUFOVExSM19VSU5UMzIJaTsKKwlBTlRMUjNfVUlOVDMyCXM7CisKKwluZXdUcmVlID0gdHJlZS0+ZHVwTm9kZQkgICAgKHRyZWUpOworCisJaWYJKHRyZWUtPmNoaWxkcmVuICE9IE5VTEwpCisJeworCQlzCSAgICA9IHRyZWUtPmNoaWxkcmVuLT5zaXplICAodHJlZS0+Y2hpbGRyZW4pOworCisJCWZvcgkoaSA9IDA7IGkgPCBzOyBpKyspCisJCXsKKwkJCXBBTlRMUjNfQkFTRV9UUkVFICAgIHQ7CisJCQlwQU5UTFIzX0JBU0VfVFJFRSAgICBuZXdOb2RlOworCisJCQl0ICAgPSAocEFOVExSM19CQVNFX1RSRUUpIHRyZWUtPmNoaWxkcmVuLT5nZXQodHJlZS0+Y2hpbGRyZW4sIGkpOworCisJCQlpZiAgKHQhPSBOVUxMKQorCQkJeworCQkJCW5ld05vZGUJICAgID0gdC0+ZHVwVHJlZSh0KTsKKwkJCQluZXdUcmVlLT5hZGRDaGlsZChuZXdUcmVlLCBuZXdOb2RlKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBuZXdUcmVlOworfQorCitzdGF0aWMgcEFOVExSM19TVFJJTkcKK3RvU3RyaW5nVHJlZQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKwlwQU5UTFIzX1NUUklORyAgc3RyaW5nOworCUFOVExSM19VSU5UMzIgICBpOworCUFOVExSM19VSU5UMzIgICBuOworCXBBTlRMUjNfQkFTRV9UUkVFICAgdDsKKworCWlmCSh0cmVlLT5jaGlsZHJlbiA9PSBOVUxMIHx8IHRyZWUtPmNoaWxkcmVuLT5zaXplKHRyZWUtPmNoaWxkcmVuKSA9PSAwKQorCXsKKwkJcmV0dXJuCXRyZWUtPnRvU3RyaW5nKHRyZWUpOworCX0KKworCS8qIE5lZWQgYSBuZXcgc3RyaW5nIHdpdGggbm90aGluZyBhdCBhbGwgaW4gaXQuCisJKi8KKwlzdHJpbmcJPSB0cmVlLT5zdHJGYWN0b3J5LT5uZXdSYXcodHJlZS0+c3RyRmFjdG9yeSk7CisKKwlpZgkodHJlZS0+aXNOaWxOb2RlKHRyZWUpID09IEFOVExSM19GQUxTRSkKKwl7CisJCXN0cmluZy0+YXBwZW5kOAkoc3RyaW5nLCAiKCIpOworCQlzdHJpbmctPmFwcGVuZFMJKHN0cmluZywgdHJlZS0+dG9TdHJpbmcodHJlZSkpOworCQlzdHJpbmctPmFwcGVuZDgJKHN0cmluZywgIiAiKTsKKwl9CisJaWYJKHRyZWUtPmNoaWxkcmVuICE9IE5VTEwpCisJeworCQluID0gdHJlZS0+Y2hpbGRyZW4tPnNpemUodHJlZS0+Y2hpbGRyZW4pOworCisJCWZvcgkoaSA9IDA7IGkgPCBuOyBpKyspCisJCXsgICAKKwkJCXQgICA9IChwQU5UTFIzX0JBU0VfVFJFRSkgdHJlZS0+Y2hpbGRyZW4tPmdldCh0cmVlLT5jaGlsZHJlbiwgaSk7CisKKwkJCWlmICAoaSA+IDApCisJCQl7CisJCQkJc3RyaW5nLT5hcHBlbmQ4KHN0cmluZywgIiAiKTsKKwkJCX0KKwkJCXN0cmluZy0+YXBwZW5kUyhzdHJpbmcsIHQtPnRvU3RyaW5nVHJlZSh0KSk7CisJCX0KKwl9CisJaWYJKHRyZWUtPmlzTmlsTm9kZSh0cmVlKSA9PSBBTlRMUjNfRkFMU0UpCisJeworCQlzdHJpbmctPmFwcGVuZDgoc3RyaW5nLCIpIik7CisJfQorCisJcmV0dXJuICBzdHJpbmc7Cit9CisKKy8vLyBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKy8vLyBhIGxpc3QgKG5pbC1yb290IHRyZWUpLiBOdW0gb2YgY2hpbGRyZW4gY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlLgorLy8vIEZvciBodWdlIGNoaWxkIGxpc3RzLCBpbnNlcnRpbmcgY2hpbGRyZW4gY2FuIGZvcmNlIHdhbGtpbmcgcmVzdCBvZgorLy8vIGNoaWxkcmVuIHRvIHNldCB0aGVpciBjaGlsZCBpbmRleDsgY291bGQgYmUgc2xvdy4KKy8vLworc3RhdGljIHZvaWQJCQkJCQorcmVwbGFjZUNoaWxkcmVuCQkocEFOVExSM19CQVNFX1RSRUUgcGFyZW50LCBBTlRMUjNfSU5UMzIgc3RhcnRDaGlsZEluZGV4LCBBTlRMUjNfSU5UMzIgc3RvcENoaWxkSW5kZXgsIHBBTlRMUjNfQkFTRV9UUkVFIG5ld1RyZWUpCit7CisJQU5UTFIzX0lOVDMyCXJlcGxhY2luZ0hvd01hbnk7CQkvLyBIb3cgbWFueSBub2RlcyB3aWxsIGdvIGF3YXkKKwlBTlRMUjNfSU5UMzIJcmVwbGFjaW5nV2l0aEhvd01hbnk7CS8vIEhvdyBtYW55IG5vZGVzIHdpbGwgcmVwbGFjZSB0aGVtCisJQU5UTFIzX0lOVDMyCW51bU5ld0NoaWxkcmVuOwkJCS8vIFRyYWNraW5nIHZhcmlhYmxlCisJQU5UTFIzX0lOVDMyCWRlbHRhOwkJCQkJLy8gRGlmZmVyZW5jZSBpbiBuZXcgdnMgZXhpc3RpbmcgY291bnQKKworCUFOVExSM19JTlQzMglpOworCUFOVExSM19JTlQzMglqOworCisJcEFOVExSM19WRUNUT1IJbmV3Q2hpbGRyZW47CQkJLy8gSXRlcmF0b3IgZm9yIHdoYXRldmVyIHdlIGFyZSBnb2luZyB0byBhZGQgaW4KKwlBTlRMUjNfQk9PTEVBTglmcmVlTmV3Q2hpbGRyZW47CQkvLyBXaGV0aGVyIHdlIGNyZWF0ZWQgdGhlIGl0ZXJhdG9yIGxvY2FsbHkgb3IgcmV1c2VkIGl0CisKKwlpZgkocGFyZW50LT5jaGlsZHJlbiA9PSBOVUxMKQorCXsKKwkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAicmVwbGFjZUNoaWxkcmVuIGNhbGw6IEluZGV4ZXMgYXJlIGludmFsaWQ7IG5vIGNoaWxkcmVuIGluIGxpc3QgZm9yICVzIiwgcGFyZW50LT5nZXRUZXh0KHBhcmVudCktPmNoYXJzKTsKKwkJcmV0dXJuOworCX0KKworCS8vIEVpdGhlciB1c2UgdGhlIGV4aXN0aW5nIGxpc3Qgb2YgY2hpbGRyZW4gaW4gdGhlIHN1cHBsaWVkIG5pbCBub2RlLCBvciBidWlsZCBhIHZlY3RvciBvZiB0aGUKKwkvLyB0cmVlIHdlIHdlcmUgZ2l2ZW4gaWYgaXQgaXMgbm90IGEgbmlsIG5vZGUsIHRoZW4gd2UgdHJlYXQgYm90aCBzaXR1YXRpb25zIGV4YWN0bHkgdGhlIHNhbWUKKwkvLworCWlmCShuZXdUcmVlLT5pc05pbE5vZGUobmV3VHJlZSkpCisJeworCQluZXdDaGlsZHJlbiA9IG5ld1RyZWUtPmNoaWxkcmVuOworCQlmcmVlTmV3Q2hpbGRyZW4gPSBBTlRMUjNfRkFMU0U7CQkvLyBXZSBtdXN0IE5PIGZyZWUgdGhpcyBtZW1vcnkKKwl9CisJZWxzZQorCXsKKwkJbmV3Q2hpbGRyZW4gPSBhbnRscjNWZWN0b3JOZXcoMSk7CisJCWlmCShuZXdDaGlsZHJlbiA9PSBOVUxMKQorCQl7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJyZXBsYWNlQ2hpbGRyZW46IG91dCBvZiBtZW1vcnkhISIpOworCQkJZXhpdCgxKTsKKwkJfQorCQluZXdDaGlsZHJlbi0+YWRkKG5ld0NoaWxkcmVuLCAodm9pZCAqKW5ld1RyZWUsIE5VTEwpOworCisJCWZyZWVOZXdDaGlsZHJlbiA9IEFOVExSM19UUlVFOwkJLy8gV2UgbXVzdCBmcmVlIHRoaXMgbWVtb3J5CisJfQorCisJLy8gSW5pdGlhbGl6ZQorCS8vCisJcmVwbGFjaW5nSG93TWFueQkJPSBzdG9wQ2hpbGRJbmRleCAtIHN0YXJ0Q2hpbGRJbmRleCArIDE7CisJcmVwbGFjaW5nV2l0aEhvd01hbnkJPSBuZXdDaGlsZHJlbi0+c2l6ZShuZXdDaGlsZHJlbik7CisJZGVsdGEJCQkJCT0gcmVwbGFjaW5nSG93TWFueSAtIHJlcGxhY2luZ1dpdGhIb3dNYW55OworCW51bU5ld0NoaWxkcmVuCQkJPSBuZXdDaGlsZHJlbi0+c2l6ZShuZXdDaGlsZHJlbik7CisKKwkvLyBJZiBpdCBpcyB0aGUgc2FtZSBudW1iZXIgb2Ygbm9kZXMsIHRoZW4gZG8gYSBkaXJlY3QgcmVwbGFjZW1lbnQKKwkvLworCWlmCShkZWx0YSA9PSAwKQorCXsKKwkJcEFOVExSM19CQVNFX1RSRUUJY2hpbGQ7CisKKwkJLy8gU2FtZSBudW1iZXIgb2Ygbm9kZXMKKwkJLy8KKwkJagk9IDA7CisJCWZvcgkoaSA9IHN0YXJ0Q2hpbGRJbmRleDsgaSA8PSBzdG9wQ2hpbGRJbmRleDsgaSsrKQorCQl7CisJCQljaGlsZCA9IChwQU5UTFIzX0JBU0VfVFJFRSkgbmV3Q2hpbGRyZW4tPmdldChuZXdDaGlsZHJlbiwgaik7CisJCQlwYXJlbnQtPmNoaWxkcmVuLT5zZXQocGFyZW50LT5jaGlsZHJlbiwgaSwgY2hpbGQsIE5VTEwsIEFOVExSM19GQUxTRSk7CisJCQljaGlsZC0+c2V0UGFyZW50KGNoaWxkLCBwYXJlbnQpOworCQkJY2hpbGQtPnNldENoaWxkSW5kZXgoY2hpbGQsIGkpOworCQl9CisJfQorCWVsc2UgaWYgKGRlbHRhID4gMCkKKwl7CisJCUFOVExSM19VSU5UMzIJaW5kZXhUb0RlbGV0ZTsKKworCQkvLyBMZXNzIG5vZGVzIHRoYW4gdGhlcmUgd2VyZSBiZWZvcmUKKwkJLy8gcmV1c2Ugd2hhdCB3ZSBoYXZlIHRoZW4gZGVsZXRlIHRoZSByZXN0CisJCS8vCisJCWZvcgkoaiA9IDA7IGogPCBudW1OZXdDaGlsZHJlbjsgaisrKQorCQl7CisJCQlwYXJlbnQtPmNoaWxkcmVuLT5zZXQocGFyZW50LT5jaGlsZHJlbiwgc3RhcnRDaGlsZEluZGV4ICsgaiwgbmV3Q2hpbGRyZW4tPmdldChuZXdDaGlsZHJlbiwgaiksIE5VTEwsIEFOVExSM19GQUxTRSk7CisJCX0KKworCQkvLyBXZSBqdXN0IGRlbGV0ZSB0aGUgc2FtZSBpbmRleCBwb3NpdGlvbiB1bnRpbCBkb25lCisJCS8vCisJCWluZGV4VG9EZWxldGUgPSBzdGFydENoaWxkSW5kZXggKyBudW1OZXdDaGlsZHJlbjsKKworCQlmb3IJKGogPSBpbmRleFRvRGVsZXRlOyBqIDw9IChBTlRMUjNfSU5UMzIpc3RvcENoaWxkSW5kZXg7IGorKykKKwkJeworCQkJcGFyZW50LT5jaGlsZHJlbi0+cmVtb3ZlKHBhcmVudC0+Y2hpbGRyZW4sIGluZGV4VG9EZWxldGUpOworCQl9CisKKwkJcGFyZW50LT5mcmVzaGVuUEFDSW5kZXhlcyhwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCk7CisJfQorCWVsc2UKKwl7CisJCUFOVExSM19VSU5UMzIgbnVtVG9JbnNlcnQ7CisKKwkJLy8gTW9yZSBub2RlcyB0aGFuIHRoZXJlIHdlcmUgYmVmb3JlCisJCS8vIFVzZSB3aGF0IHdlIGNhbiwgdGhlbiBzdGFydCBhZGRpbmcKKwkJLy8KKwkJZm9yCShqID0gMDsgaiA8IHJlcGxhY2luZ0hvd01hbnk7IGorKykKKwkJeworCQkJcGFyZW50LT5jaGlsZHJlbi0+c2V0KHBhcmVudC0+Y2hpbGRyZW4sIHN0YXJ0Q2hpbGRJbmRleCArIGosIG5ld0NoaWxkcmVuLT5nZXQobmV3Q2hpbGRyZW4sIGopLCBOVUxMLCBBTlRMUjNfRkFMU0UpOworCQl9CisKKwkJbnVtVG9JbnNlcnQgPSByZXBsYWNpbmdXaXRoSG93TWFueSAtIHJlcGxhY2luZ0hvd01hbnk7CisKKwkJZm9yCShqID0gcmVwbGFjaW5nSG93TWFueTsgaiA8IHJlcGxhY2luZ1dpdGhIb3dNYW55OyBqKyspCisJCXsKKwkJCXBhcmVudC0+Y2hpbGRyZW4tPmFkZChwYXJlbnQtPmNoaWxkcmVuLCBuZXdDaGlsZHJlbi0+Z2V0KG5ld0NoaWxkcmVuLCBqKSwgTlVMTCk7CisJCX0KKworCQlwYXJlbnQtPmZyZXNoZW5QQUNJbmRleGVzKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4KTsKKwl9CisKKwlpZgkoZnJlZU5ld0NoaWxkcmVuID09IEFOVExSM19UUlVFKQorCXsKKwkJQU5UTFIzX0ZSRUUobmV3Q2hpbGRyZW4tPmVsZW1lbnRzKTsKKwkJbmV3Q2hpbGRyZW4tPmVsZW1lbnRzID0gTlVMTDsKKwkJbmV3Q2hpbGRyZW4tPnNpemUgPSAwOworCQlBTlRMUjNfRlJFRShuZXdDaGlsZHJlbik7CQkvLyBXaWxsIG5vdCBmcmVlIHRoZSBub2RlcworCX0KK30KKworLy8vIFNldCB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbmRleGVzIGZvciBhbGwgY2hpbGRyZW4gb2YgdGhlCisvLy8gc3VwcGxpZWQgdHJlZS4KKy8vLworc3RhdGljCXZvaWQKK2ZyZXNoZW5QQUNJbmRleGVzQWxsKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpCit7CisJdHJlZS0+ZnJlc2hlblBBQ0luZGV4ZXModHJlZSwgMCk7Cit9CisKKy8vLyBTZXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5kZXhlcyBmb3Igc29tZSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlCisvLy8gc3VwcGxpZWQgdHJlZSwgc3RhcnRpbmcgd2l0aCB0aGUgY2hpbGQgYXQgdGhlIHN1cHBsaWVkIGluZGV4LgorLy8vCitzdGF0aWMJdm9pZAorZnJlc2hlblBBQ0luZGV4ZXMJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUsIEFOVExSM19VSU5UMzIgb2Zmc2V0KQoreworCUFOVExSM19VSU5UMzIJY291bnQ7CisJQU5UTFIzX1VJTlQzMgljOworCisJY291bnQJPSB0cmVlLT5nZXRDaGlsZENvdW50KHRyZWUpOwkJLy8gSG93IG1hbnkgY2hpbGRyZW4gZG8gd2UgaGF2ZSAKKworCS8vIExvb3AgZnJvbSB0aGUgc3VwcGxpZWQgaW5kZXggYW5kIHNldCB0aGUgaW5kZXhlcyBhbmQgcGFyZW50CisJLy8KKwlmb3IJKGMgPSBvZmZzZXQ7IGMgPCBjb3VudDsgYysrKQorCXsKKwkJcEFOVExSM19CQVNFX1RSRUUJY2hpbGQ7CisKKwkJY2hpbGQgPSB0cmVlLT5nZXRDaGlsZCh0cmVlLCBjKTsKKworCQljaGlsZC0+c2V0Q2hpbGRJbmRleChjaGlsZCwgYyk7CisJCWNoaWxkLT5zZXRQYXJlbnQoY2hpbGQsIHRyZWUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzYmFzZXRyZWVhZGFwdG9yLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNiYXNldHJlZWFkYXB0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU4NzhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzYmFzZXRyZWVhZGFwdG9yLmMKQEAgLTAsMCArMSw5MDkgQEAKKy8qKiBcZmlsZQorICogQ29udGFpbnMgdGhlIGJhc2UgZnVuY3Rpb25zIHRoYXQgYWxsIHRyZWUgYWRhcHRvcnMgc3RhcnQgd2l0aC4KKyAqIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIHRoZW4gYmUgb3ZlcnJpZGRlbiBieSBhbnkgaGlnaGVyIGltcGxlbWVudGF0aW9uLgorICogCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzYmFzZXRyZWVhZGFwdG9yLmg+CisKKyNpZmRlZglBTlRMUjNfV0lORE9XUworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApCisjZW5kaWYKKworLyogSW50ZXJmYWNlIGZ1bmN0aW9ucworICovCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJbmlsTm9kZQkJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvcik7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJZGJnTmlsCQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQlkdXBUcmVlCQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQlkYmdEdXBUcmVlCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCWR1cFRyZWVUVAkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0LCBwQU5UTFIzX0JBU0VfVFJFRSBwYXJlbnQpOworc3RhdGljCXZvaWQJCQkJYWRkQ2hpbGQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpOworc3RhdGljCXZvaWQJCQkJZGJnQWRkQ2hpbGQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCWJlY29tZVJvb3QJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgbmV3Um9vdCwgcEFOVExSM19CQVNFX1RSRUUgb2xkUm9vdCk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJZGJnQmVjb21lUm9vdAkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIG5ld1Jvb3QsIHBBTlRMUjNfQkFTRV9UUkVFIG9sZFJvb3QpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCXJ1bGVQb3N0UHJvY2Vzc2luZwkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgcm9vdCk7CitzdGF0aWMJdm9pZAkJCQlhZGRDaGlsZFRva2VuCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19DT01NT05fVE9LRU4gY2hpbGQpOworc3RhdGljCXZvaWQJCQkJZGJnQWRkQ2hpbGRUb2tlbgkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19DT01NT05fVE9LRU4gY2hpbGQpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCWJlY29tZVJvb3RUb2tlbgkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHZvaWQgKiBuZXdSb290LCBwQU5UTFIzX0JBU0VfVFJFRSBvbGRSb290KTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQlkYmdCZWNvbWVSb290VG9rZW4JCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHZvaWQgKiBuZXdSb290LCBwQU5UTFIzX0JBU0VfVFJFRSBvbGRSb290KTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQljcmVhdGVUeXBlVG9rZW4JCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBBTlRMUjNfVUlOVDMyIHRva2VuVHlwZSwgcEFOVExSM19DT01NT05fVE9LRU4gZnJvbVRva2VuKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQlkYmdDcmVhdGVUeXBlVG9rZW4JCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBmcm9tVG9rZW4pOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCWNyZWF0ZVR5cGVUb2tlblRleHQJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBmcm9tVG9rZW4sIHBBTlRMUjNfVUlOVDggdGV4dCk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJZGJnQ3JlYXRlVHlwZVRva2VuVGV4dAkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBBTlRMUjNfVUlOVDMyIHRva2VuVHlwZSwgcEFOVExSM19DT01NT05fVE9LRU4gZnJvbVRva2VuLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCWNyZWF0ZVR5cGVUZXh0CQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgQU5UTFIzX1VJTlQzMiB0b2tlblR5cGUsIHBBTlRMUjNfVUlOVDggdGV4dCk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJZGJnQ3JlYXRlVHlwZVRleHQJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworc3RhdGljCUFOVExSM19VSU5UMzIJCWdldFR5cGUJCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQpOworc3RhdGljCXZvaWQJCQkJc2V0VHlwZQkJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgQU5UTFIzX1VJTlQzMiB0eXBlKTsKK3N0YXRpYwlwQU5UTFIzX1NUUklORwkJZ2V0VGV4dAkJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJdm9pZAkJCQlzZXRUZXh0CQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX1NUUklORyB0KTsKK3N0YXRpYwl2b2lkCQkJCXNldFRleHQ4CQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfVUlOVDggdCk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJZ2V0Q2hpbGQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgQU5UTFIzX1VJTlQzMiBpKTsKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCQlnZXRDaGlsZENvdW50CQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJQU5UTFIzX1VJTlQzMgkJZ2V0VW5pcXVlSUQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJQU5UTFIzX0JPT0xFQU4JCWlzTmlsTm9kZQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwlwQU5UTFIzX1NUUklORwkJbWFrZURvdAkJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgdm9pZCAqIHRoZVRyZWUpOworCisvKiogR2l2ZW4gYSBwb2ludGVyIHRvIGEgYmFzZSB0cmVlIGFkYXB0b3Igc3RydWN0dXJlICh3aGljaCBpcyB1c3VhbGx5IGVtYmVkZGVkIGluIHRoZQorICogIHN1cGVyIGNsYXNzIHRoZSBpbXBsZW1lbnRzIHRoZSB0cmVlIGFkYXB0b3IgdXNlZCBpbiB0aGUgcGFyc2UpLCBpbml0aWFsaXplIGl0cworICogIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBzbyBvbi4KKyAqLworQU5UTFIzX0FQSSB2b2lkCithbnRscjNCYXNlVHJlZUFkYXB0b3JJbml0KHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUglkZWJ1Z2dlcikKK3sKKwkvLyBJbml0aWFsaXplIHRoZSBpbnRlcmZhY2UKKwkvLworCWlmCShkZWJ1Z2dlciA9PSBOVUxMKQorCXsKKwkJYWRhcHRvci0+bmlsTm9kZQkJCQk9ICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IpKSAJCQkJCQkJCQorCQkJCQkJCQkJCQkJCQkJCQkJCQluaWxOb2RlOworCQlhZGFwdG9yLT5hZGRDaGlsZAkJCQk9ICh2b2lkICAgKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgdm9pZCAqKSkJCQkJCQkJCQorCQkJCQkJCQkJCQkJCQkJCQkJCQlhZGRDaGlsZDsKKwkJYWRhcHRvci0+YmVjb21lUm9vdAkJCQk9ICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgdm9pZCAqKSkJCQkJCisJCQkJCQkJCQkJCQkJCQkJCQkJCWJlY29tZVJvb3Q7CisJCWFkYXB0b3ItPmFkZENoaWxkVG9rZW4JCQk9ICh2b2lkICAgKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgcEFOVExSM19DT01NT05fVE9LRU4pKQkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJYWRkQ2hpbGRUb2tlbjsKKwkJYWRhcHRvci0+YmVjb21lUm9vdFRva2VuCQk9ICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgdm9pZCAqKSkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJYmVjb21lUm9vdFRva2VuOworCQlhZGFwdG9yLT5jcmVhdGVUeXBlVG9rZW4JCT0gKHZvaWQgKiAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgQU5UTFIzX1VJTlQzMiwgcEFOVExSM19DT01NT05fVE9LRU4pKQorCQkJCQkJCQkJCQkJCQkJCQkJCQljcmVhdGVUeXBlVG9rZW47CisJCWFkYXB0b3ItPmNyZWF0ZVR5cGVUb2tlblRleHQJPSAodm9pZCAqICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCBBTlRMUjNfVUlOVDMyLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiwgcEFOVExSM19VSU5UOCkpCisJCQkJCQkJCQkJCQkJCQkJCQkJCWNyZWF0ZVR5cGVUb2tlblRleHQ7CisJCWFkYXB0b3ItPmNyZWF0ZVR5cGVUZXh0CQkJPSAodm9pZCAqICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCBBTlRMUjNfVUlOVDMyLCBwQU5UTFIzX1VJTlQ4KSkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJY3JlYXRlVHlwZVRleHQ7CisJCWFkYXB0b3ItPmR1cFRyZWUJCQkJPSAodm9pZCAqICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQkJIAkJCQkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJZHVwVHJlZTsKKwl9CisJZWxzZQorCXsKKwkJYWRhcHRvci0+bmlsTm9kZQkJCQk9ICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdOaWw7CisJCWFkYXB0b3ItPmFkZENoaWxkCQkJCT0gKHZvaWQgICAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdBZGRDaGlsZDsKKwkJYWRhcHRvci0+YmVjb21lUm9vdAkJCQk9ICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgdm9pZCAqKSkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJZGJnQmVjb21lUm9vdDsKKwkJYWRhcHRvci0+YWRkQ2hpbGRUb2tlbgkJCT0gKHZvaWQgICAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqLCBwQU5UTFIzX0NPTU1PTl9UT0tFTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ0FkZENoaWxkVG9rZW47CisJCWFkYXB0b3ItPmJlY29tZVJvb3RUb2tlbgkJPSAodm9pZCAqICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICosIHZvaWQgKikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ0JlY29tZVJvb3RUb2tlbjsKKwkJYWRhcHRvci0+Y3JlYXRlVHlwZVRva2VuCQk9ICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIEFOVExSM19VSU5UMzIsIHBBTlRMUjNfQ09NTU9OX1RPS0VOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnQ3JlYXRlVHlwZVRva2VuOworCQlhZGFwdG9yLT5jcmVhdGVUeXBlVG9rZW5UZXh0CT0gKHZvaWQgKiAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgQU5UTFIzX1VJTlQzMiwgcEFOVExSM19DT01NT05fVE9LRU4sIHBBTlRMUjNfVUlOVDgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdDcmVhdGVUeXBlVG9rZW5UZXh0OworCQlhZGFwdG9yLT5jcmVhdGVUeXBlVGV4dAkJCT0gKHZvaWQgKiAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgQU5UTFIzX1VJTlQzMiwgcEFOVExSM19VSU5UOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ0NyZWF0ZVR5cGVUZXh0OworCQlhZGFwdG9yLT5kdXBUcmVlCQkJCT0gKHZvaWQgKiAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnRHVwVHJlZTsKKwkJZGVidWdnZXItPmFkYXB0b3IJCQkJPSBhZGFwdG9yOworCX0KKworCWFkYXB0b3ItPmR1cFRyZWVUVAkJCQk9ICAodm9pZCAqICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICosIHZvaWQgKikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cFRyZWVUVDsKKwlhZGFwdG9yLT5ydWxlUG9zdFByb2Nlc3NpbmcJCT0gICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVQb3N0UHJvY2Vzc2luZzsKKwlhZGFwdG9yLT5nZXRUeXBlCQkJCT0gIChBTlRMUjNfVUlOVDMyICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlOworCWFkYXB0b3ItPnNldFR5cGUJCQkJPSAgKHZvaWQgICAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqLCBBTlRMUjNfVUlOVDMyKSkKKwkJCQkJCQkJCQkJCQkJCQkJCQkJc2V0VHlwZTsKKwlhZGFwdG9yLT5nZXRUZXh0CQkJCT0gIChwQU5UTFIzX1NUUklORyAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRleHQ7CisJYWRhcHRvci0+c2V0VGV4dDgJCQkJPSAgKHZvaWQgICAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgcEFOVExSM19VSU5UOCkpCisJCQkJCQkJCQkJCQkJCQkJCQkJCXNldFRleHQ4OworCWFkYXB0b3ItPnNldFRleHQJCQkJPSAgKHZvaWQgICAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgcEFOVExSM19TVFJJTkcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZXh0OworCWFkYXB0b3ItPmdldENoaWxkCQkJCT0gICh2b2lkICogKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgQU5UTFIzX1VJTlQzMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkOworCWFkYXB0b3ItPmdldENoaWxkQ291bnQJCQk9ICAoQU5UTFIzX1VJTlQzMiAoKikocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2hpbGRDb3VudDsKKwlhZGFwdG9yLT5nZXRVbmlxdWVJRAkJCT0gIChBTlRMUjNfVUlOVDMyICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRVbmlxdWVJRDsKKwlhZGFwdG9yLT5pc05pbE5vZGUJCQkJPSAgKEFOVExSM19CT09MRUFOICgqKShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05pbE5vZGU7CisKKwlhZGFwdG9yLT5tYWtlRG90CQkJCT0gIChwQU5UTFIzX1NUUklORyAgKCopKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKikpCisJCQkJCQkJCQkJCQkJCQkJCQkJCW1ha2VEb3Q7CisJCisJLyogUmVtYWluaW5nIGZ1bmN0aW9ucyBmaWxsZWQgaW4gYnkgdGhlIGNhbGxlci4KKwkgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZWZpbmVEb3ROb2RlcyhwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHZvaWQgKiB0LCBwQU5UTFIzX1NUUklORyBkb3RTcGVjICkKK3sKKwkvLyBIb3cgbWFueSBub2RlcyBhcmUgd2UgdGFsa2luZyBhYm91dD8KKwkvLworCWludAluQ291bnQ7CisJaW50IGk7CisgICAgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQ7CisJY2hhcglidWZmWzY0XTsKKwlwQU5UTFIzX1NUUklORwl0ZXh0OworCWludAkJajsKKworCisKKworCisJLy8gQ291bnQgdGhlIG5vZGVzCisJLy8KKwluQ291bnQgPSBhZGFwdG9yLT5nZXRDaGlsZENvdW50KGFkYXB0b3IsIHQpOworCisJaWYJKG5Db3VudCA9PSAwKQorCXsKKwkJLy8gVGhpcyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluY2x1ZGVkIGFzIGEgY2hpbGQgb2YgYW5vdGhlciBub2RlCisJCS8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkLgorCQkvLworCQlyZXR1cm47CisJfQorCisJLy8gRm9yIGVhY2ggY2hpbGQgb2YgdGhlIGN1cnJlbnQgdHJlZSwgZGVmaW5lIGEgbm9kZSB1c2luZyB0aGUKKwkvLyBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgbm9kZSB0byBuYW1lIGl0CisJLy8KKwlmb3IJKGkgPSAwOyBpPG5Db3VudDsgaSsrKQorCXsKKworCQkvLyBQaWNrIHVwIGEgcG9pbnRlciBmb3IgdGhlIGNoaWxkCisJCS8vCisJCWNoaWxkID0gYWRhcHRvci0+Z2V0Q2hpbGQoYWRhcHRvciwgdCwgaSk7CisKKwkJLy8gTmFtZSB0aGUgbm9kZQorCQkvLworCQlzcHJpbnRmKGJ1ZmYsICJcdG4lcFtsYWJlbD1cIiIsIGNoaWxkKTsKKwkJZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCBidWZmKTsKKwkJdGV4dCA9IGFkYXB0b3ItPmdldFRleHQoYWRhcHRvciwgY2hpbGQpOworCQlmb3IgKGogPSAwOyBqIDwgKEFOVExSM19JTlQzMikodGV4dC0+bGVuKTsgaisrKQorCQl7CisgICAgICAgICAgICBzd2l0Y2godGV4dC0+Y2hhckF0KHRleHQsIGopKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorCisgICAgICAgICAgICAgICAgICAgIGRvdFNwZWMtPmFwcGVuZDgoZG90U3BlYywgIlxcXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisKKyAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXFxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorCisgICAgICAgICAgICAgICAgICAgIGRvdFNwZWMtPmFwcGVuZDgoZG90U3BlYywgIlxcciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YWRkYyhkb3RTcGVjLCB0ZXh0LT5jaGFyQXQodGV4dCwgaikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwkJfQorCQlkb3RTcGVjLT5hcHBlbmQ4KGRvdFNwZWMsICJcIl1cbiIpOworCisJCS8vIEFuZCBub3cgZGVmaW5lIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGNoaWxkIChpZiBhbnkpCisJCS8vCisJCWRlZmluZURvdE5vZGVzKGFkYXB0b3IsIGNoaWxkLCBkb3RTcGVjKTsKKwl9CisJCisJLy8gRG9uZQorCS8vCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGVmaW5lRG90RWRnZXMocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCB2b2lkICogdCwgcEFOVExSM19TVFJJTkcgZG90U3BlYykKK3sKKwkvLyBIb3cgbWFueSBub2RlcyBhcmUgd2UgdGFsa2luZyBhYm91dD8KKwkvLworCWludAluQ291bnQ7CisJaW50IGk7CisKKwlpZgkodCA9PSBOVUxMKQorCXsKKwkJLy8gTm8gdHJlZSwgc28gZG8gbm90aGluZworCQkvLworCQlyZXR1cm47CisJfQorCisJLy8gQ291bnQgdGhlIG5vZGVzCisJLy8KKwluQ291bnQgPSBhZGFwdG9yLT5nZXRDaGlsZENvdW50KGFkYXB0b3IsIHQpOworCisJaWYJKG5Db3VudCA9PSAwKQorCXsKKwkJLy8gVGhpcyB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluY2x1ZGVkIGFzIGEgY2hpbGQgb2YgYW5vdGhlciBub2RlCisJCS8vIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkLgorCQkvLworCQlyZXR1cm47CisJfQorCisJLy8gRm9yIGVhY2ggY2hpbGQsIGRlZmluZSBhbiBlZGdlIGZyb20gdGhpcyBwYXJlbnQsIHRoZW4gcHJvY2VzcworCS8vIGFuZCBjaGlsZHJlbiBvZiB0aGlzIGNoaWxkIGluIHRoZSBzYW1lIHdheQorCS8vCisJZm9yCShpPTA7IGk8bkNvdW50OyBpKyspCisJeworCQlwQU5UTFIzX0JBU0VfVFJFRSBjaGlsZDsKKwkJY2hhcglidWZmWzEyOF07CisgICAgICAgIHBBTlRMUjNfU1RSSU5HIHRleHQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgajsKKworCQkvLyBOZXh0IGNoaWxkCisJCS8vCisJCWNoaWxkCT0gYWRhcHRvci0+Z2V0Q2hpbGQoYWRhcHRvciwgdCwgaSk7CisKKwkJLy8gQ3JlYXRlIHRoZSBlZGdlIHJlbGF0aW9uCisJCS8vCisJCXNwcmludGYoYnVmZiwgIlx0XHRuJXAgLT4gbiVwXHRcdC8vICIsICB0LCBjaGlsZCk7CisgICAgICAgIAorCQlkb3RTcGVjLT5hcHBlbmQ4KGRvdFNwZWMsIGJ1ZmYpOworCisJCS8vIERvY3VtZW50IHRoZSByZWxhdGlvbnNoaXAKKwkJLy8KKyAgICAgICAgdGV4dCA9IGFkYXB0b3ItPmdldFRleHQoYWRhcHRvciwgdCk7CisJCWZvciAoaiA9IDA7IGogPCAoQU5UTFIzX0lOVDMyKSh0ZXh0LT5sZW4pOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2godGV4dC0+Y2hhckF0KHRleHQsIGopKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdFNwZWMtPmFwcGVuZDgoZG90U3BlYywgIlxcXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdFNwZWMtPmFwcGVuZDgoZG90U3BlYywgIlxcciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YWRkYyhkb3RTcGVjLCB0ZXh0LT5jaGFyQXQodGV4dCwgaikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiIC0+ICIpOworCisgICAgICAgIHRleHQgPSBhZGFwdG9yLT5nZXRUZXh0KGFkYXB0b3IsIGNoaWxkKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IChBTlRMUjNfSU5UMzIpKHRleHQtPmxlbik7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCh0ZXh0LT5jaGFyQXQodGV4dCwgaikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlICciJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXFxcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorCisgICAgICAgICAgICAgICAgICAgICAgICBkb3RTcGVjLT5hcHBlbmQ4KGRvdFNwZWMsICJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXFxyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAgICAgICAgICAgICBkb3RTcGVjLT5hZGRjKGRvdFNwZWMsIHRleHQtPmNoYXJBdCh0ZXh0LCBqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXG4iKTsKKworICAgICAgICAKKwkJLy8gRGVmaW5lIGVkZ2VzIGZvciB0aGlzIGNoaWxkCisJCS8vCisJCWRlZmluZURvdEVkZ2VzKGFkYXB0b3IsIGNoaWxkLCBkb3RTcGVjKTsKKwl9CisKKwkvLyBEb25lCisJLy8KKwlyZXR1cm47Cit9CisKKy8vLyBQcm9kdWNlIGEgRE9UIHNwZWNpZmljYXRpb24gZm9yIGdyYXBodml6CisvLworc3RhdGljIHBBTlRMUjNfU1RSSU5HCittYWtlRG90CShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHZvaWQgKiB0aGVUcmVlKQoreworCS8vIFRoZSBzdHJpbmcgd2UgYXJlIGJ1aWxkaW5nIHVwCisJLy8KKwlwQU5UTFIzX1NUUklORwkJZG90U3BlYzsKKwljaGFyICAgICAgICAgICAgICAgIGJ1ZmZbNjRdOworCXBBTlRMUjNfU1RSSU5HICAgICAgdGV4dDsKKwlpbnQgICAgICAgICAgICAgICAgIGo7CisKKwlkb3RTcGVjID0gYWRhcHRvci0+c3RyRmFjdG9yeS0+bmV3U3RyOAorCQkKKwkJKAorCQkJYWRhcHRvci0+c3RyRmFjdG9yeSwKKworCQkJLy8gRGVmYXVsdCBsb29rIGFuZCBmZWVsCisJCQkvLworCQkJKHBBTlRMUjNfVUlOVDgpCisJCQkiZGlncmFwaCB7XG5cbiIKKwkJCSJcdG9yZGVyaW5nPW91dDtcbiIKKwkJCSJcdHJhbmtzZXA9LjQ7XG4iCisJCQkiXHRiZ2NvbG9yPVwibGlnaHRncmV5XCI7ICBub2RlIFtzaGFwZT1ib3gsIGZpeGVkc2l6ZT1mYWxzZSwgZm9udHNpemU9MTIsIGZvbnRuYW1lPVwiSGVsdmV0aWNhLWJvbGRcIiwgZm9udGNvbG9yPVwiYmx1ZVwiXG4iCisJCQkiXHR3aWR0aD0uMjUsIGhlaWdodD0uMjUsIGNvbG9yPVwiYmxhY2tcIiwgZmlsbGNvbG9yPVwid2hpdGVcIiwgc3R5bGU9XCJmaWxsZWQsIHNvbGlkLCBib2xkXCJdO1xuXG4iCisJCQkiXHRlZGdlIFthcnJvd3NpemU9LjUsIGNvbG9yPVwiYmxhY2tcIiwgc3R5bGU9XCJib2xkXCJdXG5cbiIKKwkJKTsKKworICAgIGlmCSh0aGVUcmVlID09IE5VTEwpCisJeworCQkvLyBObyB0cmVlLCBzbyBjcmVhdGUgYSBibGFuayBzcGVjCisJCS8vCisJCWRvdFNwZWMtPmFwcGVuZDgoZG90U3BlYywgIm4wW2xhYmVsPVwiRU1QVFkgVFJFRVwiXVxuIik7CisJCXJldHVybiBkb3RTcGVjOworCX0KKworICAgIHNwcmludGYoYnVmZiwgIlx0biVwW2xhYmVsPVwiIiwgdGhlVHJlZSk7CisJZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCBidWZmKTsKKyAgICB0ZXh0ID0gYWRhcHRvci0+Z2V0VGV4dChhZGFwdG9yLCB0aGVUcmVlKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgKEFOVExSM19JTlQzMikodGV4dC0+bGVuKTsgaisrKQorICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCh0ZXh0LT5jaGFyQXQodGV4dCwgaikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6CisKKyAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXFxcIiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKworICAgICAgICAgICAgICAgICAgICBkb3RTcGVjLT5hcHBlbmQ4KGRvdFNwZWMsICJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisKKyAgICAgICAgICAgICAgICAgICAgZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXFxyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgICAgICAgICBkb3RTcGVjLT5hZGRjKGRvdFNwZWMsIHRleHQtPmNoYXJBdCh0ZXh0LCBqKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0KKwlkb3RTcGVjLT5hcHBlbmQ4KGRvdFNwZWMsICJcIl1cbiIpOworCisJLy8gRmlyc3QgcHJvZHVjZSB0aGUgbm9kZSBkZWZpbnRpb25zCisJLy8KKwlkZWZpbmVEb3ROb2RlcyhhZGFwdG9yLCB0aGVUcmVlLCBkb3RTcGVjKTsKKwlkb3RTcGVjLT5hcHBlbmQ4KGRvdFNwZWMsICJcbiIpOworCWRlZmluZURvdEVkZ2VzKGFkYXB0b3IsIHRoZVRyZWUsIGRvdFNwZWMpOworCQorCS8vIFRlcm1pbmF0ZSB0aGUgc3BlYworCS8vCisJZG90U3BlYy0+YXBwZW5kOChkb3RTcGVjLCAiXG59Iik7CisKKwkvLyBSZXN1bHQKKwkvLworCXJldHVybiBkb3RTcGVjOworfQorCisKKy8qKiBDcmVhdGUgYW5kIHJldHVybiBhIG5pbCB0cmVlIG5vZGUgKG5vIHRva2VuIHBheWxvYWQpCisgKi8KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkKK25pbE5vZGUJICAgIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IpCit7CisJcmV0dXJuCWFkYXB0b3ItPmNyZWF0ZShhZGFwdG9yLCBOVUxMKTsKK30KKworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQorZGJnTmlsCSAgICAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yKQoreworCXBBTlRMUjNfQkFTRV9UUkVFIHQ7CisKKwl0ID0gYWRhcHRvci0+Y3JlYXRlCQkJCShhZGFwdG9yLCBOVUxMKTsKKwlhZGFwdG9yLT5kZWJ1Z2dlci0+Y3JlYXRlTm9kZQkoYWRhcHRvci0+ZGVidWdnZXIsIHQpOworCisJcmV0dXJuCXQ7Cit9CisKKy8qKiBSZXR1cm4gYSBkdXBsaWNhdGUgb2YgdGhlIGVudGlyZSB0cmVlIChpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSB0aGUgCisgKiAgQkFTRV9UUkVFIGludGVyZmFjZS4pCisgKi8KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkKK2R1cFRyZWUgIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisJcmV0dXJuCWFkYXB0b3ItPmR1cFRyZWVUVChhZGFwdG9yLCB0LCBOVUxMKTsKK30KKworcEFOVExSM19CQVNFX1RSRUUKK2R1cFRyZWVUVAkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIHBBTlRMUjNfQkFTRV9UUkVFIHBhcmVudCkKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRQluZXdUcmVlOworCXBBTlRMUjNfQkFTRV9UUkVFCWNoaWxkOworCXBBTlRMUjNfQkFTRV9UUkVFCW5ld1N1YlRyZWU7CisJQU5UTFIzX1VJTlQzMgkJbjsKKwlBTlRMUjNfVUlOVDMyCQlpOworCisJaWYJKHQgPT0gTlVMTCkKKwl7CisJCXJldHVybiBOVUxMOworCX0KKwluZXdUcmVlID0gdC0+ZHVwTm9kZSh0KTsKKworCS8vIEVuc3VyZSBuZXcgc3VidHJlZSByb290IGhhcyBwYXJlbnQvY2hpbGQgaW5kZXggc2V0CisJLy8KKwlhZGFwdG9yLT5zZXRDaGlsZEluZGV4CQkoYWRhcHRvciwgbmV3VHJlZSwgdC0+Z2V0Q2hpbGRJbmRleCh0KSk7CisJYWRhcHRvci0+c2V0UGFyZW50CQkJKGFkYXB0b3IsIG5ld1RyZWUsIHBhcmVudCk7CisJbiA9IGFkYXB0b3ItPmdldENoaWxkQ291bnQJKGFkYXB0b3IsIHQpOworCisJZm9yCShpPTA7IGkgPCBuOyBpKyspCisJeworCQljaGlsZCA9IGFkYXB0b3ItPmdldENoaWxkCQkoYWRhcHRvciwgdCwgaSk7CisJCW5ld1N1YlRyZWUgPSBhZGFwdG9yLT5kdXBUcmVlVFQJKGFkYXB0b3IsIGNoaWxkLCB0KTsKKwkJYWRhcHRvci0+YWRkQ2hpbGQJCQkJKGFkYXB0b3IsIG5ld1RyZWUsIG5ld1N1YlRyZWUpOworCX0KKwlyZXR1cm4JbmV3VHJlZTsKK30KKworLy8vIFNlbmRzIHRoZSByZXF1aXJlZCBkZWJ1Z2dpbmcgZXZlbnRzIGZvciBkdXBsaWNhdGluZyBhIHRyZWUKKy8vLyB0byB0aGUgZGVidWdnZXIuCisvLy8KK3N0YXRpYyB2b2lkCitzaW11bGF0ZVRyZWVDb25zdHJ1Y3Rpb24ocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCUFOVExSM19VSU5UMzIJCW47CisJQU5UTFIzX1VJTlQzMgkJaTsKKwlwQU5UTFIzX0JBU0VfVFJFRQljaGlsZDsKKworCS8vIFNlbmQgdGhlIGNyZWF0ZSBub2RlIGV2ZW50CisJLy8KKwlhZGFwdG9yLT5kZWJ1Z2dlci0+Y3JlYXRlTm9kZShhZGFwdG9yLT5kZWJ1Z2dlciwgdHJlZSk7CisKKwluID0gYWRhcHRvci0+Z2V0Q2hpbGRDb3VudChhZGFwdG9yLCB0cmVlKTsKKwlmb3IJKGkgPSAwOyBpIDwgbjsgaSsrKQorCXsKKwkJY2hpbGQgPSBhZGFwdG9yLT5nZXRDaGlsZChhZGFwdG9yLCB0cmVlLCBpKTsKKwkJc2ltdWxhdGVUcmVlQ29uc3RydWN0aW9uKGFkYXB0b3IsIGNoaWxkKTsKKwkJYWRhcHRvci0+ZGVidWdnZXItPmFkZENoaWxkKGFkYXB0b3ItPmRlYnVnZ2VyLCB0cmVlLCBjaGlsZCk7CisJfQorfQorCitwQU5UTFIzX0JBU0VfVFJFRQorZGJnRHVwVHJlZQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRSB0OworCisJLy8gQ2FsbCB0aGUgbm9ybWFsIGR1cCB0cmVlIG1lY2hhbmlzbSBmaXJzdAorCS8vCisJdCA9IGFkYXB0b3ItPmR1cFRyZWVUVChhZGFwdG9yLCB0cmVlLCBOVUxMKTsKKworCS8vIEluIG9yZGVyIHRvIHRlbGwgdGhlIGRlYnVnZ2VyIHdoYXQgd2UgaGF2ZSBqdXN0IGRvbmUsIHdlIG5vdworCS8vIHNpbXVsYXRlIHRoZSB0cmVlIGJ1aWxkaW5nIG1lY2hhbmlzbS4gVEhpcyB3aWxsIGZpcmUKKwkvLyBsb3RzIG9mIGRlYnVnZ2luZyBldmVudHMgdG8gdGhlIGNsaWVudCBhbmQgbG9vayBsaWtlIHdlCisJLy8gZHVwZWQgdGhlIHRyZWUuLgorCS8vCisJc2ltdWxhdGVUcmVlQ29uc3RydWN0aW9uKGFkYXB0b3IsIHQpOworCisJcmV0dXJuIHQ7Cit9CisKKy8qKiBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgKiAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAqICBhbmQgY2hpbGQgaXNOaWxOb2RlIHRoZW4gaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIFRoaXMKKyAqICBpcyBmb3IgY29uc3RydWN0aW9uIGFuZCBJJ20gbm90IHN1cmUgaXQncyBjb21wbGV0ZWx5IGdlbmVyYWwgZm9yCisgKiAgYSB0cmVlJ3MgYWRkQ2hpbGQgbWV0aG9kIHRvIHdvcmsgdGhpcyB3YXkuICBNYWtlIHN1cmUgeW91IGRpZmZlcmVudGlhdGUKKyAqICBiZXR3ZWVuIHlvdXIgdHJlZSdzIGFkZENoaWxkIGFuZCB0aGlzIHBhcnNlciB0cmVlIGNvbnN0cnVjdGlvbiBhZGRDaGlsZAorICogIGlmIGl0J3Mgbm90IG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB3aXRoIGEgc2ltcGxlIGFzc2lnbm1lbnQuCisgKi8KK3N0YXRpYwl2b2lkCQorYWRkQ2hpbGQgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpCit7CisJaWYJKHQgIT0gTlVMTCAmJiBjaGlsZCAhPSBOVUxMKQorCXsKKwkJdC0+YWRkQ2hpbGQodCwgY2hpbGQpOworCX0KK30KK3N0YXRpYwl2b2lkCQorZGJnQWRkQ2hpbGQgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpCit7CisJaWYJKHQgIT0gTlVMTCAmJiBjaGlsZCAhPSBOVUxMKQorCXsKKwkJdC0+YWRkQ2hpbGQodCwgY2hpbGQpOworCQlhZGFwdG9yLT5kZWJ1Z2dlci0+YWRkQ2hpbGQoYWRhcHRvci0+ZGVidWdnZXIsIHQsIGNoaWxkKTsKKwl9Cit9CisvKiogVXNlIHRoZSBhZGFwdG9yIGltcGxlbWVudGF0aW9uIHRvIGFkZCBhIGNoaWxkIG5vZGUgd2l0aCB0aGUgc3VwcGxpZWQgdG9rZW4KKyAqLworc3RhdGljCXZvaWQJCQorYWRkQ2hpbGRUb2tlbgkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19DT01NT05fVE9LRU4gY2hpbGQpCit7CisJaWYJKHQgIT0gTlVMTCAmJiBjaGlsZCAhPSBOVUxMKQorCXsKKwkJYWRhcHRvci0+YWRkQ2hpbGQoYWRhcHRvciwgdCwgYWRhcHRvci0+Y3JlYXRlKGFkYXB0b3IsIGNoaWxkKSk7CisJfQorfQorc3RhdGljCXZvaWQJCQorZGJnQWRkQ2hpbGRUb2tlbgkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19DT01NT05fVE9LRU4gY2hpbGQpCit7CisJcEFOVExSM19CQVNFX1RSRUUJdGM7CisKKwlpZgkodCAhPSBOVUxMICYmIGNoaWxkICE9IE5VTEwpCisJeworCQl0YyA9IGFkYXB0b3ItPmNyZWF0ZShhZGFwdG9yLCBjaGlsZCk7CisJCWFkYXB0b3ItPmFkZENoaWxkKGFkYXB0b3IsIHQsIHRjKTsKKwkJYWRhcHRvci0+ZGVidWdnZXItPmFkZENoaWxkKGFkYXB0b3ItPmRlYnVnZ2VyLCB0LCB0Yyk7CisJfQorfQorCisvKiogSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAqCisgKiBcY29kZQorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAqIFxlbmRjb2RlCisgKgorICogIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorICogIGNoaWxkIGFzIHRoZSBuZXcgcm9vdCBub2RlLgorICoKKyAqIFxjb2RlCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgKiBcZW5kY29kZQorICoKKyAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsTm9kZSkuCisgKgorICogXGNvZGUKKyAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICogICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKyAqIFxlbmRjb2RlCisgKgorICogIFJldHVybiBuZXdSb290LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5ld1Jvb3QgaXMgbm90IGEKKyAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgPGNvZGU+XihuaWwgeCk8L2VuZGNvZGU+IHJldHVybiB4IGFzIG5ld1Jvb3QuCisgKgorICogIEJlIGFkdmlzZWQgdGhhdCBpdCdzIG9rIGZvciBuZXdSb290IHRvIHBvaW50IGF0IG9sZFJvb3QncworICogIGNoaWxkcmVuOyBpLmUuLCB5b3UgZG9uJ3QgaGF2ZSB0byBjb3B5IHRoZSBsaXN0LiAgV2UgYXJlCisgKiAgY29uc3RydWN0aW5nIHRoZXNlIG5vZGVzIHNvIHdlIHNob3VsZCBoYXZlIHRoaXMgY29udHJvbCBmb3IKKyAqICBlZmZpY2llbmN5LgorICovCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCitiZWNvbWVSb290CShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIG5ld1Jvb3RUcmVlLCBwQU5UTFIzX0JBU0VfVFJFRSBvbGRSb290VHJlZSkKK3sKKyAgICBwQU5UTFIzX0JBU0VfVFJFRSBzYXZlUm9vdDsKKworCS8qIFByb3RlY3QgYWdhaW5zdCB0cmVlIHJld3JpdGVzIGlmIHdlIGFyZSBpbiBzb21lIHNvcnQgb2YgZXJyb3IKKwkgKiBzdGF0ZSwgYnV0IGhhdmUgdHJpZWQgdG8gcmVjb3Zlci4gSW4gQyB3ZSBjYW4gZW5kIHVwIHdpdGggYSBudWxsIHBvaW50ZXIKKwkgKiBmb3IgYSB0cmVlIHRoYXQgd2FzIG5vdCBwcm9kdWNlZC4KKwkgKi8KKwlpZgkobmV3Um9vdFRyZWUgPT0gTlVMTCkKKwl7CisJCXJldHVybglvbGRSb290VHJlZTsKKwl9CisKKwkvKiByb290IGlzIGp1c3QgdGhlIG5ldyB0cmVlIGFzIGlzIGlmIHRoZXJlIGlzIG5vCisJICogY3VycmVudCByb290IHRyZWUuCisJICovCisJaWYJKG9sZFJvb3RUcmVlID09IE5VTEwpCisJeworCQlyZXR1cm4JbmV3Um9vdFRyZWU7CisJfQorCisJLyogUHJvZHVjZSBeKG5pbCByZWFsLW5vZGUpCisJICovCisJaWYJKG5ld1Jvb3RUcmVlLT5pc05pbE5vZGUobmV3Um9vdFRyZWUpKQorCXsKKwkJaWYJKG5ld1Jvb3RUcmVlLT5nZXRDaGlsZENvdW50KG5ld1Jvb3RUcmVlKSA+IDEpCisJCXsKKwkJCS8qIFRPRE86IEhhbmRsZSB0cmVlIGV4Y2VwdGlvbnMgCisJCQkgKi8KKwkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIk1vcmUgdGhhbiBvbmUgbm9kZSBhcyByb290ISBUT0RPOiBDcmVhdGUgdHJlZSBleGNlcHRpb24gaGFuZGxpbmdcbiIpOworCQkJcmV0dXJuIG5ld1Jvb3RUcmVlOworCQl9CisKKwkJLyogVGhlIG5ldyByb290IGlzIHRoZSBmaXJzdCBjaGlsZCwga2VlcCB0cmFjayBvZiB0aGUgb3JpZ2luYWwgbmV3Um9vdAorICAgICAgICAgKiBiZWNhdXNlIGlmIGl0IHdhcyBhIE5pbCBOb2RlLCB0aGVuIHdlIGNhbiByZXVzZSBpdCBub3cuCisJCSAqLworICAgICAgICBzYXZlUm9vdCAgICA9IG5ld1Jvb3RUcmVlOworCQluZXdSb290VHJlZSA9IG5ld1Jvb3RUcmVlLT5nZXRDaGlsZChuZXdSb290VHJlZSwgMCk7CisKKyAgICAgICAgLy8gUmVjbGFpbSB0aGUgb2xkIG5pbE5vZGUoKQorICAgICAgICAvLworICAgICAgICBzYXZlUm9vdC0+cmV1c2Uoc2F2ZVJvb3QpOworCX0KKworCS8qIEFkZCBvbGQgcm9vdCBpbnRvIG5ldyByb290LiBhZGRDaGlsZCB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIHdoZXJlIG9sZFJvb3QKKwkgKiBpcyBhIGZsYXQgbGlzdCAobmlsbCByb290ZWQgdHJlZSkuIEFsbCBjaGlsZHJlbiBvZiBvbGRyb290IGFyZSBhZGRlZCB0bworCSAqIG5ldyByb290LgorCSAqLworCW5ld1Jvb3RUcmVlLT5hZGRDaGlsZChuZXdSb290VHJlZSwgb2xkUm9vdFRyZWUpOworCisgICAgLy8gSWYgdGhlIG9sZHJvb3QgdHJlZSB3YXMgYSBuaWwgbm9kZSwgdGhlbiB3ZSBrbm93IGF0IHRoaXMgcG9pbnQKKyAgICAvLyBpdCBoYXMgYmVjb21lIG9ycGhhbmVkIGJ5IHRoZSByZXdyaXRlIGxvZ2ljLCBzbyB3ZSB0ZWxsIGl0IHRvIGRvCisgICAgLy8gd2hhdGV2ZXIgaXQgbmVlZHMgdG8gZG8gdG8gYmUgcmV1c2VkLgorICAgIC8vCisgICAgaWYgIChvbGRSb290VHJlZS0+aXNOaWxOb2RlKG9sZFJvb3RUcmVlKSkKKyAgICB7CisgICAgICAgIC8vIFdlIGhhdmUgdGFrZW4gYW4gb2xkIFJvb3QgVHJlZSBhbmQgYXBwZW5kZWQgYWxsIGl0cyBjaGlsZHJlbiB0byB0aGUgbmV3CisgICAgICAgIC8vIHJvb3QuIEluIGFkZGl0aW9uIHRob3VnaCBpdCB3YXMgYSBuaWwgbm9kZSwgd2hpY2ggbWVhbnMgdGhlIGdlbmVyYXRlZCBjb2RlCisgICAgICAgIC8vIHdpbGwgbm90IHJldXNlIGl0IGFnYWluLCBzbyB3ZSB3aWxsIHJlY2xhaW0gaXQgaGVyZS4gRmlyc3Qgd2Ugd2FudCB0byB6ZXJvIG91dAorICAgICAgICAvLyBhbnkgcG9pbnRlcnMgaXQgd2FzIGNhcnJ5aW5nIGFyb3VuZC4gV2UgYXJlIGp1c3QgdGhlIGJhc2VUcmVlIGhhbmRsZXIgc28gd2UKKyAgICAgICAgLy8gZG9uJ3Qga25vdyBuZWNlc3NhcmlsbHkga25vdyBob3cgdG8gZG8gdGhpcyBmb3IgdGhlIHJlYWwgbm9kZSwgd2UganVzdCBhc2sgdGhlIHRyZWUgaXRzZWxmCisgICAgICAgIC8vIHRvIGRvIGl0LgorICAgICAgICAvLworICAgICAgICBvbGRSb290VHJlZS0+cmV1c2Uob2xkUm9vdFRyZWUpOworICAgIH0KKwkvKiBBbHdheXMgcmV0dXJucyBuZXcgcm9vdCBzdHJ1Y3R1cmUKKwkgKi8KKwlyZXR1cm4JbmV3Um9vdFRyZWU7CisKK30KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkKK2RiZ0JlY29tZVJvb3QJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgbmV3Um9vdFRyZWUsIHBBTlRMUjNfQkFTRV9UUkVFIG9sZFJvb3RUcmVlKQoreworCXBBTlRMUjNfQkFTRV9UUkVFIHQ7CisJCisJdCA9IGJlY29tZVJvb3QoYWRhcHRvciwgbmV3Um9vdFRyZWUsIG9sZFJvb3RUcmVlKTsKKworCWFkYXB0b3ItPmRlYnVnZ2VyLT5iZWNvbWVSb290KGFkYXB0b3ItPmRlYnVnZ2VyLCBuZXdSb290VHJlZSwgb2xkUm9vdFRyZWUpOworCisJcmV0dXJuIHQ7Cit9CisvKiogVHJhbnNmb3JtIF4obmlsIHgpIHRvIHggCisgKi8KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkKKyAgIHJ1bGVQb3N0UHJvY2Vzc2luZwkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSByb290KQoreworICAgIHBBTlRMUjNfQkFTRV9UUkVFIHNhdmVSb290OworCisgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgcm9vdCB3ZSBhcmUgZ2l2ZW4uIElmIGl0IGlzIGEgbmlsTm9kZSwgdGhlbiB3ZQorICAgIC8vIGNhbiByZXVzZSBpdCByYXRoZXIgdGhhbiBvcnBoYW5pbmcgaXQhCisgICAgLy8KKyAgICBzYXZlUm9vdCA9IHJvb3Q7CisKKwlpZiAocm9vdCAhPSBOVUxMICYmIHJvb3QtPmlzTmlsTm9kZShyb290KSkKKwl7CisJCWlmCShyb290LT5nZXRDaGlsZENvdW50KHJvb3QpID09IDApCisJCXsKKwkJCXJvb3QgPSBOVUxMOworCQl9CisJCWVsc2UgaWYJKHJvb3QtPmdldENoaWxkQ291bnQocm9vdCkgPT0gMSkKKwkJeworCQkJcm9vdCA9IHJvb3QtPmdldENoaWxkKHJvb3QsIDApOworCQkJcm9vdC0+c2V0UGFyZW50KHJvb3QsIE5VTEwpOworCQkJcm9vdC0+c2V0Q2hpbGRJbmRleChyb290LCAtMSk7CisKKyAgICAgICAgICAgIC8vIFRoZSByb290IHdlIHdlcmUgZ2l2ZW4gd2FzIGEgbmlsIG5vZGUsIHdpaHQgb25lIGNoaWxkLCB3aGljaCBtZWFucyBpdCBoYXMKKyAgICAgICAgICAgIC8vIGJlZW4gYWJhbmRvbmVkIGFuZCB3b3VsZCBiZSBsb3N0IGluIHRoZSBub2RlIGZhY3RvcnkuIEhvd2V2ZXIKKyAgICAgICAgICAgIC8vIG5vZGVzIGNhbiBiZSBmbGFnZ2VkIGFzIHJlc3VhYmxlIHRvIHByZXZlbnQgdGhpcyB0ZXJyaWJsZSB3YXN0ZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNhdmVSb290LT5yZXVzZShzYXZlUm9vdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcm9vdDsKK30KKyAKKy8qKiBVc2UgdGhlIGFkYXB0b3IgaW50ZXJmYWNlIHRvIHNldCBhIG5ldyB0cmVlIG5vZGUgd2l0aCB0aGUgc3VwcGxpZWQgdG9rZW4KKyAqICB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KKyAqLworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQorICAgYmVjb21lUm9vdFRva2VuCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHZvaWQgKiBuZXdSb290LCBwQU5UTFIzX0JBU0VfVFJFRSBvbGRSb290KQoreworCXJldHVybglhZGFwdG9yLT5iZWNvbWVSb290KGFkYXB0b3IsIGFkYXB0b3ItPmNyZWF0ZShhZGFwdG9yLCBuZXdSb290KSwgb2xkUm9vdCk7Cit9CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCitkYmdCZWNvbWVSb290VG9rZW4JKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgdm9pZCAqIG5ld1Jvb3QsIHBBTlRMUjNfQkFTRV9UUkVFIG9sZFJvb3QpCit7CisJcEFOVExSM19CQVNFX1RSRUUJdDsKKworCXQgPQlhZGFwdG9yLT5iZWNvbWVSb290KGFkYXB0b3IsIGFkYXB0b3ItPmNyZWF0ZShhZGFwdG9yLCBuZXdSb290KSwgb2xkUm9vdCk7CisKKwlhZGFwdG9yLT5kZWJ1Z2dlci0+YmVjb21lUm9vdChhZGFwdG9yLT5kZWJ1Z2dlcix0LCBvbGRSb290KTsKKworCXJldHVybiB0OworfQorCisvKiogVXNlIHRoZSBzdXBlciBjbGFzcyBzdXBwbGllZCBjcmVhdGUoKSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IG5vZGUKKyAqICBmcm9tIHRoZSBzdXBwbGllZCB0b2tlbi4KKyAqLworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQorY3JlYXRlVHlwZVRva2VuCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBmcm9tVG9rZW4pCit7CisJLyogQ3JlYXRlIHRoZSBuZXcgdG9rZW4KKwkgKi8KKwlmcm9tVG9rZW4gPSBhZGFwdG9yLT5jcmVhdGVUb2tlbkZyb21Ub2tlbihhZGFwdG9yLCBmcm9tVG9rZW4pOworCisJLyogU2V0IHRoZSB0eXBlIG9mIHRoZSBuZXcgdG9rZW4gdG8gdGhhdCBzdXBwbGllZAorCSAqLworCWZyb21Ub2tlbi0+c2V0VHlwZShmcm9tVG9rZW4sIHRva2VuVHlwZSk7CisKKwkvKiBSZXR1cm4gYSBuZXcgbm9kZSBiYXNlZCB1cG9uIHRoaXMgdG9rZW4KKwkgKi8KKwlyZXR1cm4JYWRhcHRvci0+Y3JlYXRlKGFkYXB0b3IsIGZyb21Ub2tlbik7Cit9CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCitkYmdDcmVhdGVUeXBlVG9rZW4JKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgQU5UTFIzX1VJTlQzMiB0b2tlblR5cGUsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIGZyb21Ub2tlbikKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRSB0OworCisJdCA9IGNyZWF0ZVR5cGVUb2tlbihhZGFwdG9yLCB0b2tlblR5cGUsIGZyb21Ub2tlbik7CisKKwlhZGFwdG9yLT5kZWJ1Z2dlci0+Y3JlYXRlTm9kZShhZGFwdG9yLT5kZWJ1Z2dlciwgdCk7CisKKwlyZXR1cm4gdDsKK30KKworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQorY3JlYXRlVHlwZVRva2VuVGV4dAkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBBTlRMUjNfVUlOVDMyIHRva2VuVHlwZSwgcEFOVExSM19DT01NT05fVE9LRU4gZnJvbVRva2VuLCBwQU5UTFIzX1VJTlQ4IHRleHQpCit7CisJLyogQ3JlYXRlIHRoZSBuZXcgdG9rZW4KKwkgKi8KKwlmcm9tVG9rZW4gPSBhZGFwdG9yLT5jcmVhdGVUb2tlbkZyb21Ub2tlbihhZGFwdG9yLCBmcm9tVG9rZW4pOworCisJLyogU2V0IHRoZSB0eXBlIG9mIHRoZSBuZXcgdG9rZW4gdG8gdGhhdCBzdXBwbGllZAorCSAqLworCWZyb21Ub2tlbi0+c2V0VHlwZShmcm9tVG9rZW4sIHRva2VuVHlwZSk7CisKKwkvKiBTZXQgdGhlIHRleHQgb2YgdGhlIHRva2VuIGFjY29yZGluZ2x5CisJICovCisJZnJvbVRva2VuLT5zZXRUZXh0OChmcm9tVG9rZW4sIHRleHQpOworCisJLyogUmV0dXJuIGEgbmV3IG5vZGUgYmFzZWQgdXBvbiB0aGlzIHRva2VuCisJICovCisJcmV0dXJuCWFkYXB0b3ItPmNyZWF0ZShhZGFwdG9yLCBmcm9tVG9rZW4pOworfQorc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQorZGJnQ3JlYXRlVHlwZVRva2VuVGV4dAkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBBTlRMUjNfVUlOVDMyIHRva2VuVHlwZSwgcEFOVExSM19DT01NT05fVE9LRU4gZnJvbVRva2VuLCBwQU5UTFIzX1VJTlQ4IHRleHQpCit7CisJcEFOVExSM19CQVNFX1RSRUUgdDsKKworCXQgPSBjcmVhdGVUeXBlVG9rZW5UZXh0KGFkYXB0b3IsIHRva2VuVHlwZSwgZnJvbVRva2VuLCB0ZXh0KTsKKworCWFkYXB0b3ItPmRlYnVnZ2VyLT5jcmVhdGVOb2RlKGFkYXB0b3ItPmRlYnVnZ2VyLCB0KTsKKworCXJldHVybiB0OworfQorCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCisgICBjcmVhdGVUeXBlVGV4dAkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBBTlRMUjNfVUlOVDMyIHRva2VuVHlwZSwgcEFOVExSM19VSU5UOCB0ZXh0KQoreworCXBBTlRMUjNfQ09NTU9OX1RPS0VOCWZyb21Ub2tlbjsKKworCS8qIENyZWF0ZSB0aGUgbmV3IHRva2VuCisJICovCisJZnJvbVRva2VuID0gYWRhcHRvci0+Y3JlYXRlVG9rZW4oYWRhcHRvciwgdG9rZW5UeXBlLCB0ZXh0KTsKKworCS8qIFJldHVybiBhIG5ldyBub2RlIGJhc2VkIHVwb24gdGhpcyB0b2tlbgorCSAqLworCXJldHVybglhZGFwdG9yLT5jcmVhdGUoYWRhcHRvciwgZnJvbVRva2VuKTsKK30KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkKKyAgIGRiZ0NyZWF0ZVR5cGVUZXh0CShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX1VJTlQ4IHRleHQpCit7CisJcEFOVExSM19CQVNFX1RSRUUgdDsKKworCXQgPSBjcmVhdGVUeXBlVGV4dChhZGFwdG9yLCB0b2tlblR5cGUsIHRleHQpOworCisJYWRhcHRvci0+ZGVidWdnZXItPmNyZWF0ZU5vZGUoYWRhcHRvci0+ZGVidWdnZXIsIHQpOworCisJcmV0dXJuIHQ7CisKK30KKy8qKiBEdW1teSBpbXBsZW1lbnRhdGlvbiAtIHdpbGwgYmUgc3VwcGxpZWQgYnkgc3VwZXIgY2xhc3MKKyAqLworc3RhdGljCUFOVExSM19VSU5UMzIJCisgICBnZXRUeXBlCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KQoreworCXJldHVybgkwOworfQorCisvKiogRHVtbXkgaW1wbGVtZW50YXRpb24gLSB3aWxsIGJlIHN1cHBsaWVkIGJ5IHN1cGVyIGNsYXNzCisgKi8KK3N0YXRpYwl2b2lkCQkKKyAgIHNldFR5cGUJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19VSU5UMzIgdHlwZSkKK3sKKwlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJJbnRlcm5hbCBlcnJvciAtIGltcGxlbWVudG9yIG9mIHN1cGVyY2xhc3MgY29udGFpbmluZyBBTlRMUjNfVFJFRV9BREFQVE9SIGRpZCBub3QgaW1wbGVtZW50IHNldFR5cGUoKVxuIik7Cit9CisKKy8qKiBEdW1teSBpbXBsZW1lbnRhdGlvbiAtIHdpbGwgYmUgc3VwcGxpZWQgYnkgc3VwZXIgY2xhc3MKKyAqLworc3RhdGljCXBBTlRMUjNfU1RSSU5HCQorICAgZ2V0VGV4dAkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCkKK3sKKwlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJJbnRlcm5hbCBlcnJvciAtIGltcGxlbWVudG9yIG9mIHN1cGVyY2xhc3MgY29udGFpbmluZyBBTlRMUjNfVFJFRV9BREFQVE9SIGRpZCBub3QgaW1wbGVtZW50IGdldFRleHQoKVxuIik7CisJcmV0dXJuCU5VTEw7Cit9CisKKy8qKiBEdW1teSBpbXBsZW1lbnRhdGlvbiAtIHdpbGwgYmUgc3VwcGxpZWQgYnkgc3VwZXIgY2xhc3MKKyAqLworc3RhdGljCXZvaWQJCQorICAgc2V0VGV4dAkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19TVFJJTkcgdCkKK3sKKwlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJJbnRlcm5hbCBlcnJvciAtIGltcGxlbWVudG9yIG9mIHN1cGVyY2xhc3MgY29udGFpbmluZyBBTlRMUjNfVFJFRV9BREFQVE9SIGRpZCBub3QgaW1wbGVtZW50IHNldFRleHQoKVxuIik7Cit9CisvKiogRHVtbXkgaW1wbGVtZW50YXRpb24gLSB3aWxsIGJlIHN1cHBsaWVkIGJ5IHN1cGVyIGNsYXNzCisgKi8KK3N0YXRpYwl2b2lkCQkKK3NldFRleHQ4CQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX1VJTlQ4IHQpCit7CisJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiSW50ZXJuYWwgZXJyb3IgLSBpbXBsZW1lbnRvciBvZiBzdXBlcmNsYXNzIGNvbnRhaW5pbmcgQU5UTFIzX1RSRUVfQURBUFRPUiBkaWQgbm90IGltcGxlbWVudCBzZXRUZXh0KClcbiIpOworfQorCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCisgICBnZXRDaGlsZAkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdHJlZSwgQU5UTFIzX1VJTlQzMiBpKQoreworCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkludGVybmFsIGVycm9yIC0gaW1wbGVtZW50b3Igb2Ygc3VwZXJjbGFzcyBjb250YWluaW5nIEFOVExSM19UUkVFX0FEQVBUT1IgZGlkIG5vdCBpbXBsZW1lbnQgZ2V0Q2hpbGQoKVxuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCQorICAgZ2V0Q2hpbGRDb3VudAkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkludGVybmFsIGVycm9yIC0gaW1wbGVtZW50b3Igb2Ygc3VwZXJjbGFzcyBjb250YWluaW5nIEFOVExSM19UUkVFX0FEQVBUT1IgZGlkIG5vdCBpbXBsZW1lbnQgZ2V0Q2hpbGRDb3VudCgpXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIFJldHVybnMgYSB1bmlxdWVJRCBmb3IgdGhlIG5vZGUuIEJlY2F1c2UgdGhpcyBpcyB0aGUgQyBpbXBsZW1lbnRhdGlvbgorICogIHdlIGNhbiBqdXN0IHVzZSBpdHMgYWRkcmVzcyBzdWl0YWJseSBjb252ZXJ0ZWQvY2FzdCB0byBhbiBpbnRlZ2VyLgorICovCitzdGF0aWMJQU5UTFIzX1VJTlQzMgkKKyAgIGdldFVuaXF1ZUlECQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSBub2RlKQoreworCXJldHVybglBTlRMUjNfVUlOVDMyX0NBU1Qobm9kZSk7Cit9CisKK3N0YXRpYwlBTlRMUjNfQk9PTEVBTgoraXNOaWxOb2RlCQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KQoreworCXJldHVybiB0LT5pc05pbE5vZGUodCk7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNiaXRzZXQuYyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2JpdHNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjNjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNiaXRzZXQuYwpAQCAtMCwwICsxLDY4MSBAQAorLy8vCisvLy8gXGZpbGUKKy8vLyBDb250YWlucyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBBTlRMUjMgYml0c2V0cyBhcyBhZGFwdGVkIGZyb20gVGVyZW5jZSBQYXJyJ3MKKy8vLyBKYXZhIGltcGxlbWVudGF0aW9uLgorLy8vCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2JpdHNldC5oPgorCisvLyBFeHRlcm5hbCBpbnRlcmZhY2UKKy8vCisKK3N0YXRpYwlwQU5UTFIzX0JJVFNFVCAgYW50bHIzQml0c2V0Q2xvbmUJCShwQU5UTFIzX0JJVFNFVCBpblNldCk7CitzdGF0aWMJcEFOVExSM19CSVRTRVQgIGFudGxyM0JpdHNldE9SCQkJKHBBTlRMUjNfQklUU0VUIGJpdHNldDEsIHBBTlRMUjNfQklUU0VUIGJpdHNldDIpOworc3RhdGljCXZvaWQJCQlhbnRscjNCaXRzZXRPUkluUGxhY2UJKHBBTlRMUjNfQklUU0VUIGJpdHNldCwgcEFOVExSM19CSVRTRVQgYml0c2V0Mik7CitzdGF0aWMJQU5UTFIzX1VJTlQzMglhbnRscjNCaXRzZXRTaXplCQkocEFOVExSM19CSVRTRVQgYml0c2V0KTsKK3N0YXRpYwl2b2lkCQkJYW50bHIzQml0c2V0QWRkCQkJKHBBTlRMUjNfQklUU0VUIGJpdHNldCwgQU5UTFIzX0lOVDMyIGJpdCk7CitzdGF0aWMJQU5UTFIzX0JPT0xFQU4JYW50bHIzQml0c2V0RXF1YWxzCQkocEFOVExSM19CSVRTRVQgYml0c2V0MSwgcEFOVExSM19CSVRTRVQgYml0c2V0Mik7CitzdGF0aWMJQU5UTFIzX0JPT0xFQU4JYW50bHIzQml0c2V0TWVtYmVyCQkocEFOVExSM19CSVRTRVQgYml0c2V0LCBBTlRMUjNfVUlOVDMyIGJpdCk7CitzdGF0aWMJQU5UTFIzX1VJTlQzMglhbnRscjNCaXRzZXROdW1CaXRzCQkocEFOVExSM19CSVRTRVQgYml0c2V0KTsKK3N0YXRpYwl2b2lkCQkJYW50bHIzQml0c2V0UmVtb3ZlCQkocEFOVExSM19CSVRTRVQgYml0c2V0LCBBTlRMUjNfVUlOVDMyIGJpdCk7CitzdGF0aWMJQU5UTFIzX0JPT0xFQU4JYW50bHIzQml0c2V0SXNOaWwJCShwQU5UTFIzX0JJVFNFVCBiaXRzZXQpOworc3RhdGljCXBBTlRMUjNfSU5UMzIJYW50bHIzQml0c2V0VG9JbnRMaXN0CShwQU5UTFIzX0JJVFNFVCBiaXRzZXQpOworCisvLyBMb2NhbCBmdW5jdGlvbnMKKy8vCitzdGF0aWMJdm9pZAkJCWdyb3dUb0luY2x1ZGUJCShwQU5UTFIzX0JJVFNFVCBiaXRzZXQsIEFOVExSM19JTlQzMiBiaXQpOworc3RhdGljCXZvaWQJCQlncm93CQkJCShwQU5UTFIzX0JJVFNFVCBiaXRzZXQsIEFOVExSM19JTlQzMiBuZXdTaXplKTsKK3N0YXRpYwlBTlRMUjNfVUlOVDY0CWJpdE1hc2sJCQkJKEFOVExSM19VSU5UMzIgYml0TnVtYmVyKTsKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCW51bVdvcmRzVG9Ib2xkCQkoQU5UTFIzX1VJTlQzMiBiaXQpOworc3RhdGljCUFOVExSM19VSU5UMzIJd29yZE51bWJlcgkJCShBTlRMUjNfVUlOVDMyIGJpdCk7CitzdGF0aWMJdm9pZAkJCWFudGxyM0JpdHNldEZyZWUJKHBBTlRMUjNfQklUU0VUIGJpdHNldCk7CisKK3N0YXRpYyB2b2lkCithbnRscjNCaXRzZXRGcmVlKHBBTlRMUjNfQklUU0VUIGJpdHNldCkKK3sKKyAgICBpZgkoYml0c2V0LT5ibGlzdC5iaXRzICE9IE5VTEwpCisgICAgeworCQlBTlRMUjNfRlJFRShiaXRzZXQtPmJsaXN0LmJpdHMpOworCQliaXRzZXQtPmJsaXN0LmJpdHMgPSBOVUxMOworICAgIH0KKyAgICBBTlRMUjNfRlJFRShiaXRzZXQpOworCisgICAgcmV0dXJuOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfQklUU0VUCithbnRscjNCaXRzZXROZXcoQU5UTFIzX1VJTlQzMiBudW1CaXRzKQoreworCXBBTlRMUjNfQklUU0VUICBiaXRzZXQ7CisKKwlBTlRMUjNfVUlOVDMyICAgbnVtZWxlbWVudHM7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBiaXRzZXQgc3RydWN0dXJlIGl0c2VsZgorCS8vCisJYml0c2V0ICA9IChwQU5UTFIzX0JJVFNFVCkgQU5UTFIzX01BTExPQygoc2l6ZV90KXNpemVvZihBTlRMUjNfQklUU0VUKSk7CisKKwlpZgkoYml0c2V0ID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvLyBBdm9pZCBtZW1vcnkgdGhyYXNoaW5nIGF0IHRoZSB1cCBmcm9udCBleHBlbnNlIG9mIGEgZmV3IGJ5dGVzCisJLy8KKwlpZgkobnVtQml0cyA8ICg4ICogQU5UTFIzX0JJVFNFVF9CSVRTKSkKKwl7CisJCW51bUJpdHMgPSA4ICogQU5UTFIzX0JJVFNFVF9CSVRTOworCX0KKworCS8vIE5vIHdlIG5lZWQgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIG51bWJlciBvZiBiaXRzIGFza2VkIGZvcgorCS8vIGluIG11bHRpcGxlcyBvZiBBTlRMUjNfVUlOVDY0LiAKKwkvLworCW51bWVsZW1lbnRzCT0gKChudW1CaXRzIC0xKSA+PiBBTlRMUjNfQklUU0VUX0xPR19CSVRTKSArIDE7CisKKwliaXRzZXQtPmJsaXN0LmJpdHMgICAgPSAocEFOVExSM19CSVRXT1JEKSBBTlRMUjNfTUFMTE9DKChzaXplX3QpKG51bWVsZW1lbnRzICogc2l6ZW9mKEFOVExSM19CSVRXT1JEKSkpOworCW1lbXNldChiaXRzZXQtPmJsaXN0LmJpdHMsIDAsIChzaXplX3QpKG51bWVsZW1lbnRzICogc2l6ZW9mKEFOVExSM19CSVRXT1JEKSkpOworCWJpdHNldC0+Ymxpc3QubGVuZ3RoICA9IG51bWVsZW1lbnRzOworCisJaWYJKGJpdHNldC0+Ymxpc3QuYml0cyA9PSBOVUxMKQorCXsKKwkJQU5UTFIzX0ZSRUUoYml0c2V0KTsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJYW50bHIzQml0c2V0U2V0QVBJKGJpdHNldCk7CisKKworCS8vIEFsbCBzZWVtcyBnb29kCisJLy8KKwlyZXR1cm4gIGJpdHNldDsKK30KKworQU5UTFIzX0FQSSB2b2lkCithbnRscjNCaXRzZXRTZXRBUEkocEFOVExSM19CSVRTRVQgYml0c2V0KQoreworICAgIGJpdHNldC0+Y2xvbmUJCT0gICAgYW50bHIzQml0c2V0Q2xvbmU7CisgICAgYml0c2V0LT5ib3IJCQk9ICAgIGFudGxyM0JpdHNldE9SOworICAgIGJpdHNldC0+Ym9ySW5QbGFjZQk9ICAgIGFudGxyM0JpdHNldE9SSW5QbGFjZTsKKyAgICBiaXRzZXQtPnNpemUJCT0gICAgYW50bHIzQml0c2V0U2l6ZTsKKyAgICBiaXRzZXQtPmFkZAkJCT0gICAgYW50bHIzQml0c2V0QWRkOworICAgIGJpdHNldC0+Z3JvdwkJPSAgICBncm93OworICAgIGJpdHNldC0+ZXF1YWxzCQk9ICAgIGFudGxyM0JpdHNldEVxdWFsczsKKyAgICBiaXRzZXQtPmlzTWVtYmVyCT0gICAgYW50bHIzQml0c2V0TWVtYmVyOworICAgIGJpdHNldC0+bnVtQml0cwkJPSAgICBhbnRscjNCaXRzZXROdW1CaXRzOworICAgIGJpdHNldC0+cmVtb3ZlCQk9ICAgIGFudGxyM0JpdHNldFJlbW92ZTsKKyAgICBiaXRzZXQtPmlzTmlsTm9kZQkJPSAgICBhbnRscjNCaXRzZXRJc05pbDsKKyAgICBiaXRzZXQtPnRvSW50TGlzdAk9ICAgIGFudGxyM0JpdHNldFRvSW50TGlzdDsKKworICAgIGJpdHNldC0+ZnJlZQkJPSAgICBhbnRscjNCaXRzZXRGcmVlOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfQklUU0VUCithbnRscjNCaXRzZXRDb3B5KHBBTlRMUjNfQklUU0VUX0xJU1QgYmxpc3QpCit7CisgICAgcEFOVExSM19CSVRTRVQgIGJpdHNldDsKKwlpbnQJCQkJbnVtRWxlbWVudHM7CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBiaXRzZXQgc3RydWN0dXJlIGl0c2VsZgorICAgIC8vCisgICAgYml0c2V0ICA9IChwQU5UTFIzX0JJVFNFVCkgQU5UTFIzX01BTExPQygoc2l6ZV90KXNpemVvZihBTlRMUjNfQklUU0VUKSk7CisKKyAgICBpZgkoYml0c2V0ID09IE5VTEwpCisgICAgeworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKwludW1FbGVtZW50cyA9IGJsaXN0LT5sZW5ndGg7CisKKyAgICAvLyBBdm9pZCBtZW1vcnkgdGhyYXNoaW5nIGF0IHRoZSBleHBlbnNlIG9mIGEgZmV3IG1vcmUgYnl0ZXMKKyAgICAvLworICAgIGlmCShudW1FbGVtZW50cyA8IDgpCisgICAgeworCQludW1FbGVtZW50cyA9IDg7CisgICAgfQorCisgICAgLy8gSW5zdGFsbCB0aGUgbGVuZ3RoIGluIEFOVExSM19VSU5UNjQgdW5pdHMKKyAgICAvLworICAgIGJpdHNldC0+Ymxpc3QubGVuZ3RoICA9IG51bUVsZW1lbnRzOworCisgICAgYml0c2V0LT5ibGlzdC5iaXRzICAgID0gKHBBTlRMUjNfQklUV09SRClBTlRMUjNfTUFMTE9DKChzaXplX3QpKG51bUVsZW1lbnRzICogc2l6ZW9mKEFOVExSM19CSVRXT1JEKSkpOworCisgICAgaWYJKGJpdHNldC0+Ymxpc3QuYml0cyA9PSBOVUxMKQorICAgIHsKKwkJQU5UTFIzX0ZSRUUoYml0c2V0KTsKKwkJcmV0dXJuCU5VTEw7CisgICAgfQorCisJQU5UTFIzX01FTUNQWShiaXRzZXQtPmJsaXN0LmJpdHMsIGJsaXN0LT5iaXRzLCAoQU5UTFIzX1VJTlQ2NCkobnVtRWxlbWVudHMgKiBzaXplb2YoQU5UTFIzX0JJVFdPUkQpKSk7CisKKyAgICAvLyBBbGwgc2VlbXMgZ29vZAorICAgIC8vCisgICAgcmV0dXJuICBiaXRzZXQ7Cit9CisKK3N0YXRpYyBwQU5UTFIzX0JJVFNFVAorYW50bHIzQml0c2V0Q2xvbmUocEFOVExSM19CSVRTRVQgaW5TZXQpCit7CisgICAgcEFOVExSM19CSVRTRVQgIGJpdHNldDsKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJpdHNldCBzdHJ1Y3R1cmUgaXRzZWxmCisgICAgLy8KKyAgICBiaXRzZXQgID0gYW50bHIzQml0c2V0TmV3KEFOVExSM19CSVRTRVRfQklUUyAqIGluU2V0LT5ibGlzdC5sZW5ndGgpOworCisgICAgaWYJKGJpdHNldCA9PSBOVUxMKQorICAgIHsKKwkJcmV0dXJuCU5VTEw7CisgICAgfQorCisgICAgLy8gSW5zdGFsbCB0aGUgYWN0dWFsIGJpdHMgaW4gdGhlIHNvdXJjZSBzZXQKKyAgICAvLworICAgIEFOVExSM19NRU1DUFkoYml0c2V0LT5ibGlzdC5iaXRzLCBpblNldC0+Ymxpc3QuYml0cywgKEFOVExSM19VSU5UNjQpKGluU2V0LT5ibGlzdC5sZW5ndGggKiBzaXplb2YoQU5UTFIzX0JJVFdPUkQpKSk7CisKKyAgICAvLyBBbGwgc2VlbXMgZ29vZAorICAgIC8vCisgICAgcmV0dXJuICBiaXRzZXQ7Cit9CisKKworQU5UTFIzX0FQSSBwQU5UTFIzX0JJVFNFVAorYW50bHIzQml0c2V0TGlzdChwQU5UTFIzX0hBU0hfVEFCTEUgbGlzdCkKK3sKKyAgICBwQU5UTFIzX0JJVFNFVAkJYml0U2V0OworICAgIHBBTlRMUjNfSEFTSF9FTlVNCWVuOworICAgIHBBTlRMUjNfSEFTSF9LRVkJa2V5OworICAgIEFOVExSM19VSU5UNjQJCWJpdDsKKworICAgIC8vIFdlIGhhdmUgbm8gaWRlYSB3aGF0IGV4YWN0bHkgaXMgaW4gdGhlIGxpc3QKKyAgICAvLyBzbyBjcmVhdGUgYSBkZWZhdWx0IGJpdHNldCBhbmQgdGhlbiBqdXN0IGFkZCBzdHVmZgorICAgIC8vIGFzIHdlIGVudW1lcmF0ZS4KKyAgICAvLworICAgIGJpdFNldCAgPSBhbnRscjNCaXRzZXROZXcoMCk7CisKKyAgICBlbgkJPSBhbnRscjNFbnVtTmV3KGxpc3QpOworCisgICAgd2hpbGUgICAoZW4tPm5leHQoZW4sICZrZXksICh2b2lkICoqKSgmYml0KSkgPT0gQU5UTFIzX1NVQ0NFU1MpCisgICAgeworCQliaXRTZXQtPmFkZChiaXRTZXQsIChBTlRMUjNfVUlOVDMyKWJpdCk7CisgICAgfQorICAgIGVuLT5mcmVlKGVuKTsKKworICAgIHJldHVybiBOVUxMOworfQorCisvLy8KKy8vLyBcYnJpZWYKKy8vLyBDcmVhdGVzIGEgbmV3IGJpdHNldCB3aXRoIGF0IGxlYXN0IG9uZSA2NCBiaXQgYnNldCBvZiBiaXRzLCBidXQgYXMKKy8vLyBtYW55IDY0IGJpdCBzZXRzIGFzIGFyZSByZXF1aXJlZC4KKy8vLworLy8vIFxwYXJhbVtpbl0gYnNldAorLy8vIEEgdmFyaWFibGUgbnVtYmVyIG9mIGJpdHMgdG8gYWRkIHRvIHRoZSBzZXQsIGVuZGluZyBpbiAtMSAoaW1wb3NzaWJsZSBiaXQpLgorLy8vIAorLy8vIFxyZXR1cm5zCisvLy8gQSBuZXcgYml0IHNldCB3aXRoIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGJpdG1hcHMgaW4gaXQgYW5kIHRoZSBBUEkKKy8vLyBpbml0aWFsaXplZC4KKy8vLyAKKy8vLyBDYWxsIGFzOgorLy8vICAtIHBBTlRMUjNfQklUU0VUID0gYW50bHJCaXRzZXRMb2FkKGJzZXQsIGJzZXQxMSwgLi4uLCAtMSk7CisvLy8gIC0gcEFOVExSM19CSVRTRVQgPSBhbnRsckJpdHNldE9mKC0xKTsgIENyZWF0ZSBlbXB0eSBiaXRzZXQgCisvLy8KKy8vLyBccmVtYXJrcworLy8vIFN0ZGFyZ3MgZnVuY3Rpb24gLSBtdXN0IHN1cHBseSAtMSBhcyBsYXN0IHBhcmVtZXRlciwgd2hpY2ggaXMgTk9UCisvLy8gYWRkZWQgdG8gdGhlIHNldC4KKy8vLyAKKy8vLworQU5UTFIzX0FQSSBwQU5UTFIzX0JJVFNFVAorYW50bHIzQml0c2V0TG9hZChwQU5UTFIzX0JJVFNFVF9MSVNUIGluQml0cykKK3sKKwlwQU5UTFIzX0JJVFNFVCAgYml0c2V0OworCUFOVExSM19VSU5UMzIgIGNvdW50OworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYml0c2V0IHN0cnVjdHVyZSBpdHNlbGYKKwkvLyB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIHRoZSBiaXQgbnVtYmVyICgwIGJhc2VkKQorCS8vIHRvIGluY2x1ZGUgaW4gdGhlIGJpdHNldCwgc28gd2UgbmVlZCBhdCBhdCBsZWFzdAorCS8vIGJpdCArIDEgYml0cy4gSWYgYW55IGFyZ3VtZW50cyBpbmRpY2F0ZSBhIAorCS8vIGEgYml0IGhpZ2hlciB0aGFuIHRoZSBkZWZhdWx0IG51bWJlciBvZiBiaXRzICgwIG1lYW5zIGRlZmF1bHQgc2l6ZSkKKwkvLyB0aGVuIEFkZCgpIHdpbGwgdGFrZSBjYXJlCisJLy8gb2YgaXQuCisJLy8KKwliaXRzZXQgID0gYW50bHIzQml0c2V0TmV3KDApOworCisJaWYJKGJpdHNldCA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJaWYJKGluQml0cyAhPSBOVUxMKQorCXsKKwkJLy8gTm93IHdlIGNhbiBhZGQgdGhlIGVsZW1lbnQgYml0cyBpbnRvIHRoZSBzZXQKKwkJLy8KKwkJY291bnQ9MDsKKwkJd2hpbGUgKGNvdW50IDwgaW5CaXRzLT5sZW5ndGgpCisJCXsKKwkJCWlmICAoYml0c2V0LT5ibGlzdC5sZW5ndGggPD0gY291bnQpCisJCQl7CisJCQkJYml0c2V0LT5ncm93KGJpdHNldCwgY291bnQrMSk7CisJCQl9CisKKwkJCWJpdHNldC0+Ymxpc3QuYml0c1tjb3VudF0gPSAqKChpbkJpdHMtPmJpdHMpK2NvdW50KTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwkvLyByZXR1cm4gdGhlIG5ldyBiaXRzZXQKKwkvLworCXJldHVybiAgYml0c2V0OworfQorCisvLy8KKy8vLyBcYnJpZWYKKy8vLyBDcmVhdGVzIGEgbmV3IGJpdHNldCB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBidXQgYXMKKy8vLyBtYW55IGVsZW1lbnRzIGFyZSByZXF1aXJlZC4KKy8vLyAKKy8vLyBccGFyYW1baW5dIGJpdAorLy8vIEEgdmFyaWFibGUgbnVtYmVyIG9mIGJpdHMgdG8gYWRkIHRvIHRoZSBzZXQsIGVuZGluZyBpbiAtMSAoaW1wb3NzaWJsZSBiaXQpLgorLy8vIAorLy8vIFxyZXR1cm5zCisvLy8gQSBuZXcgYml0IHNldCB3aXRoIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGFkZGVkIGludG8gaXQuCisvLy8gCisvLy8gQ2FsbCBhczoKKy8vLyAgLSBwQU5UTFIzX0JJVFNFVCA9IGFudGxyQml0c2V0T2YobiwgbjEsIG4yLCAtMSk7CisvLy8gIC0gcEFOVExSM19CSVRTRVQgPSBhbnRsckJpdHNldE9mKC0xKTsgIENyZWF0ZSBlbXB0eSBiaXRzZXQgCisvLy8KKy8vLyBccmVtYXJrcworLy8vIFN0ZGFyZ3MgZnVuY3Rpb24gLSBtdXN0IHN1cHBseSAtMSBhcyBsYXN0IHBhcmVtZXRlciwgd2hpY2ggaXMgTk9UCisvLy8gYWRkZWQgdG8gdGhlIHNldC4KKy8vLyAKKy8vLworQU5UTFIzX0FQSSBwQU5UTFIzX0JJVFNFVAorYW50bHIzQml0c2V0T2YoQU5UTFIzX0lOVDMyIGJpdCwgLi4uKQoreworICAgIHBBTlRMUjNfQklUU0VUICBiaXRzZXQ7CisKKyAgICB2YV9saXN0IGFwOworCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYml0c2V0IHN0cnVjdHVyZSBpdHNlbGYKKyAgICAvLyB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIHRoZSBiaXQgbnVtYmVyICgwIGJhc2VkKQorICAgIC8vIHRvIGluY2x1ZGUgaW4gdGhlIGJpdHNldCwgc28gd2UgbmVlZCBhdCBhdCBsZWFzdAorICAgIC8vIGJpdCArIDEgYml0cy4gSWYgYW55IGFyZ3VtZW50cyBpbmRpY2F0ZSBhIAorICAgIC8vIGEgYml0IGhpZ2hlciB0aGFuIHRoZSBkZWZhdWx0IG51bWJlciBvZiBiaXRzICgwIG1lbmFzIGRlZmF1bHQgc2l6ZSkKKyAgICAvLyB0aGVuIEFkZCgpIHdpbGwgdGFrZSBjYXJlCisgICAgLy8gb2YgaXQuCisgICAgLy8KKyAgICBiaXRzZXQgID0gYW50bHIzQml0c2V0TmV3KDApOworCisgICAgaWYJKGJpdHNldCA9PSBOVUxMKQorICAgIHsKKwkJcmV0dXJuCU5VTEw7CisgICAgfQorCisgICAgLy8gTm93IHdlIGNhbiBhZGQgdGhlIGVsZW1lbnQgYml0cyBpbnRvIHRoZSBzZXQKKyAgICAvLworICAgIHZhX3N0YXJ0KGFwLCBiaXQpOworICAgIHdoaWxlICAgKGJpdCAhPSAtMSkKKyAgICB7CisJCWFudGxyM0JpdHNldEFkZChiaXRzZXQsIGJpdCk7CisJCWJpdCA9IHZhX2FyZyhhcCwgQU5UTFIzX1VJTlQzMik7CisgICAgfQorICAgIHZhX2VuZChhcCk7CisKKyAgICAvLyByZXR1cm4gdGhlIG5ldyBiaXRzZXQKKyAgICAvLworICAgIHJldHVybiAgYml0c2V0OworfQorCitzdGF0aWMgcEFOVExSM19CSVRTRVQKK2FudGxyM0JpdHNldE9SKHBBTlRMUjNfQklUU0VUIGJpdHNldDEsIHBBTlRMUjNfQklUU0VUIGJpdHNldDIpCit7CisgICAgcEFOVExSM19CSVRTRVQgIGJpdHNldDsKKworICAgIGlmCShiaXRzZXQxID09IE5VTEwpCisgICAgeworCQlyZXR1cm4gYW50bHIzQml0c2V0Q2xvbmUoYml0c2V0Mik7CisgICAgfQorCisgICAgaWYJKGJpdHNldDIgPT0gTlVMTCkKKyAgICB7CisJCXJldHVybglhbnRscjNCaXRzZXRDbG9uZShiaXRzZXQxKTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXdseSBvcmRlcmVkIGJpdHNldCBzdHJ1Y3R1cmUgaXRzZWxmLgorICAgIC8vCisgICAgYml0c2V0ICA9IGFudGxyM0JpdHNldENsb25lKGJpdHNldDEpOworICAgIAorICAgIGFudGxyM0JpdHNldE9SSW5QbGFjZShiaXRzZXQsIGJpdHNldDIpOworCisgICAgcmV0dXJuICBiaXRzZXQ7CisKK30KKworc3RhdGljIHZvaWQKK2FudGxyM0JpdHNldEFkZChwQU5UTFIzX0JJVFNFVCBiaXRzZXQsIEFOVExSM19JTlQzMiBiaXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiAgIHdvcmQ7CisKKyAgICB3b3JkICAgID0gd29yZE51bWJlcihiaXQpOworCisgICAgaWYJKHdvcmQJPj0gYml0c2V0LT5ibGlzdC5sZW5ndGgpCisgICAgeworCQlncm93VG9JbmNsdWRlKGJpdHNldCwgYml0KTsKKyAgICB9CisKKyAgICBiaXRzZXQtPmJsaXN0LmJpdHNbd29yZF0gfD0gYml0TWFzayhiaXQpOworCit9CisKK3N0YXRpYyB2b2lkCitncm93KHBBTlRMUjNfQklUU0VUIGJpdHNldCwgQU5UTFIzX0lOVDMyIG5ld1NpemUpCit7CisgICAgcEFOVExSM19CSVRXT1JEICAgbmV3Qml0czsKKworICAgIC8vIFNwYWNlIGZvciBuZXdseSBzaXplZCBiaXRzZXQgLSBUT0RPOiBjb21lIGJhY2sgdG8gdGhpcyBhbmQgdXNlIHJlYWxsb2M/LCBpdCBtYXkKKyAgICAvLyBiZSBtb3JlIGVmZmljaWVudC4uLgorICAgIC8vCisgICAgbmV3Qml0cyA9IChwQU5UTFIzX0JJVFdPUkQpIEFOVExSM19DQUxMT0MoMSwgKHNpemVfdCkobmV3U2l6ZSAqIHNpemVvZihBTlRMUjNfQklUV09SRCkpKTsKKyAgICBpZgkoYml0c2V0LT5ibGlzdC5iaXRzICE9IE5VTEwpCisgICAgeworCQkvLyBDb3B5IGV4aXN0aW5nIGJpdHMKKwkJLy8KKwkJQU5UTFIzX01FTUNQWSgodm9pZCAqKW5ld0JpdHMsIChjb25zdCB2b2lkICopYml0c2V0LT5ibGlzdC5iaXRzLCAoc2l6ZV90KShiaXRzZXQtPmJsaXN0Lmxlbmd0aCAqIHNpemVvZihBTlRMUjNfQklUV09SRCkpKTsKKworCQkvLyBPdXQgd2l0aCB0aGUgb2xkIGJpdHMuLi4gZGUgZGUgZGUgZGVycnIKKwkJLy8KKwkJQU5UTFIzX0ZSRUUoYml0c2V0LT5ibGlzdC5iaXRzKTsKKyAgICB9CisKKyAgICAvLyBJbiB3aXRoIHRoZSBuZXcgYml0cy4uLiBrZWVycnJhbmcuCisgICAgLy8KKyAgICBiaXRzZXQtPmJsaXN0LmJpdHMgICAgICA9IG5ld0JpdHM7CisgICAgYml0c2V0LT5ibGlzdC5sZW5ndGggICAgPSBuZXdTaXplOworfQorCitzdGF0aWMgdm9pZAorZ3Jvd1RvSW5jbHVkZShwQU5UTFIzX0JJVFNFVCBiaXRzZXQsIEFOVExSM19JTlQzMiBiaXQpCit7CisJQU5UTFIzX1VJTlQzMglibDsKKwlBTlRMUjNfVUlOVDMyCW53OworCisJYmwgPSAoYml0c2V0LT5ibGlzdC5sZW5ndGggPDwgMSk7CisJbncgPSBudW1Xb3Jkc1RvSG9sZChiaXQpOworCisJaWYJKGJsID4gbncpCisJeworCQliaXRzZXQtPmdyb3coYml0c2V0LCBibCk7CisJfQorCWVsc2UKKwl7CisJCWJpdHNldC0+Z3JvdyhiaXRzZXQsIG53KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithbnRscjNCaXRzZXRPUkluUGxhY2UocEFOVExSM19CSVRTRVQgYml0c2V0LCBwQU5UTFIzX0JJVFNFVCBiaXRzZXQyKQoreworICAgIEFOVExSM19VSU5UMzIgICBtaW5pbXVtOworICAgIEFOVExSM19VSU5UMzIgICBpOworCisgICAgaWYJKGJpdHNldDIgPT0gTlVMTCkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisKKworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgYml0c2V0IGlzIGJpZyBlbm91Z2gKKyAgICAvLyBmb3IgdGhlIG5ldyBiaXRzIHRvIGJlIG9yZWQgaW4uCisgICAgLy8KKyAgICBpZgkoYml0c2V0LT5ibGlzdC5sZW5ndGggPCBiaXRzZXQyLT5ibGlzdC5sZW5ndGgpCisgICAgeworCQlncm93VG9JbmNsdWRlKGJpdHNldCwgKGJpdHNldDItPmJsaXN0Lmxlbmd0aCAqIHNpemVvZihBTlRMUjNfQklUV09SRCkpKTsKKyAgICB9CisgICAgCisgICAgLy8gT3IgdGhlIG1pbmlpbXVtIG51bWJlciBvZiBiaXRzIGFmdGVyIGFueSByZXNpemluZyB3ZW50IG9uCisgICAgLy8KKyAgICBpZgkoYml0c2V0LT5ibGlzdC5sZW5ndGggPCBiaXRzZXQyLT5ibGlzdC5sZW5ndGgpCisJeworCQltaW5pbXVtID0gYml0c2V0LT5ibGlzdC5sZW5ndGg7CisJfQorCWVsc2UKKwl7CisJCW1pbmltdW0gPSBiaXRzZXQyLT5ibGlzdC5sZW5ndGg7CisJfQorCisgICAgZm9yCShpID0gbWluaW11bTsgaSA+IDA7IGktLSkKKyAgICB7CisJCWJpdHNldC0+Ymxpc3QuYml0c1tpLTFdIHw9IGJpdHNldDItPmJsaXN0LmJpdHNbaS0xXTsKKyAgICB9Cit9CisKK3N0YXRpYyBBTlRMUjNfVUlOVDY0CitiaXRNYXNrKEFOVExSM19VSU5UMzIgYml0TnVtYmVyKQoreworICAgIHJldHVybiAgKChBTlRMUjNfVUlOVDY0KTEpIDw8IChiaXROdW1iZXIgJiAoQU5UTFIzX0JJVFNFVF9NT0RfTUFTSykpOworfQorCitzdGF0aWMgQU5UTFIzX1VJTlQzMgorYW50bHIzQml0c2V0U2l6ZShwQU5UTFIzX0JJVFNFVCBiaXRzZXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiAgIGRlZ3JlZTsKKyAgICBBTlRMUjNfSU5UMzIgICBpOworICAgIEFOVExSM19JTlQ4ICAgIGJpdDsKKyAgICAKKyAgICAvLyBUT0RPOiBDb21lIGJhY2sgdG8gdGhpcywgaXQgbWF5IGJlIGZhc3RlciB0byAmIHdpdGggMHgwMQorICAgIC8vIHRoZW4gc2hpZnQgcmlnaHQgYSBjb3B5IG9mIHRoZSA0IGJpdHMsIHRoYW4gc2hpZnQgbGVmdCBhIGNvbnN0YW50IG9mIDEuCisgICAgLy8gQnV0IHRoZW4gYWdhaW4sIHRoZSBvcHRpbWl6ZXIgbWlnaHQganVzdCB3b3JrIHRoaXMgb3V0CisgICAgLy8gYW55d2F5LgorICAgIC8vCisgICAgZGVncmVlICA9IDA7CisgICAgZm9yCShpID0gYml0c2V0LT5ibGlzdC5sZW5ndGggLSAxOyBpPj0gMDsgaS0tKQorICAgIHsKKwkJaWYgIChiaXRzZXQtPmJsaXN0LmJpdHNbaV0gIT0gMCkKKwkJeworCQkJZm9yCShiaXQgPSBBTlRMUjNfQklUU0VUX0JJVFMgLSAxOyBiaXQgPj0gMDsgYml0LS0pCisJCQl7CisJCQkJaWYgICgoYml0c2V0LT5ibGlzdC5iaXRzW2ldICYgKCgoQU5UTFIzX0JJVFdPUkQpMSkgPDwgYml0KSkgIT0gMCkKKwkJCQl7CisJCQkJCWRlZ3JlZSsrOworCQkJCX0KKwkJCX0KKwkJfQorICAgIH0KKyAgICByZXR1cm4gZGVncmVlOworfQorCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK2FudGxyM0JpdHNldEVxdWFscyhwQU5UTFIzX0JJVFNFVCBiaXRzZXQxLCBwQU5UTFIzX0JJVFNFVCBiaXRzZXQyKQoreworICAgIEFOVExSM19JTlQzMiAgIG1pbmltdW07CisgICAgQU5UTFIzX0lOVDMyICAgaTsKKworICAgIGlmCShiaXRzZXQxID09IE5VTEwgfHwgYml0c2V0MiA9PSBOVUxMKQorICAgIHsKKwlyZXR1cm4JQU5UTFIzX0ZBTFNFOworICAgIH0KKworICAgIC8vIFdvcmsgb3V0IHRoZSBtaW5pbXVtIGNvbXBhcmlzb24gc2V0CisgICAgLy8KKyAgICBpZgkoYml0c2V0MS0+Ymxpc3QubGVuZ3RoIDwgYml0c2V0Mi0+Ymxpc3QubGVuZ3RoKQorICAgIHsKKwkJbWluaW11bSA9IGJpdHNldDEtPmJsaXN0Lmxlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJbWluaW11bSA9IGJpdHNldDItPmJsaXN0Lmxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgZXhwbGljdCBpbiBjb21tb24gYml0cyBhcmUgZXF1YWwKKyAgICAvLworICAgIGZvcgkoaSA9IG1pbmltdW0gLSAxOyBpID49MCA7IGktLSkKKyAgICB7CisJCWlmICAoYml0c2V0MS0+Ymxpc3QuYml0c1tpXSAhPSBiaXRzZXQyLT5ibGlzdC5iaXRzW2ldKQorCQl7CisJCQlyZXR1cm4gIEFOVExSM19GQUxTRTsKKwkJfQorICAgIH0KKworICAgIC8vIE5vdyBtYWtlIHN1cmUgdGhlIGJpdHMgb2YgdGhlIGxhcmdlciBzZXQgYXJlIGFsbCB0dXJuZWQKKyAgICAvLyBvZmYuCisgICAgLy8KKyAgICBpZgkoYml0c2V0MS0+Ymxpc3QubGVuZ3RoID4gKEFOVExSM19VSU5UMzIpbWluaW11bSkKKyAgICB7CisJCWZvciAoaSA9IG1pbmltdW0gOyAoQU5UTFIzX1VJTlQzMilpIDwgYml0c2V0MS0+Ymxpc3QubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmCShiaXRzZXQxLT5ibGlzdC5iaXRzW2ldICE9IDApCisJCQl7CisJCQkJcmV0dXJuCUFOVExSM19GQUxTRTsKKwkJCX0KKwkJfQorICAgIH0KKyAgICBlbHNlIGlmIChiaXRzZXQyLT5ibGlzdC5sZW5ndGggPiAoQU5UTFIzX1VJTlQzMiltaW5pbXVtKQorICAgIHsKKwkJZm9yIChpID0gbWluaW11bTsgKEFOVExSM19VSU5UMzIpaSA8IGJpdHNldDItPmJsaXN0Lmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZgkoYml0c2V0Mi0+Ymxpc3QuYml0c1tpXSAhPSAwKQorCQkJeworCQkJCXJldHVybglBTlRMUjNfRkFMU0U7CisJCQl9CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gIEFOVExSM19UUlVFOworfQorCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK2FudGxyM0JpdHNldE1lbWJlcihwQU5UTFIzX0JJVFNFVCBiaXRzZXQsIEFOVExSM19VSU5UMzIgYml0KQoreworICAgIEFOVExSM19VSU5UMzIgICAgd29yZE5vOworCisgICAgd29yZE5vICA9IHdvcmROdW1iZXIoYml0KTsKKworICAgIGlmCSh3b3JkTm8gPj0gYml0c2V0LT5ibGlzdC5sZW5ndGgpCisgICAgeworCQlyZXR1cm4JQU5UTFIzX0ZBTFNFOworICAgIH0KKyAgICAKKyAgICBpZgkoKGJpdHNldC0+Ymxpc3QuYml0c1t3b3JkTm9dICYgYml0TWFzayhiaXQpKSA9PSAwKQorICAgIHsKKwkJcmV0dXJuCUFOVExSM19GQUxTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJcmV0dXJuCUFOVExSM19UUlVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FudGxyM0JpdHNldFJlbW92ZShwQU5UTFIzX0JJVFNFVCBiaXRzZXQsIEFOVExSM19VSU5UMzIgYml0KQoreworICAgIEFOVExSM19VSU5UMzIgICAgd29yZE5vOworCisgICAgd29yZE5vICA9IHdvcmROdW1iZXIoYml0KTsKKworICAgIGlmCSh3b3JkTm8gPCBiaXRzZXQtPmJsaXN0Lmxlbmd0aCkKKyAgICB7CisJCWJpdHNldC0+Ymxpc3QuYml0c1t3b3JkTm9dICY9IH4oYml0TWFzayhiaXQpKTsKKyAgICB9Cit9CitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK2FudGxyM0JpdHNldElzTmlsKHBBTlRMUjNfQklUU0VUIGJpdHNldCkKK3sKKyAgIEFOVExSM19JTlQzMiAgICBpOworCisgICBmb3IJKGkgPSBiaXRzZXQtPmJsaXN0Lmxlbmd0aCAtMTsgaT49IDA7IGktLSkKKyAgIHsKKyAgICAgICBpZiAgIChiaXRzZXQtPmJsaXN0LmJpdHNbaV0gIT0gMCkKKyAgICAgICB7CisJCQlyZXR1cm4gQU5UTFIzX0ZBTFNFOworICAgICAgIH0KKyAgIH0KKyAgIAorICAgcmV0dXJuICAgQU5UTFIzX1RSVUU7Cit9CisKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCitudW1Xb3Jkc1RvSG9sZChBTlRMUjNfVUlOVDMyIGJpdCkKK3sKKyAgICByZXR1cm4gIChiaXQgPj4gQU5UTFIzX0JJVFNFVF9MT0dfQklUUykgKyAxOworfQorCitzdGF0aWMJQU5UTFIzX1VJTlQzMgord29yZE51bWJlcihBTlRMUjNfVUlOVDMyIGJpdCkKK3sKKyAgICByZXR1cm4gIGJpdCA+PiBBTlRMUjNfQklUU0VUX0xPR19CSVRTOworfQorCitzdGF0aWMgQU5UTFIzX1VJTlQzMgorYW50bHIzQml0c2V0TnVtQml0cyhwQU5UTFIzX0JJVFNFVCBiaXRzZXQpCit7CisgICAgcmV0dXJuICBiaXRzZXQtPmJsaXN0Lmxlbmd0aCA8PCBBTlRMUjNfQklUU0VUX0xPR19CSVRTOworfQorCisvKiogUHJvZHVjZSBhbiBpbnRlZ2VyIGxpc3Qgb2YgYWxsIHRoZSBiaXRzIHRoYXQgYXJlIHR1cm5lZCBvbgorICogIGluIHRoaXMgYml0c2V0LiBVc2VkIGZvciBlcnJvciBwcm9jZXNzaW5nIGluIHRoZSBtYWluIGFzIHRoZSBiaXRzZXQKKyAqICByZXJlc2VudHMgYSBudW1iZXIgb2YgaW50ZWdlciB0b2tlbnMgd2hpY2ggd2UgdXNlIGZvciBmb2xsb3cgc2V0cworICogIGFuZCBzbyBvbi4KKyAqCisgKiAgVGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9sbG93aW5nIGluIHRoZSBsaXN0LgorICovCitzdGF0aWMJcEFOVExSM19JTlQzMgkKK2FudGxyM0JpdHNldFRvSW50TGlzdAkocEFOVExSM19CSVRTRVQgYml0c2V0KQoreworICAgIEFOVExSM19VSU5UMzIgICBudW1JbnRzOwkgICAgLy8gSG93IG1hbnkgaW50ZWdlcnMgd2Ugd2lsbCBuZWVkCisgICAgQU5UTFIzX1VJTlQzMiAgIG51bUJpdHM7CSAgICAvLyBIb3cgbWFueSBiaXRzIGFyZSBpbiB0aGUgc2V0CisgICAgQU5UTFIzX1VJTlQzMiAgIGk7CisgICAgQU5UTFIzX1VJTlQzMiAgIGluZGV4OworCisgICAgcEFOVExSM19JTlQzMiAgaW50TGlzdDsKKworICAgIG51bUludHMgPSBiaXRzZXQtPnNpemUoYml0c2V0KSArIDE7CisgICAgbnVtQml0cyA9IGJpdHNldC0+bnVtQml0cyhiaXRzZXQpOworIAorICAgIGludExpc3QgPSAocEFOVExSM19JTlQzMilBTlRMUjNfTUFMTE9DKG51bUludHMgKiBzaXplb2YoQU5UTFIzX0lOVDMyKSk7CisKKyAgICBpZgkoaW50TGlzdCA9PSBOVUxMKQorICAgIHsKKwkJcmV0dXJuIE5VTEw7CS8vIE91dCBvZiBtZW1vcnkKKyAgICB9CisKKyAgICBpbnRMaXN0WzBdID0gbnVtSW50czsKKworICAgIC8vIEVudW1lcmF0ZSB0aGUgYml0cyB0aGF0IGFyZSB0dXJuZWQgb24KKyAgICAvLworICAgIGZvcgkoaSA9IDAsIGluZGV4ID0gMTsgaTxudW1CaXRzOyBpKyspCisgICAgeworCQlpZiAgKGJpdHNldC0+aXNNZW1iZXIoYml0c2V0LCBpKSA9PSBBTlRMUjNfVFJVRSkKKwkJeworCQkJaW50TGlzdFtpbmRleCsrXSAgICA9IGk7CisJCX0KKyAgICB9CisKKyAgICAvLyBSZXN1bHQgc2V0CisgICAgLy8KKyAgICByZXR1cm4gIGludExpc3Q7Cit9CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbGxlY3Rpb25zLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb2xsZWN0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTIyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb2xsZWN0aW9ucy5jCkBAIC0wLDAgKzEsMjc0MSBAQAorLy8vIFxmaWxlCisvLy8gUHJvdmlkZXMgYSBudW1iZXIgb2YgdXNlZnVsIGZ1bmN0aW9ucyB0aGF0IGFyZSByb3VnaGx5IGVxdWl2YWxlbnQKKy8vLyB0byBqYXZhIEhhc2hUYWJsZSBhbmQgTGlzdCBmb3IgdGhlIHB1cnBvc2VzIG9mIEFudGxyIDMgQyBydW50aW1lLgorLy8vIEFsc28gdXNlYWJsZSBieSB0aGUgQyBwcm9ncmFtbWVyIGZvciB0aGluZ3MgbGlrZSBzeW1ib2wgdGFibGVzIHBvaW50ZXJzCisvLy8gYW5kIHNvIG9uLgorLy8vCisvLy8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzLmg+CisKKyNpbmNsdWRlICJhbnRscjNjb2xsZWN0aW9ucy5oIgorCisvLyBJbnRlcmZhY2UgZnVuY3Rpb25zIGZvciBoYXNoIHRhYmxlCisvLworCisvLyBTdHJpbmcgYmFzZWQga2V5cworLy8KK3N0YXRpYyB2b2lkCQkJCQlhbnRscjNIYXNoRGVsZXRlICAgIChwQU5UTFIzX0hBU0hfVEFCTEUgdGFibGUsIHZvaWQgKiBrZXkpOworc3RhdGljIHZvaWQgKgkJCQlhbnRscjNIYXNoR2V0CShwQU5UTFIzX0hBU0hfVEFCTEUgdGFibGUsIHZvaWQgKiBrZXkpOworc3RhdGljIHBBTlRMUjNfSEFTSF9FTlRSWSAgIGFudGxyM0hhc2hSZW1vdmUgICAgKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgdm9pZCAqIGtleSk7CitzdGF0aWMgQU5UTFIzX0lOVDMyCQkJYW50bHIzSGFzaFB1dAkocEFOVExSM19IQVNIX1RBQkxFIHRhYmxlLCB2b2lkICoga2V5LCB2b2lkICogZWxlbWVudCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKTsKKworLy8gSW50ZWdlciBiYXNlZCBrZXlzIChMaXN0cyBhbmQgc28gb24pCisvLworc3RhdGljIHZvaWQJCQkJCWFudGxyM0hhc2hEZWxldGVJICAgKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgQU5UTFIzX0lOVEtFWSBrZXkpOworc3RhdGljIHZvaWQgKgkJCQlhbnRscjNIYXNoR2V0SQkocEFOVExSM19IQVNIX1RBQkxFIHRhYmxlLCBBTlRMUjNfSU5US0VZIGtleSk7CitzdGF0aWMgcEFOVExSM19IQVNIX0VOVFJZICAgYW50bHIzSGFzaFJlbW92ZUkgICAocEFOVExSM19IQVNIX1RBQkxFIHRhYmxlLCBBTlRMUjNfSU5US0VZIGtleSk7CitzdGF0aWMgQU5UTFIzX0lOVDMyCQkJYW50bHIzSGFzaFB1dEkJKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgQU5UTFIzX0lOVEtFWSBrZXksIHZvaWQgKiBlbGVtZW50LCB2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVwdHIpKHZvaWQgKikpOworCitzdGF0aWMgdm9pZAkJCQkJYW50bHIzSGFzaEZyZWUJKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgYW50bHIzSGFzaFNpemUJKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSk7CisKKy8vIC0tLS0tLS0tLS0tCisKKy8vIEludGVyZmFjZSBmdW5jdGlvbnMgZm9yIGVudW1lcmF0aW9uCisvLworc3RhdGljIGludAkgICAgYW50bHIzRW51bU5leHQJICAgIChwQU5UTFIzX0hBU0hfRU5VTSBlbiwgcEFOVExSM19IQVNIX0tFWSAqIGtleSwgdm9pZCAqKiBkYXRhKTsKK3N0YXRpYyB2b2lkCSAgICBhbnRscjNFbnVtRnJlZQkgICAgKHBBTlRMUjNfSEFTSF9FTlVNIGVuKTsKKworLy8gSW50ZXJmYWNlIGZ1bmN0aW9ucyBmb3IgTGlzdAorLy8KK3N0YXRpYyB2b2lkCQkJCWFudGxyM0xpc3RGcmVlCShwQU5UTFIzX0xJU1QgbGlzdCk7CitzdGF0aWMgdm9pZAkJCQlhbnRscjNMaXN0RGVsZXRlKHBBTlRMUjNfTElTVCBsaXN0LCBBTlRMUjNfSU5US0VZIGtleSk7CitzdGF0aWMgdm9pZCAqCQkJYW50bHIzTGlzdEdldAkocEFOVExSM19MSVNUIGxpc3QsIEFOVExSM19JTlRLRVkga2V5KTsKK3N0YXRpYyBBTlRMUjNfSU5UMzIJCWFudGxyM0xpc3RQdXQJKHBBTlRMUjNfTElTVCBsaXN0LCBBTlRMUjNfSU5US0VZIGtleSwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CitzdGF0aWMgQU5UTFIzX0lOVDMyCQlhbnRscjNMaXN0QWRkICAgKHBBTlRMUjNfTElTVCBsaXN0LCB2b2lkICogZWxlbWVudCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKTsKK3N0YXRpYyB2b2lkICoJCQlhbnRscjNMaXN0UmVtb3ZlKHBBTlRMUjNfTElTVCBsaXN0LCBBTlRMUjNfSU5US0VZIGtleSk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMglhbnRscjNMaXN0U2l6ZQkocEFOVExSM19MSVNUIGxpc3QpOworCisvLyBJbnRlcmZhY2UgZnVuY3Rpb25zIGZvciBTdGFjaworLy8KK3N0YXRpYyB2b2lkCQkJCWFudGxyM1N0YWNrRnJlZQkocEFOVExSM19TVEFDSyAgc3RhY2spOworc3RhdGljIHZvaWQgKgkJCWFudGxyM1N0YWNrUG9wCShwQU5UTFIzX1NUQUNLCXN0YWNrKTsKK3N0YXRpYyB2b2lkICoJCQlhbnRscjNTdGFja0dldAkocEFOVExSM19TVEFDSwlzdGFjaywgQU5UTFIzX0lOVEtFWSBrZXkpOworc3RhdGljIEFOVExSM19CT09MRUFOCWFudGxyM1N0YWNrUHVzaAkocEFOVExSM19TVEFDSwlzdGFjaywgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMglhbnRscjNTdGFja1NpemUJKHBBTlRMUjNfU1RBQ0sJc3RhY2spOworc3RhdGljIHZvaWQgKgkJCWFudGxyM1N0YWNrUGVlawkocEFOVExSM19TVEFDSwlzdGFjayk7CisKKy8vIEludGVyZmFjZSBmdW5jdGlvbnMgZm9yIHZlY3RvcnMKKy8vCitzdGF0aWMJdm9pZCBBTlRMUjNfQ0RFQ0wJYW50bHIzVmVjdG9yRnJlZQkocEFOVExSM19WRUNUT1IgdmVjdG9yKTsKK3N0YXRpYwl2b2lkCQkJCWFudGxyM1ZlY3RvckRlbAkJKHBBTlRMUjNfVkVDVE9SIHZlY3RvciwgQU5UTFIzX1VJTlQzMiBlbnRyeSk7CitzdGF0aWMJdm9pZCAqCQkJCWFudGxyM1ZlY3RvckdldAkJKHBBTlRMUjNfVkVDVE9SIHZlY3RvciwgQU5UTFIzX1VJTlQzMiBlbnRyeSk7CitzdGF0aWMJdm9pZCAqCQkJCWFudHJsM1ZlY3RvclJlbW92ZQkocEFOVExSM19WRUNUT1IgdmVjdG9yLCBBTlRMUjNfVUlOVDMyIGVudHJ5KTsKK3N0YXRpYwl2b2lkCQkJCWFudGxyM1ZlY3RvckNsZWFyCShwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpOworc3RhdGljCUFOVExSM19VSU5UMzIJCWFudGxyM1ZlY3RvckFkZAkJKHBBTlRMUjNfVkVDVE9SIHZlY3Rvciwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSk7CitzdGF0aWMJQU5UTFIzX1VJTlQzMgkJYW50bHIzVmVjdG9yU2V0CQkocEFOVExSM19WRUNUT1IgdmVjdG9yLCBBTlRMUjNfVUlOVDMyIGVudHJ5LCB2b2lkICogZWxlbWVudCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopLCBBTlRMUjNfQk9PTEVBTiBmcmVlRXhpc3RpbmcpOworc3RhdGljCUFOVExSM19VSU5UMzIJCWFudGxyM1ZlY3RvclNpemUgICAgKHBBTlRMUjNfVkVDVE9SIHZlY3Rvcik7CitzdGF0aWMJQU5UTFIzX0JPT0xFQU4gICAgICBhbnRscjNWZWN0b3JTd2FwCShwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IsIEFOVExSM19VSU5UMzIgZW50cnkxLCBBTlRMUjNfVUlOVDMyIGVudHJ5Mik7CisKK3N0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBuZXdQb29sICAgICAgICAgICAgIChwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZIGZhY3RvcnkpOworc3RhdGljICB2b2lkCQkJCWNsb3NlVmVjdG9yRmFjdG9yeSAgKHBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlkgZmFjdG9yeSk7CitzdGF0aWMJcEFOVExSM19WRUNUT1IJCW5ld1ZlY3RvcgkJCShwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZIGZhY3RvcnkpOworc3RhdGljCXZvaWQJCQkJcmV0dXJuVmVjdG9yCQkocEFOVExSM19WRUNUT1JfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpOworCisKKy8vIEludGVyZmFjZSBmdW5jdGlvbnMgZm9yIGludCBUUklFCisvLworc3RhdGljCXBBTlRMUjNfVFJJRV9FTlRSWQlpbnRUcmllR2V0CQkocEFOVExSM19JTlRfVFJJRSB0cmllLCBBTlRMUjNfSU5US0VZIGtleSk7CitzdGF0aWMJQU5UTFIzX0JPT0xFQU4JCWludFRyaWVEZWwJCShwQU5UTFIzX0lOVF9UUklFIHRyaWUsIEFOVExSM19JTlRLRVkga2V5KTsKK3N0YXRpYwlBTlRMUjNfQk9PTEVBTgkJaW50VHJpZUFkZAkJKHBBTlRMUjNfSU5UX1RSSUUgdHJpZSwgQU5UTFIzX0lOVEtFWSBrZXksIEFOVExSM19VSU5UMzIgdHlwZSwgQU5UTFIzX0lOVEtFWSBpbnRUeXBlLCB2b2lkICogZGF0YSwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKTsKK3N0YXRpYwl2b2lkCQkJCWludFRyaWVGcmVlCQkocEFOVExSM19JTlRfVFJJRSB0cmllKTsKKworCisvLyBJbnRlcmZhY2UgZnVuY3Rpb25zIGZvciB0b3BvbG9naWNhbCBzb3J0ZXIKKy8vCitzdGF0aWMgIHZvaWQgICAgICAgICAgICBhZGRFZGdlICAgICAgICAgIChwQU5UTFIzX1RPUE8gdG9wbywgQU5UTFIzX1VJTlQzMiBlZGdlLCBBTlRMUjNfVUlOVDMyIGRlcGVuZGVuY3kpOworc3RhdGljICBwQU5UTFIzX1VJTlQzMiAgc29ydFRvQXJyYXkgICAgICAocEFOVExSM19UT1BPIHRvcG8pOworc3RhdGljICB2b2lkICAgICAgICAgICAgc29ydFZlY3RvciAgICAgICAocEFOVExSM19UT1BPIHRvcG8sIHBBTlRMUjNfVkVDVE9SIHYpOworc3RhdGljICB2b2lkICAgICAgICAgICAgZnJlZVRvcG8gICAgICAgICAocEFOVExSM19UT1BPIHRvcG8pOworCisvLyBMb2NhbCBmdW5jdGlvbiB0byBhZHZhbmNlIGVudW1lcmF0aW9uIHN0cnVjdHVyZSBwb2ludGVycworLy8KK3N0YXRpYyB2b2lkIGFudGxyM0VudW1OZXh0RW50cnkocEFOVExSM19IQVNIX0VOVU0gZW4pOworCitwQU5UTFIzX0hBU0hfVEFCTEUKK2FudGxyM0hhc2hUYWJsZU5ldyhBTlRMUjNfVUlOVDMyIHNpemVIaW50KQoreworCS8vIEFsbCB3ZSBoYXZlIHRvIGRvIGlzIGNyZWF0ZSB0aGUgaGFzaHRhYmxlIHRyYWNraW5nIHN0cnVjdHVyZQorCS8vIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ1Y2tldHMuCisJLy8KKwlwQU5UTFIzX0hBU0hfVEFCTEUJdGFibGU7CisKKwlBTlRMUjNfVUlOVDMyCWJ1Y2tldDsJLy8gVXNlZCB0byB0cmF2ZXJzZSB0aGUgYnVja2V0cworCisJdGFibGUgICA9IEFOVExSM19NQUxMT0Moc2l6ZW9mKEFOVExSM19IQVNIX1RBQkxFKSk7CisKKwkvLyBFcnJvciBvdXQgaWYgbm8gbWVtb3J5IGxlZnQKKwlpZgkodGFibGUJPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJ1Y2tldHMKKwkvLworCXRhYmxlLT5idWNrZXRzID0gKHBBTlRMUjNfSEFTSF9CVUNLRVQpIEFOVExSM19NQUxMT0MoKHNpemVfdCkgKHNpemVvZihBTlRMUjNfSEFTSF9CVUNLRVQpICogc2l6ZUhpbnQpKTsgCisKKwlpZgkodGFibGUtPmJ1Y2tldHMgPT0gTlVMTCkKKwl7CisJCUFOVExSM19GUkVFKCh2b2lkICopdGFibGUpOworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvLyBNb2R1bG8gb2YgdGhlIHRhYmxlLCAoYnVja2V0IGNvdW50KS4KKwkvLworCXRhYmxlLT5tb2R1bG8gICA9IHNpemVIaW50OworCisJdGFibGUtPmNvdW50ICAgID0gMDsJICAgIC8qIE5vdGhpbmcgaW4gdGhlcmUgeWV0ICggSSBob3BlKQkqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgYnVja2V0cyB0byBlbXB0eQorCSovCisJZm9yCShidWNrZXQgPSAwOyBidWNrZXQgPCBzaXplSGludDsgYnVja2V0KyspCisJeworCQl0YWJsZS0+YnVja2V0c1tidWNrZXRdLmVudHJpZXMgPSBOVUxMOworCX0KKworCS8qIEV4Y2x1ZGUgZHVwbGljYXRlIGVudHJpZXMgYnkgZGVmYXVsdAorCSovCisJdGFibGUtPmFsbG93RHVwcwk9IEFOVExSM19GQUxTRTsKKworICAgIC8qIEFzc3VtZSB0aGF0IGtleXMgc2hvdWxkIGJ5IHN0cmR1cGVkIGJlZm9yZSB0aGV5IGFyZQorICAgICAqIGVudGVyZWQgaW4gdGhlIHRhYmxlLgorICAgICAqLworICAgIHRhYmxlLT5kb1N0cmR1cCAgICAgPSBBTlRMUjNfVFJVRTsKKworCS8qIEluc3RhbGwgdGhlIGludGVyZmFjZQorCSovCisKKwl0YWJsZS0+Z2V0CQk9ICBhbnRscjNIYXNoR2V0OworCXRhYmxlLT5wdXQJCT0gIGFudGxyM0hhc2hQdXQ7CisJdGFibGUtPmRlbAkJPSAgYW50bHIzSGFzaERlbGV0ZTsKKwl0YWJsZS0+cmVtb3ZlCT0gIGFudGxyM0hhc2hSZW1vdmU7CisKKwl0YWJsZS0+Z2V0SQkJPSAgYW50bHIzSGFzaEdldEk7CisJdGFibGUtPnB1dEkJCT0gIGFudGxyM0hhc2hQdXRJOworCXRhYmxlLT5kZWxJCQk9ICBhbnRscjNIYXNoRGVsZXRlSTsKKwl0YWJsZS0+cmVtb3ZlSQk9ICBhbnRscjNIYXNoUmVtb3ZlSTsKKworCXRhYmxlLT5zaXplCQk9ICBhbnRscjNIYXNoU2l6ZTsKKwl0YWJsZS0+ZnJlZQkJPSAgYW50bHIzSGFzaEZyZWU7CisKKwlyZXR1cm4gIHRhYmxlOworfQorCitzdGF0aWMgdm9pZAorYW50bHIzSGFzaEZyZWUocEFOVExSM19IQVNIX1RBQkxFIHRhYmxlKQoreworICAgIEFOVExSM19VSU5UMzIJYnVja2V0OwkvKiBVc2VkIHRvIHRyYXZlcnNlIHRoZSBidWNrZXRzCSovCisKKyAgICBwQU5UTFIzX0hBU0hfQlVDS0VUCXRoaXNCdWNrZXQ7CisgICAgcEFOVExSM19IQVNIX0VOVFJZCWVudHJ5OworICAgIHBBTlRMUjNfSEFTSF9FTlRSWQluZXh0RW50cnk7CisKKyAgICAvKiBGcmVlIHRoZSB0YWJsZSwgYWxsIGJ1Y2tldHMgYW5kIGFsbCBlbnRyaWVzLCBhbmQgYWxsIHRoZQorICAgICAqIGtleXMgYW5kIGRhdGEgKGlmIHRoZSB0YWJsZSBleGlzdHMpCisgICAgICovCisgICAgaWYJKHRhYmxlCSE9IE5VTEwpCisgICAgeworCWZvcgkoYnVja2V0ID0gMDsgYnVja2V0IDwgdGFibGUtPm1vZHVsbzsgYnVja2V0KyspCisJeworCSAgICB0aGlzQnVja2V0CT0gJih0YWJsZS0+YnVja2V0c1tidWNrZXRdKTsKKworCSAgICAvKiBBbGxvdyBzcGFyc2UgdGFibGVzLCB0aG91Z2ggd2UgZG9uJ3QgY3JlYXRlIHRoZW0gYXMgc3VjaCBhdCBwcmVzZW50CisJICAgICAqLworCSAgICBpZgkoIHRoaXNCdWNrZXQgIT0gTlVMTCkKKwkgICAgeworCQllbnRyeQk9IHRoaXNCdWNrZXQtPmVudHJpZXM7CisKKwkJLyogU2VhcmNoIGFsbCBlbnRyaWVzIGluIHRoZSBidWNrZXQgYW5kIGZyZWUgdGhlbSB1cAorCQkgKi8KKwkJd2hpbGUJKGVudHJ5ICE9IE5VTEwpCisJCXsKKwkJICAgIC8qIFNhdmUgbmV4dCBlbnRyeSAtIHdlIGRvIG5vdCB3YW50IHRvIGFjY2VzcyBtZW1vcnkgaW4gZW50cnkgYWZ0ZXIgd2UKKwkJICAgICAqIGhhdmUgZnJlZWQgaXQuCisJCSAgICAgKi8KKwkJICAgIG5leHRFbnRyeQk9IGVudHJ5LT5uZXh0RW50cnk7CisKKwkJICAgIC8qIEZyZWUgYW55IGRhdGEgcG9pbnRlciwgdGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIHVzZXIgc3VwcGxpZWQKKwkJICAgICAqIGEgcG9pbnRlciB0byBhIHJvdXRpbmUgdGhhdCBrbndvcyBob3cgdG8gZnJlZSB0aGUgc3RydWN0dXJlIHRoZXkKKwkJICAgICAqIGFkZGVkIHRvIHRoZSB0YWJsZS4KKwkJICAgICAqLworCQkgICAgaWYJKGVudHJ5LT5mcmVlICE9IE5VTEwpCisJCSAgICB7CisJCQllbnRyeS0+ZnJlZShlbnRyeS0+ZGF0YSk7CisJCSAgICB9CisKKwkJICAgIC8qIEZyZWUgdGhlIGtleSBtZW1vcnkgLSB3ZSBrbm93IHRoYXQgd2UgYWxsb2NhdGVkIHRoaXMKKwkJICAgICAqLworCQkgICAgaWYJKGVudHJ5LT5rZXliYXNlLnR5cGUgPT0gQU5UTFIzX0hBU0hfVFlQRV9TVFIgJiYgZW50cnktPmtleWJhc2Uua2V5LnNLZXkgIT0gTlVMTCkKKwkJICAgIHsKKwkJCUFOVExSM19GUkVFKGVudHJ5LT5rZXliYXNlLmtleS5zS2V5KTsKKwkJICAgIH0KKworCQkgICAgLyogRnJlZSB0aGlzIGVudHJ5CisJCSAgICAgKi8KKwkJICAgIEFOVExSM19GUkVFKGVudHJ5KTsKKwkJICAgIGVudHJ5ICAgPSBuZXh0RW50cnk7ICAgIC8qIExvYWQgbmV4dCBwb2ludGVyIHRvIHNlZSBpZiB3ZSBzaG91ZCBmcmVlIGl0ICovCisJCX0KKwkJLyogSW52YWxpZGF0ZSB0aGUgY3VycmVudCBwb2ludGVyCisJCSAqLworCQl0aGlzQnVja2V0LT5lbnRyaWVzID0gTlVMTDsKKwkgICAgfQorCX0KKworCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGUgYnVja2V0IG1lbW9yeQorCSAqLworCUFOVExSM19GUkVFKHRhYmxlLT5idWNrZXRzKTsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgZnJlZSB0ZWggbWVtb3J5IGZvciB0aGUgdGFibGUgaXRzZWxmCisgICAgICovCisgICAgQU5UTFIzX0ZSRUUodGFibGUpOworfQorCisvKiogcmV0dXJuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGhhc2ggdGFibGUKKyAqLworc3RhdGljIEFOVExSM19VSU5UMzIJYW50bHIzSGFzaFNpemUJICAgIChwQU5UTFIzX0hBU0hfVEFCTEUgdGFibGUpCit7CisgICAgcmV0dXJuICB0YWJsZS0+Y291bnQ7Cit9CisKKy8qKiBSZW1vdmUgYSBudW1lcmljIGtleWVkIGVudHJ5IGZyb20gYSBoYXNoIHRhYmxlIGlmIGl0IGV4aXN0cywKKyAqICBubyBlcnJvciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAqLworc3RhdGljIHBBTlRMUjNfSEFTSF9FTlRSWSAgIGFudGxyM0hhc2hSZW1vdmVJICAgKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisgICAgQU5UTFIzX1VJTlQzMgkgICAgaGFzaDsKKyAgICBwQU5UTFIzX0hBU0hfQlVDS0VUCSAgICBidWNrZXQ7CisgICAgcEFOVExSM19IQVNIX0VOVFJZCSAgICBlbnRyeTsKKyAgICBwQU5UTFIzX0hBU0hfRU5UUlkJICAgICogbmV4dFBvaW50ZXI7CisKKyAgICAvKiBGaXJzdCB3ZSBuZWVkIHRvIGtub3cgdGhlIGhhc2ggb2YgdGhlIHByb3ZpZGVkIGtleQorICAgICAqLworICAgIGhhc2ggICAgPSAoQU5UTFIzX1VJTlQzMikoa2V5ICUgKEFOVExSM19JTlRLRVkpKHRhYmxlLT5tb2R1bG8pKTsKKworICAgIC8qIEtub3dpbmcgdGhlIGhhc2gsIHdlIGNhbiBmaW5kIHRoZSBidWNrZXQKKyAgICAgKi8KKyAgICBidWNrZXQgID0gdGFibGUtPmJ1Y2tldHMgKyBoYXNoOworCisgICAgLyogTm93LCB3ZSB0cmF2ZXJzZSB0aGUgZW50cmllcyBpbiB0aGUgYnVja2V0IHVudGlsCisgICAgICogd2UgZmluZCB0aGUga2V5IG9yIHRoZSBlbmQgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGJ1Y2tldC4gCisgICAgICogV2UgdHJhY2sgdGhlIGVsZW1lbnQgcHJpb3IgdG8gdGhlIG9uZSB3ZSBhcmUgZXhhbWluaW5nCisgICAgICogYXMgd2UgbmVlZCB0byBzZXQgaXRzIG5leHQgcG9pbnRlciB0byB0aGUgbmV4dCBwb2ludGVyCisgICAgICogb2YgdGhlIGVudHJ5IHdlIGFyZSBkZWxldGluZyAoaWYgd2UgZmluZCBpdCkuCisgICAgICovCisgICAgZW50cnkJICAgID0gICBidWNrZXQtPmVudHJpZXM7ICAgIC8qIEVudHJ5IHRvIGV4YW1pbmUJCQkJCSAgICAqLworICAgIG5leHRQb2ludGVyCSAgICA9ICYgYnVja2V0LT5lbnRyaWVzOyAgICAvKiBXaGVyZSB0byBwdXQgdGhlIG5leHQgcG9pbnRlciBvZiB0aGUgZGVsZXRlZCBlbnRyeSAgICovCisKKyAgICB3aGlsZSAgIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKwkvKiBTZWUgaWYgdGhpcyBpcyB0aGUgZW50cnkgd2Ugd2lzaCB0byBkZWxldGUKKwkgKi8KKwlpZiAgKGVudHJ5LT5rZXliYXNlLmtleS5pS2V5ID09IGtleSkKKwl7CisJICAgIC8qIEl0IHdhcyB0aGUgY29ycmVjdCBlbnRyeSwgc28gd2Ugc2V0IHRoZSBuZXh0IHBvaW50ZXIKKwkgICAgICogb2YgdGhlIHByZXZpb3VzIGVudHJ5IHRvIHRoZSBuZXh0IHBvaW50ZXIgb2YgdGhpcworCSAgICAgKiBsb2NhdGVkIG9uZSwgd2hpY2ggdGFrZXMgaXQgb3V0IG9mIHRoZSBjaGFpbi4KKwkgICAgICovCisJICAgICgqbmV4dFBvaW50ZXIpCQk9IGVudHJ5LT5uZXh0RW50cnk7CisKKwkgICAgdGFibGUtPmNvdW50LS07CisKKwkgICAgcmV0dXJuIGVudHJ5OworCX0KKwllbHNlCisJeworCSAgICAvKiBXZSBmb3VuZCBhbiBlbnRyeSBidXQgaXQgd2Fzbid0IHRoZSBvbmUgdGhhdCB3YXMgd2FudGVkLCBzbworCSAgICAgKiBtb3ZlIHRvIHRoZSBuZXh0IG9uZSwgaWYgYW55LgorCSAgICAgKi8KKwkgICAgbmV4dFBvaW50ZXIJPSAmIChlbnRyeS0+bmV4dEVudHJ5KTsJICAgIC8qIEFkZHJlc3Mgb2YgdGhlIG5leHQgcG9pbnRlciBpbiB0aGUgY3VycmVudCBlbnRyeQkgICAgKi8KKwkgICAgZW50cnkJPSBlbnRyeS0+bmV4dEVudHJ5OwkgICAgLyogQWRkcmVzcyBvZiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBidWNrZXQgKGlmIGFueSkgICAqLworCX0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsgIC8qIE5vdCBmb3VuZCAqLworfQorCisvKiogUmVtb3ZlIHRoZSBlbGVtZW50IGluIHRoZSBoYXNoIHRhYmxlIGZvciBhIHBhcnRpY3VsYXIKKyAqICBrZXkgdmFsdWUsIGlmIGl0IGV4aXN0cyAtIG5vIGVycm9yIGlmIGl0IGRvZXMgbm90LgorICovCitzdGF0aWMgcEFOVExSM19IQVNIX0VOVFJZCithbnRscjNIYXNoUmVtb3ZlKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgdm9pZCAqIGtleSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyCSAgICBoYXNoOworICAgIHBBTlRMUjNfSEFTSF9CVUNLRVQJICAgIGJ1Y2tldDsKKyAgICBwQU5UTFIzX0hBU0hfRU5UUlkJICAgIGVudHJ5OworICAgIHBBTlRMUjNfSEFTSF9FTlRSWQkgICAgKiBuZXh0UG9pbnRlcjsKKworICAgIC8qIEZpcnN0IHdlIG5lZWQgdG8ga25vdyB0aGUgaGFzaCBvZiB0aGUgcHJvdmlkZWQga2V5CisgICAgICovCisgICAgaGFzaCAgICA9IGFudGxyM0hhc2goa2V5LCAoQU5UTFIzX1VJTlQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilrZXkpKTsKKworICAgIC8qIEtub3dpbmcgdGhlIGhhc2gsIHdlIGNhbiBmaW5kIHRoZSBidWNrZXQKKyAgICAgKi8KKyAgICBidWNrZXQgID0gdGFibGUtPmJ1Y2tldHMgKyAoaGFzaCAlIHRhYmxlLT5tb2R1bG8pOworCisgICAgLyogTm93LCB3ZSB0cmF2ZXJzZSB0aGUgZW50cmllcyBpbiB0aGUgYnVja2V0IHVudGlsCisgICAgICogd2UgZmluZCB0aGUga2V5IG9yIHRoZSBlbmQgb2YgdGhlIGVudGlyZXMgaW4gdGhlIGJ1Y2tldC4gCisgICAgICogV2UgdHJhY2sgdGhlIGVsZW1lbnQgcHJpb3IgdG8gdGhlIG9uZSB3ZSBhcmUgZXhtYWluaW5nCisgICAgICogYXMgd2UgbmVlZCB0byBzZXQgaXRzIG5leHQgcG9pbnRlciB0byB0aGUgbmV4dCBwb2ludGVyCisgICAgICogb2YgdGhlIGVudHJ5IHdlIGFyZSBkZWxldGluZyAoaWYgd2UgZmluZCBpdCkuCisgICAgICovCisgICAgZW50cnkJICAgID0gICBidWNrZXQtPmVudHJpZXM7ICAgIC8qIEVudHJ5IHRvIGV4YW1pbmUJCQkJCSAgICAqLworICAgIG5leHRQb2ludGVyCSAgICA9ICYgYnVja2V0LT5lbnRyaWVzOyAgICAvKiBXaGVyZSB0byBwdXQgdGhlIG5leHQgcG9pbnRlciBvZiB0aGUgZGVsZXRlZCBlbnRyeSAgICovCisKKyAgICB3aGlsZSAgIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKwkvKiBTZWUgaWYgdGhpcyBpcyB0aGUgZW50cnkgd2Ugd2lzaCB0byBkZWxldGUKKwkgKi8KKwlpZiAgKHN0cmNtcCgoY29uc3QgY2hhciAqKWtleSwgKGNvbnN0IGNoYXIgKillbnRyeS0+a2V5YmFzZS5rZXkuc0tleSkgPT0gMCkKKwl7CisJICAgIC8qIEl0IHdhcyB0aGUgY29ycmVjdCBlbnRyeSwgc28gd2Ugc2V0IHRoZSBuZXh0IHBvaW50ZXIKKwkgICAgICogb2YgdGhlIHByZXZpb3VzIGVudHJ5IHRvIHRoZSBuZXh0IHBvaW50ZXIgb2YgdGhpcworCSAgICAgKiBsb2NhdGVkIG9uZSwgd2hpY2ggdGFrZXMgaXQgb3V0IG9mIHRoZSBjaGFpbi4KKwkgICAgICovCisJICAgICgqbmV4dFBvaW50ZXIpCQk9IGVudHJ5LT5uZXh0RW50cnk7CisKKwkgICAgLyogUmVsZWFzZSB0aGUga2V5IC0gaWYgd2UgYWxsb2NhdGVkIHRoYXQKKwkgICAgICovCisgICAgICAgIGlmICh0YWJsZS0+ZG9TdHJkdXAgPT0gQU5UTFIzX1RSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFOVExSM19GUkVFKGVudHJ5LT5rZXliYXNlLmtleS5zS2V5KTsKKyAgICAgICAgfQorCSAgICBlbnRyeS0+a2V5YmFzZS5rZXkuc0tleQk9IE5VTEw7CisKKwkgICAgdGFibGUtPmNvdW50LS07CisKKwkgICAgcmV0dXJuIGVudHJ5OworCX0KKwllbHNlCisJeworCSAgICAvKiBXZSBmb3VuZCBhbiBlbnRyeSBidXQgaXQgd2Fzbid0IHRoZSBvbmUgdGhhdCB3YXMgd2FudGVkLCBzbworCSAgICAgKiBtb3ZlIHRvIHRoZSBuZXh0IG9uZSwgaWYgYW55LgorCSAgICAgKi8KKwkgICAgbmV4dFBvaW50ZXIJPSAmIChlbnRyeS0+bmV4dEVudHJ5KTsJICAgIC8qIEFkZHJlc3Mgb2YgdGhlIG5leHQgcG9pbnRlciBpbiB0aGUgY3VycmVudCBlbnRyeQkgICAgKi8KKwkgICAgZW50cnkJPSBlbnRyeS0+bmV4dEVudHJ5OwkgICAgLyogQWRkcmVzcyBvZiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBidWNrZXQgKGlmIGFueSkgICAqLworCX0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsgIC8qIE5vdCBmb3VuZCAqLworfQorCisvKiogVGFrZXMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc3VwcGxpZWQga2V5IG91dCBvZiB0aGUgbGlzdCwgYW5kIGRlbGV0ZXMgdGhlIGRhdGEKKyAqICBjYWxsaW5nIHRoZSBzdXBwbGllZCBmcmVlKCkgcm91dGluZSBpZiBhbnkuIAorICovCitzdGF0aWMgdm9pZAorYW50bHIzSGFzaERlbGV0ZUkgICAgKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisgICAgcEFOVExSM19IQVNIX0VOVFJZCWVudHJ5OworCisgICAgZW50cnkgPSBhbnRscjNIYXNoUmVtb3ZlSSh0YWJsZSwga2V5KTsKKwkKKyAgICAvKiBOb3cgd2UgY2FuIGZyZWUgdGhlIGVsZW1lbnRzIGFuZCB0aGUgZW50cnkgaW4gb3JkZXIKKyAgICAgKi8KKyAgICBpZgkoZW50cnkgIT0gTlVMTCAmJiBlbnRyeS0+ZnJlZSAhPSBOVUxMKQorICAgIHsKKwkvKiBDYWxsIHByb2dyYW1tZXIgc3VwcGxpZWQgZnVuY3Rpb24gdG8gcmVsZWFzZSB0aGlzIGVudHJ5IGRhdGEKKwkgKi8KKwllbnRyeS0+ZnJlZShlbnRyeS0+ZGF0YSk7CisJZW50cnktPmRhdGEgPSBOVUxMOworICAgIH0KKyAgICAvKiBGaW5hbGx5IHJlbGVhc2UgdGhlIHNwYWNlIGZvciB0aGlzIGVudHJ5IGJsb2NrLgorICAgICAqLworICAgIEFOVExSM19GUkVFKGVudHJ5KTsKK30KKworLyoqIFRha2VzIHRoZSBlbGVtZW50IHdpdGggdGhlIHN1cHBsaWVkIGtleSBvdXQgb2YgdGhlIGxpc3QsIGFuZCBkZWxldGVzIHRoZSBkYXRhCisgKiAgY2FsbGluZyB0aGUgc3VwcGxpZWQgZnJlZSgpIHJvdXRpbmUgaWYgYW55LiAKKyAqLworc3RhdGljIHZvaWQKK2FudGxyM0hhc2hEZWxldGUgICAgKHBBTlRMUjNfSEFTSF9UQUJMRSB0YWJsZSwgdm9pZCAqIGtleSkKK3sKKyAgICBwQU5UTFIzX0hBU0hfRU5UUlkJZW50cnk7CisKKyAgICBlbnRyeSA9IGFudGxyM0hhc2hSZW1vdmUodGFibGUsIGtleSk7CisJCisgICAgLyogTm93IHdlIGNhbiBmcmVlIHRoZSBlbGVtZW50cyBhbmQgdGhlIGVudHJ5IGluIG9yZGVyCisgICAgICovCisgICAgaWYJKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPmZyZWUgIT0gTlVMTCkKKyAgICB7CisJLyogQ2FsbCBwcm9ncmFtbWVyIHN1cHBsaWVkIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhpcyBlbnRyeSBkYXRhCisJICovCisJZW50cnktPmZyZWUoZW50cnktPmRhdGEpOworCWVudHJ5LT5kYXRhID0gTlVMTDsKKyAgICB9CisgICAgLyogRmluYWxseSByZWxlYXNlIHRoZSBzcGFjZSBmb3IgdGhpcyBlbnRyeSBibG9jay4KKyAgICAgKi8KKyAgICBBTlRMUjNfRlJFRShlbnRyeSk7Cit9CisKKy8qKiBSZXR1cm4gdGhlIGVsZW1lbnQgcG9pbnRlciBpbiB0aGUgaGFzaCB0YWJsZSBmb3IgYSBwYXJ0aWN1bGFyCisgKiAga2V5IHZhbHVlLCBvciBOVUxMIGlmIGl0IGRvbid0IGV4aXN0IChvciB3YXMgaXRzZWxmIE5VTEwpLgorICovCitzdGF0aWMgdm9pZCAqCithbnRscjNIYXNoR2V0SShwQU5UTFIzX0hBU0hfVEFCTEUgdGFibGUsIEFOVExSM19JTlRLRVkga2V5KQoreworICAgIEFOVExSM19VSU5UMzIJICAgIGhhc2g7CisgICAgcEFOVExSM19IQVNIX0JVQ0tFVAkgICAgYnVja2V0OworICAgIHBBTlRMUjNfSEFTSF9FTlRSWQkgICAgZW50cnk7CisKKyAgICAvKiBGaXJzdCB3ZSBuZWVkIHRvIGtub3cgdGhlIGhhc2ggb2YgdGhlIHByb3ZpZGVkIGtleQorICAgICAqLworICAgIGhhc2ggICAgPSAoQU5UTFIzX1VJTlQzMikoa2V5ICUgKEFOVExSM19JTlRLRVkpKHRhYmxlLT5tb2R1bG8pKTsKKworICAgIC8qIEtub3dpbmcgdGhlIGhhc2gsIHdlIGNhbiBmaW5kIHRoZSBidWNrZXQKKyAgICAgKi8KKyAgICBidWNrZXQgID0gdGFibGUtPmJ1Y2tldHMgKyBoYXNoOworCisgICAgLyogTm93IHdlIGNhbiBpbnNwZWN0IHRoZSBrZXkgYXQgZWFjaCBlbnRyeSBpbiB0aGUgYnVja2V0CisgICAgICogYW5kIHNlZSBpZiB3ZSBoYXZlIGEgbWF0Y2guCisgICAgICovCisgICAgZW50cnkgICA9IGJ1Y2tldC0+ZW50cmllczsKKworICAgIHdoaWxlICAgKGVudHJ5ICE9IE5VTEwpCisgICAgeworCWlmICAoZW50cnktPmtleWJhc2Uua2V5LmlLZXkgPT0ga2V5KQorCXsKKwkgICAgLyogTWF0Y2ggd2FzIGZvdW5kLCByZXR1cm4gdGhlIGRhdGEgcG9pbnRlciBmb3IgdGhpcyBlbnRyeQorCSAgICAgKi8KKwkgICAgcmV0dXJuICBlbnRyeS0+ZGF0YTsKKwl9CisJZW50cnkgPSBlbnRyeS0+bmV4dEVudHJ5OworICAgIH0KKworICAgIC8qIElmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGRpZCBub3QgZmluZCB0aGUga2V5CisgICAgICovCisgICAgcmV0dXJuICBOVUxMOworfQorCisvKiogUmV0dXJuIHRoZSBlbGVtZW50IHBvaW50ZXIgaW4gdGhlIGhhc2ggdGFibGUgZm9yIGEgcGFydGljdWxhcgorICogIGtleSB2YWx1ZSwgb3IgTlVMTCBpZiBpdCBkb24ndCBleGlzdCAob3Igd2FzIGl0c2VsZiBOVUxMKS4KKyAqLworc3RhdGljIHZvaWQgKgorYW50bHIzSGFzaEdldChwQU5UTFIzX0hBU0hfVEFCTEUgdGFibGUsIHZvaWQgKiBrZXkpCit7CisgICAgQU5UTFIzX1VJTlQzMgkgICAgaGFzaDsKKyAgICBwQU5UTFIzX0hBU0hfQlVDS0VUCSAgICBidWNrZXQ7CisgICAgcEFOVExSM19IQVNIX0VOVFJZCSAgICBlbnRyeTsKKworCisgICAgLyogRmlyc3Qgd2UgbmVlZCB0byBrbm93IHRoZSBoYXNoIG9mIHRoZSBwcm92aWRlZCBrZXkKKyAgICAgKi8KKyAgICBoYXNoICAgID0gYW50bHIzSGFzaChrZXksIChBTlRMUjNfVUlOVDMyKXN0cmxlbigoY29uc3QgY2hhciAqKWtleSkpOworCisgICAgLyogS25vd2luZyB0aGUgaGFzaCwgd2UgY2FuIGZpbmQgdGhlIGJ1Y2tldAorICAgICAqLworICAgIGJ1Y2tldCAgPSB0YWJsZS0+YnVja2V0cyArIChoYXNoICUgdGFibGUtPm1vZHVsbyk7CisKKyAgICAvKiBOb3cgd2UgY2FuIGluc3BlY3QgdGhlIGtleSBhdCBlYWNoIGVudHJ5IGluIHRoZSBidWNrZXQKKyAgICAgKiBhbmQgc2VlIGlmIHdlIGhhdmUgYSBtYXRjaC4KKyAgICAgKi8KKyAgICBlbnRyeSAgID0gYnVja2V0LT5lbnRyaWVzOworCisgICAgd2hpbGUgICAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisJaWYgIChzdHJjbXAoKGNvbnN0IGNoYXIgKilrZXksIChjb25zdCBjaGFyICopZW50cnktPmtleWJhc2Uua2V5LnNLZXkpID09IDApCisJeworCSAgICAvKiBNYXRjaCB3YXMgZm91bmQsIHJldHVybiB0aGUgZGF0YSBwb2ludGVyIGZvciB0aGlzIGVudHJ5CisJICAgICAqLworCSAgICByZXR1cm4gIGVudHJ5LT5kYXRhOworCX0KKwllbnRyeSA9IGVudHJ5LT5uZXh0RW50cnk7CisgICAgfQorCisgICAgLyogSWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgZGlkIG5vdCBmaW5kIHRoZSBrZXkKKyAgICAgKi8KKyAgICByZXR1cm4gIE5VTEw7Cit9CisKKy8qKiBBZGQgdGhlIGVsZW1lbnQgcG9pbnRlciBpbiB0byB0aGUgdGFibGUsIGJhc2VkIHVwb24gdGhlIAorICogIGhhc2ggb2YgdGhlIHByb3ZpZGVkIGtleS4KKyAqLworc3RhdGljCUFOVExSM19JTlQzMgorYW50bHIzSGFzaFB1dEkocEFOVExSM19IQVNIX1RBQkxFIHRhYmxlLCBBTlRMUjNfSU5US0VZIGtleSwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSkKK3sKKwlBTlRMUjNfVUlOVDMyCSAgICBoYXNoOworCXBBTlRMUjNfSEFTSF9CVUNLRVQJICAgIGJ1Y2tldDsKKwlwQU5UTFIzX0hBU0hfRU5UUlkJICAgIGVudHJ5OworCXBBTlRMUjNfSEFTSF9FTlRSWQkgICAgKiBuZXdQb2ludGVyOworCisJLyogRmlyc3Qgd2UgbmVlZCB0byBrbm93IHRoZSBoYXNoIG9mIHRoZSBwcm92aWRlZCBrZXkKKwkqLworCWhhc2ggICAgPSAoQU5UTFIzX1VJTlQzMikoa2V5ICUgKEFOVExSM19JTlRLRVkpKHRhYmxlLT5tb2R1bG8pKTsKKworCS8qIEtub3dpbmcgdGhlIGhhc2gsIHdlIGNhbiBmaW5kIHRoZSBidWNrZXQKKwkqLworCWJ1Y2tldCAgPSB0YWJsZS0+YnVja2V0cyArIGhhc2g7CisKKwkvKiBLbm93aW5nIHRoZSBidWNrZXQsIHdlIGNhbiB0cmF2ZXJzZSB0aGUgZW50cmllcyB1bnRpbCB3ZQorCSogd2UgZmluZCBhIE5VTEwgcG9pbnRlciBvciB3ZSBmaW5kIHRoYXQgdGhpcyBpcyBhbHJlYWR5IAorCSogaW4gdGhlIHRhYmxlIGFuZCBkdXBsaWNhdGVzIHdlcmUgbm90IGFsbG93ZWQuCisJKi8KKwluZXdQb2ludGVyCT0gJmJ1Y2tldC0+ZW50cmllczsKKworCXdoaWxlICAgKCpuZXdQb2ludGVyICE9ICBOVUxMKQorCXsKKwkJLyogVGhlIHZhbHVlIGF0IG5ldyBwb2ludGVyIGlzIHBvaW50aW5nIHRvIGFuIGV4aXN0aW5nIGVudHJ5LgorCQkqIElmIGR1cGxpY2F0ZXMgYXJlIGFsbG93ZWQgdGhlbiB3ZSBkb24ndCBjYXJlIHdoYXQgaXQgaXMsIGJ1dAorCQkqIG11c3QgcmVqZWN0IHRoaXMgYWRkIGlmIHRoZSBrZXkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3ZSBhcmUKKwkJKiBzdXBwbGllZCB3aXRoLgorCQkqLworCQlpZiAgKHRhYmxlLT5hbGxvd0R1cHMgPT0gQU5UTFIzX0ZBTFNFKQorCQl7CisJCQlpZgkoKCpuZXdQb2ludGVyKS0+a2V5YmFzZS5rZXkuaUtleSA9PSBrZXkpCisJCQl7CisJCQkJcmV0dXJuCUFOVExSM19FUlJfSEFTSERVUDsKKwkJCX0KKwkJfQorCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IGVudHJ5IHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgZW50cnkgd2UKKwkJKiBhcmUgdHJhdmVyc2luZywgaWYgaXQgaXMgTlVMTCB3ZSB3aWxsIGNyZWF0ZSBvdXIgbmV3CisJCSogc3RydWN0dXJlIGFuZCBwb2ludCB0aGlzIHRvIGl0LgorCQkqLworCQluZXdQb2ludGVyID0gJigoKm5ld1BvaW50ZXIpLT5uZXh0RW50cnkpOworCX0KKworCS8qIG5ld1BvaW50ZXIgaXMgbm93IHBvaW50aW5nIGF0IHRoZSBwb2ludGVyIHdoZXJlIHdlIG5lZWQgdG8KKwkqIGFkZCBvdXIgbmV3IGVudHJ5LCBzbyBsZXQncyBjcmF0ZSB0aGUgZW50cnkgYW5kIGFkZCBpdCBpbi4KKwkqLworCWVudHJ5ICAgPSAocEFOVExSM19IQVNIX0VOVFJZKUFOVExSM19NQUxMT0MoKHNpemVfdClzaXplb2YoQU5UTFIzX0hBU0hfRU5UUlkpKTsKKworCWlmCShlbnRyeSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCUFOVExSM19FUlJfTk9NRU07CisJfQorCisJZW50cnktPmRhdGEJCQk9IGVsZW1lbnQ7CQkvKiBJbnN0YWxsIHRoZSBkYXRhIGVsZW1lbnQgc3VwcGxpZWQJCQkqLworCWVudHJ5LT5mcmVlCQkJPSBmcmVlcHRyOwkJLyogRnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGUgZW50cnkJCSovCisJZW50cnktPmtleWJhc2UudHlwZQkJPSBBTlRMUjNfSEFTSF9UWVBFX0lOVDsJLyogSW5kaWNhdGUgdGhlIGtleSB0eXBlIHN0b3JlZCBoZXJlIGZvciB3aGVuIHdlIGZyZWUJKi8KKwllbnRyeS0+a2V5YmFzZS5rZXkuaUtleQk9IGtleTsJCQkvKiBSZWNvcmQgdGhlIGtleSB2YWx1ZQkJCQkJKi8KKwllbnRyeS0+bmV4dEVudHJ5CQk9IE5VTEw7CQkJLyogRW5zdXJlIHRoYXQgdGhlIGZvcndhcmQgcG9pbnRlciBlbmRzIHRoZSBjaGFpbgkqLworCisJKm5ld1BvaW50ZXIJPSBlbnRyeTsgICAgLyogSW5zdGFsbCB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIGJ1Y2tldAkqLworCisJdGFibGUtPmNvdW50Kys7CisKKwlyZXR1cm4gIEFOVExSM19TVUNDRVNTOworfQorCisKKy8qKiBBZGQgdGhlIGVsZW1lbnQgcG9pbnRlciBpbiB0byB0aGUgdGFibGUsIGJhc2VkIHVwb24gdGhlIAorICogIGhhc2ggb2YgdGhlIHByb3ZpZGVkIGtleS4KKyAqLworc3RhdGljCUFOVExSM19JTlQzMgorYW50bHIzSGFzaFB1dChwQU5UTFIzX0hBU0hfVEFCTEUgdGFibGUsIHZvaWQgKiBrZXksIHZvaWQgKiBlbGVtZW50LCB2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVwdHIpKHZvaWQgKikpCit7CisJQU5UTFIzX1VJTlQzMgkgICAgaGFzaDsKKwlwQU5UTFIzX0hBU0hfQlVDS0VUCSAgICBidWNrZXQ7CisJcEFOVExSM19IQVNIX0VOVFJZCSAgICBlbnRyeTsKKwlwQU5UTFIzX0hBU0hfRU5UUlkJICAgICogbmV3UG9pbnRlcjsKKworCS8qIEZpcnN0IHdlIG5lZWQgdG8ga25vdyB0aGUgaGFzaCBvZiB0aGUgcHJvdmlkZWQga2V5CisJKi8KKwloYXNoICAgID0gYW50bHIzSGFzaChrZXksIChBTlRMUjNfVUlOVDMyKXN0cmxlbigoY29uc3QgY2hhciAqKWtleSkpOworCisJLyogS25vd2luZyB0aGUgaGFzaCwgd2UgY2FuIGZpbmQgdGhlIGJ1Y2tldAorCSovCisJYnVja2V0ICA9IHRhYmxlLT5idWNrZXRzICsgKGhhc2ggJSB0YWJsZS0+bW9kdWxvKTsKKworCS8qIEtub3dpZ24gdGhlIGJ1Y2tldCwgd2UgY2FuIHRyYXZlcnNlIHRoZSBlbnRyaWVzIHVudGlsIHdlCisJKiB3ZSBmaW5kIGEgTlVMTCBwb2ludGVyIG9mciB3ZSBmaW5kIHRoYXQgdGhpcyBpcyBhbHJlYWR5IAorCSogaW4gdGhlIHRhYmxlIGFuZCBkdXBsaWNhdGVzIHdlcmUgbm90IGFsbG93ZWQuCisJKi8KKwluZXdQb2ludGVyCT0gJmJ1Y2tldC0+ZW50cmllczsKKworCXdoaWxlICAgKCpuZXdQb2ludGVyICE9ICBOVUxMKQorCXsKKwkJLyogVGhlIHZhbHVlIGF0IG5ldyBwb2ludGVyIGlzIHBvaW50aW5nIHRvIGFuIGV4aXN0aW5nIGVudHJ5LgorCQkqIElmIGR1cGxpY2F0ZXMgYXJlIGFsbG93ZWQgdGhlbiB3ZSBkb24ndCBjYXJlIHdoYXQgaXQgaXMsIGJ1dAorCQkqIG11c3QgcmVqZWN0IHRoaXMgYWRkIGlmIHRoZSBrZXkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB3ZSBhcmUKKwkJKiBzdXBwbGllZCB3aXRoLgorCQkqLworCQlpZiAgKHRhYmxlLT5hbGxvd0R1cHMgPT0gQU5UTFIzX0ZBTFNFKQorCQl7CisJCQlpZgkoc3RyY21wKChjb25zdCBjaGFyKikga2V5LCAoY29uc3QgY2hhciAqKSgqbmV3UG9pbnRlciktPmtleWJhc2Uua2V5LnNLZXkpID09IDApCisJCQl7CisJCQkJcmV0dXJuCUFOVExSM19FUlJfSEFTSERVUDsKKwkJCX0KKwkJfQorCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IGVudHJ5IHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgZW50cnkgd2UKKwkJKiBhcmUgdHJhdmVyc2luZywgaWYgaXQgaXMgTlVMTCB3ZSB3aWxsIGNyZWF0ZSBvdXIgbmV3CisJCSogc3RydWN0dXJlIGFuZCBwb2ludCB0aGlzIHRvIGl0LgorCQkqLworCQluZXdQb2ludGVyID0gJigoKm5ld1BvaW50ZXIpLT5uZXh0RW50cnkpOworCX0KKworCS8qIG5ld1BvaW50ZXIgaXMgbm93IHBvaXRpbmcgYXQgdGhlIHBvaW50ZXIgd2hlcmUgd2UgbmVlZCB0bworCSogYWRkIG91ciBuZXcgZW50cnksIHNvIGxldCdzIGNyYXRlIHRoZSBlbnRyeSBhbmQgYWRkIGl0IGluLgorCSovCisJZW50cnkgICA9IChwQU5UTFIzX0hBU0hfRU5UUlkpQU5UTFIzX01BTExPQygoc2l6ZV90KXNpemVvZihBTlRMUjNfSEFTSF9FTlRSWSkpOworCisJaWYJKGVudHJ5ID09IE5VTEwpCisJeworCQlyZXR1cm4JQU5UTFIzX0VSUl9OT01FTTsKKwl9CisKKwllbnRyeS0+ZGF0YQkJCT0gZWxlbWVudDsJCQkJCS8qIEluc3RhbGwgdGhlIGRhdGEgZWxlbWVudCBzdXBwbGllZAkJCQkqLworCWVudHJ5LT5mcmVlCQkJPSBmcmVlcHRyOwkJCQkJLyogRnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGUgZW50cnkJICAgICovCisJZW50cnktPmtleWJhc2UudHlwZQk9IEFOVExSM19IQVNIX1RZUEVfU1RSOyAgICAgLyogSW5kaWNhdGUgdGhlIGtleSB0eXBlIHN0b3JlZCBoZXJlIGZvciBmcmVlKCkJICAgICovCisgICAgaWYgICh0YWJsZS0+ZG9TdHJkdXAgPT0gQU5UTFIzX1RSVUUpCisgICAgeworICAgICAgICBlbnRyeS0+a2V5YmFzZS5rZXkuc0tleQk9IEFOVExSM19TVFJEVVAoa2V5KTsJLyogUmVjb3JkIHRoZSBrZXkgdmFsdWUJCQkJCQkJCSovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVudHJ5LT5rZXliYXNlLmtleS5zS2V5CT0ga2V5OyAgICAgICAgICAgICAgICAgIC8qIFJlY29yZCB0aGUga2V5IHZhbHVlCQkJCQkJCQkqLworICAgIH0KKwllbnRyeS0+bmV4dEVudHJ5CQk9IE5VTEw7CQkJCQkvKiBFbnN1cmUgdGhhdCB0aGUgZm9yd2FyZCBwb2ludGVyIGVuZHMgdGhlIGNoYWluICAgKi8KKworCSpuZXdQb2ludGVyCT0gZW50cnk7ICAgIC8qIEluc3RhbGwgdGhlIG5leHQgZW50cnkgaW4gdGhpcyBidWNrZXQJKi8KKworCXRhYmxlLT5jb3VudCsrOworCisJcmV0dXJuICBBTlRMUjNfU1VDQ0VTUzsKK30KKworLyoqIFxicmllZiBDcmVhdGVzIGFuIGVudW1lcmF0aW9uIHN0cnVjdHVyZSB0byB0cmF2ZXJzZSB0aGUgaGFzaCB0YWJsZS4KKyAqCisgKiBccGFyYW0gdGFibGUgVGFibGUgdG8gZW51bWVyYXRlCisgKiBccmV0dXJuIFBvaW50ZXIgdG8gZW51bWVyYXRpb24gc3RydWN0dXJlLgorICovCitwQU5UTFIzX0hBU0hfRU5VTQorYW50bHIzRW51bU5ldwkocEFOVExSM19IQVNIX1RBQkxFIHRhYmxlKQoreworICAgIHBBTlRMUjNfSEFTSF9FTlVNCWVuOworCisgICAgLyogQWxsb2NhdGUgc3RydWN0dXJlIG1lbW9yeQorICAgICAqLworICAgIGVuICAgID0gKHBBTlRMUjNfSEFTSF9FTlVNKSBBTlRMUjNfTUFMTE9DKChzaXplX3Qpc2l6ZW9mKEFOVExSM19IQVNIX0VOVU0pKTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIGFsbG9jYXRpb24gd2FzIGdvb2QgCisgICAgICovCisgICAgaWYJKGVuID09IE5VTEwpCisgICAgeworCXJldHVybgkocEFOVExSM19IQVNIX0VOVU0pIEFOVExSM19GVU5DX1BUUihBTlRMUjNfRVJSX05PTUVNKTsKKyAgICB9CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhcnQgcG9pbnRlcnMKKyAgICAqLworICAgIGVuLT50YWJsZQk9IHRhYmxlOworICAgIGVuLT5idWNrZXQJPSAwOwkJCQkvKiBGaXJzdCBidWNrZXQJCSAgICAqLworICAgIGVuLT5lbnRyeQk9IGVuLT50YWJsZS0+YnVja2V0cy0+ZW50cmllczsJLyogRmlyc3QgZW50cnkgdG8gcmV0dXJuICAgICovCisKKyAgICAvKiBTcGVjaWFsIGNhc2UgaW4gdGhhdCB0aGUgZmlyc3QgYnVja2V0IG1heSBub3QgaGF2ZSBhbnl0aGluZyBpbiBpdAorICAgICAqIGJ1dCB0aGUgYW50bHIzRW51bU5leHQoKSBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIGVuLT5lbnRyeSBpcworICAgICAqIHNldCB0byB0aGUgbmV4dCB2YWxpZCBwb2ludGVyLiBIZW5jZSBpZiBpdCBpcyBub3QgYSB2YWxpZCBlbGVtZW50CisgICAgICogcG9pbnRlciwgYXR0ZW1wdCB0byBmaW5kIHRoZSBuZXh0IG9uZSB0aGF0IGlzLCAodGFibGUgbWF5IGJlIGVtcHR5CisgICAgICogb2YgY291cnNlLgorICAgICAqLworICAgIGlmCShlbi0+ZW50cnkgPT0gTlVMTCkKKyAgICB7CisJYW50bHIzRW51bU5leHRFbnRyeShlbik7CisgICAgfQorCisgICAgLyogSW5zdGFsbCB0aGUgaW50ZXJmYWNlCisgICAgICovCisgICAgZW4tPmZyZWUJPSAgYW50bHIzRW51bUZyZWU7CisgICAgZW4tPm5leHQJPSAgYW50bHIzRW51bU5leHQ7CisKKyAgICAvKiBBbGwgaXMgZ29vZAorICAgICAqLworICAgIHJldHVybiAgZW47Cit9CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBoYXNodGFibGUgYmVpbmcgdHJhdmVyc2VkIGJ5IHRoZSBzdXBwbGllZAorICogICAgICAgICBlbnVtZXJhdGlvbi4KKyAqCisgKiBccGFyYW1baW5dIGVuIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRyYWNraW5nIHN0cnVjdHVyZQorICogXHBhcmFtIGtleQkgUG9pbnRlciB0byB2b2lkIHBvaW50ZXIsIHdoZXJlIHRoZSBrZXkgcG9pbnRlciBpcyByZXR1cm5lZC4KKyAqIFxwYXJhbSBkYXRhCSBQb2ludGVyIHRvIHZvaWQgcG9pbnRlciB3aGVyZSB0aGUgZGF0YSBwb2ludGVyIGlzIHJldHVybmVkLgorICogXHJldHVybiAKKyAqCS0gQU5UTFIzX1NVQ0NFU1MgaWYgdGhlcmUgd2FzIGEgbmV4dCBrZXkKKyAqCS0gQU5UTFIzX0ZBSUwJIGlmIHRoZXJlIHdlcmUgbm8gbW9yZSBrZXlzCisgKgorICogXHJlbWFyaworICogIE5vIGNoZWNraW5nIG9mIGlucHV0IHN0cnVjdHVyZSBpcyBwZXJmb3JtZWQhCisgKi8KK3N0YXRpYyBpbnQKK2FudGxyM0VudW1OZXh0CShwQU5UTFIzX0hBU0hfRU5VTSBlbiwgcEFOVExSM19IQVNIX0tFWSAqIGtleSwgdm9pZCAqKiBkYXRhKQoreworICAgIC8qIElmIHRoZSBjdXJyZW50IGVudHJ5IGlzIHZhbGlkLCB0aGVuIHVzZSBpdAorICAgICAqLworICAgIGlmICAoZW4tPmJ1Y2tldCA+PSBlbi0+dGFibGUtPm1vZHVsbykKKyAgICB7CisgICAgICAgIC8qIEFscmVhZHkgZXhoYXVzdGVkIHRoZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuCUFOVExSM19GQUlMOworICAgIH0KKworICAgIC8qIFBvaW50ZXJzIGFyZSBhbHJlYWR5IHNldCB0byB0aGUgY3VycmVudCBlbnRyeSB0byByZXR1cm4sIG9yCisgICAgICogd2Ugd291bGQgbm90IGJlIGF0IHRoaXMgcG9pbnQgaW4gdGhlIGxvZ2ljIGZsb3cuCisgICAgICovCisgICAgKmtleQk9ICYoZW4tPmVudHJ5LT5rZXliYXNlKTsKKyAgICAqZGF0YQk9IGVuLT5lbnRyeS0+ZGF0YTsKKworICAgIC8qIFJldHVybiBwb2ludGVycyBhcmUgc2V0IHVwLCBzbyBub3cgd2UgbW92ZSB0aGUgZWxlbWVudAorICAgICAqIHBvaW50ZXIgdG8gdGhlIG5leHQgaW4gdGhlIHRhYmxlIChpZiBhbnkpLgorICAgICAqLworICAgIGFudGxyM0VudW1OZXh0RW50cnkoZW4pOworCisgICAgcmV0dXJuCUFOVExSM19TVUNDRVNTOworfQorCisvKiogXGJyaWVmIExvY2FsIGZ1bmN0aW9uIHRvIGFkdmFuY2UgdGhlIGVudHJ5IHBvaW50ZXIgb2YgYW4gZW51bWVyYXRpb24gCisgKiBzdHJ1Y3R1cmUgdG8gdGhlIG5leHQgdmFsaWQgZW50cnkgKGlmIHRoZXJlIGlzIG9uZSkuCisgKgorICogXHBhcmFtW2luXSBlbnVtIFBvaW50ZXIgdG8gQU5UTFIzIGVudW1lcmF0aW9uIHN0cnVjdHVyZSByZXR1cm5lZCBieSBhbnRscjNFbnVtTmV3KCkKKyAqCisgKiBccmVtYXJrCisgKiAgIC0gVGhlIGZ1bmN0aW9uIGFsd2F5cyBsZWF2ZXMgdGhlIHBvaW50ZXJzIHBvaW50aW5nIGF0IGEgdmFsaWQgZW50cnkgaWYgdGhlcmUKKyAqICAgICBpcyBvbmUsIHNvIGlmIHRoZSBlbnRyeSBwb2ludGVyIGlzIE5VTEwgd2hlbiB0aGlzIGZ1bmN0aW9uIGV4aXRzLCB0aGVyZSB3ZXJlCisgKiAgICAgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQKK2FudGxyM0VudW1OZXh0RW50cnkocEFOVExSM19IQVNIX0VOVU0gZW4pCit7CisgICAgcEFOVExSM19IQVNIX0JVQ0tFVAlidWNrZXQ7CisKKyAgICAvKiBTZWUgaWYgdGhlIGN1cnJlbnQgZW50cnkgcG9pbnRlciBpcyB2YWxpZCBmaXJzdCBvZiBhbGwKKyAgICAgKi8KKyAgICBpZgkoZW4tPmVudHJ5ICE9IE5VTEwpCisgICAgeworCS8qIEN1cnJlbnQgZW50cnkgd2FzIGEgdmFsaWQgcG9pbnQsIHNlZSBpZiB0aGVyZSBpcyBhbm90aGVyCisJICogb25lIGluIHRoZSBjaGFpbi4KKwkgKi8KKwlpZiAgKGVuLT5lbnRyeS0+bmV4dEVudHJ5ICE9IE5VTEwpCisJeworCSAgICAvKiBOZXh0IGVudHJ5IGluIHRoZSBlbnVtZXJhdGlvbiBpcyBqdXN0IHRoZSBuZXh0IGVudHJ5CisJICAgICAqIGluIHRoZSBjaGFpbi4KKwkgICAgICovCisJICAgIGVuLT5lbnRyeSA9IGVuLT5lbnRyeS0+bmV4dEVudHJ5OworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIC8qIFRoZXJlIHdlcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBjdXJyZW50IGJ1Y2tldCwgaWYgdGhlcmUgYXJlCisgICAgICogbW9yZSBidWNrZXRzIHRoZW4gY2hhc2UgdGhlbSB1bnRpbCB3ZSBmaW5kIGFuIGVudHJ5LgorICAgICAqLworICAgIGVuLT5idWNrZXQrKzsKKworICAgIHdoaWxlICAgKGVuLT5idWNrZXQgPCBlbi0+dGFibGUtPm1vZHVsbykKKyAgICB7CisJLyogVGhlcmUgd2FzIG9uZSBtb3JlIGJ1Y2tldCwgc2VlIGlmIGl0IGhhcyBhbnkgZWxlbWVudHMgaW4gaXQKKwkgKi8KKwlidWNrZXQJPSBlbi0+dGFibGUtPmJ1Y2tldHMgKyBlbi0+YnVja2V0OworCisJaWYgIChidWNrZXQtPmVudHJpZXMgIT0gTlVMTCkKKwl7CisJICAgIC8qIFRoZXJlIHdhcyBhbiBlbnRyeSBpbiB0aGlzIGJ1Y2tldCwgc28gd2UgY2FuIHVzZSBpdAorCSAgICAgKiBmb3IgdGhlIG5leHQgZW50cnkgaW4gdGhlIGVudW1lcmF0aW9uLgorCSAgICAgKi8KKwkgICAgZW4tPmVudHJ5CT0gYnVja2V0LT5lbnRyaWVzOworCSAgICByZXR1cm47CisJfQorCisJLyogVGhlcmUgd2FzIG5vdGhpbmcgaW4gdGhlIGJ1Y2tldCB3ZSBqdXN0IGV4YW1pbmVkLCBtb3ZlIHRvIHRoZQorCSAqIG5leHQgb25lLgorCSAqLworCWVuLT5idWNrZXQrKzsKKyAgICB9CisKKyAgICAvKiBIZXJlIHdlIGhhdmUgZXhoYXVzdGVkIGFsbCBidWNrZXRzIGFuZCB0aGUgZW51bWVyYXRpb24gcG9pbnRlciB3aWxsIAorICAgICAqIGhhdmUgaXRzIGJ1Y2tldCBjb3VudCA9IHRhYmxlLT5tb2R1bG8gd2hpY2ggc2lnbmlmaWVzIHRoYXQgd2UgYXJlIGRvbmUuCisgICAgICovCit9CisKKy8qKiBcYnJpZWYgRnJlZXMgdXAgdGhlIG1lbW9yeSBzdHJ1Y3R1cmVzIHRoYXQgcmVwcmVzZW50IGEgaGFzaCB0YWJsZQorICogIGVudW1lcmF0aW9uLgorICogXHBhcmFtW2luXSBlbnVtIFBvaW50ZXIgdG8gQU5UTFIzIGVudW1lcmF0aW9uIHN0cnVjdHVyZSByZXR1cm5lZCBieSBhbnRscjNFbnVtTmV3KCkKKyAqLworc3RhdGljIHZvaWQKK2FudGxyM0VudW1GcmVlCShwQU5UTFIzX0hBU0hfRU5VTSBlbikKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGNoZWNrLCB3ZSBqdXN0IGZyZWUgaXQuCisgICAgICovCisgICAgQU5UTFIzX0ZSRUUoZW4pOworfQorCisvKiogR2l2ZW4gYW4gaW5wdXQga2V5IG9mIGFyYml0cmFyeSBsZW5ndGgsIHJldHVybiBhIGhhc2ggdmFsdWUgb2YKKyAqICBpdC4gVGhpcyBjYW4gdGhlbiBiZSB1c2VkICh3aXRoIHN1aXRhYmxlIG1vZHVsbykgdG8gaW5kZXggb3RoZXIKKyAqICBzdHJ1Y3R1cmVzLgorICovCitBTlRMUjNfQVBJIEFOVExSM19VSU5UMzIKK2FudGxyM0hhc2godm9pZCAqIGtleSwgQU5UTFIzX1VJTlQzMiBrZXlsZW4pCit7CisgICAgLyogQWNjdW11bGF0ZSB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUga2V5CisgICAgICovCisgICAgQU5UTFIzX1VJTlQzMiAgIGhhc2g7CisgICAgcEFOVExSM19VSU5UOCAgIGtleVB0cjsKKyAgICBBTlRMUjNfVUlOVDMyICAgaTE7CisKKyAgICBoYXNoICAgID0gMDsKKyAgICBrZXlQdHIgID0gKHBBTlRMUjNfVUlOVDgpIGtleTsKKworICAgIC8qIEl0ZXJhdGUgdGhlIGtleSBhbmQgYWNjdW11bGF0ZSB0aGUgaGFzaAorICAgICAqLworICAgIHdoaWxlKGtleWxlbiA+IDApCisgICAgeworCWhhc2ggPSAoaGFzaCA8PCA0KSArICgqKGtleVB0cisrKSk7CisKKwlpZiAoKGkxPWhhc2gmMHhmMDAwMDAwMCkgIT0gMCkKKwl7CisJCWhhc2ggPSBoYXNoIF4gKGkxID4+IDI0KTsKKwkJaGFzaCA9IGhhc2ggXiBpMTsKKwl9CisJa2V5bGVuLS07CisgICAgfQorCisgICAgcmV0dXJuICBoYXNoOworfQorCitBTlRMUjNfQVBJICBwQU5UTFIzX0xJU1QKK2FudGxyM0xpc3ROZXcJKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQpCit7CisgICAgcEFOVExSM19MSVNUICAgIGxpc3Q7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkKKyAgICAgKi8KKyAgICBsaXN0ICAgID0gKHBBTlRMUjNfTElTVClBTlRMUjNfTUFMTE9DKChzaXplX3Qpc2l6ZW9mKEFOVExSM19MSVNUKSk7CisKKyAgICBpZgkobGlzdCA9PSBOVUxMKQorICAgIHsKKwlyZXR1cm4JKHBBTlRMUjNfTElTVClBTlRMUjNfRlVOQ19QVFIoQU5UTFIzX0VSUl9OT01FTSk7CisgICAgfQorCisgICAgLyogTm93IHdlIG5lZWQgdG8gYWRkIGEgbmV3IHRhYmxlCisgICAgICovCisgICAgbGlzdC0+dGFibGUJPSBhbnRscjNIYXNoVGFibGVOZXcoc2l6ZUhpbnQpOworCisgICAgaWYJKGxpc3QtPnRhYmxlID09IChwQU5UTFIzX0hBU0hfVEFCTEUpQU5UTFIzX0ZVTkNfUFRSKEFOVExSM19FUlJfTk9NRU0pKQorICAgIHsKKwlyZXR1cm4JKHBBTlRMUjNfTElTVClBTlRMUjNfRlVOQ19QVFIoQU5UTFIzX0VSUl9OT01FTSk7CisgICAgfQorCisgICAgLyogQWxsb2NhdGlvbiB3YXMgZ29vZCwgaW5zdGFsbCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBsaXN0LT5mcmVlCSAgICA9ICBhbnRscjNMaXN0RnJlZTsKKyAgICBsaXN0LT5kZWwJICAgID0gIGFudGxyM0xpc3REZWxldGU7CisgICAgbGlzdC0+Z2V0CSAgICA9ICBhbnRscjNMaXN0R2V0OworICAgIGxpc3QtPmFkZAkgICAgPSAgYW50bHIzTGlzdEFkZDsKKyAgICBsaXN0LT5yZW1vdmUgICAgPSAgYW50bHIzTGlzdFJlbW92ZTsKKyAgICBsaXN0LT5wdXQJICAgID0gIGFudGxyM0xpc3RQdXQ7CisgICAgbGlzdC0+c2l6ZQkgICAgPSAgYW50bHIzTGlzdFNpemU7CisKKyAgICByZXR1cm4gIGxpc3Q7Cit9CisKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCWFudGxyM0xpc3RTaXplCSAgICAocEFOVExSM19MSVNUIGxpc3QpCit7CisgICAgcmV0dXJuICBsaXN0LT50YWJsZS0+c2l6ZShsaXN0LT50YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkCithbnRscjNMaXN0RnJlZQkocEFOVExSM19MSVNUIGxpc3QpCit7CisgICAgLyogRnJlZSB0aGUgaGFzaHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBsaXN0CisgICAgICovCisgICAgbGlzdC0+dGFibGUtPmZyZWUobGlzdC0+dGFibGUpOworCisgICAgLyogRnJlZSB0aGUgYWxsb2NhdGlvbiBmb3IgdGhlIGxpc3QgaXRzZWxmCisgICAgICovCisgICAgQU5UTFIzX0ZSRUUobGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCithbnRscjNMaXN0RGVsZXRlICAgIChwQU5UTFIzX0xJU1QgbGlzdCwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisgICAgbGlzdC0+dGFibGUtPmRlbEkobGlzdC0+dGFibGUsIGtleSk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2FudGxyM0xpc3RHZXQJICAgIChwQU5UTFIzX0xJU1QgbGlzdCwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisgICAgcmV0dXJuIGxpc3QtPnRhYmxlLT5nZXRJKGxpc3QtPnRhYmxlLCBrZXkpOworfQorCisvKiogQWRkIHRoZSBzdXBwbGllZCBlbGVtZW50IHRvIHRoZSBsaXN0LCBhdCB0aGUgbmV4dCBhdmFpbGFibGUga2V5CisgKi8KK3N0YXRpYyBBTlRMUjNfSU5UMzIJYW50bHIzTGlzdEFkZCAgIChwQU5UTFIzX0xJU1QgbGlzdCwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSkKK3sKKyAgICBBTlRMUjNfSU5US0VZICAga2V5OworCisgICAga2V5CSAgICA9IGxpc3QtPnRhYmxlLT5zaXplKGxpc3QtPnRhYmxlKSArIDE7CisgICAgcmV0dXJuIGxpc3QtPnB1dChsaXN0LCBrZXksIGVsZW1lbnQsIGZyZWVwdHIpOworfQorCisvKiogUmVtb3ZlIGZyb20gdGhlIGxpc3QsIGJ1dCBkb24ndCBmcmVlIHRoZSBlbGVtZW50LCBqdXN0IHNlbmQgaXQgYmFjayB0byB0aGUKKyAqICBjYWxsZXIuCisgKi8KK3N0YXRpYwl2b2lkICoKK2FudGxyM0xpc3RSZW1vdmUJICAgIChwQU5UTFIzX0xJU1QgbGlzdCwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisgICAgcEFOVExSM19IQVNIX0VOVFJZCSAgICBlbnRyeTsKKworICAgIGVudHJ5ID0gbGlzdC0+dGFibGUtPnJlbW92ZUkobGlzdC0+dGFibGUsIGtleSk7CisKKyAgICBpZgkoZW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiAgZW50cnktPmRhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcmV0dXJuCU5VTEw7CisgICAgfQorfQorCitzdGF0aWMJQU5UTFIzX0lOVDMyCithbnRscjNMaXN0UHV0CSAgICAocEFOVExSM19MSVNUIGxpc3QsIEFOVExSM19JTlRLRVkga2V5LCB2b2lkICogZWxlbWVudCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKQoreworICAgIHJldHVybiAgbGlzdC0+dGFibGUtPnB1dEkobGlzdC0+dGFibGUsIGtleSwgZWxlbWVudCwgZnJlZXB0cik7Cit9CisKK0FOVExSM19BUEkgIHBBTlRMUjNfU1RBQ0sKK2FudGxyM1N0YWNrTmV3CShBTlRMUjNfVUlOVDMyIHNpemVIaW50KQoreworICAgIHBBTlRMUjNfU1RBQ0sgICBzdGFjazsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeQorICAgICAqLworICAgIHN0YWNrICAgID0gKHBBTlRMUjNfU1RBQ0spQU5UTFIzX01BTExPQygoc2l6ZV90KXNpemVvZihBTlRMUjNfU1RBQ0spKTsKKworICAgIGlmCShzdGFjayA9PSBOVUxMKQorICAgIHsKKwlyZXR1cm4JKHBBTlRMUjNfU1RBQ0spQU5UTFIzX0ZVTkNfUFRSKEFOVExSM19FUlJfTk9NRU0pOworICAgIH0KKworICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGFkZCBhIG5ldyB0YWJsZQorICAgICAqLworICAgIHN0YWNrLT52ZWN0b3IgICA9IGFudGxyM1ZlY3Rvck5ldyhzaXplSGludCk7CisgICAgc3RhY2stPnRvcAkgICAgPSBOVUxMOworCisgICAgaWYJKHN0YWNrLT52ZWN0b3IgPT0gKHBBTlRMUjNfVkVDVE9SKUFOVExSM19GVU5DX1BUUihBTlRMUjNfRVJSX05PTUVNKSkKKyAgICB7CisJcmV0dXJuCShwQU5UTFIzX1NUQUNLKUFOVExSM19GVU5DX1BUUihBTlRMUjNfRVJSX05PTUVNKTsKKyAgICB9CisKKyAgICAvKiBMb29rcyBnb29kLCBub3cgYWRkIHRoZSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBzdGFjay0+Z2V0CT0gIGFudGxyM1N0YWNrR2V0OworICAgIHN0YWNrLT5mcmVlCT0gIGFudGxyM1N0YWNrRnJlZTsKKyAgICBzdGFjay0+cG9wCT0gIGFudGxyM1N0YWNrUG9wOworICAgIHN0YWNrLT5wdXNoCT0gIGFudGxyM1N0YWNrUHVzaDsKKyAgICBzdGFjay0+c2l6ZQk9ICBhbnRscjNTdGFja1NpemU7CisgICAgc3RhY2stPnBlZWsJPSAgYW50bHIzU3RhY2tQZWVrOworCisgICAgcmV0dXJuICBzdGFjazsKK30KKworc3RhdGljIEFOVExSM19VSU5UMzIJYW50bHIzU3RhY2tTaXplCSAgICAocEFOVExSM19TVEFDSyBzdGFjaykKK3sKKyAgICByZXR1cm4gIHN0YWNrLT52ZWN0b3ItPmNvdW50OworfQorCisKK3N0YXRpYyB2b2lkCithbnRscjNTdGFja0ZyZWUJKHBBTlRMUjNfU1RBQ0sgIHN0YWNrKQoreworICAgIC8qIEZyZWUgdGhlIGxpc3QgdGhhdCBzdXBwb3J0cyB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBzdGFjay0+dmVjdG9yLT5mcmVlKHN0YWNrLT52ZWN0b3IpOworICAgIHN0YWNrLT52ZWN0b3IgICA9IE5VTEw7CisgICAgc3RhY2stPnRvcAkgICAgPSBOVUxMOworCisgICAgQU5UTFIzX0ZSRUUoc3RhY2spOworfQorCitzdGF0aWMgdm9pZCAqCithbnRscjNTdGFja1BvcAkocEFOVExSM19TVEFDSwlzdGFjaykKK3sKKyAgICAvLyBEZWxldGUgdGhlIGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKKyAgICAvLworICAgIHN0YWNrLT52ZWN0b3ItPmRlbChzdGFjay0+dmVjdG9yLCBzdGFjay0+dmVjdG9yLT5jb3VudCAtIDEpOworCisgICAgLy8gQW5kIGdldCB0aGUgZWxlbWVudCB0aGF0IGlzIHRoZSBub3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGlmIGFueXRoaW5nKQorICAgIC8vIE5PVEUhIFRoaXMgaXMgbm90IHF1aXRlIGxpa2UgYSAncmVhbCcgc3RhY2ssIHdoaWNoIHdvdWxkIG5vcm1hbGx5IHJldHVybiB5b3UKKyAgICAvLyB0aGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBzdGFjay4KKyAgICAvLyBUT0RPOiBSZXZpZXcgdGhpcywgaXQgaXMgY29ycmVjdCBmb3IgZm9sbG93IHNldHMgd2hpY2ggaXMgd2hhdCB0aGlzIHdhcyBkb25lIGZvcgorICAgIC8vICAgICAgIGJ1dCBpcyBub3QgYXMgb2J2aW91cyB3aGVuIHVzaW5nIGl0IGFzIGEgJ3JlYWwnc3RhY2suCisgICAgLy8KKyAgICBzdGFjay0+dG9wID0gc3RhY2stPnZlY3Rvci0+Z2V0KHN0YWNrLT52ZWN0b3IsIHN0YWNrLT52ZWN0b3ItPmNvdW50IC0gMSk7CisgICAgcmV0dXJuIHN0YWNrLT50b3A7Cit9CisKK3N0YXRpYyB2b2lkICoKK2FudGxyM1N0YWNrR2V0CShwQU5UTFIzX1NUQUNLIHN0YWNrLCBBTlRMUjNfSU5US0VZIGtleSkKK3sKKyAgICByZXR1cm4gIHN0YWNrLT52ZWN0b3ItPmdldChzdGFjay0+dmVjdG9yLCAoQU5UTFIzX1VJTlQzMilrZXkpOworfQorCitzdGF0aWMgdm9pZCAqCithbnRscjNTdGFja1BlZWsJKHBBTlRMUjNfU1RBQ0sJc3RhY2spCit7CisgICAgcmV0dXJuICBzdGFjay0+dG9wOworfQorCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4gCithbnRscjNTdGFja1B1c2gJKHBBTlRMUjNfU1RBQ0sgc3RhY2ssIHZvaWQgKiBlbGVtZW50LCB2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVwdHIpKHZvaWQgKikpCit7CisgICAgc3RhY2stPnRvcAk9IGVsZW1lbnQ7CisgICAgcmV0dXJuIChBTlRMUjNfQk9PTEVBTikoc3RhY2stPnZlY3Rvci0+YWRkKHN0YWNrLT52ZWN0b3IsIGVsZW1lbnQsIGZyZWVwdHIpKTsKK30KKworQU5UTFIzX0FQSSAgcEFOVExSM19WRUNUT1IKK2FudGxyM1ZlY3Rvck5ldwkoQU5UTFIzX1VJTlQzMiBzaXplSGludCkKK3sKKwlwQU5UTFIzX1ZFQ1RPUiAgdmVjdG9yOworCisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB2ZWN0b3Igc3RydWN0dXJlIGl0c2VsZgorCS8vCisJdmVjdG9yICA9IChwQU5UTFIzX1ZFQ1RPUikgQU5UTFIzX01BTExPQygoc2l6ZV90KShzaXplb2YoQU5UTFIzX1ZFQ1RPUikpKTsKKworCWlmCSh2ZWN0b3IgPT0gTlVMTCkKKwl7CisJCXJldHVybgkocEFOVExSM19WRUNUT1IpQU5UTFIzX0ZVTkNfUFRSKEFOVExSM19FUlJfTk9NRU0pOworCX0KKworCS8vIE5vdyBmaWxsIGluIHRoZSBkZWZhdWx0cworCS8vCisgICAgYW50bHIzU2V0VmVjdG9yQXBpKHZlY3Rvciwgc2l6ZUhpbnQpOworCisJLy8gQW5kIGV2ZXJ5dGhpbmcgaXMgaHVua3kgZG9yeQorCS8vCisJcmV0dXJuICB2ZWN0b3I7Cit9CisKK0FOVExSM19BUEkgdm9pZAorYW50bHIzU2V0VmVjdG9yQXBpICAocEFOVExSM19WRUNUT1IgdmVjdG9yLCBBTlRMUjNfVUlOVDMyIHNpemVIaW50KQoreworICAgIEFOVExSM19VSU5UMzIgICBpbml0aWFsU2l6ZTsKKworICAgIC8vIEFsbG93IHZlY3RvcnMgdG8gYmUgZ3Vlc3NlZCBieSBvdXJzZWx2ZXMsIHNvIGlucHV0IHNpemUgY2FuIGJlIHplcm8KKyAgICAvLworICAgIGlmCShzaXplSGludCA+IEFOVExSM19WRUNUT1JfSU5URVJOQUxfU0laRSkKKyAgICB7CisgICAgICAgIGluaXRpYWxTaXplID0gc2l6ZUhpbnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluaXRpYWxTaXplID0gQU5UTFIzX1ZFQ1RPUl9JTlRFUk5BTF9TSVpFOworICAgIH0KKworICAgIGlmICAoc2l6ZUhpbnQgPiBBTlRMUjNfVkVDVE9SX0lOVEVSTkFMX1NJWkUpCisgICAgeworICAgICAgICB2ZWN0b3ItPmVsZW1lbnRzCT0gKHBBTlRMUjNfVkVDVE9SX0VMRU1FTlQpQU5UTFIzX01BTExPQygoc2l6ZV90KShzaXplb2YoQU5UTFIzX1ZFQ1RPUl9FTEVNRU5UKSAqIGluaXRpYWxTaXplKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZlY3Rvci0+ZWxlbWVudHMgICAgPSB2ZWN0b3ItPmludGVybmFsOworICAgIH0KKworICAgIGlmCSh2ZWN0b3ItPmVsZW1lbnRzID09IE5VTEwpCisgICAgeworICAgICAgICBBTlRMUjNfRlJFRSh2ZWN0b3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTWVtb3J5IGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAvLworICAgIHZlY3Rvci0+Y291bnQJCQk9IDA7CQkJLy8gTm8gZW50cmllcyB5ZXQgb2YgY291cnNlCisgICAgdmVjdG9yLT5lbGVtZW50c1NpemUgICAgPSBpbml0aWFsU2l6ZTsgIC8vIEF2YWlsYWJsZSBlbnRyaWVzCisKKyAgICAvLyBOb3cgd2UgY2FuIGluc3RhbGwgdGhlIEFQSQorICAgIC8vCisgICAgdmVjdG9yLT5hZGQJICAgID0gYW50bHIzVmVjdG9yQWRkOworICAgIHZlY3Rvci0+ZGVsCSAgICA9IGFudGxyM1ZlY3RvckRlbDsKKyAgICB2ZWN0b3ItPmdldAkgICAgPSBhbnRscjNWZWN0b3JHZXQ7CisgICAgdmVjdG9yLT5mcmVlICAgID0gYW50bHIzVmVjdG9yRnJlZTsKKyAgICB2ZWN0b3ItPnNldAkgICAgPSBhbnRscjNWZWN0b3JTZXQ7CisgICAgdmVjdG9yLT5yZW1vdmUgID0gYW50cmwzVmVjdG9yUmVtb3ZlOworICAgIHZlY3Rvci0+Y2xlYXIgICA9IGFudGxyM1ZlY3RvckNsZWFyOworICAgIHZlY3Rvci0+c2l6ZSAgICA9IGFudGxyM1ZlY3RvclNpemU7CisgICAgdmVjdG9yLT5zd2FwICAgID0gYW50bHIzVmVjdG9yU3dhcDsKKworICAgIC8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgbm90IGEgZmFjdG9yeSBtYWRlIHZlY3RvcgorICAgIC8vCisgICAgdmVjdG9yLT5mYWN0b3J5TWFkZQk9IEFOVExSM19GQUxTRTsKK30KKworLy8gQ2xlYXIgdGhlIGVudHJpZXMgaW4gYSB2ZWN0b3IuCisvLyBDbGVhcmluZyB0aGUgdmVjdG9yIGxlYXZlcyBpdHMgY2FwYWNpdHkgdGhlIHNhbWUgYnV0CisvLyBpdCB3YWxrcyB0aGUgZW50cmllcyBmaXJzdCB0byBzZWUgaWYgYW55IG9mIHRoZW0KKy8vIGhhdmUgYSBmcmVlIHJvdXRpbmUgdGhhdCBtdXN0IGJlIGNhbGxlZC4KKy8vCitzdGF0aWMJdm9pZAkJCQkKK2FudGxyM1ZlY3RvckNsZWFyCShwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpCit7CisJQU5UTFIzX1VJTlQzMiAgIGVudHJ5OworCisJLy8gV2UgbXVzdCB0cmF2ZXJzZSBldmVyeSBlbnRyeSBpbiB0aGUgdmVjdG9yIGFuZCBpZiBpdCBoYXMKKwkvLyBhIHBvaW50ZXIgdG8gYSBmcmVlIGZ1bmN0aW9uIHRoZW4gd2UgY2FsbCBpdCB3aXRoIHRoZQorCS8vIHRoZSBlbnRyeSBwb2ludGVyCisJLy8KKwlmb3IJKGVudHJ5ID0gMDsgZW50cnkgPCB2ZWN0b3ItPmNvdW50OyBlbnRyeSsrKQorCXsKKwkJaWYgICh2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5mcmVlcHRyICE9IE5VTEwpCisJCXsKKwkJCXZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmZyZWVwdHIodmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZWxlbWVudCk7CisJCX0KKwkJdmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZnJlZXB0ciAgICA9IE5VTEw7CisJCXZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmVsZW1lbnQgICAgPSBOVUxMOworCX0KKworCS8vIEhhdmluZyBjYWxsZWQgYW55IGZyZWUgcG9pbnRlcnMsIHdlIGp1c3QgcmVzZXQgdGhlIGVudHJ5IGNvdW50CisJLy8gYmFjayB0byB6ZXJvLgorCS8vCisJdmVjdG9yLT5jb3VudAk9IDA7Cit9CisKK3N0YXRpYwkKK3ZvaWQJQU5UTFIzX0NERUNMCWFudGxyM1ZlY3RvckZyZWUgICAgKHBBTlRMUjNfVkVDVE9SIHZlY3RvcikKK3sKKwlBTlRMUjNfVUlOVDMyICAgZW50cnk7CisKKwkvLyBXZSBtdXN0IHRyYXZlcnNlIGV2ZXJ5IGVudHJ5IGluIHRoZSB2ZWN0b3IgYW5kIGlmIGl0IGhhcworCS8vIGEgcG9pbnRlciB0byBhIGZyZWUgZnVuY3Rpb24gdGhlbiB3ZSBjYWxsIGl0IHdpdGggdGhlCisJLy8gdGhlIGVudHJ5IHBvaW50ZXIKKwkvLworCWZvcgkoZW50cnkgPSAwOyBlbnRyeSA8IHZlY3Rvci0+Y291bnQ7IGVudHJ5KyspCisJeworCQlpZiAgKHZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmZyZWVwdHIgIT0gTlVMTCkKKwkJeworCQkJdmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZnJlZXB0cih2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5lbGVtZW50KTsKKwkJfQorCQl2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5mcmVlcHRyICAgID0gTlVMTDsKKwkJdmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZWxlbWVudCAgICA9IE5VTEw7CisJfQorCisJaWYJKHZlY3Rvci0+ZmFjdG9yeU1hZGUgPT0gQU5UTFIzX0ZBTFNFKQorCXsKKwkJLy8gVGhlIGVudHJpZXMgYXJlIGZyZWVkLCBzbyBmcmVlIHRoZSBlbGVtZW50IGFsbG9jYXRpb24KKwkJLy8KKyAgICAgICAgaWYgICh2ZWN0b3ItPmVsZW1lbnRzU2l6ZSA+IEFOVExSM19WRUNUT1JfSU5URVJOQUxfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgQU5UTFIzX0ZSRUUodmVjdG9yLT5lbGVtZW50cyk7CisgICAgICAgIH0KKwkJdmVjdG9yLT5lbGVtZW50cyA9IE5VTEw7CisKKwkJLy8gRmluYWxseSwgZnJlZSB0aGUgYWxsb2NhdGlvbiBmb3IgdGhlIHZlY3RvciBpdHNlbGYKKwkJLy8KKwkJQU5UTFIzX0ZSRUUodmVjdG9yKTsKKwl9Cit9CisKK3N0YXRpYwl2b2lkCQlhbnRscjNWZWN0b3JEZWwJICAgIChwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IsIEFOVExSM19VSU5UMzIgZW50cnkpCit7CisJLy8gQ2hlY2sgdGhpcyBpcyBhIHZhbGlkIHJlcXVlc3QgZmlyc3QKKwkvLworCWlmCShlbnRyeSA+PSB2ZWN0b3ItPmNvdW50KQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFZhbGlkIHJlcXVlc3QsIGNoZWNrIGZvciBmcmVlIHBvaW50ZXIgYW5kIGNhbGwgaXQgaWYgcHJlc2VudAorCS8vCisJaWYJKHZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmZyZWVwdHIgIT0gTlVMTCkKKwl7CisJCXZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmZyZWVwdHIodmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZWxlbWVudCk7CisJCXZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmZyZWVwdHIgICAgPSBOVUxMOworCX0KKworCWlmCShlbnRyeSA9PSB2ZWN0b3ItPmNvdW50IC0gMSkKKwl7CisJCS8vIEVuc3VyZSB0aGUgcG9pbnRlciBpcyBuZXZlciByZXVzZWQgYnkgYWNjaWRlbnQsIGJ1dCBvdGhlcndpc2UganVzdCAKKwkJLy8gZGVjcmVtZW50IHRoZSBwb2ludGVyLgorCQkvLworCQl2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5lbGVtZW50ICAgID0gTlVMTDsKKwl9CisJZWxzZQorCXsKKwkJLy8gTmVlZCB0byBzaHVmZmxlIHRyYWlsaW5nIHBvaW50ZXJzIGJhY2sgb3ZlciB0aGUgZGVsZXRlZCBlbnRyeQorCQkvLworCQlBTlRMUjNfTUVNTU9WRSh2ZWN0b3ItPmVsZW1lbnRzICsgZW50cnksIHZlY3Rvci0+ZWxlbWVudHMgKyBlbnRyeSArIDEsIHNpemVvZihBTlRMUjNfVkVDVE9SX0VMRU1FTlQpICogKHZlY3Rvci0+Y291bnQgLSBlbnRyeSAtIDEpKTsKKwl9CisKKwkvLyBPbmUgbGVzcyBlbnRyeSBpbiB0aGUgdmVjdG9yIG5vdworCS8vCisJdmVjdG9yLT5jb3VudC0tOworfQorCitzdGF0aWMJdm9pZCAqCQlhbnRscjNWZWN0b3JHZXQgICAgIChwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IsIEFOVExSM19VSU5UMzIgZW50cnkpCit7CisJLy8gRW5zdXJlIHRoaXMgaXMgYSB2YWxpZCByZXF1ZXN0CisJLy8KKwlpZgkoZW50cnkgPCB2ZWN0b3ItPmNvdW50KQorCXsKKwkJcmV0dXJuCXZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmVsZW1lbnQ7CisJfQorCWVsc2UKKwl7CisJCS8vIEkga25vdyBub3RoaW5nLCBNci4gRmF3bHR5IQorCQkvLworCQlyZXR1cm4JTlVMTDsKKwl9Cit9CisKKy8vLyBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHZlY3RvciwgYnV0IGRvIG5vdCBmcmVlIGFueSBlbnRyeSwgZXZlbiBpZiBpdCBoYXMKKy8vLyBhIGZyZWUgcG9pbnRlci4KKy8vLworc3RhdGljCXZvaWQgKgkJYW50cmwzVmVjdG9yUmVtb3ZlICAocEFOVExSM19WRUNUT1IgdmVjdG9yLCBBTlRMUjNfVUlOVDMyIGVudHJ5KQoreworCXZvaWQgKiBlbGVtZW50OworCisJLy8gQ2hlY2sgdGhpcyBpcyBhIHZhbGlkIHJlcXVlc3QgZmlyc3QgCisJLy8KKwlpZgkoZW50cnkgPj0gdmVjdG9yLT5jb3VudCkKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIFZhbGlkIHJlcXVlc3QsIHJldHVybiB0aGUgc29ydGVkIHBvaW50ZXIKKwkvLworCisJZWxlbWVudAkJCQkgICAgPSB2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5lbGVtZW50OworCisJaWYJKGVudHJ5ID09IHZlY3Rvci0+Y291bnQgLSAxKQorCXsKKwkJLy8gRW5zdXJlIHRoZSBwb2ludGVyIGlzIG5ldmVyIHJldXNlZCBieSBhY2NpZGVudCwgYnV0IG90aGVyd2lzZSBqdXN0IAorCQkvLyBkZWNyZW1lbnQgdGhlIHBvaW50ZXIuCisJCS8vLworCQl2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5lbGVtZW50ICAgID0gTlVMTDsKKwkJdmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZnJlZXB0ciAgICA9IE5VTEw7CisJfQorCWVsc2UKKwl7CisJCS8vIE5lZWQgdG8gc2h1ZmZsZSB0cmFpbGluZyBwb2ludGVycyBiYWNrIG92ZXIgdGhlIGRlbGV0ZWQgZW50cnkKKwkJLy8KKwkJQU5UTFIzX01FTU1PVkUodmVjdG9yLT5lbGVtZW50cyArIGVudHJ5LCB2ZWN0b3ItPmVsZW1lbnRzICsgZW50cnkgKyAxLCBzaXplb2YoQU5UTFIzX1ZFQ1RPUl9FTEVNRU5UKSAqICh2ZWN0b3ItPmNvdW50IC0gZW50cnkgLSAxKSk7CisJfQorCisJLy8gT25lIGxlc3MgZW50cnkgaW4gdGhlIHZlY3RvciBub3cKKwkvLworCXZlY3Rvci0+Y291bnQtLTsKKworCXJldHVybiAgZWxlbWVudDsKK30KKworc3RhdGljICB2b2lkCithbnRscjNWZWN0b3JSZXNpemUgIChwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IsIEFOVExSM19VSU5UMzIgaGludCkKK3sKKwlBTlRMUjNfVUlOVDMyCW5ld1NpemU7CisKKwkvLyBOZWVkIHRvIHJlc2l6ZSB0aGUgZWxlbWVudCBwb2ludGVycy4gV2UgZG91YmxlIHRoZSBhbGxvY2F0aW9uCisJLy8gd2UgYWxyZWFkeSBoYXZlIHVubGVzcyBhc2tlZCBmb3IgYSBzcGVjaWZpYyBpbmNyZWFzZS4KKyAgICAvLworICAgIGlmIChoaW50ID09IDAgfHwgaGludCA8IHZlY3Rvci0+ZWxlbWVudHNTaXplKQorICAgIHsKKyAgICAgICAgbmV3U2l6ZSA9IHZlY3Rvci0+ZWxlbWVudHNTaXplICogMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbmV3U2l6ZSA9IGhpbnQgKiAyOworICAgIH0KKworICAgIC8vIE5vdyB3ZSBrbm93IGhvdyBtYW55IHdlIG5lZWQsIHNvIHdlIHNlZSBpZiB3ZSBoYXZlIGp1c3QgZXhwYW5kZWQKKyAgICAvLyBwYXN0IHRoZSBidWlsdCBpbiB2ZWN0b3IgZWxlbWVudHMgb3Igd2VyZSBhbHJlYWR5IHBhc3QgdGhhdAorICAgIC8vCisgICAgaWYgICh2ZWN0b3ItPmVsZW1lbnRzU2l6ZSA+IEFOVExSM19WRUNUT1JfSU5URVJOQUxfU0laRSkKKyAgICB7CisgICAgICAgIC8vIFdlIHdlcmUgYWxyZWFkeSBsYXJnZXIgdGhhbiB0aGUgaW50ZXJuYWwgc2l6ZSwgc28gd2UganVzdAorICAgICAgICAvLyB1c2UgcmVhbGxvYyBzbyB0aGF0IHRoZSBwb2ludGVycyBhcmUgY29waWVkIGZvciB1cworICAgICAgICAvLworICAgICAgICB2ZWN0b3ItPmVsZW1lbnRzCT0gKHBBTlRMUjNfVkVDVE9SX0VMRU1FTlQpQU5UTFIzX1JFQUxMT0ModmVjdG9yLT5lbGVtZW50cywgKHNpemVvZihBTlRMUjNfVkVDVE9SX0VMRU1FTlQpKiBuZXdTaXplKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFRoZSBjdXJyZW50IHNpemUgd2FzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgaW50ZXJuYWwgYXJyYXkgc2l6ZSBhbmQgYXMgd2UgYWx3YXlzIHN0YXJ0CisgICAgICAgIC8vIHdpdGggYSBzaXplIHRoYXQgaXMgYXQgbGVhc3QgdGhlIG1heGltdW0gaW50ZXJuYWwgc2l6ZSwgdGhlbiB3ZSBtdXN0IG5lZWQgdG8gYWxsb2NhdGUgbmV3IG1lbW9yeQorICAgICAgICAvLyBmb3IgZXh0ZXJuYWwgcG9pbnRlcnMuIFdlIGRvbid0IHdhbnQgdG8gdGFrZSB0aGUgdGltZSB0byBjYWxjdWxhdGUgaWYgYSByZXF1ZXN0ZWQgZWxlbWVudAorICAgICAgICAvLyBpcyBwYXJ0IG9mIHRoZSBpbnRlcm5hbCBvciBleHRlcm5hbCBlbnRyaWVzLCBzbyB3ZSBjb3B5IHRoZSBpbnRlcm5hbCBvbmVzIHRvIHRoZSBuZXcgc3BhY2UKKyAgICAgICAgLy8KKyAgICAgICAgdmVjdG9yLT5lbGVtZW50cwk9IChwQU5UTFIzX1ZFQ1RPUl9FTEVNRU5UKUFOVExSM19NQUxMT0MoKHNpemVvZihBTlRMUjNfVkVDVE9SX0VMRU1FTlQpKiBuZXdTaXplKSk7CisgICAgICAgIEFOVExSM19NRU1DUFkodmVjdG9yLT5lbGVtZW50cywgdmVjdG9yLT5pbnRlcm5hbCwgQU5UTFIzX1ZFQ1RPUl9JTlRFUk5BTF9TSVpFICogc2l6ZW9mKEFOVExSM19WRUNUT1JfRUxFTUVOVCkpOworICAgIH0KKworCXZlY3Rvci0+ZWxlbWVudHNTaXplCT0gbmV3U2l6ZTsKK30KKworLy8vIEFkZCB0aGUgc3VwcGxpZWQgcG9pbnRlciBhbmQgZnJlZWluZyBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBsaXN0LAorLy8vIGV4cGFuZGluZyB0aGUgdmVjdG9yIGlmIG5lZWRlZC4KKy8vLworc3RhdGljCUFOVExSM19VSU5UMzIgICAgYW50bHIzVmVjdG9yQWRkCSAgICAocEFOVExSM19WRUNUT1IgdmVjdG9yLCB2b2lkICogZWxlbWVudCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKQoreworCS8vIERvIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB2ZWN0b3IgdGFibGU/CisJLy8KKwlpZgkodmVjdG9yLT5jb3VudCA9PSB2ZWN0b3ItPmVsZW1lbnRzU2l6ZSkKKwl7CisJCWFudGxyM1ZlY3RvclJlc2l6ZSh2ZWN0b3IsIDApOwkgICAgLy8gR2l2ZSBubyBoaW50LCB3ZSBsZXQgaXQgYWRkIDEwMjQgb3IgZG91YmxlIGl0CisJfQorCisJLy8gSW5zZXJ0IHRoZSBuZXcgZW50cnkKKwkvLworCXZlY3Rvci0+ZWxlbWVudHNbdmVjdG9yLT5jb3VudF0uZWxlbWVudAk9IGVsZW1lbnQ7CisJdmVjdG9yLT5lbGVtZW50c1t2ZWN0b3ItPmNvdW50XS5mcmVlcHRyCT0gZnJlZXB0cjsKKworCXZlY3Rvci0+Y291bnQrKzsJICAgIC8vIE9uZSBtb3JlIGVsZW1lbnQgY291bnRlZAorCisJcmV0dXJuICAoQU5UTFIzX1VJTlQzMikodmVjdG9yLT5jb3VudCk7CisKK30KKworLy8vIFJlcGxhY2UgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBlbnRyeSBwb2ludCB3aXRoIHRoZSBzdXBwbGllZAorLy8vIGVudHJ5LgorLy8vCitzdGF0aWMJQU5UTFIzX1VJTlQzMiAgICAKK2FudGxyM1ZlY3RvclNldAkgICAgKHBBTlRMUjNfVkVDVE9SIHZlY3RvciwgQU5UTFIzX1VJTlQzMiBlbnRyeSwgdm9pZCAqIGVsZW1lbnQsIHZvaWQgKEFOVExSM19DREVDTCAqZnJlZXB0cikodm9pZCAqKSwgQU5UTFIzX0JPT0xFQU4gZnJlZUV4aXN0aW5nKQoreworCisJLy8gSWYgdGhlIHZlY3RvciBpcyBjdXJyZW50bHkgbm90IGJpZyBlbm91Z2gsIHRoZW4gd2UgZXhwYW5kIGl0CisJLy8KKwlpZiAoZW50cnkgPj0gdmVjdG9yLT5lbGVtZW50c1NpemUpCisJeworCQlhbnRscjNWZWN0b3JSZXNpemUodmVjdG9yLCBlbnRyeSk7CS8vIFdlIHdpbGwgZ2V0IGF0IGxlYXN0IHRoaXMgbWFueSAKKwl9CisKKwkvLyBWYWxpZCByZXF1ZXN0LCByZXBsYWNlIHRoZSBjdXJyZW50IG9uZSwgZnJlZWluZyBhbnkgcHJpb3IgZW50cnkgaWYgdG9sZCB0bworCS8vCisJaWYJKAkJZW50cnkgPCB2ZWN0b3ItPmNvdW50CQkJCQkJLy8gSWYgYWN0dWFsbHkgcmVwbGFjaW5nIGFuIGVsZW1lbnQKKwkJCSYmCWZyZWVFeGlzdGluZwkJCQkJCQkJLy8gQW5kIHRvbGQgdG8gZnJlZSBhbnkgZXhpc3RpbmcgZWxlbWVudAorCQkJJiYJdmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZnJlZXB0ciAhPSBOVUxMCQkvLyBBbmQgdGhlIGV4aXN0aW5nIGVsZW1lbnQgaGFzIGEgZnJlZSBwb2ludGVyCisJCSkKKwl7CisJCXZlY3Rvci0+ZWxlbWVudHNbZW50cnldLmZyZWVwdHIodmVjdG9yLT5lbGVtZW50c1tlbnRyeV0uZWxlbWVudCk7CisJfQorCisJLy8gSW5zdGFsbCB0aGUgbmV3IHBvaW50ZXJzCisJLy8KKwl2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5mcmVlcHRyCT0gZnJlZXB0cjsKKwl2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5XS5lbGVtZW50CT0gZWxlbWVudDsKKworCWlmIChlbnRyeSA+PSB2ZWN0b3ItPmNvdW50KQorCXsKKwkJdmVjdG9yLT5jb3VudCA9IGVudHJ5ICsgMTsKKwl9CisJcmV0dXJuICAoQU5UTFIzX1VJTlQzMikoZW50cnkpOwkgICAgLy8gSW5kaWNhdGVzIHRoZSByZXBsYWNlbWVudCB3YXMgc3VjY2Vzc2Z1bAorCit9CisKKy8vLyBSZXBsYWNlIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgZW50cnkgcG9pbnQgd2l0aCB0aGUgc3VwcGxpZWQKKy8vLyBlbnRyeS4KKy8vLworc3RhdGljCUFOVExSM19CT09MRUFOCithbnRscjNWZWN0b3JTd2FwCSAgICAocEFOVExSM19WRUNUT1IgdmVjdG9yLCBBTlRMUjNfVUlOVDMyIGVudHJ5MSwgQU5UTFIzX1VJTlQzMiBlbnRyeTIpCit7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgKiB0ZW1wRW50cnk7CisgICAgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopOworCisJLy8gSWYgdGhlIHZlY3RvciBpcyBjdXJyZW50bHkgbm90IGJpZyBlbm91Z2gsIHRoZW4gd2UgZG8gbm90aGluZworCS8vCisJaWYgKGVudHJ5MSA+PSB2ZWN0b3ItPmVsZW1lbnRzU2l6ZSB8fCBlbnRyeTIgPj0gdmVjdG9yLT5lbGVtZW50c1NpemUpCisJeworICAgICAgICByZXR1cm4gQU5UTFIzX0ZBTFNFOworCX0KKworCS8vIFZhbGlkIHJlcXVlc3QsIHN3YXAgdGhlbQorCS8vCisgICAgdGVtcEVudHJ5ICAgPSB2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5MV0uZWxlbWVudDsKKyAgICBmcmVlcHRyICAgICA9IHZlY3Rvci0+ZWxlbWVudHNbZW50cnkxXS5mcmVlcHRyOworCisJLy8gSW5zdGFsbCB0aGUgbmV3IHBvaW50ZXJzCisJLy8KKyAgICB2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5MV0uZnJlZXB0cgk9IHZlY3Rvci0+ZWxlbWVudHNbZW50cnkyXS5mcmVlcHRyOworCXZlY3Rvci0+ZWxlbWVudHNbZW50cnkxXS5lbGVtZW50CT0gdmVjdG9yLT5lbGVtZW50c1tlbnRyeTJdLmVsZW1lbnQ7CisKKwl2ZWN0b3ItPmVsZW1lbnRzW2VudHJ5Ml0uZnJlZXB0cgk9IGZyZWVwdHI7CisJdmVjdG9yLT5lbGVtZW50c1tlbnRyeTJdLmVsZW1lbnQJPSB0ZW1wRW50cnk7CisKKwlyZXR1cm4gIEFOVExSM19UUlVFOworCit9CisKK3N0YXRpYwlBTlRMUjNfVUlOVDMyICAgYW50bHIzVmVjdG9yU2l6ZSAgICAocEFOVExSM19WRUNUT1IgdmVjdG9yKQoreworICAgIHJldHVybiAgdmVjdG9yLT5jb3VudDsKK30KKworI2lmZGVmIEFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcJKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MTAwKQorI2VuZGlmCisvLy8gVmVjdG9yIGZhY3RvcnkgY3JlYXRpb24KKy8vLworQU5UTFIzX0FQSSBwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZCithbnRscjNWZWN0b3JGYWN0b3J5TmV3CSAgICAoQU5UTFIzX1VJTlQzMiBzaXplSGludCkKK3sKKwlwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZICBmYWN0b3J5OworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZmFjdG9yeQorCS8vCisJZmFjdG9yeSA9IChwQU5UTFIzX1ZFQ1RPUl9GQUNUT1JZKUFOVExSM19NQUxMT0MoKHNpemVfdCkoc2l6ZW9mKEFOVExSM19WRUNUT1JfRkFDVE9SWSkpKTsKKworCWlmCShmYWN0b3J5ID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvLyBGYWN0b3J5IG1lbW9yeSBpcyBnb29kLCBzbyBjcmVhdGUgYSBuZXcgdmVjdG9yIHBvb2wKKwkvLworICAgIGZhY3RvcnktPnBvb2xzICAgICAgPSBOVUxMOworICAgIGZhY3RvcnktPnRoaXNQb29sICAgPSAtMTsKKworICAgIG5ld1Bvb2woZmFjdG9yeSk7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBBUEksIGlnbm9yZSB0aGUgaGludCBhcyB0aGlzIGFsZ29yaXRobSBkb2VzCisgICAgLy8gYSBiZXR0ZXIgam9iIHJlYWxseS4KKyAgICAvLworICAgIGFudGxyM1NldFZlY3RvckFwaSgmKGZhY3RvcnktPnVuVHJ1YyksIEFOVExSM19WRUNUT1JfSU5URVJOQUxfU0laRSk7CisgICAgCisgICAgZmFjdG9yeS0+dW5UcnVjLmZhY3RvcnlNYWRlID0gQU5UTFIzX1RSVUU7CisKKwkvLyBJbnN0YWxsIHRoZSBmYWN0b3J5IEFQSQorCS8vCisJZmFjdG9yeS0+Y2xvc2UJCQk9IGNsb3NlVmVjdG9yRmFjdG9yeTsKKwlmYWN0b3J5LT5uZXdWZWN0b3IJCT0gbmV3VmVjdG9yOworCWZhY3RvcnktPnJldHVyblZlY3Rvcgk9IHJldHVyblZlY3RvcjsKKworCS8vIENyZWF0ZSBhIHN0YWNrIHRvIGFjY3VtdWxhdGUgcmV1c2FibGUgdmVjdG9ycworCS8vCisJZmFjdG9yeS0+ZnJlZVN0YWNrCQk9IGFudGxyM1N0YWNrTmV3KDE2KTsKKwlyZXR1cm4gIGZhY3Rvcnk7Cit9CisjaWZkZWYgQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZwkocG9wKQorI2VuZGlmCisKK3N0YXRpYwl2b2lkCQkJCQorcmV0dXJuVmVjdG9yCQkocEFOVExSM19WRUNUT1JfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpCit7CisJLy8gRmlyc3Qgd2UgbmVlZCB0byBjbGVhciBvdXQgYW55dGhpbmcgdGhhdCBpcyBzdGlsbCBpbiB0aGUgdmVjdG9yCisJLy8KKwl2ZWN0b3ItPmNsZWFyKHZlY3Rvcik7CisKKwkvLyBXZSBoYXZlIGEgZnJlZSBzdGFjayBhdmFpbGFibGUgc28gd2UgY2FuIGFkZCB0aGUgdmVjdG9yIHdlIHdlcmUKKwkvLyBnaXZlbiBpbnRvIHRoZSBmcmVlIGNoYWluLiBUaGUgdmVjdG9yIGhhcyB0byBoYXZlIGNvbWUgZnJvbSB0aGlzCisJLy8gZmFjdG9yeSwgc28gd2UgYWxyZWFkeSBrbm93IGhvdyB0byByZWxlYXNlIGl0cyBtZW1vcnkgd2hlbiBpdAorCS8vIGRpZXMgYnkgdmlydHVlIG9mIHRoZSBmYWN0b3J5IGJlaW5nIGNsb3NlZC4KKwkvLworCWZhY3RvcnktPmZyZWVTdGFjay0+cHVzaChmYWN0b3J5LT5mcmVlU3RhY2ssIHZlY3RvciwgTlVMTCk7CisKKwkvLyBUT0RPOiByZW1vdmUgdGhpcyBsaW5lIG9uY2UgaGFwcHkgcHJpbnRmKCJSZXR1cm5lZCB2ZWN0b3IgJTA4WCB0byB0aGUgcG9vbCwgc3RhY2sgc2l6ZSBpcyAlZFxuIiwgdmVjdG9yLCBmYWN0b3J5LT5mcmVlU3RhY2stPnNpemUoZmFjdG9yeS0+ZnJlZVN0YWNrKSk7Cit9CisKK3N0YXRpYyB2b2lkCituZXdQb29sKHBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlkgZmFjdG9yeSkKK3sKKyAgICAvKiBJbmNyZW1lbnQgZmFjdG9yeSBjb3VudAorICAgICAqLworICAgIGZhY3RvcnktPnRoaXNQb29sKys7CisKKyAgICAvKiBFbnN1cmUgd2UgaGF2ZSBlbm91Z2ggcG9pbnRlcnMgYWxsb2NhdGVkCisgICAgICovCisgICAgZmFjdG9yeS0+cG9vbHMgPSAocEFOVExSM19WRUNUT1IgKikKKwkJICAgICBBTlRMUjNfUkVBTExPQygJKHZvaWQgKilmYWN0b3J5LT5wb29scywJICAgIC8qIEN1cnJlbnQgcG9vbHMgcG9pbnRlciAoc3RhcnRzIGF0IE5VTEwpCSovCisJCQkJCShBTlRMUjNfVUlOVDMyKSgoZmFjdG9yeS0+dGhpc1Bvb2wgKyAxKSAqIHNpemVvZihwQU5UTFIzX1ZFQ1RPUiAqKSkJLyogTWVtb3J5IGZvciBuZXcgcG9vbCBwb2ludGVycyAqLworCQkJCQkpOworCisgICAgLyogQWxsb2NhdGUgYSBuZXcgcG9vbCBmb3IgdGhlIGZhY3RvcnkKKyAgICAgKi8KKyAgICBmYWN0b3J5LT5wb29sc1tmYWN0b3J5LT50aGlzUG9vbF0JPQorCQkJICAgIChwQU5UTFIzX1ZFQ1RPUikKKwkJCQlBTlRMUjNfTUFMTE9DKChzaXplX3QpKHNpemVvZihBTlRMUjNfVkVDVE9SKSAqIEFOVExSM19GQUNUT1JZX1ZQT09MX1NJWkUpKTsKKworCisgICAgLyogUmVzZXQgdGhlIGNvdW50ZXJzCisgICAgICovCisgICAgZmFjdG9yeS0+bmV4dFZlY3Rvcgk9IDA7CisKKyAgICAvKiBEb25lCisgICAgICovCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgIHZvaWQJCQorY2xvc2VWZWN0b3JGYWN0b3J5ICAocEFOVExSM19WRUNUT1JfRkFDVE9SWSBmYWN0b3J5KQoreworICAgIHBBTlRMUjNfVkVDVE9SICAgICAgcG9vbDsKKyAgICBBTlRMUjNfSU5UMzIgICAgICAgIHBvb2xDb3VudDsKKyAgICBBTlRMUjNfVUlOVDMyICAgICAgIGxpbWl0OworICAgIEFOVExSM19VSU5UMzIgICAgICAgdmVjdG9yOworICAgIHBBTlRMUjNfVkVDVE9SICAgICAgY2hlY2s7CisKKwkvLyBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBhIGZyZWUgY2hhaW4gc3RhY2sgdG8gcmVsZWFzZT8KKwkvLworCWlmCShmYWN0b3J5LT5mcmVlU3RhY2sgIT0gTlVMTCkKKwl7CisJCWZhY3RvcnktPmZyZWVTdGFjay0+ZnJlZShmYWN0b3J5LT5mcmVlU3RhY2spOworCX0KKworICAgIC8qIFdlIGl0ZXJhdGUgdGhlIHZlY3RvciBwb29scyBvbmUgYXQgYSB0aW1lCisgICAgICovCisgICAgZm9yIChwb29sQ291bnQgPSAwOyBwb29sQ291bnQgPD0gZmFjdG9yeS0+dGhpc1Bvb2w7IHBvb2xDb3VudCsrKQorICAgIHsKKyAgICAgICAgLyogUG9pbnRlciB0byBjdXJyZW50IHBvb2wKKyAgICAgICAgICovCisgICAgICAgIHBvb2wgPSBmYWN0b3J5LT5wb29sc1twb29sQ291bnRdOworCisgICAgICAgIC8qIFdvcmsgb3V0IGhvdyBtYW55IHRva2VucyB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoaXMgcG9vbC4KKyAgICAgICAgICovCisgICAgICAgIGxpbWl0ID0gKHBvb2xDb3VudCA9PSBmYWN0b3J5LT50aGlzUG9vbCA/IGZhY3RvcnktPm5leHRWZWN0b3IgOiBBTlRMUjNfRkFDVE9SWV9WUE9PTF9TSVpFKTsKKworICAgICAgICAvKiBNYXJnaW5hbCBjb25kaXRpb24sIHdlIG1pZ2h0IGJlIGF0IHRoZSBzdGFydCBvZiBhIGJyYW5kIG5ldyBwb29sCisgICAgICAgICAqIHdoZXJlIHRoZSBuZXh0VG9rZW4gaXMgMCBhbmQgbm90aGluZyBoYXMgYmVlbiBhbGxvY2F0ZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAobGltaXQgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIHNvbWUgdmVjdG9ycyBhbGxvY2F0ZWQgZnJvbSB0aGlzIHBvb2wKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yICh2ZWN0b3IgPSAwOyB2ZWN0b3IgPCBsaW1pdDsgdmVjdG9yKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTmV4dCBvbmUgaW4gdGhlIGNoYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY2hlY2sgPSBwb29sICsgdmVjdG9yOworCisgICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGUgZnJlZSBmdW5jdGlvbiBvbiBlYWNoIG9mIHRoZSB2ZWN0b3JzIGluIHRoZSBwb29sLAorICAgICAgICAgICAgICAgIC8vIHdoaWNoIGluIHR1cm4gd2lsbCBjYXVzZSBhbnkgZWxlbWVudHMgaXQgaG9sZHMgdGhhdCBhbHNvIGhhdmUgYSBmcmVlCisgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byBiZSBmcmVlZC4gSG93ZXZlciwgYmVjYXVzZSBhbnkgdmVjdG9yIG1heSBiZSBpbiBhbnkgb3RoZXIKKyAgICAgICAgICAgICAgICAvLyB2ZWN0b3IsIHdlIGRvbid0IGZyZWUgdGhlIGVsZW1lbnQgYWxsb2NhdGlvbnMgeWV0LiBXZSBkbyB0aGF0IGluIGEKKyAgICAgICAgICAgICAgICAvLyBhIHNwZWNpZmljIHBhc3MsIGNvbWluZyB1cCBuZXh0LiBUaGUgdmVjdG9yIGZyZWUgZnVuY3Rpb24ga25vd3MgdGhhdAorICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBmYWN0b3J5IGFsbG9jYXRlZCBwb29sIHZlY3RvciBhbmQgc28gaXQgd29uJ3QgZnJlZSB0aGluZ3MgaXQKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgY2hlY2stPmZyZWUoY2hlY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogV2UgaXRlcmF0ZSB0aGUgdmVjdG9yIHBvb2xzIG9uZSBhdCBhIHRpbWUgb25jZSBhZ2FpbiwgYnV0IHRoaXMgdGltZQorICAgICAqIHdlIGFyZSBnb2luZyB0byBmcmVlIHVwIGFueSBhbGxvY2F0ZWQgZWxlbWVudCBwb2ludGVycy4gTm90ZSB0aGF0IHdlIGFyZSBkb2luZyB0aGlzCisgICAgICogc28gdGhhdCB3ZSBkbyBub3QgdHJ5IHRvIHJlbGVhc2UgdmVjdG9ycyB0d2ljZS4gV2hlbiBidWlsZGluZyBBU1RzIHdlIGp1c3QgY29weQorICAgICAqIHRoZSB2ZWN0b3JzIGFsbCBvdmVyIHRoZSBwbGFjZSBhbmQgdGhleSBtYXkgYmUgZW1iZWRkZWQgaW4gdGhpcyB2ZWN0b3IgcG9vbAorICAgICAqIG51bWVyb3VzIHRpbWVzLgorICAgICAqLworICAgIGZvciAocG9vbENvdW50ID0gMDsgcG9vbENvdW50IDw9IGZhY3RvcnktPnRoaXNQb29sOyBwb29sQ291bnQrKykKKyAgICB7CisgICAgICAgIC8qIFBvaW50ZXIgdG8gY3VycmVudCBwb29sCisgICAgICAgICAqLworICAgICAgICBwb29sID0gZmFjdG9yeS0+cG9vbHNbcG9vbENvdW50XTsKKworICAgICAgICAvKiBXb3JrIG91dCBob3cgbWFueSB0b2tlbnMgd2UgbmVlZCB0byBjaGVjayBpbiB0aGlzIHBvb2wuCisgICAgICAgICAqLworICAgICAgICBsaW1pdCA9IChwb29sQ291bnQgPT0gZmFjdG9yeS0+dGhpc1Bvb2wgPyBmYWN0b3J5LT5uZXh0VmVjdG9yIDogQU5UTFIzX0ZBQ1RPUllfVlBPT0xfU0laRSk7CisKKyAgICAgICAgLyogTWFyZ2luYWwgY29uZGl0aW9uLCB3ZSBtaWdodCBiZSBhdCB0aGUgc3RhcnQgb2YgYSBicmFuZCBuZXcgcG9vbAorICAgICAgICAgKiB3aGVyZSB0aGUgbmV4dFRva2VuIGlzIDAgYW5kIG5vdGhpbmcgaGFzIGJlZW4gYWxsb2NhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGxpbWl0ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBzb21lIHZlY3RvcnMgYWxsb2NhdGVkIGZyb20gdGhpcyBwb29sCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAodmVjdG9yID0gMDsgdmVjdG9yIDwgbGltaXQ7IHZlY3RvcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5leHQgb25lIGluIHRoZSBjaGFpbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNoZWNrID0gcG9vbCArIHZlY3RvcjsKKworICAgICAgICAgICAgICAgIC8vIEFueXRoaW5nIGluIGhlcmUgc2hvdWxkIGJlIGZhY3RvcnkgbWFkZSwgYnV0IHdlIGRvIHRoaXMganVzdAorICAgICAgICAgICAgICAgIC8vIHRvIHRyaXBsZSBjaGVjay4gV2UganVzdCBmcmVlIHVwIHRoZSBlbGVtZW50cyBpZiB0aGV5IHdlcmUKKyAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQgYmV5b25kIHRoZSBpbnRlcm5hbCBzaXplLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKGNoZWNrLT5mYWN0b3J5TWFkZSA9PSBBTlRMUjNfVFJVRSAmJiBjaGVjay0+ZWxlbWVudHNTaXplID4gQU5UTFIzX1ZFQ1RPUl9JTlRFUk5BTF9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFIzX0ZSRUUoY2hlY2stPmVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2stPmVsZW1lbnRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBjYW4gbm93IGZyZWUgdGhpcyBwb29sIGFsbG9jYXRpb24gYXMgd2UgaGF2ZSBjYWxsZWQgZnJlZSBvbiBldmVyeSBlbGVtZW50IGluIGV2ZXJ5IHZlY3RvcgorICAgICAgICAvLyBhbmQgZnJlZWQgYW55IG1lbW9yeSBmb3IgcG9pbnRlcnMgdGhlIGdyZXcgYmV5b25kIHRoZSBpbnRlcm5hbCBzaXplIGxpbWl0LgorICAgICAgICAvLworICAgICAgICBBTlRMUjNfRlJFRShmYWN0b3J5LT5wb29sc1twb29sQ291bnRdKTsKKyAgICAgICAgZmFjdG9yeS0+cG9vbHNbcG9vbENvdW50XSA9IE5VTEw7CisgICAgfQorCisgICAgLyogQWxsIHRoZSBwb29scyBhcmUgZGVhbGxvY2F0ZWQgd2UgY2FuIGZyZWUgdGhlIHBvaW50ZXJzIHRvIHRoZSBwb29scworICAgICAqIG5vdy4KKyAgICAgKi8KKyAgICBBTlRMUjNfRlJFRShmYWN0b3J5LT5wb29scyk7CisKKyAgICAvKiBGaW5hbGx5LCB3ZSBjYW4gZnJlZSB0aGUgc3BhY2UgZm9yIHRoZSBmYWN0b3J5IGl0c2VsZgorICAgICAqLworICAgIEFOVExSM19GUkVFKGZhY3RvcnkpOworCit9CisKK3N0YXRpYyBwQU5UTFIzX1ZFQ1RPUgorbmV3VmVjdG9yKHBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlkgZmFjdG9yeSkKK3sKKyAgICBwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3I7CisKKwkvLyBJZiB3ZSBoYXZlIGFueXRoaW5nIG9uIHRoZSByZSBjbGFpbSBzdGFjaywgcmV1c2UgaXQKKwkvLworCXZlY3RvciA9IGZhY3RvcnktPmZyZWVTdGFjay0+cGVlayhmYWN0b3J5LT5mcmVlU3RhY2spOworCisJaWYgICh2ZWN0b3IgIT0gTlVMTCkKKwl7CisJCS8vIENvb2wgd2UgZ290IHNvbWV0aGluZyB3ZSBjb3VsZCByZXVzZQorCQkvLworCQlmYWN0b3J5LT5mcmVlU3RhY2stPnBvcChmYWN0b3J5LT5mcmVlU3RhY2spOworCisJCS8vIFRPRE86IHJlbW92ZSB0aGlzIGxpbmUgb25jZSBoYXBweSBwcmludGYoIlJldXNlZCB2ZWN0b3IgJTA4WCBmcm9tIHN0YWNrLCBzaXplIGlzIG5vdyAlZFxuIiwgdmVjdG9yLCBmYWN0b3J5LT5mcmVlU3RhY2stPnNpemUoZmFjdG9yeS0+ZnJlZVN0YWNrKSk7CisJCXJldHVybiB2ZWN0b3I7CisKKwl9CisKKwkvLyBTZWUgaWYgd2UgbmVlZCBhIG5ldyB2ZWN0b3IgcG9vbCBiZWZvcmUgYWxsb2NhdGluZyBhIG5ldworICAgIC8vIG9uZQorICAgIC8vCisgICAgaWYgKGZhY3RvcnktPm5leHRWZWN0b3IgPj0gQU5UTFIzX0ZBQ1RPUllfVlBPT0xfU0laRSkKKyAgICB7CisgICAgICAgIC8vIFdlIHJhbiBvdXQgb2YgdmVjdG9ycyBpbiB0aGUgY3VycmVudCBwb29sLCBzbyB3ZSBuZWVkIGEgbmV3IHBvb2wKKyAgICAgICAgLy8KKyAgICAgICAgbmV3UG9vbChmYWN0b3J5KTsKKyAgICB9CisKKyAgICAvLyBBc3N1bWluZyBldmVyeXRoaW5nIHdlbnQgd2VsbCAod2UgYXJlIHRyeWluZyBmb3IgcGVyZm9ybWFuY2UgaGVyZSBzbyBkb2luZyBtaW5pbWFsCisgICAgLy8gZXJyb3IgY2hlY2tpbmcuIFRoZW4gd2UgY2FuIHdvcmsgb3V0IHdoYXQgdGhlIHBvaW50ZXIgaXMgdG8gdGhlIG5leHQgdmVjdG9yLgorICAgIC8vCisgICAgdmVjdG9yID0gZmFjdG9yeS0+cG9vbHNbZmFjdG9yeS0+dGhpc1Bvb2xdICsgZmFjdG9yeS0+bmV4dFZlY3RvcjsKKyAgICBmYWN0b3J5LT5uZXh0VmVjdG9yKys7CisKKyAgICAvLyBXZSBoYXZlIG91ciB0b2tlbiBwb2ludGVyIG5vdywgc28gd2UgY2FuIGluaXRpYWxpemUgaXQgdG8gdGhlIHByZWRlZmluZWQgbW9kZWwuCisgICAgLy8KKyAgICBhbnRscjNTZXRWZWN0b3JBcGkodmVjdG9yLCBBTlRMUjNfVkVDVE9SX0lOVEVSTkFMX1NJWkUpOworICAgIHZlY3Rvci0+ZmFjdG9yeU1hZGUgPSBBTlRMUjNfVFJVRTsKKworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgcG9vbCB2ZWN0b3JzIGFyZSBjcmVhdGVkIGF0IHRoZSBkZWZhdWx0IHNpemUsIHdoaWNoIG1lYW5zIHRoZXkKKyAgICAvLyB3aWxsIHN0YXJ0IG9mZiB1c2luZyB0aGVpciBpbnRlcm5hbCBlbnRyeSBwb2ludGVycy4gV2UgbXVzdCBpbnRpYWxpemUgb3VyIHBvb2wgdmVjdG9yCisgICAgLy8gdG8gcG9pbnQgdG8gaXRzIG93biBpbnRlcm5hbCBlbnRyeSB0YWJsZSBhbmQgbm90IHRoZSBwcmUtbWFkZSBvbmUuCisgICAgLy8KKyAgICB2ZWN0b3ItPmVsZW1lbnRzID0gdmVjdG9yLT5pbnRlcm5hbDsKKworCQkvLyBUT0RPOiByZW1vdmUgdGhpcyBsaW5lIG9uY2UgaGFwcHkgcHJpbnRmKCJVc2VkIGEgbmV3IHZlY3RvciBhdCAlMDhYIGZyb20gdGhlIHBvb2xzIGFzIG5vdGhpbmcgb24gdGhlIHJldXN1ZSBzdGFja1xuIiwgdmVjdG9yKTsKKworICAgIC8vIEFuZCB3ZSBhcmUgZG9uZQorICAgIC8vCisgICAgcmV0dXJuIHZlY3RvcjsKK30KKworLyoqIEFycmF5IG9mIGxlZnQgbW9zdCBzaWduaWZpY2FudCBiaXQgcG9zaXRpb25zIGZvciBhbiA4IGJpdAorICogIGVsZW1lbnQgcHJvdmlkZXMgYW4gZWZmaWNpZW50IHdheSB0byBmaW5kIHRoZSBoaWdoZXN0IGJpdAorICogIHRoYXQgaXMgc2V0IGluIGFuIG4gYnl0ZSB2YWx1ZSAobj4wKS4gQXNzdW1pbmcgdGhlIHZhbHVlcyB3aWxsIGFsbCBoaXQgdGhlIGRhdGEgY2FjaGUsCisgKiAgY29kaW5nIHdpdGhvdXQgY29uZGl0aW9uYWwgZWxlbWVudHMgc2hvdWxkIGFsbG93IGJyYW5jaAorICogIHByZWRpY3Rpb24gdG8gd29yayB3ZWxsIGFuZCBvZiBjb3Vyc2UgYSBwYXJhbGxlbCBpbnN0cnVjdGlvbiBjYWNoZQorICogIHdpbGwgd2hpcCB0aHJvdWdoIHRoaXMuIE90aGVyd2lzZSB3ZSBtdXN0IGxvb3Agc2hpZnRpbmcgYSBvbmUKKyAqICBiaXQgYW5kIG1hc2tpbmcuIFRoZSB2YWx1ZXMgd2UgdGVuZCB0byBiZSBwbGFjaW5nIGluIG91dCBpbnRlZ2VyCisgKiAgcGF0cmljaWEgdHJpZSBhcmUgdXN1YWxseSBhIGxvdCBsb3dlciB0aGFuIHRoZSA2NCBiaXRzIHdlCisgKiAgYWxsb3cgZm9yIHRoZSBrZXkgYWxsb3dzLiBIZW5jZSB0aGVyZSBpcyBhIGxvdCBvZiByZWR1bmRhbnQgbG9vcGluZyBhbmQKKyAqICBzaGlmdGluZyBpbiBhIHdoaWxlIGxvb3AuIFdoZXJlYXMsIHRoZSBsb29rdXAgdGFibGUgaXMganVzdAorICogIGEgZmV3IGFuZHMgYW5kIGluZGlyZWN0IGxvb2t1cHMsIHdoaWxlIHRlc3RpbmcgZm9yIDAuIFRoaXMKKyAqICBpcyBsaWtlbHkgdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCBvbiBtYW55IHByb2Nlc3NvcnMgYXZhaWxhYmxlCisgKiAgd2hlbiBJIHdyb3RlIHRoaXMuIElmIHRoaXMgY29kZSBzdXJ2aXZlcyBhcyBsb25nIGFzIHlhY2MsIHRoZW4KKyAqICBJIG1heSBhbHJlYWR5IGJlIGRlYWQgYnkgdGhlIHRpbWUgeW91IHJlYWQgdGhpcyBhbmQgbWF5YmUgdGhlcmUgaXMKKyAqICBhIHNpbmdsZSBtYWNoaW5lIGluc3RydWN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gV2hhdAorICogIGVsc2UgYXJlIHlvdSBnb2luZyB0byBkbyB3aXRoIGFsbCB0aG9zZSB0cmFuc2lzdG9ycz8gSmltIDIwMDcKKyAqCisgKiBUaGUgdGFibGUgaXMgcHJvYmFibHkgb2J2aW91cyBidXQgaXQgaXMganVzdCB0aGUgbnVtYmVyIDAuLjcKKyAqIG9mIHRoZSBNU0IgaW4gZWFjaCBpbnRlZ2VyIHZhbHVlIDAuLjI1NgorICovCitzdGF0aWMgQU5UTFIzX1VJTlQ4IGJpdEluZGV4WzI1Nl0gPSAKK3sgCisgICAgMCwJCQkJCQkJCQkJCQkJLy8gMCAtIEp1c3QgZm9yIHBhZGRpbmcKKyAgICAwLAkJCQkJCQkJCQkJCQkvLyAxCisgICAgMSwgMSwJCQkJCQkJCQkJCQkvLyAyLi4zCisgICAgMiwgMiwgMiwgMiwJCQkJCQkJCQkJCS8vIDQuLjcKKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkJCQkJCQkJLy8gOCsKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAkgICAgLy8gMTYrCisgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwJICAgIC8vIDMyKworCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCSAgICAKKyAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkgICAgLy8gNjQrCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCSAgICAvLyAxMjgrCisJNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisJNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAKKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcKK307CisKKy8qKiBSYXRoZXIgdGhhbiB1c2UgdGhlIGJpdCBpbmRleCBvZiBhIHRyaWUgbm9kZSB0byBzaGlmdAorICogIDB4MDEgbGVmdCB0aGF0IG1hbnkgdGltZXMsIHRoZW4gJiB3aXRoIHRoZSByZXN1bHQsIGl0IGlzCisgKiAgZmFzdGVyIHRvIHVzZSB0aGUgYml0IGluZGV4IGFzIGFuIGluZGV4IGludG8gdGhpcyB0YWJsZQorICogIHdoaWNoIGhvbGRzIHByZWNvbXB1dGVkIG1hc2tzIGZvciBhbnkgb2YgdGhlIDY0IGJpdHMKKyAqICB3ZSBuZWVkIHRvIG1hc2sgb2ZmIHNpbmdseS4gVGhlIGRhdGEgdmFsdWVzIHdpbGwgc3RheSBpbgorICogIGNhY2hlIHdoaWxlIGV2ZXIgYSB0cmllIGlzIGluIGhlYXZ5IHVzZSwgc3VjaCBhcyBpbgorICogIG1lbW9pemF0aW9uLiBJdCBpcyBhbHNvIHByZXR0eSBlbm91Z2ggdG8gYmUgQVNDSUkgYXJ0LgorICovCitzdGF0aWMgQU5UTFIzX1VJTlQ2NCBiaXRNYXNrWzY0XSA9IAoreworICAgIDB4MDAwMDAwMDAwMDAwMDAwMVVMTCwgMHgwMDAwMDAwMDAwMDAwMDAyVUxMLCAweDAwMDAwMDAwMDAwMDAwMDRVTEwsIDB4MDAwMDAwMDAwMDAwMDAwOFVMTCwKKyAgICAweDAwMDAwMDAwMDAwMDAwMTBVTEwsIDB4MDAwMDAwMDAwMDAwMDAyMFVMTCwgMHgwMDAwMDAwMDAwMDAwMDQwVUxMLCAweDAwMDAwMDAwMDAwMDAwODBVTEwsCisgICAgMHgwMDAwMDAwMDAwMDAwMTAwVUxMLCAweDAwMDAwMDAwMDAwMDAyMDBVTEwsIDB4MDAwMDAwMDAwMDAwMDQwMFVMTCwgMHgwMDAwMDAwMDAwMDAwODAwVUxMLAorICAgIDB4MDAwMDAwMDAwMDAwMTAwMFVMTCwgMHgwMDAwMDAwMDAwMDAyMDAwVUxMLCAweDAwMDAwMDAwMDAwMDQwMDBVTEwsIDB4MDAwMDAwMDAwMDAwODAwMFVMTCwKKyAgICAweDAwMDAwMDAwMDAwMTAwMDBVTEwsIDB4MDAwMDAwMDAwMDAyMDAwMFVMTCwgMHgwMDAwMDAwMDAwMDQwMDAwVUxMLCAweDAwMDAwMDAwMDAwODAwMDBVTEwsCisgICAgMHgwMDAwMDAwMDAwMTAwMDAwVUxMLCAweDAwMDAwMDAwMDAyMDAwMDBVTEwsIDB4MDAwMDAwMDAwMDQwMDAwMFVMTCwgMHgwMDAwMDAwMDAwODAwMDAwVUxMLAorICAgIDB4MDAwMDAwMDAwMTAwMDAwMFVMTCwgMHgwMDAwMDAwMDAyMDAwMDAwVUxMLCAweDAwMDAwMDAwMDQwMDAwMDBVTEwsIDB4MDAwMDAwMDAwODAwMDAwMFVMTCwKKyAgICAweDAwMDAwMDAwMTAwMDAwMDBVTEwsIDB4MDAwMDAwMDAyMDAwMDAwMFVMTCwgMHgwMDAwMDAwMDQwMDAwMDAwVUxMLCAweDAwMDAwMDAwODAwMDAwMDBVTEwsCisgICAgMHgwMDAwMDAwMTAwMDAwMDAwVUxMLCAweDAwMDAwMDAyMDAwMDAwMDBVTEwsIDB4MDAwMDAwMDQwMDAwMDAwMFVMTCwgMHgwMDAwMDAwODAwMDAwMDAwVUxMLAorICAgIDB4MDAwMDAwMTAwMDAwMDAwMFVMTCwgMHgwMDAwMDAyMDAwMDAwMDAwVUxMLCAweDAwMDAwMDQwMDAwMDAwMDBVTEwsIDB4MDAwMDAwODAwMDAwMDAwMFVMTCwKKyAgICAweDAwMDAwMTAwMDAwMDAwMDBVTEwsIDB4MDAwMDAyMDAwMDAwMDAwMFVMTCwgMHgwMDAwMDQwMDAwMDAwMDAwVUxMLCAweDAwMDAwODAwMDAwMDAwMDBVTEwsCisgICAgMHgwMDAwMTAwMDAwMDAwMDAwVUxMLCAweDAwMDAyMDAwMDAwMDAwMDBVTEwsIDB4MDAwMDQwMDAwMDAwMDAwMFVMTCwgMHgwMDAwODAwMDAwMDAwMDAwVUxMLAorICAgIDB4MDAwMTAwMDAwMDAwMDAwMFVMTCwgMHgwMDAyMDAwMDAwMDAwMDAwVUxMLCAweDAwMDQwMDAwMDAwMDAwMDBVTEwsIDB4MDAwODAwMDAwMDAwMDAwMFVMTCwKKyAgICAweDAwMTAwMDAwMDAwMDAwMDBVTEwsIDB4MDAyMDAwMDAwMDAwMDAwMFVMTCwgMHgwMDQwMDAwMDAwMDAwMDAwVUxMLCAweDAwODAwMDAwMDAwMDAwMDBVTEwsCisgICAgMHgwMTAwMDAwMDAwMDAwMDAwVUxMLCAweDAyMDAwMDAwMDAwMDAwMDBVTEwsIDB4MDQwMDAwMDAwMDAwMDAwMFVMTCwgMHgwODAwMDAwMDAwMDAwMDAwVUxMLAorICAgIDB4MTAwMDAwMDAwMDAwMDAwMFVMTCwgMHgyMDAwMDAwMDAwMDAwMDAwVUxMLCAweDQwMDAwMDAwMDAwMDAwMDBVTEwsIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAorfTsKKworLyogSU5UIFRSSUUgSW1wbGVtZW50YXRpb24gb2YgZGVwdGggNjQgYml0cywgYmVpbmcgdGhlIG51bWJlciBvZiBiaXRzCisgKiBpbiBhIDY0IGJpdCBpbnRlZ2VyLiAKKyAqLworCitwQU5UTFIzX0lOVF9UUklFCithbnRscjNJbnRUcmllTmV3KEFOVExSM19VSU5UMzIgZGVwdGgpCit7CisJcEFOVExSM19JTlRfVFJJRQl0cmllOworCisJdHJpZSAgICA9IChwQU5UTFIzX0lOVF9UUklFKSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfSU5UX1RSSUUpKTsJLyogQmFzZSBtZW1vcnkgcmVxdWlyZWQJKi8KKworCWlmICh0cmllID09IE5VTEwpCisJeworCQlyZXR1cm4JKHBBTlRMUjNfSU5UX1RSSUUpIEFOVExSM19GVU5DX1BUUihBTlRMUjNfRVJSX05PTUVNKTsKKwl9CisKKwkvKiBOb3cgd2UgbmVlZCB0byBhbGxvY2F0ZSB0aGUgcm9vdCBub2RlLiBUaGlzIG1ha2VzIGl0IGVhc2llcgorCSAqIHRvIHVzZSB0aGUgdHJlZSBhcyB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgCisJICogZm9yIHRoZSByb290IG5vZGUuCisJICovCisJdHJpZS0+cm9vdAk9IChwQU5UTFIzX0lOVF9UUklFX05PREUpIEFOVExSM19DQUxMT0MoMSwgc2l6ZW9mKEFOVExSM19JTlRfVFJJRSkpOworCisJaWYgKHRyaWUtPnJvb3QgPT0gTlVMTCkKKwl7CisJCUFOVExSM19GUkVFKHRyaWUpOworCQlyZXR1cm4JKHBBTlRMUjNfSU5UX1RSSUUpIEFOVExSM19GVU5DX1BUUihBTlRMUjNfRVJSX05PTUVNKTsKKwl9CisKKwl0cmllLT5hZGQJPSBpbnRUcmllQWRkOworCXRyaWUtPmRlbAk9IGludFRyaWVEZWw7CisJdHJpZS0+ZnJlZQk9IGludFRyaWVGcmVlOworCXRyaWUtPmdldAk9IGludFRyaWVHZXQ7CisKKwkvKiBOb3cgd2Ugc2VlZCB0aGUgcm9vdCBub2RlIHdpdGggdGhlIGluZGV4IGJlaW5nIHRoZQorCSAqIGhpZ2hlc3QgbGVmdCBtb3N0IGJpdCB3ZSB3YW50IHRvIHRlc3QsIHdoaWNoIGxpbWl0cyB0aGUKKwkgKiBrZXlzIGluIHRoZSB0cmllLiBUaGlzIGlzIHRoZSB0cmllICdkZXB0aCcuIFRoZSBsaW1pdCBmb3IKKwkgKiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIDYzIChiaXRzIDAuLjYzKS4KKwkgKi8KKwl0cmllLT5yb290LT5iaXROdW0gPSBkZXB0aDsKKworCS8qIEFuZCBhcyB3ZSBoYXZlIG5vdGhpbmcgaW4gaGVyZSB5ZXQsIHdlIHNldCBib3RoIGNoaWxkIHBvaW50ZXJzCisJICogb2YgdGhlIHJvb3Qgbm9kZSB0byBwb2ludCBiYWNrIHRvIGl0c2VsZi4KKwkgKi8KKwl0cmllLT5yb290LT5sZWZ0Tgk9IHRyaWUtPnJvb3Q7CisJdHJpZS0+cm9vdC0+cmlnaHROCT0gdHJpZS0+cm9vdDsKKwl0cmllLT5jb3VudAkJCT0gMDsKKworCS8qIEZpbmFsbHksIG5vdGUgdGhhdCB0aGUga2V5IGZvciB0aGlzIHJvb3Qgbm9kZSBpcyAwIGJlY2F1c2UKKwkgKiB3ZSB1c2UgY2FsbG9jKCkgdG8gaW5pdGlhbGlzZSBpdC4KKwkgKi8KKworCXJldHVybiB0cmllOworfQorCisvKiogU2VhcmNoIHRoZSBpbnQgVHJpZSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVja2V0IGluZGV4ZWQKKyAqICBieSB0aGUga2V5IGlmIGl0IGlzIGNvbnRhaW5lZCBpbiB0aGUgdHJpZSwgb3RoZXJ3aXNlIE5VTEwuCisgKi8KK3N0YXRpYwlwQU5UTFIzX1RSSUVfRU5UUlkgICAKK2ludFRyaWVHZXQJKHBBTlRMUjNfSU5UX1RSSUUgdHJpZSwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisJcEFOVExSM19JTlRfVFJJRV9OT0RFICAgIHRoaXNOb2RlOyAKKwlwQU5UTFIzX0lOVF9UUklFX05PREUgICAgbmV4dE5vZGU7IAorCisJaWYgKHRyaWUtPmNvdW50ID09IDApCisJeworCQlyZXR1cm4gTlVMTDsJICAgIC8qIE5vdGhpbmcgaW4gdGhpcyB0cmllIHlldAkqLworCX0KKwkvKiBTdGFydGluZyBhdCB0aGUgcm9vdCBub2RlIGluIHRoZSB0cmllLCBjb21wYXJlIHRoZSBiaXQgaW5kZXgKKwkgKiBvZiB0aGUgY3VycmVudCBub2RlIHdpdGggaXRzIG5leHQgY2hpbGQgbm9kZSAoc3RhcnRzIGxlZnQgZnJvbSByb290KS4KKwkgKiBXaGVuIHRoZSBiaXQgaW5kZXggb2YgdGhlIGNoaWxkIG5vZGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBiaXQgaW5kZXggb2YgdGhlIGN1cnJlbnQgbm9kZQorCSAqIHRoZW4gYnkgZGVmaW5pdGlvbiAoYXMgdGhlIGJpdCBpbmRleCBkZWNyZWFzZXMgYXMgd2UgZGVzY2VudCB0aGUgdHJpZSkKKwkgKiB3ZSBoYXZlIHJlYWNoZWQgYSAnYmFja3dhcmQnIHBvaW50ZXIuIEEgYmFja3dhcmQgcG9pbnRlciBtZWFucyB3ZQorCSAqIGhhdmUgcmVhY2hlZCB0aGUgb25seSBub2RlIHRoYXQgY2FuIGJlIHJlYWNoZWQgYnkgdGhlIGJpdHMgZ2l2ZW4gdXMgc28gZmFyCisJICogYW5kIGl0IG11c3QgZWl0aGVyIGJlIHRoZSBrZXkgd2UgYXJlIGxvb2tpbmcgZm9yLCBvciBpZiBub3QgdGhlbiBpdAorCSAqIG1lYW5zIHRoZSBlbnRyeSB3YXMgbm90IGluIHRoZSB0cmllLCBhbmQgd2UgcmV0dXJuIE5VTEwuIEEgYmFja3dhcmQgcG9pbnRlcgorCSAqIHBvaW50cyBiYWNrIGluIHRvIHRoZSB0cmVlIHN0cnVjdHVyZSByYXRoZXIgdGhhbiBkb3duIChkZWVwZXIpIHdpdGhpbiB0aGUKKwkgKiB0cmVlIGJyYW5jaGVzLgorCSAqLworCXRoaXNOb2RlCT0gdHJpZS0+cm9vdDsJCS8qIFN0YXJ0IGF0IHRoZSByb290IG5vZGUJCSovCisJbmV4dE5vZGUJPSB0aGlzTm9kZS0+bGVmdE47CS8qIEV4YW1pbmUgdGhlIGxlZnQgbm9kZSBmcm9tIHRoZSByb290CSovCisKKwkvKiBXaGlsZSB3ZSBhcmUgZGVzY2VuZGluZyB0aGUgdHJlZSBub2Rlcy4uLgorCSAqLworCXdoaWxlICh0aGlzTm9kZS0+Yml0TnVtID4gbmV4dE5vZGUtPmJpdE51bSkKKwl7CisJCS8qIE5leHQgbm9kZSBub3cgYmVjb21lcyB0aGUgbmV3ICdjdXJyZW50JyBub2RlCisJCSAqLworCQl0aGlzTm9kZSAgICA9IG5leHROb2RlOworCisJCS8qIFdlIG5vdyB0ZXN0IHRoZSBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBiaXRtYXAgaW4gdGhlIG5leHQgbm9kZQorCQkgKiBpbiB0aGUga2V5IHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBUaGUgbmV3IG5leHQgbm9kZSBpcyB0aGUKKwkJICogcmlnaHQgbm9kZSBpZiB0aGF0IGJpdCBpcyBzZXQgYW5kIHRoZSBsZWZ0IG5vZGUgaXQgaXMgbm90LgorCQkgKi8KKwkJaWYgKGtleSAmIGJpdE1hc2tbbmV4dE5vZGUtPmJpdE51bV0pCisJCXsKKwkJCW5leHROb2RlID0gbmV4dE5vZGUtPnJpZ2h0TjsJLyogMSBpcyByaWdodAkqLworCQl9CisJCWVsc2UKKwkJeworCQkJbmV4dE5vZGUgPSBuZXh0Tm9kZS0+bGVmdE47CQkvKiAwIGlzIGxlZnQJKi8KKwkJfQorCX0KKworCS8qIEhlcmUgd2UgaGF2ZSByZWFjaGVkIGEgbm9kZSB3aGVyZSB0aGUgYml0TWFwIGluZGV4IGlzIGxvd2VyIHRoYW4KKwkgKiBpdHMgcGFyZW50LiBUaGlzIG1lYW5zIGl0IGlzIHBvaW50aW5nIGJhY2t3YXJkIGluIHRoZSB0cmVlIGFuZAorCSAqIG11c3QgdGhlcmVmb3JlIGJlIGEgdGVybWluYWwgbm9kZSwgYmVpbmcgdGhlIG9ubHkgcG9pbnQgdGhhbiBjYW4KKwkgKiBiZSByZWFjaGVkIHdpdGggdGhlIGJpdHMgc2VlbiBzbyBmYXIuIEl0IGlzIGVpdGhlciB0aGUgYWN0dWFsIGtleQorCSAqIHdlIHdhbnRlZCwgb3IgaWYgdGhhdCBrZXkgaXMgbm90IGluIHRoZSB0cmllIGl0IGlzIGFub3RoZXIga2V5CisJICogdGhhdCBpcyBjdXJyZW50bHkgdGhlIG9ubHkgb25lIHRoYXQgY2FuIGJlIHJlYWNoZWQgYnkgdGhvc2UgYml0cy4KKwkgKiBUaGF0IHNpdHVhdGlvbiB3b3VsZCBvYnZpb3VzbHkgY2hhbmdlIGlmIHRoZSBrZXkgd2FzIHRvIGJlIGFkZGVkCisJICogdG8gdGhlIHRyaWUuCisJICoKKwkgKiBIZW5jZSBpdCBvbmx5IHJlbWFpbnMgdG8gdGVzdCB3aGV0aGVyIHRoaXMgaXMgYWN0dWFsbHkgdGhlIGtleSBvciBub3QuCisJICovCisJaWYgKG5leHROb2RlLT5rZXkgPT0ga2V5KQorCXsKKwkJLyogVGhpcyB3YXMgdGhlIGtleSwgc28gcmV0dXJuIHRoZSBlbnRyeSBwb2ludGVyCisJCSAqLworCQlyZXR1cm4JbmV4dE5vZGUtPmJ1Y2tldHM7CisJfQorCWVsc2UKKwl7CisJCXJldHVybglOVUxMOwkvKiBUaGF0IGtleSBpcyBub3QgaW4gdGhlIHRyaWUgKG5vdGUgdGhhdCB3ZSBzZXQgdGhlIHBvaW50ZXIgdG8gLTEgaWYgbm8gcGF5bG9hZCkgKi8KKwl9Cit9CisKKworc3RhdGljCUFOVExSM19CT09MRUFOCQkKK2ludFRyaWVEZWwJKHBBTlRMUjNfSU5UX1RSSUUgdHJpZSwgQU5UTFIzX0lOVEtFWSBrZXkpCit7CisgICAgcEFOVExSM19JTlRfVFJJRV9OT0RFICAgcDsKKworICAgIHA9dHJpZS0+cm9vdDsKKyAgICBrZXkgPSBrZXk7CisKKyAgICByZXR1cm4gQU5UTFIzX0ZBTFNFOworfQorCisvKiogQWRkIGFuIGVudHJ5IGludG8gdGhlIElOVCB0cmllLgorICogIEJhc2ljYWxseSB3ZSBkZXNjZW5kIHRoZSB0cmllIGFzIHdlIGRvIHdoZW4gc2VhcmNoaW5nIGl0LCB3aGljaCB3aWxsCisgKiAgbG9jYXRlIHRoZSBvbmx5IG5vZGUgaW4gdGhlIHRyaWUgdGhhdCBjYW4gYmUgcmVhY2hlZCBieSB0aGUgYml0IHBhdHRlcm4gb2YgdGhlCisgKiAga2V5LiBJZiB0aGUga2V5IGlzIGFjdHVhbGx5IGF0IHRoYXQgbm9kZSwgdGhlbiBpZiB0aGUgdHJpZSBhY2NlcHRzIGR1cGxpY2F0ZXMKKyAqICB3ZSBhZGQgdGhlIHN1cHBsaWVkIGRhdGEgaW4gYSBuZXcgY2hhaW5lZCBidWNrZXQgdG8gdGhhdCBkYXRhIG5vZGUuIElmIGl0IGRvZXMKKyAqICBub3QgYWNjZXB0IGR1cGxpY2F0ZXMgdGhlbiB3ZSBtZXJlbHkgcmV0dXJuIEZBTFNFIGluIGNhc2UgdGhlIGNhbGxlciB3YW50cyB0byBrbm93CisgKiAgd2hldGhlciB0aGUga2V5IHdhcyBhbHJlYWR5IGluIHRoZSB0cmllLgorICogIElmIHRoZSBub2RlIHdlIGxvY2F0ZSBpcyBub3QgdGhlIGtleSB3ZSBhcmUgbG9va2luZyB0byBhZGQsIHRoZW4gd2UgaW5zZXJ0IGEgbmV3IG5vZGUKKyAqICBpbnRvIHRoZSB0cmllIHdpdGggYSBiaXQgaW5kZXggb2YgdGhlIGxlZnRtb3N0IGRpZmZlcmluZyBiaXQgYW5kIHRoZSBsZWZ0IG9yIHJpZ2h0IAorICogIG5vZGUgcG9pbnRpbmcgdG8gaXRzZWxmIG9yIHRoZSBkYXRhIG5vZGUgd2UgYXJlIGluc2VydGluZyAnYmVmb3JlJy4gCisgKi8KK3N0YXRpYwlBTlRMUjNfQk9PTEVBTgkJCitpbnRUcmllQWRkCShwQU5UTFIzX0lOVF9UUklFIHRyaWUsIEFOVExSM19JTlRLRVkga2V5LCBBTlRMUjNfVUlOVDMyIHR5cGUsIEFOVExSM19JTlRLRVkgaW50VmFsLCB2b2lkICogZGF0YSwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlcHRyKSh2b2lkICopKQoreworCXBBTlRMUjNfSU5UX1RSSUVfTk9ERSAgIHRoaXNOb2RlOworCXBBTlRMUjNfSU5UX1RSSUVfTk9ERSAgIG5leHROb2RlOworCXBBTlRMUjNfSU5UX1RSSUVfTk9ERSAgIGVudE5vZGU7CisJQU5UTFIzX1VJTlQzMgkJCWRlcHRoOworCXBBTlRMUjNfVFJJRV9FTlRSWQkgICAgbmV3RW50OworCXBBTlRMUjNfVFJJRV9FTlRSWQkgICAgbmV4dEVudDsKKwlBTlRMUjNfSU5US0VZCQkgICAgeG9yS2V5OworCisJLyogQ2FjaGUgdGhlIGJpdCBkZXB0aCBvZiB0aGlzIHRyaWUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgaGlnaGVzdCBpbmRleCwgCisJICogd2hpY2ggaXMgaW4gdGhlIHJvb3Qgbm9kZQorCSAqLworCWRlcHRoICAgPSB0cmllLT5yb290LT5iaXROdW07CisKKwl0aGlzTm9kZQk9IHRyaWUtPnJvb3Q7CQkvKiBTdGFydCB3aXRoIHRoZSByb290IG5vZGUJICAgICovCisJbmV4dE5vZGUJPSB0cmllLT5yb290LT5sZWZ0TjsJLyogQW5kIGFzc3VtZSB3ZSBzdGFydCB0byB0aGUgbGVmdCAgKi8KKworCS8qIE5vdyBmaW5kIHRoZSBvbmx5IG5vZGUgdGhhdCBjYW4gYmUgY3VycmVudGx5IHJlYWNoZWQgYnkgdGhlIGJpdHMgaW4gdGhlCisJICoga2V5IHdlIGFyZSBiZWluZyBhc2tlZCB0byBpbnNlcnQuCisJICovCisJd2hpbGUgKHRoaXNOb2RlLT5iaXROdW0gID4gbmV4dE5vZGUtPmJpdE51bSkKKwl7CisJCS8qIFN0aWxsIGRlc2NlbmRpbmcgdGhlIHN0cnVjdHVyZSwgbmV4dCBub2RlIGJlY29tZXMgY3VycmVudC4KKwkJICovCisJCXRoaXNOb2RlID0gbmV4dE5vZGU7CisKKwkJaWYgKGtleSAmIGJpdE1hc2tbbmV4dE5vZGUtPmJpdE51bV0pCisJCXsKKwkJCS8qIEJpdCBhdCB0aGUgcmVxdWlyZWQgaW5kZXggd2FzIDEsIHNvIHRyYXZlcnMgdGhlIHJpZ2h0IG5vZGUgZnJvbSBoZXJlCisJCQkgKi8KKwkJCW5leHROb2RlID0gbmV4dE5vZGUtPnJpZ2h0TjsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIEJpdCBhdCB0aGUgcmVxdWlyZWQgaW5kZXggd2FzIDAsIHNvIHdlIHRyYXZlcnNlIHRvIHRoZSBsZWZ0CisJCQkgKi8KKwkJCW5leHROb2RlID0gbmV4dE5vZGUtPmxlZnROOworCQl9CisJfQorCS8qIEhlcmUgd2UgaGF2ZSBsb2NhdGVkIHRoZSBvbmx5IG5vZGUgdGhhdCBjYW4gYmUgcmVhY2hlZCBieSB0aGUKKwkgKiBiaXRzIGluIHRoZSByZXF1ZXN0ZWQga2V5LiBJdCBjb3VsZCBpbiBmYWN0IGJlIHRoYXQga2V5IG9yIHRoZSBub2RlCisJICogd2UgbmVlZCB0byB1c2UgdG8gaW5zZXJ0IHRoZSBuZXcga2V5LgorCSAqLworCWlmIChuZXh0Tm9kZS0+a2V5ID09IGtleSkKKwl7CisJCS8qIFdlIGhhdmUgbG9jYXRlZCBhbiBleGFjdCBtYXRjaCwgYnV0IHdlIHdpbGwgb25seSBhcHBlbmQgdG8gdGhlIGJ1Y2tldCBjaGFpbgorCQkgKiBpZiB0aGlzIHRyaWUgYWNjZXB0cyBkdXBsaWNhdGUga2V5cy4KKwkJICovCisJCWlmICh0cmllLT5hbGxvd0R1cHMgPT1BTlRMUjNfVFJVRSkKKwkJeworCQkJLyogWWVzLCB3ZSBhcmUgYWNjZXB0aW5nIGR1cGxpY2F0ZXMKKwkJCSAqLworCQkJbmV3RW50ID0gKHBBTlRMUjNfVFJJRV9FTlRSWSlBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfVFJJRV9FTlRSWSkpOworCisJCQlpZiAobmV3RW50ID09IE5VTEwpCisJCQl7CisJCQkJLyogT3V0IG9mIG1lbW9yeSwgYWxsIHdlIGNhbiBkbyBpcyByZXR1cm4gdGhlIGZhY3QgdGhhdCB0aGUgaW5zZXJ0IGZhaWxlZC4KKwkJCQkgKi8KKwkJCQlyZXR1cm4JQU5UTFIzX0ZBTFNFOworCQkJfQorCisJCQkvKiBPdGhlcndpc2UgaW5zZXJ0IHRoaXMgaW4gdGhlIGNoYWluCisJCQkqLworCQkJbmV3RW50LT50eXBlCT0gdHlwZTsKKwkJCW5ld0VudC0+ZnJlZXB0cgk9IGZyZWVwdHI7CisJCQlpZiAodHlwZSA9PSBBTlRMUjNfSEFTSF9UWVBFX1NUUikKKwkJCXsKKwkJCQluZXdFbnQtPmRhdGEucHRyID0gZGF0YTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXdFbnQtPmRhdGEuaW50VmFsID0gaW50VmFsOworCQkJfQorCisJCQkvKiBXZSB3YW50IHRvIGJlIGFibGUgdG8gdHJhdmVyc2UgdGhlIHN0b3JlZCBlbGVtZW50cyBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUKKwkJCSAqIGFkZGVkIGFzIGR1cGxpY2F0ZSBrZXlzLiBXZSBtaWdodCBuZWVkIHRvIHJldmlzZSB0aGlzIG9waW5pb24gaWYgd2UgZW5kIHVwIGhhdmluZyBtYW55IGR1cGxpY2F0ZSBrZXlzCisJCQkgKiBhcyBwZXJoYXBzIHJldmVyc2Ugb3JkZXIgaXMganVzdCBhcyBnb29kLCBzbyBsb25nIGFzIGl0IGlzIG9yZGVyZWQuCisJCQkgKi8KKwkJCW5leHRFbnQgPSBuZXh0Tm9kZS0+YnVja2V0czsKKwkJCXdoaWxlIChuZXh0RW50LT5uZXh0ICE9IE5VTEwpCisJCQl7CisJCQkJbmV4dEVudCA9IG5leHRFbnQtPm5leHQ7ICAgIAorCQkJfQorCQkJbmV4dEVudC0+bmV4dCA9IG5ld0VudDsKKworCQkJdHJpZS0+Y291bnQrKzsKKwkJCXJldHVybiAgQU5UTFIzX1RSVUU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBXZSBmb3VuZCB0aGUga2V5IGlzIGFscmVhZHkgdGhlcmUgYW5kIHdlIGFyZSBub3QgYWxsb3dlZCBkdXBsaWNhdGVzIGluIHRoaXMKKwkJCSAqIHRyaWUuCisJCQkgKi8KKwkJCXJldHVybiAgQU5UTFIzX0ZBTFNFOworCQl9CisJfQorCisJLyogSGVyZSB3ZSBoYXZlIGRpc2NvdmVyZWQgdGhlIG9ubHkgbm9kZSB0aGF0IGNhbiBiZSByZWFjaGVkIGJ5IHRoZSBiaXRzIGluIHRoZSBrZXkKKwkgKiBidXQgd2UgaGF2ZSBmb3VuZCB0aGF0IHRoaXMgbm9kZSBpcyBub3QgdGhlIGtleSB3ZSBuZWVkIHRvIGluc2VydC4gV2UgbXVzdCBmaW5kIHRoZQorCSAqIHRoZSBsZWZ0bW9zdCBiaXQgYnkgd2hpY2ggdGhlIGN1cnJlbnQga2V5IGZvciB0aGF0IG5vZGUgYW5kIHRoZSBuZXcga2V5IHdlIGFyZSBnb2luZyAKKwkgKiB0byBpbnNlcnQsIGRpZmZlci4gV2hpbGUgdGhpcyBuZXN0ZWQgc2VyaWVzIG9mIGlmcyBtYXkgbG9vayBhIGJpdCBzdHJhbmdlLCBleHBlcmltZW50YXRpb24KKwkgKiBzaG93ZWQgdGhhdCBpdCBhbGxvd3MgYSBtYWNoaW5lIGNvZGUgcGF0aCB0aGF0IHdvcmtzIHdlbGwgd2l0aCBwcmVkaWNhdGVkIGV4ZWN1dGlvbgorCSAqLworCXhvcktleSA9IChrZXkgXiBuZXh0Tm9kZS0+a2V5KTsgICAvKiBHaXZlcyAxIGJpdHMgb25seSB3aGVyZSB0aGV5IGRpZmZlciB0aGVuIHdlIGZpbmQgdGhlIGxlZnQgbW9zdCAxIGJpdCovCisKKwkvKiBNb3N0IGNvbW1vbiBjYXNlIGlzIGEgMzIgYml0IGtleSByZWFsbHkKKwkgKi8KKyNpZmRlZglBTlRMUjNfVVNFXzY0QklUCisJaWYJKHhvcktleSAmIDB4RkZGRkZGRkYwMDAwMDAwMCkKKwl7CisJCWlmICAoeG9yS2V5ICYgMHhGRkZGMDAwMDAwMDAwMDAwKQorCQl7CisJCQlpZgkoeG9yS2V5ICYgMHhGRjAwMDAwMDAwMDAwMDAwKQorCQkJeworCQkJCWRlcHRoID0gNTYgKyBiaXRJbmRleFsoKHhvcktleSAmIDB4RkYwMDAwMDAwMDAwMDAwMCk+PjU2KV07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGVwdGggPSA0OCArIGJpdEluZGV4WygoeG9yS2V5ICYgMHgwMEZGMDAwMDAwMDAwMDAwKT4+NDgpXTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmCSh4b3JLZXkgJiAweDAwMDBGRjAwMDAwMDAwMDApCisJCQl7CisJCQkJZGVwdGggPSA0MCArIGJpdEluZGV4WygoeG9yS2V5ICYgMHgwMDAwRkYwMDAwMDAwMDAwKT4+NDApXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkZXB0aCA9IDMyICsgYml0SW5kZXhbKCh4b3JLZXkgJiAweDAwMDAwMEZGMDAwMDAwMDApPj4zMildOworCQkJfQorCQl9CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJaWYgICh4b3JLZXkgJiAweDAwMDAwMDAwRkZGRjAwMDApCisJCXsKKwkJCWlmCSh4b3JLZXkgJiAweDAwMDAwMDAwRkYwMDAwMDApCisJCQl7CisJCQkJZGVwdGggPSAyNCArIGJpdEluZGV4WygoeG9yS2V5ICYgMHgwMDAwMDAwMEZGMDAwMDAwKT4+MjQpXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkZXB0aCA9IDE2ICsgYml0SW5kZXhbKCh4b3JLZXkgJiAweDAwMDAwMDAwMDBGRjAwMDApPj4xNildOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYJKHhvcktleSAmIDB4MDAwMDAwMDAwMDAwRkYwMCkKKwkJCXsKKwkJCQlkZXB0aCA9IDggKyBiaXRJbmRleFsoKHhvcktleSAmIDB4MDAwMDAwMDAwMDAwMEZGMDApPj44KV07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGVwdGggPSBiaXRJbmRleFt4b3JLZXkgJiAweDAwMDAwMDAwMDAwMDAwRkZdOworCQkJfQorCQl9CisJfQorCisgICAgLyogV2UgaGF2ZSBsb2NhdGVkIHRoZSBsZWZ0bW9zdCBkaWZmZXJpbmcgYml0LCBpbmRpY2F0ZWQgYnkgdGhlIGRlcHRoIHZhcmlhYmxlLiBTbywgd2Uga25vdyB3aGF0CisgICAgICogYml0IGluZGV4IHdlIGFyZSB0byBpbnNlcnQgdGhlIG5ldyBlbnRyeSBhdC4gVGhlcmUgYXJlIHR3byBjYXNlcywgYmVpbmcgd2hlcmUgdGhlIHR3byBrZXlzCisgICAgICogZGlmZmVyIGF0IGEgYml0IHBvc2l0aW9uIHRoYXQgaXMgbm90IGN1cnJlbnRseSBwYXJ0IG9mIHRoZSBiaXQgdGVzdGluZywgd2hlcmUgdGhleSBkaWZmZXIgb24gYSBiaXQKKyAgICAgKiB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBza2lwcGVkIGluIHRoZSBpbmRleGVkIGNvbXBhcmlzb25zLCBhbmQgd2hlcmUgdGhleSBkaWZmZXIgb24gYSBiaXQKKyAgICAgKiB0aGF0IGlzIG1lcmVseSBsb3dlciBkb3duIGluIHRoZSBjdXJyZW50IGJpdCBzZWFyY2guIElmIHRoZSBiaXQgaW5kZXggd2VudCBiaXQgNCwgYml0IDIgYW5kIHRoZXkgZGlmZmVyCisgICAgICogYXQgYml0IDMsIHRoZW4gd2UgaGF2ZSB0aGUgInNraXBwZWQiIGJpdCBjYXNlLiBCdXQgaWYgdGhhdCBjaGFpbiB3YXMgQml0IDQsIEJpdCAyIGFuZCB0aGV5IGRpZmZlciBhdCBiaXQgMQorICAgICAqIHRoZW4gd2UgaGF2ZSB0aGUgZWFzeSBiaXQgPHB1bj4uCisgICAgICoKKyAgICAgKiBTbywgc2V0IHVwIHRvIGRlc2NlbmQgdGhlIHRyZWUgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgbG9va2luZyBmb3IgdGhlIGluc2VydCBwb2ludAorICAgICAqIGFjY29yZGluZyB0byB3aGV0aGVyIHdlIHNraXAgdGhlIGJpdCB0aGF0IGRpZmZlcnMgb3Igbm90LgorICAgICAqLworICAgIHRoaXNOb2RlCT0gdHJpZS0+cm9vdDsKKyAgICBlbnROb2RlCT0gdHJpZS0+cm9vdC0+bGVmdE47CisKKyAgICAvKiBOb3RlIHRoZSBzbGlnaHQgZGlmZmVyZW5jZSBpbiB0aGUgY2hlY2tzIGhlcmUgdG8gY292ZXIgYm90aCBjYXNlcworICAgICAqLworICAgIHdoaWxlICh0aGlzTm9kZS0+Yml0TnVtID4gZW50Tm9kZS0+Yml0TnVtICYmIGVudE5vZGUtPmJpdE51bSA+IGRlcHRoKQorICAgIHsKKwkvKiBTdGlsbCBkZXNjZW5kaW5nIHRoZSBzdHJ1Y3R1cmUsIG5leHQgbm9kZSBiZWNvbWVzIGN1cnJlbnQuCisJICovCisJdGhpc05vZGUgPSBlbnROb2RlOworCisJaWYgKGtleSAmIGJpdE1hc2tbZW50Tm9kZS0+Yml0TnVtXSkKKwl7CisJICAgIC8qIEJpdCBhdCB0aGUgcmVxdWlyZWQgaW5kZXggd2FzIDEsIHNvIHRyYXZlcnNlIHRoZSByaWdodCBub2RlIGZyb20gaGVyZQorCSAgICAgKi8KKwkgICAgZW50Tm9kZSA9IGVudE5vZGUtPnJpZ2h0TjsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogQml0IGF0IHRoZSByZXF1aXJlZCBpbmRleCB3YXMgMCwgc28gd2UgdHJhdmVyc2UgdG8gdGhlIGxlZnQKKwkgICAgICovCisJICAgIGVudE5vZGUgPSBlbnROb2RlLT5sZWZ0TjsKKwl9CisgICAgfQorCisgICAgLyogV2UgaGF2ZSBsb2NhdGVkIHRoZSBjb3JyZWN0IGluc2VydCBwb2ludCBmb3IgdGhpcyBuZXcga2V5LCBzbyB3ZSBuZWVkCisgICAgICogdG8gYWxsb2NhdGUgb3VyIGVudHJ5IGFuZCBpbnNlcnQgaXQgZXRjLgorICAgICAqLworICAgIG5leHROb2RlCT0gKHBBTlRMUjNfSU5UX1RSSUVfTk9ERSlBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfSU5UX1RSSUVfTk9ERSkpOworICAgIGlmIChuZXh0Tm9kZSA9PSBOVUxMKQorICAgIHsKKwkvKiBBbGwgdGhhdCB3b3JrIGFuZCBubyBtZW1vcnkgLSBidW1tZXIuCisJICovCisJcmV0dXJuCUFOVExSM19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBCdWlsZCBhIG5ldyBlbnRyeSBibG9jayBmb3IgdGhlIG5ldyBub2RlCisgICAgICovCisgICAgbmV3RW50ID0gKHBBTlRMUjNfVFJJRV9FTlRSWSlBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfVFJJRV9FTlRSWSkpOworCisgICAgaWYgKG5ld0VudCA9PSBOVUxMKQorICAgIHsKKwkvKiBPdXQgb2YgbWVtb3J5LCBhbGwgd2UgY2FuIGRvIGlzIHJldHVybiB0aGUgZmFjdCB0aGF0IHRoZSBpbnNlcnQgZmFpbGVkLgorCSAqLworCXJldHVybglBTlRMUjNfRkFMU0U7CisgICAgfQorCisgICAgLyogT3RoZXJ3aXNlIGVudGVyIHRoaXMgaW4gb3VyIG5ldyBub2RlCisgICAgKi8KKyAgICBuZXdFbnQtPnR5cGUJPSB0eXBlOworICAgIG5ld0VudC0+ZnJlZXB0cgk9IGZyZWVwdHI7CisgICAgaWYgKHR5cGUgPT0gQU5UTFIzX0hBU0hfVFlQRV9TVFIpCisgICAgeworCW5ld0VudC0+ZGF0YS5wdHIgPSBkYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworCW5ld0VudC0+ZGF0YS5pbnRWYWwgPSBpbnRWYWw7CisgICAgfQorICAgIC8qIEluc3RhbGwgaXQKKyAgICAgKi8KKyAgICBuZXh0Tm9kZS0+YnVja2V0cwk9IG5ld0VudDsKKyAgICBuZXh0Tm9kZS0+a2V5CT0ga2V5OworICAgIG5leHROb2RlLT5iaXROdW0JPSBkZXB0aDsKKworICAgIC8qIFdvcmsgb3V0IHRoZSByaWdodCBhbmQgbGVmdCBwb2ludGVycyBmb3IgdGhpcyBuZXcgbm9kZSwgd2hpY2ggaW52b2x2ZQorICAgICAqIHRlcm1pbmF0aW5nIHdpdGggdGhlIGN1cnJlbnQgZm91bmQgbm9kZSBlaXRoZXIgcmlnaHQgb3IgbGVmdCBhY2NvcmRpbmcKKyAgICAgKiB0byB3aGV0aGVyIHRoZSBjdXJyZW50IGluZGV4IGJpdCBpcyAxIG9yIDAKKyAgICAgKi8KKyAgICBpZiAoa2V5ICYgYml0TWFza1tkZXB0aF0pCisgICAgeworCW5leHROb2RlLT5sZWZ0TgkgICAgPSBlbnROb2RlOwkgICAgLyogVGVybWluYXRlcyBhdCBwcmV2aW91cyBwb3NpdGlvbgkqLworCW5leHROb2RlLT5yaWdodE4gICAgPSBuZXh0Tm9kZTsJICAgIC8qIFRlcm1pbmF0ZXMgd2l0aCBpdHNlbGYJCSovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisJbmV4dE5vZGUtPnJpZ2h0TiAgID0gZW50Tm9kZTsJICAgIC8qIFRlcm1pbmF0ZXMgYXQgcHJldmlvdXMgcG9zaXRpb24JKi8KKwluZXh0Tm9kZS0+bGVmdE4gICAgPSBuZXh0Tm9kZTsJICAgIC8qIFRlcm1pbmF0ZXMgd2l0aCBpdHNlbGYJCSovCQkKKyAgICB9CisKKyAgICAvKiBGaW5hbGx5LCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgcG9pbnRlcnMgYXQgdGhlIG5vZGUgd2UgbG9jYXRlZAorICAgICAqIGZvciBpbnNlcnRpbmcuIElmIHRoZSBrZXkgYml0IGF0IGl0cyBpbmRleCBpcyBzZXQgdGhlbiB0aGUgcmlnaHQKKyAgICAgKiBwb2ludGVyIGZvciB0aGF0IG5vZGUgYmVjb21lcyB0aGUgbmV3bHkgY3JlYXRlZCBub2RlLCBvdGhlcndpc2UgdGhlIGxlZnQgCisgICAgICogcG9pbnRlciBkb2VzLgorICAgICAqLworICAgIGlmIChrZXkgJiBiaXRNYXNrW3RoaXNOb2RlLT5iaXROdW1dICkKKyAgICB7CisJdGhpc05vZGUtPnJpZ2h0TiAgICA9IG5leHROb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXRoaXNOb2RlLT5sZWZ0TgkgICAgPSBuZXh0Tm9kZTsKKyAgICB9CisKKyAgICAvKiBFdCB2b2lsYQorICAgICAqLworICAgIHRyaWUtPmNvdW50Kys7CisgICAgcmV0dXJuICBBTlRMUjNfVFJVRTsKKworfQorLyoqIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCB0byB0aGlzIHRyZWUuCisgKiAgQmFzaWMgYWxnb3JpdGhtIGlzIHRoYXQgd2UgZG8gYSBkZXB0aCBmaXJzdCBsZWZ0IGRlc2NlbnQgYW5kIGZyZWUKKyAqICB1cCBhbnkgbm9kZXMgdGhhdCBhcmUgbm90IGJhY2t3YXJkIHBvaW50ZXJzLgorICovCitzdGF0aWMgdm9pZAorZnJlZUludE5vZGUocEFOVExSM19JTlRfVFJJRV9OT0RFIG5vZGUpCit7CisgICAgcEFOVExSM19UUklFX0VOVFJZCXRoaXNFbnRyeTsKKyAgICBwQU5UTFIzX1RSSUVfRU5UUlkJbmV4dEVudHJ5OworCisgICAgLyogSWYgdGhpcyBub2RlIGhhcyBhIGxlZnQgcG9pbnRlciB0aGF0IGlzIG5vdCBhIGJhY2sgcG9pbnRlcgorICAgICAqIHRoZW4gcmVjdXJzaXZlbHkgY2FsbCB0byBmcmVlIHRoaXMKKyAgICAgKi8KKyAgICBpZiAobm9kZS0+Yml0TnVtID4gbm9kZS0+bGVmdE4tPmJpdE51bSkKKyAgICB7CisJLyogV2UgaGF2ZSBhIGxlZnQgbm9kZSB0aGF0IG5lZWRzIGRlc2NlbmRpbmcsIHNvIGRvIGl0LgorCSAqLworCWZyZWVJbnROb2RlKG5vZGUtPmxlZnROKTsKKyAgICB9CisKKyAgICAvKiBUaGUgbGVmdCBub2RlcyBmcm9tIGhlcmUgc2hvdWxkIG5vdyBiZSBkZWFsdCB3aXRoLCBzbyAKKyAgICAgKiB3ZSBuZWVkIHRvIGRlc2NlbmQgYW55IHJpZ2h0IG5vZGVzIHRoYXQgYXJlIG5vdCBiYWNrIHBvaW50ZXJzCisgICAgICovCisgICAgaWYgKG5vZGUtPmJpdE51bSA+IG5vZGUtPnJpZ2h0Ti0+Yml0TnVtKQorICAgIHsKKwkvKiBUaGVyZSBhcmUgc29tZSByaWdodCBub2RlcyB0byBkZXNjZW5kIGFuZCBkZWFsIHdpdGguCisJICovCisJZnJlZUludE5vZGUobm9kZS0+cmlnaHROKTsKKyAgICB9CisKKyAgICAvKiBOb3cgYWxsIHRoZSBjaGlsZHJlbiBhcmUgZGVhbHQgd2l0aCwgd2UgY2FuIGRlc3Ryb3kKKyAgICAgKiB0aGlzIG5vZGUgdG9vCisgICAgICovCisgICAgdGhpc0VudHJ5CT0gbm9kZS0+YnVja2V0czsKKworICAgIHdoaWxlICh0aGlzRW50cnkgIT0gTlVMTCkKKyAgICB7CisJbmV4dEVudHJ5ICAgPSB0aGlzRW50cnktPm5leHQ7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGNhbGwgYSBjdXN0b20gZnJlZSBwb2ludGVyIGZvciB0aGlzIHN0cmluZyBlbnRyeT8KKwkgKi8KKwlpZiAodGhpc0VudHJ5LT50eXBlID09IEFOVExSM19IQVNIX1RZUEVfU1RSICYmIHRoaXNFbnRyeS0+ZnJlZXB0ciAhPSBOVUxMKQorCXsKKwkgICAgdGhpc0VudHJ5LT5mcmVlcHRyKHRoaXNFbnRyeS0+ZGF0YS5wdHIpOworCX0KKworCS8qIE5vdyBmcmVlIHRoZSBkYXRhIGZvciB0aGlzIGJ1Y2tldCBlbnRyeQorCSAqLworCUFOVExSM19GUkVFKHRoaXNFbnRyeSk7CisJdGhpc0VudHJ5ID0gbmV4dEVudHJ5OwkgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBhbnkgbW9yZSB0byBmcmVlICAgICovCisgICAgfQorCisgICAgLyogVGhlIGJ1Y2tldCBlbnRyeSBpcyBub3cgZ29uZSwgc28gd2UgY2FuIGZyZWUgdGhlIG1lbW9yeSBmb3IKKyAgICAgKiB0aGUgZW50cnkgaXRzZWxmLgorICAgICAqLworICAgIEFOVExSM19GUkVFKG5vZGUpOworCisgICAgLyogQW5kIHRoYXQgc2hvdWxkIGJlIGl0IGZvciBldmVyeXRoaW5nIHVuZGVyIHRoaXMgbm9kZSBhbmQgaXRzZWxmCisgICAgICovCit9CisKKy8qKiBDYWxsZWQgdG8gZnJlZSBhbGwgbm9kZXMgYW5kIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICovCitzdGF0aWMJdm9pZAkJCQoraW50VHJpZUZyZWUJKHBBTlRMUjNfSU5UX1RSSUUgdHJpZSkKK3sKKyAgICAvKiBEZXNjZW5kIGZyb20gdGhlIHJvb3QgYW5kIGZyZWUgYWxsIHRoZSBub2RlcworICAgICAqLworICAgIGZyZWVJbnROb2RlKHRyaWUtPnJvb3QpOworCisgICAgLyogdGhlIG5vZGVzIGFyZSBhbGwgZ29uZSBub3csIHNvIHdlIG5lZWQgb25seSBmcmVlIHRoZSBtZW1vcnkKKyAgICAgKiBmb3IgdGhlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICAgKi8KKyAgICBBTlRMUjNfRlJFRSh0cmllKTsKK30KKworCisvKioKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IEFOVExSMyB0b3BvbG9naWNhbCBzb3J0ZXIsIHdoaWNoIGNhbiBiZQorICogdXNlZCB0byBkZWZpbmUgZWRnZXMgdGhhdCBpZGVudGlmeSBudW1lcmljYWwgbm9kZSBpbmRleGVzIHRoYXQgZGVwZW5kIG9uIG90aGVyCisgKiBudW1lcmljYWwgbm9kZSBpbmRleGVzLCB3aGljaCBjYW4gdGhlbiBiZSBzb3J0ZWQgdG9wb2xvZ2ljYWxseSBzdWNoIHRoYXQKKyAqIGFueSBub2RlIGlzIHNvcnRlZCBhZnRlciBhbGwgaXRzIGRlcGVuZGVudCBub2Rlcy4KKyAqCisgKiBVc2U6CisgKgorICogL3ZlcmJhdGltCisKKyAgcEFOVExSM19UT1BPIHRvcG87CisgIHRvcG8gPSBhbnRscjNOZXdUb3BvKCk7CisKKyAgaWYgKHRvcG8gPT0gTlVMTCkgeyBvdXQgb2YgbWVtb3J5IH0KKworICB0b3BvLT5hZGRFZGdlKHRvcG8sIDMsIDApOyAvLyBOb2RlIDMgZGVwZW5kcyBvbiBub2RlIDAKKyAgdG9wby0+YWRkRWRnZSh0b3BvLCAwLCAxKTsgLy8gTm9kZSAtIGRlcGVuZHMgb24gbm9kZSAxCisgIHRvcG8tPnNvcnRWZWN0b3IodG9wbywgbXlWZWN0b3IpOyAvLyBTb3J0IHRoZSB2ZWN0b3IgaW4gcGxhY2UgKG5vZGUgbnVtYmVycyBhcmUgdGhlIHZlY3RvciBlbnRyeSBudW1iZXJzKQorCisgKiAvdmVyYmF0aW0KKyAqLworQU5UTFIzX0FQSSBwQU5UTFIzX1RPUE8KK2FudGxyM1RvcG9OZXcoKQoreworICAgIHBBTlRMUjNfVE9QTyB0b3BvID0gKHBBTlRMUjNfVE9QTylBTlRMUjNfTUFMTE9DKHNpemVvZihBTlRMUjNfVE9QTykpOworCisgICAgaWYgICh0b3BvID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcworICAgIC8vCisKKyAgICB0b3BvLT52aXNpdGVkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qga25vdyBob3cgYmlnIGl0IGlzIHlldAorICAgIHRvcG8tPmxpbWl0ICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvLyBObyBlZGdlcyBhZGRlZCB5ZXQKKyAgICB0b3BvLT5lZGdlcyAgICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgLy8gTm8gZWRnZXMgYWRkZWQgeWV0CisgICAgdG9wby0+c29ydGVkICAgID0gTlVMTDsgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgc29ydGVkIGF0IHRoZSBzdGFydAorICAgIHRvcG8tPmN5Y2xlICAgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAvLyBObyBjeWNsZXMgYXQgdGhlIHN0YXJ0CisgICAgdG9wby0+Y3ljbGVNYXJrID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIE5vIGN5Y2xlcyBhdCB0aGUgc3RhcnQKKyAgICB0b3BvLT5oYXNDeWNsZSAgPSBBTlRMUjNfRkFMU0U7ICAgICAgICAgLy8gTm8gY3ljbGUgYXQgdGhlIHN0YXJ0CisgICAgCisgICAgLy8gQVBJCisgICAgLy8KKyAgICB0b3BvLT5hZGRFZGdlICAgICAgID0gYWRkRWRnZTsKKyAgICB0b3BvLT5zb3J0VG9BcnJheSAgID0gc29ydFRvQXJyYXk7CisgICAgdG9wby0+c29ydFZlY3RvciAgICA9IHNvcnRWZWN0b3I7CisgICAgdG9wby0+ZnJlZSAgICAgICAgICA9IGZyZWVUb3BvOworCisgICAgcmV0dXJuIHRvcG87Cit9CisvLyBUb3BvbG9naWNhbCBzb3J0ZXIKKy8vCitzdGF0aWMgIHZvaWQKK2FkZEVkZ2UgICAgICAgICAgKHBBTlRMUjNfVE9QTyB0b3BvLCBBTlRMUjNfVUlOVDMyIGVkZ2UsIEFOVExSM19VSU5UMzIgZGVwZW5kZW5jeSkKK3sKKyAgICBBTlRMUjNfVUlOVDMyICAgaTsKKyAgICBBTlRMUjNfVUlOVDMyICAgbWF4RWRnZTsKKyAgICBwQU5UTFIzX0JJVFNFVCAgZWRnZURlcHM7CisKKyAgICBpZiAoZWRnZT5kZXBlbmRlbmN5KQorICAgIHsKKyAgICAgICAgbWF4RWRnZSA9IGVkZ2U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1heEVkZ2UgPSBkZXBlbmRlbmN5OworICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIGFkZCBhbiBlZGdlIHRvIHNheXMgdGhhdCB0aGUgbm9kZSBpbmRleGVkIGJ5ICdlZGdlJyBpcworICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgbm9kZSBpbmRleGVkIGJ5ICdkZXBlbmRlbmN5JworICAgIC8vCisKKyAgICAvLyBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBlbm91Z2ggcm9vbSBpbiB0aGUgZWRnZXMgYXJyYXkgdG8gYWRkIHRoZSBlZGdlPworICAgIC8vCisgICAgaWYgKHRvcG8tPmVkZ2VzID09IE5VTEwpCisgICAgeworICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFueSBlZGdlcyB5ZXQsIHNvIGNyZWF0ZSBhbiBhcnJheSB0byBob2xkIHRoZW0KKyAgICAgICAgLy8KKyAgICAgICAgdG9wby0+ZWRnZXMgPSBBTlRMUjNfQ0FMTE9DKHNpemVvZihwQU5UTFIzX0JJVFNFVCkgKiAobWF4RWRnZSArIDEpLCAxKTsKKyAgICAgICAgaWYgKHRvcG8tPmVkZ2VzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgbGltaXQgdG8gd2hhdCB3ZSBoYXZlIG5vdworICAgICAgICAvLworICAgICAgICB0b3BvLT5saW1pdCA9IG1heEVkZ2UgKyAxOworICAgIH0KKyAgICBlbHNlIGlmICh0b3BvLT5saW1pdCA8PSBtYXhFZGdlKQorICAgIHsKKyAgICAgICAgLy8gV0UgaGF2ZSBzb21lIGVkZ2VzIGJ1dCBub3QgZW5vdWdoCisgICAgICAgIC8vCisgICAgICAgIHRvcG8tPmVkZ2VzID0gQU5UTFIzX1JFQUxMT0ModG9wby0+ZWRnZXMsIHNpemVvZihwQU5UTFIzX0JJVFNFVCkgKiAobWF4RWRnZSArIDEpKTsKKyAgICAgICAgaWYgKHRvcG8tPmVkZ2VzID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG5ldyBiaXRtYXBzIHRvIDtpbmRpY2F0ZSB3ZSBoYXZlIG5vIGVkZ2VzIGRlZmluZWQgeWV0CisgICAgICAgIC8vCisgICAgICAgIGZvciAoaSA9IHRvcG8tPmxpbWl0OyBpIDw9IG1heEVkZ2U7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgKigodG9wby0+ZWRnZXMpICsgaSkgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRoZSBsaW1pdCB0byB3aGF0IHdlIGhhdmUgbm93CisgICAgICAgIC8vCisgICAgICAgIHRvcG8tPmxpbWl0ID0gbWF4RWRnZSArIDE7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGVkZ2Ugd2FzIGZsYWdnZWQgYXMgZGVwZW5kaW5nIG9uIGl0c2VsZiwgdGhlbiB3ZSBqdXN0CisgICAgLy8gZG8gbm90aGluZyBhcyBpdCBtZWFucyB0aGlzIHJvdXRpbmUgd2FzIGp1c3QgY2FsbGVkIHRvIGFkZCBpdAorICAgIC8vIGluIHRvIHRoZSBsaXN0IG9mIG5vZGVzLgorICAgIC8vCisgICAgaWYgIChlZGdlID09IGRlcGVuZGVuY3kpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUGljayB1cCB0aGUgYml0IG1hcCBmb3IgdGhlIHJlcXVlc3RlZCBlZGdlCisgICAgLy8KKyAgICBlZGdlRGVwcyA9ICooKHRvcG8tPmVkZ2VzKSArIGVkZ2UpOworCisgICAgaWYgIChlZGdlRGVwcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLy8gTm8gZWRnZXMgYXJlIGRlZmluZWQgeWV0IGZvciB0aGlzIG5vZGUKKyAgICAgICAgLy8KKyAgICAgICAgZWRnZURlcHMgICAgICAgICAgICAgICAgPSBhbnRscjNCaXRzZXROZXcoMCk7CisgICAgICAgICooKHRvcG8tPmVkZ2VzKSArIGVkZ2UpID0gZWRnZURlcHM7CisgICAgICAgIGlmIChlZGdlRGVwcyA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOyAgLy8gT3V0IG9mIG1lbW9yeQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBiaXQgaW4gdGhlIGJpdG1hcCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByZXF1ZXN0ZWQKKyAgICAvLyBkZXBlbmRlbmN5LgorICAgIC8vCisgICAgZWRnZURlcHMtPmFkZChlZGdlRGVwcywgZGVwZW5kZW5jeSk7CisKKyAgICAvLyBBbmQgd2UgYXJlIGFsbCBzZXQKKyAgICAvLworICAgIHJldHVybjsKK30KKworCisvKioKKyAqIEdpdmVuIGEgc3RhcnRpbmcgbm9kZSwgZGVzY2VuZCBpdHMgZGVwZW5kZW50IG5vZGVzIChvbmVzIHRoYXQgaXQgaGFzIGVkZ2VzCisgKiB0bykgdW50aWwgd2UgZmluZCBvbmUgd2l0aG91dCBlZGdlcy4gSGF2aW5nIGZvdW5kIGEgbm9kZSB3aXRob3V0IGVkZ2VzLCB3ZSBoYXZlCisgKiBkaXNjb3ZlcmVkIHRoZSBib3R0b20gb2YgYSBkZXB0aCBmaXJzdCBzZWFyY2gsIHdoaWNoIHdlIGNhbiB0aGVuIGFzY2VuZCwgYWRkaW5nCisgKiB0aGUgbm9kZXMgaW4gb3JkZXIgZnJvbSB0aGUgYm90dG9tLCB3aGljaCBnaXZlcyB1cyB0aGUgZGVwZW5kZW5jeSBvcmRlci4KKyAqLworc3RhdGljIHZvaWQKK0RGUyhwQU5UTFIzX1RPUE8gdG9wbywgQU5UTFIzX1VJTlQzMiBub2RlKQoreworICAgIHBBTlRMUjNfQklUU0VUIGVkZ2VzOworCisgICAgLy8gR3VhcmQgYWdhaW5zdCBhIHJldmlzaXQgYW5kIGNoZWNrIGZvciBjeWNsZXMKKyAgICAvLworICAgIGlmICAodG9wby0+aGFzQ3ljbGUgPT0gQU5UTFIzX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm47IC8vIFdlIGRvbid0IGRvIGFueXRoaW5nIGVsc2UgaWYgd2UgZm91bmQgYSBjeWNsZQorICAgIH0KKworICAgIGlmICAodG9wby0+dmlzaXRlZC0+aXNNZW1iZXIodG9wby0+dmlzaXRlZCwgbm9kZSkpCisgICAgeworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgZm91bmQgYSBjeWNsZS4gVG8gZG8gdGhpcyB3ZSBzZWFyY2ggdGhlCisgICAgICAgIC8vIGN1cnJlbnQgY3ljbGUgc3RhY2sgYW5kIHNlZSBpZiB3ZSBmaW5kIHRoaXMgbm9kZSBhbHJlYWR5IGluIHRoZSBzdGFjay4KKyAgICAgICAgLy8KKyAgICAgICAgQU5UTFIzX1VJTlQzMiAgIGk7CisKKyAgICAgICAgZm9yIChpPTA7IGk8dG9wby0+Y3ljbGVNYXJrOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICAodG9wby0+Y3ljbGVbaV0gPT0gbm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTdG9wISBXZSBmb3VuZCBhIGN5Y2xlIGluIHRoZSBpbnB1dCwgc28gcmVqaWcgdGhlIGN5Y2xlCisgICAgICAgICAgICAgICAgLy8gc3RhY2sgc28gdGhhdCBpdCBvbmx5IGNvbnRhaW5zIHRoZSBjeWNsZSBhbmQgc2V0IHRoZSBjeWNsZSBmbGFnCisgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2lsbCB0ZWxsIHRoZSBjYWxsZXIgd2hhdCBoYXBwZW5lZAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgQU5UTFIzX1VJTlQzMiBsOworCisgICAgICAgICAgICAgICAgZm9yIChsID0gaTsgbCA8IHRvcG8tPmN5Y2xlTWFyazsgbCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9wby0+Y3ljbGVbbCAtIGldID0gdG9wby0+Y3ljbGVbbF07ICAgIC8vIE1vdmUgdG8gemVybyBiYXNlIGluIHRoZSBjeWNsZSBsaXN0CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIGxpbWl0CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB0b3BvLT5jeWNsZU1hcmsgLT0gaTsKKworICAgICAgICAgICAgICAgIC8vIFNpZ25hbCBkaXNhc3RlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgdG9wby0+aGFzQ3ljbGUgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU28gZmFyLCBubyBjeWNsZXMgaGF2ZSBiZWVuIGZvdW5kIGFuZCB3ZSBoYXZlIG5vdCB2aXNpdGVkIHRoaXMgbm9kZSB5ZXQsCisgICAgLy8gc28gdGhpcyBub2RlIG5lZWRzIHRvIGdvIGludG8gdGhlIGN5Y2xlIHN0YWNrIGJlZm9yZSB3ZSBjb250aW51ZQorICAgIC8vIHRoZW4gd2Ugd2lsbCB0YWtlIGl0IG91dCBvZiB0aGUgc3RhY2sgb25jZSB3ZSBoYXZlIGRlc2NlbmRlZCBhbGwgaXRzCisgICAgLy8gZGVwZW5kZW5jaWVzLgorICAgIC8vCisgICAgdG9wby0+Y3ljbGVbdG9wby0+Y3ljbGVNYXJrKytdID0gbm9kZTsKKworICAgIC8vIEZpcnN0IGZsYWcgdGhhdCB3ZSBoYXZlIHZpc2l0ZWQgdGhpcyBub2RlCisgICAgLy8KKyAgICB0b3BvLT52aXNpdGVkLT5hZGQodG9wby0+dmlzaXRlZCwgbm9kZSk7CisKKyAgICAvLyBOb3csIGlmIHRoaXMgbm9kZSBoYXMgZWRnZXMsIHRoZW4gd2Ugd2FudCB0byBlbnN1cmUgd2UgdmlzaXQKKyAgICAvLyB0aGVtIGFsbCBiZWZvcmUgd2UgZHJvcCB0aHJvdWdoIGFuZCBhZGQgdGhpcyBub2RlIGludG8gdGhlIHNvcnRlZAorICAgIC8vIGxpc3QuCisgICAgLy8KKyAgICBlZGdlcyA9ICooKHRvcG8tPmVkZ2VzKSArIG5vZGUpOworICAgIGlmICAoZWRnZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIFdlIGhhdmUgc29tZSBlZGdlcywgc28gdmlzaXQgZWFjaCBvZiB0aGUgZWRnZSBub2RlcworICAgICAgICAvLyB0aGF0IGhhdmUgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkLgorICAgICAgICAvLworICAgICAgICBBTlRMUjNfVUlOVDMyICAgbnVtQml0czsJICAgIC8vIEhvdyBtYW55IGJpdHMgYXJlIGluIHRoZSBzZXQKKyAgICAgICAgQU5UTFIzX1VJTlQzMiAgIGk7CisgICAgICAgIEFOVExSM19VSU5UMzIgICByYW5nZTsKKworICAgICAgICBudW1CaXRzID0gZWRnZXMtPm51bUJpdHMoZWRnZXMpOworICAgICAgICByYW5nZSAgID0gZWRnZXMtPnNpemUoZWRnZXMpOyAgIC8vIE51bWJlciBvZiBzZXQgYml0cworCisgICAgICAgIC8vIFN0b3AgaWYgd2UgZXhhaHVzdCB0aGUgYml0IGxpc3Qgb3IgaGF2ZSBjaGVja2VkIHRoZQorICAgICAgICAvLyBudW1iZXIgb2YgZWRnZXMgdGhhdCB0aGlzIG5vZGUgcmVmZXJzIHRvIChzbyB3ZSBkb24ndAorICAgICAgICAvLyBjaGVjayBiaXRzIGF0IHRoZSBlbmQgdGhhdCBjYW5ub3QgcG9zc2libHkgYmUgc2V0KS4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yIChpPTA7IGk8PSBudW1CaXRzICYmIHJhbmdlID4gMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAgKGVkZ2VzLT5pc01lbWJlcihlZGdlcywgaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmFuZ2UtLTsgICAgICAgIC8vIEFib3V0IHRvIGNoZWNrIGFub3RoZXIgb25lCisKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBlZGdlLCBtYWtlIHN1cmUgd2UgdmlzaXQgYW5kIGRlc2NlbmQgaXQKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIERGUyh0b3BvLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEF0IHRoaXMgcG9pbnQgd2Ugd2lsbCBoYXZlIHZpc2l0ZWQgYWxsIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAvLyBvZiB0aGlzIG5vZGUgYW5kIHRoZXkgd2lsbCBiZSBvcmRlcmVkIChldmVuIGlmIHRoZXJlIGFyZSBjeWNsZXMpCisgICAgLy8gU28gd2UganVzdCBhZGQgdGhlIG5vZGUgaW50byB0aGUgc29ydGVkIGxpc3QgYXQgdGhlCisgICAgLy8gY3VycmVudCBpbmRleCBwb3NpdGlvbi4KKyAgICAvLworICAgIHRvcG8tPnNvcnRlZFt0b3BvLT5saW1pdCsrXSA9IG5vZGU7CisKKyAgICAvLyBSZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIGN5Y2xlIGxpc3QgaWYgd2UgaGF2ZSBub3QgZGV0ZWN0ZWQgYSBjeWNsZQorICAgIC8vCisgICAgaWYgICh0b3BvLT5oYXNDeWNsZSA9PSBBTlRMUjNfRkFMU0UpCisgICAgeworICAgICAgICB0b3BvLT5jeWNsZU1hcmstLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyAgcEFOVExSM19VSU5UMzIKK3NvcnRUb0FycmF5ICAgICAgKHBBTlRMUjNfVE9QTyB0b3BvKQoreworICAgIEFOVExSM19VSU5UMzIgdjsKKyAgICBBTlRMUjNfVUlOVDMyIG9sZExpbWl0OworCisgICAgLy8gR3VhcmQgYWdhaW5zdCBiZWluZyBjYWxsZWQgd2l0aCBubyBlZGdlcyBkZWZpbmVkCisgICAgLy8KKyAgICBpZiAgKHRvcG8tPmVkZ2VzID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gRmlyc3Qgd2UgbmVlZCBhIHZlY3RvciB0byBwb3B1bGF0ZSB3aXRoIGVub3VnaAorICAgIC8vIGVudHJpZXMgdG8gYWNjb21vZGF0ZSB0aGUgc29ydGVkIGxpc3QgYW5kIGFub3RoZXIgdG8gYWNjb21vZGF0ZQorICAgIC8vIHRoZSBtYXhpbXVtIGN5Y2xlIHdlIGNvdWxkIGRldGVjdCB3aGljaCBpcyBhbGwgbm9kZXMgc3VjaCBhcyAwLT4xLT4yLT4zLT4wCisgICAgLy8KKyAgICB0b3BvLT5zb3J0ZWQgICAgPSBBTlRMUjNfTUFMTE9DKHRvcG8tPmxpbWl0ICogc2l6ZW9mKEFOVExSM19VSU5UMzIpKTsKKyAgICB0b3BvLT5jeWNsZSAgICAgPSBBTlRMUjNfTUFMTE9DKHRvcG8tPmxpbWl0ICogc2l6ZW9mKEFOVExSM19VSU5UMzIpKTsKKworICAgIC8vIE5leHQgd2UgbmVlZCBhbiBlbXB0eSBiaXRzZXQgdG8gc2hvdyB3aGV0aGVyIHdlIGhhdmUgdmlzaXRlZCBhIG5vZGUKKyAgICAvLyBvciBub3QuIFRoaXMgaXMgdGhlIGJpdCB0aGF0IGdpdmVzIHVzIGxpbmVhciB0aW1lIG9mIGNvdXJzZSBhcyB3ZSBhcmUgZXNzZW50aWFsbHkKKyAgICAvLyBkcm9wcGluZyB0aHJvdWdoIHRoZSBub2RlcyBpbiBkZXB0aCBmaXJzdCBvcmRlciBhbmQgd2hlbiB3ZSBnZXQgdG8gYSBub2RlIHRoYXQKKyAgICAvLyBoYXMgbm8gZWRnZXMsIHdlIHBvcCBiYWNrIHVwIHRoZSBzdGFjayBhZGRpbmcgdGhlIG5vZGVzIHdlIHRyYXZlcnNlZCBpbiByZXZlcnNlCisgICAgLy8gb3JkZXIuCisgICAgLy8KKyAgICB0b3BvLT52aXNpdGVkICAgPSBhbnRscjNCaXRzZXROZXcoMCk7CisKKyAgICAvLyBOb3cgdHJhdmVyc2UgdGhlIG5vZGVzIGFzIGlmIHdlIHdlcmUganVzdCBnb2luZyBsZWZ0IHRvIHJpZ2h0LCBidXQKKyAgICAvLyB0aGVuIGRlc2NlbmQgZWFjaCBub2RlIHVubGVzcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQuCisgICAgLy8KKyAgICBvbGRMaW1pdCAgICA9IHRvcG8tPmxpbWl0OyAgICAgLy8gTnVtYmVyIG9mIG5vZGVzIHRvIHRyYXZlcnNlIGxpbmVhcmx5CisgICAgdG9wby0+bGltaXQgPSAwOyAgICAgICAgICAgICAgIC8vIE5leHQgZW50cnkgaW4gdGhlIHNvcnRlZCB0YWJsZQorCisgICAgZm9yICh2ID0gMDsgdiA8IG9sZExpbWl0OyB2KyspCisgICAgeworICAgICAgICAvLyBJZiB3ZSBkaWQgbm90IGFscmVhZHkgdmlzaXQgdGhpcyBub2RlLCB0aGVuIGRlc2NlbmQgaXQgdW50aWwgd2UKKyAgICAgICAgLy8gZ2V0IGEgbm9kZSB3aXRob3V0IGVkZ2VzIG9yIGFycml2ZSBhdCBhIG5vZGUgd2UgaGF2ZSBhbHJlYWR5IHZpc2l0ZWQuCisgICAgICAgIC8vCisgICAgICAgIGlmICAodG9wby0+dmlzaXRlZC0+aXNNZW1iZXIodG9wby0+dmlzaXRlZCwgdikgPT0gQU5UTFIzX0ZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdCB2aXNpdGVkIHRoaXMgb25lIHNvIGRlc2NlbmQgaXQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBERlModG9wbywgdik7CisgICAgICAgIH0KKworICAgICAgICAvLyBCcmVhayB0aGUgbG9vcCBpZiB3ZSBkZXRlY3QgYSBjeWNsZSBhcyB3ZSBoYXZlIG5vIG5lZWQgdG8gZ28gYW55CisgICAgICAgIC8vIGZ1cnRoZXIKKyAgICAgICAgLy8KKyAgICAgICAgaWYgICh0b3BvLT5oYXNDeWNsZSA9PSBBTlRMUjNfVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXNldCB0aGUgbGltaXQgdG8gdGhlIG51bWJlciB3ZSByZWNvcmRlZCBhcyBpZiB3ZSBoaXQgYQorICAgIC8vIGN5Y2xlLCB0aGVuIGxpbWl0IHdpbGwgaGF2ZSBzdG9wcGVkIGF0IHRoZSBub2RlIHdoZXJlIHdlCisgICAgLy8gZGlzY292ZXJlZCB0aGUgY3ljbGUsIGJ1dCBpbiBvcmRlciB0byBmcmVlIHRoZSBlZGdlIGJpdG1hcHMKKyAgICAvLyB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgd2UgbWF5IGhhdmUgYWxsb2NhdGVkIGFuZCB0cmF2ZXJzZSB0aGVtIGFsbC4KKyAgICAvLworICAgIHRvcG8tPmxpbWl0ID0gb2xkTGltaXQ7CisKKyAgICAvLyBIYXZpbmcgdHJhdmVyc2VkIGFsbCB0aGUgbm9kZXMgd2Ugd2VyZSBnaXZlbiwgd2UKKyAgICAvLyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIG9yZGVyZWQgYWxsIHRoZSBub2RlcyBvciBkZXRlY3RlZCBhCisgICAgLy8gY3ljbGUuCisgICAgLy8KKyAgICByZXR1cm4gdG9wby0+c29ydGVkOworfQorCitzdGF0aWMgIHZvaWQKK3NvcnRWZWN0b3IgICAgICAgKHBBTlRMUjNfVE9QTyB0b3BvLCBwQU5UTFIzX1ZFQ1RPUiB2KQoreworICAgIC8vIFRvIHNvcnQgYSB2ZWN0b3IsIHdlIGZpcnN0IHBlcmZvcm0gdGhlCisgICAgLy8gc29ydCB0byBhbiBhcnJheSwgdGhlbiB1c2UgdGhlIHJlc3VsdHMgdG8gcmVvcmRlciB0aGUgdmVjdG9yCisgICAgLy8gd2UgYXJlIGdpdmVuLiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSByb3V0aW5lIHRoYXQgYWxsb3dzIHlvdSB0bworICAgIC8vIHNvcnQgdGhlIGNoaWxkcmVuIG9mIGEgdHJlZSBub2RlIGludG8gdG9wb2xvZ2ljYWwgb3JkZXIgYmVmb3JlIG9yCisgICAgLy8gZHVyaW5nIGFuIEFTVCB3YWxrLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIG9wdGltaXphdGlvbnMgdGhhdCByZXF1aXJlCisgICAgLy8gZGFnIHJlb3JkZXJzIGFuZCBhbHNvIHdoZW4gdGhlIGlucHV0IHN0cmVhbSBkZWZpbmVzIHRoaWducyB0aGF0IGFyZQorICAgIC8vIGludGVyZGVwZW5kZW50IGFuZCB5b3Ugd2FudCB0byB3YWxrIHRoZSBsaXN0IG9mIHRoZSBnZW5lcmF0ZWQgdHJlZXMKKyAgICAvLyBmb3IgdGhvc2UgdGhpbmdzIGluIHRvcG9sb2dpY2FsIG9yZGVyIHNvIHlvdSBjYW4gaWdub3JlIHRoZSBpbnRlcmRlcGVuZGVuY2llcworICAgIC8vIGF0IHRoYXQgcG9pbnQuCisgICAgLy8KKyAgICBBTlRMUjNfVUlOVDMyIGk7CisKKyAgICAvLyBVc2VkIGFzIGEgbG9va3VwIGluZGV4IHRvIGZpbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIHZlY3RvciBvZgorICAgIC8vIHRoZSB2ZWN0b3IgZW50cnkgdGhhdCB3YXMgb3JpZ2luYWxseSBhdCBwb3NpdGlvbiBbMF0sIFsxXSwgWzJdIGV0YworICAgIC8vCisgICAgcEFOVExSM19VSU5UMzIgIHZJbmRleDsKKworICAgIC8vIFNvcnQgaW50byBhbiBhcnJheSwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBhcnJheSB0aGF0IGlzCisgICAgLy8gc3RvcmVkIGluIHRoZSB0b3BvCisgICAgLy8KKyAgICBpZiAgKHRvcG8tPnNvcnRUb0FycmF5KHRvcG8pID09IDApCisgICAgeworICAgICAgICByZXR1cm47ICAgICAvLyBUaGVyZSB3ZXJlIG5vIGVkZ2VzCisgICAgfQorCisgICAgaWYgICh0b3BvLT5oYXNDeWNsZSA9PSBBTlRMUjNfVFJVRSkKKyAgICB7CisgICAgICAgIHJldHVybjsgIC8vIERvIG5vdGhpbmcgaWYgd2UgZGV0ZWN0ZWQgYSBjeWNsZQorICAgIH0KKworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSB2ZWN0b3Igd2UgYXJlIHNvcnRpbmcgaXMgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZQorICAgIC8vIHRoZSBpbnB1dCBzZXF1ZW5jZSB3ZSB3ZXJlIGFkc2tlZCB0byBzb3J0LiBJdCBkb2VzIG5vdCBtYXR0ZXIgaWYgaXQgaXMKKyAgICAvLyBiaWdnZXIgYXMgdGhhYXQgcHJvYmFibHkganVzdCBtZWFucyB0aGF0IG5vZGVzIG51bWJlcmVkIGhpZ2hlciB0aGFuIHRoZQorICAgIC8vIGxpbWl0IGhhZCBubyBkZXBlbmRlbmNpZXMgYW5kIHNvIGNhbiBiZSBsZWZ0IGFsb25lLgorICAgIC8vCisgICAgaWYgICh0b3BvLT5saW1pdCA+IHYtPmNvdW50KQorICAgIHsKKyAgICAgICAgLy8gV2UgY2FuIG9ubHkgc29ydCB0aGUgZW50cmllcyB0aGF0IHdlIGhhdmUgZHVkZSEgVGhlIGNhbGxlciBpcworICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhlIHZlY3RvciBpcyB0aGUgY29ycmVjdCBvbmUgYW5kIGlzIHRoZQorICAgICAgICAvLyBjb3JyZWN0IHNpemUgZXRjLgorICAgICAgICAvLworICAgICAgICB0b3BvLT5saW1pdCA9IHYtPmNvdW50OworICAgIH0KKyAgICAvLyBXZSBuZWVkIHRvIGtub3cgdGhlIGxvY2F0aW9ucyBvZiBlYWNoIG9mIHRoZSBlbnRyaWVzCisgICAgLy8gaW4gdGhlIHZlY3RvciBhcyB3ZSBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSB0aGVtIGluIGEgbmV3IHZlY3Rvci4gV2UKKyAgICAvLyBqdXN0IHVzZSBhbiBpbmRpcmVjdGlvbiB0YWJsZSB0byBnZXQgdGhlIHZlY3RvciBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHNlcXVlbmNlCisgICAgLy8gYWNvcmRpbmcgdG8gd2hlcmUgd2UgbW92ZWQgaXQgbGFzdC4gVGhlbiB3ZSBjYW4ganVzdCBzd2FwIHZlY3RvciBlbnRyaWVzIHVudGlsCisgICAgLy8gd2UgYXJlIGRvbmUgOi0pCisgICAgLy8KKyAgICB2SW5kZXggPSBBTlRMUjNfTUFMTE9DKHRvcG8tPmxpbWl0ICogc2l6ZW9mKEFOVExSM19VSU5UMzIpKTsKKworICAgIC8vIFN0YXJ0IGluZGV4LCBlYWNoIHZlY3RvciBlbnRyeSBpcyBsb2NhdGVkIHdoZXJlIHlvdSB0aGluayBpdCBpcworICAgIC8vCisgICAgZm9yIChpID0gMDsgaSA8IHRvcG8tPmxpbWl0OyBpKyspCisgICAgeworICAgICAgICB2SW5kZXhbaV0gPSBpOworICAgIH0KKworICAgIC8vIE5vdyB3ZSB0cmF2ZXJzZSB0aGUgc29ydGVkIGFycmF5IGFuZCBtb3ZlZCB0aGUgZW50cmllcyBvZgorICAgIC8vIHRoZSB2ZWN0b3IgYXJvdW5kIGFjY29yZGluZyB0byB0aGUgc29ydCBvcmRlciBhbmQgdGhlIGluZGlyZWN0aW9uCisgICAgLy8gdGFibGUgd2UganVzdCBjcmVhdGVkLiBUaGUgaW5kZXggdGVsc2wgdXMgd2hlcmUgaW4gdGhlIHZlY3RvciB0aGUKKyAgICAvLyBvcmlnaW5hbCBlbGVtZW50IGVudHJ5IG4gaXMgbm93IGxvY2F0ZWQgdmlhIHZJbmRleFtuXS4KKyAgICAvLworICAgIGZvciAoaT0wOyBpIDwgdG9wby0+bGltaXQ7IGkrKykKKyAgICB7CisgICAgICAgIEFOVExSM19VSU5UMzIgICBpbmQ7CisKKyAgICAgICAgLy8gSWYgdGhlIHZlY3RvciBlbnRyeSBhdCBpIGlzIGFscmVhZHkgdGhlIG9uZSB0aGF0IGl0CisgICAgICAgIC8vIHNob3VsZCBiZSwgdGhlbiB3ZSBza2lwIG1vdmluZyBpdCBvZiBjb3Vyc2UuCisgICAgICAgIC8vCisgICAgICAgIGlmICAodkluZGV4W3RvcG8tPnNvcnRlZFtpXV0gPT0gaSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgdmVjdG9yIGVudHJ5IGF0IGksIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZQorICAgICAgICAvLyB2ZWN0b3IgZW50cnkgaW5kaWNhdGVkIGJ5IHRvcG8tPnNvcnRlZFtpXS4gVGhlIHZlY3RvciBlbnRyeQorICAgICAgICAvLyBhdCB0b3BvLT5zb3J0ZWRbaV0gbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHN3YXBwZWQgb3V0IHRob3VnaCwgc28gd2UKKyAgICAgICAgLy8gZmluZCB3aGVyZSBpdCBpcyBub3cgYW5kIG1vdmUgaXQgZnJvbSB0aGVyZSB0byBpLgorICAgICAgICAvLworICAgICAgICBpbmQgICAgID0gdkluZGV4W3RvcG8tPnNvcnRlZFtpXV07CisgICAgICAgIHYtPnN3YXAodiwgaSwgaW5kKTsKKworICAgICAgICAvLyBVcGRhdGUgb3VyIGluZGV4LiBUaGUgZWxlbWVudCBhdCBpIGlzIG5vdyB0aGUgb25lIHdlIHdhbnRlZAorICAgICAgICAvLyB0byBiZSBzb3J0ZWQgaGVyZSBhbmQgdGhlIGVsZW1lbnQgd2Ugc3dhcHBlZCBvdXQgaXMgbm93IHRoZQorICAgICAgICAvLyBlbGVtZW50IHRoYXQgd2FzIGF0IGkganVzdCBiZWZvcmUgd2Ugc3dhcHBlZCBpdC4gSWYgeW91IGFyZSBsb3N0IG5vdworICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBpdCwgd2UgYXJlIGp1c3QgcmVpbmRleGluZyBvbiB0aGUgZmx5IGlzIGFsbC4KKyAgICAgICAgLy8KKyAgICAgICAgdkluZGV4W3RvcG8tPnNvcnRlZFtpXV0gPSBpOworICAgICAgICB2SW5kZXhbaV0gPSBpbmQ7CisgICAgfQorCisgICAgLy8gSGF2aW5nIHRyYXZlcnNlZCBhbGwgdGhlIGVudHJpZXMsIHdlIGhhdmUgc29ydGVkIHRoZSB2ZWN0b3IgaW4gcGxhY2UuCisgICAgLy8KKyAgICBBTlRMUjNfRlJFRSh2SW5kZXgpOworICAgIHJldHVybjsKK30KKworc3RhdGljICB2b2lkCitmcmVlVG9wbyAgICAgICAgICAgICAocEFOVExSM19UT1BPIHRvcG8pCit7CisgICAgQU5UTFIzX1VJTlQzMiAgIGk7CisKKyAgICAvLyBGcmVlIHRoZSByZXN1bHQgdmVjdG9yCisgICAgLy8KKyAgICBpZiAgKHRvcG8tPnNvcnRlZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgQU5UTFIzX0ZSRUUodG9wby0+c29ydGVkKTsKKyAgICAgICAgdG9wby0+c29ydGVkID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoZSB2aXNpdGVkIG1hcAorICAgIC8vCisgICAgaWYgICh0b3BvLT52aXNpdGVkICE9IE5VTEwpCisgICAgeworCisgICAgICAgIHRvcG8tPnZpc2l0ZWQtPmZyZWUodG9wby0+dmlzaXRlZCk7CisgICAgICAgIHRvcG8tPnZpc2l0ZWQgPSBOVUxMOworICAgIH0KKworICAgIC8vIEZyZWUgYW55IGVkZ2VtYXBzCisgICAgLy8KKyAgICBpZiAgKHRvcG8tPmVkZ2VzICE9IE5VTEwpCisgICAgeworICAgICAgICBwQU5UTFIzX0JJVFNFVCBlZGdlTGlzdDsKKworICAgICAgICAKKyAgICAgICAgZm9yIChpPTA7IGk8dG9wby0+bGltaXQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZWRnZUxpc3QgPSAqKCh0b3BvLT5lZGdlcykgKyBpKTsKKyAgICAgICAgICAgIGlmICAoZWRnZUxpc3QgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlZGdlTGlzdC0+ZnJlZShlZGdlTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTlRMUjNfRlJFRSh0b3BvLT5lZGdlcyk7CisgICAgfQorICAgIHRvcG8tPmVkZ2VzID0gTlVMTDsKKyAgICAKKyAgICAvLyBGcmVlIGFueSBjeWNsZSBtYXAKKyAgICAvLworICAgIGlmICAodG9wby0+Y3ljbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEFOVExSM19GUkVFKHRvcG8tPmN5Y2xlKTsKKyAgICB9CisKKyAgICBBTlRMUjNfRlJFRSh0b3BvKTsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbW1vbnRva2VuLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb21tb250b2tlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Mjc0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb21tb250b2tlbi5jCkBAIC0wLDAgKzEsNTg2IEBACisvKioKKyAqIENvbnRhaW5zIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tb24gdG9rZW4gdXNlZCB3aXRoaW4KKyAqIGphdmEuIEN1c3RvbSB0b2tlbnMgc2hvdWxkIGNyZWF0ZSB0aGlzIHN0cnVjdHVyZSBhbmQgdGhlbiBhcHBlbmQgdG8gaXQgdXNpbmcgdGhlIAorICogY3VzdG9tIHBvaW50ZXIgdG8gaW5zdGFsbCB0aGVpciBvd24gc3RydWN0dXJlIGFuZCBBUEkuCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzLmg+CisKKy8qIFRva2VuIEFQSQorICovCitzdGF0aWMgIHBBTlRMUjNfU1RSSU5HCWdldFRleHQJCQkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbik7CitzdGF0aWMgIHZvaWQJCQlzZXRUZXh0CQkJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4sIHBBTlRMUjNfU1RSSU5HIHRleHQpOworc3RhdGljICB2b2lkCQkJc2V0VGV4dDgJCQkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworc3RhdGljCUFOVExSM19VSU5UMzIgICBnZXRUeXBlCQkJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworc3RhdGljICB2b2lkCQkJc2V0VHlwZQkJCQkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuLCBBTlRMUjNfVUlOVDMyIHR5cGUpOworc3RhdGljICBBTlRMUjNfVUlOVDMyICAgZ2V0TGluZQkJCQkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKK3N0YXRpYyAgdm9pZAkJCXNldExpbmUJCQkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX1VJTlQzMiBsaW5lKTsKK3N0YXRpYyAgQU5UTFIzX0lOVDMyICAgIGdldENoYXJQb3NpdGlvbkluTGluZQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworc3RhdGljICB2b2lkCQkJc2V0Q2hhclBvc2l0aW9uSW5MaW5lCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX0lOVDMyIHBvcyk7CitzdGF0aWMgIEFOVExSM19VSU5UMzIgICBnZXRDaGFubmVsCQkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbik7CitzdGF0aWMgIHZvaWQJCQlzZXRDaGFubmVsCQkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX1VJTlQzMiBjaGFubmVsKTsKK3N0YXRpYyAgQU5UTFIzX01BUktFUiAgIGdldFRva2VuSW5kZXgJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworc3RhdGljICB2b2lkCQkJc2V0VG9rZW5JbmRleAkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX01BUktFUik7CitzdGF0aWMgIEFOVExSM19NQVJLRVIgICBnZXRTdGFydEluZGV4CQkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKK3N0YXRpYyAgdm9pZAkJCXNldFN0YXJ0SW5kZXgJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4sIEFOVExSM19NQVJLRVIgaW5kZXgpOworc3RhdGljICBBTlRMUjNfTUFSS0VSICAgZ2V0U3RvcEluZGV4CQkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKK3N0YXRpYyAgdm9pZAkJCXNldFN0b3BJbmRleAkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX01BUktFUiBpbmRleCk7CitzdGF0aWMgIHBBTlRMUjNfU1RSSU5HICB0b1N0cmluZwkJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pOworCisvKiBGYWN0b3J5IEFQSQorICovCitzdGF0aWMJdm9pZAkJCWZhY3RvcnlDbG9zZQkocEFOVExSM19UT0tFTl9GQUNUT1JZIGZhY3RvcnkpOworc3RhdGljCXBBTlRMUjNfQ09NTU9OX1RPS0VOCW5ld1Rva2VuCSh2b2lkKTsKK3N0YXRpYyAgdm9pZAkJCXNldElucHV0U3RyZWFtCShwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgZmFjdG9yeSwgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpOworc3RhdGljCXZvaWQgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlSZXNldCAgICAocEFOVExSM19UT0tFTl9GQUNUT1JZIGZhY3RvcnkpOworCisvKiBJbnRlcm5hbCBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICovCitzdGF0aWMJdm9pZAkJCW5ld1Bvb2wJCShwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgZmFjdG9yeSk7CitzdGF0aWMJcEFOVExSM19DT01NT05fVE9LRU4gICAgbmV3UG9vbFRva2VuCShwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgZmFjdG9yeSk7CisKKworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UT0tFTgorYW50bHIzQ29tbW9uVG9rZW5OZXcoQU5UTFIzX1VJTlQzMiB0dHlwZSkKK3sKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0b2tlbjsKKworCS8vIENyZWF0ZSBhIHJhdyB0b2tlbiB3aXRoIHRoZSBpbnRlcmZhY2UgaW5zdGFsbGVkCisJLy8KKwl0b2tlbiAgID0gbmV3VG9rZW4oKTsKKworCWlmCSh0b2tlbiAhPSBOVUxMKQorCXsKKwkJdG9rZW4tPnNldFR5cGUodG9rZW4sIHR0eXBlKTsKKwl9CisKKwkvLyBBbGwgZ29vZAorCS8vCisJcmV0dXJuICB0b2tlbjsKK30KKworQU5UTFIzX0FQSSBwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkKK2FudGxyM1Rva2VuRmFjdG9yeU5ldyhwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCkKK3sKKyAgICBwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgICBmYWN0b3J5OworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5CisgICAgICovCisgICAgZmFjdG9yeQk9IChwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkpIEFOVExSM19NQUxMT0MoKHNpemVfdClzaXplb2YoQU5UTFIzX1RPS0VOX0ZBQ1RPUlkpKTsKKworICAgIGlmCShmYWN0b3J5ID09IE5VTEwpCisgICAgeworCXJldHVybglOVUxMOworICAgIH0KKworICAgIC8qIEluc3RhbGwgZmFjdG9yeSBBUEkKKyAgICAgKi8KKyAgICBmYWN0b3J5LT5uZXdUb2tlbgkgICAgPSBuZXdQb29sVG9rZW47CisgICAgZmFjdG9yeS0+Y2xvc2UJICAgID0gZmFjdG9yeUNsb3NlOworICAgIGZhY3RvcnktPnNldElucHV0U3RyZWFtID0gc2V0SW5wdXRTdHJlYW07CisgICAgZmFjdG9yeS0+cmVzZXQgICAgICAgICAgPSBmYWN0b3J5UmVzZXQ7CisgICAgCisgICAgLyogQWxsb2NhdGUgdGhlIGluaXRpYWwgcG9vbAorICAgICAqLworICAgIGZhY3RvcnktPnRoaXNQb29sCT0gLTE7CisgICAgZmFjdG9yeS0+cG9vbHMgICAgICA9IE5VTEw7CisgICAgZmFjdG9yeS0+bWF4UG9vbCAgICA9IC0xOworICAgIG5ld1Bvb2woZmFjdG9yeSk7CisKKyAgICAvKiBGYWN0b3J5IHNwYWNlIGlzIGdvb2QsIHdlIG5vdyB3YW50IHRvIGluaXRpYWxpemUgb3VyIGNoZWF0aW5nIHRva2VuCisgICAgICogd2hpY2ggb25lIGl0IGlzIGluaXRpYWxpemVkIGlzIHRoZSBtb2RlbCBmb3IgYWxsIHRva2VucyB3ZSBtYW51ZmFjdHVyZQorICAgICAqLworICAgIGFudGxyM1NldFRva2VuQVBJKCZmYWN0b3J5LT51blRydWMpOworCisgICAgLyogU2V0IHNvbWUgaW5pdGlhbCB2YXJpYWJsZXMgZm9yIGZ1dHVyZSBjb3B5aW5nCisgICAgICovCisgICAgZmFjdG9yeS0+dW5UcnVjLmZhY3RvcnlNYWRlCT0gQU5UTFIzX1RSVUU7CisKKyAgICAvLyBJbnB1dCBzdHJlYW0KKyAgICAvLworICAgIHNldElucHV0U3RyZWFtKGZhY3RvcnksIGlucHV0KTsKKyAgICAKKyAgICByZXR1cm4gIGZhY3Rvcnk7CisKK30KKworc3RhdGljIHZvaWQKK3NldElucHV0U3RyZWFtCShwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgZmFjdG9yeSwgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisgICAgZmFjdG9yeS0+aW5wdXQgICAgICAgICAgPSAgaW5wdXQ7CisgICAgZmFjdG9yeS0+dW5UcnVjLmlucHV0ICAgPSAgaW5wdXQ7CisJaWYJKGlucHV0ICE9IE5VTEwpCisJeworCQlmYWN0b3J5LT51blRydWMuc3RyRmFjdG9yeQk9IGlucHV0LT5zdHJGYWN0b3J5OworCX0KKwllbHNlCisJeworCQlmYWN0b3J5LT51blRydWMuc3RyRmFjdG9yeSA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbmV3UG9vbChwQU5UTFIzX1RPS0VOX0ZBQ1RPUlkgZmFjdG9yeSkKK3sKKyAgICAvKiBJbmNyZW1lbnQgZmFjdG9yeSBjb3VudAorICAgICAqLworICAgIGZhY3RvcnktPnRoaXNQb29sKys7CisKKyAgICAvLyBJZiB3ZSB3ZXJlIHJldXNpbmcgdGhpcyB0b2tlbiBmYWN0b3J5IHRoZW4gd2UgbWF5IGFscmVhZHkgaGF2ZSBhIHBvb2wKKyAgICAvLyBhbGxvY2F0ZWQuIElmIHdlIGV4Y2VlZGVkIHRoZSBtYXggYXZhaWJsZSB0aGVuIHdlIG11c3QgYWxsb2NhdGUgYSBuZXcKKyAgICAvLyBvbmUuCisgICAgaWYgIChmYWN0b3J5LT50aGlzUG9vbCA+IGZhY3RvcnktPm1heFBvb2wpCisgICAgeworICAgICAgICAvKiBFbnN1cmUgd2UgaGF2ZSBlbm91Z2ggcG9pbnRlcnMgYWxsb2NhdGVkCisgICAgICAgICAqLworICAgICAgICBmYWN0b3J5LT5wb29scyA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTiAqKQorCQkgICAgICAgICBBTlRMUjNfUkVBTExPQygJKHZvaWQgKilmYWN0b3J5LT5wb29scywJICAgIC8qIEN1cnJlbnQgcG9vbHMgcG9pbnRlciAoc3RhcnRzIGF0IE5VTEwpCSovCisJCQkJCSAgICAoQU5UTFIzX1VJTlQzMikoKGZhY3RvcnktPnRoaXNQb29sICsgMSkgKiBzaXplb2YocEFOVExSM19DT01NT05fVE9LRU4gKikpCS8qIE1lbW9yeSBmb3IgbmV3IHBvb2wgcG9pbnRlcnMgKi8KKwkJCQkJICAgICk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgcG9vbCBmb3IgdGhlIGZhY3RvcnkKKyAgICAgICAgICovCisgICAgICAgIGZhY3RvcnktPnBvb2xzW2ZhY3RvcnktPnRoaXNQb29sXQk9CisJCQkgICAgICAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTikgCisJCQkJICAgIEFOVExSM19DQUxMT0MoMSwgKHNpemVfdCkoc2l6ZW9mKEFOVExSM19DT01NT05fVE9LRU4pICogQU5UTFIzX0ZBQ1RPUllfUE9PTF9TSVpFKSk7CisKKyAgICAgICAgLy8gV2Ugbm93IGhhdmUgYSBuZXcgcG9vbCBhbmQgY2FuIHRyYWNrIGl0IGFzIHRoZSBtYXhpbXVtIHdlIGhhdmUgY3JlYXRlZCBzbyBmYXIKKyAgICAgICAgLy8KKyAgICAgICAgZmFjdG9yeS0+bWF4UG9vbCA9IGZhY3RvcnktPnRoaXNQb29sOworICAgIH0KKworICAgIC8qIFJlc2V0IHRoZSBjb3VudGVycworICAgICAqLworICAgIGZhY3RvcnktPm5leHRUb2tlbgk9IDA7CisgIAorICAgIC8qIERvbmUKKyAgICAgKi8KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTgorbmV3UG9vbFRva2VuKHBBTlRMUjNfVE9LRU5fRkFDVE9SWSBmYWN0b3J5KQoreworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuOworCisgICAgLyogU2VlIGlmIHdlIG5lZWQgYSBuZXcgdG9rZW4gcG9vbCBiZWZvcmUgYWxsb2NhdGluZyBhIG5ldworICAgICAqIG9uZQorICAgICAqLworICAgIGlmIChmYWN0b3J5LT5uZXh0VG9rZW4gPj0gQU5UTFIzX0ZBQ1RPUllfUE9PTF9TSVpFKQorICAgIHsKKyAgICAgICAgLyogV2UgcmFuIG91dCBvZiB0b2tlbnMgaW4gdGhlIGN1cnJlbnQgcG9vbCwgc28gd2UgbmVlZCBhIG5ldyBwb29sCisgICAgICAgICAqLworICAgICAgICBuZXdQb29sKGZhY3RvcnkpOworICAgIH0KKworICAgIC8qIEFzc3VtaW5nIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsICh3ZSBhcmUgdHJ5aW5nIGZvciBwZXJmb3JtYW5jZSBoZXJlIHNvIGRvaW5nIG1pbmltYWwKKyAgICAgKiBlcnJvciBjaGVja2luZy4gVGhlbiB3ZSBjYW4gd29yayBvdXQgd2hhdCB0aGUgcG9pbnRlciBpcyB0byB0aGUgbmV4dCB0b2tlbi4KKyAgICAgKi8KKyAgICB0b2tlbiA9IGZhY3RvcnktPnBvb2xzW2ZhY3RvcnktPnRoaXNQb29sXSArIGZhY3RvcnktPm5leHRUb2tlbjsKKyAgICBmYWN0b3J5LT5uZXh0VG9rZW4rKzsKKworICAgIC8qIFdlIGhhdmUgb3VyIHRva2VuIHBvaW50ZXIgbm93LCBzbyB3ZSBjYW4gaW5pdGlhbGl6ZSBpdCB0byB0aGUgcHJlZGVmaW5lZCBtb2RlbC4KKyAgICAgKiBXZSBvbmx5IG5lZWQgZG8gdGhpcyB0aG91Z2ggaWYgdGhlIHRva2VuIGlzIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkLCB3ZSBqdXN0IGNoZWNrCisgICAgICogYW4gYXBpIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIHRoaXMgYXMgdGhleSBhcmUgYWxsb2NhdGVkIHZpYSBjYWxsb2MuCisgICAgICovCisgICAgaWYgICh0b2tlbi0+c2V0U3RhcnRJbmRleCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYW50bHIzU2V0VG9rZW5BUEkodG9rZW4pOworCisgICAgICAgIC8vIEl0IGlzIGZhY3RvcnkgbWFkZSwgYW5kIHdlIG5lZWQgdG8gY29weSB0aGUgc3RyaW5nIGZhY3RvcnkgcG9pbnRlcgorICAgICAgICAvLworICAgICAgICB0b2tlbi0+ZmFjdG9yeU1hZGUgID0gQU5UTFIzX1RSVUU7CisgICAgICAgIHRva2VuLT5zdHJGYWN0b3J5ICAgPSBmYWN0b3J5LT5pbnB1dCA9PSBOVUxMID8gTlVMTCA6IGZhY3RvcnktPmlucHV0LT5zdHJGYWN0b3J5OworICAgICAgICB0b2tlbi0+aW5wdXQgICAgICAgID0gZmFjdG9yeS0+aW5wdXQ7CisgICAgfQorCisgICAgLyogQW5kIHdlIGFyZSBkb25lCisgICAgICovCisgICAgcmV0dXJuIHRva2VuOworfQorCitzdGF0aWMJdm9pZAorZmFjdG9yeVJlc2V0CSAgICAocEFOVExSM19UT0tFTl9GQUNUT1JZIGZhY3RvcnkpCit7CisgICAgLy8gSnVzdCBzdGFydCBhZ2FpbiB3aXRoIHBvb2wgIzAgd2hlbiB3ZSBhcmUKKyAgICAvLyBjYWxsZWQuCisgICAgLy8KKyAgICBmYWN0b3J5LT50aGlzUG9vbCAgID0gLTE7CisgICAgbmV3UG9vbChmYWN0b3J5KTsKK30KKworc3RhdGljCXZvaWQKK2ZhY3RvcnlDbG9zZQkgICAgKHBBTlRMUjNfVE9LRU5fRkFDVE9SWSBmYWN0b3J5KQoreworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHBvb2w7CisgICAgQU5UTFIzX0lOVDMyCSAgICBwb29sQ291bnQ7CisgICAgQU5UTFIzX1VJTlQzMgkgICAgbGltaXQ7CisgICAgQU5UTFIzX1VJTlQzMgkgICAgdG9rZW47CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgY2hlY2s7CisKKyAgICAvKiBXZSBpdGVyYXRlIHRoZSB0b2tlbiBwb29scyBvbmUgYXQgYSB0aW1lCisgICAgICovCisgICAgZm9yCShwb29sQ291bnQgPSAwOyBwb29sQ291bnQgPD0gZmFjdG9yeS0+dGhpc1Bvb2w7IHBvb2xDb3VudCsrKQorICAgIHsKKwkvKiBQb2ludGVyIHRvIGN1cnJlbnQgcG9vbAorCSAqLworCXBvb2wJPSBmYWN0b3J5LT5wb29sc1twb29sQ291bnRdOworCisJLyogV29yayBvdXQgaG93IG1hbnkgdG9rZW5zIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhpcyBwb29sLgorCSAqLworCWxpbWl0CT0gKHBvb2xDb3VudCA9PSBmYWN0b3J5LT50aGlzUG9vbCA/IGZhY3RvcnktPm5leHRUb2tlbiA6IEFOVExSM19GQUNUT1JZX1BPT0xfU0laRSk7CisJCisJLyogTWFyZ2luYWwgY29uZGl0aW9uLCB3ZSBtaWdodCBiZSBhdCB0aGUgc3RhcnQgb2YgYSBicmFuZCBuZXcgcG9vbAorCSAqIHdoZXJlIHRoZSBuZXh0VG9rZW4gaXMgMCBhbmQgbm90aGluZyBoYXMgYmVlbiBhbGxvY2F0ZWQuCisJICovCisJaWYgIChsaW1pdCA+IDApCisJeworCSAgICAvKiBXZSBoYXZlIHNvbWUgdG9rZW5zIGFsbG9jYXRlZCBmcm9tIHRoaXMgcG9vbAorCSAgICAgKi8KKwkgICAgZm9yICh0b2tlbiA9IDA7IHRva2VuIDwgbGltaXQ7IHRva2VuKyspCisJICAgIHsKKwkJLyogTmV4dCBvbmUgaW4gdGhlIGNoYWluCisJCSAqLworCQljaGVjawk9IHBvb2wgKyB0b2tlbjsKKworCQkvKiBJZiB0aGUgcHJvZ3JhbW1lciBtYWRlIHRoaXMgYSBjdXN0b20gdG9rZW4sIHRoZW4KKwkJICogc2VlIGlmIHdlIG5lZWQgdG8gY2FsbCB0aGVpciBmcmVlIHJvdXRpbmUuCisJCSAqLworCQlpZiAgKGNoZWNrLT5jdXN0b20gIT0gTlVMTCAmJiBjaGVjay0+ZnJlZUN1c3RvbSAhPSBOVUxMKQorCQl7CisJCSAgICBjaGVjay0+ZnJlZUN1c3RvbShjaGVjay0+Y3VzdG9tKTsKKwkJICAgIGNoZWNrLT5jdXN0b20gPSBOVUxMOworCQl9CisJICAgIH0KKwl9CisKKwkvKiBXZSBjYW4gbm93IGZyZWUgdGhpcyBwb29sIGFsbG9jYXRpb24KKwkgKi8KKwlBTlRMUjNfRlJFRShmYWN0b3J5LT5wb29sc1twb29sQ291bnRdKTsKKwlmYWN0b3J5LT5wb29sc1twb29sQ291bnRdID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBBbGwgdGhlIHBvb2xzIGFyZSBkZWFsbG9jYXRlZCB3ZSBjYW4gZnJlZSB0aGUgcG9pbnRlcnMgdG8gdGhlIHBvb2xzCisgICAgICogbm93LgorICAgICAqLworICAgIEFOVExSM19GUkVFKGZhY3RvcnktPnBvb2xzKTsKKworICAgIC8qIEZpbmFsbHksIHdlIGNhbiBmcmVlIHRoZSBzcGFjZSBmb3IgdGhlIGZhY3RvcnkgaXRzZWxmCisgICAgICovCisgICAgQU5UTFIzX0ZSRUUoZmFjdG9yeSk7Cit9CisKKworc3RhdGljCXBBTlRMUjNfQ09NTU9OX1RPS0VOCQorbmV3VG9rZW4odm9pZCkKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0b2tlbjsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcworICAgICAqLworICAgIHRva2VuICAgPSAocEFOVExSM19DT01NT05fVE9LRU4pIEFOVExSM19DQUxMT0MoMSwgKHNpemVfdCkoc2l6ZW9mKEFOVExSM19DT01NT05fVE9LRU4pKSk7CisKKyAgICBpZgkodG9rZW4gPT0gTlVMTCkKKyAgICB7CisJcmV0dXJuCU5VTEw7CisgICAgfQorCisgICAgLy8gSW5zdGFsbCB0aGUgQVBJCisgICAgLy8KKyAgICBhbnRscjNTZXRUb2tlbkFQSSh0b2tlbik7CisgICAgdG9rZW4tPmZhY3RvcnlNYWRlID0gQU5UTFIzX0ZBTFNFOworCisgICAgcmV0dXJuICB0b2tlbjsKK30KKworQU5UTFIzX0FQSSB2b2lkCithbnRscjNTZXRUb2tlbkFQSShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKyAgICB0b2tlbi0+Z2V0VGV4dAkJICAgID0gZ2V0VGV4dDsKKyAgICB0b2tlbi0+c2V0VGV4dAkJICAgID0gc2V0VGV4dDsKKyAgICB0b2tlbi0+c2V0VGV4dDgJCSAgICA9IHNldFRleHQ4OworICAgIHRva2VuLT5nZXRUeXBlCQkgICAgPSBnZXRUeXBlOworICAgIHRva2VuLT5zZXRUeXBlCQkgICAgPSBzZXRUeXBlOworICAgIHRva2VuLT5nZXRMaW5lCQkgICAgPSBnZXRMaW5lOworICAgIHRva2VuLT5zZXRMaW5lCQkgICAgPSBzZXRMaW5lOworICAgIHRva2VuLT5zZXRMaW5lCQkgICAgPSBzZXRMaW5lOworICAgIHRva2VuLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUgICAgPSBnZXRDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgdG9rZW4tPnNldENoYXJQb3NpdGlvbkluTGluZSAgICA9IHNldENoYXJQb3NpdGlvbkluTGluZTsKKyAgICB0b2tlbi0+Z2V0Q2hhbm5lbAkJICAgID0gZ2V0Q2hhbm5lbDsKKyAgICB0b2tlbi0+c2V0Q2hhbm5lbAkJICAgID0gc2V0Q2hhbm5lbDsKKyAgICB0b2tlbi0+Z2V0VG9rZW5JbmRleAkgICAgPSBnZXRUb2tlbkluZGV4OworICAgIHRva2VuLT5zZXRUb2tlbkluZGV4CSAgICA9IHNldFRva2VuSW5kZXg7CisgICAgdG9rZW4tPmdldFN0YXJ0SW5kZXgJICAgID0gZ2V0U3RhcnRJbmRleDsKKyAgICB0b2tlbi0+c2V0U3RhcnRJbmRleAkgICAgPSBzZXRTdGFydEluZGV4OworICAgIHRva2VuLT5nZXRTdG9wSW5kZXgJCSAgICA9IGdldFN0b3BJbmRleDsKKyAgICB0b2tlbi0+c2V0U3RvcEluZGV4CQkgICAgPSBzZXRTdG9wSW5kZXg7CisgICAgdG9rZW4tPnRvU3RyaW5nCQkgICAgPSB0b1N0cmluZzsKKworICAgIHJldHVybjsKK30KKworc3RhdGljICBwQU5UTFIzX1NUUklORyAgZ2V0VGV4dAkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKwlzd2l0Y2ggKHRva2VuLT50ZXh0U3RhdGUpCisJeworCQljYXNlIEFOVExSM19URVhUX1NUUklORzoKKworCQkJLy8gU29tZW9uZSBhbHJlYWR5IGNyZWF0ZWQgYSBzdHJpbmcgZm9yIHRoaXMgdG9rZW4sIHNvIHdlIGp1c3QKKwkJCS8vIHVzZSBpdC4KKwkJCS8vCisJCQlyZXR1cm4JdG9rZW4tPnRva1RleHQudGV4dDsKKwkJCWJyZWFrOworICAgIAorCQljYXNlIEFOVExSM19URVhUX0NIQVJQOgorCisJCQkvLyBXZSBoYWQgYSBzdHJhaWdodCB0ZXh0IHBvaW50ZXIgaW5zdGFsbGVkLCBub3cgd2UKKwkJCS8vIG11c3QgY29udmVydCBpdCB0byBhIHN0cmluZy4gTm90ZSB3ZSBoYXZlIHRvIGRvIHRoaXMgaGVyZQorCQkJLy8gb3Igb3RoZXJ3aXNlIHNldFRleHQ4KCkgd2lsbCBqdXN0IGluc3RhbGwgdGhlIHNhbWUgY2hhcioKKwkJCS8vCisJCQlpZgkodG9rZW4tPnN0ckZhY3RvcnkgIT0gTlVMTCkKKwkJCXsKKwkJCQl0b2tlbi0+dG9rVGV4dC50ZXh0CT0gdG9rZW4tPnN0ckZhY3RvcnktPm5ld1N0cjgodG9rZW4tPnN0ckZhY3RvcnksIChwQU5UTFIzX1VJTlQ4KXRva2VuLT50b2tUZXh0LmNoYXJzKTsKKwkJCQl0b2tlbi0+dGV4dFN0YXRlCT0gQU5UTFIzX1RFWFRfU1RSSU5HOworCQkJCXJldHVybiB0b2tlbi0+dG9rVGV4dC50ZXh0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFdlIGNhbm5vdCBkbyBhbnl0aGluZyBoZXJlCisJCQkJLy8KKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCS8vIEVPRiBpcyBhIHNwZWNpYWwgY2FzZQorCQkJLy8KKwkJCWlmICh0b2tlbi0+dHlwZSA9PSBBTlRMUjNfVE9LRU5fRU9GKQorCQkJeworCQkJCXRva2VuLT50b2tUZXh0LnRleHQJCQkJPSB0b2tlbi0+c3RyRmFjdG9yeS0+bmV3U3RyOCh0b2tlbi0+c3RyRmFjdG9yeSwgKHBBTlRMUjNfVUlOVDgpIjxFT0Y+Iik7CisJCQkJdG9rZW4tPnRleHRTdGF0ZQkJCQk9IEFOVExSM19URVhUX1NUUklORzsKKwkJCQl0b2tlbi0+dG9rVGV4dC50ZXh0LT5mYWN0b3J5CT0gdG9rZW4tPnN0ckZhY3Rvcnk7CisJCQkJcmV0dXJuIHRva2VuLT50b2tUZXh0LnRleHQ7CisJCQl9CisKKworCQkJLy8gV2UgaGFkIG5vdGhpbmcgaW5zdGFsbGVkIGluIHRoZSB0b2tlbiwgY3JlYXRlIGEgbmV3IHN0cmluZworCQkJLy8gZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisJCQkvLworCisJCQlpZgkodG9rZW4tPmlucHV0ICE9IE5VTEwpCisJCQl7CisJCQkKKwkJCQlyZXR1cm4JdG9rZW4tPmlucHV0LT5zdWJzdHIoCXRva2VuLT5pbnB1dCwgCisJCQkJCQkJCQkJCQl0b2tlbi0+Z2V0U3RhcnRJbmRleCh0b2tlbiksIAorIAkJCQkJCQkJCQkJCXRva2VuLT5nZXRTdG9wSW5kZXgodG9rZW4pCisJCQkJCQkJCQkJCSk7CisJCQl9CisKKwkJCS8vIE5vdGhpbmcgdG8gcmV0dXJuLCB0aGVyZSBpcyBubyBpbnB1dCBzdHJlYW0KKwkJCS8vCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCX0KK30KK3N0YXRpYyAgdm9pZAkJc2V0VGV4dDgJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgcEFOVExSM19VSU5UOCB0ZXh0KQoreworCS8vIE5vIHRleHQgdG8gc2V0LCBzbyBpZ25vcmUKKwkvLworCWlmCSh0ZXh0ID09IE5VTEwpIHJldHVybjsKKworCXN3aXRjaAkodG9rZW4tPnRleHRTdGF0ZSkKKwl7CisJCWNhc2UJQU5UTFIzX1RFWFRfTk9ORToKKwkJY2FzZQlBTlRMUjNfVEVYVF9DSEFSUDoJLy8gQ2FsbGVyIG11c3QgZnJlZSBiZWZvcmUgc2V0dGluZyBhZ2FpbiwgaWYgaXQgbmVlZHMgdG8gYmUgZnJlZWQKKworCQkJLy8gTm90aGluZyBpbiB0aGVyZSB5ZXQsIG9yIGp1c3QgYSBjaGFyICosIHNvIGp1c3Qgc2V0IHRoZQorCQkJLy8gdGV4dCBhcyBhIHBvaW50ZXIKKwkJCS8vCisJCQl0b2tlbi0+dGV4dFN0YXRlCQk9IEFOVExSM19URVhUX0NIQVJQOworCQkJdG9rZW4tPnRva1RleHQuY2hhcnMJPSAocEFOVExSM19VQ0hBUil0ZXh0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJLy8gSXQgd2FzIGFscmVhZHkgYSBwQU5UTFIzX1NUUklORywgc28ganVzdCBvdmVycmlkZSBpdAorCQkJLy8KKwkJCXRva2VuLT50b2tUZXh0LnRleHQtPnNldDgodG9rZW4tPnRva1RleHQudGV4dCwgKGNvbnN0IGNoYXIgKil0ZXh0KTsKKwkJCWJyZWFrOworCX0KKworCS8vIFdlIGFyZSBkb25lIAorCS8vCisJcmV0dXJuOworfQorCisvKiogXGJyaWVmIEluc3RhbGwgdGhlIHN1cHBsaWVkIHRleHQgc3RyaW5nIGFzIHRlaCB0ZXh0IGZvciB0aGUgdG9rZW4uCisgKiBUaGUgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgZXhpc3RpbmcgdGV4dCAoaWYgYW55KSB3YXMgY3JlYXRlZCBieSBhIGZhY3RvcnkKKyAqIGFuZCBzbyBkb2VzIG5vdCBhdHRlbXB0IHRvIHJlbGVhc2UgYW55IG1lbW9yeSBpdCBpcyB1c2luZy5UZXh0IG5vdCBjcmVhdGVkCisgKiBieSBhIHN0cmluZyBmY3RvcnkgKG5vdCBhZHZpc2VkKSBzaG91bGQgYmUgcmVsZWFzZWQgcHJpb3IgdG8gdGhpcyBjYWxsLgorICovCitzdGF0aWMgIHZvaWQJCXNldFRleHQJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4sIHBBTlRMUjNfU1RSSU5HIHRleHQpCit7CisJLy8gTWVyZWx5IHJlcGxhY2VzIGFuZCBleGlzdGluZyBwcmUtZGVmaW5lZCB0ZXh0IHdpdGggdGhlIHN1cHBsaWVkCisJLy8gc3RyaW5nCisJLy8KKwl0b2tlbi0+dGV4dFN0YXRlCT0gQU5UTFIzX1RFWFRfU1RSSU5HOworCXRva2VuLT50b2tUZXh0LnRleHQJPSB0ZXh0OworCisJLyogV2UgYXJlIGRvbmUgCisJKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYwlBTlRMUjNfVUlOVDMyICAgZ2V0VHlwZQkJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKyAgICByZXR1cm4gIHRva2VuLT50eXBlOworfQorCitzdGF0aWMgIHZvaWQJCXNldFR5cGUJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4sIEFOVExSM19VSU5UMzIgdHlwZSkKK3sKKyAgICB0b2tlbi0+dHlwZSA9IHR5cGU7Cit9CisKK3N0YXRpYyAgQU5UTFIzX1VJTlQzMiAgIGdldExpbmUJCQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pCit7CisgICAgcmV0dXJuICB0b2tlbi0+bGluZTsKK30KKworc3RhdGljICB2b2lkCQlzZXRMaW5lCQkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuLCBBTlRMUjNfVUlOVDMyIGxpbmUpCit7CisgICAgdG9rZW4tPmxpbmUgPSBsaW5lOworfQorCitzdGF0aWMgIEFOVExSM19JTlQzMiAgICBnZXRDaGFyUG9zaXRpb25JbkxpbmUJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKQoreworICAgIHJldHVybiAgdG9rZW4tPmNoYXJQb3NpdGlvbjsKK30KKworc3RhdGljICB2b2lkCQlzZXRDaGFyUG9zaXRpb25JbkxpbmUJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuLCBBTlRMUjNfSU5UMzIgcG9zKQoreworICAgIHRva2VuLT5jaGFyUG9zaXRpb24gPSBwb3M7Cit9CisKK3N0YXRpYyAgQU5UTFIzX1VJTlQzMiAgIGdldENoYW5uZWwJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKyAgICByZXR1cm4gIHRva2VuLT5jaGFubmVsOworfQorCitzdGF0aWMgIHZvaWQJCXNldENoYW5uZWwJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX1VJTlQzMiBjaGFubmVsKQoreworICAgIHRva2VuLT5jaGFubmVsICA9IGNoYW5uZWw7Cit9CisKK3N0YXRpYyAgQU5UTFIzX01BUktFUiAgIGdldFRva2VuSW5kZXgJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKyAgICByZXR1cm4gIHRva2VuLT5pbmRleDsKK30KKworc3RhdGljICB2b2lkCQlzZXRUb2tlbkluZGV4CQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4sIEFOVExSM19NQVJLRVIgaW5kZXgpCit7CisgICAgdG9rZW4tPmluZGV4ICAgID0gaW5kZXg7Cit9CisKK3N0YXRpYyAgQU5UTFIzX01BUktFUiAgIGdldFN0YXJ0SW5kZXgJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKwlyZXR1cm4gIHRva2VuLT5zdGFydCA9PSAtMSA/IChBTlRMUjNfTUFSS0VSKSh0b2tlbi0+aW5wdXQtPmRhdGEpIDogdG9rZW4tPnN0YXJ0OworfQorCitzdGF0aWMgIHZvaWQJCXNldFN0YXJ0SW5kZXgJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX01BUktFUiBzdGFydCkKK3sKKyAgICB0b2tlbi0+c3RhcnQgICAgPSBzdGFydDsKK30KKworc3RhdGljICBBTlRMUjNfTUFSS0VSICAgZ2V0U3RvcEluZGV4CQkocEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pCit7CisgICAgcmV0dXJuICB0b2tlbi0+c3RvcDsKK30KKworc3RhdGljICB2b2lkCQlzZXRTdG9wSW5kZXgJCShwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbiwgQU5UTFIzX01BUktFUiBzdG9wKQoreworICAgIHRva2VuLT5zdG9wCT0gc3RvcDsKK30KKworc3RhdGljICBwQU5UTFIzX1NUUklORyAgICB0b1N0cmluZwkJKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKQoreworICAgIHBBTlRMUjNfU1RSSU5HICB0ZXh0OworICAgIHBBTlRMUjNfU1RSSU5HICBvdXR0ZXh0OworCisgICAgdGV4dCAgICA9CXRva2VuLT5nZXRUZXh0KHRva2VuKTsKKyAgICAKKyAgICBpZgkodGV4dCA9PSBOVUxMKQorICAgIHsKKwkJcmV0dXJuIE5VTEw7CisgICAgfQorCisJaWYJKHRleHQtPmZhY3RvcnkgPT0gTlVMTCkKKwl7CisJCXJldHVybiB0ZXh0OwkJLy8gVGhpcyB1c2FsbHkgbWVhbnMgaXQgaXMgdGhlIEVPRiB0b2tlbgorCX0KKworICAgIC8qIEEgbmV3IGVtcHR5IHN0cmluZyB0byBhc3NlbWJsZSBhbGwgdGhlIHN0dWZmIGluCisgICAgICovCisgICAgb3V0dGV4dCA9IHRleHQtPmZhY3RvcnktPm5ld1Jhdyh0ZXh0LT5mYWN0b3J5KTsKKworICAgIC8qIE5vdyB3ZSB1c2Ugb3VyIGhhbmR5IGRhbmR5IHN0cmluZyB1dGlsaXR5IHRvIGFzc2VtYmxlIHRoZQorICAgICAqIHRoZSByZXBvcnRpbmcgc3RyaW5nCisgICAgICogcmV0dXJuICJbQCIrZ2V0VG9rZW5JbmRleCgpKyIsIitzdGFydCsiOiIrc3RvcCsiPSciK3R4dCsiJyw8Iit0eXBlKyI+IitjaGFubmVsU3RyKyIsIitsaW5lKyI6IitnZXRDaGFyUG9zaXRpb25JbkxpbmUoKSsiXSI7CisgICAgICovCisgICAgb3V0dGV4dC0+YXBwZW5kOChvdXR0ZXh0LCAiW0luZGV4OiAiKTsKKyAgICBvdXR0ZXh0LT5hZGRpICAgKG91dHRleHQsIChBTlRMUjNfSU5UMzIpdG9rZW4tPmdldFRva2VuSW5kZXgodG9rZW4pKTsKKyAgICBvdXR0ZXh0LT5hcHBlbmQ4KG91dHRleHQsICIgKFN0YXJ0OiAiKTsKKyAgICBvdXR0ZXh0LT5hZGRpICAgKG91dHRleHQsIChBTlRMUjNfSU5UMzIpdG9rZW4tPmdldFN0YXJ0SW5kZXgodG9rZW4pKTsKKyAgICBvdXR0ZXh0LT5hcHBlbmQ4KG91dHRleHQsICItU3RvcDogIik7CisgICAgb3V0dGV4dC0+YWRkaSAgIChvdXR0ZXh0LCAoQU5UTFIzX0lOVDMyKXRva2VuLT5nZXRTdG9wSW5kZXgodG9rZW4pKTsKKyAgICBvdXR0ZXh0LT5hcHBlbmQ4KG91dHRleHQsICIpID0nIik7CisgICAgb3V0dGV4dC0+YXBwZW5kUyhvdXR0ZXh0LCB0ZXh0KTsKKyAgICBvdXR0ZXh0LT5hcHBlbmQ4KG91dHRleHQsICInLCB0eXBlPCIpOworICAgIG91dHRleHQtPmFkZGkgICAob3V0dGV4dCwgdG9rZW4tPnR5cGUpOworICAgIG91dHRleHQtPmFwcGVuZDgob3V0dGV4dCwgIj4gIik7CisKKyAgICBpZgkodG9rZW4tPmdldENoYW5uZWwodG9rZW4pID4gQU5UTFIzX1RPS0VOX0RFRkFVTFRfQ0hBTk5FTCkKKyAgICB7CisJCW91dHRleHQtPmFwcGVuZDgob3V0dGV4dCwgIihjaGFubmVsID0gIik7CisJCW91dHRleHQtPmFkZGkJKG91dHRleHQsIChBTlRMUjNfSU5UMzIpdG9rZW4tPmdldENoYW5uZWwodG9rZW4pKTsKKwkJb3V0dGV4dC0+YXBwZW5kOChvdXR0ZXh0LCAiKSAiKTsKKyAgICB9CisKKyAgICBvdXR0ZXh0LT5hcHBlbmQ4KG91dHRleHQsICJMaW5lOiAiKTsKKyAgICBvdXR0ZXh0LT5hZGRpICAgKG91dHRleHQsIChBTlRMUjNfSU5UMzIpdG9rZW4tPmdldExpbmUodG9rZW4pKTsKKyAgICBvdXR0ZXh0LT5hcHBlbmQ4KG91dHRleHQsICIgTGluZVBvczoiKTsKKyAgICBvdXR0ZXh0LT5hZGRpICAgKG91dHRleHQsIHRva2VuLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUodG9rZW4pKTsKKyAgICBvdXR0ZXh0LT5hZGRjICAgKG91dHRleHQsICddJyk7CisKKyAgICByZXR1cm4gIG91dHRleHQ7Cit9CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbW1vbnRyZWUuYyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbW1vbnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWRlMzhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzY29tbW9udHJlZS5jCkBAIC0wLDAgKzEsNTQ3IEBACisvLyBcZmlsZQorLy8KKy8vIEltcGxlbWVudGF0aW9uIG9mIEFOVExSMyBDb21tb25UcmVlLCB3aGljaCB5b3UgY2FuIHVzZSBhcyBhCisvLyBzdGFydGluZyBwb2ludCBmb3IgeW91ciBvd24gdHJlZS4gVGhvdWdoIGl0IGlzIG9mdGVuIGVhc2llciBqdXN0IHRvIHRhZyB0aGluZ3Mgb24KKy8vIHRvIHRoZSB1c2VyIHBvaW50ZXIgaW4gdGhlIHRyZWUgdW5sZXNzIHlvdSBhcmUgYnVpbGRpbmcgYSBkaWZmZXJlbnQgdHlwZQorLy8gb2Ygc3RydWN0dXJlLgorLy8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzY29tbW9udHJlZS5oPgorCisKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTiBnZXRUb2tlbgkJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgcEFOVExSM19CQVNFX1RSRUUgICAgZHVwTm9kZQkJCQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpOworc3RhdGljIEFOVExSM19CT09MRUFOCSAgICBpc05pbE5vZGUJCQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCSAgICBnZXRUeXBlCQkJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgcEFOVExSM19TVFJJTkcJICAgIGdldFRleHQJCQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCSAgICBnZXRMaW5lCQkJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKTsKK3N0YXRpYyBwQU5UTFIzX1NUUklORwkgICAgdG9TdHJpbmcJCQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpOworc3RhdGljIHBBTlRMUjNfQkFTRV9UUkVFCWdldFBhcmVudAkJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgdm9pZAkJCQkJc2V0UGFyZW50CQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBwQU5UTFIzX0JBU0VfVFJFRSBwYXJlbnQpOworc3RhdGljIHZvaWQgICAgCQkJCXNldENoaWxkSW5kZXgJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSwgQU5UTFIzX0lOVDMyIGkpOworc3RhdGljIEFOVExSM19JTlQzMgkJCWdldENoaWxkSW5kZXgJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgdm9pZAkJCQkJY3JlYXRlQ2hpbGRyZW5MaXN0CQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSk7CitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgcmV1c2UgICAgICAgICAgICAgICAgICAgKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpOworCisvLyBGYWN0b3J5IGZ1bmN0aW9ucyBmb3IgdGhlIEFyYm9yZXR1bQorLy8KK3N0YXRpYyB2b2lkCQkJCQluZXdQb29sCQkJCShwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5KTsKK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRSAgICBuZXdQb29sVHJlZQkJCShwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5KTsKK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRSAgICBuZXdGcm9tVHJlZQkJCShwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5LCBwQU5UTFIzX0NPTU1PTl9UUkVFIHRyZWUpOworc3RhdGljIHBBTlRMUjNfQkFTRV9UUkVFICAgIG5ld0Zyb21Ub2tlbgkJKHBBTlRMUjNfQVJCT1JFVFVNIGZhY3RvcnksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKK3N0YXRpYyB2b2lkCQkJCQlmYWN0b3J5Q2xvc2UJCShwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5KTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX0FSQk9SRVRVTQorYW50bHIzQXJib3JldHVtTmV3KHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgc3RyRmFjdG9yeSkKK3sKKyAgICBwQU5UTFIzX0FSQk9SRVRVTSAgIGZhY3Rvcnk7CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkKKyAgICAvLworICAgIGZhY3RvcnkJPSAocEFOVExSM19BUkJPUkVUVU0pIEFOVExSM19NQUxMT0MoKHNpemVfdClzaXplb2YoQU5UTFIzX0FSQk9SRVRVTSkpOworICAgIGlmCShmYWN0b3J5ID09IE5VTEwpCisgICAgeworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKwkvLyBJbnN0YWxsIGEgdmVjdG9yIGZhY3RvcnkgdG8gY3JlYXRlLCB0cmFjayBhbmQgZnJlZSgpIGFueSBjaGlsZAorCS8vIG5vZGUgbGlzdHMuCisJLy8KKwlmYWN0b3J5LT52RmFjdG9yeQkJCQkJPSBhbnRscjNWZWN0b3JGYWN0b3J5TmV3KDApOworCWlmCShmYWN0b3J5LT52RmFjdG9yeSA9PSBOVUxMKQorCXsKKwkJZnJlZShmYWN0b3J5KTsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisgICAgLy8gV2UgYWxzbyBrZWVwIGEgcmVjbGFpbSBzdGFjaywgc28gdGhhdCBhbnkgTmlsIG5vZGVzIHRoYXQgYXJlCisgICAgLy8gb3JwaGFuZWQgYXJlIG5vdCBqdXN0IGxlZnQgaW4gdGhlIHBvb2wgYnV0IGFyZSByZXVzZWQsIG90aGVyIHdpc2UKKyAgICAvLyB3ZSBjcmVhdGUgNiB0aW1lcyBhcyBtYW55IG5pbE5vZGVzIGFzIG9yZGluYXJ5IG5vZGVzIGFuZCB1c2UgbG9hZHMgb2YKKyAgICAvLyBtZW1vcnkuIFBlcmhhcHMgYXQgc29tZSBwb2ludCwgdGhlIGFuYWx5c2lzIHBoYXNlIHdpbGwgZ2VuZXJhdGUgYmV0dGVyCisgICAgLy8gY29kZSBhbmQgd2Ugd29uJ3QgbmVlZCB0byBkbyB0aGlzIGhlcmUuCisgICAgLy8KKyAgICBmYWN0b3J5LT5uaWxTdGFjayAgICAgICA9ICBhbnRscjNTdGFja05ldygwKTsKKworICAgIC8vIEluc3RhbGwgZmFjdG9yeSBBUEkKKyAgICAvLworICAgIGZhY3RvcnktPm5ld1RyZWUJICAgID0gIG5ld1Bvb2xUcmVlOworICAgIGZhY3RvcnktPm5ld0Zyb21UcmVlICAgID0gIG5ld0Zyb21UcmVlOworICAgIGZhY3RvcnktPm5ld0Zyb21Ub2tlbiAgID0gIG5ld0Zyb21Ub2tlbjsKKyAgICBmYWN0b3J5LT5jbG9zZQkJCT0gIGZhY3RvcnlDbG9zZTsKKworICAgIC8vIEFsbG9jYXRlIHRoZSBpbml0aWFsIHBvb2wKKyAgICAvLworICAgIGZhY3RvcnktPnRoaXNQb29sCT0gLTE7CisgICAgZmFjdG9yeS0+cG9vbHMJCT0gTlVMTDsKKyAgICBuZXdQb29sKGZhY3RvcnkpOworCisgICAgLy8gRmFjdG9yeSBzcGFjZSBpcyBnb29kLCB3ZSBub3cgd2FudCB0byBpbml0aWFsaXplIG91ciBjaGVhdGluZyB0b2tlbgorICAgIC8vIHdoaWNoIG9uZSBpdCBpcyBpbml0aWFsaXplZCBpcyB0aGUgbW9kZWwgZm9yIGFsbCB0b2tlbnMgd2UgbWFudWZhY3R1cmUKKyAgICAvLworICAgIGFudGxyM1NldENUQVBJKCZmYWN0b3J5LT51blRydWMpOworCisgICAgLy8gU2V0IHNvbWUgaW5pdGlhbCB2YXJpYWJsZXMgZm9yIGZ1dHVyZSBjb3B5aW5nLCBpbmNsdWRpbmcgYSBzdHJpbmcgZmFjdG9yeQorICAgIC8vIHRoYXQgd2UgY2FuIHVzZSBsYXRlciBmb3IgY29udmVydGluZyB0cmVlcyB0byBzdHJpbmdzLgorICAgIC8vCisJZmFjdG9yeS0+dW5UcnVjLmZhY3RvcnkJCQkJPSBmYWN0b3J5OworICAgIGZhY3RvcnktPnVuVHJ1Yy5iYXNlVHJlZS5zdHJGYWN0b3J5CT0gc3RyRmFjdG9yeTsKKworICAgIHJldHVybiAgZmFjdG9yeTsKKworfQorCitzdGF0aWMgdm9pZAorbmV3UG9vbChwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5KQoreworICAgIC8vIEluY3JlbWVudCBmYWN0b3J5IGNvdW50CisgICAgLy8KKyAgICBmYWN0b3J5LT50aGlzUG9vbCsrOworCisgICAgLy8gRW5zdXJlIHdlIGhhdmUgZW5vdWdoIHBvaW50ZXJzIGFsbG9jYXRlZAorICAgIC8vCisgICAgZmFjdG9yeS0+cG9vbHMgPSAocEFOVExSM19DT01NT05fVFJFRSAqKQorCQkJCQlBTlRMUjNfUkVBTExPQygJKHZvaWQgKilmYWN0b3J5LT5wb29scywJCQkJCQkJCQkJLy8gQ3VycmVudCBwb29scyBwb2ludGVyIChzdGFydHMgYXQgTlVMTCkKKwkJCQkJKEFOVExSM19VSU5UMzIpKChmYWN0b3J5LT50aGlzUG9vbCArIDEpICogc2l6ZW9mKHBBTlRMUjNfQ09NTU9OX1RSRUUgKikpCS8vIE1lbW9yeSBmb3IgbmV3IHBvb2wgcG9pbnRlcnMKKwkJCQkJKTsKKworICAgIC8vIEFsbG9jYXRlIGEgbmV3IHBvb2wgZm9yIHRoZSBmYWN0b3J5CisgICAgLy8KKyAgICBmYWN0b3J5LT5wb29sc1tmYWN0b3J5LT50aGlzUG9vbF0JPQorCQkJICAgIChwQU5UTFIzX0NPTU1PTl9UUkVFKSAKKwkJCQlBTlRMUjNfTUFMTE9DKChzaXplX3QpKHNpemVvZihBTlRMUjNfQ09NTU9OX1RSRUUpICogQU5UTFIzX0ZBQ1RPUllfUE9PTF9TSVpFKSk7CisKKworICAgIC8vIFJlc2V0IHRoZSBjb3VudGVycworICAgIC8vCisgICAgZmFjdG9yeS0+bmV4dFRyZWUJPSAwOworICAKKyAgICAvLyBEb25lCisgICAgLy8KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRSAgICAKK25ld1Bvb2xUcmVlCSAgICAocEFOVExSM19BUkJPUkVUVU0gZmFjdG9yeSkKK3sKKwlwQU5UTFIzX0NPTU1PTl9UUkVFICAgIHRyZWU7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGFueXRoaW5nIG9uIHRoZSByZSBjbGFpbSBzdGFjaywgcmV1c2UgdGhhdCBzdWNrZXIgZmlyc3QKKyAgICAvLworICAgIHRyZWUgPSBmYWN0b3J5LT5uaWxTdGFjay0+cGVlayhmYWN0b3J5LT5uaWxTdGFjayk7CisKKyAgICBpZiAgKHRyZWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIENvb2wgd2UgZ290IHNvbWV0aGluZyB3ZSBjb3VsZCByZXVzZSwgaXQgd2lsbCBoYXZlIGJlZW4gY2xlYW5lZCB1cCBieQorICAgICAgICAvLyB3aGF0ZXZlciBwdXQgaXQgYmFjayBvbiB0aGUgc3RhY2sgKGZvciBpbnN0YW5jZSBpZiBpdCBoYWQgYSBjaGlsZCB2ZWN0b3IsCisgICAgICAgIC8vIHRoYXQgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCB0byBob2xkIHplcm8gZW50cmllcyBhbmQgdGhhdCB2ZWN0b3Igd2lsbCBnZXQgcmV1c2VkIHRvby4KKyAgICAgICAgLy8gSXQgaXMgdGhlIGJhc2V0cmVlIHBvaW50ZXIgdGhhdCBpcyBwbGFjZWQgb24gdGhlIHN0YWNrIG9mIGNvdXJzZQorICAgICAgICAvLworICAgICAgICBmYWN0b3J5LT5uaWxTdGFjay0+cG9wKGZhY3RvcnktPm5pbFN0YWNrKTsKKyAgICAgICAgcmV0dXJuIChwQU5UTFIzX0JBU0VfVFJFRSl0cmVlOworCisgICAgfQorCS8vIFNlZSBpZiB3ZSBuZWVkIGEgbmV3IHRyZWUgcG9vbCBiZWZvcmUgYWxsb2NhdGluZyBhIG5ldyB0cmVlCisJLy8KKwlpZgkoZmFjdG9yeS0+bmV4dFRyZWUgPj0gQU5UTFIzX0ZBQ1RPUllfUE9PTF9TSVpFKQorCXsKKwkJLy8gV2UgcmFuIG91dCBvZiB0b2tlbnMgaW4gdGhlIGN1cnJlbnQgcG9vbCwgc28gd2UgbmVlZCBhIG5ldyBwb29sCisJCS8vCisJCW5ld1Bvb2woZmFjdG9yeSk7CisJfQorCisJLy8gQXNzdW1pbmcgZXZlcnl0aGluZyB3ZW50IHdlbGwgLSB3ZSBhcmUgdHJ5aW5nIGZvciBwZXJmb3JtYW5jZSBoZXJlIHNvIGRvaW5nIG1pbmltYWwKKwkvLyBlcnJvciBjaGVja2luZyAtIHRoZW4gd2UgY2FuIHdvcmsgb3V0IHdoYXQgdGhlIHBvaW50ZXIgaXMgdG8gdGhlIG5leHQgY29tbW9udHJlZS4KKwkvLworCXRyZWUgICA9IGZhY3RvcnktPnBvb2xzW2ZhY3RvcnktPnRoaXNQb29sXSArIGZhY3RvcnktPm5leHRUcmVlOworCWZhY3RvcnktPm5leHRUcmVlKys7CisKKwkvLyBXZSBoYXZlIG91ciB0b2tlbiBwb2ludGVyIG5vdywgc28gd2UgY2FuIGluaXRpYWxpemUgaXQgdG8gdGhlIHByZWRlZmluZWQgbW9kZWwuCisJLy8KKyAgICBhbnRscjNTZXRDVEFQSSh0cmVlKTsKKworICAgIC8vIFNldCBzb21lIGluaXRpYWwgdmFyaWFibGVzIGZvciBmdXR1cmUgY29weWluZywgaW5jbHVkaW5nIGEgc3RyaW5nIGZhY3RvcnkKKyAgICAvLyB0aGF0IHdlIGNhbiB1c2UgbGF0ZXIgZm9yIGNvbnZlcnRpbmcgdHJlZXMgdG8gc3RyaW5ncy4KKyAgICAvLworCXRyZWUtPmZhY3RvcnkJCQkJPSBmYWN0b3J5OworICAgIHRyZWUtPmJhc2VUcmVlLnN0ckZhY3RvcnkJPSBmYWN0b3J5LT51blRydWMuYmFzZVRyZWUuc3RyRmFjdG9yeTsKKworCS8vIFRoZSBzdXBlciBwb2ludHMgdG8gdGhlIGNvbW1vbiB0cmVlIHNvIHdlIG11c3Qgb3ZlcnJpZGUgdGhlIG9uZSB1c2VkIGJ5CisJLy8gYnkgdGhlIHByZS1idWlsdCB0cmVlIGFzIG90aGVyd2lzZSB3ZSB3aWxsIGFsd2F5cyBwb2l0biB0byB0aGUgc2FtZSBpbml0aWFsCisJLy8gY29tbW9uIHRyZWUgYW5kIHdlIG1pZ2h0IHNwZW5kIDMgaG91cnMgdHJ5aW5nIHRvIGRlYnVnIHdoeSAtIHRoaXMgd291bGQgbmV2ZXIKKwkvLyBoYXBwZW4gdG8gbWUgb2YgY291cnNlISA6LSgKKwkvLworCXRyZWUtPmJhc2VUcmVlLnN1cGVyCT0gdHJlZTsKKworCisJLy8gQW5kIHdlIGFyZSBkb25lCisJLy8KKwlyZXR1cm4gICYodHJlZS0+YmFzZVRyZWUpOworfQorCisKK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRQkgICAgCituZXdGcm9tVHJlZShwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5LCBwQU5UTFIzX0NPTU1PTl9UUkVFIHRyZWUpCit7CisJcEFOVExSM19CQVNFX1RSRUUJbmV3VHJlZTsKKworCW5ld1RyZWUgPSBmYWN0b3J5LT5uZXdUcmVlKGZhY3RvcnkpOworCisJaWYJKG5ld1RyZWUgPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8vIFBpY2sgdXAgdGhlIHBheWxvYWQgd2UgaGFkIGluIHRoZSBzdXBwbGllZCB0cmVlCisJLy8KKwkoKHBBTlRMUjNfQ09NTU9OX1RSRUUpKG5ld1RyZWUtPnN1cGVyKSktPnRva2VuICAgPSB0cmVlLT50b2tlbjsKKwluZXdUcmVlLT51CQkgICAgPSB0cmVlLT5iYXNlVHJlZS51OwkJCQkJCQkvLyBDb3B5IGFueSB1c2VyIHBvaW50ZXIKKworCXJldHVybiAgbmV3VHJlZTsKK30KKworc3RhdGljIHBBTlRMUjNfQkFTRV9UUkVFCSAgICAKK25ld0Zyb21Ub2tlbihwQU5UTFIzX0FSQk9SRVRVTSBmYWN0b3J5LCBwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2tlbikKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRQluZXdUcmVlOworCisJbmV3VHJlZSA9IGZhY3RvcnktPm5ld1RyZWUoZmFjdG9yeSk7CisKKwlpZgkobmV3VHJlZSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJLy8gUGljayB1cCB0aGUgcGF5bG9hZCB3ZSBoYWQgaW4gdGhlIHN1cHBsaWVkIHRyZWUKKwkvLworCSgocEFOVExSM19DT01NT05fVFJFRSkobmV3VHJlZS0+c3VwZXIpKS0+dG9rZW4gPSB0b2tlbjsKKworCXJldHVybiBuZXdUcmVlOworfQorCitzdGF0aWMJdm9pZAorZmFjdG9yeUNsb3NlCSAgICAocEFOVExSM19BUkJPUkVUVU0gZmFjdG9yeSkKK3sKKwlBTlRMUjNfSU5UMzIJICAgIHBvb2xDb3VudDsKKworCS8vIEZpcnN0IGNsb3NlIHRoZSB2ZWN0b3IgZmFjdG9yeSB0aGF0IHN1cHBsaWVkIGFsbCB0aGUgY2hpbGQgcG9pbnRlcgorCS8vIHZlY3RvcnMuCisJLy8KKwlmYWN0b3J5LT52RmFjdG9yeS0+Y2xvc2UoZmFjdG9yeS0+dkZhY3RvcnkpOworCisgICAgaWYgIChmYWN0b3J5LT5uaWxTdGFjayAhPSAgTlVMTCkKKyAgICB7CisgICAgICAgIGZhY3RvcnktPm5pbFN0YWNrLT5mcmVlKGZhY3RvcnktPm5pbFN0YWNrKTsKKyAgICB9CisKKwkvLyBXZSBub3cgSlVTVCBmcmVlIHRoZSBwb29scyBiZWNhdXNlIHRoZSBDIHJ1bnRpbWUgQ29tbW9uVG9rZW4gYmFzZWQgdHJlZQorCS8vIGNhbm5vdCBjb250YWluIGFueXRoaW5nIHRoYXQgd2FzIG5vdCBtYWRlIGJ5IHRoaXMgZmFjdG9yeS4KKwkvLworCWZvcgkocG9vbENvdW50ID0gMDsgcG9vbENvdW50IDw9IGZhY3RvcnktPnRoaXNQb29sOyBwb29sQ291bnQrKykKKwl7CisJCS8vIFdlIGNhbiBub3cgZnJlZSB0aGlzIHBvb2wgYWxsb2NhdGlvbgorCQkvLworCQlBTlRMUjNfRlJFRShmYWN0b3J5LT5wb29sc1twb29sQ291bnRdKTsKKwkJZmFjdG9yeS0+cG9vbHNbcG9vbENvdW50XSA9IE5VTEw7CisJfQorCisJLy8gQWxsIHRoZSBwb29scyBhcmUgZGVhbGxvY2F0ZWQgd2UgY2FuIGZyZWUgdGhlIHBvaW50ZXJzIHRvIHRoZSBwb29scworCS8vIG5vdy4KKwkvLworCUFOVExSM19GUkVFKGZhY3RvcnktPnBvb2xzKTsKKworCS8vIEZpbmFsbHksIHdlIGNhbiBmcmVlIHRoZSBzcGFjZSBmb3IgdGhlIGZhY3RvcnkgaXRzZWxmCisJLy8KKwlBTlRMUjNfRlJFRShmYWN0b3J5KTsKK30KKworCitBTlRMUjNfQVBJIHZvaWQgCithbnRscjNTZXRDVEFQSShwQU5UTFIzX0NPTU1PTl9UUkVFIHRyZWUpCit7CisgICAgLy8gSW5pdCBiYXNlIHRyZWUKKyAgICAvLworICAgIGFudGxyM0Jhc2VUcmVlTmV3KCYodHJlZS0+YmFzZVRyZWUpKTsKKworICAgIC8vIFdlIG5lZWQgYSBwb2ludGVyIHRvIG91cnNlbHZlcyBmb3IgCisgICAgLy8gdGhlIHBheWxvYWQgYW5kIGZldyBmdW5jdGlvbnMgdGhhdCB3ZQorICAgIC8vIHByb3ZpZGUuCisgICAgLy8KKyAgICB0cmVlLT5iYXNlVHJlZS5zdXBlciAgICA9ICB0cmVlOworCisgICAgLy8gQ29tbW9uIHRyZWUgb3ZlcnJpZGVzCisKKyAgICB0cmVlLT5iYXNlVHJlZS5pc05pbE5vZGUgICAgICAgICAgICAgICAgPSBpc05pbE5vZGU7CisgICAgdHJlZS0+YmFzZVRyZWUudG9TdHJpbmcJCQkJCT0gdG9TdHJpbmc7CisgICAgdHJlZS0+YmFzZVRyZWUuZHVwTm9kZQkJCQkJPSAodm9pZCAqKCopKHBBTlRMUjNfQkFTRV9UUkVFKSkoZHVwTm9kZSk7CisgICAgdHJlZS0+YmFzZVRyZWUuZ2V0TGluZQkJCQkJPSBnZXRMaW5lOworICAgIHRyZWUtPmJhc2VUcmVlLmdldENoYXJQb3NpdGlvbkluTGluZQk9IGdldENoYXJQb3NpdGlvbkluTGluZTsKKyAgICB0cmVlLT5iYXNlVHJlZS50b1N0cmluZwkJCQkJPSB0b1N0cmluZzsKKyAgICB0cmVlLT5iYXNlVHJlZS5nZXRUeXBlCQkJCQk9IGdldFR5cGU7CisgICAgdHJlZS0+YmFzZVRyZWUuZ2V0VGV4dAkJCQkJPSBnZXRUZXh0OworICAgIHRyZWUtPmJhc2VUcmVlLmdldFRva2VuCQkJCQk9IGdldFRva2VuOworCXRyZWUtPmJhc2VUcmVlLmdldFBhcmVudAkJCQk9IGdldFBhcmVudDsKKwl0cmVlLT5iYXNlVHJlZS5zZXRQYXJlbnQJCQkJPSBzZXRQYXJlbnQ7CisJdHJlZS0+YmFzZVRyZWUuc2V0Q2hpbGRJbmRleAkJCT0gc2V0Q2hpbGRJbmRleDsKKwl0cmVlLT5iYXNlVHJlZS5nZXRDaGlsZEluZGV4CQkJPSBnZXRDaGlsZEluZGV4OworCXRyZWUtPmJhc2VUcmVlLmNyZWF0ZUNoaWxkcmVuTGlzdAkJPSBjcmVhdGVDaGlsZHJlbkxpc3Q7CisgICAgdHJlZS0+YmFzZVRyZWUucmV1c2UgICAgICAgICAgICAgICAgICAgID0gcmV1c2U7CisJdHJlZS0+YmFzZVRyZWUuZnJlZQkJCQkJCT0gTlVMTDsJICAgIC8vIEZhY3RvcnkgdHJlZXMgaGF2ZSBubyBmcmVlIGZ1bmN0aW9uCisgICAgdHJlZS0+YmFzZVRyZWUudSAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsgICAgIC8vIEluaXRpYWxpemUgdXNlciBwb2ludGVyICAgICAgICAgICAgCisKKwl0cmVlLT5iYXNlVHJlZS5jaGlsZHJlbgk9IE5VTEw7CisKKyAgICB0cmVlLT50b2tlbgkJCQk9IE5VTEw7CS8vIE5vIHRva2VuIGFzIHlldAorICAgIHRyZWUtPnN0YXJ0SW5kZXgJCT0gMDsKKyAgICB0cmVlLT5zdG9wSW5kZXgJCQk9IDA7CisJdHJlZS0+cGFyZW50CQkJPSBOVUxMOwkvLyBObyBwYXJlbnQgeWV0CisJdHJlZS0+Y2hpbGRJbmRleAkJPSAtMTsKKworICAgIHJldHVybjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vbiBmYWN0b3J5IG5vZGUgY29uc3RydWN0b3JzLgorLy8KKworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UUkVFCithbnRscjNDb21tb25UcmVlTmV3KCkKK3sKKwlwQU5UTFIzX0NPTU1PTl9UUkVFCXRyZWU7CisJdHJlZSAgICA9IEFOVExSM19DQUxMT0MoMSwgc2l6ZW9mKEFOVExSM19DT01NT05fVFJFRSkpOworCisJaWYJKHRyZWUgPT0gTlVMTCkKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworCWFudGxyM1NldENUQVBJKHRyZWUpOworCisJcmV0dXJuIHRyZWU7Cit9CisKK0FOVExSM19BUEkgcEFOVExSM19DT01NT05fVFJFRQkgICAgCithbnRscjNDb21tb25UcmVlTmV3RnJvbVRva2VuKHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKQoreworCXBBTlRMUjNfQ09NTU9OX1RSRUUJbmV3VHJlZTsKKworCW5ld1RyZWUgPSBhbnRscjNDb21tb25UcmVlTmV3KCk7CisKKwlpZgkobmV3VHJlZSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJLy9QaWNrIHVwIHRoZSBwYXlsb2FkIHdlIGhhZCBpbiB0aGUgc3VwcGxpZWQgdHJlZQorCS8vCisJbmV3VHJlZS0+dG9rZW4gPSB0b2tlbjsKKwlyZXR1cm4gbmV3VHJlZTsKK30KKworLy8vIENyZWF0ZSBhIG5ldyB2ZWN0b3IgZm9yIGhvbGRpbmcgY2hpbGQgbm9kZXMgdXNpbmcgdGhlIGluYnVpbHQKKy8vLyB2ZWN0b3IgZmFjdG9yeS4KKy8vLworc3RhdGljIHZvaWQKK2NyZWF0ZUNoaWxkcmVuTGlzdCAgKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpCit7CisJdHJlZS0+Y2hpbGRyZW4gPSAoKHBBTlRMUjNfQ09NTU9OX1RSRUUpKHRyZWUtPnN1cGVyKSktPmZhY3RvcnktPnZGYWN0b3J5LT5uZXdWZWN0b3IoKChwQU5UTFIzX0NPTU1PTl9UUkVFKSh0cmVlLT5zdXBlcikpLT5mYWN0b3J5LT52RmFjdG9yeSk7Cit9CisKKworc3RhdGljIHBBTlRMUjNfQ09NTU9OX1RPS0VOIAorZ2V0VG9rZW4JCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKyAgICAvLyBUaGUgdG9rZW4gaXMgdGhlIHBheWxvYWQgb2YgdGhlIGNvbW1vbiB0cmVlIG9yIG90aGVyIGltcGxlbWVudG9yCisgICAgLy8gc28gaXQgaXMgc3RvcmVkIHdpdGhpbiBvdXJzZWx2ZXMsIHdoaWNoIGlzIHRoZSBzdXBlciBwb2ludGVyLk5vdGUgCisJLy8gdGhhdCB3aGF0ZXZlciB0aGUgYWN0dWFsIHRva2VuIGlzLCBpdCBpcyBwYXNzZWQgYXJvdW5kIGJ5IGl0cyBwb2ludGVyCisJLy8gdG8gdGhlIGNvbW1vbiB0b2tlbiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXQgbWF5IG9mIGNvdXJzZSBzdXJyb3VuZAorCS8vIHdpdGggaXRzIG93biBzdXBlciBzdHJ1Y3R1cmUuCisgICAgLy8KKyAgICByZXR1cm4gICgocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpKS0+dG9rZW47Cit9CisKK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRSAgICAKK2R1cE5vZGUJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKyAgICAvLyBUaGUgbm9kZSB3ZSBhcmUgZHVwbGljYXRpbmcgaXMgaW4gZmFjdCB0aGUgY29tbW9uIHRyZWUgKHRoYXQncyB3aHkgd2UgYXJlIGhlcmUpCisgICAgLy8gc28gd2UgdXNlIHRoZSBzdXBlciBwb2ludGVyIHRvIGR1cGxpY2F0ZS4KKyAgICAvLworICAgIHBBTlRMUjNfQ09NTU9OX1RSRUUJICAgIHRoZU9sZDsKKyAgICAKKwl0aGVPbGQJPSAocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpOworCisJLy8gVGhlIHBvaW50ZXIgd2UgcmV0dXJuIGlzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGNvdXJzZQorICAgIC8vCisJcmV0dXJuICB0aGVPbGQtPmZhY3RvcnktPm5ld0Zyb21UcmVlKHRoZU9sZC0+ZmFjdG9yeSwgdGhlT2xkKTsKK30KKworc3RhdGljIEFOVExSM19CT09MRUFOCSAgICAKK2lzTmlsTm9kZQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCS8vIFRoaXMgaXMgYSBOaWwgdHJlZSBpZiBpdCBoYXMgbm8gcGF5bG9hZCAoVG9rZW4gaW4gb3VyIGNhc2UpCisJLy8KKwlpZgkoKChwQU5UTFIzX0NPTU1PTl9UUkVFKSh0cmVlLT5zdXBlcikpLT50b2tlbiA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIEFOVExSM19UUlVFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gQU5UTFIzX0ZBTFNFOworCX0KK30KKworc3RhdGljIEFOVExSM19VSU5UMzIJICAgIAorZ2V0VHlwZQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCXBBTlRMUjNfQ09NTU9OX1RSRUUgICAgdGhlVHJlZTsKKworCXRoZVRyZWUgPSAocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpOworCisJaWYJKHRoZVRyZWUtPnRva2VuID09IE5VTEwpCisJeworCQlyZXR1cm4JMDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuCXRoZVRyZWUtPnRva2VuLT5nZXRUeXBlKHRoZVRyZWUtPnRva2VuKTsKKwl9Cit9CisKK3N0YXRpYyBwQU5UTFIzX1NUUklORwkgICAgCitnZXRUZXh0CQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpCit7CisJcmV0dXJuCXRyZWUtPnRvU3RyaW5nKHRyZWUpOworfQorCitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgZ2V0TGluZQkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCXBBTlRMUjNfQ09NTU9OX1RSRUUJICAgIGNUcmVlOworCXBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHRva2VuOworCisJY1RyZWUgICA9IChwQU5UTFIzX0NPTU1PTl9UUkVFKSh0cmVlLT5zdXBlcik7CisKKwl0b2tlbiAgID0gY1RyZWUtPnRva2VuOworCisJaWYJKHRva2VuID09IE5VTEwgfHwgdG9rZW4tPmdldExpbmUodG9rZW4pID09IDApCisJeworCQlpZiAgKHRyZWUtPmdldENoaWxkQ291bnQodHJlZSkgPiAwKQorCQl7CisJCQlwQU5UTFIzX0JBU0VfVFJFRQljaGlsZDsKKworCQkJY2hpbGQgICA9IChwQU5UTFIzX0JBU0VfVFJFRSl0cmVlLT5nZXRDaGlsZCh0cmVlLCAwKTsKKwkJCXJldHVybiBjaGlsZC0+Z2V0TGluZShjaGlsZCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAgdG9rZW4tPmdldExpbmUodG9rZW4pOworfQorCitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlKQoreworCXBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHRva2VuOworCisJdG9rZW4gICA9ICgocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpKS0+dG9rZW47CisKKwlpZgkodG9rZW4gPT0gTlVMTCB8fCB0b2tlbi0+Z2V0Q2hhclBvc2l0aW9uSW5MaW5lKHRva2VuKSA9PSAtMSkKKwl7CisJCWlmICAodHJlZS0+Z2V0Q2hpbGRDb3VudCh0cmVlKSA+IDApCisJCXsKKwkJCXBBTlRMUjNfQkFTRV9UUkVFCWNoaWxkOworCisJCQljaGlsZCAgID0gKHBBTlRMUjNfQkFTRV9UUkVFKXRyZWUtPmdldENoaWxkKHRyZWUsIDApOworCisJCQlyZXR1cm4gY2hpbGQtPmdldENoYXJQb3NpdGlvbkluTGluZShjaGlsZCk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAgdG9rZW4tPmdldENoYXJQb3NpdGlvbkluTGluZSh0b2tlbik7Cit9CisKK3N0YXRpYyBwQU5UTFIzX1NUUklORwkgICAgdG9TdHJpbmcJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKwlpZiAgKHRyZWUtPmlzTmlsTm9kZSh0cmVlKSA9PSBBTlRMUjNfVFJVRSkKKwl7CisJCXBBTlRMUjNfU1RSSU5HICBuaWxOb2RlOworCisJCW5pbE5vZGUJPSB0cmVlLT5zdHJGYWN0b3J5LT5uZXdQdHIodHJlZS0+c3RyRmFjdG9yeSwgKHBBTlRMUjNfVUlOVDgpIm5pbCIsIDMpOworCisJCXJldHVybiBuaWxOb2RlOworCX0KKworCXJldHVybgkoKHBBTlRMUjNfQ09NTU9OX1RSRUUpKHRyZWUtPnN1cGVyKSktPnRva2VuLT5nZXRUZXh0KCgocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpKS0+dG9rZW4pOworfQorCitzdGF0aWMgcEFOVExSM19CQVNFX1RSRUUJCitnZXRQYXJlbnQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFIHRyZWUpCit7CisJcmV0dXJuICYgKCgocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpKS0+cGFyZW50LT5iYXNlVHJlZSk7Cit9CisKK3N0YXRpYyB2b2lkCQkJCQkKK3NldFBhcmVudAkJCQkocEFOVExSM19CQVNFX1RSRUUgdHJlZSwgcEFOVExSM19CQVNFX1RSRUUgcGFyZW50KQoreworCSgocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpKS0+cGFyZW50ID0gcGFyZW50ID09IE5VTEwgPyBOVUxMIDogKChwQU5UTFIzX0NPTU1PTl9UUkVFKShwYXJlbnQtPnN1cGVyKSktPnBhcmVudDsKK30KKworc3RhdGljIHZvaWQgICAgCQkJCQorc2V0Q2hpbGRJbmRleAkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBBTlRMUjNfSU5UMzIgaSkKK3sKKwkoKHBBTlRMUjNfQ09NTU9OX1RSRUUpKHRyZWUtPnN1cGVyKSktPmNoaWxkSW5kZXggPSBpOworfQorc3RhdGljCUFOVExSM19JTlQzMgkJCQorZ2V0Q2hpbGRJbmRleAkJCShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlICkKK3sKKwlyZXR1cm4gKChwQU5UTFIzX0NPTU1PTl9UUkVFKSh0cmVlLT5zdXBlcikpLT5jaGlsZEluZGV4OworfQorCisvKiogQ2xlYW4gdXAgYW55IGNoaWxkIHZlY3RvciB0aGF0IHRoZSB0cmVlIG1pZ2h0IGhhdmUsIHNvIGl0IGNhbiBiZSByZXVzZWQsCisgKiAgdGhlbiBhZGQgaXQgaW50byB0aGUgcmV1c2Ugc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkCityZXVzZSAgICAgICAgICAgICAgICAgICAocEFOVExSM19CQVNFX1RSRUUgdHJlZSkKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UUkVFCSAgICBjVHJlZTsKKworCWNUcmVlICAgPSAocEFOVExSM19DT01NT05fVFJFRSkodHJlZS0+c3VwZXIpOworCisgICAgaWYgIChjVHJlZS0+ZmFjdG9yeSAhPSBOVUxMKQorICAgIHsKKworICAgICAgICBpZiAgKGNUcmVlLT5iYXNlVHJlZS5jaGlsZHJlbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNUcmVlLT5iYXNlVHJlZS5jaGlsZHJlbi0+Y2xlYXIoY1RyZWUtPmJhc2VUcmVlLmNoaWxkcmVuKTsKKyAgICAgICAgfQorICAgICAgIGNUcmVlLT5mYWN0b3J5LT5uaWxTdGFjay0+cHVzaChjVHJlZS0+ZmFjdG9yeS0+bmlsU3RhY2ssIHRyZWUsIE5VTEwpOworICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbW1vbnRyZWVhZGFwdG9yLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb21tb250cmVlYWRhcHRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiY2U2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb21tb250cmVlYWRhcHRvci5jCkBAIC0wLDAgKzEsNDk2IEBACisvKiogXGZpbGUKKyAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHRyZWUgYWRhcHRvciB1c2VkIGJ5IHRoZSBDIHJ1bnRpbWUgdW5sZXNzIHRoZSBncmFtbWFyCisgKiBzb3VyY2UgZmlsZSBzYXlzIHRvIHVzZSBhbnl0aGluZyBkaWZmZXJlbnQuIEl0IGVtYmVkcyBhIEJBU0VfVFJFRSB0byB3aGljaAorICogaXQgYWRkcyBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIGFueXRoaW5nIHRoYXQgdGhlIGJhc2UgdHJlZSBpcyBub3QgCisgKiBnb29kIGZvciwgcGx1cyBhIG51bWJlciBvZiBtZXRob2RzIHRoYXQgYW55IG90aGVyIGFkYXB0b3IgdHlwZQorICogbmVlZHMgdG8gaW1wbGVtZW50IHRvby4KKyAqIFxpbmdyb3VwIHBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUgorICovCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2NvbW1vbnRyZWVhZGFwdG9yLmg+CisKKyNpZmRlZglBTlRMUjNfV0lORE9XUworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApCisjZW5kaWYKKworLyogQkFTRV9UUkVFX0FEQVBUT1Igb3ZlcnJpZGVzLi4uICovCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCWR1cE5vZGUJCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHRyZWVOb2RlKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkJY3JlYXRlCQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZHBhdG9yLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBwYXlsb2FkKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkJZGJnQ3JlYXRlCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHBheWxvYWQpOworc3RhdGljCXBBTlRMUjNfQ09NTU9OX1RPS0VOCWNyZWF0ZVRva2VuCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIEFOVExSM19VSU5UMzIgdG9rZW5UeXBlLCBwQU5UTFIzX1VJTlQ4IHRleHQpOworc3RhdGljCXBBTlRMUjNfQ09NTU9OX1RPS0VOCWNyZWF0ZVRva2VuRnJvbVRva2VuCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIGZyb21Ub2tlbik7CitzdGF0aWMJcEFOVExSM19DT01NT05fVE9LRU4gICAgZ2V0VG9rZW4JCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJcEFOVExSM19TVFJJTkcJCQlnZXRUZXh0CQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCQkJZ2V0VHlwZQkJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCWdldENoaWxkCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19VSU5UMzIgaSk7CitzdGF0aWMJQU5UTFIzX1VJTlQzMgkJCWdldENoaWxkQ291bnQJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwl2b2lkCQkJCQlyZXBsYWNlQ2hpbGRyZW4JCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSBwYXJlbnQsIEFOVExSM19JTlQzMiBzdGFydENoaWxkSW5kZXgsIEFOVExSM19JTlQzMiBzdG9wQ2hpbGRJbmRleCwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJdm9pZAkJCQkJc2V0RGVidWdFdmVudExpc3RlbmVyCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVidWdnZXIpOworc3RhdGljICB2b2lkCQkJCQlzZXRDaGlsZEluZGV4CQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgQU5UTFIzX0lOVDMyIGkpOworc3RhdGljICBBTlRMUjNfSU5UMzIJCQlnZXRDaGlsZEluZGV4CQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJdm9pZAkJCQkJc2V0UGFyZW50CQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIGNoaWxkLCBwQU5UTFIzX0JBU0VfVFJFRSBwYXJlbnQpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFICAgIAlnZXRQYXJlbnQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpOworc3RhdGljICB2b2lkCQkJCQlzZXRDaGlsZAkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0LCBBTlRMUjNfVUlOVDMyIGksIHBBTlRMUjNfQkFTRV9UUkVFIGNoaWxkKTsKK3N0YXRpYwl2b2lkCQkJCQlkZWxldGVDaGlsZAkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0LCBBTlRMUjNfVUlOVDMyIGkpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQllcnJvck5vZGUJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19UT0tFTl9TVFJFQU0gY3Ruc3RyZWFtLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdGFydFRva2VuLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdG9wVG9rZW4sIHBBTlRMUjNfRVhDRVBUSU9OIGUpOworLyogTWV0aG9kcyBzcGVjaWZpYyB0byBlYWNoIHRyZWUgYWRhcHRvcgorICovCitzdGF0aWMJdm9pZAkJCXNldFRva2VuQm91bmRhcmllcwkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgcEFOVExSM19DT01NT05fVE9LRU4gc3RhcnRUb2tlbiwgcEFOVExSM19DT01NT05fVE9LRU4gc3RvcFRva2VuKTsKK3N0YXRpYwl2b2lkCQkJZGJnU2V0VG9rZW5Cb3VuZGFyaWVzCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0YXJ0VG9rZW4sIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0b3BUb2tlbik7CitzdGF0aWMJQU5UTFIzX01BUktFUiAgIGdldFRva2VuU3RhcnRJbmRleAkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMgIEFOVExSM19NQVJLRVIgICBnZXRUb2tlblN0b3BJbmRleAkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCk7CisKK3N0YXRpYwl2b2lkCQljdGFGcmVlCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvcik7CisKKy8qKiBDcmVhdGUgYSBuZXcgdHJlZSBhZGFwdG9yLiBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoaXMgaXMKKyAqICBjcmVhdGluZyBhIG5ldyBDT01NT05fVFJFRSBhZGFwdG9yLCB3ZSByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlCisgKiAgQkFTRV9UUkVFIGludGVyZmFjZSwgYXMgc2hvdWxkIGFueSBvdGhlciBhZGFwdG9yIHRoYXQgd2lzaGVzIHRvIGJlIAorICogIHVzZWQgYXMgdGhlIHRyZWUgZWxlbWVudCBvZiBhIHRyZWUgcGFyc2UvYnVpbGQuIEl0IG5lZWRzIHRvIGJlIGdpdmVuIHRoZQorICogIGFkZHJlc3Mgb2YgYSB2YWxpZCBzdHJpbmcgZmFjdG9yeSBhcyB3ZSBkbyBub3Qga25vdyB3aGF0IHRoZSBvcmlnaW5hdGluZworICogIGlucHV0IHN0cmVhbSBlbmNvZGluZyB0eXBlIHdhcy4gVGhpcyB3YXkgd2UgY2FuIHJlbHkgb24ganVzdCB1c2luZworICogIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0ncyBzdHJpbmcgZmFjdG9yeSBvciBvbmUgb2YgdGhlIGNvcnJlY3QgdHlwZQorICogIHdoaWNoIHRoZSB1c2VyIHN1cHBsaWVzIHVzLgorICovCitBTlRMUjNfQVBJIHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IKK0FOVExSM19UUkVFX0FEQVBUT1JOZXcocEFOVExSM19TVFJJTkdfRkFDVE9SWSBzdHJGYWN0b3J5KQoreworCXBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUgljdGE7CisKKwkvLyBGaXJzdCBqb2IgaXMgdG8gY3JlYXRlIHRoZSBtZW1vcnkgd2UgbmVlZCBmb3IgdGhlIHRyZWUgYWRhcHRvciBpbnRlcmZhY2UuCisJLy8KKwljdGEJPSAocEFOVExSM19DT01NT05fVFJFRV9BREFQVE9SKSBBTlRMUjNfTUFMTE9DKChzaXplX3QpKHNpemVvZihBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUikpKTsKKworCWlmCShjdGEgPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8vIE1lbW9yeSBpcyBpbml0aWFsaXplZCwgc28gaW5pdGlhbGl6ZSB0aGUgYmFzZSB0cmVlIGFkYXB0b3IKKwkvLworCWFudGxyM0Jhc2VUcmVlQWRhcHRvckluaXQoJihjdGEtPmJhc2VBZGFwdG9yKSwgTlVMTCk7CisKKwkvLyBJbnN0YWxsIG91ciBpbnRlcmZhY2Ugb3ZlcnJpZGVzLiBTdHJhbmdlbmVzcyBpcyB0byBhbGxvdyBnZW5lcmF0ZWQgY29kZSB0byB0cmVhdCB0aGVtCisgICAgLy8gYXMgcmV0dXJuaW5nIHZvaWQgKgorCS8vCisJY3RhLT5iYXNlQWRhcHRvci5kdXBOb2RlCQkJCT0gICh2b2lkICogKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorCQkJCQkJCQkJCQkJCWR1cE5vZGU7CisJY3RhLT5iYXNlQWRhcHRvci5jcmVhdGUJCQkJCT0gICh2b2lkICogKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCBwQU5UTFIzX0NPTU1PTl9UT0tFTikpCisJCQkJCQkJCQkJCQkJY3JlYXRlOworCWN0YS0+YmFzZUFkYXB0b3IuY3JlYXRlVG9rZW4JCQk9ICAKKwkJCQkJCQkJCQkJCQljcmVhdGVUb2tlbjsKKwljdGEtPmJhc2VBZGFwdG9yLmNyZWF0ZVRva2VuRnJvbVRva2VuICAgPSAgCisJCQkJCQkJCQkJCQkJY3JlYXRlVG9rZW5Gcm9tVG9rZW47CisJY3RhLT5iYXNlQWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMJICAgID0gICh2b2lkICAgKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICosIHBBTlRMUjNfQ09NTU9OX1RPS0VOLCBwQU5UTFIzX0NPTU1PTl9UT0tFTikpCisJCQkJCQkJCQkJCQkJc2V0VG9rZW5Cb3VuZGFyaWVzOworCWN0YS0+YmFzZUFkYXB0b3IuZ2V0VG9rZW5TdGFydEluZGV4CSAgICA9ICAoQU5UTFIzX01BUktFUiAgKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRva2VuU3RhcnRJbmRleDsKKwljdGEtPmJhc2VBZGFwdG9yLmdldFRva2VuU3RvcEluZGV4CSAgICA9ICAoQU5UTFIzX01BUktFUiAgKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRva2VuU3RvcEluZGV4OworCWN0YS0+YmFzZUFkYXB0b3IuZ2V0VGV4dAkJCQk9ICAocEFOVExSM19TVFJJTkcgKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRleHQ7CisJY3RhLT5iYXNlQWRhcHRvci5nZXRUeXBlCQkJCT0gIChBTlRMUjNfVUlOVDMyICAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZTsKKwljdGEtPmJhc2VBZGFwdG9yLmdldENoaWxkCQkJCT0gICh2b2lkICogKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICosIEFOVExSM19VSU5UMzIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkOworCWN0YS0+YmFzZUFkYXB0b3Iuc2V0Q2hpbGQJCQkJPSAgKHZvaWQgICAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgQU5UTFIzX1VJTlQzMiwgdm9pZCAqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZDsKKwljdGEtPmJhc2VBZGFwdG9yLnNldFBhcmVudAkJCQk9ICAodm9pZCAgICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhcmVudDsKKyAgICBjdGEtPmJhc2VBZGFwdG9yLmdldFBhcmVudAkJCQk9ICAodm9pZCAqICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJlbnQ7CisJY3RhLT5iYXNlQWRhcHRvci5zZXRDaGlsZEluZGV4CQkJPSAgKHZvaWQgICAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgQU5UTFIzX1VJTlQzMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2hpbGRJbmRleDsKKwljdGEtPmJhc2VBZGFwdG9yLmRlbGV0ZUNoaWxkCQkJPSAgKHZvaWQgICAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgQU5UTFIzX1VJTlQzMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2hpbGQ7CisJY3RhLT5iYXNlQWRhcHRvci5nZXRDaGlsZENvdW50CQkJPSAgKEFOVExSM19VSU5UMzIgICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGlsZENvdW50OworCWN0YS0+YmFzZUFkYXB0b3IuZ2V0Q2hpbGRJbmRleAkJCT0gIChBTlRMUjNfSU5UMzIgICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgdm9pZCAqKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGlsZEluZGV4OworCWN0YS0+YmFzZUFkYXB0b3IuZnJlZQkJCQkJPSAgKHZvaWQgICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhRnJlZTsKKwljdGEtPmJhc2VBZGFwdG9yLnNldERlYnVnRXZlbnRMaXN0ZW5lcgk9ICAKKwkJCQkJCQkJCQkJCQlzZXREZWJ1Z0V2ZW50TGlzdGVuZXI7CisJY3RhLT5iYXNlQWRhcHRvci5yZXBsYWNlQ2hpbGRyZW4JCT0gICh2b2lkICAgKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCB2b2lkICosIEFOVExSM19JTlQzMiwgQU5UTFIzX0lOVDMyLCB2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VDaGlsZHJlbjsKKwljdGEtPmJhc2VBZGFwdG9yLmVycm9yTm9kZQkJCQk9ICAodm9pZCAqICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgcEFOVExSM19UT0tFTl9TVFJFQU0sIHBBTlRMUjNfQ09NTU9OX1RPS0VOLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiwgcEFOVExSM19FWENFUFRJT04pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTm9kZTsKKworCS8vIEluc3RhbGwgdGhlIHN1cGVyIGNsYXNzIHBvaW50ZXIKKwkvLworCWN0YS0+YmFzZUFkYXB0b3Iuc3VwZXIJICAgID0gY3RhOworCisJLy8gSW5zdGFsbCBhIHRyZWUgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IHRyZWUgbm9kZXMKKwkvLworCWN0YS0+YXJib3JldHVtICA9IGFudGxyM0FyYm9yZXR1bU5ldyhzdHJGYWN0b3J5KTsKKworCS8vIEluc3RhbGwgYSB0b2tlbiBmYWN0b3J5IGZvciBpbWFnaW5hcnkgdG9rZW5zLCB0aGVzZSBpbWFnaW5hcnkKKwkvLyB0b2tlbnMgZG8gbm90IHJlcXVpcmUgYWNjZXNzIHRvIHRoZSBpbnB1dCBzdHJlYW0gc28gd2UgY2FuCisJLy8gZHVtbXkgdGhlIGNyZWF0aW9uIG9mIGl0LCBidXQgdGhleSB3aWxsIG5lZWQgYSBzdHJpbmcgZmFjdG9yeS4KKwkvLworCWN0YS0+YmFzZUFkYXB0b3IudG9rZW5GYWN0b3J5CQkJCQkJPSBhbnRscjNUb2tlbkZhY3RvcnlOZXcoTlVMTCk7CisJY3RhLT5iYXNlQWRhcHRvci50b2tlbkZhY3RvcnktPnVuVHJ1Yy5zdHJGYWN0b3J5CT0gc3RyRmFjdG9yeTsKKworCS8vIEFsbG93IHRoZSBiYXNlIHRyZWUgYWRhcHRvciB0byBzaGFyZSB0aGUgdHJlZSBmYWN0b3J5J3Mgc3RyaW5nIGZhY3RvcnkuCisJLy8KKwljdGEtPmJhc2VBZGFwdG9yLnN0ckZhY3RvcnkJPSBzdHJGYWN0b3J5OworCisJLy8gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBiYXNlIGFkYXB0b3IgaW50ZXJmYWNlLgorCS8vCisJcmV0dXJuICAmKGN0YS0+YmFzZUFkYXB0b3IpOworfQorCisvLy8gRGVidWdnaW5nIHZlcnNpb24gb2YgdGhlIHRyZWUgYWRhcHRvciAobm90IG5vcm1hbGx5IGNhbGxlZCBhcyBnZW5lcmF0ZWQgY29kZQorLy8vIGNhbGxzIHNldERlYnVnRXZlbnRMaXN0ZW5lciBpbnN0ZWFkIHdoaWNoIGNoYW5nZXMgYSBub3JtYWwgdG9rZW4gc3RyZWFtIHRvCisvLy8gYSBkZWJ1Z2dpbmcgc3RyZWFtIGFuZCBtZWFucyB0aGF0IGEgdXNlcidzIGluc3RhbnRpYXRpb24gY29kZSBkb2VzIG5vdCBuZWVkCisvLy8gdG8gYmUgY2hhbmdlZCBqdXN0IHRvIGRlYnVnIHdpdGggQVcuCisvLy8KK0FOVExSM19BUEkgcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUgorQU5UTFIzX1RSRUVfQURBUFRPUkRlYnVnTmV3KHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgc3RyRmFjdG9yeSwgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUglkZWJ1Z2dlcikKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SCXRhOworCisJLy8gQ3JlYXRlIGEgbm9ybWFsIG9uZSBmaXJzdAorCS8vCisJdGEJPSBBTlRMUjNfVFJFRV9BREFQVE9STmV3KHN0ckZhY3RvcnkpOworCQorCWlmCSh0YSAhPSBOVUxMKQorCXsKKwkJLy8gUmVpbml0aWFsaXplIGFzIGEgZGVidWcgdmVyc2lvbgorCQkvLworCQlhbnRscjNCYXNlVHJlZUFkYXB0b3JJbml0KHRhLCBkZWJ1Z2dlcik7CisJCXRhLT5jcmVhdGUJCQkJPSAodm9pZCAqICgqKSAocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiwgcEFOVExSM19DT01NT05fVE9LRU4pKQorCQkJCQkJCQkJZGJnQ3JlYXRlOworCQl0YS0+c2V0VG9rZW5Cb3VuZGFyaWVzCT0gKHZvaWQgICAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgcEFOVExSM19DT01NT05fVE9LRU4sIHBBTlRMUjNfQ09NTU9OX1RPS0VOKSkKKwkJCQkJCQkJCWRiZ1NldFRva2VuQm91bmRhcmllczsKKwl9CisKKwlyZXR1cm4JdGE7Cit9CisKKy8vLyBDYXVzZXMgYW4gZXhpc3RpbmcgY29tbW9uIHRyZWUgYWRhcHRvciB0byBiZWNvbWUgYSBkZWJ1ZyB2ZXJzaW9uCisvLy8KK3N0YXRpYwl2b2lkCitzZXREZWJ1Z0V2ZW50TGlzdGVuZXIJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWJ1Z2dlcikKK3sKKwkvLyBSZWluaXRpYWxpemUgYXMgYSBkZWJ1ZyB2ZXJzaW9uCisJLy8KKwlhbnRscjNCYXNlVHJlZUFkYXB0b3JJbml0KGFkYXB0b3IsIGRlYnVnZ2VyKTsKKworCWFkYXB0b3ItPmNyZWF0ZQkJCQk9ICh2b2lkICogKCopIChwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SLCBwQU5UTFIzX0NPTU1PTl9UT0tFTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmdDcmVhdGU7CisJYWRhcHRvci0+c2V0VG9rZW5Cb3VuZGFyaWVzCT0gKHZvaWQgICAoKikgKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IsIHZvaWQgKiwgcEFOVExSM19DT01NT05fVE9LRU4sIHBBTlRMUjNfQ09NTU9OX1RPS0VOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZ1NldFRva2VuQm91bmRhcmllczsKKworfQorCitzdGF0aWMgdm9pZAorY3RhRnJlZShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IpCit7CisgICAgcEFOVExSM19DT01NT05fVFJFRV9BREFQVE9SIGN0YTsKKworICAgIGN0YQk9IChwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1IpKGFkYXB0b3ItPnN1cGVyKTsKKworICAgIC8qIEZyZWUgdGhlIHRyZWUgZmFjdG9yeSB3ZSBjcmVhdGVkCisgICAgICovCisgICAgY3RhLT5hcmJvcmV0dW0tPmNsb3NlKCgocEFOVExSM19DT01NT05fVFJFRV9BREFQVE9SKShhZGFwdG9yLT5zdXBlcikpLT5hcmJvcmV0dW0pOworCisgICAgLyogRnJlZSB0aGUgdG9rZW4gZmFjdG9yeSB3ZSBjcmVhdGVkCisgICAgICovCisgICAgYWRhcHRvci0+dG9rZW5GYWN0b3J5LT5jbG9zZShhZGFwdG9yLT50b2tlbkZhY3RvcnkpOworCisgICAgLyogRnJlZSB0aGUgc3VwZXIgcG9pbnRlciwgYXMgaXQgaXMgdGhpcyB0aGF0IHdhcyBhbGxvY2F0ZWQKKyAgICAgKiBhbmQgaXMgdGhlIGNvbW1vbiB0cmVlIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBBTlRMUjNfRlJFRShhZGFwdG9yLT5zdXBlcik7Cit9CisKKy8qIEJBU0VfVFJFRV9BREFQVE9SIG92ZXJyaWRlcyAqLworCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUKK2Vycm9yTm9kZQkJCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX1RPS0VOX1NUUkVBTSBjdG5zdHJlYW0sIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0YXJ0VG9rZW4sIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0b3BUb2tlbiwgcEFOVExSM19FWENFUFRJT04gZSkKK3sKKwkvLyBVc2UgdGhlIHN1cHBsaWVkIGNvbW1vbiB0cmVlIG5vZGUgc3RyZWFtIHRvIGdldCBhbm90aGVyIHRyZWUgZnJvbSB0aGUgZmFjdG9yeQorCS8vIFRPRE86IExvb2sgYXQgY3JlYXRpbmcgdGhlIGVycm9ub2RlIGFzIGluIEphdmEsIGJ1dCB0aGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZQorCS8vIG5lZWQgdG8gdHJhY2sgYW5kIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gaXQsIHNvIGZvciBub3csIHdlIGp1c3QKKwkvLyB3YW50IHNvbWV0aGluZyBpbiB0aGUgdHJlZSB0aGF0IGlzbid0IGEgTlVMTCBwb2ludGVyLgorCS8vCisJcmV0dXJuIGFkYXB0b3ItPmNyZWF0ZVR5cGVUZXh0KGFkYXB0b3IsIEFOVExSM19UT0tFTl9JTlZBTElELCAocEFOVExSM19VSU5UOCkiVHJlZSBFcnJvciBOb2RlIik7CisKK30KKworLyoqIER1cGxpY2F0ZSB0aGUgc3VwcGxpZWQgbm9kZS4KKyAqLworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCitkdXBOb2RlCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0cmVlTm9kZSkKK3sKKwlyZXR1cm4gIHRyZWVOb2RlID09IE5VTEwgPyBOVUxMIDogdHJlZU5vZGUtPmR1cE5vZGUodHJlZU5vZGUpOworfQorCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUKK2NyZWF0ZQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19DT01NT05fVE9LRU4gcGF5bG9hZCkKK3sKKyAgICBwQU5UTFIzX0JBU0VfVFJFRQljdDsKKyAgICAKKyAgICAvKiBDcmVhdGUgYSBuZXcgY29tbW9uIHRyZWUgYXMgdGhpcyBpcyB3aGF0IHRoaXMgYWRhcHRvciBkZWFscyB3aXRoCisgICAgICovCisgICAgY3QgPSAoKHBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUikoYWRhcHRvci0+c3VwZXIpKS0+YXJib3JldHVtLT5uZXdGcm9tVG9rZW4oKChwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1IpKGFkYXB0b3ItPnN1cGVyKSktPmFyYm9yZXR1bSwgcGF5bG9hZCk7CisKKyAgICAvKiBCdXQgYWxsIGFkYXB0b3JzIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBpbnRlcmZhY2UuCisgICAgICovCisgICAgcmV0dXJuICBjdDsKK30KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQorZGJnQ3JlYXRlCQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBwYXlsb2FkKQoreworCXBBTlRMUjNfQkFTRV9UUkVFCWN0OworCisJY3QgPSBjcmVhdGUoYWRhcHRvciwgcGF5bG9hZCk7CisJYWRhcHRvci0+ZGVidWdnZXItPmNyZWF0ZU5vZGUoYWRhcHRvci0+ZGVidWdnZXIsIGN0KTsKKworCXJldHVybiBjdDsKK30KKworLyoqIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgKgorICogIElmIHlvdSBjYXJlIHdoYXQgdGhlIHRva2VuIHBheWxvYWQgb2JqZWN0cycgdHlwZSBpcywgeW91IHNob3VsZAorICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnkgb3RoZXIgY3JlYXRlVG9rZW4gdmFyaWFudC4KKyAqLworc3RhdGljCXBBTlRMUjNfQ09NTU9OX1RPS0VOCitjcmVhdGVUb2tlbgkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgQU5UTFIzX1VJTlQzMiB0b2tlblR5cGUsIHBBTlRMUjNfVUlOVDggdGV4dCkKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBuZXdUb2tlbjsKKworICAgIG5ld1Rva2VuCT0gYWRhcHRvci0+dG9rZW5GYWN0b3J5LT5uZXdUb2tlbihhZGFwdG9yLT50b2tlbkZhY3RvcnkpOworCisgICAgaWYJKG5ld1Rva2VuICE9IE5VTEwpCisgICAgewkKKwkJbmV3VG9rZW4tPnRleHRTdGF0ZQkJPSBBTlRMUjNfVEVYVF9DSEFSUDsKKwkJbmV3VG9rZW4tPnRva1RleHQuY2hhcnMgPSAocEFOVExSM19VQ0hBUil0ZXh0OworCQluZXdUb2tlbi0+c2V0VHlwZShuZXdUb2tlbiwgdG9rZW5UeXBlKTsKKwkJbmV3VG9rZW4tPmlucHV0CQkJCT0gYWRhcHRvci0+dG9rZW5GYWN0b3J5LT5pbnB1dDsKKyAgICAgICAgbmV3VG9rZW4tPnN0ckZhY3RvcnkgICAgICAgID0gYWRhcHRvci0+c3RyRmFjdG9yeTsKKyAgICB9CisgICAgcmV0dXJuICBuZXdUb2tlbjsKK30KKworLyoqIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgKgorICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgKiAgYW4gYWN0dWFsIHJlYWwgaW5wdXQgdG9rZW4uICBUeXBpY2FsbHkgdGhpcyBpcyBmb3IgY29udmVydGluZyAneycKKyAqICB0b2tlbnMgdG8gQkxPQ0sgZXRjLi4uICBZb3UnbGwgc2VlCisgKgorICogICAgciA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjXSBJRCspIDsKKyAqCisgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICoKKyAqIE5COiB0aGlzIGJlaW5nIEMgaXQgaXMgbm90IHNvIGVhc3kgdG8gZXh0ZW5kIHRoZSB0eXBlcyBvZiBjcmVhZXRlVG9rZW4uCisgKiAgICAgV2Ugd2lsbCBoYXZlIHRvIHNlZSBpZiBhbnlvbmUgbmVlZHMgdG8gZG8gdGhpcyBhbmQgYWRkIGFueSB2YXJpYW50cyB0bworICogICAgIHRoaXMgaW50ZXJmYWNlLgorICovCitzdGF0aWMJcEFOVExSM19DT01NT05fVE9LRU4KK2NyZWF0ZVRva2VuRnJvbVRva2VuCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIGZyb21Ub2tlbikKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBuZXdUb2tlbjsKKworICAgIG5ld1Rva2VuCT0gYWRhcHRvci0+dG9rZW5GYWN0b3J5LT5uZXdUb2tlbihhZGFwdG9yLT50b2tlbkZhY3RvcnkpOworICAgIAorICAgIGlmCShuZXdUb2tlbiAhPSBOVUxMKQorICAgIHsKKwkJLy8gQ3JlYXRlIHRoZSB0ZXh0IHVzaW5nIG91ciBvd24gc3RyaW5nIGZhY3RvcnkgdG8gYXZvaWQgY29tcGxpY2F0aW5nCisJCS8vIGNvbW1vbnRva2VuLgorCQkvLworCQlwQU5UTFIzX1NUUklORwl0ZXh0OworCisJCW5ld1Rva2VuLT50b1N0cmluZyAgPSBmcm9tVG9rZW4tPnRvU3RyaW5nOworCisJCWlmCShmcm9tVG9rZW4tPnRleHRTdGF0ZSA9PSBBTlRMUjNfVEVYVF9DSEFSUCkKKwkJeworCQkJbmV3VG9rZW4tPnRleHRTdGF0ZQkJPSBBTlRMUjNfVEVYVF9DSEFSUDsKKwkJCW5ld1Rva2VuLT50b2tUZXh0LmNoYXJzCT0gZnJvbVRva2VuLT50b2tUZXh0LmNoYXJzOworCQl9CisJCWVsc2UKKwkJeworCQkJdGV4dAkJCQkJCT0gZnJvbVRva2VuLT5nZXRUZXh0KGZyb21Ub2tlbik7CisJCQluZXdUb2tlbi0+dGV4dFN0YXRlCQkJPSBBTlRMUjNfVEVYVF9TVFJJTkc7CisJCQluZXdUb2tlbi0+dG9rVGV4dC50ZXh0CSAgICA9IGFkYXB0b3ItPnN0ckZhY3RvcnktPm5ld1B0cihhZGFwdG9yLT5zdHJGYWN0b3J5LCB0ZXh0LT5jaGFycywgdGV4dC0+bGVuKTsKKwkJfQorCisJCW5ld1Rva2VuLT5zZXRMaW5lCQkJCShuZXdUb2tlbiwgZnJvbVRva2VuLT5nZXRMaW5lKGZyb21Ub2tlbikpOworCQluZXdUb2tlbi0+c2V0VG9rZW5JbmRleAkJCShuZXdUb2tlbiwgZnJvbVRva2VuLT5nZXRUb2tlbkluZGV4KGZyb21Ub2tlbikpOworCQluZXdUb2tlbi0+c2V0Q2hhclBvc2l0aW9uSW5MaW5lCShuZXdUb2tlbiwgZnJvbVRva2VuLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUoZnJvbVRva2VuKSk7CisJCW5ld1Rva2VuLT5zZXRDaGFubmVsCQkJKG5ld1Rva2VuLCBmcm9tVG9rZW4tPmdldENoYW5uZWwoZnJvbVRva2VuKSk7CisJCW5ld1Rva2VuLT5zZXRUeXBlCQkJCShuZXdUb2tlbiwgZnJvbVRva2VuLT5nZXRUeXBlKGZyb21Ub2tlbikpOworICAgIH0KKworICAgIHJldHVybiAgbmV3VG9rZW47Cit9CisKKy8qIFNwZWNpZmljIG1ldGhvZHMgZm9yIGEgVHJlZUFkYXB0b3IgKi8KKworLyoqIFRyYWNrIHN0YXJ0L3N0b3AgdG9rZW4gZm9yIHN1YnRyZWUgcm9vdCBjcmVhdGVkIGZvciBhIHJ1bGUuCisgKiAgT25seSB3b3JrcyB3aXRoIENvbW1vblRyZWUgbm9kZXMuICBGb3IgcnVsZXMgdGhhdCBtYXRjaCBub3RoaW5nLAorICogIHNlZW1zIGxpa2UgdGhpcyB3aWxsIHlpZWxkIHN0YXJ0PWkgYW5kIHN0b3A9aS0xIGluIGEgbmlsIG5vZGUuCisgKiAgTWlnaHQgYmUgdXNlZnVsIGluZm8gc28gSSdsbCBub3QgZm9yY2UgdG8gYmUgaS4uaS4KKyAqLworc3RhdGljCXZvaWQKK3NldFRva2VuQm91bmRhcmllcwkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0LCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdGFydFRva2VuLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdG9wVG9rZW4pCit7CisJQU5UTFIzX01BUktFUiAgIHN0YXJ0OworCUFOVExSM19NQVJLRVIgICBzdG9wOworCisJcEFOVExSM19DT01NT05fVFJFRQkgICAgY3Q7CisKKwlpZgkodCA9PSBOVUxMKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmCSggc3RhcnRUb2tlbiAhPSBOVUxMKQorCXsKKwkJc3RhcnQgPSBzdGFydFRva2VuLT5nZXRUb2tlbkluZGV4KHN0YXJ0VG9rZW4pOworCX0KKwllbHNlCisJeworCQlzdGFydCA9IDA7CisJfQorCisJaWYJKCBzdG9wVG9rZW4gIT0gTlVMTCkKKwl7CisJCXN0b3AgPSBzdG9wVG9rZW4tPmdldFRva2VuSW5kZXgoc3RvcFRva2VuKTsKKwl9CisJZWxzZQorCXsKKwkJc3RvcCA9IDA7CisJfQorCisJY3QJPSAocEFOVExSM19DT01NT05fVFJFRSkodC0+c3VwZXIpOworCisJY3QtPnN0YXJ0SW5kZXggID0gc3RhcnQ7CisJY3QtPnN0b3BJbmRleCAgID0gc3RvcDsKKworfQorc3RhdGljCXZvaWQKK2RiZ1NldFRva2VuQm91bmRhcmllcwkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0LCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdGFydFRva2VuLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdG9wVG9rZW4pCit7CisJc2V0VG9rZW5Cb3VuZGFyaWVzKGFkYXB0b3IsIHQsIHN0YXJ0VG9rZW4sIHN0b3BUb2tlbik7CisKKwlpZgkodCAhPSBOVUxMICYmIHN0YXJ0VG9rZW4gIT0gTlVMTCAmJiBzdG9wVG9rZW4gIT0gTlVMTCkKKwl7CisJCWFkYXB0b3ItPmRlYnVnZ2VyLT5zZXRUb2tlbkJvdW5kYXJpZXMoYWRhcHRvci0+ZGVidWdnZXIsIHQsIHN0YXJ0VG9rZW4tPmdldFRva2VuSW5kZXgoc3RhcnRUb2tlbiksIHN0b3BUb2tlbi0+Z2V0VG9rZW5JbmRleChzdG9wVG9rZW4pKTsKKwl9Cit9CisKK3N0YXRpYwlBTlRMUjNfTUFSS0VSICAgCitnZXRUb2tlblN0YXJ0SW5kZXgJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCkKK3sKKyAgICByZXR1cm4gICgocEFOVExSM19DT01NT05fVFJFRSkodC0+c3VwZXIpKS0+c3RhcnRJbmRleDsKK30KKworc3RhdGljCUFOVExSM19NQVJLRVIgICAKK2dldFRva2VuU3RvcEluZGV4CShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisgICAgcmV0dXJuICAoKHBBTlRMUjNfQ09NTU9OX1RSRUUpKHQtPnN1cGVyKSktPnN0b3BJbmRleDsKK30KKworc3RhdGljCXBBTlRMUjNfU1RSSU5HCitnZXRUZXh0CQkocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfVFJFRSB0KQoreworICAgIHJldHVybiAgdC0+Z2V0VGV4dCh0KTsKK30KKworc3RhdGljCUFOVExSM19VSU5UMzIKK2dldFR5cGUJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisgICAgcmV0dXJuICB0LT5nZXRUeXBlKHQpOworfQorCitzdGF0aWMJdm9pZAkJCQkJCityZXBsYWNlQ2hpbGRyZW4KKyhwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHBhcmVudCwgQU5UTFIzX0lOVDMyIHN0YXJ0Q2hpbGRJbmRleCwgQU5UTFIzX0lOVDMyIHN0b3BDaGlsZEluZGV4LCBwQU5UTFIzX0JBU0VfVFJFRSB0KQoreworCWlmCShwYXJlbnQgIT0gTlVMTCkKKwl7CisJCXBhcmVudC0+cmVwbGFjZUNoaWxkcmVuKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7CisJfQorfQorCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUKK2dldENoaWxkCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19VSU5UMzIgaSkKK3sKKwlyZXR1cm4gdC0+Z2V0Q2hpbGQodCwgaSk7Cit9CitzdGF0aWMgIHZvaWQKK3NldENoaWxkCQkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19VSU5UMzIgaSwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpCit7CisJdC0+c2V0Q2hpbGQodCwgaSwgY2hpbGQpOworfQorCitzdGF0aWMJdm9pZAorZGVsZXRlQ2hpbGQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCwgQU5UTFIzX1VJTlQzMiBpKQoreworCXQtPmRlbGV0ZUNoaWxkKHQsIGkpOworfQorCitzdGF0aWMJQU5UTFIzX1VJTlQzMgorZ2V0Q2hpbGRDb3VudAkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisJcmV0dXJuIHQtPmdldENoaWxkQ291bnQodCk7Cit9CisKK3N0YXRpYyAgdm9pZAorc2V0Q2hpbGRJbmRleAkJCShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19JTlQzMiBpKQoreworCXQtPnNldENoaWxkSW5kZXgodCwgaSk7Cit9CisKK3N0YXRpYyAgQU5UTFIzX0lOVDMyCitnZXRDaGlsZEluZGV4CQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgdCkKK3sKKwlyZXR1cm4gdC0+Z2V0Q2hpbGRJbmRleCh0KTsKK30KK3N0YXRpYwl2b2lkCitzZXRQYXJlbnQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQsIHBBTlRMUjNfQkFTRV9UUkVFIHBhcmVudCkKK3sKKwljaGlsZC0+c2V0UGFyZW50KGNoaWxkLCBwYXJlbnQpOworfQorc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCitnZXRQYXJlbnQJCQkJKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpCit7CisJcmV0dXJuIGNoaWxkLT5nZXRQYXJlbnQoY2hpbGQpOworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzY29tbW9udHJlZW5vZGVzdHJlYW0uYyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1OWQzNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbW1vbnRyZWVub2Rlc3RyZWFtLmMKQEAgLTAsMCArMSw5NjggQEAKKy8vLyBcZmlsZQorLy8vIERlZmluZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tb24gbm9kZSBzdHJlYW0gdGhlIGRlZmF1bHQKKy8vLyB0cmVlIG5vZGUgc3RyZWFtIHVzZWQgYnkgQU5UTFIuCisvLy8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzY29tbW9udHJlZW5vZGVzdHJlYW0uaD4KKworI2lmZGVmCUFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAwICkKKyNlbmRpZgorCisvLyBDT01NT04gVFJFRSBTVFJFQU0gQVBJCisvLworc3RhdGljCXZvaWQJCQkJCQlhZGROYXZpZ2F0aW9uTm9kZQkJCShwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnMsIEFOVExSM19VSU5UMzIgdHR5cGUpOworc3RhdGljCUFOVExSM19CT09MRUFOCQkJCWhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcwkocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkJCW5ld0Rvd25Ob2RlCQkJCQkocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkJCW5ld1VwTm9kZQkJCQkJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3Rucyk7CitzdGF0aWMJdm9pZAkJCQkJCXJlc2V0CQkJCQkJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3Rucyk7CitzdGF0aWMJdm9pZAkJCQkJCXB1c2gJCQkJCQkocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zLCBBTlRMUjNfSU5UMzIgaW5kZXgpOworc3RhdGljCUFOVExSM19JTlQzMgkJCQlwb3AJCQkJCQkJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3Rucyk7CisvL3N0YXRpYwlBTlRMUjNfSU5UMzIJCQkJaW5kZXgJCQkJCQkocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zKTsKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCQkJCWdldExvb2thaGVhZFNpemUJCQkocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zKTsKKy8vIFRSRUUgTk9ERSBTVFJFQU0gQVBJCisvLworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgICBnZXRUcmVlQWRhcHRvcgkJCQkocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucyk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJCQlnZXRUcmVlU291cmNlCQkJCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkJCV9MVAkJCQkJCQkocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucywgQU5UTFIzX0lOVDMyIGspOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCQkJZ2V0CQkJCQkJCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBBTlRMUjNfSU5UMzIgayk7CitzdGF0aWMJdm9pZAkJCQkJCXNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlcwkocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucywgQU5UTFIzX0JPT0xFQU4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzKTsKK3N0YXRpYwlwQU5UTFIzX1NUUklORwkJCQl0b1N0cmluZwkJCQkJKHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTSB0bnMpOworc3RhdGljCXBBTlRMUjNfU1RSSU5HCQkJCXRvU3RyaW5nU1MJCQkJCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBwQU5UTFIzX0JBU0VfVFJFRSBzdGFydCwgcEFOVExSM19CQVNFX1RSRUUgc3RvcCk7CitzdGF0aWMJdm9pZAkJCQkJCXRvU3RyaW5nV29yawkJCQkocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucywgcEFOVExSM19CQVNFX1RSRUUgc3RhcnQsIHBBTlRMUjNfQkFTRV9UUkVFIHN0b3AsIHBBTlRMUjNfU1RSSU5HIGJ1Zik7CitzdGF0aWMJdm9pZAkJCQkJCXJlcGxhY2VDaGlsZHJlbgkJCQkocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucywgcEFOVExSM19CQVNFX1RSRUUgcGFyZW50LCBBTlRMUjNfSU5UMzIgc3RhcnRDaGlsZEluZGV4LCBBTlRMUjNfSU5UMzIgc3RvcENoaWxkSW5kZXgsIHBBTlRMUjNfQkFTRV9UUkVFIHQpOworCisvLyBJTlQgU1RSRUFNIEFQSQorLy8KK3N0YXRpYwl2b2lkCQkJCQkJY29uc3VtZQkJCQkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljCUFOVExSM19NQVJLRVIJCQkJdGluZGV4CQkJCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMJQU5UTFIzX1VJTlQzMgkJCQlfTEEJCQkJCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX0lOVDMyIGkpOworc3RhdGljCUFOVExSM19NQVJLRVIJCQkJbWFyawkJCQkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljCXZvaWQJCQkJCQlyZWxlYXNlCQkJCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBtYXJrZXIpOworc3RhdGljCXZvaWQJCQkJCQlyZXdpbmRNYXJrCQkJCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIG1hcmtlcik7CitzdGF0aWMJdm9pZAkJCQkJCXJld2luZExhc3QJCQkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljCXZvaWQJCQkJCQlzZWVrCQkJCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBpbmRleCk7CitzdGF0aWMJQU5UTFIzX1VJTlQzMgkJCQlzaXplCQkJCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CisKKworLy8gSGVscGVyIGZ1bmN0aW9ucworLy8KK3N0YXRpYwl2b2lkCQkJCQkJZmlsbEJ1ZmZlcgkJCQkJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3RucywgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJdm9pZAkJCQkJCWZpbGxCdWZmZXJSb290CQkJCShwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnMpOworCisvLyBDb25zdHJ1Y3RvcnMKKy8vCitzdGF0aWMJdm9pZAkJCQkJCWFudGxyM1RyZWVOb2RlU3RyZWFtRnJlZQkJCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zKTsKK3N0YXRpYwl2b2lkCQkJCQkJYW50bHIzQ29tbW9uVHJlZU5vZGVTdHJlYW1GcmVlCQkocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0KK2FudGxyM1RyZWVOb2RlU3RyZWFtTmV3KCkKK3sKKyAgICBwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gc3RyZWFtOworCisgICAgLy8gTWVtb3J5IGZvciB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZQorICAgIC8vCisgICAgc3RyZWFtICA9IChwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0pIEFOVExSM19DQUxMT0MoMSwgc2l6ZW9mKEFOVExSM19UUkVFX05PREVfU1RSRUFNKSk7CisKKyAgICBpZgkoc3RyZWFtID09IE5VTEwpCisgICAgeworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKyAgICAvLyBJbnN0YWxsIGJhc2ljIEFQSSAKKyAgICAvLworCXN0cmVhbS0+cmVwbGFjZUNoaWxkcmVuID0gcmVwbGFjZUNoaWxkcmVuOworICAgIHN0cmVhbS0+ZnJlZQkJCT0gYW50bHIzVHJlZU5vZGVTdHJlYW1GcmVlOworICAgIAorICAgIHJldHVybiBzdHJlYW07Cit9CisKK3N0YXRpYyB2b2lkCithbnRscjNUcmVlTm9kZVN0cmVhbUZyZWUocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHN0cmVhbSkKK3sgICAKKyAgICBBTlRMUjNfRlJFRShzdHJlYW0pOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0KK2FudGxyM0NvbW1vblRyZWVOb2RlU3RyZWFtTmV3VHJlZShwQU5UTFIzX0JBU0VfVFJFRSB0cmVlLCBBTlRMUjNfVUlOVDMyIGhpbnQpCit7CisJcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBzdHJlYW07CisKKwlzdHJlYW0gPSBhbnRscjNDb21tb25UcmVlTm9kZVN0cmVhbU5ldyh0cmVlLT5zdHJGYWN0b3J5LCBoaW50KTsKKworCWlmCShzdHJlYW0gPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKwlzdHJlYW0tPnJvb3QgICAgPSB0cmVlOworCisJcmV0dXJuIHN0cmVhbTsKK30KKworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNCithbnRscjNDb21tb25UcmVlTm9kZVN0cmVhbU5ld1N0cmVhbShwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGluU3RyZWFtKQoreworCXBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gc3RyZWFtOworCisJLy8gTWVtb3J5IGZvciB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZQorCS8vCisJc3RyZWFtICA9IChwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNKSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0pKTsKKworCWlmCShzdHJlYW0gPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8vIENvcHkgaW4gYWxsIHRoZSByZXVzYWJsZSBwYXJ0cyBvZiB0aGUgb3JpZ2luYXRpbmcgc3RyZWFtIGFuZCBjcmVhdGUgbmV3CisJLy8gcGllY2VzIHdoZXJlIG5lY2Vzc2FyeS4KKwkvLworCisJLy8gU3RyaW5nIGZhY3RvcnkgZm9yIHRyZWUgd2Fsa2VyCisJLy8KKwlzdHJlYW0tPnN0cmluZ0ZhY3RvcnkJCT0gaW5TdHJlYW0tPnN0cmluZ0ZhY3Rvcnk7CisKKwkvLyBDcmVhdGUgYW4gYWRhcHRvciBmb3IgdGhlIGNvbW1vbiB0cmVlIG5vZGUgc3RyZWFtCisJLy8KKwlzdHJlYW0tPmFkYXB0b3IJCQkJPSBpblN0cmVhbS0+YWRhcHRvcjsKKworCS8vIENyZWF0ZSBzcGFjZSBmb3IgdGhlIHRyZWUgbm9kZSBzdHJlYW0gaW50ZXJmYWNlCisJLy8KKwlzdHJlYW0tPnRuc3RyZWFtCSAgICA9IGFudGxyM1RyZWVOb2RlU3RyZWFtTmV3KCk7CisKKwlpZgkoc3RyZWFtLT50bnN0cmVhbSA9PSBOVUxMKQorCXsKKwkJc3RyZWFtLT5mcmVlCQkJCShzdHJlYW0pOworCisJCXJldHVybglOVUxMOworCX0KKworCS8vIENyZWF0ZSBzcGFjZSBmb3IgdGhlIElOVF9TVFJFQU0gaW50ZXJmYWNlCisJLy8KKwlzdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtCQkgICAgPSAgYW50bHIzSW50U3RyZWFtTmV3KCk7CisKKwlpZgkoc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbSA9PSBOVUxMKQorCXsKKwkJc3RyZWFtLT50bnN0cmVhbS0+ZnJlZQkJKHN0cmVhbS0+dG5zdHJlYW0pOworCQlzdHJlYW0tPmZyZWUJCQkJKHN0cmVhbSk7CisKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJLy8gSW5zdGFsbCB0aGUgY29tbW9uIHRyZWUgbm9kZSBzdHJlYW0gQVBJCisJLy8KKwlzdHJlYW0tPmFkZE5hdmlnYXRpb25Ob2RlCQkgICAgPSAgYWRkTmF2aWdhdGlvbk5vZGU7CisJc3RyZWFtLT5oYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMgICAgPSAgaGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzOworCXN0cmVhbS0+bmV3RG93bk5vZGUJCQkJCT0gIG5ld0Rvd25Ob2RlOworCXN0cmVhbS0+bmV3VXBOb2RlCQkJCQk9ICBuZXdVcE5vZGU7CisJc3RyZWFtLT5yZXNldAkJCQkJCT0gIHJlc2V0OworCXN0cmVhbS0+cHVzaAkJCQkJCT0gIHB1c2g7CisJc3RyZWFtLT5wb3AJCQkJCQkJPSAgcG9wOworCXN0cmVhbS0+Z2V0TG9va2FoZWFkU2l6ZQkJCT0gIGdldExvb2thaGVhZFNpemU7CisKKwlzdHJlYW0tPmZyZWUJCQkgICAgPSAgYW50bHIzQ29tbW9uVHJlZU5vZGVTdHJlYW1GcmVlOworCisJLy8gSW5zdGFsbCB0aGUgdHJlZSBub2RlIHN0cmVhbSBBUEkKKwkvLworCXN0cmVhbS0+dG5zdHJlYW0tPmdldFRyZWVBZGFwdG9yCQkJPSAgZ2V0VHJlZUFkYXB0b3I7CisJc3RyZWFtLT50bnN0cmVhbS0+Z2V0VHJlZVNvdXJjZQkJCQk9ICBnZXRUcmVlU291cmNlOworCXN0cmVhbS0+dG5zdHJlYW0tPl9MVAkJCQkJCT0gIF9MVDsKKwlzdHJlYW0tPnRuc3RyZWFtLT5zZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXMJPSAgc2V0VW5pcXVlTmF2aWdhdGlvbk5vZGVzOworCXN0cmVhbS0+dG5zdHJlYW0tPnRvU3RyaW5nCQkJCQk9ICB0b1N0cmluZzsKKwlzdHJlYW0tPnRuc3RyZWFtLT50b1N0cmluZ1NTCQkJCT0gIHRvU3RyaW5nU1M7CisJc3RyZWFtLT50bnN0cmVhbS0+dG9TdHJpbmdXb3JrCQkJCT0gIHRvU3RyaW5nV29yazsKKwlzdHJlYW0tPnRuc3RyZWFtLT5nZXQJCQkJCQk9ICBnZXQ7CisKKwkvLyBJbnN0YWxsIElOVF9TVFJFQU0gaW50ZXJmYWNlCisJLy8KKwlzdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtLT5jb25zdW1lCSAgICA9ICBjb25zdW1lOworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPmluZGV4CSAgICA9ICB0aW5kZXg7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+X0xBCQkJPSAgX0xBOworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPm1hcmsJCQk9ICBtYXJrOworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPnJlbGVhc2UJICAgID0gIHJlbGVhc2U7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+cmV3aW5kCSAgICA9ICByZXdpbmRNYXJrOworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPnJld2luZExhc3QgICA9ICByZXdpbmRMYXN0OworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPnNlZWsJCQk9ICBzZWVrOworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPnNpemUJCQk9ICBzaXplOworCisJLy8gSW5pdGlhbGl6ZSBkYXRhIGVsZW1lbnRzIG9mIElOVCBzdHJlYW0KKwkvLworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPnR5cGUJCQk9IEFOVExSM19DT01NT05UUkVFTk9ERTsKKwlzdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtLT5zdXBlcgkgICAgPSAgKHN0cmVhbS0+dG5zdHJlYW0pOworCisJLy8gSW5pdGlhbGl6ZSBkYXRhIGVsZW1lbnRzIG9mIFRSRUUgc3RyZWFtCisJLy8KKwlzdHJlYW0tPnRuc3RyZWFtLT5jdG5zID0gIHN0cmVhbTsKKworCS8vIEluaXRpYWxpemUgZGF0YSBlbGVtZW50cyBvZiB0aGUgQ09NTU9OIFRSRUUgTk9ERSBzdHJlYW0KKwkvLworCXN0cmVhbS0+c3VwZXIJCQkJCT0gTlVMTDsKKwlzdHJlYW0tPnVuaXF1ZU5hdmlnYXRpb25Ob2Rlcwk9IEFOVExSM19GQUxTRTsKKwlzdHJlYW0tPm1hcmtlcnMJCQkJCT0gTlVMTDsKKwlzdHJlYW0tPm5vZGVTdGFjawkJCQk9IGluU3RyZWFtLT5ub2RlU3RhY2s7CisKKwkvLyBDcmVhdGUgdGhlIG5vZGUgbGlzdCBtYXAKKwkvLworCXN0cmVhbS0+bm9kZXMJPSBhbnRscjNWZWN0b3JOZXcoREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKTsKKwlzdHJlYW0tPnAJCT0gLTE7CisKKwkvLyBJbnN0YWxsIHRoZSBuYXZpZ2F0aW9uIG5vZGVzICAgICAKKwkvLworCQorCS8vIEluc3RhbGwgdGhlIG5hdmlnYXRpb24gbm9kZXMgICAgIAorCS8vCisJYW50bHIzU2V0Q1RBUEkoJihzdHJlYW0tPlVQKSk7CisJYW50bHIzU2V0Q1RBUEkoJihzdHJlYW0tPkRPV04pKTsKKwlhbnRscjNTZXRDVEFQSSgmKHN0cmVhbS0+RU9GX05PREUpKTsKKwlhbnRscjNTZXRDVEFQSSgmKHN0cmVhbS0+SU5WQUxJRF9OT0RFKSk7CisKKwlzdHJlYW0tPlVQLnRva2VuCQkJCQkJPSBpblN0cmVhbS0+VVAudG9rZW47CisJaW5TdHJlYW0tPlVQLnRva2VuLT5zdHJGYWN0b3J5CQkJPSBzdHJlYW0tPnN0cmluZ0ZhY3Rvcnk7CisJc3RyZWFtLT5ET1dOLnRva2VuCQkJCQkJPSBpblN0cmVhbS0+RE9XTi50b2tlbjsKKwlpblN0cmVhbS0+RE9XTi50b2tlbi0+c3RyRmFjdG9yeQkJPSBzdHJlYW0tPnN0cmluZ0ZhY3Rvcnk7CisJc3RyZWFtLT5FT0ZfTk9ERS50b2tlbgkJCQkJPSBpblN0cmVhbS0+RU9GX05PREUudG9rZW47CisJaW5TdHJlYW0tPkVPRl9OT0RFLnRva2VuLT5zdHJGYWN0b3J5CT0gc3RyZWFtLT5zdHJpbmdGYWN0b3J5OworCXN0cmVhbS0+SU5WQUxJRF9OT0RFLnRva2VuCQkJCT0gaW5TdHJlYW0tPklOVkFMSURfTk9ERS50b2tlbjsKKwlpblN0cmVhbS0+SU5WQUxJRF9OT0RFLnRva2VuLT5zdHJGYWN0b3J5PSBzdHJlYW0tPnN0cmluZ0ZhY3Rvcnk7CisKKwkvLyBSZXVzZSB0aGUgcm9vdCB0cmVlIG9mIHRoZSBvcmlnaW5hdGluZyBzdHJlYW0KKwkvLworCXN0cmVhbS0+cm9vdAkJPSBpblN0cmVhbS0+cm9vdDsKKworCS8vIFNpZ25hbCB0aGF0IHRoaXMgaXMgYSByZXdyaXRpbmcgc3RyZWFtIHNvIHdlIGRvbid0CisJLy8gZnJlZSB0aGUgb3JpZ2luYXRpbmcgdHJlZS4gQW55dGhpbmcgdGhhdCB3ZSByZXdyaXRlIG9yCisJLy8gZHVwbGljYXRlIGhlcmUgd2lsbCBiZSBkb25lIHRocm91Z2ggdGhlIGFkYXB0b3Igb3IgCisJLy8gdGhlIG9yaWdpbmFsIHRyZWUgZmFjdG9yeS4KKwkvLworCXN0cmVhbS0+aXNSZXdyaXRlcgk9IEFOVExSM19UUlVFOworCXJldHVybiBzdHJlYW07Cit9CisKK0FOVExSM19BUEkgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTQorYW50bHIzQ29tbW9uVHJlZU5vZGVTdHJlYW1OZXcocEFOVExSM19TVFJJTkdfRkFDVE9SWSBzdHJGYWN0b3J5LCBBTlRMUjNfVUlOVDMyIGhpbnQpCit7CisJcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBzdHJlYW07CisJcEFOVExSM19DT01NT05fVE9LRU4JCQl0b2tlbjsKKworCS8vIE1lbW9yeSBmb3IgdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUKKwkvLworCXN0cmVhbSAgPSAocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSkgQU5UTFIzX0NBTExPQygxLCBzaXplb2YoQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNKSk7CisKKwlpZgkoc3RyZWFtID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvLyBTdHJpbmcgZmFjdG9yeSBmb3IgdHJlZSB3YWxrZXIKKwkvLworCXN0cmVhbS0+c3RyaW5nRmFjdG9yeQkJPSBzdHJGYWN0b3J5OworCisJLy8gQ3JlYXRlIGFuIGFkYXB0b3IgZm9yIHRoZSBjb21tb24gdHJlZSBub2RlIHN0cmVhbQorCS8vCisJc3RyZWFtLT5hZGFwdG9yCQkJCT0gQU5UTFIzX1RSRUVfQURBUFRPUk5ldyhzdHJGYWN0b3J5KTsKKworCWlmCShzdHJlYW0tPmFkYXB0b3IgPT0gTlVMTCkKKwl7CisJCXN0cmVhbS0+ZnJlZShzdHJlYW0pOworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvLyBDcmVhdGUgc3BhY2UgZm9yIHRoZSB0cmVlIG5vZGUgc3RyZWFtIGludGVyZmFjZQorCS8vCisJc3RyZWFtLT50bnN0cmVhbQkgICAgPSBhbnRscjNUcmVlTm9kZVN0cmVhbU5ldygpOworCisJaWYJKHN0cmVhbS0+dG5zdHJlYW0gPT0gTlVMTCkKKwl7CisJCXN0cmVhbS0+YWRhcHRvci0+ZnJlZQkJKHN0cmVhbS0+YWRhcHRvcik7CisJCXN0cmVhbS0+ZnJlZQkJCQkoc3RyZWFtKTsKKworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvLyBDcmVhdGUgc3BhY2UgZm9yIHRoZSBJTlRfU1RSRUFNIGludGVyZmFjZQorCS8vCisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbQkJICAgID0gIGFudGxyM0ludFN0cmVhbU5ldygpOworCisJaWYJKHN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0gPT0gTlVMTCkKKwl7CisJCXN0cmVhbS0+YWRhcHRvci0+ZnJlZQkJKHN0cmVhbS0+YWRhcHRvcik7CisJCXN0cmVhbS0+dG5zdHJlYW0tPmZyZWUJCShzdHJlYW0tPnRuc3RyZWFtKTsKKwkJc3RyZWFtLT5mcmVlCQkJCShzdHJlYW0pOworCisJCXJldHVybglOVUxMOworCX0KKworCS8vIEluc3RhbGwgdGhlIGNvbW1vbiB0cmVlIG5vZGUgc3RyZWFtIEFQSQorCS8vCisJc3RyZWFtLT5hZGROYXZpZ2F0aW9uTm9kZQkJICAgID0gIGFkZE5hdmlnYXRpb25Ob2RlOworCXN0cmVhbS0+aGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzICAgID0gIGhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKwlzdHJlYW0tPm5ld0Rvd25Ob2RlCQkJCQk9ICBuZXdEb3duTm9kZTsKKwlzdHJlYW0tPm5ld1VwTm9kZQkJCQkJPSAgbmV3VXBOb2RlOworCXN0cmVhbS0+cmVzZXQJCQkJCQk9ICByZXNldDsKKwlzdHJlYW0tPnB1c2gJCQkJCQk9ICBwdXNoOworCXN0cmVhbS0+cG9wCQkJCQkJCT0gIHBvcDsKKworCXN0cmVhbS0+ZnJlZQkJCSAgICA9ICBhbnRscjNDb21tb25UcmVlTm9kZVN0cmVhbUZyZWU7CisKKwkvLyBJbnN0YWxsIHRoZSB0cmVlIG5vZGUgc3RyZWFtIEFQSQorCS8vCisJc3RyZWFtLT50bnN0cmVhbS0+Z2V0VHJlZUFkYXB0b3IJCQk9ICBnZXRUcmVlQWRhcHRvcjsKKwlzdHJlYW0tPnRuc3RyZWFtLT5nZXRUcmVlU291cmNlCQkJCT0gIGdldFRyZWVTb3VyY2U7CisJc3RyZWFtLT50bnN0cmVhbS0+X0xUCQkJCQkJPSAgX0xUOworCXN0cmVhbS0+dG5zdHJlYW0tPnNldFVuaXF1ZU5hdmlnYXRpb25Ob2Rlcwk9ICBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM7CisJc3RyZWFtLT50bnN0cmVhbS0+dG9TdHJpbmcJCQkJCT0gIHRvU3RyaW5nOworCXN0cmVhbS0+dG5zdHJlYW0tPnRvU3RyaW5nU1MJCQkJPSAgdG9TdHJpbmdTUzsKKwlzdHJlYW0tPnRuc3RyZWFtLT50b1N0cmluZ1dvcmsJCQkJPSAgdG9TdHJpbmdXb3JrOworCXN0cmVhbS0+dG5zdHJlYW0tPmdldAkJCQkJCT0gIGdldDsKKworCS8vIEluc3RhbGwgSU5UX1NUUkVBTSBpbnRlcmZhY2UKKwkvLworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPmNvbnN1bWUJICAgID0gIGNvbnN1bWU7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+aW5kZXgJICAgID0gIHRpbmRleDsKKwlzdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtLT5fTEEJCQk9ICBfTEE7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+bWFyawkJCT0gIG1hcms7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+cmVsZWFzZQkgICAgPSAgcmVsZWFzZTsKKwlzdHJlYW0tPnRuc3RyZWFtLT5pc3RyZWFtLT5yZXdpbmQJICAgID0gIHJld2luZE1hcms7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+cmV3aW5kTGFzdCAgID0gIHJld2luZExhc3Q7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+c2VlawkJCT0gIHNlZWs7CisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+c2l6ZQkJCT0gIHNpemU7CisKKwkvLyBJbml0aWFsaXplIGRhdGEgZWxlbWVudHMgb2YgSU5UIHN0cmVhbQorCS8vCisJc3RyZWFtLT50bnN0cmVhbS0+aXN0cmVhbS0+dHlwZQkJCT0gQU5UTFIzX0NPTU1PTlRSRUVOT0RFOworCXN0cmVhbS0+dG5zdHJlYW0tPmlzdHJlYW0tPnN1cGVyCSAgICA9ICAoc3RyZWFtLT50bnN0cmVhbSk7CisKKwkvLyBJbml0aWFsaXplIGRhdGEgZWxlbWVudHMgb2YgVFJFRSBzdHJlYW0KKwkvLworCXN0cmVhbS0+dG5zdHJlYW0tPmN0bnMgPSAgc3RyZWFtOworCisJLy8gSW5pdGlhbGl6ZSBkYXRhIGVsZW1lbnRzIG9mIHRoZSBDT01NT04gVFJFRSBOT0RFIHN0cmVhbQorCS8vCisJc3RyZWFtLT5zdXBlcgkJCQkJPSBOVUxMOworCXN0cmVhbS0+dW5pcXVlTmF2aWdhdGlvbk5vZGVzCT0gQU5UTFIzX0ZBTFNFOworCXN0cmVhbS0+bWFya2VycwkJCQkJPSBOVUxMOworCXN0cmVhbS0+bm9kZVN0YWNrCQkJCT0gYW50bHIzU3RhY2tOZXcoSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUpOworCisJLy8gQ3JlYXRlIHRoZSBub2RlIGxpc3QgbWFwCisJLy8KKwlpZgkoaGludCA9PSAwKQorCXsKKwkJaGludCA9IERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRTsKKwl9CisJc3RyZWFtLT5ub2Rlcwk9IGFudGxyM1ZlY3Rvck5ldyhoaW50KTsKKwlzdHJlYW0tPnAJCT0gLTE7CisKKwkvLyBJbnN0YWxsIHRoZSBuYXZpZ2F0aW9uIG5vZGVzICAgICAKKwkvLworCWFudGxyM1NldENUQVBJKCYoc3RyZWFtLT5VUCkpOworCWFudGxyM1NldENUQVBJKCYoc3RyZWFtLT5ET1dOKSk7CisJYW50bHIzU2V0Q1RBUEkoJihzdHJlYW0tPkVPRl9OT0RFKSk7CisJYW50bHIzU2V0Q1RBUEkoJihzdHJlYW0tPklOVkFMSURfTk9ERSkpOworCisJdG9rZW4JCQkJCQk9IGFudGxyM0NvbW1vblRva2VuTmV3KEFOVExSM19UT0tFTl9VUCk7CisJdG9rZW4tPnN0ckZhY3RvcnkJCQk9IHN0ckZhY3Rvcnk7CisJdG9rZW4tPnRleHRTdGF0ZQkJCT0gQU5UTFIzX1RFWFRfQ0hBUlA7CisJdG9rZW4tPnRva1RleHQuY2hhcnMJCT0gKHBBTlRMUjNfVUNIQVIpIlVQIjsKKwlzdHJlYW0tPlVQLnRva2VuCQkJPSB0b2tlbjsKKworCXRva2VuCQkJCQkJPSBhbnRscjNDb21tb25Ub2tlbk5ldyhBTlRMUjNfVE9LRU5fRE9XTik7CisJdG9rZW4tPnN0ckZhY3RvcnkJCQk9IHN0ckZhY3Rvcnk7CisJdG9rZW4tPnRleHRTdGF0ZQkJCT0gQU5UTFIzX1RFWFRfQ0hBUlA7CisJdG9rZW4tPnRva1RleHQuY2hhcnMJCT0gKHBBTlRMUjNfVUNIQVIpIkRPV04iOworCXN0cmVhbS0+RE9XTi50b2tlbgkJCT0gdG9rZW47CisKKwl0b2tlbgkJCQkJCT0gYW50bHIzQ29tbW9uVG9rZW5OZXcoQU5UTFIzX1RPS0VOX0VPRik7CisJdG9rZW4tPnN0ckZhY3RvcnkJCQk9IHN0ckZhY3Rvcnk7CisJdG9rZW4tPnRleHRTdGF0ZQkJCT0gQU5UTFIzX1RFWFRfQ0hBUlA7CisJdG9rZW4tPnRva1RleHQuY2hhcnMJCT0gKHBBTlRMUjNfVUNIQVIpIkVPRiI7CisJc3RyZWFtLT5FT0ZfTk9ERS50b2tlbgkJPSB0b2tlbjsKKworCXRva2VuCQkJCQkJPSBhbnRscjNDb21tb25Ub2tlbk5ldyhBTlRMUjNfVE9LRU5fSU5WQUxJRCk7CisJdG9rZW4tPnN0ckZhY3RvcnkJCQk9IHN0ckZhY3Rvcnk7CisJdG9rZW4tPnRleHRTdGF0ZQkJCT0gQU5UTFIzX1RFWFRfQ0hBUlA7CisJdG9rZW4tPnRva1RleHQuY2hhcnMJCT0gKHBBTlRMUjNfVUNIQVIpIklOVkFMSUQiOworCXN0cmVhbS0+SU5WQUxJRF9OT0RFLnRva2VuCT0gdG9rZW47CisKKworCXJldHVybiAgc3RyZWFtOworfQorCisvLy8gRnJlZSB1cCBhbnkgcmVzb3VyY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY29tbW9uIHRyZWUgbm9kZSBzdHJlYW0uCisvLy8KK3N0YXRpYwl2b2lkCQkJICAgIGFudGxyM0NvbW1vblRyZWVOb2RlU3RyZWFtRnJlZSAgKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3RucykKK3sKKworCS8vIElmIHRoaXMgaXMgYSByZXdydGluZyBzdHJlYW0sIHRoZW4gY2VydGFpbiByZXNvdXJjZXMKKwkvLyBiZWxvbmcgdG8gdGhlIG9yaWdpbmF0aW5nIG5vZGUgc3RyZWFtIGFuZCB3ZSBkbyBub3QKKwkvLyBmcmVlIHRoZW0gaGVyZS4KKwkvLworCWlmCShjdG5zLT5pc1Jld3JpdGVyICE9IEFOVExSM19UUlVFKQorCXsKKwkJY3Rucy0+YWRhcHRvcgkJCS0+ZnJlZSAgKGN0bnMtPmFkYXB0b3IpOworCisJCWlmCShjdG5zLT5ub2RlU3RhY2sgIT0gTlVMTCkKKwkJeworCQkJY3Rucy0+bm9kZVN0YWNrLT5mcmVlKGN0bnMtPm5vZGVTdGFjayk7CisJCX0KKworCQlBTlRMUjNfRlJFRShjdG5zLT5JTlZBTElEX05PREUudG9rZW4pOworCQlBTlRMUjNfRlJFRShjdG5zLT5FT0ZfTk9ERS50b2tlbik7CisJCUFOVExSM19GUkVFKGN0bnMtPkRPV04udG9rZW4pOworCQlBTlRMUjNfRlJFRShjdG5zLT5VUC50b2tlbik7CisJfQorCQorCWlmCShjdG5zLT5ub2RlcyAhPSBOVUxMKQorCXsKKwkJY3Rucy0+bm9kZXMJCQktPmZyZWUgIChjdG5zLT5ub2Rlcyk7CisJfQorCWN0bnMtPnRuc3RyZWFtLT5pc3RyZWFtIC0+ZnJlZSAgKGN0bnMtPnRuc3RyZWFtLT5pc3RyZWFtKTsKKyAgICBjdG5zLT50bnN0cmVhbQkJCS0+ZnJlZSAgKGN0bnMtPnRuc3RyZWFtKTsKKworCisgICAgQU5UTFIzX0ZSRUUoY3Rucyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9jYWwgaGVscGVycworLy8KKworLy8vIFdhbGsgYW5kIGZpbGwgdGhlIHRyZWUgbm9kZSBidWZmZXIgZnJvbSB0aGUgcm9vdCB0cmVlCisvLy8KK3N0YXRpYyB2b2lkCitmaWxsQnVmZmVyUm9vdChwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnMpCit7CisJLy8gQ2FsbCB0aGUgZ2VuZXJpYyBidWZmZXIgcm91dGluZSB3aXRoIHRoZSByb290IGFzIHRoZQorCS8vIGFyZ3VtZW50CisJLy8KKwlmaWxsQnVmZmVyKGN0bnMsIGN0bnMtPnJvb3QpOworCWN0bnMtPnAgPSAwOwkJCQkJLy8gSW5kaWNhdGUgd2UgYXJlIGF0IGJ1ZmZlciBzdGFydAorfQorCisvLy8gV2FsayB0cmVlIHdpdGggZGVwdGgtZmlyc3Qtc2VhcmNoIGFuZCBmaWxsIG5vZGVzIGJ1ZmZlci4KKy8vLyBEb24ndCBhZGQgaW4gRE9XTiwgVVAgbm9kZXMgaWYgdGhlIHN1cHBsaWVkIHRyZWUgaXMgYSBsaXN0ICh0IGlzIGlzTmlsTm9kZSkKKy8vIHN1Y2ggYXMgdGhlIHJvb3QgdHJlZSBpcy4KKy8vLworc3RhdGljIHZvaWQKK2ZpbGxCdWZmZXIocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zLCBwQU5UTFIzX0JBU0VfVFJFRSB0KQoreworCUFOVExSM19CT09MRUFOCW5pbE5vZGU7CisJQU5UTFIzX1VJTlQzMgluQ291bnQ7CisJQU5UTFIzX1VJTlQzMgljOworCisJbmlsTm9kZSA9IGN0bnMtPmFkYXB0b3ItPmlzTmlsTm9kZShjdG5zLT5hZGFwdG9yLCB0KTsKKworCS8vIElmIHRoZSBzdXBwbGllZCBub2RlIGlzIG5vdCBhIG5pbCAobGlzdCkgbm9kZSB0aGVuIHdlCisJLy8gYWRkIGluIHRoZSBub2RlIGl0c2VsZiB0byB0aGUgdmVjdG9yCisJLy8KKwlpZgkobmlsTm9kZSA9PSBBTlRMUjNfRkFMU0UpCisJeworCQljdG5zLT5ub2Rlcy0+YWRkKGN0bnMtPm5vZGVzLCB0LCBOVUxMKTsJCisJfQorCisJLy8gT25seSBhZGQgYSBET1dOIG5vZGUgaWYgdGhlIHRyZWUgaXMgbm90IGEgbmlsIHRyZWUgYW5kCisJLy8gdGhlIHRyZWUgZG9lcyBoYXZlIGNoaWxkcmVuLgorCS8vCisJbkNvdW50ID0gdC0+Z2V0Q2hpbGRDb3VudCh0KTsKKworCWlmCShuaWxOb2RlID09IEFOVExSM19GQUxTRSAmJiBuQ291bnQ+MCkKKwl7CisJCWN0bnMtPmFkZE5hdmlnYXRpb25Ob2RlKGN0bnMsIEFOVExSM19UT0tFTl9ET1dOKTsKKwl9CisKKwkvLyBXZSBhbHdheXMgYWRkIGFueSBjaGlsZHJlbiB0aGUgdHJlZSBjb250YWlucywgd2hpY2ggaXMKKwkvLyBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIHdoaWNoIHdpbGwgY2F1c2Ugc2ltaWxhcgorCS8vIHJlY3Vyc2lvbiBhbmQgaW1wbGVtZW50IGEgZGVwdGggZmlyc3QgYWRkaXRpb24KKwkvLworCWZvcgkoYyA9IDA7IGMgPCBuQ291bnQ7IGMrKykKKwl7CisJCWZpbGxCdWZmZXIoY3RucywgY3Rucy0+YWRhcHRvci0+Z2V0Q2hpbGQoY3Rucy0+YWRhcHRvciwgdCwgYykpOworCX0KKworCS8vIElmIHRoZSB0cmVlIGhhZCBjaGlsZHJlbiBhbmQgd2FzIG5vdCBhIG5pbCAobGlzdCkgbm9kZSwgdGhlbiB3ZQorCS8vIHdlIG5lZWQgdG8gYWRkIGFuIFVQIG5vZGUgaGVyZSB0byBtYXRjaCB0aGUgRE9XTiBub2RlCisJLy8KKwlpZgkobmlsTm9kZSA9PSBBTlRMUjNfRkFMU0UgJiYgbkNvdW50ID4gMCkKKwl7CisJCWN0bnMtPmFkZE5hdmlnYXRpb25Ob2RlKGN0bnMsIEFOVExSM19UT0tFTl9VUCk7CisJfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50ZXJmYWNlIGZ1bmN0aW9ucworLy8KKworLy8vIFJlc2V0IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBub2Rlcy4KKy8vLworc3RhdGljCXZvaWQJCQorcmVzZXQJICAgIChwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnMpCit7CisJaWYJKGN0bnMtPnAgIT0gLTEpCisJeworCQljdG5zLT5wCQkJCQkJCQkJPSAwOworCX0KKwljdG5zLT50bnN0cmVhbS0+aXN0cmVhbS0+bGFzdE1hcmtlcgkJPSAwOworCisKKwkvLyBGcmVlIGFuZCByZXNldCB0aGUgbm9kZSBzdGFjayBvbmx5IGlmIHRoaXMgaXMgbm90CisJLy8gYSByZXdyaXRlciwgd2hpY2ggaXMgZ29pbmcgdG8gcmV1c2UgdGhlIG9yaWdpbmF0aW5nCisJLy8gbm9kZSBzdHJlYW1zIG5vZGUgc3RhY2sKKwkvLworCWlmICAoY3Rucy0+aXNSZXdyaXRlciAhPSBBTlRMUjNfVFJVRSkKKyAgICB7CisJCWlmCShjdG5zLT5ub2RlU3RhY2sgIT0gTlVMTCkKKwkJeworCQkJY3Rucy0+bm9kZVN0YWNrLT5mcmVlKGN0bnMtPm5vZGVTdGFjayk7CisJCQljdG5zLT5ub2RlU3RhY2sgPSBhbnRscjNTdGFja05ldyhJTklUSUFMX0NBTExfU1RBQ0tfU0laRSk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHBBTlRMUjNfQkFTRV9UUkVFCitMQihwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBBTlRMUjNfSU5UMzIgaykKK3sKKwlpZgkoIGs9PTApCisJeworCQlyZXR1cm4JJih0bnMtPmN0bnMtPklOVkFMSURfTk9ERS5iYXNlVHJlZSk7CisJfQorCisJaWYJKCAodG5zLT5jdG5zLT5wIC0gaykgPCAwKQorCXsKKwkJcmV0dXJuCSYodG5zLT5jdG5zLT5JTlZBTElEX05PREUuYmFzZVRyZWUpOworCX0KKworCXJldHVybiB0bnMtPmN0bnMtPm5vZGVzLT5nZXQodG5zLT5jdG5zLT5ub2RlcywgdG5zLT5jdG5zLT5wIC0gayk7Cit9CisKKy8vLyBHZXQgdHJlZSBub2RlIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgbm9kZS4KKy8vLyBpPDAgaW5kaWNhdGVzIG5vZGVzIGluIHRoZSBwYXN0LiAgU28gLTEgaXMgcHJldmlvdXMgbm9kZSBhbmQgLTIgaXMKKy8vLyB0d28gbm9kZXMgYWdvLiBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgaT49biwgcmV0dXJuIG51bGwuCisvLy8gUmV0dXJuIG51bGwgZm9yIExUKDApIGFuZCBhbnkgaW5kZXggdGhhdCByZXN1bHRzIGluIGFuIGFic29sdXRlIGFkZHJlc3MKKy8vLyB0aGF0IGlzIG5lZ2F0aXZlLgorLy8vCisvLy8gVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlIF9MVCgpIG1ldGhvZCBvZiB0aGUgVG9rZW5TdHJlYW0sIGJ1dCB0aGlzCisvLy8gcmV0dXJucyBhIHRyZWUgbm9kZSBpbnN0ZWFkIG9mIGEgdG9rZW4uICBNYWtlcyBjb2RlIGdlbiBpZGVudGljYWwKKy8vLyBmb3IgYm90aCBwYXJzZXIgYW5kIHRyZWUgZ3JhbW1hcnMuIDopCisvLy8KK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkgICAgCitfTFQJICAgIChwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBBTlRMUjNfSU5UMzIgaykKK3sKKwlpZgkodG5zLT5jdG5zLT5wID09IC0xKQorCXsKKwkJZmlsbEJ1ZmZlclJvb3QodG5zLT5jdG5zKTsKKwl9CisKKwlpZgkoayA8IDApCisJeworCQlyZXR1cm4gTEIodG5zLCAtayk7CisJfQorCWVsc2UgaWYJKGsgPT0gMCkKKwl7CisJCXJldHVybgkmKHRucy0+Y3Rucy0+SU5WQUxJRF9OT0RFLmJhc2VUcmVlKTsKKwl9CisKKwkvLyBrIHdhcyBhIGxlZ2l0aW1hdGUgcmVxdWVzdCwgCisJLy8KKwlpZgkoKCB0bnMtPmN0bnMtPnAgKyBrIC0gMSkgPj0gKEFOVExSM19JTlQzMikodG5zLT5jdG5zLT5ub2Rlcy0+Y291bnQpKQorCXsKKwkJcmV0dXJuICYodG5zLT5jdG5zLT5FT0ZfTk9ERS5iYXNlVHJlZSk7CisJfQorCisJcmV0dXJuCXRucy0+Y3Rucy0+bm9kZXMtPmdldCh0bnMtPmN0bnMtPm5vZGVzLCB0bnMtPmN0bnMtPnAgKyBrIC0gMSk7Cit9CisKKy8vLyBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIG5vZGVzIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisvLy8gdGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG5vZGUgb2JqZWN0cy4KKy8vLworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCSAgICAKK2dldFRyZWVTb3VyY2UJKHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTSB0bnMpCit7CisgICAgcmV0dXJuICB0bnMtPmN0bnMtPnJvb3Q7Cit9CisKKy8vLyBDb25zdW1lIHRoZSBuZXh0IG5vZGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisvLy8KK3N0YXRpYwl2b2lkCQkgICAgCitjb25zdW1lCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisgICAgcEFOVExSM19UUkVFX05PREVfU1RSRUFNCQl0bnM7CisgICAgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTQljdG5zOworCisgICAgdG5zCSAgICA9IChwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0pKGlzLT5zdXBlcik7CisgICAgY3RucyAgICA9IHRucy0+Y3RuczsKKworCWlmCShjdG5zLT5wID09IC0xKQorCXsKKwkJZmlsbEJ1ZmZlclJvb3QoY3Rucyk7CisJfQorCWN0bnMtPnArKzsKK30KKworc3RhdGljCUFOVExSM19VSU5UMzIJICAgIAorX0xBCSAgICAocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgaSkKK3sKKwlwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0JCXRuczsKKwlwQU5UTFIzX0JBU0VfVFJFRQkJCQl0OworCisJdG5zCSAgICA9IChwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0pKGlzLT5zdXBlcik7CisKKwkvLyBBc2sgTFQgZm9yIHRoZSAndG9rZW4nIGF0IHRoYXQgcG9zaXRpb24KKwkvLworCXQgPSB0bnMtPl9MVCh0bnMsIGkpOworCisJaWYJKHQgPT0gTlVMTCkKKwl7CisJCXJldHVybglBTlRMUjNfVE9LRU5fSU5WQUxJRDsKKwl9CisKKwkvLyBUb2tlbiBub2RlIHdhcyB0aGVyZSBzbyByZXR1cm4gdGhlIHR5cGUgb2YgaXQKKwkvLworCXJldHVybiAgdC0+Z2V0VHlwZSh0KTsKK30KKworLy8vIE1hcmsgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dCBzdHJlYW0gc28gdGhhdCB3ZSBjYW4gY29tZSBiYWNrIHRvIGl0CisvLy8gYWZ0ZXIgYSBzeW50YWN0aWMgcHJlZGljYXRlIGFuZCBzbyBvbi4KKy8vLworc3RhdGljCUFOVExSM19NQVJLRVIJICAgIAorbWFyawkocEFOVExSM19JTlRfU1RSRUFNIGlzKQoreworCXBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTQkJdG5zOworCXBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0JY3RuczsKKworCXRucwkgICAgPSAocEFOVExSM19UUkVFX05PREVfU1RSRUFNKShpcy0+c3VwZXIpOworCWN0bnMgICAgPSB0bnMtPmN0bnM7CisKKwlpZgkodG5zLT5jdG5zLT5wID09IC0xKQorCXsKKwkJZmlsbEJ1ZmZlclJvb3QodG5zLT5jdG5zKTsKKwl9CisKKwkvLyBSZXR1cm4gdGhlIGN1cnJlbnQgbWFyayBwb2ludAorCS8vCisJY3Rucy0+dG5zdHJlYW0tPmlzdHJlYW0tPmxhc3RNYXJrZXIgPSBjdG5zLT50bnN0cmVhbS0+aXN0cmVhbS0+aW5kZXgoY3Rucy0+dG5zdHJlYW0tPmlzdHJlYW0pOworCisJcmV0dXJuIGN0bnMtPnRuc3RyZWFtLT5pc3RyZWFtLT5sYXN0TWFya2VyOworfQorCitzdGF0aWMJdm9pZAkJICAgIAorcmVsZWFzZQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIG1hcmtlcikKK3sKK30KKworLy8vIFJld2luZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdHJlZSB3YWxrIHRvIHRoZSBzdGF0ZSBpdAorLy8vIHdhcyBpbiB3aGVuIG1hcmsoKSB3YXMgY2FsbGVkIGFuZCBpdCByZXR1cm5lZCBtYXJrZXIuICBBbHNvLAorLy8vIHdpcGUgb3V0IHRoZSBsb29rYWhlYWQgd2hpY2ggd2lsbCBmb3JjZSByZWxvYWRpbmcgYSBmZXcgbm9kZXMKKy8vLyBidXQgaXQgaXMgYmV0dGVyIHRoYW4gbWFraW5nIGEgY29weSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlcgorLy8vIHVwb24gbWFyaygpLgorLy8vCitzdGF0aWMJdm9pZAkJICAgIAorcmV3aW5kTWFyawkgICAgKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBtYXJrZXIpCit7CisJaXMtPnNlZWsoaXMsIG1hcmtlcik7Cit9CisKK3N0YXRpYwl2b2lkCQkgICAgCityZXdpbmRMYXN0CShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisgICBpcy0+c2VlayhpcywgaXMtPmxhc3RNYXJrZXIpOworfQorCisvLy8gY29uc3VtZSgpIGFoZWFkIHVudGlsIHdlIGhpdCBpbmRleC4gIENhbid0IGp1c3QganVtcCBhaGVhZC0tbXVzdAorLy8vIHNwaXQgb3V0IHRoZSBuYXZpZ2F0aW9uIG5vZGVzLgorLy8vCitzdGF0aWMJdm9pZAkJICAgIAorc2VlawkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIGluZGV4KQoreworICAgIHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTQkJdG5zOworICAgIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0JY3RuczsKKworICAgIHRucwkgICAgPSAocEFOVExSM19UUkVFX05PREVfU1RSRUFNKShpcy0+c3VwZXIpOworICAgIGN0bnMgICAgPSB0bnMtPmN0bnM7CisKKwljdG5zLT5wID0gQU5UTFIzX1VJTlQzMl9DQVNUKGluZGV4KTsKK30KKworc3RhdGljCUFOVExSM19NQVJLRVIJCSAgICAKK3RpbmRleAkocEFOVExSM19JTlRfU1RSRUFNIGlzKQoreworICAgIHBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTQkJdG5zOworICAgIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0JY3RuczsKKworICAgIHRucwkgICAgPSAocEFOVExSM19UUkVFX05PREVfU1RSRUFNKShpcy0+c3VwZXIpOworICAgIGN0bnMgICAgPSB0bnMtPmN0bnM7CisKKwlyZXR1cm4gKEFOVExSM19NQVJLRVIpKGN0bnMtPnApOworfQorCisvLy8gRXhwZW5zaXZlIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHdob2xlIHRyZWUgd2hpbGUgcGFyc2luZy4KKy8vLyBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMgaG93IG11Y2ggaW5wdXQgaGFzIGJlZW4gc2VlbiBzbyBmYXIuICBTbworLy8vIGFmdGVyIHBhcnNpbmcgaXQgcmV0dXJucyB0cnVlIHNpemUuCisvLy8KK3N0YXRpYwlBTlRMUjNfVUlOVDMyCQkgICAgCitzaXplCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisgICAgcEFOVExSM19UUkVFX05PREVfU1RSRUFNCQl0bnM7CisgICAgcEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTQljdG5zOworCisgICAgdG5zCSAgICA9IChwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0pKGlzLT5zdXBlcik7CisgICAgY3RucyAgICA9IHRucy0+Y3RuczsKKworCWlmCShjdG5zLT5wID09IC0xKQorCXsKKwkJZmlsbEJ1ZmZlclJvb3QoY3Rucyk7CisJfQorCisJcmV0dXJuIGN0bnMtPm5vZGVzLT5zaXplKGN0bnMtPm5vZGVzKTsKK30KKworLy8vIEFzIHdlIGZsYXR0ZW4gdGhlIHRyZWUsIHdlIHVzZSBVUCwgRE9XTiBub2RlcyB0byByZXByZXNlbnQKKy8vLyB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworLy8vIHNvIGluc3RhbnRpYXRlIG5ldyBvbmVzIHdoZW4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzIGlzIHRydWUuCisvLy8KK3N0YXRpYwl2b2lkCQkgICAgCithZGROYXZpZ2F0aW9uTm9kZQkgICAgKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3RucywgQU5UTFIzX1VJTlQzMiB0dHlwZSkKK3sKKwlwQU5UTFIzX0JBU0VfVFJFRQkgICAgbm9kZTsKKworCW5vZGUgPSBOVUxMOworCisJaWYJKHR0eXBlID09IEFOVExSM19UT0tFTl9ET1dOKQorCXsKKwkJaWYgIChjdG5zLT5oYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMoY3RucykgPT0gQU5UTFIzX1RSVUUpCisJCXsKKwkJCW5vZGUgICAgPSBjdG5zLT5uZXdEb3duTm9kZShjdG5zKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5vZGUgICAgPSAmKGN0bnMtPkRPV04uYmFzZVRyZWUpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmICAoY3Rucy0+aGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKGN0bnMpID09IEFOVExSM19UUlVFKQorCQl7CisJCQlub2RlICAgID0gY3Rucy0+bmV3VXBOb2RlKGN0bnMpOworCQl9CisJCWVsc2UKKwkJeworCQkJbm9kZSAgICA9ICYoY3Rucy0+VVAuYmFzZVRyZWUpOworCQl9CisJfQorCisJLy8gTm93IGFkZCB0aGUgbm9kZSB3ZSBkZWNpZGVkIHVwb24uCisJLy8KKwljdG5zLT5ub2Rlcy0+YWRkKGN0bnMtPm5vZGVzLCBub2RlLCBOVUxMKTsKK30KKworCitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUgkJCSAgICAKK2dldFRyZWVBZGFwdG9yCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zKQoreworICAgIHJldHVybiAgdG5zLT5jdG5zLT5hZGFwdG9yOworfQorCitzdGF0aWMJQU5UTFIzX0JPT0xFQU4JICAgIAoraGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzCSAgICAocEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSBjdG5zKQoreworICAgIHJldHVybiAgY3Rucy0+dW5pcXVlTmF2aWdhdGlvbk5vZGVzOworfQorCitzdGF0aWMJdm9pZAkJICAgIAorc2V0VW5pcXVlTmF2aWdhdGlvbk5vZGVzCSAgICAocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucywgQU5UTFIzX0JPT0xFQU4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzKQoreworICAgIHRucy0+Y3Rucy0+dW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gdW5pcXVlTmF2aWdhdGlvbk5vZGVzOworfQorCisKKy8vLyBQcmludCBvdXQgdGhlIGVudGlyZSB0cmVlIGluY2x1ZGluZyBET1dOL1VQIG5vZGVzLiAgVXNlcworLy8vIGEgcmVjdXJzaXZlIHdhbGsuICBNb3N0bHkgdXNlZnVsIGZvciB0ZXN0aW5nIGFzIGl0IHlpZWxkcworLy8vIHRoZSB0b2tlbiB0eXBlcyBub3QgdGV4dC4KKy8vLworc3RhdGljCXBBTlRMUjNfU1RSSU5HCSAgICAKK3RvU3RyaW5nCSAgICAocEFOVExSM19UUkVFX05PREVfU1RSRUFNIHRucykKK3sKKworICAgIHJldHVybiAgdG5zLT50b1N0cmluZ1NTKHRucywgdG5zLT5jdG5zLT5yb290LCBOVUxMKTsKK30KKworc3RhdGljCXBBTlRMUjNfU1RSSU5HCSAgICAKK3RvU3RyaW5nU1MJICAgIChwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBwQU5UTFIzX0JBU0VfVFJFRSBzdGFydCwgcEFOVExSM19CQVNFX1RSRUUgc3RvcCkKK3sKKyAgICBwQU5UTFIzX1NUUklORyAgYnVmOworCisgICAgYnVmID0gdG5zLT5jdG5zLT5zdHJpbmdGYWN0b3J5LT5uZXdSYXcodG5zLT5jdG5zLT5zdHJpbmdGYWN0b3J5KTsKKworICAgIHRucy0+dG9TdHJpbmdXb3JrKHRucywgc3RhcnQsIHN0b3AsIGJ1Zik7CisKKyAgICByZXR1cm4gIGJ1ZjsKK30KKworc3RhdGljCXZvaWQJICAgIAordG9TdHJpbmdXb3JrCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBwQU5UTFIzX0JBU0VfVFJFRSBwLCBwQU5UTFIzX0JBU0VfVFJFRSBzdG9wLCBwQU5UTFIzX1NUUklORyBidWYpCit7CisKKwlBTlRMUjNfVUlOVDMyICAgbjsKKwlBTlRMUjNfVUlOVDMyICAgYzsKKworCWlmCSghcC0+aXNOaWxOb2RlKHApICkKKwl7CisJCXBBTlRMUjNfU1RSSU5HCXRleHQ7CisKKwkJdGV4dAk9IHAtPnRvU3RyaW5nKHApOworCisJCWlmICAodGV4dCA9PSBOVUxMKQorCQl7CisJCQl0ZXh0ID0gdG5zLT5jdG5zLT5zdHJpbmdGYWN0b3J5LT5uZXdSYXcodG5zLT5jdG5zLT5zdHJpbmdGYWN0b3J5KTsKKworCQkJdGV4dC0+YWRkYwkodGV4dCwgJyAnKTsKKwkJCXRleHQtPmFkZGkJKHRleHQsIHAtPmdldFR5cGUocCkpOworCQl9CisKKwkJYnVmLT5hcHBlbmRTKGJ1ZiwgdGV4dCk7CisJfQorCisJaWYJKHAgPT0gc3RvcCkKKwl7CisJCXJldHVybjsJCS8qIEZpbmlzaGVkICovCisJfQorCisJbiA9IHAtPmdldENoaWxkQ291bnQocCk7CisKKwlpZgkobiA+IDAgJiYgISBwLT5pc05pbE5vZGUocCkgKQorCXsKKwkJYnVmLT5hZGRjICAgKGJ1ZiwgJyAnKTsKKwkJYnVmLT5hZGRpICAgKGJ1ZiwgQU5UTFIzX1RPS0VOX0RPV04pOworCX0KKworCWZvcgkoYyA9IDA7IGM8biA7IGMrKykKKwl7CisJCXBBTlRMUjNfQkFTRV9UUkVFICAgY2hpbGQ7CisKKwkJY2hpbGQgPSBwLT5nZXRDaGlsZChwLCBjKTsKKwkJdG5zLT50b1N0cmluZ1dvcmsodG5zLCBjaGlsZCwgc3RvcCwgYnVmKTsKKwl9CisKKwlpZgkobiA+IDAgJiYgISBwLT5pc05pbE5vZGUocCkgKQorCXsKKwkJYnVmLT5hZGRjICAgKGJ1ZiwgJyAnKTsKKwkJYnVmLT5hZGRpICAgKGJ1ZiwgQU5UTFIzX1RPS0VOX1VQKTsKKwl9Cit9CisKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCSAgICAKK2dldExvb2thaGVhZFNpemUJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3RucykKK3sKKyAgICByZXR1cm4JY3Rucy0+dGFpbCA8IGN0bnMtPmhlYWQgCisJICAgID8JKGN0bnMtPmxvb2tBaGVhZExlbmd0aCAtIGN0bnMtPmhlYWQgKyBjdG5zLT50YWlsKQorCSAgICA6CShjdG5zLT50YWlsIC0gY3Rucy0+aGVhZCk7Cit9CisKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkgICAgCituZXdEb3duTm9kZQkJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3RucykKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UUkVFCSAgICBkTm9kZTsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0b2tlbjsKKworICAgIHRva2VuCQkJCQk9IGFudGxyM0NvbW1vblRva2VuTmV3KEFOVExSM19UT0tFTl9ET1dOKTsKKwl0b2tlbi0+dGV4dFN0YXRlCQk9IEFOVExSM19URVhUX0NIQVJQOworCXRva2VuLT50b2tUZXh0LmNoYXJzCT0gKHBBTlRMUjNfVUNIQVIpIkRPV04iOworICAgIGROb2RlCQkJCQk9IGFudGxyM0NvbW1vblRyZWVOZXdGcm9tVG9rZW4odG9rZW4pOworCisgICAgcmV0dXJuICAmKGROb2RlLT5iYXNlVHJlZSk7Cit9CisKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQkgICAgCituZXdVcE5vZGUJCShwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnMpCit7CisgICAgcEFOVExSM19DT01NT05fVFJFRQkgICAgdU5vZGU7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgdG9rZW47CisKKyAgICB0b2tlbgkJCQkJPSBhbnRscjNDb21tb25Ub2tlbk5ldyhBTlRMUjNfVE9LRU5fVVApOworCXRva2VuLT50ZXh0U3RhdGUJCT0gQU5UTFIzX1RFWFRfQ0hBUlA7CisJdG9rZW4tPnRva1RleHQuY2hhcnMJPSAocEFOVExSM19VQ0hBUikiVVAiOworICAgIHVOb2RlCQkJCQk9IGFudGxyM0NvbW1vblRyZWVOZXdGcm9tVG9rZW4odG9rZW4pOworCisgICAgcmV0dXJuICAmKHVOb2RlLT5iYXNlVHJlZSk7Cit9CisKKy8vLyBSZXBsYWNlIGZyb20gc3RhcnQgdG8gc3RvcCBjaGlsZCBpbmRleCBvZiBwYXJlbnQgd2l0aCB0LCB3aGljaCBtaWdodAorLy8vIGJlIGEgbGlzdC4gIE51bWJlciBvZiBjaGlsZHJlbiBtYXkgYmUgZGlmZmVyZW50CisvLy8gYWZ0ZXIgdGhpcyBjYWxsLiAgVGhlIHN0cmVhbSBpcyBub3RpZmllZCBiZWNhdXNlIGl0IGlzIHdhbGtpbmcgdGhlCisvLy8gdHJlZSBhbmQgbWlnaHQgbmVlZCB0byBrbm93IHlvdSBhcmUgbW9ua2V5LWluZyB3aXRoIHRoZSB1bmRlcmx5aW5nCisvLy8gdHJlZS4gIEFsc28sIGl0IG1pZ2h0IGJlIGFibGUgdG8gbW9kaWZ5IHRoZSBub2RlIHN0cmVhbSB0byBhdm9pZAorLy8vIHJlLXN0cmVhbWluZyBmb3IgZnV0dXJlIHBoYXNlcy4KKy8vLworLy8vIElmIHBhcmVudCBpcyBudWxsLCBkb24ndCBkbyBhbnl0aGluZzsgbXVzdCBiZSBhdCByb290IG9mIG92ZXJhbGwgdHJlZS4KKy8vLyBDYW4ndCByZXBsYWNlIHdoYXRldmVyIHBvaW50cyB0byB0aGUgcGFyZW50IGV4dGVybmFsbHkuICBEbyBub3RoaW5nLgorLy8vCitzdGF0aWMJdm9pZAkJCQkJCQorcmVwbGFjZUNoaWxkcmVuCQkJCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBwQU5UTFIzX0JBU0VfVFJFRSBwYXJlbnQsIEFOVExSM19JTlQzMiBzdGFydENoaWxkSW5kZXgsIEFOVExSM19JTlQzMiBzdG9wQ2hpbGRJbmRleCwgcEFOVExSM19CQVNFX1RSRUUgdCkKK3sKKwlpZgkocGFyZW50ICE9IE5VTEwpCisJeworCQlwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SCWFkYXB0b3I7CisJCXBBTlRMUjNfQ09NTU9OX1RSRUVfQURBUFRPUgljdGE7CisKKwkJYWRhcHRvcgk9IHRucy0+Z2V0VHJlZUFkYXB0b3IodG5zKTsKKwkJY3RhCQk9IChwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1IpKGFkYXB0b3ItPnN1cGVyKTsKKworCQlhZGFwdG9yLT5yZXBsYWNlQ2hpbGRyZW4oYWRhcHRvciwgcGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0KTsKKwl9Cit9CisKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQorZ2V0CQkJCQkJCShwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0gdG5zLCBBTlRMUjNfSU5UMzIgaykKK3sKKwlpZgkodG5zLT5jdG5zLT5wID09IC0xKQorCXsKKwkJZmlsbEJ1ZmZlclJvb3QodG5zLT5jdG5zKTsKKwl9CisKKwlyZXR1cm4gdG5zLT5jdG5zLT5ub2Rlcy0+Z2V0KHRucy0+Y3Rucy0+bm9kZXMsIGspOworfQorCitzdGF0aWMJdm9pZAorcHVzaAkJCQkJCShwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnMsIEFOVExSM19JTlQzMiBpbmRleCkKK3sKKwljdG5zLT5ub2RlU3RhY2stPnB1c2goY3Rucy0+bm9kZVN0YWNrLCBBTlRMUjNfRlVOQ19QVFIoY3Rucy0+cCksIE5VTEwpOwkvLyBTYXZlIGN1cnJlbnQgaW5kZXgKKwljdG5zLT50bnN0cmVhbS0+aXN0cmVhbS0+c2VlayhjdG5zLT50bnN0cmVhbS0+aXN0cmVhbSwgaW5kZXgpOworfQorCitzdGF0aWMJQU5UTFIzX0lOVDMyCitwb3AJCQkJCQkJKHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0gY3RucykKK3sKKwlBTlRMUjNfSU5UMzIJcmV0VmFsOworCisJcmV0VmFsID0gQU5UTFIzX1VJTlQzMl9DQVNUKGN0bnMtPm5vZGVTdGFjay0+cG9wKGN0bnMtPm5vZGVTdGFjaykpOworCWN0bnMtPnRuc3RyZWFtLT5pc3RyZWFtLT5zZWVrKGN0bnMtPnRuc3RyZWFtLT5pc3RyZWFtLCByZXRWYWwpOworCXJldHVybiByZXRWYWw7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb252ZXJ0dXRmLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNjb252ZXJ0dXRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2NvbnZlcnR1dGYuYwpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgVW5pY29kZSwgSW5jLgorICogCisgKiBEaXNjbGFpbWVyCisgKiAKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgcHJvdmlkZWQgYXMgaXMgYnkgVW5pY29kZSwgSW5jLiBObyBjbGFpbXMgYXJlCisgKiBtYWRlIGFzIHRvIGZpdG5lc3MgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIE5vIHdhcnJhbnRpZXMgb2YgYW55CisgKiBraW5kIGFyZSBleHByZXNzZWQgb3IgaW1wbGllZC4gVGhlIHJlY2lwaWVudCBhZ3JlZXMgdG8gZGV0ZXJtaW5lCisgKiBhcHBsaWNhYmlsaXR5IG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkLiBJZiB0aGlzIGZpbGUgaGFzIGJlZW4KKyAqIHB1cmNoYXNlZCBvbiBtYWduZXRpYyBvciBvcHRpY2FsIG1lZGlhIGZyb20gVW5pY29kZSwgSW5jLiwgdGhlCisgKiBzb2xlIHJlbWVkeSBmb3IgYW55IGNsYWltIHdpbGwgYmUgZXhjaGFuZ2Ugb2YgZGVmZWN0aXZlIG1lZGlhCisgKiB3aXRoaW4gOTAgZGF5cyBvZiByZWNlaXB0LgorICogCisgKiBMaW1pdGF0aW9ucyBvbiBSaWdodHMgdG8gUmVkaXN0cmlidXRlIFRoaXMgQ29kZQorICogCisgKiBVbmljb2RlLCBJbmMuIGhlcmVieSBncmFudHMgdGhlIHJpZ2h0IHRvIGZyZWVseSB1c2UgdGhlIGluZm9ybWF0aW9uCisgKiBzdXBwbGllZCBpbiB0aGlzIGZpbGUgaW4gdGhlIGNyZWF0aW9uIG9mIHByb2R1Y3RzIHN1cHBvcnRpbmcgdGhlCisgKiBVbmljb2RlIFN0YW5kYXJkLCBhbmQgdG8gbWFrZSBjb3BpZXMgb2YgdGhpcyBmaWxlIGluIGFueSBmb3JtCisgKiBmb3IgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZGlzdHJpYnV0aW9uIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UKKyAqIHJlbWFpbnMgYXR0YWNoZWQuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBDb252ZXJzaW9ucyBiZXR3ZWVuIFVURjMyLCBVVEYtMTYsIGFuZCBVVEYtOC4gU291cmNlIGNvZGUgZmlsZS4KKyAgICBBdXRob3I6IE1hcmsgRS4gRGF2aXMsIDE5OTQuCisgICAgUmV2IEhpc3Rvcnk6IFJpY2sgTWNHb3dhbiwgZml4ZXMgJiB1cGRhdGVzIE1heSAyMDAxLgorICAgIFNlcHQgMjAwMTogZml4ZWQgY29uc3QgJiBlcnJvciBjb25kaXRpb25zIHBlcgorCW1vZHMgc3VnZ2VzdGVkIGJ5IFMuIFBhcmVudCAmIEEuIExpbGxpY2guCisgICAgSnVuZSAyMDAyOiBUaW0gRG9kZCBhZGRlZCBkZXRlY3Rpb24gYW5kIGhhbmRsaW5nIG9mIGluY29tcGxldGUKKwlzb3VyY2Ugc2VxdWVuY2VzLCBlbmhhbmNlZCBlcnJvciBkZXRlY3Rpb24sIGFkZGVkIGNhc3RzCisJdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgorICAgIEp1bHkgMjAwMzogc2xpZ2h0IG1vZHMgdG8gYmFjayBvdXQgYWdncmVzc2l2ZSBGRkZFIGRldGVjdGlvbi4KKyAgICBKYW4gMjAwNDogdXBkYXRlZCBzd2l0Y2hlcyBpbiBmcm9tLVVURjggY29udmVyc2lvbnMuCisgICAgT2N0IDIwMDQ6IHVwZGF0ZWQgdG8gdXNlIFVOSV9NQVhfTEVHQUxfVVRGMzIgaW4gVVRGLTMyIGNvbnZlcnNpb25zLgorCisgICAgU2VlIHRoZSBoZWFkZXIgZmlsZSAiQ29udmVydFVURi5oIiBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2luY2x1ZGUgImFudGxyM2NvbnZlcnR1dGYuaCIKKworI2lmZGVmIENWVFVURl9ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEYzMnRvVVRGMTYgKAorCWNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsIAorCVVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncykgeworICAgIENvbnZlcnNpb25SZXN1bHQgcmVzdWx0ID0gY29udmVyc2lvbk9LOworICAgIGNvbnN0IFVURjMyKiBzb3VyY2UgPSAqc291cmNlU3RhcnQ7CisgICAgVVRGMTYqIHRhcmdldCA9ICp0YXJnZXRTdGFydDsKKyAgICB3aGlsZSAoc291cmNlIDwgc291cmNlRW5kKSB7CisJVVRGMzIgY2g7CisJaWYgKHRhcmdldCA+PSB0YXJnZXRFbmQpIHsKKwkgICAgcmVzdWx0ID0gdGFyZ2V0RXhoYXVzdGVkOyBicmVhazsKKwl9CisJY2ggPSAqc291cmNlKys7CisJaWYgKGNoIDw9IFVOSV9NQVhfQk1QKSB7IC8qIFRhcmdldCBpcyBhIGNoYXJhY3RlciA8PSAweEZGRkYgKi8KKwkgICAgLyogVVRGLTE2IHN1cnJvZ2F0ZSB2YWx1ZXMgYXJlIGlsbGVnYWwgaW4gVVRGLTMyOyAweGZmZmYgb3IgMHhmZmZlIGFyZSBib3RoIHJlc2VydmVkIHZhbHVlcyAqLworCSAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgeworCQlpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbikgeworCQkgICAgLS1zb3VyY2U7IC8qIHJldHVybiB0byB0aGUgaWxsZWdhbCB2YWx1ZSBpdHNlbGYgKi8KKwkJICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisJCSAgICBicmVhazsKKwkJfSBlbHNlIHsKKwkJICAgICp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOworCQl9CisJICAgIH0gZWxzZSB7CisJCSp0YXJnZXQrKyA9IChVVEYxNiljaDsgLyogbm9ybWFsIGNhc2UgKi8KKwkgICAgfQorCX0gZWxzZSBpZiAoY2ggPiBVTklfTUFYX0xFR0FMX1VURjMyKSB7CisJICAgIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7CisJCXJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisJICAgIH0gZWxzZSB7CisJCSp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgLyogdGFyZ2V0IGlzIGEgY2hhcmFjdGVyIGluIHJhbmdlIDB4RkZGRiAtIDB4MTBGRkZGLiAqLworCSAgICBpZiAodGFyZ2V0ICsgMSA+PSB0YXJnZXRFbmQpIHsKKwkJLS1zb3VyY2U7IC8qIEJhY2sgdXAgc291cmNlIHBvaW50ZXIhICovCisJCXJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7CisJICAgIH0KKwkgICAgY2ggLT0gaGFsZkJhc2U7CisJICAgICp0YXJnZXQrKyA9IChVVEYxNikoKGNoID4+IGhhbGZTaGlmdCkgKyBVTklfU1VSX0hJR0hfU1RBUlQpOworCSAgICAqdGFyZ2V0KysgPSAoVVRGMTYpKChjaCAmIGhhbGZNYXNrKSArIFVOSV9TVVJfTE9XX1NUQVJUKTsKKwl9CisgICAgfQorICAgICpzb3VyY2VTdGFydCA9IHNvdXJjZTsKKyAgICAqdGFyZ2V0U3RhcnQgPSB0YXJnZXQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEYzMiAoCisJY29uc3QgVVRGMTYqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMTYqIHNvdXJjZUVuZCwgCisJVVRGMzIqKiB0YXJnZXRTdGFydCwgVVRGMzIqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKSB7CisgICAgQ29udmVyc2lvblJlc3VsdCByZXN1bHQgPSBjb252ZXJzaW9uT0s7CisgICAgY29uc3QgVVRGMTYqIHNvdXJjZSA9ICpzb3VyY2VTdGFydDsKKyAgICBVVEYzMiogdGFyZ2V0ID0gKnRhcmdldFN0YXJ0OworICAgIFVURjMyIGNoLCBjaDI7CisgICAgd2hpbGUgKHNvdXJjZSA8IHNvdXJjZUVuZCkgeworCWNvbnN0IFVURjE2KiBvbGRTb3VyY2UgPSBzb3VyY2U7IC8qICBJbiBjYXNlIHdlIGhhdmUgdG8gYmFjayB1cCBiZWNhdXNlIG9mIHRhcmdldCBvdmVyZmxvdy4gKi8KKwljaCA9ICpzb3VyY2UrKzsKKwkvKiBJZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIsIGNvbnZlcnQgdG8gVVRGMzIgZmlyc3QuICovCisJaWYgKGNoID49IFVOSV9TVVJfSElHSF9TVEFSVCAmJiBjaCA8PSBVTklfU1VSX0hJR0hfRU5EKSB7CisJICAgIC8qIElmIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUgYXJlIGluIHRoZSBzb3VyY2UgYnVmZmVyLi4uICovCisJICAgIGlmIChzb3VyY2UgPCBzb3VyY2VFbmQpIHsKKwkJY2gyID0gKnNvdXJjZTsKKwkJLyogSWYgaXQncyBhIGxvdyBzdXJyb2dhdGUsIGNvbnZlcnQgdG8gVVRGMzIuICovCisJCWlmIChjaDIgPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2gyIDw9IFVOSV9TVVJfTE9XX0VORCkgeworCQkgICAgY2ggPSAoKGNoIC0gVU5JX1NVUl9ISUdIX1NUQVJUKSA8PCBoYWxmU2hpZnQpCisJCQkrIChjaDIgLSBVTklfU1VSX0xPV19TVEFSVCkgKyBoYWxmQmFzZTsKKwkJICAgICsrc291cmNlOworCQl9IGVsc2UgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsgLyogaXQncyBhbiB1bnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZSAqLworCQkgICAgLS1zb3VyY2U7IC8qIHJldHVybiB0byB0aGUgaWxsZWdhbCB2YWx1ZSBpdHNlbGYgKi8KKwkJICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9IGVsc2UgeyAvKiBXZSBkb24ndCBoYXZlIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUuICovCisJCS0tc291cmNlOyAvKiByZXR1cm4gdG8gdGhlIGhpZ2ggc3Vycm9nYXRlICovCisJCXJlc3VsdCA9IHNvdXJjZUV4aGF1c3RlZDsKKwkJYnJlYWs7CisJICAgIH0KKwl9IGVsc2UgaWYgKGZsYWdzID09IHN0cmljdENvbnZlcnNpb24pIHsKKwkgICAgLyogVVRGLTE2IHN1cnJvZ2F0ZSB2YWx1ZXMgYXJlIGlsbGVnYWwgaW4gVVRGLTMyICovCisJICAgIGlmIChjaCA+PSBVTklfU1VSX0xPV19TVEFSVCAmJiBjaCA8PSBVTklfU1VSX0xPV19FTkQpIHsKKwkJLS1zb3VyY2U7IC8qIHJldHVybiB0byB0aGUgaWxsZWdhbCB2YWx1ZSBpdHNlbGYgKi8KKwkJcmVzdWx0ID0gc291cmNlSWxsZWdhbDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaWYgKHRhcmdldCA+PSB0YXJnZXRFbmQpIHsKKwkgICAgc291cmNlID0gb2xkU291cmNlOyAvKiBCYWNrIHVwIHNvdXJjZSBwb2ludGVyISAqLworCSAgICByZXN1bHQgPSB0YXJnZXRFeGhhdXN0ZWQ7IGJyZWFrOworCX0KKwkqdGFyZ2V0KysgPSBjaDsKKyAgICB9CisgICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOworICAgICp0YXJnZXRTdGFydCA9IHRhcmdldDsKKyNpZmRlZiBDVlRVVEZfREVCVUcKK2lmIChyZXN1bHQgPT0gc291cmNlSWxsZWdhbCkgeworICAgIEFOVExSM19GUFJJTlRGKHN0ZGVyciwgIkNvbnZlcnRVVEYxNnRvVVRGMzIgaWxsZWdhbCBzZXEgMHglMDR4LCUwNHhcbiIsIGNoLCBjaDIpOworICAgIGZmbHVzaChzdGRlcnIpOworfQorI2VuZGlmCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbmRleCBpbnRvIHRoZSB0YWJsZSBiZWxvdyB3aXRoIHRoZSBmaXJzdCBieXRlIG9mIGEgVVRGLTggc2VxdWVuY2UgdG8KKyAqIGdldCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIGJ5dGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGZvbGxvdyBpdC4KKyAqIE5vdGUgdGhhdCAqbGVnYWwqIFVURi04IHZhbHVlcyBjYW4ndCBoYXZlIDQgb3IgNS1ieXRlcy4gVGhlIHRhYmxlIGlzCisgKiBsZWZ0IGFzLWlzIGZvciBhbnlvbmUgd2hvIG1heSB3YW50IHRvIGRvIHN1Y2ggY29udmVyc2lvbiwgd2hpY2ggd2FzCisgKiBhbGxvd2VkIGluIGVhcmxpZXIgYWxnb3JpdGhtcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdHJhaWxpbmdCeXRlc0ZvclVURjhbMjU2XSA9IHsKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsIDMsMywzLDMsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUKK307CisKKy8qCisgKiBNYWdpYyB2YWx1ZXMgc3VidHJhY3RlZCBmcm9tIGEgYnVmZmVyIHZhbHVlIGR1cmluZyBVVEY4IGNvbnZlcnNpb24uCisgKiBUaGlzIHRhYmxlIGNvbnRhaW5zIGFzIG1hbnkgdmFsdWVzIGFzIHRoZXJlIG1pZ2h0IGJlIHRyYWlsaW5nIGJ5dGVzCisgKiBpbiBhIFVURi04IHNlcXVlbmNlLgorICovCitzdGF0aWMgY29uc3QgVVRGMzIgb2Zmc2V0c0Zyb21VVEY4WzZdID0geyAweDAwMDAwMDAwVUwsIDB4MDAwMDMwODBVTCwgMHgwMDBFMjA4MFVMLCAKKwkJICAgICAweDAzQzgyMDgwVUwsIDB4RkEwODIwODBVTCwgMHg4MjA4MjA4MFVMIH07CisKKy8qCisgKiBPbmNlIHRoZSBiaXRzIGFyZSBzcGxpdCBvdXQgaW50byBieXRlcyBvZiBVVEYtOCwgdGhpcyBpcyBhIG1hc2sgT1ItZWQKKyAqIGludG8gdGhlIGZpcnN0IGJ5dGUsIGRlcGVuZGluZyBvbiBob3cgbWFueSBieXRlcyBmb2xsb3cuICBUaGVyZSBhcmUKKyAqIGFzIG1hbnkgZW50cmllcyBpbiB0aGlzIHRhYmxlIGFzIHRoZXJlIGFyZSBVVEYtOCBzZXF1ZW5jZSB0eXBlcy4KKyAqIChJLmUuLCBvbmUgYnl0ZSBzZXF1ZW5jZSwgdHdvIGJ5dGUuLi4gZXRjLikuIFJlbWVtYmVyIHRoYXQgc2VxdWVuY3MKKyAqIGZvciAqbGVnYWwqIFVURi04IHdpbGwgYmUgNCBvciBmZXdlciBieXRlcyB0b3RhbC4KKyAqLworc3RhdGljIGNvbnN0IFVURjggZmlyc3RCeXRlTWFya1s3XSA9IHsgMHgwMCwgMHgwMCwgMHhDMCwgMHhFMCwgMHhGMCwgMHhGOCwgMHhGQyB9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIGludGVyZmFjZSBjb252ZXJ0cyBhIHdob2xlIGJ1ZmZlciB0byBhdm9pZCBmdW5jdGlvbi1jYWxsIG92ZXJoZWFkLgorICogQ29uc3RhbnRzIGhhdmUgYmVlbiBnYXRoZXJlZC4gTG9vcHMgJiBjb25kaXRpb25hbHMgaGF2ZSBiZWVuIHJlbW92ZWQgYXMKKyAqIG11Y2ggYXMgcG9zc2libGUgZm9yIGVmZmljaWVuY3ksIGluIGZhdm9yIG9mIGRyb3AtdGhyb3VnaCBzd2l0Y2hlcy4KKyAqIChTZWUgIk5vdGUgQSIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZmlsZSBmb3IgZXF1aXZhbGVudCBjb2RlLikKKyAqIElmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaXQsIHRoZSAiaXNMZWdhbFVURjgiIGNhbGwgY2FuIGJlIHR1cm5lZAorICogaW50byBhbiBpbmxpbmUgZnVuY3Rpb24uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEY4ICgKKwljb25zdCBVVEYxNioqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEYxNiogc291cmNlRW5kLCAKKwlVVEY4KiogdGFyZ2V0U3RhcnQsIFVURjgqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKSB7CisgICAgQ29udmVyc2lvblJlc3VsdCByZXN1bHQgPSBjb252ZXJzaW9uT0s7CisgICAgY29uc3QgVVRGMTYqIHNvdXJjZSA9ICpzb3VyY2VTdGFydDsKKyAgICBVVEY4KiB0YXJnZXQgPSAqdGFyZ2V0U3RhcnQ7CisgICAgd2hpbGUgKHNvdXJjZSA8IHNvdXJjZUVuZCkgeworCVVURjMyIGNoOworCXVuc2lnbmVkIHNob3J0IGJ5dGVzVG9Xcml0ZSA9IDA7CisJY29uc3QgVVRGMzIgYnl0ZU1hc2sgPSAweEJGOworCWNvbnN0IFVURjMyIGJ5dGVNYXJrID0gMHg4MDsgCisJY29uc3QgVVRGMTYqIG9sZFNvdXJjZSA9IHNvdXJjZTsgLyogSW4gY2FzZSB3ZSBoYXZlIHRvIGJhY2sgdXAgYmVjYXVzZSBvZiB0YXJnZXQgb3ZlcmZsb3cuICovCisJY2ggPSAqc291cmNlKys7CisJLyogSWYgd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyLCBjb252ZXJ0IHRvIFVURjMyIGZpcnN0LiAqLworCWlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9ISUdIX0VORCkgeworCSAgICAvKiBJZiB0aGUgMTYgYml0cyBmb2xsb3dpbmcgdGhlIGhpZ2ggc3Vycm9nYXRlIGFyZSBpbiB0aGUgc291cmNlIGJ1ZmZlci4uLiAqLworCSAgICBpZiAoc291cmNlIDwgc291cmNlRW5kKSB7CisJCVVURjMyIGNoMiA9ICpzb3VyY2U7CisJCS8qIElmIGl0J3MgYSBsb3cgc3Vycm9nYXRlLCBjb252ZXJ0IHRvIFVURjMyLiAqLworCQlpZiAoY2gyID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0xPV19FTkQpIHsKKwkJICAgIGNoID0gKChjaCAtIFVOSV9TVVJfSElHSF9TVEFSVCkgPDwgaGFsZlNoaWZ0KQorCQkJKyAoY2gyIC0gVU5JX1NVUl9MT1dfU1RBUlQpICsgaGFsZkJhc2U7CisJCSAgICArK3NvdXJjZTsKKwkJfSBlbHNlIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7IC8qIGl0J3MgYW4gdW5wYWlyZWQgaGlnaCBzdXJyb2dhdGUgKi8KKwkJICAgIC0tc291cmNlOyAvKiByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRzZWxmICovCisJCSAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfSBlbHNlIHsgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgMTYgYml0cyBmb2xsb3dpbmcgdGhlIGhpZ2ggc3Vycm9nYXRlLiAqLworCQktLXNvdXJjZTsgLyogcmV0dXJuIHRvIHRoZSBoaWdoIHN1cnJvZ2F0ZSAqLworCQlyZXN1bHQgPSBzb3VyY2VFeGhhdXN0ZWQ7CisJCWJyZWFrOworCSAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbikgeworCSAgICAvKiBVVEYtMTYgc3Vycm9nYXRlIHZhbHVlcyBhcmUgaWxsZWdhbCBpbiBVVEYtMzIgKi8KKwkgICAgaWYgKGNoID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgeworCQktLXNvdXJjZTsgLyogcmV0dXJuIHRvIHRoZSBpbGxlZ2FsIHZhbHVlIGl0c2VsZiAqLworCQlyZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworCQlicmVhazsKKwkgICAgfQorCX0KKwkvKiBGaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHRoZSByZXN1bHQgd2lsbCByZXF1aXJlICovCisJaWYgKGNoIDwgKFVURjMyKTB4ODApIHsJICAgICBieXRlc1RvV3JpdGUgPSAxOworCX0gZWxzZSBpZiAoY2ggPCAoVVRGMzIpMHg4MDApIHsgICAgIGJ5dGVzVG9Xcml0ZSA9IDI7CisJfSBlbHNlIGlmIChjaCA8IChVVEYzMikweDEwMDAwKSB7ICAgYnl0ZXNUb1dyaXRlID0gMzsKKwl9IGVsc2UgaWYgKGNoIDwgKFVURjMyKTB4MTEwMDAwKSB7ICBieXRlc1RvV3JpdGUgPSA0OworCX0gZWxzZSB7CQkJICAgIGJ5dGVzVG9Xcml0ZSA9IDM7CisJCQkJCSAgICBjaCA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOworCX0KKworCXRhcmdldCArPSBieXRlc1RvV3JpdGU7CisJaWYgKHRhcmdldCA+IHRhcmdldEVuZCkgeworCSAgICBzb3VyY2UgPSBvbGRTb3VyY2U7IC8qIEJhY2sgdXAgc291cmNlIHBvaW50ZXIhICovCisJICAgIHRhcmdldCAtPSBieXRlc1RvV3JpdGU7IHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7CisJfQorCXN3aXRjaCAoYnl0ZXNUb1dyaXRlKSB7IC8qIG5vdGU6IGV2ZXJ5dGhpbmcgZmFsbHMgdGhyb3VnaC4gKi8KKwkgICAgY2FzZSA0OiAqLS10YXJnZXQgPSAoVVRGOCkoKGNoIHwgYnl0ZU1hcmspICYgYnl0ZU1hc2spOyBjaCA+Pj0gNjsKKwkgICAgY2FzZSAzOiAqLS10YXJnZXQgPSAoVVRGOCkoKGNoIHwgYnl0ZU1hcmspICYgYnl0ZU1hc2spOyBjaCA+Pj0gNjsKKwkgICAgY2FzZSAyOiAqLS10YXJnZXQgPSAoVVRGOCkoKGNoIHwgYnl0ZU1hcmspICYgYnl0ZU1hc2spOyBjaCA+Pj0gNjsKKwkgICAgY2FzZSAxOiAqLS10YXJnZXQgPSAgKFVURjgpKGNoIHwgZmlyc3RCeXRlTWFya1tieXRlc1RvV3JpdGVdKTsKKwl9CisJdGFyZ2V0ICs9IGJ5dGVzVG9Xcml0ZTsKKyAgICB9CisgICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOworICAgICp0YXJnZXRTdGFydCA9IHRhcmdldDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFV0aWxpdHkgcm91dGluZSB0byB0ZWxsIHdoZXRoZXIgYSBzZXF1ZW5jZSBvZiBieXRlcyBpcyBsZWdhbCBVVEYtOC4KKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbGVuZ3RoIHByZS1kZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBieXRlLgorICogSWYgbm90IGNhbGxpbmcgdGhpcyBmcm9tIENvbnZlcnRVVEY4dG8qLCB0aGVuIHRoZSBsZW5ndGggY2FuIGJlIHNldCBieToKKyAqICBsZW5ndGggPSB0cmFpbGluZ0J5dGVzRm9yVVRGOFsqc291cmNlXSsxOworICogYW5kIHRoZSBzZXF1ZW5jZSBpcyBpbGxlZ2FsIHJpZ2h0IGF3YXkgaWYgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBieXRlcworICogYXZhaWxhYmxlLgorICogSWYgcHJlc2VudGVkIHdpdGggYSBsZW5ndGggPiA0LCB0aGlzIHJldHVybnMgZmFsc2UuICBUaGUgVW5pY29kZQorICogZGVmaW5pdGlvbiBvZiBVVEYtOCBnb2VzIHVwIHRvIDQtYnl0ZSBzZXF1ZW5jZXMuCisgKi8KKworc3RhdGljIEFOVExSM19CT09MRUFOCitpc0xlZ2FsVVRGOChjb25zdCBVVEY4ICpzb3VyY2UsIGludCBsZW5ndGgpIHsKKyAgICBVVEY4IGE7CisgICAgY29uc3QgVVRGOCAqc3JjcHRyID0gc291cmNlK2xlbmd0aDsKKyAgICBzd2l0Y2ggKGxlbmd0aCkgeworICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKwkvKiBFdmVyeXRoaW5nIGVsc2UgZmFsbHMgdGhyb3VnaCB3aGVuICJ0cnVlIi4uLiAqLworICAgIGNhc2UgNDogaWYgKChhID0gKCotLXNyY3B0cikpIDwgMHg4MCB8fCBhID4gMHhCRikgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgMzogaWYgKChhID0gKCotLXNyY3B0cikpIDwgMHg4MCB8fCBhID4gMHhCRikgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgMjogaWYgKChhID0gKCotLXNyY3B0cikpID4gMHhCRikgcmV0dXJuIGZhbHNlOworCisJc3dpdGNoICgqc291cmNlKSB7CisJICAgIC8qIG5vIGZhbGwtdGhyb3VnaCBpbiB0aGlzIGlubmVyIHN3aXRjaCAqLworCSAgICBjYXNlIDB4RTA6IGlmIChhIDwgMHhBMCkgcmV0dXJuIGZhbHNlOyBicmVhazsKKwkgICAgY2FzZSAweEVEOiBpZiAoYSA+IDB4OUYpIHJldHVybiBmYWxzZTsgYnJlYWs7CisJICAgIGNhc2UgMHhGMDogaWYgKGEgPCAweDkwKSByZXR1cm4gZmFsc2U7IGJyZWFrOworCSAgICBjYXNlIDB4RjQ6IGlmIChhID4gMHg4RikgcmV0dXJuIGZhbHNlOyBicmVhazsKKwkgICAgZGVmYXVsdDogICBpZiAoYSA8IDB4ODApIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICBjYXNlIDE6IGlmICgqc291cmNlID49IDB4ODAgJiYgKnNvdXJjZSA8IDB4QzIpIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCpzb3VyY2UgPiAweEY0KSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogRXhwb3J0ZWQgZnVuY3Rpb24gdG8gcmV0dXJuIHdoZXRoZXIgYSBVVEYtOCBzZXF1ZW5jZSBpcyBsZWdhbCBvciBub3QuCisgKiBUaGlzIGlzIG5vdCB1c2VkIGhlcmU7IGl0J3MganVzdCBleHBvcnRlZC4KKyAqLworQU5UTFIzX0JPT0xFQU4KK2lzTGVnYWxVVEY4U2VxdWVuY2UoY29uc3QgVVRGOCAqc291cmNlLCBjb25zdCBVVEY4ICpzb3VyY2VFbmQpIHsKKyAgICBpbnQgbGVuZ3RoID0gdHJhaWxpbmdCeXRlc0ZvclVURjhbKnNvdXJjZV0rMTsKKyAgICBpZiAoc291cmNlK2xlbmd0aCA+IHNvdXJjZUVuZCkgeworCXJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGlzTGVnYWxVVEY4KHNvdXJjZSwgbGVuZ3RoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjE2ICgKKwljb25zdCBVVEY4Kiogc291cmNlU3RhcnQsIGNvbnN0IFVURjgqIHNvdXJjZUVuZCwgCisJVVRGMTYqKiB0YXJnZXRTdGFydCwgVVRGMTYqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKSB7CisgICAgQ29udmVyc2lvblJlc3VsdCByZXN1bHQgPSBjb252ZXJzaW9uT0s7CisgICAgY29uc3QgVVRGOCogc291cmNlID0gKnNvdXJjZVN0YXJ0OworICAgIFVURjE2KiB0YXJnZXQgPSAqdGFyZ2V0U3RhcnQ7CisgICAgd2hpbGUgKHNvdXJjZSA8IHNvdXJjZUVuZCkgeworCVVURjMyIGNoID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBleHRyYUJ5dGVzVG9SZWFkID0gdHJhaWxpbmdCeXRlc0ZvclVURjhbKnNvdXJjZV07CisJaWYgKHNvdXJjZSArIGV4dHJhQnl0ZXNUb1JlYWQgPj0gc291cmNlRW5kKSB7CisJICAgIHJlc3VsdCA9IHNvdXJjZUV4aGF1c3RlZDsgYnJlYWs7CisJfQorCS8qIERvIHRoaXMgY2hlY2sgd2hldGhlciBsZW5pZW50IG9yIHN0cmljdCAqLworCWlmICghIGlzTGVnYWxVVEY4KHNvdXJjZSwgZXh0cmFCeXRlc1RvUmVhZCsxKSkgeworCSAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworCSAgICBicmVhazsKKwl9CisJLyoKKwkgKiBUaGUgY2FzZXMgYWxsIGZhbGwgdGhyb3VnaC4gU2VlICJOb3RlIEEiIGJlbG93LgorCSAqLworCXN3aXRjaCAoZXh0cmFCeXRlc1RvUmVhZCkgeworCSAgICBjYXNlIDU6IGNoICs9ICpzb3VyY2UrKzsgY2ggPDw9IDY7IC8qIHJlbWVtYmVyLCBpbGxlZ2FsIFVURi04ICovCisJICAgIGNhc2UgNDogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsgLyogcmVtZW1iZXIsIGlsbGVnYWwgVVRGLTggKi8KKwkgICAgY2FzZSAzOiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OworCSAgICBjYXNlIDI6IGNoICs9ICpzb3VyY2UrKzsgY2ggPDw9IDY7CisJICAgIGNhc2UgMTogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKKwkgICAgY2FzZSAwOiBjaCArPSAqc291cmNlKys7CisJfQorCWNoIC09IG9mZnNldHNGcm9tVVRGOFtleHRyYUJ5dGVzVG9SZWFkXTsKKworCWlmICh0YXJnZXQgPj0gdGFyZ2V0RW5kKSB7CisJICAgIHNvdXJjZSAtPSAoZXh0cmFCeXRlc1RvUmVhZCsxKTsgLyogQmFjayB1cCBzb3VyY2UgcG9pbnRlciEgKi8KKwkgICAgcmVzdWx0ID0gdGFyZ2V0RXhoYXVzdGVkOyBicmVhazsKKwl9CisJaWYgKGNoIDw9IFVOSV9NQVhfQk1QKSB7IC8qIFRhcmdldCBpcyBhIGNoYXJhY3RlciA8PSAweEZGRkYgKi8KKwkgICAgLyogVVRGLTE2IHN1cnJvZ2F0ZSB2YWx1ZXMgYXJlIGlsbGVnYWwgaW4gVVRGLTMyICovCisJICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9MT1dfRU5EKSB7CisJCWlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7CisJCSAgICBzb3VyY2UgLT0gKGV4dHJhQnl0ZXNUb1JlYWQrMSk7IC8qIHJldHVybiB0byB0aGUgaWxsZWdhbCB2YWx1ZSBpdHNlbGYgKi8KKwkJICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisJCSAgICBicmVhazsKKwkJfSBlbHNlIHsKKwkJICAgICp0YXJnZXQrKyA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOworCQl9CisJICAgIH0gZWxzZSB7CisJCSp0YXJnZXQrKyA9IChVVEYxNiljaDsgLyogbm9ybWFsIGNhc2UgKi8KKwkgICAgfQorCX0gZWxzZSBpZiAoY2ggPiBVTklfTUFYX1VURjE2KSB7CisJICAgIGlmIChmbGFncyA9PSBzdHJpY3RDb252ZXJzaW9uKSB7CisJCXJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisJCXNvdXJjZSAtPSAoZXh0cmFCeXRlc1RvUmVhZCsxKTsgLyogcmV0dXJuIHRvIHRoZSBzdGFydCAqLworCQlicmVhazsgLyogQmFpbCBvdXQ7IHNob3VsZG4ndCBjb250aW51ZSAqLworCSAgICB9IGVsc2UgeworCQkqdGFyZ2V0KysgPSBVTklfUkVQTEFDRU1FTlRfQ0hBUjsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIC8qIHRhcmdldCBpcyBhIGNoYXJhY3RlciBpbiByYW5nZSAweEZGRkYgLSAweDEwRkZGRi4gKi8KKwkgICAgaWYgKHRhcmdldCArIDEgPj0gdGFyZ2V0RW5kKSB7CisJCXNvdXJjZSAtPSAoZXh0cmFCeXRlc1RvUmVhZCsxKTsgLyogQmFjayB1cCBzb3VyY2UgcG9pbnRlciEgKi8KKwkJcmVzdWx0ID0gdGFyZ2V0RXhoYXVzdGVkOyBicmVhazsKKwkgICAgfQorCSAgICBjaCAtPSBoYWxmQmFzZTsKKwkgICAgKnRhcmdldCsrID0gKFVURjE2KSgoY2ggPj4gaGFsZlNoaWZ0KSArIFVOSV9TVVJfSElHSF9TVEFSVCk7CisJICAgICp0YXJnZXQrKyA9IChVVEYxNikoKGNoICYgaGFsZk1hc2spICsgVU5JX1NVUl9MT1dfU1RBUlQpOworCX0KKyAgICB9CisgICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOworICAgICp0YXJnZXRTdGFydCA9IHRhcmdldDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGMzJ0b1VURjggKAorCWNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsIAorCVVURjgqKiB0YXJnZXRTdGFydCwgVVRGOCogdGFyZ2V0RW5kLCBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpIHsKKyAgICBDb252ZXJzaW9uUmVzdWx0IHJlc3VsdCA9IGNvbnZlcnNpb25PSzsKKyAgICBjb25zdCBVVEYzMiogc291cmNlID0gKnNvdXJjZVN0YXJ0OworICAgIFVURjgqIHRhcmdldCA9ICp0YXJnZXRTdGFydDsKKyAgICB3aGlsZSAoc291cmNlIDwgc291cmNlRW5kKSB7CisJVVRGMzIgY2g7CisJdW5zaWduZWQgc2hvcnQgYnl0ZXNUb1dyaXRlID0gMDsKKwljb25zdCBVVEYzMiBieXRlTWFzayA9IDB4QkY7CisJY29uc3QgVVRGMzIgYnl0ZU1hcmsgPSAweDgwOyAKKwljaCA9ICpzb3VyY2UrKzsKKwlpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbiApIHsKKwkgICAgLyogVVRGLTE2IHN1cnJvZ2F0ZSB2YWx1ZXMgYXJlIGlsbGVnYWwgaW4gVVRGLTMyICovCisJICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9MT1dfRU5EKSB7CisJCS0tc291cmNlOyAvKiByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRzZWxmICovCisJCXJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisJCWJyZWFrOworCSAgICB9CisJfQorCS8qCisJICogRmlndXJlIG91dCBob3cgbWFueSBieXRlcyB0aGUgcmVzdWx0IHdpbGwgcmVxdWlyZS4gVHVybiBhbnkKKwkgKiBpbGxlZ2FsbHkgbGFyZ2UgVVRGMzIgdGhpbmdzICg+IFBsYW5lIDE3KSBpbnRvIHJlcGxhY2VtZW50IGNoYXJzLgorCSAqLworCWlmIChjaCA8IChVVEYzMikweDgwKSB7CSAgICAgYnl0ZXNUb1dyaXRlID0gMTsKKwl9IGVsc2UgaWYgKGNoIDwgKFVURjMyKTB4ODAwKSB7ICAgICBieXRlc1RvV3JpdGUgPSAyOworCX0gZWxzZSBpZiAoY2ggPCAoVVRGMzIpMHgxMDAwMCkgeyAgIGJ5dGVzVG9Xcml0ZSA9IDM7CisJfSBlbHNlIGlmIChjaCA8PSBVTklfTUFYX0xFR0FMX1VURjMyKSB7ICBieXRlc1RvV3JpdGUgPSA0OworCX0gZWxzZSB7CQkJICAgIGJ5dGVzVG9Xcml0ZSA9IDM7CisJCQkJCSAgICBjaCA9IFVOSV9SRVBMQUNFTUVOVF9DSEFSOworCQkJCQkgICAgcmVzdWx0ID0gc291cmNlSWxsZWdhbDsKKwl9CisJCisJdGFyZ2V0ICs9IGJ5dGVzVG9Xcml0ZTsKKwlpZiAodGFyZ2V0ID4gdGFyZ2V0RW5kKSB7CisJICAgIC0tc291cmNlOyAvKiBCYWNrIHVwIHNvdXJjZSBwb2ludGVyISAqLworCSAgICB0YXJnZXQgLT0gYnl0ZXNUb1dyaXRlOyByZXN1bHQgPSB0YXJnZXRFeGhhdXN0ZWQ7IGJyZWFrOworCX0KKwlzd2l0Y2ggKGJ5dGVzVG9Xcml0ZSkgeyAvKiBub3RlOiBldmVyeXRoaW5nIGZhbGxzIHRocm91Z2guICovCisJICAgIGNhc2UgNDogKi0tdGFyZ2V0ID0gKFVURjgpKChjaCB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrKTsgY2ggPj49IDY7CisJICAgIGNhc2UgMzogKi0tdGFyZ2V0ID0gKFVURjgpKChjaCB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrKTsgY2ggPj49IDY7CisJICAgIGNhc2UgMjogKi0tdGFyZ2V0ID0gKFVURjgpKChjaCB8IGJ5dGVNYXJrKSAmIGJ5dGVNYXNrKTsgY2ggPj49IDY7CisJICAgIGNhc2UgMTogKi0tdGFyZ2V0ID0gKFVURjgpIChjaCB8IGZpcnN0Qnl0ZU1hcmtbYnl0ZXNUb1dyaXRlXSk7CisJfQorCXRhcmdldCArPSBieXRlc1RvV3JpdGU7CisgICAgfQorICAgICpzb3VyY2VTdGFydCA9IHNvdXJjZTsKKyAgICAqdGFyZ2V0U3RhcnQgPSB0YXJnZXQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjMyICgKKwljb25zdCBVVEY4Kiogc291cmNlU3RhcnQsIGNvbnN0IFVURjgqIHNvdXJjZUVuZCwgCisJVVRGMzIqKiB0YXJnZXRTdGFydCwgVVRGMzIqIHRhcmdldEVuZCwgQ29udmVyc2lvbkZsYWdzIGZsYWdzKSB7CisgICAgQ29udmVyc2lvblJlc3VsdCByZXN1bHQgPSBjb252ZXJzaW9uT0s7CisgICAgY29uc3QgVVRGOCogc291cmNlID0gKnNvdXJjZVN0YXJ0OworICAgIFVURjMyKiB0YXJnZXQgPSAqdGFyZ2V0U3RhcnQ7CisgICAgd2hpbGUgKHNvdXJjZSA8IHNvdXJjZUVuZCkgeworCVVURjMyIGNoID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBleHRyYUJ5dGVzVG9SZWFkID0gdHJhaWxpbmdCeXRlc0ZvclVURjhbKnNvdXJjZV07CisJaWYgKHNvdXJjZSArIGV4dHJhQnl0ZXNUb1JlYWQgPj0gc291cmNlRW5kKSB7CisJICAgIHJlc3VsdCA9IHNvdXJjZUV4aGF1c3RlZDsgYnJlYWs7CisJfQorCS8qIERvIHRoaXMgY2hlY2sgd2hldGhlciBsZW5pZW50IG9yIHN0cmljdCAqLworCWlmICghIGlzTGVnYWxVVEY4KHNvdXJjZSwgZXh0cmFCeXRlc1RvUmVhZCsxKSkgeworCSAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworCSAgICBicmVhazsKKwl9CisJLyoKKwkgKiBUaGUgY2FzZXMgYWxsIGZhbGwgdGhyb3VnaC4gU2VlICJOb3RlIEEiIGJlbG93LgorCSAqLworCXN3aXRjaCAoZXh0cmFCeXRlc1RvUmVhZCkgeworCSAgICBjYXNlIDU6IGNoICs9ICpzb3VyY2UrKzsgY2ggPDw9IDY7CisJICAgIGNhc2UgNDogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKKwkgICAgY2FzZSAzOiBjaCArPSAqc291cmNlKys7IGNoIDw8PSA2OworCSAgICBjYXNlIDI6IGNoICs9ICpzb3VyY2UrKzsgY2ggPDw9IDY7CisJICAgIGNhc2UgMTogY2ggKz0gKnNvdXJjZSsrOyBjaCA8PD0gNjsKKwkgICAgY2FzZSAwOiBjaCArPSAqc291cmNlKys7CisJfQorCWNoIC09IG9mZnNldHNGcm9tVVRGOFtleHRyYUJ5dGVzVG9SZWFkXTsKKworCWlmICh0YXJnZXQgPj0gdGFyZ2V0RW5kKSB7CisJICAgIHNvdXJjZSAtPSAoZXh0cmFCeXRlc1RvUmVhZCsxKTsgLyogQmFjayB1cCB0aGUgc291cmNlIHBvaW50ZXIhICovCisJICAgIHJlc3VsdCA9IHRhcmdldEV4aGF1c3RlZDsgYnJlYWs7CisJfQorCWlmIChjaCA8PSBVTklfTUFYX0xFR0FMX1VURjMyKSB7CisJICAgIC8qCisJICAgICAqIFVURi0xNiBzdXJyb2dhdGUgdmFsdWVzIGFyZSBpbGxlZ2FsIGluIFVURi0zMiwgYW5kIGFueXRoaW5nCisJICAgICAqIG92ZXIgUGxhbmUgMTcgKD4gMHgxMEZGRkYpIGlzIGlsbGVnYWwuCisJICAgICAqLworCSAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgeworCQlpZiAoZmxhZ3MgPT0gc3RyaWN0Q29udmVyc2lvbikgeworCQkgICAgc291cmNlIC09IChleHRyYUJ5dGVzVG9SZWFkKzEpOyAvKiByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRzZWxmICovCisJCSAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworCQkgICAgYnJlYWs7CisJCX0gZWxzZSB7CisJCSAgICAqdGFyZ2V0KysgPSBVTklfUkVQTEFDRU1FTlRfQ0hBUjsKKwkJfQorCSAgICB9IGVsc2UgeworCQkqdGFyZ2V0KysgPSBjaDsKKwkgICAgfQorCX0gZWxzZSB7IC8qIGkuZS4sIGNoID4gVU5JX01BWF9MRUdBTF9VVEYzMiAqLworCSAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworCSAgICAqdGFyZ2V0KysgPSBVTklfUkVQTEFDRU1FTlRfQ0hBUjsKKwl9CisgICAgfQorICAgICpzb3VyY2VTdGFydCA9IHNvdXJjZTsKKyAgICAqdGFyZ2V0U3RhcnQgPSB0YXJnZXQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBOb3RlIEEuCisgICAgVGhlIGZhbGwtdGhyb3VnaCBzd2l0Y2hlcyBpbiBVVEYtOCByZWFkaW5nIGNvZGUgc2F2ZSBhCisgICAgdGVtcCB2YXJpYWJsZSwgc29tZSBkZWNyZW1lbnRzICYgY29uZGl0aW9uYWxzLiAgVGhlIHN3aXRjaGVzCisgICAgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBsb29wOgorCXsKKwkgICAgaW50IHRtcEJ5dGVzVG9SZWFkID0gZXh0cmFCeXRlc1RvUmVhZCsxOworCSAgICBkbyB7CisJCWNoICs9ICpzb3VyY2UrKzsKKwkJLS10bXBCeXRlc1RvUmVhZDsKKwkJaWYgKHRtcEJ5dGVzVG9SZWFkKSBjaCA8PD0gNjsKKwkgICAgfSB3aGlsZSAodG1wQnl0ZXNUb1JlYWQgPiAwKTsKKwl9CisgICAgSW4gVVRGLTggd3JpdGluZyBjb2RlLCB0aGUgc3dpdGNoZXMgb24gImJ5dGVzVG9Xcml0ZSIgYXJlCisgICAgc2ltaWxhcmx5IHVucm9sbGVkIGxvb3BzLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2N5Y2xpY2RmYS5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzY3ljbGljZGZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNzIyMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2N5Y2xpY2RmYS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRyYXZlcnNpbmcgY3ljbGljIERGQSBzdGF0ZXMgYXMgbGFpZAorICogIG91dCBpbiBzdGF0aWMgaW5pdGlhbGl6ZWQgc3RydWN0dXJlcyBieSB0aGUgY29kZSBnZW5lcmF0b3IuCisgKgorICogQSBERkEgaW1wbGVtZW50ZWQgYXMgYSBzZXQgb2YgdHJhbnNpdGlvbiB0YWJsZXMuCisgKgorICogIEFueSBzdGF0ZSB0aGF0IGhhcyBhIHNlbWFudGljIHByZWRpY2F0ZSBlZGdlIGlzIHNwZWNpYWw7IHRob3NlIHN0YXRlcworICogIGFyZSBnZW5lcmF0ZWQgd2l0aCBpZi10aGVuLWVsc2Ugc3RydWN0dXJlcyBpbiBhIC0+c3BlY2lhbFN0YXRlVHJhbnNpdGlvbigpCisgKiAgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGN5Y2xpY0RGQSB0ZW1wbGF0ZS4KKyAqCisgKiAgVGhlcmUgYXJlIGF0IG1vc3QgMzI3Njcgc3RhdGVzICgxNi1iaXQgc2lnbmVkIHNob3J0KS4KKyAqICBDb3VsZCBnZXQgYXdheSB3aXRoIGJ5dGUgc29tZXRpbWVzIGJ1dCB3b3VsZCBoYXZlIHRvIGdlbmVyYXRlIGRpZmZlcmVudAorICogIHR5cGVzIGFuZCB0aGUgc2ltdWxhdGlvbiBjb2RlIHRvby4gIEZvciBhIHBvaW50IG9mIHJlZmVyZW5jZSwgdGhlIEphdmEKKyAqICBsZXhlcidzIFRva2VucyBydWxlIERGQSBoYXMgMzI2IHN0YXRlcyByb3VnaGx5LgorICovCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2RlZnMuaD4KKyNpbmNsdWRlICAgIDxhbnRscjNjeWNsaWNkZmEuaD4KKworI2lmZGVmCUFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAwICkKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorbm9WaWFibGVBbHQocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX0NZQ0xJQ19ERkEgY2RmYSwgQU5UTFIzX1VJTlQzMglzKQoreworCS8vIEluIGJhY2t0cmFja2luZyBtb2RlLCB3ZSBqdXN0IHNldCB0aGUgZmFpbGVkIGZsYWcgc28gdGhhdCB0aGUKKwkvLyBhbHQgY2FuIGp1c3QgZXhpdCByaWdodCBub3cuIElmIHdlIGFyZSBwYXJzaW5nIHRob3VnaCwgdGhlbiAKKwkvLyB3ZSB3YW50IHRoZSBleGNlcHRpb24gdG8gYmUgcmFpc2VkLgorCS8vCisgICAgaWYJKHJlYy0+c3RhdGUtPmJhY2t0cmFja2luZyA+IDApCisgICAgeworCQlyZWMtPnN0YXRlLT5mYWlsZWQgPSBBTlRMUjNfVFJVRTsKKyAgICB9CisJZWxzZQorCXsKKwkJcmVjLT5leENvbnN0cnVjdChyZWMpOworCQlyZWMtPnN0YXRlLT5leGNlcHRpb24tPnR5cGUgICAgICAgICA9IEFOVExSM19OT19WSUFCTEVfQUxUX0VYQ0VQVElPTjsKKwkJcmVjLT5zdGF0ZS0+ZXhjZXB0aW9uLT5tZXNzYWdlICAgICAgPSBjZGZhLT5kZXNjcmlwdGlvbjsKKwkJcmVjLT5zdGF0ZS0+ZXhjZXB0aW9uLT5kZWNpc2lvbk51bSAgPSBjZGZhLT5kZWNpc2lvbk51bWJlcjsKKwkJcmVjLT5zdGF0ZS0+ZXhjZXB0aW9uLT5zdGF0ZSAgICAgICAgPSBzOworCX0KK30KKworLyoqIEZyb20gdGhlIGlucHV0IHN0cmVhbSwgcHJlZGljdCB3aGF0IGFsdGVybmF0aXZlIHdpbGwgc3VjY2VlZAorICogIHVzaW5nIHRoaXMgREZBIChyZXByZXNlbnRpbmcgdGhlIGNvdmVyaW5nIHJlZ3VsYXIgYXBwcm94aW1hdGlvbgorICogIHRvIHRoZSB1bmRlcmx5aW5nIENGTCkuICBSZXR1cm4gYW4gYWx0ZXJuYXRpdmUgbnVtYmVyIDEuLm4uICBUaHJvdworICogIGFuIGV4Y2VwdGlvbiB1cG9uIGVycm9yLgorICovCitBTlRMUjNfQVBJIEFOVExSM19JTlQzMgorYW50bHIzZGZhcHJlZGljdCAodm9pZCAqIGN0eCwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIHBBTlRMUjNfQ1lDTElDX0RGQSBjZGZhKQoreworICAgIEFOVExSM19NQVJLRVIJbWFyazsKKyAgICBBTlRMUjNfSU5UMzIJczsKKyAgICBBTlRMUjNfSU5UMzIJc3BlY2lhbFN0YXRlOworICAgIEFOVExSM19JTlQzMgljOworCisgICAgbWFyawk9IGlzLT5tYXJrKGlzKTsJICAgIC8qIFN0b3JlIHdoZXJlIHdlIGFyZSByaWdodCBub3cJKi8KKyAgICBzCQk9IDA7CQkgICAgLyogQWx3YXlzIHN0YXJ0IHdpdGggc3RhdGUgMAkqLworICAgIAorCWZvciAoOzspCisJeworCQkvKiBQaWNrIG91dCBhbnkgc3BlY2lhbCBzdGF0ZSBlbnRyeSBmb3IgdGhpcyBzdGF0ZQorCQkgKi8KKwkJc3BlY2lhbFN0YXRlCT0gY2RmYS0+c3BlY2lhbFtzXTsKKworCQkvKiBUcmFuc2l0aW9uIHRoZSBzcGVjaWFsIHN0YXRlIGFuZCBjb25zdW1lIGFuIGlucHV0IHRva2VuCisJCSAqLworCQlpZiAgKHNwZWNpYWxTdGF0ZSA+PSAwKQorCQl7CisJCQlzID0gY2RmYS0+c3BlY2lhbFN0YXRlVHJhbnNpdGlvbihjdHgsIHJlYywgaXMsIGNkZmEsIHNwZWNpYWxTdGF0ZSk7CisKKwkJCS8vIEVycm9yPworCQkJLy8KKwkJCWlmCShzPDApCisJCQl7CisJCQkJLy8gSWYgdGhlIHByZWRpY2F0ZS9ydWxlIHJhaXNlZCBhbiBleGNlcHRpb24gdGhlbiB3ZSBsZWF2ZSBpdAorCQkJCS8vIGluIHRhY3QsIGVsc2Ugd2UgaGF2ZSBhbiBOVkEuCisJCQkJLy8KKwkJCQlpZgkocmVjLT5zdGF0ZS0+ZXJyb3IgIT0gQU5UTFIzX1RSVUUpCisJCQkJeworCQkJCQlub1ZpYWJsZUFsdChyZWMsY2RmYSwgcyk7CisJCQkJfQorCQkJCWlzLT5yZXdpbmQoaXMsIG1hcmspOworCQkJCXJldHVybgkwOworCQkJfQorCQkJaXMtPmNvbnN1bWUoaXMpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBBY2NlcHQgc3RhdGU/CisJCSAqLworCQlpZiAgKGNkZmEtPmFjY2VwdFtzXSA+PSAxKQorCQl7CisJCQlpcy0+cmV3aW5kKGlzLCBtYXJrKTsKKwkJCXJldHVybiAgY2RmYS0+YWNjZXB0W3NdOworCQl9CisKKwkJLyogTG9vayBmb3IgYSBub3JtYWwgdHJhbnNpdGlvbiBzdGF0ZSBiYXNlZCB1cG9uIHRoZSBpbnB1dCB0b2tlbiBlbGVtZW50CisJCSAqLworCQljID0gaXMtPl9MQShpcywgMSk7CisKKwkJLyogQ2hlY2sgYWdhaW5zdCBtaW4gYW5kIG1heCBmb3IgdGhpcyBzdGF0ZQorCQkgKi8KKwkJaWYgIChjPj0gY2RmYS0+bWluW3NdICYmIGMgPD0gY2RmYS0+bWF4W3NdKQorCQl7CisJCQlBTlRMUjNfSU5UMzIgICBzbmV4dDsKKworCQkJLyogV2hhdCBpcyB0aGUgbmV4dCBzdGF0ZT8KKwkJCSAqLworCQkJc25leHQgPSBjZGZhLT50cmFuc2l0aW9uW3NdW2MgLSBjZGZhLT5taW5bc11dOworCisJCQlpZgkoc25leHQgPCAwKQorCQkJeworCQkJCS8qIFdhcyBpbiByYW5nZSBidXQgbm90IGEgbm9ybWFsIHRyYW5zaXRpb24KKwkJCQkgKiBtdXN0IGNoZWNrIEVPVCwgd2hpY2ggaXMgbGlrZSB0aGUgZWxzZSBjbGF1c2UuCisJCQkJICogZW90W3NdPj0wIGluZGljYXRlcyB0aGF0IGFuIEVPVCBlZGdlIGdvZXMgdG8gYW5vdGhlcgorCQkJCSAqIHN0YXRlLgorCQkJCSAqLworCQkJCWlmICAoY2RmYS0+ZW90W3NdID49IDApCisJCQkJeworCQkJCQlzID0gY2RmYS0+ZW90W3NdOworCQkJCQlpcy0+Y29uc3VtZShpcyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlub1ZpYWJsZUFsdChyZWMsY2RmYSwgcyk7CisJCQkJaXMtPnJld2luZChpcywgbWFyayk7CisJCQkJcmV0dXJuCTA7CisJCQl9CisKKwkJCS8qIE5ldyBjdXJyZW50IHN0YXRlIC0gbW92ZSB0byBpdAorCQkJICovCisJCQlzCT0gc25leHQ7CisJCQlpcy0+Y29uc3VtZShpcyk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBFT1QgVHJhbnNpdGlvbj8KKwkJICovCisJCWlmICAoY2RmYS0+ZW90W3NdID49IDApCisJCXsKKwkJCXMJPSBjZGZhLT5lb3Rbc107CisJCQlpcy0+Y29uc3VtZShpcyk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBFT0YgdHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisJCSAqLworCQlpZiAgKCBjID09IEFOVExSM19UT0tFTl9FT0YgJiYgY2RmYS0+ZW9mW3NdID49IDApCisJCXsKKwkJCWlzLT5yZXdpbmQoaXMsIG1hcmspOworCQkJcmV0dXJuICBjZGZhLT5hY2NlcHRbY2RmYS0+ZW9mW3NdXTsKKwkJfQorCisJCS8qIE5vIGFsdCwgc28gYm9tYgorCQkgKi8KKwkJbm9WaWFibGVBbHQocmVjLCBjZGZhLCBzKTsKKwkJaXMtPnJld2luZChpcywgbWFyayk7CisJCXJldHVybiAwOworCX0KKworfQorCisvKiogRGVmYXVsdCBzcGVjaWFsIHN0YXRlIGltcGxlbWVudGF0aW9uCisgKi8KK0FOVExSM19BUEkgQU5UTFIzX0lOVDMyCQorYW50bHIzZGZhc3BlY2lhbFN0YXRlVHJhbnNpdGlvbiAgICh2b2lkICogY3R4LCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIHBBTlRMUjNfQ1lDTElDX0RGQSBkZmEsIEFOVExSM19JTlQzMiBzKQoreworICAgIHJldHVybiAtMTsKK30KKworLyogRGVmYXVsdCBzcGVjaWFsIHRyYW5zaXRpb24gaW1wbGVtZW50YXRpb24KKyAqLworQU5UTFIzX0FQSSBBTlRMUjNfSU5UMzIKK2FudGxyM2RmYXNwZWNpYWxUcmFuc2l0aW9uICAgICh2b2lkICogY3R4LCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIHBBTlRMUjNfQ1lDTElDX0RGQSBkZmEsIEFOVExSM19JTlQzMiBzKQoreworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZGVidWdoYW5kbGVycy5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZGVidWdoYW5kbGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjE3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNkZWJ1Z2hhbmRsZXJzLmMKQEAgLTAsMCArMSwxMDQ3IEBACisvLy8gXGZpbGUKKy8vLyBQcm92aWRlcyB0aGUgZGVidWdnaW5nIGZ1bmN0aW9ucyBpbnZva2VkIGJ5IGEgcmVjb2duaXplcgorLy8vIGJ1aWx0IHVzaW5nIHRoZSBkZWJ1ZyBnZW5lcmF0b3IgbW9kZSBvZiB0aGUgYW50bHIgdG9vbC4KKy8vLyBTZWUgYW50bHIzZGVidWdldmVudGxpc3RlbmVyLmggZm9yIGRvY3VtZW50YXRpb24uCisvLy8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzLmg+CisKKy8vIE5vdCBldmVyeW9uZSB3aXNoZXMgdG8gaW5jbHVkZSB0aGUgZGVidWdnZXIgc3R1ZmYgaW4gdGhlaXIgZmluYWwgZGVwbG95bWVudCBiZWNhdXNlCisvLyBpdCB3aWxsIHRoZW4gcmVseSBvbiBiZWluZyBsaW5rZWQgd2l0aCB0aGUgc29ja2V0IGxpYnJhcmllcy4gSGVuY2UgaWYgdGhlIHByb2dyYW1tZXIgdHVybnMKKy8vIG9mZiB0aGUgZGVidWdnaW5nLCB3ZSBkbyBzb21lIGR1bW15IHN0dWZmIHRoYXQgc2F0aWZpZXMgY29tcGlsZXJzIGV0YyBidXQgbWVhbnMgdGhlcmUgaXMKKy8vIG5vIGRlYnVnZ2VyIGFuZCBubyByZWxpYW5jZSBvbiB0aGUgc29ja2V0IGxpYnJhcmlyZXMuIElmIHlvdSBzZXQgdGhpcyBmbGFnLCB0aGVuIHVzaW5nIHRoZSAtZGVidWcKKy8vIG9wdGlvbiB0byBnZW5lcmF0ZSB5b3VyIGNvZGUgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCBqdXN0IGNyYXNoZXMsIGJ1dCB0aGVuIEkgcHJlc21lIHlvdSBhcmUgc21hcnQKKy8vIGVub3VnaCB0byByZWFsaXplIHRoYXQgYnVpbGRpbmcgdGhlIGxpYnJhcmllcyB3aXRob3V0IGRlYnVnZ2VyIHN1cHBvcnQgbWVhbnMgeW91IGNhbid0IGNhbGwgdGhlCisvLyBkZWJ1Z2dlciA7LSkKKy8vIAorI2lmZGVmIEFOVExSM19OT0RFQlVHR0VSCitBTlRMUjNfQVBJIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIKK2FudGxyM0RlYnVnTGlzdGVuZXJOZXcoKQoreworCQlBTlRMUjNfUFJJTlRGKCJDIHJ1bnRpbWUgd2FzIGNvbXBpbGVkIHdpdGhvdXQgZGVidWdnZXIgc3VwcG9ydC4gVGhpcyBwcm9ncmFtIHdpbGwgY3Jhc2ghISIpOworCQlyZXR1cm4gTlVMTDsKK30KKyNlbHNlCisKK3N0YXRpYwlBTlRMUjNfQk9PTEVBTgloYW5kc2hha2UJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSk7CitzdGF0aWMJdm9pZAllbnRlclJ1bGUJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBjb25zdCBjaGFyICogZ3JhbW1hckZpbGVOYW1lLCBjb25zdCBjaGFyICogcnVsZU5hbWUpOworc3RhdGljCXZvaWQJZW50ZXJBbHQJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgYWx0KTsKK3N0YXRpYwl2b2lkCWV4aXRSdWxlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgY29uc3QgY2hhciAqIGdyYW1tYXJGaWxlTmFtZSwgY29uc3QgY2hhciAqIHJ1bGVOYW1lKTsKK3N0YXRpYwl2b2lkCWVudGVyU3ViUnVsZQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGRlY2lzaW9uTnVtYmVyKTsKK3N0YXRpYwl2b2lkCWV4aXRTdWJSdWxlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGRlY2lzaW9uTnVtYmVyKTsKK3N0YXRpYwl2b2lkCWVudGVyRGVjaXNpb24JCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBkZWNpc2lvbk51bWJlcik7CitzdGF0aWMJdm9pZAlleGl0RGVjaXNpb24JCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBkZWNpc2lvbk51bWJlcik7CitzdGF0aWMJdm9pZAljb25zdW1lVG9rZW4JCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHQpOworc3RhdGljCXZvaWQJY29uc3VtZUhpZGRlblRva2VuCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHQpOworc3RhdGljCXZvaWQJTFQJCQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBpLCBwQU5UTFIzX0NPTU1PTl9UT0tFTiB0KTsKK3N0YXRpYwl2b2lkCW1hcmsJCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgQU5UTFIzX01BUktFUiBtYXJrZXIpOworc3RhdGljCXZvaWQJcmV3aW5kTWFyawkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIEFOVExSM19NQVJLRVIgbWFya2VyKTsKK3N0YXRpYwl2b2lkCXJld2luZExhc3QJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KTsKK3N0YXRpYwl2b2lkCWJlZ2luQmFja3RyYWNrCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgbGV2ZWwpOworc3RhdGljCXZvaWQJZW5kQmFja3RyYWNrCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgbGV2ZWwsIEFOVExSM19CT09MRUFOIHN1Y2Nlc3NmdWwpOworc3RhdGljCXZvaWQJbG9jYXRpb24JCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgbGluZSwgaW50IHBvcyk7CitzdGF0aWMJdm9pZAlyZWNvZ25pdGlvbkV4Y2VwdGlvbgkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfRVhDRVBUSU9OIGUpOworc3RhdGljCXZvaWQJYmVnaW5SZXN5bmMJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KTsKK3N0YXRpYwl2b2lkCWVuZFJlc3luYwkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpOworc3RhdGljCXZvaWQJc2VtYW50aWNQcmVkaWNhdGUJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgQU5UTFIzX0JPT0xFQU4gcmVzdWx0LCBjb25zdCBjaGFyICogcHJlZGljYXRlKTsKK3N0YXRpYwl2b2lkCWNvbW1lbmNlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSk7CitzdGF0aWMJdm9pZAl0ZXJtaW5hdGUJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KTsKK3N0YXRpYwl2b2lkCWNvbnN1bWVOb2RlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJdm9pZAlMVFQJCQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBpLCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwl2b2lkCW5pbE5vZGUJCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCk7CitzdGF0aWMJdm9pZAllcnJvck5vZGUJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwl2b2lkCWNyZWF0ZU5vZGUJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBwQU5UTFIzX0JBU0VfVFJFRSB0KTsKK3N0YXRpYwl2b2lkCWNyZWF0ZU5vZGVUb2sJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIG5vZGUsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKK3N0YXRpYwl2b2lkCWJlY29tZVJvb3QJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBwQU5UTFIzX0JBU0VfVFJFRSBuZXdSb290LCBwQU5UTFIzX0JBU0VfVFJFRSBvbGRSb290KTsKK3N0YXRpYwl2b2lkCWFkZENoaWxkCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgcm9vdCwgcEFOVExSM19CQVNFX1RSRUUgY2hpbGQpOworc3RhdGljCXZvaWQJc2V0VG9rZW5Cb3VuZGFyaWVzCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIHQsIEFOVExSM19NQVJLRVIgdG9rZW5TdGFydEluZGV4LCBBTlRMUjNfTUFSS0VSIHRva2VuU3RvcEluZGV4KTsKK3N0YXRpYwl2b2lkCWFjawkJCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSk7CisKKy8vLyBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgZGVidWcgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYW4gYmUgY29ubmVjdGVkIHRvCisvLy8gYnkgQU5UTFJXb3JrcyBhbmQgYW55IG90aGVyIGRlYnVnZ2VyIHZpYSBhIHNvY2tldC4KKy8vLworQU5UTFIzX0FQSSBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSCithbnRscjNEZWJ1Z0xpc3RlbmVyTmV3KCkKK3sKKwlwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSCWRlbGJveTsKKworCWRlbGJveSA9IEFOVExSM19DQUxMT0MoMSwgc2l6ZW9mKEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUikpOworCisJaWYJKGRlbGJveSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLy8gSW5pdGlhbGl6ZSB0aGUgQVBJCisJLy8KKwlkZWxib3ktPmFkZENoaWxkCQkJCT0gYWRkQ2hpbGQ7CisJZGVsYm95LT5iZWNvbWVSb290CQkJCT0gYmVjb21lUm9vdDsKKwlkZWxib3ktPmJlZ2luQmFja3RyYWNrCQkJPSBiZWdpbkJhY2t0cmFjazsKKwlkZWxib3ktPmJlZ2luUmVzeW5jCQkJCT0gYmVnaW5SZXN5bmM7CisJZGVsYm95LT5jb21tZW5jZQkJCQk9IGNvbW1lbmNlOworCWRlbGJveS0+Y29uc3VtZUhpZGRlblRva2VuCQk9IGNvbnN1bWVIaWRkZW5Ub2tlbjsKKwlkZWxib3ktPmNvbnN1bWVOb2RlCQkJCT0gY29uc3VtZU5vZGU7CisJZGVsYm95LT5jb25zdW1lVG9rZW4JCQk9IGNvbnN1bWVUb2tlbjsKKwlkZWxib3ktPmNyZWF0ZU5vZGUJCQkJPSBjcmVhdGVOb2RlOworCWRlbGJveS0+Y3JlYXRlTm9kZVRvawkJCT0gY3JlYXRlTm9kZVRvazsKKwlkZWxib3ktPmVuZEJhY2t0cmFjawkJCT0gZW5kQmFja3RyYWNrOworCWRlbGJveS0+ZW5kUmVzeW5jCQkJCT0gZW5kUmVzeW5jOworCWRlbGJveS0+ZW50ZXJBbHQJCQkJPSBlbnRlckFsdDsKKwlkZWxib3ktPmVudGVyRGVjaXNpb24JCQk9IGVudGVyRGVjaXNpb247CisJZGVsYm95LT5lbnRlclJ1bGUJCQkJPSBlbnRlclJ1bGU7CisJZGVsYm95LT5lbnRlclN1YlJ1bGUJCQk9IGVudGVyU3ViUnVsZTsKKwlkZWxib3ktPmV4aXREZWNpc2lvbgkJCT0gZXhpdERlY2lzaW9uOworCWRlbGJveS0+ZXhpdFJ1bGUJCQkJPSBleGl0UnVsZTsKKwlkZWxib3ktPmV4aXRTdWJSdWxlCQkJCT0gZXhpdFN1YlJ1bGU7CisJZGVsYm95LT5oYW5kc2hha2UJCQkJPSBoYW5kc2hha2U7CisJZGVsYm95LT5sb2NhdGlvbgkJCQk9IGxvY2F0aW9uOworCWRlbGJveS0+TFQJCQkJCQk9IExUOworCWRlbGJveS0+TFRUCQkJCQkJPSBMVFQ7CisJZGVsYm95LT5tYXJrCQkJCQk9IG1hcms7CisJZGVsYm95LT5uaWxOb2RlCQkJCQk9IG5pbE5vZGU7CisJZGVsYm95LT5yZWNvZ25pdGlvbkV4Y2VwdGlvbgk9IHJlY29nbml0aW9uRXhjZXB0aW9uOworCWRlbGJveS0+cmV3aW5kCQkJCQk9IHJld2luZE1hcms7CisJZGVsYm95LT5yZXdpbmRMYXN0CQkJCT0gcmV3aW5kTGFzdDsKKwlkZWxib3ktPnNlbWFudGljUHJlZGljYXRlCQk9IHNlbWFudGljUHJlZGljYXRlOworCWRlbGJveS0+c2V0VG9rZW5Cb3VuZGFyaWVzCQk9IHNldFRva2VuQm91bmRhcmllczsKKwlkZWxib3ktPnRlcm1pbmF0ZQkJCQk9IHRlcm1pbmF0ZTsKKwlkZWxib3ktPmVycm9yTm9kZQkJCQk9IGVycm9yTm9kZTsKKworCWRlbGJveS0+UFJPVE9DT0xfVkVSU0lPTgkJPSAyOwkvLyBBTlRMUiAzLjEgaXMgYXQgcHJvdG9jb2wgdmVyc2lvbiAyCisKKwlkZWxib3ktPnBvcnQJCQkJCT0gREVGQVVMVF9ERUJVR0dFUl9QT1JUOworCisJcmV0dXJuIGRlbGJveTsKK30KKworcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUgorYW50bHIzRGVidWdMaXN0ZW5lck5ld1BvcnQoQU5UTFIzX1VJTlQzMiBwb3J0KQoreworCXBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIJZGVsYm95OworCisJZGVsYm95CQkgPSBhbnRscjNEZWJ1Z0xpc3RlbmVyTmV3KCk7CisKKwlpZgkoZGVsYm95ICE9IE5VTEwpCisJeworCQlkZWxib3ktPnBvcnQgPSBwb3J0OworCX0KKworCXJldHVybiBkZWxib3k7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBzZW5kaW5nIHN0dWZmIG92ZXIgdGhlIHNvY2tldCBpbnRlcmZhY2UKKy8vCitzdGF0aWMgaW50IAorc29ja1NlbmQoU09DS0VUIHNvY2ssIGNvbnN0IGNoYXIgKiBwdHIsIGludCBsZW4pCit7CisJaW50CQlzZW50OworCWludAkJdGhpc1NlbmQ7CisKKwlzZW50CT0gMDsKKwkJCisJd2hpbGUJKHNlbnQgPCBsZW4pCisJeworCQkvLyBTZW5kIGFzIG1hbnkgYnl0ZXMgYXMgd2UgY2FuCisJCS8vCisJCXRoaXNTZW5kID0Jc2VuZChzb2NrLCBwdHIsIGxlbiAtIHNlbnQsIDApOworCisJCS8vIENoZWNrIGZvciBlcnJvcnMgYW5kIHRlbGwgdGhlIHVzZXIgaWYgd2UgZ290IG9uZQorCQkvLworCQlpZgkodGhpc1NlbmQJPT0gLTEpCisJCXsKKwkJCXJldHVybglBTlRMUjNfRkFMU0U7CisJCX0KKworCQkvLyBJbmNyZW1lbnQgb3VyIG9mZnNldCBieSBob3cgbWFueSB3ZSB3ZXJlIGFibGUgdG8gc2VuZAorCQkvLworCQlwdHIJCQkrPSB0aGlzU2VuZDsKKwkJc2VudAkJKz0gdGhpc1NlbmQ7CisJfQorCXJldHVybglBTlRMUjNfVFJVRTsKK30KKworc3RhdGljCUFOVExSM19CT09MRUFOCQoraGFuZHNoYWtlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSkKK3sKKwkvLy8gQ29ubmVjdGlvbiBzdHJ1Y3R1cmUgd2l0aCB3aGljaCB0byB3YWl0IGFuZCBhY2NlcHQgYSBjb25uZWN0aW9uIGZyb20KKwkvLy8gYSBkZWJ1Z2dlci4KKwkvLy8KKwlTT0NLRVQJCQkJc2VydmVyU29ja2V0OworCisJLy8gQ29ubmVjdGlvbiBzdHJ1Y3R1cmVzIHRvIGRlYWwgd2l0aCB0aGUgY2xpZW50IGFmdGVyIHdlIGFjY2VwdCB0aGUgY29ubmVjdGlvbgorCS8vIGFuZCB0aGUgc2VydmVyIHdoaWxlIHdlIGFjY2VwdCBhIGNvbm5lY3Rpb24uCisJLy8KKwlBTlRMUjNfU09DS0FERFJUCWNsaWVudDsKKwlBTlRMUjNfU09DS0FERFJUCXNlcnZlcjsKKworCS8vIEJ1ZmZlciB0byBjb25zdHJ1Y3Qgb3VyIG1lc3NhZ2UgaW4KKwkvLworCWNoYXIJbWVzc2FnZVsyNTZdOworCisJLy8gU3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIGNvbm5lY3Rpb24gc3RydWN0dXJlIHRvIGFjY2VwdCgpCisJLy8gV2luZG93cyB1c2UgaW50LCBldmVyeW9uZSBlbHNlIHVzZXMgc2l6ZV90CisJLy8KKwlBTlRMUjNfU0FMRU5UCQkJCXNvY2thZGRyX2xlbjsKKworCS8vIE9wdGlvbiBob2xkZXIgZm9yIHNldHNvY2tvcHQoKQorCS8vCisJaW50CQlvcHRWYWw7CisKKwlpZgkoZGVsYm95LT5pbml0aWFsaXplZCA9PSBBTlRMUjNfRkFMU0UpCisJeworCQkvLyBXaW5kb3dzIHJlcXVpcmVzIHVzIHRvIGluaXRpYWxpemUgV2luU29jay4KKwkJLy8KKyNpZmRlZiBBTlRMUjNfV0lORE9XUworCQl7CisJCQlXT1JECQl3VmVyc2lvblJlcXVlc3RlZDsKKwkJCVdTQURBVEEJCXdzYURhdGE7CisJCQlpbnQJCQllcnI7CQkJLy8gUmV0dXJuIGNvZGUgZnJvbSBXU0FTdGFydHVwCisKKwkJCS8vIFdlIG11c3QgaW5pdGlhbGlzZSB0aGUgV2luZG93cyBzb2NrZXQgc3lzdGVtIHdoZW4gdGhlIERMTCBpcyBsb2FkZWQuCisJCQkvLyBXZSBhcmUgYXNraW5nIGZvciBXaW5zb2NrIDEuMSBvciBiZXR0ZXIgYXMgd2UgZG9uJ3QgbmVlZCBhbnl0aGluZworCQkJLy8gdG9vIGNvbXBsaWNhdGVkIGZvciB0aGlzLgorCQkJLy8KKwkJCXdWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoIDEsIDEpOworCisJCQllcnIgPSBXU0FTdGFydHVwKCB3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEgKTsKKworCQkJaWYgKCBlcnIgIT0gMCApIAorCQkJeworCQkJCS8vIFRlbGwgdGhlIHVzZXIgdGhhdCB3ZSBjb3VsZCBub3QgZmluZCBhIHVzYWJsZQorCQkJCS8vIFdpblNvY2sgRExMCisJCQkJLy8KKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8vIENyZWF0ZSB0aGUgc2VydmVyIHNvY2tldCwgd2UgYXJlIHRoZSBzZXJ2ZXIgYmVjYXVzZSB3ZSBqdXN0IHdhaXQgdW50aWwKKwkJLy8gYSBkZWJ1Z2dlciBjb25uZWN0cyB0byB0aGUgcG9ydCB3ZSBhcmUgbGlzdGVuaW5nIG9uLgorCQkvLworCQlzZXJ2ZXJTb2NrZXQJPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCisJCWlmCShzZXJ2ZXJTb2NrZXQgPT0gSU5WQUxJRF9TT0NLRVQpCisJCXsKKwkJCXJldHVybiBBTlRMUjNfRkFMU0U7CisJCX0KKworCQkvLyBTZXQgdGhlIGxpc3RlbmluZyBwb3J0CisJCS8vCisJCXNlcnZlci5zaW5fcG9ydAkJCT0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KWRlbGJveS0+cG9ydCk7CisJCXNlcnZlci5zaW5fZmFtaWx5CQk9IEFGX0lORVQ7CisJCXNlcnZlci5zaW5fYWRkci5zX2FkZHIJPSBodG9ubCAoSU5BRERSX0FOWSk7CisKKwkJLy8gV2UgY291bGQgYWxsb3cgYSByZWJpbmQgb24gdGhlIHNhbWUgYWRkci9wb3J0IHBhaXIgSSBzdXBwb3NlLCBidXQKKwkJLy8gSSBpbWFnaW5lIHRoYXQgbW9zdCBwZW9wbGUgd2lsbCBqdXN0IHdhbnQgdG8gc3RhcnQgZGVidWdnaW5nIG9uZSBwYXJzZXIgYXQgb25jZS4KKwkJLy8gTWF5YmUgY2hhbmdlIHRoaXMgYXQgc29tZSBwb2ludCwgYnV0IHJlamVjdGluZyB0aGUgYmluZCBhdCB0aGlzIHBvaW50IHdpbGwgZW5zdXJlCisJCS8vIHRoYXQgcGVvcGxlIHJlYWxpemUgdGhleSBoYXZlIGxlZnQgc29tZXRoaW5nIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQuCisJCS8vCisJCWlmCShiaW5kKHNlcnZlclNvY2tldCwgKHBBTlRMUjNfU09DS0FERFJDKSZzZXJ2ZXIsIHNpemVvZihzZXJ2ZXIpKSA9PSAtMSkKKwkJeworCQkJcmV0dXJuIEFOVExSM19GQUxTRTsKKwkJfQorCisJCS8vIFdlIGhhdmUgYm91bmQgdGhlIHNvY2tldCB0byB0aGUgcG9ydCBhbmQgYWRkcmVzcyBzbyB3ZSBub3cgYXNrIHRoZSBUQ1Agc3Vic3lzdGVtCisJCS8vIHRvIHN0YXJ0IGxpc3RlbmluZyBvbiB0aGF0IGFkZHJlc3MvcG9ydAorCQkvLworCQlpZgkobGlzdGVuKHNlcnZlclNvY2tldCwgMSkgPT0gLTEpCisJCXsKKwkJCS8vIFNvbWUgZXJyb3IsIGp1c3QgZmFpbAorCQkJLy8KKwkJCXJldHVybglBTlRMUjNfRkFMU0U7CisJCX0KKworCQkvLyBOb3cgd2UgY2FuIHRyeSB0byBhY2NlcHQgYSBjb25uZWN0aW9uIG9uIHRoZSBwb3J0CisJCS8vCisJCXNvY2thZGRyX2xlbgk9IHNpemVvZihjbGllbnQpOworCQlkZWxib3ktPnNvY2tldAk9IGFjY2VwdChzZXJ2ZXJTb2NrZXQsIChwQU5UTFIzX1NPQ0tBRERSQykmY2xpZW50LCAmc29ja2FkZHJfbGVuKTsKKworCQkvLyBIYXZpbmcgYWNjZXB0ZWQgYSBjb25uZWN0aW9uLCB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgYW5kIGNsb3NlIGRvd24gdGhlIHNvY2tldAorCQkvLworCQlzaHV0ZG93bgkJKHNlcnZlclNvY2tldCwgMHgwMik7CisJCUFOVExSM19DTE9TRVNPQ0tFVAkJKHNlcnZlclNvY2tldCk7CisKKwkJaWYJKGRlbGJveS0+c29ja2V0ID09IC0xKQorCQl7CisJCQlyZXR1cm4gQU5UTFIzX0ZBTFNFOworCQl9CisKKwkJLy8gRGlzYWJsZSBOYWdsZSBhcyB0aGlzIGlzIGVzc2VudGlhbGx5IGEgY2hhdCBleGNoYW5nZQorCQkvLworCQlvcHRWYWwJPSAxOworCQlzZXRzb2Nrb3B0KGRlbGJveS0+c29ja2V0LCBTT0xfU09DS0VULCBUQ1BfTk9ERUxBWSwgKGNvbnN0IHZvaWQgKikmb3B0VmFsLCBzaXplb2Yob3B0VmFsKSk7CisJCQorCX0KKworCS8vIFdlIG5vdyBoYXZlIGEgZ29vZCBzb2NrZXQgY29ubmVjdGlvbiB3aXRoIHRoZSBkZWJ1Z2dpbmcgY2xpZW50LCBzbyB3ZQorCS8vIHNlbmQgaXQgdGhlIHByb3RvY29sIHZlcnNpb24gd2UgYXJlIHVzaW5nIGFuZCB3aGF0IHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyCisJLy8gaXMgdGhhdCB3ZSByZXByZXNlbnQuCisJLy8KKwlzcHJpbnRmCQkobWVzc2FnZSwgIkFOVExSICVkXG4iLCBkZWxib3ktPlBST1RPQ09MX1ZFUlNJT04pOworCXNvY2tTZW5kCShkZWxib3ktPnNvY2tldCwgbWVzc2FnZSwgKGludClzdHJsZW4obWVzc2FnZSkpOworCXNwcmludGYJCShtZXNzYWdlLCAiZ3JhbW1hciBcIiVzXG4iLCBkZWxib3ktPmdyYW1tYXJGaWxlTmFtZS0+Y2hhcnMpOworCXNvY2tTZW5kCShkZWxib3ktPnNvY2tldCwgbWVzc2FnZSwgKGludClzdHJsZW4obWVzc2FnZSkpOworCWFjawkJCShkZWxib3kpOworCisJZGVsYm95LT5pbml0aWFsaXplZCA9IEFOVExSM19UUlVFOworCisJcmV0dXJuCUFOVExSM19UUlVFOworfQorCisvLyBTZW5kIHRoZSBzdXBwbGllZCB0ZXh0IGFuZCB3YWl0IGZvciBhbiBhY2sgZnJvbSB0aGUgY2xpZW50CitzdGF0aWMgdm9pZAordHJhbnNtaXQocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGNvbnN0IGNoYXIgKiBwdHIpCit7CisJc29ja1NlbmQoZGVsYm95LT5zb2NrZXQsIHB0ciwgKGludClzdHJsZW4ocHRyKSk7CisJYWNrKGRlbGJveSk7Cit9CisKK3N0YXRpYwl2b2lkCithY2sJCQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpCit7CisJLy8gTG9jYWwgYnVmZmVyIHRvIHJlYWQgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRvCisJLy8KKwljaGFyCWJ1ZmZlcjsKKwlpbnQJCXJDb3VudDsKKworCS8vIEFjayB0ZXJtaW5hdGVzIGluIGEgbGluZSBmZWVkLCBzbyB3ZSBqdXN0IHdhaXQgZm9yCisJLy8gb25lIG9mIHRob3NlLiBTcGVlZCBpcyBub3Qgb2YgdGhlIGVzc2VuY2Ugc28gd2UgZG9uJ3QgbmVlZAorCS8vIHRvIGJ1ZmZlciB0aGUgaW5wdXQgb3IgYW55dGhpbmcuCisJLy8KKwlkbworCXsKKwkJckNvdW50ID0gcmVjdihkZWxib3ktPnNvY2tldCwgJmJ1ZmZlciwgMSwgMCk7CisJfQorCXdoaWxlCShyQ291bnQgPT0gMSAmJiBidWZmZXIgIT0gJ1xuJyk7CisKKwkvLyBJZiB0aGUgc29ja2V0IHdzIGNsb3NlZCBvbiB1cywgdGhlbiB3ZSB3aWxsIGdldCBhbiBlcnJvciBvcgorCS8vICh3aXRoIGEgZ3JhY2VmdWwgY2xvc2UpLCAwLiBXZSBjYW4gYXNzdW1lIHRoZSB0aGUgZGVidWdnZXIgc3RvcHBlZCBmb3Igc29tZSByZWFzb24KKwkvLyAoc3VjaCBhcyBKYXZhIGNyYXNoaW5nIGFnYWluKS4gVGhlcmVmb3JlIHdlIGp1c3QgZXhpdCB0aGUgcHJvZ3JhbQorCS8vIGNvbXBsZXRlbHkgaWYgd2UgZG9uJ3QgZ2V0IHRoZSB0ZXJtaW5hdGluZyAnXG4nIGZvciB0aGUgYWNrLgorCS8vCisJaWYJKHJDb3VudCAhPSAxKQorCXsKKwkJQU5UTFIzX1BSSU5URigiRXhpdGluZyBkZWJ1Z2dlciBhcyByZW1vdGUgY2xpZW50IGNsb3NlZCB0aGUgc29ja2V0XG4iKTsKKwkJQU5UTFIzX1BSSU5URigiUmVjZWl2ZWQgY2hhciBjb3VudCB3YXMgJWQsIGFuZCBsYXN0IGNoYXIgcmVjZWl2ZWQgd2FzICUwMlhcbiIsIHJDb3VudCwgYnVmZmVyKTsKKwkJZXhpdCgwKTsKKwl9Cit9CisKKy8vIEdpdmVuIGEgYnVmZmVyIHN0cmluZyBhbmQgYSBzb3VyY2Ugc3RyaW5nLCBzZXJpYWxpemUgdGhlCisvLyB0ZXh0LCBlc2NhcGluZyBhbnkgbmV3bGluZXMgYW5kIGxpbmVmZWVkcy4gV2UgaGF2ZSBubyBuZWVkCisvLyBmb3Igc3BlZWQgaGVyZSwgdGhpcyBpcyB0aGUgZGVidWdnZXIuCisvLwordm9pZAorc2VyaWFsaXplVGV4dChwQU5UTFIzX1NUUklORyBidWZmZXIsIHBBTlRMUjNfU1RSSU5HIHRleHQpCit7CisJQU5UTFIzX1VJTlQzMgljOworCUFOVExSM19VQ0hBUgljaGFyYWN0ZXI7CisKKwkvLyBzdHJpbmdzIGxlYWQgaW4gd2l0aCBhICIKKwkvLworCWJ1ZmZlci0+YXBwZW5kKGJ1ZmZlciwgIlx0XCIiKTsKKworCWlmCSh0ZXh0ID09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gTm93IHdlIHJlcGxhY2UgbGluZWZlZWRzLCBuZXdsaW5lcyBhbmQgdGhlIGVzY2FwZQorCS8vIGxlYWRpbiBjaGFyYWN0ZXIgJyUnIHdpdGggdGhlaXIgaGV4IGVxdWl2YWxlbnRzCisJLy8gcHJlZml4ZWQgYnkgJyUnCisJLy8KKwlmb3IJKGMgPSAwOyBjIDwgdGV4dC0+bGVuOyBjKyspCisJeworCQlzd2l0Y2gJKGNoYXJhY3RlciA9IHRleHQtPmNoYXJBdCh0ZXh0LCBjKSkKKwkJeworCQkJY2FzZQknXG4nOgorCisJCQkJYnVmZmVyLT5hcHBlbmQoYnVmZmVyLCAiJTBBIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UJJ1xyJzoKKwkJCQorCQkJCWJ1ZmZlci0+YXBwZW5kKGJ1ZmZlciwgIiUwRCIpOworCQkJCWJyZWFrOworCisJCQljYXNlCSdcXCc6CisKKwkJCQlidWZmZXItPmFwcGVuZChidWZmZXIsICIlMjUiKTsKKwkJCQlicmVhazsKKworCQkJCS8vIE90aGVyIGNoYXJhY3RlcnM6IFRoZSBTb25nIFJlbWFpbnMgdGhlIFNhbWUuCisJCQkJLy8KKwkJCWRlZmF1bHQ6CisJCQkJCQorCQkJCWJ1ZmZlci0+YWRkYyhidWZmZXIsIGNoYXJhY3Rlcik7CisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8vIEdpdmVuIGEgdG9rZW4sIGNyZWF0ZSBhIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgaXQsIGluIHRoZSBzdXBwbGllZAorLy8gYnVmZmVyLiBXZSBjcmVhdGUgYSBzdHJpbmcgZm9yIHRoaXMgaW4gdGhlIGRlYnVnICdvYmplY3QnLCBpZiB0aGVyZSAKKy8vIGlzIG5vdCBvbmUgdGhlcmUgYWxyZWFkeSwgYW5kIHRoZW4gcmV1c2UgaXQgaGVyZSBpZiBhc2tlZCB0byBkbyB0aGlzCisvLyBhZ2Fpbi4KKy8vCitwQU5UTFIzX1NUUklORworc2VyaWFsaXplVG9rZW4ocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHQpCit7CisJLy8gRG8gd2UgYWxyZWFkeSBoYXZlIGEgc2VyaWFsaXphdGlvbiBidWZmZXI/CisJLy8KKwlpZgkoZGVsYm95LT50b2tlblN0cmluZyA9PSBOVUxMKQorCXsKKwkJLy8gTm8sIHNvIGNyZWF0ZSBvbmUsIHVzaW5nIHRoZSBzdHJpbmcgZmFjdG9yeSB0aGF0CisJCS8vIHRoZSBncmFtbWFyIG5hbWUgdXNlZCwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBleGlzdC4KKwkJLy8gNjQgYnl0ZXMgd2lsbCBkbyB1cyBoZXJlIGZvciBzdGFydGVycy4gCisJCS8vCisJCWRlbGJveS0+dG9rZW5TdHJpbmcgPSBkZWxib3ktPmdyYW1tYXJGaWxlTmFtZS0+ZmFjdG9yeS0+bmV3U2l6ZShkZWxib3ktPmdyYW1tYXJGaWxlTmFtZS0+ZmFjdG9yeSwgNjQpOworCX0KKworCS8vIEVtcHR5IHN0cmluZworCS8vCisJZGVsYm95LT50b2tlblN0cmluZy0+c2V0KGRlbGJveS0+dG9rZW5TdHJpbmcsIChjb25zdCBjaGFyICopIiIpOworCisJLy8gTm93IHdlIHNlcmlhbGl6ZSB0aGUgZWxlbWVudHMgb2YgdGhlIHRva2VuLk5vdGUgdGhhdCB0aGUgZGVidWdnZXIgb25seQorCS8vIHVzZXMgMzIgYml0cy4KKwkvLworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGkoZGVsYm95LT50b2tlblN0cmluZywgKEFOVExSM19JTlQzMikodC0+Z2V0VG9rZW5JbmRleCh0KSkpOworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGMoZGVsYm95LT50b2tlblN0cmluZywgJ1x0Jyk7CisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCAoQU5UTFIzX0lOVDMyKSh0LT5nZXRUeXBlKHQpKSk7CisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkYyhkZWxib3ktPnRva2VuU3RyaW5nLCAnXHQnKTsKKwlkZWxib3ktPnRva2VuU3RyaW5nLT5hZGRpKGRlbGJveS0+dG9rZW5TdHJpbmcsIChBTlRMUjNfSU5UMzIpKHQtPmdldENoYW5uZWwodCkpKTsKKwlkZWxib3ktPnRva2VuU3RyaW5nLT5hZGRjKGRlbGJveS0+dG9rZW5TdHJpbmcsICdcdCcpOworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGkoZGVsYm95LT50b2tlblN0cmluZywgKEFOVExSM19JTlQzMikodC0+Z2V0TGluZSh0KSkpOworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGMoZGVsYm95LT50b2tlblN0cmluZywgJ1x0Jyk7CisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCAoQU5UTFIzX0lOVDMyKSh0LT5nZXRDaGFyUG9zaXRpb25JbkxpbmUodCkpKTsKKworCS8vIE5vdyBzZW5kIHRoZSB0ZXh0IHRoYXQgdGhlIHRva2VuIHJlcHJlc2VudHMuCisJLy8KKwlzZXJpYWxpemVUZXh0KGRlbGJveS0+dG9rZW5TdHJpbmcsIHQtPmdldFRleHQodCkpOworCisJLy8gRmluYWxseSwgYXMgdGhlIGRlYnVnZ2VyIGlzIGEgSmF2YSBwcm9ncmFtIGl0IHdpbGwgZXhwZWN0IHRvIGdldCBVVEYtOAorCS8vIGVuY29kZWQgc3RyaW5ncy4gV2UgZG9uJ3QgdXNlIFVURi04IGludGVybmFsbHkgdG8gdGhlIEMgcnVudGltZSwgc28gd2UgCisJLy8gbXVzdCBmb3JjZSBlbmNvZGUgaXQuIFdlIGhhdmUgYSBtZXRob2QgdG8gZG8gdGhpcyBpbiB0aGUgc3RyaW5nIGNsYXNzLCBidXQKKwkvLyBpdCByZXR1cm5zIG1hbGxvYyBzcGFjZSB0aGF0IHdlIG11c3QgZnJlZSBhZnRlcndhcmRzLgorCS8vCisJcmV0dXJuIGRlbGJveS0+dG9rZW5TdHJpbmctPnRvVVRGOChkZWxib3ktPnRva2VuU3RyaW5nKTsKK30KKworLy8gR2l2ZW4gYSB0cmVlIG5vZGUsIGNyZWF0ZSBhIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgaXQgaW4gdGhlIHN1cHBsaWVkCisvLyBidWZmZXIuCisvLworcEFOVExSM19TVFJJTkcKK3NlcmlhbGl6ZU5vZGUocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIG5vZGUpCit7CisJcEFOVExSM19DT01NT05fVE9LRU4JdG9rZW47CisKKworCS8vIERvIHdlIGFscmVhZHkgaGF2ZSBhIHNlcmlhbGl6YXRpb24gYnVmZmVyPworCS8vCisJaWYJKGRlbGJveS0+dG9rZW5TdHJpbmcgPT0gTlVMTCkKKwl7CisJCS8vIE5vLCBzbyBjcmVhdGUgb25lLCB1c2luZyB0aGUgc3RyaW5nIGZhY3RvcnkgdGhhdAorCQkvLyB0aGUgZ3JhbW1hciBuYW1lIHVzZWQsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QuCisJCS8vIDY0IGJ5dGVzIHdpbGwgZG8gdXMgaGVyZSBmb3Igc3RhcnRlcnMuIAorCQkvLworCQlkZWxib3ktPnRva2VuU3RyaW5nID0gZGVsYm95LT5ncmFtbWFyRmlsZU5hbWUtPmZhY3RvcnktPm5ld1NpemUoZGVsYm95LT5ncmFtbWFyRmlsZU5hbWUtPmZhY3RvcnksIDY0KTsKKwl9CisKKwkvLyBFbXB0eSBzdHJpbmcKKwkvLworCWRlbGJveS0+dG9rZW5TdHJpbmctPnNldChkZWxib3ktPnRva2VuU3RyaW5nLCAoY29uc3QgY2hhciAqKSIiKTsKKworCS8vIFByb3RlY3QgYWdhaW5zdCBidWdzL2Vycm9ycyBldGMKKwkvLworCWlmCShub2RlID09IE5VTEwpCisJeworCQlyZXR1cm4gZGVsYm95LT50b2tlblN0cmluZzsKKwl9CisKKwkvLyBOb3cgd2Ugc2VyaWFsaXplIHRoZSBlbGVtZW50cyBvZiB0aGUgbm9kZS5Ob3RlIHRoYXQgdGhlIGRlYnVnZ2VyIG9ubHkKKwkvLyB1c2VzIDMyIGJpdHMuCisJLy8KKwlkZWxib3ktPnRva2VuU3RyaW5nLT5hZGRjKGRlbGJveS0+dG9rZW5TdHJpbmcsICdcdCcpOworCisJLy8gQWRhcHRvciBJRAorCS8vCisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCBkZWxib3ktPmFkYXB0b3ItPmdldFVuaXF1ZUlEKGRlbGJveS0+YWRhcHRvciwgbm9kZSkpOworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGMoZGVsYm95LT50b2tlblN0cmluZywgJ1x0Jyk7CisKKwkvLyBUeXBlIG9mIHRoZSBjdXJyZW50IHRva2VuICh3aGljaCBtYXkgYmUgaW1hZ2luYXJ5KQorCS8vCisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCBkZWxib3ktPmFkYXB0b3ItPmdldFR5cGUoZGVsYm95LT5hZGFwdG9yLCBub2RlKSk7CisKKwkvLyBTZWUgaWYgd2UgaGF2ZSBhbiBhY3R1YWwgdG9rZW4gb3IganVzdCBhbiBpbWFnaW5hcnkKKwkvLworCXRva2VuCT0gZGVsYm95LT5hZGFwdG9yLT5nZXRUb2tlbihkZWxib3ktPmFkYXB0b3IsIG5vZGUpOworCisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkYyhkZWxib3ktPnRva2VuU3RyaW5nLCAnXHQnKTsKKwlpZgkodG9rZW4gIT0gTlVMTCkKKwl7CisJCS8vIFJlYWwgdG9rZW4KKwkJLy8KKwkJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCAoQU5UTFIzX0lOVDMyKSh0b2tlbi0+Z2V0TGluZSh0b2tlbikpKTsKKwkJZGVsYm95LT50b2tlblN0cmluZy0+YWRkYyhkZWxib3ktPnRva2VuU3RyaW5nLCAnICcpOworCQlkZWxib3ktPnRva2VuU3RyaW5nLT5hZGRpKGRlbGJveS0+dG9rZW5TdHJpbmcsIChBTlRMUjNfSU5UMzIpKHRva2VuLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUodG9rZW4pKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEltYWdpbmFyeSB0b2tlbnMgaGF2ZSBubyBsb2NhdGlvbgorCQkvLworCQlkZWxib3ktPnRva2VuU3RyaW5nLT5hZGRpKGRlbGJveS0+dG9rZW5TdHJpbmcsIC0xKTsKKwkJZGVsYm95LT50b2tlblN0cmluZy0+YWRkYyhkZWxib3ktPnRva2VuU3RyaW5nLCAnXHQnKTsKKwkJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCAtMSk7CisJfQorCisJLy8gU3RhcnQgSW5kZXggb2YgdGhlIG5vZGUKKwkvLworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGMoZGVsYm95LT50b2tlblN0cmluZywgJ1x0Jyk7CisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCAoQU5UTFIzX1VJTlQzMikoZGVsYm95LT5hZGFwdG9yLT5nZXRUb2tlblN0YXJ0SW5kZXgoZGVsYm95LT5hZGFwdG9yLCBub2RlKSkpOworCisJLy8gTm93IHNlbmQgdGhlIHRleHQgdGhhdCB0aGUgbm9kZSByZXByZXNlbnRzLgorCS8vCisJc2VyaWFsaXplVGV4dChkZWxib3ktPnRva2VuU3RyaW5nLCBkZWxib3ktPmFkYXB0b3ItPmdldFRleHQoZGVsYm95LT5hZGFwdG9yLCBub2RlKSk7CisKKwkvLyBGaW5hbGx5LCBhcyB0aGUgZGVidWdnZXIgaXMgYSBKYXZhIHByb2dyYW0gaXQgd2lsbCBleHBlY3QgdG8gZ2V0IFVURi04CisJLy8gZW5jb2RlZCBzdHJpbmdzLiBXZSBkb24ndCB1c2UgVVRGLTggaW50ZXJuYWxseSB0byB0aGUgQyBydW50aW1lLCBzbyB3ZSAKKwkvLyBtdXN0IGZvcmNlIGVuY29kZSBpdC4gV2UgaGF2ZSBhIG1ldGhvZCB0byBkbyB0aGlzIGluIHRoZSBzdHJpbmcgY2xhc3MsIGJ1dAorCS8vIHRoZXJlIGlzIG5vIHV0Zjggc3RyaW5nIGltcGxlbWVudGF0aW9uIGFzIG9mIHlldAorCS8vCisJcmV0dXJuIGRlbGJveS0+dG9rZW5TdHJpbmctPnRvVVRGOChkZWxib3ktPnRva2VuU3RyaW5nKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVWRU5UUworLy8KK3N0YXRpYwl2b2lkCitlbnRlclJ1bGUJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBjb25zdCBjaGFyICogZ3JhbW1hckZpbGVOYW1lLCBjb25zdCBjaGFyICogcnVsZU5hbWUpCit7CisJY2hhcglidWZmZXJbNTEyXTsKKworCS8vIENyZWF0ZSB0aGUgbWVzc2FnZSAoc3BlZWQgaXMgbm90IG9mIHRoZSBlc3NlbmNlKQorCS8vCisJc3ByaW50ZihidWZmZXIsICJlbnRlclJ1bGVcdCVzXHQlc1xuIiwgZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk7CisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworfQorCitzdGF0aWMJdm9pZAkKK2VudGVyQWx0CQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGFsdCkKK3sKKwljaGFyCWJ1ZmZlcls1MTJdOworCisJLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIChzcGVlZCBpcyBub3Qgb2YgdGhlIGVzc2VuY2UpCisJLy8KKwlzcHJpbnRmKGJ1ZmZlciwgImVudGVyQWx0XHQlZFxuIiwgYWx0KTsKKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYwl2b2lkCQorZXhpdFJ1bGUJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBjb25zdCBjaGFyICogZ3JhbW1hckZpbGVOYW1lLCBjb25zdCBjaGFyICogcnVsZU5hbWUpCit7CisJY2hhcglidWZmZXJbNTEyXTsKKworCS8vIENyZWF0ZSB0aGUgbWVzc2FnZSAoc3BlZWQgaXMgbm90IG9mIHRoZSBlc3NlbmNlKQorCS8vCisJc3ByaW50ZihidWZmZXIsICJleGl0UnVsZVx0JXNcdCVzXG4iLCBncmFtbWFyRmlsZU5hbWUsIHJ1bGVOYW1lKTsKKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYwl2b2lkCQorZW50ZXJTdWJSdWxlCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgZGVjaXNpb25OdW1iZXIpCit7CisJY2hhcglidWZmZXJbNTEyXTsKKworCS8vIENyZWF0ZSB0aGUgbWVzc2FnZSAoc3BlZWQgaXMgbm90IG9mIHRoZSBlc3NlbmNlKQorCS8vCisJc3ByaW50ZihidWZmZXIsICJlbnRlclN1YlJ1bGVcdCVkXG4iLCBkZWNpc2lvbk51bWJlcik7CisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworfQorCitzdGF0aWMJdm9pZAkKK2V4aXRTdWJSdWxlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGRlY2lzaW9uTnVtYmVyKQoreworCWNoYXIJYnVmZmVyWzUxMl07CisKKwkvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgKHNwZWVkIGlzIG5vdCBvZiB0aGUgZXNzZW5jZSkKKwkvLworCXNwcmludGYoYnVmZmVyLCAiZXhpdFN1YlJ1bGVcdCVkXG4iLCBkZWNpc2lvbk51bWJlcik7CisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworfQorCitzdGF0aWMJdm9pZAkKK2VudGVyRGVjaXNpb24JCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBkZWNpc2lvbk51bWJlcikKK3sKKwljaGFyCWJ1ZmZlcls1MTJdOworCisJLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIChzcGVlZCBpcyBub3Qgb2YgdGhlIGVzc2VuY2UpCisJLy8KKwlzcHJpbnRmKGJ1ZmZlciwgImVudGVyRGVjaXNpb25cdCVkXG4iLCBkZWNpc2lvbk51bWJlcik7CisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworCit9CisKK3N0YXRpYwl2b2lkCQorZXhpdERlY2lzaW9uCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgZGVjaXNpb25OdW1iZXIpCit7CisJY2hhcglidWZmZXJbNTEyXTsKKworCS8vIENyZWF0ZSB0aGUgbWVzc2FnZSAoc3BlZWQgaXMgbm90IG9mIHRoZSBlc3NlbmNlKQorCS8vCisJc3ByaW50ZihidWZmZXIsICJleGl0RGVjaXNpb25cdCVkXG4iLCBkZWNpc2lvbk51bWJlcik7CisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworfQorCitzdGF0aWMJdm9pZAkKK2NvbnN1bWVUb2tlbgkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19DT01NT05fVE9LRU4gdCkKK3sKKwlwQU5UTFIzX1NUUklORyBtc2c7CisKKwkvLyBDcmVhdGUgdGhlIHNlcmlhbGl6ZWQgdG9rZW4KKwkvLworCW1zZyA9IHNlcmlhbGl6ZVRva2VuKGRlbGJveSwgdCk7CisKKwkvLyBJbnNlcnQgdGhlIGRlYnVnIGV2ZW50IGluZGljYXRvcgorCS8vCisJbXNnLT5pbnNlcnQ4KG1zZywgMCwgImNvbnN1bWVUb2tlblx0Iik7CisKKwltc2ctPmFkZGMobXNnLCAnXG4nKTsKKworCS8vIFRyYW5zbWl0IHRoZSBtZXNzYWdlIGFuZCB3YWl0IGZvciBhY2sKKwkvLworCXRyYW5zbWl0KGRlbGJveSwgKGNvbnN0IGNoYXIgKikobXNnLT5jaGFycykpOworfQorCitzdGF0aWMJdm9pZAkKK2NvbnN1bWVIaWRkZW5Ub2tlbgkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBwQU5UTFIzX0NPTU1PTl9UT0tFTiB0KQoreworCXBBTlRMUjNfU1RSSU5HIG1zZzsKKworCS8vIENyZWF0ZSB0aGUgc2VyaWFsaXplZCB0b2tlbgorCS8vCisJbXNnID0gc2VyaWFsaXplVG9rZW4oZGVsYm95LCB0KTsKKworCS8vIEluc2VydCB0aGUgZGVidWcgZXZlbnQgaW5kaWNhdG9yCisJLy8KKwltc2ctPmluc2VydDgobXNnLCAwLCAiY29uc3VtZUhpZGRlblRva2VuXHQiKTsKKworCW1zZy0+YWRkYyhtc2csICdcbicpOworCisJLy8gVHJhbnNtaXQgdGhlIG1lc3NhZ2UgYW5kIHdhaXQgZm9yIGFjaworCS8vCisJdHJhbnNtaXQoZGVsYm95LCAoY29uc3QgY2hhciAqKShtc2ctPmNoYXJzKSk7Cit9CisKKy8vIExvb2tpbmcgYXQgdGhlIG5leHQgdG9rZW4gZXZlbnQuCisvLworc3RhdGljCXZvaWQJCitMVAkJCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgaW50IGksIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHQpCit7CisJcEFOVExSM19TVFJJTkcgbXNnOworCisJaWYJKHQgIT0gTlVMTCkKKwl7CisJCS8vIENyZWF0ZSB0aGUgc2VyaWFsaXplZCB0b2tlbgorCQkvLworCQltc2cgPSBzZXJpYWxpemVUb2tlbihkZWxib3ksIHQpOworCisJCS8vIEluc2VydCB0aGUgaW5kZXggcGFyYW1ldGVyCisJCS8vCisJCW1zZy0+aW5zZXJ0OChtc2csIDAsICJcdCIpOworCQltc2ctPmluc2VydGkobXNnLCAwLCBpKTsKKworCQkvLyBJbnNlcnQgdGhlIGRlYnVnIGV2ZW50IGluZGljYXRvcgorCQkvLworCQltc2ctPmluc2VydDgobXNnLCAwLCAiTFRcdCIpOworCisJCW1zZy0+YWRkYyhtc2csICdcbicpOworCisJCS8vIFRyYW5zbWl0IHRoZSBtZXNzYWdlIGFuZCB3YWl0IGZvciBhY2sKKwkJLy8KKwkJdHJhbnNtaXQoZGVsYm95LCAoY29uc3QgY2hhciAqKShtc2ctPmNoYXJzKSk7CisJfQorfQorCitzdGF0aWMJdm9pZAkKK21hcmsJCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgQU5UTFIzX01BUktFUiBtYXJrZXIpCit7CisJY2hhciBidWZmZXJbMTI4XTsKKworCXNwcmludGYoYnVmZmVyLCAibWFya1x0JWRcbiIsIChBTlRMUjNfVUlOVDMyKShtYXJrZXIgJiAweEZGRkZGRkZGKSk7CisKKwkvLyBUcmFuc21pdCB0aGUgbWVzc2FnZSBhbmQgd2FpdCBmb3IgYWNrCisJLy8KKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYwl2b2lkCQorcmV3aW5kTWFyawkJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBBTlRMUjNfTUFSS0VSIG1hcmtlcikKK3sKKwljaGFyIGJ1ZmZlclsxMjhdOworCisJc3ByaW50ZihidWZmZXIsICJyZXdpbmRcdCVkXG4iLCAoQU5UTFIzX1VJTlQzMikobWFya2VyICYgMHhGRkZGRkZGRikpOworCisJLy8gVHJhbnNtaXQgdGhlIG1lc3NhZ2UgYW5kIHdhaXQgZm9yIGFjaworCS8vCisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworCit9CisKK3N0YXRpYwl2b2lkCQorcmV3aW5kTGFzdAkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpCit7CisJdHJhbnNtaXQoZGVsYm95LCAoY29uc3QgY2hhciAqKSJyZXdpbmRcbiIpOworfQorCitzdGF0aWMJdm9pZAkKK2JlZ2luQmFja3RyYWNrCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgbGV2ZWwpCit7CisJY2hhciBidWZmZXJbMTI4XTsKKworCXNwcmludGYoYnVmZmVyLCAiYmVnaW5CYWNrdHJhY2tcdCVkXG4iLCAoQU5UTFIzX1VJTlQzMikobGV2ZWwgJiAweEZGRkZGRkZGKSk7CisKKwkvLyBUcmFuc21pdCB0aGUgbWVzc2FnZSBhbmQgd2FpdCBmb3IgYWNrCisJLy8KKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYwl2b2lkCQorZW5kQmFja3RyYWNrCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBpbnQgbGV2ZWwsIEFOVExSM19CT09MRUFOIHN1Y2Nlc3NmdWwpCit7CisJY2hhciBidWZmZXJbMTI4XTsKKworCXNwcmludGYoYnVmZmVyLCAiZW5kQmFja3RyYWNrXHQlZFx0JWRcbiIsIGxldmVsLCBzdWNjZXNzZnVsKTsKKworCS8vIFRyYW5zbWl0IHRoZSBtZXNzYWdlIGFuZCB3YWl0IGZvciBhY2sKKwkvLworCXRyYW5zbWl0KGRlbGJveSwgYnVmZmVyKTsKK30KKworc3RhdGljCXZvaWQJCitsb2NhdGlvbgkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBsaW5lLCBpbnQgcG9zKQoreworCWNoYXIgYnVmZmVyWzEyOF07CisKKwlzcHJpbnRmKGJ1ZmZlciwgImxvY2F0aW9uXHQlZFx0JWRcbiIsIGxpbmUsIHBvcyk7CisKKwkvLyBUcmFuc21pdCB0aGUgbWVzc2FnZSBhbmQgd2FpdCBmb3IgYWNrCisJLy8KKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYwl2b2lkCQorcmVjb2duaXRpb25FeGNlcHRpb24JKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBwQU5UTFIzX0VYQ0VQVElPTiBlKQoreworCWNoYXIJYnVmZmVyWzI1Nl07CisKKwlzcHJpbnRmKGJ1ZmZlciwgImV4Y2VwdGlvblx0JXNcdCVkXHQlZFx0JWRcbiIsIChjaGFyICopKGUtPm5hbWUpLCAoQU5UTFIzX0lOVDMyKShlLT5pbmRleCksIGUtPmxpbmUsIGUtPmNoYXJQb3NpdGlvbkluTGluZSk7CisKKwkvLyBUcmFuc21pdCB0aGUgbWVzc2FnZSBhbmQgd2FpdCBmb3IgYWNrCisJLy8KKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKK3N0YXRpYwl2b2lkCQorYmVnaW5SZXN5bmMJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95KQoreworCXRyYW5zbWl0KGRlbGJveSwgKGNvbnN0IGNoYXIgKikiYmVnaW5SZXN5bmNcbiIpOworfQorCitzdGF0aWMJdm9pZAkKK2VuZFJlc3luYwkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpCit7CisJdHJhbnNtaXQoZGVsYm95LCAoY29uc3QgY2hhciAqKSJlbmRSZXN5bmNcbiIpOworfQorCitzdGF0aWMJdm9pZAkKK3NlbWFudGljUHJlZGljYXRlCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIEFOVExSM19CT09MRUFOIHJlc3VsdCwgY29uc3QgY2hhciAqIHByZWRpY2F0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICogYnVmZmVyOworCXVuc2lnbmVkIGNoYXIgKiBvdXQ7CisKKwlpZgkocHJlZGljYXRlICE9IE5VTEwpCisJeworCQlidWZmZXIJPSAodW5zaWduZWQgY2hhciAqKUFOVExSM19NQUxMT0MoNjQgKyAyKnN0cmxlbihwcmVkaWNhdGUpKTsKKworCQlpZgkoYnVmZmVyICE9IE5VTEwpCisJCXsKKwkJCW91dCA9IGJ1ZmZlciArIHNwcmludGYoKGNoYXIgKilidWZmZXIsICJzZW1hbnRpY1ByZWRpY2F0ZVx0JXNcdCIsIHJlc3VsdCA9PSBBTlRMUjNfVFJVRSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisJCQl3aGlsZSAoKnByZWRpY2F0ZSAhPSAnXDAnKQorCQkJeworCQkJCXN3aXRjaCgqcHJlZGljYXRlKQorCQkJCXsKKwkJCQkJY2FzZQknXG4nOgorCQkJCQkJCisJCQkJCQkqb3V0KysJPSAnJSc7CisJCQkJCQkqb3V0KysJPSAnMCc7CisJCQkJCQkqb3V0KysJPSAnQSc7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlCSdccic6CisKKwkJCQkJCSpvdXQrKwk9ICclJzsKKwkJCQkJCSpvdXQrKwk9ICcwJzsKKwkJCQkJCSpvdXQrKwk9ICdEJzsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UJJyUnOgorCisJCQkJCQkqb3V0KysJPSAnJSc7CisJCQkJCQkqb3V0KysJPSAnMCc7CisJCQkJCQkqb3V0KysJPSAnRCc7CisJCQkJCQlicmVhazsKKworCisJCQkJCWRlZmF1bHQ6CisKKwkJCQkJCSpvdXQrKwk9ICpwcmVkaWNhdGU7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwcmVkaWNhdGUrKzsKKwkJCX0KKwkJCSpvdXQrKwk9ICdcbic7CisJCQkqb3V0KysJPSAnXDAnOworCQl9CisKKwkJLy8gU2VuZCBpdCBhbmQgd2FpdCBmb3IgdGhlIGFjaworCQkvLworCQl0cmFuc21pdChkZWxib3ksIChjb25zdCBjaGFyICopYnVmZmVyKTsKKwl9Cit9CisKKyNpZmRlZiBBTlRMUjNfV0lORE9XUworI3ByYWdtYSB3YXJuaW5nCShwdXNoKQorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDEwMCkKKyNlbmRpZgorCitzdGF0aWMJdm9pZAkKK2NvbW1lbmNlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSkKK3sKKwkvLyBOb3RoaW5nIHRvIHNlZSBoZXJlCisJLy8KK30KKworI2lmZGVmIEFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcJKHBvcCkKKyNlbmRpZgorCitzdGF0aWMJdm9pZAkKK3Rlcm1pbmF0ZQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3kpCit7CisJLy8gVGVybWluYXRlIHNlcXVlbmNlCisJLy8KKwlzb2NrU2VuZChkZWxib3ktPnNvY2tldCwgInRlcm1pbmF0ZVxuIiwgMTApOwkJLy8gU2VuZCBvdXQgdGhlIGNvbW1hbmQKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmVlIHBhcnNpbmcgZXZlbnRzCisvLworc3RhdGljCXZvaWQJCitjb25zdW1lTm9kZQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisJcEFOVExSM19TVFJJTkcJYnVmZmVyOworCisJYnVmZmVyID0gc2VyaWFsaXplTm9kZQkoZGVsYm95LCB0KTsKKworCS8vIE5vdyBwcmVwZW5kIHRoZSBjb21tYW5kCisJLy8KKwlidWZmZXItPmluc2VydDgJKGJ1ZmZlciwgMCwgImNvbnN1bWVOb2RlXHQiKTsKKwlidWZmZXItPmFkZGMJKGJ1ZmZlciwgJ1xuJyk7CisKKwkvLyBTZW5kIHRvIHRoZSBkZWJ1Z2dlciBhbmQgd2FpdCBmb3IgdGhlIGFjaworCS8vCisJdHJhbnNtaXQJCShkZWxib3ksIChjb25zdCBjaGFyICopKGRlbGJveS0+dG9rZW5TdHJpbmctPnRvVVRGOChkZWxib3ktPnRva2VuU3RyaW5nKS0+Y2hhcnMpKTsKK30KKworc3RhdGljCXZvaWQJCitMVFQJCQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIGludCBpLCBwQU5UTFIzX0JBU0VfVFJFRSB0KQoreworCXBBTlRMUjNfU1RSSU5HCWJ1ZmZlcjsKKworCWJ1ZmZlciA9IHNlcmlhbGl6ZU5vZGUJKGRlbGJveSwgdCk7CisKKwkvLyBOb3cgcHJlcGVuZCB0aGUgY29tbWFuZAorCS8vCisJYnVmZmVyLT5pbnNlcnQ4CShidWZmZXIsIDAsICJcdCIpOworCWJ1ZmZlci0+aW5zZXJ0aQkoYnVmZmVyLCAwLCBpKTsKKwlidWZmZXItPmluc2VydDgJKGJ1ZmZlciwgMCwgIkxOXHQiKTsKKwlidWZmZXItPmFkZGMJKGJ1ZmZlciwgJ1xuJyk7CisKKwkvLyBTZW5kIHRvIHRoZSBkZWJ1Z2dlciBhbmQgd2FpdCBmb3IgdGhlIGFjaworCS8vCisJdHJhbnNtaXQJCShkZWxib3ksIChjb25zdCBjaGFyICopKGRlbGJveS0+dG9rZW5TdHJpbmctPnRvVVRGOChkZWxib3ktPnRva2VuU3RyaW5nKS0+Y2hhcnMpKTsKK30KKworc3RhdGljCXZvaWQJCituaWxOb2RlCQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisJY2hhcglidWZmZXJbMTI4XTsKKwlzcHJpbnRmKGJ1ZmZlciwgIm5pbE5vZGVcdCVkXG4iLCBkZWxib3ktPmFkYXB0b3ItPmdldFVuaXF1ZUlEKGRlbGJveS0+YWRhcHRvciwgdCkpOworCXRyYW5zbWl0KGRlbGJveSwgYnVmZmVyKTsKK30KKworc3RhdGljCXZvaWQJCitjcmVhdGVOb2RlCQkJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCkKK3sKKwkvLyBEbyB3ZSBhbHJlYWR5IGhhdmUgYSBzZXJpYWxpemF0aW9uIGJ1ZmZlcj8KKwkvLworCWlmCShkZWxib3ktPnRva2VuU3RyaW5nID09IE5VTEwpCisJeworCQkvLyBObywgc28gY3JlYXRlIG9uZSwgdXNpbmcgdGhlIHN0cmluZyBmYWN0b3J5IHRoYXQKKwkJLy8gdGhlIGdyYW1tYXIgbmFtZSB1c2VkLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGV4aXN0LgorCQkvLyA2NCBieXRlcyB3aWxsIGRvIHVzIGhlcmUgZm9yIHN0YXJ0ZXJzLiAKKwkJLy8KKwkJZGVsYm95LT50b2tlblN0cmluZyA9IGRlbGJveS0+Z3JhbW1hckZpbGVOYW1lLT5mYWN0b3J5LT5uZXdTaXplKGRlbGJveS0+Z3JhbW1hckZpbGVOYW1lLT5mYWN0b3J5LCA2NCk7CisJfQorCisJLy8gRW1wdHkgc3RyaW5nCisJLy8KKwlkZWxib3ktPnRva2VuU3RyaW5nLT5zZXQ4KGRlbGJveS0+dG9rZW5TdHJpbmcsIChjb25zdCBjaGFyICopImNyZWF0ZU5vZGVGcm9tVG9rZW5FbGVtZW50cyAiKTsKKworCS8vIE5vdyB3ZSBzZXJpYWxpemUgdGhlIGVsZW1lbnRzIG9mIHRoZSBub2RlLk5vdGUgdGhhdCB0aGUgZGVidWdnZXIgb25seQorCS8vIHVzZXMgMzIgYml0cy4KKwkvLworCS8vIEFkYXB0b3IgSUQKKwkvLworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGkoZGVsYm95LT50b2tlblN0cmluZywgZGVsYm95LT5hZGFwdG9yLT5nZXRVbmlxdWVJRChkZWxib3ktPmFkYXB0b3IsIHQpKTsKKwlkZWxib3ktPnRva2VuU3RyaW5nLT5hZGRjKGRlbGJveS0+dG9rZW5TdHJpbmcsICdcdCcpOworCisJLy8gVHlwZSBvZiB0aGUgY3VycmVudCB0b2tlbiAod2hpY2ggbWF5IGJlIGltYWdpbmFyeSkKKwkvLworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGkoZGVsYm95LT50b2tlblN0cmluZywgZGVsYm95LT5hZGFwdG9yLT5nZXRUeXBlKGRlbGJveS0+YWRhcHRvciwgdCkpOworCisJLy8gVGhlIHRleHQgdGhhdCB0aGlzIG5vZGUgcmVwcmVzZW50cworCS8vCisJc2VyaWFsaXplVGV4dChkZWxib3ktPnRva2VuU3RyaW5nLCBkZWxib3ktPmFkYXB0b3ItPmdldFRleHQoZGVsYm95LT5hZGFwdG9yLCB0KSk7CisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkYyhkZWxib3ktPnRva2VuU3RyaW5nLCAnXG4nKTsKKworCS8vIEZpbmFsbHksIGFzIHRoZSBkZWJ1Z2dlciBpcyBhIEphdmEgcHJvZ3JhbSBpdCB3aWxsIGV4cGVjdCB0byBnZXQgVVRGLTgKKwkvLyBlbmNvZGVkIHN0cmluZ3MuIFdlIGRvbid0IHVzZSBVVEYtOCBpbnRlcm5hbGx5IHRvIHRoZSBDIHJ1bnRpbWUsIHNvIHdlIAorCS8vIG11c3QgZm9yY2UgZW5jb2RlIGl0LiBXZSBoYXZlIGEgbWV0aG9kIHRvIGRvIHRoaXMgaW4gdGhlIHN0cmluZyBjbGFzcywgYnV0CisJLy8gdGhlcmUgaXMgbm8gdXRmOCBzdHJpbmcgaW1wbGVtZW50YXRpb24gYXMgb2YgeWV0CisJLy8KKwl0cmFuc21pdChkZWxib3ksIChjb25zdCBjaGFyICopKGRlbGJveS0+dG9rZW5TdHJpbmctPnRvVVRGOChkZWxib3ktPnRva2VuU3RyaW5nKS0+Y2hhcnMpKTsKKworfQorc3RhdGljIHZvaWQKK2Vycm9yTm9kZQkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIHQpCit7CisJLy8gRG8gd2UgYWxyZWFkeSBoYXZlIGEgc2VyaWFsaXphdGlvbiBidWZmZXI/CisJLy8KKwlpZgkoZGVsYm95LT50b2tlblN0cmluZyA9PSBOVUxMKQorCXsKKwkJLy8gTm8sIHNvIGNyZWF0ZSBvbmUsIHVzaW5nIHRoZSBzdHJpbmcgZmFjdG9yeSB0aGF0CisJCS8vIHRoZSBncmFtbWFyIG5hbWUgdXNlZCwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBleGlzdC4KKwkJLy8gNjQgYnl0ZXMgd2lsbCBkbyB1cyBoZXJlIGZvciBzdGFydGVycy4gCisJCS8vCisJCWRlbGJveS0+dG9rZW5TdHJpbmcgPSBkZWxib3ktPmdyYW1tYXJGaWxlTmFtZS0+ZmFjdG9yeS0+bmV3U2l6ZShkZWxib3ktPmdyYW1tYXJGaWxlTmFtZS0+ZmFjdG9yeSwgNjQpOworCX0KKworCS8vIEVtcHR5IHN0cmluZworCS8vCisJZGVsYm95LT50b2tlblN0cmluZy0+c2V0OChkZWxib3ktPnRva2VuU3RyaW5nLCAoY29uc3QgY2hhciAqKSJlcnJvck5vZGVcdCIpOworCisJLy8gTm93IHdlIHNlcmlhbGl6ZSB0aGUgZWxlbWVudHMgb2YgdGhlIG5vZGUuTm90ZSB0aGF0IHRoZSBkZWJ1Z2dlciBvbmx5CisJLy8gdXNlcyAzMiBiaXRzLgorCS8vCisJLy8gQWRhcHRvciBJRAorCS8vCisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkaShkZWxib3ktPnRva2VuU3RyaW5nLCBkZWxib3ktPmFkYXB0b3ItPmdldFVuaXF1ZUlEKGRlbGJveS0+YWRhcHRvciwgdCkpOworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGMoZGVsYm95LT50b2tlblN0cmluZywgJ1x0Jyk7CisKKwkvLyBUeXBlIG9mIHRoZSBjdXJyZW50IHRva2VuICh3aGljaCBpcyBhbiBlcnJvcikKKwkvLworCWRlbGJveS0+dG9rZW5TdHJpbmctPmFkZGkoZGVsYm95LT50b2tlblN0cmluZywgQU5UTFIzX1RPS0VOX0lOVkFMSUQpOworCisJLy8gVGhlIHRleHQgdGhhdCB0aGlzIG5vZGUgcmVwcmVzZW50cworCS8vCisJc2VyaWFsaXplVGV4dChkZWxib3ktPnRva2VuU3RyaW5nLCBkZWxib3ktPmFkYXB0b3ItPmdldFRleHQoZGVsYm95LT5hZGFwdG9yLCB0KSk7CisJZGVsYm95LT50b2tlblN0cmluZy0+YWRkYyhkZWxib3ktPnRva2VuU3RyaW5nLCAnXG4nKTsKKworCS8vIEZpbmFsbHksIGFzIHRoZSBkZWJ1Z2dlciBpcyBhIEphdmEgcHJvZ3JhbSBpdCB3aWxsIGV4cGVjdCB0byBnZXQgVVRGLTgKKwkvLyBlbmNvZGVkIHN0cmluZ3MuIFdlIGRvbid0IHVzZSBVVEYtOCBpbnRlcm5hbGx5IHRvIHRoZSBDIHJ1bnRpbWUsIHNvIHdlIAorCS8vIG11c3QgZm9yY2UgZW5jb2RlIGl0LiBXZSBoYXZlIGEgbWV0aG9kIHRvIGRvIHRoaXMgaW4gdGhlIHN0cmluZyBjbGFzcywgYnV0CisJLy8gdGhlcmUgaXMgbm8gdXRmOCBzdHJpbmcgaW1wbGVtZW50YXRpb24gYXMgb2YgeWV0CisJLy8KKwl0cmFuc21pdChkZWxib3ksIChjb25zdCBjaGFyICopKGRlbGJveS0+dG9rZW5TdHJpbmctPnRvVVRGOChkZWxib3ktPnRva2VuU3RyaW5nKS0+Y2hhcnMpKTsKKworfQorCitzdGF0aWMJdm9pZAkKK2NyZWF0ZU5vZGVUb2sJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIG5vZGUsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKQoreworCWNoYXIJYnVmZmVyWzEyOF07CisKKwlzcHJpbnRmKGJ1ZmZlciwgImNyZWF0ZU5vZGVcdCVkXHQlZFxuIiwJZGVsYm95LT5hZGFwdG9yLT5nZXRVbmlxdWVJRChkZWxib3ktPmFkYXB0b3IsIG5vZGUpLCAoQU5UTFIzX1VJTlQzMil0b2tlbi0+Z2V0VG9rZW5JbmRleCh0b2tlbikpOworCisJdHJhbnNtaXQoZGVsYm95LCBidWZmZXIpOworfQorCitzdGF0aWMJdm9pZAkKK2JlY29tZVJvb3QJCQkJKHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVsYm95LCBwQU5UTFIzX0JBU0VfVFJFRSBuZXdSb290LCBwQU5UTFIzX0JBU0VfVFJFRSBvbGRSb290KQoreworCWNoYXIJYnVmZmVyWzEyOF07CisKKwlzcHJpbnRmKGJ1ZmZlciwgImJlY29tZVJvb3RcdCVkXHQlZFxuIiwJZGVsYm95LT5hZGFwdG9yLT5nZXRVbmlxdWVJRChkZWxib3ktPmFkYXB0b3IsIG5ld1Jvb3QpLAorCQkJCQkJCQkJCQlkZWxib3ktPmFkYXB0b3ItPmdldFVuaXF1ZUlEKGRlbGJveS0+YWRhcHRvciwgb2xkUm9vdCkKKwkJCQkJCQkJCQkJKTsKKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisKKworc3RhdGljCXZvaWQJCithZGRDaGlsZAkJCQkocEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWxib3ksIHBBTlRMUjNfQkFTRV9UUkVFIHJvb3QsIHBBTlRMUjNfQkFTRV9UUkVFIGNoaWxkKQoreworCWNoYXIJYnVmZmVyWzEyOF07CisKKwlzcHJpbnRmKGJ1ZmZlciwgImFkZENoaWxkXHQlZFx0JWRcbiIsCWRlbGJveS0+YWRhcHRvci0+Z2V0VW5pcXVlSUQoZGVsYm95LT5hZGFwdG9yLCByb290KSwKKwkJCQkJCQkJCQkJZGVsYm95LT5hZGFwdG9yLT5nZXRVbmlxdWVJRChkZWxib3ktPmFkYXB0b3IsIGNoaWxkKQorCQkJCQkJCQkJCQkpOworCXRyYW5zbWl0KGRlbGJveSwgYnVmZmVyKTsKK30KKworc3RhdGljCXZvaWQJCitzZXRUb2tlbkJvdW5kYXJpZXMJCShwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRlbGJveSwgcEFOVExSM19CQVNFX1RSRUUgdCwgQU5UTFIzX01BUktFUiB0b2tlblN0YXJ0SW5kZXgsIEFOVExSM19NQVJLRVIgdG9rZW5TdG9wSW5kZXgpCit7CisJY2hhcglidWZmZXJbMTI4XTsKKworCXNwcmludGYoYnVmZmVyLCAiYmVjb21lUm9vdFx0JWRcdCVkXHQlZFxuIiwJZGVsYm95LT5hZGFwdG9yLT5nZXRVbmlxdWVJRChkZWxib3ktPmFkYXB0b3IsIHQpLAorCQkJCQkJCQkJCQkJKEFOVExSM19VSU5UMzIpdG9rZW5TdGFydEluZGV4LAorCQkJCQkJCQkJCQkJKEFOVExSM19VSU5UMzIpdG9rZW5TdG9wSW5kZXgKKwkJCQkJCQkJCQkJKTsKKwl0cmFuc21pdChkZWxib3ksIGJ1ZmZlcik7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZW5jb2RpbmdzLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNlbmNvZGluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZW5jb2RpbmdzLmMKQEAgLTAsMCArMSw1MCBAQAorLyoqIFxGaWxlIAorICogUHJvdmlkZXMgYmFzaWMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuCisgKiB0aGUgdmFyaW91cyBVbmljb2RlIGNoYXJhY3RlciBjb252ZXJzaW9ucy4gVGhlcmUgYXJlIG9mCisgKiBjb3Vyc2UgdmFyaW91cyBwYWNrYWdlcyB0aGF0IGNvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGVzZQorICogZnVuY3Rpb25zLCBidXQgdGhlbiB0aGUgQW50bHIgMyBDIHJ1bnRpbWUgd291bGQgYmUgZGVwZW5kYW50CisgKiBvbiB0aGUgcGFydGljdWxhciBwYWNrYWdlLiBVc2luZyBJQ1UgZm9yIHRoaXMgaXMgYSBnb29kIGlkZWEgaWYKKyAqIHlvdXIgcHJvamVjdCBpcyBhbHJlYWR5IGRlcGVuZGFudCBvbiBpdC4KKyAqLworCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjMuaD4KKworLy8vIENvbnZlcnQgOCBiaXQgY2hhcmFjdGVyIHRvIEFOVExSIGNoYXIgZm9ybS4KKy8vLworLy8vIFxwYXJhbVtpbl0gaW5jIElucHV0IGNoYXJhY3RlciB0byB0cmFuc2Zvcm0gZnJvbSA4IGJpdCBmb3JtLgorLy8vIFxyZXR1cm4gQU5UTFIzX1VDSEFSIGVuY29kaW5nIG9mIHRoZSBjaGFyYWN0ZXIuCisvLy8KK0FOVExSM19BUEkgCitBTlRMUjNfVUNIQVIgYW50bHIzYzh0b0FudGxyYyhBTlRMUjNfSU5UOCBpbmMpCit7CisgICAgcmV0dXJuICAoQU5UTFIzX1VDSEFSKShpbmMpOworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZXhjZXB0aW9uLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNleGNlcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk3MjFjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZXhjZXB0aW9uLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qKiBcZmlsZQorICogQ29udGFpbnMgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGFzIHdlbGwgYXMKKyAqIG90aGVyd2lzZSBoYW5kbGluZyBBTlRMUjMgc3RhbmRhcmQgZXhjZXB0aW9uIHN0cnVjdHVyZXMuCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzZXhjZXB0aW9uLmg+CisKK3N0YXRpYyAgICB2b2lkCWFudGxyM0V4Y2VwdGlvblByaW50KHBBTlRMUjNfRVhDRVBUSU9OIGV4KTsKK3N0YXRpYyAgICB2b2lkCWFudGxyM0V4Y2VwdGlvbkZyZWUgKHBBTlRMUjNfRVhDRVBUSU9OIGV4KTsKKworLyoqCisgKiBcYnJpZWYKKyAqIENyZWF0ZXMgYSBuZXcgQU5UTFIzIGV4Y2VwdGlvbiBzdHJ1Y3R1cmUKKyAqIAorICogXHBhcmFtW2luXSBleGNlcHRpb24KKyAqIE9uZSBvZiB0aGUgQU5UTFIzX3h4eF9FWENFUFRJT04gaW5kaWNhdG9ycyBzdWNoIGFzICNBTlRMUjNfUkVDT0dOSVRJT05fRVhDRVBUSU9OCisgKiAKKyAqIFxwYXJhbVtpbl0gbWVzc2FnZQorICogUG9pbnRlciB0byBtZXNzYWdlIHN0cmluZyAKKyAqIAorICogXHBhcmFtW2luXSBmcmVlTWVzc2FnZQorICogU2V0IHRvIEFOVExSM19UUlVFIGlmIHRoZSBtZXNzYWdlIHBhcmFtZXRlciBzaG91bGQgYmUgZnJlZWQgYnkgYSBjYWxsIHRvIAorICogQU5UTFIzX0ZSRUUoKSB3aGVuIHRoZSBleGNlcHRpb24gaXMgZGVzdHJveWVkLgorICogCisgKiBccmV0dXJucworICogUG9pbnRlciB0byBuZXdseSBpbml0aWFsaXplZCBleGNlcHRpb24gc3RydWN0dXJlLCBvciBhbiBBTlRMUjNfRVJSX3h4IGRlZmluZWQgdmFsdWUKKyAqIHVwb24gZmFpbHVyZS4KKyAqIAorICogQW4gZXhjZXB0aW9uIGlzICd0aHJvd24nIGJ5IGEgcmVjb2duaXplciAgd2hlbiBpbnB1dCBpcyBzZWVuIHRoYXQgaXMgbm90IHByZWRpY3RlZCBieQorICogdGhlIGdyYW1tYXIgcHJvZHVjdGlvbnMgb3Igd2hlbiBzb21lIG90aGVyIGVycm9yIGNvbmRpdGlvbiBvY2N1cnMuIEluIEMgd2UgZG8gbm90IGhhdmUKKyAqIHRoZSBsdXh1cnkgb2YgdHJ5IGFuZCBjYXRjaCBibG9ja3MsIHNvIGV4Y2VwdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBvcmRlciB0aGV5IG9jY3VyIHRvIAorICogYSBsaXN0IGluIHRoZSBiYXNlcmVjb2duaXplciBzdHJ1Y3R1cmUuIFRoZSBsYXN0IG9uZSB0byBiZSB0aHJvd24gaXMgaW5zZXJ0ZWQgYXQgdGhlIGhlYWQgb2YKKyAqIHRoZSBsaXN0IGFuZCB0aGUgb25lIGN1cnJlbnRseSBpbnN0YWxsZWQgaXMgcG9pbnRlZCB0byBieSB0aGUgbmV3bHkgaW5zdGFsbGVkIGV4Y2VwdGlvbi4KKyAqIAorICogXHJlbWFya3MKKyAqIEFmdGVyIGFuIGV4Y2VwdGlvbiBpcyBjcmVhdGVkLCB5b3UgbWF5IGFkZCBhIHBvaW50ZXIgdG8geW91ciBvd24gc3RydWN0dXJlIGFuZCBhIHBvaW50ZXIKKyAqIHRvIGEgZnVuY3Rpb24gdG8gZnJlZSB0aGlzIHN0cnVjdHVyZSB3aGVuIHRoZSBleGNlcHRpb24gaXMgZGVzdHJveWVkLgorICogCisgKiBcc2VlCisgKiBBTlRMUjNfRVhDRVBUSU9OCisgKi8KK3BBTlRMUjNfRVhDRVBUSU9OCithbnRscjNFeGNlcHRpb25OZXcoQU5UTFIzX1VJTlQzMiBleGNlcHRpb24sIHZvaWQgKiBuYW1lLCB2b2lkICogbWVzc2FnZSwgQU5UTFIzX0JPT0xFQU4gZnJlZU1lc3NhZ2UpCit7CisJcEFOVExSM19FWENFUFRJT04JZXg7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKKwkqLworCWV4CT0gKHBBTlRMUjNfRVhDRVBUSU9OKSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfRVhDRVBUSU9OKSk7CisKKwkvKiBDaGVjayBmb3IgbWVtb3J5IGFsbG9jYXRpb24KKwkqLworCWlmCShleCA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJZXgtPm5hbWUJCT0gbmFtZTsJCS8qIEluc3RhbGwgZXhjZXB0aW9uIG5hbWUJKi8KKwlleC0+dHlwZQkJPSBleGNlcHRpb247CS8qIEluc3RhbGwgdGhlIGV4Y2VwdGlvbiBudW1iZXIJKi8KKwlleC0+bWVzc2FnZQkJPSBtZXNzYWdlOwkvKiBJbnN0YWxsIG1lc3NhZ2Ugc3RyaW5nCSovCisKKwkvKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGZyZWVkIGlmIGV4Y2VwdGlvbiBpcyBkZXN0cm95ZWQgICAgCisJKi8KKwlleC0+ZnJlZU1lc3NhZ2UJPSBmcmVlTWVzc2FnZTsKKworCS8qIEluc3RhbGwgdGhlIEFQSQorCSovCisJZXgtPnByaW50CSAgICA9ICBhbnRscjNFeGNlcHRpb25QcmludDsKKwlleC0+ZnJlZUV4CSAgICA9ICBhbnRscjNFeGNlcHRpb25GcmVlOworCisJcmV0dXJuIGV4OworfQorCisvKioKKyAqIFxicmllZgorICogUHJpbnRzIG91dCB0aGUgbWVzc2FnZSBpbiBhbGwgdGhlIGV4Y2VwdGlvbnMgaW4gdGhlIHN1cHBsaWVkIGNoYWluLgorICogCisgKiBccGFyYW1baW5dIGV4CisgKiBQb2ludGVyIHRvIHRoZSBleGNlcHRpb24gc3RydWN0dXJlIHRvIHByaW50LgorICogCisgKiBccmVtYXJrcworICogWW91IG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gYnkgaW5zdGFsbGluZyBhIHBvaW50ZXIgdG8gYSBuZXcgZnVuY3Rpb24KKyAqIGluIHRoZSBiYXNlIHJlY29nbml6ZXIgY29udGV4dCBzdHJ1Y3R1cmUuCisgKiAKKyAqIFxzZWUKKyAqIEFOVExSM19CQVNFX1JFQ09HTklaRVIKKyAqLworc3RhdGljIHZvaWQKK2FudGxyM0V4Y2VwdGlvblByaW50KHBBTlRMUjNfRVhDRVBUSU9OIGV4KQoreworICAgIC8qIEVuc3VyZSB2YWxpZCBwb2ludGVyCisgICAgICovCisgICAgd2hpbGUgICAoZXggIT0gTlVMTCkKKyAgICB7CisJLyogTnVtYmVyIGlmIG5vIG1lc3NhZ2UsIGVsc2UgdGhlIG1lc3NhZ2UKKwkgKi8KKwlpZiAgKGV4LT5tZXNzYWdlID09IE5VTEwpCisJeworCSAgICBBTlRMUjNfRlBSSU5URihzdGRlcnIsICJBTlRMUjNfRVhDRVBUSU9OIG51bWJlciAlZCAoJTA4WCkuXG4iLCBleC0+dHlwZSwgZXgtPnR5cGUpOworCX0KKwllbHNlCisJeworCSAgICBBTlRMUjNfRlBSSU5URihzdGRlcnIsICJBTlRMUjNfRVhDRVBUSU9OOiAlc1xuIiwgKGNoYXIgKikoZXgtPm1lc3NhZ2UpKTsKKwl9CisKKwkvKiBNb3ZlIHRvIG5leHQgaW4gdGhlIGNoYWluIChpZiBhbnkpCisJICovCisJZXggPSBleC0+bmV4dEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKgorICogXGJyaWVmCisgKiBGcmVlcyB1cCBhIGNoYWluIG9mIEFOVExSMyBleGNlcHRpb25zCisgKiAKKyAqIFxwYXJhbVtpbl0gZXgKKyAqIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGV4Y2VwdGlvbiBpbiB0aGUgY2hhaW4gdG8gZnJlZS4KKyAqIAorICogXHNlZQorICogQU5UTFIzX0VYQ0VQVElPTgorICovCitzdGF0aWMgdm9pZAorYW50bHIzRXhjZXB0aW9uRnJlZShwQU5UTFIzX0VYQ0VQVElPTiBleCkKK3sKKyAgICBwQU5UTFIzX0VYQ0VQVElPTiBuZXh0OworCisgICAgLyogRW5zdXJlIHZhbGlkIHBvaW50ZXIKKyAgICAgKi8KKyAgICB3aGlsZSAgIChleCAhPSBOVUxMKQorICAgIHsKKwkvKiBQaWNrIHVwIGFueXRoaWduIGZvbGxvd2luZyBub3csIGJlZm9yZSB3ZSBmcmVlIHRoZQorCSAqIGN1cnJlbnQgbWVtb3J5IGJsb2NrLgorCSAqLworCW5leHQJPSBleC0+bmV4dEV4Y2VwdGlvbjsKKworCS8qIEZyZWUgdGhlIG1lc3NhZ2UgcG9pbnRlciBpZiBhZHZpc2VkIHRvCisJICovCisJaWYgIChleC0+ZnJlZU1lc3NhZ2UgPT0gQU5UTFIzX1RSVUUpCisJeworCSAgICBBTlRMUjNfRlJFRShleC0+bWVzc2FnZSk7CisJfQorCisJLyogQ2FsbCB0aGUgcHJvZ3JhbW1lcidzIGN1c3RvbSBmcmVlIHJvdXRpbmUgaWYgYWR2aXNlZCB0bworCSAqLworCWlmICAoZXgtPmZyZWVDdXN0b20gIT0gTlVMTCkKKwl7CisJICAgIGV4LT5mcmVlQ3VzdG9tKGV4LT5jdXN0b20pOworCX0KKworCS8qIEZyZWUgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgaXRzZWxmCisJICovCisJQU5UTFIzX0ZSRUUoZXgpOworCisJZXggPSBuZXh0OworICAgIH0KKworICAgIHJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZmlsZXN0cmVhbS5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzZmlsZXN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzBmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNmaWxlc3RyZWFtLmMKQEAgLTAsMCArMSw0NzQgQEAKKy8qKiBcZmlsZQorICogXGJyaWVmIFRoZSBBTlRMUjMgQyBmaWxlc3RyZWFtIGlzIHVzZWQgd2hlbiB0aGUgc291cmNlIGNoYXJhY3RlciBzdHJlYW0KKyAqIGlzIGEgZmlsZXN5c3RlbSBiYXNlZCBpbnB1dCBzZXQgYW5kIGFsbCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgZmlsZXN0cmVhbQorICogY2FuIGJlIGxvYWRlZCBhdCBvbmNlIGludG8gbWVtb3J5IGFuZCBhd2F5IHRoZSBsZXhlciBnb2VzLgorICoKKyAqIEEgbnVtYmVyIG9mIGluaXRpYWxpemVycyBhcmUgcHJvdmlkZWQgaW4gb3JkZXIgdGhhdCB2YXJpb3VzIGNoYXJhY3RlcgorICogc2V0cyBjYW4gYmUgc3VwcG9ydGVkIGZyb20gaW5wdXQgZmlsZXMuIFRoZSBBTlRMUjMgQyBydW50aW1lIGV4cGVjdHMKKyAqIHRvIGRlYWwgd2l0aCBVVEYzMiBjaGFyYWN0ZXJzIG9ubHkgKHRoZSByZWFzb25zIGZvciB0aGlzIGFyZSB0bworICogZG8gd2l0aCB0aGUgc2ltcGxpZmljYXRpb24gb2YgQyBjb2RlIHdoZW4gdXNpbmcgdGhpcyBmb3JtIG9mIFVuaWNvZGUgCisgKiBlbmNvZGluZywgdGhvdWdoIHRoaXMgaXMgbm90IGEgcGFuYWNlYS4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUKKyAqIGZvdW5kIG9uIHRoaXMgYnkgY29uc3VsdGluZzogCisgKiAgIC0gaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNC4wLjAvY2gwMi5wZGYjRzExMTc4CisgKiBXaGVyZSBhIHdlbGwgZ3JvdW5kZWQgZGlzY3Vzc2lvbiBvZiB0aGUgZW5jb2RpbmcgZm9ybWF0cyBhdmFpbGFibGUKKyAqIG1heSBiZSBmb3VuZC4KKyAqCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzLmg+CisKK3N0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICAgICAgc2V0dXBJbnB1dFN0cmVhbSAgICAgICAgICAgIChwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCk7CitzdGF0aWMgIHBBTlRMUjNfSU5QVVRfU1RSRUFNICAgIGFudGxyM0NyZWF0ZUZpbGVTdHJlYW0gICAgICAocEFOVExSM19VSU5UOCBmaWxlTmFtZSk7CitzdGF0aWMgIHBBTlRMUjNfSU5QVVRfU1RSRUFNICAgIGFudGxyM0NyZWF0ZVN0cmluZ1N0cmVhbSAgICAocEFOVExSM19VSU5UOCBkYXRhKTsKKworQU5UTFIzX0FQSSBwQU5UTFIzX0lOUFVUX1NUUkVBTQorYW50bHIzRmlsZVN0cmVhbU5ldyhwQU5UTFIzX1VJTlQ4IGZpbGVOYW1lLCBBTlRMUjNfVUlOVDMyIGVuY29kaW5nKQoreworICAgIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0OworCisgICAgLy8gRmlyc3Qgb3JkZXIgb2YgYnVzaW5lc3MgaXMgdG8gcmVhZCB0aGUgZmlsZSBpbnRvIHNvbWUgYnVmZmVyIHNwYWNlCisgICAgLy8gYXMganVzdCBzdHJhaWdodCA4IGJpdCBieXRlcy4gVGhlbiB3ZSB3aWxsIHdvcmsgb3V0IHRoZSBlbmNvZGluZyBhbmQKKyAgICAvLyBieXRlIG9yZGVyIGFuZCBhZGp1c3QgdGhlIEFQSSBmdW5jdGlvbnMgdGhhdCBhcmUgaW5zdGFsbGVkIGZvciB0aGUKKyAgICAvLyBkZWZhdWx0IDhCaXQgc3RyZWFtIGFjY29yZGluZ2x5LgorICAgIC8vCisgICAgaW5wdXQgICA9IGFudGxyM0NyZWF0ZUZpbGVTdHJlYW0oZmlsZU5hbWUpOworICAgIGlmICAoaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgdGhlIGRhdGEgaW4gbWVtb3J5IG5vdyBzbyB3ZSBjYW4gZGVhbCB3aXRoIGl0IGFjY29yZGluZyB0byAKKyAgICAvLyB0aGUgZW5jb2Rpbmcgc2NoZW1lIHdlIHdlcmUgZ2l2ZW4gYnkgdGhlIHVzZXIuCisgICAgLy8KKyAgICBpbnB1dC0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKworICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHdvcmsgb3V0IHRoZSBlbmRpYW4gdHlwZSBhbmQgaW5zdGFsbCBhbnkgCisgICAgLy8gQVBJIGZ1bmN0aW9ucyB0aGF0IGRpZmZlciBmcm9tIDhCaXQKKyAgICAvLworICAgIHNldHVwSW5wdXRTdHJlYW0oaW5wdXQpOworCisgICAgLy8gTm93IHdlIGNhbiBzZXQgdXAgdGhlIGZpbGUgbmFtZQorICAgIC8vCQorICAgIGlucHV0LT5pc3RyZWFtLT5zdHJlYW1OYW1lCT0gaW5wdXQtPnN0ckZhY3RvcnktPm5ld1N0cjgoaW5wdXQtPnN0ckZhY3RvcnksIGZpbGVOYW1lKTsKKyAgICBpbnB1dC0+ZmlsZU5hbWUJCT0gaW5wdXQtPmlzdHJlYW0tPnN0cmVhbU5hbWU7CisKKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKKworQU5UTFIzX0FQSSBwQU5UTFIzX0lOUFVUX1NUUkVBTQorYW50bHIzU3RyaW5nU3RyZWFtTmV3KHBBTlRMUjNfVUlOVDggZGF0YSwgQU5UTFIzX1VJTlQzMiBlbmNvZGluZywgQU5UTFIzX1VJTlQzMiBzaXplLCBwQU5UTFIzX1VJTlQ4IG5hbWUpCit7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gICAgaW5wdXQ7CisKKyAgICAvLyBGaXJzdCBvcmRlciBvZiBidXNpbmVzcyBpcyB0byBzZXQgdXAgdGhlIHN0cmVhbSBhbmQgaW5zdGFsbCB0aGUgZGF0YSBwb2ludGVyLgorICAgIC8vIFRoZW4gd2Ugd2lsbCB3b3JrIG91dCB0aGUgZW5jb2RpbmcgYW5kIGJ5dGUgb3JkZXIgYW5kIGFkanVzdCB0aGUgQVBJIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbnN0YWxsZWQgZm9yIHRoZQorICAgIC8vIGRlZmF1bHQgOEJpdCBzdHJlYW0gYWNjb3JkaW5nbHkuCisgICAgLy8KKyAgICBpbnB1dCAgID0gYW50bHIzQ3JlYXRlU3RyaW5nU3RyZWFtKGRhdGEpOworICAgIGlmICAoaW5wdXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICAvLyBTaXplIChpbiBieXRlcykgb2YgdGhlIGdpdmVuICdzdHJpbmcnCisgICAgLy8KKyAgICBpbnB1dC0+c2l6ZUJ1ZgkJPSBzaXplOworCisgICAgLy8gV2UgaGF2ZSB0aGUgZGF0YSBpbiBtZW1vcnkgbm93IHNvIHdlIGNhbiBkZWFsIHdpdGggaXQgYWNjb3JkaW5nIHRvIAorICAgIC8vIHRoZSBlbmNvZGluZyBzY2hlbWUgd2Ugd2VyZSBnaXZlbiBieSB0aGUgdXNlci4KKyAgICAvLworICAgIGlucHV0LT5lbmNvZGluZyA9IGVuY29kaW5nOworCisgICAgLy8gTm93IHdlIG5lZWQgdG8gd29yayBvdXQgdGhlIGVuZGlhbiB0eXBlIGFuZCBpbnN0YWxsIGFueSAKKyAgICAvLyBBUEkgZnVuY3Rpb25zIHRoYXQgZGlmZmVyIGZyb20gOEJpdAorICAgIC8vCisgICAgc2V0dXBJbnB1dFN0cmVhbShpbnB1dCk7CisKKyAgICAvLyBOb3cgd2UgY2FuIHNldCB1cCB0aGUgZmlsZSBuYW1lCisgICAgLy8JCisgICAgaW5wdXQtPmlzdHJlYW0tPnN0cmVhbU5hbWUJPSBpbnB1dC0+c3RyRmFjdG9yeS0+bmV3U3RyOChpbnB1dC0+c3RyRmFjdG9yeSwgbmFtZSk7CisgICAgaW5wdXQtPmZpbGVOYW1lCQk9IGlucHV0LT5pc3RyZWFtLT5zdHJlYW1OYW1lOworCisgICAgcmV0dXJuIGlucHV0OworfQorCisKKy8vLyBEZXRlcm1pbmUgZW5kaWFuZXNzIG9mIHRoZSBpbnB1dCBzdHJlYW0gYW5kIGluc3RhbGwgdGhlCisvLy8gQVBJIHJlcXVpcmVkIGZvciB0aGUgZW5jb2RpbmcgaW4gdGhhdCBmb3JtYXQuCisvLy8KK3N0YXRpYyB2b2lkIAorc2V0dXBJbnB1dFN0cmVhbShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCkKK3sKKyAgICBBTlRMUjNfQk9PTEVBTiAgaXNCaWdFbmRpYW47CisKKyAgICAvLyBVc2VkIHRvIGRldGVybWluZSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgbWFjaGluZSB3ZSBhcmUgY3VycmVudGx5CisgICAgLy8gcnVubmluZyBvbi4KKyAgICAvLworICAgIEFOVExSM19VSU5UMTYgYm9tVGVzdCA9IDB4RkVGRjsKKyAgICAKKyAgICAvLyBXaGF0IGVuZGlhbmVzcyBpcyB0aGUgbWFjaGluZSB3ZSBhcmUgcnVubmluZyBvbj8gSWYgdGhlIGluY29taW5nCisgICAgLy8gZW5jb2RpbmcgZW5kaWFuZXNzIGlzIHRoZSBzYW1lIGFzIHRoaXMgbWFjaGluZSdzIG5hdHVyYWwgYnl0ZSBvcmRlcgorICAgIC8vIHRoZW4gd2UgY2FuIHVzZSBtb3JlIGVmZmljaWVudCBBUEkgY2FsbHMuCisgICAgLy8KKyAgICBpZiAgKCooKHBBTlRMUjNfVUlOVDgpKCZib21UZXN0KSkgPT0gMHhGRSkKKyAgICB7CisgICAgICAgIGlzQmlnRW5kaWFuID0gQU5UTFIzX1RSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlzQmlnRW5kaWFuID0gQU5UTFIzX0ZBTFNFOworICAgIH0KKworICAgIC8vIFdoYXQgZW5jb2RpbmcgZGlkIHRoZSB1c2VyIHRlbGwgdXMge3N9aGUgdGhvdWdodCBpdCB3YXM/IEkgYW0gZ29pbmcKKyAgICAvLyB0byBnZXQgc2ljayBvZiB0aGUgcXVlc3Rpb25zIG9uIGFudGxyLWludGVyZXN0LCBJIGtub3cgSSBhbS4KKyAgICAvLworICAgIHN3aXRjaCAgKGlucHV0LT5lbmNvZGluZykKKyAgICB7CisgICAgICAgIGNhc2UgICAgQU5UTFIzX0VOQ19VVEY4OgorCisgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBCT00gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgVVRGLTggc2VxdWVuY2UKKyAgICAgICAgICAgIC8vIGFuZCBqdXN0IGVhdCBpdCBpZiB0aGVyZSBpcy4gV2luZG93cyAuVFhUIGZpbGVzIGhhdmUgdGhpcyBmb3IgaW5zdGFuY2UKKyAgICAgICAgICAgIC8vIGFzIGl0IGlkZW50aWZpZXMgVVRGLTggZXZlbiB0aG91Z2ggaXQgaXMgb2Ygbm8gY29uc2VxdWVuY2UgZm9yIGJ5dGUgb3JkZXIKKyAgICAgICAgICAgIC8vIGFzIFVURi04IGRvZXMgbm90IGhhdmUgYSBieXRlIG9yZGVyLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICAoICAgICAgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSkgICAgICA9PSAweEVGCisgICAgICAgICAgICAgICAgICAgICYmICAoQU5UTFIzX1VJTlQ4KSgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcisxKSkgICAgPT0gMHhCQgorICAgICAgICAgICAgICAgICAgICAmJiAgKEFOVExSM19VSU5UOCkoKigocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIrMikpICAgID09IDB4QkYKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlIFVURjggQk9NIGlzIHByZXNlbnQgc28gc2tpcCBpdAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPm5leHRDaGFyID0gKHZvaWQgKikoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgMyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIFVURjggaW5wdXQgcm91dGluZXMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhbnRscjNVVEY4U2V0dXBTdHJlYW0oaW5wdXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAgICBBTlRMUjNfRU5DX1VURjE2OgorCisgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBCT00gYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dC4gSWYgbm90IHRoZW4KKyAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHRoZSBieXRlIG9yZGVyIGlzIHRoZSBuYXR1cmFsIG9yZGVyIG9mIHRoaXMKKyAgICAgICAgICAgIC8vIG1hY2hpbmUgKG9yIGl0IGlzIHJlYWxseSBVQ1MyKS4gSWYgdGhlcmUgaXMgYSBCT00gd2UgZGV0ZXJtaW5lIGlmIHRoZSBlbmNvZGluZworICAgICAgICAgICAgLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG5hdHVyYWwgb3JkZXIgb2YgdGhpcyBtYWNoaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICAoICAgICAgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSkgICAgICA9PSAweEZFCisgICAgICAgICAgICAgICAgICAgICYmICAoQU5UTFIzX1VJTlQ4KSgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcisxKSkgICAgPT0gMHhGRgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBCT00gUHJlc2VudCwgaW5kaWNhdGVzIEJpZyBFbmRpYW4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlucHV0LT5uZXh0Q2hhciA9ICh2b2lkICopKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhciArIDIpOworCisgICAgICAgICAgICAgICAgYW50bHIzVVRGMTZTZXR1cFN0cmVhbShpbnB1dCwgaXNCaWdFbmRpYW4sIEFOVExSM19UUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgICggICAgICAoQU5UTFIzX1VJTlQ4KSgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcikpICAgICAgPT0gMHhGRgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKzEpKSAgICA9PSAweEZFCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEJPTSBwcmVzZW50LCBpbmRpY2F0ZXMgTGl0dGxlIEVuZGlhbgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPm5leHRDaGFyID0gKHZvaWQgKikoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgMik7CisKKyAgICAgICAgICAgICAgICBhbnRscjNVVEYxNlNldHVwU3RyZWFtKGlucHV0LCBpc0JpZ0VuZGlhbiwgQU5UTFIzX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBObyBCT00gcHJlc2VudCwgYXNzdW1lIGxvY2FsIGNvbXB1dGVyIGJ5dGUgb3JkZXIKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGFudGxyM1VURjE2U2V0dXBTdHJlYW0oaW5wdXQsIGlzQmlnRW5kaWFuLCBpc0JpZ0VuZGlhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICAgIEFOVExSM19FTkNfVVRGMzI6CisKKyAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIEJPTSBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0LiBJZiBub3QgdGhlbgorICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhlIGJ5dGUgb3JkZXIgaXMgdGhlIG5hdHVyYWwgb3JkZXIgb2YgdGhpcworICAgICAgICAgICAgLy8gbWFjaGluZS4gSWYgdGhlcmUgaXMgd2UgZGV0ZXJtaW5lIGlmIHRoZSBlbmNvZGluZworICAgICAgICAgICAgLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG5hdHVyYWwgb3JkZXIgb2YgdGhpcyBtYWNoaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICAoICAgICAgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSkgICAgICA9PSAweDAwCisgICAgICAgICAgICAgICAgICAgICYmICAoQU5UTFIzX1VJTlQ4KSgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcisxKSkgICAgPT0gMHgwMAorICAgICAgICAgICAgICAgICAgICAmJiAgKEFOVExSM19VSU5UOCkoKigocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIrMikpICAgID09IDB4RkUKKyAgICAgICAgICAgICAgICAgICAgJiYgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKzMpKSAgICA9PSAweEZGCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEJPTSBQcmVzZW50LCBpbmRpY2F0ZXMgQmlnIEVuZGlhbgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPm5leHRDaGFyID0gKHZvaWQgKikoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgNCk7CisKKyAgICAgICAgICAgICAgICBhbnRscjNVVEYzMlNldHVwU3RyZWFtKGlucHV0LCBpc0JpZ0VuZGlhbiwgQU5UTFIzX1RSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAgKCAgICAgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSkgICAgICA9PSAweEZGCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAgKEFOVExSM19VSU5UOCkoKigocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIrMSkpICAgID09IDB4RkUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICAoQU5UTFIzX1VJTlQ4KSgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcisxKSkgICAgPT0gMHgwMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIChBTlRMUjNfVUlOVDgpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKzEpKSAgICA9PSAweDAwCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEJPTSBwcmVzZW50LCBpbmRpY2F0ZXMgTGl0dGxlIEVuZGlhbgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPm5leHRDaGFyID0gKHZvaWQgKikoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgNCk7CisKKyAgICAgICAgICAgICAgICBhbnRscjNVVEYzMlNldHVwU3RyZWFtKGlucHV0LCBpc0JpZ0VuZGlhbiwgQU5UTFIzX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBObyBCT00gcHJlc2VudCwgYXNzdW1lIGxvY2FsIGNvbXB1dGVyIGJ5dGUgb3JkZXIKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGFudGxyM1VURjMyU2V0dXBTdHJlYW0oaW5wdXQsIGlzQmlnRW5kaWFuLCBpc0JpZ0VuZGlhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICAgIEFOVExSM19FTkNfVVRGMTZCRToKKworICAgICAgICAgICAgLy8gRW5jb2RpbmcgaXMgZGVmaW5hdGVseSBCaWcgRW5kaWFuIHdpdGggbm8gQk9NCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYW50bHIzVVRGMTZTZXR1cFN0cmVhbShpbnB1dCwgaXNCaWdFbmRpYW4sIEFOVExSM19UUlVFKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgICAgQU5UTFIzX0VOQ19VVEYxNkxFOgorCisgICAgICAgICAgICAvLyBFbmNvZGluZyBpcyBkZWZpbmF0ZWx5IExpdHRsZSBFbmRpYW4gd2l0aCBubyBCT00KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhbnRscjNVVEYxNlNldHVwU3RyZWFtKGlucHV0LCBpc0JpZ0VuZGlhbiwgQU5UTFIzX0ZBTFNFKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgICAgQU5UTFIzX0VOQ19VVEYzMkJFOgorCisgICAgICAgICAgICAvLyBFbmNvZGluZyBpcyBkZWZpbmF0ZWx5IEJpZyBFbmRpYW4gd2l0aCBubyBCT00KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhbnRscjNVVEYzMlNldHVwU3RyZWFtKGlucHV0LCBpc0JpZ0VuZGlhbiwgQU5UTFIzX1RSVUUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAgICBBTlRMUjNfRU5DX1VURjMyTEU6CisKKyAgICAgICAgICAgIC8vIEVuY29kaW5nIGlzIGRlZmluYXRlbHkgTGl0dGxlIEVuZGlhbiB3aXRoIG5vIEJPTQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGFudGxyM1VURjMyU2V0dXBTdHJlYW0oaW5wdXQsIGlzQmlnRW5kaWFuLCBBTlRMUjNfRkFMU0UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAgICBBTlRMUjNfRU5DX0VCQ0RJQzoKKworICAgICAgICAgICAgLy8gRUJDRElDIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBBU0NJSSBidXQgd2l0aCBhbiBvbiB0aGUKKyAgICAgICAgICAgIC8vIGZseSB0cmFuc2xhdGlvbiB0byBBU0NJSQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGFudGxyM0VCQ0RJQ1NldHVwU3RyZWFtKGlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgICAgQU5UTFIzX0VOQ184QklUOgorICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAvLyBTdGFuZGFyZCA4Yml0L0FTQ0lJCisgICAgICAgICAgICAvLworICAgICAgICAgICAgYW50bHIzOEJpdFNldHVwU3RyZWFtKGlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gICAgCit9CisKKy8qKiBcYnJpZWYgVXNlIHRoZSBjb250ZW50cyBvZiBhbiBvcGVyYXRpbmcgc3lzdGVtIGZpbGUgYXMgdGhlIGlucHV0CisgKiAgICAgICAgIGZvciBhbiBpbnB1dCBzdHJlYW0uCisgKgorICogXHBhcmFtIGZpbGVOYW1lIE5hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSBmaWxlIHRvIHJlYWQuCisgKiBccmV0dXJuCisgKgktIFBvaW50ZXIgdG8gbmV3IGlucHV0IHN0cmVhbSBjb250ZXh0IHVwb24gc3VjY2VzcworICoJLSBPbmUgb2YgdGhlIEFOVExSM19FUlJfIGRlZmluZXMgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBwQU5UTFIzX0lOUFVUX1NUUkVBTQorYW50bHIzQ3JlYXRlRmlsZVN0cmVhbShwQU5UTFIzX1VJTlQ4IGZpbGVOYW1lKQoreworCS8vIFBvaW50ZXIgdG8gdGhlIGlucHV0IHN0cmVhbSB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlCisJLy8KKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dDsKKwlBTlRMUjNfVUlOVDMyCSAgICBzdGF0dXM7CisKKwlpZgkoZmlsZU5hbWUgPT0gTlVMTCkKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGlucHV0IHN0cmVhbSBzdHJ1Y3R1cmUKKwkvLworCWlucHV0ICAgPSAocEFOVExSM19JTlBVVF9TVFJFQU0pCisJCUFOVExSM19DQUxMT0MoMSwgc2l6ZW9mKEFOVExSM19JTlBVVF9TVFJFQU0pKTsKKworCWlmCShpbnB1dCA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJLy8gU3RydWN0dXJlIHdhcyBhbGxvY2F0ZWQgY29ycmVjdGx5LCBub3cgd2UgY2FuIHJlYWQgdGhlIGZpbGUuCisJLy8KKwlzdGF0dXMgID0gYW50bHIzcmVhZDhCaXQoaW5wdXQsIGZpbGVOYW1lKTsKKworCS8vIENhbGwgdGhlIGNvbW1vbiA4IGJpdCBpbnB1dCBzdHJlYW0gaGFuZGxlcgorCS8vIGluaXRpYWxpemF0aW9uLgorCS8vCisJYW50bHIzR2VuZXJpY1NldHVwU3RyZWFtKGlucHV0KTsKKworICAgICAgICAvLyBIb3dldmVyIGlmIHRoZSBmaWxlIHdhcyBub3QgdGhlcmUgb3Igc29tZXRoaW5nIHRoZW4gd2UKKyAgICAgICAgLy8gbmVlZCB0byBjbG9zZS4gSGF2ZSB0byB3YWl0IHVudGlsIGhlcmUgYXMgd2UgY2Fubm90IGNhbGwKKyAgICAgICAgLy8gY2xvc2UgdW50aWwgdGhlIEFQSSBpcyBpbnN0YWxsZWQgb2YgY291cnNlLgorICAgICAgICAvLyAKKwlpZgkoc3RhdHVzICE9IEFOVExSM19TVUNDRVNTKQorCXsKKwkJaW5wdXQtPmNsb3NlKGlucHV0KTsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJcmV0dXJuICBpbnB1dDsKK30KKworQU5UTFIzX0FQSSBBTlRMUjNfVUlOVDMyCithbnRscjNyZWFkOEJpdChwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dCwgcEFOVExSM19VSU5UOCBmaWxlTmFtZSkKK3sKKwlBTlRMUjNfRkRTQwkgICAgaW5maWxlOworCUFOVExSM19VSU5UMzIJICAgIGZTaXplOworCisJLyogT3BlbiB0aGUgT1MgZmlsZSBpbiByZWFkIGJpbmFyeSBtb2RlCisJKi8KKwlpbmZpbGUgID0gYW50bHIzRm9wZW4oZmlsZU5hbWUsICJyYiIpOworCisJLyogQ2hlY2sgdGhhdCBpdCB3YXMgdGhlcmUKKwkqLworCWlmCShpbmZpbGUgPT0gTlVMTCkKKwl7CisJCXJldHVybgkoQU5UTFIzX1VJTlQzMilBTlRMUjNfRVJSX05PRklMRTsKKwl9CisKKwkvKiBJdCB3YXMgdGhlcmUsIHNvIHdlIGNhbiByZWFkIHRoZSBieXRlcyBub3cKKwkqLworCWZTaXplICAgPSBhbnRscjNGc2l6ZShmaWxlTmFtZSk7CS8qIFNpemUgb2YgaW5wdXQgZmlsZQkqLworCisJLyogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGlzIGlucHV0IHNldCAgIAorCSovCisJaW5wdXQtPmRhdGEJICAgID0gQU5UTFIzX01BTExPQygoc2l6ZV90KWZTaXplKTsKKwlpbnB1dC0+c2l6ZUJ1ZiAgPSBmU2l6ZTsKKworCWlmCShpbnB1dC0+ZGF0YSA9PSBOVUxMKQorCXsKKwkJcmV0dXJuCShBTlRMUjNfVUlOVDMyKUFOVExSM19FUlJfTk9NRU07CisJfQorCisJaW5wdXQtPmlzQWxsb2NhdGVkCT0gQU5UTFIzX1RSVUU7CisKKwkvKiBOb3cgd2UgcmVhZCB0aGUgZmlsZS4gQ2hhcmFjdGVycyBhcmUgbm90IGNvbnZlcnRlZCB0bworCSogdGhlIGludGVybmFsIEFOVExSIGVuY29kaW5nIHVudGlsIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgYnVmZmVyCisJKi8KKwlhbnRscjNGcmVhZChpbmZpbGUsIGZTaXplLCBpbnB1dC0+ZGF0YSk7CisKKwkvKiBBbmQgY2xvc2UgdGhlIGZpbGUgaGFuZGxlCisJKi8KKwlhbnRscjNGY2xvc2UoaW5maWxlKTsKKworCXJldHVybiAgQU5UTFIzX1NVQ0NFU1M7Cit9CisKKy8qKiBcYnJpZWYgT3BlbiBhbiBvcGVyYXRpbmcgc3lzdGVtIGZpbGUgYW5kIHJldHVybiB0aGUgZGVzY3JpcHRvcgorICogV2UganVzdCB1c2UgdGhlIGNvbW1vbiBvcGVuKCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGhlcmUuIAorICogTGF0ZXIgd2UgbWlnaHQgZmluZCBiZXR0ZXIgd2F5cyBvbiBzeXN0ZW1zCisgKiBzdWNoIGFzIFdpbmRvd3MgYW5kIE9wZW5WTVMgZm9yIGluc3RhbmNlLiBCdXQgdGhlIGlkZWEgaXMgdG8gcmVhZCB0aGUgCisgKiB3aGlsZSBmaWxlIGF0IG9uY2UgYW55d2F5LCBzbyBpdCBtYXkgYmUgaXJyZWxldmFudC4KKyAqLworQU5UTFIzX0FQSSBBTlRMUjNfRkRTQworYW50bHIzRm9wZW4ocEFOVExSM19VSU5UOCBmaWxlbmFtZSwgY29uc3QgY2hhciAqIG1vZGUpCit7CisgICAgcmV0dXJuICAoQU5UTFIzX0ZEU0MpZm9wZW4oKGNvbnN0IGNoYXIgKilmaWxlbmFtZSwgbW9kZSk7Cit9CisKKy8qKiBcYnJpZWYgQ2xvc2UgYW4gb3BlcmF0aW5nIHN5c3RlbSBmaWxlIGFuZCBmcmVlIGFueSBoYW5kbGVzCisgKiAgZXRjLgorICovCitBTlRMUjNfQVBJIHZvaWQKK2FudGxyM0ZjbG9zZShBTlRMUjNfRkRTQyBmZCkKK3sKKyAgICBmY2xvc2UoZmQpOworfQorQU5UTFIzX0FQSSBBTlRMUjNfVUlOVDMyCithbnRscjNGc2l6ZShwQU5UTFIzX1VJTlQ4IGZpbGVOYW1lKQoreyAgIAorICAgIHN0cnVjdCBfc3RhdAlzdGF0YnVmOworCisgICAgX3N0YXQoKGNvbnN0IGNoYXIgKilmaWxlTmFtZSwgJnN0YXRidWYpOworCisgICAgcmV0dXJuIChBTlRMUjNfVUlOVDMyKXN0YXRidWYuc3Rfc2l6ZTsKK30KKworQU5UTFIzX0FQSSBBTlRMUjNfVUlOVDMyCithbnRscjNGcmVhZChBTlRMUjNfRkRTQyBmZHNjLCBBTlRMUjNfVUlOVDMyIGNvdW50LCAgdm9pZCAqIGRhdGEpCit7CisgICAgcmV0dXJuICAoQU5UTFIzX1VJTlQzMilmcmVhZChkYXRhLCAoc2l6ZV90KWNvdW50LCAxLCBmZHNjKTsKK30KKworCisvKiogXGJyaWVmIFVzZSB0aGUgc3VwcGxpZWQgJ3N0cmluZycgYXMgaW5wdXQgdG8gdGhlIHN0cmVhbQorICoKKyAqIFxwYXJhbSBkYXRhIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEKKyAqIFxyZXR1cm4KKyAqCS0gUG9pbnRlciB0byBuZXcgaW5wdXQgc3RyZWFtIGNvbnRleHQgdXBvbiBzdWNjZXNzCisgKgktIE5VTEwgZGVmaW5lcyBvbiBlcnJvci4KKyAqLworc3RhdGljIHBBTlRMUjNfSU5QVVRfU1RSRUFNCithbnRscjNDcmVhdGVTdHJpbmdTdHJlYW0ocEFOVExSM19VSU5UOCBkYXRhKQoreworCS8vIFBvaW50ZXIgdG8gdGhlIGlucHV0IHN0cmVhbSB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlCisJLy8KKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dDsKKworCWlmCShkYXRhID09IE5VTEwpCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnB1dCBzdHJlYW0gc3RydWN0dXJlCisJLy8KKwlpbnB1dCAgID0gKHBBTlRMUjNfSU5QVVRfU1RSRUFNKQorCQlBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfSU5QVVRfU1RSRUFNKSk7CisKKwlpZgkoaW5wdXQgPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8vIFN0cnVjdHVyZSB3YXMgYWxsb2NhdGVkIGNvcnJlY3RseSwgbm93IHdlIGNhbiBpbnN0YWxsIHRoZSBwb2ludGVyCisJLy8KKyAgICAgICAgaW5wdXQtPmRhdGEgICAgICAgICAgICAgPSBkYXRhOworICAgICAgICBpbnB1dC0+aXNBbGxvY2F0ZWQJPSBBTlRMUjNfRkFMU0U7CisKKwkvLyBDYWxsIHRoZSBjb21tb24gOCBiaXQgaW5wdXQgc3RyZWFtIGhhbmRsZXIKKwkvLyBpbml0aWFsaXphdGlvbi4KKwkvLworCWFudGxyM0dlbmVyaWNTZXR1cFN0cmVhbShpbnB1dCk7CisKKyAgICAgICAgcmV0dXJuICBpbnB1dDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNpbnB1dHN0cmVhbS5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzaW5wdXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YxYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzaW5wdXRzdHJlYW0uYwpAQCAtMCwwICsxLDIwNTAgQEAKKy8vLyBcZmlsZQorLy8vIEJhc2UgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIG1hbmlwdWxhdGUgYW55IGlucHV0IHN0cmVhbQorLy8vCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM2lucHV0Lmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmljIDggYml0IGlucHV0IHN1Y2ggYXMgbGF0aW4tMQorLy8KKworLy8gOEJpdCBJTlQgU3RyZWFtIEFQSQorLy8KK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzOEJpdENvbnN1bWUJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljCSAgICBBTlRMUjNfVUNIQVIgICAgYW50bHIzOEJpdExBCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpOworc3RhdGljCSAgICBBTlRMUjNfVUNIQVIgICAgYW50bHIzOEJpdExBX3VjYXNlCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpOworc3RhdGljCSAgICBBTlRMUjNfTUFSS0VSICAgYW50bHIzOEJpdEluZGV4CQkocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYwkgICAgQU5UTFIzX01BUktFUiAgIGFudGxyMzhCaXRNYXJrCQkocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzOEJpdFJld2luZAkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBtYXJrKTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzOEJpdFJld2luZExhc3QJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMJICAgIHZvaWQJICAgIGFudGxyMzhCaXRSZWxlYXNlCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIG1hcmspOworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjM4Qml0U2VlawkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBzZWVrUG9pbnQpOworc3RhdGljCSAgICBwQU5UTFIzX1NUUklORyAgYW50bHIzOEJpdEdldFNvdXJjZU5hbWUJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CisKKy8vIDhCaXQgQ2hhcnN0cmVhbSBBUEkgZnVuY3Rpb25zCisvLworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjNJbnB1dENsb3NlCQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpOworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjNJbnB1dFJlc2V0CQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpOworc3RhdGljICAgICAgdm9pZCAgICAgICAgICAgIGFudGxyMzhCaXRSZXVzZSAgICAgICAgICAgIChwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCwgcEFOVExSM19VSU5UOCBpblN0cmluZywgQU5UTFIzX1VJTlQzMiBzaXplLCBwQU5UTFIzX1VJTlQ4IG5hbWUpOworc3RhdGljCSAgICB2b2lkICoJICAgIGFudGxyMzhCaXRMVAkJKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfSU5UMzIgbHQpOworc3RhdGljCSAgICBBTlRMUjNfVUlOVDMyICAgYW50bHIzOEJpdFNpemUJCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCk7CitzdGF0aWMJICAgIHBBTlRMUjNfU1RSSU5HICBhbnRscjM4Qml0U3Vic3RyCQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19NQVJLRVIgc3RhcnQsIEFOVExSM19NQVJLRVIgc3RvcCk7CitzdGF0aWMJICAgIEFOVExSM19VSU5UMzIgICBhbnRscjM4Qml0R2V0TGluZQkJKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKK3N0YXRpYwkgICAgdm9pZAkgICogYW50bHIzOEJpdEdldExpbmVCdWYJKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKK3N0YXRpYwkgICAgQU5UTFIzX1VJTlQzMiAgIGFudGxyMzhCaXRHZXRDaGFyUG9zaXRpb24JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzOEJpdFNldExpbmUJCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCwgQU5UTFIzX1VJTlQzMiBsaW5lKTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzOEJpdFNldENoYXJQb3NpdGlvbgkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19VSU5UMzIgcG9zaXRpb24pOworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjM4Qml0U2V0TmV3TGluZUNoYXIJKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfVUlOVDMyIG5ld2xpbmVDaGFyKTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzOEJpdFNldFVjYXNlTEEJKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfQk9PTEVBTiBmbGFnKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVURjE2IChhbHNvIGNvdmVycyBVQ1MyKQorLy8KKy8vIElOVCBTdHJlYW0gQVBJCisvLworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjNVVEYxNkNvbnN1bWUJICAgICAgICAocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYwkgICAgQU5UTFIzX1VDSEFSICAgIGFudGxyM1VURjE2TEEJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSk7CitzdGF0aWMJICAgIHZvaWQJICAgIGFudGxyM1VURjE2Q29uc3VtZUxFICAgICAgICAocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYwkgICAgQU5UTFIzX1VDSEFSICAgIGFudGxyM1VURjE2TEFMRQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX0lOVDMyIGxhKTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzVVRGMTZDb25zdW1lQkUgICAgICAgIChwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljCSAgICBBTlRMUjNfVUNIQVIgICAgYW50bHIzVVRGMTZMQUJFCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpOworc3RhdGljCSAgICBBTlRMUjNfTUFSS0VSICAgYW50bHIzVVRGMTZJbmRleAkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMJICAgIHZvaWQJICAgIGFudGxyM1VURjE2U2VlawkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBzZWVrUG9pbnQpOworCisvLyBVVEYxNiBDaGFyc3RyZWFtIEFQSSBmdW5jdGlvbnMKKy8vCitzdGF0aWMJICAgIHBBTlRMUjNfU1RSSU5HCWFudGxyM1VURjE2U3Vic3RyCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCwgQU5UTFIzX01BUktFUiBzdGFydCwgQU5UTFIzX01BUktFUiBzdG9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVURjMyIChhbHNvIGNvdmVycyBVQ1MyKQorLy8KKy8vIElOVCBTdHJlYW0gQVBJCisvLworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjNVVEYzMkNvbnN1bWUJICAgICAgICAocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYwkgICAgQU5UTFIzX1VDSEFSICAgIGFudGxyM1VURjMyTEEJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSk7CitzdGF0aWMJICAgIEFOVExSM19VQ0hBUiAgICBhbnRscjNVVEYzMkxBTEUJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSk7CitzdGF0aWMJICAgIEFOVExSM19VQ0hBUiAgICBhbnRscjNVVEYzMkxBQkUJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSk7CitzdGF0aWMJICAgIEFOVExSM19NQVJLRVIgICBhbnRscjNVVEYzMkluZGV4CQkocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYwkgICAgdm9pZAkgICAgYW50bHIzVVRGMzJTZWVrCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIHNlZWtQb2ludCk7CisKKy8vIFVURjE2IENoYXJzdHJlYW0gQVBJIGZ1bmN0aW9ucworLy8KK3N0YXRpYwkgICAgcEFOVExSM19TVFJJTkcgIGFudGxyM1VURjMyU3Vic3RyCSAgICAgICAgKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfTUFSS0VSIHN0YXJ0LCBBTlRMUjNfTUFSS0VSIHN0b3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVURi04CisvLworc3RhdGljCSAgICB2b2lkCSAgICBhbnRscjNVVEY4Q29uc3VtZQkgICAgICAgIChwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljCSAgICBBTlRMUjNfVUNIQVIgICAgYW50bHIzVVRGOExBCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVCQ0RJQworLy8KK3N0YXRpYwkgICAgQU5UTFIzX1VDSEFSICAgIGFudGxyM0VCQ0RJQ0xBCQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpOworCisvLy8gXGJyaWVmIENvbW1vbiBmdW5jdGlvbiB0byBzZXR1cCBmdW5jdGlvbiBpbnRlcmZhY2UgZm9yIGFuIDggYml0IGlucHV0IHN0cmVhbS4KKy8vLworLy8vIFxwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisvLy8KKy8vLyBccmVtYXJrCisvLy8gICAtIE1hbnkgb2YgdGhlIDggYml0IG9yaWVudGVkIGZpbGUgc3RyZWFtIGhhbmRsaW5nIGZ1bmN0aW9ucyB3aWxsIGJlIHVzYWJsZQorLy8vICAgICBieSBhbnkgb3IgYXQgbGVhc3Qgc29tZSwgb3RoZXIgaW5wdXQgc3RyZWFtcy4gVGhlcmVmb3JlIGl0IGlzIHBlcmZlY3RseSBhY2NlcHRhYmxlCisvLy8gICAgIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbnN0YWxsIHRoZSA4Qml0IGhhbmRsZXIgdGhlbiBvdmVycmlkZSBqdXN0IHRob3NlIGZ1bmN0aW9ucworLy8vICAgICB0aGF0IHdvdWxkIG5vdCB3b3JrIGZvciB0aGUgcGFydGljdWxhciBpbnB1dCBlbmNvZGluZywgc3VjaCBhcyBjb25zdW1lIGZvciBpbnN0YW5jZS4KKy8vLyAKK3ZvaWQgCithbnRscjM4Qml0U2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KQoreworICAgIC8vIEJ1aWxkIGEgc3RyaW5nIGZhY3RvcnkgZm9yIHRoaXMgc3RyZWFtCisgICAgLy8KKyAgICBpbnB1dC0+c3RyRmFjdG9yeQk9IGFudGxyM1N0cmluZ0ZhY3RvcnlOZXcoaW5wdXQtPmVuY29kaW5nKTsKKworICAgIC8vIERlZmF1bHQgc3RyZWFtIEFQSSBzZXQgdXAgaXMgZm9yIDhCaXQsIHNvIHdlIGFyZSBkb25lCisgICAgLy8KK30KKwordm9pZAorYW50bHIzR2VuZXJpY1NldHVwU3RyZWFtICAocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisgICAgLyogSW5zdGFsbCBmdW5jdGlvbiBwb2ludGVycyBmb3IgYW4gOCBiaXQgaW5wdXQKKyAgICAgKi8KKworICAgIC8qIEFsbG9jYXRlIHN0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBpbnB1dC0+aXN0cmVhbQkJPSBhbnRscjNJbnRTdHJlYW1OZXcoKTsKKyAgICBpbnB1dC0+aXN0cmVhbS0+dHlwZSAgICAgICAgPSBBTlRMUjNfQ0hBUlNUUkVBTTsKKyAgICBpbnB1dC0+aXN0cmVhbS0+c3VwZXIgICAgICAgPSBpbnB1dDsKKworICAgIC8qIEludHN0cmVhbSBBUEkKKyAgICAgKi8KKyAgICBpbnB1dC0+aXN0cmVhbS0+Y29uc3VtZQkgICAgPSBhbnRscjM4Qml0Q29uc3VtZTsJICAgIC8vIENvbnN1bWUgdGhlIG5leHQgOCBiaXQgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIJCQkKKyAgICBpbnB1dC0+aXN0cmVhbS0+X0xBCQkgICAgPSBhbnRscjM4Qml0TEE7CSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgVVRGMzIgY2hhcmFjdGVyIGF0IG9mZnNldCBuICgxIGJhc2VkKQkJCQorICAgIGlucHV0LT5pc3RyZWFtLT5pbmRleAkgICAgPSBhbnRscjM4Qml0SW5kZXg7CSAgICAgICAgICAgIC8vIEN1cnJlbnQgaW5kZXggKG9mZnNldCBmcm9tIGZpcnN0IGNoYXJhY3RlcgkJCSAgICAKKyAgICBpbnB1dC0+aXN0cmVhbS0+bWFyawkgICAgPSBhbnRscjM4Qml0TWFyazsJCSAgICAvLyBSZWNvcmQgdGhlIGN1cnJlbnQgbGV4IHN0YXRlIGZvciBsYXRlciByZXN0b3JlCQkJCisgICAgaW5wdXQtPmlzdHJlYW0tPnJld2luZAkgICAgPSBhbnRscjM4Qml0UmV3aW5kOwkgICAgICAgICAgICAvLyBIb3cgdG8gcmV3aW5kIHRoZSBpbnB1dAkJCQkJCQkJCQorICAgIGlucHV0LT5pc3RyZWFtLT5yZXdpbmRMYXN0CSAgICA9IGFudGxyMzhCaXRSZXdpbmRMYXN0OwkgICAgLy8gSG93IHRvIHJld2luZCB0aGUgaW5wdXQJCQkJCQkJCQkKKyAgICBpbnB1dC0+aXN0cmVhbS0+c2VlawkgICAgPSBhbnRscjM4Qml0U2VlazsJCSAgICAvLyBIb3cgdG8gc2VlayB0byBhIHNwZWNpZmljIHBvaW50IGluIHRoZSBzdHJlYW0JCSAgICAKKyAgICBpbnB1dC0+aXN0cmVhbS0+cmVsZWFzZQkgICAgPSBhbnRscjM4Qml0UmVsZWFzZTsJICAgIC8vIFJlc2V0IG1hcmtzIGFmdGVyIG1hcmsgbgkJCQkJCQkJCQorICAgIGlucHV0LT5pc3RyZWFtLT5nZXRTb3VyY2VOYW1lICAgPSBhbnRscjM4Qml0R2V0U291cmNlTmFtZTsgICAgICAvLyBSZXR1cm4gYSBzdHJpbmcgdGhhdCBuYW1lcyB0aGUgaW5wdXQgc291cmNlCisKKyAgICAvKiBDaGFyc3RyZWFtIEFQSQorICAgICAqLworICAgIGlucHV0LT5jbG9zZQkJICAgID0gIGFudGxyM0lucHV0Q2xvc2U7CSAgICAvLyBDbG9zZSBkb3duIHRoZSBzdHJlYW0gY29tcGxldGVseQkJCQkJCQkJCQkKKyAgICBpbnB1dC0+ZnJlZQkJCSAgICA9ICBhbnRscjNJbnB1dENsb3NlOwkgICAgLy8gU3lub255bSBmb3IgZnJlZQkJCQkJCQkJCQkJCQkJCisgICAgaW5wdXQtPnJlc2V0CQkgICAgPSAgYW50bHIzSW5wdXRSZXNldDsJICAgIC8vIFJlc2V0IGlucHV0IHRvIHN0YXJ0CQorICAgIGlucHV0LT5yZXVzZSAgICAgICAgICAgICAgICAgICAgPSAgYW50bHIzOEJpdFJldXNlOyAgICAgICAgICAgICAvLyBJbnN0YWxsIGEgbmV3IGlucHV0IHN0cmluZyBhbmQgcmVzZXQKKyAgICBpbnB1dC0+X0xUCQkJICAgID0gIGFudGxyMzhCaXRMVDsJCSAgICAvLyBTYW1lIGFzIF9MQSBmb3IgOCBiaXQgZmlsZQkJCQkJCQkJCQkKKyAgICBpbnB1dC0+c2l6ZQkJCSAgICA9ICBhbnRscjM4Qml0U2l6ZTsJCSAgICAvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlcgkJCQkJCQkJCQorICAgIGlucHV0LT5zdWJzdHIJCSAgICA9ICBhbnRscjM4Qml0U3Vic3RyOwkgICAgLy8gUmV0dXJuIGEgc3RyaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbQkJCQkJCQkJCisgICAgaW5wdXQtPmdldExpbmUJCSAgICA9ICBhbnRscjM4Qml0R2V0TGluZTsJICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBsaW5lIG51bWJlciBpbiB0aGUgaW5wdXQgc3RyZWFtCQkJCQkKKyAgICBpbnB1dC0+Z2V0TGluZUJ1ZgkJICAgID0gIGFudGxyMzhCaXRHZXRMaW5lQnVmOwkgICAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZSBiZWluZyBjb25zdW1lZAkgICAgCisgICAgaW5wdXQtPmdldENoYXJQb3NpdGlvbkluTGluZSAgICA9ICBhbnRscjM4Qml0R2V0Q2hhclBvc2l0aW9uOyAgIC8vIFJldHVybiB0aGUgb2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgbGluZSBvZiBpbnB1dAkJCQkJCQorICAgIGlucHV0LT5zZXRMaW5lCQkgICAgPSAgYW50bHIzOEJpdFNldExpbmU7CSAgICAvLyBTZXQgdGhlIGlucHV0IHN0cmVhbSBsaW5lIG51bWJlciAoZG9lcyBub3Qgc2V0IGJ1ZmZlciBwb2ludGVycykJICAgIAorICAgIGlucHV0LT5zZXRDaGFyUG9zaXRpb25JbkxpbmUgICAgPSAgYW50bHIzOEJpdFNldENoYXJQb3NpdGlvbjsgICAvLyBTZXQgdGhlIG9mZnNldCBpbiB0byB0aGUgY3VycmVudCBsaW5lIChkb2VzIG5vdCBzZXQgYW55IHBvaW50ZXJzKSAgIAorICAgIGlucHV0LT5TZXROZXdMaW5lQ2hhcgkgICAgPSAgYW50bHIzOEJpdFNldE5ld0xpbmVDaGFyOyAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBuZXdsaW5lIHRyaWdnZXIgY2hhcmFjdGVyCQkJCQkJCisgICAgaW5wdXQtPnNldFVjYXNlTEEJCSAgICA9ICBhbnRscjM4Qml0U2V0VWNhc2VMQTsgICAgICAgIC8vIENoYW5nZXMgdGhlIExBIGZ1bmN0aW9uIHRvIHJldHVybiB1cHBlciBjYXNlIGFsd2F5cworCisgICAgaW5wdXQtPmNoYXJCeXRlU2l6ZQkJICAgID0gMTsJCS8vIFNpemUgaW4gYnl0ZXMgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHN0cmVhbS4KKworICAgIC8qIEluaXRpYWxpemUgZW50cmllcyBmb3IgdGFibGVzIGV0YworICAgICAqLworICAgIGlucHV0LT5tYXJrZXJzICA9IE5VTEw7CisKKyAgICAvKiBTZXQgdXAgdGhlIGlucHV0IHN0cmVhbSBicmFuZCBuZXcKKyAgICAgKi8KKyAgICBpbnB1dC0+cmVzZXQoaW5wdXQpOworICAgIAorICAgIC8qIEluc3RhbGwgZGVmYXVsdCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIgKGl0IGNhbiBiZSByZXBsYWNlZAorICAgICAqIGJ5IHRoZSBncmFtbWFyIHByb2dyYW1tZXIgbGF0ZXIpCisgICAgICovCisgICAgaW5wdXQtPlNldE5ld0xpbmVDaGFyKGlucHV0LCAoQU5UTFIzX1VDSEFSKSdcbicpOworfQorCitzdGF0aWMgcEFOVExSM19TVFJJTkcKK2FudGxyMzhCaXRHZXRTb3VyY2VOYW1lKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKwlyZXR1cm4JaXMtPnN0cmVhbU5hbWU7Cit9CisKKy8qKiBcYnJpZWYgQ2xvc2UgZG93biBhbiBpbnB1dCBzdHJlYW0gYW5kIGZyZWUgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYnkgaXQuCisgKgorICogXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqLworc3RhdGljIHZvaWQKK2FudGxyM0lucHV0Q2xvc2UocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisgICAgLy8gQ2xvc2UgYW55IG1hcmtlcnMgaW4gdGhlIGlucHV0IHN0cmVhbQorICAgIC8vCisgICAgaWYJKGlucHV0LT5tYXJrZXJzICE9IE5VTEwpCisgICAgeworCQlpbnB1dC0+bWFya2Vycy0+ZnJlZShpbnB1dC0+bWFya2Vycyk7CisJCWlucHV0LT5tYXJrZXJzID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBDbG9zZSB0aGUgc3RyaW5nIGZhY3RvcnkKKyAgICAvLworICAgIGlmCShpbnB1dC0+c3RyRmFjdG9yeSAhPSBOVUxMKQorICAgIHsKKwkJaW5wdXQtPnN0ckZhY3RvcnktPmNsb3NlKGlucHV0LT5zdHJGYWN0b3J5KTsKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoZSBpbnB1dCBzdHJlYW0gYnVmZmVyIGlmIHdlIGFsbG9jYXRlZCBpdAorICAgIC8vCisgICAgaWYJKGlucHV0LT5pc0FsbG9jYXRlZCAmJiBpbnB1dC0+ZGF0YSAhPSBOVUxMKQorICAgIHsKKwkJQU5UTFIzX0ZSRUUoaW5wdXQtPmRhdGEpOworCQlpbnB1dC0+ZGF0YSA9IE5VTEw7CisgICAgfQorICAgIAorICAgIGlucHV0LT5pc3RyZWFtLT5mcmVlKGlucHV0LT5pc3RyZWFtKTsKKworICAgIC8vIEZpbmFsbHksIGZyZWUgdGhlIHNwYWNlIGZvciB0aGUgc3RydWN0dXJlIGl0c2VsZgorICAgIC8vCisgICAgQU5UTFIzX0ZSRUUoaW5wdXQpOworCisgICAgLy8gRG9uZQorICAgIC8vCit9CisKK3N0YXRpYyB2b2lkCQkKK2FudGxyMzhCaXRTZXRVY2FzZUxBCQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19CT09MRUFOIGZsYWcpCit7CisJaWYJKGZsYWcpCisJeworCQkvLyBSZXR1cm4gdGhlIHVwcGVyIGNhc2UgdmVyc2lvbiBvZiB0aGUgY2hhcmFjdGVycworCQkvLworCQlpbnB1dC0+aXN0cmVhbS0+X0xBCQkgICAgPSAgYW50bHIzOEJpdExBX3VjYXNlOworCX0KKwllbHNlCisJeworCQkvLyBSZXR1cm4gdGhlIHJhdyBjaGFyYWN0ZXJzIGFzIHRoZXkgYXJlIGluIHRoZSBidWZmZXIKKwkJLy8KKwkJaW5wdXQtPmlzdHJlYW0tPl9MQQkJICAgID0gIGFudGxyMzhCaXRMQTsKKwl9Cit9CisKKworLyoqIFxicmllZiBSZXNldCBhIHJlLXN0YXJ0YWJsZSBpbnB1dCBzdHJlYW0gdG8gdGhlIHN0YXJ0CisgKgorICogXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqLworc3RhdGljIHZvaWQKK2FudGxyM0lucHV0UmVzZXQocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisKKyAgICBpbnB1dC0+bmV4dENoYXIJCT0gaW5wdXQtPmRhdGE7CS8qIElucHV0IGF0IGZpcnN0IGNoYXJhY3RlciAqLworICAgIGlucHV0LT5saW5lCQkJPSAxOwkJLyogc3RhcnRzIGF0IGxpbmUgMQkgICAgKi8KKyAgICBpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lCT0gLTE7CisgICAgaW5wdXQtPmN1cnJlbnRMaW5lCQk9IGlucHV0LT5kYXRhOworICAgIGlucHV0LT5tYXJrRGVwdGgJCT0gMDsJCS8qIFJlc2V0IG1hcmtlcnMJICAgICovCisgICAgCisgICAgLyogQ2xlYXIgb3V0IHVwIHRoZSBtYXJrZXJzIHRhYmxlIGlmIGl0IGlzIHRoZXJlCisgICAgICovCisgICAgaWYJKGlucHV0LT5tYXJrZXJzICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnB1dC0+bWFya2Vycy0+Y2xlYXIoaW5wdXQtPm1hcmtlcnMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBJbnN0YWxsIGEgbmV3IG1hcmtlcnMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIGlucHV0LT5tYXJrZXJzICA9IGFudGxyM1ZlY3Rvck5ldygwKTsKKyAgICB9Cit9CisKKy8qKiBJbnN0YWxsIGEgbmV3IHNvdXJjZSBjb2RlIGluIHRvIGEgd29ya2luZyBpbnB1dCBzdHJlYW0gc28gdGhhdCB0aGUKKyAqICBpbnB1dCBzdHJlYW0gY2FuIGJlIHJldXNlZC4KKyAqLworc3RhdGljIHZvaWQKK2FudGxyMzhCaXRSZXVzZShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCwgcEFOVExSM19VSU5UOCBpblN0cmluZywgQU5UTFIzX1VJTlQzMiBzaXplLCBwQU5UTFIzX1VJTlQ4IG5hbWUpCit7CisgICAgaW5wdXQtPmlzQWxsb2NhdGVkCT0gQU5UTFIzX0ZBTFNFOworICAgIGlucHV0LT5kYXRhCQk9IGluU3RyaW5nOworICAgIGlucHV0LT5zaXplQnVmCT0gc2l6ZTsKKyAgICAKKyAgICAvLyBOb3cgd2UgY2FuIHNldCB1cCB0aGUgZmlsZSBuYW1lLiBBcyB3ZSBhcmUgcmV1c2luZyB0aGUgc3RyZWFtLCB0aGVyZSBtYXkgYWxyZWFkeQorICAgIC8vIGJlIGEgc3RyaW5nIHRoYXQgd2UgY2FuIHJldXNlIGZvciBob2xkaW5nIHRoZSBmaWxlbmFtZS4KKyAgICAvLworCWlmCShpbnB1dC0+aXN0cmVhbS0+c3RyZWFtTmFtZSA9PSBOVUxMKSAKKwl7CisJCWlucHV0LT5pc3RyZWFtLT5zdHJlYW1OYW1lCT0gaW5wdXQtPnN0ckZhY3RvcnktPm5ld1N0cihpbnB1dC0+c3RyRmFjdG9yeSwgbmFtZSA9PSBOVUxMID8gKHBBTlRMUjNfVUlOVDgpIi1tZW1vcnktIiA6IG5hbWUpOworCQlpbnB1dC0+ZmlsZU5hbWUJCT0gaW5wdXQtPmlzdHJlYW0tPnN0cmVhbU5hbWU7CisJfQorCWVsc2UKKwl7CisJCWlucHV0LT5pc3RyZWFtLT5zdHJlYW1OYW1lLT5zZXQoaW5wdXQtPmlzdHJlYW0tPnN0cmVhbU5hbWUsICAobmFtZSA9PSBOVUxMID8gKGNvbnN0IGNoYXIgKikiLW1lbW9yeS0iIDogKGNvbnN0IGNoYXIgKiluYW1lKSk7CisJfQorCisgICAgaW5wdXQtPnJlc2V0KGlucHV0KTsKK30KKworLyoqIFxicmllZiBDb25zdW1lIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBhbiA4IGJpdCBpbnB1dCBzdHJlYW0KKyAqCisgKiBccGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZAorYW50bHIzOEJpdENvbnN1bWUocEFOVExSM19JTlRfU1RSRUFNIGlzKQoreworICAgIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0OworCisgICAgaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKworICAgIGlmCSgocEFOVExSM19VSU5UOCkoaW5wdXQtPm5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgIHsJCisJLyogSW5kaWNhdGUgb25lIG1vcmUgY2hhcmFjdGVyIGluIHRoaXMgbGluZQorCSAqLworCWlucHV0LT5jaGFyUG9zaXRpb25JbkxpbmUrKzsKKwkKKwlpZiAgKChBTlRMUjNfVUNIQVIpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSkgPT0gaW5wdXQtPm5ld2xpbmVDaGFyKQorCXsKKwkgICAgLyogUmVzZXQgZm9yIHN0YXJ0IG9mIGEgbmV3IGxpbmUgb2YgaW5wdXQKKwkgICAgICovCisJICAgIGlucHV0LT5saW5lKys7CisJICAgIGlucHV0LT5jaGFyUG9zaXRpb25JbkxpbmUJPSAwOworCSAgICBpbnB1dC0+Y3VycmVudExpbmUJCT0gKHZvaWQgKikoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKwl9CisKKwkvKiBJbmNyZW1lbnQgdG8gbmV4dCBjaGFyYWN0ZXIgcG9zaXRpb24KKwkgKi8KKwlpbnB1dC0+bmV4dENoYXIgPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSArIDEpOworICAgIH0KK30KKworLyoqIFxicmllZiBSZXR1cm4gdGhlIGlucHV0IGVsZW1lbnQgYXNzdW1pbmcgYW4gOCBiaXQgYXNjaWkgaW5wdXQKKyAqCisgKiBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gbGEgMSBiYXNlZCBvZmZzZXQgb2YgbmV4dCBpbnB1dCBzdHJlYW0gZWxlbWVudAorICoKKyAqIFxyZXR1cm4gTmV4dCBpbnB1dCBjaGFyYWN0ZXIgaW4gaW50ZXJuYWwgQU5UTFIzIGVuY29kaW5nIChVVEYzMikKKyAqLworc3RhdGljIEFOVExSM19VQ0hBUiAKK2FudGxyMzhCaXRMQShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSkKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKwkKKyAgICBpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgaWYJKCggKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcikgKyBsYSAtIDEpID49ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgIHsKKwkJcmV0dXJuCUFOVExSM19DSEFSU1RSRUFNX0VPRjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJcmV0dXJuCShBTlRMUjNfVUNIQVIpKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgbGEgLSAxKSk7CisgICAgfQorfQorCisvKiogXGJyaWVmIFJldHVybiB0aGUgaW5wdXQgZWxlbWVudCBhc3N1bWluZyBhbiA4IGJpdCBpbnB1dCBhbmQKKyAqICAgICAgICAgYWx3YXlzIHJldHVybiB0aGUgVVBQRVIgQ0FTRSBjaGFyYWN0ZXIuCisgKgkJICAgTm90ZSB0aGF0IHRoaXMgaXMgOCBiaXQgYW5kIHNvIHdlIGFzc3VtZSB0aGF0IHRoZSB0b3VwcGVyCisgKgkJICAgZnVuY3Rpb24gd2lsbCB1c2UgdGhlIGNvcnJlY3QgbG9jYWxlIGZvciA4IGJpdHMuCisgKgorICogXHBhcmFtW2luXSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisgKiBccGFyYW1baW5dIGxhIDEgYmFzZWQgb2Zmc2V0IG9mIG5leHQgaW5wdXQgc3RyZWFtIGVsZW1lbnQKKyAqCisgKiBccmV0dXJuIE5leHQgaW5wdXQgY2hhcmFjdGVyIGluIGludGVybmFsIEFOVExSMyBlbmNvZGluZyAoVVRGMzIpCisgKi8KK3N0YXRpYyBBTlRMUjNfVUNIQVIKK2FudGxyMzhCaXRMQV91Y2FzZQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpCit7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisJCisgICAgaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKworICAgIGlmCSgoICgocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIpICsgbGEgLSAxKSA+PSAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKyAgICB7CisJCXJldHVybglBTlRMUjNfQ0hBUlNUUkVBTV9FT0Y7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCXJldHVybgkoQU5UTFIzX1VDSEFSKXRvdXBwZXIoKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgbGEgLSAxKSkpOworICAgIH0KK30KKworCisvKiogXGJyaWVmIFJldHVybiB0aGUgaW5wdXQgZWxlbWVudCBhc3N1bWluZyBhbiA4IGJpdCBhc2NpaSBpbnB1dAorICoKKyAqIFxwYXJhbVtpbl0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICogXHBhcmFtW2luXSBsdCAxIGJhc2VkIG9mZnNldCBvZiBuZXh0IGlucHV0IHN0cmVhbSBlbGVtZW50CisgKgorICogXHJldHVybiBOZXh0IGlucHV0IGNoYXJhY3RlciBpbiBpbnRlcm5hbCBBTlRMUjMgZW5jb2RpbmcgKFVURjMyKQorICovCitzdGF0aWMgdm9pZCAqIAorYW50bHIzOEJpdExUKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfSU5UMzIgbHQpCit7CisgICAgLyogQ2FzdGluZyBpcyBob3JyaWJsZSBidXQgaXQgbWVhbnMgbm8gd2FybmluZ3MgYW5kIExUIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKKyAgICAgKiBvbiBhIGNoYXJhY3RlciBzdHJlYW0gYW55d2F5IEkgdGhpbmsuIElmIGl0IGlzIHRoZW4sIHRoZSB2b2lkICogd2lsbCBuZWVkIHRvIGJlIAorICAgICAqIGNhc3QgYmFjayBpbiBhIHNpbWlsYXIgbWFubmVyLiBZdWNrISBCdXQgdGhpcyBtZWFucyB0aGF0IExUIGZvciBUb2tlbiBzdHJlYW1zIGFuZAorICAgICAqIHRyZWUgc3RyZWFtcyBpcyBjb3JyZWN0LgorICAgICAqLworICAgIHJldHVybiAoQU5UTFIzX0ZVTkNfUFRSKGlucHV0LT5pc3RyZWFtLT5fTEEoaW5wdXQtPmlzdHJlYW0sIGx0KSkpOworfQorCisvKiogXGJyaWVmIENhbGN1bGF0ZSB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqIFxwYXJhbVtpbl0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICovCitzdGF0aWMgQU5UTFIzX01BUktFUgorYW50bHIzOEJpdEluZGV4KHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworICAgIGlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisKKyAgICByZXR1cm4gIChBTlRMUjNfTUFSS0VSKSgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSk7Cit9CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgYXMgYW4gOEJpdCBmaWxlCisgKiAgIHdoaWNoIGluIHRoaXMgY2FzZSBpcyB0aGUgdG90YWwgaW5wdXQuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZQorICogICBtb3JlIHNvcGhpc3RpY2F0ZWQgaW1wbGVtZW50YXRpb25zIHRvIGRlYWwgd2l0aCBub24tcmVjb3ZlcmFibGUgc3RyZWFtcyAKKyAqICAgYW5kIHNvIG9uLgorICoKKyAqIFxwYXJhbVtpbl0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICovCitzdGF0aWMJQU5UTFIzX1VJTlQzMiAKK2FudGxyMzhCaXRTaXplKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KQoreworICAgIHJldHVybiAgaW5wdXQtPnNpemVCdWY7Cit9CisKKy8qKiBcYnJpZWYgTWFyayB0aGUgY3VycmVudCBpbnB1dCBwb2ludCBpbiBhbiA4Qml0IDggYml0IHN0cmVhbQorICogIHN1Y2ggYXMgYSBmaWxlIHN0cmVhbSwgd2hlcmUgYWxsIHRoZSBpbnB1dCBpcyBhdmFpbGFibGUgaW4gdGhlCisgKiAgYnVmZmVyLgorICoKKyAqIFxwYXJhbVtpbl0gaXMgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICovCitzdGF0aWMgQU5UTFIzX01BUktFUgorYW50bHIzOEJpdE1hcmsJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX0xFWF9TVEFURQkgICAgc3RhdGU7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gICAgaW5wdXQ7CisKKyAgICBpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgLyogTmV3IG1hcmsgcG9pbnQgCisgICAgICovCisgICAgaW5wdXQtPm1hcmtEZXB0aCsrOworCisgICAgLyogU2VlIGlmIHdlIGFyZSByZXZpc2l0aW5nIGEgbWFyayBhcyB3ZSBjYW4ganVzdCByZXVzZSB0aGUgdmVjdG9yCisgICAgICogZW50cnkgaWYgd2UgYXJlLCBvdGhlcndpc2UsIHdlIG5lZWQgYSBuZXcgb25lCisgICAgICovCisgICAgaWYJKGlucHV0LT5tYXJrRGVwdGggPiBpbnB1dC0+bWFya2Vycy0+Y291bnQpCisgICAgewkKKwlzdGF0ZQk9IEFOVExSM19NQUxMT0Moc2l6ZW9mKEFOVExSM19MRVhfU1RBVEUpKTsKKworCS8qIEFkZCBpdCB0byB0aGUgdGFibGUKKwkgKi8KKwlpbnB1dC0+bWFya2Vycy0+YWRkKGlucHV0LT5tYXJrZXJzLCBzdGF0ZSwgQU5UTFIzX0ZSRUVfRlVOQyk7CS8qIE5vIHNwZWNpYWwgc3RydWN0dXJlLCBqdXN0IGZyZWUoKSBvbiBkZWxldGUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzdGF0ZQk9IChwQU5UTFIzX0xFWF9TVEFURSlpbnB1dC0+bWFya2Vycy0+Z2V0KGlucHV0LT5tYXJrZXJzLCBpbnB1dC0+bWFya0RlcHRoIC0gMSk7CisKKwkvKiBBc3N1bWUgbm8gZXJyb3JzIGZvciBzcGVlZCwgaXQgd2lsbCBqdXN0IGJsb3cgdXAgaWYgdGhlIHRhYmxlIGZhaWxlZAorCSAqIGZvciBzb21lIHJlYXNvbnMsIGhlbmNlIGxvdHMgb2YgdW5pdCB0ZXN0cyBvbiB0aGUgdGFibGVzIDstKQorCSAqLworICAgIH0KKworICAgIC8qIFdlIGhhdmUgY3JlYXRlZCBvciByZXRyaWV2ZWQgdGhlIHN0YXRlLCBzbyB1cGRhdGUgaXQgd2l0aCB0aGUgY3VycmVudAorICAgICAqIGVsZW1lbnRzIG9mIHRoZSBsZXhlciBzdGF0ZS4KKyAgICAgKi8KKyAgICBzdGF0ZS0+Y2hhclBvc2l0aW9uSW5MaW5lCT0gaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZTsKKyAgICBzdGF0ZS0+Y3VycmVudExpbmUJCT0gaW5wdXQtPmN1cnJlbnRMaW5lOworICAgIHN0YXRlLT5saW5lCQkJPSBpbnB1dC0+bGluZTsKKyAgICBzdGF0ZS0+bmV4dENoYXIJCT0gaW5wdXQtPm5leHRDaGFyOworCisgICAgaXMtPmxhc3RNYXJrZXIgID0gaW5wdXQtPm1hcmtEZXB0aDsKKworICAgIC8qIEFuZCB0aGF0J3MgaXQKKyAgICAgKi8KKyAgICByZXR1cm4gIGlucHV0LT5tYXJrRGVwdGg7Cit9CisvKiogXGJyaWVmIFJld2luZCB0aGUgbGV4ZXIgaW5wdXQgdG8gdGhlIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgbGFzdCBwcm9kdWNlZCBtYXJrLgorICogCisgKiBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqCisgKiBccmVtYXJrCisgKiBBc3N1bWVzIDggQml0IGlucHV0IHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQKK2FudGxyMzhCaXRSZXdpbmRMYXN0CShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisgICAgaXMtPnJld2luZChpcywgaXMtPmxhc3RNYXJrZXIpOworfQorCisvKiogXGJyaWVmIFJld2luZCB0aGUgbGV4ZXIgaW5wdXQgdG8gdGhlIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgbWFyay4KKyAqIAorICogXHBhcmFtW2luXSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisgKgorICogXHJlbWFyaworICogQXNzdW1lcyA4IEJpdCBpbnB1dCBzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkCithbnRscjM4Qml0UmV3aW5kCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19NQVJLRVIgbWFyaykKK3sKKyAgICBwQU5UTFIzX0xFWF9TVEFURQlzdGF0ZTsKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworICAgIGlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSBpcy0+c3VwZXIpOworCisgICAgLyogUGVyZm9ybSBhbnkgY2xlYW4gdXAgb2YgdGhlIG1hcmtzCisgICAgICovCisgICAgaW5wdXQtPmlzdHJlYW0tPnJlbGVhc2UoaW5wdXQtPmlzdHJlYW0sIG1hcmspOworCisgICAgLyogRmluZCB0aGUgc3VwcGxpZWQgbWFyayBzdGF0ZSAKKyAgICAgKi8KKyAgICBzdGF0ZSAgID0gKHBBTlRMUjNfTEVYX1NUQVRFKWlucHV0LT5tYXJrZXJzLT5nZXQoaW5wdXQtPm1hcmtlcnMsIChBTlRMUjNfVUlOVDMyKShtYXJrIC0gMSkpOworCisgICAgLyogU2VlayBpbnB1dCBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgcG9pbnQgKG5vdGUgd2Ugc3VwcGx5IHRoZSB2b2lkICpwb2ludGVyCisgICAgICogdG8gd2hhdGV2ZXIgaXMgaW1wbGVtZW50aW5nIHRoZSBpbnQgc3RyZWFtIHRvIHNlZWspLgorICAgICAqLworICAgIGFudGxyMzhCaXRTZWVrKGlzLCAoQU5UTFIzX01BUktFUikoc3RhdGUtPm5leHRDaGFyKSk7CisKKyAgICAvKiBSZXNldCB0byB0aGUgcmVzZXQgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBtYXJrCisgICAgICovCisgICAgaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZQk9IHN0YXRlLT5jaGFyUG9zaXRpb25JbkxpbmU7CisgICAgaW5wdXQtPmN1cnJlbnRMaW5lCQk9IHN0YXRlLT5jdXJyZW50TGluZTsKKyAgICBpbnB1dC0+bGluZQkJCT0gc3RhdGUtPmxpbmU7CisgICAgaW5wdXQtPm5leHRDaGFyCQk9IHN0YXRlLT5uZXh0Q2hhcjsKKworICAgIC8qIEFuZCB3ZSBhcmUgZG9uZQorICAgICAqLworfQorCisvKiogXGJyaWVmIFJld2luZCB0aGUgbGV4ZXIgaW5wdXQgdG8gdGhlIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgbWFyay4KKyAqIAorICogXHBhcmFtW2luXSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisgKgorICogXHJlbWFyaworICogQXNzdW1lcyA4IEJpdCBpbnB1dCBzdHJlYW0uCisgKi8KK3N0YXRpYyB2b2lkCithbnRscjM4Qml0UmVsZWFzZQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIG1hcmspCit7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisKKyAgICBpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgLyogV2UgZG9uJ3QgZG8gbXVjaCBoZXJlIGluIGZhY3QgYXMgd2UgbmV2ZXIgZnJlZSBhbnkgaGlnaGVyIG1hcmtzIGluCisgICAgICogdGhlIGhhc2h0YWJsZSBhcyB3ZSBqdXN0IHJlc3VzZSBhbnkgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlbS4KKyAgICAgKi8KKyAgICBpbnB1dC0+bWFya0RlcHRoCT0gKEFOVExSM19VSU5UMzIpKG1hcmsgLSAxKTsKK30KKworLyoqIFxicmllZiBSZXdpbmQgdGhlIGxleGVyIGlucHV0IHRvIHRoZSBzdGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkIG1hcmsuCisgKiAKKyAqIFxwYXJhbVtpbl0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICoKKyAqIFxyZW1hcmsKKyAqIEFzc3VtZXMgOCBCaXQgaW5wdXQgc3RyZWFtLgorICovCitzdGF0aWMgdm9pZAorYW50bHIzOEJpdFNlZWsJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBzZWVrUG9pbnQpCit7CisJQU5UTFIzX0lOVDMyICAgY291bnQ7CisJcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisKKwlpbnB1dCAgID0gQU5UTFIzX0ZVTkNfUFRSKCgocEFOVExSM19JTlBVVF9TVFJFQU0pIGlzLT5zdXBlcikpOworCisJLyogSWYgdGhlIHJlcXVlc3RlZCBzZWVrIHBvaW50IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudAorCSogaW5wdXQgcG9pbnQsIHRoZW4gd2UgYXNzdW1lIHRoYXQgd2UgYXJlIHJlc2V0dGluZyBmcm9tIGEgbWFyaworCSogYW5kIGRvIG5vdCBuZWVkIHRvIHNjYW4sIGJ1dCBjYW4ganVzdCBzZXQgdG8gdGhlcmUuCisJKi8KKwlpZgkoc2Vla1BvaW50IDw9IChBTlRMUjNfTUFSS0VSKShpbnB1dC0+bmV4dENoYXIpKQorCXsKKwkJaW5wdXQtPm5leHRDaGFyCT0gKChwQU5UTFIzX1VJTlQ4KSBzZWVrUG9pbnQpOworCX0KKwllbHNlCisJeworCQljb3VudAk9IChBTlRMUjNfVUlOVDMyKShzZWVrUG9pbnQgLSAoQU5UTFIzX01BUktFUikoaW5wdXQtPm5leHRDaGFyKSk7CisKKwkJd2hpbGUgKGNvdW50LS0pCisJCXsKKwkJCWlzLT5jb25zdW1lKGlzKTsKKwkJfQorCX0KK30KKy8qKiBSZXR1cm4gYSBzdWJzdHJpbmcgb2YgdGhlIDggYml0IGlucHV0IHN0cmVhbSBpbgorICogIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxwYXJhbSBzdGFydCBPZmZzZXQgaW4gaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSBzdHJpbmcgc3RhcnRzCisgKiBccGFyYW0gc3RvcCAgT2Zmc2V0IGluIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIHN0cmluZyBlbmRzLgorICovCitzdGF0aWMgcEFOVExSM19TVFJJTkcKK2FudGxyMzhCaXRTdWJzdHIJCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCwgQU5UTFIzX01BUktFUiBzdGFydCwgQU5UTFIzX01BUktFUiBzdG9wKQoreworCXJldHVybiAgaW5wdXQtPnN0ckZhY3RvcnktPm5ld1B0cihpbnB1dC0+c3RyRmFjdG9yeSwgKHBBTlRMUjNfVUlOVDgpc3RhcnQsIChBTlRMUjNfVUlOVDMyKShzdG9wIC0gc3RhcnQgKyAxKSk7Cit9CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBsaW5lIG51bWJlciBhcyB1bmRlcnN0b29kIGJ5IHRoZSA4IGJpdCBpbnB1dCBzdHJlYW0uCisgKgorICogXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxyZXR1cm4JTGluZSBudW1iZXIgaW4gaW5wdXQgc3RyZWFtIHRoYXQgd2UgYmVsaWV2ZSB3ZSBhcmUgd29ya2luZyBvbi4KKyAqLworc3RhdGljIEFOVExSM19VSU5UMzIgICAKK2FudGxyMzhCaXRHZXRMaW5lCQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisgICAgcmV0dXJuICBpbnB1dC0+bGluZTsKK30KKworLyoqIFJldHVybiBhIHBvaW50ZXIgaW50byB0aGUgaW5wdXQgc3RyZWFtIHRoYXQgcG9pbnRzIGF0IHRoZSBzdGFydAorICogIG9mIHRoZSBjdXJyZW50IGlucHV0IGxpbmUgYXMgdHJpZ2dlcmVkIGJ5IHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgaW5zdGFsbGVkCisgKiAgZm9yIHRoZSBzdHJlYW0gKCdcbicgdW5sZXNzIHRvbGQgZGlmZmVyZW50bHkpLgorICoKKyAqIFxwYXJhbVtpbl0gaW5wdXQgCisgKi8KK3N0YXRpYyB2b2lkCSAgKiAKK2FudGxyMzhCaXRHZXRMaW5lQnVmCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCkKK3sKKyAgICByZXR1cm4gIGlucHV0LT5jdXJyZW50TGluZTsKK30KKworLyoqIFJldHVybiB0aGUgY3VycmVudCBvZmZzZXQgaW4gdG8gdGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICoKKyAqIFxwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisgKiBccmV0dXJuICAgICAgQ3VycmVudCBsaW5lIG9mZnNldAorICovCitzdGF0aWMgQU5UTFIzX1VJTlQzMgorYW50bHIzOEJpdEdldENoYXJQb3NpdGlvbgkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisgICAgcmV0dXJuICBpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lOworfQorCisvKiogU2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGlucHV0IHN0cmVhbS4KKyAqCisgKiBccGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICogXHBhcmFtIGxpbmUgIExpbmUgbnVtYmVyIHRvIHRlbGwgdGhlIGlucHV0IHN0cmVhbSB3ZSBhcmUgb24KKyAqCisgKiBccmVtYXJrCisgKiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgYW55IHBvaW50ZXJzLCBpdCBqdXN0IGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBzZXQgdGhlCisgKiAgbGluZSBudW1iZXIgYWNjb3JkaW5nIHRvIHNvbWUgZXh0ZXJuYWwgY3JpdGVyaW9uLCBzdWNoIGFzIGZpbmRpbmcgYSBsZXhlZCBkaXJlY3RpdmUKKyAqICBsaWtlOiAjbm5uICJmaWxlLmMiIGZvciBpbnN0YW5jZSwgc3VjaCB0aGF0IGVycm9yIHJlcG9ydGluZyBhbmQgc28gb24gaW4gaXMgaW4gc3luYworICogIHdpdGggc29tZSBvcmlnaW5hbCBzb3VyY2UgZm9ybWF0LgorICovCitzdGF0aWMgdm9pZAorYW50bHIzOEJpdFNldExpbmUJCShwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dCwgQU5UTFIzX1VJTlQzMiBsaW5lKQoreworICAgIGlucHV0LT5saW5lCT0gbGluZTsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBvZmZzZXQgaW4gdGhlIGN1cnJlbnQgbGluZSB0byBiZSBhIHBhcnRpY3VsYXIgc2V0dGluZy4KKyAqCisgKiBccGFyYW1baW5dIGlucHV0ICAgIElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gcG9zaXRpb24gTmV3IHNldHRpbmcgZm9yIGN1cnJlbnQgb2Zmc2V0LgorICoKKyAqIFxyZW1hcmsKKyAqIFRoaXMgZG9lcyBub3Qgc2V0IHRoZSBhY3R1YWwgcG9pbnRlcnMgaW4gdGhlIGlucHV0IHN0cmVhbSwgaXQgaXMgcHVyZWx5IGZvciByZXBvcnRpbmcKKyAqIHB1cnBvc2VzIGFuZCBzbyBvbiBhcyBwZXIgYW50bHIzOEJpdFNldExpbmUoKTsKKyAqLworc3RhdGljIHZvaWQKK2FudGxyMzhCaXRTZXRDaGFyUG9zaXRpb24JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfVUlOVDMyIHBvc2l0aW9uKQoreworICAgIGlucHV0LT5jaGFyUG9zaXRpb25JbkxpbmUgPSBwb3NpdGlvbjsKK30KKworLyoqIFNldCB0aGUgbmV3bGluZSB0cmlnZ2VyIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIuCisgKgorICogXHBhcmFtW2luXSBpbnB1dAkgICAgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICogXHBhcmFtW2luXSBuZXdsaW5lQ2hhciAgIENoYXJhY3RlciB0byBzZXQgdG8gYmUgdGhlIG5ld2xpbmUgdHJpZ2dlci4KKyAqCisgKiBccmVtYXJrCisgKiAgLSBUaGUgc3VwcGxpZWQgbmV3TGluZUNoYXIgaXMgaW4gVVRGMzIgZW5jb2RpbmcgKHdoaWNoIG1lYW5zIEFTQ0lJIGFuZCBsYXRpbjEgZXRjCisgKiAgICBhcmUgdGhlIHNhbWUgZW5jb2RpbmdzKSwgYnV0IHRoZSBpbnB1dCBzdHJlYW0gY2F0ZXJlZCB0byBieSB0aGlzIGZ1bmN0aW9uIGlzIDggYml0CisgKiAgICBvbmx5LCBzbyBpdCBpcyB1cCB0byB0aGUgcHJvZ3JhbW1lciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhcmFjdGVyIHN1cHBsaWVkIGlzIHZhbGlkLgorICovCitzdGF0aWMgdm9pZCAKK2FudGxyMzhCaXRTZXROZXdMaW5lQ2hhcgkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19VSU5UMzIgbmV3bGluZUNoYXIpCit7CisgICAgaW5wdXQtPm5ld2xpbmVDaGFyCT0gbmV3bGluZUNoYXI7Cit9CisKKworLy8vIFxicmllZiBDb21tb24gZnVuY3Rpb24gdG8gc2V0dXAgZnVuY3Rpb24gaW50ZXJmYWNlIGZvciBhIFVURjE2IG9yIFVDUzIgaW5wdXQgc3RyZWFtLgorLy8vCisvLy8gXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLworLy8vIFxyZW1hcmsKKy8vLyAgLSBTdHJpY3RseSBzcGVha2luZywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhIFVDUzIgaW5wdXQgc3RyZWFtIGFzIHRoZSB0ZXJtCisvLy8gICAgdGVuZHMgdG8gY29uZnVzZSB0aGUgbm90aW9ucyBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcsIHVuaWNvZGUgYW5kIHNvIG9uLiBVQ1MyIGlzCisvLy8gICAgZXNzZW50aWFsbHkgVVRGMTYgd2l0aG91dCBhbnkgc3Vycm9nYXRlcyBhbmQgc28gdGhlIHN0YW5kYXJkIFVURjE2CisvLy8gICAgaW5wdXQgc3RyZWFtIGlzIGFibGUgdG8gaGFuZGxlIGl0IHdpdGhvdXQgYW55IHNwZWNpYWwgY29kZS4KKy8vLwordm9pZCAKK2FudGxyM1VURjE2U2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfQk9PTEVBTiBtYWNoaW5lQmlnRW5kaWFuLCBBTlRMUjNfQk9PTEVBTiBpbnB1dEJpZ0VuZGlhbikKK3sKKyAgICAvLyBCdWlsZCBhIHN0cmluZyBmYWN0b3J5IGZvciB0aGlzIHN0cmVhbS4gVGhpcyBpcyBhIFVURjE2IHN0cmluZyBmYWN0b3J5IHdoaWNoIGlzIGEgc3RhbmRhcmQKKyAgICAvLyBwYXJ0IG9mIHRoZSBBTlRMUjMgc3RyaW5nLiBUaGUgc3RyaW5nIGZhY3RvcnkgaXMgdGhlbiBwYXNzZWQgdGhyb3VnaCB0aGUgd2hvbGUgY2hhaW4gCisgICAgLy8gb2YgbGV4ZXItPnBhcnNlci0+dHJlZS0+dHJlZXBhcnNlciBhbmQgc28gb24uCisgICAgLy8KKyAgICBpbnB1dC0+c3RyRmFjdG9yeQk9IGFudGxyM1N0cmluZ0ZhY3RvcnlOZXcoaW5wdXQtPmVuY29kaW5nKTsKKworICAgIC8vIEdlbmVyaWMgQVBJIHRoYXQgZG9lcyBub3QgY2FyZSBhYm91dCBlbmRpYW5lc3MuCisgICAgLy8KKyAgICBpbnB1dC0+aXN0cmVhbS0+aW5kZXgJICAgID0gIGFudGxyM1VURjE2SW5kZXg7ICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgaW5kZXggaW4gaW5wdXQgc3RyZWFtLCBVVEYxNiBiYXNlZAorICAgIGlucHV0LT5zdWJzdHIJCSAgICA9ICBhbnRscjNVVEYxNlN1YnN0cjsJICAgIC8vIFJldHVybiBhIHN0cmluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICBpbnB1dC0+aXN0cmVhbS0+c2VlawkgICAgPSAgYW50bHIzVVRGMTZTZWVrOwkJICAgIC8vIEhvdyB0byBzZWVrIHRvIGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhlIHN0cmVhbQorCisgICAgLy8gV2UgbXVzdCBpbnN0YWxsIGRpZmZlcmVudCBVVEYxNiByb3V0aW5lcyBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgaW5wdXQKKyAgICAvLyBpcyB0aGUgc2FtZSBlbmRpYW5lc3MgYXMgdGhlIG1hY2hpbmUgd2UgYXJlIGV4ZWN1dGluZyB1cG9uIG9yIG5vdC4gSWYgaXQgaXMgbm90CisgICAgLy8gdGhlbiB3ZSBtdXN0IGluc3RhbGwgbWV0aG9kcyB0aGF0IGNhbiBjb252ZXJ0IHRoZSBlbmRpYW5lc3Mgb24gdGhlIGZseSBhcyB0aGV5IGdvCisgICAgLy8KKworICAgIHN3aXRjaCAobWFjaGluZUJpZ0VuZGlhbikKKyAgICB7CisgICAgICAgIGNhc2UgICAgQU5UTFIzX1RSVUU6CisKKyAgICAgICAgICAgIC8vIE1hY2hpbmUgaXMgQmlnIEVuZGlhbiwgaWYgdGhlIGlucHV0IGlzIGFsc28gdGhlbiBpbnN0YWxsIHRoZSAKKyAgICAgICAgICAgIC8vIG1ldGhvZHMgdGhhdCBkbyBub3QgYWNjZXNzIGlucHV0IGJ5IGJ5dGVzIGFuZCByZXZlcnNlIHRoZW0uCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgaW5zdGFsbCBlbmRpYW4gYXdhcmUgbWV0aG9kcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAgKGlucHV0QmlnRW5kaWFuID09IEFOVExSM19UUlVFKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJbnB1dCBpcyBtYWNoaW5lIGNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlucHV0LT5pc3RyZWFtLT5jb25zdW1lCSAgICA9ICBhbnRscjNVVEYxNkNvbnN1bWU7CSAgICAvLyBDb25zdW1lIHRoZSBuZXh0IFVURjE2IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgaW5wdXQtPmlzdHJlYW0tPl9MQSAgICAgICAgID0gIGFudGxyM1VURjE2TEE7CQkgICAgLy8gUmV0dXJuIHRoZSBVVEYzMiBjaGFyYWN0ZXIgYXQgb2Zmc2V0IG4gKDEgYmFzZWQpICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIG1ldGhvZHMgdGhhdCBrbm93IHRoYXQgdGhlIGlucHV0IGlzIGxpdHRsZSBlbmRpYW4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlucHV0LT5pc3RyZWFtLT5jb25zdW1lCSAgICA9ICBhbnRscjNVVEYxNkNvbnN1bWVMRTsJICAgIC8vIENvbnN1bWUgdGhlIG5leHQgVVRGMTYgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpbnB1dC0+aXN0cmVhbS0+X0xBICAgICAgICAgPSAgYW50bHIzVVRGMTZMQUxFOwkJICAgIC8vIFJldHVybiB0aGUgVVRGMzIgY2hhcmFjdGVyIGF0IG9mZnNldCBuICgxIGJhc2VkKSAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgICAgQU5UTFIzX0ZBTFNFOgorCisgICAgICAgICAgICAvLyBNYWNoaW5lIGlzIExpdHRsZSBFbmRpYW4sIGlmIHRoZSBpbnB1dCBpcyBhbHNvIHRoZW4gaW5zdGFsbCB0aGUgCisgICAgICAgICAgICAvLyBtZXRob2RzIHRoYXQgZG8gbm90IGFjY2VzcyBpbnB1dCBieSBieXRlcyBhbmQgcmV2ZXJzZSB0aGVtLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGluc3RhbGwgZW5kaWFuIGF3YXJlIG1ldGhvZHMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgIChpbnB1dEJpZ0VuZGlhbiA9PSBBTlRMUjNfRkFMU0UpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElucHV0IGlzIG1hY2hpbmUgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPmlzdHJlYW0tPmNvbnN1bWUJICAgID0gIGFudGxyM1VURjE2Q29uc3VtZTsJICAgIC8vIENvbnN1bWUgdGhlIG5leHQgVVRGMTYgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpbnB1dC0+aXN0cmVhbS0+X0xBICAgICAgICAgPSAgYW50bHIzVVRGMTZMQTsJCSAgICAvLyBSZXR1cm4gdGhlIFVURjMyIGNoYXJhY3RlciBhdCBvZmZzZXQgbiAoMSBiYXNlZCkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byB1c2UgbWV0aG9kcyB0aGF0IGtub3cgdGhhdCB0aGUgaW5wdXQgaXMgQmlnIEVuZGlhbgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPmlzdHJlYW0tPmNvbnN1bWUJICAgID0gIGFudGxyM1VURjE2Q29uc3VtZUJFOwkgICAgLy8gQ29uc3VtZSB0aGUgbmV4dCBVVEYxNiBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGlucHV0LT5pc3RyZWFtLT5fTEEgICAgICAgICA9ICBhbnRscjNVVEYxNkxBQkU7CQkgICAgLy8gUmV0dXJuIHRoZSBVVEYzMiBjaGFyYWN0ZXIgYXQgb2Zmc2V0IG4gKDEgYmFzZWQpIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgICAgIAorICAgIGlucHV0LT5jaGFyQnl0ZVNpemUJCSAgICA9IDI7CQkJICAgIC8vIFNpemUgaW4gYnl0ZXMgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHN0cmVhbS4KKworfQorCisvLy8gXGJyaWVmIENvbnN1bWUgdGhlIG5leHQgY2hhcmFjdGVyIGluIGEgVVRGMTYgaW5wdXQgc3RyZWFtCisvLy8KKy8vLyBccGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorLy8vCitzdGF0aWMgdm9pZAorYW50bHIzVVRGMTZDb25zdW1lKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKyAgICAgICAgVVRGMzIgICBjaDsKKyAgICAgICAgVVRGMzIgICBjaDI7CisKKwlpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgICAgIC8vIEJ1ZmZlciBzaXplIGlzIGFsd2F5cyBpbiBieXRlcworICAgICAgICAvLworCWlmCSgocEFOVExSM19VSU5UOCkoaW5wdXQtPm5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorCXsJCisJCS8vIEluZGljYXRlIG9uZSBtb3JlIGNoYXJhY3RlciBpbiB0aGlzIGxpbmUKKwkJLy8KKwkJaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZSsrOworCisJCWlmICAoKEFOVExSM19VQ0hBUikoKigocEFOVExSM19VSU5UMTYpaW5wdXQtPm5leHRDaGFyKSkgPT0gaW5wdXQtPm5ld2xpbmVDaGFyKQorCQl7CisJCQkvLyBSZXNldCBmb3Igc3RhcnQgb2YgYSBuZXcgbGluZSBvZiBpbnB1dAorCQkJLy8KKwkJCWlucHV0LT5saW5lKys7CisJCQlpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lCT0gMDsKKwkJCWlucHV0LT5jdXJyZW50TGluZQkJPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKwkJfQorCisJCS8vIEluY3JlbWVudCB0byBuZXh0IGNoYXJhY3RlciBwb3NpdGlvbiwgYWNjb3VudGluZyBmb3IgYW55IHN1cnJvZ2F0ZXMKKwkJLy8KKyAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXIgaW4gbmF0dXJhbCBtYWNoaW5lIGJ5dGUgb3JkZXIKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGNoICA9ICooKFVURjE2KilpbnB1dC0+bmV4dENoYXIpOworCisgICAgICAgICAgICAgICAgLy8gV2UgY29uc3VtZWQgb25lIDE2IGJpdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAvLworCQlpbnB1dC0+bmV4dENoYXIgPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpciB0aGVuIHdlIG5lZWQgdG8gY29uc3VtZQorICAgICAgICAgICAgICAgIC8vIGEgZm9sbG93aW5nIHZhbGlkIExPIHN1cnJvZ2F0ZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9ISUdIX0VORCkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUgYXJlIGluIHRoZSBzb3VyY2UgYnVmZmVyLi4uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGlmCSgocEFOVExSM19VSU5UOCkoaW5wdXQtPm5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBpbiBuYXR1cmFsIG1hY2hpbmUgYnl0ZSBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoMiA9ICooKFVURjE2KilpbnB1dC0+bmV4dENoYXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGEgdmFsaWQgbG93IHN1cnJvZ2F0ZSwgY29uc3VtZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaDIgPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2gyIDw9IFVOSV9TVVJfTE9XX0VORCkgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY29uc3VtZWQgb25lIDE2IGJpdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworCQkgICAgICAgICAgICBpbnB1dC0+bmV4dENoYXIgPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBiZWNhdXNlIHRoZSBidWZmZXIgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkaWQgbm90IGNoZWNrIGZvciBhbiBpbnZhbGlkIGxvdyBzdXJyb2dhdGUgaGVyZSwgb3IgdGhhdCBmYWN0IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbG8gc3Vycm9nYXRlIHdhcyBtaXNzaW5nLiBXZSBqdXN0IHBpY2tlZCBvdXQgb25lIDE2IGJpdCBjaGFyYWN0ZXIgdW5sZXNzIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAvLyB3YXMgYSB2YWxpZCBoaSBzdXJyb2dhdGUsIGluIHdoY2loIGNhc2Ugd2UgY29uc3VtZWQgdHdvIDE2IGJpdCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIC8vCisJfQorfQorCisvLy8gXGJyaWVmIFJldHVybiB0aGUgaW5wdXQgZWxlbWVudCBhc3N1bWluZyBhbiA4IGJpdCBhc2NpaSBpbnB1dAorLy8vCisvLy8gXHBhcmFtW2luXSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisvLy8gXHBhcmFtW2luXSBsYSAxIGJhc2VkIG9mZnNldCBvZiBuZXh0IGlucHV0IHN0cmVhbSBlbGVtZW50CisvLy8KKy8vLyBccmV0dXJuIE5leHQgaW5wdXQgY2hhcmFjdGVyIGluIGludGVybmFsIEFOVExSMyBlbmNvZGluZyAoVVRGMzIpCisvLy8KK3N0YXRpYyBBTlRMUjNfVUNIQVIgCithbnRscjNVVEYxNkxBKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX0lOVDMyIGxhKQoreworCXBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0OworICAgICAgICBVVEYzMiAgIGNoOworICAgICAgICBVVEYzMiAgIGNoMjsKKyAgICAgICAgVVRGMTYgICAqIG5leHRDaGFyOworCisgICAgICAgIC8vIEZpbmQgdGhlIGlucHV0IGludGVyZmFjZSBhbmQgd2hlcmUgd2UgYXJlIGN1cnJlbnRseSBwb2ludGluZyB0bworICAgICAgICAvLyBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIC8vCisJaW5wdXQgICAgICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisgICAgICAgIG5leHRDaGFyICAgID0gaW5wdXQtPm5leHRDaGFyOworCisgICAgICAgIC8vIElmIGEgcG9zaXRpdmUgb2Zmc2V0IHRoZW4gYWR2YW5jZSBmb3J3YXJkLCBlbHNlIHJldHJlYXQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgIChsYSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAgICgtLWxhID4gMCAmJiAocEFOVExSM19VSU5UOCluZXh0Q2hhciA8ICgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBvdXIgY29weSBvZiB0aGUgaW5wdXQgcG9pbnRlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gTmV4dCBjaGFyIGluIG5hdHVyYWwgbWFjaGluZSBieXRlIG9yZGVyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjaCAgPSAqbmV4dENoYXIrKzsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpciB0aGVuIHdlIG5lZWQgdG8gY29uc3VtZQorICAgICAgICAgICAgICAgIC8vIGEgZm9sbG93aW5nIHZhbGlkIExPIHN1cnJvZ2F0ZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9ISUdIX0VORCkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgMTYgYml0cyBmb2xsb3dpbmcgdGhlIGhpZ2ggc3Vycm9nYXRlIGFyZSBpbiB0aGUgc291cmNlIGJ1ZmZlci4uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZgkoKHBBTlRMUjNfVUlOVDgpKG5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBpbiBuYXR1cmFsIG1hY2hpbmUgYnl0ZSBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoMiA9ICpuZXh0Q2hhcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIHZhbGlkIGxvdyBzdXJyb2dhdGUsIGNvbnN1bWUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2gyID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0xPV19FTkQpIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvbnN1bWVkIG9uZSAxNiBiaXQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKwkJICAgICAgICAgICAgbmV4dENoYXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBiZWNhdXNlIHRoZSBidWZmZXIgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRpZCBub3QgY2hlY2sgZm9yIGFuIGludmFsaWQgbG93IHN1cnJvZ2F0ZSBoZXJlLCBvciB0aGF0IGZhY3QgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBsbyBzdXJyb2dhdGUgd2FzIG1pc3NpbmcuIFdlIGp1c3QgcGlja2VkIG91dCBvbmUgMTYgYml0IGNoYXJhY3RlciB1bmxlc3MgdGhlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vIHdhcyBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSwgaW4gd2hjaWggY2FzZSB3ZSBjb25zdW1lZCB0d28gMTYgYml0IGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZ28gYmFja3dhcmRzIGZyb20gb3VyIGlucHV0IHBvaW50CisgICAgICAgICAgICAvLworICAgICAgICAgICAgd2hpbGUgICAobGErKyA8IDAgJiYgKHBBTlRMUjNfVUlOVDgpbmV4dENoYXIgPiAocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcmV2aW91cyAxNiBiaXQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjaCA9ICotLW5leHRDaGFyOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBsb3cgc3Vycm9nYXRlIHRoZW4gZ28gYmFjayBvbmUgbW9yZSBjaGFyYWN0ZXIgaWYKKyAgICAgICAgICAgICAgICAvLyB0aGUgaGkgc3Vycm9nYXRlIGlzIHRoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9MT1dfRU5EKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoMiA9ICoobmV4dENoYXItMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaDIgPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0hJR0hfRU5EKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gWWVzLCB0aGVyZSBpcyBhIGhpZ2ggc3Vycm9nYXRlIHRvIG1hdGNoIGl0IHNvIGRlY3JlbWVudCBvbmUgbW9yZSBhbmQgcG9pbnQgdG8gdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPdXIgbG9jYWwgY29weSBvZiBuZXh0Q2hhciBpcyBub3cgcG9pbnRpbmcgdG8gZWl0aGVyIHRoZSBjb3JyZWN0IGNoYXJhY3RlciBvciBlbmQgb2YgZmlsZQorICAgICAgICAvLworICAgICAgICAvLyBJbnB1dCBidWZmZXIgc2l6ZSBpcyBhbHdheXMgaW4gYnl0ZXMKKyAgICAgICAgLy8KKwlpZgkoIChwQU5UTFIzX1VJTlQ4KW5leHRDaGFyID49ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorCXsKKwkJcmV0dXJuCUFOVExSM19DSEFSU1RSRUFNX0VPRjsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgICAgIC8vIFBpY2sgdXAgdGhlIG5leHQgMTYgY2hhcmFjdGVyIChuYXRpdmUgbWFjaGluZSBieXRlIG9yZGVyKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNoID0gKm5leHRDaGFyKys7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpciB0aGVuIHdlIG5lZWQgdG8gY29uc3VtZQorICAgICAgICAgICAgLy8gYSBmb2xsb3dpbmcgdmFsaWQgTE8gc3Vycm9nYXRlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9ISUdIX0VORCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIDE2IGJpdHMgZm9sbG93aW5nIHRoZSBoaWdoIHN1cnJvZ2F0ZSBhcmUgaW4gdGhlIHNvdXJjZSBidWZmZXIuLi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmCSgocEFOVExSM19VSU5UOCkobmV4dENoYXIpIDwgKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBpbiBuYXR1cmFsIG1hY2hpbmUgYnl0ZSBvcmRlcgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBjaDIgPSAqbmV4dENoYXI7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIHZhbGlkIGxvdyBzdXJyb2dhdGUsIGNvbnN1bWUgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMiA+PSBVTklfU1VSX0xPV19TVEFSVCAmJiBjaDIgPD0gVU5JX1NVUl9MT1dfRU5EKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBVVEYzMiBjb2RlIHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoKGNoIC0gVU5JX1NVUl9ISUdIX1NUQVJUKSA8PCBoYWxmU2hpZnQpCisJCQkgICAgKyAoY2gyIC0gVU5JX1NVUl9MT1dfU1RBUlQpICsgaGFsZkJhc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpdC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBpdCBiZWNhdXNlIHRoZSBidWZmZXIgZW5kZWQKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaDsKK30KKworCisvLy8gXGJyaWVmIENhbGN1bGF0ZSB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KKy8vLyBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLworc3RhdGljIEFOVExSM19NQVJLRVIgCithbnRscjNVVEYxNkluZGV4KHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworICAgIGlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisKKyAgICByZXR1cm4gIChBTlRMUjNfTUFSS0VSKShpbnB1dC0+bmV4dENoYXIpOworfQorCisvLy8gXGJyaWVmIFJld2luZCB0aGUgbGV4ZXIgaW5wdXQgdG8gdGhlIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgbWFyay4KKy8vLworLy8vIFxwYXJhbVtpbl0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorLy8vCisvLy8gXHJlbWFyaworLy8vIEFzc3VtZXMgVVRGMTYgaW5wdXQgc3RyZWFtLgorLy8vCitzdGF0aWMgdm9pZAorYW50bHIzVVRGMTZTZWVrCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19NQVJLRVIgc2Vla1BvaW50KQoreworCXBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0OworCisJaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIGlzLT5zdXBlcik7CisKKwkvLyBJZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9pbnQgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50CisJLy8gaW5wdXQgcG9pbnQsIHRoZW4gd2UgYXNzdW1lIHRoYXQgd2UgYXJlIHJlc2V0dGluZyBmcm9tIGEgbWFyaworCS8vIGFuZCBkbyBub3QgbmVlZCB0byBzY2FuLCBidXQgY2FuIGp1c3Qgc2V0IHRvIHRoZXJlIGFzIHJld2luZCB3aWxsCisgICAgICAgIC8vIHJlc2V0IGxpbmUgbnVtYmVycyBhbmQgc28gb24uCisJLy8KKwlpZgkoc2Vla1BvaW50IDw9IChBTlRMUjNfTUFSS0VSKShpbnB1dC0+bmV4dENoYXIpKQorCXsKKwkJaW5wdXQtPm5leHRDaGFyCT0gKHZvaWQgKilzZWVrUG9pbnQ7CisJfQorCWVsc2UKKwl7CisgICAgICAgICAgICAvLyBDYWxsIGNvbnN1bWUgdW50aWwgd2UgcmVhY2ggdGhlIGFza2VkIGZvciBzZWVrIHBvaW50IG9yIEVPRgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHdoaWxlIChpcy0+X0xBKGlzLCAxKSAhPSBBTlRMUjNfQ0hBUlNUUkVBTV9FT0YgJiYgc2Vla1BvaW50IDwgKEFOVExSM19NQVJLRVIpaW5wdXQtPm5leHRDaGFyKQorCSAgICB7CisJCWlzLT5jb25zdW1lKGlzKTsKKwkgICAgfQorCX0KK30KKy8vLyBcYnJpZWYgUmV0dXJuIGEgc3Vic3RyaW5nIG9mIHRoZSBVVEYxNiBpbnB1dCBzdHJlYW0gaW4KKy8vLyAgbmV3bHkgYWxsb2NhdGVkIG1lbW9yeS4KKy8vLworLy8vIFxwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisvLy8gXHBhcmFtIHN0YXJ0IE9mZnNldCBpbiBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIHN0cmluZyBzdGFydHMKKy8vLyBccGFyYW0gc3RvcCAgT2Zmc2V0IGluIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIHN0cmluZyBlbmRzLgorLy8vCitzdGF0aWMgcEFOVExSM19TVFJJTkcKK2FudGxyM1VURjE2U3Vic3RyCQkocEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQsIEFOVExSM19NQVJLRVIgc3RhcnQsIEFOVExSM19NQVJLRVIgc3RvcCkKK3sKKyAgICByZXR1cm4gIGlucHV0LT5zdHJGYWN0b3J5LT5uZXdQdHIoaW5wdXQtPnN0ckZhY3RvcnksIChwQU5UTFIzX1VJTlQ4KXN0YXJ0LCAoKEFOVExSM19VSU5UMzJfQ0FTVChzdG9wIC0gc3RhcnQpKS8yKSArIDEpOworfQorCisvLy8gXGJyaWVmIENvbnN1bWUgdGhlIG5leHQgY2hhcmFjdGVyIGluIGEgVVRGMTYgaW5wdXQgc3RyZWFtIHdoZW4gdGhlIGlucHV0IGlzIExpdHRsZSBFbmRpYW4gYW5kIHRoZSBtYWNoaW5lIGlzIG5vdAorLy8vIE5vdGUgdGhhdCB0aGUgVVRGMTYgcm91dGluZXMgZG8gbm90IGRvIGFueSBzdWJzdGFudGlhbCB2ZXJpZmljYXRpb24gb2YgdGhlIGlucHV0IHN0cmVhbSBhcyBmb3IgcGVyZm9ybWFuY2UKKy8vLyBzYWtlLCB3ZSBhc3N1bWUgaXQgaXMgdmFsaWRseSBlbmNvZGVkLiBTbyBpZiBhIGxvdyBzdXJyb2dhdGUgaXMgZm91bmQgYXQgdGhlIGN1cmVudCBpbnB1dCBwb3NpdGlvbiB0aGVuIHdlCisvLy8ganVzdCBjb25zdW1lIGl0LiBTdXJyb2dhdGUgcGFpcnMgc2hvdWxkIGJlIHNlZW4gYXMgSGksIExvLiBTbyBpZiB3ZSBoYXZlIGEgTG8gZmlyc3QsIHRoZW4gdGhlIGlucHV0IHN0cmVhbQorLy8vIGlzIGZ1YmFyIGJ1dCB3ZSBqdXN0IGlnbm9yZSB0aGF0LgorLy8vCisvLy8gXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLworc3RhdGljIHZvaWQKK2FudGxyM1VURjE2Q29uc3VtZUxFKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKyAgICAgICAgVVRGMzIgICBjaDsKKyAgICAgICAgVVRGMzIgICBjaDI7CisKKwlpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgICAgIC8vIEJ1ZmZlciBzaXplIGlzIGFsd2F5cyBpbiBieXRlcworICAgICAgICAvLworCWlmCSgocEFOVExSM19VSU5UOCkoaW5wdXQtPm5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorCXsJCisJCS8vIEluZGljYXRlIG9uZSBtb3JlIGNoYXJhY3RlciBpbiB0aGlzIGxpbmUKKwkJLy8KKwkJaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZSsrOworCisJCWlmICAoKEFOVExSM19VQ0hBUikoKigocEFOVExSM19VSU5UMTYpaW5wdXQtPm5leHRDaGFyKSkgPT0gaW5wdXQtPm5ld2xpbmVDaGFyKQorCQl7CisJCQkvLyBSZXNldCBmb3Igc3RhcnQgb2YgYSBuZXcgbGluZSBvZiBpbnB1dAorCQkJLy8KKwkJCWlucHV0LT5saW5lKys7CisJCQlpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lCT0gMDsKKwkJCWlucHV0LT5jdXJyZW50TGluZQkJPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKwkJfQorCisJCS8vIEluY3JlbWVudCB0byBuZXh0IGNoYXJhY3RlciBwb3NpdGlvbiwgYWNjb3VudGluZyBmb3IgYW55IHN1cnJvZ2F0ZXMKKwkJLy8KKyAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXIgaW4gbGl0bGUgZW5kaWFuIGZvcm0KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGNoICA9ICooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSArICgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhciArIDEpIDw8OCk7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBjb25zdW1lZCBvbmUgMTYgYml0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vCisJCWlucHV0LT5uZXh0Q2hhciA9ICh2b2lkICopKCgocEFOVExSM19VSU5UMTYpaW5wdXQtPm5leHRDaGFyKSArIDEpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyIHRoZW4gd2UgbmVlZCB0byBjb25zdW1lCisgICAgICAgICAgICAgICAgLy8gYSBmb2xsb3dpbmcgdmFsaWQgTE8gc3Vycm9nYXRlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKGNoID49IFVOSV9TVVJfSElHSF9TVEFSVCAmJiBjaCA8PSBVTklfU1VSX0hJR0hfRU5EKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIDE2IGJpdHMgZm9sbG93aW5nIHRoZSBoaWdoIHN1cnJvZ2F0ZSBhcmUgaW4gdGhlIHNvdXJjZSBidWZmZXIuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYJKChwQU5UTFIzX1VJTlQ4KShpbnB1dC0+bmV4dENoYXIpIDwgKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoMiA9ICooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSArICgqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhciArIDEpIDw8OCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSB2YWxpZCBsb3cgc3Vycm9nYXRlLCBjb25zdW1lIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoMiA+PSBVTklfU1VSX0xPV19TVEFSVCAmJiBjaDIgPD0gVU5JX1NVUl9MT1dfRU5EKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb25zdW1lZCBvbmUgMTYgYml0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisJCSAgICAgICAgICAgIGlucHV0LT5uZXh0Q2hhciA9ICh2b2lkICopKCgocEFOVExSM19VSU5UMTYpaW5wdXQtPm5leHRDaGFyKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaWdub3JlIGEgdmFsaWQgaGkgc3Vycm9nYXRlIHRoYXQgaGFzIG5vIGxvIHN1cnJvZ2F0ZSB0byBnbyB3aXRoCisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGJlY2F1c2UgdGhlIGJ1ZmZlciBlbmRlZAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRpZCBub3QgY2hlY2sgZm9yIGFuIGludmFsaWQgbG93IHN1cnJvZ2F0ZSBoZXJlLCBvciB0aGF0IGZhY3QgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBsbyBzdXJyb2dhdGUgd2FzIG1pc3NpbmcuIFdlIGp1c3QgcGlja2VkIG91dCBvbmUgMTYgYml0IGNoYXJhY3RlciB1bmxlc3MgdGhlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vIHdhcyBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSwgaW4gd2hjaWggY2FzZSB3ZSBjb25zdW1lZCB0d28gMTYgYml0IGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgLy8KKwl9Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJuIHRoZSBpbnB1dCBlbGVtZW50IGFzc3VtaW5nIGEgVVRGMTYgaW5wdXQgd2hlbiB0aGUgaW5wdXQgaXMgTGl0dGxlIEVuZGlhbiBhbmQgdGhlIG1hY2hpbmUgaXMgbm90CisvLy8KKy8vLyBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLyBccGFyYW1baW5dIGxhIDEgYmFzZWQgb2Zmc2V0IG9mIG5leHQgaW5wdXQgc3RyZWFtIGVsZW1lbnQKKy8vLworLy8vIFxyZXR1cm4gTmV4dCBpbnB1dCBjaGFyYWN0ZXIgaW4gaW50ZXJuYWwgQU5UTFIzIGVuY29kaW5nIChVVEYzMikKKy8vLworc3RhdGljIEFOVExSM19VQ0hBUiAKK2FudGxyM1VURjE2TEFMRShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSkKK3sKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKyAgICAgICAgVVRGMzIgICAgICAgICAgIGNoOworICAgICAgICBVVEYzMiAgICAgICAgICAgY2gyOworICAgICAgICBwQU5UTFIzX1VDSEFSICAgbmV4dENoYXI7CisKKyAgICAgICAgLy8gRmluZCB0aGUgaW5wdXQgaW50ZXJmYWNlIGFuZCB3aGVyZSB3ZSBhcmUgY3VycmVudGx5IHBvaW50aW5nIHRvCisgICAgICAgIC8vIGluIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgLy8KKwlpbnB1dCAgICAgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKyAgICAgICAgbmV4dENoYXIgICAgPSBpbnB1dC0+bmV4dENoYXI7CisKKyAgICAgICAgLy8gSWYgYSBwb3NpdGl2ZSBvZmZzZXQgdGhlbiBhZHZhbmNlIGZvcndhcmQsIGVsc2UgcmV0cmVhdAorICAgICAgICAvLworICAgICAgICBpZiAgKGxhID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICAgKC0tbGEgPiAwICYmIChwQU5UTFIzX1VJTlQ4KW5leHRDaGFyIDwgKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIG91ciBjb3B5IG9mIHRoZSBpbnB1dCBwb2ludGVyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXIgaW4gTGl0dGxlIEVuZGlhbiBieXRlIG9yZGVyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjaCAgPSAoKm5leHRDaGFyKSArICgqKG5leHRDaGFyKzEpIDw8IDgpOworICAgICAgICAgICAgICAgIG5leHRDaGFyICs9IDI7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIgdGhlbiB3ZSBuZWVkIHRvIGNvbnN1bWUKKyAgICAgICAgICAgICAgICAvLyBhIGZvbGxvd2luZyB2YWxpZCBMTyBzdXJyb2dhdGUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfSElHSF9FTkQpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIDE2IGJpdHMgZm9sbG93aW5nIHRoZSBoaWdoIHN1cnJvZ2F0ZSBhcmUgaW4gdGhlIHNvdXJjZSBidWZmZXIuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYJKChwQU5UTFIzX1VJTlQ4KShuZXh0Q2hhcikgPCAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgY2gyID0gKCpuZXh0Q2hhcikgKyAoKihuZXh0Q2hhcisxKSA8PCA4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIHZhbGlkIGxvdyBzdXJyb2dhdGUsIGNvbnN1bWUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2gyID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0xPV19FTkQpIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvbnN1bWVkIG9uZSAxNiBiaXQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKwkJICAgICAgICAgICAgbmV4dENoYXIgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBiZWNhdXNlIHRoZSBidWZmZXIgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRpZCBub3QgY2hlY2sgZm9yIGFuIGludmFsaWQgbG93IHN1cnJvZ2F0ZSBoZXJlLCBvciB0aGF0IGZhY3QgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBsbyBzdXJyb2dhdGUgd2FzIG1pc3NpbmcuIFdlIGp1c3QgcGlja2VkIG91dCBvbmUgMTYgYml0IGNoYXJhY3RlciB1bmxlc3MgdGhlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vIHdhcyBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSwgaW4gd2hjaWggY2FzZSB3ZSBjb25zdW1lZCB0d28gMTYgYml0IGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZ28gYmFja3dhcmRzIGZyb20gb3VyIGlucHV0IHBvaW50CisgICAgICAgICAgICAvLworICAgICAgICAgICAgd2hpbGUgICAobGErKyA8IDAgJiYgKHBBTlRMUjNfVUlOVDgpbmV4dENoYXIgPiAocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcmV2aW91cyAxNiBiaXQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjaCA9ICgqbmV4dENoYXIgLSAyKSArICgoKm5leHRDaGFyIC0xKSA8PCA4KTsKKyAgICAgICAgICAgICAgICBuZXh0Q2hhciAtPSAyOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBsb3cgc3Vycm9nYXRlIHRoZW4gZ28gYmFjayBvbmUgbW9yZSBjaGFyYWN0ZXIgaWYKKyAgICAgICAgICAgICAgICAvLyB0aGUgaGkgc3Vycm9nYXRlIGlzIHRoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9MT1dfRU5EKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoMiA9ICgqbmV4dENoYXIgLSAyKSArICgoKm5leHRDaGFyIC0xKSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMiA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2gyIDw9IFVOSV9TVVJfSElHSF9FTkQpIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBZZXMsIHRoZXJlIGlzIGEgaGlnaCBzdXJyb2dhdGUgdG8gbWF0Y2ggaXQgc28gZGVjcmVtZW50IG9uZSBtb3JlIGFuZCBwb2ludCB0byB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgLT0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3VyIGxvY2FsIGNvcHkgb2YgbmV4dENoYXIgaXMgbm93IHBvaW50aW5nIHRvIGVpdGhlciB0aGUgY29ycmVjdCBjaGFyYWN0ZXIgb3IgZW5kIG9mIGZpbGUKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW5wdXQgYnVmZmVyIHNpemUgaXMgYWx3YXlzIGluIGJ5dGVzCisgICAgICAgIC8vCisJaWYJKCAocEFOVExSM19VSU5UOCluZXh0Q2hhciA+PSAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKwl7CisJCXJldHVybglBTlRMUjNfQ0hBUlNUUkVBTV9FT0Y7CisJfQorCWVsc2UKKwl7CisgICAgICAgICAgICAvLyBQaWNrIHVwIHRoZSBuZXh0IDE2IGNoYXJhY3RlciAobGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNoID0gKCpuZXh0Q2hhcikgKyAoKihuZXh0Q2hhcisxKSA8PCA4KTsKKyAgICAgICAgICAgIG5leHRDaGFyICs9IDI7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpciB0aGVuIHdlIG5lZWQgdG8gY29uc3VtZQorICAgICAgICAgICAgLy8gYSBmb2xsb3dpbmcgdmFsaWQgTE8gc3Vycm9nYXRlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmIChjaCA+PSBVTklfU1VSX0hJR0hfU1RBUlQgJiYgY2ggPD0gVU5JX1NVUl9ISUdIX0VORCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIDE2IGJpdHMgZm9sbG93aW5nIHRoZSBoaWdoIHN1cnJvZ2F0ZSBhcmUgaW4gdGhlIHNvdXJjZSBidWZmZXIuLi4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmCSgocEFOVExSM19VSU5UOCkobmV4dENoYXIpIDwgKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgY2gyID0gKCpuZXh0Q2hhcikgKyAoKihuZXh0Q2hhcisxKSA8PCA4KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGEgdmFsaWQgbG93IHN1cnJvZ2F0ZSwgY29uc3VtZSBpdAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAoY2gyID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0xPV19FTkQpIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIFVURjMyIGNvZGUgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9ICgoY2ggLSBVTklfU1VSX0hJR0hfU1RBUlQpIDw8IGhhbGZTaGlmdCkKKwkJCSAgICArIChjaDIgLSBVTklfU1VSX0xPV19TVEFSVCkgKyBoYWxmQmFzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaWdub3JlIGEgdmFsaWQgaGkgc3Vycm9nYXRlIHRoYXQgaGFzIG5vIGxvIHN1cnJvZ2F0ZSB0byBnbyB3aXRoCisgICAgICAgICAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgIC8vIGl0IGJlY2F1c2UgdGhlIGJ1ZmZlciBlbmRlZAorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoOworfQorCisvLy8gXGJyaWVmIENvbnN1bWUgdGhlIG5leHQgY2hhcmFjdGVyIGluIGEgVVRGMTYgaW5wdXQgc3RyZWFtIHdoZW4gdGhlIGlucHV0IGlzIEJpZyBFbmRpYW4gYW5kIHRoZSBtYWNoaW5lIGlzIG5vdAorLy8vCisvLy8gXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLworc3RhdGljIHZvaWQKK2FudGxyM1VURjE2Q29uc3VtZUJFKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKyAgICAgICAgVVRGMzIgICBjaDsKKyAgICAgICAgVVRGMzIgICBjaDI7CisKKwlpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgICAgIC8vIEJ1ZmZlciBzaXplIGlzIGFsd2F5cyBpbiBieXRlcworICAgICAgICAvLworCWlmCSgocEFOVExSM19VSU5UOCkoaW5wdXQtPm5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorCXsJCisJCS8vIEluZGljYXRlIG9uZSBtb3JlIGNoYXJhY3RlciBpbiB0aGlzIGxpbmUKKwkJLy8KKwkJaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZSsrOworCisJCWlmICAoKEFOVExSM19VQ0hBUikoKigocEFOVExSM19VSU5UMTYpaW5wdXQtPm5leHRDaGFyKSkgPT0gaW5wdXQtPm5ld2xpbmVDaGFyKQorCQl7CisJCQkvLyBSZXNldCBmb3Igc3RhcnQgb2YgYSBuZXcgbGluZSBvZiBpbnB1dAorCQkJLy8KKwkJCWlucHV0LT5saW5lKys7CisJCQlpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lCT0gMDsKKwkJCWlucHV0LT5jdXJyZW50TGluZQkJPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKwkJfQorCisJCS8vIEluY3JlbWVudCB0byBuZXh0IGNoYXJhY3RlciBwb3NpdGlvbiwgYWNjb3VudGluZyBmb3IgYW55IHN1cnJvZ2F0ZXMKKwkJLy8KKyAgICAgICAgICAgICAgICAvLyBOZXh0IGNoYXIgaW4gYmlnIGVuZGlhbiBmb3JtCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBjaCAgPSAqKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhciArIDEpICsgKCooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICkgPDw4KTsKKworICAgICAgICAgICAgICAgIC8vIFdlIGNvbnN1bWVkIG9uZSAxNiBiaXQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgLy8KKwkJaW5wdXQtPm5leHRDaGFyID0gKHZvaWQgKikoKChwQU5UTFIzX1VJTlQxNilpbnB1dC0+bmV4dENoYXIpICsgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIgdGhlbiB3ZSBuZWVkIHRvIGNvbnN1bWUKKyAgICAgICAgICAgICAgICAvLyBhIGZvbGxvd2luZyB2YWxpZCBMTyBzdXJyb2dhdGUuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfSElHSF9FTkQpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgMTYgYml0cyBmb2xsb3dpbmcgdGhlIGhpZ2ggc3Vycm9nYXRlIGFyZSBpbiB0aGUgc291cmNlIGJ1ZmZlci4uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZgkoKHBBTlRMUjNfVUlOVDgpKGlucHV0LT5uZXh0Q2hhcikgPCAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmlnIGVuZGlhbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoMiA9ICooKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyICsgMSkgKyAoKigocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIgKSA8PDgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGEgdmFsaWQgbG93IHN1cnJvZ2F0ZSwgY29uc3VtZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaDIgPj0gVU5JX1NVUl9MT1dfU1RBUlQgJiYgY2gyIDw9IFVOSV9TVVJfTE9XX0VORCkgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY29uc3VtZWQgb25lIDE2IGJpdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworCQkgICAgICAgICAgICBpbnB1dC0+bmV4dENoYXIgPSAodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KWlucHV0LT5uZXh0Q2hhcikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBiZWNhdXNlIHRoZSBidWZmZXIgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkaWQgbm90IGNoZWNrIGZvciBhbiBpbnZhbGlkIGxvdyBzdXJyb2dhdGUgaGVyZSwgb3IgdGhhdCBmYWN0IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbG8gc3Vycm9nYXRlIHdhcyBtaXNzaW5nLiBXZSBqdXN0IHBpY2tlZCBvdXQgb25lIDE2IGJpdCBjaGFyYWN0ZXIgdW5sZXNzIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAvLyB3YXMgYSB2YWxpZCBoaSBzdXJyb2dhdGUsIGluIHdoY2loIGNhc2Ugd2UgY29uc3VtZWQgdHdvIDE2IGJpdCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIC8vCisJfQorfQorCisvLy8gXGJyaWVmIFJldHVybiB0aGUgaW5wdXQgZWxlbWVudCBhc3N1bWluZyBhIFVURjE2IGlucHV0IHdoZW4gdGhlIGlucHV0IGlzIExpdHRsZSBFbmRpYW4gYW5kIHRoZSBtYWNoaW5lIGlzIG5vdAorLy8vCisvLy8gXHBhcmFtW2luXSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisvLy8gXHBhcmFtW2luXSBsYSAxIGJhc2VkIG9mZnNldCBvZiBuZXh0IGlucHV0IHN0cmVhbSBlbGVtZW50CisvLy8KKy8vLyBccmV0dXJuIE5leHQgaW5wdXQgY2hhcmFjdGVyIGluIGludGVybmFsIEFOVExSMyBlbmNvZGluZyAoVVRGMzIpCisvLy8KK3N0YXRpYyBBTlRMUjNfVUNIQVIgCithbnRscjNVVEYxNkxBQkUocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpCit7CisJcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisgICAgICAgIFVURjMyICAgICAgICAgICBjaDsKKyAgICAgICAgVVRGMzIgICAgICAgICAgIGNoMjsKKyAgICAgICAgcEFOVExSM19VQ0hBUiAgIG5leHRDaGFyOworCisgICAgICAgIC8vIEZpbmQgdGhlIGlucHV0IGludGVyZmFjZSBhbmQgd2hlcmUgd2UgYXJlIGN1cnJlbnRseSBwb2ludGluZyB0bworICAgICAgICAvLyBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIC8vCisJaW5wdXQgICAgICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisgICAgICAgIG5leHRDaGFyICAgID0gaW5wdXQtPm5leHRDaGFyOworCisgICAgICAgIC8vIElmIGEgcG9zaXRpdmUgb2Zmc2V0IHRoZW4gYWR2YW5jZSBmb3J3YXJkLCBlbHNlIHJldHJlYXQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgIChsYSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAgICgtLWxhID4gMCAmJiAocEFOVExSM19VSU5UOCluZXh0Q2hhciA8ICgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBvdXIgY29weSBvZiB0aGUgaW5wdXQgcG9pbnRlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gTmV4dCBjaGFyIGluIEJpZyBFbmRpYW4gYnl0ZSBvcmRlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgY2ggID0gKCgqbmV4dENoYXIpIDw8IDgpICsgKihuZXh0Q2hhcisxKTsKKyAgICAgICAgICAgICAgICBuZXh0Q2hhciArPSAyOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyIHRoZW4gd2UgbmVlZCB0byBjb25zdW1lCisgICAgICAgICAgICAgICAgLy8gYSBmb2xsb3dpbmcgdmFsaWQgTE8gc3Vycm9nYXRlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKGNoID49IFVOSV9TVVJfSElHSF9TVEFSVCAmJiBjaCA8PSBVTklfU1VSX0hJR0hfRU5EKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUgYXJlIGluIHRoZSBzb3VyY2UgYnVmZmVyLi4uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGlmCSgocEFOVExSM19VSU5UOCkobmV4dENoYXIpIDwgKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGluIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoMiA9ICgoKm5leHRDaGFyKSA8PCA4KSArICoobmV4dENoYXIrMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSB2YWxpZCBsb3cgc3Vycm9nYXRlLCBjb25zdW1lIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoMiA+PSBVTklfU1VSX0xPV19TVEFSVCAmJiBjaDIgPD0gVU5JX1NVUl9MT1dfRU5EKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb25zdW1lZCBvbmUgMTYgYml0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisJCSAgICAgICAgICAgIG5leHRDaGFyICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaWdub3JlIGEgdmFsaWQgaGkgc3Vycm9nYXRlIHRoYXQgaGFzIG5vIGxvIHN1cnJvZ2F0ZSB0byBnbyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgYmVjYXVzZSB0aGUgYnVmZmVyIGVuZGVkCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkaWQgbm90IGNoZWNrIGZvciBhbiBpbnZhbGlkIGxvdyBzdXJyb2dhdGUgaGVyZSwgb3IgdGhhdCBmYWN0IHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbG8gc3Vycm9nYXRlIHdhcyBtaXNzaW5nLiBXZSBqdXN0IHBpY2tlZCBvdXQgb25lIDE2IGJpdCBjaGFyYWN0ZXIgdW5sZXNzIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAvLyB3YXMgYSB2YWxpZCBoaSBzdXJyb2dhdGUsIGluIHdoY2loIGNhc2Ugd2UgY29uc3VtZWQgdHdvIDE2IGJpdCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGdvIGJhY2t3YXJkcyBmcm9tIG91ciBpbnB1dCBwb2ludAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHdoaWxlICAgKGxhKysgPCAwICYmIChwQU5UTFIzX1VJTlQ4KW5leHRDaGFyID4gKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJldmlvdXMgMTYgYml0IGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgY2ggPSAoKCpuZXh0Q2hhciAtIDIpIDw8IDgpICsgKCpuZXh0Q2hhciAtMSk7CisgICAgICAgICAgICAgICAgbmV4dENoYXIgLT0gMjsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbG93IHN1cnJvZ2F0ZSB0aGVuIGdvIGJhY2sgb25lIG1vcmUgY2hhcmFjdGVyIGlmCisgICAgICAgICAgICAgICAgLy8gdGhlIGhpIHN1cnJvZ2F0ZSBpcyB0aGVyZQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKGNoID49IFVOSV9TVVJfTE9XX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfTE9XX0VORCkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaDIgPSAoKCpuZXh0Q2hhciAtIDIpIDw8IDgpICsgKCpuZXh0Q2hhciAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaDIgPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoMiA8PSBVTklfU1VSX0hJR0hfRU5EKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gWWVzLCB0aGVyZSBpcyBhIGhpZ2ggc3Vycm9nYXRlIHRvIG1hdGNoIGl0IHNvIGRlY3JlbWVudCBvbmUgbW9yZSBhbmQgcG9pbnQgdG8gdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyIC09MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE91ciBsb2NhbCBjb3B5IG9mIG5leHRDaGFyIGlzIG5vdyBwb2ludGluZyB0byBlaXRoZXIgdGhlIGNvcnJlY3QgY2hhcmFjdGVyIG9yIGVuZCBvZiBmaWxlCisgICAgICAgIC8vCisgICAgICAgIC8vIElucHV0IGJ1ZmZlciBzaXplIGlzIGFsd2F5cyBpbiBieXRlcworICAgICAgICAvLworCWlmCSggKHBBTlRMUjNfVUlOVDgpbmV4dENoYXIgPj0gKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisJeworCQlyZXR1cm4JQU5UTFIzX0NIQVJTVFJFQU1fRU9GOworCX0KKwllbHNlCisJeworICAgICAgICAgICAgLy8gUGljayB1cCB0aGUgbmV4dCAxNiBjaGFyYWN0ZXIgKGJpZyBlbmRpYW4gYnl0ZSBvcmRlcikKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjaCA9ICgoKm5leHRDaGFyKSA8PCA4KSArICoobmV4dENoYXIrMSk7CisgICAgICAgICAgICBuZXh0Q2hhciArPSAyOworCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXIgdGhlbiB3ZSBuZWVkIHRvIGNvbnN1bWUKKyAgICAgICAgICAgIC8vIGEgZm9sbG93aW5nIHZhbGlkIExPIHN1cnJvZ2F0ZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoY2ggPj0gVU5JX1NVUl9ISUdIX1NUQVJUICYmIGNoIDw9IFVOSV9TVVJfSElHSF9FTkQpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBzdXJyb2dhdGUgYXJlIGluIHRoZSBzb3VyY2UgYnVmZmVyLi4uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZgkoKHBBTlRMUjNfVUlOVDgpKG5leHRDaGFyKSA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgaW4gYmlnIGVuZGlhbiBieXRlIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIGNoMiA9ICgoKm5leHRDaGFyKSA8PCA4KSArICoobmV4dENoYXIrMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIHZhbGlkIGxvdyBzdXJyb2dhdGUsIGNvbnN1bWUgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMiA+PSBVTklfU1VSX0xPV19TVEFSVCAmJiBjaDIgPD0gVU5JX1NVUl9MT1dfRU5EKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBVVEYzMiBjb2RlIHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAoKGNoIC0gVU5JX1NVUl9ISUdIX1NUQVJUKSA8PCBoYWxmU2hpZnQpCisJCQkgICAgKyAoY2gyIC0gVU5JX1NVUl9MT1dfU1RBUlQpICsgaGFsZkJhc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGlnbm9yZSBhIHZhbGlkIGhpIHN1cnJvZ2F0ZSB0aGF0IGhhcyBubyBsbyBzdXJyb2dhdGUgdG8gZ28gd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBpdC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgYSB2YWxpZCBoaSBzdXJyb2dhdGUgdGhhdCBoYXMgbm8gbG8gc3Vycm9nYXRlIHRvIGdvIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBpdCBiZWNhdXNlIHRoZSBidWZmZXIgZW5kZWQKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaDsKK30KKworLy8vIFxicmllZiBDb21tb24gZnVuY3Rpb24gdG8gc2V0dXAgZnVuY3Rpb24gaW50ZXJmYWNlIGZvciBhIFVURjMgaW5wdXQgc3RyZWFtLgorLy8vCisvLy8gXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLwordm9pZCAKK2FudGxyM1VURjMyU2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfQk9PTEVBTiBtYWNoaW5lQmlnRW5kaWFuLCBBTlRMUjNfQk9PTEVBTiBpbnB1dEJpZ0VuZGlhbikKK3sKKyAgICAvLyBCdWlsZCBhIHN0cmluZyBmYWN0b3J5IGZvciB0aGlzIHN0cmVhbS4gVGhpcyBpcyBhIFVURjMyIHN0cmluZyBmYWN0b3J5IHdoaWNoIGlzIGEgc3RhbmRhcmQKKyAgICAvLyBwYXJ0IG9mIHRoZSBBTlRMUjMgc3RyaW5nLiBUaGUgc3RyaW5nIGZhY3RvcnkgaXMgdGhlbiBwYXNzZWQgdGhyb3VnaCB0aGUgd2hvbGUgY2hhaW4gb2YgbGV4ZXItPnBhcnNlci0+dHJlZS0+dHJlZXBhcnNlcgorICAgIC8vIGFuZCBzbyBvbi4KKyAgICAvLworICAgIGlucHV0LT5zdHJGYWN0b3J5CT0gYW50bHIzU3RyaW5nRmFjdG9yeU5ldyhpbnB1dC0+ZW5jb2RpbmcpOworCisgICAgLy8gR2VuZXJpYyBBUEkgdGhhdCBkb2VzIG5vdCBjYXJlIGFib3V0IGVuZGlhbmVzcy4KKyAgICAvLworICAgIGlucHV0LT5pc3RyZWFtLT5pbmRleAkgICAgPSAgYW50bHIzVVRGMzJJbmRleDsgICAgICAgICAgICAvLyBDYWxjdWxhdGUgY3VycmVudCBpbmRleCBpbiBpbnB1dCBzdHJlYW0sIFVURjE2IGJhc2VkCisgICAgaW5wdXQtPnN1YnN0cgkJICAgID0gIGFudGxyM1VURjMyU3Vic3RyOwkgICAgLy8gUmV0dXJuIGEgc3RyaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgIGlucHV0LT5pc3RyZWFtLT5zZWVrCSAgICA9ICBhbnRscjNVVEYzMlNlZWs7CQkgICAgLy8gSG93IHRvIHNlZWsgdG8gYSBzcGVjaWZpYyBwb2ludCBpbiB0aGUgc3RyZWFtCisgICAgaW5wdXQtPmlzdHJlYW0tPmNvbnN1bWUJICAgID0gIGFudGxyM1VURjMyQ29uc3VtZTsJICAgIC8vIENvbnN1bWUgdGhlIG5leHQgVVRGMzIgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIKKworICAgIC8vIFdlIG11c3QgaW5zdGFsbCBkaWZmZXJlbnQgVVRGMzIgTEEgcm91dGluZXMgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIGlucHV0CisgICAgLy8gaXMgdGhlIHNhbWUgZW5kaWFuZXNzIGFzIHRoZSBtYWNoaW5lIHdlIGFyZSBleGVjdXRpbmcgdXBvbiBvciBub3QuIElmIGl0IGlzIG5vdAorICAgIC8vIHRoZW4gd2UgbXVzdCBpbnN0YWxsIG1ldGhvZHMgdGhhdCBjYW4gY29udmVydCB0aGUgZW5kaWFuZXNzIG9uIHRoZSBmbHkgYXMgdGhleSBnbworICAgIC8vCisgICAgc3dpdGNoIChtYWNoaW5lQmlnRW5kaWFuKQorICAgIHsKKyAgICAgICAgY2FzZSAgICBBTlRMUjNfVFJVRToKKworICAgICAgICAgICAgLy8gTWFjaGluZSBpcyBCaWcgRW5kaWFuLCBpZiB0aGUgaW5wdXQgaXMgYWxzbyB0aGVuIGluc3RhbGwgdGhlIAorICAgICAgICAgICAgLy8gbWV0aG9kcyB0aGF0IGRvIG5vdCBhY2Nlc3MgaW5wdXQgYnkgYnl0ZXMgYW5kIHJldmVyc2UgdGhlbS4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpbnN0YWxsIGVuZGlhbiBhd2FyZSBtZXRob2RzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICAoaW5wdXRCaWdFbmRpYW4gPT0gQU5UTFIzX1RSVUUpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElucHV0IGlzIG1hY2hpbmUgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPmlzdHJlYW0tPl9MQSAgICAgICAgID0gIGFudGxyM1VURjMyTEE7CQkgICAgLy8gUmV0dXJuIHRoZSBVVEYzMiBjaGFyYWN0ZXIgYXQgb2Zmc2V0IG4gKDEgYmFzZWQpICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIG1ldGhvZHMgdGhhdCBrbm93IHRoYXQgdGhlIGlucHV0IGlzIGxpdHRsZSBlbmRpYW4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlucHV0LT5pc3RyZWFtLT5fTEEgICAgICAgICA9ICBhbnRscjNVVEYzMkxBTEU7CQkgICAgLy8gUmV0dXJuIHRoZSBVVEYzMiBjaGFyYWN0ZXIgYXQgb2Zmc2V0IG4gKDEgYmFzZWQpIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAgICBBTlRMUjNfRkFMU0U6CisKKyAgICAgICAgICAgIC8vIE1hY2hpbmUgaXMgTGl0dGxlIEVuZGlhbiwgaWYgdGhlIGlucHV0IGlzIGFsc28gdGhlbiBpbnN0YWxsIHRoZSAKKyAgICAgICAgICAgIC8vIG1ldGhvZHMgdGhhdCBkbyBub3QgYWNjZXNzIGlucHV0IGJ5IGJ5dGVzIGFuZCByZXZlcnNlIHRoZW0uCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgaW5zdGFsbCBlbmRpYW4gYXdhcmUgbWV0aG9kcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAgKGlucHV0QmlnRW5kaWFuID09IEFOVExSM19GQUxTRSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSW5wdXQgaXMgbWFjaGluZSBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpbnB1dC0+aXN0cmVhbS0+X0xBICAgICAgICAgPSAgYW50bHIzVVRGMzJMQTsJCSAgICAvLyBSZXR1cm4gdGhlIFVURjMyIGNoYXJhY3RlciBhdCBvZmZzZXQgbiAoMSBiYXNlZCkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byB1c2UgbWV0aG9kcyB0aGF0IGtub3cgdGhhdCB0aGUgaW5wdXQgaXMgQmlnIEVuZGlhbgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaW5wdXQtPmlzdHJlYW0tPl9MQSAgICAgICAgID0gIGFudGxyM1VURjMyTEFCRTsJCSAgICAvLyBSZXR1cm4gdGhlIFVURjMyIGNoYXJhY3RlciBhdCBvZmZzZXQgbiAoMSBiYXNlZCkgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbnB1dC0+Y2hhckJ5dGVTaXplCQkgICAgPSA0OwkJCSAgICAvLyBTaXplIGluIGJ5dGVzIG9mIGNoYXJhY3RlcnMgaW4gdGhpcyBzdHJlYW0uCit9CisKKy8qKiBcYnJpZWYgQ29uc3VtZSB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gYSBVVEYzMiBpbnB1dCBzdHJlYW0KKyAqCisgKiBccGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorICovCitzdGF0aWMgdm9pZAorYW50bHIzVVRGMzJDb25zdW1lKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworICAgIGlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisKKyAgICAvLyBTaXplQnVmIGlzIGFsd2F5cyBpbiBieXRlcworICAgIC8vCisgICAgaWYJKChwQU5UTFIzX1VJTlQ4KShpbnB1dC0+bmV4dENoYXIpIDwgKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgewkKKwkvKiBJbmRpY2F0ZSBvbmUgbW9yZSBjaGFyYWN0ZXIgaW4gdGhpcyBsaW5lCisJICovCisJaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZSsrOworCQorCWlmICAoKEFOVExSM19VQ0hBUikoKigocEFOVExSM19VSU5UMzIpaW5wdXQtPm5leHRDaGFyKSkgPT0gaW5wdXQtPm5ld2xpbmVDaGFyKQorCXsKKwkgICAgLyogUmVzZXQgZm9yIHN0YXJ0IG9mIGEgbmV3IGxpbmUgb2YgaW5wdXQKKwkgICAgICovCisJICAgIGlucHV0LT5saW5lKys7CisJICAgIGlucHV0LT5jaGFyUG9zaXRpb25JbkxpbmUJPSAwOworCSAgICBpbnB1dC0+Y3VycmVudExpbmUJCT0gKHZvaWQgKikoKChwQU5UTFIzX1VJTlQzMilpbnB1dC0+bmV4dENoYXIpICsgMSk7CisJfQorCisJLyogSW5jcmVtZW50IHRvIG5leHQgY2hhcmFjdGVyIHBvc2l0aW9uCisJICovCisJaW5wdXQtPm5leHRDaGFyID0gKHZvaWQgKikoKChwQU5UTFIzX1VJTlQzMilpbnB1dC0+bmV4dENoYXIpICsgMSk7CisgICAgfQorfQorCisvLy8gXGJyaWVmIENhbGN1bGF0ZSB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KKy8vLyBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLworc3RhdGljIEFOVExSM19NQVJLRVIgCithbnRscjNVVEYzMkluZGV4KHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworICAgIGlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisKKyAgICByZXR1cm4gIChBTlRMUjNfTUFSS0VSKShpbnB1dC0+bmV4dENoYXIpOworfQorCisvLy8gXGJyaWVmIFJldHVybiBhIHN1YnN0cmluZyBvZiB0aGUgVVRGMTYgaW5wdXQgc3RyZWFtIGluCisvLy8gIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkuCisvLy8KKy8vLyBccGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorLy8vIFxwYXJhbSBzdGFydCBPZmZzZXQgaW4gaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSBzdHJpbmcgc3RhcnRzCisvLy8gXHBhcmFtIHN0b3AgIE9mZnNldCBpbiB0aGUgaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSBzdHJpbmcgZW5kcy4KKy8vLworc3RhdGljIHBBTlRMUjNfU1RSSU5HCithbnRscjNVVEYzMlN1YnN0cgkJKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBBTlRMUjNfTUFSS0VSIHN0YXJ0LCBBTlRMUjNfTUFSS0VSIHN0b3ApCit7CisgICAgcmV0dXJuICBpbnB1dC0+c3RyRmFjdG9yeS0+bmV3UHRyKGlucHV0LT5zdHJGYWN0b3J5LCAocEFOVExSM19VSU5UOClzdGFydCwgKChBTlRMUjNfVUlOVDMyX0NBU1Qoc3RvcCAtIHN0YXJ0KSkvNCkgKyAxKTsKK30KKworLy8vIFxicmllZiBSZXdpbmQgdGhlIGxleGVyIGlucHV0IHRvIHRoZSBzdGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN1cHBsaWVkIG1hcmsuCisvLy8KKy8vLyBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLworLy8vIFxyZW1hcmsKKy8vLyBBc3N1bWVzIFVURjMyIGlucHV0IHN0cmVhbS4KKy8vLworc3RhdGljIHZvaWQKK2FudGxyM1VURjMyU2VlawkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIHNlZWtQb2ludCkKK3sKKwlwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworCWlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSBpcy0+c3VwZXIpOworCisJLy8gSWYgdGhlIHJlcXVlc3RlZCBzZWVrIHBvaW50IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudAorCS8vIGlucHV0IHBvaW50LCB0aGVuIHdlIGFzc3VtZSB0aGF0IHdlIGFyZSByZXNldHRpbmcgZnJvbSBhIG1hcmsKKwkvLyBhbmQgZG8gbm90IG5lZWQgdG8gc2NhbiwgYnV0IGNhbiBqdXN0IHNldCB0byB0aGVyZSBhcyByZXdpbmQgd2lsbAorICAgICAgICAvLyByZXNldCBsaW5lIG51bWJlcnMgYW5kIHNvIG9uLgorCS8vCisJaWYJKHNlZWtQb2ludCA8PSAoQU5UTFIzX01BUktFUikoaW5wdXQtPm5leHRDaGFyKSkKKwl7CisJCWlucHV0LT5uZXh0Q2hhcgk9ICh2b2lkICopc2Vla1BvaW50OworCX0KKwllbHNlCisJeworICAgICAgICAgICAgLy8gQ2FsbCBjb25zdW1lIHVudGlsIHdlIHJlYWNoIHRoZSBhc2tlZCBmb3Igc2VlayBwb2ludCBvciBFT0YKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB3aGlsZSAoaXMtPl9MQShpcywgMSkgIT0gQU5UTFIzX0NIQVJTVFJFQU1fRU9GICYmIHNlZWtQb2ludCA8IChBTlRMUjNfTUFSS0VSKWlucHV0LT5uZXh0Q2hhcikKKwkgICAgeworCQlpcy0+Y29uc3VtZShpcyk7CisJICAgIH0KKwl9Cit9CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBpbnB1dCBlbGVtZW50IGFzc3VtaW5nIGEgVVRGMzIgaW5wdXQgaW4gbmF0dXJhbCBtYWNoaW5lIGJ5dGUgb3JkZXIKKyAqCisgKiBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gbGEgMSBiYXNlZCBvZmZzZXQgb2YgbmV4dCBpbnB1dCBzdHJlYW0gZWxlbWVudAorICoKKyAqIFxyZXR1cm4gTmV4dCBpbnB1dCBjaGFyYWN0ZXIgaW4gaW50ZXJuYWwgQU5UTFIzIGVuY29kaW5nIChVVEYzMikKKyAqLworc3RhdGljIEFOVExSM19VQ0hBUiAKK2FudGxyM1VURjMyTEEocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpCit7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisJCisgICAgaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKworICAgIGlmCSgoICgocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIpICsgbGEgLSAxKSA+PSAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKyAgICB7CisJCXJldHVybglBTlRMUjNfQ0hBUlNUUkVBTV9FT0Y7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCXJldHVybgkoQU5UTFIzX1VDSEFSKSgqKChwQU5UTFIzX1VJTlQzMilpbnB1dC0+bmV4dENoYXIgKyBsYSAtIDEpKTsKKyAgICB9Cit9CisKKy8qKiBcYnJpZWYgUmV0dXJuIHRoZSBpbnB1dCBlbGVtZW50IGFzc3VtaW5nIGEgVVRGMzIgaW5wdXQgaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyCisgKgorICogXHBhcmFtW2luXSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisgKiBccGFyYW1baW5dIGxhIDEgYmFzZWQgb2Zmc2V0IG9mIG5leHQgaW5wdXQgc3RyZWFtIGVsZW1lbnQKKyAqCisgKiBccmV0dXJuIE5leHQgaW5wdXQgY2hhcmFjdGVyIGluIGludGVybmFsIEFOVExSMyBlbmNvZGluZyAoVVRGMzIpCisgKi8KK3N0YXRpYyBBTlRMUjNfVUNIQVIgCithbnRscjNVVEYzMkxBTEUocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgbGEpCit7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisJCisgICAgaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKworICAgIGlmCSgoICgocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIpICsgbGEgLSAxKSA+PSAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKyAgICB7CisJCXJldHVybglBTlRMUjNfQ0hBUlNUUkVBTV9FT0Y7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFOVExSM19VQ0hBUiAgIGM7CisKKyAgICAgICAgYyA9IChBTlRMUjNfVUNIQVIpKCooKHBBTlRMUjNfVUlOVDMyKWlucHV0LT5uZXh0Q2hhciArIGxhIC0gMSkpOworCisgICAgICAgIC8vIFN3YXAgRW5kaWFuZXNzIHRvIEJpZyBFbmRpYW4KKyAgICAgICAgLy8KKyAgICAgICAgcmV0dXJuIChjPj4yNCkgfCAoKGM8PDgpICYgMHgwMEZGMDAwMCkgfCAoKGM+PjgpICYgMHgwMDAwRkYwMCkgfCAoYzw8MjQpOworICAgIH0KK30KKworLyoqIFxicmllZiBSZXR1cm4gdGhlIGlucHV0IGVsZW1lbnQgYXNzdW1pbmcgYSBVVEYzMiBpbnB1dCBpbiBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIKKyAqCisgKiBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gbGEgMSBiYXNlZCBvZmZzZXQgb2YgbmV4dCBpbnB1dCBzdHJlYW0gZWxlbWVudAorICoKKyAqIFxyZXR1cm4gTmV4dCBpbnB1dCBjaGFyYWN0ZXIgaW4gaW50ZXJuYWwgQU5UTFIzIGVuY29kaW5nIChVVEYzMikKKyAqIFxyZW1hcmsgVGhpcyBpcyB0aGUgc2FtZSBjb2RlIGFzIExFIHZlcnNpb24gYnV0IHNlcHJhdGVkIGluIGNhc2UgdGhlcmUgYXJlIGJldHRlciBvcHRpbWlzYXRpb25zIGZvIHJlbmRpbmFuIHN3YXAKKyAqLworc3RhdGljIEFOVExSM19VQ0hBUiAKK2FudGxyM1VURjMyTEFCRShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSkKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKwkKKyAgICBpbnB1dCAgID0gKChwQU5UTFIzX0lOUFVUX1NUUkVBTSkgKGlzLT5zdXBlcikpOworCisgICAgaWYJKCggKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5uZXh0Q2hhcikgKyBsYSAtIDEpID49ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgIHsKKwkJcmV0dXJuCUFOVExSM19DSEFSU1RSRUFNX0VPRjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQU5UTFIzX1VDSEFSICAgYzsKKworICAgICAgICBjID0gKEFOVExSM19VQ0hBUikoKigocEFOVExSM19VSU5UMzIpaW5wdXQtPm5leHRDaGFyICsgbGEgLSAxKSk7CisKKyAgICAgICAgLy8gU3dhcCBFbmRpYW5lc3MgdG8gTGl0dGxlIEVuZGlhbgorICAgICAgICAvLworICAgICAgICByZXR1cm4gKGM+PjI0KSB8ICgoYzw8OCkgJiAweDAwRkYwMDAwKSB8ICgoYz4+OCkgJiAweDAwMDBGRjAwKSB8IChjPDwyNCk7CisgICAgfQorfQorCisKKy8vLyBcYnJpZWYgQ29tbW9uIGZ1bmN0aW9uIHRvIHNldHVwIGZ1bmN0aW9uIGludGVyZmFjZSBmb3IgYSBVVEY4IGlucHV0IHN0cmVhbS4KKy8vLworLy8vIFxwYXJhbSBpbnB1dCBJbnB1dCBzdHJlYW0gY29udGV4dCBwb2ludGVyCisvLy8KK3ZvaWQgCithbnRscjNVVEY4U2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KQoreworICAgIC8vIEJ1aWxkIGEgc3RyaW5nIGZhY3RvcnkgZm9yIHRoaXMgc3RyZWFtLiBUaGlzIGlzIGEgVVRGMTYgc3RyaW5nIGZhY3Rvcnkgd2hpY2ggaXMgYSBzdGFuZGFyZAorICAgIC8vIHBhcnQgb2YgdGhlIEFOVExSMyBzdHJpbmcuIFRoZSBzdHJpbmcgZmFjdG9yeSBpcyB0aGVuIHBhc3NlZCB0aHJvdWdoIHRoZSB3aG9sZSBjaGFpbiBvZiBsZXhlci0+cGFyc2VyLT50cmVlLT50cmVlcGFyc2VyCisgICAgLy8gYW5kIHNvIG9uLgorICAgIC8vCisgICAgaW5wdXQtPnN0ckZhY3RvcnkJPSBhbnRscjNTdHJpbmdGYWN0b3J5TmV3KGlucHV0LT5lbmNvZGluZyk7CisKKyAgICAvLyBHZW5lcmljIEFQSSB0aGF0IGRvZXMgbm90IGNhcmUgYWJvdXQgZW5kaWFuZXNzLgorICAgIC8vCisgICAgaW5wdXQtPmlzdHJlYW0tPmNvbnN1bWUJPSBhbnRscjNVVEY4Q29uc3VtZTsJLy8gQ29uc3VtZSB0aGUgbmV4dCBVVEYzMiBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlcgorICAgIGlucHV0LT5pc3RyZWFtLT5fTEEgICAgICAgICA9IGFudGxyM1VURjhMQTsgICAgICAgICAvLyBSZXR1cm4gdGhlIFVURjMyIGNoYXJhY3RlciBhdCBvZmZzZXQgbiAoMSBiYXNlZCkgICAgCisgICAgaW5wdXQtPmNoYXJCeXRlU2l6ZQkJPSAwOwkgICAgICAgICAgICAgICAgLy8gU2l6ZSBpbiBieXRlcyBvZiBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyZWFtLgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvbGxvd2luZyBpcyBmcm9tIFVuaWNvZGUub3JnIChzZWUgYW50bHIzY29udmVydHV0Zi5jKQorLy8KKworLy8vIEluZGV4IGludG8gdGhlIHRhYmxlIGJlbG93IHdpdGggdGhlIGZpcnN0IGJ5dGUgb2YgYSBVVEYtOCBzZXF1ZW5jZSB0bworLy8vIGdldCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIGJ5dGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGZvbGxvdyBpdC4KKy8vLyBOb3RlIHRoYXQgKmxlZ2FsKiBVVEYtOCB2YWx1ZXMgY2FuJ3QgaGF2ZSA0IG9yIDUtYnl0ZXMuIFRoZSB0YWJsZSBpcworLy8vIGxlZnQgYXMtaXMgZm9yIGFueW9uZSB3aG8gbWF5IHdhbnQgdG8gZG8gc3VjaCBjb252ZXJzaW9uLCB3aGljaCB3YXMKKy8vLyBhbGxvd2VkIGluIGVhcmxpZXIgYWxnb3JpdGhtcy4KKy8vLworc3RhdGljIGNvbnN0IEFOVExSM19VSU5UMzIgdHJhaWxpbmdCeXRlc0ZvclVURjhbMjU2XSA9IHsKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsIDMsMywzLDMsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUKK307CisKKy8vLyBNYWdpYyB2YWx1ZXMgc3VidHJhY3RlZCBmcm9tIGEgYnVmZmVyIHZhbHVlIGR1cmluZyBVVEY4IGNvbnZlcnNpb24uCisvLy8gVGhpcyB0YWJsZSBjb250YWlucyBhcyBtYW55IHZhbHVlcyBhcyB0aGVyZSBtaWdodCBiZSB0cmFpbGluZyBieXRlcworLy8vIGluIGEgVVRGLTggc2VxdWVuY2UuCisvLy8KK3N0YXRpYyBjb25zdCBVVEYzMiBvZmZzZXRzRnJvbVVURjhbNl0gPSAKKyAgICB7ICAgMHgwMDAwMDAwMFVMLCAweDAwMDAzMDgwVUwsIDB4MDAwRTIwODBVTCwgCisJMHgwM0M4MjA4MFVMLCAweEZBMDgyMDgwVUwsIDB4ODIwODIwODBVTCAKKyAgICB9OworCisvLyBFbmQgb2YgVW5pY29kZS5vcmcgdGFibGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLyoqIFxicmllZiBDb25zdW1lIHRoZSBuZXh0IGNoYXJhY3RlciBpbiBhIFVURjggaW5wdXQgc3RyZWFtCisgKgorICogXHBhcmFtIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqLworc3RhdGljIHZvaWQKK2FudGxyM1VURjhDb25zdW1lKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dDsKKyAgICBBTlRMUjNfVUlOVDMyICAgICAgICAgICBleHRyYUJ5dGVzVG9SZWFkOworICAgIEFOVExSM19VQ0hBUiAgICAgICAgICAgIGNoOworICAgIHBBTlRMUjNfVUlOVDggICAgICAgICAgIG5leHRDaGFyOworCisgICAgaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKworICAgIG5leHRDaGFyID0gaW5wdXQtPm5leHRDaGFyOworCisgICAgaWYJKG5leHRDaGFyIDwgKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgewkKKwkvLyBJbmRpY2F0ZSBvbmUgbW9yZSBjaGFyYWN0ZXIgaW4gdGhpcyBsaW5lCisJLy8KKwlpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lKys7CisJCisgICAgICAgIC8vIEFyZSB0aGVyZSBtb3JlIGJ5dGVzIG5lZWRlZCB0byBtYWtlIHVwIHRoZSB3aG9sZSB0aGluZz8KKyAgICAgICAgLy8KKyAgICAgICAgZXh0cmFCeXRlc1RvUmVhZCA9IHRyYWlsaW5nQnl0ZXNGb3JVVEY4WypuZXh0Q2hhcl07CisKKyAgICAgICAgaWYJKG5leHRDaGFyICsgZXh0cmFCeXRlc1RvUmVhZCA+PSAoKChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhKSArIGlucHV0LT5zaXplQnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5wdXQtPm5leHRDaGFyID0gKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1Zik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDYXNlcyBkZWxpYmVyYXRlbHkgZmFsbCB0aHJvdWdoIChzZWUgbm90ZSBBIGluIGFudGxyY29udmVydHV0Zi5jKQorICAgICAgICAvLyBMZWdhbCBVVEY4IGlzIG9ubHkgNCBieXRlcyBidXQgNiBieXRlcyBjb3VsZCBiZSB1c2VkIGluIG9sZCBVVEY4IHNvCisgICAgICAgIC8vIHdlIGFsbG93IGl0LgorICAgICAgICAvLworICAgICAgICBjaCAgPSAwOworICAgICAgIAlzd2l0Y2ggKGV4dHJhQnl0ZXNUb1JlYWQpIHsKKwkgICAgY2FzZSA1OiBjaCArPSAqbmV4dENoYXIrKzsgY2ggPDw9IDY7CisJICAgIGNhc2UgNDogY2ggKz0gKm5leHRDaGFyKys7IGNoIDw8PSA2OworCSAgICBjYXNlIDM6IGNoICs9ICpuZXh0Q2hhcisrOyBjaCA8PD0gNjsKKwkgICAgY2FzZSAyOiBjaCArPSAqbmV4dENoYXIrKzsgY2ggPDw9IDY7CisJICAgIGNhc2UgMTogY2ggKz0gKm5leHRDaGFyKys7IGNoIDw8PSA2OworCSAgICBjYXNlIDA6IGNoICs9ICpuZXh0Q2hhcisrOworCX0KKworICAgICAgICAvLyBNYWdpY2FsbHkgY29ycmVjdCB0aGUgaW5wdXQgdmFsdWUKKyAgICAgICAgLy8KKwljaCAtPSBvZmZzZXRzRnJvbVVURjhbZXh0cmFCeXRlc1RvUmVhZF07CisJaWYgIChjaCA9PSBpbnB1dC0+bmV3bGluZUNoYXIpCisJeworCSAgICAvKiBSZXNldCBmb3Igc3RhcnQgb2YgYSBuZXcgbGluZSBvZiBpbnB1dAorCSAgICAgKi8KKwkgICAgaW5wdXQtPmxpbmUrKzsKKwkgICAgaW5wdXQtPmNoYXJQb3NpdGlvbkluTGluZQk9IDA7CisJICAgIGlucHV0LT5jdXJyZW50TGluZQkJPSAodm9pZCAqKW5leHRDaGFyOworCX0KKworICAgICAgICAvLyBVcGRhdGUgaW5wdXQgcG9pbnRlcgorICAgICAgICAvLworICAgICAgICBpbnB1dC0+bmV4dENoYXIgPSBuZXh0Q2hhcjsKKyAgICB9Cit9CisvKiogXGJyaWVmIFJldHVybiB0aGUgaW5wdXQgZWxlbWVudCBhc3N1bWluZyBhIFVURjggaW5wdXQKKyAqCisgKiBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gbGEgMSBiYXNlZCBvZmZzZXQgb2YgbmV4dCBpbnB1dCBzdHJlYW0gZWxlbWVudAorICoKKyAqIFxyZXR1cm4gTmV4dCBpbnB1dCBjaGFyYWN0ZXIgaW4gaW50ZXJuYWwgQU5UTFIzIGVuY29kaW5nIChVVEYzMikKKyAqLworc3RhdGljIEFOVExSM19VQ0hBUiAKK2FudGxyM1VURjhMQShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSkKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSAgICBpbnB1dDsKKyAgICBBTlRMUjNfVUlOVDMyICAgICAgICAgICBleHRyYUJ5dGVzVG9SZWFkOworICAgIEFOVExSM19VQ0hBUiAgICAgICAgICAgIGNoOworICAgIHBBTlRMUjNfVUlOVDggICAgICAgICAgIG5leHRDaGFyOworCisgICAgaW5wdXQgICA9ICgocEFOVExSM19JTlBVVF9TVFJFQU0pIChpcy0+c3VwZXIpKTsKKworICAgIG5leHRDaGFyID0gaW5wdXQtPm5leHRDaGFyOworCisgICAgLy8gRG8gd2UgbmVlZCB0byB0cmF2ZXJzZSBmb3J3YXJkcyBvciBiYWNrd2FyZHM/CisgICAgLy8gLSBMQSgwKSBpcyB0cmVhdGVkIGFzIExBKDEpIGFuZCB3ZSBhc3N1bWUgdGhhdCB0aGUgbmV4dENoYXIgaXMKKyAgICAvLyAgIGFscmVhZHkgcG9zaXRpb25lZC4KKyAgICAvLyAtIExBKG4rKSA7IG4+MSBtZWFucyB3ZSBtdXN0IHRyYXZlcnNlIGZvcndhcmQgbi0xIGNoYXJhY3RlcnMgY2F0ZXJpbmcgZm9yIFVURjggZW5jb2RpbmcKKyAgICAvLyAtIExBKC1uKSBtZWFucyB3ZSBtdXN0IHRyYXZlcnNlIGJhY2t3YXJkcyBuIGNocmFjdGVycworICAgIC8vCisgICAgaWYgKGxhID4gMSkgeworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBsZWZ0IGJlZm9yZSB0cnlpbmcgdG8KKyAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBidWZmZXIuCisgICAgICAgIC8vCisgICAgICAgIGlmCShuZXh0Q2hhciA8ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgICAgICB7CQorICAgICAgICAgICAgLy8gTm93IHRyYXZlcnNlIG4tMSBjaGFyYWN0ZXJzIGZvcndhcmQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB3aGlsZSAoLS1sYSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgbmV4dCBjaGFyYWN0ZXIgcmVxdWlyZSB0cmFpbGluZyBieXRlcz8KKyAgICAgICAgICAgICAgICAvLyBJZiBzbyBhZHZhbmNlIHRoZSBwb2ludGVyIGJ5IHRoYXQgbWFueSBieXRlcyBhcyB3ZWxsIGFzIGFkdmFuY2luZworICAgICAgICAgICAgICAgIC8vIG9uZSBwb3NpdGlvbiBmb3Igd2hhdCB3aWxsIGJlIGF0IGxlYXN0IGEgc2luZ2xlIGJ5dGUgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgbmV4dENoYXIgKz0gdHJhaWxpbmdCeXRlc0ZvclVURjhbKm5leHRDaGFyXSArIDE7CisKKyAgICAgICAgICAgICAgICAvLyBEb2VzIHRoYXQgY2FsY3VsYXRpb24gdGFrZSB1cyBwYXN0IHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgYnVmZmVyPworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYJKG5leHRDaGFyID49ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFOVExSM19DSEFSU1RSRUFNX0VPRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQU5UTFIzX0NIQVJTVFJFQU1fRU9GOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIExBIGlzIG5lZ2F0aXZlIHNvIHdlIGRlY3JlYXNlIHRoZSBwb2ludGVyIGJ5IG4gY2hhcmFjdGVyIHBvc2l0aW9ucworICAgICAgICAvLworICAgICAgICB3aGlsZSAgIChuZXh0Q2hhciA+IChwQU5UTFIzX1VJTlQ4KWlucHV0LT5kYXRhICYmIGxhKysgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUcmF2ZXJzaW5nIGJhY2t3YXJkcyBpbiBVVEY4IG1lYW5zIGRlY2VybWVudGluZyBieSBvbmUKKyAgICAgICAgICAgIC8vIHRoZW4gY29udGludWluZyB0byBkZWNyZW1lbnQgd2hpbGUgZXZlciBhIGNoYXJhY3RlciBwYXR0ZXJuCisgICAgICAgICAgICAvLyBpcyBmbGFnZ2VkIGFzIGJlaW5nIGEgdHJhaWxpbmcgYnl0ZSBvZiBhbiBlbmNvZGVkIGNvZGUgcG9pbnQuCisgICAgICAgICAgICAvLyBUcmFpbGluZyBVVEY4IGJ5dGVzIGFsd2F5cyBzdGFydCB3aXRoIDEwIGluIGJpbmFyeS4gV2UgYXNzdW1uZSB0aGF0CisgICAgICAgICAgICAvLyB0aGUgVVRGOCBpcyB3ZWxsIGZvcm1lZCBhbmQgZG8gbm90IGNoZWNrIGJvdW5kYXJ5IGNvbmRpdGlvbnMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBuZXh0Q2hhci0tOworICAgICAgICAgICAgd2hpbGUgKCgqbmV4dENoYXIgJiAweEMwKSA9PSAweDgwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5leHRDaGFyLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBuZXh0Q2hhciBpcyBub3cgcG9pbnRpbmcgYXQgdGhlIFVURjggZW5jb2RlZCBjaGFyYWN0ZXIgdGhhdCB3ZSBuZWVkIHRvCisgICAgLy8gZGVjb2RlIGFuZCByZXR1cm4uCisgICAgLy8KKyAgICAvLyBBcmUgdGhlcmUgbW9yZSBieXRlcyBuZWVkZWQgdG8gbWFrZSB1cCB0aGUgd2hvbGUgdGhpbmc/CisgICAgLy8KKyAgICBleHRyYUJ5dGVzVG9SZWFkID0gdHJhaWxpbmdCeXRlc0ZvclVURjhbKm5leHRDaGFyXTsKKyAgICBpZgkobmV4dENoYXIgKyBleHRyYUJ5dGVzVG9SZWFkID49ICgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPmRhdGEpICsgaW5wdXQtPnNpemVCdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFOVExSM19DSEFSU1RSRUFNX0VPRjsKKyAgICB9CisKKyAgICAvLyBDYXNlcyBkZWxpYmVyYXRlbHkgZmFsbCB0aHJvdWdoIChzZWUgbm90ZSBBIGluIGFudGxyY29udmVydHV0Zi5jKQorICAgIC8vIAorICAgIGNoICA9IDA7CisgICAgc3dpdGNoIChleHRyYUJ5dGVzVG9SZWFkKSB7CisgICAgICAgICAgICBjYXNlIDU6IGNoICs9ICpuZXh0Q2hhcisrOyBjaCA8PD0gNjsKKyAgICAgICAgICAgIGNhc2UgNDogY2ggKz0gKm5leHRDaGFyKys7IGNoIDw8PSA2OworICAgICAgICAgICAgY2FzZSAzOiBjaCArPSAqbmV4dENoYXIrKzsgY2ggPDw9IDY7CisgICAgICAgICAgICBjYXNlIDI6IGNoICs9ICpuZXh0Q2hhcisrOyBjaCA8PD0gNjsKKyAgICAgICAgICAgIGNhc2UgMTogY2ggKz0gKm5leHRDaGFyKys7IGNoIDw8PSA2OworICAgICAgICAgICAgY2FzZSAwOiBjaCArPSAqbmV4dENoYXIrKzsKKyAgICB9CisKKyAgICAvLyBNYWdpY2FsbHkgY29ycmVjdCB0aGUgaW5wdXQgdmFsdWUKKyAgICAvLworICAgIGNoIC09IG9mZnNldHNGcm9tVVRGOFtleHRyYUJ5dGVzVG9SZWFkXTsKKworICAgIHJldHVybiBjaDsKK30KKworLy8gRUJDRElDIHRvIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUKKy8vCisvLyBUaGlzIGZvciBFQkNESUMgRURGMDQgdHJhbnNsYXRlZCB0byBJU08tODg1OS4xIHdoaWNoIGlzIHRoZSB1c3VhbGx5IGFjY2VwdGVkIFBPU0lYCisvLyB0cmFuc2xhdGlvbiBhbmQgdGhlIGNoYXJhY3RlciB0YWJsZXMgYXJlIHB1Ymxpc2hlZCBhbGwgb3ZlciB0aGUgaW50ZXJ3ZWIuCisvLyAKK2NvbnN0IEFOVExSM19VQ0hBUiBlMmFbMjU2XSA9Cit7CisgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHg4NSwgMHgwOSwgMHg4NiwgMHg3ZiwKKyAgICAweDg3LCAweDhkLCAweDhlLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4OGYsIDB4MGEsIDB4MDgsIDB4OTcsCisgICAgMHgxOCwgMHgxOSwgMHg5YywgMHg5ZCwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKKyAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDkyLCAweDE3LCAweDFiLAorICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4MDUsIDB4MDYsIDB4MDcsIAorICAgIDB4OTAsIDB4OTEsIDB4MTYsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4MDQsCisgICAgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHgxNCwgMHgxNSwgMHg5ZSwgMHgxYSwKKyAgICAweDIwLCAweGEwLCAweGUyLCAweGU0LCAweGUwLCAweGUxLCAweGUzLCAweGU1LAorICAgIDB4ZTcsIDB4ZjEsIDB4NjAsIDB4MmUsIDB4M2MsIDB4MjgsIDB4MmIsIDB4N2MsCisgICAgMHgyNiwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlOCwgMHhlZCwgMHhlZSwgMHhlZiwKKyAgICAweGVjLCAweGRmLCAweDIxLCAweDI0LCAweDJhLCAweDI5LCAweDNiLCAweDlmLAorICAgIDB4MmQsIDB4MmYsIDB4YzIsIDB4YzQsIDB4YzAsIDB4YzEsIDB4YzMsIDB4YzUsCisgICAgMHhjNywgMHhkMSwgMHg1ZSwgMHgyYywgMHgyNSwgMHg1ZiwgMHgzZSwgMHgzZiwKKyAgICAweGY4LCAweGM5LCAweGNhLCAweGNiLCAweGM4LCAweGNkLCAweGNlLCAweGNmLAorICAgIDB4Y2MsIDB4YTgsIDB4M2EsIDB4MjMsIDB4NDAsIDB4MjcsIDB4M2QsIDB4MjIsCisgICAgMHhkOCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKKyAgICAweDY4LCAweDY5LCAweGFiLCAweGJiLCAweGYwLCAweGZkLCAweGZlLCAweGIxLAorICAgIDB4YjAsIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsCisgICAgMHg3MSwgMHg3MiwgMHhhYSwgMHhiYSwgMHhlNiwgMHhiOCwgMHhjNiwgMHhhNCwKKyAgICAweGI1LCAweGFmLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorICAgIDB4NzksIDB4N2EsIDB4YTEsIDB4YmYsIDB4ZDAsIDB4ZGQsIDB4ZGUsIDB4YWUsCisgICAgMHhhMiwgMHhhMywgMHhhNSwgMHhiNywgMHhhOSwgMHhhNywgMHhiNiwgMHhiYywKKyAgICAweGJkLCAweGJlLCAweGFjLCAweDViLCAweDVjLCAweDVkLCAweGI0LCAweGQ3LAorICAgIDB4ZjksIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisgICAgMHg0OCwgMHg0OSwgMHhhZCwgMHhmNCwgMHhmNiwgMHhmMiwgMHhmMywgMHhmNSwKKyAgICAweGE2LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLAorICAgIDB4NTEsIDB4NTIsIDB4YjksIDB4ZmIsIDB4ZmMsIDB4ZGIsIDB4ZmEsIDB4ZmYsCisgICAgMHhkOSwgMHhmNywgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwKKyAgICAweDU5LCAweDVhLCAweGIyLCAweGQ0LCAweGQ2LCAweGQyLCAweGQzLCAweGQ1LAorICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgICAgMHgzOCwgMHgzOSwgMHhiMywgMHg3YiwgMHhkYywgMHg3ZCwgMHhkYSwgMHg3ZQorfTsKKworLy8vIFxicmllZiBDb21tb24gZnVuY3Rpb24gdG8gc2V0dXAgZnVuY3Rpb24gaW50ZXJmYWNlIGZvciBhIEVCQ0RJQyBpbnB1dCBzdHJlYW0uCisvLy8KKy8vLyBccGFyYW0gaW5wdXQgSW5wdXQgc3RyZWFtIGNvbnRleHQgcG9pbnRlcgorLy8vCit2b2lkIAorYW50bHIzRUJDRElDU2V0dXBTdHJlYW0JKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KQoreworICAgIC8vIEVCQ0RJQyBzdHJlYW1zIGNhbiB1c2UgdGhlIHN0YW5kYXJkIDggYml0IHN0cmluZyBmYWN0b3J5CisgICAgLy8KKyAgICBpbnB1dC0+c3RyRmFjdG9yeQk9IGFudGxyM1N0cmluZ0ZhY3RvcnlOZXcoaW5wdXQtPmVuY29kaW5nKTsKKworICAgIC8vIEdlbmVyaWMgQVBJIHRoYXQgZG9lcyBub3QgY2FyZSBhYm91dCBlbmRpYW5lc3MuCisgICAgLy8KKyAgICBpbnB1dC0+aXN0cmVhbS0+X0xBICAgICAgICAgPSBhbnRscjNFQkNESUNMQTsgICAgICAgLy8gUmV0dXJuIHRoZSBVVEYzMiBjaGFyYWN0ZXIgYXQgb2Zmc2V0IG4gKDEgYmFzZWQpICAgIAorICAgIGlucHV0LT5jaGFyQnl0ZVNpemUJCT0gMTsJICAgICAgICAgICAgICAgIC8vIFNpemUgaW4gYnl0ZXMgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHN0cmVhbS4KK30KKworLy8vIFxicmllZiBSZXR1cm4gdGhlIGlucHV0IGVsZW1lbnQgYXNzdW1pbmcgYW4gOCBiaXQgRUJDRElDIGlucHV0CisvLy8KKy8vLyBccGFyYW1baW5dIGlucHV0IElucHV0IHN0cmVhbSBjb250ZXh0IHBvaW50ZXIKKy8vLyBccGFyYW1baW5dIGxhIDEgYmFzZWQgb2Zmc2V0IG9mIG5leHQgaW5wdXQgc3RyZWFtIGVsZW1lbnQKKy8vLworLy8vIFxyZXR1cm4gTmV4dCBpbnB1dCBjaGFyYWN0ZXIgaW4gaW50ZXJuYWwgQU5UTFIzIGVuY29kaW5nIChVVEYzMikgYWZ0ZXIgdHJhbnNsYXRpb24KKy8vLyAgICAgICAgIGZyb20gRUJDRElDIHRvIEFTQ0lJCisvLy8KK3N0YXRpYyBBTlRMUjNfVUNIQVIgCithbnRscjNFQkNESUNMQShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBsYSkKK3sKKyAgICBwQU5UTFIzX0lOUFVUX1NUUkVBTSBpbnB1dDsKKworICAgIGlucHV0ICAgPSAoKHBBTlRMUjNfSU5QVVRfU1RSRUFNKSAoaXMtPnN1cGVyKSk7CisKKyAgICBpZgkoKCAoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSArIGxhIC0gMSkgPj0gKCgocEFOVExSM19VSU5UOClpbnB1dC0+ZGF0YSkgKyBpbnB1dC0+c2l6ZUJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4JQU5UTFIzX0NIQVJTVFJFQU1fRU9GOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBUcmFuc2xhdGUgdGhlIHJlcXVpcmVkIGNoYXJhY3RlciB2aWEgdGhlIGNvbnN0YW50IGNvbnZlcnNpb24gdGFibGUKKyAgICAgICAgLy8KKyAgICAgICAgcmV0dXJuCWUyYVsoKigocEFOVExSM19VSU5UOClpbnB1dC0+bmV4dENoYXIgKyBsYSAtIDEpKV07CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2ludHN0cmVhbS5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzaW50c3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkNDlkOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM2ludHN0cmVhbS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8vLyBcZmlsZQorLy8vIEltcGxlbWVudGF0aW9uIG9mIHN1cGVyY2xhc3MgZWxlbWVudHMgb2YgYW4gQU5UTFIzIGludCBzdHJlYW0uCisvLy8gVGhlIG9ubHkgbWV0aG9kcyByZXF1aXJlZCBhcmUgYW4gYWxsb2NhdG9yIGFuZCBhIGRlc3RydWN0b3IuCisvLy8gXGFkZHRvZ3JvdXAgcEFOVExSM19JTlRfU1RSRUFNCisvLy8gQHsKKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzaW50c3RyZWFtLmg+CisKK3N0YXRpYwl2b2lkCWZyZWVTdHJlYW0gICAgKHBBTlRMUjNfSU5UX1NUUkVBTSBzdHJlYW0pOworCitBTlRMUjNfQVBJIHBBTlRMUjNfSU5UX1NUUkVBTQorYW50bHIzSW50U3RyZWFtTmV3KCkKK3sKKwlwQU5UTFIzX0lOVF9TVFJFQU0Jc3RyZWFtOworCisJLy8gQWxsb2NhdGUgbWVtb3J5CisJLy8KKwlzdHJlYW0gID0gKHBBTlRMUjNfSU5UX1NUUkVBTSkgQU5UTFIzX0NBTExPQygxLCBzaXplb2YoQU5UTFIzX0lOVF9TVFJFQU0pKTsKKworCWlmCShzdHJlYW0gPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCXN0cmVhbS0+ZnJlZSAgICA9ICBmcmVlU3RyZWFtOworCisJcmV0dXJuIHN0cmVhbTsKK30KKworc3RhdGljCXZvaWQJCitmcmVlU3RyZWFtICAgIChwQU5UTFIzX0lOVF9TVFJFQU0gc3RyZWFtKQoreworCUFOVExSM19GUkVFKHN0cmVhbSk7Cit9CisKKy8vLyBAfQorLy8vCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNsZXhlci5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzbGV4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTgxYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzbGV4ZXIuYwpAQCAtMCwwICsxLDkwNCBAQAorLyoqIFxmaWxlCisgKgorICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBhbnRsciAzIGxleGVyLgorICoKKyAqIEFuIEFOVExSMyBsZXhlciBpbXBsZW1lbnRzIGEgYmFzZSByZWNvbmdpemVyLCBhIHRva2VuIHNvdXJjZSBhbmQKKyAqIGEgbGV4ZXIgaW50ZXJmYWNlLiBJdCBjb25zdHJ1Y3RzIGEgYmFzZSByZWNvZ25pemVyIHdpdGggZGVmYXVsdAorICogZnVuY3Rpb25zLCB0aGVuIG92ZXJyaWRlcyBhbnkgb2YgdGhlc2UgdGhhdCBhcmUgcGFyc2VyIHNwZWNpZmljICh1c3VhbAorICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBiYXNlIHJlY29nbml6ZXIuCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzbGV4ZXIuaD4KKworc3RhdGljIHZvaWQJCQkJCW1Ub2tlbnMJCQkJCQkocEFOVExSM19MRVhFUiBsZXhlcik7CitzdGF0aWMgdm9pZAkJCQkJc2V0Q2hhclN0cmVhbQkJCQkocEFOVExSM19MRVhFUiBsZXhlciwgIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKK3N0YXRpYyB2b2lkCQkJCQlwdXNoQ2hhclN0cmVhbQkJCQkocEFOVExSM19MRVhFUiBsZXhlciwgIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KTsKK3N0YXRpYyB2b2lkCQkJCQlwb3BDaGFyU3RyZWFtCQkJCShwQU5UTFIzX0xFWEVSIGxleGVyKTsKKworc3RhdGljIHZvaWQJCQkJCWVtaXROZXcJCQkJCQkocEFOVExSM19MRVhFUiBsZXhlciwgIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRva2VuKTsKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTiBlbWl0CQkJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIpOworc3RhdGljIEFOVExSM19CT09MRUFOCSAgICBtYXRjaHMJCQkJCQkocEFOVExSM19MRVhFUiBsZXhlciwgQU5UTFIzX1VDSEFSICogc3RyaW5nKTsKK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgkgICAgbWF0Y2hjCQkJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIsIEFOVExSM19VQ0hBUiBjKTsKK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgkgICAgbWF0Y2hSYW5nZQkJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIsIEFOVExSM19VQ0hBUiBsb3csIEFOVExSM19VQ0hBUiBoaWdoKTsKK3N0YXRpYyB2b2lkCQkJCQltYXRjaEFueQkJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIpOworc3RhdGljIHZvaWQJCQkJCXJlY292ZXIJCQkJCQkocEFOVExSM19MRVhFUiBsZXhlcik7CitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgZ2V0TGluZQkJCQkJCShwQU5UTFIzX0xFWEVSIGxleGVyKTsKK3N0YXRpYyBBTlRMUjNfTUFSS0VSCSAgICBnZXRDaGFySW5kZXgJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIpOworc3RhdGljIEFOVExSM19VSU5UMzIJICAgIGdldENoYXJQb3NpdGlvbkluTGluZQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIpOworc3RhdGljIHBBTlRMUjNfU1RSSU5HCSAgICBnZXRUZXh0CQkJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIpOworc3RhdGljIHBBTlRMUjNfQ09NTU9OX1RPS0VOIG5leHRUb2tlbgkJCQkJKHBBTlRMUjNfVE9LRU5fU09VUkNFIHRva3NvdXJjZSk7CisKK3N0YXRpYyB2b2lkCQkJCQlkaXNwbGF5UmVjb2duaXRpb25FcnJvcgkgICAgKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCAqIHRva2VuTmFtZXMpOworc3RhdGljIHZvaWQJCQkJCXJlcG9ydEVycm9yCQkJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjKTsKK3N0YXRpYyB2b2lkICoJCQkJZ2V0Q3VycmVudElucHV0U3ltYm9sCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNIGlzdHJlYW0pOworc3RhdGljIHZvaWQgKgkJCQlnZXRNaXNzaW5nU3ltYm9sCQkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfSU5UX1NUUkVBTQlpc3RyZWFtLCBwQU5UTFIzX0VYQ0VQVElPTgllLAorCQkJCQkJCQkJCQkJCQkJQU5UTFIzX1VJTlQzMiBleHBlY3RlZFRva2VuVHlwZSwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpOworCitzdGF0aWMgdm9pZAkJCQkJcmVzZXQJCQkJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjKTsKKworc3RhdGljIHZvaWQJCQkJCWZyZWVMZXhlcgkJCQkJKHBBTlRMUjNfTEVYRVIgbGV4ZXIpOworCisKK0FOVExSM19BUEkgcEFOVExSM19MRVhFUgorYW50bHIzTGV4ZXJOZXcoQU5UTFIzX1VJTlQzMiBzaXplSGludCwgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZSkKK3sKKyAgICBwQU5UTFIzX0xFWEVSICAgbGV4ZXI7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4Jc3BlY2lhbFQ7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkKKwkqLworCWxleGVyICAgPSAocEFOVExSM19MRVhFUikgQU5UTFIzX01BTExPQyhzaXplb2YoQU5UTFIzX0xFWEVSKSk7CisKKwlpZgkobGV4ZXIgPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8qIE5vdyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgYmFzZSByZWNvZ25pemVyCisJKi8KKwlsZXhlci0+cmVjCSAgICA9ICBhbnRscjNCYXNlUmVjb2duaXplck5ldyhBTlRMUjNfVFlQRV9MRVhFUiwgc2l6ZUhpbnQsIHN0YXRlKTsKKworCWlmCShsZXhlci0+cmVjID09IE5VTEwpCisJeworCQlsZXhlci0+ZnJlZShsZXhlcik7CisJCXJldHVybglOVUxMOworCX0KKwlsZXhlci0+cmVjLT5zdXBlciAgPSAgbGV4ZXI7CisKKwlsZXhlci0+cmVjLT5kaXNwbGF5UmVjb2duaXRpb25FcnJvcgkgICAgPSBkaXNwbGF5UmVjb2duaXRpb25FcnJvcjsKKwlsZXhlci0+cmVjLT5yZXBvcnRFcnJvcgkJCQkJPSByZXBvcnRFcnJvcjsKKwlsZXhlci0+cmVjLT5yZXNldAkJCQkJCT0gcmVzZXQ7CisJbGV4ZXItPnJlYy0+Z2V0Q3VycmVudElucHV0U3ltYm9sCQk9IGdldEN1cnJlbnRJbnB1dFN5bWJvbDsKKwlsZXhlci0+cmVjLT5nZXRNaXNzaW5nU3ltYm9sCQkJPSBnZXRNaXNzaW5nU3ltYm9sOworCisJLyogTm93IGluc3RhbGwgdGhlIHRva2VuIHNvdXJjZSBpbnRlcmZhY2UKKwkqLworCWlmCShsZXhlci0+cmVjLT5zdGF0ZS0+dG9rU291cmNlID09IE5VTEwpIAorCXsKKwkJbGV4ZXItPnJlYy0+c3RhdGUtPnRva1NvdXJjZQk9IChwQU5UTFIzX1RPS0VOX1NPVVJDRSlBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfVE9LRU5fU09VUkNFKSk7CisKKwkJaWYJKGxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UgPT0gTlVMTCkgCisJCXsKKwkJCWxleGVyLT5yZWMtPmZyZWUobGV4ZXItPnJlYyk7CisJCQlsZXhlci0+ZnJlZShsZXhlcik7CisKKwkJCXJldHVybglOVUxMOworCQl9CisJCWxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPnN1cGVyICAgID0gIGxleGVyOworCisJCS8qIEluc3RhbGwgdGhlIGRlZmF1bHQgbmV4dFRva2VuKCkgbWV0aG9kLCB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbgorCQkgKiBieSBnZW5lcmF0ZWQgY29kZSwgb3IgYnkgYW55dGhpbmcgZWxzZSBpbiBmYWN0LgorCQkgKi8KKwkJbGV4ZXItPnJlYy0+c3RhdGUtPnRva1NvdXJjZS0+bmV4dFRva2VuCSAgICA9ICBuZXh0VG9rZW47CisJCWxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPnN0ckZhY3RvcnkgICAgPSBOVUxMOworCisJCWxleGVyLT5yZWMtPnN0YXRlLT50b2tGYWN0b3J5CQkJCT0gTlVMTDsKKwl9CisKKyAgICAvKiBJbnN0YWxsIHRoZSBsZXhlciBBUEkKKyAgICAgKi8KKyAgICBsZXhlci0+c2V0Q2hhclN0cmVhbQkJCT0gIHNldENoYXJTdHJlYW07CisgICAgbGV4ZXItPm1Ub2tlbnMJCQkJCT0gKHZvaWQgKCopKHZvaWQgKikpKG1Ub2tlbnMpOworICAgIGxleGVyLT5zZXRDaGFyU3RyZWFtCQkJPSAgc2V0Q2hhclN0cmVhbTsKKyAgICBsZXhlci0+cHVzaENoYXJTdHJlYW0JCQk9ICBwdXNoQ2hhclN0cmVhbTsKKyAgICBsZXhlci0+cG9wQ2hhclN0cmVhbQkJCT0gIHBvcENoYXJTdHJlYW07CisgICAgbGV4ZXItPmVtaXQJCQkJCQk9ICBlbWl0OworICAgIGxleGVyLT5lbWl0TmV3CQkJCQk9ICBlbWl0TmV3OworICAgIGxleGVyLT5tYXRjaHMJCQkJCT0gIG1hdGNoczsKKyAgICBsZXhlci0+bWF0Y2hjCQkJCQk9ICBtYXRjaGM7CisgICAgbGV4ZXItPm1hdGNoUmFuZ2UJCQkJPSAgbWF0Y2hSYW5nZTsKKyAgICBsZXhlci0+bWF0Y2hBbnkJCQkJCT0gIG1hdGNoQW55OworICAgIGxleGVyLT5yZWNvdmVyCQkJCQk9ICByZWNvdmVyOworICAgIGxleGVyLT5nZXRMaW5lCQkJCQk9ICBnZXRMaW5lOworICAgIGxleGVyLT5nZXRDaGFySW5kZXgJCQkJPSAgZ2V0Q2hhckluZGV4OworICAgIGxleGVyLT5nZXRDaGFyUG9zaXRpb25JbkxpbmUgICAgPSAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworICAgIGxleGVyLT5nZXRUZXh0CQkJCQk9ICBnZXRUZXh0OworICAgIGxleGVyLT5mcmVlCQkJCQkJPSAgZnJlZUxleGVyOworICAgIAorICAgIC8qIEluaXRpYWxpc2UgdGhlIGVvZiB0b2tlbgorICAgICAqLworICAgIHNwZWNpYWxUCQkJCQk9ICYobGV4ZXItPnJlYy0+c3RhdGUtPnRva1NvdXJjZS0+ZW9mVG9rZW4pOworICAgIGFudGxyM1NldFRva2VuQVBJCSAgKHNwZWNpYWxUKTsKKyAgICBzcGVjaWFsVC0+c2V0VHlwZQkgIChzcGVjaWFsVCwgQU5UTFIzX1RPS0VOX0VPRik7CisgICAgc3BlY2lhbFQtPmZhY3RvcnlNYWRlCQk9IEFOVExSM19UUlVFOwkJCQkJLy8gUHJldmVudCB0aGluZ3MgdHJ5aW5nIHRvIGZyZWUoKSBpdAorICAgIHNwZWNpYWxULT5zdHJGYWN0b3J5ICAgICAgICA9IE5VTEw7CisJc3BlY2lhbFQtPnRleHRTdGF0ZQkJCT0gQU5UTFIzX1RFWFRfTk9ORTsKKwlzcGVjaWFsVC0+Y3VzdG9tCQkJPSBOVUxMOworCXNwZWNpYWxULT51c2VyMQkJCQk9IDA7CisJc3BlY2lhbFQtPnVzZXIyCQkJCT0gMDsKKwlzcGVjaWFsVC0+dXNlcjMJCQkJPSAwOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgc2tpcCB0b2tlbi4KKwkvLworICAgIHNwZWNpYWxUCQkJCQk9ICYobGV4ZXItPnJlYy0+c3RhdGUtPnRva1NvdXJjZS0+c2tpcFRva2VuKTsKKyAgICBhbnRscjNTZXRUb2tlbkFQSQkgIChzcGVjaWFsVCk7CisgICAgc3BlY2lhbFQtPnNldFR5cGUJICAoc3BlY2lhbFQsIEFOVExSM19UT0tFTl9JTlZBTElEKTsKKyAgICBzcGVjaWFsVC0+ZmFjdG9yeU1hZGUJCT0gQU5UTFIzX1RSVUU7CQkJCQkvLyBQcmV2ZW50IHRoaW5ncyB0cnlpbmcgdG8gZnJlZSgpIGl0CisgICAgc3BlY2lhbFQtPnN0ckZhY3RvcnkgICAgICAgID0gTlVMTDsKKwlzcGVjaWFsVC0+Y3VzdG9tCQkJPSBOVUxMOworCXNwZWNpYWxULT51c2VyMQkJCQk9IDA7CisJc3BlY2lhbFQtPnVzZXIyCQkJCT0gMDsKKwlzcGVjaWFsVC0+dXNlcjMJCQkJPSAwOworICAgIHJldHVybiAgbGV4ZXI7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldAkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjKQoreworICAgIHBBTlRMUjNfTEVYRVIgICBsZXhlcjsKKworICAgIGxleGVyICAgPSByZWMtPnN1cGVyOworCisgICAgbGV4ZXItPnJlYy0+c3RhdGUtPnRva2VuCQkJICAgID0gTlVMTDsKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dHlwZQkJCSAgICA9IEFOVExSM19UT0tFTl9JTlZBTElEOworICAgIGxleGVyLT5yZWMtPnN0YXRlLT5jaGFubmVsCQkJICAgID0gQU5UTFIzX1RPS0VOX0RFRkFVTFRfQ0hBTk5FTDsKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dG9rZW5TdGFydENoYXJJbmRleAkgICAgPSAtMTsKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IC0xOworICAgIGxleGVyLT5yZWMtPnN0YXRlLT50b2tlblN0YXJ0TGluZQkJICAgID0gLTE7CisKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dGV4dAkgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKworICAgIC8vIE9LIC0gdGhhdCdzIGFsbCBodW5reSBkb3J5LCBidXQgd2UgbWF5IHdlbGwgaGF2ZSBoYWQKKyAgICAvLyBhIHRva2VuIGZhY3RvcnkgdGhhdCBuZWVkcyBhIHJlc2V0LiBEbyB0aGF0IGhlcmUKKyAgICAvLworICAgIGlmICAobGV4ZXItPnJlYy0+c3RhdGUtPnRva0ZhY3RvcnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxleGVyLT5yZWMtPnN0YXRlLT50b2tGYWN0b3J5LT5yZXNldChsZXhlci0+cmVjLT5zdGF0ZS0+dG9rRmFjdG9yeSk7CisgICAgfQorfQorCisvLy8KKy8vLyBcYnJpZWYKKy8vLyBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSB0b2tlbiBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbS4KKy8vLyAKKy8vLyBccGFyYW0gdG9rc291cmNlCisvLy8gUG9pbnRzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHRva2VuIHNvdXJjZS4gVGhlIGxleGVyIGlzIAorLy8vIGFkZHJlc3NlZCBieSB0aGUgc3VwZXIgc3RydWN0dXJlIHBvaW50ZXIuCisvLy8gCisvLy8gXHJldHVybnMKKy8vLyBUaGUgbmV4dCB0b2tlbiBpbiB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0gb3IgdGhlIEVPRiB0b2tlbgorLy8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIHRva2Vucy4KKy8vLyAKKy8vLyBccmVtYXJrcworLy8vIFdyaXRlIHJlbWFya3MgZm9yIG5leHRUb2tlbiBoZXJlLgorLy8vIAorLy8vIFxzZWUgbmV4dFRva2VuCisvLy8KK0FOVExSM19JTkxJTkUgc3RhdGljIHBBTlRMUjNfQ09NTU9OX1RPS0VOCituZXh0VG9rZW5TdHIJICAgIChwQU5UTFIzX1RPS0VOX1NPVVJDRSB0b2tzb3VyY2UpCit7CisgICAgcEFOVExSM19MRVhFUiAgICAgICAgICAgICAgICAgICBsZXhlcjsKKyAgICBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlOworICAgIHBBTlRMUjNfSU5QVVRfU1RSRUFNICAgICAgICAgICAgaW5wdXQ7CisgICAgcEFOVExSM19JTlRfU1RSRUFNICAgICAgICAgICAgICBpc3RyZWFtOworCisgICAgbGV4ZXIgICA9IChwQU5UTFIzX0xFWEVSKSh0b2tzb3VyY2UtPnN1cGVyKTsKKyAgICBzdGF0ZSAgID0gbGV4ZXItPnJlYy0+c3RhdGU7CisgICAgaW5wdXQgICA9IGxleGVyLT5pbnB1dDsKKyAgICBpc3RyZWFtID0gaW5wdXQtPmlzdHJlYW07CisKKyAgICAvLy8gTG9vcCB1bnRpbCB3ZSBnZXQgYSBub24gc2tpcHBlZCB0b2tlbiBvciBFT0YKKyAgICAvLy8KKyAgICBmb3IJKDs7KQorICAgIHsKKyAgICAgICAgLy8gR2V0IHJpZCBvZiBhbnkgcHJldmlvdXMgdG9rZW4gKHRva2VuIGZhY3RvcnkgdGFrZXMgY2FyZSBvZgorICAgICAgICAvLyBhbnkgZGUtYWxsb2NhdGlvbiB3aGVuIHRoaXMgdG9rZW4gaXMgZmluYWxseSB1c2VkIHVwLgorICAgICAgICAvLworICAgICAgICBzdGF0ZS0+dG9rZW4JCSAgICA9IE5VTEw7CisgICAgICAgIHN0YXRlLT5lcnJvcgkJICAgID0gQU5UTFIzX0ZBTFNFOwkgICAgLy8gU3RhcnQgb3V0IHdpdGhvdXQgYW4gZXhjZXB0aW9uCisgICAgICAgIHN0YXRlLT5mYWlsZWQJCSAgICA9IEFOVExSM19GQUxTRTsKKworICAgICAgICAvLyBOb3cgY2FsbCB0aGUgbWF0Y2hpbmcgcnVsZXMgYW5kIHNlZSBpZiB3ZSBjYW4gZ2VuZXJhdGUgYSBuZXcgdG9rZW4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yCSg7OykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBzdGFydCBvZiB0aGUgdG9rZW4gaW4gb3VyIGlucHV0IHN0cmVhbS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBzdGF0ZS0+Y2hhbm5lbAkJCSAgICA9IEFOVExSM19UT0tFTl9ERUZBVUxUX0NIQU5ORUw7CisgICAgICAgICAgICBzdGF0ZS0+dG9rZW5TdGFydENoYXJJbmRleAkgICAgICAgICAgICA9IChBTlRMUjNfTUFSS0VSKSgoKHBBTlRMUjNfVUlOVDgpaW5wdXQtPm5leHRDaGFyKSk7CisgICAgICAgICAgICBzdGF0ZS0+dG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSAgICAgPSBpbnB1dC0+Y2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgc3RhdGUtPnRva2VuU3RhcnRMaW5lCQkgICAgPSBpbnB1dC0+bGluZTsKKyAgICAgICAgICAgIHN0YXRlLT50ZXh0CQkJICAgICAgICAgICAgPSBOVUxMOworICAgICAgICAgICAgc3RhdGUtPmN1c3RvbSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT51c2VyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+dXNlcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgc3RhdGUtPnVzZXIzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKKworICAgICAgICAgICAgaWYgIChpc3RyZWFtLT5fTEEoaXN0cmVhbSwgMSkgPT0gQU5UTFIzX0NIQVJTVFJFQU1fRU9GKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdHJlYW0sIG5vdGhpbmcgbW9yZSB0byBkbyBpZiB0aGlzIGlzCisgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgaW4gdGhlIHN0YWNrLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgcEFOVExSM19DT01NT05fVE9LRU4gICAgdGVvZiA9ICYodG9rc291cmNlLT5lb2ZUb2tlbik7CisKKyAgICAgICAgICAgICAgICB0ZW9mLT5zZXRTdGFydEluZGV4ICh0ZW9mLCBsZXhlci0+Z2V0Q2hhckluZGV4KGxleGVyKSk7CisgICAgICAgICAgICAgICAgdGVvZi0+c2V0U3RvcEluZGV4ICAodGVvZiwgbGV4ZXItPmdldENoYXJJbmRleChsZXhlcikpOworICAgICAgICAgICAgICAgIHRlb2YtPnNldExpbmUJICAgICh0ZW9mLCBsZXhlci0+Z2V0TGluZShsZXhlcikpOworICAgICAgICAgICAgICAgIHRlb2YtPmZhY3RvcnlNYWRlID0gQU5UTFIzX1RSVUU7CS8vIFRoaXMgaXNuJ3QgcmVhbGx5IG1hbnVmYWN0dXJlZCBidXQgaXQgc3RvcHMgdGhpbmdzIGZyb20gdHJ5aW5nIHRvIGZyZWUgaXQKKyAgICAgICAgICAgICAgICByZXR1cm4gIHRlb2Y7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLT50b2tlbgkJPSBOVUxMOworICAgICAgICAgICAgc3RhdGUtPmVycm9yCQk9IEFOVExSM19GQUxTRTsJICAgIC8vIFN0YXJ0IG91dCB3aXRob3V0IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgc3RhdGUtPmZhaWxlZAkJPSBBTlRMUjNfRkFMU0U7CisKKyAgICAgICAgICAgIC8vIENhbGwgdGhlIGdlbmVyYXRlZCBsZXhlciwgc2VlIGlmIGl0IGNhbiBnZXQgYSBuZXcgdG9rZW4gdG9nZXRoZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbGV4ZXItPm1Ub2tlbnMobGV4ZXItPmN0eCk7CisKKyAgICAgICAgICAgIGlmICAoc3RhdGUtPmVycm9yICA9PSBBTlRMUjNfVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBSZWNvZ25pdGlvbiBleGNlcHRpb24sIHJlcG9ydCBpdCBhbmQgdHJ5IHRvIHJlY292ZXIuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBzdGF0ZS0+ZmFpbGVkCSAgICA9IEFOVExSM19UUlVFOworICAgICAgICAgICAgICAgIGxleGVyLT5yZWMtPnJlcG9ydEVycm9yKGxleGVyLT5yZWMpOworICAgICAgICAgICAgICAgIGxleGVyLT5yZWNvdmVyKGxleGVyKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT50b2tlbiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgcmVhbCB0b2tlbiwgd2hpY2ggYWRkcyBpdCBpbiB0byB0aGUgdG9rZW4gc3RyZWFtIGJhc2ljYWxseQorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBlbWl0KGxleGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZgkoc3RhdGUtPnRva2VuID09ICAmKHRva3NvdXJjZS0+c2tpcFRva2VuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgcmVhbCB0b2tlbiBjb3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkLCBidXQgIkNvbXB1dGVyIHNheSdzIG5hYWFhYWgiIGFuZCBpdAorICAgICAgICAgICAgICAgICAgICAvLyBpdCBpcyBqdXN0IHNvbWV0aGluZyB3ZSBuZWVkIHRvIHNraXAgYWx0b2dldGhlci4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gR29vZCB0b2tlbiwgbm90IHNraXBwZWQsIG5vdCBFT0YgdG9rZW4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHJldHVybiAgc3RhdGUtPnRva2VuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFxicmllZgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV4dFRva2VuKCkgY2FsbCBmb3IgYSBsZXhlci4KKyAqIAorICogXHBhcmFtIHRva3NvdXJjZQorICogUG9pbnRzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHRva2VuIHNvdXJjZS4gVGhlIGxleGVyIGlzIAorICogYWRkcmVzc2VkIGJ5IHRoZSBzdXBlciBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAqIAorICogXHJldHVybnMKKyAqIFRoZSBuZXh0IHRva2VuIGluIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSBvciB0aGUgRU9GIHRva2VuCisgKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSB0b2tlbnMgaW4gYW55IGlucHV0IHN0cmVhbSBpbiB0aGUgc3RhY2suCisgKiAKKyAqIFdyaXRlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGZvciBuZXh0VG9rZW4gaGVyZS4KKyAqIAorICogXHJlbWFya3MKKyAqIFdyaXRlIHJlbWFya3MgZm9yIG5leHRUb2tlbiBoZXJlLgorICogCisgKiBcc2VlIG5leHRUb2tlblN0cgorICovCitzdGF0aWMgcEFOVExSM19DT01NT05fVE9LRU4KK25leHRUb2tlbgkgICAgKHBBTlRMUjNfVE9LRU5fU09VUkNFIHRva3NvdXJjZSkKK3sKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2s7CisKKwkvLyBGaW5kIHRoZSBuZXh0IHRva2VuIGluIHRoZSBjdXJyZW50IHN0cmVhbQorCS8vCisJdG9rID0gbmV4dFRva2VuU3RyKHRva3NvdXJjZSk7CisKKwkvLyBJZiB3ZSBnb3QgdG8gdGhlIEVPRiB0b2tlbiB0aGVuIHN3aXRjaCB0byB0aGUgcHJldmlvdXMKKwkvLyBpbnB1dCBzdHJlYW0gaWYgdGhlcmUgd2VyZSBhbnkgYW5kIGp1c3QgcmV0dXJuIHRoZQorCS8vIEVPRiBpZiB0aGVyZSBhcmUgbm9uZS4gV2UgbXVzdCBjaGVjayB0aGUgbmV4dCB0b2tlbgorCS8vIGluIGFueSBvdXRzdGFuZGluZyBpbnB1dCBzdHJlYW0gd2UgcG9wIGludG8gdGhlIGFjdGl2ZQorCS8vIHJvbGUgdG8gc2VlIGlmIGl0IHdhcyBzaXR0aW5nIGF0IEVPRiBhZnRlciBQVVNIaW5nIHRoZQorCS8vIHN0cmVhbSB3ZSBqdXN0IGNvbnN1bWVkLCBvdGhlcndpc2Ugd2Ugd2lsbCByZXR1cm4gRU9GCisJLy8gb24gdGhlIHJlaW5zdGFsbGVkIGlucHV0IHN0cmVhbSwgd2hlbiBpbiBhY3R1YWwgZmFjdAorCS8vIHRoZXJlIG1pZ2h0IGJlIG1vcmUgaW5wdXQgc3RyZWFtcyB0byBQT1AgYmVmb3JlIHRoZQorCS8vIHJlYWwgRU9GIG9mIHRoZSB3aG9sZSBsb2dpY2FsIGlucHR1IHN0cmVhbS4gSGVuY2Ugd2UKKwkvLyB1c2UgYSB3aGlsZSBsb29wIGhlcmUgdW50aWwgd2UgZmluZCBzb21ldGhpZ24gaW4gdGhlIHN0cmVhbQorCS8vIHRoYXQgaXNuJ3QgRU9GIG9yIHdlIHJlYWNoIHRoZSBhY3R1YWwgZW5kIG9mIHRoZSBsYXN0IGlucHV0CisJLy8gc3RyZWFtIG9uIHRoZSBzdGFjay4KKwkvLworCXdoaWxlCSh0b2stPnR5cGUgPT0gQU5UTFIzX1RPS0VOX0VPRikKKwl7CisJCXBBTlRMUjNfTEVYRVIgICBsZXhlcjsKKworCQlsZXhlciAgID0gKHBBTlRMUjNfTEVYRVIpKHRva3NvdXJjZS0+c3VwZXIpOworCisJCWlmICAobGV4ZXItPnJlYy0+c3RhdGUtPnN0cmVhbXMgIT0gTlVMTCAmJiBsZXhlci0+cmVjLT5zdGF0ZS0+c3RyZWFtcy0+c2l6ZShsZXhlci0+cmVjLT5zdGF0ZS0+c3RyZWFtcykgPiAwKQorCQl7CisJCQkvLyBXZSBoYXZlIGFub3RoZXIgaW5wdXQgc3RyZWFtIGluIHRoZSBzdGFjayBzbyB3ZQorCQkJLy8gbmVlZCB0byByZXZlcnQgdG8gaXQsIHRoZW4gcmVzdW1lIHRoZSBsb29wIHRvIGNoZWNrCisJCQkvLyBpdCB3YXNuJ3Qgc2l0dGluZyBhdCBFT0YgaXRzZWxmLgorCQkJLy8KKwkJCWxleGVyLT5wb3BDaGFyU3RyZWFtKGxleGVyKTsKKwkJCXRvayA9IG5leHRUb2tlblN0cih0b2tzb3VyY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVGhlcmUgd2VyZSBubyBtb3JlIHN0cmVhbXMgb24gdGhlIGlucHV0IHN0YWNrCisJCQkvLyBzbyB0aGlzIEVPRiBpcyB0aGUgJ3JlYWwnIGxvZ2ljYWwgRU9GIGZvcgorCQkJLy8gdGhlIGlucHV0IHN0cmVhbS4gU28gd2UganVzdCBleGl0IHRoZSBsb29wIGFuZCAKKwkJCS8vIHJldHVybiB0aGUgRU9GIHdlIGhhdmUgZm91bmQuCisJCQkvLworCQkJYnJlYWs7CisJCX0KKwkJCisJfQorCisJLy8gcmV0dXJuIHdoYXRldmVyIHRva2VuIHdlIGhhdmUsIHdoaWNoIG1heSBiZSBFT0YKKwkvLworCXJldHVybiAgdG9rOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfTEVYRVIKK2FudGxyM0xleGVyTmV3U3RyZWFtKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQsIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0LCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKQoreworICAgIHBBTlRMUjNfTEVYRVIgICBsZXhlcjsKKworICAgIC8vIENyZWF0ZSBhIGJhc2ljIGxleGVyIGZpcnN0CisgICAgLy8KKyAgICBsZXhlciAgID0gYW50bHIzTGV4ZXJOZXcoc2l6ZUhpbnQsIHN0YXRlKTsKKworICAgIGlmCShsZXhlciAhPSBOVUxMKSAKKyAgICB7CisJCS8vIEluc3RhbGwgdGhlIGlucHV0IHN0cmVhbSBhbmQgcmVzZXQgdGhlIGxleGVyCisJCS8vCisJCXNldENoYXJTdHJlYW0obGV4ZXIsIGlucHV0KTsKKyAgICB9CisKKyAgICByZXR1cm4gIGxleGVyOworfQorCitzdGF0aWMgdm9pZCBtVG9rZW5zCSAgICAocEFOVExSM19MRVhFUiBsZXhlcikKK3sKKyAgICBpZgkobGV4ZXIpCSAgICAvLyBGb29sIGNvbXBpbGVyLCBhdm9pZCBwcmFnbWFzCisgICAgeworCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJsZXhlci0+bVRva2VucygpOiBFcnJvcjogTm8gbGV4ZXIgcnVsZXMgd2VyZSBhZGRlZCB0byB0aGUgbGV4ZXIgeWV0IVxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAkJCQorcmVwb3J0RXJyb3IJCSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjKQoreworICAgIC8vIEluZGljYXRlIHRoaXMgcmVjb2duaXplciBoYWQgYW4gZXJyb3Igd2hpbGUgcHJvY2Vzc2luZy4KKwkvLworCXJlYy0+c3RhdGUtPmVycm9yQ291bnQrKzsKKworICAgIHJlYy0+ZGlzcGxheVJlY29nbml0aW9uRXJyb3IocmVjLCByZWMtPnN0YXRlLT50b2tlbk5hbWVzKTsKK30KKworI2lmZGVmCUFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAwICkKKyNlbmRpZgorCisvKiogRGVmYXVsdCBsZXhlciBlcnJvciBoYW5kbGVyICh3b3JrcyBmb3IgOCBiaXQgc3RyZWFtcyBvbmx5ISEhKQorICovCitzdGF0aWMgdm9pZAkJCQorZGlzcGxheVJlY29nbml0aW9uRXJyb3IJICAgIChwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX1VJTlQ4ICogdG9rZW5OYW1lcykKK3sKKyAgICBwQU5UTFIzX0xFWEVSCQkJbGV4ZXI7CisJcEFOVExSM19FWENFUFRJT04JICAgIGV4OworCXBBTlRMUjNfU1RSSU5HCQkJZnRleHQ7CisKKyAgICBsZXhlciAgID0gKHBBTlRMUjNfTEVYRVIpKHJlY29nbml6ZXItPnN1cGVyKTsKKwlleAkJPSBsZXhlci0+cmVjLT5zdGF0ZS0+ZXhjZXB0aW9uOworCisJLy8gU2VlIGlmIHRoZXJlIGlzIGEgJ2ZpbGVuYW1lJyB3ZSBjYW4gdXNlCisgICAgLy8KKyAgICBpZgkoZXgtPm5hbWUgPT0gTlVMTCkKKyAgICB7CisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIi11bmtub3duIHNvdXJjZS0oIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCWZ0ZXh0ID0gZXgtPnN0cmVhbU5hbWUtPnRvOChleC0+c3RyZWFtTmFtZSk7CisJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgIiVzKCIsIGZ0ZXh0LT5jaGFycyk7CisgICAgfQorCisgICAgQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiJWQpICIsIHJlY29nbml6ZXItPnN0YXRlLT5leGNlcHRpb24tPmxpbmUpOworICAgIEFOVExSM19GUFJJTlRGKHN0ZGVyciwgIjogbGV4ZXIgZXJyb3IgJWQgOlxuXHQlcyBhdCBvZmZzZXQgJWQsICIsIAorCQkJCQkJZXgtPnR5cGUsCisJCQkJCQkocEFOVExSM19VSU5UOCkJICAgKGV4LT5tZXNzYWdlKSwKKwkJCQkJICAgIGV4LT5jaGFyUG9zaXRpb25JbkxpbmUrMQorCQkgICAgKTsKKwl7CisJCUFOVExSM19JTlQzMgl3aWR0aDsKKworCQl3aWR0aAk9IEFOVExSM19VSU5UMzJfQ0FTVCgoIChwQU5UTFIzX1VJTlQ4KShsZXhlci0+aW5wdXQtPmRhdGEpICsgKGxleGVyLT5pbnB1dC0+c2l6ZShsZXhlci0+aW5wdXQpICkpIC0gKHBBTlRMUjNfVUlOVDgpKGV4LT5pbmRleCkpOworCisJCWlmCSh3aWR0aCA+PSAxKQorCQl7CQkJCisJCQlpZgkoaXNwcmludChleC0+YykpCisJCQl7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAibmVhciAnJWMnIDpcbiIsIGV4LT5jKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJuZWFyIGNoYXIoJSMwMlgpIDpcbiIsIChBTlRMUjNfVUlOVDgpKGV4LT5jKSk7CisJCQl9CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJcdCUuKnNcbiIsIHdpZHRoID4gMjAgPyAyMCA6IHdpZHRoICwoKHBBTlRMUjNfVUlOVDgpZXgtPmluZGV4KSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlBTlRMUjNfRlBSSU5URihzdGRlcnIsICIoZW5kIG9mIGlucHV0KS5cblx0IFRoaXMgaW5kaWNhdGVzIGEgcG9vcmx5IHNwZWNpZmllZCBsZXhlciBSVUxFXG5cdCBvciB1bnRlcm1pbmF0ZWQgaW5wdXQgZWxlbWVudCBzdWNoIGFzOiBcIlNUUklOR1tcIl1cbiIpOworCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiXHQgVGhlIGxleGVyIHdhcyBtYXRjaGluZyBmcm9tIGxpbmUgJWQsIG9mZnNldCAlZCwgd2hpY2hcblx0ICIsIAorCQkJCQkJCQkoQU5UTFIzX1VJTlQzMikobGV4ZXItPnJlYy0+c3RhdGUtPnRva2VuU3RhcnRMaW5lKSwKKwkJCQkJCQkJKEFOVExSM19VSU5UMzIpKGxleGVyLT5yZWMtPnN0YXRlLT50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lKQorCQkJCQkJCQkpOworCQkJd2lkdGggPSBBTlRMUjNfVUlOVDMyX0NBU1QoKChwQU5UTFIzX1VJTlQ4KShsZXhlci0+aW5wdXQtPmRhdGEpKyhsZXhlci0+aW5wdXQtPnNpemUobGV4ZXItPmlucHV0KSkpIC0gKHBBTlRMUjNfVUlOVDgpKGxleGVyLT5yZWMtPnN0YXRlLT50b2tlblN0YXJ0Q2hhckluZGV4KSk7CisKKwkJCWlmCSh3aWR0aCA+PSAxKQorCQkJeworCQkJCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgImxvb2tzIGxpa2UgdGhpczpcblx0XHQlLipzXG4iLCB3aWR0aCA+IDIwID8gMjAgOiB3aWR0aCAsKHBBTlRMUjNfVUlOVDgpKGxleGVyLT5yZWMtPnN0YXRlLT50b2tlblN0YXJ0Q2hhckluZGV4KSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQU5UTFIzX0ZQUklOVEYoc3RkZXJyLCAiaXMgYWxzbyB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzbyB5b3UgbXVzdCBjaGVjayB5b3VyIGxleGVyIHJ1bGVzXG4iKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2V0Q2hhclN0cmVhbSAgIChwQU5UTFIzX0xFWEVSIGxleGVyLCAgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQpCit7CisgICAgLyogSW5zdGFsbCB0aGUgaW5wdXQgaW50ZXJmYWNlCisgICAgICovCisgICAgbGV4ZXItPmlucHV0CT0gaW5wdXQ7CisKKyAgICAvKiBXZSBtYXkgbmVlZCBhIHRva2VuIGZhY3RvcnkgZm9yIHRoZSBsZXhlcjsgd2UgZG9uJ3QgZGVzdHJveSBhbnkgZXhpc3RpbmcgZmFjdG9yeQorICAgICAqIHVudGlsIHRoZSBsZXhlciBpcyBkZXN0cm95ZWQsIGFzIHBlb3BsZSBtYXkgc3RpbGwgYmUgdXNpbmcgdGhlIHRva2VucyBpdCBwcm9kdWNlZC4KKyAgICAgKiBUT0RPOiBMYXRlciBJIHdpbGwgcHJvdmlkZSBhIGR1cCgpIG1ldGhvZCBmb3IgYSB0b2tlbiBzbyB0aGF0IGl0IGNhbiBleHRyYWN0IGl0c2VsZgorICAgICAqIG91dCBvZiB0aGUgZmFjdG9yeS4gCisgICAgICovCisgICAgaWYJKGxleGVyLT5yZWMtPnN0YXRlLT50b2tGYWN0b3J5ID09IE5VTEwpCisgICAgeworCWxleGVyLT5yZWMtPnN0YXRlLT50b2tGYWN0b3J5CT0gYW50bHIzVG9rZW5GYWN0b3J5TmV3KGlucHV0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkvKiBXaGVuIHRoZSBpbnB1dCBzdHJlYW0gaXMgYmVpbmcgY2hhbmdlZCBvbiB0aGUgZmx5LCByYXRoZXIgdGhhbgorCSAqIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBsZXhlciwgdGhlbiB3ZSBtdXN0IHRlbGwgdGhlIHRva2VuRmFjdG9yeQorCSAqIHdoaWNoIGlucHV0IHN0cmVhbSB0byBhZG9ybiB0aGUgdG9rZW5zIHdpdGggc28gdGhhdCB3aGVuIHRoZXkKKwkgKiBhcmUgYXNrZWQgdG8gcHJvdmlkZSB0aGVpciBvcmlnaW5hbCBpbnB1dCBzdHJpbmdzIHRoZXkgY2FuCisJICogZG8gc28gZnJvbSB0aGUgY29ycmVjdCB0ZXh0IHN0cmVhbS4KKwkgKi8KKwlsZXhlci0+cmVjLT5zdGF0ZS0+dG9rRmFjdG9yeS0+c2V0SW5wdXRTdHJlYW0obGV4ZXItPnJlYy0+c3RhdGUtPnRva0ZhY3RvcnksIGlucHV0KTsKKyAgICB9CisKKyAgICAvKiBQcm9wYWdhdGUgdGhlIHN0cmluZyBmYWN0b3J5IHNvIHRoYXQgd2UgcHJlc2VydmUgdGhlIGVuY29kaW5nIGZvcm0gZnJvbQorICAgICAqIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgaWYJKGxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPnN0ckZhY3RvcnkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPnN0ckZhY3RvcnkJPSBpbnB1dC0+c3RyRmFjdG9yeTsKKworICAgICAgICAvLyBTZXQgdGhlIG5ld2x5IGFjcXVpcmVkIHN0cmluZyBmYWN0b3J5IHVwIGZvciBvdXIgcHJlLW1hZGUgdG9rZW5zCisgICAgICAgIC8vIGZvciBFT0YuCisgICAgICAgIC8vCisgICAgICAgIGlmIChsZXhlci0+cmVjLT5zdGF0ZS0+dG9rU291cmNlLT5lb2ZUb2tlbi5zdHJGYWN0b3J5ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPmVvZlRva2VuLnN0ckZhY3RvcnkgPSBpbnB1dC0+c3RyRmFjdG9yeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoaXMgaXMgYSBsZXhlciwgaW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uIGNyZWF0b3IKKyAgICAgKi8KKyAgICBsZXhlci0+cmVjLT5leENvbnN0cnVjdCA9IGFudGxyM1JlY29nbml0aW9uRXhjZXB0aW9uTmV3OworCisgICAgLyogU2V0IHRoZSBjdXJyZW50IHRva2VuIHRvIG5vdGhpbmcKKyAgICAgKi8KKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dG9rZW4JCT0gTlVMTDsKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dGV4dAkJCT0gTlVMTDsKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dG9rZW5TdGFydENoYXJJbmRleAk9IC0xOworCisgICAgLyogQ29weSB0aGUgbmFtZSBvZiB0aGUgY2hhciBzdHJlYW0gdG8gdGhlIHRva2VuIHNvdXJjZQorICAgICAqLworICAgIGxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPmZpbGVOYW1lID0gaW5wdXQtPmZpbGVOYW1lOworfQorCisvKiEKKyAqIFxicmllZgorICogQ2hhbmdlIHRvIGEgbmV3IGlucHV0IHN0cmVhbSwgcmVtZW1iZXJpbmcgdGhlIG9sZCBvbmUuCisgKiAKKyAqIFxwYXJhbSBsZXhlcgorICogUG9pbnRlciB0byB0aGUgbGV4ZXIgaW5zdGFuY2UgdG8gc3dpdGNoIGlucHV0IHN0cmVhbXMgZm9yLgorICogCisgKiBccGFyYW0gaW5wdXQKKyAqIE5ldyBpbnB1dCBzdHJlYW0gdG8gaW5zdGFsbCBhcyB0aGUgY3VycmVudCBvbmUuCisgKiAKKyAqIFN3aXRjaGVzIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpbnB1dCBzdHJlYW0gdG8gCisgKiBhIG5ldyBvbmUsIHNhdmluZyB0aGUgb2xkIG9uZSwgd2hpY2ggd2Ugd2lsbCByZXZlcnQgdG8gYXQgdGhlIGVuZCBvZiB0aGlzIAorICogbmV3IG9uZS4KKyAqLworc3RhdGljIHZvaWQKK3B1c2hDaGFyU3RyZWFtICAocEFOVExSM19MRVhFUiBsZXhlciwgIHBBTlRMUjNfSU5QVVRfU1RSRUFNIGlucHV0KQoreworCS8vIERvIHdlIG5lZWQgYSBuZXcgaW5wdXQgc3RyZWFtIHN0YWNrPworCS8vCisJaWYJKGxleGVyLT5yZWMtPnN0YXRlLT5zdHJlYW1zID09IE5VTEwpCisJeworCQkvLyBUaGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIHN0YWNrIGEgbmV3CisJCS8vIHN0cmVhbSBhbmQgc28gd2UgbXVzdCBjcmVhdGUgdGhlIHN0YWNrIGZpcnN0LgorCQkvLworCQlsZXhlci0+cmVjLT5zdGF0ZS0+c3RyZWFtcyA9IGFudGxyM1N0YWNrTmV3KDApOworCisJCWlmICAobGV4ZXItPnJlYy0+c3RhdGUtPnN0cmVhbXMgPT0gTlVMTCkKKwkJeworCQkJLy8gQ291bGQgbm90IGRvIHRoaXMsIHdlIGp1c3QgZmFpbCB0byBwdXNoIGl0LgorCQkJLy8gVE9ETzogQ29uc2lkZXIgaWYgdGhpcyBpcyB3aGF0IHdlIHdhbnQgdG8gZG8sIGJ1dCB0aGVuCisJCQkvLyAgICAgICBhbnkgcHJvZ3JhbW1lciBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZG8gc29tZXRoaW5nIGVsc2UuCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvLyBXZSBoYXZlIGEgc3RhY2ssIHNvIHdlIGNhbiBzYXZlIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbQorCS8vIGludG8gaXQuCisJLy8KKwlsZXhlci0+aW5wdXQtPmlzdHJlYW0tPm1hcmsobGV4ZXItPmlucHV0LT5pc3RyZWFtKTsKKwlsZXhlci0+cmVjLT5zdGF0ZS0+c3RyZWFtcy0+cHVzaChsZXhlci0+cmVjLT5zdGF0ZS0+c3RyZWFtcywgbGV4ZXItPmlucHV0LCBOVUxMKTsKKworCS8vIEFuZCBub3cgd2UgY2FuIGluc3RhbGwgdGhpcyBuZXcgb25lCisJLy8KKwlsZXhlci0+c2V0Q2hhclN0cmVhbShsZXhlciwgaW5wdXQpOworfQorCisvKiEKKyAqIFxicmllZgorICogU3RvcHMgdXNpbmcgdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtIGFuZCByZXZlcnRzIHRvIGFueSBwcmlvcgorICogaW5wdXQgc3RyZWFtIG9uIHRoZSBzdGFjay4KKyAqIAorICogXHBhcmFtIGxleGVyCisgKiBEZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXIgbGV4ZXIuCisgKiAKKyAqIFBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGFiYW5kb25zIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgd2hldGhlciBpdAorICogaXMgZW1wdHkgb3Igbm90IGFuZCByZXZlcnRzIHRvIHRoZSBwcmV2aW91cyBzdGFja2VkIGlucHV0IHN0cmVhbS4KKyAqCisgKiBccmVtYXJrCisgKiBUaGUgZnVuY3Rpb24gZmFpbHMgc2lsZW50bHkgaWYgdGhlcmUgYXJlIG5vIHByaW9yIGlucHV0IHN0cmVhbXMuCisgKi8KK3N0YXRpYyB2b2lkCitwb3BDaGFyU3RyZWFtICAgKHBBTlRMUjNfTEVYRVIgbGV4ZXIpCit7CisgICAgcEFOVExSM19JTlBVVF9TVFJFQU0gaW5wdXQ7CisKKyAgICAvLyBJZiB3ZSBkbyBub3QgaGF2ZSBhIHN0cmVhbSBzdGFjayBvciB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUKKyAgICAvLyBzdGFjayBib3R0b20sIHRoZW4gZG8gbm90aGluZy4KKyAgICAvLworICAgIGlmCShsZXhlci0+cmVjLT5zdGF0ZS0+c3RyZWFtcyAhPSBOVUxMICYmIGxleGVyLT5yZWMtPnN0YXRlLT5zdHJlYW1zLT5zaXplKGxleGVyLT5yZWMtPnN0YXRlLT5zdHJlYW1zKSA+IDApCisgICAgeworCS8vIFdlIGp1c3QgbGVhdmUgdGhlIGN1cnJlbnQgc3RyZWFtIHRvIGl0cyBmYXRlLCB3ZSBkbyBub3QgY2xvc2UKKwkvLyBpdCBvciBhbnl0aGluZyBhcyB3ZSBkbyBub3Qga25vdyB3aGF0IHRoZSBwcm9ncmFtbWVyIGludGVuZGVkCisJLy8gZm9yIGl0LiBUaGlzIG1ldGhvZCBjYW4gYWx3YXlzIGJlIG92ZXJyaWRkZW4gb2YgY291cnNlLgorCS8vIFNvIGp1c3QgZmluZCBvdXQgd2hhdCB3YXMgY3VycmVudGx5IHNhdmVkIG9uIHRoZSBzdGFjayBhbmQgdXNlCisJLy8gdGhhdCBub3csIHRoZW4gcG9wIGl0IGZyb20gdGhlIHN0YWNrLgorCS8vCisJaW5wdXQJPSAocEFOVExSM19JTlBVVF9TVFJFQU0pKGxleGVyLT5yZWMtPnN0YXRlLT5zdHJlYW1zLT50b3ApOworCWxleGVyLT5yZWMtPnN0YXRlLT5zdHJlYW1zLT5wb3AobGV4ZXItPnJlYy0+c3RhdGUtPnN0cmVhbXMpOworCisJLy8gTm93IGluc3RhbGwgdGhlIHN0cmVhbSBhcyB0aGUgY3VycmVudCBvbmUuCisJLy8KKwlsZXhlci0+c2V0Q2hhclN0cmVhbShsZXhlciwgaW5wdXQpOworCWxleGVyLT5pbnB1dC0+aXN0cmVhbS0+cmV3aW5kTGFzdChsZXhlci0+aW5wdXQtPmlzdHJlYW0pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGVtaXROZXcJICAgIChwQU5UTFIzX0xFWEVSIGxleGVyLCAgcEFOVExSM19DT01NT05fVE9LRU4gdG9rZW4pCit7CisgICAgbGV4ZXItPnJlYy0+c3RhdGUtPnRva2VuICAgID0gdG9rZW47CS8qIFZvaWxhISAgICovCit9CisKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTgorZW1pdAkgICAgKHBBTlRMUjNfTEVYRVIgbGV4ZXIpCit7CisgICAgcEFOVExSM19DT01NT05fVE9LRU4JdG9rZW47CisKKyAgICAvKiBXZSBjb3VsZCBjaGVjayBwb2ludGVycyB0byB0b2tlbiBmYWN0b3JpZXMgYW5kIHNvIG9uLCBidXQKKyAgICAqIHdlIGFyZSBpbiBjb2RlIHRoYXQgd2Ugd2FudCB0byBydW4gYXMgZmFzdCBhcyBwb3NzaWJsZQorICAgICogc28gd2UgYXJlIG5vdCBjaGVja2luZyBhbnkgZXJyb3JzLiBTbyBtYWtlIHN1cmUgeW91IGhhdmUgaW5zdGFsbGVkIGFuIGlucHV0IHN0cmVhbSBiZWZvcmUKKyAgICAqIHRyeWluZyB0byBlbWl0IGEgbmV3IHRva2VuLgorICAgICovCisgICAgdG9rZW4gICA9IGxleGVyLT5yZWMtPnN0YXRlLT50b2tGYWN0b3J5LT5uZXdUb2tlbihsZXhlci0+cmVjLT5zdGF0ZS0+dG9rRmFjdG9yeSk7CisKKyAgICAvKiBJbnN0YWxsIHRoZSBzdXBwbGllZCBpbmZvcm1hdGlvbiwgYW5kIHNvbWUgb3RoZXIgYml0cyB3ZSBhbHJlYWR5IGtub3cKKyAgICAqIGdldCBhZGRlZCBhdXRvbWF0aWNhbGx5LCBzdWNoIGFzIHRoZSBpbnB1dCBzdHJlYW0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoCisgICAgKiAodGhvdWdoIGl0IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBvZiBjb3Vyc2UpCisgICAgKi8KKyAgICB0b2tlbi0+dHlwZQkJICAgID0gbGV4ZXItPnJlYy0+c3RhdGUtPnR5cGU7CisgICAgdG9rZW4tPmNoYW5uZWwJICAgID0gbGV4ZXItPnJlYy0+c3RhdGUtPmNoYW5uZWw7CisgICAgdG9rZW4tPnN0YXJ0CSAgICA9IGxleGVyLT5yZWMtPnN0YXRlLT50b2tlblN0YXJ0Q2hhckluZGV4OworICAgIHRva2VuLT5zdG9wCQkgICAgPSBsZXhlci0+Z2V0Q2hhckluZGV4KGxleGVyKSAtIDE7CisgICAgdG9rZW4tPmxpbmUJCSAgICA9IGxleGVyLT5yZWMtPnN0YXRlLT50b2tlblN0YXJ0TGluZTsKKyAgICB0b2tlbi0+Y2hhclBvc2l0aW9uCT0gbGV4ZXItPnJlYy0+c3RhdGUtPnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisKKyAgICBpZgkobGV4ZXItPnJlYy0+c3RhdGUtPnRleHQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHRva2VuLT50ZXh0U3RhdGUJICAgID0gQU5UTFIzX1RFWFRfU1RSSU5HOworICAgICAgICB0b2tlbi0+dG9rVGV4dC50ZXh0CSAgICA9IGxleGVyLT5yZWMtPnN0YXRlLT50ZXh0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0b2tlbi0+dGV4dFN0YXRlCT0gQU5UTFIzX1RFWFRfTk9ORTsKKyAgICB9CisgICAgdG9rZW4tPmxpbmVTdGFydAk9IGxleGVyLT5pbnB1dC0+Y3VycmVudExpbmU7CisgICAgdG9rZW4tPnVzZXIxCT0gbGV4ZXItPnJlYy0+c3RhdGUtPnVzZXIxOworICAgIHRva2VuLT51c2VyMgk9IGxleGVyLT5yZWMtPnN0YXRlLT51c2VyMjsKKyAgICB0b2tlbi0+dXNlcjMJPSBsZXhlci0+cmVjLT5zdGF0ZS0+dXNlcjM7CisgICAgdG9rZW4tPmN1c3RvbQk9IGxleGVyLT5yZWMtPnN0YXRlLT5jdXN0b207CisKKyAgICBsZXhlci0+cmVjLT5zdGF0ZS0+dG9rZW4JICAgID0gdG9rZW47CisKKyAgICByZXR1cm4gIHRva2VuOworfQorCisvKioKKyAqIEZyZWUgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgYSBsZXhlcgorICovCitzdGF0aWMgdm9pZCAKK2ZyZWVMZXhlciAgICAocEFOVExSM19MRVhFUiBsZXhlcikKK3sKKwkvLyBUaGlzIG1heSBoYXZlIGJlbiBhIGRlbGVnYXRlIG9yIGRlbGVnYXRvciBsZXhlciwgaW4gd2hpY2ggY2FzZSB0aGUKKwkvLyBzdGF0ZSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZnJlZWQgKGFuZCBzZXQgdG8gTlVMTCB0aGVyZWZvcmUpCisJLy8gc28gd2UgaWdub3JlIHRoZSBzdGF0ZSBpZiB3ZSBkb24ndCBoYXZlIGl0LgorCS8vCisJaWYJKGxleGVyLT5yZWMtPnN0YXRlICE9IE5VTEwpCisJeworCQlpZgkobGV4ZXItPnJlYy0+c3RhdGUtPnN0cmVhbXMgIT0gTlVMTCkKKwkJeworCQkJbGV4ZXItPnJlYy0+c3RhdGUtPnN0cmVhbXMtPmZyZWUobGV4ZXItPnJlYy0+c3RhdGUtPnN0cmVhbXMpOworCQl9CisJCWlmCShsZXhlci0+cmVjLT5zdGF0ZS0+dG9rRmFjdG9yeSAhPSBOVUxMKQorCQl7CisJCQlsZXhlci0+cmVjLT5zdGF0ZS0+dG9rRmFjdG9yeS0+Y2xvc2UobGV4ZXItPnJlYy0+c3RhdGUtPnRva0ZhY3RvcnkpOworCQkJbGV4ZXItPnJlYy0+c3RhdGUtPnRva0ZhY3RvcnkgPSBOVUxMOworCQl9CisJCWlmCShsZXhlci0+cmVjLT5zdGF0ZS0+dG9rU291cmNlICE9IE5VTEwpCisJCXsKKwkJCUFOVExSM19GUkVFKGxleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UpOworCQkJbGV4ZXItPnJlYy0+c3RhdGUtPnRva1NvdXJjZSA9IE5VTEw7CisJCX0KKwl9CisJaWYJKGxleGVyLT5yZWMgIT0gTlVMTCkKKwl7CisJCWxleGVyLT5yZWMtPmZyZWUobGV4ZXItPnJlYyk7CisJCWxleGVyLT5yZWMgPSBOVUxMOworCX0KKwlBTlRMUjNfRlJFRShsZXhlcik7Cit9CisKKy8qKiBJbXBsZW1lbnRhdGlvbiBvZiBtYXRjaHMgZm9yIHRoZSBsZXhlciwgb3ZlcnJpZGVzIGFueQorICogIGJhc2UgaW1wbGVtZW50YXRpb24gaW4gdGhlIGJhc2UgcmVjb2duaXplci4gCisgKgorICogIFxyZW1hcmsKKyAqICBOb3RlIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGxheXMgZG93biBhcnJheXMgb2YgaW50cyBmb3IgY29uc3RhbnQKKyAqICBzdHJpbmdzIHNvIHRoYXQgdGhleSBhcmUgaW50IFVURjMyIGZvcm0hCisgKi8KK3N0YXRpYyBBTlRMUjNfQk9PTEVBTgorbWF0Y2hzKHBBTlRMUjNfTEVYRVIgbGV4ZXIsIEFOVExSM19VQ0hBUiAqIHN0cmluZykKK3sKKwl3aGlsZSAgICgqc3RyaW5nICE9IEFOVExSM19TVFJJTkdfVEVSTUlOQVRPUikKKwl7CisJCWlmICAobGV4ZXItPmlucHV0LT5pc3RyZWFtLT5fTEEobGV4ZXItPmlucHV0LT5pc3RyZWFtLCAxKSAhPSAoKnN0cmluZykpCisJCXsKKwkJCWlmCShsZXhlci0+cmVjLT5zdGF0ZS0+YmFja3RyYWNraW5nID4gMCkKKwkJCXsKKwkJCQlsZXhlci0+cmVjLT5zdGF0ZS0+ZmFpbGVkID0gQU5UTFIzX1RSVUU7CisJCQkJcmV0dXJuIEFOVExSM19GQUxTRTsKKwkJCX0KKworCQkJbGV4ZXItPnJlYy0+ZXhDb25zdHJ1Y3QobGV4ZXItPnJlYyk7CisJCQlsZXhlci0+cmVjLT5zdGF0ZS0+ZmFpbGVkCSA9IEFOVExSM19UUlVFOworCisJCQkvKiBUT0RPOiBJbXBsZW1lbnQgZXhjZXB0aW9uIGNyZWF0aW9uIG1vcmUgZnVsbHkgcGVyaGFwcworCQkJICovCisJCQlsZXhlci0+cmVjb3ZlcihsZXhlcik7CisJCQlyZXR1cm4gIEFOVExSM19GQUxTRTsKKwkJfQorCisJCS8qIE1hdGNoZWQgY29ycmVjdGx5LCBkbyBjb25zdW1lIGl0CisJCSAqLworCQlsZXhlci0+aW5wdXQtPmlzdHJlYW0tPmNvbnN1bWUobGV4ZXItPmlucHV0LT5pc3RyZWFtKTsKKwkJc3RyaW5nKys7CisKKwkJLyogUmVzZXQgYW55IGZhaWxlZCBpbmRpY2F0b3IKKwkJICovCisJCWxleGVyLT5yZWMtPnN0YXRlLT5mYWlsZWQgPSBBTlRMUjNfRkFMU0U7CisJfQorCisKKwlyZXR1cm4gIEFOVExSM19UUlVFOworfQorCisvKiogSW1wbGVtZW50YXRpb24gb2YgbWF0Y2hjIGZvciB0aGUgbGV4ZXIsIG92ZXJyaWRlcyBhbnkKKyAqICBiYXNlIGltcGxlbWVudGF0aW9uIGluIHRoZSBiYXNlIHJlY29nbml6ZXIuIAorICoKKyAqICBccmVtYXJrCisgKiAgTm90ZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBsYXlzIGRvd24gYXJyYXlzIG9mIGludHMgZm9yIGNvbnN0YW50CisgKiAgc3RyaW5ncyBzbyB0aGF0IHRoZXkgYXJlIGludCBVVEYzMiBmb3JtIQorICovCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK21hdGNoYyhwQU5UTFIzX0xFWEVSIGxleGVyLCBBTlRMUjNfVUNIQVIgYykKK3sKKwlpZgkobGV4ZXItPmlucHV0LT5pc3RyZWFtLT5fTEEobGV4ZXItPmlucHV0LT5pc3RyZWFtLCAxKSA9PSBjKQorCXsKKwkJLyogTWF0Y2hlZCBjb3JyZWN0bHksIGRvIGNvbnN1bWUgaXQKKwkJICovCisJCWxleGVyLT5pbnB1dC0+aXN0cmVhbS0+Y29uc3VtZShsZXhlci0+aW5wdXQtPmlzdHJlYW0pOworCisJCS8qIFJlc2V0IGFueSBmYWlsZWQgaW5kaWNhdG9yCisJCSAqLworCQlsZXhlci0+cmVjLT5zdGF0ZS0+ZmFpbGVkID0gQU5UTFIzX0ZBTFNFOworCisJCXJldHVybglBTlRMUjNfVFJVRTsKKwl9CisKKwkvKiBGYWlsZWQgdG8gbWF0Y2gsIGV4Y2VwdGlvbiBhbmQgcmVjb3ZlcnkgdGltZS4KKwkgKi8KKwlpZgkobGV4ZXItPnJlYy0+c3RhdGUtPmJhY2t0cmFja2luZyA+IDApCisJeworCQlsZXhlci0+cmVjLT5zdGF0ZS0+ZmFpbGVkICA9IEFOVExSM19UUlVFOworCQlyZXR1cm4JQU5UTFIzX0ZBTFNFOworCX0KKworCWxleGVyLT5yZWMtPmV4Q29uc3RydWN0KGxleGVyLT5yZWMpOworCisJLyogVE9ETzogSW1wbGVtZW50IGV4Y2VwdGlvbiBjcmVhdGlvbiBtb3JlIGZ1bGx5IHBlcmhhcHMKKwkgKi8KKwlsZXhlci0+cmVjb3ZlcihsZXhlcik7CisKKwlyZXR1cm4gIEFOVExSM19GQUxTRTsKK30KKworLyoqIEltcGxlbWVudGF0aW9uIG9mIG1hdGNoIHJhbmdlIGZvciB0aGUgbGV4ZXIsIG92ZXJyaWRlcyBhbnkKKyAqICBiYXNlIGltcGxlbWVudGF0aW9uIGluIHRoZSBiYXNlIHJlY29nbml6ZXIuIAorICoKKyAqICBccmVtYXJrCisgKiAgTm90ZSB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBsYXlzIGRvd24gYXJyYXlzIG9mIGludHMgZm9yIGNvbnN0YW50CisgKiAgc3RyaW5ncyBzbyB0aGF0IHRoZXkgYXJlIGludCBVVEYzMiBmb3JtIQorICovCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK21hdGNoUmFuZ2UocEFOVExSM19MRVhFUiBsZXhlciwgQU5UTFIzX1VDSEFSIGxvdywgQU5UTFIzX1VDSEFSIGhpZ2gpCit7CisgICAgQU5UTFIzX1VDSEFSICAgIGM7CisKKyAgICAvKiBXaGF0IGlzIGluIHRoZSBzdHJlYW0gYXQgdGhlIG1vbWVudD8KKyAgICAgKi8KKyAgICBjCT0gbGV4ZXItPmlucHV0LT5pc3RyZWFtLT5fTEEobGV4ZXItPmlucHV0LT5pc3RyZWFtLCAxKTsKKyAgICBpZgkoIGMgPj0gbG93ICYmIGMgPD0gaGlnaCkKKyAgICB7CisJLyogTWF0Y2hlZCBjb3JyZWN0bHksIGNvbnN1bWUgaXQKKwkgKi8KKwlsZXhlci0+aW5wdXQtPmlzdHJlYW0tPmNvbnN1bWUobGV4ZXItPmlucHV0LT5pc3RyZWFtKTsKKworCS8qIFJlc2V0IGFueSBmYWlsZWQgaW5kaWNhdG9yCisJICovCisJbGV4ZXItPnJlYy0+c3RhdGUtPmZhaWxlZCA9IEFOVExSM19GQUxTRTsKKworCXJldHVybglBTlRMUjNfVFJVRTsKKyAgICB9CisgICAgCisgICAgLyogRmFpbGVkIHRvIG1hdGNoLCBleGVjcHRpb24gYW5kIHJlY292ZXJ5IHRpbWUuCisgICAgICovCisKKyAgICBpZgkobGV4ZXItPnJlYy0+c3RhdGUtPmJhY2t0cmFja2luZyA+IDApCisgICAgeworCWxleGVyLT5yZWMtPnN0YXRlLT5mYWlsZWQgID0gQU5UTFIzX1RSVUU7CisJcmV0dXJuCUFOVExSM19GQUxTRTsKKyAgICB9CisKKyAgICBsZXhlci0+cmVjLT5leENvbnN0cnVjdChsZXhlci0+cmVjKTsKKworICAgIC8qIFRPRE86IEltcGxlbWVudCBleGNlcHRpb24gY3JlYXRpb24gbW9yZSBmdWxseQorICAgICAqLworICAgIGxleGVyLT5yZWNvdmVyKGxleGVyKTsKKworICAgIHJldHVybiAgQU5UTFIzX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZAorbWF0Y2hBbnkJICAgIChwQU5UTFIzX0xFWEVSIGxleGVyKQoreworICAgIGxleGVyLT5pbnB1dC0+aXN0cmVhbS0+Y29uc3VtZShsZXhlci0+aW5wdXQtPmlzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZAorcmVjb3ZlcgkgICAgKHBBTlRMUjNfTEVYRVIgbGV4ZXIpCit7CisgICAgbGV4ZXItPmlucHV0LT5pc3RyZWFtLT5jb25zdW1lKGxleGVyLT5pbnB1dC0+aXN0cmVhbSk7Cit9CisKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCitnZXRMaW5lCSAgICAocEFOVExSM19MRVhFUiBsZXhlcikKK3sKKyAgICByZXR1cm4gIGxleGVyLT5pbnB1dC0+Z2V0TGluZShsZXhlci0+aW5wdXQpOworfQorCitzdGF0aWMgQU5UTFIzX1VJTlQzMgorZ2V0Q2hhclBvc2l0aW9uSW5MaW5lCShwQU5UTFIzX0xFWEVSIGxleGVyKQoreworICAgIHJldHVybiAgbGV4ZXItPmlucHV0LT5jaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK3N0YXRpYyBBTlRMUjNfTUFSS0VSCWdldENoYXJJbmRleAkgICAgKHBBTlRMUjNfTEVYRVIgbGV4ZXIpCit7CisgICAgcmV0dXJuIGxleGVyLT5pbnB1dC0+aXN0cmVhbS0+aW5kZXgobGV4ZXItPmlucHV0LT5pc3RyZWFtKTsKK30KKworc3RhdGljIHBBTlRMUjNfU1RSSU5HCitnZXRUZXh0CSAgICAocEFOVExSM19MRVhFUiBsZXhlcikKK3sKKwlpZiAobGV4ZXItPnJlYy0+c3RhdGUtPnRleHQpCisJeworCQlyZXR1cm4JbGV4ZXItPnJlYy0+c3RhdGUtPnRleHQ7CisKKwl9CisJcmV0dXJuICBsZXhlci0+aW5wdXQtPnN1YnN0cigKKwkJCQkJCQkJCWxleGVyLT5pbnB1dCwgCisJCQkJCQkJCQlsZXhlci0+cmVjLT5zdGF0ZS0+dG9rZW5TdGFydENoYXJJbmRleCwKKwkJCQkJCQkJCWxleGVyLT5nZXRDaGFySW5kZXgobGV4ZXIpIC0gbGV4ZXItPmlucHV0LT5jaGFyQnl0ZVNpemUKKwkJCQkJCQkpOworCit9CisKK3N0YXRpYyB2b2lkICoJCQkJCitnZXRDdXJyZW50SW5wdXRTeW1ib2wJCShwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyLCBwQU5UTFIzX0lOVF9TVFJFQU0gaXN0cmVhbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKgkJCQkKK2dldE1pc3NpbmdTeW1ib2wJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNCWlzdHJlYW0sIHBBTlRMUjNfRVhDRVBUSU9OCWUsCisJCQkJCQkJCQlBTlRMUjNfVUlOVDMyIGV4cGVjdGVkVG9rZW5UeXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdykKK3sKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM3BhcnNlci5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ZTBlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM3BhcnNlci5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiogXGZpbGUKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGFuIEFOVExSMyBwYXJzZXIuCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzcGFyc2VyLmg+CisKKy8qIFBhcnNlciBBUEkgCisgKi8KK3N0YXRpYyB2b2lkCQkJCQlzZXREZWJ1Z0xpc3RlbmVyCShwQU5UTFIzX1BBUlNFUiBwYXJzZXIsIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGJnKTsKK3N0YXRpYyB2b2lkCQkJCQlzZXRUb2tlblN0cmVhbQkJKHBBTlRMUjNfUEFSU0VSIHBhcnNlciwgcEFOVExSM19UT0tFTl9TVFJFQU0pOworc3RhdGljIHBBTlRMUjNfVE9LRU5fU1RSRUFNCWdldFRva2VuU3RyZWFtCQkocEFOVExSM19QQVJTRVIgcGFyc2VyKTsKK3N0YXRpYyB2b2lkCQkJCQlmcmVlUGFyc2VyCQkgICAgKHBBTlRMUjNfUEFSU0VSIHBhcnNlcik7CisKK0FOVExSM19BUEkgcEFOVExSM19QQVJTRVIKK2FudGxyM1BhcnNlck5ld1N0cmVhbURiZwkJKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQsIHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzdHJlYW0sIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGJnLCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKQoreworCXBBTlRMUjNfUEFSU0VSCXBhcnNlcjsKKworCXBhcnNlciA9IGFudGxyM1BhcnNlck5ld1N0cmVhbShzaXplSGludCwgdHN0cmVhbSwgc3RhdGUpOworCisJaWYJKHBhcnNlciA9PSBOVUxMKQorICAgIHsKKwkJcmV0dXJuCU5VTEw7CisgICAgfQorCisJcGFyc2VyLT5zZXREZWJ1Z0xpc3RlbmVyKHBhcnNlciwgZGJnKTsKKworCXJldHVybiBwYXJzZXI7Cit9CisKK0FOVExSM19BUEkgcEFOVExSM19QQVJTRVIKK2FudGxyM1BhcnNlck5ldwkJKEFOVExSM19VSU5UMzIgc2l6ZUhpbnQsIHBBTlRMUjNfUkVDT0dOSVpFUl9TSEFSRURfU1RBVEUgc3RhdGUpCit7CisgICAgcEFOVExSM19QQVJTRVIJcGFyc2VyOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5CisgICAgICovCisgICAgcGFyc2VyCT0gKHBBTlRMUjNfUEFSU0VSKSBBTlRMUjNfTUFMTE9DKHNpemVvZihBTlRMUjNfUEFSU0VSKSk7CisKKyAgICBpZgkocGFyc2VyID09IE5VTEwpCisgICAgeworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKyAgICAvKiBJbnN0YWxsIGEgYmFzZSBwYXJzZXIKKyAgICAgKi8KKyAgICBwYXJzZXItPnJlYyA9ICBhbnRscjNCYXNlUmVjb2duaXplck5ldyhBTlRMUjNfVFlQRV9QQVJTRVIsIHNpemVIaW50LCBzdGF0ZSk7CisKKyAgICBpZgkocGFyc2VyLT5yZWMgPT0gTlVMTCkKKyAgICB7CisJCXBhcnNlci0+ZnJlZShwYXJzZXIpOworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKyAgICBwYXJzZXItPnJlYy0+c3VwZXIJPSBwYXJzZXI7CisKKyAgICAvKiBQYXJzZXIgb3ZlcnJpZGVzCisgICAgICovCisgICAgcGFyc2VyLT5yZWMtPmV4Q29uc3RydWN0CT0gIGFudGxyM01URXhjZXB0aW9uTmV3OworCisgICAgLyogSW5zdGFsbCB0aGUgQVBJCisgICAgICovCisJcGFyc2VyLT5zZXREZWJ1Z0xpc3RlbmVyCT0gIHNldERlYnVnTGlzdGVuZXI7CisgICAgcGFyc2VyLT5zZXRUb2tlblN0cmVhbQkJPSAgc2V0VG9rZW5TdHJlYW07CisgICAgcGFyc2VyLT5nZXRUb2tlblN0cmVhbQkJPSAgZ2V0VG9rZW5TdHJlYW07CisKKyAgICBwYXJzZXItPmZyZWUJCQk9ICBmcmVlUGFyc2VyOworCisgICAgcmV0dXJuIHBhcnNlcjsKK30KKworQU5UTFIzX0FQSSBwQU5UTFIzX1BBUlNFUgorYW50bHIzUGFyc2VyTmV3U3RyZWFtCShBTlRMUjNfVUlOVDMyIHNpemVIaW50LCBwQU5UTFIzX1RPS0VOX1NUUkVBTSB0c3RyZWFtLCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlKQoreworICAgIHBBTlRMUjNfUEFSU0VSCXBhcnNlcjsKKworICAgIHBhcnNlciAgPSBhbnRscjNQYXJzZXJOZXcoc2l6ZUhpbnQsIHN0YXRlKTsKKworICAgIGlmCShwYXJzZXIgPT0gTlVMTCkKKyAgICB7CisJCXJldHVybglOVUxMOworICAgIH0KKworICAgIC8qIEV2ZXJ5dGhpbmcgc2VlbXMgdG8gYmUgaHVua3kgZG9yeSBzbyB3ZSBjYW4gaW5zdGFsbCB0aGUgCisgICAgICogdG9rZW4gc3RyZWFtLgorICAgICAqLworICAgIHBhcnNlci0+c2V0VG9rZW5TdHJlYW0ocGFyc2VyLCB0c3RyZWFtKTsKKworICAgIHJldHVybiBwYXJzZXI7Cit9CisKK3N0YXRpYyB2b2lkCQkKK2ZyZWVQYXJzZXIJCQkgICAgKHBBTlRMUjNfUEFSU0VSIHBhcnNlcikKK3sKKyAgICBpZgkocGFyc2VyLT5yZWMgIT0gTlVMTCkKKyAgICB7CisJCS8vIFRoaXMgbWF5IGhhdmUgYmVuIGEgZGVsZWdhdGUgb3IgZGVsZWdhdG9yIHBhcnNlciwgaW4gd2hpY2ggY2FzZSB0aGUKKwkJLy8gc3RhdGUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGZyZWVkIChhbmQgc2V0IHRvIE5VTEwgdGhlcmVmb3JlKQorCQkvLyBzbyB3ZSBpZ25vcmUgdGhlIHN0YXRlIGlmIHdlIGRvbid0IGhhdmUgaXQuCisJCS8vCisJCWlmCShwYXJzZXItPnJlYy0+c3RhdGUgIT0gTlVMTCkKKwkJeworCQkJaWYJKHBhcnNlci0+cmVjLT5zdGF0ZS0+Zm9sbG93aW5nICE9IE5VTEwpCisJCQl7CisJCQkJcGFyc2VyLT5yZWMtPnN0YXRlLT5mb2xsb3dpbmctPmZyZWUocGFyc2VyLT5yZWMtPnN0YXRlLT5mb2xsb3dpbmcpOworCQkJCXBhcnNlci0+cmVjLT5zdGF0ZS0+Zm9sbG93aW5nID0gTlVMTDsKKwkJCX0KKwkJfQorCSAgICBwYXJzZXItPnJlYy0+ZnJlZShwYXJzZXItPnJlYyk7CisJICAgIHBhcnNlci0+cmVjCT0gTlVMTDsKKworICAgIH0KKyAgICBBTlRMUjNfRlJFRShwYXJzZXIpOworfQorCitzdGF0aWMgdm9pZAkJCQkJCitzZXREZWJ1Z0xpc3RlbmVyCQkocEFOVExSM19QQVJTRVIgcGFyc2VyLCBwQU5UTFIzX0RFQlVHX0VWRU5UX0xJU1RFTkVSIGRiZykKK3sKKwkvLyBTZXQgdGhlIGRlYnVnIGxpc3RlbmVyLiBUaGVyZSBhcmUgbm8gbWV0aG9kcyB0byBvdmVycmlkZQorCS8vIGJlY2F1c2UgY3VycmVudGx5IHRoZSBvbmx5IG9uZXMgdGhhdCBub3RpZnkgdGhlIGRlYnVnZ2VyCisJLy8gYXJlIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkuIEhlbmNlIHdlIGNhbiBhZmZvcmQgdG8KKwkvLyBjaGVjayBhbmQgc2VlIGlmIHRoZSBkZWJ1Z2dlciBpbnRlcmZhY2UgaXMgbnVsbCBvciBub3QKKwkvLyB0aGVyZS4gSWYgdGhlcmUgaXMgZXZlciBhbiBvY2Nhc2lvbiBmb3IgYSBwZXJmb3JtYW5jZQorCS8vIHNlbnNpdGl2ZSBmdW5jdGlvbiB0byB1c2UgdGhlIGRlYnVnZ2VyIGludGVyZmFjZSwgdGhlbgorCS8vIGEgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIGRlYnVnIG1vZGUgc2hvdWxkIGJlIHN1cHBsaWVkCisJLy8gYW5kIGluc3RhbGxlZCBoZXJlLgorCS8vCisJcGFyc2VyLT5yZWMtPmRlYnVnZ2VyCT0gZGJnOworCisJLy8gSWYgdGhlcmUgd2FzIGEgdG9rZW5zdHJlYW0gaW5zdGFsbGVkIGFscmVhZHkKKwkvLyB0aGVuIHdlIG5lZWQgdG8gdGVsbCBpdCBhYm91dCB0aGUgZGVidWcgaW50ZXJmYWNlCisJLy8KKwlpZgkocGFyc2VyLT50c3RyZWFtICE9IE5VTEwpCisJeworCQlwYXJzZXItPnRzdHJlYW0tPnNldERlYnVnTGlzdGVuZXIocGFyc2VyLT50c3RyZWFtLCBkYmcpOworCX0KK30KKworc3RhdGljIHZvaWQJCQkKK3NldFRva2VuU3RyZWFtCQkgICAgKHBBTlRMUjNfUEFSU0VSIHBhcnNlciwgcEFOVExSM19UT0tFTl9TVFJFQU0gdHN0cmVhbSkKK3sKKyAgICBwYXJzZXItPnRzdHJlYW0gPSB0c3RyZWFtOworICAgIHBhcnNlci0+cmVjLT5yZXNldChwYXJzZXItPnJlYyk7Cit9CisKK3N0YXRpYyBwQU5UTFIzX1RPS0VOX1NUUkVBTQkKK2dldFRva2VuU3RyZWFtCQkgICAgKHBBTlRMUjNfUEFSU0VSIHBhcnNlcikKK3sKKyAgICByZXR1cm4gIHBhcnNlci0+dHN0cmVhbTsKK30KKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjNyZXdyaXRlc3RyZWFtcy5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzcmV3cml0ZXN0cmVhbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZiNmUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzcmV3cml0ZXN0cmVhbXMuYwpAQCAtMCwwICsxLDg0NCBAQAorLy8vIFxmaWxlCisvLy8gSW1wbGVtZW50YXRpb24gb2YgdG9rZW4vdHJlZSBzdHJlYW1zIHRoYXQgYXJlIHVzZWQgYnkgdGhlCisvLy8gdHJlZSByZS13cml0ZSBydWxlcyB0byBtYW5pcHVsYXRlIHRoZSB0b2tlbnMgYW5kIHRyZWVzIHByb2R1Y2VkCisvLy8gYnkgcnVsZXMgdGhhdCBhcmUgc3ViamVjdCB0byByZXdyaXRlIGRpcmVjdGl2ZXMuCisvLy8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzcmV3cml0ZXN0cmVhbXMuaD4KKworLy8gU3RhdGljIHN1cHBvcnQgZnVuY3Rpb24gZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBzdHJlYW0gdHlwZXMuCisvLworc3RhdGljCXZvaWQJCQkJcmVzZXQJCQkocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKTsgCitzdGF0aWMJdm9pZAkJCQlhZGQJCQkJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSwgdm9pZCAqIGVsLCB2b2lkIChBTlRMUjNfQ0RFQ0wgKmZyZWVQdHIpKHZvaWQgKikpOworc3RhdGljCXZvaWQgKgkJCQluZXh0CQkJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJbmV4dFRyZWUJCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pOworc3RhdGljCXZvaWQgKgkJCQluZXh0VG9rZW4JCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pOworc3RhdGljCXZvaWQgKgkJCQlfbmV4dAkJCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pOworc3RhdGljCXZvaWQgKgkJCQlkdXBUb2sJCQkocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtLCB2b2lkICogZWwpOworc3RhdGljCXZvaWQgKgkJCQlkdXBUcmVlCQkJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSwgdm9pZCAqIGVsKTsKK3N0YXRpYwl2b2lkICoJCQkJZHVwVHJlZU5vZGUJCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0sIHZvaWQgKiBlbCk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJdG9UcmVlCQkJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSwgdm9pZCAqIGVsZW1lbnQpOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCXRvVHJlZU5vZGUJCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0sIHZvaWQgKiBlbGVtZW50KTsKK3N0YXRpYwlBTlRMUjNfQk9PTEVBTgkJaGFzTmV4dAkJCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pOworc3RhdGljCXBBTlRMUjNfQkFTRV9UUkVFCW5leHROb2RlCQkocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKTsKK3N0YXRpYwlwQU5UTFIzX0JBU0VfVFJFRQluZXh0Tm9kZU5vZGUJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSk7CitzdGF0aWMJcEFOVExSM19CQVNFX1RSRUUJbmV4dE5vZGVUb2tlbgkocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKTsKK3N0YXRpYwlBTlRMUjNfVUlOVDMyCQlzaXplCQkJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSk7CitzdGF0aWMJdm9pZCAqCQkJCWdldERlc2NyaXB0aW9uCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pOworc3RhdGljCXZvaWQJCQkJZnJlZVJTCQkJKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSk7CitzdGF0aWMJdm9pZAkJCQlleHB1bmdlUlMJCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pOworCisKKy8vIFBsYWNlIGEgbm93IHVudXNlZCByZXdyaXRlIHN0cmVhbSBiYWNrIG9uIHRoZSByZXdyaXRlIHN0cmVhbSBwb29sCisvLyBzbyB3ZSBjYW4gcmV1c2UgaXQgaWYgd2UgbmVlZCB0by4KKy8vCitzdGF0aWMgdm9pZAorZnJlZVJTCShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pCit7CisJLy8gQmVmb3JlIHBsYWNpbmcgdGhlIHN0cmVhbSBiYWNrIGluIHRoZSBwb29sLCB3ZQorCS8vIG5lZWQgdG8gY2xlYXIgYW55IHZlY3RvciBpdCBoYXMuIFRoaXMgaXMgc28gYW55CisJLy8gZnJlZSBwb2ludGVycyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCisJLy8gZW50aXJlcyBhcmUgY2FsbGVkLgorCS8vCisJaWYJKHN0cmVhbS0+ZWxlbWVudHMgIT0gTlVMTCkKKwl7CisJCS8vIEZhY3RvcnkgZ2VuZXJhdGVkIHZlY3RvcnMgY2FuIGJlIHJldHVybmVkIHRvIHRoZQorCQkvLyB2ZWN0b3IgZmFjdG9yeSBmb3IgbGF0ZXIgcmV1c2UuCisJCS8vCisJCWlmCShzdHJlYW0tPmVsZW1lbnRzLT5mYWN0b3J5TWFkZSA9PSBBTlRMUjNfVFJVRSkKKwkJeworCQkJcEFOVExSM19WRUNUT1JfRkFDVE9SWSBmYWN0b3J5ID0gKChwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1IpKHN0cmVhbS0+YWRhcHRvci0+c3VwZXIpKS0+YXJib3JldHVtLT52RmFjdG9yeTsKKwkJCWZhY3RvcnktPnJldHVyblZlY3RvcihmYWN0b3J5LCBzdHJlYW0tPmVsZW1lbnRzKTsKKworCQkJc3RyZWFtLT5lbGVtZW50cyA9IE5VTEw7CisJCX0gCisJCWVsc2UKKwkJeworCQkJLy8gT3RoZXIgdmVjdG9ycyB3ZSBjbGVhciBhbmQgYWxsb3cgdG8gYmUgcmV1c2VkIGlmIHRoZXkgY29tZSBvZmYgdGhlCisJCQkvLyByZXdyaXRlIHN0cmVhbSBmcmVlIHN0YWNrIGFuZCBhcmUgcmV1c2VkLgorCQkJLy8KKwkJCXN0cmVhbS0+ZWxlbWVudHMtPmNsZWFyKHN0cmVhbS0+ZWxlbWVudHMpOworCQkJc3RyZWFtLT5mcmVlRWxlbWVudHMgPSBBTlRMUjNfVFJVRTsKKwkJfQorCX0KKwllbHNlCisJeworCQlzdHJlYW0tPmZyZWVFbGVtZW50cyA9IEFOVExSM19GQUxTRTsgLy8gSnVzdCBpbiBjYXNlCisJfQorCisJLy8gQWRkIHRoZSBzdHJlYW0gaW50byB0aGUgcmVjb2duaXplciBzdHJlYW0gc3RhY2sgdmVjdG9yCisJLy8gYWRkaW5nIHRoZSBzdHJlYW0gbWVtb3J5IGZyZWUgcm91dGluZSBzbyB0aGF0CisJLy8gaXQgaXMgdGhyb3duIGF3YXkgd2hlbiB0aGUgc3RhY2sgdmVjdG9yIGlzIGRlc3Ryb3llZAorCS8vCisJc3RyZWFtLT5yZWMtPnN0YXRlLT5yU3RyZWFtcy0+YWRkKHN0cmVhbS0+cmVjLT5zdGF0ZS0+clN0cmVhbXMsIHN0cmVhbSwgKHZvaWQoKikodm9pZCAqKSlleHB1bmdlUlMpOworfQorCisvKiogRG8gc3BlY2lhbCBuaWxOb2RlIHJldXNlIGRldGVjdGlvbiBmb3Igbm9kZSBzdHJlYW1zLgorICovCitzdGF0aWMgdm9pZAorZnJlZU5vZGVSUyhwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pCit7CisgICAgcEFOVExSM19CQVNFX1RSRUUgdHJlZTsKKworICAgIC8vIEJlZm9yZSBwbGFjaW5nIHRoZSBzdHJlYW0gYmFjayBpbiB0aGUgcG9vbCwgd2UKKwkvLyBuZWVkIHRvIGNsZWFyIGFueSB2ZWN0b3IgaXQgaGFzLiBUaGlzIGlzIHNvIGFueQorCS8vIGZyZWUgcG9pbnRlcnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorCS8vIGVudGlyZXMgYXJlIGNhbGxlZC4gSG93ZXZlciwgaWYgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgIC8vIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBlbnRyaWVzIGluIHRoZSBzdHJlYW0gYXJlIGRlZmluYXRlbHkKKyAgICAvLyB0cmVlIG5vZGVzLiBIZW5jZSB3ZSBjaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZW0gd2VyZSBuaWxOb2RlcyBhcworICAgIC8vIGlmIHRoZXkgd2VyZSwgd2UgY2FuIHJldXNlIHRoZW0uCisJLy8KKwlpZgkoc3RyZWFtLT5lbGVtZW50cyAhPSBOVUxMKQorCXsKKyAgICAgICAgLy8gV2UgaGF2ZSBzb21lIGVsZW1lbnRzIHRvIHRyYXZlcnNlCisgICAgICAgIC8vCisgICAgICAgIEFOVExSM19VSU5UMzIgaTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpPD0gc3RyZWFtLT5lbGVtZW50cy0+Y291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJlZSA9IChwQU5UTFIzX0JBU0VfVFJFRSkoc3RyZWFtLT5lbGVtZW50cy0+ZWxlbWVudHNbaS0xXS5lbGVtZW50KTsKKyAgICAgICAgICAgIGlmICAodHJlZSAhPSBOVUxMICYmIHRyZWUtPmlzTmlsTm9kZSh0cmVlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBIYWQgdG8gcmVtb3ZlIHRoaXMgZm9yIG5vdywgY2hlY2sgaXMgbm90IGNvbXByZWhlbnNpdmUgZW5vdWdoCisgICAgICAgICAgICAgICAgLy8gdHJlZS0+cmV1c2UodHJlZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCQkvLyBGYWN0b3J5IGdlbmVyYXRlZCB2ZWN0b3JzIGNhbiBiZSByZXR1cm5lZCB0byB0aGUKKwkJLy8gdmVjdG9yIGZhY3RvcnkgZm9yIGxhdGVyIHJldXNlLgorCQkvLworCQlpZgkoc3RyZWFtLT5lbGVtZW50cy0+ZmFjdG9yeU1hZGUgPT0gQU5UTFIzX1RSVUUpCisJCXsKKwkJCXBBTlRMUjNfVkVDVE9SX0ZBQ1RPUlkgZmFjdG9yeSA9ICgocEFOVExSM19DT01NT05fVFJFRV9BREFQVE9SKShzdHJlYW0tPmFkYXB0b3ItPnN1cGVyKSktPmFyYm9yZXR1bS0+dkZhY3Rvcnk7CisJCQlmYWN0b3J5LT5yZXR1cm5WZWN0b3IoZmFjdG9yeSwgc3RyZWFtLT5lbGVtZW50cyk7CisKKwkJCXN0cmVhbS0+ZWxlbWVudHMgPSBOVUxMOworCQl9IAorCQllbHNlCisJCXsKKwkJCXN0cmVhbS0+ZWxlbWVudHMtPmNsZWFyKHN0cmVhbS0+ZWxlbWVudHMpOworCQkJc3RyZWFtLT5mcmVlRWxlbWVudHMgPSBBTlRMUjNfVFJVRTsKKwkJfQorCX0KKwllbHNlCisJeworICAgICAgICBpZiAgKHN0cmVhbS0+c2luZ2xlRWxlbWVudCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB0cmVlID0gKHBBTlRMUjNfQkFTRV9UUkVFKShzdHJlYW0tPnNpbmdsZUVsZW1lbnQpOworICAgICAgICAgICAgaWYgICh0cmVlLT5pc05pbE5vZGUodHJlZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSGFkIHRvIHJlbW92ZSB0aGlzIGZvciBub3csIGNoZWNrIGlzIG5vdCBjb21wcmVoZW5zaXZlIGVub3VnaAorICAgICAgICAgICAgICAvLyAgIHRyZWUtPnJldXNlKHRyZWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmVhbS0+c2luZ2xlRWxlbWVudCA9IE5VTEw7CisJCXN0cmVhbS0+ZnJlZUVsZW1lbnRzID0gQU5UTFIzX0ZBTFNFOyAvLyBKdXN0IGluIGNhc2UKKwl9CisKKwkvLyBBZGQgdGhlIHN0cmVhbSBpbnRvIHRoZSByZWNvZ25pemVyIHN0cmVhbSBzdGFjayB2ZWN0b3IKKwkvLyBhZGRpbmcgdGhlIHN0cmVhbSBtZW1vcnkgZnJlZSByb3V0aW5lIHNvIHRoYXQKKwkvLyBpdCBpcyB0aHJvd24gYXdheSB3aGVuIHRoZSBzdGFjayB2ZWN0b3IgaXMgZGVzdHJveWVkCisJLy8KKwlzdHJlYW0tPnJlYy0+c3RhdGUtPnJTdHJlYW1zLT5hZGQoc3RyZWFtLT5yZWMtPnN0YXRlLT5yU3RyZWFtcywgc3RyZWFtLCAodm9pZCgqKSh2b2lkICopKWV4cHVuZ2VSUyk7Cit9CitzdGF0aWMgdm9pZAorZXhwdW5nZVJTKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSkKK3sKKworCWlmIChzdHJlYW0tPmZyZWVFbGVtZW50cyA9PSBBTlRMUjNfVFJVRSAmJiBzdHJlYW0tPmVsZW1lbnRzICE9IE5VTEwpCisJeworCQlzdHJlYW0tPmVsZW1lbnRzLT5mcmVlKHN0cmVhbS0+ZWxlbWVudHMpOworCX0KKwlBTlRMUjNfRlJFRShzdHJlYW0pOworfQorCisvLyBGdW5jdGlvbnMgZm9yIGNyZWF0aW5nIHN0cmVhbXMKKy8vCitzdGF0aWMgIHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIAorYW50bHIzUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtTmV3QUUocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24pCit7CisJcEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0Jc3RyZWFtOworCisJLy8gRmlyc3QgLSBkbyB3ZSBhbHJlYWR5IGhhdmUgYSByZXdyaXRlIHN0cmVhbSB0aGF0IHdhcyByZXR1cm5lZAorCS8vIHRvIHRoZSBwb29sPyBJZiB3ZSBkbywgdGhlbiB3ZSB3aWxsIGp1c3QgcmV1c2UgaXQgYnkgcmVzZXR0aW5nCisJLy8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgorCS8vCisJaWYJKHJlYy0+c3RhdGUtPnJTdHJlYW1zLT5jb3VudCA+IDApCisJeworCQkvLyBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHZlY3Rvci4gV2UgZG8gbm90CisJCS8vIGNhdXNlIGl0IHRvIGJlIGZyZWVkIGJ5IHVzaW5nIHJlbW92ZS4KKwkJLy8KKwkJc3RyZWFtID0gcmVjLT5zdGF0ZS0+clN0cmVhbXMtPnJlbW92ZShyZWMtPnN0YXRlLT5yU3RyZWFtcywgcmVjLT5zdGF0ZS0+clN0cmVhbXMtPmNvdW50IC0gMSk7CisKKwkJLy8gV2UgZm91bmQgYSBzdHJlYW0gd2UgY2FuIHJldXNlLgorCQkvLyBJZiB0aGUgc3RyZWFtIGhhZCBhIHZlY3RvciwgdGhlbiBpdCB3aWxsIGhhdmUgYmVlbiBjbGVhcmVkCisJCS8vIHdoZW4gdGhlIGZyZWVSUyB3YXMgY2FsbGVkIHRoYXQgcHV0IGl0IGluIHRoaXMgc3RhY2sKKwkJLy8KKwl9CisJZWxzZQorCXsKKwkJLy8gT2ssIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgb25lIGFzIHRoZXJlIHdlcmUgbm9uZSBvbiB0aGUgc3RhY2suCisJCS8vIEZpcnN0IGpvYiBpcyB0byBjcmVhdGUgdGhlIG1lbW9yeSB3ZSBuZWVkLgorCQkvLworCQlzdHJlYW0JPSAocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0pIEFOVExSM19NQUxMT0MoKHNpemVfdCkoc2l6ZW9mKEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0pKSk7CisKKwkJaWYJKHN0cmVhbSA9PSBOVUxMKQorCQl7CisJCQlyZXR1cm4JTlVMTDsKKwkJfQorCQlzdHJlYW0tPmVsZW1lbnRzCQk9IE5VTEw7CisJCXN0cmVhbS0+ZnJlZUVsZW1lbnRzCT0gQU5UTFIzX0ZBTFNFOworCX0KKworCS8vIFBvcHVsYXRlIHRoZSBnZW5lcmljIGludGVyZmFjZQorCS8vCisJc3RyZWFtLT5yZWMJCQkJPSByZWM7CisJc3RyZWFtLT5yZXNldAkJCT0gcmVzZXQ7CisJc3RyZWFtLT5hZGQJCQkJPSBhZGQ7CisJc3RyZWFtLT5uZXh0CQkJPSBuZXh0OworCXN0cmVhbS0+bmV4dFRyZWUJCT0gbmV4dFRyZWU7CisJc3RyZWFtLT5uZXh0Tm9kZQkJPSBuZXh0Tm9kZTsKKwlzdHJlYW0tPm5leHRUb2tlbgkJPSBuZXh0VG9rZW47CisJc3RyZWFtLT5fbmV4dAkJCT0gX25leHQ7CisJc3RyZWFtLT5oYXNOZXh0CQkJPSBoYXNOZXh0OworCXN0cmVhbS0+c2l6ZQkJCT0gc2l6ZTsKKwlzdHJlYW0tPmdldERlc2NyaXB0aW9uICA9IGdldERlc2NyaXB0aW9uOworCXN0cmVhbS0+dG9UcmVlCQkJPSB0b1RyZWU7CisJc3RyZWFtLT5mcmVlCQkJPSBmcmVlUlM7CisJc3RyZWFtLT5zaW5nbGVFbGVtZW50CT0gTlVMTDsKKworCS8vIFJlc2V0IHRoZSBzdHJlYW0gdG8gZW1wdHkuCisJLy8KKworCXN0cmVhbS0+Y3Vyc29yCQkJPSAwOworCXN0cmVhbS0+ZGlydHkJCQk9IEFOVExSM19GQUxTRTsKKworCS8vIEluc3RhbGwgdGhlIGRlc2NyaXB0aW9uCisJLy8KKwlzdHJlYW0tPmVsZW1lbnREZXNjcmlwdGlvbgk9IGRlc2NyaXB0aW9uOworCisJLy8gSW5zdGFsbCB0aGUgYWRhcHRvcgorCS8vCisJc3RyZWFtLT5hZGFwdG9yCQk9IGFkYXB0b3I7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitzdGF0aWMgcEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gCithbnRscjNSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW1OZXdBRUUocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24sIHZvaWQgKiBvbmVFbGVtZW50KQoreworCXBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNCXN0cmVhbTsKKworCS8vIEZpcnN0IGpvYiBpcyB0byBjcmVhdGUgdGhlIG1lbW9yeSB3ZSBuZWVkLgorCS8vCisJc3RyZWFtCT0gYW50bHIzUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtTmV3QUUoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbik7CisKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBTdHJlYW0gc2VlbXMgZ29vZCBzbyB3ZSBuZWVkIHRvIGFkZCB0aGUgc3VwcGxpZWQgZWxlbWVudAorCS8vCisJaWYJKG9uZUVsZW1lbnQgIT0gTlVMTCkKKwl7CisJCXN0cmVhbS0+YWRkKHN0cmVhbSwgb25lRWxlbWVudCwgTlVMTCk7CisJfQorCXJldHVybiBzdHJlYW07Cit9CisKK3N0YXRpYyBwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSAKK2FudGxyM1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbU5ld0FFVihwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbiwgcEFOVExSM19WRUNUT1IgdmVjdG9yKQoreworCXBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNCXN0cmVhbTsKKworCS8vIEZpcnN0IGpvYiBpcyB0byBjcmVhdGUgdGhlIG1lbW9yeSB3ZSBuZWVkLgorCS8vCisJc3RyZWFtCT0gYW50bHIzUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtTmV3QUUoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbik7CisKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJeworCQlyZXR1cm4gc3RyZWFtOworCX0KKworCS8vIFN0cmVhbSBzZWVtcyBnb29kIHNvIHdlIG5lZWQgdG8gaW5zdGFsbCB0aGUgdmVjdG9yIHdlIHdlcmUKKwkvLyBnaXZlbi4gV2UgYXNzdW1lIHRoYXQgc29tZW9uZSBlbHNlIGlzIGdvaW5nIHRvIGZyZWUgdGhlCisJLy8gdmVjdG9yLgorCS8vCisJaWYJKHN0cmVhbS0+ZWxlbWVudHMgIT0gTlVMTCAmJiBzdHJlYW0tPmVsZW1lbnRzLT5mYWN0b3J5TWFkZSA9PSBBTlRMUjNfRkFMU0UgJiYgc3RyZWFtLT5mcmVlRWxlbWVudHMgPT0gQU5UTFIzX1RSVUUgKQorCXsKKwkJc3RyZWFtLT5lbGVtZW50cy0+ZnJlZShzdHJlYW0tPmVsZW1lbnRzKTsKKwl9CisJc3RyZWFtLT5lbGVtZW50cwkJPSB2ZWN0b3I7CisJc3RyZWFtLT5mcmVlRWxlbWVudHMJPSBBTlRMUjNfRkFMU0U7CisJcmV0dXJuIHN0cmVhbTsKK30KKworLy8gVG9rZW4gcmV3cml0ZSBzdHJlYW0gLi4uCisvLworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9UT0tFTl9TVFJFQU0gCithbnRscjNSZXdyaXRlUnVsZVRPS0VOU3RyZWFtTmV3QUUocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24pCit7CisJcEFOVExSM19SRVdSSVRFX1JVTEVfVE9LRU5fU1RSRUFNCXN0cmVhbTsKKworCS8vIEZpcnN0IGpvYiBpcyB0byBjcmVhdGUgdGhlIG1lbW9yeSB3ZSBuZWVkLgorCS8vCisJc3RyZWFtCT0gYW50bHIzUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtTmV3QUUoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbik7CisKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJeworCQlyZXR1cm4gc3RyZWFtOworCX0KKworCS8vIEluc3RhbGwgdGhlIHRva2VuIGJhc2VkIG92ZXJyaWRlcworCS8vCisJc3RyZWFtLT5kdXAJCQk9IGR1cFRvazsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGVUb2tlbjsKKworCS8vIE5vIG5leHROb2RlIGltcGxlbWVudGF0aW9uIGZvciBhIHRva2VuIHJld3JpdGUgc3RyZWFtCisJLy8KKwlyZXR1cm4gc3RyZWFtOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX1RPS0VOX1NUUkVBTSAKK2FudGxyM1Jld3JpdGVSdWxlVE9LRU5TdHJlYW1OZXdBRUUocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24sIHZvaWQgKiBvbmVFbGVtZW50KQoreworCXBBTlRMUjNfUkVXUklURV9SVUxFX1RPS0VOX1NUUkVBTQlzdHJlYW07CisKKwkvLyBGaXJzdCBqb2IgaXMgdG8gY3JlYXRlIHRoZSBtZW1vcnkgd2UgbmVlZC4KKwkvLworCXN0cmVhbQk9IGFudGxyM1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbU5ld0FFRShhZGFwdG9yLCByZWMsIGRlc2NyaXB0aW9uLCBvbmVFbGVtZW50KTsKKworCS8vIEluc3RhbGwgdGhlIHRva2VuIGJhc2VkIG92ZXJyaWRlcworCS8vCisJc3RyZWFtLT5kdXAJCQk9IGR1cFRvazsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGVUb2tlbjsKKworCS8vIE5vIG5leHROb2RlIGltcGxlbWVudGF0aW9uIGZvciBhIHRva2VuIHJld3JpdGUgc3RyZWFtCisJLy8KKwlyZXR1cm4gc3RyZWFtOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX1RPS0VOX1NUUkVBTSAKK2FudGxyM1Jld3JpdGVSdWxlVE9LRU5TdHJlYW1OZXdBRVYocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24sIHBBTlRMUjNfVkVDVE9SIHZlY3RvcikKK3sKKwlwQU5UTFIzX1JFV1JJVEVfUlVMRV9UT0tFTl9TVFJFQU0Jc3RyZWFtOworCisJLy8gRmlyc3Qgam9iIGlzIHRvIGNyZWF0ZSB0aGUgbWVtb3J5IHdlIG5lZWQuCisJLy8KKwlzdHJlYW0JPSBhbnRscjNSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW1OZXdBRVYoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbiwgdmVjdG9yKTsKKworCS8vIEluc3RhbGwgdGhlIHRva2VuIGJhc2VkIG92ZXJyaWRlcworCS8vCisJc3RyZWFtLT5kdXAJCQk9IGR1cFRvazsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGVUb2tlbjsKKworCS8vIE5vIG5leHROb2RlIGltcGxlbWVudGF0aW9uIGZvciBhIHRva2VuIHJld3JpdGUgc3RyZWFtCisJLy8KKwlyZXR1cm4gc3RyZWFtOworfQorCisvLyBTdWJ0cmVlIHJld3JpdGUgc3RyZWFtCisvLworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9TVUJUUkVFX1NUUkVBTSAKK2FudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX1VJTlQ4IGRlc2NyaXB0aW9uKQoreworCXBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNCXN0cmVhbTsKKworCS8vIEZpcnN0IGpvYiBpcyB0byBjcmVhdGUgdGhlIG1lbW9yeSB3ZSBuZWVkLgorCS8vCisJc3RyZWFtCT0gYW50bHIzUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtTmV3QUUoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbik7CisKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJeworCQlyZXR1cm4gc3RyZWFtOworCX0KKworCS8vIEluc3RhbGwgdGhlIHN1YnRyZWUgYmFzZWQgb3ZlcnJpZGVzCisJLy8KKwlzdHJlYW0tPmR1cAkJCT0gZHVwVHJlZTsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGU7CisgICAgc3RyZWFtLT5mcmVlICAgICAgICA9IGZyZWVOb2RlUlM7CisJcmV0dXJuIHN0cmVhbTsKKworfQorQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9TVUJUUkVFX1NUUkVBTSAKK2FudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFRShwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbiwgdm9pZCAqIG9uZUVsZW1lbnQpCit7CisJcEFOVExSM19SRVdSSVRFX1JVTEVfU1VCVFJFRV9TVFJFQU0Jc3RyZWFtOworCisJLy8gRmlyc3Qgam9iIGlzIHRvIGNyZWF0ZSB0aGUgbWVtb3J5IHdlIG5lZWQuCisJLy8KKwlzdHJlYW0JPSBhbnRscjNSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW1OZXdBRUUoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbiwgb25lRWxlbWVudCk7CisKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJeworCQlyZXR1cm4gc3RyZWFtOworCX0KKworCS8vIEluc3RhbGwgdGhlIHN1YnRyZWUgYmFzZWQgb3ZlcnJpZGVzCisJLy8KKwlzdHJlYW0tPmR1cAkJCT0gZHVwVHJlZTsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGU7CisgICAgc3RyZWFtLT5mcmVlICAgICAgICA9IGZyZWVOb2RlUlM7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNIAorYW50bHIzUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtTmV3QUVWKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX1VJTlQ4IGRlc2NyaXB0aW9uLCBwQU5UTFIzX1ZFQ1RPUiB2ZWN0b3IpCit7CisJcEFOVExSM19SRVdSSVRFX1JVTEVfU1VCVFJFRV9TVFJFQU0Jc3RyZWFtOworCisJLy8gRmlyc3Qgam9iIGlzIHRvIGNyZWF0ZSB0aGUgbWVtb3J5IHdlIG5lZWQuCisJLy8KKwlzdHJlYW0JPSBhbnRscjNSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW1OZXdBRVYoYWRhcHRvciwgcmVjLCBkZXNjcmlwdGlvbiwgdmVjdG9yKTsKKworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwl7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIEluc3RhbGwgdGhlIHN1YnRyZWUgYmFzZWQgb3ZlcnJpZGVzCisJLy8KKwlzdHJlYW0tPmR1cAkJCT0gZHVwVHJlZTsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGU7CisgICAgc3RyZWFtLT5mcmVlICAgICAgICA9IGZyZWVOb2RlUlM7CisKKwlyZXR1cm4gc3RyZWFtOworfQorLy8gTm9kZSByZXdyaXRlIHN0cmVhbSAuLi4KKy8vCitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX05PREVfU1RSRUFNIAorYW50bHIzUmV3cml0ZVJ1bGVOT0RFU3RyZWFtTmV3QUUocEFOVExSM19CQVNFX1RSRUVfQURBUFRPUiBhZGFwdG9yLCBwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWMsIHBBTlRMUjNfVUlOVDggZGVzY3JpcHRpb24pCit7CisJcEFOVExSM19SRVdSSVRFX1JVTEVfTk9ERV9TVFJFQU0Jc3RyZWFtOworCisJLy8gRmlyc3Qgam9iIGlzIHRvIGNyZWF0ZSB0aGUgbWVtb3J5IHdlIG5lZWQuCisJLy8KKwlzdHJlYW0JPSBhbnRscjNSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW1OZXdBRShhZGFwdG9yLCByZWMsIGRlc2NyaXB0aW9uKTsKKworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwl7CisJCXJldHVybiBzdHJlYW07CisJfQorCisJLy8gSW5zdGFsbCB0aGUgbm9kZSBiYXNlZCBvdmVycmlkZXMKKwkvLworCXN0cmVhbS0+ZHVwCQkJPSBkdXBUcmVlTm9kZTsKKwlzdHJlYW0tPnRvVHJlZQkJPSB0b1RyZWVOb2RlOworCXN0cmVhbS0+bmV4dE5vZGUJPSBuZXh0Tm9kZU5vZGU7CisgICAgc3RyZWFtLT5mcmVlICAgICAgICA9IGZyZWVOb2RlUlM7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfUkVXUklURV9SVUxFX05PREVfU1RSRUFNIAorYW50bHIzUmV3cml0ZVJ1bGVOT0RFU3RyZWFtTmV3QUVFKHBBTlRMUjNfQkFTRV9UUkVFX0FEQVBUT1IgYWRhcHRvciwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjLCBwQU5UTFIzX1VJTlQ4IGRlc2NyaXB0aW9uLCB2b2lkICogb25lRWxlbWVudCkKK3sKKwlwQU5UTFIzX1JFV1JJVEVfUlVMRV9OT0RFX1NUUkVBTQlzdHJlYW07CisKKwkvLyBGaXJzdCBqb2IgaXMgdG8gY3JlYXRlIHRoZSBtZW1vcnkgd2UgbmVlZC4KKwkvLworCXN0cmVhbQk9IGFudGxyM1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbU5ld0FFRShhZGFwdG9yLCByZWMsIGRlc2NyaXB0aW9uLCBvbmVFbGVtZW50KTsKKworCS8vIEluc3RhbGwgdGhlIG5vZGUgYmFzZWQgb3ZlcnJpZGVzCisJLy8KKwlzdHJlYW0tPmR1cAkJCT0gZHVwVHJlZU5vZGU7CisJc3RyZWFtLT50b1RyZWUJCT0gdG9UcmVlTm9kZTsKKwlzdHJlYW0tPm5leHROb2RlCT0gbmV4dE5vZGVOb2RlOworICAgIHN0cmVhbS0+ZnJlZSAgICAgICAgPSBmcmVlTm9kZVJTOworCisJcmV0dXJuIHN0cmVhbTsKK30KKworQU5UTFIzX0FQSSBwQU5UTFIzX1JFV1JJVEVfUlVMRV9OT0RFX1NUUkVBTSAKK2FudGxyM1Jld3JpdGVSdWxlTk9ERVN0cmVhbU5ld0FFVihwQU5UTFIzX0JBU0VfVFJFRV9BREFQVE9SIGFkYXB0b3IsIHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlYywgcEFOVExSM19VSU5UOCBkZXNjcmlwdGlvbiwgcEFOVExSM19WRUNUT1IgdmVjdG9yKQoreworCXBBTlRMUjNfUkVXUklURV9SVUxFX05PREVfU1RSRUFNCXN0cmVhbTsKKworCS8vIEZpcnN0IGpvYiBpcyB0byBjcmVhdGUgdGhlIG1lbW9yeSB3ZSBuZWVkLgorCS8vCisJc3RyZWFtCT0gYW50bHIzUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtTmV3QUVWKGFkYXB0b3IsIHJlYywgZGVzY3JpcHRpb24sIHZlY3Rvcik7CisKKwkvLyBJbnN0YWxsIHRoZSBOb2RlIGJhc2VkIG92ZXJyaWRlcworCS8vCisJc3RyZWFtLT5kdXAJCQk9IGR1cFRyZWVOb2RlOworCXN0cmVhbS0+dG9UcmVlCQk9IHRvVHJlZU5vZGU7CisJc3RyZWFtLT5uZXh0Tm9kZQk9IG5leHROb2RlTm9kZTsKKyAgICBzdHJlYW0tPmZyZWUgICAgICAgID0gZnJlZU5vZGVSUzsKKyAgICAKKwlyZXR1cm4gc3RyZWFtOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YXRpYyBzdXBwb3J0IGZ1bmN0aW9ucyAKKworLy8vIFJlc2V0IHRoZSBjb25kaXRpb24gb2YgdGhpcyBzdHJlYW0gc28gdGhhdCBpdCBhcHBlYXJzIHdlIGhhdmUKKy8vLyBub3QgY29uc3VtZWQgYW55IG9mIGl0cyBlbGVtZW50cy4gIEVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHVudG91Y2hlZC4KKy8vLworc3RhdGljIHZvaWQJCQorcmVzZXQgICAgKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSkKK3sKKwlzdHJlYW0tPmRpcnR5CT0gQU5UTFIzX1RSVUU7CisJc3RyZWFtLT5jdXJzb3IJPSAwOworfQorCisvLyBBZGQgYSBuZXcgcEFOVExSM19CQVNFX1RSRUUgdG8gdGhpcyBzdHJlYW0KKy8vCitzdGF0aWMgdm9pZAkJCithZGQJICAgIChwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0sIHZvaWQgKiBlbCwgdm9pZCAoQU5UTFIzX0NERUNMICpmcmVlUHRyKSh2b2lkICopKQoreworCWlmIChlbD09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCS8vIEFzIHdlIG1heSBiZSByZXVzaW5nIGEgc3RyZWFtLCB3ZSBtYXkgYWxyZWFkeSBoYXZlIGFsbG9jYXRlZAorCS8vIGEgcmV3cml0ZSBzdHJlYW0gdmVjdG9yLiBJZiB3ZSBoYXZlIHRoZW4gaXMgd2lsbCBiZSBlbXB0eSBpZgorCS8vIHdlIGhhdmUgZWl0aGVyIHplcm8gb3IganVzdCBvbmUgZWxlbWVudCBpbiB0aGUgcmV3cml0ZSBzdHJlYW0KKwkvLworCWlmIChzdHJlYW0tPmVsZW1lbnRzICE9IE5VTEwgJiYgc3RyZWFtLT5lbGVtZW50cy0+Y291bnQgPiAwKQorCXsKKwkJLy8gV2UgYWxyZWFkeSBoYXZlID4xIGVudHJpZXMgaW4gdGhlIHN0cmVhbS4gU28gd2UgY2FuIGp1c3QgYWRkIHRoaXMgbmV3IGVsZW1lbnQgdG8gdGhlIGV4aXN0aW5nCisJCS8vIGNvbGxlY3Rpb24uIAorCQkvLworCQlzdHJlYW0tPmVsZW1lbnRzLT5hZGQoc3RyZWFtLT5lbGVtZW50cywgZWwsIGZyZWVQdHIpOworCQlyZXR1cm47CisJfQorCWlmIChzdHJlYW0tPnNpbmdsZUVsZW1lbnQgPT0gTlVMTCkKKwl7CisJCXN0cmVhbS0+c2luZ2xlRWxlbWVudCA9IGVsOworCQlyZXR1cm47CisJfQorCisJLy8gSWYgd2UgZ290IGhlcmUgdGhlbiB3ZSBoYWQgb25seSB0aGUgb25lIGVsZW1lbnQgc28gZmFyCisJLy8gYW5kIHdlIG11c3Qgbm93IGNyZWF0ZSBhIHZlY3RvciB0byBob2xkIGEgY29sbGVjdGlvbiBvZiB0aGVtCisJLy8KKwlpZgkoc3RyZWFtLT5lbGVtZW50cyA9PSBOVUxMKQorCXsKKyAgICAgICAgcEFOVExSM19WRUNUT1JfRkFDVE9SWSBmYWN0b3J5ID0gKChwQU5UTFIzX0NPTU1PTl9UUkVFX0FEQVBUT1IpKHN0cmVhbS0+YWRhcHRvci0+c3VwZXIpKS0+YXJib3JldHVtLT52RmFjdG9yeTsKKworICAgICAgICAKKwkJc3RyZWFtLT5lbGVtZW50cwkJPSBmYWN0b3J5LT5uZXdWZWN0b3IoZmFjdG9yeSk7CisJCXN0cmVhbS0+ZnJlZUVsZW1lbnRzCT0gQU5UTFIzX1RSVUU7CQkJLy8gV2UgJ3VtbWVkIGl0LCBzbyB3ZSBwbGF5IGl0IHNvbi4KKwl9CisgICAgCisJc3RyZWFtLT5lbGVtZW50cy0+YWRkCShzdHJlYW0tPmVsZW1lbnRzLCBzdHJlYW0tPnNpbmdsZUVsZW1lbnQsIGZyZWVQdHIpOworCXN0cmVhbS0+ZWxlbWVudHMtPmFkZAkoc3RyZWFtLT5lbGVtZW50cywgZWwsIGZyZWVQdHIpOworCXN0cmVhbS0+c2luZ2xlRWxlbWVudAk9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLiAgSWYgb3V0IG9mIGVsZW1lbnRzLCB0aHJvdworLy8vIGFuIGV4Y2VwdGlvbiB1bmxlc3Mgc2l6ZSgpPT0xLiAgSWYgc2l6ZSBpcyAxLCB0aGVuIHJldHVybiBlbGVtZW50c1swXS4KKy8vLyBSZXR1cm4gYSBkdXBsaWNhdGUgbm9kZS9zdWJ0cmVlIGlmIHN0cmVhbSBpcyBvdXQgb2YgZWxlbWVudHMgYW5kCisvLy8gc2l6ZT09MS4gIElmIHdlJ3ZlIGFscmVhZHkgdXNlZCB0aGUgZWxlbWVudCwgZHVwIChkaXJ0eSBiaXQgc2V0KS4KKy8vLworc3RhdGljIHBBTlRMUjNfQkFTRV9UUkVFCituZXh0VHJlZShwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pIAoreworCUFOVExSM19VSU5UMzIJCW47CisJdm9pZAkJCSogIGVsOworCisJbiA9IHN0cmVhbS0+c2l6ZShzdHJlYW0pOworCisJaWYgKCBzdHJlYW0tPmRpcnR5IHx8IChzdHJlYW0tPmN1cnNvciA+PW4gJiYgbj09MSkgKSAKKwl7CisJCS8vIGlmIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZSBpcyAxLCBkdXAKKwkJLy8KKwkJZWwgPSBzdHJlYW0tPl9uZXh0KHN0cmVhbSk7CisJCXJldHVybiBzdHJlYW0tPmR1cChzdHJlYW0sIGVsKTsKKwl9CisKKwkvLyB0ZXN0IHNpemUgYWJvdmUgdGhlbiBmZXRjaAorCS8vCisJZWwgPSBzdHJlYW0tPl9uZXh0KHN0cmVhbSk7CisJcmV0dXJuIGVsOworfQorCisvLy8gUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgZm9yIGEgY2FsbGVyIHRoYXQgd2FudHMganVzdCB0aGUgdG9rZW4KKy8vLworc3RhdGljCXZvaWQgKgorbmV4dFRva2VuCQkocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKQoreworCXJldHVybiBzdHJlYW0tPl9uZXh0KHN0cmVhbSk7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLiAgSWYgb3V0IG9mIGVsZW1lbnRzLCB0aHJvdworLy8vIGFuIGV4Y2VwdGlvbiB1bmxlc3Mgc2l6ZSgpPT0xLiAgSWYgc2l6ZSBpcyAxLCB0aGVuIHJldHVybiBlbGVtZW50c1swXS4KKy8vLworc3RhdGljIHZvaWQgKgkKK25leHQJICAgIChwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pCit7CisJQU5UTFIzX1VJTlQzMiAgIHM7CisKKwlzID0gc3RyZWFtLT5zaXplKHN0cmVhbSk7CisJaWYgKHN0cmVhbS0+Y3Vyc29yID49IHMgJiYgcyA9PSAxKQorCXsKKwkJcEFOVExSM19CQVNFX1RSRUUgZWw7CisKKwkJZWwgPSBzdHJlYW0tPl9uZXh0KHN0cmVhbSk7CisKKwkJcmV0dXJuCXN0cmVhbS0+ZHVwKHN0cmVhbSwgZWwpOworCX0KKworCXJldHVybiBzdHJlYW0tPl9uZXh0KHN0cmVhbSk7Cit9CisKKy8vLyBEbyB0aGUgd29yayBvZiBnZXR0aW5nIHRoZSBuZXh0IGVsZW1lbnQsIG1ha2luZyBzdXJlIHRoYXQgaXQncworLy8vIGEgdHJlZSBub2RlIG9yIHN1YnRyZWUuICBEZWFsIHdpdGggdGhlIG9wdGltaXphdGlvbiBvZiBzaW5nbGUtCisvLy8gZWxlbWVudCBsaXN0IHZlcnN1cyBsaXN0IG9mIHNpemUgPiAxLiAgVGhyb3cgYW4gZXhjZXB0aW9uIChvciBzb21ldGhpbmcgc2ltaWxhcikKKy8vLyBpZiB0aGUgc3RyZWFtIGlzIGVtcHR5IG9yIHdlJ3JlIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZT4xLgorLy8vIFlvdSBjYW4gb3ZlcnJpZGUgaW4gYSAnc3ViY2xhc3MnIGlmIG5lY2Vzc2FyeS4KKy8vLworc3RhdGljIHZvaWQgKgorX25leHQgICAgKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSkKK3sKKwlBTlRMUjNfVUlOVDMyCQluOworCXBBTlRMUjNfQkFTRV9UUkVFCXQ7CisKKwluID0gc3RyZWFtLT5zaXplKHN0cmVhbSk7CisKKwlpZiAobiA9PSAwKQorCXsKKwkJLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzdHJlYW0gaXMgZW1wdHkKKwkJLy8KKwkJcmV0dXJuIE5VTEw7CS8vIENhbGxlciBtdXN0IGNvcGUgd2l0aCB0aGlzCisJfQorCisJLy8gVHJhdmVyc2VkIGFsbCB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGFscmVhZHk/CisJLy8KKwlpZiAoc3RyZWFtLT5jdXJzb3IgPj0gbikKKwl7CisJCWlmIChuID09IDEpCisJCXsKKwkJCS8vIFNwZWNpYWwgY2FzZSB3aGVuIHNpemUgaXMgc2luZ2xlIGVsZW1lbnQsIGl0IHdpbGwganVzdCBkdXAgYSBsb3QKKwkJCS8vCisJCQlyZXR1cm4gc3RyZWFtLT50b1RyZWUoc3RyZWFtLCBzdHJlYW0tPnNpbmdsZUVsZW1lbnQpOworCQl9CisKKwkJLy8gT3V0IG9mIGVsZW1lbnRzIGFuZCB0aGUgc2l6ZSBpcyBub3QgMSwgc28gd2UgY2Fubm90IGFzc3VtZQorCQkvLyB0aGF0IHdlIGp1c3QgZHVwbGljYXRlIHRoZSBlbnRyeSBuIHRpbWVzIChzdWNoIGFzIElEIGVudCsgLT4gXihJRCBlbnQpKykKKwkJLy8gVGhpcyBtZWFucyB3ZSByYW4gb3V0IG9mIGVsZW1lbnRzIGVhcmxpZXIgdGhhbiB3YXMgZXhwZWN0ZWQuCisJCS8vCisJCXJldHVybiBOVUxMOwkvLyBDYWxsZXIgbXVzdCBjb3BlIHdpdGggdGhpcworCX0KKworCS8vIEVsZW1lbnRzIGF2YWlsYWJsZSBlaXRoZXIgZm9yIGR1cGluZyBvciBqdXN0IGF2YWlsYWJsZQorCS8vCisJaWYgKHN0cmVhbS0+c2luZ2xlRWxlbWVudCAhPSBOVUxMKQorCXsKKwkJc3RyZWFtLT5jdXJzb3IrKzsgICAvLyBDdXJzb3IgYWR2YW5jZXMgZXZlbiBmb3Igc2luZ2xlIGVsZW1lbnQgYXMgdGhpcyB0ZWxscyB1cyB0byBkdXAoKQorCQlyZXR1cm4gc3RyZWFtLT50b1RyZWUoc3RyZWFtLCBzdHJlYW0tPnNpbmdsZUVsZW1lbnQpOworCX0KKworCS8vIE1vcmUgdGhhbiBqdXN0IGEgc2luZ2xlIGVsZW1lbnQgc28gd2UgZXh0cmFjdCBpdCBmcm9tIHRoZSAKKwkvLyB2ZWN0b3IuCisJLy8KKwl0ID0gc3RyZWFtLT50b1RyZWUoc3RyZWFtLCBzdHJlYW0tPmVsZW1lbnRzLT5nZXQoc3RyZWFtLT5lbGVtZW50cywgc3RyZWFtLT5jdXJzb3IpKTsKKwlzdHJlYW0tPmN1cnNvcisrOworCXJldHVybiB0OworfQorCisjaWZkZWYgQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAwKQorI2VuZGlmCisvLy8gV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGR1cCBhIHRva2VuIG9yIEFTVAorLy8vIHN1YnRyZWUuICBEdXAnaW5nIGEgdG9rZW4gbWVhbnMganVzdCBjcmVhdGluZyBhbm90aGVyIEFTVCBub2RlCisvLy8gYXJvdW5kIGl0LiAgRm9yIHRyZWVzLCB5b3UgbXVzdCBjYWxsIHRoZSBhZGFwdG9yLmR1cFRyZWUoKS4KKy8vLworc3RhdGljIHZvaWQgKgkKK2R1cFRvawkgICAgKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSwgdm9pZCAqIGVsKQoreworCUFOVExSM19GUFJJTlRGKHN0ZGVyciwgImR1cCgpIGNhbm5vdCBiZSBjYWxsZWQgb24gYSB0b2tlbiByZXdyaXRlIHN0cmVhbSEhIik7CisJcmV0dXJuIE5VTEw7Cit9CisjaWZkZWYgQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworLy8vIFdoZW4gY29uc3RydWN0aW5nIHRyZWVzLCBzb21ldGltZXMgd2UgbmVlZCB0byBkdXAgYSB0b2tlbiBvciBBU1QKKy8vLyBzdWJ0cmVlLiAgRHVwJ2luZyBhIHRva2VuIG1lYW5zIGp1c3QgY3JlYXRpbmcgYW5vdGhlciBBU1Qgbm9kZQorLy8vIGFyb3VuZCBpdC4gIEZvciB0cmVlcywgeW91IG11c3QgY2FsbCB0aGUgYWRhcHRvci5kdXBUcmVlKCkuCisvLy8KK3N0YXRpYyB2b2lkICoJCitkdXBUcmVlCSAgICAocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtLCB2b2lkICogZWxlbWVudCkKK3sKKwlyZXR1cm4gc3RyZWFtLT5hZGFwdG9yLT5kdXBOb2RlKHN0cmVhbS0+YWRhcHRvciwgKHBBTlRMUjNfQkFTRV9UUkVFKWVsZW1lbnQpOworfQorCisjaWZkZWYgQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAwKQorI2VuZGlmCisvLy8gV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGR1cCBhIHRva2VuIG9yIEFTVAorLy8vIHN1YnRyZWUuICBEdXAnaW5nIGEgdG9rZW4gbWVhbnMganVzdCBjcmVhdGluZyBhbm90aGVyIEFTVCBub2RlCisvLy8gYXJvdW5kIGl0LiAgRm9yIHRyZWVzLCB5b3UgbXVzdCBjYWxsIHRoZSBhZGFwdG9yLmR1cFRyZWUoKS4KKy8vLworc3RhdGljIHZvaWQgKgkKK2R1cFRyZWVOb2RlCSAgICAocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtLCB2b2lkICogZWxlbWVudCkKK3sKKwlBTlRMUjNfRlBSSU5URihzdGRlcnIsICJkdXAoKSBjYW5ub3QgYmUgY2FsbGVkIG9uIGEgbm9kZSByZXdyaXRlIHN0cmVhbSEhISIpOworCXJldHVybiBOVUxMOworfQorCisKKy8vLyBXZSBkb247dCBleHBsaWNpdGx5IGNvbnZlcnQgdG8gYSB0cmVlIHVubGVzcyB0aGUgY2FsbCBnb2VzIHRvIAorLy8vIG5leHRUcmVlLCB3aGljaCBtZWFucyByZXdyaXRlcyBhcmUgaGV0ZXJvZ2VuZW91cyAKKy8vLworc3RhdGljIHBBTlRMUjNfQkFTRV9UUkVFCQordG9UcmVlICAgKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSwgdm9pZCAqIGVsZW1lbnQpCit7CisJcmV0dXJuIChwQU5UTFIzX0JBU0VfVFJFRSllbGVtZW50OworfQorI2lmZGVmIEFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vLyBFbnN1cmUgc3RyZWFtIGVtaXRzIHRyZWVzOyB0b2tlbnMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gQVNUIG5vZGVzLgorLy8vIEFTVCBub2RlcyBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5tb2xlc3RlZC4KKy8vLworI2lmZGVmIEFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDEwMCkKKyNlbmRpZgorCitzdGF0aWMgcEFOVExSM19CQVNFX1RSRUUJCit0b1RyZWVOb2RlICAgKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSwgdm9pZCAqIGVsZW1lbnQpCit7CisJcmV0dXJuIHN0cmVhbS0+YWRhcHRvci0+ZHVwTm9kZShzdHJlYW0tPmFkYXB0b3IsIChwQU5UTFIzX0JBU0VfVFJFRSllbGVtZW50KTsKK30KKworI2lmZGVmIEFOVExSM19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vLyBSZXR1cm5zIEFOVExSM19UUlVFIGlmIHRoZXJlIGlzIGEgbmV4dCBlbGVtZW50IGF2YWlsYWJsZQorLy8vCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4JCitoYXNOZXh0ICAocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKQoreworCWlmICgJKHN0cmVhbS0+c2luZ2xlRWxlbWVudCAhPSBOVUxMICYmIHN0cmVhbS0+Y3Vyc29yIDwgMSkKKwkJfHwJKHN0cmVhbS0+ZWxlbWVudHMgIT0gTlVMTCAmJiBzdHJlYW0tPmN1cnNvciA8IHN0cmVhbS0+ZWxlbWVudHMtPnNpemUoc3RyZWFtLT5lbGVtZW50cykpKQorCXsKKwkJcmV0dXJuIEFOVExSM19UUlVFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gQU5UTFIzX0ZBTFNFOworCX0KK30KKworLy8vIEdldCB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBsaXN0IGFuZCBjcmVhdGUgYSBub2RlIGZvciBpdAorLy8vIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0b2tlbiBzdHJlYW1zLgorLy8vCitzdGF0aWMgcEFOVExSM19CQVNFX1RSRUUKK25leHROb2RlVG9rZW4ocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKQoreworCXJldHVybiBzdHJlYW0tPmFkYXB0b3ItPmNyZWF0ZShzdHJlYW0tPmFkYXB0b3IsIHN0cmVhbS0+X25leHQoc3RyZWFtKSk7Cit9CisKK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRQorbmV4dE5vZGVOb2RlKHBBTlRMUjNfUkVXUklURV9SVUxFX0VMRU1FTlRfU1RSRUFNIHN0cmVhbSkKK3sKKwlyZXR1cm4gc3RyZWFtLT5fbmV4dChzdHJlYW0pOworfQorCisvLy8gVHJlYXQgbmV4dCBlbGVtZW50IGFzIGEgc2luZ2xlIG5vZGUgZXZlbiBpZiBpdCdzIGEgc3VidHJlZS4KKy8vLyBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZiBuZXh0KCkgd2hlbiB0aGUgcmVzdWx0IGhhcyB0byBiZSBhCisvLy8gdHJlZSByb290IG5vZGUuICBBbHNvIHByZXZlbnRzIHVzIGZyb20gZHVwbGljYXRpbmcgcmVjZW50bHktYWRkZWQKKy8vLyBjaGlsZHJlbjsgZS5nLiwgXih0eXBlIElEKSsgYWRkcyBJRCB0byB0eXBlIGFuZCB0aGVuIDJuZCBpdGVyYXRpb24KKy8vLyBtdXN0IGR1cCB0aGUgdHlwZSBub2RlLCBidXQgSUQgaGFzIGJlZW4gYWRkZWQuCisvLy8KKy8vLyBSZWZlcmVuY2luZyB0byBhIHJ1bGUgcmVzdWx0IHR3aWNlIGlzIG9rOyBkdXAgZW50aXJlIHRyZWUgYXMKKy8vLyB3ZSBjYW4ndCBiZSBhZGRpbmcgdHJlZXM7IGUuZy4sIGV4cHIgZXhwci4gCisvLy8KK3N0YXRpYyBwQU5UTFIzX0JBU0VfVFJFRQkKK25leHROb2RlIChwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pCit7CisKKwlBTlRMUjNfVUlOVDMyCW47CisJcEFOVExSM19CQVNFX1RSRUUJZWwgPSBzdHJlYW0tPl9uZXh0KHN0cmVhbSk7CisKKwluID0gc3RyZWFtLT5zaXplKHN0cmVhbSk7CisJaWYgKHN0cmVhbS0+ZGlydHkgPT0gQU5UTFIzX1RSVUUgfHwgKHN0cmVhbS0+Y3Vyc29yID4gbiAmJiBuID09IDEpKQorCXsKKwkJLy8gV2UgYXJlIG91dCBvZiBlbGVtZW50cyBhbmQgdGhlIHNpemUgaXMgMSwgd2hpY2ggbWVhbnMgd2UganVzdCAKKwkJLy8gZHVwIHRoZSBub2RlIHRoYXQgd2UgaGF2ZQorCQkvLworCQlyZXR1cm4Jc3RyZWFtLT5hZGFwdG9yLT5kdXBOb2RlKHN0cmVhbS0+YWRhcHRvciwgZWwpOworCX0KKworCS8vIFdlIHdlcmUgbm90IG91dCBvZiBub2Rlcywgc28gdGhlIG9uZSB3ZSByZWNlaXZlZCBpcyB0aGUgb25lIHRvIHJldHVybgorCS8vCisJcmV0dXJuICBlbDsKK30KKworLy8vIE51bWJlciBvZiBlbGVtZW50cyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbQorLy8vCitzdGF0aWMgQU5UTFIzX1VJTlQzMgkKK3NpemUJICAgIChwQU5UTFIzX1JFV1JJVEVfUlVMRV9FTEVNRU5UX1NUUkVBTSBzdHJlYW0pCit7CisJQU5UTFIzX1VJTlQzMiAgIG4gPSAwOworCisJLy8vIFNob3VsZCBiZSBhIGNvdW50IG9mIG9uZSBpZiBzaW5nbGVFbGVtZW50IGlzIHNldC4gSSBjb3BpZWQgdGhpcworCS8vLyBsb2dpYyBmcm9tIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uLCB3aGljaCBJIHN1c3BlY3QgaXMganVzdCBndWFyZGluZworCS8vLyBhZ2FpbnN0IHNvbWVvbmUgc2V0dGluZyBzaW5nbGVFbGVtZW50IGFuZCBmb3JnZXR0aW5nIHRvIE5VTEwgaXQgb3V0CisJLy8vCisJaWYgKHN0cmVhbS0+c2luZ2xlRWxlbWVudCAhPSBOVUxMKQorCXsKKwkJbiA9IDE7CisJfQorCWVsc2UKKwl7CisJCWlmIChzdHJlYW0tPmVsZW1lbnRzICE9IE5VTEwpCisJCXsKKwkJCXJldHVybiAoQU5UTFIzX1VJTlQzMikoc3RyZWFtLT5lbGVtZW50cy0+Y291bnQpOworCQl9CisJfQorCXJldHVybiBuOworfQorCisvLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGlmIHRoZXJlIGlzIG9uZSBhdmFpbGFibGUgKGNoZWNrIGZvciBOVUxMKS4KKy8vLworc3RhdGljIHZvaWQgKgkKK2dldERlc2NyaXB0aW9uICAocEFOVExSM19SRVdSSVRFX1JVTEVfRUxFTUVOVF9TVFJFQU0gc3RyZWFtKQoreworCWlmIChzdHJlYW0tPmVsZW1lbnREZXNjcmlwdGlvbiA9PSBOVUxMKQorCXsKKwkJc3RyZWFtLT5lbGVtZW50RGVzY3JpcHRpb24gPSAiPHVua25vd24gc291cmNlPiI7CisJfQorCisJcmV0dXJuICBzdHJlYW0tPmVsZW1lbnREZXNjcmlwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM3N0cmluZy5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5YzAyMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM3N0cmluZy5jCkBAIC0wLDAgKzEsMTQwMiBAQAorLyoqIFxmaWxlCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5UTFIzIHN0cmluZyBhbmQgc3RyaW5nIGZhY3RvcnkgY2xhc3NlcworICovCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IEppbSBJZGxlLCBUZW1wb3JhbCBXYXZlIExMQworLy8gaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorLy8gaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1ZGUgICAgPGFudGxyM3N0cmluZy5oPgorCisvKiBGYWN0b3J5IEFQSQorICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgbmV3UmF3OAkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5KTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBuZXdSYXdVVEYxNgkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5KTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBuZXdTaXplOAkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBBTlRMUjNfVUlOVDMyIHNpemUpOworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIG5ld1NpemVVVEYxNgkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBBTlRMUjNfVUlOVDMyIHNpemUpOworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIG5ld1B0cjgJKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSwgcEFOVExSM19VSU5UOCBzdHJpbmcsIEFOVExSM19VSU5UMzIgc2l6ZSk7CitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgbmV3UHRyVVRGMTZfOAkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1VJTlQ4IHN0cmluZywgQU5UTFIzX1VJTlQzMiBzaXplKTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBuZXdQdHJVVEYxNl9VVEYxNgkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1VJTlQ4IHN0cmluZywgQU5UTFIzX1VJTlQzMiBzaXplKTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBuZXdTdHI4CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggc3RyaW5nKTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBuZXdTdHJVVEYxNl84CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggc3RyaW5nKTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBuZXdTdHJVVEYxNl9VVEYxNgkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1VJTlQ4IHN0cmluZyk7CitzdGF0aWMgICAgdm9pZAkJICAgIGRlc3Ryb3kJKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSwgcEFOVExSM19TVFJJTkcgc3RyaW5nKTsKK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICBwcmludGFibGU4CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfU1RSSU5HIHN0cmluZyk7CitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgcHJpbnRhYmxlVVRGMTYJKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSwgcEFOVExSM19TVFJJTkcgc3RyaW5nKTsKK3N0YXRpYyAgICB2b2lkCQkgICAgY2xvc2VGYWN0b3J5KHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSk7CisKKy8qIFN0cmluZyBBUEkKKyAqLworc3RhdGljICAgIHBBTlRMUjNfVUlOVDgJICAgIHNldDgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIGNoYXJzKTsKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4CSAgICBzZXRVVEYxNl84CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIGNvbnN0IGNoYXIgKiBjaGFycyk7CitzdGF0aWMgICAgcEFOVExSM19VSU5UOAkgICAgc2V0VVRGMTZfVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIGNoYXJzKTsKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4CSAgICBhcHBlbmQ4CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIGNvbnN0IGNoYXIgKiBuZXdiaXQpOworc3RhdGljICAgIHBBTlRMUjNfVUlOVDgJICAgIGFwcGVuZFVURjE2XzgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIG5ld2JpdCk7CitzdGF0aWMgICAgcEFOVExSM19VSU5UOAkgICAgYXBwZW5kVVRGMTZfVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIG5ld2JpdCk7CitzdGF0aWMJICBwQU5UTFIzX1VJTlQ4CSAgICBpbnNlcnQ4CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgcG9pbnQsIGNvbnN0IGNoYXIgKiBuZXdiaXQpOworc3RhdGljCSAgcEFOVExSM19VSU5UOAkgICAgaW5zZXJ0VVRGMTZfOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHBvaW50LCBjb25zdCBjaGFyICogbmV3Yml0KTsKK3N0YXRpYwkgIHBBTlRMUjNfVUlOVDgJICAgIGluc2VydFVURjE2X1VURjE2CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgcG9pbnQsIGNvbnN0IGNoYXIgKiBuZXdiaXQpOworCitzdGF0aWMgICAgcEFOVExSM19VSU5UOAkgICAgc2V0UwkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBwQU5UTFIzX1NUUklORyBjaGFycyk7CitzdGF0aWMgICAgcEFOVExSM19VSU5UOAkgICAgYXBwZW5kUwkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBwQU5UTFIzX1NUUklORyBuZXdiaXQpOworc3RhdGljCSAgcEFOVExSM19VSU5UOAkgICAgaW5zZXJ0UwkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHBvaW50LCBwQU5UTFIzX1NUUklORyBuZXdiaXQpOworCitzdGF0aWMgICAgcEFOVExSM19VSU5UOAkgICAgYWRkYzgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBjKTsKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4CSAgICBhZGRjVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBjKTsKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4CSAgICBhZGRpOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfSU5UMzIgaSk7CitzdGF0aWMgICAgcEFOVExSM19VSU5UOAkgICAgYWRkaVVURjE2CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19JTlQzMiBpKTsKK3N0YXRpYwkgIHBBTlRMUjNfVUlOVDgJICAgIGluc2VydGk4CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgcG9pbnQsIEFOVExSM19JTlQzMiBpKTsKK3N0YXRpYwkgIHBBTlRMUjNfVUlOVDgJICAgIGluc2VydGlVVEYxNgkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHBvaW50LCBBTlRMUjNfSU5UMzIgaSk7CisKK3N0YXRpYyAgICBBTlRMUjNfVUlOVDMyICAgICBjb21wYXJlOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBjb25zdCBjaGFyICogY29tcFN0cik7CitzdGF0aWMgICAgQU5UTFIzX1VJTlQzMiAgICAgY29tcGFyZVVURjE2XzgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIGNvbXBTdHIpOworc3RhdGljICAgIEFOVExSM19VSU5UMzIgICAgIGNvbXBhcmVVVEYxNl9VVEYxNihwQU5UTFIzX1NUUklORyBzdHJpbmcsIGNvbnN0IGNoYXIgKiBjb21wU3RyKTsKK3N0YXRpYyAgICBBTlRMUjNfVUlOVDMyICAgICBjb21wYXJlUwkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBwQU5UTFIzX1NUUklORyBjb21wU3RyKTsKK3N0YXRpYyAgICBBTlRMUjNfVUNIQVIgICAgICBjaGFyQXQ4CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgb2Zmc2V0KTsKK3N0YXRpYyAgICBBTlRMUjNfVUNIQVIgICAgICBjaGFyQXRVVEYxNgkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIG9mZnNldCk7CitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgc3ViU3RyaW5nOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIHN0YXJ0SW5kZXgsIEFOVExSM19VSU5UMzIgZW5kSW5kZXgpOworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIHN1YlN0cmluZ1VURjE2CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgc3RhcnRJbmRleCwgQU5UTFIzX1VJTlQzMiBlbmRJbmRleCk7CitzdGF0aWMJICBBTlRMUjNfSU5UMzIJICAgIHRvSW50MzJfOAkocEFOVExSM19TVFJJTkcgc3RyaW5nKTsKK3N0YXRpYwkgIEFOVExSM19JTlQzMgkgICAgdG9JbnQzMl9VVEYxNiAgKHBBTlRMUjNfU1RSSU5HIHN0cmluZyk7CitzdGF0aWMJICBwQU5UTFIzX1NUUklORyAgICB0bzhfOAkJKHBBTlRMUjNfU1RSSU5HIHN0cmluZyk7CitzdGF0aWMJICBwQU5UTFIzX1NUUklORyAgICB0bzhfVVRGMTYJCShwQU5UTFIzX1NUUklORyBzdHJpbmcpOworc3RhdGljCXBBTlRMUjNfU1RSSU5HCQl0b1VURjhfOAkocEFOVExSM19TVFJJTkcgc3RyaW5nKTsKK3N0YXRpYwlwQU5UTFIzX1NUUklORwkJdG9VVEY4X1VURjE2CShwQU5UTFIzX1NUUklORyBzdHJpbmcpOworCisvKiBMb2NhbCBoZWxwZXJzCisgKi8KK3N0YXRpYwl2b2lkCQkJc3RyaW5nSW5pdDgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZyk7CitzdGF0aWMJdm9pZAkJCXN0cmluZ0luaXRVVEYxNgkocEFOVExSM19TVFJJTkcgc3RyaW5nKTsKK3N0YXRpYwl2b2lkCUFOVExSM19DREVDTAlzdHJpbmdGcmVlCShwQU5UTFIzX1NUUklORyBzdHJpbmcpOworCitBTlRMUjNfQVBJIHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgCithbnRscjNTdHJpbmdGYWN0b3J5TmV3KEFOVExSM19VSU5UMzIgZW5jb2RpbmcpCit7CisJcEFOVExSM19TVFJJTkdfRkFDVE9SWSAgZmFjdG9yeTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeQorCSovCisJZmFjdG9yeQk9IChwQU5UTFIzX1NUUklOR19GQUNUT1JZKSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZihBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkpKTsKKworCWlmCShmYWN0b3J5ID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvKiBOb3cgd2UgbWFrZSBhIG5ldyBsaXN0IHRvIHRyYWNrIHRoZSBzdHJpbmdzLgorCSovCisJZmFjdG9yeS0+c3RyaW5ncwk9IGFudGxyM1ZlY3Rvck5ldygwKTsKKwlmYWN0b3J5LT5pbmRleAk9IDA7CisKKwlpZgkoZmFjdG9yeS0+c3RyaW5ncyA9PSBOVUxMKQorCXsKKwkJQU5UTFIzX0ZSRUUoZmFjdG9yeSk7CisJCXJldHVybglOVUxMOworCX0KKworICAgIC8vIEluc3RhbGwgdGhlIEFQSQorICAgIC8vCisgICAgLy8gVE9ETzogVGhlc2UgZW5jb2RpbmdzIG5lZWQgZXF1aXZhbGVudCBmdW5jdGlvbnMgdG8KKyAgICAvLyBVVEYxNiBhbmQgOEJpdCBpZiBJIGFtIGdvaW5nIHRvIHN1cHBvcnQgdGhvc2UgZW5jb2RpbmdzIGluIHRoZSBTVFJJTkcgc3R1ZmYuCisJLy8gVGhlIFNUUklORyBzdHVmZiB3YXMgaW50ZW5kZWQgYXMgYSBxdWljayBhbmQgZGlydHkgaGFjayBmb3IgcGVvcGxlIHRoYXQgZGlkIG5vdAorCS8vIHdhbnQgdG8gd29ycnkgYWJvdXQgbWVtb3J5IGFuZCBwZXJmb3JtYW5jZSB2ZXJ5IG11Y2gsIGJ1dCBub2JvZHkgZXZlciByZWFkcyB0aGUgCisJLy8gbm90ZXMgb3IgY29tbWVudHMgb3IgdXNlcyB0aGUgZW1haWwgbGlzdCBzZWFyY2guIEkgd2FudCB0byBkaXNjb3VyYWdlIHVzaW5nIHRoZXNlCisJLy8gaW50ZXJmYWNlcyBhcyBpdCBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRvIHVzZSB0aGUgcG9pbnRlcnMgd2l0aGluIHRoZSB0b2tlbnMKKwkvLyBkaXJlY3RseSwgc28gSSBhbSBub3QgaW1wbGVtZW50aW5nIHRoZSBzdHJpbmcgc3R1ZmYgZm9yIHRoZSBuZXdlciBlbmNvZGluZ3MuCisgICAgLy8gV2UgaW5zdGFsbCB0aGUgc3RhbmRhcmQgOCBhbmQgMTYgYml0IGZ1bmN0aW9ucyBmb3IgdGhlIFVURiA4IGFuZCAxNiBidXQgdGhleQorCS8vIHdpbGwgbm90IGJlIHVzZWZ1bCBiZXlvbmQgcmV0dXJuaW5nIHRoZSB0ZXh0LgorCS8vIAorICAgIHN3aXRjaChlbmNvZGluZykKKyAgICB7CisJCWNhc2UgICAgQU5UTFIzX0VOQ19VVEYzMjoKKwkJCWJyZWFrOworCisJCWNhc2UgICAgQU5UTFIzX0VOQ19VVEYzMkJFOgorCQkJYnJlYWs7CisKKwkJY2FzZSAgICBBTlRMUjNfRU5DX1VURjMyTEU6CisJCQlicmVhazsKKworCQljYXNlICAgIEFOVExSM19FTkNfVVRGMTZCRToKKwkJY2FzZSAgICBBTlRMUjNfRU5DX1VURjE2TEU6CisJCWNhc2UgICAgQU5UTFIzX0VOQ19VVEYxNjoKKworCQkJZmFjdG9yeS0+bmV3UmF3CSAgICA9ICBuZXdSYXdVVEYxNjsKKwkJCWZhY3RvcnktPm5ld1NpemUJPSAgbmV3U2l6ZVVURjE2OworCQkJZmFjdG9yeS0+bmV3UHRyCSAgICA9ICBuZXdQdHJVVEYxNl9VVEYxNjsKKwkJCWZhY3RvcnktPm5ld1B0cjgJPSAgbmV3UHRyVVRGMTZfODsKKwkJCWZhY3RvcnktPm5ld1N0cgkgICAgPSAgbmV3U3RyVVRGMTZfVVRGMTY7CisJCQlmYWN0b3J5LT5uZXdTdHI4CT0gIG5ld1N0clVURjE2Xzg7CisJCQlmYWN0b3J5LT5wcmludGFibGUJPSAgcHJpbnRhYmxlVVRGMTY7CisJCQlmYWN0b3J5LT5kZXN0cm95CT0gIGRlc3Ryb3k7CisJCQlmYWN0b3J5LT5jbG9zZQkgICAgPSAgY2xvc2VGYWN0b3J5OworCQkJYnJlYWs7CisJIAorCQljYXNlICAgIEFOVExSM19FTkNfVVRGODoKKwkJY2FzZSAgICBBTlRMUjNfRU5DX0VCQ0RJQzoKKwkJY2FzZSAgICBBTlRMUjNfRU5DXzhCSVQ6CisJCWRlZmF1bHQ6CisKKwkJCWZhY3RvcnktPm5ld1JhdwkgICAgPSAgbmV3UmF3ODsKKwkJCWZhY3RvcnktPm5ld1NpemUJPSAgbmV3U2l6ZTg7CisJCQlmYWN0b3J5LT5uZXdQdHIJICAgID0gIG5ld1B0cjg7CisJCQlmYWN0b3J5LT5uZXdQdHI4CT0gIG5ld1B0cjg7CisJCQlmYWN0b3J5LT5uZXdTdHIJICAgID0gIG5ld1N0cjg7CisJCQlmYWN0b3J5LT5uZXdTdHI4CT0gIG5ld1N0cjg7CisJCQlmYWN0b3J5LT5wcmludGFibGUJPSAgcHJpbnRhYmxlODsKKwkJCWZhY3RvcnktPmRlc3Ryb3kJPSAgZGVzdHJveTsKKwkJCWZhY3RvcnktPmNsb3NlCSAgICA9ICBjbG9zZUZhY3Rvcnk7CisJCQlicmVhazsKKyAgICB9CisJcmV0dXJuICBmYWN0b3J5OworfQorCisKKy8qKgorICoKKyAqIFxwYXJhbSBmYWN0b3J5IAorICogXHJldHVybiAKKyAqLworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIAorbmV3UmF3OAkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5KQoreworICAgIHBBTlRMUjNfU1RSSU5HICBzdHJpbmc7CisKKyAgICBzdHJpbmcgID0gKHBBTlRMUjNfU1RSSU5HKSBBTlRMUjNfTUFMTE9DKHNpemVvZihBTlRMUjNfU1RSSU5HKSk7CisKKyAgICBpZgkoc3RyaW5nID09IE5VTEwpCisgICAgeworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKyAgICAvKiBTdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkLCBub3cgZmlsbCBpbiB0aGUgQVBJIGV0Yy4KKyAgICAgKi8KKyAgICBzdHJpbmdJbml0OChzdHJpbmcpOworICAgIHN0cmluZy0+ZmFjdG9yeSA9IGZhY3Rvcnk7CisKKyAgICAvKiBBZGQgdGhlIHN0cmluZyBpbnRvIHRoZSBhbGxvY2F0ZWQgbGlzdAorICAgICAqLworICAgIGZhY3RvcnktPnN0cmluZ3MtPnNldChmYWN0b3J5LT5zdHJpbmdzLCBmYWN0b3J5LT5pbmRleCwgKHZvaWQgKikgc3RyaW5nLCAodm9pZCAoQU5UTFIzX0NERUNMICopKHZvaWQgKikpKHN0cmluZ0ZyZWUpLCBBTlRMUjNfVFJVRSk7CisgICAgc3RyaW5nLT5pbmRleCAgID0gZmFjdG9yeS0+aW5kZXgrKzsKKworICAgIHJldHVybiBzdHJpbmc7Cit9CisvKioKKyAqCisgKiBccGFyYW0gZmFjdG9yeSAKKyAqIFxyZXR1cm4gCisgKi8KK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICAKK25ld1Jhd1VURjE2CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnkpCit7CisgICAgcEFOVExSM19TVFJJTkcgIHN0cmluZzsKKworICAgIHN0cmluZyAgPSAocEFOVExSM19TVFJJTkcpIEFOVExSM19NQUxMT0Moc2l6ZW9mKEFOVExSM19TVFJJTkcpKTsKKworICAgIGlmCShzdHJpbmcgPT0gTlVMTCkKKyAgICB7CisJCXJldHVybglOVUxMOworICAgIH0KKworICAgIC8qIFN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQsIG5vdyBmaWxsIGluIHRoZSBBUEkgZXRjLgorICAgICAqLworICAgIHN0cmluZ0luaXRVVEYxNihzdHJpbmcpOworICAgIHN0cmluZy0+ZmFjdG9yeSA9IGZhY3Rvcnk7CisKKyAgICAvKiBBZGQgdGhlIHN0cmluZyBpbnRvIHRoZSBhbGxvY2F0ZWQgbGlzdAorICAgICAqLworICAgIGZhY3RvcnktPnN0cmluZ3MtPnNldChmYWN0b3J5LT5zdHJpbmdzLCBmYWN0b3J5LT5pbmRleCwgKHZvaWQgKikgc3RyaW5nLCAodm9pZCAoQU5UTFIzX0NERUNMICopKHZvaWQgKikpKHN0cmluZ0ZyZWUpLCBBTlRMUjNfVFJVRSk7CisgICAgc3RyaW5nLT5pbmRleCAgID0gZmFjdG9yeS0+aW5kZXgrKzsKKworICAgIHJldHVybiBzdHJpbmc7Cit9CitzdGF0aWMJIAordm9pZAlBTlRMUjNfQ0RFQ0wgc3RyaW5nRnJlZSAgKHBBTlRMUjNfU1RSSU5HIHN0cmluZykKK3sKKyAgICAvKiBGaXJzdCBmcmVlIHRoZSBzdHJpbmcgaXRzZWxmIGlmIHRoZXJlIHdhcyBhbnl0aGluZyBpbiBpdAorICAgICAqLworICAgIGlmCShzdHJpbmctPmNoYXJzKQorICAgIHsKKwlBTlRMUjNfRlJFRShzdHJpbmctPmNoYXJzKTsKKyAgICB9CisKKyAgICAvKiBOb3cgZnJlZSB0aGUgc3BhY2UgZm9yIHRoaXMgc3RyaW5nCisgICAgICovCisgICAgQU5UTFIzX0ZSRUUoc3RyaW5nKTsKKworICAgIHJldHVybjsKK30KKy8qKgorICoKKyAqIFxwYXJhbSBzdHJpbmcgCisgKiBccmV0dXJuIAorICovCitzdGF0aWMJdm9pZAorc3RyaW5nSW5pdDggIChwQU5UTFIzX1NUUklORyBzdHJpbmcpCit7CisgICAgc3RyaW5nLT5sZW4JCQk9IDA7CisgICAgc3RyaW5nLT5zaXplCQk9IDA7CisgICAgc3RyaW5nLT5jaGFycwkJPSBOVUxMOworICAgIHN0cmluZy0+ZW5jb2RpbmcJPSBBTlRMUjNfRU5DXzhCSVQgOworCisgICAgLyogQVBJIGZvciA4IGJpdCBzdHJpbmdzKi8KKworICAgIHN0cmluZy0+c2V0CQk9IHNldDg7CisgICAgc3RyaW5nLT5zZXQ4CT0gc2V0ODsKKyAgICBzdHJpbmctPmFwcGVuZAk9IGFwcGVuZDg7CisgICAgc3RyaW5nLT5hcHBlbmQ4CT0gYXBwZW5kODsKKyAgICBzdHJpbmctPmluc2VydAk9IGluc2VydDg7CisgICAgc3RyaW5nLT5pbnNlcnQ4CT0gaW5zZXJ0ODsKKyAgICBzdHJpbmctPmFkZGkJPSBhZGRpODsKKyAgICBzdHJpbmctPmluc2VydGkJPSBpbnNlcnRpODsKKyAgICBzdHJpbmctPmFkZGMJPSBhZGRjODsKKyAgICBzdHJpbmctPmNoYXJBdAk9IGNoYXJBdDg7CisgICAgc3RyaW5nLT5jb21wYXJlCT0gY29tcGFyZTg7CisgICAgc3RyaW5nLT5jb21wYXJlOAk9IGNvbXBhcmU4OworICAgIHN0cmluZy0+c3ViU3RyaW5nCT0gc3ViU3RyaW5nODsKKyAgICBzdHJpbmctPnRvSW50MzIJPSB0b0ludDMyXzg7CisgICAgc3RyaW5nLT50bzgJCT0gdG84Xzg7CisgICAgc3RyaW5nLT50b1VURjgJPSB0b1VURjhfODsKKyAgICBzdHJpbmctPmNvbXBhcmVTCT0gY29tcGFyZVM7CisgICAgc3RyaW5nLT5zZXRTCT0gc2V0UzsKKyAgICBzdHJpbmctPmFwcGVuZFMJPSBhcHBlbmRTOworICAgIHN0cmluZy0+aW5zZXJ0Uwk9IGluc2VydFM7CisKK30KKy8qKgorICoKKyAqIFxwYXJhbSBzdHJpbmcgCisgKiBccmV0dXJuIAorICovCitzdGF0aWMJdm9pZAorc3RyaW5nSW5pdFVURjE2ICAocEFOVExSM19TVFJJTkcgc3RyaW5nKQoreworICAgIHN0cmluZy0+bGVuCQk9IDA7CisgICAgc3RyaW5nLT5zaXplCT0gMDsKKyAgICBzdHJpbmctPmNoYXJzCT0gTlVMTDsKKyAgICBzdHJpbmctPmVuY29kaW5nCT0gQU5UTFIzX0VOQ184QklUOworCisgICAgLyogQVBJIGZvciBVVEYxNiBzdHJpbmdzICovCisKKyAgICBzdHJpbmctPnNldAkJPSBzZXRVVEYxNl9VVEYxNjsKKyAgICBzdHJpbmctPnNldDgJPSBzZXRVVEYxNl84OworICAgIHN0cmluZy0+YXBwZW5kCT0gYXBwZW5kVVRGMTZfVVRGMTY7CisgICAgc3RyaW5nLT5hcHBlbmQ4CT0gYXBwZW5kVVRGMTZfODsKKyAgICBzdHJpbmctPmluc2VydAk9IGluc2VydFVURjE2X1VURjE2OworICAgIHN0cmluZy0+aW5zZXJ0OAk9IGluc2VydFVURjE2Xzg7CisgICAgc3RyaW5nLT5hZGRpCT0gYWRkaVVURjE2OworICAgIHN0cmluZy0+aW5zZXJ0aQk9IGluc2VydGlVVEYxNjsKKyAgICBzdHJpbmctPmFkZGMJPSBhZGRjVVRGMTY7CisgICAgc3RyaW5nLT5jaGFyQXQJPSBjaGFyQXRVVEYxNjsKKyAgICBzdHJpbmctPmNvbXBhcmUJPSBjb21wYXJlVVRGMTZfVVRGMTY7CisgICAgc3RyaW5nLT5jb21wYXJlOAk9IGNvbXBhcmVVVEYxNl84OworICAgIHN0cmluZy0+c3ViU3RyaW5nCT0gc3ViU3RyaW5nVVRGMTY7CisgICAgc3RyaW5nLT50b0ludDMyCT0gdG9JbnQzMl9VVEYxNjsKKyAgICBzdHJpbmctPnRvOAkJPSB0bzhfVVRGMTY7CisgICAgc3RyaW5nLT50b1VURjgJPSB0b1VURjhfVVRGMTY7CisKKyAgICBzdHJpbmctPmNvbXBhcmVTCT0gY29tcGFyZVM7CisgICAgc3RyaW5nLT5zZXRTCT0gc2V0UzsKKyAgICBzdHJpbmctPmFwcGVuZFMJPSBhcHBlbmRTOworICAgIHN0cmluZy0+aW5zZXJ0Uwk9IGluc2VydFM7Cit9CisvKioKKyAqCisgKiBccGFyYW0gc3RyaW5nIAorICogXHJldHVybiAKKyAqIFRPRE86IEltcGxlbWVudCBVVEYtOAorICovCitzdGF0aWMJdm9pZAorc3RyaW5nSW5pdFVURjggIChwQU5UTFIzX1NUUklORyBzdHJpbmcpCit7CisgICAgc3RyaW5nLT5sZW4JICAgID0gMDsKKyAgICBzdHJpbmctPnNpemUgICAgPSAwOworICAgIHN0cmluZy0+Y2hhcnMgICA9IE5VTEw7CisKKyAgICAvKiBBUEkgKi8KKworfQorCisvLyBDb252ZXJ0IGFuIDggYml0IHN0cmluZyBpbnRvIGEgVVRGOCByZXByZXNlbnRhdGlvbiwgd2hpY2ggaXMgaW4gZmFjdCBqdXN0IHRoZSBzdHJpbmcgaXRzZWxmCisvLyBhIG1lbWNweSBhcyB3ZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSA4IGJpdCBlbmNvZGluZy4KKy8vCitzdGF0aWMJcEFOVExSM19TVFJJTkcJCQordG9VVEY4XzgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZykKK3sKKwlyZXR1cm4gc3RyaW5nLT5mYWN0b3J5LT5uZXdQdHIoc3RyaW5nLT5mYWN0b3J5LCAocEFOVExSM19VSU5UOCkoc3RyaW5nLT5jaGFycyksIHN0cmluZy0+bGVuKTsKK30KKworLy8gQ29udmVydCBhIFVURjE2IHN0cmluZyBpbnRvIGEgVVRGOCByZXByZXNlbnRhdGlvbiB1c2luZyB0aGUgVW5pY29kZS5vcmcKKy8vIHN1cHBsaWVkIEMgYWxnb3JpdGhtcywgd2hpY2ggYXJlIG5vdyBjb250YWluZWQgd2l0aGluIHRoZSBBTlRMUjMgQyBydW50aW1lCisvLyBhcyBwZXJtaXR0ZWQgYnkgdGhlIFVuaWNvZGUgbGljZW5zZSAod2l0aGluIHRoZSBzb3VyY2UgY29kZSBhbnRscjNjb252ZXJ0dXRmLmMvLmgKKy8vIFVDUzIgaGFzIHRoZSBzYW1lIGVuY29kaW5nIGFzIFVURjE2IHNvIHdlIGNhbiB1c2UgVVRGMTYgY29udmVydGVyLgorLy8KK3N0YXRpYwlwQU5UTFIzX1NUUklORwkKK3RvVVRGOF9VVEYxNgkocEFOVExSM19TVFJJTkcgc3RyaW5nKQoreworCisgICAgVVRGOAkgICAgICAqIG91dHB1dEVuZDsJCisgICAgVVRGMTYJICAgICAgKiBpbnB1dEVuZDsKKyAgICBwQU5UTFIzX1NUUklORwl1dGY4U3RyaW5nOworCisgICAgQ29udmVyc2lvblJlc3VsdAljUmVzdWx0OworCisgICAgLy8gQWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIsIHdoaWNoIG5lZWRzIHRvIGFjY29tbW9kYXRlIHBvdGVudGlhbGx5CisgICAgLy8gM1ggKGluIGJ5dGVzKSB0aGUgaW5wdXQgc2l6ZSAoaW4gY2hhcnMpLgorICAgIC8vCisgICAgdXRmOFN0cmluZwk9IHN0cmluZy0+ZmFjdG9yeS0+bmV3U3RyOChzdHJpbmctPmZhY3RvcnksIChwQU5UTFIzX1VJTlQ4KSIiKTsKKworICAgIGlmCSh1dGY4U3RyaW5nICE9IE5VTEwpCisgICAgeworICAgICAgICAvLyBGcmVlIGV4aXN0aW5nIGFsbG9jYXRpb24KKyAgICAgICAgLy8KKyAgICAgICAgQU5UTFIzX0ZSRUUodXRmOFN0cmluZy0+Y2hhcnMpOworCisgICAgICAgIC8vIFJlYWxsb2NhdGUgYWNjb3JkaW5nIHRvIG1heGltdW0gZXhwZWN0ZWQgc2l6ZQorICAgICAgICAvLworICAgICAgICB1dGY4U3RyaW5nLT5zaXplCT0gc3RyaW5nLT5sZW4gKjM7CisgICAgICAgIHV0ZjhTdHJpbmctPmNoYXJzCT0gKHBBTlRMUjNfVUlOVDgpQU5UTFIzX01BTExPQyh1dGY4U3RyaW5nLT5zaXplICsxKTsKKworICAgICAgICBpZgkodXRmOFN0cmluZy0+Y2hhcnMgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5wdXRFbmQgID0gKFVURjE2ICopCShzdHJpbmctPmNoYXJzKTsKKyAgICAgICAgICAgIG91dHB1dEVuZCA9IChVVEY4ICopCSh1dGY4U3RyaW5nLT5jaGFycyk7CisKKyAgICAgICAgICAgIC8vIENhbGwgdGhlIFVuaWNvZGUgY29udmVydGVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY1Jlc3VsdCA9ICBDb252ZXJ0VVRGMTZ0b1VURjgKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgKGNvbnN0IFVURjE2KiopJmlucHV0RW5kLCAKKyAgICAgICAgICAgICAgICAoKGNvbnN0IFVURjE2ICopKHN0cmluZy0+Y2hhcnMpKSArIHN0cmluZy0+bGVuLCAKKyAgICAgICAgICAgICAgICAmb3V0cHV0RW5kLCAKKyAgICAgICAgICAgICAgICBvdXRwdXRFbmQgKyB1dGY4U3RyaW5nLT5zaXplIC0gMSwKKyAgICAgICAgICAgICAgICBsZW5pZW50Q29udmVyc2lvbgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHJlYWxseSBjYXJlIGlmIHRoaW5ncyBmYWlsZWQgb3Igbm90IGhlcmUsIHdlIGp1c3QgY29udmVydGVkCisgICAgICAgICAgICAvLyBldmVyeXRoaW5nIHRoYXQgd2FzIHZhZ3VlbHkgcG9zc2libGUgYW5kIHN0b3BwZWQgd2hlbiBpdCB3YXNuJ3QuIEl0IGlzCisgICAgICAgICAgICAvLyB1cCB0byB0aGUgZ3JhbW1hciBwcm9ncmFtbWVyIHRvIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCBpcyBzZW5zaWJsZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB1dGY4U3RyaW5nLT5sZW4gPSBBTlRMUjNfVUlOVDMyX0NBU1QoKChwQU5UTFIzX1VJTlQ4KW91dHB1dEVuZCkgLSB1dGY4U3RyaW5nLT5jaGFycyk7CisKKyAgICAgICAgICAgICoob3V0cHV0RW5kKzEpID0gJ1wwJzsJCS8vIEFsd2F5cyBudWxsIHRlcm1pbmF0ZQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB1dGY4U3RyaW5nOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIHdpdGggZW5vdWdoIGNhcGFjaXR5IGZvciBzaXplIDggYml0IGNoYXJhY3RlcnMgcGx1cyBhIHRlcm1pbmF0b3IuCisgKgorICogXHBhcmFtW2luXSBmYWN0b3J5IC0gUG9pbnRlciB0byB0aGUgc3RyaW5nIGZhY3RvcnkgdGhhdCBvd25zIHN0cmluZ3MKKyAqIFxwYXJhbVtpbl0gc2l6ZSAtIEluIGNoYXJhY3RlcnMKKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3IHN0cmluZy4KKyAqLworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIAorbmV3U2l6ZTgJKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSwgQU5UTFIzX1VJTlQzMiBzaXplKQoreworICAgIHBBTlRMUjNfU1RSSU5HICBzdHJpbmc7CisKKyAgICBzdHJpbmcgID0gZmFjdG9yeS0+bmV3UmF3KGZhY3RvcnkpOworCisgICAgaWYJKHN0cmluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuCXN0cmluZzsKKyAgICB9CisKKyAgICAvKiBBbHdheXMgYWRkIG9uZSBtb3JlIGJ5dGUgZm9yIGEgdGVybWluYXRvciA7LSkKKyAgICAqLworICAgIHN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX01BTExPQygoc2l6ZV90KShzaXplb2YoQU5UTFIzX1VJTlQ4KSAqIChzaXplKzEpKSk7CisgICAgKihzdHJpbmctPmNoYXJzKQk9ICdcMCc7CisgICAgc3RyaW5nLT5zaXplCT0gc2l6ZSArIDE7CisKKworICAgIHJldHVybiBzdHJpbmc7Cit9CisvKioKKyAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIHdpdGggZW5vdWdoIGNhcGFjaXR5IGZvciBzaXplIFVURjE2IGNoYXJhY3RlcnMgcGx1cyBhIHRlcm1pbmF0b3IuCisgKgorICogXHBhcmFtW2luXSBmYWN0b3J5IC0gUG9pbnRlciB0byB0aGUgc3RyaW5nIGZhY3RvcnkgdGhhdCBvd25zIHN0cmluZ3MKKyAqIFxwYXJhbVtpbl0gc2l6ZSAtIEluIGNoYXJhY3RlcnMgKGNvdW50IGRvdWJsZSBmb3Igc3Vycm9nYXRlIHBhaXJzISEhKQorICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBuZXcgc3RyaW5nLgorICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgCituZXdTaXplVVRGMTYJKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSwgQU5UTFIzX1VJTlQzMiBzaXplKQoreworICAgIHBBTlRMUjNfU1RSSU5HICBzdHJpbmc7CisKKyAgICBzdHJpbmcgID0gZmFjdG9yeS0+bmV3UmF3KGZhY3RvcnkpOworCisgICAgaWYJKHN0cmluZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuCXN0cmluZzsKKyAgICB9CisKKyAgICAvKiBBbHdheXMgYWRkIG9uZSBtb3JlIGJ5dGUgZm9yIGEgdGVybWluYXRvciA7LSkKKyAgICAqLwkKKyAgICBzdHJpbmctPmNoYXJzCT0gKHBBTlRMUjNfVUlOVDgpIEFOVExSM19NQUxMT0MoKHNpemVfdCkoc2l6ZW9mKEFOVExSM19VSU5UMTYpICogKHNpemUrMSkpKTsKKyAgICAqKHN0cmluZy0+Y2hhcnMpCT0gJ1wwJzsKKyAgICBzdHJpbmctPnNpemUJPSBzaXplKzE7CS8qIFNpemUgaXMgYWx3YXlzIGluIGNoYXJhY3RlcnMsIGFzIGlzIGxlbiAqLworCisgICAgcmV0dXJuIHN0cmluZzsKK30KKworLyoqIENyZWF0ZXMgYSBuZXcgOCBiaXQgc3RyaW5nIGluaXRpYWxpemVkIHdpdGggdGhlIDggYml0IGNoYXJhY3RlcnMgYXQgdGhlIAorICogIHN1cHBsaWVkIHB0ciwgb2YgcHJlLWRldGVybWluZWQgc2l6ZS4KKyAqIFxwYXJhbVtpbl0gZmFjdG9yeSAtIFBvaW50ZXIgdG8gdGhlIHN0cmluZyBmYWN0b3J5IHRoYXQgb3ducyB0aGUgc3RyaW5ncworICogXHBhcmFtW2luXSBwdHIgLSBQb2ludGVyIHRvIDggYml0IGVuY29kZWQgY2hhcmFjdGVycworICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBuZXcgc3RyaW5nCisgKi8KK3N0YXRpYyAgICBwQU5UTFIzX1NUUklORyAgICAKK25ld1B0cjgJKHBBTlRMUjNfU1RSSU5HX0ZBQ1RPUlkgZmFjdG9yeSwgcEFOVExSM19VSU5UOCBwdHIsIEFOVExSM19VSU5UMzIgc2l6ZSkKK3sKKwlwQU5UTFIzX1NUUklORyAgc3RyaW5nOworCisJc3RyaW5nICA9IGZhY3RvcnktPm5ld1NpemUoZmFjdG9yeSwgc2l6ZSk7CisKKwlpZgkoc3RyaW5nID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwlpZgkoc2l6ZSA8PSAwKQorCXsKKwkJcmV0dXJuCXN0cmluZzsKKwl9CisKKwlpZgkocHRyICE9IE5VTEwpCisJeworCQlBTlRMUjNfTUVNTU9WRShzdHJpbmctPmNoYXJzLCAoY29uc3Qgdm9pZCAqKXB0ciwgc2l6ZSk7CisJCSooc3RyaW5nLT5jaGFycyArIHNpemUpID0gJ1wwJzsJICAgIC8qIFRlcm1pbmF0ZSwgdGhlc2Ugc3RyaW5ncyBhcmUgdXN1YWxseSB1c2VkIGZvciBUb2tlbiBzdHJlYW1zIGFuZCBwcmludGluZyBldGMuCSovCisJCXN0cmluZy0+bGVuID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gIHN0cmluZzsKK30KKworLyoqIENyZWF0ZXMgYSBuZXcgVVRGMTYgc3RyaW5nIGluaXRpYWxpemVkIHdpdGggdGhlIDggYml0IGNoYXJhY3RlcnMgYXQgdGhlIAorICogIHN1cHBsaWVkIDggYml0IGNoYXJhY3RlciBwdHIsIG9mIHByZS1kZXRlcm1pbmVkIHNpemUuCisgKiBccGFyYW1baW5dIGZhY3RvcnkgLSBQb2ludGVyIHRvIHRoZSBzdHJpbmcgZmFjdG9yeSB0aGF0IG93bnMgdGhlIHN0cmluZ3MKKyAqIFxwYXJhbVtpbl0gcHRyIC0gUG9pbnRlciB0byA4IGJpdCBlbmNvZGVkIGNoYXJhY3RlcnMKKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3IHN0cmluZworICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgCituZXdQdHJVVEYxNl84CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggcHRyLCBBTlRMUjNfVUlOVDMyIHNpemUpCit7CisJcEFOVExSM19TVFJJTkcgIHN0cmluZzsKKworCS8qIG5ld1NpemUgYWNjZXB0cyBzaXplIGluIGNoYXJhY3RlcnMsIG5vdCBieXRlcworCSovCisJc3RyaW5nICA9IGZhY3RvcnktPm5ld1NpemUoZmFjdG9yeSwgc2l6ZSk7CisKKwlpZgkoc3RyaW5nID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwlpZgkoc2l6ZSA8PSAwKQorCXsKKwkJcmV0dXJuCXN0cmluZzsKKwl9CisKKwlpZgkocHRyICE9IE5VTEwpCisJeworCQlwQU5UTFIzX1VJTlQxNglvdXQ7CisJCUFOVExSM19JTlQzMiAgICBpblNpemU7CisKKwkJb3V0ID0gKHBBTlRMUjNfVUlOVDE2KShzdHJpbmctPmNoYXJzKTsKKwkJaW5TaXplCT0gc2l6ZTsKKworCQl3aGlsZQkoaW5TaXplLS0gPiAwKQorCQl7CisJCQkqb3V0KysgPSAoQU5UTFIzX1VJTlQxNikoKnB0cisrKTsKKwkJfQorCisJCS8qIFRlcm1pbmF0ZSwgdGhlc2Ugc3RyaW5ncyBhcmUgdXN1YWxseSB1c2VkIGZvciBUb2tlbiBzdHJlYW1zIGFuZCBwcmludGluZyBldGMuCQorCQkqLworCQkqKCgocEFOVExSM19VSU5UMTYpKHN0cmluZy0+Y2hhcnMpKSArIHNpemUpID0gJ1wwJzsKKworCQlzdHJpbmctPmxlbiA9IHNpemU7CisJfQorCisJcmV0dXJuICBzdHJpbmc7Cit9CisKKy8qKiBDcmVhdGVzIGEgbmV3IFVURjE2IHN0cmluZyBpbml0aWFsaXplZCB3aXRoIHRoZSBVVEYxNiBjaGFyYWN0ZXJzIGF0IHRoZSAKKyAqICBzdXBwbGllZCBwdHIsIG9mIHByZS1kZXRlcm1pbmVkIHNpemUuCisgKiBccGFyYW1baW5dIGZhY3RvcnkgLSBQb2ludGVyIHRvIHRoZSBzdHJpbmcgZmFjdG9yeSB0aGF0IG93bnMgdGhlIHN0cmluZ3MKKyAqIFxwYXJhbVtpbl0gcHRyIC0gUG9pbnRlciB0byBVVEYxNiBlbmNvZGVkIGNoYXJhY3RlcnMKKyAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3IHN0cmluZworICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgCituZXdQdHJVVEYxNl9VVEYxNgkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1VJTlQ4IHB0ciwgQU5UTFIzX1VJTlQzMiBzaXplKQoreworCXBBTlRMUjNfU1RSSU5HICBzdHJpbmc7CisKKwlzdHJpbmcgID0gZmFjdG9yeS0+bmV3U2l6ZShmYWN0b3J5LCBzaXplKTsKKworCWlmCShzdHJpbmcgPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCWlmCShzaXplIDw9IDApCisJeworCQlyZXR1cm4Jc3RyaW5nOworCX0KKworCWlmCShwdHIgIT0gTlVMTCkKKwl7CisJCUFOVExSM19NRU1NT1ZFKHN0cmluZy0+Y2hhcnMsIChjb25zdCB2b2lkICopcHRyLCAoc2l6ZSAqIHNpemVvZihBTlRMUjNfVUlOVDE2KSkpOworCisJCS8qIFRlcm1pbmF0ZSwgdGhlc2Ugc3RyaW5ncyBhcmUgdXN1YWxseSB1c2VkIGZvciBUb2tlbiBzdHJlYW1zIGFuZCBwcmludGluZyBldGMuCQorCQkqLworCQkqKCgocEFOVExSM19VSU5UMTYpKHN0cmluZy0+Y2hhcnMpKSArIHNpemUpID0gJ1wwJzsJICAgIAorCQlzdHJpbmctPmxlbiA9IHNpemU7CisJfQorCisJcmV0dXJuICBzdHJpbmc7Cit9CisKKy8qKiBDcmVhdGUgYSBuZXcgOCBiaXQgc3RyaW5nIGZyb20gdGhlIHN1cHBsaWVkLCBudWxsIHRlcm1pbmF0ZWQsIDggYml0IHN0cmluZyBwb2ludGVyLgorICogXHBhcmFtW2luXSBmYWN0b3J5IC0gUG9pbnRlciB0byB0aGUgc3RyaW5nIGZhY3RvcnkgdGhhdCBvd25zIHN0cmluZ3MuCisgKiBccGFyYW1baW5dIHB0ciAtIFBvaW50ZXIgdG8gdGhlIDggYml0IGVuY29kZWQgc3RyaW5nCisgKiBccmV0dXJuIFBvaW50ZXIgdG8gdGhlIG5ld2x5IGluaXRpYWxpemVkIHN0cmluZworICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgCituZXdTdHI4CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggcHRyKQoreworICAgIHJldHVybiBmYWN0b3J5LT5uZXdQdHI4KGZhY3RvcnksIHB0ciwgKEFOVExSM19VSU5UMzIpc3RybGVuKChjb25zdCBjaGFyICopcHRyKSk7Cit9CisKKy8qKiBDcmVhdGUgYSBuZXcgVVRGMTYgc3RyaW5nIGZyb20gdGhlIHN1cHBsaWVkLCBudWxsIHRlcm1pbmF0ZWQsIDggYml0IHN0cmluZyBwb2ludGVyLgorICogXHBhcmFtW2luXSBmYWN0b3J5IC0gUG9pbnRlciB0byB0aGUgc3RyaW5nIGZhY3RvcnkgdGhhdCBvd25zIHN0cmluZ3MuCisgKiBccGFyYW1baW5dIHB0ciAtIFBvaW50ZXIgdG8gdGhlIDggYml0IGVuY29kZWQgc3RyaW5nCisgKiBccmV0dXJuIFBPaW50ZXIgdG8gdGhlIG5ld2x5IGluaXRpYWxpemVkIHN0cmluZworICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgCituZXdTdHJVVEYxNl84CShwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfVUlOVDggcHRyKQoreworICAgIHJldHVybiBmYWN0b3J5LT5uZXdQdHI4KGZhY3RvcnksIHB0ciwgKEFOVExSM19VSU5UMzIpc3RybGVuKChjb25zdCBjaGFyICopcHRyKSk7Cit9CisKKy8qKiBDcmVhdGUgYSBuZXcgVVRGMTYgc3RyaW5nIGZyb20gdGhlIHN1cHBsaWVkLCBudWxsIHRlcm1pbmF0ZWQsIFVURjE2IHN0cmluZyBwb2ludGVyLgorICogXHBhcmFtW2luXSBmYWN0b3J5IC0gUG9pbnRlciB0byB0aGUgc3RyaW5nIGZhY3RvcnkgdGhhdCBvd25zIHN0cmluZ3MuCisgKiBccGFyYW1baW5dIHB0ciAtIFBvaW50ZXIgdG8gdGhlIFVURjE2IGVuY29kZWQgc3RyaW5nCisgKiBccmV0dXJuIFBvaW50ZXIgdG8gdGhlIG5ld2x5IGluaXRpYWxpemVkIHN0cmluZworICovCitzdGF0aWMgICAgcEFOVExSM19TVFJJTkcgICAgCituZXdTdHJVVEYxNl9VVEYxNgkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1VJTlQ4IHB0cikKK3sKKyAgICBwQU5UTFIzX1VJTlQxNiAgaW47CisgICAgQU5UTFIzX1VJTlQzMiAgIGNvdW50OworCisgICAgLyoqIEZpcnN0LCBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICovCisgICAgaW4JICAgID0gKHBBTlRMUjNfVUlOVDE2KXB0cjsKKyAgICBjb3VudCAgID0gMDsKKworICAgIHdoaWxlICAgKCppbisrICE9ICdcMCcpCisgICAgeworCQljb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gZmFjdG9yeS0+bmV3UHRyKGZhY3RvcnksIHB0ciwgY291bnQpOworfQorCitzdGF0aWMgICAgdm9pZAkJICAgIAorZGVzdHJveQkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1NUUklORyBzdHJpbmcpCit7CisgICAgLy8gUmVjb3JkIHdoaWNoIHN0cmluZyB3ZSBhcmUgZGVsZXRpbmcKKyAgICAvLworICAgIEFOVExSM19VSU5UMzIgc3RySW5kZXggPSBzdHJpbmctPmluZGV4OworICAgIAorICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgd2FzIG5vdCBmYWN0b3J5IG1hZGUsIG9yIHdlIHdvdWxkIHRyeQorICAgIC8vIHRvIGRlbGV0ZSBtZW1vcnkgdGhhdCB3YXNuJ3QgYWxsb2NhdGVkIG91dHNpZGUgdGhlIGZhY3RvcnkKKyAgICAvLyBibG9jay4KKyAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmljIGluZGV4ZWQgc3RyaW5nIGZyb20gdGhlIHZlY3RvcgorICAgIC8vCisgICAgZmFjdG9yeS0+c3RyaW5ncy0+ZGVsKGZhY3RvcnktPnN0cmluZ3MsIHN0ckluZGV4KTsKKworICAgIC8vIE9uZSBsZXNzIHN0cmluZyBpbiB0aGUgdmVjdG9yLCBzbyBkZWNyZW1lbnQgdGhlIGZhY3RvcnkgaW5kZXgKKyAgICAvLyBzbyB0aGF0IHRoZSBuZXh0IHN0cmluZyBhbGxvY2F0ZWQgaXMgaW5kZXhlZCBjb3JyZWN0bHkgd2l0aAorICAgIC8vIHJlc3BlY3QgdG8gdGhlIHZlY3Rvci4KKyAgICAvLworICAgIGZhY3RvcnktPmluZGV4LS07CisKKyAgICAvLyBOb3cgd2UgaGF2ZSB0byByZWluZGV4IHRoZSBzdHJpbmdzIGluIHRoZSB2ZWN0b3IgdGhhdCBmb2xsb3dlZAorICAgIC8vIHRoZSBvbmUgd2UganVzdCBkZWxldGVkLiBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIG9uZSB3ZSBqdXN0IGRlbGV0ZWQKKyAgICAvLyB3YXMgbm90IHRoZSBsYXN0IG9uZS4KKyAgICAvLworICAgIGlmICAoc3RySW5kZXg8IGZhY3RvcnktPmluZGV4KQorICAgIHsKKyAgICAgICAgLy8gV2UgbXVzdCByZWluZGV4IHRoZSBzdHJpbmdzIGFmdGVyIHRoZSBvbmUgd2UganVzdCBkZWxldGVkLgorICAgICAgICAvLyBUaGUgb25lIHRoYXQgZm9sbG93cyB0aGUgb25lIHdlIGp1c3QgZGVsZXRlZCBpcyBhbHNvIG91dAorICAgICAgICAvLyBvZiB3aGFjaywgc28gd2Ugc3RhcnQgdGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIEFOVExSM19VSU5UMzIgaTsKKworICAgICAgICBmb3IgKGkgPSBzdHJJbmRleDsgaSA8IGZhY3RvcnktPmluZGV4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlbnVtYmVyIHRoZSBlbnRyeQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICgocEFOVExSM19TVFJJTkcpKGZhY3RvcnktPnN0cmluZ3MtPmVsZW1lbnRzW2ldLmVsZW1lbnQpKS0+aW5kZXggPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIHN0cmluZyBoYXMgYmVlbiBkZXN0cm95ZWQgYW5kIHRoZSBlbGVtZW50cyBvZiB0aGUgZmFjdG9yeSBhcmUgcmVpbmRleGVkLgorICAgIC8vCisKK30KKworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIAorcHJpbnRhYmxlOChwQU5UTFIzX1NUUklOR19GQUNUT1JZIGZhY3RvcnksIHBBTlRMUjNfU1RSSU5HIGluc3RyKQoreworICAgIHBBTlRMUjNfU1RSSU5HICBzdHJpbmc7CisgICAgCisgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBiZSB0b28gZWZmaWNpZW50IGhlcmUsIHRoaXMgaXMgbW9zdGx5IGZvciBlcnJvciBtZXNzYWdlcyBhbmQgc28gb24uCisgICAgICovCisgICAgcEFOVExSM19VSU5UOCAgIHNjYW5uZWRUZXh0OworICAgIEFOVExSM19VSU5UMzIgICBpOworCisgICAgLyogQXNzdW1lIHdlIG5lZWQgYXMgbXVjaCBhcyB0d2ljZSBhcyBtdWNoIHNwYWNlIHRvIHBhcnNlIG91dCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICovCisgICAgc3RyaW5nICA9IGZhY3RvcnktPm5ld1NpemUoZmFjdG9yeSwgaW5zdHItPmxlbiAqMiArIDEpOworCisgICAgLyogU2NhbiB0aHJvdWdoIGFuZCByZXBsYWNlIHVucHJpbnRhYmxlIChpbiB0ZXJtcyBvZiB0aGlzIHJvdXRpbmUpCisgICAgICogY2hhcmFjdGVycworICAgICAqLworICAgIHNjYW5uZWRUZXh0ID0gc3RyaW5nLT5jaGFyczsKKworICAgIGZvcgkoaSA9IDA7IGkgPCBpbnN0ci0+bGVuOyBpKyspCisgICAgeworCQlpZiAoKihpbnN0ci0+Y2hhcnMgKyBpKSA9PSAnXG4nKQorCQl7CisJCQkqc2Nhbm5lZFRleHQrKyA9ICdcXCc7CisJCQkqc2Nhbm5lZFRleHQrKyA9ICduJzsKKwkJfQorCQllbHNlIGlmICgqKGluc3RyLT5jaGFycyArIGkpID09ICdccicpCisJCXsKKwkJCSpzY2FubmVkVGV4dCsrID0gJ1xcJzsKKwkJCSpzY2FubmVkVGV4dCsrID0gJ3InOworCQl9CisJCWVsc2UgaWYJKCFpc3ByaW50KCooaW5zdHItPmNoYXJzICtpKSkpCisJCXsKKwkJCSpzY2FubmVkVGV4dCsrID0gJz8nOworCQl9CisJCWVsc2UKKwkJeworCQkJKnNjYW5uZWRUZXh0KysgPSAqKGluc3RyLT5jaGFycyArIGkpOworCQl9CisgICAgfQorICAgICpzY2FubmVkVGV4dCAgPSAnXDAnOworCisgICAgc3RyaW5nLT5sZW4JPSAoQU5UTFIzX1VJTlQzMikoc2Nhbm5lZFRleHQgLSBzdHJpbmctPmNoYXJzKTsKKyAgICAKKyAgICByZXR1cm4gIHN0cmluZzsKK30KKworc3RhdGljICAgIHBBTlRMUjNfU1RSSU5HICAgIAorcHJpbnRhYmxlVVRGMTYocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5LCBwQU5UTFIzX1NUUklORyBpbnN0cikKK3sKKyAgICBwQU5UTFIzX1NUUklORyAgc3RyaW5nOworICAgIAorICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gYmUgdG9vIGVmZmljaWVudCBoZXJlLCB0aGlzIGlzIG1vc3RseSBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIHNvIG9uLgorICAgICAqLworICAgIHBBTlRMUjNfVUlOVDE2ICBzY2FubmVkVGV4dDsKKyAgICBwQU5UTFIzX1VJTlQxNiAgaW5UZXh0OworICAgIEFOVExSM19VSU5UMzIgICBpOworICAgIEFOVExSM19VSU5UMzIgICBvdXRMZW47CisKKyAgICAvKiBBc3N1bWUgd2UgbmVlZCBhcyBtdWNoIGFzIHR3aWNlIGFzIG11Y2ggc3BhY2UgdG8gcGFyc2Ugb3V0IHRoZSBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBzdHJpbmcgID0gZmFjdG9yeS0+bmV3U2l6ZShmYWN0b3J5LCBpbnN0ci0+bGVuICoyICsgMSk7CisKKyAgICAvKiBTY2FuIHRocm91Z2ggYW5kIHJlcGxhY2UgdW5wcmludGFibGUgKGluIHRlcm1zIG9mIHRoaXMgcm91dGluZSkKKyAgICAgKiBjaGFyYWN0ZXJzCisgICAgICovCisgICAgc2Nhbm5lZFRleHQgPSAocEFOVExSM19VSU5UMTYpKHN0cmluZy0+Y2hhcnMpOworICAgIGluVGV4dAk9IChwQU5UTFIzX1VJTlQxNikoaW5zdHItPmNoYXJzKTsKKyAgICBvdXRMZW4JPSAwOworCisgICAgZm9yCShpID0gMDsgaSA8IGluc3RyLT5sZW47IGkrKykKKyAgICB7CisJCWlmICgqKGluVGV4dCArIGkpID09ICdcbicpCisJCXsKKwkJCSpzY2FubmVkVGV4dCsrICAgPSAnXFwnOworCQkJKnNjYW5uZWRUZXh0KysgICA9ICduJzsKKwkJCW91dExlbgkgICAgKz0gMjsKKwkJfQorCQllbHNlIGlmICgqKGluVGV4dCArIGkpID09ICdccicpCisJCXsKKwkJCSpzY2FubmVkVGV4dCsrICAgPSAnXFwnOworCQkJKnNjYW5uZWRUZXh0KysgICA9ICdyJzsKKwkJCW91dExlbgkgICAgKz0gMjsKKwkJfQorCQllbHNlIGlmCSghaXNwcmludCgqKGluVGV4dCAraSkpKQorCQl7CisJCQkqc2Nhbm5lZFRleHQrKyA9ICc/JzsKKwkJCW91dExlbisrOworCQl9CisJCWVsc2UKKwkJeworCQkJKnNjYW5uZWRUZXh0KysgPSAqKGluVGV4dCArIGkpOworCQkJb3V0TGVuKys7CisJCX0KKyAgICB9CisgICAgKnNjYW5uZWRUZXh0ICA9ICdcMCc7CisKKyAgICBzdHJpbmctPmxlbgk9IG91dExlbjsKKyAgICAKKyAgICByZXR1cm4gIHN0cmluZzsKK30KKworLyoqIEZhc2Npc3QgQ2FwaXRhbGlzdCBQaWcgZnVuY3Rpb24gY3JlYXRlZAorICogIHRvIG9wcHJlc3MgdGhlIHdvcmtlcnMgY29tcmFkZS4KKyAqLworc3RhdGljICAgIHZvaWQJCSAgICAKK2Nsb3NlRmFjdG9yeQkocEFOVExSM19TVFJJTkdfRkFDVE9SWSBmYWN0b3J5KQoreworICAgIC8qIERlbGV0ZSB0aGUgdmVjdG9yIHdlIHdlcmUgdHJhY2tpbmcgdGhlIHN0cmluZ3Mgd2l0aCwgdGhpcyB3aWxsCisgICAgICogY2F1c2VzIGFsbCB0aGUgYWxsb2NhdGVkIHN0cmluZ3MgdG8gYmUgZGVhbGxvY2F0ZWQgdG9vCisgICAgICovCisgICAgZmFjdG9yeS0+c3RyaW5ncy0+ZnJlZShmYWN0b3J5LT5zdHJpbmdzKTsKKworICAgIC8qIERlbGV0ZSB0aGUgc3BhY2UgZm9yIHRoZSBmYWN0b3J5IGl0c2VsZgorICAgICAqLworICAgIEFOVExSM19GUkVFKCh2b2lkICopZmFjdG9yeSk7Cit9CisKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4ICAgCithcHBlbmQ4CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIGNvbnN0IGNoYXIgKiBuZXdiaXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiBsZW47CisKKyAgICBsZW4JPSAoQU5UTFIzX1VJTlQzMilzdHJsZW4obmV3Yml0KTsKKworICAgIGlmCShzdHJpbmctPnNpemUgPCAoc3RyaW5nLT5sZW4gKyBsZW4gKyAxKSkKKyAgICB7CisJCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikoc3RyaW5nLT5sZW4gKyBsZW4gKyAxKSk7CisJCXN0cmluZy0+c2l6ZQk9IHN0cmluZy0+bGVuICsgbGVuICsgMTsKKyAgICB9CisKKyAgICAvKiBOb3RlIHdlIGNvcHkgb25lIG1vcmUgYnl0ZSB0aGFuIHRoZSBzdHJsZW4gaW4gb3JkZXIgdG8gZ2V0IHRoZSB0cmFpbGluZworICAgICAqLworICAgIEFOVExSM19NRU1NT1ZFKCh2b2lkICopKHN0cmluZy0+Y2hhcnMgKyBzdHJpbmctPmxlbiksIG5ld2JpdCwgKEFOVExSM19VSU5UMzIpKGxlbisxKSk7CisgICAgc3RyaW5nLT5sZW4JKz0gbGVuOworCisgICAgcmV0dXJuIHN0cmluZy0+Y2hhcnM7Cit9CisKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4ICAgCithcHBlbmRVVEYxNl84CShwQU5UTFIzX1NUUklORyBzdHJpbmcsIGNvbnN0IGNoYXIgKiBuZXdiaXQpCit7CisgICAgQU5UTFIzX1VJTlQzMiAgIGxlbjsKKyAgICBwQU5UTFIzX1VJTlQxNiAgYXBQb2ludDsKKyAgICBBTlRMUjNfVUlOVDMyICAgY291bnQ7CisKKyAgICBsZW4JPSAoQU5UTFIzX1VJTlQzMilzdHJsZW4obmV3Yml0KTsKKworICAgIGlmCShzdHJpbmctPnNpemUgPCAoc3RyaW5nLT5sZW4gKyBsZW4gKyAxKSkKKyAgICB7CisJCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikoKHNpemVvZihBTlRMUjNfVUlOVDE2KSooc3RyaW5nLT5sZW4gKyBsZW4gKyAxKSkpKTsKKwkJc3RyaW5nLT5zaXplCT0gc3RyaW5nLT5sZW4gKyBsZW4gKyAxOworICAgIH0KKworICAgIGFwUG9pbnQgPSAoKHBBTlRMUjNfVUlOVDE2KXN0cmluZy0+Y2hhcnMpICsgc3RyaW5nLT5sZW47CisgICAgc3RyaW5nLT5sZW4JKz0gbGVuOworCisgICAgZm9yCShjb3VudCA9IDA7IGNvdW50IDwgbGVuOyBjb3VudCsrKQorICAgIHsKKwkJKmFwUG9pbnQrKyAgID0gKihuZXdiaXQgKyBjb3VudCk7CisgICAgfQorICAgICphcFBvaW50ID0gJ1wwJzsKKworICAgIHJldHVybiBzdHJpbmctPmNoYXJzOworfQorCitzdGF0aWMgICAgcEFOVExSM19VSU5UOCAgIAorYXBwZW5kVVRGMTZfVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIG5ld2JpdCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyIGxlbjsKKyAgICBwQU5UTFIzX1VJTlQxNiAgaW47CisKKyAgICAvKiogRmlyc3QsIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJpbmcKKyAgICAgKi8KKyAgICBpbgkgICAgPSAocEFOVExSM19VSU5UMTYpbmV3Yml0OworICAgIGxlbiAgID0gMDsKKworICAgIHdoaWxlICAgKCppbisrICE9ICdcMCcpCisgICAgeworCQlsZW4rKzsKKyAgICB9CisKKyAgICBpZgkoc3RyaW5nLT5zaXplIDwgKHN0cmluZy0+bGVuICsgbGVuICsgMSkpCisgICAgeworCQlzdHJpbmctPmNoYXJzCT0gKHBBTlRMUjNfVUlOVDgpIEFOVExSM19SRUFMTE9DKCh2b2lkICopc3RyaW5nLT5jaGFycywgKEFOVExSM19VSU5UMzIpKCBzaXplb2YoQU5UTFIzX1VJTlQxNikgKihzdHJpbmctPmxlbiArIGxlbiArIDEpICkpOworCQlzdHJpbmctPnNpemUJPSBzdHJpbmctPmxlbiArIGxlbiArIDE7CisgICAgfQorCisgICAgLyogTm90ZSB3ZSBjb3B5IG9uZSBtb3JlIGJ5dGUgdGhhbiB0aGUgc3RybGVuIGluIG9yZGVyIHRvIGdldCB0aGUgdHJhaWxpbmcgZGVsaW1pdGVyCisgICAgICovCisgICAgQU5UTFIzX01FTU1PVkUoKHZvaWQgKikoKChwQU5UTFIzX1VJTlQxNilzdHJpbmctPmNoYXJzKSArIHN0cmluZy0+bGVuKSwgbmV3Yml0LCAoQU5UTFIzX1VJTlQzMikoc2l6ZW9mKEFOVExSM19VSU5UMTYpKihsZW4rMSkpKTsKKyAgICBzdHJpbmctPmxlbgkrPSBsZW47CisKKyAgICByZXR1cm4gc3RyaW5nLT5jaGFyczsKK30KKworc3RhdGljICAgIHBBTlRMUjNfVUlOVDggICAKK3NldDgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIGNoYXJzKQoreworICAgIEFOVExSM19VSU5UMzIJbGVuOworCisgICAgbGVuID0gKEFOVExSM19VSU5UMzIpc3RybGVuKGNoYXJzKTsKKyAgICBpZgkoc3RyaW5nLT5zaXplIDwgbGVuICsgMSkKKyAgICB7CisJCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikobGVuICsgMSkpOworCQlzdHJpbmctPnNpemUJPSBsZW4gKyAxOworICAgIH0KKworICAgIC8qIE5vdGUgd2UgY29weSBvbmUgbW9yZSBieXRlIHRoYW4gdGhlIHN0cmxlbiBpbiBvcmRlciB0byBnZXQgdGhlIHRyYWlsaW5nICdcMCcKKyAgICAgKi8KKyAgICBBTlRMUjNfTUVNTU9WRSgodm9pZCAqKShzdHJpbmctPmNoYXJzKSwgY2hhcnMsIChBTlRMUjNfVUlOVDMyKShsZW4rMSkpOworICAgIHN0cmluZy0+bGVuCSAgICA9IGxlbjsKKworICAgIHJldHVybiAgc3RyaW5nLT5jaGFyczsKKworfQorCitzdGF0aWMgICAgcEFOVExSM19VSU5UOCAgIAorc2V0VVRGMTZfOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBjb25zdCBjaGFyICogY2hhcnMpCit7CisgICAgQU5UTFIzX1VJTlQzMglsZW47CisgICAgQU5UTFIzX1VJTlQzMgljb3VudDsKKyAgICBwQU5UTFIzX1VJTlQxNglhcFBvaW50OworCisgICAgbGVuID0gKEFOVExSM19VSU5UMzIpc3RybGVuKGNoYXJzKTsKKyAgICBpZgkoc3RyaW5nLT5zaXplIDwgbGVuICsgMSkKKwl7CisJCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikoc2l6ZW9mKEFOVExSM19VSU5UMTYpKihsZW4gKyAxKSkpOworCQlzdHJpbmctPnNpemUJPSBsZW4gKyAxOworICAgIH0KKyAgICBhcFBvaW50ID0gKChwQU5UTFIzX1VJTlQxNilzdHJpbmctPmNoYXJzKTsKKyAgICBzdHJpbmctPmxlbgk9IGxlbjsKKworICAgIGZvcgkoY291bnQgPSAwOyBjb3VudCA8IHN0cmluZy0+bGVuOyBjb3VudCsrKQorICAgIHsKKwkJKmFwUG9pbnQrKyAgID0gKihjaGFycyArIGNvdW50KTsKKyAgICB9CisgICAgKmFwUG9pbnQgPSAnXDAnOworCisgICAgcmV0dXJuICBzdHJpbmctPmNoYXJzOworfQorCitzdGF0aWMgICAgcEFOVExSM19VSU5UOCAgIAorc2V0VVRGMTZfVVRGMTYgICAgKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIGNoYXJzKQoreworICAgIEFOVExSM19VSU5UMzIgICBsZW47CisgICAgcEFOVExSM19VSU5UMTYgIGluOworCisgICAgLyoqIEZpcnN0LCBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICovCisgICAgaW4JICAgID0gKHBBTlRMUjNfVUlOVDE2KWNoYXJzOworICAgIGxlbiAgID0gMDsKKworICAgIHdoaWxlICAgKCppbisrICE9ICdcMCcpCisgICAgeworCQlsZW4rKzsKKyAgICB9CisKKyAgICBpZgkoc3RyaW5nLT5zaXplIDwgbGVuICsgMSkKKyAgICB7CisJCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikoc2l6ZW9mKEFOVExSM19VSU5UMTYpKihsZW4gKyAxKSkpOworCQlzdHJpbmctPnNpemUJPSBsZW4gKyAxOworICAgIH0KKworICAgIC8qIE5vdGUgd2UgY29weSBvbmUgbW9yZSBieXRlIHRoYW4gdGhlIHN0cmxlbiBpbiBvcmRlciB0byBnZXQgdGhlIHRyYWlsaW5nICdcMCcKKyAgICAgKi8KKyAgICBBTlRMUjNfTUVNTU9WRSgodm9pZCAqKShzdHJpbmctPmNoYXJzKSwgY2hhcnMsIChBTlRMUjNfVUlOVDMyKSgobGVuKzEpICogc2l6ZW9mKEFOVExSM19VSU5UMTYpKSk7CisgICAgc3RyaW5nLT5sZW4JICAgID0gbGVuOworCisgICAgcmV0dXJuICBzdHJpbmctPmNoYXJzOworCit9CisKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4ICAgCithZGRjOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIGMpCit7CisgICAgaWYJKHN0cmluZy0+c2l6ZSA8IHN0cmluZy0+bGVuICsgMikKKyAgICB7CisJCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikoc3RyaW5nLT5sZW4gKyAyKSk7CisJCXN0cmluZy0+c2l6ZQk9IHN0cmluZy0+bGVuICsgMjsKKyAgICB9CisgICAgKihzdHJpbmctPmNoYXJzICsgc3RyaW5nLT5sZW4pCT0gKEFOVExSM19VSU5UOCljOworICAgICooc3RyaW5nLT5jaGFycyArIHN0cmluZy0+bGVuICsgMSkJPSAnXDAnOworICAgIHN0cmluZy0+bGVuKys7CisKKyAgICByZXR1cm4gIHN0cmluZy0+Y2hhcnM7Cit9CisKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4ICAgCithZGRjVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBjKQoreworICAgIHBBTlRMUjNfVUlOVDE2ICBwdHI7CisKKyAgICBpZgkoc3RyaW5nLT5zaXplIDwgc3RyaW5nLT5sZW4gKyAyKQorICAgIHsKKwkJc3RyaW5nLT5jaGFycwk9IChwQU5UTFIzX1VJTlQ4KSBBTlRMUjNfUkVBTExPQygodm9pZCAqKXN0cmluZy0+Y2hhcnMsIChBTlRMUjNfVUlOVDMyKShzaXplb2YoQU5UTFIzX1VJTlQxNikgKiAoc3RyaW5nLT5sZW4gKyAyKSkpOworCQlzdHJpbmctPnNpemUJPSBzdHJpbmctPmxlbiArIDI7CisgICAgfQorICAgIHB0cgk9IChwQU5UTFIzX1VJTlQxNikoc3RyaW5nLT5jaGFycyk7CisKKyAgICAqKHB0ciArIHN0cmluZy0+bGVuKQk9IChBTlRMUjNfVUlOVDE2KWM7CisgICAgKihwdHIgKyBzdHJpbmctPmxlbiArIDEpCT0gJ1wwJzsKKyAgICBzdHJpbmctPmxlbisrOworCisgICAgcmV0dXJuICBzdHJpbmctPmNoYXJzOworfQorCitzdGF0aWMgICAgcEFOVExSM19VSU5UOCAgIAorYWRkaTgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX0lOVDMyIGkpCit7CisgICAgQU5UTFIzX1VJTlQ4CSAgICBuZXdiaXRbMzJdOworCisgICAgc3ByaW50ZigoY2hhciAqKW5ld2JpdCwgIiVkIiwgaSk7CisKKyAgICByZXR1cm4gIHN0cmluZy0+YXBwZW5kOChzdHJpbmcsIChjb25zdCBjaGFyICopbmV3Yml0KTsKK30KK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4ICAgCithZGRpVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX0lOVDMyIGkpCit7CisgICAgQU5UTFIzX1VJTlQ4CSAgICBuZXdiaXRbMzJdOworCisgICAgc3ByaW50ZigoY2hhciAqKW5ld2JpdCwgIiVkIiwgaSk7CisKKyAgICByZXR1cm4gIHN0cmluZy0+YXBwZW5kOChzdHJpbmcsIChjb25zdCBjaGFyICopbmV3Yml0KTsKK30KKworc3RhdGljCSAgcEFOVExSM19VSU5UOAoraW5zZXJ0aTggICAgKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgQU5UTFIzX0lOVDMyIGkpCit7CisgICAgQU5UTFIzX1VJTlQ4CSAgICBuZXdiaXRbMzJdOworCisgICAgc3ByaW50ZigoY2hhciAqKW5ld2JpdCwgIiVkIiwgaSk7CisgICAgcmV0dXJuICBzdHJpbmctPmluc2VydDgoc3RyaW5nLCBwb2ludCwgKGNvbnN0IGNoYXIgKiluZXdiaXQpOworfQorc3RhdGljCSAgcEFOVExSM19VSU5UOAoraW5zZXJ0aVVURjE2ICAgIChwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgcG9pbnQsIEFOVExSM19JTlQzMiBpKQoreworICAgIEFOVExSM19VSU5UOAkgICAgbmV3Yml0WzMyXTsKKworICAgIHNwcmludGYoKGNoYXIgKiluZXdiaXQsICIlZCIsIGkpOworICAgIHJldHVybiAgc3RyaW5nLT5pbnNlcnQ4KHN0cmluZywgcG9pbnQsIChjb25zdCBjaGFyICopbmV3Yml0KTsKK30KKworc3RhdGljCXBBTlRMUjNfVUlOVDgKK2luc2VydDgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgY29uc3QgY2hhciAqIG5ld2JpdCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyCWxlbjsKKworICAgIGlmCShwb2ludCA+PSBzdHJpbmctPmxlbikKKyAgICB7CisJCXJldHVybglzdHJpbmctPmFwcGVuZChzdHJpbmcsIG5ld2JpdCk7CisgICAgfQorIAorICAgIGxlbgk9IChBTlRMUjNfVUlOVDMyKXN0cmxlbihuZXdiaXQpOworCisgICAgaWYJKGxlbiA9PSAwKQorICAgIHsKKwkJcmV0dXJuCXN0cmluZy0+Y2hhcnM7CisgICAgfQorCisgICAgaWYJKHN0cmluZy0+c2l6ZSA8IChzdHJpbmctPmxlbiArIGxlbiArIDEpKQorICAgIHsKKwkJc3RyaW5nLT5jaGFycwk9IChwQU5UTFIzX1VJTlQ4KSBBTlRMUjNfUkVBTExPQygodm9pZCAqKXN0cmluZy0+Y2hhcnMsIChBTlRMUjNfVUlOVDMyKShzdHJpbmctPmxlbiArIGxlbiArIDEpKTsKKwkJc3RyaW5nLT5zaXplCT0gc3RyaW5nLT5sZW4gKyBsZW4gKyAxOworICAgIH0KKworICAgIC8qIE1vdmUgdGhlIGNoYXJhY3RlcnMgd2UgYXJlIGluc2VydGluZyBiZWZvcmUsIGluY2x1ZGluZyB0aGUgZGVsaW1pdGVyCisgICAgICovCisgICAgQU5UTFIzX01FTU1PVkUoKHZvaWQgKikoc3RyaW5nLT5jaGFycyArIHBvaW50ICsgbGVuKSwgKHZvaWQgKikoc3RyaW5nLT5jaGFycyArIHBvaW50KSwgKEFOVExSM19VSU5UMzIpKHN0cmluZy0+bGVuIC0gcG9pbnQgKyAxKSk7CisKKyAgICAvKiBOb3RlIHdlIGNvcHkgdGhlIGV4YWN0IG51bWJlciBvZiBieXRlcworICAgICAqLworICAgIEFOVExSM19NRU1NT1ZFKCh2b2lkICopKHN0cmluZy0+Y2hhcnMgKyBwb2ludCksIG5ld2JpdCwgKEFOVExSM19VSU5UMzIpKGxlbikpOworICAgIAorICAgIHN0cmluZy0+bGVuICs9IGxlbjsKKworICAgIHJldHVybiAgc3RyaW5nLT5jaGFyczsKK30KKworc3RhdGljCXBBTlRMUjNfVUlOVDgKK2luc2VydFVURjE2XzgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgY29uc3QgY2hhciAqIG5ld2JpdCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyCWxlbjsKKyAgICBBTlRMUjNfVUlOVDMyCWNvdW50OworICAgIHBBTlRMUjNfVUlOVDE2CWluUG9pbnQ7CisKKyAgICBpZgkocG9pbnQgPj0gc3RyaW5nLT5sZW4pCisgICAgeworCQlyZXR1cm4Jc3RyaW5nLT5hcHBlbmQ4KHN0cmluZywgbmV3Yml0KTsKKyAgICB9CisgCisgICAgbGVuCT0gKEFOVExSM19VSU5UMzIpc3RybGVuKG5ld2JpdCk7CisKKyAgICBpZgkobGVuID09IDApCisgICAgeworCQlyZXR1cm4Jc3RyaW5nLT5jaGFyczsKKyAgICB9CisKKyAgICBpZgkoc3RyaW5nLT5zaXplIDwgKHN0cmluZy0+bGVuICsgbGVuICsgMSkpCisgICAgeworCXN0cmluZy0+Y2hhcnMJPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX1JFQUxMT0MoKHZvaWQgKilzdHJpbmctPmNoYXJzLCAoQU5UTFIzX1VJTlQzMikoc2l6ZW9mKEFOVExSM19VSU5UMTYpKihzdHJpbmctPmxlbiArIGxlbiArIDEpKSk7CisJc3RyaW5nLT5zaXplCT0gc3RyaW5nLT5sZW4gKyBsZW4gKyAxOworICAgIH0KKworICAgIC8qIE1vdmUgdGhlIGNoYXJhY3RlcnMgd2UgYXJlIGluc2VydGluZyBiZWZvcmUsIGluY2x1ZGluZyB0aGUgZGVsaW1pdGVyCisgICAgICovCisgICAgQU5UTFIzX01FTU1PVkUoKHZvaWQgKikoKChwQU5UTFIzX1VJTlQxNilzdHJpbmctPmNoYXJzKSArIHBvaW50ICsgbGVuKSwgKHZvaWQgKikoKChwQU5UTFIzX1VJTlQxNilzdHJpbmctPmNoYXJzKSArIHBvaW50KSwgKEFOVExSM19VSU5UMzIpKHNpemVvZihBTlRMUjNfVUlOVDE2KSooc3RyaW5nLT5sZW4gLSBwb2ludCArIDEpKSk7CisKKyAgICBzdHJpbmctPmxlbiArPSBsZW47CisgICAgCisgICAgaW5Qb2ludCA9ICgocEFOVExSM19VSU5UMTYpKHN0cmluZy0+Y2hhcnMpKStwb2ludDsKKyAgICBmb3IJKGNvdW50ID0gMDsgY291bnQ8bGVuOyBjb3VudCsrKQorICAgIHsKKwkJKihpblBvaW50ICsgY291bnQpID0gKEFOVExSM19VSU5UMTYpKCoobmV3Yml0K2NvdW50KSk7CisgICAgfQorCisgICAgcmV0dXJuICBzdHJpbmctPmNoYXJzOworfQorCitzdGF0aWMJcEFOVExSM19VSU5UOAoraW5zZXJ0VVRGMTZfVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgY29uc3QgY2hhciAqIG5ld2JpdCkKK3sKKyAgICBBTlRMUjNfVUlOVDMyCWxlbjsKKyAgICBwQU5UTFIzX1VJTlQxNglpbjsKKworICAgIGlmCShwb2ludCA+PSBzdHJpbmctPmxlbikKKyAgICB7CisJCXJldHVybglzdHJpbmctPmFwcGVuZChzdHJpbmcsIG5ld2JpdCk7CisgICAgfQorIAorICAgIC8qKiBGaXJzdCwgZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmluZworICAgICAqLworICAgIGluCSAgICA9IChwQU5UTFIzX1VJTlQxNiluZXdiaXQ7CisgICAgbGVuCSAgICA9IDA7CisKKyAgICB3aGlsZSAgICgqaW4rKyAhPSAnXDAnKQorICAgIHsKKwkJbGVuKys7CisgICAgfQorCisgICAgaWYJKGxlbiA9PSAwKQorICAgIHsKKwkJcmV0dXJuCXN0cmluZy0+Y2hhcnM7CisgICAgfQorCisgICAgaWYJKHN0cmluZy0+c2l6ZSA8IChzdHJpbmctPmxlbiArIGxlbiArIDEpKQorICAgIHsKKwkJc3RyaW5nLT5jaGFycwk9IChwQU5UTFIzX1VJTlQ4KSBBTlRMUjNfUkVBTExPQygodm9pZCAqKXN0cmluZy0+Y2hhcnMsIChBTlRMUjNfVUlOVDMyKShzaXplb2YoQU5UTFIzX1VJTlQxNikqKHN0cmluZy0+bGVuICsgbGVuICsgMSkpKTsKKwkJc3RyaW5nLT5zaXplCT0gc3RyaW5nLT5sZW4gKyBsZW4gKyAxOworICAgIH0KKworICAgIC8qIE1vdmUgdGhlIGNoYXJhY3RlcnMgd2UgYXJlIGluc2VydGluZyBiZWZvcmUsIGluY2x1ZGluZyB0aGUgZGVsaW1pdGVyCisgICAgICovCisgICAgQU5UTFIzX01FTU1PVkUoKHZvaWQgKikoKChwQU5UTFIzX1VJTlQxNilzdHJpbmctPmNoYXJzKSArIHBvaW50ICsgbGVuKSwgKHZvaWQgKikoKChwQU5UTFIzX1VJTlQxNilzdHJpbmctPmNoYXJzKSArIHBvaW50KSwgKEFOVExSM19VSU5UMzIpKHNpemVvZihBTlRMUjNfVUlOVDE2KSooc3RyaW5nLT5sZW4gLSBwb2ludCArIDEpKSk7CisKKworICAgIC8qIE5vdGUgd2UgY29weSB0aGUgZXhhY3QgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBBTlRMUjNfTUVNTU9WRSgodm9pZCAqKSgoKHBBTlRMUjNfVUlOVDE2KXN0cmluZy0+Y2hhcnMpICsgcG9pbnQpLCBuZXdiaXQsIChBTlRMUjNfVUlOVDMyKShzaXplb2YoQU5UTFIzX1VJTlQxNikqKGxlbikpKTsKKyAgICAKKyAgICBzdHJpbmctPmxlbiArPSBsZW47CisKKyAgICByZXR1cm4gIHN0cmluZy0+Y2hhcnM7Cit9CisKK3N0YXRpYyAgICBwQU5UTFIzX1VJTlQ4CSAgICBzZXRTCShwQU5UTFIzX1NUUklORyBzdHJpbmcsIHBBTlRMUjNfU1RSSU5HIGNoYXJzKQoreworICAgIHJldHVybiAgc3RyaW5nLT5zZXQoc3RyaW5nLCAoY29uc3QgY2hhciAqKShjaGFycy0+Y2hhcnMpKTsKK30KKworc3RhdGljICAgIHBBTlRMUjNfVUlOVDgJICAgIGFwcGVuZFMJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgcEFOVExSM19TVFJJTkcgbmV3Yml0KQoreworICAgIC8qIFdlIG1heSBiZSBwYXNzZWQgYW4gZW1wdHkgc3RyaW5nLCBpbiB3aGljaCBjYXNlIHdlIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHBvaW50ZXIKKyAgICAgKi8KKyAgICBpZgkobmV3Yml0ID09IE5VTEwgfHwgbmV3Yml0LT5sZW4gPT0gMCB8fCBuZXdiaXQtPnNpemUgPT0gMCB8fCBuZXdiaXQtPmNoYXJzID09IE5VTEwpCisgICAgeworCQlyZXR1cm4Jc3RyaW5nLT5jaGFyczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkJcmV0dXJuICBzdHJpbmctPmFwcGVuZChzdHJpbmcsIChjb25zdCBjaGFyICopKG5ld2JpdC0+Y2hhcnMpKTsKKyAgICB9Cit9CisKK3N0YXRpYwkgIHBBTlRMUjNfVUlOVDgJICAgIGluc2VydFMJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBwb2ludCwgcEFOVExSM19TVFJJTkcgbmV3Yml0KQoreworICAgIHJldHVybiAgc3RyaW5nLT5pbnNlcnQoc3RyaW5nLCBwb2ludCwgKGNvbnN0IGNoYXIgKikobmV3Yml0LT5jaGFycykpOworfQorCisvKiBGdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHRoZSB0ZXh0IG9mIGEgc3RyaW5nIHRvIHRoZSBzdXBwbGllZAorICogOCBiaXQgY2hhcmFjdGVyIHN0cmluZyBhbmQgcmV0dXJucyBhIHJlc3VsdCBhIGxhIHN0cmNtcCgpCisgKi8KK3N0YXRpYyBBTlRMUjNfVUlOVDMyICAgCitjb21wYXJlOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBjb25zdCBjaGFyICogY29tcFN0cikKK3sKKyAgICByZXR1cm4gIHN0cmNtcCgoY29uc3QgY2hhciAqKShzdHJpbmctPmNoYXJzKSwgY29tcFN0cik7Cit9CisKKy8qIEZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdGhlIHRleHQgb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3VwcGxpZWQgY2hhcmFjdGVyIHN0cmluZworICogKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHN0cmluZyBpdHNlbGYpIGFuZCByZXR1cm5zIGEgcmVzdWx0CisgKiBhIGxhIHN0cmNtcCgpCisgKi8KK3N0YXRpYyBBTlRMUjNfVUlOVDMyICAgCitjb21wYXJlVVRGMTZfOAkocEFOVExSM19TVFJJTkcgc3RyaW5nLCBjb25zdCBjaGFyICogY29tcFN0cikKK3sKKyAgICBwQU5UTFIzX1VJTlQxNiAgb3VyU3RyaW5nOworICAgIEFOVExSM19VSU5UMzIgICBjaGFyRGlmZjsKKworICAgIG91clN0cmluZwk9IChwQU5UTFIzX1VJTlQxNikoc3RyaW5nLT5jaGFycyk7CisKKyAgICB3aGlsZSAgICgoKEFOVExSM19VQ0hBUikoKm91clN0cmluZykgIT0gJ1wwJykgJiYgKChBTlRMUjNfVUNIQVIpKCpjb21wU3RyKSAhPSAnXDAnKSkKKyAgICB7CisJCWNoYXJEaWZmID0gKm91clN0cmluZyAtICpjb21wU3RyOworCQlpZiAgKGNoYXJEaWZmICE9IDApCisJCXsKKwkJCXJldHVybiBjaGFyRGlmZjsKKwkJfQorCQlvdXJTdHJpbmcrKzsKKwkJY29tcFN0cisrOworICAgIH0KKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9uZSBvZiB0aGUgc3RyaW5ncyB3YXMgdGVybWluYXRlZAorICAgICAqLworICAgIHJldHVybiAoQU5UTFIzX1VJTlQzMikoKEFOVExSM19VQ0hBUikoKm91clN0cmluZykgLSAoQU5UTFIzX1VDSEFSKSgqY29tcFN0cikpOworCit9CisKKy8qIEZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdGhlIHRleHQgb2YgYSBzdHJpbmcgd2l0aCB0aGUgc3VwcGxpZWQgY2hhcmFjdGVyIHN0cmluZworICogKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHN0cmluZyBpdHNlbGYpIGFuZCByZXR1cm5zIGEgcmVzdWx0CisgKiBhIGxhIHN0cmNtcCgpCisgKi8KK3N0YXRpYyBBTlRMUjNfVUlOVDMyICAgCitjb21wYXJlVVRGMTZfVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgY29uc3QgY2hhciAqIGNvbXBTdHI4KQoreworICAgIHBBTlRMUjNfVUlOVDE2ICBvdXJTdHJpbmc7CisgICAgcEFOVExSM19VSU5UMTYgIGNvbXBTdHI7CisgICAgQU5UTFIzX1VJTlQzMiAgIGNoYXJEaWZmOworCisgICAgb3VyU3RyaW5nCT0gKHBBTlRMUjNfVUlOVDE2KShzdHJpbmctPmNoYXJzKTsKKyAgICBjb21wU3RyCT0gKHBBTlRMUjNfVUlOVDE2KShjb21wU3RyOCk7CisKKyAgICB3aGlsZSAgICgoKEFOVExSM19VQ0hBUikoKm91clN0cmluZykgIT0gJ1wwJykgJiYgKChBTlRMUjNfVUNIQVIpKCooKHBBTlRMUjNfVUlOVDE2KWNvbXBTdHIpKSAhPSAnXDAnKSkKKyAgICB7CisJCWNoYXJEaWZmID0gKm91clN0cmluZyAtICpjb21wU3RyOworCQlpZiAgKGNoYXJEaWZmICE9IDApCisJCXsKKwkJCXJldHVybiBjaGFyRGlmZjsKKwkJfQorCQlvdXJTdHJpbmcrKzsKKwkJY29tcFN0cisrOworICAgIH0KKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9uZSBvZiB0aGUgc3RyaW5ncyB3YXMgdGVybWluYXRlZAorICAgICAqLworICAgIHJldHVybiAoQU5UTFIzX1VJTlQzMikoKEFOVExSM19VQ0hBUikoKm91clN0cmluZykgLSAoQU5UTFIzX1VDSEFSKSgqY29tcFN0cikpOworfQorCisvKiBGdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHRoZSB0ZXh0IG9mIGEgc3RyaW5nIHdpdGggdGhlIHN1cHBsaWVkIHN0cmluZworICogKHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhlIHN0cmluZyBpdHNlbGYpIGFuZCByZXR1cm5zIGEgcmVzdWx0CisgKiBhIGxhIHN0cmNtcCgpCisgKi8KK3N0YXRpYyBBTlRMUjNfVUlOVDMyICAgCitjb21wYXJlUyAgICAocEFOVExSM19TVFJJTkcgc3RyaW5nLCBwQU5UTFIzX1NUUklORyBjb21wU3RyKQoreworICAgIHJldHVybiAgc3RyaW5nLT5jb21wYXJlKHN0cmluZywgKGNvbnN0IGNoYXIgKiljb21wU3RyLT5jaGFycyk7Cit9CisKKworLyogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXhlZCBhdCB0aGUgc3VwcGxpZWQKKyAqIG9mZnNldCBhcyBhIDMyIGJpdCBjaGFyYWN0ZXIuCisgKi8KK3N0YXRpYyBBTlRMUjNfVUNIQVIgICAgCitjaGFyQXQ4CSAgICAocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIG9mZnNldCkKK3sKKyAgICBpZgkob2Zmc2V0ID4gc3RyaW5nLT5sZW4pCisgICAgeworCQlyZXR1cm4gKEFOVExSM19VQ0hBUiknXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlyZXR1cm4gIChBTlRMUjNfVUNIQVIpKCooc3RyaW5nLT5jaGFycyArIG9mZnNldCkpOworICAgIH0KK30KKworLyogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaW5kZXhlZCBhdCB0aGUgc3VwcGxpZWQKKyAqIG9mZnNldCBhcyBhIDMyIGJpdCBjaGFyYWN0ZXIuCisgKi8KK3N0YXRpYyBBTlRMUjNfVUNIQVIgICAgCitjaGFyQXRVVEYxNiAgICAocEFOVExSM19TVFJJTkcgc3RyaW5nLCBBTlRMUjNfVUlOVDMyIG9mZnNldCkKK3sKKyAgICBpZgkob2Zmc2V0ID4gc3RyaW5nLT5sZW4pCisgICAgeworCQlyZXR1cm4gKEFOVExSM19VQ0hBUiknXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlyZXR1cm4gIChBTlRMUjNfVUNIQVIpKCooKHBBTlRMUjNfVUlOVDE2KShzdHJpbmctPmNoYXJzKSArIG9mZnNldCkpOworICAgIH0KK30KKworLyogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3Vic3RyaW5nIG9mIHRoZSBzdXBwbGllZCBzdHJpbmcgYSBsYSAuc3ViU3RyaW5nKHMsZSkKKyAqIGluIGphdmEgcnVudGltZXMuCisgKi8KK3N0YXRpYyBwQU5UTFIzX1NUUklORworc3ViU3RyaW5nOCAgIChwQU5UTFIzX1NUUklORyBzdHJpbmcsIEFOVExSM19VSU5UMzIgc3RhcnRJbmRleCwgQU5UTFIzX1VJTlQzMiBlbmRJbmRleCkKK3sKKyAgICBwQU5UTFIzX1NUUklORyBuZXdTdHI7CisKKyAgICBpZgkoZW5kSW5kZXggPiBzdHJpbmctPmxlbikKKyAgICB7CisJCWVuZEluZGV4ID0gc3RyaW5nLT5sZW4gKyAxOworICAgIH0KKyAgICBuZXdTdHIgID0gc3RyaW5nLT5mYWN0b3J5LT5uZXdQdHIoc3RyaW5nLT5mYWN0b3J5LCBzdHJpbmctPmNoYXJzICsgc3RhcnRJbmRleCwgZW5kSW5kZXggLSBzdGFydEluZGV4KTsKKworICAgIHJldHVybiBuZXdTdHI7Cit9CisKKy8qIFJldHVybnMgYSBzdWJzdHJpbmcgb2YgdGhlIHN1cHBsaWVkIHN0cmluZyBhIGxhIC5zdWJTdHJpbmcocyxlKQorICogaW4gamF2YSBydW50aW1lcy4KKyAqLworc3RhdGljIHBBTlRMUjNfU1RSSU5HCitzdWJTdHJpbmdVVEYxNiAgKHBBTlRMUjNfU1RSSU5HIHN0cmluZywgQU5UTFIzX1VJTlQzMiBzdGFydEluZGV4LCBBTlRMUjNfVUlOVDMyIGVuZEluZGV4KQoreworICAgIHBBTlRMUjNfU1RSSU5HIG5ld1N0cjsKKworICAgIGlmCShlbmRJbmRleCA+IHN0cmluZy0+bGVuKQorICAgIHsKKwkJZW5kSW5kZXggPSBzdHJpbmctPmxlbiArIDE7CisgICAgfQorICAgIG5ld1N0ciAgPSBzdHJpbmctPmZhY3RvcnktPm5ld1B0cihzdHJpbmctPmZhY3RvcnksIChwQU5UTFIzX1VJTlQ4KSgocEFOVExSM19VSU5UMTYpKHN0cmluZy0+Y2hhcnMpICsgc3RhcnRJbmRleCksIGVuZEluZGV4IC0gc3RhcnRJbmRleCk7CisKKyAgICByZXR1cm4gbmV3U3RyOworfQorCisvKiBGdW5jdGlvbiB0aGF0IGNhbiBjb252ZXJ0IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgdG8gYW4gaW50ZWdlcgorICovCitzdGF0aWMgQU5UTFIzX0lOVDMyCit0b0ludDMyXzgJICAgIChzdHJ1Y3QgQU5UTFIzX1NUUklOR19zdHJ1Y3QgKiBzdHJpbmcpCit7CisgICAgcmV0dXJuICBhdG9pKChjb25zdCBjaGFyICopKHN0cmluZy0+Y2hhcnMpKTsKK30KKworLyogRnVuY3Rpb24gdGhhdCBjYW4gY29udmVydCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHRvIGFuIGludGVnZXIKKyAqLworc3RhdGljIEFOVExSM19JTlQzMgordG9JbnQzMl9VVEYxNiAgICAgICAoc3RydWN0IEFOVExSM19TVFJJTkdfc3RydWN0ICogc3RyaW5nKQoreworICAgIHBBTlRMUjNfVUlOVDE2ICBpbnB1dDsKKyAgICBBTlRMUjNfSU5UMzIgICB2YWx1ZTsKKyAgICBBTlRMUjNfQk9PTEVBTiAgbmVnYXRlOworCisgICAgdmFsdWUgICA9IDA7CisgICAgaW5wdXQgICA9IChwQU5UTFIzX1VJTlQxNikoc3RyaW5nLT5jaGFycyk7CisgICAgbmVnYXRlICA9IEFOVExSM19GQUxTRTsKKworICAgIGlmCSgqaW5wdXQgPT0gKEFOVExSM19VQ0hBUiknLScpCisgICAgeworCQluZWdhdGUgPSBBTlRMUjNfVFJVRTsKKwkJaW5wdXQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoKmlucHV0ID09IChBTlRMUjNfVUNIQVIpJysnKQorICAgIHsKKwkJaW5wdXQrKzsKKyAgICB9CisKKyAgICB3aGlsZSAgICgqaW5wdXQgIT0gJ1wwJyAmJiBpc2RpZ2l0KCppbnB1dCkpCisgICAgeworCQl2YWx1ZQkgPSB2YWx1ZSAqIDEwOworCQl2YWx1ZQkrPSAoKEFOVExSM19VSU5UMzIpKCppbnB1dCkgLSAoQU5UTFIzX1VJTlQzMiknMCcpOworCQlpbnB1dCsrOworICAgIH0KKworICAgIHJldHVybiBuZWdhdGUgPyAtdmFsdWUgOiB2YWx1ZTsKK30KKworLyogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcG9pbnRlciB0byBhbiA4IGJpdCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcsCisgKiB3aGljaCBpbiB0aGlzIGNhc2UgaXMganVzdCB0aGUgc3RyaW5nIGFzIHRoaXMgaXMgCisgKiA4IGJpdCBlbmNvZGlpbmcgYW55d2F5LgorICovCitzdGF0aWMJICBwQU5UTFIzX1NUUklORwkgICAgdG84XzgJKHBBTlRMUjNfU1RSSU5HIHN0cmluZykKK3sKKyAgICByZXR1cm4gIHN0cmluZzsKK30KKworLyogRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIDggYml0IHZlcnNpb24gb2YgdGhlIHN0cmluZywKKyAqIHdoaWNoIGluIHRoaXMgY2FzZSBpcyByZXR1cm5pbmcgYWxsIHRoZSBVVEYxNiBjaGFyYWN0ZXJzCisgKiBuYXJyb3dlZCBiYWNrIGludG8gOCBiaXRzLCB3aXRoIGNoYXJhY3RlcnMgdGhhdCBhcmUgdG9vIGxhcmdlCisgKiByZXBsYWNlZCB3aXRoICdfJworICovCitzdGF0aWMJICBwQU5UTFIzX1NUUklORyAgICB0bzhfVVRGMTYJKHBBTlRMUjNfU1RSSU5HIHN0cmluZykKK3sKKwlwQU5UTFIzX1NUUklORyAgbmV3U3RyOworCUFOVExSM19VSU5UMzIgICBpOworCisJLyogQ3JlYXRlIGEgbmV3IDggYml0IHN0cmluZworCSovCisJbmV3U3RyICA9IG5ld1Jhdzgoc3RyaW5nLT5mYWN0b3J5KTsKKworCWlmCShuZXdTdHIgPT0gTlVMTCkKKwl7CisJCXJldHVybglOVUxMOworCX0KKworCS8qIEFsd2F5cyBhZGQgb25lIG1vcmUgYnl0ZSBmb3IgYSB0ZXJtaW5hdG9yCisJKi8KKwluZXdTdHItPmNoYXJzICAgPSAocEFOVExSM19VSU5UOCkgQU5UTFIzX01BTExPQygoc2l6ZV90KShzdHJpbmctPmxlbiArIDEpKTsKKwluZXdTdHItPnNpemUgICAgPSBzdHJpbmctPmxlbiArIDE7CisJbmV3U3RyLT5sZW4JICAgID0gc3RyaW5nLT5sZW47CisKKwkvKiBOb3cgY29weSBlYWNoIFVURjE2IGNoYXJBY3RlciAsIG1ha2luZyBpdCBhbiA4IGJpdCBjaGFyYWN0ZXIgb2YgCisJKiBzb21lIHNvcnQuCisJKi8KKwlmb3IJKGk9MDsgaTxzdHJpbmctPmxlbjsgaSsrKQorCXsKKwkJQU5UTFIzX1VDSEFSCWM7CisKKwkJYyA9ICooKChwQU5UTFIzX1VJTlQxNikoc3RyaW5nLT5jaGFycykpICsgaSk7CisKKwkJKihuZXdTdHItPmNoYXJzICsgaSkgPSAoQU5UTFIzX1VJTlQ4KShjID4gMjU1ID8gJ18nIDogYyk7CisJfQorCisJLyogVGVybWluYXRlCisJKi8KKwkqKG5ld1N0ci0+Y2hhcnMgKyBuZXdTdHItPmxlbikgPSAnXDAnOworCisJcmV0dXJuIG5ld1N0cjsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0Mvc3JjL2FudGxyM3Rva2Vuc3RyZWFtLmMgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjN0b2tlbnN0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDZmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjN0b2tlbnN0cmVhbS5jCkBAIC0wLDAgKzEsMTA5MSBAQAorLy8vIFxmaWxlIAorLy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQ29tbW9uVG9rZW5TdHJlYW0KKy8vLworCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKy8vIGh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb20KKy8vIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbmNsdWRlICAgIDxhbnRscjN0b2tlbnN0cmVhbS5oPgorCisjaWZkZWYJQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDAgKQorI2VuZGlmCisKKy8vIENPTU1PTl9UT0tFTl9TVFJFQU0gQVBJCisvLworc3RhdGljIHZvaWQJCXNldFRva2VuVHlwZUNoYW5uZWwgICAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gY3RzLCBBTlRMUjNfVUlOVDMyIHR0eXBlLCBBTlRMUjNfVUlOVDMyIGNoYW5uZWwpOworc3RhdGljIHZvaWQJCWRpc2NhcmRUb2tlblR5cGUgICAgICAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gY3RzLCBBTlRMUjNfSU5UMzIgdHR5cGUpOworc3RhdGljIHZvaWQJCWRpc2NhcmRPZmZDaGFubmVsICAgICAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gY3RzLCBBTlRMUjNfQk9PTEVBTiBkaXNjYXJkKTsKK3N0YXRpYyBwQU5UTFIzX1ZFQ1RPUglnZXRUb2tlbnMJICAgICAgICAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGN0cyk7CitzdGF0aWMgcEFOVExSM19MSVNUCWdldFRva2VuUmFuZ2UJICAgICAgICAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGN0cywgQU5UTFIzX1VJTlQzMiBzdGFydCwgQU5UTFIzX1VJTlQzMiBzdG9wKTsKK3N0YXRpYyBwQU5UTFIzX0xJU1QJZ2V0VG9rZW5zU2V0CSAgICAgICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHMsIEFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCwgcEFOVExSM19CSVRTRVQgdHlwZXMpOworc3RhdGljIHBBTlRMUjNfTElTVAlnZXRUb2tlbnNMaXN0CSAgICAgICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHMsIEFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCwgcEFOVExSM19MSVNUIGxpc3QpOworc3RhdGljIHBBTlRMUjNfTElTVAlnZXRUb2tlbnNUeXBlCSAgICAgICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHMsIEFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCwgQU5UTFIzX1VJTlQzMiB0eXBlKTsKK3N0YXRpYyB2b2lkICAgICAgICAgICAgIHJlc2V0ICAgICAgICAgICAgICAgICAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gY3RzKTsKKworLy8gVE9LRU5fU1RSRUFNIEFQSSAKKy8vCitzdGF0aWMgcEFOVExSM19DT01NT05fVE9LRU4gdG9rTFQJICAgICAgICAocEFOVExSM19UT0tFTl9TVFJFQU0gdHMsIEFOVExSM19JTlQzMiBrKTsKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTiBkYmdUb2tMVAkJKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzLCBBTlRMUjNfSU5UMzIgayk7CitzdGF0aWMgcEFOVExSM19DT01NT05fVE9LRU4gZ2V0CQkJKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzLCBBTlRMUjNfVUlOVDMyIGkpOworc3RhdGljIHBBTlRMUjNfVE9LRU5fU09VUkNFIGdldFRva2VuU291cmNlCShwQU5UTFIzX1RPS0VOX1NUUkVBTSB0cyk7CitzdGF0aWMgdm9pZAkJICAgIHNldFRva2VuU291cmNlCShwQU5UTFIzX1RPS0VOX1NUUkVBTSB0cywgcEFOVExSM19UT0tFTl9TT1VSQ0UgdG9rZW5Tb3VyY2UpOworc3RhdGljIHBBTlRMUjNfU1RSSU5HCSAgICB0b1N0cmluZwkJKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzKTsKK3N0YXRpYyBwQU5UTFIzX1NUUklORwkgICAgdG9TdHJpbmdTUwkJKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzLCBBTlRMUjNfVUlOVDMyIHN0YXJ0LCBBTlRMUjNfVUlOVDMyIHN0b3ApOworc3RhdGljIHBBTlRMUjNfU1RSSU5HCSAgICB0b1N0cmluZ1RUCQkocEFOVExSM19UT0tFTl9TVFJFQU0gdHMsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0YXJ0LCBwQU5UTFIzX0NPTU1PTl9UT0tFTiBzdG9wKTsKK3N0YXRpYyB2b2lkCQkgICAgc2V0RGVidWdMaXN0ZW5lcgkocEFOVExSM19UT0tFTl9TVFJFQU0gdHMsIHBBTlRMUjNfREVCVUdfRVZFTlRfTElTVEVORVIgZGVidWdnZXIpOworCisvLyBJTlQgU1RSRUFNIEFQSQorLy8KK3N0YXRpYyB2b2lkCQkgICAgY29uc3VtZQkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljIHZvaWQJCSAgICBkYmdDb25zdW1lCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgX0xBCQkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBpKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCSAgICBkYmdMQQkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBpKTsKK3N0YXRpYyBBTlRMUjNfTUFSS0VSCSAgICBtYXJrCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMgQU5UTFIzX01BUktFUgkgICAgZGJnTWFyawkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljIHZvaWQJCSAgICByZWxlYXNlCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBtYXJrKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCSAgICBzaXplCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMgQU5UTFIzX01BUktFUgkgICAgdGluZGV4CQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcyk7CitzdGF0aWMgdm9pZAkJICAgIHJld2luZFN0cmVhbQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBtYXJrZXIpOworc3RhdGljIHZvaWQJCSAgICBkYmdSZXdpbmRTdHJlYW0JCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19NQVJLRVIgbWFya2VyKTsKK3N0YXRpYyB2b2lkCQkgICAgcmV3aW5kTGFzdAkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljIHZvaWQJCSAgICBkYmdSZXdpbmRMYXN0CQkocEFOVExSM19JTlRfU1RSRUFNIGlzKTsKK3N0YXRpYyB2b2lkCQkgICAgc2VlawkJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19NQVJLRVIgaW5kZXgpOworc3RhdGljIHZvaWQJCSAgICBkYmdTZWVrCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBpbmRleCk7CitzdGF0aWMgcEFOVExSM19TVFJJTkcJICAgIGdldFNvdXJjZU5hbWUJCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpOworc3RhdGljIHZvaWQJCSAgICBhbnRscjNUb2tlblN0cmVhbUZyZWUJKHBBTlRMUjNfVE9LRU5fU1RSRUFNCSAgICBzdHJlYW0pOworc3RhdGljIHZvaWQJCSAgICBhbnRscjNDVFNGcmVlCQkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNICAgIHN0cmVhbSk7CisKKy8vIEhlbHBlcnMKKy8vCitzdGF0aWMgdm9pZAkJICAgIGZpbGxCdWZmZXIJCQkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtKTsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyCSAgICBza2lwT2ZmVG9rZW5DaGFubmVscwkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfSU5UMzIgaSk7CitzdGF0aWMgQU5UTFIzX1VJTlQzMgkgICAgc2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlIChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gdG9rZW5TdHJlYW0sIEFOVExSM19JTlQzMiBpKTsKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTiBMQgkJCQkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfSU5UMzIgaSk7CisKK0FOVExSM19BUEkgcEFOVExSM19UT0tFTl9TVFJFQU0KK2FudGxyM1Rva2VuU3RyZWFtTmV3KCkKK3sKKyAgICBwQU5UTFIzX1RPS0VOX1NUUkVBTSBzdHJlYW07CisKKyAgICAvLyBNZW1vcnkgZm9yIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlCisgICAgLy8KKyAgICBzdHJlYW0gID0gKHBBTlRMUjNfVE9LRU5fU1RSRUFNKSBBTlRMUjNfTUFMTE9DKHNpemVvZihBTlRMUjNfVE9LRU5fU1RSRUFNKSk7CisKKyAgICBpZgkoc3RyZWFtID09IE5VTEwpCisgICAgeworCQlyZXR1cm4JTlVMTDsKKyAgICB9CisKKyAgICAvLyBJbnN0YWxsIGJhc2ljIEFQSSAKKyAgICAvLworICAgIHN0cmVhbS0+ZnJlZSAgICA9ICBhbnRscjNUb2tlblN0cmVhbUZyZWU7CisKKyAgICAKKyAgICByZXR1cm4gc3RyZWFtOworfQorCitzdGF0aWMgdm9pZAorYW50bHIzVG9rZW5TdHJlYW1GcmVlKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHN0cmVhbSkKK3sgICAKKyAgICBBTlRMUjNfRlJFRShzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZAkJICAgIAorYW50bHIzQ1RTRnJlZQkgICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBzdHJlYW0pCit7CisJLy8gV2Ugb25seSBmcmVlIHVwIG91ciBzdWJvcmRpbmF0ZSBpbnRlcmZhY2VzIGlmIHRoZXkgYmVsb25nCisJLy8gdG8gdXMsIG90aGVyd2lzZSB3ZSBsZXQgd2hvZXZlciBvd25zIHRoZW0gZGVhbCB3aXRoIHRoZW0uCisJLy8KKwlpZgkoc3RyZWFtLT50c3RyZWFtLT5zdXBlciA9PSBzdHJlYW0pCisJeworCQlpZgkoc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zdXBlciA9PSBzdHJlYW0tPnRzdHJlYW0pCisJCXsKKwkJCXN0cmVhbS0+dHN0cmVhbS0+aXN0cmVhbS0+ZnJlZShzdHJlYW0tPnRzdHJlYW0tPmlzdHJlYW0pOworCQkJc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtID0gTlVMTDsKKwkJfQorCQlzdHJlYW0tPnRzdHJlYW0tPmZyZWUoc3RyZWFtLT50c3RyZWFtKTsKKwl9CisKKwkvLyBOb3cgd2UgZnJlZSBvdXIgb3duIHJlc291cmNlcworCS8vCisJaWYJKHN0cmVhbS0+dG9rZW5zICE9IE5VTEwpCisJeworCQlzdHJlYW0tPnRva2Vucy0+ZnJlZShzdHJlYW0tPnRva2Vucyk7CisJCXN0cmVhbS0+dG9rZW5zCT0gTlVMTDsKKwl9CisJaWYJKHN0cmVhbS0+ZGlzY2FyZFNldCAhPSBOVUxMKQorCXsKKwkJc3RyZWFtLT5kaXNjYXJkU2V0LT5mcmVlKHN0cmVhbS0+ZGlzY2FyZFNldCk7CisJCXN0cmVhbS0+ZGlzY2FyZFNldCAgPSBOVUxMOworCX0KKwlpZgkoc3RyZWFtLT5jaGFubmVsT3ZlcnJpZGVzICE9IE5VTEwpCisJeworCQlzdHJlYW0tPmNoYW5uZWxPdmVycmlkZXMtPmZyZWUoc3RyZWFtLT5jaGFubmVsT3ZlcnJpZGVzKTsKKwkJc3RyZWFtLT5jaGFubmVsT3ZlcnJpZGVzID0gTlVMTDsKKwl9CisKKwkvLyBGcmVlIG91ciBtZW1vcnkgbm93CisJLy8KKwlBTlRMUjNfRlJFRShzdHJlYW0pOworfQorCisvLyBSZXNldCBhIHRva2VuIHN0cmVhbSBzbyBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhbmQgY2FuIHJldXNlIGl0J3MKKy8vIHJlc291cmNlcy4KKy8vCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAKK3Jlc2V0ICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHMpCit7CisKKyAgICAvLyBGcmVlIGFueSByZXNvdXJjZXMgdGhhdCBhciBtb3N0IGxpa2Ugc3BlY2lmYyB0byB0aGUKKyAgICAvLyBydW4gd2UganVzdCBkaWQuCisgICAgLy8KKyAgICBpZgkoY3RzLT5kaXNjYXJkU2V0ICE9IE5VTEwpCisgICAgeworICAgICAgICBjdHMtPmRpc2NhcmRTZXQtPmZyZWUoY3RzLT5kaXNjYXJkU2V0KTsKKyAgICAgICAgY3RzLT5kaXNjYXJkU2V0ICA9IE5VTEw7CisgICAgfQorICAgIGlmCShjdHMtPmNoYW5uZWxPdmVycmlkZXMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGN0cy0+Y2hhbm5lbE92ZXJyaWRlcy0+ZnJlZShjdHMtPmNoYW5uZWxPdmVycmlkZXMpOworICAgICAgICBjdHMtPmNoYW5uZWxPdmVycmlkZXMgPSBOVUxMOworICAgIH0KKworICAgIC8vIE5vdywgaWYgdGhlcmUgd2VyZSBhbnkgZXhpc3RpbmcgdG9rZW5zIGluIHRoZSBzdHJlYW0sCisgICAgLy8gdGhlbiB3ZSBqdXN0IHJlc2V0IHRoZSB2ZWN0b3IgY291bnQgc28gdGhhdCBpdCBzdGFydHMKKyAgICAvLyBhZ2Fpbi4gV2UgbXVzdCB0cmF2ZXJzZSB0aGUgZW50cmllcyB1bmZvcnR1bmF0ZWx5IGFzCisgICAgLy8gdGhlcmUgbWF5IGJlIGZyZWUgcG9pbnRlcnMgZm9yIGN1c3RvbSB0b2tlbiB0eXBlcyBhbmQKKyAgICAvLyBzbyBvbi4gSG93ZXZlciB0aGF0IGlzIGp1c3QgYSBxdWljayBOVUxMIGNoZWNrIG9uIHRoZQorICAgIC8vIHZlY3RvciBlbnRyaWVzLgorICAgIC8vCisgICAgaWYJKGN0cy0+dG9rZW5zICE9IE5VTEwpCisgICAgeworICAgICAgICBjdHMtPnRva2Vucy0+Y2xlYXIoY3RzLT50b2tlbnMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBJbnN0YWxsIHRoZSB0b2tlbiB0cmFja2luZyB0YWJsZXMKKyAgICAgICAgICovCisgICAgICAgIGN0cy0+dG9rZW5zICA9IGFudGxyM1ZlY3Rvck5ldygwKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCB0byBkZWZhdWx0cworICAgIC8vCisgICAgY3RzLT5kaXNjYXJkT2ZmQ2hhbm5lbCAgPSBBTlRMUjNfRkFMU0U7CisgICAgY3RzLT5jaGFubmVsICAgICAgICAgICAgPSBBTlRMUjNfVE9LRU5fREVGQVVMVF9DSEFOTkVMOworICAgIGN0cy0+cAkgICAgICAgICAgICA9IC0xOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTQorYW50bHIzQ29tbW9uVG9rZW5EZWJ1Z1N0cmVhbVNvdXJjZU5ldyhBTlRMUjNfVUlOVDMyIGhpbnQsIHBBTlRMUjNfVE9LRU5fU09VUkNFIHNvdXJjZSwgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWJ1Z2dlcikKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0Jc3RyZWFtOworCisJLy8gQ3JlYXRlIGEgc3RhbmRhcmQgdG9rZW4gc3RyZWFtCisJLy8KKwlzdHJlYW0gPSBhbnRscjNDb21tb25Ub2tlblN0cmVhbVNvdXJjZU5ldyhoaW50LCBzb3VyY2UpOworCisJLy8gSW5zdGFsbCB0aGUgZGVidWdnZXIgb2JqZWN0CisJLy8KKwlzdHJlYW0tPnRzdHJlYW0tPmRlYnVnZ2VyID0gZGVidWdnZXI7CisKKwkvLyBPdmVycmlkZSBzdGFuZGFyZCB0b2tlbiBzdHJlYW0gbWV0aG9kcyB3aXRoIGRlYnVnZ2luZyB2ZXJzaW9ucworCS8vCisJc3RyZWFtLT50c3RyZWFtLT5pbml0aWFsU3RyZWFtU3RhdGUJPSBBTlRMUjNfRkFMU0U7CisKKwlzdHJlYW0tPnRzdHJlYW0tPl9MVAkJCQk9IGRiZ1Rva0xUOworCisJc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5jb25zdW1lCQk9IGRiZ0NvbnN1bWU7CisJc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5fTEEJCQk9IGRiZ0xBOworCXN0cmVhbS0+dHN0cmVhbS0+aXN0cmVhbS0+bWFyawkJCT0gZGJnTWFyazsKKwlzdHJlYW0tPnRzdHJlYW0tPmlzdHJlYW0tPnJld2luZAkJPSBkYmdSZXdpbmRTdHJlYW07CisJc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5yZXdpbmRMYXN0CT0gZGJnUmV3aW5kTGFzdDsKKwlzdHJlYW0tPnRzdHJlYW0tPmlzdHJlYW0tPnNlZWsJCQk9IGRiZ1NlZWs7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitBTlRMUjNfQVBJIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTQorYW50bHIzQ29tbW9uVG9rZW5TdHJlYW1Tb3VyY2VOZXcoQU5UTFIzX1VJTlQzMiBoaW50LCBwQU5UTFIzX1RPS0VOX1NPVVJDRSBzb3VyY2UpCit7CisgICAgcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNCXN0cmVhbTsKKworICAgIHN0cmVhbSA9IGFudGxyM0NvbW1vblRva2VuU3RyZWFtTmV3KGhpbnQpOworCisgICAgc3RyZWFtLT5jaGFubmVsID0gQU5UTFIzX1RPS0VOX0RFRkFVTFRfQ0hBTk5FTDsKKyAgICAKKyAgICBzdHJlYW0tPmNoYW5uZWxPdmVycmlkZXMJPSBOVUxMOworICAgIHN0cmVhbS0+ZGlzY2FyZFNldAkJPSBOVUxMOworICAgIHN0cmVhbS0+ZGlzY2FyZE9mZkNoYW5uZWwJPSBBTlRMUjNfRkFMU0U7CisKKyAgICBzdHJlYW0tPnRzdHJlYW0tPnNldFRva2VuU291cmNlKHN0cmVhbS0+dHN0cmVhbSwgc291cmNlKTsKKworICAgIHN0cmVhbS0+ZnJlZQkJPSAgYW50bHIzQ1RTRnJlZTsKKyAgICByZXR1cm4gIHN0cmVhbTsKK30KKworQU5UTFIzX0FQSSBwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0KK2FudGxyM0NvbW1vblRva2VuU3RyZWFtTmV3KEFOVExSM19VSU5UMzIgaGludCkKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gc3RyZWFtOworCisgICAgLyogTWVtb3J5IGZvciB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHN0cmVhbSAgPSAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNKSBBTlRMUjNfTUFMTE9DKHNpemVvZihBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSkpOworCisgICAgaWYJKHN0cmVhbSA9PSBOVUxMKQorICAgIHsKKwlyZXR1cm4JTlVMTDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgc3BhY2UgZm9yIHRoZSB0b2tlbiBzdHJlYW0gaW50ZXJmYWNlCisgICAgICovCisgICAgc3RyZWFtLT50c3RyZWFtCSAgICA9IGFudGxyM1Rva2VuU3RyZWFtTmV3KCk7CisgICAgc3RyZWFtLT50c3RyZWFtLT5zdXBlciAgPSAgc3RyZWFtOworCisgICAgLyogQ3JlYXRlIHNwYWNlIGZvciB0aGUgSU5UX1NUUkVBTSBpbnRlcmZhY2NlCisgICAgICovCisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtCQkgICAgPSAgYW50bHIzSW50U3RyZWFtTmV3KCk7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zdXBlcgkgICAgPSAgKHN0cmVhbS0+dHN0cmVhbSk7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT50eXBlCSAgICA9IEFOVExSM19UT0tFTlNUUkVBTTsKKworICAgIC8qIEluc3RhbGwgdGhlIHRva2VuIHRyYWNraW5nIHRhYmxlcworICAgICAqLworICAgIHN0cmVhbS0+dG9rZW5zICA9IGFudGxyM1ZlY3Rvck5ldygwKTsKKworICAgIC8qIERlZmF1bHRzCisgICAgICovCisgICAgc3RyZWFtLT5wCSAgICA9IC0xOworCisgICAgLyogSW5zdGFsbCB0aGUgY29tbW9uIHRva2VuIHN0cmVhbSBBUEkKKyAgICAgKi8KKyAgICBzdHJlYW0tPnNldFRva2VuVHlwZUNoYW5uZWwJICAgID0gc2V0VG9rZW5UeXBlQ2hhbm5lbDsKKyAgICBzdHJlYW0tPmRpc2NhcmRUb2tlblR5cGUJICAgID0gZGlzY2FyZFRva2VuVHlwZTsKKyAgICBzdHJlYW0tPmRpc2NhcmRPZmZDaGFubmVsVG9rcyAgID0gZGlzY2FyZE9mZkNoYW5uZWw7CisgICAgc3RyZWFtLT5nZXRUb2tlbnMJCSAgICA9IGdldFRva2VuczsKKyAgICBzdHJlYW0tPmdldFRva2VuUmFuZ2UJICAgID0gZ2V0VG9rZW5SYW5nZTsKKyAgICBzdHJlYW0tPmdldFRva2Vuc1NldAkgICAgPSBnZXRUb2tlbnNTZXQ7CisgICAgc3RyZWFtLT5nZXRUb2tlbnNMaXN0CSAgICA9IGdldFRva2Vuc0xpc3Q7CisgICAgc3RyZWFtLT5nZXRUb2tlbnNUeXBlCSAgICA9IGdldFRva2Vuc1R5cGU7CisgICAgc3RyZWFtLT5yZXNldCAgICAgICAgICAgICAgICAgICA9IHJlc2V0OworCisgICAgLyogSW5zdGFsbCB0aGUgdG9rZW4gc3RyZWFtIEFQSQorICAgICAqLworICAgIHN0cmVhbS0+dHN0cmVhbS0+X0xUCQkJPSAgdG9rTFQ7CisgICAgc3RyZWFtLT50c3RyZWFtLT5nZXQJCQk9ICBnZXQ7CisgICAgc3RyZWFtLT50c3RyZWFtLT5nZXRUb2tlblNvdXJjZQkgICAgICAgID0gIGdldFRva2VuU291cmNlOworICAgIHN0cmVhbS0+dHN0cmVhbS0+c2V0VG9rZW5Tb3VyY2UJICAgICAgICA9ICBzZXRUb2tlblNvdXJjZTsKKyAgICBzdHJlYW0tPnRzdHJlYW0tPnRvU3RyaW5nCQkgICAgICAgID0gIHRvU3RyaW5nOworICAgIHN0cmVhbS0+dHN0cmVhbS0+dG9TdHJpbmdTUwkJICAgICAgICA9ICB0b1N0cmluZ1NTOworICAgIHN0cmVhbS0+dHN0cmVhbS0+dG9TdHJpbmdUVAkJICAgICAgICA9ICB0b1N0cmluZ1RUOworICAgIHN0cmVhbS0+dHN0cmVhbS0+c2V0RGVidWdMaXN0ZW5lciAgICAgICAgICAgPSAgc2V0RGVidWdMaXN0ZW5lcjsKKworICAgIC8qIEluc3RhbGwgSU5UX1NUUkVBTSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBzdHJlYW0tPnRzdHJlYW0tPmlzdHJlYW0tPl9MQQk9ICBfTEE7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5tYXJrCT0gIG1hcms7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5yZWxlYXNlCT0gIHJlbGVhc2U7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zaXplCT0gIHNpemU7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5pbmRleAk9ICB0aW5kZXg7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5yZXdpbmQJPSAgcmV3aW5kU3RyZWFtOworICAgIHN0cmVhbS0+dHN0cmVhbS0+aXN0cmVhbS0+cmV3aW5kTGFzdD0gIHJld2luZExhc3Q7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zZWVrCT0gIHNlZWs7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5jb25zdW1lCT0gIGNvbnN1bWU7CisgICAgc3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5nZXRTb3VyY2VOYW1lID0gZ2V0U291cmNlTmFtZTsKKworICAgIHJldHVybiAgc3RyZWFtOworfQorCisvLyBJbnN0YWxsIGEgZGVidWcgbGlzdGVuZXIgYWRuIHN3aXRjaCB0byBkZWJ1ZyBtb2RlIG1ldGhvZHMKKy8vCitzdGF0aWMgdm9pZAkJCQkJCitzZXREZWJ1Z0xpc3RlbmVyCShwQU5UTFIzX1RPS0VOX1NUUkVBTSB0cywgcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUiBkZWJ1Z2dlcikKK3sKKwkJLy8gSW5zdGFsbCB0aGUgZGVidWdnZXIgb2JqZWN0CisJLy8KKwl0cy0+ZGVidWdnZXIgPSBkZWJ1Z2dlcjsKKworCS8vIE92ZXJyaWRlIHN0YW5kYXJkIHRva2VuIHN0cmVhbSBtZXRob2RzIHdpdGggZGVidWdnaW5nIHZlcnNpb25zCisJLy8KKwl0cy0+aW5pdGlhbFN0cmVhbVN0YXRlCT0gQU5UTFIzX0ZBTFNFOworCisJdHMtPl9MVAkJCQk9IGRiZ1Rva0xUOworCisJdHMtPmlzdHJlYW0tPmNvbnN1bWUJCT0gZGJnQ29uc3VtZTsKKwl0cy0+aXN0cmVhbS0+X0xBCQkJPSBkYmdMQTsKKwl0cy0+aXN0cmVhbS0+bWFyawkJCT0gZGJnTWFyazsKKwl0cy0+aXN0cmVhbS0+cmV3aW5kCQkJPSBkYmdSZXdpbmRTdHJlYW07CisJdHMtPmlzdHJlYW0tPnJld2luZExhc3QJCT0gZGJnUmV3aW5kTGFzdDsKKwl0cy0+aXN0cmVhbS0+c2VlawkJCT0gZGJnU2VlazsKK30KKworLyoqIEdldCB0aGUgaXRoIHRva2VuIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gMS4ubiB3aGVyZSBrPTEgaXMgdGhlCisqICBmaXJzdCBzeW1ib2wgb2YgbG9va2FoZWFkLgorKi8KK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTiAKK3Rva0xUICAocEFOVExSM19UT0tFTl9TVFJFQU0gdHMsIEFOVExSM19JTlQzMiBrKQoreworCUFOVExSM19JTlQzMiAgICBpOworCUFOVExSM19JTlQzMiAgICBuOworCXBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHM7CisKKwljdHMJICAgID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSl0cy0+c3VwZXI7CisKKyAgICAgICAgaWYJKGsgPCAwKQorCXsKKwkJcmV0dXJuIExCKGN0cywgLWspOworCX0KKworCWlmCShjdHMtPnAgPT0gLTEpCisJeworCQlmaWxsQnVmZmVyKGN0cyk7CisJfQorCisgICAgICAgIC8vIEhlcmUgd2UgdXNlZCB0byBjaGVjayBmb3IgayA9PSAwIGFuZCByZXR1cm4gMCwgYnV0IHRoaXMgc2VlbXMKKyAgICAgICAgLy8gYSBzdXBlcmZsdW91cyBjaGVjayB0byBtZS4gTFQoaz0wKSBpcyB0aGVyZWZvcmUganVzdCB1bmRlZmluZWQKKyAgICAgICAgLy8gYW5kIHdlIHdvbid0IHdhc3RlIHRoZSBjbG9jayBjeWNsZXMgb24gdGhlIGNoZWNrCisgICAgICAgIC8vCisKKwlpZgkoKGN0cy0+cCArIGsgLSAxKSA+PSAoQU5UTFIzX0lOVDMyKXRzLT5pc3RyZWFtLT5jYWNoZWRTaXplKQorCXsKKwkJcEFOVExSM19DT01NT05fVE9LRU4gICAgdGVvZiA9ICYodHMtPnRva2VuU291cmNlLT5lb2ZUb2tlbik7CisKKwkJdGVvZi0+c2V0U3RhcnRJbmRleCAodGVvZiwgdHMtPmlzdHJlYW0tPmluZGV4CSAgICAodHMtPmlzdHJlYW0pKTsKKwkJdGVvZi0+c2V0U3RvcEluZGV4ICAodGVvZiwgdHMtPmlzdHJlYW0tPmluZGV4CSAgICAodHMtPmlzdHJlYW0pKTsKKwkJcmV0dXJuICB0ZW9mOworCX0KKworCWkJPSBjdHMtPnA7CisJbgk9IDE7CisKKwkvKiBOZWVkIHRvIGZpbmQgayBnb29kIHRva2Vucywgc2tpcHBpbmcgb25lcyB0aGF0IGFyZSBvZmYgY2hhbm5lbAorCSovCisJd2hpbGUgICAoIG4gPCBrKQorCXsKKwkJLyogU2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMgKi8KKwkJaSA9IHNraXBPZmZUb2tlbkNoYW5uZWxzKGN0cywgaSsxKTsgLyogbGVhdmUgcCBvbiB2YWxpZCB0b2tlbiAgICAqLworCQluKys7CisJfQorCWlmCSggKEFOVExSM19VSU5UMzIpIGkgPj0gdHMtPmlzdHJlYW0tPmNhY2hlZFNpemUpCisJeworCQlwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0ZW9mID0gJih0cy0+dG9rZW5Tb3VyY2UtPmVvZlRva2VuKTsKKworCQl0ZW9mLT5zZXRTdGFydEluZGV4ICh0ZW9mLCB0cy0+aXN0cmVhbS0+aW5kZXgodHMtPmlzdHJlYW0pKTsKKwkJdGVvZi0+c2V0U3RvcEluZGV4ICAodGVvZiwgdHMtPmlzdHJlYW0tPmluZGV4KHRzLT5pc3RyZWFtKSk7CisJCXJldHVybiAgdGVvZjsKKwl9CisKKwkvLyBIZXJlIHRoZSB0b2tlbiBtdXN0IGJlIGluIHRoZSBpbnB1dCB2ZWN0b3IuIFJhdGhlciB0aGVuIGluY3VyCisJLy8gZnVuY3Rpb24gY2FsbCBwZW5hbHR5LCB3ZSBqdXN0IHJldHVybiB0aGUgcG9pbnRlciBkaXJlY3RseQorCS8vIGZyb20gdGhlIHZlY3RvcgorCS8vCisJcmV0dXJuICAocEFOVExSM19DT01NT05fVE9LRU4pY3RzLT50b2tlbnMtPmVsZW1lbnRzW2ldLmVsZW1lbnQ7CisJLy9yZXR1cm4gIChwQU5UTFIzX0NPTU1PTl9UT0tFTiljdHMtPnRva2Vucy0+Z2V0KGN0cy0+dG9rZW5zLCBpKTsKK30KKworLy8vIERlYnVnIG9ubHkgbWV0aG9kIHRvIGZsYWcgY29uc3VtcHRpb24gb2YgaW5pdGlhbCBvZmYtY2hhbm5lbAorLy8vIHRva2VucyBpbiB0aGUgaW5wdXQgc3RyZWFtCisvLy8KK3N0YXRpYyB2b2lkCitjb25zdW1lSW5pdGlhbEhpZGRlblRva2VucyhwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisJQU5UTFIzX01BUktFUglmaXJzdDsKKwlBTlRMUjNfSU5UMzIJaTsKKwlwQU5UTFIzX1RPS0VOX1NUUkVBTQl0czsKKworCXRzCSAgICA9IChwQU5UTFIzX1RPS0VOX1NUUkVBTSkJICAgIGlzLT5zdXBlcjsKKwlmaXJzdAk9IGlzLT5pbmRleChpcyk7CisKKwlmb3IJKGk9MDsgaTxmaXJzdDsgaSsrKQorCXsKKwkJdHMtPmRlYnVnZ2VyLT5jb25zdW1lSGlkZGVuVG9rZW4odHMtPmRlYnVnZ2VyLCB0cy0+Z2V0KHRzLCBpKSk7CisJfQorCisJdHMtPmluaXRpYWxTdHJlYW1TdGF0ZSA9IEFOVExSM19GQUxTRTsKKworfQorCisvLy8gQXMgcGVyIHRoZSBub3JtYWwgdG9rTFQgYnV0IHNlbmRzIGluZm9ybWF0aW9uIHRvIHRoZSBkZWJ1Z2dlcgorLy8vCitzdGF0aWMgcEFOVExSM19DT01NT05fVE9LRU4gCitkYmdUb2tMVCAgKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzLCBBTlRMUjNfSU5UMzIgaykKK3sKKwlpZgkodHMtPmluaXRpYWxTdHJlYW1TdGF0ZSA9PSBBTlRMUjNfVFJVRSkKKwl7CisJCWNvbnN1bWVJbml0aWFsSGlkZGVuVG9rZW5zKHRzLT5pc3RyZWFtKTsKKwl9CisJcmV0dXJuIHRva0xUKHRzLCBrKTsKK30KKworI2lmZGVmCUFOVExSM19XSU5ET1dTCisJLyogV2hlbiBmdWxseSBvcHRpbWl6ZWQgVkM3IGNvbXBsYWlucyBhYm91dCBub24gcmVhY2hhYmxlIGNvZGUuCisJICogTm90IHlldCBzdXJlIGlmIHRoaXMgaXMgYW4gb3B0aW1pemVyIGJ1Zywgb3IgYSBidWcgaW4gdGhlIGZsb3cgYW5hbHlzaXMKKwkgKi8KKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MDIgKQorI2VuZGlmCisKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTgorTEIocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGN0cywgQU5UTFIzX0lOVDMyIGspCit7CisgICAgQU5UTFIzX0lOVDMyIGk7CisgICAgQU5UTFIzX0lOVDMyIG47CisKKyAgICBpZiAoY3RzLT5wID09IC0xKQorICAgIHsKKyAgICAgICAgZmlsbEJ1ZmZlcihjdHMpOworICAgIH0KKyAgICBpZiAoayA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoY3RzLT5wIC0gaykgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaSA9IGN0cy0+cDsKKyAgICBuID0gMTsKKworICAgIC8qIE5lZWQgdG8gZmluZCBrIGdvb2QgdG9rZW5zLCBnb2luZyBiYWNrd2FyZHMsIHNraXBwaW5nIG9uZXMgdGhhdCBhcmUgb2ZmIGNoYW5uZWwKKyAgICAgKi8KKyAgICB3aGlsZSAobiA8PSAoQU5UTFIzX0lOVDMyKSBrKQorICAgIHsKKyAgICAgICAgLyogU2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICovCisKKyAgICAgICAgaSA9IHNraXBPZmZUb2tlbkNoYW5uZWxzUmV2ZXJzZShjdHMsIGkgLSAxKTsgLyogbGVhdmUgcCBvbiB2YWxpZCB0b2tlbiAgICAqLworICAgICAgICBuKys7CisgICAgfQorICAgIGlmIChpIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwkvLyBIZXJlIHRoZSB0b2tlbiBtdXN0IGJlIGluIHRoZSBpbnB1dCB2ZWN0b3IuIFJhdGhlciB0aGVuIGluY3V0CisJLy8gZnVuY3Rpb24gY2FsbCBwZW5hbHR5LCB3ZSBqc3V0IHJldHVybiB0aGUgcG9pbnRlciBkaXJlY3RseQorCS8vIGZyb20gdGhlIHZlY3RvcgorCS8vCisJcmV0dXJuICAocEFOVExSM19DT01NT05fVE9LRU4pY3RzLT50b2tlbnMtPmVsZW1lbnRzW2ldLmVsZW1lbnQ7Cit9CisKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UT0tFTiAKK2dldCAocEFOVExSM19UT0tFTl9TVFJFQU0gdHMsIEFOVExSM19VSU5UMzIgaSkKK3sKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gY3RzOworCisgICAgY3RzCSAgICA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0pdHMtPnN1cGVyOworCisgICAgcmV0dXJuICAocEFOVExSM19DT01NT05fVE9LRU4pKGN0cy0+dG9rZW5zLT5nZXQoY3RzLT50b2tlbnMsIGkpKTsgIC8qIFRva2VuIGluZGV4IGlzIHplcm8gYmFzZWQgYnV0IHZlY3RvcnMgYXJlIDEgYmFzZWQgKi8KK30KKworc3RhdGljIHBBTlRMUjNfVE9LRU5fU09VUkNFIAorZ2V0VG9rZW5Tb3VyY2UJKHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzKQoreworICAgIHJldHVybiAgdHMtPnRva2VuU291cmNlOworfQorCitzdGF0aWMgdm9pZAorc2V0VG9rZW5Tb3VyY2UJKCAgIHBBTlRMUjNfVE9LRU5fU1RSRUFNIHRzLAorCQkgICAgcEFOVExSM19UT0tFTl9TT1VSQ0UgdG9rZW5Tb3VyY2UpCit7CisgICAgdHMtPnRva2VuU291cmNlCT0gdG9rZW5Tb3VyY2U7Cit9CisKK3N0YXRpYyBwQU5UTFIzX1NUUklORwkgICAgCit0b1N0cmluZyAgICAocEFOVExSM19UT0tFTl9TVFJFQU0gdHMpCit7CisgICAgcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGN0czsKKworICAgIGN0cwkgICAgPSAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNKXRzLT5zdXBlcjsKKworICAgIGlmCShjdHMtPnAgPT0gLTEpCisgICAgeworCWZpbGxCdWZmZXIoY3RzKTsKKyAgICB9CisKKyAgICByZXR1cm4gIHRzLT50b1N0cmluZ1NTKHRzLCAwLCB0cy0+aXN0cmVhbS0+c2l6ZSh0cy0+aXN0cmVhbSkpOworfQorCitzdGF0aWMgcEFOVExSM19TVFJJTkcKK3RvU3RyaW5nU1MocEFOVExSM19UT0tFTl9TVFJFQU0gdHMsIEFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCkKK3sKKyAgICBwQU5UTFIzX1NUUklORyBzdHJpbmc7CisgICAgcEFOVExSM19UT0tFTl9TT1VSQ0UgdHNvdXJjZTsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2s7CisgICAgQU5UTFIzX1VJTlQzMiBpOworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHM7CisKKyAgICBjdHMgPSAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNKSB0cy0+c3VwZXI7CisKKyAgICBpZiAoY3RzLT5wID09IC0xKQorICAgIHsKKyAgICAgICAgZmlsbEJ1ZmZlcihjdHMpOworICAgIH0KKyAgICBpZiAoc3RvcCA+PSB0cy0+aXN0cmVhbS0+c2l6ZSh0cy0+aXN0cmVhbSkpCisgICAgeworICAgICAgICBzdG9wID0gdHMtPmlzdHJlYW0tPnNpemUodHMtPmlzdHJlYW0pIC0gMTsKKyAgICB9CisKKyAgICAvKiBXaG8gaXMgZ2l2aW5nIHVzIHRoZXNlIHRva2Vucz8KKyAgICAgKi8KKyAgICB0c291cmNlID0gdHMtPmdldFRva2VuU291cmNlKHRzKTsKKworICAgIGlmICh0c291cmNlICE9IE5VTEwgJiYgY3RzLT50b2tlbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIEZpbmFsbHksIGxldCdzIGdldCBhIHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgc3RyaW5nID0gdHNvdXJjZS0+c3RyRmFjdG9yeS0+bmV3UmF3KHRzb3VyY2UtPnN0ckZhY3RvcnkpOworCisgICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG9rID0gdHMtPmdldCh0cywgaSk7CisgICAgICAgICAgICBpZiAodG9rICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nLT5hcHBlbmRTKHN0cmluZywgdG9rLT5nZXRUZXh0KHRvaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljIHBBTlRMUjNfU1RSSU5HCSAgICAKK3RvU3RyaW5nVFQgIChwQU5UTFIzX1RPS0VOX1NUUkVBTSB0cywgcEFOVExSM19DT01NT05fVE9LRU4gc3RhcnQsIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHN0b3ApCit7CisJaWYJKHN0YXJ0ICE9IE5VTEwgJiYgc3RvcCAhPSBOVUxMKQorCXsKKwkJcmV0dXJuCXRzLT50b1N0cmluZ1NTKHRzLCAoQU5UTFIzX1VJTlQzMilzdGFydC0+Z2V0VG9rZW5JbmRleChzdGFydCksIChBTlRMUjNfVUlOVDMyKXN0b3AtPmdldFRva2VuSW5kZXgoc3RvcCkpOworCX0KKwllbHNlCisJeworCQlyZXR1cm4JTlVMTDsKKwl9Cit9CisKKy8qKiBNb3ZlIHRoZSBpbnB1dCBwb2ludGVyIHRvIHRoZSBuZXh0IGluY29taW5nIHRva2VuLiAgVGhlIHN0cmVhbQorICogIG11c3QgYmVjb21lIGFjdGl2ZSB3aXRoIExUKDEpIGF2YWlsYWJsZS4gIGNvbnN1bWUoKSBzaW1wbHkKKyAqICBtb3ZlcyB0aGUgaW5wdXQgcG9pbnRlciBzbyB0aGF0IExUKDEpIHBvaW50cyBhdCB0aGUgbmV4dAorICogIGlucHV0IHN5bWJvbC4gQ29uc3VtZSBhdCBsZWFzdCBvbmUgdG9rZW4uCisgKgorICogIFdhbGsgcGFzdCBhbnkgdG9rZW4gbm90IG9uIHRoZSBjaGFubmVsIHRoZSBwYXJzZXIgaXMgbGlzdGVuaW5nIHRvLgorICovCitzdGF0aWMgdm9pZAkJICAgIAorY29uc3VtZQkocEFOVExSM19JTlRfU1RSRUFNIGlzKQoreworCXBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHM7CisJcEFOVExSM19UT0tFTl9TVFJFQU0JdHM7CisKKwl0cwkgICAgPSAocEFOVExSM19UT0tFTl9TVFJFQU0pCSAgICBpcy0+c3VwZXI7CisJY3RzCSAgICA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0pIHRzLT5zdXBlcjsKKworICAgICAgICBpZgkoKEFOVExSM19VSU5UMzIpY3RzLT5wIDwgY3RzLT50b2tlbnMtPmNvdW50KQorCXsKKwkJY3RzLT5wKys7CisJCWN0cy0+cAk9IHNraXBPZmZUb2tlbkNoYW5uZWxzKGN0cywgY3RzLT5wKTsKKwl9Cit9CisKKworLy8vIEFzIHBlciBvcmRpbmFyeSBjb25zdW1lIGJ1dCBub3RpZmllcyB0aGUgZGVidWdnZXIgYWJvdXQgaGlkZGVuCisvLy8gdG9rZW5zIGFuZCBzbyBvbi4KKy8vLworc3RhdGljIHZvaWQKK2RiZ0NvbnN1bWUJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKwlwQU5UTFIzX1RPS0VOX1NUUkVBTQl0czsKKwlBTlRMUjNfTUFSS0VSCQkJYTsKKwlBTlRMUjNfTUFSS0VSCQkJYjsKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTgl0OworCisJdHMJICAgID0gKHBBTlRMUjNfVE9LRU5fU1RSRUFNKQkgICAgaXMtPnN1cGVyOworCisJaWYJKHRzLT5pbml0aWFsU3RyZWFtU3RhdGUgPT0gQU5UTFIzX1RSVUUpCisJeworCQljb25zdW1lSW5pdGlhbEhpZGRlblRva2Vucyhpcyk7CisJfQorCQorCWEgPSBpcy0+aW5kZXgoaXMpOwkJLy8gV2hlcmUgYXJlIHdlIHJpZ2h0IG5vdz8KKwl0ID0gdHMtPl9MVCh0cywgMSk7CQkvLyBDdXJyZW50IHRva2VuIGZyb20gc3RyZWFtCisKKwljb25zdW1lKGlzKTsJCQkvLyBTdGFuZGFyZCBjb25zdW1lcgorCisJYiA9IGlzLT5pbmRleChpcyk7CQkvLyBXaGVyZSBhcmUgd2UgYWZ0ZXIgY29uc3VtaW5nIDEgb24gY2hhbm5lbCB0b2tlbj8KKworCXRzLT5kZWJ1Z2dlci0+Y29uc3VtZVRva2VuKHRzLT5kZWJ1Z2dlciwgdCk7CS8vIFRlbGwgdGhlIGRlYnVnZ2VyIHRoYXQgd2UgY29uc3VtZWQgdGhlIGZpcnN0IHRva2VuCisKKwlpZgkoYj5hKzEpCisJeworCQkvLyBUaGUgc3RhbmRhcmQgY29uc3VtZSBjYXVzZWQgdGhlIGluZGV4IHRvIGFkdmFuY2UgYnkgbW9yZSB0aGFuIDEsCisJCS8vIHdoaWNoIGNhbiBvbmx5IGhhcHBlbiBpZiBpdCBza2lwcGVkIHNvbWUgb2ZmLWNoYW5uZWwgdG9rZW5zLgorCQkvLyB3ZSBuZWVkIHRvIHRlbGwgdGhlIGRlYnVnZ2VyIGFib3V0IHRob3NlIHRva2Vucy4KKwkJLy8KKwkJQU5UTFIzX01BUktFUglpOworCisJCWZvcgkoaSA9IGErMTsgaTxiOyBpKyspCisJCXsKKwkJCXRzLT5kZWJ1Z2dlci0+Y29uc3VtZUhpZGRlblRva2VuKHRzLT5kZWJ1Z2dlciwgdHMtPmdldCh0cywgKEFOVExSM19VSU5UMzIpaSkpOworCQl9CisKKwl9Cit9CisKKy8qKiBBIHNpbXBsZSBmaWx0ZXIgbWVjaGFuaXNtIHdoZXJlYnkgeW91IGNhbiB0ZWxsIHRoaXMgdG9rZW4gc3RyZWFtCisgKiAgdG8gZm9yY2UgYWxsIHRva2VucyBvZiB0eXBlIHR0eXBlIHRvIGJlIG9uIGNoYW5uZWwuICBGb3IgZXhhbXBsZSwKKyAqICB3aGVuIGludGVycHJldGluZywgd2UgY2Fubm90IGV4ZWN1dGUgYWN0aW9ucyBzbyB3ZSBuZWVkIHRvIHRlbGwKKyAqICB0aGUgc3RyZWFtIHRvIGZvcmNlIGFsbCBXUyBhbmQgTkVXTElORSB0byBiZSBhIGRpZmZlcmVudCwgaWdub3JlZCwKKyAqICBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZAkJICAgIAorc2V0VG9rZW5UeXBlQ2hhbm5lbCAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfVUlOVDMyIHR0eXBlLCBBTlRMUjNfVUlOVDMyIGNoYW5uZWwpCit7CisgICAgaWYJKHRva2VuU3RyZWFtLT5jaGFubmVsT3ZlcnJpZGVzID09IE5VTEwpCisgICAgeworCXRva2VuU3RyZWFtLT5jaGFubmVsT3ZlcnJpZGVzCT0gYW50bHIzTGlzdE5ldygxMCk7CisgICAgfQorCisgICAgLyogV2UgYWRkIG9uZSB0byB0aGUgY2hhbm5lbCBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2ggTlVMTCBhcyBiZWluZyBubyBlbnRyeSBpbiB0aGUKKyAgICAgKiB0YWJsZSBmb3IgYSBwYXJ0aWN1bGFyIHRva2VuIHR5cGUuCisgICAgICovCisgICAgdG9rZW5TdHJlYW0tPmNoYW5uZWxPdmVycmlkZXMtPnB1dCh0b2tlblN0cmVhbS0+Y2hhbm5lbE92ZXJyaWRlcywgdHR5cGUsIEFOVExSM19GVU5DX1BUUigoQU5UTFIzX1VJTlQzMiljaGFubmVsICsgMSksIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAkJICAgIAorZGlzY2FyZFRva2VuVHlwZSAgICAocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfSU5UMzIgdHR5cGUpCit7CisgICAgaWYJKHRva2VuU3RyZWFtLT5kaXNjYXJkU2V0ID09IE5VTEwpCisgICAgeworCXRva2VuU3RyZWFtLT5kaXNjYXJkU2V0CT0gYW50bHIzTGlzdE5ldygzMSk7CisgICAgfQorCisgICAgLyogV2UgYWRkIG9uZSB0byB0aGUgY2hhbm5lbCBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2ggTlVMTCBhcyBiZWluZyBubyBlbnRyeSBpbiB0aGUKKyAgICAgKiB0YWJsZSBmb3IgYSBwYXJ0aWN1bGFyIHRva2VuIHR5cGUuIFdlIGNvdWxkIHVzZSBiaXRzZXRzIGZvciB0aGlzIEkgc3VwcG9zZSB0b28uCisgICAgICovCisgICAgdG9rZW5TdHJlYW0tPmRpc2NhcmRTZXQtPnB1dCh0b2tlblN0cmVhbS0+ZGlzY2FyZFNldCwgdHR5cGUsIEFOVExSM19GVU5DX1BUUigoQU5UTFIzX1VJTlQzMil0dHlwZSArIDEpLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQJCSAgICAKK2Rpc2NhcmRPZmZDaGFubmVsICAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSB0b2tlblN0cmVhbSwgQU5UTFIzX0JPT0xFQU4gZGlzY2FyZCkKK3sKKyAgICB0b2tlblN0cmVhbS0+ZGlzY2FyZE9mZkNoYW5uZWwgID0gZGlzY2FyZDsKK30KKworc3RhdGljIHBBTlRMUjNfVkVDVE9SCSAgICAKK2dldFRva2VucyAgIChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gdG9rZW5TdHJlYW0pCit7CisgICAgaWYJKHRva2VuU3RyZWFtLT5wID09IC0xKQorICAgIHsKKwlmaWxsQnVmZmVyKHRva2VuU3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gIHRva2VuU3RyZWFtLT50b2tlbnM7Cit9CisKK3N0YXRpYyBwQU5UTFIzX0xJU1QJICAgIAorZ2V0VG9rZW5SYW5nZQkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfVUlOVDMyIHN0YXJ0LCBBTlRMUjNfVUlOVDMyIHN0b3ApCit7CisgICAgcmV0dXJuIHRva2VuU3RyZWFtLT5nZXRUb2tlbnNTZXQodG9rZW5TdHJlYW0sIHN0YXJ0LCBzdG9wLCBOVUxMKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBHaXZlbiBhIHN0YXJ0IGFuZCBzdG9wIGluZGV4LCByZXR1cm4gYSBMaXN0IG9mIGFsbCB0b2tlbnMgaW4KKyAqICB0aGUgdG9rZW4gdHlwZSBCaXRTZXQuICBSZXR1cm4gbnVsbCBpZiBubyB0b2tlbnMgd2VyZSBmb3VuZC4gIFRoaXMKKyAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICovCitzdGF0aWMgcEFOVExSM19MSVNUCSAgICAKK2dldFRva2Vuc1NldAkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfVUlOVDMyIHN0YXJ0LCBBTlRMUjNfVUlOVDMyIHN0b3AsIHBBTlRMUjNfQklUU0VUIHR5cGVzKQoreworICAgIHBBTlRMUjNfTElTVAkgICAgZmlsdGVyZWRMaXN0OworICAgIEFOVExSM19VSU5UMzIJICAgIGk7CisgICAgQU5UTFIzX1VJTlQzMgkgICAgbjsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0b2s7CisKKyAgICBpZgkodG9rZW5TdHJlYW0tPnAgPT0gLTEpCisgICAgeworCWZpbGxCdWZmZXIodG9rZW5TdHJlYW0pOworICAgIH0KKyAgICBpZgkoc3RvcCA+IHRva2VuU3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zaXplKHRva2VuU3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtKSkKKyAgICB7CisJc3RvcCA9IHRva2VuU3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zaXplKHRva2VuU3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtKTsKKyAgICB9CisgICAgaWYJKHN0YXJ0ID4gc3RvcCkKKyAgICB7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogV2UgaGF2ZSB0aGUgcmFuZ2Ugc2V0LCBub3cgd2UgbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlCisgICAgICogaW5zdGFsbGVkIHRva2VucyBhbmQgY3JlYXRlIGEgbmV3IGxpc3Qgd2l0aCBqdXN0IHRoZSBvbmVzIHdlIHdhbnQKKyAgICAgKiBpbiBpdC4gV2UgYXJlIGp1c3QgbW92aW5nIHBvaW50ZXJzIGFib3V0IHJlYWxseS4KKyAgICAgKi8KKyAgICBmaWx0ZXJlZExpc3QgICAgPSBhbnRscjNMaXN0TmV3KChBTlRMUjNfVUlOVDMyKXRva2VuU3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtLT5zaXplKHRva2VuU3RyZWFtLT50c3RyZWFtLT5pc3RyZWFtKSk7CisKKyAgICBmb3IJKGkgPSBzdGFydCwgbiA9IDA7IGk8PSBzdG9wOyBpKyspCisgICAgeworCXRvayA9IHRva2VuU3RyZWFtLT50c3RyZWFtLT5nZXQodG9rZW5TdHJlYW0tPnRzdHJlYW0sIGkpOworCisJaWYgICgJICAgdHlwZXMgPT0gTlVMTAorCQl8fCB0eXBlcy0+aXNNZW1iZXIodHlwZXMsIHRvay0+Z2V0VHlwZSh0b2spID09IEFOVExSM19UUlVFKQorCSAgICApCisJeworCSAgICBmaWx0ZXJlZExpc3QtPnB1dChmaWx0ZXJlZExpc3QsIG4rKywgKHZvaWQgKil0b2ssIE5VTEwpOworCX0KKyAgICB9CisgICAgCisgICAgLyogRGlkIHdlIGdldCBhbnkgdGhlbj8KKyAgICAgKi8KKyAgICBpZgkoZmlsdGVyZWRMaXN0LT5zaXplKGZpbHRlcmVkTGlzdCkgPT0gMCkKKyAgICB7CisJZmlsdGVyZWRMaXN0LT5mcmVlKGZpbHRlcmVkTGlzdCk7CisJZmlsdGVyZWRMaXN0CT0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gIGZpbHRlcmVkTGlzdDsKK30KKworc3RhdGljIHBBTlRMUjNfTElTVAkgICAgCitnZXRUb2tlbnNMaXN0CShwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gdG9rZW5TdHJlYW0sIEFOVExSM19VSU5UMzIgc3RhcnQsIEFOVExSM19VSU5UMzIgc3RvcCwgcEFOVExSM19MSVNUIGxpc3QpCit7CisgICAgcEFOVExSM19CSVRTRVQgIGJpdFNldDsKKyAgICBwQU5UTFIzX0xJU1QgICAgbmV3bGlzdDsKKworICAgIGJpdFNldCAgPSBhbnRscjNCaXRzZXRMaXN0KGxpc3QtPnRhYmxlKTsKKworICAgIG5ld2xpc3QgICAgPSB0b2tlblN0cmVhbS0+Z2V0VG9rZW5zU2V0KHRva2VuU3RyZWFtLCBzdGFydCwgc3RvcCwgYml0U2V0KTsKKworICAgIGJpdFNldC0+ZnJlZShiaXRTZXQpOworCisgICAgcmV0dXJuICBuZXdsaXN0OworCit9CisKK3N0YXRpYyBwQU5UTFIzX0xJU1QJICAgIAorZ2V0VG9rZW5zVHlwZQkocEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIHRva2VuU3RyZWFtLCBBTlRMUjNfVUlOVDMyIHN0YXJ0LCBBTlRMUjNfVUlOVDMyIHN0b3AsIEFOVExSM19VSU5UMzIgdHlwZSkKK3sKKyAgICBwQU5UTFIzX0JJVFNFVCAgYml0U2V0OworICAgIHBBTlRMUjNfTElTVCAgICBuZXdsaXN0OworCisgICAgYml0U2V0ICA9IGFudGxyM0JpdHNldE9mKHR5cGUsIC0xKTsKKyAgICBuZXdsaXN0ID0gdG9rZW5TdHJlYW0tPmdldFRva2Vuc1NldCh0b2tlblN0cmVhbSwgc3RhcnQsIHN0b3AsIGJpdFNldCk7CisKKyAgICBiaXRTZXQtPmZyZWUoYml0U2V0KTsKKworICAgIHJldHVybiAgbmV3bGlzdDsKK30KKworc3RhdGljIEFOVExSM19VSU5UMzIJICAgIAorX0xBICAocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfSU5UMzIgaSkKK3sKKwlwQU5UTFIzX1RPS0VOX1NUUkVBTSAgICB0czsKKwlwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICB0b2s7CisKKwl0cwkgICAgPSAocEFOVExSM19UT0tFTl9TVFJFQU0pCSAgICBpcy0+c3VwZXI7CisKKwl0b2sJICAgID0gIHRzLT5fTFQodHMsIGkpOworCisJaWYJKHRvayAhPSBOVUxMKQorCXsKKwkJcmV0dXJuCXRvay0+Z2V0VHlwZSh0b2spOworCX0KKwllbHNlCisJeworCQlyZXR1cm4JQU5UTFIzX1RPS0VOX0lOVkFMSUQ7CisJfQorfQorCisvLy8gQXMgcGVyIF9MQSgpIGJ1dCBmb3IgZGVidWcgbW9kZS4KKy8vLworc3RhdGljIEFOVExSM19VSU5UMzIJICAgIAorZGJnTEEgIChwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19JTlQzMiBpKQoreworICAgIHBBTlRMUjNfVE9LRU5fU1RSRUFNICAgIHRzOworICAgCisgICAgdHMJICAgID0gKHBBTlRMUjNfVE9LRU5fU1RSRUFNKQkgICAgaXMtPnN1cGVyOworCisJaWYJKHRzLT5pbml0aWFsU3RyZWFtU3RhdGUgPT0gQU5UTFIzX1RSVUUpCisJeworCQljb25zdW1lSW5pdGlhbEhpZGRlblRva2Vucyhpcyk7CisJfQorCXRzLT5kZWJ1Z2dlci0+TFQodHMtPmRlYnVnZ2VyLCBpLCB0b2tMVCh0cywgaSkpOworCXJldHVybglfTEEoaXMsIGkpOworfQorCitzdGF0aWMgQU5UTFIzX01BUktFUgorbWFyawkocEFOVExSM19JTlRfU1RSRUFNIGlzKQoreworICAgIGlzLT5sYXN0TWFya2VyID0gaXMtPmluZGV4KGlzKTsKKyAgICByZXR1cm4gIGlzLT5sYXN0TWFya2VyOworfQorCisvLy8gQXMgcGVyIG1hcmsoKSBidXQgd2l0aCBhIGNhbGwgdG8gdGVsbCB0aGUgZGVidWdnZXIgd2UgYXJlIGRvaW5nIHRoaXMKKy8vLworc3RhdGljIEFOVExSM19NQVJLRVIKK2RiZ01hcmsJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKyAgICBwQU5UTFIzX1RPS0VOX1NUUkVBTSAgICB0czsKKyAgIAorICAgIHRzCSAgICA9IChwQU5UTFIzX1RPS0VOX1NUUkVBTSkJICAgIGlzLT5zdXBlcjsKKwkKKwlpcy0+bGFzdE1hcmtlciA9IGlzLT5pbmRleChpcyk7CisJdHMtPmRlYnVnZ2VyLT5tYXJrKHRzLT5kZWJ1Z2dlciwgaXMtPmxhc3RNYXJrZXIpOworCisgICAgcmV0dXJuICBpcy0+bGFzdE1hcmtlcjsKK30KKworc3RhdGljIHZvaWQJCSAgICAKK3JlbGVhc2UJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBtYXJrKQoreworICAgIHJldHVybjsKK30KKworc3RhdGljIEFOVExSM19VSU5UMzIJICAgIAorc2l6ZQkocEFOVExSM19JTlRfU1RSRUFNIGlzKQoreworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSBjdHM7CisgICAgcEFOVExSM19UT0tFTl9TVFJFQU0JdHM7CisKKyAgICBpZiAoaXMtPmNhY2hlZFNpemUgPiAwKQorICAgIHsKKwlyZXR1cm4gIGlzLT5jYWNoZWRTaXplOworICAgIH0KKyAgICB0cwkgICAgPSAocEFOVExSM19UT0tFTl9TVFJFQU0pCSAgICBpcy0+c3VwZXI7CisgICAgY3RzCSAgICA9IChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0pIHRzLT5zdXBlcjsKKworICAgIGlzLT5jYWNoZWRTaXplID0gIGN0cy0+dG9rZW5zLT5jb3VudDsKKyAgICByZXR1cm4gIGlzLT5jYWNoZWRTaXplOworfQorCitzdGF0aWMgQU5UTFIzX01BUktFUiAgIAordGluZGV4CShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisgICAgcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGN0czsKKyAgICBwQU5UTFIzX1RPS0VOX1NUUkVBTQl0czsKKworICAgIHRzCSAgICA9IChwQU5UTFIzX1RPS0VOX1NUUkVBTSkJICAgIGlzLT5zdXBlcjsKKyAgICBjdHMJICAgID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSkgdHMtPnN1cGVyOworCisgICAgcmV0dXJuICBjdHMtPnA7Cit9CisKK3N0YXRpYyB2b2lkCQkgICAgCitkYmdSZXdpbmRMYXN0CShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisJcEFOVExSM19UT0tFTl9TVFJFQU0JdHM7CisKKyAgICB0cwkgICAgPSAocEFOVExSM19UT0tFTl9TVFJFQU0pCSAgICBpcy0+c3VwZXI7CisKKwl0cy0+ZGVidWdnZXItPnJld2luZExhc3QodHMtPmRlYnVnZ2VyKTsKKworICAgIGlzLT5yZXdpbmQoaXMsIGlzLT5sYXN0TWFya2VyKTsKK30KK3N0YXRpYyB2b2lkCQkgICAgCityZXdpbmRMYXN0CShwQU5UTFIzX0lOVF9TVFJFQU0gaXMpCit7CisgICAgaXMtPnJld2luZChpcywgaXMtPmxhc3RNYXJrZXIpOworfQorc3RhdGljIHZvaWQJCSAgICAKK3Jld2luZFN0cmVhbQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIG1hcmtlcikKK3sKKyAgICBpcy0+c2VlayhpcywgKEFOVExSM19VSU5UMzIpKG1hcmtlcikpOworfQorc3RhdGljIHZvaWQJCSAgICAKK2RiZ1Jld2luZFN0cmVhbQkocEFOVExSM19JTlRfU1RSRUFNIGlzLCBBTlRMUjNfTUFSS0VSIG1hcmtlcikKK3sKKyAgICBwQU5UTFIzX1RPS0VOX1NUUkVBTQl0czsKKworICAgIHRzCSAgICA9IChwQU5UTFIzX1RPS0VOX1NUUkVBTSkJICAgIGlzLT5zdXBlcjsKKworCXRzLT5kZWJ1Z2dlci0+cmV3aW5kKHRzLT5kZWJ1Z2dlciwgbWFya2VyKTsKKworICAgIGlzLT5zZWVrKGlzLCAoQU5UTFIzX1VJTlQzMikobWFya2VyKSk7Cit9CisKK3N0YXRpYyB2b2lkCQkgICAgCitzZWVrCShwQU5UTFIzX0lOVF9TVFJFQU0gaXMsIEFOVExSM19NQVJLRVIgaW5kZXgpCit7CisgICAgcEFOVExSM19DT01NT05fVE9LRU5fU1RSRUFNIGN0czsKKyAgICBwQU5UTFIzX1RPS0VOX1NUUkVBTQl0czsKKworICAgIHRzCSAgICA9IChwQU5UTFIzX1RPS0VOX1NUUkVBTSkJICAgIGlzLT5zdXBlcjsKKyAgICBjdHMJICAgID0gKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSkgdHMtPnN1cGVyOworCisgICAgY3RzLT5wICA9IChBTlRMUjNfVUlOVDMyKWluZGV4OworfQorc3RhdGljIHZvaWQJCSAgICAKK2RiZ1NlZWsJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcywgQU5UTFIzX01BUktFUiBpbmRleCkKK3sKKwkvLyBUT0RPOiBJbXBsZW1lbnQgc2VlayBpbiBkZWJ1Z2dlciB3aGVuIFRlciBhZGRzIGl0IHRvIEphdmEKKwkvLworCXNlZWsoaXMsIGluZGV4KTsKK30KK0FOVExSM19BUEkgdm9pZAorZmlsbEJ1ZmZlckV4dChwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gdG9rZW5TdHJlYW0pCit7CisgICAgZmlsbEJ1ZmZlcih0b2tlblN0cmVhbSk7Cit9CitzdGF0aWMgdm9pZAorZmlsbEJ1ZmZlcihwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gdG9rZW5TdHJlYW0pIHsKKyAgICBBTlRMUjNfVUlOVDMyIGluZGV4OworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRvazsKKyAgICBBTlRMUjNfQk9PTEVBTiBkaXNjYXJkOworICAgIHZvaWQgKiBjaGFubmVsSTsKKworICAgIC8qIFN0YXJ0IGF0IGluZGV4IDAgb2YgY291cnNlCisgICAgICovCisgICAgaW5kZXggPSAwOworCisgICAgLyogUGljayBvdXQgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgdG9rZW4gc291cmNlCisgICAgICogUmVtZW1iZXIgd2UganVzdCBnZXQgYSBwb2ludGVyIChyZWZlcmVuY2UgaWYgeW91IGxpa2UpIGhlcmUKKyAgICAgKiBhbmQgc28gaWYgd2Ugc3RvcmUgaXQgYW55d2hlcmUsIHdlIGRvbid0IHNldCBhbnkgcG9pbnRlcnMgdG8gYXV0byBmcmVlIGl0LgorICAgICAqLworICAgIHRvayA9IHRva2VuU3RyZWFtLT50c3RyZWFtLT50b2tlblNvdXJjZS0+bmV4dFRva2VuKHRva2VuU3RyZWFtLT50c3RyZWFtLT50b2tlblNvdXJjZSk7CisKKyAgICB3aGlsZSAodG9rICE9IE5VTEwgJiYgdG9rLT50eXBlICE9IEFOVExSM19UT0tFTl9FT0YpCisgICAgeworICAgICAgICBkaXNjYXJkID0gQU5UTFIzX0ZBTFNFOyAvKiBBc3N1bWUgd2UgYXJlIG5vdCBkaXNjYXJkaW5nCSovCisKKyAgICAgICAgLyogSSBlbXBsb3kgYSBiaXQgb2YgYSB0cmljaywgb3IgcGVyaGFwcyBoYWNrIGhlcmUuIFJhdGhlciB0aGFuCisgICAgICAgICAqIHN0b3JlIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBpbiB0aGUgb3ZlcnJpZGUgbWFwIGFuZCBkaXNjYXJkIHNldAorICAgICAgICAgKiB3ZSBzdG9yZSB0aGUgdmFsdWUgKyAxIGNhc3QgdG8gYSB2b2lkICouIEhlbmNlIG9uIHN5c3RlbXMgd2hlcmUgTlVMTCA9ICh2b2lkICopMAorICAgICAgICAgKiB3ZSBjYW4gZGlzdGluZ3Vpc2ggIm5vdCBiZWluZyB0aGVyZSIgZnJvbSAiYmVpbmcgY2hhbm5lbCBvciB0eXBlIDAiCisgICAgICAgICAqLworCisgICAgICAgIGlmICh0b2tlblN0cmVhbS0+ZGlzY2FyZFNldCAhPSBOVUxMCisgICAgICAgICAgICAmJiB0b2tlblN0cmVhbS0+ZGlzY2FyZFNldC0+Z2V0KHRva2VuU3RyZWFtLT5kaXNjYXJkU2V0LCB0b2stPmdldFR5cGUodG9rKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzY2FyZCA9IEFOVExSM19UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAgIHRva2VuU3RyZWFtLT5kaXNjYXJkT2ZmQ2hhbm5lbCA9PSBBTlRMUjNfVFJVRQorICAgICAgICAgICAgICAgICAmJiB0b2stPmdldENoYW5uZWwodG9rKSAhPSB0b2tlblN0cmVhbS0+Y2hhbm5lbAorICAgICAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc2NhcmQgPSBBTlRMUjNfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0b2tlblN0cmVhbS0+Y2hhbm5lbE92ZXJyaWRlcyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTZWUgaWYgdGhpcyB0eXBlIGlzIGluIHRoZSBvdmVycmlkZSBtYXAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2hhbm5lbEkgPSB0b2tlblN0cmVhbS0+Y2hhbm5lbE92ZXJyaWRlcy0+Z2V0KHRva2VuU3RyZWFtLT5jaGFubmVsT3ZlcnJpZGVzLCB0b2stPmdldFR5cGUodG9rKSArIDEpOworCisgICAgICAgICAgICBpZiAoY2hhbm5lbEkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBPdmVycmlkZSBmb3VuZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHRvay0+c2V0Q2hhbm5lbCh0b2ssIEFOVExSM19VSU5UMzJfQ0FTVChjaGFubmVsSSkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIG5vdCBkaXNjYXJkaW5nIGl0LCBhZGQgaXQgdG8gdGhlIGxpc3QgYXQgdGhlIGN1cnJlbnQgaW5kZXgKKyAgICAgICAgICovCisgICAgICAgIGlmIChkaXNjYXJkID09IEFOVExSM19GQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQWRkIGl0LCBpbmRpY2F0aW5nIHRoYXQgd2Ugd2lsbCBkZWxldGUgaXQgYW5kIHRoZSB0YWJsZSBzaG91bGQgbm90CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRvay0+c2V0VG9rZW5JbmRleCh0b2ssIGluZGV4KTsKKyAgICAgICAgICAgIHRva2VuU3RyZWFtLT5wKys7CisgICAgICAgICAgICB0b2tlblN0cmVhbS0+dG9rZW5zLT5hZGQodG9rZW5TdHJlYW0tPnRva2VucywgKHZvaWQgKikgdG9rLCBOVUxMKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICB0b2sgPSB0b2tlblN0cmVhbS0+dHN0cmVhbS0+dG9rZW5Tb3VyY2UtPm5leHRUb2tlbih0b2tlblN0cmVhbS0+dHN0cmVhbS0+dG9rZW5Tb3VyY2UpOworICAgIH0KKworICAgIC8qIENhY2hlIHRoZSBzaXplIHNvIHdlIGRvbid0IGtlZXAgZG9pbmcgaW5kaXJlY3QgbWV0aG9kIGNhbGxzLiBXZSBkbyB0aGlzIGFzCisgICAgICogZWFybHkgYXMgcG9zc2libGUgc28gdGhhdCBhbnl0aGluZyBhZnRlciB0aGlzIG1heSB1dGlsaXplIHRoZSBjYWNoZWQgdmFsdWUuCisgICAgICovCisgICAgdG9rZW5TdHJlYW0tPnRzdHJlYW0tPmlzdHJlYW0tPmNhY2hlZFNpemUgPSB0b2tlblN0cmVhbS0+dG9rZW5zLT5jb3VudDsKKworICAgIC8qIFNldCB0aGUgY29uc3VtZSBwb2ludGVyIHRvIHRoZSBmaXJzdCB0b2tlbiB0aGF0IGlzIG9uIG91ciBjaGFubmVsCisgICAgICovCisgICAgdG9rZW5TdHJlYW0tPnAgPSAwOworICAgIHRva2VuU3RyZWFtLT5wID0gc2tpcE9mZlRva2VuQ2hhbm5lbHModG9rZW5TdHJlYW0sIHRva2VuU3RyZWFtLT5wKTsKKworfQorCisvLy8gR2l2ZW4gYSBzdGFydGluZyBpbmRleCwgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb24tY2hhbm5lbAorLy8vICB0b2tlbi4KKy8vLworc3RhdGljIEFOVExSM19VSU5UMzIKK3NraXBPZmZUb2tlbkNoYW5uZWxzKHBBTlRMUjNfQ09NTU9OX1RPS0VOX1NUUkVBTSB0b2tlblN0cmVhbSwgQU5UTFIzX0lOVDMyIGkpIHsKKyAgICBBTlRMUjNfSU5UMzIgbjsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiB0b2s7CisKKyAgICBuID0gdG9rZW5TdHJlYW0tPnRzdHJlYW0tPmlzdHJlYW0tPmNhY2hlZFNpemU7CisKKyAgICB3aGlsZSAoaSA8IG4pCisgICAgeworICAgICAgICB0b2sgPSAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOKXRva2VuU3RyZWFtLT50b2tlbnMtPmVsZW1lbnRzW2ldLmVsZW1lbnQ7CisKKyAgICAgICAgaWYgKHRvay0+Y2hhbm5lbCE9IHRva2VuU3RyZWFtLT5jaGFubmVsKQorICAgICAgICB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIEFOVExSM19VSU5UMzIKK3NraXBPZmZUb2tlbkNoYW5uZWxzUmV2ZXJzZShwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0gdG9rZW5TdHJlYW0sIEFOVExSM19JTlQzMiB4KQoreworICAgIHBBTlRMUjNfQ09NTU9OX1RPS0VOIHRvazsKKworICAgIHdoaWxlICh4ID49IDApCisgICAgeworICAgICAgICB0b2sgPSAgKHBBTlRMUjNfQ09NTU9OX1RPS0VOKXRva2VuU3RyZWFtLT50b2tlbnMtPmVsZW1lbnRzW3hdLmVsZW1lbnQ7CisgICAgICAgIAorICAgICAgICBpZiAoKHRvay0+Y2hhbm5lbCAhPSB0b2tlblN0cmVhbS0+Y2hhbm5lbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHgtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB4OworfQorCisvLy8gUmV0dXJuIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbmFtZSBhc3NvaWNhdGVkIHdpdGggdGhlIGlucHV0IHNvdXJjZQorLy8vCisvLy8gL3BhcmFtW2luXSBpcyBUaGUgQU5UTFIzX0lOVF9TVFJFQU0gaW50ZXJmYWNlIHRoYXQgaXMgcmVwcmVzZW50aW5nIHRoaXMgdG9rZW4gc3RyZWFtLgorLy8vCisvLy8gL3JldHVybnMgCisvLy8gL2ltcGxlbWVudHMgQU5UTFIzX0lOVF9TVFJFQU1fc3RydWN0OjpnZXRTb3VyY2VOYW1lKCkKKy8vLworc3RhdGljIHBBTlRMUjNfU1RSSU5HCQkKK2dldFNvdXJjZU5hbWUJCQkJKHBBTlRMUjNfSU5UX1NUUkVBTSBpcykKK3sKKwkvLyBTbGlnaHRseSBjb252b2x1dGVkIGFzIHdlIG11c3QgdHJhY2UgYmFjayB0byB0aGUgbGV4ZXIncyBpbnB1dCBzb3VyY2UKKwkvLyB2aWEgdGhlIHRva2VuIHNvdXJjZS4gVGhlIHN0cmVhbU5hbWUgdGhhdCBpcyBoZXJlIGlzIG5vdCBpbml0aWFsaXplZAorCS8vIGJlY2F1c2UgdGhpcyBpcyBhIHRva2VuIHN0cmVhbSwgbm90IGEgZmlsZSBvciBzdHJpbmcgc3RyZWFtLCB3aGljaCBhcmUgdGhlCisJLy8gb25seSB0aGluZ3MgdGhhdCBoYXZlIGEgY29udGV4dCBmb3IgYSBzb3VyY2UgbmFtZS4KKwkvLworCXJldHVybiAoKHBBTlRMUjNfVE9LRU5fU1RSRUFNKShpcy0+c3VwZXIpKS0+dG9rZW5Tb3VyY2UtPmZpbGVOYW1lOworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzdHJlZXBhcnNlci5jIGIvYW50bHItMy40L3J1bnRpbWUvQy9zcmMvYW50bHIzdHJlZXBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZTAzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3NyYy9hbnRscjN0cmVlcGFyc2VyLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qKiBcZmlsZQorICogIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmVlIHBhcnNlciBhbmQgb3ZlcnJpZGVzIGZvciB0aGUgYmFzZSByZWNvZ25pemVyCisgKi8KKworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAgICA8YW50bHIzdHJlZXBhcnNlci5oPgorCisvKiBCQVNFIFJlY29nbml6ZXIgb3ZlcnJpZGVzCisgKi8KK3N0YXRpYyB2b2lkCQkJCW1pc21hdGNoCSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiB0dHlwZSwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpOworCisvKiBUcmVlIHBhcnNlciBBUEkKKyAqLworc3RhdGljIHZvaWQJCQlzZXRUcmVlTm9kZVN0cmVhbQkgICAgKHBBTlRMUjNfVFJFRV9QQVJTRVIgcGFyc2VyLCBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGlucHV0KTsKK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNCQorCQkJCQlnZXRUcmVlTm9kZVN0cmVhbQkgICAgKHBBTlRMUjNfVFJFRV9QQVJTRVIgcGFyc2VyKTsKK3N0YXRpYyB2b2lkCQkJZnJlZVBhcnNlcgkJCQkocEFOVExSM19UUkVFX1BBUlNFUiBwYXJzZXIpOyAgICAKK3N0YXRpYyB2b2lkICoJCWdldEN1cnJlbnRJbnB1dFN5bWJvbAkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNIGlzdHJlYW0pOworc3RhdGljIHZvaWQgKgkJZ2V0TWlzc2luZ1N5bWJvbAkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfSU5UX1NUUkVBTQlpc3RyZWFtLCBwQU5UTFIzX0VYQ0VQVElPTgllLAorCQkJCQkJCQkJCQkJQU5UTFIzX1VJTlQzMiBleHBlY3RlZFRva2VuVHlwZSwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpOworCisKK0FOVExSM19BUEkgcEFOVExSM19UUkVFX1BBUlNFUgorYW50bHIzVHJlZVBhcnNlck5ld1N0cmVhbShBTlRMUjNfVUlOVDMyIHNpemVIaW50LCBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGN0bnN0cmVhbSwgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZSkKK3sKKwlwQU5UTFIzX1RSRUVfUEFSU0VSCSAgICBwYXJzZXI7CisKKwkvKiogQWxsb2NhdGUgdHJlZSBwYXJzZXIgbWVtb3J5CisJKi8KKwlwYXJzZXIgID0ocEFOVExSM19UUkVFX1BBUlNFUikgQU5UTFIzX01BTExPQyhzaXplb2YoQU5UTFIzX1RSRUVfUEFSU0VSKSk7CisKKwlpZgkocGFyc2VyID09IE5VTEwpCisJeworCQlyZXR1cm4JTlVMTDsKKwl9CisKKwkvKiBDcmVhdGUgYW5kIGluc3RhbGwgYSBiYXNlIHJlY29nbml6ZXIgd2hpY2ggZG9lcyBtb3N0IG9mIHRoZSB3b3JrIGZvciB1cworCSovCisJcGFyc2VyLT5yZWMgPSAgYW50bHIzQmFzZVJlY29nbml6ZXJOZXcoQU5UTFIzX1RZUEVfUEFSU0VSLCBzaXplSGludCwgc3RhdGUpOworCisJaWYJKHBhcnNlci0+cmVjID09IE5VTEwpCisJeworCQlwYXJzZXItPmZyZWUocGFyc2VyKTsKKwkJcmV0dXJuCU5VTEw7CisJfQorCisJLyogRW5zdXJlIHdlIGNhbiB0cmFjayBiYWNrIHRvIHRoZSB0cmVlIHBhcnNlciBzdXBlciBzdHJ1Y3R1cmUKKwkqIGZyb20gdGhlIGJhc2UgcmVjb2duaXplciBzdHJ1Y3R1cmUKKwkqLworCXBhcnNlci0+cmVjLT5zdXBlcgk9IHBhcnNlcjsKKwlwYXJzZXItPnJlYy0+dHlwZQk9IEFOVExSM19UWVBFX1RSRUVfUEFSU0VSOworCisJLyogSW5zdGFsbCBvdXIgYmFzZSByZWNvZ25pemVyIG92ZXJyaWRlcworCSovCisJcGFyc2VyLT5yZWMtPm1pc21hdGNoCQkJCT0gbWlzbWF0Y2g7CisJcGFyc2VyLT5yZWMtPmV4Q29uc3RydWN0CQkJPSBhbnRscjNNVE5FeGNlcHRpb25OZXc7CisJcGFyc2VyLT5yZWMtPmdldEN1cnJlbnRJbnB1dFN5bWJvbAk9IGdldEN1cnJlbnRJbnB1dFN5bWJvbDsKKwlwYXJzZXItPnJlYy0+Z2V0TWlzc2luZ1N5bWJvbAkJPSBnZXRNaXNzaW5nU3ltYm9sOworCisJLyogSW5zdGFsbCB0cmVlIHBhcnNlciBBUEkKKwkqLworCXBhcnNlci0+Z2V0VHJlZU5vZGVTdHJlYW0JPSAgZ2V0VHJlZU5vZGVTdHJlYW07CisJcGFyc2VyLT5zZXRUcmVlTm9kZVN0cmVhbQk9ICBzZXRUcmVlTm9kZVN0cmVhbTsKKwlwYXJzZXItPmZyZWUJCT0gIGZyZWVQYXJzZXI7CisKKwkvKiBJbnN0YWxsIHRoZSB0cmVlIG5vZGUgc3RyZWFtCisJKi8KKwlwYXJzZXItPnNldFRyZWVOb2RlU3RyZWFtKHBhcnNlciwgY3Ruc3RyZWFtKTsKKworCXJldHVybiAgcGFyc2VyOworfQorCisvKioKKyAqIFxicmllZgorICogQ3JlYXRlcyBhIG5ldyBNaXNtYXRjaGVkIFRyZWUgTmRlIEV4Y2VwdGlvbiBhbmQgaW5zZXJ0cyBpbiB0aGUgcmVjb2duaXplcgorICogZXhjZXB0aW9uIHN0YWNrLgorICogCisgKiBccGFyYW0gcmVjb2duaXplcgorICogQ29udGV4dCBwb2ludGVyIGZvciB0aGlzIHJlY29nbml6ZXIKKyAqIAorICovCitBTlRMUjNfQVBJCXZvaWQKK2FudGxyM01UTkV4Y2VwdGlvbk5ldyhwQU5UTFIzX0JBU0VfUkVDT0dOSVpFUiByZWNvZ25pemVyKQoreworICAgIC8qIENyZWF0ZSBhIGJhc2ljIHJlY29nbml0aW9uIGV4Y2VwdGlvbiBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBhbnRscjNSZWNvZ25pdGlvbkV4Y2VwdGlvbk5ldyhyZWNvZ25pemVyKTsKKworICAgIC8qIE5vdyB1cGRhdGUgaXQgdG8gaW5kaWNhdGUgdGhpcyBpcyBhIE1pc21hdGNoZWQgdG9rZW4gZXhjZXB0aW9uCisgICAgICovCisgICAgcmVjb2duaXplci0+c3RhdGUtPmV4Y2VwdGlvbi0+bmFtZQkJPSBBTlRMUjNfTUlTTUFUQ0hFRF9UUkVFX05PREVfTkFNRTsKKyAgICByZWNvZ25pemVyLT5zdGF0ZS0+ZXhjZXB0aW9uLT50eXBlCQk9IEFOVExSM19NSVNNQVRDSEVEX1RSRUVfTk9ERV9FWENFUFRJT047CisKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK2ZyZWVQYXJzZXIJKHBBTlRMUjNfVFJFRV9QQVJTRVIgcGFyc2VyKQoreworCWlmCShwYXJzZXItPnJlYyAhPSBOVUxMKQorCXsKKwkJLy8gVGhpcyBtYXkgaGF2ZSBiZW4gYSBkZWxlZ2F0ZSBvciBkZWxlZ2F0b3IgcGFyc2VyLCBpbiB3aGljaCBjYXNlIHRoZQorCQkvLyBzdGF0ZSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZnJlZWQgKGFuZCBzZXQgdG8gTlVMTCB0aGVyZWZvcmUpCisJCS8vIHNvIHdlIGlnbm9yZSB0aGUgc3RhdGUgaWYgd2UgZG9uJ3QgaGF2ZSBpdC4KKwkJLy8KKwkJaWYJKHBhcnNlci0+cmVjLT5zdGF0ZSAhPSBOVUxMKQorCQl7CisJCQlpZgkocGFyc2VyLT5yZWMtPnN0YXRlLT5mb2xsb3dpbmcgIT0gTlVMTCkKKwkJCXsKKwkJCQlwYXJzZXItPnJlYy0+c3RhdGUtPmZvbGxvd2luZy0+ZnJlZShwYXJzZXItPnJlYy0+c3RhdGUtPmZvbGxvd2luZyk7CisJCQkJcGFyc2VyLT5yZWMtPnN0YXRlLT5mb2xsb3dpbmcgPSBOVUxMOworCQkJfQorCQl9CisJICAgIHBhcnNlci0+cmVjLT5mcmVlKHBhcnNlci0+cmVjKTsKKwkgICAgcGFyc2VyLT5yZWMJPSBOVUxMOworICAgIH0KKworICAgIEFOVExSM19GUkVFKHBhcnNlcik7Cit9CisKKy8qKiBTZXQgdGhlIGlucHV0IHN0cmVhbSBhbmQgcmVzZXQgdGhlIHBhcnNlcgorICovCitzdGF0aWMgdm9pZAorc2V0VHJlZU5vZGVTdHJlYW0JKHBBTlRMUjNfVFJFRV9QQVJTRVIgcGFyc2VyLCBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNIGlucHV0KQoreworICAgIHBhcnNlci0+Y3Ruc3RyZWFtID0gaW5wdXQ7CisgICAgcGFyc2VyLT5yZWMtPnJlc2V0CQkocGFyc2VyLT5yZWMpOworICAgIHBhcnNlci0+Y3Ruc3RyZWFtLT5yZXNldAkocGFyc2VyLT5jdG5zdHJlYW0pOworfQorCisvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaW5wdXQgc3RyZWFtCisgKi8KK3N0YXRpYyBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNCitnZXRUcmVlTm9kZVN0cmVhbQkocEFOVExSM19UUkVFX1BBUlNFUiBwYXJzZXIpCit7CisgICAgcmV0dXJuICBwYXJzZXItPmN0bnN0cmVhbTsKK30KKworCisvKiogT3ZlcnJpZGUgZm9yIHN0YW5kYXJkIGJhc2UgcmVjb2duaXplciBtaXNtYXRjaCBmdW5jdGlvbgorICogIGFzIHdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm8sCisgKiAgcGx1cyB3ZSB3YW50IHRvIGFsdGVyIHRoZSBleGNlcHRpb24gdHlwZS4KKyAqLworc3RhdGljIHZvaWQKK21pc21hdGNoCSAgICAocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgQU5UTFIzX1VJTlQzMiB0dHlwZSwgcEFOVExSM19CSVRTRVRfTElTVCBmb2xsb3cpCit7CisgICAgcmVjb2duaXplci0+ZXhDb25zdHJ1Y3QocmVjb2duaXplcik7CisgICAgcmVjb2duaXplci0+cmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4ocmVjb2duaXplciwgdHR5cGUsIGZvbGxvdyk7Cit9CisKKyNpZmRlZiBBTlRMUjNfV0lORE9XUworI3ByYWdtYSB3YXJuaW5nCShwdXNoKQorI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDEwMCkKKyNlbmRpZgorCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciBwYXJzZXIgYW5kIGFzc3VtZXMgYSB0b2tlbiBzdHJlYW0gYXMgc3VwcGxpZWQgYnkgdGhlIHJ1bnRpbWUuCisvLyBZb3UgTUFZIG5lZWQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpZiB0aGUgc3RhbmRhcmQgVE9LRU5fU1RSRUFNIGlzIG5vdCB3aGF0IHlvdSBhcmUgdXNpbmcuCisvLworc3RhdGljIHZvaWQgKgkJCQkKK2dldEN1cnJlbnRJbnB1dFN5bWJvbAkJKHBBTlRMUjNfQkFTRV9SRUNPR05JWkVSIHJlY29nbml6ZXIsIHBBTlRMUjNfSU5UX1NUUkVBTSBpc3RyZWFtKQoreworCXBBTlRMUjNfVFJFRV9OT0RFX1NUUkVBTQkJdG5zOworICAgIHBBTlRMUjNfQ09NTU9OX1RSRUVfTk9ERV9TVFJFQU0JY3RuczsKKworICAgIHRucwkgICAgPSAocEFOVExSM19UUkVFX05PREVfU1RSRUFNKShpc3RyZWFtLT5zdXBlcik7CisgICAgY3RucyAgICA9IHRucy0+Y3RuczsKKwlyZXR1cm4gdG5zLT5fTFQodG5zLCAxKTsKK30KKworCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGZvciBwYXJzZXIgYW5kIGFzc3VtZXMgYSB0b2tlbiBzdHJlYW0gYXMgc3VwcGxpZWQgYnkgdGhlIHJ1bnRpbWUuCisvLyBZb3UgTUFZIG5lZWQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpZiB0aGUgc3RhbmRhcmQgQkFTRV9UUkVFIGlzIG5vdCB3aGF0IHlvdSBhcmUgdXNpbmcuCisvLworc3RhdGljIHZvaWQgKgkJCQkKK2dldE1pc3NpbmdTeW1ib2wJCQkocEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNCWlzdHJlYW0sIHBBTlRMUjNfRVhDRVBUSU9OCWUsCisJCQkJCQkJCQlBTlRMUjNfVUlOVDMyIGV4cGVjdGVkVG9rZW5UeXBlLCBwQU5UTFIzX0JJVFNFVF9MSVNUIGZvbGxvdykKK3sKKwlwQU5UTFIzX1RSRUVfTk9ERV9TVFJFQU0JCXRuczsKKyAgICBwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNCWN0bnM7CisJcEFOVExSM19CQVNFX1RSRUUJCQkJbm9kZTsKKwlwQU5UTFIzX0JBU0VfVFJFRQkJCQljdXJyZW50OworCXBBTlRMUjNfQ09NTU9OX1RPS0VOCQkJdG9rZW47CisJcEFOVExSM19TVFJJTkcJCQkJCXRleHQ7CisgICAgQU5UTFIzX0lOVDMyICAgICAgICAgICAgICAgICAgIGk7CisKKwkvLyBEZXJlZmVyZW5jZSB0aGUgc3RhbmRhcmQgcG9pbnRlcnMKKwkvLworICAgIHRucwkgICAgPSAocEFOVExSM19UUkVFX05PREVfU1RSRUFNKShpc3RyZWFtLT5zdXBlcik7CisgICAgY3RucyAgICA9IHRucy0+Y3RuczsKKyAgICAKKwkvLyBDcmVhdGUgYSBuZXcgZW1wdHkgbm9kZSwgYnkgc3RlYWxpbmcgdGhlIGN1cnJlbnQgb25lLCBvciB0aGUgcHJldmlvdXMgb25lIGlmIHRoZSBjdXJyZW50IG9uZSBpcyBFT0YKKwkvLworCWN1cnJlbnQJPSB0bnMtPl9MVCh0bnMsIDEpOworICAgIGkgICAgICAgPSAtMTsKKworCWlmCShjdXJyZW50ID09ICZjdG5zLT5FT0ZfTk9ERS5iYXNlVHJlZSkKKwl7CisJCWN1cnJlbnQgPSB0bnMtPl9MVCh0bnMsIC0xKTsKKyAgICAgICAgaS0tOworCX0KKyAgICB3aGlsZSAoKChwQU5UTFIzX0NPTU1PTl9UUkVFKShjdXJyZW50LT5zdXBlcikpLT5mYWN0b3J5ID09IE5VTEwpCisJeworCQljdXJyZW50ID0gdG5zLT5fTFQodG5zLCBpLS0pOworICAgIH0KKworCW5vZGUJPSBjdXJyZW50LT5kdXBOb2RlKGN1cnJlbnQpOworCisJLy8gRmluZCB0aGUgbmV3bHkgZHVwaWNhdGVkIHRva2VuCisJLy8KKwl0b2tlbgk9IG5vZGUtPmdldFRva2VuKG5vZGUpOworCisJLy8gQ3JlYXRlIHRoZSB0b2tlbiB0ZXh0IHRoYXQgc2hvd3MgaXQgaGFzIGJlZW4gaW5zZXJ0ZWQKKwkvLworCXRva2VuLT5zZXRUZXh0OAkJCSh0b2tlbiwgKHBBTlRMUjNfVUlOVDgpIjxtaXNzaW5nICIpOworCXRleHQgPSB0b2tlbi0+Z2V0VGV4dAkodG9rZW4pOworCXRleHQtPmFwcGVuZDgJCQkodGV4dCwgKGNvbnN0IGNoYXIgKilyZWNvZ25pemVyLT5zdGF0ZS0+dG9rZW5OYW1lc1tleHBlY3RlZFRva2VuVHlwZV0pOworCXRleHQtPmFwcGVuZDgJCQkodGV4dCwgKGNvbnN0IGNoYXIgKikiPiIpOworCQorCS8vIEZpbmFsbHkgcmV0dXJuIHRoZSBwb2ludGVyIHRvIG91ciBuZXcgbm9kZQorCS8vCisJcmV0dXJuCW5vZGU7Cit9CisjaWZkZWYgQU5UTFIzX1dJTkRPV1MKKyNwcmFnbWEgd2FybmluZwkocG9wKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvdnNydWxlZmlsZXMvYW50bHIzbGV4ZXIucnVsZXMgYi9hbnRsci0zLjQvcnVudGltZS9DL3ZzcnVsZWZpbGVzL2FudGxyM2xleGVyLnJ1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGZlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DL3ZzcnVsZWZpbGVzL2FudGxyM2xleGVyLnJ1bGVzCkBAIC0wLDAgKzEsMTk5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFZpc3VhbFN0dWRpb1Rvb2xGaWxlCisJTmFtZT0iQU5UTFIzIExleGVyIgorCVZlcnNpb249IjguMDAiCisJPgorCTxSdWxlcz4KKwkJPEN1c3RvbUJ1aWxkUnVsZQorCQkJTmFtZT0iQW50bHIzTGV4ZXIiCisJCQlEaXNwbGF5TmFtZT0iQU5UTFIgMyBMZXhlciBHcmFtbWFyIFRyYW5zbGF0aW9uIgorCQkJQ29tbWFuZExpbmU9IltqYXZhXSBbSmF2YU9wdGlvbnNdIFtBTlRMUjNKYXJdIG9yZy5hbnRsci5Ub29sIFtMaWJEaXJdIC1bQWJzb2x1dGVdbyBbT3V0cHV0RGlyZWN0b3J5XSAtbWVzc2FnZS1mb3JtYXQgdnMyMDA1IFtERkFdIFtORkFdIFtSZXBvcnRdIFtQcmludF0gW0RlYnVnXSBbUHJvZmlsZV0gW0FTVF0gW1RleHRERkFdIFtFQk5GRXhpdHNdIFtDb2xsYXBzZUVkZ2VzXSBbRGVidWdORkFdIFtNYXhSdWxlc10gW01heERGQUVkZ2VzXSBbREZBVGltZW91dF0gW2lucHV0c10iCisJCQlPdXRwdXRzPSJbT3V0cHV0RGlyZWN0b3J5XVwkKElucHV0TmFtZSkuYztbT3V0cHV0RGlyZWN0b3J5XVwkKElucHV0TmFtZSkuaCIKKwkJCUZpbGVFeHRlbnNpb25zPSIqLmczbDsqLmdsOyouZyIKKwkJCUV4ZWN1dGlvbkRlc2NyaXB0aW9uPSJUcmFuc2xhdGluZyB0byBsZXhlci4iCisJCQlTdXBwb3J0c0ZpbGVCYXRjaGluZz0idHJ1ZSIKKwkJCT4KKwkJCTxQcm9wZXJ0aWVzPgorCQkJCTxTdHJpbmdQcm9wZXJ0eQorCQkJCQlOYW1lPSJKYXZhT3B0aW9ucyIKKwkJCQkJRGlzcGxheU5hbWU9IkphdmEgVk0gT3B0aW9ucyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iSmF2YSIKKwkJCQkJRGVzY3JpcHRpb249IlNwZWNpZnkgYW55IG9wdGlvbnMgcmVxdWlyZWQgdG8gaW52b2tlIHRoZSBqYXZhIFZNIG9uIHRoaXMgZ3JhbW1hciBmaWxlLiBTb21ldGltZXMgbGFyZ2VyIGdyYW1tYXJzIHJlcXVpcmUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgc3RhbmRhcmQgYWxsb2NhdGlvbiBhbmQgeW91IGNhbiBzcGVjaWZ5IHRoaXMgaGVyZS4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iW3ZhbHVlXSIKKwkJCQkJRGVsaW1pdGVkPSJ0cnVlIgorCQkJCQlJbmhlcml0YWJsZT0idHJ1ZSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iREZBIgorCQkJCQlEaXNwbGF5TmFtZT0iR2VuZXJhdGUgREZBIGRvdHMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkRPVCIKKwkJCQkJQ2F0ZWdvcnk9IkRPVCBPdXB1dHMiCisJCQkJCURlc2NyaXB0aW9uPSJXaGVuIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIHByb2R1Y2UgYSBudW1iZXIgb2YgLmRvdCBmaWxlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggZG90L2dyYXBodml6IHRvIGdlbnJlYXRlIHBpY3RvcmlhbCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIERGQXMgZ25lcmF0ZWQgZm9yIHRoaXMgZ3JhbW1hci4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLWRmYSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iTkZBIgorCQkJCQlEaXNwbGF5TmFtZT0iR2VuZXJhdGUgTkZBIERPVHMiCisJCQkJCUNhdGVnb3J5PSJET1QgT3V0cHV0cyIKKwkJCQkJRGVzY3JpcHRpb249IldoZW4gc2V0IHRvIFRydWUgQU5UTFIzIHdpbGwgcHJvZHVjZSBhIG51bWJlciBvZiAuZG90IGZpbGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBkb3QvZ3JhcGh2aXogdG8gZ2VucmVhdGUgcGljdG9yaWFsIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgTkZBcyBnZW5lcmF0ZWQgZm9yIHRoaXMgZ3JhbW1hci4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLW5mYSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iUmVwb3J0IgorCQkJCQlEaXNwbGF5TmFtZT0iR2VuZXJhdGUgUmVwb3J0IgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJSZXBvcnRpbmciCisJCQkJCUNhdGVnb3J5PSJSZXBvcnRpbmciCisJCQkJCURlc2NyaXB0aW9uPSJJZiBzZXQgdG8gVHJ1ZSB0aGVuIEFOVExSMyB3aWxsIGdlbmVyYXRlIHJlcG9ydHMgYWJvdXQgdGhlIGdyYW1tYXIgZmlsZShzKSBpdCBwcm9jZXNzZXMuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1yZXBvcnQiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlByaW50IgorCQkJCQlEaXNwbGF5TmFtZT0iUHJpbnQgZ3JhbW1hciIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iUmVwb3J0aW5nIgorCQkJCQlDYXRlZ29yeT0iUmVwb3J0aW5nIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgc2V0IHRvIFRydWUgQU5UTFIzIHdpbGwgcHJpbnQgb3V0IHRoZSBncmFtbWFyIHdpdGhvdXQgdGhlIGFzc29jaWF0ZWQgYWN0aW9ucyIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItcHJpbnQiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkRlYnVnIgorCQkJCQlEaXNwbGF5TmFtZT0iRGVidWcgbW9kZSIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iQ29kZSBHZW5lcmF0aW9uIgorCQkJCQlDYXRlZ29yeT0iT3V0cHV0IgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgc2V0IHRvIFRydWUgQU5UTFIzIHdpbGwgZ2VuZXJhdGUgY29kZSB0aGF0IGZpcmVzIGRlYnVnZ2luZyBldmVudHMuIFtKSSAtIE5vdCB5ZXQgaW1wbGVtZW50ZWRdIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1kZWJ1ZyIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iUHJvZmlsZSIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIHByb2ZpbGUiCisJCQkJCUNhdGVnb3J5PSJPdXRwdXQiCisJCQkJCURlc2NyaXB0aW9uPSJJZiBzZXQgdG8gVHJ1ZSBBTlRMUjMgd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgY29tcHV0ZXMgcHJvZmlsaW5nIGluZm9ybWF0aW9uIFtKSSAtIG5vdCB5ZXQgaW1wbGVtZW50ZWRdIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1wcm9maWxlIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJBU1QiCisJCQkJCURpc3BsYXlOYW1lPSJTaG93IEFTVCIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUgQU5UTFIzIHdpbGwgcHJpbnQgb3V0IHRoZSBncmFtbWFyIEFTVCIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWGdydHJlZSIKKwkJCQkvPgorCQkJCTxTdHJpbmdQcm9wZXJ0eQorCQkJCQlOYW1lPSJMaWJEaXIiCisJCQkJCURpc3BsYXlOYW1lPSJUb2tlbiBkaXJlY3RvcnkiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkNvZGUgR2VuZXJhdGlvbiIKKwkJCQkJQ2F0ZWdvcnk9IkdlbmVyYWwiCisJCQkJCURlc2NyaXB0aW9uPSJJbiB3aGljaCBkaXJlY3RvcnkgY2FuIEFOVExSMyBsb2NhdGUgZ3JhbW1hciB0b2tlbiBmaWxlcyBpZiBub3QgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBncmFtbWFyIGZpbGUuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1saWIgW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSIkKElucHV0RGlyKSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iVGV4dERGQSIKKwkJCQkJRGlzcGxheU5hbWU9IlRleHQgREZBIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkV4dGVuZGVkIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgVHJ1ZSBBTlRMUjMgd2lsbCBnZW5lcmF0ZSBhIHRleHQgdmVyc2lvbiBvZiB0aGUgREZBc2ZvciB0aGlzIGdyYW1tYXIuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1YZGZhIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJFQk5GRXhpdHMiCisJCQkJCURpc3BsYXlOYW1lPSJFQk5GIEV4aXRzIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkV4dGVuZGVkIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgVHJ1ZSBBTlRMUjMgd2lsbCBub3QgdGVzdCBFQk5GIGV4aXQgYnJhbmNoZXMuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1Ybm9wcnVuZSIKKwkJCQkvPgorCQkJCTxTdHJpbmdQcm9wZXJ0eQorCQkJCQlOYW1lPSJPdXRwdXREaXJlY3RvcnkiCisJCQkJCURpc3BsYXlOYW1lPSJPdXRwdXQgRGlyZWN0b3J5IgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJDb2RlIEdlbmVyYXRpb24iCisJCQkJCURlc2NyaXB0aW9uPSJXaGljaCBkaXJlY3RvcnkgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZXMgYmUgc2VudCB0byBpZiBub3QgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBncmFtbWFyIGZpbGUuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ilt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iJChJbnB1dERpcikiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkNvbGxhcHNlRWRnZXMiCisJCQkJCURpc3BsYXlOYW1lPSJDb2xsYXBzZSBFZGdlcyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IkNvbGxhcHNlIGluY2lkZW50IGVkZ2VzIGludG8gREZBIHN0YXRlcyIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG5vY29sbGFwc2UiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkRlYnVnTkZBIgorCQkJCQlEaXNwbGF5TmFtZT0iRGVidWcgTkZBIgorCQkJCQlDYXRlZ29yeT0iUmVwb3J0aW5nIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgVHJ1ZSwgQU5UTFIzIHdpbGwgZHVtcCBsb3RzIG9mIGluZm9ybWF0aW9uIHRvIHRoZSBzY3JlZW4gZHVyaW5nIE5GQSBjb252ZXJzaW9uLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWGRiZ2NvbnZlcnNpb24gIgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkFOVExSM0phciIKKwkJCQkJRGlzcGxheU5hbWU9IkFOVExSMyBKYXIiCisJCQkJCUNhdGVnb3J5PSJKYXZhVk0iCisJCQkJCURlc2NyaXB0aW9uPSJTcGVjaWZpZXMgdGhlIGFic29sdXRlIGxvY2F0aW9uIG9mIHRoZSBBTlRMUjMgamFyIGZpbGUgaWYgaXQgaXMgbm90IGluIGEgbG9jYXRpb24gY292ZXJlZCBieSAlQ0xBU1NQQVRIJS4gU3BlY2lmeSB1c2luZyBVTklYIGRpcmVjdG9yeSBkZWxpbWl0ZXJzIHRvIG1pbmltaXplIHByb2JsZW1zLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItamFyICZxdW90O1t2YWx1ZV0mcXVvdDsiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iSmF2YSIKKwkJCQkJRGlzcGxheU5hbWU9IkphdmEgY29tbWFuZCIKKwkJCQkJRGVzY3JpcHRpb249IlNwZWNpZmllcyB0aGUgY29tbWFuZCB0aGF0IGludm9rZXMgdGhlIGphdmEgVk0uIFVzdWFsbHkgamF2YSwgYnV0IGNvdWxkIGJlIHNvbWV0aGluZyBlbHNlIHN1Y2ggYXMgamlrZXMiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSJqYXZhIgorCQkJCS8+CisJCQkJPEludGVnZXJQcm9wZXJ0eQorCQkJCQlOYW1lPSJNYXhSdWxlcyIKKwkJCQkJRGlzcGxheU5hbWU9Ik1heCBydWxlIGNhbGwiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iQW5hbHlzaXMiCisJCQkJCURlc2NyaXB0aW9uPSJNYXhpbXVtIG51bWJlciBvZiBydWxlIGludm9jYXRpb25zIGR1cmluZyBjb252ZXJzaW9uIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1YbSBbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IjQiCisJCQkJLz4KKwkJCQk8SW50ZWdlclByb3BlcnR5CisJCQkJCU5hbWU9Ik1heERGQUVkZ2VzIgorCQkJCQlEaXNwbGF5TmFtZT0iTWF4IERGQSBFZGdlcyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249Ik1heGltdW0gJnF1b3Q7Y29tZm9ydGFibGUmcXVvdDsgbnVtYmVyIG9mIGVkZ2VzIGZvciBzaW5nbGUgREZBIHN0YXRlIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1YbWF4ZGZhZWRnZXMgW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSI2NTUzNCIKKwkJCQkvPgorCQkJCTxJbnRlZ2VyUHJvcGVydHkKKwkJCQkJTmFtZT0iREZBVGltZW91dCIKKwkJCQkJRGlzcGxheU5hbWU9IkRGQSBUaW1lb3V0IgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkV4dGVuZGVkIgorCQkJCQlEZXNjcmlwdGlvbj0iREZBIGNvbnZlcnNpb24gdGltZW91dCBwZXJpb2QgZm9yIGVhY2ggZGVjaXNpb24uIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1YY29udmVyc2lvbnRpbWVvdXQgW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSIxMDAwIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJBYnNvbHV0ZSIKKwkJCQkJRGlzcGxheU5hbWU9IkFic29sdXRlIERpcmVjdG9yaWVzIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJDb2RlIEdlbmVyYXRpb24iCisJCQkJCURlc2NyaXB0aW9uPSJJZiB0cnVlLCBjYXVzZXMgQU5UTFIgdG8gYXNzdW1lIG91dHB1dCBkaXJlY3RvcnkgaXMgYWx3YXlzIHRoZSBhYnNvbHV0ZSBvdXRwdXQgcGF0aCBhbmQgbm90IHRvIHVzZSByZWxhdGl2ZSBwYXRocyBhcyBwZXIgdGhlIGludHB1dCBzcGVjLiBGb3IgdmlzdWFsIHN0dWRpbywgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBzZXQgdG8gdHJ1ZS4iCisJCQkJCVN3aXRjaD0iZiIKKwkJCQkJRGVmYXVsdFZhbHVlPSJ0cnVlIgorCQkJCS8+CisJCQk8L1Byb3BlcnRpZXM+CisJCTwvQ3VzdG9tQnVpbGRSdWxlPgorCTwvUnVsZXM+Cis8L1Zpc3VhbFN0dWRpb1Rvb2xGaWxlPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQy92c3J1bGVmaWxlcy9hbnRscjNsZXhlcmFuZHBhcnNlci5ydWxlcyBiL2FudGxyLTMuNC9ydW50aW1lL0MvdnNydWxlZmlsZXMvYW50bHIzbGV4ZXJhbmRwYXJzZXIucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkMTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvdnNydWxlZmlsZXMvYW50bHIzbGV4ZXJhbmRwYXJzZXIucnVsZXMKQEAgLTAsMCArMSwyMDEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8VmlzdWFsU3R1ZGlvVG9vbEZpbGUKKwlOYW1lPSJBTlRMUjMgQ29tYm8gTGV4ZXIgYW5kIFBhcnNlciIKKwlWZXJzaW9uPSI4LjAwIgorCT4KKwk8UnVsZXM+CisJCTxDdXN0b21CdWlsZFJ1bGUKKwkJCU5hbWU9IkFudGxyM1BhcnNlckxleGVyIgorCQkJRGlzcGxheU5hbWU9IkFOVExSIDMgUGFyc2VyL0xleGVyIEdyYW1tYXIgVHJhbnNsYXRpb24iCisJCQlDb21tYW5kTGluZT0iW2phdmFdIFtKYXZhT3B0aW9uc10gW0FOVExSM0phcl0gb3JnLmFudGxyLlRvb2wgW0xpYkRpcl0gLVtBYnNvbHV0ZV1vIFtPdXRwdXREaXJlY3RvcnldICAtbWVzc2FnZS1mb3JtYXQgdnMyMDA1IFtERkFdIFtORkFdIFtSZXBvcnRdIFtQcmludF0gW0RlYnVnXSBbUHJvZmlsZV0gW0FTVF0gW1RleHRERkFdIFtFQk5GRXhpdHNdIFtDb2xsYXBzZUVkZ2VzXSBbRGVidWdORkFdIFtNYXhSdWxlc10gW01heERGQUVkZ2VzXSBbREZBVGltZW91dF0gW2lucHV0c10iCisJCQlPdXRwdXRzPSJbT3V0cHV0RGlyZWN0b3J5XVwkKElucHV0TmFtZSlQYXJzZXIuYztbT3V0cHV0RGlyZWN0b3J5XVwkKElucHV0TmFtZSlQYXJzZXIuaDtbT3V0cHV0RGlyZWN0b3J5XVwkKElucHV0TmFtZSlMZXhlci5jO1tPdXRwdXREaXJlY3RvcnldXCQoSW5wdXROYW1lKUxleGVyLmgiCisJCQlGaWxlRXh0ZW5zaW9ucz0iKi5nM3BsOyouZzM7Ki5nIgorCQkJRXhlY3V0aW9uRGVzY3JpcHRpb249IlRyYW5zbGF0aW5nIHRvIHBhcnNlci9sZXhlciBjb21iaW5hdGlvbiIKKwkJCVN1cHBvcnRzRmlsZUJhdGNoaW5nPSJ0cnVlIgorCQkJU2hvd09ubHlSdWxlUHJvcGVydGllcz0iZmFsc2UiCisJCQk+CisJCQk8UHJvcGVydGllcz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iSmF2YU9wdGlvbnMiCisJCQkJCURpc3BsYXlOYW1lPSJKYXZhIFZNIE9wdGlvbnMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkphdmEiCisJCQkJCURlc2NyaXB0aW9uPSJTcGVjaWZ5IGFueSBvcHRpb25zIHJlcXVpcmVkIHRvIGludm9rZSB0aGUgamF2YSBWTSBvbiB0aGlzIGdyYW1tYXIgZmlsZS4gU29tZXRpbWVzIGxhcmdlciBncmFtbWFycyByZXF1aXJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIHN0YW5kYXJkIGFsbG9jYXRpb24gYW5kIHlvdSBjYW4gc3BlY2lmeSB0aGlzIGhlcmUuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ilt2YWx1ZV0iCisJCQkJCURlbGltaXRlZD0idHJ1ZSIKKwkJCQkJSW5oZXJpdGFibGU9InRydWUiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkRGQSIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIERGQSBkb3RzIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJET1QiCisJCQkJCUNhdGVnb3J5PSJET1QgT3VwdXRzIgorCQkJCQlEZXNjcmlwdGlvbj0iV2hlbiBzZXQgdG8gVHJ1ZSBBTlRMUjMgd2lsbCBwcm9kdWNlIGEgbnVtYmVyIG9mIC5kb3QgZmlsZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGRvdC9ncmFwaHZpeiB0byBnZW5yZWF0ZSBwaWN0b3JpYWwgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBERkFzIGduZXJhdGVkIGZvciB0aGlzIGdyYW1tYXIuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1kZmEiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9Ik5GQSIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIE5GQSBET1RzIgorCQkJCQlDYXRlZ29yeT0iRE9UIE91dHB1dHMiCisJCQkJCURlc2NyaXB0aW9uPSJXaGVuIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIHByb2R1Y2UgYSBudW1iZXIgb2YgLmRvdCBmaWxlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggZG90L2dyYXBodml6IHRvIGdlbnJlYXRlIHBpY3RvcmlhbCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIE5GQXMgZ2VuZXJhdGVkIGZvciB0aGlzIGdyYW1tYXIuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1uZmEiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlJlcG9ydCIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIFJlcG9ydCIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iUmVwb3J0aW5nIgorCQkJCQlDYXRlZ29yeT0iUmVwb3J0aW5nIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgc2V0IHRvIFRydWUgdGhlbiBBTlRMUjMgd2lsbCBnZW5lcmF0ZSByZXBvcnRzIGFib3V0IHRoZSBncmFtbWFyIGZpbGUocykgaXQgcHJvY2Vzc2VzLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItcmVwb3J0IgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJQcmludCIKKwkJCQkJRGlzcGxheU5hbWU9IlByaW50IGdyYW1tYXIiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IlJlcG9ydGluZyIKKwkJCQkJQ2F0ZWdvcnk9IlJlcG9ydGluZyIKKwkJCQkJRGVzY3JpcHRpb249IklmIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIHByaW50IG91dCB0aGUgZ3JhbW1hciB3aXRob3V0IHRoZSBhc3NvY2lhdGVkIGFjdGlvbnMiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLXByaW50IgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJEZWJ1ZyIKKwkJCQkJRGlzcGxheU5hbWU9IkRlYnVnIG1vZGUiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkNvZGUgR2VuZXJhdGlvbiIKKwkJCQkJQ2F0ZWdvcnk9Ik91dHB1dCIKKwkJCQkJRGVzY3JpcHRpb249IklmIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdCBmaXJlcyBkZWJ1Z2dpbmcgZXZlbnRzLiBbSkkgLSBOb3QgeWV0IGltcGxlbWVudGVkXSIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItZGVidWciCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlByb2ZpbGUiCisJCQkJCURpc3BsYXlOYW1lPSJHZW5lcmF0ZSBwcm9maWxlIgorCQkJCQlDYXRlZ29yeT0iT3V0cHV0IgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgc2V0IHRvIFRydWUgQU5UTFIzIHdpbGwgZ2VuZXJhdGUgY29kZSB0aGF0IGNvbXB1dGVzIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBbSkkgLSBub3QgeWV0IGltcGxlbWVudGVkXSIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItcHJvZmlsZSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iQVNUIgorCQkJCQlEaXNwbGF5TmFtZT0iU2hvdyBBU1QiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJJZiBUcnVlIEFOVExSMyB3aWxsIHByaW50IG91dCB0aGUgZ3JhbW1hciBBU1QiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhncnRyZWUiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iTGliRGlyIgorCQkJCQlEaXNwbGF5TmFtZT0iVG9rZW4gZGlyZWN0b3J5IgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJDb2RlIEdlbmVyYXRpb24iCisJCQkJCUNhdGVnb3J5PSJHZW5lcmFsIgorCQkJCQlEZXNjcmlwdGlvbj0iSW4gd2hpY2ggZGlyZWN0b3J5IGNhbiBBTlRMUjMgbG9jYXRlIGdyYW1tYXIgdG9rZW4gZmlsZXMgaWYgbm90IGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ3JhbW1hciBmaWxlLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItbGliIFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iJChJbnB1dERpcikiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlRleHRERkEiCisJCQkJCURpc3BsYXlOYW1lPSJUZXh0IERGQSIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUgQU5UTFIzIHdpbGwgZ2VuZXJhdGUgYSB0ZXh0IHZlcnNpb24gb2YgdGhlIERGQXNmb3IgdGhpcyBncmFtbWFyLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWGRmYSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iRUJORkV4aXRzIgorCQkJCQlEaXNwbGF5TmFtZT0iRUJORiBFeGl0cyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUgQU5UTFIzIHdpbGwgbm90IHRlc3QgRUJORiBleGl0IGJyYW5jaGVzLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG5vcHJ1bmUiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iT3V0cHV0RGlyZWN0b3J5IgorCQkJCQlEaXNwbGF5TmFtZT0iT3V0cHV0IERpcmVjdG9yeSIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iQ29kZSBHZW5lcmF0aW9uIgorCQkJCQlEZXNjcmlwdGlvbj0iV2hpY2ggZGlyZWN0b3J5IHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGVzIGJlIHNlbnQgdG8gaWYgbm90IHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ3JhbW1hciBmaWxlLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSJbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IiQoSW5wdXREaXIpIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJDb2xsYXBzZUVkZ2VzIgorCQkJCQlEaXNwbGF5TmFtZT0iQ29sbGFwc2UgRWRnZXMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJDb2xsYXBzZSBpbmNpZGVudCBlZGdlcyBpbnRvIERGQSBzdGF0ZXMiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhub2NvbGxhcHNlIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJEZWJ1Z05GQSIKKwkJCQkJRGlzcGxheU5hbWU9IkRlYnVnIE5GQSIKKwkJCQkJQ2F0ZWdvcnk9IlJlcG9ydGluZyIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUsIEFOVExSMyB3aWxsIGR1bXAgbG90cyBvZiBpbmZvcm1hdGlvbiB0byB0aGUgc2NyZWVuIGR1cmluZyBORkEgY29udmVyc2lvbi4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhkYmdjb252ZXJzaW9uICIKKwkJCQkvPgorCQkJCTxTdHJpbmdQcm9wZXJ0eQorCQkJCQlOYW1lPSJBTlRMUjNKYXIiCisJCQkJCURpc3BsYXlOYW1lPSJBTlRMUjMgSmFyIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJKYXZhIgorCQkJCQlDYXRlZ29yeT0iSmF2YVZNIgorCQkJCQlEZXNjcmlwdGlvbj0iU3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBsb2NhdGlvbiBvZiB0aGUgQU5UTFIzIGphciBmaWxlIGlmIGl0IGlzIG5vdCBpbiBhIGxvY2F0aW9uIGNvdmVyZWQgYnkgJUNMQVNTUEFUSCUuIFNwZWNpZnkgdXNpbmcgVU5JWCBkaXJlY3RvcnkgZGVsaW1pdGVycyB0byBtaW5pbWl6ZSBwcm9ibGVtcy4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLWphciAmcXVvdDtbdmFsdWVdJnF1b3Q7IgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkphdmEiCisJCQkJCURpc3BsYXlOYW1lPSJKYXZhIGNvbW1hbmQiCisJCQkJCURlc2NyaXB0aW9uPSJTcGVjaWZpZXMgdGhlIGNvbW1hbmQgdGhhdCBpbnZva2VzIHRoZSBqYXZhIFZNLiBVc3VhbGx5IGphdmEsIGJ1dCBjb3VsZCBiZSBzb21ldGhpbmcgZWxzZSBzdWNoIGFzIGppa2VzIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ilt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iamF2YSIKKwkJCQkvPgorCQkJCTxJbnRlZ2VyUHJvcGVydHkKKwkJCQkJTmFtZT0iTWF4UnVsZXMiCisJCQkJCURpc3BsYXlOYW1lPSJNYXggcnVsZSBjYWxsIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkFuYWx5c2lzIgorCQkJCQlEZXNjcmlwdGlvbj0iTWF4aW11bSBudW1iZXIgb2YgcnVsZSBpbnZvY2F0aW9ucyBkdXJpbmcgY29udmVyc2lvbiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG0gW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSI0IgorCQkJCS8+CisJCQkJPEludGVnZXJQcm9wZXJ0eQorCQkJCQlOYW1lPSJNYXhERkFFZGdlcyIKKwkJCQkJRGlzcGxheU5hbWU9Ik1heCBERkEgRWRnZXMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJNYXhpbXVtICZxdW90O2NvbWZvcnRhYmxlJnF1b3Q7IG51bWJlciBvZiBlZGdlcyBmb3Igc2luZ2xlIERGQSBzdGF0ZSIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG1heGRmYWVkZ2VzIFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iNjU1MzQiCisJCQkJLz4KKwkJCQk8SW50ZWdlclByb3BlcnR5CisJCQkJCU5hbWU9IkRGQVRpbWVvdXQiCisJCQkJCURpc3BsYXlOYW1lPSJERkEgVGltZW91dCIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IkRGQSBjb252ZXJzaW9uIHRpbWVvdXQgcGVyaW9kIGZvciBlYWNoIGRlY2lzaW9uLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWGNvbnZlcnNpb250aW1lb3V0IFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iMTAwMCIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iQWJzb2x1dGUiCisJCQkJCURpc3BsYXlOYW1lPSJBYnNvbHV0ZSBEaXJlY3RvcmllcyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iQ29kZSBHZW5lcmF0aW9uIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgdHJ1ZSwgY2F1c2VzIEFOVExSIHRvIGFzc3VtZSBvdXRwdXQgZGlyZWN0b3J5IGlzIGFsd2F5cyB0aGUgYWJzb2x1dGUgb3V0cHV0IHBhdGggYW5kIG5vdCB0byB1c2UgcmVsYXRpdmUgcGF0aHMgYXMgcGVyIHRoZSBpbnRwdXQgc3BlYy4gRm9yIHZpc3VhbCBzdHVkaW8sIHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgc2V0IHRvIHRydWUuIgorCQkJCQlTd2l0Y2g9ImYiCisJCQkJCURlZmF1bHRWYWx1ZT0idHJ1ZSIKKwkJCQkvPgorCQkJPC9Qcm9wZXJ0aWVzPgorCQk8L0N1c3RvbUJ1aWxkUnVsZT4KKwk8L1J1bGVzPgorPC9WaXN1YWxTdHVkaW9Ub29sRmlsZT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0MvdnNydWxlZmlsZXMvYW50bHIzcGFyc2VyLnJ1bGVzIGIvYW50bHItMy40L3J1bnRpbWUvQy92c3J1bGVmaWxlcy9hbnRscjNwYXJzZXIucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMjk0NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvdnNydWxlZmlsZXMvYW50bHIzcGFyc2VyLnJ1bGVzCkBAIC0wLDAgKzEsMjAxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFZpc3VhbFN0dWRpb1Rvb2xGaWxlCisJTmFtZT0iQU5UTFIzIFBhcnNlciIKKwlWZXJzaW9uPSI4LjAwIgorCT4KKwk8UnVsZXM+CisJCTxDdXN0b21CdWlsZFJ1bGUKKwkJCU5hbWU9IkFudGxyM1BhcnNlciIKKwkJCURpc3BsYXlOYW1lPSJBTlRMUiAzIFBhcnNlciBHcmFtbWFyIFRyYW5zbGF0aW9uIgorCQkJQ29tbWFuZExpbmU9IltqYXZhXSBbSmF2YU9wdGlvbnNdIFtBTlRMUjNKYXJdIG9yZy5hbnRsci5Ub29sIFtMaWJEaXJdIC1bQWJzb2x1dGVdbyBbT3V0cHV0RGlyZWN0b3J5XSAgLW1lc3NhZ2UtZm9ybWF0IHZzMjAwNSBbREZBXSBbTkZBXSBbUmVwb3J0XSBbUHJpbnRdIFtEZWJ1Z10gW1Byb2ZpbGVdIFtBU1RdIFtUZXh0REZBXSBbRUJORkV4aXRzXSBbQ29sbGFwc2VFZGdlc10gW0RlYnVnTkZBXSBbTWF4UnVsZXNdIFtNYXhERkFFZGdlc10gW0RGQVRpbWVvdXRdIFtpbnB1dHNdIgorCQkJT3V0cHV0cz0iW091dHB1dERpcmVjdG9yeV1cJChJbnB1dE5hbWUpLmM7W091dHB1dERpcmVjdG9yeV1cJChJbnB1dE5hbWUpLmgiCisJCQlGaWxlRXh0ZW5zaW9ucz0iKi5nM3A7Ki5ncDsqLmciCisJCQlFeGVjdXRpb25EZXNjcmlwdGlvbj0iVHJhbnNsYXRpbmcgdG8gcGFyc2VyLiIKKwkJCVN1cHBvcnRzRmlsZUJhdGNoaW5nPSJ0cnVlIgorCQkJPgorCQkJPFByb3BlcnRpZXM+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkphdmFPcHRpb25zIgorCQkJCQlEaXNwbGF5TmFtZT0iSmF2YSBWTSBPcHRpb25zIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJKYXZhIgorCQkJCQlEZXNjcmlwdGlvbj0iU3BlY2lmeSBhbnkgb3B0aW9ucyByZXF1aXJlZCB0byBpbnZva2UgdGhlIGphdmEgVk0gb24gdGhpcyBncmFtbWFyIGZpbGUuIFNvbWV0aW1lcyBsYXJnZXIgZ3JhbW1hcnMgcmVxdWlyZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBzdGFuZGFyZCBhbGxvY2F0aW9uIGFuZCB5b3UgY2FuIHNwZWNpZnkgdGhpcyBoZXJlLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSJbdmFsdWVdIgorCQkJCQlEZWxpbWl0ZWQ9InRydWUiCisJCQkJCUluaGVyaXRhYmxlPSJ0cnVlIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJERkEiCisJCQkJCURpc3BsYXlOYW1lPSJHZW5lcmF0ZSBERkEgZG90cyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRE9UIgorCQkJCQlDYXRlZ29yeT0iRE9UIE91cHV0cyIKKwkJCQkJRGVzY3JpcHRpb249IldoZW4gc2V0IHRvIFRydWUgQU5UTFIzIHdpbGwgcHJvZHVjZSBhIG51bWJlciBvZiAuZG90IGZpbGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBkb3QvZ3JhcGh2aXogdG8gZ2VucmVhdGUgcGljdG9yaWFsIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgREZBcyBnbmVyYXRlZCBmb3IgdGhpcyBncmFtbWFyLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItZGZhIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJORkEiCisJCQkJCURpc3BsYXlOYW1lPSJHZW5lcmF0ZSBORkEgRE9UcyIKKwkJCQkJQ2F0ZWdvcnk9IkRPVCBPdXRwdXRzIgorCQkJCQlEZXNjcmlwdGlvbj0iV2hlbiBzZXQgdG8gVHJ1ZSBBTlRMUjMgd2lsbCBwcm9kdWNlIGEgbnVtYmVyIG9mIC5kb3QgZmlsZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGRvdC9ncmFwaHZpeiB0byBnZW5yZWF0ZSBwaWN0b3JpYWwgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBORkFzIGdlbmVyYXRlZCBmb3IgdGhpcyBncmFtbWFyLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItbmZhIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJSZXBvcnQiCisJCQkJCURpc3BsYXlOYW1lPSJHZW5lcmF0ZSBSZXBvcnQiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IlJlcG9ydGluZyIKKwkJCQkJQ2F0ZWdvcnk9IlJlcG9ydGluZyIKKwkJCQkJRGVzY3JpcHRpb249IklmIHNldCB0byBUcnVlIHRoZW4gQU5UTFIzIHdpbGwgZ2VuZXJhdGUgcmVwb3J0cyBhYm91dCB0aGUgZ3JhbW1hciBmaWxlKHMpIGl0IHByb2Nlc3Nlcy4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLXJlcG9ydCIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iUHJpbnQiCisJCQkJCURpc3BsYXlOYW1lPSJQcmludCBncmFtbWFyIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJSZXBvcnRpbmciCisJCQkJCUNhdGVnb3J5PSJSZXBvcnRpbmciCisJCQkJCURlc2NyaXB0aW9uPSJJZiBzZXQgdG8gVHJ1ZSBBTlRMUjMgd2lsbCBwcmludCBvdXQgdGhlIGdyYW1tYXIgd2l0aG91dCB0aGUgYXNzb2NpYXRlZCBhY3Rpb25zIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1wcmludCIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iRGVidWciCisJCQkJCURpc3BsYXlOYW1lPSJEZWJ1ZyBtb2RlIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJDb2RlIEdlbmVyYXRpb24iCisJCQkJCUNhdGVnb3J5PSJPdXRwdXQiCisJCQkJCURlc2NyaXB0aW9uPSJJZiBzZXQgdG8gVHJ1ZSBBTlRMUjMgd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgZmlyZXMgZGVidWdnaW5nIGV2ZW50cy4gW0pJIC0gTm90IHlldCBpbXBsZW1lbnRlZF0iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLWRlYnVnIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJQcm9maWxlIgorCQkJCQlEaXNwbGF5TmFtZT0iR2VuZXJhdGUgcHJvZmlsZSIKKwkJCQkJQ2F0ZWdvcnk9Ik91dHB1dCIKKwkJCQkJRGVzY3JpcHRpb249IklmIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdCBjb21wdXRlcyBwcm9maWxpbmcgaW5mb3JtYXRpb24gW0pJIC0gbm90IHlldCBpbXBsZW1lbnRlZF0iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLXByb2ZpbGUiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkFTVCIKKwkJCQkJRGlzcGxheU5hbWU9IlNob3cgQVNUIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkV4dGVuZGVkIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgVHJ1ZSBBTlRMUjMgd2lsbCBwcmludCBvdXQgdGhlIGdyYW1tYXIgQVNUIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1YZ3J0cmVlIgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkxpYkRpciIKKwkJCQkJRGlzcGxheU5hbWU9IlRva2VuIGRpcmVjdG9yeSIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iQ29kZSBHZW5lcmF0aW9uIgorCQkJCQlDYXRlZ29yeT0iR2VuZXJhbCIKKwkJCQkJRGVzY3JpcHRpb249IkluIHdoaWNoIGRpcmVjdG9yeSBjYW4gQU5UTFIzIGxvY2F0ZSBncmFtbWFyIHRva2VuIGZpbGVzIGlmIG5vdCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdyYW1tYXIgZmlsZS4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLWxpYiBbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IiQoSW5wdXREaXIpIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJUZXh0REZBIgorCQkJCQlEaXNwbGF5TmFtZT0iVGV4dCBERkEiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJJZiBUcnVlIEFOVExSMyB3aWxsIGdlbmVyYXRlIGEgdGV4dCB2ZXJzaW9uIG9mIHRoZSBERkFzZm9yIHRoaXMgZ3JhbW1hci4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhkZmEiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkVCTkZFeGl0cyIKKwkJCQkJRGlzcGxheU5hbWU9IkVCTkYgRXhpdHMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJJZiBUcnVlIEFOVExSMyB3aWxsIG5vdCB0ZXN0IEVCTkYgZXhpdCBicmFuY2hlcy4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhub3BydW5lIgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9Ik91dHB1dERpcmVjdG9yeSIKKwkJCQkJRGlzcGxheU5hbWU9Ik91dHB1dCBEaXJlY3RvcnkiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkNvZGUgR2VuZXJhdGlvbiIKKwkJCQkJRGVzY3JpcHRpb249IldoaWNoIGRpcmVjdG9yeSB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlcyBiZSBzZW50IHRvIGlmIG5vdCB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdyYW1tYXIgZmlsZS4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSIkKElucHV0RGlyKSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iQ29sbGFwc2VFZGdlcyIKKwkJCQkJRGlzcGxheU5hbWU9IkNvbGxhcHNlIEVkZ2VzIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkV4dGVuZGVkIgorCQkJCQlEZXNjcmlwdGlvbj0iQ29sbGFwc2UgaW5jaWRlbnQgZWRnZXMgaW50byBERkEgc3RhdGVzIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1Ybm9jb2xsYXBzZSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iRGVidWdORkEiCisJCQkJCURpc3BsYXlOYW1lPSJEZWJ1ZyBORkEiCisJCQkJCUNhdGVnb3J5PSJSZXBvcnRpbmciCisJCQkJCURlc2NyaXB0aW9uPSJJZiBUcnVlLCBBTlRMUjMgd2lsbCBkdW1wIGxvdHMgb2YgaW5mb3JtYXRpb24gdG8gdGhlIHNjcmVlbiBkdXJpbmcgTkZBIGNvbnZlcnNpb24uIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1YZGJnY29udmVyc2lvbiAiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iQU5UTFIzSmFyIgorCQkJCQlEaXNwbGF5TmFtZT0iQU5UTFIzIEphciIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iSmF2YSIKKwkJCQkJQ2F0ZWdvcnk9IkphdmFWTSIKKwkJCQkJRGVzY3JpcHRpb249IlNwZWNpZmllcyB0aGUgYWJzb2x1dGUgbG9jYXRpb24gb2YgdGhlIEFOVExSMyBqYXIgZmlsZSBpZiBpdCBpcyBub3QgaW4gYSBsb2NhdGlvbiBjb3ZlcmVkIGJ5ICVDTEFTU1BBVEglLiBTcGVjaWZ5IHVzaW5nIFVOSVggZGlyZWN0b3J5IGRlbGltaXRlcnMgdG8gbWluaW1pemUgcHJvYmxlbXMuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1qYXIgJnF1b3Q7W3ZhbHVlXSZxdW90OyIKKwkJCQkvPgorCQkJCTxTdHJpbmdQcm9wZXJ0eQorCQkJCQlOYW1lPSJKYXZhIgorCQkJCQlEaXNwbGF5TmFtZT0iSmF2YSBjb21tYW5kIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJKYXZhIgorCQkJCQlEZXNjcmlwdGlvbj0iU3BlY2lmaWVzIHRoZSBjb21tYW5kIHRoYXQgaW52b2tlcyB0aGUgamF2YSBWTS4gVXN1YWxseSBqYXZhLCBidXQgY291bGQgYmUgc29tZXRoaW5nIGVsc2Ugc3VjaCBhcyBqaWtlcyIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSJbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9ImphdmEiCisJCQkJLz4KKwkJCQk8SW50ZWdlclByb3BlcnR5CisJCQkJCU5hbWU9Ik1heFJ1bGVzIgorCQkJCQlEaXNwbGF5TmFtZT0iTWF4IHJ1bGUgY2FsbCIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJBbmFseXNpcyIKKwkJCQkJRGVzY3JpcHRpb249Ik1heGltdW0gbnVtYmVyIG9mIHJ1bGUgaW52b2NhdGlvbnMgZHVyaW5nIGNvbnZlcnNpb24iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhtIFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iNCIKKwkJCQkvPgorCQkJCTxJbnRlZ2VyUHJvcGVydHkKKwkJCQkJTmFtZT0iTWF4REZBRWRnZXMiCisJCQkJCURpc3BsYXlOYW1lPSJNYXggREZBIEVkZ2VzIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkV4dGVuZGVkIgorCQkJCQlEZXNjcmlwdGlvbj0iTWF4aW11bSAmcXVvdDtjb21mb3J0YWJsZSZxdW90OyBudW1iZXIgb2YgZWRnZXMgZm9yIHNpbmdsZSBERkEgc3RhdGUiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhtYXhkZmFlZGdlcyBbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IjY1NTM0IgorCQkJCS8+CisJCQkJPEludGVnZXJQcm9wZXJ0eQorCQkJCQlOYW1lPSJERkFUaW1lb3V0IgorCQkJCQlEaXNwbGF5TmFtZT0iREZBIFRpbWVvdXQiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJERkEgY29udmVyc2lvbiB0aW1lb3V0IHBlcmlvZCBmb3IgZWFjaCBkZWNpc2lvbi4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhjb252ZXJzaW9udGltZW91dCBbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IjEwMDAiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkFic29sdXRlIgorCQkJCQlEaXNwbGF5TmFtZT0iQWJzb2x1dGUgcGF0aHMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkNvZGUgR2VuZXJhdGlvbiIKKwkJCQkJRGVzY3JpcHRpb249IklmIHRydWUsIGNhdXNlcyBBTlRMUiB0byBhc3N1bWUgb3V0cHV0IGRpcmVjdG9yeSBpcyBhbHdheXMgdGhlIGFic29sdXRlIG91dHB1dCBwYXRoIGFuZCBub3QgdG8gdXNlIHJlbGF0aXZlIHBhdGhzIGFzIHBlciB0aGUgaW50cHV0IHNwZWMuIEZvciB2aXN1YWwgc3R1ZGlvLCB0aGlzIHNob3VsZCB1c3VhbGx5IGJlIHNldCB0byB0cnVlLiIKKwkJCQkJU3dpdGNoPSJmIgorCQkJCQlEZWZhdWx0VmFsdWU9InRydWUiCisJCQkJLz4KKwkJCTwvUHJvcGVydGllcz4KKwkJPC9DdXN0b21CdWlsZFJ1bGU+CisJPC9SdWxlcz4KKzwvVmlzdWFsU3R1ZGlvVG9vbEZpbGU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DL3ZzcnVsZWZpbGVzL2FudGxyM3RyZWVwYXJzZXIucnVsZXMgYi9hbnRsci0zLjQvcnVudGltZS9DL3ZzcnVsZWZpbGVzL2FudGxyM3RyZWVwYXJzZXIucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2MGY3NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0MvdnNydWxlZmlsZXMvYW50bHIzdHJlZXBhcnNlci5ydWxlcwpAQCAtMCwwICsxLDIwMSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxWaXN1YWxTdHVkaW9Ub29sRmlsZQorCU5hbWU9IkFOVExSMyBUcmVlIFBhcnNlciIKKwlWZXJzaW9uPSI4LjAwIgorCT4KKwk8UnVsZXM+CisJCTxDdXN0b21CdWlsZFJ1bGUKKwkJCU5hbWU9IkFudGxyM1RyZWVQYXJzZXIiCisJCQlEaXNwbGF5TmFtZT0iQU5UTFIgMyBUcmVlIFBhcnNlciBHcmFtbWFyIFRyYW5zbGF0aW9uIgorCQkJQ29tbWFuZExpbmU9IltqYXZhXSBbSmF2YU9wdGlvbnNdIFtBTlRMUjNKYXJdIG9yZy5hbnRsci5Ub29sIFtMaWJEaXJdIC1bQWJzb2x1dGVdbyBbT3V0cHV0RGlyZWN0b3J5XSAgLW1lc3NhZ2UtZm9ybWF0IHZzMjAwNSBbREZBXSBbTkZBXSBbUmVwb3J0XSBbUHJpbnRdIFtEZWJ1Z10gW1Byb2ZpbGVdIFtBU1RdIFtUZXh0REZBXSBbRUJORkV4aXRzXSBbQ29sbGFwc2VFZGdlc10gW0RlYnVnTkZBXSBbTWF4UnVsZXNdIFtNYXhERkFFZGdlc10gW0RGQVRpbWVvdXRdIFtpbnB1dHNdIgorCQkJT3V0cHV0cz0iW091dHB1dERpcmVjdG9yeV1cJChJbnB1dE5hbWUpLmM7W091dHB1dERpcmVjdG9yeV1cJChJbnB1dE5hbWUpLmgiCisJCQlGaWxlRXh0ZW5zaW9ucz0iKi5nM3Q7Ki5ndDsqLmciCisJCQlFeGVjdXRpb25EZXNjcmlwdGlvbj0iVHJhbnNsYXRpbmcgdG8gdHJlZSBwYXJzZXIuIgorCQkJU3VwcG9ydHNGaWxlQmF0Y2hpbmc9InRydWUiCisJCQk+CisJCQk8UHJvcGVydGllcz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iSmF2YU9wdGlvbnMiCisJCQkJCURpc3BsYXlOYW1lPSJKYXZhIFZNIE9wdGlvbnMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkphdmEiCisJCQkJCURlc2NyaXB0aW9uPSJTcGVjaWZ5IGFueSBvcHRpb25zIHJlcXVpcmVkIHRvIGludm9rZSB0aGUgamF2YSBWTSBvbiB0aGlzIGdyYW1tYXIgZmlsZS4gU29tZXRpbWVzIGxhcmdlciBncmFtbWFycyByZXF1aXJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIHN0YW5kYXJkIGFsbG9jYXRpb24gYW5kIHlvdSBjYW4gc3BlY2lmeSB0aGlzIGhlcmUuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ilt2YWx1ZV0iCisJCQkJCURlbGltaXRlZD0idHJ1ZSIKKwkJCQkJSW5oZXJpdGFibGU9InRydWUiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IkRGQSIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIERGQSBkb3RzIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJET1QiCisJCQkJCUNhdGVnb3J5PSJET1QgT3VwdXRzIgorCQkJCQlEZXNjcmlwdGlvbj0iV2hlbiBzZXQgdG8gVHJ1ZSBBTlRMUjMgd2lsbCBwcm9kdWNlIGEgbnVtYmVyIG9mIC5kb3QgZmlsZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGRvdC9ncmFwaHZpeiB0byBnZW5yZWF0ZSBwaWN0b3JpYWwgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBERkFzIGduZXJhdGVkIGZvciB0aGlzIGdyYW1tYXIuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1kZmEiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9Ik5GQSIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIE5GQSBET1RzIgorCQkJCQlDYXRlZ29yeT0iRE9UIE91dHB1dHMiCisJCQkJCURlc2NyaXB0aW9uPSJXaGVuIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIHByb2R1Y2UgYSBudW1iZXIgb2YgLmRvdCBmaWxlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggZG90L2dyYXBodml6IHRvIGdlbnJlYXRlIHBpY3RvcmlhbCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIE5GQXMgZ2VuZXJhdGVkIGZvciB0aGlzIGdyYW1tYXIuIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ii1uZmEiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlJlcG9ydCIKKwkJCQkJRGlzcGxheU5hbWU9IkdlbmVyYXRlIFJlcG9ydCIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iUmVwb3J0aW5nIgorCQkJCQlDYXRlZ29yeT0iUmVwb3J0aW5nIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgc2V0IHRvIFRydWUgdGhlbiBBTlRMUjMgd2lsbCBnZW5lcmF0ZSByZXBvcnRzIGFib3V0IHRoZSBncmFtbWFyIGZpbGUocykgaXQgcHJvY2Vzc2VzLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItcmVwb3J0IgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJQcmludCIKKwkJCQkJRGlzcGxheU5hbWU9IlByaW50IGdyYW1tYXIiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IlJlcG9ydGluZyIKKwkJCQkJQ2F0ZWdvcnk9IlJlcG9ydGluZyIKKwkJCQkJRGVzY3JpcHRpb249IklmIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIHByaW50IG91dCB0aGUgZ3JhbW1hciB3aXRob3V0IHRoZSBhc3NvY2lhdGVkIGFjdGlvbnMiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLXByaW50IgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJEZWJ1ZyIKKwkJCQkJRGlzcGxheU5hbWU9IkRlYnVnIG1vZGUiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkNvZGUgR2VuZXJhdGlvbiIKKwkJCQkJQ2F0ZWdvcnk9Ik91dHB1dCIKKwkJCQkJRGVzY3JpcHRpb249IklmIHNldCB0byBUcnVlIEFOVExSMyB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdCBmaXJlcyBkZWJ1Z2dpbmcgZXZlbnRzLiBbSkkgLSBOb3QgeWV0IGltcGxlbWVudGVkXSIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItZGVidWciCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlByb2ZpbGUiCisJCQkJCURpc3BsYXlOYW1lPSJHZW5lcmF0ZSBwcm9maWxlIgorCQkJCQlDYXRlZ29yeT0iT3V0cHV0IgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgc2V0IHRvIFRydWUgQU5UTFIzIHdpbGwgZ2VuZXJhdGUgY29kZSB0aGF0IGNvbXB1dGVzIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBbSkkgLSBub3QgeWV0IGltcGxlbWVudGVkXSIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItcHJvZmlsZSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iQVNUIgorCQkJCQlEaXNwbGF5TmFtZT0iU2hvdyBBU1QiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJJZiBUcnVlIEFOVExSMyB3aWxsIHByaW50IG91dCB0aGUgZ3JhbW1hciBBU1QiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhncnRyZWUiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iTGliRGlyIgorCQkJCQlEaXNwbGF5TmFtZT0iVG9rZW4gZGlyZWN0b3J5IgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJDb2RlIEdlbmVyYXRpb24iCisJCQkJCUNhdGVnb3J5PSJHZW5lcmFsIgorCQkJCQlEZXNjcmlwdGlvbj0iSW4gd2hpY2ggZGlyZWN0b3J5IGNhbiBBTlRMUjMgbG9jYXRlIGdyYW1tYXIgdG9rZW4gZmlsZXMgaWYgbm90IGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ3JhbW1hciBmaWxlLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItbGliIFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iJChJbnB1dERpcikiCisJCQkJLz4KKwkJCQk8Qm9vbGVhblByb3BlcnR5CisJCQkJCU5hbWU9IlRleHRERkEiCisJCQkJCURpc3BsYXlOYW1lPSJUZXh0IERGQSIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUgQU5UTFIzIHdpbGwgZ2VuZXJhdGUgYSB0ZXh0IHZlcnNpb24gb2YgdGhlIERGQXNmb3IgdGhpcyBncmFtbWFyLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWGRmYSIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iRUJORkV4aXRzIgorCQkJCQlEaXNwbGF5TmFtZT0iRUJORiBFeGl0cyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUgQU5UTFIzIHdpbGwgbm90IHRlc3QgRUJORiBleGl0IGJyYW5jaGVzLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG5vcHJ1bmUiCisJCQkJLz4KKwkJCQk8U3RyaW5nUHJvcGVydHkKKwkJCQkJTmFtZT0iT3V0cHV0RGlyZWN0b3J5IgorCQkJCQlEaXNwbGF5TmFtZT0iT3V0cHV0IERpcmVjdG9yeSIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iQ29kZSBHZW5lcmF0aW9uIgorCQkJCQlEZXNjcmlwdGlvbj0iV2hpY2ggZGlyZWN0b3J5IHRoZSBnZW5lcmF0ZWQgb3V0cHV0IGZpbGVzIGJlIHNlbnQgdG8gaWYgbm90IHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ3JhbW1hciBmaWxlLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSJbdmFsdWVdIgorCQkJCQlEZWZhdWx0VmFsdWU9IiQoSW5wdXREaXIpIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJDb2xsYXBzZUVkZ2VzIgorCQkJCQlEaXNwbGF5TmFtZT0iQ29sbGFwc2UgRWRnZXMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJDb2xsYXBzZSBpbmNpZGVudCBlZGdlcyBpbnRvIERGQSBzdGF0ZXMiCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhub2NvbGxhcHNlIgorCQkJCS8+CisJCQkJPEJvb2xlYW5Qcm9wZXJ0eQorCQkJCQlOYW1lPSJEZWJ1Z05GQSIKKwkJCQkJRGlzcGxheU5hbWU9IkRlYnVnIE5GQSIKKwkJCQkJQ2F0ZWdvcnk9IlJlcG9ydGluZyIKKwkJCQkJRGVzY3JpcHRpb249IklmIFRydWUsIEFOVExSMyB3aWxsIGR1bXAgbG90cyBvZiBpbmZvcm1hdGlvbiB0byB0aGUgc2NyZWVuIGR1cmluZyBORkEgY29udmVyc2lvbi4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLVhkYmdjb252ZXJzaW9uICIKKwkJCQkvPgorCQkJCTxTdHJpbmdQcm9wZXJ0eQorCQkJCQlOYW1lPSJBTlRMUjNKYXIiCisJCQkJCURpc3BsYXlOYW1lPSJBTlRMUjMgSmFyIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJKYXZhIgorCQkJCQlDYXRlZ29yeT0iSmF2YVZNIgorCQkJCQlEZXNjcmlwdGlvbj0iU3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBsb2NhdGlvbiBvZiB0aGUgQU5UTFIzIGphciBmaWxlIGlmIGl0IGlzIG5vdCBpbiBhIGxvY2F0aW9uIGNvdmVyZWQgYnkgJUNMQVNTUEFUSCUuIFNwZWNpZnkgdXNpbmcgVU5JWCBkaXJlY3RvcnkgZGVsaW1pdGVycyB0byBtaW5pbWl6ZSBwcm9ibGVtcy4iCisJCQkJCUhlbHBVUkw9Imh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQ29tbWFuZCtsaW5lK29wdGlvbnMiCisJCQkJCVN3aXRjaD0iLWphciAmcXVvdDtbdmFsdWVdJnF1b3Q7IgorCQkJCS8+CisJCQkJPFN0cmluZ1Byb3BlcnR5CisJCQkJCU5hbWU9IkphdmEiCisJCQkJCURpc3BsYXlOYW1lPSJKYXZhIGNvbW1hbmQiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkphdmEiCisJCQkJCURlc2NyaXB0aW9uPSJTcGVjaWZpZXMgdGhlIGNvbW1hbmQgdGhhdCBpbnZva2VzIHRoZSBqYXZhIFZNLiBVc3VhbGx5IGphdmEsIGJ1dCBjb3VsZCBiZSBzb21ldGhpbmcgZWxzZSBzdWNoIGFzIGppa2VzIgorCQkJCQlIZWxwVVJMPSJodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0NvbW1hbmQrbGluZStvcHRpb25zIgorCQkJCQlTd2l0Y2g9Ilt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iamF2YSIKKwkJCQkvPgorCQkJCTxJbnRlZ2VyUHJvcGVydHkKKwkJCQkJTmFtZT0iTWF4UnVsZXMiCisJCQkJCURpc3BsYXlOYW1lPSJNYXggcnVsZSBjYWxsIgorCQkJCQlQcm9wZXJ0eVBhZ2VOYW1lPSJFeHRlbmRlZCIKKwkJCQkJQ2F0ZWdvcnk9IkFuYWx5c2lzIgorCQkJCQlEZXNjcmlwdGlvbj0iTWF4aW11bSBudW1iZXIgb2YgcnVsZSBpbnZvY2F0aW9ucyBkdXJpbmcgY29udmVyc2lvbiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG0gW3ZhbHVlXSIKKwkJCQkJRGVmYXVsdFZhbHVlPSI0IgorCQkJCS8+CisJCQkJPEludGVnZXJQcm9wZXJ0eQorCQkJCQlOYW1lPSJNYXhERkFFZGdlcyIKKwkJCQkJRGlzcGxheU5hbWU9Ik1heCBERkEgRWRnZXMiCisJCQkJCVByb3BlcnR5UGFnZU5hbWU9IkV4dGVuZGVkIgorCQkJCQlDYXRlZ29yeT0iRXh0ZW5kZWQiCisJCQkJCURlc2NyaXB0aW9uPSJNYXhpbXVtICZxdW90O2NvbWZvcnRhYmxlJnF1b3Q7IG51bWJlciBvZiBlZGdlcyBmb3Igc2luZ2xlIERGQSBzdGF0ZSIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWG1heGRmYWVkZ2VzIFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iNjU1MzQiCisJCQkJLz4KKwkJCQk8SW50ZWdlclByb3BlcnR5CisJCQkJCU5hbWU9IkRGQVRpbWVvdXQiCisJCQkJCURpc3BsYXlOYW1lPSJERkEgVGltZW91dCIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iRXh0ZW5kZWQiCisJCQkJCUNhdGVnb3J5PSJFeHRlbmRlZCIKKwkJCQkJRGVzY3JpcHRpb249IkRGQSBjb252ZXJzaW9uIHRpbWVvdXQgcGVyaW9kIGZvciBlYWNoIGRlY2lzaW9uLiIKKwkJCQkJSGVscFVSTD0iaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db21tYW5kK2xpbmUrb3B0aW9ucyIKKwkJCQkJU3dpdGNoPSItWGNvbnZlcnNpb250aW1lb3V0IFt2YWx1ZV0iCisJCQkJCURlZmF1bHRWYWx1ZT0iMTAwMCIKKwkJCQkvPgorCQkJCTxCb29sZWFuUHJvcGVydHkKKwkJCQkJTmFtZT0iQWJzb2x1dGUiCisJCQkJCURpc3BsYXlOYW1lPSJBYnNvbHV0ZSBkaXJlY3RvcmllcyIKKwkJCQkJUHJvcGVydHlQYWdlTmFtZT0iQ29kZSBHZW5lcmF0aW9uIgorCQkJCQlEZXNjcmlwdGlvbj0iSWYgdHJ1ZSwgY2F1c2VzIEFOVExSIHRvIGFzc3VtZSBvdXRwdXQgZGlyZWN0b3J5IGlzIGFsd2F5cyB0aGUgYWJzb2x1dGUgb3V0cHV0IHBhdGggYW5kIG5vdCB0byB1c2UgcmVsYXRpdmUgcGF0aHMgYXMgcGVyIHRoZSBpbnRwdXQgc3BlYy4gRm9yIHZpc3VhbCBzdHVkaW8sIHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgc2V0IHRvIHRydWUuIgorCQkJCQlTd2l0Y2g9ImYiCisJCQkJCURlZmF1bHRWYWx1ZT0idHJ1ZSIKKwkJCQkvPgorCQkJPC9Qcm9wZXJ0aWVzPgorCQk8L0N1c3RvbUJ1aWxkUnVsZT4KKwk8L1J1bGVzPgorPC9WaXN1YWxTdHVkaW9Ub29sRmlsZT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvQVBJIENIQU5HRVMuVFhUIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9BUEkgQ0hBTkdFUy5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlODIzMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvQVBJIENIQU5HRVMuVFhUCkBAIC0wLDAgKzEsNDcgQEAKK0NoZWNrOgorCitSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0gaXMgaW4gQ1NoYXJwMyBub3QgYSBnZW5lcmljIHR5cGUhCisKK0xvb2sgZm9yIEdldCgpIHRvIHR1cm4gaW50byBpbmRleGVycyEKKworQVBJIENIQU5HRVMgRlJPTSBBTlRSTFIgMy4xIHRvIEFOVExSIDMuMgorCitSZW1vdmVkIGFueSBvYnNvbGV0ZSBBUEkuIExvdHMgb2YgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBoYXZlIGJlZW4gdHVybmVkIHZpcnR1YWwuIENvbnN0YW50cyBpbiBVUFBFUkNBU0VfT05MWSBoYXZlIGJlZW4gdHVybmVkIGludG8gVXBwZXJjYXNlT25seS4KKworQW50bHIuUnVudGltZS5UcmVlLlRyZWUgcmVuYW1lZCB0byBBbnRsci5SdW50aW1lLlRyZWUuVHJlZUNvbnN0YW50cworCitBbnRsci5SdW50aW1lLkJhc2VSZWNvZ25pemVyLkZhaWxlZCgpIGhhcyBiZWVuIHR1cm5lZCBpbnRvIGEgcHJvcGVydHkKK0FudGxyLlJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuTkVYVF9UT0tFTl9SVUxFX05BTUUgcmVuYW1lZCB0byBBbnRsci5SdW50aW1lLkJhc2VSZWNvZ25pemVyLk5leHRUb2tlblJ1bGVOYW1lCitBbnRsci5SdW50aW1lLkJhc2VSZWNvZ25pemVyLk1FTU9fUlVMRV9GQUlMRUQgcmVuYW1lZCB0byBBbnRsci5SdW50aW1lLkJhc2VSZWNvZ25pemVyLk1lbW9SdWxlRmFpbGVkCitBbnRsci5SdW50aW1lLkJhc2VSZWNvZ25pemVyLk1FTU9fUlVMRV9VTktOT1dOIHJlbmFtZWQgdG8gQW50bHIuUnVudGltZS5CYXNlUmVjb2duaXplci5NZW1vUnVsZVVua25vd24KK0FudGxyLlJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuSU5JVElBTF9GT0xMT1dfU1RBQ0tfU0laRSByZW5hbWVkIHRvIEFudGxyLlJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuSW5pdGlhbEZvbGxvd1N0YWNrU2l6ZQorQW50bHIuUnVudGltZS5CYXNlUmVjb2duaXplci5ERUZBVUxUX1RPS0VOX0NIQU5ORUwgcmVuYW1lZCB0byBBbnRsci5SdW50aW1lLkJhc2VSZWNvZ25pemVyLkRlZmF1bHRUb2tlbkNoYW5uZWwKK0FudGxyLlJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuSElEREVOIHJlbmFtZWQgdG8gQW50bHIuUnVudGltZS5CYXNlUmVjb2duaXplci5IaWRkZW4KK0FudGxyLlJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4KKworQW50bHIuUnVudGltZS5QYXJzZXIuSW5wdXQgLSByZXR1cm4gdHlwZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIElUb2tlblN0cmVhbQorCitBbnRsci5SdW50aW1lLkxleGVyLklucHV0IC0gcmV0dXJuIHR5cGUgaGFzIGJlZW4gY2hhbmdlZCB0byBJQ2hhclN0cmVhbQorCitBbnRsci5SdW50aW1lLlRyZWVQYXJzZXIgLSByZXR1cm4gdHlwZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIElUcmVlTm9kZVN0cmVhbQorCitBbnRsci5SdW50aW1lLlJ1bGVSZXR1cm5TY29wZSAtIHJlbW92ZWQgc2V0dGVycyBmcm9tIHByb3BlcnRpZXMKKworQW50bHIuUnVudGltZS5QYXJzZXJSdWxlUmV0dXJuU2NvcGUgLSByZW1vdmVkIHNldHRlcnMgZnJvbSBwcm9wZXJ0aWVzCitBbnRsci5SdW50aW1lLlBhcnNlclJ1bGVSZXR1cm5TY29wZS5zdGFydCBoYXMgYmVlbiBtYWRlIHB1YmxpYworQW50bHIuUnVudGltZS5QYXJzZXJSdWxlUmV0dXJuU2NvcGUuc3RvcCBoYXMgYmVlbiBtYWRlIHB1YmxpYworCitBbnRsci5SdW50aW1lLlRyZWVSdWxlUmV0dXJuU2NvcGUgLSByZW1vdmVkIHNldHRlciBmcm9tIHByb3BlcnR5CisKK0FudGxyLlJ1bnRpbWUuVHJlZS5SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0gaXMgbm8gbG9uZ2VyIGdlbmVyaWMgKHRoaXMgY2F1c2VzIGFwcHJvcHJpYXRlIGNoYW5nZXMgdG8gdGhlIGRlcml2ZWQgY2xhc3NlcykuIFVzdWFsbHkgVCBhbmQgU3BlY2lhbGl6aW5nVHlwZSBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCAib2JqZWN0Ii4KK0FudGxyLlJ1bnRpbWUuVHJlZS5SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uSGFzTmV4dCBoYXMgYmVlbiB0dXJuZWQgaW50byBhIHByb3BlcnR5CitBbnRsci5SdW50aW1lLlRyZWUuUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLl9OZXh0KCkgaGFzIGJlZW4gbWVyZ2VkIHdpdGggTmV4dFRyZWUoKQorQW50bHIuUnVudGltZS5UcmVlLlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5EdXAoKSBoYXMgYmVlbiBhZGRlZAorCitBbnRsci5SdW50aW1lLlRyZWUuUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5EdXAoKSBoYXMgYmVlbiBhZGRlZAorCitBbnRsci5SdW50aW1lLlRyZWUuUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5EdXAoKSBoYXMgYmVlbiBhZGRlZAorCitBbnRsci5SdW50aW1lLkNoYXJTdHJlYW1Db25zdGFudHMuRU9GIGhhcyBiZWVuIHJlbmFtZWQgdG8gRW5kT2ZGaWxlCisKK0FudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZUFkYXB0b3IuR2V0TmlsTm9kZSBoYXMgYmVlbiB0dXJuZWQgaW50byBwcm9wZXJ0eSBOaWwgKGltcGxlbWVudGluZyBjbGFzc2VzIGZvbGxvd2VkKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9DdXR0aW5nIGEgbmV3IHJlbGVhc2UudHh0IGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9DdXR0aW5nIGEgbmV3IHJlbGVhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzRlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL0N1dHRpbmcgYSBuZXcgcmVsZWFzZS50eHQKQEAgLTAsMCArMSw0MyBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOT1RFOiBUaGUgZm9sbG93aW5nIHRvcC1sZXZlbCBkaXJlY3RvcnkgbmFtZXM6CisgICAgICAgIC0gYnVpbGQKKyAgICAgICAgLSBiaW4KKyAgICAgICAgLSBkb2NzCisgICAgICBhcmUgKnJlc2VydmVkKiBmb3IgdXNlIGJ5IHRoZSBidWlsZCBzeXN0ZW0uIFRoZSAnbmFudCBjbGVhbicgCisgICAgICBjb21tYW5kIHdpbGwgcmVtb3ZlIGRpcmVjdG9yaWVzIHdpdGggYW55IG9mIHRoZXNlIG5hbWVzIAorICAgICAgd2l0aG91dCB3YXJuaW5nISEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBjdXQgYSBuZXcgcmVsZWFzZSwgSSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKK2EpIENoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXJzIGluCisKKwlhbGwuYW50bHIzLnJ1bnRpbWUubmV0LmJ1aWxkCisJUkVBRE1FLlRYVAorCVNvdXJjZXMvQW50bHIzLlJ1bnRpbWUvZGVmYXVsdC5idWlsZAorCVNvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQXNzZW1ibHlJbmZvLmNzCisJU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0NvbnN0YW50cy5jcworCVNvdXJjZXMvQW50bHIzLlV0aWxpdHkvZGVmYXVsdC5idWlsZAorCVNvdXJjZXMvQW50bHIzLlV0aWxpdHkvQXNzZW1ibHlJbmZvLmNzCisJU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9kZWZhdWx0LmJ1aWxkCisKK2IpIFVwZGF0ZSB0aGUgY29udGVudHMJb2YKKworCVJFQURNRS5UWFQKKwlDSEFOR0VTLlRYVAorCitjKSBDbGVhbiB0aGUgYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzOgorCisJCW5hbnQgY2xlYW4KKwkJCitkKSBCdWlsZCB0aGUgcmVsZWFzZSBhc3NlbWJsaWVzIChmb3IgLk5FVCB2MS4xIGFuZCAuTkVUIHYyLjApCisKKwkJbmFudCByZWxlYXNlIC10Om5ldC0xLjEKKwkJbmFudCByZWxlYXNlIC10Om5ldC0yLjAKKworZSkgQnVpbGQgdGhlIHJlbGVhc2UgZGlzdHJvIGFyY2hpdmVzIChmb3IgLk5FVCB2MS4xIGFuZCAuTkVUIHYyLjApCisKKwkJbmFudCBkaXN0CisKKworICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MSUNFTlNFLlRYVCBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTElDRU5TRS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5YjFkZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTElDRU5TRS5UWFQKQEAgLTAsMCArMSwzMCBAQAorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBzaGFsbCBiZQorICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9NYlVuaXQuRnJhbWV3b3JrLmRsbCBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9NYlVuaXQuRnJhbWV3b3JrLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODEwOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MaWJyYXJpZXMvTWJVbml0L01iVW5pdC5GcmFtZXdvcmsuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9NYlVuaXQuTVNCdWlsZC5UYXNrcy5kbGwgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL0xpYnJhcmllcy9NYlVuaXQvTWJVbml0Lk1TQnVpbGQuVGFza3MuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTNiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL0xpYnJhcmllcy9NYlVuaXQvTWJVbml0Lk1TQnVpbGQuVGFza3MuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9NYlVuaXQuVGFza3MuZGxsIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MaWJyYXJpZXMvTWJVbml0L01iVW5pdC5UYXNrcy5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmYWIyOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9NYlVuaXQuVGFza3MuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9RdWlja0dyYXBoLkFsZ29yaXRobXMuZGxsIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MaWJyYXJpZXMvTWJVbml0L1F1aWNrR3JhcGguQWxnb3JpdGhtcy5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwNjcyZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9RdWlja0dyYXBoLkFsZ29yaXRobXMuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9RdWlja0dyYXBoLmRsbCBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL01iVW5pdC9RdWlja0dyYXBoLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdkYmJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MaWJyYXJpZXMvTWJVbml0L1F1aWNrR3JhcGguZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL1N0cmluZ1RlbXBsYXRlLk5FVC9uZXQtMi4wL1N0cmluZ1RlbXBsYXRlLmRsbCBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL1N0cmluZ1RlbXBsYXRlLk5FVC9uZXQtMi4wL1N0cmluZ1RlbXBsYXRlLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzlmODkyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MaWJyYXJpZXMvU3RyaW5nVGVtcGxhdGUuTkVUL25ldC0yLjAvU3RyaW5nVGVtcGxhdGUuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL1N0cmluZ1RlbXBsYXRlLk5FVC9uZXQtMi4wL2FudGxyLnJ1bnRpbWUuZGxsIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9MaWJyYXJpZXMvU3RyaW5nVGVtcGxhdGUuTkVUL25ldC0yLjAvYW50bHIucnVudGltZS5kbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NWM2YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTGlicmFyaWVzL1N0cmluZ1RlbXBsYXRlLk5FVC9uZXQtMi4wL2FudGxyLnJ1bnRpbWUuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTk9USUNFLlRYVCBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvTk9USUNFLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRhNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9OT1RJQ0UuVFhUCkBAIC0wLDAgKzEsMzUgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc29mdHdhcmUgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIEFOVExSIFYzIEphdmEgUnVudGltZSBMaWJyYXJ5CitkZXZlbG9wZWQgYnkgVGVyZW5jZSBQYXJyIGluIGFjY29yZGFuY2Ugd2l0aCBpdCdzIGxpY2Vuc2U6CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYgVGVyZW5jZSBQYXJyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1JFQURNRS5UWFQgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1JFQURNRS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NmQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvUkVBRE1FLlRYVApAQCAtMCwwICsxLDEwMyBAQAorQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgTGlicmFyeSAoZm9yIHVzIHdpdGggdGhlIEFOVExSIEMjIENvZGUgR2VuZXJhdG9yKQorCisyOSBTZXB0ZW1iZXIsIDIwMDcKKworS3VubGUgT2R1dG9sYQkJOiBrdW5sZSBVTkRFUlNDT1JFIG9kdXRvbGEgQVQgaG90bWFpbCBET1QgY29tCitNaWNoZWFsIEpvcmRhbgorCisxLiBJTlRST0RVQ1RJT04gCisKK1RoZSBBTlRMUiB2My4xIC5ORVQgUnVudGltZSBMaWJyYXJ5IGV4dGVuZCB0aGUgQU5UTFIgbGFuZ3VhZ2UgcHJvY2Vzc2luZyAKK3Rvb2xzIGdlbmVyYXRvciB0byB0aGUgQyMvQ0xJIHBsYXRmb3JtcyBzdWNoIGFzIE1pY3Jvc29mdCAuTkVULCAKK05vdmVsbC9YaW1pYW4gTW9ubyBhbmQgZG90R05VLiBJdCBpcyB3cml0dGVuIGluIHRoZSBDIyBwcm9ncmFtbWluZyBsYW5ndWFnZSAKK2FuZCB3YXMgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciB1c2Ugd2l0aCB0aGUgQU5UTFIgQyMgQ29kZSBHZW5lcmF0aW9uCit0YXJnZXQgYnV0LCBpdCB3b3VsZCB3b3JrIGVxdWFsbHkgd2VsbCB3aXRoIGEgVkIuTkVULCBDKysvQ0xJIG9yIGluZGVlZCAKK0lyb25QeXRob24gY29kZSBnZW5lcmF0b3Igd2VyZSBzdWNoIGEgdGhpbmcgdG8gYmUgZGV2ZWxvcGVkIGZvciBBTlRMUiB2My4xLgorCitXZSBob3BlIHlvdSBmaW5kIHRoZSBBTlRMUiB2My4xIC5ORVQgUnVudGltZSBMaWJyYXJ5IGRlbGlnaHRmdWwgYW5kIHVzZWZ1bCAKK2V2ZW4gYnV0LCBhcyBwZXIgdGhlIGxpY2Vuc2UgdW5kZXIgd2hpY2ggeW91IG1heSB1c2UgaXQsIHRoaXMgc29mdHdhcmUgaXMgbm90IAorZ3VhcmFudGVlZCB0byB3b3JrLgorCitQbGVhc2Ugc2VlIExJQ0VOU0UuVFhUIGZvciB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGFuZCBOT1RJQ0UuVFhUIAorZm9yIGF0dHJpYnV0aW9uIG5vdGljZXMuCisKKworMi4gV0hBVCdTIElOIFRIRSBQQUNLPworCitUaGlzIGRpc3RyaWJ1dGlvbiBjb250YWlucyB0aHJlZSBwcm9qZWN0cywgdGhlIHByb2plY3QgZmlsZXMgbmVlZGVkIHRvIAorYnVpbGQgdGhlbSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMDMgJiAyMDA1IGFuZCwgTmFudCBidWlsZCBmaWxlcy4KKworVGhlIHByb2plY3RzIGFyZToKKworCTEuIEFudGxyMy5SdW50aW1lICAgICAgICAgICAtIHRoZSBBTlRMUiB2My4xIC5ORVQgUnVudGltZSBMaWJyYXJ5CisKKwkyLiBBbnRscjMuVXRpbGl0eSAgICAgICAgICAgLSB0aGUgQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgVXRpbGl0eSBMaWJyYXJ5CisKKwkzLiBBbnRscjMuUnVudGltZS5UZXN0cyAgICAgLSB0aGUgQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgTGlicmFyeSBUZXN0cworCitJbiBhZGRpdGlvbiB0aGUgTGlicmFyaWVzIHN1Yi1kaXJlY3RvcnkgY29udGFpbnMgZXh0ZXJuYWxzIGRlcGVuZGVuY2llcy4KKworMi4xIERlcGVuZGVuY2llcworCisgICAxLiBBbnRscjMuUnVudGltZSAgICAgICAgICAgLSBub25lCisKKyAgIDIuIEFudGxyMy5VdGlsaXR5ICAgICAgICAgICAtIEFudGxyMy5SdW50aW1lLmRsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVGVtcGxhdGUuZGxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRsci5ydW50aW1lLmRsbAorCisgICAzLiBBbnRscjMuUnVudGltZS5UZXN0cyAgICAgLSBBbnRscjMuUnVudGltZS5kbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1RlbXBsYXRlLmRsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW50bHIucnVudGltZS5kbGwKKworSW4gYWRkaXRpb24sIEFudGxyMy5SdW50aW1lLlRlc3RzIGhhcyBhIGRlcGVuZGVuY3kgb24gdGhlIE1iVW5pdCB2Mi40IGRsbHMuCisKKworMy4gVVNJTkcgVGhlIEFOVExSIHYzLjEgLk5FVCBSdW50aW1lIExpYnJhcnkKKworVG91IHVzZSB0aGUgQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgTGlicmFyeSBpbiB5b3VyIHByb2plY3RzLCBhZGQgYSAKK3JlZmVyZW5jZSB0byB0aGUgZm9sbG93aW5nIGZpbGUgaW4geW91ciBwcm9qZWN0czoKKyAgLSBBbnRscjMuUnVudGltZS5kbGwKKyAgCitJZiB5b3UgYXJlIHVzaW5nIFN0cmluZ1RlbXBsYXRlIG91dCBpbiB5b3VyIGdyYW1tYXIsIGFkZCB0aGUgZm9sbG93aW5nIAorZmlsZXMgdG9vOiAgCisgIC0gU3RyaW5nVGVtcGxhdGUuZGxsIAorICAtIGFudGxyLnJ1bnRpbWUuZGxsCisKK1lvdSBjYW4gZmluZCBleGFtcGxlcyBvZiB1c2luZyBBTlRMUiB2My4xIGFuZCB0aGUgQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgCitMaWJyYXJ5IGF0OgorICBodHRwOi8vd3d3LmFudGxyLm9yZy9kb3dubG9hZC9leGFtcGxlcy12My50YXIuZ3oKKworCis0LiBCVUlMRElORyBUaGUgQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgTGlicmFyeQorCitJZiB5b3Ugd2lzaCB0byByZS1idWlsZCBUaGUgQU5UTFIgdjMuMSAuTkVUIFJ1bnRpbWUgTGlicmFyeSBmb3IgYW55IHJlYXNvbiwgdGhpcyAKK2lzIHdoYXQgeW91IG5lZWQgdG8ga25vdy4KKworICAgIG5hbnQgY2xlYW4KKwluYW50IHJlbGVhc2UgLXQ6bmV0LTEuMQorb3IKKyAgICBuYW50IGNsZWFuCisJbmFudCByZWxlYXNlIC10Om5ldC0yLjAKKworCis1LiBBTlRMUiB2My4xIC5ORVQgUnVudGltZSBMaWJyYXJ5IFNUQVRVUworCitUaGlzIHJlbGVhc2Ugb2YgdGhlIEFOVExSIHYzLjEgLk5FVCBSdW50aW1lIExpYnJhcnkgaXMgYSBzdGFibGUgYmV0YSByZWxlYXNlLgorCitUaGVyZSBhcmUgY3VycmVudGx5IDAgZmFpbHVyZXMgaW4gdGhlIHVuaXQgdGVzdCBzdWl0ZS4KKworCitEb24ndCBmb3JnZXQgdG8gdmlzaXQgdGhlIHd3dy5hbnRsci5vcmcgZm9yIGZ1cnRoZXIgaW5mby4gVGhlIG1haWxpbmcgbGlzdHMgCithcmUgKGN1cnJlbnRseSkgbG93IHZvbHVtZSBhbmQgaGF2ZSBhIHZlcnkgaGlnaCBTaWduYWwtdG8tTm9pc2UgcmF0aW8uIFdlJ2QgCitsaWtlIHRvIGhlYXIgYWJvdXQgaG93IHlvdSdyZSB1c2luZyBBTlRMUiB2My4xIGFuZCB0aGUgLk5FVCBSdW50aW1lIExpYnJhcnkuCisKKworNy4gQ09OVFJJQlVUT1JTCisKK0t1bmxlIE9kdXRvbGEKK01pY2hlYWwgSm9yZGFuCisKKworRW5qb3khCisKK0t1bmxlIE9kdXRvbGEKZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUgXDA1MFZTMjAwNVwwNTEuc2xuIiAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUgXDA1MFZTMjAwNVwwNTEuc2xuIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQyOTk1Ci0tLSAvZGV2L251bGwKKysrICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZSBcMDUwVlMyMDA1XDA1MS5zbG4iCkBAIC0wLDAgKzEsNDEgQEAKK++7vw0KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDANCisjIFZpc3VhbCBTdHVkaW8gMjAwNQ0KK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQW50bHIzLlJ1bnRpbWUgKFZTMjAwNSkiLCAiQW50bHIzLlJ1bnRpbWVcQW50bHIzLlJ1bnRpbWUgKFZTMjAwNSkuY3Nwcm9qIiwgIntDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkFudGxyMy5VdGlsaXR5IChWUzIwMDUpIiwgIkFudGxyMy5VdGlsaXR5XEFudGxyMy5VdGlsaXR5IChWUzIwMDUpLmNzcHJvaiIsICJ7QkVCMjdEQ0MtQUJGQi00OTUxLUI2MTgtMkI2MzlFQzY1QTQ2fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJBbnRscjMuUnVudGltZS5UZXN0cyAoVlMyMDA1KSIsICJBbnRscjMuUnVudGltZS5UZXN0c1xBbnRscjMuUnVudGltZS5UZXN0cyAoVlMyMDA1KS5jc3Byb2oiLCAiezc4NEIzMDI3LTVFOUMtNEJGMi1CRkU2LUI1MDAyQ0FFMzBBQn0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUNCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7Nzg0QjMwMjctNUU5Qy00QkYyLUJGRTYtQjUwMDJDQUUzMEFCfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXs3ODRCMzAyNy01RTlDLTRCRjItQkZFNi1CNTAwMkNBRTMwQUJ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXs3ODRCMzAyNy01RTlDLTRCRjItQkZFNi1CNTAwMkNBRTMwQUJ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXs3ODRCMzAyNy01RTlDLTRCRjItQkZFNi1CNTAwMkNBRTMwQUJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7QkVCMjdEQ0MtQUJGQi00OTUxLUI2MTgtMkI2MzlFQzY1QTQ2fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCQl7Q0YxNUQwRDUtQkU3Mi00Rjk4LUI3MEYtMjI5QUJBMURGMEU4fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCisJCXtDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCisJCXtDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCisJCXtDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihNb25vRGV2ZWxvcFByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCW5hbWUgPSBBbnRscjMuUnVudGltZSAoVlMyMDA1KQ0KKwkJdmVyc2lvbiA9IDAuMQ0KKwkJU3RhcnR1cEl0ZW0gPSBBbnRscjMuUnVudGltZVxBbnRscjMuUnVudGltZSAoVlMyMDA1KS5jc3Byb2oNCisJCVBvbGljaWVzID0gJDANCisJCSQwLkRvdE5ldE5hbWluZ1BvbGljeSA9ICQxDQorCQkkMS5EaXJlY3RvcnlOYW1lc3BhY2VBc3NvY2lhdGlvbiA9IE5vbmUNCisJCSQxLlJlc291cmNlTmFtZVBvbGljeSA9IEZpbGVOYW1lDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0ICJhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZSBcMDUwVlMyMDA4XDA1MS5zbG4iICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZSBcMDUwVlMyMDA4XDA1MS5zbG4iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjgyZTMKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lIFwwNTBWUzIwMDhcMDUxLnNsbiIKQEAgLTAsMCArMSw0MSBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMDgKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQW50bHIzLlJ1bnRpbWUgKFZTMjAwOCkiLCAiQW50bHIzLlJ1bnRpbWVcQW50bHIzLlJ1bnRpbWUgKFZTMjAwOCkuY3Nwcm9qIiwgIntDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJBbnRscjMuVXRpbGl0eSAoVlMyMDA4KSIsICJBbnRscjMuVXRpbGl0eVxBbnRscjMuVXRpbGl0eSAoVlMyMDA4KS5jc3Byb2oiLCAie0JFQjI3RENDLUFCRkItNDk1MS1CNjE4LTJCNjM5RUM2NUE0Nn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkFudGxyMy5SdW50aW1lLlRlc3RzIChWUzIwMDgpIiwgIkFudGxyMy5SdW50aW1lLlRlc3RzXEFudGxyMy5SdW50aW1lLlRlc3RzIChWUzIwMDgpLmNzcHJvaiIsICJ7Nzg0QjMwMjctNUU5Qy00QkYyLUJGRTYtQjUwMDJDQUUzMEFCfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7Q0YxNUQwRDUtQkU3Mi00Rjk4LUI3MEYtMjI5QUJBMURGMEU4fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0NGMTVEMEQ1LUJFNzItNEY5OC1CNzBGLTIyOUFCQTFERjBFOH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7Q0YxNUQwRDUtQkU3Mi00Rjk4LUI3MEYtMjI5QUJBMURGMEU4fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QkVCMjdEQ0MtQUJGQi00OTUxLUI2MTgtMkI2MzlFQzY1QTQ2fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0JFQjI3RENDLUFCRkItNDk1MS1CNjE4LTJCNjM5RUM2NUE0Nn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc4NEIzMDI3LTVFOUMtNEJGMi1CRkU2LUI1MDAyQ0FFMzBBQn0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3ODRCMzAyNy01RTlDLTRCRjItQkZFNi1CNTAwMkNBRTMwQUJ9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc4NEIzMDI3LTVFOUMtNEJGMi1CRkU2LUI1MDAyQ0FFMzBBQn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7Nzg0QjMwMjctNUU5Qy00QkYyLUJGRTYtQjUwMDJDQUUzMEFCfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihNb25vRGV2ZWxvcFByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJbmFtZSA9IEFudGxyMy5SdW50aW1lIChWUzIwMDgpCisJCXZlcnNpb24gPSAwLjEKKwkJU3RhcnR1cEl0ZW0gPSBBbnRscjMuUnVudGltZVxBbnRscjMuUnVudGltZSAoVlMyMDA4KS5jc3Byb2oKKwkJUG9saWNpZXMgPSAkMAorCQkkMC5Eb3ROZXROYW1pbmdQb2xpY3kgPSAkMQorCQkkMS5EaXJlY3RvcnlOYW1lc3BhY2VBc3NvY2lhdGlvbiA9IE5vbmUKKwkJJDEuUmVzb3VyY2VOYW1lUG9saWN5ID0gRmlsZU5hbWUKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BTlRMUnh4eHhTdHJlYW1GaXh0dXJlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FOVExSeHh4eFN0cmVhbUZpeHR1cmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1NWZjMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BTlRMUnh4eHhTdHJlYW1GaXh0dXJlLmNzCkBAIC0wLDAgKzEsNDIzIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMjE5IC8vIE5vIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UZXN0cworeworCXVzaW5nIFN5c3RlbTsKKwl1c2luZyBTdHJlYW0gPSBTeXN0ZW0uSU8uU3RyZWFtOworCXVzaW5nIEZpbGVTdHJlYW0gPSBTeXN0ZW0uSU8uRmlsZVN0cmVhbTsKKwl1c2luZyBNZW1vcnlTdHJlYW0gPSBTeXN0ZW0uSU8uTWVtb3J5U3RyZWFtOworCXVzaW5nIEZpbGVNb2RlID0gU3lzdGVtLklPLkZpbGVNb2RlOworCXVzaW5nIEVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2Rpbmc7CisJdXNpbmcgRW5jb2RlciA9IFN5c3RlbS5UZXh0LkVuY29kZXI7CisKKwl1c2luZyBBTlRMUklucHV0U3RyZWFtID0gQW50bHIuUnVudGltZS5BTlRMUklucHV0U3RyZWFtOworCisJdXNpbmcgTWJVbml0LkZyYW1ld29yazsKKworCVtUZXN0Rml4dHVyZV0KKwlwdWJsaWMgY2xhc3MgQU5UTFJ4eHh4U3RyZWFtRml4dHVyZSA6IFRlc3RGaXh0dXJlQmFzZQorCXsKKwkJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIGdyYW1tYXJTdHIgPSAiIgorCQkJCSsgInBhcnNlciBncmFtbWFyIHA7IiArIE5MCisJCQkJKyAicHJvZyA6IFdISUxFIElEIExDVVJMWSAoYXNzaWduKSogUkNVUkxZIEVPRjsiICsgTkwKKwkJCQkrICJhc3NpZ24gOiBJRCBBU1NJR04gZXhwciBTRU1JIDsiICsgTkwKKwkJCQkrICJleHByIDogSU5UIHwgRkxPQVQgfCBJRCA7IiArIE5MOworCisKKwkJI3JlZ2lvbiBBTlRMUklucHV0U3RyZWFtIFRlc3RzCisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIFRlc3RBTlRMUklucHV0U3RyZWFtQ29uc3RydWN0b3JEb2VzTm90SGFuZygpCisJCXsKKwkJCUVuY29kaW5nIGVuY29kaW5nID0gRW5jb2RpbmcuVW5pY29kZTsKKwkJCWJ5dGVbXSBncmFtbWFyU3RyQnVmZmVyID0gZW5jb2RpbmcuR2V0Qnl0ZXMoZ3JhbW1hclN0cik7CisJCQlNZW1vcnlTdHJlYW0gZ3JhbW1hclN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oZ3JhbW1hclN0ckJ1ZmZlcik7CisKKwkJCUFOVExSSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJJbnB1dFN0cmVhbShncmFtbWFyU3RyZWFtLCBlbmNvZGluZyk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdFNpemVPbkVtcHR5QU5UTFJJbnB1dFN0cmVhbSgpCisJCXsKKwkJCU1lbW9yeVN0cmVhbSBncmFtbWFyU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShuZXcgYnl0ZVtdIHsgfSk7CisKKwkJCUFOVExSSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQU5UTFJJbnB1dFN0cmVhbShncmFtbWFyU3RyZWFtLCBFbmNvZGluZy5Vbmljb2RlKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLCBpbnB1dFN0cmVhbS5Db3VudCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdFNpemVPbkFOVExSSW5wdXRTdHJlYW0oKQorCQl7CisJCQlFbmNvZGluZyBlbmNvZGluZyA9IEVuY29kaW5nLlVuaWNvZGU7CisJCQlieXRlW10gZ3JhbW1hclN0ckJ1ZmZlciA9IGVuY29kaW5nLkdldEJ5dGVzKGdyYW1tYXJTdHIpOworCQkJTWVtb3J5U3RyZWFtIGdyYW1tYXJTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGdyYW1tYXJTdHJCdWZmZXIpOworCisJCQlBTlRMUklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oZ3JhbW1hclN0cmVhbSwgRW5jb2RpbmcuVW5pY29kZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZ3JhbW1hclN0ci5MZW5ndGgsIGlucHV0U3RyZWFtLkNvdW50KTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCBUZXN0Q29uc3VtZUFuZEluZGV4T25BTlRMUklucHV0U3RyZWFtKCkKKwkJeworCQkJRW5jb2RpbmcgZW5jb2RpbmcgPSBFbmNvZGluZy5Vbmljb2RlOworCQkJYnl0ZVtdIGdyYW1tYXJTdHJCdWZmZXIgPSBlbmNvZGluZy5HZXRCeXRlcyhncmFtbWFyU3RyKTsKKwkJCU1lbW9yeVN0cmVhbSBncmFtbWFyU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShncmFtbWFyU3RyQnVmZmVyKTsKKworCQkJQU5UTFJJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBBTlRMUklucHV0U3RyZWFtKGdyYW1tYXJTdHJlYW0sIEVuY29kaW5nLlVuaWNvZGUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIGlucHV0U3RyZWFtLkluZGV4KTsKKworCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIGlucHV0U3RyZWFtLkluZGV4KTsKKworCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIGlucHV0U3RyZWFtLkluZGV4KTsKKworCQkJd2hpbGUgKGlucHV0U3RyZWFtLkluZGV4IDwgaW5wdXRTdHJlYW0uQ291bnQpCisJCQl7CisJCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOworCQkJfQorCQkJQXNzZXJ0LkFyZUVxdWFsKGlucHV0U3RyZWFtLkluZGV4LCBpbnB1dFN0cmVhbS5Db3VudCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdENvbnN1bWVBbGxDaGFyYWN0ZXJzSW5BbkFOVExSSW5wdXRTdHJlYW0oKQorCQl7CisJCQlFbmNvZGluZyBlbmNvZGluZyA9IEVuY29kaW5nLlVuaWNvZGU7CisJCQlieXRlW10gZ3JhbW1hclN0ckJ1ZmZlciA9IGVuY29kaW5nLkdldEJ5dGVzKGdyYW1tYXJTdHIpOworCQkJTWVtb3J5U3RyZWFtIGdyYW1tYXJTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGdyYW1tYXJTdHJCdWZmZXIpOworCisJCQlBTlRMUklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oZ3JhbW1hclN0cmVhbSwgRW5jb2RpbmcuVW5pY29kZSk7CisJCQl3aGlsZSAoaW5wdXRTdHJlYW0uSW5kZXggPCBpbnB1dFN0cmVhbS5Db3VudCkKKwkJCXsKKwkJCQlDb25zb2xlLk91dC5Xcml0ZSgoY2hhcilpbnB1dFN0cmVhbS5MQSgxKSk7CisJCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOworCQkJfQorCQkJQXNzZXJ0LkFyZUVxdWFsKGlucHV0U3RyZWFtLkluZGV4LCBpbnB1dFN0cmVhbS5Db3VudCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdENvbnN1bWVPbkFOVExSSW5wdXRTdHJlYW0oKQorCQl7CisJCQlFbmNvZGluZyBlbmNvZGluZyA9IEVuY29kaW5nLlVuaWNvZGU7CisJCQlieXRlW10gYnVmZmVyID0gZW5jb2RpbmcuR2V0Qnl0ZXMoIk9uZVxyXG5Ud28iKTsKKwkJCU1lbW9yeVN0cmVhbSBncmFtbWFyU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWZmZXIpOworCisJCQlBTlRMUklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oZ3JhbW1hclN0cmVhbSwgRW5jb2RpbmcuVW5pY29kZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgaW5wdXRTdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIGlucHV0U3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uTGluZSk7CisKKwkJCWlucHV0U3RyZWFtLkNvbnN1bWUoKTsJCS8vIE8KKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBpbnB1dFN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBpbnB1dFN0cmVhbS5MaW5lKTsKKworCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOwkJLy8gbgorCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIGlucHV0U3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIGlucHV0U3RyZWFtLkxpbmUpOworCisJCQlpbnB1dFN0cmVhbS5Db25zdW1lKCk7CQkvLyBlCisJCQlBc3NlcnQuQXJlRXF1YWwoMywgaW5wdXRTdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDMsIGlucHV0U3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uTGluZSk7CisKKwkJCWlucHV0U3RyZWFtLkNvbnN1bWUoKTsJCS8vIFxyCisJCQlBc3NlcnQuQXJlRXF1YWwoNCwgaW5wdXRTdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDQsIGlucHV0U3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uTGluZSk7CisKKwkJCWlucHV0U3RyZWFtLkNvbnN1bWUoKTsJCS8vIFxuCisJCQlBc3NlcnQuQXJlRXF1YWwoNSwgaW5wdXRTdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIGlucHV0U3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgaW5wdXRTdHJlYW0uTGluZSk7CisKKwkJCWlucHV0U3RyZWFtLkNvbnN1bWUoKTsJCS8vIFQKKwkJCUFzc2VydC5BcmVFcXVhbCg2LCBpbnB1dFN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dFN0cmVhbS5MaW5lKTsKKworCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOwkJLy8gdworCQkJQXNzZXJ0LkFyZUVxdWFsKDcsIGlucHV0U3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIGlucHV0U3RyZWFtLkxpbmUpOworCisJCQlpbnB1dFN0cmVhbS5Db25zdW1lKCk7CQkvLyBvCisJCQlBc3NlcnQuQXJlRXF1YWwoOCwgaW5wdXRTdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDMsIGlucHV0U3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgaW5wdXRTdHJlYW0uTGluZSk7CisKKwkJCWlucHV0U3RyZWFtLkNvbnN1bWUoKTsJCS8vIEVPRgorCQkJQXNzZXJ0LkFyZUVxdWFsKDgsIGlucHV0U3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgzLCBpbnB1dFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIGlucHV0U3RyZWFtLkxpbmUpOworCisJCQlpbnB1dFN0cmVhbS5Db25zdW1lKCk7CQkvLyBFT0YKKwkJCUFzc2VydC5BcmVFcXVhbCg4LCBpbnB1dFN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMywgaW5wdXRTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dFN0cmVhbS5MaW5lKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCBUZXN0UmVzZXRPbkFOVExSSW5wdXRTdHJlYW0oKQorCQl7CisJCQlFbmNvZGluZyBlbmNvZGluZyA9IEVuY29kaW5nLlVuaWNvZGU7CisJCQlieXRlW10gYnVmZmVyID0gZW5jb2RpbmcuR2V0Qnl0ZXMoIk9uZVxyXG5Ud28iKTsKKwkJCU1lbW9yeVN0cmVhbSBncmFtbWFyU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWZmZXIpOworCisJCQlBTlRMUklucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oZ3JhbW1hclN0cmVhbSwgZW5jb2RpbmcpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIGlucHV0U3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLCBpbnB1dFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIGlucHV0U3RyZWFtLkxpbmUpOworCisJCQlpbnB1dFN0cmVhbS5Db25zdW1lKCk7CQkvLyBPCisJCQlpbnB1dFN0cmVhbS5Db25zdW1lKCk7CQkvLyBuCisKKwkJCUFzc2VydC5BcmVFcXVhbCgnZScsIGlucHV0U3RyZWFtLkxBKDEpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dFN0cmVhbS5JbmRleCk7CisKKwkJCWlucHV0U3RyZWFtLlJlc2V0KCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoJ08nLCBpbnB1dFN0cmVhbS5MQSgxKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgaW5wdXRTdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIGlucHV0U3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uTGluZSk7CisJCQlpbnB1dFN0cmVhbS5Db25zdW1lKCk7CQkvLyBPCisKKwkJCUFzc2VydC5BcmVFcXVhbCgnbicsIGlucHV0U3RyZWFtLkxBKDEpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBpbnB1dFN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgaW5wdXRTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBpbnB1dFN0cmVhbS5MaW5lKTsKKwkJCWlucHV0U3RyZWFtLkNvbnN1bWUoKTsJCS8vIG4KKworCQkJQXNzZXJ0LkFyZUVxdWFsKCdlJywgaW5wdXRTdHJlYW0uTEEoMSkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIGlucHV0U3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBpbnB1dFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIGlucHV0U3RyZWFtLkxpbmUpOworCQkJaW5wdXRTdHJlYW0uQ29uc3VtZSgpOwkJLy8gZQorCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIFRlc3RTdWJzdHJpbmdPbkFOVExSSW5wdXRTdHJlYW0oKQorCQl7CisJCQlFbmNvZGluZyBlbmNvZGluZyA9IEVuY29kaW5nLlVuaWNvZGU7CisJCQlieXRlW10gYnVmZmVyID0gZW5jb2RpbmcuR2V0Qnl0ZXMoIk9uZVxyXG5Ud29cclxuVGhyZWUiKTsKKwkJCU1lbW9yeVN0cmVhbSBncmFtbWFyU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbShidWZmZXIpOworCisJCQlBTlRMUklucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBBTlRMUklucHV0U3RyZWFtKGdyYW1tYXJTdHJlYW0sIGVuY29kaW5nKTsKKworCQkJQXNzZXJ0LkFyZUVxdWFsKCJUd28iLCBzdHJlYW0uU3Vic3RyaW5nKDUsIDcpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgiT25lIiwgc3RyZWFtLlN1YnN0cmluZygwLCAyKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIlRocmVlIiwgc3RyZWFtLlN1YnN0cmluZygxMCwgMTQpKTsKKworCQkJc3RyZWFtLkNvbnN1bWUoKTsKKworCQkJQXNzZXJ0LkFyZUVxdWFsKCJUd28iLCBzdHJlYW0uU3Vic3RyaW5nKDUsIDcpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgiT25lIiwgc3RyZWFtLlN1YnN0cmluZygwLCAyKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIlRocmVlIiwgc3RyZWFtLlN1YnN0cmluZygxMCwgMTQpKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCBUZXN0U2Vla09uQU5UTFJJbnB1dFN0cmVhbSgpCisJCXsKKwkJCUVuY29kaW5nIGVuY29kaW5nID0gRW5jb2RpbmcuVW5pY29kZTsKKwkJCWJ5dGVbXSBidWZmZXIgPSBlbmNvZGluZy5HZXRCeXRlcygiT25lXHJcblR3b1xyXG5UaHJlZSIpOworCQkJTWVtb3J5U3RyZWFtIGdyYW1tYXJTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGJ1ZmZlcik7CisKKwkJCUFOVExSSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oZ3JhbW1hclN0cmVhbSwgZW5jb2RpbmcpOworCQkJQXNzZXJ0LkFyZUVxdWFsKCdPJywgc3RyZWFtLkxBKDEpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN0cmVhbS5MaW5lKTsKKworCQkJc3RyZWFtLlNlZWsoNik7CisJCQlBc3NlcnQuQXJlRXF1YWwoJ3cnLCBzdHJlYW0uTEEoMSkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDYsIHN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgc3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgc3RyZWFtLkxpbmUpOworCisJCQlzdHJlYW0uU2VlaygxMSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoJ2gnLCBzdHJlYW0uTEEoMSkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDExLCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDMsIHN0cmVhbS5MaW5lKTsKKworCQkJLy8gc2Vla2luZyBiYWNrd2FyZHMgbGVhdmVzIHN0YXRlIGluZm8gKG90aGVyIHRoYW4gaW5kZXggaW4gc3RyZWFtKSB1bmNoYW5nZWQKKwkJCXN0cmVhbS5TZWVrKDEpOworCQkJQXNzZXJ0LkFyZUVxdWFsKCduJywgc3RyZWFtLkxBKDEpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDMsIHN0cmVhbS5MaW5lKTsKKwkJfQorCisJCSNlbmRyZWdpb24KKworCisJCSNyZWdpb24gQU5UTFJTdHJpbmdTdHJlYW0gVGVzdHMKKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdFNpemVPbkVtcHR5QU5UTFJTdHJpbmdTdHJlYW0oKQorCQl7CisJCQlBTlRMUlN0cmluZ1N0cmVhbSBzMSA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgczEuQ291bnQpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIHMxLkluZGV4KTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCBUZXN0U2l6ZU9uQU5UTFJTdHJpbmdTdHJlYW0oKQorCQl7CisJCQlBTlRMUlN0cmluZ1N0cmVhbSBzMSA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgibGV4ZXJcclxuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoNywgczEuQ291bnQpOworCisJCQlBTlRMUlN0cmluZ1N0cmVhbSBzMiA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbShncmFtbWFyU3RyKTsKKwkJCUFzc2VydC5BcmVFcXVhbChncmFtbWFyU3RyLkxlbmd0aCwgczIuQ291bnQpOworCisJCQlBTlRMUlN0cmluZ1N0cmVhbSBzMyA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiZ3JhbW1hciBQOyIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEwLCBzMy5Db3VudCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdENvbnN1bWVPbkFOVExSU3RyaW5nU3RyZWFtKCkKKwkJeworCQkJQU5UTFJTdHJpbmdTdHJlYW0gc3RyZWFtID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJPbmVcclxuVHdvIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgc3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLCBzdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uTGluZSk7CisKKwkJCXN0cmVhbS5Db25zdW1lKCk7CQkvLyBPCisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgc3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uTGluZSk7CisKKwkJCXN0cmVhbS5Db25zdW1lKCk7CQkvLyBuCisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgc3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBzdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uTGluZSk7CisKKwkJCXN0cmVhbS5Db25zdW1lKCk7CQkvLyBlCisJCQlBc3NlcnQuQXJlRXF1YWwoMywgc3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgzLCBzdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uTGluZSk7CisKKwkJCXN0cmVhbS5Db25zdW1lKCk7CQkvLyBccgorCQkJQXNzZXJ0LkFyZUVxdWFsKDQsIHN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoNCwgc3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgc3RyZWFtLkxpbmUpOworCisJCQlzdHJlYW0uQ29uc3VtZSgpOwkJLy8gXG4KKwkJCUFzc2VydC5BcmVFcXVhbCg1LCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHN0cmVhbS5MaW5lKTsKKworCQkJc3RyZWFtLkNvbnN1bWUoKTsJCS8vIFQKKwkJCUFzc2VydC5BcmVFcXVhbCg2LCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHN0cmVhbS5MaW5lKTsKKworCQkJc3RyZWFtLkNvbnN1bWUoKTsJCS8vIHcKKwkJCUFzc2VydC5BcmVFcXVhbCg3LCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHN0cmVhbS5MaW5lKTsKKworCQkJc3RyZWFtLkNvbnN1bWUoKTsJCS8vIG8KKwkJCUFzc2VydC5BcmVFcXVhbCg4LCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDMsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHN0cmVhbS5MaW5lKTsKKworCQkJc3RyZWFtLkNvbnN1bWUoKTsJCS8vIEVPRgorCQkJQXNzZXJ0LkFyZUVxdWFsKDgsIHN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMywgc3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgc3RyZWFtLkxpbmUpOworCisJCQlzdHJlYW0uQ29uc3VtZSgpOwkJLy8gRU9GCisJCQlBc3NlcnQuQXJlRXF1YWwoOCwgc3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgzLCBzdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBzdHJlYW0uTGluZSk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdFJlc2V0T25BTlRMUlN0cmluZ1N0cmVhbSgpCisJCXsKKwkJCUFOVExSU3RyaW5nU3RyZWFtIHN0cmVhbSA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiT25lXHJcblR3byIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIHN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgc3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgc3RyZWFtLkxpbmUpOworCisJCQlzdHJlYW0uQ29uc3VtZSgpOwkJLy8gTworCQkJc3RyZWFtLkNvbnN1bWUoKTsJCS8vIG4KKworCQkJQXNzZXJ0LkFyZUVxdWFsKCdlJywgc3RyZWFtLkxBKDEpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBzdHJlYW0uSW5kZXgpOworCisJCQlzdHJlYW0uUmVzZXQoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgnTycsIHN0cmVhbS5MQSgxKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgc3RyZWFtLkluZGV4KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLCBzdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdHJlYW0uTGluZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOwkJLy8gTworCisJCQlBc3NlcnQuQXJlRXF1YWwoJ24nLCBzdHJlYW0uTEEoMSkpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN0cmVhbS5JbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgc3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgc3RyZWFtLkxpbmUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsJCS8vIG4KKworCQkJQXNzZXJ0LkFyZUVxdWFsKCdlJywgc3RyZWFtLkxBKDEpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBzdHJlYW0uSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN0cmVhbS5MaW5lKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CQkvLyBlCisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgVGVzdFN1YnN0cmluZ09uQU5UTFJTdHJpbmdTdHJlYW0oKQorCQl7CisJCQlBTlRMUlN0cmluZ1N0cmVhbSBzdHJlYW0gPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oIk9uZVxyXG5Ud29cclxuVGhyZWUiKTsKKworCQkJQXNzZXJ0LkFyZUVxdWFsKCJUd28iLCBzdHJlYW0uU3Vic3RyaW5nKDUsIDcpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgiT25lIiwgc3RyZWFtLlN1YnN0cmluZygwLCAyKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIlRocmVlIiwgc3RyZWFtLlN1YnN0cmluZygxMCwgMTQpKTsKKworCQkJc3RyZWFtLkNvbnN1bWUoKTsKKworCQkJQXNzZXJ0LkFyZUVxdWFsKCJUd28iLCBzdHJlYW0uU3Vic3RyaW5nKDUsIDcpKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgiT25lIiwgc3RyZWFtLlN1YnN0cmluZygwLCAyKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoIlRocmVlIiwgc3RyZWFtLlN1YnN0cmluZygxMCwgMTQpKTsKKwkJfQorCisJCSNlbmRyZWdpb24KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BbnRscjMuUnVudGltZS5UZXN0cyBcMDUwVlMyMDA1XDA1MS5jc3Byb2oiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BbnRscjMuUnVudGltZS5UZXN0cyBcMDUwVlMyMDA1XDA1MS5jc3Byb2oiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjA4NjIKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyMy5SdW50aW1lLlRlc3RzIFwwNTBWUzIwMDVcMDUxLmNzcHJvaiIKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjUwNzI3PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns3ODRCMzAyNy01RTlDLTRCRjItQkZFNi1CNTAwMkNBRTMwQUJ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkFudGxyLlJ1bnRpbWUuVGVzdHM8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5BbnRscjMuUnVudGltZS5UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxTdGFydHVwT2JqZWN0PgorICAgIDwvU3RhcnR1cE9iamVjdD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1xuZXQtMi4wXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO1NUUk9OR19OQU1FO0RPVE5FVDI8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVxuZXQtMi4wXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO1NUUk9OR19OQU1FO0RPVE5FVDI8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8VXNlVlNIb3N0aW5nUHJvY2Vzcz5mYWxzZTwvVXNlVlNIb3N0aW5nUHJvY2Vzcz4KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+CisgICAgPC9Eb2N1bWVudGF0aW9uRmlsZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFOVExSeHh4eFN0cmVhbUZpeHR1cmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmV3cml0ZVJ1bGVYeHh4U3RyZWFtRml4dHVyZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0RHJpdmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyZWVXaXphcmRGaXh0dXJlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklUcmVlRml4dHVyZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJVHJlZU5vZGVTdHJlYW1GaXh0dXJlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RGaXh0dXJlQmFzZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNYlVuaXQuRnJhbWV3b3JrLCBWZXJzaW9uPTEuMC4yNzAwLjI5ODg1LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTVlNzJlY2QzMGJjNDA4ZDUiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi4uXC4uXExpYnJhcmllc1xNYlVuaXRcTWJVbml0LkZyYW1ld29yay5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxBbnRscjMuUnVudGltZVxBbnRscjMuUnVudGltZSAoVlMyMDA1KS5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+e0NGMTVEMEQ1LUJFNzItNEY5OC1CNzBGLTIyOUFCQTFERjBFOH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5BbnRscjMuUnVudGltZSAoVlMyMDA1KTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyMy5SdW50aW1lLlRlc3RzIFwwNTBWUzIwMDhcMDUxLmNzcHJvaiIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyMy5SdW50aW1lLlRlc3RzIFwwNTBWUzIwMDhcMDUxLmNzcHJvaiIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNThkMQotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvQW50bHIzLlJ1bnRpbWUuVGVzdHMgXDA1MFZTMjAwOFwwNTEuY3Nwcm9qIgpAQCAtMCwwICsxLDcwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjMuNSI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns3ODRCMzAyNy01RTlDLTRCRjItQkZFNi1CNTAwMkNBRTMwQUJ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkFudGxyLlJ1bnRpbWUuVGVzdHM8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5BbnRscjMtMi5SdW50aW1lLlRlc3RzLkRvdE5ldDIwPC9Bc3NlbWJseU5hbWU+CisgICAgPFN0YXJ0dXBPYmplY3Q+CisgICAgPC9TdGFydHVwT2JqZWN0PgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjIuMDwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24+CisgICAgPC9VcGdyYWRlQmFja3VwTG9jYXRpb24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcbmV0LTIuMFw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRztTVFJPTkdfTkFNRTtET1RORVQyPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcbmV0LTIuMFw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtTVFJPTkdfTkFNRTtET1RORVQyPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPFVzZVZTSG9zdGluZ1Byb2Nlc3M+ZmFsc2U8L1VzZVZTSG9zdGluZ1Byb2Nlc3M+CisgICAgPERvY3VtZW50YXRpb25GaWxlPgorICAgIDwvRG9jdW1lbnRhdGlvbkZpbGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBTlRMUnh4eHhTdHJlYW1GaXh0dXJlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlJld3JpdGVSdWxlWHh4eFN0cmVhbUZpeHR1cmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdERyaXZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJVHJlZUZpeHR1cmUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVRyZWVOb2RlU3RyZWFtRml4dHVyZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0Rml4dHVyZUJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWJVbml0LkZyYW1ld29yaywgVmVyc2lvbj0xLjAuMjcwMC4yOTg4NSwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj01ZTcyZWNkMzBiYzQwOGQ1Ij4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlxMaWJyYXJpZXNcTWJVbml0XE1iVW5pdC5GcmFtZXdvcmsuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cQW50bHIzLlJ1bnRpbWVcQW50bHIzLlJ1bnRpbWUgKFZTMjAwOCkuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0PntDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+QW50bHIzLlJ1bnRpbWUgKFZTMjAwOCk8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0lUcmVlRml4dHVyZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9JVHJlZUZpeHR1cmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyODc0YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9JVHJlZUZpeHR1cmUuY3MKQEAgLTAsMCArMSw0NTYgQEAKKy8qCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBNVVNUIFJFVEFJTiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gTVVTVCBSRVBST0RVQ0UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciBXUklUVEVOIHBlcm1pc3Npb24uCis0LiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSAKKyAgIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoaXMgd29yayB0byB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGxpY2Vuc29yCisgICBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNlLCB3aXRob3V0IGFueSAKKyAgIGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UZXN0cworeworCXVzaW5nIFN5c3RlbTsKKwl1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworCXVzaW5nIElUb2tlbiA9IEFudGxyLlJ1bnRpbWUuSVRva2VuOworCXVzaW5nIENvbW1vblRva2VuID0gQW50bHIuUnVudGltZS5Db21tb25Ub2tlbjsKKwl1c2luZyBJVHJlZSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZTsKKwl1c2luZyBJVHJlZUFkYXB0b3IgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVBZGFwdG9yOworCXVzaW5nIENvbW1vblRyZWUgPSBBbnRsci5SdW50aW1lLlRyZWUuQ29tbW9uVHJlZTsKKwl1c2luZyBDb21tb25UcmVlQWRhcHRvciA9IEFudGxyLlJ1bnRpbWUuVHJlZS5Db21tb25UcmVlQWRhcHRvcjsKKworCXVzaW5nIE1iVW5pdC5GcmFtZXdvcms7CisKKwlbVGVzdEZpeHR1cmVdCisJcHVibGljIGNsYXNzIElUcmVlRml4dHVyZSA6IFRlc3RGaXh0dXJlQmFzZQorCXsKKwkJI3JlZ2lvbiBDb21tb25UcmVlIFRlc3RzCisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVOb2RlKCkKKwkJeworCQkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpOworCQkJQXNzZXJ0LklzTnVsbCh0LlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoLTEsIHQuQ2hpbGRJbmRleCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdDROb2RlcygpCisJCXsKKwkJCS8vIF4oMTAxIF4oMTAyIDEwMykgMTA0KQorCQkJQ29tbW9uVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQlyMC5HZXRDaGlsZCgwKS5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCQkJcjAuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKworCQkJQXNzZXJ0LklzTnVsbChyMC5QYXJlbnQpOworCQkJQXNzZXJ0LkFyZUVxdWFsKC0xLCByMC5DaGlsZEluZGV4KTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0TGlzdCgpCisJCXsKKwkJCS8vIF4obmlsIDEwMSAxMDIgMTAzKQorCQkJQ29tbW9uVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKChJVG9rZW4pbnVsbCk7CisJCQlDb21tb25UcmVlIGMwLCBjMSwgYzI7CisJCQlyMC5BZGRDaGlsZChjMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCQlyMC5BZGRDaGlsZChjMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQlyMC5BZGRDaGlsZChjMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJCUFzc2VydC5Jc051bGwocjAuUGFyZW50KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgtMSwgcjAuQ2hpbGRJbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwocjAsIGMwLlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgYzAuQ2hpbGRJbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwocjAsIGMxLlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgYzEuQ2hpbGRJbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwocjAsIGMyLlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgYzIuQ2hpbGRJbmRleCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdExpc3QyKCkKKwkJeworCQkJLy8gQWRkIGNoaWxkIF4obmlsIDEwMSAxMDIgMTAzKSB0byByb290IDUKKwkJCS8vIHNob3VsZCBwdWxsIDEwMSAxMDIgMTAzIGRpcmVjdGx5IHRvIGJlY29tZSA1J3MgY2hpbGQgbGlzdAorCQkJQ29tbW9uVHJlZSByb290ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDUpKTsKKworCQkJLy8gY2hpbGQgdHJlZQorCQkJQ29tbW9uVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKChJVG9rZW4pbnVsbCk7CisJCQlDb21tb25UcmVlIGMwLCBjMSwgYzI7CisJCQlyMC5BZGRDaGlsZChjMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCQlyMC5BZGRDaGlsZChjMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQlyMC5BZGRDaGlsZChjMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJCXJvb3QuQWRkQ2hpbGQocjApOworCisJCQlBc3NlcnQuSXNOdWxsKHJvb3QuUGFyZW50KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgtMSwgcm9vdC5DaGlsZEluZGV4KTsKKwkJCS8vIGNoZWNrIGNoaWxkcmVuIG9mIHJvb3QgYWxsIHBvaW50IGF0IHJvb3QKKwkJCUFzc2VydC5BcmVFcXVhbChyb290LCBjMC5QYXJlbnQpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIGMwLkNoaWxkSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKHJvb3QsIGMwLlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgYzEuQ2hpbGRJbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwocm9vdCwgYzAuUGFyZW50KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBjMi5DaGlsZEluZGV4KTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdFRvRXhpc3RDaGlsZHJlbigpCisJCXsKKwkJCS8vIEFkZCBjaGlsZCBeKG5pbCAxMDEgMTAyIDEwMykgdG8gcm9vdCBeKDUgNikKKwkJCS8vIHNob3VsZCBhZGQgMTAxIDEwMiAxMDMgdG8gZW5kIG9mIDUncyBjaGlsZCBsaXN0CisJCQlDb21tb25UcmVlIHJvb3QgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpOworCQkJcm9vdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNikpKTsKKworCQkJLy8gY2hpbGQgdHJlZQorCQkJQ29tbW9uVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKChJVG9rZW4pbnVsbCk7CisJCQlDb21tb25UcmVlIGMwLCBjMSwgYzI7CisJCQlyMC5BZGRDaGlsZChjMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCQlyMC5BZGRDaGlsZChjMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQlyMC5BZGRDaGlsZChjMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJCXJvb3QuQWRkQ2hpbGQocjApOworCisJCQlBc3NlcnQuSXNOdWxsKHJvb3QuUGFyZW50KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgtMSwgcm9vdC5DaGlsZEluZGV4KTsKKwkJCS8vIGNoZWNrIGNoaWxkcmVuIG9mIHJvb3QgYWxsIHBvaW50IGF0IHJvb3QKKwkJCUFzc2VydC5BcmVFcXVhbChyb290LCBjMC5QYXJlbnQpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIGMwLkNoaWxkSW5kZXgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKHJvb3QsIGMwLlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgYzEuQ2hpbGRJbmRleCk7CisJCQlBc3NlcnQuQXJlRXF1YWwocm9vdCwgYzAuUGFyZW50KTsKKwkJCUFzc2VydC5BcmVFcXVhbCgzLCBjMi5DaGlsZEluZGV4KTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0RHVwVHJlZSgpCisJCXsKKwkJCS8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKwkJCUNvbW1vblRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCQlDb21tb25UcmVlIHIxID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpOworCQkJcjAuQWRkQ2hpbGQocjEpOworCQkJcjEuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJCUlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQkJcjIuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKwkJCXIxLkFkZENoaWxkKHIyKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSkpOworCisJCQlDb21tb25UcmVlIGR1cCA9IChDb21tb25UcmVlKShuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSkuRHVwVHJlZShyMCk7CisKKwkJCUFzc2VydC5Jc051bGwoZHVwLlBhcmVudCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoLTEsIGR1cC5DaGlsZEluZGV4KTsKKwkJCWR1cC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RCZWNvbWVSb290KCkKKwkJeworCQkJLy8gNSBiZWNvbWVzIG5ldyByb290IG9mIF4obmlsIDEwMSAxMDIgMTAzKQorCQkJQ29tbW9uVHJlZSBuZXdSb290ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDUpKTsKKworCQkJQ29tbW9uVHJlZSBvbGRSb290ID0gbmV3IENvbW1vblRyZWUoKElUb2tlbiludWxsKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKworCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJCWFkYXB0b3IuQmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KTsKKwkJCW5ld1Jvb3QuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0QmVjb21lUm9vdDIoKQorCQl7CisJCQkvLyA1IGJlY29tZXMgbmV3IHJvb3Qgb2YgXigxMDEgMTAyIDEwMykKKwkJCUNvbW1vblRyZWUgbmV3Um9vdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig1KSk7CisKKwkJCUNvbW1vblRyZWUgb2xkUm9vdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKworCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJCWFkYXB0b3IuQmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KTsKKwkJCW5ld1Jvb3QuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0QmVjb21lUm9vdDMoKQorCQl7CisJCQkvLyBeKG5pbCA1KSBiZWNvbWVzIG5ldyByb290IG9mIF4obmlsIDEwMSAxMDIgMTAzKQorCQkJQ29tbW9uVHJlZSBuZXdSb290ID0gbmV3IENvbW1vblRyZWUoKElUb2tlbiludWxsKTsKKwkJCW5ld1Jvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDUpKSk7CisKKwkJCUNvbW1vblRyZWUgb2xkUm9vdCA9IG5ldyBDb21tb25UcmVlKChJVG9rZW4pbnVsbCk7CisJCQlvbGRSb290LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCQlvbGRSb290LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQlvbGRSb290LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJCUlUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisJCQlhZGFwdG9yLkJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCk7CisJCQluZXdSb290LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdEJlY29tZVJvb3Q1KCkKKwkJeworCQkJLy8gXihuaWwgNSkgYmVjb21lcyBuZXcgcm9vdCBvZiBeKDEwMSAxMDIgMTAzKQorCQkJQ29tbW9uVHJlZSBuZXdSb290ID0gbmV3IENvbW1vblRyZWUoKElUb2tlbiludWxsKTsKKwkJCW5ld1Jvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDUpKSk7CisKKwkJCUNvbW1vblRyZWUgb2xkUm9vdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKwkJCW9sZFJvb3QuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKworCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJCWFkYXB0b3IuQmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KTsKKwkJCW5ld1Jvb3QuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0QmVjb21lUm9vdDYoKQorCQl7CisJCQkvLyBlbXVsYXRlcyBjb25zdHJ1Y3Rpb24gb2YgXig1IDYpCisJCQlJVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCQkJQ29tbW9uVHJlZSByb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJQ29tbW9uVHJlZSByb290XzEgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJcm9vdF8xID0gKENvbW1vblRyZWUpYWRhcHRvci5CZWNvbWVSb290KG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig1KSksIHJvb3RfMSk7CisKKwkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8xLCBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNikpKTsKKworCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisKKwkJCXJvb3RfMC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCQl9CisKKwkJLy8gVGVzdCByZXBsYWNlQ2hpbGRyZW4KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VXaXRoTm9DaGlsZHJlbigpCisJCXsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpOworCQkJYm9vbCBlcnJvciA9IGZhbHNlOworCQkJdHJ5CisJCQl7CisJCQkJdC5SZXBsYWNlQ2hpbGRyZW4oMCwgMCwgbmV3Q2hpbGQpOworCQkJfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbikKKwkJCXsKKwkJCQllcnJvciA9IHRydWU7CisJCQl9CisJCQlBc3NlcnQuSXNUcnVlKGVycm9yKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpdGhPbmVDaGlsZHJlbigpCisJCXsKKwkJCS8vIGFzc3VtZSB0b2tlbiB0eXBlIDk5IGFuZCB1c2UgdGV4dAorCQkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYSIpKTsKKwkJCUNvbW1vblRyZWUgYzAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJiIikpOworCQkJdC5BZGRDaGlsZChjMCk7CisKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpOworCQkJdC5SZXBsYWNlQ2hpbGRyZW4oMCwgMCwgbmV3Q2hpbGQpOworCQkJU3RyaW5nIGV4cGVjdGVkID0gIihhIGMpIjsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgdC5Ub1N0cmluZ1RyZWUoKSk7CisJCQl0LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJbk1pZGRsZSgpCisJCXsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsgLy8gaW5kZXggMQorCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJkIikpKTsKKworCQkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgIngiKSk7CisJCQl0LlJlcGxhY2VDaGlsZHJlbigxLCAxLCBuZXdDaGlsZCk7CisJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiKGEgYiB4IGQpIjsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgdC5Ub1N0cmluZ1RyZWUoKSk7CisJCQl0LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBdExlZnQoKQorCQl7CisJCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJiIikpKTsgLy8gaW5kZXggMAorCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJ4IikpOworCQkJdC5SZXBsYWNlQ2hpbGRyZW4oMCwgMCwgbmV3Q2hpbGQpOworCQkJU3RyaW5nIGV4cGVjdGVkID0gIihhIHggYyBkKSI7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHQuVG9TdHJpbmdUcmVlKCkpOworCQkJdC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQXRSaWdodCgpCisJCXsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7IC8vIGluZGV4IDIKKworCQkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgIngiKSk7CisJCQl0LlJlcGxhY2VDaGlsZHJlbigyLCAyLCBuZXdDaGlsZCk7CisJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiKGEgYiBjIHgpIjsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgdC5Ub1N0cmluZ1RyZWUoKSk7CisJCQl0LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VPbmVXaXRoVHdvQXRMZWZ0KCkKKwkJeworCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGRyZW4gPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJbmV3Q2hpbGRyZW4uQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAieCIpKSk7CisJCQluZXdDaGlsZHJlbi5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJ5IikpKTsKKworCQkJdC5SZXBsYWNlQ2hpbGRyZW4oMCwgMCwgbmV3Q2hpbGRyZW4pOworCQkJU3RyaW5nIGV4cGVjdGVkID0gIihhIHggeSBjIGQpIjsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgdC5Ub1N0cmluZ1RyZWUoKSk7CisJCQl0LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VPbmVXaXRoVHdvQXRSaWdodCgpCisJCXsKKwkJCUlUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisJCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJiIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYyIpKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImQiKSkpOworCisJCQlDb21tb25UcmVlIG5ld0NoaWxkcmVuID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCW5ld0NoaWxkcmVuLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgIngiKSkpOworCQkJbmV3Q2hpbGRyZW4uQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAieSIpKSk7CisKKwkJCXQuUmVwbGFjZUNoaWxkcmVuKDIsIDIsIG5ld0NoaWxkcmVuKTsKKwkJCVN0cmluZyBleHBlY3RlZCA9ICIoYSBiIGMgeCB5KSI7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHQuVG9TdHJpbmdUcmVlKCkpOworCQkJdC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlT25lV2l0aFR3b0luTWlkZGxlKCkKKwkJeworCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGRyZW4gPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJbmV3Q2hpbGRyZW4uQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAieCIpKSk7CisJCQluZXdDaGlsZHJlbi5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJ5IikpKTsKKworCQkJdC5SZXBsYWNlQ2hpbGRyZW4oMSwgMSwgbmV3Q2hpbGRyZW4pOworCQkJU3RyaW5nIGV4cGVjdGVkID0gIihhIGIgeCB5IGQpIjsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgdC5Ub1N0cmluZ1RyZWUoKSk7CisJCQl0LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUd29XaXRoT25lQXRMZWZ0KCkKKwkJeworCQkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYSIpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYiIpKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJkIikpKTsKKworCQkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgIngiKSk7CisKKwkJCXQuUmVwbGFjZUNoaWxkcmVuKDAsIDEsIG5ld0NoaWxkKTsKKwkJCVN0cmluZyBleHBlY3RlZCA9ICIoYSB4IGQpIjsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgdC5Ub1N0cmluZ1RyZWUoKSk7CisJCQl0LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUd29XaXRoT25lQXRSaWdodCgpCisJCXsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJ4IikpOworCisJCQl0LlJlcGxhY2VDaGlsZHJlbigxLCAyLCBuZXdDaGlsZCk7CisJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiKGEgYiB4KSI7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHQuVG9TdHJpbmdUcmVlKCkpOworCQkJdC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsV2l0aE9uZSgpCisJCXsKKwkJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJ4IikpOworCisJCQl0LlJlcGxhY2VDaGlsZHJlbigwLCAyLCBuZXdDaGlsZCk7CisJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiKGEgeCkiOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCB0LlRvU3RyaW5nVHJlZSgpKTsKKwkJCXQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbFdpdGhUd28oKQorCQl7CisJCQlJVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCQkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYSIpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYiIpKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJkIikpKTsKKworCQkJQ29tbW9uVHJlZSBuZXdDaGlsZHJlbiA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQluZXdDaGlsZHJlbi5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJ4IikpKTsKKwkJCW5ld0NoaWxkcmVuLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgInkiKSkpOworCisJCQl0LlJlcGxhY2VDaGlsZHJlbigwLCAyLCBuZXdDaGlsZHJlbik7CisJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiKGEgeCB5KSI7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHQuVG9TdHJpbmdUcmVlKCkpOworCQkJdC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCQl9CisKKwkJI2VuZHJlZ2lvbgorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvSVRyZWVOb2RlU3RyZWFtRml4dHVyZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9JVHJlZU5vZGVTdHJlYW1GaXh0dXJlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjQ0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvSVRyZWVOb2RlU3RyZWFtRml4dHVyZS5jcwpAQCAtMCwwICsxLDY2MCBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRlc3RzCit7CisJdXNpbmcgU3lzdGVtOworCXVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisJdXNpbmcgSVRva2VuID0gQW50bHIuUnVudGltZS5JVG9rZW47CisgICAgdXNpbmcgVG9rZW4gPSBBbnRsci5SdW50aW1lLlRva2VuVHlwZXM7CisJdXNpbmcgQ29tbW9uVG9rZW4gPSBBbnRsci5SdW50aW1lLkNvbW1vblRva2VuOworCXVzaW5nIElUcmVlID0gQW50bHIuUnVudGltZS5UcmVlLklUcmVlOworCXVzaW5nIElUcmVlTm9kZVN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZU5vZGVTdHJlYW07CisJdXNpbmcgQ29tbW9uVHJlZSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5Db21tb25UcmVlOworCXVzaW5nIENvbW1vblRyZWVOb2RlU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLkNvbW1vblRyZWVOb2RlU3RyZWFtOworCXVzaW5nIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gPSBBbnRsci5SdW50aW1lLlRyZWUuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbTsKKworCXVzaW5nIE1iVW5pdC5GcmFtZXdvcms7CisKKwlbVGVzdEZpeHR1cmVdCisJcHVibGljIGNsYXNzIElUcmVlTm9kZVN0cmVhbUZpeHR1cmUgOiBUZXN0Rml4dHVyZUJhc2UKKyAgICB7CisgICAgICAgICNyZWdpb24gQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSBUZXN0cworCisgICAgICAgIFtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTm9kZSgpCisJCXsKKwkJCUlUcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisKKwkJCUlUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbSh0KTsKKwkJCXN0cmluZyBleHBlY3RlZCA9ICIgMTAxIjsKKwkJCXN0cmluZyBhY3R1YWwgPSBHZXRTdHJpbmdPZkVudGlyZVN0cmVhbUNvbnRlbnRzV2l0aE5vZGVUeXBlc09ubHkoc3RyZWFtKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgYWN0dWFsKTsKKworCQkJZXhwZWN0ZWQgPSAiIDEwMSI7CisJCQlhY3R1YWwgPSBzdHJlYW0uVG9TdHJpbmcoKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgYWN0dWFsKTsKKwkJfQorCisJCVtUZXN0XQorCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBUZXN0IGEgdHJlZSB3aXRoIGZvdXIgbm9kZXMgLSBeKDEwMSBeKDEwMiAxMDMpIDEwNCkKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIHZvaWQgdGVzdDROb2RlcygpCisJCXsKKwkJCUlUcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQl0LkdldENoaWxkKDApLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisKKyAgICAgICAgICAgIElUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBDcmVhdGVCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHQpOworCQkJc3RyaW5nIGV4cGVjdGVkID0gIiAxMDEgMTAyIDEwMyAxMDQiOworCQkJc3RyaW5nIGFjdHVhbCA9IEdldFN0cmluZ09mRW50aXJlU3RyZWFtQ29udGVudHNXaXRoTm9kZVR5cGVzT25seShzdHJlYW0pOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpOworCisJCQlleHBlY3RlZCA9ICIgMTAxIDIgMTAyIDIgMTAzIDMgMTA0IDMiOworCQkJYWN0dWFsID0gc3RyZWFtLlRvU3RyaW5nKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdExpc3QoKQorCQl7CisJCQlJVHJlZSByb290ID0gbmV3IENvbW1vblRyZWUoKElUb2tlbiludWxsKTsKKworCQkJSVRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKwkJCXQuR2V0Q2hpbGQoMCkuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKworCQkJSVRyZWUgdSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKTsKKworCQkJcm9vdC5BZGRDaGlsZCh0KTsKKwkJCXJvb3QuQWRkQ2hpbGQodSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3IEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ocm9vdCk7CisJCQlzdHJpbmcgZXhwZWN0ZWQgPSAiIDEwMSAxMDIgMTAzIDEwNCAxMDUiOworCQkJc3RyaW5nIGFjdHVhbCA9IEdldFN0cmluZ09mRW50aXJlU3RyZWFtQ29udGVudHNXaXRoTm9kZVR5cGVzT25seShzdHJlYW0pOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpOworCisJCQlleHBlY3RlZCA9ICIgMTAxIDIgMTAyIDIgMTAzIDMgMTA0IDMgMTA1IjsKKwkJCWFjdHVhbCA9IHN0cmVhbS5Ub1N0cmluZygpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RGbGF0TGlzdCgpCisJCXsKKwkJCUlUcmVlIHJvb3QgPSBuZXcgQ29tbW9uVHJlZSgoSVRva2VuKW51bGwpOworCisJCQlyb290LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCQlyb290LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQlyb290LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3IEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ocm9vdCk7CisJCQlzdHJpbmcgZXhwZWN0ZWQgPSAiIDEwMSAxMDIgMTAzIjsKKwkJCXN0cmluZyBhY3R1YWwgPSBHZXRTdHJpbmdPZkVudGlyZVN0cmVhbUNvbnRlbnRzV2l0aE5vZGVUeXBlc09ubHkoc3RyZWFtKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgYWN0dWFsKTsKKworCQkJZXhwZWN0ZWQgPSAiIDEwMSAxMDIgMTAzIjsKKwkJCWFjdHVhbCA9IHN0cmVhbS5Ub1N0cmluZygpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RMaXN0V2l0aE9uZU5vZGUoKQorCQl7CisJCQlJVHJlZSByb290ID0gbmV3IENvbW1vblRyZWUoKElUb2tlbiludWxsKTsKKworCQkJcm9vdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSkpOworCisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHJvb3QpOworCQkJc3RyaW5nIGV4cGVjdGVkID0gIiAxMDEiOworCQkJc3RyaW5nIGFjdHVhbCA9IEdldFN0cmluZ09mRW50aXJlU3RyZWFtQ29udGVudHNXaXRoTm9kZVR5cGVzT25seShzdHJlYW0pOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpOworCisJCQlleHBlY3RlZCA9ICIgMTAxIjsKKwkJCWFjdHVhbCA9IHN0cmVhbS5Ub1N0cmluZygpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RBb3ZlckIoKQorCQl7CisJCQlJVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpOworCQkJdC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSkpOworCisgICAgICAgICAgICBJVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gQ3JlYXRlQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSh0KTsKKwkJCXN0cmluZyBleHBlY3RlZCA9ICIgMTAxIDEwMiI7CisJCQlzdHJpbmcgYWN0dWFsID0gR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KHN0cmVhbSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCk7CisKKwkJCWV4cGVjdGVkID0gIiAxMDEgMiAxMDIgMyI7CisJCQlhY3R1YWwgPSBzdHJlYW0uVG9TdHJpbmcoKTsKKwkJCUFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgYWN0dWFsKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0TFQoKQorCQl7CisJCQkvLyBeKDEwMSBeKDEwMiAxMDMpIDEwNCkKKwkJCUlUcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCQl0LkdldENoaWxkKDApLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisKKyAgICAgICAgICAgIElUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBDcmVhdGVCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHQpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEwMSwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLkRvd24sICgoSVRyZWUpc3RyZWFtLkxUKDIpKS5UeXBlKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDIsICgoSVRyZWUpc3RyZWFtLkxUKDMpKS5UeXBlKTsKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5Eb3duLCAoKElUcmVlKXN0cmVhbS5MVCg0KSkuVHlwZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMTAzLCAoKElUcmVlKXN0cmVhbS5MVCg1KSkuVHlwZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uVXAsICgoSVRyZWUpc3RyZWFtLkxUKDYpKS5UeXBlKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDQsICgoSVRyZWUpc3RyZWFtLkxUKDcpKS5UeXBlKTsKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5VcCwgKChJVHJlZSlzdHJlYW0uTFQoOCkpLlR5cGUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLkVuZE9mRmlsZSwgKChJVHJlZSlzdHJlYW0uTFQoOSkpLlR5cGUpOworCQkJLy8gY2hlY2sgd2F5IGFoZWFkCisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRW5kT2ZGaWxlLCAoKElUcmVlKXN0cmVhbS5MVCgxMDApKS5UeXBlKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0TWFya1Jld2luZEVudGlyZSgpCisJCXsKKwkJCS8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKwkJCS8vIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKwkJCS8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVwIFVwIDEwNCAxMDUgVXAgRW5kT2ZGaWxlCisJCQlJVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCUlUcmVlIHIxID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpOworCQkJcjAuQWRkQ2hpbGQocjEpOworCQkJcjEuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJCUlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQkJcjIuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKwkJCXIxLkFkZENoaWxkKHIyKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSkpOworCisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHIwKTsKKwkJCWludCBtID0gc3RyZWFtLk1hcmsoKTsgLy8gTUFSSworCQkJZm9yIChpbnQgayA9IDE7IGsgPD0gMTM7IGsrKykKKwkJCXsgLy8gY29uc3VtZSB0aWwgZW5kCisJCQkJc3RyZWFtLkxUKDEpOworCQkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQl9CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRW5kT2ZGaWxlLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uVXAsICgoSVRyZWUpc3RyZWFtLkxUKC0xKSkuVHlwZSk7CisJCQlzdHJlYW0uUmV3aW5kKG0pOyAgICAgIC8vIFJFV0lORAorCisJCQkvLyBjb25zdW1lIHRpbCBlbmQgYWdhaW4gOikKKwkJCWZvciAoaW50IGsgPSAxOyBrIDw9IDEzOyBrKyspCisJCQl7IC8vIGNvbnN1bWUgdGlsIGVuZAorCQkJCXN0cmVhbS5MVCgxKTsKKwkJCQlzdHJlYW0uQ29uc3VtZSgpOworCQkJfQorCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLkVuZE9mRmlsZSwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLlVwLCAoKElUcmVlKXN0cmVhbS5MVCgtMSkpLlR5cGUpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RNYXJrUmV3aW5kSW5NaWRkbGUoKQorCQl7CisJCQkvLyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisJCQkvLyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisJCQkvLyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVcCBVcCAxMDQgMTA1IFVwIEVuZE9mRmlsZQorCQkJSVRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCQlJVHJlZSByMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKTsKKwkJCXIwLkFkZENoaWxkKHIxKTsKKwkJCXIxLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCQlJVHJlZSByMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDYpKTsKKwkJCXIyLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDcpKSk7CisJCQlyMS5BZGRDaGlsZChyMik7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA0KSkpOworCQkJcjAuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNSkpKTsKKworICAgICAgICAgICAgQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXcgQnVmZmVyZWRUcmVlTm9kZVN0cmVhbShyMCk7CisJCQlmb3IgKGludCBrID0gMTsgayA8PSA3OyBrKyspCisJCQl7IC8vIGNvbnN1bWUgdGlsIG1pZGRsZQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCQlzdHJlYW0uQ29uc3VtZSgpOworCQkJfQorCQkJQXNzZXJ0LkFyZUVxdWFsKDEwNywgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJaW50IG0gPSBzdHJlYW0uTWFyaygpOyAvLyBNQVJLCisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwNworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBVcAorCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBVcAorCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDQKKwkJCXN0cmVhbS5SZXdpbmQobSk7ICAgICAgLy8gUkVXSU5ECisKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDcsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uVXAsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uVXAsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMTA0LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOworCQkJLy8gbm93IHdlJ3JlIHBhc3QgcmV3aW5kIHBvc2l0aW9uCisJCQlBc3NlcnQuQXJlRXF1YWwoMTA1LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLlVwLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLkVuZE9mRmlsZSwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLlVwLCAoKElUcmVlKXN0cmVhbS5MVCgtMSkpLlR5cGUpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RNYXJrUmV3aW5kTmVzdGVkKCkKKwkJeworCQkJLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorCQkJLy8gc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworCQkJLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVXAgVXAgMTA0IDEwNSBVcCBFbmRPZkZpbGUKKwkJCUlUcmVlIHIwID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpOworCQkJSVRyZWUgcjEgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSk7CisJCQlyMC5BZGRDaGlsZChyMSk7CisJCQlyMS5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCQkJSVRyZWUgcjIgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA2KSk7CisJCQlyMi5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA3KSkpOworCQkJcjEuQWRkQ2hpbGQocjIpOworCQkJcjAuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3IEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ocjApOworCQkJaW50IG0gPSBzdHJlYW0uTWFyaygpOyAvLyBNQVJLIGF0IHN0YXJ0CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwMQorCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBETgorCQkJaW50IG0yID0gc3RyZWFtLk1hcmsoKTsgLy8gTUFSSyBvbiAxMDIKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgMTAyCisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIEROCisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwMworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDYKKwkJCXN0cmVhbS5SZXdpbmQobTIpOyAgICAgIC8vIFJFV0lORCB0byAxMDIKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDIsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRG93biwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsKKwkJCS8vIHN0b3AgYXQgMTAzIGFuZCByZXdpbmQgdG8gc3RhcnQKKwkJCXN0cmVhbS5SZXdpbmQobSk7IC8vIFJFV0lORCB0byAxMDEKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDEsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRG93biwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDIsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRG93biwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RTZWVrKCkKKwkJeworCQkJLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorCQkJLy8gc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworCQkJLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVXAgVXAgMTA0IDEwNSBVcCBFbmRPZkZpbGUKKwkJCUlUcmVlIHIwID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpOworCQkJSVRyZWUgcjEgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSk7CisJCQlyMC5BZGRDaGlsZChyMSk7CisJCQlyMS5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCQkJSVRyZWUgcjIgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA2KSk7CisJCQlyMi5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA3KSkpOworCQkJcjEuQWRkQ2hpbGQocjIpOworCQkJcjAuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3IEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ocjApOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDEKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgRE4KKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgMTAyCisJCQlzdHJlYW0uU2Vlayg3KTsgICAvLyBzZWVrIHRvIDEwNworCQkJQXNzZXJ0LkFyZUVxdWFsKDEwNywgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDcKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgVXAKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgVXAKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDQsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0U2Vla0Zyb21TdGFydCgpCisJCXsKKwkJCS8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKwkJCS8vIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKwkJCS8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVwIFVwIDEwNCAxMDUgVXAgRW5kT2ZGaWxlCisJCQlJVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCUlUcmVlIHIxID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpOworCQkJcjAuQWRkQ2hpbGQocjEpOworCQkJcjEuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJCUlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQkJcjIuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKwkJCXIxLkFkZENoaWxkKHIyKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSkpOworCisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHIwKTsKKwkJCXN0cmVhbS5TZWVrKDcpOyAgIC8vIHNlZWsgdG8gMTA3CisJCQlBc3NlcnQuQXJlRXF1YWwoMTA3LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwNworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBVcAorCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBVcAorCQkJQXNzZXJ0LkFyZUVxdWFsKDEwNCwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQl9CisKKwkJW1Rlc3RdCisJCXB1YmxpYyB2b2lkIHRlc3RQdXNoUG9wKCkKKwkJeworCQkJLy8gXigxMDEgXigxMDIgMTAzKSBeKDEwNCAxMDUpIF4oMTA2IDEwNykgMTA4IDEwOSkKKwkJCS8vIHN0cmVhbSBoYXMgOSByZWFsICsgOCBuYXYgbm9kZXMKKwkJCS8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyBVcCAxMDQgRE4gMTA1IFVwIDEwNiBETiAxMDcgVXAgMTA4IDEwOSBVcAorCQkJSVRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCQlJVHJlZSByMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKTsKKwkJCXIxLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCQlyMC5BZGRDaGlsZChyMSk7CisJCQlJVHJlZSByMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKTsKKwkJCXIyLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKSk7CisJCQlyMC5BZGRDaGlsZChyMik7CisJCQlJVHJlZSByMyA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDYpKTsKKwkJCXIzLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDcpKSk7CisJCQlyMC5BZGRDaGlsZChyMyk7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA4KSkpOworCQkJcjAuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwOSkpKTsKKworICAgICAgICAgICAgQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXcgQnVmZmVyZWRUcmVlTm9kZVN0cmVhbShyMCk7CisJCQlTdHJpbmcgZXhwZWN0aW5nID0gIiAxMDEgMiAxMDIgMiAxMDMgMyAxMDQgMiAxMDUgMyAxMDYgMiAxMDcgMyAxMDggMTA5IDMiOworCQkJU3RyaW5nIGZvdW5kID0gc3RyZWFtLlRvU3RyaW5nKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJCS8vIEFzc3VtZSB3ZSB3YW50IHRvIGhpdCBub2RlIDEwNyBhbmQgdGhlbiAiY2FsbCAxMDIiIHRoZW4gcmV0dXJuCisKKwkJCWludCBpbmRleE9mMTAyID0gMjsKKwkJCWludCBpbmRleE9mMTA3ID0gMTI7CisJCQlmb3IgKGludCBrID0gMTsgayA8PSBpbmRleE9mMTA3OyBrKyspCisJCQl7IC8vIGNvbnN1bWUgdGlsIDEwNyBub2RlCisJCQkJc3RyZWFtLkNvbnN1bWUoKTsKKwkJCX0KKwkJCS8vIENBTEwgMTAyCisJCQlBc3NlcnQuQXJlRXF1YWwoMTA3LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uUHVzaChpbmRleE9mMTAyKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDIsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgMTAyCisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRG93biwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBETgorCQkJQXNzZXJ0LkFyZUVxdWFsKDEwMywgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDMKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5VcCwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJLy8gUkVUVVJOCisJCQlzdHJlYW0uUG9wKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMTA3LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdE5lc3RlZFB1c2hQb3AoKQorCQl7CisJCQkvLyBeKDEwMSBeKDEwMiAxMDMpIF4oMTA0IDEwNSkgXigxMDYgMTA3KSAxMDggMTA5KQorCQkJLy8gc3RyZWFtIGhhcyA5IHJlYWwgKyA4IG5hdiBub2RlcworCQkJLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIFVwIDEwNCBETiAxMDUgVXAgMTA2IEROIDEwNyBVcCAxMDggMTA5IFVwCisJCQlJVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCUlUcmVlIHIxID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpOworCQkJcjEuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJCXIwLkFkZENoaWxkKHIxKTsKKwkJCUlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpOworCQkJcjIuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNSkpKTsKKwkJCXIwLkFkZENoaWxkKHIyKTsKKwkJCUlUcmVlIHIzID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQkJcjMuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKwkJCXIwLkFkZENoaWxkKHIzKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDgpKSk7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA5KSkpOworCisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHIwKTsKKworCQkJLy8gQXNzdW1lIHdlIHdhbnQgdG8gaGl0IG5vZGUgMTA3IGFuZCB0aGVuICJjYWxsIDEwMiIsIHdoaWNoCisJCQkvLyBjYWxscyAxMDQsIHRoZW4gcmV0dXJuCisKKwkJCWludCBpbmRleE9mMTAyID0gMjsKKwkJCWludCBpbmRleE9mMTA3ID0gMTI7CisJCQlmb3IgKGludCBrID0gMTsgayA8PSBpbmRleE9mMTA3OyBrKyspCisJCQl7IC8vIGNvbnN1bWUgdGlsIDEwNyBub2RlCisJCQkJc3RyZWFtLkNvbnN1bWUoKTsKKwkJCX0KKwkJCUFzc2VydC5BcmVFcXVhbCgxMDcsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCS8vIENBTEwgMTAyCisJCQlzdHJlYW0uUHVzaChpbmRleE9mMTAyKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDIsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgMTAyCisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRG93biwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSBETgorCQkJQXNzZXJ0LkFyZUVxdWFsKDEwMywgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDMKKworCQkJLy8gQ0FMTCAxMDQKKwkJCWludCBpbmRleE9mMTA0ID0gNjsKKwkJCXN0cmVhbS5QdXNoKGluZGV4T2YxMDQpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEwNCwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDIKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5Eb3duLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIEROCisJCQlBc3NlcnQuQXJlRXF1YWwoMTA1LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwMworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLlVwLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQkvLyBSRVRVUk4gKHRvIFVwIG5vZGUgaW4gMTAyIHN1YnRyZWUpCisJCQlzdHJlYW0uUG9wKCk7CisKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5VcCwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJLy8gUkVUVVJOICh0byBlbXB0eSBzdGFjaykKKwkJCXN0cmVhbS5Qb3AoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxMDcsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJfQorCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCB0ZXN0UHVzaFBvcEZyb21FT0YoKQorCQl7CisJCQkvLyBeKDEwMSBeKDEwMiAxMDMpIF4oMTA0IDEwNSkgXigxMDYgMTA3KSAxMDggMTA5KQorCQkJLy8gc3RyZWFtIGhhcyA5IHJlYWwgKyA4IG5hdiBub2RlcworCQkJLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIFVwIDEwNCBETiAxMDUgVXAgMTA2IEROIDEwNyBVcCAxMDggMTA5IFVwCisJCQlJVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCUlUcmVlIHIxID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpOworCQkJcjEuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJCXIwLkFkZENoaWxkKHIxKTsKKwkJCUlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpOworCQkJcjIuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNSkpKTsKKwkJCXIwLkFkZENoaWxkKHIyKTsKKwkJCUlUcmVlIHIzID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQkJcjMuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKwkJCXIwLkFkZENoaWxkKHIzKTsKKwkJCXIwLkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDgpKSk7CisJCQlyMC5BZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA5KSkpOworCisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHIwKTsKKworCQkJd2hpbGUgKHN0cmVhbS5MQSgxKSAhPSBUb2tlbi5FbmRPZkZpbGUpCisJCQl7CisJCQkJc3RyZWFtLkNvbnN1bWUoKTsKKwkJCX0KKwkJCWludCBpbmRleE9mMTAyID0gMjsKKwkJCWludCBpbmRleE9mMTA0ID0gNjsKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5FbmRPZkZpbGUsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKworCQkJLy8gQ0FMTCAxMDIKKwkJCXN0cmVhbS5QdXNoKGluZGV4T2YxMDIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEwMiwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCQkJc3RyZWFtLkNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDIKKwkJCUFzc2VydC5BcmVFcXVhbChUb2tlbi5Eb3duLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIEROCisJCQlBc3NlcnQuQXJlRXF1YWwoMTAzLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwMworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLlVwLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQkvLyBSRVRVUk4gKHRvIGVtcHR5IHN0YWNrKQorCQkJc3RyZWFtLlBvcCgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLkVuZE9mRmlsZSwgKChJVHJlZSlzdHJlYW0uTFQoMSkpLlR5cGUpOworCisJCQkvLyBDQUxMIDEwNAorCQkJc3RyZWFtLlB1c2goaW5kZXhPZjEwNCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMTA0LCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCQlzdHJlYW0uQ29uc3VtZSgpOyAvLyBjb25zdW1lIDEwMgorCQkJQXNzZXJ0LkFyZUVxdWFsKFRva2VuLkRvd24sICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgRE4KKwkJCUFzc2VydC5BcmVFcXVhbCgxMDUsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCXN0cmVhbS5Db25zdW1lKCk7IC8vIGNvbnN1bWUgMTAzCisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uVXAsICgoSVRyZWUpc3RyZWFtLkxUKDEpKS5UeXBlKTsKKwkJCS8vIFJFVFVSTiAodG8gZW1wdHkgc3RhY2spCisJCQlzdHJlYW0uUG9wKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoVG9rZW4uRW5kT2ZGaWxlLCAoKElUcmVlKXN0cmVhbS5MVCgxKSkuVHlwZSk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdFN0YWNrU3RyZXRjaCgpCisJCXsKKwkJCS8vIG1ha2UgbW9yZSB0aGFuIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFIHB1c2hlcworCQkJSVRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHIwKTsKKwkJCS8vIGdvIDEgb3ZlciBpbml0aWFsIHNpemUKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgKyAxOyBpKyspCisJCQl7CisJCQkJc3RyZWFtLlB1c2goaSk7CisJCQl9CisJCQlBc3NlcnQuQXJlRXF1YWwoMTAsIHN0cmVhbS5Qb3AoKSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoOSwgc3RyZWFtLlBvcCgpKTsKKwkJfQorCisJCSNlbmRyZWdpb24KKworCisJCSNyZWdpb24gQ29tbW9uVHJlZU5vZGVTdHJlYW0gVGVzdHMKKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdEJ1ZmZlck92ZXJmbG93KCkKKwkJeworCQkJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJU3RyaW5nQnVpbGRlciBidWYyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCS8vIG1ha2UgXigxMDEgMTAyIC4uLiBuKQorCQkJSVRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJCWJ1Zi5BcHBlbmQoIiAxMDEiKTsKKwkJCWJ1ZjIuQXBwZW5kKCIgMTAxIik7CisJCQlidWYyLkFwcGVuZCgiICIpOworCQkJYnVmMi5BcHBlbmQoVG9rZW4uRG93bik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBDb21tb25UcmVlTm9kZVN0cmVhbS5ERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgKyAxMDsgaSsrKQorCQkJeworCQkJCXQuQWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMiArIGkpKSk7CisJCQkJYnVmLkFwcGVuZCgiICIpOworCQkJCWJ1Zi5BcHBlbmQoMTAyICsgaSk7CisJCQkJYnVmMi5BcHBlbmQoIiAiKTsKKwkJCQlidWYyLkFwcGVuZCgxMDIgKyBpKTsKKwkJCX0KKwkJCWJ1ZjIuQXBwZW5kKCIgIik7CisJCQlidWYyLkFwcGVuZChUb2tlbi5VcCk7CisKKyAgICAgICAgICAgIElUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbSh0KTsKKwkJCVN0cmluZyBleHBlY3RpbmcgPSBidWYuVG9TdHJpbmcoKTsKKwkJCVN0cmluZyBmb3VuZCA9IEdldFN0cmluZ09mRW50aXJlU3RyZWFtQ29udGVudHNXaXRoTm9kZVR5cGVzT25seShzdHJlYW0pOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGluZywgZm91bmQpOworCisJCQlleHBlY3RpbmcgPSBidWYyLlRvU3RyaW5nKCk7CisJCQlmb3VuZCA9IHN0cmVhbS5Ub1N0cmluZygpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGluZywgZm91bmQpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiB0YWlsIGhpdHMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBidXQgdGhlcmUKKwkJLy8vIGlzIG1vcmUgcm9vbSBsZWZ0LgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHJlbWFya3M+CisJCS8vLyBTcGVjaWZpY2FsbHkgdGhhdCB3b3VsZCBtZWFuIHRoYXQgaGVhZCBpcyBub3QgYXQgMCBidXQgaGFzIAorCQkvLy8gYWR2YW5jZWQgc29tZXdoZXJlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIuCisJCS8vLyAKKwkJLy8vIFVzZSBDb25zdW1lKCkgdG8gYWR2YW5jZSBOIG5vZGVzIGludG8gbG9va2FoZWFkLiAgVGhlbiB1c2UgTFQoKQorCQkvLy8gdG8gbG9hZCBhdCBsZWFzdCBJTklUSUFMX0xPT0tBSEVBRF9CVUZGRVJfU0laRS1OIG5vZGVzIHNvIHRoZQorCQkvLy8gYnVmZmVyIGhhcyB0byB3cmFwLgorCQkvLy8gPC9yZW1hcmtzPgorCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgdGVzdEJ1ZmZlcldyYXAoKQorCQl7CisJCQlpbnQgTiA9IDEwOworCQkJLy8gbWFrZSB0cmVlIHdpdGggdHlwZXM6IDEgMiAuLi4gSU5JVElBTF9MT09LQUhFQURfQlVGRkVSX1NJWkUrTgorCQkJSVRyZWUgdCA9IG5ldyBDb21tb25UcmVlKChJVG9rZW4pbnVsbCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENvbW1vblRyZWVOb2RlU3RyZWFtLkRFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSArIE47IGkrKykKKwkJCXsKKwkJCQl0LkFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbihpICsgMSkpKTsKKwkJCX0KKworCQkJLy8gbW92ZSBoZWFkIHRvIGluZGV4IE4KKyAgICAgICAgICAgIElUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbSh0KTsKKwkJCWZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykKKwkJCXsgLy8gY29uc3VtZSBOCisJCQkJSVRyZWUgbm9kZSA9IChJVHJlZSlzdHJlYW0uTFQoMSk7CisJCQkJQXNzZXJ0LkFyZUVxdWFsKGksIG5vZGUuVHlwZSk7CisJCQkJc3RyZWFtLkNvbnN1bWUoKTsKKwkJCX0KKworCQkJLy8gbm93IHVzZSBMVCB0byBsb29rYWhlYWQgcGFzdCBlbmQgb2YgYnVmZmVyCisgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0uREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFIC0gTjsKKwkJCWludCB3cmFwQnkgPSA0OyAvLyB3cmFwIGFyb3VuZCBieSA0IG5vZGVzCisJCQlBc3NlcnQuSXNUcnVlKHdyYXBCeSA8IE4sICJiYWQgdGVzdCBjb2RlOyB3cmFwQnkgbXVzdCBiZSBsZXNzIHRoYW4gTiIpOworCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gcmVtYWluaW5nICsgd3JhcEJ5OyBpKyspCisJCQl7IC8vIHdyYXAgcGFzdCBlbmQgb2YgYnVmZmVyCisJCQkJSVRyZWUgbm9kZSA9IChJVHJlZSlzdHJlYW0uTFQoaSk7IC8vIGxvb2sgYWhlYWQgdG8gaXRoIHRva2VuCisJCQkJQXNzZXJ0LkFyZUVxdWFsKE4gKyBpLCBub2RlLlR5cGUpOworCQkJfQorCQl9CisKKwkJI2VuZHJlZ2lvbgorCisKKwkJI3JlZ2lvbiBIZWxwZXIgTWV0aG9kcworCisgICAgICAgIHByb3RlY3RlZCBJVHJlZU5vZGVTdHJlYW0gQ3JlYXRlQnVmZmVyZWRUcmVlTm9kZVN0cmVhbShvYmplY3QgdCkKKwkJeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtKHQpOworCQl9CisKKwkJcHJvdGVjdGVkIElUcmVlTm9kZVN0cmVhbSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbShvYmplY3QgdCkKKwkJeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSh0KTsKKwkJfQorCisJCXB1YmxpYyBzdHJpbmcgR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KElUcmVlTm9kZVN0cmVhbSBub2RlcykKKwkJeworCQkJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5Db3VudDsgaSsrKQorCQkJeworCQkJCW9iamVjdCB0ID0gbm9kZXMuTFQoaSArIDEpOworCQkJCWludCB0eXBlID0gbm9kZXMuVHJlZUFkYXB0b3IuR2V0VHlwZSh0KTsKKwkJCQlpZiAoISgodHlwZSA9PSBUb2tlbi5Eb3duKSB8fCAodHlwZSA9PSBUb2tlbi5VcCkpKQorCQkJCXsKKwkJCQkJYnVmLkFwcGVuZCgiICIpOworCQkJCQlidWYuQXBwZW5kKHR5cGUpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBidWYuVG9TdHJpbmcoKTsKKwkJfQorCisJCSNlbmRyZWdpb24KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDE5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw2OSBAQAor77u/LyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkFudGxyMy5SdW50aW1lLlRlc3RzIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRvc2hpYmEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJBbnRscjMuUnVudGltZS5UZXN0cyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIFRvc2hpYmEgMjAwNyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZTdhOTc0NTUtYTNlMy00ODc3LWE5MGItYjFiMTI2MDZkYWMxIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24gCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIFJldmlzaW9uIGFuZCBCdWlsZCBOdW1iZXJzIAorLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9SZXdyaXRlUnVsZVh4eHhTdHJlYW1GaXh0dXJlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Jld3JpdGVSdWxlWHh4eFN0cmVhbUZpeHR1cmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMzA3OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9SZXdyaXRlUnVsZVh4eHhTdHJlYW1GaXh0dXJlLmNzCkBAIC0wLDAgKzEsMzkyIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA3IEpvaGFubmVzIEx1YmVyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBNVVNUIFJFVEFJTiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gTVVTVCBSRVBST0RVQ0UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciBXUklUVEVOIHBlcm1pc3Npb24uCis0LiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSAKKyAgIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoaXMgd29yayB0byB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGxpY2Vuc29yCisgICBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNlLCB3aXRob3V0IGFueSAKKyAgIGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMjE5IC8vIE5vIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UZXN0cyB7CisJdXNpbmcgU3lzdGVtOworCXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCXVzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKworCXVzaW5nIE1iVW5pdC5GcmFtZXdvcms7CisKKwlbVGVzdEZpeHR1cmVdCisJcHVibGljIGNsYXNzIFJld3JpdGVSdWxlWHh4eFN0cmVhbUZpeHR1cmUgOiBUZXN0Rml4dHVyZUJhc2UgeworCQkjcmVnaW9uIENoZWNrIENvbnN0cnVjdG9ycworCisJCVtUZXN0XQorCQlwdWJsaWMgdm9pZCBDaGVja1Jld3JpdGVSdWxlVG9rZW5TdHJlYW1Db25zdHJ1Y3RvcnMoKSB7CisJCQlSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRva2VuVGVzdDEgPSBuZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShDcmVhdGVUcmVlQWRhcHRvcigpLAorCQkJCSJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QxIik7CisKKwkJCVJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdG9rZW5UZXN0MiA9IG5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCisJCQkJIlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdGVzdDIiLCBDcmVhdGVUb2tlbigxLAorCQkJCSJ0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCIpKTsKKworCQkJUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0b2tlblRlc3QzID0gbmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oQ3JlYXRlVHJlZUFkYXB0b3IoKSwKKwkJCQkiUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0ZXN0MyIsIENyZWF0ZVRva2VuTGlzdCg0KSk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgQ2hlY2tSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW1Db25zdHJ1Y3RvcnMoKSB7CisJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3VidHJlZVRlc3QxID0KKwkJCQluZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCisJCQkJIlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0MSIpOworCisJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3VidHJlZVRlc3QyID0KKwkJCQluZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCisJCQkJIlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0MiIsIENyZWF0ZVRva2VuKDEsCisJCQkJInRlc3QgdG9rZW4gd2l0aG91dCBhbnkgcmVhbCBjb250ZXh0IikpOworCisJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3VidHJlZVRlc3QzID0KKwkJCQluZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCisJCQkJIlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0MyIsIENyZWF0ZVRva2VuTGlzdCg0KSk7CisJCX0KKworCQlbVGVzdF0KKwkJcHVibGljIHZvaWQgQ2hlY2tSZXdyaXRlUnVsZU5vZGVTdHJlYW1Db25zdHJ1Y3RvcnMoKSB7CisJCQlSZXdyaXRlUnVsZU5vZGVTdHJlYW0gbm9kZVRlc3QxID0gbmV3IFJld3JpdGVSdWxlTm9kZVN0cmVhbShDcmVhdGVUcmVlQWRhcHRvcigpLAorCQkJCSJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdDEiKTsKKworCQkJUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIG5vZGVUZXN0MiA9IG5ldyBSZXdyaXRlUnVsZU5vZGVTdHJlYW0oQ3JlYXRlVHJlZUFkYXB0b3IoKSwKKwkJCQkiUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIHRlc3QyIiwgQ3JlYXRlVG9rZW4oMSwKKwkJCQkidGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQiKSk7CisKKwkJCVJld3JpdGVSdWxlTm9kZVN0cmVhbSBub2RlVGVzdDMgPSBuZXcgUmV3cml0ZVJ1bGVOb2RlU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCisJCQkJIlJld3JpdGVSdWxlTm9kZVN0cmVhbSB0ZXN0MyIsIENyZWF0ZVRva2VuTGlzdCg0KSk7CisJCX0KKwkJI2VuZHJlZ2lvbgorCisJCSNyZWdpb24gTWV0aG9kIFRlc3RzCisKKwkJI3JlZ2lvbiBFbXB0eSBCZWhhdmlvdXIKKwkJW1Rlc3RdCisJCVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKSwgIlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSVG9rZW5TdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MSgpIHsKKwkJCXN0cmluZyBkZXNjcmlwdGlvbiA9ICJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QiOworCQkJUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0b2tlblRlc3QgPQorCQkJCW5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCWRlc2NyaXB0aW9uKTsKKworCQkJQXNzZXJ0LklzRmFsc2UodG9rZW5UZXN0Lkhhc05leHQsICJ0b2tlblRlc3QgaGFzIHRvIGdpdmUgYmFjayBmYWxzZSBoZXJlLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKGRlc2NyaXB0aW9uLlRvU3RyaW5nKCksIHRva2VuVGVzdC5EZXNjcmlwdGlvbiwKKwkJCQkiRGVzY3JpcHRpb24gc3RyaW5ncyBzaG91bGQgYmUgZXF1YWwuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgdG9rZW5UZXN0LkNvdW50LCAiVGhlIG51bWJlciBvZiBlbGVtZW50cyBzaG91bGQgYmUgemVyby4iKTsKKwkJCXRva2VuVGVzdC5SZXNldCgpOworCQkJQXNzZXJ0LklzVHJ1ZSh0cnVlLCAiUmVzZXQoKSBzaG91bGRuJ3QgbWFrZSBhbnkgcHJvYmxlbXMgaGVyZS4iKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgwLCB0b2tlblRlc3QuQ291bnQsCisJCQkJIlRoZSBudW1iZXIgb2YgZWxlbWVudHMgc2hvdWxkIGJlIHN0aWxsIHplcm8uIik7CisJCQl0b2tlblRlc3QuTmV4dE5vZGUoKTsKKwkJfQorCisJCVtUZXN0XQorCQlbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbiksCisJCQkiUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHRlc3QiKV0KKwkJcHVibGljIHZvaWQgQ2hlY2tSUlN1YnRyZWVTdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MSgpIHsKKwkJCXN0cmluZyBkZXNjcmlwdGlvbiA9ICJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gdGVzdCI7CisJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3VidHJlZVRlc3QgPQorCQkJCW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oQ3JlYXRlVHJlZUFkYXB0b3IoKSwgZGVzY3JpcHRpb24pOworCisJCQlBc3NlcnQuSXNGYWxzZShzdWJ0cmVlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBoYXMgdG8gZ2l2ZSBiYWNrIGZhbHNlIGhlcmUuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoZGVzY3JpcHRpb24uVG9TdHJpbmcoKSwgc3VidHJlZVRlc3QuRGVzY3JpcHRpb24sCisJCQkJIkRlc2NyaXB0aW9uIHN0cmluZ3Mgc2hvdWxkIGJlIGVxdWFsLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIHN1YnRyZWVUZXN0LkNvdW50LCAiVGhlIG51bWJlciBvZiBlbGVtZW50cyBzaG91bGQgYmUgemVyby4iKTsKKwkJCXN1YnRyZWVUZXN0LlJlc2V0KCk7CisJCQlBc3NlcnQuSXNUcnVlKHRydWUsICJSZXNldCgpIHNob3VsZG4ndCBtYWtlIGFueSBwcm9ibGVtcyBoZXJlLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDAsIHN1YnRyZWVUZXN0LkNvdW50LAorCQkJCSJUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHNob3VsZCBiZSBzdGlsbCB6ZXJvLiIpOworCQkJc3VidHJlZVRlc3QuTmV4dE5vZGUoKTsKKwkJfQorCisJCVtUZXN0XQorCQlbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbiksICJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSTm9kZVN0cmVhbUJlaGF2aW91cldoaWxlRW1wdHkxKCkgeworCQkJc3RyaW5nIGRlc2NyaXB0aW9uID0gIlJld3JpdGVSdWxlTm9kZVN0cmVhbSB0ZXN0IjsKKwkJCVJld3JpdGVSdWxlTm9kZVN0cmVhbSBub2RlVGVzdCA9CisJCQkJbmV3IFJld3JpdGVSdWxlTm9kZVN0cmVhbShDcmVhdGVUcmVlQWRhcHRvcigpLCBkZXNjcmlwdGlvbik7CisKKwkJCUFzc2VydC5Jc0ZhbHNlKG5vZGVUZXN0Lkhhc05leHQsICJIYXNOZXh0IGhhcyB0byBnaXZlIGJhY2sgZmFsc2UgaGVyZS4iKTsKKwkJCUFzc2VydC5BcmVFcXVhbChkZXNjcmlwdGlvbi5Ub1N0cmluZygpLCBub2RlVGVzdC5EZXNjcmlwdGlvbiwKKwkJCQkiRGVzY3JpcHRpb24gc3RyaW5ncyBzaG91bGQgYmUgZXF1YWwuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgbm9kZVRlc3QuQ291bnQsICJUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHNob3VsZCBiZSB6ZXJvLiIpOworCQkJbm9kZVRlc3QuUmVzZXQoKTsKKwkJCUFzc2VydC5Jc1RydWUodHJ1ZSwgIlJlc2V0KCkgc2hvdWxkbid0IG1ha2UgYW55IHByb2JsZW1zIGhlcmUuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMCwgbm9kZVRlc3QuQ291bnQsCisJCQkJIlRoZSBudW1iZXIgb2YgZWxlbWVudHMgc2hvdWxkIGJlIHN0aWxsIHplcm8uIik7CisJCQlub2RlVGVzdC5OZXh0Tm9kZSgpOworCQl9CisKKwkJW1Rlc3RdCisJCVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKSwgIlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSVG9rZW5TdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MigpIHsKKwkJCVJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdG9rZW5UZXN0ID0gbmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oQ3JlYXRlVHJlZUFkYXB0b3IoKSwKKwkJCQkiUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0ZXN0Iik7CisKKwkJCXRva2VuVGVzdC5OZXh0VHJlZSgpOworCQl9CisKKwkJW1Rlc3RdCisJCVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKSwKKwkJCSJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSU3VidHJlZVN0cmVhbUJlaGF2aW91cldoaWxlRW1wdHkyKCkgeworCQkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN1YnRyZWVUZXN0ID0gbmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSgKKwkJCQlDcmVhdGVUcmVlQWRhcHRvcigpLCAiUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHRlc3QiKTsKKworCQkJc3VidHJlZVRlc3QuTmV4dFRyZWUoKTsKKwkJfQorCisJCVtUZXN0XQorCQlbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbiksICJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSTm9kZVN0cmVhbUJlaGF2aW91cldoaWxlRW1wdHkyKCkgeworCQkJUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIG5vZGVUZXN0ID0gbmV3IFJld3JpdGVSdWxlTm9kZVN0cmVhbShDcmVhdGVUcmVlQWRhcHRvcigpLAorCQkJCSJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdCIpOworCisJCQlub2RlVGVzdC5OZXh0VHJlZSgpOworCQl9CisKKwkJW1Rlc3RdCisJCVtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKSwgIlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSVG9rZW5TdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MygpIHsKKwkJCVJld3JpdGVSdWxlVG9rZW5TdHJlYW0gdG9rZW5UZXN0ID0gbmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oQ3JlYXRlVHJlZUFkYXB0b3IoKSwKKwkJCQkiUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0ZXN0Iik7CisKKwkJCXRva2VuVGVzdC5OZXh0VG9rZW4oKTsKKwkJfQorCisJCSNlbmRyZWdpb24KKworCQkjcmVnaW9uIEJlaGF2aW91ciB3aXRoIEVsZW1lbnRzCisJCVtUZXN0XQorCQlbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbiksICJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QiKV0KKwkJcHVibGljIHZvaWQgQ2hlY2tSUlRva2VuU3RyZWFtQmVoYXZpb3VyV2l0aEVsZW1lbnRzKCkgeworCQkJUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0b2tlblRlc3QgPSBuZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShDcmVhdGVUcmVlQWRhcHRvcigpLAorCQkJCSJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QiKTsKKworCQkJSVRva2VuIHRva2VuMSA9IENyZWF0ZVRva2VuKDEsICJ0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCIpOworCisJCQkvLyBUZXN0IEFkZCgpCisJCQl0b2tlblRlc3QuQWRkKHRva2VuMSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5UZXN0LkNvdW50LCAidG9rZW5UZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDEpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZSh0b2tlblRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIHRydWUgaGVyZSAoMSkuIik7CisKKwkJCS8vIFRlc3QgTmV4dE5vZGUoKQorCQkJQ29tbW9uVHJlZSB0cmVlID0gKENvbW1vblRyZWUpIHRva2VuVGVzdC5OZXh0Tm9kZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKHRva2VuMSwgdHJlZS5Ub2tlbiwKKwkJCQkiVGhlIHJldHVybmVkIHRva2VuIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgZ2l2ZW4gdG9rZW4gKDEpLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHRva2VuVGVzdC5Db3VudCwgInRva2VuVGVzdCBzaG91bGQgaGF2ZSB0aGUgc2l6ZSAxICgyKS4iKTsKKwkJCUFzc2VydC5Jc0ZhbHNlKHRva2VuVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgZmFsc2UgaGVyZSAoMSkuIik7CisJCQl0b2tlblRlc3QuUmVzZXQoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCB0b2tlblRlc3QuQ291bnQsICJ0b2tlblRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoMykuIik7CisJCQlBc3NlcnQuSXNUcnVlKHRva2VuVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgdHJ1ZSBoZXJlICgyKS4iKTsKKworCQkJLy8gVGVzdCBOZXh0VG9rZW4oKQorCQkJSVRva2VuIHJldHVybmVkVG9rZW4gPSB0b2tlblRlc3QuTmV4dFRva2VuKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwodG9rZW4xLCByZXR1cm5lZFRva2VuLAorCQkJCSJUaGUgcmV0dXJuZWQgdG9rZW4gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBnaXZlbiB0b2tlbiAoMikuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5UZXN0LkNvdW50LCAidG9rZW5UZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDQpLiIpOworCQkJQXNzZXJ0LklzRmFsc2UodG9rZW5UZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSBmYWxzZSBoZXJlICgyKS4iKTsKKwkJCXRva2VuVGVzdC5SZXNldCgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHRva2VuVGVzdC5Db3VudCwgInRva2VuVGVzdCBzaG91bGQgaGF2ZSB0aGUgc2l6ZSAxICg1KS4iKTsKKwkJCUFzc2VydC5Jc1RydWUodG9rZW5UZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSB0cnVlIGhlcmUgKDMpLiIpOworCisJCQkvLyBUZXN0IE5leHRUcmVlKCkKKwkJCXJldHVybmVkVG9rZW4gPSAoSVRva2VuKSB0b2tlblRlc3QuTmV4dFRyZWUoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCh0b2tlbjEsIHJldHVybmVkVG9rZW4sCisJCQkJIlRoZSByZXR1cm5lZCB0b2tlbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHRva2VuICgzKS4iKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCB0b2tlblRlc3QuQ291bnQsICJ0b2tlblRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoNikuIik7CisJCQlBc3NlcnQuSXNGYWxzZSh0b2tlblRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIGZhbHNlIGhlcmUgKDIpLiIpOworCQkJdG9rZW5UZXN0LlJlc2V0KCk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5UZXN0LkNvdW50LCAidG9rZW5UZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDcpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZSh0b2tlblRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIHRydWUgaGVyZSAoMykuIik7CisKKwkJCS8vIFRlc3QsIHdoYXQgaGFwcGVucyB3aXRoIHR3byBlbGVtZW50cworCQkJSVRva2VuIHRva2VuMiA9IENyZWF0ZVRva2VuKDIsICJ0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCIpOworCisJCQl0b2tlblRlc3QuQWRkKHRva2VuMik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgdG9rZW5UZXN0LkNvdW50LCAidG9rZW5UZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDIgKDEpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZSh0b2tlblRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIHRydWUgaGVyZSAoNCkuIik7CisJCQlyZXR1cm5lZFRva2VuID0gdG9rZW5UZXN0Lk5leHRUb2tlbigpOworCQkJQXNzZXJ0LkFyZUVxdWFsKHRva2VuMSwgcmV0dXJuZWRUb2tlbiwKKwkJCQkiVGhlIHJldHVybmVkIHRva2VuIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgZ2l2ZW4gdG9rZW4gKDQpLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIHRva2VuVGVzdC5Db3VudCwgInRva2VuVGVzdCBzaG91bGQgaGF2ZSB0aGUgc2l6ZSAyICgyKS4iKTsKKwkJCUFzc2VydC5Jc1RydWUodG9rZW5UZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSB0cnVlIGhlcmUgKDUpLiIpOworCQkJcmV0dXJuZWRUb2tlbiA9IHRva2VuVGVzdC5OZXh0VG9rZW4oKTsKKwkJCUFzc2VydC5BcmVFcXVhbCh0b2tlbjIsIHJldHVybmVkVG9rZW4sCisJCQkJIlRoZSByZXR1cm5lZCB0b2tlbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHRva2VuICg1KS4iKTsKKwkJCUFzc2VydC5Jc0ZhbHNlKHRva2VuVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgZmFsc2UgaGVyZSAoMykuIik7CisKKwkJCS8vIFRlc3QgZXhjZXB0aW9uCisJCQl0b2tlblRlc3QuTmV4dFRva2VuKCk7CisJCX0KKworCQlbVGVzdF0KKwkJW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24pLAorCQkJIlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0IildCisJCXB1YmxpYyB2b2lkIENoZWNrUlJTdWJ0cmVlU3RyZWFtQmVoYXZpb3VyV2l0aEVsZW1lbnRzKCkgeworCQkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN1YnRyZWVUZXN0ID0KKwkJCQluZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKENyZWF0ZVRyZWVBZGFwdG9yKCksCisJCQkJIlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0Iik7CisKKwkJCUlUb2tlbiB0b2tlbjEgPSBDcmVhdGVUb2tlbigxLCAidGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQiKTsKKwkJCUlUcmVlIHRyZWUxID0gQ3JlYXRlVHJlZSh0b2tlbjEpOworCisJCQkvLyBUZXN0IEFkZCgpCisJCQlzdWJ0cmVlVGVzdC5BZGQodHJlZTEpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN1YnRyZWVUZXN0LkNvdW50LCAic3VidHJlZVRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoMSkuIik7CisJCQlBc3NlcnQuSXNUcnVlKHN1YnRyZWVUZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSB0cnVlIGhlcmUgKDEpLiIpOworCisJCQkvLyBUZXN0IE5leHROb2RlKCkKKwkJCUFzc2VydC5BcmVFcXVhbCh0cmVlMSwgKElUcmVlKSBzdWJ0cmVlVGVzdC5OZXh0Tm9kZSgpLAorCQkJCSJUaGUgcmV0dXJuZWQgdHJlZSBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHRyZWUgKDEpLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN1YnRyZWVUZXN0LkNvdW50LCAic3VidHJlZVRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoMikuIik7CisJCQlBc3NlcnQuSXNGYWxzZShzdWJ0cmVlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgZmFsc2UgaGVyZSAoMSkuIik7CisJCQlzdWJ0cmVlVGVzdC5SZXNldCgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIHN1YnRyZWVUZXN0LkNvdW50LCAic3VidHJlZVRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoMykuIik7CisJCQlBc3NlcnQuSXNUcnVlKHN1YnRyZWVUZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSB0cnVlIGhlcmUgKDIpLiIpOworCQkJCisJCQkvLyBUZXN0IE5leHRUcmVlKCkKKwkJCUNvbW1vblRyZWUgcmV0dXJuZWRUcmVlID0gKENvbW1vblRyZWUpIHN1YnRyZWVUZXN0Lk5leHRUcmVlKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwodG9rZW4xLCByZXR1cm5lZFRyZWUuVG9rZW4sCisJCQkJIlRoZSByZXR1cm5lZCB0b2tlbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHRva2VuICgzKS4iKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdWJ0cmVlVGVzdC5Db3VudCwgInN1YnRyZWVUZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDQpLiIpOworCQkJQXNzZXJ0LklzRmFsc2Uoc3VidHJlZVRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIGZhbHNlIGhlcmUgKDIpLiIpOworCQkJc3VidHJlZVRlc3QuUmVzZXQoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBzdWJ0cmVlVGVzdC5Db3VudCwgInN1YnRyZWVUZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDUpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZShzdWJ0cmVlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgdHJ1ZSBoZXJlICgzKS4iKTsKKwkJCQorCQkJLy8gVGVzdCwgd2hhdCBoYXBwZW5zIHdpdGggdHdvIGVsZW1lbnRzCisJCQlJVG9rZW4gdG9rZW4yID0gQ3JlYXRlVG9rZW4oMiwgInRlc3QgdG9rZW4gd2l0aG91dCBhbnkgcmVhbCBjb250ZXh0Iik7CisJCQlJVHJlZSB0cmVlMiA9IENyZWF0ZVRyZWUodG9rZW4yKTsKKworCQkJc3VidHJlZVRlc3QuQWRkKHRyZWUyKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBzdWJ0cmVlVGVzdC5Db3VudCwgInN1YnRyZWVUZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDIgKDEpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZShzdWJ0cmVlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgdHJ1ZSBoZXJlICg0KS4iKTsKKwkJCXJldHVybmVkVHJlZSA9IChDb21tb25UcmVlKSBzdWJ0cmVlVGVzdC5OZXh0VHJlZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKHRva2VuMSwgcmV0dXJuZWRUcmVlLlRva2VuLAorCQkJCSJUaGUgcmV0dXJuZWQgdG9rZW4gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBnaXZlbiB0b2tlbiAoNCkuIik7CisJCQlBc3NlcnQuQXJlRXF1YWwoMiwgc3VidHJlZVRlc3QuQ291bnQsICJzdWJ0cmVlVGVzdCBzaG91bGQgaGF2ZSB0aGUgc2l6ZSAyICgyKS4iKTsKKwkJCUFzc2VydC5Jc1RydWUoc3VidHJlZVRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIHRydWUgaGVyZSAoNSkuIik7CisJCQlyZXR1cm5lZFRyZWUgPSAoQ29tbW9uVHJlZSkgc3VidHJlZVRlc3QuTmV4dFRyZWUoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCh0b2tlbjIsIHJldHVybmVkVHJlZS5Ub2tlbiwKKwkJCQkiVGhlIHJldHVybmVkIHRva2VuIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgZ2l2ZW4gdG9rZW4gKDUpLiIpOworCQkJQXNzZXJ0LklzRmFsc2Uoc3VidHJlZVRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIGZhbHNlIGhlcmUgKDMpLiIpOworCisJCQkvLyBUZXN0IGV4Y2VwdGlvbgorCQkJc3VidHJlZVRlc3QuTmV4dFRyZWUoKTsKKwkJfQorCisJCVtUZXN0XQorCQlbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbiksICJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdCIpXQorCQlwdWJsaWMgdm9pZCBDaGVja1JSTm9kZVN0cmVhbUJlaGF2aW91cldpdGhFbGVtZW50cygpIHsKKwkJCVJld3JpdGVSdWxlTm9kZVN0cmVhbSBub2RlVGVzdCA9IG5ldyBSZXdyaXRlUnVsZU5vZGVTdHJlYW0oQ3JlYXRlVHJlZUFkYXB0b3IoKSwKKwkJCQkiUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIHRlc3QiKTsKKworCQkJSVRva2VuIHRva2VuMSA9IENyZWF0ZVRva2VuKDEsICJ0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCIpOworCQkJSVRyZWUgdHJlZTEgPSBDcmVhdGVUcmVlKHRva2VuMSk7CisKKwkJCS8vIFRlc3QgQWRkKCkKKwkJCW5vZGVUZXN0LkFkZCh0cmVlMSk7CisJCQlBc3NlcnQuQXJlRXF1YWwoMSwgbm9kZVRlc3QuQ291bnQsICJub2RlVGVzdCBzaG91bGQgaGF2ZSB0aGUgc2l6ZSAxICgxKS4iKTsKKwkJCUFzc2VydC5Jc1RydWUobm9kZVRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIHRydWUgaGVyZSAoMSkuIik7CisKKwkJCS8vIFRlc3QgTmV4dE5vZGUoKQorCQkJQ29tbW9uVHJlZSByZXR1cm5lZFRyZWUgPSAoQ29tbW9uVHJlZSkgbm9kZVRlc3QuTmV4dE5vZGUoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCh0cmVlMS5UeXBlLCByZXR1cm5lZFRyZWUuVHlwZSwKKwkJCQkiVGhlIHJldHVybmVkIHRyZWUgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBnaXZlbiB0cmVlICgxKS4iKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBub2RlVGVzdC5Db3VudCwgIm5vZGVUZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDIpLiIpOworCQkJQXNzZXJ0LklzRmFsc2Uobm9kZVRlc3QuSGFzTmV4dCwgIkhhc05leHQgc2hvdWxkIGJlIGZhbHNlIGhlcmUgKDEpLiIpOworCQkJbm9kZVRlc3QuUmVzZXQoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgxLCBub2RlVGVzdC5Db3VudCwgIm5vZGVUZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDEgKDMpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZShub2RlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgdHJ1ZSBoZXJlICgyKS4iKTsKKworCQkJLy8gVGVzdCBOZXh0VHJlZSgpCisJCQlyZXR1cm5lZFRyZWUgPSAoQ29tbW9uVHJlZSkgbm9kZVRlc3QuTmV4dFRyZWUoKTsKKwkJCUFzc2VydC5BcmVFcXVhbCh0b2tlbjEsIHJldHVybmVkVHJlZS5Ub2tlbiwKKwkJCQkiVGhlIHJldHVybmVkIHRva2VuIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgZ2l2ZW4gdG9rZW4gKDMpLiIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIG5vZGVUZXN0LkNvdW50LCAibm9kZVRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoNCkuIik7CisJCQlBc3NlcnQuSXNGYWxzZShub2RlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgZmFsc2UgaGVyZSAoMikuIik7CisJCQlub2RlVGVzdC5SZXNldCgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDEsIG5vZGVUZXN0LkNvdW50LCAibm9kZVRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMSAoNSkuIik7CisJCQlBc3NlcnQuSXNUcnVlKG5vZGVUZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSB0cnVlIGhlcmUgKDMpLiIpOworCisJCQkvLyBUZXN0LCB3aGF0IGhhcHBlbnMgd2l0aCB0d28gZWxlbWVudHMKKwkJCUlUb2tlbiB0b2tlbjIgPSBDcmVhdGVUb2tlbigyLCAidGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQiKTsKKwkJCUlUcmVlIHRyZWUyID0gQ3JlYXRlVHJlZSh0b2tlbjIpOworCisJCQlub2RlVGVzdC5BZGQodHJlZTIpOworCQkJQXNzZXJ0LkFyZUVxdWFsKDIsIG5vZGVUZXN0LkNvdW50LCAibm9kZVRlc3Qgc2hvdWxkIGhhdmUgdGhlIHNpemUgMiAoMSkuIik7CisJCQlBc3NlcnQuSXNUcnVlKG5vZGVUZXN0Lkhhc05leHQsICJIYXNOZXh0IHNob3VsZCBiZSB0cnVlIGhlcmUgKDQpLiIpOworCQkJcmV0dXJuZWRUcmVlID0gKENvbW1vblRyZWUpIG5vZGVUZXN0Lk5leHRUcmVlKCk7CisJCQlBc3NlcnQuQXJlRXF1YWwodG9rZW4xLCByZXR1cm5lZFRyZWUuVG9rZW4sCisJCQkJIlRoZSByZXR1cm5lZCB0b2tlbiBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIGdpdmVuIHRva2VuICg0KS4iKTsKKwkJCUFzc2VydC5BcmVFcXVhbCgyLCBub2RlVGVzdC5Db3VudCwgIm5vZGVUZXN0IHNob3VsZCBoYXZlIHRoZSBzaXplIDIgKDIpLiIpOworCQkJQXNzZXJ0LklzVHJ1ZShub2RlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgdHJ1ZSBoZXJlICg1KS4iKTsKKwkJCXJldHVybmVkVHJlZSA9IChDb21tb25UcmVlKSBub2RlVGVzdC5OZXh0VHJlZSgpOworCQkJQXNzZXJ0LkFyZUVxdWFsKHRva2VuMiwgcmV0dXJuZWRUcmVlLlRva2VuLAorCQkJCSJUaGUgcmV0dXJuZWQgdG9rZW4gc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBnaXZlbiB0b2tlbiAoNSkuIik7CisJCQlBc3NlcnQuSXNGYWxzZShub2RlVGVzdC5IYXNOZXh0LCAiSGFzTmV4dCBzaG91bGQgYmUgZmFsc2UgaGVyZSAoMykuIik7CisKKwkJCS8vIFRlc3QgZXhjZXB0aW9uCisJCQlub2RlVGVzdC5OZXh0VHJlZSgpOworCQl9CisKKwkJI2VuZHJlZ2lvbgorCisJCSNlbmRyZWdpb24KKworCisJCSNyZWdpb24gSGVscGVyIE1ldGhvZHMKKworCQlwcml2YXRlIElUcmVlQWRhcHRvciBDcmVhdGVUcmVlQWRhcHRvcigpIHsKKwkJCXJldHVybiBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJfQorCisJCXByaXZhdGUgSVRyZWUgQ3JlYXRlVHJlZShJVG9rZW4gdG9rZW4pIHsKKwkJCXJldHVybiBuZXcgQ29tbW9uVHJlZSh0b2tlbik7CisJCX0KKworCQlwcml2YXRlIElUb2tlbiBDcmVhdGVUb2tlbihpbnQgdHlwZSwgc3RyaW5nIHRleHQpIHsKKwkJCXJldHVybiBuZXcgQ29tbW9uVG9rZW4odHlwZSwgdGV4dCk7CisJCX0KKworCQlwcml2YXRlIElMaXN0PElUb2tlbj4gQ3JlYXRlVG9rZW5MaXN0KGludCBjb3VudCkgeworCQkJSUxpc3Q8SVRva2VuPiBsaXN0ID0gbmV3IExpc3Q8SVRva2VuPigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQkJbGlzdC5BZGQobmV3IENvbW1vblRva2VuKChpKzEpLCAidGVzdCB0b2tlbiAiICsgKGkrMSkuVG9TdHJpbmcoKSArCisJCQkJCSIgd2l0aG91dCBhbnkgcmVhbCBjb250ZXh0IikpOworCQkJfQorCQkJcmV0dXJuIGxpc3Q7CisJCX0KKworCQkjZW5kcmVnaW9uCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9UZXN0RHJpdmVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3REcml2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwZWNlOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9UZXN0RHJpdmVyLmNzCkBAIC0wLDAgKzEsNjQgQEAKKy8qCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBNVVNUIFJFVEFJTiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gTVVTVCBSRVBST0RVQ0UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciBXUklUVEVOIHBlcm1pc3Npb24uCis0LiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSAKKyAgIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoaXMgd29yayB0byB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGxpY2Vuc29yCisgICBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNlLCB3aXRob3V0IGFueSAKKyAgIGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UZXN0cworeworCXVzaW5nIFN5c3RlbTsKKwl1c2luZyBNYlVuaXQuRnJhbWV3b3JrOworCXVzaW5nIE1iVW5pdC5Db3JlOworCisJcHVibGljIGNsYXNzIFRlc3REcml2ZXIKKwl7CisJCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisJCXsKKwkJCS8vIENoYW5nZSAnTk9UX0RFQlVHR0lORycgLS0+ICchTk9UX0RFQlVHR0lORycgdG8gcnVuIGluZGl2aWR1YWwgZml4dHVyZXMKKyNpZiAhTk9UX0RFQlVHR0lORworCQkJLy9JVHJlZUZpeHR1cmUgZml4dHVyZSA9IG5ldyBJVHJlZUZpeHR1cmUoKTsKKwkJCUFOVExSeHh4eFN0cmVhbUZpeHR1cmUgZml4dHVyZSA9IG5ldyBBTlRMUnh4eHhTdHJlYW1GaXh0dXJlKCk7CisJCQlmaXh0dXJlLlRlc3RDb25zdW1lQWxsQ2hhcmFjdGVyc0luQW5BTlRMUklucHV0U3RyZWFtKCk7CisjZWxzZQorCQkJU3RhcnRBdXRvUnVubmVyKCk7CisjZW5kaWYKKwkJfQorCisJCXB1YmxpYyBzdGF0aWMgdm9pZCBTdGFydEF1dG9SdW5uZXIoKQorCQl7CisJCQl1c2luZyAoQXV0b1J1bm5lciBhdXRvID0gbmV3IEF1dG9SdW5uZXIoKSkKKwkJCXsKKwkJCQlhdXRvLlJ1bigpOworCQkJCWF1dG8uUmVwb3J0VG9IdG1sKCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvVGVzdEZpeHR1cmVCYXNlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3RGaXh0dXJlQmFzZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZkYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3RGaXh0dXJlQmFzZS5jcwpAQCAtMCwwICsxLDQ0IEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVGVzdHMKK3sKKwl1c2luZyBTeXN0ZW07CisJdXNpbmcgTWJVbml0LkZyYW1ld29yazsKKworCWFic3RyYWN0IHB1YmxpYyBjbGFzcyBUZXN0Rml4dHVyZUJhc2UKKwl7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIE5MID0gRW52aXJvbm1lbnQuTmV3TGluZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5Db2xsZWN0aW9ucy9IYXNoTGlzdC5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zL0hhc2hMaXN0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDg3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5Db2xsZWN0aW9ucy9IYXNoTGlzdC5jcwpAQCAtMCwwICsxLDUwMSBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zCit7CisJdXNpbmcgU3lzdGVtOworCXVzaW5nIElEaWN0aW9uYXJ5CQkJCT0gU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5OworCXVzaW5nIElEaWN0aW9uYXJ5RW51bWVyYXRvcgkJPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSURpY3Rpb25hcnlFbnVtZXJhdG9yOworCXVzaW5nIElDb2xsZWN0aW9uCQkJCT0gU3lzdGVtLkNvbGxlY3Rpb25zLklDb2xsZWN0aW9uOworCXVzaW5nIElFbnVtZXJhdG9yCQkJCT0gU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yOworCXVzaW5nIEhhc2h0YWJsZQkJCQkJPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlOworCXVzaW5nIEFycmF5TGlzdAkJCQkJPSBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0OworCXVzaW5nIERpY3Rpb25hcnlFbnRyeQkJCT0gU3lzdGVtLkNvbGxlY3Rpb25zLkRpY3Rpb25hcnlFbnRyeTsKKwl1c2luZyBTdHJpbmdCdWlsZGVyCQkJCT0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKwkKKwkvLy8gPHN1bW1hcnk+CisJLy8vIEFuIEhhc2h0YWJsZS1iYWNrZWQgZGljdGlvbmFyeSB0aGF0IGVudW1lcmF0ZXMgS2V5cyBhbmQgVmFsdWVzIGluIAorCS8vLyBpbnNlcnRpb24gb3JkZXIuCisJLy8vIDwvc3VtbWFyeT4JCisJcHVibGljIHNlYWxlZCBjbGFzcyBIYXNoTGlzdCA6IElEaWN0aW9uYXJ5CisJeworCQkjcmVnaW9uIEhlbHBlciBjbGFzc2VzCisJCXByaXZhdGUgc2VhbGVkIGNsYXNzIEhhc2hMaXN0RW51bWVyYXRvciA6IElEaWN0aW9uYXJ5RW51bWVyYXRvcgorCQl7CisJCQlpbnRlcm5hbCBlbnVtIEVudW1lcmF0aW9uTW9kZQorCQkJeworCQkJCUtleSwKKwkJCQlWYWx1ZSwKKwkJCQlFbnRyeQorCQkJfQorCQkJcHJpdmF0ZSBIYXNoTGlzdCBfaGFzaExpc3Q7CisJCQlwcml2YXRlIEFycmF5TGlzdCBfb3JkZXJMaXN0OworCQkJcHJpdmF0ZSBFbnVtZXJhdGlvbk1vZGUgX21vZGU7CisJCQlwcml2YXRlIGludCBfaW5kZXg7CisJCQlwcml2YXRlIGludCBfdmVyc2lvbjsKKwkJCXByaXZhdGUgb2JqZWN0IF9rZXk7CisJCQlwcml2YXRlIG9iamVjdCBfdmFsdWU7CisJCQorCQkJI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKworCQkJaW50ZXJuYWwgSGFzaExpc3RFbnVtZXJhdG9yKCkKKwkJCXsJCisJCQkJX2luZGV4ID0gMDsKKwkJCQlfa2V5ID0gbnVsbDsKKwkJCQlfdmFsdWUgPSBudWxsOworCQkJfQorCisJCQlpbnRlcm5hbCBIYXNoTGlzdEVudW1lcmF0b3IoSGFzaExpc3QgaGFzaExpc3QsIEVudW1lcmF0aW9uTW9kZSBtb2RlKQorCQkJeworCQkJCV9oYXNoTGlzdCA9IGhhc2hMaXN0OworCQkJCV9tb2RlID0gbW9kZTsKKwkJCQlfdmVyc2lvbiA9IGhhc2hMaXN0Ll92ZXJzaW9uOworCQkJCV9vcmRlckxpc3QgPSBoYXNoTGlzdC5faW5zZXJ0aW9uT3JkZXJMaXN0OworCQkJCV9pbmRleCA9IDA7CisJCQkJX2tleSA9IG51bGw7CisJCQkJX3ZhbHVlID0gbnVsbDsKKwkJCX0KKworCQkJI2VuZHJlZ2lvbgorCisJCQkjcmVnaW9uIElEaWN0aW9uYXJ5RW51bWVyYXRvciBNZW1iZXJzCisKKwkJCXB1YmxpYyBvYmplY3QgS2V5CisJCQl7CisJCQkJZ2V0CisJCQkJeworCQkJCQlpZiAoX2tleSA9PSBudWxsKQorCQkJCQl7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRW51bWVyYXRpb24gaGFzIGVpdGhlciBub3Qgc3RhcnRlZCBvciBoYXMgYWxyZWFkeSBmaW5pc2hlZC4iKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gX2tleTsKKwkJCQl9CisJCQl9CisKKwkJCXB1YmxpYyBvYmplY3QgVmFsdWUKKwkJCXsKKwkJCQlnZXQKKwkJCQl7CisJCQkJCWlmIChfa2V5ID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJFbnVtZXJhdGlvbiBoYXMgZWl0aGVyIG5vdCBzdGFydGVkIG9yIGhhcyBhbHJlYWR5IGZpbmlzaGVkLiIpOworCQkJCQl9CisJCQkJCXJldHVybiBfdmFsdWU7CisJCQkJfQorCQkJfQorCisJCQlwdWJsaWMgRGljdGlvbmFyeUVudHJ5IEVudHJ5CisJCQl7CisJCQkJZ2V0CisJCQkJeworCQkJCQlpZiAoX2tleSA9PSBudWxsKQorCQkJCQl7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRW51bWVyYXRpb24gaGFzIGVpdGhlciBub3Qgc3RhcnRlZCBvciBoYXMgYWxyZWFkeSBmaW5pc2hlZC4iKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gbmV3IERpY3Rpb25hcnlFbnRyeShfa2V5LCBfdmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJI2VuZHJlZ2lvbgorCisJCQkjcmVnaW9uIElFbnVtZXJhdG9yIE1lbWJlcnMKKworCQkJcHVibGljIHZvaWQgUmVzZXQoKQorCQkJeworCQkJCWlmIChfdmVyc2lvbiAhPSBfaGFzaExpc3QuX3ZlcnNpb24pCisJCQkJeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ29sbGVjdGlvbiB3YXMgbW9kaWZpZWQ7IGVudW1lcmF0aW9uIG9wZXJhdGlvbiBtYXkgbm90IGV4ZWN1dGUuIik7CisJCQkJfQorCQkJCV9pbmRleCA9IDA7CisJCQkJX2tleSA9IG51bGw7CisJCQkJX3ZhbHVlID0gbnVsbDsKKwkJCX0KKworCQkJcHVibGljIG9iamVjdCBDdXJyZW50CisJCQl7CisJCQkJZ2V0CisJCQkJeworCQkJCQlpZiAoX2tleSA9PSBudWxsKQorCQkJCQl7CisJCQkJCQl0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRW51bWVyYXRpb24gaGFzIGVpdGhlciBub3Qgc3RhcnRlZCBvciBoYXMgYWxyZWFkeSBmaW5pc2hlZC4iKTsKKwkJCQkJfQorCisJCQkJCWlmIChfbW9kZSA9PSBFbnVtZXJhdGlvbk1vZGUuS2V5KQorCQkJCQkJcmV0dXJuIF9rZXk7CisJCQkJCWVsc2UgaWYgKF9tb2RlID09IEVudW1lcmF0aW9uTW9kZS5WYWx1ZSkKKwkJCQkJCXJldHVybiBfdmFsdWU7CisKKwkJCQkJcmV0dXJuIG5ldyBEaWN0aW9uYXJ5RW50cnkoX2tleSwgX3ZhbHVlKTsKKwkJCQl9CisJCQl9CisKKwkJCXB1YmxpYyBib29sIE1vdmVOZXh0KCkKKwkJCXsKKwkJCQlpZiAoX3ZlcnNpb24gIT0gX2hhc2hMaXN0Ll92ZXJzaW9uKQorCQkJCXsKKwkJCQkJdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNvbGxlY3Rpb24gd2FzIG1vZGlmaWVkOyBlbnVtZXJhdGlvbiBvcGVyYXRpb24gbWF5IG5vdCBleGVjdXRlLiIpOworCQkJCX0KKworCQkJCWlmIChfaW5kZXggPCBfb3JkZXJMaXN0LkNvdW50KQorCQkJCXsKKwkJCQkJX2tleSA9IF9vcmRlckxpc3RbX2luZGV4XTsKKwkJCQkJX3ZhbHVlID0gX2hhc2hMaXN0W19rZXldOworCQkJCQlfaW5kZXgrKzsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCV9rZXkgPSBudWxsOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJI2VuZHJlZ2lvbgorCQl9CisKKwkJcHJpdmF0ZSBzZWFsZWQgY2xhc3MgS2V5Q29sbGVjdGlvbiA6IElDb2xsZWN0aW9uCisJCXsKKwkJCXByaXZhdGUgSGFzaExpc3QgX2hhc2hMaXN0OworCQkKKwkJCSNyZWdpb24gQ29uc3RydWN0b3JzCisKKwkJCWludGVybmFsIEtleUNvbGxlY3Rpb24oKQorCQkJewkKKwkJCX0KKworCQkJaW50ZXJuYWwgS2V5Q29sbGVjdGlvbihIYXNoTGlzdCBoYXNoTGlzdCkKKwkJCXsKKwkJCQlfaGFzaExpc3QgPSBoYXNoTGlzdDsKKwkJCX0KKworCQkJI2VuZHJlZ2lvbgorCQkKKwkJCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorCQkJeworCQkJCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkKKwkJCQlyZXN1bHQuQXBwZW5kKCJbIik7CisJCQkJQXJyYXlMaXN0IGtleXMgPSBfaGFzaExpc3QuX2luc2VydGlvbk9yZGVyTGlzdDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMuQ291bnQ7IGkrKykKKwkJCQl7CisJCQkJCWlmIChpID4gMCkKKwkJCQkJeworCQkJCQkJcmVzdWx0LkFwcGVuZCgiLCAiKTsKKwkJCQkJfQorCQkJCQlyZXN1bHQuQXBwZW5kKGtleXNbaV0pOworCQkJCX0KKwkJCQlyZXN1bHQuQXBwZW5kKCJdIik7CisKKwkJCQlyZXR1cm4gcmVzdWx0LlRvU3RyaW5nKCk7CisJCQl9CisKKwkJCXB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgbykKKwkJCXsKKwkJCQlpZiAobyBpcyBLZXlDb2xsZWN0aW9uKQorCQkJCXsKKwkJCQkJS2V5Q29sbGVjdGlvbiBvdGhlciA9IChLZXlDb2xsZWN0aW9uKSBvOworCQkJCQlpZiAoKENvdW50ID09IDApICYmIChvdGhlci5Db3VudCA9PSAwKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQllbHNlIGlmIChDb3VudCA9PSBvdGhlci5Db3VudCkKKwkJCQkJeworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDb3VudDsgaSsrKQorCQkJCQkJeworCQkJCQkJCWlmICgoX2hhc2hMaXN0Ll9pbnNlcnRpb25PcmRlckxpc3RbaV0gPT0gb3RoZXIuX2hhc2hMaXN0Ll9pbnNlcnRpb25PcmRlckxpc3RbaV0pIHx8CisJCQkJCQkJCShfaGFzaExpc3QuX2luc2VydGlvbk9yZGVyTGlzdFtpXS5FcXVhbHMob3RoZXIuX2hhc2hMaXN0Ll9pbnNlcnRpb25PcmRlckxpc3RbaV0pKSkKKwkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKwkJCXsKKwkJCQlyZXR1cm4gX2hhc2hMaXN0Ll9pbnNlcnRpb25PcmRlckxpc3QuR2V0SGFzaENvZGUoKTsKKwkJCX0KKworCQkJI3JlZ2lvbiBJQ29sbGVjdGlvbiBNZW1iZXJzCisKKwkJCXB1YmxpYyBib29sIElzU3luY2hyb25pemVkCisJCQl7CisJCQkJZ2V0IHsgcmV0dXJuIF9oYXNoTGlzdC5Jc1N5bmNocm9uaXplZDsgfQorCQkJfQorCisJCQlwdWJsaWMgaW50IENvdW50CisJCQl7CisJCQkJZ2V0IHsgcmV0dXJuIF9oYXNoTGlzdC5Db3VudDsgfQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCBDb3B5VG8oQXJyYXkgYXJyYXksIGludCBpbmRleCkKKwkJCXsKKwkJCQlfaGFzaExpc3QuQ29weUtleXNUbyhhcnJheSwgaW5kZXgpOworCQkJfQorCisJCQlwdWJsaWMgb2JqZWN0IFN5bmNSb290CisJCQl7CisJCQkJZ2V0IHsgcmV0dXJuIF9oYXNoTGlzdC5TeW5jUm9vdDsgfQorCQkJfQorCisJCQkjZW5kcmVnaW9uCisKKwkJCSNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworCisJCQlwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisJCQl7CisJCQkJcmV0dXJuIG5ldyBIYXNoTGlzdEVudW1lcmF0b3IoX2hhc2hMaXN0LCBIYXNoTGlzdEVudW1lcmF0b3IuRW51bWVyYXRpb25Nb2RlLktleSk7CisJCQl9CisKKwkJCSNlbmRyZWdpb24KKwkJfQorCisJCXByaXZhdGUgc2VhbGVkIGNsYXNzIFZhbHVlQ29sbGVjdGlvbiA6IElDb2xsZWN0aW9uCisJCXsKKwkJCXByaXZhdGUgSGFzaExpc3QgX2hhc2hMaXN0OworCQkKKwkJCSNyZWdpb24gQ29uc3RydWN0b3JzCisKKwkJCWludGVybmFsIFZhbHVlQ29sbGVjdGlvbigpCisJCQl7CQorCQkJfQorCisJCQlpbnRlcm5hbCBWYWx1ZUNvbGxlY3Rpb24oSGFzaExpc3QgaGFzaExpc3QpCisJCQl7CisJCQkJX2hhc2hMaXN0ID0gaGFzaExpc3Q7CisJCQl9CisKKwkJCSNlbmRyZWdpb24KKwkJCisJCQlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKwkJCXsKKwkJCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJCisJCQkJcmVzdWx0LkFwcGVuZCgiWyIpOworCQkJCUlFbnVtZXJhdG9yIGl0ZXIgPSBuZXcgSGFzaExpc3RFbnVtZXJhdG9yKF9oYXNoTGlzdCwgSGFzaExpc3RFbnVtZXJhdG9yLkVudW1lcmF0aW9uTW9kZS5WYWx1ZSk7CisJCQkJaWYgKGl0ZXIuTW92ZU5leHQoKSkKKwkJCQl7CisJCQkJCXJlc3VsdC5BcHBlbmQoKGl0ZXIuQ3VycmVudCA9PSBudWxsKSA/ICJudWxsIiA6IGl0ZXIuQ3VycmVudCk7CisJCQkJCXdoaWxlIChpdGVyLk1vdmVOZXh0KCkpCisJCQkJCXsKKwkJCQkJCXJlc3VsdC5BcHBlbmQoIiwgIik7CisJCQkJCQlyZXN1bHQuQXBwZW5kKChpdGVyLkN1cnJlbnQgPT0gbnVsbCkgPyAibnVsbCIgOiBpdGVyLkN1cnJlbnQpOworCQkJCQl9CisJCQkJfQorCQkJCXJlc3VsdC5BcHBlbmQoIl0iKTsKKworCQkJCXJldHVybiByZXN1bHQuVG9TdHJpbmcoKTsKKwkJCX0KKworCQkJI3JlZ2lvbiBJQ29sbGVjdGlvbiBNZW1iZXJzCisKKwkJCXB1YmxpYyBib29sIElzU3luY2hyb25pemVkCisJCQl7CisJCQkJZ2V0IHsgcmV0dXJuIF9oYXNoTGlzdC5Jc1N5bmNocm9uaXplZDsgfQorCQkJfQorCisJCQlwdWJsaWMgaW50IENvdW50CisJCQl7CisJCQkJZ2V0IHsgcmV0dXJuIF9oYXNoTGlzdC5Db3VudDsgfQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCBDb3B5VG8oQXJyYXkgYXJyYXksIGludCBpbmRleCkKKwkJCXsKKwkJCQlfaGFzaExpc3QuQ29weVZhbHVlc1RvKGFycmF5LCBpbmRleCk7CisJCQl9CisKKwkJCXB1YmxpYyBvYmplY3QgU3luY1Jvb3QKKwkJCXsKKwkJCQlnZXQgeyByZXR1cm4gX2hhc2hMaXN0LlN5bmNSb290OyB9CisJCQl9CisKKwkJCSNlbmRyZWdpb24KKworCQkJI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCisKKwkJCXB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKwkJCXsKKwkJCQlyZXR1cm4gbmV3IEhhc2hMaXN0RW51bWVyYXRvcihfaGFzaExpc3QsIEhhc2hMaXN0RW51bWVyYXRvci5FbnVtZXJhdGlvbk1vZGUuVmFsdWUpOworCQkJfQorCisJCQkjZW5kcmVnaW9uCisJCX0KKworCQkjZW5kcmVnaW9uCisKKwkJcHJpdmF0ZSBIYXNodGFibGUgX2RpY3Rpb25hcnkgPSBuZXcgSGFzaHRhYmxlKCk7CisJCXByaXZhdGUgQXJyYXlMaXN0IF9pbnNlcnRpb25PcmRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXByaXZhdGUgaW50IF92ZXJzaW9uOworCisJCSNyZWdpb24gQ29uc3RydWN0b3JzCisKKwkJcHVibGljIEhhc2hMaXN0KCkgOiB0aGlzKC0xKQorCQl7CQorCQl9CisKKwkJcHVibGljIEhhc2hMaXN0KGludCBjYXBhY2l0eSkKKwkJeworCQkJaWYgKGNhcGFjaXR5IDwgMCkKKwkJCXsKKwkJCQlfZGljdGlvbmFyeSA9IG5ldyBIYXNodGFibGUoKTsKKwkJCQlfaW5zZXJ0aW9uT3JkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCV9kaWN0aW9uYXJ5ID0gbmV3IEhhc2h0YWJsZShjYXBhY2l0eSk7CisJCQkJX2luc2VydGlvbk9yZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoY2FwYWNpdHkpOworCQkJfQorCQkJX3ZlcnNpb24gPSAwOworCQl9CisKKwkJI2VuZHJlZ2lvbgorCQorCQkjcmVnaW9uIElEaWN0aW9uYXJ5IE1lbWJlcnMKKworCQlwdWJsaWMgYm9vbCBJc1JlYWRPbmx5CQkgeyBnZXQgeyAgcmV0dXJuIF9kaWN0aW9uYXJ5LklzUmVhZE9ubHk7IH0gfQorCisJCXB1YmxpYyBJRGljdGlvbmFyeUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisJCXsKKwkJCXJldHVybiBuZXcgSGFzaExpc3RFbnVtZXJhdG9yKHRoaXMsIEhhc2hMaXN0RW51bWVyYXRvci5FbnVtZXJhdGlvbk1vZGUuRW50cnkpOworCQl9CisKKwkJcHVibGljIG9iamVjdCB0aGlzW29iamVjdCBrZXldCisJCXsKKwkJCWdldCB7IHJldHVybiBfZGljdGlvbmFyeVtrZXldOyB9CisJCQlzZXQgCisJCQl7CisJCQkJYm9vbCBpc05ld0VudHJ5ID0gIV9kaWN0aW9uYXJ5LkNvbnRhaW5zKGtleSk7CisJCQkJX2RpY3Rpb25hcnlba2V5XSA9IHZhbHVlOyAKKwkJCQlpZiAoaXNOZXdFbnRyeSkKKwkJCQkJX2luc2VydGlvbk9yZGVyTGlzdC5BZGQoa2V5KTsKKwkJCQlfdmVyc2lvbisrOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgUmVtb3ZlKG9iamVjdCBrZXkpCisJCXsKKwkJCV9kaWN0aW9uYXJ5LlJlbW92ZShrZXkpOworCQkJX2luc2VydGlvbk9yZGVyTGlzdC5SZW1vdmUoa2V5KTsKKwkJCV92ZXJzaW9uKys7CisJCX0KKworCQlwdWJsaWMgYm9vbCBDb250YWlucyhvYmplY3Qga2V5KQorCQl7CisJCQlyZXR1cm4gX2RpY3Rpb25hcnkuQ29udGFpbnMoa2V5KTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIENsZWFyKCkKKwkJeworCQkJX2RpY3Rpb25hcnkuQ2xlYXIoKTsKKwkJCV9pbnNlcnRpb25PcmRlckxpc3QuQ2xlYXIoKTsKKwkJCV92ZXJzaW9uKys7CisJCX0KKworCQlwdWJsaWMgSUNvbGxlY3Rpb24gVmFsdWVzCisJCXsKKwkJCWdldCB7IHJldHVybiBuZXcgVmFsdWVDb2xsZWN0aW9uKHRoaXMpOyB9CisJCX0KKworCQlwdWJsaWMgdm9pZCBBZGQob2JqZWN0IGtleSwgb2JqZWN0IHZhbHVlKQorCQl7CisJCQlfZGljdGlvbmFyeS5BZGQoa2V5LCB2YWx1ZSk7CisJCQlfaW5zZXJ0aW9uT3JkZXJMaXN0LkFkZChrZXkpOwkKKwkJCV92ZXJzaW9uKys7CisJCX0KKworCQlwdWJsaWMgSUNvbGxlY3Rpb24gS2V5cworCQl7CisJCQlnZXQgeyByZXR1cm4gbmV3IEtleUNvbGxlY3Rpb24odGhpcyk7IH0KKwkJfQorCisJCXB1YmxpYyBib29sIElzRml4ZWRTaXplCisJCXsKKwkJCWdldCB7IHJldHVybiBfZGljdGlvbmFyeS5Jc0ZpeGVkU2l6ZTsgfQorCQl9CisKKwkJI2VuZHJlZ2lvbgorCisJCSNyZWdpb24gSUNvbGxlY3Rpb24gTWVtYmVycworCisJCXB1YmxpYyBib29sIElzU3luY2hyb25pemVkCisJCXsKKwkJCWdldCB7IHJldHVybiBfZGljdGlvbmFyeS5Jc1N5bmNocm9uaXplZDsgfQorCQl9CisKKwkJcHVibGljIGludCBDb3VudAorCQl7CisJCQlnZXQgeyByZXR1cm4gX2RpY3Rpb25hcnkuQ291bnQ7IH0KKwkJfQorCisJCXB1YmxpYyB2b2lkIENvcHlUbyhBcnJheSBhcnJheSwgaW50IGluZGV4KQorCQl7CisJCQlpbnQgbGVuID0gX2luc2VydGlvbk9yZGVyTGlzdC5Db3VudDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQl7CisJCQkJRGljdGlvbmFyeUVudHJ5IGUgPSBuZXcgRGljdGlvbmFyeUVudHJ5KF9pbnNlcnRpb25PcmRlckxpc3RbaV0sIF9kaWN0aW9uYXJ5W19pbnNlcnRpb25PcmRlckxpc3RbaV1dKTsKKwkJCQlhcnJheS5TZXRWYWx1ZShlLCBpbmRleCsrKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBvYmplY3QgU3luY1Jvb3QKKwkJeworCQkJZ2V0IHsgcmV0dXJuIF9kaWN0aW9uYXJ5LlN5bmNSb290OyB9CisJCX0KKworCQkjZW5kcmVnaW9uCisKKwkJI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCisKKwkJSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorCQl7CisJCQlyZXR1cm4gbmV3IEhhc2hMaXN0RW51bWVyYXRvcih0aGlzLCBIYXNoTGlzdEVudW1lcmF0b3IuRW51bWVyYXRpb25Nb2RlLkVudHJ5KTsKKwkJfQorCisJCSNlbmRyZWdpb24KKworCQlwcml2YXRlIHZvaWQgQ29weUtleXNUbyhBcnJheSBhcnJheSwgaW50IGluZGV4KQorCQl7CisJCQlpbnQgbGVuID0gX2luc2VydGlvbk9yZGVyTGlzdC5Db3VudDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQl7CisJCQkJYXJyYXkuU2V0VmFsdWUoX2luc2VydGlvbk9yZGVyTGlzdFtpXSwgaW5kZXgrKyk7CisJCQl9CisJCX0KKworCQlwcml2YXRlIHZvaWQgQ29weVZhbHVlc1RvKEFycmF5IGFycmF5LCBpbnQgaW5kZXgpCisJCXsKKwkJCWludCBsZW4gPSBfaW5zZXJ0aW9uT3JkZXJMaXN0LkNvdW50OworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXsKKwkJCQlhcnJheS5TZXRWYWx1ZShfZGljdGlvbmFyeVtfaW5zZXJ0aW9uT3JkZXJMaXN0W2ldXSwgaW5kZXgrKyk7CisJCQl9CisJCX0KKworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5Db2xsZWN0aW9ucy9TdGFja0xpc3QuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5Db2xsZWN0aW9ucy9TdGFja0xpc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ZDExZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zL1N0YWNrTGlzdC5jcwpAQCAtMCwwICsxLDc3IEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMKK3sKKwl1c2luZyBTeXN0ZW07CisJdXNpbmcgQXJyYXlMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdDsKKwkKKwkvLy8gPHN1bW1hcnk+CisJLy8vIFN0YWNrIGFic3RyYWN0aW9uIHRoYXQgYWxzbyBzdXBwb3J0cyB0aGUgSUxpc3QgaW50ZXJmYWNlCisJLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgY2xhc3MgU3RhY2tMaXN0IDogQXJyYXlMaXN0CisJeworCQlwdWJsaWMgU3RhY2tMaXN0KCkgOiBiYXNlKCkKKwkJeworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gQWRkcyBhbiBlbGVtZW50IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGxpc3QuCisJCS8vLyA8L3N1bW1hcnk+CisJCXB1YmxpYyB2b2lkIFB1c2gob2JqZWN0IGl0ZW0pCisJCXsKKwkJCUFkZChpdGVtKTsKKwkJfQorCQkKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBsaXN0IGFuZCByZXR1cm5zIGl0LgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHJldHVybnM+VGhlIGVsZW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suPC9yZXR1cm5zPgorCQlwdWJsaWMgb2JqZWN0IFBvcCgpCisJCXsKKwkJCW9iamVjdCBwb3BwZWRJdGVtID0gdGhpc1t0aGlzLkNvdW50IC0gMV07CisJCQlSZW1vdmVBdCh0aGlzLkNvdW50IC0gMSk7CisJCQlyZXR1cm4gcG9wcGVkSXRlbTsKKwkJfQorCQkKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBsaXN0IHdpdGhvdXQgcmVtb3ZpbmcgaXQuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cmV0dXJucz5UaGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay48L3JldHVybnM+CisJCXB1YmxpYyBvYmplY3QgUGVlaygpCisJCXsKKwkJCXJldHVybiB0aGlzW3RoaXMuQ291bnQgLSAxXTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9CbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0JsYW5rRGVidWdFdmVudExpc3RlbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMWE0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9CbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGJsYW5rIGxpc3RlbmVyIHRoYXQgZG9lcyBub3RoaW5nOyB1c2VmdWwgZm9yIHJlYWwgY2xhc3NlcyBzbworICAgICAqICB0aGV5IGRvbid0IGhhdmUgdG8gaGF2ZSBsb3RzIG9mIGJsYW5rIG1ldGhvZHMgYW5kIGFyZSBsZXNzCisgICAgICogIHNlbnNpdGl2ZSB0byB1cGRhdGVzIHRvIGRlYnVnIGludGVyZmFjZS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lciA6IElEZWJ1Z0V2ZW50TGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgaW50IFJ1bGVMZXZlbCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlclJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBpZiAoUnVsZUxldmVsID09IDApCisgICAgICAgICAgICAgICAgQ29tbWVuY2UoKTsKKyAgICAgICAgICAgIFJ1bGVMZXZlbCsrOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBSdWxlTGV2ZWwtLTsKKyAgICAgICAgICAgIGlmIChSdWxlTGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBUZXJtaW5hdGUoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyQWx0KGludCBhbHQpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyU3ViUnVsZShpbnQgZGVjaXNpb25OdW1iZXIpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4aXRTdWJSdWxlKGludCBkZWNpc2lvbk51bWJlcikgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW50ZXJEZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIsIGJvb2wgY291bGRCYWNrdHJhY2spIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4aXREZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvY2F0aW9uKGludCBsaW5lLCBpbnQgcG9zKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lVG9rZW4oSVRva2VuIHRva2VuKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lSGlkZGVuVG9rZW4oSVRva2VuIHRva2VuKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVChpbnQgaSwgSVRva2VuIHQpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1hcmsoaW50IGkpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZChpbnQgaSkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soaW50IGxldmVsKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRCYWNrdHJhY2soaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlZ2luUmVzeW5jKCkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kUmVzeW5jKCkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2VtYW50aWNQcmVkaWNhdGUoYm9vbCByZXN1bHQsIHN0cmluZyBwcmVkaWNhdGUpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbW1lbmNlKCkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVGVybWluYXRlKCkgeworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBUcmVlIHBhcnNpbmcgc3R1ZmYKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVOb2RlKG9iamVjdCB0KSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVChpbnQgaSwgb2JqZWN0IHQpIHsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQVNUIFN0dWZmCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBOaWxOb2RlKG9iamVjdCB0KSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFcnJvck5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IG5vZGUsIElUb2tlbiB0b2tlbikgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVjb21lUm9vdChvYmplY3QgbmV3Um9vdCwgb2JqZWN0IG9sZFJvb3QpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZENoaWxkKG9iamVjdCByb290LCBvYmplY3QgY2hpbGQpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRva2VuQm91bmRhcmllcyhvYmplY3QgdCwgaW50IHRva2VuU3RhcnRJbmRleCwgaW50IHRva2VuU3RvcEluZGV4KSB7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50SHViLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudEh1Yi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc1ODE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudEh1Yi5jcwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEJyb2FkY2FzdCBkZWJ1ZyBldmVudHMgdG8gbXVsdGlwbGUgbGlzdGVuZXJzLiAgTGV0cyB5b3UgZGVidWcgYW5kIHN0aWxsCisgICAgICogIHVzZSB0aGUgZXZlbnQgbWVjaGFuaXNtIHRvIGJ1aWxkIHBhcnNlIHRyZWVzIGV0Yy4uLiAgTm90IHRocmVhZC1zYWZlLgorICAgICAqICBEb24ndCBhZGQgZXZlbnRzIGluIG9uZSB0aHJlYWQgd2hpbGUgcGFyc2VyIGZpcmVzIGV2ZW50cyBpbiBhbm90aGVyLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHNlZWFsc28gY3JlZj0iRGVidWdFdmVudFJlcGVhdGVyIi8+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERlYnVnRXZlbnRIdWIgOiBJRGVidWdFdmVudExpc3RlbmVyIHsKKyAgICAgICAgTGlzdDxJRGVidWdFdmVudExpc3RlbmVyPiBfbGlzdGVuZXJzID0gbmV3IExpc3Q8SURlYnVnRXZlbnRMaXN0ZW5lcj4oKTsKKworICAgICAgICBwdWJsaWMgRGVidWdFdmVudEh1YihwYXJhbXMgSURlYnVnRXZlbnRMaXN0ZW5lcltdIGxpc3RlbmVycykgeworICAgICAgICAgICAgX2xpc3RlbmVycyA9IG5ldyBMaXN0PElEZWJ1Z0V2ZW50TGlzdGVuZXI+KGxpc3RlbmVycyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBZGQgYW5vdGhlciBsaXN0ZW5lciB0byBicm9hZGNhc3QgZXZlbnRzIHRvby4gIE5vdCB0aHJlYWQtc2FmZS4KKyAgICAgICAgICogIERvbid0IGFkZCBldmVudHMgaW4gb25lIHRocmVhZCB3aGlsZSBwYXJzZXIgZmlyZXMgZXZlbnRzIGluIGFub3RoZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZExpc3RlbmVyKElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lcnMuQWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRvIGF2b2lkIGEgbWVzcyBsaWtlIHRoaXM6CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlclJ1bGUoZmluYWwgU3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0KG5ldyBDb2RlKCl7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWMoRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7bGlzdGVuZXIuZW50ZXJSdWxlKHJ1bGVOYW1lKTt9fQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSSBhbSBkdXAnaW5nIHRoZSBmb3ItbG9vcCBpbiBlYWNoLiAgV2hlcmUgYXJlIEphdmEgY2xvc3VyZXMhPyBibGVjaCEKKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlclJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVudGVyUnVsZShncmFtbWFyRmlsZU5hbWUsIHJ1bGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkV4aXRSdWxlKGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlckFsdChpbnQgYWx0KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVudGVyQWx0KGFsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyU3ViUnVsZShpbnQgZGVjaXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJTdWJSdWxlKGRlY2lzaW9uTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFN1YlJ1bGUoaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkV4aXRTdWJSdWxlKGRlY2lzaW9uTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW50ZXJEZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIsIGJvb2wgY291bGRCYWNrdHJhY2spIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJEZWNpc2lvbihkZWNpc2lvbk51bWJlciwgY291bGRCYWNrdHJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFeGl0RGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkV4aXREZWNpc2lvbihkZWNpc2lvbk51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvY2F0aW9uKGludCBsaW5lLCBpbnQgcG9zKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkxvY2F0aW9uKGxpbmUsIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVUb2tlbihJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZVRva2VuKHRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKElUb2tlbiB0b2tlbikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5Db25zdW1lSGlkZGVuVG9rZW4odG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVChpbnQgaW5kZXgsIElUb2tlbiB0KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkxUKGluZGV4LCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWFyayhpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTWFyayhpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuUmV3aW5kKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5SZXdpbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soaW50IGxldmVsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkJlZ2luQmFja3RyYWNrKGxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVuZEJhY2t0cmFjayhsZXZlbCwgc3VjY2Vzc2Z1bCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuUmVjb2duaXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlZ2luUmVzeW5jKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5CZWdpblJlc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRSZXN5bmMoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVuZFJlc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZW1hbnRpY1ByZWRpY2F0ZShib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5TZW1hbnRpY1ByZWRpY2F0ZShyZXN1bHQsIHByZWRpY2F0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbW1lbmNlKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5Db21tZW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUZXJtaW5hdGUoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlRlcm1pbmF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAjcmVnaW9uIFRyZWUgcGFyc2luZyBzdHVmZgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZU5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZU5vZGUodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExUKGludCBpbmRleCwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTFQoaW5kZXgsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBBU1QgU3R1ZmYKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE5pbE5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTmlsTm9kZSh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXJyb3JOb2RlKG9iamVjdCB0KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVycm9yTm9kZSh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ3JlYXRlTm9kZShvYmplY3QgdCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5DcmVhdGVOb2RlKHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDcmVhdGVOb2RlKG9iamVjdCBub2RlLCBJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ3JlYXRlTm9kZShub2RlLCB0b2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlY29tZVJvb3Qob2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZENoaWxkKG9iamVjdCByb290LCBvYmplY3QgY2hpbGQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQWRkQ2hpbGQocm9vdCwgY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMob2JqZWN0IHQsIGludCB0b2tlblN0YXJ0SW5kZXgsIGludCB0b2tlblN0b3BJbmRleCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5TZXRUb2tlbkJvdW5kYXJpZXModCwgdG9rZW5TdGFydEluZGV4LCB0b2tlblN0b3BJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzI0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMuY3MKQEAgLTAsMCArMSw0NiBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5Nb3ZlZCB0byB2ZXJzaW9uIDIgZm9yIHYzLjE6IGFkZGVkIGdyYW1tYXIgbmFtZSB0byBlbnRlci9leGl0IFJ1bGU8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgUHJvdG9jb2xWZXJzaW9uID0gIjIiOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXJpYWxpemVkIHZlcnNpb24gb2YgdHJ1ZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBUcnVlID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBGYWxzZSA9IDA7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50UmVwZWF0ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50UmVwZWF0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnRXZlbnRSZXBlYXRlci5jcwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgc2ltcGxlIGV2ZW50IHJlcGVhdGVyIChwcm94eSkgdGhhdCBkZWxlZ2F0ZXMgYWxsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlCisgICAgICogIGxpc3RlbmVyIHNlbnQgaW50byB0aGUgY3Rvci4gIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBsaXN0ZW4gaW4gb24gYSBmZXcKKyAgICAgKiAgZGVidWcgZXZlbnRzIHcvbyBpbnRlcnJ1cHRpbmcgdGhlIGRlYnVnZ2VyLiAgSnVzdCBzdWJjbGFzcyB0aGUgcmVwZWF0ZXIKKyAgICAgKiAgYW5kIG92ZXJyaWRlIHRoZSBtZXRob2RzIHlvdSB3YW50IHRvIGxpc3RlbiBpbiBvbi4gIFJlbWVtYmVyIHRvIGNhbGwKKyAgICAgKiAgdGhlIG1ldGhvZCBpbiB0aGlzIGNsYXNzIHNvIHRoZSBldmVudCB3aWxsIGNvbnRpbnVlIG9uIHRvIHRoZSBvcmlnaW5hbAorICAgICAqICByZWNpcGllbnQuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8c2VlYWxzbyBjcmVmPSJEZWJ1Z0V2ZW50SHViIi8+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERlYnVnRXZlbnRSZXBlYXRlciA6IElEZWJ1Z0V2ZW50TGlzdGVuZXIgeworICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIF9saXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgRGVidWdFdmVudFJlcGVhdGVyKElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlclJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRW50ZXJSdWxlKGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXhpdFJ1bGUoZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlckFsdChpbnQgYWx0KSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRW50ZXJBbHQoYWx0KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyU3ViUnVsZShpbnQgZGVjaXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5FbnRlclN1YlJ1bGUoZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFN1YlJ1bGUoaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXhpdFN1YlJ1bGUoZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW50ZXJEZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIsIGJvb2wgY291bGRCYWNrdHJhY2spIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5FbnRlckRlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLCBjb3VsZEJhY2t0cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFeGl0RGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXhpdERlY2lzaW9uKGRlY2lzaW9uTnVtYmVyKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvY2F0aW9uKGludCBsaW5lLCBpbnQgcG9zKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuTG9jYXRpb24obGluZSwgcG9zKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVUb2tlbihJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5Db25zdW1lVG9rZW4odG9rZW4pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKElUb2tlbiB0b2tlbikgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNvbnN1bWVIaWRkZW5Ub2tlbih0b2tlbik7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVChpbnQgaSwgSVRva2VuIHQpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5MVChpLCB0KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1hcmsoaW50IGkpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5NYXJrKGkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKGludCBpKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuUmV3aW5kKGkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkgeworICAgICAgICAgICAgX2xpc3RlbmVyLlJld2luZCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soaW50IGxldmVsKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuQmVnaW5CYWNrdHJhY2sobGV2ZWwpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRW5kQmFja3RyYWNrKGxldmVsLCBzdWNjZXNzZnVsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5SZWNvZ25pdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlZ2luUmVzeW5jKCkgeworICAgICAgICAgICAgX2xpc3RlbmVyLkJlZ2luUmVzeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRSZXN5bmMoKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRW5kUmVzeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZW1hbnRpY1ByZWRpY2F0ZShib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSkgeworICAgICAgICAgICAgX2xpc3RlbmVyLlNlbWFudGljUHJlZGljYXRlKHJlc3VsdCwgcHJlZGljYXRlKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbW1lbmNlKCkgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNvbW1lbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUZXJtaW5hdGUoKSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuVGVybWluYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyZWUgcGFyc2luZyBzdHVmZgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZU5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5Db25zdW1lTm9kZSh0KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExUKGludCBpLCBvYmplY3QgdCkgeworICAgICAgICAgICAgX2xpc3RlbmVyLkxUKGksIHQpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBBU1QgU3R1ZmYKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE5pbE5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5OaWxOb2RlKHQpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXJyb3JOb2RlKG9iamVjdCB0KSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXJyb3JOb2RlKHQpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ3JlYXRlTm9kZShvYmplY3QgdCkgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNyZWF0ZU5vZGUodCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDcmVhdGVOb2RlKG9iamVjdCBub2RlLCBJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5DcmVhdGVOb2RlKG5vZGUsIHRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlY29tZVJvb3Qob2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290KSB7CisgICAgICAgICAgICBfbGlzdGVuZXIuQmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZENoaWxkKG9iamVjdCByb290LCBvYmplY3QgY2hpbGQpIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5BZGRDaGlsZChyb290LCBjaGlsZCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMob2JqZWN0IHQsIGludCB0b2tlblN0YXJ0SW5kZXgsIGludCB0b2tlblN0b3BJbmRleCkgeworICAgICAgICAgICAgX2xpc3RlbmVyLlNldFRva2VuQm91bmRhcmllcyh0LCB0b2tlblN0YXJ0SW5kZXgsIHRva2VuU3RvcEluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50U29ja2V0UHJveHkuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50U29ja2V0UHJveHkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhNWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnRXZlbnRTb2NrZXRQcm94eS5jcwpAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIE5vdGUgdG8gSkw6IFJlbW92ZWQgZXh0ZW5zaW9uIGNhbGwgc3ludGF4CisgKiAKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisgICAgdXNpbmcgU3lzdGVtOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnM7CisKKyAgICB1c2luZyBJT0V4Y2VwdGlvbiA9IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbjsKKyAgICB1c2luZyBJVHJlZUFkYXB0b3IgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVBZGFwdG9yOworICAgIHVzaW5nIFNvY2tldCA9IFN5c3RlbS5OZXQuU29ja2V0cy5Tb2NrZXQ7CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisgICAgdXNpbmcgVGNwTGlzdGVuZXIgPSBTeXN0ZW0uTmV0LlNvY2tldHMuVGNwTGlzdGVuZXI7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgcHJveHkgZGVidWcgZXZlbnQgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBldmVudHMgb3ZlciBhIHNvY2tldCB0bworICAgICAqICBhIGRlYnVnZ2VyIChvciBhbnkgb3RoZXIgbGlzdGVuZXIpIHVzaW5nIGEgc2ltcGxlIHRleHQtYmFzZWQgcHJvdG9jb2w7CisgICAgICogIG9uZSBldmVudCBwZXIgbGluZS4gIEFOVExSV29ya3MgbGlzdGVucyBvbiBzZXJ2ZXIgc29ja2V0IHdpdGggYQorICAgICAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgaW5zdGFuY2UuICBUaGVzZSB0d28gb2JqZWN0cyBtdXN0IHRoZXJlZm9yZQorICAgICAqICBiZSBrZXB0IGluIHN5bmMuICBOZXcgZXZlbnRzIG11c3QgYmUgaGFuZGxlZCBvbiBib3RoIHNpZGVzIG9mIHNvY2tldC4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBEZWJ1Z0V2ZW50U29ja2V0UHJveHkgOiBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdERlYnVnZ2VyUG9ydCA9IDQ5MTAwOworICAgICAgICBwcm90ZWN0ZWQgaW50IHBvcnQgPSBEZWZhdWx0RGVidWdnZXJQb3J0OworICAgICAgICBwcm90ZWN0ZWQgVGNwTGlzdGVuZXIgc2VydmVyU29ja2V0OworICAgICAgICBwcm90ZWN0ZWQgU29ja2V0IHNvY2tldDsKKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBncmFtbWFyRmlsZU5hbWU7CisgICAgICAgIC8vcHJvdGVjdGVkIFByaW50V3JpdGVyIEBvdXQ7CisgICAgICAgIC8vcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIEBpbjsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hvIGFtIGkgZGVidWdnaW5nPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXI7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQWxtb3N0IGNlcnRhaW5seSB0aGUgcmVjb2duaXplciB3aWxsIGhhdmUgYWRhcHRvciBzZXQsIGJ1dAorICAgICAgICAgKiAgd2UgZG9uJ3Qga25vdyBob3cgdG8gY2FzdCBpdCAoUGFyc2VyIG9yIFRyZWVQYXJzZXIpIHRvIGdldAorICAgICAgICAgKiAgdGhlIGFkYXB0b3IgZmllbGQuICBNdXN0IGJlIHNldCB3aXRoIGEgY29uc3RydWN0b3IuIDooCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVBZGFwdG9yIGFkYXB0b3I7CisKKyAgICAgICAgcHVibGljIERlYnVnRXZlbnRTb2NrZXRQcm94eShCYXNlUmVjb2duaXplciByZWNvZ25pemVyLCBJVHJlZUFkYXB0b3IgYWRhcHRvcikgOgorICAgICAgICAgICAgdGhpcyhyZWNvZ25pemVyLCBEZWZhdWx0RGVidWdnZXJQb3J0LCBhZGFwdG9yKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVidWdFdmVudFNvY2tldFByb3h5KEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIsIGludCBwb3J0LCBJVHJlZUFkYXB0b3IgYWRhcHRvcikgeworICAgICAgICAgICAgdGhpcy5ncmFtbWFyRmlsZU5hbWUgPSByZWNvZ25pemVyLkdyYW1tYXJGaWxlTmFtZTsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlQWRhcHRvciBUcmVlQWRhcHRvciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdG9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBhZGFwdG9yID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSGFuZHNoYWtlKCkgeworICAgICAgICAgICAgaWYgKHNlcnZlclNvY2tldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLk5ldC5JUEhvc3RFbnRyeSBob3N0SW5mbyA9IFN5c3RlbS5OZXQuRG5zLkdldEhvc3RFbnRyeSgibG9jYWxob3N0Iik7CisgICAgICAgICAgICAgICAgU3lzdGVtLk5ldC5JUEFkZHJlc3MgaXBBZGRyZXNzID0gaG9zdEluZm8uQWRkcmVzc0xpc3RbMF07CisgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFRjcExpc3RlbmVyKGlwQWRkcmVzcywgcG9ydCk7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gc2VydmVyU29ja2V0LkFjY2VwdFNvY2tldCgpOworICAgICAgICAgICAgICAgIHNvY2tldC5Ob0RlbGF5ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZyBlbmNvZGluZyA9IG5ldyBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBzb2NrZXQuU2VuZChlbmNvZGluZy5HZXRCeXRlcygiQU5UTFIgIiArIERlYnVnRXZlbnRMaXN0ZW5lckNvbnN0YW50cy5Qcm90b2NvbFZlcnNpb24gKyAiXG4iKSk7CisgICAgICAgICAgICAgICAgc29ja2V0LlNlbmQoZW5jb2RpbmcuR2V0Qnl0ZXMoImdyYW1tYXIgXCIiICsgZ3JhbW1hckZpbGVOYW1lICsgIlxuIikpOworICAgICAgICAgICAgICAgIEFjaygpOworCisgICAgICAgICAgICAgICAgLy9zZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCBwb3J0ICk7CisgICAgICAgICAgICAgICAgLy9zb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgLy9zb2NrZXQuc2V0VGNwTm9EZWxheSggdHJ1ZSApOworICAgICAgICAgICAgICAgIC8vT3V0cHV0U3RyZWFtIG9zID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIC8vT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG9zLCAiVVRGOCIgKTsKKyAgICAgICAgICAgICAgICAvL0BvdXQgPSBuZXcgUHJpbnRXcml0ZXIoIG5ldyBCdWZmZXJlZFdyaXRlciggb3N3ICkgKTsKKyAgICAgICAgICAgICAgICAvL0lucHV0U3RyZWFtIEBpcyA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIC8vSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBAaXMsICJVVEY4IiApOworICAgICAgICAgICAgICAgIC8vQGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBpc3IgKTsKKyAgICAgICAgICAgICAgICAvL0BvdXQucHJpbnRsbiggIkFOVExSICIgKyBEZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMuUFJPVE9DT0xfVkVSU0lPTiApOworICAgICAgICAgICAgICAgIC8vQG91dC5wcmludGxuKCAiZ3JhbW1hciBcIiIgKyBncmFtbWFyRmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAvL0BvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAvL2FjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29tbWVuY2UoKSB7CisgICAgICAgICAgICAvLyBkb24ndCBib3RoZXIgc2VuZGluZyBldmVudDsgbGlzdGVuZXIgd2lsbCB0cmlnZ2VyIHVwb24gY29ubmVjdGlvbgorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVGVybWluYXRlKCkgeworICAgICAgICAgICAgVHJhbnNtaXQoInRlcm1pbmF0ZSIpOworICAgICAgICAgICAgLy9Ab3V0LmNsb3NlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNvY2tldC5DbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoaW9lLCBDb25zb2xlLkVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQWNrKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAvL0Bpbi5yZWFkTGluZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoaW9lLCBDb25zb2xlLkVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgVHJhbnNtaXQoc3RyaW5nIEBldmVudCkgeworICAgICAgICAgICAgc29ja2V0LlNlbmQobmV3IFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZygpLkdldEJ5dGVzKEBldmVudCArICJcbiIpKTsKKyAgICAgICAgICAgIC8vQG91dC5wcmludGxuKCBAZXZlbnQgKTsKKyAgICAgICAgICAgIC8vQG91dC5mbHVzaCgpOworICAgICAgICAgICAgQWNrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlclJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBUcmFuc21pdCgiZW50ZXJSdWxlXHQiICsgZ3JhbW1hckZpbGVOYW1lICsgIlx0IiArIHJ1bGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVudGVyQWx0KGludCBhbHQpIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJlbnRlckFsdFx0IiArIGFsdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFeGl0UnVsZShzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUpIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJleGl0UnVsZVx0IiArIGdyYW1tYXJGaWxlTmFtZSArICJcdCIgKyBydWxlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlclN1YlJ1bGUoaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBUcmFuc21pdCgiZW50ZXJTdWJSdWxlXHQiICsgZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRXhpdFN1YlJ1bGUoaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBUcmFuc21pdCgiZXhpdFN1YlJ1bGVcdCIgKyBkZWNpc2lvbk51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlckRlY2lzaW9uKGludCBkZWNpc2lvbk51bWJlciwgYm9vbCBjb3VsZEJhY2t0cmFjaykgeworICAgICAgICAgICAgVHJhbnNtaXQoImVudGVyRGVjaXNpb25cdCIgKyBkZWNpc2lvbk51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFeGl0RGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBUcmFuc21pdCgiZXhpdERlY2lzaW9uXHQiICsgZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZVRva2VuKElUb2tlbiB0KSB7CisgICAgICAgICAgICBzdHJpbmcgYnVmID0gU2VyaWFsaXplVG9rZW4odCk7CisgICAgICAgICAgICBUcmFuc21pdCgiY29uc3VtZVRva2VuXHQiICsgYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENvbnN1bWVIaWRkZW5Ub2tlbihJVG9rZW4gdCkgeworICAgICAgICAgICAgc3RyaW5nIGJ1ZiA9IFNlcmlhbGl6ZVRva2VuKHQpOworICAgICAgICAgICAgVHJhbnNtaXQoImNvbnN1bWVIaWRkZW5Ub2tlblx0IiArIGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMVChpbnQgaSwgSVRva2VuIHQpIHsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgVHJhbnNtaXQoIkxUXHQiICsgaSArICJcdCIgKyBTZXJpYWxpemVUb2tlbih0KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBNYXJrKGludCBpKSB7CisgICAgICAgICAgICBUcmFuc21pdCgibWFya1x0IiArIGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmV3aW5kKGludCBpKSB7CisgICAgICAgICAgICBUcmFuc21pdCgicmV3aW5kXHQiICsgaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXdpbmQoKSB7CisgICAgICAgICAgICBUcmFuc21pdCgicmV3aW5kIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWdpbkJhY2t0cmFjayhpbnQgbGV2ZWwpIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJiZWdpbkJhY2t0cmFja1x0IiArIGxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEJhY2t0cmFjayhpbnQgbGV2ZWwsIGJvb2wgc3VjY2Vzc2Z1bCkgeworICAgICAgICAgICAgVHJhbnNtaXQoImVuZEJhY2t0cmFja1x0IiArIGxldmVsICsgIlx0IiArIChzdWNjZXNzZnVsID8gRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLlRydWUgOiBEZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMuRmFsc2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExvY2F0aW9uKGludCBsaW5lLCBpbnQgcG9zKSB7CisgICAgICAgICAgICBUcmFuc21pdCgibG9jYXRpb25cdCIgKyBsaW5lICsgIlx0IiArIHBvcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWNvZ25pdGlvbkV4Y2VwdGlvbihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKDUwKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoImV4Y2VwdGlvblx0Iik7CisgICAgICAgICAgICBidWYuQXBwZW5kKGUuR2V0VHlwZSgpLk5hbWUpOworICAgICAgICAgICAgLy8gZHVtcCBvbmx5IHRoZSBkYXRhIGNvbW1vbiB0byBhbGwgZXhjZXB0aW9ucyBmb3Igbm93CisgICAgICAgICAgICBidWYuQXBwZW5kKCJcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChlLkluZGV4KTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIlx0Iik7CisgICAgICAgICAgICBidWYuQXBwZW5kKGUuTGluZSk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChlLkNoYXJQb3NpdGlvbkluTGluZSk7CisgICAgICAgICAgICBUcmFuc21pdChidWYuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWdpblJlc3luYygpIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJiZWdpblJlc3luYyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kUmVzeW5jKCkgeworICAgICAgICAgICAgVHJhbnNtaXQoImVuZFJlc3luYyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VtYW50aWNQcmVkaWNhdGUoYm9vbCByZXN1bHQsIHN0cmluZyBwcmVkaWNhdGUpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoNTApOworICAgICAgICAgICAgYnVmLkFwcGVuZCgic2VtYW50aWNQcmVkaWNhdGVcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChyZXN1bHQpOworICAgICAgICAgICAgU2VyaWFsaXplVGV4dChidWYsIHByZWRpY2F0ZSk7CisgICAgICAgICAgICBUcmFuc21pdChidWYuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIEFTVCBQYXJzaW5nIEV2ZW50cworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENvbnN1bWVOb2RlKG9iamVjdCB0KSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKDUwKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoImNvbnN1bWVOb2RlIik7CisgICAgICAgICAgICBTZXJpYWxpemVOb2RlKGJ1ZiwgdCk7CisgICAgICAgICAgICBUcmFuc21pdChidWYuVG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMVChpbnQgaSwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQodCk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCh0KTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKHQpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcig1MCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJMTlx0Iik7IC8vIGxvb2thaGVhZCBub2RlOyBkaXN0aW5ndWlzaCBmcm9tIExUIGluIHByb3RvY29sCisgICAgICAgICAgICBidWYuQXBwZW5kKGkpOworICAgICAgICAgICAgU2VyaWFsaXplTm9kZShidWYsIHQpOworICAgICAgICAgICAgVHJhbnNtaXQoYnVmLlRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTZXJpYWxpemVOb2RlKFN0cmluZ0J1aWxkZXIgYnVmLCBvYmplY3QgdCkgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCh0KTsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KHQpOworICAgICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLkdldFR5cGUodCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChJRCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZCh0eXBlKTsKKyAgICAgICAgICAgIElUb2tlbiB0b2tlbiA9IGFkYXB0b3IuR2V0VG9rZW4odCk7CisgICAgICAgICAgICBpbnQgbGluZSA9IC0xOworICAgICAgICAgICAgaW50IHBvcyA9IC0xOworICAgICAgICAgICAgaWYgKHRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW4uTGluZTsKKyAgICAgICAgICAgICAgICBwb3MgPSB0b2tlbi5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuQXBwZW5kKCJcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIlx0Iik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHBvcyk7CisgICAgICAgICAgICBpbnQgdG9rZW5JbmRleCA9IGFkYXB0b3IuR2V0VG9rZW5TdGFydEluZGV4KHQpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQodG9rZW5JbmRleCk7CisgICAgICAgICAgICBTZXJpYWxpemVUZXh0KGJ1ZiwgdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICAjcmVnaW9uIEFTVCBFdmVudHMKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBOaWxOb2RlKG9iamVjdCB0KSB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKHQpOworICAgICAgICAgICAgVHJhbnNtaXQoIm5pbE5vZGVcdCIgKyBJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFcnJvck5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQodCk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IHQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoNTApOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiZXJyb3JOb2RlXHQiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoSUQpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoVG9rZW5UeXBlcy5JbnZhbGlkKTsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRleHQoYnVmLCB0ZXh0KTsKKyAgICAgICAgICAgIFRyYW5zbWl0KGJ1Zi5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQodCk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCh0KTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKHQpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcig1MCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJjcmVhdGVOb2RlRnJvbVRva2VuRWxlbWVudHNcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChJRCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJcdCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZCh0eXBlKTsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRleHQoYnVmLCB0ZXh0KTsKKyAgICAgICAgICAgIFRyYW5zbWl0KGJ1Zi5Ub1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IG5vZGUsIElUb2tlbiB0b2tlbikgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRChub2RlKTsKKyAgICAgICAgICAgIGludCB0b2tlbkluZGV4ID0gdG9rZW4uVG9rZW5JbmRleDsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJjcmVhdGVOb2RlXHQiICsgSUQgKyAiXHQiICsgdG9rZW5JbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWNvbWVSb290KG9iamVjdCBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCkgeworICAgICAgICAgICAgaW50IG5ld1Jvb3RJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQobmV3Um9vdCk7CisgICAgICAgICAgICBpbnQgb2xkUm9vdElEID0gYWRhcHRvci5HZXRVbmlxdWVJRChvbGRSb290KTsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJiZWNvbWVSb290XHQiICsgbmV3Um9vdElEICsgIlx0IiArIG9sZFJvb3RJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBBZGRDaGlsZChvYmplY3Qgcm9vdCwgb2JqZWN0IGNoaWxkKSB7CisgICAgICAgICAgICBpbnQgcm9vdElEID0gYWRhcHRvci5HZXRVbmlxdWVJRChyb290KTsKKyAgICAgICAgICAgIGludCBjaGlsZElEID0gYWRhcHRvci5HZXRVbmlxdWVJRChjaGlsZCk7CisgICAgICAgICAgICBUcmFuc21pdCgiYWRkQ2hpbGRcdCIgKyByb290SUQgKyAiXHQiICsgY2hpbGRJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMob2JqZWN0IHQsIGludCB0b2tlblN0YXJ0SW5kZXgsIGludCB0b2tlblN0b3BJbmRleCkgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCh0KTsKKyAgICAgICAgICAgIFRyYW5zbWl0KCJzZXRUb2tlbkJvdW5kYXJpZXNcdCIgKyBJRCArICJcdCIgKyB0b2tlblN0YXJ0SW5kZXggKyAiXHQiICsgdG9rZW5TdG9wSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBTdXBwb3J0CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgc3RyaW5nIFNlcmlhbGl6ZVRva2VuKElUb2tlbiB0KSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKDUwKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQodC5Ub2tlbkluZGV4KTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKHQuVHlwZSk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgYnVmLkFwcGVuZCh0LkNoYW5uZWwpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQodC5MaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKHQuQ2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRleHQoYnVmLCB0LlRleHQpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTZXJpYWxpemVUZXh0KFN0cmluZ0J1aWxkZXIgYnVmLCBzdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgYnVmLkFwcGVuZCgiXHRcIiIpOworICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGVzY2FwZSBcbiBhbmQgXHIgYWxsIHRleHQgZm9yIHRva2VuIGFwcGVhcnMgdG8gZXhpc3Qgb24gb25lIGxpbmUKKyAgICAgICAgICAgIC8vIHRoaXMgZXNjYXBlIGlzIHNsb3cgYnV0IGVhc3kgdG8gdW5kZXJzdGFuZAorICAgICAgICAgICAgdGV4dCA9IEVzY2FwZU5ld2xpbmVzKHRleHQpOworICAgICAgICAgICAgYnVmLkFwcGVuZCh0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHN0cmluZyBFc2NhcGVOZXdsaW5lcyhzdHJpbmcgdHh0KSB7CisgICAgICAgICAgICB0eHQgPSBTdHJpbmdFeHRlbnNpb25zLnJlcGxhY2VBbGwodHh0LCAiJSIsICIlMjUiKTsgICAvLyBlc2NhcGUgYWxsIGVzY2FwZSBjaGFyIDspCisgICAgICAgICAgICB0eHQgPSBTdHJpbmdFeHRlbnNpb25zLnJlcGxhY2VBbGwodHh0LCAiXG4iLCAiJTBBIik7ICAvLyBlc2NhcGUgXG4KKyAgICAgICAgICAgIHR4dCA9IFN0cmluZ0V4dGVuc2lvbnMucmVwbGFjZUFsbCh0eHQsICJcciIsICIlMEQiKTsgIC8vIGVzY2FwZSBccgorICAgICAgICAgICAgcmV0dXJuIHR4dDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1BhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTAwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1BhcnNlci5jcwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisgICAgdXNpbmcgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uczsKKworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKyAgICB1c2luZyBJT0V4Y2VwdGlvbiA9IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBjbGFzcyBEZWJ1Z1BhcnNlciA6IFBhcnNlciB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5XaG8gdG8gbm90aWZ5IHdoZW4gZXZlbnRzIGluIHRoZSBwYXJzZXIgb2NjdXIuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBudWxsOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGZpeGVkIGxvb2thaGVhZCBhbmQgY3ljbGljIERGQSBkZWNpc2lvbnMKKyAgICAgICAgICogIHdoaWxlIHByb2ZpbGluZy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sIGlzQ3ljbGljRGVjaXNpb24gPSBmYWxzZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBub3JtYWwgcGFyc2VyIGV4Y2VwdCB3cmFwIHRoZSB0b2tlbiBzdHJlYW0gaW4gYSBkZWJ1ZworICAgICAgICAgKiAgcHJveHkgdGhhdCBmaXJlcyBjb25zdW1lIGV2ZW50cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEZWJ1Z1BhcnNlcihJVG9rZW5TdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpCisgICAgICAgICAgICA6IGJhc2UoaW5wdXQgaXMgRGVidWdUb2tlblN0cmVhbSA/IGlucHV0IDogbmV3IERlYnVnVG9rZW5TdHJlYW0oaW5wdXQsIGRiZyksIHN0YXRlKSB7CisgICAgICAgICAgICBTZXREZWJ1Z0xpc3RlbmVyKGRiZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVidWdQYXJzZXIoSVRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpCisgICAgICAgICAgICA6IGJhc2UoaW5wdXQgaXMgRGVidWdUb2tlblN0cmVhbSA/IGlucHV0IDogbmV3IERlYnVnVG9rZW5TdHJlYW0oaW5wdXQsIG51bGwpLCBzdGF0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERlYnVnUGFyc2VyKElUb2tlblN0cmVhbSBpbnB1dCwgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcpCisgICAgICAgICAgICA6IHRoaXMoaW5wdXQgaXMgRGVidWdUb2tlblN0cmVhbSA/IGlucHV0IDogbmV3IERlYnVnVG9rZW5TdHJlYW0oaW5wdXQsIGRiZyksIGRiZywgbnVsbCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElEZWJ1Z0V2ZW50TGlzdGVuZXIgRGVidWdMaXN0ZW5lciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBkYmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBQcm92aWRlIGEgbmV3IGRlYnVnIGV2ZW50IGxpc3RlbmVyIGZvciB0aGlzIHBhcnNlci4gIE5vdGlmeSB0aGUKKyAgICAgICAgICogIGlucHV0IHN0cmVhbSB0b28gdGhhdCBpdCBzaG91bGQgc2VuZCBldmVudHMgdG8gdGhpcyBsaXN0ZW5lci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0RGVidWdMaXN0ZW5lcihJRGVidWdFdmVudExpc3RlbmVyIHZhbHVlKSB7CisgICAgICAgICAgICBEZWJ1Z1Rva2VuU3RyZWFtIGRlYnVnVG9rZW5TdHJlYW0gPSBpbnB1dCBhcyBEZWJ1Z1Rva2VuU3RyZWFtOworICAgICAgICAgICAgaWYgKGRlYnVnVG9rZW5TdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZWJ1Z1Rva2VuU3RyZWFtLkRlYnVnTGlzdGVuZXIgPSB2YWx1ZTsKKworICAgICAgICAgICAgZGJnID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcG9ydEVycm9yKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGUpOworICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoZSwgQ29uc29sZS5FcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWdpblJlc3luYygpIHsKKyAgICAgICAgICAgIGRiZy5CZWdpblJlc3luYygpOworICAgICAgICAgICAgYmFzZS5CZWdpblJlc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kUmVzeW5jKCkgeworICAgICAgICAgICAgZGJnLkVuZFJlc3luYygpOworICAgICAgICAgICAgYmFzZS5FbmRSZXN5bmMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soaW50IGxldmVsKSB7CisgICAgICAgICAgICBkYmcuQmVnaW5CYWNrdHJhY2sobGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRCYWNrdHJhY2soaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwpIHsKKyAgICAgICAgICAgIGRiZy5FbmRCYWNrdHJhY2sobGV2ZWwsIHN1Y2Nlc3NmdWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVwb3J0RXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYmFzZS5SZXBvcnRFcnJvcihlKTsKKyAgICAgICAgICAgIGRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnVG9rZW5TdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNWNlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnIHsKKworICAgIHB1YmxpYyBjbGFzcyBEZWJ1Z1Rva2VuU3RyZWFtIDogSVRva2VuU3RyZWFtIHsKKyAgICAgICAgcHJvdGVjdGVkIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnOworICAgICAgICBwdWJsaWMgSVRva2VuU3RyZWFtIGlucHV0OworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBpbml0aWFsU3RyZWFtU3RhdGUgPSB0cnVlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdE1hcmtlcjsKKworICAgICAgICBwdWJsaWMgRGVidWdUb2tlblN0cmVhbShJVG9rZW5TdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnKSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgICAgICBEZWJ1Z0xpc3RlbmVyID0gZGJnOworICAgICAgICAgICAgLy8gZm9yY2UgVG9rZW5TdHJlYW0gdG8gZ2V0IGF0IGxlYXN0IGZpcnN0IHZhbGlkIHRva2VuCisgICAgICAgICAgICAvLyBzbyB3ZSBrbm93IGlmIHRoZXJlIGFyZSBhbnkgaGlkZGVuIHRva2VucyBmaXJzdCBpbiB0aGUgc3RyZWFtCisgICAgICAgICAgICBpbnB1dC5MVCgxKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHJvcGVydGllcworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBJbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBSYW5nZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5SYW5nZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgRGVidWdMaXN0ZW5lciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBkYmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGRiZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsU3RyZWFtU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBDb25zdW1lSW5pdGlhbEhpZGRlblRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGEgPSBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIElUb2tlbiB0ID0gaW5wdXQuTFQoMSk7CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICBpbnQgYiA9IGlucHV0LkluZGV4OworICAgICAgICAgICAgZGJnLkNvbnN1bWVUb2tlbih0KTsKKyAgICAgICAgICAgIGlmIChiID4gYSArIDEpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGNvbnN1bWVkIG1vcmUgdGhhbiBvbmUgdG9rZW47IG11c3QgYmUgb2ZmIGNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGEgKyAxOyBpIDwgYjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRiZy5Db25zdW1lSGlkZGVuVG9rZW4oaW5wdXQuR2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3VtZSBhbGwgaW5pdGlhbCBvZmYtY2hhbm5lbCB0b2tlbnM8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQ29uc3VtZUluaXRpYWxIaWRkZW5Ub2tlbnMoKSB7CisgICAgICAgICAgICBpbnQgZmlyc3RPbkNoYW5uZWxUb2tlbkluZGV4ID0gaW5wdXQuSW5kZXg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpcnN0T25DaGFubmVsVG9rZW5JbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGJnLkNvbnN1bWVIaWRkZW5Ub2tlbihpbnB1dC5HZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5pdGlhbFN0cmVhbVN0YXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTFQoaW50IGkpIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsU3RyZWFtU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBDb25zdW1lSW5pdGlhbEhpZGRlblRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGJnLkxUKGksIGlucHV0LkxUKGkpKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5MVChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBMQShpbnQgaSkgeworICAgICAgICAgICAgaWYgKGluaXRpYWxTdHJlYW1TdGF0ZSkgeworICAgICAgICAgICAgICAgIENvbnN1bWVJbml0aWFsSGlkZGVuVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYmcuTFQoaSwgaW5wdXQuTFQoaSkpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0LkxBKGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIEdldChpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LkdldChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkgeworICAgICAgICAgICAgbGFzdE1hcmtlciA9IGlucHV0Lk1hcmsoKTsKKyAgICAgICAgICAgIGRiZy5NYXJrKGxhc3RNYXJrZXIpOworICAgICAgICAgICAgcmV0dXJuIGxhc3RNYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZChpbnQgbWFya2VyKSB7CisgICAgICAgICAgICBkYmcuUmV3aW5kKG1hcmtlcik7CisgICAgICAgICAgICBpbnB1dC5SZXdpbmQobWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkgeworICAgICAgICAgICAgZGJnLlJld2luZCgpOworICAgICAgICAgICAgaW5wdXQuUmV3aW5kKGxhc3RNYXJrZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWxlYXNlKGludCBtYXJrZXIpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2VlayhpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBzZWVrIGluIGRiZyBpbnRlcmZhY2UKKyAgICAgICAgICAgIC8vIGRiLnNlZWsoaW5kZXgpOworICAgICAgICAgICAgaW5wdXQuU2VlayhpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ291bnQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW5Tb3VyY2UgVG9rZW5Tb3VyY2UgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuVG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblNvdXJjZS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKGludCBzdGFydCwgaW50IHN0b3ApIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5Ub1N0cmluZyhzdGFydCwgc3RvcCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmcoSVRva2VuIHN0YXJ0LCBJVG9rZW4gc3RvcCkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LlRvU3RyaW5nKHN0YXJ0LCBzdG9wKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZUFkYXB0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVBZGFwdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDdmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVBZGFwdG9yLmNzCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnIHsKKyAgICB1c2luZyBJVHJlZUFkYXB0b3IgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVBZGFwdG9yOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIFRyZWVBZGFwdG9yIHByb3h5IHRoYXQgZmlyZXMgZGVidWdnaW5nIGV2ZW50cyB0byBhIERlYnVnRXZlbnRMaXN0ZW5lcgorICAgICAqICBkZWxlZ2F0ZSBhbmQgdXNlcyB0aGUgVHJlZUFkYXB0b3IgZGVsZWdhdGUgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLiAgQWxsCisgICAgICogIEFTVCBldmVudHMgYXJlIHRyaWdnZXJlZCBieSB0aGlzIGFkYXB0b3I7IG5vIGNvZGUgZ2VuIGNoYW5nZXMgYXJlIG5lZWRlZAorICAgICAqICBpbiBnZW5lcmF0ZWQgcnVsZXMuICBEZWJ1Z2dpbmcgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgKmFmdGVyKiBpbnZva2luZworICAgICAqICB0cmVlIGFkYXB0b3Igcm91dGluZXMuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgVHJlZXMgY3JlYXRlZCB3aXRoIGFjdGlvbnMgaW4gcmV3cml0ZSBhY3Rpb25zIGxpa2UgIi0mZ3Q7IF4oQUREIHtmb299IHtiYXJ9KSIKKyAgICAgKiAgY2Fubm90IGJlIHRyYWNrZWQgYXMgdGhleSBtaWdodCBub3QgdXNlIHRoZSBhZGFwdG9yIHRvIGNyZWF0ZSBmb28sIGJhci4KKyAgICAgKiAgVGhlIGRlYnVnIGxpc3RlbmVyIGhhcyB0byBkZWFsIHdpdGggdHJlZSBub2RlIElEcyBmb3Igd2hpY2ggaXQgZGlkCisgICAgICogIG5vdCBzZWUgYSBjcmVhdGVOb2RlIGV2ZW50LiAgQSBzaW5nbGUgJmx0O3Vua25vd24mZ3Q7IG5vZGUgaXMgc3VmZmljaWVudCBldmVuCisgICAgICogIGlmIGl0IHJlcHJlc2VudHMgYSB3aG9sZSB0cmVlLgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERlYnVnVHJlZUFkYXB0b3IgOiBJVHJlZUFkYXB0b3IgeworICAgICAgICBwcm90ZWN0ZWQgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmc7CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKworICAgICAgICBwdWJsaWMgRGVidWdUcmVlQWRhcHRvcihJRGVidWdFdmVudExpc3RlbmVyIGRiZywgSVRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuZGJnID0gZGJnOworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoSVRva2VuIHBheWxvYWQpIHsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkLlRva2VuSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gY291bGQgYmUgdG9rZW4gY29uanVyZWQgdXAgZHVyaW5nIGVycm9yIHJlY292ZXJ5CisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZShwYXlsb2FkLlR5cGUsIHBheWxvYWQuVGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmplY3Qgbm9kZSA9IGFkYXB0b3IuQ3JlYXRlKHBheWxvYWQpOworICAgICAgICAgICAgZGJnLkNyZWF0ZU5vZGUobm9kZSwgcGF5bG9hZCk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBFcnJvck5vZGUoSVRva2VuU3RyZWFtIGlucHV0LCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBvYmplY3Qgbm9kZSA9IGFkYXB0b3IuRXJyb3JOb2RlKGlucHV0LCBzdGFydCwgc3RvcCwgZSk7CisgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGJnLkVycm9yTm9kZShub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IER1cFRyZWUob2JqZWN0IHRyZWUpIHsKKyAgICAgICAgICAgIG9iamVjdCB0ID0gYWRhcHRvci5EdXBUcmVlKHRyZWUpOworICAgICAgICAgICAgLy8gd2FsayB0aGUgdHJlZSBhbmQgZW1pdCBjcmVhdGUgYW5kIGFkZCBjaGlsZCBldmVudHMKKyAgICAgICAgICAgIC8vIHRvIHNpbXVsYXRlIHdoYXQgZHVwVHJlZSBoYXMgZG9uZS4gZHVwVHJlZSBkb2VzIG5vdCBjYWxsIHRoaXMgZGVidWcKKyAgICAgICAgICAgIC8vIGFkYXB0ZXIgc28gSSBtdXN0IHNpbXVsYXRlLgorICAgICAgICAgICAgU2ltdWxhdGVUcmVlQ29uc3RydWN0aW9uKHQpOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+XihBIEIgQyk6IGVtaXQgY3JlYXRlIEEsIGNyZWF0ZSBCLCBhZGQgY2hpbGQsIC4uLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTaW11bGF0ZVRyZWVDb25zdHJ1Y3Rpb24ob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGRiZy5DcmVhdGVOb2RlKHQpOworICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQodCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IGFkYXB0b3IuR2V0Q2hpbGQodCwgaSk7CisgICAgICAgICAgICAgICAgU2ltdWxhdGVUcmVlQ29uc3RydWN0aW9uKGNoaWxkKTsKKyAgICAgICAgICAgICAgICBkYmcuQWRkQ2hpbGQodCwgY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IER1cE5vZGUob2JqZWN0IHRyZWVOb2RlKSB7CisgICAgICAgICAgICBvYmplY3QgZCA9IGFkYXB0b3IuRHVwTm9kZSh0cmVlTm9kZSk7CisgICAgICAgICAgICBkYmcuQ3JlYXRlTm9kZShkKTsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IE5pbCgpIHsKKyAgICAgICAgICAgIG9iamVjdCBub2RlID0gYWRhcHRvci5OaWwoKTsKKyAgICAgICAgICAgIGRiZy5OaWxOb2RlKG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIElzTmlsKG9iamVjdCB0cmVlKSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5Jc05pbCh0cmVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQWRkQ2hpbGQob2JqZWN0IHQsIG9iamVjdCBjaGlsZCkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRhcHRvci5BZGRDaGlsZCh0LCBjaGlsZCk7CisgICAgICAgICAgICBkYmcuQWRkQ2hpbGQodCwgY2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEJlY29tZVJvb3Qob2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290KSB7CisgICAgICAgICAgICBvYmplY3QgbiA9IGFkYXB0b3IuQmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KTsKKyAgICAgICAgICAgIGRiZy5CZWNvbWVSb290KG5ld1Jvb3QsIG9sZFJvb3QpOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUnVsZVBvc3RQcm9jZXNzaW5nKG9iamVjdCByb290KSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZENoaWxkKG9iamVjdCB0LCBJVG9rZW4gY2hpbGQpIHsKKyAgICAgICAgICAgIG9iamVjdCBuID0gdGhpcy5DcmVhdGUoY2hpbGQpOworICAgICAgICAgICAgdGhpcy5BZGRDaGlsZCh0LCBuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBCZWNvbWVSb290KElUb2tlbiBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCkgeworICAgICAgICAgICAgb2JqZWN0IG4gPSB0aGlzLkNyZWF0ZShuZXdSb290KTsKKyAgICAgICAgICAgIGFkYXB0b3IuQmVjb21lUm9vdChuLCBvbGRSb290KTsKKyAgICAgICAgICAgIGRiZy5CZWNvbWVSb290KG5ld1Jvb3QsIG9sZFJvb3QpOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQ3JlYXRlKGludCB0b2tlblR5cGUsIElUb2tlbiBmcm9tVG9rZW4pIHsKKyAgICAgICAgICAgIG9iamVjdCBub2RlID0gYWRhcHRvci5DcmVhdGUodG9rZW5UeXBlLCBmcm9tVG9rZW4pOworICAgICAgICAgICAgZGJnLkNyZWF0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoaW50IHRva2VuVHlwZSwgSVRva2VuIGZyb21Ub2tlbiwgc3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIG9iamVjdCBub2RlID0gYWRhcHRvci5DcmVhdGUodG9rZW5UeXBlLCBmcm9tVG9rZW4sIHRleHQpOworICAgICAgICAgICAgZGJnLkNyZWF0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIG9iamVjdCBub2RlID0gYWRhcHRvci5DcmVhdGUodG9rZW5UeXBlLCB0ZXh0KTsKKyAgICAgICAgICAgIGRiZy5DcmVhdGVOb2RlKG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VHlwZShvYmplY3QgdCkgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuR2V0VHlwZSh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0VHlwZShvYmplY3QgdCwgaW50IHR5cGUpIHsKKyAgICAgICAgICAgIGFkYXB0b3IuU2V0VHlwZSh0LCB0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRUZXh0KG9iamVjdCB0KSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRUZXh0KHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUZXh0KG9iamVjdCB0LCBzdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgYWRhcHRvci5TZXRUZXh0KHQsIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIEdldFRva2VuKG9iamVjdCB0KSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRUb2tlbih0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0VG9rZW5Cb3VuZGFyaWVzKG9iamVjdCB0LCBJVG9rZW4gc3RhcnRUb2tlbiwgSVRva2VuIHN0b3BUb2tlbikgeworICAgICAgICAgICAgYWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXModCwgc3RhcnRUb2tlbiwgc3RvcFRva2VuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwgJiYgc3RhcnRUb2tlbiAhPSBudWxsICYmIHN0b3BUb2tlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGJnLlNldFRva2VuQm91bmRhcmllcygKKyAgICAgICAgICAgICAgICAgICAgdCwgc3RhcnRUb2tlbi5Ub2tlbkluZGV4LAorICAgICAgICAgICAgICAgICAgICBzdG9wVG9rZW4uVG9rZW5JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VG9rZW5TdGFydEluZGV4KG9iamVjdCB0KSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRUb2tlblN0YXJ0SW5kZXgodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VG9rZW5TdG9wSW5kZXgob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFRva2VuU3RvcEluZGV4KHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldENoaWxkKG9iamVjdCB0LCBpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuR2V0Q2hpbGQodCwgaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldENoaWxkKG9iamVjdCB0LCBpbnQgaSwgb2JqZWN0IGNoaWxkKSB7CisgICAgICAgICAgICBhZGFwdG9yLlNldENoaWxkKHQsIGksIGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBEZWxldGVDaGlsZChvYmplY3QgdCwgaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiBEZWxldGVDaGlsZCh0LCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBHZXRDaGlsZENvdW50KG9iamVjdCB0KSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRDaGlsZENvdW50KHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFVuaXF1ZUlEKG9iamVjdCBub2RlKSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRVbmlxdWVJRChub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBHZXRQYXJlbnQob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFBhcmVudCh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBHZXRDaGlsZEluZGV4KG9iamVjdCB0KSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRDaGlsZEluZGV4KHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRQYXJlbnQob2JqZWN0IHQsIG9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgICAgIGFkYXB0b3IuU2V0UGFyZW50KHQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldENoaWxkSW5kZXgob2JqZWN0IHQsIGludCBpbmRleCkgeworICAgICAgICAgICAgYWRhcHRvci5TZXRDaGlsZEluZGV4KHQsIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZUNoaWxkcmVuKG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGFkYXB0b3IuUmVwbGFjZUNoaWxkcmVuKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIHN1cHBvcnQKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRGVidWdFdmVudExpc3RlbmVyIEdldERlYnVnTGlzdGVuZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gZGJnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXREZWJ1Z0xpc3RlbmVyKElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnKSB7CisgICAgICAgICAgICB0aGlzLmRiZyA9IGRiZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlQWRhcHRvciBHZXRUcmVlQWRhcHRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZU5vZGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVOb2RlU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDYyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVOb2RlU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnIHsKKyAgICB1c2luZyBPYnNvbGV0ZSA9IFN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZTsKKyAgICB1c2luZyBJVHJlZUFkYXB0b3IgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVBZGFwdG9yOworICAgIHVzaW5nIElUcmVlTm9kZVN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZU5vZGVTdHJlYW07CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIERlYnVnIGFueSB0cmVlIG5vZGUgc3RyZWFtLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgdGhlIHN0cmVhbQorICAgICAqICBhbmQgYSBkZWJ1ZyBsaXN0ZW5lci4gIEFzIG5vZGUgc3RyZWFtIGNhbGxzIGNvbWUgaW4sIGRlYnVnIGV2ZW50cworICAgICAqICBhcmUgdHJpZ2dlcmVkLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERlYnVnVHJlZU5vZGVTdHJlYW0gOiBJVHJlZU5vZGVTdHJlYW0geworICAgICAgICBwcm90ZWN0ZWQgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmc7CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlTm9kZVN0cmVhbSBpbnB1dDsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgaW5pdGlhbFN0cmVhbVN0YXRlID0gdHJ1ZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+VHJhY2sgdGhlIGxhc3QgbWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gcmV3aW5kKCkuPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGxhc3RNYXJrZXI7CisKKyAgICAgICAgcHVibGljIERlYnVnVHJlZU5vZGVTdHJlYW0oSVRyZWVOb2RlU3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZykgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gaW5wdXQuVHJlZUFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLmlucHV0LlVuaXF1ZU5hdmlnYXRpb25Ob2RlcyA9IHRydWU7CisgICAgICAgICAgICBEZWJ1Z0xpc3RlbmVyID0gZGJnOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgRGVidWdMaXN0ZW5lciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBkYmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGRiZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBJbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW5TdHJlYW0gVG9rZW5TdHJlYW0geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuVG9rZW5TdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRyZWVBZGFwdG9yIFRyZWVBZGFwdG9yIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFRyZWVTb3VyY2UgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSXQgaXMgbm9ybWFsbHkgdGhpcyBvYmplY3QgdGhhdCBpbnN0cnVjdHMgdGhlIG5vZGUgc3RyZWFtIHRvCisgICAgICAgICAqICBjcmVhdGUgdW5pcXVlIG5hdiBub2RlcywgYnV0IHRvIHNhdGlzZnkgaW50ZXJmYWNlLCB3ZSBoYXZlIHRvCisgICAgICAgICAqICBkZWZpbmUgaXQuICBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gaWdub3JlIHRoZSBwYXJhbWV0ZXIgYnV0CisgICAgICAgICAqICB0aGVyZSBtaWdodCBiZSBhIHVzZSBmb3IgaXQgbGF0ZXIsIHNvIEknbGwgbGVhdmUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbCBVbmlxdWVOYXZpZ2F0aW9uTm9kZXMgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuVW5pcXVlTmF2aWdhdGlvbk5vZGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBpbnB1dC5VbmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWUoKSB7CisgICAgICAgICAgICBvYmplY3Qgbm9kZSA9IGlucHV0LkxUKDEpOworICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgZGJnLkNvbnN1bWVOb2RlKG5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IHRoaXNbaW50IGldIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IExUKGludCBpKSB7CisgICAgICAgICAgICBvYmplY3Qgbm9kZSA9IGlucHV0LkxUKGkpOworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRChub2RlKTsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KG5vZGUpOworICAgICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLkdldFR5cGUobm9kZSk7CisgICAgICAgICAgICBkYmcuTFQoaSwgbm9kZSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBMQShpbnQgaSkgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBpbnB1dC5MVChpKTsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQobm9kZSk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dChub2RlKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKG5vZGUpOworICAgICAgICAgICAgZGJnLkxUKGksIG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTWFyaygpIHsKKyAgICAgICAgICAgIGxhc3RNYXJrZXIgPSBpbnB1dC5NYXJrKCk7CisgICAgICAgICAgICBkYmcuTWFyayhsYXN0TWFya2VyKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0TWFya2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoaW50IG1hcmtlcikgeworICAgICAgICAgICAgZGJnLlJld2luZChtYXJrZXIpOworICAgICAgICAgICAgaW5wdXQuUmV3aW5kKG1hcmtlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCgpIHsKKyAgICAgICAgICAgIGRiZy5SZXdpbmQoKTsKKyAgICAgICAgICAgIGlucHV0LlJld2luZChsYXN0TWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZShpbnQgbWFya2VyKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNlZWsoaW50IGluZGV4KSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgc2VlayBpbiBkYmcgaW50ZXJmYWNlCisgICAgICAgICAgICAvLyBkYi5zZWVrKGluZGV4KTsKKyAgICAgICAgICAgIGlucHV0LlNlZWsoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFNvdXJjZU5hbWUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5TdHJlYW0uU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZUNoaWxkcmVuKG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGlucHV0LlJlcGxhY2VDaGlsZHJlbihwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCwgc3RvcENoaWxkSW5kZXgsIHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKG9iamVjdCBzdGFydCwgb2JqZWN0IHN0b3ApIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5Ub1N0cmluZyhzdGFydCwgc3RvcCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1ODM4MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZVBhcnNlci5jcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIE5vdGUgdG8gSkw6IFJlZmFjdG9yZWQgZXh0ZW5zaW9uIG1ldGhvZHMKKyAqIAorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnIHsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zOworCisgICAgdXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworICAgIHVzaW5nIElPRXhjZXB0aW9uID0gU3lzdGVtLklPLklPRXhjZXB0aW9uOworICAgIHVzaW5nIElUcmVlTm9kZVN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZU5vZGVTdHJlYW07CisgICAgdXNpbmcgVHJlZVBhcnNlciA9IEFudGxyLlJ1bnRpbWUuVHJlZS5UcmVlUGFyc2VyOworCisgICAgcHVibGljIGNsYXNzIERlYnVnVHJlZVBhcnNlciA6IFRyZWVQYXJzZXIgeworICAgICAgICAvKiogPHN1bW1hcnk+V2hvIHRvIG5vdGlmeSB3aGVuIGV2ZW50cyBpbiB0aGUgcGFyc2VyIG9jY3VyLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gbnVsbDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBVc2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBmaXhlZCBsb29rYWhlYWQgYW5kIGN5Y2xpYyBERkEgZGVjaXNpb25zCisgICAgICAgICAqICB3aGlsZSBwcm9maWxpbmcuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbCBpc0N5Y2xpY0RlY2lzaW9uID0gZmFsc2U7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ3JlYXRlIGEgbm9ybWFsIHBhcnNlciBleGNlcHQgd3JhcCB0aGUgdG9rZW4gc3RyZWFtIGluIGEgZGVidWcKKyAgICAgICAgICogIHByb3h5IHRoYXQgZmlyZXMgY29uc3VtZSBldmVudHMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRGVidWdUcmVlUGFyc2VyKElUcmVlTm9kZVN0cmVhbSBpbnB1dCwgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkKKyAgICAgICAgICAgIDogYmFzZShpbnB1dCBpcyBEZWJ1Z1RyZWVOb2RlU3RyZWFtID8gaW5wdXQgOiBuZXcgRGVidWdUcmVlTm9kZVN0cmVhbShpbnB1dCwgZGJnKSwgc3RhdGUpIHsKKyAgICAgICAgICAgIFNldERlYnVnTGlzdGVuZXIoZGJnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWJ1Z1RyZWVQYXJzZXIoSVRyZWVOb2RlU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpCisgICAgICAgICAgICA6IGJhc2UoaW5wdXQgaXMgRGVidWdUcmVlTm9kZVN0cmVhbSA/IGlucHV0IDogbmV3IERlYnVnVHJlZU5vZGVTdHJlYW0oaW5wdXQsIG51bGwpLCBzdGF0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERlYnVnVHJlZVBhcnNlcihJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnKQorICAgICAgICAgICAgOiB0aGlzKGlucHV0IGlzIERlYnVnVHJlZU5vZGVTdHJlYW0gPyBpbnB1dCA6IG5ldyBEZWJ1Z1RyZWVOb2RlU3RyZWFtKGlucHV0LCBkYmcpLCBkYmcsIG51bGwpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJRGVidWdFdmVudExpc3RlbmVyIERlYnVnTGlzdGVuZXIgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUHJvdmlkZSBhIG5ldyBkZWJ1ZyBldmVudCBsaXN0ZW5lciBmb3IgdGhpcyBwYXJzZXIuICBOb3RpZnkgdGhlCisgICAgICAgICAqICBpbnB1dCBzdHJlYW0gdG9vIHRoYXQgaXQgc2hvdWxkIHNlbmQgZXZlbnRzIHRvIHRoaXMgbGlzdGVuZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldERlYnVnTGlzdGVuZXIoSURlYnVnRXZlbnRMaXN0ZW5lciB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGlucHV0IGlzIERlYnVnVHJlZU5vZGVTdHJlYW0pCisgICAgICAgICAgICAgICAgKChEZWJ1Z1RyZWVOb2RlU3RyZWFtKWlucHV0KS5EZWJ1Z0xpc3RlbmVyID0gdmFsdWU7CisKKyAgICAgICAgICAgIHRoaXMuZGJnID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcG9ydEVycm9yKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGUpOworICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoZSwgQ29uc29sZS5FcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IEdldE1pc3NpbmdTeW1ib2woSUludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRUb2tlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgZm9sbG93KSB7CisgICAgICAgICAgICBvYmplY3QgbyA9IGJhc2UuR2V0TWlzc2luZ1N5bWJvbChpbnB1dCwgZSwgZXhwZWN0ZWRUb2tlblR5cGUsIGZvbGxvdyk7CisgICAgICAgICAgICBkYmcuQ29uc3VtZU5vZGUobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJlZ2luUmVzeW5jKCkgeworICAgICAgICAgICAgZGJnLkJlZ2luUmVzeW5jKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRSZXN5bmMoKSB7CisgICAgICAgICAgICBkYmcuRW5kUmVzeW5jKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlZ2luQmFja3RyYWNrKGludCBsZXZlbCkgeworICAgICAgICAgICAgZGJnLkJlZ2luQmFja3RyYWNrKGxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKSB7CisgICAgICAgICAgICBkYmcuRW5kQmFja3RyYWNrKGxldmVsLCBzdWNjZXNzZnVsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL0lEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9JRGVidWdFdmVudExpc3RlbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzk1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9JRGVidWdFdmVudExpc3RlbmVyLmNzCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnIHsKKworICAgIC8qKiA8c3VtbWFyeT5BbGwgZGVidWdnaW5nIGV2ZW50cyB0aGF0IGEgcmVjb2duaXplciBjYW4gdHJpZ2dlci48L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIEkgZGlkIG5vdCBjcmVhdGUgYSBzZXBhcmF0ZSBBU1QgZGVidWdnaW5nIGludGVyZmFjZSBhcyBpdCB3b3VsZCBjcmVhdGUKKyAgICAgKiAgbG90cyBvZiBleHRyYSBjbGFzc2VzIGFuZCBEZWJ1Z1BhcnNlciBoYXMgYSBkYmcgdmFyIGRlZmluZWQsIHdoaWNoIG1ha2VzCisgICAgICogIGl0IGhhcmQgdG8gY2hhbmdlIHRvIEFTVERlYnVnRXZlbnRMaXN0ZW5lci4gIEkgbG9va2VkIGhhcmQgYXQgdGhpcyBpc3N1ZQorICAgICAqICBhbmQgaXQgaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYXMgb25lIG1vbm9saXRoaWMgZXZlbnQgaW50ZXJmYWNlIGZvciBhbGwKKyAgICAgKiAgcG9zc2libGUgZXZlbnRzLiAgSG9wZWZ1bGx5LCBhZGRpbmcgU1QgZGVidWdnaW5nIHN0dWZmIHdvbid0IGJlIGJhZC4gIExlYXZlCisgICAgICogIGZvciBmdXR1cmUuIDQvMjYvMjAwNi4KKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSURlYnVnRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIHZvaWQgSW5pdGlhbGl6ZSgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRoZSBwYXJzZXIgaGFzIGp1c3QgZW50ZXJlZCBhIHJ1bGUuICBObyBkZWNpc2lvbiBoYXMgYmVlbiBtYWRlIGFib3V0CisgICAgICAgICAqICB3aGljaCBhbHQgaXMgcHJlZGljdGVkLiAgVGhpcyBpcyBmaXJlZCBBRlRFUiBpbml0IGFjdGlvbnMgaGF2ZSBiZWVuCisgICAgICAgICAqICBleGVjdXRlZC4gIEF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgYW5kIGF2YWlsYWJsZSBldGMuLi4KKyAgICAgICAgICogIFRoZSBncmFtbWFyRmlsZU5hbWUgYWxsb3dzIGNvbXBvc2l0ZSBncmFtbWFycyB0byBqdW1wIGFyb3VuZCBhbW9uZworICAgICAgICAgKiAgbXVsdGlwbGUgZ3JhbW1hciBmaWxlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRW50ZXJSdWxlKHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQmVjYXVzZSBydWxlcyBjYW4gaGF2ZSBsb3RzIG9mIGFsdGVybmF0aXZlcywgaXQgaXMgdmVyeSB1c2VmdWwgdG8KKyAgICAgICAgICogIGtub3cgd2hpY2ggYWx0IHlvdSBhcmUgZW50ZXJpbmcuICBUaGlzIGlzIDEuLm4gZm9yIG4gYWx0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRW50ZXJBbHQoaW50IGFsdCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGhpcyBpcyB0aGUgbGFzdCB0aGluZyBleGVjdXRlZCBiZWZvcmUgbGVhdmluZyBhIHJ1bGUuICBJdCBpcworICAgICAgICAgKiAgZXhlY3V0ZWQgZXZlbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgVGhpcyBpcyB0cmlnZ2VyZWQgYWZ0ZXIKKyAgICAgICAgICogIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaGF2ZSBvY2N1cnJlZCAodW5sZXNzIHRoZSBleGNlcHRpb24gaXMKKyAgICAgICAgICogIG5vdCBjYXVnaHQgaW4gdGhpcyBydWxlKS4gIFRoaXMgaW1wbGllcyBhbiAiZXhpdEFsdCIgZXZlbnQuCisgICAgICAgICAqICBUaGUgZ3JhbW1hckZpbGVOYW1lIGFsbG93cyBjb21wb3NpdGUgZ3JhbW1hcnMgdG8ganVtcCBhcm91bmQgYW1vbmcKKyAgICAgICAgICogIG11bHRpcGxlIGdyYW1tYXIgZmlsZXMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEV4aXRSdWxlKHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIGVudHJ5IGludG8gYW55ICguLi4pIHN1YnJ1bGUgb3RoZXIgRUJORiBjb25zdHJ1Y3Q8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgRW50ZXJTdWJSdWxlKGludCBkZWNpc2lvbk51bWJlcik7CisKKyAgICAgICAgdm9pZCBFeGl0U3ViUnVsZShpbnQgZGVjaXNpb25OdW1iZXIpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEV2ZXJ5IGRlY2lzaW9uLCBmaXhlZCBrIG9yIGFyYml0cmFyeSwgaGFzIGFuIGVudGVyL2V4aXQgZXZlbnQKKyAgICAgICAgICogIHNvIHRoYXQgYSBHVUkgY2FuIGVhc2lseSB0cmFjayB3aGF0IExUL2NvbnN1bWUgZXZlbnRzIGFyZQorICAgICAgICAgKiAgYXNzb2NpYXRlZCB3aXRoIHByZWRpY3Rpb24uICBZb3Ugd2lsbCBzZWUgYSBzaW5nbGUgZW50ZXIvZXhpdAorICAgICAgICAgKiAgc3VicnVsZSBidXQgbXVsdGlwbGUgZW50ZXIvZXhpdCBkZWNpc2lvbiBldmVudHMsIG9uZSBmb3IgZWFjaAorICAgICAgICAgKiAgbG9vcCBpdGVyYXRpb24uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEVudGVyRGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyLCBib29sIGNvdWxkQmFja3RyYWNrKTsKKworICAgICAgICB2b2lkIEV4aXREZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFuIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZDsgbWF0Y2hlZCBieSBhbnkga2luZCBvZiBlbGVtZW50LgorICAgICAgICAgKiAgVHJpZ2dlciBhZnRlciB0aGUgdG9rZW4gd2FzIG1hdGNoZWQgYnkgdGhpbmdzIGxpa2UgbWF0Y2goKSwgbWF0Y2hBbnkoKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQ29uc3VtZVRva2VuKElUb2tlbiB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBbiBvZmYtY2hhbm5lbCBpbnB1dCB0b2tlbiB3YXMgY29uc3VtZWQuCisgICAgICAgICAqICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorICAgICAgICAgKiAgKHVubGVzcyBvZiBjb3Vyc2UgdGhlIGhpZGRlbiB0b2tlbiBpcyBmaXJzdCBzdHVmZiBpbiB0aGUgaW5wdXQgc3RyZWFtKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKElUb2tlbiB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTb21lYm9keSAoYW55Ym9keSkgbG9va2VkIGFoZWFkLiAgTm90ZSB0aGF0IHRoaXMgYWN0dWFsbHkgZ2V0cworICAgICAgICAgKiAgdHJpZ2dlcmVkIGJ5IGJvdGggTEEgYW5kIExUIGNhbGxzLiAgVGhlIGRlYnVnZ2VyIHdpbGwgd2FudCB0byBrbm93CisgICAgICAgICAqICB3aGljaCBUb2tlbiBvYmplY3Qgd2FzIGV4YW1pbmVkLiAgTGlrZSBjb25zdW1lVG9rZW4sIHRoaXMgaW5kaWNhdGVzCisgICAgICAgICAqICB3aGF0IHRva2VuIHdhcyBzZWVuIGF0IHRoYXQgZGVwdGguICBBIHJlbW90ZSBkZWJ1Z2dlciBjYW5ub3QgbG9vaworICAgICAgICAgKiAgYWhlYWQgaW50byBhIGZpbGUgaXQgZG9lc24ndCBoYXZlIHNvIExUIGV2ZW50cyBtdXN0IHBhc3MgdGhlIHRva2VuCisgICAgICAgICAqICBldmVuIGlmIHRoZSBpbmZvIGlzIHJlZHVuZGFudC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgTFQoaW50IGksIElUb2tlbiB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgcGFyc2VyIGlzIGdvaW5nIHRvIGxvb2sgYXJiaXRyYXJpbHkgYWhlYWQ7IG1hcmsgdGhpcyBsb2NhdGlvbiwKKyAgICAgICAgICogIHRoZSB0b2tlbiBzdHJlYW0ncyBtYXJrZXIgaXMgc2VudCBpbiBjYXNlIHlvdSBuZWVkIGl0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBNYXJrKGludCBtYXJrZXIpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFmdGVyIGFuIGFyYml0cmFpcmx5IGxvbmcgbG9va2FoZWFkIGFzIHdpdGggYSBjeWNsaWMgREZBIChvciB3aXRoCisgICAgICAgICAqICBhbnkgYmFja3RyYWNrKSwgdGhpcyBpbmZvcm1zIHRoZSBkZWJ1Z2dlciB0aGF0IHN0cmVhbSBzaG91bGQgYmUKKyAgICAgICAgICogIHJld291bmQgdG8gdGhlIHBvc2l0aW9uIGFzc29jaWF0ZWQgd2l0aCBtYXJrZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFJld2luZChpbnQgbWFya2VyKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXdpbmQgdG8gdGhlIGlucHV0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hcmtlci4KKyAgICAgICAgICogIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0CisgICAgICAgICAqICBiZWZvcmUgc3RhcnRpbmcgYSBzZW0vc3luIHByZWRpY2F0ZSB0byBnZXQgdGhlCisgICAgICAgICAqICBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGVjaXNpb24uCisgICAgICAgICAqICBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgbWFyayhpKQorICAgICAgICAgKiAgYW5kIHJld2luZChpKSBzaG91bGQgYmFsYW5jZSBzdGlsbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUmV3aW5kKCk7CisKKyAgICAgICAgdm9pZCBCZWdpbkJhY2t0cmFjayhpbnQgbGV2ZWwpOworCisgICAgICAgIHZvaWQgRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUbyB3YXRjaCBhIHBhcnNlciBtb3ZlIHRocm91Z2ggdGhlIGdyYW1tYXIsIHRoZSBwYXJzZXIgbmVlZHMgdG8KKyAgICAgICAgICogIGluZm9ybSB0aGUgZGVidWdnZXIgd2hhdCBsaW5lL2NoYXJQb3MgaXQgaXMgcGFzc2luZyBpbiB0aGUgZ3JhbW1hci4KKyAgICAgICAgICogIEZvciBub3csIHRoaXMgZG9lcyBub3Qga25vdyBob3cgdG8gc3dpdGNoIGZyb20gb25lIGdyYW1tYXIgdG8gdGhlCisgICAgICAgICAqICBvdGhlciBhbmQgYmFjayBmb3IgaXNsYW5kIGdyYW1tYXJzIGV0Yy4uLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBhbHNvIGFsbG93IGJyZWFrcG9pbnRzIGJlY2F1c2UgdGhlIGRlYnVnZ2VyIGNhbiBzdG9wCisgICAgICAgICAqICB0aGUgcGFyc2VyIHdoZW5ldmVyIGl0IGhpdHMgdGhpcyBsaW5lL3Bvcy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgTG9jYXRpb24oaW50IGxpbmUsIGludCBwb3MpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFeGNlcHRpb24uICBJIG1hZGUKKyAgICAgICAgICogIHRoaXMgYSBnZW5lcmljIGV2ZW50IHNvIHRoYXQgSSBjYW4gYWx0ZXIgdGhlIGV4Y2VwdGlvbiBoaWVyYWNoeSBsYXRlcgorICAgICAgICAgKiAgd2l0aG91dCBoYXZpbmcgdG8gYWx0ZXIgYWxsIHRoZSBkZWJ1ZyBvYmplY3RzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBVcG9uIGVycm9yLCB0aGUgc3RhY2sgb2YgZW50ZXIgcnVsZS9zdWJydWxlIG11c3QgYmUgcHJvcGVybHkgdW53b3VuZC4KKyAgICAgICAgICogIElmIG5vIHZpYWJsZSBhbHQgb2NjdXJzIGl0IGlzIHdpdGhpbiBhbiBlbnRlci9leGl0IGRlY2lzaW9uLCB3aGljaAorICAgICAgICAgKiAgYWxzbyBtdXN0IGJlIHJld291bmQuICBFdmVuIHRoZSByZXdpbmQgZm9yIGVhY2ggbWFyayBtdXN0IGJlIHVud291bnQuCisgICAgICAgICAqICBJbiB0aGUgSmF2YSB0YXJnZXQgdGhpcyBpcyBwcmV0dHkgZWFzeSB1c2luZyB0cnkvZmluYWxseSwgaWYgYSBiaXQKKyAgICAgICAgICogIHVnbHkgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVGhlIHJld2luZCBpcyBnZW5lcmF0ZWQgaW4gREZBLnByZWRpY3QoKQorICAgICAgICAgKiAgYWN0dWFsbHkgc28gbm8gY29kZSBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgZm9yIHRoYXQuICBGb3IgbGFuZ3VhZ2VzCisgICAgICAgICAqICB3L28gdGhpcyAiZmluYWxseSIgZmVhdHVyZSAoQysrPyksIHRoZSB0YXJnZXQgaW1wbGVtZW50b3Igd2lsbCBoYXZlCisgICAgICAgICAqICB0byBidWlsZCBhbiBldmVudCBzdGFjayBvciBzb21ldGhpbmcuCisgICAgICAgICAqCisgICAgICAgICAqICBBY3Jvc3MgYSBzb2NrZXQgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcsIG9ubHkgdGhlIFJlY29nbml0aW9uRXhjZXB0aW9uCisgICAgICAgICAqICBkYXRhIGZpZWxkcyBhcmUgdHJhbnNtaXR0ZWQuICBUaGUgdG9rZW4gb2JqZWN0IG9yIHdoYXRldmVyIHRoYXQKKyAgICAgICAgICogIGNhdXNlZCB0aGUgcHJvYmxlbSB3YXMgdGhlIGxhc3Qgb2JqZWN0IHJlZmVyZW5jZWQgYnkgTFQuICBUaGUKKyAgICAgICAgICogIGltbWVkaWF0ZWx5IHByZWNlZGluZyBMVCBldmVudCBzaG91bGQgaG9sZCB0aGUgdW5leHBlY3RlZCBUb2tlbiBvcgorICAgICAgICAgKiAgY2hhci4KKyAgICAgICAgICoKKyAgICAgICAgICogIEhlcmUgaXMgYSBzYW1wbGUgZXZlbnQgdHJhY2UgZm9yIGdyYW1tYXI6CisgICAgICAgICAqCisgICAgICAgICAqICBiIDogQyAoezt9QXxCKSAvLyB7O30gaXMgdGhlcmUgdG8gcHJldmVudCBBfEIgYmVjb21pbmcgYSBzZXQKKyAgICAgICAgICogICAgfCBECisgICAgICAgICAqICAgIDsKKyAgICAgICAgICoKKyAgICAgICAgICogIFRoZSBzZXF1ZW5jZSBmb3IgdGhpcyBydWxlICh3aXRoIG5vIHZpYWJsZSBhbHQgaW4gdGhlIHN1YnJ1bGUpIGZvcgorICAgICAgICAgKiAgaW5wdXQgJ2MgYycgKHRoZXJlIGFyZSAzIHRva2VucykgaXM6CisgICAgICAgICAqCisgICAgICAgICAqCQljb21tZW5jZQorICAgICAgICAgKgkJTFQoMSkKKyAgICAgICAgICoJCWVudGVyUnVsZSBiCisgICAgICAgICAqCQlsb2NhdGlvbiA3IDEKKyAgICAgICAgICoJCWVudGVyIGRlY2lzaW9uIDMKKyAgICAgICAgICoJCUxUKDEpCisgICAgICAgICAqCQlleGl0IGRlY2lzaW9uIDMKKyAgICAgICAgICoJCWVudGVyQWx0MQorICAgICAgICAgKgkJbG9jYXRpb24gNyA1CisgICAgICAgICAqCQlMVCgxKQorICAgICAgICAgKgkJY29uc3VtZVRva2VuIFtjLzw0PiwxOjBdCisgICAgICAgICAqCQlsb2NhdGlvbiA3IDcKKyAgICAgICAgICoJCWVudGVyU3ViUnVsZSAyCisgICAgICAgICAqCQllbnRlciBkZWNpc2lvbiAyCisgICAgICAgICAqCQlMVCgxKQorICAgICAgICAgKgkJTFQoMSkKKyAgICAgICAgICoJCXJlY29nbml0aW9uRXhjZXB0aW9uIE5vVmlhYmxlQWx0RXhjZXB0aW9uIDIgMSAyCisgICAgICAgICAqCQlleGl0IGRlY2lzaW9uIDIKKyAgICAgICAgICoJCWV4aXRTdWJSdWxlIDIKKyAgICAgICAgICoJCWJlZ2luUmVzeW5jCisgICAgICAgICAqCQlMVCgxKQorICAgICAgICAgKgkJY29uc3VtZVRva2VuIFtjLzw0PiwxOjFdCisgICAgICAgICAqCQlMVCgxKQorICAgICAgICAgKgkJZW5kUmVzeW5jCisgICAgICAgICAqCQlMVCgtMSkKKyAgICAgICAgICoJCWV4aXRSdWxlIGIKKyAgICAgICAgICoJCXRlcm1pbmF0ZQorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBSZWNvZ25pdGlvbkV4Y2VwdGlvbihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJbmRpY2F0ZXMgdGhlIHJlY29nbml6ZXIgaXMgYWJvdXQgdG8gY29uc3VtZSB0b2tlbnMgdG8gcmVzeW5jaHJvbml6ZQorICAgICAgICAgKiAgdGhlIHBhcnNlci4gIEFueSBjb25zdW1lIGV2ZW50cyBmcm9tIGhlcmUgdW50aWwgdGhlIHJlY292ZXJlZCBldmVudAorICAgICAgICAgKiAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXJzZS0tdGhleSBhcmUgZGVhZCB0b2tlbnMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEJlZ2luUmVzeW5jKCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSW5kaWNhdGVzIHRoYXQgdGhlIHJlY29nbml6ZXIgaGFzIGZpbmlzaGVkIGNvbnN1bWluZyB0b2tlbnMgaW4gb3JkZXIKKyAgICAgICAgICogIHRvIHJlc3ljaHJvbml6ZS4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBiZWdpblJlc3luYy9lbmRSZXN5bmMgcGFpcnMKKyAgICAgICAgICogIGJlZm9yZSB0aGUgcmVjb2duaXplciBjb21lcyBvdXQgb2YgZXJyb3JSZWNvdmVyeSBtb2RlIChpbiB3aGljaAorICAgICAgICAgKiAgbXVsdGlwbGUgZXJyb3JzIGFyZSBzdXBwcmVzc2VkKS4gIFRoaXMgd2lsbCBiZSB1c2VmdWwKKyAgICAgICAgICogIGluIGEgZ3VpIHdoZXJlIHlvdSB3YW50IHRvIHByb2JhYmx5IGdyZXkgb3V0IHRva2VucyB0aGF0IGFyZSBjb25zdW1lZAorICAgICAgICAgKiAgYnV0IG5vdCBtYXRjaGVkIHRvIGFueXRoaW5nIGluIGdyYW1tYXIuICBBbnl0aGluZyBiZXR3ZWVuCisgICAgICAgICAqICBhIGJlZ2luUmVzeW5jL2VuZFJlc3luYyBwYWlyIHdhcyB0b3NzZWQgb3V0IGJ5IHRoZSBwYXJzZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEVuZFJlc3luYygpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5BIHNlbWFudGljIHByZWRpY2F0ZSB3YXMgZXZhbHVhdGUgd2l0aCB0aGlzIHJlc3VsdCBhbmQgYWN0aW9uIHRleHQ8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2VtYW50aWNQcmVkaWNhdGUoYm9vbCByZXN1bHQsIHN0cmluZyBwcmVkaWNhdGUpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKyAgICAgICAgICogIHNlbmRpbmcgZXZlbnRzIG92ZXIgYSBzb2NrZXQuICBBIEdVSSBmb3IgZXhhbXBsZSB3aWxsIGxhdW5jaCBhIHRocmVhZAorICAgICAgICAgKiAgdG8gY29ubmVjdCBhbmQgY29tbXVuaWNhdGUgd2l0aCBhIHJlbW90ZSBwYXJzZXIuICBUaGUgdGhyZWFkIHdpbGwgd2FudAorICAgICAgICAgKiAgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKyAgICAgICAgICogIHRyaWdnZXIgdGhpcyB1cG9uIGVudHJ5IHRvIHRoZSBmaXJzdCBydWxlICh0aGUgcnVsZUxldmVsIGlzIHVzZWQgdG8KKyAgICAgICAgICogIGZpZ3VyZSB0aGlzIG91dCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIENvbW1lbmNlKCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUGFyc2luZyBpcyBvdmVyOyBzdWNjZXNzZnVsbHkgb3Igbm90LiAgTW9zdGx5IHVzZWZ1bCBmb3IgdGVsbGluZworICAgICAgICAgKiAgcmVtb3RlIGRlYnVnZ2luZyBsaXN0ZW5lcnMgdGhhdCBpdCdzIHRpbWUgdG8gcXVpdC4gIFdoZW4gdGhlIHJ1bGUKKyAgICAgICAgICogIGludm9jYXRpb24gbGV2ZWwgZ29lcyB0byB6ZXJvIGF0IHRoZSBlbmQgb2YgYSBydWxlLCB3ZSBhcmUgZG9uZQorICAgICAgICAgKiAgcGFyc2luZy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgVGVybWluYXRlKCk7CisKKworICAgICAgICAjcmVnaW9uIFRyZWUgUGFyc2luZworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIElucHV0IGZvciBhIHRyZWUgcGFyc2VyIGlzIGFuIEFTVCwgYnV0IHdlIGtub3cgbm90aGluZyBmb3Igc3VyZQorICAgICAgICAgKiAgYWJvdXQgYSBub2RlIGV4Y2VwdCBpdHMgdHlwZSBhbmQgdGV4dCAob2J0YWluZWQgZnJvbSB0aGUgYWRhcHRvcikuCisgICAgICAgICAqICBUaGlzIGlzIHRoZSBhbmFsb2cgb2YgdGhlIGNvbnN1bWVUb2tlbiBtZXRob2QuICBBZ2FpbiwgdGhlIElEIGlzCisgICAgICAgICAqICB0aGUgaGFzaENvZGUgdXN1YWxseSBvZiB0aGUgbm9kZSBzbyBpdCBvbmx5IHdvcmtzIGlmIGhhc2hDb2RlIGlzCisgICAgICAgICAqICBub3QgaW1wbGVtZW50ZWQuICBJZiB0aGUgdHlwZSBpcyBVUCBvciBET1dOLCB0aGVuCisgICAgICAgICAqICB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisgICAgICAgICAqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cGFyYW0gbmFtZT0idCIgLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQ29uc3VtZU5vZGUob2JqZWN0IHQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRoZSB0cmVlIHBhcnNlciBsb29rZWRhaGVhZC4gIElmIHRoZSB0eXBlIGlzIFVQIG9yIERPV04sCisgICAgICAgICAqICB0aGVuIHRoZSBJRCBpcyBub3QgcmVhbGx5IG1lYW5pbmdmdWwgYXMgaXQncyBmaXhlZC0tdGhlcmUgaXMKKyAgICAgICAgICogIGp1c3Qgb25lIFVQIG5vZGUgYW5kIG9uZSBET1dOIG5hdmlnYXRpb24gbm9kZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgTFQoaW50IGksIG9iamVjdCB0KTsKKworICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICAjcmVnaW9uIEFTVCBFdmVudHMKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIG5pbCB3YXMgY3JlYXRlZCAoZXZlbiBuaWwgbm9kZXMgaGF2ZSBhIHVuaXF1ZSBJRC4uLgorICAgICAgICAgKiAgdGhleSBhcmUgbm90ICJudWxsIiBwZXIgc2UpLiAgQXMgb2YgNC8yOC8yMDA2LCB0aGlzCisgICAgICAgICAqICBzZWVtcyB0byBiZSB1bmlxdWVseSB0cmlnZ2VyZWQgd2hlbiBzdGFydGluZyBhIG5ldyBzdWJ0cmVlCisgICAgICAgICAqICBzdWNoIGFzIHdoZW4gZW50ZXJpbmcgYSBzdWJydWxlIGluIGF1dG9tYXRpYyBtb2RlIGFuZCB3aGVuCisgICAgICAgICAqICBidWlsZGluZyBhIHRyZWUgaW4gcmV3cml0ZSBtb2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgICAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHQuSUQgaXMgc2V0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBOaWxOb2RlKG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBVcG9uIHN5bnRheCBlcnJvciwgcmVjb2duaXplcnMgYnJhY2tldCB0aGUgZXJyb3Igd2l0aCBhbiBlcnJvciBub2RlCisgICAgICAgICAqICBpZiB0aGV5IGFyZSBidWlsZGluZyBBU1RzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHBhcmFtIG5hbWU9InQiLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRXJyb3JOb2RlKG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+QW5ub3VuY2UgYSBuZXcgbm9kZSBidWlsdCBmcm9tIHRva2VuIGVsZW1lbnRzIHN1Y2ggYXMgdHlwZSBldGMuLi48L3N1bW1hcnk+CisgICAgICAgICAqIAorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgICAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHQuSUQsIHR5cGUsIHRleHQgYXJlCisgICAgICAgICAqICBzZXQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IHQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Bbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gYW4gZXhpc3RpbmcgdG9rZW4uPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgICAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IG5vZGUuSUQgYW5kIHRva2VuLnRva2VuSW5kZXgKKyAgICAgICAgICogIGFyZSBzZXQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IG5vZGUsIElUb2tlbiB0b2tlbik7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk1ha2UgYSBub2RlIHRoZSBuZXcgcm9vdCBvZiBhbiBleGlzdGluZyByb290LiAgU2VlPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBOb3RlOiB0aGUgbmV3Um9vdElEIHBhcmFtZXRlciBpcyBwb3NzaWJseSBkaWZmZXJlbnQKKyAgICAgICAgICogIHRoYW4gdGhlIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBuZXdSb290IHBhcmFtZXRlci4KKyAgICAgICAgICogIEluIG91ciBjYXNlLCBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKKyAgICAgICAgICogIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBhbmQgbm90IHJvb3RfbiBvciB3aGF0ZXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogIFRoZSBsaXN0ZW5lciBzaG91bGQgYXNzdW1lIHRoYXQgdGhpcyBldmVudCBvY2N1cnMKKyAgICAgICAgICogIG9ubHkgd2hlbiB0aGUgY3VycmVudCBzdWJydWxlIChvciBydWxlKSBzdWJ0cmVlIGlzCisgICAgICAgICAqICBiZWluZyByZXNldCB0byBuZXdSb290SUQuCisgICAgICAgICAqIAorICAgICAgICAgKiAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAgICAgICAgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSBJRHMgYXJlIHNldC4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxzZWVhbHNvIGNyZWY9IkFudGxyLlJ1bnRpbWUuVHJlZS5UcmVlQWRhcHRvci5iZWNvbWVSb290KCkiLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQmVjb21lUm9vdChvYmplY3QgbmV3Um9vdCwgb2JqZWN0IG9sZFJvb3QpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5NYWtlIGNoaWxkSUQgYSBjaGlsZCBvZiByb290SUQuPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgICAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IElEcyBhcmUgc2V0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKgorICAgICAgICAgKiAgPHNlZWFsc28gY3JlZj0iQW50bHIuUnVudGltZS5UcmVlLlRyZWVBZGFwdG9yLmFkZENoaWxkKCkiLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQWRkQ2hpbGQob2JqZWN0IHJvb3QsIG9iamVjdCBjaGlsZCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCB0aGUgdG9rZW4gc3RhcnQvc3RvcCB0b2tlbiBpbmRleCBmb3IgYSBzdWJ0cmVlIHJvb3Qgb3Igbm9kZS48L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKyAgICAgICAgICogIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgdC5JRCBpcyBzZXQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFNldFRva2VuQm91bmRhcmllcyhvYmplY3QgdCwgaW50IHRva2VuU3RhcnRJbmRleCwgaW50IHRva2VuU3RvcEluZGV4KTsKKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvUGFyc2VUcmVlQnVpbGRlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1BhcnNlVHJlZUJ1aWxkZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExMjcwZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1BhcnNlVHJlZUJ1aWxkZXIuY3MKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcgeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIFBhcnNlVHJlZSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5QYXJzZVRyZWU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFRoaXMgcGFyc2VyIGxpc3RlbmVyIHRyYWNrcyBydWxlIGVudHJ5L2V4aXQgYW5kIHRva2VuIG1hdGNoZXMKKyAgICAgKiAgdG8gYnVpbGQgYSBzaW1wbGUgcGFyc2UgdHJlZSB1c2luZyBQYXJzZVRyZWUgbm9kZXMuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUGFyc2VUcmVlQnVpbGRlciA6IEJsYW5rRGVidWdFdmVudExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBFUFNJTE9OX1BBWUxPQUQgPSAiPGVwc2lsb24+IjsKKworICAgICAgICBTdGFjazxQYXJzZVRyZWU+IGNhbGxTdGFjayA9IG5ldyBTdGFjazxQYXJzZVRyZWU+KCk7CisgICAgICAgIExpc3Q8SVRva2VuPiBoaWRkZW5Ub2tlbnMgPSBuZXcgTGlzdDxJVG9rZW4+KCk7CisgICAgICAgIGludCBiYWNrdHJhY2tpbmcgPSAwOworCisgICAgICAgIHB1YmxpYyBQYXJzZVRyZWVCdWlsZGVyKHN0cmluZyBncmFtbWFyTmFtZSkgeworICAgICAgICAgICAgUGFyc2VUcmVlIHJvb3QgPSBDcmVhdGUoIjxncmFtbWFyICIgKyBncmFtbWFyTmFtZSArICI+Iik7CisgICAgICAgICAgICBjYWxsU3RhY2suUHVzaChyb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFBhcnNlVHJlZSBHZXRUcmVlKCkgeworICAgICAgICAgICAgdmFyIGVudW1lcmF0b3IgPSBjYWxsU3RhY2suR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgZW51bWVyYXRvci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIGVudW1lcmF0b3IuQ3VycmVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoYXQga2luZCBvZiBub2RlIHRvIGNyZWF0ZS4gIFlvdSBtaWdodCB3YW50IHRvIG92ZXJyaWRlCisgICAgICAgICAqICBzbyBJIGZhY3RvcmVkIG91dCBjcmVhdGlvbiBoZXJlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgUGFyc2VUcmVlIENyZWF0ZShvYmplY3QgcGF5bG9hZCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVRyZWUocGF5bG9hZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBQYXJzZVRyZWUgRXBzaWxvbk5vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKEVQU0lMT05fUEFZTE9BRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+QmFja3RyYWNraW5nIG9yIGN5Y2xpYyBERkEsIGRvbid0IHdhbnQgdG8gYWRkIG5vZGVzIHRvIHRyZWU8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVudGVyRGVjaXNpb24oaW50IGQsIGJvb2wgY291bGRCYWNrdHJhY2spIHsKKyAgICAgICAgICAgIGJhY2t0cmFja2luZysrOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEV4aXREZWNpc2lvbihpbnQgaSkgeworICAgICAgICAgICAgYmFja3RyYWNraW5nLS07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlclJ1bGUoc3RyaW5nIGZpbGVuYW1lLCBzdHJpbmcgcnVsZU5hbWUpIHsKKyAgICAgICAgICAgIGlmIChiYWNrdHJhY2tpbmcgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFBhcnNlVHJlZSBwYXJlbnRSdWxlTm9kZSA9IGNhbGxTdGFjay5QZWVrKCk7CisgICAgICAgICAgICBQYXJzZVRyZWUgcnVsZU5vZGUgPSBDcmVhdGUocnVsZU5hbWUpOworICAgICAgICAgICAgcGFyZW50UnVsZU5vZGUuQWRkQ2hpbGQocnVsZU5vZGUpOworICAgICAgICAgICAgY2FsbFN0YWNrLlB1c2gocnVsZU5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIGZpbGVuYW1lLCBzdHJpbmcgcnVsZU5hbWUpIHsKKyAgICAgICAgICAgIGlmIChiYWNrdHJhY2tpbmcgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFBhcnNlVHJlZSBydWxlTm9kZSA9IGNhbGxTdGFjay5QZWVrKCk7CisgICAgICAgICAgICBpZiAocnVsZU5vZGUuQ2hpbGRDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcnVsZU5vZGUuQWRkQ2hpbGQoRXBzaWxvbk5vZGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsU3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDb25zdW1lVG9rZW4oSVRva2VuIHRva2VuKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNraW5nID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBQYXJzZVRyZWUgcnVsZU5vZGUgPSBjYWxsU3RhY2suUGVlaygpOworICAgICAgICAgICAgUGFyc2VUcmVlIGVsZW1lbnROb2RlID0gQ3JlYXRlKHRva2VuKTsKKyAgICAgICAgICAgIGVsZW1lbnROb2RlLmhpZGRlblRva2VucyA9IHRoaXMuaGlkZGVuVG9rZW5zOworICAgICAgICAgICAgdGhpcy5oaWRkZW5Ub2tlbnMgPSBuZXcgTGlzdDxJVG9rZW4+KCk7CisgICAgICAgICAgICBydWxlTm9kZS5BZGRDaGlsZChlbGVtZW50Tm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDb25zdW1lSGlkZGVuVG9rZW4oSVRva2VuIHRva2VuKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNraW5nID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBoaWRkZW5Ub2tlbnMuQWRkKHRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChiYWNrdHJhY2tpbmcgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFBhcnNlVHJlZSBydWxlTm9kZSA9IGNhbGxTdGFjay5QZWVrKCk7CisgICAgICAgICAgICBQYXJzZVRyZWUgZXJyb3JOb2RlID0gQ3JlYXRlKGUpOworICAgICAgICAgICAgcnVsZU5vZGUuQWRkQ2hpbGQoZXJyb3JOb2RlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1Byb2ZpbGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvUHJvZmlsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0N2FkYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1Byb2ZpbGVyLmNzCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICogTm90ZSB0byBKTDogUmVwbGFjZWQgSGFzaHNldCB3aXRoIERpY3Rpb25hcnkuCisgKiAKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuRGVidWcuTWlzYzsKKworICAgIHVzaW5nIEFycmF5ID0gU3lzdGVtLkFycmF5OworICAgIHVzaW5nIENMU0NvbXBsaWFudEF0dHJpYnV0ZSA9IFN5c3RlbS5DTFNDb21wbGlhbnRBdHRyaWJ1dGU7CisgICAgdXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworICAgIHVzaW5nIERhdGVUaW1lID0gU3lzdGVtLkRhdGVUaW1lOworICAgIHVzaW5nIEVudmlyb25tZW50ID0gU3lzdGVtLkVudmlyb25tZW50OworICAgIHVzaW5nIE1hdGggPSBTeXN0ZW0uTWF0aDsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiA8c3VtbWFyeT5Vc2luZyB0aGUgZGVidWcgZXZlbnQgaW50ZXJmYWNlLCB0cmFjayB3aGF0IGlzIGhhcHBlbmluZyBpbiB0aGUgcGFyc2VyCisgICAgICogIGFuZCByZWNvcmQgc3RhdGlzdGljcyBhYm91dCB0aGUgcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUHJvZmlsZXIgOiBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIERhdGFTZXBhcmF0b3IgPSAiXHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0cmluZyBOZXdMaW5lID0gRW52aXJvbm1lbnQuTmV3TGluZTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBkdW1wID0gZmFsc2U7CisKKyAgICAgICAgLyoqIEJlY2F1c2UgSSBtYXkgY2hhbmdlIHRoZSBzdGF0cywgSSBuZWVkIHRvIHRyYWNrIHRoYXQgZm9yIGxhdGVyCisgICAgICAgICAqICBjb21wdXRhdGlvbnMgdG8gYmUgY29uc2lzdGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIFZlcnNpb24gPSAiMyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIFJ1bnRpbWVTdGF0c0ZpbGVuYW1lID0gInJ1bnRpbWUuc3RhdHMiOworCisgICAgICAgIC8qKiBBY2ssIHNob3VsZCBub3Qgc3RvcmUgcGFyc2VyOyBjYW4ndCBkbyByZW1vdGUgc3R1ZmYuICBXZWxsLCB3ZSBwYXNzCisgICAgICAgICAqICBpbnB1dCBzdHJlYW0gYXJvdW5kIHRvbyBzbyBJIGd1ZXNzIGl0J3Mgb2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRGVidWdQYXJzZXIgcGFyc2VyID0gbnVsbDsKKworICAgICAgICAvLyB3b3JraW5nIHZhcmlhYmxlcworCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQorICAgICAgICBwcm90ZWN0ZWQgaW50IHJ1bGVMZXZlbCA9IDA7CisgICAgICAgIC8vcHJvdGVjdGVkIGludCBkZWNpc2lvbkxldmVsID0gMDsKKyAgICAgICAgcHJvdGVjdGVkIElUb2tlbiBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb247CisgICAgICAgIHByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB1bmlxdWVSdWxlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8c3RyaW5nPiBjdXJyZW50R3JhbW1hckZpbGVOYW1lID0gbmV3IFN0YWNrPHN0cmluZz4oKTsKKyAgICAgICAgcHJvdGVjdGVkIFN0YWNrPHN0cmluZz4gY3VycmVudFJ1bGVOYW1lID0gbmV3IFN0YWNrPHN0cmluZz4oKTsKKyAgICAgICAgcHJvdGVjdGVkIFN0YWNrPGludD4gY3VycmVudExpbmUgPSBuZXcgU3RhY2s8aW50PigpOworICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8aW50PiBjdXJyZW50UG9zID0gbmV3IFN0YWNrPGludD4oKTsKKworICAgICAgICAvLyBWZWN0b3I8RGVjaXNpb25TdGF0cz4KKyAgICAgICAgLy9wcm90ZWN0ZWQgVmVjdG9yIGRlY2lzaW9ucyA9IG5ldyBWZWN0b3IoMjAwKTsgLy8gbmVlZCBzZXRTaXplCisgICAgICAgIHByb3RlY3RlZCBEb3VibGVLZXlNYXA8c3RyaW5nLCBpbnQsIERlY2lzaW9uRGVzY3JpcHRvcj4gZGVjaXNpb25zID0gbmV3IERvdWJsZUtleU1hcDxzdHJpbmcsIGludCwgRGVjaXNpb25EZXNjcmlwdG9yPigpOworCisgICAgICAgIC8vIFJlY29yZCBhIERlY2lzaW9uRGF0YSBmb3IgZWFjaCBkZWNpc2lvbiB3ZSBoaXQgd2hpbGUgcGFyc2luZworICAgICAgICBwcml2YXRlIExpc3Q8RGVjaXNpb25FdmVudD4gZGVjaXNpb25FdmVudHMgPSBuZXcgTGlzdDxEZWNpc2lvbkV2ZW50PigpOworICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8RGVjaXNpb25FdmVudD4gZGVjaXNpb25TdGFjayA9IG5ldyBTdGFjazxEZWNpc2lvbkV2ZW50PigpOworCisgICAgICAgIHByb3RlY3RlZCBpbnQgYmFja3RyYWNrRGVwdGg7CisKKyAgICAgICAgUHJvZmlsZVN0YXRzIHN0YXRzID0gbmV3IFByb2ZpbGVTdGF0cygpOworCisgICAgICAgIHB1YmxpYyBQcm9maWxlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQcm9maWxlcihEZWJ1Z1BhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW50ZXJSdWxlKHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudGVyUnVsZSAiK2dyYW1tYXJGaWxlTmFtZSsiOiIrcnVsZU5hbWUpOworICAgICAgICAgICAgcnVsZUxldmVsKys7CisgICAgICAgICAgICBzdGF0cy5udW1SdWxlSW52b2NhdGlvbnMrKzsKKyAgICAgICAgICAgIHVuaXF1ZVJ1bGVzW3J1bGVOYW1lXSA9IChncmFtbWFyRmlsZU5hbWUgKyAiOiIgKyBydWxlTmFtZSk7CisgICAgICAgICAgICBzdGF0cy5tYXhSdWxlSW52b2NhdGlvbkRlcHRoID0gTWF0aC5NYXgoc3RhdHMubWF4UnVsZUludm9jYXRpb25EZXB0aCwgcnVsZUxldmVsKTsKKyAgICAgICAgICAgIGN1cnJlbnRHcmFtbWFyRmlsZU5hbWUuUHVzaChncmFtbWFyRmlsZU5hbWUpOworICAgICAgICAgICAgY3VycmVudFJ1bGVOYW1lLlB1c2gocnVsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBydWxlTGV2ZWwtLTsKKyAgICAgICAgICAgIGN1cnJlbnRHcmFtbWFyRmlsZU5hbWUuUG9wKCk7CisgICAgICAgICAgICBjdXJyZW50UnVsZU5hbWUuUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogVHJhY2sgbWVtb2l6YXRpb247IHRoaXMgaXMgbm90IHBhcnQgb2Ygc3RhbmRhcmQgZGVidWcgaW50ZXJmYWNlCisgICAgICAgICAqICBidXQgaXMgdHJpZ2dlcmVkIGJ5IHByb2ZpbGluZy4gIENvZGUgZ2VuIGluc2VydHMgYW4gb3ZlcnJpZGUKKyAgICAgICAgICogIGZvciB0aGlzIG1ldGhvZCBpbiB0aGUgcmVjb2duaXplciwgd2hpY2ggdHJpZ2dlcnMgdGhpcyBtZXRob2QuCisgICAgICAgICAqICBDYWxsZWQgZnJvbSBhbHJlYWR5UGFyc2VkUnVsZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFeGFtaW5lUnVsZU1lbW9pemF0aW9uKElJbnRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcEluZGV4LCAvLyBpbmRleCBvciBNRU1PX1JVTEVfVU5LTk9XTi4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBydWxlTmFtZSkgeworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImV4YW1pbmUgbWVtbyAiICsgcnVsZU5hbWUgKyAiIGF0ICIgKyBpbnB1dC5JbmRleCArICI6ICIgKyBzdG9wSW5kZXgpOworICAgICAgICAgICAgaWYgKHN0b3BJbmRleCA9PSBCYXNlUmVjb2duaXplci5NZW1vUnVsZVVua25vd24pIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicnVsZSAiK3J1bGVJbmRleCsiIG1pc3NlZCBAICIraW5wdXQuaW5kZXgoKSk7CisgICAgICAgICAgICAgICAgc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZU1pc3NlcysrOworICAgICAgICAgICAgICAgIHN0YXRzLm51bUd1ZXNzaW5nUnVsZUludm9jYXRpb25zKys7IC8vIHdlJ2xsIGhhdmUgdG8gZW50ZXIKKyAgICAgICAgICAgICAgICBDdXJyZW50RGVjaXNpb24oKS5udW1NZW1vaXphdGlvbkNhY2hlTWlzc2VzKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgcnVsZSBzdWNjZXNzL2ZhaWx1cmUsIGlmIGluIGNhY2hlLCB3ZSBoYXZlIGEgY2FjaGUgaGl0CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgIitydWxlSW5kZXgrIiBoaXQgQCAiK2lucHV0LmluZGV4KCkpOworICAgICAgICAgICAgICAgIHN0YXRzLm51bU1lbW9pemF0aW9uQ2FjaGVIaXRzKys7CisgICAgICAgICAgICAgICAgQ3VycmVudERlY2lzaW9uKCkubnVtTWVtb2l6YXRpb25DYWNoZUhpdHMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBXYXJuaW5nOiBkb2Vzbid0IHRyYWNrIHN1Y2Nlc3MvZmFpbHVyZSwganVzdCB1bmlxdWUgcmVjb3JkaW5nIGV2ZW50ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWVtb2l6ZShJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydWxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bGVTdGFydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBydWxlTmFtZSkgeworICAgICAgICAgICAgLy8gY291bnQgaG93IG1hbnkgZW50cmllcyBnbyBpbnRvIHRhYmxlCisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibWVtb2l6ZSAiICsgcnVsZU5hbWUpOworICAgICAgICAgICAgc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZUVudHJpZXMrKzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExvY2F0aW9uKGludCBsaW5lLCBpbnQgcG9zKSB7CisgICAgICAgICAgICBjdXJyZW50TGluZS5QdXNoKGxpbmUpOworICAgICAgICAgICAgY3VycmVudFBvcy5QdXNoKHBvcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlckRlY2lzaW9uKGludCBkZWNpc2lvbk51bWJlciwgYm9vbCBjb3VsZEJhY2t0cmFjaykgeworICAgICAgICAgICAgbGFzdFJlYWxUb2tlblRvdWNoZWRJbkRlY2lzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIHN0YXRzLm51bURlY2lzaW9uRXZlbnRzKys7CisgICAgICAgICAgICBpbnQgc3RhcnRpbmdMb29rYWhlYWRJbmRleCA9IHBhcnNlci5Ub2tlblN0cmVhbS5JbmRleDsKKyAgICAgICAgICAgIElUb2tlblN0cmVhbSBpbnB1dCA9IHBhcnNlci5Ub2tlblN0cmVhbTsKKyAgICAgICAgICAgIGlmIChkdW1wKSB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImVudGVyRGVjaXNpb24gY2FuQmFja3RyYWNrPSIgKyBjb3VsZEJhY2t0cmFjayArICIgIiArIGRlY2lzaW9uTnVtYmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJhY2t0cmFjayBkZXB0aCAiICsgYmFja3RyYWNrRGVwdGggKworICAgICAgICAgICAgICAgICAgICAgICIgQCAiICsgaW5wdXQuR2V0KGlucHV0LkluZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAgIiBydWxlICIgKyBMb2NhdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIGcgPSBjdXJyZW50R3JhbW1hckZpbGVOYW1lLlBlZWsoKTsKKyAgICAgICAgICAgIERlY2lzaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVjaXNpb25zLkdldChnLCBkZWNpc2lvbk51bWJlcik7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBEZWNpc2lvbkRlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgICAgICBkZWNpc2lvbnMuUHV0KGcsIGRlY2lzaW9uTnVtYmVyLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmRlY2lzaW9uID0gZGVjaXNpb25OdW1iZXI7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlTmFtZSA9IGN1cnJlbnRHcmFtbWFyRmlsZU5hbWUuUGVlaygpOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucnVsZU5hbWUgPSBjdXJyZW50UnVsZU5hbWUuUGVlaygpOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubGluZSA9IGN1cnJlbnRMaW5lLlBlZWsoKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnBvcyA9IGN1cnJlbnRQb3MuUGVlaygpOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY291bGRCYWNrdHJhY2sgPSBjb3VsZEJhY2t0cmFjazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2NyaXB0b3IubisrOworCisgICAgICAgICAgICBEZWNpc2lvbkV2ZW50IGQgPSBuZXcgRGVjaXNpb25FdmVudCgpOworICAgICAgICAgICAgZGVjaXNpb25TdGFjay5QdXNoKGQpOworICAgICAgICAgICAgZC5kZWNpc2lvbiA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBkLnN0YXJ0VGltZSA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgIGQuc3RhcnRJbmRleCA9IHN0YXJ0aW5nTG9va2FoZWFkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFeGl0RGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBEZWNpc2lvbkV2ZW50IGQgPSBkZWNpc2lvblN0YWNrLlBvcCgpOworICAgICAgICAgICAgZC5zdG9wVGltZSA9IERhdGVUaW1lLk5vdzsKKworICAgICAgICAgICAgaW50IGxhc3RUb2tlbkluZGV4ID0gbGFzdFJlYWxUb2tlblRvdWNoZWRJbkRlY2lzaW9uLlRva2VuSW5kZXg7CisgICAgICAgICAgICBpbnQgbnVtSGlkZGVuID0gR2V0TnVtYmVyT2ZIaWRkZW5Ub2tlbnMoZC5zdGFydEluZGV4LCBsYXN0VG9rZW5JbmRleCk7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBsYXN0VG9rZW5JbmRleCAtIGQuc3RhcnRJbmRleCAtIG51bUhpZGRlbiArIDE7IC8vICsxIGNvdW50cyBjb25zdW1pbmcgc3RhcnQgdG9rZW4gYXMgMQorICAgICAgICAgICAgZC5rID0gZGVwdGg7CisgICAgICAgICAgICBkLmRlY2lzaW9uLm1heGsgPSBNYXRoLk1heChkLmRlY2lzaW9uLm1heGssIGRlcHRoKTsKKworICAgICAgICAgICAgaWYgKGR1bXApIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZXhpdERlY2lzaW9uICIgKyBkZWNpc2lvbk51bWJlciArICIgaW4gIiArIGQuZGVjaXNpb24ucnVsZU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvb2thaGVhZCAiICsgZC5rICsgIiBtYXggdG9rZW4gIiArIGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlY2lzaW9uRXZlbnRzLkFkZChkKTsgLy8gZG9uZSB3aXRoIGRlY2lzaW9uOyB0cmFjayBhbGwKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENvbnN1bWVUb2tlbihJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjb25zdW1lIHRva2VuICIgKyB0b2tlbik7CisKKyAgICAgICAgICAgIGlmICghSW5EZWNpc2lvbikgeworICAgICAgICAgICAgICAgIHN0YXRzLm51bVRva2VucysrOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbi5Ub2tlbkluZGV4IDwgdG9rZW4uVG9rZW5JbmRleCkgeworICAgICAgICAgICAgICAgIGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbiA9IHRva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVjaXNpb25FdmVudCBkID0gQ3VycmVudERlY2lzaW9uKCk7CisgICAgICAgICAgICAvLyBjb21wdXRlIGxvb2thaGVhZCBkZXB0aAorICAgICAgICAgICAgaW50IHRoaXNSZWZJbmRleCA9IHRva2VuLlRva2VuSW5kZXg7CisgICAgICAgICAgICBpbnQgbnVtSGlkZGVuID0gR2V0TnVtYmVyT2ZIaWRkZW5Ub2tlbnMoZC5zdGFydEluZGV4LCB0aGlzUmVmSW5kZXgpOworICAgICAgICAgICAgaW50IGRlcHRoID0gdGhpc1JlZkluZGV4IC0gZC5zdGFydEluZGV4IC0gbnVtSGlkZGVuICsgMTsgLy8gKzEgY291bnRzIGNvbnN1bWluZyBzdGFydCB0b2tlbiBhcyAxCisgICAgICAgICAgICAvL2QubWF4ayA9IE1hdGgubWF4KGQubWF4aywgZGVwdGgpOworICAgICAgICAgICAgaWYgKGR1bXApIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiY29uc3VtZSAiICsgdGhpc1JlZkluZGV4ICsgIiAiICsgZGVwdGggKyAiIHRva2VucyBhaGVhZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kZWNpc2lvbi5ydWxlTmFtZSArICItIiArIGQuZGVjaXNpb24uZGVjaXNpb24gKyAiIHN0YXJ0IGluZGV4ICIgKyBkLnN0YXJ0SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIFRoZSBwYXJzZXIgaXMgaW4gYSBkZWNpc2lvbiBpZiB0aGUgZGVjaXNpb24gZGVwdGggPiAwLiAgVGhpcworICAgICAgICAgKiAgd29ya3MgZm9yIGJhY2t0cmFja2luZyBhbHNvLCB3aGljaCBjYW4gaGF2ZSBuZXN0ZWQgZGVjaXNpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBJbkRlY2lzaW9uIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2lzaW9uU3RhY2suQ291bnQgPiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKElUb2tlbiB0b2tlbikgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWUgaGlkZGVuIHRva2VuICIrdG9rZW4pOworICAgICAgICAgICAgaWYgKCFJbkRlY2lzaW9uKQorICAgICAgICAgICAgICAgIHN0YXRzLm51bUhpZGRlblRva2VucysrOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFRyYWNrIHJlZnMgdG8gbG9va2FoZWFkIGlmIGluIGEgZml4ZWQvbm9uZml4ZWQgZGVjaXNpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMVChpbnQgaSwgSVRva2VuIHQpIHsKKyAgICAgICAgICAgIGlmIChJbkRlY2lzaW9uICYmIGkgPiAwKSB7CisgICAgICAgICAgICAgICAgRGVjaXNpb25FdmVudCBkID0gQ3VycmVudERlY2lzaW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGR1bXApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxUKCIgKyBpICsgIik9IiArIHQgKyAiIGluZGV4ICIgKyB0LlRva2VuSW5kZXggKyAiIHJlbGF0aXZlIHRvICIgKyBkLmRlY2lzaW9uLnJ1bGVOYW1lICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kZWNpc2lvbi5kZWNpc2lvbiArICIgc3RhcnQgaW5kZXggIiArIGQuc3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24uVG9rZW5JbmRleCA8IHQuVG9rZW5JbmRleCkgeworICAgICAgICAgICAgICAgICAgICBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24gPSB0OworICAgICAgICAgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzZXQgbGFzdCB0b2tlbiAiICsgbGFzdFJlYWxUb2tlblRvdWNoZWRJbkRlY2lzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZ2V0IHN0YXJ0aW5nIGluZGV4IG9mZiBzdGFjaworICAgICAgICAgICAgICAgIC8vCQkJaW50IHN0YWNrVG9wID0gbG9va2FoZWFkU3RhY2suc2l6ZSgpLTE7CisgICAgICAgICAgICAgICAgLy8JCQlJbnRlZ2VyIHN0YXJ0aW5nSW5kZXggPSAoSW50ZWdlcilsb29rYWhlYWRTdGFjay5nZXQoc3RhY2tUb3ApOworICAgICAgICAgICAgICAgIC8vCQkJLy8gY29tcHV0ZSBsb29rYWhlYWQgZGVwdGgKKyAgICAgICAgICAgICAgICAvLwkJCWludCB0aGlzUmVmSW5kZXggPSBwYXJzZXIuZ2V0VG9rZW5TdHJlYW0oKS5pbmRleCgpOworICAgICAgICAgICAgICAgIC8vCQkJaW50IG51bUhpZGRlbiA9CisgICAgICAgICAgICAgICAgLy8JCQkJZ2V0TnVtYmVyT2ZIaWRkZW5Ub2tlbnMoc3RhcnRpbmdJbmRleC5pbnRWYWx1ZSgpLCB0aGlzUmVmSW5kZXgpOworICAgICAgICAgICAgICAgIC8vCQkJaW50IGRlcHRoID0gaSArIHRoaXNSZWZJbmRleCAtIHN0YXJ0aW5nSW5kZXguaW50VmFsdWUoKSAtIG51bUhpZGRlbjsKKyAgICAgICAgICAgICAgICAvLwkJCS8qCisgICAgICAgICAgICAgICAgLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxUKCIraSsiKSBAIGluZGV4ICIrdGhpc1JlZkluZGV4KyIgaXMgZGVwdGggIitkZXB0aCsKKyAgICAgICAgICAgICAgICAvLwkJCQkiIG1heCBpcyAiK21heExvb2thaGVhZEluQ3VycmVudERlY2lzaW9uKTsKKyAgICAgICAgICAgICAgICAvLwkJCSovCisgICAgICAgICAgICAgICAgLy8JCQlpZiAoIGRlcHRoPm1heExvb2thaGVhZEluQ3VycmVudERlY2lzaW9uICkgeworICAgICAgICAgICAgICAgIC8vCQkJCW1heExvb2thaGVhZEluQ3VycmVudERlY2lzaW9uID0gZGVwdGg7CisgICAgICAgICAgICAgICAgLy8JCQl9CisgICAgICAgICAgICAgICAgLy8JCQlkLm1heGsgPSBjdXJyZW50RGVjaXNpb24oKS8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBUcmFjayBiYWNrdHJhY2tpbmcgZGVjaXNpb25zLiAgWW91J2xsIHNlZSBhIGZpeGVkIG9yIGN5Y2xpYyBkZWNpc2lvbgorICAgICAgICAgKiAgYW5kIHRoZW4gYSBiYWNrdHJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIAkJZW50ZXIgcnVsZQorICAgICAgICAgKiAJCS4uLgorICAgICAgICAgKiAJCWVudGVyIGRlY2lzaW9uCisgICAgICAgICAqIAkJTEEgYW5kIHBvc3NpYmx5IGNvbnN1bWVzIChmb3IgY3ljbGljIERGQXMpCisgICAgICAgICAqIAkJYmVnaW4gYmFja3RyYWNrIGxldmVsCisgICAgICAgICAqIAkJbWFyayBtCisgICAgICAgICAqIAkJcmV3aW5kIG0KKyAgICAgICAgICogCQllbmQgYmFja3RyYWNrIGxldmVsLCBzdWNjZXNzCisgICAgICAgICAqIAkJZXhpdCBkZWNpc2lvbgorICAgICAgICAgKiAJCS4uLgorICAgICAgICAgKiAJCWV4aXQgcnVsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQmVnaW5CYWNrdHJhY2soaW50IGxldmVsKSB7CisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZW50ZXIgYmFja3RyYWNrICIgKyBsZXZlbCk7CisgICAgICAgICAgICBiYWNrdHJhY2tEZXB0aCsrOworICAgICAgICAgICAgRGVjaXNpb25FdmVudCBlID0gQ3VycmVudERlY2lzaW9uKCk7CisgICAgICAgICAgICBpZiAoZS5kZWNpc2lvbi5jb3VsZEJhY2t0cmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRzLm51bUJhY2t0cmFja09jY3VycmVuY2VzKys7CisgICAgICAgICAgICAgICAgZS5kZWNpc2lvbi5udW1CYWNrdHJhY2tPY2N1cnJlbmNlcysrOworICAgICAgICAgICAgICAgIGUuYmFja3RyYWNrcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogU3VjY2Vzc2Z1bCBvciBub3QsIHRyYWNrIGhvdyBtdWNoIGxvb2thaGVhZCBzeW5wcmVkcyB1c2UgKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKSB7CisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZXhpdCBiYWNrdHJhY2sgIiArIGxldmVsICsgIjogIiArIHN1Y2Nlc3NmdWwpOworICAgICAgICAgICAgYmFja3RyYWNrRGVwdGgtLTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE1hcmsoaW50IGkpIHsKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtYXJrICIgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJld2luZChpbnQgaSkgeworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInJld2luZCAiICsgaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXdpbmQoKSB7CisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicmV3aW5kIik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBEZWNpc2lvbkV2ZW50IEN1cnJlbnREZWNpc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWNpc2lvblN0YWNrLlBlZWsoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHN0YXRzLm51bVJlcG9ydGVkRXJyb3JzKys7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZW1hbnRpY1ByZWRpY2F0ZShib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSkgeworICAgICAgICAgICAgc3RhdHMubnVtU2VtYW50aWNQcmVkaWNhdGVzKys7CisgICAgICAgICAgICBpZiAoSW5EZWNpc2lvbikgeworICAgICAgICAgICAgICAgIERlY2lzaW9uRXZlbnQgZCA9IEN1cnJlbnREZWNpc2lvbigpOworICAgICAgICAgICAgICAgIGQuZXZhbFNlbVByZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGQuZGVjaXNpb24ubnVtU2VtUHJlZEV2YWxzKys7CisgICAgICAgICAgICAgICAgaWYgKGR1bXApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImV2YWwgIiArIHByZWRpY2F0ZSArICIgaW4gIiArIGQuZGVjaXNpb24ucnVsZU5hbWUgKyAiLSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kZWNpc2lvbi5kZWNpc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVGVybWluYXRlKCkgeworICAgICAgICAgICAgZm9yZWFjaCAoRGVjaXNpb25FdmVudCBlIGluIGRlY2lzaW9uRXZlbnRzKSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImRlY2lzaW9uICIrZS5kZWNpc2lvbi5kZWNpc2lvbisiOiBrPSIrZS5rKTsKKyAgICAgICAgICAgICAgICBlLmRlY2lzaW9uLmF2Z2sgKz0gZS5rOworICAgICAgICAgICAgICAgIHN0YXRzLmF2Z2tQZXJEZWNpc2lvbkV2ZW50ICs9IGUuazsKKyAgICAgICAgICAgICAgICBpZiAoZS5iYWNrdHJhY2tzKSB7IC8vIGRvZXNuJ3QgY291bnQgZ2F0ZWQgc3luIHByZWRzIG9uIERGQSBlZGdlcworICAgICAgICAgICAgICAgICAgICBzdGF0cy5hdmdrUGVyQmFja3RyYWNraW5nRGVjaXNpb25FdmVudCArPSBlLms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHMuYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3MgPSAwLjBmOworICAgICAgICAgICAgZm9yZWFjaCAoRGVjaXNpb25EZXNjcmlwdG9yIGQgaW4gZGVjaXNpb25zLlZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgc3RhdHMubnVtRGVjaXNpb25zQ292ZXJlZCsrOworICAgICAgICAgICAgICAgIGQuYXZnayAvPSAoZmxvYXQpZC5uOworICAgICAgICAgICAgICAgIGlmIChkLmNvdWxkQmFja3RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLm51bURlY2lzaW9uc1RoYXRQb3RlbnRpYWxseUJhY2t0cmFjaysrOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBwZXJjZW50QmFja3RyYWNrcyA9IGQubnVtQmFja3RyYWNrT2NjdXJyZW5jZXMgLyAoZmxvYXQpZC5uOworICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZGVjICIrZC5kZWNpc2lvbisiIGJhY2t0cmFja3MgIitwZXJjZW50QmFja3RyYWNrcyoxMDArIiUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3MgKz0gcGVyY2VudEJhY2t0cmFja3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBydWxlcyB0aGF0IGJhY2t0cmFjayBhbG9uZyBnYXRlZCBERkEgZWRnZXMKKyAgICAgICAgICAgICAgICBpZiAoZC5udW1CYWNrdHJhY2tPY2N1cnJlbmNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMubnVtRGVjaXNpb25zVGhhdERvQmFja3RyYWNrKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHMuYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3MgLz0gc3RhdHMubnVtRGVjaXNpb25zVGhhdFBvdGVudGlhbGx5QmFja3RyYWNrOworICAgICAgICAgICAgc3RhdHMuYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3MgKj0gMTAwOyAvLyBpdCdzIGEgcGVyY2VudGFnZQorICAgICAgICAgICAgc3RhdHMuYXZna1BlckRlY2lzaW9uRXZlbnQgLz0gc3RhdHMubnVtRGVjaXNpb25FdmVudHM7CisgICAgICAgICAgICBzdGF0cy5hdmdrUGVyQmFja3RyYWNraW5nRGVjaXNpb25FdmVudCAvPSAoZmxvYXQpc3RhdHMubnVtQmFja3RyYWNrT2NjdXJyZW5jZXM7CisKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKFRvU3RyaW5nKCkpOworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoR2V0RGVjaXNpb25TdGF0c0R1bXAoKSk7CisKKyAgICAgICAgICAgIC8vCQlTdHJpbmcgc3RhdHMgPSB0b05vdGlmeVN0cmluZygpOworICAgICAgICAgICAgLy8JCXRyeSB7CisgICAgICAgICAgICAvLwkJCVN0YXRzLndyaXRlUmVwb3J0KFJVTlRJTUVfU1RBVFNfRklMRU5BTUUsc3RhdHMpOworICAgICAgICAgICAgLy8JCX0KKyAgICAgICAgICAgIC8vCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAvLwkJCVN5c3RlbS5lcnIucHJpbnRsbihpb2UpOworICAgICAgICAgICAgLy8JCQlpb2UucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgLy8JCX0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0UGFyc2VyKERlYnVnUGFyc2VyIHBhcnNlcikgeworICAgICAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBSIEUgUCBPIFIgVCBJIE4gRworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb05vdGlmeVN0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoVmVyc2lvbik7CisgICAgICAgICAgICBidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgYnVmLkFwcGVuZChwYXJzZXIuR2V0VHlwZSgpLk5hbWUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1SdWxlSW52b2NhdGlvbnMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChtYXhSdWxlSW52b2NhdGlvbkRlcHRoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobnVtRml4ZWREZWNpc2lvbnMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5taW4oZGVjaXNpb25NYXhGaXhlZExvb2thaGVhZHMpKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoU3RhdHMubWF4KGRlY2lzaW9uTWF4Rml4ZWRMb29rYWhlYWRzKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLmF2ZyhkZWNpc2lvbk1heEZpeGVkTG9va2FoZWFkcykpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5zdGRkZXYoZGVjaXNpb25NYXhGaXhlZExvb2thaGVhZHMpKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobnVtQ3ljbGljRGVjaXNpb25zKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoU3RhdHMubWluKGRlY2lzaW9uTWF4Q3ljbGljTG9va2FoZWFkcykpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5tYXgoZGVjaXNpb25NYXhDeWNsaWNMb29rYWhlYWRzKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLmF2ZyhkZWNpc2lvbk1heEN5Y2xpY0xvb2thaGVhZHMpKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoU3RhdHMuc3RkZGV2KGRlY2lzaW9uTWF4Q3ljbGljTG9va2FoZWFkcykpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1CYWNrdHJhY2tEZWNpc2lvbnMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5taW4odG9BcnJheShkZWNpc2lvbk1heFN5blByZWRMb29rYWhlYWRzKSkpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5tYXgodG9BcnJheShkZWNpc2lvbk1heFN5blByZWRMb29rYWhlYWRzKSkpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5hdmcodG9BcnJheShkZWNpc2lvbk1heFN5blByZWRMb29rYWhlYWRzKSkpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5zdGRkZXYodG9BcnJheShkZWNpc2lvbk1heFN5blByZWRMb29rYWhlYWRzKSkpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1TZW1hbnRpY1ByZWRpY2F0ZXMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChwYXJzZXIuZ2V0VG9rZW5TdHJlYW0oKS5zaXplKCkpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1IaWRkZW5Ub2tlbnMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1DaGFyc01hdGNoZWQpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1IaWRkZW5DaGFyc01hdGNoZWQpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1iZXJSZXBvcnRlZEVycm9ycyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bU1lbW9pemF0aW9uQ2FjaGVIaXRzKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobnVtTWVtb2l6YXRpb25DYWNoZU1pc3Nlcyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bUd1ZXNzaW5nUnVsZUludm9jYXRpb25zKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobnVtTWVtb2l6YXRpb25DYWNoZUVudHJpZXMpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyhHZXRSZXBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBQcm9maWxlU3RhdHMgR2V0UmVwb3J0KCkgeworICAgICAgICAgICAgLy9JVG9rZW5TdHJlYW0gaW5wdXQgPSBwYXJzZXIuVG9rZW5TdHJlYW07CisgICAgICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuQ291bnQgJiYgbGFzdFJlYWxUb2tlblRvdWNoZWRJbkRlY2lzaW9uICE9IG51bGwgJiYgaSA8PSBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24uVG9rZW5JbmRleDsgaSsrKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICBJVG9rZW4gdCA9IGlucHV0LkdldChpKTsKKyAgICAgICAgICAgIC8vICAgIGlmICh0LkNoYW5uZWwgIT0gVG9rZW5DaGFubmVscy5EZWZhdWx0KQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHN0YXRzLm51bUhpZGRlblRva2VucysrOworICAgICAgICAgICAgLy8gICAgICAgIHN0YXRzLm51bUhpZGRlbkNoYXJzTWF0Y2hlZCArPSB0LlRleHQuTGVuZ3RoOworICAgICAgICAgICAgLy8gICAgfQorICAgICAgICAgICAgLy99CisgICAgICAgICAgICBzdGF0cy5WZXJzaW9uID0gVmVyc2lvbjsKKyAgICAgICAgICAgIHN0YXRzLm5hbWUgPSBwYXJzZXIuR2V0VHlwZSgpLk5hbWU7CisgICAgICAgICAgICBzdGF0cy5udW1VbmlxdWVSdWxlc0ludm9rZWQgPSB1bmlxdWVSdWxlcy5Db3VudDsKKyAgICAgICAgICAgIC8vc3RhdHMubnVtQ2hhcnNNYXRjaGVkID0gbGFzdFRva2VuQ29uc3VtZWQuZ2V0U3RvcEluZGV4KCkgKyAxOworICAgICAgICAgICAgcmV0dXJuIHN0YXRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgRG91YmxlS2V5TWFwPHN0cmluZywgaW50LCBEZWNpc2lvbkRlc2NyaXB0b3I+IEdldERlY2lzaW9uU3RhdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVjaXNpb25zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgUmVhZE9ubHlDb2xsZWN0aW9uPERlY2lzaW9uRXZlbnQ+IERlY2lzaW9uRXZlbnRzIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2lzaW9uRXZlbnRzLkFzUmVhZE9ubHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRvU3RyaW5nKFByb2ZpbGVTdGF0cyBzdGF0cykgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiQU5UTFIgUnVudGltZSBSZXBvcnQ7IFByb2ZpbGUgVmVyc2lvbiAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMuVmVyc2lvbik7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgicGFyc2VyIG5hbWUgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm5hbWUpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIk51bWJlciBvZiBydWxlIGludm9jYXRpb25zICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1SdWxlSW52b2NhdGlvbnMpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIk51bWJlciBvZiB1bmlxdWUgcnVsZXMgdmlzaXRlZCAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMubnVtVW5pcXVlUnVsZXNJbnZva2VkKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTmV3TGluZSk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJOdW1iZXIgb2YgZGVjaXNpb24gZXZlbnRzICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1EZWNpc2lvbkV2ZW50cyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiTnVtYmVyIG9mIHJ1bGUgaW52b2NhdGlvbnMgd2hpbGUgYmFja3RyYWNraW5nICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1HdWVzc2luZ1J1bGVJbnZvY2F0aW9ucyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibWF4IHJ1bGUgaW52b2NhdGlvbiBuZXN0aW5nIGRlcHRoICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5tYXhSdWxlSW52b2NhdGlvbkRlcHRoKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTmV3TGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibnVtYmVyIG9mIGZpeGVkIGxvb2thaGVhZCBkZWNpc2lvbnMgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWluIGxvb2thaGVhZCB1c2VkIGluIGEgZml4ZWQgbG9va2FoZWFkIGRlY2lzaW9uICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoIm1heCBsb29rYWhlYWQgdXNlZCBpbiBhIGZpeGVkIGxvb2thaGVhZCBkZWNpc2lvbiAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJhdmVyYWdlIGxvb2thaGVhZCBkZXB0aCB1c2VkIGluIGZpeGVkIGxvb2thaGVhZCBkZWNpc2lvbnMgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgic3RhbmRhcmQgZGV2aWF0aW9uIG9mIGRlcHRoIHVzZWQgaW4gZml4ZWQgbG9va2FoZWFkIGRlY2lzaW9ucyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJudW1iZXIgb2YgYXJiaXRyYXJ5IGxvb2thaGVhZCBkZWNpc2lvbnMgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWluIGxvb2thaGVhZCB1c2VkIGluIGFuIGFyYml0cmFyeSBsb29rYWhlYWQgZGVjaXNpb24gIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWF4IGxvb2thaGVhZCB1c2VkIGluIGFuIGFyYml0cmFyeSBsb29rYWhlYWQgZGVjaXNpb24gIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgiYXZlcmFnZSBsb29rYWhlYWQgZGVwdGggdXNlZCBpbiBhcmJpdHJhcnkgbG9va2FoZWFkIGRlY2lzaW9ucyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGVwdGggdXNlZCBpbiBhcmJpdHJhcnkgbG9va2FoZWFkIGRlY2lzaW9ucyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJudW1iZXIgb2YgZXZhbHVhdGVkIHN5bnRhY3RpYyBwcmVkaWNhdGVzICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoIm1pbiBsb29rYWhlYWQgdXNlZCBpbiBhIHN5bnRhY3RpYyBwcmVkaWNhdGUgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWF4IGxvb2thaGVhZCB1c2VkIGluIGEgc3ludGFjdGljIHByZWRpY2F0ZSAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJhdmVyYWdlIGxvb2thaGVhZCBkZXB0aCB1c2VkIGluIHN5bnRhY3RpYyBwcmVkaWNhdGVzICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoInN0YW5kYXJkIGRldmlhdGlvbiBvZiBkZXB0aCB1c2VkIGluIHN5bnRhY3RpYyBwcmVkaWNhdGVzICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgicnVsZSBtZW1vaXphdGlvbiBjYWNoZSBzaXplICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1NZW1vaXphdGlvbkNhY2hlRW50cmllcyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIHJ1bGUgbWVtb2l6YXRpb24gY2FjaGUgaGl0cyAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZUhpdHMpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm51bWJlciBvZiBydWxlIG1lbW9pemF0aW9uIGNhY2hlIG1pc3NlcyAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZU1pc3Nlcyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoIm51bWJlciBvZiBldmFsdWF0ZWQgc2VtYW50aWMgcHJlZGljYXRlcyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm51bWJlciBvZiB0b2tlbnMgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm51bVRva2Vucyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIGhpZGRlbiB0b2tlbnMgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm51bUhpZGRlblRva2Vucyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIGNoYXIgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm51bUNoYXJzTWF0Y2hlZCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIGhpZGRlbiBjaGFyICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1IaWRkZW5DaGFyc01hdGNoZWQpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm51bWJlciBvZiBzeW50YXggZXJyb3JzICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1SZXBvcnRlZEVycm9ycyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEdldERlY2lzaW9uU3RhdHNEdW1wKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibG9jYXRpb24iKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJuIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKERhdGFTZXBhcmF0b3IpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiYXZnayIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm1heGsiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJzeW5wcmVkIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKERhdGFTZXBhcmF0b3IpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgic2VtcHJlZCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoImNhbmJhY2t0cmFjayIpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBmaWxlTmFtZSBpbiBkZWNpc2lvbnMuS2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZCBpbiBkZWNpc2lvbnMuS2V5U2V0KGZpbGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBEZWNpc2lvbkRlc2NyaXB0b3IgcyA9IGRlY2lzaW9ucy5HZXQoZmlsZU5hbWUsIGQpOworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHMuZGVjaXNpb24pOworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCJAIik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTG9jYXRpb25EZXNjcmlwdGlvbihzLmZpbGVOYW1lLCBzLnJ1bGVOYW1lLCBzLmxpbmUsIHMucG9zKSk7IC8vIGRlY2lzaW9uIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKERhdGFTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHMubik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiezB9Iiwgcy5hdmdrKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQocy5tYXhrKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChzLm51bUJhY2t0cmFja09jY3VycmVuY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChzLm51bVNlbVByZWRFdmFscyk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQocy5jb3VsZEJhY2t0cmFjayA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTmV3TGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgaW50W10gVHJpbShpbnRbXSBYLCBpbnQgbikgeworICAgICAgICAgICAgaWYgKG4gPCBYLkxlbmd0aCkgeworICAgICAgICAgICAgICAgIGludFtdIHRyaW1tZWQgPSBuZXcgaW50W25dOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoWCwgMCwgdHJpbW1lZCwgMCwgbik7CisgICAgICAgICAgICAgICAgWCA9IHRyaW1tZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gWDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBHZXQgbnVtIGhpZGRlbiB0b2tlbnMgYmV0d2VlbiBpLi5qIGluY2x1c2l2ZSAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0TnVtYmVyT2ZIaWRkZW5Ub2tlbnMoaW50IGksIGludCBqKSB7CisgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICBJVG9rZW5TdHJlYW0gaW5wdXQgPSBwYXJzZXIuVG9rZW5TdHJlYW07CisgICAgICAgICAgICBmb3IgKGludCB0aSA9IGk7IHRpIDwgaW5wdXQuQ291bnQgJiYgdGkgPD0gajsgdGkrKykgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gaW5wdXQuR2V0KHRpKTsKKyAgICAgICAgICAgICAgICBpZiAodC5DaGFubmVsICE9IFRva2VuQ2hhbm5lbHMuRGVmYXVsdCkgeworICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgTG9jYXRpb25EZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBMb2NhdGlvbkRlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgIGN1cnJlbnRHcmFtbWFyRmlsZU5hbWUuUGVlaygpLAorICAgICAgICAgICAgICAgIGN1cnJlbnRSdWxlTmFtZS5QZWVrKCksCisgICAgICAgICAgICAgICAgY3VycmVudExpbmUuUGVlaygpLAorICAgICAgICAgICAgICAgIGN1cnJlbnRQb3MuUGVlaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHN0cmluZyBMb2NhdGlvbkRlc2NyaXB0aW9uKHN0cmluZyBmaWxlLCBzdHJpbmcgcnVsZSwgaW50IGxpbmUsIGludCBwb3MpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWxlICsgIjoiICsgbGluZSArICI6IiArIHBvcyArICIoIiArIHJ1bGUgKyAiKSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgUHJvZmlsZVN0YXRzIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgVmVyc2lvbjsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgbmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtUnVsZUludm9jYXRpb25zOworICAgICAgICAgICAgcHVibGljIGludCBudW1VbmlxdWVSdWxlc0ludm9rZWQ7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bURlY2lzaW9uRXZlbnRzOworICAgICAgICAgICAgcHVibGljIGludCBudW1EZWNpc2lvbnNDb3ZlcmVkOworICAgICAgICAgICAgcHVibGljIGludCBudW1EZWNpc2lvbnNUaGF0UG90ZW50aWFsbHlCYWNrdHJhY2s7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bURlY2lzaW9uc1RoYXREb0JhY2t0cmFjazsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbWF4UnVsZUludm9jYXRpb25EZXB0aDsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBhdmdrUGVyRGVjaXNpb25FdmVudDsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBhdmdrUGVyQmFja3RyYWNraW5nRGVjaXNpb25FdmVudDsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBhdmVyYWdlRGVjaXNpb25QZXJjZW50QmFja3RyYWNrczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtQmFja3RyYWNrT2NjdXJyZW5jZXM7IC8vIGRvZXNuJ3QgY291bnQgZ2F0ZWQgREZBIGVkZ2VzCisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtRml4ZWREZWNpc2lvbnM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG1pbkRlY2lzaW9uTWF4Rml4ZWRMb29rYWhlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBtYXhEZWNpc2lvbk1heEZpeGVkTG9va2FoZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYXZnRGVjaXNpb25NYXhGaXhlZExvb2thaGVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IHN0ZGRldkRlY2lzaW9uTWF4Rml4ZWRMb29rYWhlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBudW1DeWNsaWNEZWNpc2lvbnM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG1pbkRlY2lzaW9uTWF4Q3ljbGljTG9va2FoZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbWF4RGVjaXNpb25NYXhDeWNsaWNMb29rYWhlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBhdmdEZWNpc2lvbk1heEN5Y2xpY0xvb2thaGVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IHN0ZGRldkRlY2lzaW9uTWF4Q3ljbGljTG9va2FoZWFkczsKKyAgICAgICAgICAgIC8vCQlpbnQgU3RhdHMubWluKHRvQXJyYXkoZGVjaXNpb25NYXhTeW5QcmVkTG9va2FoZWFkcyk7CisgICAgICAgICAgICAvLwkJaW50IFN0YXRzLm1heCh0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpOworICAgICAgICAgICAgLy8JCWludCBTdGF0cy5hdmcodG9BcnJheShkZWNpc2lvbk1heFN5blByZWRMb29rYWhlYWRzKTsKKyAgICAgICAgICAgIC8vCQlpbnQgU3RhdHMuc3RkZGV2KHRvQXJyYXkoZGVjaXNpb25NYXhTeW5QcmVkTG9va2FoZWFkcyk7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bVNlbWFudGljUHJlZGljYXRlczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtVG9rZW5zOworICAgICAgICAgICAgcHVibGljIGludCBudW1IaWRkZW5Ub2tlbnM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUNoYXJzTWF0Y2hlZDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtSGlkZGVuQ2hhcnNNYXRjaGVkOworICAgICAgICAgICAgcHVibGljIGludCBudW1SZXBvcnRlZEVycm9yczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtTWVtb2l6YXRpb25DYWNoZUhpdHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bU1lbW9pemF0aW9uQ2FjaGVNaXNzZXM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUd1ZXNzaW5nUnVsZUludm9jYXRpb25zOworICAgICAgICAgICAgcHVibGljIGludCBudW1NZW1vaXphdGlvbkNhY2hlRW50cmllczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBEZWNpc2lvbkRlc2NyaXB0b3IgeworICAgICAgICAgICAgcHVibGljIGludCBkZWNpc2lvbjsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgZmlsZU5hbWU7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHJ1bGVOYW1lOworICAgICAgICAgICAgcHVibGljIGludCBsaW5lOworICAgICAgICAgICAgcHVibGljIGludCBwb3M7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBjb3VsZEJhY2t0cmFjazsKKworICAgICAgICAgICAgcHVibGljIGludCBuOworICAgICAgICAgICAgcHVibGljIGZsb2F0IGF2Z2s7IC8vIGF2ZyBhY3Jvc3MgYWxsIGRlY2lzaW9uIGV2ZW50cworICAgICAgICAgICAgcHVibGljIGludCBtYXhrOworICAgICAgICAgICAgcHVibGljIGludCBudW1CYWNrdHJhY2tPY2N1cnJlbmNlczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtU2VtUHJlZEV2YWxzOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWxsIGFib3V0IGEgc3BlY2lmaWMgZXhlYyBvZiBhIHNpbmdsZSBkZWNpc2lvbgorICAgICAgICBwdWJsaWMgY2xhc3MgRGVjaXNpb25FdmVudCB7CisgICAgICAgICAgICBwdWJsaWMgRGVjaXNpb25EZXNjcmlwdG9yIGRlY2lzaW9uOworICAgICAgICAgICAgcHVibGljIGludCBzdGFydEluZGV4OworICAgICAgICAgICAgcHVibGljIGludCBrOworICAgICAgICAgICAgcHVibGljIGJvb2wgYmFja3RyYWNrczsgLy8gZG9lc24ndCBjb3VudCBnYXRlZCBERkEgZWRnZXMKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGV2YWxTZW1QcmVkOworICAgICAgICAgICAgcHVibGljIERhdGVUaW1lIHN0YXJ0VGltZTsKKyAgICAgICAgICAgIHB1YmxpYyBEYXRlVGltZSBzdG9wVGltZTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtTWVtb2l6YXRpb25DYWNoZUhpdHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bU1lbW9pemF0aW9uQ2FjaGVNaXNzZXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMmMxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1JlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDU4OCBAQAorLyoKKyAqIE5vdGUgdG8gSkw6IFJlZmFjdG9yZWQgZXh0ZW5zaW9uIG1ldGhvZHMKKyAqIAorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnIHsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zOworICAgIHVzaW5nIEJhc2VUcmVlID0gQW50bHIuUnVudGltZS5UcmVlLkJhc2VUcmVlOworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIElPRXhjZXB0aW9uID0gU3lzdGVtLklPLklPRXhjZXB0aW9uOworICAgIHVzaW5nIElUcmVlID0gQW50bHIuUnVudGltZS5UcmVlLklUcmVlOworICAgIHVzaW5nIFNvY2tldCA9IFN5c3RlbS5OZXQuU29ja2V0cy5Tb2NrZXQ7CisgICAgdXNpbmcgU29ja2V0RXhjZXB0aW9uID0gU3lzdGVtLk5ldC5Tb2NrZXRzLlNvY2tldEV4Y2VwdGlvbjsKKyAgICB1c2luZyBUZXh0UmVhZGVyID0gU3lzdGVtLklPLlRleHRSZWFkZXI7CisgICAgdXNpbmcgVGV4dFdyaXRlciA9IFN5c3RlbS5JTy5UZXh0V3JpdGVyOworCisgICAgcHVibGljIGNsYXNzIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB7CisgICAgICAgIGNvbnN0IGludCBNQVhfRVZFTlRfRUxFTUVOVFMgPSA4OworICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyOworICAgICAgICBzdHJpbmcgbWFjaGluZTsKKyAgICAgICAgaW50IHBvcnQ7CisgICAgICAgIFNvY2tldCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgVGV4dFdyaXRlciBAb3V0OworICAgICAgICBUZXh0UmVhZGVyIEBpbjsKKyAgICAgICAgc3RyaW5nIEBldmVudDsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlZlcnNpb24gb2YgQU5UTFIgKGRpY3RhdGVzIGV2ZW50cyk8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBzdHJpbmcgdmVyc2lvbjsKKyAgICAgICAgcHVibGljIHN0cmluZyBncmFtbWFyRmlsZU5hbWU7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRyYWNrIHRoZSBsYXN0IHRva2VuIGluZGV4IHdlIHNhdyBkdXJpbmcgYSBjb25zdW1lLiAgSWYgc2FtZSwgdGhlbgorICAgICAgICAgKiAgc2V0IGEgZmxhZyB0aGF0IHdlIGhhdmUgYSBwcm9ibGVtLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgaW50IHByZXZpb3VzVG9rZW5JbmRleCA9IC0xOworICAgICAgICBib29sIHRva2VuSW5kZXhlc0ludmFsaWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgUHJveHlUb2tlbiA6IElUb2tlbiB7CisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBjaGFubmVsOworICAgICAgICAgICAgaW50IGxpbmU7CisgICAgICAgICAgICBpbnQgY2hhclBvczsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0OworICAgICAgICAgICAgcHVibGljIFByb3h5VG9rZW4oaW50IGluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIFByb3h5VG9rZW4oaW50IGluZGV4LCBpbnQgdHlwZSwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgaW50IGNoYXJQb3MsIHN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOworICAgICAgICAgICAgICAgIHRoaXMuY2hhclBvcyA9IGNoYXJQb3M7CisgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI3JlZ2lvbiBJVG9rZW4gTWVtYmVycworICAgICAgICAgICAgcHVibGljIHN0cmluZyBUZXh0IHsKKyAgICAgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBUeXBlIHsKKyAgICAgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBMaW5lIHsKKyAgICAgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBDaGFyUG9zaXRpb25JbkxpbmUgeworICAgICAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyUG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgICAgICBjaGFyUG9zID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IENoYW5uZWwgeworICAgICAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IFN0YXJ0SW5kZXggeworICAgICAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgU3RvcEluZGV4IHsKKyAgICAgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IFRva2VuSW5kZXggeworICAgICAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJQ2hhclN0cmVhbSBJbnB1dFN0cmVhbSB7CisgICAgICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbFN0ciA9ICIsY2hhbm5lbD0iICsgY2hhbm5lbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuICJbIiArIFRleHQgKyAiLzwiICsgdHlwZSArICI+IiArIGNoYW5uZWxTdHIgKyAiLCIgKyBsaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lICsgIixAIiArIGluZGV4ICsgIl0iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFByb3h5VHJlZSA6IEJhc2VUcmVlIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgSUQ7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCBsaW5lID0gMDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2hhclBvcyA9IC0xOworICAgICAgICAgICAgcHVibGljIGludCB0b2tlbkluZGV4ID0gLTE7CisgICAgICAgICAgICBzdHJpbmcgdGV4dDsKKworICAgICAgICAgICAgcHVibGljIFByb3h5VHJlZShpbnQgSUQsIGludCB0eXBlLCBpbnQgbGluZSwgaW50IGNoYXJQb3MsIGludCB0b2tlbkluZGV4LCBzdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgICAgIHRoaXMuSUQgPSBJRDsKKyAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFyUG9zID0gY2hhclBvczsKKyAgICAgICAgICAgICAgICB0aGlzLnRva2VuSW5kZXggPSB0b2tlbkluZGV4OworICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVRyZWUoaW50IElEKSB7CisgICAgICAgICAgICAgICAgdGhpcy5JRCA9IElEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVGV4dCB7CisgICAgICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUb2tlblN0YXJ0SW5kZXggeworICAgICAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVG9rZW5TdG9wSW5kZXggeworICAgICAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVHlwZSB7CisgICAgICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRyZWUgRHVwTm9kZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZpeCB0aGlzIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIoSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFjaGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCkgeworICAgICAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgdGhpcy5tYWNoaW5lID0gbWFjaGluZTsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisKKyAgICAgICAgICAgIGlmICghT3BlbkNvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRXZlbnRIYW5kbGVyKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBIYW5kc2hha2UoKTsKKyAgICAgICAgICAgICAgICBAZXZlbnQgPSBAaW4uUmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQGV2ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlzcGF0Y2goQGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgQWNrKCk7CisgICAgICAgICAgICAgICAgICAgIEBldmVudCA9IEBpbi5SZWFkTGluZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZSk7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoZSwgQ29uc29sZS5FcnJvcik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIENsb3NlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBPcGVuQ29ubmVjdGlvbigpIHsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgLy9jaGFubmVsID0gbmV3IFNvY2tldCggbWFjaGluZSwgcG9ydCApOworICAgICAgICAgICAgICAgIC8vY2hhbm5lbC5zZXRUY3BOb0RlbGF5KCB0cnVlICk7CisgICAgICAgICAgICAgICAgLy9PdXRwdXRTdHJlYW0gb3MgPSBjaGFubmVsLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIC8vT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG9zLCAiVVRGOCIgKTsKKyAgICAgICAgICAgICAgICAvL0BvdXQgPSBuZXcgUHJpbnRXcml0ZXIoIG5ldyBCdWZmZXJlZFdyaXRlciggb3N3ICkgKTsKKyAgICAgICAgICAgICAgICAvL0lucHV0U3RyZWFtIEBpcyA9IGNoYW5uZWwuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAvL0lucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggQGlzLCAiVVRGOCIgKTsKKyAgICAgICAgICAgICAgICAvL0BpbiA9IG5ldyBCdWZmZXJlZFJlYWRlciggaXNyICk7CisgICAgICAgICAgICAgICAgLy9zdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQ2xvc2VDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBAaW4uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBAaW4gPSBudWxsOworICAgICAgICAgICAgICAgIEBvdXQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBAb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjaGFubmVsLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGUpOworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkV4dGVuc2lvbnMuUHJpbnRTdGFja1RyYWNlKGUsIENvbnNvbGUuRXJyb3IpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoQGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBpbi5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGlvZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEBvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBAb3V0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZShpb2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEhhbmRzaGFrZSgpIHsKKyAgICAgICAgICAgIHN0cmluZyBhbnRsckxpbmUgPSBAaW4uUmVhZExpbmUoKTsKKyAgICAgICAgICAgIHN0cmluZ1tdIGFudGxyRWxlbWVudHMgPSBHZXRFdmVudEVsZW1lbnRzKGFudGxyTGluZSk7CisgICAgICAgICAgICB2ZXJzaW9uID0gYW50bHJFbGVtZW50c1sxXTsKKyAgICAgICAgICAgIHN0cmluZyBncmFtbWFyTGluZSA9IEBpbi5SZWFkTGluZSgpOworICAgICAgICAgICAgc3RyaW5nW10gZ3JhbW1hckVsZW1lbnRzID0gR2V0RXZlbnRFbGVtZW50cyhncmFtbWFyTGluZSk7CisgICAgICAgICAgICBncmFtbWFyRmlsZU5hbWUgPSBncmFtbWFyRWxlbWVudHNbMV07CisgICAgICAgICAgICBBY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLkNvbW1lbmNlKCk7IC8vIGluZm9ybSBsaXN0ZW5lciBhZnRlciBoYW5kc2hha2UKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQWNrKCkgeworICAgICAgICAgICAgQG91dC5Xcml0ZUxpbmUoImFjayIpOworICAgICAgICAgICAgQG91dC5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwYXRjaChzdHJpbmcgbGluZSkgeworICAgICAgICAgICAgLy9KU3lzdGVtLkBvdXQucHJpbnRsbiggImV2ZW50OiAiICsgbGluZSApOworICAgICAgICAgICAgc3RyaW5nW10gZWxlbWVudHMgPSBHZXRFdmVudEVsZW1lbnRzKGxpbmUpOworICAgICAgICAgICAgaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHNbMF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJ1bmtub3duIGRlYnVnIGV2ZW50OiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiZW50ZXJSdWxlIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FbnRlclJ1bGUoZWxlbWVudHNbMV0sIGVsZW1lbnRzWzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJleGl0UnVsZSIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRXhpdFJ1bGUoZWxlbWVudHNbMV0sIGVsZW1lbnRzWzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJlbnRlckFsdCIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJBbHQoaW50LlBhcnNlKGVsZW1lbnRzWzFdKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiZW50ZXJTdWJSdWxlIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FbnRlclN1YlJ1bGUoaW50LlBhcnNlKGVsZW1lbnRzWzFdKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiZXhpdFN1YlJ1bGUiKSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkV4aXRTdWJSdWxlKGludC5QYXJzZShlbGVtZW50c1sxXSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImVudGVyRGVjaXNpb24iKSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVudGVyRGVjaXNpb24oaW50LlBhcnNlKGVsZW1lbnRzWzFdKSwgZWxlbWVudHNbMl0uRXF1YWxzKCJ0cnVlIikpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImV4aXREZWNpc2lvbiIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRXhpdERlY2lzaW9uKGludC5QYXJzZShlbGVtZW50c1sxXSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImxvY2F0aW9uIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5Mb2NhdGlvbihpbnQuUGFyc2UoZWxlbWVudHNbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZShlbGVtZW50c1syXSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImNvbnN1bWVUb2tlbiIpKSB7CisgICAgICAgICAgICAgICAgUHJveHlUb2tlbiB0ID0gRGVzZXJpYWxpemVUb2tlbihlbGVtZW50cywgMSk7CisgICAgICAgICAgICAgICAgaWYgKHQuVG9rZW5JbmRleCA9PSBwcmV2aW91c1Rva2VuSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5JbmRleGVzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZpb3VzVG9rZW5JbmRleCA9IHQuVG9rZW5JbmRleDsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5Db25zdW1lVG9rZW4odCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiY29uc3VtZUhpZGRlblRva2VuIikpIHsKKyAgICAgICAgICAgICAgICBQcm94eVRva2VuIHQgPSBEZXNlcmlhbGl6ZVRva2VuKGVsZW1lbnRzLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAodC5Ub2tlbkluZGV4ID09IHByZXZpb3VzVG9rZW5JbmRleCkgeworICAgICAgICAgICAgICAgICAgICB0b2tlbkluZGV4ZXNJbnZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXNUb2tlbkluZGV4ID0gdC5Ub2tlbkluZGV4OworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkNvbnN1bWVIaWRkZW5Ub2tlbih0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJMVCIpKSB7CisgICAgICAgICAgICAgICAgSVRva2VuIHQgPSBEZXNlcmlhbGl6ZVRva2VuKGVsZW1lbnRzLCAyKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5MVChpbnQuUGFyc2UoZWxlbWVudHNbMV0pLCB0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJtYXJrIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5NYXJrKGludC5QYXJzZShlbGVtZW50c1sxXSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoInJld2luZCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzWzFdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuUmV3aW5kKGludC5QYXJzZShlbGVtZW50c1sxXSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLlJld2luZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJiZWdpbkJhY2t0cmFjayIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQmVnaW5CYWNrdHJhY2soaW50LlBhcnNlKGVsZW1lbnRzWzFdKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiZW5kQmFja3RyYWNrIikpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBpbnQuUGFyc2UoZWxlbWVudHNbMV0pOworICAgICAgICAgICAgICAgIGludCBzdWNjZXNzSSA9IGludC5QYXJzZShlbGVtZW50c1syXSk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW5kQmFja3RyYWNrKGxldmVsLCBzdWNjZXNzSSA9PSBEZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMuVHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiZXhjZXB0aW9uIikpIHsKKyNpZiB0cnVlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBzdHJpbmcgZXhjTmFtZSA9IGVsZW1lbnRzWzFdOworICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleFMgPSBlbGVtZW50c1syXTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbGluZVMgPSBlbGVtZW50c1szXTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcG9zUyA9IGVsZW1lbnRzWzRdOworICAgICAgICAgICAgICAgIENsYXNzIGV4Y0NsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4Y0NsYXNzID0gQ2xhc3MuZm9yTmFtZSggZXhjTmFtZSApOworICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChSZWNvZ25pdGlvbkV4Y2VwdGlvbilleGNDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBlLmluZGV4ID0gaW50LlBhcnNlKCBpbmRleFMgKTsKKyAgICAgICAgICAgICAgICAgICAgZS5saW5lID0gaW50LlBhcnNlKCBsaW5lUyApOworICAgICAgICAgICAgICAgICAgICBlLmNoYXJQb3NpdGlvbkluTGluZSA9IGludC5QYXJzZSggcG9zUyApOworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5yZWNvZ25pdGlvbkV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLnByaW50bG4oICJjYW4ndCBmaW5kIGNsYXNzICIgKyBjbmZlICk7CisgICAgICAgICAgICAgICAgICAgIGNuZmUucHJpbnRTdGFja1RyYWNlKCBDb25zb2xlLkVycm9yICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLnByaW50bG4oICJjYW4ndCBpbnN0YW50aWF0ZSBjbGFzcyAiICsgaWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWUucHJpbnRTdGFja1RyYWNlKCBDb25zb2xlLkVycm9yICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5wcmludGxuKCAiY2FuJ3QgYWNjZXNzIGNsYXNzICIgKyBpYWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWFlLnByaW50U3RhY2tUcmFjZSggQ29uc29sZS5FcnJvciApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImJlZ2luUmVzeW5jIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5CZWdpblJlc3luYygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImVuZFJlc3luYyIpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW5kUmVzeW5jKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygidGVybWluYXRlIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5UZXJtaW5hdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJzZW1hbnRpY1ByZWRpY2F0ZSIpKSB7CisgICAgICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBib29sLlBhcnNlKGVsZW1lbnRzWzFdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZGljYXRlVGV4dCA9IGVsZW1lbnRzWzJdOworICAgICAgICAgICAgICAgIHByZWRpY2F0ZVRleHQgPSBVbkVzY2FwZU5ld2xpbmVzKHByZWRpY2F0ZVRleHQpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlNlbWFudGljUHJlZGljYXRlKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGVUZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJjb25zdW1lTm9kZSIpKSB7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBEZXNlcmlhbGl6ZU5vZGUoZWxlbWVudHMsIDEpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkNvbnN1bWVOb2RlKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoIkxOIikpIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IGludC5QYXJzZShlbGVtZW50c1sxXSk7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBEZXNlcmlhbGl6ZU5vZGUoZWxlbWVudHMsIDIpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkxUKGksIG5vZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImNyZWF0ZU5vZGVGcm9tVG9rZW5FbGVtZW50cyIpKSB7CisgICAgICAgICAgICAgICAgaW50IElEID0gaW50LlBhcnNlKGVsZW1lbnRzWzFdKTsKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IGludC5QYXJzZShlbGVtZW50c1syXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBlbGVtZW50c1szXTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gVW5Fc2NhcGVOZXdsaW5lcyh0ZXh0KTsKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgbm9kZSA9IG5ldyBQcm94eVRyZWUoSUQsIHR5cGUsIC0xLCAtMSwgLTEsIHRleHQpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkNyZWF0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiY3JlYXRlTm9kZSIpKSB7CisgICAgICAgICAgICAgICAgaW50IElEID0gaW50LlBhcnNlKGVsZW1lbnRzWzFdKTsKKyAgICAgICAgICAgICAgICBpbnQgdG9rZW5JbmRleCA9IGludC5QYXJzZShlbGVtZW50c1syXSk7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGR1bW15IG5vZGUvdG9rZW4gZmlsbGVkIHdpdGggSUQsIHRva2VuSW5kZXgKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgbm9kZSA9IG5ldyBQcm94eVRyZWUoSUQpOworICAgICAgICAgICAgICAgIFByb3h5VG9rZW4gdG9rZW4gPSBuZXcgUHJveHlUb2tlbih0b2tlbkluZGV4KTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5DcmVhdGVOb2RlKG5vZGUsIHRva2VuKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJuaWxOb2RlIikpIHsKKyAgICAgICAgICAgICAgICBpbnQgSUQgPSBpbnQuUGFyc2UoZWxlbWVudHNbMV0pOworICAgICAgICAgICAgICAgIFByb3h5VHJlZSBub2RlID0gbmV3IFByb3h5VHJlZShJRCk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTmlsTm9kZShub2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJlcnJvck5vZGUiKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgYSBzcGVjaWFsIHRyZWUgaGVyZT8KKyAgICAgICAgICAgICAgICBpbnQgSUQgPSBpbnQuUGFyc2UoZWxlbWVudHNbMV0pOworICAgICAgICAgICAgICAgIGludCB0eXBlID0gaW50LlBhcnNlKGVsZW1lbnRzWzJdKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGVsZW1lbnRzWzNdOworICAgICAgICAgICAgICAgIHRleHQgPSBVbkVzY2FwZU5ld2xpbmVzKHRleHQpOworICAgICAgICAgICAgICAgIFByb3h5VHJlZSBub2RlID0gbmV3IFByb3h5VHJlZShJRCwgdHlwZSwgLTEsIC0xLCAtMSwgdGV4dCk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRXJyb3JOb2RlKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1swXS5FcXVhbHMoImJlY29tZVJvb3QiKSkgeworICAgICAgICAgICAgICAgIGludCBuZXdSb290SUQgPSBpbnQuUGFyc2UoZWxlbWVudHNbMV0pOworICAgICAgICAgICAgICAgIGludCBvbGRSb290SUQgPSBpbnQuUGFyc2UoZWxlbWVudHNbMl0pOworICAgICAgICAgICAgICAgIFByb3h5VHJlZSBuZXdSb290ID0gbmV3IFByb3h5VHJlZShuZXdSb290SUQpOworICAgICAgICAgICAgICAgIFByb3h5VHJlZSBvbGRSb290ID0gbmV3IFByb3h5VHJlZShvbGRSb290SUQpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzWzBdLkVxdWFscygiYWRkQ2hpbGQiKSkgeworICAgICAgICAgICAgICAgIGludCByb290SUQgPSBpbnQuUGFyc2UoZWxlbWVudHNbMV0pOworICAgICAgICAgICAgICAgIGludCBjaGlsZElEID0gaW50LlBhcnNlKGVsZW1lbnRzWzJdKTsKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgcm9vdCA9IG5ldyBQcm94eVRyZWUocm9vdElEKTsKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgY2hpbGQgPSBuZXcgUHJveHlUcmVlKGNoaWxkSUQpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkFkZENoaWxkKHJvb3QsIGNoaWxkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbMF0uRXF1YWxzKCJzZXRUb2tlbkJvdW5kYXJpZXMiKSkgeworICAgICAgICAgICAgICAgIGludCBJRCA9IGludC5QYXJzZShlbGVtZW50c1sxXSk7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBuZXcgUHJveHlUcmVlKElEKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5TZXRUb2tlbkJvdW5kYXJpZXMoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZShlbGVtZW50c1syXSksCisgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZShlbGVtZW50c1szXSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgidW5rbm93biBkZWJ1ZyBldmVudDogIiArIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgUHJveHlUcmVlIERlc2VyaWFsaXplTm9kZShzdHJpbmdbXSBlbGVtZW50cywgaW50IG9mZnNldCkgeworICAgICAgICAgICAgaW50IElEID0gaW50LlBhcnNlKGVsZW1lbnRzW29mZnNldCArIDBdKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gaW50LlBhcnNlKGVsZW1lbnRzW29mZnNldCArIDFdKTsKKyAgICAgICAgICAgIGludCB0b2tlbkxpbmUgPSBpbnQuUGFyc2UoZWxlbWVudHNbb2Zmc2V0ICsgMl0pOworICAgICAgICAgICAgaW50IGNoYXJQb3NpdGlvbkluTGluZSA9IGludC5QYXJzZShlbGVtZW50c1tvZmZzZXQgKyAzXSk7CisgICAgICAgICAgICBpbnQgdG9rZW5JbmRleCA9IGludC5QYXJzZShlbGVtZW50c1tvZmZzZXQgKyA0XSk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGVsZW1lbnRzW29mZnNldCArIDVdOworICAgICAgICAgICAgdGV4dCA9IFVuRXNjYXBlTmV3bGluZXModGV4dCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5VHJlZShJRCwgdHlwZSwgdG9rZW5MaW5lLCBjaGFyUG9zaXRpb25JbkxpbmUsIHRva2VuSW5kZXgsIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgUHJveHlUb2tlbiBEZXNlcmlhbGl6ZVRva2VuKHN0cmluZ1tdIGVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIHN0cmluZyBpbmRleFMgPSBlbGVtZW50c1tvZmZzZXQgKyAwXTsKKyAgICAgICAgICAgIHN0cmluZyB0eXBlUyA9IGVsZW1lbnRzW29mZnNldCArIDFdOworICAgICAgICAgICAgc3RyaW5nIGNoYW5uZWxTID0gZWxlbWVudHNbb2Zmc2V0ICsgMl07CisgICAgICAgICAgICBzdHJpbmcgbGluZVMgPSBlbGVtZW50c1tvZmZzZXQgKyAzXTsKKyAgICAgICAgICAgIHN0cmluZyBwb3NTID0gZWxlbWVudHNbb2Zmc2V0ICsgNF07CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGVsZW1lbnRzW29mZnNldCArIDVdOworICAgICAgICAgICAgdGV4dCA9IFVuRXNjYXBlTmV3bGluZXModGV4dCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBpbnQuUGFyc2UoaW5kZXhTKTsKKyAgICAgICAgICAgIFByb3h5VG9rZW4gdCA9CisgICAgICAgICAgICAgICAgbmV3IFByb3h5VG9rZW4oaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LlBhcnNlKHR5cGVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuUGFyc2UoY2hhbm5lbFMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZShsaW5lUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LlBhcnNlKHBvc1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q3JlYXRlIGEgdGhyZWFkIHRvIGxpc3RlbiB0byB0aGUgcmVtb3RlIHJ1bm5pbmcgcmVjb2duaXplcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTdGFydCgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkIHQgPSBuZXcgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQoUnVuKTsKKyAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUnVuKCkgeworICAgICAgICAgICAgRXZlbnRIYW5kbGVyKCk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIE1pc2MKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmdbXSBHZXRFdmVudEVsZW1lbnRzKHN0cmluZyBAZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChAZXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nW10gZWxlbWVudHMgPSBuZXcgc3RyaW5nW01BWF9FVkVOVF9FTEVNRU5UU107CisgICAgICAgICAgICBzdHJpbmcgc3RyID0gbnVsbDsgLy8gYSBzdHJpbmcgZWxlbWVudCBpZiBwcmVzZW50IChtdXN0IGJlIGxhc3QpCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBmaXJzdFF1b3RlSW5kZXggPSBAZXZlbnQuSW5kZXhPZignIicpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFF1b3RlSW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBzcGVjaWFsbHk7IGhhcyBhIHN0cmluZyBhcmd1bWVudCBsaWtlICJhIGNvbW1lbnRcbgorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIGJ5IFxuIG5vdCBlbmQgcXVvdGUuCisgICAgICAgICAgICAgICAgICAgIC8vIEVhc2llciB0byBwYXJzZSB0aGF0IHdheS4KKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV2ZW50V2l0aG91dFN0cmluZyA9IEBldmVudC5TdWJzdHJpbmcoMCwgZmlyc3RRdW90ZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gQGV2ZW50LlN1YnN0cmluZyhmaXJzdFF1b3RlSW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgQGV2ZW50ID0gZXZlbnRXaXRob3V0U3RyaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKEBldmVudCwgIlx0IiwgZmFsc2UpOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID49IE1BWF9FVkVOVF9FTEVNRU5UUykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3JNYW5hZ2VyLmludGVybmFsRXJyb3IoImV2ZW50IGhhcyBtb3JlIHRoYW4gIitNQVhfRVZFTlRfRUxFTUVOVFMrIiBhcmdzOiAiK2V2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50c1tpXSA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50c1tpXSA9IHN0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkV4dGVuc2lvbnMuUHJpbnRTdGFja1RyYWNlKGUsIENvbnNvbGUuRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgc3RyaW5nIFVuRXNjYXBlTmV3bGluZXMoc3RyaW5nIHR4dCkgeworICAgICAgICAgICAgLy8gdGhpcyB1bmVzY2FwZSBpcyBzbG93IGJ1dCBlYXN5IHRvIHVuZGVyc3RhbmQKKyAgICAgICAgICAgIHR4dCA9IFN0cmluZ0V4dGVuc2lvbnMucmVwbGFjZUFsbCh0eHQsICIlMEEiLCAiXG4iKTsgIC8vIHVuZXNjYXBlIFxuCisgICAgICAgICAgICB0eHQgPSBTdHJpbmdFeHRlbnNpb25zLnJlcGxhY2VBbGwodHh0LCAiJTBEIiwgIlxyIik7ICAvLyB1bmVzY2FwZSBccgorICAgICAgICAgICAgdHh0ID0gU3RyaW5nRXh0ZW5zaW9ucy5yZXBsYWNlQWxsKHR4dCwgIiUyNSIsICIlIik7ICAgLy8gdW5kbyBlc2NhcGVkIGVzY2FwZSBjaGFycworICAgICAgICAgICAgcmV0dXJuIHR4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgVG9rZW5JbmRleGVzQXJlSW52YWxpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vcmV0dXJuIHRva2VuSW5kZXhlc0ludmFsaWQ7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9UcmFjZURlYnVnRXZlbnRMaXN0ZW5lci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1RyYWNlRGVidWdFdmVudExpc3RlbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWMwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5EZWJ1Zy9UcmFjZURlYnVnRXZlbnRMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZyB7CisgICAgdXNpbmcgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uczsKKworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKyAgICB1c2luZyBJVHJlZUFkYXB0b3IgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVBZGFwdG9yOworCisgICAgLyoqIDxzdW1tYXJ5PlByaW50IG91dCAobW9zdCBvZikgdGhlIGV2ZW50cy4uLiBVc2VmdWwgZm9yIGRlYnVnZ2luZywgdGVzdGluZy4uLjwvc3VtbWFyeT4gKi8KKyAgICBwdWJsaWMgY2xhc3MgVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIgOiBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIElUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBUcmFjZURlYnVnRXZlbnRMaXN0ZW5lcihJVHJlZUFkYXB0b3IgYWRhcHRvcikgeworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIEVudGVyUnVsZShzdHJpbmcgcnVsZU5hbWUpIHsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiZW50ZXJSdWxlICIgKyBydWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoImV4aXRSdWxlICIgKyBydWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW50ZXJTdWJSdWxlKGludCBkZWNpc2lvbk51bWJlcikgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCJlbnRlclN1YlJ1bGUiKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFeGl0U3ViUnVsZShpbnQgZGVjaXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiZXhpdFN1YlJ1bGUiKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMb2NhdGlvbihpbnQgbGluZSwgaW50IHBvcykgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCJsb2NhdGlvbiAiICsgbGluZSArICI6IiArIHBvcyk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyZWUgcGFyc2luZyBzdHVmZgorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENvbnN1bWVOb2RlKG9iamVjdCB0KSB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKHQpOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQodCk7CisgICAgICAgICAgICBpbnQgdHlwZSA9IGFkYXB0b3IuR2V0VHlwZSh0KTsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiY29uc3VtZU5vZGUgIiArIElEICsgIiAiICsgdGV4dCArICIgIiArIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTFQoaW50IGksIG9iamVjdCB0KSB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKHQpOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQodCk7CisgICAgICAgICAgICBpbnQgdHlwZSA9IGFkYXB0b3IuR2V0VHlwZSh0KTsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiTFQgIiArIGkgKyAiICIgKyBJRCArICIgIiArIHRleHQgKyAiICIgKyB0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQVNUIHN0dWZmCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTmlsTm9kZShvYmplY3QgdCkgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCJuaWxOb2RlICIgKyBhZGFwdG9yLkdldFVuaXF1ZUlEKHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQodCk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCh0KTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKHQpOworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCJjcmVhdGUgIiArIElEICsgIjogIiArIHRleHQgKyAiLCAiICsgdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlKG9iamVjdCBub2RlLCBJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQobm9kZSk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dChub2RlKTsKKyAgICAgICAgICAgIGludCB0b2tlbkluZGV4ID0gdG9rZW4uVG9rZW5JbmRleDsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiY3JlYXRlICIgKyBJRCArICI6ICIgKyB0b2tlbkluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJlY29tZVJvb3Qob2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290KSB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoImJlY29tZVJvb3QgIiArIGFkYXB0b3IuR2V0VW5pcXVlSUQobmV3Um9vdCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLkdldFVuaXF1ZUlEKG9sZFJvb3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZENoaWxkKG9iamVjdCByb290LCBvYmplY3QgY2hpbGQpIHsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgiYWRkQ2hpbGQgIiArIGFkYXB0b3IuR2V0VW5pcXVlSUQocm9vdCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLkdldFVuaXF1ZUlEKGNoaWxkKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMob2JqZWN0IHQsIGludCB0b2tlblN0YXJ0SW5kZXgsIGludCB0b2tlblN0b3BJbmRleCkgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCJzZXRUb2tlbkJvdW5kYXJpZXMgIiArIGFkYXB0b3IuR2V0VW5pcXVlSUQodCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0YXJ0SW5kZXggKyAiLCAiICsgdG9rZW5TdG9wSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1RyYWNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkRlYnVnL1RyYWNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU4ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuRGVidWcvVHJhY2VyLmNzCkBAIC0wLDAgKzEsODcgQEAKKy8qCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBNVVNUIFJFVEFJTiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gTVVTVCBSRVBST0RVQ0UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciBXUklUVEVOIHBlcm1pc3Npb24uCis0LiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSAKKyAgIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoaXMgd29yayB0byB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGxpY2Vuc29yCisgICBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNlLCB3aXRob3V0IGFueSAKKyAgIGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworCXVzaW5nIFN5c3RlbTsKKwl1c2luZyBBbnRsci5SdW50aW1lOworCXVzaW5nIElUcmVlQWRhcHRvciA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZUFkYXB0b3I7CisJdXNpbmcgSVRyZWVOb2RlU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLklUcmVlTm9kZVN0cmVhbTsKKworCisJLy8vIDxzdW1tYXJ5PgorCS8vLyBUaGUgZGVmYXVsdCB0cmFjZXIgbWltaWNzIHRoZSB0cmFjZVBhcnNlciBiZWhhdmlvciBvZiBBTlRMUiAyLnguCisJLy8vIFRoaXMgbGlzdGVucyBmb3IgZGVidWdnaW5nIGV2ZW50cyBmcm9tIHRoZSBwYXJzZXIgYW5kIGltcGxpZXMKKwkvLy8gdGhhdCB5b3UgY2Fubm90IGRlYnVnIGFuZCB0cmFjZSBhdCB0aGUgc2FtZSB0aW1lLgorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIFRyYWNlciA6IEJsYW5rRGVidWdFdmVudExpc3RlbmVyCisJeworCQlwdWJsaWMgSUludFN0cmVhbSBpbnB1dDsKKwkJcHJvdGVjdGVkIGludCBsZXZlbCA9IDA7CisJCQorCQlwdWJsaWMgVHJhY2VyKElJbnRTdHJlYW0gaW5wdXQpCisJCXsKKwkJCXRoaXMuaW5wdXQgPSBpbnB1dDsKKwkJfQorCQkKKwkJb3ZlcnJpZGUgcHVibGljIHZvaWQgRW50ZXJSdWxlKHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSkKKwkJeworCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGV2ZWw7IGkrKykKKwkJCXsKKwkJCQlDb25zb2xlLk91dC5Xcml0ZSgiICIpOworCQkJfQorCQkJQ29uc29sZS5PdXQuV3JpdGVMaW5lKCI+ICIgKyBncmFtbWFyRmlsZU5hbWUgKyAiICIgKyBydWxlTmFtZSArICIgbG9va2FoZWFkKDEpPSIgKyBHZXRJbnB1dFN5bWJvbCgxKSk7CisJCQlsZXZlbCsrOworCQl9CisKKwkJb3ZlcnJpZGUgcHVibGljIHZvaWQgRXhpdFJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKQorCQl7CisJCQlsZXZlbC0tOworCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGV2ZWw7IGkrKykKKwkJCXsKKwkJCQlDb25zb2xlLk91dC5Xcml0ZSgiICIpOworCQkJfQorCQkJQ29uc29sZS5PdXQuV3JpdGVMaW5lKCI8ICIgKyBncmFtbWFyRmlsZU5hbWUgKyAiICIgKyBydWxlTmFtZSArICIgbG9va2FoZWFkKDEpPSIgKyBHZXRJbnB1dFN5bWJvbCgxKSk7CisJCX0KKworCQlwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0SW5wdXRTeW1ib2woaW50IGspCisJCXsKKwkJCWlmIChpbnB1dCBpcyBJVG9rZW5TdHJlYW0pCisJCQl7CisJCQkJcmV0dXJuICgoSVRva2VuU3RyZWFtKSBpbnB1dCkuTFQoayk7CisJCQl9CisJCQlyZXR1cm4gKGNoYXIpIGlucHV0LkxBKGspOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL0NoZWNrLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvQ2hlY2suY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyN2Y4YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL0NoZWNrLmNzCkBAIC0wLDAgKzEsMTY5IEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OworCisvLyBUYWtlbiBmcm9tIE1vbm8gc291cmNlcywgY2hhbmdlZCB0byB3b3JrIG9uIEMjIDIuMCBjb21waWxlcnMKKworLy8KKy8vIENoZWNrLmNzCisvLworLy8gQXV0aG9yOgorLy8gICBKYiBFdmFpbiAoamJldmFpbkBub3ZlbGwuY29tKQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwNyBOb3ZlbGwsIEluYyAoaHR0cDovL3d3dy5ub3ZlbGwuY29tKQorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisvLyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisvLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisvLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKy8vIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworLy8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisvLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucyB7CisKKwlzdGF0aWMgY2xhc3MgQ2hlY2sgeworCisJCXB1YmxpYyBzdGF0aWMgdm9pZCBTb3VyY2UgKG9iamVjdCBzb3VyY2UpCisJCXsKKwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgic291cmNlIik7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgU291cmNlMUFuZFNvdXJjZTIgKG9iamVjdCBzb3VyY2UxLG9iamVjdCBzb3VyY2UyKQorCQl7CisJCQlpZiAoc291cmNlMSA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzb3VyY2UxIik7CisJCQlpZiAoc291cmNlMiA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzb3VyY2UyIik7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgU291cmNlQW5kRnVuY0FuZFNlbGVjdG9yICggb2JqZWN0IHNvdXJjZSwgb2JqZWN0IGZ1bmMsIG9iamVjdCBzZWxlY3RvcikKKwkJeworCQkJaWYgKHNvdXJjZSA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzb3VyY2UiKTsKKwkJCWlmIChmdW5jID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoImZ1bmMiKTsKKwkJCWlmIChzZWxlY3RvciA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzZWxlY3RvciIpOworCQl9CisKKworCQlwdWJsaWMgc3RhdGljIHZvaWQgU291cmNlQW5kRnVuYyAob2JqZWN0IHNvdXJjZSwgb2JqZWN0IGZ1bmMpCisJCXsKKwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgic291cmNlIik7CisJCQlpZiAoZnVuYyA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJmdW5jIik7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgU291cmNlQW5kU2VsZWN0b3IgKG9iamVjdCBzb3VyY2UsIG9iamVjdCBzZWxlY3RvcikKKwkJeworCQkJaWYgKHNvdXJjZSA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzb3VyY2UiKTsKKwkJCWlmIChzZWxlY3RvciA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzZWxlY3RvciIpOworCQl9CisKKwkJcHVibGljIHN0YXRpYyB2b2lkIFNvdXJjZUFuZFByZWRpY2F0ZSAob2JqZWN0IHNvdXJjZSwgb2JqZWN0IHByZWRpY2F0ZSkKKwkJeworCQkJaWYgKHNvdXJjZSA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzb3VyY2UiKTsKKwkJCWlmIChwcmVkaWNhdGUgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgicHJlZGljYXRlIik7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgRmlyc3RBbmRTZWNvbmQgKG9iamVjdCBmaXJzdCwgb2JqZWN0IHNlY29uZCkKKwkJeworCQkJaWYgKGZpcnN0ID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoImZpcnN0Iik7CisJCQlpZiAoc2Vjb25kID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoInNlY29uZCIpOworCQl9CisKKwkJcHVibGljIHN0YXRpYyB2b2lkIFNvdXJjZUFuZEtleVNlbGVjdG9yIChvYmplY3Qgc291cmNlLCBvYmplY3Qga2V5U2VsZWN0b3IpCisJCXsKKwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgic291cmNlIik7CisJCQlpZiAoa2V5U2VsZWN0b3IgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgia2V5U2VsZWN0b3IiKTsKKwkJfQorCisJCXB1YmxpYyBzdGF0aWMgdm9pZCBTb3VyY2VBbmRLZXlFbGVtZW50U2VsZWN0b3JzIChvYmplY3Qgc291cmNlLCBvYmplY3Qga2V5U2VsZWN0b3IsIG9iamVjdCBlbGVtZW50U2VsZWN0b3IpCisJCXsKKwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgic291cmNlIik7CisJCQlpZiAoa2V5U2VsZWN0b3IgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgia2V5U2VsZWN0b3IiKTsKKwkJCWlmIChlbGVtZW50U2VsZWN0b3IgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgiZWxlbWVudFNlbGVjdG9yIik7CisJCX0KKwkJcHVibGljIHN0YXRpYyB2b2lkIFNvdXJjZUFuZEtleVJlc3VsdFNlbGVjdG9ycyAob2JqZWN0IHNvdXJjZSwgb2JqZWN0IGtleVNlbGVjdG9yLCBvYmplY3QgcmVzdWx0U2VsZWN0b3IpCisJCXsKKwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgic291cmNlIik7CisJCQlpZiAoa2V5U2VsZWN0b3IgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgia2V5U2VsZWN0b3IiKTsKKwkJCWlmIChyZXN1bHRTZWxlY3RvciA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJyZXN1bHRTZWxlY3RvciIpOworCQl9CisKKwkJcHVibGljIHN0YXRpYyB2b2lkIFNvdXJjZUFuZENvbGxlY3Rpb25TZWxlY3RvckFuZFJlc3VsdFNlbGVjdG9yIChvYmplY3Qgc291cmNlLCBvYmplY3QgY29sbGVjdGlvblNlbGVjdG9yLCBvYmplY3QgcmVzdWx0U2VsZWN0b3IpCisJCXsKKwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgic291cmNlIik7CisJCQlpZiAoY29sbGVjdGlvblNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoImNvbGxlY3Rpb25TZWxlY3RvciIpOworCQkJaWYgKHJlc3VsdFNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoInJlc3VsdFNlbGVjdG9yIik7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgU291cmNlQW5kQ29sbGVjdGlvblNlbGVjdG9ycyAob2JqZWN0IHNvdXJjZSwgb2JqZWN0IGNvbGxlY3Rpb25TZWxlY3Rvciwgb2JqZWN0IHNlbGVjdG9yKQorCQl7CisJCQlpZiAoc291cmNlID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoInNvdXJjZSIpOworCQkJaWYgKGNvbGxlY3Rpb25TZWxlY3RvciA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJjb2xsZWN0aW9uU2VsZWN0b3IiKTsKKwkJCWlmIChzZWxlY3RvciA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJzZWxlY3RvciIpOworCQl9CisKKwkJcHVibGljIHN0YXRpYyB2b2lkIEpvaW5TZWxlY3RvcnMgKG9iamVjdCBvdXRlciwgb2JqZWN0IGlubmVyLCBvYmplY3Qgb3V0ZXJLZXlTZWxlY3Rvciwgb2JqZWN0IGlubmVyS2V5U2VsZWN0b3IsIG9iamVjdCByZXN1bHRTZWxlY3RvcikKKwkJeworCQkJaWYgKG91dGVyID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoIm91dGVyIik7CisJCQlpZiAoaW5uZXIgPT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uICgiaW5uZXIiKTsKKwkJCWlmIChvdXRlcktleVNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoIm91dGVyS2V5U2VsZWN0b3IiKTsKKwkJCWlmIChpbm5lcktleVNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoImlubmVyS2V5U2VsZWN0b3IiKTsKKwkJCWlmIChyZXN1bHRTZWxlY3RvciA9PSBudWxsKQorCQkJCXRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24gKCJyZXN1bHRTZWxlY3RvciIpOworCQl9CisKKwkJcHVibGljIHN0YXRpYyB2b2lkIEdyb3VwQnlTZWxlY3RvcnMgKG9iamVjdCBzb3VyY2UsIG9iamVjdCBrZXlTZWxlY3Rvciwgb2JqZWN0IGVsZW1lbnRTZWxlY3Rvciwgb2JqZWN0IHJlc3VsdFNlbGVjdG9yKQorCQl7CisJCQlpZiAoc291cmNlID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoInNvdXJjZSIpOworCQkJaWYgKGtleVNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoImtleVNlbGVjdG9yIik7CisJCQlpZiAoZWxlbWVudFNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoImVsZW1lbnRTZWxlY3RvciIpOworCQkJaWYgKHJlc3VsdFNlbGVjdG9yID09IG51bGwpCisJCQkJdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiAoInJlc3VsdFNlbGVjdG9yIik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9EaWN0aW9uYXJ5RXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL0RpY3Rpb25hcnlFeHRlbnNpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDI0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9EaWN0aW9uYXJ5RXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDEyOCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisvLyNpZiBERUJVRworLy91c2luZyBTeXN0ZW0uTGlucTsKKy8vI2VuZGlmCisKK3VzaW5nIElEaWN0aW9uYXJ5ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5OworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucyB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaWN0aW9uYXJ5RXh0ZW5zaW9ucyB7CisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgY29udGFpbnNLZXkoSURpY3Rpb25hcnkgbWFwLCBvYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gbWFwLkNvbnRhaW5zKGtleSk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IGdldChJRGljdGlvbmFyeSBtYXAsIG9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBba2V5XTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVmFsdWUgZ2V0PFRLZXksIFRWYWx1ZT4oSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiBtYXAsIFRLZXkga2V5KSB7CisgICAgICAgICAgICBUVmFsdWUgdmFsdWU7CisgICAgICAgICAgICBpZiAobWFwLlRyeUdldFZhbHVlKGtleSwgb3V0IHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIGlmICh0eXBlb2YoVFZhbHVlKS5Jc1ZhbHVlVHlwZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5Tm90Rm91bmRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpc2FtYmlndWF0ZXMKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVmFsdWUgZ2V0PFRLZXksIFRWYWx1ZT4oRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IG1hcCwgVEtleSBrZXkpIHsKKyAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChtYXAuVHJ5R2V0VmFsdWUoa2V5LCBvdXQgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgaWYgKHR5cGVvZihUVmFsdWUpLklzVmFsdWVUeXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBLZXlOb3RGb3VuZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVmFsdWUgZ2V0PFRLZXksIFRWYWx1ZT4oU29ydGVkTGlzdDxUS2V5LCBUVmFsdWU+IG1hcCwgVEtleSBrZXkpIHsKKyAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChtYXAuVHJ5R2V0VmFsdWUoa2V5LCBvdXQgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgaWYgKHR5cGVvZihUVmFsdWUpLklzVmFsdWVUeXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBLZXlOb3RGb3VuZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUVmFsdWUpOworICAgICAgICB9CisKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXQoSURpY3Rpb25hcnkgbWFwLCBvYmplY3Qga2V5LCBvYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIG1hcFtrZXldID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXQ8VEtleSwgVFZhbHVlPihJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IG1hcCwgVEtleSBrZXksIFRWYWx1ZSB2YWx1ZSkgeworICAgICAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dDxUS2V5LCBUVmFsdWU+KERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiBtYXAsIFRLZXkga2V5LCBUVmFsdWUgdmFsdWUpIHsKKyAgICAgICAgICAgIG1hcFtrZXldID0gdmFsdWU7CisgICAgICAgIH0KKyNpZiBGQUxTRQorICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSGFzaFNldDxvYmplY3Q+IGtleVNldChJRGljdGlvbmFyeSBtYXApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxvYmplY3Q+KG1hcC5LZXlzLkNhc3Q8b2JqZWN0PigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBIYXNoU2V0PFRLZXk+IGtleVNldDxUS2V5LCBUVmFsdWU+KElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gbWFwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8VEtleT4obWFwLktleXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGlzYW1iaWd1YXRlcyBmb3IgRGljdGlvbmFyeSwgd2hpY2ggaW1wbGVtZW50cyBib3RoIElEaWN0aW9uYXJ5PFQsSz4gYW5kIElEaWN0aW9uYXJ5CisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBIYXNoU2V0PFRLZXk+IGtleVNldDxUS2V5LCBUVmFsdWU+KERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiBtYXApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxUS2V5PihtYXAuS2V5cyk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSGFzaFNldDxvYmplY3Q+IGtleVNldDxUS2V5LCBUVmFsdWU+KFNvcnRlZExpc3Q8VEtleSwgVFZhbHVlPiBtYXApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxvYmplY3Q+KG1hcC5LZXlzLkNhc3Q8b2JqZWN0PigpKTsKKyAgICAgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9FbnVtZXJhYmxlRXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL0VudW1lcmFibGVFeHRlbnNpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzJmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9FbnVtZXJhYmxlRXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDI4NiBAQAor77u/dXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKKworLy8gVGFrZW4gZnJvbSBNb25vIHNvdXJjZXMsIGNoYW5nZWQgdG8gd29yayBvbiBDIyAyLjAgY29tcGlsZXJzCisKKy8vCisvLyBFbnVtZXJhYmxlLmNzCisvLworLy8gQXV0aG9yczoKKy8vICBNYXJlayBTYWZhciAobWFyZWsuc2FmYXJAZ21haWwuY29tKQorLy8gIEFudG9uZWxsbyBQcm92ZW56YW5vICA8YW50b25lbGxvQGRldmVlbC5jb20+CisvLyAgQWxlamFuZHJvIFNlcnJhbm8gIlNlcnJhcyIgKHRydXBpbGxAeWFob28uZXMpCisvLyAgSmIgRXZhaW4gKGpiZXZhaW5Abm92ZWxsLmNvbSkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcgTm92ZWxsLCBJbmMgKGh0dHA6Ly93d3cubm92ZWxsLmNvbSkKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorLy8gIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisvLyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKy8vIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorLy8gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKy8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKworLy8gcHJlY2lvdXM6IGh0dHA6Ly93d3cuaG9va2Vkb25saW5xLmNvbQorCitwdWJsaWMgZGVsZWdhdGUgVFJlc3VsdCBGdW5jPFRSZXN1bHQ+KCk7CitwdWJsaWMgZGVsZWdhdGUgVFJlc3VsdCBGdW5jPFQsIFRSZXN1bHQ+KFQgYXJnMSk7CitwdWJsaWMgZGVsZWdhdGUgVFJlc3VsdCBGdW5jPFQxLCBUMiwgVFJlc3VsdD4oVDEgYXJnMSwgVDIgYXJnMik7CitwdWJsaWMgZGVsZWdhdGUgVFJlc3VsdCBGdW5jPFQxLCBUMiwgVDMsIFRSZXN1bHQ+KFQxIGFyZzEsIFQyIGFyZzIsIFQzIGFyZzMpOworcHVibGljIGRlbGVnYXRlIFRSZXN1bHQgRnVuYzxUMSwgVDIsIFQzLCBUNCwgVFJlc3VsdD4oVDEgYXJnMSwgVDIgYXJnMiwgVDMgYXJnMywgVDQgYXJnNCk7CisKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMgeworICAgIHN0YXRpYyBjbGFzcyBFbnVtZXJhYmxlRXh0ZW5zaW9ucyB7CisKKyAgICAgICAgI3JlZ2lvbiBBdmVyYWdlCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQXZlcmFnZShJRW51bWVyYWJsZTxpbnQ+IHNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIEF2ZXJhZ2U8aW50LCBsb25nLCBkb3VibGU+KHNvdXJjZSwgZGVsZWdhdGUobG9uZyBhLCBpbnQgYikgeyByZXR1cm4gYSArIGI7IH0sIGRlbGVnYXRlKGxvbmcgYSwgbG9uZyBiKSB7IHJldHVybiAoZG91YmxlKWEgLyAoZG91YmxlKWI7IH0pOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFRSZXN1bHQgQXZlcmFnZTxURWxlbWVudCwgVEFnZ3JlZ2F0ZSwgVFJlc3VsdD4oSUVudW1lcmFibGU8VEVsZW1lbnQ+IHNvdXJjZSwKKyAgICAgICAgICAgIEZ1bmM8VEFnZ3JlZ2F0ZSwgVEVsZW1lbnQsIFRBZ2dyZWdhdGU+IGZ1bmMsIEZ1bmM8VEFnZ3JlZ2F0ZSwgbG9uZywgVFJlc3VsdD4gcmVzdWx0KQorICAgICAgICAgICAgd2hlcmUgVEVsZW1lbnQgOiBzdHJ1Y3QKKyAgICAgICAgICAgIHdoZXJlIFRBZ2dyZWdhdGUgOiBzdHJ1Y3QKKyAgICAgICAgICAgIHdoZXJlIFRSZXN1bHQgOiBzdHJ1Y3QgeworICAgICAgICAgICAgQ2hlY2suU291cmNlKHNvdXJjZSk7CisKKyAgICAgICAgICAgIHZhciB0b3RhbCA9IGRlZmF1bHQoVEFnZ3JlZ2F0ZSk7CisgICAgICAgICAgICBsb25nIGNvdW50ZXIgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW1lbnQgaW4gc291cmNlKSB7CisgICAgICAgICAgICAgICAgdG90YWwgPSBmdW5jKHRvdGFsLCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICArK2NvdW50ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb3VudGVyID09IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCh0b3RhbCwgY291bnRlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBdmVyYWdlKElFbnVtZXJhYmxlPGRvdWJsZT4gc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gQXZlcmFnZTxkb3VibGUsIGRvdWJsZSwgZG91YmxlPihzb3VyY2UsIGRlbGVnYXRlKGRvdWJsZSBhLCBkb3VibGUgYikgeyByZXR1cm4gYSArIGI7IH0sIGRlbGVnYXRlKGRvdWJsZSBhLCBsb25nIGIpIHsgcmV0dXJuIGEgLyBiOyB9KTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIENvbnRhaW5zCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIENvbnRhaW5zPFRTb3VyY2U+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgVFNvdXJjZSB2YWx1ZSkgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBzb3VyY2UgYXMgSUNvbGxlY3Rpb248VFNvdXJjZT47CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLkNvbnRhaW5zKHZhbHVlKTsKKworICAgICAgICAgICAgcmV0dXJuIENvbnRhaW5zPFRTb3VyY2U+KHNvdXJjZSwgdmFsdWUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIENvbnRhaW5zPFRTb3VyY2U+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgVFNvdXJjZSB2YWx1ZSwgSUVxdWFsaXR5Q29tcGFyZXI8VFNvdXJjZT4gY29tcGFyZXIpIHsKKyAgICAgICAgICAgIENoZWNrLlNvdXJjZShzb3VyY2UpOworCisgICAgICAgICAgICBpZiAoY29tcGFyZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb21wYXJlciA9IEVxdWFsaXR5Q29tcGFyZXI8VFNvdXJjZT4uRGVmYXVsdDsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW1lbnQgaW4gc291cmNlKQorICAgICAgICAgICAgICAgIGlmIChjb21wYXJlci5FcXVhbHMoZWxlbWVudCwgdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIERlZmF1bHRJZkVtcHR5CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUU291cmNlPiBEZWZhdWx0SWZFbXB0eTxUU291cmNlPihJRW51bWVyYWJsZTxUU291cmNlPiBzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBEZWZhdWx0SWZFbXB0eShzb3VyY2UsIGRlZmF1bHQoVFNvdXJjZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUU291cmNlPiBEZWZhdWx0SWZFbXB0eTxUU291cmNlPihJRW51bWVyYWJsZTxUU291cmNlPiBzb3VyY2UsIFRTb3VyY2UgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICBDaGVjay5Tb3VyY2Uoc291cmNlKTsKKworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURlZmF1bHRJZkVtcHR5SXRlcmF0b3Ioc291cmNlLCBkZWZhdWx0VmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIElFbnVtZXJhYmxlPFRTb3VyY2U+IENyZWF0ZURlZmF1bHRJZkVtcHR5SXRlcmF0b3I8VFNvdXJjZT4oSUVudW1lcmFibGU8VFNvdXJjZT4gc291cmNlLCBUU291cmNlIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgYm9vbCBlbXB0eSA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChUU291cmNlIGl0ZW0gaW4gc291cmNlKSB7CisgICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVtcHR5KQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBNYXgKKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYXgoSUVudW1lcmFibGU8aW50PiBzb3VyY2UpIHsKKyAgICAgICAgICAgIENoZWNrLlNvdXJjZShzb3VyY2UpOworCisgICAgICAgICAgICByZXR1cm4gSXRlcmF0ZShzb3VyY2UsIGludC5NaW5WYWx1ZSwgZGVsZWdhdGUoaW50IGEsIGludCBiKXtyZXR1cm4gTWF0aC5NYXgoYSwgYik7fSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgVSBJdGVyYXRlPFQsIFU+KElFbnVtZXJhYmxlPFQ+IHNvdXJjZSwgVSBpbml0VmFsdWUsIEZ1bmM8VCwgVSwgVT4gc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIGJvb2wgZW1wdHkgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW1lbnQgaW4gc291cmNlKSB7CisgICAgICAgICAgICAgICAgaW5pdFZhbHVlID0gc2VsZWN0b3IoZWxlbWVudCwgaW5pdFZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZW1wdHkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKworICAgICAgICAgICAgcmV0dXJuIGluaXRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIE1pbgorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1pbihJRW51bWVyYWJsZTxpbnQ+IHNvdXJjZSkgeworICAgICAgICAgICAgQ2hlY2suU291cmNlKHNvdXJjZSk7CisKKyAgICAgICAgICAgIHJldHVybiBJdGVyYXRlKHNvdXJjZSwgaW50Lk1heFZhbHVlLCBkZWxlZ2F0ZShpbnQgYSwgaW50IGIpIHsgcmV0dXJuIE1hdGguTWluKGEsIGIpOyB9KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gU2VsZWN0CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUUmVzdWx0PiBTZWxlY3Q8VFNvdXJjZSwgVFJlc3VsdD4oSUVudW1lcmFibGU8VFNvdXJjZT4gc291cmNlLCBGdW5jPFRTb3VyY2UsIFRSZXN1bHQ+IHNlbGVjdG9yKSB7CisgICAgICAgICAgICBDaGVjay5Tb3VyY2VBbmRTZWxlY3Rvcihzb3VyY2UsIHNlbGVjdG9yKTsKKworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVNlbGVjdEl0ZXJhdG9yKHNvdXJjZSwgc2VsZWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIElFbnVtZXJhYmxlPFRSZXN1bHQ+IENyZWF0ZVNlbGVjdEl0ZXJhdG9yPFRTb3VyY2UsIFRSZXN1bHQ+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgRnVuYzxUU291cmNlLCBUUmVzdWx0PiBzZWxlY3RvcikgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVsZW1lbnQgaW4gc291cmNlKQorICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBzZWxlY3RvcihlbGVtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8VFJlc3VsdD4gU2VsZWN0PFRTb3VyY2UsIFRSZXN1bHQ+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgRnVuYzxUU291cmNlLCBpbnQsIFRSZXN1bHQ+IHNlbGVjdG9yKSB7CisgICAgICAgICAgICBDaGVjay5Tb3VyY2VBbmRTZWxlY3Rvcihzb3VyY2UsIHNlbGVjdG9yKTsKKworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVNlbGVjdEl0ZXJhdG9yKHNvdXJjZSwgc2VsZWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIElFbnVtZXJhYmxlPFRSZXN1bHQ+IENyZWF0ZVNlbGVjdEl0ZXJhdG9yPFRTb3VyY2UsIFRSZXN1bHQ+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgRnVuYzxUU291cmNlLCBpbnQsIFRSZXN1bHQ+IHNlbGVjdG9yKSB7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChUU291cmNlIGVsZW1lbnQgaW4gc291cmNlKSB7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHNlbGVjdG9yKGVsZW1lbnQsIGNvdW50ZXIpOworICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFNlbGVjdE1hbnkKKworICAgICAgICBwdWJsaWMgc3RhdGljIElFbnVtZXJhYmxlPFRSZXN1bHQ+IFNlbGVjdE1hbnk8VFNvdXJjZSwgVENvbGxlY3Rpb24sIFRSZXN1bHQ+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwKKyAgICAgICAgICAgIEZ1bmM8VFNvdXJjZSwgaW50LCBJRW51bWVyYWJsZTxUQ29sbGVjdGlvbj4+IGNvbGxlY3Rpb25TZWxlY3RvciwgRnVuYzxUU291cmNlLCBUQ29sbGVjdGlvbiwgVFJlc3VsdD4gc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIENoZWNrLlNvdXJjZUFuZENvbGxlY3Rpb25TZWxlY3RvcnMoc291cmNlLCBjb2xsZWN0aW9uU2VsZWN0b3IsIHNlbGVjdG9yKTsKKworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVNlbGVjdE1hbnlJdGVyYXRvcihzb3VyY2UsIGNvbGxlY3Rpb25TZWxlY3Rvciwgc2VsZWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJRW51bWVyYWJsZTxUUmVzdWx0PiBTZWxlY3RNYW55PFRTb3VyY2UsIFRSZXN1bHQ+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgRnVuYzxUU291cmNlLCBpbnQsIElFbnVtZXJhYmxlPFRSZXN1bHQ+PiBzZWxlY3RvcikgeworICAgICAgICAgICAgQ2hlY2suU291cmNlQW5kU2VsZWN0b3Ioc291cmNlLCBzZWxlY3Rvcik7CisKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVTZWxlY3RNYW55SXRlcmF0b3Ioc291cmNlLCBzZWxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgSUVudW1lcmFibGU8VFJlc3VsdD4gQ3JlYXRlU2VsZWN0TWFueUl0ZXJhdG9yPFRTb3VyY2UsIFRDb2xsZWN0aW9uLCBUUmVzdWx0PihJRW51bWVyYWJsZTxUU291cmNlPiBzb3VyY2UsCisgICAgICAgICAgICBGdW5jPFRTb3VyY2UsIGludCwgSUVudW1lcmFibGU8VENvbGxlY3Rpb24+PiBjb2xsZWN0aW9uU2VsZWN0b3IsIEZ1bmM8VFNvdXJjZSwgVENvbGxlY3Rpb24sIFRSZXN1bHQ+IHNlbGVjdG9yKSB7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChUU291cmNlIGVsZW1lbnQgaW4gc291cmNlKQorICAgICAgICAgICAgICAgIGZvcmVhY2ggKFRDb2xsZWN0aW9uIGNvbGxlY3Rpb24gaW4gY29sbGVjdGlvblNlbGVjdG9yKGVsZW1lbnQsIGNvdW50ZXIrKykpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBzZWxlY3RvcihlbGVtZW50LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBJRW51bWVyYWJsZTxUUmVzdWx0PiBDcmVhdGVTZWxlY3RNYW55SXRlcmF0b3I8VFNvdXJjZSwgVFJlc3VsdD4oSUVudW1lcmFibGU8VFNvdXJjZT4gc291cmNlLCBGdW5jPFRTb3VyY2UsIGludCwgSUVudW1lcmFibGU8VFJlc3VsdD4+IHNlbGVjdG9yKSB7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgICAgICBmb3JlYWNoIChUU291cmNlIGVsZW1lbnQgaW4gc291cmNlKSB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoVFJlc3VsdCBpdGVtIGluIHNlbGVjdG9yKGVsZW1lbnQsIGNvdW50ZXIpKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBTdW0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTdW0oSUVudW1lcmFibGU8aW50PiBzb3VyY2UpIHsKKyAgICAgICAgICAgIENoZWNrLlNvdXJjZShzb3VyY2UpOworCisgICAgICAgICAgICByZXR1cm4gU3VtPGludCwgaW50Pihzb3VyY2UsIGRlbGVnYXRlKGludCBhLCBpbnQgYikgeyByZXR1cm4gY2hlY2tlZChhICsgYik7IH0pOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFRSIFN1bTxUQSwgVFI+KElFbnVtZXJhYmxlPFRBPiBzb3VyY2UsIEZ1bmM8VFIsIFRBLCBUUj4gc2VsZWN0b3IpIHsKKyAgICAgICAgICAgIFRSIHRvdGFsID0gZGVmYXVsdChUUik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbWVudCBpbiBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICB0b3RhbCA9IHNlbGVjdG9yKHRvdGFsLCBlbGVtZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRvdGFsOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gVGFrZQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUVudW1lcmFibGU8VFNvdXJjZT4gVGFrZTxUU291cmNlPihJRW51bWVyYWJsZTxUU291cmNlPiBzb3VyY2UsIGludCBjb3VudCkgeworICAgICAgICAgICAgQ2hlY2suU291cmNlKHNvdXJjZSk7CisKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVUYWtlSXRlcmF0b3Ioc291cmNlLCBjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgSUVudW1lcmFibGU8VFNvdXJjZT4gQ3JlYXRlVGFrZUl0ZXJhdG9yPFRTb3VyY2U+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKworICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICAgICAgZm9yZWFjaCAoVFNvdXJjZSBlbGVtZW50IGluIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBlbGVtZW50OworCisgICAgICAgICAgICAgICAgaWYgKCsrY291bnRlciA9PSBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIAorICAgICAgICAjcmVnaW9uIFRvQXJyYXkKKworICAgICAgICBwdWJsaWMgc3RhdGljIFRTb3VyY2VbXSBUb0FycmF5PFRTb3VyY2U+KElFbnVtZXJhYmxlPFRTb3VyY2U+IHNvdXJjZSkgeworICAgICAgICAgICAgQ2hlY2suU291cmNlKHNvdXJjZSk7CisKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gc291cmNlIGFzIElDb2xsZWN0aW9uPFRTb3VyY2U+OworICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBUU291cmNlW2NvbGxlY3Rpb24uQ291bnRdOworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uQ29weVRvKGFycmF5LCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdDxUU291cmNlPihzb3VyY2UpLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9FeGNlcHRpb25FeHRlbnNpb25zLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvRXhjZXB0aW9uRXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjlkZmIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvRXhjZXB0aW9uRXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDg5IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CisKK3VzaW5nIFRhcmdldEludm9jYXRpb25FeGNlcHRpb24gPSBTeXN0ZW0uUmVmbGVjdGlvbi5UYXJnZXRJbnZvY2F0aW9uRXhjZXB0aW9uOworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucyB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25FeHRlbnNpb25zIHsKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIGdldE1lc3NhZ2UoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBlLk1lc3NhZ2U7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RhY2tGcmFtZVtdIGdldFN0YWNrVHJhY2UoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YWNrVHJhY2UgdHJhY2UgPSBuZXcgU3RhY2tUcmFjZShlLCB0cnVlKTsKKyAgICAgICAgICAgIFN0YWNrRnJhbWVbXSBmcmFtZXMgPSB0cmFjZS5HZXRGcmFtZXMoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGRvbid0IGluY2x1ZGUgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaW4gdGhlIHRyYWNlCisgICAgICAgICAgICAgICAgQXJyYXkgc3RhY2tUcmFjZSA9IG5ldyBTdGFja1RyYWNlKHRydWUpLkdldEZyYW1lcygpOworICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoc3RhY2tUcmFjZSwgMSwgZnJhbWVzLCAwLCBzdGFja1RyYWNlLkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZnJhbWVzOworICAgICAgICB9CisKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIGdldE1ldGhvZE5hbWUoU3RhY2tGcmFtZSBmcmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGZyYW1lLkdldE1ldGhvZCgpLk5hbWU7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIGdldENsYXNzTmFtZShTdGFja0ZyYW1lIGZyYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gZnJhbWUuR2V0TWV0aG9kKCkuRGVjbGFyaW5nVHlwZS5OYW1lOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUHJpbnRTdGFja1RyYWNlKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBFeGNlcHRpb25FeHRlbnNpb25zLlByaW50U3RhY2tUcmFjZShlLCBDb25zb2xlLk91dCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFByaW50U3RhY2tUcmFjZShFeGNlcHRpb24gZSwgU3lzdGVtLklPLlRleHRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKGUuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzdHJpbmcgdHJhY2UgPSBlLlN0YWNrVHJhY2UgPz8gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGxpbmUgaW4gdHJhY2UuU3BsaXQoJ1xuJywgJ1xyJykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGxpbmUpKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCIgICAgICAgICIgKyBsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VwdGlvbiBnZXRUYXJnZXRFeGNlcHRpb24oVGFyZ2V0SW52b2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZS5Jbm5lckV4Y2VwdGlvbiA/PyBlOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9JT0V4dGVuc2lvbnMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9JT0V4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwYWY1NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL0lPRXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDk0IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiAhREVCVUcKKwordXNpbmcgU3lzdGVtOworCit1c2luZyBUZXh0UmVhZGVyID0gU3lzdGVtLklPLlRleHRSZWFkZXI7Cit1c2luZyBUZXh0V3JpdGVyID0gU3lzdGVtLklPLlRleHRXcml0ZXI7CisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJT0V4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKCB0aGlzIFRleHRSZWFkZXIgcmVhZGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyLkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZSggdGhpcyBUZXh0V3JpdGVyIHdyaXRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQ8VD4oIHRoaXMgVGV4dFdyaXRlciB3cml0ZXIsIFQgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuV3JpdGUoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuKCB0aGlzIFRleHRXcml0ZXIgd3JpdGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRsbjxUPiggdGhpcyBUZXh0V3JpdGVyIHdyaXRlciwgVCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZTxUPiggdGhpcyBUZXh0V3JpdGVyIHdyaXRlciwgVCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZSggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZCggdGhpcyBUZXh0UmVhZGVyIHJlYWRlciwgY2hhcltdIGJ1ZmZlciwgaW50IGluZGV4LCBpbnQgY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLlJlYWQoIGJ1ZmZlciwgaW5kZXgsIGNvdW50ICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIHJlYWRMaW5lKCB0aGlzIFRleHRSZWFkZXIgcmVhZGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5SZWFkTGluZSgpOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL0pTeXN0ZW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9KU3lzdGVtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjc5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9KU3lzdGVtLmNzCkBAIC0wLDAgKzEsODkgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiAhREVCVUcKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zCit7CisgICAgdXNpbmcgU3lzdGVtOworICAgIHVzaW5nIFN5c3RlbS5JTzsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSlN5c3RlbQorICAgIHsKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIFRleHRXcml0ZXIgZXJyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb25zb2xlLkVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIFRleHRXcml0ZXIgQG91dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29uc29sZS5PdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcnJheWNvcHk8VD4oIFRbXSBzb3VyY2VBcnJheSwgaW50IHNvdXJjZUluZGV4LCBUW10gZGVzdGluYXRpb25BcnJheSwgaW50IGRlc3RpbmF0aW9uSW5kZXgsIGludCBsZW5ndGggKQorICAgICAgICB7CisgICAgICAgICAgICBBcnJheS5Db3B5KCBzb3VyY2VBcnJheSwgc291cmNlSW5kZXgsIGRlc3RpbmF0aW9uQXJyYXksIGRlc3RpbmF0aW9uSW5kZXgsIGxlbmd0aCApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBnZXRQcm9wZXJ0eSggc3RyaW5nIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCBuYW1lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgImZpbGUuZW5jb2RpbmciOgorICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uVGV4dC5FbmNvZGluZy5EZWZhdWx0LldlYk5hbWU7CisKKyAgICAgICAgICAgIGNhc2UgImxpbmUuc2VwYXJhdG9yIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuTmV3TGluZTsKKworICAgICAgICAgICAgY2FzZSAiamF2YS5pby50bXBkaXIiOgorICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uSU8uUGF0aC5HZXRUZW1wUGF0aCgpOworCisgICAgICAgICAgICBjYXNlICJ1c2VyLmhvbWUiOgorICAgICAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5HZXRGb2xkZXJQYXRoKCBFbnZpcm9ubWVudC5TcGVjaWFsRm9sZGVyLlBlcnNvbmFsICk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCBzdHJpbmcuRm9ybWF0KCAiVW5rbm93biBzeXN0ZW0gcHJvcGVydHk6ICd7MH0nIiwgbmFtZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvTGV4ZXJFeHRlbnNpb25zLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvTGV4ZXJFeHRlbnNpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Zjg4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9MZXhlckV4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExleGVyRXh0ZW5zaW9ucworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoIExleGVyIGxleGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgbGV4ZXIuU2tpcCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU3RyaW5nRXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0cmluZ0V4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2MmE0YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0cmluZ0V4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSwxNTYgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nRXh0ZW5zaW9ucworICAgIHsKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhciBjaGFyQXQoIHN0cmluZyBzdHIsIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgZW5kc1dpdGgoIHN0cmluZyBzdHIsIHN0cmluZyB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuRW5kc1dpdGgoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoIHN0cmluZyBzdHIsIGNoYXIgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLkluZGV4T2YoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoIHN0cmluZyBzdHIsIGNoYXIgdmFsdWUsIGludCBzdGFydEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5JbmRleE9mKCB2YWx1ZSwgc3RhcnRJbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKCBzdHJpbmcgc3RyLCBzdHJpbmcgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLkluZGV4T2YoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoIHN0cmluZyBzdHIsIHN0cmluZyB2YWx1ZSwgaW50IHN0YXJ0SW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLkluZGV4T2YoIHZhbHVlLCBzdGFydEluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKCBzdHJpbmcgc3RyLCBjaGFyIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5MYXN0SW5kZXhPZiggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoIHN0cmluZyBzdHIsIHN0cmluZyB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuTGFzdEluZGV4T2YoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGxlbmd0aCggc3RyaW5nIHN0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuTGVuZ3RoOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyByZXBsYWNlKCBzdHJpbmcgc3RyLCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGluZGV4ID0gc3RyLkluZGV4T2YoIG9sZFZhbHVlICk7CisgICAgICAgICAgICBpZiAoIGluZGV4ID09IC0xICkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyOworCisgICAgICAgICAgICBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlciggc3RyICk7CisgICAgICAgICAgICBidWlsZGVyW2luZGV4XSA9IG5ld1ZhbHVlOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIHJlcGxhY2VBbGwoIHN0cmluZyBzdHIsIHN0cmluZyByZWdleCwgc3RyaW5nIG5ld1ZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5SZXBsYWNlKCBzdHIsIHJlZ2V4LCBuZXdWYWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgcmVwbGFjZUZpcnN0KCBzdHJpbmcgc3RyLCBzdHJpbmcgcmVnZXgsIHN0cmluZyByZXBsYWNlbWVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXguUmVwbGFjZSggc3RyLCByZWdleCwgcmVwbGFjZW1lbnQgKTsKKyAgICAgICAgfQorCisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgc3RhcnRzV2l0aCggc3RyaW5nIHN0ciwgc3RyaW5nIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5TdGFydHNXaXRoKCB2YWx1ZSApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIHN1YnN0cmluZyggc3RyaW5nIHN0ciwgaW50IHN0YXJ0T2Zmc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5TdWJzdHJpbmcoIHN0YXJ0T2Zmc2V0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBzdWJzdHJpbmcoIHN0cmluZyBzdHIsIGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuU3Vic3RyaW5nKCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQgKTsKKyAgICAgICAgfQorCisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGNoYXJbXSB0b0NoYXJBcnJheSggc3RyaW5nIHN0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgdG9VcHBlckNhc2UoIHN0cmluZyBzdHIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLlRvVXBwZXJJbnZhcmlhbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgdHJpbSggc3RyaW5nIHN0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuVHJpbSgpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdHJpbmdUb2tlbml6ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdHJpbmdUb2tlbml6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwNjg1MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0cmluZ1Rva2VuaXplci5jcwpAQCAtMCwwICsxLDg3IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zCit7CisgICAgcHVibGljIGNsYXNzIFN0cmluZ1Rva2VuaXplcgorICAgIHsKKyAgICAgICAgc3RyaW5nW10gX3Rva2VuczsKKyAgICAgICAgaW50IF9jdXJyZW50OworCisgICAgICAgIHB1YmxpYyBTdHJpbmdUb2tlbml6ZXIoIHN0cmluZyBzdHIsIHN0cmluZyBzZXBhcmF0b3IgKQorICAgICAgICAgICAgOiB0aGlzKCBzdHIsIHNlcGFyYXRvciwgZmFsc2UgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZ1Rva2VuaXplciggc3RyaW5nIHN0ciwgc3RyaW5nIHNlcGFyYXRvciwgYm9vbCByZXR1cm5EZWxpbXMgKQorICAgICAgICB7CisgICAgICAgICAgICBfdG9rZW5zID0gc3RyLlNwbGl0KCBzZXBhcmF0b3IuVG9DaGFyQXJyYXkoKSwgU3RyaW5nU3BsaXRPcHRpb25zLk5vbmUgKTsKKyAgICAgICAgICAgIGlmICggcmV0dXJuRGVsaW1zICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gZGVsaW1zID0gc2VwYXJhdG9yLlRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgX3Rva2VucyA9IEVudW1lcmFibGVFeHRlbnNpb25zLlRvQXJyYXkoRW51bWVyYWJsZUV4dGVuc2lvbnMuU2VsZWN0TWFueShfdG9rZW5zLCBkZWxlZ2F0ZShzdHJpbmcgdG9rZW4sIGludCBpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpID09IF90b2tlbnMuTGVuZ3RoIC0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnVtZXJhYmxlRXh0ZW5zaW9ucy5Db250YWlucyhkZWxpbXMsIHN0cltzdHIuTGVuZ3RoIC0gMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyB0b2tlbiB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRW51bWVyYWJsZUV4dGVuc2lvbnMuQ29udGFpbnMoZGVsaW1zLCBzdHJbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyBzdHJbMF0uVG9TdHJpbmcoKSB9OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyB0b2tlbiB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmdbXSB7IHRva2VuLCBzdHJbRW51bWVyYWJsZUV4dGVuc2lvbnMuU3VtKEVudW1lcmFibGVFeHRlbnNpb25zLlNlbGVjdChFbnVtZXJhYmxlRXh0ZW5zaW9ucy5UYWtlKF90b2tlbnMsIGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZShzdHJpbmcgdCkgeyByZXR1cm4gdC5MZW5ndGggKyAxOyB9KSkgLSAxXS5Ub1N0cmluZygpIH07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBoYXNNb3JlVG9rZW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50IDwgX3Rva2Vucy5MZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIG5leHRUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zW19jdXJyZW50KytdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuTWlzYy9Eb3VibGVLZXlNYXAuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL0RvdWJsZUtleU1hcC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGRmMTMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuTWlzYy9Eb3VibGVLZXlNYXAuY3MKQEAgLTAsMCArMSw3NSBAQAor77u/Ly8gTm90ZSB0byBKTDogQ2hhbmdlZCBIYXNoc2V0IHRvIExpc3QKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcuTWlzYyB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICBwdWJsaWMgY2xhc3MgRG91YmxlS2V5TWFwPFRLZXkxLCBUS2V5MiwgVFZhbHVlPiB7CisgICAgICAgIGludGVybmFsIElEaWN0aW9uYXJ5PFRLZXkxLCBJRGljdGlvbmFyeTxUS2V5MiwgVFZhbHVlPj4gZGF0YSA9IG5ldyBEaWN0aW9uYXJ5PFRLZXkxLCBJRGljdGlvbmFyeTxUS2V5MiwgVFZhbHVlPj4oKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBUVmFsdWUgUHV0KFRLZXkxIGsxLCBUS2V5MiBrMiwgVFZhbHVlIHYpIHsKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PFRLZXkyLCBUVmFsdWU+IGRhdGEyOworICAgICAgICAgICAgZGF0YS5UcnlHZXRWYWx1ZShrMSwgb3V0IGRhdGEyKTsKKyAgICAgICAgICAgIFRWYWx1ZSBwcmV2ID0gZGVmYXVsdChUVmFsdWUpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkYXRhMiA9IG5ldyBEaWN0aW9uYXJ5PFRLZXkyLCBUVmFsdWU+KCk7CisgICAgICAgICAgICAgICAgZGF0YVtrMV0gPSBkYXRhMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YTIuVHJ5R2V0VmFsdWUoazIsIG91dCBwcmV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEyW2syXSA9IHY7CisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFRWYWx1ZSBHZXQoVEtleTEgazEsIFRLZXkyIGsyKSB7CisgICAgICAgICAgICBJRGljdGlvbmFyeTxUS2V5MiwgVFZhbHVlPiBkYXRhMjsKKyAgICAgICAgICAgIGRhdGEuVHJ5R2V0VmFsdWUoazEsIG91dCBkYXRhMik7CisgICAgICAgICAgICBpZiAoZGF0YTIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUVmFsdWUpOworCisgICAgICAgICAgICBUVmFsdWUgdmFsdWU7CisgICAgICAgICAgICBkYXRhMi5UcnlHZXRWYWx1ZShrMiwgb3V0IHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElEaWN0aW9uYXJ5PFRLZXkyLCBUVmFsdWU+IEdldChUS2V5MSBrMSkgeworICAgICAgICAgICAgSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4gdmFsdWU7CisgICAgICAgICAgICBkYXRhLlRyeUdldFZhbHVlKGsxLCBvdXQgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEdldCBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBwcmltYXJ5IGtleSAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQ29sbGVjdGlvbjxUVmFsdWU+IFZhbHVlcyhUS2V5MSBrMSkgeworICAgICAgICAgICAgSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4gZGF0YTI7CisgICAgICAgICAgICBkYXRhLlRyeUdldFZhbHVlKGsxLCBvdXQgZGF0YTIpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBkYXRhMi5WYWx1ZXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogZ2V0IGFsbCBwcmltYXJ5IGtleXMgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUNvbGxlY3Rpb248VEtleTE+IEtleVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhLktleXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogZ2V0IGFsbCBzZWNvbmRhcnkga2V5cyBhc3NvY2lhdGVkIHdpdGggYSBwcmltYXJ5IGtleSAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQ29sbGVjdGlvbjxUS2V5Mj4gS2V5U2V0KFRLZXkxIGsxKSB7CisgICAgICAgICAgICBJRGljdGlvbmFyeTxUS2V5MiwgVFZhbHVlPiBkYXRhMjsKKyAgICAgICAgICAgIGRhdGEuVHJ5R2V0VmFsdWUoazEsIG91dCBkYXRhMik7CisgICAgICAgICAgICBpZiAoZGF0YTIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIGRhdGEyLktleXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQ29sbGVjdGlvbjxUVmFsdWU+IFZhbHVlcygpIHsKKyAgICAgICAgICAgIExpc3Q8VFZhbHVlPiBzID0gbmV3IExpc3Q8VFZhbHVlPigpOworICAgICAgICAgICAgZm9yZWFjaCAoSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4gazIgaW4gZGF0YS5WYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChUVmFsdWUgdiBpbiBrMi5WYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcy5BZGQodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL0Vycm9yTWFuYWdlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLk1pc2MvRXJyb3JNYW5hZ2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTI4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL0Vycm9yTWFuYWdlci5jcwpAQCAtMCwwICsxLDEwMSBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLk1pc2MKK3sKKwl1c2luZyBTeXN0ZW07CisJdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisJdXNpbmcgU3RhY2tUcmFjZSA9IFN5c3RlbS5EaWFnbm9zdGljcy5TdGFja1RyYWNlOworCXVzaW5nIFN0YWNrRnJhbWUgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuU3RhY2tGcmFtZTsKKwl1c2luZyBJTGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdDsKKworCS8vLyA8c3VtbWFyeT5BIG1pbmltYWwgQU5UTFIzIGVycm9yIFttZXNzYWdlXSBtYW5hZ2VyIHdpdGggdGhlIFNUIGJpdHM8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIEVycm9yTWFuYWdlcgorCXsKKwkJcHVibGljIHN0YXRpYyB2b2lkIEludGVybmFsRXJyb3Iob2JqZWN0IGVycm9yLCBFeGNlcHRpb24gZSkKKwkJeworCQkJU3RhY2tGcmFtZSBsb2NhdGlvbiA9IEdldExhc3ROb25FcnJvck1hbmFnZXJDb2RlTG9jYXRpb24oZSk7CisJCQlzdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiAiICsgZSArICJAIiArIGxvY2F0aW9uICsgIjogIiArIGVycm9yOworCQkJLy9FcnJvcihNU0dfSU5URVJOQUxfRVJST1IsIG1zZyk7CisJCQlFcnJvcihtc2cpOworCQl9CisKKwkJcHVibGljIHN0YXRpYyB2b2lkIEludGVybmFsRXJyb3Iob2JqZWN0IGVycm9yKQorCQl7CisJCQlTdGFja0ZyYW1lIGxvY2F0aW9uID0gR2V0TGFzdE5vbkVycm9yTWFuYWdlckNvZGVMb2NhdGlvbihuZXcgRXhjZXB0aW9uKCkpOworCQkJc3RyaW5nIG1zZyA9IGxvY2F0aW9uICsgIjogIiArIGVycm9yOworCQkJLy9FcnJvcihNU0dfSU5URVJOQUxfRVJST1IsIG1zZyk7CisJCQlFcnJvcihtc2cpOworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV0dXJuIGZpcnN0IG5vbiBFcnJvck1hbmFnZXIgY29kZSBsb2NhdGlvbiBmb3IgZ2VuZXJhdGluZyBtZXNzYWdlcworCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHBhcmFtIG5hbWU9ImUiPkN1cnJlbnQgZXhjZXB0aW9uPC9wYXJhbT4KKwkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKwkJcHJpdmF0ZSBzdGF0aWMgU3RhY2tGcmFtZSBHZXRMYXN0Tm9uRXJyb3JNYW5hZ2VyQ29kZUxvY2F0aW9uKEV4Y2VwdGlvbiBlKQorCQl7CisJCQlTdGFja1RyYWNlIHN0YWNrVHJhY2UgPSBuZXcgU3RhY2tUcmFjZShlKTsKKwkJCWludCBpID0gMDsKKwkJCWZvciAoOyBpIDwgc3RhY2tUcmFjZS5GcmFtZUNvdW50OyBpKyspCisJCQl7CisJCQkJU3RhY2tGcmFtZSBmID0gc3RhY2tUcmFjZS5HZXRGcmFtZShpKTsKKwkJCQlpZiAoZi5Ub1N0cmluZygpLkluZGV4T2YoIkVycm9yTWFuYWdlciIpIDwgMCkKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCVN0YWNrRnJhbWUgbG9jYXRpb24gPSBzdGFja1RyYWNlLkdldEZyYW1lKGkpOworCisJCQlyZXR1cm4gbG9jYXRpb247CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgRXJyb3IoLyppbnQgbXNnSUQsKi8gb2JqZWN0IGFyZykKKwkJeworCQkJLy9nZXRFcnJvckNvdW50KCkuZXJyb3JzKys7CisJCQkvL2dldEVycm9yTGlzdGVuZXIoKS5lcnJvcihuZXcgVG9vbE1lc3NhZ2UobXNnSUQsIGFyZykpOworCisJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCS8vc2IuQXBwZW5kRm9ybWF0KCJpbnRlcm5hbCBlcnJvcjogezB9IHsxfSIsIGFyZyk7CisJCQlzYi5BcHBlbmRGb3JtYXQoImludGVybmFsIGVycm9yOiB7MH0gIiwgYXJnKTsKKwkJfQorCisJCS8qCisJCQlJTlRFUk5BTF9FUlJPUihhcmcsYXJnMixleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9IDw8CisJCQlpbnRlcm5hbCBlcnJvcjogPGFyZz4gPGFyZzI+PGlmKGV4Y2VwdGlvbik+OiA8ZXhjZXB0aW9uPjxlbmRpZj4KKwkJCTxzdGFja1RyYWNlOyBzZXBhcmF0b3I9IlxuIj4KKwkJCT4+CisJCSAqLworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL0Zhc3RRdWV1ZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLk1pc2MvRmFzdFF1ZXVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkM2NmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL0Zhc3RRdWV1ZS5jcwpAQCAtMCwwICsxLDEyOSBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5NaXNjIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBBcmd1bWVudEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbjsKKyAgICB1c2luZyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uID0gU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb247CisKKyAgICAvKiogQSBxdWV1ZSB0aGF0IGNhbiBkZXF1ZXVlIGFuZCBnZXQoaSkgaW4gTygxKSBhbmQgZ3JvdyBhcmJpdHJhcmlseSBsYXJnZS4KKyAgICAgKiAgQSBsaW5rZWQgbGlzdCBpcyBmYXN0IGF0IGRlcXVldWUgYnV0IHNsb3cgYXQgZ2V0KGkpLiAgQW4gYXJyYXkgaXMKKyAgICAgKiAgdGhlIHJldmVyc2UuICBUaGlzIGlzIE8oMSkgZm9yIGJvdGggb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqICBMaXN0IGdyb3dzIHVudGlsIHlvdSBkZXF1ZXVlIGxhc3QgZWxlbWVudCBhdCBlbmQgb2YgYnVmZmVyLiBUaGVuCisgICAgICogIGl0IHJlc2V0cyB0byBzdGFydCBmaWxsaW5nIGF0IDAgYWdhaW4uICBJZiBhZGRzL3JlbW92ZXMgYXJlIGJhbGFuY2VkLCB0aGUKKyAgICAgKiAgYnVmZmVyIHdpbGwgbm90IGdyb3cgdG9vIGxhcmdlLgorICAgICAqCisgICAgICogIE5vIGl0ZXJhdG9yIHN0dWZmIGFzIHRoYXQncyBub3QgaG93IHdlJ2xsIHVzZSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRmFzdFF1ZXVlPFQ+IHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PmR5bmFtaWNhbGx5LXNpemVkIGJ1ZmZlciBvZiBlbGVtZW50czwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50ZXJuYWwgTGlzdDxUPiBfZGF0YSA9IG5ldyBMaXN0PFQ+KCk7CisgICAgICAgIC8qKiA8c3VtbWFyeT5pbmRleCBvZiBuZXh0IGVsZW1lbnQgdG8gZmlsbDwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50ZXJuYWwgaW50IF9wID0gMDsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ291bnQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGEuQ291bnQgLSBfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvdyBkZWVwIGhhdmUgd2UgZ29uZT8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFJhbmdlIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gZWxlbWVudCBpIGVsZW1lbnRzIGFoZWFkIG9mIGN1cnJlbnQgZWxlbWVudC4gIGk9PTAgZ2V0cworICAgICAgICAgKiAgY3VycmVudCBlbGVtZW50LiAgVGhpcyBpcyBub3QgYW4gYWJzb2x1dGUgaW5kZXggaW50byB0aGUgZGF0YSBsaXN0CisgICAgICAgICAqICBzaW5jZSBwIGRlZmluZXMgdGhlIHN0YXJ0IG9mIHRoZSByZWFsIGxpc3QuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBUIHRoaXNbaW50IGldIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgaW50IGFic0luZGV4ID0gX3AgKyBpOworICAgICAgICAgICAgICAgIGlmIChhYnNJbmRleCA+PSBfZGF0YS5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoInF1ZXVlIGluZGV4IHswfSA+IGxhc3QgaW5kZXggezF9IiwgYWJzSW5kZXgsIF9kYXRhLkNvdW50IC0gMSkpOworICAgICAgICAgICAgICAgIGlmIChhYnNJbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJxdWV1ZSBpbmRleCB7MH0gPCAwIiwgYWJzSW5kZXgpKTsKKworICAgICAgICAgICAgICAgIGlmIChhYnNJbmRleCA+IFJhbmdlKQorICAgICAgICAgICAgICAgICAgICBSYW5nZSA9IGFic0luZGV4OworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9kYXRhW2Fic0luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgYW5kIHJlbW92ZSBmaXJzdCBlbGVtZW50IGluIHF1ZXVlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBUIERlcXVldWUoKSB7CisgICAgICAgICAgICBpZiAoQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBUIG8gPSB0aGlzWzBdOworICAgICAgICAgICAgX3ArKzsKKyAgICAgICAgICAgIC8vIGhhdmUgd2UgaGl0IGVuZCBvZiBidWZmZXI/CisgICAgICAgICAgICBpZiAoX3AgPT0gX2RhdGEuQ291bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBzbywgaXQncyBhbiBvcHBvcnR1bml0eSB0byBzdGFydCBmaWxsaW5nIGF0IGluZGV4IDAgYWdhaW4KKyAgICAgICAgICAgICAgICBDbGVhcigpOyAvLyBzaXplIGdvZXMgdG8gMCwgYnV0IHJldGFpbnMgbWVtb3J5CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5xdWV1ZShUIG8pIHsKKyAgICAgICAgICAgIF9kYXRhLkFkZChvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFQgUGVlaygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzWzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDbGVhcigpIHsKKyAgICAgICAgICAgIF9wID0gMDsKKyAgICAgICAgICAgIF9kYXRhLkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmV0dXJuIHN0cmluZyBvZiBjdXJyZW50IGJ1ZmZlciBjb250ZW50czsgbm9uLWRlc3RydWN0aXZlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaW50IG4gPSBDb3VudDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCh0aGlzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IG4pCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLk1pc2MvTG9va2FoZWFkU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuTWlzYy9Mb29rYWhlYWRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4N2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLk1pc2MvTG9va2FoZWFkU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTk3IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLk1pc2MgeworICAgIHVzaW5nIEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiA9IFN5c3RlbS5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb247CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgbG9va2FoZWFkIHF1ZXVlIHRoYXQga25vd3MgaG93IHRvIG1hcmsvcmVsZWFzZSBsb2NhdGlvbnMKKyAgICAgKiAgaW4gdGhlIGJ1ZmZlciBmb3IgYmFja3RyYWNraW5nIHB1cnBvc2VzLiBBbnkgbWFya2VycyBmb3JjZSB0aGUgRmFzdFF1ZXVlCisgICAgICogIHN1cGVyY2xhc3MgdG8ga2VlcCBhbGwgdG9rZW5zIHVudGlsIG5vIG1vcmUgbWFya2VyczsgdGhlbiBjYW4gcmVzZXQKKyAgICAgKiAgdG8gYXZvaWQgZ3Jvd2luZyBhIGh1Z2UgYnVmZmVyLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIExvb2thaGVhZFN0cmVhbTxUPgorICAgICAgICA6IEZhc3RRdWV1ZTxUPgorICAgICAgICB3aGVyZSBUIDogY2xhc3MgeworICAgICAgICAvKiogQWJzb2x1dGUgdG9rZW4gaW5kZXguIEl0J3MgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wgYWJvdXQgdG8gYmUKKyAgICAgICAgICogIHJlYWQgdmlhIExUKDEpLiBHb2VzIGZyb20gMCB0byBudW10b2tlbnMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBfY3VycmVudEVsZW1lbnRJbmRleCA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSBUIF9wcmV2aW91c0VsZW1lbnQ7CisKKyAgICAgICAgLyoqIFRyYWNrIG9iamVjdCByZXR1cm5lZCBieSBuZXh0RWxlbWVudCB1cG9uIGVuZCBvZiBzdHJlYW07CisgICAgICAgICAqICBSZXR1cm4gaXQgbGF0ZXIgd2hlbiB0aGV5IGFzayBmb3IgTFQgcGFzc2VkIGVuZCBvZiBpbnB1dC4KKyAgICAgICAgICovCisgICAgICAgIFQgX2VvZiA9IG51bGw7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IF9sYXN0TWFya2VyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT50cmFja3MgaG93IGRlZXAgbWFyaygpIGNhbGxzIGFyZSBuZXN0ZWQ8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBfbWFya0RlcHRoOworCisgICAgICAgIHB1YmxpYyBUIEVuZE9mRmlsZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfZW9mOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvdGVjdGVkIHNldCB7CisgICAgICAgICAgICAgICAgX2VvZiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xlYXIoKSB7CisgICAgICAgICAgICBiYXNlLkNsZWFyKCk7CisgICAgICAgICAgICBfY3VycmVudEVsZW1lbnRJbmRleCA9IDA7CisgICAgICAgICAgICBfcCA9IDA7CisgICAgICAgICAgICBfcHJldmlvdXNFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEltcGxlbWVudCBuZXh0RWxlbWVudCB0byBzdXBwbHkgYSBzdHJlYW0gb2YgZWxlbWVudHMgdG8gdGhpcworICAgICAgICAgKiAgbG9va2FoZWFkIGJ1ZmZlci4gIFJldHVybiBlb2YgdXBvbiBlbmQgb2YgdGhlIHN0cmVhbSB3ZSdyZSBwdWxsaW5nIGZyb20uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBOZXh0RWxlbWVudCgpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzRW5kT2ZGaWxlKFQgbyk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdldCBhbmQgcmVtb3ZlIGZpcnN0IGVsZW1lbnQgaW4gcXVldWU7IG92ZXJyaWRlIEZhc3RRdWV1ZS5yZW1vdmUoKTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFQgRGVxdWV1ZSgpIHsKKyAgICAgICAgICAgIFQgbyA9IHRoaXNbMF07CisgICAgICAgICAgICBfcCsrOworICAgICAgICAgICAgLy8gaGF2ZSB3ZSBoaXQgZW5kIG9mIGJ1ZmZlciBhbmQgbm90IGJhY2t0cmFja2luZz8KKyAgICAgICAgICAgIGlmIChfcCA9PSBfZGF0YS5Db3VudCAmJiBfbWFya0RlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBzbywgaXQncyBhbiBvcHBvcnR1bml0eSB0byBzdGFydCBmaWxsaW5nIGF0IGluZGV4IDAgYWdhaW4KKyAgICAgICAgICAgICAgICBDbGVhcigpOyAvLyBzaXplIGdvZXMgdG8gMCwgYnV0IHJldGFpbnMgbWVtb3J5CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5NYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCB0byByZW1vdmUsIGV2ZW4gaWYgRU9GPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWUoKSB7CisgICAgICAgICAgICBTeW5jQWhlYWQoMSk7CisgICAgICAgICAgICBfcHJldmlvdXNFbGVtZW50ID0gRGVxdWV1ZSgpOworICAgICAgICAgICAgX2N1cnJlbnRFbGVtZW50SW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIE1ha2Ugc3VyZSB3ZSBoYXZlICduZWVkJyBlbGVtZW50cyBmcm9tIGN1cnJlbnQgcG9zaXRpb24gcC4gTGFzdCB2YWxpZAorICAgICAgICAgKiAgcCBpbmRleCBpcyBkYXRhLnNpemUoKS0xLiAgcCtuZWVkLTEgaXMgdGhlIGRhdGEgaW5kZXggJ25lZWQnIGVsZW1lbnRzCisgICAgICAgICAqICBhaGVhZC4gIElmIHdlIG5lZWQgMSBlbGVtZW50LCAocCsxLTEpPT1wIG11c3QgYmUgJmx0OyBkYXRhLnNpemUoKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgU3luY0FoZWFkKGludCBuZWVkKSB7CisgICAgICAgICAgICBpbnQgbiA9IChfcCArIG5lZWQgLSAxKSAtIF9kYXRhLkNvdW50ICsgMTsgLy8gaG93IG1hbnkgbW9yZSBlbGVtZW50cyB3ZSBuZWVkPworICAgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgICAgIEZpbGwobik7ICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgZWxlbWVudHM/CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+YWRkIG4gZWxlbWVudHMgdG8gYnVmZmVyPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEZpbGwoaW50IG4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgVCBvID0gTmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoSXNFbmRPZkZpbGUobykpCisgICAgICAgICAgICAgICAgICAgIF9lb2YgPSBvOworCisgICAgICAgICAgICAgICAgX2RhdGEuQWRkKG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNpemUgb2YgZW50aXJlIHN0cmVhbSBpcyB1bmtub3duOyB3ZSBvbmx5IGtub3cgYnVmZmVyIHNpemUgZnJvbSBGYXN0UXVldWU8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgQ291bnQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigic3RyZWFtcyBhcmUgb2YgdW5rbm93biBzaXplIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBUIExUKGludCBrKSB7CisgICAgICAgICAgICBpZiAoayA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoLWspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTeW5jQWhlYWQoayk7CisgICAgICAgICAgICBpZiAoKF9wICsgayAtIDEpID4gX2RhdGEuQ291bnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9lb2Y7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzW2sgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBJbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfY3VycmVudEVsZW1lbnRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkgeworICAgICAgICAgICAgX21hcmtEZXB0aCsrOworICAgICAgICAgICAgX2xhc3RNYXJrZXIgPSBfcDsgLy8gdHJhY2sgd2hlcmUgd2UgYXJlIGluIGJ1ZmZlciwgbm90IGFic29sdXRlIHRva2VuIGluZGV4CisgICAgICAgICAgICByZXR1cm4gX2xhc3RNYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlbGVhc2UoaW50IG1hcmtlcikgeworICAgICAgICAgICAgX21hcmtEZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoaW50IG1hcmtlcikgeworICAgICAgICAgICAgU2VlayhtYXJrZXIpOworICAgICAgICAgICAgUmVsZWFzZShtYXJrZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoKSB7CisgICAgICAgICAgICBTZWVrKF9sYXN0TWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFNlZWsgdG8gYSAwLWluZGV4ZWQgcG9zaXRpb24gd2l0aGluIGRhdGEgYnVmZmVyLiAgQ2FuJ3QgaGFuZGxlCisgICAgICAgICAqICBjYXNlIHdoZXJlIHlvdSBzZWVrIGJleW9uZCBlbmQgb2YgZXhpc3RpbmcgYnVmZmVyLiAgTm9ybWFsbHkgdXNlZAorICAgICAgICAgKiAgdG8gc2VlayBiYWNrd2FyZHMgaW4gdGhlIGJ1ZmZlci4gRG9lcyBub3QgZm9yY2UgbG9hZGluZyBvZiBub2Rlcy4KKyAgICAgICAgICogIERvZXNuJ3Qgc2VlIHRvIGFic29sdXRlIHBvc2l0aW9uIGluIGlucHV0IHN0cmVhbSBzaW5jZSB0aGlzIHN0cmVhbQorICAgICAgICAgKiAgaXMgdW5idWZmZXJlZC4gU2Vla3Mgb25seSBpbnRvIG91ciBtb3Zpbmcgd2luZG93IG9mIGVsZW1lbnRzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZWVrKGludCBpbmRleCkgeworICAgICAgICAgICAgX3AgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIFQgTEIoaW50IGspIHsKKyAgICAgICAgICAgIGlmIChrID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmV2aW91c0VsZW1lbnQ7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oImNhbid0IGxvb2sgYmFja3dhcmRzIG1vcmUgdGhhbiBvbmUgdG9rZW4gaW4gdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLk1pc2MvU3RhdHMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL1N0YXRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2JiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5NaXNjL1N0YXRzLmNzCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLk1pc2MgeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnM7CisKKyAgICB1c2luZyBNYXRoID0gU3lzdGVtLk1hdGg7CisKKyAgICAvKiogPHN1bW1hcnk+U3RhdHMgcm91dGluZXMgbmVlZGVkIGJ5IHByb2ZpbGVyIGV0Yy4uLjwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgbm90ZSB0aGF0IHRoZXNlIHJvdXRpbmVzIHJldHVybiAwLjAgaWYgbm8gdmFsdWVzIGV4aXN0IGluIHRoZSBYW10KKyAgICAgKiAgd2hpY2ggaXMgbm90ICJjb3JyZWN0IiwgYnV0IGl0IGlzIHVzZWZ1bCBzbyBJIGRvbid0IGdlbmVyYXRlIE5hTgorICAgICAqICBpbiBteSBvdXRwdXQKKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBTdGF0cyB7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgQU5UTFJXT1JLU19ESVIgPSAiYW50bHJ3b3JrcyI7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkNvbXB1dGUgdGhlIHNhbXBsZSAodW5iaWFzZWQgZXN0aW1hdG9yKSBzdGFuZGFyZCBkZXZpYXRpb24gZm9sbG93aW5nOjwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgQ29tcHV0aW5nIERldmlhdGlvbnM6IFN0YW5kYXJkIEFjY3VyYWN5CisgICAgICAgICAqICBUb255IEYuIENoYW4gYW5kIEpvaG4gR3JlZ2cgTGV3aXMKKyAgICAgICAgICogIFN0YW5mb3JkIFVuaXZlcnNpdHkKKyAgICAgICAgICogIENvbW11bmljYXRpb25zIG9mIEFDTSBTZXB0ZW1iZXIgMTk3OSBvZiBWb2x1bWUgMjIgdGhlIEFDTSBOdW1iZXIgOQorICAgICAgICAgKgorICAgICAgICAgKiAgVGhlICJ0d28tcGFzcyIgbWV0aG9kIGZyb20gdGhlIHBhcGVyOyBzdXBwb3NlZCB0byBoYXZlIGJldHRlcgorICAgICAgICAgKiAgbnVtZXJpY2FsIHByb3BlcnRpZXMgdGhhbiB0aGUgdGV4dGJvb2sgc3VtbWF0aW9uL3NxcnQuICBUbyBtZQorICAgICAgICAgKiAgdGhpcyBsb29rcyBsaWtlIHRoZSB0ZXh0Ym9vayBtZXRob2QsIGJ1dCBJIGFpbid0IG5vIG51bWVyaWNhbAorICAgICAgICAgKiAgbWV0aG9kcyBndXkuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBTdGRkZXYoaW50W10gWCkgeworICAgICAgICAgICAgaW50IG0gPSBYLkxlbmd0aDsKKyAgICAgICAgICAgIGlmIChtIDw9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvdWJsZSB4YmFyID0gRW51bWVyYWJsZUV4dGVuc2lvbnMuQXZlcmFnZShYKTsKKyAgICAgICAgICAgIGRvdWJsZSBzMiA9IDAuMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CisgICAgICAgICAgICAgICAgczIgKz0gKFhbaV0gLSB4YmFyKSAqIChYW2ldIC0geGJhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMiA9IHMyIC8gKG0gLSAxKTsKKyAgICAgICAgICAgIHJldHVybiBNYXRoLlNxcnQoczIpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIFN0ZGRldihMaXN0PGludD4gWCkgeworICAgICAgICAgICAgaW50IG0gPSBYLkNvdW50OworICAgICAgICAgICAgaWYgKG0gPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIHhiYXIgPSBFbnVtZXJhYmxlRXh0ZW5zaW9ucy5BdmVyYWdlKFgpOworICAgICAgICAgICAgZG91YmxlIHMyID0gMC4wOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzMiArPSAoWFtpXSAtIHhiYXIpICogKFhbaV0gLSB4YmFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMyID0gczIgLyAobSAtIDEpOworICAgICAgICAgICAgcmV0dXJuIE1hdGguU3FydChzMik7CisgICAgICAgIH0KKworI2lmIERFQlVHCisgICAgICAgIC8qKiA8c3VtbWFyeT5Db21wdXRlIHRoZSBzYW1wbGUgbWVhbjwvc3VtbWFyeT4gKi8KKyAgICAgICAgW1N5c3RlbS5PYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgYXZnKGludFtdIFgpIHsKKyAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlRXh0ZW5zaW9ucy5BdmVyYWdlKEVudW1lcmFibGVFeHRlbnNpb25zLkRlZmF1bHRJZkVtcHR5KFgsIDApKTsKKyAgICAgICAgfQorCisgICAgICAgIFtTeXN0ZW0uT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IG1pbihpbnRbXSBYKSB7CisgICAgICAgICAgICByZXR1cm4gRW51bWVyYWJsZUV4dGVuc2lvbnMuTWluKEVudW1lcmFibGVFeHRlbnNpb25zLkRlZmF1bHRJZkVtcHR5KFgsIGludC5NYXhWYWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgW1N5c3RlbS5PYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgbWF4KGludFtdIFgpIHsKKyAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlRXh0ZW5zaW9ucy5NYXgoRW51bWVyYWJsZUV4dGVuc2lvbnMuRGVmYXVsdElmRW1wdHkoWCwgaW50Lk1pblZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICBbU3lzdGVtLk9ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBzdW0oaW50W10gWCkgeworICAgICAgICAgICAgcmV0dXJuIEVudW1lcmFibGVFeHRlbnNpb25zLlN1bShYKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFdyaXRlUmVwb3J0KHN0cmluZyBmaWxlbmFtZSwgc3RyaW5nIGRhdGEpIHsKKyAgICAgICAgICAgIHN0cmluZyBhYnNvbHV0ZUZpbGVuYW1lID0gR2V0QWJzb2x1dGVGaWxlTmFtZShmaWxlbmFtZSk7CisKKyAgICAgICAgICAgIFN5c3RlbS5JTy5EaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KFN5c3RlbS5JTy5QYXRoLkdldERpcmVjdG9yeU5hbWUoYWJzb2x1dGVGaWxlbmFtZSkpOworICAgICAgICAgICAgU3lzdGVtLklPLkZpbGUuQXBwZW5kQWxsVGV4dChhYnNvbHV0ZUZpbGVuYW1lLCBkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFic29sdXRlRmlsZU5hbWUoc3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgICAgICBzdHJpbmcgcGVyc29uYWxGb2xkZXIgPSBTeXN0ZW0uRW52aXJvbm1lbnQuR2V0Rm9sZGVyUGF0aChTeXN0ZW0uRW52aXJvbm1lbnQuU3BlY2lhbEZvbGRlci5QZXJzb25hbCk7CisgICAgICAgICAgICByZXR1cm4gcGVyc29uYWxGb2xkZXIgKyBTeXN0ZW0uSU8uUGF0aC5EaXJlY3RvcnlTZXBhcmF0b3JDaGFyICsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSV09SS1NfRElSICsgU3lzdGVtLklPLlBhdGguRGlyZWN0b3J5U2VwYXJhdG9yQ2hhciArCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvQmFzZVRyZWUuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0Jhc2VUcmVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWU0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0Jhc2VUcmVlLmNzCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUgeworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGdlbmVyaWMgdHJlZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG5vIHBheWxvYWQuICBZb3UgbXVzdCBzdWJjbGFzcyB0bworICAgICAqICBhY3R1YWxseSBoYXZlIGFueSB1c2VyIGRhdGEuICBBTlRMUiB2MyB1c2VzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcHByb2FjaAorICAgICAqICBpbnN0ZWFkIG9mIHRoZSBjaGlsZC1zaWJsaW5nIGFwcHJvYWNoIGluIHYyLiAgQSBmbGF0IHRyZWUgKGEgbGlzdCkgaXMKKyAgICAgKiAgYW4gZW1wdHkgbm9kZSB3aG9zZSBjaGlsZHJlbiByZXByZXNlbnQgdGhlIGxpc3QuICBBbiBlbXB0eSwgYnV0CisgICAgICogIG5vbi1udWxsIG5vZGUgaXMgY2FsbGVkICJuaWwiLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VUcmVlIDogSVRyZWUgeworICAgICAgICBMaXN0PElUcmVlPiBjaGlsZHJlbjsKKworICAgICAgICBwdWJsaWMgQmFzZVRyZWUoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBmcm9tIGFuIGV4aXN0aW5nIG5vZGUgZG9lcyBub3RoaW5nIGZvciBCYXNlVHJlZQorICAgICAgICAgKiAgYXMgdGhlcmUgYXJlIG5vIGZpZWxkcyBvdGhlciB0aGFuIHRoZSBjaGlsZHJlbiBsaXN0LCB3aGljaCBjYW5ub3QKKyAgICAgICAgICogIGJlIGNvcGllZCBhcyB0aGUgY2hpbGRyZW4gYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhpcyBub2RlLiAKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCYXNlVHJlZShJVHJlZSBub2RlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHZXQgdGhlIGNoaWxkcmVuIGludGVybmFsIExpc3Q7IG5vdGUgdGhhdCBpZiB5b3UgZGlyZWN0bHkgbWVzcyB3aXRoCisgICAgICAgICAqICB0aGUgbGlzdCwgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUcmVlPiBDaGlsZHJlbiB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gSVRyZWUgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBDaGlsZENvdW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgaWYgKENoaWxkcmVuID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgcmV0dXJuIENoaWxkcmVuLkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgcGFyZW50IHBvaW50ZXJzLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRyZWUgUGFyZW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBDaGlsZEluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBJc05pbCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgVG9rZW5TdGFydEluZGV4IHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgVG9rZW5TdG9wSW5kZXggeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBUeXBlIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzdHJpbmcgVGV4dCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTGluZSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ2hhclBvc2l0aW9uSW5MaW5lIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZSBHZXRDaGlsZChpbnQgaSkgeworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgaSA+PSBjaGlsZHJlbi5Db3VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRyZWUgR2V0Rmlyc3RDaGlsZFdpdGhUeXBlKGludCB0eXBlKSB7CisgICAgICAgICAgICBmb3JlYWNoIChJVHJlZSBjaGlsZCBpbiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5UeXBlID09IHR5cGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+QWRkIHQgYXMgY2hpbGQgb2YgdGhpcyBub2RlLjwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgICAgICAgICAqICBhbmQgY2hpbGQgaXNOaWwgdGhlbiB0aGlzIHJvdXRpbmUgbW92ZXMgY2hpbGRyZW4gdG8gdCB2aWEKKyAgICAgICAgICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQWRkQ2hpbGQoSVRyZWUgdCkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFkZCBjaGlsZCAiK3QudG9TdHJpbmdUcmVlKCkrIiAiK3RoaXMudG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4aXN0aW5nIGNoaWxkcmVuOiAiK2NoaWxkcmVuKTsKKyAgICAgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGRvIG5vdGhpbmcgdXBvbiBhZGRDaGlsZChudWxsKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQuSXNOaWwpIHsKKyAgICAgICAgICAgICAgICAvLyB0IGlzIGFuIGVtcHR5IG5vZGUgcG9zc2libHkgd2l0aCBjaGlsZHJlbgorICAgICAgICAgICAgICAgIEJhc2VUcmVlIGNoaWxkVHJlZSA9IHQgYXMgQmFzZVRyZWU7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkVHJlZSAhPSBudWxsICYmIHRoaXMuY2hpbGRyZW4gIT0gbnVsbCAmJiB0aGlzLmNoaWxkcmVuID09IGNoaWxkVHJlZS5jaGlsZHJlbikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJhdHRlbXB0IHRvIGFkZCBjaGlsZCBsaXN0IHRvIGl0c2VsZiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBqdXN0IGFkZCBhbGwgb2YgY2hpbGRUcmVlJ3MgY2hpbGRyZW4gdG8gdGhpcworICAgICAgICAgICAgICAgIGlmICh0LkNoaWxkQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICE9IG51bGwgfHwgY2hpbGRUcmVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IENyZWF0ZUNoaWxkcmVuTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGNvcHksIHRoaXMgaGFzIGNoaWxkcmVuIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gdC5DaGlsZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHJlZSBjID0gdC5HZXRDaGlsZChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLkFkZChjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZG91YmxlLWxpbmsgc3R1ZmYgZm9yIGVhY2ggY2hpbGQgb2YgbmlsIHJvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLlBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5DaGlsZEluZGV4ID0gY2hpbGRyZW4uQ291bnQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2hpbGRyZW4gZm9yIHRoaXMgYnV0IHQgaXMgYSBCYXNlVHJlZSB3aXRoIGNoaWxkcmVuOworICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBzZXQgcG9pbnRlciBjYWxsIGdlbmVyYWwgZnJlc2hlbmVyIHJvdXRpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZFRyZWUuY2hpbGRyZW47CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY2hpbGQgaXMgbm90IG5pbCAoZG9uJ3QgY2FyZSBhYm91dCBjaGlsZHJlbikKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IENyZWF0ZUNoaWxkcmVuTGlzdCgpOyAvLyBjcmVhdGUgY2hpbGRyZW4gbGlzdCBvbiBkZW1hbmQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uQWRkKHQpOworICAgICAgICAgICAgICAgIHQuUGFyZW50ID0gdGhpczsKKyAgICAgICAgICAgICAgICB0LkNoaWxkSW5kZXggPSBjaGlsZHJlbi5Db3VudCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vdyBjaGlsZHJlbiBhcmU6ICIrY2hpbGRyZW4pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkFkZCBhbGwgZWxlbWVudHMgb2Yga2lkcyBsaXN0IGFzIGNoaWxkcmVuIG9mIHRoaXMgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRDaGlsZHJlbihJRW51bWVyYWJsZTxJVHJlZT4ga2lkcykgeworICAgICAgICAgICAgaWYgKGtpZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJraWRzIik7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKElUcmVlIHQgaW4ga2lkcykKKyAgICAgICAgICAgICAgICBBZGRDaGlsZCh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0Q2hpbGQoaW50IGksIElUcmVlIHQpIHsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJpIik7CisKKyAgICAgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodC5Jc05pbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHNpbmdsZSBjaGlsZCB0byBhIGxpc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBDcmVhdGVDaGlsZHJlbkxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdDsKKyAgICAgICAgICAgIHQuUGFyZW50ID0gdGhpczsKKyAgICAgICAgICAgIHQuQ2hpbGRJbmRleCA9IGk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRGVsZXRlQ2hpbGQoaW50IGkpIHsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJpIik7CisgICAgICAgICAgICBpZiAoaSA+PSBDaGlsZENvdW50KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgSVRyZWUga2lsbGVkID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBjaGlsZHJlbi5SZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIHdhbGsgcmVzdCBhbmQgZGVjcmVtZW50IHRoZWlyIGNoaWxkIGluZGV4ZXMKKyAgICAgICAgICAgIHRoaXMuRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhpKTsKKyAgICAgICAgICAgIHJldHVybiBraWxsZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKyAgICAgICAgICogIGEgbGlzdCAobmlsLXJvb3QgdHJlZSkuICBudW0gb2YgY2hpbGRyZW4gY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlLgorICAgICAgICAgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgICAgICAgICAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZUNoaWxkcmVuKGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGlmIChzdGFydENoaWxkSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChzdG9wQ2hpbGRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0Iik7CisgICAgICAgICAgICBpZiAoc3RvcENoaWxkSW5kZXggPCBzdGFydENoaWxkSW5kZXgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlcGxhY2VDaGlsZHJlbiAiK3N0YXJ0Q2hpbGRJbmRleCsiLCAiK3N0b3BDaGlsZEluZGV4KworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCAiKygoQmFzZVRyZWUpdCkudG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbj0iK3RvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXhlcyBpbnZhbGlkOyBubyBjaGlsZHJlbiBpbiBsaXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmVwbGFjaW5nSG93TWFueSA9IHN0b3BDaGlsZEluZGV4IC0gc3RhcnRDaGlsZEluZGV4ICsgMTsKKyAgICAgICAgICAgIGludCByZXBsYWNpbmdXaXRoSG93TWFueTsKKyAgICAgICAgICAgIElUcmVlIG5ld1RyZWUgPSAoSVRyZWUpdDsKKyAgICAgICAgICAgIExpc3Q8SVRyZWU+IG5ld0NoaWxkcmVuID0gbnVsbDsKKyAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0byBhIGxpc3Qgb2YgY2hpbGRyZW4gdG8gYWRkOiBuZXdDaGlsZHJlbgorICAgICAgICAgICAgaWYgKG5ld1RyZWUuSXNOaWwpIHsKKyAgICAgICAgICAgICAgICBCYXNlVHJlZSBiYXNlVHJlZSA9IG5ld1RyZWUgYXMgQmFzZVRyZWU7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VUcmVlICE9IG51bGwgJiYgYmFzZVRyZWUuY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbiA9IGJhc2VUcmVlLmNoaWxkcmVuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuID0gQ3JlYXRlQ2hpbGRyZW5MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gbmV3VHJlZS5DaGlsZENvdW50OworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLkFkZChuZXdUcmVlLkdldENoaWxkKGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuID0gbmV3IExpc3Q8SVRyZWU+KDEpOworICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLkFkZChuZXdUcmVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGxhY2luZ1dpdGhIb3dNYW55ID0gbmV3Q2hpbGRyZW4uQ291bnQ7CisgICAgICAgICAgICBpbnQgbnVtTmV3Q2hpbGRyZW4gPSBuZXdDaGlsZHJlbi5Db3VudDsKKyAgICAgICAgICAgIGludCBkZWx0YSA9IHJlcGxhY2luZ0hvd01hbnkgLSByZXBsYWNpbmdXaXRoSG93TWFueTsKKyAgICAgICAgICAgIC8vIGlmIHNhbWUgbnVtYmVyIG9mIG5vZGVzLCBkbyBkaXJlY3QgcmVwbGFjZQorICAgICAgICAgICAgaWYgKGRlbHRhID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgaiA9IDA7IC8vIGluZGV4IGludG8gbmV3IGNoaWxkcmVuCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0Q2hpbGRJbmRleDsgaSA8PSBzdG9wQ2hpbGRJbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIElUcmVlIGNoaWxkID0gbmV3Q2hpbGRyZW5bal07CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gY2hpbGQ7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLlBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLkNoaWxkSW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBmZXdlciBuZXcgbm9kZXMgdGhhbiB0aGVyZSB3ZXJlCisgICAgICAgICAgICAgICAgLy8gc2V0IGNoaWxkcmVuIGFuZCB0aGVuIGRlbGV0ZSBleHRyYQorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtTmV3Q2hpbGRyZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltzdGFydENoaWxkSW5kZXggKyBqXSA9IG5ld0NoaWxkcmVuW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgaW5kZXhUb0RlbGV0ZSA9IHN0YXJ0Q2hpbGRJbmRleCArIG51bU5ld0NoaWxkcmVuOworICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSBpbmRleFRvRGVsZXRlOyBjIDw9IHN0b3BDaGlsZEluZGV4OyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIHNhbWUgaW5kZXgsIHNoaWZ0aW5nIGV2ZXJ5Ym9keSBkb3duIGVhY2ggdGltZQorICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5SZW1vdmVBdChpbmRleFRvRGVsZXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhzdGFydENoaWxkSW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBtb3JlIG5ldyBub2RlcyB0aGFuIHdlcmUgdGhlcmUgYmVmb3JlCisgICAgICAgICAgICAgICAgLy8gZmlsbCBpbiBhcyBtYW55IGNoaWxkcmVuIGFzIHdlIGNhbiAocmVwbGFjaW5nSG93TWFueSkgdy9vIG1vdmluZyBkYXRhCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXBsYWNpbmdIb3dNYW55OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5bc3RhcnRDaGlsZEluZGV4ICsgal0gPSBuZXdDaGlsZHJlbltqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG51bVRvSW5zZXJ0ID0gcmVwbGFjaW5nV2l0aEhvd01hbnkgLSByZXBsYWNpbmdIb3dNYW55OworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSByZXBsYWNpbmdIb3dNYW55OyBqIDwgcmVwbGFjaW5nV2l0aEhvd01hbnk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5JbnNlcnQoc3RhcnRDaGlsZEluZGV4ICsgaiwgbmV3Q2hpbGRyZW5bal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKHN0YXJ0Q2hpbGRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigib3V0PSIrdG9TdHJpbmdUcmVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk92ZXJyaWRlIGluIGEgc3ViY2xhc3MgdG8gY2hhbmdlIHRoZSBpbXBsIG9mIGNoaWxkcmVuIGxpc3Q8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIExpc3Q8SVRyZWU+IENyZWF0ZUNoaWxkcmVuTGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdDxJVHJlZT4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggdmFsdWVzIGZvciBhbGwgY2hpbGQgb2YgdDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkgeworICAgICAgICAgICAgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhpbnQgb2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgbiA9IENoaWxkQ291bnQ7CisgICAgICAgICAgICBmb3IgKGludCBjID0gb2Zmc2V0OyBjIDwgbjsgYysrKSB7CisgICAgICAgICAgICAgICAgSVRyZWUgY2hpbGQgPSBHZXRDaGlsZChjKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5DaGlsZEluZGV4ID0gYzsKKyAgICAgICAgICAgICAgICBjaGlsZC5QYXJlbnQgPSB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpIHsKKyAgICAgICAgICAgIFNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKG51bGwsIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoSVRyZWUgcGFyZW50LCBpbnQgaSkgeworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSB0aGlzLlBhcmVudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJwYXJlbnRzIGRvbid0IG1hdGNoOyBleHBlY3RlZCAiICsgcGFyZW50ICsgIiBmb3VuZCAiICsgdGhpcy5QYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgIT0gdGhpcy5DaGlsZEluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oImNoaWxkIGluZGV4ZXMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICIgKyBpICsgIiBmb3VuZCAiICsgdGhpcy5DaGlsZEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuID0gdGhpcy5DaGlsZENvdW50OworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBuOyBjKyspIHsKKyAgICAgICAgICAgICAgICBCYXNlVHJlZSBjaGlsZCA9IChCYXNlVHJlZSl0aGlzLkdldENoaWxkKGMpOworICAgICAgICAgICAgICAgIGNoaWxkLlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKHRoaXMsIGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldhbGsgdXB3YXJkcyBsb29raW5nIGZvciBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSGFzQW5jZXN0b3IoaW50IHR0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gR2V0QW5jZXN0b3IodHR5cGUpICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+V2FsayB1cHdhcmRzIGFuZCBnZXQgZmlyc3QgYW5jZXN0b3Igd2l0aCB0aGlzIHRva2VuIHR5cGUuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZSBHZXRBbmNlc3RvcihpbnQgdHR5cGUpIHsKKyAgICAgICAgICAgIElUcmVlIHQgPSB0aGlzOworICAgICAgICAgICAgdCA9IHQuUGFyZW50OworICAgICAgICAgICAgd2hpbGUgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh0LlR5cGUgPT0gdHR5cGUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgICAgIHQgPSB0LlBhcmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIGEgbGlzdCBvZiBhbGwgYW5jZXN0b3JzIG9mIHRoaXMgbm9kZS4gIFRoZSBmaXJzdCBub2RlIG9mCisgICAgICAgICAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUcmVlPiBHZXRBbmNlc3RvcnMoKSB7CisgICAgICAgICAgICBpZiAoUGFyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIExpc3Q8SVRyZWU+IGFuY2VzdG9ycyA9IG5ldyBMaXN0PElUcmVlPigpOworICAgICAgICAgICAgSVRyZWUgdCA9IHRoaXM7CisgICAgICAgICAgICB0ID0gdC5QYXJlbnQ7CisgICAgICAgICAgICB3aGlsZSAodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYW5jZXN0b3JzLkluc2VydCgwLCB0KTsgLy8gaW5zZXJ0IGF0IHN0YXJ0CisgICAgICAgICAgICAgICAgdCA9IHQuUGFyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9yczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5QcmludCBvdXQgYSB3aG9sZSB0cmVlIG5vdCBqdXN0IGEgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nVHJlZSgpIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKCFJc05pbCkgeworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIigiKTsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHRoaXMuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGNoaWxkcmVuICE9IG51bGwgJiYgaSA8IGNoaWxkcmVuLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBJVHJlZSB0ID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoJyAnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCh0LlRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghSXNOaWwpIHsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+T3ZlcnJpZGUgdG8gc2F5IGhvdyBhIG5vZGUgKG5vdCBhIHRyZWUpIHNob3VsZCBsb29rIGFzIHRleHQ8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhYnN0cmFjdCBzdHJpbmcgVG9TdHJpbmcoKTsKKworICAgICAgICAjcmVnaW9uIFRyZWUgTWVtYmVycworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVRyZWUgRHVwTm9kZSgpOworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9CYXNlVHJlZUFkYXB0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0Jhc2VUcmVlQWRhcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmEzOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9CYXNlVHJlZUFkYXB0b3IuY3MKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIElEaWN0aW9uYXJ5ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5OworICAgIHVzaW5nIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiA9IFN5c3RlbS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CisKKyAgICAvKiogPHN1bW1hcnk+QSBUcmVlQWRhcHRvciB0aGF0IHdvcmtzIHdpdGggYW55IFRyZWUgaW1wbGVtZW50YXRpb24uPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHJlZUFkYXB0b3IgOiBJVHJlZUFkYXB0b3IgeworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSgpIGlzIG5vdCBhbHdheXMgdW5pcXVlOyB3ZSBoYXZlIHRvCisgICAgICAgICAqICB0cmFjayBvdXJzZWx2ZXMuICBUaGF0J3Mgb2ssIGl0J3Mgb25seSBmb3IgZGVidWdnaW5nLCB0aG91Z2ggaXQncworICAgICAgICAgKiAgZXhwZW5zaXZlOiB3ZSBoYXZlIHRvIGNyZWF0ZSBhIGhhc2h0YWJsZSB3aXRoIGFsbCB0cmVlIG5vZGVzIGluIGl0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIElEaWN0aW9uYXJ5PG9iamVjdCwgaW50PiB0cmVlVG9VbmlxdWVJRE1hcDsKKyAgICAgICAgcHJvdGVjdGVkIGludCB1bmlxdWVOb2RlSUQgPSAxOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBOaWwoKSB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ3JlYXRlIHRyZWUgbm9kZSB0aGF0IGhvbGRzIHRoZSBzdGFydCBhbmQgc3RvcCB0b2tlbnMgYXNzb2NpYXRlZAorICAgICAgICAgKiAgd2l0aCBhbiBlcnJvci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IHNwZWNpZnkgeW91ciBvd24ga2luZCBvZiB0cmVlIG5vZGVzLCB5b3Ugd2lsbCBsaWtlbHkgaGF2ZSB0bworICAgICAgICAgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIENvbW1vblRyZWUgcmV0dXJucyBUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUKKyAgICAgICAgICogIGlmIG5vIHRva2VuIHBheWxvYWQgYnV0IHlvdSBtaWdodCBoYXZlIHRvIHNldCB0b2tlbiB0eXBlIGZvciBkaWZmCisgICAgICAgICAqICBub2RlIHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqICBZb3UgZG9uJ3QgaGF2ZSB0byBzdWJjbGFzcyBDb21tb25FcnJvck5vZGU7IHlvdSB3aWxsIGxpa2VseSBuZWVkIHRvCisgICAgICAgICAqICBzdWJjbGFzcyB5b3VyIG93biB0cmVlIG5vZGUgY2xhc3MgdG8gYXZvaWQgY2xhc3MgY2FzdCBleGNlcHRpb24uCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRXJyb3JOb2RlKElUb2tlblN0cmVhbSBpbnB1dCwgSVRva2VuIHN0YXJ0LCBJVG9rZW4gc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQ29tbW9uRXJyb3JOb2RlIHQgPSBuZXcgQ29tbW9uRXJyb3JOb2RlKGlucHV0LCBzdGFydCwgc3RvcCwgZSk7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuaW5nIGVycm9yIG5vZGUgJyIrdCsiJyBAaW5kZXg9IitpbnB1dC5pbmRleCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBJc05pbChvYmplY3QgdHJlZSkgeworICAgICAgICAgICAgcmV0dXJuICgoSVRyZWUpdHJlZSkuSXNOaWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwVHJlZShvYmplY3QgdHJlZSkgeworICAgICAgICAgICAgcmV0dXJuIER1cFRyZWUodHJlZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAgICAgICAgICogIHRyZWUgKG5vdCBqdXN0IElUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgICAgICAgICAqICBub3QgdGhlIHRyZWUgbm9kZSByb3V0aW5lcyB0byBkbyB0aGUgY29uc3RydWN0aW9uLiAgCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwVHJlZShvYmplY3QgdCwgb2JqZWN0IHBhcmVudCkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqZWN0IG5ld1RyZWUgPSBEdXBOb2RlKHQpOworICAgICAgICAgICAgLy8gZW5zdXJlIG5ldyBzdWJ0cmVlIHJvb3QgaGFzIHBhcmVudC9jaGlsZCBpbmRleCBzZXQKKyAgICAgICAgICAgIFNldENoaWxkSW5kZXgobmV3VHJlZSwgR2V0Q2hpbGRJbmRleCh0KSk7IC8vIHNhbWUgaW5kZXggaW4gbmV3IHRyZWUKKyAgICAgICAgICAgIFNldFBhcmVudChuZXdUcmVlLCBwYXJlbnQpOworICAgICAgICAgICAgaW50IG4gPSBHZXRDaGlsZENvdW50KHQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBHZXRDaGlsZCh0LCBpKTsKKyAgICAgICAgICAgICAgICBvYmplY3QgbmV3U3ViVHJlZSA9IER1cFRyZWUoY2hpbGQsIHQpOworICAgICAgICAgICAgICAgIEFkZENoaWxkKG5ld1RyZWUsIG5ld1N1YlRyZWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld1RyZWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgICAgICAgICAqICBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAgICAgICAgICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHlvdSBjYW4gZGVjaWRlIGl0IGlzIG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB2aWEKKyAgICAgICAgICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAgICAgICAgICogIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZAorICAgICAgICAgKiAgQVNUcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQWRkQ2hpbGQob2JqZWN0IHQsIG9iamVjdCBjaGlsZCkgeworICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKChJVHJlZSl0KS5BZGRDaGlsZCgoSVRyZWUpY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAgICAgICAgICogIElmIG5vdCBhIG5pbCByb290LCBtYWtlIG9sZFJvb3QgYSBjaGlsZCBvZiBuZXdSb290LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1yIHlpZWxkcyBeKHIgYSBiIGMpCisgICAgICAgICAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAgICAgICAgICoKKyAgICAgICAgICogIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorICAgICAgICAgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIGEgYiBjKQorICAgICAgICAgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgb2xkUm9vdCB3YXMgbnVsbCwgaXQncyBvaywganVzdCByZXR1cm4gbmV3Um9vdCAoZXZlbiBpZiBpc05pbCkuCisgICAgICAgICAqCisgICAgICAgICAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICAgICAgICAgKiAgICBvbGQ9bnVsbCwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKG5pbCByKQorICAgICAgICAgKgorICAgICAgICAgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICAgICAgICAgKiAgc2ltcGxlIG5vZGUgb3IgbmlsIHJvb3Qgd2l0aCBhIHNpbmdsZSBjaGlsZCBub2RlLS1pdCBtdXN0IGJlIGEgcm9vdAorICAgICAgICAgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogIEJlIGFkdmlzZWQgdGhhdCBpdCdzIG9rIGZvciBuZXdSb290IHRvIHBvaW50IGF0IG9sZFJvb3QncworICAgICAgICAgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAgICAgICAgICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgICAgICAgICAqICBlZmZpY2llbmN5LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEJlY29tZVJvb3Qob2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290KSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYmVjb21lcm9vdCBuZXcgIituZXdSb290LnRvU3RyaW5nKCkrIiBvbGQgIitvbGRSb290KTsKKyAgICAgICAgICAgIElUcmVlIG5ld1Jvb3RUcmVlID0gKElUcmVlKW5ld1Jvb3Q7CisgICAgICAgICAgICBJVHJlZSBvbGRSb290VHJlZSA9IChJVHJlZSlvbGRSb290OworICAgICAgICAgICAgaWYgKG9sZFJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdSb290OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaGFuZGxlIF4obmlsIHJlYWwtbm9kZSkKKyAgICAgICAgICAgIGlmIChuZXdSb290VHJlZS5Jc05pbCkgeworICAgICAgICAgICAgICAgIGludCBuYyA9IG5ld1Jvb3RUcmVlLkNoaWxkQ291bnQ7CisgICAgICAgICAgICAgICAgaWYgKG5jID09IDEpCisgICAgICAgICAgICAgICAgICAgIG5ld1Jvb3RUcmVlID0gKElUcmVlKW5ld1Jvb3RUcmVlLkdldENoaWxkKDApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5jID4gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRyZWUgcnVuIHRpbWUgZXhjZXB0aW9ucyBoaWVyYXJjaHkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigibW9yZSB0aGFuIG9uZSBub2RlIGFzIHJvb3QgKFRPRE86IG1ha2UgZXhjZXB0aW9uIGhpZXJhcmNoeSkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhZGQgb2xkUm9vdCB0byBuZXdSb290OyBhZGRDaGlsZCB0YWtlcyBjYXJlIG9mIGNhc2Ugd2hlcmUgb2xkUm9vdAorICAgICAgICAgICAgLy8gaXMgYSBmbGF0IGxpc3QgKGkuZS4sIG5pbC1yb290ZWQgdHJlZSkuICBBbGwgY2hpbGRyZW4gb2Ygb2xkUm9vdAorICAgICAgICAgICAgLy8gYXJlIGFkZGVkIHRvIG5ld1Jvb3QuCisgICAgICAgICAgICBuZXdSb290VHJlZS5BZGRDaGlsZChvbGRSb290VHJlZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3Um9vdFRyZWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+VHJhbnNmb3JtIF4obmlsIHgpIHRvIHggYW5kIG5pbCB0byBudWxsPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUnVsZVBvc3RQcm9jZXNzaW5nKG9iamVjdCByb290KSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicnVsZVBvc3RQcm9jZXNzaW5nOiAiKygoVHJlZSlyb290KS50b1N0cmluZ1RyZWUoKSk7CisgICAgICAgICAgICBJVHJlZSByID0gKElUcmVlKXJvb3Q7CisgICAgICAgICAgICBpZiAociAhPSBudWxsICYmIHIuSXNOaWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoci5DaGlsZENvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgciA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLkNoaWxkQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICByID0gKElUcmVlKXIuR2V0Q2hpbGQoMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdob2V2ZXIgaW52b2tlcyBydWxlIHdpbGwgc2V0IHBhcmVudCBhbmQgY2hpbGQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgci5QYXJlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICByLkNoaWxkSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBCZWNvbWVSb290KElUb2tlbiBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCkgeworICAgICAgICAgICAgcmV0dXJuIEJlY29tZVJvb3QoQ3JlYXRlKG5ld1Jvb3QpLCBvbGRSb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoaW50IHRva2VuVHlwZSwgSVRva2VuIGZyb21Ub2tlbikgeworICAgICAgICAgICAgZnJvbVRva2VuID0gQ3JlYXRlVG9rZW4oZnJvbVRva2VuKTsKKyAgICAgICAgICAgIC8vKChDbGFzc2ljVG9rZW4pZnJvbVRva2VuKS5zZXRUeXBlKHRva2VuVHlwZSk7CisgICAgICAgICAgICBmcm9tVG9rZW4uVHlwZSA9IHRva2VuVHlwZTsKKyAgICAgICAgICAgIElUcmVlIHQgPSAoSVRyZWUpQ3JlYXRlKGZyb21Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoaW50IHRva2VuVHlwZSwgSVRva2VuIGZyb21Ub2tlbiwgc3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIGlmIChmcm9tVG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKHRva2VuVHlwZSwgdGV4dCk7CisKKyAgICAgICAgICAgIGZyb21Ub2tlbiA9IENyZWF0ZVRva2VuKGZyb21Ub2tlbik7CisgICAgICAgICAgICBmcm9tVG9rZW4uVHlwZSA9IHRva2VuVHlwZTsKKyAgICAgICAgICAgIGZyb21Ub2tlbi5UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIElUcmVlIHQgPSAoSVRyZWUpQ3JlYXRlKGZyb21Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIElUb2tlbiBmcm9tVG9rZW4gPSBDcmVhdGVUb2tlbih0b2tlblR5cGUsIHRleHQpOworICAgICAgICAgICAgSVRyZWUgdCA9IChJVHJlZSlDcmVhdGUoZnJvbVRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFR5cGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElUcmVlKXQpLlR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFR5cGUob2JqZWN0IHQsIGludCB0eXBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJkb24ndCBrbm93IGVub3VnaCBhYm91dCBUcmVlIG5vZGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRUZXh0KG9iamVjdCB0KSB7CisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5UZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUZXh0KG9iamVjdCB0LCBzdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgVHJlZSBub2RlIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0Q2hpbGQob2JqZWN0IHQsIGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5HZXRDaGlsZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0Q2hpbGQob2JqZWN0IHQsIGludCBpLCBvYmplY3QgY2hpbGQpIHsKKyAgICAgICAgICAgICgoSVRyZWUpdCkuU2V0Q2hpbGQoaSwgKElUcmVlKWNoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBEZWxldGVDaGlsZChvYmplY3QgdCwgaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElUcmVlKXQpLkRlbGV0ZUNoaWxkKGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldENoaWxkQ291bnQob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElUcmVlKXQpLkNoaWxkQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VW5pcXVlSUQob2JqZWN0IG5vZGUpIHsKKyAgICAgICAgICAgIGlmICh0cmVlVG9VbmlxdWVJRE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJlZVRvVW5pcXVlSURNYXAgPSBuZXcgRGljdGlvbmFyeTxvYmplY3QsIGludD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgIGlmICh0cmVlVG9VbmlxdWVJRE1hcC5UcnlHZXRWYWx1ZShub2RlLCBvdXQgaWQpKQorICAgICAgICAgICAgICAgIHJldHVybiBpZDsKKworICAgICAgICAgICAgaWQgPSB1bmlxdWVOb2RlSUQ7CisgICAgICAgICAgICB0cmVlVG9VbmlxdWVJRE1hcFtub2RlXSA9IGlkOworICAgICAgICAgICAgdW5pcXVlTm9kZUlEKys7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgICAgICAvLyBHQyBtYWtlcyB0aGVzZSBub251bmlxdWU6CisgICAgICAgICAgICAvLyByZXR1cm4gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorICAgICAgICAgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgICAgICAgICAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAgICAgICAgICogIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAgICAgICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnkgb3RoZXIgY3JlYXRlVG9rZW4gdmFyaWFudC4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJVG9rZW4gQ3JlYXRlVG9rZW4oaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgICAgICogIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgICAgICAgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgICAgICAgICAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICAgICAgICAgKiAgdG9rZW5zIHRvIEJMT0NLIGV0Yy4uLiAgWW91J2xsIHNlZQorICAgICAgICAgKgorICAgICAgICAgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICAgICAgICAgKgorICAgICAgICAgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVRva2VuIENyZWF0ZVRva2VuKElUb2tlbiBmcm9tVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgQ3JlYXRlKElUb2tlbiBwYXlsb2FkKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBEdXBOb2RlKG9iamVjdCB0cmVlTm9kZSk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJVG9rZW4gR2V0VG9rZW4ob2JqZWN0IHQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMob2JqZWN0IHQsIElUb2tlbiBzdGFydFRva2VuLCBJVG9rZW4gc3RvcFRva2VuKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBHZXRUb2tlblN0YXJ0SW5kZXgob2JqZWN0IHQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IEdldFRva2VuU3RvcEluZGV4KG9iamVjdCB0KTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRQYXJlbnQob2JqZWN0IHQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXRQYXJlbnQob2JqZWN0IHQsIG9iamVjdCBwYXJlbnQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IEdldENoaWxkSW5kZXgob2JqZWN0IHQpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXRDaGlsZEluZGV4KG9iamVjdCB0LCBpbnQgaW5kZXgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZXBsYWNlQ2hpbGRyZW4ob2JqZWN0IHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBvYmplY3QgdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2M2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0J1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uY3MKQEAgLTAsMCArMSw1NTcgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBDb25zb2xlID0gU3lzdGVtLkNvbnNvbGU7CisgICAgdXNpbmcgSUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7CisgICAgdXNpbmcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiA9IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisgICAgLyoqIDxzdW1tYXJ5PkEgYnVmZmVyZWQgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICBOb2RlcyBjYW4gYmUgZnJvbSBhIHRyZWUgb2YgQU5ZIGtpbmQuPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIFRoaXMgbm9kZSBzdHJlYW0gc3Vja3MgYWxsIG5vZGVzIG91dCBvZiB0aGUgdHJlZSBzcGVjaWZpZWQgaW4KKyAgICAgKiAgdGhlIGNvbnN0cnVjdG9yIGR1cmluZyBjb25zdHJ1Y3Rpb24gYW5kIG1ha2VzIHBvaW50ZXJzIGludG8KKyAgICAgKiAgdGhlIHRyZWUgdXNpbmcgYW4gYXJyYXkgb2YgT2JqZWN0IHBvaW50ZXJzLiBUaGUgc3RyZWFtIG5lY2Vzc2FyaWx5CisgICAgICogIGluY2x1ZGVzIHBvaW50ZXJzIHRvIERPV04gYW5kIFVQIGFuZCBFT0Ygbm9kZXMuCisgICAgICoKKyAgICAgKiAgVGhpcyBzdHJlYW0ga25vd3MgaG93IHRvIG1hcmsvcmVsZWFzZSBmb3IgYmFja3RyYWNraW5nLgorICAgICAqCisgICAgICogIFRoaXMgc3RyZWFtIGlzIG1vc3Qgc3VpdGFibGUgZm9yIHRyZWUgaW50ZXJwcmV0ZXJzIHRoYXQgbmVlZCB0bworICAgICAqICBqdW1wIGFyb3VuZCBhIGxvdCBvciBmb3IgdHJlZSBwYXJzZXJzIHJlcXVpcmluZyBzcGVlZCAoYXQgY29zdCBvZiBtZW1vcnkpLgorICAgICAqICBUaGVyZSBpcyBzb21lIGR1cGxpY2F0ZWQgZnVuY3Rpb25hbGl0eSBoZXJlIHdpdGggVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtCisgICAgICogIGJ1dCBqdXN0IGluIGJvb2trZWVwaW5nLCBub3QgdHJlZSB3YWxraW5nIGV0Yy4uLgorICAgICAqCisgICAgICogIFRBUkdFVCBERVZFTE9QRVJTOgorICAgICAqCisgICAgICogIFRoaXMgaXMgdGhlIG9sZCBDb21tb25UcmVlTm9kZVN0cmVhbSB0aGF0IGJ1ZmZlcmVkIHVwIGVudGlyZSBub2RlIHN0cmVhbS4KKyAgICAgKiAgTm8gbmVlZCB0byBpbXBsZW1lbnQgcmVhbGx5IGFzIG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSBpcyBtdWNoIGJldHRlcgorICAgICAqICBhbmQgY292ZXJzIHdoYXQgd2UgbmVlZC4KKyAgICAgKgorICAgICAqICBAc2VlIENvbW1vblRyZWVOb2RlU3RyZWFtCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gOiBJVHJlZU5vZGVTdHJlYW0sIElUb2tlblN0cmVhbUluZm9ybWF0aW9uIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgPSAxMDsKKworICAgICAgICBwcm90ZWN0ZWQgc2VhbGVkIGNsYXNzIFN0cmVhbUl0ZXJhdG9yIDogSUVudW1lcmF0b3I8b2JqZWN0PiB7CisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIF9vdXRlcjsKKyAgICAgICAgICAgIGludCBfaW5kZXg7CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJlYW1JdGVyYXRvcihCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIG91dGVyKSB7CisgICAgICAgICAgICAgICAgX291dGVyID0gb3V0ZXI7CisgICAgICAgICAgICAgICAgX2luZGV4ID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3I8b2JqZWN0PiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgQ3VycmVudCB7CisgICAgICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pbmRleCA8IF9vdXRlci5ub2Rlcy5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3V0ZXIubm9kZXNbX2luZGV4XTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX291dGVyLmVvZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBJRGlzcG9zYWJsZSBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBJRW51bWVyYXRvciBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChfaW5kZXggPCBfb3V0ZXIubm9kZXMuQ291bnQpCisgICAgICAgICAgICAgICAgICAgIF9pbmRleCsrOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9pbmRleCA8IF9vdXRlci5ub2Rlcy5Db3VudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoKSB7CisgICAgICAgICAgICAgICAgX2luZGV4ID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbCB0aGVzZSBuYXZpZ2F0aW9uIG5vZGVzIGFyZSBzaGFyZWQgYW5kIGhlbmNlIHRoZXkKKyAgICAgICAgLy8gY2Fubm90IGNvbnRhaW4gYW55IGxpbmUvY29sdW1uIGluZm8KKworICAgICAgICBwcm90ZWN0ZWQgb2JqZWN0IGRvd247CisgICAgICAgIHByb3RlY3RlZCBvYmplY3QgdXA7CisgICAgICAgIHByb3RlY3RlZCBvYmplY3QgZW9mOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgY29tcGxldGUgbWFwcGluZyBmcm9tIHN0cmVhbSBpbmRleCB0byB0cmVlIG5vZGUuCisgICAgICAgICAqICBUaGlzIGJ1ZmZlciBpbmNsdWRlcyBwb2ludGVycyB0byBET1dOLCBVUCwgYW5kIEVPRiBub2Rlcy4KKyAgICAgICAgICogIEl0IGlzIGJ1aWx0IHVwb24gY3RvciBpbnZvY2F0aW9uLiAgVGhlIGVsZW1lbnRzIGFyZSB0eXBlCisgICAgICAgICAqICBPYmplY3QgYXMgd2UgZG9uJ3Qgd2hhdCB0aGUgdHJlZXMgbG9vayBsaWtlLjwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIExvYWQgdXBvbiBmaXJzdCBuZWVkIG9mIHRoZSBidWZmZXIgc28gd2UgY2FuIHNldCB0b2tlbiB0eXBlcworICAgICAgICAgKiAgb2YgaW50ZXJlc3QgZm9yIHJldmVyc2VJbmRleGluZy4gIFNsb3dzIHVzIGRvd24gYSB3ZWUgYml0IHRvCisgICAgICAgICAqICBkbyBhbGwgb2YgdGhlIGlmIHA9PS0xIHRlc3RpbmcgZXZlcnl3aGVyZSB0aG91Z2guCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSUxpc3Qgbm9kZXM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlB1bGwgbm9kZXMgZnJvbSB3aGljaCB0cmVlPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIG9iamVjdCByb290OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5JRiB0aGlzIHRyZWUgKHJvb3QpIHdhcyBjcmVhdGVkIGZyb20gYSB0b2tlbiBzdHJlYW0sIHRyYWNrIGl0Ljwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIElUb2tlblN0cmVhbSB0b2tlbnM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgdHJlZSBhZGFwdG9yIHdhcyB1c2VkIHRvIGJ1aWxkIHRoZXNlIHRyZWVzPC9zdW1tYXJ5PiAqLworICAgICAgICBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKworICAgICAgICAvKiogPHN1bW1hcnk+UmV1c2Ugc2FtZSBET1dOLCBVUCBuYXZpZ2F0aW9uIG5vZGVzIHVubGVzcyB0aGlzIGlzIHRydWU8L3N1bW1hcnk+ICovCisgICAgICAgIGJvb2wgdW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gZmFsc2U7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBpbmRleCBpbnRvIHRoZSBub2RlcyBsaXN0IG9mIHRoZSBjdXJyZW50IG5vZGUgKG5leHQgbm9kZQorICAgICAgICAgKiAgdG8gY29uc3VtZSkuICBJZiAtMSwgbm9kZXMgYXJyYXkgbm90IGZpbGxlZCB5ZXQuPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBwID0gLTE7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBsYXN0TWFya2VyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5TdGFjayBvZiBpbmRleGVzIHVzZWQgZm9yIHB1c2gvcG9wIGNhbGxzPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8aW50PiBjYWxsczsKKworICAgICAgICBwdWJsaWMgQnVmZmVyZWRUcmVlTm9kZVN0cmVhbShvYmplY3QgdHJlZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSwgdHJlZSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0oSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0cmVlKQorICAgICAgICAgICAgOiB0aGlzKGFkYXB0b3IsIHRyZWUsIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0oSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0cmVlLCBpbnQgaW5pdGlhbEJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIHRoaXMucm9vdCA9IHRyZWU7CisgICAgICAgICAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgICAgICAgICAgbm9kZXMgPSBuZXcgTGlzdDxvYmplY3Q+KGluaXRpYWxCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGRvd24gPSBhZGFwdG9yLkNyZWF0ZShUb2tlblR5cGVzLkRvd24sICJET1dOIik7CisgICAgICAgICAgICB1cCA9IGFkYXB0b3IuQ3JlYXRlKFRva2VuVHlwZXMuVXAsICJVUCIpOworICAgICAgICAgICAgZW9mID0gYWRhcHRvci5DcmVhdGUoVG9rZW5UeXBlcy5FbmRPZkZpbGUsICJFT0YiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHJvcGVydGllcworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBDb3VudCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBDb3VudCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBmaWxsZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBub2Rlcy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBUcmVlU291cmNlIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblN0cmVhbS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU3RyZWFtIFRva2VuU3RyZWFtIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgdG9rZW5zID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZUFkYXB0b3IgVHJlZUFkYXB0b3IgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgYWRhcHRvciA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBVbmlxdWVOYXZpZ2F0aW9uTm9kZXMgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBMYXN0VG9rZW4geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJlZUFkYXB0b3IuR2V0VG9rZW4oTEIoMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIExhc3RSZWFsVG9rZW4geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgSVRva2VuIHRva2VuOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IFRyZWVBZGFwdG9yLkdldFRva2VuKExCKGkpKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICh0b2tlbiAhPSBudWxsICYmIHRva2VuLkxpbmUgPD0gMCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTWF4TG9va0JlaGluZCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWF4VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgLyoqIFdhbGsgdHJlZSB3aXRoIGRlcHRoLWZpcnN0LXNlYXJjaCBhbmQgZmlsbCBub2RlcyBidWZmZXIuCisgICAgICAgICAqICBEb24ndCBkbyBET1dOLCBVUCBub2RlcyBpZiBpdHMgYSBsaXN0ICh0IGlzIGlzTmlsKS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRmlsbEJ1ZmZlcigpIHsKKyAgICAgICAgICAgIEZpbGxCdWZmZXIocm9vdCk7CisgICAgICAgICAgICAvL0NvbnNvbGUuT3V0LldyaXRlTGluZSggInJldkluZGV4PSIgKyB0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAgKTsKKyAgICAgICAgICAgIHAgPSAwOyAvLyBidWZmZXIgb2Ygbm9kZXMgaW50aWFsaXplZCBub3cKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRmlsbEJ1ZmZlcihvYmplY3QgdCkgeworICAgICAgICAgICAgYm9vbCBuaWwgPSBhZGFwdG9yLklzTmlsKHQpOworICAgICAgICAgICAgaWYgKCFuaWwpIHsKKyAgICAgICAgICAgICAgICBub2Rlcy5BZGQodCk7IC8vIGFkZCB0aGlzIG5vZGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZCBET1dOIG5vZGUgaWYgdCBoYXMgY2hpbGRyZW4KKyAgICAgICAgICAgIGludCBuID0gYWRhcHRvci5HZXRDaGlsZENvdW50KHQpOworICAgICAgICAgICAgaWYgKCFuaWwgJiYgbiA+IDApIHsKKyAgICAgICAgICAgICAgICBBZGROYXZpZ2F0aW9uTm9kZShUb2tlblR5cGVzLkRvd24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYW5kIG5vdyBhZGQgYWxsIGl0cyBjaGlsZHJlbgorICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBuOyBjKyspIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBhZGFwdG9yLkdldENoaWxkKHQsIGMpOworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkIFVQIG5vZGUgaWYgdCBoYXMgY2hpbGRyZW4KKyAgICAgICAgICAgIGlmICghbmlsICYmIG4gPiAwKSB7CisgICAgICAgICAgICAgICAgQWRkTmF2aWdhdGlvbk5vZGUoVG9rZW5UeXBlcy5VcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogV2hhdCBpcyB0aGUgc3RyZWFtIGluZGV4IGZvciBub2RlPyAwLi5uLTEKKyAgICAgICAgICogIFJldHVybiAtMSBpZiBub2RlIG5vdCBmb3VuZC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBHZXROb2RlSW5kZXgob2JqZWN0IG5vZGUpIHsKKyAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IHQgPSBub2Rlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAodCA9PSBub2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBcyB3ZSBmbGF0dGVuIHRoZSB0cmVlLCB3ZSB1c2UgVVAsIERPV04gbm9kZXMgdG8gcmVwcmVzZW50CisgICAgICAgICAqICB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworICAgICAgICAgKiAgc28gaW5zdGFudGlhdGUgbmV3IG9uZXMgd2hlbiB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMgaXMgdHJ1ZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQWRkTmF2aWdhdGlvbk5vZGUoaW50IHR0eXBlKSB7CisgICAgICAgICAgICBvYmplY3QgbmF2Tm9kZSA9IG51bGw7CisgICAgICAgICAgICBpZiAodHR5cGUgPT0gVG9rZW5UeXBlcy5Eb3duKSB7CisgICAgICAgICAgICAgICAgaWYgKFVuaXF1ZU5hdmlnYXRpb25Ob2RlcykgeworICAgICAgICAgICAgICAgICAgICBuYXZOb2RlID0gYWRhcHRvci5DcmVhdGUoVG9rZW5UeXBlcy5Eb3duLCAiRE9XTiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hdk5vZGUgPSBkb3duOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFVuaXF1ZU5hdmlnYXRpb25Ob2RlcykgeworICAgICAgICAgICAgICAgICAgICBuYXZOb2RlID0gYWRhcHRvci5DcmVhdGUoVG9rZW5UeXBlcy5VcCwgIlVQIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmF2Tm9kZSA9IHVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVzLkFkZChuYXZOb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCB0aGlzW2ludCBpXSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IHRoZSBub2RlIGF0IGluZGV4IGkgYmVmb3JlIHRoZSBidWZmZXIgaXMgZmlsbGVkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTFQoaW50IGspIHsKKyAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGsgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGsgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExCKC1rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludCgiTFQocD0iK3ArIiwiK2srIik9Iik7CisgICAgICAgICAgICBpZiAoKHAgKyBrIC0gMSkgPj0gbm9kZXMuQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW9mOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGVzW3AgKyBrIC0gMV07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0Q3VycmVudFN5bWJvbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBMVCgxKTsKKyAgICAgICAgfQorCisjaWYgZmFsc2UKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IGdldExhc3RUcmVlTm9kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpID0gSW5kZXg7CisgICAgICAgICAgICBpZiAoIGkgPj0gc2l6ZSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpLS07IC8vIGlmIGF0IEVPRiwgaGF2ZSB0byBzdGFydCBvbmUgYmFjaworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCAic3RhcnQgbGFzdCBub2RlOiAiICsgaSArICIgc2l6ZT09IiArIG5vZGVzLkNvdW50ICk7CisgICAgICAgICAgICB3aGlsZSAoIGkgPj0gMCAmJgorICAgICAgICAgICAgICAgICggYWRhcHRvci5nZXRUeXBlKCB0aGlzW2ldICkgPT0gVG9rZW5UeXBlcy5FT0YgfHwKKyAgICAgICAgICAgICAgICAgYWRhcHRvci5nZXRUeXBlKCB0aGlzW2ldICkgPT0gVG9rZW5UeXBlcy5VUCB8fAorICAgICAgICAgICAgICAgICBhZGFwdG9yLmdldFR5cGUoIHRoaXNbaV0gKSA9PSBUb2tlblR5cGVzLkRPV04gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCAic3RvcCBhdCBub2RlOiAiICsgaSArICIgIiArIG5vZGVzW2ldICk7CisgICAgICAgICAgICByZXR1cm4gbm9kZXNbaV07CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Mb29rIGJhY2t3YXJkcyBrIG5vZGVzPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBvYmplY3QgTEIoaW50IGspIHsKKyAgICAgICAgICAgIGlmIChrID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocCAtIGspIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGVzW3AgLSBrXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpIHsKKyAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRUeXBlKExUKGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0TWFya2VyID0gSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gbGFzdE1hcmtlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZShpbnQgbWFya2VyKSB7CisgICAgICAgICAgICAvLyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZChpbnQgbWFya2VyKSB7CisgICAgICAgICAgICBTZWVrKG1hcmtlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCgpIHsKKyAgICAgICAgICAgIFNlZWsobGFzdE1hcmtlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNlZWsoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAocCA9PSAtMSkgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICAgICAqICBTd2l0Y2ggYmFjayB3aXRoIHBvcCgpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBQdXNoKGludCBpbmRleCkgeworICAgICAgICAgICAgaWYgKGNhbGxzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWxscyA9IG5ldyBTdGFjazxpbnQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxscy5QdXNoKHApOyAvLyBzYXZlIGN1cnJlbnQgaW5kZXgKKyAgICAgICAgICAgIFNlZWsoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgU2VlayBiYWNrIHRvIHByZXZpb3VzIGluZGV4IHNhdmVkIGR1cmluZyBsYXN0IHB1c2goKSBjYWxsLgorICAgICAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBQb3AoKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gY2FsbHMuUG9wKCk7CisgICAgICAgICAgICBTZWVrKHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXNldCgpIHsKKyAgICAgICAgICAgIHAgPSAwOworICAgICAgICAgICAgbGFzdE1hcmtlciA9IDA7CisgICAgICAgICAgICBpZiAoY2FsbHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxzLkNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYXRvcjxvYmplY3Q+IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtSXRlcmF0b3IodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUUkVFIFJFV1JJVEUgSU5URVJGQUNFCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlQ2hpbGRyZW4ob2JqZWN0IHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBvYmplY3QgdCkgeworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRhcHRvci5SZXBsYWNlQ2hpbGRyZW4ocGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Vc2VkIGZvciB0ZXN0aW5nLCBqdXN0IHJldHVybiB0aGUgdG9rZW4gdHlwZSBzdHJlYW08L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1Rva2VuVHlwZVN0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IHQgPSBub2Rlc1tpXTsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChhZGFwdG9yLkdldFR5cGUodCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkRlYnVnZ2luZzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvVG9rZW5TdHJpbmcoaW50IHN0YXJ0LCBpbnQgc3RvcCkgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBub2Rlcy5Db3VudCAmJiBpIDw9IHN0b3A7IGkrKykgeworICAgICAgICAgICAgICAgIG9iamVjdCB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoYWRhcHRvci5HZXRUb2tlbih0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmcob2JqZWN0IHN0YXJ0LCBvYmplY3Qgc3RvcCkgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCJ0b1N0cmluZyIpOworICAgICAgICAgICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJCdWZmZXIgaXMgbm90IHlldCBmaWxsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0NvbnNvbGUuT3V0LldyaXRlTGluZSggInN0b3A6ICIgKyBzdG9wICk7CisgICAgICAgICAgICBpZiAoc3RhcnQgaXMgQ29tbW9uVHJlZSkKKyAgICAgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZSgidG9TdHJpbmc6ICIgKyAoKENvbW1vblRyZWUpc3RhcnQpLlRva2VuICsgIiwgIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzdG9wIGlzIENvbW1vblRyZWUpCisgICAgICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCgoQ29tbW9uVHJlZSlzdG9wKS5Ub2tlbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKHN0b3ApOworICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSB0aGUgdG9rZW4gc3RyZWFtLCB1c2UgdGhhdCB0byBkdW1wIHRleHQgaW4gb3JkZXIKKyAgICAgICAgICAgIGlmICh0b2tlbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBiZWdpblRva2VuSW5kZXggPSBhZGFwdG9yLkdldFRva2VuU3RhcnRJbmRleChzdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGVuZFRva2VuSW5kZXggPSBhZGFwdG9yLkdldFRva2VuU3RvcEluZGV4KHN0b3ApOworICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSB0cmVlLCB1c2Ugc3RhcnQvc3RvcCBpbmRleCBmcm9tIHN0YXJ0IG5vZGUKKyAgICAgICAgICAgICAgICAvLyBlbHNlIHVzZSB0b2tlbiByYW5nZSBmcm9tIHN0YXJ0L3N0b3Agbm9kZXMKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRvci5HZXRUeXBlKHN0b3ApID09IFRva2VuVHlwZXMuVXApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kVG9rZW5JbmRleCA9IGFkYXB0b3IuR2V0VG9rZW5TdG9wSW5kZXgoc3RhcnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRhcHRvci5HZXRUeXBlKHN0b3ApID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZFRva2VuSW5kZXggPSBDb3VudCAtIDI7IC8vIGRvbid0IHVzZSBFT0YKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucy5Ub1N0cmluZyhiZWdpblRva2VuSW5kZXgsIGVuZFRva2VuSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2FsayBub2RlcyBsb29raW5nIGZvciBzdGFydAorICAgICAgICAgICAgb2JqZWN0IHQgPSBudWxsOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yICg7IGkgPCBub2Rlcy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdCA9IG5vZGVzW2ldOworICAgICAgICAgICAgICAgIGlmICh0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdyB3YWxrIHVudGlsIHdlIHNlZSBzdG9wLCBmaWxsaW5nIHN0cmluZyBidWZmZXIgd2l0aCB0ZXh0CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICB3aGlsZSAodCAhPSBzdG9wKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQodCk7CisgICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIiAiICsgYWRhcHRvci5HZXRUeXBlKHQpLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQodGV4dCk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHQgPSBub2Rlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGluY2x1ZGUgc3RvcCBub2RlIHRvbworICAgICAgICAgICAgc3RyaW5nIHRleHQyID0gYWRhcHRvci5HZXRUZXh0KHN0b3ApOworICAgICAgICAgICAgaWYgKHRleHQyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0MiA9ICIgIiArIGFkYXB0b3IuR2V0VHlwZShzdG9wKS5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLkFwcGVuZCh0ZXh0Mik7CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0NvbW1vbkVycm9yTm9kZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvQ29tbW9uRXJyb3JOb2RlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2I0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0NvbW1vbkVycm9yTm9kZS5jcwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKworICAgIC8qKiA8c3VtbWFyeT5BIG5vZGUgcmVwcmVzZW50aW5nIGVycm9uZW91cyB0b2tlbiByYW5nZSBpbiB0b2tlbiBzdHJlYW08L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENvbW1vbkVycm9yTm9kZSA6IENvbW1vblRyZWUgeworICAgICAgICBwdWJsaWMgSUludFN0cmVhbSBpbnB1dDsKKyAgICAgICAgcHVibGljIElUb2tlbiBzdGFydDsKKyAgICAgICAgcHVibGljIElUb2tlbiBzdG9wOworICAgICAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24gdHJhcHBlZEV4Y2VwdGlvbjsKKworICAgICAgICBwdWJsaWMgQ29tbW9uRXJyb3JOb2RlKElUb2tlblN0cmVhbSBpbnB1dCwgSVRva2VuIHN0YXJ0LCBJVG9rZW4gc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigic3RhcnQ6ICIrc3RhcnQrIiwgc3RvcDogIitzdG9wKTsKKyAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgKHN0b3AuVG9rZW5JbmRleCA8IHN0YXJ0LlRva2VuSW5kZXggJiYKKyAgICAgICAgICAgICAgICAgIHN0b3AuVHlwZSAhPSBUb2tlblR5cGVzLkVuZE9mRmlsZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgcmVzeW5jIGRvZXMgbm90IGNvbnN1bWUgYSB0b2tlbiAod2hlbiBMVCgxKSBpcworICAgICAgICAgICAgICAgIC8vIGluIGZvbGxvdyBzZXQuICBTbywgc3RvcCB3aWxsIGJlIDEgdG8gbGVmdCB0byBzdGFydC4gYWRqdXN0LgorICAgICAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIGNhc2Ugd2hlcmUgc3RhcnQgaXMgdGhlIGZpcnN0IHRva2VuIGFuZCBubyB0b2tlbgorICAgICAgICAgICAgICAgIC8vIGlzIGNvbnN1bWVkIGR1cmluZyByZWNvdmVyeTsgTFQoLTEpIHdpbGwgcmV0dXJuIG51bGwuCisgICAgICAgICAgICAgICAgc3RvcCA9IHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgdGhpcy5zdG9wID0gc3RvcDsKKyAgICAgICAgICAgIHRoaXMudHJhcHBlZEV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNOaWwgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUZXh0IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGJhZFRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChzdGFydCBpcyBJVG9rZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAoKElUb2tlbilzdGFydCkuVG9rZW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGogPSAoKElUb2tlbilzdG9wKS5Ub2tlbkluZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAoKChJVG9rZW4pc3RvcCkuVHlwZSA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaiA9ICgoSVRva2VuU3RyZWFtKWlucHV0KS5Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiYWRUZXh0ID0gKChJVG9rZW5TdHJlYW0paW5wdXQpLlRvU3RyaW5nKGksIGopOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgaXMgSVRyZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFkVGV4dCA9ICgoSVRyZWVOb2RlU3RyZWFtKWlucHV0KS5Ub1N0cmluZyhzdGFydCwgc3RvcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGVvcGxlIHNob3VsZCBzdWJjbGFzcyBpZiB0aGV5IGFsdGVyIHRoZSB0cmVlIHR5cGUgc28gdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IG9uZSBpcyBmb3Igc3VyZSBjb3JyZWN0LgorICAgICAgICAgICAgICAgICAgICBiYWRUZXh0ID0gIjx1bmtub3duPiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBiYWRUZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFR5cGUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5JbnZhbGlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmICh0cmFwcGVkRXhjZXB0aW9uIGlzIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAiPG1pc3NpbmcgdHlwZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICgoTWlzc2luZ1Rva2VuRXhjZXB0aW9uKXRyYXBwZWRFeGNlcHRpb24pLk1pc3NpbmdUeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIj4iOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFwcGVkRXhjZXB0aW9uIGlzIFVud2FudGVkVG9rZW5FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxleHRyYW5lb3VzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgKChVbndhbnRlZFRva2VuRXhjZXB0aW9uKXRyYXBwZWRFeGNlcHRpb24pLlVuZXhwZWN0ZWRUb2tlbiArCisgICAgICAgICAgICAgICAgICAgICAgICIsIHJlc3luYz0iICsgVGV4dCArICI+IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhcHBlZEV4Y2VwdGlvbiBpcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxtaXNtYXRjaGVkIHRva2VuOiAiICsgdHJhcHBlZEV4Y2VwdGlvbi5Ub2tlbiArICIsIHJlc3luYz0iICsgVGV4dCArICI+IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhcHBlZEV4Y2VwdGlvbiBpcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAiPHVuZXhwZWN0ZWQ6ICIgKyB0cmFwcGVkRXhjZXB0aW9uLlRva2VuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVzeW5jPSIgKyBUZXh0ICsgIj4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICI8ZXJyb3I6ICIgKyBUZXh0ICsgIj4iOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Db21tb25UcmVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Db21tb25UcmVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjY3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0NvbW1vblRyZWUuY3MKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBDTFNDb21wbGlhbnQgPSBTeXN0ZW0uQ0xTQ29tcGxpYW50QXR0cmlidXRlOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIHRyZWUgbm9kZSB0aGF0IGlzIHdyYXBwZXIgZm9yIGEgVG9rZW4gb2JqZWN0LiAgQWZ0ZXIgMy4wIHJlbGVhc2UKKyAgICAgKiAgd2hpbGUgYnVpbGRpbmcgdHJlZSByZXdyaXRlIHN0dWZmLCBpdCBiZWNhbWUgY2xlYXIgdGhhdCBjb21wdXRpbmcKKyAgICAgKiAgcGFyZW50IGFuZCBjaGlsZCBpbmRleCBpcyB2ZXJ5IGRpZmZpY3VsdCBhbmQgY3VtYmVyc29tZS4gIEJldHRlciB0bworICAgICAqICBzcGVuZCB0aGUgc3BhY2UgaW4gZXZlcnkgdHJlZSBub2RlLiAgSWYgeW91IGRvbid0IHdhbnQgdGhlc2UgZXh0cmEKKyAgICAgKiAgZmllbGRzLCBpdCdzIGVhc3kgdG8gY3V0IHRoZW0gb3V0IGluIHlvdXIgb3duIEJhc2VUcmVlIHN1YmNsYXNzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENvbW1vblRyZWUgOiBCYXNlVHJlZSB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5BIHNpbmdsZSB0b2tlbiBpcyB0aGUgcGF5bG9hZDwvc3VtbWFyeT4gKi8KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldCisgICAgICAgIHB1YmxpYyBJVG9rZW4gdG9rZW47CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hhdCB0b2tlbiBpbmRleGVzIGJyYWNrZXQgYWxsIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICAgICAqICBhbmQgYmVsb3c/CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXggPSAtMTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBzdG9wSW5kZXggPSAtMTsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hvIGlzIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGlzIG5vZGU7IGlmIG51bGwsIGltcGxpZXMgbm9kZSBpcyByb290PC9zdW1tYXJ5PiAqLworICAgICAgICBDb21tb25UcmVlIHBhcmVudDsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTE8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBjaGlsZEluZGV4ID0gLTE7CisKKyAgICAgICAgcHVibGljIENvbW1vblRyZWUoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tbW9uVHJlZShDb21tb25UcmVlIG5vZGUpCisgICAgICAgICAgICA6IGJhc2Uobm9kZSkgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJub2RlIik7CisKKyAgICAgICAgICAgIHRoaXMudG9rZW4gPSBub2RlLnRva2VuOworICAgICAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gbm9kZS5zdGFydEluZGV4OworICAgICAgICAgICAgdGhpcy5zdG9wSW5kZXggPSBub2RlLnN0b3BJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25UcmVlKElUb2tlbiB0KSB7CisgICAgICAgICAgICB0aGlzLnRva2VuID0gdDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHJvcGVydGllcworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IENoYXJQb3NpdGlvbkluTGluZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLkNoYXJQb3NpdGlvbkluTGluZSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ2hpbGRDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGlsZHJlblswXS5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGJhc2UuQ2hhclBvc2l0aW9uSW5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBDaGlsZEluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc05pbCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9PSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgTGluZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLkxpbmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ2hpbGRDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGlsZHJlblswXS5MaW5lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4uTGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgYmFzZS5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElUcmVlIFBhcmVudCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHBhcmVudCA9IChDb21tb25UcmVlKXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVGV4dCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi5UZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gVG9rZW4geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRva2VuID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUb2tlblN0YXJ0SW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSAmJiB0b2tlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVG9rZW5TdG9wSW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcEluZGV4ID09IC0xICYmIHRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuLlRva2VuSW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdG9wSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHN0b3BJbmRleCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVHlwZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5JbnZhbGlkOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuLlR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRyZWUgRHVwTm9kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbW9uVHJlZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEZvciBldmVyeSBub2RlIGluIHRoaXMgc3VidHJlZSwgbWFrZSBzdXJlIGl0J3Mgc3RhcnQvc3RvcCB0b2tlbidzCisgICAgICAgICAqICBhcmUgc2V0LiAgV2FsayBkZXB0aCBmaXJzdCwgdmlzaXQgYm90dG9tIHVwLiAgT25seSB1cGRhdGVzIG5vZGVzCisgICAgICAgICAqICB3aXRoIGF0IGxlYXN0IG9uZSB0b2tlbiBpbmRleCAmbHQ7IDAuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFVua25vd25Ub2tlbkJvdW5kYXJpZXMoKSB7CisgICAgICAgICAgICBpZiAoQ2hpbGRyZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4IDwgMCB8fCBzdG9wSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBzdG9wSW5kZXggPSB0b2tlbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENoaWxkcmVuLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAoKENvbW1vblRyZWUpQ2hpbGRyZW5baV0pLlNldFVua25vd25Ub2tlbkJvdW5kYXJpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID49IDAgJiYgc3RvcEluZGV4ID49IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IHNldAorICAgICAgICAgICAgaWYgKENoaWxkcmVuLkNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIENvbW1vblRyZWUgZmlyc3RDaGlsZCA9IChDb21tb25UcmVlKUNoaWxkcmVuWzBdOworICAgICAgICAgICAgICAgIENvbW1vblRyZWUgbGFzdENoaWxkID0gKENvbW1vblRyZWUpQ2hpbGRyZW5bQ2hpbGRyZW4uQ291bnQgLSAxXTsKKyAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gZmlyc3RDaGlsZC5Ub2tlblN0YXJ0SW5kZXg7CisgICAgICAgICAgICAgICAgc3RvcEluZGV4ID0gbGFzdENoaWxkLlRva2VuU3RvcEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChJc05pbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUeXBlID09IFRva2VuVHlwZXMuSW52YWxpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiPGVycm9ybm9kZT4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRva2VuLlRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0NvbW1vblRyZWVBZGFwdG9yLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Db21tb25UcmVlQWRhcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2IyNGFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Db21tb25UcmVlQWRhcHRvci5jcwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBUcmVlQWRhcHRvciB0aGF0IHdvcmtzIHdpdGggYW55IFRyZWUgaW1wbGVtZW50YXRpb24uICBJdCBwcm92aWRlcworICAgICAqICByZWFsbHkganVzdCBmYWN0b3J5IG1ldGhvZHM7IGFsbCB0aGUgd29yayBpcyBkb25lIGJ5IEJhc2VUcmVlQWRhcHRvci4KKyAgICAgKiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBkaWZmZXJlbnQgdG9rZW5zIGNyZWF0ZWQgdGhhbiBDbGFzc2ljVG9rZW4KKyAgICAgKiAgb2JqZWN0cywgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBhbmQgdGhlbiBzZXQgdGhlIHBhcnNlciB0cmVlIGFkYXB0b3IgdG8KKyAgICAgKiAgdXNlIHlvdXIgc3ViY2xhc3MuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgVG8gZ2V0IHlvdXIgcGFyc2VyIHRvIGJ1aWxkIG5vZGVzIG9mIGEgZGlmZmVyZW50IHR5cGUsIG92ZXJyaWRlCisgICAgICogIGNyZWF0ZShUb2tlbiksIGVycm9yTm9kZSgpLCBhbmQgdG8gYmUgc2FmZSwgWW91clRyZWVDbGFzcy5kdXBOb2RlKCkuCisgICAgICogIGR1cE5vZGUgaXMgY2FsbGVkIHRvIGR1cGxpY2F0ZSBub2RlcyBkdXJpbmcgcmV3cml0ZSBvcGVyYXRpb25zLgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIENvbW1vblRyZWVBZGFwdG9yIDogQmFzZVRyZWVBZGFwdG9yIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRHVwbGljYXRlIGEgbm9kZS4gIFRoaXMgaXMgcGFydCBvZiB0aGUgZmFjdG9yeTsKKyAgICAgICAgICogIG92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJIGNvdWxkIHVzZSByZWZsZWN0aW9uIHRvIHByZXZlbnQgaGF2aW5nIHRvIG92ZXJyaWRlIHRoaXMKKyAgICAgICAgICogIGJ1dCByZWZsZWN0aW9uIGlzIHNsb3cuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IER1cE5vZGUob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGlmICh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiAoKElUcmVlKXQpLkR1cE5vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgQ3JlYXRlKElUb2tlbiBwYXlsb2FkKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1vblRyZWUocGF5bG9hZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorICAgICAgICAgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgICAgICAgICAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAgICAgICAgICogIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAgICAgICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnkgb3RoZXIgY3JlYXRlVG9rZW4gdmFyaWFudC4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJVG9rZW4gQ3JlYXRlVG9rZW4oaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbW9uVG9rZW4odG9rZW5UeXBlLCB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgICAgICogIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgICAgICAgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgICAgICAgICAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICAgICAgICAgKiAgdG9rZW5zIHRvIEJMT0NLIGV0Yy4uLiAgWW91J2xsIHNlZQorICAgICAgICAgKgorICAgICAgICAgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICAgICAgICAgKgorICAgICAgICAgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRva2VuIENyZWF0ZVRva2VuKElUb2tlbiBmcm9tVG9rZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbW9uVG9rZW4oZnJvbVRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRyYWNrIHN0YXJ0L3N0b3AgdG9rZW4gZm9yIHN1YnRyZWUgcm9vdCBjcmVhdGVkIGZvciBhIHJ1bGUuCisgICAgICAgICAqICBPbmx5IHdvcmtzIHdpdGggVHJlZSBub2Rlcy4gIEZvciBydWxlcyB0aGF0IG1hdGNoIG5vdGhpbmcsCisgICAgICAgICAqICBzZWVtcyBsaWtlIHRoaXMgd2lsbCB5aWVsZCBzdGFydD1pIGFuZCBzdG9wPWktMSBpbiBhIG5pbCBub2RlLgorICAgICAgICAgKiAgTWlnaHQgYmUgdXNlZnVsIGluZm8gc28gSSdsbCBub3QgZm9yY2UgdG8gYmUgaS4uaS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldFRva2VuQm91bmRhcmllcyhvYmplY3QgdCwgSVRva2VuIHN0YXJ0VG9rZW4sIElUb2tlbiBzdG9wVG9rZW4pIHsKKyAgICAgICAgICAgIGlmICh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICAgICAgaW50IHN0b3AgPSAwOworCisgICAgICAgICAgICBpZiAoc3RhcnRUb2tlbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRUb2tlbi5Ub2tlbkluZGV4OworCisgICAgICAgICAgICBpZiAoc3RvcFRva2VuICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3RvcCA9IHN0b3BUb2tlbi5Ub2tlbkluZGV4OworCisgICAgICAgICAgICAoKElUcmVlKXQpLlRva2VuU3RhcnRJbmRleCA9IHN0YXJ0OworICAgICAgICAgICAgKChJVHJlZSl0KS5Ub2tlblN0b3BJbmRleCA9IHN0b3A7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldFRva2VuU3RhcnRJbmRleChvYmplY3QgdCkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIHJldHVybiAoKElUcmVlKXQpLlRva2VuU3RhcnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0VG9rZW5TdG9wSW5kZXgob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGlmICh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5Ub2tlblN0b3BJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0VGV4dChvYmplY3QgdCkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuICgoSVRyZWUpdCkuVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0VHlwZShvYmplY3QgdCkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5JbnZhbGlkOworCisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5UeXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hhdCBpcyB0aGUgVG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZT8gIElmCisgICAgICAgICAqICB5b3UgYXJlIG5vdCB1c2luZyBDb21tb25UcmVlLCB0aGVuIHlvdSBtdXN0CisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIGluIHlvdXIgb3duIGFkYXB0b3IuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRva2VuIEdldFRva2VuKG9iamVjdCB0KSB7CisgICAgICAgICAgICBpZiAodCBpcyBDb21tb25UcmVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29tbW9uVHJlZSl0KS5Ub2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBubyBpZGVhIHdoYXQgdG8gZG8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgR2V0Q2hpbGQob2JqZWN0IHQsIGludCBpKSB7CisgICAgICAgICAgICBpZiAodCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5HZXRDaGlsZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0Q2hpbGRDb3VudChvYmplY3QgdCkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgcmV0dXJuICgoSVRyZWUpdCkuQ2hpbGRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgR2V0UGFyZW50KG9iamVjdCB0KSB7CisgICAgICAgICAgICBpZiAodCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5QYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRQYXJlbnQob2JqZWN0IHQsIG9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgKChJVHJlZSl0KS5QYXJlbnQgPSAoSVRyZWUpcGFyZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRDaGlsZEluZGV4KG9iamVjdCB0KSB7CisgICAgICAgICAgICBpZiAodCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICByZXR1cm4gKChJVHJlZSl0KS5DaGlsZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0Q2hpbGRJbmRleChvYmplY3QgdCwgaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAodCAhPSBudWxsKQorICAgICAgICAgICAgICAgICgoSVRyZWUpdCkuQ2hpbGRJbmRleCA9IGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVwbGFjZUNoaWxkcmVuKG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICgoSVRyZWUpcGFyZW50KS5SZXBsYWNlQ2hpbGRyZW4oc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Db21tb25UcmVlTm9kZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ4NTFlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Db21tb25UcmVlTm9kZVN0cmVhbS5jcwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLk1pc2M7CisKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKyAgICB1c2luZyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gPSBTeXN0ZW0uTm90U3VwcG9ydGVkRXhjZXB0aW9uOworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENvbW1vblRyZWVOb2RlU3RyZWFtIDogTG9va2FoZWFkU3RyZWFtPG9iamVjdD4sIElUcmVlTm9kZVN0cmVhbSB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAwOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFID0gMTA7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlB1bGwgbm9kZXMgZnJvbSB3aGljaCB0cmVlPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgb2JqZWN0IF9yb290OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5JZiB0aGlzIHRyZWUgKHJvb3QpIHdhcyBjcmVhdGVkIGZyb20gYSB0b2tlbiBzdHJlYW0sIHRyYWNrIGl0Ljwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIElUb2tlblN0cmVhbSB0b2tlbnM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgdHJlZSBhZGFwdG9yIHdhcyB1c2VkIHRvIGJ1aWxkIHRoZXNlIHRyZWVzPC9zdW1tYXJ5PiAqLworICAgICAgICBbU3lzdGVtLk5vblNlcmlhbGl6ZWRdCisgICAgICAgIElUcmVlQWRhcHRvciBfYWRhcHRvcjsKKworICAgICAgICAvKiogVGhlIHRyZWUgaXRlcmF0b3Igd2UgYXJlIHVzaW5nICovCisgICAgICAgIFRyZWVJdGVyYXRvciBfaXQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlN0YWNrIG9mIGluZGV4ZXMgdXNlZCBmb3IgcHVzaC9wb3AgY2FsbHM8L3N1bW1hcnk+ICovCisgICAgICAgIFN0YWNrPGludD4gX2NhbGxzOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zPC9zdW1tYXJ5PiAqLworICAgICAgICBib29sIF9oYXNOaWxSb290ID0gZmFsc2U7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrcyB0cmVlIGRlcHRoLiAgTGV2ZWw9MCBtZWFucyB3ZSdyZSBhdCByb290IG5vZGUgbGV2ZWwuPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgX2xldmVsID0gMDsKKworICAgICAgICBwdWJsaWMgQ29tbW9uVHJlZU5vZGVTdHJlYW0ob2JqZWN0IHRyZWUpCisgICAgICAgICAgICA6IHRoaXMobmV3IENvbW1vblRyZWVBZGFwdG9yKCksIHRyZWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25UcmVlTm9kZVN0cmVhbShJVHJlZUFkYXB0b3IgYWRhcHRvciwgb2JqZWN0IHRyZWUpIHsKKyAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSB0cmVlOworICAgICAgICAgICAgdGhpcy5fYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICBfaXQgPSBuZXcgVHJlZUl0ZXJhdG9yKGFkYXB0b3IsIF9yb290KTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHJvcGVydGllcworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTb3VyY2VOYW1lIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgaWYgKFRva2VuU3RyZWFtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuU3RyZWFtLlNvdXJjZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW5TdHJlYW0gVG9rZW5TdHJlYW0geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB0b2tlbnMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlQWRhcHRvciBUcmVlQWRhcHRvciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfYWRhcHRvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBfYWRhcHRvciA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFRyZWVTb3VyY2UgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIFVuaXF1ZU5hdmlnYXRpb25Ob2RlcyB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlc2V0KCkgeworICAgICAgICAgICAgYmFzZS5DbGVhcigpOworICAgICAgICAgICAgX2l0LlJlc2V0KCk7CisgICAgICAgICAgICBfaGFzTmlsUm9vdCA9IGZhbHNlOworICAgICAgICAgICAgX2xldmVsID0gMDsKKyAgICAgICAgICAgIGlmIChfY2FsbHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY2FsbHMuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgTmV4dEVsZW1lbnQoKSB7CisgICAgICAgICAgICBfaXQuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIG9iamVjdCB0ID0gX2l0LkN1cnJlbnQ7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicHVsbGVkICIrYWRhcHRvci5nZXRUeXBlKHQpKTsKKyAgICAgICAgICAgIGlmICh0ID09IF9pdC51cCkgeworICAgICAgICAgICAgICAgIF9sZXZlbC0tOworICAgICAgICAgICAgICAgIGlmIChfbGV2ZWwgPT0gMCAmJiBfaGFzTmlsUm9vdCkgeworICAgICAgICAgICAgICAgICAgICBfaXQuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9pdC5DdXJyZW50OyAvLyBkb24ndCBnaXZlIGxhc3QgVVA7IGdldCBFT0YKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgPT0gX2l0LmRvd24pIHsKKyAgICAgICAgICAgICAgICBfbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9sZXZlbCA9PSAwICYmIFRyZWVBZGFwdG9yLklzTmlsKHQpKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbmlsIHJvb3QsIHNjYXJmIG5pbCwgRE9XTgorICAgICAgICAgICAgICAgIF9oYXNOaWxSb290ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfaXQuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgICB0ID0gX2l0LkN1cnJlbnQ7IC8vIHQgaXMgbm93IERPV04sIHNvIGdldCBmaXJzdCByZWFsIG5vZGUgbmV4dAorICAgICAgICAgICAgICAgIF9sZXZlbCsrOworICAgICAgICAgICAgICAgIF9pdC5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHQgPSBfaXQuQ3VycmVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0VuZE9mRmlsZShvYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIFRyZWVBZGFwdG9yLkdldFR5cGUobykgPT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTEEoaW50IGkpIHsKKyAgICAgICAgICAgIHJldHVybiBUcmVlQWRhcHRvci5HZXRUeXBlKExUKGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlIHN0cmVhbSBqdW1wIHRvIGEgbmV3IGxvY2F0aW9uLCBzYXZpbmcgb2xkIGxvY2F0aW9uLgorICAgICAgICAgKiAgU3dpdGNoIGJhY2sgd2l0aCBwb3AoKS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUHVzaChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChfY2FsbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9jYWxscyA9IG5ldyBTdGFjazxpbnQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY2FsbHMuUHVzaChfcCk7IC8vIHNhdmUgY3VycmVudCBpbmRleAorICAgICAgICAgICAgU2VlayhpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogU2VlayBiYWNrIHRvIHByZXZpb3VzIGluZGV4IHNhdmVkIGR1cmluZyBsYXN0IHB1c2goKSBjYWxsLgorICAgICAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBQb3AoKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gX2NhbGxzLlBvcCgpOworICAgICAgICAgICAgU2VlayhyZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gVHJlZSByZXdyaXRlIGludGVyZmFjZQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZUNoaWxkcmVuKG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRyZWVBZGFwdG9yLlJlcGxhY2VDaGlsZHJlbihwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCwgc3RvcENoaWxkSW5kZXgsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1N0cmluZyhvYmplY3Qgc3RhcnQsIG9iamVjdCBzdG9wKSB7CisgICAgICAgICAgICAvLyB3ZSdsbCBoYXZlIHRvIHdhbGsgZnJvbSBzdGFydCB0byBzdG9wIGluIHRyZWU7IHdlJ3JlIG5vdCBrZWVwaW5nCisgICAgICAgICAgICAvLyBhIGNvbXBsZXRlIG5vZGUgc3RyZWFtIGJ1ZmZlcgorICAgICAgICAgICAgcmV0dXJuICJuL2EiOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkZvciBkZWJ1Z2dpbmc7IGRlc3RydWN0aXZlOiBtb3ZlcyB0cmVlIGl0ZXJhdG9yIHRvIGVuZC48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1Rva2VuVHlwZVN0cmluZygpIHsKKyAgICAgICAgICAgIFJlc2V0KCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBvYmplY3QgbyA9IExUKDEpOworICAgICAgICAgICAgaW50IHR5cGUgPSBUcmVlQWRhcHRvci5HZXRUeXBlKG8pOworICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gVG9rZW5UeXBlcy5FbmRPZkZpbGUpIHsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCh0eXBlKTsKKyAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgbyA9IExUKDEpOworICAgICAgICAgICAgICAgIHR5cGUgPSBUcmVlQWRhcHRvci5HZXRUeXBlKG8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Eb3RUcmVlR2VuZXJhdG9yLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9Eb3RUcmVlR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzhkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0RvdFRyZWVHZW5lcmF0b3IuY3MKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiBBIHV0aWxpdHkgY2xhc3MgdG8gZ2VuZXJhdGUgRE9UIGRpYWdyYW1zIChncmFwaHZpeikgZnJvbQorICAgICAqICBhcmJpdHJhcnkgdHJlZXMuICBZb3UgY2FuIHBhc3MgaW4geW91ciBvd24gdGVtcGxhdGVzIGFuZAorICAgICAqICBjYW4gcGFzcyBpbiBhbnkga2luZCBvZiB0cmVlIG9yIHVzZSBUcmVlIGludGVyZmFjZSBtZXRob2QuCisgICAgICogIEkgd2FudGVkIHRoaXMgc2VwYXJhdG9yIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gaW5jbHVkZQorICAgICAqICBTVCBqdXN0IHRvIHVzZSB0aGUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qIHBhY2thZ2UuCisgICAgICogIFRoaXMgaXMgYSBzZXQgb2Ygbm9uLXN0YXRpYyBtZXRob2RzIHNvIHlvdSBjYW4gc3ViY2xhc3MKKyAgICAgKiAgdG8gb3ZlcnJpZGUuICBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhbiBpbnZvY2F0aW9uOgorICAgICAqCisgICAgICogICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oU3lzdGVtLmluKTsKKyAgICAgKiAgICAgIFRMZXhlciBsZXggPSBuZXcgVExleGVyKGlucHV0KTsKKyAgICAgKiAgICAgIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOworICAgICAqICAgICAgVFBhcnNlciBwYXJzZXIgPSBuZXcgVFBhcnNlcih0b2tlbnMpOworICAgICAqICAgICAgVFBhcnNlci5lX3JldHVybiByID0gcGFyc2VyLmUoKTsKKyAgICAgKiAgICAgIFRyZWUgdCA9IChUcmVlKXIudHJlZTsKKyAgICAgKiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0LnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgKiAgICAgIERPVFRyZWVHZW5lcmF0b3IgZ2VuID0gbmV3IERPVFRyZWVHZW5lcmF0b3IoKTsKKyAgICAgKiAgICAgIFN0cmluZ1RlbXBsYXRlIHN0ID0gZ2VuLnRvRE9UKHQpOworICAgICAqICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0KTsKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRG90VHJlZUdlbmVyYXRvcgorICAgIHsKKyAgICAgICAgcmVhZG9ubHkgc3RyaW5nW10gSGVhZGVyTGluZXMgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkaWdyYXBoIHsiLAorICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICJcdG9yZGVyaW5nPW91dDsiLAorICAgICAgICAgICAgICAgICJcdHJhbmtzZXA9LjQ7IiwKKyAgICAgICAgICAgICAgICAiXHRiZ2NvbG9yPVwibGlnaHRncmV5XCI7IG5vZGUgW3NoYXBlPWJveCwgZml4ZWRzaXplPWZhbHNlLCBmb250c2l6ZT0xMiwgZm9udG5hbWU9XCJIZWx2ZXRpY2EtYm9sZFwiLCBmb250Y29sb3I9XCJibHVlXCIiLAorICAgICAgICAgICAgICAgICJcdFx0d2lkdGg9LjI1LCBoZWlnaHQ9LjI1LCBjb2xvcj1cImJsYWNrXCIsIGZpbGxjb2xvcj1cIndoaXRlXCIsIHN0eWxlPVwiZmlsbGVkLCBzb2xpZCwgYm9sZFwiXTsiLAorICAgICAgICAgICAgICAgICJcdGVkZ2UgW2Fycm93c2l6ZT0uNSwgY29sb3I9XCJibGFja1wiLCBzdHlsZT1cImJvbGRcIl0iLAorICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICB9OworICAgICAgICBjb25zdCBzdHJpbmcgRm9vdGVyID0gIn0iOworICAgICAgICBjb25zdCBzdHJpbmcgTm9kZUZvcm1hdCA9ICIgIHswfSBbbGFiZWw9XCJ7MX1cIl07IjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIEVkZ2VGb3JtYXQgPSAiICB7MH0gLT4gezF9IC8vIFwiezJ9XCIgLT4gXCJ7M31cIiI7CisKKyAgICAgICAgLyoqIFRyYWNrIG5vZGUgdG8gbnVtYmVyIG1hcHBpbmcgc28gd2UgY2FuIGdldCBwcm9wZXIgbm9kZSBuYW1lIGJhY2sgKi8KKyAgICAgICAgRGljdGlvbmFyeTxvYmplY3QsIGludD4gbm9kZVRvTnVtYmVyTWFwID0gbmV3IERpY3Rpb25hcnk8b2JqZWN0LCBpbnQ+KCk7CisKKyAgICAgICAgLyoqIFRyYWNrIG5vZGUgbnVtYmVyIHNvIHdlIGNhbiBnZXQgdW5pcXVlIG5vZGUgbmFtZXMgKi8KKyAgICAgICAgaW50IG5vZGVOdW1iZXIgPSAwOworCisgICAgICAgIC8qKiBHZW5lcmF0ZSBET1QgKGdyYXBodml6KSBmb3IgYSB3aG9sZSB0cmVlIG5vdCBqdXN0IGEgbm9kZS4KKyAgICAgICAgICogIEZvciBleGFtcGxlLCAzKzQqNSBzaG91bGQgZ2VuZXJhdGU6CisgICAgICAgICAqCisgICAgICAgICAqIGRpZ3JhcGggeworICAgICAgICAgKiAgIG5vZGUgW3NoYXBlPXBsYWludGV4dCwgZml4ZWRzaXplPXRydWUsIGZvbnRzaXplPTExLCBmb250bmFtZT0iQ291cmllciIsCisgICAgICAgICAqICAgICAgICAgd2lkdGg9LjQsIGhlaWdodD0uMl07CisgICAgICAgICAqICAgZWRnZSBbYXJyb3dzaXplPS43XQorICAgICAgICAgKiAgICIrIi0+MworICAgICAgICAgKiAgICIrIi0+IioiCisgICAgICAgICAqICAgIioiLT40CisgICAgICAgICAqICAgIioiLT41CisgICAgICAgICAqIH0KKyAgICAgICAgICoKKyAgICAgICAgICogVGFrZXMgYSBUcmVlIGludGVyZmFjZSBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9Eb3QoIG9iamVjdCB0cmVlLCBJVHJlZUFkYXB0b3IgYWRhcHRvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3JlYWNoICggc3RyaW5nIGxpbmUgaW4gSGVhZGVyTGluZXMgKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZSggbGluZSApOworCisgICAgICAgICAgICBub2RlTnVtYmVyID0gMDsKKyAgICAgICAgICAgIHZhciBub2RlcyA9IERlZmluZU5vZGVzKCB0cmVlLCBhZGFwdG9yICk7CisgICAgICAgICAgICBub2RlTnVtYmVyID0gMDsKKyAgICAgICAgICAgIHZhciBlZGdlcyA9IERlZmluZUVkZ2VzKCB0cmVlLCBhZGFwdG9yICk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKCB2YXIgcyBpbiBub2RlcyApCisgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmRMaW5lKCBzICk7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZSgpOworCisgICAgICAgICAgICBmb3JlYWNoICggdmFyIHMgaW4gZWRnZXMgKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZSggcyApOworCisgICAgICAgICAgICBidWlsZGVyLkFwcGVuZExpbmUoKTsKKworICAgICAgICAgICAgYnVpbGRlci5BcHBlbmRMaW5lKCBGb290ZXIgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9Eb3QoIElUcmVlIHRyZWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVG9Eb3QoIHRyZWUsIG5ldyBDb21tb25UcmVlQWRhcHRvcigpICk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8c3RyaW5nPiBEZWZpbmVOb2Rlcyggb2JqZWN0IHRyZWUsIElUcmVlQWRhcHRvciBhZGFwdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0cmVlID09IG51bGwgKQorICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworCisgICAgICAgICAgICBpbnQgbiA9IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCggdHJlZSApOworICAgICAgICAgICAgaWYgKCBuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhbHJlYWR5IGR1bXBlZCBhcyBjaGlsZCBmcm9tIHByZXZpb3VzCisgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbjsgZG8gbm90aGluZworICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZWZpbmUgcGFyZW50IG5vZGUKKyAgICAgICAgICAgIHlpZWxkIHJldHVybiBHZXROb2RlVGV4dCggYWRhcHRvciwgdHJlZSApOworCisgICAgICAgICAgICAvLyBmb3IgZWFjaCBjaGlsZCwgZG8gYSAiPHVuaXF1ZS1uYW1lPiBbbGFiZWw9dGV4dF0iIG5vZGUgZGVmCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IGFkYXB0b3IuR2V0Q2hpbGQoIHRyZWUsIGkgKTsKKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gR2V0Tm9kZVRleHQoIGFkYXB0b3IsIGNoaWxkICk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoIHZhciB0IGluIERlZmluZU5vZGVzKCBjaGlsZCwgYWRhcHRvciApICkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBJRW51bWVyYWJsZTxzdHJpbmc+IERlZmluZUVkZ2VzKCBvYmplY3QgdHJlZSwgSVRyZWVBZGFwdG9yIGFkYXB0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHRyZWUgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisKKyAgICAgICAgICAgIGludCBuID0gYWRhcHRvci5HZXRDaGlsZENvdW50KCB0cmVlICk7CisgICAgICAgICAgICBpZiAoIG4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGFscmVhZHkgZHVtcGVkIGFzIGNoaWxkIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uOyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyBwYXJlbnROYW1lID0gIm4iICsgR2V0Tm9kZU51bWJlciggdHJlZSApOworCisgICAgICAgICAgICAvLyBmb3IgZWFjaCBjaGlsZCwgZG8gYSBwYXJlbnQgLT4gY2hpbGQgZWRnZSB1c2luZyB1bmlxdWUgbm9kZSBuYW1lcworICAgICAgICAgICAgc3RyaW5nIHBhcmVudFRleHQgPSBhZGFwdG9yLkdldE5vZGVUZXh0KCB0cmVlICk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IGFkYXB0b3IuR2V0Q2hpbGQoIHRyZWUsIGkgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgY2hpbGRUZXh0ID0gYWRhcHRvci5HZXROb2RlVGV4dChjaGlsZCk7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNoaWxkTmFtZSA9ICJuIiArIEdldE5vZGVOdW1iZXIoIGNoaWxkICk7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIEVkZ2VGb3JtYXQsIHBhcmVudE5hbWUsIGNoaWxkTmFtZSwgRml4U3RyaW5nKCBwYXJlbnRUZXh0ICksIEZpeFN0cmluZyggY2hpbGRUZXh0ICkgKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICggdmFyIHQgaW4gRGVmaW5lRWRnZXMoIGNoaWxkLCBhZGFwdG9yICkgKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHN0cmluZyBHZXROb2RlVGV4dCggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldE5vZGVUZXh0KHQpOworICAgICAgICAgICAgc3RyaW5nIHVuaXF1ZU5hbWUgPSAibiIgKyBHZXROb2RlTnVtYmVyKCB0ICk7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCggTm9kZUZvcm1hdCwgdW5pcXVlTmFtZSwgRml4U3RyaW5nKCB0ZXh0ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBHZXROb2RlTnVtYmVyKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaWYgKCBub2RlVG9OdW1iZXJNYXAuVHJ5R2V0VmFsdWUoIHQsIG91dCBpICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vZGVUb051bWJlck1hcFt0XSA9IG5vZGVOdW1iZXI7CisgICAgICAgICAgICAgICAgbm9kZU51bWJlcisrOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlTnVtYmVyIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHN0cmluZyBGaXhTdHJpbmcoIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0ZXh0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRleHQgPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXguUmVwbGFjZSggdGV4dCwgIlwiIiwgIlxcXFxcIiIgKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LlJlcGxhY2UoIHRleHQsICJcXHQiLCAiICAgICIgKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LlJlcGxhY2UoIHRleHQsICJcXG4iLCAiXFxcXG4iICk7CisgICAgICAgICAgICAgICAgdGV4dCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5SZXBsYWNlKCB0ZXh0LCAiXFxyIiwgIlxcXFxyIiApOworCisgICAgICAgICAgICAgICAgaWYgKCB0ZXh0Lkxlbmd0aCA+IDIwICkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuU3Vic3RyaW5nKCAwLCA4ICkgKyAiLi4uIiArIHRleHQuU3Vic3RyaW5nKCB0ZXh0Lkxlbmd0aCAtIDggKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0lUcmVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjI4NDFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZS5jcwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgV2hhdCBkb2VzIGEgdHJlZSBsb29rIGxpa2U/ICBBTlRMUiBoYXMgYSBudW1iZXIgb2Ygc3VwcG9ydCBjbGFzc2VzCisgICAgICogIHN1Y2ggYXMgQ29tbW9uVHJlZU5vZGVTdHJlYW0gdGhhdCB3b3JrIG9uIHRoZXNlIGtpbmRzIG9mIHRyZWVzLiAgWW91CisgICAgICogIGRvbid0IGhhdmUgdG8gbWFrZSB5b3VyIHRyZWVzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYnV0IGlmIHlvdSBkbywKKyAgICAgKiAgeW91J2xsIGJlIGFibGUgdG8gdXNlIG1vcmUgc3VwcG9ydCBjb2RlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIE5PVEU6IFdoZW4gY29uc3RydWN0aW5nIHRyZWVzLCBBTlRMUiBjYW4gYnVpbGQgYW55IGtpbmQgb2YgdHJlZTsgaXQgY2FuCisgICAgICogIGV2ZW4gdXNlIFRva2VuIG9iamVjdHMgYXMgdHJlZXMgaWYgeW91IGFkZCBhIGNoaWxkIGxpc3QgdG8geW91ciB0b2tlbnMuCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyBhIHRyZWUgbm9kZSB3aXRob3V0IGFueSBwYXlsb2FkOyBqdXN0IG5hdmlnYXRpb24gYW5kIGZhY3Rvcnkgc3R1ZmYuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUcmVlIHsKKworICAgICAgICBJVHJlZSBHZXRDaGlsZChpbnQgaSk7CisKKyAgICAgICAgaW50IENoaWxkQ291bnQgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVHJlZSB0cmFja3MgcGFyZW50IGFuZCBjaGlsZCBpbmRleCBub3cgPiAzLjAKKworICAgICAgICBJVHJlZSBQYXJlbnQgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PklzIHRoZXJlIGlzIGEgbm9kZSBhYm92ZSB3aXRoIHRva2VuIHR5cGUgdHR5cGU/PC9zdW1tYXJ5PiAqLworICAgICAgICBib29sIEhhc0FuY2VzdG9yKGludCB0dHlwZSk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgSVRyZWUgR2V0QW5jZXN0b3IoaW50IHR0eXBlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAgICAgICAgICogIGxpc3QgaXMgdGhlIHJvb3QgYW5kIHRoZSBsYXN0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSUxpc3Q8SVRyZWU+IEdldEFuY2VzdG9ycygpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGlzIG5vZGUgaXMgd2hhdCBjaGlsZCBpbmRleD8gMC4ubi0xPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgQ2hpbGRJbmRleCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+U2V0IHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IHZhbHVlcyBmb3IgYWxsIGNoaWxkcmVuPC9zdW1tYXJ5PiAqLworICAgICAgICB2b2lkIEZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBZGQgdCBhcyBhIGNoaWxkIHRvIHRoaXMgbm9kZS4gIElmIHQgaXMgbnVsbCwgZG8gbm90aGluZy4gIElmIHQKKyAgICAgICAgICogIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBBZGRDaGlsZChJVHJlZSB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+U2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgdm9pZCBTZXRDaGlsZChpbnQgaSwgSVRyZWUgdCk7CisKKyAgICAgICAgb2JqZWN0IERlbGV0ZUNoaWxkKGludCBpKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKyAgICAgICAgICogIGEgbGlzdCAobmlsLXJvb3QgdHJlZSkuICBudW0gb2YgY2hpbGRyZW4gY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlLgorICAgICAgICAgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgICAgICAgICAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUmVwbGFjZUNoaWxkcmVuKGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhIG5pbCBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworICAgICAgICAgKiAgdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBib29sIElzTmlsIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAgICAgICAgICogIGFuZCBpdHMgY2hpbGRyZW4/CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgVG9rZW5TdGFydEluZGV4IHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoYXQgaXMgdGhlIGxhcmdlc3QgdG9rZW4gaW5kZXggKGluZGV4aW5nIGZyb20gMCkgZm9yIHRoaXMgbm9kZQorICAgICAgICAgKiAgYW5kIGl0cyBjaGlsZHJlbj8KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIGludCBUb2tlblN0b3BJbmRleCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBJVHJlZSBEdXBOb2RlKCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldHVybiBhIHRva2VuIHR5cGU7IG5lZWRlZCBmb3IgdHJlZSBwYXJzaW5nPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgVHlwZSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcgVGV4dCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+SW4gY2FzZSB3ZSBkb24ndCBoYXZlIGEgdG9rZW4gcGF5bG9hZCwgd2hhdCBpcyB0aGUgbGluZSBmb3IgZXJyb3JzPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IExpbmUgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IENoYXJQb3NpdGlvbkluTGluZSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcgVG9TdHJpbmdUcmVlKCk7CisKKyAgICAgICAgc3RyaW5nIFRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZUFkYXB0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0lUcmVlQWRhcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2YzZTMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZUFkYXB0b3IuY3MKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUgeworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBIb3cgdG8gY3JlYXRlIGFuZCBuYXZpZ2F0ZSB0cmVlcy4gIFJhdGhlciB0aGFuIGhhdmUgYSBzZXBhcmF0ZSBmYWN0b3J5CisgICAgICogIGFuZCBhZGFwdG9yLCBJJ3ZlIG1lcmdlZCB0aGVtLiAgTWFrZXMgc2Vuc2UgdG8gZW5jYXBzdWxhdGUuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgVGhpcyB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHRyZWUgY29uc3RydWN0aW9uIGNvZGUgZ2VuZXJhdGVkIGluIHRoZQorICAgICAqICBnZW5lcmF0ZWQgY29kZSBpbiAyLnggYW5kIHRoZSBBU1RGYWN0b3J5LgorICAgICAqCisgICAgICogIEkgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiBhIHRyZWUgYXQgYWxsIHNvIHRoZXkgYXJlIGFsbAorICAgICAqICBnZW5lcmljIE9iamVjdHMuICBUaGlzIG1heSBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIHR5cGVjYXN0aW5nIG5lZWRlZC4gOigKKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRyZWVBZGFwdG9yIHsKKyAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3Rpb24KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSB0cmVlIG5vZGUgZnJvbSBUb2tlbiBvYmplY3Q7IGZvciBDb21tb25UcmVlIHR5cGUgdHJlZXMsCisgICAgICAgICAqICB0aGVuIHRoZSB0b2tlbiBqdXN0IGJlY29tZXMgdGhlIHBheWxvYWQuICBUaGlzIGlzIHRoZSBtb3N0CisgICAgICAgICAqICBjb21tb24gY3JlYXRlIGNhbGwuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIE92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IENyZWF0ZShJVG9rZW4gcGF5bG9hZCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkR1cGxpY2F0ZSBhIHNpbmdsZSB0cmVlIG5vZGUuPC9zdW1tYXJ5PgorICAgICAgICAgKiAgPHJlbWFya3M+T3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IER1cE5vZGUob2JqZWN0IHRyZWVOb2RlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+RHVwbGljYXRlIHRyZWUgcmVjdXJzaXZlbHksIHVzaW5nIGR1cE5vZGUoKSBmb3IgZWFjaCBub2RlPC9zdW1tYXJ5PiAqLworICAgICAgICBvYmplY3QgRHVwVHJlZShvYmplY3QgdHJlZSk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIGEgbmlsIG5vZGUgKGFuIGVtcHR5IGJ1dCBub24tbnVsbCBub2RlKSB0aGF0IGNhbiBob2xkCisgICAgICAgICAqICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICAgICAgICAgKiAgdXNlICJ0PWFkYXB0b3IubmlsKCk7IHQuYWRkQ2hpbGQoeCk7IHQuYWRkQ2hpbGQoeSk7IgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IE5pbCgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAgICAgICAgICogIHRva2VucyBjb25zdW1lZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuICBUaGUgc3RhcnQgdG9rZW4gaW5kaWNhdGVzIHRoZQorICAgICAgICAgKiAgaW5wdXQgc3ltYm9sIGF0IHdoaWNoIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuICBUaGUgc3RvcCB0b2tlbiBpbmRpY2F0ZXMKKyAgICAgICAgICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqICBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBpbnB1dCBzdHJlYW0gc28gdGhhdCB0aGUgZXJyb25lb3VzIHRleHQgY2FuCisgICAgICAgICAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgICAgICAgICAqICB0byBzb21lIGFwcGxpY2F0aW9uczsgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgcHRyIHRvIGl0IGluCisgICAgICAgICAqICB0aGUgQ29tbW9uRXJyb3JOb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiAgVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGR1cmluZyB0b2tlbiBwYXJzaW5nLCBub3QgdHJlZSBwYXJzaW5nLgorICAgICAgICAgKiAgVHJlZSBwYXJzaW5nIHNob3VsZCBoYXBwZW4gb25seSB3aGVuIHBhcnNpbmcgYW5kIHRyZWUgY29uc3RydWN0aW9uCisgICAgICAgICAqICBzdWNjZWVkLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IEVycm9yTm9kZShJVG9rZW5TdHJlYW0gaW5wdXQsIElUb2tlbiBzdGFydCwgSVRva2VuIHN0b3AsIFJlY29nbml0aW9uRXhjZXB0aW9uIGUpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5JcyB0cmVlIGNvbnNpZGVyZWQgYSBuaWwgbm9kZSB1c2VkIHRvIG1ha2UgbGlzdHMgb2YgY2hpbGQgbm9kZXM/PC9zdW1tYXJ5PiAqLworICAgICAgICBib29sIElzTmlsKG9iamVjdCB0cmVlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgICAgICAgICAqICBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAgICAgICAgICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHlvdSBjYW4gZGVjaWRlIGl0IGlzIG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB2aWEKKyAgICAgICAgICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAgICAgICAgICogIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZAorICAgICAgICAgKiAgQVNUcy4gIERvIG5vdGhpbmcgaWYgdCBvciBjaGlsZCBpcyBudWxsLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBBZGRDaGlsZChvYmplY3QgdCwgb2JqZWN0IGNoaWxkKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiBvbGRSb290IGlzIGEgbmlsIHJvb3QsIGp1c3QgY29weSBvciBtb3ZlIHRoZSBjaGlsZHJlbiB0byBuZXdSb290LgorICAgICAgICAgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAgICAgICAgICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgICAgICAgICAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgICAgICAgICAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgICAgICAgICAqCisgICAgICAgICAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAgICAgICAgICoKKyAgICAgICAgICogICAgb2xkPW51bGwsIG5ldz1yIHlpZWxkcyByCisgICAgICAgICAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgICAgICAgICAqCisgICAgICAgICAqICBSZXR1cm4gbmV3Um9vdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBuZXdSb290IGlzIG5vdCBhCisgICAgICAgICAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgICAgICAgICAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorICAgICAgICAgKgorICAgICAgICAgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgICAgICAgICAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorICAgICAgICAgKiAgY29uc3RydWN0aW5nIHRoZXNlIG5vZGVzIHNvIHdlIHNob3VsZCBoYXZlIHRoaXMgY29udHJvbCBmb3IKKyAgICAgICAgICogIGVmZmljaWVuY3kuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBvYmplY3QgQmVjb21lUm9vdChvYmplY3QgbmV3Um9vdCwgb2JqZWN0IG9sZFJvb3QpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdpdmVuIHRoZSByb290IG9mIHRoZSBzdWJ0cmVlIGNyZWF0ZWQgZm9yIHRoaXMgcnVsZSwgcG9zdCBwcm9jZXNzCisgICAgICAgICAqICBpdCB0byBkbyBhbnkgc2ltcGxpZmljYXRpb25zIG9yIHdoYXRldmVyIHlvdSB3YW50LiAgQSByZXF1aXJlZAorICAgICAgICAgKiAgYmVoYXZpb3IgaXMgdG8gY29udmVydCBeKG5pbCBzaW5nbGVTdWJ0cmVlKSB0byBzaW5nbGVTdWJ0cmVlCisgICAgICAgICAqICBhcyB0aGUgc2V0dGluZyBvZiBzdGFydC9zdG9wIGluZGV4ZXMgcmVsaWVzIG9uIGEgc2luZ2xlIG5vbi1uaWwgcm9vdAorICAgICAgICAgKiAgZm9yIG5vbi1mbGF0IHRyZWVzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBGbGF0IHRyZWVzIHN1Y2ggYXMgZm9yIGxpc3RzIGxpa2UgImlkbGlzdCA6IElEKyA7IiBhcmUgbGVmdCBhbG9uZQorICAgICAgICAgKiAgdW5sZXNzIHRoZXJlIGlzIG9ubHkgb25lIElELiAgRm9yIGEgbGlzdCwgdGhlIHN0YXJ0L3N0b3AgaW5kZXhlcworICAgICAgICAgKiAgYXJlIHNldCBpbiB0aGUgbmlsIG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBhZnRlciBhbGwgcnVsZSB0cmVlIGNvbnN0cnVjdGlvbiBhbmQgcmlnaHQKKyAgICAgICAgICogIGJlZm9yZSBzZXRUb2tlbkJvdW5kYXJpZXMoKS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIG9iamVjdCBSdWxlUG9zdFByb2Nlc3Npbmcob2JqZWN0IHJvb3QpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Gb3IgaWRlbnRpZnlpbmcgdHJlZXMuPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBIb3cgdG8gaWRlbnRpZnkgbm9kZXMgc28gd2UgY2FuIHNheSAiYWRkIG5vZGUgdG8gYSBwcmlvciBub2RlIj8KKyAgICAgICAgICogIEV2ZW4gYmVjb21lUm9vdCBpcyBhbiBpc3N1ZS4gIFVzZSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShub2RlKQorICAgICAgICAgKiAgdXN1YWxseS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIGludCBHZXRVbmlxdWVJRChvYmplY3Qgbm9kZSk7CisKKworICAgICAgICAvLyBSIGUgdyByIGkgdCBlICBSIHUgbCBlIHMKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBub2RlIGZvciBuZXdSb290IG1ha2UgaXQgdGhlIHJvb3Qgb2Ygb2xkUm9vdC4KKyAgICAgICAgICogIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgICAgICAgICAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZXR1cm5zPgorICAgICAgICAgKiAgUmV0dXJuIG5vZGUgY3JlYXRlZCBmb3IgbmV3Um9vdC4KKyAgICAgICAgICogIDwvcmV0dXJucz4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgQmUgYWR2aXNlZDogd2hlbiBkZWJ1Z2dpbmcgQVNUcywgdGhlIERlYnVnVHJlZUFkYXB0b3IgbWFudWFsbHkKKyAgICAgICAgICogIGNhbGxzIGNyZWF0ZShUb2tlbiBjaGlsZCkgYW5kIHRoZW4gcGxhaW4gYmVjb21lUm9vdChub2RlLCBub2RlKQorICAgICAgICAgKiAgYmVjYXVzZSBpdCBuZWVkcyB0byB0cmFwIGNhbGxzIHRvIGNyZWF0ZSwgYnV0IGl0IGNhbid0IHNpbmNlIGl0IGRlbGVnYXRlcworICAgICAgICAgKiAgdG8gbm90IGluaGVyaXRzIGZyb20gdGhlIFRyZWVBZGFwdG9yLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IEJlY29tZVJvb3QoSVRva2VuIG5ld1Jvb3QsIG9iamVjdCBvbGRSb290KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorICAgICAgICAgKiAgVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgICAgICAgKiAgcmV3cml0ZSBydWxlIGFzIElNQUdbJHRva2VuTGFiZWxdLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IENyZWF0ZShpbnQgdG9rZW5UeXBlLCBJVG9rZW4gZnJvbVRva2VuKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTYW1lIGFzIGNyZWF0ZSh0b2tlblR5cGUsZnJvbVRva2VuKSBleGNlcHQgc2V0IHRoZSB0ZXh0IHRvby4KKyAgICAgICAgICogIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAgICAgICAgICogIHJld3JpdGUgcnVsZSBhcyBJTUFHWyR0b2tlbkxhYmVsLCAiSU1BRyJdLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IENyZWF0ZShpbnQgdG9rZW5UeXBlLCBJVG9rZW4gZnJvbVRva2VuLCBzdHJpbmcgdGV4dCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ3JlYXRlIGEgbmV3IG5vZGUgZGVyaXZlZCBmcm9tIGEgdG9rZW4sIHdpdGggYSBuZXcgdG9rZW4gdHlwZS4KKyAgICAgICAgICogIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAgICAgICAgICogIHJld3JpdGUgcnVsZSBhcyBJTUFHWyJJTUFHIl0uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgc2hvdWxkIGludm9rZSBjcmVhdGVUb2tlbihpbnQsU3RyaW5nKS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIG9iamVjdCBDcmVhdGUoaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQpOworCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQ29udGVudAorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Gb3IgdHJlZSBwYXJzaW5nLCBJIG5lZWQgdG8ga25vdyB0aGUgdG9rZW4gdHlwZSBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBHZXRUeXBlKG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+Tm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdHlwZSBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0VHlwZShvYmplY3QgdCwgaW50IHR5cGUpOworCisgICAgICAgIHN0cmluZyBHZXRUZXh0KG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+Tm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdGV4dCBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0VGV4dChvYmplY3QgdCwgc3RyaW5nIHRleHQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiB0aGUgdG9rZW4gb2JqZWN0IGZyb20gd2hpY2ggdGhpcyBub2RlIHdhcyBjcmVhdGVkLgorICAgICAgICAgKiAgQ3VycmVudGx5IHVzZWQgb25seSBmb3IgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgICogIFRoZSBlcnJvciBkaXNwbGF5IHJvdXRpbmUgaW4gQmFzZVJlY29nbml6ZXIgbmVlZHMgdG8KKyAgICAgICAgICogIGRpc3BsYXkgd2hlcmUgdGhlIGlucHV0IHRoZSBlcnJvciBvY2N1cnJlZC4gSWYgeW91cgorICAgICAgICAgKiAgdHJlZSBvZiBsaW1pdGF0aW9uIGRvZXMgbm90IHN0b3JlIGluZm9ybWF0aW9uIHRoYXQgY2FuCisgICAgICAgICAqICBsZWFkIHlvdSB0byB0aGUgdG9rZW4sIHlvdSBjYW4gY3JlYXRlIGEgdG9rZW4gZmlsbGVkIHdpdGgKKyAgICAgICAgICogIHRoZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiBhbmQgcGFzcyB0aGF0IGJhY2suICBTZWUKKyAgICAgICAgICogIEJhc2VSZWNvZ25pemVyLmdldEVycm9yTWVzc2FnZSgpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSVRva2VuIEdldFRva2VuKG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGVyZSBhcmUgdGhlIGJvdW5kcyBpbiB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtIGZvciB0aGlzIG5vZGUgYW5kCisgICAgICAgICAqICBhbGwgY2hpbGRyZW4/ICBFYWNoIHJ1bGUgdGhhdCBjcmVhdGVzIEFTVCBub2RlcyB3aWxsIGNhbGwgdGhpcworICAgICAgICAgKiAgbWV0aG9kIHJpZ2h0IGJlZm9yZSByZXR1cm5pbmcuICBGbGF0IHRyZWVzIChpLmUuLCBsaXN0cykgd2lsbAorICAgICAgICAgKiAgc3RpbGwgdXN1YWxseSBoYXZlIGEgbmlsIHJvb3Qgbm9kZSBqdXN0IHRvIGhvbGQgdGhlIGNoaWxkcmVuIGxpc3QuCisgICAgICAgICAqICBUaGF0IG5vZGUgd291bGQgY29udGFpbiB0aGUgc3RhcnQvc3RvcCBpbmRleGVzIHRoZW4uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFNldFRva2VuQm91bmRhcmllcyhvYmplY3QgdCwgSVRva2VuIHN0YXJ0VG9rZW4sIElUb2tlbiBzdG9wVG9rZW4pOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgdGhlIHRva2VuIHN0YXJ0IGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4PC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgR2V0VG9rZW5TdGFydEluZGV4KG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+R2V0IHRoZSB0b2tlbiBzdG9wIGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4PC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgR2V0VG9rZW5TdG9wSW5kZXgob2JqZWN0IHQpOworCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gTmF2aWdhdGlvbiAvIFRyZWUgUGFyc2luZworCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgYSBjaGlsZCAwLi5uLTEgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgb2JqZWN0IEdldENoaWxkKG9iamVjdCB0LCBpbnQgaSk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCBpdGggY2hpbGQgKDAuLm4tMSkgdG8gdDsgdCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tbmlsIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0Q2hpbGQob2JqZWN0IHQsIGludCBpLCBvYmplY3QgY2hpbGQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZW1vdmUgaXRoIGNoaWxkIGFuZCBzaGlmdCBjaGlsZHJlbiBkb3duIGZyb20gcmlnaHQuPC9zdW1tYXJ5PiAqLworICAgICAgICBvYmplY3QgRGVsZXRlQ2hpbGQob2JqZWN0IHQsIGludCBpKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+SG93IG1hbnkgY2hpbGRyZW4/ICBJZiAwLCB0aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBHZXRDaGlsZENvdW50KG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaG8gaXMgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZTsgaWYgbnVsbCwgaW1wbGllcyBub2RlIGlzIHJvb3QuCisgICAgICAgICAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICAgICAgICAgKiAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IEdldFBhcmVudChvYmplY3QgdCk7CisgICAgICAgIHZvaWQgU2V0UGFyZW50KG9iamVjdCB0LCBvYmplY3QgcGFyZW50KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IGluZGV4IGlzIHRoaXMgbm9kZSBpbiB0aGUgY2hpbGQgbGlzdD8gUmFuZ2U6IDAuLm4tMQorICAgICAgICAgKiAgSWYgeW91ciBub2RlIHR5cGUgZG9lc24ndCBoYW5kbGUgdGhpcywgaXQncyBvayBidXQgdGhlIHRyZWUgcmV3cml0ZXMKKyAgICAgICAgICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIGludCBHZXRDaGlsZEluZGV4KG9iamVjdCB0KTsKKyAgICAgICAgdm9pZCBTZXRDaGlsZEluZGV4KG9iamVjdCB0LCBpbnQgaW5kZXgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlcGxhY2UgZnJvbSBzdGFydCB0byBzdG9wIGNoaWxkIGluZGV4IG9mIHBhcmVudCB3aXRoIHQsIHdoaWNoIG1pZ2h0CisgICAgICAgICAqICBiZSBhIGxpc3QuICBOdW1iZXIgb2YgY2hpbGRyZW4gbWF5IGJlIGRpZmZlcmVudCBhZnRlciB0aGlzIGNhbGwuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHBhcmVudCBpcyBudWxsLCBkb24ndCBkbyBhbnl0aGluZzsgbXVzdCBiZSBhdCByb290IG9mIG92ZXJhbGwgdHJlZS4KKyAgICAgICAgICogIENhbid0IHJlcGxhY2Ugd2hhdGV2ZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgZXh0ZXJuYWxseS4gIERvIG5vdGhpbmcuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFJlcGxhY2VDaGlsZHJlbihvYmplY3QgcGFyZW50LCBpbnQgc3RhcnRDaGlsZEluZGV4LCBpbnQgc3RvcENoaWxkSW5kZXgsIG9iamVjdCB0KTsKKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZU5vZGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL0lUcmVlTm9kZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg5NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZU5vZGVTdHJlYW0uY3MKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgLyoqIDxzdW1tYXJ5PkEgc3RyZWFtIG9mIHRyZWUgbm9kZXMsIGFjY2Vzc2luZyBub2RlcyBmcm9tIGEgdHJlZSBvZiBzb21lIGtpbmQ8L3N1bW1hcnk+ICovCisgICAgcHVibGljIGludGVyZmFjZSBJVHJlZU5vZGVTdHJlYW0gOiBJSW50U3RyZWFtIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IGEgdHJlZSBub2RlIGF0IGFuIGFic29sdXRlIGluZGV4IGk7IDAuLm4tMS4KKyAgICAgICAgICogIElmIHlvdSBkb24ndCB3YW50IHRvIGJ1ZmZlciB1cCBub2RlcywgdGhlbiB0aGlzIG1ldGhvZCBtYWtlcyBubworICAgICAgICAgKiAgc2Vuc2UgZm9yIHlvdS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIG9iamVjdCB0aGlzW2ludCBpXSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHZXQgdHJlZSBub2RlIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgbm9kZS4KKyAgICAgICAgICogIGkmbHQ7MCBpbmRpY2F0ZXMgbm9kZXMgaW4gdGhlIHBhc3QuICBTbyBMVCgtMSkgaXMgcHJldmlvdXMgbm9kZSwgYnV0CisgICAgICAgICAqICBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBwcm92aWRlIHJlc3VsdHMgZm9yIGsgJmx0OyAtMS4KKyAgICAgICAgICogIExUKDApIGlzIHVuZGVmaW5lZC4gIEZvciBpJmd0Oz1uLCByZXR1cm4gbnVsbC4KKyAgICAgICAgICogIFJldHVybiBudWxsIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgICAgICAgICAqICB0aGF0IGlzIG5lZ2F0aXZlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIGlzIGFuYWxvZ3VzIHRvIHRoZSBMVCgpIG1ldGhvZCBvZiB0aGUgVG9rZW5TdHJlYW0sIGJ1dCB0aGlzCisgICAgICAgICAqICByZXR1cm5zIGEgdHJlZSBub2RlIGluc3RlYWQgb2YgYSB0b2tlbi4gIE1ha2VzIGNvZGUgZ2VuIGlkZW50aWNhbAorICAgICAgICAgKiAgZm9yIGJvdGggcGFyc2VyIGFuZCB0cmVlIGdyYW1tYXJzLiA6KQorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IExUKGludCBrKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIG5vZGVzIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisgICAgICAgICAqICB0aGUgb2JqZWN0IHRoYXQgcHJvdmlkZXMgbm9kZSBvYmplY3RzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IFRyZWVTb3VyY2UgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgdGhlIHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtIHdhcyBjcmVhdGVkIGZyb20gYSBUb2tlblN0cmVhbSwKKyAgICAgICAgICogIHlvdSBjYW4gc3BlY2lmeSBpdCBoZXJlLiAgVXNlZCB0byBkbyBydWxlICR0ZXh0IGF0dHJpYnV0ZSBpbiB0cmVlCisgICAgICAgICAqICBwYXJzZXIuICBPcHRpb25hbCB1bmxlc3MgeW91IHVzZSB0cmVlIHBhcnNlciBydWxlIHRleHQgYXR0cmlidXRlCisgICAgICAgICAqICBvciBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBvcHRpb25zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSVRva2VuU3RyZWFtIFRva2VuU3RyZWFtIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoYXQgYWRhcHRvciBjYW4gdGVsbCBtZSBob3cgdG8gaW50ZXJwcmV0L25hdmlnYXRlIG5vZGVzIGFuZAorICAgICAgICAgKiAgdHJlZXMuICBFLmcuLCBnZXQgdGV4dCBvZiBhIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVHJlZUFkYXB0b3IgVHJlZUFkYXB0b3IgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorICAgICAgICAgKiAgdGhlIHRyZWUgc3RydWN0dXJlLiAgV2hlbiBkZWJ1Z2dpbmcgd2UgbmVlZCB1bmlxdWUgbm9kZXMKKyAgICAgICAgICogIHNvIHdlIGhhdmUgdG8gaW5zdGFudGlhdGUgbmV3IG9uZXMuICBXaGVuIGRvaW5nIG5vcm1hbCB0cmVlCisgICAgICAgICAqICBwYXJzaW5nLCBpdCdzIHNsb3cgYW5kIGEgd2FzdGUgb2YgbWVtb3J5IHRvIGNyZWF0ZSB1bmlxdWUKKyAgICAgICAgICogIG5hdmlnYXRpb24gbm9kZXMuICBEZWZhdWx0IHNob3VsZCBiZSBmYWxzZTsKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgVW5pcXVlTmF2aWdhdGlvbk5vZGVzIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiB0aGUgdGV4dCBvZiBhbGwgbm9kZXMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgICAgICAgICAqICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIG5vZGVzIHRoZW4gaXQgY2FuIHN0aWxsCisgICAgICAgICAqICB3YWxrIHJlY3Vyc2l2ZWx5IGZyb20gc3RhcnQgdW50aWwgc3RvcC4gIFlvdSBjYW4gYWx3YXlzIHJldHVybgorICAgICAgICAgKiAgbnVsbCBvciAiIiB0b28sIGJ1dCB1c2VycyBzaG91bGQgbm90IGFjY2VzcyAkcnVsZUxhYmVsLnRleHQgaW4KKyAgICAgICAgICogIGFuIGFjdGlvbiBvZiBjb3Vyc2UgaW4gdGhhdCBjYXNlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgc3RyaW5nIFRvU3RyaW5nKG9iamVjdCBzdGFydCwgb2JqZWN0IHN0b3ApOworCisKKyAgICAgICAgI3JlZ2lvbiBSRVdSSVRJTkcgVFJFRVMgKHVzZWQgYnkgdHJlZSBwYXJzZXIpCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVwbGFjZSBmcm9tIHN0YXJ0IHRvIHN0b3AgY2hpbGQgaW5kZXggb2YgcGFyZW50IHdpdGggdCwgd2hpY2ggbWlnaHQKKyAgICAgICAgICogIGJlIGEgbGlzdC4gIE51bWJlciBvZiBjaGlsZHJlbiBtYXkgYmUgZGlmZmVyZW50CisgICAgICAgICAqICBhZnRlciB0aGlzIGNhbGwuICBUaGUgc3RyZWFtIGlzIG5vdGlmaWVkIGJlY2F1c2UgaXQgaXMgd2Fsa2luZyB0aGUKKyAgICAgICAgICogIHRyZWUgYW5kIG1pZ2h0IG5lZWQgdG8ga25vdyB5b3UgYXJlIG1vbmtleWluZyB3aXRoIHRoZSB1bmRlcmx5aW5nCisgICAgICAgICAqICB0cmVlLiAgQWxzbywgaXQgbWlnaHQgYmUgYWJsZSB0byBtb2RpZnkgdGhlIG5vZGUgc3RyZWFtIHRvIGF2b2lkCisgICAgICAgICAqICByZXN0cmVhbWluZyBmb3IgZnV0dXJlIHBoYXNlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorICAgICAgICAgKiAgQ2FuJ3QgcmVwbGFjZSB3aGF0ZXZlciBwb2ludHMgdG8gdGhlIHBhcmVudCBleHRlcm5hbGx5LiAgRG8gbm90aGluZy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUmVwbGFjZUNoaWxkcmVuKG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQpOworCisgICAgICAgICNlbmRyZWdpb24KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvSVRyZWVWaXNpdG9yQWN0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9JVHJlZVZpc2l0b3JBY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0N2JiNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvSVRyZWVWaXNpdG9yQWN0aW9uLmNzCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgSG93IHRvIGV4ZWN1dGUgY29kZSBmb3Igbm9kZSB0IHdoZW4gYSB2aXNpdG9yIHZpc2l0cyBub2RlIHQuICBFeGVjdXRlCisgICAgICogIHByZSgpIGJlZm9yZSB2aXNpdGluZyBjaGlsZHJlbiBhbmQgZXhlY3V0ZSBwb3N0KCkgYWZ0ZXIgdmlzaXRpbmcgY2hpbGRyZW4uCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUcmVlVmlzaXRvckFjdGlvbgorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRXhlY3V0ZSBhbiBhY3Rpb24gYmVmb3JlIHZpc2l0aW5nIGNoaWxkcmVuIG9mIHQuICBSZXR1cm4gdCBvcgorICAgICAgICAgKiAgYSByZXdyaXR0ZW4gdC4gIEl0IGlzIHVwIHRvIHRoZSB2aXNpdG9yIHRvIGRlY2lkZSB3aGF0IHRvIGRvCisgICAgICAgICAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuICBDaGlsZHJlbiBvZiByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlCisgICAgICAgICAqICB2aXNpdGVkIGlmIHVzaW5nIFRyZWVWaXNpdG9yLnZpc2l0KCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBvYmplY3QgUHJlKG9iamVjdCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBFeGVjdXRlIGFuIGFjdGlvbiBhZnRlciB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAgICAgICAgICogIGEgcmV3cml0dGVuIHQuICBJdCBpcyB1cCB0byB0aGUgdmlzaXRvciB0byBkZWNpZGUgd2hhdCB0byBkbworICAgICAgICAgKiAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IFBvc3Qob2JqZWN0IHQpOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBUcmVlVmlzaXRvckFjdGlvbgorICAgICAgICA6IElUcmVlVmlzaXRvckFjdGlvbgorICAgIHsKKyAgICAgICAgRnVuYzxvYmplY3QsIG9iamVjdD4gX3ByZUFjdGlvbjsKKyAgICAgICAgRnVuYzxvYmplY3QsIG9iamVjdD4gX3Bvc3RBY3Rpb247CisKKyAgICAgICAgcHVibGljIFRyZWVWaXNpdG9yQWN0aW9uKEZ1bmM8b2JqZWN0LCBvYmplY3Q+IHByZUFjdGlvbiwgRnVuYzxvYmplY3QsIG9iamVjdD4gcG9zdEFjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgX3ByZUFjdGlvbiA9IHByZUFjdGlvbjsKKyAgICAgICAgICAgIF9wb3N0QWN0aW9uID0gcG9zdEFjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgUHJlKG9iamVjdCB0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3ByZUFjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBfcHJlQWN0aW9uKHQpOworCisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgUG9zdChvYmplY3QgdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wb3N0QWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9wb3N0QWN0aW9uKHQpOworCisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvUGFyc2VUcmVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9QYXJzZVRyZWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxODA1YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvUGFyc2VUcmVlLmNzCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUgeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgcmVjb3JkIG9mIHRoZSBydWxlcyB1c2VkIHRvIG1hdGNoIGEgdG9rZW4gc2VxdWVuY2UuICBUaGUgdG9rZW5zCisgICAgICogIGVuZCB1cCBhcyB0aGUgbGVhdmVzIG9mIHRoaXMgdHJlZSBhbmQgcnVsZSBub2RlcyBhcmUgdGhlIGludGVyaW9yIG5vZGVzLgorICAgICAqICBUaGlzIHJlYWxseSBhZGRzIG5vIGZ1bmN0aW9uYWxpdHksIGl0IGlzIGp1c3QgYW4gYWxpYXMgZm9yIENvbW1vblRyZWUKKyAgICAgKiAgdGhhdCBpcyBtb3JlIG1lYW5pbmdmdWwgKHNwZWNpZmljKSBhbmQgaG9sZHMgYSBTdHJpbmcgdG8gZGlzcGxheSBmb3IgYSBub2RlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFBhcnNlVHJlZSA6IEJhc2VUcmVlIHsKKyAgICAgICAgcHVibGljIG9iamVjdCBwYXlsb2FkOworICAgICAgICBwdWJsaWMgTGlzdDxJVG9rZW4+IGhpZGRlblRva2VuczsKKworICAgICAgICBwdWJsaWMgUGFyc2VUcmVlKG9iamVjdCBsYWJlbCkgeworICAgICAgICAgICAgdGhpcy5wYXlsb2FkID0gbGFiZWw7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUZXh0IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVG9rZW5TdGFydEluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVG9rZW5TdG9wSW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUeXBlIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRyZWUgRHVwTm9kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkIGlzIElUb2tlbikgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gKElUb2tlbilwYXlsb2FkOworICAgICAgICAgICAgICAgIGlmICh0LlR5cGUgPT0gVG9rZW5UeXBlcy5FbmRPZkZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI8RU9GPiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0LlRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGF5bG9hZC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRW1pdCBhIHRva2VuIGFuZCBhbGwgaGlkZGVuIG5vZGVzIGJlZm9yZS4gIEVPRiBub2RlIGhvbGRzIGFsbAorICAgICAgICAgKiAgaGlkZGVuIHRva2VucyBhZnRlciBsYXN0IHJlYWwgdG9rZW4uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmdXaXRoSGlkZGVuVG9rZW5zKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKGhpZGRlblRva2VucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaWRkZW5Ub2tlbnMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBJVG9rZW4gaGlkZGVuID0gKElUb2tlbiloaWRkZW5Ub2tlbnNbaV07CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoaGlkZGVuLlRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZyBub2RlVGV4dCA9IHRoaXMuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICghbm9kZVRleHQuRXF1YWxzKCI8RU9GPiIpKQorICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQobm9kZVRleHQpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUHJpbnQgb3V0IHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlLCB3aGljaCBtZWFucyBwcmludGluZyBvcmlnaW5hbAorICAgICAgICAgKiAgaW5wdXQgYmFjayBvdXQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9JbnB1dFN0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIFRvU3RyaW5nTGVhdmVzKGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFRvU3RyaW5nTGVhdmVzKFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICBpZiAocGF5bG9hZCBpcyBJVG9rZW4pIHsgLy8gbGVhZiBub2RlIHRva2VuPworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQodGhpcy5Ub1N0cmluZ1dpdGhIaWRkZW5Ub2tlbnMoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IENoaWxkcmVuICE9IG51bGwgJiYgaSA8IENoaWxkcmVuLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBQYXJzZVRyZWUgdCA9IChQYXJzZVRyZWUpQ2hpbGRyZW5baV07CisgICAgICAgICAgICAgICAgdC5Ub1N0cmluZ0xlYXZlcyhidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTc2YzFlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBBcmd1bWVudE51bGxFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHRocm93biBkdXJpbmcgQVNUIHJld3JpdGUgY29uc3RydWN0aW9uLgorICAgICAqICBUaGlzIHNpZ25pZmllcyBhIGNhc2Ugd2hlcmUgdGhlIGNhcmRpbmFsaXR5IG9mIHR3byBvciBtb3JlIGVsZW1lbnRzCisgICAgICogIGluIGEgc3VicnVsZSBhcmUgZGlmZmVyZW50OiAoSUQgSU5UKSsgd2hlcmUgfElEfCE9fElOVHwKKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24gOiBFeGNlcHRpb24geworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZWxlbWVudERlc2NyaXB0aW9uOworCisgICAgICAgIHB1YmxpYyBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uKHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IHRoaXMoZWxlbWVudERlc2NyaXB0aW9uLCBlbGVtZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuX2VsZW1lbnREZXNjcmlwdGlvbiA9IGVsZW1lbnREZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24oc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiB0aGlzKGVsZW1lbnREZXNjcmlwdGlvbiwgZWxlbWVudERlc2NyaXB0aW9uLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKSB7CisgICAgICAgICAgICBfZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBfZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIF9lbGVtZW50RGVzY3JpcHRpb24gPSBpbmZvLkdldFN0cmluZygiRWxlbWVudERlc2NyaXB0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkVsZW1lbnREZXNjcmlwdGlvbiIsIF9lbGVtZW50RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjMwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIC8qKiA8c3VtbWFyeT5ObyBlbGVtZW50cyB3aXRoaW4gYSAoLi4uKSsgaW4gYSByZXdyaXRlIHJ1bGU8L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24gOiBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IGJhc2UoZWxlbWVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbihzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UoZWxlbWVudERlc2NyaXB0aW9uLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZWxlbWVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGVsZW1lbnREZXNjcmlwdGlvbiwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YjczZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDY0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgLyoqIDxzdW1tYXJ5PlJlZiB0byBJRCBvciBleHByIGJ1dCBubyB0b2tlbnMgaW4gSUQgc3RyZWFtIG9yIHN1YnRyZWVzIGluIGV4cHIgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24gOiBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbihzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKGVsZW1lbnREZXNjcmlwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbihzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UoZWxlbWVudERlc2NyaXB0aW9uLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBlbGVtZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24sIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBlbGVtZW50RGVzY3JpcHRpb24sIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjgzODAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5jcwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBJTGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdDsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBnZW5lcmljIGxpc3Qgb2YgZWxlbWVudHMgdHJhY2tlZCBpbiBhbiBhbHRlcm5hdGl2ZSB0byBiZSB1c2VkIGluCisgICAgICogIGEgLT4gcmV3cml0ZSBydWxlLiAgV2UgbmVlZCB0byBzdWJjbGFzcyB0byBmaWxsIGluIHRoZSBuZXh0KCkgbWV0aG9kLAorICAgICAqICB3aGljaCByZXR1cm5zIGVpdGhlciBhbiBBU1Qgbm9kZSB3cmFwcGVkIGFyb3VuZCBhIHRva2VuIHBheWxvYWQgb3IKKyAgICAgKiAgYW4gZXhpc3Rpbmcgc3VidHJlZS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPgorICAgICAqICBPbmNlIHlvdSBzdGFydCBuZXh0KClpbmcsIGRvIG5vdCB0cnkgdG8gYWRkIG1vcmUgZWxlbWVudHMuICBJdCB3aWxsCisgICAgICogIGJyZWFrIHRoZSBjdXJzb3IgdHJhY2tpbmcgSSBiZWxpZXZlLgorICAgICAqCisgICAgICogIFRPRE86IGFkZCBtZWNoYW5pc20gdG8gZGV0ZWN0L3B1a2Ugb24gbW9kaWZpY2F0aW9uIGFmdGVyIHJlYWRpbmcgZnJvbSBzdHJlYW0KKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqCisgICAgICogIDxzZWUgY3JlZj0iUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIi8+CisgICAgICogIDxzZWUgY3JlZj0iUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSIvPgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDdXJzb3IgMC4ubi0xLiAgSWYgc2luZ2xlRWxlbWVudCE9bnVsbCwgY3Vyc29yIGlzIDAgdW50aWwgeW91IG5leHQoKSwKKyAgICAgICAgICogIHdoaWNoIGJ1bXBzIGl0IHRvIDEgbWVhbmluZyBubyBtb3JlIGVsZW1lbnRzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBjdXJzb3IgPSAwOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayBzaW5nbGUgZWxlbWVudHMgdy9vIGNyZWF0aW5nIGEgbGlzdC4gIFVwb24gMm5kIGFkZCwgYWxsb2MgbGlzdCAqLworICAgICAgICBwcm90ZWN0ZWQgb2JqZWN0IHNpbmdsZUVsZW1lbnQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBsaXN0IG9mIHRva2VucyBvciBzdWJ0cmVlcyB3ZSBhcmUgdHJhY2tpbmcgKi8KKyAgICAgICAgcHJvdGVjdGVkIElMaXN0IGVsZW1lbnRzOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5PbmNlIGEgbm9kZSAvIHN1YnRyZWUgaGFzIGJlZW4gdXNlZCBpbiBhIHN0cmVhbSwgaXQgbXVzdCBiZSBkdXAnZAorICAgICAgICAgKiAgZnJvbSB0aGVuIG9uLiAgU3RyZWFtcyBhcmUgcmVzZXQgYWZ0ZXIgc3VicnVsZXMgc28gdGhhdCB0aGUgc3RyZWFtcworICAgICAgICAgKiAgY2FuIGJlIHJldXNlZCBpbiBmdXR1cmUgc3VicnVsZXMuICBTbywgcmVzZXQgbXVzdCBzZXQgYSBkaXJ0eSBiaXQuCisgICAgICAgICAqICBJZiBkaXJ0eSwgdGhlbiBuZXh0KCkgYWx3YXlzIHJldHVybnMgYSBkdXAuCisgICAgICAgICAqCisgICAgICAgICAqICBJIHdhbnRlZCB0byB1c2UgIm5hdWdodHkgYml0IiBoZXJlLCBidXQgY291bGRuJ3QgdGhpbmsgb2YgYSB3YXkKKyAgICAgICAgICogIHRvIHVzZSAibmF1Z2h0eSIuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBkaXJ0eSA9IGZhbHNlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgZWxlbWVudCBvciBzdHJlYW0gZGVzY3JpcHRpb247IHVzdWFsbHkgaGFzIG5hbWUgb2YgdGhlIHRva2VuIG9yCisgICAgICAgICAqICBydWxlIHJlZmVyZW5jZSB0aGF0IHRoaXMgbGlzdCB0cmFja3MuICBDYW4gaW5jbHVkZSBydWxlbmFtZSB0b28sIGJ1dAorICAgICAgICAgKiAgdGhlIGV4Y2VwdGlvbiB3b3VsZCB0cmFjayB0aGF0IGluZm8uCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbjsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0oSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbShJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgb2JqZWN0IG9uZUVsZW1lbnQpCisgICAgICAgICAgICA6IHRoaXMoYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICBBZGQob25lRWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q3JlYXRlIGEgc3RyZWFtLCBidXQgZmVlZCBvZmYgYW4gZXhpc3RpbmcgbGlzdDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbShJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgSUxpc3QgZWxlbWVudHMpCisgICAgICAgICAgICA6IHRoaXMoYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnNpbmdsZUVsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVzZXQgdGhlIGNvbmRpdGlvbiBvZiB0aGlzIHN0cmVhbSBzbyB0aGF0IGl0IGFwcGVhcnMgd2UgaGF2ZQorICAgICAgICAgKiAgbm90IGNvbnN1bWVkIGFueSBvZiBpdHMgZWxlbWVudHMuICBFbGVtZW50cyB0aGVtc2VsdmVzIGFyZSB1bnRvdWNoZWQuCisgICAgICAgICAqICBPbmNlIHdlIHJlc2V0IHRoZSBzdHJlYW0sIGFueSBmdXR1cmUgdXNlIHdpbGwgbmVlZCBkdXBsaWNhdGVzLiAgU2V0CisgICAgICAgICAqICB0aGUgZGlydHkgYml0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXNldCgpIHsKKyAgICAgICAgICAgIGN1cnNvciA9IDA7CisgICAgICAgICAgICBkaXJ0eSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZChvYmplY3QgZWwpIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgJyIrZWxlbWVudERlc2NyaXB0aW9uKyInIGlzICIrZWwpOworICAgICAgICAgICAgaWYgKGVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkgeyAvLyBpZiBpbiBsaXN0LCBqdXN0IGFkZAorICAgICAgICAgICAgICAgIGVsZW1lbnRzLkFkZChlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT0gbnVsbCkgeyAvLyBubyBlbGVtZW50cyB5ZXQsIHRyYWNrIHcvbyBsaXN0CisgICAgICAgICAgICAgICAgc2luZ2xlRWxlbWVudCA9IGVsOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZGluZyAybmQgZWxlbWVudCwgbW92ZSB0byBsaXN0CisgICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBMaXN0PG9iamVjdD4oNSk7CisgICAgICAgICAgICBlbGVtZW50cy5BZGQoc2luZ2xlRWxlbWVudCk7CisgICAgICAgICAgICBzaW5nbGVFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGVsZW1lbnRzLkFkZChlbCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLiAgSWYgb3V0IG9mIGVsZW1lbnRzLCB0aHJvdworICAgICAgICAgKiAgYW4gZXhjZXB0aW9uIHVubGVzcyBzaXplKCk9PTEuICBJZiBzaXplIGlzIDEsIHRoZW4gcmV0dXJuIGVsZW1lbnRzWzBdLgorICAgICAgICAgKiAgUmV0dXJuIGEgZHVwbGljYXRlIG5vZGUvc3VidHJlZSBpZiBzdHJlYW0gaXMgb3V0IG9mIGVsZW1lbnRzIGFuZAorICAgICAgICAgKiAgc2l6ZT09MS4gIElmIHdlJ3ZlIGFscmVhZHkgdXNlZCB0aGUgZWxlbWVudCwgZHVwIChkaXJ0eSBiaXQgc2V0KS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBOZXh0VHJlZSgpIHsKKyAgICAgICAgICAgIGludCBuID0gQ291bnQ7CisgICAgICAgICAgICBpZiAoZGlydHkgfHwgKGN1cnNvciA+PSBuICYmIG4gPT0gMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemUgaXMgMSwgZHVwCisgICAgICAgICAgICAgICAgb2JqZWN0IGVsID0gTmV4dENvcmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRHVwKGVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRlc3Qgc2l6ZSBhYm92ZSB0aGVuIGZldGNoCisgICAgICAgICAgICBvYmplY3QgZWwyID0gTmV4dENvcmUoKTsKKyAgICAgICAgICAgIHJldHVybiBlbDI7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBEbyB0aGUgd29yayBvZiBnZXR0aW5nIHRoZSBuZXh0IGVsZW1lbnQsIG1ha2luZyBzdXJlIHRoYXQgaXQncworICAgICAgICAgKiAgYSB0cmVlIG5vZGUgb3Igc3VidHJlZS4gIERlYWwgd2l0aCB0aGUgb3B0aW1pemF0aW9uIG9mIHNpbmdsZS0KKyAgICAgICAgICogIGVsZW1lbnQgbGlzdCB2ZXJzdXMgbGlzdCBvZiBzaXplID4gMS4gIFRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgKiAgaWYgdGhlIHN0cmVhbSBpcyBlbXB0eSBvciB3ZSdyZSBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemU+MS4KKyAgICAgICAgICogIHByb3RlY3RlZCBzbyB5b3UgY2FuIG92ZXJyaWRlIGluIGEgc3ViY2xhc3MgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgb2JqZWN0IE5leHRDb3JlKCkgeworICAgICAgICAgICAgaW50IG4gPSBDb3VudDsKKyAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKGVsZW1lbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3Vyc29yID49IG4pIHsgLy8gb3V0IG9mIGVsZW1lbnRzPworICAgICAgICAgICAgICAgIGlmIChuID09IDEpIHsgIC8vIGlmIHNpemUgaXMgMSwgaXQncyBvazsgcmV0dXJuIGFuZCB3ZSdsbCBkdXAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvVHJlZShzaW5nbGVFbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIHdhcyBub3QgMSwgc28gd2UgY2FuJ3QgZHVwCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihlbGVtZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2UgaGF2ZSBlbGVtZW50cworICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnNvcisrOyAvLyBtb3ZlIGN1cnNvciBldmVuIGZvciBzaW5nbGUgZWxlbWVudCBsaXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIFRvVHJlZShzaW5nbGVFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBtb3JlIHRoYW4gb25lIGluIGxpc3QsIHB1bGwgZnJvbSBlbGVtZW50cworICAgICAgICAgICAgb2JqZWN0IG8gPSBUb1RyZWUoZWxlbWVudHNbY3Vyc29yXSk7CisgICAgICAgICAgICBjdXJzb3IrKzsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGR1cCBhIHRva2VuIG9yIEFTVAorICAgICAgICAgKiAJc3VidHJlZS4gIER1cCdpbmcgYSB0b2tlbiBtZWFucyBqdXN0IGNyZWF0aW5nIGFub3RoZXIgQVNUIG5vZGUKKyAgICAgICAgICogIGFyb3VuZCBpdC4gIEZvciB0cmVlcywgeW91IG11c3QgY2FsbCB0aGUgYWRhcHRvci5kdXBUcmVlKCkgdW5sZXNzCisgICAgICAgICAqICB0aGUgZWxlbWVudCBpcyBmb3IgYSB0cmVlIHJvb3Q7IHRoZW4gaXQgbXVzdCBiZSBhIG5vZGUgZHVwLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IG9iamVjdCBEdXAob2JqZWN0IGVsKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBFbnN1cmUgc3RyZWFtIGVtaXRzIHRyZWVzOyB0b2tlbnMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gQVNUIG5vZGVzLgorICAgICAgICAgKiAgQVNUIG5vZGVzIGNhbiBiZSBwYXNzZWQgdGhyb3VnaCB1bm1vbGVzdGVkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgb2JqZWN0IFRvVHJlZShvYmplY3QgZWwpIHsKKyAgICAgICAgICAgIHJldHVybiBlbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSGFzTmV4dCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiAoc2luZ2xlRWxlbWVudCAhPSBudWxsICYmIGN1cnNvciA8IDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnRzICE9IG51bGwgJiYgY3Vyc29yIDwgZWxlbWVudHMuQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgIGlmIChzaW5nbGVFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5Db3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgRGVzY3JpcHRpb24geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlUnVsZU5vZGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZiZTVjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlUnVsZU5vZGVTdHJlYW0uY3MKQEAgLTAsMCArMSw3OSBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0NvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBMdWJlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisJdXNpbmcgU3lzdGVtOworCXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisJLy8vIDxzdW1tYXJ5PgorCS8vLyBRdWV1ZXMgdXAgbm9kZXMgbWF0Y2hlZCBvbiBsZWZ0IHNpZGUgb2YgLT4gaW4gYSB0cmVlIHBhcnNlci4gVGhpcyBpcworCS8vLyB0aGUgYW5hbG9nIG9mIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gZm9yIG5vcm1hbCBwYXJzZXJzLiAKKwkvLy8gPC9zdW1tYXJ5PgorCXB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZU5vZGVTdHJlYW0gOiBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworCQlwdWJsaWMgUmV3cml0ZVJ1bGVOb2RlU3RyZWFtKElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uKQorCQkJOiBiYXNlKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbikgeworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PkNyZWF0ZSBhIHN0cmVhbSB3aXRoIG9uZSBlbGVtZW50PC9zdW1tYXJ5PgorCQlwdWJsaWMgUmV3cml0ZVJ1bGVOb2RlU3RyZWFtKAorCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IsCisJCQlzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLAorCQkJb2JqZWN0IG9uZUVsZW1lbnQKKwkJKSA6IGJhc2UoYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uLCBvbmVFbGVtZW50KSB7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+Q3JlYXRlIGEgc3RyZWFtLCBidXQgZmVlZCBvZmYgYW4gZXhpc3RpbmcgbGlzdDwvc3VtbWFyeT4KKwkJcHVibGljIFJld3JpdGVSdWxlTm9kZVN0cmVhbSgKKwkJCUlUcmVlQWRhcHRvciBhZGFwdG9yLAorCQkJc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIElMaXN0PG9iamVjdD4gZWxlbWVudHMKKwkJKSA6IGJhc2UoYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uLCBlbGVtZW50cykgeworCQl9CisKKwkJcHVibGljIG9iamVjdCBOZXh0Tm9kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBOZXh0VHJlZSgpOworCQl9CisKKwkJb3ZlcnJpZGUgcHJvdGVjdGVkIG9iamVjdCBUb1RyZWUob2JqZWN0IGVsKSB7CisJCQlyZXR1cm4gYWRhcHRvci5EdXBOb2RlKGVsKTsKKwkJfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgRHVwKG9iamVjdCBlbCkgeworICAgICAgICAgICAgLy8gd2UgZHVwIGV2ZXJ5IG5vZGUsIHNvIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgY2FsbGluZyBkdXA7IHNob3J0LQorICAgICAgICAgICAgLy8gY2lyY3VpdGVkIG5leHQoKSBzbyBpdCBkb2Vzbid0IGNhbGwuCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJkdXAgY2FuJ3QgYmUgY2FsbGVkIGZvciBhIG5vZGUgc3RyZWFtLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA5MDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uY3MKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBJTGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdDsKKworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gOiBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkNyZWF0ZSBhIHN0cmVhbSB3aXRoIG9uZSBlbGVtZW50PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBvYmplY3Qgb25lRWxlbWVudCkKKyAgICAgICAgICAgIDogYmFzZShhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24sIG9uZUVsZW1lbnQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBJTGlzdCBlbGVtZW50cykKKyAgICAgICAgICAgIDogYmFzZShhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24sIGVsZW1lbnRzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUcmVhdCBuZXh0IGVsZW1lbnQgYXMgYSBzaW5nbGUgbm9kZSBldmVuIGlmIGl0J3MgYSBzdWJ0cmVlLgorICAgICAgICAgKiAgVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YgbmV4dCgpIHdoZW4gdGhlIHJlc3VsdCBoYXMgdG8gYmUgYQorICAgICAgICAgKiAgdHJlZSByb290IG5vZGUuICBBbHNvIHByZXZlbnRzIHVzIGZyb20gZHVwbGljYXRpbmcgcmVjZW50bHktYWRkZWQKKyAgICAgICAgICogIGNoaWxkcmVuOyBlLmcuLCBeKHR5cGUgSUQpKyBhZGRzIElEIHRvIHR5cGUgYW5kIHRoZW4gMm5kIGl0ZXJhdGlvbgorICAgICAgICAgKiAgbXVzdCBkdXAgdGhlIHR5cGUgbm9kZSwgYnV0IElEIGhhcyBiZWVuIGFkZGVkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBSZWZlcmVuY2luZyBhIHJ1bGUgcmVzdWx0IHR3aWNlIGlzIG9rOyBkdXAgZW50aXJlIHRyZWUgYXMKKyAgICAgICAgICogIHdlIGNhbid0IGJlIGFkZGluZyB0cmVlcyBhcyByb290OyBlLmcuLCBleHByIGV4cHIuCisgICAgICAgICAqCisgICAgICAgICAqICBIaWRlb3VzIGNvZGUgZHVwbGljYXRpb24gaGVyZSB3aXRoIHN1cGVyLm5leHQoKS4gIENhbid0IHRoaW5rIG9mCisgICAgICAgICAqICBhIHByb3BlciB3YXkgdG8gcmVmYWN0b3IuICBUaGlzIG5lZWRzIHRvIGFsd2F5cyBjYWxsIGR1cCBub2RlCisgICAgICAgICAqICBhbmQgc3VwZXIubmV4dCgpIGRvZXNuJ3Qga25vdyB3aGljaCB0byBjYWxsOiBkdXAgbm9kZSBvciBkdXAgdHJlZS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBOZXh0Tm9kZSgpIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJuZXh0Tm9kZTogZWxlbWVudHM9ezB9LCBzaW5nbGVFbGVtZW50PXsxfSIsIGVsZW1lbnRzLCAoKElUcmVlKXNpbmdsZUVsZW1lbnQpLlRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgIGludCBuID0gQ291bnQ7CisgICAgICAgICAgICBpZiAoZGlydHkgfHwgKGN1cnNvciA+PSBuICYmIG4gPT0gMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemUgaXMgMSwgZHVwIChhdCBtb3N0IGEgc2luZ2xlIG5vZGUKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGZvciBtYWtpbmcgcm9vdCBub2RlcykuCisgICAgICAgICAgICAgICAgb2JqZWN0IGVsID0gTmV4dENvcmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5EdXBOb2RlKGVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRlc3Qgc2l6ZSBhYm92ZSB0aGVuIGZldGNoCisgICAgICAgICAgICBvYmplY3QgdHJlZSA9IE5leHRDb3JlKCk7CisgICAgICAgICAgICB3aGlsZSAoYWRhcHRvci5Jc05pbCh0cmVlKSAmJiBhZGFwdG9yLkdldENoaWxkQ291bnQodHJlZSkgPT0gMSkKKyAgICAgICAgICAgICAgICB0cmVlID0gYWRhcHRvci5HZXRDaGlsZCh0cmVlLCAwKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLkNvbnNvbGUuV3JpdGVMaW5lKCJfbmV4dD17MH0iLCAoKElUcmVlKXRyZWUpLlRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgIG9iamVjdCBlbDIgPSBhZGFwdG9yLkR1cE5vZGUodHJlZSk7IC8vIGR1cCBqdXN0IHRoZSByb290ICh3YW50IG5vZGUgaGVyZSkKKyAgICAgICAgICAgIHJldHVybiBlbDI7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IER1cChvYmplY3QgZWwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkR1cFRyZWUoZWwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlUnVsZVRva2VuU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9SZXdyaXRlUnVsZVRva2VuU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDBhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1Jld3JpdGVSdWxlVG9rZW5TdHJlYW0uY3MKQEAgLTAsMCArMSw5NCBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0NvcHlyaWdodCAoYykgMjAwNyBKb2hhbm5lcyBMdWJlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisJdXNpbmcgU3lzdGVtOworCXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisJLy8vIDxzdW1tYXJ5PgorCS8vLyA8L3N1bW1hcnk+CisJLy8vIDxyZW1hcmtzPjwvcmVtYXJrcz4KKwkvLy8gPGV4YW1wbGU+PC9leGFtcGxlPgorCXB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIDogUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKwkJcHVibGljIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisJCQk6IGJhc2UoYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uKSB7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBDcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudAorCQkvLy8gPC9zdW1tYXJ5PgorCQlwdWJsaWMgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSgKKwkJCUlUcmVlQWRhcHRvciBhZGFwdG9yLAorCQkJc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwKKyAgICAgICAgICAgIG9iamVjdCBvbmVFbGVtZW50CisJCSkgOiBiYXNlKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgb25lRWxlbWVudCkgeworCQl9CisKKwkJLy8vIDxzdW1tYXJ5PkNyZWF0ZSBhIHN0cmVhbSwgYnV0IGZlZWQgb2ZmIGFuIGV4aXN0aW5nIGxpc3Q8L3N1bW1hcnk+CisJCXB1YmxpYyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKAorCQkJSVRyZWVBZGFwdG9yIGFkYXB0b3IsCisJCQlzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLAorICAgICAgICAgICAgSUxpc3Q8b2JqZWN0PiBlbGVtZW50cworCQkpIDogYmFzZShhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24sIGVsZW1lbnRzKSB7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXQgbmV4dCB0b2tlbiBmcm9tIHN0cmVhbSBhbmQgbWFrZSBhIG5vZGUgZm9yIGl0LgorCQkvLy8gPC9zdW1tYXJ5PgorCQkvLy8gPHJlbWFya3M+CisJCS8vLyBJVHJlZUFkYXB0b3IuQ3JlYXRlKCkgcmV0dXJucyBhbiBvYmplY3QsIHNvIG5vIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIHBvc3NpYmxlLgorCQkvLy8gPC9yZW1hcmtzPgorCQlwdWJsaWMgdmlydHVhbCBvYmplY3QgTmV4dE5vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5DcmVhdGUoKElUb2tlbikgTmV4dFRyZWUoKSk7CisJCX0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTmV4dFRva2VuKCkgeworICAgICAgICAgICAgcmV0dXJuIChJVG9rZW4pIE5leHRUcmVlKCk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyAKKwkJLy8vIERvbid0IGNvbnZlcnQgdG8gYSB0cmVlIHVubGVzcyB0aGV5IGV4cGxpY2l0bHkgY2FsbCBOZXh0VHJlZSgpLgorCQkvLy8gVGhpcyB3YXkgd2UgY2FuIGRvIGhldGVybyB0cmVlIG5vZGVzIGluIHJld3JpdGUuCisJCS8vLyA8L3N1bW1hcnk+CisgICAgICAgIG92ZXJyaWRlIHByb3RlY3RlZCBvYmplY3QgVG9UcmVlKG9iamVjdCBlbCkgeworCQkJcmV0dXJuIGVsOworCQl9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBEdXAob2JqZWN0IGVsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJkdXAgY2FuJ3QgYmUgY2FsbGVkIGZvciBhIHRva2VuIHN0cmVhbS4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZUNvbnN0YW50cy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZUNvbnN0YW50cy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2QzMTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlQ29uc3RhbnRzLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJlZUNvbnN0YW50cworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJVHJlZSBJTlZBTElEX05PREUgPSBuZXcgQ29tbW9uVHJlZSggVG9rZW5zLkludmFsaWQgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVGaWx0ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVGaWx0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZWM2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZUZpbHRlci5jcwpAQCAtMCwwICsxLDE0NCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgcHVibGljIGRlbGVnYXRlIFRSZXN1bHQgRnVuYzxULCBUUmVzdWx0PihUIGFyZyk7CisgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgQWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgQ3V0LW4tcGFzdGUgZnJvbSBtYXRlcmlhbCBJJ20gbm90IHVzaW5nIGluIHRoZSBib29rIGFueW1vcmUgKGVkaXQgbGF0ZXIKKyAgICAgdG8gbWFrZSBzZW5zZSk6CisKKyAgICAgTm93LCBob3cgYXJlIHdlIGdvaW5nIHRvIHRlc3QgdGhlc2UgdHJlZSBwYXR0ZXJucyBhZ2FpbnN0IGV2ZXJ5CisgICAgc3VidHJlZSBpbiBvdXIgb3JpZ2luYWwgdHJlZT8gIEluIHdoYXQgb3JkZXIgc2hvdWxkIHdlIHZpc2l0IG5vZGVzPworICAgIEZvciB0aGlzIGFwcGxpY2F0aW9uLCBpdCB0dXJucyBvdXQgd2UgbmVlZCBhIHNpbXBsZSBgYGFwcGx5IG9uY2UnJworICAgIHJ1bGUgYXBwbGljYXRpb24gc3RyYXRlZ3kgYW5kIGEgYGBkb3duIHRoZW4gdXAnJyB0cmVlIHRyYXZlcnNhbAorICAgIHN0cmF0ZWd5LiAgTGV0J3MgbG9vayBhdCBydWxlIGFwcGxpY2F0aW9uIGZpcnN0LgorCisgICAgQXMgd2UgdmlzaXQgZWFjaCBub2RlLCB3ZSBuZWVkIHRvIHNlZSBpZiBhbnkgb2Ygb3VyIHBhdHRlcm5zIG1hdGNoLiBJZgorICAgIGEgcGF0dGVybiBtYXRjaGVzLCB3ZSBleGVjdXRlIHRoZSBhc3NvY2lhdGVkIHRyZWUgcmV3cml0ZSBhbmQgbW92ZSBvbgorICAgIHRvIHRoZSBuZXh0IG5vZGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGxvb2sgZm9yIGEgc2luZ2xlIHJ1bGUKKyAgICBhcHBsaWNhdGlvbiBvcHBvcnR1bml0eSAod2UnbGwgc2VlIGJlbG93IHRoYXQgd2Ugc29tZXRpbWVzIG5lZWQgdG8KKyAgICByZXBlYXRlZGx5IGFwcGx5IHJ1bGVzKS4gVGhlIGZvbGxvd2luZyBtZXRob2QgYXBwbGllcyBhIHJ1bGUgaW4gYSBAY2wKKyAgICBUcmVlUGFyc2VyIChkZXJpdmVkIGZyb20gYSB0cmVlIGdyYW1tYXIpIHRvIGEgdHJlZToKKworICAgIGhlcmUgaXMgd2hlcmUgd2VSZWZlcmVuY2VkIGNvZGUvd2Fsa2luZy9wYXR0ZXJucy9UcmVlUGF0dGVybk1hdGNoZXIuamF2YQorCisgICAgSXQgdXNlcyByZWZsZWN0aW9uIHRvIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgcnVsZSB3aXRoaW4gdGhlIGdlbmVyYXRlZAorICAgIHRyZWUgcGFyc2VyIGNsYXNzIChAY2wgU2ltcGxpZnkgaW4gdGhpcyBjYXNlKS4gTW9zdCBvZiB0aGUgdGltZSwgdGhlCisgICAgcnVsZSB3aWxsIG5vdCBtYXRjaCB0aGUgdHJlZS4gIFRvIGF2b2lkIGlzc3Vpbmcgc3ludGF4IGVycm9ycyBhbmQKKyAgICBhdHRlbXB0aW5nIGVycm9yIHJlY292ZXJ5LCBpdCBidW1wcyB1cCB0aGUgYmFja3RyYWNraW5nIGxldmVsLiAgVXBvbgorICAgIGZhaWx1cmUsIHRoZSBpbnZva2VkIHJ1bGUgaW1tZWRpYXRlbHkgcmV0dXJucy4gSWYgeW91IGRvbid0IHBsYW4gb24KKyAgICB1c2luZyB0aGlzIHRlY2huaXF1ZSBpbiB5b3VyIG93biBBTlRMUi1iYXNlZCBhcHBsaWNhdGlvbiwgZG9uJ3Qgc3dlYXQKKyAgICB0aGUgZGV0YWlscy4gVGhpcyBtZXRob2QgYm9pbHMgZG93biB0byBgYGNhbGwgYSBydWxlIHRvIG1hdGNoIGEgdHJlZSwKKyAgICBleGVjdXRpbmcgYW55IGVtYmVkZGVkIGFjdGlvbnMgYW5kIHJld3JpdGUgcnVsZXMuJycKKworICAgIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgaG93IHRvIGRlZmluZSB0cmVlIGdyYW1tYXIgcnVsZXMgYW5kIGhvdyB0bworICAgIGFwcGx5IHRoZW0gdG8gYSBwYXJ0aWN1bGFyIHN1YnRyZWUuIFRoZSBmaW5hbCBwaWVjZSBvZiB0aGUgdHJlZQorICAgIHBhdHRlcm4gbWF0Y2hlciBpcyB0aGUgYWN0dWFsIHRyZWUgdHJhdmVyc2FsLiBXZSBoYXZlIHRvIGdldCB0aGUKKyAgICBjb3JyZWN0IG5vZGUgdmlzaXRhdGlvbiBvcmRlci4gIEluIHBhcnRpY3VsYXIsIHdlIG5lZWQgdG8gcGVyZm9ybSB0aGUKKyAgICBzY2FsYXItdmVjdG9yIG11bHRpcGx5IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSB3YXkgZG93biAocHJlb3JkZXIpIGFuZAorICAgIHdlIG5lZWQgdG8gcmVkdWNlIG11bHRpcGx5LWJ5LXplcm8gc3VidHJlZXMgb24gdGhlIHdheSB1cCAocG9zdG9yZGVyKS4KKworICAgIFRvIGltcGxlbWVudCBhIHRvcC1kb3duIHZpc2l0b3IsIHdlIGRvIGEgZGVwdGggZmlyc3Qgd2FsayBvZiB0aGUgdHJlZSwKKyAgICBleGVjdXRpbmcgYW4gYWN0aW9uIGluIHRoZSBwcmVvcmRlciBwb3NpdGlvbi4gVG8gZ2V0IGEgYm90dG9tLXVwCisgICAgdmlzaXRvciwgd2UgZXhlY3V0ZSBhbiBhY3Rpb24gaW4gdGhlIHBvc3RvcmRlciBwb3NpdGlvbi4gIEFOVExSCisgICAgcHJvdmlkZXMgYSBzdGFuZGFyZCBAY2wgVHJlZVZpc2l0b3IgY2xhc3Mgd2l0aCBhIGRlcHRoIGZpcnN0IHNlYXJjaCBAdgorICAgIHZpc2l0IG1ldGhvZC4gVGhhdCBtZXRob2QgZXhlY3V0ZXMgZWl0aGVyIGEgQG0gcHJlIG9yIEBtIHBvc3QgbWV0aG9kCisgICAgb3IgYm90aC4gSW4gb3VyIGNhc2UsIHdlIG5lZWQgdG8gY2FsbCBAbSBhcHBseU9uY2UgaW4gYm90aC4gT24gdGhlIHdheQorICAgIGRvd24sIHdlJ2xsIGxvb2sgZm9yIEByIHZtdWx0IHBhdHRlcm5zLiBPbiB0aGUgd2F5IHVwLAorICAgIHdlJ2xsIGxvb2sgZm9yIEByIG11bHQwIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUcmVlRmlsdGVyIDogVHJlZVBhcnNlcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIElUb2tlblN0cmVhbSBvcmlnaW5hbFRva2VuU3RyZWFtOworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVBZGFwdG9yIG9yaWdpbmFsQWRhcHRvcjsKKworICAgICAgICBwdWJsaWMgVHJlZUZpbHRlciggSVRyZWVOb2RlU3RyZWFtIGlucHV0ICkKKyAgICAgICAgICAgIDogdGhpcyggaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVHJlZUZpbHRlciggSVRyZWVOb2RlU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUgKQorICAgICAgICAgICAgOiBiYXNlKCBpbnB1dCwgc3RhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBvcmlnaW5hbEFkYXB0b3IgPSBpbnB1dC5UcmVlQWRhcHRvcjsKKyAgICAgICAgICAgIG9yaWdpbmFsVG9rZW5TdHJlYW0gPSBpbnB1dC5Ub2tlblN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQXBwbHlPbmNlKCBvYmplY3QgdCwgQWN0aW9uIHdoaWNoUnVsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNoYXJlIFRyZWVQYXJzZXIgb2JqZWN0IGJ1dCBub3QgcGFyc2luZy1yZWxhdGVkIHN0YXRlCisgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCk7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oIG9yaWdpbmFsQWRhcHRvciwgdCApOworICAgICAgICAgICAgICAgICggKENvbW1vblRyZWVOb2RlU3RyZWFtKWlucHV0ICkuVG9rZW5TdHJlYW0gPSBvcmlnaW5hbFRva2VuU3RyZWFtOworICAgICAgICAgICAgICAgIEJhY2t0cmFja2luZ0xldmVsID0gMTsKKyAgICAgICAgICAgICAgICB3aGljaFJ1bGUoKTsKKyAgICAgICAgICAgICAgICBCYWNrdHJhY2tpbmdMZXZlbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRG93bnVwKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyZWVWaXNpdG9yIHYgPSBuZXcgVHJlZVZpc2l0b3IoIG5ldyBDb21tb25UcmVlQWRhcHRvcigpICk7CisgICAgICAgICAgICBGdW5jPG9iamVjdCwgb2JqZWN0PiBwcmUgPSBkZWxlZ2F0ZShvYmplY3QgbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcHBseU9uY2UoIG8sIFRvcGRvd24gKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBGdW5jPG9iamVjdCwgb2JqZWN0PiBwb3N0ID0gZGVsZWdhdGUob2JqZWN0IG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXBwbHlPbmNlKCBvLCBCb3R0b211cCApOworICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHYuVmlzaXQoIHQsIHByZSwgcG9zdCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyB0aGUgZG93bnVwIHN0cmF0ZWd5IHVzZXMgdG8gZG8gdGhlIHVwIGFuZCBkb3duIHJ1bGVzLgorICAgICAgICAvLyB0byBvdmVycmlkZSwganVzdCBkZWZpbmUgdHJlZSBncmFtbWFyIHJ1bGUgdG9wZG93biBhbmQgdHVybiBvbgorICAgICAgICAvLyBmaWx0ZXI9dHJ1ZS4KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBUb3Bkb3duKCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQm90dG9tdXAoKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVJdGVyYXRvci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZUl0ZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmM5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVJdGVyYXRvci5jcwpAQCAtMCwwICsxLDE1MiBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIC8qKiBSZXR1cm4gYSBub2RlIHN0cmVhbSBmcm9tIGEgZG91Ymx5LWxpbmtlZCB0cmVlIHdob3NlIG5vZGVzCisgICAgICogIGtub3cgd2hhdCBjaGlsZCBpbmRleCB0aGV5IGFyZS4gIE5vIHJlbW92ZSgpIGlzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqICBFbWl0IG5hdmlnYXRpb24gbm9kZXMgKERPV04sIFVQLCBhbmQgRU9GKSB0byBsZXQgc2hvdyB0cmVlIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVHJlZUl0ZXJhdG9yIDogSUVudW1lcmF0b3I8b2JqZWN0PiB7CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKyAgICAgICAgcHJvdGVjdGVkIG9iamVjdCByb290OworICAgICAgICBwcm90ZWN0ZWQgb2JqZWN0IHRyZWU7CisgICAgICAgIHByb3RlY3RlZCBib29sIGZpcnN0VGltZSA9IHRydWU7CisKKyAgICAgICAgLy8gbmF2aWdhdGlvbiBub2RlcyB0byByZXR1cm4gZHVyaW5nIHdhbGsgYW5kIGF0IGVuZAorICAgICAgICBwdWJsaWMgb2JqZWN0IHVwOworICAgICAgICBwdWJsaWMgb2JqZWN0IGRvd247CisgICAgICAgIHB1YmxpYyBvYmplY3QgZW9mOworCisgICAgICAgIC8qKiBJZiB3ZSBlbWl0IFVQL0RPV04gbm9kZXMsIHdlIG5lZWQgdG8gc3BpdCBvdXQgbXVsdGlwbGUgbm9kZXMgcGVyCisgICAgICAgICAqICBuZXh0KCkgY2FsbC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBRdWV1ZTxvYmplY3Q+IG5vZGVzOworCisgICAgICAgIHB1YmxpYyBUcmVlSXRlcmF0b3Iob2JqZWN0IHRyZWUpCisgICAgICAgICAgICA6IHRoaXMobmV3IENvbW1vblRyZWVBZGFwdG9yKCksIHRyZWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUcmVlSXRlcmF0b3IoSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0cmVlKSB7CisgICAgICAgICAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTsKKyAgICAgICAgICAgIHRoaXMucm9vdCA9IHRyZWU7CisgICAgICAgICAgICBub2RlcyA9IG5ldyBRdWV1ZTxvYmplY3Q+KCk7CisgICAgICAgICAgICBkb3duID0gYWRhcHRvci5DcmVhdGUoVG9rZW5UeXBlcy5Eb3duLCAiRE9XTiIpOworICAgICAgICAgICAgdXAgPSBhZGFwdG9yLkNyZWF0ZShUb2tlblR5cGVzLlVwLCAiVVAiKTsKKyAgICAgICAgICAgIGVvZiA9IGFkYXB0b3IuQ3JlYXRlKFRva2VuVHlwZXMuRW5kT2ZGaWxlLCAiRU9GIik7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIElFbnVtZXJhdG9yPG9iamVjdD4gTWVtYmVycworCisgICAgICAgIHB1YmxpYyBvYmplY3QgQ3VycmVudCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElEaXNwb3NhYmxlIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkgeworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3IgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkgeworICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkgeworICAgICAgICAgICAgICAgIC8vIGluaXRpYWwgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0cmVlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBub2RlIHRyZWUgKHNwZWNpYWwpCisgICAgICAgICAgICAgICAgICAgIG5vZGVzLkVucXVldWUoZW9mKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ3VycmVudCA9IHRyZWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGlmIGFueSBxdWV1ZWQgdXAsIHVzZSB0aG9zZSBmaXJzdAorICAgICAgICAgICAgICAgIGlmIChub2RlcyAhPSBudWxsICYmIG5vZGVzLkNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBDdXJyZW50ID0gbm9kZXMuRGVxdWV1ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5vZGVzIGxlZnQ/CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBlb2Y7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IG5vZGUgd2lsbCBiZSBjaGlsZCAwIGlmIGFueSBjaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0cmVlKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gYWRhcHRvci5HZXRDaGlsZCh0cmVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5FbnF1ZXVlKHRyZWUpOyAvLyByZWFsIG5vZGUgaXMgbmV4dCBhZnRlciBET1dOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IGRvd247CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGNoaWxkcmVuLCBsb29rIGZvciBuZXh0IHNpYmxpbmcgb2YgdHJlZSBvciBhbmNlc3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBwYXJlbnQgPSBhZGFwdG9yLkdldFBhcmVudCh0cmVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSB3ZSdyZSBvdXQgb2Ygc2libGluZ3MsIGtlZXAgcG9wcGluZyBiYWNrIHVwIHRvd2FyZHMgcm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5HZXRDaGlsZEluZGV4KHRyZWUpICsgMSA+PSBhZGFwdG9yLkdldENoaWxkQ291bnQocGFyZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5FbnF1ZXVlKHVwKTsgLy8gd2UncmUgbW92aW5nIGJhY2sgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gYWRhcHRvci5HZXRQYXJlbnQodHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbm9kZXMgbGVmdD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9IG51bGw7IC8vIGJhY2sgYXQgcm9vdD8gbm90aGluZyBsZWZ0IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuRW5xdWV1ZShlb2YpOyAvLyBhZGQgdG8gcXVldWUsIG1pZ2h0IGhhdmUgVVAgbm9kZXMgaW4gdGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IG5vZGVzLkRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgZm91bmQgYSBub2RlIHdpdGggYW4gdW52aXNpdGVkIHNpYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBpdCBhbmQgcmV0dXJuIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0U2libGluZ0luZGV4ID0gYWRhcHRvci5HZXRDaGlsZEluZGV4KHRyZWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9IGFkYXB0b3IuR2V0Q2hpbGQocGFyZW50LCBuZXh0U2libGluZ0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuRW5xdWV1ZSh0cmVlKTsgLy8gYWRkIHRvIHF1ZXVlLCBtaWdodCBoYXZlIFVQIG5vZGVzIGluIHRoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBub2Rlcy5EZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gQ3VycmVudCAhPSBlb2Y7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpIHsKKyAgICAgICAgICAgIGZpcnN0VGltZSA9IHRydWU7CisgICAgICAgICAgICB0cmVlID0gcm9vdDsKKyAgICAgICAgICAgIG5vZGVzLkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUGFyc2VyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzU5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVQYXJzZXIuY3MKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgQ29uZGl0aW9uYWxBdHRyaWJ1dGUgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGU7CisgICAgdXNpbmcgUmVnZXggPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXg7CisgICAgdXNpbmcgUmVnZXhPcHRpb25zID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4T3B0aW9uczsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKKyAgICAgKiAgb2YgdGhpcy4gIEFsbCB0aGUgZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeSBpcyBzaGFyZWQgd2l0aCBQYXJzZXIgdmlhCisgICAgICogIHRoZSBCYXNlUmVjb2duaXplciBzdXBlcmNsYXNzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVHJlZVBhcnNlciA6IEJhc2VSZWNvZ25pemVyIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBET1dOID0gVG9rZW5UeXBlcy5Eb3duOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFVQID0gVG9rZW5UeXBlcy5VcDsKKworICAgICAgICAvLyBwcmVjb21waWxlZCByZWdleCB1c2VkIGJ5IGluQ29udGV4dAorICAgICAgICBzdGF0aWMgc3RyaW5nIGRvdGRvdCA9ICIuKlteLl1cXC5cXC5bXi5dLioiOworICAgICAgICBzdGF0aWMgc3RyaW5nIGRvdWJsZUV0YyA9ICIuKlxcLlxcLlxcLlxccytcXC5cXC5cXC4uKiI7CisgICAgICAgIHN0YXRpYyBSZWdleCBkb3Rkb3RQYXR0ZXJuID0gbmV3IFJlZ2V4KGRvdGRvdCwgUmVnZXhPcHRpb25zLkNvbXBpbGVkKTsKKyAgICAgICAgc3RhdGljIFJlZ2V4IGRvdWJsZUV0Y1BhdHRlcm4gPSBuZXcgUmVnZXgoZG91YmxlRXRjLCBSZWdleE9wdGlvbnMuQ29tcGlsZWQpOworCisgICAgICAgIHByb3RlY3RlZCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQ7CisKKyAgICAgICAgcHVibGljIFRyZWVQYXJzZXIoSVRyZWVOb2RlU3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKCkgLy8gaGlnaGxpZ2h0IHRoYXQgd2UgZ28gdG8gc3VwZXIgdG8gc2V0IHN0YXRlIG9iamVjdAorICAgICAgICB7CisgICAgICAgICAgICBTZXRUcmVlTm9kZVN0cmVhbShpbnB1dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHJlZVBhcnNlcihJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkKKyAgICAgICAgICAgIDogYmFzZShzdGF0ZSkgLy8gc2hhcmUgdGhlIHN0YXRlIG9iamVjdCB3aXRoIGFub3RoZXIgcGFyc2VyCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFRyZWVOb2RlU3RyZWFtKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlc2V0KCkgeworICAgICAgICAgICAgYmFzZS5SZXNldCgpOyAvLyByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKKyAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuU2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCB0aGUgaW5wdXQgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRyZWVOb2RlU3RyZWFtKElUcmVlTm9kZVN0cmVhbSBpbnB1dCkgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRyZWVOb2RlU3RyZWFtIEdldFRyZWVOb2RlU3RyZWFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBTb3VyY2VOYW1lIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LlNvdXJjZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IEdldEN1cnJlbnRJbnB1dFN5bWJvbChJSW50U3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gKChJVHJlZU5vZGVTdHJlYW0paW5wdXQpLkxUKDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBHZXRNaXNzaW5nU3ltYm9sKElJbnRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkVG9rZW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0IGZvbGxvdykgeworICAgICAgICAgICAgc3RyaW5nIHRva2VuVGV4dCA9CisgICAgICAgICAgICAgICAgIjxtaXNzaW5nICIgKyBUb2tlbk5hbWVzW2V4cGVjdGVkVG9rZW5UeXBlXSArICI+IjsKKyAgICAgICAgICAgIElUcmVlQWRhcHRvciBhZGFwdG9yID0gKChJVHJlZU5vZGVTdHJlYW0pZS5JbnB1dCkuVHJlZUFkYXB0b3I7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5DcmVhdGUobmV3IENvbW1vblRva2VuKGV4cGVjdGVkVG9rZW5UeXBlLCB0b2tlblRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIE1hdGNoICcuJyBpbiB0cmVlIHBhcnNlciBoYXMgc3BlY2lhbCBtZWFuaW5nLiAgU2tpcCBub2RlIG9yCisgICAgICAgICAqICBlbnRpcmUgdHJlZSBpZiBub2RlIGhhcyBjaGlsZHJlbi4gIElmIGNoaWxkcmVuLCBzY2FuIHVudGlsCisgICAgICAgICAqICBjb3JyZXNwb25kaW5nIFVQIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBNYXRjaEFueShJSW50U3RyZWFtIGlnbm9yZSkgeworICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICAvLyBhbHdheXMgY29uc3VtZSB0aGUgY3VycmVudCBub2RlCisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAvLyBpZiB0aGUgbmV4dCBub2RlIGlzIERPV04sIHRoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyBhIHN1YnRyZWU6CisgICAgICAgICAgICAvLyBza2lwIHRvIGNvcnJlc3BvbmRpbmcgVVAuIG11c3QgY291bnQgbmVzdGluZyBsZXZlbCB0byBnZXQgcmlnaHQgVVAKKyAgICAgICAgICAgIGludCBsb29rID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICBpZiAobG9vayA9PSBET1dOKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxldmVsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0LkxBKDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERPV046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlcy5FbmRPZkZpbGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2UgaGF2ZSBET1dOL1VQIG5vZGVzIGluIHRoZSBzdHJlYW0gdGhhdCBoYXZlIG5vIGxpbmUgaW5mbzsgb3ZlcnJpZGUuCisgICAgICAgICAqICBwbHVzIHdlIHdhbnQgdG8gYWx0ZXIgdGhlIGV4Y2VwdGlvbiB0eXBlLiAgRG9uJ3QgdHJ5IHRvIHJlY292ZXIKKyAgICAgICAgICogIGZyb20gdHJlZSBwYXJzZXIgZXJyb3JzIGlubGluZS4uLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBSZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbihJSW50U3RyZWFtIGlucHV0LCBpbnQgdHR5cGUsIEJpdFNldCBmb2xsb3cpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24odHR5cGUsIChJVHJlZU5vZGVTdHJlYW0paW5wdXQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUHJlZml4IGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgZ3JhbW1hciBuYW1lIGJlY2F1c2UgbWVzc2FnZSBpcworICAgICAgICAgKiAgYWx3YXlzIGludGVuZGVkIGZvciB0aGUgcHJvZ3JhbW1lciBiZWNhdXNlIHRoZSBwYXJzZXIgYnVpbHQKKyAgICAgICAgICogIHRoZSBpbnB1dCB0cmVlIG5vdCB0aGUgdXNlci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0RXJyb3JIZWFkZXIoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIEdyYW1tYXJGaWxlTmFtZSArICI6IG5vZGUgZnJvbSAiICsKKyAgICAgICAgICAgICAgICAgICAoZS5BcHByb3hpbWF0ZUxpbmVJbmZvID8gImFmdGVyICIgOiAiIikgKyAibGluZSAiICsgZS5MaW5lICsgIjoiICsgZS5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUcmVlIHBhcnNlcnMgcGFyc2Ugbm9kZXMgdGhleSB1c3VhbGx5IGhhdmUgYSB0b2tlbiBvYmplY3QgYXMKKyAgICAgICAgICogIHBheWxvYWQuIFNldCB0aGUgZXhjZXB0aW9uIHRva2VuIGFuZCBkbyB0aGUgZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0RXJyb3JNZXNzYWdlKFJlY29nbml0aW9uRXhjZXB0aW9uIGUsIHN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKyAgICAgICAgICAgIGlmICh0aGlzIGlzIFRyZWVQYXJzZXIpIHsKKyAgICAgICAgICAgICAgICBJVHJlZUFkYXB0b3IgYWRhcHRvciA9ICgoSVRyZWVOb2RlU3RyZWFtKWUuSW5wdXQpLlRyZWVBZGFwdG9yOworICAgICAgICAgICAgICAgIGUuVG9rZW4gPSBhZGFwdG9yLkdldFRva2VuKGUuTm9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGUuVG9rZW4gPT0gbnVsbCkgeyAvLyBjb3VsZCBiZSBhbiBVUC9ET1dOIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgZS5Ub2tlbiA9IG5ldyBDb21tb25Ub2tlbihhZGFwdG9yLkdldFR5cGUoZS5Ob2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLkdldFRleHQoZS5Ob2RlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0RXJyb3JNZXNzYWdlKGUsIHRva2VuTmFtZXMpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlSW4oc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSB7CisgICAgICAgICAgICBiYXNlLlRyYWNlSW4ocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoMSkpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlT3V0KHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgeworICAgICAgICAgICAgYmFzZS5UcmFjZU91dChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZVBhdHRlcm5MZXhlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZVBhdHRlcm5MZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY3NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUGF0dGVybkxleGVyLmNzCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUgeworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisgICAgcHVibGljIGNsYXNzIFRyZWVQYXR0ZXJuTGV4ZXIgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVPRiA9IC0xOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJFR0lOID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFTkQgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IElEID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBUkcgPSA0OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFBFUkNFTlQgPSA1OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IENPTE9OID0gNjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBET1QgPSA3OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgdHJlZSBwYXR0ZXJuIHRvIGxleCBsaWtlICIoQSBCIEMpIjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBwYXR0ZXJuOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5JbmRleCBpbnRvIGlucHV0IHN0cmluZzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBwID0gLTE7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkN1cnJlbnQgY2hhcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBjOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Ib3cgbG9uZyBpcyB0aGUgcGF0dGVybiBpbiBjaGFyPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBuOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgd2hlbiB0b2tlbiB0eXBlIGlzIElEIG9yIEFSRyAobmFtZSBtaW1pY3MgSmF2YSdzIFN0cmVhbVRva2VuaXplcik8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIHN2YWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHB1YmxpYyBib29sIGVycm9yID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRyZWVQYXR0ZXJuTGV4ZXIoc3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CisgICAgICAgICAgICB0aGlzLm4gPSBwYXR0ZXJuLkxlbmd0aDsKKyAgICAgICAgICAgIENvbnN1bWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBOZXh0VG9rZW4oKSB7CisgICAgICAgICAgICBzdmFsLkxlbmd0aCA9IDA7IC8vIHJlc2V0LCBidXQgcmV1c2UgYnVmZmVyCisgICAgICAgICAgICB3aGlsZSAoYyAhPSBFT0YpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCBjID09ICdfJykgeworICAgICAgICAgICAgICAgICAgICBzdmFsLkFwcGVuZCgoY2hhciljKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBjID09ICdfJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ZhbC5BcHBlbmQoKGNoYXIpYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkVHSU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICcpJykgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICclJykgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQRVJDRU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICcuJykgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBET1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdbJykgeyAvLyBncmFiIFt4XSBhcyBhIHN0cmluZywgcmV0dXJuaW5nIHgKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYyAhPSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2YWwuQXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmFsLkFwcGVuZCgoY2hhciljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZhbC5BcHBlbmQoKGNoYXIpYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVJHOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBDb25zdW1lKCkgeworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgaWYgKHAgPj0gbikgeworICAgICAgICAgICAgICAgIGMgPSBFT0Y7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSBwYXR0ZXJuW3BdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUGF0dGVyblBhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZVBhdHRlcm5QYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliNzNiMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZVBhdHRlcm5QYXJzZXIuY3MKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiA9IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOworCisgICAgcHVibGljIGNsYXNzIFRyZWVQYXR0ZXJuUGFyc2VyIHsKKyAgICAgICAgcHJvdGVjdGVkIFRyZWVQYXR0ZXJuTGV4ZXIgdG9rZW5pemVyOworICAgICAgICBwcm90ZWN0ZWQgaW50IHR0eXBlOworICAgICAgICBwcm90ZWN0ZWQgVHJlZVdpemFyZCB3aXphcmQ7CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKworICAgICAgICBwdWJsaWMgVHJlZVBhdHRlcm5QYXJzZXIoVHJlZVBhdHRlcm5MZXhlciB0b2tlbml6ZXIsIFRyZWVXaXphcmQgd2l6YXJkLCBJVHJlZUFkYXB0b3IgYWRhcHRvcikgeworICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7CisgICAgICAgICAgICB0aGlzLndpemFyZCA9IHdpemFyZDsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0dHlwZSA9IHRva2VuaXplci5OZXh0VG9rZW4oKTsgLy8ga2lja3N0YXJ0CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGF0dGVybigpIHsKKyAgICAgICAgICAgIGlmICh0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLkJFR0lOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlVHJlZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLklEKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBQYXJzZU5vZGUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5FT0YpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBleHRyYSBqdW5rIG9uIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2VUcmVlKCkgeworICAgICAgICAgICAgaWYgKHR0eXBlICE9IFRyZWVQYXR0ZXJuTGV4ZXIuQkVHSU4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIGJlZ2lubmluZy4iKTsKKworICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7CisgICAgICAgICAgICBvYmplY3Qgcm9vdCA9IFBhcnNlTm9kZSgpOworICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHR0eXBlID09IFRyZWVQYXR0ZXJuTGV4ZXIuQkVHSU4gfHwKKyAgICAgICAgICAgICAgICAgICAgdHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5JRCB8fAorICAgICAgICAgICAgICAgICAgICB0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLlBFUkNFTlQgfHwKKyAgICAgICAgICAgICAgICAgICAgdHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5ET1QpIHsKKyAgICAgICAgICAgICAgICBpZiAodHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5CRUdJTikgeworICAgICAgICAgICAgICAgICAgICBvYmplY3Qgc3VidHJlZSA9IFBhcnNlVHJlZSgpOworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLkFkZENoaWxkKHJvb3QsIHN1YnRyZWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IFBhcnNlTm9kZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5BZGRDaGlsZChyb290LCBjaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHR5cGUgIT0gVHJlZVBhdHRlcm5MZXhlci5FTkQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIGVuZC4iKTsKKworICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7CisgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZU5vZGUoKSB7CisgICAgICAgICAgICAvLyAiJWxhYmVsOiIgcHJlZml4CisgICAgICAgICAgICBzdHJpbmcgbGFiZWwgPSBudWxsOworICAgICAgICAgICAgaWYgKHR0eXBlID09IFRyZWVQYXR0ZXJuTGV4ZXIuUEVSQ0VOVCkgeworICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGlmICh0dHlwZSAhPSBUcmVlUGF0dGVybkxleGVyLklEKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYWJlbCA9IHRva2VuaXplci5zdmFsLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaWYgKHR0eXBlICE9IFRyZWVQYXR0ZXJuTGV4ZXIuQ09MT04pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOyAvLyBtb3ZlIHRvIElEIGZvbGxvd2luZyBjb2xvbgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXaWxkY2FyZD8KKyAgICAgICAgICAgIGlmICh0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLkRPVCkgeworICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIElUb2tlbiB3aWxkY2FyZFBheWxvYWQgPSBuZXcgQ29tbW9uVG9rZW4oMCwgIi4iKTsKKyAgICAgICAgICAgICAgICBUcmVlV2l6YXJkLlRyZWVQYXR0ZXJuIG5vZGUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZVdpemFyZC5XaWxkY2FyZFRyZWVQYXR0ZXJuKHdpbGRjYXJkUGF5bG9hZCk7CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gIklEIiBvciAiSURbYXJnXSIKKyAgICAgICAgICAgIGlmICh0dHlwZSAhPSBUcmVlUGF0dGVybkxleGVyLklEKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgdG9rZW5OYW1lID0gdG9rZW5pemVyLnN2YWwuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKHRva2VuTmFtZS5FcXVhbHMoIm5pbCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuTmlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IHRva2VuTmFtZTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhcmcKKyAgICAgICAgICAgIHN0cmluZyBhcmcgPSBudWxsOworICAgICAgICAgICAgaWYgKHR0eXBlID09IFRyZWVQYXR0ZXJuTGV4ZXIuQVJHKSB7CisgICAgICAgICAgICAgICAgYXJnID0gdG9rZW5pemVyLnN2YWwuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gYXJnOworICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgbm9kZQorICAgICAgICAgICAgaW50IHRyZWVOb2RlVHlwZSA9IHdpemFyZC5HZXRUb2tlblR5cGUodG9rZW5OYW1lKTsKKyAgICAgICAgICAgIGlmICh0cmVlTm9kZVR5cGUgPT0gVG9rZW5UeXBlcy5JbnZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmplY3Qgbm9kZTI7CisgICAgICAgICAgICBub2RlMiA9IGFkYXB0b3IuQ3JlYXRlKHRyZWVOb2RlVHlwZSwgdGV4dCk7CisgICAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCAmJiBub2RlMi5HZXRUeXBlKCkgPT0gdHlwZW9mKFRyZWVXaXphcmQuVHJlZVBhdHRlcm4pKSB7CisgICAgICAgICAgICAgICAgKChUcmVlV2l6YXJkLlRyZWVQYXR0ZXJuKW5vZGUyKS5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZyAhPSBudWxsICYmIG5vZGUyLkdldFR5cGUoKSA9PSB0eXBlb2YoVHJlZVdpemFyZC5UcmVlUGF0dGVybikpIHsKKyAgICAgICAgICAgICAgICAoKFRyZWVXaXphcmQuVHJlZVBhdHRlcm4pbm9kZTIpLmhhc1RleHRBcmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGUyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUmV3cml0ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVSZXdyaXRlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTNlN2RkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUmV3cml0ZXIuY3MKQEAgLTAsMCArMSwxMTMgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZSB7CisgICAgdXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworCisgICAgcHVibGljIGNsYXNzIFRyZWVSZXdyaXRlcjxUVHJlZT4gOiBUcmVlUGFyc2VyIHsKKyAgICAgICAgcHJvdGVjdGVkIElUb2tlblN0cmVhbSBvcmlnaW5hbFRva2VuU3RyZWFtOworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVBZGFwdG9yIG9yaWdpbmFsQWRhcHRvcjsKKworICAgICAgICBTeXN0ZW0uRnVuYzxJQXN0UnVsZVJldHVyblNjb3BlPFRUcmVlPj4gdG9wZG93bl9mdW5jOworICAgICAgICBTeXN0ZW0uRnVuYzxJQXN0UnVsZVJldHVyblNjb3BlPFRUcmVlPj4gYm90dG9tdXBfZnVuYzsKKworICAgICAgICBwdWJsaWMgVHJlZVJld3JpdGVyKElUcmVlTm9kZVN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFRyZWVSZXdyaXRlcihJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkKKyAgICAgICAgICAgIDogYmFzZShpbnB1dCwgc3RhdGUpIHsKKyAgICAgICAgICAgIG9yaWdpbmFsQWRhcHRvciA9IGlucHV0LlRyZWVBZGFwdG9yOworICAgICAgICAgICAgb3JpZ2luYWxUb2tlblN0cmVhbSA9IGlucHV0LlRva2VuU3RyZWFtOworICAgICAgICAgICAgdG9wZG93bl9mdW5jID0gKCkgPT4gVG9wZG93bigpOworICAgICAgICAgICAgYm90dG9tdXBfZnVuYyA9ICgpID0+IEJvdHRvbXVwKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQXBwbHlPbmNlKG9iamVjdCB0LCBTeXN0ZW0uRnVuYzxJQXN0UnVsZVJldHVyblNjb3BlPFRUcmVlPj4gd2hpY2hSdWxlKSB7CisgICAgICAgICAgICBpZiAodCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHNoYXJlIFRyZWVQYXJzZXIgb2JqZWN0IGJ1dCBub3QgcGFyc2luZy1yZWxhdGVkIHN0YXRlCisgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCk7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0ob3JpZ2luYWxBZGFwdG9yLCB0KTsKKyAgICAgICAgICAgICAgICAoKENvbW1vblRyZWVOb2RlU3RyZWFtKWlucHV0KS5Ub2tlblN0cmVhbSA9IG9yaWdpbmFsVG9rZW5TdHJlYW07CisgICAgICAgICAgICAgICAgQmFja3RyYWNraW5nTGV2ZWwgPSAxOworICAgICAgICAgICAgICAgIElBc3RSdWxlUmV0dXJuU2NvcGU8VFRyZWU+IHIgPSB3aGljaFJ1bGUoKTsKKyAgICAgICAgICAgICAgICBCYWNrdHJhY2tpbmdMZXZlbCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKEZhaWxlZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZW9mKENvbW1vblRyZWUpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFRUcmVlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCAmJiAhdC5FcXVhbHMoci5UcmVlKSAmJiByLlRyZWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBhbnkgdHJhbnNmb3JtYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoKChDb21tb25UcmVlKXQpLlRvU3RyaW5nVHJlZSgpICsgIiAtPiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENvbW1vblRyZWUpKG9iamVjdClyLlRyZWUpLlRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwgJiYgci5UcmVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByLlRyZWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBBcHBseVJlcGVhdGVkbHkob2JqZWN0IHQsIFN5c3RlbS5GdW5jPElBc3RSdWxlUmV0dXJuU2NvcGU8VFRyZWU+PiB3aGljaFJ1bGUpIHsKKyAgICAgICAgICAgIGJvb2wgdHJlZUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKHRyZWVDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IHUgPSBBcHBseU9uY2UodCwgd2hpY2hSdWxlKTsKKyAgICAgICAgICAgICAgICB0cmVlQ2hhbmdlZCA9ICF0LkVxdWFscyh1KTsKKyAgICAgICAgICAgICAgICB0ID0gdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IERvd251cChvYmplY3QgdCkgeworICAgICAgICAgICAgVHJlZVZpc2l0b3IgdiA9IG5ldyBUcmVlVmlzaXRvcihuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSk7CisgICAgICAgICAgICB0ID0gdi5WaXNpdCh0LCAobykgPT4gQXBwbHlPbmNlKG8sIHRvcGRvd25fZnVuYyksIChvKSA9PiBBcHBseVJlcGVhdGVkbHkobywgYm90dG9tdXBfZnVuYykpOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBtZXRob2RzIHRoZSBkb3dudXAgc3RyYXRlZ3kgdXNlcyB0byBkbyB0aGUgdXAgYW5kIGRvd24gcnVsZXMuCisgICAgICAgIC8vIHRvIG92ZXJyaWRlLCBqdXN0IGRlZmluZSB0cmVlIGdyYW1tYXIgcnVsZSB0b3Bkb3duIGFuZCB0dXJuIG9uCisgICAgICAgIC8vIGZpbHRlcj10cnVlLgorICAgICAgICBwdWJsaWMgdmlydHVhbCBJQXN0UnVsZVJldHVyblNjb3BlPFRUcmVlPiBUb3Bkb3duKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQXN0UnVsZVJldHVyblNjb3BlPFRUcmVlPiBCb3R0b211cCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUnVsZVJldHVyblNjb3BlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVHJlZS9UcmVlUnVsZVJldHVyblNjb3BlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDg0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuY3MKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgZXhjZXB0IHRoYXQKKyAgICAgKiAgdGhlIHN0YXJ0IHByb3BlcnR5IGlzIGEgdHJlZSBub2RlcyBub3QgVG9rZW4gb2JqZWN0CisgICAgICogIHdoZW4geW91IGFyZSBwYXJzaW5nIHRyZWVzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFRyZWVSdWxlUmV0dXJuU2NvcGU8VFRyZWU+IDogSVJ1bGVSZXR1cm5TY29wZTxUVHJlZT4geworICAgICAgICBwcml2YXRlIFRUcmVlIF9zdGFydDsKKworICAgICAgICAvKiogPHN1bW1hcnk+R2V0cyB0aGUgZmlyc3Qgbm9kZSBvciByb290IG5vZGUgb2YgdHJlZSBtYXRjaGVkIGZvciB0aGlzIHJ1bGUuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgVFRyZWUgU3RhcnQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0YXJ0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIF9zdGFydCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVFRyZWUgSVJ1bGVSZXR1cm5TY29wZTxUVHJlZT4uU3RvcCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFRUcmVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZVZpc2l0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVWaXNpdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOGUwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVWaXNpdG9yLmNzCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIC8qKiA8c3VtbWFyeT5EbyBhIGRlcHRoIGZpcnN0IHdhbGsgb2YgYSB0cmVlLCBhcHBseWluZyBwcmUoKSBhbmQgcG9zdCgpIGFjdGlvbnMgYXMgd2UgZ28uPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBjbGFzcyBUcmVlVmlzaXRvcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBUcmVlVmlzaXRvcihJVHJlZUFkYXB0b3IgYWRhcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVHJlZVZpc2l0b3IoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBDb21tb25UcmVlQWRhcHRvcigpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBWaXNpdCBldmVyeSBub2RlIGluIHRyZWUgdCBhbmQgdHJpZ2dlciBhbiBhY3Rpb24gZm9yIGVhY2ggbm9kZQorICAgICAgICAgKiAgYmVmb3JlL2FmdGVyIGhhdmluZyB2aXNpdGVkIGFsbCBvZiBpdHMgY2hpbGRyZW4uICBCb3R0b20gdXAgd2Fsay4KKyAgICAgICAgICogIEV4ZWN1dGUgYm90aCBhY3Rpb25zIGV2ZW4gaWYgdCBoYXMgbm8gY2hpbGRyZW4uICBJZ25vcmUgcmV0dXJuCisgICAgICAgICAqICByZXN1bHRzIGZyb20gdHJhbnNmb3JtaW5nIGNoaWxkcmVuIHNpbmNlIHRoZXkgd2lsbCBoYXZlIGFsdGVyZWQKKyAgICAgICAgICogIHRoZSBjaGlsZCBsaXN0IG9mIHRoaXMgbm9kZSAodGhlaXIgcGFyZW50KS4gIFJldHVybiByZXN1bHQgb2YKKyAgICAgICAgICogIGFwcGx5aW5nIHBvc3QgYWN0aW9uIHRvIHRoaXMgbm9kZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvYmplY3QgVmlzaXQob2JqZWN0IHQsIElUcmVlVmlzaXRvckFjdGlvbiBhY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigidmlzaXQgIisoKFRyZWUpdCkudG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgYm9vbCBpc05pbCA9IGFkYXB0b3IuSXNOaWwodCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgIWlzTmlsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQgPSBhY3Rpb24uUHJlKHQpOyAvLyBpZiByZXdyaXR0ZW4sIHdhbGsgY2hpbGRyZW4gb2YgbmV3IHQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRvci5HZXRDaGlsZENvdW50KHQpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkID0gYWRhcHRvci5HZXRDaGlsZCh0LCBpKTsKKyAgICAgICAgICAgICAgICBWaXNpdChjaGlsZCwgYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCAmJiAhaXNOaWwpCisgICAgICAgICAgICAgICAgdCA9IGFjdGlvbi5Qb3N0KHQpOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IFZpc2l0KG9iamVjdCB0LCBGdW5jPG9iamVjdCwgb2JqZWN0PiBwcmVBY3Rpb24sIEZ1bmM8b2JqZWN0LCBvYmplY3Q+IHBvc3RBY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWaXNpdCh0LCBuZXcgVHJlZVZpc2l0b3JBY3Rpb24ocHJlQWN0aW9uLCBwb3N0QWN0aW9uKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVXaXphcmQuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlL1RyZWVXaXphcmQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlMTVmMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUvVHJlZVdpemFyZC5jcwpAQCAtMCwwICsxLDY1OSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBUT0RPOiBidWlsZCBpbmRleGVzIGZvciB3aXphcmQKKy8vI2RlZmluZSBCVUlMRF9JTkRFWEVTCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUgeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgdXNpbmcgSUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7CisjaWYgQlVJTERfSU5ERVhFUworICAgIHVzaW5nIElEaWN0aW9uYXJ5ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5OworI2VuZGlmCisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEJ1aWxkIGFuZCBuYXZpZ2F0ZSB0cmVlcyB3aXRoIHRoaXMgb2JqZWN0LiAgTXVzdCBrbm93IGFib3V0IHRoZSBuYW1lcworICAgICAqICBvZiB0b2tlbnMgc28geW91IGhhdmUgdG8gcGFzcyBpbiBhIG1hcCBvciBhcnJheSBvZiB0b2tlbiBuYW1lcyAoZnJvbSB3aGljaAorICAgICAqICB0aGlzIGNsYXNzIGNhbiBidWlsZCB0aGUgbWFwKS4gIEkuZS4sIFRva2VuIERFQ0wgbWVhbnMgbm90aGluZyB1bmxlc3MgdGhlCisgICAgICogIGNsYXNzIGNhbiB0cmFuc2xhdGUgaXQgdG8gYSB0b2tlbiB0eXBlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIEluIG9yZGVyIHRvIGNyZWF0ZSBub2RlcyBhbmQgbmF2aWdhdGUsIHRoaXMgY2xhc3MgbmVlZHMgYSBUcmVlQWRhcHRvci4KKyAgICAgKgorICAgICAqICBUaGlzIGNsYXNzIGNhbiBidWlsZCBhIHRva2VuIHR5cGUgLT4gbm9kZSBpbmRleCBmb3IgcmVwZWF0ZWQgdXNlIG9yIGZvcgorICAgICAqICBpdGVyYXRpbmcgb3ZlciB0aGUgdmFyaW91cyBub2RlcyB3aXRoIGEgcGFydGljdWxhciB0eXBlLgorICAgICAqCisgICAgICogIFRoaXMgY2xhc3Mgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgVHJlZUFkYXB0b3IgcmF0aGVyIHRoYW4gbW92aW5nCisgICAgICogIGFsbCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW50byB0aGUgYWRhcHRvci4gIEFuIGFkYXB0b3IgaGVscHMgYnVpbGQgYW5kCisgICAgICogIG5hdmlnYXRlIHRyZWVzIHVzaW5nIG1ldGhvZHMuICBUaGlzIGNsYXNzIGhlbHBzIHlvdSBkbyBpdCB3aXRoIHN0cmluZworICAgICAqICBwYXR0ZXJucyBsaWtlICIoQSBCIEMpIi4gIFlvdSBjYW4gY3JlYXRlIGEgdHJlZSBmcm9tIHRoYXQgcGF0dGVybiBvcgorICAgICAqICBtYXRjaCBzdWJ0cmVlcyBhZ2FpbnN0IGl0LgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRyZWVXaXphcmQgeworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVBZGFwdG9yIGFkYXB0b3I7CisgICAgICAgIHByb3RlY3RlZCBJRGljdGlvbmFyeTxzdHJpbmcsIGludD4gdG9rZW5OYW1lVG9UeXBlTWFwOworCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNvbnRleHRWaXNpdG9yIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGNhbGxlZCB2aXNpdCBvciBzb21ldGhpbmcgZWxzZT8KKyAgICAgICAgICAgIHZvaWQgVmlzaXQob2JqZWN0IHQsIG9iamVjdCBwYXJlbnQsIGludCBjaGlsZEluZGV4LCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yIDogSUNvbnRleHRWaXNpdG9yIHsKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVmlzaXQob2JqZWN0IHQsIG9iamVjdCBwYXJlbnQsIGludCBjaGlsZEluZGV4LCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzKSB7CisgICAgICAgICAgICAgICAgVmlzaXQodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBWaXNpdChvYmplY3QgdCk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBBY3Rpb25WaXNpdG9yIDogVmlzaXRvciB7CisgICAgICAgICAgICBTeXN0ZW0uQWN0aW9uPG9iamVjdD4gX2FjdGlvbjsKKworICAgICAgICAgICAgcHVibGljIEFjdGlvblZpc2l0b3IoU3lzdGVtLkFjdGlvbjxvYmplY3Q+IGFjdGlvbikgeworICAgICAgICAgICAgICAgIF9hY3Rpb24gPSBhY3Rpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZpc2l0KG9iamVjdCB0KSB7CisgICAgICAgICAgICAgICAgX2FjdGlvbih0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoZW4gdXNpbmcgJWxhYmVsOlRPS0VOTkFNRSBpbiBhIHRyZWUgZm9yIHBhcnNlKCksIHdlIG11c3QKKyAgICAgICAgICogIHRyYWNrIHRoZSBsYWJlbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjbGFzcyBUcmVlUGF0dGVybiA6IENvbW1vblRyZWUgeworICAgICAgICAgICAgcHVibGljIHN0cmluZyBsYWJlbDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGhhc1RleHRBcmc7CisgICAgICAgICAgICBwdWJsaWMgVHJlZVBhdHRlcm4oSVRva2VuIHBheWxvYWQpIDoKKyAgICAgICAgICAgICAgICBiYXNlKHBheWxvYWQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIlIiArIGxhYmVsICsgIjoiOyAvLysgYmFzZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFdpbGRjYXJkVHJlZVBhdHRlcm4gOiBUcmVlUGF0dGVybiB7CisgICAgICAgICAgICBwdWJsaWMgV2lsZGNhcmRUcmVlUGF0dGVybihJVG9rZW4gcGF5bG9hZCkgOgorICAgICAgICAgICAgICAgIGJhc2UocGF5bG9hZCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoaXMgYWRhcHRvciBjcmVhdGVzIFRyZWVQYXR0ZXJuIG9iamVjdHMgZm9yIHVzZSBkdXJpbmcgc2NhbigpPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgY2xhc3MgVHJlZVBhdHRlcm5UcmVlQWRhcHRvciA6IENvbW1vblRyZWVBZGFwdG9yIHsKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgQ3JlYXRlKElUb2tlbiBwYXlsb2FkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlUGF0dGVybihwYXlsb2FkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgQlVJTERfSU5ERVhFUworICAgICAgICAvLyBUT0RPOiBidWlsZCBpbmRleGVzIGZvciB0aGUgd2l6YXJkCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRHVyaW5nIGZpbGxCdWZmZXIoKSwgd2UgY2FuIG1ha2UgYSByZXZlcnNlIGluZGV4IGZyb20gYSBzZXQKKyAgICAgICAgICogIG9mIHRva2VuIHR5cGVzIG9mIGludGVyZXN0IHRvIHRoZSBsaXN0IG9mIGluZGV4ZXMgaW50byB0aGUKKyAgICAgICAgICogIG5vZGUgc3RyZWFtLiAgVGhpcyBsZXRzIHVzIGNvbnZlcnQgYSBub2RlIHBvaW50ZXIgdG8gYQorICAgICAgICAgKiAgc3RyZWFtIGluZGV4IHNlbWktZWZmaWNpZW50bHkgZm9yIGEgbGlzdCBvZiBpbnRlcmVzdGluZworICAgICAgICAgKiAgbm9kZXMgc3VjaCBhcyBmdW5jdGlvbiBkZWZpbml0aW9uIG5vZGVzICh5b3UnbGwgd2FudCB0byBzZWVrCisgICAgICAgICAqICB0byB0aGVpciBib2RpZXMgZm9yIGFuIGludGVycHJldGVyKS4gIEFsc28gdXNlZnVsIGZvciBkb2luZworICAgICAgICAgKiAgZHluYW1pYyBzZWFyY2hlczsgaS5lLiwgZ28gZmluZCBtZSBhbGwgUExVUyBub2Rlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBJRGljdGlvbmFyeTxpbnQsIElMaXN0PGludD4+IHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggc2V0IHRvIElOREVYX0FMTCB0aGVuIGluZGV4aW5nCisgICAgICAgICAqICBvY2N1cnMgZm9yIGFsbCB0b2tlbiB0eXBlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSGFzaFNldDxpbnQ+IElOREVYX0FMTCA9IG5ldyBIYXNoU2V0PGludD4oKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIHNldCBvZiB0b2tlbiB0eXBlcyB1c2VyIHdvdWxkIGxpa2UgdG8gaW5kZXggZm9yIGZhc3RlciBsb29rdXAuCisgICAgICAgICAqICBJZiB0aGlzIGlzIElOREVYX0FMTCwgdGhlbiBhbGwgdG9rZW4gdHlwZXMgYXJlIHRyYWNrZWQuICBJZiBudWxsLAorICAgICAgICAgKiAgdGhlbiBub25lIGFyZSBpbmRleGVkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEhhc2hTZXQ8aW50PiB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggPSBudWxsOworI2VuZGlmCisKKyAgICAgICAgcHVibGljIFRyZWVXaXphcmQoSVRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHJlZVdpemFyZChJVHJlZUFkYXB0b3IgYWRhcHRvciwgSURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IHRva2VuTmFtZVRvVHlwZU1hcCkgeworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgICAgIHRoaXMudG9rZW5OYW1lVG9UeXBlTWFwID0gdG9rZW5OYW1lVG9UeXBlTWFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRyZWVXaXphcmQoSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLnRva2VuTmFtZVRvVHlwZU1hcCA9IENvbXB1dGVUb2tlblR5cGVzKHRva2VuTmFtZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRyZWVXaXphcmQoc3RyaW5nW10gdG9rZW5OYW1lcykgOgorICAgICAgICAgICAgdGhpcyhudWxsLCB0b2tlbk5hbWVzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDb21wdXRlIGEgTWFwJmx0O1N0cmluZywgSW50ZWdlciZndDsgdGhhdCBpcyBhbiBpbnZlcnRlZCBpbmRleCBvZgorICAgICAgICAgKiAgdG9rZW5OYW1lcyAod2hpY2ggbWFwcyBpbnQgdG9rZW4gdHlwZXMgdG8gbmFtZXMpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IENvbXB1dGVUb2tlblR5cGVzKHN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBtID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+KCk7CisgICAgICAgICAgICBpZiAodG9rZW5OYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCB0dHlwZSA9IFRva2VuVHlwZXMuTWluOyB0dHlwZSA8IHRva2VuTmFtZXMuTGVuZ3RoOyB0dHlwZSsrKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSB0b2tlbk5hbWVzW3R0eXBlXTsKKyAgICAgICAgICAgICAgICBtW25hbWVdID0gdHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Vc2luZyB0aGUgbWFwIG9mIHRva2VuIG5hbWVzIHRvIHRva2VuIHR5cGVzLCByZXR1cm4gdGhlIHR5cGUuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VG9rZW5UeXBlKHN0cmluZyB0b2tlbk5hbWUpIHsKKyAgICAgICAgICAgIGlmICh0b2tlbk5hbWVUb1R5cGVNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGVzLkludmFsaWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh0b2tlbk5hbWVUb1R5cGVNYXAuVHJ5R2V0VmFsdWUodG9rZW5OYW1lLCBvdXQgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdhbGsgdGhlIGVudGlyZSB0cmVlIGFuZCBtYWtlIGEgbm9kZSBuYW1lIHRvIG5vZGVzIG1hcHBpbmcuCisgICAgICAgICAqICBGb3Igbm93LCB1c2UgcmVjdXJzaW9uIGJ1dCBsYXRlciBub25yZWN1cnNpdmUgdmVyc2lvbiBtYXkgYmUKKyAgICAgICAgICogIG1vcmUgZWZmaWNpZW50LiAgUmV0dXJucyBNYXAmbHQ7SW50ZWdlciwgTGlzdCZndDsgd2hlcmUgdGhlIExpc3QgaXMKKyAgICAgICAgICogIG9mIHlvdXIgQVNUIG5vZGUgdHlwZS4gIFRoZSBJbnRlZ2VyIGlzIHRoZSB0b2tlbiB0eXBlIG9mIHRoZSBub2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUT0RPOiBzYXZlIHRoaXMgaW5kZXggc28gdGhhdCBmaW5kIGFuZCB2aXNpdCBhcmUgZmFzdGVyCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8aW50LCBJTGlzdD4gSW5kZXgob2JqZWN0IHQpIHsKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PGludCwgSUxpc3Q+IG0gPSBuZXcgRGljdGlvbmFyeTxpbnQsIElMaXN0PigpOworICAgICAgICAgICAgSW5kZXhDb3JlKHQsIG0pOworICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+RG8gdGhlIHdvcmsgZm9yIGluZGV4PC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEluZGV4Q29yZShvYmplY3QgdCwgSURpY3Rpb25hcnk8aW50LCBJTGlzdD4gbSkgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB0dHlwZSA9IGFkYXB0b3IuR2V0VHlwZSh0KTsKKyAgICAgICAgICAgIElMaXN0IGVsZW1lbnRzOworICAgICAgICAgICAgaWYgKCFtLlRyeUdldFZhbHVlKHR0eXBlLCBvdXQgZWxlbWVudHMpIHx8IGVsZW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbGVtZW50cyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKKyAgICAgICAgICAgICAgICBtW3R0eXBlXSA9IGVsZW1lbnRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbWVudHMuQWRkKHQpOworICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQodCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IGFkYXB0b3IuR2V0Q2hpbGQodCwgaSk7CisgICAgICAgICAgICAgICAgSW5kZXhDb3JlKGNoaWxkLCBtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEZpbmRUcmVlV2l6YXJkVmlzaXRvciA6IFRyZWVXaXphcmQuVmlzaXRvciB7CisgICAgICAgICAgICBJTGlzdCBfbm9kZXM7CisgICAgICAgICAgICBwdWJsaWMgRmluZFRyZWVXaXphcmRWaXNpdG9yKElMaXN0IG5vZGVzKSB7CisgICAgICAgICAgICAgICAgX25vZGVzID0gbm9kZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBWaXNpdChvYmplY3QgdCkgeworICAgICAgICAgICAgICAgIF9ub2Rlcy5BZGQodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MgRmluZFRyZWVXaXphcmRDb250ZXh0VmlzaXRvciA6IFRyZWVXaXphcmQuSUNvbnRleHRWaXNpdG9yIHsKKyAgICAgICAgICAgIFRyZWVXaXphcmQgX291dGVyOworICAgICAgICAgICAgVHJlZVBhdHRlcm4gX3RwYXR0ZXJuOworICAgICAgICAgICAgSUxpc3QgX3N1YnRyZWVzOworICAgICAgICAgICAgcHVibGljIEZpbmRUcmVlV2l6YXJkQ29udGV4dFZpc2l0b3IoVHJlZVdpemFyZCBvdXRlciwgVHJlZVBhdHRlcm4gdHBhdHRlcm4sIElMaXN0IHN1YnRyZWVzKSB7CisgICAgICAgICAgICAgICAgX291dGVyID0gb3V0ZXI7CisgICAgICAgICAgICAgICAgX3RwYXR0ZXJuID0gdHBhdHRlcm47CisgICAgICAgICAgICAgICAgX3N1YnRyZWVzID0gc3VidHJlZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFZpc2l0KG9iamVjdCB0LCBvYmplY3QgcGFyZW50LCBpbnQgY2hpbGRJbmRleCwgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IGxhYmVscykgeworICAgICAgICAgICAgICAgIGlmIChfb3V0ZXIuUGFyc2VDb3JlKHQsIF90cGF0dGVybiwgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgX3N1YnRyZWVzLkFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmV0dXJuIGEgTGlzdCBvZiB0cmVlIG5vZGVzIHdpdGggdG9rZW4gdHlwZSB0dHlwZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3QgRmluZChvYmplY3QgdCwgaW50IHR0eXBlKSB7CisgICAgICAgICAgICBJTGlzdCBub2RlcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKKyAgICAgICAgICAgIFZpc2l0KHQsIHR0eXBlLCBuZXcgRmluZFRyZWVXaXphcmRWaXNpdG9yKG5vZGVzKSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmV0dXJuIGEgTGlzdCBvZiBzdWJ0cmVlcyBtYXRjaGluZyBwYXR0ZXJuLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3QgRmluZChvYmplY3QgdCwgc3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgICAgIElMaXN0IHN1YnRyZWVzID0gbmV3IExpc3Q8b2JqZWN0PigpOworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgVHJlZVBhdHRlcm4gZnJvbSB0aGUgcGF0dGVybgorICAgICAgICAgICAgVHJlZVBhdHRlcm5MZXhlciB0b2tlbml6ZXIgPSBuZXcgVHJlZVBhdHRlcm5MZXhlcihwYXR0ZXJuKTsKKyAgICAgICAgICAgIFRyZWVQYXR0ZXJuUGFyc2VyIHBhcnNlciA9CisgICAgICAgICAgICAgICAgbmV3IFRyZWVQYXR0ZXJuUGFyc2VyKHRva2VuaXplciwgdGhpcywgbmV3IFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoKSk7CisgICAgICAgICAgICBUcmVlUGF0dGVybiB0cGF0dGVybiA9IChUcmVlUGF0dGVybilwYXJzZXIuUGF0dGVybigpOworICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgaW52YWxpZCBwYXR0ZXJucworICAgICAgICAgICAgaWYgKHRwYXR0ZXJuID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgdHBhdHRlcm4uSXNOaWwgfHwKKyAgICAgICAgICAgICAgICAgdHBhdHRlcm4uR2V0VHlwZSgpID09IHR5cGVvZihXaWxkY2FyZFRyZWVQYXR0ZXJuKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJvb3RUb2tlblR5cGUgPSB0cGF0dGVybi5UeXBlOworICAgICAgICAgICAgVmlzaXQodCwgcm9vdFRva2VuVHlwZSwgbmV3IEZpbmRUcmVlV2l6YXJkQ29udGV4dFZpc2l0b3IodGhpcywgdHBhdHRlcm4sIHN1YnRyZWVzKSk7CisgICAgICAgICAgICByZXR1cm4gc3VidHJlZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRmluZEZpcnN0KG9iamVjdCB0LCBpbnQgdHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEZpbmRGaXJzdChvYmplY3QgdCwgc3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVmlzaXQgZXZlcnkgdHR5cGUgbm9kZSBpbiB0LCBpbnZva2luZyB0aGUgdmlzaXRvci4gIFRoaXMgaXMgYSBxdWlja2VyCisgICAgICAgICAqICB2ZXJzaW9uIG9mIHRoZSBnZW5lcmFsIHZpc2l0KHQsIHBhdHRlcm4pIG1ldGhvZC4gIFRoZSBsYWJlbHMgYXJnCisgICAgICAgICAqICBvZiB0aGUgdmlzaXRvciBhY3Rpb24gbWV0aG9kIGlzIG5ldmVyIHNldCAoaXQncyBudWxsKSBzaW5jZSB1c2luZworICAgICAgICAgKiAgYSB0b2tlbiB0eXBlIHJhdGhlciB0aGFuIGEgcGF0dGVybiBkb2Vzbid0IGxldCB1cyBzZXQgYSBsYWJlbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIFZpc2l0KG9iamVjdCB0LCBpbnQgdHR5cGUsIElDb250ZXh0VmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgICAgICBWaXNpdENvcmUodCwgbnVsbCwgMCwgdHR5cGUsIHZpc2l0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVmlzaXQob2JqZWN0IHQsIGludCB0dHlwZSwgU3lzdGVtLkFjdGlvbjxvYmplY3Q+IGFjdGlvbikgeworICAgICAgICAgICAgVmlzaXQodCwgdHR5cGUsIG5ldyBBY3Rpb25WaXNpdG9yKGFjdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkRvIHRoZSByZWN1cnNpdmUgd29yayBmb3IgdmlzaXQ8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgVmlzaXRDb3JlKG9iamVjdCB0LCBvYmplY3QgcGFyZW50LCBpbnQgY2hpbGRJbmRleCwgaW50IHR0eXBlLCBJQ29udGV4dFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGFwdG9yLkdldFR5cGUodCkgPT0gdHR5cGUpIHsKKyAgICAgICAgICAgICAgICB2aXNpdG9yLlZpc2l0KHQsIHBhcmVudCwgY2hpbGRJbmRleCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbiA9IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkID0gYWRhcHRvci5HZXRDaGlsZCh0LCBpKTsKKyAgICAgICAgICAgICAgICBWaXNpdENvcmUoY2hpbGQsIHQsIGksIHR0eXBlLCB2aXNpdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFZpc2l0VHJlZVdpemFyZENvbnRleHRWaXNpdG9yIDogVHJlZVdpemFyZC5JQ29udGV4dFZpc2l0b3IgeworICAgICAgICAgICAgVHJlZVdpemFyZCBfb3V0ZXI7CisgICAgICAgICAgICBJQ29udGV4dFZpc2l0b3IgX3Zpc2l0b3I7CisgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gX2xhYmVsczsKKyAgICAgICAgICAgIFRyZWVQYXR0ZXJuIF90cGF0dGVybjsKKworICAgICAgICAgICAgcHVibGljIFZpc2l0VHJlZVdpemFyZENvbnRleHRWaXNpdG9yKFRyZWVXaXphcmQgb3V0ZXIsIElDb250ZXh0VmlzaXRvciB2aXNpdG9yLCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzLCBUcmVlUGF0dGVybiB0cGF0dGVybikgeworICAgICAgICAgICAgICAgIF9vdXRlciA9IG91dGVyOworICAgICAgICAgICAgICAgIF92aXNpdG9yID0gdmlzaXRvcjsKKyAgICAgICAgICAgICAgICBfbGFiZWxzID0gbGFiZWxzOworICAgICAgICAgICAgICAgIF90cGF0dGVybiA9IHRwYXR0ZXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBWaXNpdChvYmplY3QgdCwgb2JqZWN0IHBhcmVudCwgaW50IGNoaWxkSW5kZXgsIElEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiB1bnVzZWRsYWJlbHMpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgdW51c2VkbGFiZWxzIGFyZyBpcyBudWxsIGFzIHZpc2l0IG9uIHRva2VuIHR5cGUgZG9lc24ndCBzZXQuCisgICAgICAgICAgICAgICAgX2xhYmVscy5DbGVhcigpOworICAgICAgICAgICAgICAgIGlmIChfb3V0ZXIuUGFyc2VDb3JlKHQsIF90cGF0dGVybiwgX2xhYmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgX3Zpc2l0b3IuVmlzaXQodCwgcGFyZW50LCBjaGlsZEluZGV4LCBfbGFiZWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBGb3IgYWxsIHN1YnRyZWVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4sIGV4ZWN1dGUgdGhlIHZpc2l0IGFjdGlvbi4KKyAgICAgICAgICogIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSByb290IG5vZGUgb2YgdGhlIHBhdHRlcm4gaW4gY29tYmluYXRpb24KKyAgICAgICAgICogIHdpdGggdmlzaXQodCwgdHR5cGUsIHZpc2l0b3IpIHNvIG5pbC1yb290ZWQgcGF0dGVybnMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICAgKiAgUGF0dGVybnMgd2l0aCB3aWxkY2FyZCByb290cyBhcmUgYWxzbyBub3QgYWxsb3dlZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIFZpc2l0KG9iamVjdCB0LCBzdHJpbmcgcGF0dGVybiwgSUNvbnRleHRWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIFRyZWVQYXR0ZXJuIGZyb20gdGhlIHBhdHRlcm4KKyAgICAgICAgICAgIFRyZWVQYXR0ZXJuTGV4ZXIgdG9rZW5pemVyID0gbmV3IFRyZWVQYXR0ZXJuTGV4ZXIocGF0dGVybik7CisgICAgICAgICAgICBUcmVlUGF0dGVyblBhcnNlciBwYXJzZXIgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlUGF0dGVyblBhcnNlcih0b2tlbml6ZXIsIHRoaXMsIG5ldyBUcmVlUGF0dGVyblRyZWVBZGFwdG9yKCkpOworICAgICAgICAgICAgVHJlZVBhdHRlcm4gdHBhdHRlcm4gPSAoVHJlZVBhdHRlcm4pcGFyc2VyLlBhdHRlcm4oKTsKKyAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IGludmFsaWQgcGF0dGVybnMKKyAgICAgICAgICAgIGlmICh0cGF0dGVybiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIHRwYXR0ZXJuLklzTmlsIHx8CisgICAgICAgICAgICAgICAgIHRwYXR0ZXJuLkdldFR5cGUoKSA9PSB0eXBlb2YoV2lsZGNhcmRUcmVlUGF0dGVybikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7IC8vIHJldXNlZCBmb3IgZWFjaCBfcGFyc2UKKyAgICAgICAgICAgIGludCByb290VG9rZW5UeXBlID0gdHBhdHRlcm4uVHlwZTsKKyAgICAgICAgICAgIFZpc2l0KHQsIHJvb3RUb2tlblR5cGUsIG5ldyBWaXNpdFRyZWVXaXphcmRDb250ZXh0VmlzaXRvcih0aGlzLCB2aXNpdG9yLCBsYWJlbHMsIHRwYXR0ZXJuKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHaXZlbiBhIHBhdHRlcm4gbGlrZSAoQVNTSUdOICVsaHM6SUQgJXJoczouKSB3aXRoIG9wdGlvbmFsIGxhYmVscworICAgICAgICAgKiAgb24gdGhlIHZhcmlvdXMgbm9kZXMgYW5kICcuJyAoZG90KSBhcyB0aGUgbm9kZS9zdWJ0cmVlIHdpbGRjYXJkLAorICAgICAgICAgKiAgcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBhbmQgZmlsbCB0aGUgbGFiZWxzIE1hcCB3aXRoCisgICAgICAgICAqICB0aGUgbGFiZWxzIHBvaW50aW5nIGF0IHRoZSBhcHByb3ByaWF0ZSBub2Rlcy4gIFJldHVybiBmYWxzZSBpZgorICAgICAgICAgKiAgdGhlIHBhdHRlcm4gaXMgbWFsZm9ybWVkIG9yIHRoZSB0cmVlIGRvZXMgbm90IG1hdGNoLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiBhIG5vZGUgc3BlY2lmaWVzIGEgdGV4dCBhcmcgaW4gcGF0dGVybiwgdGhlbiB0aGF0IG11c3QgbWF0Y2gKKyAgICAgICAgICogIGZvciB0aGF0IG5vZGUgaW4gdC4KKyAgICAgICAgICoKKyAgICAgICAgICogIFRPRE86IHdoYXQncyBhIGJldHRlciB3YXkgdG8gaW5kaWNhdGUgYmFkIHBhdHRlcm4/IEV4Y2VwdGlvbnMgYXJlIGEgaGFzc2xlIAorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2wgUGFyc2Uob2JqZWN0IHQsIHN0cmluZyBwYXR0ZXJuLCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzKSB7CisgICAgICAgICAgICBUcmVlUGF0dGVybkxleGVyIHRva2VuaXplciA9IG5ldyBUcmVlUGF0dGVybkxleGVyKHBhdHRlcm4pOworICAgICAgICAgICAgVHJlZVBhdHRlcm5QYXJzZXIgcGFyc2VyID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZVBhdHRlcm5QYXJzZXIodG9rZW5pemVyLCB0aGlzLCBuZXcgVHJlZVBhdHRlcm5UcmVlQWRhcHRvcigpKTsKKyAgICAgICAgICAgIFRyZWVQYXR0ZXJuIHRwYXR0ZXJuID0gKFRyZWVQYXR0ZXJuKXBhcnNlci5QYXR0ZXJuKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0PSIrKChUcmVlKXQpLnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbnQ9Iit0cGF0dGVybi50b1N0cmluZ1RyZWUoKSk7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9vbCBtYXRjaGVkID0gUGFyc2VDb3JlKHQsIHRwYXR0ZXJuLCBsYWJlbHMpOworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBQYXJzZShvYmplY3QgdCwgc3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJzZSh0LCBwYXR0ZXJuLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIERvIHRoZSB3b3JrIGZvciBwYXJzZS4gQ2hlY2sgdG8gc2VlIGlmIHRoZSB0MiBwYXR0ZXJuIGZpdHMgdGhlCisgICAgICAgICAqICBzdHJ1Y3R1cmUgYW5kIHRva2VuIHR5cGVzIGluIHQxLiAgQ2hlY2sgdGV4dCBpZiB0aGUgcGF0dGVybiBoYXMKKyAgICAgICAgICogIHRleHQgYXJndW1lbnRzIG9uIG5vZGVzLiAgRmlsbCBsYWJlbHMgbWFwIHdpdGggcG9pbnRlcnMgdG8gbm9kZXMKKyAgICAgICAgICogIGluIHRyZWUgbWF0Y2hlZCBhZ2FpbnN0IG5vZGVzIGluIHBhdHRlcm4gd2l0aCBsYWJlbHMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBib29sIFBhcnNlQ29yZShvYmplY3QgdDEsIFRyZWVQYXR0ZXJuIHRwYXR0ZXJuLCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzKSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYm90aCBhcmUgbm9uLW51bGwKKyAgICAgICAgICAgIGlmICh0MSA9PSBudWxsIHx8IHRwYXR0ZXJuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayByb290cyAod2lsZGNhcmQgbWF0Y2hlcyBhbnl0aGluZykKKyAgICAgICAgICAgIGlmICh0cGF0dGVybi5HZXRUeXBlKCkgIT0gdHlwZW9mKFdpbGRjYXJkVHJlZVBhdHRlcm4pKSB7CisgICAgICAgICAgICAgICAgaWYgKGFkYXB0b3IuR2V0VHlwZSh0MSkgIT0gdHBhdHRlcm4uVHlwZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGlmIHBhdHRlcm4gaGFzIHRleHQsIGNoZWNrIG5vZGUgdGV4dAorICAgICAgICAgICAgICAgIGlmICh0cGF0dGVybi5oYXNUZXh0QXJnICYmICFhZGFwdG9yLkdldFRleHQodDEpLkVxdWFscyh0cGF0dGVybi5UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRwYXR0ZXJuLmxhYmVsICE9IG51bGwgJiYgbGFiZWxzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBtYXAgbGFiZWwgaW4gcGF0dGVybiB0byBub2RlIGluIHQxCisgICAgICAgICAgICAgICAgbGFiZWxzW3RwYXR0ZXJuLmxhYmVsXSA9IHQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgY2hpbGRyZW4KKyAgICAgICAgICAgIGludCBuMSA9IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0MSk7CisgICAgICAgICAgICBpbnQgbjIgPSB0cGF0dGVybi5DaGlsZENvdW50OworICAgICAgICAgICAgaWYgKG4xICE9IG4yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkMSA9IGFkYXB0b3IuR2V0Q2hpbGQodDEsIGkpOworICAgICAgICAgICAgICAgIFRyZWVQYXR0ZXJuIGNoaWxkMiA9IChUcmVlUGF0dGVybil0cGF0dGVybi5HZXRDaGlsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIVBhcnNlQ29yZShjaGlsZDEsIGNoaWxkMiwgbGFiZWxzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSB0cmVlIG9yIG5vZGUgZnJvbSB0aGUgaW5kaWNhdGVkIHRyZWUgcGF0dGVybiB0aGF0IGNsb3NlbHkKKyAgICAgICAgICogIGZvbGxvd3MgQU5UTFIgdHJlZSBncmFtbWFyIHRyZWUgZWxlbWVudCBzeW50YXg6CisgICAgICAgICAqCisgICAgICAgICAqICAgICAgKHJvb3QgY2hpbGQxIC4uLiBjaGlsZDIpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBZb3UgY2FuIGFsc28ganVzdCBwYXNzIGluIGEgbm9kZTogSUQKKyAgICAgICAgICogCisgICAgICAgICAqICBBbnkgbm9kZSBjYW4gaGF2ZSBhIHRleHQgYXJndW1lbnQ6IElEW2Zvb10KKyAgICAgICAgICogIChub3RpY2UgdGhlcmUgYXJlIG5vIHF1b3RlcyBhcm91bmQgZm9vLS1pdCdzIGNsZWFyIGl0J3MgYSBzdHJpbmcpLgorICAgICAgICAgKgorICAgICAgICAgKiAgbmlsIGlzIGEgc3BlY2lhbCBuYW1lIG1lYW5pbmcgImdpdmUgbWUgYSBuaWwgbm9kZSIuICBVc2VmdWwgZm9yCisgICAgICAgICAqICBtYWtpbmcgbGlzdHM6IChuaWwgQSBCIEMpIGlzIGEgbGlzdCBvZiBBIEIgQy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoc3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgICAgIFRyZWVQYXR0ZXJuTGV4ZXIgdG9rZW5pemVyID0gbmV3IFRyZWVQYXR0ZXJuTGV4ZXIocGF0dGVybik7CisgICAgICAgICAgICBUcmVlUGF0dGVyblBhcnNlciBwYXJzZXIgPSBuZXcgVHJlZVBhdHRlcm5QYXJzZXIodG9rZW5pemVyLCB0aGlzLCBhZGFwdG9yKTsKKyAgICAgICAgICAgIG9iamVjdCB0ID0gcGFyc2VyLlBhdHRlcm4oKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ29tcGFyZSB0MSBhbmQgdDI7IHJldHVybiB0cnVlIGlmIHRva2VuIHR5cGVzL3RleHQsIHN0cnVjdHVyZSBtYXRjaCBleGFjdGx5LgorICAgICAgICAgKiAgVGhlIHRyZWVzIGFyZSBleGFtaW5lZCBpbiB0aGVpciBlbnRpcmV0eSBzbyB0aGF0IChBIEIpIGRvZXMgbm90IG1hdGNoCisgICAgICAgICAqICAoQSBCIEMpIG5vciAoQSAoQiBDKSkuIAorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUT0RPOiBhbGxvdyB0aGVtIHRvIHBhc3MgaW4gYSBjb21wYXJhdG9yCisgICAgICAgICAqICBUT0RPOiBoYXZlIGEgdmVyc2lvbiB0aGF0IGlzIG5vbnN0YXRpYyBzbyBpdCBjYW4gdXNlIGluc3RhbmNlIGFkYXB0b3IKKyAgICAgICAgICoKKyAgICAgICAgICogIEkgY2Fubm90IHJlbHkgb24gdGhlIHRyZWUgbm9kZSdzIGVxdWFscygpIGltcGxlbWVudGF0aW9uIGFzIEkgbWFrZQorICAgICAgICAgKiAgbm8gY29uc3RyYWludHMgYXQgYWxsIG9uIHRoZSBub2RlIHR5cGVzIG5vciBpbnRlcmZhY2UgZXRjLi4uIAorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEVxdWFscyhvYmplY3QgdDEsIG9iamVjdCB0MiwgSVRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBFcXVhbHNDb3JlKHQxLCB0MiwgYWRhcHRvcik7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDb21wYXJlIHR5cGUsIHN0cnVjdHVyZSwgYW5kIHRleHQgb2YgdHdvIHRyZWVzLCBhc3N1bWluZyBhZGFwdG9yIGluCisgICAgICAgICAqICB0aGlzIGluc3RhbmNlIG9mIGEgVHJlZVdpemFyZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBuZXcgYm9vbCBFcXVhbHMob2JqZWN0IHQxLCBvYmplY3QgdDIpIHsKKyAgICAgICAgICAgIHJldHVybiBFcXVhbHNDb3JlKHQxLCB0MiwgYWRhcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2wgRXF1YWxzQ29yZShvYmplY3QgdDEsIG9iamVjdCB0MiwgSVRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBib3RoIGFyZSBub24tbnVsbAorICAgICAgICAgICAgaWYgKHQxID09IG51bGwgfHwgdDIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIHJvb3RzCisgICAgICAgICAgICBpZiAoYWRhcHRvci5HZXRUeXBlKHQxKSAhPSBhZGFwdG9yLkdldFR5cGUodDIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhZGFwdG9yLkdldFRleHQodDEpLkVxdWFscyhhZGFwdG9yLkdldFRleHQodDIpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIGNoaWxkcmVuCisgICAgICAgICAgICBpbnQgbjEgPSBhZGFwdG9yLkdldENoaWxkQ291bnQodDEpOworICAgICAgICAgICAgaW50IG4yID0gYWRhcHRvci5HZXRDaGlsZENvdW50KHQyKTsKKyAgICAgICAgICAgIGlmIChuMSAhPSBuMikgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjE7IGkrKykgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZDEgPSBhZGFwdG9yLkdldENoaWxkKHQxLCBpKTsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQyID0gYWRhcHRvci5HZXRDaGlsZCh0MiwgaSk7CisgICAgICAgICAgICAgICAgaWYgKCFFcXVhbHNDb3JlKGNoaWxkMSwgY2hpbGQyLCBhZGFwdG9yKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworI2lmIEJVSUxEX0lOREVYRVMKKyAgICAgICAgLy8gVE9ETzogbmV4dCBzdHVmZiB0YWtlbiBmcm9tIENvbW1vblRyZWVOb2RlU3RyZWFtCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gYSBub2RlLCBhZGQgdGhpcyB0byB0aGUgcmV2ZXJzZSBpbmRleCB0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAuCisgICAgICAgICAqICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFsdGVyIGhvdyBpbmRleGluZyBvY2N1cnMuICBUaGUKKyAgICAgICAgICogIGRlZmF1bHQgaXMgdG8gY3JlYXRlIGEKKyAgICAgICAgICoKKyAgICAgICAgICogICAgTWFwJmx0O0ludGVnZXIgdG9rZW4gdHlwZSxBcnJheUxpc3QmbHQ7SW50ZWdlciBzdHJlYW0gaW5kZXgmZ3Q7Jmd0OworICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIGRhdGEgc3RydWN0dXJlIGFsbG93cyB5b3UgdG8gZmluZCBhbGwgbm9kZXMgd2l0aCB0eXBlIElOVCBpbiBvcmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogIElmIHlvdSByZWFsbHkgbmVlZCB0byBmaW5kIGEgbm9kZSBvZiB0eXBlLCBzYXksIEZVTkMgcXVpY2tseSB0aGVuIHBlcmhhcHMKKyAgICAgICAgICoKKyAgICAgICAgICogICAgTWFwJmx0O0ludGVnZXJ0b2tlbiB0eXBlLE1hcCZsdDtPYmplY3QgdHJlZSBub2RlLEludGVnZXIgc3RyZWFtIGluZGV4Jmd0OyZndDsKKyAgICAgICAgICoKKyAgICAgICAgICogIHdvdWxkIGJlIGJldHRlciBmb3IgeW91LiAgVGhlIGludGVyaW9yIG1hcHMgbWFwIGEgdHJlZSBub2RlIHRvCisgICAgICAgICAqICB0aGUgaW5kZXggc28geW91IGRvbid0IGhhdmUgdG8gc2VhcmNoIGxpbmVhcmx5IGZvciBhIHNwZWNpZmljIG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICBJZiB5b3UgY2hhbmdlIHRoaXMgbWV0aG9kLCB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0byBjaGFuZ2UKKyAgICAgICAgICogIGdldE5vZGVJbmRleCgpLCB3aGljaCBleHRyYWN0cyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbGxSZXZlcnNlSW5kZXgoIG9iamVjdCBub2RlLCBpbnQgc3RyZWFtSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmV2SW5kZXggIitub2RlKyJAIitzdHJlYW1JbmRleCk7CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGluZGV4aW5nIGlmIHRoaXMgaXMgZW1wdHkgKG5vdGhpbmcgb2YgaW50ZXJlc3QpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAgPSBuZXcgRGljdGlvbmFyeTxpbnQsIElMaXN0PGludD4+KCk7IC8vIGZpcnN0IGluZGV4aW5nIG9wCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgdG9rZW5UeXBlID0gYWRhcHRvci5nZXRUeXBlKCBub2RlICk7CisgICAgICAgICAgICBpZiAoICEoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBJTkRFWF9BTEwgfHwKKyAgICAgICAgICAgICAgICAgICB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXguQ29udGFpbnMoIHRva2VuVHlwZSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gdG9rZW5UeXBlIG5vdCBvZiBpbnRlcmVzdAorICAgICAgICAgICAgfQorICAgICAgICAgICAgSUxpc3Q8aW50PiBpbmRleGVzOworCisgICAgICAgICAgICBpZiAoICF0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAuVHJ5R2V0VmFsdWUoIHRva2VuVHlwZSwgb3V0IGluZGV4ZXMgKSB8fCBpbmRleGVzID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7IC8vIG5vIGxpc3QgeWV0IGZvciB0aGlzIHRva2VuIHR5cGUKKyAgICAgICAgICAgICAgICBpbmRleGVzLkFkZCggc3RyZWFtSW5kZXggKTsgLy8gbm90IHRoZXJlIHlldCwgYWRkCisgICAgICAgICAgICAgICAgdG9rZW5UeXBlVG9TdHJlYW1JbmRleGVzTWFwW3Rva2VuVHlwZV0gPSBpbmRleGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggIWluZGV4ZXMuQ29udGFpbnMoIHN0cmVhbUluZGV4ICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5BZGQoIHN0cmVhbUluZGV4ICk7IC8vIG5vdCB0aGVyZSB5ZXQsIGFkZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRyYWNrIHRoZSBpbmRpY2F0ZWQgdG9rZW4gdHlwZSBpbiB0aGUgcmV2ZXJzZSBpbmRleC4gIENhbGwgdGhpcworICAgICAgICAgKiAgcmVwZWF0ZWRseSBmb3IgZWFjaCB0eXBlIG9yIHVzZSB2YXJpYW50IHdpdGggU2V0IGFyZ3VtZW50IHRvCisgICAgICAgICAqICBzZXQgYWxsIGF0IG9uY2UuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cGFyYW0gbmFtZT0idG9rZW5UeXBlIiAvPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmV2ZXJzZUluZGV4KCBpbnQgdG9rZW5UeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW5UeXBlc1RvUmV2ZXJzZUluZGV4ID0gbmV3IEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBJTkRFWF9BTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleC5hZGQoIHRva2VuVHlwZSApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJhY2sgdGhlIGluZGljYXRlZCB0b2tlbiB0eXBlcyBpbiB0aGUgcmV2ZXJzZSBpbmRleC4gU2V0CisgICAgICAgICAqICB0byBJTkRFWF9BTEwgdG8gdHJhY2sgYWxsIHRva2VuIHR5cGVzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmV2ZXJzZUluZGV4KCBIYXNoU2V0PGludD4gdG9rZW5UeXBlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9IHRva2VuVHlwZXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHaXZlbiBhIG5vZGUgcG9pbnRlciwgcmV0dXJuIGl0cyBpbmRleCBpbnRvIHRoZSBub2RlIHN0cmVhbS4KKyAgICAgICAgICogIFRoaXMgaXMgbm90IGl0cyBUb2tlbiBzdHJlYW0gaW5kZXguICBJZiB0aGVyZSBpcyBubyByZXZlcnNlIG1hcAorICAgICAgICAgKiAgZnJvbSBub2RlIHRvIHN0cmVhbSBpbmRleCBvciB0aGUgbWFwIGRvZXMgbm90IGNvbnRhaW4gZW50cmllcworICAgICAgICAgKiAgZm9yIG5vZGUncyB0b2tlbiB0eXBlLCBhIGxpbmVhciBzZWFyY2ggb2YgZW50aXJlIHN0cmVhbSBpcyB1c2VkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBSZXR1cm4gLTEgaWYgZXhhY3Qgbm9kZSBwb2ludGVyIG5vdCBpbiBzdHJlYW0uCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE5vZGVJbmRleCggb2JqZWN0IG5vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0ICIrbm9kZSk7CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZUluZGV4TGluZWFybHkoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB0b2tlblR5cGUgPSBhZGFwdG9yLmdldFR5cGUoIG5vZGUgKTsKKyAgICAgICAgICAgIElMaXN0PGludD4gaW5kZXhlczsKKyAgICAgICAgICAgIGlmICggIXRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcC5UcnlHZXRWYWx1ZSggdG9rZW5UeXBlLCBvdXQgaW5kZXhlcyApIHx8IGluZGV4ZXMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGxpbmVhcmx5OyBzdHJlYW0gaW5kZXggPSAiK2dldE5vZGVJbmRleExpbmVhcmx5KG5vZGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZUluZGV4TGluZWFybHkoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGluZGV4ZXMuc2l6ZSgpOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzdHJlYW1JbmRleCA9IGluZGV4ZXNbaV07CisgICAgICAgICAgICAgICAgb2JqZWN0IG4gPSBnZXQoIHN0cmVhbUluZGV4ICk7CisgICAgICAgICAgICAgICAgaWYgKCBuID09IG5vZGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGluIGluZGV4OyBzdHJlYW0gaW5kZXggPSAiK3N0cmVhbUluZGV4SSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmRleDsgLy8gZm91bmQgaXQhCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0FOVExSRmlsZVN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0FOVExSRmlsZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZiYmZjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTUwIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKwl1c2luZyBTeXN0ZW07CisJdXNpbmcgU3RyZWFtUmVhZGVyCT0gU3lzdGVtLklPLlN0cmVhbVJlYWRlcjsKKwl1c2luZyBGaWxlSW5mbwkJPSBTeXN0ZW0uSU8uRmlsZUluZm87CisJdXNpbmcgRW5jb2RpbmcJCT0gU3lzdGVtLlRleHQuRW5jb2Rpbmc7CisJCisJLy8vIDxzdW1tYXJ5PgorCS8vLyBBIGNoYXJhY3RlciBzdHJlYW0gLSBhbiA8c2VlIGNyZWY9IklDaGFyU3RyZWFtIi8+IC0gdGhhdCBsb2FkcyAKKwkvLy8gYW5kIGNhY2hlcyB0aGUgY29udGVudHMgb2YgaXQncyB1bmRlcmx5aW5nIGZpbGUgZnVsbHkgZHVyaW5nIAorCS8vLyBvYmplY3QgY29uc3RydWN0aW9uCisJLy8vIDwvc3VtbWFyeT4KKwkvLy8gPHJlbWFya3M+CisJLy8vIFRoaXMgbG9va3MgdmVyeSBtdWNoIGxpa2UgYW4gQU5UTFJlYWRlclN0cmVhbSBvciBhbiBBTlRMUklucHV0U3RyZWFtIAorCS8vLyBidXQsIGl0IGlzIGEgc3BlY2lhbCBjYXNlLiBTaW5jZSB3ZSBrbm93IHRoZSBleGFjdCBzaXplIG9mIHRoZSBmaWxlIHRvIAorCS8vLyBsb2FkLCB3ZSBjYW4gYXZvaWQgbG90cyBvZiBkYXRhIGNvcHlpbmcgYW5kIGJ1ZmZlciByZXNpemluZy4KKwkvLy8gPC9yZW1hcmtzPgorCXB1YmxpYyBjbGFzcyBBTlRMUkZpbGVTdHJlYW0gOiBBTlRMUlN0cmluZ1N0cmVhbQorCXsKKwkJI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQU5UTFJGaWxlU3RyZWFtIGNsYXNzCisJCS8vLyA8L3N1bW1hcnk+CisJCXByb3RlY3RlZCBBTlRMUkZpbGVTdHJlYW0oKQorCQl7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQU5UTFJGaWxlU3RyZWFtIGNsYXNzIGZvciB0aGUKKwkJLy8vIHNwZWNpZmllZCBmaWxlIG5hbWUKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEFOVExSRmlsZVN0cmVhbShzdHJpbmcgZmlsZU5hbWUpIDoKKwkJCXRoaXMoZmlsZU5hbWUsIEVuY29kaW5nLkRlZmF1bHQpCisJCXsKKwkJfQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBTlRMUkZpbGVTdHJlYW0gY2xhc3MgZm9yIHRoZQorCQkvLy8gc3BlY2lmaWVkIGZpbGUgbmFtZSBhbmQgZW5jb2RpbmcKKwkJLy8vIDwvc3VtbWFyeT4KKwkJcHVibGljIEFOVExSRmlsZVN0cmVhbShzdHJpbmcgZmlsZU5hbWUsIEVuY29kaW5nIGVuY29kaW5nKQorCQl7CisJCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisJCQlMb2FkKGZpbGVOYW1lLCBlbmNvZGluZyk7CisJCX0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBHZXRzIHRoZSBmaWxlIG5hbWUgb2YgdGhpcyBBTlRMUkZpbGVTdHJlYW0gdW5kZXJseWluZyBmaWxlCisJCS8vLyA8L3N1bW1hcnk+CisJCW92ZXJyaWRlIHB1YmxpYyBzdHJpbmcgU291cmNlTmFtZQorCQl7CisJCQlnZXQgeyByZXR1cm4gZmlsZU5hbWU7IH0KKwkJfQorCisJCSNlbmRyZWdpb24KKworCisJCSNyZWdpb24gUHVibGljIEFQSQorCisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIExvYWRzIGFuZCBidWZmZXJzIHRoZSBzcGVjaWZpZWQgZmlsZSB0byBiZSB1c2VkIGFzIHRoaXMgCisJCS8vLyBBTlRMUkZpbGVTdHJlYW0ncyBzb3VyY2UKKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+RmlsZSB0byBsb2FkPC9wYXJhbT4KKwkJLy8vIDxwYXJhbSBuYW1lPSJlbmNvZGluZyI+RW5jb2RpbmcgdG8gYXBwbHkgdG8gZmlsZTwvcGFyYW0+CisJCXB1YmxpYyB2aXJ0dWFsIHZvaWQgTG9hZChzdHJpbmcgZmlsZU5hbWUsIEVuY29kaW5nIGVuY29kaW5nKQorCQl7CisJCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKKwkJCQlyZXR1cm47CisKKwkJCVN0cmVhbVJlYWRlciBmciA9IG51bGw7CisJCQl0cnkKKwkJCXsKKwkJCQlGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKGZpbGVOYW1lKTsKKwkJCQlpbnQgZmlsZWxlbiA9IChpbnQpR2V0RmlsZUxlbmd0aChmKTsKKwkJCQlkYXRhID0gbmV3IGNoYXJbZmlsZWxlbl07CisJCQkJaWYgKGVuY29kaW5nICE9IG51bGwpCisJCQkJCWZyID0gbmV3IFN0cmVhbVJlYWRlcihmaWxlTmFtZSwgZW5jb2RpbmcpOworCQkJCWVsc2UKKwkJCQkJZnIgPSBuZXcgU3RyZWFtUmVhZGVyKGZpbGVOYW1lLCBFbmNvZGluZy5EZWZhdWx0KTsKKwkJCQluID0gZnIuUmVhZCgoQ2hhcltdKWRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlpZiAoZnIgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWZyLkNsb3NlKCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJI2VuZHJlZ2lvbgorCisKKwkJI3JlZ2lvbiBEYXRhIE1lbWJlcnMKKworCQkvLy8gPHN1bW1hcnk+RnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHN0cmVhbSdzIHVuZGVybHlpbmcgZmlsZTwvc3VtbWFyeT4KKwkJcHJvdGVjdGVkIHN0cmluZyBmaWxlTmFtZTsKKworCQkjZW5kcmVnaW9uCisKKworCQkjcmVnaW9uIFByaXZhdGUgTWVtYmVycworCisJCXByaXZhdGUgbG9uZyBHZXRGaWxlTGVuZ3RoKEZpbGVJbmZvIGZpbGUpCisJCXsKKwkJCWlmIChmaWxlLkV4aXN0cykKKwkJCQlyZXR1cm4gZmlsZS5MZW5ndGg7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQkjZW5kcmVnaW9uCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0FOVExSSW5wdXRTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9BTlRMUklucHV0U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDY1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9BTlRMUklucHV0U3RyZWFtLmNzCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIEVuY29kaW5nID0gU3lzdGVtLlRleHQuRW5jb2Rpbmc7CisgICAgdXNpbmcgU3RyZWFtID0gU3lzdGVtLklPLlN0cmVhbTsKKyAgICB1c2luZyBTdHJlYW1SZWFkZXIgPSBTeXN0ZW0uSU8uU3RyZWFtUmVhZGVyOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGtpbmQgb2YgUmVhZGVyU3RyZWFtIHRoYXQgcHVsbHMgZnJvbSBhbiBJbnB1dFN0cmVhbS4KKyAgICAgKiAgVXNlZnVsIGZvciByZWFkaW5nIGZyb20gc3RkaW4gYW5kIHNwZWNpZnlpbmcgZmlsZSBlbmNvZGluZ3MgZXRjLi4uCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQU5UTFJJbnB1dFN0cmVhbSA6IEFOVExSUmVhZGVyU3RyZWFtIHsKKyAgICAgICAgcHVibGljIEFOVExSSW5wdXRTdHJlYW0oU3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiB0aGlzKGlucHV0LCBudWxsKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQU5UTFJJbnB1dFN0cmVhbShTdHJlYW0gaW5wdXQsIGludCBzaXplKQorICAgICAgICAgICAgOiB0aGlzKGlucHV0LCBzaXplLCBudWxsKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQU5UTFJJbnB1dFN0cmVhbShTdHJlYW0gaW5wdXQsIEVuY29kaW5nIGVuY29kaW5nKQorICAgICAgICAgICAgOiB0aGlzKGlucHV0LCBJbml0aWFsQnVmZmVyU2l6ZSwgZW5jb2RpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUklucHV0U3RyZWFtKFN0cmVhbSBpbnB1dCwgaW50IHNpemUsIEVuY29kaW5nIGVuY29kaW5nKQorICAgICAgICAgICAgOiB0aGlzKGlucHV0LCBzaXplLCBSZWFkQnVmZmVyU2l6ZSwgZW5jb2RpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUklucHV0U3RyZWFtKFN0cmVhbSBpbnB1dCwgaW50IHNpemUsIGludCByZWFkQnVmZmVyU2l6ZSwgRW5jb2RpbmcgZW5jb2RpbmcpCisgICAgICAgICAgICA6IGJhc2UoR2V0U3RyZWFtUmVhZGVyKGlucHV0LCBlbmNvZGluZyksIHNpemUsIHJlYWRCdWZmZXJTaXplKSB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJlYW1SZWFkZXIgR2V0U3RyZWFtUmVhZGVyKFN0cmVhbSBpbnB1dCwgRW5jb2RpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtUmVhZGVyKGlucHV0LCBlbmNvZGluZyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVJlYWRlcihpbnB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9BTlRMUlJlYWRlclN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0FOVExSUmVhZGVyU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMGUyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9BTlRMUlJlYWRlclN0cmVhbS5jcwpAQCAtMCwwICsxLDgxIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBUZXh0UmVhZGVyID0gU3lzdGVtLklPLlRleHRSZWFkZXI7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFZhY3V1bSBhbGwgaW5wdXQgZnJvbSBhIFJlYWRlciBhbmQgdGhlbiB0cmVhdCBpdCBsaWtlIGEgU3RyaW5nU3RyZWFtLgorICAgICAqICBNYW5hZ2UgdGhlIGJ1ZmZlciBtYW51YWxseSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBkYXRhIGNvcHlpbmcuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgSWYgeW91IG5lZWQgZW5jb2RpbmcsIHVzZSBBTlRMUklucHV0U3RyZWFtLgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEFOVExSUmVhZGVyU3RyZWFtIDogQU5UTFJTdHJpbmdTdHJlYW0geworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFJlYWRCdWZmZXJTaXplID0gMTAyNDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJbml0aWFsQnVmZmVyU2l6ZSA9IDEwMjQ7CisKKyAgICAgICAgcHVibGljIEFOVExSUmVhZGVyU3RyZWFtKFRleHRSZWFkZXIgcikKKyAgICAgICAgICAgIDogdGhpcyhyLCBJbml0aWFsQnVmZmVyU2l6ZSwgUmVhZEJ1ZmZlclNpemUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUlJlYWRlclN0cmVhbShUZXh0UmVhZGVyIHIsIGludCBzaXplKQorICAgICAgICAgICAgOiB0aGlzKHIsIHNpemUsIFJlYWRCdWZmZXJTaXplKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQU5UTFJSZWFkZXJTdHJlYW0oVGV4dFJlYWRlciByLCBpbnQgc2l6ZSwgaW50IHJlYWRDaHVua1NpemUpIHsKKyAgICAgICAgICAgIExvYWQociwgc2l6ZSwgcmVhZENodW5rU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvYWQoVGV4dFJlYWRlciByLCBpbnQgc2l6ZSwgaW50IHJlYWRDaHVua1NpemUpIHsKKyAgICAgICAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IEluaXRpYWxCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlYWRDaHVua1NpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIHJlYWRDaHVua1NpemUgPSBSZWFkQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigibG9hZCAiK3NpemUrIiBpbiBjaHVua3Mgb2YgIityZWFkQ2h1bmtTaXplKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IHIuUmVhZFRvRW5kKCkuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBiYXNlLm4gPSBkYXRhLkxlbmd0aDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgci5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEyZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uY3MKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIEFyZ3VtZW50RXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uOworICAgIHVzaW5nIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb247CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBwcmV0dHkgcXVpY2sgQ2hhclN0cmVhbSB0aGF0IHB1bGxzIGFsbCBkYXRhIGZyb20gYW4gYXJyYXkKKyAgICAgKiAgZGlyZWN0bHkuICBFdmVyeSBtZXRob2QgY2FsbCBjb3VudHMgaW4gdGhlIGxleGVyLiAgSmF2YSdzCisgICAgICogIHN0cmluZ3MgYXJlbid0IHZlcnkgZ29vZCBzbyBJJ20gYXZvaWRpbmcuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQU5UTFJTdHJpbmdTdHJlYW0gOiBJQ2hhclN0cmVhbSB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgZGF0YSBiZWluZyBzY2FubmVkPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgY2hhcltdIGRhdGE7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIGFjdHVhbGx5IGluIHRoZSBidWZmZXI8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbjsKKworICAgICAgICAvKiogPHN1bW1hcnk+MC4ubi0xIGluZGV4IGludG8gc3RyaW5nIG9mIG5leHQgY2hhcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBwID0gMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+bGluZSBudW1iZXIgMS4ubiB3aXRoaW4gdGhlIGlucHV0PC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgbGluZSA9IDE7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgMC4ubi0xPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+dHJhY2tzIGhvdyBkZWVwIG1hcmsoKSBjYWxscyBhcmUgbmVzdGVkPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IG1hcmtEZXB0aCA9IDA7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQSBsaXN0IG9mIENoYXJTdHJlYW1TdGF0ZSBvYmplY3RzIHRoYXQgdHJhY2tzIHRoZSBzdHJlYW0gc3RhdGUKKyAgICAgICAgICogIHZhbHVlcyBsaW5lLCBjaGFyUG9zaXRpb25JbkxpbmUsIGFuZCBwIHRoYXQgY2FuIGNoYW5nZSBhcyB5b3UKKyAgICAgICAgICogIG1vdmUgdGhyb3VnaCB0aGUgaW5wdXQgc3RyZWFtLiAgSW5kZXhlZCBmcm9tIDEuLm1hcmtEZXB0aC4KKyAgICAgICAgICogIEEgbnVsbCBpcyBrZXB0IEAgaW5kZXggMC4gIENyZWF0ZSB1cG9uIGZpcnN0IGNhbGwgdG8gbWFyaygpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIElMaXN0PENoYXJTdHJlYW1TdGF0ZT4gbWFya2VyczsKKworICAgICAgICAvKiogPHN1bW1hcnk+VHJhY2sgdGhlIGxhc3QgbWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gcmV3aW5kKCkuPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGxhc3RNYXJrZXI7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgaXMgbmFtZSBvciBzb3VyY2Ugb2YgdGhpcyBjaGFyIHN0cmVhbT88L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBzdHJpbmcgbmFtZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+Q29weSBkYXRhIGluIHN0cmluZyB0byBhIGxvY2FsIGNoYXIgYXJyYXk8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBBTlRMUlN0cmluZ1N0cmVhbShzdHJpbmcgaW5wdXQpCisgICAgICAgICAgICA6IHRoaXMoaW5wdXQsIG51bGwpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUlN0cmluZ1N0cmVhbShzdHJpbmcgaW5wdXQsIHN0cmluZyBzb3VyY2VOYW1lKQorICAgICAgICAgICAgOiB0aGlzKGlucHV0LlRvQ2hhckFycmF5KCksIGlucHV0Lkxlbmd0aCwgc291cmNlTmFtZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoaXMgaXMgdGhlIHByZWZlcnJlZCBjb25zdHJ1Y3RvciBhcyBubyBkYXRhIGlzIGNvcGllZDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIEFOVExSU3RyaW5nU3RyZWFtKGNoYXJbXSBkYXRhLCBpbnQgbnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXkpCisgICAgICAgICAgICA6IHRoaXMoZGF0YSwgbnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXksIG51bGwpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUlN0cmluZ1N0cmVhbShjaGFyW10gZGF0YSwgaW50IG51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5LCBzdHJpbmcgc291cmNlTmFtZSkgeworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJkYXRhIik7CisgICAgICAgICAgICBpZiAobnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChudW1iZXJPZkFjdHVhbENoYXJzSW5BcnJheSA+IGRhdGEuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICAgICAgdGhpcy5uID0gbnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXk7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBzb3VyY2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEFOVExSU3RyaW5nU3RyZWFtKCkgeworICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IGNoYXJbMF07CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGluZGV4IDAuLm4gd2hlcmUgbiBpbmRpY2F0ZXMgdGhlCisgICAgICAgICAqICBsYXN0IHN5bWJvbCBoYXMgYmVlbiByZWFkLiAgVGhlIGluZGV4IGlzIHRoZSBpbmRleCBvZiBjaGFyIHRvCisgICAgICAgICAqICBiZSByZXR1cm5lZCBmcm9tIExBKDEpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExpbmUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbGluZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBDaGFyUG9zaXRpb25JbkxpbmUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBpdCdzIGluIHRoZSBzYW1lIHN0YXRlIGl0IHdhcworICAgICAgICAgKiAgd2hlbiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkICpleGNlcHQqIHRoZSBkYXRhIGFycmF5IGlzIG5vdAorICAgICAgICAgKiAgdG91Y2hlZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVzZXQoKSB7CisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgIGxpbmUgPSAxOworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKyAgICAgICAgICAgIG1hcmtEZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWUoKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicHJldiBwPSIrcCsiLCBjPSIrKGNoYXIpZGF0YVtwXSk7CisgICAgICAgICAgICBpZiAocCA8IG4pIHsKKyAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUrKzsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtwXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibmV3bGluZSBjaGFyIGZvdW5kIG9uIGxpbmU6ICIrbGluZSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAIHBvcz0iK2NoYXJQb3NpdGlvbkluTGluZSk7CisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxpbmUrKzsKKyAgICAgICAgICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJwIG1vdmVzIHRvICIrcCsiIChjPSciKyhjaGFyKWRhdGFbcF0rIicpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTEEoaW50IGkpIHsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gdW5kZWZpbmVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgICAgICBpKys7IC8vIGUuZy4sIHRyYW5zbGF0ZSBMQSgtMSkgdG8gdXNlIG9mZnNldCBpPTA7IHRoZW4gZGF0YVtwKzAtMV0KKyAgICAgICAgICAgICAgICBpZiAoKHAgKyBpIC0gMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZTsgLy8gaW52YWxpZDsgbm8gY2hhciBiZWZvcmUgZmlyc3QgY2hhcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChwICsgaSAtIDEpID49IG4pIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2hhciBMQSgiK2krIik9RU9GOyBwPSIrcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNoYXIgTEEoIitpKyIpPSIrKGNoYXIpZGF0YVtwK2ktMV0rIjsgcD0iK3ApOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxBKCIraSsiKTsgcD0iK3ArIiBuPSIrbisiIGRhdGEubGVuZ3RoPSIrZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGRhdGFbcCArIGkgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBMVChpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIExBKGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTWFyaygpIHsKKyAgICAgICAgICAgIGlmIChtYXJrZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYXJrZXJzID0gbmV3IExpc3Q8Q2hhclN0cmVhbVN0YXRlPigpOworICAgICAgICAgICAgICAgIG1hcmtlcnMuQWRkKG51bGwpOyAvLyBkZXB0aCAwIG1lYW5zIG5vIGJhY2t0cmFja2luZywgbGVhdmUgYmxhbmsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcmtEZXB0aCsrOworICAgICAgICAgICAgQ2hhclN0cmVhbVN0YXRlIHN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtYXJrRGVwdGggPj0gbWFya2Vycy5Db3VudCkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gbmV3IENoYXJTdHJlYW1TdGF0ZSgpOworICAgICAgICAgICAgICAgIG1hcmtlcnMuQWRkKHN0YXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBtYXJrZXJzW21hcmtEZXB0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5wID0gcDsKKyAgICAgICAgICAgIHN0YXRlLmxpbmUgPSBsaW5lOworICAgICAgICAgICAgc3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lID0gY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgbGFzdE1hcmtlciA9IG1hcmtEZXB0aDsKKyAgICAgICAgICAgIHJldHVybiBtYXJrRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZChpbnQgbSkgeworICAgICAgICAgICAgaWYgKG0gPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgLy9pZiAobSA+IG1hcmtEZXB0aCkKKyAgICAgICAgICAgIC8vICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBDaGFyU3RyZWFtU3RhdGUgc3RhdGUgPSBtYXJrZXJzW21dOworICAgICAgICAgICAgLy8gcmVzdG9yZSBzdHJlYW0gc3RhdGUKKyAgICAgICAgICAgIFNlZWsoc3RhdGUucCk7CisgICAgICAgICAgICBsaW5lID0gc3RhdGUubGluZTsKKyAgICAgICAgICAgIGNoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLmNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgIFJlbGVhc2UobSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCgpIHsKKyAgICAgICAgICAgIFJld2luZChsYXN0TWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZShpbnQgbWFya2VyKSB7CisgICAgICAgICAgICAvLyB1bndpbmQgYW55IG90aGVyIG1hcmtlcnMgbWFkZSBhZnRlciBtIGFuZCByZWxlYXNlIG0KKyAgICAgICAgICAgIG1hcmtEZXB0aCA9IG1hcmtlcjsKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhpcyBtYXJrZXIKKyAgICAgICAgICAgIG1hcmtEZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgY29uc3VtZSgpIGFoZWFkIHVudGlsIHA9PWluZGV4OyBjYW4ndCBqdXN0IHNldCBwPWluZGV4IGFzIHdlIG11c3QKKyAgICAgICAgICogIHVwZGF0ZSBsaW5lIGFuZCBjaGFyUG9zaXRpb25JbkxpbmUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNlZWsoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPD0gcCkgeworICAgICAgICAgICAgICAgIHAgPSBpbmRleDsgLy8ganVzdCBqdW1wOyBkb24ndCB1cGRhdGUgc3RyZWFtIHN0YXRlIChsaW5lLCAuLi4pCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2VlayBmb3J3YXJkLCBjb25zdW1lIHVudGlsIHAgaGl0cyBpbmRleAorICAgICAgICAgICAgd2hpbGUgKHAgPCBpbmRleCkgeworICAgICAgICAgICAgICAgIENvbnN1bWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTdWJzdHJpbmcoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IGRhdGEuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmcoZGF0YSwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nKGRhdGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQmFzZVJlY29nbml6ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9CYXNlUmVjb2duaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDcxYzIzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQmFzZVJlY29nbml6ZXIuY3MKQEAgLTAsMCArMSwxMDQ2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisgICAgdXNpbmcgQXJyYXkgPSBTeXN0ZW0uQXJyYXk7CisgICAgdXNpbmcgQ29uZGl0aW9uYWwgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGU7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBJRGVidWdFdmVudExpc3RlbmVyID0gQW50bHIuUnVudGltZS5EZWJ1Zy5JRGVidWdFdmVudExpc3RlbmVyOworICAgIHVzaW5nIE1ldGhvZEJhc2UgPSBTeXN0ZW0uUmVmbGVjdGlvbi5NZXRob2RCYXNlOworICAgIHVzaW5nIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiA9IFN5c3RlbS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CisgICAgdXNpbmcgUmVnZXggPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXg7CisgICAgdXNpbmcgU3RhY2tGcmFtZSA9IFN5c3RlbS5EaWFnbm9zdGljcy5TdGFja0ZyYW1lOworICAgIHVzaW5nIFN0YWNrVHJhY2UgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuU3RhY2tUcmFjZTsKKyAgICB1c2luZyBUZXh0V3JpdGVyID0gU3lzdGVtLklPLlRleHRXcml0ZXI7CisgICAgdXNpbmcgVHlwZSA9IFN5c3RlbS5UeXBlOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGdlbmVyaWMgcmVjb2duaXplciB0aGF0IGNhbiBoYW5kbGUgcmVjb2duaXplcnMgZ2VuZXJhdGVkIGZyb20KKyAgICAgKiAgbGV4ZXIsIHBhcnNlciwgYW5kIHRyZWUgZ3JhbW1hcnMuICBUaGlzIGlzIGFsbCB0aGUgcGFyc2luZworICAgICAqICBzdXBwb3J0IGNvZGUgZXNzZW50aWFsbHk7IG1vc3Qgb2YgaXQgaXMgZXJyb3IgcmVjb3Zlcnkgc3R1ZmYgYW5kCisgICAgICogIGJhY2t0cmFja2luZy4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUmVjb2duaXplciB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWVtb1J1bGVGYWlsZWQgPSAtMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBNZW1vUnVsZVVua25vd24gPSAtMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJbml0aWFsRm9sbG93U3RhY2tTaXplID0gMTAwOworCisgICAgICAgIC8vIGNvcGllcyBmcm9tIFRva2VuIG9iamVjdCBmb3IgY29udmVuaWVuY2UgaW4gYWN0aW9ucworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRUb2tlbkNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSGlkZGVuID0gVG9rZW5DaGFubmVscy5IaWRkZW47CisKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOZXh0VG9rZW5SdWxlTmFtZSA9ICJuZXh0VG9rZW4iOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFN0YXRlIG9mIGEgbGV4ZXIsIHBhcnNlciwgb3IgdHJlZSBwYXJzZXIgYXJlIGNvbGxlY3RlZCBpbnRvIGEgc3RhdGUKKyAgICAgICAgICogIG9iamVjdCBzbyB0aGUgc3RhdGUgY2FuIGJlIHNoYXJlZC4gIFRoaXMgc2hhcmluZyBpcyBuZWVkZWQgdG8KKyAgICAgICAgICogIGhhdmUgb25lIGdyYW1tYXIgaW1wb3J0IG90aGVycyBhbmQgc2hhcmUgc2FtZSBlcnJvciB2YXJpYWJsZXMKKyAgICAgICAgICogIGFuZCBvdGhlciBzdGF0ZSB2YXJpYWJsZXMuICBJdCdzIGEga2luZCBvZiBleHBsaWNpdCBtdWx0aXBsZQorICAgICAgICAgKiAgaW5oZXJpdGFuY2UgdmlhIGRlbGVnYXRpb24gb2YgbWV0aG9kcyBhbmQgc2hhcmVkIHN0YXRlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZTsKKworICAgICAgICBwdWJsaWMgQmFzZVJlY29nbml6ZXIoKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VSZWNvZ25pemVyKFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIEluaXRERkFzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGV4dFdyaXRlciBUcmFjZURlc3RpbmF0aW9uIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgSW5pdERGQXMoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+cmVzZXQgdGhlIHBhcnNlcidzIHN0YXRlOyBzdWJjbGFzc2VzIG11c3QgcmV3aW5kcyB0aGUgaW5wdXQgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlc2V0KCkgeworICAgICAgICAgICAgLy8gd2FjayBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzaGFyZWQgc3RhdGUgd29yayB0byBkbworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUuX2ZzcCA9IC0xOworICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworICAgICAgICAgICAgc3RhdGUubGFzdEVycm9ySW5kZXggPSAtMTsKKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdGUuc3ludGF4RXJyb3JzID0gMDsKKyAgICAgICAgICAgIC8vIHdhY2sgZXZlcnl0aGluZyByZWxhdGVkIHRvIGJhY2t0cmFja2luZyBhbmQgbWVtb2l6YXRpb24KKyAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgc3RhdGUucnVsZU1lbW8gIT0gbnVsbCAmJiBpIDwgc3RhdGUucnVsZU1lbW8uTGVuZ3RoOyBpKyspIHsgLy8gd2lwZSBjYWNoZQorICAgICAgICAgICAgICAgIHN0YXRlLnJ1bGVNZW1vW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWF0Y2ggY3VycmVudCBpbnB1dCBzeW1ib2wgYWdhaW5zdCB0dHlwZS4gIEF0dGVtcHQKKyAgICAgICAgICogIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IgcmVjb3ZlcnkuICBJZgorICAgICAgICAgKiAgdGhhdCBmYWlscywgdGhyb3cgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUbyB0dXJuIG9mZiBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIGVycm9yCisgICAgICAgICAqICByZWNvdmVyeSwgb3ZlcnJpZGUgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oKSBhbmQgaGF2ZSBpdAorICAgICAgICAgKiAgdGhyb3cgYW4gZXhjZXB0aW9uLiBTZWUgVHJlZVBhcnNlci5yZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbigpLgorICAgICAgICAgKiAgVGhpcyB3YXkgYW55IGVycm9yIGluIGEgcnVsZSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBhbmQKKyAgICAgICAgICogIGltbWVkaWF0ZSBleGl0IGZyb20gcnVsZS4gIFJ1bGUgd291bGQgcmVjb3ZlciBieSByZXN5bmNocm9uaXppbmcKKyAgICAgICAgICogIHRvIHRoZSBzZXQgb2Ygc3ltYm9scyB0aGF0IGNhbiBmb2xsb3cgcnVsZSByZWYuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTWF0Y2goSUludFN0cmVhbSBpbnB1dCwgaW50IHR0eXBlLCBCaXRTZXQgZm9sbG93KSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibWF0Y2ggIisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgxKSk7CisgICAgICAgICAgICBvYmplY3QgbWF0Y2hlZFN5bWJvbCA9IEdldEN1cnJlbnRJbnB1dFN5bWJvbChpbnB1dCk7CisgICAgICAgICAgICBpZiAoaW5wdXQuTEEoMSkgPT0gdHR5cGUpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlZFN5bWJvbCA9IFJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKGlucHV0LCB0dHlwZSwgZm9sbG93KTsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk1hdGNoIHRoZSB3aWxkY2FyZDogaW4gYSBzeW1ib2w8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWF0Y2hBbnkoSUludFN0cmVhbSBpbnB1dCkgeworICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIE1pc21hdGNoSXNVbndhbnRlZFRva2VuKElJbnRTdHJlYW0gaW5wdXQsIGludCB0dHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LkxBKDIpID09IHR0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBNaXNtYXRjaElzTWlzc2luZ1Rva2VuKElJbnRTdHJlYW0gaW5wdXQsIEJpdFNldCBmb2xsb3cpIHsKKyAgICAgICAgICAgIGlmIChmb2xsb3cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvbGxvdzsgd2UgY2FuIG9ubHkgY29uc3VtZQorICAgICAgICAgICAgICAgIC8vIGEgc2luZ2xlIHRva2VuIGFuZCBob3BlIGZvciB0aGUgYmVzdAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNvbXB1dGUgd2hhdCBjYW4gZm9sbG93IHRoaXMgZ3JhbW1hciBlbGVtZW50IHJlZmVyZW5jZQorICAgICAgICAgICAgaWYgKGZvbGxvdy5NZW1iZXIoVG9rZW5UeXBlcy5FbmRPZlJ1bGUpKSB7CisgICAgICAgICAgICAgICAgQml0U2V0IHZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlID0gQ29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKCk7CisgICAgICAgICAgICAgICAgZm9sbG93ID0gZm9sbG93Lk9yKHZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuX2ZzcCA+PSAwKSB7IC8vIHJlbW92ZSBFT1IgaWYgd2UncmUgbm90IHRoZSBzdGFydCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93LlJlbW92ZShUb2tlblR5cGVzLkVuZE9mUnVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgY3VycmVudCB0b2tlbiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBjb3VsZCBjb21lIGFmdGVyIHNldAorICAgICAgICAgICAgLy8gdGhlbiB3ZSBrbm93IHdlJ3JlIG1pc3NpbmcgYSB0b2tlbjsgZXJyb3IgcmVjb3ZlcnkgaXMgZnJlZSB0bworICAgICAgICAgICAgLy8gImluc2VydCIgdGhlIG1pc3NpbmcgdG9rZW4KKworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInZpYWJsZSB0b2tlbnM9Iitmb2xsb3cudG9TdHJpbmcoZ2V0VG9rZW5OYW1lcygpKSk7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiTFQoMSk9IisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgxKSk7CisKKyAgICAgICAgICAgIC8vIEJpdFNldCBjYW5ub3QgaGFuZGxlIG5lZ2F0aXZlIG51bWJlcnMgbGlrZSAtMSAoRU9GKSBzbyBJIGxlYXZlIEVPUgorICAgICAgICAgICAgLy8gaW4gZm9sbG93IHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmYWxsIG9mIHRoZSBzdGFydCBzeW1ib2wgaXMKKyAgICAgICAgICAgIC8vIGluIHRoZSBzZXQgKEVPRiBjYW4gZm9sbG93KS4KKyAgICAgICAgICAgIGlmIChmb2xsb3cuTWVtYmVyKGlucHV0LkxBKDEpKSB8fCBmb2xsb3cuTWVtYmVyKFRva2VuVHlwZXMuRW5kT2ZSdWxlKSkgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJMVCgxKT09IisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgxKSsiIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGZvbGxvd3M7IGluc2VydGluZy4uLiIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJlcG9ydCBhIHJlY29nbml0aW9uIHByb2JsZW0uPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIG1ldGhvZCBzZXRzIGVycm9yUmVjb3ZlcnkgdG8gaW5kaWNhdGUgdGhlIHBhcnNlciBpcyByZWNvdmVyaW5nCisgICAgICAgICAqICBub3QgcGFyc2luZy4gIE9uY2UgaW4gcmVjb3ZlcnkgbW9kZSwgbm8gZXJyb3JzIGFyZSBnZW5lcmF0ZWQuCisgICAgICAgICAqICBUbyBnZXQgb3V0IG9mIHJlY292ZXJ5IG1vZGUsIHRoZSBwYXJzZXIgbXVzdCBzdWNjZXNzZnVsbHkgbWF0Y2gKKyAgICAgICAgICogIGEgdG9rZW4gKGFmdGVyIGEgcmVzeW5jKS4gIFNvIGl0IHdpbGwgZ286CisgICAgICAgICAqCisgICAgICAgICAqIAkJMS4gZXJyb3Igb2NjdXJzCisgICAgICAgICAqIAkJMi4gZW50ZXIgcmVjb3ZlcnkgbW9kZSwgcmVwb3J0IGVycm9yCisgICAgICAgICAqIAkJMy4gY29uc3VtZSB1bnRpbCB0b2tlbiBmb3VuZCBpbiByZXN5bmNoIHNldAorICAgICAgICAgKiAJCTQuIHRyeSB0byByZXN1bWUgcGFyc2luZworICAgICAgICAgKiAJCTUuIG5leHQgbWF0Y2goKSB3aWxsIHJlc2V0IGVycm9yUmVjb3ZlcnkgbW9kZQorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgeW91IG92ZXJyaWRlLCBtYWtlIHN1cmUgdG8gdXBkYXRlIHN5bnRheEVycm9ycyBpZiB5b3UgY2FyZSBhYm91dCB0aGF0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yIGFuZCBoYXZlIG5vdCBtYXRjaGVkIGEgdG9rZW4KKyAgICAgICAgICAgIC8vIHlldCBzdWNjZXNzZnVsbHksIGRvbid0IHJlcG9ydCBhbnkgZXJyb3JzLgorICAgICAgICAgICAgaWYgKHN0YXRlLmVycm9yUmVjb3ZlcnkpIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnQoIltTUFVSSU9VU10gIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUuc3ludGF4RXJyb3JzKys7IC8vIGRvbid0IGNvdW50IHNwdXJpb3VzCisgICAgICAgICAgICBzdGF0ZS5lcnJvclJlY292ZXJ5ID0gdHJ1ZTsKKworICAgICAgICAgICAgRGlzcGxheVJlY29nbml0aW9uRXJyb3IodGhpcy5Ub2tlbk5hbWVzLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRGlzcGxheVJlY29nbml0aW9uRXJyb3Ioc3RyaW5nW10gdG9rZW5OYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc3RyaW5nIGhkciA9IEdldEVycm9ySGVhZGVyKGUpOworICAgICAgICAgICAgc3RyaW5nIG1zZyA9IEdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKKyAgICAgICAgICAgIEVtaXRFcnJvck1lc3NhZ2UoaGRyICsgIiAiICsgbXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIHZhcmlvdXMgZXhjZXB0aW9uIHR5cGVzPzwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgTm90IHZlcnkgb2JqZWN0LW9yaWVudGVkIGNvZGUsIGJ1dCBJIGxpa2UgaGF2aW5nIGFsbCBlcnJvciBtZXNzYWdlCisgICAgICAgICAqICBnZW5lcmF0aW9uIHdpdGhpbiBvbmUgbWV0aG9kIHJhdGhlciB0aGFuIHNwcmVhZCBhbW9uZyBhbGwgb2YgdGhlCisgICAgICAgICAqICBleGNlcHRpb24gY2xhc3Nlcy4gVGhpcyBhbHNvIG1ha2VzIGl0IG11Y2ggZWFzaWVyIGZvciB0aGUgZXhjZXB0aW9uCisgICAgICAgICAqICBoYW5kbGluZyBiZWNhdXNlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBkbyBub3QgaGF2ZSB0byBoYXZlIHBvaW50ZXJzIGJhY2sKKyAgICAgICAgICogIHRvIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyB1dGlsaXR5IHJvdXRpbmVzIGFuZCBzbyBvbi4gQWxzbywgY2hhbmdpbmcKKyAgICAgICAgICogIHRoZSBtZXNzYWdlIGZvciBhbiBleGNlcHRpb24gdHlwZSB3b3VsZCBiZSBkaWZmaWN1bHQgYmVjYXVzZSB5b3UKKyAgICAgICAgICogIHdvdWxkIGhhdmUgdG8gc3ViY2xhc3NpbmcgZXhjZXB0aW9uLCBidXQgdGhlbiBzb21laG93IGdldCBBTlRMUgorICAgICAgICAgKiAgdG8gbWFrZSB0aG9zZSBraW5kcyBvZiBleGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LgorICAgICAgICAgKiAgVGhpcyBsb29rcyB3ZWlyZCwgYnV0IHRydXN0IG1lLS1pdCBtYWtlcyB0aGUgbW9zdCBzZW5zZSBpbiB0ZXJtcworICAgICAgICAgKiAgb2YgZmxleGliaWxpdHkuCisgICAgICAgICAqCisgICAgICAgICAqICBGb3IgZ3JhbW1hciBkZWJ1Z2dpbmcsIHlvdSB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyB0byBhZGQKKyAgICAgICAgICogIG1vcmUgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhY2sgZnJhbWUgd2l0aAorICAgICAgICAgKiAgZ2V0UnVsZUludm9jYXRpb25TdGFjayhlLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKSBhbmQsCisgICAgICAgICAqICBmb3Igbm8gdmlhYmxlIGFsdHMsIHRoZSBkZWNpc2lvbiBkZXNjcmlwdGlvbiBhbmQgc3RhdGUgZXRjLi4uCisgICAgICAgICAqCisgICAgICAgICAqICBPdmVycmlkZSB0aGlzIHRvIGNoYW5nZSB0aGUgbWVzc2FnZSBnZW5lcmF0ZWQgZm9yIG9uZSBvciBtb3JlCisgICAgICAgICAqICBleGNlcHRpb24gdHlwZXMuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgR2V0RXJyb3JNZXNzYWdlKFJlY29nbml0aW9uRXhjZXB0aW9uIGUsIHN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKyAgICAgICAgICAgIHN0cmluZyBtc2cgPSBlLk1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZSBpcyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiB1dGUgPSAoVW53YW50ZWRUb2tlbkV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIHN0cmluZyB0b2tlbk5hbWUgPSAiPHVua25vd24+IjsKKyAgICAgICAgICAgICAgICBpZiAodXRlLkV4cGVjdGluZyA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSkgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRW5kT2ZGaWxlIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSB0b2tlbk5hbWVzW3V0ZS5FeHBlY3RpbmddOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2cgPSAiZXh0cmFuZW91cyBpbnB1dCAiICsgR2V0VG9rZW5FcnJvckRpc3BsYXkodXRlLlVuZXhwZWN0ZWRUb2tlbikgKworICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGluZyAiICsgdG9rZW5OYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbiBtdGUgPSAoTWlzc2luZ1Rva2VuRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRva2VuTmFtZSA9ICI8dW5rbm93bj4iOworICAgICAgICAgICAgICAgIGlmIChtdGUuRXhwZWN0aW5nID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9ICJFbmRPZkZpbGUiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9IHRva2VuTmFtZXNbbXRlLkV4cGVjdGluZ107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1zZyA9ICJtaXNzaW5nICIgKyB0b2tlbk5hbWUgKyAiIGF0ICIgKyBHZXRUb2tlbkVycm9yRGlzcGxheShlLlRva2VuKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbXRlID0gKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIHN0cmluZyB0b2tlbk5hbWUgPSAiPHVua25vd24+IjsKKyAgICAgICAgICAgICAgICBpZiAobXRlLkV4cGVjdGluZyA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSkgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRW5kT2ZGaWxlIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSB0b2tlbk5hbWVzW210ZS5FeHBlY3RpbmddOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBpbnB1dCAiICsgR2V0VG9rZW5FcnJvckRpc3BsYXkoZS5Ub2tlbikgKworICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGluZyAiICsgdG9rZW5OYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiBtdG5lID0gKE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIHN0cmluZyB0b2tlbk5hbWUgPSAiPHVua25vd24+IjsKKyAgICAgICAgICAgICAgICBpZiAobXRuZS5FeHBlY3RpbmcgPT0gVG9rZW5UeXBlcy5FbmRPZkZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gIkVuZE9mRmlsZSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gdG9rZW5OYW1lc1ttdG5lLkV4cGVjdGluZ107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGEgLk5FVCBmcmFtZXdvcmsgYnVnIChOdWxsUmVmZXJlbmNlRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHN0cmluZyBub2RlVGV4dCA9IChtdG5lLk5vZGUgIT0gbnVsbCkgPyBtdG5lLk5vZGUuVG9TdHJpbmcoKSA/PyBzdHJpbmcuRW1wdHkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgdHJlZSBub2RlOiAiICsgbm9kZVRleHQgKyAiIGV4cGVjdGluZyAiICsgdG9rZW5OYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIE5vVmlhYmxlQWx0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgLy9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gKE5vVmlhYmxlQWx0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICJkZWNpc2lvbj08PCIrbnZhZS5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbisiPj4iCisgICAgICAgICAgICAgICAgLy8gYW5kICIoZGVjaXNpb249IitudmFlLmRlY2lzaW9uTnVtYmVyKyIpIGFuZAorICAgICAgICAgICAgICAgIC8vICJzdGF0ZSAiK252YWUuc3RhdGVOdW1iZXIKKyAgICAgICAgICAgICAgICBtc2cgPSAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICIgKyBHZXRUb2tlbkVycm9yRGlzcGxheShlLlRva2VuKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpcyBFYXJseUV4aXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAvL0Vhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPSAoRWFybHlFeGl0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICIoZGVjaXNpb249IitlZWUuZGVjaXNpb25OdW1iZXIrIikiCisgICAgICAgICAgICAgICAgbXNnID0gInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgaW5wdXQgIiArCisgICAgICAgICAgICAgICAgICAgIEdldFRva2VuRXJyb3JEaXNwbGF5KGUuVG9rZW4pOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIE1pc21hdGNoZWRTZXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IChNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgaW5wdXQgIiArIEdldFRva2VuRXJyb3JEaXNwbGF5KGUuVG9rZW4pICsKKyAgICAgICAgICAgICAgICAgICAgIiBleHBlY3Rpbmcgc2V0ICIgKyBtc2UuRXhwZWN0aW5nOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIG1zZSA9IChNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgaW5wdXQgIiArIEdldFRva2VuRXJyb3JEaXNwbGF5KGUuVG9rZW4pICsKKyAgICAgICAgICAgICAgICAgICAgIiBleHBlY3Rpbmcgc2V0ICIgKyBtc2UuRXhwZWN0aW5nOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiBmcGUgPSAoRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gInJ1bGUgIiArIGZwZS5SdWxlTmFtZSArICIgZmFpbGVkIHByZWRpY2F0ZTogeyIgKworICAgICAgICAgICAgICAgICAgICBmcGUuUHJlZGljYXRlVGV4dCArICJ9PyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IG51bWJlciBvZiByZWNvZ25pdGlvbiBlcnJvcnMgKGxleGVyLCBwYXJzZXIsIHRyZWUgcGFyc2VyKS4gIEVhY2gKKyAgICAgICAgICogIHJlY29nbml6ZXIgdHJhY2tzIGl0cyBvd24gbnVtYmVyLiAgU28gcGFyc2VyIGFuZCBsZXhlciBlYWNoIGhhdmUKKyAgICAgICAgICogIHNlcGFyYXRlIGNvdW50LiAgRG9lcyBub3QgY291bnQgdGhlIHNwdXJpb3VzIGVycm9ycyBmb3VuZCBiZXR3ZWVuCisgICAgICAgICAqICBhbiBlcnJvciBhbmQgbmV4dCB2YWxpZCB0b2tlbiBtYXRjaAorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHNlZWFsc28gY3JlZj0icmVwb3J0RXJyb3IoKSIvPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE51bWJlck9mU3ludGF4RXJyb3JzIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN5bnRheEVycm9yczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGlzIHRoZSBlcnJvciBoZWFkZXIsIG5vcm1hbGx5IGxpbmUvY2hhcmFjdGVyIHBvc2l0aW9uIGluZm9ybWF0aW9uPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEdldEVycm9ySGVhZGVyKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAibGluZSAiICsgZS5MaW5lICsgIjoiICsgKGUuQ2hhclBvc2l0aW9uSW5MaW5lICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBIb3cgc2hvdWxkIGEgdG9rZW4gYmUgZGlzcGxheWVkIGluIGFuIGVycm9yIG1lc3NhZ2U/IFRoZSBkZWZhdWx0CisgICAgICAgICAqICBpcyB0byBkaXNwbGF5IGp1c3QgdGhlIHRleHQsIGJ1dCBkdXJpbmcgZGV2ZWxvcG1lbnQgeW91IG1pZ2h0CisgICAgICAgICAqICB3YW50IHRvIGhhdmUgYSBsb3Qgb2YgaW5mb3JtYXRpb24gc3BpdCBvdXQuICBPdmVycmlkZSBpbiB0aGF0IGNhc2UKKyAgICAgICAgICogIHRvIHVzZSB0LlRvU3RyaW5nKCkgKHdoaWNoLCBmb3IgQ29tbW9uVG9rZW4sIGR1bXBzIGV2ZXJ5dGhpbmcgYWJvdXQKKyAgICAgICAgICogIHRoZSB0b2tlbikuIFRoaXMgaXMgYmV0dGVyIHRoYW4gZm9yY2luZyB5b3UgdG8gb3ZlcnJpZGUgYSBtZXRob2QgaW4KKyAgICAgICAgICogIHlvdXIgdG9rZW4gb2JqZWN0cyBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIHRvIGdvIG1vZGlmeSB5b3VyIGxleGVyCisgICAgICAgICAqICBzbyB0aGF0IGl0IGNyZWF0ZXMgYSBuZXcgSmF2YSB0eXBlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEdldFRva2VuRXJyb3JEaXNwbGF5KElUb2tlbiB0KSB7CisgICAgICAgICAgICBzdHJpbmcgcyA9IHQuVGV4dDsKKyAgICAgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodC5UeXBlID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSAiPEVPRj4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSAiPCIgKyB0LlR5cGUgKyAiPiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IFJlZ2V4LlJlcGxhY2UocywgIlxuIiwgIlxcXFxuIik7CisgICAgICAgICAgICBzID0gUmVnZXguUmVwbGFjZShzLCAiXHIiLCAiXFxcXHIiKTsKKyAgICAgICAgICAgIHMgPSBSZWdleC5SZXBsYWNlKHMsICJcdCIsICJcXFxcdCIpOworICAgICAgICAgICAgcmV0dXJuICInIiArIHMgKyAiJyI7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+T3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHdoZXJlIGVycm9yIG1lc3NhZ2VzIGdvPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVtaXRFcnJvck1lc3NhZ2Uoc3RyaW5nIG1zZykgeworICAgICAgICAgICAgaWYgKFRyYWNlRGVzdGluYXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlTGluZShtc2cpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVjb3ZlciBmcm9tIGFuIGVycm9yIGZvdW5kIG9uIHRoZSBpbnB1dCBzdHJlYW0uICBUaGlzIGlzCisgICAgICAgICAqICBmb3IgTm9WaWFibGVBbHQgYW5kIG1pc21hdGNoZWQgc3ltYm9sIGV4Y2VwdGlvbnMuICBJZiB5b3UgZW5hYmxlCisgICAgICAgICAqICBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiwgdGhpcyB3aWxsIHVzdWFsbHkgbm90CisgICAgICAgICAqICBoYW5kbGUgbWlzbWF0Y2hlZCBzeW1ib2wgZXhjZXB0aW9ucyBidXQgdGhlcmUgY291bGQgYmUgYSBtaXNtYXRjaGVkCisgICAgICAgICAqICB0b2tlbiB0aGF0IHRoZSBtYXRjaCgpIHJvdXRpbmUgY291bGQgbm90IHJlY292ZXIgZnJvbS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVjb3ZlcihJSW50U3RyZWFtIGlucHV0LCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmxhc3RFcnJvckluZGV4ID09IGlucHV0LkluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gdWggb2gsIGFub3RoZXIgZXJyb3IgYXQgc2FtZSB0b2tlbiBpbmRleDsgbXVzdCBiZSBhIGNhc2UKKyAgICAgICAgICAgICAgICAvLyB3aGVyZSBMVCgxKSBpcyBpbiB0aGUgcmVjb3ZlcnkgdG9rZW4gc2V0IHNvIG5vdGhpbmcgaXMKKyAgICAgICAgICAgICAgICAvLyBjb25zdW1lZDsgY29uc3VtZSBhIHNpbmdsZSB0b2tlbiBzbyBhdCBsZWFzdCB0byBwcmV2ZW50CisgICAgICAgICAgICAgICAgLy8gYW4gaW5maW5pdGUgbG9vcDsgdGhpcyBpcyBhIGZhaWxzYWZlLgorICAgICAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLmxhc3RFcnJvckluZGV4ID0gaW5wdXQuSW5kZXg7CisgICAgICAgICAgICBCaXRTZXQgZm9sbG93U2V0ID0gQ29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQoKTsKKyAgICAgICAgICAgIEJlZ2luUmVzeW5jKCk7CisgICAgICAgICAgICBDb25zdW1lVW50aWwoaW5wdXQsIGZvbGxvd1NldCk7CisgICAgICAgICAgICBFbmRSZXN5bmMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEEgaG9vayB0byBsaXN0ZW4gaW4gb24gdGhlIHRva2VuIGNvbnN1bXB0aW9uIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAgICAgICAgICogIFRoZSBEZWJ1Z1BhcnNlciBzdWJjbGFzc2VzIHRoaXMgdG8gZmlyZSBldmVudHMgdG8gdGhlIGxpc3RlbnRlci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5SZXN5bmMoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVuZFJlc3luYygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qICBDb21wdXRlIHRoZSBlcnJvciByZWNvdmVyeSBzZXQgZm9yIHRoZSBjdXJyZW50IHJ1bGUuICBEdXJpbmcKKyAgICAgICAgICogIHJ1bGUgaW52b2NhdGlvbiwgdGhlIHBhcnNlciBwdXNoZXMgdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4KKyAgICAgICAgICogIGZvbGxvdyB0aGF0IHJ1bGUgcmVmZXJlbmNlIG9uIHRoZSBzdGFjazsgdGhpcyBhbW91bnRzIHRvCisgICAgICAgICAqICBjb21wdXRpbmcgRklSU1Qgb2Ygd2hhdCBmb2xsb3dzIHRoZSBydWxlIHJlZmVyZW5jZSBpbiB0aGUKKyAgICAgICAgICogIGVuY2xvc2luZyBydWxlLiBUaGlzIGxvY2FsIGZvbGxvdyBzZXQgb25seSBpbmNsdWRlcyB0b2tlbnMKKyAgICAgICAgICogIGZyb20gd2l0aGluIHRoZSBydWxlOyBpLmUuLCB0aGUgRklSU1QgY29tcHV0YXRpb24gZG9uZSBieQorICAgICAgICAgKiAgQU5UTFIgc3RvcHMgYXQgdGhlIGVuZCBvZiBhIHJ1bGUuCisgICAgICAgICAqCisgICAgICAgICAqICBFWEFNUExFCisgICAgICAgICAqCisgICAgICAgICAqICBXaGVuIHlvdSBmaW5kIGEgIm5vIHZpYWJsZSBhbHQgZXhjZXB0aW9uIiwgdGhlIGlucHV0IGlzIG5vdAorICAgICAgICAgKiAgY29uc2lzdGVudCB3aXRoIGFueSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGZvciBydWxlIHIuICBUaGUgYmVzdAorICAgICAgICAgKiAgdGhpbmcgdG8gZG8gaXMgdG8gY29uc3VtZSB0b2tlbnMgdW50aWwgeW91IHNlZSBzb21ldGhpbmcgdGhhdAorICAgICAgICAgKiAgY2FuIGxlZ2FsbHkgZm9sbG93IGEgY2FsbCB0byByICpvciogYW55IHJ1bGUgdGhhdCBjYWxsZWQgci4KKyAgICAgICAgICogIFlvdSBkb24ndCB3YW50IHRoZSBleGFjdCBzZXQgb2YgdmlhYmxlIG5leHQgdG9rZW5zIGJlY2F1c2UgdGhlCisgICAgICAgICAqICBpbnB1dCBtaWdodCBqdXN0IGJlIG1pc3NpbmcgYSB0b2tlbi0teW91IG1pZ2h0IGNvbnN1bWUgdGhlCisgICAgICAgICAqICByZXN0IG9mIHRoZSBpbnB1dCBsb29raW5nIGZvciBvbmUgb2YgdGhlIG1pc3NpbmcgdG9rZW5zLgorICAgICAgICAgKgorICAgICAgICAgKiAgQ29uc2lkZXIgZ3JhbW1hcjoKKyAgICAgICAgICoKKyAgICAgICAgICogIGEgOiAnWycgYiAnXScKKyAgICAgICAgICogICAgfCAnKCcgYiAnKScKKyAgICAgICAgICogICAgOworICAgICAgICAgKiAgYiA6IGMgJ14nIElOVCA7CisgICAgICAgICAqICBjIDogSUQKKyAgICAgICAgICogICAgfCBJTlQKKyAgICAgICAgICogICAgOworICAgICAgICAgKgorICAgICAgICAgKiAgQXQgZWFjaCBydWxlIGludm9jYXRpb24sIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY291bGQgZm9sbG93CisgICAgICAgICAqICB0aGF0IHJ1bGUgaXMgcHVzaGVkIG9uIGEgc3RhY2suICBIZXJlIGFyZSB0aGUgdmFyaW91cyAibG9jYWwiCisgICAgICAgICAqICBmb2xsb3cgc2V0czoKKyAgICAgICAgICoKKyAgICAgICAgICogIEZPTExPVyhiMV9pbl9hKSA9IEZJUlNUKCddJykgPSAnXScKKyAgICAgICAgICogIEZPTExPVyhiMl9pbl9hKSA9IEZJUlNUKCcpJykgPSAnKScKKyAgICAgICAgICogIEZPTExPVyhjX2luX2IpID0gRklSU1QoJ14nKSA9ICdeJworICAgICAgICAgKgorICAgICAgICAgKiAgVXBvbiBlcnJvbmVvdXMgaW5wdXQgIltdIiwgdGhlIGNhbGwgY2hhaW4gaXMKKyAgICAgICAgICoKKyAgICAgICAgICogIGEgLT4gYiAtPiBjCisgICAgICAgICAqCisgICAgICAgICAqICBhbmQsIGhlbmNlLCB0aGUgZm9sbG93IGNvbnRleHQgc3RhY2sgaXM6CisgICAgICAgICAqCisgICAgICAgICAqICBkZXB0aCAgbG9jYWwgZm9sbG93IHNldCAgICAgYWZ0ZXIgY2FsbCB0byBydWxlCisgICAgICAgICAqICAgIDAgICAgICAgICA8RU9GPiAgICAgICAgICAgICAgICAgICAgYSAoZnJvbSBtYWluKCkpCisgICAgICAgICAqICAgIDEgICAgICAgICAgJ10nICAgICAgICAgICAgICAgICAgICAgYgorICAgICAgICAgKiAgICAzICAgICAgICAgICdeJyAgICAgICAgICAgICAgICAgICAgIGMKKyAgICAgICAgICoKKyAgICAgICAgICogIE5vdGljZSB0aGF0ICcpJyBpcyBub3QgaW5jbHVkZWQsIGJlY2F1c2UgYiB3b3VsZCBoYXZlIHRvIGhhdmUKKyAgICAgICAgICogIGJlZW4gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCBpbiBydWxlIGEgZm9yICcpJyB0byBiZQorICAgICAgICAgKiAgaW5jbHVkZWQuCisgICAgICAgICAqCisgICAgICAgICAqICBGb3IgZXJyb3IgcmVjb3ZlcnksIHdlIGNhbm5vdCBjb25zaWRlciBGT0xMT1coYykKKyAgICAgICAgICogIChjb250ZXh0LXNlbnNpdGl2ZSBvciBvdGhlcndpc2UpLiAgV2UgbmVlZCB0aGUgY29tYmluZWQgc2V0IG9mCisgICAgICAgICAqICBhbGwgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldHMtLXRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0CisgICAgICAgICAqICBjb3VsZCBmb2xsb3cgYW55IHJlZmVyZW5jZSBpbiB0aGUgY2FsbCBjaGFpbi4gIFdlIG5lZWQgdG8KKyAgICAgICAgICogIHJlc3luYyB0byBvbmUgb2YgdGhvc2UgdG9rZW5zLiAgTm90ZSB0aGF0IEZPTExPVyhjKT0nXicgYW5kIGlmCisgICAgICAgICAqICB3ZSByZXN5bmMnZCB0byB0aGF0IHRva2VuLCB3ZSdkIGNvbnN1bWUgdW50aWwgRU9GLiAgV2UgbmVlZCB0bworICAgICAgICAgKiAgc3luYyB0byBjb250ZXh0LXNlbnNpdGl2ZSBGT0xMT1dzIGZvciBhLCBiLCBhbmQgYzogeyddJywnXid9LgorICAgICAgICAgKiAgSW4gdGhpcyBjYXNlLCBmb3IgaW5wdXQgIltdIiwgTEEoMSkgaXMgaW4gdGhpcyBzZXQgc28gd2Ugd291bGQKKyAgICAgICAgICogIG5vdCBjb25zdW1lIGFueXRoaW5nIGFuZCBhZnRlciBwcmludGluZyBhbiBlcnJvciBydWxlIGMgd291bGQKKyAgICAgICAgICogIHJldHVybiBub3JtYWxseS4gIEl0IHdvdWxkIG5vdCBmaW5kIHRoZSByZXF1aXJlZCAnXicgdGhvdWdoLgorICAgICAgICAgKiAgQXQgdGhpcyBwb2ludCwgaXQgZ2V0cyBhIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IgYW5kIHRocm93cyBhbgorICAgICAgICAgKiAgZXhjZXB0aW9uIChzaW5jZSBMQSgxKSBpcyBub3QgaW4gdGhlIHZpYWJsZSBmb2xsb3dpbmcgdG9rZW4KKyAgICAgICAgICogIHNldCkuICBUaGUgcnVsZSBleGNlcHRpb24gaGFuZGxlciB0cmllcyB0byByZWNvdmVyLCBidXQgZmluZHMKKyAgICAgICAgICogIHRoZSBzYW1lIHJlY292ZXJ5IHNldCBhbmQgZG9lc24ndCBjb25zdW1lIGFueXRoaW5nLiAgUnVsZSBiCisgICAgICAgICAqICBleGl0cyBub3JtYWxseSByZXR1cm5pbmcgdG8gcnVsZSBhLiAgTm93IGl0IGZpbmRzIHRoZSAnXScgKGFuZAorICAgICAgICAgKiAgd2l0aCB0aGUgc3VjY2Vzc2Z1bCBtYXRjaCBleGl0cyBlcnJvclJlY292ZXJ5IG1vZGUpLgorICAgICAgICAgKgorICAgICAgICAgKiAgU28sIHlvdSBjbmEgc2VlIHRoYXQgdGhlIHBhcnNlciB3YWxrcyB1cCBjYWxsIGNoYWluIGxvb2tpbmcKKyAgICAgICAgICogIGZvciB0aGUgdG9rZW4gdGhhdCB3YXMgYSBtZW1iZXIgb2YgdGhlIHJlY292ZXJ5IHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogIEVycm9ycyBhcmUgbm90IGdlbmVyYXRlZCBpbiBlcnJvclJlY292ZXJ5IG1vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICBBTlRMUidzIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBpcyBiYXNlZCB1cG9uIG9yaWdpbmFsIGlkZWFzOgorICAgICAgICAgKgorICAgICAgICAgKiAgIkFsZ29yaXRobXMgKyBEYXRhIFN0cnVjdHVyZXMgPSBQcm9ncmFtcyIgYnkgTmlrbGF1cyBXaXJ0aAorICAgICAgICAgKgorICAgICAgICAgKiAgYW5kCisgICAgICAgICAqCisgICAgICAgICAqICAiQSBub3RlIG9uIGVycm9yIHJlY292ZXJ5IGluIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlcnMiOgorICAgICAgICAgKiAgaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD05NDc5MDIuOTQ3OTA1CisgICAgICAgICAqCisgICAgICAgICAqICBMYXRlciwgSm9zZWYgR3Jvc2NoIGhhZCBzb21lIGdvb2QgaWRlYXM6CisgICAgICAgICAqCisgICAgICAgICAqICAiRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudAorICAgICAgICAgKiAgUGFyc2VycyI6CisgICAgICAgICAqICBmdHA6Ly93d3cuY29jb2xhYi5jb20vcHJvZHVjdHMvY29ja3RhaWwvZG9jYTQucHMvZWxsLnBzLnppcAorICAgICAgICAgKgorICAgICAgICAgKiAgTGlrZSBHcm9zY2ggSSBpbXBsZW1lbnRlZCBsb2NhbCBGT0xMT1cgc2V0cyB0aGF0IGFyZSBjb21iaW5lZAorICAgICAgICAgKiAgYXQgcnVuLXRpbWUgdXBvbiBlcnJvciB0byBhdm9pZCBvdmVyaGVhZCBkdXJpbmcgcGFyc2luZy4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIEJpdFNldCBDb21wdXRlRXJyb3JSZWNvdmVyeVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBDb21iaW5lRm9sbG93cyhmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDb21wdXRlIHRoZSBjb250ZXh0LXNlbnNpdGl2ZSBGT0xMT1cgc2V0IGZvciBjdXJyZW50IHJ1bGUuCisgICAgICAgICAqICBUaGlzIGlzIHNldCBvZiB0b2tlbiB0eXBlcyB0aGF0IGNhbiBmb2xsb3cgYSBzcGVjaWZpYyBydWxlCisgICAgICAgICAqICByZWZlcmVuY2UgZ2l2ZW4gYSBzcGVjaWZpYyBjYWxsIGNoYWluLiAgWW91IGdldCB0aGUgc2V0IG9mCisgICAgICAgICAqICB2aWFibGUgdG9rZW5zIHRoYXQgY2FuIHBvc3NpYmx5IGNvbWUgbmV4dCAobG9va2FoZWFkIGRlcHRoIDEpCisgICAgICAgICAqICBnaXZlbiB0aGUgY3VycmVudCBjYWxsIGNoYWluLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorICAgICAgICAgKiAgZGVmaW5pdGlvbiBvZiBwbGFpbiBGT0xMT1cgZm9yIHJ1bGUgcjoKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogICBGT0xMT1cocik9e3ggfCBTPT4qYWxwaGEgciBiZXRhIGluIEcgYW5kIHggaW4gRklSU1QoYmV0YSl9CisgICAgICAgICAqCisgICAgICAgICAqICB3aGVyZSB4IGluIFQqIGFuZCBhbHBoYSwgYmV0YSBpbiBWKjsgVCBpcyBzZXQgb2YgdGVybWluYWxzIGFuZAorICAgICAgICAgKiAgViBpcyB0aGUgc2V0IG9mIHRlcm1pbmFscyBhbmQgbm9udGVybWluYWxzLiAgSW4gb3RoZXIgd29yZHMsCisgICAgICAgICAqICBGT0xMT1cocikgaXMgdGhlIHNldCBvZiBhbGwgdG9rZW5zIHRoYXQgY2FuIHBvc3NpYmx5IGZvbGxvdworICAgICAgICAgKiAgcmVmZXJlbmNlcyB0byByIGluICphbnkqIHNlbnRlbnRpYWwgZm9ybSAoY29udGV4dCkuICBBdAorICAgICAgICAgKiAgcnVudGltZSwgaG93ZXZlciwgd2Uga25vdyBwcmVjaXNlbHkgd2hpY2ggY29udGV4dCBhcHBsaWVzIGFzCisgICAgICAgICAqICB3ZSBoYXZlIHRoZSBjYWxsIGNoYWluLiAgV2UgbWF5IGNvbXB1dGUgdGhlIGV4YWN0IChyYXRoZXIKKyAgICAgICAgICogIHRoYW4gY292ZXJpbmcgc3VwZXJzZXQpIHNldCBvZiBmb2xsb3dpbmcgdG9rZW5zLgorICAgICAgICAgKgorICAgICAgICAgKiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGdyYW1tYXI6CisgICAgICAgICAqCisgICAgICAgICAqICBzdGF0IDogSUQgJz0nIGV4cHIgJzsnICAgICAgLy8gRk9MTE9XKHN0YXQpPT17RU9GfQorICAgICAgICAgKiAgICAgICB8ICJyZXR1cm4iIGV4cHIgJy4nCisgICAgICAgICAqICAgICAgIDsKKyAgICAgICAgICogIGV4cHIgOiBhdG9tICgnKycgYXRvbSkqIDsgICAvLyBGT0xMT1coZXhwcik9PXsnOycsJy4nLCcpJ30KKyAgICAgICAgICogIGF0b20gOiBJTlQgICAgICAgICAgICAgICAgICAvLyBGT0xMT1coYXRvbSk9PXsnKycsJyknLCc7JywnLid9CisgICAgICAgICAqICAgICAgIHwgJygnIGV4cHIgJyknCisgICAgICAgICAqICAgICAgIDsKKyAgICAgICAgICoKKyAgICAgICAgICogIFRoZSBGT0xMT1cgc2V0cyBhcmUgYWxsIGluY2x1c2l2ZSB3aGVyZWFzIGNvbnRleHQtc2Vuc2l0aXZlCisgICAgICAgICAqICBGT0xMT1cgc2V0cyBhcmUgcHJlY2lzZWx5IHdoYXQgY291bGQgZm9sbG93IGEgcnVsZSByZWZlcmVuY2UuCisgICAgICAgICAqICBGb3IgaW5wdXQgaW5wdXQgImk9KDMpOyIsIGhlcmUgaXMgdGhlIGRlcml2YXRpb246CisgICAgICAgICAqCisgICAgICAgICAqICBzdGF0ID0+IElEICc9JyBleHByICc7JworICAgICAgICAgKiAgICAgICA9PiBJRCAnPScgYXRvbSAoJysnIGF0b20pKiAnOycKKyAgICAgICAgICogICAgICAgPT4gSUQgJz0nICcoJyBleHByICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgICAgICogICAgICAgPT4gSUQgJz0nICcoJyBhdG9tICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgICAgICogICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JworICAgICAgICAgKiAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgJzsnCisgICAgICAgICAqCisgICAgICAgICAqICBBdCB0aGUgIjMiIHRva2VuLCB5b3UnZCBoYXZlIGEgY2FsbCBjaGFpbiBvZgorICAgICAgICAgKgorICAgICAgICAgKiAgICBzdGF0IC0+IGV4cHIgLT4gYXRvbSAtPiBleHByIC0+IGF0b20KKyAgICAgICAgICoKKyAgICAgICAgICogIFdoYXQgY2FuIGZvbGxvdyB0aGF0IHNwZWNpZmljIG5lc3RlZCByZWYgdG8gYXRvbT8gIEV4YWN0bHkgJyknCisgICAgICAgICAqICBhcyB5b3UgY2FuIHNlZSBieSBsb29raW5nIGF0IHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgc3BlY2lmaWMKKyAgICAgICAgICogIGlucHV0LiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSBGT0xMT1coYXRvbSk9eycrJywnKScsJzsnLCcuJ30uCisgICAgICAgICAqCisgICAgICAgICAqICBZb3Ugd2FudCB0aGUgZXhhY3QgdmlhYmxlIHRva2VuIHNldCB3aGVuIHJlY292ZXJpbmcgZnJvbSBhCisgICAgICAgICAqICB0b2tlbiBtaXNtYXRjaC4gIFVwb24gdG9rZW4gbWlzbWF0Y2gsIGlmIExBKDEpIGlzIG1lbWJlciBvZgorICAgICAgICAgKiAgdGhlIHZpYWJsZSBuZXh0IHRva2VuIHNldCwgdGhlbiB5b3Uga25vdyB0aGVyZSBpcyBtb3N0IGxpa2VseQorICAgICAgICAgKiAgYSBtaXNzaW5nIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uICAiSW5zZXJ0IiBvbmUgYnkganVzdCBub3QKKyAgICAgICAgICogIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIEJpdFNldCBDb21wdXRlQ29udGV4dFNlbnNpdGl2ZVJ1bGVGT0xMT1coKSB7CisgICAgICAgICAgICByZXR1cm4gQ29tYmluZUZvbGxvd3ModHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3aGF0IGlzIGV4YWN0PyBpdCBzZWVtcyB0byBvbmx5IGFkZCBzZXRzIGZyb20gYWJvdmUgb24gc3RhY2sKKyAgICAgICAgLy8gaWYgRU9SIGlzIGluIHNldCBpLiAgV2hlbiBpdCBzZWVzIGEgc2V0IHcvbyBFT1IsIGl0IHN0b3BzIGFkZGluZy4KKyAgICAgICAgLy8gV2h5IHdvdWxkIHdlIGV2ZXIgd2FudCB0aGVtIGFsbD8gIE1heWJlIG5vIHZpYWJsZSBhbHQgaW5zdGVhZCBvZgorICAgICAgICAvLyBtaXNtYXRjaGVkIHRva2VuPworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBCaXRTZXQgQ29tYmluZUZvbGxvd3MoYm9vbCBleGFjdCkgeworICAgICAgICAgICAgaW50IHRvcCA9IHN0YXRlLl9mc3A7CisgICAgICAgICAgICBCaXRTZXQgZm9sbG93U2V0ID0gbmV3IEJpdFNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBCaXRTZXQgbG9jYWxGb2xsb3dTZXQgPSAoQml0U2V0KXN0YXRlLmZvbGxvd2luZ1tpXTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYWwgZm9sbG93IGRlcHRoICIraSsiPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRm9sbG93U2V0LnRvU3RyaW5nKGdldFRva2VuTmFtZXMoKSkrIikiKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb2xsb3dTZXQuT3JJblBsYWNlKGxvY2FsRm9sbG93U2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXhhY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHdlIHNlZSBlbmQgb2YgcnVsZT8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRm9sbG93U2V0Lk1lbWJlcihUb2tlblR5cGVzLkVuZE9mUnVsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbGVhdmUgRU9SIGluIHNldCBpZiBhdCB0b3AgKHN0YXJ0IHJ1bGUpOyB0aGlzIGxldHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzIGtub3cgaWYgaGF2ZSB0byBpbmNsdWRlIGZvbGxvdyhzdGFydCBydWxlKTsgaS5lLiwgRU9GCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dTZXQuUmVtb3ZlKFRva2VuVHlwZXMuRW5kT2ZSdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gY2FuJ3Qgc2VlIGVuZCBvZiBydWxlLCBxdWl0CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmb2xsb3dTZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+QXR0ZW1wdCB0byByZWNvdmVyIGZyb20gYSBzaW5nbGUgbWlzc2luZyBvciBleHRyYSB0b2tlbi48L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICBFWFRSQSBUT0tFTgorICAgICAgICAgKgorICAgICAgICAgKiAgTEEoMSkgaXMgbm90IHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgSWYgTEEoMikgaGFzIHRoZSByaWdodCB0b2tlbiwKKyAgICAgICAgICogIGhvd2V2ZXIsIHRoZW4gYXNzdW1lIExBKDEpIGlzIHNvbWUgZXh0cmEgc3B1cmlvdXMgdG9rZW4uICBEZWxldGUgaXQKKyAgICAgICAgICogIGFuZCBMQSgyKSBhcyBpZiB3ZSB3ZXJlIGRvaW5nIGEgbm9ybWFsIG1hdGNoKCksIHdoaWNoIGFkdmFuY2VzIHRoZQorICAgICAgICAgKiAgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqICBNSVNTSU5HIFRPS0VOCisgICAgICAgICAqCisgICAgICAgICAqICBJZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIKKyAgICAgICAgICogIHR0eXBlIHRoZW4gaXQgaXMgb2sgdG8gImluc2VydCIgdGhlIG1pc3NpbmcgdG9rZW4sIGVsc2UgdGhyb3cKKyAgICAgICAgICogIGV4Y2VwdGlvbiBGb3IgZXhhbXBsZSwgSW5wdXQgImk9KDM7IiBpcyBjbGVhcmx5IG1pc3NpbmcgdGhlCisgICAgICAgICAqICAnKScuICBXaGVuIHRoZSBwYXJzZXIgcmV0dXJucyBmcm9tIHRoZSBuZXN0ZWQgY2FsbCB0byBleHByLCBpdAorICAgICAgICAgKiAgd2lsbCBoYXZlIGNhbGwgY2hhaW46CisgICAgICAgICAqCisgICAgICAgICAqICAgIHN0YXQgLT4gZXhwciAtPiBhdG9tCisgICAgICAgICAqCisgICAgICAgICAqICBhbmQgaXQgd2lsbCBiZSB0cnlpbmcgdG8gbWF0Y2ggdGhlICcpJyBhdCB0aGlzIHBvaW50IGluIHRoZQorICAgICAgICAgKiAgZGVyaXZhdGlvbjoKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgKiAgbWF0Y2goKSB3aWxsIHNlZSB0aGF0ICc7JyBkb2Vzbid0IG1hdGNoICcpJyBhbmQgcmVwb3J0IGEKKyAgICAgICAgICogIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IuICBUbyByZWNvdmVyLCBpdCBzZWVzIHRoYXQgTEEoMSk9PSc7JworICAgICAgICAgKiAgaXMgaW4gdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZSAnKScgdG9rZW4KKyAgICAgICAgICogIHJlZmVyZW5jZSBpbiBydWxlIGF0b20uICBJdCBjYW4gYXNzdW1lIHRoYXQgeW91IGZvcmdvdCB0aGUgJyknLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgb2JqZWN0IFJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKElJbnRTdHJlYW0gaW5wdXQsIGludCB0dHlwZSwgQml0U2V0IGZvbGxvdykgeworICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSA9IG51bGw7CisgICAgICAgICAgICAvLyBpZiBuZXh0IHRva2VuIGlzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZW4gImRlbGV0ZSIgdGhpcyB0b2tlbgorICAgICAgICAgICAgaWYgKE1pc21hdGNoSXNVbndhbnRlZFRva2VuKGlucHV0LCB0dHlwZSkpIHsKKyAgICAgICAgICAgICAgICBlID0gbmV3IFVud2FudGVkVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0LCBUb2tlbk5hbWVzKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4gZGVsZXRpbmcgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUb2tlblN0cmVhbSlpbnB1dCkuTFQoMSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2luY2UgIisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgyKSsiIGlzIHdoYXQgd2Ugd2FudCIpOworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEJlZ2luUmVzeW5jKCk7CisgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOyAvLyBzaW1wbHkgZGVsZXRlIGV4dHJhIHRva2VuCisgICAgICAgICAgICAgICAgRW5kUmVzeW5jKCk7CisgICAgICAgICAgICAgICAgUmVwb3J0RXJyb3IoZSk7ICAvLyByZXBvcnQgYWZ0ZXIgY29uc3VtaW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldHVybiB0aGUgdG9rZW4gd2UncmUgYWN0dWFsbHkgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICBvYmplY3QgbWF0Y2hlZFN5bWJvbCA9IEdldEN1cnJlbnRJbnB1dFN5bWJvbChpbnB1dCk7CisgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOyAvLyBtb3ZlIHBhc3QgdHR5cGUgdG9rZW4gYXMgaWYgYWxsIHdlcmUgb2sKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNhbid0IHJlY292ZXIgd2l0aCBzaW5nbGUgdG9rZW4gZGVsZXRpb24sIHRyeSBpbnNlcnRpb24KKyAgICAgICAgICAgIGlmIChNaXNtYXRjaElzTWlzc2luZ1Rva2VuKGlucHV0LCBmb2xsb3cpKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGluc2VydGVkID0gR2V0TWlzc2luZ1N5bWJvbChpbnB1dCwgZSwgdHR5cGUsIGZvbGxvdyk7CisgICAgICAgICAgICAgICAgZSA9IG5ldyBNaXNzaW5nVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0LCBpbnNlcnRlZCk7CisgICAgICAgICAgICAgICAgUmVwb3J0RXJyb3IoZSk7ICAvLyByZXBvcnQgYWZ0ZXIgaW5zZXJ0aW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBldmVuIHRoYXQgZGlkbid0IHdvcms7IG11c3QgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgZSA9IG5ldyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0LCBUb2tlbk5hbWVzKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvKiogTm90IGN1cnJlbnRseSB1c2VkICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBSZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoSUludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0IGZvbGxvdykgeworICAgICAgICAgICAgaWYgKE1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQsIGZvbGxvdykpIHsKKyAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1pc3NpbmcgdG9rZW4iKTsKKyAgICAgICAgICAgICAgICBSZXBvcnRFcnJvcihlKTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyB0byBjb25qdXJlIHVwIGEgdG9rZW4gZm9yIHNldHMgeWV0CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldE1pc3NpbmdTeW1ib2woaW5wdXQsIGUsIFRva2VuVHlwZXMuSW52YWxpZCwgZm9sbG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8gZG8gc2luZ2xlIHRva2VuIGRlbGV0aW9uIGxpa2UgYWJvdmUgZm9yIFRva2VuIG1pc21hdGNoCisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWF0Y2ggbmVlZHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCwgd2hpY2ggZ2V0cyBwdXQKKyAgICAgICAgICogIGludG8gdGhlIGxhYmVsIGZvciB0aGUgYXNzb2NpYXRlZCB0b2tlbiByZWY7IGUuZy4sIHg9SUQuICBUb2tlbgorICAgICAgICAgKiAgYW5kIHRyZWUgcGFyc2VycyBuZWVkIHRvIHJldHVybiBkaWZmZXJlbnQgb2JqZWN0cy4gUmF0aGVyIHRoYW4gdGVzdAorICAgICAgICAgKiAgZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKyAgICAgICAgICogIGEgc2ltcGxlIG1ldGhvZCB0byBhc2sgdGhlIHJlY29nbml6ZXIgdG8gdGVsbCBtZSB3aGF0IHRoZSBjdXJyZW50CisgICAgICAgICAqICBpbnB1dCBzeW1ib2wgaXMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz5UaGlzIGlzIGlnbm9yZWQgZm9yIGxleGVycy48L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBvYmplY3QgR2V0Q3VycmVudElucHV0U3ltYm9sKElJbnRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkNvbmp1cmUgdXAgYSBtaXNzaW5nIHRva2VuIGR1cmluZyBlcnJvciByZWNvdmVyeS48L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoZSByZWNvZ25pemVyIGF0dGVtcHRzIHRvIHJlY292ZXIgZnJvbSBzaW5nbGUgbWlzc2luZworICAgICAgICAgKiAgc3ltYm9scy4gQnV0LCBhY3Rpb25zIG1pZ2h0IHJlZmVyIHRvIHRoYXQgbWlzc2luZyBzeW1ib2wuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgeD1JRCB7ZigkeCk7fS4gVGhlIGFjdGlvbiBjbGVhcmx5IGFzc3VtZXMKKyAgICAgICAgICogIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4gaWRlbnRpZmllciBtYXRjaGVkIHByZXZpb3VzbHkgYW5kIHRoYXQKKyAgICAgICAgICogICR4IHBvaW50cyBhdCB0aGF0IHRva2VuLiBJZiB0aGF0IHRva2VuIGlzIG1pc3NpbmcsIGJ1dAorICAgICAgICAgKiAgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbSBpcyB3aGF0IHdlIHdhbnQgd2UgYXNzdW1lIHRoYXQKKyAgICAgICAgICogIHRoaXMgdG9rZW4gaXMgbWlzc2luZyBhbmQgd2Uga2VlcCBnb2luZy4gQmVjYXVzZSB3ZQorICAgICAgICAgKiAgaGF2ZSB0byByZXR1cm4gc29tZSB0b2tlbiB0byByZXBsYWNlIHRoZSBtaXNzaW5nIHRva2VuLAorICAgICAgICAgKiAgd2UgaGF2ZSB0byBjb25qdXJlIG9uZSB1cC4gVGhpcyBtZXRob2QgZ2l2ZXMgdGhlIHVzZXIgY29udHJvbAorICAgICAgICAgKiAgb3ZlciB0aGUgdG9rZW5zIHJldHVybmVkIGZvciBtaXNzaW5nIHRva2Vucy4gTW9zdGx5LAorICAgICAgICAgKiAgeW91IHdpbGwgd2FudCB0byBjcmVhdGUgc29tZXRoaW5nIHNwZWNpYWwgZm9yIGlkZW50aWZpZXIKKyAgICAgICAgICogIHRva2Vucy4gRm9yIGxpdGVyYWxzIHN1Y2ggYXMgJ3snIGFuZCAnLCcsIHRoZSBkZWZhdWx0CisgICAgICAgICAqICBhY3Rpb24gaW4gdGhlIHBhcnNlciBvciB0cmVlIHBhcnNlciB3b3Jrcy4gSXQgc2ltcGx5IGNyZWF0ZXMKKyAgICAgICAgICogIGEgQ29tbW9uVG9rZW4gb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuIFRoZSB0ZXh0IHdpbGwgYmUgdGhlIHRva2VuLgorICAgICAgICAgKiAgSWYgeW91IGNoYW5nZSB3aGF0IHRva2VucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIGxleGVyLAorICAgICAgICAgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0b2tlbnMuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBvYmplY3QgR2V0TWlzc2luZ1N5bWJvbChJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFRva2VuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBmb2xsb3cpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lVW50aWwoSUludFN0cmVhbSBpbnB1dCwgaW50IHRva2VuVHlwZSkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWVVbnRpbCAiK3Rva2VuVHlwZSk7CisgICAgICAgICAgICBpbnQgdHR5cGUgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIHdoaWxlICh0dHlwZSAhPSBUb2tlblR5cGVzLkVuZE9mRmlsZSAmJiB0dHlwZSAhPSB0b2tlblR5cGUpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgdHR5cGUgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Db25zdW1lIHRva2VucyB1bnRpbCBvbmUgbWF0Y2hlcyB0aGUgZ2l2ZW4gdG9rZW4gc2V0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVVbnRpbChJSW50U3RyZWFtIGlucHV0LCBCaXRTZXQgc2V0KSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uc3VtZVVudGlsKCIrc2V0LnRvU3RyaW5nKGdldFRva2VuTmFtZXMoKSkrIikiKTsKKyAgICAgICAgICAgIGludCB0dHlwZSA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgd2hpbGUgKHR0eXBlICE9IFRva2VuVHlwZXMuRW5kT2ZGaWxlICYmICFzZXQuTWVtYmVyKHR0eXBlKSkgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjb25zdW1lIGR1cmluZyByZWNvdmVyIExBKDEpPSIrZ2V0VG9rZW5OYW1lcygpW2lucHV0LkxBKDEpXSk7CisgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgIHR0eXBlID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UHVzaCBhIHJ1bGUncyBmb2xsb3cgc2V0IHVzaW5nIG91ciBvd24gaGFyZGNvZGVkIHN0YWNrPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoRm9sbG93KEJpdFNldCBmc2V0KSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlLl9mc3AgKyAxKSA+PSBzdGF0ZS5mb2xsb3dpbmcuTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgQXJyYXkuUmVzaXplKHJlZiBzdGF0ZS5mb2xsb3dpbmcsIHN0YXRlLmZvbGxvd2luZy5MZW5ndGggKiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLmZvbGxvd2luZ1srK3N0YXRlLl9mc3BdID0gZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIFBvcEZvbGxvdygpIHsKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBMaXN0PFN0cmluZz4gb2YgdGhlIHJ1bGVzIGluIHlvdXIgcGFyc2VyIGluc3RhbmNlCisgICAgICAgICAqICBsZWFkaW5nIHVwIHRvIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4gIFlvdSBjb3VsZCBvdmVycmlkZSBpZgorICAgICAgICAgKiAgeW91IHdhbnQgbW9yZSBkZXRhaWxzIHN1Y2ggYXMgdGhlIGZpbGUvbGluZSBpbmZvIG9mIHdoZXJlCisgICAgICAgICAqICBpbiB0aGUgcGFyc2VyIGphdmEgY29kZSBhIHJ1bGUgaXMgaW52b2tlZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIGZvciBjb250ZXh0LXNlbnNpdGl2ZQorICAgICAgICAgKiAgZXJyb3IgcmVjb3ZlcnkuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJTGlzdDxzdHJpbmc+IEdldFJ1bGVJbnZvY2F0aW9uU3RhY2soKSB7CisgICAgICAgICAgICByZXR1cm4gR2V0UnVsZUludm9jYXRpb25TdGFjayhuZXcgU3RhY2tUcmFjZSh0cnVlKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIG1vcmUgZ2VuZXJhbCB2ZXJzaW9uIG9mIEdldFJ1bGVJbnZvY2F0aW9uU3RhY2sgd2hlcmUgeW91IGNhbgorICAgICAgICAgKiAgcGFzcyBpbiB0aGUgU3RhY2tUcmFjZSBvZiwgZm9yIGV4YW1wbGUsIGEgUmVjb2duaXRpb25FeGNlcHRpb24KKyAgICAgICAgICogIHRvIGdldCBpdCdzIHJ1bGUgc3RhY2sgdHJhY2UuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIElMaXN0PHN0cmluZz4gR2V0UnVsZUludm9jYXRpb25TdGFjayhTdGFja1RyYWNlIHRyYWNlKSB7CisgICAgICAgICAgICBpZiAodHJhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFjZSIpOworCisgICAgICAgICAgICBMaXN0PHN0cmluZz4gcnVsZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBTdGFja0ZyYW1lW10gc3RhY2sgPSB0cmFjZS5HZXRGcmFtZXMoKSA/PyBuZXcgU3RhY2tGcmFtZVswXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YWNrLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgU3RhY2tGcmFtZSBmcmFtZSA9IHN0YWNrW2ldOworICAgICAgICAgICAgICAgIE1ldGhvZEJhc2UgbWV0aG9kID0gZnJhbWUuR2V0TWV0aG9kKCk7CisgICAgICAgICAgICAgICAgR3JhbW1hclJ1bGVBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzID0gKEdyYW1tYXJSdWxlQXR0cmlidXRlW10pbWV0aG9kLkdldEN1c3RvbUF0dHJpYnV0ZXModHlwZW9mKEdyYW1tYXJSdWxlQXR0cmlidXRlKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBhdHRyaWJ1dGVzLkxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzLkFkZChhdHRyaWJ1dGVzWzBdLk5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcnVsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQmFja3RyYWNraW5nTGV2ZWwgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuYmFja3RyYWNraW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZXR1cm4gd2hldGhlciBvciBub3QgYSBiYWNrdHJhY2tpbmcgYXR0ZW1wdCBmYWlsZWQuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEZhaWxlZCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5mYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBVc2VkIHRvIHByaW50IG91dCB0b2tlbiBuYW1lcyBsaWtlIElEIGR1cmluZyBkZWJ1Z2dpbmcgYW5kCisgICAgICAgICAqICBlcnJvciByZXBvcnRpbmcuICBUaGUgZ2VuZXJhdGVkIHBhcnNlcnMgaW1wbGVtZW50IGEgbWV0aG9kCisgICAgICAgICAqICB0aGF0IG92ZXJyaWRlcyB0aGlzIHRvIHBvaW50IHRvIHRoZWlyIFN0cmluZ1tdIHRva2VuTmFtZXMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmdbXSBUb2tlbk5hbWVzIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBGb3IgZGVidWdnaW5nIGFuZCBvdGhlciBwdXJwb3NlcywgbWlnaHQgd2FudCB0aGUgZ3JhbW1hciBuYW1lLgorICAgICAgICAgKiAgSGF2ZSBBTlRMUiBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBtZXRob2QuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgR3JhbW1hckZpbGVOYW1lIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RyaW5nIFNvdXJjZU5hbWUgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHVzZSBtb3N0IG9mdGVuIHdpdGggdGVtcGxhdGUgcmV3cml0ZXMuCisgICAgICAgICAqICBDb252ZXJ0IGEgTGlzdDxUb2tlbj4gdG8gTGlzdDxTdHJpbmc+CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PHN0cmluZz4gVG9TdHJpbmdzKElDb2xsZWN0aW9uPElUb2tlbj4gdG9rZW5zKSB7CisgICAgICAgICAgICBpZiAodG9rZW5zID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBzdHJpbmdzID0gbmV3IExpc3Q8c3RyaW5nPih0b2tlbnMuQ291bnQpOworICAgICAgICAgICAgZm9yZWFjaCAoSVRva2VuIHRva2VuIGluIHRva2VucykgeworICAgICAgICAgICAgICAgIHN0cmluZ3MuQWRkKHRva2VuLlRleHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc3RyaW5nczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdpdmVuIGEgcnVsZSBudW1iZXIgYW5kIGEgc3RhcnQgdG9rZW4gaW5kZXggbnVtYmVyLCByZXR1cm4KKyAgICAgICAgICogIE1FTU9fUlVMRV9VTktOT1dOIGlmIHRoZSBydWxlIGhhcyBub3QgcGFyc2VkIGlucHV0IHN0YXJ0aW5nIGZyb20KKyAgICAgICAgICogIHN0YXJ0IGluZGV4LiAgSWYgdGhpcyBydWxlIGhhcyBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAgICAgICogIHN0YXJ0IGluZGV4IGJlZm9yZSwgdGhlbiByZXR1cm4gd2hlcmUgdGhlIHJ1bGUgc3RvcHBlZCBwYXJzaW5nLgorICAgICAgICAgKiAgSXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdG9rZW4gbWF0Y2hlZCBieSB0aGUgcnVsZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgRm9yIG5vdyB3ZSB1c2UgYSBoYXNodGFibGUgYW5kIGp1c3QgdGhlIHNsb3cgT2JqZWN0LWJhc2VkIG9uZS4KKyAgICAgICAgICogIExhdGVyLCB3ZSBjYW4gbWFrZSBhIHNwZWNpYWwgb25lIGZvciBpbnRzIGFuZCBhbHNvIG9uZSB0aGF0CisgICAgICAgICAqICB0b3NzZXMgb3V0IGRhdGEgYWZ0ZXIgd2UgY29tbWl0IHBhc3QgaW5wdXQgcG9zaXRpb24gaS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBHZXRSdWxlTWVtb2l6YXRpb24oaW50IHJ1bGVJbmRleCwgaW50IHJ1bGVTdGFydEluZGV4KSB7CisgICAgICAgICAgICBpZiAoc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc3RvcEluZGV4OworICAgICAgICAgICAgaWYgKCFzdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdLlRyeUdldFZhbHVlKHJ1bGVTdGFydEluZGV4LCBvdXQgc3RvcEluZGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTWVtb1J1bGVVbmtub3duOworCisgICAgICAgICAgICByZXR1cm4gc3RvcEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSGFzIHRoaXMgcnVsZSBhbHJlYWR5IHBhcnNlZCBpbnB1dCBhdCB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUKKyAgICAgICAgICogIGlucHV0IHN0cmVhbT8gIFJldHVybiB0aGUgc3RvcCB0b2tlbiBpbmRleCBvciBNRU1PX1JVTEVfVU5LTk9XTi4KKyAgICAgICAgICogIElmIHdlIGF0dGVtcHRlZCBidXQgZmFpbGVkIHRvIHBhcnNlIHByb3Blcmx5IGJlZm9yZSwgcmV0dXJuCisgICAgICAgICAqICBNRU1PX1JVTEVfRkFJTEVELgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIG1ldGhvZCBoYXMgYSBzaWRlLWVmZmVjdDogaWYgd2UgaGF2ZSBzZWVuIHRoaXMgaW5wdXQgZm9yCisgICAgICAgICAqICB0aGlzIHJ1bGUgYW5kIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYmVmb3JlLCB0aGVuIHNlZWsgYWhlYWQgdG8KKyAgICAgICAgICogIDEgcGFzdCB0aGUgc3RvcCB0b2tlbiBtYXRjaGVkIGZvciB0aGlzIHJ1bGUgbGFzdCB0aW1lLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBBbHJlYWR5UGFyc2VkUnVsZShJSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4KSB7CisgICAgICAgICAgICBpbnQgc3RvcEluZGV4ID0gR2V0UnVsZU1lbW9pemF0aW9uKHJ1bGVJbmRleCwgaW5wdXQuSW5kZXgpOworICAgICAgICAgICAgaWYgKHN0b3BJbmRleCA9PSBNZW1vUnVsZVVua25vd24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RvcEluZGV4ID09IE1lbW9SdWxlRmFpbGVkKSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgIitydWxlSW5kZXgrIiB3aWxsIG5ldmVyIHN1Y2NlZWQiKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigic2VlbiBydWxlICIrcnVsZUluZGV4KyIgYmVmb3JlOyBza2lwcGluZyBhaGVhZCB0byBAIisoc3RvcEluZGV4KzEpKyIgZmFpbGVkPSIrc3RhdGUuZmFpbGVkKTsKKyAgICAgICAgICAgICAgICBpbnB1dC5TZWVrKHN0b3BJbmRleCArIDEpOyAvLyBqdW1wIHRvIG9uZSBwYXN0IHN0b3AgdG9rZW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVjb3JkIHdoZXRoZXIgb3Igbm90IHRoaXMgcnVsZSBwYXJzZWQgdGhlIGlucHV0IGF0IHRoaXMgcG9zaXRpb24KKyAgICAgICAgICogIHN1Y2Nlc3NmdWxseS4gIFVzZSBhIHN0YW5kYXJkIGphdmEgaGFzaHRhYmxlIGZvciBub3cuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1lbW9pemUoSUludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydWxlU3RhcnRJbmRleCkgeworICAgICAgICAgICAgaW50IHN0b3BUb2tlbkluZGV4ID0gc3RhdGUuZmFpbGVkID8gTWVtb1J1bGVGYWlsZWQgOiBpbnB1dC5JbmRleCAtIDE7CisgICAgICAgICAgICBpZiAoc3RhdGUucnVsZU1lbW8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChUcmFjZURlc3RpbmF0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIFRyYWNlRGVzdGluYXRpb24uV3JpdGVMaW5lKCIhISEhISEhISEgbWVtbyBhcnJheSBpcyBudWxsIGZvciAiICsgR3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChydWxlSW5kZXggPj0gc3RhdGUucnVsZU1lbW8uTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKFRyYWNlRGVzdGluYXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZUxpbmUoIiEhISEhISEhISBtZW1vIHNpemUgaXMgIiArIHN0YXRlLnJ1bGVNZW1vLkxlbmd0aCArICIsIGJ1dCBydWxlIGluZGV4IGlzICIgKyBydWxlSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF1bcnVsZVN0YXJ0SW5kZXhdID0gc3RvcFRva2VuSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+cmV0dXJuIGhvdyBtYW55IHJ1bGUvaW5wdXQtaW5kZXggcGFpcnMgdGhlcmUgYXJlIGluIHRvdGFsLjwvc3VtbWFyeT4KKyAgICAgICAgICogIFRPRE86IHRoaXMgaW5jbHVkZXMgc3lucHJlZHMuIDooCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0UnVsZU1lbW9pemF0aW9uQ2FjaGVTaXplKCkgeworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IHN0YXRlLnJ1bGVNZW1vICE9IG51bGwgJiYgaSA8IHN0YXRlLnJ1bGVNZW1vLkxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFyIHJ1bGVNYXAgPSBzdGF0ZS5ydWxlTWVtb1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocnVsZU1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG4gKz0gcnVsZU1hcC5Db3VudDsgLy8gaG93IG1hbnkgaW5wdXQgaW5kZXhlcyBhcmUgcmVjb3JkZWQ/CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX1RSQUNFIildCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVHJhY2VJbihzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgsIG9iamVjdCBpbnB1dFN5bWJvbCkgeworICAgICAgICAgICAgaWYgKFRyYWNlRGVzdGluYXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIFRyYWNlRGVzdGluYXRpb24uV3JpdGUoImVudGVyICIgKyBydWxlTmFtZSArICIgIiArIGlucHV0U3ltYm9sKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZSgiIGJhY2t0cmFja2luZz0iICsgc3RhdGUuYmFja3RyYWNraW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNlRGVzdGluYXRpb24uV3JpdGVMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX1RSQUNFIildCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVHJhY2VPdXQoc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4LCBvYmplY3QgaW5wdXRTeW1ib2wpIHsKKyAgICAgICAgICAgIGlmIChUcmFjZURlc3RpbmF0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlKCJleGl0ICIgKyBydWxlTmFtZSArICIgIiArIGlucHV0U3ltYm9sKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZSgiIGJhY2t0cmFja2luZz0iICsgc3RhdGUuYmFja3RyYWNraW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKQorICAgICAgICAgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlKCIgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlKCIgc3VjY2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBEZWJ1Z2dpbmcgc3VwcG9ydAorICAgICAgICBwdWJsaWMgdmlydHVhbCBJRGVidWdFdmVudExpc3RlbmVyIERlYnVnTGlzdGVuZXIgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z0VudGVyUnVsZShzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUpIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRW50ZXJSdWxlKGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRXhpdFJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKSB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLkV4aXRSdWxlKGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRW50ZXJTdWJSdWxlKGludCBkZWNpc2lvbk51bWJlcikgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5FbnRlclN1YlJ1bGUoZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRXhpdFN1YlJ1bGUoaW50IGRlY2lzaW9uTnVtYmVyKSB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLkV4aXRTdWJSdWxlKGRlY2lzaW9uTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z0VudGVyQWx0KGludCBhbHQpIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRW50ZXJBbHQoYWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z0VudGVyRGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyLCBib29sIGNvdWxkQmFja3RyYWNrKSB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLkVudGVyRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsIGNvdWxkQmFja3RyYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z0V4aXREZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIpIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRXhpdERlY2lzaW9uKGRlY2lzaW9uTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z0xvY2F0aW9uKGludCBsaW5lLCBpbnQgY2hhclBvc2l0aW9uSW5MaW5lKSB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLkxvY2F0aW9uKGxpbmUsIGNoYXJQb3NpdGlvbkluTGluZSk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdTZW1hbnRpY1ByZWRpY2F0ZShib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSkgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5TZW1hbnRpY1ByZWRpY2F0ZShyZXN1bHQsIHByZWRpY2F0ZSk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdCZWdpbkJhY2t0cmFjayhpbnQgbGV2ZWwpIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuQmVnaW5CYWNrdHJhY2sobGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKSB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLkVuZEJhY2t0cmFjayhsZXZlbCwgc3VjY2Vzc2Z1bCk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdSZWNvZ25pdGlvbkV4Y2VwdGlvbihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0JpdFNldC5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0JpdFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzlmM2MzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQml0U2V0LmNzCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHVzaW5nIEFycmF5ID0gU3lzdGVtLkFycmF5OworICAgIHVzaW5nIENMU0NvbXBsaWFudCA9IFN5c3RlbS5DTFNDb21wbGlhbnRBdHRyaWJ1dGU7CisgICAgdXNpbmcgSUNsb25lYWJsZSA9IFN5c3RlbS5JQ2xvbmVhYmxlOworICAgIHVzaW5nIE1hdGggPSBTeXN0ZW0uTWF0aDsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBzdHJpcHBlZC1kb3duIHZlcnNpb24gb2Ygb3JnLmFudGxyLm1pc2MuQml0U2V0IHRoYXQgaXMganVzdAorICAgICAqICBnb29kIGVub3VnaCB0byBoYW5kbGUgcnVudGltZSByZXF1aXJlbWVudHMgc3VjaCBhcyBGT0xMT1cgc2V0cworICAgICAqICBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5LgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBCaXRTZXQgOiBJQ2xvbmVhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgQklUUyA9IDY0OyAgICAvLyBudW1iZXIgb2YgYml0cyAvIGxvbmcKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgTE9HX0JJVFMgPSA2OyAvLyAyXjYgPT0gNjQKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXZSB3aWxsIG9mdGVuIG5lZWQgdG8gZG8gYSBtb2Qgb3BlcmF0b3IgKGkgbW9kIG5iaXRzKS4gIEl0cworICAgICAgICAgKiAgdHVybnMgb3V0IHRoYXQsIGZvciBwb3dlcnMgb2YgdHdvLCB0aGlzIG1vZCBvcGVyYXRpb24gaXMKKyAgICAgICAgICogIHNhbWUgYXMgKGkgJiAobmJpdHMtMSkpLiAgU2luY2UgbW9kIGlzIHNsb3csIHdlIHVzZSBhCisgICAgICAgICAqICBwcmVjb21wdXRlZCBtb2QgbWFzayB0byBkbyB0aGUgbW9kIGluc3RlYWQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBNT0RfTUFTSyA9IEJJVFMgLSAxOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgYWN0dWFsIGRhdGEgYml0czwvc3VtbWFyeT4gKi8KKyAgICAgICAgdWxvbmdbXSBfYml0czsKKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3RydWN0IGEgYml0c2V0IG9mIHNpemUgb25lIHdvcmQgKDY0IGJpdHMpPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgQml0U2V0KCkKKyAgICAgICAgICAgIDogdGhpcyhCSVRTKSB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3RydWN0aW9uIGZyb20gYSBzdGF0aWMgYXJyYXkgb2YgbG9uZ3M8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBCaXRTZXQodWxvbmdbXSBiaXRzKSB7CisgICAgICAgICAgICBfYml0cyA9IGJpdHM7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3RydWN0aW9uIGZyb20gYSBsaXN0IG9mIGludGVnZXJzPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgQml0U2V0KElFbnVtZXJhYmxlPGludD4gaXRlbXMpCisgICAgICAgICAgICA6IHRoaXMoKSB7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaSBpbiBpdGVtcykKKyAgICAgICAgICAgICAgICBBZGQoaSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3RydWN0IGEgYml0c2V0IGdpdmVuIHRoZSBzaXplPC9zdW1tYXJ5PgorICAgICAgICAgKiAgPHBhcmFtIG5hbWU9Im5iaXRzIj5UaGUgc2l6ZSBvZiB0aGUgYml0c2V0IGluIGJpdHM8L3BhcmFtPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJpdFNldChpbnQgbmJpdHMpIHsKKyAgICAgICAgICAgIF9iaXRzID0gbmV3IHVsb25nWygobmJpdHMgLSAxKSA+PiBMT0dfQklUUykgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IE9mKGludCBlbCkgeworICAgICAgICAgICAgQml0U2V0IHMgPSBuZXcgQml0U2V0KGVsICsgMSk7CisgICAgICAgICAgICBzLkFkZChlbCk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IE9mKGludCBhLCBpbnQgYikgeworICAgICAgICAgICAgQml0U2V0IHMgPSBuZXcgQml0U2V0KE1hdGguTWF4KGEsIGIpICsgMSk7CisgICAgICAgICAgICBzLkFkZChhKTsKKyAgICAgICAgICAgIHMuQWRkKGIpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEJpdFNldCBPZihpbnQgYSwgaW50IGIsIGludCBjKSB7CisgICAgICAgICAgICBCaXRTZXQgcyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgIHMuQWRkKGEpOworICAgICAgICAgICAgcy5BZGQoYik7CisgICAgICAgICAgICBzLkFkZChjKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgT2YoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKKyAgICAgICAgICAgIEJpdFNldCBzID0gbmV3IEJpdFNldCgpOworICAgICAgICAgICAgcy5BZGQoYSk7CisgICAgICAgICAgICBzLkFkZChiKTsKKyAgICAgICAgICAgIHMuQWRkKGMpOworICAgICAgICAgICAgcy5BZGQoZCk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5yZXR1cm4gdGhpcyB8IGEgaW4gYSBuZXcgc2V0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgQml0U2V0IE9yKEJpdFNldCBhKSB7CisgICAgICAgICAgICBpZiAoYSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCaXRTZXQgcyA9IChCaXRTZXQpdGhpcy5DbG9uZSgpOworICAgICAgICAgICAgcy5PckluUGxhY2UoYSk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5vciB0aGlzIGVsZW1lbnQgaW50byB0aGlzIHNldCAoZ3JvdyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUpPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdm9pZCBBZGQoaW50IGVsKSB7CisgICAgICAgICAgICBpbnQgbiA9IFdvcmROdW1iZXIoZWwpOworICAgICAgICAgICAgaWYgKG4gPj0gX2JpdHMuTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgR3Jvd1RvSW5jbHVkZShlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYml0c1tuXSB8PSBCaXRNYXNrKGVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Hcm93cyB0aGUgc2V0IHRvIGEgbGFyZ2VyIG51bWJlciBvZiBiaXRzLjwvc3VtbWFyeT4KKyAgICAgICAgICogIDxwYXJhbSBuYW1lPSJiaXQiPmVsZW1lbnQgdGhhdCBtdXN0IGZpdCBpbiBzZXQ8L3BhcmFtPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgR3Jvd1RvSW5jbHVkZShpbnQgYml0KSB7CisgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IE1hdGguTWF4KF9iaXRzLkxlbmd0aCA8PCAxLCBOdW1Xb3Jkc1RvSG9sZChiaXQpKTsKKyAgICAgICAgICAgIFNldFNpemUobmV3U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBPckluUGxhY2UoQml0U2V0IGEpIHsKKyAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHNtYWxsZXIgdGhhbiBhLCBncm93IHRoaXMgZmlyc3QKKyAgICAgICAgICAgIGlmIChhLl9iaXRzLkxlbmd0aCA+IF9iaXRzLkxlbmd0aCkgeworICAgICAgICAgICAgICAgIFNldFNpemUoYS5fYml0cy5MZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1pbiA9IE1hdGguTWluKF9iaXRzLkxlbmd0aCwgYS5fYml0cy5MZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1pbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgX2JpdHNbaV0gfD0gYS5fYml0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXRzIHRoZSBzaXplIG9mIGEgc2V0Ljwvc3VtbWFyeT4KKyAgICAgICAgICogIDxwYXJhbSBuYW1lPSJud29yZHMiPmhvdyBtYW55IHdvcmRzIHRoZSBuZXcgc2V0IHNob3VsZCBiZTwvcGFyYW0+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgU2V0U2l6ZShpbnQgbndvcmRzKSB7CisgICAgICAgICAgICBBcnJheS5SZXNpemUocmVmIF9iaXRzLCBud29yZHMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdWxvbmcgQml0TWFzayhpbnQgYml0TnVtYmVyKSB7CisgICAgICAgICAgICBpbnQgYml0UG9zaXRpb24gPSBiaXROdW1iZXIgJiBNT0RfTUFTSzsgLy8gYml0TnVtYmVyIG1vZCBCSVRTCisgICAgICAgICAgICByZXR1cm4gMVVMIDw8IGJpdFBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBDbG9uZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQml0U2V0KCh1bG9uZ1tdKV9iaXRzLkNsb25lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBTaXplKCkgeworICAgICAgICAgICAgaW50IGRlZyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gX2JpdHMuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICB1bG9uZyB3b3JkID0gX2JpdHNbaV07CisgICAgICAgICAgICAgICAgaWYgKHdvcmQgIT0gMEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYml0ID0gQklUUyAtIDE7IGJpdCA+PSAwOyBiaXQtLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3b3JkICYgKDFVTCA8PCBiaXQpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVnKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmIChvdGhlciA9PSBudWxsIHx8ICEob3RoZXIgaXMgQml0U2V0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQml0U2V0IG90aGVyU2V0ID0gKEJpdFNldClvdGhlcjsKKworICAgICAgICAgICAgaW50IG4gPSBNYXRoLk1pbih0aGlzLl9iaXRzLkxlbmd0aCwgb3RoZXJTZXQuX2JpdHMuTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gZm9yIGFueSBiaXRzIGluIGNvbW1vbiwgY29tcGFyZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5fYml0c1tpXSAhPSBvdGhlclNldC5fYml0c1tpXSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYW55IGV4dHJhIGJpdHMgYXJlIG9mZgorCisgICAgICAgICAgICBpZiAodGhpcy5fYml0cy5MZW5ndGggPiBuKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG4gKyAxOyBpIDwgdGhpcy5fYml0cy5MZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYml0c1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG90aGVyU2V0Ll9iaXRzLkxlbmd0aCA+IG4pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbiArIDE7IGkgPCBvdGhlclNldC5fYml0cy5MZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJTZXQuX2JpdHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIE1lbWJlcihpbnQgZWwpIHsKKyAgICAgICAgICAgIGlmIChlbCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbiA9IFdvcmROdW1iZXIoZWwpOworICAgICAgICAgICAgaWYgKG4gPj0gX2JpdHMuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAoX2JpdHNbbl0gJiBCaXRNYXNrKGVsKSkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSB0aGlzIGVsZW1lbnQgZnJvbSB0aGlzIHNldAorICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoaW50IGVsKSB7CisgICAgICAgICAgICBpbnQgbiA9IFdvcmROdW1iZXIoZWwpOworICAgICAgICAgICAgaWYgKG4gPCBfYml0cy5MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBfYml0c1tuXSAmPSB+Qml0TWFzayhlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc05pbCgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBfYml0cy5MZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChfYml0c1tpXSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBOdW1Xb3Jkc1RvSG9sZChpbnQgZWwpIHsKKyAgICAgICAgICAgIHJldHVybiAoZWwgPj4gTE9HX0JJVFMpICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgTnVtQml0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBfYml0cy5MZW5ndGggPDwgTE9HX0JJVFM7IC8vIG51bSB3b3JkcyAqIGJpdHMgcGVyIHdvcmQKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5yZXR1cm4gaG93IG11Y2ggc3BhY2UgaXMgYmVpbmcgdXNlZCBieSB0aGUgYml0cyBhcnJheSBub3QgaG93IG1hbnkgYWN0dWFsbHkgaGF2ZSBtZW1iZXIgYml0cyBvbi48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBpbnQgTGVuZ3RoSW5Mb25nV29yZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gX2JpdHMuTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLyoqSXMgdGhpcyBjb250YWluZWQgd2l0aGluIGE/ICovCisgICAgICAgIC8qCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1YnNldChCaXRTZXQgYSkgeworICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCAhKGEgaW5zdGFuY2VvZiBCaXRTZXQpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5hbmQoYSkuZXF1YWxzKHRoaXMpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgcHVibGljIGludFtdIFRvQXJyYXkoKSB7CisgICAgICAgICAgICBpbnRbXSBlbGVtcyA9IG5ldyBpbnRbU2l6ZSgpXTsKKyAgICAgICAgICAgIGludCBlbiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChfYml0cy5MZW5ndGggPDwgTE9HX0JJVFMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVtYmVyKGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zW2VuKytdID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZWxlbXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgV29yZE51bWJlcihpbnQgYml0KSB7CisgICAgICAgICAgICByZXR1cm4gYml0ID4+IExPR19CSVRTOyAvLyBiaXQgLyBCSVRTCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBUb1N0cmluZyhzdHJpbmdbXSB0b2tlbk5hbWVzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzdHJpbmcgc2VwYXJhdG9yID0gIiwiOworICAgICAgICAgICAgYm9vbCBoYXZlUHJpbnRlZEFuRWxlbWVudCA9IGZhbHNlOworICAgICAgICAgICAgYnVmLkFwcGVuZCgneycpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChfYml0cy5MZW5ndGggPDwgTE9HX0JJVFMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVtYmVyKGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBoYXZlUHJpbnRlZEFuRWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbk5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQodG9rZW5OYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhdmVQcmludGVkQW5FbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuQXBwZW5kKCd9Jyk7CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9CdWZmZXJlZFRva2VuU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQnVmZmVyZWRUb2tlblN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY2Njk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQnVmZmVyZWRUb2tlblN0cmVhbS5jcwpAQCAtMCwwICsxLDM3MiBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgQ0xTQ29tcGxpYW50ID0gU3lzdGVtLkNMU0NvbXBsaWFudEF0dHJpYnV0ZTsKKyAgICB1c2luZyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gPSBTeXN0ZW0uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uOworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisgICAgLyoqIEJ1ZmZlciBhbGwgaW5wdXQgdG9rZW5zIGJ1dCBkbyBvbi1kZW1hbmQgZmV0Y2hpbmcgb2YgbmV3IHRva2VucyBmcm9tCisgICAgICogIGxleGVyLiBVc2VmdWwgd2hlbiB0aGUgcGFyc2VyIG9yIGxleGVyIGhhcyB0byBzZXQgY29udGV4dC9tb2RlIGluZm8gYmVmb3JlCisgICAgICogIHByb3BlciBsZXhpbmcgb2YgZnV0dXJlIHRva2Vucy4gVGhlIFNUIHRlbXBsYXRlIHBhcnNlciBuZWVkcyB0aGlzLAorICAgICAqICBmb3IgZXhhbXBsZSwgYmVjYXVzZSBpdCBoYXMgdG8gY29uc3RhbnRseSBmbGlwIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4KKyAgICAgKiAgaW5zaWRlL291dHB1dCB0ZW1wbGF0ZXMuIEUuZy4sIDxuYW1lczp7aGksIDxpdD59PiBoYXMgdG8gcGFyc2UgbmFtZXMKKyAgICAgKiAgYXMgcGFydCBvZiBhbiBleHByZXNzaW9uIGJ1dCAiaGksIDxpdD4iIGFzIGEgbmVzdGVkIHRlbXBsYXRlLgorICAgICAqCisgICAgICogIFlvdSBjYW4ndCB1c2UgdGhpcyBzdHJlYW0gaWYgeW91IHBhc3Mgd2hpdGVzcGFjZSBvciBvdGhlciBvZmYtY2hhbm5lbAorICAgICAqICB0b2tlbnMgdG8gdGhlIHBhcnNlci4gVGhlIHN0cmVhbSBjYW4ndCBpZ25vcmUgb2ZmLWNoYW5uZWwgdG9rZW5zLgorICAgICAqICAoVW5idWZmZXJlZFRva2VuU3RyZWFtIGlzIHRoZSBzYW1lIHdheS4pCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyBub3QgYSBzdWJjbGFzcyBvZiBVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0gYmVjYXVzZSBJIGRvbid0IHdhbnQKKyAgICAgKiAgdG8gY29uZnVzZSBzbWFsbCBtb3Zpbmcgd2luZG93IG9mIHRva2VucyBpdCB1c2VzIGZvciB0aGUgZnVsbCBidWZmZXIuCisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEJ1ZmZlcmVkVG9rZW5TdHJlYW0gOiBJVG9rZW5TdHJlYW0sIElUb2tlblN0cmVhbUluZm9ybWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBJVG9rZW5Tb3VyY2UgX3Rva2VuU291cmNlOworCisgICAgICAgIC8qKiBSZWNvcmQgZXZlcnkgc2luZ2xlIHRva2VuIHB1bGxlZCBmcm9tIHRoZSBzb3VyY2Ugc28gd2UgY2FuIHJlcHJvZHVjZQorICAgICAgICAgKiAgY2h1bmtzIG9mIGl0IGxhdGVyLiAgVGhlIGJ1ZmZlciBpbiBMb29rYWhlYWRTdHJlYW0gb3ZlcmxhcHMgc29tZXRpbWVzCisgICAgICAgICAqICBhcyBpdHMgbW92aW5nIHdpbmRvdyBtb3ZlcyB0aHJvdWdoIHRoZSBpbnB1dC4gIFRoaXMgbGlzdCBjYXB0dXJlcworICAgICAgICAgKiAgZXZlcnl0aGluZyBzbyB3ZSBjYW4gYWNjZXNzIGNvbXBsZXRlIGlucHV0IHRleHQuCisgICAgICAgICAqLworICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0KKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8SVRva2VuPiBfdG9rZW5zID0gbmV3IExpc3Q8SVRva2VuPigxMDApOworCisgICAgICAgIC8qKiBUcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS4gKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2xhc3RNYXJrZXI7CisKKyAgICAgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAgICAgKiAgdG8gY29uc3VtZSkuICB0b2tlbnNbcF0gc2hvdWxkIGJlIExUKDEpLiAgcD0tMSBpbmRpY2F0ZXMgbmVlZAorICAgICAgICAgKiAgdG8gaW5pdGlhbGl6ZSB3aXRoIGZpcnN0IHRva2VuLiAgVGhlIGN0b3IgZG9lc24ndCBnZXQgYSB0b2tlbi4KKyAgICAgICAgICogIEZpcnN0IGNhbGwgdG8gTFQoMSkgb3Igd2hhdGV2ZXIgZ2V0cyB0aGUgZmlyc3QgdG9rZW4gYW5kIHNldHMgcD0wOworICAgICAgICAgKi8KKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldCisgICAgICAgIHByb3RlY3RlZCBpbnQgX3AgPSAtMTsKKworICAgICAgICBwdWJsaWMgQnVmZmVyZWRUb2tlblN0cmVhbSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWZmZXJlZFRva2VuU3RyZWFtKElUb2tlblNvdXJjZSB0b2tlblNvdXJjZSkgeworICAgICAgICAgICAgdGhpcy5fdG9rZW5Tb3VyY2UgPSB0b2tlblNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlblNvdXJjZSBUb2tlblNvdXJjZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuU291cmNlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX3Rva2Vucy5DbGVhcigpOworICAgICAgICAgICAgICAgIF9wID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgSW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBIb3cgZGVlcCBoYXZlIHdlIGdvbmU/CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBSYW5nZSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90b2tlbnMuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW5Tb3VyY2UuU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBMYXN0VG9rZW4geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTGFzdFJlYWxUb2tlbiB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBJVG9rZW4gdG9rZW47CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gTEIoaSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodG9rZW4gIT0gbnVsbCAmJiB0b2tlbi5MaW5lIDw9IDApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1heExvb2tCZWhpbmQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Lk1heFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1hcmsoKSB7CisgICAgICAgICAgICBpZiAoX3AgPT0gLTEpCisgICAgICAgICAgICAgICAgU2V0dXAoKTsKKyAgICAgICAgICAgIF9sYXN0TWFya2VyID0gSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gX2xhc3RNYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlbGVhc2UoaW50IG1hcmtlcikgeworICAgICAgICAgICAgLy8gbm8gcmVzb3VyY2VzIHRvIHJlbGVhc2UKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKGludCBtYXJrZXIpIHsKKyAgICAgICAgICAgIFNlZWsobWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkgeworICAgICAgICAgICAgU2VlayhfbGFzdE1hcmtlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlc2V0KCkgeworICAgICAgICAgICAgX3AgPSAwOworICAgICAgICAgICAgX2xhc3RNYXJrZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZWVrKGludCBpbmRleCkgeworICAgICAgICAgICAgX3AgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNb3ZlIHRoZSBpbnB1dCBwb2ludGVyIHRvIHRoZSBuZXh0IGluY29taW5nIHRva2VuLiAgVGhlIHN0cmVhbQorICAgICAgICAgKiAgbXVzdCBiZWNvbWUgYWN0aXZlIHdpdGggTFQoMSkgYXZhaWxhYmxlLiAgY29uc3VtZSgpIHNpbXBseQorICAgICAgICAgKiAgbW92ZXMgdGhlIGlucHV0IHBvaW50ZXIgc28gdGhhdCBMVCgxKSBwb2ludHMgYXQgdGhlIG5leHQKKyAgICAgICAgICogIGlucHV0IHN5bWJvbC4gQ29uc3VtZSBhdCBsZWFzdCBvbmUgdG9rZW4uCisgICAgICAgICAqCisgICAgICAgICAqICBXYWxrIHBhc3QgYW55IHRva2VuIG5vdCBvbiB0aGUgY2hhbm5lbCB0aGUgcGFyc2VyIGlzIGxpc3RlbmluZyB0by4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgX3ArKzsKKyAgICAgICAgICAgIFN5bmMoX3ApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2Ugc3VyZSBpbmRleCBpIGluIHRva2VucyBoYXMgYSB0b2tlbi4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTeW5jKGludCBpKSB7CisgICAgICAgICAgICBpbnQgbiA9IGkgLSBfdG9rZW5zLkNvdW50ICsgMTsgLy8gaG93IG1hbnkgbW9yZSBlbGVtZW50cyB3ZSBuZWVkPworICAgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgICAgIEZldGNoKG4pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIGFkZCBuIGVsZW1lbnRzIHRvIGJ1ZmZlciAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEZldGNoKGludCBuKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gVG9rZW5Tb3VyY2UuTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgdC5Ub2tlbkluZGV4ID0gX3Rva2Vucy5Db3VudDsKKyAgICAgICAgICAgICAgICBfdG9rZW5zLkFkZCh0KTsKKyAgICAgICAgICAgICAgICBpZiAodC5UeXBlID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBHZXQoaW50IGkpIHsKKyAgICAgICAgICAgIGlmIChpIDwgMCB8fCBpID49IF90b2tlbnMuQ291bnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCJ0b2tlbiBpbmRleCAiICsgaSArICIgb3V0IG9mIHJhbmdlIDAuLiIgKyAoX3Rva2Vucy5Db3VudCAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zW2ldOworICAgICAgICB9CisKKyNpZiBmYWxzZSAvLyB3aHkgaXMgdGhpcyBkaWZmZXJlbnQgZnJvbSBHZXRUb2tlbnMoc3RhcnQsIGNvdW50KSA/CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldCBhbGwgdG9rZW5zIGZyb20gc3RhcnQuLihzdGFydCtjb3VudC0xKSBpbmNsdXNpdmVseQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PElUb2tlbj4gR2V0KGludCBzdGFydCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInN0YXJ0Iik7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvdW50Iik7CisgICAgICAgICAgICBpZiAoc3RhcnQgKyBjb3VudCA+PSBfdG9rZW5zLkNvdW50KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoX3AgPT0gLTEpCisgICAgICAgICAgICAgICAgU2V0dXAoKTsKKworICAgICAgICAgICAgTGlzdDxJVG9rZW4+IHN1YnNldCA9IG5ldyBMaXN0PElUb2tlbj4oY291bnQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUb2tlbiB0b2tlbiA9IF90b2tlbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgPT0gVG9rZW5UeXBlcy5FbmRPZkZpbGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgc3Vic2V0LkFkZCh0b2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdWJzZXQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBMQShpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIExUKGkpLlR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBJVG9rZW4gTEIoaW50IGspIHsKKyAgICAgICAgICAgIGlmICgoX3AgLSBrKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zW19wIC0ga107CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTFQoaW50IGspIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoLWspOworCisgICAgICAgICAgICBpbnQgaSA9IF9wICsgayAtIDE7CisgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgaWYgKGkgPj0gX3Rva2Vucy5Db3VudCkgeworICAgICAgICAgICAgICAgIC8vIEVPRiBtdXN0IGJlIGxhc3QgdG9rZW4KKyAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2Vuc1tfdG9rZW5zLkNvdW50IC0gMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpID4gUmFuZ2UpCisgICAgICAgICAgICAgICAgUmFuZ2UgPSBpOworCisgICAgICAgICAgICByZXR1cm4gX3Rva2Vuc1tfcCArIGsgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgU2V0dXAoKSB7CisgICAgICAgICAgICBTeW5jKDApOworICAgICAgICAgICAgX3AgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucygpIHsKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucyhpbnQgc3RhcnQsIGludCBzdG9wKSB7CisgICAgICAgICAgICByZXR1cm4gR2V0VG9rZW5zKHN0YXJ0LCBzdG9wLCBkZWZhdWx0KEJpdFNldCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEdpdmVuIGEgc3RhcnQgYW5kIHN0b3AgaW5kZXgsIHJldHVybiBhIExpc3Qgb2YgYWxsIHRva2VucyBpbgorICAgICAgICAgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgICAgICAgICAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucyhpbnQgc3RhcnQsIGludCBzdG9wLCBCaXRTZXQgdHlwZXMpIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgaWYgKHN0b3AgPj0gX3Rva2Vucy5Db3VudCkKKyAgICAgICAgICAgICAgICBzdG9wID0gX3Rva2Vucy5Db3VudCAtIDE7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGlmIChzdGFydCA+IHN0b3ApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIGxpc3QgPSB0b2tlbnNbc3RhcnQ6c3RvcF06e1Rva2VuIHQsIHQuZ2V0VHlwZSgpIGluIHR5cGVzfQorICAgICAgICAgICAgTGlzdDxJVG9rZW4+IGZpbHRlcmVkVG9rZW5zID0gbmV3IExpc3Q8SVRva2VuPigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gX3Rva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZXMgPT0gbnVsbCB8fCB0eXBlcy5NZW1iZXIodC5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFRva2Vucy5BZGQodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbHRlcmVkVG9rZW5zLkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZFRva2VucyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRUb2tlbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PElUb2tlbj4gR2V0VG9rZW5zKGludCBzdGFydCwgaW50IHN0b3AsIElFbnVtZXJhYmxlPGludD4gdHlwZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRUb2tlbnMoc3RhcnQsIHN0b3AsIG5ldyBCaXRTZXQodHlwZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIExpc3Q8SVRva2VuPiBHZXRUb2tlbnMoaW50IHN0YXJ0LCBpbnQgc3RvcCwgaW50IHR0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gR2V0VG9rZW5zKHN0YXJ0LCBzdG9wLCBCaXRTZXQuT2YodHR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAoX3AgPT0gLTEpCisgICAgICAgICAgICAgICAgU2V0dXAoKTsKKworICAgICAgICAgICAgRmlsbCgpOworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKDAsIF90b2tlbnMuQ291bnQgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1N0cmluZyhpbnQgc3RhcnQsIGludCBzdG9wKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwIHx8IHN0b3AgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKF9wID09IC0xKQorICAgICAgICAgICAgICAgIFNldHVwKCk7CisgICAgICAgICAgICBpZiAoc3RvcCA+PSBfdG9rZW5zLkNvdW50KQorICAgICAgICAgICAgICAgIHN0b3AgPSBfdG9rZW5zLkNvdW50IC0gMTsKKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gX3Rva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAodC5UeXBlID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHQuVGV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1N0cmluZyhJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiBzdG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoc3RhcnQuVG9rZW5JbmRleCwgc3RvcC5Ub2tlbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGaWxsKCkgeworICAgICAgICAgICAgaWYgKF9wID09IC0xKQorICAgICAgICAgICAgICAgIFNldHVwKCk7CisKKyAgICAgICAgICAgIGlmIChfdG9rZW5zW19wXS5UeXBlID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGkgPSBfcCArIDE7CisgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgd2hpbGUgKF90b2tlbnNbaV0uVHlwZSAhPSBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZSkgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ2hhclN0cmVhbUNvbnN0YW50cy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0NoYXJTdHJlYW1Db25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkMmY5OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0NoYXJTdHJlYW1Db25zdGFudHMuY3MKQEAgLTAsMCArMSwzOSBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoYXJTdHJlYW1Db25zdGFudHMgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVuZE9mRmlsZSA9IC0xOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGZhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9DaGFyU3RyZWFtU3RhdGUuY3MKQEAgLTAsMCArMSw1NyBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtOworCQorCS8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhpcyBpcyB0aGUgY29tcGxldGUgc3RhdGUgb2YgYSBzdHJlYW0uCisgICAgLy8vIAorICAgIC8vLyBXaGVuIHdhbGtpbmcgYWhlYWQgd2l0aCBjeWNsaWMgREZBIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcywgd2UgCisgICAgLy8vIG5lZWQgdG8gcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtIChjaGFyIGluZGV4LCBsaW5lLCAKKyAgICAvLy8gZXRjLi4uKSBzbyB0aGF0IHdlIGNhbiByZXdpbmQgdGhlIHN0YXRlIGFmdGVyIHNjYW5uaW5nIGFoZWFkLgorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGNsYXNzIENoYXJTdHJlYW1TdGF0ZQorCXsKKwkJLy8vIDxzdW1tYXJ5PkluZGV4IGludG8gdGhlIGNoYXIgc3RyZWFtIG9mIG5leHQgbG9va2FoZWFkIGNoYXIgPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBpbnQgcDsKKwkJCisJCS8vLyA8c3VtbWFyeT5XaGF0IGxpbmUgbnVtYmVyIGlzIHRoZSBzY2FubmVyIGF0IGJlZm9yZSBwcm9jZXNzaW5nIGJ1ZmZlcltwXT8gPC9zdW1tYXJ5PgorCQlpbnRlcm5hbCBpbnQgbGluZTsKKwkJCisJCS8vLyA8c3VtbWFyeT5XaGF0IGNoYXIgcG9zaXRpb24gMC4ubi0xIGluIGxpbmUgaXMgc2Nhbm5lciBiZWZvcmUgcHJvY2Vzc2luZyBidWZmZXJbcF0/IDwvc3VtbWFyeT4KKwkJaW50ZXJuYWwgaW50IGNoYXJQb3NpdGlvbkluTGluZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ2xhc3NpY1Rva2VuLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ2xhc3NpY1Rva2VuLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWIzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9DbGFzc2ljVG9rZW4uY3MKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBUb2tlbiBvYmplY3QgbGlrZSB3ZSdkIHVzZSBpbiBBTlRMUiAyLng7IGhhcyBhbiBhY3R1YWwgc3RyaW5nIGNyZWF0ZWQKKyAgICAgKiAgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gIFRoZXNlIG9iamVjdHMgYXJlIG5lZWRlZCBmb3IgaW1hZ2luYXJ5CisgICAgICogIHRyZWUgbm9kZXMgdGhhdCBoYXZlIHBheWxvYWQgb2JqZWN0cy4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgVG9rZW4gb2JqZWN0CisgICAgICogIHRoYXQgaGFzIGEgc3RyaW5nOyB0aGUgdHJlZSBub2RlIHdpbGwgcG9pbnQgYXQgdGhpcyB0b2tlbi4gIENvbW1vblRva2VuCisgICAgICogIGhhcyBpbmRleGVzIGludG8gYSBjaGFyIHN0cmVhbSBhbmQgaGVuY2UgY2Fubm90IGJlIHVzZWQgdG8gaW50cm9kdWNlCisgICAgICogIG5ldyBzdHJpbmdzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENsYXNzaWNUb2tlbiA6IElUb2tlbiB7CisgICAgICAgIHN0cmluZyB0ZXh0OworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIGludCBjaGFubmVsID0gVG9rZW5DaGFubmVscy5EZWZhdWx0OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IHRva2VuIG51bWJlciBpcyB0aGlzIGZyb20gMC4ubi0xIHRva2Vuczwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IGluZGV4OworCisgICAgICAgIHB1YmxpYyBDbGFzc2ljVG9rZW4oaW50IHR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NpY1Rva2VuKElUb2tlbiBvbGRUb2tlbikgeworICAgICAgICAgICAgdGV4dCA9IG9sZFRva2VuLlRleHQ7CisgICAgICAgICAgICB0eXBlID0gb2xkVG9rZW4uVHlwZTsKKyAgICAgICAgICAgIGxpbmUgPSBvbGRUb2tlbi5MaW5lOworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gb2xkVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgY2hhbm5lbCA9IG9sZFRva2VuLkNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NpY1Rva2VuKGludCB0eXBlLCBzdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NpY1Rva2VuKGludCB0eXBlLCBzdHJpbmcgdGV4dCwgaW50IGNoYW5uZWwpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gSVRva2VuIE1lbWJlcnMKKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHRleHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVHlwZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICB0eXBlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IExpbmUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgbGluZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDaGFyUG9zaXRpb25JbkxpbmUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ2hhbm5lbCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFN0YXJ0SW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBTdG9wSW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUb2tlbkluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDaGFyU3RyZWFtIElucHV0U3RyZWFtIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICBzdHJpbmcgY2hhbm5lbFN0ciA9ICIiOworICAgICAgICAgICAgaWYgKGNoYW5uZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbFN0ciA9ICIsY2hhbm5lbD0iICsgY2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZyB0eHQgPSBUZXh0OworICAgICAgICAgICAgaWYgKHR4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoIlxuIiwgIlxcXFxuIik7CisgICAgICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoIlxyIiwgIlxcXFxyIik7CisgICAgICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoIlx0IiwgIlxcXFx0Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR4dCA9ICI8bm8gdGV4dD4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJbQCIgKyBUb2tlbkluZGV4ICsgIiwnIiArIHR4dCArICInLDwiICsgdHlwZSArICI+IiArIGNoYW5uZWxTdHIgKyAiLCIgKyBsaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lICsgIl0iOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ29tbW9uVG9rZW4uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9Db21tb25Ub2tlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWE2M2JkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ29tbW9uVG9rZW4uY3MKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIE5vblNlcmlhbGl6ZWQgPSBTeXN0ZW0uTm9uU2VyaWFsaXplZEF0dHJpYnV0ZTsKKyAgICB1c2luZyBSZWdleCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleDsKKyAgICB1c2luZyBTZXJpYWxpemFibGUgPSBTeXN0ZW0uU2VyaWFsaXphYmxlQXR0cmlidXRlOworCisgICAgW1NlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQ29tbW9uVG9rZW4gOiBJVG9rZW4geworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjaGFyUG9zaXRpb25JbkxpbmUgPSAtMTsgLy8gc2V0IHRvIGludmFsaWQgcG9zaXRpb24KKyAgICAgICAgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgIFtOb25TZXJpYWxpemVkXQorICAgICAgICBJQ2hhclN0cmVhbSBpbnB1dDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXZSBuZWVkIHRvIGJlIGFibGUgdG8gY2hhbmdlIHRoZSB0ZXh0IG9uY2UgaW4gYSB3aGlsZS4gIElmCisgICAgICAgICAqICB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGdldFRleHQgc2hvdWxkIHJldHVybiB0aGlzLiAgTm90ZSB0aGF0CisgICAgICAgICAqICBzdGFydC9zdG9wIGFyZSBub3QgYWZmZWN0ZWQgYnkgY2hhbmdpbmcgdGhpcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICAqLworICAgICAgICBzdHJpbmcgdGV4dDsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCB0b2tlbiBudW1iZXIgaXMgdGhpcyBmcm9tIDAuLm4tMSB0b2tlbnM7ICZsdDsgMCBpbXBsaWVzIGludmFsaWQgaW5kZXg8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBpbmRleCA9IC0xOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdGFydHM8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBzdGFydDsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGNoYXIgcG9zaXRpb24gaW50byB0aGUgaW5wdXQgYnVmZmVyIHdoZXJlIHRoaXMgdG9rZW4gc3RvcHM8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBzdG9wOworCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbihpbnQgdHlwZSkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbihJQ2hhclN0cmVhbSBpbnB1dCwgaW50IHR5cGUsIGludCBjaGFubmVsLCBpbnQgc3RhcnQsIGludCBzdG9wKSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIHRoaXMuc3RvcCA9IHN0b3A7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tbW9uVG9rZW4oaW50IHR5cGUsIHN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gVG9rZW5DaGFubmVscy5EZWZhdWx0OworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbihJVG9rZW4gb2xkVG9rZW4pIHsKKyAgICAgICAgICAgIHRleHQgPSBvbGRUb2tlbi5UZXh0OworICAgICAgICAgICAgdHlwZSA9IG9sZFRva2VuLlR5cGU7CisgICAgICAgICAgICBsaW5lID0gb2xkVG9rZW4uTGluZTsKKyAgICAgICAgICAgIGluZGV4ID0gb2xkVG9rZW4uVG9rZW5JbmRleDsKKyAgICAgICAgICAgIGNoYXJQb3NpdGlvbkluTGluZSA9IG9sZFRva2VuLkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgIGNoYW5uZWwgPSBvbGRUb2tlbi5DaGFubmVsOworICAgICAgICAgICAgaW5wdXQgPSBvbGRUb2tlbi5JbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIGlmIChvbGRUb2tlbiBpcyBDb21tb25Ub2tlbikgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gKChDb21tb25Ub2tlbilvbGRUb2tlbikuc3RhcnQ7CisgICAgICAgICAgICAgICAgc3RvcCA9ICgoQ29tbW9uVG9rZW4pb2xkVG9rZW4pLnN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIElUb2tlbiBNZW1iZXJzCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IGlucHV0LkNvdW50ICYmIHN0b3AgPCBpbnB1dC5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGlucHV0LlN1YnN0cmluZyhzdGFydCwgc3RvcCAtIHN0YXJ0ICsgMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIjxFT0Y+IjsKKworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICAvKiogT3ZlcnJpZGUgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4uICBnZXRUZXh0KCkgd2lsbCByZXR1cm4gdGhpcyB0ZXh0CisgICAgICAgICAgICAgICAgICogIHJhdGhlciB0aGFuIHB1bGxpbmcgZnJvbSB0aGUgYnVmZmVyLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbWVhbgorICAgICAgICAgICAgICAgICAqICB0aGF0IHN0YXJ0L3N0b3AgaW5kZXhlcyBhcmUgbm90IHZhbGlkLiAgSXQgbWVhbnMgdGhhdCB0aGF0IGlucHV0CisgICAgICAgICAgICAgICAgICogIHdhcyBjb252ZXJ0ZWQgdG8gYSBuZXcgc3RyaW5nIGluIHRoZSB0b2tlbiBvYmplY3QuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdGV4dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUeXBlIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHR5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgTGluZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBsaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENoYXJQb3NpdGlvbkluTGluZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGNoYXJQb3NpdGlvbkluTGluZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDaGFubmVsIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU3RhcnRJbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU3RvcEluZGV4IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIHN0b3AgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVG9rZW5JbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgaW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJQ2hhclN0cmVhbSBJbnB1dFN0cmVhbSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgaW5wdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgc3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsID4gMCkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxTdHIgPSAiLGNoYW5uZWw9IiArIGNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgdHh0ID0gVGV4dDsKKyAgICAgICAgICAgIGlmICh0eHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHR4dCA9IFJlZ2V4LlJlcGxhY2UodHh0LCAiXG4iLCAiXFxcXG4iKTsKKyAgICAgICAgICAgICAgICB0eHQgPSBSZWdleC5SZXBsYWNlKHR4dCwgIlxyIiwgIlxcXFxyIik7CisgICAgICAgICAgICAgICAgdHh0ID0gUmVnZXguUmVwbGFjZSh0eHQsICJcdCIsICJcXFxcdCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eHQgPSAiPG5vIHRleHQ+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiW0AiICsgVG9rZW5JbmRleCArICIsIiArIHN0YXJ0ICsgIjoiICsgc3RvcCArICI9JyIgKyB0eHQgKyAiJyw8IiArIHR5cGUgKyAiPiIgKyBjaGFubmVsU3RyICsgIiwiICsgbGluZSArICI6IiArIENoYXJQb3NpdGlvbkluTGluZSArICJdIjsKKyAgICAgICAgfQorCisgICAgICAgIFtTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLk9uU2VyaWFsaXppbmddCisgICAgICAgIGludGVybmFsIHZvaWQgT25TZXJpYWxpemluZyhTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0ZXh0ID0gVGV4dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwMDBjYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHVzaW5nIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gPSBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhlIG1vc3QgY29tbW9uIHN0cmVhbSBvZiB0b2tlbnMgaXMgb25lIHdoZXJlIGV2ZXJ5IHRva2VuIGlzIGJ1ZmZlcmVkIHVwCisgICAgICogIGFuZCB0b2tlbnMgYXJlIHByZWZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKKyAgICAgKiAgc2VlIHRoZXNlIHRva2VucyBhbmQgY2Fubm90IGNoYW5nZSB0aGUgZmlsdGVyIGNoYW5uZWwgbnVtYmVyIGR1cmluZyB0aGUKKyAgICAgKiAgcGFyc2UpLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+VE9ETzogaG93IHRvIGFjY2VzcyB0aGUgZnVsbCB0b2tlbiBzdHJlYW0/ICBIb3cgdG8gdHJhY2sgYWxsIHRva2VucyBtYXRjaGVkIHBlciBydWxlPzwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQ29tbW9uVG9rZW5TdHJlYW0gOiBCdWZmZXJlZFRva2VuU3RyZWFtIHsKKyAgICAgICAgLyoqIFNraXAgdG9rZW5zIG9uIGFueSBjaGFubmVsIGJ1dCB0aGlzIG9uZTsgdGhpcyBpcyBob3cgd2Ugc2tpcCB3aGl0ZXNwYWNlLi4uICovCisgICAgICAgIHByaXZhdGUgaW50IF9jaGFubmVsOworCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpCisgICAgICAgICAgICA6IHRoaXModG9rZW5Tb3VyY2UsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbW1vblRva2VuU3RyZWFtKElUb2tlblNvdXJjZSB0b2tlblNvdXJjZSwgaW50IGNoYW5uZWwpCisgICAgICAgICAgICA6IGJhc2UodG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDaGFubmVsIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIFJlc2V0IHRoaXMgdG9rZW4gc3RyZWFtIGJ5IHNldHRpbmcgaXRzIHRva2VuIHNvdXJjZS4gKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElUb2tlblNvdXJjZSBUb2tlblNvdXJjZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLlRva2VuU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBiYXNlLlRva2VuU291cmNlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX2NoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogQWx3YXlzIGxlYXZlIHAgb24gYW4gb24tY2hhbm5lbCB0b2tlbi4gKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZSgpIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgX3ArKzsKKyAgICAgICAgICAgIFN5bmMoX3ApOworICAgICAgICAgICAgd2hpbGUgKF90b2tlbnNbX3BdLkNoYW5uZWwgIT0gX2NoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICBfcCsrOworICAgICAgICAgICAgICAgIFN5bmMoX3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIElUb2tlbiBMQihpbnQgaykgeworICAgICAgICAgICAgaWYgKGsgPT0gMCB8fCAoX3AgLSBrKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGludCBpID0gX3A7CisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKKyAgICAgICAgICAgIHdoaWxlIChuIDw9IGspIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworICAgICAgICAgICAgICAgIGkgPSBTa2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoaSAtIDEpOworICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zW2ldOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElUb2tlbiBMVChpbnQgaykgeworICAgICAgICAgICAgaWYgKF9wID09IC0xKQorICAgICAgICAgICAgICAgIFNldHVwKCk7CisgICAgICAgICAgICBpZiAoayA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBMQigtayk7CisgICAgICAgICAgICBpbnQgaSA9IF9wOworICAgICAgICAgICAgaW50IG4gPSAxOyAvLyB3ZSBrbm93IHRva2Vuc1twXSBpcyBhIGdvb2Qgb25lCisgICAgICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMKKyAgICAgICAgICAgIHdoaWxlIChuIDwgaykgeworICAgICAgICAgICAgICAgIC8vIHNraXAgb2ZmLWNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICAgICAgaSA9IFNraXBPZmZUb2tlbkNoYW5uZWxzKGkgKyAxKTsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpID4gUmFuZ2UpCisgICAgICAgICAgICAgICAgUmFuZ2UgPSBpOworCisgICAgICAgICAgICByZXR1cm4gX3Rva2Vuc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBHaXZlbiBhIHN0YXJ0aW5nIGluZGV4LCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvbi1jaGFubmVsCisgICAgICAgICAqICB0b2tlbi4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBTa2lwT2ZmVG9rZW5DaGFubmVscyhpbnQgaSkgeworICAgICAgICAgICAgU3luYyhpKTsKKyAgICAgICAgICAgIHdoaWxlIChfdG9rZW5zW2ldLkNoYW5uZWwgIT0gX2NoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBhbHNvIHN0b3BzIGF0IEVPRiAoaXQncyBvbiBjaGFubmVsKQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGludCBpKSB7CisgICAgICAgICAgICB3aGlsZSAoaSA+PSAwICYmICgoSVRva2VuKV90b2tlbnNbaV0pLkNoYW5uZWwgIT0gX2NoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgU2V0dXAoKSB7CisgICAgICAgICAgICBfcCA9IDA7CisgICAgICAgICAgICBTeW5jKDApOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKF90b2tlbnNbaV0uQ2hhbm5lbCAhPSBfY2hhbm5lbCkgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3AgPSBpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ29uc3RhbnRzLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvQ29uc3RhbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTQ0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9Db25zdGFudHMuY3MKQEAgLTAsMCArMSw1MSBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtOworCQorCS8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2xvYmFsIGNvbnN0YW50cworCS8vLyA8L3N1bW1hcnk+CisJaW50ZXJuYWwgc2VhbGVkIGNsYXNzIENvbnN0YW50cworICAgIHsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBzdHJpbmcgVkVSU0lPTgkJCQkJPSAiMy4xYjEiOworCisJCS8vIE1vdmVkIHRvIHZlcnNpb24gMiBmb3IgdjMuMTogYWRkZWQgZ3JhbW1hciBuYW1lIHRvIGVudGVyL2V4aXQgUnVsZQorCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0cmluZyBERUJVR19QUk9UT0NPTF9WRVJTSU9OCT0gIjIiOworCisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIEFOVExSV09SS1NfRElSCQkJPSAiYW50bHJ3b3JrcyI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0RGQS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0RGQS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRjOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvREZBLmNzCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBDb25kaXRpb25hbEF0dHJpYnV0ZSA9IFN5c3RlbS5EaWFnbm9zdGljcy5Db25kaXRpb25hbEF0dHJpYnV0ZTsKKyAgICB1c2luZyBDb25zb2xlID0gU3lzdGVtLkNvbnNvbGU7CisgICAgdXNpbmcgSURlYnVnRXZlbnRMaXN0ZW5lciA9IEFudGxyLlJ1bnRpbWUuRGVidWcuSURlYnVnRXZlbnRMaXN0ZW5lcjsKKworICAgIHB1YmxpYyBkZWxlZ2F0ZSBpbnQgU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIoREZBIGRmYSwgaW50IHMsIElJbnRTdHJlYW0gaW5wdXQpOworCisgICAgLyoqIDxzdW1tYXJ5PkEgREZBIGltcGxlbWVudGVkIGFzIGEgc2V0IG9mIHRyYW5zaXRpb24gdGFibGVzLjwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgQW55IHN0YXRlIHRoYXQgaGFzIGEgc2VtYW50aWMgcHJlZGljYXRlIGVkZ2UgaXMgc3BlY2lhbDsgdGhvc2Ugc3RhdGVzCisgICAgICogIGFyZSBnZW5lcmF0ZWQgd2l0aCBpZi10aGVuLWVsc2Ugc3RydWN0dXJlcyBpbiBhIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oKQorICAgICAqICB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgY3ljbGljREZBIHRlbXBsYXRlLgorICAgICAqCisgICAgICogIFRoZXJlIGFyZSBhdCBtb3N0IDMyNzY3IHN0YXRlcyAoMTYtYml0IHNpZ25lZCBzaG9ydCkuCisgICAgICogIENvdWxkIGdldCBhd2F5IHdpdGggYnl0ZSBzb21ldGltZXMgYnV0IHdvdWxkIGhhdmUgdG8gZ2VuZXJhdGUgZGlmZmVyZW50CisgICAgICogIHR5cGVzIGFuZCB0aGUgc2ltdWxhdGlvbiBjb2RlIHRvby4gIEZvciBhIHBvaW50IG9mIHJlZmVyZW5jZSwgdGhlIEphdmEKKyAgICAgKiAgbGV4ZXIncyBUb2tlbnMgcnVsZSBERkEgaGFzIDMyNiBzdGF0ZXMgcm91Z2hseS4KKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBERkEgeworICAgICAgICBwdWJsaWMgREZBKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIoU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkRlZmF1bHQpKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIERGQShTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlciBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKSB7CisgICAgICAgICAgICB0aGlzLlNwZWNpYWxTdGF0ZVRyYW5zaXRpb24gPSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uID8/IG5ldyBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlcihTcGVjaWFsU3RhdGVUcmFuc2l0aW9uRGVmYXVsdCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgc2hvcnRbXSBlb3Q7CisgICAgICAgIHByb3RlY3RlZCBzaG9ydFtdIGVvZjsKKyAgICAgICAgcHJvdGVjdGVkIGNoYXJbXSBtaW47CisgICAgICAgIHByb3RlY3RlZCBjaGFyW10gbWF4OworICAgICAgICBwcm90ZWN0ZWQgc2hvcnRbXSBhY2NlcHQ7CisgICAgICAgIHByb3RlY3RlZCBzaG9ydFtdIHNwZWNpYWw7CisgICAgICAgIHByb3RlY3RlZCBzaG9ydFtdW10gdHJhbnNpdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IGRlY2lzaW9uTnVtYmVyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGljaCByZWNvZ25pemVyIGVuY2xvc2VzIHRoaXMgREZBPyAgTmVlZGVkIHRvIGNoZWNrIGJhY2t0cmFja2luZzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXI7CisKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvb2wgZGVidWcgPSBmYWxzZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBGcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHByZWRpY3Qgd2hhdCBhbHRlcm5hdGl2ZSB3aWxsIHN1Y2NlZWQKKyAgICAgICAgICogIHVzaW5nIHRoaXMgREZBIChyZXByZXNlbnRpbmcgdGhlIGNvdmVyaW5nIHJlZ3VsYXIgYXBwcm94aW1hdGlvbgorICAgICAgICAgKiAgdG8gdGhlIHVuZGVybHlpbmcgQ0ZMKS4gIFJldHVybiBhbiBhbHRlcm5hdGl2ZSBudW1iZXIgMS4ubi4gIFRocm93CisgICAgICAgICAqICBhbiBleGNlcHRpb24gdXBvbiBlcnJvci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBQcmVkaWN0KElJbnRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJFbnRlciBERkEucHJlZGljdCBmb3IgZGVjaXNpb24gIiArIGRlY2lzaW9uTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtYXJrID0gaW5wdXQuTWFyaygpOyAvLyByZW1lbWJlciB3aGVyZSBkZWNpc2lvbiBzdGFydGVkIGluIGlucHV0CisgICAgICAgICAgICBpbnQgcyA9IDA7IC8vIHdlIGFsd2F5cyBzdGFydCBhdCBzMAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIkRGQSAiICsgZGVjaXNpb25OdW1iZXIgKyAiIHN0YXRlICIgKyBzICsgIiBMQSgxKT0iICsgKGNoYXIpaW5wdXQuTEEoMSkgKyAiKCIgKyBpbnB1dC5MQSgxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksIGluZGV4PSIgKyBpbnB1dC5JbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGVjaWFsU3RhdGUgPSBzcGVjaWFsW3NdOworICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY2lhbFN0YXRlID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJERkEgIiArIGRlY2lzaW9uTnVtYmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSAiICsgcyArICIgaXMgc3BlY2lhbCBzdGF0ZSAiICsgc3BlY2lhbFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uKHRoaXMsIHNwZWNpYWxTdGF0ZSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIkRGQSAiICsgZGVjaXNpb25OdW1iZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZnJvbSBzcGVjaWFsIHN0YXRlICIgKyBzcGVjaWFsU3RhdGUgKyAiIHRvICIgKyBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHQocywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdFtzXSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImFjY2VwdDsgcHJlZGljdCAiICsgYWNjZXB0W3NdICsgIiBmcm9tIHN0YXRlICIgKyBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NlcHRbc107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSBub3JtYWwgY2hhciB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKWlucHV0LkxBKDEpOyAvLyAtMSA9PSBcdUZGRkYsIGFsbCB0b2tlbnMgZml0IGluIDY1MDAwIHNwYWNlCisgICAgICAgICAgICAgICAgICAgIGlmIChjID49IG1pbltzXSAmJiBjIDw9IG1heFtzXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNuZXh0ID0gdHJhbnNpdGlvbltzXVtjIC0gbWluW3NdXTsgLy8gbW92ZSB0byBuZXh0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc25leHQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGluIHJhbmdlIGJ1dCBub3QgYSBub3JtYWwgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgY2hlY2sgRU9ULCB3aGljaCBpcyBsaWtlIHRoZSBlbHNlIGNsYXVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlb3Rbc10+PTAgaW5kaWNhdGVzIHRoYXQgYW4gRU9UIGVkZ2UgZ29lcyB0byBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVvdFtzXSA+PSAwKSB7ICAvLyBFT1QgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJFT1QgdHJhbnNpdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gZW90W3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEkgaGFkIHRoaXMgYXMgcmV0dXJuIGFjY2VwdFtlb3Rbc11dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFzc3VtZWQgaGVyZSB0aGF0IHRoZSBFT1QgZWRnZSBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VudCB0byBhbiBhY2NlcHQuLi5mYXN0ZXIgdG8gZG8gdGhpcywgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgYWJvdXQgcHJlZGljYXRlZCBlZGdlcyBjb21pbmcgZnJvbSBFT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHQocywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHNuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVvdFtzXSA+PSAwKSB7ICAvLyBFT1QgVHJhbnNpdGlvbj8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiRU9UIHRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBlb3Rbc107CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSB1bmNoZWNrZWQoKGNoYXIpVG9rZW5UeXBlcy5FbmRPZkZpbGUpICYmIGVvZltzXSA+PSAwKSB7ICAvLyBFT0YgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImFjY2VwdCB2aWEgRU9GOyBwcmVkaWN0ICIgKyBhY2NlcHRbZW9mW3NdXSArICIgZnJvbSAiICsgZW9mW3NdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NlcHRbZW9mW3NdXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBub3QgaW4gcmFuZ2UgYW5kIG5vdCBFT0YvRU9ULCBtdXN0IGJlIGludmFsaWQgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIm1pblsiICsgcyArICJdPSIgKyBtaW5bc10pOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIm1heFsiICsgcyArICJdPSIgKyBtYXhbc10pOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImVvdFsiICsgcyArICJdPSIgKyBlb3Rbc10pOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImVvZlsiICsgcyArICJdPSIgKyBlb2Zbc10pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCB0cmFuc2l0aW9uW3NdLkxlbmd0aDsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh0cmFuc2l0aW9uW3NdW3BdICsgIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHQocywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlucHV0LlJld2luZChtYXJrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgTm9WaWFibGVBbHQoaW50IHMsIElJbnRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIGlmIChyZWNvZ25pemVyLnN0YXRlLmJhY2t0cmFja2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICByZWNvZ25pemVyLnN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKERlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQpOworICAgICAgICAgICAgRXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkEgaG9vayBmb3IgZGVidWdnaW5nIGludGVyZmFjZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFcnJvcihOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIgU3BlY2lhbFN0YXRlVHJhbnNpdGlvbiB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBwcml2YXRlIHNldDsKKyAgICAgICAgfQorICAgICAgICAvL3B1YmxpYyB2aXJ0dWFsIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKCBpbnQgcywgSW50U3RyZWFtIGlucHV0ICkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHJldHVybiAtMTsKKyAgICAgICAgLy99CisKKyAgICAgICAgc3RhdGljIGludCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uRGVmYXVsdChERkEgZGZhLCBpbnQgcywgSUludFN0cmVhbSBpbnB1dCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIERlc2NyaXB0aW9uIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJuL2EiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gYSBTdHJpbmcgdGhhdCBoYXMgYSBydW4tbGVuZ3RoLWVuY29kaW5nIG9mIHNvbWUgdW5zaWduZWQgc2hvcnRzCisgICAgICAgICAqICBsaWtlICJcMVwyXDNcOSIsIGNvbnZlcnQgdG8gc2hvcnRbXSB7Miw5LDksOX0uICBXZSBkbyB0aGlzIHRvIGF2b2lkCisgICAgICAgICAqICBzdGF0aWMgc2hvcnRbXSB3aGljaCBnZW5lcmF0ZXMgc28gbXVjaCBpbml0IGNvZGUgdGhhdCB0aGUgY2xhc3Mgd29uJ3QKKyAgICAgICAgICogIGNvbXBpbGUuIDooCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHNob3J0W10gVW5wYWNrRW5jb2RlZFN0cmluZyhzdHJpbmcgZW5jb2RlZFN0cmluZykgeworICAgICAgICAgICAgLy8gd2FsayBmaXJzdCB0byBmaW5kIGhvdyBiaWcgaXQgaXMuCisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWRTdHJpbmcuTGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBzaXplICs9IGVuY29kZWRTdHJpbmdbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG9ydFtdIGRhdGEgPSBuZXcgc2hvcnRbc2l6ZV07CisgICAgICAgICAgICBpbnQgZGkgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkU3RyaW5nLkxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgY2hhciBuID0gZW5jb2RlZFN0cmluZ1tpXTsKKyAgICAgICAgICAgICAgICBjaGFyIHYgPSBlbmNvZGVkU3RyaW5nW2kgKyAxXTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdiBuIHRpbWVzIHRvIGRhdGEKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtkaSsrXSA9IChzaG9ydCl2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkhpZGVvdXMgZHVwbGljYXRpb24gb2YgY29kZSwgYnV0IEkgbmVlZCBkaWZmZXJlbnQgdHlwZWQgYXJyYXlzIG91dCA6KDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjaGFyW10gVW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhzdHJpbmcgZW5jb2RlZFN0cmluZykgeworICAgICAgICAgICAgLy8gd2FsayBmaXJzdCB0byBmaW5kIGhvdyBiaWcgaXQgaXMuCisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWRTdHJpbmcuTGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBzaXplICs9IGVuY29kZWRTdHJpbmdbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gZGF0YSA9IG5ldyBjaGFyW3NpemVdOworICAgICAgICAgICAgaW50IGRpID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5jb2RlZFN0cmluZy5MZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIGNoYXIgbiA9IGVuY29kZWRTdHJpbmdbaV07CisgICAgICAgICAgICAgICAgY2hhciB2ID0gZW5jb2RlZFN0cmluZ1tpICsgMV07CisgICAgICAgICAgICAgICAgLy8gYWRkIHYgbiB0aW1lcyB0byBkYXRhCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbZGkrK10gPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnUmVjb2duaXRpb25FeGNlcHRpb24oUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gcmVjb2duaXplci5EZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9FYXJseUV4aXRFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9FYXJseUV4aXRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkOTk1YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDkyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgLyoqIDxzdW1tYXJ5PlRoZSByZWNvZ25pemVyIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgZm9yIGEgKC4uKSsgbG9vcC48L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEVhcmx5RXhpdEV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2RlY2lzaW9uTnVtYmVyOworCisgICAgICAgIHB1YmxpYyBFYXJseUV4aXRFeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFYXJseUV4aXRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVhcmx5RXhpdEV4Y2VwdGlvbihpbnQgZGVjaXNpb25OdW1iZXIsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UoaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZGVjaXNpb25OdW1iZXIsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZGVjaXNpb25OdW1iZXIsIElJbnRTdHJlYW0gaW5wdXQsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRWFybHlFeGl0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fZGVjaXNpb25OdW1iZXIgPSBpbmZvLkdldEludDMyKCJEZWNpc2lvbk51bWJlciIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBEZWNpc2lvbk51bWJlciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfZGVjaXNpb25OdW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkRlY2lzaW9uTnVtYmVyIiwgRGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmI0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBBcmd1bWVudE51bGxFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgc2VtYW50aWMgcHJlZGljYXRlIGZhaWxlZCBkdXJpbmcgdmFsaWRhdGlvbi4gIFZhbGlkYXRpb24gb2YgcHJlZGljYXRlcworICAgICAqICBvY2N1cnMgd2hlbiBub3JtYWxseSBwYXJzaW5nIHRoZSBhbHRlcm5hdGl2ZSBqdXN0IGxpa2UgbWF0Y2hpbmcgYSB0b2tlbi4KKyAgICAgKiAgRGlzYW1iaWd1YXRpbmcgcHJlZGljYXRlIGV2YWx1YXRpb24gb2NjdXJzIHdoZW4gd2UgaG9pc3QgYSBwcmVkaWNhdGUgaW50bworICAgICAqICBhIHByZWRpY3Rpb24gZGVjaXNpb24uCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIDogUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfcnVsZU5hbWU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9wcmVkaWNhdGVUZXh0OworCisgICAgICAgIHB1YmxpYyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihJSW50U3RyZWFtIGlucHV0LCBzdHJpbmcgcnVsZU5hbWUsIHN0cmluZyBwcmVkaWNhdGVUZXh0KQorICAgICAgICAgICAgOiBiYXNlKGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLl9ydWxlTmFtZSA9IHJ1bGVOYW1lOworICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlVGV4dCA9IHByZWRpY2F0ZVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBJSW50U3RyZWFtIGlucHV0LCBzdHJpbmcgcnVsZU5hbWUsIHN0cmluZyBwcmVkaWNhdGVUZXh0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLl9ydWxlTmFtZSA9IHJ1bGVOYW1lOworICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlVGV4dCA9IHByZWRpY2F0ZVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBJSW50U3RyZWFtIGlucHV0LCBzdHJpbmcgcnVsZU5hbWUsIHN0cmluZyBwcmVkaWNhdGVUZXh0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLl9ydWxlTmFtZSA9IHJ1bGVOYW1lOworICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlVGV4dCA9IHByZWRpY2F0ZVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fcnVsZU5hbWUgPSBpbmZvLkdldFN0cmluZygiUnVsZU5hbWUiKTsKKyAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZVRleHQgPSBpbmZvLkdldFN0cmluZygiUHJlZGljYXRlVGV4dCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBSdWxlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfcnVsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFByZWRpY2F0ZVRleHQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ByZWRpY2F0ZVRleHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIlJ1bGVOYW1lIiwgX3J1bGVOYW1lKTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIlByZWRpY2F0ZVRleHQiLCBfcHJlZGljYXRlVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oIiArIFJ1bGVOYW1lICsgIix7IiArIFByZWRpY2F0ZVRleHQgKyAifT8pIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0dyYW1tYXJSdWxlQXR0cmlidXRlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvR3JhbW1hclJ1bGVBdHRyaWJ1dGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0dyYW1tYXJSdWxlQXR0cmlidXRlLmNzCkBAIC0wLDAgKzEsNTIgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW0gSGFyd2VsbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBBdHRyaWJ1dGUgPSBTeXN0ZW0uQXR0cmlidXRlOworICAgIHVzaW5nIEF0dHJpYnV0ZVRhcmdldHMgPSBTeXN0ZW0uQXR0cmlidXRlVGFyZ2V0czsKKyAgICB1c2luZyBBdHRyaWJ1dGVVc2FnZUF0dHJpYnV0ZSA9IFN5c3RlbS5BdHRyaWJ1dGVVc2FnZUF0dHJpYnV0ZTsKKworICAgIFtBdHRyaWJ1dGVVc2FnZShBdHRyaWJ1dGVUYXJnZXRzLk1ldGhvZCwgQWxsb3dNdWx0aXBsZSA9IGZhbHNlLCBJbmhlcml0ZWQgPSB0cnVlKV0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEdyYW1tYXJSdWxlQXR0cmlidXRlIDogQXR0cmlidXRlIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX25hbWU7CisKKyAgICAgICAgcHVibGljIEdyYW1tYXJSdWxlQXR0cmlidXRlKHN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0lDaGFyU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvSUNoYXJTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2NTliMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0lDaGFyU3RyZWFtLmNzCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworCisgICAgLyoqIDxzdW1tYXJ5PkEgc291cmNlIG9mIGNoYXJhY3RlcnMgZm9yIGFuIEFOVExSIGxleGVyPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNoYXJTdHJlYW0gOiBJSW50U3RyZWFtIHsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBGb3IgaW5maW5pdGUgc3RyZWFtcywgeW91IGRvbid0IG5lZWQgdGhpczsgcHJpbWFyaWx5IEknbSBwcm92aWRpbmcKKyAgICAgICAgICogIGEgdXNlZnVsIGludGVyZmFjZSBmb3IgYWN0aW9uIGNvZGUuICBKdXN0IG1ha2Ugc3VyZSBhY3Rpb25zIGRvbid0CisgICAgICAgICAqICB1c2UgdGhpcyBvbiBzdHJlYW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHN0cmluZyBTdWJzdHJpbmcoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHZXQgdGhlIGl0aCBjaGFyYWN0ZXIgb2YgbG9va2FoZWFkLiAgVGhpcyBpcyB0aGUgc2FtZSB1c3VhbGx5IGFzCisgICAgICAgICAqICBMQShpKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZAorICAgICAgICAgKiAgbGV4ZXIgY29kZS4gIEknZCBwcmVmZXIgdG8gcmV0dXJuIGEgY2hhciBoZXJlIHR5cGUtd2lzZSwgYnV0IGl0J3MKKyAgICAgICAgICogIHByb2JhYmx5IGJldHRlciB0byBiZSAzMi1iaXQgY2xlYW4gYW5kIGJlIGNvbnNpc3RlbnQgd2l0aCBMQS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIGludCBMVChpbnQgaSk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkFOVExSIHRyYWNrcyB0aGUgbGluZSBpbmZvcm1hdGlvbiBhdXRvbWF0aWNhbGx5PC9zdW1tYXJ5PiAqLworICAgICAgICAvKiogPHN1bW1hcnk+QmVjYXVzZSB0aGlzIHN0cmVhbSBjYW4gcmV3aW5kLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhlIGxpbmU8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBMaW5lIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIDAuLm4tMTwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IENoYXJQb3NpdGlvbkluTGluZSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9JSW50U3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvSUludFN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg4OTJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvSUludFN0cmVhbS5jcwpAQCAtMCwwICsxLDE2MCBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNy0yMDA4IEpvaGFubmVzIEx1YmVyCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBNVVNUIFJFVEFJTiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gTVVTVCBSRVBST0RVQ0UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciBXUklUVEVOIHBlcm1pc3Npb24uCis0LiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSAKKyAgIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoaXMgd29yayB0byB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGxpY2Vuc29yCisgICBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNlLCB3aXRob3V0IGFueSAKKyAgIGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbTsKKwkKKwkvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgc2ltcGxlIHN0cmVhbSBvZiBpbnRlZ2Vycy4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhbGwgd2UgY2FyZSBhYm91dCBpcyB0aGUgY2hhcgorCS8vLyBvciB0b2tlbiB0eXBlIHNlcXVlbmNlIChzdWNoIGFzIGZvciBpbnRlcnByZXRhdGlvbikuCisJLy8vIDwvc3VtbWFyeT4KKwlwdWJsaWMgaW50ZXJmYWNlIElJbnRTdHJlYW0KKwl7CisJCXZvaWQgQ29uc3VtZSgpOworCQkKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IGludCBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkICh3aGVyZSBpPTEgaXMgbmV4dCBpbnQpCisJCS8vLyBOZWdhdGl2ZSBpbmRleGVzIGFyZSBhbGxvd2VkLiAgTEEoLTEpIGlzIHByZXZpb3VzIHRva2VuICh0b2tlbiBqdXN0IG1hdGNoZWQpLgorCQkvLy8gTEEoLWkpIHdoZXJlIGkgaXMgYmVmb3JlIGZpcnN0IHRva2VuIHNob3VsZCB5aWVsZCAtMSwgaW52YWxpZCBjaGFyIG9yIEVPRi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKwkJaW50IExBKGludCBpKTsKKwkJCisJCS8vLyA8c3VtbWFyeT5UZWxsIHRoZSBzdHJlYW0gdG8gc3RhcnQgYnVmZmVyaW5nIGlmIGl0IGhhc24ndCBhbHJlYWR5Ljwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gRXhlY3V0aW5nIFJld2luZChNYXJrKCkpIG9uIGEgc3RyZWFtIHNob3VsZCBub3QgYWZmZWN0IHRoZSBpbnB1dCBwb3NpdGlvbi4KKwkJLy8vIFRoZSBMZXhlciB0cmFja3MgbGluZS9jb2wgaW5mbyBhcyB3ZWxsIGFzIGlucHV0IGluZGV4IHNvIGl0cyBtYXJrZXJzIGFyZQorCQkvLy8gbm90IHB1cmUgaW5wdXQgaW5kZXhlcy4gIFNhbWUgZm9yIHRyZWUgbm9kZSBzdHJlYW1zLgkJCQkJCQkJCQkJCQkqLworICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICAvLy8gPHJldHVybnM+UmV0dXJuIGEgbWFya2VyIHRoYXQgY2FuIGJlIHBhc3NlZCB0byAKKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iSUludFN0cmVhbS5SZXdpbmQoaW50KSIvPiB0byByZXR1cm4gdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uIAorICAgICAgICAvLy8gVGhpcyBjb3VsZCBiZSB0aGUgY3VycmVudCBpbnB1dCBwb3NpdGlvbiwgYSB2YWx1ZSByZXR1cm4gZnJvbSAKKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iSUludFN0cmVhbS5JbmRleCIvPiwgb3Igc29tZSBvdGhlciBtYXJrZXIuPC9yZXR1cm5zPgorCQlpbnQgTWFyaygpOworCQkKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCBpbmRleCAwLi5uIHdoZXJlIG4gaW5kaWNhdGVzIHRoZSAKKwkJLy8vIGxhc3Qgc3ltYm9sIGhhcyBiZWVuIHJlYWQuIFRoZSBpbmRleCBpcyB0aGUgc3ltYm9sIGFib3V0IHRvIGJlCisJCS8vLyByZWFkIG5vdCB0aGUgbW9zdCByZWNlbnRseSByZWFkIHN5bWJvbC4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJaW50IEluZGV4IHsgZ2V0OyB9CisJCQorICAgICAgICAvLy8gPHN1bW1hcnk+CisJCS8vLyBSZXNldHMgdGhlIHN0cmVhbSBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gCisgICAgICAgIC8vLyA8c2VlIGNyZWY9IklJbnRTdHJlYW0uSW5kZXgiLz4gd291bGQgIHJldHVybiBtYXJrZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIDxzZWUgY3JlZj0iSUludFN0cmVhbS5JbmRleCIvPiBidXQgCisgICAgICAgIC8vLyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuICBJdCdzIGp1c3QgYSBtYXJrZXIgdG8gaW5kaWNhdGUgd2hhdCAKKyAgICAgICAgLy8vIHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluLiAgVGhpcyBpcyBlc3NlbnRpYWxseSBjYWxsaW5nIAorICAgICAgICAvLy8gPHNlZSBjcmVmPSJJSW50U3RyZWFtLlJlbGVhc2UiLz4gYW5kIDxzZWUgY3JlZj0iSUludFN0cmVhbS5TZWVrIi8+LgorICAgICAgICAvLy8gSWYgdGhlcmUgYXJlIG90aGVyIG1hcmtlcnMgY3JlYXRlZCBhZnRlciB0aGUgc3BlY2lmaWVkIG1hcmtlciwgCisgICAgICAgIC8vLyB0aGlzIHJvdXRpbmUgbXVzdCB1bnJvbGwgdGhlbSBsaWtlIGEgc3RhY2suICBBc3N1bWVzIHRoZSBzdGF0ZSB0aGUgCisgICAgICAgIC8vLyBzdHJlYW0gd2FzIGluIHdoZW4gdGhpcyBtYXJrZXIgd2FzIGNyZWF0ZWQuCisgICAgICAgIC8vLyA8L3JlbWFya3M+CisJCXZvaWQgUmV3aW5kKGludCBtYXJrZXIpOworCQkKKwkJLy8vIDxzdW1tYXJ5PgorCQkvLy8gUmV3aW5kIHRvIHRoZSBpbnB1dCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBtYXJrZXIuCisJCS8vLyA8L3N1bW1hcnk+CisJCS8vLyA8cmVtYXJrcz4KKwkJLy8vIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0IGJlZm9yZSBzdGFydGluZyAKKwkJLy8vIGEgc2VtL3N5biBwcmVkaWNhdGUgdG8gZ2V0IHRoZSBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCAKKwkJLy8vIG9mIHRoZSBkZWNpc2lvbi4gRG8gbm90ICJwb3AiIHRoZSBtYXJrZXIgb2ZmIHRoZSBzdGF0ZS4gIE1hcmsoaSkgCisJCS8vLyBhbmQgUmV3aW5kKGkpIHNob3VsZCBiYWxhbmNlIHN0aWxsLiBJdCBpcyBsaWtlIGludm9raW5nIAorCQkvLy8gUmV3aW5kKGxhc3QgbWFya2VyKSBidXQgaXQgc2hvdWxkIG5vdCAicG9wIiB0aGUgbWFya2VyIG9mZi4gIAorCQkvLy8gSXQncyBsaWtlIFNlZWsobGFzdCBtYXJrZXIncyBpbnB1dCBwb3NpdGlvbikuCisJCS8vLyA8L3JlbWFya3M+CisJCXZvaWQgUmV3aW5kKCk7CisKKwkJLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKwkJLy8vIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisJCS8vLyBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iSUludFN0cmVhbS5SZXdpbmQoaW50KSIvPiBleGNlcHQgaXQgcmVsZWFzZXMgcmVzb3VyY2VzIHdpdGhvdXQgCisgICAgICAgIC8vLyB0aGUgYmFja3dhcmQgc2Vlay4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJLy8vIDxyZW1hcmtzPgorCQkvLy8gVGhpcyBtdXN0IHRocm93IGF3YXkgcmVzb3VyY2VzIGZvciBhbGwgbWFya2VycyBiYWNrIHRvIHRoZSBtYXJrZXIKKwkJLy8vIGFyZ3VtZW50LiBTbyBpZiB5b3UncmUgbmVzdGVkIDUgbGV2ZWxzIG9mIE1hcmsoKSwgYW5kIHRoZW4gUmVsZWFzZSgyKQorCQkvLy8geW91IGhhdmUgdG8gcmVsZWFzZSByZXNvdXJjZXMgZm9yIGRlcHRocyAyLi41LgorCQkvLy8gPC9yZW1hcmtzPgorCQl2b2lkIFJlbGVhc2UoaW50IG1hcmtlcik7CisJCQorCQkvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBTZXQgdGhlIGlucHV0IGN1cnNvciB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IGluZGV4LiAgVGhpcyBpcworCQkvLy8gbm9ybWFsbHkgdXNlZCB0byBzZWVrIGFoZWFkIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmVtYXJrcz4KKyAgICAgICAgLy8vIE5vIGJ1ZmZlcmluZyBpcyByZXF1aXJlZCB0byBkbyB0aGlzIHVubGVzcyB5b3Uga25vdyB5b3VyIHN0cmVhbSAKKyAgICAgICAgLy8vIHdpbGwgdXNlIHNlZWsgdG8gbW92ZSBiYWNrd2FyZHMgc3VjaCBhcyB3aGVuIGJhY2t0cmFja2luZy4KKwkJLy8vIAorCQkvLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSByZXdpbmQgaW4gaXRzIG11bHRpLWRpcmVjdGlvbmFsIHJlcXVpcmVtZW50IAorICAgICAgICAvLy8gYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorCQkvLy8gCisJCS8vLyBGb3IgY2hhciBzdHJlYW1zLCBzZWVraW5nIGZvcndhcmQgbXVzdCB1cGRhdGUgdGhlIHN0cmVhbSBzdGF0ZSBzdWNoCisJCS8vLyBhcyBsaW5lIG51bWJlci4gIEZvciBzZWVraW5nIGJhY2t3YXJkcywgeW91IHdpbGwgYmUgcHJlc3VtYWJseQorICAgICAgICAvLy8gYmFja3RyYWNraW5nIHVzaW5nIHRoZSAKKyAgICAgICAgLy8vIDxzZWUgY3JlZj0iSUludFN0cmVhbS5NYXJrIi8+LzxzZWUgY3JlZj0iSUludFN0cmVhbS5SZXdpbmQoaW50KSIvPiAKKyAgICAgICAgLy8vIG1lY2hhbmlzbSB0aGF0IHJlc3RvcmVzIHN0YXRlIGFuZCBzbyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBuZWVkIHRvIAorICAgICAgICAvLy8gdXBkYXRlIHN0YXRlIHdoZW4gc2Vla2luZyBiYWNrd2FyZHMuCisJCS8vLyAKKwkJLy8vIEN1cnJlbnRseSwgdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGZvciBlZmZpY2llbnQgYmFja3RyYWNraW5nIHVzaW5nCisJCS8vLyBtZW1vaXphdGlvbiwgYnV0IGluIHRoZSBmdXR1cmUgaXQgbWF5IGJlIHVzZWQgZm9yIGluY3JlbWVudGFsIHBhcnNpbmcuCisJCS8vLyAKKwkJLy8vIFRoZSBpbmRleCBpcyAwLi5uLTEuIEEgc2VlayB0byBwb3NpdGlvbiBpIG1lYW5zIHRoYXQgTEEoMSkgd2lsbCByZXR1cm4gCisJCS8vLyB0aGUgaXRoIHN5bWJvbC4gIFNvLCBzZWVraW5nIHRvIDAgbWVhbnMgTEEoMSkgd2lsbCByZXR1cm4gdGhlIGZpcnN0IAorCQkvLy8gZWxlbWVudCBpbiB0aGUgc3RyZWFtLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorCQl2b2lkIFNlZWsoaW50IGluZGV4KTsKKwkJCisJCS8vLyA8c3VtbWFyeT5SZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbnRpcmUgc3RyZWFtLjwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxyZW1hcmtzPgorICAgICAgICAvLy8gT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCAKKyAgICAgICAgLy8vIGJ1dCBtaWdodCBiZSB1c2VmdWwgdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmVhbSBvciBmb3IgdGVzdGluZy4KKwkJLy8vIFRoaXMgdmFsdWUgaW5jbHVkZXMgYSBzaW5nbGUgRU9GLgorICAgICAgICAvLy8gPC9yZW1hcmtzPgorICAgICAgICBpbnQgQ291bnQgeyBnZXQ7IH0KKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBXaGVyZSBhcmUgeW91IGdldHRpbmcgc3ltYm9scyBmcm9tPyAgTm9ybWFsbHksIGltcGxlbWVudGF0aW9ucyB3aWxsCisJCS8vLyBwYXNzIHRoZSBidWNrIGFsbCB0aGUgd2F5IHRvIHRoZSBsZXhlciB3aG8gY2FuIGFzayBpdHMgaW5wdXQgc3RyZWFtCisJCS8vLyBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKwkJLy8vIDwvc3VtbWFyeT4KKwkJc3RyaW5nIFNvdXJjZU5hbWUgeworCQkJZ2V0OworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0lUb2tlbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0lUb2tlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Y0MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvSVRva2VuLmNzCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworCisgICAgcHVibGljIGludGVyZmFjZSBJVG9rZW4geworICAgICAgICAvKiogPHN1bW1hcnk+R2V0IHRoZSB0ZXh0IG9mIHRoZSB0b2tlbjwvc3VtbWFyeT4gKi8KKyAgICAgICAgc3RyaW5nIFRleHQgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IFR5cGUgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGlzIHRva2VuIHdhcyBtYXRjaGVkOyBsaW5lPTEuLm48L3N1bW1hcnk+ICovCisgICAgICAgIGludCBMaW5lIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIDAuLm4tMTwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IENoYXJQb3NpdGlvbkluTGluZSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbnQgQ2hhbm5lbCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbnQgU3RhcnRJbmRleCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbnQgU3RvcEluZGV4IHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFuIGluZGV4IGZyb20gMC4ubi0xIG9mIHRoZSB0b2tlbiBvYmplY3QgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgICogIFRoaXMgbXVzdCBiZSB2YWxpZCBpbiBvcmRlciB0byB1c2UgdGhlIEFOVExSV29ya3MgZGVidWdnZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgVG9rZW5JbmRleCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBGcm9tIHdoYXQgY2hhcmFjdGVyIHN0cmVhbSB3YXMgdGhpcyB0b2tlbiBjcmVhdGVkPyAgWW91IGRvbid0IGhhdmUgdG8KKyAgICAgICAgICogIGltcGxlbWVudCBidXQgaXQncyBuaWNlIHRvIGtub3cgd2hlcmUgYSBUb2tlbiBjb21lcyBmcm9tIGlmIHlvdSBoYXZlCisgICAgICAgICAqICBpbmNsdWRlIGZpbGVzIGV0Yy4uLiBvbiB0aGUgaW5wdXQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJQ2hhclN0cmVhbSBJbnB1dFN0cmVhbSB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9JVG9rZW5Tb3VyY2UuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9JVG9rZW5Tb3VyY2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllZTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0lUb2tlblNvdXJjZS5jcwpAQCAtMCwwICsxLDcyIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSm9oYW5uZXMgTHViZXIKK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisJdXNpbmcgU3lzdGVtOworCQorCS8vLyA8c3VtbWFyeT4KKwkvLy8gQSBzb3VyY2Ugb2YgdG9rZW5zIG11c3QgcHJvdmlkZSBhIHNlcXVlbmNlIG9mIHRva2VucyB2aWEgTmV4dFRva2VuKCkKKwkvLy8gYW5kIGFsc28gbXVzdCByZXZlYWwgaXQncyBzb3VyY2Ugb2YgY2hhcmFjdGVyczsgQ29tbW9uVG9rZW4ncyB0ZXh0IGlzCisJLy8vIGNvbXB1dGVkIGZyb20gYSBDaGFyU3RyZWFtOyBpdCBvbmx5IHN0b3JlIGluZGljZXMgaW50byB0aGUgY2hhciBzdHJlYW0uCisJLy8vIAorCS8vLyBFcnJvcnMgZnJvbSB0aGUgbGV4ZXIgYXJlIG5ldmVyIHBhc3NlZCB0byB0aGUgcGFyc2VyLiAgRWl0aGVyIHlvdSB3YW50CisJLy8vIHRvIGtlZXAgZ29pbmcgb3IgeW91IGRvIG5vdCB1cG9uIHRva2VuIHJlY29nbml0aW9uIGVycm9yLiAgSWYgeW91IGRvIG5vdAorCS8vLyB3YW50IHRvIGNvbnRpbnVlIGxleGluZyB0aGVuIHlvdSBkbyBub3Qgd2FudCB0byBjb250aW51ZSBwYXJzaW5nLiAgSnVzdAorCS8vLyB0aHJvdyBhbiBleGNlcHRpb24gbm90IHVuZGVyIFJlY29nbml0aW9uRXhjZXB0aW9uIGFuZCBKYXZhIHdpbGwgbmF0dXJhbGx5CisJLy8vIHRvc3MgeW91IGFsbCB0aGUgd2F5IG91dCBvZiB0aGUgcmVjb2duaXplcnMuICBJZiB5b3Ugd2FudCB0byBjb250aW51ZQorCS8vLyBsZXhpbmcgdGhlbiB5b3Ugc2hvdWxkIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gdG8gdGhlIHBhcnNlci0taXQgaGFzIGFscmVhZHkKKwkvLy8gcmVxdWVzdGVkIGEgdG9rZW4uICBLZWVwIGxleGluZyB1bnRpbCB5b3UgZ2V0IGEgdmFsaWQgb25lLiAgSnVzdCByZXBvcnQKKwkvLy8gZXJyb3JzIGFuZCBrZWVwIGdvaW5nLCBsb29raW5nIGZvciBhIHZhbGlkIHRva2VuLgorCS8vLyA8L3N1bW1hcnk+CisJcHVibGljIGludGVyZmFjZSBJVG9rZW5Tb3VyY2UKKwl7CisJCS8vLyA8c3VtbWFyeT4KKwkJLy8vIFJldHVybnMgYSBUb2tlbiBvYmplY3QgZnJvbSB0aGUgaW5wdXQgc3RyZWFtICh1c3VhbGx5IGEgQ2hhclN0cmVhbSkuCisJCS8vLyBEb2VzIG5vdCBmYWlsL3JldHVybiB1cG9uIGxleGluZyBlcnJvcjsganVzdCBrZWVwcyBjaGV3aW5nIG9uIHRoZSAKKwkJLy8vIGNoYXJhY3RlcnMgdW50aWwgaXQgZ2V0cyBhIGdvb2Qgb25lOyBlcnJvcnMgYXJlIG5vdCBwYXNzZWQgdGhyb3VnaCAKKwkJLy8vIHRvIHRoZSBwYXJzZXIuCisJCS8vLyA8L3N1bW1hcnk+CisJCUlUb2tlbiBOZXh0VG9rZW4oKTsKKworCQkvLy8gPHN1bW1hcnk+CisJCS8vLyBXaGVyZSBhcmUgeW91IGdldHRpbmcgdG9rZW5zIGZyb20/IG5vcm1hbGx5IHRoZSBpbXBsaWNhdGlvbiB3aWxsIHNpbXBseQorCQkvLy8gYXNrIGxleGVycyBpbnB1dCBzdHJlYW0uCisJCS8vLyA8L3N1bW1hcnk+CisJCXN0cmluZyBTb3VyY2VOYW1lIHsKKwkJCWdldDsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9JVG9rZW5TdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9JVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4YTZjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0lUb2tlblN0cmVhbS5jcwpAQCAtMCwwICsxLDkxIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisKKyAgICAvKiogPHN1bW1hcnk+QSBzdHJlYW0gb2YgdG9rZW5zIGFjY2Vzc2luZyB0b2tlbnMgZnJvbSBhIFRva2VuU291cmNlPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRva2VuU3RyZWFtIDogSUludFN0cmVhbSB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgVG9rZW4gYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBUb2tlbi4KKyAgICAgICAgICogIGkmbHQ7MCBpbmRpY2F0ZXMgdG9rZW5zIGluIHRoZSBwYXN0LiAgU28gLTEgaXMgcHJldmlvdXMgdG9rZW4gYW5kIC0yIGlzCisgICAgICAgICAqICB0d28gdG9rZW5zIGFnby4gTFQoMCkgaXMgdW5kZWZpbmVkLiAgRm9yIGkmZ3Q7PW4sIHJldHVybiBUb2tlbi5FT0ZUb2tlbi4KKyAgICAgICAgICogIFJldHVybiBudWxsIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgICAgICAgICAqICB0aGF0IGlzIG5lZ2F0aXZlLjwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIElUb2tlbiBMVChpbnQgayk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSG93IGZhciBhaGVhZCBoYXMgdGhlIHN0cmVhbSBiZWVuIGFza2VkIHRvIGxvb2s/ICBUaGUgcmV0dXJuCisgICAgICAgIC8vLyB2YWx1ZSBpcyBhIHZhbGlkIGluZGV4IGZyb20gMC4ubi0xLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnQgUmFuZ2UgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IGEgdG9rZW4gYXQgYW4gYWJzb2x1dGUgaW5kZXggaTsgMC4ubi0xLiAgVGhpcyBpcyByZWFsbHkgb25seQorICAgICAgICAgKiAgbmVlZGVkIGZvciBwcm9maWxpbmcgYW5kIGRlYnVnZ2luZyBhbmQgdG9rZW4gc3RyZWFtIHJld3JpdGluZy4KKyAgICAgICAgICogIElmIHlvdSBkb24ndCB3YW50IHRvIGJ1ZmZlciB1cCB0b2tlbnMsIHRoZW4gdGhpcyBtZXRob2QgbWFrZXMgbm8KKyAgICAgICAgICogIHNlbnNlIGZvciB5b3UuICBOYXR1cmFsbHkgeW91IGNhbid0IHVzZSB0aGUgcmV3cml0ZSBzdHJlYW0gZmVhdHVyZS4KKyAgICAgICAgICogIEkgYmVsaWV2ZSBEZWJ1Z1Rva2VuU3RyZWFtIGNhbiBlYXNpbHkgYmUgYWx0ZXJlZCB0byBub3QgdXNlCisgICAgICAgICAqICB0aGlzIG1ldGhvZCwgcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVG9rZW4gR2V0KGludCBpKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIHRva2VucyBmcm9tPyAgVGhpcyBpcyBub3QgdGhlIG5hbWUsIGJ1dAorICAgICAgICAgKiAgdGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIFRva2VuIG9iamVjdHMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVG9rZW5Tb3VyY2UgVG9rZW5Tb3VyY2UgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgICAgICAgICAqICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIHRva2VucyB0aGVuIGl0IGNhbiBqdXN0CisgICAgICAgICAqICByZXR1cm4gIiIgb3IgbnVsbDsgIFVzZXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorICAgICAgICAgKiAgYW4gYWN0aW9uIG9mIGNvdXJzZSBpbiB0aGF0IGNhc2UuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBzdHJpbmcgVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgc3RvcCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQmVjYXVzZSB0aGUgdXNlciBpcyBub3QgcmVxdWlyZWQgdG8gdXNlIGEgdG9rZW4gd2l0aCBhbiBpbmRleCBzdG9yZWQKKyAgICAgICAgICogIGluIGl0LCB3ZSBtdXN0IHByb3ZpZGUgYSBtZWFucyBmb3IgdHdvIHRva2VuIG9iamVjdHMgdGhlbXNlbHZlcyB0bworICAgICAgICAgKiAgaW5kaWNhdGUgdGhlIHN0YXJ0L2VuZCBsb2NhdGlvbi4gIE1vc3Qgb2Z0ZW4gdGhpcyB3aWxsIGp1c3QgZGVsZWdhdGUKKyAgICAgICAgICogIHRvIHRoZSBvdGhlciB0b1N0cmluZyhpbnQsaW50KS4gIFRoaXMgaXMgYWxzbyBwYXJhbGxlbCB3aXRoCisgICAgICAgICAqICB0aGUgVHJlZU5vZGVTdHJlYW0udG9TdHJpbmcoT2JqZWN0LE9iamVjdCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBzdHJpbmcgVG9TdHJpbmcoSVRva2VuIHN0YXJ0LCBJVG9rZW4gc3RvcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvSVRva2VuU3RyZWFtSW5mb3JtYXRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9JVG9rZW5TdHJlYW1JbmZvcm1hdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E1ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvSVRva2VuU3RyZWFtSW5mb3JtYXRpb24uY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRva2VuU3RyZWFtSW5mb3JtYXRpb24geworICAgICAgICBJVG9rZW4gTGFzdFRva2VuIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIElUb2tlbiBMYXN0UmVhbFRva2VuIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBNYXhMb29rQmVoaW5kIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0xlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTGVnYWN5Q29tbW9uVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4ZmFkZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL0xlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsNDUzIEBACivvu78vKgorICogTk9URSBUTyBKTDogVGhlIG9yaWdpbmFsIGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gMy41LW9ubHkgc3R1ZmYhCisgKiAKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uOworICAgIHVzaW5nIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gPSBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhlIG1vc3QgY29tbW9uIHN0cmVhbSBvZiB0b2tlbnMgaXMgb25lIHdoZXJlIGV2ZXJ5IHRva2VuIGlzIGJ1ZmZlcmVkIHVwCisgICAgICogIGFuZCB0b2tlbnMgYXJlIHByZWZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKKyAgICAgKiAgc2VlIHRoZXNlIHRva2VucyBhbmQgY2Fubm90IGNoYW5nZSB0aGUgZmlsdGVyIGNoYW5uZWwgbnVtYmVyIGR1cmluZyB0aGUKKyAgICAgKiAgcGFyc2UpLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+VE9ETzogaG93IHRvIGFjY2VzcyB0aGUgZnVsbCB0b2tlbiBzdHJlYW0/ICBIb3cgdG8gdHJhY2sgYWxsIHRva2VucyBtYXRjaGVkIHBlciBydWxlPzwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgTGVnYWN5Q29tbW9uVG9rZW5TdHJlYW0gOiBJVG9rZW5TdHJlYW0geworICAgICAgICBbU3lzdGVtLk5vblNlcmlhbGl6ZWRdCisgICAgICAgIElUb2tlblNvdXJjZSBfdG9rZW5Tb3VyY2U7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVjb3JkIGV2ZXJ5IHNpbmdsZSB0b2tlbiBwdWxsZWQgZnJvbSB0aGUgc291cmNlIHNvIHdlIGNhbiByZXByb2R1Y2UKKyAgICAgICAgICogIGNodW5rcyBvZiBpdCBsYXRlci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBMaXN0PElUb2tlbj4gdG9rZW5zOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5NYXA8dG9rZW50eXBlLCBjaGFubmVsPiB0byBvdmVycmlkZSBzb21lIFRva2VucycgY2hhbm5lbCBudW1iZXJzPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgSURpY3Rpb25hcnk8aW50LCBpbnQ+IGNoYW5uZWxPdmVycmlkZU1hcDsKKworICAgICAgICAvKiogPHN1bW1hcnk+U2V0PHRva2VudHlwZT47IGRpc2NhcmQgYW55IHRva2VucyB3aXRoIHRoaXMgdHlwZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIERpY3Rpb25hcnk8aW50LCBpbnQ+IGRpc2NhcmRTZXQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNraXAgdG9rZW5zIG9uIGFueSBjaGFubmVsIGJ1dCB0aGlzIG9uZTsgdGhpcyBpcyBob3cgd2Ugc2tpcCB3aGl0ZXNwYWNlLi4uPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkJ5IGRlZmF1bHQsIHRyYWNrIGFsbCBpbmNvbWluZyB0b2tlbnM8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBib29sIGRpc2NhcmRPZmZDaGFubmVsVG9rZW5zID0gZmFsc2U7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBsYXN0TWFya2VyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAgICAgKiAgdG8gY29uc3VtZSkuICBwPT0tMSBpbmRpY2F0ZXMgdGhhdCB0aGUgdG9rZW5zIGxpc3QgaXMgZW1wdHkKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgcCA9IC0xOworCisgICAgICAgIHB1YmxpYyBMZWdhY3lDb21tb25Ub2tlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIHRva2VucyA9IG5ldyBMaXN0PElUb2tlbj4oNTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMZWdhY3lDb21tb25Ub2tlblN0cmVhbShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpCisgICAgICAgICAgICA6IHRoaXMoKSB7CisgICAgICAgICAgICB0aGlzLl90b2tlblNvdXJjZSA9IHRva2VuU291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExlZ2FjeUNvbW1vblRva2VuU3RyZWFtKElUb2tlblNvdXJjZSB0b2tlblNvdXJjZSwgaW50IGNoYW5uZWwpCisgICAgICAgICAgICA6IHRoaXModG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgSW5kZXggeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvdyBkZWVwIGhhdmUgd2UgZ29uZT8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFJhbmdlIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmVzZXQgdGhpcyB0b2tlbiBzdHJlYW0gYnkgc2V0dGluZyBpdHMgdG9rZW4gc291cmNlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUb2tlblNvdXJjZShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMuX3Rva2VuU291cmNlID0gdG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB0b2tlbnMuQ2xlYXIoKTsKKyAgICAgICAgICAgIHAgPSAtMTsKKyAgICAgICAgICAgIGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBMb2FkIGFsbCB0b2tlbnMgZnJvbSB0aGUgdG9rZW4gc291cmNlIGFuZCBwdXQgaW4gdG9rZW5zLgorICAgICAgICAgKiAgVGhpcyBpcyBkb25lIHVwb24gZmlyc3QgTFQgcmVxdWVzdCBiZWNhdXNlIHlvdSBtaWdodCB3YW50IHRvCisgICAgICAgICAqICBzZXQgc29tZSB0b2tlbiB0eXBlIC8gY2hhbm5lbCBvdmVycmlkZXMgYmVmb3JlIGZpbGxpbmcgYnVmZmVyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGaWxsQnVmZmVyKCkgeworICAgICAgICAgICAgLy8gZmFzdCByZXR1cm4gaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGZ1bGwKKyAgICAgICAgICAgIGlmIChwICE9IC0xKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIElUb2tlbiB0ID0gX3Rva2VuU291cmNlLk5leHRUb2tlbigpOworICAgICAgICAgICAgd2hpbGUgKHQgIT0gbnVsbCAmJiB0LlR5cGUgIT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUpIHsKKyAgICAgICAgICAgICAgICBib29sIGRpc2NhcmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNoYW5uZWwgb3ZlcnJpZGUgZm9yIHRva2VuIHR5cGU/CisgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxJOworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsT3ZlcnJpZGVNYXAgIT0gbnVsbCAmJiBjaGFubmVsT3ZlcnJpZGVNYXAuVHJ5R2V0VmFsdWUodC5UeXBlLCBvdXQgY2hhbm5lbEkpKQorICAgICAgICAgICAgICAgICAgICB0LkNoYW5uZWwgPSBjaGFubmVsSTsKKworICAgICAgICAgICAgICAgIC8vaWYgKCBjaGFubmVsT3ZlcnJpZGVNYXAgIT0gbnVsbCAmJiBjaGFubmVsT3ZlcnJpZGVNYXAuQ29udGFpbnNLZXkoIHQuZ2V0VHlwZSgpICkgKQorICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIC8vICAgIG9iamVjdCBjaGFubmVsSSA9IGNoYW5uZWxPdmVycmlkZU1hcC5nZXQoIHQuZ2V0VHlwZSgpICk7CisgICAgICAgICAgICAgICAgLy8gICAgaWYgKCBjaGFubmVsSSAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgIHQuc2V0Q2hhbm5lbCggKGludCljaGFubmVsSSApOworICAgICAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICBpZiAoZGlzY2FyZFNldCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkU2V0LkNvbnRhaW5zS2V5KHQuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyAmJiB0LkNoYW5uZWwgIT0gdGhpcy5jaGFubmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWRpc2NhcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgdC5Ub2tlbkluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5BZGQodCk7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQgPSBfdG9rZW5Tb3VyY2UuTmV4dFRva2VuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBsZWF2ZSBwIHBvaW50aW5nIGF0IGZpcnN0IHRva2VuIG9uIGNoYW5uZWwKKyAgICAgICAgICAgIHAgPSAwOworICAgICAgICAgICAgcCA9IFNraXBPZmZUb2tlbkNoYW5uZWxzKHApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTW92ZSB0aGUgaW5wdXQgcG9pbnRlciB0byB0aGUgbmV4dCBpbmNvbWluZyB0b2tlbi4gIFRoZSBzdHJlYW0KKyAgICAgICAgICogIG11c3QgYmVjb21lIGFjdGl2ZSB3aXRoIExUKDEpIGF2YWlsYWJsZS4gIGNvbnN1bWUoKSBzaW1wbHkKKyAgICAgICAgICogIG1vdmVzIHRoZSBpbnB1dCBwb2ludGVyIHNvIHRoYXQgTFQoMSkgcG9pbnRzIGF0IHRoZSBuZXh0CisgICAgICAgICAqICBpbnB1dCBzeW1ib2wuIENvbnN1bWUgYXQgbGVhc3Qgb25lIHRva2VuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBXYWxrIHBhc3QgYW55IHRva2VuIG5vdCBvbiB0aGUgY2hhbm5lbCB0aGUgcGFyc2VyIGlzIGxpc3RlbmluZyB0by4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpIHsKKyAgICAgICAgICAgIGlmIChwIDwgdG9rZW5zLkNvdW50KSB7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIHAgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyhwKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdpdmVuIGEgc3RhcnRpbmcgaW5kZXgsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uLWNoYW5uZWwgdG9rZW4uPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgU2tpcE9mZlRva2VuQ2hhbm5lbHMoaW50IGkpIHsKKyAgICAgICAgICAgIGludCBuID0gdG9rZW5zLkNvdW50OworICAgICAgICAgICAgd2hpbGUgKGkgPCBuICYmICgoSVRva2VuKXRva2Vuc1tpXSkuQ2hhbm5lbCAhPSBjaGFubmVsKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGludCBpKSB7CisgICAgICAgICAgICB3aGlsZSAoaSA+PSAwICYmICgoSVRva2VuKXRva2Vuc1tpXSkuQ2hhbm5lbCAhPSBjaGFubmVsKSB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIHNpbXBsZSBmaWx0ZXIgbWVjaGFuaXNtIHdoZXJlYnkgeW91IGNhbiB0ZWxsIHRoaXMgdG9rZW4gc3RyZWFtCisgICAgICAgICAqICB0byBmb3JjZSBhbGwgdG9rZW5zIG9mIHR5cGUgdHR5cGUgdG8gYmUgb24gY2hhbm5lbC4gIEZvciBleGFtcGxlLAorICAgICAgICAgKiAgd2hlbiBpbnRlcnByZXRpbmcsIHdlIGNhbm5vdCBleGVjIGFjdGlvbnMgc28gd2UgbmVlZCB0byB0ZWxsCisgICAgICAgICAqICB0aGUgc3RyZWFtIHRvIGZvcmNlIGFsbCBXUyBhbmQgTkVXTElORSB0byBiZSBhIGRpZmZlcmVudCwgaWdub3JlZAorICAgICAgICAgKiAgY2hhbm5lbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0VG9rZW5UeXBlQ2hhbm5lbChpbnQgdHR5cGUsIGludCBjaGFubmVsKSB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbE92ZXJyaWRlTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsT3ZlcnJpZGVNYXAgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWxPdmVycmlkZU1hcFt0dHlwZV0gPSBjaGFubmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBEaXNjYXJkVG9rZW5UeXBlKGludCB0dHlwZSkgeworICAgICAgICAgICAgaWYgKGRpc2NhcmRTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRpc2NhcmRTZXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc2NhcmRTZXQuQWRkKHR0eXBlLCB0dHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldERpc2NhcmRPZmZDaGFubmVsVG9rZW5zKGJvb2wgZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnMpIHsKKyAgICAgICAgICAgIHRoaXMuZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnMgPSBkaXNjYXJkT2ZmQ2hhbm5lbFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUb2tlbj4gR2V0VG9rZW5zKCkgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRva2VuPiBHZXRUb2tlbnMoaW50IHN0YXJ0LCBpbnQgc3RvcCkgeworICAgICAgICAgICAgcmV0dXJuIEdldFRva2VucyhzdGFydCwgc3RvcCwgKEJpdFNldCludWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdpdmVuIGEgc3RhcnQgYW5kIHN0b3AgaW5kZXgsIHJldHVybiBhIExpc3Qgb2YgYWxsIHRva2VucyBpbgorICAgICAgICAgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgICAgICAgICAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRva2VuPiBHZXRUb2tlbnMoaW50IHN0YXJ0LCBpbnQgc3RvcCwgQml0U2V0IHR5cGVzKSB7CisgICAgICAgICAgICBpZiAocCA9PSAtMSkgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdG9wID49IHRva2Vucy5Db3VudCkgeworICAgICAgICAgICAgICAgIHN0b3AgPSB0b2tlbnMuQ291bnQgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFydCA+IHN0b3ApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbGlzdCA9IHRva2Vuc1tzdGFydDpzdG9wXTp7VG9rZW4gdCwgdC5nZXRUeXBlKCkgaW4gdHlwZXN9CisgICAgICAgICAgICBJTGlzdDxJVG9rZW4+IGZpbHRlcmVkVG9rZW5zID0gbmV3IExpc3Q8SVRva2VuPigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmICh0eXBlcyA9PSBudWxsIHx8IHR5cGVzLk1lbWJlcih0LlR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkVG9rZW5zLkFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsdGVyZWRUb2tlbnMuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkVG9rZW5zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUb2tlbj4gR2V0VG9rZW5zKGludCBzdGFydCwgaW50IHN0b3AsIElMaXN0PGludD4gdHlwZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRUb2tlbnMoc3RhcnQsIHN0b3AsIG5ldyBCaXRTZXQodHlwZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUb2tlbj4gR2V0VG9rZW5zKGludCBzdGFydCwgaW50IHN0b3AsIGludCB0dHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIEdldFRva2VucyhzdGFydCwgc3RvcCwgQml0U2V0Lk9mKHR0eXBlKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHZXQgdGhlIGl0aCB0b2tlbiBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIDEuLm4gd2hlcmUgaz0xIGlzIHRoZQorICAgICAgICAgKiAgZmlyc3Qgc3ltYm9sIG9mIGxvb2thaGVhZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBMVChpbnQgaykgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoayA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoayA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoLWspOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCJMVChwPSIrcCsiLCIraysiKT0iKTsKKyAgICAgICAgICAgIGlmICgocCArIGsgLSAxKSA+PSB0b2tlbnMuQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zW3Rva2Vucy5Db3VudCAtIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLmdldChwK2stMSkpOworICAgICAgICAgICAgaW50IGkgPSBwOworICAgICAgICAgICAgaW50IG4gPSAxOworICAgICAgICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zCisgICAgICAgICAgICB3aGlsZSAobiA8IGspIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworICAgICAgICAgICAgICAgIGkgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyhpICsgMSk7IC8vIGxlYXZlIHAgb24gdmFsaWQgdG9rZW4KKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA+PSB0b2tlbnMuQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zW3Rva2Vucy5Db3VudCAtIDFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA+IFJhbmdlKQorICAgICAgICAgICAgICAgIFJhbmdlID0gaTsKKworICAgICAgICAgICAgcmV0dXJuIChJVG9rZW4pdG9rZW5zW2ldOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pkxvb2sgYmFja3dhcmRzIGsgdG9rZW5zIG9uLWNoYW5uZWwgdG9rZW5zPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBJVG9rZW4gTEIoaW50IGspIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludCgiTEIocD0iK3ArIiwiK2srIikgIik7CisgICAgICAgICAgICBpZiAocCA9PSAtMSkgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChrID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocCAtIGspIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaSA9IHA7CisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKKyAgICAgICAgICAgIHdoaWxlIChuIDw9IGspIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworICAgICAgICAgICAgICAgIGkgPSBTa2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoaSAtIDEpOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKElUb2tlbil0b2tlbnNbaV07CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gYWJzb2x1dGUgdG9rZW4gaTsgaWdub3JlIHdoaWNoIGNoYW5uZWwgdGhlIHRva2VucyBhcmUgb247CisgICAgICAgICAqICB0aGF0IGlzLCBjb3VudCBhbGwgdG9rZW5zIG5vdCBqdXN0IG9uLWNoYW5uZWwgdG9rZW5zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIEdldChpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIChJVG9rZW4pdG9rZW5zW2ldOworICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICAvKiogR2V0IGFsbCB0b2tlbnMgZnJvbSBzdGFydC4uc3RvcCBpbmNsdXNpdmVseSAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PElUb2tlbj4gR2V0KGludCBzdGFydCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInN0YXJ0Iik7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvdW50Iik7CisKKyAgICAgICAgICAgIGlmIChwID09IC0xKQorICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PElUb2tlbj4odG9rZW5zLlNraXAoc3RhcnQpLlRha2UoY291bnQpKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gTFQoaSkuVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0TWFya2VyID0gSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gbGFzdE1hcmtlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZShpbnQgbWFya2VyKSB7CisgICAgICAgICAgICAvLyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucy5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKGludCBtYXJrZXIpIHsKKyAgICAgICAgICAgIFNlZWsobWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkgeworICAgICAgICAgICAgU2VlayhsYXN0TWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVzZXQoKSB7CisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgIGxhc3RNYXJrZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZWVrKGludCBpbmRleCkgeworICAgICAgICAgICAgcCA9IGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU291cmNlIFRva2VuU291cmNlIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90b2tlblNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTb3VyY2VOYW1lIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuU291cmNlLlNvdXJjZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgaWYgKHAgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQnVmZmVyIGlzIG5vdCB5ZXQgZmlsbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKDAsIHRva2Vucy5Db3VudCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKGludCBzdGFydCwgaW50IHN0b3ApIHsKKyAgICAgICAgICAgIGlmIChzdGFydCA8IDAgfHwgc3RvcCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkJ1ZmZlciBpcyBub3QgeWV0IGZpbGxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdG9wID49IHRva2Vucy5Db3VudCkgeworICAgICAgICAgICAgICAgIHN0b3AgPSB0b2tlbnMuQ291bnQgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQodC5UZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1N0cmluZyhJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCAmJiBzdG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoc3RhcnQuVG9rZW5JbmRleCwgc3RvcC5Ub2tlbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTGV4ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9MZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZjNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTGV4ZXIuY3MKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIENvbmRpdGlvbmFsQXR0cmlidXRlID0gU3lzdGVtLkRpYWdub3N0aWNzLkNvbmRpdGlvbmFsQXR0cmlidXRlOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGxleGVyIGlzIHJlY29nbml6ZXIgdGhhdCBkcmF3cyBpbnB1dCBzeW1ib2xzIGZyb20gYSBjaGFyYWN0ZXIgc3RyZWFtLgorICAgICAqICBsZXhlciBncmFtbWFycyByZXN1bHQgaW4gYSBzdWJjbGFzcyBvZiB0aGlzIG9iamVjdC4gQSBMZXhlciBvYmplY3QKKyAgICAgKiAgdXNlcyBzaW1wbGlmaWVkIG1hdGNoKCkgYW5kIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbXMgaW4gdGhlIGludGVyZXN0CisgICAgICogIG9mIHNwZWVkLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIExleGVyIDogQmFzZVJlY29nbml6ZXIsIElUb2tlblNvdXJjZSB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGVyZSBpcyB0aGUgbGV4ZXIgZHJhd2luZyBjaGFyYWN0ZXJzIGZyb20/PC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgSUNoYXJTdHJlYW0gaW5wdXQ7CisKKyAgICAgICAgcHVibGljIExleGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExleGVyKElDaGFyU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGV4ZXIoSUNoYXJTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkKKyAgICAgICAgICAgIDogYmFzZShzdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dCB7CisgICAgICAgICAgICAvKiogPHN1bW1hcnk+UmV0dXJuIHRoZSB0ZXh0IG1hdGNoZWQgc28gZmFyIGZvciB0aGUgY3VycmVudCB0b2tlbiBvciBhbnkgdGV4dCBvdmVycmlkZS48L3N1bW1hcnk+ICovCisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS50ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5TdWJzdHJpbmcoc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCwgQ2hhckluZGV4IC0gc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogPHN1bW1hcnk+U2V0IHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgdG9rZW47IGl0IHdpcGVzIGFueSBwcmV2aW91cyBjaGFuZ2VzIHRvIHRoZSB0ZXh0Ljwvc3VtbWFyeT4gKi8KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgc3RhdGUudGV4dCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgTGluZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBpbnB1dC5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBDaGFyUG9zaXRpb25JbkxpbmUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBpbnB1dC5DaGFyUG9zaXRpb25JbkxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVzZXQoKSB7CisgICAgICAgICAgICBiYXNlLlJlc2V0KCk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworICAgICAgICAgICAgLy8gd2FjayBMZXhlciBzdGF0ZSB2YXJpYWJsZXMKKyAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuU2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIHNoYXJlZCBzdGF0ZSB3b3JrIHRvIGRvCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS50b2tlbiA9IG51bGw7CisgICAgICAgICAgICBzdGF0ZS50eXBlID0gVG9rZW5UeXBlcy5JbnZhbGlkOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IFRva2VuQ2hhbm5lbHMuRGVmYXVsdDsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSAtMTsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSAtMTsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuU3RhcnRMaW5lID0gLTE7CisgICAgICAgICAgICBzdGF0ZS50ZXh0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZXR1cm4gYSB0b2tlbiBmcm9tIHRoaXMgc291cmNlOyBpLmUuLCBtYXRjaCBhIHRva2VuIG9uIHRoZSBjaGFyIHN0cmVhbS48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBOZXh0VG9rZW4oKSB7CisgICAgICAgICAgICBmb3IgKDsgOyApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbiA9IG51bGw7CisgICAgICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IFRva2VuQ2hhbm5lbHMuRGVmYXVsdDsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gaW5wdXQuSW5kZXg7CisgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LkxpbmU7CisgICAgICAgICAgICAgICAgc3RhdGUudGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0LkxBKDEpID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIElUb2tlbiBlb2YgPSBuZXcgQ29tbW9uVG9rZW4oKElDaGFyU3RyZWFtKWlucHV0LCBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZSwgVG9rZW5DaGFubmVscy5EZWZhdWx0LCBpbnB1dC5JbmRleCwgaW5wdXQuSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBlb2YuTGluZSA9IExpbmU7CisgICAgICAgICAgICAgICAgICAgIGVvZi5DaGFyUG9zaXRpb25JbkxpbmUgPSBDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlb2Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Ub2tlbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVtaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS50b2tlbiA9PSBUb2tlbnMuU2tpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YSkgeworICAgICAgICAgICAgICAgICAgICBSZXBvcnRFcnJvcihudmEpOworICAgICAgICAgICAgICAgICAgICBSZWNvdmVyKG52YSk7IC8vIHRocm93IG91dCBjdXJyZW50IGNoYXIgYW5kIHRyeSBhZ2FpbgorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgICAgIFJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2goKSByb3V0aW5lIGhhcyBhbHJlYWR5IGNhbGxlZCByZWNvdmVyKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJbnN0cnVjdCB0aGUgbGV4ZXIgdG8gc2tpcCBjcmVhdGluZyBhIHRva2VuIGZvciBjdXJyZW50IGxleGVyIHJ1bGUKKyAgICAgICAgICogIGFuZCBsb29rIGZvciBhbm90aGVyIHRva2VuLiAgbmV4dFRva2VuKCkga25vd3MgdG8ga2VlcCBsb29raW5nIHdoZW4KKyAgICAgICAgICogIGEgbGV4ZXIgcnVsZSBmaW5pc2hlcyB3aXRoIHRva2VuIHNldCB0byBTS0lQX1RPS0VOLiAgUmVjYWxsIHRoYXQKKyAgICAgICAgICogIGlmIHRva2VuPT1udWxsIGF0IGVuZCBvZiBhbnkgdG9rZW4gcnVsZSwgaXQgY3JlYXRlcyBvbmUgZm9yIHlvdQorICAgICAgICAgKiAgYW5kIGVtaXRzIGl0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTa2lwKCkgeworICAgICAgICAgICAgc3RhdGUudG9rZW4gPSBUb2tlbnMuU2tpcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGlzIGlzIHRoZSBsZXhlciBlbnRyeSBwb2ludCB0aGF0IHNldHMgaW5zdGFuY2UgdmFyICd0b2tlbic8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG1Ub2tlbnMoKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQ2hhclN0cmVhbSBDaGFyU3RyZWFtIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCB0aGUgY2hhciBzdHJlYW0gYW5kIHJlc2V0IHRoZSBsZXhlcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsOworICAgICAgICAgICAgICAgIFJlc2V0KCk7CisgICAgICAgICAgICAgICAgaW5wdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgU291cmNlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgZW1pdHMgcGVyIG5leHRUb2tlbiBpbnZvY2F0aW9uCisgICAgICAgICAqICBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAgU3ViY2xhc3MgYW5kIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAorICAgICAgICAgKiAgbmV4dFRva2VuICh0byBwdXNoIHRva2VucyBpbnRvIGEgbGlzdCBhbmQgcHVsbCBmcm9tIHRoYXQgbGlzdCByYXRoZXIKKyAgICAgICAgICogIHRoYW4gYSBzaW5nbGUgdmFyaWFibGUgYXMgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW1pdChJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuID0gdG9rZW47CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgc3RhbmRhcmQgbWV0aG9kIGNhbGxlZCB0byBhdXRvbWF0aWNhbGx5IGVtaXQgYSB0b2tlbiBhdCB0aGUKKyAgICAgICAgICogIG91dGVybW9zdCBsZXhpY2FsIHJ1bGUuICBUaGUgdG9rZW4gb2JqZWN0IHNob3VsZCBwb2ludCBpbnRvIHRoZQorICAgICAgICAgKiAgY2hhciBidWZmZXIgc3RhcnQuLnN0b3AuICBJZiB0aGVyZSBpcyBhIHRleHQgb3ZlcnJpZGUgaW4gJ3RleHQnLAorICAgICAgICAgKiAgdXNlIHRoYXQgdG8gc2V0IHRoZSB0b2tlbidzIHRleHQuICBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlbWl0CisgICAgICAgICAqICBjdXN0b20gVG9rZW4gb2JqZWN0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IGFyZSBidWlsZGluZyB0cmVlcywgdGhlbiB5b3Ugc2hvdWxkIGFsc28gb3ZlcnJpZGUKKyAgICAgICAgICogIFBhcnNlciBvciBUcmVlUGFyc2VyLmdldE1pc3NpbmdTeW1ib2woKS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBFbWl0KCkgeworICAgICAgICAgICAgSVRva2VuIHQgPSBuZXcgQ29tbW9uVG9rZW4oaW5wdXQsIHN0YXRlLnR5cGUsIHN0YXRlLmNoYW5uZWwsIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXgsIENoYXJJbmRleCAtIDEpOworICAgICAgICAgICAgdC5MaW5lID0gc3RhdGUudG9rZW5TdGFydExpbmU7CisgICAgICAgICAgICB0LlRleHQgPSBzdGF0ZS50ZXh0OworICAgICAgICAgICAgdC5DaGFyUG9zaXRpb25JbkxpbmUgPSBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgRW1pdCh0KTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBNYXRjaChzdHJpbmcgcykgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKGkgPCBzLkxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dC5MQSgxKSAhPSBzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPSBuZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHNbaV0sIGlucHV0LCBUb2tlbk5hbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgUmVjb3ZlcihtdGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBtdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1hdGNoQW55KCkgeworICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBNYXRjaChpbnQgYykgeworICAgICAgICAgICAgaWYgKGlucHV0LkxBKDEpICE9IGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPSBuZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGMsIGlucHV0LCBUb2tlbk5hbWVzKTsKKyAgICAgICAgICAgICAgICBSZWNvdmVyKG10ZSk7ICAvLyBkb24ndCByZWFsbHkgcmVjb3ZlcjsganVzdCBjb25zdW1lIGluIGxleGVyCisgICAgICAgICAgICAgICAgdGhyb3cgbXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1hdGNoUmFuZ2UoaW50IGEsIGludCBiKSB7CisgICAgICAgICAgICBpZiAoaW5wdXQuTEEoMSkgPCBhIHx8IGlucHV0LkxBKDEpID4gYikgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIG1yZSA9IG5ldyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oYSwgYiwgaW5wdXQpOworICAgICAgICAgICAgICAgIFJlY292ZXIobXJlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgb2YgbG9va2FoZWFkPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENoYXJJbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlcG9ydEVycm9yKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBub3QgdGhvdWdodCBhYm91dCByZWNvdmVyeSBpbiBsZXhlciB5ZXQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBhbmQgaGF2ZSBub3QgbWF0Y2hlZCBhIHRva2VuCisgICAgICAgICAgICAvLyB5ZXQgc3VjY2Vzc2Z1bGx5LCBkb24ndCByZXBvcnQgYW55IGVycm9ycy4KKyAgICAgICAgICAgIGlmICggZXJyb3JSZWNvdmVyeSApIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnQoIltTUFVSSU9VU10gIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3JSZWNvdmVyeSA9IHRydWU7CisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgRGlzcGxheVJlY29nbml0aW9uRXJyb3IodGhpcy5Ub2tlbk5hbWVzLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0RXJyb3JNZXNzYWdlKFJlY29nbml0aW9uRXhjZXB0aW9uIGUsIHN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKyAgICAgICAgICAgIHN0cmluZyBtc2cgPSBudWxsOworICAgICAgICAgICAgaWYgKGUgaXMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG10ZSA9IChNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoZS5DaGFyYWN0ZXIpICsgIiBleHBlY3RpbmcgIiArIEdldENoYXJFcnJvckRpc3BsYXkobXRlLkV4cGVjdGluZyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUgaXMgTm9WaWFibGVBbHRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gKE5vVmlhYmxlQWx0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICJkZWNpc2lvbj08PCIrbnZhZS5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbisiPj4iCisgICAgICAgICAgICAgICAgLy8gYW5kICIoZGVjaXNpb249IitudmFlLmRlY2lzaW9uTnVtYmVyKyIpIGFuZAorICAgICAgICAgICAgICAgIC8vICJzdGF0ZSAiK252YWUuc3RhdGVOdW1iZXIKKyAgICAgICAgICAgICAgICBtc2cgPSAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGNoYXJhY3RlciAiICsgR2V0Q2hhckVycm9yRGlzcGxheShlLkNoYXJhY3Rlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUgaXMgRWFybHlFeGl0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9IChFYXJseUV4aXRFeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQsIGNhbiBhZGQgIihkZWNpc2lvbj0iK2VlZS5kZWNpc2lvbk51bWJlcisiKSIKKyAgICAgICAgICAgICAgICBtc2cgPSAicmVxdWlyZWQgKC4uLikrIGxvb3AgZGlkIG5vdCBtYXRjaCBhbnl0aGluZyBhdCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoZS5DaGFyYWN0ZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlIGlzIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIG1zZSA9IChNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KGUuQ2hhcmFjdGVyKSArICIgZXhwZWN0aW5nIHNldCAiICsgbXNlLkV4cGVjdGluZzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpcyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSAoTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiICsgR2V0Q2hhckVycm9yRGlzcGxheShlLkNoYXJhY3RlcikgKyAiIGV4cGVjdGluZyBzZXQgIiArIG1zZS5FeHBlY3Rpbmc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUgaXMgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIG1yZSA9IChNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoZS5DaGFyYWN0ZXIpICsgIiBleHBlY3Rpbmcgc2V0ICIgKworICAgICAgICAgICAgICAgICAgICAgIEdldENoYXJFcnJvckRpc3BsYXkobXJlLkEpICsgIi4uIiArIEdldENoYXJFcnJvckRpc3BsYXkobXJlLkIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBiYXNlLkdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgR2V0Q2hhckVycm9yRGlzcGxheShpbnQgYykgeworICAgICAgICAgICAgc3RyaW5nIHMgPSAoKGNoYXIpYykuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlcy5FbmRPZkZpbGU6CisgICAgICAgICAgICAgICAgICAgIHMgPSAiPEVPRj4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAgIHMgPSAiXFxuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBzID0gIlxcdCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgcyA9ICJcXHIiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiJyIgKyBzICsgIiciOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTGV4ZXJzIGNhbiBub3JtYWxseSBtYXRjaCBhbnkgY2hhciBpbiBpdCdzIHZvY2FidWxhcnkgYWZ0ZXIgbWF0Y2hpbmcKKyAgICAgICAgICogIGEgdG9rZW4sIHNvIGRvIHRoZSBlYXN5IHRoaW5nIGFuZCBqdXN0IGtpbGwgYSBjaGFyYWN0ZXIgYW5kIGhvcGUKKyAgICAgICAgICogIGl0IGFsbCB3b3JrcyBvdXQuICBZb3UgY2FuIGluc3RlYWQgdXNlIHRoZSBydWxlIGludm9jYXRpb24gc3RhY2sKKyAgICAgICAgICogIHRvIGRvIHNvcGhpc3RpY2F0ZWQgZXJyb3IgcmVjb3ZlcnkgaWYgeW91IGFyZSBpbiBhIGZyYWdtZW50IHJ1bGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlY292ZXIoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjb25zdW1pbmcgY2hhciAiKyhjaGFyKWlucHV0LkxBKDEpKyIgZHVyaW5nIHJlY292ZXJ5Iik7CisgICAgICAgICAgICAvL3JlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlSW4oc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSB7CisgICAgICAgICAgICBzdHJpbmcgaW5wdXRTeW1ib2wgPSAoKGNoYXIpaW5wdXQuTFQoMSkpICsgIiBsaW5lPSIgKyBMaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgYmFzZS5UcmFjZUluKHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFjZU91dChzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgIHN0cmluZyBpbnB1dFN5bWJvbCA9ICgoY2hhcilpbnB1dC5MVCgxKSkgKyAiIGxpbmU9IiArIExpbmUgKyAiOiIgKyBDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICBiYXNlLlRyYWNlT3V0KHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTdiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gOiBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKGV4cGVjdGluZywgaW5wdXQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZXhwZWN0aW5nLCBpbnB1dCwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKCIgKyBVbmV4cGVjdGVkVHlwZSArICIhPSIgKyBFeHBlY3RpbmcgKyAiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1NjRlOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL01pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gOiBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9hOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfYjsKKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oaW50IGEsIGludCBiLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLl9hID0gYTsKKyAgICAgICAgICAgIHRoaXMuX2IgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgaW50IGEsIGludCBiLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLl9hID0gYTsKKyAgICAgICAgICAgIHRoaXMuX2IgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgaW50IGEsIGludCBiLCBJSW50U3RyZWFtIGlucHV0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLl9hID0gYTsKKyAgICAgICAgICAgIHRoaXMuX2IgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIHRoaXMuX2EgPSBpbmZvLkdldEludDMyKCJBIik7CisgICAgICAgICAgICB0aGlzLl9iID0gaW5mby5HZXRJbnQzMigiQiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBBIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9hOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBCIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9iOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgR2V0T2JqZWN0RGF0YShTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICBiYXNlLkdldE9iamVjdERhdGEoaW5mbywgY29udGV4dCk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJBIiwgX2EpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiQiIsIF9iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbigiICsgVW5leHBlY3RlZFR5cGUgKyAiIG5vdCBpbiBbIiArIEEgKyAiLCIgKyBCICsgIl0pIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjZlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBBcmd1bWVudE51bGxFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBCaXRTZXQgX2V4cGVjdGluZzsKKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKEJpdFNldCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UoaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGV4cGVjdGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLl9leHBlY3RpbmcgPSBleHBlY3Rpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgQml0U2V0IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0LCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc21hdGNoZWRTZXRFeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICB0aGlzLl9leHBlY3RpbmcgPSAoQml0U2V0KWluZm8uR2V0VmFsdWUoIkV4cGVjdGluZyIsIHR5cGVvZihCaXRTZXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCaXRTZXQgRXhwZWN0aW5nIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9leHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkV4cGVjdGluZyIsIF9leHBlY3RpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigiICsgVW5leHBlY3RlZFR5cGUgKyAiIT0iICsgRXhwZWN0aW5nICsgIikiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uY3MKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBOb3RlIHRvIEpMOiBSZW1vdmVkIExJTlEgdXNhZ2VzIGZyb20gb3JpZ2luYWwKKyAqIAorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBTeXN0ZW07CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIC8qKiA8c3VtbWFyeT5BIG1pc21hdGNoZWQgY2hhciBvciBUb2tlbiBvciB0cmVlIG5vZGU8L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2V4cGVjdGluZyA9IFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZWFkT25seUNvbGxlY3Rpb248c3RyaW5nPiBfdG9rZW5OYW1lczsKKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogdGhpcyhleHBlY3RpbmcsIGlucHV0LCBudWxsKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcykKKyAgICAgICAgICAgIDogYmFzZShpbnB1dCkgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworCisgICAgICAgICAgICBpZiAodG9rZW5OYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuTmFtZXMgPSBuZXcgTGlzdDxzdHJpbmc+KHRva2VuTmFtZXMpLkFzUmVhZE9ubHkoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBJTGlzdDxzdHJpbmc+IHRva2VuTmFtZXMpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGV4cGVjdGluZzsKKworICAgICAgICAgICAgaWYgKHRva2VuTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuTmFtZXMgPSBuZXcgUmVhZE9ubHlDb2xsZWN0aW9uPHN0cmluZz4obmV3IExpc3Q8c3RyaW5nPih0b2tlbk5hbWVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBJTGlzdDxzdHJpbmc+IHRva2VuTmFtZXMsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGV4cGVjdGluZzsKKworICAgICAgICAgICAgaWYgKHRva2VuTmFtZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGlzLl90b2tlbk5hbWVzID0gbmV3IFJlYWRPbmx5Q29sbGVjdGlvbjxzdHJpbmc+KG5ldyBMaXN0PHN0cmluZz4odG9rZW5OYW1lcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGluZm8uR2V0SW50MzIoIkV4cGVjdGluZyIpOworICAgICAgICAgICAgdGhpcy5fdG9rZW5OYW1lcyA9IG5ldyBSZWFkT25seUNvbGxlY3Rpb248c3RyaW5nPigoc3RyaW5nW10paW5mby5HZXRWYWx1ZSgiVG9rZW5OYW1lcyIsIHR5cGVvZihzdHJpbmdbXSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgRXhwZWN0aW5nIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9leHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVhZE9ubHlDb2xsZWN0aW9uPHN0cmluZz4gVG9rZW5OYW1lcyB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW5OYW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiRXhwZWN0aW5nIiwgX2V4cGVjdGluZyk7CisgICAgICAgICAgICB2YXIgdG9rZW5BcnJheSA9IGRlZmF1bHQoc3RyaW5nW10pOworICAgICAgICAgICAgaWYgKF90b2tlbk5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0b2tlbkFycmF5ID0gbmV3IHN0cmluZ1tfdG9rZW5OYW1lcy5Db3VudF07CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0b2tlbiBpbiBfdG9rZW5OYW1lcykgeworICAgICAgICAgICAgICAgICAgICB0b2tlbkFycmF5W2krK10gPSB0b2tlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJUb2tlbk5hbWVzIiwgdG9rZW5BcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgaW50IHVuZXhwZWN0ZWRUeXBlID0gVW5leHBlY3RlZFR5cGU7CisgICAgICAgICAgICBzdHJpbmcgdW5leHBlY3RlZCA9IChUb2tlbk5hbWVzICE9IG51bGwgJiYgdW5leHBlY3RlZFR5cGUgPj0gMCAmJiB1bmV4cGVjdGVkVHlwZSA8IFRva2VuTmFtZXMuQ291bnQpID8gVG9rZW5OYW1lc1t1bmV4cGVjdGVkVHlwZV0gOiB1bmV4cGVjdGVkVHlwZS5Ub1N0cmluZygpOworICAgICAgICAgICAgc3RyaW5nIGV4cGVjdGVkID0gKFRva2VuTmFtZXMgIT0gbnVsbCAmJiBFeHBlY3RpbmcgPj0gMCAmJiBFeHBlY3RpbmcgPCBUb2tlbk5hbWVzLkNvdW50KSA/IFRva2VuTmFtZXNbRXhwZWN0aW5nXSA6IEV4cGVjdGluZy5Ub1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuICJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oIiArIHVuZXhwZWN0ZWQgKyAiIT0iICsgZXhwZWN0ZWQgKyAiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzODAwMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL01pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDk2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIElUcmVlTm9kZVN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZU5vZGVTdHJlYW07CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIDogUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZXhwZWN0aW5nOworCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbihpbnQgZXhwZWN0aW5nLCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UoaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGV4cGVjdGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElUcmVlTm9kZVN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCkgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgaW50IGV4cGVjdGluZywgSVRyZWVOb2RlU3RyZWFtIGlucHV0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLl9leHBlY3RpbmcgPSBleHBlY3Rpbmc7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gaW5mby5HZXRJbnQzMigiRXhwZWN0aW5nIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEV4cGVjdGluZyB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfZXhwZWN0aW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgR2V0T2JqZWN0RGF0YShTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICBiYXNlLkdldE9iamVjdERhdGEoaW5mbywgY29udGV4dCk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJFeHBlY3RpbmciLCBfZXhwZWN0aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbigiICsgVW5leHBlY3RlZFR5cGUgKyAiIT0iICsgRXhwZWN0aW5nICsgIikiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTI4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9NaXNzaW5nVG9rZW5FeGNlcHRpb24uY3MKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgV2Ugd2VyZSBleHBlY3RpbmcgYSB0b2tlbiBidXQgaXQncyBub3QgZm91bmQuICBUaGUgY3VycmVudCB0b2tlbgorICAgICAqICBpcyBhY3R1YWxseSB3aGF0IHdlIHdhbnRlZCBuZXh0LiAgVXNlZCBmb3IgdHJlZSBub2RlIGVycm9ycyB0b28uCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgTWlzc2luZ1Rva2VuRXhjZXB0aW9uIDogTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2luc2VydGVkOworCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbihpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBvYmplY3QgaW5zZXJ0ZWQpCisgICAgICAgICAgICA6IHRoaXMoZXhwZWN0aW5nLCBpbnB1dCwgaW5zZXJ0ZWQsIG51bGwpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCwgb2JqZWN0IGluc2VydGVkLCBJTGlzdDxzdHJpbmc+IHRva2VuTmFtZXMpCisgICAgICAgICAgICA6IGJhc2UoZXhwZWN0aW5nLCBpbnB1dCwgdG9rZW5OYW1lcykgeworICAgICAgICAgICAgdGhpcy5faW5zZXJ0ZWQgPSBpbnNlcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIG9iamVjdCBpbnNlcnRlZCwgSUxpc3Q8c3RyaW5nPiB0b2tlbk5hbWVzKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQsIHRva2VuTmFtZXMpIHsKKyAgICAgICAgICAgIHRoaXMuX2luc2VydGVkID0gaW5zZXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBvYmplY3QgaW5zZXJ0ZWQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcywgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQsIHRva2VuTmFtZXMsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLl9pbnNlcnRlZCA9IGluc2VydGVkOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1pc3NpbmdUeXBlIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV4cGVjdGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAoX2luc2VydGVkICE9IG51bGwgJiYgVG9rZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGluc2VydGVkICIgKyBfaW5zZXJ0ZWQgKyAiIGF0ICIgKyBUb2tlbi5UZXh0ICsgIikiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmdUb2tlbkV4Y2VwdGlvbihhdCAiICsgVG9rZW4uVGV4dCArICIpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL05vVmlhYmxlQWx0RXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMzRlYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL05vVmlhYmxlQWx0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIDogUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9kZWNpc2lvbk51bWJlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3N0YXRlTnVtYmVyOworCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihzdHJpbmcgZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuX2dyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uID0gZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9WaWFibGVBbHRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKSB7CisgICAgICAgICAgICB0aGlzLl9ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiA9IGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5vVmlhYmxlQWx0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBzdHJpbmcgZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24sIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhpcy5fZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gPSBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihzdHJpbmcgZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24sIGludCBkZWNpc2lvbk51bWJlciwgaW50IHN0YXRlTnVtYmVyLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLl9ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiA9IGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOworICAgICAgICAgICAgdGhpcy5fZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKKyAgICAgICAgICAgIHRoaXMuX3N0YXRlTnVtYmVyID0gc3RhdGVOdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9WaWFibGVBbHRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiwgaW50IGRlY2lzaW9uTnVtYmVyLCBpbnQgc3RhdGVOdW1iZXIsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuX2dyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uID0gZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgICAgICB0aGlzLl9kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyOworICAgICAgICAgICAgdGhpcy5fc3RhdGVOdW1iZXIgPSBzdGF0ZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uLCBpbnQgZGVjaXNpb25OdW1iZXIsIGludCBzdGF0ZU51bWJlciwgSUludFN0cmVhbSBpbnB1dCwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0LCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhpcy5fZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gPSBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisgICAgICAgICAgICB0aGlzLl9zdGF0ZU51bWJlciA9IHN0YXRlTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE5vVmlhYmxlQWx0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gPSBpbmZvLkdldFN0cmluZygiR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gaW5mby5HZXRJbnQzMigiRGVjaXNpb25OdW1iZXIiKTsKKyAgICAgICAgICAgIHRoaXMuX3N0YXRlTnVtYmVyID0gaW5mby5HZXRJbnQzMigiU3RhdGVOdW1iZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgRGVjaXNpb25OdW1iZXIgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RlY2lzaW9uTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBHcmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFN0YXRlTnVtYmVyIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdGF0ZU51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24iLCBfZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24pOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiRGVjaXNpb25OdW1iZXIiLCBfZGVjaXNpb25OdW1iZXIpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiU3RhdGVOdW1iZXIiLCBfc3RhdGVOdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChJbnB1dCBpcyBJQ2hhclN0cmVhbSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiTm9WaWFibGVBbHRFeGNlcHRpb24oJyIgKyAoY2hhcilVbmV4cGVjdGVkVHlwZSArICInQFsiICsgR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gKyAiXSkiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk5vVmlhYmxlQWx0RXhjZXB0aW9uKCIgKyBVbmV4cGVjdGVkVHlwZSArICJAWyIgKyBHcmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiArICJdKSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9QYXJzZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9QYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2MjQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1BhcnNlci5jcwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgQ29uZGl0aW9uYWxBdHRyaWJ1dGUgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgcGFyc2VyIGZvciBUb2tlblN0cmVhbXMuICAicGFyc2VyIGdyYW1tYXJzIiByZXN1bHQgaW4gYSBzdWJjbGFzcworICAgICAqICBvZiB0aGlzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIFBhcnNlciA6IEJhc2VSZWNvZ25pemVyIHsKKyAgICAgICAgcHVibGljIElUb2tlblN0cmVhbSBpbnB1dDsKKworICAgICAgICBwdWJsaWMgUGFyc2VyKElUb2tlblN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogYmFzZSgpIHsKKyAgICAgICAgICAgIC8vc3VwZXIoKTsgLy8gaGlnaGxpZ2h0IHRoYXQgd2UgZ28gdG8gc3VwZXIgdG8gc2V0IHN0YXRlIG9iamVjdAorICAgICAgICAgICAgVG9rZW5TdHJlYW0gPSBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJzZXIoSVRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpCisgICAgICAgICAgICA6IGJhc2Uoc3RhdGUpIC8vIHNoYXJlIHRoZSBzdGF0ZSBvYmplY3Qgd2l0aCBhbm90aGVyIHBhcnNlcgorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXNldCgpIHsKKyAgICAgICAgICAgIGJhc2UuUmVzZXQoKTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0LlNlZWsoMCk7IC8vIHJld2luZCB0aGUgaW5wdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgR2V0Q3VycmVudElucHV0U3ltYm9sKElJbnRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElUb2tlblN0cmVhbSlpbnB1dCkuTFQoMSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IEdldE1pc3NpbmdTeW1ib2woSUludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRUb2tlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgZm9sbG93KSB7CisgICAgICAgICAgICBzdHJpbmcgdG9rZW5UZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFRva2VuVHlwZSA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSkKKyAgICAgICAgICAgICAgICB0b2tlblRleHQgPSAiPG1pc3NpbmcgRU9GPiI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5UZXh0ID0gIjxtaXNzaW5nICIgKyBUb2tlbk5hbWVzW2V4cGVjdGVkVG9rZW5UeXBlXSArICI+IjsKKyAgICAgICAgICAgIENvbW1vblRva2VuIHQgPSBuZXcgQ29tbW9uVG9rZW4oZXhwZWN0ZWRUb2tlblR5cGUsIHRva2VuVGV4dCk7CisgICAgICAgICAgICBJVG9rZW4gY3VycmVudCA9ICgoSVRva2VuU3RyZWFtKWlucHV0KS5MVCgxKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LlR5cGUgPT0gVG9rZW5UeXBlcy5FbmRPZkZpbGUpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gKChJVG9rZW5TdHJlYW0paW5wdXQpLkxUKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQuTGluZSA9IGN1cnJlbnQuTGluZTsKKyAgICAgICAgICAgIHQuQ2hhclBvc2l0aW9uSW5MaW5lID0gY3VycmVudC5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB0LkNoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+R2V0cyBvciBzZXRzIHRoZSB0b2tlbiBzdHJlYW07IHJlc2V0cyB0aGUgcGFyc2VyIHVwb24gYSBzZXQuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW5TdHJlYW0gVG9rZW5TdHJlYW0geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBSZXNldCgpOworICAgICAgICAgICAgICAgIGlucHV0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFNvdXJjZU5hbWUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFjZUluKHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgeworICAgICAgICAgICAgYmFzZS5UcmFjZUluKHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0LkxUKDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFjZU91dChzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgIGJhc2UuVHJhY2VPdXQocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoMSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjZhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9QYXJzZXJSdWxlUmV0dXJuU2NvcGUuY3MKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgQ0xTQ29tcGxpYW50ID0gU3lzdGVtLkNMU0NvbXBsaWFudEF0dHJpYnV0ZTsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgUnVsZXMgdGhhdCByZXR1cm4gbW9yZSB0aGFuIGEgc2luZ2xlIHZhbHVlIG11c3QgcmV0dXJuIGFuIG9iamVjdAorICAgICAqICBjb250YWluaW5nIGFsbCB0aGUgdmFsdWVzLiAgQmVzaWRlcyB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluCisgICAgICogIFJ1bGVMYWJlbFNjb3BlLnByZWRlZmluZWRSdWxlUHJvcGVydGllc1Njb3BlIHRoZXJlIG1heSBiZSB1c2VyLWRlZmluZWQKKyAgICAgKiAgcmV0dXJuIHZhbHVlcy4gIFRoaXMgY2xhc3Mgc2ltcGx5IGRlZmluZXMgdGhlIG1pbmltdW0gcHJvcGVydGllcyB0aGF0CisgICAgICogIGFyZSBhbHdheXMgZGVmaW5lZCBhbmQgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIG90aGVycyB0aGF0IG1pZ2h0IGJlCisgICAgICogIGF2YWlsYWJsZSBkZXBlbmRpbmcgb24gb3V0cHV0IG9wdGlvbiBzdWNoIGFzIHRlbXBsYXRlIGFuZCB0cmVlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIE5vdGUgdGV4dCBpcyBub3QgYW4gYWN0dWFsIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gdmFsdWUsIGl0IGlzIGNvbXB1dGVkCisgICAgICogIGZyb20gc3RhcnQgYW5kIHN0b3AgdXNpbmcgdGhlIGlucHV0IHN0cmVhbSdzIHRvU3RyaW5nKCkgbWV0aG9kLiAgSQorICAgICAqICBjb3VsZCBhZGQgYSBjdG9yIHRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gcGFzcyBpbiBhbmQgc3RvcmUgdGhlIGlucHV0CisgICAgICogIHN0cmVhbSwgYnV0IEknbSBub3Qgc3VyZSB3ZSB3YW50IHRvIGRvIHRoYXQuICBJdCB3b3VsZCBzZWVtIHRvIGJlIHVuZGVmaW5lZAorICAgICAqICB0byBnZXQgdGhlIC50ZXh0IHByb3BlcnR5IGFueXdheSBpZiB0aGUgcnVsZSBtYXRjaGVzIHRva2VucyBmcm9tIG11bHRpcGxlCisgICAgICogIGlucHV0IHN0cmVhbXMuCisgICAgICoKKyAgICAgKiAgSSBkbyBub3QgdXNlIGdldHRlcnMgZm9yIGZpZWxkcyBvZiBvYmplY3RzIHRoYXQgYXJlIHVzZWQgc2ltcGx5IHRvCisgICAgICogIGdyb3VwIHZhbHVlcyBzdWNoIGFzIHRoaXMgYWdncmVnYXRlLiAgVGhlIGdldHRlcnMvc2V0dGVycyBhcmUgdGhlcmUgdG8KKyAgICAgKiAgc2F0aXNmeSB0aGUgc3VwZXJjbGFzcyBpbnRlcmZhY2UuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUGFyc2VyUnVsZVJldHVyblNjb3BlPFRUb2tlbj4gOiBJUnVsZVJldHVyblNjb3BlPFRUb2tlbj4KKyAgICAgICAgd2hlcmUgVFRva2VuIDogSVRva2VuIHsKKyAgICAgICAgcHJpdmF0ZSBUVG9rZW4gX3N0YXJ0OworICAgICAgICBwcml2YXRlIFRUb2tlbiBfc3RvcDsKKworICAgICAgICBwdWJsaWMgVFRva2VuIFN0YXJ0IHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdGFydDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBfc3RhcnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVG9rZW4gU3RvcCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3RvcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICBfc3RvcCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9SZWNvZ25pdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTU5Y2U4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uY3MKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBOb25TZXJpYWxpemVkID0gU3lzdGVtLk5vblNlcmlhbGl6ZWRBdHRyaWJ1dGU7CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+VGhlIHJvb3Qgb2YgdGhlIEFOVExSIGV4Y2VwdGlvbiBoaWVyYXJjaHkuPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPgorICAgICAqICBUbyBhdm9pZCBFbmdsaXNoLW9ubHkgZXJyb3IgbWVzc2FnZXMgYW5kIHRvIGdlbmVyYWxseSBtYWtlIHRoaW5ncworICAgICAqICBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZSwgdGhlc2UgZXhjZXB0aW9ucyBhcmUgbm90IGNyZWF0ZWQgd2l0aCBzdHJpbmdzLAorICAgICAqICBidXQgcmF0aGVyIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgYW4gZXJyb3IuICBUaGVuCisgICAgICogIHRoZSB2YXJpb3VzIHJlcG9ydGluZyBtZXRob2RzIGluIFBhcnNlciBhbmQgTGV4ZXIgY2FuIGJlIG92ZXJyaWRkZW4KKyAgICAgKiAgdG8gZ2VuZXJhdGUgYSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZS4gIEZvciBleGFtcGxlLCBNaXNtYXRjaGVkVG9rZW4KKyAgICAgKiAgZXhjZXB0aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgZXhwZWN0ZWQgdG9rZW4gdHlwZS4KKyAgICAgKiAgU28sIGRvbid0IGV4cGVjdCBnZXRNZXNzYWdlKCkgdG8gcmV0dXJuIGFueXRoaW5nLgorICAgICAqCisgICAgICogIE5vdGUgdGhhdCBhcyBvZiBKYXZhIDEuNCwgeW91IGNhbiBhY2Nlc3MgdGhlIHN0YWNrIHRyYWNlLCB3aGljaCBtZWFucworICAgICAqICB0aGF0IHlvdSBjYW4gY29tcHV0ZSB0aGUgY29tcGxldGUgdHJhY2Ugb2YgcnVsZXMgZnJvbSB0aGUgc3RhcnQgc3ltYm9sLgorICAgICAqICBUaGlzIGdpdmVzIHlvdSBjb25zaWRlcmFibGUgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIHRvIGdlbmVyYXRlCisgICAgICogIHVzZWZ1bCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqICBBTlRMUiBnZW5lcmF0ZXMgY29kZSB0aGF0IHRocm93cyBleGNlcHRpb25zIHVwb24gcmVjb2duaXRpb24gZXJyb3IgYW5kCisgICAgICogIGFsc28gZ2VuZXJhdGVzIGNvZGUgdG8gY2F0Y2ggdGhlc2UgZXhjZXB0aW9ucyBpbiBlYWNoIHJ1bGUuICBJZiB5b3UKKyAgICAgKiAgd2FudCB0byBxdWl0IHVwb24gZmlyc3QgZXJyb3IsIHlvdSBjYW4gdHVybiBvZmYgdGhlIGF1dG9tYXRpYyBlcnJvcgorICAgICAqICBoYW5kbGluZyBtZWNoYW5pc20gdXNpbmcgcnVsZWNhdGNoIGFjdGlvbiwgYnV0IHlvdSBzdGlsbCBuZWVkIHRvCisgICAgICogIG92ZXJyaWRlIG1ldGhvZHMgbWlzbWF0Y2ggYW5kIHJlY292ZXJGcm9tTWlzbWF0Y2hTZXQuCisgICAgICoKKyAgICAgKiAgSW4gZ2VuZXJhbCwgdGhlIHJlY29nbml0aW9uIGV4Y2VwdGlvbnMgY2FuIHRyYWNrIHdoZXJlIGluIGEgZ3JhbW1hciBhCisgICAgICogIHByb2JsZW0gb2NjdXJyZWQgYW5kL29yIHdoYXQgd2FzIHRoZSBleHBlY3RlZCBpbnB1dC4gIFdoaWxlIHRoZSBwYXJzZXIKKyAgICAgKiAga25vd3MgaXRzIHN0YXRlIChzdWNoIGFzIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFuZCBsaW5lIGluZm8pIHRoYXQKKyAgICAgKiAgc3RhdGUgY2FuIGNoYW5nZSBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBzbyBjdXJyZW50IHRva2VuIGluZGV4CisgICAgICogIGlzIGNvbXB1dGVkIGFuZCBzdG9yZWQgYXQgZXhjZXB0aW9uIHRpbWUuICBGcm9tIHRoaXMgaW5mbywgeW91IGNhbgorICAgICAqICBwZXJoYXBzIHByaW50IGFuIGVudGlyZSBsaW5lIG9mIGlucHV0IG5vdCBqdXN0IGEgc2luZ2xlIHRva2VuLCBmb3IgZXhhbXBsZS4KKyAgICAgKiAgQmV0dGVyIHRvIGp1c3Qgc2F5IHRoZSByZWNvZ25pemVyIGhhZCBhIHByb2JsZW0gYW5kIHRoZW4gbGV0IHRoZSBwYXJzZXIKKyAgICAgKiAgZmlndXJlIG91dCBhIGZhbmN5IHJlcG9ydC4KKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbiB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGlucHV0IHN0cmVhbSBkaWQgdGhlIGVycm9yIG9jY3VyIGluPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJpdmF0ZSBJSW50U3RyZWFtIF9pbnB1dDsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCBpcyBpbmRleCBvZiB0b2tlbi9jaGFyIHdlcmUgd2UgbG9va2luZyBhdCB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZD88L3N1bW1hcnk+ICovCisgICAgICAgIHByaXZhdGUgaW50IF9pbmRleDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgY3VycmVudCBUb2tlbiB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiAgU2luY2Ugbm90IGFsbCBzdHJlYW1zCisgICAgICAgICAqICBjYW4gcmV0cmlldmUgdGhlIGl0aCBUb2tlbiwgd2UgaGF2ZSB0byB0cmFjayB0aGUgVG9rZW4gb2JqZWN0LgorICAgICAgICAgKiAgRm9yIHBhcnNlcnMuICBFdmVuIHdoZW4gaXQncyBhIHRyZWUgcGFyc2VyLCB0b2tlbiBtaWdodCBiZSBzZXQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIElUb2tlbiBfdG9rZW47CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgdGhpcyBpcyBhIHRyZWUgcGFyc2VyIGV4Y2VwdGlvbiwgbm9kZSBpcyBzZXQgdG8gdGhlIG5vZGUgd2l0aAorICAgICAgICAgKiAgdGhlIHByb2JsZW0uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIG9iamVjdCBfbm9kZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGN1cnJlbnQgY2hhciB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiBGb3IgbGV4ZXJzLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2M7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJhY2sgdGhlIGxpbmUgKDEtYmFzZWQpIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZCBpbiBjYXNlIHRoaXMgaXMKKyAgICAgICAgICogIGdlbmVyYXRlZCBmcm9tIGEgbGV4ZXIuICBXZSBuZWVkIHRvIHRyYWNrIHRoaXMgc2luY2UgdGhlCisgICAgICAgICAqICB1bmV4cGVjdGVkIGNoYXIgZG9lc24ndCBjYXJyeSB0aGUgbGluZSBpbmZvLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2xpbmU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIDAtYmFzZWQgaW5kZXggaW50byB0aGUgbGluZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IF9jaGFyUG9zaXRpb25JbkxpbmU7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgeW91IGFyZSBwYXJzaW5nIGEgdHJlZSBub2RlIHN0cmVhbSwgeW91IHdpbGwgZW5jb3VudGVyIHNvbQorICAgICAgICAgKiAgaW1hZ2luYXJ5IG5vZGVzIHcvbyBsaW5lL2NvbCBpbmZvLiAgV2Ugbm93IHNlYXJjaCBiYWNrd2FyZHMgbG9va2luZworICAgICAgICAgKiAgZm9yIG1vc3QgcmVjZW50IHRva2VuIHdpdGggbGluZS9jb2wgaW5mbywgYnV0IG5vdGlmeSBnZXRFcnJvckhlYWRlcigpCisgICAgICAgICAqICB0aGF0IGluZm8gaXMgYXBwcm94aW1hdGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2wgX2FwcHJveGltYXRlTGluZUluZm87CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlVzZWQgZm9yIHJlbW90ZSBkZWJ1Z2dlciBkZXNlcmlhbGl6YXRpb248L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBSZWNvZ25pdGlvbkV4Y2VwdGlvbigpCisgICAgICAgICAgICA6IHRoaXMoIkEgcmVjb2duaXRpb24gZXJyb3Igb2NjdXJyZWQuIiwgbnVsbCwgbnVsbCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlY29nbml0aW9uRXhjZXB0aW9uKElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IHRoaXMoIkEgcmVjb2duaXRpb24gZXJyb3Igb2NjdXJyZWQuIiwgaW5wdXQsIG51bGwpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWNvZ25pdGlvbkV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogdGhpcyhtZXNzYWdlLCBudWxsLCBudWxsKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IHRoaXMobWVzc2FnZSwgaW5wdXQsIG51bGwpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWNvZ25pdGlvbkV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiB0aGlzKG1lc3NhZ2UsIG51bGwsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIElJbnRTdHJlYW0gaW5wdXQsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhpcy5faW5wdXQgPSBpbnB1dDsKKyAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgaXMgSVRva2VuU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gKChJVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9saW5lID0gX3Rva2VuLkxpbmU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9IF90b2tlbi5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbnB1dCBpcyBJVHJlZU5vZGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEluZm9ybWF0aW9uRnJvbVRyZWVOb2RlU3RyZWFtKGlucHV0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0IGlzIElDaGFyU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2MgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9ICgoSUNoYXJTdHJlYW0paW5wdXQpLkxpbmU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9ICgoSUNoYXJTdHJlYW0paW5wdXQpLkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl9jID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJlY29nbml0aW9uRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgX2luZGV4ID0gaW5mby5HZXRJbnQzMigiSW5kZXgiKTsKKyAgICAgICAgICAgIF9jID0gaW5mby5HZXRJbnQzMigiQyIpOworICAgICAgICAgICAgX2xpbmUgPSBpbmZvLkdldEludDMyKCJMaW5lIik7CisgICAgICAgICAgICBfY2hhclBvc2l0aW9uSW5MaW5lID0gaW5mby5HZXRJbnQzMigiQ2hhclBvc2l0aW9uSW5MaW5lIik7CisgICAgICAgICAgICBfYXBwcm94aW1hdGVMaW5lSW5mbyA9IGluZm8uR2V0Qm9vbGVhbigiQXBwcm94aW1hdGVMaW5lSW5mbyIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldHVybiB0aGUgdG9rZW4gdHlwZSBvciBjaGFyIG9mIHRoZSB1bmV4cGVjdGVkIGlucHV0IGVsZW1lbnQ8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBVbmV4cGVjdGVkVHlwZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmIChfaW5wdXQgaXMgSVRva2VuU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW4uVHlwZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJVHJlZU5vZGVTdHJlYW0gdHJlZU5vZGVTdHJlYW0gPSBfaW5wdXQgYXMgSVRyZWVOb2RlU3RyZWFtOworICAgICAgICAgICAgICAgIGlmICh0cmVlTm9kZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIElUcmVlQWRhcHRvciBhZGFwdG9yID0gdHJlZU5vZGVTdHJlYW0uVHJlZUFkYXB0b3I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFR5cGUoX25vZGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBfYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIEFwcHJveGltYXRlTGluZUluZm8geworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FwcHJveGltYXRlTGluZUluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0IHsKKyAgICAgICAgICAgICAgICBfYXBwcm94aW1hdGVMaW5lSW5mbyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElJbnRTdHJlYW0gSW5wdXQgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvdGVjdGVkIHNldCB7CisgICAgICAgICAgICAgICAgX2lucHV0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSVRva2VuIFRva2VuIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgX3Rva2VuID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IE5vZGUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX25vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0IHsKKyAgICAgICAgICAgICAgICBfbm9kZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDaGFyYWN0ZXIgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0IHsKKyAgICAgICAgICAgICAgICBfYyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBJbmRleCB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0IHsKKyAgICAgICAgICAgICAgICBfaW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgTGluZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBfbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldCB7CisgICAgICAgICAgICAgICAgX2xpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ2hhclBvc2l0aW9uSW5MaW5lIHsKKyAgICAgICAgICAgIGdldCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQgeworICAgICAgICAgICAgICAgIF9jaGFyUG9zaXRpb25JbkxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiSW5kZXgiLCBfaW5kZXgpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiQyIsIF9jKTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkxpbmUiLCBfbGluZSk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJDaGFyUG9zaXRpb25JbkxpbmUiLCBfY2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkFwcHJveGltYXRlTGluZUluZm8iLCBfYXBwcm94aW1hdGVMaW5lSW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEV4dHJhY3RJbmZvcm1hdGlvbkZyb21UcmVlTm9kZVN0cmVhbShJSW50U3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICBJVG9rZW5TdHJlYW1JbmZvcm1hdGlvbiBzdHJlYW1JbmZvcm1hdGlvbiA9IGlucHV0IGFzIElUb2tlblN0cmVhbUluZm9ybWF0aW9uOworICAgICAgICAgICAgaWYgKHN0cmVhbUluZm9ybWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJVG9rZW4gbGFzdFRva2VuID0gc3RyZWFtSW5mb3JtYXRpb24uTGFzdFRva2VuOworICAgICAgICAgICAgICAgIElUb2tlbiBsYXN0UmVhbFRva2VuID0gc3RyZWFtSW5mb3JtYXRpb24uTGFzdFJlYWxUb2tlbjsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFJlYWxUb2tlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gbGFzdFJlYWxUb2tlbjsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9IGxhc3RSZWFsVG9rZW4uTGluZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhclBvc2l0aW9uSW5MaW5lID0gbGFzdFJlYWxUb2tlbi5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcHJveGltYXRlTGluZUluZm8gPSBsYXN0UmVhbFRva2VuLkVxdWFscyhsYXN0VG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSVRyZWVOb2RlU3RyZWFtIG5vZGVzID0gKElUcmVlTm9kZVN0cmVhbSlpbnB1dDsKKyAgICAgICAgICAgICAgICB0aGlzLl9ub2RlID0gbm9kZXMuTFQoMSk7CisgICAgICAgICAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBub2Rlcy5UcmVlQWRhcHRvcjsKKyAgICAgICAgICAgICAgICBJVG9rZW4gcGF5bG9hZCA9IGFkYXB0b3IuR2V0VG9rZW4oX25vZGUpOworICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSBwYXlsb2FkOworICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5MaW5lIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltYWdpbmFyeSBub2RlOyBubyBsaW5lL3BvcyBpbmZvOyBzY2FuIGJhY2t3YXJkcworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBwcmlvck5vZGUgPSBub2Rlcy5MVChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcmlvck5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUb2tlbiBwcmlvclBheWxvYWQgPSBhZGFwdG9yLkdldFRva2VuKHByaW9yTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW9yUGF5bG9hZCAhPSBudWxsICYmIHByaW9yUGF5bG9hZC5MaW5lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBmb3VuZCB0aGUgbW9zdCByZWNlbnQgcmVhbCBsaW5lIC8gcG9zIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9IHByaW9yUGF5bG9hZC5MaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFyUG9zaXRpb25JbkxpbmUgPSBwcmlvclBheWxvYWQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHByb3hpbWF0ZUxpbmVJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvck5vZGUgPSBub2Rlcy5MVChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbm9kZSBjcmVhdGVkIGZyb20gcmVhbCB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9IHBheWxvYWQuTGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9IHBheWxvYWQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ub2RlIGlzIFRyZWUuSVRyZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9ICgoVHJlZS5JVHJlZSl0aGlzLl9ub2RlKS5MaW5lOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFyUG9zaXRpb25JbkxpbmUgPSAoKFRyZWUuSVRyZWUpdGhpcy5fbm9kZSkuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbm9kZSBpcyBDb21tb25UcmVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9ICgoQ29tbW9uVHJlZSl0aGlzLl9ub2RlKS5Ub2tlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKHRoaXMuX25vZGUpOworICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCh0aGlzLl9ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4odHlwZSwgdGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTUxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9SZWNvZ25pemVyU2hhcmVkU3RhdGUuY3MKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIENMU0NvbXBsaWFudCA9IFN5c3RlbS5DTFNDb21wbGlhbnRBdHRyaWJ1dGU7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhlIHNldCBvZiBmaWVsZHMgbmVlZGVkIGJ5IGFuIGFic3RyYWN0IHJlY29nbml6ZXIgdG8gcmVjb2duaXplIGlucHV0CisgICAgICogIGFuZCByZWNvdmVyIGZyb20gZXJyb3JzIGV0Yy4uLiAgQXMgYSBzZXBhcmF0ZSBzdGF0ZSBvYmplY3QsIGl0IGNhbiBiZQorICAgICAqICBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgZ3JhbW1hcnM7IGUuZy4sIHdoZW4gb25lIGdyYW1tYXIgaW1wb3J0cyBhbm90aGVyLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIFRoZXNlIGZpZWxkcyBhcmUgcHVibGljYWxseSB2aXNpYmxlIGJ1dCB0aGUgYWN0dWFsIHN0YXRlIHBvaW50ZXIgcGVyCisgICAgICogIHBhcnNlciBpcyBwcm90ZWN0ZWQuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUmVjb2duaXplclNoYXJlZFN0YXRlIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJhY2sgdGhlIHNldCBvZiB0b2tlbiB0eXBlcyB0aGF0IGNhbiBmb2xsb3cgYW55IHJ1bGUgaW52b2NhdGlvbi4KKyAgICAgICAgICogIFN0YWNrIGdyb3dzIHVwd2FyZHMuICBXaGVuIGl0IGhpdHMgdGhlIG1heCwgaXQgZ3Jvd3MgMnggaW4gc2l6ZQorICAgICAgICAgKiAgYW5kIGtlZXBzIGdvaW5nLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgLy9wdWJsaWMgTGlzdDxCaXRTZXQ+IGZvbGxvd2luZzsKKyAgICAgICAgcHVibGljIEJpdFNldFtdIGZvbGxvd2luZzsKKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldCisgICAgICAgIHB1YmxpYyBpbnQgX2ZzcDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGlzIGlzIHRydWUgd2hlbiB3ZSBzZWUgYW4gZXJyb3IgYW5kIGJlZm9yZSBoYXZpbmcgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAqICBtYXRjaGVkIGEgdG9rZW4uICBQcmV2ZW50cyBnZW5lcmF0aW9uIG9mIG1vcmUgdGhhbiBvbmUgZXJyb3IgbWVzc2FnZQorICAgICAgICAgKiAgcGVyIGVycm9yLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2wgZXJyb3JSZWNvdmVyeTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgaW5kZXggaW50byB0aGUgaW5wdXQgc3RyZWFtIHdoZXJlIHRoZSBsYXN0IGVycm9yIG9jY3VycmVkLgorICAgICAgICAgKiAJVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlcmUgYW4gZXJyb3IgaXMgZm91bmQKKyAgICAgICAgICogIGJ1dCBubyB0b2tlbiBpcyBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuLi5hbm90aGVyIGVycm9yIGlzIGZvdW5kLAorICAgICAgICAgKiAgYWQgbmFzZXVtLiAgVGhpcyBpcyBhIGZhaWxzYWZlIG1lY2hhbmlzbSB0byBndWFyYW50ZWUgdGhhdCBhdCBsZWFzdAorICAgICAgICAgKiAgb25lIHRva2VuL3RyZWUgbm9kZSBpcyBjb25zdW1lZCBmb3IgdHdvIGVycm9ycy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgbGFzdEVycm9ySW5kZXg7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSW4gbGlldSBvZiBhIHJldHVybiB2YWx1ZSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHJ1bGUgb3IgdG9rZW4KKyAgICAgICAgICogIGhhcyBmYWlsZWQgdG8gbWF0Y2guICBSZXNldCB0byBmYWxzZSB1cG9uIHZhbGlkIHRva2VuIG1hdGNoLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2wgZmFpbGVkOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5EaWQgdGhlIHJlY29nbml6ZXIgZW5jb3VudGVyIGEgc3ludGF4IGVycm9yPyAgVHJhY2sgaG93IG1hbnkuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgaW50IHN5bnRheEVycm9yczsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiAwLCBubyBiYWNrdHJhY2tpbmcgaXMgZ29pbmcgb24uICBTYWZlIHRvIGV4ZWMgYWN0aW9ucyBldGMuLi4KKyAgICAgICAgICogIElmID4wIHRoZW4gaXQncyB0aGUgbGV2ZWwgb2YgYmFja3RyYWNraW5nLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBiYWNrdHJhY2tpbmc7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQW4gYXJyYXlbc2l6ZSBudW0gcnVsZXNdIG9mIE1hcDxJbnRlZ2VyLEludGVnZXI+IHRoYXQgdHJhY2tzCisgICAgICAgICAqICB0aGUgc3RvcCB0b2tlbiBpbmRleCBmb3IgZWFjaCBydWxlLiAgcnVsZU1lbW9bcnVsZUluZGV4XSBpcworICAgICAgICAgKiAgdGhlIG1lbW9pemF0aW9uIHRhYmxlIGZvciBydWxlSW5kZXguICBGb3Iga2V5IHJ1bGVTdGFydEluZGV4LCB5b3UKKyAgICAgICAgICogIGdldCBiYWNrIHRoZSBzdG9wIHRva2VuIGZvciBhc3NvY2lhdGVkIHJ1bGUgb3IgTUVNT19SVUxFX0ZBSUxFRC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPlRoaXMgaXMgb25seSB1c2VkIGlmIHJ1bGUgbWVtb2l6YXRpb24gaXMgb24gKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpLjwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxpbnQsIGludD5bXSBydWxlTWVtbzsKKworCisgICAgICAgIC8vIExFWEVSIEZJRUxEUyAobXVzdCBiZSBpbiBzYW1lIHN0YXRlIG9iamVjdCB0byBhdm9pZCBjYXN0aW5nCisgICAgICAgIC8vICAgICAgICAgICAgICAgY29uc3RhbnRseSBpbiBnZW5lcmF0ZWQgY29kZSBhbmQgTGV4ZXIgb2JqZWN0KSA6KAorCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGhlIGdvYWwgb2YgYWxsIGxleGVyIHJ1bGVzL21ldGhvZHMgaXMgdG8gY3JlYXRlIGEgdG9rZW4gb2JqZWN0LgorICAgICAgICAgKiAgVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSBhcyBtdWx0aXBsZSBydWxlcyBtYXkgY29sbGFib3JhdGUgdG8KKyAgICAgICAgICogIGNyZWF0ZSBhIHNpbmdsZSB0b2tlbi4gIG5leHRUb2tlbiB3aWxsIHJldHVybiB0aGlzIG9iamVjdCBhZnRlcgorICAgICAgICAgKiAgbWF0Y2hpbmcgbGV4ZXIgcnVsZShzKS4gIElmIHlvdSBzdWJjbGFzcyB0byBhbGxvdyBtdWx0aXBsZSB0b2tlbgorICAgICAgICAgKiAgZW1pc3Npb25zLCB0aGVuIHNldCB0aGlzIHRvIHRoZSBsYXN0IHRva2VuIHRvIGJlIG1hdGNoZWQgb3IKKyAgICAgICAgICogIHNvbWV0aGluZyBub25udWxsIHNvIHRoYXQgdGhlIGF1dG8gdG9rZW4gZW1pdCBtZWNoYW5pc20gd2lsbCBub3QKKyAgICAgICAgICogIGVtaXQgYW5vdGhlciB0b2tlbi4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJVG9rZW4gdG9rZW47CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hhdCBjaGFyYWN0ZXIgaW5kZXggaW4gdGhlIHN0cmVhbSBkaWQgdGhlIGN1cnJlbnQgdG9rZW4gc3RhcnQgYXQ/CisgICAgICAgICAqICBOZWVkZWQsIGZvciBleGFtcGxlLCB0byBnZXQgdGhlIHRleHQgZm9yIGN1cnJlbnQgdG9rZW4uICBTZXQgYXQKKyAgICAgICAgICogIHRoZSBzdGFydCBvZiBuZXh0VG9rZW4uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHRva2VuU3RhcnRDaGFySW5kZXg7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBsaW5lIG9uIHdoaWNoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHRva2VuIHJlc2lkZXM8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBpbnQgdG9rZW5TdGFydExpbmU7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgZmlyc3QgY2hhcmFjdGVyIHdpdGhpbiB0aGUgbGluZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHRva2VuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgaW50IGNoYW5uZWw7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSB0b2tlbiB0eXBlIGZvciB0aGUgY3VycmVudCB0b2tlbjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCB0eXBlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFlvdSBjYW4gc2V0IHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCB0b2tlbiB0byBvdmVycmlkZSB3aGF0IGlzIGluCisgICAgICAgICAqICB0aGUgaW5wdXQgY2hhciBidWZmZXIuICBVc2Ugc2V0VGV4dCgpIG9yIGNhbiBzZXQgdGhpcyBpbnN0YW5jZSB2YXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RyaW5nIHRleHQ7CisKKyAgICAgICAgcHVibGljIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpIHsKKyAgICAgICAgICAgIC8vZm9sbG93aW5nID0gbmV3IExpc3Q8Qml0U2V0PiggQmFzZVJlY29nbml6ZXIuSW5pdGlhbEZvbGxvd1N0YWNrU2l6ZSApOworICAgICAgICAgICAgZm9sbG93aW5nID0gbmV3IEJpdFNldFtCYXNlUmVjb2duaXplci5Jbml0aWFsRm9sbG93U3RhY2tTaXplXTsKKyAgICAgICAgICAgIF9mc3AgPSAtMTsKKyAgICAgICAgICAgIGxhc3RFcnJvckluZGV4ID0gLTE7CisgICAgICAgICAgICB0b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVjb2duaXplclNoYXJlZFN0YXRlKFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigic3RhdGUiKTsKKworICAgICAgICAgICAgZm9sbG93aW5nID0gKEJpdFNldFtdKXN0YXRlLmZvbGxvd2luZy5DbG9uZSgpOworICAgICAgICAgICAgX2ZzcCA9IHN0YXRlLl9mc3A7CisgICAgICAgICAgICBlcnJvclJlY292ZXJ5ID0gc3RhdGUuZXJyb3JSZWNvdmVyeTsKKyAgICAgICAgICAgIGxhc3RFcnJvckluZGV4ID0gc3RhdGUubGFzdEVycm9ySW5kZXg7CisgICAgICAgICAgICBmYWlsZWQgPSBzdGF0ZS5mYWlsZWQ7CisgICAgICAgICAgICBzeW50YXhFcnJvcnMgPSBzdGF0ZS5zeW50YXhFcnJvcnM7CisgICAgICAgICAgICBiYWNrdHJhY2tpbmcgPSBzdGF0ZS5iYWNrdHJhY2tpbmc7CisKKyAgICAgICAgICAgIGlmIChzdGF0ZS5ydWxlTWVtbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJ1bGVNZW1vID0gKElEaWN0aW9uYXJ5PGludCwgaW50PltdKXN0YXRlLnJ1bGVNZW1vLkNsb25lKCk7CisKKyAgICAgICAgICAgIHRva2VuID0gc3RhdGUudG9rZW47CisgICAgICAgICAgICB0b2tlblN0YXJ0Q2hhckluZGV4ID0gc3RhdGUudG9rZW5TdGFydENoYXJJbmRleDsKKyAgICAgICAgICAgIHRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgY2hhbm5lbCA9IHN0YXRlLmNoYW5uZWw7CisgICAgICAgICAgICB0eXBlID0gc3RhdGUudHlwZTsKKyAgICAgICAgICAgIHRleHQgPSBzdGF0ZS50ZXh0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUnVsZVJldHVyblNjb3BlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvUnVsZVJldHVyblNjb3BlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGI2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9SdWxlUmV0dXJuU2NvcGUuY3MKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSdWxlcyBjYW4gaGF2ZSBzdGFydC9zdG9wIGluZm8uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUTGFiZWwiPlRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGlucHV0IHN0cmVhbS48L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElSdWxlUmV0dXJuU2NvcGU8VExhYmVsPiB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHN0YXJ0IGVsZW1lbnQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRMYWJlbCBTdGFydCB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBzdG9wIGVsZW1lbnQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRMYWJlbCBTdG9wIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1Rva2VuQ29uc3RhbnRzLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvVG9rZW5Db25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhMjcwNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1Rva2VuQ29uc3RhbnRzLmNzCkBAIC0wLDAgKzEsOTcgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuQ2hhbm5lbHMKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFsbCB0b2tlbnMgZ28gdG8gdGhlIHBhcnNlciAodW5sZXNzIHNraXAoKSBpcyBjYWxsZWQgaW4gdGhhdCBydWxlKQorICAgICAgICAgKiAgb24gYSBwYXJ0aWN1bGFyICJjaGFubmVsIi4gIFRoZSBwYXJzZXIgdHVuZXMgdG8gYSBwYXJ0aWN1bGFyIGNoYW5uZWwKKyAgICAgICAgICogIHNvIHRoYXQgd2hpdGVzcGFjZSBldGMuLi4gY2FuIGdvIHRvIHRoZSBwYXJzZXIgb24gYSAiaGlkZGVuIiBjaGFubmVsLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0ID0gMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBbnl0aGluZyBvbiBkaWZmZXJlbnQgY2hhbm5lbCB0aGFuIERFRkFVTFRfQ0hBTk5FTCBpcyBub3QgcGFyc2VkCisgICAgICAgICAqICBieSBwYXJzZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEhpZGRlbiA9IDk5OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG9rZW5UeXBlcworICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFbmRPZkZpbGUgPSAoaW50KUNoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEludmFsaWQgPSAwOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVuZE9mUnVsZSA9IDE7CisgICAgICAgIC8qKiA8c3VtbWFyeT5pbWFnaW5hcnkgdHJlZSBuYXZpZ2F0aW9uIHR5cGU7IHRyYXZlcnNlICJnZXQgY2hpbGQiIGxpbms8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRG93biA9IDI7CisgICAgICAgIC8qKiA8c3VtbWFyeT5pbWFnaW5hcnkgdHJlZSBuYXZpZ2F0aW9uIHR5cGU7IGZpbmlzaCB3aXRoIGEgY2hpbGQgbGlzdDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBVcCA9IDM7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWluID0gVXAgKyAxOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG9rZW5zCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElUb2tlbiBFbmRPZkZpbGUgPSBUb2tlbnM8Q29tbW9uVG9rZW4+LkVuZE9mRmlsZTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElUb2tlbiBJbnZhbGlkID0gbmV3IENvbW1vblRva2VuKCBUb2tlblR5cGVzLkludmFsaWQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJbiBhbiBhY3Rpb24sIGEgbGV4ZXIgcnVsZSBjYW4gc2V0IHRva2VuIHRvIHRoaXMgU0tJUF9UT0tFTiBhbmQgQU5UTFIKKyAgICAgICAgICogIHdpbGwgYXZvaWQgY3JlYXRpbmcgYSB0b2tlbiBmb3IgdGhpcyBzeW1ib2wgYW5kIHRyeSB0byBmZXRjaCBhbm90aGVyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJVG9rZW4gU2tpcCA9IG5ldyBDb21tb25Ub2tlbiggVG9rZW5UeXBlcy5JbnZhbGlkICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb2tlbnM8VD4KKyAgICAgICAgd2hlcmUgVCA6IElUb2tlbiwgbmV3KCkKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVCBFbmRPZkZpbGUgPSBuZXcgVCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgPSBUb2tlblR5cGVzLkVuZE9mRmlsZQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVCBJbnZhbGlkID0gbmV3IFQoKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gVG9rZW5UeXBlcy5JbnZhbGlkCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUIFNraXAgPSBuZXcgVCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgPSBUb2tlblR5cGVzLkludmFsaWQKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiZjgzZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1Rva2VuUmV3cml0ZVN0cmVhbS5jcwpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBBcmd1bWVudEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbjsKKyAgICB1c2luZyBEZWJ1Z2dlckRpc3BsYXkgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJEaXNwbGF5QXR0cmlidXRlOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisgICAgdXNpbmcgVHlwZSA9IFN5c3RlbS5UeXBlOworCisgICAgLyoqIFVzZWZ1bCBmb3IgZHVtcGluZyBvdXQgdGhlIGlucHV0IHN0cmVhbSBhZnRlciBkb2luZyBzb21lCisgICAgICogIGF1Z21lbnRhdGlvbiBvciBvdGhlciBtYW5pcHVsYXRpb25zLgorICAgICAqCisgICAgICogIFlvdSBjYW4gaW5zZXJ0IHN0dWZmLCByZXBsYWNlLCBhbmQgZGVsZXRlIGNodW5rcy4gIE5vdGUgdGhhdCB0aGUKKyAgICAgKiAgb3BlcmF0aW9ucyBhcmUgZG9uZSBsYXppbHktLW9ubHkgaWYgeW91IGNvbnZlcnQgdGhlIGJ1ZmZlciB0byBhCisgICAgICogIFN0cmluZy4gIFRoaXMgaXMgdmVyeSBlZmZpY2llbnQgYmVjYXVzZSB5b3UgYXJlIG5vdCBtb3ZpbmcgZGF0YSBhcm91bmQKKyAgICAgKiAgYWxsIHRoZSB0aW1lLiAgQXMgdGhlIGJ1ZmZlciBvZiB0b2tlbnMgaXMgY29udmVydGVkIHRvIHN0cmluZ3MsIHRoZQorICAgICAqICB0b1N0cmluZygpIG1ldGhvZChzKSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gb3BlcmF0aW9uIGF0IHRoZQorICAgICAqICBjdXJyZW50IGluZGV4LiAgSWYgc28sIHRoZSBvcGVyYXRpb24gaXMgZG9uZSBhbmQgdGhlbiBub3JtYWwgU3RyaW5nCisgICAgICogIHJlbmRlcmluZyBjb250aW51ZXMgb24gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgbGlrZSBoYXZpbmcgbXVsdGlwbGUgVHVyaW5nCisgICAgICogIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyAocHJvZ3JhbXMpIG9wZXJhdGluZyBvbiBhIHNpbmdsZSBpbnB1dCB0YXBlLiA6KQorICAgICAqCisgICAgICogIFNpbmNlIHRoZSBvcGVyYXRpb25zIGFyZSBkb25lIGxhemlseSBhdCB0b1N0cmluZy10aW1lLCBvcGVyYXRpb25zIGRvIG5vdAorICAgICAqICBzY3JldyB1cCB0aGUgdG9rZW4gaW5kZXggdmFsdWVzLiAgVGhhdCBpcywgYW4gaW5zZXJ0IG9wZXJhdGlvbiBhdCB0b2tlbgorICAgICAqICBpbmRleCBpIGRvZXMgbm90IGNoYW5nZSB0aGUgaW5kZXggdmFsdWVzIGZvciB0b2tlbnMgaSsxLi5uLTEuCisgICAgICoKKyAgICAgKiAgQmVjYXVzZSBvcGVyYXRpb25zIG5ldmVyIGFjdHVhbGx5IGFsdGVyIHRoZSBidWZmZXIsIHlvdSBtYXkgYWx3YXlzIGdldAorICAgICAqICB0aGUgb3JpZ2luYWwgdG9rZW4gc3RyZWFtIGJhY2sgd2l0aG91dCB1bmRvaW5nIGFueXRoaW5nLiAgU2luY2UKKyAgICAgKiAgdGhlIGluc3RydWN0aW9ucyBhcmUgcXVldWVkIHVwLCB5b3UgY2FuIGVhc2lseSBzaW11bGF0ZSB0cmFuc2FjdGlvbnMgYW5kCisgICAgICogIHJvbGwgYmFjayBhbnkgY2hhbmdlcyBpZiB0aGVyZSBpcyBhbiBlcnJvciBqdXN0IGJ5IHJlbW92aW5nIGluc3RydWN0aW9ucy4KKyAgICAgKiAgRm9yIGV4YW1wbGUsCisgICAgICoKKyAgICAgKiAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKCJpbnB1dCIpOworICAgICAqICAgVExleGVyIGxleCA9IG5ldyBUTGV4ZXIoaW5wdXQpOworICAgICAqICAgVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4KTsKKyAgICAgKiAgIFQgcGFyc2VyID0gbmV3IFQodG9rZW5zKTsKKyAgICAgKiAgIHBhcnNlci5zdGFydFJ1bGUoKTsKKyAgICAgKgorICAgICAqIAkgVGhlbiBpbiB0aGUgcnVsZXMsIHlvdSBjYW4gZXhlY3V0ZQorICAgICAqICAgICAgVG9rZW4gdCx1OworICAgICAqICAgICAgLi4uCisgICAgICogICAgICBpbnB1dC5pbnNlcnRBZnRlcih0LCAidGV4dCB0byBwdXQgYWZ0ZXIgdCIpO30KKyAgICAgKiAJCWlucHV0Lmluc2VydEFmdGVyKHUsICJ0ZXh0IGFmdGVyIHUiKTt9CisgICAgICogCQlTeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLnRvU3RyaW5nKCkpOworICAgICAqCisgICAgICogIEFjdHVhbGx5LCB5b3UgaGF2ZSB0byBjYXN0IHRoZSAnaW5wdXQnIHRvIGEgVG9rZW5SZXdyaXRlU3RyZWFtLiA6KAorICAgICAqCisgICAgICogIFlvdSBjYW4gYWxzbyBoYXZlIG11bHRpcGxlICJpbnN0cnVjdGlvbiBzdHJlYW1zIiBhbmQgZ2V0IG11bHRpcGxlCisgICAgICogIHJld3JpdGVzIGZyb20gYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBpbnB1dC4gIEp1c3QgbmFtZSB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgKiAgc3RyZWFtcyBhbmQgdXNlIHRoYXQgbmFtZSBhZ2FpbiB3aGVuIHByaW50aW5nIHRoZSBidWZmZXIuICBUaGlzIGNvdWxkIGJlCisgICAgICogIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBhIEMgZmlsZSBhbmQgYWxzbyBpdHMgaGVhZGVyIGZpbGUtLWFsbCBmcm9tIHRoZQorICAgICAqICBzYW1lIGJ1ZmZlcjoKKyAgICAgKgorICAgICAqICAgICAgdG9rZW5zLmluc2VydEFmdGVyKCJwYXNzMSIsIHQsICJ0ZXh0IHRvIHB1dCBhZnRlciB0Iik7fQorICAgICAqIAkJdG9rZW5zLmluc2VydEFmdGVyKCJwYXNzMiIsIHUsICJ0ZXh0IGFmdGVyIHUiKTt9CisgICAgICogCQlTeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLnRvU3RyaW5nKCJwYXNzMSIpKTsKKyAgICAgKiAJCVN5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMudG9TdHJpbmcoInBhc3MyIikpOworICAgICAqCisgICAgICogIElmIHlvdSBkb24ndCB1c2UgbmFtZWQgcmV3cml0ZSBzdHJlYW1zLCBhICJkZWZhdWx0IiBzdHJlYW0gaXMgdXNlZCBhcworICAgICAqICB0aGUgZmlyc3QgZXhhbXBsZSBzaG93cy4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBbRGVidWdnZXJEaXNwbGF5KCJUT0RPOiBUb2tlblJld3JpdGVTdHJlYW0gZGVidWdnZXIgZGlzcGxheSIpXQorICAgIHB1YmxpYyBjbGFzcyBUb2tlblJld3JpdGVTdHJlYW0gOiBDb21tb25Ub2tlblN0cmVhbSB7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgREVGQVVMVF9QUk9HUkFNX05BTUUgPSAiZGVmYXVsdCI7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgUFJPR1JBTV9JTklUX1NJWkUgPSAxMDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTUlOX1RPS0VOX0lOREVYID0gMDsKKworICAgICAgICAvLyBEZWZpbmUgdGhlIHJld3JpdGUgb3BlcmF0aW9uIGhpZXJhcmNoeQorCisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBSZXdyaXRlT3BlcmF0aW9uIHsKKyAgICAgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGluZGV4IGludG8gcmV3cml0ZXMgTGlzdCBhcmUgd2U/PC9zdW1tYXJ5PiAqLworICAgICAgICAgICAgcHVibGljIGludCBpbnN0cnVjdGlvbkluZGV4OworICAgICAgICAgICAgLyoqIDxzdW1tYXJ5PlRva2VuIGJ1ZmZlciBpbmRleC48L3N1bW1hcnk+ICovCisgICAgICAgICAgICBwdWJsaWMgaW50IGluZGV4OworICAgICAgICAgICAgcHVibGljIG9iamVjdCB0ZXh0OworICAgICAgICAgICAgLy8gb3V0ZXIKKyAgICAgICAgICAgIHByb3RlY3RlZCBUb2tlblJld3JpdGVTdHJlYW0gc3RyZWFtOworCisgICAgICAgICAgICBwcm90ZWN0ZWQgUmV3cml0ZU9wZXJhdGlvbihUb2tlblJld3JpdGVTdHJlYW0gc3RyZWFtLCBpbnQgaW5kZXgsIG9iamVjdCB0ZXh0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAgICAgKiAgRXhlY3V0ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gYnkgcG9zc2libHkgYWRkaW5nIHRvIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB0b2tlbiB0byBvcGVyYXRlIG9uLgorICAgICAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEV4ZWN1dGUoU3RyaW5nQnVpbGRlciBidWYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIHN0cmluZyBvcE5hbWUgPSB0aGlzLkdldFR5cGUoKS5OYW1lOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG9wTmFtZS5JbmRleE9mKCckJyk7CisgICAgICAgICAgICAgICAgb3BOYW1lID0gb3BOYW1lLlN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybiAiPCIgKyBvcE5hbWUgKyAiQCIgKyB0aGlzLmluZGV4ICsgIjpcIiIgKyB0ZXh0ICsgIlwiPiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBJbnNlcnRCZWZvcmVPcCA6IFJld3JpdGVPcGVyYXRpb24geworICAgICAgICAgICAgcHVibGljIEluc2VydEJlZm9yZU9wKFRva2VuUmV3cml0ZVN0cmVhbSBzdHJlYW0sIGludCBpbmRleCwgb2JqZWN0IHRleHQpIDoKKyAgICAgICAgICAgICAgICBiYXNlKHN0cmVhbSwgaW5kZXgsIHRleHQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBFeGVjdXRlKFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCh0ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLl90b2tlbnNbaW5kZXhdLlR5cGUgIT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUpCisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RyZWFtLl90b2tlbnNbaW5kZXhdLlRleHQpOworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJJ20gZ29pbmcgdG8gdHJ5IHJlcGxhY2luZyByYW5nZSBmcm9tIHguLnkgd2l0aCAoeS14KSsxIFJlcGxhY2VPcAorICAgICAgICAgKiAgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgY2xhc3MgUmVwbGFjZU9wIDogUmV3cml0ZU9wZXJhdGlvbiB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGxhc3RJbmRleDsKKyAgICAgICAgICAgIHB1YmxpYyBSZXBsYWNlT3AoVG9rZW5SZXdyaXRlU3RyZWFtIHN0cmVhbSwgaW50IGZyb20sIGludCB0bywgb2JqZWN0IHRleHQpCisgICAgICAgICAgICAgICAgOiBiYXNlKHN0cmVhbSwgZnJvbSwgdGV4dCkgeworICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBFeGVjdXRlKFN0cmluZ0J1aWxkZXIgYnVmKSB7CisgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGFzdEluZGV4ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICI8UmVwbGFjZU9wQCIgKyBpbmRleCArICIuLiIgKyBsYXN0SW5kZXggKyAiOlwiIiArIHRleHQgKyAiXCI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIERlbGV0ZU9wIDogUmVwbGFjZU9wIHsKKyAgICAgICAgICAgIHB1YmxpYyBEZWxldGVPcChUb2tlblJld3JpdGVTdHJlYW0gc3RyZWFtLCBpbnQgZnJvbSwgaW50IHRvKSA6CisgICAgICAgICAgICAgICAgYmFzZShzdHJlYW0sIGZyb20sIHRvLCBudWxsKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiPERlbGV0ZU9wQCIgKyBpbmRleCArICIuLiIgKyBsYXN0SW5kZXggKyAiPiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBZb3UgbWF5IGhhdmUgbXVsdGlwbGUsIG5hbWVkIHN0cmVhbXMgb2YgcmV3cml0ZSBvcGVyYXRpb25zLgorICAgICAgICAgKiAgSSdtIGNhbGxpbmcgdGhlc2UgdGhpbmdzICJwcm9ncmFtcy4iCisgICAgICAgICAqICBNYXBzIFN0cmluZyAobmFtZSkgLT4gcmV3cml0ZSAoTGlzdCkKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBJRGljdGlvbmFyeTxzdHJpbmcsIElMaXN0PFJld3JpdGVPcGVyYXRpb24+PiBwcm9ncmFtcyA9IG51bGw7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk1hcCBTdHJpbmcgKHByb2dyYW0gbmFtZSkgLT4gSW50ZWdlciBpbmRleDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIElEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBsYXN0UmV3cml0ZVRva2VuSW5kZXhlcyA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFRva2VuUmV3cml0ZVN0cmVhbSgpIHsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIEluaXQoKSB7CisgICAgICAgICAgICBwcm9ncmFtcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4+KCk7CisgICAgICAgICAgICBwcm9ncmFtc1tERUZBVUxUX1BST0dSQU1fTkFNRV0gPSBuZXcgTGlzdDxSZXdyaXRlT3BlcmF0aW9uPihQUk9HUkFNX0lOSVRfU0laRSk7CisgICAgICAgICAgICBsYXN0UmV3cml0ZVRva2VuSW5kZXhlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRva2VuUmV3cml0ZVN0cmVhbShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpCisgICAgICAgICAgICA6IGJhc2UodG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgICAgIEluaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUb2tlblJld3JpdGVTdHJlYW0oSVRva2VuU291cmNlIHRva2VuU291cmNlLCBpbnQgY2hhbm5lbCkKKyAgICAgICAgICAgIDogYmFzZSh0b2tlblNvdXJjZSwgY2hhbm5lbCkgeworICAgICAgICAgICAgSW5pdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSb2xsYmFjayhpbnQgaW5zdHJ1Y3Rpb25JbmRleCkgeworICAgICAgICAgICAgUm9sbGJhY2soREVGQVVMVF9QUk9HUkFNX05BTUUsIGluc3RydWN0aW9uSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUm9sbGJhY2sgdGhlIGluc3RydWN0aW9uIHN0cmVhbSBmb3IgYSBwcm9ncmFtIHNvIHRoYXQKKyAgICAgICAgICogIHRoZSBpbmRpY2F0ZWQgaW5zdHJ1Y3Rpb24gKHZpYSBpbnN0cnVjdGlvbkluZGV4KSBpcyBubworICAgICAgICAgKiAgbG9uZ2VyIGluIHRoZSBzdHJlYW0uICBVTlRFU1RFRCEKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUm9sbGJhY2soc3RyaW5nIHByb2dyYW1OYW1lLCBpbnQgaW5zdHJ1Y3Rpb25JbmRleCkgeworICAgICAgICAgICAgSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gQGlzOworICAgICAgICAgICAgaWYgKHByb2dyYW1zLlRyeUdldFZhbHVlKHByb2dyYW1OYW1lLCBvdXQgQGlzKSAmJiBAaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gc3VibGlzdCA9IG5ldyBMaXN0PFJld3JpdGVPcGVyYXRpb24+KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IE1JTl9UT0tFTl9JTkRFWDsgaSA8PSBpbnN0cnVjdGlvbkluZGV4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHN1Ymxpc3QuQWRkKEBpc1tpXSk7CisKKyAgICAgICAgICAgICAgICBwcm9ncmFtc1twcm9ncmFtTmFtZV0gPSBzdWJsaXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBEZWxldGVQcm9ncmFtKCkgeworICAgICAgICAgICAgRGVsZXRlUHJvZ3JhbShERUZBVUxUX1BST0dSQU1fTkFNRSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmVzZXQgdGhlIHByb2dyYW0gc28gdGhhdCBubyBpbnN0cnVjdGlvbnMgZXhpc3Q8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRGVsZXRlUHJvZ3JhbShzdHJpbmcgcHJvZ3JhbU5hbWUpIHsKKyAgICAgICAgICAgIFJvbGxiYWNrKHByb2dyYW1OYW1lLCBNSU5fVE9LRU5fSU5ERVgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbnNlcnRBZnRlcihJVG9rZW4gdCwgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIEluc2VydEFmdGVyKERFRkFVTFRfUFJPR1JBTV9OQU1FLCB0LCB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5zZXJ0QWZ0ZXIoaW50IGluZGV4LCBvYmplY3QgdGV4dCkgeworICAgICAgICAgICAgSW5zZXJ0QWZ0ZXIoREVGQVVMVF9QUk9HUkFNX05BTUUsIGluZGV4LCB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5zZXJ0QWZ0ZXIoc3RyaW5nIHByb2dyYW1OYW1lLCBJVG9rZW4gdCwgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIEluc2VydEFmdGVyKHByb2dyYW1OYW1lLCB0LlRva2VuSW5kZXgsIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbnNlcnRBZnRlcihzdHJpbmcgcHJvZ3JhbU5hbWUsIGludCBpbmRleCwgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIC8vIHRvIGluc2VydCBhZnRlciwganVzdCBpbnNlcnQgYmVmb3JlIG5leHQgaW5kZXggKGV2ZW4gaWYgcGFzdCBlbmQpCisgICAgICAgICAgICBJbnNlcnRCZWZvcmUocHJvZ3JhbU5hbWUsIGluZGV4ICsgMSwgdGV4dCk7CisgICAgICAgICAgICAvL2FkZFRvU29ydGVkUmV3cml0ZUxpc3QocHJvZ3JhbU5hbWUsIG5ldyBJbnNlcnRBZnRlck9wKGluZGV4LHRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5zZXJ0QmVmb3JlKElUb2tlbiB0LCBvYmplY3QgdGV4dCkgeworICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCB0LCB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5zZXJ0QmVmb3JlKGludCBpbmRleCwgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIEluc2VydEJlZm9yZShERUZBVUxUX1BST0dSQU1fTkFNRSwgaW5kZXgsIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbnNlcnRCZWZvcmUoc3RyaW5nIHByb2dyYW1OYW1lLCBJVG9rZW4gdCwgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIEluc2VydEJlZm9yZShwcm9ncmFtTmFtZSwgdC5Ub2tlbkluZGV4LCB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5zZXJ0QmVmb3JlKHN0cmluZyBwcm9ncmFtTmFtZSwgaW50IGluZGV4LCBvYmplY3QgdGV4dCkgeworICAgICAgICAgICAgLy9hZGRUb1NvcnRlZFJld3JpdGVMaXN0KHByb2dyYW1OYW1lLCBuZXcgSW5zZXJ0QmVmb3JlT3AoaW5kZXgsdGV4dCkpOworICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcCA9IG5ldyBJbnNlcnRCZWZvcmVPcCh0aGlzLCBpbmRleCwgdGV4dCk7CisgICAgICAgICAgICBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiByZXdyaXRlcyA9IEdldFByb2dyYW0ocHJvZ3JhbU5hbWUpOworICAgICAgICAgICAgb3AuaW5zdHJ1Y3Rpb25JbmRleCA9IHJld3JpdGVzLkNvdW50OworICAgICAgICAgICAgcmV3cml0ZXMuQWRkKG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZShpbnQgaW5kZXgsIG9iamVjdCB0ZXh0KSB7CisgICAgICAgICAgICBSZXBsYWNlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBpbmRleCwgaW5kZXgsIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlKGludCBmcm9tLCBpbnQgdG8sIG9iamVjdCB0ZXh0KSB7CisgICAgICAgICAgICBSZXBsYWNlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBmcm9tLCB0bywgdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcGxhY2UoSVRva2VuIGluZGV4VCwgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIFJlcGxhY2UoREVGQVVMVF9QUk9HUkFNX05BTUUsIGluZGV4VCwgaW5kZXhULCB0ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZShJVG9rZW4gZnJvbSwgSVRva2VuIHRvLCBvYmplY3QgdGV4dCkgeworICAgICAgICAgICAgUmVwbGFjZShERUZBVUxUX1BST0dSQU1fTkFNRSwgZnJvbSwgdG8sIHRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlKHN0cmluZyBwcm9ncmFtTmFtZSwgaW50IGZyb20sIGludCB0bywgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIGlmIChmcm9tID4gdG8gfHwgZnJvbSA8IDAgfHwgdG8gPCAwIHx8IHRvID49IF90b2tlbnMuQ291bnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oInJlcGxhY2U6IHJhbmdlIGludmFsaWQ6ICIgKyBmcm9tICsgIi4uIiArIHRvICsgIihzaXplPSIgKyBfdG9rZW5zLkNvdW50ICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJld3JpdGVPcGVyYXRpb24gb3AgPSBuZXcgUmVwbGFjZU9wKHRoaXMsIGZyb20sIHRvLCB0ZXh0KTsKKyAgICAgICAgICAgIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IHJld3JpdGVzID0gR2V0UHJvZ3JhbShwcm9ncmFtTmFtZSk7CisgICAgICAgICAgICBvcC5pbnN0cnVjdGlvbkluZGV4ID0gcmV3cml0ZXMuQ291bnQ7CisgICAgICAgICAgICByZXdyaXRlcy5BZGQob3ApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlKHN0cmluZyBwcm9ncmFtTmFtZSwgSVRva2VuIGZyb20sIElUb2tlbiB0bywgb2JqZWN0IHRleHQpIHsKKyAgICAgICAgICAgIFJlcGxhY2UocHJvZ3JhbU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZyb20uVG9rZW5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdG8uVG9rZW5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIERlbGV0ZShERUZBVUxUX1BST0dSQU1fTkFNRSwgaW5kZXgsIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRGVsZXRlKGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgICAgIERlbGV0ZShERUZBVUxUX1BST0dSQU1fTkFNRSwgZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBEZWxldGUoSVRva2VuIGluZGV4VCkgeworICAgICAgICAgICAgRGVsZXRlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBpbmRleFQsIGluZGV4VCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZShJVG9rZW4gZnJvbSwgSVRva2VuIHRvKSB7CisgICAgICAgICAgICBEZWxldGUoREVGQVVMVF9QUk9HUkFNX05BTUUsIGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRGVsZXRlKHN0cmluZyBwcm9ncmFtTmFtZSwgaW50IGZyb20sIGludCB0bykgeworICAgICAgICAgICAgUmVwbGFjZShwcm9ncmFtTmFtZSwgZnJvbSwgdG8sIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBEZWxldGUoc3RyaW5nIHByb2dyYW1OYW1lLCBJVG9rZW4gZnJvbSwgSVRva2VuIHRvKSB7CisgICAgICAgICAgICBSZXBsYWNlKHByb2dyYW1OYW1lLCBmcm9tLCB0bywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0TGFzdFJld3JpdGVUb2tlbkluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIEdldExhc3RSZXdyaXRlVG9rZW5JbmRleChERUZBVUxUX1BST0dSQU1fTkFNRSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgR2V0TGFzdFJld3JpdGVUb2tlbkluZGV4KHN0cmluZyBwcm9ncmFtTmFtZSkgeworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgaWYgKGxhc3RSZXdyaXRlVG9rZW5JbmRleGVzLlRyeUdldFZhbHVlKHByb2dyYW1OYW1lLCBvdXQgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTZXRMYXN0UmV3cml0ZVRva2VuSW5kZXgoc3RyaW5nIHByb2dyYW1OYW1lLCBpbnQgaSkgeworICAgICAgICAgICAgbGFzdFJld3JpdGVUb2tlbkluZGV4ZXNbcHJvZ3JhbU5hbWVdID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IEdldFByb2dyYW0oc3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IEBpczsKKyAgICAgICAgICAgIGlmICghcHJvZ3JhbXMuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IEBpcykgfHwgQGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBAaXMgPSBJbml0aWFsaXplUHJvZ3JhbShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBAaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IEluaXRpYWxpemVQcm9ncmFtKHN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiBAaXMgPSBuZXcgTGlzdDxSZXdyaXRlT3BlcmF0aW9uPihQUk9HUkFNX0lOSVRfU0laRSk7CisgICAgICAgICAgICBwcm9ncmFtc1tuYW1lXSA9IEBpczsKKyAgICAgICAgICAgIHJldHVybiBAaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9PcmlnaW5hbFN0cmluZygpIHsKKyAgICAgICAgICAgIEZpbGwoKTsKKyAgICAgICAgICAgIHJldHVybiBUb09yaWdpbmFsU3RyaW5nKE1JTl9UT0tFTl9JTkRFWCwgQ291bnQgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb09yaWdpbmFsU3RyaW5nKGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IE1JTl9UT0tFTl9JTkRFWCAmJiBpIDw9IGVuZCAmJiBpIDwgX3Rva2Vucy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKEdldChpKS5UeXBlICE9IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKEdldChpKS5UZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICBGaWxsKCk7CisgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoTUlOX1RPS0VOX0lOREVYLCBDb3VudCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKHN0cmluZyBwcm9ncmFtTmFtZSkgeworICAgICAgICAgICAgRmlsbCgpOworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKHByb2dyYW1OYW1lLCBNSU5fVE9LRU5fSU5ERVgsIENvdW50IC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBzdGFydCwgZW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1N0cmluZyhzdHJpbmcgcHJvZ3JhbU5hbWUsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICAgICAgSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gcmV3cml0ZXM7CisgICAgICAgICAgICBpZiAoIXByb2dyYW1zLlRyeUdldFZhbHVlKHByb2dyYW1OYW1lLCBvdXQgcmV3cml0ZXMpKQorICAgICAgICAgICAgICAgIHJld3JpdGVzID0gbnVsbDsKKworICAgICAgICAgICAgLy8gZW5zdXJlIHN0YXJ0L2VuZCBhcmUgaW4gcmFuZ2UKKyAgICAgICAgICAgIGlmIChlbmQgPiBfdG9rZW5zLkNvdW50IC0gMSkKKyAgICAgICAgICAgICAgICBlbmQgPSBfdG9rZW5zLkNvdW50IC0gMTsKKyAgICAgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICAgICAgc3RhcnQgPSAwOworCisgICAgICAgICAgICBpZiAocmV3cml0ZXMgPT0gbnVsbCB8fCByZXdyaXRlcy5Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRvT3JpZ2luYWxTdHJpbmcoc3RhcnQsIGVuZCk7IC8vIG5vIGluc3RydWN0aW9ucyB0byBleGVjdXRlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIC8vIEZpcnN0LCBvcHRpbWl6ZSBpbnN0cnVjdGlvbiBzdHJlYW0KKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PGludCwgUmV3cml0ZU9wZXJhdGlvbj4gaW5kZXhUb09wID0gUmVkdWNlVG9TaW5nbGVPcGVyYXRpb25QZXJJbmRleChyZXdyaXRlcyk7CisKKyAgICAgICAgICAgIC8vIFdhbGsgYnVmZmVyLCBleGVjdXRpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBlbWl0dGluZyB0b2tlbnMKKyAgICAgICAgICAgIGludCBpID0gc3RhcnQ7CisgICAgICAgICAgICB3aGlsZSAoaSA8PSBlbmQgJiYgaSA8IF90b2tlbnMuQ291bnQpIHsKKyAgICAgICAgICAgICAgICBSZXdyaXRlT3BlcmF0aW9uIG9wOworICAgICAgICAgICAgICAgIGJvb2wgZXhpc3RzID0gaW5kZXhUb09wLlRyeUdldFZhbHVlKGksIG91dCBvcCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzbyBhbnkgbGVmdCBoYXZlIGluZGV4IHNpemUtMQorICAgICAgICAgICAgICAgICAgICBpbmRleFRvT3AuUmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZXhpc3RzIHx8IG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSVRva2VuIHQgPSBfdG9rZW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBubyBvcGVyYXRpb24gYXQgdGhhdCBpbmRleCwganVzdCBkdW1wIHRva2VuCisgICAgICAgICAgICAgICAgICAgIGlmICh0LlR5cGUgIT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHQuVGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGkrKzsgLy8gbW92ZSB0byBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IG9wLkV4ZWN1dGUoYnVmKTsgLy8gZXhlY3V0ZSBvcGVyYXRpb24gYW5kIHNraXAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluY2x1ZGUgc3R1ZmYgYWZ0ZXIgZW5kIGlmIGl0J3MgbGFzdCBpbmRleCBpbiBidWZmZXIKKyAgICAgICAgICAgIC8vIFNvLCBpZiB0aGV5IGRpZCBhbiBpbnNlcnRBZnRlcihsYXN0VmFsaWRJbmRleCwgImZvbyIpLCBpbmNsdWRlCisgICAgICAgICAgICAvLyBmb28gaWYgZW5kPT1sYXN0VmFsaWRJbmRleC4KKyAgICAgICAgICAgIGlmIChlbmQgPT0gX3Rva2Vucy5Db3VudCAtIDEpIHsKKyAgICAgICAgICAgICAgICAvLyBTY2FuIGFueSByZW1haW5pbmcgb3BlcmF0aW9ucyBhZnRlciBsYXN0IHRva2VuCisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGluY2x1ZGVkICh0aGV5IHdpbGwgYmUgaW5zZXJ0cykuCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoUmV3cml0ZU9wZXJhdGlvbiBvcCBpbiBpbmRleFRvT3AuVmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcC5pbmRleCA+PSBfdG9rZW5zLkNvdW50IC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQob3AudGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFdlIG5lZWQgdG8gY29tYmluZSBvcGVyYXRpb25zIGFuZCByZXBvcnQgaW52YWxpZCBvcGVyYXRpb25zIChsaWtlCisgICAgICAgICAqICBvdmVybGFwcGluZyByZXBsYWNlcyB0aGF0IGFyZSBub3QgY29tcGxldGVkIG5lc3RlZCkuICBJbnNlcnRzIHRvCisgICAgICAgICAqICBzYW1lIGluZGV4IG5lZWQgdG8gYmUgY29tYmluZWQgZXRjLi4uICAgSGVyZSBhcmUgdGhlIGNhc2VzOgorICAgICAgICAgKgorICAgICAgICAgKiAgSS5pLnUgSS5qLnYJCQkJCQkJCWxlYXZlIGFsb25lLCBub25vdmVybGFwcGluZworICAgICAgICAgKiAgSS5pLnUgSS5pLnYJCQkJCQkJCWNvbWJpbmU6IElpdnUKKyAgICAgICAgICoKKyAgICAgICAgICogIFIuaS1qLnUgUi54LXkudgl8IGktaiBpbiB4LXkJCQlkZWxldGUgZmlyc3QgUgorICAgICAgICAgKiAgUi5pLWoudSBSLmktai52CQkJCQkJCWRlbGV0ZSBmaXJzdCBSCisgICAgICAgICAqICBSLmktai51IFIueC15LnYJfCB4LXkgaW4gaS1qCQkJRVJST1IKKyAgICAgICAgICogIFIuaS1qLnUgUi54LXkudgl8IGJvdW5kYXJpZXMgb3ZlcmxhcAlFUlJPUgorICAgICAgICAgKgorICAgICAgICAgKiAgSS5pLnUgUi54LXkudiB8IGkgaW4geC15CQkJCWRlbGV0ZSBJCisgICAgICAgICAqICBJLmkudSBSLngteS52IHwgaSBub3QgaW4geC15CQkJbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisgICAgICAgICAqICBSLngteS52IEkuaS51IHwgaSBpbiB4LXkJCQkJRVJST1IKKyAgICAgICAgICogIFIueC15LnYgSS54LnUgCQkJCQkJCVIueC15LnV2IChjb21iaW5lLCBkZWxldGUgSSkKKyAgICAgICAgICogIFIueC15LnYgSS5pLnUgfCBpIG5vdCBpbiB4LXkJCQlsZWF2ZSBhbG9uZSwgbm9ub3ZlcmxhcHBpbmcKKyAgICAgICAgICoKKyAgICAgICAgICogIEkuaS51ID0gaW5zZXJ0IHUgYmVmb3JlIG9wIEAgaW5kZXggaQorICAgICAgICAgKiAgUi54LXkudSA9IHJlcGxhY2UgeC15IGluZGV4ZWQgdG9rZW5zIHdpdGggdQorICAgICAgICAgKgorICAgICAgICAgKiAgRmlyc3Qgd2UgbmVlZCB0byBleGFtaW5lIHJlcGxhY2VzLiAgRm9yIGFueSByZXBsYWNlIG9wOgorICAgICAgICAgKgorICAgICAgICAgKiAJCTEuIHdpcGUgb3V0IGFueSBpbnNlcnRpb25zIGJlZm9yZSBvcCB3aXRoaW4gdGhhdCByYW5nZS4KKyAgICAgICAgICoJCTIuIERyb3AgYW55IHJlcGxhY2Ugb3AgYmVmb3JlIHRoYXQgaXMgY29udGFpbmVkIGNvbXBsZXRlbHkgd2l0aGluCisgICAgICAgICAqICAgICAgICAgdGhhdCByYW5nZS4KKyAgICAgICAgICoJCTMuIFRocm93IGV4Y2VwdGlvbiB1cG9uIGJvdW5kYXJ5IG92ZXJsYXAgd2l0aCBhbnkgcHJldmlvdXMgcmVwbGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogIFRoZW4gd2UgY2FuIGRlYWwgd2l0aCBpbnNlcnRzOgorICAgICAgICAgKgorICAgICAgICAgKiAJCTEuIGZvciBhbnkgaW5zZXJ0cyB0byBzYW1lIGluZGV4LCBjb21iaW5lIGV2ZW4gaWYgbm90IGFkamFjZW50LgorICAgICAgICAgKiAJCTIuIGZvciBhbnkgcHJpb3IgcmVwbGFjZSB3aXRoIHNhbWUgbGVmdCBib3VuZGFyeSwgY29tYmluZSB0aGlzCisgICAgICAgICAqICAgICAgICAgaW5zZXJ0IHdpdGggcmVwbGFjZSBhbmQgZGVsZXRlIHRoaXMgcmVwbGFjZS4KKyAgICAgICAgICogCQkzLiB0aHJvdyBleGNlcHRpb24gaWYgaW5kZXggaW4gc2FtZSByYW5nZSBhcyBwcmV2aW91cyByZXBsYWNlCisgICAgICAgICAqCisgICAgICAgICAqICBEb24ndCBhY3R1YWxseSBkZWxldGU7IG1ha2Ugb3AgbnVsbCBpbiBsaXN0LiBFYXNpZXIgdG8gd2FsayBsaXN0LgorICAgICAgICAgKiAgTGF0ZXIgd2UgY2FuIHRocm93IGFzIHdlIGFkZCB0byBpbmRleCAtPiBvcCBtYXAuCisgICAgICAgICAqCisgICAgICAgICAqICBOb3RlIHRoYXQgSS4yIFIuMi0yIHdpbGwgd2lwZSBvdXQgSS4yIGV2ZW4gdGhvdWdoLCB0ZWNobmljYWxseSwgdGhlCisgICAgICAgICAqICBpbnNlcnRlZCBzdHVmZiB3b3VsZCBiZSBiZWZvcmUgdGhlIHJlcGxhY2UgcmFuZ2UuICBCdXQsIGlmIHlvdQorICAgICAgICAgKiAgYWRkIHRva2VucyBpbiBmcm9udCBvZiBhIG1ldGhvZCBib2R5ICd7JyBhbmQgdGhlbiBkZWxldGUgdGhlIG1ldGhvZAorICAgICAgICAgKiAgYm9keSwgSSB0aGluayB0aGUgc3R1ZmYgYmVmb3JlIHRoZSAneycgeW91IGFkZGVkIHNob3VsZCBkaXNhcHBlYXIgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiAgUmV0dXJuIGEgbWFwIGZyb20gdG9rZW4gaW5kZXggdG8gb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSURpY3Rpb25hcnk8aW50LCBSZXdyaXRlT3BlcmF0aW9uPiBSZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4KElMaXN0PFJld3JpdGVPcGVyYXRpb24+IHJld3JpdGVzKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmV3cml0ZXM9IityZXdyaXRlcyk7CisKKyAgICAgICAgICAgIC8vIFdBTEsgUkVQTEFDRVMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV3cml0ZXMuQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFJld3JpdGVPcGVyYXRpb24gb3AgPSByZXdyaXRlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAob3AgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCEob3AgaXMgUmVwbGFjZU9wKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgUmVwbGFjZU9wIHJvcCA9IChSZXBsYWNlT3ApcmV3cml0ZXNbaV07CisgICAgICAgICAgICAgICAgLy8gV2lwZSBwcmlvciBpbnNlcnRzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIHZhciBpbnNlcnRzID0gR2V0S2luZE9mT3BzKHJld3JpdGVzLCB0eXBlb2YoSW5zZXJ0QmVmb3JlT3ApLCBpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluc2VydHMuQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmVPcCBpb3AgPSAoSW5zZXJ0QmVmb3JlT3ApaW5zZXJ0c1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlvcC5pbmRleCA+PSByb3AuaW5kZXggJiYgaW9wLmluZGV4IDw9IHJvcC5sYXN0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpbnNlcnQgYXMgaXQncyBhIG5vLW9wLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXNbaW9wLmluc3RydWN0aW9uSW5kZXhdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEcm9wIGFueSBwcmlvciByZXBsYWNlcyBjb250YWluZWQgd2l0aGluCisgICAgICAgICAgICAgICAgdmFyIHByZXZSZXBsYWNlcyA9IEdldEtpbmRPZk9wcyhyZXdyaXRlcywgdHlwZW9mKFJlcGxhY2VPcCksIGkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJldlJlcGxhY2VzLkNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZU9wIHByZXZSb3AgPSAoUmVwbGFjZU9wKXByZXZSZXBsYWNlc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSb3AuaW5kZXggPj0gcm9wLmluZGV4ICYmIHByZXZSb3AubGFzdEluZGV4IDw9IHJvcC5sYXN0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSByZXBsYWNlIGFzIGl0J3MgYSBuby1vcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW3ByZXZSb3AuaW5zdHJ1Y3Rpb25JbmRleF0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZXhjZXB0aW9uIHVubGVzcyBkaXNqb2ludCBvciBpZGVudGljYWwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNqb2ludCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Um9wLmxhc3RJbmRleCA8IHJvcC5pbmRleCB8fCBwcmV2Um9wLmluZGV4ID4gcm9wLmxhc3RJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSb3AuaW5kZXggPT0gcm9wLmluZGV4ICYmIHByZXZSb3AubGFzdEluZGV4ID09IHJvcC5sYXN0SW5kZXg7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGlzam9pbnQgJiYgIXNhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigicmVwbGFjZSBvcCBib3VuZGFyaWVzIG9mICIgKyByb3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG92ZXJsYXAgd2l0aCBwcmV2aW91cyAiICsgcHJldlJvcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdBTEsgSU5TRVJUUworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXdyaXRlcy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcCA9IChSZXdyaXRlT3BlcmF0aW9uKXJld3JpdGVzW2ldOworICAgICAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShvcCBpcyBJbnNlcnRCZWZvcmVPcCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZU9wIGlvcCA9IChJbnNlcnRCZWZvcmVPcClyZXdyaXRlc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBjb21iaW5lIGN1cnJlbnQgaW5zZXJ0IHdpdGggcHJpb3IgaWYgYW55IGF0IHNhbWUgaW5kZXgKKyAgICAgICAgICAgICAgICB2YXIgcHJldkluc2VydHMgPSBHZXRLaW5kT2ZPcHMocmV3cml0ZXMsIHR5cGVvZihJbnNlcnRCZWZvcmVPcCksIGkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJldkluc2VydHMuQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmVPcCBwcmV2SW9wID0gKEluc2VydEJlZm9yZU9wKXByZXZJbnNlcnRzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAocHJldklvcC5pbmRleCA9PSBpb3AuaW5kZXgpIHsgLy8gY29tYmluZSBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIHN0cmluZ3MuLi53ZSdyZSBpbiBwcm9jZXNzIG9mIHRvU3RyaW5nJ2luZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvbGUgdG9rZW4gYnVmZmVyIHNvIG5vIGxhenkgZXZhbCBpc3N1ZSB3aXRoIGFueSB0ZW1wbGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvcC50ZXh0ID0gQ2F0T3BUZXh0KGlvcC50ZXh0LCBwcmV2SW9wLnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIHJlZHVuZGFudCBwcmlvciBpbnNlcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW3ByZXZJb3AuaW5zdHJ1Y3Rpb25JbmRleF0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHJlcGxhY2VzIHdoZXJlIGlvcC5pbmRleCBpcyBpbiByYW5nZTsgZXJyb3IKKyAgICAgICAgICAgICAgICB2YXIgcHJldlJlcGxhY2VzID0gR2V0S2luZE9mT3BzKHJld3JpdGVzLCB0eXBlb2YoUmVwbGFjZU9wKSwgaSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcmV2UmVwbGFjZXMuQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlT3Agcm9wID0gKFJlcGxhY2VPcClwcmV2UmVwbGFjZXNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChpb3AuaW5kZXggPT0gcm9wLmluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByb3AudGV4dCA9IENhdE9wVGV4dChpb3AudGV4dCwgcm9wLnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXNbaV0gPSBudWxsOyAgLy8gZGVsZXRlIGN1cnJlbnQgaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW9wLmluZGV4ID49IHJvcC5pbmRleCAmJiBpb3AuaW5kZXggPD0gcm9wLmxhc3RJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJpbnNlcnQgb3AgIiArIGlvcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aGluIGJvdW5kYXJpZXMgb2YgcHJldmlvdXMgIiArIHJvcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJld3JpdGVzIGFmdGVyPSIrcmV3cml0ZXMpOworICAgICAgICAgICAgSURpY3Rpb25hcnk8aW50LCBSZXdyaXRlT3BlcmF0aW9uPiBtID0gbmV3IERpY3Rpb25hcnk8aW50LCBSZXdyaXRlT3BlcmF0aW9uPigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXdyaXRlcy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcCA9IChSZXdyaXRlT3BlcmF0aW9uKXJld3JpdGVzW2ldOworICAgICAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGRlbGV0ZWQgb3BzCisKKyAgICAgICAgICAgICAgICBSZXdyaXRlT3BlcmF0aW9uIGV4aXN0aW5nOworICAgICAgICAgICAgICAgIGlmIChtLlRyeUdldFZhbHVlKG9wLmluZGV4LCBvdXQgZXhpc3RpbmcpICYmIGV4aXN0aW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigic2hvdWxkIG9ubHkgYmUgb25lIG9wIHBlciBpbmRleCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtW29wLmluZGV4XSA9IG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImluZGV4IHRvIG9wOiAiK20pOworICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgQ2F0T3BUZXh0KG9iamVjdCBhLCBvYmplY3QgYikgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Db25jYXQoYSwgYik7CisgICAgICAgIH0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gR2V0S2luZE9mT3BzKElMaXN0PFJld3JpdGVPcGVyYXRpb24+IHJld3JpdGVzLCBUeXBlIGtpbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRLaW5kT2ZPcHMocmV3cml0ZXMsIGtpbmQsIHJld3JpdGVzLkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgYWxsIG9wZXJhdGlvbnMgYmVmb3JlIGFuIGluZGV4IG9mIGEgcGFydGljdWxhciBraW5kPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiBHZXRLaW5kT2ZPcHMoSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gcmV3cml0ZXMsIFR5cGUga2luZCwgaW50IGJlZm9yZSkgeworICAgICAgICAgICAgSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gb3BzID0gbmV3IExpc3Q8UmV3cml0ZU9wZXJhdGlvbj4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmVmb3JlICYmIGkgPCByZXdyaXRlcy5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcCA9IHJld3JpdGVzW2ldOworICAgICAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICBpZiAob3AuR2V0VHlwZSgpID09IGtpbmQpCisgICAgICAgICAgICAgICAgICAgIG9wcy5BZGQob3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG9wczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb0RlYnVnU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFRvRGVidWdTdHJpbmcoTUlOX1RPS0VOX0lOREVYLCBDb3VudCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvRGVidWdTdHJpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPj0gTUlOX1RPS0VOX0lOREVYICYmIGkgPD0gZW5kICYmIGkgPCBfdG9rZW5zLkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKEdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9VbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS9VbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0N2MxMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1VuYnVmZmVyZWRUb2tlblN0cmVhbS5jcwpAQCAtMCwwICsxLDEwNCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA5IFNhbSBIYXJ3ZWxsCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUgeworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuTWlzYzsKKyAgICB1c2luZyBDTFNDb21wbGlhbnQgPSBTeXN0ZW0uQ0xTQ29tcGxpYW50QXR0cmlidXRlOworICAgIHVzaW5nIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiA9IFN5c3RlbS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CisgICAgdXNpbmcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uID0gU3lzdGVtLkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbjsKKworICAgIC8qKiBBIHRva2VuIHN0cmVhbSB0aGF0IHB1bGxzIHRva2VucyBmcm9tIHRoZSBjb2RlIHNvdXJjZSBvbi1kZW1hbmQgYW5kCisgICAgICogIHdpdGhvdXQgdHJhY2tpbmcgYSBjb21wbGV0ZSBidWZmZXIgb2YgdGhlIHRva2Vucy4gVGhpcyBzdHJlYW0gYnVmZmVycworICAgICAqICB0aGUgbWluaW11bSBudW1iZXIgb2YgdG9rZW5zIHBvc3NpYmxlLiAgSXQncyB0aGUgc2FtZSBhcworICAgICAqICBPbkRlbWFuZFRva2VuU3RyZWFtIGV4Y2VwdCB0aGF0IE9uRGVtYW5kVG9rZW5TdHJlYW0gYnVmZmVycyBhbGwgdG9rZW5zLgorICAgICAqCisgICAgICogIFlvdSBjYW4ndCB1c2UgdGhpcyBzdHJlYW0gaWYgeW91IHBhc3Mgd2hpdGVzcGFjZSBvciBvdGhlciBvZmYtY2hhbm5lbAorICAgICAqICB0b2tlbnMgdG8gdGhlIHBhcnNlci4gVGhlIHN0cmVhbSBjYW4ndCBpZ25vcmUgb2ZmLWNoYW5uZWwgdG9rZW5zLgorICAgICAqIAorICAgICAqICBZb3UgY2FuIG9ubHkgbG9vayBiYWNrd2FyZHMgMSB0b2tlbjogTFQoLTEpLgorICAgICAqCisgICAgICogIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcmVhZCBmcm9tIGEgc29ja2V0IG9yIG90aGVyIGluZmluaXRlIHN0cmVhbS4KKyAgICAgKgorICAgICAqICBAc2VlIEJ1ZmZlcmVkVG9rZW5TdHJlYW0KKyAgICAgKiAgQHNlZSBDb21tb25Ub2tlblN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0gOiBMb29rYWhlYWRTdHJlYW08SVRva2VuPiwgSVRva2VuU3RyZWFtIHsKKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldCisgICAgICAgIHByb3RlY3RlZCBJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2U7CisgICAgICAgIHByb3RlY3RlZCBpbnQgdG9rZW5JbmRleDsgLy8gc2ltcGxlIGNvdW50ZXIgdG8gc2V0IHRva2VuIGluZGV4IGluIHRva2VucworCisgICAgICAgIC8qKiBTa2lwIHRva2VucyBvbiBhbnkgY2hhbm5lbCBidXQgdGhpcyBvbmU7IHRoaXMgaXMgaG93IHdlIHNraXAgd2hpdGVzcGFjZS4uLiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisKKyAgICAgICAgcHVibGljIFVuYnVmZmVyZWRUb2tlblN0cmVhbShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMudG9rZW5Tb3VyY2UgPSB0b2tlblNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVG9rZW5Tb3VyY2UgVG9rZW5Tb3VyY2UgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlblNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgU291cmNlTmFtZSB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblNvdXJjZS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElUb2tlbiBOZXh0RWxlbWVudCgpIHsKKyAgICAgICAgICAgIElUb2tlbiB0ID0gdGhpcy50b2tlblNvdXJjZS5OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIHQuVG9rZW5JbmRleCA9IHRoaXMudG9rZW5JbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0VuZE9mRmlsZShJVG9rZW4gbykgeworICAgICAgICAgICAgcmV0dXJuIG8uVHlwZSA9PSBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVG9rZW4gR2V0KGludCBpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJBYnNvbHV0ZSB0b2tlbiBpbmRleGVzIGFyZSBtZWFuaW5nbGVzcyBpbiBhbiB1bmJ1ZmZlcmVkIHN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBMQShpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIExUKGkpLlR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFRvU3RyaW5nKGludCBzdGFydCwgaW50IHN0b3ApIHsKKyAgICAgICAgICAgIHJldHVybiAibi9hIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVG9TdHJpbmcoSVRva2VuIHN0YXJ0LCBJVG9rZW4gc3RvcCkgeworICAgICAgICAgICAgcmV0dXJuICJuL2EiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUvVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3MDczZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24uY3MKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZSB7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIC8qKiA8c3VtbWFyeT5BbiBleHRyYSB0b2tlbiB3aGlsZSBwYXJzaW5nIGEgVG9rZW5TdHJlYW08L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFVud2FudGVkVG9rZW5FeGNlcHRpb24gOiBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworICAgICAgICBwdWJsaWMgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UoZXhwZWN0aW5nLCBpbnB1dCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVud2FudGVkVG9rZW5FeGNlcHRpb24oaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCwgSUxpc3Q8c3RyaW5nPiB0b2tlbk5hbWVzKQorICAgICAgICAgICAgOiBiYXNlKGV4cGVjdGluZywgaW5wdXQsIHRva2VuTmFtZXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBJTGlzdDxzdHJpbmc+IHRva2VuTmFtZXMpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZXhwZWN0aW5nLCBpbnB1dCwgdG9rZW5OYW1lcykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVud2FudGVkVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcywgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQsIHRva2VuTmFtZXMsIGlubmVyRXhjZXB0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIFVuZXhwZWN0ZWRUb2tlbiB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgICAgICAgICAvL2ludCB1bmV4cGVjdGVkVHlwZSA9IGdldFVuZXhwZWN0ZWRUeXBlKCk7CisgICAgICAgICAgICAvL3N0cmluZyB1bmV4cGVjdGVkID0gKCB0b2tlbk5hbWVzICE9IG51bGwgJiYgdW5leHBlY3RlZFR5cGUgPj0gMCAmJiB1bmV4cGVjdGVkVHlwZSA8IHRva2VuTmFtZXMuTGVuZ3RoICkgPyB0b2tlbk5hbWVzW3VuZXhwZWN0ZWRUeXBlXSA6IHVuZXhwZWN0ZWRUeXBlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgZXhwZWN0ZWQgPSAoVG9rZW5OYW1lcyAhPSBudWxsICYmIEV4cGVjdGluZyA+PSAwICYmIEV4cGVjdGluZyA8IFRva2VuTmFtZXMuQ291bnQpID8gVG9rZW5OYW1lc1tFeHBlY3RpbmddIDogRXhwZWN0aW5nLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBleHAgPSAiLCBleHBlY3RlZCAiICsgZXhwZWN0ZWQ7CisgICAgICAgICAgICBpZiAoRXhwZWN0aW5nID09IFRva2VuVHlwZXMuSW52YWxpZCkgeworICAgICAgICAgICAgICAgIGV4cCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVud2FudGVkVG9rZW5FeGNlcHRpb24oZm91bmQ9IiArIG51bGwgKyBleHAgKyAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIlVud2FudGVkVG9rZW5FeGNlcHRpb24oZm91bmQ9IiArIFRva2VuLlRleHQgKyBleHAgKyAiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyMy5SdW50aW1lIFwwNTBWUzIwMDVcMDUxLmNzcHJvaiIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyMy5SdW50aW1lIFwwNTBWUzIwMDVcMDUxLmNzcHJvaiIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllYzE1ZQotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIzLlJ1bnRpbWUgXDA1MFZTMjAwNVwwNTEuY3Nwcm9qIgpAQCAtMCwwICsxLDE3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxQcm9qZWN0VHlwZT5Mb2NhbDwvUHJvamVjdFR5cGU+DQorICAgIDxQcm9kdWN0VmVyc2lvbj44LjAuNTA3Mjc8L1Byb2R1Y3RWZXJzaW9uPg0KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQorICAgIDxBcHBsaWNhdGlvbkljb24+DQorICAgIDwvQXBwbGljYXRpb25JY29uPg0KKyAgICA8QXNzZW1ibHlLZXlDb250YWluZXJOYW1lPg0KKyAgICA8L0Fzc2VtYmx5S2V5Q29udGFpbmVyTmFtZT4NCisgICAgPEFzc2VtYmx5TmFtZT5BbnRscjMuUnVudGltZTwvQXNzZW1ibHlOYW1lPg0KKyAgICA8QXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4NCisgICAgPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPg0KKyAgICA8RGVmYXVsdENsaWVudFNjcmlwdD5KU2NyaXB0PC9EZWZhdWx0Q2xpZW50U2NyaXB0Pg0KKyAgICA8RGVmYXVsdEhUTUxQYWdlTGF5b3V0PkdyaWQ8L0RlZmF1bHRIVE1MUGFnZUxheW91dD4NCisgICAgPERlZmF1bHRUYXJnZXRTY2hlbWE+SUU1MDwvRGVmYXVsdFRhcmdldFNjaGVtYT4NCisgICAgPERlbGF5U2lnbj5mYWxzZTwvRGVsYXlTaWduPg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5SdW50aW1lPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8Tm9TdGFuZGFyZExpYnJhcmllcz5mYWxzZTwvTm9TdGFuZGFyZExpYnJhcmllcz4NCisgICAgPFJ1blBvc3RCdWlsZEV2ZW50Pk9uQnVpbGRTdWNjZXNzPC9SdW5Qb3N0QnVpbGRFdmVudD4NCisgICAgPFN0YXJ0dXBPYmplY3Q+DQorICAgIDwvU3RhcnR1cE9iamVjdD4NCisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+DQorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4NCisgICAgPFByb2plY3RHdWlkPntDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9PC9Qcm9qZWN0R3VpZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcbmV0LTIuMFw8L091dHB1dFBhdGg+DQorICAgIDxCYXNlQWRkcmVzcz4yODUyMTI2NzI8L0Jhc2VBZGRyZXNzPg0KKyAgICA8Q29uZmlndXJhdGlvbk92ZXJyaWRlRmlsZT4NCisgICAgPC9Db25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlPg0KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO1NUUk9OR19OQU1FO0RPVE5FVDI8L0RlZmluZUNvbnN0YW50cz4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8L0RvY3VtZW50YXRpb25GaWxlPg0KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCisgICAgPEZpbGVBbGlnbm1lbnQ+NDA5NjwvRmlsZUFsaWdubWVudD4NCisgICAgPFJlZ2lzdGVyRm9yQ29tSW50ZXJvcD5mYWxzZTwvUmVnaXN0ZXJGb3JDb21JbnRlcm9wPg0KKyAgICA8UmVtb3ZlSW50ZWdlckNoZWNrcz5mYWxzZTwvUmVtb3ZlSW50ZWdlckNoZWNrcz4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPFJvb3ROYW1lc3BhY2U+QW50bHIuUnVudGltZTwvUm9vdE5hbWVzcGFjZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8U3RhcnR1cE9iamVjdCAvPg0KKyAgICA8R2VuZXJhdGVEb2N1bWVudGF0aW9uPnRydWU8L0dlbmVyYXRlRG9jdW1lbnRhdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXG5ldC0yLjBcPC9PdXRwdXRQYXRoPg0KKyAgICA8QmFzZUFkZHJlc3M+Mjg1MjEyNjcyPC9CYXNlQWRkcmVzcz4NCisgICAgPENvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGU+DQorICAgIDwvQ29uZmlndXJhdGlvbk92ZXJyaWRlRmlsZT4NCisgICAgPERlZmluZUNvbnN0YW50cz5TVFJPTkdfTkFNRTtET1RORVQyPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxEb2N1bWVudGF0aW9uRmlsZT5iaW5cUmVsZWFzZVxuZXQtMi4wXEFudGxyMy5SdW50aW1lLlhNTDwvRG9jdW1lbnRhdGlvbkZpbGU+DQorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KKyAgICA8RmlsZUFsaWdubWVudD40MDk2PC9GaWxlQWxpZ25tZW50Pg0KKyAgICA8UmVnaXN0ZXJGb3JDb21JbnRlcm9wPmZhbHNlPC9SZWdpc3RlckZvckNvbUludGVyb3A+DQorICAgIDxSZW1vdmVJbnRlZ2VyQ2hlY2tzPmZhbHNlPC9SZW1vdmVJbnRlZ2VyQ2hlY2tzPg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5SdW50aW1lPC9Sb290TmFtZXNwYWNlPg0KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQorICAgIDxTdGFydHVwT2JqZWN0IC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxBTlRMUkZpbGVTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcQU5UTFJTdHJpbmdTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzc2VtYmx5SW5mby5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxCaXRTZXQuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcSUNoYXJTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcQ2hhclN0cmVhbVN0YXRlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXENsYXNzaWNUb2tlbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDb21tb25Ub2tlbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxERkEuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcRWFybHlFeGl0RXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxJSW50U3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXE1pc21hdGNoZWRTZXRFeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxQYXJzZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcUGFyc2VyUnVsZVJldHVyblNjb3BlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXFJlY29nbml0aW9uRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXFJ1bGVSZXR1cm5TY29wZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxUb2tlbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxJVG9rZW5Tb3VyY2UuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQ29tbW9uRXJyb3JOb2RlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXFVud2FudGVkVG9rZW5FeGNlcHRpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnNcQ29sbGVjdGlvblV0aWxzLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zXEhhc2hMaXN0LmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zXFN0YWNrTGlzdC5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXEJhc2VUcmVlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQmFzZVRyZWVBZGFwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQ29tbW9uVHJlZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXENvbW1vblRyZWVBZGFwdG9yLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQ29tbW9uVHJlZU5vZGVTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxJVHJlZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXElUcmVlQWRhcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXElUcmVlTm9kZVN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFBhcnNlVHJlZS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFRyZWVQYXJzZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlUnVsZVJldHVyblNjb3BlLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXERlYnVnRXZlbnRTb2NrZXRQcm94eS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xEZWJ1Z1BhcnNlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xEZWJ1Z1Rva2VuU3RyZWFtLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXElEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdUcmVlQWRhcHRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDb25zdGFudHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VzLkRlc2lnbmVyLmNzIj4NCisgICAgICA8RGVwZW5kZW50VXBvbj5NZXNzYWdlcy5yZXN4PC9EZXBlbmRlbnRVcG9uPg0KKyAgICA8L0NvbXBpbGU+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdUcmVlTm9kZVN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xCbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdFdmVudEh1Yi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xEZWJ1Z0V2ZW50UmVwZWF0ZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdUcmVlUGFyc2VyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXFBhcnNlVHJlZUJ1aWxkZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcUHJvZmlsZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcVHJhY2VyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLk1pc2NcU3RhdHMuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuTWlzY1xFcnJvck1hbmFnZXIuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlV2l6YXJkLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcVHJlZVBhdHRlcm5MZXhlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVSdWxlTm9kZVN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFRyZWVQYXR0ZXJuUGFyc2VyLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcQU5UTFJJbnB1dFN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxBTlRMUlJlYWRlclN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxCYXNlUmVjb2duaXplci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDb21tb25Ub2tlblN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxSZWNvZ25pemVyU2hhcmVkU3RhdGUuY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcSVRva2VuLmNzIiAvPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXElUb2tlblN0cmVhbS5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxMZXhlci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxUb2tlblJld3JpdGVTdHJlYW0uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxJVHJlZVZpc2l0b3JBY3Rpb24uY3MiIC8+DQorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlVmlzaXRvci5jcyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iTWVzc2FnZXMucmVzeCI+DQorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+DQorICAgICAgPEdlbmVyYXRvcj5SZXNYRmlsZUNvZGVHZW5lcmF0b3I8L0dlbmVyYXRvcj4NCisgICAgPC9FbWJlZGRlZFJlc291cmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8UHJlQnVpbGRFdmVudD4NCisgICAgPC9QcmVCdWlsZEV2ZW50Pg0KKyAgICA8UG9zdEJ1aWxkRXZlbnQ+DQorICAgIDwvUG9zdEJ1aWxkRXZlbnQ+DQorICAgIDxQcm9qZWN0R3VpZD57Q0YxNUQwRDUtQkU3Mi00Rjk4LUI3MEYtMjI5QUJBMURGMEU4fTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPkFudGxyLlJ1bnRpbWU8L1Jvb3ROYW1lc3BhY2U+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIzLlJ1bnRpbWUgXDA1MFZTMjAwOFwwNTEuY3Nwcm9qIiAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIzLlJ1bnRpbWUgXDA1MFZTMjAwOFwwNTEuY3Nwcm9qIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFiNjg2Ci0tLSAvZGV2L251bGwKKysrICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRscjMuUnVudGltZSBcMDUwVlMyMDA4XDA1MS5jc3Byb2oiCkBAIC0wLDAgKzEsMTkxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjMuNSI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcm9qZWN0VHlwZT5Mb2NhbDwvUHJvamVjdFR5cGU+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8QXBwbGljYXRpb25JY29uPgorICAgIDwvQXBwbGljYXRpb25JY29uPgorICAgIDxBc3NlbWJseUtleUNvbnRhaW5lck5hbWU+CisgICAgPC9Bc3NlbWJseUtleUNvbnRhaW5lck5hbWU+CisgICAgPEFzc2VtYmx5TmFtZT5BbnRscjMtMi5SdW50aW1lLkRvdE5ldDIwPC9Bc3NlbWJseU5hbWU+CisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+CisgICAgPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgorICAgIDxEZWZhdWx0Q2xpZW50U2NyaXB0PkpTY3JpcHQ8L0RlZmF1bHRDbGllbnRTY3JpcHQ+CisgICAgPERlZmF1bHRIVE1MUGFnZUxheW91dD5HcmlkPC9EZWZhdWx0SFRNTFBhZ2VMYXlvdXQ+CisgICAgPERlZmF1bHRUYXJnZXRTY2hlbWE+SUU1MDwvRGVmYXVsdFRhcmdldFNjaGVtYT4KKyAgICA8RGVsYXlTaWduPmZhbHNlPC9EZWxheVNpZ24+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5SdW50aW1lPC9Sb290TmFtZXNwYWNlPgorICAgIDxOb1N0YW5kYXJkTGlicmFyaWVzPmZhbHNlPC9Ob1N0YW5kYXJkTGlicmFyaWVzPgorICAgIDxSdW5Qb3N0QnVpbGRFdmVudD5PbkJ1aWxkU3VjY2VzczwvUnVuUG9zdEJ1aWxkRXZlbnQ+CisgICAgPFN0YXJ0dXBPYmplY3Q+CisgICAgPC9TdGFydHVwT2JqZWN0PgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8UHJvamVjdEd1aWQ+e0NGMTVEMEQ1LUJFNzItNEY5OC1CNzBGLTIyOUFCQTFERjBFOH08L1Byb2plY3RHdWlkPgorICAgIDxPbGRUb29sc1ZlcnNpb24+Mi4wPC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbj4KKyAgICA8L1VwZ3JhZGVCYWNrdXBMb2NhdGlvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcbmV0LTIuMFw8L091dHB1dFBhdGg+CisgICAgPEJhc2VBZGRyZXNzPjI4NTIxMjY3MjwvQmFzZUFkZHJlc3M+CisgICAgPENvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGU+CisgICAgPC9Db25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7REVCVUc7U1RST05HX05BTUU7RE9UTkVUMjwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxEb2N1bWVudGF0aW9uRmlsZT4KKyAgICA8L0RvY3VtZW50YXRpb25GaWxlPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxGaWxlQWxpZ25tZW50PjQwOTY8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPFJlZ2lzdGVyRm9yQ29tSW50ZXJvcD5mYWxzZTwvUmVnaXN0ZXJGb3JDb21JbnRlcm9wPgorICAgIDxSZW1vdmVJbnRlZ2VyQ2hlY2tzPmZhbHNlPC9SZW1vdmVJbnRlZ2VyQ2hlY2tzPgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPFJvb3ROYW1lc3BhY2U+QW50bHIuUnVudGltZTwvUm9vdE5hbWVzcGFjZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPFN0YXJ0dXBPYmplY3QgLz4KKyAgICA8R2VuZXJhdGVEb2N1bWVudGF0aW9uPnRydWU8L0dlbmVyYXRlRG9jdW1lbnRhdGlvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXG5ldC0yLjBcPC9PdXRwdXRQYXRoPgorICAgIDxCYXNlQWRkcmVzcz4yODUyMTI2NzI8L0Jhc2VBZGRyZXNzPgorICAgIDxDb25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlPgorICAgIDwvQ29uZmlndXJhdGlvbk92ZXJyaWRlRmlsZT4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlNUUk9OR19OQU1FO0RPVE5FVDI8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+YmluXFJlbGVhc2VcbmV0LTIuMFxBbnRscjMtMi5SdW50aW1lLkRvdE5ldDIwLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPEZpbGVBbGlnbm1lbnQ+NDA5NjwvRmlsZUFsaWdubWVudD4KKyAgICA8UmVnaXN0ZXJGb3JDb21JbnRlcm9wPmZhbHNlPC9SZWdpc3RlckZvckNvbUludGVyb3A+CisgICAgPFJlbW92ZUludGVnZXJDaGVja3M+ZmFsc2U8L1JlbW92ZUludGVnZXJDaGVja3M+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5SdW50aW1lPC9Sb290TmFtZXNwYWNlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8U3RhcnR1cE9iamVjdCAvPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnNcQ2hlY2suY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uc1xEaWN0aW9uYXJ5RXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zXEVudW1lcmFibGVFeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnNcRXhjZXB0aW9uRXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zXElPRXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zXEpTeXN0ZW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uc1xMZXhlckV4dGVuc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uc1xTdHJpbmdFeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnNcU3RyaW5nVG9rZW5pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuTWlzY1xEb3VibGVLZXlNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5NaXNjXEZhc3RRdWV1ZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLk1pc2NcTG9va2FoZWFkU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlRmlsdGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlSXRlcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxBTlRMUkZpbGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxBTlRMUlN0cmluZ1N0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXEJ1ZmZlcmVkVG9rZW5TdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDaGFyU3RyZWFtQ29uc3RhbnRzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcR3JhbW1hclJ1bGVBdHRyaWJ1dGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxJQXN0UnVsZVJldHVyblNjb3BlYDEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxJVG9rZW5TdHJlYW1JbmZvcm1hdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXExlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcVG9rZW5Db25zdGFudHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcQml0U2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcSUNoYXJTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDaGFyU3RyZWFtU3RhdGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDbGFzc2ljVG9rZW4uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxDb21tb25Ub2tlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXERGQS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXEVhcmx5RXhpdEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXElJbnRTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXE5vVmlhYmxlQWx0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcUGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcUGFyc2VyUnVsZVJldHVyblNjb3BlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcUmVjb2duaXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxSdWxlUmV0dXJuU2NvcGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxJVG9rZW5Tb3VyY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxNaXNzaW5nVG9rZW5FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXENvbW1vbkVycm9yTm9kZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXFVud2FudGVkVG9rZW5FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5Db2xsZWN0aW9uc1xIYXNoTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zXFN0YWNrTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQmFzZVRyZWUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXEJhc2VUcmVlQWRhcHRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQ29tbW9uVHJlZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcQ29tbW9uVHJlZUFkYXB0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXENvbW1vblRyZWVOb2RlU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxJVHJlZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcSVRyZWVBZGFwdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxJVHJlZU5vZGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFBhcnNlVHJlZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcVHJlZVBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcVHJlZVJ1bGVSZXR1cm5TY29wZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXERlYnVnRXZlbnRTb2NrZXRQcm94eS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXERlYnVnUGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdUb2tlblN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXElEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xEZWJ1Z1RyZWVBZGFwdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcQ29uc3RhbnRzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdUcmVlTm9kZVN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXEJsYW5rRGVidWdFdmVudExpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5EZWJ1Z1xEZWJ1Z0V2ZW50SHViLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdFdmVudFJlcGVhdGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcRGVidWdUcmVlUGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcUGFyc2VUcmVlQnVpbGRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLkRlYnVnXFByb2ZpbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuRGVidWdcVHJhY2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuTWlzY1xTdGF0cy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLk1pc2NcRXJyb3JNYW5hZ2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlV2l6YXJkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxUcmVlUGF0dGVybkxleGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxSZXdyaXRlUnVsZU5vZGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFRyZWVQYXR0ZXJuUGFyc2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZVxSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxBTlRMUklucHV0U3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcQU5UTFJSZWFkZXJTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxCYXNlUmVjb2duaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lXENvbW1vblRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcUmVjb2duaXplclNoYXJlZFN0YXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcSVRva2VuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcSVRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWVcTGV4ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZVxUb2tlblJld3JpdGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UcmVlXElUcmVlVmlzaXRvckFjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5SdW50aW1lLlRyZWVcVHJlZVZpc2l0b3IuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+CisgICAgPC9QcmVCdWlsZEV2ZW50PgorICAgIDxQb3N0QnVpbGRFdmVudD4KKyAgICA8L1Bvc3RCdWlsZEV2ZW50PgorICAgIDxQcm9qZWN0R3VpZD57Q0YxNUQwRDUtQkU3Mi00Rjk4LUI3MEYtMjI5QUJBMURGMEU4fTwvUHJvamVjdEd1aWQ+CisgICAgPFJvb3ROYW1lc3BhY2U+QW50bHIuUnVudGltZTwvUm9vdE5hbWVzcGFjZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9Bc3NlbWJseUluZm8uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmU3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsMTExIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCisvLyBUT0RPOiBSZXZpZXcgdGhlIHZhbHVlcyBvZiB0aGUgYXNzZW1ibHkgYXR0cmlidXRlcworCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkFOVExSMy5SdW50aW1lLk5FVCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJBTlRMUjMgQyMgUnVudGltZSBmb3IgLk5FVCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYSwgMjAwNy0yMDA5IEpvaGFubmVzIEx1YmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gQWxsb3cgdGhlIHVzZSBvZiB0aGUgYXNzZW1ibHkgaW4gbWVkaXVtIHRydXN0IGZvciB3ZWJzaXRlcworW2Fzc2VtYmx5OiBTeXN0ZW0uU2VjdXJpdHkuQWxsb3dQYXJ0aWFsbHlUcnVzdGVkQ2FsbGVyc10KKworCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIFJldmlzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIFJldmlzaW9uIGFuZCBCdWlsZCBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMy4xLjMuKiIpXQorCisvLworLy8gSW4gb3JkZXIgdG8gc2lnbiB5b3VyIGFzc2VtYmx5IHlvdSBtdXN0IHNwZWNpZnkgYSBrZXkgdG8gdXNlLiBSZWZlciB0byB0aGUgCisvLyBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhc3NlbWJseSBzaWduaW5nLgorLy8KKy8vIFVzZSB0aGUgYXR0cmlidXRlcyBiZWxvdyB0byBjb250cm9sIHdoaWNoIGtleSBpcyB1c2VkIGZvciBzaWduaW5nLiAKKy8vCisvLyBOb3RlczogCisvLyAgICgqKSBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgYXNzZW1ibHkgaXMgbm90IHNpZ25lZC4KKy8vICAgKCopIEtleU5hbWUgcmVmZXJzIHRvIGEga2V5IHRoYXQgaGFzIGJlZW4gaW5zdGFsbGVkIGluIHRoZSBDcnlwdG8gU2VydmljZQorLy8gICAgICAgUHJvdmlkZXIgKENTUCkgb24geW91ciBtYWNoaW5lLiBLZXlGaWxlIHJlZmVycyB0byBhIGZpbGUgd2hpY2ggY29udGFpbnMKKy8vICAgICAgIGEga2V5LgorLy8gICAoKikgSWYgdGhlIEtleUZpbGUgYW5kIHRoZSBLZXlOYW1lIHZhbHVlcyBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZSAKKy8vICAgICAgIGZvbGxvd2luZyBwcm9jZXNzaW5nIG9jY3VyczoKKy8vICAgICAgICgxKSBJZiB0aGUgS2V5TmFtZSBjYW4gYmUgZm91bmQgaW4gdGhlIENTUCwgdGhhdCBrZXkgaXMgdXNlZC4KKy8vICAgICAgICgyKSBJZiB0aGUgS2V5TmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIEtleUZpbGUgZG9lcyBleGlzdCwgdGhlIGtleSAKKy8vICAgICAgICAgICBpbiB0aGUgS2V5RmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLgorLy8gICAoKikgSW4gb3JkZXIgdG8gY3JlYXRlIGEgS2V5RmlsZSwgeW91IGNhbiB1c2UgdGhlIHNuLmV4ZSAoU3Ryb25nIE5hbWUpIHV0aWxpdHkuCisvLyAgICAgICBXaGVuIHNwZWNpZnlpbmcgdGhlIEtleUZpbGUsIHRoZSBsb2NhdGlvbiBvZiB0aGUgS2V5RmlsZSBzaG91bGQgYmUKKy8vICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IG91dHB1dCBkaXJlY3Rvcnkgd2hpY2ggaXMKKy8vICAgICAgICVQcm9qZWN0IERpcmVjdG9yeSVcb2JqXDxjb25maWd1cmF0aW9uPi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgS2V5RmlsZSBpcworLy8gICAgICAgbG9jYXRlZCBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHlvdSB3b3VsZCBzcGVjaWZ5IHRoZSBBc3NlbWJseUtleUZpbGUgCisvLyAgICAgICBhdHRyaWJ1dGUgYXMgW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIi4uXC4uXG15a2V5LnNuayIpXQorLy8gICAoKikgRGVsYXkgU2lnbmluZyBpcyBhbiBhZHZhbmNlZCBvcHRpb24gLSBzZWUgdGhlIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yaworLy8gICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLgorLy8KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUtleU5hbWUoIiIpXQorCisjaWYgU1RST05HX05BTUUKKy8vIFRoaXMgc3Ryb25nbHkgc3VnZ2VzdHMgdGhhdCB0aGUgYnVpbGQgaXMgYSBWUy5ORVQgYnVpbGQuCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KK1thc3NlbWJseTogQXNzZW1ibHlLZXlGaWxlKCIuLi8uLi8uLi9BbnRscjNfS2V5UGFpci5zbmsiKV0KKyNlbGlmIE5BTlRfU1RST05HTkFNRQorLy8gVGhpcyBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IHRoZSBidWlsZCBpcyBhIE5BTlQgYnVpbGQuCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KK1thc3NlbWJseTogQXNzZW1ibHlLZXlGaWxlKCIuLi9BbnRscjNfS2V5UGFpci5zbmsiKV0KKyNlbHNlCisvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlIGFzc2VtYmx5IHNob3VsZCBhbHdheXMgYmUgc3Ryb25nIG5hbWVkLgorW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldCitbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiIildCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWVzc2FnZXMuRGVzaWduZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWVzc2FnZXMuRGVzaWduZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNWMxZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9NZXNzYWdlcy5EZXNpZ25lci5jcwpAQCAtMCwwICsxLDYzIEBACivvu78vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gPGF1dG8tZ2VuZXJhdGVkPgorLy8gICAgIFRoaXMgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgdG9vbC4KKy8vICAgICBSdW50aW1lIFZlcnNpb246Mi4wLjUwNzI3LjQyCisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLgorLy8gPC9hdXRvLWdlbmVyYXRlZD4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lIHsKKyAgICB1c2luZyBTeXN0ZW07CisgICAgCisgICAgCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgIEEgc3Ryb25nbHktdHlwZWQgcmVzb3VyY2UgY2xhc3MsIGZvciBsb29raW5nIHVwIGxvY2FsaXplZCBzdHJpbmdzLCBldGMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLyBUaGlzIGNsYXNzIHdhcyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgU3Ryb25nbHlUeXBlZFJlc291cmNlQnVpbGRlcgorICAgIC8vIGNsYXNzIHZpYSBhIHRvb2wgbGlrZSBSZXNHZW4gb3IgVmlzdWFsIFN0dWRpby4KKyAgICAvLyBUbyBhZGQgb3IgcmVtb3ZlIGEgbWVtYmVyLCBlZGl0IHlvdXIgLlJlc1ggZmlsZSB0aGVuIHJlcnVuIFJlc0dlbgorICAgIC8vIHdpdGggdGhlIC9zdHIgb3B0aW9uLCBvciByZWJ1aWxkIHlvdXIgVlMgcHJvamVjdC4KKyAgICBbZ2xvYmFsOjpTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlQXR0cmlidXRlKCJTeXN0ZW0uUmVzb3VyY2VzLlRvb2xzLlN0cm9uZ2x5VHlwZWRSZXNvdXJjZUJ1aWxkZXIiLCAiMi4wLjAuMCIpXQorICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCisgICAgW2dsb2JhbDo6U3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcy5Db21waWxlckdlbmVyYXRlZEF0dHJpYnV0ZSgpXQorICAgIGludGVybmFsIGNsYXNzIE1lc3NhZ2VzIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGdsb2JhbDo6U3lzdGVtLlJlc291cmNlcy5SZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW47CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvIHJlc291cmNlQ3VsdHVyZTsKKyAgICAgICAgCisgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5Db2RlQW5hbHlzaXMuU3VwcHJlc3NNZXNzYWdlQXR0cmlidXRlKCJNaWNyb3NvZnQuUGVyZm9ybWFuY2UiLCAiQ0ExODExOkF2b2lkVW5jYWxsZWRQcml2YXRlQ29kZSIpXQorICAgICAgICBpbnRlcm5hbCBNZXNzYWdlcygpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBSZXR1cm5zIHRoZSBjYWNoZWQgUmVzb3VyY2VNYW5hZ2VyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5BZHZhbmNlZCldCisgICAgICAgIGludGVybmFsIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIFJlc291cmNlTWFuYWdlciB7CisgICAgICAgICAgICBnZXQgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QuUmVmZXJlbmNlRXF1YWxzKHJlc291cmNlTWFuLCBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWw6OlN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VNYW5hZ2VyIHRlbXAgPSBuZXcgZ2xvYmFsOjpTeXN0ZW0uUmVzb3VyY2VzLlJlc291cmNlTWFuYWdlcigiQW50bHIuUnVudGltZS5NZXNzYWdlcyIsIHR5cGVvZihNZXNzYWdlcykuQXNzZW1ibHkpOworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1hbiA9IHRlbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZU1hbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICBPdmVycmlkZXMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgQ3VycmVudFVJQ3VsdHVyZSBwcm9wZXJ0eSBmb3IgYWxsCisgICAgICAgIC8vLyAgIHJlc291cmNlIGxvb2t1cHMgdXNpbmcgdGhpcyBzdHJvbmdseSB0eXBlZCByZXNvdXJjZSBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW2dsb2JhbDo6U3lzdGVtLkNvbXBvbmVudE1vZGVsLkVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZShnbG9iYWw6OlN5c3RlbS5Db21wb25lbnRNb2RlbC5FZGl0b3JCcm93c2FibGVTdGF0ZS5BZHZhbmNlZCldCisgICAgICAgIGludGVybmFsIHN0YXRpYyBnbG9iYWw6OlN5c3RlbS5HbG9iYWxpemF0aW9uLkN1bHR1cmVJbmZvIEN1bHR1cmUgeworICAgICAgICAgICAgZ2V0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDdWx0dXJlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0IHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUN1bHR1cmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9NZXNzYWdlcy5yZXN4IGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01lc3NhZ2VzLnJlc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkYjFiNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuUnVudGltZS9NZXNzYWdlcy5yZXN4CkBAIC0wLDAgKzEsMTAxIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHJvb3Q+CisJPCEtLSAKKwkJTWljcm9zb2Z0IFJlc1ggU2NoZW1hCisKKwkJVmVyc2lvbiAxLjMKKworCQlUaGUgcHJpbWFyeSBnb2FscyBvZiB0aGlzIGZvcm1hdCBpcyB0byBhbGxvdyBhIHNpbXBsZSBYTUwgZm9ybWF0IAorCQl0aGF0IGlzIG1vc3RseSBodW1hbiByZWFkYWJsZS4gVGhlIGdlbmVyYXRpb24gYW5kIHBhcnNpbmcgb2YgdGhlIAorCQl2YXJpb3VzIGRhdGEgdHlwZXMgYXJlIGRvbmUgdGhyb3VnaCB0aGUgVHlwZUNvbnZlcnRlciBjbGFzc2VzIAorCQlhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdHlwZXMuCisKKwkJRXhhbXBsZToKKworCQkuLi4gYWRvLm5ldC9YTUwgaGVhZGVycyAmIHNjaGVtYSAuLi4KKwkJPHJlc2hlYWRlciBuYW1lPSJyZXNtaW1ldHlwZSI+dGV4dC9taWNyb3NvZnQtcmVzeDwvcmVzaGVhZGVyPgorCQk8cmVzaGVhZGVyIG5hbWU9InZlcnNpb24iPjEuMzwvcmVzaGVhZGVyPgorCQk8cmVzaGVhZGVyIG5hbWU9InJlYWRlciI+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCAuLi48L3Jlc2hlYWRlcj4KKwkJPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPlN5c3RlbS5SZXNvdXJjZXMuUmVzWFJlc291cmNlV3JpdGVyLCBTeXN0ZW0uV2luZG93cy5Gb3JtcywgLi4uPC9yZXNoZWFkZXI+CisJCTxkYXRhIG5hbWU9Ik5hbWUxIj50aGlzIGlzIG15IGxvbmcgc3RyaW5nPC9kYXRhPgorCQk8ZGF0YSBuYW1lPSJDb2xvcjEiIHR5cGU9IlN5c3RlbS5EcmF3aW5nLkNvbG9yLCBTeXN0ZW0uRHJhd2luZyI+Qmx1ZTwvZGF0YT4KKwkJPGRhdGEgbmFtZT0iQml0bWFwMSIgbWltZXR5cGU9ImFwcGxpY2F0aW9uL3gtbWljcm9zb2Z0Lm5ldC5vYmplY3QuYmluYXJ5LmJhc2U2NCI+CisJCQlbYmFzZTY0IG1pbWUgZW5jb2RlZCBzZXJpYWxpemVkIC5ORVQgRnJhbWV3b3JrIG9iamVjdF0KKwkJPC9kYXRhPgorCQk8ZGF0YSBuYW1lPSJJY29uMSIgdHlwZT0iU3lzdGVtLkRyYXdpbmcuSWNvbiwgU3lzdGVtLkRyYXdpbmciIG1pbWV0eXBlPSJhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQiPgorCQkJW2Jhc2U2NCBtaW1lIGVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGluZyBhIGJ5dGUgYXJyYXkgZm9ybSBvZiB0aGUgLk5FVCBGcmFtZXdvcmsgb2JqZWN0XQorCQk8L2RhdGE+CisKKwkJVGhlcmUgYXJlIGFueSBudW1iZXIgb2YgInJlc2hlYWRlciIgcm93cyB0aGF0IGNvbnRhaW4gc2ltcGxlIAorCQluYW1lL3ZhbHVlIHBhaXJzLgorCisJCUVhY2ggZGF0YSByb3cgY29udGFpbnMgYSBuYW1lLCBhbmQgdmFsdWUuIFRoZSByb3cgYWxzbyBjb250YWlucyBhIAorCQl0eXBlIG9yIG1pbWV0eXBlLiBUeXBlIGNvcnJlc3BvbmRzIHRvIGEgLk5FVCBjbGFzcyB0aGF0IHN1cHBvcnQgCisJCXRleHQvdmFsdWUgY29udmVyc2lvbiB0aHJvdWdoIHRoZSBUeXBlQ29udmVydGVyIGFyY2hpdGVjdHVyZS4gCisJCUNsYXNzZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoaXMgYXJlIHNlcmlhbGl6ZWQgYW5kIHN0b3JlZCB3aXRoIHRoZSAKKwkJbWltZXR5cGUgc2V0LgorCisJCVRoZSBtaW1ldHlwZSBpcyB1c2VkIGZvciBzZXJpYWxpemVkIG9iamVjdHMsIGFuZCB0ZWxscyB0aGUgCisJCVJlc1hSZXNvdXJjZVJlYWRlciBob3cgdG8gZGVwZXJzaXN0IHRoZSBvYmplY3QuIFRoaXMgaXMgY3VycmVudGx5IG5vdCAKKwkJZXh0ZW5zaWJsZS4gRm9yIGEgZ2l2ZW4gbWltZXR5cGUgdGhlIHZhbHVlIG11c3QgYmUgc2V0IGFjY29yZGluZ2x5OgorCisJCU5vdGUgLSBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJpbmFyeS5iYXNlNjQgaXMgdGhlIGZvcm1hdCAKKwkJdGhhdCB0aGUgUmVzWFJlc291cmNlV3JpdGVyIHdpbGwgZ2VuZXJhdGUsIGhvd2V2ZXIgdGhlIHJlYWRlciBjYW4gCisJCXJlYWQgYW55IG9mIHRoZSBmb3JtYXRzIGxpc3RlZCBiZWxvdy4KKworCQltaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5iaW5hcnkuYmFzZTY0CisJCXZhbHVlICAgOiBUaGUgb2JqZWN0IG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIAorCQkJOiBTeXN0ZW0uU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLkJpbmFyeS5CaW5hcnlGb3JtYXR0ZXIKKwkJCTogYW5kIHRoZW4gZW5jb2RlZCB3aXRoIGJhc2U2NCBlbmNvZGluZy4KKworCQltaW1ldHlwZTogYXBwbGljYXRpb24veC1taWNyb3NvZnQubmV0Lm9iamVjdC5zb2FwLmJhc2U2NAorCQl2YWx1ZSAgIDogVGhlIG9iamVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgd2l0aCAKKwkJCTogU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5Gb3JtYXR0ZXJzLlNvYXAuU29hcEZvcm1hdHRlcgorCQkJOiBhbmQgdGhlbiBlbmNvZGVkIHdpdGggYmFzZTY0IGVuY29kaW5nLgorCisJCW1pbWV0eXBlOiBhcHBsaWNhdGlvbi94LW1pY3Jvc29mdC5uZXQub2JqZWN0LmJ5dGVhcnJheS5iYXNlNjQKKwkJdmFsdWUgICA6IFRoZSBvYmplY3QgbXVzdCBiZSBzZXJpYWxpemVkIGludG8gYSBieXRlIGFycmF5IAorCQkJOiB1c2luZyBhIFN5c3RlbS5Db21wb25lbnRNb2RlbC5UeXBlQ29udmVydGVyCisJCQk6IGFuZCB0aGVuIGVuY29kZWQgd2l0aCBiYXNlNjQgZW5jb2RpbmcuCisJLS0+CisJCisJPHhzZDpzY2hlbWEgaWQ9InJvb3QiIHhtbG5zPSIiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOm1zZGF0YT0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp4bWwtbXNkYXRhIj4KKwkJPHhzZDplbGVtZW50IG5hbWU9InJvb3QiIG1zZGF0YTpJc0RhdGFTZXQ9InRydWUiPgorCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhIj4KKwkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1zZGF0YTpPcmRpbmFsPSIxIiAvPgorCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMiIgLz4KKwkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKwkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtc2RhdGE6T3JkaW5hbD0iMyIgLz4KKwkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbXNkYXRhOk9yZGluYWw9IjQiIC8+CisJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCQkJPC94c2Q6ZWxlbWVudD4KKwkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc2hlYWRlciI+CisJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtc2RhdGE6T3JkaW5hbD0iMSIgLz4KKwkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJPC94c2Q6Y2hvaWNlPgorCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCTwveHNkOmVsZW1lbnQ+CisJPC94c2Q6c2NoZW1hPgorCTxyZXNoZWFkZXIgbmFtZT0icmVzbWltZXR5cGUiPgorCQk8dmFsdWU+dGV4dC9taWNyb3NvZnQtcmVzeDwvdmFsdWU+CisJPC9yZXNoZWFkZXI+CisJPHJlc2hlYWRlciBuYW1lPSJ2ZXJzaW9uIj4KKwkJPHZhbHVlPjEuMzwvdmFsdWU+CisJPC9yZXNoZWFkZXI+CisJPHJlc2hlYWRlciBuYW1lPSJyZWFkZXIiPgorCQk8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VSZWFkZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTIuMC4zNTAwLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+CisJPC9yZXNoZWFkZXI+CisJPHJlc2hlYWRlciBuYW1lPSJ3cml0ZXIiPgorCQk8dmFsdWU+U3lzdGVtLlJlc291cmNlcy5SZXNYUmVzb3VyY2VXcml0ZXIsIFN5c3RlbS5XaW5kb3dzLkZvcm1zLCBWZXJzaW9uPTIuMC4zNTAwLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwvdmFsdWU+CisJPC9yZXNoZWFkZXI+Cis8L3Jvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL2RlZmF1bHQuYnVpbGQgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvZGVmYXVsdC5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjgxOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL2RlZmF1bHQuYnVpbGQKQEAgLTAsMCArMSwxMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgbmFtZT0iQU5UTFIgQyMgUnVudGltZSBMaWJyYXJ5IiBkZWZhdWx0PSJidWlsZCI+CisgICAgPHRzdGFtcC8+CisJPHByb3BlcnR5IG5hbWU9ImJhc2UuZGlyIiB2YWx1ZT0iJHtwYXRoOjpnZXQtZnVsbC1wYXRoKCBwcm9qZWN0OjpnZXQtYmFzZS1kaXJlY3RvcnkoKSApfSIgLz4KKworCTxpbmNsdWRlIGJ1aWxkZmlsZT0iLi4vLi4vYW50bHIzLnJ1bnRpbWUubmV0LmNvbW1vbi5pbmMiIC8+CisKKwk8cHJvcGVydHkgbmFtZT0iYW50bHIzLnJ1bnRpbWUudGVzdCIgdmFsdWU9InRydWUiIHVubGVzcz0iJHtwcm9wZXJ0eTo6ZXhpc3RzKCdhbnRscjMucnVudGltZS50ZXN0Jyl9IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJlbmFibGV0ZXN0IiB2YWx1ZT0iQUxMT1dURVNUIiB1bmxlc3M9IiR7cHJvcGVydHk6OmV4aXN0cygnZW5hYmxldGVzdCcpfSIgLz4KKworCTxwcm9wZXJ0eSBuYW1lPSJuYW1lIiB2YWx1ZT0iQW50bHIzLlJ1bnRpbWUiIC8+CisJPHByb3BlcnR5IG5hbWU9InRlc3QubmFtZSIgdmFsdWU9IiR7bmFtZX0uVGVzdHMiIC8+CisJCisJPHByb3BlcnR5IG5hbWU9ImFzc2VtYmx5Lm5hbWUiIHZhbHVlPSIke25hbWV9LmRsbCIgLz4KKwk8cHJvcGVydHkgbmFtZT0idGVzdC5hc3NlbWJseS5uYW1lIiB2YWx1ZT0iJHt0ZXN0Lm5hbWV9LmV4ZSIgLz4KKwkKKwk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IiR7YmFzZS5kaXJ9LyIgLz4KKwk8cHJvcGVydHkgbmFtZT0idGVzdC5zcmMuZGlyIiB2YWx1ZT0iJHtiYXNlLmRpcn0vLi4vQW50bHIzLlJ1bnRpbWUuVGVzdHMiIC8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJ0cnVlIiB1bmxlc3M9IiR7cHJvcGVydHk6OmV4aXN0cygnZGVidWcnKX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyBwcm9qZWN0OiAnJHtuYW1lfScgdmVyc2lvbiAke3ZlcnNpb259ID09PiAnJHthc3NlbWJseS5uYW1lfSciLz4KKworICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUsIHRlc3QiIGRlc2NyaXB0aW9uPSJjb21waWxlcyB0aGUgc291cmNlIGNvZGUiPgorICAgIDwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJjbGVhbiwgY29weV9idWlsZF9kZXBlbmRlbmNpZXMiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLndvcmtpbmcuZGlyfS90ZXN0cyIgLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY29weV9idWlsZF9kZXBlbmRlbmNpZXMiPgorCQk8IS0tIENvcHkgQW50bHIzLlJ1bnRpbWUuVGVzdHMgZGVwZW5kZW5jaWVzIC0tPgorCQk8Y29weSB0b2Rpcj0iJHtidWlsZC53b3JraW5nLmRpcn0iIG92ZXJ3cml0ZT0idHJ1ZSI+CisJCQk8ZmlsZXNldCBiYXNlZGlyPSIke3NoYXJlZGxpYnJhcnkuZGlyfS9NYlVuaXQiPgorCQkJCTxpbmNsdWRlIG5hbWU9Ik1iVW5pdC5GcmFtZXdvcmsuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IlF1aWNrR3JhcGguQWxnb3JpdGhtcy5kbGwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iUXVpY2tHcmFwaC5kbGwiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvY29weT4KKwkJPGNvcHkgdG9kaXI9IiR7YnVpbGQud29ya2luZy5kaXJ9IiBvdmVyd3JpdGU9InRydWUiPgorCQkJPGZpbGVzZXQgYmFzZWRpcj0iJHtzaGFyZWRsaWJyYXJ5LmRpcn0vU3RyaW5nVGVtcGxhdGUuTkVULyR7dGFyZ2V0LmNscn0iPgorCQkJCTxpbmNsdWRlIG5hbWU9IlN0cmluZ1RlbXBsYXRlLmRsbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJhbnRsci5ydW50aW1lLmRsbCIgLz4KKwkJCTwvZmlsZXNldD4KKwkJPC9jb3B5PgorCTwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisJPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuLnZzbmV0IiBkZXNjcmlwdGlvbj0iY2xlYW5zIHVwIFZTLk5FVCBidWlsZCBhcnRpZmFjdHMgYW5kIG91dHB1dCI+CisJCTwhLS0gZGVsZXRlIFZTLk5FVCBwcm9qZWN0IGFydGlmYWN0cyBkaXJlY3RvcnkgLS0+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkRlbGV0aW5nIFZTLk5FVCBhcnRpZmFjdHMgZGlyZWN0b3J5ICcke2Jhc2UuZGlyfS9iaW4nIiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtiYXNlLmRpcn0vYmluIiBmYWlsb25lcnJvcj0iZmFsc2UiIC8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkRlbGV0aW5nIFZTLk5FVCBhcnRpZmFjdHMgZGlyZWN0b3J5ICcke2Jhc2UuZGlyfS9vYmonIiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtiYXNlLmRpcn0vb2JqIiBmYWlsb25lcnJvcj0iZmFsc2UiIC8+CisKKwkJPCEtLSBkZWxldGUgVlMuTkVUIHByb2plY3QgYXJ0aWZhY3RzIGRpcmVjdG9yeSBmb3IgVGVzdHMgcHJvamVjdHMtLT4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iRGVsZXRpbmcgVlMuTkVUIGFydGlmYWN0cyBkaXJlY3RvcnkgJyR7YmFzZS5kaXJ9Ly4uL0FudGxyMy5SdW50aW1lLlRlc3RzL2JpbiciIC8+CisJCTxkZWxldGUgZGlyPSIke2Jhc2UuZGlyfS8uLi9BbnRscjMuUnVudGltZS5UZXN0cy9iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iRGVsZXRpbmcgVlMuTkVUIGFydGlmYWN0cyBkaXJlY3RvcnkgJyR7YmFzZS5kaXJ9Ly4uL0FudGxyMy5SdW50aW1lLlRlc3RzL29iaiciIC8+CisJCTxkZWxldGUgZGlyPSIke2Jhc2UuZGlyfS8uLi9BbnRscjMuUnVudGltZS5UZXN0cy9vYmoiIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KKyAgICA8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0idGVzdHMucnVuIiBpZj0iJHthbnRscjMucnVudGltZS50ZXN0fSI+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InRlc3RzLnJ1biIgZGVwZW5kcz0idGVzdHMuY29tcGlsZSI+CisJCTxsb2FkdGFza3MgYXNzZW1ibHk9IiR7c2hhcmVkbGlicmFyeS5kaXJ9L01iVW5pdC9NYlVuaXQuVGFza3MuZGxsIiAvPgorCQk8bWJ1bml0CisgICAgICAgIAlyZXBvcnQtdHlwZXM9Ikh0bWwiCisgICAgICAgICAJcmVwb3J0LWZpbGVuYW1lLWZvcm1hdD0iYW50bHIzLXJ1bnRpbWUtcmVwb3J0LXswfS17MX0iCisgICAgICAgICAJcmVwb3J0LW91dHB1dC1kaXJlY3Rvcnk9IiR7YnVpbGQud29ya2luZy5kaXJ9IgorICAgICAgICAgCWhhbHQtb24tZmFpbHVyZT0idHJ1ZSIKKyAgICAgICAgID4KKwkJICAgIDxhc3NlbWJsaWVzPgorCQkgICAgCTxpbmNsdWRlIG5hbWU9IiR7YnVpbGQud29ya2luZy5kaXJ9LyR7dGVzdC5hc3NlbWJseS5uYW1lfSIgLz4gCisJCQk8L2Fzc2VtYmxpZXM+CisJCTwvbWJ1bml0PgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KKwkJPGNzYyAKKwkJCWRlZmluZT0iJHtzdHJvbmdfbmFtZX07JHtkb3RuZXRfZGVmaW5lfSIKKwkJCXRhcmdldD0ibGlicmFyeSIgCisJCQlkZWJ1Zz0iJHtkZWJ1Z30iCisJCQlvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iCisJCQlvdXRwdXQ9IiR7YnVpbGQud29ya2luZy5kaXJ9LyR7YXNzZW1ibHkubmFtZX0iIAorCQkJZG9jPSIke2J1aWxkLndvcmtpbmcuZGlyfS8ke25hbWV9LnhtbCI+CisJCQkKKwkJCTxub3dhcm4+CisJCQkJPHdhcm5pbmcgbnVtYmVyPSIxNTkxIiAvPgorCQkJCTx3YXJuaW5nIG51bWJlcj0iMTU3MiIgLz4KKwkJCTwvbm93YXJuPgorCQkJCisJCQk8c291cmNlcyBiYXNlZGlyPSIke3NyYy5kaXJ9IiBkZWZhdWx0ZXhjbHVkZXM9InRydWUiPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouY3MiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5EZXNpZ25lci5jcyIgCisJCQkJCWlmPSIke2ZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKT09J25ldC0xLjEnIG9yIGZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKT09J21vbm8tMS4wJ30iIAorCQkJCS8+CisJCQk8L3NvdXJjZXM+CisKKwkJCTxyZWZlcmVuY2VzPgorCQkJCTwhLS0gPGluY2x1ZGUgbmFtZT0iJHtidWlsZC53b3JraW5nLmRpcn0vYW50bHIucnVudGltZS5kbGwiIC8+IC0tPgorCQkJPC9yZWZlcmVuY2VzPgorCQk8L2NzYz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0idGVzdHMuY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+CisJCTxjc2MgCisJCQlkZWZpbmU9IiR7ZG90bmV0X2RlZmluZX0iCisJCQl0YXJnZXQ9ImV4ZSIgCisJCQlkZWJ1Zz0iJHtkZWJ1Z30iIAorCQkJb3V0cHV0PSIke2J1aWxkLndvcmtpbmcuZGlyfS8ke3Rlc3QuYXNzZW1ibHkubmFtZX0iPgorCQkJCisJCQk8c291cmNlcyBiYXNlZGlyPSIke3Rlc3Quc3JjLmRpcn0iIGRlZmF1bHRleGNsdWRlcz0idHJ1ZSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5jcyIgLz4KKwkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLkRlc2lnbmVyLmNzIiAKKwkJCQkJaWY9IiR7ZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpPT0nbmV0LTEuMScgb3IgZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpPT0nbW9uby0xLjAnfSIgCisJCQkJLz4KKwkJCTwvc291cmNlcz4KKworCQkJPHJlZmVyZW5jZXM+CisJCQkJPGluY2x1ZGUgbmFtZT0iJHtidWlsZC53b3JraW5nLmRpcn0vJHthc3NlbWJseS5uYW1lfSIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIke2J1aWxkLndvcmtpbmcuZGlyfS9NYlVuaXQuRnJhbWV3b3JrLmRsbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIke2J1aWxkLndvcmtpbmcuZGlyfS9RdWlja0dyYXBoLkFsZ29yaXRobXMuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IiR7YnVpbGQud29ya2luZy5kaXJ9L1F1aWNrR3JhcGguZGxsIiAvPgorCQkJPC9yZWZlcmVuY2VzPgorCQk8L2NzYz4KKwk8L3RhcmdldD4KKwkKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuVXRpbGl0eS9BbnRsci5VdGlsaXR5LlRyZWUvRE9UVHJlZUdlbmVyYXRvci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuVXRpbGl0eS9BbnRsci5VdGlsaXR5LlRyZWUvRE9UVHJlZUdlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJjNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L0FudGxyLlV0aWxpdHkuVHJlZS9ET1RUcmVlR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlIHsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiBBIHV0aWxpdHkgY2xhc3MgdG8gZ2VuZXJhdGUgRE9UIGRpYWdyYW1zIChncmFwaHZpeikgZnJvbQorICAgICAqICBhcmJpdHJhcnkgdHJlZXMuICBZb3UgY2FuIHBhc3MgaW4geW91ciBvd24gdGVtcGxhdGVzIGFuZAorICAgICAqICBjYW4gcGFzcyBpbiBhbnkga2luZCBvZiB0cmVlIG9yIHVzZSBUcmVlIGludGVyZmFjZSBtZXRob2QuCisgICAgICogIEkgd2FudGVkIHRoaXMgc2VwYXJhdG9yIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gaW5jbHVkZQorICAgICAqICBTVCBqdXN0IHRvIHVzZSB0aGUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qIHBhY2thZ2UuCisgICAgICogIFRoaXMgaXMgYSBzZXQgb2Ygbm9uLXN0YXRpYyBtZXRob2RzIHNvIHlvdSBjYW4gc3ViY2xhc3MKKyAgICAgKiAgdG8gb3ZlcnJpZGUuICBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhbiBpbnZvY2F0aW9uOgorICAgICAqCisgICAgICogICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oU3lzdGVtLmluKTsKKyAgICAgKiAgICAgIFRMZXhlciBsZXggPSBuZXcgVExleGVyKGlucHV0KTsKKyAgICAgKiAgICAgIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOworICAgICAqICAgICAgVFBhcnNlciBwYXJzZXIgPSBuZXcgVFBhcnNlcih0b2tlbnMpOworICAgICAqICAgICAgVFBhcnNlci5lX3JldHVybiByID0gcGFyc2VyLmUoKTsKKyAgICAgKiAgICAgIFRyZWUgdCA9IChUcmVlKXIudHJlZTsKKyAgICAgKiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0LnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgKiAgICAgIERPVFRyZWVHZW5lcmF0b3IgZ2VuID0gbmV3IERPVFRyZWVHZW5lcmF0b3IoKTsKKyAgICAgKiAgICAgIFN0cmluZ1RlbXBsYXRlIHN0ID0gZ2VuLnRvRE9UKHQpOworICAgICAqICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0KTsKKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRG90VHJlZUdlbmVyYXRvciB7CisgICAgICAgIHJlYWRvbmx5IHN0cmluZ1tdIEhlYWRlckxpbmVzID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGlncmFwaCB7IiwKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAiXHRvcmRlcmluZz1vdXQ7IiwKKyAgICAgICAgICAgICAgICAiXHRyYW5rc2VwPS40OyIsCisgICAgICAgICAgICAgICAgIlx0Ymdjb2xvcj1cImxpZ2h0Z3JleVwiOyBub2RlIFtzaGFwZT1ib3gsIGZpeGVkc2l6ZT1mYWxzZSwgZm9udHNpemU9MTIsIGZvbnRuYW1lPVwiSGVsdmV0aWNhLWJvbGRcIiwgZm9udGNvbG9yPVwiYmx1ZVwiIiwKKyAgICAgICAgICAgICAgICAiXHRcdHdpZHRoPS4yNSwgaGVpZ2h0PS4yNSwgY29sb3I9XCJibGFja1wiLCBmaWxsY29sb3I9XCJ3aGl0ZVwiLCBzdHlsZT1cImZpbGxlZCwgc29saWQsIGJvbGRcIl07IiwKKyAgICAgICAgICAgICAgICAiXHRlZGdlIFthcnJvd3NpemU9LjUsIGNvbG9yPVwiYmxhY2tcIiwgc3R5bGU9XCJib2xkXCJdIiwKKyAgICAgICAgICAgICAgICAiIgorICAgICAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc3RyaW5nIEZvb3RlciA9ICJ9IjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIE5vZGVGb3JtYXQgPSAiICB7MH0gW2xhYmVsPVwiezF9XCJdOyI7CisgICAgICAgIGNvbnN0IHN0cmluZyBFZGdlRm9ybWF0ID0gIiAgezB9IC0+IHsxfSAvLyBcInsyfVwiIC0+IFwiezN9XCIiOworCisgICAgICAgIC8qKiBUcmFjayBub2RlIHRvIG51bWJlciBtYXBwaW5nIHNvIHdlIGNhbiBnZXQgcHJvcGVyIG5vZGUgbmFtZSBiYWNrICovCisgICAgICAgIERpY3Rpb25hcnk8b2JqZWN0LCBpbnQ+IG5vZGVUb051bWJlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PG9iamVjdCwgaW50PigpOworCisgICAgICAgIC8qKiBUcmFjayBub2RlIG51bWJlciBzbyB3ZSBjYW4gZ2V0IHVuaXF1ZSBub2RlIG5hbWVzICovCisgICAgICAgIGludCBub2RlTnVtYmVyID0gMDsKKworICAgICAgICAvKiogR2VuZXJhdGUgRE9UIChncmFwaHZpeikgZm9yIGEgd2hvbGUgdHJlZSBub3QganVzdCBhIG5vZGUuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgMys0KjUgc2hvdWxkIGdlbmVyYXRlOgorICAgICAgICAgKgorICAgICAgICAgKiBkaWdyYXBoIHsKKyAgICAgICAgICogICBub2RlIFtzaGFwZT1wbGFpbnRleHQsIGZpeGVkc2l6ZT10cnVlLCBmb250c2l6ZT0xMSwgZm9udG5hbWU9IkNvdXJpZXIiLAorICAgICAgICAgKiAgICAgICAgIHdpZHRoPS40LCBoZWlnaHQ9LjJdOworICAgICAgICAgKiAgIGVkZ2UgW2Fycm93c2l6ZT0uN10KKyAgICAgICAgICogICAiKyItPjMKKyAgICAgICAgICogICAiKyItPiIqIgorICAgICAgICAgKiAgICIqIi0+NAorICAgICAgICAgKiAgICIqIi0+NQorICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIFRha2VzIGEgVHJlZSBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvRG90KG9iamVjdCB0cmVlLCBJVHJlZUFkYXB0b3IgYWRhcHRvcikgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBsaW5lIGluIEhlYWRlckxpbmVzKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZShsaW5lKTsKKworICAgICAgICAgICAgbm9kZU51bWJlciA9IDA7CisgICAgICAgICAgICB2YXIgbm9kZXMgPSBEZWZpbmVOb2Rlcyh0cmVlLCBhZGFwdG9yKTsKKyAgICAgICAgICAgIG5vZGVOdW1iZXIgPSAwOworICAgICAgICAgICAgdmFyIGVkZ2VzID0gRGVmaW5lRWRnZXModHJlZSwgYWRhcHRvcik7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIG5vZGVzKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZShzKTsKKworICAgICAgICAgICAgYnVpbGRlci5BcHBlbmRMaW5lKCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzIGluIGVkZ2VzKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZShzKTsKKworICAgICAgICAgICAgYnVpbGRlci5BcHBlbmRMaW5lKCk7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZShGb290ZXIpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb0RvdChJVHJlZSB0cmVlKSB7CisgICAgICAgICAgICByZXR1cm4gVG9Eb3QodHJlZSwgbmV3IENvbW1vblRyZWVBZGFwdG9yKCkpOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElFbnVtZXJhYmxlPHN0cmluZz4gRGVmaW5lTm9kZXMob2JqZWN0IHRyZWUsIElUcmVlQWRhcHRvciBhZGFwdG9yKSB7CisgICAgICAgICAgICBpZiAodHJlZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworCisgICAgICAgICAgICBpbnQgbiA9IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0cmVlKTsKKyAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYWxyZWFkeSBkdW1wZWQgYXMgY2hpbGQgZnJvbSBwcmV2aW91cworICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb247IGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVmaW5lIHBhcmVudCBub2RlCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gR2V0Tm9kZVRleHQoYWRhcHRvciwgdHJlZSk7CisKKyAgICAgICAgICAgIC8vIGZvciBlYWNoIGNoaWxkLCBkbyBhICI8dW5pcXVlLW5hbWU+IFtsYWJlbD10ZXh0XSIgbm9kZSBkZWYKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkID0gYWRhcHRvci5HZXRDaGlsZCh0cmVlLCBpKTsKKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gR2V0Tm9kZVRleHQoYWRhcHRvciwgY2hpbGQpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIERlZmluZU5vZGVzKGNoaWxkLCBhZGFwdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBJRW51bWVyYWJsZTxzdHJpbmc+IERlZmluZUVkZ2VzKG9iamVjdCB0cmVlLCBJVHJlZUFkYXB0b3IgYWRhcHRvcikgeworICAgICAgICAgICAgaWYgKHRyZWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKworICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQodHJlZSk7CisgICAgICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGFscmVhZHkgZHVtcGVkIGFzIGNoaWxkIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uOyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgeWllbGQgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZyBwYXJlbnROYW1lID0gIm4iICsgR2V0Tm9kZU51bWJlcih0cmVlKTsKKworICAgICAgICAgICAgLy8gZm9yIGVhY2ggY2hpbGQsIGRvIGEgcGFyZW50IC0+IGNoaWxkIGVkZ2UgdXNpbmcgdW5pcXVlIG5vZGUgbmFtZXMKKyAgICAgICAgICAgIHN0cmluZyBwYXJlbnRUZXh0ID0gYWRhcHRvci5HZXRUZXh0KHRyZWUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBhZGFwdG9yLkdldENoaWxkKHRyZWUsIGkpOworICAgICAgICAgICAgICAgIHN0cmluZyBjaGlsZFRleHQgPSBhZGFwdG9yLkdldFRleHQoY2hpbGQpOworICAgICAgICAgICAgICAgIHN0cmluZyBjaGlsZE5hbWUgPSAibiIgKyBHZXROb2RlTnVtYmVyKGNoaWxkKTsKKyAgICAgICAgICAgICAgICB5aWVsZCByZXR1cm4gc3RyaW5nLkZvcm1hdChFZGdlRm9ybWF0LCBwYXJlbnROYW1lLCBjaGlsZE5hbWUsIEZpeFN0cmluZyhwYXJlbnRUZXh0KSwgRml4U3RyaW5nKGNoaWxkVGV4dCkpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIERlZmluZUVkZ2VzKGNoaWxkLCBhZGFwdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgR2V0Tm9kZVRleHQoSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0KSB7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCh0KTsKKyAgICAgICAgICAgIHN0cmluZyB1bmlxdWVOYW1lID0gIm4iICsgR2V0Tm9kZU51bWJlcih0KTsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KE5vZGVGb3JtYXQsIHVuaXF1ZU5hbWUsIEZpeFN0cmluZyh0ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgR2V0Tm9kZU51bWJlcihvYmplY3QgdCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpZiAobm9kZVRvTnVtYmVyTWFwLlRyeUdldFZhbHVlKHQsIG91dCBpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub2RlVG9OdW1iZXJNYXBbdF0gPSBub2RlTnVtYmVyOworICAgICAgICAgICAgICAgIG5vZGVOdW1iZXIrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZU51bWJlciAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgRml4U3RyaW5nKHN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5SZXBsYWNlKHRleHQsICJcIiIsICJcXFxcXCIiKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LlJlcGxhY2UodGV4dCwgIlxcdCIsICIgICAgIik7CisgICAgICAgICAgICAgICAgdGV4dCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5SZXBsYWNlKHRleHQsICJcXG4iLCAiXFxcXG4iKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LlJlcGxhY2UodGV4dCwgIlxcciIsICJcXFxcciIpOworCisgICAgICAgICAgICAgICAgaWYgKHRleHQuTGVuZ3RoID4gMjApCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LlN1YnN0cmluZygwLCA4KSArICIuLi4iICsgdGV4dC5TdWJzdHJpbmcodGV4dC5MZW5ndGggLSA4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L0FudGxyMy5VdGlsaXR5IFwwNTBWUzIwMDVcMDUxLmNzcHJvaiIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L0FudGxyMy5VdGlsaXR5IFwwNTBWUzIwMDVcMDUxLmNzcHJvaiIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NTMyMgotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlV0aWxpdHkvQW50bHIzLlV0aWxpdHkgXDA1MFZTMjAwNVwwNTEuY3Nwcm9qIgpAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4NCisgICAgPFByb2R1Y3RWZXJzaW9uPjguMC41MDcyNzwvUHJvZHVjdFZlcnNpb24+DQorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4NCisgICAgPFByb2plY3RHdWlkPntCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5VdGlsaXR5PC9Sb290TmFtZXNwYWNlPg0KKyAgICA8QXNzZW1ibHlOYW1lPkFudGxyMy5VdGlsaXR5PC9Bc3NlbWJseU5hbWU+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcbmV0LTIuMFw8L091dHB1dFBhdGg+DQorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7REVCVUc7U1RST05HX05BTUU7RE9UTkVUMjwvRGVmaW5lQ29uc3RhbnRzPg0KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+DQorICAgIDxSb290TmFtZXNwYWNlPkFudGxyLlV0aWxpdHk8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxDaGVja0Zvck92ZXJmbG93VW5kZXJmbG93PnRydWU8L0NoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3c+DQorICAgIDxFbnZpcm9ubWVudFZhcmlhYmxlcz4NCisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZXMgLz4NCisgICAgPC9FbnZpcm9ubWVudFZhcmlhYmxlcz4NCisgICAgPEdlbmVyYXRlRG9jdW1lbnRhdGlvbj50cnVlPC9HZW5lcmF0ZURvY3VtZW50YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVxuZXQtMi4wXDwvT3V0cHV0UGF0aD4NCisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtTVFJPTkdfTkFNRTtET1RORVQyPC9EZWZpbmVDb25zdGFudHM+DQorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCisgICAgPERvY3VtZW50YXRpb25GaWxlPmJpblxSZWxlYXNlXG5ldC0yLjBcQW50bHIzLlV0aWxpdHkuWE1MPC9Eb2N1bWVudGF0aW9uRmlsZT4NCisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4NCisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQorICAgIDxSb290TmFtZXNwYWNlPkFudGxyLlV0aWxpdHk8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxDaGVja0Zvck92ZXJmbG93VW5kZXJmbG93PnRydWU8L0NoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3c+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5VdGlsaXR5LlRyZWVcRE9UVHJlZUdlbmVyYXRvci5jcyIgLz4NCisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXNzZW1ibHlJbmZvLmNzIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxBbnRscjMuUnVudGltZVxBbnRscjMuUnVudGltZSAoVlMyMDA1KS5jc3Byb2oiPg0KKyAgICAgIDxQcm9qZWN0PntDRjE1RDBENS1CRTcyLTRGOTgtQjcwRi0yMjlBQkExREYwRTh9PC9Qcm9qZWN0Pg0KKyAgICAgIDxOYW1lPkFudGxyMy5SdW50aW1lIChWUzIwMDUpPC9OYW1lPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3RyaW5nVGVtcGxhdGUsIFZlcnNpb249My4wLjEuNjg0NiwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iZWVlNDkyYjUyYzQxZTg1Ij4NCisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQorICAgICAgPEhpbnRQYXRoPi4uXC4uXExpYnJhcmllc1xTdHJpbmdUZW1wbGF0ZS5ORVRcbmV0LTIuMFxTdHJpbmdUZW1wbGF0ZS5kbGw8L0hpbnRQYXRoPg0KKyAgICA8L1JlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZvbGRlciBJbmNsdWRlPSJQcm9wZXJ0aWVzLyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+DQorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L0FudGxyMy5VdGlsaXR5IFwwNTBWUzIwMDhcMDUxLmNzcHJvaiIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L0FudGxyMy5VdGlsaXR5IFwwNTBWUzIwMDhcMDUxLmNzcHJvaiIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyZDhiNQotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzLlV0aWxpdHkvQW50bHIzLlV0aWxpdHkgXDA1MFZTMjAwOFwwNTEuY3Nwcm9qIgpAQCAtMCwwICsxLDc2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIiBUb29sc1ZlcnNpb249IjMuNSI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPntCRUIyN0RDQy1BQkZCLTQ5NTEtQjYxOC0yQjYzOUVDNjVBNDZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5VdGlsaXR5PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+QW50bHIzLTIuVXRpbGl0eS5Eb3ROZXQyMDwvQXNzZW1ibHlOYW1lPgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjIuMDwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24+CisgICAgPC9VcGdyYWRlQmFja3VwTG9jYXRpb24+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcbmV0LTIuMFw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRztTVFJPTkdfTkFNRTtET1RORVQyPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5VdGlsaXR5PC9Sb290TmFtZXNwYWNlPgorICAgIDxDaGVja0Zvck92ZXJmbG93VW5kZXJmbG93PnRydWU8L0NoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3c+CisgICAgPEVudmlyb25tZW50VmFyaWFibGVzPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGVzIC8+CisgICAgPC9FbnZpcm9ubWVudFZhcmlhYmxlcz4KKyAgICA8R2VuZXJhdGVEb2N1bWVudGF0aW9uPnRydWU8L0dlbmVyYXRlRG9jdW1lbnRhdGlvbj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVxuZXQtMi4wXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO1NUUk9OR19OQU1FO0RPVE5FVDI8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8RG9jdW1lbnRhdGlvbkZpbGU+YmluXFJlbGVhc2VcbmV0LTIuMFxBbnRscjMtMi5VdGlsaXR5LkRvdE5ldDIwLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5VdGlsaXR5PC9Sb290TmFtZXNwYWNlPgorICAgIDxDaGVja0Zvck92ZXJmbG93VW5kZXJmbG93PnRydWU8L0NoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3c+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBbnRsci5VdGlsaXR5LlRyZWVcRG90VHJlZUdlbmVyYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEFudGxyMy5SdW50aW1lXEFudGxyMy5SdW50aW1lIChWUzIwMDgpLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57Q0YxNUQwRDUtQkU3Mi00Rjk4LUI3MEYtMjI5QUJBMURGMEU4fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkFudGxyMy5SdW50aW1lIChWUzIwMDgpPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTdHJpbmdUZW1wbGF0ZSwgVmVyc2lvbj0zLjAuMS42ODQ2LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWJlZWU0OTJiNTJjNDFlODUiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi4uXC4uXExpYnJhcmllc1xTdHJpbmdUZW1wbGF0ZS5ORVRcbmV0LTIuMFxTdHJpbmdUZW1wbGF0ZS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlByb3BlcnRpZXNcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L0Fzc2VtYmx5SW5mby5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuVXRpbGl0eS9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1OTgzMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuVXRpbGl0eS9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwxMDggQEAKKy8qCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBNVVNUIFJFVEFJTiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gTVVTVCBSRVBST0RVQ0UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAorICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKKyAgIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciBXUklUVEVOIHBlcm1pc3Npb24uCis0LiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSAKKyAgIHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoaXMgd29yayB0byB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGxpY2Vuc29yCisgICBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBsaWNlbnNlLCB3aXRob3V0IGFueSAKKyAgIGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKKy8vIFRPRE86IFJldmlldyB0aGUgdmFsdWVzIG9mIHRoZSBhc3NlbWJseSBhdHRyaWJ1dGVzCisKK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQU5UTFIzIFV0aWxpdGllcyBmb3IgLk5FVCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgUmV2aXNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisKK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjEuMC4qIildCisKKy8vCisvLyBJbiBvcmRlciB0byBzaWduIHlvdXIgYXNzZW1ibHkgeW91IG11c3Qgc3BlY2lmeSBhIGtleSB0byB1c2UuIFJlZmVyIHRvIHRoZSAKKy8vIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGFzc2VtYmx5IHNpZ25pbmcuCisvLworLy8gVXNlIHRoZSBhdHRyaWJ1dGVzIGJlbG93IHRvIGNvbnRyb2wgd2hpY2gga2V5IGlzIHVzZWQgZm9yIHNpZ25pbmcuIAorLy8KKy8vIE5vdGVzOiAKKy8vICAgKCopIElmIG5vIGtleSBpcyBzcGVjaWZpZWQsIHRoZSBhc3NlbWJseSBpcyBub3Qgc2lnbmVkLgorLy8gICAoKikgS2V5TmFtZSByZWZlcnMgdG8gYSBrZXkgdGhhdCBoYXMgYmVlbiBpbnN0YWxsZWQgaW4gdGhlIENyeXB0byBTZXJ2aWNlCisvLyAgICAgICBQcm92aWRlciAoQ1NQKSBvbiB5b3VyIG1hY2hpbmUuIEtleUZpbGUgcmVmZXJzIHRvIGEgZmlsZSB3aGljaCBjb250YWlucworLy8gICAgICAgYSBrZXkuCisvLyAgICgqKSBJZiB0aGUgS2V5RmlsZSBhbmQgdGhlIEtleU5hbWUgdmFsdWVzIGFyZSBib3RoIHNwZWNpZmllZCwgdGhlIAorLy8gICAgICAgZm9sbG93aW5nIHByb2Nlc3Npbmcgb2NjdXJzOgorLy8gICAgICAgKDEpIElmIHRoZSBLZXlOYW1lIGNhbiBiZSBmb3VuZCBpbiB0aGUgQ1NQLCB0aGF0IGtleSBpcyB1c2VkLgorLy8gICAgICAgKDIpIElmIHRoZSBLZXlOYW1lIGRvZXMgbm90IGV4aXN0IGFuZCB0aGUgS2V5RmlsZSBkb2VzIGV4aXN0LCB0aGUga2V5IAorLy8gICAgICAgICAgIGluIHRoZSBLZXlGaWxlIGlzIGluc3RhbGxlZCBpbnRvIHRoZSBDU1AgYW5kIHVzZWQuCisvLyAgICgqKSBJbiBvcmRlciB0byBjcmVhdGUgYSBLZXlGaWxlLCB5b3UgY2FuIHVzZSB0aGUgc24uZXhlIChTdHJvbmcgTmFtZSkgdXRpbGl0eS4KKy8vICAgICAgIFdoZW4gc3BlY2lmeWluZyB0aGUgS2V5RmlsZSwgdGhlIGxvY2F0aW9uIG9mIHRoZSBLZXlGaWxlIHNob3VsZCBiZQorLy8gICAgICAgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgb3V0cHV0IGRpcmVjdG9yeSB3aGljaCBpcworLy8gICAgICAgJVByb2plY3QgRGlyZWN0b3J5JVxvYmpcPGNvbmZpZ3VyYXRpb24+LiBGb3IgZXhhbXBsZSwgaWYgeW91ciBLZXlGaWxlIGlzCisvLyAgICAgICBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgeW91IHdvdWxkIHNwZWNpZnkgdGhlIEFzc2VtYmx5S2V5RmlsZSAKKy8vICAgICAgIGF0dHJpYnV0ZSBhcyBbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiLi5cLi5cbXlrZXkuc25rIildCisvLyAgICgqKSBEZWxheSBTaWduaW5nIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiAtIHNlZSB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrCisvLyAgICAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMuCisvLworCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5S2V5TmFtZSgiIildCisKKyNpZiBTVFJPTkdfTkFNRQorLy8gVGhpcyBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IHRoZSBidWlsZCBpcyBhIFZTLk5FVCBidWlsZC4KK1thc3NlbWJseTogQXNzZW1ibHlEZWxheVNpZ24oZmFsc2UpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIi4uLy4uLy4uL0FudGxyM19LZXlQYWlyLnNuayIpXQorI2VsaWYgTkFOVF9TVFJPTkdOQU1FCisvLyBUaGlzIHN0cm9uZ2x5IHN1Z2dlc3RzIHRoYXQgdGhlIGJ1aWxkIGlzIGEgTkFOVCBidWlsZC4KK1thc3NlbWJseTogQXNzZW1ibHlEZWxheVNpZ24oZmFsc2UpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIi4uL0FudGxyM19LZXlQYWlyLnNuayIpXQorI2Vsc2UKKy8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB0aGUgYXNzZW1ibHkgc2hvdWxkIGFsd2F5cyBiZSBzdHJvbmcgbmFtZWQuCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVsYXlTaWduKGZhbHNlKV0KK1thc3NlbWJseTogQXNzZW1ibHlLZXlGaWxlKCIiKV0KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuVXRpbGl0eS9kZWZhdWx0LmJ1aWxkIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyMy5VdGlsaXR5L2RlZmF1bHQuYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3OTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjMuVXRpbGl0eS9kZWZhdWx0LmJ1aWxkCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgbmFtZT0iQU5UTFIgQyMgUnVudGltZSBVdGlsaXR5IExpYnJhcnkiIGRlZmF1bHQ9ImJ1aWxkIj4KKyAgICA8dHN0YW1wLz4KKwk8cHJvcGVydHkgbmFtZT0iYmFzZS5kaXIiIHZhbHVlPSIke3BhdGg6OmdldC1mdWxsLXBhdGgoIHByb2plY3Q6OmdldC1iYXNlLWRpcmVjdG9yeSgpICl9IiAvPgorCisJPGluY2x1ZGUgYnVpbGRmaWxlPSIuLi8uLi9hbnRscjMucnVudGltZS5uZXQuY29tbW9uLmluYyIgLz4KKworCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMC4xIiAvPgorCisJPHByb3BlcnR5IG5hbWU9Im5hbWUiIHZhbHVlPSJBbnRscjMuVXRpbGl0eSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iYXNzZW1ibHkubmFtZSIgdmFsdWU9IiR7bmFtZX0uZGxsIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iJHtiYXNlLmRpcn0vIiAvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0idHJ1ZSIgdW5sZXNzPSIke3Byb3BlcnR5OjpleGlzdHMoJ2RlYnVnJyl9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgcHJvamVjdDogJyR7bmFtZX0nIHZlcnNpb24gJHt2ZXJzaW9ufSA9PT4gJyR7YXNzZW1ibHkubmFtZX0nIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9ImNsZWFuIiBkZXNjcmlwdGlvbj0iYnVpbGQgbm9uLWRlYnVnIHZlcnNpb24iPgorICAgICAgICA8IS0tIGJ1aWxkIGEgY2xlYW4gcmVsZWFzZSBkaXN0cmlidXRpb24gZm9yIHJlbGVhc2UgLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkRlYnVnID0gJHtkZWJ1Z30iLz4KKyAgICAgICAgPGNhbGwgdGFyZ2V0PSJidWlsZCIvPgorICAgIDwvdGFyZ2V0PgorICAgIAorICAgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlcyB0aGUgc291cmNlIGNvZGUiPgorICAgIDwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJjbGVhbiI+CisJPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4udnNuZXQiIGRlc2NyaXB0aW9uPSJjbGVhbnMgdXAgVlMuTkVUIGJ1aWxkIGFydGlmYWN0cyBhbmQgb3V0cHV0Ij4KKwkJPCEtLSBkZWxldGUgVlMuTkVUIHByb2plY3QgYXJ0aWZhY3RzIGRpcmVjdG9yeSAtLT4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iRGVsZXRpbmcgVlMuTkVUIGFydGlmYWN0cyBkaXJlY3RvcnkgJyR7YmFzZS5kaXJ9L2JpbiciIC8+CisJCTxkZWxldGUgZGlyPSIke2Jhc2UuZGlyfS9iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iRGVsZXRpbmcgVlMuTkVUIGFydGlmYWN0cyBkaXJlY3RvcnkgJyR7YmFzZS5kaXJ9L29iaiciIC8+CisJCTxkZWxldGUgZGlyPSIke2Jhc2UuZGlyfS9vYmoiIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KKyAgICA8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+CisJCTxjc2MgCisJCQlkZWZpbmU9IiR7c3Ryb25nX25hbWV9OyR7ZG90bmV0X2RlZmluZX0iCisJCQl0YXJnZXQ9ImxpYnJhcnkiIAorCQkJZGVidWc9IiR7ZGVidWd9IgorCQkJb3B0aW1pemU9IiR7b3B0aW1pemV9IgorCQkJb3V0cHV0PSIke2J1aWxkLndvcmtpbmcuZGlyfS8ke2Fzc2VtYmx5Lm5hbWV9IiAKKwkJCWRvYz0iJHtidWlsZC53b3JraW5nLmRpcn0vJHtuYW1lfS54bWwiPgorCQkJCisJCQk8bm93YXJuPgorCQkJCTx3YXJuaW5nIG51bWJlcj0iMTU5MSIgLz4KKwkJCQk8d2FybmluZyBudW1iZXI9IjE1NzIiIC8+CisJCQk8L25vd2Fybj4KKwkJCQorCQkJPHJlc291cmNlcyBwcmVmaXg9IkFudGxyLlV0aWxpdHkiIGR5bmFtaWNwcmVmaXg9InRydWUiPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqLyoucmVzeCIgLz4KKwkJCTwvcmVzb3VyY2VzPgorCQkJCisJCQk8c291cmNlcyBiYXNlZGlyPSIke3NyYy5kaXJ9IiBkZWZhdWx0ZXhjbHVkZXM9InRydWUiPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouY3MiIC8+CisJCQk8L3NvdXJjZXM+CisKKwkJCTxyZWZlcmVuY2VzPgorCQkJCTxpbmNsdWRlIG5hbWU9IiR7YnVpbGQud29ya2luZy5kaXJ9L0FudGxyMy5SdW50aW1lLmRsbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIke2J1aWxkLndvcmtpbmcuZGlyfS9TdHJpbmdUZW1wbGF0ZS5kbGwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iJHtidWlsZC53b3JraW5nLmRpcn0vYW50bHIucnVudGltZS5kbGwiIC8+CisJCQk8L3JlZmVyZW5jZXM+CisJCTwvY3NjPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJkb2NzIj4KKwk8L3RhcmdldD4KKwkJCQorCTx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iZG9jcyI+CisJPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjNfS2V5UGFpci5zbmsgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzX0tleVBhaXIuc25rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTY3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL1NvdXJjZXMvQW50bHIzX0tleVBhaXIuc25rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjNfUHVibGljS2V5LnNuayBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvU291cmNlcy9BbnRscjNfUHVibGljS2V5LnNuawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWUwYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9Tb3VyY2VzL0FudGxyM19QdWJsaWNLZXkuc25rCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvYWxsLmFudGxyMy5ydW50aW1lLm5ldC5idWlsZCBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvYWxsLmFudGxyMy5ydW50aW1lLm5ldC5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzcyMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9hbGwuYW50bHIzLnJ1bnRpbWUubmV0LmJ1aWxkCkBAIC0wLDAgKzEsMzI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSdpc28tODg1OS0xJyA/PgorPHByb2plY3QgbmFtZT0iYWxsIiBkZWZhdWx0PSJ1c2FnZSI+CisKKwk8cHJvcGVydHkgbmFtZT0iYmFzZS5kaXIiIAkJCXZhbHVlPSIke3BhdGg6OmdldC1mdWxsLXBhdGgoIHByb2plY3Q6OmdldC1iYXNlLWRpcmVjdG9yeSgpICl9IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJzaGFyZWRsaWJyYXJ5LmRpciIgCXZhbHVlPSIke2Jhc2UuZGlyfS9MaWJyYXJpZXMiIC8+CisJPHByb3BlcnR5IG5hbWU9InRvb2xzLmRpciIgCQkJdmFsdWU9IiR7YmFzZS5kaXJ9L1Rvb2xzIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wZGlyIiAJCQl2YWx1ZT0idGVtcGRpciIgLz4KKworCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiAJCQl2YWx1ZT0iMy4xYjEiIC8+CisKKwk8aW5jbHVkZSBidWlsZGZpbGU9ImFudGxyMy5ydW50aW1lLm5ldC5jb21tb24uaW5jIiAvPgorCisgIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIAk8IS0tIEhlbHAgb24gdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIAkKKyAgCTx0YXJnZXQgbmFtZT0idXNhZ2UiPgorICAgIAk8ZWNobyBtZXNzYWdlPSJBTlRMUiB2MyBDIyBSdW50aW1lIC0gTmFudCBCdWlsZCBmaWxlIi8+CisgICAgCTxlY2hvIG1lc3NhZ2U9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iIi8+CisgICAgCTxlY2hvIG1lc3NhZ2U9ImF2YWlsYWJsZSB0YXJnZXRzIGFyZToiLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iIi8+CisgICAgCTxlY2hvIG1lc3NhZ2U9IiAgYnVpbGQgICAgICAtIGJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UgdmVyc2lvbiBpbiAnJHtiYXNlLmRpcn0vYnVpbGQvJHtmcmFtZXdvcms6OmdldC10YXJnZXQtZnJhbWV3b3JrKCl9JyIvPgorICAgIAk8ZWNobyBtZXNzYWdlPSIgICAgICAgICAgICAgICAgICh1c2UgLURkZWJ1Zz10cnVlIG9yIC1EZGVidWc9ZmFsc2UgKSIvPgorICAgIAk8ZWNobyBtZXNzYWdlPSIiLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iICByZWxlYXNlICAgIC0gYnVpbGQgcmVsZWFzZSB2ZXJzaW9uIGluICcke2Jhc2UuZGlyfS9idWlsZC8ke2ZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKX0nIi8+CisgICAgCTxlY2hvIG1lc3NhZ2U9IiIvPgorICAgIAk8ZWNobyBtZXNzYWdlPSIgIGRpc3QgICAgICAgLSBidWlsZCBzcmMvYmluL2RvY3MgZGlzdHJvIGluICcke2Jhc2UuZGlyfSciLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iICAgICAgICAgICAgICAgICAodXNlcyAqKnByZS1idWlsdCoqIGJpbmFyaWVzLikiLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iIi8+CisgICAgCTxlY2hvIG1lc3NhZ2U9IiAgY2xlYW5hbGwgICAtIGRlbGV0ZSBhbGwgdGhlIE5hbnQgYW5kIFZTLk5FVCBidWlsZCBhcnRpZmFjdHMiLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iICBjbGVhbiAgICAgIC0gZGVsZXRlIGFsbCB0aGUgTmFudCBidWlsZCBhcnRpZmFjdHMgb25seSIvPgorICAgIAk8ZWNobyBtZXNzYWdlPSIiLz4KKyAgICAJPGVjaG8gbWVzc2FnZT0iICB1c2FnZSAgICAgIC0gc2hvdyB0aGlzIG1lc3NhZ2UgKGRlZmF1bHQpIi8+CisgICAgCTxlY2hvIG1lc3NhZ2U9IiIvPgorICAgIAk8ZWNobyBtZXNzYWdlPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIi8+CisgIAk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iYnVpbGQiIAorCQkJZGVwZW5kcz0iY2xlYW4sIGluaXQsIGJ1aWxkLnYzLnJ1bnRpbWUsIGJ1aWxkLnYzLnV0aWxpdHksIGNvcHl0b2J1aWxkZGlyIgorCQkJZGVzY3JpcHRpb249IkJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UgdmVyc2lvbiAoIC1EZGVidWc9dHJ1ZXxmYWxzZSApIgorCS8+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2UiIGRlcGVuZHM9ImNsZWFuIiBkZXNjcmlwdGlvbj0iQnVpbGRzIHJlbGVhc2UgKGkuZS4gbm9uLWRlYnVnKSB2ZXJzaW9uIj4KKyAgICAgICAgPCEtLSBidWlsZCBhIGNsZWFuIHJlbGVhc2UgZGlzdHJpYnV0aW9uIGZvciByZWxlYXNlIC0tPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVidWciIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8Y2FsbCB0YXJnZXQ9ImJ1aWxkIi8+CisgICAgPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuYWxsIiBkZXBlbmRzPSJjbGVhbiIgZGVzY3JpcHRpb249IkNsZWFucyBhbGwgdGhlIE5hbnQgYW5kIFZTLk5FVCBidWlsZCBhcnRpZmFjdHMiPgorCQk8bmFudCBidWlsZGZpbGU9IlNvdXJjZXMvQW50bHIzLlJ1bnRpbWUvZGVmYXVsdC5idWlsZCIgdGFyZ2V0PSJjbGVhbi52c25ldCIgaW5oZXJpdGFsbD0idHJ1ZSIgLz4KKwkJPG5hbnQgYnVpbGRmaWxlPSJTb3VyY2VzL0FudGxyMy5VdGlsaXR5L2RlZmF1bHQuYnVpbGQiIHRhcmdldD0iY2xlYW4udnNuZXQiIGluaGVyaXRhbGw9InRydWUiIC8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJkaXN0IiAKKwkJCWRlcGVuZHM9InJlbGVhc2VEb2NzLCB6aXBzb3VyY2UsIHppcDExLCB6aXAyMCwgemlwZG9jIgorCQkJZGVzY3JpcHRpb249IkNyZWF0ZXMgc3JjL2Jpbi9kb2NzIGRpc3Ryb3MgKHVzZXMgcHJlLWJ1aWx0IGJpbmFyaWVzKSIKKwkvPgorCQorCisJPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkNsZWFucyBOYW50IGJ1aWxkIGFydGlmYWN0cyI+CisJCTxkZWxldGUgZGlyPSIke2J1aWxkLndvcmtpbmcuZGlyfSIgZmFpbG9uZXJyb3I9ImZhbHNlIiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtidWlsZC5kZXN0LmRpcn0iICAgIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4KKwkJPCEtLSA8ZGVsZXRlIGRpcj0iJHtkb2MuZGlyfSIgICAgICAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIgLz4gLS0+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPG1rZGlyIGRpcj0iJHtidWlsZC53b3JraW5nLmRpcn0iIC8+CisJCTxta2RpciBkaXI9IiR7YnVpbGQuZGVzdC5kaXJ9IiAvPgorCQk8Y2FsbCB0YXJnZXQ9ImNvcHlfYnVpbGRfZGVwZW5kZW5jaWVzIiAvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iY29weV9idWlsZF9kZXBlbmRlbmNpZXMiPgorCQk8Y29weSB0b2Rpcj0iJHtidWlsZC5kZXN0LmRpcn0iPgorCQkJPGZpbGVzZXQgYmFzZWRpcj0iJHtzaGFyZWRsaWJyYXJ5LmRpcn0vTWJVbml0Ij4KKwkJCQk8aW5jbHVkZSBuYW1lPSJNYlVuaXQuRnJhbWV3b3JrLmRsbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJRdWlja0dyYXBoLkFsZ29yaXRobXMuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IlF1aWNrR3JhcGguZGxsIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisJCTxjb3B5IHRvZGlyPSIke2J1aWxkLmRlc3QuZGlyfSI+CisJCQk8ZmlsZXNldCBiYXNlZGlyPSIke3NoYXJlZGxpYnJhcnkuZGlyfS9TdHJpbmdUZW1wbGF0ZS5ORVQvJHt0YXJnZXQuY2xyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iU3RyaW5nVGVtcGxhdGUuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9ImFudGxyLnJ1bnRpbWUuZGxsIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnYzLnJ1bnRpbWUiIGRlcGVuZHM9ImluaXQiPgorCQk8bmFudCBidWlsZGZpbGU9IlNvdXJjZXMvQW50bHIzLlJ1bnRpbWUvZGVmYXVsdC5idWlsZCIgdGFyZ2V0PSJidWlsZCIgaW5oZXJpdGFsbD0idHJ1ZSIgLz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkLnYzLnV0aWxpdHkiIGRlcGVuZHM9ImluaXQiPgorCQk8bmFudCBidWlsZGZpbGU9IlNvdXJjZXMvQW50bHIzLlV0aWxpdHkvZGVmYXVsdC5idWlsZCIgdGFyZ2V0PSJidWlsZCIgaW5oZXJpdGFsbD0idHJ1ZSIgLz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9ImNvcHl0b2J1aWxkZGlyIj4KKwkJPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGVzdC5kaXJ9Ij4KKwkJCTxmaWxlc2V0IGJhc2VkaXI9IiR7YnVpbGQud29ya2luZy5kaXJ9Ij4KKwkJCQk8aW5jbHVkZSBuYW1lPSJBbnRscjMuUnVudGltZS5kbGwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlJ1bnRpbWUueG1sIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IkFudGxyMy5VdGlsaXR5LmRsbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJBbnRscjMuVXRpbGl0eS54bWwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iU3RyaW5nVGVtcGxhdGUuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9ImFudGxyLnJ1bnRpbWUuZGxsIiAvPgorCQkJCQorCQkJCTxpbmNsdWRlIG5hbWU9IkFudGxyMy5SdW50aW1lLnBkYiIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJBbnRscjMuVXRpbGl0eS5wZGIiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iU3RyaW5nVGVtcGxhdGUucGRiIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9ImFudGxyLnJ1bnRpbWUucGRiIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L2NvcHk+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJ6aXAxMSI+CisJCTx6aXAgemlwZmlsZT0iJHtiYXNlLmRpcn0vQW50bHIzLkMjLlJ1bnRpbWUudiR7dmVyc2lvbn0ubmV0LTEuMS56aXAiPgorCQkJPGZpbGVzZXQgYmFzZWRpcj0iJHtiYXNlLmRpcn0vYnVpbGQiPgorCQkJCTxpbmNsdWRlIG5hbWU9Im5ldC0xLjEvQW50bHIzLlJ1bnRpbWUuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9Im5ldC0xLjEvQW50bHIzLlV0aWxpdHkuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9Im5ldC0xLjEvU3RyaW5nVGVtcGxhdGUuZGxsIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9Im5ldC0xLjEvYW50bHIucnVudGltZS5kbGwiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCQk8ZmlsZXNldCBiYXNlZGlyPSIke2Jhc2UuZGlyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iUkVBRE1FLlRYVCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLlRYVCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJOT1RJQ0UuVFhUIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IkNIQU5HRVMuVFhUIiAvPgorCQkJPC9maWxlc2V0PgorCQkJPGZpbGVzZXQgYmFzZWRpcj0iJHtiYXNlLmRpcn0vZG9jcyI+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlJ1bnRpbWUuY2htIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IkFudGxyMy5VdGlsaXR5LmNobSIgLz4KKwkJCTwvZmlsZXNldD4KKwkJPC96aXA+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InppcDIwIj4KKwkJPHppcCB6aXBmaWxlPSIke2Jhc2UuZGlyfS9BbnRscjMuQyMuUnVudGltZS52JHt2ZXJzaW9ufS5uZXQtMi4wLnppcCI+CisJCQk8ZmlsZXNldCBiYXNlZGlyPSIke2Jhc2UuZGlyfS9idWlsZCI+CisJCQkJPGluY2x1ZGUgbmFtZT0ibmV0LTIuMC9BbnRscjMuUnVudGltZS5kbGwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0ibmV0LTIuMC9BbnRscjMuVXRpbGl0eS5kbGwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0ibmV0LTIuMC9TdHJpbmdUZW1wbGF0ZS5kbGwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0ibmV0LTIuMC9hbnRsci5ydW50aW1lLmRsbCIgLz4KKwkJCTwvZmlsZXNldD4KKwkJCTxmaWxlc2V0IGJhc2VkaXI9IiR7YmFzZS5kaXJ9Ij4KKwkJCQk8aW5jbHVkZSBuYW1lPSJSRUFETUUuVFhUIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UuVFhUIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9Ik5PVElDRS5UWFQiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQ0hBTkdFUy5UWFQiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCQk8ZmlsZXNldCBiYXNlZGlyPSIke2Jhc2UuZGlyfS9kb2NzIj4KKwkJCQk8aW5jbHVkZSBuYW1lPSJBbnRscjMuUnVudGltZS5jaG0iIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlV0aWxpdHkuY2htIiAvPgorCQkJPC9maWxlc2V0PgorCQk8L3ppcD4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9InppcGRvYyI+CisJCTx6aXAgemlwZmlsZT0iJHtiYXNlLmRpcn0vQW50bHIzLkMjLlJ1bnRpbWUudiR7dmVyc2lvbn0uYXBpLWRvYy56aXAiPgorCQkJPGZpbGVzZXQgYmFzZWRpcj0iJHtiYXNlLmRpcn0vZG9jcyI+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlJ1bnRpbWUuY2htIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IkFudGxyMy5VdGlsaXR5LmNobSIgLz4KKwkJCTwvZmlsZXNldD4KKwkJPC96aXA+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9InppcHNvdXJjZSI+CisJCTx6aXAgemlwZmlsZT0iJHtiYXNlLmRpcn0vQW50bHIzLkMjLlJ1bnRpbWUudiR7dmVyc2lvbn0uc3JjLnppcCI+CisJCQk8ZmlsZXNldCBiYXNlZGlyPSIke2Jhc2UuZGlyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5idWlsZCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmluYyIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLnNsbiIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmNzIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouY3Nwcm9qIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IioqLyoucmVzeCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmljbyIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5qcGciIC8+CisJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5wZGYiIC8+CisKKwkJCQk8aW5jbHVkZSBuYW1lPSIke3NoYXJlZGxpYnJhcnkuZGlyfS8qKi8qLmRsbCIgLz4KKworCQkJCTxpbmNsdWRlIG5hbWU9IiR7dG9vbHMuZGlyfS8qKi8qLmRsbCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSIke3Rvb2xzLmRpcn0vKiovKi5leGUiIC8+CisJCQkJCisJCQkJPGluY2x1ZGUgbmFtZT0iUkVBRE1FLlRYVCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJMSUNFTlNFLlRYVCIgLz4KKwkJCQk8aW5jbHVkZSBuYW1lPSJOT1RJQ0UuVFhUIiAvPgorCQkJCTxpbmNsdWRlIG5hbWU9IkNIQU5HRVMuVFhUIiAvPgorCisJCQkJPGV4Y2x1ZGUgbmFtZT0iKi5zbmsiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovb2JqL0RlYnVnLyouKiIgLz4KKwkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9vYmovRGVidWcvbmV0LTEuMS8qLioiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovb2JqL0RlYnVnL25ldC0yLjAvKi4qIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqL2Jpbi9EZWJ1Zy8qLioiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovYmluL0RlYnVnL25ldC0xLjEvKi4qIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqL2Jpbi9EZWJ1Zy9uZXQtMi4wLyouKiIgLz4KKwkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9iaW4vKi4qIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9ImJpbi8qKi8qLioiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iYnVpbGQvKiovKi4qIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqLyoudXNlciIgLz4KKwkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLnJlc2hhcnBlcm9wdGlvbnMiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5vYmoiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5wY2giIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5wZGIiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5pZGIiIC8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5sb2cqIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqLyouc3VvIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqLyouYmFrIiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqLyoubmV3IiAvPgorCQkJCTxleGNsdWRlIG5hbWU9IioqLyoub3JpZ2luYWwiIC8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvemlwPgorCTwvdGFyZ2V0PgorCQorCTwhLS0gRG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLiAtLT4KKwk8cHJvcGVydHkgbmFtZT0iYmFzZS5kaXIiIHZhbHVlPSIuIiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJkb2MuZGlyIiB2YWx1ZT0iJHtiYXNlLmRpcn0vZG9jcyIgLz4KKwk8cHJvcGVydHkgbmFtZT0idGVtcEJpbi5kaXIiIHZhbHVlPSIke2RvYy5kaXJ9L2JpbiIvPgorCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREb2NzLmZpbGUiIHZhbHVlPSJBbnRscjMuUnVudGltZSIvPgorCQorCTwhLS0gRG9jcyBnZW5lcmF0aW9uIHByb3BlcnRpZXMuIC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJTaG93TWlzc2luZyIgdmFsdWU9ImZhbHNlIi8+CisJPHByb3BlcnR5IG5hbWU9IlNob3dQcml2YXRlIiB2YWx1ZT0iZmFsc2UiLz4KKwk8cHJvcGVydHkgbmFtZT0iT3V0cHV0VGFyZ2V0IiB2YWx1ZT0iSFRNTEhlbHAiLz4KKworPCEtLQkJCisJCWRlc2NyaXB0aW9uOiAKKwkJCUdlbmVyYXRlcyBkb2N1bWVudGF0aW9uIHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzLgorLS0+CQorCTx0YXJnZXQgbmFtZT0icmVsZWFzZURvY3MiIGRlcGVuZHM9ImNsZWFuLmRvY3MiPgorCQk8Y2FsbCB0YXJnZXQ9ImNvcHlGaWxlc1RvRG9jdW1lbnQiLz4KKwkJPGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZVJlbGVhc2VEb2NzIi8+CisJPC90YXJnZXQ+CisJCis8IS0tCQkKKwkJZGVzY3JpcHRpb246IAorCQkJR2VuZXJhdGVzIGRvY3VtZW50YXRpb24gZm9yIGRldmVsb3BlcnMsIHdpdGggYWxsIG1pc3NpbmcgaW5mb3JtYXRpb24gaW5kaWNhdGVkIGFuZCBwcml2YXRlIG1lbWJlcnMgdmlzaWJsZS4KKy0tPgkKKwk8dGFyZ2V0IG5hbWU9ImRldkRvY3MiIGRlcGVuZHM9ImNsZWFuLmRvY3MiPgorCQk8cHJvcGVydHkgbmFtZT0iU2hvd01pc3NpbmciIHZhbHVlPSJ0cnVlIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJTaG93UHJpdmF0ZSIgdmFsdWU9InRydWUiLz4KKwkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERvY3MuZmlsZSIgdmFsdWU9IkFudGxyMy5SdW50aW1lLkRldiIvPgorCQk8Y2FsbCB0YXJnZXQ9ImNvcHlGaWxlc1RvRG9jdW1lbnQiLz4KKwkJPGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZVJlbGVhc2VEb2NzIi8+CisJPC90YXJnZXQ+CisJCQorPCEtLQkJCisJCWRlc2NyaXB0aW9uOiAKKwkJCSBHZW5lcmF0ZXMgZG9jdW1lbnRhdGlvbiBmb3IgcmVsZWFzZS4KKy0tPgkKKwk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlUmVsZWFzZURvY3MiPgorCQk8bmRvYyBmYWlsb25lcnJvcj0idHJ1ZSI+CisJCQk8YXNzZW1ibGllcyBiYXNlZGlyPSIke3RlbXBCaW4uZGlyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlJ1bnRpbWUuZGxsIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlV0aWxpdHkuZGxsIi8+CisJCQk8L2Fzc2VtYmxpZXM+CisJCQk8cmVmZXJlbmNlcGF0aHM+CisJCQkJPGluY2x1ZGUgbmFtZT0iTGlicmFyaWVzL1N0cmluZ1RlbXBsYXRlLk5FVC8ke2ZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKX0iLz4KKwkJCTwvcmVmZXJlbmNlcGF0aHM+CisJCQk8ZG9jdW1lbnRlcnM+CisJCQkJPGRvY3VtZW50ZXIgbmFtZT0iTVNETiI+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJPdXRwdXRUYXJnZXQiIHZhbHVlPSIke091dHB1dFRhcmdldH0iIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJQcmVsaW1pbmFyeSIgdmFsdWU9InRydWUiIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJCaW5hcnlUT0MiIHZhbHVlPSJ0cnVlIiAvPgorCQkJCQk8cHJvcGVydHkgbmFtZT0iQ2xlYW5JbnRlcm1lZGlhdGVzIiB2YWx1ZT0idHJ1ZSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IlNka0xpbmtzT25XZWIiIHZhbHVlPSJ0cnVlIiAvPgorCQkJCQkKKwkJCQkJPHByb3BlcnR5IG5hbWU9Ik91dHB1dERpcmVjdG9yeSIgdmFsdWU9IiR7ZG9jLmRpcn0iIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJIdG1sSGVscE5hbWUiIHZhbHVlPSIke291dHB1dERvY3MuZmlsZX0iIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJJbmNsdWRlRmF2b3JpdGVzIiB2YWx1ZT0iVHJ1ZSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IlNwbGl0VE9DcyIgdmFsdWU9IkZhbHNlIiAvPgorCQkJCQkKKwkJCQkJPHByb3BlcnR5IG5hbWU9IlRpdGxlIiB2YWx1ZT0iQU5UTFIgdjMgQyMgUnVudGltZSBMaWJyYXJ5IEFQSSBkb2N1bWVudGF0aW9uIiAvPgkKKwkJCQkJPHByb3BlcnR5IG5hbWU9IkRlZmF1bFRPQyIgdmFsdWU9IkFudGxyLlJ1bnRpbWUiIC8+CisJCQkJCQorCQkJCQk8cHJvcGVydHkgbmFtZT0iU2hvd1Zpc3VhbEJhc2ljIiB2YWx1ZT0iVHJ1ZSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IlNob3dNaXNzaW5nU3VtbWFyaWVzIiB2YWx1ZT0iJHtTaG93TWlzc2luZ30iIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJTaG93TWlzc2luZ1JlbWFya3MiIHZhbHVlPSIke1Nob3dNaXNzaW5nfSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IlNob3dNaXNzaW5nUGFyYW1zIiB2YWx1ZT0iJHtTaG93TWlzc2luZ30iIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJTaG93TWlzc2luZ1JldHVybnMiIHZhbHVlPSIke1Nob3dNaXNzaW5nfSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IlNob3dNaXNzaW5nVmFsdWVzIiB2YWx1ZT0iJHtTaG93TWlzc2luZ30iIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJEb2N1bWVudEVtcHR5TmFtZXNwYWNlcyIgdmFsdWU9IiR7U2hvd01pc3Npbmd9IiAvPgorCQkJCQkKKwkJCQkJPHByb3BlcnR5IG5hbWU9IkF1dG9Qcm9wZXJ0eUJhY2tlclN1bW1hcmllcyIgdmFsdWU9InRydWUiIC8+CisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJBdXRvRG9jdW1lbnRDb25zdHJ1Y3RvcnMiIHZhbHVlPSJ0cnVlIiAvPgorCQkJCQk8cHJvcGVydHkgbmFtZT0iRG9jdW1lbnRQcm90ZWN0ZWQiIHZhbHVlPSJUcnVlIiAvPgorCQkJCQk8cHJvcGVydHkgbmFtZT0iRG9jdW1lbnRJbnRlcm5hbHMiIHZhbHVlPSIke1Nob3dQcml2YXRlfSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IkRvY3VtZW50UHJpdmF0ZXMiIHZhbHVlPSIke1Nob3dQcml2YXRlfSIgLz4KKwkJCQkJCisJCQkJCTxwcm9wZXJ0eSBuYW1lPSJJbmNsdWRlQXNzZW1ibHlWZXJzaW9uIiB2YWx1ZT0iVHJ1ZSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IkNvcHlyaWdodFRleHQiIHZhbHVlPSJDb3B5cmlnaHQgMjAwNS0yMDA3IC0gS3VubGUgT2R1dG9sYSIgLz4KKwkJCQkJPHByb3BlcnR5IG5hbWU9IkNvcHlyaWdodEhyZWYiIHZhbHVlPSJodHRwOi8vd3d3LmFudGxyLm9yZyIgLz4KKwkJCQk8L2RvY3VtZW50ZXI+CisJCQk8L2RvY3VtZW50ZXJzPgorCQk8L25kb2M+CisJPC90YXJnZXQ+CisKKzwhLS0JCQorCQlkZXNjcmlwdGlvbjogCisJCQlDb3BpZXMgYWxsIGZpbGVzIHRvIGJlIGRvY3VtZW50ZWQgdG8gYSBzaW5nbGUgbG9jYXRpb24gdG8gc3BlZWQgdXAgdGhlIGRvY3VtZW50YXRpb24gcHJvY2Vzcy4KKy0tPgkKKwk8dGFyZ2V0IG5hbWU9ImNvcHlGaWxlc1RvRG9jdW1lbnQiPgorCQk8Y29weSB0b2Rpcj0iJHt0ZW1wQmluLmRpcn0iIGZsYXR0ZW49InRydWUiPgorCQkJPGZpbGVzZXQgYmFzZWRpcj0iYnVpbGQvJHt0YXJnZXQuY2xyfSI+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlJ1bnRpbWUuZGxsIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlJ1bnRpbWUueG1sIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlV0aWxpdHkuZGxsIi8+CisJCQkJPGluY2x1ZGUgbmFtZT0iQW50bHIzLlV0aWxpdHkueG1sIi8+CisJCQk8L2ZpbGVzZXQ+CisJCTwvY29weT4KKwk8L3RhcmdldD4KKwkJCis8IS0tCQkKKwkJZGVzY3JpcHRpb246IAorCQkJIENsZWFucyB1cCBwcmlvciB0byBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24uCistLT4JCisJPHRhcmdldCBuYW1lPSJjbGVhbi5kb2NzIj4KKwkJPGRlbGV0ZT4KKwkJCTxmaWxlc2V0PgorPCEtLQorCQkJCTxpbmNsdWRlIG5hbWU9IiR7ZG9jLmRpcn0vKioiLz4KKy0tPgkJCQkKKwkJCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmNobSIvPgorCQkJPC9maWxlc2V0PgorCQk8L2RlbGV0ZT4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9hbnRscjMucnVudGltZS5uZXQuY29tbW9uLmluYyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvYW50bHIzLnJ1bnRpbWUubmV0LmNvbW1vbi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MThhYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvYW50bHIzLnJ1bnRpbWUubmV0LmNvbW1vbi5pbmMKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJDb21tb24gQnVpbGQgUHJvcGVydGllcyI+CisKKwk8IS0tIENvbW1vbiBwcm9wZXJ0aWVzIHRoYXQgYWxsb3cgb3ZlcnJpZGVzIC0tPgorCisJPHByb3BlcnR5IG5hbWU9InJvb3RidWlsZC5kaXIiIAkJdmFsdWU9IiR7ZGlyZWN0b3J5OjpnZXQtY3VycmVudC1kaXJlY3RvcnkoKX0iIC8+CisJCQorCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kZXN0LmRpciIgCXZhbHVlPSIke3Jvb3RidWlsZC5kaXJ9L2J1aWxkLyR7ZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpfSIgLz4KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQud29ya2luZy5kaXIiIAl2YWx1ZT0iJHtyb290YnVpbGQuZGlyfS9iaW4iIC8+CisKKwk8cHJvcGVydHkgbmFtZT0ic3Ryb25nX25hbWUiCQl2YWx1ZT0iTkFOVF9TVFJPTkdOQU1FIgl1bmxlc3M9IiR7cHJvcGVydHk6OmV4aXN0cygnc3Ryb25nX25hbWUnKX0iIC8+CisJPHByb3BlcnR5IG5hbWU9ImRlYnVnIgkJCQl2YWx1ZT0iZmFsc2UiCQkJdW5sZXNzPSIke3Byb3BlcnR5OjpleGlzdHMoJ2RlYnVnJyl9IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJvcHRpbWl6ZSIJCQl2YWx1ZT0idHJ1ZSIJCQl1bmxlc3M9IiR7cHJvcGVydHk6OmV4aXN0cygnb3B0aW1pemUnKX0iIC8+CisJPHByb3BlcnR5IG5hbWU9ImRvYy5kaXIiCQkJdmFsdWU9IiR7YmFzZS5kaXJ9L2RvY3MiIC8+CisJPHByb3BlcnR5IG5hbWU9Im51bml0LmZvcm1hdHRlciIJdmFsdWU9IlBsYWluIgkJCXVubGVzcz0iJHtwcm9wZXJ0eTo6ZXhpc3RzKCdudW5pdC5mb3JtYXR0ZXInKX0iIC8+CisJPHByb3BlcnR5IG5hbWU9Im9zIiAJCQkJdmFsdWU9IiR7b3BlcmF0aW5nLXN5c3RlbTo6dG8tc3RyaW5nKGVudmlyb25tZW50OjpnZXQtb3BlcmF0aW5nLXN5c3RlbSgpKX0iIC8+CisJPHByb3BlcnR5IG5hbWU9ImlzV2luZG93cyIgCQkJdmFsdWU9IiR7c3RyaW5nOjpzdGFydHMtd2l0aChvcywgJ01pY3Jvc29mdCBXaW5kb3dzJyl9IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJpc01vbm8iIAkJCXZhbHVlPSIke3N0cmluZzo6c3RhcnRzLXdpdGgoZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpLCdtb25vJyl9IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQuY2xyIiAJCXZhbHVlPSIke2ZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKX0iIC8+CisJCisJPGlmIHRlc3Q9IiR7ZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpPT0nbmV0Y2YtMS4wJ30iPgorCSAgICA8ZmFpbCBtZXNzYWdlPSIuTkVULUNGIGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgdGhlIC5ORVQgRnJhbWV3b3JrIG9yIE1vbm8uIiAvPgorCTwvaWY+CisgICAgCisJPGlmIHRlc3Q9IiR7ZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpPT0nbmV0LTEuMScgb3IgZnJhbWV3b3JrOjpnZXQtdGFyZ2V0LWZyYW1ld29yaygpPT0nbW9uby0xLjAnfSI+CisJICAgIDxwcm9wZXJ0eSBuYW1lPSJkb3RuZXRfZGVmaW5lIiAgdmFsdWU9IkRPVE5FVDEiIC8+CisJPC9pZj4KKwk8aWYgdGVzdD0iJHtub3QgKGZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKT09J25ldC0xLjEnKSBhbmQgbm90IChmcmFtZXdvcms6OmdldC10YXJnZXQtZnJhbWV3b3JrKCk9PSdtb25vLTEuMCcpfSI+CisJICAgIDxwcm9wZXJ0eSBuYW1lPSJkb3RuZXRfZGVmaW5lIiAgdmFsdWU9IkRPVE5FVDIiIC8+CisJPC9pZj4KKworCisJPCEtLSBmaW5kIG91dCB3aGVyZSBudW5pdC5mcmFtZXdvcmsuZGxsIGlzIC0tPgorCisJPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiCisJCXZhbHVlPSIke3BhdGg6OmNvbWJpbmUobmFudDo6Z2V0LWJhc2UtZGlyZWN0b3J5KCksICdsaWInKX0iCisJCWR5bmFtaWM9InRydWUiIC8+CisJCQorCTxwcm9wZXJ0eSBuYW1lPSJsaWIuZmFtaWx5LmRpciIKKwkJdmFsdWU9IiR7cGF0aDo6Y29tYmluZShsaWIuZGlyLGZyYW1ld29yazo6Z2V0LWZhbWlseShmcmFtZXdvcms6OmdldC10YXJnZXQtZnJhbWV3b3JrKCkpKX0iCisJCWR5bmFtaWM9InRydWUiIC8+CisJCisJPCEtLSBmb3IgbmFudCAwLjg1IHJjMiBvciBoaWdoZXIgLS0+CisJCisJPHByb3BlcnR5IG5hbWU9ImxpYi5mcmFtZXdvcmsuZGlyIgorCQl2YWx1ZT0iJHtwYXRoOjpjb21iaW5lKGxpYi5mYW1pbHkuZGlyLCB2ZXJzaW9uOjp0by1zdHJpbmcoZnJhbWV3b3JrOjpnZXQtdmVyc2lvbihmcmFtZXdvcms6OmdldC10YXJnZXQtZnJhbWV3b3JrKCkpKSl9IgorCQlkeW5hbWljPSJ0cnVlIiAvPgorCisgICAgPCEtLSBVbmNvbW1lbnQgdGhpcyBibG9jayBmb3IgbmFudCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJPHByb3BlcnR5IG5hbWU9ImxpYi5mcmFtZXdvcmsuZGlyIgorCQl2YWx1ZT0iJHtwYXRoOjpjb21iaW5lKGxpYi5mYW1pbHkuZGlyLCBmcmFtZXdvcms6OmdldC12ZXJzaW9uKGZyYW1ld29yazo6Z2V0LXRhcmdldC1mcmFtZXdvcmsoKSkpfSIKKwkJZHluYW1pYz0idHJ1ZSIgLz4KKyAgICAtLT4KKwkJCisJPHByb3BlcnR5IG5hbWU9Im51bml0LmZyYW1ld29yay5kbGwiCisJCQl2YWx1ZT0iJHtwYXRoOjpjb21iaW5lKGxpYi5mcmFtZXdvcmsuZGlyLCAnbnVuaXQuZnJhbWV3b3JrLmRsbCcpfSIgLz4KKworCTxwcm9wZXJ0eSBuYW1lPSJuYW50LnRhc2tzLm51bml0MiIKKwkJCXZhbHVlPSJGYWxzZSIKKwkJCXVubGVzcz0iJHtwcm9wZXJ0eTo6ZXhpc3RzKCduYW50LnRhc2tzLm51bml0MicpfSIgLz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9kaXN0L0RPVC1ORVQtcnVudGltZS0zLjEuMy56aXAgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAyL2Rpc3QvRE9ULU5FVC1ydW50aW1lLTMuMS4zLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDA5OTFjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9kaXN0L0RPVC1ORVQtcnVudGltZS0zLjEuMy56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMi9kb3h5ZmlsZSBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvZG94eWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2YTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDIvZG94eWZpbGUKQEAgLTAsMCArMSwyNjQgQEAKKyMgRG94eWZpbGUgMS41LjIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiQU5UTFIgQVBJIgorUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IDMuMworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGFwaQorQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IFlFUworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gL0FwcGxpY2F0aW9ucy8KK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSAKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KK0RFVEFJTFNfQVRfVE9QICAgICAgICAgPSBOTworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCitUQUJfU0laRSAgICAgICAgICAgICAgID0gOAorQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gWUVTCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBOTworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IE5PCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gTk8KK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworU0hPV19ESVJFQ1RPUklFUyAgICAgICA9IE5PCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSU5QVVQgICAgICAgICAgICAgICAgICA9IC9Vc2Vycy9wYXJydC9hbnRsci9jb2RlL2FudGxyL21haW4vcnVudGltZS9DU2hhcnAvU291cmNlcworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmN4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouYysrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouamF2YSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5paSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5peHggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaXBwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmkrKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pbmwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oeHggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaHBwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmgrKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pZGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoub2RsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnBocCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5waHAzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmluYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5tIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm1tIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmRveCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5weQorUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworRVhDTFVERSAgICAgICAgICAgICAgICA9IAorRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gCitFWENMVURFX1NZTUJPTFMgICAgICAgID0gamF2YTo6dXRpbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YTo6aW8KK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8KK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gTk8KK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IC4KK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorSFRNTF9GT09URVIgICAgICAgICAgICA9IAorSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCitISENfTE9DQVRJT04gICAgICAgICAgID0gCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorWE1MX1NDSEVNQSAgICAgICAgICAgICA9IAorWE1MX0RURCAgICAgICAgICAgICAgICA9IAorWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBOTworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IE5PCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCitQUkVERUZJTkVEICAgICAgICAgICAgID0gCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gTk8KK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSAvQXBwbGljYXRpb25zL0RveHlnZW4uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy8KK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBZRVMKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworRE9UX1BBVEggICAgICAgICAgICAgICA9IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzLworRE9URklMRV9ESVJTICAgICAgICAgICA9IAorRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byB0aGUgc2VhcmNoIGVuZ2luZSAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU0VBUkNIRU5HSU5FICAgICAgICAgICA9IE5PCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvQW50bHIzLlJ1bnRpbWUuRGVidWcuY3Nwcm9qIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0FudGxyMy5SdW50aW1lLkRlYnVnLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ExOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0FudGxyMy5SdW50aW1lLkRlYnVnLmNzcHJvagpAQCAtMCwwICsxLDg0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjMwNzI5PC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns1RUUyN0E5MC1CMDIzLTQyQzktQUFGMS01MkIwNDI0QzVEMEJ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5BbnRsci5SdW50aW1lLkRlYnVnPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+QW50bHIzLlJ1bnRpbWUuRGVidWc8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52Mi4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8U2NjUHJvamVjdE5hbWU+UGVyZm9yY2UgUHJvamVjdDwvU2NjUHJvamVjdE5hbWU+CisgICAgPFNjY0xvY2FsUGF0aD4uLlwuLlwuLlwuLlwuLlwuLjwvU2NjTG9jYWxQYXRoPgorICAgIDxTY2NBdXhQYXRoPgorICAgIDwvU2NjQXV4UGF0aD4KKyAgICA8U2NjUHJvdmlkZXI+TVNTQ0NJOlBlcmZvcmNlIFNDTTwvU2NjUHJvdmlkZXI+CisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+CisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5cLi5cLi5cLi5cLi5cLi5ca2V5c1xhbnRsclxLZXkuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPgorICAgIDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQmxhbmtEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVidWdFdmVudEh1Yi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVidWdFdmVudFJlcGVhdGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlYnVnRXZlbnRTb2NrZXRQcm94eS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWJ1Z1BhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWJ1Z1Rva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRlYnVnVHJlZUFkYXB0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRGVidWdUcmVlTm9kZVN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWJ1Z1RyZWVQYXJzZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSmF2YUV4dGVuc2lvbnNcRXhjZXB0aW9uRXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNjXERvdWJsZUtleU1hcGAzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc2NcU3RhdHMuY3MiIC8+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cLi5ca2V5c1xhbnRsclxLZXkuc25rIj4KKyAgICAgIDxMaW5rPktleS5zbms8L0xpbms+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9IlBhcnNlckRlYnVnZ2VyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhcnNlVHJlZUJ1aWxkZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZmlsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYWNlRGVidWdFdmVudExpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYWNlci5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cQW50bHIzLlJ1bnRpbWVcQW50bHIzLlJ1bnRpbWUuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns4RkRDMEE4Ny05MDA1LTRENUEtQUI3NS1FNTVDRUI1NzU1NTl9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+QW50bHIzLlJ1bnRpbWU8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvQW50bHIzLlJ1bnRpbWUuRGVidWcuY3Nwcm9qLnZzcHNjYyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9BbnRscjMuUnVudGltZS5EZWJ1Zy5jc3Byb2oudnNwc2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDMyODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvQW50bHIzLlJ1bnRpbWUuRGVidWcuY3Nwcm9qLnZzcHNjYwpAQCAtMCwwICsxLDEwIEBACivvu78iIgoreworIkZJTEVfVkVSU0lPTiIgPSAiOTIzNyIKKyJFTkxJU1RNRU5UX0NIT0lDRSIgPSAiTkVWRVIiCisiUFJPSkVDVF9GSUxFX1JFTEFUSVZFX1BBVEgiID0gIiIKKyJOVU1CRVJfT0ZfRVhDTFVERURfRklMRVMiID0gIjAiCisiT1JJR0lOQUxfUFJPSkVDVF9GSUxFX1BBVEgiID0gIiIKKyJOVU1CRVJfT0ZfTkVTVEVEX1BST0pFQ1RTIiA9ICIwIgorIlNPVVJDRV9DT05UUk9MX1NFVFRJTkdTX1BST1ZJREVSIiA9ICJQUk9WSURFUiIKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9CbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9CbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQ1NGZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0JsYW5rRGVidWdFdmVudExpc3RlbmVyLmNzCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnCit7CisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGJsYW5rIGxpc3RlbmVyIHRoYXQgZG9lcyBub3RoaW5nOyB1c2VmdWwgZm9yIHJlYWwgY2xhc3NlcyBzbworICAgICAqICB0aGV5IGRvbid0IGhhdmUgdG8gaGF2ZSBsb3RzIG9mIGJsYW5rIG1ldGhvZHMgYW5kIGFyZSBsZXNzCisgICAgICogIHNlbnNpdGl2ZSB0byB1cGRhdGVzIHRvIGRlYnVnIGludGVyZmFjZS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lciA6IElEZWJ1Z0V2ZW50TGlzdGVuZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBpbnQgUnVsZUxldmVsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyUnVsZSggc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisgICAgICAgICAgICAgICAgQ29tbWVuY2UoKTsKKyAgICAgICAgICAgIFJ1bGVMZXZlbCsrOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFJ1bGUoIHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJ1bGVMZXZlbC0tOworICAgICAgICAgICAgaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisgICAgICAgICAgICAgICAgVGVybWluYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlckFsdCggaW50IGFsdCApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyU3ViUnVsZSggaW50IGRlY2lzaW9uTnVtYmVyICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdFN1YlJ1bGUoIGludCBkZWNpc2lvbk51bWJlciApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyRGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyLCBib29sIGNvdWxkQmFja3RyYWNrKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFeGl0RGVjaXNpb24oIGludCBkZWNpc2lvbk51bWJlciApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvY2F0aW9uKCBpbnQgbGluZSwgaW50IHBvcyApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVUb2tlbiggSVRva2VuIHRva2VuICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKCBJVG9rZW4gdG9rZW4gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVCggaW50IGksIElUb2tlbiB0ICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWFyayggaW50IGkgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soIGludCBsZXZlbCApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVuZEJhY2t0cmFjayggaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiggUmVjb2duaXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlZ2luUmVzeW5jKCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kUmVzeW5jKCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2VtYW50aWNQcmVkaWNhdGUoIGJvb2wgcmVzdWx0LCBzdHJpbmcgcHJlZGljYXRlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29tbWVuY2UoKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUZXJtaW5hdGUoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyZWUgcGFyc2luZyBzdHVmZgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZU5vZGUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTFQoIGludCBpLCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQVNUIFN0dWZmCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBOaWxOb2RlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVycm9yTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDcmVhdGVOb2RlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENyZWF0ZU5vZGUoIG9iamVjdCBub2RlLCBJVG9rZW4gdG9rZW4gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBCZWNvbWVSb290KCBvYmplY3QgbmV3Um9vdCwgb2JqZWN0IG9sZFJvb3QgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRDaGlsZCggb2JqZWN0IHJvb3QsIG9iamVjdCBjaGlsZCApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRva2VuQm91bmRhcmllcyggb2JqZWN0IHQsIGludCB0b2tlblN0YXJ0SW5kZXgsIGludCB0b2tlblN0b3BJbmRleCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50SHViLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnRXZlbnRIdWIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNjc5OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50SHViLmNzCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEJyb2FkY2FzdCBkZWJ1ZyBldmVudHMgdG8gbXVsdGlwbGUgbGlzdGVuZXJzLiAgTGV0cyB5b3UgZGVidWcgYW5kIHN0aWxsCisgICAgICogIHVzZSB0aGUgZXZlbnQgbWVjaGFuaXNtIHRvIGJ1aWxkIHBhcnNlIHRyZWVzIGV0Yy4uLiAgTm90IHRocmVhZC1zYWZlLgorICAgICAqICBEb24ndCBhZGQgZXZlbnRzIGluIG9uZSB0aHJlYWQgd2hpbGUgcGFyc2VyIGZpcmVzIGV2ZW50cyBpbiBhbm90aGVyLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHNlZWFsc28gY3JlZj0iRGVidWdFdmVudFJlcGVhdGVyIi8+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERlYnVnRXZlbnRIdWIgOiBJRGVidWdFdmVudExpc3RlbmVyCisgICAgeworICAgICAgICBMaXN0PElEZWJ1Z0V2ZW50TGlzdGVuZXI+IF9saXN0ZW5lcnMgPSBuZXcgTGlzdDxJRGVidWdFdmVudExpc3RlbmVyPigpOworCisgICAgICAgIHB1YmxpYyBEZWJ1Z0V2ZW50SHViKCBwYXJhbXMgSURlYnVnRXZlbnRMaXN0ZW5lcltdIGxpc3RlbmVycyApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lcnMgPSBuZXcgTGlzdDxJRGVidWdFdmVudExpc3RlbmVyPiggbGlzdGVuZXJzICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBZGQgYW5vdGhlciBsaXN0ZW5lciB0byBicm9hZGNhc3QgZXZlbnRzIHRvby4gIE5vdCB0aHJlYWQtc2FmZS4KKyAgICAgICAgICogIERvbid0IGFkZCBldmVudHMgaW4gb25lIHRocmVhZCB3aGlsZSBwYXJzZXIgZmlyZXMgZXZlbnRzIGluIGFub3RoZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZExpc3RlbmVyKCBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVycy5BZGQoIGxpc3RlbmVyICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUbyBhdm9pZCBhIG1lc3MgbGlrZSB0aGlzOgorICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXJSdWxlKGZpbmFsIFN0cmluZyBydWxlTmFtZSkgeworICAgICAgICAgICAgICAgIGJyb2FkY2FzdChuZXcgQ29kZSgpeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjKERlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikge2xpc3RlbmVyLmVudGVyUnVsZShydWxlTmFtZSk7fX0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEkgYW0gZHVwJ2luZyB0aGUgZm9yLWxvb3AgaW4gZWFjaC4gIFdoZXJlIGFyZSBKYXZhIGNsb3N1cmVzIT8gYmxlY2ghCisgICAgICAgICAqLworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW50ZXJSdWxlKCBzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVudGVyUnVsZSggZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFeGl0UnVsZSggc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FeGl0UnVsZSggZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlckFsdCggaW50IGFsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJBbHQoIGFsdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlclN1YlJ1bGUoIGludCBkZWNpc2lvbk51bWJlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJTdWJSdWxlKCBkZWNpc2lvbk51bWJlciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFeGl0U3ViUnVsZSggaW50IGRlY2lzaW9uTnVtYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FeGl0U3ViUnVsZSggZGVjaXNpb25OdW1iZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW50ZXJEZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIsIGJvb2wgY291bGRCYWNrdHJhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJEZWNpc2lvbiggZGVjaXNpb25OdW1iZXIsIGNvdWxkQmFja3RyYWNrICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4aXREZWNpc2lvbiggaW50IGRlY2lzaW9uTnVtYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FeGl0RGVjaXNpb24oIGRlY2lzaW9uTnVtYmVyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvY2F0aW9uKCBpbnQgbGluZSwgaW50IHBvcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTG9jYXRpb24oIGxpbmUsIHBvcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lVG9rZW4oIElUb2tlbiB0b2tlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZVRva2VuKCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lSGlkZGVuVG9rZW4oIElUb2tlbiB0b2tlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZUhpZGRlblRva2VuKCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVCggaW50IGluZGV4LCBJVG9rZW4gdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTFQoIGluZGV4LCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1hcmsoIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTWFyayggaW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlJld2luZCggaW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5SZXdpbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soIGludCBsZXZlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQmVnaW5CYWNrdHJhY2soIGxldmVsICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVuZEJhY2t0cmFjayggaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVuZEJhY2t0cmFjayggbGV2ZWwsIHN1Y2Nlc3NmdWwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVjb2duaXRpb25FeGNlcHRpb24oIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlJlY29nbml0aW9uRXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlZ2luUmVzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5CZWdpblJlc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRSZXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVuZFJlc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZW1hbnRpY1ByZWRpY2F0ZSggYm9vbCByZXN1bHQsIHN0cmluZyBwcmVkaWNhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlNlbWFudGljUHJlZGljYXRlKCByZXN1bHQsIHByZWRpY2F0ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb21tZW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29tbWVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVGVybWluYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5UZXJtaW5hdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgI3JlZ2lvbiBUcmVlIHBhcnNpbmcgc3R1ZmYKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVOb2RlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZU5vZGUoIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTFQoIGludCBpbmRleCwgb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkxUKCBpbmRleCwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBBU1QgU3R1ZmYKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE5pbE5vZGUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5OaWxOb2RlKCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVycm9yTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVycm9yTm9kZSggdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDcmVhdGVOb2RlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9saXN0ZW5lcnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IF9saXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ3JlYXRlTm9kZSggdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDcmVhdGVOb2RlKCBvYmplY3Qgbm9kZSwgSVRva2VuIHRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX2xpc3RlbmVycy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gX2xpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5DcmVhdGVOb2RlKCBub2RlLCB0b2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBCZWNvbWVSb290KCBvYmplY3QgbmV3Um9vdCwgb2JqZWN0IG9sZFJvb3QgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkJlY29tZVJvb3QoIG5ld1Jvb3QsIG9sZFJvb3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQWRkQ2hpbGQoIG9iamVjdCByb290LCBvYmplY3QgY2hpbGQgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkFkZENoaWxkKCByb290LCBjaGlsZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMoIG9iamVjdCB0LCBpbnQgdG9rZW5TdGFydEluZGV4LCBpbnQgdG9rZW5TdG9wSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBfbGlzdGVuZXJzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBfbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLlNldFRva2VuQm91bmRhcmllcyggdCwgdG9rZW5TdGFydEluZGV4LCB0b2tlblN0b3BJbmRleCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50TGlzdGVuZXJDb25zdGFudHMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzI0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLmNzCkBAIC0wLDAgKzEsNDYgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcKK3sKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzCisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+TW92ZWQgdG8gdmVyc2lvbiAyIGZvciB2My4xOiBhZGRlZCBncmFtbWFyIG5hbWUgdG8gZW50ZXIvZXhpdCBSdWxlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIFByb3RvY29sVmVyc2lvbiA9ICIyIjsKKworICAgICAgICAvKiogPHN1bW1hcnk+U2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRydWU8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVHJ1ZSA9IDE7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRmFsc2UgPSAwOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnRXZlbnRSZXBlYXRlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50UmVwZWF0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxYjY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z0V2ZW50UmVwZWF0ZXIuY3MKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcKK3sKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBzaW1wbGUgZXZlbnQgcmVwZWF0ZXIgKHByb3h5KSB0aGF0IGRlbGVnYXRlcyBhbGwgZnVuY3Rpb25hbGl0eSB0byB0aGUKKyAgICAgKiAgbGlzdGVuZXIgc2VudCBpbnRvIHRoZSBjdG9yLiAgVXNlZnVsIGlmIHlvdSB3YW50IHRvIGxpc3RlbiBpbiBvbiBhIGZldworICAgICAqICBkZWJ1ZyBldmVudHMgdy9vIGludGVycnVwdGluZyB0aGUgZGVidWdnZXIuICBKdXN0IHN1YmNsYXNzIHRoZSByZXBlYXRlcgorICAgICAqICBhbmQgb3ZlcnJpZGUgdGhlIG1ldGhvZHMgeW91IHdhbnQgdG8gbGlzdGVuIGluIG9uLiAgUmVtZW1iZXIgdG8gY2FsbAorICAgICAqICB0aGUgbWV0aG9kIGluIHRoaXMgY2xhc3Mgc28gdGhlIGV2ZW50IHdpbGwgY29udGludWUgb24gdG8gdGhlIG9yaWdpbmFsCisgICAgICogIHJlY2lwaWVudC4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxzZWVhbHNvIGNyZWY9IkRlYnVnRXZlbnRIdWIiLz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRGVidWdFdmVudFJlcGVhdGVyIDogSURlYnVnRXZlbnRMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBfbGlzdGVuZXI7CisKKyAgICAgICAgcHVibGljIERlYnVnRXZlbnRSZXBlYXRlciggSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlclJ1bGUoIHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5FbnRlclJ1bGUoIGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4aXRSdWxlKCBzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXhpdFJ1bGUoIGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyQWx0KCBpbnQgYWx0ICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkVudGVyQWx0KCBhbHQgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyU3ViUnVsZSggaW50IGRlY2lzaW9uTnVtYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkVudGVyU3ViUnVsZSggZGVjaXNpb25OdW1iZXIgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4aXRTdWJSdWxlKCBpbnQgZGVjaXNpb25OdW1iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXhpdFN1YlJ1bGUoIGRlY2lzaW9uTnVtYmVyICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbnRlckRlY2lzaW9uKGludCBkZWNpc2lvbk51bWJlciwgYm9vbCBjb3VsZEJhY2t0cmFjaykKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkVudGVyRGVjaXNpb24oIGRlY2lzaW9uTnVtYmVyLCBjb3VsZEJhY2t0cmFjayApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXhpdERlY2lzaW9uKCBpbnQgZGVjaXNpb25OdW1iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuRXhpdERlY2lzaW9uKCBkZWNpc2lvbk51bWJlciApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTG9jYXRpb24oIGludCBsaW5lLCBpbnQgcG9zICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkxvY2F0aW9uKCBsaW5lLCBwb3MgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVUb2tlbiggSVRva2VuIHRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNvbnN1bWVUb2tlbiggdG9rZW4gKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWVIaWRkZW5Ub2tlbiggSVRva2VuIHRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNvbnN1bWVIaWRkZW5Ub2tlbiggdG9rZW4gKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExUKCBpbnQgaSwgSVRva2VuIHQgKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuTFQoIGksIHQgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIE1hcmsoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLk1hcmsoIGkgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuUmV3aW5kKCBpICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuUmV3aW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBCZWdpbkJhY2t0cmFjayggaW50IGxldmVsICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkJlZ2luQmFja3RyYWNrKCBsZXZlbCApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kQmFja3RyYWNrKCBpbnQgbGV2ZWwsIGJvb2wgc3VjY2Vzc2Z1bCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5FbmRCYWNrdHJhY2soIGxldmVsLCBzdWNjZXNzZnVsICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiggUmVjb2duaXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggZSApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5SZXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuQmVnaW5SZXN5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVuZFJlc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5FbmRSZXN5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNlbWFudGljUHJlZGljYXRlKCBib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5TZW1hbnRpY1ByZWRpY2F0ZSggcmVzdWx0LCBwcmVkaWNhdGUgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbW1lbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNvbW1lbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUZXJtaW5hdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuVGVybWluYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyZWUgcGFyc2luZyBzdHVmZgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZU5vZGUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNvbnN1bWVOb2RlKCB0ICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMVCggaW50IGksIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkxUKCBpLCB0ICk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICAjcmVnaW9uIEFTVCBTdHVmZgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTmlsTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuTmlsTm9kZSggdCApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRXJyb3JOb2RlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5FcnJvck5vZGUoIHQgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENyZWF0ZU5vZGUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgX2xpc3RlbmVyLkNyZWF0ZU5vZGUoIHQgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENyZWF0ZU5vZGUoIG9iamVjdCBub2RlLCBJVG9rZW4gdG9rZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBfbGlzdGVuZXIuQ3JlYXRlTm9kZSggbm9kZSwgdG9rZW4gKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEJlY29tZVJvb3QoIG9iamVjdCBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5CZWNvbWVSb290KCBuZXdSb290LCBvbGRSb290ICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRDaGlsZCggb2JqZWN0IHJvb3QsIG9iamVjdCBjaGlsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5BZGRDaGlsZCggcm9vdCwgY2hpbGQgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRva2VuQm91bmRhcmllcyggb2JqZWN0IHQsIGludCB0b2tlblN0YXJ0SW5kZXgsIGludCB0b2tlblN0b3BJbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9saXN0ZW5lci5TZXRUb2tlbkJvdW5kYXJpZXMoIHQsIHRva2VuU3RhcnRJbmRleCwgdG9rZW5TdG9wSW5kZXggKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvRGVidWdFdmVudFNvY2tldFByb3h5LmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnRXZlbnRTb2NrZXRQcm94eS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIwZmQyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnRXZlbnRTb2NrZXRQcm94eS5jcwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zOworCisgICAgdXNpbmcgSU9FeGNlcHRpb24gPSBTeXN0ZW0uSU8uSU9FeGNlcHRpb247CisgICAgdXNpbmcgSVRyZWVBZGFwdG9yID0gQW50bHIuUnVudGltZS5UcmVlLklUcmVlQWRhcHRvcjsKKyAgICB1c2luZyBTb2NrZXQgPSBTeXN0ZW0uTmV0LlNvY2tldHMuU29ja2V0OworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworICAgIHVzaW5nIFRjcExpc3RlbmVyID0gU3lzdGVtLk5ldC5Tb2NrZXRzLlRjcExpc3RlbmVyOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIHByb3h5IGRlYnVnIGV2ZW50IGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgZXZlbnRzIG92ZXIgYSBzb2NrZXQgdG8KKyAgICAgKiAgYSBkZWJ1Z2dlciAob3IgYW55IG90aGVyIGxpc3RlbmVyKSB1c2luZyBhIHNpbXBsZSB0ZXh0LWJhc2VkIHByb3RvY29sOworICAgICAqICBvbmUgZXZlbnQgcGVyIGxpbmUuICBBTlRMUldvcmtzIGxpc3RlbnMgb24gc2VydmVyIHNvY2tldCB3aXRoIGEKKyAgICAgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIGluc3RhbmNlLiAgVGhlc2UgdHdvIG9iamVjdHMgbXVzdCB0aGVyZWZvcmUKKyAgICAgKiAgYmUga2VwdCBpbiBzeW5jLiAgTmV3IGV2ZW50cyBtdXN0IGJlIGhhbmRsZWQgb24gYm90aCBzaWRlcyBvZiBzb2NrZXQuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRGVidWdFdmVudFNvY2tldFByb3h5IDogQmxhbmtEZWJ1Z0V2ZW50TGlzdGVuZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdERlYnVnZ2VyUG9ydCA9IDQ5MTAwOworICAgICAgICBwcm90ZWN0ZWQgaW50IHBvcnQgPSBEZWZhdWx0RGVidWdnZXJQb3J0OworICAgICAgICBwcm90ZWN0ZWQgVGNwTGlzdGVuZXIgc2VydmVyU29ja2V0OworICAgICAgICBwcm90ZWN0ZWQgU29ja2V0IHNvY2tldDsKKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBncmFtbWFyRmlsZU5hbWU7CisgICAgICAgIC8vcHJvdGVjdGVkIFByaW50V3JpdGVyIEBvdXQ7CisgICAgICAgIC8vcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIEBpbjsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hvIGFtIGkgZGVidWdnaW5nPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXI7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQWxtb3N0IGNlcnRhaW5seSB0aGUgcmVjb2duaXplciB3aWxsIGhhdmUgYWRhcHRvciBzZXQsIGJ1dAorICAgICAgICAgKiAgd2UgZG9uJ3Qga25vdyBob3cgdG8gY2FzdCBpdCAoUGFyc2VyIG9yIFRyZWVQYXJzZXIpIHRvIGdldAorICAgICAgICAgKiAgdGhlIGFkYXB0b3IgZmllbGQuICBNdXN0IGJlIHNldCB3aXRoIGEgY29uc3RydWN0b3IuIDooCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVBZGFwdG9yIGFkYXB0b3I7CisKKyAgICAgICAgcHVibGljIERlYnVnRXZlbnRTb2NrZXRQcm94eSggQmFzZVJlY29nbml6ZXIgcmVjb2duaXplciwgSVRyZWVBZGFwdG9yIGFkYXB0b3IgKSA6CisgICAgICAgICAgICB0aGlzKCByZWNvZ25pemVyLCBEZWZhdWx0RGVidWdnZXJQb3J0LCBhZGFwdG9yICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERlYnVnRXZlbnRTb2NrZXRQcm94eSggQmFzZVJlY29nbml6ZXIgcmVjb2duaXplciwgaW50IHBvcnQsIElUcmVlQWRhcHRvciBhZGFwdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5ncmFtbWFyRmlsZU5hbWUgPSByZWNvZ25pemVyLkdyYW1tYXJGaWxlTmFtZTsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlQWRhcHRvciBUcmVlQWRhcHRvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkYXB0b3IgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBIYW5kc2hha2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHNlcnZlclNvY2tldCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uTmV0LklQSG9zdEVudHJ5IGhvc3RJbmZvID0gU3lzdGVtLk5ldC5EbnMuR2V0SG9zdEVudHJ5KCAibG9jYWxob3N0IiApOworICAgICAgICAgICAgICAgIFN5c3RlbS5OZXQuSVBBZGRyZXNzIGlwQWRkcmVzcyA9IGhvc3RJbmZvLkFkZHJlc3NMaXN0WzBdOworICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBUY3BMaXN0ZW5lciggaXBBZGRyZXNzLCBwb3J0ICk7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gc2VydmVyU29ja2V0LkFjY2VwdFNvY2tldCgpOworICAgICAgICAgICAgICAgIHNvY2tldC5Ob0RlbGF5ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZyBlbmNvZGluZyA9IG5ldyBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBzb2NrZXQuU2VuZCggZW5jb2RpbmcuR2V0Qnl0ZXMoICJBTlRMUiAiICsgRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLlByb3RvY29sVmVyc2lvbiArICJcbiIgKSApOworICAgICAgICAgICAgICAgIHNvY2tldC5TZW5kKCBlbmNvZGluZy5HZXRCeXRlcyggImdyYW1tYXIgXCIiICsgZ3JhbW1hckZpbGVOYW1lICsgIlxuIiApICk7CisgICAgICAgICAgICAgICAgQWNrKCk7CisKKyAgICAgICAgICAgICAgICAvL3NlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoIHBvcnQgKTsKKyAgICAgICAgICAgICAgICAvL3NvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAvL3NvY2tldC5zZXRUY3BOb0RlbGF5KCB0cnVlICk7CisgICAgICAgICAgICAgICAgLy9PdXRwdXRTdHJlYW0gb3MgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgLy9PdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggb3MsICJVVEY4IiApOworICAgICAgICAgICAgICAgIC8vQG91dCA9IG5ldyBQcmludFdyaXRlciggbmV3IEJ1ZmZlcmVkV3JpdGVyKCBvc3cgKSApOworICAgICAgICAgICAgICAgIC8vSW5wdXRTdHJlYW0gQGlzID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgLy9JbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIEBpcywgIlVURjgiICk7CisgICAgICAgICAgICAgICAgLy9AaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoIGlzciApOworICAgICAgICAgICAgICAgIC8vQG91dC5wcmludGxuKCAiQU5UTFIgIiArIERlYnVnRXZlbnRMaXN0ZW5lckNvbnN0YW50cy5QUk9UT0NPTF9WRVJTSU9OICk7CisgICAgICAgICAgICAgICAgLy9Ab3V0LnByaW50bG4oICJncmFtbWFyIFwiIiArIGdyYW1tYXJGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIC8vQG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIC8vYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDb21tZW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGJvdGhlciBzZW5kaW5nIGV2ZW50OyBsaXN0ZW5lciB3aWxsIHRyaWdnZXIgdXBvbiBjb25uZWN0aW9uCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBUZXJtaW5hdGUoKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggInRlcm1pbmF0ZSIgKTsKKyAgICAgICAgICAgIC8vQG91dC5jbG9zZSgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc29ja2V0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGlvZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoIGlvZSwgQ29uc29sZS5FcnJvciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBBY2soKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAvL0Bpbi5yZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpb2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkV4dGVuc2lvbnMuUHJpbnRTdGFja1RyYWNlKCBpb2UsIENvbnNvbGUuRXJyb3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgVHJhbnNtaXQoIHN0cmluZyBAZXZlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBzb2NrZXQuU2VuZCggbmV3IFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZygpLkdldEJ5dGVzKCBAZXZlbnQgKyAiXG4iICkgKTsKKyAgICAgICAgICAgIC8vQG91dC5wcmludGxuKCBAZXZlbnQgKTsKKyAgICAgICAgICAgIC8vQG91dC5mbHVzaCgpOworICAgICAgICAgICAgQWNrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlclJ1bGUoIHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAiZW50ZXJSdWxlXHQiICsgZ3JhbW1hckZpbGVOYW1lICsgIlx0IiArIHJ1bGVOYW1lICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlckFsdCggaW50IGFsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAiZW50ZXJBbHRcdCIgKyBhbHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEV4aXRSdWxlKCBzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggImV4aXRSdWxlXHQiICsgZ3JhbW1hckZpbGVOYW1lICsgIlx0IiArIHJ1bGVOYW1lICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlclN1YlJ1bGUoIGludCBkZWNpc2lvbk51bWJlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAiZW50ZXJTdWJSdWxlXHQiICsgZGVjaXNpb25OdW1iZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEV4aXRTdWJSdWxlKCBpbnQgZGVjaXNpb25OdW1iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggImV4aXRTdWJSdWxlXHQiICsgZGVjaXNpb25OdW1iZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVudGVyRGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyLCBib29sIGNvdWxkQmFja3RyYWNrKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggImVudGVyRGVjaXNpb25cdCIgKyBkZWNpc2lvbk51bWJlciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRXhpdERlY2lzaW9uKCBpbnQgZGVjaXNpb25OdW1iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggImV4aXREZWNpc2lvblx0IiArIGRlY2lzaW9uTnVtYmVyICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDb25zdW1lVG9rZW4oIElUb2tlbiB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGJ1ZiA9IFNlcmlhbGl6ZVRva2VuKCB0ICk7CisgICAgICAgICAgICBUcmFuc21pdCggImNvbnN1bWVUb2tlblx0IiArIGJ1ZiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKCBJVG9rZW4gdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBidWYgPSBTZXJpYWxpemVUb2tlbiggdCApOworICAgICAgICAgICAgVHJhbnNtaXQoICJjb25zdW1lSGlkZGVuVG9rZW5cdCIgKyBidWYgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExUKCBpbnQgaSwgSVRva2VuIHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHQgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgVHJhbnNtaXQoICJMVFx0IiArIGkgKyAiXHQiICsgU2VyaWFsaXplVG9rZW4oIHQgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTWFyayggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggIm1hcmtcdCIgKyBpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXdpbmQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNtaXQoICJyZXdpbmRcdCIgKyBpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggInJld2luZCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJlZ2luQmFja3RyYWNrKCBpbnQgbGV2ZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggImJlZ2luQmFja3RyYWNrXHQiICsgbGV2ZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEJhY2t0cmFjayggaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwgKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFuc21pdCggImVuZEJhY2t0cmFja1x0IiArIGxldmVsICsgIlx0IiArICggc3VjY2Vzc2Z1bCA/IERlYnVnRXZlbnRMaXN0ZW5lckNvbnN0YW50cy5UcnVlIDogRGVidWdFdmVudExpc3RlbmVyQ29uc3RhbnRzLkZhbHNlICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExvY2F0aW9uKCBpbnQgbGluZSwgaW50IHBvcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAibG9jYXRpb25cdCIgKyBsaW5lICsgIlx0IiArIHBvcyApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVjb2duaXRpb25FeGNlcHRpb24oIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCA1MCApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggImV4Y2VwdGlvblx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggZS5HZXRUeXBlKCkuTmFtZSApOworICAgICAgICAgICAgLy8gZHVtcCBvbmx5IHRoZSBkYXRhIGNvbW1vbiB0byBhbGwgZXhjZXB0aW9ucyBmb3Igbm93CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiXHQiICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCBlLkluZGV4ICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiXHQiICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCBlLkxpbmUgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICJcdCIgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIGUuQ2hhclBvc2l0aW9uSW5MaW5lICk7CisgICAgICAgICAgICBUcmFuc21pdCggYnVmLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJlZ2luUmVzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNtaXQoICJiZWdpblJlc3luYyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZFJlc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAiZW5kUmVzeW5jIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VtYW50aWNQcmVkaWNhdGUoIGJvb2wgcmVzdWx0LCBzdHJpbmcgcHJlZGljYXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlciggNTAgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICJzZW1hbnRpY1ByZWRpY2F0ZVx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggcmVzdWx0ICk7CisgICAgICAgICAgICBTZXJpYWxpemVUZXh0KCBidWYsIHByZWRpY2F0ZSApOworICAgICAgICAgICAgVHJhbnNtaXQoIGJ1Zi5Ub1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIEFTVCBQYXJzaW5nIEV2ZW50cworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENvbnN1bWVOb2RlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIDUwICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiY29uc3VtZU5vZGUiICk7CisgICAgICAgICAgICBTZXJpYWxpemVOb2RlKCBidWYsIHQgKTsKKyAgICAgICAgICAgIFRyYW5zbWl0KCBidWYuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTFQoIGludCBpLCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQoIHQgKTsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KCB0ICk7CisgICAgICAgICAgICBpbnQgdHlwZSA9IGFkYXB0b3IuR2V0VHlwZSggdCApOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlciggNTAgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICJMTlx0IiApOyAvLyBsb29rYWhlYWQgbm9kZTsgZGlzdGluZ3Vpc2ggZnJvbSBMVCBpbiBwcm90b2NvbAorICAgICAgICAgICAgYnVmLkFwcGVuZCggaSApOworICAgICAgICAgICAgU2VyaWFsaXplTm9kZSggYnVmLCB0ICk7CisgICAgICAgICAgICBUcmFuc21pdCggYnVmLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplTm9kZSggU3RyaW5nQnVpbGRlciBidWYsIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggdCApOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQoIHQgKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKCB0ICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiXHQiICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCBJRCApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggIlx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggdHlwZSApOworICAgICAgICAgICAgSVRva2VuIHRva2VuID0gYWRhcHRvci5HZXRUb2tlbiggdCApOworICAgICAgICAgICAgaW50IGxpbmUgPSAtMTsKKyAgICAgICAgICAgIGludCBwb3MgPSAtMTsKKyAgICAgICAgICAgIGlmICggdG9rZW4gIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGluZSA9IHRva2VuLkxpbmU7CisgICAgICAgICAgICAgICAgcG9zID0gdG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLkFwcGVuZCggIlx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggbGluZSApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggIlx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggcG9zICk7CisgICAgICAgICAgICBpbnQgdG9rZW5JbmRleCA9IGFkYXB0b3IuR2V0VG9rZW5TdGFydEluZGV4KCB0ICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiXHQiICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCB0b2tlbkluZGV4ICk7CisgICAgICAgICAgICBTZXJpYWxpemVUZXh0KCBidWYsIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQVNUIEV2ZW50cworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE5pbE5vZGUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggdCApOworICAgICAgICAgICAgVHJhbnNtaXQoICJuaWxOb2RlXHQiICsgSUQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVycm9yTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKCB0ICk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IHQuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIDUwICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiZXJyb3JOb2RlXHQiICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCBJRCApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggIlx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggVG9rZW5UeXBlcy5JbnZhbGlkICk7CisgICAgICAgICAgICBTZXJpYWxpemVUZXh0KCBidWYsIHRleHQgKTsKKyAgICAgICAgICAgIFRyYW5zbWl0KCBidWYuVG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKCB0ICk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCggdCApOworICAgICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLkdldFR5cGUoIHQgKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIDUwICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAiY3JlYXRlTm9kZUZyb21Ub2tlbkVsZW1lbnRzXHQiICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCBJRCApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggIlx0IiApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggdHlwZSApOworICAgICAgICAgICAgU2VyaWFsaXplVGV4dCggYnVmLCB0ZXh0ICk7CisgICAgICAgICAgICBUcmFuc21pdCggYnVmLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGUoIG9iamVjdCBub2RlLCBJVG9rZW4gdG9rZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKCBub2RlICk7CisgICAgICAgICAgICBpbnQgdG9rZW5JbmRleCA9IHRva2VuLlRva2VuSW5kZXg7CisgICAgICAgICAgICBUcmFuc21pdCggImNyZWF0ZU5vZGVcdCIgKyBJRCArICJcdCIgKyB0b2tlbkluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWNvbWVSb290KCBvYmplY3QgbmV3Um9vdCwgb2JqZWN0IG9sZFJvb3QgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbmV3Um9vdElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggbmV3Um9vdCApOworICAgICAgICAgICAgaW50IG9sZFJvb3RJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQoIG9sZFJvb3QgKTsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAiYmVjb21lUm9vdFx0IiArIG5ld1Jvb3RJRCArICJcdCIgKyBvbGRSb290SUQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZENoaWxkKCBvYmplY3Qgcm9vdCwgb2JqZWN0IGNoaWxkICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJvb3RJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQoIHJvb3QgKTsKKyAgICAgICAgICAgIGludCBjaGlsZElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggY2hpbGQgKTsKKyAgICAgICAgICAgIFRyYW5zbWl0KCAiYWRkQ2hpbGRcdCIgKyByb290SUQgKyAiXHQiICsgY2hpbGRJRCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0VG9rZW5Cb3VuZGFyaWVzKCBvYmplY3QgdCwgaW50IHRva2VuU3RhcnRJbmRleCwgaW50IHRva2VuU3RvcEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggdCApOworICAgICAgICAgICAgVHJhbnNtaXQoICJzZXRUb2tlbkJvdW5kYXJpZXNcdCIgKyBJRCArICJcdCIgKyB0b2tlblN0YXJ0SW5kZXggKyAiXHQiICsgdG9rZW5TdG9wSW5kZXggKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gU3VwcG9ydAorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHN0cmluZyBTZXJpYWxpemVUb2tlbiggSVRva2VuIHQgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCA1MCApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggdC5Ub2tlbkluZGV4ICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAnXHQnICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCB0LlR5cGUgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICdcdCcgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHQuQ2hhbm5lbCApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggJ1x0JyApOworICAgICAgICAgICAgYnVmLkFwcGVuZCggdC5MaW5lICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCAnXHQnICk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCB0LkNoYXJQb3NpdGlvbkluTGluZSApOworICAgICAgICAgICAgU2VyaWFsaXplVGV4dCggYnVmLCB0LlRleHQgKTsKKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplVGV4dCggU3RyaW5nQnVpbGRlciBidWYsIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLkFwcGVuZCggIlx0XCIiICk7CisgICAgICAgICAgICBpZiAoIHRleHQgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZXNjYXBlIFxuIGFuZCBcciBhbGwgdGV4dCBmb3IgdG9rZW4gYXBwZWFycyB0byBleGlzdCBvbiBvbmUgbGluZQorICAgICAgICAgICAgLy8gdGhpcyBlc2NhcGUgaXMgc2xvdyBidXQgZWFzeSB0byB1bmRlcnN0YW5kCisgICAgICAgICAgICB0ZXh0ID0gRXNjYXBlTmV3bGluZXMoIHRleHQgKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHN0cmluZyBFc2NhcGVOZXdsaW5lcyggc3RyaW5nIHR4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHR4dCA9IHR4dC5SZXBsYWNlKCAiJSIsICIlMjUiICk7ICAgLy8gZXNjYXBlIGFsbCBlc2NhcGUgY2hhciA7KQorICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoICJcbiIsICIlMEEiICk7ICAvLyBlc2NhcGUgXG4KKyAgICAgICAgICAgIHR4dCA9IHR4dC5SZXBsYWNlKCAiXHIiLCAiJTBEIiApOyAgLy8gZXNjYXBlIFxyCisgICAgICAgICAgICByZXR1cm4gdHh0OworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z1BhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z1BhcnNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQ4ZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnUGFyc2VyLmNzCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnCit7CisgICAgdXNpbmcgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uczsKKworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKyAgICB1c2luZyBJT0V4Y2VwdGlvbiA9IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBjbGFzcyBEZWJ1Z1BhcnNlciA6IFBhcnNlcgorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldobyB0byBub3RpZnkgd2hlbiBldmVudHMgaW4gdGhlIHBhcnNlciBvY2N1ci48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IG51bGw7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gZml4ZWQgbG9va2FoZWFkIGFuZCBjeWNsaWMgREZBIGRlY2lzaW9ucworICAgICAgICAgKiAgd2hpbGUgcHJvZmlsaW5nLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2wgaXNDeWNsaWNEZWNpc2lvbiA9IGZhbHNlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIENyZWF0ZSBhIG5vcm1hbCBwYXJzZXIgZXhjZXB0IHdyYXAgdGhlIHRva2VuIHN0cmVhbSBpbiBhIGRlYnVnCisgICAgICAgICAqICBwcm94eSB0aGF0IGZpcmVzIGNvbnN1bWUgZXZlbnRzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERlYnVnUGFyc2VyKCBJVG9rZW5TdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUgKQorICAgICAgICAgICAgOiBiYXNlKCBpbnB1dCBpcyBEZWJ1Z1Rva2VuU3RyZWFtID8gaW5wdXQgOiBuZXcgRGVidWdUb2tlblN0cmVhbSggaW5wdXQsIGRiZyApLCBzdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldERlYnVnTGlzdGVuZXIoZGJnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWJ1Z1BhcnNlciggSVRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUgKQorICAgICAgICAgICAgOiBiYXNlKCBpbnB1dCBpcyBEZWJ1Z1Rva2VuU3RyZWFtID8gaW5wdXQgOiBuZXcgRGVidWdUb2tlblN0cmVhbSggaW5wdXQsIG51bGwgKSwgc3RhdGUgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVidWdQYXJzZXIoIElUb2tlblN0cmVhbSBpbnB1dCwgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgKQorICAgICAgICAgICAgOiB0aGlzKCBpbnB1dCBpcyBEZWJ1Z1Rva2VuU3RyZWFtID8gaW5wdXQgOiBuZXcgRGVidWdUb2tlblN0cmVhbSggaW5wdXQsIGRiZyApLCBkYmcsIG51bGwgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSURlYnVnRXZlbnRMaXN0ZW5lciBEZWJ1Z0xpc3RlbmVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkYmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBQcm92aWRlIGEgbmV3IGRlYnVnIGV2ZW50IGxpc3RlbmVyIGZvciB0aGlzIHBhcnNlci4gIE5vdGlmeSB0aGUKKyAgICAgICAgICogIGlucHV0IHN0cmVhbSB0b28gdGhhdCBpdCBzaG91bGQgc2VuZCBldmVudHMgdG8gdGhpcyBsaXN0ZW5lci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0RGVidWdMaXN0ZW5lcihJRGVidWdFdmVudExpc3RlbmVyIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBEZWJ1Z1Rva2VuU3RyZWFtIGRlYnVnVG9rZW5TdHJlYW0gPSBpbnB1dCBhcyBEZWJ1Z1Rva2VuU3RyZWFtOworICAgICAgICAgICAgaWYgKGRlYnVnVG9rZW5TdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZWJ1Z1Rva2VuU3RyZWFtLkRlYnVnTGlzdGVuZXIgPSB2YWx1ZTsKKworICAgICAgICAgICAgZGJnID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcG9ydEVycm9yKCBJT0V4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIGUgKTsKKyAgICAgICAgICAgIEV4Y2VwdGlvbkV4dGVuc2lvbnMuUHJpbnRTdGFja1RyYWNlKCBlLCBDb25zb2xlLkVycm9yICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWdpblJlc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRiZy5CZWdpblJlc3luYygpOworICAgICAgICAgICAgYmFzZS5CZWdpblJlc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kUmVzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgZGJnLkVuZFJlc3luYygpOworICAgICAgICAgICAgYmFzZS5FbmRSZXN5bmMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5CYWNrdHJhY2soIGludCBsZXZlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRiZy5CZWdpbkJhY2t0cmFjayggbGV2ZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5kQmFja3RyYWNrKCBpbnQgbGV2ZWwsIGJvb2wgc3VjY2Vzc2Z1bCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRiZy5FbmRCYWNrdHJhY2soIGxldmVsLCBzdWNjZXNzZnVsICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXBvcnRFcnJvciggUmVjb2duaXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuUmVwb3J0RXJyb3IoZSk7CisgICAgICAgICAgICBkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIGUgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2MTM3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnCit7CisKKyAgICBwdWJsaWMgY2xhc3MgRGVidWdUb2tlblN0cmVhbSA6IElUb2tlblN0cmVhbQorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnOworICAgICAgICBwdWJsaWMgSVRva2VuU3RyZWFtIGlucHV0OworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBpbml0aWFsU3RyZWFtU3RhdGUgPSB0cnVlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdE1hcmtlcjsKKworICAgICAgICBwdWJsaWMgRGVidWdUb2tlblN0cmVhbSggSVRva2VuU3RyZWFtIGlucHV0LCBJRGVidWdFdmVudExpc3RlbmVyIGRiZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICAgICAgICAgIERlYnVnTGlzdGVuZXIgPSBkYmc7CisgICAgICAgICAgICAvLyBmb3JjZSBUb2tlblN0cmVhbSB0byBnZXQgYXQgbGVhc3QgZmlyc3QgdmFsaWQgdG9rZW4KKyAgICAgICAgICAgIC8vIHNvIHdlIGtub3cgaWYgdGhlcmUgYXJlIGFueSBoaWRkZW4gdG9rZW5zIGZpcnN0IGluIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIGlucHV0LkxUKCAxICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFJhbmdlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5SYW5nZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgRGVidWdMaXN0ZW5lcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGJnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJnID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbml0aWFsU3RyZWFtU3RhdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnN1bWVJbml0aWFsSGlkZGVuVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgYSA9IGlucHV0LkluZGV4OworICAgICAgICAgICAgSVRva2VuIHQgPSBpbnB1dC5MVCggMSApOworICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgaW50IGIgPSBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIGRiZy5Db25zdW1lVG9rZW4oIHQgKTsKKyAgICAgICAgICAgIGlmICggYiA+IGEgKyAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGNvbnN1bWVkIG1vcmUgdGhhbiBvbmUgdG9rZW47IG11c3QgYmUgb2ZmIGNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBhICsgMTsgaSA8IGI7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYmcuQ29uc3VtZUhpZGRlblRva2VuKCBpbnB1dC5HZXQoIGkgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Db25zdW1lIGFsbCBpbml0aWFsIG9mZi1jaGFubmVsIHRva2Vuczwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBDb25zdW1lSW5pdGlhbEhpZGRlblRva2VucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmaXJzdE9uQ2hhbm5lbFRva2VuSW5kZXggPSBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGZpcnN0T25DaGFubmVsVG9rZW5JbmRleDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYmcuQ29uc3VtZUhpZGRlblRva2VuKCBpbnB1dC5HZXQoIGkgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5pdGlhbFN0cmVhbVN0YXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTFQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbml0aWFsU3RyZWFtU3RhdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnN1bWVJbml0aWFsSGlkZGVuVG9rZW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYmcuTFQoIGksIGlucHV0LkxUKCBpICkgKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5MVCggaSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaW5pdGlhbFN0cmVhbVN0YXRlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zdW1lSW5pdGlhbEhpZGRlblRva2VucygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGJnLkxUKCBpLCBpbnB1dC5MVCggaSApICk7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQuTEEoIGkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBHZXQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LkdldCggaSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1hcmsoKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0TWFya2VyID0gaW5wdXQuTWFyaygpOworICAgICAgICAgICAgZGJnLk1hcmsoIGxhc3RNYXJrZXIgKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0TWFya2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoIGludCBtYXJrZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBkYmcuUmV3aW5kKCBtYXJrZXIgKTsKKyAgICAgICAgICAgIGlucHV0LlJld2luZCggbWFya2VyICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRiZy5SZXdpbmQoKTsKKyAgICAgICAgICAgIGlucHV0LlJld2luZCggbGFzdE1hcmtlciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCBpbnQgbWFya2VyICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZWVrKCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgc2VlayBpbiBkYmcgaW50ZXJmYWNlCisgICAgICAgICAgICAvLyBkYi5zZWVrKGluZGV4KTsKKyAgICAgICAgICAgIGlucHV0LlNlZWsoIGluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU291cmNlIFRva2VuU291cmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5Ub2tlblNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblNvdXJjZS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBpbnQgc3RhcnQsIGludCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LlRvU3RyaW5nKCBzdGFydCwgc3RvcCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LlRvU3RyaW5nKCBzdGFydCwgc3RvcCApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZUFkYXB0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvRGVidWdUcmVlQWRhcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk5YjUzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZUFkYXB0b3IuY3MKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworICAgIHVzaW5nIElUcmVlQWRhcHRvciA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZUFkYXB0b3I7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgVHJlZUFkYXB0b3IgcHJveHkgdGhhdCBmaXJlcyBkZWJ1Z2dpbmcgZXZlbnRzIHRvIGEgRGVidWdFdmVudExpc3RlbmVyCisgICAgICogIGRlbGVnYXRlIGFuZCB1c2VzIHRoZSBUcmVlQWRhcHRvciBkZWxlZ2F0ZSB0byBkbyB0aGUgYWN0dWFsIHdvcmsuICBBbGwKKyAgICAgKiAgQVNUIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGJ5IHRoaXMgYWRhcHRvcjsgbm8gY29kZSBnZW4gY2hhbmdlcyBhcmUgbmVlZGVkCisgICAgICogIGluIGdlbmVyYXRlZCBydWxlcy4gIERlYnVnZ2luZyBldmVudHMgYXJlIHRyaWdnZXJlZCAqYWZ0ZXIqIGludm9raW5nCisgICAgICogIHRyZWUgYWRhcHRvciByb3V0aW5lcy4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPgorICAgICAqICBUcmVlcyBjcmVhdGVkIHdpdGggYWN0aW9ucyBpbiByZXdyaXRlIGFjdGlvbnMgbGlrZSAiLSZndDsgXihBREQge2Zvb30ge2Jhcn0pIgorICAgICAqICBjYW5ub3QgYmUgdHJhY2tlZCBhcyB0aGV5IG1pZ2h0IG5vdCB1c2UgdGhlIGFkYXB0b3IgdG8gY3JlYXRlIGZvbywgYmFyLgorICAgICAqICBUaGUgZGVidWcgbGlzdGVuZXIgaGFzIHRvIGRlYWwgd2l0aCB0cmVlIG5vZGUgSURzIGZvciB3aGljaCBpdCBkaWQKKyAgICAgKiAgbm90IHNlZSBhIGNyZWF0ZU5vZGUgZXZlbnQuICBBIHNpbmdsZSAmbHQ7dW5rbm93biZndDsgbm9kZSBpcyBzdWZmaWNpZW50IGV2ZW4KKyAgICAgKiAgaWYgaXQgcmVwcmVzZW50cyBhIHdob2xlIHRyZWUuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgRGVidWdUcmVlQWRhcHRvciA6IElUcmVlQWRhcHRvcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnOworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVBZGFwdG9yIGFkYXB0b3I7CisKKyAgICAgICAgcHVibGljIERlYnVnVHJlZUFkYXB0b3IoIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBJVHJlZUFkYXB0b3IgYWRhcHRvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGJnID0gZGJnOworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoIElUb2tlbiBwYXlsb2FkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwYXlsb2FkLlRva2VuSW5kZXggPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSB0b2tlbiBjb25qdXJlZCB1cCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlKCBwYXlsb2FkLlR5cGUsIHBheWxvYWQuVGV4dCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBhZGFwdG9yLkNyZWF0ZSggcGF5bG9hZCApOworICAgICAgICAgICAgZGJnLkNyZWF0ZU5vZGUoIG5vZGUsIHBheWxvYWQgKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEVycm9yTm9kZSggSVRva2VuU3RyZWFtIGlucHV0LCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBhZGFwdG9yLkVycm9yTm9kZSggaW5wdXQsIHN0YXJ0LCBzdG9wLCBlICk7CisgICAgICAgICAgICBpZiAoIG5vZGUgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJnLkVycm9yTm9kZSggbm9kZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwVHJlZSggb2JqZWN0IHRyZWUgKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgdCA9IGFkYXB0b3IuRHVwVHJlZSggdHJlZSApOworICAgICAgICAgICAgLy8gd2FsayB0aGUgdHJlZSBhbmQgZW1pdCBjcmVhdGUgYW5kIGFkZCBjaGlsZCBldmVudHMKKyAgICAgICAgICAgIC8vIHRvIHNpbXVsYXRlIHdoYXQgZHVwVHJlZSBoYXMgZG9uZS4gZHVwVHJlZSBkb2VzIG5vdCBjYWxsIHRoaXMgZGVidWcKKyAgICAgICAgICAgIC8vIGFkYXB0ZXIgc28gSSBtdXN0IHNpbXVsYXRlLgorICAgICAgICAgICAgU2ltdWxhdGVUcmVlQ29uc3RydWN0aW9uKCB0ICk7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5eKEEgQiBDKTogZW1pdCBjcmVhdGUgQSwgY3JlYXRlIEIsIGFkZCBjaGlsZCwgLi4uPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFNpbXVsYXRlVHJlZUNvbnN0cnVjdGlvbiggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBkYmcuQ3JlYXRlTm9kZSggdCApOworICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQoIHQgKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkID0gYWRhcHRvci5HZXRDaGlsZCggdCwgaSApOworICAgICAgICAgICAgICAgIFNpbXVsYXRlVHJlZUNvbnN0cnVjdGlvbiggY2hpbGQgKTsKKyAgICAgICAgICAgICAgICBkYmcuQWRkQ2hpbGQoIHQsIGNoaWxkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwTm9kZSggb2JqZWN0IHRyZWVOb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IGQgPSBhZGFwdG9yLkR1cE5vZGUoIHRyZWVOb2RlICk7CisgICAgICAgICAgICBkYmcuQ3JlYXRlTm9kZSggZCApOworICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IER1cE5vZGUoaW50IHR5cGUsIG9iamVjdCB0cmVlTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IGQgPSBhZGFwdG9yLkR1cE5vZGUodHlwZSwgdHJlZU5vZGUpOworICAgICAgICAgICAgZGJnLkNyZWF0ZU5vZGUoZCk7CisgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvYmplY3QgRHVwTm9kZShvYmplY3QgdHJlZU5vZGUsIHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgZCA9IGFkYXB0b3IuRHVwTm9kZSh0cmVlTm9kZSwgdGV4dCk7CisgICAgICAgICAgICBkYmcuQ3JlYXRlTm9kZShkKTsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBEdXBOb2RlKGludCB0eXBlLCBvYmplY3QgdHJlZU5vZGUsIHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgZCA9IGFkYXB0b3IuRHVwTm9kZSh0eXBlLCB0cmVlTm9kZSwgdGV4dCk7CisgICAgICAgICAgICBkYmcuQ3JlYXRlTm9kZShkKTsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IE5pbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBub2RlID0gYWRhcHRvci5OaWwoKTsKKyAgICAgICAgICAgIGRiZy5OaWxOb2RlKCBub2RlICk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNOaWwoIG9iamVjdCB0cmVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuSXNOaWwoIHRyZWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQWRkQ2hpbGQoIG9iamVjdCB0LCBvYmplY3QgY2hpbGQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGFwdG9yLkFkZENoaWxkKCB0LCBjaGlsZCApOworICAgICAgICAgICAgZGJnLkFkZENoaWxkKCB0LCBjaGlsZCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEJlY29tZVJvb3QoIG9iamVjdCBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBuID0gYWRhcHRvci5CZWNvbWVSb290KCBuZXdSb290LCBvbGRSb290ICk7CisgICAgICAgICAgICBkYmcuQmVjb21lUm9vdCggbmV3Um9vdCwgb2xkUm9vdCApOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUnVsZVBvc3RQcm9jZXNzaW5nKCBvYmplY3Qgcm9vdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLlJ1bGVQb3N0UHJvY2Vzc2luZyggcm9vdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRDaGlsZCggb2JqZWN0IHQsIElUb2tlbiBjaGlsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBuID0gdGhpcy5DcmVhdGUoIGNoaWxkICk7CisgICAgICAgICAgICB0aGlzLkFkZENoaWxkKCB0LCBuICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQmVjb21lUm9vdCggSVRva2VuIG5ld1Jvb3QsIG9iamVjdCBvbGRSb290ICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG4gPSB0aGlzLkNyZWF0ZSggbmV3Um9vdCApOworICAgICAgICAgICAgYWRhcHRvci5CZWNvbWVSb290KCBuLCBvbGRSb290ICk7CisgICAgICAgICAgICBkYmcuQmVjb21lUm9vdCggbmV3Um9vdCwgb2xkUm9vdCApOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQ3JlYXRlKCBpbnQgdG9rZW5UeXBlLCBJVG9rZW4gZnJvbVRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBhZGFwdG9yLkNyZWF0ZSggdG9rZW5UeXBlLCBmcm9tVG9rZW4gKTsKKyAgICAgICAgICAgIGRiZy5DcmVhdGVOb2RlKCBub2RlICk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoIGludCB0b2tlblR5cGUsIElUb2tlbiBmcm9tVG9rZW4sIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBhZGFwdG9yLkNyZWF0ZSggdG9rZW5UeXBlLCBmcm9tVG9rZW4sIHRleHQgKTsKKyAgICAgICAgICAgIGRiZy5DcmVhdGVOb2RlKCBub2RlICk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoIGludCB0b2tlblR5cGUsIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBhZGFwdG9yLkNyZWF0ZSggdG9rZW5UeXBlLCB0ZXh0ICk7CisgICAgICAgICAgICBkYmcuQ3JlYXRlTm9kZSggbm9kZSApOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IENyZWF0ZShJVG9rZW4gZnJvbVRva2VuLCBzdHJpbmcgdGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBhZGFwdG9yLkNyZWF0ZShmcm9tVG9rZW4sIHRleHQpOworICAgICAgICAgICAgZGJnLkNyZWF0ZU5vZGUobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBHZXRUeXBlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFR5cGUoIHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0VHlwZSggb2JqZWN0IHQsIGludCB0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRhcHRvci5TZXRUeXBlKCB0LCB0eXBlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgR2V0VGV4dCggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5HZXRUZXh0KCB0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRleHQoIG9iamVjdCB0LCBzdHJpbmcgdGV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkYXB0b3IuU2V0VGV4dCggdCwgdGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIEdldFRva2VuKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFRva2VuKCB0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRva2VuQm91bmRhcmllcyggb2JqZWN0IHQsIElUb2tlbiBzdGFydFRva2VuLCBJVG9rZW4gc3RvcFRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMoIHQsIHN0YXJ0VG9rZW4sIHN0b3BUb2tlbiApOworICAgICAgICAgICAgaWYgKCB0ICE9IG51bGwgJiYgc3RhcnRUb2tlbiAhPSBudWxsICYmIHN0b3BUb2tlbiAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYmcuU2V0VG9rZW5Cb3VuZGFyaWVzKAorICAgICAgICAgICAgICAgICAgICB0LCBzdGFydFRva2VuLlRva2VuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHN0b3BUb2tlbi5Ub2tlbkluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VG9rZW5TdGFydEluZGV4KCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFRva2VuU3RhcnRJbmRleCggdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFRva2VuU3RvcEluZGV4KCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFRva2VuU3RvcEluZGV4KCB0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0Q2hpbGQoIG9iamVjdCB0LCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldENoaWxkKCB0LCBpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldENoaWxkKCBvYmplY3QgdCwgaW50IGksIG9iamVjdCBjaGlsZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkYXB0b3IuU2V0Q2hpbGQoIHQsIGksIGNoaWxkICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRGVsZXRlQ2hpbGQoIG9iamVjdCB0LCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBEZWxldGVDaGlsZCggdCwgaSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldENoaWxkQ291bnQoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuR2V0Q2hpbGRDb3VudCggdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFVuaXF1ZUlEKCBvYmplY3Qgbm9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFVuaXF1ZUlEKCBub2RlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0UGFyZW50KCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFBhcmVudCggdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldENoaWxkSW5kZXgoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuR2V0Q2hpbGRJbmRleCggdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRQYXJlbnQoIG9iamVjdCB0LCBvYmplY3QgcGFyZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRhcHRvci5TZXRQYXJlbnQoIHQsIHBhcmVudCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRDaGlsZEluZGV4KCBvYmplY3QgdCwgaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRhcHRvci5TZXRDaGlsZEluZGV4KCB0LCBpbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlQ2hpbGRyZW4oIG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBhZGFwdG9yLlJlcGxhY2VDaGlsZHJlbiggcGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0ICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIHN1cHBvcnQKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRGVidWdFdmVudExpc3RlbmVyIEdldERlYnVnTGlzdGVuZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGJnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXREZWJ1Z0xpc3RlbmVyKCBJRGVidWdFdmVudExpc3RlbmVyIGRiZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGJnID0gZGJnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRyZWVBZGFwdG9yIEdldFRyZWVBZGFwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3I7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZU5vZGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvRGVidWdUcmVlTm9kZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY4YzViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZU5vZGVTdHJlYW0uY3MKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcKK3sKKyAgICB1c2luZyBPYnNvbGV0ZSA9IFN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZTsKKyAgICB1c2luZyBJVHJlZUFkYXB0b3IgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVBZGFwdG9yOworICAgIHVzaW5nIElUcmVlTm9kZVN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZU5vZGVTdHJlYW07CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIERlYnVnIGFueSB0cmVlIG5vZGUgc3RyZWFtLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgdGhlIHN0cmVhbQorICAgICAqICBhbmQgYSBkZWJ1ZyBsaXN0ZW5lci4gIEFzIG5vZGUgc3RyZWFtIGNhbGxzIGNvbWUgaW4sIGRlYnVnIGV2ZW50cworICAgICAqICBhcmUgdHJpZ2dlcmVkLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERlYnVnVHJlZU5vZGVTdHJlYW0gOiBJVHJlZU5vZGVTdHJlYW0KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBJRGVidWdFdmVudExpc3RlbmVyIGRiZzsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBhZGFwdG9yOworICAgICAgICBwcm90ZWN0ZWQgSVRyZWVOb2RlU3RyZWFtIGlucHV0OworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBpbml0aWFsU3RyZWFtU3RhdGUgPSB0cnVlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdE1hcmtlcjsKKworICAgICAgICBwdWJsaWMgRGVidWdUcmVlTm9kZVN0cmVhbSggSVRyZWVOb2RlU3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGlucHV0LlRyZWVBZGFwdG9yOworICAgICAgICAgICAgdGhpcy5pbnB1dC5VbmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSB0cnVlOworICAgICAgICAgICAgRGVidWdMaXN0ZW5lciA9IGRiZzsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHJvcGVydGllcworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRGVidWdFdmVudExpc3RlbmVyIERlYnVnTGlzdGVuZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRiZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRiZyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU3RyZWFtIFRva2VuU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5Ub2tlblN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZUFkYXB0b3IgVHJlZUFkYXB0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFRyZWVTb3VyY2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEl0IGlzIG5vcm1hbGx5IHRoaXMgb2JqZWN0IHRoYXQgaW5zdHJ1Y3RzIHRoZSBub2RlIHN0cmVhbSB0bworICAgICAgICAgKiAgY3JlYXRlIHVuaXF1ZSBuYXYgbm9kZXMsIGJ1dCB0byBzYXRpc2Z5IGludGVyZmFjZSwgd2UgaGF2ZSB0bworICAgICAgICAgKiAgZGVmaW5lIGl0LiAgSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGlnbm9yZSB0aGUgcGFyYW1ldGVyIGJ1dAorICAgICAgICAgKiAgdGhlcmUgbWlnaHQgYmUgYSB1c2UgZm9yIGl0IGxhdGVyLCBzbyBJJ2xsIGxlYXZlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2wgVW5pcXVlTmF2aWdhdGlvbk5vZGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5VbmlxdWVOYXZpZ2F0aW9uTm9kZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5VbmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWUoKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgbm9kZSA9IGlucHV0LkxUKCAxICk7CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICBkYmcuQ29uc3VtZU5vZGUoIG5vZGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCB0aGlzW2ludCBpXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTFQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG5vZGUgPSBpbnB1dC5MVCggaSApOworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggbm9kZSApOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQoIG5vZGUgKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKCBub2RlICk7CisgICAgICAgICAgICBkYmcuTFQoIGksIG5vZGUgKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBub2RlID0gaW5wdXQuTFQoIGkgKTsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQoIG5vZGUgKTsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KCBub2RlICk7CisgICAgICAgICAgICBpbnQgdHlwZSA9IGFkYXB0b3IuR2V0VHlwZSggbm9kZSApOworICAgICAgICAgICAgZGJnLkxUKCBpLCBub2RlICk7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdE1hcmtlciA9IGlucHV0Lk1hcmsoKTsKKyAgICAgICAgICAgIGRiZy5NYXJrKCBsYXN0TWFya2VyICk7CisgICAgICAgICAgICByZXR1cm4gbGFzdE1hcmtlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCBpbnQgbWFya2VyICkKKyAgICAgICAgeworICAgICAgICAgICAgZGJnLlJld2luZCggbWFya2VyICk7CisgICAgICAgICAgICBpbnB1dC5SZXdpbmQoIG1hcmtlciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBkYmcuUmV3aW5kKCk7CisgICAgICAgICAgICBpbnB1dC5SZXdpbmQoIGxhc3RNYXJrZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZSggaW50IG1hcmtlciApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2VlayggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHNlZWsgaW4gZGJnIGludGVyZmFjZQorICAgICAgICAgICAgLy8gZGIuc2VlayhpbmRleCk7CisgICAgICAgICAgICBpbnB1dC5TZWVrKCBpbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblN0cmVhbS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlQ2hpbGRyZW4oIG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnB1dC5SZXBsYWNlQ2hpbGRyZW4oIHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBvYmplY3Qgc3RhcnQsIG9iamVjdCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LlRvU3RyaW5nKCBzdGFydCwgc3RvcCApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0RlYnVnVHJlZVBhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2MTM4NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuY3MKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcKK3sKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zOworCisgICAgdXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworICAgIHVzaW5nIElPRXhjZXB0aW9uID0gU3lzdGVtLklPLklPRXhjZXB0aW9uOworICAgIHVzaW5nIElUcmVlTm9kZVN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5JVHJlZU5vZGVTdHJlYW07CisgICAgdXNpbmcgVHJlZVBhcnNlciA9IEFudGxyLlJ1bnRpbWUuVHJlZS5UcmVlUGFyc2VyOworCisgICAgcHVibGljIGNsYXNzIERlYnVnVHJlZVBhcnNlciA6IFRyZWVQYXJzZXIKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5XaG8gdG8gbm90aWZ5IHdoZW4gZXZlbnRzIGluIHRoZSBwYXJzZXIgb2NjdXIuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBudWxsOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGZpeGVkIGxvb2thaGVhZCBhbmQgY3ljbGljIERGQSBkZWNpc2lvbnMKKyAgICAgICAgICogIHdoaWxlIHByb2ZpbGluZy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sIGlzQ3ljbGljRGVjaXNpb24gPSBmYWxzZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBub3JtYWwgcGFyc2VyIGV4Y2VwdCB3cmFwIHRoZSB0b2tlbiBzdHJlYW0gaW4gYSBkZWJ1ZworICAgICAgICAgKiAgcHJveHkgdGhhdCBmaXJlcyBjb25zdW1lIGV2ZW50cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEZWJ1Z1RyZWVQYXJzZXIoIElUcmVlTm9kZVN0cmVhbSBpbnB1dCwgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSApCisgICAgICAgICAgICA6IGJhc2UoIGlucHV0IGlzIERlYnVnVHJlZU5vZGVTdHJlYW0gPyBpbnB1dCA6IG5ldyBEZWJ1Z1RyZWVOb2RlU3RyZWFtKCBpbnB1dCwgZGJnICksIHN0YXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0RGVidWdMaXN0ZW5lcihkYmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERlYnVnVHJlZVBhcnNlciggSVRyZWVOb2RlU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUgKQorICAgICAgICAgICAgOiBiYXNlKCBpbnB1dCBpcyBEZWJ1Z1RyZWVOb2RlU3RyZWFtID8gaW5wdXQgOiBuZXcgRGVidWdUcmVlTm9kZVN0cmVhbSggaW5wdXQsIG51bGwgKSwgc3RhdGUgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVidWdUcmVlUGFyc2VyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKyAgICAgICAgICAgIDogdGhpcyggaW5wdXQgaXMgRGVidWdUcmVlTm9kZVN0cmVhbSA/IGlucHV0IDogbmV3IERlYnVnVHJlZU5vZGVTdHJlYW0oIGlucHV0LCBkYmcgKSwgZGJnLCBudWxsICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElEZWJ1Z0V2ZW50TGlzdGVuZXIgRGVidWdMaXN0ZW5lcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGJnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUHJvdmlkZSBhIG5ldyBkZWJ1ZyBldmVudCBsaXN0ZW5lciBmb3IgdGhpcyBwYXJzZXIuICBOb3RpZnkgdGhlCisgICAgICAgICAqICBpbnB1dCBzdHJlYW0gdG9vIHRoYXQgaXQgc2hvdWxkIHNlbmQgZXZlbnRzIHRvIHRoaXMgbGlzdGVuZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldERlYnVnTGlzdGVuZXIoSURlYnVnRXZlbnRMaXN0ZW5lciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0IGlzIERlYnVnVHJlZU5vZGVTdHJlYW0pCisgICAgICAgICAgICAgICAgKChEZWJ1Z1RyZWVOb2RlU3RyZWFtKWlucHV0KS5EZWJ1Z0xpc3RlbmVyID0gdmFsdWU7CisKKyAgICAgICAgICAgIHRoaXMuZGJnID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcG9ydEVycm9yKCBJT0V4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIGUgKTsKKyAgICAgICAgICAgIEV4Y2VwdGlvbkV4dGVuc2lvbnMuUHJpbnRTdGFja1RyYWNlKCBlLCBDb25zb2xlLkVycm9yICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXBvcnRFcnJvciggUmVjb2duaXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggZSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBHZXRNaXNzaW5nU3ltYm9sKCBJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFRva2VuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBmb2xsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgbyA9IGJhc2UuR2V0TWlzc2luZ1N5bWJvbCggaW5wdXQsIGUsIGV4cGVjdGVkVG9rZW5UeXBlLCBmb2xsb3cgKTsKKyAgICAgICAgICAgIGRiZy5Db25zdW1lTm9kZSggbyApOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWdpblJlc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRiZy5CZWdpblJlc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kUmVzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgZGJnLkVuZFJlc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBCZWdpbkJhY2t0cmFjayggaW50IGxldmVsICkKKyAgICAgICAgeworICAgICAgICAgICAgZGJnLkJlZ2luQmFja3RyYWNrKCBsZXZlbCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRCYWNrdHJhY2soIGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsICkKKyAgICAgICAgeworICAgICAgICAgICAgZGJnLkVuZEJhY2t0cmFjayggbGV2ZWwsIHN1Y2Nlc3NmdWwgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9KYXZhRXh0ZW5zaW9ucy9FeGNlcHRpb25FeHRlbnNpb25zLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL0phdmFFeHRlbnNpb25zL0V4Y2VwdGlvbkV4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3NmNmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9KYXZhRXh0ZW5zaW9ucy9FeGNlcHRpb25FeHRlbnNpb25zLmNzCkBAIC0wLDAgKzEsNTEgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgVGV4dFdyaXRlciA9IFN5c3RlbS5JTy5UZXh0V3JpdGVyOworCisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBQcmludFN0YWNrVHJhY2UoIEV4Y2VwdGlvbiBlLCBUZXh0V3JpdGVyIHdyaXRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIGUuVG9TdHJpbmcoKSApOworICAgICAgICAgICAgc3RyaW5nIHRyYWNlID0gZS5TdGFja1RyYWNlID8/IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBzdHJpbmcgbGluZSBpbiB0cmFjZS5TcGxpdCggJ1xuJywgJ1xyJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoICFzdHJpbmcuSXNOdWxsT3JFbXB0eSggbGluZSApICkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSggIiAgICAgICAgIiArIGxpbmUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvTWlzYy9Eb3VibGVLZXlNYXBcMTQwMy5jcyIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL01pc2MvRG91YmxlS2V5TWFwXDE0MDMuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2ZjMjYKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL01pc2MvRG91YmxlS2V5TWFwXDE0MDMuY3MiCkBAIC0wLDAgKzEsODYgQEAKK++7v25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnLk1pc2MKK3sKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHB1YmxpYyBjbGFzcyBEb3VibGVLZXlNYXA8VEtleTEsIFRLZXkyLCBUVmFsdWU+CisgICAgeworICAgICAgICBpbnRlcm5hbCBJRGljdGlvbmFyeTxUS2V5MSwgSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4+IGRhdGEgPSBuZXcgRGljdGlvbmFyeTxUS2V5MSwgSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4+KCk7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgVFZhbHVlIFB1dChUS2V5MSBrMSwgVEtleTIgazIsIFRWYWx1ZSB2KQorICAgICAgICB7CisgICAgICAgICAgICBJRGljdGlvbmFyeTxUS2V5MiwgVFZhbHVlPiBkYXRhMjsKKyAgICAgICAgICAgIGRhdGEuVHJ5R2V0VmFsdWUoazEsIG91dCBkYXRhMik7CisgICAgICAgICAgICBUVmFsdWUgcHJldiA9IGRlZmF1bHQoVFZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkYXRhMiA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEyID0gbmV3IERpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4oKTsKKyAgICAgICAgICAgICAgICBkYXRhW2sxXT1kYXRhMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhMi5UcnlHZXRWYWx1ZShrMiwgb3V0IHByZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YTJbazJdPSB2OworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBUVmFsdWUgR2V0KFRLZXkxIGsxLCBUS2V5MiBrMikKKyAgICAgICAgeworICAgICAgICAgICAgSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4gZGF0YTI7CisgICAgICAgICAgICBkYXRhLlRyeUdldFZhbHVlKGsxLCBvdXQgZGF0YTIpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVFZhbHVlKTsKKworICAgICAgICAgICAgVFZhbHVlIHZhbHVlOworICAgICAgICAgICAgZGF0YTIuVHJ5R2V0VmFsdWUoazIsIG91dCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJRGljdGlvbmFyeTxUS2V5MiwgVFZhbHVlPiBHZXQoVEtleTEgazEpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PFRLZXkyLCBUVmFsdWU+IHZhbHVlOworICAgICAgICAgICAgZGF0YS5UcnlHZXRWYWx1ZShrMSwgb3V0IHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBHZXQgYWxsIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggcHJpbWFyeSBrZXkgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUNvbGxlY3Rpb248VFZhbHVlPiBWYWx1ZXMoVEtleTEgazEpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PFRLZXkyLCBUVmFsdWU+IGRhdGEyOworICAgICAgICAgICAgZGF0YS5UcnlHZXRWYWx1ZShrMSwgb3V0IGRhdGEyKTsKKyAgICAgICAgICAgIGlmIChkYXRhMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gZGF0YTIuVmFsdWVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIGdldCBhbGwgcHJpbWFyeSBrZXlzICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElDb2xsZWN0aW9uPFRLZXkxPiBLZXlTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YS5LZXlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIGdldCBhbGwgc2Vjb25kYXJ5IGtleXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJpbWFyeSBrZXkgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUNvbGxlY3Rpb248VEtleTI+IEtleVNldChUS2V5MSBrMSkKKyAgICAgICAgeworICAgICAgICAgICAgSURpY3Rpb25hcnk8VEtleTIsIFRWYWx1ZT4gZGF0YTI7CisgICAgICAgICAgICBkYXRhLlRyeUdldFZhbHVlKGsxLCBvdXQgZGF0YTIpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBkYXRhMi5LZXlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUNvbGxlY3Rpb248VFZhbHVlPiBWYWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PFRWYWx1ZSwgYm9vbD4gcyA9IG5ldyBEaWN0aW9uYXJ5PFRWYWx1ZSwgYm9vbD4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKElEaWN0aW9uYXJ5PFRLZXkyLCBUVmFsdWU+IGsyIGluIGRhdGEuVmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcmVhY2ggKFRWYWx1ZSB2IGluIGsyLlZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgc1t2XSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzLktleXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvTWlzYy9TdGF0cy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9NaXNjL1N0YXRzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDY1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvTWlzYy9TdGF0cy5jcwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5NaXNjCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBEaXJlY3RvcnkgPSBTeXN0ZW0uSU8uRGlyZWN0b3J5OworICAgIHVzaW5nIEVudmlyb25tZW50ID0gU3lzdGVtLkVudmlyb25tZW50OworICAgIHVzaW5nIEZpbGUgPSBTeXN0ZW0uSU8uRmlsZTsKKyAgICB1c2luZyBNYXRoID0gU3lzdGVtLk1hdGg7CisgICAgdXNpbmcgUGF0aCA9IFN5c3RlbS5JTy5QYXRoOworCisgICAgLyoqIDxzdW1tYXJ5PlN0YXRzIHJvdXRpbmVzIG5lZWRlZCBieSBwcm9maWxlciBldGMuLi48L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIG5vdGUgdGhhdCB0aGVzZSByb3V0aW5lcyByZXR1cm4gMC4wIGlmIG5vIHZhbHVlcyBleGlzdCBpbiB0aGUgWFtdCisgICAgICogIHdoaWNoIGlzIG5vdCAiY29ycmVjdCIsIGJ1dCBpdCBpcyB1c2VmdWwgc28gSSBkb24ndCBnZW5lcmF0ZSBOYU4KKyAgICAgKiAgaW4gbXkgb3V0cHV0CisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgU3RhdHMKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgQU5UTFJXT1JLU19ESVIgPSAiYW50bHJ3b3JrcyI7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkNvbXB1dGUgdGhlIHNhbXBsZSAodW5iaWFzZWQgZXN0aW1hdG9yKSBzdGFuZGFyZCBkZXZpYXRpb24gZm9sbG93aW5nOjwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgQ29tcHV0aW5nIERldmlhdGlvbnM6IFN0YW5kYXJkIEFjY3VyYWN5CisgICAgICAgICAqICBUb255IEYuIENoYW4gYW5kIEpvaG4gR3JlZ2cgTGV3aXMKKyAgICAgICAgICogIFN0YW5mb3JkIFVuaXZlcnNpdHkKKyAgICAgICAgICogIENvbW11bmljYXRpb25zIG9mIEFDTSBTZXB0ZW1iZXIgMTk3OSBvZiBWb2x1bWUgMjIgdGhlIEFDTSBOdW1iZXIgOQorICAgICAgICAgKgorICAgICAgICAgKiAgVGhlICJ0d28tcGFzcyIgbWV0aG9kIGZyb20gdGhlIHBhcGVyOyBzdXBwb3NlZCB0byBoYXZlIGJldHRlcgorICAgICAgICAgKiAgbnVtZXJpY2FsIHByb3BlcnRpZXMgdGhhbiB0aGUgdGV4dGJvb2sgc3VtbWF0aW9uL3NxcnQuICBUbyBtZQorICAgICAgICAgKiAgdGhpcyBsb29rcyBsaWtlIHRoZSB0ZXh0Ym9vayBtZXRob2QsIGJ1dCBJIGFpbid0IG5vIG51bWVyaWNhbAorICAgICAgICAgKiAgbWV0aG9kcyBndXkuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBTdGRkZXYoIGludFtdIFggKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9IFguTGVuZ3RoOworICAgICAgICAgICAgaWYgKCBtIDw9IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIHhiYXIgPSBBdmVyYWdlKFgpOworICAgICAgICAgICAgZG91YmxlIHMyID0gMC4wOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzMiArPSAoIFhbaV0gLSB4YmFyICkgKiAoIFhbaV0gLSB4YmFyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMiA9IHMyIC8gKCBtIC0gMSApOworICAgICAgICAgICAgcmV0dXJuIE1hdGguU3FydCggczIgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBTdGRkZXYoIExpc3Q8aW50PiBYICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG0gPSBYLkNvdW50OworICAgICAgICAgICAgaWYgKCBtIDw9IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIHhiYXIgPSBBdmVyYWdlKFgpOworICAgICAgICAgICAgZG91YmxlIHMyID0gMC4wOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzMiArPSAoIFhbaV0gLSB4YmFyICkgKiAoIFhbaV0gLSB4YmFyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzMiA9IHMyIC8gKCBtIC0gMSApOworICAgICAgICAgICAgcmV0dXJuIE1hdGguU3FydCggczIgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Db21wdXRlIHRoZSBzYW1wbGUgbWVhbjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQXZlcmFnZShJQ29sbGVjdGlvbjxpbnQ+IFgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChYLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDAuMDsKKworICAgICAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBpIGluIFgpCisgICAgICAgICAgICAgICAgc3VtICs9IGk7CisKKyAgICAgICAgICAgIHJldHVybiBzdW0gLyBYLkNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFdyaXRlUmVwb3J0KCBzdHJpbmcgZmlsZW5hbWUsIHN0cmluZyBkYXRhICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGFic29sdXRlRmlsZW5hbWUgPSBHZXRBYnNvbHV0ZUZpbGVOYW1lKCBmaWxlbmFtZSApOworCisgICAgICAgICAgICBEaXJlY3RvcnkuQ3JlYXRlRGlyZWN0b3J5KCBQYXRoLkdldERpcmVjdG9yeU5hbWUoIGFic29sdXRlRmlsZW5hbWUgKSApOworICAgICAgICAgICAgRmlsZS5BcHBlbmRBbGxUZXh0KCBhYnNvbHV0ZUZpbGVuYW1lLCBkYXRhICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBYnNvbHV0ZUZpbGVOYW1lKCBzdHJpbmcgZmlsZW5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcGVyc29uYWxGb2xkZXIgPSBFbnZpcm9ubWVudC5HZXRGb2xkZXJQYXRoKCBFbnZpcm9ubWVudC5TcGVjaWFsRm9sZGVyLlBlcnNvbmFsICk7CisgICAgICAgICAgICByZXR1cm4gcGVyc29uYWxGb2xkZXIgKyBQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIgKworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJXT1JLU19ESVIgKyBQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIgKworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUGFyc2VUcmVlQnVpbGRlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9QYXJzZVRyZWVCdWlsZGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWFmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUGFyc2VUcmVlQnVpbGRlci5jcwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIFBhcnNlVHJlZSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5QYXJzZVRyZWU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFRoaXMgcGFyc2VyIGxpc3RlbmVyIHRyYWNrcyBydWxlIGVudHJ5L2V4aXQgYW5kIHRva2VuIG1hdGNoZXMKKyAgICAgKiAgdG8gYnVpbGQgYSBzaW1wbGUgcGFyc2UgdHJlZSB1c2luZyBQYXJzZVRyZWUgbm9kZXMuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUGFyc2VUcmVlQnVpbGRlciA6IEJsYW5rRGVidWdFdmVudExpc3RlbmVyCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEVQU0lMT05fUEFZTE9BRCA9ICI8ZXBzaWxvbj4iOworCisgICAgICAgIFN0YWNrPFBhcnNlVHJlZT4gY2FsbFN0YWNrID0gbmV3IFN0YWNrPFBhcnNlVHJlZT4oKTsKKyAgICAgICAgTGlzdDxJVG9rZW4+IGhpZGRlblRva2VucyA9IG5ldyBMaXN0PElUb2tlbj4oKTsKKyAgICAgICAgaW50IGJhY2t0cmFja2luZyA9IDA7CisKKyAgICAgICAgcHVibGljIFBhcnNlVHJlZUJ1aWxkZXIoIHN0cmluZyBncmFtbWFyTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnNlVHJlZSByb290ID0gQ3JlYXRlKCAiPGdyYW1tYXIgIiArIGdyYW1tYXJOYW1lICsgIj4iICk7CisgICAgICAgICAgICBjYWxsU3RhY2suUHVzaCggcm9vdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgUGFyc2VUcmVlIFRyZWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxTdGFjay5QZWVrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IGtpbmQgb2Ygbm9kZSB0byBjcmVhdGUuICBZb3UgbWlnaHQgd2FudCB0byBvdmVycmlkZQorICAgICAgICAgKiAgc28gSSBmYWN0b3JlZCBvdXQgY3JlYXRpb24gaGVyZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFBhcnNlVHJlZSBDcmVhdGUoIG9iamVjdCBwYXlsb2FkICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVRyZWUoIHBheWxvYWQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFBhcnNlVHJlZSBFcHNpbG9uTm9kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGUoIEVQU0lMT05fUEFZTE9BRCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkJhY2t0cmFja2luZyBvciBjeWNsaWMgREZBLCBkb24ndCB3YW50IHRvIGFkZCBub2RlcyB0byB0cmVlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlckRlY2lzaW9uKCBpbnQgZCwgYm9vbCBjb3VsZEJhY2t0cmFjayApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhY2t0cmFja2luZysrOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEV4aXREZWNpc2lvbiggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBiYWNrdHJhY2tpbmctLTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVudGVyUnVsZSggc3RyaW5nIGZpbGVuYW1lLCBzdHJpbmcgcnVsZU5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGJhY2t0cmFja2luZyA+IDAgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFBhcnNlVHJlZSBwYXJlbnRSdWxlTm9kZSA9IGNhbGxTdGFjay5QZWVrKCk7CisgICAgICAgICAgICBQYXJzZVRyZWUgcnVsZU5vZGUgPSBDcmVhdGUoIHJ1bGVOYW1lICk7CisgICAgICAgICAgICBwYXJlbnRSdWxlTm9kZS5BZGRDaGlsZCggcnVsZU5vZGUgKTsKKyAgICAgICAgICAgIGNhbGxTdGFjay5QdXNoKCBydWxlTm9kZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRXhpdFJ1bGUoIHN0cmluZyBmaWxlbmFtZSwgc3RyaW5nIHJ1bGVOYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBiYWNrdHJhY2tpbmcgPiAwICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBQYXJzZVRyZWUgcnVsZU5vZGUgPSBjYWxsU3RhY2suUGVlaygpOworICAgICAgICAgICAgaWYgKCBydWxlTm9kZS5DaGlsZENvdW50ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bGVOb2RlLkFkZENoaWxkKCBFcHNpbG9uTm9kZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsU3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDb25zdW1lVG9rZW4oIElUb2tlbiB0b2tlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYmFja3RyYWNraW5nID4gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgUGFyc2VUcmVlIHJ1bGVOb2RlID0gY2FsbFN0YWNrLlBlZWsoKTsKKyAgICAgICAgICAgIFBhcnNlVHJlZSBlbGVtZW50Tm9kZSA9IENyZWF0ZSggdG9rZW4gKTsKKyAgICAgICAgICAgIGVsZW1lbnROb2RlLmhpZGRlblRva2VucyA9IHRoaXMuaGlkZGVuVG9rZW5zOworICAgICAgICAgICAgdGhpcy5oaWRkZW5Ub2tlbnMgPSBuZXcgTGlzdDxJVG9rZW4+KCk7CisgICAgICAgICAgICBydWxlTm9kZS5BZGRDaGlsZCggZWxlbWVudE5vZGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENvbnN1bWVIaWRkZW5Ub2tlbiggSVRva2VuIHRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBiYWNrdHJhY2tpbmcgPiAwICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBoaWRkZW5Ub2tlbnMuQWRkKCB0b2tlbiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVjb2duaXRpb25FeGNlcHRpb24oIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGJhY2t0cmFja2luZyA+IDAgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFBhcnNlVHJlZSBydWxlTm9kZSA9IGNhbGxTdGFjay5QZWVrKCk7CisgICAgICAgICAgICBQYXJzZVRyZWUgZXJyb3JOb2RlID0gQ3JlYXRlKCBlICk7CisgICAgICAgICAgICBydWxlTm9kZS5BZGRDaGlsZCggZXJyb3JOb2RlICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUGFyc2VyRGVidWdnZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUGFyc2VyRGVidWdnZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2MGYyYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9QYXJzZXJEZWJ1Z2dlci5jcwpAQCAtMCwwICsxLDQ5IEBACivvu79uYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBTeXN0ZW0uTGlucTsKKyAgICB1c2luZyBTeXN0ZW0uVGV4dDsKKworICAgIHVzaW5nIElPRXhjZXB0aW9uID0gU3lzdGVtLklPLklPRXhjZXB0aW9uOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKworICAgIHB1YmxpYyBjbGFzcyBQYXJzZXJEZWJ1Z2dlcgorICAgIHsKKyAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmc7CisKKyAgICAgICAgcHVibGljIFBhcnNlckRlYnVnZ2VyKCBQYXJzZXIgcGFyc2VyICkKKyAgICAgICAgICAgIDogdGhpcyggcGFyc2VyLCBEZWJ1Z0V2ZW50U29ja2V0UHJveHkuREVGQVVMVF9ERUJVR0dFUl9QT1JUICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBQYXJzZXJEZWJ1Z2dlciggUGFyc2VyIHBhcnNlciwgaW50IHBvcnQgKQorICAgICAgICB7CisgICAgICAgICAgICBEZWJ1Z0V2ZW50U29ja2V0UHJveHkgcHJveHkgPSBuZXcgRGVidWdFdmVudFNvY2tldFByb3h5KCBwYXJzZXIsIHBvcnQsIG51bGwgKTsKKyAgICAgICAgICAgIERlYnVnTGlzdGVuZXIgPSBwcm94eTsKKyAgICAgICAgICAgIHBhcnNlci5Ub2tlblN0cmVhbSA9IG5ldyBEZWJ1Z1Rva2VuU3RyZWFtKCBwYXJzZXIuVG9rZW5TdHJlYW0sIHByb3h5ICk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm94eS5oYW5kc2hha2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IoIGlvZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXAgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKyAgICAgICAgICAgIFRyZWVBZGFwdG9yID0gYWRhcDsKKyAgICAgICAgICAgIHByb3h5LlRyZWVBZGFwdG9yID0gYWRhcDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUGFyc2VyRGVidWdnZXIoIFBhcnNlciBwYXJzZXIsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXAgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKyAgICAgICAgICAgIFRyZWVBZGFwdG9yID0gYWRhcDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGJvb2wgRXZhbFByZWRpY2F0ZSggYm9vbCByZXN1bHQsIHN0cmluZyBwcmVkaWNhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBkYmcuU2VtYW50aWNQcmVkaWNhdGUoIHJlc3VsdCwgcHJlZGljYXRlICk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUHJvZmlsZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUHJvZmlsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjYWFjOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9Qcm9maWxlci5jcwpAQCAtMCwwICsxLDc5NyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbDsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLkRlYnVnLk1pc2M7CisKKyAgICB1c2luZyBBcnJheSA9IFN5c3RlbS5BcnJheTsKKyAgICB1c2luZyBDTFNDb21wbGlhbnRBdHRyaWJ1dGUgPSBTeXN0ZW0uQ0xTQ29tcGxpYW50QXR0cmlidXRlOworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKyAgICB1c2luZyBEYXRlVGltZSA9IFN5c3RlbS5EYXRlVGltZTsKKyAgICB1c2luZyBFbnZpcm9ubWVudCA9IFN5c3RlbS5FbnZpcm9ubWVudDsKKyAgICB1c2luZyBNYXRoID0gU3lzdGVtLk1hdGg7CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICAvKiogPHN1bW1hcnk+VXNpbmcgdGhlIGRlYnVnIGV2ZW50IGludGVyZmFjZSwgdHJhY2sgd2hhdCBpcyBoYXBwZW5pbmcgaW4gdGhlIHBhcnNlcgorICAgICAqICBhbmQgcmVjb3JkIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHJ1bnRpbWUuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFByb2ZpbGVyIDogQmxhbmtEZWJ1Z0V2ZW50TGlzdGVuZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIERhdGFTZXBhcmF0b3IgPSAiXHQiOworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0cmluZyBOZXdMaW5lID0gRW52aXJvbm1lbnQuTmV3TGluZTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBkdW1wID0gZmFsc2U7CisKKyAgICAgICAgLyoqIEJlY2F1c2UgSSBtYXkgY2hhbmdlIHRoZSBzdGF0cywgSSBuZWVkIHRvIHRyYWNrIHRoYXQgZm9yIGxhdGVyCisgICAgICAgICAqICBjb21wdXRhdGlvbnMgdG8gYmUgY29uc2lzdGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIFZlcnNpb24gPSAiMyI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIFJ1bnRpbWVTdGF0c0ZpbGVuYW1lID0gInJ1bnRpbWUuc3RhdHMiOworCisgICAgICAgIC8qKiBBY2ssIHNob3VsZCBub3Qgc3RvcmUgcGFyc2VyOyBjYW4ndCBkbyByZW1vdGUgc3R1ZmYuICBXZWxsLCB3ZSBwYXNzCisgICAgICAgICAqICBpbnB1dCBzdHJlYW0gYXJvdW5kIHRvbyBzbyBJIGd1ZXNzIGl0J3Mgb2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRGVidWdQYXJzZXIgcGFyc2VyID0gbnVsbDsKKworICAgICAgICAvLyB3b3JraW5nIHZhcmlhYmxlcworCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQorICAgICAgICBwcm90ZWN0ZWQgaW50IHJ1bGVMZXZlbCA9IDA7CisgICAgICAgIC8vcHJvdGVjdGVkIGludCBkZWNpc2lvbkxldmVsID0gMDsKKyAgICAgICAgcHJvdGVjdGVkIElUb2tlbiBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb247CisgICAgICAgIHByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgYm9vbD4gdW5pcXVlUnVsZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGJvb2w+KCk7CisgICAgICAgIHByb3RlY3RlZCBTdGFjazxzdHJpbmc+IGN1cnJlbnRHcmFtbWFyRmlsZU5hbWUgPSBuZXcgU3RhY2s8c3RyaW5nPigpOworICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8c3RyaW5nPiBjdXJyZW50UnVsZU5hbWUgPSBuZXcgU3RhY2s8c3RyaW5nPigpOworICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8aW50PiBjdXJyZW50TGluZSA9IG5ldyBTdGFjazxpbnQ+KCk7CisgICAgICAgIHByb3RlY3RlZCBTdGFjazxpbnQ+IGN1cnJlbnRQb3MgPSBuZXcgU3RhY2s8aW50PigpOworCisgICAgICAgIC8vIFZlY3RvcjxEZWNpc2lvblN0YXRzPgorICAgICAgICAvL3Byb3RlY3RlZCBWZWN0b3IgZGVjaXNpb25zID0gbmV3IFZlY3RvcigyMDApOyAvLyBuZWVkIHNldFNpemUKKyAgICAgICAgcHJvdGVjdGVkIERvdWJsZUtleU1hcDxzdHJpbmcsIGludCwgRGVjaXNpb25EZXNjcmlwdG9yPiBkZWNpc2lvbnMgPSBuZXcgRG91YmxlS2V5TWFwPHN0cmluZywgaW50LCBEZWNpc2lvbkRlc2NyaXB0b3I+KCk7CisKKyAgICAgICAgLy8gUmVjb3JkIGEgRGVjaXNpb25EYXRhIGZvciBlYWNoIGRlY2lzaW9uIHdlIGhpdCB3aGlsZSBwYXJzaW5nCisgICAgICAgIHByaXZhdGUgTGlzdDxEZWNpc2lvbkV2ZW50PiBkZWNpc2lvbkV2ZW50cyA9IG5ldyBMaXN0PERlY2lzaW9uRXZlbnQ+KCk7CisgICAgICAgIHByb3RlY3RlZCBTdGFjazxEZWNpc2lvbkV2ZW50PiBkZWNpc2lvblN0YWNrID0gbmV3IFN0YWNrPERlY2lzaW9uRXZlbnQ+KCk7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBiYWNrdHJhY2tEZXB0aDsKKworICAgICAgICBQcm9maWxlU3RhdHMgc3RhdHMgPSBuZXcgUHJvZmlsZVN0YXRzKCk7CisKKyAgICAgICAgcHVibGljIFByb2ZpbGVyKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFByb2ZpbGVyKERlYnVnUGFyc2VyIHBhcnNlcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbnRlclJ1bGUoc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZW50ZXJSdWxlICIrZ3JhbW1hckZpbGVOYW1lKyI6IitydWxlTmFtZSk7CisgICAgICAgICAgICBydWxlTGV2ZWwrKzsKKyAgICAgICAgICAgIHN0YXRzLm51bVJ1bGVJbnZvY2F0aW9ucysrOworICAgICAgICAgICAgdW5pcXVlUnVsZXMuQWRkKGdyYW1tYXJGaWxlTmFtZSArICI6IiArIHJ1bGVOYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIHN0YXRzLm1heFJ1bGVJbnZvY2F0aW9uRGVwdGggPSBNYXRoLk1heChzdGF0cy5tYXhSdWxlSW52b2NhdGlvbkRlcHRoLCBydWxlTGV2ZWwpOworICAgICAgICAgICAgY3VycmVudEdyYW1tYXJGaWxlTmFtZS5QdXNoKGdyYW1tYXJGaWxlTmFtZSk7CisgICAgICAgICAgICBjdXJyZW50UnVsZU5hbWUuUHVzaChydWxlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFeGl0UnVsZShzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVMZXZlbC0tOworICAgICAgICAgICAgY3VycmVudEdyYW1tYXJGaWxlTmFtZS5Qb3AoKTsKKyAgICAgICAgICAgIGN1cnJlbnRSdWxlTmFtZS5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBUcmFjayBtZW1vaXphdGlvbjsgdGhpcyBpcyBub3QgcGFydCBvZiBzdGFuZGFyZCBkZWJ1ZyBpbnRlcmZhY2UKKyAgICAgICAgICogIGJ1dCBpcyB0cmlnZ2VyZWQgYnkgcHJvZmlsaW5nLiAgQ29kZSBnZW4gaW5zZXJ0cyBhbiBvdmVycmlkZQorICAgICAgICAgKiAgZm9yIHRoaXMgbWV0aG9kIGluIHRoZSByZWNvZ25pemVyLCB3aGljaCB0cmlnZ2VycyB0aGlzIG1ldGhvZC4KKyAgICAgICAgICogIENhbGxlZCBmcm9tIGFscmVhZHlQYXJzZWRSdWxlKCkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4YW1pbmVSdWxlTWVtb2l6YXRpb24oSUludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9wSW5kZXgsIC8vIGluZGV4IG9yIE1FTU9fUlVMRV9VTktOT1dOLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJ1bGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZXhhbWluZSBtZW1vICIgKyBydWxlTmFtZSArICIgYXQgIiArIGlucHV0LkluZGV4ICsgIjogIiArIHN0b3BJbmRleCk7CisgICAgICAgICAgICBpZiAoc3RvcEluZGV4ID09IEJhc2VSZWNvZ25pemVyLk1lbW9SdWxlVW5rbm93bikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicnVsZSAiK3J1bGVJbmRleCsiIG1pc3NlZCBAICIraW5wdXQuaW5kZXgoKSk7CisgICAgICAgICAgICAgICAgc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZU1pc3NlcysrOworICAgICAgICAgICAgICAgIHN0YXRzLm51bUd1ZXNzaW5nUnVsZUludm9jYXRpb25zKys7IC8vIHdlJ2xsIGhhdmUgdG8gZW50ZXIKKyAgICAgICAgICAgICAgICBDdXJyZW50RGVjaXNpb24oKS5udW1NZW1vaXphdGlvbkNhY2hlTWlzc2VzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiBydWxlIHN1Y2Nlc3MvZmFpbHVyZSwgaWYgaW4gY2FjaGUsIHdlIGhhdmUgYSBjYWNoZSBoaXQKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicnVsZSAiK3J1bGVJbmRleCsiIGhpdCBAICIraW5wdXQuaW5kZXgoKSk7CisgICAgICAgICAgICAgICAgc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZUhpdHMrKzsKKyAgICAgICAgICAgICAgICBDdXJyZW50RGVjaXNpb24oKS5udW1NZW1vaXphdGlvbkNhY2hlSGl0cysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIFdhcm5pbmc6IGRvZXNuJ3QgdHJhY2sgc3VjY2Vzcy9mYWlsdXJlLCBqdXN0IHVuaXF1ZSByZWNvcmRpbmcgZXZlbnQgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBNZW1vaXplKElJbnRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVsZVN0YXJ0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJ1bGVOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjb3VudCBob3cgbWFueSBlbnRyaWVzIGdvIGludG8gdGFibGUKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtZW1vaXplICIgKyBydWxlTmFtZSk7CisgICAgICAgICAgICBzdGF0cy5udW1NZW1vaXphdGlvbkNhY2hlRW50cmllcysrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTG9jYXRpb24oaW50IGxpbmUsIGludCBwb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRMaW5lLlB1c2gobGluZSk7CisgICAgICAgICAgICBjdXJyZW50UG9zLlB1c2gocG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVudGVyRGVjaXNpb24oaW50IGRlY2lzaW9uTnVtYmVyLCBib29sIGNvdWxkQmFja3RyYWNrKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24gPSBudWxsOworICAgICAgICAgICAgc3RhdHMubnVtRGVjaXNpb25FdmVudHMrKzsKKyAgICAgICAgICAgIGludCBzdGFydGluZ0xvb2thaGVhZEluZGV4ID0gcGFyc2VyLlRva2VuU3RyZWFtLkluZGV4OworICAgICAgICAgICAgSVRva2VuU3RyZWFtIGlucHV0ID0gcGFyc2VyLlRva2VuU3RyZWFtOworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImVudGVyRGVjaXNpb24gY2FuQmFja3RyYWNrPSIgKyBjb3VsZEJhY2t0cmFjayArICIgIiArIGRlY2lzaW9uTnVtYmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJhY2t0cmFjayBkZXB0aCAiICsgYmFja3RyYWNrRGVwdGggKworICAgICAgICAgICAgICAgICAgICAgICIgQCAiICsgaW5wdXQuR2V0KGlucHV0LkluZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAgIiBydWxlICIgKyBMb2NhdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIGcgPSBjdXJyZW50R3JhbW1hckZpbGVOYW1lLlBlZWsoKTsKKyAgICAgICAgICAgIERlY2lzaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVjaXNpb25zLkdldChnLCBkZWNpc2lvbk51bWJlcik7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgRGVjaXNpb25EZXNjcmlwdG9yKCk7CisgICAgICAgICAgICAgICAgZGVjaXNpb25zLlB1dChnLCBkZWNpc2lvbk51bWJlciwgZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5kZWNpc2lvbiA9IGRlY2lzaW9uTnVtYmVyOworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZU5hbWUgPSBjdXJyZW50R3JhbW1hckZpbGVOYW1lLlBlZWsoKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJ1bGVOYW1lID0gY3VycmVudFJ1bGVOYW1lLlBlZWsoKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmxpbmUgPSBjdXJyZW50TGluZS5QZWVrKCk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5wb3MgPSBjdXJyZW50UG9zLlBlZWsoKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmNvdWxkQmFja3RyYWNrID0gY291bGRCYWNrdHJhY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjcmlwdG9yLm4rKzsKKworICAgICAgICAgICAgRGVjaXNpb25FdmVudCBkID0gbmV3IERlY2lzaW9uRXZlbnQoKTsKKyAgICAgICAgICAgIGRlY2lzaW9uU3RhY2suUHVzaChkKTsKKyAgICAgICAgICAgIGQuZGVjaXNpb24gPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgZC5zdGFydFRpbWUgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICBkLnN0YXJ0SW5kZXggPSBzdGFydGluZ0xvb2thaGVhZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRXhpdERlY2lzaW9uKGludCBkZWNpc2lvbk51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgRGVjaXNpb25FdmVudCBkID0gZGVjaXNpb25TdGFjay5Qb3AoKTsKKyAgICAgICAgICAgIGQuc3RvcFRpbWUgPSBEYXRlVGltZS5Ob3c7CisKKyAgICAgICAgICAgIGludCBsYXN0VG9rZW5JbmRleCA9IGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgaW50IG51bUhpZGRlbiA9IEdldE51bWJlck9mSGlkZGVuVG9rZW5zKGQuc3RhcnRJbmRleCwgbGFzdFRva2VuSW5kZXgpOworICAgICAgICAgICAgaW50IGRlcHRoID0gbGFzdFRva2VuSW5kZXggLSBkLnN0YXJ0SW5kZXggLSBudW1IaWRkZW4gKyAxOyAvLyArMSBjb3VudHMgY29uc3VtaW5nIHN0YXJ0IHRva2VuIGFzIDEKKyAgICAgICAgICAgIGQuayA9IGRlcHRoOworICAgICAgICAgICAgZC5kZWNpc2lvbi5tYXhrID0gTWF0aC5NYXgoZC5kZWNpc2lvbi5tYXhrLCBkZXB0aCk7CisKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJleGl0RGVjaXNpb24gIiArIGRlY2lzaW9uTnVtYmVyICsgIiBpbiAiICsgZC5kZWNpc2lvbi5ydWxlTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9va2FoZWFkICIgKyBkLmsgKyAiIG1heCB0b2tlbiAiICsgbGFzdFJlYWxUb2tlblRvdWNoZWRJbkRlY2lzaW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVjaXNpb25FdmVudHMuQWRkKGQpOyAvLyBkb25lIHdpdGggZGVjaXNpb247IHRyYWNrIGFsbAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZVRva2VuKElUb2tlbiB0b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImNvbnN1bWUgdG9rZW4gIiArIHRva2VuKTsKKworICAgICAgICAgICAgaWYgKCFJbkRlY2lzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRzLm51bVRva2VucysrOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbi5Ub2tlbkluZGV4IDwgdG9rZW4uVG9rZW5JbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24gPSB0b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlY2lzaW9uRXZlbnQgZCA9IEN1cnJlbnREZWNpc2lvbigpOworICAgICAgICAgICAgLy8gY29tcHV0ZSBsb29rYWhlYWQgZGVwdGgKKyAgICAgICAgICAgIGludCB0aGlzUmVmSW5kZXggPSB0b2tlbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgaW50IG51bUhpZGRlbiA9IEdldE51bWJlck9mSGlkZGVuVG9rZW5zKGQuc3RhcnRJbmRleCwgdGhpc1JlZkluZGV4KTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IHRoaXNSZWZJbmRleCAtIGQuc3RhcnRJbmRleCAtIG51bUhpZGRlbiArIDE7IC8vICsxIGNvdW50cyBjb25zdW1pbmcgc3RhcnQgdG9rZW4gYXMgMQorICAgICAgICAgICAgLy9kLm1heGsgPSBNYXRoLm1heChkLm1heGssIGRlcHRoKTsKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjb25zdW1lICIgKyB0aGlzUmVmSW5kZXggKyAiICIgKyBkZXB0aCArICIgdG9rZW5zIGFoZWFkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmRlY2lzaW9uLnJ1bGVOYW1lICsgIi0iICsgZC5kZWNpc2lvbi5kZWNpc2lvbiArICIgc3RhcnQgaW5kZXggIiArIGQuc3RhcnRJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogVGhlIHBhcnNlciBpcyBpbiBhIGRlY2lzaW9uIGlmIHRoZSBkZWNpc2lvbiBkZXB0aCA+IDAuICBUaGlzCisgICAgICAgICAqICB3b3JrcyBmb3IgYmFja3RyYWNraW5nIGFsc28sIHdoaWNoIGNhbiBoYXZlIG5lc3RlZCBkZWNpc2lvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEluRGVjaXNpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2lzaW9uU3RhY2suQ291bnQgPiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKElUb2tlbiB0b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWUgaGlkZGVuIHRva2VuICIrdG9rZW4pOworICAgICAgICAgICAgaWYgKCFJbkRlY2lzaW9uKQorICAgICAgICAgICAgICAgIHN0YXRzLm51bUhpZGRlblRva2VucysrOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFRyYWNrIHJlZnMgdG8gbG9va2FoZWFkIGlmIGluIGEgZml4ZWQvbm9uZml4ZWQgZGVjaXNpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMVChpbnQgaSwgSVRva2VuIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJbkRlY2lzaW9uICYmIGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlY2lzaW9uRXZlbnQgZCA9IEN1cnJlbnREZWNpc2lvbigpOworICAgICAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkxUKCIgKyBpICsgIik9IiArIHQgKyAiIGluZGV4ICIgKyB0LlRva2VuSW5kZXggKyAiIHJlbGF0aXZlIHRvICIgKyBkLmRlY2lzaW9uLnJ1bGVOYW1lICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kZWNpc2lvbi5kZWNpc2lvbiArICIgc3RhcnQgaW5kZXggIiArIGQuc3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24uVG9rZW5JbmRleCA8IHQuVG9rZW5JbmRleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbiA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInNldCBsYXN0IHRva2VuICIgKyBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBnZXQgc3RhcnRpbmcgaW5kZXggb2ZmIHN0YWNrCisgICAgICAgICAgICAgICAgLy8JCQlpbnQgc3RhY2tUb3AgPSBsb29rYWhlYWRTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgICAgICAvLwkJCUludGVnZXIgc3RhcnRpbmdJbmRleCA9IChJbnRlZ2VyKWxvb2thaGVhZFN0YWNrLmdldChzdGFja1RvcCk7CisgICAgICAgICAgICAgICAgLy8JCQkvLyBjb21wdXRlIGxvb2thaGVhZCBkZXB0aAorICAgICAgICAgICAgICAgIC8vCQkJaW50IHRoaXNSZWZJbmRleCA9IHBhcnNlci5nZXRUb2tlblN0cmVhbSgpLmluZGV4KCk7CisgICAgICAgICAgICAgICAgLy8JCQlpbnQgbnVtSGlkZGVuID0KKyAgICAgICAgICAgICAgICAvLwkJCQlnZXROdW1iZXJPZkhpZGRlblRva2VucyhzdGFydGluZ0luZGV4LmludFZhbHVlKCksIHRoaXNSZWZJbmRleCk7CisgICAgICAgICAgICAgICAgLy8JCQlpbnQgZGVwdGggPSBpICsgdGhpc1JlZkluZGV4IC0gc3RhcnRpbmdJbmRleC5pbnRWYWx1ZSgpIC0gbnVtSGlkZGVuOworICAgICAgICAgICAgICAgIC8vCQkJLyoKKyAgICAgICAgICAgICAgICAvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTFQoIitpKyIpIEAgaW5kZXggIit0aGlzUmVmSW5kZXgrIiBpcyBkZXB0aCAiK2RlcHRoKworICAgICAgICAgICAgICAgIC8vCQkJCSIgbWF4IGlzICIrbWF4TG9va2FoZWFkSW5DdXJyZW50RGVjaXNpb24pOworICAgICAgICAgICAgICAgIC8vCQkJKi8KKyAgICAgICAgICAgICAgICAvLwkJCWlmICggZGVwdGg+bWF4TG9va2FoZWFkSW5DdXJyZW50RGVjaXNpb24gKSB7CisgICAgICAgICAgICAgICAgLy8JCQkJbWF4TG9va2FoZWFkSW5DdXJyZW50RGVjaXNpb24gPSBkZXB0aDsKKyAgICAgICAgICAgICAgICAvLwkJCX0KKyAgICAgICAgICAgICAgICAvLwkJCWQubWF4ayA9IGN1cnJlbnREZWNpc2lvbigpLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIFRyYWNrIGJhY2t0cmFja2luZyBkZWNpc2lvbnMuICBZb3UnbGwgc2VlIGEgZml4ZWQgb3IgY3ljbGljIGRlY2lzaW9uCisgICAgICAgICAqICBhbmQgdGhlbiBhIGJhY2t0cmFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogCQllbnRlciBydWxlCisgICAgICAgICAqIAkJLi4uCisgICAgICAgICAqIAkJZW50ZXIgZGVjaXNpb24KKyAgICAgICAgICogCQlMQSBhbmQgcG9zc2libHkgY29uc3VtZXMgKGZvciBjeWNsaWMgREZBcykKKyAgICAgICAgICogCQliZWdpbiBiYWNrdHJhY2sgbGV2ZWwKKyAgICAgICAgICogCQltYXJrIG0KKyAgICAgICAgICogCQlyZXdpbmQgbQorICAgICAgICAgKiAJCWVuZCBiYWNrdHJhY2sgbGV2ZWwsIHN1Y2Nlc3MKKyAgICAgICAgICogCQlleGl0IGRlY2lzaW9uCisgICAgICAgICAqIAkJLi4uCisgICAgICAgICAqIAkJZXhpdCBydWxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBCZWdpbkJhY2t0cmFjayhpbnQgbGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJlbnRlciBiYWNrdHJhY2sgIiArIGxldmVsKTsKKyAgICAgICAgICAgIGJhY2t0cmFja0RlcHRoKys7CisgICAgICAgICAgICBEZWNpc2lvbkV2ZW50IGUgPSBDdXJyZW50RGVjaXNpb24oKTsKKyAgICAgICAgICAgIGlmIChlLmRlY2lzaW9uLmNvdWxkQmFja3RyYWNrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRzLm51bUJhY2t0cmFja09jY3VycmVuY2VzKys7CisgICAgICAgICAgICAgICAgZS5kZWNpc2lvbi5udW1CYWNrdHJhY2tPY2N1cnJlbmNlcysrOworICAgICAgICAgICAgICAgIGUuYmFja3RyYWNrcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogU3VjY2Vzc2Z1bCBvciBub3QsIHRyYWNrIGhvdyBtdWNoIGxvb2thaGVhZCBzeW5wcmVkcyB1c2UgKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kQmFja3RyYWNrKGludCBsZXZlbCwgYm9vbCBzdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZXhpdCBiYWNrdHJhY2sgIiArIGxldmVsICsgIjogIiArIHN1Y2Nlc3NmdWwpOworICAgICAgICAgICAgYmFja3RyYWNrRGVwdGgtLTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE1hcmsoaW50IGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtYXJrICIgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJld2luZChpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInJld2luZCAiICsgaSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHVtcCkKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgicmV3aW5kIik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBEZWNpc2lvbkV2ZW50IEN1cnJlbnREZWNpc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWNpc2lvblN0YWNrLlBlZWsoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRzLm51bVJlcG9ydGVkRXJyb3JzKys7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZW1hbnRpY1ByZWRpY2F0ZShib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHMubnVtU2VtYW50aWNQcmVkaWNhdGVzKys7CisgICAgICAgICAgICBpZiAoSW5EZWNpc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNpc2lvbkV2ZW50IGQgPSBDdXJyZW50RGVjaXNpb24oKTsKKyAgICAgICAgICAgICAgICBkLmV2YWxTZW1QcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkLmRlY2lzaW9uLm51bVNlbVByZWRFdmFscysrOworICAgICAgICAgICAgICAgIGlmIChkdW1wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImV2YWwgIiArIHByZWRpY2F0ZSArICIgaW4gIiArIGQuZGVjaXNpb24ucnVsZU5hbWUgKyAiLSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5kZWNpc2lvbi5kZWNpc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgVGVybWluYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yZWFjaCAoRGVjaXNpb25FdmVudCBlIGluIGRlY2lzaW9uRXZlbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJkZWNpc2lvbiAiK2UuZGVjaXNpb24uZGVjaXNpb24rIjogaz0iK2Uuayk7CisgICAgICAgICAgICAgICAgZS5kZWNpc2lvbi5hdmdrICs9IGUuazsKKyAgICAgICAgICAgICAgICBzdGF0cy5hdmdrUGVyRGVjaXNpb25FdmVudCArPSBlLms7CisgICAgICAgICAgICAgICAgaWYgKGUuYmFja3RyYWNrcykKKyAgICAgICAgICAgICAgICB7IC8vIGRvZXNuJ3QgY291bnQgZ2F0ZWQgc3luIHByZWRzIG9uIERGQSBlZGdlcworICAgICAgICAgICAgICAgICAgICBzdGF0cy5hdmdrUGVyQmFja3RyYWNraW5nRGVjaXNpb25FdmVudCArPSBlLms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHMuYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3MgPSAwLjBmOworICAgICAgICAgICAgZm9yZWFjaCAoRGVjaXNpb25EZXNjcmlwdG9yIGQgaW4gZGVjaXNpb25zLlZhbHVlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRzLm51bURlY2lzaW9uc0NvdmVyZWQrKzsKKyAgICAgICAgICAgICAgICBkLmF2Z2sgLz0gKGZsb2F0KWQubjsKKyAgICAgICAgICAgICAgICBpZiAoZC5jb3VsZEJhY2t0cmFjaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzLm51bURlY2lzaW9uc1RoYXRQb3RlbnRpYWxseUJhY2t0cmFjaysrOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBwZXJjZW50QmFja3RyYWNrcyA9IGQubnVtQmFja3RyYWNrT2NjdXJyZW5jZXMgLyAoZmxvYXQpZC5uOworICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZGVjICIrZC5kZWNpc2lvbisiIGJhY2t0cmFja3MgIitwZXJjZW50QmFja3RyYWNrcyoxMDArIiUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3MgKz0gcGVyY2VudEJhY2t0cmFja3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBydWxlcyB0aGF0IGJhY2t0cmFjayBhbG9uZyBnYXRlZCBERkEgZWRnZXMKKyAgICAgICAgICAgICAgICBpZiAoZC5udW1CYWNrdHJhY2tPY2N1cnJlbmNlcyA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0cy5udW1EZWNpc2lvbnNUaGF0RG9CYWNrdHJhY2srKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0cy5hdmVyYWdlRGVjaXNpb25QZXJjZW50QmFja3RyYWNrcyAvPSBzdGF0cy5udW1EZWNpc2lvbnNUaGF0UG90ZW50aWFsbHlCYWNrdHJhY2s7CisgICAgICAgICAgICBzdGF0cy5hdmVyYWdlRGVjaXNpb25QZXJjZW50QmFja3RyYWNrcyAqPSAxMDA7IC8vIGl0J3MgYSBwZXJjZW50YWdlCisgICAgICAgICAgICBzdGF0cy5hdmdrUGVyRGVjaXNpb25FdmVudCAvPSBzdGF0cy5udW1EZWNpc2lvbkV2ZW50czsKKyAgICAgICAgICAgIHN0YXRzLmF2Z2tQZXJCYWNrdHJhY2tpbmdEZWNpc2lvbkV2ZW50IC89IChmbG9hdClzdGF0cy5udW1CYWNrdHJhY2tPY2N1cnJlbmNlczsKKworICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoVG9TdHJpbmcoKSk7CisgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZShHZXREZWNpc2lvblN0YXRzRHVtcCgpKTsKKworICAgICAgICAgICAgLy8JCVN0cmluZyBzdGF0cyA9IHRvTm90aWZ5U3RyaW5nKCk7CisgICAgICAgICAgICAvLwkJdHJ5IHsKKyAgICAgICAgICAgIC8vCQkJU3RhdHMud3JpdGVSZXBvcnQoUlVOVElNRV9TVEFUU19GSUxFTkFNRSxzdGF0cyk7CisgICAgICAgICAgICAvLwkJfQorICAgICAgICAgICAgLy8JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIC8vCQkJU3lzdGVtLmVyci5wcmludGxuKGlvZSk7CisgICAgICAgICAgICAvLwkJCWlvZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgICAgICAvLwkJfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRQYXJzZXIoRGVidWdQYXJzZXIgcGFyc2VyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFIgRSBQIE8gUiBUIEkgTiBHCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvTm90aWZ5U3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmLkFwcGVuZChWZXJzaW9uKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKHBhcnNlci5HZXRUeXBlKCkuTmFtZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bVJ1bGVJbnZvY2F0aW9ucyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG1heFJ1bGVJbnZvY2F0aW9uRGVwdGgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1GaXhlZERlY2lzaW9ucyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLm1pbihkZWNpc2lvbk1heEZpeGVkTG9va2FoZWFkcykpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5tYXgoZGVjaXNpb25NYXhGaXhlZExvb2thaGVhZHMpKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoU3RhdHMuYXZnKGRlY2lzaW9uTWF4Rml4ZWRMb29rYWhlYWRzKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLnN0ZGRldihkZWNpc2lvbk1heEZpeGVkTG9va2FoZWFkcykpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1DeWNsaWNEZWNpc2lvbnMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5taW4oZGVjaXNpb25NYXhDeWNsaWNMb29rYWhlYWRzKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLm1heChkZWNpc2lvbk1heEN5Y2xpY0xvb2thaGVhZHMpKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoU3RhdHMuYXZnKGRlY2lzaW9uTWF4Q3ljbGljTG9va2FoZWFkcykpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChTdGF0cy5zdGRkZXYoZGVjaXNpb25NYXhDeWNsaWNMb29rYWhlYWRzKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bUJhY2t0cmFja0RlY2lzaW9ucyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLm1pbih0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLm1heCh0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLmF2Zyh0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKFN0YXRzLnN0ZGRldih0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bVNlbWFudGljUHJlZGljYXRlcyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKHBhcnNlci5nZXRUb2tlblN0cmVhbSgpLnNpemUoKSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bUhpZGRlblRva2Vucyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bUNoYXJzTWF0Y2hlZCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bUhpZGRlbkNoYXJzTWF0Y2hlZCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgnXHQnKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG51bWJlclJlcG9ydGVkRXJyb3JzKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobnVtTWVtb2l6YXRpb25DYWNoZUhpdHMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1NZW1vaXphdGlvbkNhY2hlTWlzc2VzKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCdcdCcpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobnVtR3Vlc3NpbmdSdWxlSW52b2NhdGlvbnMpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoJ1x0Jyk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChudW1NZW1vaXphdGlvbkNhY2hlRW50cmllcyk7CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKEdldFJlcG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFByb2ZpbGVTdGF0cyBHZXRSZXBvcnQoKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lUb2tlblN0cmVhbSBpbnB1dCA9IHBhcnNlci5Ub2tlblN0cmVhbTsKKyAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5Db3VudCAmJiBsYXN0UmVhbFRva2VuVG91Y2hlZEluRGVjaXNpb24gIT0gbnVsbCAmJiBpIDw9IGxhc3RSZWFsVG9rZW5Ub3VjaGVkSW5EZWNpc2lvbi5Ub2tlbkluZGV4OyBpKyspCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIElUb2tlbiB0ID0gaW5wdXQuR2V0KGkpOworICAgICAgICAgICAgLy8gICAgaWYgKHQuQ2hhbm5lbCAhPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQpCisgICAgICAgICAgICAvLyAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgc3RhdHMubnVtSGlkZGVuVG9rZW5zKys7CisgICAgICAgICAgICAvLyAgICAgICAgc3RhdHMubnVtSGlkZGVuQ2hhcnNNYXRjaGVkICs9IHQuVGV4dC5MZW5ndGg7CisgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIHN0YXRzLlZlcnNpb24gPSBWZXJzaW9uOworICAgICAgICAgICAgc3RhdHMubmFtZSA9IHBhcnNlci5HZXRUeXBlKCkuTmFtZTsKKyAgICAgICAgICAgIHN0YXRzLm51bVVuaXF1ZVJ1bGVzSW52b2tlZCA9IHVuaXF1ZVJ1bGVzLkNvdW50OworICAgICAgICAgICAgLy9zdGF0cy5udW1DaGFyc01hdGNoZWQgPSBsYXN0VG9rZW5Db25zdW1lZC5nZXRTdG9wSW5kZXgoKSArIDE7CisgICAgICAgICAgICByZXR1cm4gc3RhdHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBEb3VibGVLZXlNYXA8c3RyaW5nLCBpbnQsIERlY2lzaW9uRGVzY3JpcHRvcj4gR2V0RGVjaXNpb25TdGF0cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWNpc2lvbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBSZWFkT25seUNvbGxlY3Rpb248RGVjaXNpb25FdmVudD4gRGVjaXNpb25FdmVudHMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2lzaW9uRXZlbnRzLkFzUmVhZE9ubHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRvU3RyaW5nKFByb2ZpbGVTdGF0cyBzdGF0cykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiQU5UTFIgUnVudGltZSBSZXBvcnQ7IFByb2ZpbGUgVmVyc2lvbiAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMuVmVyc2lvbik7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgicGFyc2VyIG5hbWUgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm5hbWUpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIk51bWJlciBvZiBydWxlIGludm9jYXRpb25zICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1SdWxlSW52b2NhdGlvbnMpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIk51bWJlciBvZiB1bmlxdWUgcnVsZXMgdmlzaXRlZCAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMubnVtVW5pcXVlUnVsZXNJbnZva2VkKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTmV3TGluZSk7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJOdW1iZXIgb2YgZGVjaXNpb24gZXZlbnRzICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1EZWNpc2lvbkV2ZW50cyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiTnVtYmVyIG9mIHJ1bGUgaW52b2NhdGlvbnMgd2hpbGUgYmFja3RyYWNraW5nICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1HdWVzc2luZ1J1bGVJbnZvY2F0aW9ucyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibWF4IHJ1bGUgaW52b2NhdGlvbiBuZXN0aW5nIGRlcHRoICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5tYXhSdWxlSW52b2NhdGlvbkRlcHRoKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTmV3TGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibnVtYmVyIG9mIGZpeGVkIGxvb2thaGVhZCBkZWNpc2lvbnMgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWluIGxvb2thaGVhZCB1c2VkIGluIGEgZml4ZWQgbG9va2FoZWFkIGRlY2lzaW9uICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoIm1heCBsb29rYWhlYWQgdXNlZCBpbiBhIGZpeGVkIGxvb2thaGVhZCBkZWNpc2lvbiAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJhdmVyYWdlIGxvb2thaGVhZCBkZXB0aCB1c2VkIGluIGZpeGVkIGxvb2thaGVhZCBkZWNpc2lvbnMgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgic3RhbmRhcmQgZGV2aWF0aW9uIG9mIGRlcHRoIHVzZWQgaW4gZml4ZWQgbG9va2FoZWFkIGRlY2lzaW9ucyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJudW1iZXIgb2YgYXJiaXRyYXJ5IGxvb2thaGVhZCBkZWNpc2lvbnMgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWluIGxvb2thaGVhZCB1c2VkIGluIGFuIGFyYml0cmFyeSBsb29rYWhlYWQgZGVjaXNpb24gIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWF4IGxvb2thaGVhZCB1c2VkIGluIGFuIGFyYml0cmFyeSBsb29rYWhlYWQgZGVjaXNpb24gIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgiYXZlcmFnZSBsb29rYWhlYWQgZGVwdGggdXNlZCBpbiBhcmJpdHJhcnkgbG9va2FoZWFkIGRlY2lzaW9ucyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGVwdGggdXNlZCBpbiBhcmJpdHJhcnkgbG9va2FoZWFkIGRlY2lzaW9ucyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJudW1iZXIgb2YgZXZhbHVhdGVkIHN5bnRhY3RpYyBwcmVkaWNhdGVzICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoIm1pbiBsb29rYWhlYWQgdXNlZCBpbiBhIHN5bnRhY3RpYyBwcmVkaWNhdGUgIik7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZCgibWF4IGxvb2thaGVhZCB1c2VkIGluIGEgc3ludGFjdGljIHByZWRpY2F0ZSAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCJhdmVyYWdlIGxvb2thaGVhZCBkZXB0aCB1c2VkIGluIHN5bnRhY3RpYyBwcmVkaWNhdGVzICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoInN0YW5kYXJkIGRldmlhdGlvbiBvZiBkZXB0aCB1c2VkIGluIHN5bnRhY3RpYyBwcmVkaWNhdGVzICIpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgicnVsZSBtZW1vaXphdGlvbiBjYWNoZSBzaXplICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1NZW1vaXphdGlvbkNhY2hlRW50cmllcyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIHJ1bGUgbWVtb2l6YXRpb24gY2FjaGUgaGl0cyAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZUhpdHMpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm51bWJlciBvZiBydWxlIG1lbW9pemF0aW9uIGNhY2hlIG1pc3NlcyAiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RhdHMubnVtTWVtb2l6YXRpb25DYWNoZU1pc3Nlcyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgLy8JCWJ1Zi5BcHBlbmQoIm51bWJlciBvZiBldmFsdWF0ZWQgc2VtYW50aWMgcHJlZGljYXRlcyAiKTsKKyAgICAgICAgICAgIC8vCQlidWYuQXBwZW5kKCk7CisgICAgICAgICAgICAvLwkJYnVmLkFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm51bWJlciBvZiB0b2tlbnMgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm51bVRva2Vucyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIGhpZGRlbiB0b2tlbnMgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm51bUhpZGRlblRva2Vucyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIGNoYXIgIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKHN0YXRzLm51bUNoYXJzTWF0Y2hlZCk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibnVtYmVyIG9mIGhpZGRlbiBjaGFyICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1IaWRkZW5DaGFyc01hdGNoZWQpOworICAgICAgICAgICAgYnVmLkFwcGVuZChOZXdMaW5lKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm51bWJlciBvZiBzeW50YXggZXJyb3JzICIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChzdGF0cy5udW1SZXBvcnRlZEVycm9ycyk7CisgICAgICAgICAgICBidWYuQXBwZW5kKE5ld0xpbmUpOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEdldERlY2lzaW9uU3RhdHNEdW1wKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgibG9jYXRpb24iKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJuIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKERhdGFTZXBhcmF0b3IpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiYXZnayIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIm1heGsiKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICBidWYuQXBwZW5kKCJzeW5wcmVkIik7CisgICAgICAgICAgICBidWYuQXBwZW5kKERhdGFTZXBhcmF0b3IpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgic2VtcHJlZCIpOworICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoImNhbmJhY2t0cmFjayIpOworICAgICAgICAgICAgYnVmLkFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBmaWxlTmFtZSBpbiBkZWNpc2lvbnMuS2V5U2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGQgaW4gZGVjaXNpb25zLktleVNldChmaWxlTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWNpc2lvbkRlc2NyaXB0b3IgcyA9IGRlY2lzaW9ucy5HZXQoZmlsZU5hbWUsIGQpOworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHMuZGVjaXNpb24pOworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCJAIik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTG9jYXRpb25EZXNjcmlwdGlvbihzLmZpbGVOYW1lLCBzLnJ1bGVOYW1lLCBzLmxpbmUsIHMucG9zKSk7IC8vIGRlY2lzaW9uIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKERhdGFTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHMubik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoc3RyaW5nLkZvcm1hdCgiezB9Iiwgcy5hdmdrKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQocy5tYXhrKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChzLm51bUJhY2t0cmFja09jY3VycmVuY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChEYXRhU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZChzLm51bVNlbVByZWRFdmFscyk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoRGF0YVNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQocy5jb3VsZEJhY2t0cmFjayA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoTmV3TGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgaW50W10gVHJpbShpbnRbXSBYLCBpbnQgbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG4gPCBYLkxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRbXSB0cmltbWVkID0gbmV3IGludFtuXTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KFgsIDAsIHRyaW1tZWQsIDAsIG4pOworICAgICAgICAgICAgICAgIFggPSB0cmltbWVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFg7CisgICAgICAgIH0KKworICAgICAgICAvKiogR2V0IG51bSBoaWRkZW4gdG9rZW5zIGJldHdlZW4gaS4uaiBpbmNsdXNpdmUgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldE51bWJlck9mSGlkZGVuVG9rZW5zKGludCBpLCBpbnQgaikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgSVRva2VuU3RyZWFtIGlucHV0ID0gcGFyc2VyLlRva2VuU3RyZWFtOworICAgICAgICAgICAgZm9yIChpbnQgdGkgPSBpOyB0aSA8IGlucHV0LkNvdW50ICYmIHRpIDw9IGo7IHRpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRva2VuIHQgPSBpbnB1dC5HZXQodGkpOworICAgICAgICAgICAgICAgIGlmICh0LkNoYW5uZWwgIT0gVG9rZW5DaGFubmVscy5EZWZhdWx0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgc3RyaW5nIExvY2F0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTG9jYXRpb25EZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBjdXJyZW50R3JhbW1hckZpbGVOYW1lLlBlZWsoKSwKKyAgICAgICAgICAgICAgICBjdXJyZW50UnVsZU5hbWUuUGVlaygpLAorICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLlBlZWsoKSwKKyAgICAgICAgICAgICAgICBjdXJyZW50UG9zLlBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgTG9jYXRpb25EZXNjcmlwdGlvbihzdHJpbmcgZmlsZSwgc3RyaW5nIHJ1bGUsIGludCBsaW5lLCBpbnQgcG9zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmlsZSArICI6IiArIGxpbmUgKyAiOiIgKyBwb3MgKyAiKCIgKyBydWxlICsgIikiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFByb2ZpbGVTdGF0cworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFZlcnNpb247CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIG5hbWU7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bVJ1bGVJbnZvY2F0aW9uczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtVW5pcXVlUnVsZXNJbnZva2VkOworICAgICAgICAgICAgcHVibGljIGludCBudW1EZWNpc2lvbkV2ZW50czsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtRGVjaXNpb25zQ292ZXJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtRGVjaXNpb25zVGhhdFBvdGVudGlhbGx5QmFja3RyYWNrOworICAgICAgICAgICAgcHVibGljIGludCBudW1EZWNpc2lvbnNUaGF0RG9CYWNrdHJhY2s7CisgICAgICAgICAgICBwdWJsaWMgaW50IG1heFJ1bGVJbnZvY2F0aW9uRGVwdGg7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgYXZna1BlckRlY2lzaW9uRXZlbnQ7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgYXZna1BlckJhY2t0cmFja2luZ0RlY2lzaW9uRXZlbnQ7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgYXZlcmFnZURlY2lzaW9uUGVyY2VudEJhY2t0cmFja3M7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUJhY2t0cmFja09jY3VycmVuY2VzOyAvLyBkb2Vzbid0IGNvdW50IGdhdGVkIERGQSBlZGdlcworCisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUZpeGVkRGVjaXNpb25zOworICAgICAgICAgICAgcHVibGljIGludCBtaW5EZWNpc2lvbk1heEZpeGVkTG9va2FoZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbWF4RGVjaXNpb25NYXhGaXhlZExvb2thaGVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IGF2Z0RlY2lzaW9uTWF4Rml4ZWRMb29rYWhlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBzdGRkZXZEZWNpc2lvbk1heEZpeGVkTG9va2FoZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtQ3ljbGljRGVjaXNpb25zOworICAgICAgICAgICAgcHVibGljIGludCBtaW5EZWNpc2lvbk1heEN5Y2xpY0xvb2thaGVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG1heERlY2lzaW9uTWF4Q3ljbGljTG9va2FoZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYXZnRGVjaXNpb25NYXhDeWNsaWNMb29rYWhlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBzdGRkZXZEZWNpc2lvbk1heEN5Y2xpY0xvb2thaGVhZHM7CisgICAgICAgICAgICAvLwkJaW50IFN0YXRzLm1pbih0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpOworICAgICAgICAgICAgLy8JCWludCBTdGF0cy5tYXgodG9BcnJheShkZWNpc2lvbk1heFN5blByZWRMb29rYWhlYWRzKTsKKyAgICAgICAgICAgIC8vCQlpbnQgU3RhdHMuYXZnKHRvQXJyYXkoZGVjaXNpb25NYXhTeW5QcmVkTG9va2FoZWFkcyk7CisgICAgICAgICAgICAvLwkJaW50IFN0YXRzLnN0ZGRldih0b0FycmF5KGRlY2lzaW9uTWF4U3luUHJlZExvb2thaGVhZHMpOworICAgICAgICAgICAgcHVibGljIGludCBudW1TZW1hbnRpY1ByZWRpY2F0ZXM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bVRva2VuczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtSGlkZGVuVG9rZW5zOworICAgICAgICAgICAgcHVibGljIGludCBudW1DaGFyc01hdGNoZWQ7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUhpZGRlbkNoYXJzTWF0Y2hlZDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtUmVwb3J0ZWRFcnJvcnM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bU1lbW9pemF0aW9uQ2FjaGVIaXRzOworICAgICAgICAgICAgcHVibGljIGludCBudW1NZW1vaXphdGlvbkNhY2hlTWlzc2VzOworICAgICAgICAgICAgcHVibGljIGludCBudW1HdWVzc2luZ1J1bGVJbnZvY2F0aW9uczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtTWVtb2l6YXRpb25DYWNoZUVudHJpZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRGVjaXNpb25EZXNjcmlwdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZGVjaXNpb247CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIGZpbGVOYW1lOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBydWxlTmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbGluZTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcG9zOworICAgICAgICAgICAgcHVibGljIGJvb2wgY291bGRCYWNrdHJhY2s7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbjsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBhdmdrOyAvLyBhdmcgYWNyb3NzIGFsbCBkZWNpc2lvbiBldmVudHMKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbWF4azsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtQmFja3RyYWNrT2NjdXJyZW5jZXM7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bVNlbVByZWRFdmFsczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbCBhYm91dCBhIHNwZWNpZmljIGV4ZWMgb2YgYSBzaW5nbGUgZGVjaXNpb24KKyAgICAgICAgcHVibGljIGNsYXNzIERlY2lzaW9uRXZlbnQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIERlY2lzaW9uRGVzY3JpcHRvciBkZWNpc2lvbjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc3RhcnRJbmRleDsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgazsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGJhY2t0cmFja3M7IC8vIGRvZXNuJ3QgY291bnQgZ2F0ZWQgREZBIGVkZ2VzCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBldmFsU2VtUHJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBEYXRlVGltZSBzdGFydFRpbWU7CisgICAgICAgICAgICBwdWJsaWMgRGF0ZVRpbWUgc3RvcFRpbWU7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bU1lbW9pemF0aW9uQ2FjaGVIaXRzOworICAgICAgICAgICAgcHVibGljIGludCBudW1NZW1vaXphdGlvbkNhY2hlTWlzc2VzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Yzk4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw3MCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSggIkFudGxyMy5SdW50aW1lLkRlYnVnIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCAiIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oICIiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSggIlBpeGVsIE1pbmUsIEluYy4iICldCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCggIkFudGxyMy5SdW50aW1lLkRlYnVnIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCggIkNvcHlyaWdodCDCqSBQaXhlbCBNaW5lIDIwMTAiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCAiIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoICIiICldCitbYXNzZW1ibHk6IENMU0NvbXBsaWFudCggdHJ1ZSApXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUgCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKCBmYWxzZSApXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCggIjlmOGZhMDE4LTY3NjYtNDA0Yy05ZTcyLTU1MTQwN2UxYjE3MyIgKV0KKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgZm91ciB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqCisgKiAgIE1ham9yLk1pbm9yLkJ1aWxkLlJldmlzaW9uCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nOgorICogICAxLiBNYWpvci5NaW5vciBmb2xsb3dzIHRoZSBBTlRMUiByZWxlYXNlIHNjaGVkdWxlCisgKiAgIDIuIEJ1aWxkIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgQyMgcG9ydCBpcyBwYWNrYWdlZCBmb3IgcmVsZWFzZSAocmVnYXJkbGVzcworICogICAgICBvZiB3aGV0aGVyIGl0J3MgYW4gaW5jcmVtZW50YWwgb3IgbmlnaHRseSkuIFRoZSB2YWx1ZSByZXNldHMgdG8gemVybyB3aGVuZXZlcgorICogICAgICB0aGUgTWFqb3Igb3IgTWlub3IgdmVyc2lvbiBpcyBpbmNyZW1lbnRlZC4KKyAqICAgMy4gUmV2aXNpb24gaXMgdGhlIFBlcmZvcmNlIGNoYW5nZWxpc3QgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzZS4KKyAqLworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjMuMy40Ljg1MTciKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMy4zLjQuODUxNyIpXQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL1JlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5MDA2NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuY3MKQEAgLTAsMCArMSw3NDQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuRGVidWcKK3sKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zOworCisgICAgdXNpbmcgQXJyYXkgPSBTeXN0ZW0uQXJyYXk7CisgICAgdXNpbmcgQmFzZVRyZWUgPSBBbnRsci5SdW50aW1lLlRyZWUuQmFzZVRyZWU7CisgICAgdXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgSU9FeGNlcHRpb24gPSBTeXN0ZW0uSU8uSU9FeGNlcHRpb247CisgICAgdXNpbmcgSVRyZWUgPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWU7CisgICAgdXNpbmcgTWF0aCA9IFN5c3RlbS5NYXRoOworICAgIHVzaW5nIFNvY2tldCA9IFN5c3RlbS5OZXQuU29ja2V0cy5Tb2NrZXQ7CisgICAgdXNpbmcgU29ja2V0RXhjZXB0aW9uID0gU3lzdGVtLk5ldC5Tb2NrZXRzLlNvY2tldEV4Y2VwdGlvbjsKKyAgICB1c2luZyBUZXh0UmVhZGVyID0gU3lzdGVtLklPLlRleHRSZWFkZXI7CisgICAgdXNpbmcgVGV4dFdyaXRlciA9IFN5c3RlbS5JTy5UZXh0V3JpdGVyOworCisgICAgcHVibGljIGNsYXNzIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgY29uc3QgaW50IE1BWF9FVkVOVF9FTEVNRU5UUyA9IDg7CisgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgbGlzdGVuZXI7CisgICAgICAgIHN0cmluZyBtYWNoaW5lOworICAgICAgICBpbnQgcG9ydDsKKyAgICAgICAgU29ja2V0IGNoYW5uZWwgPSBudWxsOworICAgICAgICBUZXh0V3JpdGVyIEBvdXQ7CisgICAgICAgIFRleHRSZWFkZXIgQGluOworICAgICAgICBzdHJpbmcgQGV2ZW50OworICAgICAgICAvKiogPHN1bW1hcnk+VmVyc2lvbiBvZiBBTlRMUiAoZGljdGF0ZXMgZXZlbnRzKTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHN0cmluZyB2ZXJzaW9uOworICAgICAgICBwdWJsaWMgc3RyaW5nIGdyYW1tYXJGaWxlTmFtZTsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJhY2sgdGhlIGxhc3QgdG9rZW4gaW5kZXggd2Ugc2F3IGR1cmluZyBhIGNvbnN1bWUuICBJZiBzYW1lLCB0aGVuCisgICAgICAgICAqICBzZXQgYSBmbGFnIHRoYXQgd2UgaGF2ZSBhIHByb2JsZW0uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgcHJldmlvdXNUb2tlbkluZGV4ID0gLTE7CisgICAgICAgIGJvb2wgdG9rZW5JbmRleGVzSW52YWxpZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBjbGFzcyBQcm94eVRva2VuIDogSVRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGNoYW5uZWw7CisgICAgICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgICAgIGludCBjaGFyUG9zOworICAgICAgICAgICAgc3RyaW5nIHRleHQ7CisgICAgICAgICAgICBwdWJsaWMgUHJveHlUb2tlbiggaW50IGluZGV4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgUHJveHlUb2tlbiggaW50IGluZGV4LCBpbnQgdHlwZSwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgaW50IGNoYXJQb3MsIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICAgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFyUG9zID0gY2hhclBvczsKKyAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjcmVnaW9uIElUb2tlbiBNZW1iZXJzCisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIFRleHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgVHlwZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBMaW5lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW5lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IENoYXJQb3NpdGlvbkluTGluZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJQb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhclBvcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBDaGFubmVsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IFN0YXJ0SW5kZXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBTdG9wSW5kZXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBUb2tlbkluZGV4CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJQ2hhclN0cmVhbSBJbnB1dFN0cmVhbQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKKyAgICAgICAgICAgICAgICBpZiAoIGNoYW5uZWwgIT0gVG9rZW5DaGFubmVscy5EZWZhdWx0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxTdHIgPSAiLGNoYW5uZWw9IiArIGNoYW5uZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAiWyIgKyBUZXh0ICsgIi88IiArIHR5cGUgKyAiPiIgKyBjaGFubmVsU3RyICsgIiwiICsgbGluZSArICI6IiArIENoYXJQb3NpdGlvbkluTGluZSArICIsQCIgKyBpbmRleCArICJdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBQcm94eVRyZWUgOiBCYXNlVHJlZQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IElEOworICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNoYXJQb3MgPSAtMTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgdG9rZW5JbmRleCA9IC0xOworICAgICAgICAgICAgc3RyaW5nIHRleHQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVRyZWUoIGludCBJRCwgaW50IHR5cGUsIGludCBsaW5lLCBpbnQgY2hhclBvcywgaW50IHRva2VuSW5kZXgsIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLklEID0gSUQ7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOworICAgICAgICAgICAgICAgIHRoaXMuY2hhclBvcyA9IGNoYXJQb3M7CisgICAgICAgICAgICAgICAgdGhpcy50b2tlbkluZGV4ID0gdG9rZW5JbmRleDsKKyAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUHJveHlUcmVlKCBpbnQgSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuSUQgPSBJRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRleHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUb2tlblN0YXJ0SW5kZXgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUb2tlblN0b3BJbmRleAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFR5cGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRyZWUgRHVwTm9kZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiZml4IHRoaXMiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciggSURlYnVnRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFjaGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHRoaXMubWFjaGluZSA9IG1hY2hpbmU7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworCisgICAgICAgICAgICBpZiAoICFPcGVuQ29ubmVjdGlvbigpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU29ja2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEhhbmRzaGFrZSgpOworICAgICAgICAgICAgICAgIEBldmVudCA9IEBpbi5SZWFkTGluZSgpOworICAgICAgICAgICAgICAgIHdoaWxlICggQGV2ZW50ICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGlzcGF0Y2goIEBldmVudCApOworICAgICAgICAgICAgICAgICAgICBBY2soKTsKKyAgICAgICAgICAgICAgICAgICAgQGV2ZW50ID0gQGluLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIGUgKTsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25FeHRlbnNpb25zLlByaW50U3RhY2tUcmFjZSggZSwgQ29uc29sZS5FcnJvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBPcGVuQ29ubmVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIC8vY2hhbm5lbCA9IG5ldyBTb2NrZXQoIG1hY2hpbmUsIHBvcnQgKTsKKyAgICAgICAgICAgICAgICAvL2NoYW5uZWwuc2V0VGNwTm9EZWxheSggdHJ1ZSApOworICAgICAgICAgICAgICAgIC8vT3V0cHV0U3RyZWFtIG9zID0gY2hhbm5lbC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAvL091dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBvcywgIlVURjgiICk7CisgICAgICAgICAgICAgICAgLy9Ab3V0ID0gbmV3IFByaW50V3JpdGVyKCBuZXcgQnVmZmVyZWRXcml0ZXIoIG9zdyApICk7CisgICAgICAgICAgICAgICAgLy9JbnB1dFN0cmVhbSBAaXMgPSBjaGFubmVsLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgLy9JbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIEBpcywgIlVURjgiICk7CisgICAgICAgICAgICAgICAgLy9AaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoIGlzciApOworICAgICAgICAgICAgICAgIC8vc3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSggZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIENsb3NlQ29ubmVjdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBpbi5DbG9zZSgpOworICAgICAgICAgICAgICAgIEBpbiA9IG51bGw7CisgICAgICAgICAgICAgICAgQG91dC5DbG9zZSgpOworICAgICAgICAgICAgICAgIEBvdXQgPSBudWxsOworICAgICAgICAgICAgICAgIGNoYW5uZWwuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCBlICk7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uRXh0ZW5zaW9ucy5QcmludFN0YWNrVHJhY2UoIGUsIENvbnNvbGUuRXJyb3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIEBpbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBAaW4uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGlvZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCBpb2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIEBvdXQgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBAb3V0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggY2hhbm5lbCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpb2UgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSggaW9lICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgSGFuZHNoYWtlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGFudGxyTGluZSA9IEBpbi5SZWFkTGluZSgpOworICAgICAgICAgICAgc3RyaW5nW10gYW50bHJFbGVtZW50cyA9IEdldEV2ZW50RWxlbWVudHMoIGFudGxyTGluZSApOworICAgICAgICAgICAgdmVyc2lvbiA9IGFudGxyRWxlbWVudHNbMV07CisgICAgICAgICAgICBzdHJpbmcgZ3JhbW1hckxpbmUgPSBAaW4uUmVhZExpbmUoKTsKKyAgICAgICAgICAgIHN0cmluZ1tdIGdyYW1tYXJFbGVtZW50cyA9IEdldEV2ZW50RWxlbWVudHMoIGdyYW1tYXJMaW5lICk7CisgICAgICAgICAgICBncmFtbWFyRmlsZU5hbWUgPSBncmFtbWFyRWxlbWVudHNbMV07CisgICAgICAgICAgICBBY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLkNvbW1lbmNlKCk7IC8vIGluZm9ybSBsaXN0ZW5lciBhZnRlciBoYW5kc2hha2UKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgQG91dC5Xcml0ZUxpbmUoICJhY2siICk7CisgICAgICAgICAgICBAb3V0LkZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3BhdGNoKCBzdHJpbmcgbGluZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vSlN5c3RlbS5Ab3V0LnByaW50bG4oICJldmVudDogIiArIGxpbmUgKTsKKyAgICAgICAgICAgIHN0cmluZ1tdIGVsZW1lbnRzID0gR2V0RXZlbnRFbGVtZW50cyggbGluZSApOworICAgICAgICAgICAgaWYgKCBlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzWzBdID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCAidW5rbm93biBkZWJ1ZyBldmVudDogIiArIGxpbmUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImVudGVyUnVsZSIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJSdWxlKCBlbGVtZW50c1sxXSwgZWxlbWVudHNbMl0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJleGl0UnVsZSIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRXhpdFJ1bGUoIGVsZW1lbnRzWzFdLCBlbGVtZW50c1syXSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImVudGVyQWx0IiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FbnRlckFsdCggaW50LlBhcnNlKCBlbGVtZW50c1sxXSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAiZW50ZXJTdWJSdWxlIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FbnRlclN1YlJ1bGUoIGludC5QYXJzZSggZWxlbWVudHNbMV0gKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImV4aXRTdWJSdWxlIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FeGl0U3ViUnVsZSggaW50LlBhcnNlKCBlbGVtZW50c1sxXSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAiZW50ZXJEZWNpc2lvbiIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW50ZXJEZWNpc2lvbihpbnQuUGFyc2UoZWxlbWVudHNbMV0pLCBlbGVtZW50c1syXS5FcXVhbHMoInRydWUiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAiZXhpdERlY2lzaW9uIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FeGl0RGVjaXNpb24oIGludC5QYXJzZSggZWxlbWVudHNbMV0gKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImxvY2F0aW9uIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5Mb2NhdGlvbiggaW50LlBhcnNlKCBlbGVtZW50c1sxXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZSggZWxlbWVudHNbMl0gKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImNvbnN1bWVUb2tlbiIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJveHlUb2tlbiB0ID0gRGVzZXJpYWxpemVUb2tlbiggZWxlbWVudHMsIDEgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHQuVG9rZW5JbmRleCA9PSBwcmV2aW91c1Rva2VuSW5kZXggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5JbmRleGVzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZpb3VzVG9rZW5JbmRleCA9IHQuVG9rZW5JbmRleDsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5Db25zdW1lVG9rZW4oIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJjb25zdW1lSGlkZGVuVG9rZW4iICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByb3h5VG9rZW4gdCA9IERlc2VyaWFsaXplVG9rZW4oIGVsZW1lbnRzLCAxICk7CisgICAgICAgICAgICAgICAgaWYgKCB0LlRva2VuSW5kZXggPT0gcHJldmlvdXNUb2tlbkluZGV4ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuSW5kZXhlc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2aW91c1Rva2VuSW5kZXggPSB0LlRva2VuSW5kZXg7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZUhpZGRlblRva2VuKCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAiTFQiICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gRGVzZXJpYWxpemVUb2tlbiggZWxlbWVudHMsIDIgKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5MVCggaW50LlBhcnNlKCBlbGVtZW50c1sxXSApLCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAibWFyayIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTWFyayggaW50LlBhcnNlKCBlbGVtZW50c1sxXSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAicmV3aW5kIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGVsZW1lbnRzWzFdICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuUmV3aW5kKCBpbnQuUGFyc2UoIGVsZW1lbnRzWzFdICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuUmV3aW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImJlZ2luQmFja3RyYWNrIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5CZWdpbkJhY2t0cmFjayggaW50LlBhcnNlKCBlbGVtZW50c1sxXSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAiZW5kQmFja3RyYWNrIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzFdICk7CisgICAgICAgICAgICAgICAgaW50IHN1Y2Nlc3NJID0gaW50LlBhcnNlKCBlbGVtZW50c1syXSApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkVuZEJhY2t0cmFjayggbGV2ZWwsIHN1Y2Nlc3NJID09IERlYnVnRXZlbnRMaXN0ZW5lckNvbnN0YW50cy5UcnVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAiZXhjZXB0aW9uIiApICkKKyAgICAgICAgICAgIHsKKyNpZiB0cnVlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBzdHJpbmcgZXhjTmFtZSA9IGVsZW1lbnRzWzFdOworICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleFMgPSBlbGVtZW50c1syXTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgbGluZVMgPSBlbGVtZW50c1szXTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcG9zUyA9IGVsZW1lbnRzWzRdOworICAgICAgICAgICAgICAgIENsYXNzIGV4Y0NsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4Y0NsYXNzID0gQ2xhc3MuZm9yTmFtZSggZXhjTmFtZSApOworICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChSZWNvZ25pdGlvbkV4Y2VwdGlvbilleGNDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBlLmluZGV4ID0gaW50LlBhcnNlKCBpbmRleFMgKTsKKyAgICAgICAgICAgICAgICAgICAgZS5saW5lID0gaW50LlBhcnNlKCBsaW5lUyApOworICAgICAgICAgICAgICAgICAgICBlLmNoYXJQb3NpdGlvbkluTGluZSA9IGludC5QYXJzZSggcG9zUyApOworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5yZWNvZ25pdGlvbkV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLnByaW50bG4oICJjYW4ndCBmaW5kIGNsYXNzICIgKyBjbmZlICk7CisgICAgICAgICAgICAgICAgICAgIGNuZmUucHJpbnRTdGFja1RyYWNlKCBDb25zb2xlLkVycm9yICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLnByaW50bG4oICJjYW4ndCBpbnN0YW50aWF0ZSBjbGFzcyAiICsgaWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWUucHJpbnRTdGFja1RyYWNlKCBDb25zb2xlLkVycm9yICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5wcmludGxuKCAiY2FuJ3QgYWNjZXNzIGNsYXNzICIgKyBpYWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWFlLnByaW50U3RhY2tUcmFjZSggQ29uc29sZS5FcnJvciApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImJlZ2luUmVzeW5jIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5CZWdpblJlc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGVsZW1lbnRzWzBdLkVxdWFscyggImVuZFJlc3luYyIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuRW5kUmVzeW5jKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZWxlbWVudHNbMF0uRXF1YWxzKCAidGVybWluYXRlIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5UZXJtaW5hdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJzZW1hbnRpY1ByZWRpY2F0ZSIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBib29sLlBhcnNlKCBlbGVtZW50c1sxXSApOworICAgICAgICAgICAgICAgIHN0cmluZyBwcmVkaWNhdGVUZXh0ID0gZWxlbWVudHNbMl07CisgICAgICAgICAgICAgICAgcHJlZGljYXRlVGV4dCA9IFVuRXNjYXBlTmV3bGluZXMoIHByZWRpY2F0ZVRleHQgKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5TZW1hbnRpY1ByZWRpY2F0ZSggcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZVRleHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJjb25zdW1lTm9kZSIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBEZXNlcmlhbGl6ZU5vZGUoIGVsZW1lbnRzLCAxICk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ29uc3VtZU5vZGUoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJMTiIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGkgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzFdICk7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBEZXNlcmlhbGl6ZU5vZGUoIGVsZW1lbnRzLCAyICk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuTFQoIGksIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJjcmVhdGVOb2RlRnJvbVRva2VuRWxlbWVudHMiICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBJRCA9IGludC5QYXJzZSggZWxlbWVudHNbMV0gKTsKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IGludC5QYXJzZSggZWxlbWVudHNbMl0gKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGVsZW1lbnRzWzNdOworICAgICAgICAgICAgICAgIHRleHQgPSBVbkVzY2FwZU5ld2xpbmVzKCB0ZXh0ICk7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBuZXcgUHJveHlUcmVlKCBJRCwgdHlwZSwgLTEsIC0xLCAtMSwgdGV4dCApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkNyZWF0ZU5vZGUoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJjcmVhdGVOb2RlIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgSUQgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzFdICk7CisgICAgICAgICAgICAgICAgaW50IHRva2VuSW5kZXggPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzJdICk7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGR1bW15IG5vZGUvdG9rZW4gZmlsbGVkIHdpdGggSUQsIHRva2VuSW5kZXgKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgbm9kZSA9IG5ldyBQcm94eVRyZWUoIElEICk7CisgICAgICAgICAgICAgICAgUHJveHlUb2tlbiB0b2tlbiA9IG5ldyBQcm94eVRva2VuKCB0b2tlbkluZGV4ICk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuQ3JlYXRlTm9kZSggbm9kZSwgdG9rZW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJuaWxOb2RlIiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgSUQgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzFdICk7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5vZGUgPSBuZXcgUHJveHlUcmVlKCBJRCApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLk5pbE5vZGUoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJlcnJvck5vZGUiICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgYSBzcGVjaWFsIHRyZWUgaGVyZT8KKyAgICAgICAgICAgICAgICBpbnQgSUQgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzFdICk7CisgICAgICAgICAgICAgICAgaW50IHR5cGUgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzJdICk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBlbGVtZW50c1szXTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gVW5Fc2NhcGVOZXdsaW5lcyggdGV4dCApOworICAgICAgICAgICAgICAgIFByb3h5VHJlZSBub2RlID0gbmV3IFByb3h5VHJlZSggSUQsIHR5cGUsIC0xLCAtMSwgLTEsIHRleHQgKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5FcnJvck5vZGUoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJiZWNvbWVSb290IiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3Um9vdElEID0gaW50LlBhcnNlKCBlbGVtZW50c1sxXSApOworICAgICAgICAgICAgICAgIGludCBvbGRSb290SUQgPSBpbnQuUGFyc2UoIGVsZW1lbnRzWzJdICk7CisgICAgICAgICAgICAgICAgUHJveHlUcmVlIG5ld1Jvb3QgPSBuZXcgUHJveHlUcmVlKCBuZXdSb290SUQgKTsKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgb2xkUm9vdCA9IG5ldyBQcm94eVRyZWUoIG9sZFJvb3RJRCApOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLkJlY29tZVJvb3QoIG5ld1Jvb3QsIG9sZFJvb3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJhZGRDaGlsZCIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJvb3RJRCA9IGludC5QYXJzZSggZWxlbWVudHNbMV0gKTsKKyAgICAgICAgICAgICAgICBpbnQgY2hpbGRJRCA9IGludC5QYXJzZSggZWxlbWVudHNbMl0gKTsKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgcm9vdCA9IG5ldyBQcm94eVRyZWUoIHJvb3RJRCApOworICAgICAgICAgICAgICAgIFByb3h5VHJlZSBjaGlsZCA9IG5ldyBQcm94eVRyZWUoIGNoaWxkSUQgKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5BZGRDaGlsZCggcm9vdCwgY2hpbGQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlbGVtZW50c1swXS5FcXVhbHMoICJzZXRUb2tlbkJvdW5kYXJpZXMiICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBJRCA9IGludC5QYXJzZSggZWxlbWVudHNbMV0gKTsKKyAgICAgICAgICAgICAgICBQcm94eVRyZWUgbm9kZSA9IG5ldyBQcm94eVRyZWUoIElEICk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuU2V0VG9rZW5Cb3VuZGFyaWVzKAorICAgICAgICAgICAgICAgICAgICBub2RlLAorICAgICAgICAgICAgICAgICAgICBpbnQuUGFyc2UoIGVsZW1lbnRzWzJdICksCisgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZSggZWxlbWVudHNbM10gKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCAidW5rbm93biBkZWJ1ZyBldmVudDogIiArIGxpbmUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIFByb3h5VHJlZSBEZXNlcmlhbGl6ZU5vZGUoIHN0cmluZ1tdIGVsZW1lbnRzLCBpbnQgb2Zmc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IElEID0gaW50LlBhcnNlKCBlbGVtZW50c1tvZmZzZXQgKyAwXSApOworICAgICAgICAgICAgaW50IHR5cGUgPSBpbnQuUGFyc2UoIGVsZW1lbnRzW29mZnNldCArIDFdICk7CisgICAgICAgICAgICBpbnQgdG9rZW5MaW5lID0gaW50LlBhcnNlKCBlbGVtZW50c1tvZmZzZXQgKyAyXSApOworICAgICAgICAgICAgaW50IGNoYXJQb3NpdGlvbkluTGluZSA9IGludC5QYXJzZSggZWxlbWVudHNbb2Zmc2V0ICsgM10gKTsKKyAgICAgICAgICAgIGludCB0b2tlbkluZGV4ID0gaW50LlBhcnNlKCBlbGVtZW50c1tvZmZzZXQgKyA0XSApOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBlbGVtZW50c1tvZmZzZXQgKyA1XTsKKyAgICAgICAgICAgIHRleHQgPSBVbkVzY2FwZU5ld2xpbmVzKCB0ZXh0ICk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5VHJlZSggSUQsIHR5cGUsIHRva2VuTGluZSwgY2hhclBvc2l0aW9uSW5MaW5lLCB0b2tlbkluZGV4LCB0ZXh0ICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBQcm94eVRva2VuIERlc2VyaWFsaXplVG9rZW4oIHN0cmluZ1tdIGVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaW5kZXhTID0gZWxlbWVudHNbb2Zmc2V0ICsgMF07CisgICAgICAgICAgICBzdHJpbmcgdHlwZVMgPSBlbGVtZW50c1tvZmZzZXQgKyAxXTsKKyAgICAgICAgICAgIHN0cmluZyBjaGFubmVsUyA9IGVsZW1lbnRzW29mZnNldCArIDJdOworICAgICAgICAgICAgc3RyaW5nIGxpbmVTID0gZWxlbWVudHNbb2Zmc2V0ICsgM107CisgICAgICAgICAgICBzdHJpbmcgcG9zUyA9IGVsZW1lbnRzW29mZnNldCArIDRdOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBlbGVtZW50c1tvZmZzZXQgKyA1XTsKKyAgICAgICAgICAgIHRleHQgPSBVbkVzY2FwZU5ld2xpbmVzKCB0ZXh0ICk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBpbnQuUGFyc2UoIGluZGV4UyApOworICAgICAgICAgICAgUHJveHlUb2tlbiB0ID0KKyAgICAgICAgICAgICAgICBuZXcgUHJveHlUb2tlbiggaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LlBhcnNlKCB0eXBlUyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZSggY2hhbm5lbFMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuUGFyc2UoIGxpbmVTICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LlBhcnNlKCBwb3NTICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCApOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q3JlYXRlIGEgdGhyZWFkIHRvIGxpc3RlbiB0byB0aGUgcmVtb3RlIHJ1bm5pbmcgcmVjb2duaXplcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5UaHJlYWRpbmcuVGhyZWFkIHQgPSBuZXcgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQoIFJ1biApOworICAgICAgICAgICAgdC5TdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSdW4oKQorICAgICAgICB7CisgICAgICAgICAgICBFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gTWlzYworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZ1tdIEdldEV2ZW50RWxlbWVudHMoIHN0cmluZyBAZXZlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIEBldmVudCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZ1tdIGVsZW1lbnRzID0gbmV3IHN0cmluZ1tNQVhfRVZFTlRfRUxFTUVOVFNdOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bGw7IC8vIGEgc3RyaW5nIGVsZW1lbnQgaWYgcHJlc2VudCAobXVzdCBiZSBsYXN0KQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZpcnN0UXVvdGVJbmRleCA9IEBldmVudC5JbmRleE9mKCAnIicgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGZpcnN0UXVvdGVJbmRleCA+PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0IHNwZWNpYWxseTsgaGFzIGEgc3RyaW5nIGFyZ3VtZW50IGxpa2UgImEgY29tbWVudFxuCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgYnkgXG4gbm90IGVuZCBxdW90ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRWFzaWVyIHRvIHBhcnNlIHRoYXQgd2F5LgorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXZlbnRXaXRob3V0U3RyaW5nID0gQGV2ZW50LlN1YnN0cmluZyggMCwgZmlyc3RRdW90ZUluZGV4ICk7CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IEBldmVudC5TdWJzdHJpbmcoIGZpcnN0UXVvdGVJbmRleCArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgQGV2ZW50ID0gZXZlbnRXaXRob3V0U3RyaW5nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0cmluZ1tdIHRva2VucyA9IEBldmVudC5TcGxpdCgnXHQnKTsKKyAgICAgICAgICAgICAgICBBcnJheS5Db3B5KHRva2VucywgZWxlbWVudHMsIE1hdGguTWluKHRva2Vucy5MZW5ndGgsIE1BWF9FVkVOVF9FTEVNRU5UUykpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuTGVuZ3RoID49IE1BWF9FVkVOVF9FTEVNRU5UUykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworCisgICAgICAgICAgICAgICAgaWYgKCBzdHIgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50c1t0b2tlbnMuTGVuZ3RoXSA9IHN0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25FeHRlbnNpb25zLlByaW50U3RhY2tUcmFjZSggZSwgQ29uc29sZS5FcnJvciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgc3RyaW5nIFVuRXNjYXBlTmV3bGluZXMoIHN0cmluZyB0eHQgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIHVuZXNjYXBlIGlzIHNsb3cgYnV0IGVhc3kgdG8gdW5kZXJzdGFuZAorICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoICIlMEEiLCAiXG4iICk7ICAvLyB1bmVzY2FwZSBcbgorICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoICIlMEQiLCAiXHIiICk7ICAvLyB1bmVzY2FwZSBccgorICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoICIlMjUiLCAiJSIgKTsgICAvLyB1bmRvIGVzY2FwZWQgZXNjYXBlIGNoYXJzCisgICAgICAgICAgICByZXR1cm4gdHh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBUb2tlbkluZGV4ZXNBcmVJbnZhbGlkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRva2VuSW5kZXhlc0ludmFsaWQ7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxZGE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5EZWJ1Zy9UcmFjZURlYnVnRXZlbnRMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnM7CisKKyAgICB1c2luZyBDb25zb2xlID0gU3lzdGVtLkNvbnNvbGU7CisgICAgdXNpbmcgSVRyZWVBZGFwdG9yID0gQW50bHIuUnVudGltZS5UcmVlLklUcmVlQWRhcHRvcjsKKworICAgIC8qKiA8c3VtbWFyeT5QcmludCBvdXQgKG1vc3Qgb2YpIHRoZSBldmVudHMuLi4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcuLi48L3N1bW1hcnk+ICovCisgICAgcHVibGljIGNsYXNzIFRyYWNlRGVidWdFdmVudExpc3RlbmVyIDogQmxhbmtEZWJ1Z0V2ZW50TGlzdGVuZXIKKyAgICB7CisgICAgICAgIElUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBUcmFjZURlYnVnRXZlbnRMaXN0ZW5lciggSVRyZWVBZGFwdG9yIGFkYXB0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRW50ZXJSdWxlKCBzdHJpbmcgcnVsZU5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJlbnRlclJ1bGUgIiArIHJ1bGVOYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgRXhpdFJ1bGUoIHN0cmluZyBydWxlTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSggImV4aXRSdWxlICIgKyBydWxlTmFtZSApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVudGVyU3ViUnVsZSggaW50IGRlY2lzaW9uTnVtYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCAiZW50ZXJTdWJSdWxlIiApOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEV4aXRTdWJSdWxlKCBpbnQgZGVjaXNpb25OdW1iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJleGl0U3ViUnVsZSIgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMb2NhdGlvbiggaW50IGxpbmUsIGludCBwb3MgKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJsb2NhdGlvbiAiICsgbGluZSArICI6IiArIHBvcyApOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBUcmVlIHBhcnNpbmcgc3R1ZmYKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDb25zdW1lTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgSUQgPSBhZGFwdG9yLkdldFVuaXF1ZUlEKCB0ICk7CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IGFkYXB0b3IuR2V0VGV4dCggdCApOworICAgICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLkdldFR5cGUoIHQgKTsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSggImNvbnN1bWVOb2RlICIgKyBJRCArICIgIiArIHRleHQgKyAiICIgKyB0eXBlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMVCggaW50IGksIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggdCApOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQoIHQgKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKCB0ICk7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJMVCAiICsgaSArICIgIiArIElEICsgIiAiICsgdGV4dCArICIgIiArIHR5cGUgKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQVNUIHN0dWZmCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTmlsTm9kZSggb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJuaWxOb2RlICIgKyBhZGFwdG9yLkdldFVuaXF1ZUlEKCB0ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IElEID0gYWRhcHRvci5HZXRVbmlxdWVJRCggdCApOworICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQoIHQgKTsKKyAgICAgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5HZXRUeXBlKCB0ICk7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJjcmVhdGUgIiArIElEICsgIjogIiArIHRleHQgKyAiLCAiICsgdHlwZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZSggb2JqZWN0IG5vZGUsIElUb2tlbiB0b2tlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuR2V0VW5pcXVlSUQoIG5vZGUgKTsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KCBub2RlICk7CisgICAgICAgICAgICBpbnQgdG9rZW5JbmRleCA9IHRva2VuLlRva2VuSW5kZXg7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJjcmVhdGUgIiArIElEICsgIjogIiArIHRva2VuSW5kZXggKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJlY29tZVJvb3QoIG9iamVjdCBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSggImJlY29tZVJvb3QgIiArIGFkYXB0b3IuR2V0VW5pcXVlSUQoIG5ld1Jvb3QgKSArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuR2V0VW5pcXVlSUQoIG9sZFJvb3QgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQWRkQ2hpbGQoIG9iamVjdCByb290LCBvYmplY3QgY2hpbGQgKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJhZGRDaGlsZCAiICsgYWRhcHRvci5HZXRVbmlxdWVJRCggcm9vdCApICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5HZXRVbmlxdWVJRCggY2hpbGQgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0VG9rZW5Cb3VuZGFyaWVzKCBvYmplY3QgdCwgaW50IHRva2VuU3RhcnRJbmRleCwgaW50IHRva2VuU3RvcEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCAic2V0VG9rZW5Cb3VuZGFyaWVzICIgKyBhZGFwdG9yLkdldFVuaXF1ZUlEKCB0ICkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblN0YXJ0SW5kZXggKyAiLCAiICsgdG9rZW5TdG9wSW5kZXggKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuRGVidWcvVHJhY2VyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL1RyYWNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTlkNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkRlYnVnL1RyYWNlci5jcwpAQCAtMCwwICsxLDg1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkRlYnVnCit7CisgICAgdXNpbmcgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9uczsKKworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhlIGRlZmF1bHQgdHJhY2VyIG1pbWljcyB0aGUgdHJhY2VQYXJzZXIgYmVoYXZpb3Igb2YgQU5UTFIgMi54LgorICAgICAqICBUaGlzIGxpc3RlbnMgZm9yIGRlYnVnZ2luZyBldmVudHMgZnJvbSB0aGUgcGFyc2VyIGFuZCBpbXBsaWVzCisgICAgICogIHRoYXQgeW91IGNhbm5vdCBkZWJ1ZyBhbmQgdHJhY2UgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUcmFjZXIgOiBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgcHVibGljIElJbnRTdHJlYW0gaW5wdXQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbGV2ZWwgPSAwOworCisgICAgICAgIHB1YmxpYyBUcmFjZXIoIElJbnRTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVudGVyUnVsZSggc3RyaW5nIHJ1bGVOYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAxOyBpIDw9IGxldmVsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlKCAiICIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSggIj4gIiArIHJ1bGVOYW1lICsgIiBsb29rYWhlYWQoMSk9IiArIEdldElucHV0U3ltYm9sKCAxICkgKTsKKyAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEV4aXRSdWxlKCBzdHJpbmcgcnVsZU5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAxOyBpIDw9IGxldmVsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlKCAiICIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSggIjwgIiArIHJ1bGVOYW1lICsgIiBsb29rYWhlYWQoMSk9IiArIEdldElucHV0U3ltYm9sKCAxICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBHZXRJbnB1dFN5bWJvbCggaW50IGsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGlucHV0IGlzIElUb2tlblN0cmVhbSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICggKElUb2tlblN0cmVhbSlpbnB1dCApLkxUKCBrICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGNoYXIpaW5wdXQuTEEoIGsgKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zLmNzcHJvaiBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5YTlmOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy5jc3Byb2oKQEAgLTAsMCArMSw5NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57QTdFRUM1NTctRUIxNC00NTFDLTk2MTYtQjdBNjFGNEVDRTY5fTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+QW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnM8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9uczwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxTY2NQcm9qZWN0TmFtZT5TQUs8L1NjY1Byb2plY3ROYW1lPgorICAgIDxTY2NMb2NhbFBhdGg+U0FLPC9TY2NMb2NhbFBhdGg+CisgICAgPFNjY0F1eFBhdGg+U0FLPC9TY2NBdXhQYXRoPgorICAgIDxTY2NQcm92aWRlcj5TQUs8L1NjY1Byb3ZpZGVyPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPkNsaWVudDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFNpZ25Bc3NlbWJseT50cnVlPC9TaWduQXNzZW1ibHk+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5cLi5cLi5cLi5cLi5cLi5ca2V5c1xhbnRsclxLZXkuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSI+CisgICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEaWN0aW9uYXJ5RXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFeGNlcHRpb25FeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklPRXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMZXhlckV4dGVuc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSlN5c3RlbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaXN0RXh0ZW5zaW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJPYmplY3RFeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNldEV4dGVuc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3RhY2tFeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0cmluZ0J1aWxkZXJFeHRlbnNpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0cmluZ0V4dGVuc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3RyaW5nVG9rZW5pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN1Ykxpc3QuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZUV4dGVuc2lvbnMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHlwZUV4dGVuc2lvbnMuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEFudGxyMy5SdW50aW1lXEFudGxyMy5SdW50aW1lLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57OEZEQzBBODctOTAwNS00RDVBLUFCNzUtRTU1Q0VCNTc1NTU5fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkFudGxyMy5SdW50aW1lPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cLi5ca2V5c1xhbnRsclxLZXkuc25rIj4KKyAgICAgIDxMaW5rPktleS5zbms8L0xpbms+CisgICAgPC9Ob25lPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMuY3Nwcm9qLnZzcHNjYyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy5jc3Byb2oudnNwc2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2FkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMuY3Nwcm9qLnZzcHNjYwpAQCAtMCwwICsxLDEwIEBACivvu78iIgoreworIkZJTEVfVkVSU0lPTiIgPSAiOTIzNyIKKyJFTkxJU1RNRU5UX0NIT0lDRSIgPSAiTkVWRVIiCisiUFJPSkVDVF9GSUxFX1JFTEFUSVZFX1BBVEgiID0gInJlbGF0aXZlOmFudGxyXFxtYWluXFxydW50aW1lXFxDU2hhcnAzXFxTb3VyY2VzXFxBbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucyIKKyJOVU1CRVJfT0ZfRVhDTFVERURfRklMRVMiID0gIjAiCisiT1JJR0lOQUxfUFJPSkVDVF9GSUxFX1BBVEgiID0gIiIKKyJOVU1CRVJfT0ZfTkVTVEVEX1BST0pFQ1RTIiA9ICIwIgorIlNPVVJDRV9DT05UUk9MX1NFVFRJTkdTX1BST1ZJREVSIiA9ICJQUk9WSURFUiIKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9EaWN0aW9uYXJ5RXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9EaWN0aW9uYXJ5RXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDMyY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0RpY3Rpb25hcnlFeHRlbnNpb25zLmNzCkBAIC0wLDAgKzEsMTM1IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIFN5c3RlbS5MaW5xOworCisgICAgdXNpbmcgSURpY3Rpb25hcnkgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSURpY3Rpb25hcnk7CisgICAgdXNpbmcgT2Jzb2xldGVBdHRyaWJ1dGUgPSBTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGU7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpY3Rpb25hcnlFeHRlbnNpb25zCisgICAgeworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBjb250YWluc0tleSggdGhpcyBJRGljdGlvbmFyeSBtYXAsIG9iamVjdCBrZXkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWFwLkNvbnRhaW5zKCBrZXkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBvYmplY3QgZ2V0KCB0aGlzIElEaWN0aW9uYXJ5IG1hcCwgb2JqZWN0IGtleSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtYXBba2V5XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVFZhbHVlIGdldDxUS2V5LCBUVmFsdWU+KCB0aGlzIElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gbWFwLCBUS2V5IGtleSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKKyAgICAgICAgICAgIGlmICggbWFwLlRyeUdldFZhbHVlKCBrZXksIG91dCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIGlmICggdHlwZW9mKCBUVmFsdWUgKS5Jc1ZhbHVlVHlwZSApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleU5vdEZvdW5kRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KCBUVmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpc2FtYmlndWF0ZXMKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVmFsdWUgZ2V0PFRLZXksIFRWYWx1ZT4oIHRoaXMgRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IG1hcCwgVEtleSBrZXkgKQorICAgICAgICB7CisgICAgICAgICAgICBUVmFsdWUgdmFsdWU7CisgICAgICAgICAgICBpZiAoIG1hcC5UcnlHZXRWYWx1ZSgga2V5LCBvdXQgdmFsdWUgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgICAgICAgICBpZiAoIHR5cGVvZiggVFZhbHVlICkuSXNWYWx1ZVR5cGUgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBLZXlOb3RGb3VuZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdCggVFZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFRWYWx1ZSBnZXQ8VEtleSwgVFZhbHVlPiggdGhpcyBTb3J0ZWRMaXN0PFRLZXksIFRWYWx1ZT4gbWFwLCBUS2V5IGtleSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKKyAgICAgICAgICAgIGlmICggbWFwLlRyeUdldFZhbHVlKCBrZXksIG91dCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIGlmICggdHlwZW9mKCBUVmFsdWUgKS5Jc1ZhbHVlVHlwZSApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleU5vdEZvdW5kRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KCBUVmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dCggdGhpcyBJRGljdGlvbmFyeSBtYXAsIG9iamVjdCBrZXksIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hcFtrZXldID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXQ8VEtleSwgVFZhbHVlPiggdGhpcyBJRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IG1hcCwgVEtleSBrZXksIFRWYWx1ZSB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hcFtrZXldID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXQ8VEtleSwgVFZhbHVlPiggdGhpcyBEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gbWFwLCBUS2V5IGtleSwgVFZhbHVlIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBIYXNoU2V0PG9iamVjdD4ga2V5U2V0KCB0aGlzIElEaWN0aW9uYXJ5IG1hcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxvYmplY3Q+KCBtYXAuS2V5cy5DYXN0PG9iamVjdD4oKSApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIEhhc2hTZXQ8VEtleT4ga2V5U2V0PFRLZXksIFRWYWx1ZT4oIHRoaXMgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiBtYXAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8VEtleT4oIG1hcC5LZXlzICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkaXNhbWJpZ3VhdGVzIGZvciBEaWN0aW9uYXJ5LCB3aGljaCBpbXBsZW1lbnRzIGJvdGggSURpY3Rpb25hcnk8VCxLPiBhbmQgSURpY3Rpb25hcnkKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIEhhc2hTZXQ8VEtleT4ga2V5U2V0PFRLZXksIFRWYWx1ZT4oIHRoaXMgRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IG1hcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxUS2V5PiggbWFwLktleXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBIYXNoU2V0PG9iamVjdD4ga2V5U2V0PFRLZXksIFRWYWx1ZT4oIHRoaXMgU29ydGVkTGlzdDxUS2V5LCBUVmFsdWU+IG1hcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxvYmplY3Q+KCBtYXAuS2V5cy5DYXN0PG9iamVjdD4oKSApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0V4Y2VwdGlvbkV4dGVuc2lvbnMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvRXhjZXB0aW9uRXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTY5NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0V4Y2VwdGlvbkV4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSwxMDAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5MaW5xOworCit1c2luZyBUYXJnZXRJbnZvY2F0aW9uRXhjZXB0aW9uID0gU3lzdGVtLlJlZmxlY3Rpb24uVGFyZ2V0SW52b2NhdGlvbkV4Y2VwdGlvbjsKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkV4dGVuc2lvbnMKKyAgICB7CisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBnZXRNZXNzYWdlKCB0aGlzIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGUuTWVzc2FnZTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdGFja0ZyYW1lW10gZ2V0U3RhY2tUcmFjZSggdGhpcyBFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YWNrVHJhY2UgdHJhY2UgPSBuZXcgU3RhY2tUcmFjZSggZSwgdHJ1ZSApOworICAgICAgICAgICAgU3RhY2tGcmFtZVtdIGZyYW1lcyA9IHRyYWNlLkdldEZyYW1lcygpOworICAgICAgICAgICAgaWYgKCBmcmFtZXMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSB0aGlzIGhlbHBlciBmdW5jdGlvbiBpbiB0aGUgdHJhY2UKKyAgICAgICAgICAgICAgICBmcmFtZXMgPSBuZXcgU3RhY2tUcmFjZSggdHJ1ZSApLkdldEZyYW1lcygpLlNraXAoIDEgKS5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZnJhbWVzOworICAgICAgICB9CisKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIGdldE1ldGhvZE5hbWUoIHRoaXMgU3RhY2tGcmFtZSBmcmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmcmFtZS5HZXRNZXRob2QoKS5OYW1lOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBnZXRDbGFzc05hbWUoIHRoaXMgU3RhY2tGcmFtZSBmcmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmcmFtZS5HZXRNZXRob2QoKS5EZWNsYXJpbmdUeXBlLk5hbWU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBQcmludFN0YWNrVHJhY2UoIHRoaXMgRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBlLlByaW50U3RhY2tUcmFjZSggQ29uc29sZS5PdXQgKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUHJpbnRTdGFja1RyYWNlKCB0aGlzIEV4Y2VwdGlvbiBlLCBTeXN0ZW0uSU8uVGV4dFdyaXRlciB3cml0ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuV3JpdGVMaW5lKCBlLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIHN0cmluZyB0cmFjZSA9IGUuU3RhY2tUcmFjZSA/PyBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBmb3JlYWNoICggc3RyaW5nIGxpbmUgaW4gdHJhY2UuU3BsaXQoICdcbicsICdccicgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAhc3RyaW5nLklzTnVsbE9yRW1wdHkoIGxpbmUgKSApCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoICIgICAgICAgICIgKyBsaW5lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIERFQlVHCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlcHRpb24gZ2V0VGFyZ2V0RXhjZXB0aW9uKCB0aGlzIFRhcmdldEludm9jYXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlLklubmVyRXhjZXB0aW9uID8/IGU7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9JT0V4dGVuc2lvbnMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvSU9FeHRlbnNpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjUyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvSU9FeHRlbnNpb25zLmNzCkBAIC0wLDAgKzEsOTAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICB1c2luZyBTeXN0ZW07CisKKyAgICB1c2luZyBUZXh0UmVhZGVyID0gU3lzdGVtLklPLlRleHRSZWFkZXI7CisgICAgdXNpbmcgVGV4dFdyaXRlciA9IFN5c3RlbS5JTy5UZXh0V3JpdGVyOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJT0V4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKCB0aGlzIFRleHRSZWFkZXIgcmVhZGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyLkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZSggdGhpcyBUZXh0V3JpdGVyIHdyaXRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQ8VD4oIHRoaXMgVGV4dFdyaXRlciB3cml0ZXIsIFQgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuV3JpdGUoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuKCB0aGlzIFRleHRXcml0ZXIgd3JpdGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVyLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRsbjxUPiggdGhpcyBUZXh0V3JpdGVyIHdyaXRlciwgVCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZUxpbmUoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZTxUPiggdGhpcyBUZXh0V3JpdGVyIHdyaXRlciwgVCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5Xcml0ZSggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZCggdGhpcyBUZXh0UmVhZGVyIHJlYWRlciwgY2hhcltdIGJ1ZmZlciwgaW50IGluZGV4LCBpbnQgY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLlJlYWQoIGJ1ZmZlciwgaW5kZXgsIGNvdW50ICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIHJlYWRMaW5lKCB0aGlzIFRleHRSZWFkZXIgcmVhZGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5SZWFkTGluZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0pTeXN0ZW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvSlN5c3RlbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTc0OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0pTeXN0ZW0uY3MKQEAgLTAsMCArMSw4NyBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICB1c2luZyBTeXN0ZW07CisgICAgdXNpbmcgU3lzdGVtLklPOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKU3lzdGVtCisgICAgeworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGV4dFdyaXRlciBlcnIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnNvbGUuRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGV4dFdyaXRlciBAb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDb25zb2xlLk91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFycmF5Y29weTxUPiggVFtdIHNvdXJjZUFycmF5LCBpbnQgc291cmNlSW5kZXgsIFRbXSBkZXN0aW5hdGlvbkFycmF5LCBpbnQgZGVzdGluYXRpb25JbmRleCwgaW50IGxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoIHNvdXJjZUFycmF5LCBzb3VyY2VJbmRleCwgZGVzdGluYXRpb25BcnJheSwgZGVzdGluYXRpb25JbmRleCwgbGVuZ3RoICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIGdldFByb3BlcnR5KCBzdHJpbmcgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIG5hbWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAiZmlsZS5lbmNvZGluZyI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5UZXh0LkVuY29kaW5nLkRlZmF1bHQuV2ViTmFtZTsKKworICAgICAgICAgICAgY2FzZSAibGluZS5zZXBhcmF0b3IiOgorICAgICAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5OZXdMaW5lOworCisgICAgICAgICAgICBjYXNlICJqYXZhLmlvLnRtcGRpciI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5JTy5QYXRoLkdldFRlbXBQYXRoKCk7CisKKyAgICAgICAgICAgIGNhc2UgInVzZXIuaG9tZSI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LkdldEZvbGRlclBhdGgoIEVudmlyb25tZW50LlNwZWNpYWxGb2xkZXIuUGVyc29uYWwgKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIHN0cmluZy5Gb3JtYXQoICJVbmtub3duIHN5c3RlbSBwcm9wZXJ0eTogJ3swfSciLCBuYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL0xleGVyRXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9MZXhlckV4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMGIzOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9MZXhlckV4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExleGVyRXh0ZW5zaW9ucworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoIHRoaXMgTGV4ZXIgbGV4ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBsZXhlci5Ta2lwKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvTGlzdEV4dGVuc2lvbnMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvTGlzdEV4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjMTZiYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9MaXN0RXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDIzNyBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKKwordXNpbmcgSUNvbGxlY3Rpb24gPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbGxlY3Rpb247Cit1c2luZyBJRW51bWVyYWJsZSA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZTsKK3VzaW5nIElMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklMaXN0OworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdEV4dGVuc2lvbnMKKyAgICB7CisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgYWRkKCB0aGlzIElMaXN0IGxpc3QsIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGxpc3QuQ291bnQ7CisgICAgICAgICAgICBsaXN0LkFkZCggdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0LkNvdW50ID09IGNvdW50ICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZDxUPiggdGhpcyBJQ29sbGVjdGlvbjxUPiBsaXN0LCBUIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdC5BZGQoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQ8VD4oIHRoaXMgTGlzdDxUPiBsaXN0LCBUIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdC5BZGQoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoIHRoaXMgSUxpc3QgbGlzdCwgaW50IGluZGV4LCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0Lkluc2VydCggaW5kZXgsIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGwoIHRoaXMgTGlzdDxvYmplY3Q+IGxpc3QsIElFbnVtZXJhYmxlIGl0ZW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdC5BZGRSYW5nZSggaXRlbXMuQ2FzdDxvYmplY3Q+KCkgKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbCggdGhpcyBJTGlzdCBsaXN0LCBJRW51bWVyYWJsZSBpdGVtcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBvYmplY3QgaXRlbSBpbiBpdGVtcyApCisgICAgICAgICAgICAgICAgbGlzdC5BZGQoIGl0ZW0gKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbGw8VD4oIHRoaXMgSUNvbGxlY3Rpb248VD4gbGlzdCwgSUVudW1lcmFibGU8VD4gaXRlbXMgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICggVCBpdGVtIGluIGl0ZW1zICkKKyAgICAgICAgICAgICAgICBsaXN0LkFkZCggaXRlbSApOworICAgICAgICB9CisKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbGVtZW50KCB0aGlzIExpc3Q8b2JqZWN0PiBsaXN0LCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0LkFkZCggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCB0aGlzIElMaXN0IGxpc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0LkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBjb250YWlucyggdGhpcyBJTGlzdCBsaXN0LCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGlzdC5Db250YWlucyggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGNvbnRhaW5zPFQ+KCB0aGlzIElDb2xsZWN0aW9uPFQ+IGxpc3QsIFQgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGlzdC5Db250YWlucyggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBUIGVsZW1lbnRBdDxUPiggdGhpcyBJTGlzdDxUPiBsaXN0LCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGlzdFtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IGdldCggdGhpcyBJTGlzdCBsaXN0LCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGlzdFtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVCBnZXQ8VD4oIHRoaXMgSUxpc3Q8VD4gbGlzdCwgaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxpc3RbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGlzYW1iaWd1YXRlCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBUIGdldDxUPiggdGhpcyBMaXN0PFQ+IGxpc3QsIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0W2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBvYmplY3QgcmVtb3ZlKCB0aGlzIElMaXN0IGxpc3QsIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvID0gbGlzdFtpbmRleF07CisgICAgICAgICAgICBsaXN0LlJlbW92ZUF0KCBpbmRleCApOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmU8VD4oIHRoaXMgSUxpc3Q8VD4gbGlzdCwgVCBpdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdC5SZW1vdmUoIGl0ZW0gKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldCggdGhpcyBJTGlzdCBsaXN0LCBpbnQgaW5kZXgsIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3RbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQ8VD4oIHRoaXMgSUxpc3Q8VD4gbGlzdCwgaW50IGluZGV4LCBUIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdFtpbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldDxUPiggdGhpcyBMaXN0PFQ+IGxpc3QsIGludCBpbmRleCwgVCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3RbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaXplPFQ+KCB0aGlzIExpc3Q8VD4gbGlzdCwgaW50IHNpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGxpc3QuQ291bnQgPCBzaXplICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaXN0LkFkZFJhbmdlKCBFbnVtZXJhYmxlLlJlcGVhdCggZGVmYXVsdCggVCApLCBzaXplIC0gbGlzdC5Db3VudCApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggbGlzdC5Db3VudCA+IHNpemUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3QuUmVtb3ZlUmFuZ2Uoc2l6ZSwgbGlzdC5Db3VudCAtIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBERUJVRworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUoIHRoaXMgSUNvbGxlY3Rpb24gY29sbGVjdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLkNvdW50OworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBzaXplPFQ+KCB0aGlzIElDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24gKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5Db3VudDsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZTxUPiggdGhpcyBMaXN0PFQ+IGxpc3QgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGlzdC5Db3VudDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJTGlzdCBzdWJMaXN0KCB0aGlzIElMaXN0IGxpc3QsIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJMaXN0KCBsaXN0LCBmcm9tSW5kZXgsIHRvSW5kZXggKTsKKyAgICAgICAgICAgIC8vcmV0dXJuCisgICAgICAgICAgICAvLyAgICBsaXN0CisgICAgICAgICAgICAvLyAgICAuQ2FzdDxvYmplY3Q+KCkKKyAgICAgICAgICAgIC8vICAgIC5Ta2lwKCBmcm9tSW5kZXggKQorICAgICAgICAgICAgLy8gICAgLlRha2UoIHRvSW5kZXggLSBmcm9tSW5kZXggKyAxICkKKyAgICAgICAgICAgIC8vICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSUxpc3Q8VD4gc3ViTGlzdDxUPiggdGhpcyBJTGlzdDxUPiBsaXN0LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViTGlzdDxUPiggbGlzdCwgZnJvbUluZGV4LCB0b0luZGV4ICk7CisgICAgICAgICAgICAvL3JldHVybgorICAgICAgICAgICAgLy8gICAgbGlzdAorICAgICAgICAgICAgLy8gICAgLlNraXAoIGZyb21JbmRleCApCisgICAgICAgICAgICAvLyAgICAuVGFrZSggdG9JbmRleCAtIGZyb21JbmRleCArIDEgKQorICAgICAgICAgICAgLy8gICAgLlRvTGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBJTGlzdDxUPiBzdWJMaXN0PFQ+KCB0aGlzIExpc3Q8VD4gbGlzdCwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1Ykxpc3Q8VD4oIGxpc3QsIGZyb21JbmRleCwgdG9JbmRleCApOworICAgICAgICAgICAgLy9yZXR1cm4KKyAgICAgICAgICAgIC8vICAgIGxpc3QKKyAgICAgICAgICAgIC8vICAgIC5Ta2lwKCBmcm9tSW5kZXggKQorICAgICAgICAgICAgLy8gICAgLlRha2UoIHRvSW5kZXggLSBmcm9tSW5kZXggKyAxICkKKyAgICAgICAgICAgIC8vICAgIC5Ub0xpc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9PYmplY3RFeHRlbnNpb25zLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL09iamVjdEV4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2YTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9PYmplY3RFeHRlbnNpb25zLmNzCkBAIC0wLDAgKzEsMTIzIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RFeHRlbnNpb25zCisgICAgeworI2lmIERFQlVHCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGJvb2xlYW5WYWx1ZSggdGhpcyBib29sIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0Q2xhc3MoIHRoaXMgb2JqZWN0IG8gKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gby5HZXRUeXBlKCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNoaWZ0UHJpbWVYT1IoIGludCBhLCBpbnQgYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBoYXNoID0gMjM7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGE7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGI7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNoaWZ0UHJpbWVYT1IoIGludCBhLCBpbnQgYiwgaW50IGMgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaGFzaCA9IDIzOworICAgICAgICAgICAgaGFzaCA9ICggKCBoYXNoIDw8IDUgKSAqIDM3ICkgXiBhOworICAgICAgICAgICAgaGFzaCA9ICggKCBoYXNoIDw8IDUgKSAqIDM3ICkgXiBiOworICAgICAgICAgICAgaGFzaCA9ICggKCBoYXNoIDw8IDUgKSAqIDM3ICkgXiBjOworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTaGlmdFByaW1lWE9SKCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBoYXNoID0gMjM7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGE7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGI7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGM7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGQ7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNoaWZ0UHJpbWVYT1IoIHBhcmFtcyBpbnRbXSBhICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGhhc2ggPSAyMzsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBpbnQgaSBpbiBhICkKKyAgICAgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSBeIGk7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNoaWZ0UHJpbWVBZGQoIGludCBhLCBpbnQgYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBoYXNoID0gMjM7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGE7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGI7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNoaWZ0UHJpbWVBZGQoIGludCBhLCBpbnQgYiwgaW50IGMgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaGFzaCA9IDIzOworICAgICAgICAgICAgaGFzaCA9ICggKCBoYXNoIDw8IDUgKSAqIDM3ICkgKyBhOworICAgICAgICAgICAgaGFzaCA9ICggKCBoYXNoIDw8IDUgKSAqIDM3ICkgKyBiOworICAgICAgICAgICAgaGFzaCA9ICggKCBoYXNoIDw8IDUgKSAqIDM3ICkgKyBjOworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTaGlmdFByaW1lQWRkKCBpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBoYXNoID0gMjM7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGE7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGI7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGM7CisgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGQ7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNoaWZ0UHJpbWVBZGQoIHBhcmFtcyBpbnRbXSBhICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGhhc2ggPSAyMzsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBpbnQgaSBpbiBhICkKKyAgICAgICAgICAgICAgICBoYXNoID0gKCAoIGhhc2ggPDwgNSApICogMzcgKSArIGk7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWEyNjcxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNzAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCAiQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oICIiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbiggIiIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCAiUGl4ZWwgTWluZSwgSW5jLiIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCAiQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCAiQ29weXJpZ2h0IMKpIFBpeGVsIE1pbmUgMjAxMCIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoICIiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSggIiIgKV0KK1thc3NlbWJseTogQ0xTQ29tcGxpYW50KCB0cnVlICldCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoIGZhbHNlICldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCAiYWQ0OGM3ZjctMGIxZC00YjFlLTk2MDItODM0MjVjYjU2OTlmIiApXQorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiBmb3VyIHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICoKKyAqICAgTWFqb3IuTWlub3IuQnVpbGQuUmV2aXNpb24KKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmc6CisgKiAgIDEuIE1ham9yLk1pbm9yIGZvbGxvd3MgdGhlIEFOVExSIHJlbGVhc2Ugc2NoZWR1bGUKKyAqICAgMi4gQnVpbGQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBDIyBwb3J0IGlzIHBhY2thZ2VkIGZvciByZWxlYXNlIChyZWdhcmRsZXNzCisgKiAgICAgIG9mIHdoZXRoZXIgaXQncyBhbiBpbmNyZW1lbnRhbCBvciBuaWdodGx5KS4gVGhlIHZhbHVlIHJlc2V0cyB0byB6ZXJvIHdoZW5ldmVyCisgKiAgICAgIHRoZSBNYWpvciBvciBNaW5vciB2ZXJzaW9uIGlzIGluY3JlbWVudGVkLgorICogICAzLiBSZXZpc2lvbiBpcyB0aGUgUGVyZm9yY2UgY2hhbmdlbGlzdCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNlLgorICovCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMy4zLjQuODUxNyIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIzLjMuNC44NTE3IildCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU2V0RXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TZXRFeHRlbnNpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTMyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU2V0RXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDg5IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyNpZiBERUJVRwordXNpbmcgU3lzdGVtLkxpbnE7CisjZW5kaWYKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNldEV4dGVuc2lvbnMKKyAgICB7CisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgYWRkPFQ+KCB0aGlzIEhhc2hTZXQ8VD4gc2V0LCBUIGl0ZW0gKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0LkFkZCggaXRlbSApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsPFQ+KCB0aGlzIEhhc2hTZXQ8VD4gc2V0LCBJRW51bWVyYWJsZTxUPiBpdGVtcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBUIGl0ZW0gaW4gaXRlbXMgKQorICAgICAgICAgICAgICAgIHNldC5BZGQoIGl0ZW0gKTsKKyAgICAgICAgfQorCisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXI8VD4oIHRoaXMgSGFzaFNldDxUPiBzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGNvbnRhaW5zPFQ+KCB0aGlzIEhhc2hTZXQ8VD4gc2V0LCBUIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5Db250YWlucyggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIHJlbW92ZTxUPiggdGhpcyBIYXNoU2V0PFQ+IHNldCwgVCBpdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldC5SZW1vdmUoIGl0ZW0gKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZTxUPiggdGhpcyBIYXNoU2V0PFQ+IHNldCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVFtdIHRvQXJyYXk8VD4oIHRoaXMgSGFzaFNldDxUPiBzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0LlRvQXJyYXkoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0YWNrRXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdGFja0V4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5ZWM3MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdGFja0V4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSw4NCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisjaWYgREVCVUcKK3VzaW5nIFN5c3RlbS5MaW5xOworI2VuZGlmCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGFja0V4dGVuc2lvbnMKKyAgICB7CisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIFQgZWxlbWVudEF0PFQ+KCB0aGlzIFN0YWNrPFQ+IHN0YWNrLCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhY2suRWxlbWVudEF0KCBpbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIFQgcGVlazxUPiggdGhpcyBTdGFjazxUPiBzdGFjayApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGFjay5QZWVrKCk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVCBwb3A8VD4oIHRoaXMgU3RhY2s8VD4gc3RhY2sgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXNoPFQ+KCB0aGlzIFN0YWNrPFQ+IHN0YWNrLCBUIG9iaiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YWNrLlB1c2goIG9iaiApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBzaXplPFQ+KCB0aGlzIFN0YWNrPFQ+IHN0YWNrICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YWNrLkNvdW50OworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2l6ZTxUPiggdGhpcyBTdGFjazxUPiBzdGFjaywgaW50IHNpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHNpemUgPiBzdGFjay5Db3VudCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIHdoaWxlICggc3RhY2suQ291bnQgPiBzaXplICkKKyAgICAgICAgICAgICAgICBzdGFjay5Qb3AoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdHJpbmdCdWlsZGVyRXh0ZW5zaW9ucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdHJpbmdCdWlsZGVyRXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY2ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0cmluZ0J1aWxkZXJFeHRlbnNpb25zLmNzCkBAIC0wLDAgKzEsNzUgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbTsKKwordXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyNpZiBERUJVRworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nQnVpbGRlckV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZDxUPiggdGhpcyBTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgVCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlci5BcHBlbmQoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhciBjaGFyQXQoIHRoaXMgU3RyaW5nQnVpbGRlciBidWZmZXIsIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXJbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBsZW5ndGgoIHRoaXMgU3RyaW5nQnVpbGRlciBidWZmZXIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLkxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJBdCggdGhpcyBTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgaW50IGluZGV4LCBjaGFyIGMgKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJbaW5kZXhdID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExlbmd0aCggdGhpcyBTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgaW50IGxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlci5MZW5ndGggPSBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0cmluZ0V4dGVuc2lvbnMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU3RyaW5nRXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMyNTEyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N0cmluZ0V4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSwxNTEgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLkphdmFFeHRlbnNpb25zCit7CisgICAgdXNpbmcgT2Jzb2xldGVBdHRyaWJ1dGUgPSBTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGU7CisgICAgdXNpbmcgUmVnZXggPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXg7CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0V4dGVuc2lvbnMKKyAgICB7CisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGNoYXIgY2hhckF0KCB0aGlzIHN0cmluZyBzdHIsIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgZW5kc1dpdGgoIHRoaXMgc3RyaW5nIHN0ciwgc3RyaW5nIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5FbmRzV2l0aCggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZiggdGhpcyBzdHJpbmcgc3RyLCBjaGFyIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5JbmRleE9mKCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKCB0aGlzIHN0cmluZyBzdHIsIGNoYXIgdmFsdWUsIGludCBzdGFydEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5JbmRleE9mKCB2YWx1ZSwgc3RhcnRJbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKCB0aGlzIHN0cmluZyBzdHIsIHN0cmluZyB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuSW5kZXhPZiggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZiggdGhpcyBzdHJpbmcgc3RyLCBzdHJpbmcgdmFsdWUsIGludCBzdGFydEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5JbmRleE9mKCB2YWx1ZSwgc3RhcnRJbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZiggdGhpcyBzdHJpbmcgc3RyLCBjaGFyIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5MYXN0SW5kZXhPZiggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoIHRoaXMgc3RyaW5nIHN0ciwgc3RyaW5nIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5MYXN0SW5kZXhPZiggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgbGVuZ3RoKCB0aGlzIHN0cmluZyBzdHIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLkxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgcmVwbGFjZSh0aGlzIHN0cmluZyBzdHIsIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuUmVwbGFjZShvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyByZXBsYWNlQWxsKCB0aGlzIHN0cmluZyBzdHIsIHN0cmluZyByZWdleCwgc3RyaW5nIG5ld1ZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LlJlcGxhY2UoIHN0ciwgcmVnZXgsIG5ld1ZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyByZXBsYWNlRmlyc3QoIHRoaXMgc3RyaW5nIHN0ciwgc3RyaW5nIHJlZ2V4LCBzdHJpbmcgcmVwbGFjZW1lbnQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUmVnZXguUmVwbGFjZSggc3RyLCByZWdleCwgcmVwbGFjZW1lbnQgKTsKKyAgICAgICAgfQorCisjaWYgREVCVUcKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgc3RhcnRzV2l0aCggdGhpcyBzdHJpbmcgc3RyLCBzdHJpbmcgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLlN0YXJ0c1dpdGgoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIHN1YnN0cmluZyggdGhpcyBzdHJpbmcgc3RyLCBpbnQgc3RhcnRPZmZzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLlN1YnN0cmluZyggc3RhcnRPZmZzZXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgc3Vic3RyaW5nKHRoaXMgc3RyaW5nIHN0ciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLlN1YnN0cmluZyggc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0ICk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIHRvQ2hhckFycmF5KCB0aGlzIHN0cmluZyBzdHIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLlRvQ2hhckFycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIHRvVXBwZXJDYXNlKCB0aGlzIHN0cmluZyBzdHIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyLlRvVXBwZXJJbnZhcmlhbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgdHJpbSggdGhpcyBzdHJpbmcgc3RyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5UcmltKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9TdHJpbmdUb2tlbml6ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU3RyaW5nVG9rZW5pemVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNDVkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU3RyaW5nVG9rZW5pemVyLmNzCkBAIC0wLDAgKzEsODcgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5MaW5xOworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHB1YmxpYyBjbGFzcyBTdHJpbmdUb2tlbml6ZXIKKyAgICB7CisgICAgICAgIHN0cmluZ1tdIF90b2tlbnM7CisgICAgICAgIGludCBfY3VycmVudDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nVG9rZW5pemVyKCBzdHJpbmcgc3RyLCBzdHJpbmcgc2VwYXJhdG9yICkKKyAgICAgICAgICAgIDogdGhpcyggc3RyLCBzZXBhcmF0b3IsIGZhbHNlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmdUb2tlbml6ZXIoIHN0cmluZyBzdHIsIHN0cmluZyBzZXBhcmF0b3IsIGJvb2wgcmV0dXJuRGVsaW1zICkKKyAgICAgICAgeworICAgICAgICAgICAgX3Rva2VucyA9IHN0ci5TcGxpdCggc2VwYXJhdG9yLlRvQ2hhckFycmF5KCksIFN0cmluZ1NwbGl0T3B0aW9ucy5Ob25lICk7CisgICAgICAgICAgICBpZiAoIHJldHVybkRlbGltcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcltdIGRlbGltcyA9IHNlcGFyYXRvci5Ub0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIF90b2tlbnMgPSBfdG9rZW5zLlNlbGVjdE1hbnkoICggdG9rZW4sIGkgKSA9PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpID09IF90b2tlbnMuTGVuZ3RoIC0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGVsaW1zLkNvbnRhaW5zKCBzdHJbc3RyLkxlbmd0aCAtIDFdICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyB0b2tlbiB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlbGltcy5Db250YWlucyggc3RyWzBdICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyBzdHJbMF0uVG9TdHJpbmcoKSB9OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nW10geyB0b2tlbiB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmdbXSB7IHRva2VuLCBzdHJbX3Rva2Vucy5UYWtlKCBpICsgMSApLlNlbGVjdCggdCA9PiB0Lkxlbmd0aCArIDEgKS5TdW0oKSAtIDFdLlRvU3RyaW5nKCkgfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gKS5Ub0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBoYXNNb3JlVG9rZW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50IDwgX3Rva2Vucy5MZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIG5leHRUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zW19jdXJyZW50KytdOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N1Ykxpc3QuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvU3ViTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAyNWJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1N1Ykxpc3QuY3MKQEAgLTAsMCArMSw0MjMgQEAKK++7v3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgU3ViTGlzdAorICAgICAgICA6IElMaXN0CisgICAgeworICAgICAgICBJTGlzdCBfc291cmNlOworICAgICAgICBpbnQgX3N0YXJ0SW5kZXg7CisgICAgICAgIGludCBfZW5kSW5kZXg7CisKKyAgICAgICAgcHVibGljIFN1Ykxpc3QoIElMaXN0IHNvdXJjZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc291cmNlID09IG51bGwgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oICJzb3VyY2UiICk7CisgICAgICAgICAgICBpZiAoIHN0YXJ0SW5kZXggPCAwIHx8IGVuZEluZGV4IDwgMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKCBzdGFydEluZGV4ID4gZW5kSW5kZXggfHwgZW5kSW5kZXggPj0gc291cmNlLkNvdW50ICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgX3NvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgICAgIF9zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKKyAgICAgICAgICAgIF9lbmRJbmRleCA9IGVuZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBJTGlzdCBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIGludCBBZGQoIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc291cmNlCisgICAgICAgICAgICAgICAgLkNhc3Q8b2JqZWN0PigpCisgICAgICAgICAgICAgICAgLlNraXAoIF9zdGFydEluZGV4ICkKKyAgICAgICAgICAgICAgICAuVGFrZSggX2VuZEluZGV4IC0gX3N0YXJ0SW5kZXggKyAxICkKKyAgICAgICAgICAgICAgICAuQ29udGFpbnMoIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEluZGV4T2YoIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IENvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggb2JqZWN0LkVxdWFscyggdGhpc1tpXSwgdmFsdWUgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnQoIGludCBpbmRleCwgb2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNGaXhlZFNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmVBdCggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCB0aGlzW2ludCBpbmRleF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnQgKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NvdXJjZVtpbmRleCArIF9zdGFydEluZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgX3NvdXJjZVtpbmRleCArIF9zdGFydEluZGV4XSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUNvbGxlY3Rpb24gTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyggQXJyYXkgYXJyYXksIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYXJyYXkgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiggImFycmF5IiApOworCisgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIGluZGV4ICsgQ291bnQgPiBhcnJheS5MZW5ndGggKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBDb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcnJheS5TZXRWYWx1ZSggdGhpc1tpXSwgaW5kZXggKyBpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZW5kSW5kZXggLSBfc3RhcnRJbmRleCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1N5bmNocm9uaXplZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IFN5bmNSb290CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc291cmNlLlN5bmNSb290OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworCisgICAgICAgIHB1YmxpYyBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc291cmNlLkNhc3Q8b2JqZWN0PigpCisgICAgICAgICAgICAgICAgLlNraXAoIF9zdGFydEluZGV4ICkKKyAgICAgICAgICAgICAgICAuVGFrZSggX2VuZEluZGV4IC0gX3N0YXJ0SW5kZXggKyAxICkKKyAgICAgICAgICAgICAgICAuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBTdWJMaXN0PFQ+IDogSUxpc3Q8VD4sIElDb2xsZWN0aW9uPFQ+LCBJRW51bWVyYWJsZTxUPiwgSUxpc3QsIElDb2xsZWN0aW9uLCBJRW51bWVyYWJsZQorICAgIHsKKyAgICAgICAgSUxpc3Q8VD4gX3NvdXJjZTsKKyAgICAgICAgaW50IF9zdGFydEluZGV4OworICAgICAgICBpbnQgX2VuZEluZGV4OworCisgICAgICAgIHB1YmxpYyBTdWJMaXN0KCBJTGlzdDxUPiBzb3VyY2UsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHNvdXJjZSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCAic291cmNlIiApOworICAgICAgICAgICAgaWYgKCBzdGFydEluZGV4IDwgMCB8fCBlbmRJbmRleCA8IDAgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICggc3RhcnRJbmRleCA+IGVuZEluZGV4IHx8IGVuZEluZGV4ID49IHNvdXJjZS5Db3VudCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIF9zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgICAgICBfc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBfZW5kSW5kZXggPSBlbmRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworCisgICAgICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUNvbGxlY3Rpb24gTWVtYmVycworCisgICAgICAgIHZvaWQgSUNvbGxlY3Rpb24uQ29weVRvKCBBcnJheSBhcnJheSwgaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhcnJheSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCAiYXJyYXkiICk7CisKKyAgICAgICAgICAgIGlmICggaW5kZXggPCAwICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIGlmICggaW5kZXggKyBDb3VudCA+IGFycmF5Lkxlbmd0aCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IENvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFycmF5LlNldFZhbHVlKCB0aGlzW2ldLCBpbmRleCArIGkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9lbmRJbmRleCAtIF9zdGFydEluZGV4ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzU3luY2hyb25pemVkCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElDb2xsZWN0aW9uIHNvdXJjZUNvbGxlY3Rpb24gPSBfc291cmNlIGFzIElDb2xsZWN0aW9uOworICAgICAgICAgICAgICAgIGlmICggc291cmNlQ29sbGVjdGlvbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUNvbGxlY3Rpb24uSXNTeW5jaHJvbml6ZWQ7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IFN5bmNSb290CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElDb2xsZWN0aW9uIHNvdXJjZUNvbGxlY3Rpb24gPSBfc291cmNlIGFzIElDb2xsZWN0aW9uOworICAgICAgICAgICAgICAgIGlmICggc291cmNlQ29sbGVjdGlvbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUNvbGxlY3Rpb24uU3luY1Jvb3Q7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElMaXN0IE1lbWJlcnMKKworICAgICAgICBpbnQgSUxpc3QuQWRkKCBvYmplY3QgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIElMaXN0LkNsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc291cmNlLkNhc3Q8b2JqZWN0PigpLlNraXAoIF9zdGFydEluZGV4ICkuVGFrZSggQ291bnQgKS5Db250YWlucyggdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgSW5kZXhPZiggb2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSBfc3RhcnRJbmRleDsgaSA8PSBfZW5kSW5kZXg7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBvYmplY3QuRXF1YWxzKCBfc291cmNlW2ldLCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBfc3RhcnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJTGlzdC5JbnNlcnQoIGludCBpbmRleCwgb2JqZWN0IHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgSXNGaXhlZFNpemUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNvbGxlY3Rpb24gPSBfc291cmNlIGFzIElMaXN0OworICAgICAgICAgICAgICAgIGlmICggc291cmNlQ29sbGVjdGlvbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUNvbGxlY3Rpb24uSXNGaXhlZFNpemU7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJTGlzdC5SZW1vdmUoIG9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgSUxpc3QuUmVtb3ZlQXQoIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIG9iamVjdCBJTGlzdC50aGlzW2ludCBpbmRleF0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpc1tpbmRleF0gPSAoVCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlPFQ+IE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8VD4gR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc291cmNlLlNraXAoIF9zdGFydEluZGV4ICkuVGFrZSggQ291bnQgKS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBJQ29sbGVjdGlvbjxUPiBNZW1iZXJzCisKKyAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxUPi5BZGQoIFQgaXRlbSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgSUNvbGxlY3Rpb248VD4uQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyggVCBpdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zb3VyY2UuU2tpcCggX3N0YXJ0SW5kZXggKS5UYWtlKCBDb3VudCApLkNvbnRhaW5zKCBpdGVtICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oIFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGFycmF5ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oICJhcnJheSIgKTsKKworICAgICAgICAgICAgaWYgKCBhcnJheUluZGV4IDwgMCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIGFycmF5SW5kZXggKyBDb3VudCA+IGFycmF5Lkxlbmd0aCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IENvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFycmF5W2FycmF5SW5kZXggKyBpXSA9IHRoaXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIElDb2xsZWN0aW9uPFQ+LlJlbW92ZSggVCBpdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSUxpc3Q8VD4gTWVtYmVycworCisgICAgICAgIHB1YmxpYyBpbnQgSW5kZXhPZiggVCBpdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBvYmplY3QuRXF1YWxzKCB0aGlzW2ldLCBpdGVtICkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJTGlzdDxUPi5JbnNlcnQoIGludCBpbmRleCwgVCBpdGVtICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBJTGlzdDxUPi5SZW1vdmVBdCggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgdGhpc1tpbnQgaW5kZXhdCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9zb3VyY2VbaW5kZXggKyBfc3RhcnRJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudCApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgICAgIF9zb3VyY2VbaW5kZXggKyBfc3RhcnRJbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvVHJlZUV4dGVuc2lvbnMuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvVHJlZUV4dGVuc2lvbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3MTgyZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5KYXZhRXh0ZW5zaW9ucy9UcmVlRXh0ZW5zaW9ucy5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIElUcmVlID0gQW50bHIuUnVudGltZS5UcmVlLklUcmVlOworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5KYXZhRXh0ZW5zaW9ucworeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJlZUV4dGVuc2lvbnMKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgSVRyZWUgZ2V0TmV4dFNpYmxpbmcoIHRoaXMgSVRyZWUgdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmVlLlBhcmVudC5HZXRDaGlsZCggdHJlZS5DaGlsZEluZGV4ICsgMSApOworICAgICAgICAgICAgLy90aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaXJzdENoaWxkKCB0aGlzIElUcmVlIHRyZWUsIElUcmVlIGNoaWxkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0cmVlLkNoaWxkQ291bnQgPT0gMCApCisgICAgICAgICAgICAgICAgdHJlZS5BZGRDaGlsZCggY2hpbGQgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cmVlLlNldENoaWxkKCAwLCBjaGlsZCApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1R5cGVFeHRlbnNpb25zLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zL1R5cGVFeHRlbnNpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzAzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMvVHlwZUV4dGVuc2lvbnMuY3MKQEAgLTAsMCArMSwxMDIgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOworCisjaWYgREVCVUcKKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVFeHRlbnNpb25zCisgICAgeworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IGdldCggdGhpcyBGaWVsZEluZm8gZmllbGQsIG9iamVjdCBvYmogKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmllbGQuR2V0VmFsdWUoIG9iaiApOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0Q29tcG9uZW50VHlwZSggdGhpcyBUeXBlIHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5HZXRFbGVtZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9ySW5mbyBnZXRDb25zdHJ1Y3RvciggdGhpcyBUeXBlIHR5cGUsIFR5cGVbXSBhcmd1bWVudFR5cGVzICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuR2V0Q29uc3RydWN0b3IoIGFyZ3VtZW50VHlwZXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZEluZm8gZ2V0RmllbGQoIHRoaXMgVHlwZSB0eXBlLCBzdHJpbmcgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpZWxkSW5mbyBmaWVsZCA9IHR5cGUuR2V0RmllbGQoIG5hbWUgKTsKKyAgICAgICAgICAgIGlmICggZmllbGQgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBbT2Jzb2xldGVdCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIGdldE5hbWUoIHRoaXMgVHlwZSB0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBvYmplY3QgaW52b2tlKCB0aGlzIE1ldGhvZEluZm8gbWV0aG9kLCBvYmplY3Qgb2JqLCBwYXJhbXMgb2JqZWN0W10gcGFyYW1ldGVycyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QuSW52b2tlKCBvYmosIHBhcmFtZXRlcnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGlzQXJyYXkoIHRoaXMgVHlwZSB0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuSXNBcnJheTsKKyAgICAgICAgfQorCisgICAgICAgIFtPYnNvbGV0ZV0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGlzUHJpbWl0aXZlKCB0aGlzIFR5cGUgdHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLklzUHJpbWl0aXZlOworICAgICAgICB9CisKKyAgICAgICAgW09ic29sZXRlXQorICAgICAgICBwdWJsaWMgc3RhdGljIG9iamVjdCBuZXdJbnN0YW5jZSggdGhpcyBUeXBlIHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5HZXRDb25zdHJ1Y3RvciggbmV3IFR5cGVbMF0gKS5JbnZva2UoIG5ldyBvYmplY3RbMF0gKTsKKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9BbnRscjMuUnVudGltZS5UZXN0LmNzcHJvaiBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0FudGxyMy5SdW50aW1lLlRlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjA2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9BbnRscjMuUnVudGltZS5UZXN0LmNzcHJvagpAQCAtMCwwICsxLDIwNiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57MTlCOTY1REUtNTEwMC00MDY0LUE1ODAtMTU5NjQ0RjY5ODBFfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+QW50bHIzLlJ1bnRpbWUuVGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPkFudGxyMy5SdW50aW1lLlRlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57M0FDMDk2RDAtQTFDMi1FMTJDLTEzOTAtQTgzMzU4MDFGREFCfTt7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfTwvUHJvamVjdFR5cGVHdWlkcz4KKyAgICA8U2NjUHJvamVjdE5hbWU+U0FLPC9TY2NQcm9qZWN0TmFtZT4KKyAgICA8U2NjTG9jYWxQYXRoPlNBSzwvU2NjTG9jYWxQYXRoPgorICAgIDxTY2NBdXhQYXRoPlNBSzwvU2NjQXV4UGF0aD4KKyAgICA8U2NjUHJvdmlkZXI+U0FLPC9TY2NQcm92aWRlcj4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uUXVhbGl0eVRvb2xzLlVuaXRUZXN0RnJhbWV3b3JrLCBWZXJzaW9uPTEwLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJ2anNsaWIiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBvc2l0aW9uXFByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXC4uXC4uXC4uXGFudGxyY3NcbWFpblxBbnRscjMuU3RyaW5nVGVtcGxhdGVcQW50bHIzLlN0cmluZ1RlbXBsYXRlLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57QjU5MTBCRTItREUyMS00QUE5LTk1QzEtNDg2RjQyQjlFNzk0fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkFudGxyMy5TdHJpbmdUZW1wbGF0ZTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cQW50bHIzLlJ1bnRpbWUuRGVidWdcQW50bHIzLlJ1bnRpbWUuRGVidWcuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns1RUUyN0E5MC1CMDIzLTQyQzktQUFGMS01MkIwNDI0QzVEMEJ9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+QW50bHIzLlJ1bnRpbWUuRGVidWc8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEFudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zXEFudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zLmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57QTdFRUM1NTctRUIxNC00NTFDLTk2MTYtQjdBNjFGNEVDRTY5fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPkFudGxyMy5SdW50aW1lLkphdmFFeHRlbnNpb25zPC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlxBbnRscjMuUnVudGltZVxBbnRscjMuUnVudGltZS5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezhGREMwQTg3LTkwMDUtNEQ1QS1BQjc1LUU1NUNFQjU3NTU1OX08L1Byb2plY3Q+CisgICAgICA8TmFtZT5BbnRscjMuUnVudGltZTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxBbnRscjMgSW5jbHVkZT0iU2ltcGxlRXhwcmVzc2lvbi5nMyI+CisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPgorICAgIDwvQW50bHIzPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMy5sZXhlci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5TZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VtYW50aWNQcmVkaWNhdGVSZWR1Y3Rpb24uZzMucGFyc2VyLmNzIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPlNlbWFudGljUHJlZGljYXRlUmVkdWN0aW9uLmczPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29tcGlsZT4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTaW1wbGVFeHByZXNzaW9uTGV4ZXJIZWxwZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+U2ltcGxlRXhwcmVzc2lvbi5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2ltcGxlRXhwcmVzc2lvblBhcnNlckhlbHBlci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5TaW1wbGVFeHByZXNzaW9uLmczPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEFudGxyMyBJbmNsdWRlPSJGYXN0U2ltcGxlRXhwcmVzc2lvbi5nMyI+CisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPgorICAgIDwvQW50bHIzPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZhc3RTaW1wbGVFeHByZXNzaW9uTGV4ZXJIZWxwZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+RmFzdFNpbXBsZUV4cHJlc3Npb24uZzM8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkZhc3RTaW1wbGVFeHByZXNzaW9uUGFyc2VySGVscGVyLmNzIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkZhc3RTaW1wbGVFeHByZXNzaW9uLmczPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29tcGlsZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEFudGxyMyBJbmNsdWRlPSJKYXZhQ29tcGF0XEV4cHIuZzMiPgorICAgICAgPEdlbmVyYXRvcj5NU0J1aWxkOkNvbXBpbGU8L0dlbmVyYXRvcj4KKyAgICA8L0FudGxyMz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEFudGxyMyBJbmNsdWRlPSJCdWlsZE9wdGlvbnNcRGVidWdHcmFtbWFyLmczIj4KKyAgICAgIDwhLS08R3JhbW1hck9wdGlvbnM+LWRlYnVnPC9HcmFtbWFyT3B0aW9ucz4tLT4KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+CisgICAgPC9BbnRscjM+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnVpbGRPcHRpb25zXERlYnVnR3JhbW1hckxleGVySGVscGVyLmNzIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPkRlYnVnR3JhbW1hci5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnVpbGRPcHRpb25zXERlYnVnR3JhbW1hclBhcnNlckhlbHBlci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5EZWJ1Z0dyYW1tYXIuZzM8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8QW50bHIzIEluY2x1ZGU9IkJ1aWxkT3B0aW9uc1xEZWJ1Z1RyZWVHcmFtbWFyLmczIj4KKyAgICAgIDwhLS08R3JhbW1hck9wdGlvbnM+LWRlYnVnPC9HcmFtbWFyT3B0aW9ucz4tLT4KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+CisgICAgPC9BbnRscjM+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQnVpbGRPcHRpb25zXERlYnVnVHJlZUdyYW1tYXJIZWxwZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+RGVidWdUcmVlR3JhbW1hci5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2xpbVBhcnNpbmdcSVRva2VuU291cmNlYDEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2xpbVBhcnNpbmdcSVRva2VuU3RyZWFtYDEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2xpbVBhcnNpbmdcU2xpbUxleGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNsaW1QYXJzaW5nXFNsaW1TdHJpbmdTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2xpbVBhcnNpbmdcU2xpbVRva2VuLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNsaW1QYXJzaW5nXFNsaW1Ub2tlblN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTbGltUGFyc2luZ1xUcmVlXElUcmVlQWRhcHRvcmAxLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNsaW1QYXJzaW5nXFRyZWVcSVRyZWVGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNsaW1QYXJzaW5nXFRyZWVcSVRyZWVOb2RlU3RyZWFtYDEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3RyaW5nVGVtcGxhdGVPdXRwdXQuZzMubGV4ZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+U3RyaW5nVGVtcGxhdGVPdXRwdXQuZzM8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlN0cmluZ1RlbXBsYXRlT3V0cHV0LmczLnBhcnNlci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5TdHJpbmdUZW1wbGF0ZU91dHB1dC5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdEFjdGlvbkZlYXR1cmVzLmczLmxleGVyLmNzIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPlRlc3RBY3Rpb25GZWF0dXJlcy5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdEFjdGlvbkZlYXR1cmVzLmczLnBhcnNlci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5UZXN0QWN0aW9uRmVhdHVyZXMuZzM8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3REb3RUcmVlR2VuZXJhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RFeHByZXNzaW9uRmVhdHVyZXMuZzMubGV4ZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+VGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMy5wYXJzZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+VGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdEZhc3RMZXhlci5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iQnVpbGRPcHRpb25zXFByb2ZpbGVHcmFtbWFyLmczIj4KKyAgICAgIDwhLS08R3JhbW1hck9wdGlvbnM+LXByb2ZpbGU8L0dyYW1tYXJPcHRpb25zPi0tPgorICAgICAgPEdlbmVyYXRvcj5NU0J1aWxkOkNvbXBpbGU8L0dlbmVyYXRvcj4KKyAgICA8L05vbmU+CisgICAgPE5vbmUgSW5jbHVkZT0iQnVpbGRPcHRpb25zXFByb2ZpbGVHcmFtbWFyTGV4ZXJIZWxwZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+UHJvZmlsZUdyYW1tYXIuZzM8L0RlcGVuZGVudFVwb24+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9IkJ1aWxkT3B0aW9uc1xQcm9maWxlR3JhbW1hclBhcnNlckhlbHBlci5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5Qcm9maWxlR3JhbW1hci5nMzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L05vbmU+CisgICAgPEFudGxyMyBJbmNsdWRlPSJTdHJpbmdUZW1wbGF0ZU91dHB1dC5nMyI+CisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPgorICAgIDwvQW50bHIzPgorICAgIDxBbnRscjMgSW5jbHVkZT0iVGVzdEFjdGlvbkZlYXR1cmVzLmczIj4KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+CisgICAgPC9BbnRscjM+CisgICAgPEFudGxyMyBJbmNsdWRlPSJTZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMyI+CisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPgorICAgIDwvQW50bHIzPgorICAgIDxBbnRscjMgSW5jbHVkZT0iQ29tcG9zaXRpb25cUmVkdWNlLmczIiAvPgorICAgIDxBbnRscjMgSW5jbHVkZT0iQ29tcG9zaXRpb25cU2ltcGxpZnkuZzMiIC8+CisgICAgPEFudGxyMyBJbmNsdWRlPSJDb21wb3NpdGlvblxWZWNNYXRoLmczIiAvPgorICAgIDxOb25lIEluY2x1ZGU9IkNvbXBvc2l0aW9uXFZlY01hdGhfTGV4ZXIuZzMiIC8+CisgICAgPE5vbmUgSW5jbHVkZT0iQ29tcG9zaXRpb25cVmVjTWF0aF9QYXJzZXIuZzMiIC8+CisgICAgPE5vbmUgSW5jbHVkZT0iVGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMyI+CisgICAgICA8R2VuZXJhdG9yPk1TQnVpbGQ6Q29tcGlsZTwvR2VuZXJhdG9yPgorICAgIDwvTm9uZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iQnVpbGRPcHRpb25zXFByb2ZpbGVUcmVlR3JhbW1hci5nMyI+CisgICAgICA8IS0tPEdyYW1tYXJPcHRpb25zPi1wcm9maWxlPC9HcmFtbWFyT3B0aW9ucz4tLT4KKyAgICAgIDxHZW5lcmF0b3I+TVNCdWlsZDpDb21waWxlPC9HZW5lcmF0b3I+CisgICAgPC9Ob25lPgorICAgIDxOb25lIEluY2x1ZGU9IkJ1aWxkT3B0aW9uc1xQcm9maWxlVHJlZUdyYW1tYXJIZWxwZXIuY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+UHJvZmlsZVRyZWVHcmFtbWFyLmczPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvTm9uZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDwhLS0gRm9sZGVyIGNvbnRhaW5pbmcgQW50bHJCdWlsZFRhc2suZGxsIC0tPgorICAgIDxBbnRsckJ1aWxkVGFza1BhdGg+JChTb2x1dGlvbkRpciliaW5cQm9vdHN0cmFwPC9BbnRsckJ1aWxkVGFza1BhdGg+CisgICAgPCEtLSBQYXRoIHRvIHRoZSBBTlRMUiBUb29sIGl0c2VsZi4gLS0+CisgICAgPEFudGxyVG9vbFBhdGg+JChTb2x1dGlvbkRpciliaW5cQm9vdHN0cmFwXEFudGxyMy5leGU8L0FudGxyVG9vbFBhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFByb2plY3REaXIpLi5cLi5cLi5cLi5cLi5cLi5cYW50bHJjc1xtYWluXGJpblxCb290c3RyYXBcQW50bHIzLnRhcmdldHMiIC8+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQW50bHIzLlJ1bnRpbWUuVGVzdC5jc3Byb2oudnNwc2NjIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQW50bHIzLlJ1bnRpbWUuVGVzdC5jc3Byb2oudnNwc2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmE0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9BbnRscjMuUnVudGltZS5UZXN0LmNzcHJvai52c3BzY2MKQEAgLTAsMCArMSwxMCBAQAor77u/IiIKK3sKKyJGSUxFX1ZFUlNJT04iID0gIjkyMzciCisiRU5MSVNUTUVOVF9DSE9JQ0UiID0gIk5FVkVSIgorIlBST0pFQ1RfRklMRV9SRUxBVElWRV9QQVRIIiA9ICJyZWxhdGl2ZTphbnRsclxcbWFpblxccnVudGltZVxcQ1NoYXJwM1xcU291cmNlc1xcQW50bHIzLlJ1bnRpbWUuVGVzdCIKKyJOVU1CRVJfT0ZfRVhDTFVERURfRklMRVMiID0gIjAiCisiT1JJR0lOQUxfUFJPSkVDVF9GSUxFX1BBVEgiID0gIiIKKyJOVU1CRVJfT0ZfTkVTVEVEX1BST0pFQ1RTIiA9ICIwIgorIlNPVVJDRV9DT05UUk9MX1NFVFRJTkdTX1BST1ZJREVSIiA9ICJQUk9WSURFUiIKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z0dyYW1tYXIuZzMgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdHcmFtbWFyLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjE4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdHcmFtbWFyLmczCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2dyYW1tYXIgRGVidWdHcmFtbWFyOworCitvcHRpb25zCit7CisJbGFuZ3VhZ2U9Q1NoYXJwMzsKKwlvdXRwdXQ9QVNUOworCUFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorCit0b2tlbnMKK3sKKwkvLyBkZWZpbmUgcHNldWRvLW9wZXJhdGlvbnMKKwlGVU5DOworCUNBTEw7Cit9CisKKy8vIFNUQVJUOnN0YXQKK3Byb2c6ICggc3RhdCApKgorICAgIDsKKworc3RhdDogICBleHByIE5FV0xJTkUgICAgICAgICAgICAgICAgICAgIC0+IGV4cHIKKyAgICB8ICAgSUQgJz0nIGV4cHIgTkVXTElORSAgICAgICAgICAgICAtPiBeKCc9JyBJRCBleHByKQorICAgIHwgICBmdW5jIE5FV0xJTkUgICAgICAgICAgICAgICAgICAgIC0+IGZ1bmMKKyAgICB8ICAgTkVXTElORSAgICAgICAgICAgICAgICAgICAgICAgICAtPiAvLyBpZ25vcmUKKyAgICA7CisKK2Z1bmM6ICAgSUQgICcoJyBmb3JtYWxQYXIgJyknICc9JyBleHByICAtPiBeKEZVTkMgSUQgZm9ybWFsUGFyIGV4cHIpCisgICAgOworCWZpbmFsbHkgeworCSAgZnVuY3Rpb25EZWZpbml0aW9ucy5BZGQoJGZ1bmMudHJlZSk7CisJfQorCitmb3JtYWxQYXIKKyAgICA6ICAgSUQKKwl8ICAgSU5UCisJOworCisvLyBFTkQ6c3RhdAorCisvLyBTVEFSVDpleHByCitleHByOiAgIG11bHRFeHByICgoJysnXnwnLSdeKSBtdWx0RXhwcikqCisgICAgOworCittdWx0RXhwcgorICAgIDogICBhdG9tICgoJyonfCcvJ3wnJScpXiBhdG9tKSoKKyAgICA7CisKK2F0b206ICAgSU5UCisgICAgfCAgIElECisgICAgfCAgICcoJyBleHByICcpJyAgICAtPiBleHByCisgICAgfCAgIElEICcoJyBleHByICcpJyAtPiBeKENBTEwgSUQgZXhwcikKKyAgICA7CisvLyBFTkQ6ZXhwcgorCisvLyBTVEFSVDp0b2tlbnMKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSsKKwk7CisKK0lOVCA6ICAgJzAnLi4nOScrCisgICAgOworCitORVdMSU5FCisgICAgOgknXHInPyAnXG4nCisgICAgOworCitXUyAgOiAgICgnICd8J1x0JykrIHsgU2tpcCgpOyB9CisgICAgOworLy8gRU5EOnRva2VucwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnR3JhbW1hckxleGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnR3JhbW1hckxleGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdHcmFtbWFyTGV4ZXIuY3MKQEAgLTAsMCArMSw2OTMgQEAKKy8vICRBTlRMUiAzLjEuMiBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMyAyMDA5LTA5LTMwIDEzOjE4OjE0CisKKy8vIFRoZSB2YXJpYWJsZSAndmFyaWFibGUnIGlzIGFzc2lnbmVkIGJ1dCBpdHMgdmFsdWUgaXMgbmV2ZXIgdXNlZC4KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDIxOQorLy8gVW5yZWFjaGFibGUgY29kZSBkZXRlY3RlZC4KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE2MgorCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgQW50bHIuUnVudGltZTsKK3VzaW5nIFN0YWNrID0gU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU3RhY2s8b2JqZWN0PjsKK3VzaW5nIExpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7Cit1c2luZyBBcnJheUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0PG9iamVjdD47CisKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICIzLjEuMiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorcHVibGljIHBhcnRpYWwgY2xhc3MgRGVidWdHcmFtbWFyTGV4ZXIgOiBMZXhlcgoreworCXB1YmxpYyBjb25zdCBpbnQgRU9GPS0xOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTA9MTA7CisJcHVibGljIGNvbnN0IGludCBUX18xMT0xMTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEyPTEyOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTM9MTM7CisJcHVibGljIGNvbnN0IGludCBUX18xND0xNDsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE1PTE1OworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTY9MTY7CisJcHVibGljIGNvbnN0IGludCBUX18xNz0xNzsKKwlwdWJsaWMgY29uc3QgaW50IENBTEw9NDsKKwlwdWJsaWMgY29uc3QgaW50IEZVTkM9NTsKKwlwdWJsaWMgY29uc3QgaW50IElEPTY7CisJcHVibGljIGNvbnN0IGludCBJTlQ9NzsKKwlwdWJsaWMgY29uc3QgaW50IE5FV0xJTkU9ODsKKwlwdWJsaWMgY29uc3QgaW50IFdTPTk7CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICAvLyBkZWxlZ2F0b3JzCisKKwlwdWJsaWMgRGVidWdHcmFtbWFyTGV4ZXIoKSB7fQorCXB1YmxpYyBEZWJ1Z0dyYW1tYXJMZXhlciggSUNoYXJTdHJlYW0gaW5wdXQgKQorCQk6IHRoaXMoIGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKQorCXsKKwl9CisJcHVibGljIERlYnVnR3JhbW1hckxleGVyKCBJQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwkJOiBiYXNlKCBpbnB1dCwgc3RhdGUgKQorCXsKKworCX0KKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdyYW1tYXJGaWxlTmFtZSB7IGdldCB7IHJldHVybiAiQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzMiOyB9IH0KKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTAiCisJcHJpdmF0ZSB2b2lkIG1UX18xMCgpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTA7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6Nzo5OiAoICctJyApCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo3Ojk6ICctJworCQkJeworCQkJTWF0Y2goJy0nKTsgCisKKwkJCX0KKworCQkJc3RhdGUudHlwZSA9IF90eXBlOworCQkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJfQorCS8vICRBTlRMUiBlbmQgIlRfXzEwIgorCisJLy8gJEFOVExSIHN0YXJ0ICJUX18xMSIKKwlwcml2YXRlIHZvaWQgbVRfXzExKCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBUX18xMTsKKwkJCWludCBfY2hhbm5lbCA9IERlZmF1bHRUb2tlbkNoYW5uZWw7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo4Ojk6ICggJyUnICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjg6OTogJyUnCisJCQl7CisJCQlNYXRjaCgnJScpOyAKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiVF9fMTEiCisKKwkvLyAkQU5UTFIgc3RhcnQgIlRfXzEyIgorCXByaXZhdGUgdm9pZCBtVF9fMTIoKQorCXsKKwkJdHJ5CisJCXsKKwkJCWludCBfdHlwZSA9IFRfXzEyOworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjk6OTogKCAnKCcgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6OTo5OiAnKCcKKwkJCXsKKwkJCU1hdGNoKCcoJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJUX18xMiIKKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTMiCisJcHJpdmF0ZSB2b2lkIG1UX18xMygpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTM7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTA6OTogKCAnKScgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTA6OTogJyknCisJCQl7CisJCQlNYXRjaCgnKScpOyAKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiVF9fMTMiCisKKwkvLyAkQU5UTFIgc3RhcnQgIlRfXzE0IgorCXByaXZhdGUgdm9pZCBtVF9fMTQoKQorCXsKKwkJdHJ5CisJCXsKKwkJCWludCBfdHlwZSA9IFRfXzE0OworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjExOjk6ICggJyonICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjExOjk6ICcqJworCQkJeworCQkJTWF0Y2goJyonKTsgCisKKwkJCX0KKworCQkJc3RhdGUudHlwZSA9IF90eXBlOworCQkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJfQorCS8vICRBTlRMUiBlbmQgIlRfXzE0IgorCisJLy8gJEFOVExSIHN0YXJ0ICJUX18xNSIKKwlwcml2YXRlIHZvaWQgbVRfXzE1KCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBUX18xNTsKKwkJCWludCBfY2hhbm5lbCA9IERlZmF1bHRUb2tlbkNoYW5uZWw7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzoxMjo5OiAoICcvJyApCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzoxMjo5OiAnLycKKwkJCXsKKwkJCU1hdGNoKCcvJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJUX18xNSIKKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTYiCisJcHJpdmF0ZSB2b2lkIG1UX18xNigpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTY7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTM6OTogKCAnKycgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTM6OTogJysnCisJCQl7CisJCQlNYXRjaCgnKycpOyAKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiVF9fMTYiCisKKwkvLyAkQU5UTFIgc3RhcnQgIlRfXzE3IgorCXByaXZhdGUgdm9pZCBtVF9fMTcoKQorCXsKKwkJdHJ5CisJCXsKKwkJCWludCBfdHlwZSA9IFRfXzE3OworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE0Ojk6ICggJz0nICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE0Ojk6ICc9JworCQkJeworCQkJTWF0Y2goJz0nKTsgCisKKwkJCX0KKworCQkJc3RhdGUudHlwZSA9IF90eXBlOworCQkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJfQorCS8vICRBTlRMUiBlbmQgIlRfXzE3IgorCisJLy8gJEFOVExSIHN0YXJ0ICJJRCIKKwlwcml2YXRlIHZvaWQgbUlEKCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBJRDsKKwkJCWludCBfY2hhbm5lbCA9IERlZmF1bHRUb2tlbkNoYW5uZWw7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo4ODo5OiAoICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgKSsgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6ODg6OTogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyApKworCQkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6ODg6OTogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyApKworCQkJaW50IGNudDE9MDsKKwkJCWZvciAoIDsgOyApCisJCQl7CisJCQkJaW50IGFsdDE9MjsKKwkJCQlpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworCQkJCWlmICggKChMQTFfMD49J0EnICYmIExBMV8wPD0nWicpfHwoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSkgKQorCQkJCXsKKwkJCQkJYWx0MT0xOworCQkJCX0KKworCisJCQkJc3dpdGNoICggYWx0MSApCisJCQkJeworCQkJCWNhc2UgMToKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6CisJCQkJCXsKKwkJCQkJaW5wdXQuQ29uc3VtZSgpOworCisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmICggY250MSA+PSAxICkKKwkJCQkJCWdvdG8gbG9vcDE7CisKKwkJCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZTEgPSBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKCAxLCBpbnB1dCApOworCQkJCQl0aHJvdyBlZWUxOworCQkJCX0KKwkJCQljbnQxKys7CisJCQl9CisJCQlsb29wMToKKwkJCQk7CisKKworCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJJRCIKKworCS8vICRBTlRMUiBzdGFydCAiSU5UIgorCXByaXZhdGUgdm9pZCBtSU5UKCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBJTlQ7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6OTE6OTogKCAoICcwJyAuLiAnOScgKSsgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6OTE6OTogKCAnMCcgLi4gJzknICkrCisJCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo5MTo5OiAoICcwJyAuLiAnOScgKSsKKwkJCWludCBjbnQyPTA7CisJCQlmb3IgKCA7IDsgKQorCQkJeworCQkJCWludCBhbHQyPTI7CisJCQkJaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKwkJCQlpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKSkgKQorCQkJCXsKKwkJCQkJYWx0Mj0xOworCQkJCX0KKworCisJCQkJc3dpdGNoICggYWx0MiApCisJCQkJeworCQkJCWNhc2UgMToKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6CisJCQkJCXsKKwkJCQkJaW5wdXQuQ29uc3VtZSgpOworCisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmICggY250MiA+PSAxICkKKwkJCQkJCWdvdG8gbG9vcDI7CisKKwkJCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZTIgPSBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKCAyLCBpbnB1dCApOworCQkJCQl0aHJvdyBlZWUyOworCQkJCX0KKwkJCQljbnQyKys7CisJCQl9CisJCQlsb29wMjoKKwkJCQk7CisKKworCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJJTlQiCisKKwkvLyAkQU5UTFIgc3RhcnQgIk5FV0xJTkUiCisJcHJpdmF0ZSB2b2lkIG1ORVdMSU5FKCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBORVdMSU5FOworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjk1Ojc6ICggKCAnXFxyJyApPyAnXFxuJyApCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo5NTo3OiAoICdcXHInICk/ICdcXG4nCisJCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo5NTo3OiAoICdcXHInICk/CisJCQlpbnQgYWx0Mz0yOworCQkJaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKwkJCWlmICggKExBM18wPT0nXHInKSApCisJCQl7CisJCQkJYWx0Mz0xOworCQkJfQorCQkJc3dpdGNoICggYWx0MyApCisJCQl7CisJCQljYXNlIDE6CisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6OTU6MDogJ1xccicKKwkJCQl7CisJCQkJTWF0Y2goJ1xyJyk7IAorCisJCQkJfQorCQkJCWJyZWFrOworCisJCQl9CisKKwkJCU1hdGNoKCdcbicpOyAKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiTkVXTElORSIKKworCS8vICRBTlRMUiBzdGFydCAiV1MiCisJcHJpdmF0ZSB2b2lkIG1XUygpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gV1M7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6OTg6OTogKCAoICcgJyB8ICdcXHQnICkrICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjk4Ojk6ICggJyAnIHwgJ1xcdCcgKSsKKwkJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjk4Ojk6ICggJyAnIHwgJ1xcdCcgKSsKKwkJCWludCBjbnQ0PTA7CisJCQlmb3IgKCA7IDsgKQorCQkJeworCQkJCWludCBhbHQ0PTI7CisJCQkJaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKwkJCQlpZiAoIChMQTRfMD09J1x0J3x8TEE0XzA9PScgJykgKQorCQkJCXsKKwkJCQkJYWx0ND0xOworCQkJCX0KKworCisJCQkJc3dpdGNoICggYWx0NCApCisJCQkJeworCQkJCWNhc2UgMToKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6CisJCQkJCXsKKwkJCQkJaW5wdXQuQ29uc3VtZSgpOworCisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmICggY250NCA+PSAxICkKKwkJCQkJCWdvdG8gbG9vcDQ7CisKKwkJCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZTQgPSBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKCA0LCBpbnB1dCApOworCQkJCQl0aHJvdyBlZWU0OworCQkJCX0KKwkJCQljbnQ0Kys7CisJCQl9CisJCQlsb29wNDoKKwkJCQk7CisKKworCQkJIFNraXAoKTsgCisKKwkJCX0KKworCQkJc3RhdGUudHlwZSA9IF90eXBlOworCQkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJfQorCS8vICRBTlRMUiBlbmQgIldTIgorCisJcHVibGljIG92ZXJyaWRlIHZvaWQgbVRva2VucygpCisJeworCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzoxOjEwOiAoIFRfXzEwIHwgVF9fMTEgfCBUX18xMiB8IFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBJRCB8IElOVCB8IE5FV0xJTkUgfCBXUyApCisJCWludCBhbHQ1PTEyOworCQlzd2l0Y2ggKCBpbnB1dC5MQSgxKSApCisJCXsKKwkJY2FzZSAnLSc6CisJCQl7CisJCQlhbHQ1PTE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnJSc6CisJCQl7CisJCQlhbHQ1PTI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKCc6CisJCQl7CisJCQlhbHQ1PTM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKSc6CisJCQl7CisJCQlhbHQ1PTQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKic6CisJCQl7CisJCQlhbHQ1PTU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQl7CisJCQlhbHQ1PTY7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQl7CisJCQlhbHQ1PTc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnPSc6CisJCQl7CisJCQlhbHQ1PTg7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnQSc6CisJCWNhc2UgJ0InOgorCQljYXNlICdDJzoKKwkJY2FzZSAnRCc6CisJCWNhc2UgJ0UnOgorCQljYXNlICdGJzoKKwkJY2FzZSAnRyc6CisJCWNhc2UgJ0gnOgorCQljYXNlICdJJzoKKwkJY2FzZSAnSic6CisJCWNhc2UgJ0snOgorCQljYXNlICdMJzoKKwkJY2FzZSAnTSc6CisJCWNhc2UgJ04nOgorCQljYXNlICdPJzoKKwkJY2FzZSAnUCc6CisJCWNhc2UgJ1EnOgorCQljYXNlICdSJzoKKwkJY2FzZSAnUyc6CisJCWNhc2UgJ1QnOgorCQljYXNlICdVJzoKKwkJY2FzZSAnVic6CisJCWNhc2UgJ1cnOgorCQljYXNlICdYJzoKKwkJY2FzZSAnWSc6CisJCWNhc2UgJ1onOgorCQljYXNlICdhJzoKKwkJY2FzZSAnYic6CisJCWNhc2UgJ2MnOgorCQljYXNlICdkJzoKKwkJY2FzZSAnZSc6CisJCWNhc2UgJ2YnOgorCQljYXNlICdnJzoKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ2knOgorCQljYXNlICdqJzoKKwkJY2FzZSAnayc6CisJCWNhc2UgJ2wnOgorCQljYXNlICdtJzoKKwkJY2FzZSAnbic6CisJCWNhc2UgJ28nOgorCQljYXNlICdwJzoKKwkJY2FzZSAncSc6CisJCWNhc2UgJ3InOgorCQljYXNlICdzJzoKKwkJY2FzZSAndCc6CisJCWNhc2UgJ3UnOgorCQljYXNlICd2JzoKKwkJY2FzZSAndyc6CisJCWNhc2UgJ3gnOgorCQljYXNlICd5JzoKKwkJY2FzZSAneic6CisJCQl7CisJCQlhbHQ1PTk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnMCc6CisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCWNhc2UgJzQnOgorCQljYXNlICc1JzoKKwkJY2FzZSAnNic6CisJCWNhc2UgJzcnOgorCQljYXNlICc4JzoKKwkJY2FzZSAnOSc6CisJCQl7CisJCQlhbHQ1PTEwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQkJeworCQkJYWx0NT0xMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCWNhc2UgJyAnOgorCQkJeworCQkJYWx0NT0xMjsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUsIDAsIGlucHV0KTsKKworCQkJCXRocm93IG52YWU7CisJCQl9CisJCX0KKworCQlzd2l0Y2ggKCBhbHQ1ICkKKwkJeworCQljYXNlIDE6CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzoxOjEwOiBUX18xMAorCQkJeworCQkJbVRfXzEwKCk7IAorCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MToxNjogVF9fMTEKKwkJCXsKKwkJCW1UX18xMSgpOyAKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE6MjI6IFRfXzEyCisJCQl7CisJCQltVF9fMTIoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzoxOjI4OiBUX18xMworCQkJeworCQkJbVRfXzEzKCk7IAorCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTozNDogVF9fMTQKKwkJCXsKKwkJCW1UX18xNCgpOyAKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE6NDA6IFRfXzE1CisJCQl7CisJCQltVF9fMTUoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzoxOjQ2OiBUX18xNgorCQkJeworCQkJbVRfXzE2KCk7IAorCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTo1MjogVF9fMTcKKwkJCXsKKwkJCW1UX18xNygpOyAKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE6NTg6IElECisJCQl7CisJCQltSUQoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6MTo2MTogSU5UCisJCQl7CisJCQltSU5UKCk7IAorCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE6NjU6IE5FV0xJTkUKKwkJCXsKKwkJCW1ORVdMSU5FKCk7IAorCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjE6NzM6IFdTCisJCQl7CisJCQltV1MoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKworCX0KKworCisJI3JlZ2lvbiBERkEKKworCXByb3RlY3RlZCBvdmVycmlkZSB2b2lkIEluaXRERkFzKCkKKwl7CisJCWJhc2UuSW5pdERGQXMoKTsKKwl9CisKKyAKKwkjZW5kcmVnaW9uCisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z0dyYW1tYXJMZXhlckhlbHBlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z0dyYW1tYXJMZXhlckhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjcxMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnR3JhbW1hckxleGVySGVscGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnR3JhbW1hclBhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z0dyYW1tYXJQYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NGIyMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z0dyYW1tYXJQYXJzZXIuY3MKQEAgLTAsMCArMSwxNTU2IEBACisvLyAkQU5UTFIgMy4xLjIgQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzMgMjAwOS0wOS0zMCAxMzoxODoxMworCisvLyBUaGUgdmFyaWFibGUgJ3ZhcmlhYmxlJyBpcyBhc3NpZ25lZCBidXQgaXRzIHZhbHVlIGlzIG5ldmVyIHVzZWQuCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyMTkKKy8vIFVucmVhY2hhYmxlIGNvZGUgZGV0ZWN0ZWQuCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNjIKKworCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIEFudGxyLlJ1bnRpbWU7Cit1c2luZyBTdGFjayA9IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLlN0YWNrPG9iamVjdD47Cit1c2luZyBMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklMaXN0OwordXNpbmcgQXJyYXlMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdDxvYmplY3Q+OworCit1c2luZyBBbnRsci5SdW50aW1lLkRlYnVnOwordXNpbmcgSU9FeGNlcHRpb24gPSBTeXN0ZW0uSU8uSU9FeGNlcHRpb247CisKK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKK3VzaW5nIFJld3JpdGVSdWxlSVRva2VuU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLlJld3JpdGVSdWxlVG9rZW5TdHJlYW07CisKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICIzLjEuMiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorcHVibGljIHBhcnRpYWwgY2xhc3MgRGVidWdHcmFtbWFyUGFyc2VyIDogRGVidWdQYXJzZXIKK3sKKwlpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gdG9rZW5OYW1lcyA9IG5ldyBzdHJpbmdbXSB7CisJCSI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLCAiQ0FMTCIsICJGVU5DIiwgIklEIiwgIklOVCIsICJORVdMSU5FIiwgIldTIiwgIictJyIsICInJSciLCAiJygnIiwgIicpJyIsICInKiciLCAiJy8nIiwgIicrJyIsICInPSciCisJfTsKKwlwdWJsaWMgY29uc3QgaW50IEVPRj0tMTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEwPTEwOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTE9MTE7CisJcHVibGljIGNvbnN0IGludCBUX18xMj0xMjsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEzPTEzOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTQ9MTQ7CisJcHVibGljIGNvbnN0IGludCBUX18xNT0xNTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE2PTE2OworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTc9MTc7CisJcHVibGljIGNvbnN0IGludCBDQUxMPTQ7CisJcHVibGljIGNvbnN0IGludCBGVU5DPTU7CisJcHVibGljIGNvbnN0IGludCBJRD02OworCXB1YmxpYyBjb25zdCBpbnQgSU5UPTc7CisJcHVibGljIGNvbnN0IGludCBORVdMSU5FPTg7CisJcHVibGljIGNvbnN0IGludCBXUz05OworCisJLy8gZGVsZWdhdGVzCisJLy8gZGVsZWdhdG9ycworCisJcHVibGljIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBydWxlTmFtZXMgPQorCQluZXcgc3RyaW5nW10KKwkJeworCQkJImludmFsaWRSdWxlIiwgImF0b20iLCAiZXhwciIsICJmb3JtYWxQYXIiLCAiZnVuYyIsICJtdWx0RXhwciIsICJwcm9nIiwgCisJCSJzdGF0IgorCQl9OworCisJCWludCBydWxlTGV2ZWwgPSAwOworCQlwdWJsaWMgdmlydHVhbCBpbnQgUnVsZUxldmVsIHsgZ2V0IHsgcmV0dXJuIHJ1bGVMZXZlbDsgfSB9CisJCXB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5jUnVsZUxldmVsKCkgeyBydWxlTGV2ZWwrKzsgfQorCQlwdWJsaWMgdmlydHVhbCB2b2lkIERlY1J1bGVMZXZlbCgpIHsgcnVsZUxldmVsLS07IH0KKwkJcHVibGljIERlYnVnR3JhbW1hclBhcnNlciggSVRva2VuU3RyZWFtIGlucHV0ICkKKwkJCTogdGhpcyggaW5wdXQsIERlYnVnRXZlbnRTb2NrZXRQcm94eS5EZWZhdWx0RGVidWdnZXJQb3J0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKQorCQl7CisJCX0KKwkJcHVibGljIERlYnVnR3JhbW1hclBhcnNlciggSVRva2VuU3RyZWFtIGlucHV0LCBpbnQgcG9ydCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwkJCTogYmFzZSggaW5wdXQsIHN0YXRlICkKKwkJeworCQkJSW5pdGlhbGl6ZVRyZWVBZGFwdG9yKCk7CisJCQlpZiAoIFRyZWVBZGFwdG9yID09IG51bGwgKQorCQkJCVRyZWVBZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisJCQlEZWJ1Z0V2ZW50U29ja2V0UHJveHkgcHJveHkgPSBuZXcgRGVidWdFdmVudFNvY2tldFByb3h5KCB0aGlzLCBwb3J0LCBhZGFwdG9yICk7CisJCQlEZWJ1Z0xpc3RlbmVyID0gcHJveHk7CisJCQlUb2tlblN0cmVhbSA9IG5ldyBEZWJ1Z1Rva2VuU3RyZWFtKCBpbnB1dCwgcHJveHkgKTsKKwkJCXRyeQorCQkJeworCQkJCXByb3h5LkhhbmRzaGFrZSgpOworCQkJfQorCQkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpb2UgKQorCQkJeworCQkJCVJlcG9ydEVycm9yKCBpb2UgKTsKKwkJCX0KKwkJCUlUcmVlQWRhcHRvciBhZGFwID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisJCQlUcmVlQWRhcHRvciA9IGFkYXA7CisJCQlwcm94eS5UcmVlQWRhcHRvciA9IGFkYXA7CisJCX0KKwlwdWJsaWMgRGVidWdHcmFtbWFyUGFyc2VyKCBJVG9rZW5TdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKwkJOiBiYXNlKCBpbnB1dCwgZGJnICkKKwl7CisJCUluaXRpYWxpemVUcmVlQWRhcHRvcigpOworCQlpZiAoIFRyZWVBZGFwdG9yID09IG51bGwgKQorCQkJVHJlZUFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKworCQlJVHJlZUFkYXB0b3IgYWRhcCA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCQlUcmVlQWRhcHRvciA9IGFkYXA7CisKKwl9CisJcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBFdmFsUHJlZGljYXRlKCBib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSApCisJeworCQlkYmcuU2VtYW50aWNQcmVkaWNhdGUoIHJlc3VsdCwgcHJlZGljYXRlICk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gaW4geW91ciBoZWxwZXIgZmlsZSB0byB1c2UgYSBjdXN0b20gdHJlZSBhZGFwdG9yCisJcGFydGlhbCB2b2lkIEluaXRpYWxpemVUcmVlQWRhcHRvcigpOworCXByb3RlY3RlZCBEZWJ1Z1RyZWVBZGFwdG9yIGFkYXB0b3I7CisKKwlwdWJsaWMgSVRyZWVBZGFwdG9yIFRyZWVBZGFwdG9yCisJeworCQlnZXQKKwkJeworCQkJcmV0dXJuIGFkYXB0b3I7CisJCX0KKwkJc2V0CisJCXsKKwkJCXRoaXMuYWRhcHRvciA9IG5ldyBEZWJ1Z1RyZWVBZGFwdG9yKGRiZyxhZGFwdG9yKTsKKworCQl9CisJfQorCisKKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nW10gVG9rZW5OYW1lcyB7IGdldCB7IHJldHVybiBEZWJ1Z0dyYW1tYXJQYXJzZXIudG9rZW5OYW1lczsgfSB9CisJcHVibGljIG92ZXJyaWRlIHN0cmluZyBHcmFtbWFyRmlsZU5hbWUgeyBnZXQgeyByZXR1cm4gIkJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczIjsgfSB9CisKKworCSNyZWdpb24gUnVsZXMKKwlwdWJsaWMgY2xhc3MgcHJvZ19yZXR1cm4gOiBQYXJzZXJSdWxlUmV0dXJuU2NvcGUKKwl7CisJCWludGVybmFsIENvbW1vblRyZWUgdHJlZTsKKwkJcHVibGljIG92ZXJyaWRlIG9iamVjdCBUcmVlIHsgZ2V0IHsgcmV0dXJuIHRyZWU7IH0gfQorCX0KKworCS8vICRBTlRMUiBzdGFydCAicHJvZyIKKwkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo1MDowOiBwcm9nIDogKCBzdGF0ICkqIDsKKwlwcml2YXRlIERlYnVnR3JhbW1hclBhcnNlci5wcm9nX3JldHVybiBwcm9nKCAgKQorCXsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLnByb2dfcmV0dXJuIHJldHZhbCA9IG5ldyBEZWJ1Z0dyYW1tYXJQYXJzZXIucHJvZ19yZXR1cm4oKTsKKwkJcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKwkJQ29tbW9uVHJlZSByb290XzAgPSBudWxsOworCisJCURlYnVnR3JhbW1hclBhcnNlci5zdGF0X3JldHVybiBzdGF0MSA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLnN0YXRfcmV0dXJuKTsKKworCisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJwcm9nIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNTAsIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjUwOjc6ICggKCBzdGF0ICkqICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo1MDo3OiAoIHN0YXQgKSoKKwkJCXsKKwkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisKKwkJCWRiZy5Mb2NhdGlvbiggNTAsIDYgKTsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjUwOjc6ICggc3RhdCApKgorCQkJdHJ5CisJCQl7CisJCQkJZGJnLkVudGVyU3ViUnVsZSggMSApOworCisJCQlmb3IgKCA7IDsgKQorCQkJeworCQkJCWludCBhbHQxPTI7CisJCQkJdHJ5CisJCQkJeworCQkJCQlkYmcuRW50ZXJEZWNpc2lvbiggMSApOworCisJCQkJaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKwkJCQlpZiAoICgoTEExXzA+PUlEICYmIExBMV8wPD1ORVdMSU5FKXx8TEExXzA9PTEyKSApCisJCQkJeworCQkJCQlhbHQxPTE7CisJCQkJfQorCisKKwkJCQl9CisJCQkJZmluYWxseQorCQkJCXsKKwkJCQkJZGJnLkV4aXREZWNpc2lvbiggMSApOworCQkJCX0KKworCQkJCXN3aXRjaCAoIGFsdDEgKQorCQkJCXsKKwkJCQljYXNlIDE6CisJCQkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjUwOjk6IHN0YXQKKwkJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDUwLCA4ICk7CisJCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9zdGF0X2luX3Byb2c1Myk7CisJCQkJCXN0YXQxPXN0YXQoKTsKKworCQkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHN0YXQxLlRyZWUpOworCisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlnb3RvIGxvb3AxOworCQkJCX0KKwkJCX0KKworCQkJbG9vcDE6CisJCQkJOworCisJCQl9CisJCQlmaW5hbGx5CisJCQl7CisJCQkJZGJnLkV4aXRTdWJSdWxlKCAxICk7CisJCQl9CisKKworCQkJfQorCisJCQlyZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworCQkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLlJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworCQkJYWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisJCX0KKwkJY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisJCXsKKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIoaW5wdXQscmUpOworCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuRXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwkJZGJnLkxvY2F0aW9uKDUxLCA0KTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJZGJnLkV4aXRSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJwcm9nIiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvLyAkQU5UTFIgZW5kICJwcm9nIgorCisJcHVibGljIGNsYXNzIHN0YXRfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgInN0YXQiCisJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NTM6MDogc3RhdCA6ICggZXhwciBORVdMSU5FIC0+IGV4cHIgfCBJRCAnPScgZXhwciBORVdMSU5FIC0+IF4oICc9JyBJRCBleHByICkgfCBmdW5jIE5FV0xJTkUgLT4gZnVuYyB8IE5FV0xJTkUgLT4pOworCXByaXZhdGUgRGVidWdHcmFtbWFyUGFyc2VyLnN0YXRfcmV0dXJuIHN0YXQoICApCisJeworCQlEZWJ1Z0dyYW1tYXJQYXJzZXIuc3RhdF9yZXR1cm4gcmV0dmFsID0gbmV3IERlYnVnR3JhbW1hclBhcnNlci5zdGF0X3JldHVybigpOworCQlyZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworCQlDb21tb25UcmVlIHJvb3RfMCA9IG51bGw7CisKKwkJSVRva2VuIE5FV0xJTkUzPW51bGw7CisJCUlUb2tlbiBJRDQ9bnVsbDsKKwkJSVRva2VuIGNoYXJfbGl0ZXJhbDU9bnVsbDsKKwkJSVRva2VuIE5FV0xJTkU3PW51bGw7CisJCUlUb2tlbiBORVdMSU5FOT1udWxsOworCQlJVG9rZW4gTkVXTElORTEwPW51bGw7CisJCURlYnVnR3JhbW1hclBhcnNlci5leHByX3JldHVybiBleHByMiA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHI2ID0gZGVmYXVsdChEZWJ1Z0dyYW1tYXJQYXJzZXIuZXhwcl9yZXR1cm4pOworCQlEZWJ1Z0dyYW1tYXJQYXJzZXIuZnVuY19yZXR1cm4gZnVuYzggPSBkZWZhdWx0KERlYnVnR3JhbW1hclBhcnNlci5mdW5jX3JldHVybik7CisKKwkJQ29tbW9uVHJlZSBORVdMSU5FM190cmVlPW51bGw7CisJCUNvbW1vblRyZWUgSUQ0X3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWw1X3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBORVdMSU5FN190cmVlPW51bGw7CisJCUNvbW1vblRyZWUgTkVXTElORTlfdHJlZT1udWxsOworCQlDb21tb25UcmVlIE5FV0xJTkUxMF90cmVlPW51bGw7CisJCVJld3JpdGVSdWxlSVRva2VuU3RyZWFtIHN0cmVhbV9ORVdMSU5FPW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiBORVdMSU5FIik7CisJCVJld3JpdGVSdWxlSVRva2VuU3RyZWFtIHN0cmVhbV9JRD1uZXcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gSUQiKTsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtXzE3PW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAxNyIpOworCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2V4cHI9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGV4cHIiKTsKKwkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9mdW5jPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBmdW5jIik7CisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJzdGF0IiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNTMsIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjUzOjk6ICggZXhwciBORVdMSU5FIC0+IGV4cHIgfCBJRCAnPScgZXhwciBORVdMSU5FIC0+IF4oICc9JyBJRCBleHByICkgfCBmdW5jIE5FV0xJTkUgLT4gZnVuYyB8IE5FV0xJTkUgLT4pCisJCQlpbnQgYWx0Mj00OworCQkJdHJ5CisJCQl7CisJCQkJZGJnLkVudGVyRGVjaXNpb24oIDIgKTsKKworCQkJdHJ5CisJCQl7CisJCQkJaXNDeWNsaWNEZWNpc2lvbiA9IHRydWU7CisJCQkJYWx0MiA9IGRmYTIuUHJlZGljdChpbnB1dCk7CisJCQl9CisJCQljYXRjaCAoIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgKQorCQkJeworCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQkJCXRocm93IG52YWU7CisJCQl9CisJCQl9CisJCQlmaW5hbGx5CisJCQl7CisJCQkJZGJnLkV4aXREZWNpc2lvbiggMiApOworCQkJfQorCisJCQlzd2l0Y2ggKCBhbHQyICkKKwkJCXsKKwkJCWNhc2UgMToKKwkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjUzOjk6IGV4cHIgTkVXTElORQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDUzLCA4ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fc3RhdDcwKTsKKwkJCQlleHByMj1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlzdHJlYW1fZXhwci5BZGQoZXhwcjIuVHJlZSk7CisJCQkJZGJnLkxvY2F0aW9uKCA1MywgMTMgKTsKKwkJCQlORVdMSU5FMz0oSVRva2VuKU1hdGNoKGlucHV0LE5FV0xJTkUsRm9sbG93Ll9ORVdMSU5FX2luX3N0YXQ3Mik7ICAKKwkJCQlzdHJlYW1fTkVXTElORS5BZGQoTkVXTElORTMpOworCisKKworCQkJCXsKKwkJCQkvLyBBU1QgUkVXUklURQorCQkJCS8vIGVsZW1lbnRzOiBleHByCisJCQkJLy8gdG9rZW4gbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxhYmVsczogcmV0dmFsCisJCQkJLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorCQkJCS8vIHdpbGRjYXJkIGxhYmVsczogCisJCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCQkvLyA1Mzo0MTogLT4gZXhwcgorCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA1MywgNDMgKTsKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHN0cmVhbV9leHByLk5leHRUcmVlKCkpOworCisJCQkJfQorCisJCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQkJfQorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWRiZy5FbnRlckFsdCggMiApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NTQ6OTogSUQgJz0nIGV4cHIgTkVXTElORQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDU0LCA4ICk7CisJCQkJSUQ0PShJVG9rZW4pTWF0Y2goaW5wdXQsSUQsRm9sbG93Ll9JRF9pbl9zdGF0MTA1KTsgIAorCQkJCXN0cmVhbV9JRC5BZGQoSUQ0KTsKKworCQkJCWRiZy5Mb2NhdGlvbiggNTQsIDExICk7CisJCQkJY2hhcl9saXRlcmFsNT0oSVRva2VuKU1hdGNoKGlucHV0LDE3LEZvbGxvdy5fMTdfaW5fc3RhdDEwNyk7ICAKKwkJCQlzdHJlYW1fMTcuQWRkKGNoYXJfbGl0ZXJhbDUpOworCisJCQkJZGJnLkxvY2F0aW9uKCA1NCwgMTUgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9zdGF0MTA5KTsKKwkJCQlleHByNj1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlzdHJlYW1fZXhwci5BZGQoZXhwcjYuVHJlZSk7CisJCQkJZGJnLkxvY2F0aW9uKCA1NCwgMjAgKTsKKwkJCQlORVdMSU5FNz0oSVRva2VuKU1hdGNoKGlucHV0LE5FV0xJTkUsRm9sbG93Ll9ORVdMSU5FX2luX3N0YXQxMTEpOyAgCisJCQkJc3RyZWFtX05FV0xJTkUuQWRkKE5FV0xJTkU3KTsKKworCisKKwkJCQl7CisJCQkJLy8gQVNUIFJFV1JJVEUKKwkJCQkvLyBlbGVtZW50czogMTcsIElELCBleHByCisJCQkJLy8gdG9rZW4gbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxhYmVsczogcmV0dmFsCisJCQkJLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorCQkJCS8vIHdpbGRjYXJkIGxhYmVsczogCisJCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCQkvLyA1NDo0MTogLT4gXiggJz0nIElEIGV4cHIgKQorCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA1NCwgNDMgKTsKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NTQ6NDQ6IF4oICc9JyBJRCBleHByICkKKwkJCQkJeworCQkJCQlDb21tb25UcmVlIHJvb3RfMSA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQkJCWRiZy5Mb2NhdGlvbiggNTQsIDQ1ICk7CisJCQkJCXJvb3RfMSA9IChDb21tb25UcmVlKWFkYXB0b3IuQmVjb21lUm9vdChzdHJlYW1fMTcuTmV4dE5vZGUoKSwgcm9vdF8xKTsKKworCQkJCQlkYmcuTG9jYXRpb24oIDU0LCA0OSApOworCQkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX0lELk5leHROb2RlKCkpOworCQkJCQlkYmcuTG9jYXRpb24oIDU0LCA1MiApOworCQkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2V4cHIuTmV4dFRyZWUoKSk7CisKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisJCQkJCX0KKworCQkJCX0KKworCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCX0KKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlkYmcuRW50ZXJBbHQoIDMgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjU1Ojk6IGZ1bmMgTkVXTElORQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDU1LCA4ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2Z1bmNfaW5fc3RhdDE0Myk7CisJCQkJZnVuYzg9ZnVuYygpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJc3RyZWFtX2Z1bmMuQWRkKGZ1bmM4LlRyZWUpOworCQkJCWRiZy5Mb2NhdGlvbiggNTUsIDEzICk7CisJCQkJTkVXTElORTk9KElUb2tlbilNYXRjaChpbnB1dCxORVdMSU5FLEZvbGxvdy5fTkVXTElORV9pbl9zdGF0MTQ1KTsgIAorCQkJCXN0cmVhbV9ORVdMSU5FLkFkZChORVdMSU5FOSk7CisKKworCisJCQkJeworCQkJCS8vIEFTVCBSRVdSSVRFCisJCQkJLy8gZWxlbWVudHM6IGZ1bmMKKwkJCQkvLyB0b2tlbiBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKwkJCQkvLyB0b2tlbiBsaXN0IGxhYmVsczogCisJCQkJLy8gcnVsZSBsaXN0IGxhYmVsczogCisJCQkJLy8gd2lsZGNhcmQgbGFiZWxzOiAKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKwkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCS8vIDU1OjQxOiAtPiBmdW5jCisJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDU1LCA0MyApOworCQkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgc3RyZWFtX2Z1bmMuTmV4dFRyZWUoKSk7CisKKwkJCQl9CisKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQl9CisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJZGJnLkVudGVyQWx0KCA0ICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo1Njo5OiBORVdMSU5FCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNTYsIDggKTsKKwkJCQlORVdMSU5FMTA9KElUb2tlbilNYXRjaChpbnB1dCxORVdMSU5FLEZvbGxvdy5fTkVXTElORV9pbl9zdGF0MTc4KTsgIAorCQkJCXN0cmVhbV9ORVdMSU5FLkFkZChORVdMSU5FMTApOworCisKKworCQkJCXsKKwkJCQkvLyBBU1QgUkVXUklURQorCQkJCS8vIGVsZW1lbnRzOiAKKwkJCQkvLyB0b2tlbiBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKwkJCQkvLyB0b2tlbiBsaXN0IGxhYmVsczogCisJCQkJLy8gcnVsZSBsaXN0IGxhYmVsczogCisJCQkJLy8gd2lsZGNhcmQgbGFiZWxzOiAKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKwkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCS8vIDU2OjQxOiAtPgorCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA1NywgNCApOworCQkJCQlyb290XzAgPSBudWxsOworCQkJCX0KKworCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCX0KKworCQkJCX0KKwkJCQlicmVhazsKKworCQkJfQorCQkJcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKwkJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKwkJCWFkYXB0b3IuU2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJCWRiZy5Mb2NhdGlvbig1NywgNCk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWRiZy5FeGl0UnVsZSggR3JhbW1hckZpbGVOYW1lLCAic3RhdCIgKTsKKwkJCURlY1J1bGVMZXZlbCgpOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLlRlcm1pbmF0ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLy8gJEFOVExSIGVuZCAic3RhdCIKKworCXB1YmxpYyBjbGFzcyBmdW5jX3JldHVybiA6IFBhcnNlclJ1bGVSZXR1cm5TY29wZQorCXsKKwkJaW50ZXJuYWwgQ29tbW9uVHJlZSB0cmVlOworCQlwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRyZWUgeyBnZXQgeyByZXR1cm4gdHJlZTsgfSB9CisJfQorCisJLy8gJEFOVExSIHN0YXJ0ICJmdW5jIgorCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjU5OjA6IGZ1bmMgOiBJRCAnKCcgZm9ybWFsUGFyICcpJyAnPScgZXhwciAtPiBeKCBGVU5DIElEIGZvcm1hbFBhciBleHByICkgOworCXByaXZhdGUgRGVidWdHcmFtbWFyUGFyc2VyLmZ1bmNfcmV0dXJuIGZ1bmMoICApCisJeworCQlEZWJ1Z0dyYW1tYXJQYXJzZXIuZnVuY19yZXR1cm4gcmV0dmFsID0gbmV3IERlYnVnR3JhbW1hclBhcnNlci5mdW5jX3JldHVybigpOworCQlyZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworCQlDb21tb25UcmVlIHJvb3RfMCA9IG51bGw7CisKKwkJSVRva2VuIElEMTE9bnVsbDsKKwkJSVRva2VuIGNoYXJfbGl0ZXJhbDEyPW51bGw7CisJCUlUb2tlbiBjaGFyX2xpdGVyYWwxND1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsMTU9bnVsbDsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4gZm9ybWFsUGFyMTMgPSBkZWZhdWx0KERlYnVnR3JhbW1hclBhcnNlci5mb3JtYWxQYXJfcmV0dXJuKTsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIxNiA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKworCQlDb21tb25UcmVlIElEMTFfdHJlZT1udWxsOworCQlDb21tb25UcmVlIGNoYXJfbGl0ZXJhbDEyX3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWwxNF90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMTVfdHJlZT1udWxsOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fSUQ9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIElEIik7CisJCVJld3JpdGVSdWxlSVRva2VuU3RyZWFtIHN0cmVhbV8xMj1uZXcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMTIiKTsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtXzEzPW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAxMyIpOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fMTc9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDE3Iik7CisJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZm9ybWFsUGFyPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBmb3JtYWxQYXIiKTsKKwkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9leHByPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBleHByIik7CisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJmdW5jIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNTksIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjU5Ojk6ICggSUQgJygnIGZvcm1hbFBhciAnKScgJz0nIGV4cHIgLT4gXiggRlVOQyBJRCBmb3JtYWxQYXIgZXhwciApICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo1OTo5OiBJRCAnKCcgZm9ybWFsUGFyICcpJyAnPScgZXhwcgorCQkJeworCQkJZGJnLkxvY2F0aW9uKCA1OSwgOCApOworCQkJSUQxMT0oSVRva2VuKU1hdGNoKGlucHV0LElELEZvbGxvdy5fSURfaW5fZnVuYzIxOSk7ICAKKwkJCXN0cmVhbV9JRC5BZGQoSUQxMSk7CisKKwkJCWRiZy5Mb2NhdGlvbiggNTksIDEyICk7CisJCQljaGFyX2xpdGVyYWwxMj0oSVRva2VuKU1hdGNoKGlucHV0LDEyLEZvbGxvdy5fMTJfaW5fZnVuYzIyMik7ICAKKwkJCXN0cmVhbV8xMi5BZGQoY2hhcl9saXRlcmFsMTIpOworCisJCQlkYmcuTG9jYXRpb24oIDU5LCAxNiApOworCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2Zvcm1hbFBhcl9pbl9mdW5jMjI0KTsKKwkJCWZvcm1hbFBhcjEzPWZvcm1hbFBhcigpOworCisJCQlzdGF0ZS5fZnNwLS07CisKKwkJCXN0cmVhbV9mb3JtYWxQYXIuQWRkKGZvcm1hbFBhcjEzLlRyZWUpOworCQkJZGJnLkxvY2F0aW9uKCA1OSwgMjYgKTsKKwkJCWNoYXJfbGl0ZXJhbDE0PShJVG9rZW4pTWF0Y2goaW5wdXQsMTMsRm9sbG93Ll8xM19pbl9mdW5jMjI2KTsgIAorCQkJc3RyZWFtXzEzLkFkZChjaGFyX2xpdGVyYWwxNCk7CisKKwkJCWRiZy5Mb2NhdGlvbiggNTksIDMwICk7CisJCQljaGFyX2xpdGVyYWwxNT0oSVRva2VuKU1hdGNoKGlucHV0LDE3LEZvbGxvdy5fMTdfaW5fZnVuYzIyOCk7ICAKKwkJCXN0cmVhbV8xNy5BZGQoY2hhcl9saXRlcmFsMTUpOworCisJCQlkYmcuTG9jYXRpb24oIDU5LCAzNCApOworCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZnVuYzIzMCk7CisJCQlleHByMTY9ZXhwcigpOworCisJCQlzdGF0ZS5fZnNwLS07CisKKwkJCXN0cmVhbV9leHByLkFkZChleHByMTYuVHJlZSk7CisKKworCQkJeworCQkJLy8gQVNUIFJFV1JJVEUKKwkJCS8vIGVsZW1lbnRzOiBJRCwgZm9ybWFsUGFyLCBleHByCisJCQkvLyB0b2tlbiBsYWJlbHM6IAorCQkJLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorCQkJLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorCQkJLy8gcnVsZSBsaXN0IGxhYmVsczogCisJCQkvLyB3aWxkY2FyZCBsYWJlbHM6IAorCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKwkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQkvLyA1OTo0MTogLT4gXiggRlVOQyBJRCBmb3JtYWxQYXIgZXhwciApCisJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgNDMgKTsKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo1OTo0NDogXiggRlVOQyBJRCBmb3JtYWxQYXIgZXhwciApCisJCQkJeworCQkJCUNvbW1vblRyZWUgcm9vdF8xID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCA0NSApOworCQkJCXJvb3RfMSA9IChDb21tb25UcmVlKWFkYXB0b3IuQmVjb21lUm9vdCgoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShGVU5DLCAiRlVOQyIpLCByb290XzEpOworCisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgNTAgKTsKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX0lELk5leHROb2RlKCkpOworCQkJCWRiZy5Mb2NhdGlvbiggNTksIDUzICk7CisJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzEsIHN0cmVhbV9mb3JtYWxQYXIuTmV4dFRyZWUoKSk7CisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgNjMgKTsKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2V4cHIuTmV4dFRyZWUoKSk7CisKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQl9CisKKwkJCX0KKworCQkJcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKwkJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKwkJCWFkYXB0b3IuU2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCisJCQkJICBmdW5jdGlvbkRlZmluaXRpb25zLkFkZCgoKENvbW1vblRyZWUpcmV0dmFsLlRyZWUpKTsKKwkJCQkKKwkJfQorCQlkYmcuTG9jYXRpb24oNjAsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImZ1bmMiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCS8vICRBTlRMUiBlbmQgImZ1bmMiCisKKwlwdWJsaWMgY2xhc3MgZm9ybWFsUGFyX3JldHVybiA6IFBhcnNlclJ1bGVSZXR1cm5TY29wZQorCXsKKwkJaW50ZXJuYWwgQ29tbW9uVHJlZSB0cmVlOworCQlwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRyZWUgeyBnZXQgeyByZXR1cm4gdHJlZTsgfSB9CisJfQorCisJLy8gJEFOVExSIHN0YXJ0ICJmb3JtYWxQYXIiCisJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NjU6MDogZm9ybWFsUGFyIDogKCBJRCB8IElOVCApOworCXByaXZhdGUgRGVidWdHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4gZm9ybWFsUGFyKCAgKQorCXsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4gcmV0dmFsID0gbmV3IERlYnVnR3JhbW1hclBhcnNlci5mb3JtYWxQYXJfcmV0dXJuKCk7CisJCXJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisJCUNvbW1vblRyZWUgcm9vdF8wID0gbnVsbDsKKworCQlJVG9rZW4gc2V0MTc9bnVsbDsKKworCQlDb21tb25UcmVlIHNldDE3X3RyZWU9bnVsbDsKKworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAiZm9ybWFsUGFyIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNjUsIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjY2Ojk6ICggSUQgfCBJTlQgKQorCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOgorCQkJeworCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJZGJnLkxvY2F0aW9uKCA2NiwgOCApOworCQkJc2V0MTc9KElUb2tlbilpbnB1dC5MVCgxKTsKKwkJCWlmICggKGlucHV0LkxBKDEpPj1JRCAmJiBpbnB1dC5MQSgxKTw9SU5UKSApCisJCQl7CisJCQkJaW5wdXQuQ29uc3VtZSgpOworCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCAoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShzZXQxNykpOworCQkJCXN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKwkJCQlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG1zZSApOworCQkJCXRocm93IG1zZTsKKwkJCX0KKworCisJCQl9CisKKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNjgsIDEpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImZvcm1hbFBhciIgKTsKKwkJCURlY1J1bGVMZXZlbCgpOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLlRlcm1pbmF0ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLy8gJEFOVExSIGVuZCAiZm9ybWFsUGFyIgorCisJcHVibGljIGNsYXNzIGV4cHJfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgImV4cHIiCisJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NzM6MDogZXhwciA6IG11bHRFeHByICggKCAnKycgfCAnLScgKSBtdWx0RXhwciApKiA7CisJcHJpdmF0ZSBEZWJ1Z0dyYW1tYXJQYXJzZXIuZXhwcl9yZXR1cm4gZXhwciggICkKKwl7CisJCURlYnVnR3JhbW1hclBhcnNlci5leHByX3JldHVybiByZXR2YWwgPSBuZXcgRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKCk7CisJCXJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisJCUNvbW1vblRyZWUgcm9vdF8wID0gbnVsbDsKKworCQlJVG9rZW4gY2hhcl9saXRlcmFsMTk9bnVsbDsKKwkJSVRva2VuIGNoYXJfbGl0ZXJhbDIwPW51bGw7CisJCURlYnVnR3JhbW1hclBhcnNlci5tdWx0RXhwcl9yZXR1cm4gbXVsdEV4cHIxOCA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybik7CisJCURlYnVnR3JhbW1hclBhcnNlci5tdWx0RXhwcl9yZXR1cm4gbXVsdEV4cHIyMSA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybik7CisKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWwxOV90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMjBfdHJlZT1udWxsOworCisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJleHByIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNzMsIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjczOjk6ICggbXVsdEV4cHIgKCAoICcrJyB8ICctJyApIG11bHRFeHByICkqICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo3Mzo5OiBtdWx0RXhwciAoICggJysnIHwgJy0nICkgbXVsdEV4cHIgKSoKKwkJCXsKKwkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisKKwkJCWRiZy5Mb2NhdGlvbiggNzMsIDggKTsKKwkJCVB1c2hGb2xsb3coRm9sbG93Ll9tdWx0RXhwcl9pbl9leHByMjg4KTsKKwkJCW11bHRFeHByMTg9bXVsdEV4cHIoKTsKKworCQkJc3RhdGUuX2ZzcC0tOworCisJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgbXVsdEV4cHIxOC5UcmVlKTsKKwkJCWRiZy5Mb2NhdGlvbiggNzMsIDE3ICk7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo3MzoxODogKCAoICcrJyB8ICctJyApIG11bHRFeHByICkqCisJCQl0cnkKKwkJCXsKKwkJCQlkYmcuRW50ZXJTdWJSdWxlKCA0ICk7CisKKwkJCWZvciAoIDsgOyApCisJCQl7CisJCQkJaW50IGFsdDQ9MjsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWRiZy5FbnRlckRlY2lzaW9uKCA0ICk7CisKKwkJCQlpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKKworCQkJCWlmICggKExBNF8wPT0xMHx8TEE0XzA9PTE2KSApCisJCQkJeworCQkJCQlhbHQ0PTE7CisJCQkJfQorCisKKwkJCQl9CisJCQkJZmluYWxseQorCQkJCXsKKwkJCQkJZGJnLkV4aXREZWNpc2lvbiggNCApOworCQkJCX0KKworCQkJCXN3aXRjaCAoIGFsdDQgKQorCQkJCXsKKwkJCQljYXNlIDE6CisJCQkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjczOjE5OiAoICcrJyB8ICctJyApIG11bHRFeHByCisJCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA3MywgMTggKTsKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NzM6MTk6ICggJysnIHwgJy0nICkKKwkJCQkJaW50IGFsdDM9MjsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCWRiZy5FbnRlclN1YlJ1bGUoIDMgKTsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCWRiZy5FbnRlckRlY2lzaW9uKCAzICk7CisKKwkJCQkJaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKwkJCQkJaWYgKCAoTEEzXzA9PTE2KSApCisJCQkJCXsKKwkJCQkJCWFsdDM9MTsKKwkJCQkJfQorCQkJCQllbHNlIGlmICggKExBM18wPT0xMCkgKQorCQkJCQl7CisJCQkJCQlhbHQzPTI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzLCAwLCBpbnB1dCk7CisKKwkJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQkJCQkJdGhyb3cgbnZhZTsKKwkJCQkJfQorCQkJCQl9CisJCQkJCWZpbmFsbHkKKwkJCQkJeworCQkJCQkJZGJnLkV4aXREZWNpc2lvbiggMyApOworCQkJCQl9CisKKwkJCQkJc3dpdGNoICggYWx0MyApCisJCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjczOjIwOiAnKycKKwkJCQkJCXsKKwkJCQkJCWRiZy5Mb2NhdGlvbiggNzMsIDIyICk7CisJCQkJCQljaGFyX2xpdGVyYWwxOT0oSVRva2VuKU1hdGNoKGlucHV0LDE2LEZvbGxvdy5fMTZfaW5fZXhwcjI5Mik7IAorCQkJCQkJY2hhcl9saXRlcmFsMTlfdHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuQ3JlYXRlKGNoYXJfbGl0ZXJhbDE5KTsKKwkJCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuQmVjb21lUm9vdChjaGFyX2xpdGVyYWwxOV90cmVlLCByb290XzApOworCisKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlkYmcuRW50ZXJBbHQoIDIgKTsKKworCQkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6NzM6MjU6ICctJworCQkJCQkJeworCQkJCQkJZGJnLkxvY2F0aW9uKCA3MywgMjcgKTsKKwkJCQkJCWNoYXJfbGl0ZXJhbDIwPShJVG9rZW4pTWF0Y2goaW5wdXQsMTAsRm9sbG93Ll8xMF9pbl9leHByMjk1KTsgCisJCQkJCQljaGFyX2xpdGVyYWwyMF90cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5DcmVhdGUoY2hhcl9saXRlcmFsMjApOworCQkJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5CZWNvbWVSb290KGNoYXJfbGl0ZXJhbDIwX3RyZWUsIHJvb3RfMCk7CisKKworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJfQorCQkJCQl9CisJCQkJCWZpbmFsbHkKKwkJCQkJeworCQkJCQkJZGJnLkV4aXRTdWJSdWxlKCAzICk7CisJCQkJCX0KKworCQkJCQlkYmcuTG9jYXRpb24oIDczLCAzMCApOworCQkJCQlQdXNoRm9sbG93KEZvbGxvdy5fbXVsdEV4cHJfaW5fZXhwcjI5OSk7CisJCQkJCW11bHRFeHByMjE9bXVsdEV4cHIoKTsKKworCQkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIG11bHRFeHByMjEuVHJlZSk7CisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWdvdG8gbG9vcDQ7CisJCQkJfQorCQkJfQorCisJCQlsb29wNDoKKwkJCQk7CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdFN1YlJ1bGUoIDQgKTsKKwkJCX0KKworCisJCQl9CisKKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNzQsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImV4cHIiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCS8vICRBTlRMUiBlbmQgImV4cHIiCisKKwlwdWJsaWMgY2xhc3MgbXVsdEV4cHJfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgIm11bHRFeHByIgorCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjc2OjA6IG11bHRFeHByIDogYXRvbSAoICggJyonIHwgJy8nIHwgJyUnICkgYXRvbSApKiA7CisJcHJpdmF0ZSBEZWJ1Z0dyYW1tYXJQYXJzZXIubXVsdEV4cHJfcmV0dXJuIG11bHRFeHByKCAgKQorCXsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybiByZXR2YWwgPSBuZXcgRGVidWdHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybigpOworCQlyZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworCQlDb21tb25UcmVlIHJvb3RfMCA9IG51bGw7CisKKwkJSVRva2VuIHNldDIzPW51bGw7CisJCURlYnVnR3JhbW1hclBhcnNlci5hdG9tX3JldHVybiBhdG9tMjIgPSBkZWZhdWx0KERlYnVnR3JhbW1hclBhcnNlci5hdG9tX3JldHVybik7CisJCURlYnVnR3JhbW1hclBhcnNlci5hdG9tX3JldHVybiBhdG9tMjQgPSBkZWZhdWx0KERlYnVnR3JhbW1hclBhcnNlci5hdG9tX3JldHVybik7CisKKwkJQ29tbW9uVHJlZSBzZXQyM190cmVlPW51bGw7CisKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgIm11bHRFeHByIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNzYsIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjc3Ojk6ICggYXRvbSAoICggJyonIHwgJy8nIHwgJyUnICkgYXRvbSApKiApCisJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6Nzc6OTogYXRvbSAoICggJyonIHwgJy8nIHwgJyUnICkgYXRvbSApKgorCQkJeworCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJZGJnLkxvY2F0aW9uKCA3NywgOCApOworCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2F0b21faW5fbXVsdEV4cHIzMjApOworCQkJYXRvbTIyPWF0b20oKTsKKworCQkJc3RhdGUuX2ZzcC0tOworCisJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgYXRvbTIyLlRyZWUpOworCQkJZGJnLkxvY2F0aW9uKCA3NywgMTMgKTsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjc3OjE0OiAoICggJyonIHwgJy8nIHwgJyUnICkgYXRvbSApKgorCQkJdHJ5CisJCQl7CisJCQkJZGJnLkVudGVyU3ViUnVsZSggNSApOworCisJCQlmb3IgKCA7IDsgKQorCQkJeworCQkJCWludCBhbHQ1PTI7CisJCQkJdHJ5CisJCQkJeworCQkJCQlkYmcuRW50ZXJEZWNpc2lvbiggNSApOworCisJCQkJaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKwkJCQlpZiAoIChMQTVfMD09MTF8fChMQTVfMD49MTQgJiYgTEE1XzA8PTE1KSkgKQorCQkJCXsKKwkJCQkJYWx0NT0xOworCQkJCX0KKworCisJCQkJfQorCQkJCWZpbmFsbHkKKwkJCQl7CisJCQkJCWRiZy5FeGl0RGVjaXNpb24oIDUgKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKCBhbHQ1ICkKKwkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo3NzoxNTogKCAnKicgfCAnLycgfCAnJScgKSBhdG9tCisJCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA3NywgMjcgKTsKKwkJCQkJc2V0MjM9KElUb2tlbilpbnB1dC5MVCgxKTsKKwkJCQkJc2V0MjM9KElUb2tlbilpbnB1dC5MVCgxKTsKKwkJCQkJaWYgKCBpbnB1dC5MQSgxKT09MTF8fChpbnB1dC5MQSgxKT49MTQgJiYgaW5wdXQuTEEoMSk8PTE1KSApCisJCQkJCXsKKwkJCQkJCWlucHV0LkNvbnN1bWUoKTsKKwkJCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuQmVjb21lUm9vdCgoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShzZXQyMyksIHJvb3RfMCk7CisJCQkJCQlzdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKwkJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbXNlICk7CisJCQkJCQl0aHJvdyBtc2U7CisJCQkJCX0KKworCQkJCQlkYmcuTG9jYXRpb24oIDc3LCAyOSApOworCQkJCQlQdXNoRm9sbG93KEZvbGxvdy5fYXRvbV9pbl9tdWx0RXhwcjMzMik7CisJCQkJCWF0b20yND1hdG9tKCk7CisKKwkJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCBhdG9tMjQuVHJlZSk7CisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWdvdG8gbG9vcDU7CisJCQkJfQorCQkJfQorCisJCQlsb29wNToKKwkJCQk7CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdFN1YlJ1bGUoIDUgKTsKKwkJCX0KKworCisJCQl9CisKKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNzgsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgIm11bHRFeHByIiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvLyAkQU5UTFIgZW5kICJtdWx0RXhwciIKKworCXB1YmxpYyBjbGFzcyBhdG9tX3JldHVybiA6IFBhcnNlclJ1bGVSZXR1cm5TY29wZQorCXsKKwkJaW50ZXJuYWwgQ29tbW9uVHJlZSB0cmVlOworCQlwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRyZWUgeyBnZXQgeyByZXR1cm4gdHJlZTsgfSB9CisJfQorCisJLy8gJEFOVExSIHN0YXJ0ICJhdG9tIgorCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjgwOjA6IGF0b20gOiAoIElOVCB8IElEIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgfCBJRCAnKCcgZXhwciAnKScgLT4gXiggQ0FMTCBJRCBleHByICkgKTsKKwlwcml2YXRlIERlYnVnR3JhbW1hclBhcnNlci5hdG9tX3JldHVybiBhdG9tKCAgKQorCXsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmF0b21fcmV0dXJuIHJldHZhbCA9IG5ldyBEZWJ1Z0dyYW1tYXJQYXJzZXIuYXRvbV9yZXR1cm4oKTsKKwkJcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKwkJQ29tbW9uVHJlZSByb290XzAgPSBudWxsOworCisJCUlUb2tlbiBJTlQyNT1udWxsOworCQlJVG9rZW4gSUQyNj1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsMjc9bnVsbDsKKwkJSVRva2VuIGNoYXJfbGl0ZXJhbDI5PW51bGw7CisJCUlUb2tlbiBJRDMwPW51bGw7CisJCUlUb2tlbiBjaGFyX2xpdGVyYWwzMT1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsMzM9bnVsbDsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIyOCA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKwkJRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIzMiA9IGRlZmF1bHQoRGVidWdHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKworCQlDb21tb25UcmVlIElOVDI1X3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBJRDI2X3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWwyN190cmVlPW51bGw7CisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMjlfdHJlZT1udWxsOworCQlDb21tb25UcmVlIElEMzBfdHJlZT1udWxsOworCQlDb21tb25UcmVlIGNoYXJfbGl0ZXJhbDMxX3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWwzM190cmVlPW51bGw7CisJCVJld3JpdGVSdWxlSVRva2VuU3RyZWFtIHN0cmVhbV8xMj1uZXcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMTIiKTsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtXzEzPW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAxMyIpOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fSUQ9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIElEIik7CisJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZXhwcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZXhwciIpOworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAiYXRvbSIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDgwLCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo4MDo5OiAoIElOVCB8IElEIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgfCBJRCAnKCcgZXhwciAnKScgLT4gXiggQ0FMTCBJRCBleHByICkgKQorCQkJaW50IGFsdDY9NDsKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlckRlY2lzaW9uKCA2ICk7CisKKwkJCXN3aXRjaCAoIGlucHV0LkxBKDEpICkKKwkJCXsKKwkJCWNhc2UgSU5UOgorCQkJCXsKKwkJCQlhbHQ2PTE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJRDoKKwkJCQl7CisJCQkJaW50IExBNl8yID0gaW5wdXQuTEEoMik7CisKKwkJCQlpZiAoIChMQTZfMj09MTIpICkKKwkJCQl7CisJCQkJCWFsdDY9NDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIChMQTZfMj09TkVXTElORXx8KExBNl8yPj0xMCAmJiBMQTZfMjw9MTEpfHwoTEE2XzI+PTEzICYmIExBNl8yPD0xNikpICkKKwkJCQl7CisJCQkJCWFsdDY9MjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNiwgMiwgaW5wdXQpOworCisJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQkJCQl0aHJvdyBudmFlOworCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDEyOgorCQkJCXsKKwkJCQlhbHQ2PTM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDYsIDAsIGlucHV0KTsKKworCQkJCQlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKwkJCQkJdGhyb3cgbnZhZTsKKwkJCQl9CisJCQl9CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdERlY2lzaW9uKCA2ICk7CisJCQl9CisKKwkJCXN3aXRjaCAoIGFsdDYgKQorCQkJeworCQkJY2FzZSAxOgorCQkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6ODA6OTogSU5UCisJCQkJeworCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisKKwkJCQlkYmcuTG9jYXRpb24oIDgwLCA4ICk7CisJCQkJSU5UMjU9KElUb2tlbilNYXRjaChpbnB1dCxJTlQsRm9sbG93Ll9JTlRfaW5fYXRvbTM0OCk7IAorCQkJCUlOVDI1X3RyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShJTlQyNSk7CisJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIElOVDI1X3RyZWUpOworCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJZGJnLkVudGVyQWx0KCAyICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnR3JhbW1hci5nMzo4MTo5OiBJRAorCQkJCXsKKwkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCisJCQkJZGJnLkxvY2F0aW9uKCA4MSwgOCApOworCQkJCUlEMjY9KElUb2tlbilNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX2F0b20zNTgpOyAKKwkJCQlJRDI2X3RyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShJRDI2KTsKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgSUQyNl90cmVlKTsKKworCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWRiZy5FbnRlckFsdCggMyApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6ODI6OTogJygnIGV4cHIgJyknCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggODIsIDggKTsKKwkJCQljaGFyX2xpdGVyYWwyNz0oSVRva2VuKU1hdGNoKGlucHV0LDEyLEZvbGxvdy5fMTJfaW5fYXRvbTM2OCk7ICAKKwkJCQlzdHJlYW1fMTIuQWRkKGNoYXJfbGl0ZXJhbDI3KTsKKworCQkJCWRiZy5Mb2NhdGlvbiggODIsIDEyICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fYXRvbTM3MCk7CisJCQkJZXhwcjI4PWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCXN0cmVhbV9leHByLkFkZChleHByMjguVHJlZSk7CisJCQkJZGJnLkxvY2F0aW9uKCA4MiwgMTcgKTsKKwkJCQljaGFyX2xpdGVyYWwyOT0oSVRva2VuKU1hdGNoKGlucHV0LDEzLEZvbGxvdy5fMTNfaW5fYXRvbTM3Mik7ICAKKwkJCQlzdHJlYW1fMTMuQWRkKGNoYXJfbGl0ZXJhbDI5KTsKKworCisKKwkJCQl7CisJCQkJLy8gQVNUIFJFV1JJVEUKKwkJCQkvLyBlbGVtZW50czogZXhwcgorCQkJCS8vIHRva2VuIGxhYmVsczogCisJCQkJLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorCQkJCS8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyB3aWxkY2FyZCBsYWJlbHM6IAorCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQkJLy8gODI6MjU6IC0+IGV4cHIKKwkJCQl7CisJCQkJCWRiZy5Mb2NhdGlvbiggODIsIDI3ICk7CisJCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCBzdHJlYW1fZXhwci5OZXh0VHJlZSgpKTsKKworCQkJCX0KKworCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCX0KKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlkYmcuRW50ZXJBbHQoIDQgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdHcmFtbWFyLmczOjgzOjk6IElEICcoJyBleHByICcpJworCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDgzLCA4ICk7CisJCQkJSUQzMD0oSVRva2VuKU1hdGNoKGlucHV0LElELEZvbGxvdy5fSURfaW5fYXRvbTM4OSk7ICAKKwkJCQlzdHJlYW1fSUQuQWRkKElEMzApOworCisJCQkJZGJnLkxvY2F0aW9uKCA4MywgMTEgKTsKKwkJCQljaGFyX2xpdGVyYWwzMT0oSVRva2VuKU1hdGNoKGlucHV0LDEyLEZvbGxvdy5fMTJfaW5fYXRvbTM5MSk7ICAKKwkJCQlzdHJlYW1fMTIuQWRkKGNoYXJfbGl0ZXJhbDMxKTsKKworCQkJCWRiZy5Mb2NhdGlvbiggODMsIDE1ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fYXRvbTM5Myk7CisJCQkJZXhwcjMyPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCXN0cmVhbV9leHByLkFkZChleHByMzIuVHJlZSk7CisJCQkJZGJnLkxvY2F0aW9uKCA4MywgMjAgKTsKKwkJCQljaGFyX2xpdGVyYWwzMz0oSVRva2VuKU1hdGNoKGlucHV0LDEzLEZvbGxvdy5fMTNfaW5fYXRvbTM5NSk7ICAKKwkJCQlzdHJlYW1fMTMuQWRkKGNoYXJfbGl0ZXJhbDMzKTsKKworCisKKwkJCQl7CisJCQkJLy8gQVNUIFJFV1JJVEUKKwkJCQkvLyBlbGVtZW50czogSUQsIGV4cHIKKwkJCQkvLyB0b2tlbiBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKwkJCQkvLyB0b2tlbiBsaXN0IGxhYmVsczogCisJCQkJLy8gcnVsZSBsaXN0IGxhYmVsczogCisJCQkJLy8gd2lsZGNhcmQgbGFiZWxzOiAKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKwkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCS8vIDgzOjI1OiAtPiBeKCBDQUxMIElEIGV4cHIgKQorCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA4MywgMjcgKTsKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z0dyYW1tYXIuZzM6ODM6Mjg6IF4oIENBTEwgSUQgZXhwciApCisJCQkJCXsKKwkJCQkJQ29tbW9uVHJlZSByb290XzEgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCQlkYmcuTG9jYXRpb24oIDgzLCAyOSApOworCQkJCQlyb290XzEgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkJlY29tZVJvb3QoKENvbW1vblRyZWUpYWRhcHRvci5DcmVhdGUoQ0FMTCwgIkNBTEwiKSwgcm9vdF8xKTsKKworCQkJCQlkYmcuTG9jYXRpb24oIDgzLCAzNCApOworCQkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX0lELk5leHROb2RlKCkpOworCQkJCQlkYmcuTG9jYXRpb24oIDgzLCAzNyApOworCQkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2V4cHIuTmV4dFRyZWUoKSk7CisKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisJCQkJCX0KKworCQkJCX0KKworCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCX0KKworCQkJCX0KKwkJCQlicmVhazsKKworCQkJfQorCQkJcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKwkJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKwkJCWFkYXB0b3IuU2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJCWRiZy5Mb2NhdGlvbig4NCwgNCk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWRiZy5FeGl0UnVsZSggR3JhbW1hckZpbGVOYW1lLCAiYXRvbSIgKTsKKwkJCURlY1J1bGVMZXZlbCgpOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLlRlcm1pbmF0ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLy8gJEFOVExSIGVuZCAiYXRvbSIKKwkjZW5kcmVnaW9uIFJ1bGVzCisKKworCSNyZWdpb24gREZBCisJREZBMiBkZmEyOworCisJcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgSW5pdERGQXMoKQorCXsKKwkJYmFzZS5Jbml0REZBcygpOworCQlkZmEyID0gbmV3IERGQTIoIHRoaXMgKTsKKwl9CisKKwljbGFzcyBERkEyIDogREZBCisJeworCisJCWNvbnN0IHN0cmluZyBERkEyX2VvdFMgPQorCQkJIlx4QVx4RkZGRiI7CisJCWNvbnN0IHN0cmluZyBERkEyX2VvZlMgPQorCQkJIlx4QVx4RkZGRiI7CisJCWNvbnN0IHN0cmluZyBERkEyX21pblMgPQorCQkJIlx4MVx4Nlx4MVx4RkZGRlx4MVx4OFx4MVx4RkZGRlx4MVx4Nlx4MVx4RkZGRlx4Mlx4QVx4MVx4OFx4MVx4RkZGRiI7CisJCWNvbnN0IHN0cmluZyBERkEyX21heFMgPQorCQkJIlx4MVx4Q1x4MVx4RkZGRlx4MVx4MTFceDFceEZGRkZceDFceENceDFceEZGRkZceDJceDEwXHgxXHgxMVx4MVx4RkZGRiI7CisJCWNvbnN0IHN0cmluZyBERkEyX2FjY2VwdFMgPQorCQkJIlx4MVx4RkZGRlx4MVx4MVx4MVx4RkZGRlx4MVx4NFx4MVx4RkZGRlx4MVx4Mlx4M1x4RkZGRlx4MVx4MyI7CisJCWNvbnN0IHN0cmluZyBERkEyX3NwZWNpYWxTID0KKwkJCSJceEFceEZGRkZ9PiI7CisJCXN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBERkEyX3RyYW5zaXRpb25TID0KKwkJCXsKKwkJCQkiXHgxXHgyXHgxXHgxXHgxXHgzXHgzXHhGRkZGXHgxXHgxIiwKKwkJCQkiIiwKKwkJCQkiXHgxXHgxXHgxXHhGRkZGXHgyXHgxXHgxXHg0XHgxXHhGRkZGXHgzXHgxXHgxXHg1IiwKKwkJCQkiIiwKKwkJCQkiXHgxXHg3XHgxXHg2XHg0XHhGRkZGXHgxXHgxIiwKKwkJCQkiIiwKKwkJCQkiXHgyXHgxXHgxXHhGRkZGXHgxXHg4XHgzXHgxIiwKKwkJCQkiXHgzXHgxXHgxXHg4XHgzXHgxIiwKKwkJCQkiXHgxXHgxXHgxXHhGRkZGXHgyXHgxXHgyXHhGRkZGXHgzXHgxXHgxXHg5IiwKKwkJCQkiIgorCQkJfTsKKworCQlzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkEyX2VvdCA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfZW90Uyk7CisJCXN0YXRpYyByZWFkb25seSBzaG9ydFtdIERGQTJfZW9mID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBMl9lb2ZTKTsKKwkJc3RhdGljIHJlYWRvbmx5IGNoYXJbXSBERkEyX21pbiA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTJfbWluUyk7CisJCXN0YXRpYyByZWFkb25seSBjaGFyW10gREZBMl9tYXggPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyX21heFMpOworCQlzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkEyX2FjY2VwdCA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfYWNjZXB0Uyk7CisJCXN0YXRpYyByZWFkb25seSBzaG9ydFtdIERGQTJfc3BlY2lhbCA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfc3BlY2lhbFMpOworCQlzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXVtdIERGQTJfdHJhbnNpdGlvbjsKKworCQlzdGF0aWMgREZBMigpCisJCXsKKwkJCWludCBudW1TdGF0ZXMgPSBERkEyX3RyYW5zaXRpb25TLkxlbmd0aDsKKwkJCURGQTJfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisJCQlmb3IgKCBpbnQgaT0wOyBpIDwgbnVtU3RhdGVzOyBpKysgKQorCQkJeworCQkJCURGQTJfdHJhbnNpdGlvbltpXSA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfdHJhbnNpdGlvblNbaV0pOworCQkJfQorCQl9CisKKwkJcHVibGljIERGQTIoIEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIgKQorCQl7CisJCQl0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworCQkJdGhpcy5kZWNpc2lvbk51bWJlciA9IDI7CisJCQl0aGlzLmVvdCA9IERGQTJfZW90OworCQkJdGhpcy5lb2YgPSBERkEyX2VvZjsKKwkJCXRoaXMubWluID0gREZBMl9taW47CisJCQl0aGlzLm1heCA9IERGQTJfbWF4OworCQkJdGhpcy5hY2NlcHQgPSBERkEyX2FjY2VwdDsKKwkJCXRoaXMuc3BlY2lhbCA9IERGQTJfc3BlY2lhbDsKKwkJCXRoaXMudHJhbnNpdGlvbiA9IERGQTJfdHJhbnNpdGlvbjsKKwkJfQorCQlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdldERlc2NyaXB0aW9uKCkKKwkJeworCQkJcmV0dXJuICI1MzowOiBzdGF0IDogKCBleHByIE5FV0xJTkUgLT4gZXhwciB8IElEICc9JyBleHByIE5FV0xJTkUgLT4gXiggJz0nIElEIGV4cHIgKSB8IGZ1bmMgTkVXTElORSAtPiBmdW5jIHwgTkVXTElORSAtPik7IjsKKwkJfQorCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFcnJvciggTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSApCisJCXsKKwkJCSgoRGVidWdQYXJzZXIpcmVjb2duaXplcikuZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBudmFlICk7CisJCX0KKwl9CisKKworCSNlbmRyZWdpb24gREZBCisKKwkjcmVnaW9uIEZvbGxvdyBzZXRzCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9sbG93CisJeworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfc3RhdF9pbl9wcm9nNTMgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTFDMlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX3N0YXQ3MCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfTkVXTElORV9pbl9zdGF0NzIgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9JRF9pbl9zdGF0MTA1ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDIwMDAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzE3X2luX3N0YXQxMDcgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTBDMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX3N0YXQxMDkgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX05FV0xJTkVfaW5fc3RhdDExMSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2Z1bmNfaW5fc3RhdDE0MyA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfTkVXTElORV9pbl9zdGF0MTQ1ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfTkVXTElORV9pbl9zdGF0MTc4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fZnVuYzIxOSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMDAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzEyX2luX2Z1bmMyMjIgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4QzBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZm9ybWFsUGFyX2luX2Z1bmMyMjQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MjAwMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xM19pbl9mdW5jMjI2ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDIwMDAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzE3X2luX2Z1bmMyMjggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTBDMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2Z1bmMyMzAgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9zZXRfaW5fZm9ybWFsUGFyMjY3ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfbXVsdEV4cHJfaW5fZXhwcjI4OCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMDQwMlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xNl9pbl9leHByMjkyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwQzBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTBfaW5fZXhwcjI5NSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMEMwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX211bHRFeHByX2luX2V4cHIyOTkgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTA0MDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfYXRvbV9pbl9tdWx0RXhwcjMyMCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHhDODAyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX3NldF9pbl9tdWx0RXhwcjMyMyA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMEMwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2F0b21faW5fbXVsdEV4cHIzMzIgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4QzgwMlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9JTlRfaW5fYXRvbTM0OCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX0lEX2luX2F0b20zNTggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xMl9pbl9hdG9tMzY4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwQzBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9hdG9tMzcwID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDIwMDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTNfaW5fYXRvbTM3MiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX0lEX2luX2F0b20zODkgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTAwMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xMl9pbl9hdG9tMzkxID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwQzBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9hdG9tMzkzID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDIwMDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTNfaW5fYXRvbTM5NSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKworCX0KKwkjZW5kcmVnaW9uIEZvbGxvdyBzZXRzCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdHcmFtbWFyUGFyc2VySGVscGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnR3JhbW1hclBhcnNlckhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJlYjIwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnR3JhbW1hclBhcnNlckhlbHBlci5jcwpAQCAtMCwwICsxLDQwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgQW50bHIuUnVudGltZS5UcmVlOworCitwYXJ0aWFsIGNsYXNzIERlYnVnR3JhbW1hclBhcnNlcgoreworICAgIC8qKiBMaXN0IG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBNdXN0IHBvaW50IGF0IHRoZSBGVU5DIG5vZGVzLiAqLworICAgIExpc3Q8Q29tbW9uVHJlZT4gZnVuY3Rpb25EZWZpbml0aW9ucyA9IG5ldyBMaXN0PENvbW1vblRyZWU+KCk7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdUcmVlR3JhbW1hci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z1RyZWVHcmFtbWFyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTIyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdUcmVlR3JhbW1hci5jcwpAQCAtMCwwICsxLDg0NSBAQAorLy8gJEFOVExSIDMuMS4yIEJ1aWxkT3B0aW9uc1xcRGVidWdUcmVlR3JhbW1hci5nMyAyMDA5LTA5LTMwIDEzOjE4OjE1CisKKy8vIFRoZSB2YXJpYWJsZSAndmFyaWFibGUnIGlzIGFzc2lnbmVkIGJ1dCBpdHMgdmFsdWUgaXMgbmV2ZXIgdXNlZC4KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDIxOQorLy8gVW5yZWFjaGFibGUgY29kZSBkZXRlY3RlZC4KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE2MgorCisKKy8vaW1wb3J0IGphdmEudXRpbC5NYXA7CisvL2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK3VzaW5nIEJpZ0ludGVnZXIgPSBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK3VzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKworCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIEFudGxyLlJ1bnRpbWU7Cit1c2luZyBBbnRsci5SdW50aW1lLlRyZWU7Cit1c2luZyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSA9IEFudGxyLlJ1bnRpbWUuVHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtO3VzaW5nIFN0YWNrID0gU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU3RhY2s8b2JqZWN0PjsKK3VzaW5nIExpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7Cit1c2luZyBBcnJheUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0PG9iamVjdD47CisKK3VzaW5nIEFudGxyLlJ1bnRpbWUuRGVidWc7Cit1c2luZyBJT0V4Y2VwdGlvbiA9IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbjsKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICIzLjEuMiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorcHVibGljIHBhcnRpYWwgY2xhc3MgRGVidWdUcmVlR3JhbW1hciA6IERlYnVnVHJlZVBhcnNlcgoreworCWludGVybmFsIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IHN0cmluZ1tdIHsKKwkJIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJDQUxMIiwgIkZVTkMiLCAiSUQiLCAiSU5UIiwgIk5FV0xJTkUiLCAiV1MiLCAiJy0nIiwgIiclJyIsICInKCciLCAiJyknIiwgIicqJyIsICInLyciLCAiJysnIiwgIic9JyIKKwl9OworCXB1YmxpYyBjb25zdCBpbnQgRU9GPS0xOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTA9MTA7CisJcHVibGljIGNvbnN0IGludCBUX18xMT0xMTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEyPTEyOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTM9MTM7CisJcHVibGljIGNvbnN0IGludCBUX18xND0xNDsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE1PTE1OworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTY9MTY7CisJcHVibGljIGNvbnN0IGludCBUX18xNz0xNzsKKwlwdWJsaWMgY29uc3QgaW50IENBTEw9NDsKKwlwdWJsaWMgY29uc3QgaW50IEZVTkM9NTsKKwlwdWJsaWMgY29uc3QgaW50IElEPTY7CisJcHVibGljIGNvbnN0IGludCBJTlQ9NzsKKwlwdWJsaWMgY29uc3QgaW50IE5FV0xJTkU9ODsKKwlwdWJsaWMgY29uc3QgaW50IFdTPTk7CisKKwkvLyBkZWxlZ2F0ZXMKKwkvLyBkZWxlZ2F0b3JzCisKKwlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIHJ1bGVOYW1lcyA9CisJCW5ldyBzdHJpbmdbXQorCQl7CisJCQkiaW52YWxpZFJ1bGUiLCAiY2FsbCIsICJleHByIiwgInByb2ciLCAic3RhdCIKKwkJfTsKKworCQlpbnQgcnVsZUxldmVsID0gMDsKKwkJcHVibGljIHZpcnR1YWwgaW50IFJ1bGVMZXZlbCB7IGdldCB7IHJldHVybiBydWxlTGV2ZWw7IH0gfQorCQlwdWJsaWMgdmlydHVhbCB2b2lkIEluY1J1bGVMZXZlbCgpIHsgcnVsZUxldmVsKys7IH0KKwkJcHVibGljIHZpcnR1YWwgdm9pZCBEZWNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbC0tOyB9CisJCXB1YmxpYyBEZWJ1Z1RyZWVHcmFtbWFyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQgKQorCQkJOiB0aGlzKCBpbnB1dCwgRGVidWdFdmVudFNvY2tldFByb3h5LkRlZmF1bHREZWJ1Z2dlclBvcnQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSApCisJCXsKKwkJfQorCQlwdWJsaWMgRGVidWdUcmVlR3JhbW1hciggSVRyZWVOb2RlU3RyZWFtIGlucHV0LCBpbnQgcG9ydCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwkJCTogYmFzZSggaW5wdXQsIHN0YXRlICkKKwkJeworCQkJRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0gbmV3IERlYnVnRXZlbnRTb2NrZXRQcm94eSggdGhpcywgcG9ydCwgaW5wdXQuVHJlZUFkYXB0b3IgKTsKKwkJCURlYnVnTGlzdGVuZXIgPSBwcm94eTsKKwkJCXRyeQorCQkJeworCQkJCXByb3h5LkhhbmRzaGFrZSgpOworCQkJfQorCQkJY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpb2UgKQorCQkJeworCQkJCVJlcG9ydEVycm9yKCBpb2UgKTsKKwkJCX0KKwkJfQorCXB1YmxpYyBEZWJ1Z1RyZWVHcmFtbWFyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKwkJOiBiYXNlKCBpbnB1dCwgZGJnLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKQorCXsKKworCX0KKwlwcm90ZWN0ZWQgdmlydHVhbCBib29sIEV2YWxQcmVkaWNhdGUoIGJvb2wgcmVzdWx0LCBzdHJpbmcgcHJlZGljYXRlICkKKwl7CisJCWRiZy5TZW1hbnRpY1ByZWRpY2F0ZSggcmVzdWx0LCBwcmVkaWNhdGUgKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKworCXB1YmxpYyBvdmVycmlkZSBzdHJpbmdbXSBUb2tlbk5hbWVzIHsgZ2V0IHsgcmV0dXJuIERlYnVnVHJlZUdyYW1tYXIudG9rZW5OYW1lczsgfSB9CisJcHVibGljIG92ZXJyaWRlIHN0cmluZyBHcmFtbWFyRmlsZU5hbWUgeyBnZXQgeyByZXR1cm4gIkJ1aWxkT3B0aW9uc1xcRGVidWdUcmVlR3JhbW1hci5nMyI7IH0gfQorCisKKwkjcmVnaW9uIFJ1bGVzCisKKwkvLyAkQU5UTFIgc3RhcnQgInByb2ciCisJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjUzOjA6IHByb2cgOiAoIHN0YXQgKSogOworCXByaXZhdGUgdm9pZCBwcm9nKCAgKQorCXsKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInByb2ciICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA1MywgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjUzOjk6ICggKCBzdGF0ICkqICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NTM6OTogKCBzdGF0ICkqCisJCQl7CisJCQlkYmcuTG9jYXRpb24oIDUzLCA4ICk7CisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NTM6OTogKCBzdGF0ICkqCisJCQl0cnkKKwkJCXsKKwkJCQlkYmcuRW50ZXJTdWJSdWxlKCAxICk7CisKKwkJCWZvciAoIDsgOyApCisJCQl7CisJCQkJaW50IGFsdDE9MjsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWRiZy5FbnRlckRlY2lzaW9uKCAxICk7CisKKwkJCQlpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworCQkJCWlmICggKChMQTFfMD49Q0FMTCAmJiBMQTFfMDw9SU5UKXx8KExBMV8wPj0xMCAmJiBMQTFfMDw9MTEpfHwoTEExXzA+PTE0ICYmIExBMV8wPD0xNykpICkKKwkJCQl7CisJCQkJCWFsdDE9MTsKKwkJCQl9CisKKworCQkJCX0KKwkJCQlmaW5hbGx5CisJCQkJeworCQkJCQlkYmcuRXhpdERlY2lzaW9uKCAxICk7CisJCQkJfQorCisJCQkJc3dpdGNoICggYWx0MSApCisJCQkJeworCQkJCWNhc2UgMToKKwkJCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjUzOjA6IHN0YXQKKwkJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDUzLCA4ICk7CisJCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9zdGF0X2luX3Byb2c0OCk7CisJCQkJCXN0YXQoKTsKKworCQkJCQlzdGF0ZS5fZnNwLS07CisKKworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJZ290byBsb29wMTsKKwkJCQl9CisJCQl9CisKKwkJCWxvb3AxOgorCQkJCTsKKworCQkJfQorCQkJZmluYWxseQorCQkJeworCQkJCWRiZy5FeGl0U3ViUnVsZSggMSApOworCQkJfQorCisKKwkJCX0KKworCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNTQsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInByb2ciICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiA7CisJfQorCS8vICRBTlRMUiBlbmQgInByb2ciCisKKworCS8vICRBTlRMUiBzdGFydCAic3RhdCIKKwkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NTY6MDogc3RhdCA6ICggZXhwciB8IF4oICc9JyBJRCBleHByICkgfCBeKCBGVU5DICggLiApKyApICk7CisJcHJpdmF0ZSB2b2lkIHN0YXQoICApCisJeworCQlDb21tb25UcmVlIElEMj1udWxsOworCQlCaWdJbnRlZ2VyIGV4cHIxID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKwkJQmlnSW50ZWdlciBleHByMyA9IGRlZmF1bHQoQmlnSW50ZWdlcik7CisKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInN0YXQiICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA1NiwgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjU2Ojk6ICggZXhwciB8IF4oICc9JyBJRCBleHByICkgfCBeKCBGVU5DICggLiApKyApICkKKwkJCWludCBhbHQzPTM7CisJCQl0cnkKKwkJCXsKKwkJCQlkYmcuRW50ZXJEZWNpc2lvbiggMyApOworCisJCQlzd2l0Y2ggKCBpbnB1dC5MQSgxKSApCisJCQl7CisJCQljYXNlIENBTEw6CisJCQljYXNlIElEOgorCQkJY2FzZSBJTlQ6CisJCQljYXNlIDEwOgorCQkJY2FzZSAxMToKKwkJCWNhc2UgMTQ6CisJCQljYXNlIDE1OgorCQkJY2FzZSAxNjoKKwkJCQl7CisJCQkJYWx0Mz0xOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMTc6CisJCQkJeworCQkJCWFsdDM9MjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEZVTkM6CisJCQkJeworCQkJCWFsdDM9MzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMywgMCwgaW5wdXQpOworCisJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQkJCQl0aHJvdyBudmFlOworCQkJCX0KKwkJCX0KKworCQkJfQorCQkJZmluYWxseQorCQkJeworCQkJCWRiZy5FeGl0RGVjaXNpb24oIDMgKTsKKwkJCX0KKworCQkJc3dpdGNoICggYWx0MyApCisJCQl7CisJCQljYXNlIDE6CisJCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NTY6OTogZXhwcgorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDU2LCA4ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fc3RhdDYzKTsKKwkJCQlleHByMT1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDU2LCAzNSApOworCQkJCSBzdHJpbmcgcmVzdWx0ID0gZXhwcjEuVG9TdHJpbmcoKTsKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKGV4cHIxICsgIiAoYWJvdXQgIiArIHJlc3VsdFswXSArICIqMTBeIiArIChyZXN1bHQuTGVuZ3RoLTEpICsgIikiKTsKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWRiZy5FbnRlckFsdCggMiApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjU5Ojk6IF4oICc9JyBJRCBleHByICkKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgOCApOworCQkJCWRiZy5Mb2NhdGlvbiggNTksIDEwICk7CisJCQkJTWF0Y2goaW5wdXQsMTcsRm9sbG93Ll8xN19pbl9zdGF0OTgpOyAKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCAxNCApOworCQkJCUlEMj0oQ29tbW9uVHJlZSlNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX3N0YXQxMDApOyAKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCAxNyApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX3N0YXQxMDIpOworCQkJCWV4cHIzPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCAzNSApOworCQkJCSBnbG9iYWxNZW1vcnlbKElEMiE9bnVsbD9JRDIuVGV4dDpudWxsKV0gPSBleHByMzsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJZGJnLkVudGVyQWx0KCAzICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NjA6OTogXiggRlVOQyAoIC4gKSsgKQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDYwLCA4ICk7CisJCQkJZGJnLkxvY2F0aW9uKCA2MCwgMTAgKTsKKwkJCQlNYXRjaChpbnB1dCxGVU5DLEZvbGxvdy5fRlVOQ19pbl9zdGF0MTI4KTsgCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2MCwgMTUgKTsKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NjA6MTY6ICggLiApKworCQkJCWludCBjbnQyPTA7CisJCQkJdHJ5CisJCQkJeworCQkJCQlkYmcuRW50ZXJTdWJSdWxlKCAyICk7CisKKwkJCQlmb3IgKCA7IDsgKQorCQkJCXsKKwkJCQkJaW50IGFsdDI9MjsKKwkJCQkJdHJ5CisJCQkJCXsKKwkJCQkJCWRiZy5FbnRlckRlY2lzaW9uKCAyICk7CisKKwkJCQkJaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKwkJCQkJaWYgKCAoKExBMl8wPj1DQUxMICYmIExBMl8wPD0xNykpICkKKwkJCQkJeworCQkJCQkJYWx0Mj0xOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKCAoTEEyXzA9PVVQKSApCisJCQkJCXsKKwkJCQkJCWFsdDI9MjsKKwkJCQkJfQorCisKKwkJCQkJfQorCQkJCQlmaW5hbGx5CisJCQkJCXsKKwkJCQkJCWRiZy5FeGl0RGVjaXNpb24oIDIgKTsKKwkJCQkJfQorCisJCQkJCXN3aXRjaCAoIGFsdDIgKQorCQkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NjA6MDogLgorCQkJCQkJeworCQkJCQkJZGJnLkxvY2F0aW9uKCA2MCwgMTUgKTsKKwkJCQkJCU1hdGNoQW55KGlucHV0KTsgCisKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoIGNudDIgPj0gMSApCisJCQkJCQkJZ290byBsb29wMjsKKworCQkJCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZTIgPSBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKCAyLCBpbnB1dCApOworCQkJCQkJZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBlZWUyICk7CisKKwkJCQkJCXRocm93IGVlZTI7CisJCQkJCX0KKwkJCQkJY250MisrOworCQkJCX0KKwkJCQlsb29wMjoKKwkJCQkJOworCisJCQkJfQorCQkJCWZpbmFsbHkKKwkJCQl7CisJCQkJCWRiZy5FeGl0U3ViUnVsZSggMiApOworCQkJCX0KKworCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyAKKworCQkJCX0KKwkJCQlicmVhazsKKworCQkJfQorCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNjEsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInN0YXQiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiA7CisJfQorCS8vICRBTlRMUiBlbmQgInN0YXQiCisKKworCS8vICRBTlRMUiBzdGFydCAiZXhwciIKKwkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NjM6MDogZXhwciByZXR1cm5zIFtCaWdJbnRlZ2VyIHZhbHVlXSA6ICggXiggJysnIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJy0nIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJyonIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJy8nIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJyUnIGE9IGV4cHIgYj0gZXhwciApIHwgSUQgfCBJTlQgfCBjYWxsICk7CisJcHJpdmF0ZSBCaWdJbnRlZ2VyIGV4cHIoICApCisJeworCQlCaWdJbnRlZ2VyIHZhbHVlID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKworCQlDb21tb25UcmVlIElEND1udWxsOworCQlDb21tb25UcmVlIElOVDU9bnVsbDsKKwkJQmlnSW50ZWdlciBhID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKwkJQmlnSW50ZWdlciBiID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKwkJQmlnSW50ZWdlciBjYWxsNiA9IGRlZmF1bHQoQmlnSW50ZWdlcik7CisKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImV4cHIiICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA2MywgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjY0Ojk6ICggXiggJysnIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJy0nIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJyonIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJy8nIGE9IGV4cHIgYj0gZXhwciApIHwgXiggJyUnIGE9IGV4cHIgYj0gZXhwciApIHwgSUQgfCBJTlQgfCBjYWxsICkKKwkJCWludCBhbHQ0PTg7CisJCQl0cnkKKwkJCXsKKwkJCQlkYmcuRW50ZXJEZWNpc2lvbiggNCApOworCisJCQlzd2l0Y2ggKCBpbnB1dC5MQSgxKSApCisJCQl7CisJCQljYXNlIDE2OgorCQkJCXsKKwkJCQlhbHQ0PTE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQl7CisJCQkJYWx0ND0yOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMTQ6CisJCQkJeworCQkJCWFsdDQ9MzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDE1OgorCQkJCXsKKwkJCQlhbHQ0PTQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxMToKKwkJCQl7CisJCQkJYWx0ND01OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgSUQ6CisJCQkJeworCQkJCWFsdDQ9NjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElOVDoKKwkJCQl7CisJCQkJYWx0ND03OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ0FMTDoKKwkJCQl7CisJCQkJYWx0ND04OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0LCAwLCBpbnB1dCk7CisKKwkJCQkJZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBudmFlICk7CisJCQkJCXRocm93IG52YWU7CisJCQkJfQorCQkJfQorCisJCQl9CisJCQlmaW5hbGx5CisJCQl7CisJCQkJZGJnLkV4aXREZWNpc2lvbiggNCApOworCQkJfQorCisJCQlzd2l0Y2ggKCBhbHQ0ICkKKwkJCXsKKwkJCWNhc2UgMToKKwkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdUcmVlR3JhbW1hci5nMzo2NDo5OiBeKCAnKycgYT0gZXhwciBiPSBleHByICkKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA2NCwgOCApOworCQkJCWRiZy5Mb2NhdGlvbiggNjQsIDEwICk7CisJCQkJTWF0Y2goaW5wdXQsMTYsRm9sbG93Ll8xNl9pbl9leHByMTcyKTsgCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2NCwgMTUgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9leHByMTc2KTsKKwkJCQlhPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCWRiZy5Mb2NhdGlvbiggNjQsIDIyICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjE4MCk7CisJCQkJYj1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2NCwgMzUgKTsKKwkJCQkgdmFsdWUgPSBhLmFkZChiKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJZGJnLkVudGVyQWx0KCAyICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NjU6OTogXiggJy0nIGE9IGV4cHIgYj0gZXhwciApCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNjUsIDggKTsKKwkJCQlkYmcuTG9jYXRpb24oIDY1LCAxMCApOworCQkJCU1hdGNoKGlucHV0LDEwLEZvbGxvdy5fMTBfaW5fZXhwcjIwMCk7IAorCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjUsIDE1ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjIwNCk7CisJCQkJYT1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDY1LCAyMiApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyMDgpOworCQkJCWI9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjUsIDM1ICk7CisJCQkJIHZhbHVlID0gYS5zdWJ0cmFjdChiKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJZGJnLkVudGVyQWx0KCAzICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NjY6OTogXiggJyonIGE9IGV4cHIgYj0gZXhwciApCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNjYsIDggKTsKKwkJCQlkYmcuTG9jYXRpb24oIDY2LCAxMCApOworCQkJCU1hdGNoKGlucHV0LDE0LEZvbGxvdy5fMTRfaW5fZXhwcjIyOCk7IAorCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjYsIDE1ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjIzMik7CisJCQkJYT1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDY2LCAyMiApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyMzYpOworCQkJCWI9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjYsIDM1ICk7CisJCQkJIHZhbHVlID0gYS5tdWx0aXBseShiKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJZGJnLkVudGVyQWx0KCA0ICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6Njc6OTogXiggJy8nIGE9IGV4cHIgYj0gZXhwciApCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNjcsIDggKTsKKwkJCQlkYmcuTG9jYXRpb24oIDY3LCAxMCApOworCQkJCU1hdGNoKGlucHV0LDE1LEZvbGxvdy5fMTVfaW5fZXhwcjI1Nik7IAorCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjcsIDE1ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjI2MCk7CisJCQkJYT1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDY3LCAyMiApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyNjQpOworCQkJCWI9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjcsIDM1ICk7CisJCQkJIHZhbHVlID0gYS5kaXZpZGUoYik7IAorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCWRiZy5FbnRlckFsdCggNSApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjY4Ojk6IF4oICclJyBhPSBleHByIGI9IGV4cHIgKQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDY4LCA4ICk7CisJCQkJZGJnLkxvY2F0aW9uKCA2OCwgMTAgKTsKKwkJCQlNYXRjaChpbnB1dCwxMSxGb2xsb3cuXzExX2luX2V4cHIyODQpOyAKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDY4LCAxNSApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyODgpOworCQkJCWE9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJZGJnLkxvY2F0aW9uKCA2OCwgMjIgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9leHByMjkyKTsKKwkJCQliPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDY4LCAzNSApOworCQkJCSB2YWx1ZSA9IGEucmVtYWluZGVyKGIpOyAKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQlkYmcuRW50ZXJBbHQoIDYgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdUcmVlR3JhbW1hci5nMzo2OTo5OiBJRAorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDY5LCA4ICk7CisJCQkJSUQ0PShDb21tb25UcmVlKU1hdGNoKGlucHV0LElELEZvbGxvdy5fSURfaW5fZXhwcjMxMSk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjksIDM1ICk7CisJCQkJIHZhbHVlID0gZ2V0VmFsdWUoKElENCE9bnVsbD9JRDQuVGV4dDpudWxsKSk7IAorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCWRiZy5FbnRlckFsdCggNyApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxEZWJ1Z1RyZWVHcmFtbWFyLmczOjcwOjk6IElOVAorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDcwLCA4ICk7CisJCQkJSU5UNT0oQ29tbW9uVHJlZSlNYXRjaChpbnB1dCxJTlQsRm9sbG93Ll9JTlRfaW5fZXhwcjM0Nyk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNzAsIDM1ICk7CisJCQkJIHZhbHVlID0gbmV3IEJpZ0ludGVnZXIoKElOVDUhPW51bGw/SU5UNS5UZXh0Om51bGwpKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJZGJnLkVudGVyQWx0KCA4ICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NzE6OTogY2FsbAorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDcxLCA4ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2NhbGxfaW5fZXhwcjM4Mik7CisJCQkJY2FsbDY9Y2FsbCgpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJZGJnLkxvY2F0aW9uKCA3MSwgMzUgKTsKKwkJCQkgdmFsdWUgPSBjYWxsNjsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwkJZGJnLkxvY2F0aW9uKDcyLCA0KTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJZGJnLkV4aXRSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJleHByIiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdmFsdWU7CisJfQorCS8vICRBTlRMUiBlbmQgImV4cHIiCisKKworCS8vICRBTlRMUiBzdGFydCAiY2FsbCIKKwkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NzQ6MDogY2FsbCByZXR1cm5zIFtCaWdJbnRlZ2VyIHZhbHVlXSA6IF4oIENBTEwgSUQgZXhwciApIDsKKwlwcml2YXRlIEJpZ0ludGVnZXIgY2FsbCggICkKKwl7CisJCUJpZ0ludGVnZXIgdmFsdWUgPSBkZWZhdWx0KEJpZ0ludGVnZXIpOworCisJCUNvbW1vblRyZWUgSUQ4PW51bGw7CisJCUJpZ0ludGVnZXIgZXhwcjcgPSBkZWZhdWx0KEJpZ0ludGVnZXIpOworCisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJjYWxsIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNzQsIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcRGVidWdUcmVlR3JhbW1hci5nMzo3NTo5OiAoIF4oIENBTEwgSUQgZXhwciApICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXERlYnVnVHJlZUdyYW1tYXIuZzM6NzU6OTogXiggQ0FMTCBJRCBleHByICkKKwkJCXsKKwkJCWRiZy5Mb2NhdGlvbiggNzUsIDggKTsKKwkJCWRiZy5Mb2NhdGlvbiggNzUsIDEwICk7CisJCQlNYXRjaChpbnB1dCxDQUxMLEZvbGxvdy5fQ0FMTF9pbl9jYWxsNDMwKTsgCisKKwkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyAKKwkJCWRiZy5Mb2NhdGlvbiggNzUsIDE1ICk7CisJCQlJRDg9KENvbW1vblRyZWUpTWF0Y2goaW5wdXQsSUQsRm9sbG93Ll9JRF9pbl9jYWxsNDMyKTsgCisJCQlkYmcuTG9jYXRpb24oIDc1LCAxOCApOworCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fY2FsbDQzNCk7CisJCQlleHByNz1leHByKCk7CisKKwkJCXN0YXRlLl9mc3AtLTsKKworCisJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IAorCQkJZGJnLkxvY2F0aW9uKCA3NSwgMzUgKTsKKwkJCSBCaWdJbnRlZ2VyIHAgPSBleHByNzsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGZ1bmNSb290ID0gZmluZEZ1bmN0aW9uKChJRDghPW51bGw/SUQ4LlRleHQ6bnVsbCksIHApOworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jUm9vdCA9PSBudWxsKSB7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJObyBtYXRjaCBmb3VuZCBmb3IgIiArIChJRDghPW51bGw/SUQ4LlRleHQ6bnVsbCkgKyAiKCIgKyBwICsgIikiKTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHNldCB1cCB0aGUgbG9jYWwgZXZhbHVhdG9yIHRvIHJ1biBvdmVyIHRoZQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZS1yZWFkcyBhIHN1Yi1BU1Qgb2Ygb3VyIGlucHV0IEFTVCEKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdUcmVlR3JhbW1hciBlID0gbmV3IERlYnVnVHJlZUdyYW1tYXIoZnVuY1Jvb3QsIGZ1bmN0aW9uRGVmaW5pdGlvbnMsIGdsb2JhbE1lbW9yeSwgcCk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZS5leHByKCk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCQkJfQorCisJCX0KKwkJY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisJCXsKKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIoaW5wdXQscmUpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJCWRiZy5Mb2NhdGlvbig4NywgNCk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWRiZy5FeGl0UnVsZSggR3JhbW1hckZpbGVOYW1lLCAiY2FsbCIgKTsKKwkJCURlY1J1bGVMZXZlbCgpOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLlRlcm1pbmF0ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkvLyAkQU5UTFIgZW5kICJjYWxsIgorCSNlbmRyZWdpb24gUnVsZXMKKworCisJI3JlZ2lvbiBGb2xsb3cgc2V0cworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbGxvdworCXsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX3N0YXRfaW5fcHJvZzQ4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDNDQ0YyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fc3RhdDYzID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTdfaW5fc3RhdDk4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fc3RhdDEwMCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxQ0NEMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX3N0YXQxMDIgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4OFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9GVU5DX2luX3N0YXQxMjggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4NFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xNl9pbl9leHByMTcyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMTc2ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDFDQ0QwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fZXhwcjE4MCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHg4VUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzEwX2luX2V4cHIyMDAgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4NFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2V4cHIyMDQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MUNDRDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMjA4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDhVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTRfaW5fZXhwcjIyOCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHg0VUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fZXhwcjIzMiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxQ0NEMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2V4cHIyMzYgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4OFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xNV9pbl9leHByMjU2ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMjYwID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDFDQ0QwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fZXhwcjI2NCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHg4VUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzExX2luX2V4cHIyODQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4NFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2V4cHIyODggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MUNDRDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMjkyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDhVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fZXhwcjMxMSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX0lOVF9pbl9leHByMzQ3ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfY2FsbF9pbl9leHByMzgyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfQ0FMTF9pbl9jYWxsNDMwID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fY2FsbDQzMiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxQ0NEMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2NhbGw0MzQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4OFVMfSk7CisKKwl9CisJI2VuZHJlZ2lvbiBGb2xsb3cgc2V0cworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnVHJlZUdyYW1tYXIuZzMgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdUcmVlR3JhbW1hci5nMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZhNzNlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL0RlYnVnVHJlZUdyYW1tYXIuZzMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit0cmVlIGdyYW1tYXIgRGVidWdUcmVlR3JhbW1hcjsKKworb3B0aW9ucworeworCWxhbmd1YWdlPUNTaGFycDM7CisJdG9rZW5Wb2NhYj1EZWJ1Z0dyYW1tYXI7CisJQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7Cit9CisKKy8vIFNUQVJUOm1lbWJlcnMKK0BoZWFkZXIKK3sKKy8vaW1wb3J0IGphdmEudXRpbC5NYXA7CisvL2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK3VzaW5nIEJpZ0ludGVnZXIgPSBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK3VzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKK30KKy8vIEVORDptZW1iZXJzCisKKy8vIFNUQVJUOnJ1bGVzCitwcm9nOiAgIHN0YXQqCisgICAgOworCitzdGF0OiAgIGV4cHIgICAgICAgICAgICAgICAgICAgICAgIHsgc3RyaW5nIHJlc3VsdCA9ICRleHByLnZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCRleHByLnZhbHVlICsgIiAoYWJvdXQgIiArIHJlc3VsdFswXSArICIqMTBeIiArIChyZXN1bHQuTGVuZ3RoLTEpICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHwgICBeKCc9JyBJRCBleHByKSAgICAgICAgICAgICB7IGdsb2JhbE1lbW9yeVskSUQudGV4dF0gPSAkZXhwci52YWx1ZTsgfQorICAgIHwgICBeKEZVTkMgLispCSAgICAgICAgICAgICAgIC8vIGlnbm9yZSBGVU5DcyAtIHdlIGFkZGVkIHRoZW0gdG8gZnVuY3Rpb25EZWZpbml0aW9ucyBhbHJlYWR5IGluIHBhcnNlci4KKyAgICA7CisKK2V4cHIgcmV0dXJucyBbQmlnSW50ZWdlciB2YWx1ZV0KKyAgICA6ICAgXignKycgYT1leHByIGI9ZXhwcikgICAgICAgeyAkdmFsdWUgPSAkYS52YWx1ZS5hZGQoJGIudmFsdWUpOyB9CisgICAgfCAgIF4oJy0nIGE9ZXhwciBiPWV4cHIpICAgICAgIHsgJHZhbHVlID0gJGEudmFsdWUuc3VidHJhY3QoJGIudmFsdWUpOyB9CisgICAgfCAgIF4oJyonIGE9ZXhwciBiPWV4cHIpICAgICAgIHsgJHZhbHVlID0gJGEudmFsdWUubXVsdGlwbHkoJGIudmFsdWUpOyB9CisgICAgfCAgIF4oJy8nIGE9ZXhwciBiPWV4cHIpICAgICAgIHsgJHZhbHVlID0gJGEudmFsdWUuZGl2aWRlKCRiLnZhbHVlKTsgfQorICAgIHwgICBeKCclJyBhPWV4cHIgYj1leHByKSAgICAgICB7ICR2YWx1ZSA9ICRhLnZhbHVlLnJlbWFpbmRlcigkYi52YWx1ZSk7IH0KKyAgICB8ICAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgeyAkdmFsdWUgPSBnZXRWYWx1ZSgkSUQudGV4dCk7IH0KKyAgICB8ICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgeyAkdmFsdWUgPSBuZXcgQmlnSW50ZWdlcigkSU5ULnRleHQpOyB9CisgICAgfCAgIGNhbGwgICAgICAgICAgICAgICAgICAgICAgIHsgJHZhbHVlID0gJGNhbGwudmFsdWU7IH0KKyAgICA7CisKK2NhbGwgcmV0dXJucyBbQmlnSW50ZWdlciB2YWx1ZV0KKyAgICA6ICAgXihDQUxMIElEIGV4cHIpICAgICAgICAgICAgeyBCaWdJbnRlZ2VyIHAgPSAkZXhwci52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGZ1bmNSb290ID0gZmluZEZ1bmN0aW9uKCRJRC50ZXh0LCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY1Jvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiTm8gbWF0Y2ggZm91bmQgZm9yICIgKyAkSUQudGV4dCArICIoIiArIHAgKyAiKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2Ugc2V0IHVwIHRoZSBsb2NhbCBldmFsdWF0b3IgdG8gcnVuIG92ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJlLXJlYWRzIGEgc3ViLUFTVCBvZiBvdXIgaW5wdXQgQVNUIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z1RyZWVHcmFtbWFyIGUgPSBuZXcgRGVidWdUcmVlR3JhbW1hcihmdW5jUm9vdCwgZnVuY3Rpb25EZWZpbml0aW9ucywgZ2xvYmFsTWVtb3J5LCBwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gZS5leHByKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgOworLy8gRU5EOnJ1bGVzCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdUcmVlR3JhbW1hckhlbHBlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9EZWJ1Z1RyZWVHcmFtbWFySGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODMyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvRGVidWdUcmVlR3JhbW1hckhlbHBlci5jcwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKwordXNpbmcgQmlnSW50ZWdlciA9IGphdmEubWF0aC5CaWdJbnRlZ2VyOwordXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworCitwYXJ0aWFsIGNsYXNzIERlYnVnVHJlZUdyYW1tYXIKK3sKKyAgICAvKiogUG9pbnRzIHRvIGZ1bmN0aW9ucyB0cmFja2VkIGJ5IHRyZWUgYnVpbGRlci4gKi8KKyAgICBwcml2YXRlIExpc3Q8Q29tbW9uVHJlZT4gZnVuY3Rpb25EZWZpbml0aW9uczsKKworICAgIC8qKiBSZW1lbWJlciBsb2NhbCB2YXJpYWJsZXMuIEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSByZWFkb25seSBJRGljdGlvbmFyeTxzdHJpbmcsIEJpZ0ludGVnZXI+IGxvY2FsTWVtb3J5ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBCaWdJbnRlZ2VyPigpOworCisgICAgLyoqIFJlbWVtYmVyIGdsb2JhbCB2YXJpYWJsZXMgc2V0IGJ5ID0uICovCisgICAgcHJpdmF0ZSBJRGljdGlvbmFyeTxzdHJpbmcsIEJpZ0ludGVnZXI+IGdsb2JhbE1lbW9yeSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgQmlnSW50ZWdlcj4oKTsKKworICAgIC8qKiBTZXQgdXAgYW4gZXZhbHVhdG9yIHdpdGggYSBub2RlIHN0cmVhbTsgYW5kIGEgc2V0IG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gQVNUcy4gKi8KKyAgICBwdWJsaWMgRGVidWdUcmVlR3JhbW1hciggQ29tbW9uVHJlZU5vZGVTdHJlYW0gbm9kZXMsIExpc3Q8Q29tbW9uVHJlZT4gZnVuY3Rpb25EZWZpbml0aW9ucyApCisgICAgICAgIDogdGhpcyggbm9kZXMgKQorICAgIHsKKyAgICAgICAgdGhpcy5mdW5jdGlvbkRlZmluaXRpb25zID0gZnVuY3Rpb25EZWZpbml0aW9uczsKKyAgICB9CisKKyAgICAvKiogU2V0IHVwIGEgbG9jYWwgZXZhbHVhdG9yIGZvciBhIG5lc3RlZCBmdW5jdGlvbiBjYWxsLiBUaGUgZXZhbHVhdG9yIGdldHMgdGhlIGRlZmluaXRpb24KKyAgICAgKiAgdHJlZSBvZiB0aGUgZnVuY3Rpb247IHRoZSBzZXQgb2YgYWxsIGRlZmluZWQgZnVuY3Rpb25zICh0byBmaW5kIGxvY2FsbHkgY2FsbGVkIG9uZXMpOyBhCisgICAgICogIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2YXJpYWJsZSBtZW1vcnk7IGFuZCB0aGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciB0byBiZQorICAgICAqICBhZGRlZCB0byB0aGUgbG9jYWwgbWVtb3J5LgorICAgICAqLworICAgIHByaXZhdGUgRGVidWdUcmVlR3JhbW1hciggQ29tbW9uVHJlZSBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgTGlzdDxDb21tb25UcmVlPiBmdW5jdGlvbkRlZmluaXRpb25zLAorICAgICAgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIEJpZ0ludGVnZXI+IGdsb2JhbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBwYXJhbVZhbHVlICkKKyAgICAgICAgLy8gRXhwZWN0ZWQgdHJlZSBmb3IgZnVuY3Rpb246IF4oRlVOQyBJRCAoIElOVCB8IElEICkgZXhwcikKKyAgICAgICAgOiB0aGlzKCBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oIGZ1bmN0aW9uLkdldENoaWxkKCAyICkgKSwgZnVuY3Rpb25EZWZpbml0aW9ucyApCisgICAgeworICAgICAgICB0aGlzLmdsb2JhbE1lbW9yeSA9IGdsb2JhbE1lbW9yeTsKKyAgICAgICAgbG9jYWxNZW1vcnlbZnVuY3Rpb24uR2V0Q2hpbGQoIDEgKS5UZXh0XSA9IHBhcmFtVmFsdWU7CisgICAgfQorCisgICAgLyoqIEZpbmQgbWF0Y2hpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgYSBmdW5jdGlvbiBuYW1lIGFuZCBwYXJhbWV0ZXIKKyAgICAgKiAgdmFsdWUuIFRoZSBmaXJzdCBkZWZpbml0aW9uIGlzIHJldHVybmVkIHdoZXJlIChhKSB0aGUgbmFtZSBtYXRjaGVzCisgICAgICogIGFuZCAoYikgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgYWdyZWVzIGlmIGl0IGlzIGRlZmluZWQgYXMgY29uc3RhbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBDb21tb25UcmVlIGZpbmRGdW5jdGlvbiggc3RyaW5nIG5hbWUsIEJpZ0ludGVnZXIgcGFyYW1WYWx1ZSApCisgICAgeworICAgICAgICBmb3JlYWNoICggQ29tbW9uVHJlZSBmIGluIGZ1bmN0aW9uRGVmaW5pdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZCB0cmVlIGZvciBmOiBeKEZVTkMgSUQgKElEIHwgSU5UKSBleHByKQorICAgICAgICAgICAgaWYgKCBmLkdldENoaWxkKCAwICkuVGV4dC5FcXVhbHMoIG5hbWUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBwYXJhbWV0ZXIgbWF0Y2hlcworICAgICAgICAgICAgICAgIENvbW1vblRyZWUgZm9ybWFsUGFyID0gKENvbW1vblRyZWUpZi5HZXRDaGlsZCggMSApOworICAgICAgICAgICAgICAgIGlmICggZm9ybWFsUGFyLlRva2VuLlR5cGUgPT0gSU5UCisgICAgICAgICAgICAgICAgICAgICYmICFuZXcgQmlnSW50ZWdlciggZm9ybWFsUGFyLlRva2VuLlRleHQgKS5FcXVhbHMoIHBhcmFtVmFsdWUgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdGFudCBpbiBmb3JtYWxQYXIgbGlzdCBkb2VzIG5vdCBtYXRjaCBhY3R1YWwgdmFsdWUgLT4gbm8gbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgKHZhbHVlIGZvciBJTlQgZm9ybWFsIGFyZykgYXMgd2VsbCBhcyBmY3QgbmFtZSBhZ3JlZXMhCisgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIEdldCB2YWx1ZSBvZiBuYW1lIHVwIGNhbGwgc3RhY2suICovCisgICAgaW50ZXJuYWwgQmlnSW50ZWdlciBnZXRWYWx1ZSggc3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciB2YWx1ZTsKKyAgICAgICAgaWYgKCBsb2NhbE1lbW9yeS5UcnlHZXRWYWx1ZSggbmFtZSwgb3V0IHZhbHVlICkgJiYgdmFsdWUgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGdsb2JhbE1lbW9yeS5UcnlHZXRWYWx1ZSggbmFtZSwgb3V0IHZhbHVlICkgJiYgdmFsdWUgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBub3QgZm91bmQgaW4gbG9jYWwgbWVtb3J5IG9yIGdsb2JhbCBtZW1vcnkKKyAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJ1bmRlZmluZWQgdmFyaWFibGUgIiArIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCAiMCIgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZUdyYW1tYXIuZzMgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZUdyYW1tYXIuZzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4ZGUxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9Qcm9maWxlR3JhbW1hci5nMwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitncmFtbWFyIFByb2ZpbGVHcmFtbWFyOworCitvcHRpb25zCit7CisJbGFuZ3VhZ2U9Q1NoYXJwMzsKKwlvdXRwdXQ9QVNUOworCUFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorCit0b2tlbnMKK3sKKwkvLyBkZWZpbmUgcHNldWRvLW9wZXJhdGlvbnMKKwlGVU5DOworCUNBTEw7Cit9CisKKy8vIFNUQVJUOnN0YXQKK3Byb2c6ICggc3RhdCApKgorICAgIDsKKworc3RhdDogICBleHByIE5FV0xJTkUgICAgICAgICAgICAgICAgICAgIC0+IGV4cHIKKyAgICB8ICAgSUQgJz0nIGV4cHIgTkVXTElORSAgICAgICAgICAgICAtPiBeKCc9JyBJRCBleHByKQorICAgIHwgICBmdW5jIE5FV0xJTkUgICAgICAgICAgICAgICAgICAgIC0+IGZ1bmMKKyAgICB8ICAgTkVXTElORSAgICAgICAgICAgICAgICAgICAgICAgICAtPiAvLyBpZ25vcmUKKyAgICA7CisKK2Z1bmM6ICAgSUQgICcoJyBmb3JtYWxQYXIgJyknICc9JyBleHByICAtPiBeKEZVTkMgSUQgZm9ybWFsUGFyIGV4cHIpCisgICAgOworCWZpbmFsbHkgeworCSAgZnVuY3Rpb25EZWZpbml0aW9ucy5BZGQoJGZ1bmMudHJlZSk7CisJfQorCitmb3JtYWxQYXIKKyAgICA6ICAgSUQKKwl8ICAgSU5UCisJOworCisvLyBFTkQ6c3RhdAorCisvLyBTVEFSVDpleHByCitleHByOiAgIG11bHRFeHByICgoJysnXnwnLSdeKSBtdWx0RXhwcikqCisgICAgOworCittdWx0RXhwcgorICAgIDogICBhdG9tICgoJyonfCcvJ3wnJScpXiBhdG9tKSoKKyAgICA7CisKK2F0b206ICAgSU5UCisgICAgfCAgIElECisgICAgfCAgICcoJyBleHByICcpJyAgICAtPiBleHByCisgICAgfCAgIElEICcoJyBleHByICcpJyAtPiBeKENBTEwgSUQgZXhwcikKKyAgICA7CisvLyBFTkQ6ZXhwcgorCisvLyBTVEFSVDp0b2tlbnMKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSsKKwk7CisKK0lOVCA6ICAgJzAnLi4nOScrCisgICAgOworCitORVdMSU5FCisgICAgOgknXHInPyAnXG4nCisgICAgOworCitXUyAgOiAgICgnICd8J1x0JykrIHsgU2tpcCgpOyB9CisgICAgOworLy8gRU5EOnRva2VucwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyTGV4ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZUdyYW1tYXJMZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWUxZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyTGV4ZXIuY3MKQEAgLTAsMCArMSw2OTMgQEAKKy8vICRBTlRMUiAzLjEuMiBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczIDIwMDktMDktMzAgMTM6MTg6MTgKKworLy8gVGhlIHZhcmlhYmxlICd2YXJpYWJsZScgaXMgYXNzaWduZWQgYnV0IGl0cyB2YWx1ZSBpcyBuZXZlciB1c2VkLgorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMjE5CisvLyBVbnJlYWNoYWJsZSBjb2RlIGRldGVjdGVkLgorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTYyCisKKwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBBbnRsci5SdW50aW1lOwordXNpbmcgU3RhY2sgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5TdGFjazxvYmplY3Q+OwordXNpbmcgTGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdDsKK3VzaW5nIEFycmF5TGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8b2JqZWN0PjsKKworW1N5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGUoIkFOVExSIiwgIjMuMS4yIildCitbU3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldCitwdWJsaWMgcGFydGlhbCBjbGFzcyBQcm9maWxlR3JhbW1hckxleGVyIDogTGV4ZXIKK3sKKwlwdWJsaWMgY29uc3QgaW50IEVPRj0tMTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEwPTEwOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTE9MTE7CisJcHVibGljIGNvbnN0IGludCBUX18xMj0xMjsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEzPTEzOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTQ9MTQ7CisJcHVibGljIGNvbnN0IGludCBUX18xNT0xNTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE2PTE2OworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTc9MTc7CisJcHVibGljIGNvbnN0IGludCBDQUxMPTQ7CisJcHVibGljIGNvbnN0IGludCBGVU5DPTU7CisJcHVibGljIGNvbnN0IGludCBJRD02OworCXB1YmxpYyBjb25zdCBpbnQgSU5UPTc7CisJcHVibGljIGNvbnN0IGludCBORVdMSU5FPTg7CisJcHVibGljIGNvbnN0IGludCBXUz05OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisJcHVibGljIFByb2ZpbGVHcmFtbWFyTGV4ZXIoKSB7fQorCXB1YmxpYyBQcm9maWxlR3JhbW1hckxleGVyKCBJQ2hhclN0cmVhbSBpbnB1dCApCisJCTogdGhpcyggaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSApCisJeworCX0KKwlwdWJsaWMgUHJvZmlsZUdyYW1tYXJMZXhlciggSUNoYXJTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSApCisJCTogYmFzZSggaW5wdXQsIHN0YXRlICkKKwl7CisKKwl9CisJcHVibGljIG92ZXJyaWRlIHN0cmluZyBHcmFtbWFyRmlsZU5hbWUgeyBnZXQgeyByZXR1cm4gIkJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzMiOyB9IH0KKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTAiCisJcHJpdmF0ZSB2b2lkIG1UX18xMCgpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTA7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3Ojk6ICggJy0nICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6Nzo5OiAnLScKKwkJCXsKKwkJCU1hdGNoKCctJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJUX18xMCIKKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTEiCisJcHJpdmF0ZSB2b2lkIG1UX18xMSgpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTE7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo4Ojk6ICggJyUnICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODo5OiAnJScKKwkJCXsKKwkJCU1hdGNoKCclJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJUX18xMSIKKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTIiCisJcHJpdmF0ZSB2b2lkIG1UX18xMigpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTI7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo5Ojk6ICggJygnICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6OTo5OiAnKCcKKwkJCXsKKwkJCU1hdGNoKCcoJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJUX18xMiIKKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTMiCisJcHJpdmF0ZSB2b2lkIG1UX18xMygpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTM7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzoxMDo5OiAoICcpJyApCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjEwOjk6ICcpJworCQkJeworCQkJTWF0Y2goJyknKTsgCisKKwkJCX0KKworCQkJc3RhdGUudHlwZSA9IF90eXBlOworCQkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJfQorCS8vICRBTlRMUiBlbmQgIlRfXzEzIgorCisJLy8gJEFOVExSIHN0YXJ0ICJUX18xNCIKKwlwcml2YXRlIHZvaWQgbVRfXzE0KCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBUX18xNDsKKwkJCWludCBfY2hhbm5lbCA9IERlZmF1bHRUb2tlbkNoYW5uZWw7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjExOjk6ICggJyonICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6MTE6OTogJyonCisJCQl7CisJCQlNYXRjaCgnKicpOyAKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiVF9fMTQiCisKKwkvLyAkQU5UTFIgc3RhcnQgIlRfXzE1IgorCXByaXZhdGUgdm9pZCBtVF9fMTUoKQorCXsKKwkJdHJ5CisJCXsKKwkJCWludCBfdHlwZSA9IFRfXzE1OworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6MTI6OTogKCAnLycgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzoxMjo5OiAnLycKKwkJCXsKKwkJCU1hdGNoKCcvJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJUX18xNSIKKworCS8vICRBTlRMUiBzdGFydCAiVF9fMTYiCisJcHJpdmF0ZSB2b2lkIG1UX18xNigpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gVF9fMTY7CisJCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzoxMzo5OiAoICcrJyApCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjEzOjk6ICcrJworCQkJeworCQkJTWF0Y2goJysnKTsgCisKKwkJCX0KKworCQkJc3RhdGUudHlwZSA9IF90eXBlOworCQkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJfQorCS8vICRBTlRMUiBlbmQgIlRfXzE2IgorCisJLy8gJEFOVExSIHN0YXJ0ICJUX18xNyIKKwlwcml2YXRlIHZvaWQgbVRfXzE3KCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBUX18xNzsKKwkJCWludCBfY2hhbm5lbCA9IERlZmF1bHRUb2tlbkNoYW5uZWw7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE0Ojk6ICggJz0nICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6MTQ6OTogJz0nCisJCQl7CisJCQlNYXRjaCgnPScpOyAKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiVF9fMTciCisKKwkvLyAkQU5UTFIgc3RhcnQgIklEIgorCXByaXZhdGUgdm9pZCBtSUQoKQorCXsKKwkJdHJ5CisJCXsKKwkJCWludCBfdHlwZSA9IElEOworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODg6OTogKCAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onICkrICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODg6OTogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyApKworCQkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo4ODo5OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onICkrCisJCQlpbnQgY250MT0wOworCQkJZm9yICggOyA7ICkKKwkJCXsKKwkJCQlpbnQgYWx0MT0yOworCQkJCWludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisJCQkJaWYgKCAoKExBMV8wPj0nQScgJiYgTEExXzA8PSdaJyl8fChMQTFfMD49J2EnICYmIExBMV8wPD0neicpKSApCisJCQkJeworCQkJCQlhbHQxPTE7CisJCQkJfQorCisKKwkJCQlzd2l0Y2ggKCBhbHQxICkKKwkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOgorCQkJCQl7CisJCQkJCWlucHV0LkNvbnN1bWUoKTsKKworCisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAoIGNudDEgPj0gMSApCisJCQkJCQlnb3RvIGxvb3AxOworCisJCQkJCUVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUxID0gbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbiggMSwgaW5wdXQgKTsKKwkJCQkJdGhyb3cgZWVlMTsKKwkJCQl9CisJCQkJY250MSsrOworCQkJfQorCQkJbG9vcDE6CisJCQkJOworCisKKworCQkJfQorCisJCQlzdGF0ZS50eXBlID0gX3R5cGU7CisJCQlzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwl9CisJLy8gJEFOVExSIGVuZCAiSUQiCisKKwkvLyAkQU5UTFIgc3RhcnQgIklOVCIKKwlwcml2YXRlIHZvaWQgbUlOVCgpCisJeworCQl0cnkKKwkJeworCQkJaW50IF90eXBlID0gSU5UOworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6OTE6OTogKCAoICcwJyAuLiAnOScgKSsgKQorCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo5MTo5OiAoICcwJyAuLiAnOScgKSsKKwkJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6OTE6OTogKCAnMCcgLi4gJzknICkrCisJCQlpbnQgY250Mj0wOworCQkJZm9yICggOyA7ICkKKwkJCXsKKwkJCQlpbnQgYWx0Mj0yOworCQkJCWludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisJCQkJaWYgKCAoKExBMl8wPj0nMCcgJiYgTEEyXzA8PSc5JykpICkKKwkJCQl7CisJCQkJCWFsdDI9MTsKKwkJCQl9CisKKworCQkJCXN3aXRjaCAoIGFsdDIgKQorCQkJCXsKKwkJCQljYXNlIDE6CisJCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6CisJCQkJCXsKKwkJCQkJaW5wdXQuQ29uc3VtZSgpOworCisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWlmICggY250MiA+PSAxICkKKwkJCQkJCWdvdG8gbG9vcDI7CisKKwkJCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZTIgPSBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKCAyLCBpbnB1dCApOworCQkJCQl0aHJvdyBlZWUyOworCQkJCX0KKwkJCQljbnQyKys7CisJCQl9CisJCQlsb29wMjoKKwkJCQk7CisKKworCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJJTlQiCisKKwkvLyAkQU5UTFIgc3RhcnQgIk5FV0xJTkUiCisJcHJpdmF0ZSB2b2lkIG1ORVdMSU5FKCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBORVdMSU5FOworCQkJaW50IF9jaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6OTU6NzogKCAoICdcXHInICk/ICdcXG4nICkKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6OTU6NzogKCAnXFxyJyApPyAnXFxuJworCQkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo5NTo3OiAoICdcXHInICk/CisJCQlpbnQgYWx0Mz0yOworCQkJaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKwkJCWlmICggKExBM18wPT0nXHInKSApCisJCQl7CisJCQkJYWx0Mz0xOworCQkJfQorCQkJc3dpdGNoICggYWx0MyApCisJCQl7CisJCQljYXNlIDE6CisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo5NTowOiAnXFxyJworCQkJCXsKKwkJCQlNYXRjaCgnXHInKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCX0KKworCQkJTWF0Y2goJ1xuJyk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJORVdMSU5FIgorCisJLy8gJEFOVExSIHN0YXJ0ICJXUyIKKwlwcml2YXRlIHZvaWQgbVdTKCkKKwl7CisJCXRyeQorCQl7CisJCQlpbnQgX3R5cGUgPSBXUzsKKwkJCWludCBfY2hhbm5lbCA9IERlZmF1bHRUb2tlbkNoYW5uZWw7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjk4Ojk6ICggKCAnICcgfCAnXFx0JyApKyApCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjk4Ojk6ICggJyAnIHwgJ1xcdCcgKSsKKwkJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6OTg6OTogKCAnICcgfCAnXFx0JyApKworCQkJaW50IGNudDQ9MDsKKwkJCWZvciAoIDsgOyApCisJCQl7CisJCQkJaW50IGFsdDQ9MjsKKwkJCQlpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKKworCQkJCWlmICggKExBNF8wPT0nXHQnfHxMQTRfMD09JyAnKSApCisJCQkJeworCQkJCQlhbHQ0PTE7CisJCQkJfQorCisKKwkJCQlzd2l0Y2ggKCBhbHQ0ICkKKwkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOgorCQkJCQl7CisJCQkJCWlucHV0LkNvbnN1bWUoKTsKKworCisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAoIGNudDQgPj0gMSApCisJCQkJCQlnb3RvIGxvb3A0OworCisJCQkJCUVhcmx5RXhpdEV4Y2VwdGlvbiBlZWU0ID0gbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbiggNCwgaW5wdXQgKTsKKwkJCQkJdGhyb3cgZWVlNDsKKwkJCQl9CisJCQkJY250NCsrOworCQkJfQorCQkJbG9vcDQ6CisJCQkJOworCisKKwkJCSBTa2lwKCk7IAorCisJCQl9CisKKwkJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJCXN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCX0KKwkvLyAkQU5UTFIgZW5kICJXUyIKKworCXB1YmxpYyBvdmVycmlkZSB2b2lkIG1Ub2tlbnMoKQorCXsKKwkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzoxOjEwOiAoIFRfXzEwIHwgVF9fMTEgfCBUX18xMiB8IFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBJRCB8IElOVCB8IE5FV0xJTkUgfCBXUyApCisJCWludCBhbHQ1PTEyOworCQlzd2l0Y2ggKCBpbnB1dC5MQSgxKSApCisJCXsKKwkJY2FzZSAnLSc6CisJCQl7CisJCQlhbHQ1PTE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnJSc6CisJCQl7CisJCQlhbHQ1PTI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKCc6CisJCQl7CisJCQlhbHQ1PTM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKSc6CisJCQl7CisJCQlhbHQ1PTQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKic6CisJCQl7CisJCQlhbHQ1PTU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQl7CisJCQlhbHQ1PTY7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnKyc6CisJCQl7CisJCQlhbHQ1PTc7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnPSc6CisJCQl7CisJCQlhbHQ1PTg7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnQSc6CisJCWNhc2UgJ0InOgorCQljYXNlICdDJzoKKwkJY2FzZSAnRCc6CisJCWNhc2UgJ0UnOgorCQljYXNlICdGJzoKKwkJY2FzZSAnRyc6CisJCWNhc2UgJ0gnOgorCQljYXNlICdJJzoKKwkJY2FzZSAnSic6CisJCWNhc2UgJ0snOgorCQljYXNlICdMJzoKKwkJY2FzZSAnTSc6CisJCWNhc2UgJ04nOgorCQljYXNlICdPJzoKKwkJY2FzZSAnUCc6CisJCWNhc2UgJ1EnOgorCQljYXNlICdSJzoKKwkJY2FzZSAnUyc6CisJCWNhc2UgJ1QnOgorCQljYXNlICdVJzoKKwkJY2FzZSAnVic6CisJCWNhc2UgJ1cnOgorCQljYXNlICdYJzoKKwkJY2FzZSAnWSc6CisJCWNhc2UgJ1onOgorCQljYXNlICdhJzoKKwkJY2FzZSAnYic6CisJCWNhc2UgJ2MnOgorCQljYXNlICdkJzoKKwkJY2FzZSAnZSc6CisJCWNhc2UgJ2YnOgorCQljYXNlICdnJzoKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ2knOgorCQljYXNlICdqJzoKKwkJY2FzZSAnayc6CisJCWNhc2UgJ2wnOgorCQljYXNlICdtJzoKKwkJY2FzZSAnbic6CisJCWNhc2UgJ28nOgorCQljYXNlICdwJzoKKwkJY2FzZSAncSc6CisJCWNhc2UgJ3InOgorCQljYXNlICdzJzoKKwkJY2FzZSAndCc6CisJCWNhc2UgJ3UnOgorCQljYXNlICd2JzoKKwkJY2FzZSAndyc6CisJCWNhc2UgJ3gnOgorCQljYXNlICd5JzoKKwkJY2FzZSAneic6CisJCQl7CisJCQlhbHQ1PTk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnMCc6CisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCWNhc2UgJzQnOgorCQljYXNlICc1JzoKKwkJY2FzZSAnNic6CisJCWNhc2UgJzcnOgorCQljYXNlICc4JzoKKwkJY2FzZSAnOSc6CisJCQl7CisJCQlhbHQ1PTEwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHInOgorCQkJeworCQkJYWx0NT0xMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCWNhc2UgJyAnOgorCQkJeworCQkJYWx0NT0xMjsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUsIDAsIGlucHV0KTsKKworCQkJCXRocm93IG52YWU7CisJCQl9CisJCX0KKworCQlzd2l0Y2ggKCBhbHQ1ICkKKwkJeworCQljYXNlIDE6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6MTA6IFRfXzEwCisJCQl7CisJCQltVF9fMTAoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6MTY6IFRfXzExCisJCQl7CisJCQltVF9fMTEoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6MjI6IFRfXzEyCisJCQl7CisJCQltVF9fMTIoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6Mjg6IFRfXzEzCisJCQl7CisJCQltVF9fMTMoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6MzQ6IFRfXzE0CisJCQl7CisJCQltVF9fMTQoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6NDA6IFRfXzE1CisJCQl7CisJCQltVF9fMTUoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6NDY6IFRfXzE2CisJCQl7CisJCQltVF9fMTYoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6NTI6IFRfXzE3CisJCQl7CisJCQltVF9fMTcoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6NTg6IElECisJCQl7CisJCQltSUQoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzoxOjYxOiBJTlQKKwkJCXsKKwkJCW1JTlQoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzoxOjY1OiBORVdMSU5FCisJCQl7CisJCQltTkVXTElORSgpOyAKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjE6NzM6IFdTCisJCQl7CisJCQltV1MoKTsgCisKKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKworCX0KKworCisJI3JlZ2lvbiBERkEKKworCXByb3RlY3RlZCBvdmVycmlkZSB2b2lkIEluaXRERkFzKCkKKwl7CisJCWJhc2UuSW5pdERGQXMoKTsKKwl9CisKKyAKKwkjZW5kcmVnaW9uCisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9Qcm9maWxlR3JhbW1hckxleGVySGVscGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyTGV4ZXJIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3MTI5NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9Qcm9maWxlR3JhbW1hckxleGVySGVscGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyUGFyc2VyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzk4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZUdyYW1tYXJQYXJzZXIuY3MKQEAgLTAsMCArMSwxNTYwIEBACisvLyAkQU5UTFIgMy4xLjIgQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMyAyMDA5LTA5LTMwIDEzOjE4OjE3CisKKy8vIFRoZSB2YXJpYWJsZSAndmFyaWFibGUnIGlzIGFzc2lnbmVkIGJ1dCBpdHMgdmFsdWUgaXMgbmV2ZXIgdXNlZC4KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDIxOQorLy8gVW5yZWFjaGFibGUgY29kZSBkZXRlY3RlZC4KKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE2MgorCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgQW50bHIuUnVudGltZTsKK3VzaW5nIFN0YWNrID0gU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuU3RhY2s8b2JqZWN0PjsKK3VzaW5nIExpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7Cit1c2luZyBBcnJheUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0PG9iamVjdD47CisKK3VzaW5nIEFudGxyLlJ1bnRpbWUuRGVidWc7Cit1c2luZyBJT0V4Y2VwdGlvbiA9IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbjsKKwordXNpbmcgQW50bHIuUnVudGltZS5UcmVlOwordXNpbmcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gPSBBbnRsci5SdW50aW1lLlRyZWUuUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKKworW1N5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGUoIkFOVExSIiwgIjMuMS4yIildCitbU3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldCitwdWJsaWMgcGFydGlhbCBjbGFzcyBQcm9maWxlR3JhbW1hclBhcnNlciA6IERlYnVnUGFyc2VyCit7CisJaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgc3RyaW5nW10geworCQkiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIkNBTEwiLCAiRlVOQyIsICJJRCIsICJJTlQiLCAiTkVXTElORSIsICJXUyIsICInLSciLCAiJyUnIiwgIicoJyIsICInKSciLCAiJyonIiwgIicvJyIsICInKyciLCAiJz0nIgorCX07CisJcHVibGljIGNvbnN0IGludCBFT0Y9LTE7CisJcHVibGljIGNvbnN0IGludCBUX18xMD0xMDsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzExPTExOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTI9MTI7CisJcHVibGljIGNvbnN0IGludCBUX18xMz0xMzsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE0PTE0OworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTU9MTU7CisJcHVibGljIGNvbnN0IGludCBUX18xNj0xNjsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE3PTE3OworCXB1YmxpYyBjb25zdCBpbnQgQ0FMTD00OworCXB1YmxpYyBjb25zdCBpbnQgRlVOQz01OworCXB1YmxpYyBjb25zdCBpbnQgSUQ9NjsKKwlwdWJsaWMgY29uc3QgaW50IElOVD03OworCXB1YmxpYyBjb25zdCBpbnQgTkVXTElORT04OworCXB1YmxpYyBjb25zdCBpbnQgV1M9OTsKKworCS8vIGRlbGVnYXRlcworCS8vIGRlbGVnYXRvcnMKKworCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gcnVsZU5hbWVzID0KKwkJbmV3IHN0cmluZ1tdCisJCXsKKwkJCSJpbnZhbGlkUnVsZSIsICJhdG9tIiwgImV4cHIiLCAiZm9ybWFsUGFyIiwgImZ1bmMiLCAibXVsdEV4cHIiLCAicHJvZyIsIAorCQkic3RhdCIKKwkJfTsKKworCQlpbnQgcnVsZUxldmVsID0gMDsKKwkJcHVibGljIHZpcnR1YWwgaW50IFJ1bGVMZXZlbCB7IGdldCB7IHJldHVybiBydWxlTGV2ZWw7IH0gfQorCQlwdWJsaWMgdmlydHVhbCB2b2lkIEluY1J1bGVMZXZlbCgpIHsgcnVsZUxldmVsKys7IH0KKwkJcHVibGljIHZpcnR1YWwgdm9pZCBEZWNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbC0tOyB9CisJCXB1YmxpYyBQcm9maWxlR3JhbW1hclBhcnNlciggSVRva2VuU3RyZWFtIGlucHV0ICkKKwkJCTogdGhpcyggaW5wdXQsIG5ldyBQcm9maWxlcihudWxsKSwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpICkKKwkJeworCQl9CisJCXB1YmxpYyBQcm9maWxlR3JhbW1hclBhcnNlciggSVRva2VuU3RyZWFtIGlucHV0LCBJRGVidWdFdmVudExpc3RlbmVyIGRiZywgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwkJCTogYmFzZSggaW5wdXQsIGRiZywgc3RhdGUgKQorCQl7CisJCQlQcm9maWxlciBwID0gKFByb2ZpbGVyKWRiZzsKKwkJCXAuc2V0UGFyc2VyKHRoaXMpOworCQkJSW5pdGlhbGl6ZVRyZWVBZGFwdG9yKCk7CisJCQlpZiAoIFRyZWVBZGFwdG9yID09IG51bGwgKQorCQkJCVRyZWVBZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisJCQlJVHJlZUFkYXB0b3IgYWRhcCA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCQkJVHJlZUFkYXB0b3IgPSBhZGFwOworCQkJcHJveHkuVHJlZUFkYXB0b3IgPSBhZGFwOworCQl9CisKKwlwdWJsaWMgUHJvZmlsZUdyYW1tYXJQYXJzZXIoIElUb2tlblN0cmVhbSBpbnB1dCwgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgKQorCQk6IGJhc2UoIGlucHV0LCBkYmcgKQorCXsKKwkJUHJvZmlsZXIgcCA9IChQcm9maWxlcilkYmc7CisJCXAuc2V0UGFyc2VyKHRoaXMpO0luaXRpYWxpemVUcmVlQWRhcHRvcigpOworCQlpZiAoIFRyZWVBZGFwdG9yID09IG51bGwgKQorCQkJVHJlZUFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKworCQlJVHJlZUFkYXB0b3IgYWRhcCA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCQlUcmVlQWRhcHRvciA9IGFkYXA7CisKKwl9CisJcHVibGljIHZpcnR1YWwgYm9vbCBBbHJlYWR5UGFyc2VkUnVsZSggSUludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCApCisJeworCQkoKFByb2ZpbGVyKWRiZykuRXhhbWluZVJ1bGVNZW1vaXphdGlvbihpbnB1dCwgcnVsZUluZGV4LCBQcm9maWxlR3JhbW1hclBhcnNlci5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisJCXJldHVybiBzdXBlci5BbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgcnVsZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgdmlydHVhbCB2b2lkIE1lbW9pemUoIElJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlSW5kZXgsIGludCBydWxlU3RhcnRJbmRleCApCisJeworCQkoKFByb2ZpbGVyKWRiZykuTWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCwgUHJvZmlsZUdyYW1tYXJQYXJzZXIucnVsZU5hbWVzW3J1bGVJbmRleF0pOworCQlzdXBlci5NZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKKwl9CisJcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBFdmFsUHJlZGljYXRlKCBib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSApCisJeworCQlkYmcuU2VtYW50aWNQcmVkaWNhdGUoIHJlc3VsdCwgcHJlZGljYXRlICk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gaW4geW91ciBoZWxwZXIgZmlsZSB0byB1c2UgYSBjdXN0b20gdHJlZSBhZGFwdG9yCisJcGFydGlhbCB2b2lkIEluaXRpYWxpemVUcmVlQWRhcHRvcigpOworCXByb3RlY3RlZCBEZWJ1Z1RyZWVBZGFwdG9yIGFkYXB0b3I7CisKKwlwdWJsaWMgSVRyZWVBZGFwdG9yIFRyZWVBZGFwdG9yCisJeworCQlnZXQKKwkJeworCQkJcmV0dXJuIGFkYXB0b3I7CisJCX0KKwkJc2V0CisJCXsKKwkJCXRoaXMuYWRhcHRvciA9IG5ldyBEZWJ1Z1RyZWVBZGFwdG9yKGRiZyxhZGFwdG9yKTsKKworCQl9CisJfQorCisKKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nW10gVG9rZW5OYW1lcyB7IGdldCB7IHJldHVybiBQcm9maWxlR3JhbW1hclBhcnNlci50b2tlbk5hbWVzOyB9IH0KKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdyYW1tYXJGaWxlTmFtZSB7IGdldCB7IHJldHVybiAiQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMyI7IH0gfQorCisKKwkjcmVnaW9uIFJ1bGVzCisJcHVibGljIGNsYXNzIHByb2dfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgInByb2ciCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1MDowOiBwcm9nIDogKCBzdGF0ICkqIDsKKwlwcml2YXRlIFByb2ZpbGVHcmFtbWFyUGFyc2VyLnByb2dfcmV0dXJuIHByb2coICApCisJeworCQlQcm9maWxlR3JhbW1hclBhcnNlci5wcm9nX3JldHVybiByZXR2YWwgPSBuZXcgUHJvZmlsZUdyYW1tYXJQYXJzZXIucHJvZ19yZXR1cm4oKTsKKwkJcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKwkJQ29tbW9uVHJlZSByb290XzAgPSBudWxsOworCisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLnN0YXRfcmV0dXJuIHN0YXQxID0gZGVmYXVsdChQcm9maWxlR3JhbW1hclBhcnNlci5zdGF0X3JldHVybik7CisKKworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAicHJvZyIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDUwLCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjUwOjc6ICggKCBzdGF0ICkqICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjUwOjc6ICggc3RhdCApKgorCQkJeworCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJZGJnLkxvY2F0aW9uKCA1MCwgNiApOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1MDo3OiAoIHN0YXQgKSoKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlclN1YlJ1bGUoIDEgKTsKKworCQkJZm9yICggOyA7ICkKKwkJCXsKKwkJCQlpbnQgYWx0MT0yOworCQkJCXRyeQorCQkJCXsKKwkJCQkJZGJnLkVudGVyRGVjaXNpb24oIDEgKTsKKworCQkJCWludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisJCQkJaWYgKCAoKExBMV8wPj1JRCAmJiBMQTFfMDw9TkVXTElORSl8fExBMV8wPT0xMikgKQorCQkJCXsKKwkJCQkJYWx0MT0xOworCQkJCX0KKworCisJCQkJfQorCQkJCWZpbmFsbHkKKwkJCQl7CisJCQkJCWRiZy5FeGl0RGVjaXNpb24oIDEgKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKCBhbHQxICkKKwkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjUwOjk6IHN0YXQKKwkJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDUwLCA4ICk7CisJCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9zdGF0X2luX3Byb2c1Myk7CisJCQkJCXN0YXQxPXN0YXQoKTsKKworCQkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHN0YXQxLlRyZWUpOworCisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlnb3RvIGxvb3AxOworCQkJCX0KKwkJCX0KKworCQkJbG9vcDE6CisJCQkJOworCisJCQl9CisJCQlmaW5hbGx5CisJCQl7CisJCQkJZGJnLkV4aXRTdWJSdWxlKCAxICk7CisJCQl9CisKKworCQkJfQorCisJCQlyZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworCQkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLlJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworCQkJYWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisJCX0KKwkJY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisJCXsKKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIoaW5wdXQscmUpOworCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuRXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwkJZGJnLkxvY2F0aW9uKDUxLCA0KTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJZGJnLkV4aXRSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJwcm9nIiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvLyAkQU5UTFIgZW5kICJwcm9nIgorCisJcHVibGljIGNsYXNzIHN0YXRfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgInN0YXQiCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1MzowOiBzdGF0IDogKCBleHByIE5FV0xJTkUgLT4gZXhwciB8IElEICc9JyBleHByIE5FV0xJTkUgLT4gXiggJz0nIElEIGV4cHIgKSB8IGZ1bmMgTkVXTElORSAtPiBmdW5jIHwgTkVXTElORSAtPik7CisJcHJpdmF0ZSBQcm9maWxlR3JhbW1hclBhcnNlci5zdGF0X3JldHVybiBzdGF0KCAgKQorCXsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIuc3RhdF9yZXR1cm4gcmV0dmFsID0gbmV3IFByb2ZpbGVHcmFtbWFyUGFyc2VyLnN0YXRfcmV0dXJuKCk7CisJCXJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisJCUNvbW1vblRyZWUgcm9vdF8wID0gbnVsbDsKKworCQlJVG9rZW4gTkVXTElORTM9bnVsbDsKKwkJSVRva2VuIElEND1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsNT1udWxsOworCQlJVG9rZW4gTkVXTElORTc9bnVsbDsKKwkJSVRva2VuIE5FV0xJTkU5PW51bGw7CisJCUlUb2tlbiBORVdMSU5FMTA9bnVsbDsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIuZXhwcl9yZXR1cm4gZXhwcjIgPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIuZXhwcl9yZXR1cm4gZXhwcjYgPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIuZnVuY19yZXR1cm4gZnVuYzggPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLmZ1bmNfcmV0dXJuKTsKKworCQlDb21tb25UcmVlIE5FV0xJTkUzX3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBJRDRfdHJlZT1udWxsOworCQlDb21tb25UcmVlIGNoYXJfbGl0ZXJhbDVfdHJlZT1udWxsOworCQlDb21tb25UcmVlIE5FV0xJTkU3X3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBORVdMSU5FOV90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgTkVXTElORTEwX3RyZWU9bnVsbDsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtX05FV0xJTkU9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIE5FV0xJTkUiKTsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtX0lEPW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiBJRCIpOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fMTc9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDE3Iik7CisJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZXhwcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZXhwciIpOworCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2Z1bmM9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGZ1bmMiKTsKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInN0YXQiICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA1MywgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1Mzo5OiAoIGV4cHIgTkVXTElORSAtPiBleHByIHwgSUQgJz0nIGV4cHIgTkVXTElORSAtPiBeKCAnPScgSUQgZXhwciApIHwgZnVuYyBORVdMSU5FIC0+IGZ1bmMgfCBORVdMSU5FIC0+KQorCQkJaW50IGFsdDI9NDsKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlckRlY2lzaW9uKCAyICk7CisKKwkJCXRyeQorCQkJeworCQkJCWlzQ3ljbGljRGVjaXNpb24gPSB0cnVlOworCQkJCWFsdDIgPSBkZmEyLlByZWRpY3QoaW5wdXQpOworCQkJfQorCQkJY2F0Y2ggKCBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlICkKKwkJCXsKKwkJCQlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKwkJCQl0aHJvdyBudmFlOworCQkJfQorCQkJfQorCQkJZmluYWxseQorCQkJeworCQkJCWRiZy5FeGl0RGVjaXNpb24oIDIgKTsKKwkJCX0KKworCQkJc3dpdGNoICggYWx0MiApCisJCQl7CisJCQljYXNlIDE6CisJCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjUzOjk6IGV4cHIgTkVXTElORQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDUzLCA4ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fc3RhdDcwKTsKKwkJCQlleHByMj1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlzdHJlYW1fZXhwci5BZGQoZXhwcjIuVHJlZSk7CisJCQkJZGJnLkxvY2F0aW9uKCA1MywgMTMgKTsKKwkJCQlORVdMSU5FMz0oSVRva2VuKU1hdGNoKGlucHV0LE5FV0xJTkUsRm9sbG93Ll9ORVdMSU5FX2luX3N0YXQ3Mik7ICAKKwkJCQlzdHJlYW1fTkVXTElORS5BZGQoTkVXTElORTMpOworCisKKworCQkJCXsKKwkJCQkvLyBBU1QgUkVXUklURQorCQkJCS8vIGVsZW1lbnRzOiBleHByCisJCQkJLy8gdG9rZW4gbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxhYmVsczogcmV0dmFsCisJCQkJLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorCQkJCS8vIHdpbGRjYXJkIGxhYmVsczogCisJCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCQkvLyA1Mzo0MTogLT4gZXhwcgorCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA1MywgNDMgKTsKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIHN0cmVhbV9leHByLk5leHRUcmVlKCkpOworCisJCQkJfQorCisJCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQkJfQorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWRiZy5FbnRlckFsdCggMiApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1NDo5OiBJRCAnPScgZXhwciBORVdMSU5FCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNTQsIDggKTsKKwkJCQlJRDQ9KElUb2tlbilNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX3N0YXQxMDUpOyAgCisJCQkJc3RyZWFtX0lELkFkZChJRDQpOworCisJCQkJZGJnLkxvY2F0aW9uKCA1NCwgMTEgKTsKKwkJCQljaGFyX2xpdGVyYWw1PShJVG9rZW4pTWF0Y2goaW5wdXQsMTcsRm9sbG93Ll8xN19pbl9zdGF0MTA3KTsgIAorCQkJCXN0cmVhbV8xNy5BZGQoY2hhcl9saXRlcmFsNSk7CisKKwkJCQlkYmcuTG9jYXRpb24oIDU0LCAxNSApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX3N0YXQxMDkpOworCQkJCWV4cHI2PWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCXN0cmVhbV9leHByLkFkZChleHByNi5UcmVlKTsKKwkJCQlkYmcuTG9jYXRpb24oIDU0LCAyMCApOworCQkJCU5FV0xJTkU3PShJVG9rZW4pTWF0Y2goaW5wdXQsTkVXTElORSxGb2xsb3cuX05FV0xJTkVfaW5fc3RhdDExMSk7ICAKKwkJCQlzdHJlYW1fTkVXTElORS5BZGQoTkVXTElORTcpOworCisKKworCQkJCXsKKwkJCQkvLyBBU1QgUkVXUklURQorCQkJCS8vIGVsZW1lbnRzOiAxNywgSUQsIGV4cHIKKwkJCQkvLyB0b2tlbiBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKwkJCQkvLyB0b2tlbiBsaXN0IGxhYmVsczogCisJCQkJLy8gcnVsZSBsaXN0IGxhYmVsczogCisJCQkJLy8gd2lsZGNhcmQgbGFiZWxzOiAKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKwkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCS8vIDU0OjQxOiAtPiBeKCAnPScgSUQgZXhwciApCisJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDU0LCA0MyApOworCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjU0OjQ0OiBeKCAnPScgSUQgZXhwciApCisJCQkJCXsKKwkJCQkJQ29tbW9uVHJlZSByb290XzEgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCQlkYmcuTG9jYXRpb24oIDU0LCA0NSApOworCQkJCQlyb290XzEgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkJlY29tZVJvb3Qoc3RyZWFtXzE3Lk5leHROb2RlKCksIHJvb3RfMSk7CisKKwkJCQkJZGJnLkxvY2F0aW9uKCA1NCwgNDkgKTsKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzEsIHN0cmVhbV9JRC5OZXh0Tm9kZSgpKTsKKwkJCQkJZGJnLkxvY2F0aW9uKCA1NCwgNTIgKTsKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzEsIHN0cmVhbV9leHByLk5leHRUcmVlKCkpOworCisJCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCByb290XzEpOworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQl9CisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJZGJnLkVudGVyQWx0KCAzICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjU1Ojk6IGZ1bmMgTkVXTElORQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDU1LCA4ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2Z1bmNfaW5fc3RhdDE0Myk7CisJCQkJZnVuYzg9ZnVuYygpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJc3RyZWFtX2Z1bmMuQWRkKGZ1bmM4LlRyZWUpOworCQkJCWRiZy5Mb2NhdGlvbiggNTUsIDEzICk7CisJCQkJTkVXTElORTk9KElUb2tlbilNYXRjaChpbnB1dCxORVdMSU5FLEZvbGxvdy5fTkVXTElORV9pbl9zdGF0MTQ1KTsgIAorCQkJCXN0cmVhbV9ORVdMSU5FLkFkZChORVdMSU5FOSk7CisKKworCisJCQkJeworCQkJCS8vIEFTVCBSRVdSSVRFCisJCQkJLy8gZWxlbWVudHM6IGZ1bmMKKwkJCQkvLyB0b2tlbiBsYWJlbHM6IAorCQkJCS8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKwkJCQkvLyB0b2tlbiBsaXN0IGxhYmVsczogCisJCQkJLy8gcnVsZSBsaXN0IGxhYmVsczogCisJCQkJLy8gd2lsZGNhcmQgbGFiZWxzOiAKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKwkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJCS8vIDU1OjQxOiAtPiBmdW5jCisJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDU1LCA0MyApOworCQkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgc3RyZWFtX2Z1bmMuTmV4dFRyZWUoKSk7CisKKwkJCQl9CisKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQl9CisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJZGJnLkVudGVyQWx0KCA0ICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjU2Ojk6IE5FV0xJTkUKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA1NiwgOCApOworCQkJCU5FV0xJTkUxMD0oSVRva2VuKU1hdGNoKGlucHV0LE5FV0xJTkUsRm9sbG93Ll9ORVdMSU5FX2luX3N0YXQxNzgpOyAgCisJCQkJc3RyZWFtX05FV0xJTkUuQWRkKE5FV0xJTkUxMCk7CisKKworCisJCQkJeworCQkJCS8vIEFTVCBSRVdSSVRFCisJCQkJLy8gZWxlbWVudHM6IAorCQkJCS8vIHRva2VuIGxhYmVsczogCisJCQkJLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorCQkJCS8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyB3aWxkY2FyZCBsYWJlbHM6IAorCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQkJLy8gNTY6NDE6IC0+CisJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDU3LCA0ICk7CisJCQkJCXJvb3RfMCA9IG51bGw7CisJCQkJfQorCisJCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQkJfQorCisJCQkJfQorCQkJCWJyZWFrOworCisJCQl9CisJCQlyZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworCQkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLlJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworCQkJYWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisJCX0KKwkJY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisJCXsKKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIoaW5wdXQscmUpOworCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuRXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwkJZGJnLkxvY2F0aW9uKDU3LCA0KTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJZGJnLkV4aXRSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJzdGF0IiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvLyAkQU5UTFIgZW5kICJzdGF0IgorCisJcHVibGljIGNsYXNzIGZ1bmNfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgImZ1bmMiCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1OTowOiBmdW5jIDogSUQgJygnIGZvcm1hbFBhciAnKScgJz0nIGV4cHIgLT4gXiggRlVOQyBJRCBmb3JtYWxQYXIgZXhwciApIDsKKwlwcml2YXRlIFByb2ZpbGVHcmFtbWFyUGFyc2VyLmZ1bmNfcmV0dXJuIGZ1bmMoICApCisJeworCQlQcm9maWxlR3JhbW1hclBhcnNlci5mdW5jX3JldHVybiByZXR2YWwgPSBuZXcgUHJvZmlsZUdyYW1tYXJQYXJzZXIuZnVuY19yZXR1cm4oKTsKKwkJcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKwkJQ29tbW9uVHJlZSByb290XzAgPSBudWxsOworCisJCUlUb2tlbiBJRDExPW51bGw7CisJCUlUb2tlbiBjaGFyX2xpdGVyYWwxMj1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsMTQ9bnVsbDsKKwkJSVRva2VuIGNoYXJfbGl0ZXJhbDE1PW51bGw7CisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4gZm9ybWFsUGFyMTMgPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4pOworCQlQcm9maWxlR3JhbW1hclBhcnNlci5leHByX3JldHVybiBleHByMTYgPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKworCQlDb21tb25UcmVlIElEMTFfdHJlZT1udWxsOworCQlDb21tb25UcmVlIGNoYXJfbGl0ZXJhbDEyX3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWwxNF90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMTVfdHJlZT1udWxsOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fSUQ9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIElEIik7CisJCVJld3JpdGVSdWxlSVRva2VuU3RyZWFtIHN0cmVhbV8xMj1uZXcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMTIiKTsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtXzEzPW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAxMyIpOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fMTc9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDE3Iik7CisJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZm9ybWFsUGFyPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBmb3JtYWxQYXIiKTsKKwkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9leHByPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBleHByIik7CisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJmdW5jIiApOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLkNvbW1lbmNlKCk7CisJCQl9CisJCQlJbmNSdWxlTGV2ZWwoKTsKKwkJCWRiZy5Mb2NhdGlvbiggNTksIC0xICk7CisKKwkJdHJ5CisJCXsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6NTk6OTogKCBJRCAnKCcgZm9ybWFsUGFyICcpJyAnPScgZXhwciAtPiBeKCBGVU5DIElEIGZvcm1hbFBhciBleHByICkgKQorCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6NTk6OTogSUQgJygnIGZvcm1hbFBhciAnKScgJz0nIGV4cHIKKwkJCXsKKwkJCWRiZy5Mb2NhdGlvbiggNTksIDggKTsKKwkJCUlEMTE9KElUb2tlbilNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX2Z1bmMyMTkpOyAgCisJCQlzdHJlYW1fSUQuQWRkKElEMTEpOworCisJCQlkYmcuTG9jYXRpb24oIDU5LCAxMiApOworCQkJY2hhcl9saXRlcmFsMTI9KElUb2tlbilNYXRjaChpbnB1dCwxMixGb2xsb3cuXzEyX2luX2Z1bmMyMjIpOyAgCisJCQlzdHJlYW1fMTIuQWRkKGNoYXJfbGl0ZXJhbDEyKTsKKworCQkJZGJnLkxvY2F0aW9uKCA1OSwgMTYgKTsKKwkJCVB1c2hGb2xsb3coRm9sbG93Ll9mb3JtYWxQYXJfaW5fZnVuYzIyNCk7CisJCQlmb3JtYWxQYXIxMz1mb3JtYWxQYXIoKTsKKworCQkJc3RhdGUuX2ZzcC0tOworCisJCQlzdHJlYW1fZm9ybWFsUGFyLkFkZChmb3JtYWxQYXIxMy5UcmVlKTsKKwkJCWRiZy5Mb2NhdGlvbiggNTksIDI2ICk7CisJCQljaGFyX2xpdGVyYWwxND0oSVRva2VuKU1hdGNoKGlucHV0LDEzLEZvbGxvdy5fMTNfaW5fZnVuYzIyNik7ICAKKwkJCXN0cmVhbV8xMy5BZGQoY2hhcl9saXRlcmFsMTQpOworCisJCQlkYmcuTG9jYXRpb24oIDU5LCAzMCApOworCQkJY2hhcl9saXRlcmFsMTU9KElUb2tlbilNYXRjaChpbnB1dCwxNyxGb2xsb3cuXzE3X2luX2Z1bmMyMjgpOyAgCisJCQlzdHJlYW1fMTcuQWRkKGNoYXJfbGl0ZXJhbDE1KTsKKworCQkJZGJnLkxvY2F0aW9uKCA1OSwgMzQgKTsKKwkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2Z1bmMyMzApOworCQkJZXhwcjE2PWV4cHIoKTsKKworCQkJc3RhdGUuX2ZzcC0tOworCisJCQlzdHJlYW1fZXhwci5BZGQoZXhwcjE2LlRyZWUpOworCisKKwkJCXsKKwkJCS8vIEFTVCBSRVdSSVRFCisJCQkvLyBlbGVtZW50czogSUQsIGZvcm1hbFBhciwgZXhwcgorCQkJLy8gdG9rZW4gbGFiZWxzOiAKKwkJCS8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKwkJCS8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKwkJCS8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorCQkJLy8gd2lsZGNhcmQgbGFiZWxzOiAKKwkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCQkJLy8gNTk6NDE6IC0+IF4oIEZVTkMgSUQgZm9ybWFsUGFyIGV4cHIgKQorCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNTksIDQzICk7CisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo1OTo0NDogXiggRlVOQyBJRCBmb3JtYWxQYXIgZXhwciApCisJCQkJeworCQkJCUNvbW1vblRyZWUgcm9vdF8xID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCA0NSApOworCQkJCXJvb3RfMSA9IChDb21tb25UcmVlKWFkYXB0b3IuQmVjb21lUm9vdCgoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShGVU5DLCAiRlVOQyIpLCByb290XzEpOworCisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgNTAgKTsKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX0lELk5leHROb2RlKCkpOworCQkJCWRiZy5Mb2NhdGlvbiggNTksIDUzICk7CisJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzEsIHN0cmVhbV9mb3JtYWxQYXIuTmV4dFRyZWUoKSk7CisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgNjMgKTsKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2V4cHIuTmV4dFRyZWUoKSk7CisKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKwkJCQl9CisKKwkJCX0KKworCQkJcmV0dmFsLnRyZWUgPSByb290XzA7CisJCQl9CisKKwkJCX0KKworCQkJcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKwkJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKwkJCWFkYXB0b3IuU2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJcmV0dmFsLnRyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCisJCQkJICBmdW5jdGlvbkRlZmluaXRpb25zLkFkZCgoKENvbW1vblRyZWUpcmV0dmFsLlRyZWUpKTsKKwkJCQkKKwkJfQorCQlkYmcuTG9jYXRpb24oNjAsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImZ1bmMiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCS8vICRBTlRMUiBlbmQgImZ1bmMiCisKKwlwdWJsaWMgY2xhc3MgZm9ybWFsUGFyX3JldHVybiA6IFBhcnNlclJ1bGVSZXR1cm5TY29wZQorCXsKKwkJaW50ZXJuYWwgQ29tbW9uVHJlZSB0cmVlOworCQlwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRyZWUgeyBnZXQgeyByZXR1cm4gdHJlZTsgfSB9CisJfQorCisJLy8gJEFOVExSIHN0YXJ0ICJmb3JtYWxQYXIiCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo2NTowOiBmb3JtYWxQYXIgOiAoIElEIHwgSU5UICk7CisJcHJpdmF0ZSBQcm9maWxlR3JhbW1hclBhcnNlci5mb3JtYWxQYXJfcmV0dXJuIGZvcm1hbFBhciggICkKKwl7CisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4gcmV0dmFsID0gbmV3IFByb2ZpbGVHcmFtbWFyUGFyc2VyLmZvcm1hbFBhcl9yZXR1cm4oKTsKKwkJcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKwkJQ29tbW9uVHJlZSByb290XzAgPSBudWxsOworCisJCUlUb2tlbiBzZXQxNz1udWxsOworCisJCUNvbW1vblRyZWUgc2V0MTdfdHJlZT1udWxsOworCisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJmb3JtYWxQYXIiICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA2NSwgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo2Njo5OiAoIElEIHwgSU5UICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOgorCQkJeworCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJZGJnLkxvY2F0aW9uKCA2NiwgOCApOworCQkJc2V0MTc9KElUb2tlbilpbnB1dC5MVCgxKTsKKwkJCWlmICggKGlucHV0LkxBKDEpPj1JRCAmJiBpbnB1dC5MQSgxKTw9SU5UKSApCisJCQl7CisJCQkJaW5wdXQuQ29uc3VtZSgpOworCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCAoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShzZXQxNykpOworCQkJCXN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKwkJCQlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG1zZSApOworCQkJCXRocm93IG1zZTsKKwkJCX0KKworCisJCQl9CisKKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNjgsIDEpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImZvcm1hbFBhciIgKTsKKwkJCURlY1J1bGVMZXZlbCgpOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLlRlcm1pbmF0ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLy8gJEFOVExSIGVuZCAiZm9ybWFsUGFyIgorCisJcHVibGljIGNsYXNzIGV4cHJfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgImV4cHIiCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3MzowOiBleHByIDogbXVsdEV4cHIgKCAoICcrJyB8ICctJyApIG11bHRFeHByICkqIDsKKwlwcml2YXRlIFByb2ZpbGVHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIoICApCisJeworCQlQcm9maWxlR3JhbW1hclBhcnNlci5leHByX3JldHVybiByZXR2YWwgPSBuZXcgUHJvZmlsZUdyYW1tYXJQYXJzZXIuZXhwcl9yZXR1cm4oKTsKKwkJcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKwkJQ29tbW9uVHJlZSByb290XzAgPSBudWxsOworCisJCUlUb2tlbiBjaGFyX2xpdGVyYWwxOT1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsMjA9bnVsbDsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIubXVsdEV4cHJfcmV0dXJuIG11bHRFeHByMTggPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybik7CisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybiBtdWx0RXhwcjIxID0gZGVmYXVsdChQcm9maWxlR3JhbW1hclBhcnNlci5tdWx0RXhwcl9yZXR1cm4pOworCisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMTlfdHJlZT1udWxsOworCQlDb21tb25UcmVlIGNoYXJfbGl0ZXJhbDIwX3RyZWU9bnVsbDsKKworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAiZXhwciIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDczLCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjczOjk6ICggbXVsdEV4cHIgKCAoICcrJyB8ICctJyApIG11bHRFeHByICkqICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjczOjk6IG11bHRFeHByICggKCAnKycgfCAnLScgKSBtdWx0RXhwciApKgorCQkJeworCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJZGJnLkxvY2F0aW9uKCA3MywgOCApOworCQkJUHVzaEZvbGxvdyhGb2xsb3cuX211bHRFeHByX2luX2V4cHIyODgpOworCQkJbXVsdEV4cHIxOD1tdWx0RXhwcigpOworCisJCQlzdGF0ZS5fZnNwLS07CisKKwkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCBtdWx0RXhwcjE4LlRyZWUpOworCQkJZGJnLkxvY2F0aW9uKCA3MywgMTcgKTsKKwkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6NzM6MTg6ICggKCAnKycgfCAnLScgKSBtdWx0RXhwciApKgorCQkJdHJ5CisJCQl7CisJCQkJZGJnLkVudGVyU3ViUnVsZSggNCApOworCisJCQlmb3IgKCA7IDsgKQorCQkJeworCQkJCWludCBhbHQ0PTI7CisJCQkJdHJ5CisJCQkJeworCQkJCQlkYmcuRW50ZXJEZWNpc2lvbiggNCApOworCisJCQkJaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKwkJCQlpZiAoIChMQTRfMD09MTB8fExBNF8wPT0xNikgKQorCQkJCXsKKwkJCQkJYWx0ND0xOworCQkJCX0KKworCisJCQkJfQorCQkJCWZpbmFsbHkKKwkJCQl7CisJCQkJCWRiZy5FeGl0RGVjaXNpb24oIDQgKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKCBhbHQ0ICkKKwkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjczOjE5OiAoICcrJyB8ICctJyApIG11bHRFeHByCisJCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA3MywgMTggKTsKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3MzoxOTogKCAnKycgfCAnLScgKQorCQkJCQlpbnQgYWx0Mz0yOworCQkJCQl0cnkKKwkJCQkJeworCQkJCQkJZGJnLkVudGVyU3ViUnVsZSggMyApOworCQkJCQl0cnkKKwkJCQkJeworCQkJCQkJZGJnLkVudGVyRGVjaXNpb24oIDMgKTsKKworCQkJCQlpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworCQkJCQlpZiAoIChMQTNfMD09MTYpICkKKwkJCQkJeworCQkJCQkJYWx0Mz0xOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKCAoTEEzXzA9PTEwKSApCisJCQkJCXsKKwkJCQkJCWFsdDM9MjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDMsIDAsIGlucHV0KTsKKworCQkJCQkJZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBudmFlICk7CisJCQkJCQl0aHJvdyBudmFlOworCQkJCQl9CisJCQkJCX0KKwkJCQkJZmluYWxseQorCQkJCQl7CisJCQkJCQlkYmcuRXhpdERlY2lzaW9uKCAzICk7CisJCQkJCX0KKworCQkJCQlzd2l0Y2ggKCBhbHQzICkKKwkJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3MzoyMDogJysnCisJCQkJCQl7CisJCQkJCQlkYmcuTG9jYXRpb24oIDczLCAyMiApOworCQkJCQkJY2hhcl9saXRlcmFsMTk9KElUb2tlbilNYXRjaChpbnB1dCwxNixGb2xsb3cuXzE2X2luX2V4cHIyOTIpOyAKKwkJCQkJCWNoYXJfbGl0ZXJhbDE5X3RyZWUgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShjaGFyX2xpdGVyYWwxOSk7CisJCQkJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLkJlY29tZVJvb3QoY2hhcl9saXRlcmFsMTlfdHJlZSwgcm9vdF8wKTsKKworCisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJZGJnLkVudGVyQWx0KCAyICk7CisKKwkJCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6NzM6MjU6ICctJworCQkJCQkJeworCQkJCQkJZGJnLkxvY2F0aW9uKCA3MywgMjcgKTsKKwkJCQkJCWNoYXJfbGl0ZXJhbDIwPShJVG9rZW4pTWF0Y2goaW5wdXQsMTAsRm9sbG93Ll8xMF9pbl9leHByMjk1KTsgCisJCQkJCQljaGFyX2xpdGVyYWwyMF90cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5DcmVhdGUoY2hhcl9saXRlcmFsMjApOworCQkJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5CZWNvbWVSb290KGNoYXJfbGl0ZXJhbDIwX3RyZWUsIHJvb3RfMCk7CisKKworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJfQorCQkJCQl9CisJCQkJCWZpbmFsbHkKKwkJCQkJeworCQkJCQkJZGJnLkV4aXRTdWJSdWxlKCAzICk7CisJCQkJCX0KKworCQkJCQlkYmcuTG9jYXRpb24oIDczLCAzMCApOworCQkJCQlQdXNoRm9sbG93KEZvbGxvdy5fbXVsdEV4cHJfaW5fZXhwcjI5OSk7CisJCQkJCW11bHRFeHByMjE9bXVsdEV4cHIoKTsKKworCQkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIG11bHRFeHByMjEuVHJlZSk7CisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWdvdG8gbG9vcDQ7CisJCQkJfQorCQkJfQorCisJCQlsb29wNDoKKwkJCQk7CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdFN1YlJ1bGUoIDQgKTsKKwkJCX0KKworCisJCQl9CisKKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNzQsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImV4cHIiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCS8vICRBTlRMUiBlbmQgImV4cHIiCisKKwlwdWJsaWMgY2xhc3MgbXVsdEV4cHJfcmV0dXJuIDogUGFyc2VyUnVsZVJldHVyblNjb3BlCisJeworCQlpbnRlcm5hbCBDb21tb25UcmVlIHRyZWU7CisJCXB1YmxpYyBvdmVycmlkZSBvYmplY3QgVHJlZSB7IGdldCB7IHJldHVybiB0cmVlOyB9IH0KKwl9CisKKwkvLyAkQU5UTFIgc3RhcnQgIm11bHRFeHByIgorCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6NzY6MDogbXVsdEV4cHIgOiBhdG9tICggKCAnKicgfCAnLycgfCAnJScgKSBhdG9tICkqIDsKKwlwcml2YXRlIFByb2ZpbGVHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybiBtdWx0RXhwciggICkKKwl7CisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLm11bHRFeHByX3JldHVybiByZXR2YWwgPSBuZXcgUHJvZmlsZUdyYW1tYXJQYXJzZXIubXVsdEV4cHJfcmV0dXJuKCk7CisJCXJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisJCUNvbW1vblRyZWUgcm9vdF8wID0gbnVsbDsKKworCQlJVG9rZW4gc2V0MjM9bnVsbDsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIuYXRvbV9yZXR1cm4gYXRvbTIyID0gZGVmYXVsdChQcm9maWxlR3JhbW1hclBhcnNlci5hdG9tX3JldHVybik7CisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLmF0b21fcmV0dXJuIGF0b20yNCA9IGRlZmF1bHQoUHJvZmlsZUdyYW1tYXJQYXJzZXIuYXRvbV9yZXR1cm4pOworCisJCUNvbW1vblRyZWUgc2V0MjNfdHJlZT1udWxsOworCisJCXRyeQorCQl7CisJCQlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJtdWx0RXhwciIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDc2LCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjc3Ojk6ICggYXRvbSAoICggJyonIHwgJy8nIHwgJyUnICkgYXRvbSApKiApCisJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3Nzo5OiBhdG9tICggKCAnKicgfCAnLycgfCAnJScgKSBhdG9tICkqCisJCQl7CisJCQlyb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLk5pbCgpOworCisJCQlkYmcuTG9jYXRpb24oIDc3LCA4ICk7CisJCQlQdXNoRm9sbG93KEZvbGxvdy5fYXRvbV9pbl9tdWx0RXhwcjMyMCk7CisJCQlhdG9tMjI9YXRvbSgpOworCisJCQlzdGF0ZS5fZnNwLS07CisKKwkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCBhdG9tMjIuVHJlZSk7CisJCQlkYmcuTG9jYXRpb24oIDc3LCAxMyApOworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3NzoxNDogKCAoICcqJyB8ICcvJyB8ICclJyApIGF0b20gKSoKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlclN1YlJ1bGUoIDUgKTsKKworCQkJZm9yICggOyA7ICkKKwkJCXsKKwkJCQlpbnQgYWx0NT0yOworCQkJCXRyeQorCQkJCXsKKwkJCQkJZGJnLkVudGVyRGVjaXNpb24oIDUgKTsKKworCQkJCWludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisJCQkJaWYgKCAoTEE1XzA9PTExfHwoTEE1XzA+PTE0ICYmIExBNV8wPD0xNSkpICkKKwkJCQl7CisJCQkJCWFsdDU9MTsKKwkJCQl9CisKKworCQkJCX0KKwkJCQlmaW5hbGx5CisJCQkJeworCQkJCQlkYmcuRXhpdERlY2lzaW9uKCA1ICk7CisJCQkJfQorCisJCQkJc3dpdGNoICggYWx0NSApCisJCQkJeworCQkJCWNhc2UgMToKKwkJCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo3NzoxNTogKCAnKicgfCAnLycgfCAnJScgKSBhdG9tCisJCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA3NywgMjcgKTsKKwkJCQkJc2V0MjM9KElUb2tlbilpbnB1dC5MVCgxKTsKKwkJCQkJc2V0MjM9KElUb2tlbilpbnB1dC5MVCgxKTsKKwkJCQkJaWYgKCBpbnB1dC5MQSgxKT09MTF8fChpbnB1dC5MQSgxKT49MTQgJiYgaW5wdXQuTEEoMSk8PTE1KSApCisJCQkJCXsKKwkJCQkJCWlucHV0LkNvbnN1bWUoKTsKKwkJCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuQmVjb21lUm9vdCgoQ29tbW9uVHJlZSlhZGFwdG9yLkNyZWF0ZShzZXQyMyksIHJvb3RfMCk7CisJCQkJCQlzdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKwkJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbXNlICk7CisJCQkJCQl0aHJvdyBtc2U7CisJCQkJCX0KKworCQkJCQlkYmcuTG9jYXRpb24oIDc3LCAyOSApOworCQkJCQlQdXNoRm9sbG93KEZvbGxvdy5fYXRvbV9pbl9tdWx0RXhwcjMzMik7CisJCQkJCWF0b20yND1hdG9tKCk7CisKKwkJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCBhdG9tMjQuVHJlZSk7CisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWdvdG8gbG9vcDU7CisJCQkJfQorCQkJfQorCisJCQlsb29wNToKKwkJCQk7CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdFN1YlJ1bGUoIDUgKTsKKwkJCX0KKworCisJCQl9CisKKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNzgsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgIm11bHRFeHByIiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvLyAkQU5UTFIgZW5kICJtdWx0RXhwciIKKworCXB1YmxpYyBjbGFzcyBhdG9tX3JldHVybiA6IFBhcnNlclJ1bGVSZXR1cm5TY29wZQorCXsKKwkJaW50ZXJuYWwgQ29tbW9uVHJlZSB0cmVlOworCQlwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFRyZWUgeyBnZXQgeyByZXR1cm4gdHJlZTsgfSB9CisJfQorCisJLy8gJEFOVExSIHN0YXJ0ICJhdG9tIgorCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODA6MDogYXRvbSA6ICggSU5UIHwgSUQgfCAnKCcgZXhwciAnKScgLT4gZXhwciB8IElEICcoJyBleHByICcpJyAtPiBeKCBDQUxMIElEIGV4cHIgKSApOworCXByaXZhdGUgUHJvZmlsZUdyYW1tYXJQYXJzZXIuYXRvbV9yZXR1cm4gYXRvbSggICkKKwl7CisJCVByb2ZpbGVHcmFtbWFyUGFyc2VyLmF0b21fcmV0dXJuIHJldHZhbCA9IG5ldyBQcm9maWxlR3JhbW1hclBhcnNlci5hdG9tX3JldHVybigpOworCQlyZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworCQlDb21tb25UcmVlIHJvb3RfMCA9IG51bGw7CisKKwkJSVRva2VuIElOVDI1PW51bGw7CisJCUlUb2tlbiBJRDI2PW51bGw7CisJCUlUb2tlbiBjaGFyX2xpdGVyYWwyNz1udWxsOworCQlJVG9rZW4gY2hhcl9saXRlcmFsMjk9bnVsbDsKKwkJSVRva2VuIElEMzA9bnVsbDsKKwkJSVRva2VuIGNoYXJfbGl0ZXJhbDMxPW51bGw7CisJCUlUb2tlbiBjaGFyX2xpdGVyYWwzMz1udWxsOworCQlQcm9maWxlR3JhbW1hclBhcnNlci5leHByX3JldHVybiBleHByMjggPSBkZWZhdWx0KFByb2ZpbGVHcmFtbWFyUGFyc2VyLmV4cHJfcmV0dXJuKTsKKwkJUHJvZmlsZUdyYW1tYXJQYXJzZXIuZXhwcl9yZXR1cm4gZXhwcjMyID0gZGVmYXVsdChQcm9maWxlR3JhbW1hclBhcnNlci5leHByX3JldHVybik7CisKKwkJQ29tbW9uVHJlZSBJTlQyNV90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgSUQyNl90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMjdfdHJlZT1udWxsOworCQlDb21tb25UcmVlIGNoYXJfbGl0ZXJhbDI5X3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBJRDMwX3RyZWU9bnVsbDsKKwkJQ29tbW9uVHJlZSBjaGFyX2xpdGVyYWwzMV90cmVlPW51bGw7CisJCUNvbW1vblRyZWUgY2hhcl9saXRlcmFsMzNfdHJlZT1udWxsOworCQlSZXdyaXRlUnVsZUlUb2tlblN0cmVhbSBzdHJlYW1fMTI9bmV3IFJld3JpdGVSdWxlSVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDEyIik7CisJCVJld3JpdGVSdWxlSVRva2VuU3RyZWFtIHN0cmVhbV8xMz1uZXcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMTMiKTsKKwkJUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gc3RyZWFtX0lEPW5ldyBSZXdyaXRlUnVsZUlUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiBJRCIpOworCQlSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2V4cHI9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGV4cHIiKTsKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImF0b20iICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA4MCwgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo4MDo5OiAoIElOVCB8IElEIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgfCBJRCAnKCcgZXhwciAnKScgLT4gXiggQ0FMTCBJRCBleHByICkgKQorCQkJaW50IGFsdDY9NDsKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlckRlY2lzaW9uKCA2ICk7CisKKwkJCXN3aXRjaCAoIGlucHV0LkxBKDEpICkKKwkJCXsKKwkJCWNhc2UgSU5UOgorCQkJCXsKKwkJCQlhbHQ2PTE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJRDoKKwkJCQl7CisJCQkJaW50IExBNl8yID0gaW5wdXQuTEEoMik7CisKKwkJCQlpZiAoIChMQTZfMj09MTIpICkKKwkJCQl7CisJCQkJCWFsdDY9NDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIChMQTZfMj09TkVXTElORXx8KExBNl8yPj0xMCAmJiBMQTZfMjw9MTEpfHwoTEE2XzI+PTEzICYmIExBNl8yPD0xNikpICkKKwkJCQl7CisJCQkJCWFsdDY9MjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNiwgMiwgaW5wdXQpOworCisJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQkJCQl0aHJvdyBudmFlOworCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDEyOgorCQkJCXsKKwkJCQlhbHQ2PTM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDYsIDAsIGlucHV0KTsKKworCQkJCQlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKwkJCQkJdGhyb3cgbnZhZTsKKwkJCQl9CisJCQl9CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdERlY2lzaW9uKCA2ICk7CisJCQl9CisKKwkJCXN3aXRjaCAoIGFsdDYgKQorCQkJeworCQkJY2FzZSAxOgorCQkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlR3JhbW1hci5nMzo4MDo5OiBJTlQKKwkJCQl7CisJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJCWRiZy5Mb2NhdGlvbiggODAsIDggKTsKKwkJCQlJTlQyNT0oSVRva2VuKU1hdGNoKGlucHV0LElOVCxGb2xsb3cuX0lOVF9pbl9hdG9tMzQ4KTsgCisJCQkJSU5UMjVfdHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuQ3JlYXRlKElOVDI1KTsKKwkJCQlhZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgSU5UMjVfdHJlZSk7CisKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlkYmcuRW50ZXJBbHQoIDIgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODE6OTogSUQKKwkJCQl7CisJCQkJcm9vdF8wID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKworCQkJCWRiZy5Mb2NhdGlvbiggODEsIDggKTsKKwkJCQlJRDI2PShJVG9rZW4pTWF0Y2goaW5wdXQsSUQsRm9sbG93Ll9JRF9pbl9hdG9tMzU4KTsgCisJCQkJSUQyNl90cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5DcmVhdGUoSUQyNik7CisJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzAsIElEMjZfdHJlZSk7CisKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlkYmcuRW50ZXJBbHQoIDMgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODI6OTogJygnIGV4cHIgJyknCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggODIsIDggKTsKKwkJCQljaGFyX2xpdGVyYWwyNz0oSVRva2VuKU1hdGNoKGlucHV0LDEyLEZvbGxvdy5fMTJfaW5fYXRvbTM2OCk7ICAKKwkJCQlzdHJlYW1fMTIuQWRkKGNoYXJfbGl0ZXJhbDI3KTsKKworCQkJCWRiZy5Mb2NhdGlvbiggODIsIDEyICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fYXRvbTM3MCk7CisJCQkJZXhwcjI4PWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCXN0cmVhbV9leHByLkFkZChleHByMjguVHJlZSk7CisJCQkJZGJnLkxvY2F0aW9uKCA4MiwgMTcgKTsKKwkJCQljaGFyX2xpdGVyYWwyOT0oSVRva2VuKU1hdGNoKGlucHV0LDEzLEZvbGxvdy5fMTNfaW5fYXRvbTM3Mik7ICAKKwkJCQlzdHJlYW1fMTMuQWRkKGNoYXJfbGl0ZXJhbDI5KTsKKworCisKKwkJCQl7CisJCQkJLy8gQVNUIFJFV1JJVEUKKwkJCQkvLyBlbGVtZW50czogZXhwcgorCQkJCS8vIHRva2VuIGxhYmVsczogCisJCQkJLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorCQkJCS8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyB3aWxkY2FyZCBsYWJlbHM6IAorCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQkJLy8gODI6MjU6IC0+IGV4cHIKKwkJCQl7CisJCQkJCWRiZy5Mb2NhdGlvbiggODIsIDI3ICk7CisJCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCBzdHJlYW1fZXhwci5OZXh0VHJlZSgpKTsKKworCQkJCX0KKworCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCX0KKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlkYmcuRW50ZXJBbHQoIDQgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZUdyYW1tYXIuZzM6ODM6OTogSUQgJygnIGV4cHIgJyknCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggODMsIDggKTsKKwkJCQlJRDMwPShJVG9rZW4pTWF0Y2goaW5wdXQsSUQsRm9sbG93Ll9JRF9pbl9hdG9tMzg5KTsgIAorCQkJCXN0cmVhbV9JRC5BZGQoSUQzMCk7CisKKwkJCQlkYmcuTG9jYXRpb24oIDgzLCAxMSApOworCQkJCWNoYXJfbGl0ZXJhbDMxPShJVG9rZW4pTWF0Y2goaW5wdXQsMTIsRm9sbG93Ll8xMl9pbl9hdG9tMzkxKTsgIAorCQkJCXN0cmVhbV8xMi5BZGQoY2hhcl9saXRlcmFsMzEpOworCisJCQkJZGJnLkxvY2F0aW9uKCA4MywgMTUgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9hdG9tMzkzKTsKKwkJCQlleHByMzI9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJc3RyZWFtX2V4cHIuQWRkKGV4cHIzMi5UcmVlKTsKKwkJCQlkYmcuTG9jYXRpb24oIDgzLCAyMCApOworCQkJCWNoYXJfbGl0ZXJhbDMzPShJVG9rZW4pTWF0Y2goaW5wdXQsMTMsRm9sbG93Ll8xM19pbl9hdG9tMzk1KTsgIAorCQkJCXN0cmVhbV8xMy5BZGQoY2hhcl9saXRlcmFsMzMpOworCisKKworCQkJCXsKKwkJCQkvLyBBU1QgUkVXUklURQorCQkJCS8vIGVsZW1lbnRzOiBJRCwgZXhwcgorCQkJCS8vIHRva2VuIGxhYmVsczogCisJCQkJLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorCQkJCS8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyBydWxlIGxpc3QgbGFiZWxzOiAKKwkJCQkvLyB3aWxkY2FyZCBsYWJlbHM6IAorCQkJCXJldHZhbC50cmVlID0gcm9vdF8wOworCQkJCVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworCQkJCXJvb3RfMCA9IChDb21tb25UcmVlKWFkYXB0b3IuTmlsKCk7CisJCQkJLy8gODM6MjU6IC0+IF4oIENBTEwgSUQgZXhwciApCisJCQkJeworCQkJCQlkYmcuTG9jYXRpb24oIDgzLCAyNyApOworCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVHcmFtbWFyLmczOjgzOjI4OiBeKCBDQUxMIElEIGV4cHIgKQorCQkJCQl7CisJCQkJCUNvbW1vblRyZWUgcm9vdF8xID0gKENvbW1vblRyZWUpYWRhcHRvci5OaWwoKTsKKwkJCQkJZGJnLkxvY2F0aW9uKCA4MywgMjkgKTsKKwkJCQkJcm9vdF8xID0gKENvbW1vblRyZWUpYWRhcHRvci5CZWNvbWVSb290KChDb21tb25UcmVlKWFkYXB0b3IuQ3JlYXRlKENBTEwsICJDQUxMIiksIHJvb3RfMSk7CisKKwkJCQkJZGJnLkxvY2F0aW9uKCA4MywgMzQgKTsKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzEsIHN0cmVhbV9JRC5OZXh0Tm9kZSgpKTsKKwkJCQkJZGJnLkxvY2F0aW9uKCA4MywgMzcgKTsKKwkJCQkJYWRhcHRvci5BZGRDaGlsZChyb290XzEsIHN0cmVhbV9leHByLk5leHRUcmVlKCkpOworCisJCQkJCWFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCByb290XzEpOworCQkJCQl9CisKKwkJCQl9CisKKwkJCQlyZXR2YWwudHJlZSA9IHJvb3RfMDsKKwkJCQl9CisKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCX0KKwkJCXJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisJCQlyZXR2YWwudHJlZSA9IChDb21tb25UcmVlKWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisJCQlhZGFwdG9yLlNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCXJldHZhbC50cmVlID0gKENvbW1vblRyZWUpYWRhcHRvci5FcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oODQsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImF0b20iICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXR2YWw7CisJfQorCS8vICRBTlRMUiBlbmQgImF0b20iCisJI2VuZHJlZ2lvbiBSdWxlcworCisKKwkjcmVnaW9uIERGQQorCURGQTIgZGZhMjsKKworCXByb3RlY3RlZCBvdmVycmlkZSB2b2lkIEluaXRERkFzKCkKKwl7CisJCWJhc2UuSW5pdERGQXMoKTsKKwkJZGZhMiA9IG5ldyBERkEyKCB0aGlzICk7CisJfQorCisJY2xhc3MgREZBMiA6IERGQQorCXsKKworCQljb25zdCBzdHJpbmcgREZBMl9lb3RTID0KKwkJCSJceEFceEZGRkYiOworCQljb25zdCBzdHJpbmcgREZBMl9lb2ZTID0KKwkJCSJceEFceEZGRkYiOworCQljb25zdCBzdHJpbmcgREZBMl9taW5TID0KKwkJCSJceDFceDZceDFceEZGRkZceDFceDhceDFceEZGRkZceDFceDZceDFceEZGRkZceDJceEFceDFceDhceDFceEZGRkYiOworCQljb25zdCBzdHJpbmcgREZBMl9tYXhTID0KKwkJCSJceDFceENceDFceEZGRkZceDFceDExXHgxXHhGRkZGXHgxXHhDXHgxXHhGRkZGXHgyXHgxMFx4MVx4MTFceDFceEZGRkYiOworCQljb25zdCBzdHJpbmcgREZBMl9hY2NlcHRTID0KKwkJCSJceDFceEZGRkZceDFceDFceDFceEZGRkZceDFceDRceDFceEZGRkZceDFceDJceDNceEZGRkZceDFceDMiOworCQljb25zdCBzdHJpbmcgREZBMl9zcGVjaWFsUyA9CisJCQkiXHhBXHhGRkZGfT4iOworCQlzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gREZBMl90cmFuc2l0aW9uUyA9CisJCQl7CisJCQkJIlx4MVx4Mlx4MVx4MVx4MVx4M1x4M1x4RkZGRlx4MVx4MSIsCisJCQkJIiIsCisJCQkJIlx4MVx4MVx4MVx4RkZGRlx4Mlx4MVx4MVx4NFx4MVx4RkZGRlx4M1x4MVx4MVx4NSIsCisJCQkJIiIsCisJCQkJIlx4MVx4N1x4MVx4Nlx4NFx4RkZGRlx4MVx4MSIsCisJCQkJIiIsCisJCQkJIlx4Mlx4MVx4MVx4RkZGRlx4MVx4OFx4M1x4MSIsCisJCQkJIlx4M1x4MVx4MVx4OFx4M1x4MSIsCisJCQkJIlx4MVx4MVx4MVx4RkZGRlx4Mlx4MVx4Mlx4RkZGRlx4M1x4MVx4MVx4OSIsCisJCQkJIiIKKwkJCX07CisKKwkJc3RhdGljIHJlYWRvbmx5IHNob3J0W10gREZBMl9lb3QgPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX2VvdFMpOworCQlzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkEyX2VvZiA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfZW9mUyk7CisJCXN0YXRpYyByZWFkb25seSBjaGFyW10gREZBMl9taW4gPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyX21pblMpOworCQlzdGF0aWMgcmVhZG9ubHkgY2hhcltdIERGQTJfbWF4ID0gREZBLlVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMl9tYXhTKTsKKwkJc3RhdGljIHJlYWRvbmx5IHNob3J0W10gREZBMl9hY2NlcHQgPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX2FjY2VwdFMpOworCQlzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkEyX3NwZWNpYWwgPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX3NwZWNpYWxTKTsKKwkJc3RhdGljIHJlYWRvbmx5IHNob3J0W11bXSBERkEyX3RyYW5zaXRpb247CisKKwkJc3RhdGljIERGQTIoKQorCQl7CisJCQlpbnQgbnVtU3RhdGVzID0gREZBMl90cmFuc2l0aW9uUy5MZW5ndGg7CisJCQlERkEyX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworCQkJZm9yICggaW50IGk9MDsgaSA8IG51bVN0YXRlczsgaSsrICkKKwkJCXsKKwkJCQlERkEyX3RyYW5zaXRpb25baV0gPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX3RyYW5zaXRpb25TW2ldKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBERkEyKCBCYXNlUmVjb2duaXplciByZWNvZ25pemVyICkKKwkJeworCQkJdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKwkJCXRoaXMuZGVjaXNpb25OdW1iZXIgPSAyOworCQkJdGhpcy5lb3QgPSBERkEyX2VvdDsKKwkJCXRoaXMuZW9mID0gREZBMl9lb2Y7CisJCQl0aGlzLm1pbiA9IERGQTJfbWluOworCQkJdGhpcy5tYXggPSBERkEyX21heDsKKwkJCXRoaXMuYWNjZXB0ID0gREZBMl9hY2NlcHQ7CisJCQl0aGlzLnNwZWNpYWwgPSBERkEyX3NwZWNpYWw7CisJCQl0aGlzLnRyYW5zaXRpb24gPSBERkEyX3RyYW5zaXRpb247CisJCX0KKwkJcHVibGljIG92ZXJyaWRlIHN0cmluZyBHZXREZXNjcmlwdGlvbigpCisJCXsKKwkJCXJldHVybiAiNTM6MDogc3RhdCA6ICggZXhwciBORVdMSU5FIC0+IGV4cHIgfCBJRCAnPScgZXhwciBORVdMSU5FIC0+IF4oICc9JyBJRCBleHByICkgfCBmdW5jIE5FV0xJTkUgLT4gZnVuYyB8IE5FV0xJTkUgLT4pOyI7CisJCX0KKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgRXJyb3IoIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgKQorCQl7CisJCQkoKERlYnVnUGFyc2VyKXJlY29nbml6ZXIpLmRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQl9CisJfQorCisKKwkjZW5kcmVnaW9uIERGQQorCisJI3JlZ2lvbiBGb2xsb3cgc2V0cworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbGxvdworCXsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX3N0YXRfaW5fcHJvZzUzID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDExQzJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9zdGF0NzAgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX05FV0xJTkVfaW5fc3RhdDcyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fc3RhdDEwNSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyMDAwMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xN19pbl9zdGF0MTA3ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwQzBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9zdGF0MTA5ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9ORVdMSU5FX2luX3N0YXQxMTEgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9mdW5jX2luX3N0YXQxNDMgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX05FV0xJTkVfaW5fc3RhdDE0NSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX05FV0xJTkVfaW5fc3RhdDE3OCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX0lEX2luX2Z1bmMyMTkgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTAwMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xMl9pbl9mdW5jMjIyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweEMwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2Zvcm1hbFBhcl9pbl9mdW5jMjI0ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDIwMDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTNfaW5fZnVuYzIyNiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyMDAwMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xN19pbl9mdW5jMjI4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwQzBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9mdW5jMjMwID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfc2V0X2luX2Zvcm1hbFBhcjI2NyA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX211bHRFeHByX2luX2V4cHIyODggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTA0MDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTZfaW5fZXhwcjI5MiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMEMwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzEwX2luX2V4cHIyOTUgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTBDMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9tdWx0RXhwcl9pbl9leHByMjk5ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwNDAyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2F0b21faW5fbXVsdEV4cHIzMjAgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4QzgwMlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9zZXRfaW5fbXVsdEV4cHIzMjMgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MTBDMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9hdG9tX2luX211bHRFeHByMzMyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweEM4MDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSU5UX2luX2F0b20zNDggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9JRF9pbl9hdG9tMzU4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTJfaW5fYXRvbTM2OCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMEMwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fYXRvbTM3MCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyMDAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzEzX2luX2F0b20zNzIgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9JRF9pbl9hdG9tMzg5ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDEwMDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTJfaW5fYXRvbTM5MSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxMEMwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fYXRvbTM5MyA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyMDAwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzEzX2luX2F0b20zOTUgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MlVMfSk7CisKKwl9CisJI2VuZHJlZ2lvbiBGb2xsb3cgc2V0cworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyUGFyc2VySGVscGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVHcmFtbWFyUGFyc2VySGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDc1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZUdyYW1tYXJQYXJzZXJIZWxwZXIuY3MKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKworcGFydGlhbCBjbGFzcyBQcm9maWxlR3JhbW1hclBhcnNlcgoreworICAgIC8qKiBMaXN0IG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBNdXN0IHBvaW50IGF0IHRoZSBGVU5DIG5vZGVzLiAqLworICAgIExpc3Q8Q29tbW9uVHJlZT4gZnVuY3Rpb25EZWZpbml0aW9ucyA9IG5ldyBMaXN0PENvbW1vblRyZWU+KCk7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZVRyZWVHcmFtbWFyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVUcmVlR3JhbW1hci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA4ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVUcmVlR3JhbW1hci5jcwpAQCAtMCwwICsxLDg1MCBAQAorLy8gJEFOVExSIDMuMS4yIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczIDIwMDktMDktMzAgMTM6MTg6MTkKKworLy8gVGhlIHZhcmlhYmxlICd2YXJpYWJsZScgaXMgYXNzaWduZWQgYnV0IGl0cyB2YWx1ZSBpcyBuZXZlciB1c2VkLgorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMjE5CisvLyBVbnJlYWNoYWJsZSBjb2RlIGRldGVjdGVkLgorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTYyCisKKworLy9pbXBvcnQgamF2YS51dGlsLk1hcDsKKy8vaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwordXNpbmcgQmlnSW50ZWdlciA9IGphdmEubWF0aC5CaWdJbnRlZ2VyOwordXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgQW50bHIuUnVudGltZTsKK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKK3VzaW5nIFJld3JpdGVSdWxlSVRva2VuU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLlJld3JpdGVSdWxlVG9rZW5TdHJlYW07dXNpbmcgU3RhY2sgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5TdGFjazxvYmplY3Q+OwordXNpbmcgTGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdDsKK3VzaW5nIEFycmF5TGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Q8b2JqZWN0PjsKKwordXNpbmcgQW50bHIuUnVudGltZS5EZWJ1ZzsKK3VzaW5nIElPRXhjZXB0aW9uID0gU3lzdGVtLklPLklPRXhjZXB0aW9uOworW1N5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGUoIkFOVExSIiwgIjMuMS4yIildCitbU3lzdGVtLkNMU0NvbXBsaWFudChmYWxzZSldCitwdWJsaWMgcGFydGlhbCBjbGFzcyBQcm9maWxlVHJlZUdyYW1tYXIgOiBEZWJ1Z1RyZWVQYXJzZXIKK3sKKwlpbnRlcm5hbCBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gdG9rZW5OYW1lcyA9IG5ldyBzdHJpbmdbXSB7CisJCSI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLCAiQ0FMTCIsICJGVU5DIiwgIklEIiwgIklOVCIsICJORVdMSU5FIiwgIldTIiwgIictJyIsICInJSciLCAiJygnIiwgIicpJyIsICInKiciLCAiJy8nIiwgIicrJyIsICInPSciCisJfTsKKwlwdWJsaWMgY29uc3QgaW50IEVPRj0tMTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEwPTEwOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTE9MTE7CisJcHVibGljIGNvbnN0IGludCBUX18xMj0xMjsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzEzPTEzOworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTQ9MTQ7CisJcHVibGljIGNvbnN0IGludCBUX18xNT0xNTsKKwlwdWJsaWMgY29uc3QgaW50IFRfXzE2PTE2OworCXB1YmxpYyBjb25zdCBpbnQgVF9fMTc9MTc7CisJcHVibGljIGNvbnN0IGludCBDQUxMPTQ7CisJcHVibGljIGNvbnN0IGludCBGVU5DPTU7CisJcHVibGljIGNvbnN0IGludCBJRD02OworCXB1YmxpYyBjb25zdCBpbnQgSU5UPTc7CisJcHVibGljIGNvbnN0IGludCBORVdMSU5FPTg7CisJcHVibGljIGNvbnN0IGludCBXUz05OworCisJLy8gZGVsZWdhdGVzCisJLy8gZGVsZWdhdG9ycworCisJcHVibGljIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBydWxlTmFtZXMgPQorCQluZXcgc3RyaW5nW10KKwkJeworCQkJImludmFsaWRSdWxlIiwgImNhbGwiLCAiZXhwciIsICJwcm9nIiwgInN0YXQiCisJCX07CisKKwkJaW50IHJ1bGVMZXZlbCA9IDA7CisJCXB1YmxpYyB2aXJ0dWFsIGludCBSdWxlTGV2ZWwgeyBnZXQgeyByZXR1cm4gcnVsZUxldmVsOyB9IH0KKwkJcHVibGljIHZpcnR1YWwgdm9pZCBJbmNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbCsrOyB9CisJCXB1YmxpYyB2aXJ0dWFsIHZvaWQgRGVjUnVsZUxldmVsKCkgeyBydWxlTGV2ZWwtLTsgfQorCQlwdWJsaWMgUHJvZmlsZVRyZWVHcmFtbWFyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQgKQorCQkJOiB0aGlzKCBpbnB1dCwgbmV3IFByb2ZpbGVyKG51bGwpLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKQorCQl7CisJCX0KKwkJcHVibGljIFByb2ZpbGVUcmVlR3JhbW1hciggSVRyZWVOb2RlU3RyZWFtIGlucHV0LCBJRGVidWdFdmVudExpc3RlbmVyIGRiZywgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwkJCTogYmFzZSggaW5wdXQsIGRiZywgc3RhdGUgKQorCQl7CisJCQlQcm9maWxlciBwID0gKFByb2ZpbGVyKWRiZzsKKwkJCXAuc2V0UGFyc2VyKHRoaXMpOworCQl9CisKKwlwdWJsaWMgUHJvZmlsZVRyZWVHcmFtbWFyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKwkJOiBiYXNlKCBpbnB1dCwgZGJnLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKQorCXsKKwkJUHJvZmlsZXIgcCA9IChQcm9maWxlcilkYmc7CisJCXAuc2V0UGFyc2VyKHRoaXMpOworCX0KKwlwdWJsaWMgdmlydHVhbCBib29sIEFscmVhZHlQYXJzZWRSdWxlKCBJSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4ICkKKwl7CisJCSgoUHJvZmlsZXIpZGJnKS5FeGFtaW5lUnVsZU1lbW9pemF0aW9uKGlucHV0LCBydWxlSW5kZXgsIFByb2ZpbGVUcmVlR3JhbW1hci5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisJCXJldHVybiBzdXBlci5BbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgcnVsZUluZGV4KTsKKwl9CisKKwlwdWJsaWMgdmlydHVhbCB2b2lkIE1lbW9pemUoIElJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlSW5kZXgsIGludCBydWxlU3RhcnRJbmRleCApCisJeworCQkoKFByb2ZpbGVyKWRiZykuTWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCwgUHJvZmlsZVRyZWVHcmFtbWFyLnJ1bGVOYW1lc1tydWxlSW5kZXhdKTsKKwkJc3VwZXIuTWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCk7CisJfQorCXByb3RlY3RlZCB2aXJ0dWFsIGJvb2wgRXZhbFByZWRpY2F0ZSggYm9vbCByZXN1bHQsIHN0cmluZyBwcmVkaWNhdGUgKQorCXsKKwkJZGJnLlNlbWFudGljUHJlZGljYXRlKCByZXN1bHQsIHByZWRpY2F0ZSApOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCisJcHVibGljIG92ZXJyaWRlIHN0cmluZ1tdIFRva2VuTmFtZXMgeyBnZXQgeyByZXR1cm4gUHJvZmlsZVRyZWVHcmFtbWFyLnRva2VuTmFtZXM7IH0gfQorCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR3JhbW1hckZpbGVOYW1lIHsgZ2V0IHsgcmV0dXJuICJCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMyI7IH0gfQorCisKKwkjcmVnaW9uIFJ1bGVzCisKKwkvLyAkQU5UTFIgc3RhcnQgInByb2ciCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6NTM6MDogcHJvZyA6ICggc3RhdCApKiA7CisJcHJpdmF0ZSB2b2lkIHByb2coICApCisJeworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAicHJvZyIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDUzLCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo1Mzo5OiAoICggc3RhdCApKiApCisJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6NTM6OTogKCBzdGF0ICkqCisJCQl7CisJCQlkYmcuTG9jYXRpb24oIDUzLCA4ICk7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo1Mzo5OiAoIHN0YXQgKSoKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlclN1YlJ1bGUoIDEgKTsKKworCQkJZm9yICggOyA7ICkKKwkJCXsKKwkJCQlpbnQgYWx0MT0yOworCQkJCXRyeQorCQkJCXsKKwkJCQkJZGJnLkVudGVyRGVjaXNpb24oIDEgKTsKKworCQkJCWludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisJCQkJaWYgKCAoKExBMV8wPj1DQUxMICYmIExBMV8wPD1JTlQpfHwoTEExXzA+PTEwICYmIExBMV8wPD0xMSl8fChMQTFfMD49MTQgJiYgTEExXzA8PTE3KSkgKQorCQkJCXsKKwkJCQkJYWx0MT0xOworCQkJCX0KKworCisJCQkJfQorCQkJCWZpbmFsbHkKKwkJCQl7CisJCQkJCWRiZy5FeGl0RGVjaXNpb24oIDEgKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKCBhbHQxICkKKwkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo1MzowOiBzdGF0CisJCQkJCXsKKwkJCQkJZGJnLkxvY2F0aW9uKCA1MywgOCApOworCQkJCQlQdXNoRm9sbG93KEZvbGxvdy5fc3RhdF9pbl9wcm9nNDgpOworCQkJCQlzdGF0KCk7CisKKwkJCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWdvdG8gbG9vcDE7CisJCQkJfQorCQkJfQorCisJCQlsb29wMToKKwkJCQk7CisKKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQlkYmcuRXhpdFN1YlJ1bGUoIDEgKTsKKwkJCX0KKworCisJCQl9CisKKwkJfQorCQljYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKwkJeworCQkJUmVwb3J0RXJyb3IocmUpOworCQkJUmVjb3ZlcihpbnB1dCxyZSk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCX0KKwkJZGJnLkxvY2F0aW9uKDU0LCA0KTsKKworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJZGJnLkV4aXRSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICJwcm9nIiApOworCQkJRGVjUnVsZUxldmVsKCk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuVGVybWluYXRlKCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gOworCX0KKwkvLyAkQU5UTFIgZW5kICJwcm9nIgorCisKKwkvLyAkQU5UTFIgc3RhcnQgInN0YXQiCisJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6NTY6MDogc3RhdCA6ICggZXhwciB8IF4oICc9JyBJRCBleHByICkgfCBeKCBGVU5DICggLiApKyApICk7CisJcHJpdmF0ZSB2b2lkIHN0YXQoICApCisJeworCQlDb21tb25UcmVlIElEMj1udWxsOworCQlCaWdJbnRlZ2VyIGV4cHIxID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKwkJQmlnSW50ZWdlciBleHByMyA9IGRlZmF1bHQoQmlnSW50ZWdlcik7CisKKwkJdHJ5CisJCXsKKwkJCWRiZy5FbnRlclJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInN0YXQiICk7CisJCQlpZiAoIFJ1bGVMZXZlbCA9PSAwICkKKwkJCXsKKwkJCQlkYmcuQ29tbWVuY2UoKTsKKwkJCX0KKwkJCUluY1J1bGVMZXZlbCgpOworCQkJZGJnLkxvY2F0aW9uKCA1NiwgLTEgKTsKKworCQl0cnkKKwkJeworCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6NTY6OTogKCBleHByIHwgXiggJz0nIElEIGV4cHIgKSB8IF4oIEZVTkMgKCAuICkrICkgKQorCQkJaW50IGFsdDM9MzsKKwkJCXRyeQorCQkJeworCQkJCWRiZy5FbnRlckRlY2lzaW9uKCAzICk7CisKKwkJCXN3aXRjaCAoIGlucHV0LkxBKDEpICkKKwkJCXsKKwkJCWNhc2UgQ0FMTDoKKwkJCWNhc2UgSUQ6CisJCQljYXNlIElOVDoKKwkJCWNhc2UgMTA6CisJCQljYXNlIDExOgorCQkJY2FzZSAxNDoKKwkJCWNhc2UgMTU6CisJCQljYXNlIDE2OgorCQkJCXsKKwkJCQlhbHQzPTE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxNzoKKwkJCQl7CisJCQkJYWx0Mz0yOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRlVOQzoKKwkJCQl7CisJCQkJYWx0Mz0zOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzLCAwLCBpbnB1dCk7CisKKwkJCQkJZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBudmFlICk7CisJCQkJCXRocm93IG52YWU7CisJCQkJfQorCQkJfQorCisJCQl9CisJCQlmaW5hbGx5CisJCQl7CisJCQkJZGJnLkV4aXREZWNpc2lvbiggMyApOworCQkJfQorCisJCQlzd2l0Y2ggKCBhbHQzICkKKwkJCXsKKwkJCWNhc2UgMToKKwkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczOjU2Ojk6IGV4cHIKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA1NiwgOCApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX3N0YXQ2Myk7CisJCQkJZXhwcjE9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJZGJnLkxvY2F0aW9uKCA1NiwgMzUgKTsKKwkJCQkgc3RyaW5nIHJlc3VsdCA9IGV4cHIxLlRvU3RyaW5nKCk7CisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZShleHByMSArICIgKGFib3V0ICIgKyByZXN1bHRbMF0gKyAiKjEwXiIgKyAocmVzdWx0Lkxlbmd0aC0xKSArICIpIik7CisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlkYmcuRW50ZXJBbHQoIDIgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczOjU5Ojk6IF4oICc9JyBJRCBleHByICkKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA1OSwgOCApOworCQkJCWRiZy5Mb2NhdGlvbiggNTksIDEwICk7CisJCQkJTWF0Y2goaW5wdXQsMTcsRm9sbG93Ll8xN19pbl9zdGF0OTgpOyAKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCAxNCApOworCQkJCUlEMj0oQ29tbW9uVHJlZSlNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX3N0YXQxMDApOyAKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCAxNyApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX3N0YXQxMDIpOworCQkJCWV4cHIzPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDU5LCAzNSApOworCQkJCSBnbG9iYWxNZW1vcnlbKElEMiE9bnVsbD9JRDIuVGV4dDpudWxsKV0gPSBleHByMzsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJZGJnLkVudGVyQWx0KCAzICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo2MDo5OiBeKCBGVU5DICggLiApKyApCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNjAsIDggKTsKKwkJCQlkYmcuTG9jYXRpb24oIDYwLCAxMCApOworCQkJCU1hdGNoKGlucHV0LEZVTkMsRm9sbG93Ll9GVU5DX2luX3N0YXQxMjgpOyAKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDYwLCAxNSApOworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczOjYwOjE2OiAoIC4gKSsKKwkJCQlpbnQgY250Mj0wOworCQkJCXRyeQorCQkJCXsKKwkJCQkJZGJnLkVudGVyU3ViUnVsZSggMiApOworCisJCQkJZm9yICggOyA7ICkKKwkJCQl7CisJCQkJCWludCBhbHQyPTI7CisJCQkJCXRyeQorCQkJCQl7CisJCQkJCQlkYmcuRW50ZXJEZWNpc2lvbiggMiApOworCisJCQkJCWludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisJCQkJCWlmICggKChMQTJfMD49Q0FMTCAmJiBMQTJfMDw9MTcpKSApCisJCQkJCXsKKwkJCQkJCWFsdDI9MTsKKwkJCQkJfQorCQkJCQllbHNlIGlmICggKExBMl8wPT1VUCkgKQorCQkJCQl7CisJCQkJCQlhbHQyPTI7CisJCQkJCX0KKworCisJCQkJCX0KKwkJCQkJZmluYWxseQorCQkJCQl7CisJCQkJCQlkYmcuRXhpdERlY2lzaW9uKCAyICk7CisJCQkJCX0KKworCQkJCQlzd2l0Y2ggKCBhbHQyICkKKwkJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCQlkYmcuRW50ZXJBbHQoIDEgKTsKKworCQkJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6NjA6MDogLgorCQkJCQkJeworCQkJCQkJZGJnLkxvY2F0aW9uKCA2MCwgMTUgKTsKKwkJCQkJCU1hdGNoQW55KGlucHV0KTsgCisKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoIGNudDIgPj0gMSApCisJCQkJCQkJZ290byBsb29wMjsKKworCQkJCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZTIgPSBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKCAyLCBpbnB1dCApOworCQkJCQkJZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBlZWUyICk7CisKKwkJCQkJCXRocm93IGVlZTI7CisJCQkJCX0KKwkJCQkJY250MisrOworCQkJCX0KKwkJCQlsb29wMjoKKwkJCQkJOworCisJCQkJfQorCQkJCWZpbmFsbHkKKwkJCQl7CisJCQkJCWRiZy5FeGl0U3ViUnVsZSggMiApOworCQkJCX0KKworCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyAKKworCQkJCX0KKwkJCQlicmVhazsKKworCQkJfQorCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNjEsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgInN0YXQiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiA7CisJfQorCS8vICRBTlRMUiBlbmQgInN0YXQiCisKKworCS8vICRBTlRMUiBzdGFydCAiZXhwciIKKwkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo2MzowOiBleHByIHJldHVybnMgW0JpZ0ludGVnZXIgdmFsdWVdIDogKCBeKCAnKycgYT0gZXhwciBiPSBleHByICkgfCBeKCAnLScgYT0gZXhwciBiPSBleHByICkgfCBeKCAnKicgYT0gZXhwciBiPSBleHByICkgfCBeKCAnLycgYT0gZXhwciBiPSBleHByICkgfCBeKCAnJScgYT0gZXhwciBiPSBleHByICkgfCBJRCB8IElOVCB8IGNhbGwgKTsKKwlwcml2YXRlIEJpZ0ludGVnZXIgZXhwciggICkKKwl7CisJCUJpZ0ludGVnZXIgdmFsdWUgPSBkZWZhdWx0KEJpZ0ludGVnZXIpOworCisJCUNvbW1vblRyZWUgSUQ0PW51bGw7CisJCUNvbW1vblRyZWUgSU5UNT1udWxsOworCQlCaWdJbnRlZ2VyIGEgPSBkZWZhdWx0KEJpZ0ludGVnZXIpOworCQlCaWdJbnRlZ2VyIGIgPSBkZWZhdWx0KEJpZ0ludGVnZXIpOworCQlCaWdJbnRlZ2VyIGNhbGw2ID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAiZXhwciIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDYzLCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo2NDo5OiAoIF4oICcrJyBhPSBleHByIGI9IGV4cHIgKSB8IF4oICctJyBhPSBleHByIGI9IGV4cHIgKSB8IF4oICcqJyBhPSBleHByIGI9IGV4cHIgKSB8IF4oICcvJyBhPSBleHByIGI9IGV4cHIgKSB8IF4oICclJyBhPSBleHByIGI9IGV4cHIgKSB8IElEIHwgSU5UIHwgY2FsbCApCisJCQlpbnQgYWx0ND04OworCQkJdHJ5CisJCQl7CisJCQkJZGJnLkVudGVyRGVjaXNpb24oIDQgKTsKKworCQkJc3dpdGNoICggaW5wdXQuTEEoMSkgKQorCQkJeworCQkJY2FzZSAxNjoKKwkJCQl7CisJCQkJYWx0ND0xOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJeworCQkJCWFsdDQ9MjsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDE0OgorCQkJCXsKKwkJCQlhbHQ0PTM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQl7CisJCQkJYWx0ND00OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJeworCQkJCWFsdDQ9NTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIElEOgorCQkJCXsKKwkJCQlhbHQ0PTY7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJTlQ6CisJCQkJeworCQkJCWFsdDQ9NzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENBTEw6CisJCQkJeworCQkJCWFsdDQ9ODsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNCwgMCwgaW5wdXQpOworCisJCQkJCWRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiggbnZhZSApOworCQkJCQl0aHJvdyBudmFlOworCQkJCX0KKwkJCX0KKworCQkJfQorCQkJZmluYWxseQorCQkJeworCQkJCWRiZy5FeGl0RGVjaXNpb24oIDQgKTsKKwkJCX0KKworCQkJc3dpdGNoICggYWx0NCApCisJCQl7CisJCQljYXNlIDE6CisJCQkJZGJnLkVudGVyQWx0KCAxICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo2NDo5OiBeKCAnKycgYT0gZXhwciBiPSBleHByICkKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA2NCwgOCApOworCQkJCWRiZy5Mb2NhdGlvbiggNjQsIDEwICk7CisJCQkJTWF0Y2goaW5wdXQsMTYsRm9sbG93Ll8xNl9pbl9leHByMTcyKTsgCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2NCwgMTUgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9leHByMTc2KTsKKwkJCQlhPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCWRiZy5Mb2NhdGlvbiggNjQsIDIyICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjE4MCk7CisJCQkJYj1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2NCwgMzUgKTsKKwkJCQkgdmFsdWUgPSBhLmFkZChiKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJZGJnLkVudGVyQWx0KCAyICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo2NTo5OiBeKCAnLScgYT0gZXhwciBiPSBleHByICkKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA2NSwgOCApOworCQkJCWRiZy5Mb2NhdGlvbiggNjUsIDEwICk7CisJCQkJTWF0Y2goaW5wdXQsMTAsRm9sbG93Ll8xMF9pbl9leHByMjAwKTsgCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2NSwgMTUgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9leHByMjA0KTsKKwkJCQlhPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCQkJCWRiZy5Mb2NhdGlvbiggNjUsIDIyICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjIwOCk7CisJCQkJYj1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgCisJCQkJZGJnLkxvY2F0aW9uKCA2NSwgMzUgKTsKKwkJCQkgdmFsdWUgPSBhLnN1YnRyYWN0KGIpOyAKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlkYmcuRW50ZXJBbHQoIDMgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczOjY2Ojk6IF4oICcqJyBhPSBleHByIGI9IGV4cHIgKQorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDY2LCA4ICk7CisJCQkJZGJnLkxvY2F0aW9uKCA2NiwgMTAgKTsKKwkJCQlNYXRjaChpbnB1dCwxNCxGb2xsb3cuXzE0X2luX2V4cHIyMjgpOyAKKworCQkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDY2LCAxNSApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyMzIpOworCQkJCWE9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisJCQkJZGJnLkxvY2F0aW9uKCA2NiwgMjIgKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9leHByMjM2KTsKKwkJCQliPWV4cHIoKTsKKworCQkJCXN0YXRlLl9mc3AtLTsKKworCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDY2LCAzNSApOworCQkJCSB2YWx1ZSA9IGEubXVsdGlwbHkoYik7IAorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWRiZy5FbnRlckFsdCggNCApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6Njc6OTogXiggJy8nIGE9IGV4cHIgYj0gZXhwciApCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNjcsIDggKTsKKwkJCQlkYmcuTG9jYXRpb24oIDY3LCAxMCApOworCQkJCU1hdGNoKGlucHV0LDE1LEZvbGxvdy5fMTVfaW5fZXhwcjI1Nik7IAorCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjcsIDE1ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjI2MCk7CisJCQkJYT1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDY3LCAyMiApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyNjQpOworCQkJCWI9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjcsIDM1ICk7CisJCQkJIHZhbHVlID0gYS5kaXZpZGUoYik7IAorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCWRiZy5FbnRlckFsdCggNSApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6Njg6OTogXiggJyUnIGE9IGV4cHIgYj0gZXhwciApCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNjgsIDggKTsKKwkJCQlkYmcuTG9jYXRpb24oIDY4LCAxMCApOworCQkJCU1hdGNoKGlucHV0LDExLEZvbGxvdy5fMTFfaW5fZXhwcjI4NCk7IAorCisJCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjgsIDE1ICk7CisJCQkJUHVzaEZvbGxvdyhGb2xsb3cuX2V4cHJfaW5fZXhwcjI4OCk7CisJCQkJYT1leHByKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDY4LCAyMiApOworCQkJCVB1c2hGb2xsb3coRm9sbG93Ll9leHByX2luX2V4cHIyOTIpOworCQkJCWI9ZXhwcigpOworCisJCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCQlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNjgsIDM1ICk7CisJCQkJIHZhbHVlID0gYS5yZW1haW5kZXIoYik7IAorCisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCWRiZy5FbnRlckFsdCggNiApOworCisJCQkJLy8gQnVpbGRPcHRpb25zXFxQcm9maWxlVHJlZUdyYW1tYXIuZzM6Njk6OTogSUQKKwkJCQl7CisJCQkJZGJnLkxvY2F0aW9uKCA2OSwgOCApOworCQkJCUlEND0oQ29tbW9uVHJlZSlNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX2V4cHIzMTEpOyAKKwkJCQlkYmcuTG9jYXRpb24oIDY5LCAzNSApOworCQkJCSB2YWx1ZSA9IGdldFZhbHVlKChJRDQhPW51bGw/SUQ0LlRleHQ6bnVsbCkpOyAKKworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNzoKKwkJCQlkYmcuRW50ZXJBbHQoIDcgKTsKKworCQkJCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczOjcwOjk6IElOVAorCQkJCXsKKwkJCQlkYmcuTG9jYXRpb24oIDcwLCA4ICk7CisJCQkJSU5UNT0oQ29tbW9uVHJlZSlNYXRjaChpbnB1dCxJTlQsRm9sbG93Ll9JTlRfaW5fZXhwcjM0Nyk7IAorCQkJCWRiZy5Mb2NhdGlvbiggNzAsIDM1ICk7CisJCQkJIHZhbHVlID0gbmV3IEJpZ0ludGVnZXIoKElOVDUhPW51bGw/SU5UNS5UZXh0Om51bGwpKTsgCisKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJZGJnLkVudGVyQWx0KCA4ICk7CisKKwkJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo3MTo5OiBjYWxsCisJCQkJeworCQkJCWRiZy5Mb2NhdGlvbiggNzEsIDggKTsKKwkJCQlQdXNoRm9sbG93KEZvbGxvdy5fY2FsbF9pbl9leHByMzgyKTsKKwkJCQljYWxsNj1jYWxsKCk7CisKKwkJCQlzdGF0ZS5fZnNwLS07CisKKwkJCQlkYmcuTG9jYXRpb24oIDcxLCAzNSApOworCQkJCSB2YWx1ZSA9IGNhbGw2OyAKKworCQkJCX0KKwkJCQlicmVhazsKKworCQkJfQorCQl9CisJCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCQl7CisJCQlSZXBvcnRFcnJvcihyZSk7CisJCQlSZWNvdmVyKGlucHV0LHJlKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJfQorCQlkYmcuTG9jYXRpb24oNzIsIDQpOworCisJCX0KKwkJZmluYWxseQorCQl7CisJCQlkYmcuRXhpdFJ1bGUoIEdyYW1tYXJGaWxlTmFtZSwgImV4cHIiICk7CisJCQlEZWNSdWxlTGV2ZWwoKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5UZXJtaW5hdGUoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9CisJLy8gJEFOVExSIGVuZCAiZXhwciIKKworCisJLy8gJEFOVExSIHN0YXJ0ICJjYWxsIgorCS8vIEJ1aWxkT3B0aW9uc1xcUHJvZmlsZVRyZWVHcmFtbWFyLmczOjc0OjA6IGNhbGwgcmV0dXJucyBbQmlnSW50ZWdlciB2YWx1ZV0gOiBeKCBDQUxMIElEIGV4cHIgKSA7CisJcHJpdmF0ZSBCaWdJbnRlZ2VyIGNhbGwoICApCisJeworCQlCaWdJbnRlZ2VyIHZhbHVlID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKworCQlDb21tb25UcmVlIElEOD1udWxsOworCQlCaWdJbnRlZ2VyIGV4cHI3ID0gZGVmYXVsdChCaWdJbnRlZ2VyKTsKKworCQl0cnkKKwkJeworCQkJZGJnLkVudGVyUnVsZSggR3JhbW1hckZpbGVOYW1lLCAiY2FsbCIgKTsKKwkJCWlmICggUnVsZUxldmVsID09IDAgKQorCQkJeworCQkJCWRiZy5Db21tZW5jZSgpOworCQkJfQorCQkJSW5jUnVsZUxldmVsKCk7CisJCQlkYmcuTG9jYXRpb24oIDc0LCAtMSApOworCisJCXRyeQorCQl7CisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo3NTo5OiAoIF4oIENBTEwgSUQgZXhwciApICkKKwkJCWRiZy5FbnRlckFsdCggMSApOworCisJCQkvLyBCdWlsZE9wdGlvbnNcXFByb2ZpbGVUcmVlR3JhbW1hci5nMzo3NTo5OiBeKCBDQUxMIElEIGV4cHIgKQorCQkJeworCQkJZGJnLkxvY2F0aW9uKCA3NSwgOCApOworCQkJZGJnLkxvY2F0aW9uKCA3NSwgMTAgKTsKKwkJCU1hdGNoKGlucHV0LENBTEwsRm9sbG93Ll9DQUxMX2luX2NhbGw0MzApOyAKKworCQkJTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IAorCQkJZGJnLkxvY2F0aW9uKCA3NSwgMTUgKTsKKwkJCUlEOD0oQ29tbW9uVHJlZSlNYXRjaChpbnB1dCxJRCxGb2xsb3cuX0lEX2luX2NhbGw0MzIpOyAKKwkJCWRiZy5Mb2NhdGlvbiggNzUsIDE4ICk7CisJCQlQdXNoRm9sbG93KEZvbGxvdy5fZXhwcl9pbl9jYWxsNDM0KTsKKwkJCWV4cHI3PWV4cHIoKTsKKworCQkJc3RhdGUuX2ZzcC0tOworCisKKwkJCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgCisJCQlkYmcuTG9jYXRpb24oIDc1LCAzNSApOworCQkJIEJpZ0ludGVnZXIgcCA9IGV4cHI3OworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUgZnVuY1Jvb3QgPSBmaW5kRnVuY3Rpb24oKElEOCE9bnVsbD9JRDguVGV4dDpudWxsKSwgcCk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmNSb290ID09IG51bGwpIHsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIk5vIG1hdGNoIGZvdW5kIGZvciAiICsgKElEOCE9bnVsbD9JRDguVGV4dDpudWxsKSArICIoIiArIHAgKyAiKSIpOworCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2Ugc2V0IHVwIHRoZSBsb2NhbCBldmFsdWF0b3IgdG8gcnVuIG92ZXIgdGhlCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlLgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJlLXJlYWRzIGEgc3ViLUFTVCBvZiBvdXIgaW5wdXQgQVNUIQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlVHJlZUdyYW1tYXIgZSA9IG5ldyBQcm9maWxlVHJlZUdyYW1tYXIoZnVuY1Jvb3QsIGZ1bmN0aW9uRGVmaW5pdGlvbnMsIGdsb2JhbE1lbW9yeSwgcCk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZS5leHByKCk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCQkJfQorCisJCX0KKwkJY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisJCXsKKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIoaW5wdXQscmUpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQl9CisJCWRiZy5Mb2NhdGlvbig4NywgNCk7CisKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCWRiZy5FeGl0UnVsZSggR3JhbW1hckZpbGVOYW1lLCAiY2FsbCIgKTsKKwkJCURlY1J1bGVMZXZlbCgpOworCQkJaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisJCQl7CisJCQkJZGJnLlRlcm1pbmF0ZSgpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkvLyAkQU5UTFIgZW5kICJjYWxsIgorCSNlbmRyZWdpb24gUnVsZXMKKworCisJI3JlZ2lvbiBGb2xsb3cgc2V0cworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbGxvdworCXsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX3N0YXRfaW5fcHJvZzQ4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDNDQ0YyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fc3RhdDYzID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTdfaW5fc3RhdDk4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fc3RhdDEwMCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxQ0NEMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX3N0YXQxMDIgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4OFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9GVU5DX2luX3N0YXQxMjggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4NFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xNl9pbl9leHByMTcyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMTc2ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDFDQ0QwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fZXhwcjE4MCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHg4VUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzEwX2luX2V4cHIyMDAgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4NFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2V4cHIyMDQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MUNDRDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMjA4ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDhVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfMTRfaW5fZXhwcjIyOCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHg0VUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fZXhwcjIzMiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxQ0NEMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2V4cHIyMzYgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4OFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF8xNV9pbl9leHByMjU2ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMjYwID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDFDQ0QwVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX2V4cHJfaW5fZXhwcjI2NCA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHg4VUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgXzExX2luX2V4cHIyODQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4NFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2V4cHIyODggPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4MUNDRDBVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfZXhwcl9pbl9leHByMjkyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDhVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fZXhwcjMxMSA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgyVUx9KTsKKwkJcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgX0lOVF9pbl9leHByMzQ3ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfY2FsbF9pbl9leHByMzgyID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDJVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfQ0FMTF9pbl9jYWxsNDMwID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXsweDRVTH0pOworCQlwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJpdFNldCBfSURfaW5fY2FsbDQzMiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117MHgxQ0NEMFVMfSk7CisJCXB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IF9leHByX2luX2NhbGw0MzQgPSBuZXcgQml0U2V0KG5ldyB1bG9uZ1tdezB4OFVMfSk7CisKKwl9CisJI2VuZHJlZ2lvbiBGb2xsb3cgc2V0cworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQnVpbGRPcHRpb25zL1Byb2ZpbGVUcmVlR3JhbW1hci5nMyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9Qcm9maWxlVHJlZUdyYW1tYXIuZzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3ODZkYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9Qcm9maWxlVHJlZUdyYW1tYXIuZzMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit0cmVlIGdyYW1tYXIgUHJvZmlsZVRyZWVHcmFtbWFyOworCitvcHRpb25zCit7CisJbGFuZ3VhZ2U9Q1NoYXJwMzsKKwl0b2tlblZvY2FiPVByb2ZpbGVHcmFtbWFyOworCUFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorCisvLyBTVEFSVDptZW1iZXJzCitAaGVhZGVyCit7CisvL2ltcG9ydCBqYXZhLnV0aWwuTWFwOworLy9pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Cit1c2luZyBCaWdJbnRlZ2VyID0gamF2YS5tYXRoLkJpZ0ludGVnZXI7Cit1c2luZyBDb25zb2xlID0gU3lzdGVtLkNvbnNvbGU7Cit9CisvLyBFTkQ6bWVtYmVycworCisvLyBTVEFSVDpydWxlcworcHJvZzogICBzdGF0KgorICAgIDsKKworc3RhdDogICBleHByICAgICAgICAgICAgICAgICAgICAgICB7IHN0cmluZyByZXN1bHQgPSAkZXhwci52YWx1ZS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSgkZXhwci52YWx1ZSArICIgKGFib3V0ICIgKyByZXN1bHRbMF0gKyAiKjEwXiIgKyAocmVzdWx0Lkxlbmd0aC0xKSArICIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICB8ICAgXignPScgSUQgZXhwcikgICAgICAgICAgICAgeyBnbG9iYWxNZW1vcnlbJElELnRleHRdID0gJGV4cHIudmFsdWU7IH0KKyAgICB8ICAgXihGVU5DIC4rKQkgICAgICAgICAgICAgICAvLyBpZ25vcmUgRlVOQ3MgLSB3ZSBhZGRlZCB0aGVtIHRvIGZ1bmN0aW9uRGVmaW5pdGlvbnMgYWxyZWFkeSBpbiBwYXJzZXIuCisgICAgOworCitleHByIHJldHVybnMgW0JpZ0ludGVnZXIgdmFsdWVdCisgICAgOiAgIF4oJysnIGE9ZXhwciBiPWV4cHIpICAgICAgIHsgJHZhbHVlID0gJGEudmFsdWUuYWRkKCRiLnZhbHVlKTsgfQorICAgIHwgICBeKCctJyBhPWV4cHIgYj1leHByKSAgICAgICB7ICR2YWx1ZSA9ICRhLnZhbHVlLnN1YnRyYWN0KCRiLnZhbHVlKTsgfQorICAgIHwgICBeKCcqJyBhPWV4cHIgYj1leHByKSAgICAgICB7ICR2YWx1ZSA9ICRhLnZhbHVlLm11bHRpcGx5KCRiLnZhbHVlKTsgfQorICAgIHwgICBeKCcvJyBhPWV4cHIgYj1leHByKSAgICAgICB7ICR2YWx1ZSA9ICRhLnZhbHVlLmRpdmlkZSgkYi52YWx1ZSk7IH0KKyAgICB8ICAgXignJScgYT1leHByIGI9ZXhwcikgICAgICAgeyAkdmFsdWUgPSAkYS52YWx1ZS5yZW1haW5kZXIoJGIudmFsdWUpOyB9CisgICAgfCAgIElEICAgICAgICAgICAgICAgICAgICAgICAgIHsgJHZhbHVlID0gZ2V0VmFsdWUoJElELnRleHQpOyB9CisgICAgfCAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgIHsgJHZhbHVlID0gbmV3IEJpZ0ludGVnZXIoJElOVC50ZXh0KTsgfQorICAgIHwgICBjYWxsICAgICAgICAgICAgICAgICAgICAgICB7ICR2YWx1ZSA9ICRjYWxsLnZhbHVlOyB9CisgICAgOworCitjYWxsIHJldHVybnMgW0JpZ0ludGVnZXIgdmFsdWVdCisgICAgOiAgIF4oQ0FMTCBJRCBleHByKSAgICAgICAgICAgIHsgQmlnSW50ZWdlciBwID0gJGV4cHIudmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSBmdW5jUm9vdCA9IGZpbmRGdW5jdGlvbigkSUQudGV4dCwgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmNSb290ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIk5vIG1hdGNoIGZvdW5kIGZvciAiICsgJElELnRleHQgKyAiKCIgKyBwICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHNldCB1cCB0aGUgbG9jYWwgZXZhbHVhdG9yIHRvIHJ1biBvdmVyIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZS1yZWFkcyBhIHN1Yi1BU1Qgb2Ygb3VyIGlucHV0IEFTVCEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVRyZWVHcmFtbWFyIGUgPSBuZXcgUHJvZmlsZVRyZWVHcmFtbWFyKGZ1bmNSb290LCBmdW5jdGlvbkRlZmluaXRpb25zLCBnbG9iYWxNZW1vcnksIHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSBlLmV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICA7CisvLyBFTkQ6cnVsZXMKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0J1aWxkT3B0aW9ucy9Qcm9maWxlVHJlZUdyYW1tYXJIZWxwZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZVRyZWVHcmFtbWFySGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Y2M4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9CdWlsZE9wdGlvbnMvUHJvZmlsZVRyZWVHcmFtbWFySGVscGVyLmNzCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgQW50bHIuUnVudGltZS5UcmVlOworCit1c2luZyBCaWdJbnRlZ2VyID0gamF2YS5tYXRoLkJpZ0ludGVnZXI7Cit1c2luZyBDb25zb2xlID0gU3lzdGVtLkNvbnNvbGU7CisKK3BhcnRpYWwgY2xhc3MgUHJvZmlsZVRyZWVHcmFtbWFyCit7CisgICAgLyoqIFBvaW50cyB0byBmdW5jdGlvbnMgdHJhY2tlZCBieSB0cmVlIGJ1aWxkZXIuICovCisgICAgcHJpdmF0ZSBMaXN0PENvbW1vblRyZWU+IGZ1bmN0aW9uRGVmaW5pdGlvbnM7CisKKyAgICAvKiogUmVtZW1iZXIgbG9jYWwgdmFyaWFibGVzLiBDdXJyZW50bHksIHRoaXMgaXMgb25seSB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyLgorICAgICAqLworICAgIHByaXZhdGUgcmVhZG9ubHkgSURpY3Rpb25hcnk8c3RyaW5nLCBCaWdJbnRlZ2VyPiBsb2NhbE1lbW9yeSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgQmlnSW50ZWdlcj4oKTsKKworICAgIC8qKiBSZW1lbWJlciBnbG9iYWwgdmFyaWFibGVzIHNldCBieSA9LiAqLworICAgIHByaXZhdGUgSURpY3Rpb25hcnk8c3RyaW5nLCBCaWdJbnRlZ2VyPiBnbG9iYWxNZW1vcnkgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIEJpZ0ludGVnZXI+KCk7CisKKyAgICAvKiogU2V0IHVwIGFuIGV2YWx1YXRvciB3aXRoIGEgbm9kZSBzdHJlYW07IGFuZCBhIHNldCBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIEFTVHMuICovCisgICAgcHVibGljIFByb2ZpbGVUcmVlR3JhbW1hciggQ29tbW9uVHJlZU5vZGVTdHJlYW0gbm9kZXMsIExpc3Q8Q29tbW9uVHJlZT4gZnVuY3Rpb25EZWZpbml0aW9ucyApCisgICAgICAgIDogdGhpcyggbm9kZXMgKQorICAgIHsKKyAgICAgICAgdGhpcy5mdW5jdGlvbkRlZmluaXRpb25zID0gZnVuY3Rpb25EZWZpbml0aW9uczsKKyAgICB9CisKKyAgICAvKiogU2V0IHVwIGEgbG9jYWwgZXZhbHVhdG9yIGZvciBhIG5lc3RlZCBmdW5jdGlvbiBjYWxsLiBUaGUgZXZhbHVhdG9yIGdldHMgdGhlIGRlZmluaXRpb24KKyAgICAgKiAgdHJlZSBvZiB0aGUgZnVuY3Rpb247IHRoZSBzZXQgb2YgYWxsIGRlZmluZWQgZnVuY3Rpb25zICh0byBmaW5kIGxvY2FsbHkgY2FsbGVkIG9uZXMpOyBhCisgICAgICogIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2YXJpYWJsZSBtZW1vcnk7IGFuZCB0aGUgdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciB0byBiZQorICAgICAqICBhZGRlZCB0byB0aGUgbG9jYWwgbWVtb3J5LgorICAgICAqLworICAgIHByaXZhdGUgUHJvZmlsZVRyZWVHcmFtbWFyKCBDb21tb25UcmVlIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICBMaXN0PENvbW1vblRyZWU+IGZ1bmN0aW9uRGVmaW5pdGlvbnMsCisgICAgICAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgQmlnSW50ZWdlcj4gZ2xvYmFsTWVtb3J5LAorICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHBhcmFtVmFsdWUgKQorICAgICAgICAvLyBFeHBlY3RlZCB0cmVlIGZvciBmdW5jdGlvbjogXihGVU5DIElEICggSU5UIHwgSUQgKSBleHByKQorICAgICAgICA6IHRoaXMoIG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSggZnVuY3Rpb24uR2V0Q2hpbGQoIDIgKSApLCBmdW5jdGlvbkRlZmluaXRpb25zICkKKyAgICB7CisgICAgICAgIHRoaXMuZ2xvYmFsTWVtb3J5ID0gZ2xvYmFsTWVtb3J5OworICAgICAgICBsb2NhbE1lbW9yeVtmdW5jdGlvbi5HZXRDaGlsZCggMSApLlRleHRdID0gcGFyYW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKiogRmluZCBtYXRjaGluZyBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uIG5hbWUgYW5kIHBhcmFtZXRlcgorICAgICAqICB2YWx1ZS4gVGhlIGZpcnN0IGRlZmluaXRpb24gaXMgcmV0dXJuZWQgd2hlcmUgKGEpIHRoZSBuYW1lIG1hdGNoZXMKKyAgICAgKiAgYW5kIChiKSB0aGUgZm9ybWFsIHBhcmFtZXRlciBhZ3JlZXMgaWYgaXQgaXMgZGVmaW5lZCBhcyBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbW1vblRyZWUgZmluZEZ1bmN0aW9uKCBzdHJpbmcgbmFtZSwgQmlnSW50ZWdlciBwYXJhbVZhbHVlICkKKyAgICB7CisgICAgICAgIGZvcmVhY2ggKCBDb21tb25UcmVlIGYgaW4gZnVuY3Rpb25EZWZpbml0aW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHRyZWUgZm9yIGY6IF4oRlVOQyBJRCAoSUQgfCBJTlQpIGV4cHIpCisgICAgICAgICAgICBpZiAoIGYuR2V0Q2hpbGQoIDAgKS5UZXh0LkVxdWFscyggbmFtZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHBhcmFtZXRlciBtYXRjaGVzCisgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSBmb3JtYWxQYXIgPSAoQ29tbW9uVHJlZSlmLkdldENoaWxkKCAxICk7CisgICAgICAgICAgICAgICAgaWYgKCBmb3JtYWxQYXIuVG9rZW4uVHlwZSA9PSBJTlQKKyAgICAgICAgICAgICAgICAgICAgJiYgIW5ldyBCaWdJbnRlZ2VyKCBmb3JtYWxQYXIuVG9rZW4uVGV4dCApLkVxdWFscyggcGFyYW1WYWx1ZSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0YW50IGluIGZvcm1hbFBhciBsaXN0IGRvZXMgbm90IG1hdGNoIGFjdHVhbCB2YWx1ZSAtPiBubyBtYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciAodmFsdWUgZm9yIElOVCBmb3JtYWwgYXJnKSBhcyB3ZWxsIGFzIGZjdCBuYW1lIGFncmVlcyEKKyAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKiogR2V0IHZhbHVlIG9mIG5hbWUgdXAgY2FsbCBzdGFjay4gKi8KKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZSggc3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciB2YWx1ZTsKKyAgICAgICAgaWYgKCBsb2NhbE1lbW9yeS5UcnlHZXRWYWx1ZSggbmFtZSwgb3V0IHZhbHVlICkgJiYgdmFsdWUgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGdsb2JhbE1lbW9yeS5UcnlHZXRWYWx1ZSggbmFtZSwgb3V0IHZhbHVlICkgJiYgdmFsdWUgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBub3QgZm91bmQgaW4gbG9jYWwgbWVtb3J5IG9yIGdsb2JhbCBtZW1vcnkKKyAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJ1bmRlZmluZWQgdmFyaWFibGUgIiArIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCAiMCIgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9Qcm9ncmFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQ29tcG9zaXRpb24vUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmFhZjAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQ29tcG9zaXRpb24vUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDU0IEBACivvu79uYW1lc3BhY2UgQW50bHIzLlJ1bnRpbWUuVGVzdC5Db21wb3NpdGlvbgoreworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKworICAgIGludGVybmFsIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgX01haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQgInggPSAyKigzKzMpIgorCisgICAgICAgICAgICBJQ2hhclN0cmVhbSBpbnB1dDsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0uRXF1YWxzKCItaSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGFyZ3NbMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oYXJnc1swXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEFOVExSSW5wdXRTdHJlYW0oQ29uc29sZS5PcGVuU3RhbmRhcmRJbnB1dCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxleCA9IG5ldyBWZWNNYXRoTGV4ZXIoaW5wdXQpOworICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOworICAgICAgICAgICAgdmFyIGcgPSBuZXcgVmVjTWF0aFBhcnNlcih0b2tlbnMpOworICAgICAgICAgICAgSUFzdFJ1bGVSZXR1cm5TY29wZTxDb21tb25UcmVlPiByID0gZy5wcm9nKCk7CisgICAgICAgICAgICBDb21tb25UcmVlIHQgPSByLlRyZWU7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiT3JpZ2luYWwgdHJlZTogICAiICsgdC5Ub1N0cmluZ1RyZWUoKSk7CisKKyAgICAgICAgICAgIHZhciBzaW1wbGlmeSA9IG5ldyBTaW1wbGlmeShuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0odCkpOworICAgICAgICAgICAgdCA9IChDb21tb25UcmVlKXNpbXBsaWZ5LkRvd251cCh0KTsKKworICAgICAgICAgICAgdmFyIHJlZHVjZSA9IG5ldyBSZWR1Y2UobmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHQpKTsKKyAgICAgICAgICAgIHQgPSAoQ29tbW9uVHJlZSlyZWR1Y2UuRG93bnVwKHQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2ltcGxpZmllZCB0cmVlOiAiICsgdC5Ub1N0cmluZ1RyZWUoKSk7CisgICAgICAgICAgICBDb25zb2xlLlJlYWRLZXkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0NvbXBvc2l0aW9uL1JlZHVjZS5nMyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0NvbXBvc2l0aW9uL1JlZHVjZS5nMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQ1NzBiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQ29tcG9zaXRpb24vUmVkdWNlLmczCkBAIC0wLDAgKzEsMjYgQEAKK++7v3RyZWUgZ3JhbW1hciBSZWR1Y2U7CisKK29wdGlvbnMKK3sKKyAgICB0b2tlblZvY2FiPVZlY01hdGg7ICAgICAgCisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IAorICAgIG91dHB1dD1BU1Q7ICAgICAgICAgICAgICAKKyAgICBmaWx0ZXI9dHJ1ZTsgICAgICAgICAgICAgCisgICAgbGFuZ3VhZ2U9Q1NoYXJwMzsKK30KKworCitAbWVtYmVycyAKK3sgCisgICAvL3B1YmxpYyBvdmVycmlkZSBJQXN0UnVsZVJldHVyblNjb3BlIFRvcGRvd24oKSB7IHJldHVybiB0b3Bkb3duKCk7IH0KKyAgIHB1YmxpYyBvdmVycmlkZSBJQXN0UnVsZVJldHVyblNjb3BlIEJvdHRvbXVwKCkgeyByZXR1cm4gYm90dG9tdXAoKTsgfSAKK30gCisKKworLyoqIFJld3JpdGU6IHgreCB0byBiZSAyKngsIDIqeCB0byBiZSB4PDwxLCB4PDxuPDxtIHRvIGJlIHg8PChuK20pICovCitib3R0b211cAorICAgIDogIF4oUExVUyBpPUlOVCBqPUlOVCB7JGkuaW50PT0kai5pbnR9PykgLT4gXihNVUxUWyIqIl0gSU5UWyIyIl0gJGopCisgICAgfCAgXihNVUxUIHg9SU5UIHskeC5pbnQ9PTJ9PyB5PS4pICAgICAgICAtPiBeKFNISUZUWyI8PCJdICR5IElOVFsiMSJdKQorICAgIHwgIF4oU0hJRlQgXihTSElGVCBlPS4gbj1JTlQpIG09SU5UKQorICAgICAgIC0+IF4oU0hJRlRbIjw8Il0gJGUgSU5UWygkbi5pbnQrJG0uaW50KS5Ub1N0cmluZygpXSkKKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9TaW1wbGlmeS5nMyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0NvbXBvc2l0aW9uL1NpbXBsaWZ5LmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMWZkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9TaW1wbGlmeS5nMwpAQCAtMCwwICsxLDI1IEBACit0cmVlIGdyYW1tYXIgU2ltcGxpZnk7CisKK29wdGlvbnMgeworICAgIHRva2VuVm9jYWI9VmVjTWF0aDsgICAgCisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgb3V0cHV0PUFTVDsKKyAgICBsYW5ndWFnZT1DU2hhcnAzOworICAgIGZpbHRlcj10cnVlOworICAgIC8vcmV3cml0ZT10cnVlOworfQorCitAbWVtYmVycyAKK3sgCisgICBwdWJsaWMgb3ZlcnJpZGUgSUFzdFJ1bGVSZXR1cm5TY29wZSBUb3Bkb3duKCkgeyByZXR1cm4gdG9wZG93bigpOyB9CisgICBwdWJsaWMgb3ZlcnJpZGUgSUFzdFJ1bGVSZXR1cm5TY29wZSBCb3R0b211cCgpIHsgcmV0dXJuIGJvdHRvbXVwKCk7IH0gCit9IAorCisKK3RvcGRvd24KKyAgICA6ICAgXiggTVVMVCBJTlQgXihWRUMgKGUrPS4pKykgKSAtPiBeKFZFQyBeKE1VTFQgSU5UICRlKSspCisgICAgOworCitib3R0b211cAorICAgIDogIF4oTVVMVCBhPS4gYj1JTlQgeyRiLmludD09MH0/KSAtPiAkYiAvLyB4KjAgLT4gMAorICAgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0NvbXBvc2l0aW9uL1ZlY01hdGguZzMgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9WZWNNYXRoLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWE3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9WZWNNYXRoLmczCkBAIC0wLDAgKzEsMjIgQEAKK2dyYW1tYXIgVmVjTWF0aDsKKworb3B0aW9ucyAKK3sKKyAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgb3V0cHV0PUFTVDsKKyAgIGxhbmd1YWdlPUNTaGFycDM7Cit9CisKK2ltcG9ydCBWZWNNYXRoX0xleGVyLCBWZWNNYXRoX1BhcnNlcjsKKworQGxleGVyOjpuYW1lc3BhY2V7QW50bHIzLlJ1bnRpbWUuVGVzdC5Db21wb3NpdGlvbn0KK0BwYXJzZXI6Om5hbWVzcGFjZXtBbnRscjMuUnVudGltZS5UZXN0LkNvbXBvc2l0aW9ufQorCitwdWJsaWMgCittYWluCisgICA6IHByb2cKKyAgIDsKKworZHVtbXkKKyAgIDogJ0RVTU1ZJyAvLyAxLiBJZiB0aGUgcGFyc2VyIG9yIHRoZSBjb21wb3NpdGUgZ3JhbW1hciBkb2VzIG5vdCBjb250YWluIGEgdG9rZW4sIG5vIGxleGVyIGlzIGdlbmVyYXRlZC4KKyAgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0NvbXBvc2l0aW9uL1ZlY01hdGhfTGV4ZXIuZzMgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9WZWNNYXRoX0xleGVyLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTMzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9WZWNNYXRoX0xleGVyLmczCkBAIC0wLDAgKzEsMTcgQEAKK2xleGVyIGdyYW1tYXIgVmVjTWF0aF9MZXhlcjsKKworCitQUklOVCAgICAgICAgOiAncHJpbnQnOworSUQgICAgICAgICAgIDogJ2EnLi4neicrIDsKK0lOVCAgICAgICAgICA6ICcwJy4uJzknKyA7CitXUyAgICAgICAgICAgOiAoJyAnfCdccid8J1xuJykrIHtTa2lwKCk7fSA7CitQTFVTICAgICAgICAgOiAnKyc7CitNSU5VUyAgICAgICAgOiAnLSc7CitNVUxUICAgICAgICAgOiAnKic7CitFUVVBTCAgICAgICAgOiAnPSc7CitET1QgICAgICAgICAgOiAnLic7CitPUEVOX0JSQUNFICAgOiAnKCc7CitPUEVOX1NRVUFSRSAgOiAnWyc7CitDTE9TRV9CUkFDRSAgOiAnKSc7CitDTE9TRV9TUVVBUkUgOiAnXSc7CitDT01NQSAgICAgICAgOiAnLCc7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQ29tcG9zaXRpb24vVmVjTWF0aF9QYXJzZXIuZzMgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Db21wb3NpdGlvbi9WZWNNYXRoX1BhcnNlci5nMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlYzEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvQ29tcG9zaXRpb24vVmVjTWF0aF9QYXJzZXIuZzMKQEAgLTAsMCArMSwzNSBAQAorcGFyc2VyIGdyYW1tYXIgVmVjTWF0aF9QYXJzZXI7CisKK29wdGlvbnMgeworICAgIG91dHB1dD1BU1Q7Cit9CisKK3Rva2VucyB7CisgICAgU0hJRlQ7ICAgIAorICAgIFZFQzsgICAgICAKK30KKworcHVibGljCitwcm9nCisgICA6IHN0YXQrIDsKKworc3RhdAorICAgOiBJRCBFUVVBTCBleHByIC0+IF4oIEVRVUFMIElEIGV4cHIgKQorICAgfCBQUklOVF4gZXhwcgorICAgOworCitleHByCisgICA6IG11bHRFeHByICggUExVU14gbXVsdEV4cHIgKSoKKyAgIDsKKworbXVsdEV4cHIKKyAgIDogcHJpbWFyeSAoICggTVVMVF4gfCBET1ReICkgcHJpbWFyeSApKgorICAgOworCitwcmltYXJ5CisgICA6ICAgSU5UCisgICB8ICAgSUQKKyAgIHwgICBPUEVOX1NRVUFSRSBleHByICggQ09NTUEgZXhwciApKiBDTE9TRV9TUVVBUkUgLT4gXiggVkVDIGV4cHIrICkKKyAgIHwgICBPUEVOX0JSQUNFIGV4cHIgQ0xPU0VfQlJBQ0UgICAgICAgICAgICAgLT4gZXhwcgorICAgOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9GYXN0U2ltcGxlRXhwcmVzc2lvbi5nMyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0Zhc3RTaW1wbGVFeHByZXNzaW9uLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTE0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9GYXN0U2ltcGxlRXhwcmVzc2lvbi5nMwpAQCAtMCwwICsxLDg2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2dyYW1tYXIgRmFzdFNpbXBsZUV4cHJlc3Npb247CisKK29wdGlvbnMKK3sKKwlsYW5ndWFnZT1DU2hhcnAzOworCS8vc2xpbT10cnVlOworCW91dHB1dD1BU1Q7CisJQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7Cit9CisKK0BsZXhlcjo6c3VwZXJDbGFzc3tBbnRsci5SdW50aW1lLlNsaW1MZXhlcn0KKworcHVibGljCitleHByZXNzaW9uCisJOglhZGRpdGl2ZV9leHByZXNzaW9uCisJCUVPRgorCTsKKworYWRkaXRpdmVfZXhwcmVzc2lvbgorCToJbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbgorCQkoCSgnKydeIHwgJy0nXikKKwkJCW11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKwkJKSoKKwk7CisKK211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKwk6CWF0b20KKwkJKAkoJyonXiB8ICcvJ14gfCAnJSdeKQorCQkJYXRvbQorCQkpKgorCTsKKworYXRvbQorCToJSURFTlRJRklFUgorCXwJTlVNQkVSCisJOworCisvLworLy8gTEVYRVIKKy8vCisKK0lERU5USUZJRVIKKwk6CSgnYScuLid6JyB8ICdBJy4uJ1onIHwgJ18nKQorCQkoJ2EnLi4neicgfCAnQScuLidaJyB8ICdfJyB8ICcwJy4uJzknKSoKKwk7CisKK05VTUJFUgorCToJJzAnLi4nOScrCisJOworCitXUworCToJKCcgJyB8ICdcdCcgfCAnXG4nIHwgJ1xyJyB8ICdcZicpCisJCXskY2hhbm5lbCA9IEhpZGRlbjt9CisJOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvRmFzdFNpbXBsZUV4cHJlc3Npb25MZXhlckhlbHBlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0Zhc3RTaW1wbGVFeHByZXNzaW9uTGV4ZXJIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0YzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L0Zhc3RTaW1wbGVFeHByZXNzaW9uTGV4ZXJIZWxwZXIuY3MKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvRmFzdFNpbXBsZUV4cHJlc3Npb25QYXJzZXJIZWxwZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9GYXN0U2ltcGxlRXhwcmVzc2lvblBhcnNlckhlbHBlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRjMjYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvRmFzdFNpbXBsZUV4cHJlc3Npb25QYXJzZXJIZWxwZXIuY3MKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvSmF2YUNvbXBhdC9FeHByLmczIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvSmF2YUNvbXBhdC9FeHByLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTdjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9KYXZhQ29tcGF0L0V4cHIuZzMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworZ3JhbW1hciBFeHByOworCisvKgorCUkgaGFkIHRvIG1ha2UgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRvIHRoZSBiYXNpYyBFeHByIGdyYW1tYXIgdG8gbWFrZSBpdCB3b3JrIHdpdGggdGhlIENTaGFycDMgdGFyZ2V0IGluICJKYXZhIGNvbXBhdGliaWxpdHkgbW9kZSIuCisJRm9yIHJlZmVyZW5jZSwgc2VlIGh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvRXhwcmVzc2lvbitldmFsdWF0b3IuCisKKwlBZGQgYW4gb3B0aW9ucyBzZWN0aW9uIHRvIHNldCB0aGUgbGFuZ3VhZ2UgdG8gQ1NoYXJwMy4KKworCUluIHRoZSBAaGVhZGVyIHNlY3Rpb24sIGFkZDoKKwkJLy8gJ21lbWJlcicgaXMgb2Jzb2xldGUKKwkJI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyCisJCXVzaW5nIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnM7CisKKwlJbiB0aGUgQGhlYWRlciBzZWN0aW9uLCByZXBsYWNlOgorCQkJaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCQl3aXRoOgorCQkJdXNpbmcgSGFzaE1hcCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnk8b2JqZWN0LG9iamVjdD47CisKKwlDaGFuZ2UgYWxsIGluc3RhbmNlcyBvZiAiU3lzdGVtLm91dCIgd2l0aCAiSlN5c3RlbS5Ab3V0Ii4KKworCUNoYW5nZSBhbGwgaW5zdGFuY2VzIG9mICJTeXN0ZW0uZXJyIiB3aXRoICJKU3lzdGVtLmVyciIuCisJCisJQ2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgInNraXAoKSIgd2l0aCAiU2tpcCgpIi4KKyAqLworCitvcHRpb25zCit7CisJbGFuZ3VhZ2U9Q1NoYXJwMzsKK30KKworQGhlYWRlciB7CisvLyAnbWVtYmVyJyBpcyBvYnNvbGV0ZQorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgNjEyCisKK3VzaW5nIEFudGxyLlJ1bnRpbWUuSmF2YUV4dGVuc2lvbnM7Cit1c2luZyBIYXNoTWFwID0gU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeTxvYmplY3Qsb2JqZWN0PjsKK3VzaW5nIEludGVnZXIgPSBqYXZhLmxhbmcuSW50ZWdlcjsKK30KKworQG1lbWJlcnMgeworLyoqIE1hcCB2YXJpYWJsZSBuYW1lIHRvIEludGVnZXIgb2JqZWN0IGhvbGRpbmcgdmFsdWUgKi8KK0hhc2hNYXAgbWVtb3J5ID0gbmV3IEhhc2hNYXAoKTsKK30KKworcHJvZzogICBzdGF0KyA7CisKK3N0YXQ6ICAgZXhwciBORVdMSU5FIHtKU3lzdGVtLkBvdXQucHJpbnRsbigkZXhwci52YWx1ZSk7fQorICAgIHwgICBJRCAnPScgZXhwciBORVdMSU5FCisgICAgICAgIHttZW1vcnkucHV0KCRJRC50ZXh0LCBuZXcgSW50ZWdlcigkZXhwci52YWx1ZSkpO30KKyAgICB8ICAgTkVXTElORQorICAgIDsKKworZXhwciByZXR1cm5zIFtpbnQgdmFsdWVdCisgICAgOiAgIGU9bXVsdEV4cHIgeyR2YWx1ZSA9ICRlLnZhbHVlO30KKyAgICAgICAgKCAgICcrJyBlPW11bHRFeHByIHskdmFsdWUgKz0gJGUudmFsdWU7fQorICAgICAgICB8ICAgJy0nIGU9bXVsdEV4cHIgeyR2YWx1ZSAtPSAkZS52YWx1ZTt9CisgICAgICAgICkqCisgICAgOworCittdWx0RXhwciByZXR1cm5zIFtpbnQgdmFsdWVdCisgICAgOiAgIGU9YXRvbSB7JHZhbHVlID0gJGUudmFsdWU7fSAoJyonIGU9YXRvbSB7JHZhbHVlICo9ICRlLnZhbHVlO30pKgorICAgIDsgCisKK2F0b20gcmV0dXJucyBbaW50IHZhbHVlXQorICAgIDogICBJTlQgeyR2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoJElOVC50ZXh0KTt9CisgICAgfCAgIElECisgICAgICAgIHsKKyAgICAgICAgSW50ZWdlciB2ID0gKEludGVnZXIpbWVtb3J5LmdldCgkSUQudGV4dCk7CisgICAgICAgIGlmICggdiE9bnVsbCApICR2YWx1ZSA9IHYuaW50VmFsdWUoKTsKKyAgICAgICAgZWxzZSBKU3lzdGVtLmVyci5wcmludGxuKCJ1bmRlZmluZWQgdmFyaWFibGUgIiskSUQudGV4dCk7CisgICAgICAgIH0KKyAgICB8ICAgJygnIGV4cHIgJyknIHskdmFsdWUgPSAkZXhwci52YWx1ZTt9CisgICAgOworCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJykrIDsKK0lOVCA6ICAgJzAnLi4nOScrIDsKK05FV0xJTkU6J1xyJz8gJ1xuJyA7CitXUyAgOiAgICgnICd8J1x0JykrIHtTa2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjE5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDcwIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCAiQW50bHIzLlJ1bnRpbWUuVGVzdCIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbiggIiIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCAiIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoICJQaXhlbCBNaW5lLCBJbmMuIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoICJBbnRscjMuUnVudGltZS5UZXN0IiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIFNhbSBIYXJ3ZWxsIDIwMTEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoICIiICldCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSggIiIgKV0KK1thc3NlbWJseTogQ0xTQ29tcGxpYW50KCB0cnVlICldCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZSAKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20gCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoIGZhbHNlICldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorW2Fzc2VtYmx5OiBHdWlkKCAiMTM1MmIxNWItZWRlZC00MzgwLTkxMjItYWNkZTMyZjdmZjM4IiApXQorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiBmb3VyIHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICoKKyAqICAgTWFqb3IuTWlub3IuQnVpbGQuUmV2aXNpb24KKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmc6CisgKiAgIDEuIE1ham9yLk1pbm9yIGZvbGxvd3MgdGhlIEFOVExSIHJlbGVhc2Ugc2NoZWR1bGUKKyAqICAgMi4gQnVpbGQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBDIyBwb3J0IGlzIHBhY2thZ2VkIGZvciByZWxlYXNlIChyZWdhcmRsZXNzCisgKiAgICAgIG9mIHdoZXRoZXIgaXQncyBhbiBpbmNyZW1lbnRhbCBvciBuaWdodGx5KS4gVGhlIHZhbHVlIHJlc2V0cyB0byB6ZXJvIHdoZW5ldmVyCisgKiAgICAgIHRoZSBNYWpvciBvciBNaW5vciB2ZXJzaW9uIGlzIGluY3JlbWVudGVkLgorICogICAzLiBSZXZpc2lvbiBpcyB0aGUgUGVyZm9yY2UgY2hhbmdlbGlzdCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNlLgorICovCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMy4zLjIuODA5OCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIzLjMuMi44MDk4IildCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NlbWFudGljUHJlZGljYXRlUmVkdWN0aW9uLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTMwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMwpAQCAtMCwwICsxLDIzIEBACivvu79ncmFtbWFyIFNlbWFudGljUHJlZGljYXRlUmVkdWN0aW9uOworCitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1DU2hhcnAzOworICAgIFRva2VuTGFiZWxUeXBlPUNvbW1vblRva2VuOworfQorCitAbGV4ZXI6Om5hbWVzcGFjZXtBbnRscjMuUnVudGltZS5UZXN0fQorQHBhcnNlcjo6bmFtZXNwYWNle0FudGxyMy5SdW50aW1lLlRlc3R9CisKK3N0YXJ0IDogbWFpbnByb2cgb3B0aW9uYWw/IEVPRjsKKworbWFpbnByb2cgOiAnKCcgYXJncyAnKSc7CithcmdzIDogSUQgSUQqOworCitvcHRpb25hbDogJzonICBhcmdzIGVsZW1lbnQgJzonIGFyZ3MgZWxlbWVudDI7CitlbGVtZW50IDoge3RydWV9Pz0+YXJnczI7CitlbGVtZW50Mjoge2ZhbHNlfT89PmFyZ3MzOworYXJnczIgOiBJRCBJRCo7CithcmdzMyA6IElEIElEKiA7CisKK1dTICA6ICgnICd8J1x0J3wnXG4nfCdccicpKzsKK0lEICA6ICgnYScuLid6JykrOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2VtYW50aWNQcmVkaWNhdGVSZWR1Y3Rpb24uZzMubGV4ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMy5sZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGUzN2YzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2VtYW50aWNQcmVkaWNhdGVSZWR1Y3Rpb24uZzMubGV4ZXIuY3MKQEAgLTAsMCArMSw2IEBACivvu79uYW1lc3BhY2UgQW50bHIzLlJ1bnRpbWUuVGVzdAoreworICAgIHBhcnRpYWwgY2xhc3MgU2VtYW50aWNQcmVkaWNhdGVSZWR1Y3Rpb25MZXhlcgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMy5wYXJzZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvbi5nMy5wYXJzZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNTQyYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NlbWFudGljUHJlZGljYXRlUmVkdWN0aW9uLmczLnBhcnNlci5jcwpAQCAtMCwwICsxLDYgQEAKK++7v25hbWVzcGFjZSBBbnRscjMuUnVudGltZS5UZXN0Cit7CisgICAgcGFydGlhbCBjbGFzcyBTZW1hbnRpY1ByZWRpY2F0ZVJlZHVjdGlvblBhcnNlcgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TaW1wbGVFeHByZXNzaW9uLmczIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2ltcGxlRXhwcmVzc2lvbi5nMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWViMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2ltcGxlRXhwcmVzc2lvbi5nMwpAQCAtMCwwICsxLDgzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2dyYW1tYXIgU2ltcGxlRXhwcmVzc2lvbjsKKworb3B0aW9ucworeworCWxhbmd1YWdlPUNTaGFycDM7CisJb3V0cHV0PUFTVDsKKwlBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KKworcHVibGljCitleHByZXNzaW9uCisJOglhZGRpdGl2ZV9leHByZXNzaW9uCisJCUVPRgorCTsKKworYWRkaXRpdmVfZXhwcmVzc2lvbgorCToJbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbgorCQkoCSgnKydeIHwgJy0nXikKKwkJCW11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKwkJKSoKKwk7CisKK211bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24KKwk6CWF0b20KKwkJKAkoJyonXiB8ICcvJ14gfCAnJSdeKQorCQkJYXRvbQorCQkpKgorCTsKKworYXRvbQorCToJSURFTlRJRklFUgorCXwJTlVNQkVSCisJOworCisvLworLy8gTEVYRVIKKy8vCisKK0lERU5USUZJRVIKKwk6CSgnYScuLid6JyB8ICdBJy4uJ1onIHwgJ18nKQorCQkoJ2EnLi4neicgfCAnQScuLidaJyB8ICdfJyB8ICcwJy4uJzknKSoKKwk7CisKK05VTUJFUgorCToJJzAnLi4nOScrCisJOworCitXUworCToJKCcgJyB8ICdcdCcgfCAnXG4nIHwgJ1xyJyB8ICdcZicpCisJCXskY2hhbm5lbCA9IEhpZGRlbjt9CisJOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2ltcGxlRXhwcmVzc2lvbkxleGVySGVscGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2ltcGxlRXhwcmVzc2lvbkxleGVySGVscGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGMyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TaW1wbGVFeHByZXNzaW9uTGV4ZXJIZWxwZXIuY3MKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2ltcGxlRXhwcmVzc2lvblBhcnNlckhlbHBlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NpbXBsZUV4cHJlc3Npb25QYXJzZXJIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0YzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NpbXBsZUV4cHJlc3Npb25QYXJzZXJIZWxwZXIuY3MKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0ICJhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL0lUb2tlblNvdXJjZVwxNDAxLmNzIiAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9JVG9rZW5Tb3VyY2VcMTQwMS5jcyIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5YzA1ZgotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9JVG9rZW5Tb3VyY2VcMTQwMS5jcyIKQEAgLTAsMCArMSw0MSBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRva2VuU291cmNlPFQ+CisgICAgICAgIDogSVRva2VuU291cmNlCisgICAgICAgIHdoZXJlIFQgOiBJVG9rZW4KKyAgICB7CisgICAgICAgIG5ldyBUIE5leHRUb2tlbigpOworICAgIH0KK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9JVG9rZW5TdHJlYW1cMTQwMS5jcyIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2xpbVBhcnNpbmcvSVRva2VuU3RyZWFtXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmFjYTYKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2xpbVBhcnNpbmcvSVRva2VuU3RyZWFtXDE0MDEuY3MiCkBAIC0wLDAgKzEsNDYgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgcHVibGljIGludGVyZmFjZSBJVG9rZW5TdHJlYW08VD4KKyAgICAgICAgd2hlcmUgVCA6IElUb2tlbgorICAgIHsKKyAgICAgICAgVCBMVChpbnQgayk7CisKKyAgICAgICAgVCBHZXQoaW50IGkpOworCisgICAgICAgIElUb2tlblNvdXJjZTxUPiBUb2tlblNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9TbGltTGV4ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9TbGltTGV4ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZWM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1NsaW1MZXhlci5jcwpAQCAtMCwwICsxLDQ0NSBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFNsaW1MZXhlcgorICAgICAgICA6IEJhc2VSZWNvZ25pemVyCisgICAgICAgICwgSVRva2VuU291cmNlPFNsaW1Ub2tlbj4KKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGVyZSBpcyB0aGUgbGV4ZXIgZHJhd2luZyBjaGFyYWN0ZXJzIGZyb20/PC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgU2xpbVN0cmluZ1N0cmVhbSBpbnB1dDsKKyAgICAgICAgU2xpbVRva2VuIF90b2tlbjsKKyAgICAgICAgYm9vbCBfZW1pdHRlZDsKKyAgICAgICAgYm9vbCBfc2tpcDsKKworICAgICAgICBwdWJsaWMgU2xpbUxleGVyKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNsaW1MZXhlciggSUNoYXJTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gKFNsaW1TdHJpbmdTdHJlYW0paW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2xpbUxleGVyKCBJQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKyAgICAgICAgICAgIDogYmFzZSggc3RhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gKFNsaW1TdHJpbmdTdHJlYW0paW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiA8c3VtbWFyeT5SZXR1cm4gdGhlIHRleHQgbWF0Y2hlZCBzbyBmYXIgZm9yIHRoZSBjdXJyZW50IHRva2VuIG9yIGFueSB0ZXh0IG92ZXJyaWRlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3RhdGUudGV4dCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50ZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU3Vic3RyaW5nKCBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LCBDaGFySW5kZXggLSBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogPHN1bW1hcnk+U2V0IHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgdG9rZW47IGl0IHdpcGVzIGFueSBwcmV2aW91cyBjaGFuZ2VzIHRvIHRoZSB0ZXh0Ljwvc3VtbWFyeT4gKi8KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLnRleHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IExpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBDaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0LkNoYXJQb3NpdGlvbkluTGluZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuUmVzZXQoKTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgICAgICAgICAvLyB3YWNrIExleGVyIHN0YXRlIHZhcmlhYmxlcworICAgICAgICAgICAgaWYgKCBpbnB1dCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5TZWVrKCAwICk7IC8vIHJld2luZCB0aGUgaW5wdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzaGFyZWQgc3RhdGUgd29yayB0byBkbworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3Rva2VuID0gZGVmYXVsdCggU2xpbVRva2VuICk7CisgICAgICAgICAgICBfZW1pdHRlZCA9IGZhbHNlOworICAgICAgICAgICAgX3NraXAgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vc3RhdGUudG9rZW4gPSBudWxsOworICAgICAgICAgICAgc3RhdGUudHlwZSA9IFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisjaWYgVFJBQ0tfUE9TSVRJT04KKyAgICAgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSAtMTsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuU3RhcnRMaW5lID0gLTE7CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRlLnRleHQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldHVybiBhIHRva2VuIGZyb20gdGhpcyBzb3VyY2U7IGkuZS4sIG1hdGNoIGEgdG9rZW4gb24gdGhlIGNoYXIgc3RyZWFtLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgU2xpbVRva2VuIE5leHRUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3Rva2VuID0gZGVmYXVsdCggU2xpbVRva2VuICk7CisgICAgICAgICAgICAgICAgX2VtaXR0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBfc2tpcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vc3RhdGUudG9rZW4gPSBudWxsOworICAgICAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LkluZGV4OworI2lmIFRSQUNLX1BPU0lUSU9OCisgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LkxpbmU7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzdGF0ZS50ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKCAxICkgPT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTbGltVG9rZW4oVG9rZW5UeXBlcy5FbmRPZkZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1Ub2tlbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfc2tpcCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAhX2VtaXR0ZWQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2VuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXBvcnRFcnJvciggbnZhICk7CisgICAgICAgICAgICAgICAgICAgIFJlY292ZXIoIG52YSApOyAvLyB0aHJvdyBvdXQgY3VycmVudCBjaGFyIGFuZCB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXBvcnRFcnJvciggcmUgKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2goKSByb3V0aW5lIGhhcyBhbHJlYWR5IGNhbGxlZCByZWNvdmVyKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSVRva2VuIElUb2tlblNvdXJjZS5OZXh0VG9rZW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTmV4dFRva2VuKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJbnN0cnVjdCB0aGUgbGV4ZXIgdG8gc2tpcCBjcmVhdGluZyBhIHRva2VuIGZvciBjdXJyZW50IGxleGVyIHJ1bGUKKyAgICAgICAgICogIGFuZCBsb29rIGZvciBhbm90aGVyIHRva2VuLiAgbmV4dFRva2VuKCkga25vd3MgdG8ga2VlcCBsb29raW5nIHdoZW4KKyAgICAgICAgICogIGEgbGV4ZXIgcnVsZSBmaW5pc2hlcyB3aXRoIHRva2VuIHNldCB0byBTS0lQX1RPS0VOLiAgUmVjYWxsIHRoYXQKKyAgICAgICAgICogIGlmIHRva2VuPT1udWxsIGF0IGVuZCBvZiBhbnkgdG9rZW4gcnVsZSwgaXQgY3JlYXRlcyBvbmUgZm9yIHlvdQorICAgICAgICAgKiAgYW5kIGVtaXRzIGl0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTa2lwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3NraXAgPSB0cnVlOworICAgICAgICAgICAgLy9zdGF0ZS50b2tlbiA9IFRva2Vucy5Ta2lwOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoaXMgaXMgdGhlIGxleGVyIGVudHJ5IHBvaW50IHRoYXQgc2V0cyBpbnN0YW5jZSB2YXIgJ3Rva2VuJzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbVRva2VucygpOworCisgICAgICAgIHB1YmxpYyBJQ2hhclN0cmVhbSBDaGFyU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgdGhlIGNoYXIgc3RyZWFtIGFuZCByZXNldCB0aGUgbGV4ZXI8L3N1bW1hcnk+ICovCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGw7CisgICAgICAgICAgICAgICAgUmVzZXQoKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IChTbGltU3RyaW5nU3RyZWFtKXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vKiogPHN1bW1hcnk+CisgICAgICAgIC8vICogIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGVtaXRzIHBlciBuZXh0VG9rZW4gaW52b2NhdGlvbgorICAgICAgICAvLyAqICBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAgU3ViY2xhc3MgYW5kIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAorICAgICAgICAvLyAqICBuZXh0VG9rZW4gKHRvIHB1c2ggdG9rZW5zIGludG8gYSBsaXN0IGFuZCBwdWxsIGZyb20gdGhhdCBsaXN0IHJhdGhlcgorICAgICAgICAvLyAqICB0aGFuIGEgc2luZ2xlIHZhcmlhYmxlIGFzIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcykuCisgICAgICAgIC8vICogIDwvc3VtbWFyeT4KKyAgICAgICAgLy8gKi8KKyAgICAgICAgLy9wdWJsaWMgdm9pZCBFbWl0KCBUIHRva2VuICkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIF90b2tlbiA9IHRva2VuOworICAgICAgICAvL30KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgc3RhbmRhcmQgbWV0aG9kIGNhbGxlZCB0byBhdXRvbWF0aWNhbGx5IGVtaXQgYSB0b2tlbiBhdCB0aGUKKyAgICAgICAgICogIG91dGVybW9zdCBsZXhpY2FsIHJ1bGUuICBUaGUgdG9rZW4gb2JqZWN0IHNob3VsZCBwb2ludCBpbnRvIHRoZQorICAgICAgICAgKiAgY2hhciBidWZmZXIgc3RhcnQuLnN0b3AuICBJZiB0aGVyZSBpcyBhIHRleHQgb3ZlcnJpZGUgaW4gJ3RleHQnLAorICAgICAgICAgKiAgdXNlIHRoYXQgdG8gc2V0IHRoZSB0b2tlbidzIHRleHQuICBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlbWl0CisgICAgICAgICAqICBjdXN0b20gVG9rZW4gb2JqZWN0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IGFyZSBidWlsZGluZyB0cmVlcywgdGhlbiB5b3Ugc2hvdWxkIGFsc28gb3ZlcnJpZGUKKyAgICAgICAgICogIFBhcnNlciBvciBUcmVlUGFyc2VyLmdldE1pc3NpbmdTeW1ib2woKS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIEVtaXQoKQorICAgICAgICB7CisgICAgICAgICAgICBfdG9rZW4gPSBuZXcgU2xpbVRva2VuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0lucHV0U3RyZWFtID0gaW5wdXQsCisgICAgICAgICAgICAgICAgVHlwZSA9IHN0YXRlLnR5cGUsCisgICAgICAgICAgICAgICAgQ2hhbm5lbCA9IHN0YXRlLmNoYW5uZWwsCisgICAgICAgICAgICAgICAgLy9DaGFyUG9zaXRpb25JbkxpbmUgPSBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lLAorICAgICAgICAgICAgICAgIC8vTGluZSA9IHN0YXRlLnRva2VuU3RhcnRMaW5lLAorICAgICAgICAgICAgICAgIC8vVGV4dCA9IHN0YXRlLnRleHQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvL0VtaXQoIHQgKTsKKyAgICAgICAgICAgIC8vcmV0dXJuIHQ7CisKKyAgICAgICAgICAgIC8vSVRva2VuIHQgPSBuZXcgQ29tbW9uVG9rZW4oIGlucHV0LCBzdGF0ZS50eXBlLCBzdGF0ZS5jaGFubmVsLCBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LCBDaGFySW5kZXggLSAxICk7CisgICAgICAgICAgICAvL3QuTGluZSA9IHN0YXRlLnRva2VuU3RhcnRMaW5lOworICAgICAgICAgICAgLy90LlRleHQgPSBzdGF0ZS50ZXh0OworICAgICAgICAgICAgLy90LkNoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAvL0VtaXQoIHQgKTsKKyAgICAgICAgICAgIC8vcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaCggc3RyaW5nIHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoIGkgPCBzLkxlbmd0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSggMSApICE9IHNbaV0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbXRlID0gbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzW2ldLCBpbnB1dCwgVG9rZW5OYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIFJlY292ZXIoIG10ZSApOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBtdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaEFueSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIE1hdGNoKCBpbnQgYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoIDEgKSAhPSBjICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbXRlID0gbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihjLCBpbnB1dCwgVG9rZW5OYW1lcyk7CisgICAgICAgICAgICAgICAgUmVjb3ZlciggbXRlICk7ICAvLyBkb24ndCByZWFsbHkgcmVjb3ZlcjsganVzdCBjb25zdW1lIGluIGxleGVyCisgICAgICAgICAgICAgICAgdGhyb3cgbXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBNYXRjaFJhbmdlKCBpbnQgYSwgaW50IGIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKCAxICkgPCBhIHx8IGlucHV0LkxBKCAxICkgPiBiICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gbXJlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiggYSwgYiwgaW5wdXQgKTsKKyAgICAgICAgICAgICAgICBSZWNvdmVyKCBtcmUgKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgb2YgbG9va2FoZWFkPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCBDaGFySW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVwb3J0RXJyb3IoIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiogVE9ETzogbm90IHRob3VnaHQgYWJvdXQgcmVjb3ZlcnkgaW4gbGV4ZXIgeWV0LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgcmVwb3J0ZWQgYW4gZXJyb3IgYW5kIGhhdmUgbm90IG1hdGNoZWQgYSB0b2tlbgorICAgICAgICAgICAgLy8geWV0IHN1Y2Nlc3NmdWxseSwgZG9uJ3QgcmVwb3J0IGFueSBlcnJvcnMuCisgICAgICAgICAgICBpZiAoIGVycm9yUmVjb3ZlcnkgKSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50KCJbU1BVUklPVVNdICIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yUmVjb3ZlcnkgPSB0cnVlOworICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKCB0aGlzLlRva2VuTmFtZXMsIGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0RXJyb3JNZXNzYWdlKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlLCBzdHJpbmdbXSB0b2tlbk5hbWVzICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGUgaXMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbXRlID0gKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiICsgR2V0Q2hhckVycm9yRGlzcGxheSggZS5DaGFyYWN0ZXIgKSArICIgZXhwZWN0aW5nICIgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KCBtdGUuRXhwZWN0aW5nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9IChOb1ZpYWJsZUFsdEV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiZGVjaXNpb249PDwiK252YWUuZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIj4+IgorICAgICAgICAgICAgICAgIC8vIGFuZCAiKGRlY2lzaW9uPSIrbnZhZS5kZWNpc2lvbk51bWJlcisiKSBhbmQKKyAgICAgICAgICAgICAgICAvLyAic3RhdGUgIitudmFlLnN0YXRlTnVtYmVyCisgICAgICAgICAgICAgICAgbXNnID0gIm5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoIGUuQ2hhcmFjdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBFYXJseUV4aXRFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPSAoRWFybHlFeGl0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICIoZGVjaXNpb249IitlZWUuZGVjaXNpb25OdW1iZXIrIikiCisgICAgICAgICAgICAgICAgbXNnID0gInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgY2hhcmFjdGVyICIgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KCBlLkNoYXJhY3RlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGUgaXMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiBtc2UgPSAoTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiICsgR2V0Q2hhckVycm9yRGlzcGxheSggZS5DaGFyYWN0ZXIgKSArICIgZXhwZWN0aW5nIHNldCAiICsgbXNlLkV4cGVjdGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlIGlzIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gKE1pc21hdGNoZWRTZXRFeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoIGUuQ2hhcmFjdGVyICkgKyAiIGV4cGVjdGluZyBzZXQgIiArIG1zZS5FeHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiBtcmUgPSAoTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KCBlLkNoYXJhY3RlciApICsgIiBleHBlY3Rpbmcgc2V0ICIgKworICAgICAgICAgICAgICAgICAgICAgIEdldENoYXJFcnJvckRpc3BsYXkoIG1yZS5BICkgKyAiLi4iICsgR2V0Q2hhckVycm9yRGlzcGxheSggbXJlLkIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBiYXNlLkdldEVycm9yTWVzc2FnZSggZSwgdG9rZW5OYW1lcyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRDaGFyRXJyb3JEaXNwbGF5KCBpbnQgYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzID0gKCAoY2hhciljICkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoIGMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUb2tlblR5cGVzLkVuZE9mRmlsZToKKyAgICAgICAgICAgICAgICBzID0gIjxFT0Y+IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBzID0gIlxcbiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgcyA9ICJcXHQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgIHMgPSAiXFxyIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiJyIgKyBzICsgIiciOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTGV4ZXJzIGNhbiBub3JtYWxseSBtYXRjaCBhbnkgY2hhciBpbiBpdCdzIHZvY2FidWxhcnkgYWZ0ZXIgbWF0Y2hpbmcKKyAgICAgICAgICogIGEgdG9rZW4sIHNvIGRvIHRoZSBlYXN5IHRoaW5nIGFuZCBqdXN0IGtpbGwgYSBjaGFyYWN0ZXIgYW5kIGhvcGUKKyAgICAgICAgICogIGl0IGFsbCB3b3JrcyBvdXQuICBZb3UgY2FuIGluc3RlYWQgdXNlIHRoZSBydWxlIGludm9jYXRpb24gc3RhY2sKKyAgICAgICAgICogIHRvIGRvIHNvcGhpc3RpY2F0ZWQgZXJyb3IgcmVjb3ZlcnkgaWYgeW91IGFyZSBpbiBhIGZyYWdtZW50IHJ1bGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlY292ZXIoIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWluZyBjaGFyICIrKGNoYXIpaW5wdXQuTEEoMSkrIiBkdXJpbmcgcmVjb3ZlcnkiKTsKKyAgICAgICAgICAgIC8vcmUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlSW4oIHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBpbnB1dFN5bWJvbCA9ICggKGNoYXIpaW5wdXQuTFQoIDEgKSApICsgIiBsaW5lPSIgKyBMaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgYmFzZS5UcmFjZUluKCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFjZU91dCggc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGlucHV0U3ltYm9sID0gKCAoY2hhcilpbnB1dC5MVCggMSApICkgKyAiIGxpbmU9IiArIExpbmUgKyAiOiIgKyBDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICBiYXNlLlRyYWNlT3V0KCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2xpbVBhcnNpbmcvU2xpbVN0cmluZ1N0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1NsaW1TdHJpbmdTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNWQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1NsaW1TdHJpbmdTdHJlYW0uY3MKQEAgLTAsMCArMSwzMzQgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLy8gI2RlZmluZSBUUkFDS19QT1NJVElPTgorCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIHByZXR0eSBxdWljayBDaGFyU3RyZWFtIHRoYXQgcHVsbHMgYWxsIGRhdGEgZnJvbSBhbiBhcnJheQorICAgICAqICBkaXJlY3RseS4gIEV2ZXJ5IG1ldGhvZCBjYWxsIGNvdW50cyBpbiB0aGUgbGV4ZXIuICBKYXZhJ3MKKyAgICAgKiAgc3RyaW5ncyBhcmVuJ3QgdmVyeSBnb29kIHNvIEknbSBhdm9pZGluZy4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBTbGltU3RyaW5nU3RyZWFtIDogSUNoYXJTdHJlYW0KKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgZGF0YSBiZWluZyBzY2FubmVkPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIGRhdGE7CisgICAgICAgIC8vcHJvdGVjdGVkIGNoYXJbXSBkYXRhOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Ib3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSBpbiB0aGUgYnVmZmVyPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IG47CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PjAuLm4tMSBpbmRleCBpbnRvIHN0cmluZyBvZiBuZXh0IGNoYXI8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgcCA9IDA7CisKKyNpZiBUUkFDS19QT1NJVElPTgorICAgICAgICAvKiogPHN1bW1hcnk+bGluZSBudW1iZXIgMS4ubiB3aXRoaW4gdGhlIGlucHV0PC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGxpbmUgPSAxOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIDAuLm4tMTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBjaGFyUG9zaXRpb25JbkxpbmUgPSAwOworI2VuZGlmCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PnRyYWNrcyBob3cgZGVlcCBtYXJrKCkgY2FsbHMgYXJlIG5lc3RlZDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBtYXJrRGVwdGggPSAwOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEEgbGlzdCBvZiBDaGFyU3RyZWFtU3RhdGUgb2JqZWN0cyB0aGF0IHRyYWNrcyB0aGUgc3RyZWFtIHN0YXRlCisgICAgICAgICAqICB2YWx1ZXMgbGluZSwgY2hhclBvc2l0aW9uSW5MaW5lLCBhbmQgcCB0aGF0IGNhbiBjaGFuZ2UgYXMgeW91CisgICAgICAgICAqICBtb3ZlIHRocm91Z2ggdGhlIGlucHV0IHN0cmVhbS4gIEluZGV4ZWQgZnJvbSAxLi5tYXJrRGVwdGguCisgICAgICAgICAqICBBIG51bGwgaXMga2VwdCBAIGluZGV4IDAuICBDcmVhdGUgdXBvbiBmaXJzdCBjYWxsIHRvIG1hcmsoKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBJTGlzdDxDaGFyU3RyZWFtU3RhdGU+IG1hcmtlcnM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBsYXN0TWFya2VyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGlzIG5hbWUgb3Igc291cmNlIG9mIHRoaXMgY2hhciBzdHJlYW0/PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgc3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIFNsaW1TdHJpbmdTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29weSBkYXRhIGluIHN0cmluZyB0byBhIGxvY2FsIGNoYXIgYXJyYXk8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBTbGltU3RyaW5nU3RyZWFtKCBzdHJpbmcgaW5wdXQgKQorICAgICAgICAgICAgOiB0aGlzKCBpbnB1dCwgbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbGltU3RyaW5nU3RyZWFtKCBzdHJpbmcgaW5wdXQsIHN0cmluZyBzb3VyY2VOYW1lICkKKyAgICAgICAgICAgIDogdGhpcyggaW5wdXQuVG9DaGFyQXJyYXkoKSwgaW5wdXQuTGVuZ3RoLCBzb3VyY2VOYW1lICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoaXMgaXMgdGhlIHByZWZlcnJlZCBjb25zdHJ1Y3RvciBhcyBubyBkYXRhIGlzIGNvcGllZDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFNsaW1TdHJpbmdTdHJlYW0oIGNoYXJbXSBkYXRhLCBpbnQgbnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXkgKQorICAgICAgICAgICAgOiB0aGlzKCBkYXRhLCBudW1iZXJPZkFjdHVhbENoYXJzSW5BcnJheSwgbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbGltU3RyaW5nU3RyZWFtKCBjaGFyW10gZGF0YSwgaW50IG51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5LCBzdHJpbmcgc291cmNlTmFtZSApCisgICAgICAgICAgICA6IHRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICAvL3RoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgc3RyaW5nKCBkYXRhICk7CisgICAgICAgICAgICB0aGlzLm4gPSBudW1iZXJPZkFjdHVhbENoYXJzSW5BcnJheTsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IHNvdXJjZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGluZGV4IDAuLm4gd2hlcmUgbiBpbmRpY2F0ZXMgdGhlCisgICAgICAgICAqICBsYXN0IHN5bWJvbCBoYXMgYmVlbiByZWFkLiAgVGhlIGluZGV4IGlzIHRoZSBpbmRleCBvZiBjaGFyIHRvCisgICAgICAgICAqICBiZSByZXR1cm5lZCBmcm9tIExBKDEpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIFRSQUNLX1BPU0lUSU9OCisgICAgICAgIHB1YmxpYyBpbnQgTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IENoYXJQb3NpdGlvbkluTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHB1YmxpYyBpbnQgTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IENoYXJQb3NpdGlvbkluTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVzZXQgdGhlIHN0cmVhbSBzbyB0aGF0IGl0J3MgaW4gdGhlIHNhbWUgc3RhdGUgaXQgd2FzCisgICAgICAgICAqICB3aGVuIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgKmV4Y2VwdCogdGhlIGRhdGEgYXJyYXkgaXMgbm90CisgICAgICAgICAqICB0b3VjaGVkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gMDsKKyNpZiBUUkFDS19QT1NJVElPTgorICAgICAgICAgICAgbGluZSA9IDE7CisgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSAwOworI2VuZGlmCisgICAgICAgICAgICBtYXJrRGVwdGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJwcmV2IHA9IitwKyIsIGM9IisoY2hhcilkYXRhW3BdKTsKKyAgICAgICAgICAgIGlmICggcCA8IG4gKQorICAgICAgICAgICAgeworI2lmIFRSQUNLX1BPU0lUSU9OCisgICAgICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lKys7CisgICAgICAgICAgICAgICAgaWYgKCBkYXRhW3BdID09ICdcbicgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXdsaW5lIGNoYXIgZm91bmQgb24gbGluZTogIitsaW5lKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAgcG9zPSIrY2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbGluZSsrOworICAgICAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSAwOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicCBtb3ZlcyB0byAiK3ArIiAoYz0nIisoY2hhcilkYXRhW3BdKyInKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBMQSggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGkgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIHVuZGVmaW5lZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSsrOyAvLyBlLmcuLCB0cmFuc2xhdGUgTEEoLTEpIHRvIHVzZSBvZmZzZXQgaT0wOyB0aGVuIGRhdGFbcCswLTFdCisgICAgICAgICAgICAgICAgaWYgKCAoIHAgKyBpIC0gMSApIDwgMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGU7IC8vIGludmFsaWQ7IG5vIGNoYXIgYmVmb3JlIGZpcnN0IGNoYXIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggKCBwICsgaSAtIDEgKSA+PSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2hhciBMQSgiK2krIik9RU9GOyBwPSIrcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNoYXIgTEEoIitpKyIpPSIrKGNoYXIpZGF0YVtwK2ktMV0rIjsgcD0iK3ApOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxBKCIraSsiKTsgcD0iK3ArIiBuPSIrbisiIGRhdGEubGVuZ3RoPSIrZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIGRhdGFbcCArIGkgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgTFQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExBKCBpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBNYXJrKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBtYXJrZXJzID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcmtlcnMgPSBuZXcgTGlzdDxDaGFyU3RyZWFtU3RhdGU+KCk7CisgICAgICAgICAgICAgICAgbWFya2Vycy5BZGQoIG51bGwgKTsgLy8gZGVwdGggMCBtZWFucyBubyBiYWNrdHJhY2tpbmcsIGxlYXZlIGJsYW5rCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXJrRGVwdGgrKzsKKyAgICAgICAgICAgIENoYXJTdHJlYW1TdGF0ZSBzdGF0ZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoIG1hcmtEZXB0aCA+PSBtYXJrZXJzLkNvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBDaGFyU3RyZWFtU3RhdGUoKTsKKyAgICAgICAgICAgICAgICBtYXJrZXJzLkFkZCggc3RhdGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG1hcmtlcnNbbWFya0RlcHRoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLnAgPSBwOworI2lmIFRSQUNLX1BPU0lUSU9OCisgICAgICAgICAgICBzdGF0ZS5saW5lID0gbGluZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYXJQb3NpdGlvbkluTGluZSA9IGNoYXJQb3NpdGlvbkluTGluZTsKKyNlbmRpZgorICAgICAgICAgICAgbGFzdE1hcmtlciA9IG1hcmtEZXB0aDsKKyAgICAgICAgICAgIHJldHVybiBtYXJrRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXdpbmQoIGludCBtICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hhclN0cmVhbVN0YXRlIHN0YXRlID0gbWFya2Vyc1ttXTsKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgc3RyZWFtIHN0YXRlCisgICAgICAgICAgICBTZWVrKCBzdGF0ZS5wICk7CisjaWYgVFJBQ0tfUE9TSVRJT04KKyAgICAgICAgICAgIGxpbmUgPSBzdGF0ZS5saW5lOworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gc3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lOworI2VuZGlmCisgICAgICAgICAgICBSZWxlYXNlKCBtICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZXdpbmQoIGxhc3RNYXJrZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlbGVhc2UoIGludCBtYXJrZXIgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB1bndpbmQgYW55IG90aGVyIG1hcmtlcnMgbWFkZSBhZnRlciBtIGFuZCByZWxlYXNlIG0KKyAgICAgICAgICAgIG1hcmtEZXB0aCA9IG1hcmtlcjsKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhpcyBtYXJrZXIKKyAgICAgICAgICAgIG1hcmtEZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgY29uc3VtZSgpIGFoZWFkIHVudGlsIHA9PWluZGV4OyBjYW4ndCBqdXN0IHNldCBwPWluZGV4IGFzIHdlIG11c3QKKyAgICAgICAgICogIHVwZGF0ZSBsaW5lIGFuZCBjaGFyUG9zaXRpb25JbkxpbmUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBTZWVrKCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGluZGV4IDw9IHAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSBpbmRleDsgLy8ganVzdCBqdW1wOyBkb24ndCB1cGRhdGUgc3RyZWFtIHN0YXRlIChsaW5lLCAuLi4pCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2VlayBmb3J3YXJkLCBjb25zdW1lIHVudGlsIHAgaGl0cyBpbmRleAorICAgICAgICAgICAgd2hpbGUgKCBwIDwgaW5kZXggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnN1bWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgU3Vic3RyaW5nKCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YS5TdWJzdHJpbmcoIHN0YXJ0LCBsZW5ndGggKTsKKyAgICAgICAgICAgIC8vcmV0dXJuIG5ldyBzdHJpbmcoIGRhdGEsIHN0YXJ0LCBzdG9wIC0gc3RhcnQgKyAxICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFNvdXJjZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9TbGltVG9rZW4uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9TbGltVG9rZW4uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1MDk1OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1NsaW1Ub2tlbi5jcwpAQCAtMCwwICsxLDE2MCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtOworICAgIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworICAgIFtTdHJ1Y3RMYXlvdXQoIExheW91dEtpbmQuU2VxdWVudGlhbCwgUGFjayA9IDIgKV0KKyAgICBwdWJsaWMgc3RydWN0IFNsaW1Ub2tlbgorICAgICAgICA6IElUb2tlbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzaG9ydCBfdHlwZTsKKyAgICAgICAgcHJpdmF0ZSBzaG9ydCBfY2hhbm5lbDsKKyAgICAgICAgcHJpdmF0ZSBzaG9ydCBfc3RhcnRJbmRleDsKKyAgICAgICAgcHJpdmF0ZSBzaG9ydCBfc3RvcEluZGV4OworCisgICAgICAgIHB1YmxpYyBTbGltVG9rZW4oaW50IHR5cGUpCisgICAgICAgICAgICA6IHRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICBfdHlwZSA9IChzaG9ydCl0eXBlOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBJVG9rZW4gTWVtYmVycworCisgICAgICAgIHN0cmluZyBJVG9rZW4uVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3R5cGUgPSAoc2hvcnQpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgSVRva2VuLkxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBJVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENoYW5uZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoYW5uZWwgPSAoc2hvcnQpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFN0YXJ0SW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdGFydEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0YXJ0SW5kZXggPSAoc2hvcnQpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFN0b3BJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N0b3BJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdG9wSW5kZXggPSAoc2hvcnQpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgSVRva2VuLlRva2VuSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIElDaGFyU3RyZWFtIElUb2tlbi5JbnB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1NsaW1Ub2tlblN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1NsaW1Ub2tlblN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRhMWVkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2xpbVBhcnNpbmcvU2xpbVRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsNDM4IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBTeXN0ZW07CisgICAgdXNpbmcgU3lzdGVtLlRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgcHJldHR5IHF1aWNrIENoYXJTdHJlYW0gdGhhdCBwdWxscyBhbGwgZGF0YSBmcm9tIGFuIGFycmF5CisgICAgICogIGRpcmVjdGx5LiAgRXZlcnkgbWV0aG9kIGNhbGwgY291bnRzIGluIHRoZSBsZXhlci4gIEphdmEncworICAgICAqICBzdHJpbmdzIGFyZW4ndCB2ZXJ5IGdvb2Qgc28gSSdtIGF2b2lkaW5nLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEZhc3RUb2tlblN0cmVhbQorICAgICAgICA6IElUb2tlblN0cmVhbTxTbGltVG9rZW4+CisgICAgeworICAgICAgICBbU3lzdGVtLk5vblNlcmlhbGl6ZWRdCisgICAgICAgIElUb2tlblNvdXJjZTxTbGltVG9rZW4+IF90b2tlblNvdXJjZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZWNvcmQgZXZlcnkgc2luZ2xlIHRva2VuIHB1bGxlZCBmcm9tIHRoZSBzb3VyY2Ugc28gd2UgY2FuIHJlcHJvZHVjZQorICAgICAgICAgKiAgY2h1bmtzIG9mIGl0IGxhdGVyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8U2xpbVRva2VuPiB0b2tlbnM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNraXAgdG9rZW5zIG9uIGFueSBjaGFubmVsIGJ1dCB0aGlzIG9uZTsgdGhpcyBpcyBob3cgd2Ugc2tpcCB3aGl0ZXNwYWNlLi4uPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBsYXN0TWFya2VyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAgICAgKiAgdG8gY29uc3VtZSkuICBwPT0tMSBpbmRpY2F0ZXMgdGhhdCB0aGUgdG9rZW5zIGxpc3QgaXMgZW1wdHkKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgcCA9IC0xOworCisgICAgICAgIHB1YmxpYyBGYXN0VG9rZW5TdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICB0b2tlbnMgPSBuZXcgTGlzdDxTbGltVG9rZW4+KCA1MDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGYXN0VG9rZW5TdHJlYW0oIElUb2tlblNvdXJjZTxTbGltVG9rZW4+IHRva2VuU291cmNlICkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX3Rva2VuU291cmNlID0gdG9rZW5Tb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFzdFRva2VuU3RyZWFtKCBJVG9rZW5Tb3VyY2U8U2xpbVRva2VuPiB0b2tlblNvdXJjZSwgaW50IGNoYW5uZWwgKQorICAgICAgICAgICAgOiB0aGlzKCB0b2tlblNvdXJjZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJlc2V0IHRoaXMgdG9rZW4gc3RyZWFtIGJ5IHNldHRpbmcgaXRzIHRva2VuIHNvdXJjZS48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2b2lkIFNldFRva2VuU291cmNlKCBJVG9rZW5Tb3VyY2U8U2xpbVRva2VuPiB0b2tlblNvdXJjZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX3Rva2VuU291cmNlID0gdG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB0b2tlbnMuQ2xlYXIoKTsKKyAgICAgICAgICAgIHAgPSAtMTsKKyAgICAgICAgICAgIGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBMb2FkIGFsbCB0b2tlbnMgZnJvbSB0aGUgdG9rZW4gc291cmNlIGFuZCBwdXQgaW4gdG9rZW5zLgorICAgICAgICAgKiAgVGhpcyBpcyBkb25lIHVwb24gZmlyc3QgTFQgcmVxdWVzdCBiZWNhdXNlIHlvdSBtaWdodCB3YW50IHRvCisgICAgICAgICAqICBzZXQgc29tZSB0b2tlbiB0eXBlIC8gY2hhbm5lbCBvdmVycmlkZXMgYmVmb3JlIGZpbGxpbmcgYnVmZmVyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgRmlsbEJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZhc3QgcmV0dXJuIGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBmdWxsCisgICAgICAgICAgICBpZiAoIHAgIT0gLTEgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIFNsaW1Ub2tlbiB0ID0gX3Rva2VuU291cmNlLk5leHRUb2tlbigpOworICAgICAgICAgICAgd2hpbGUgKCB0LlR5cGUgIT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vdC5Ub2tlbkluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgdG9rZW5zLkFkZCggdCApOworICAgICAgICAgICAgICAgIGluZGV4Kys7CisKKyAgICAgICAgICAgICAgICB0ID0gX3Rva2VuU291cmNlLk5leHRUb2tlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbGVhdmUgcCBwb2ludGluZyBhdCBmaXJzdCB0b2tlbiBvbiBjaGFubmVsCisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgIHAgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyggcCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTW92ZSB0aGUgaW5wdXQgcG9pbnRlciB0byB0aGUgbmV4dCBpbmNvbWluZyB0b2tlbi4gIFRoZSBzdHJlYW0KKyAgICAgICAgICogIG11c3QgYmVjb21lIGFjdGl2ZSB3aXRoIExUKDEpIGF2YWlsYWJsZS4gIGNvbnN1bWUoKSBzaW1wbHkKKyAgICAgICAgICogIG1vdmVzIHRoZSBpbnB1dCBwb2ludGVyIHNvIHRoYXQgTFQoMSkgcG9pbnRzIGF0IHRoZSBuZXh0CisgICAgICAgICAqICBpbnB1dCBzeW1ib2wuIENvbnN1bWUgYXQgbGVhc3Qgb25lIHRva2VuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBXYWxrIHBhc3QgYW55IHRva2VuIG5vdCBvbiB0aGUgY2hhbm5lbCB0aGUgcGFyc2VyIGlzIGxpc3RlbmluZyB0by4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIENvbnN1bWUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHAgPCB0b2tlbnMuQ291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBwID0gU2tpcE9mZlRva2VuQ2hhbm5lbHMoIHAgKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdpdmVuIGEgc3RhcnRpbmcgaW5kZXgsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uLWNoYW5uZWwgdG9rZW4uPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IFNraXBPZmZUb2tlbkNoYW5uZWxzKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuID0gdG9rZW5zLkNvdW50OworICAgICAgICAgICAgd2hpbGUgKCBpIDwgbiAmJiB0b2tlbnNbaV0uQ2hhbm5lbCAhPSBjaGFubmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICggaSA+PSAwICYmIHRva2Vuc1tpXS5DaGFubmVsICE9IGNoYW5uZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElMaXN0PFNsaW1Ub2tlbj4gR2V0VG9rZW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElMaXN0PFNsaW1Ub2tlbj4gR2V0VG9rZW5zKCBpbnQgc3RhcnQsIGludCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldFRva2Vucyggc3RhcnQsIHN0b3AsIChCaXRTZXQpbnVsbCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gYSBzdGFydCBhbmQgc3RvcCBpbmRleCwgcmV0dXJuIGEgTGlzdCBvZiBhbGwgdG9rZW5zIGluCisgICAgICAgICAqICB0aGUgdG9rZW4gdHlwZSBCaXRTZXQuICBSZXR1cm4gbnVsbCBpZiBubyB0b2tlbnMgd2VyZSBmb3VuZC4gIFRoaXMKKyAgICAgICAgICogIG1ldGhvZCBsb29rcyBhdCBib3RoIG9uIGFuZCBvZmYgY2hhbm5lbCB0b2tlbnMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSUxpc3Q8U2xpbVRva2VuPiBHZXRUb2tlbnMoIGludCBzdGFydCwgaW50IHN0b3AsIEJpdFNldCB0eXBlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdG9wID49IHRva2Vucy5Db3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcCA9IHRva2Vucy5Db3VudCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXJ0IDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGFydCA+IHN0b3AgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsaXN0ID0gdG9rZW5zW3N0YXJ0OnN0b3BdOntUb2tlbiB0LCB0LmdldFR5cGUoKSBpbiB0eXBlc30KKyAgICAgICAgICAgIExpc3Q8U2xpbVRva2VuPiBmaWx0ZXJlZFRva2VucyA9IG5ldyBMaXN0PFNsaW1Ub2tlbj4oKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTbGltVG9rZW4gdCA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIHR5cGVzID09IG51bGwgfHwgdHlwZXMuTWVtYmVyKCB0LlR5cGUgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFRva2Vucy5BZGQoIHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGZpbHRlcmVkVG9rZW5zLkNvdW50ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkVG9rZW5zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJTGlzdDxTbGltVG9rZW4+IEdldFRva2VucyggaW50IHN0YXJ0LCBpbnQgc3RvcCwgSUxpc3Q8aW50PiB0eXBlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRUb2tlbnMoIHN0YXJ0LCBzdG9wLCBuZXcgQml0U2V0KCB0eXBlcyApICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUxpc3Q8U2xpbVRva2VuPiBHZXRUb2tlbnMoIGludCBzdGFydCwgaW50IHN0b3AsIGludCB0dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRUb2tlbnMoIHN0YXJ0LCBzdG9wLCBCaXRTZXQuT2YoIHR0eXBlICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdldCB0aGUgaXRoIHRva2VuIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gMS4ubiB3aGVyZSBrPTEgaXMgdGhlCisgICAgICAgICAqICBmaXJzdCBzeW1ib2wgb2YgbG9va2FoZWFkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNsaW1Ub2tlbiBMVCggaW50IGsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggayA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdCggU2xpbVRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGsgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoIC1rICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoIkxUKHA9IitwKyIsIitrKyIpPSIpOworICAgICAgICAgICAgaWYgKCAoIHAgKyBrIC0gMSApID49IHRva2Vucy5Db3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTbGltVG9rZW4oVG9rZW5UeXBlcy5FbmRPZkZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLmdldChwK2stMSkpOworICAgICAgICAgICAgaW50IGkgPSBwOworICAgICAgICAgICAgaW50IG4gPSAxOworICAgICAgICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zCisgICAgICAgICAgICB3aGlsZSAoIG4gPCBrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworICAgICAgICAgICAgICAgIGkgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyggaSArIDEgKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaSA+PSB0b2tlbnMuQ291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2xpbVRva2VuKFRva2VuVHlwZXMuRW5kT2ZGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0b2tlbnNbaV07CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+TG9vayBiYWNrd2FyZHMgayB0b2tlbnMgb24tY2hhbm5lbCB0b2tlbnM8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBTbGltVG9rZW4gTEIoIGludCBrICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCJMQihwPSIrcCsiLCIraysiKSAiKTsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBrID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KCBTbGltVG9rZW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggKCBwIC0gayApIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoIFNsaW1Ub2tlbiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaSA9IHA7CisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKKyAgICAgICAgICAgIHdoaWxlICggbiA8PSBrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworICAgICAgICAgICAgICAgIGkgPSBTa2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoIGkgLSAxICk7IC8vIGxlYXZlIHAgb24gdmFsaWQgdG9rZW4KKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGkgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdCggU2xpbVRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG9rZW5zW2ldOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIGFic29sdXRlIHRva2VuIGk7IGlnbm9yZSB3aGljaCBjaGFubmVsIHRoZSB0b2tlbnMgYXJlIG9uOworICAgICAgICAgKiAgdGhhdCBpcywgY291bnQgYWxsIHRva2VucyBub3QganVzdCBvbi1jaGFubmVsIHRva2Vucy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTbGltVG9rZW4gR2V0KCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbnNbaV07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IExBKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMVCggaSApLlR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IE1hcmsoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RNYXJrZXIgPSBJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBsYXN0TWFya2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgUmVsZWFzZSggaW50IG1hcmtlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIHJlc291cmNlcyB0byByZWxlYXNlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXdpbmQoIGludCBtYXJrZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBTZWVrKCBtYXJrZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJld2luZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlZWsoIGxhc3RNYXJrZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcCA9IDA7CisgICAgICAgICAgICBsYXN0TWFya2VyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFNlZWsoIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVG9rZW5Tb3VyY2U8U2xpbVRva2VuPiBUb2tlblNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2VuU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblNvdXJjZS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oICJCdWZmZXIgaXMgbm90IHlldCBmaWxsZWQuIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKCAwLCB0b2tlbnMuQ291bnQgLSAxICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmcoIGludCBzdGFydCwgaW50IHN0b3AgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXJ0IDwgMCB8fCBzdG9wIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCAiQnVmZmVyIGlzIG5vdCB5ZXQgZmlsbGVkLiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RvcCA+PSB0b2tlbnMuQ291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3AgPSB0b2tlbnMuQ291bnQgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yICggaW50IGkgPSBzdGFydDsgaSA8PSBzdG9wOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNsaW1Ub2tlbiB0ID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIFNsaW1MZXhlciBsZXhlciA9IF90b2tlblNvdXJjZSBhcyBTbGltTGV4ZXI7CisgICAgICAgICAgICAgICAgaWYgKCBsZXhlciAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNsaW1TdHJpbmdTdHJlYW0gaW5wdXQgPSBsZXhlci5DaGFyU3RyZWFtIGFzIFNsaW1TdHJpbmdTdHJlYW07CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gaW5wdXQuU3Vic3RyaW5nKCB0LlN0YXJ0SW5kZXgsIHQuU3RvcEluZGV4IC0gdC5TdGFydEluZGV4ICsgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggdGV4dCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGFydCAhPSBudWxsICYmIHN0b3AgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKCBzdGFydC5Ub2tlbkluZGV4LCBzdG9wLlRva2VuSW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0ICJhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1RyZWUvSVRyZWVBZGFwdG9yXDE0MDEuY3MiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1RyZWUvSVRyZWVBZGFwdG9yXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjJlY2YKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2xpbVBhcnNpbmcvVHJlZS9JVHJlZUFkYXB0b3JcMTQwMS5jcyIKQEAgLTAsMCArMSwzMTQgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUcmVlQWRhcHRvcjxUPgorICAgIHsKKyAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3Rpb24KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSB0cmVlIG5vZGUgZnJvbSBUb2tlbiBvYmplY3Q7IGZvciBDb21tb25UcmVlIHR5cGUgdHJlZXMsCisgICAgICAgICAqICB0aGVuIHRoZSB0b2tlbiBqdXN0IGJlY29tZXMgdGhlIHBheWxvYWQuICBUaGlzIGlzIHRoZSBtb3N0CisgICAgICAgICAqICBjb21tb24gY3JlYXRlIGNhbGwuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIE92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgVCBDcmVhdGUoSVRva2VuIHBheWxvYWQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5EdXBsaWNhdGUgYSBzaW5nbGUgdHJlZSBub2RlLjwvc3VtbWFyeT4KKyAgICAgICAgICogIDxyZW1hcmtzPk92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LjwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIFQgRHVwTm9kZShUIHRyZWVOb2RlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+RHVwbGljYXRlIHRyZWUgcmVjdXJzaXZlbHksIHVzaW5nIGR1cE5vZGUoKSBmb3IgZWFjaCBub2RlPC9zdW1tYXJ5PiAqLworICAgICAgICBUIER1cFRyZWUoVCB0cmVlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gYSBuaWwgbm9kZSAoYW4gZW1wdHkgYnV0IG5vbi1udWxsIG5vZGUpIHRoYXQgY2FuIGhvbGQKKyAgICAgICAgICogIGEgbGlzdCBvZiBlbGVtZW50IGFzIHRoZSBjaGlsZHJlbi4gIElmIHlvdSB3YW50IGEgZmxhdCB0cmVlIChhIGxpc3QpCisgICAgICAgICAqICB1c2UgInQ9YWRhcHRvci5uaWwoKTsgdC5hZGRDaGlsZCh4KTsgdC5hZGRDaGlsZCh5KTsiCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBUIE5pbCgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAgICAgICAgICogIHRva2VucyBjb25zdW1lZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuICBUaGUgc3RhcnQgdG9rZW4gaW5kaWNhdGVzIHRoZQorICAgICAgICAgKiAgaW5wdXQgc3ltYm9sIGF0IHdoaWNoIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuICBUaGUgc3RvcCB0b2tlbiBpbmRpY2F0ZXMKKyAgICAgICAgICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqICBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBpbnB1dCBzdHJlYW0gc28gdGhhdCB0aGUgZXJyb25lb3VzIHRleHQgY2FuCisgICAgICAgICAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgICAgICAgICAqICB0byBzb21lIGFwcGxpY2F0aW9uczsgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgcHRyIHRvIGl0IGluCisgICAgICAgICAqICB0aGUgQ29tbW9uRXJyb3JOb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiAgVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGR1cmluZyB0b2tlbiBwYXJzaW5nLCBub3QgdHJlZSBwYXJzaW5nLgorICAgICAgICAgKiAgVHJlZSBwYXJzaW5nIHNob3VsZCBoYXBwZW4gb25seSB3aGVuIHBhcnNpbmcgYW5kIHRyZWUgY29uc3RydWN0aW9uCisgICAgICAgICAqICBzdWNjZWVkLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgVCBFcnJvck5vZGUoSVRva2VuU3RyZWFtIGlucHV0LCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wLCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+SXMgdHJlZSBjb25zaWRlcmVkIGEgbmlsIG5vZGUgdXNlZCB0byBtYWtlIGxpc3RzIG9mIGNoaWxkIG5vZGVzPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgYm9vbCBJc05pbChUIHRyZWUpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFkZCBhIGNoaWxkIHRvIHRoZSB0cmVlIHQuICBJZiBjaGlsZCBpcyBhIGZsYXQgdHJlZSAoYSBsaXN0KSwgbWFrZSBhbGwKKyAgICAgICAgICogIGluIGxpc3QgY2hpbGRyZW4gb2YgdC4gIFdhcm5pbmc6IGlmIHQgaGFzIG5vIGNoaWxkcmVuLCBidXQgY2hpbGQgZG9lcworICAgICAgICAgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICAgICAgICAgKiAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LiAgSnVzdAorICAgICAgICAgKiAgbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggaGF2ZSB0aGUgdXNlciB3aWxsIGJ1aWxkCisgICAgICAgICAqICBBU1RzLiAgRG8gbm90aGluZyBpZiB0IG9yIGNoaWxkIGlzIG51bGwuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEFkZENoaWxkKFQgdCwgVCBjaGlsZCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAgICAgICAgICogIElmIG5vdCBhIG5pbCByb290LCBtYWtlIG9sZFJvb3QgYSBjaGlsZCBvZiBuZXdSb290LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1yIHlpZWxkcyBeKHIgYSBiIGMpCisgICAgICAgICAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAgICAgICAgICoKKyAgICAgICAgICogIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorICAgICAgICAgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIGEgYiBjKQorICAgICAgICAgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgb2xkUm9vdCB3YXMgbnVsbCwgaXQncyBvaywganVzdCByZXR1cm4gbmV3Um9vdCAoZXZlbiBpZiBpc05pbCkuCisgICAgICAgICAqCisgICAgICAgICAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICAgICAgICAgKiAgICBvbGQ9bnVsbCwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKG5pbCByKQorICAgICAgICAgKgorICAgICAgICAgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICAgICAgICAgKiAgc2ltcGxlIG5vZGUgb3IgbmlsIHJvb3Qgd2l0aCBhIHNpbmdsZSBjaGlsZCBub2RlLS1pdCBtdXN0IGJlIGEgcm9vdAorICAgICAgICAgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogIEJlIGFkdmlzZWQgdGhhdCBpdCdzIG9rIGZvciBuZXdSb290IHRvIHBvaW50IGF0IG9sZFJvb3QncworICAgICAgICAgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAgICAgICAgICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgICAgICAgICAqICBlZmZpY2llbmN5LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgVCBCZWNvbWVSb290KFQgbmV3Um9vdCwgVCBvbGRSb290KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHaXZlbiB0aGUgcm9vdCBvZiB0aGUgc3VidHJlZSBjcmVhdGVkIGZvciB0aGlzIHJ1bGUsIHBvc3QgcHJvY2VzcworICAgICAgICAgKiAgaXQgdG8gZG8gYW55IHNpbXBsaWZpY2F0aW9ucyBvciB3aGF0ZXZlciB5b3Ugd2FudC4gIEEgcmVxdWlyZWQKKyAgICAgICAgICogIGJlaGF2aW9yIGlzIHRvIGNvbnZlcnQgXihuaWwgc2luZ2xlU3VidHJlZSkgdG8gc2luZ2xlU3VidHJlZQorICAgICAgICAgKiAgYXMgdGhlIHNldHRpbmcgb2Ygc3RhcnQvc3RvcCBpbmRleGVzIHJlbGllcyBvbiBhIHNpbmdsZSBub24tbmlsIHJvb3QKKyAgICAgICAgICogIGZvciBub24tZmxhdCB0cmVlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgRmxhdCB0cmVlcyBzdWNoIGFzIGZvciBsaXN0cyBsaWtlICJpZGxpc3QgOiBJRCsgOyIgYXJlIGxlZnQgYWxvbmUKKyAgICAgICAgICogIHVubGVzcyB0aGVyZSBpcyBvbmx5IG9uZSBJRC4gIEZvciBhIGxpc3QsIHRoZSBzdGFydC9zdG9wIGluZGV4ZXMKKyAgICAgICAgICogIGFyZSBzZXQgaW4gdGhlIG5pbCBub2RlLgorICAgICAgICAgKgorICAgICAgICAgKiAgVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHJ1bGUgdHJlZSBjb25zdHJ1Y3Rpb24gYW5kIHJpZ2h0CisgICAgICAgICAqICBiZWZvcmUgc2V0VG9rZW5Cb3VuZGFyaWVzKCkuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBUIFJ1bGVQb3N0UHJvY2Vzc2luZyhUIHJvb3QpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Gb3IgaWRlbnRpZnlpbmcgdHJlZXMuPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBIb3cgdG8gaWRlbnRpZnkgbm9kZXMgc28gd2UgY2FuIHNheSAiYWRkIG5vZGUgdG8gYSBwcmlvciBub2RlIj8KKyAgICAgICAgICogIEV2ZW4gYmVjb21lUm9vdCBpcyBhbiBpc3N1ZS4gIFVzZSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShub2RlKQorICAgICAgICAgKiAgdXN1YWxseS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIGludCBHZXRVbmlxdWVJRChUIG5vZGUpOworCisKKyAgICAgICAgLy8gUiBlIHcgciBpIHQgZSAgUiB1IGwgZSBzCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ3JlYXRlIGEgbm9kZSBmb3IgbmV3Um9vdCBtYWtlIGl0IHRoZSByb290IG9mIG9sZFJvb3QuCisgICAgICAgICAqICBJZiBvbGRSb290IGlzIGEgbmlsIHJvb3QsIGp1c3QgY29weSBvciBtb3ZlIHRoZSBjaGlsZHJlbiB0byBuZXdSb290LgorICAgICAgICAgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmV0dXJucz4KKyAgICAgICAgICogIFJldHVybiBub2RlIGNyZWF0ZWQgZm9yIG5ld1Jvb3QuCisgICAgICAgICAqICA8L3JldHVybnM+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIEJlIGFkdmlzZWQ6IHdoZW4gZGVidWdnaW5nIEFTVHMsIHRoZSBEZWJ1Z1RyZWVBZGFwdG9yIG1hbnVhbGx5CisgICAgICAgICAqICBjYWxscyBjcmVhdGUoVG9rZW4gY2hpbGQpIGFuZCB0aGVuIHBsYWluIGJlY29tZVJvb3Qobm9kZSwgbm9kZSkKKyAgICAgICAgICogIGJlY2F1c2UgaXQgbmVlZHMgdG8gdHJhcCBjYWxscyB0byBjcmVhdGUsIGJ1dCBpdCBjYW4ndCBzaW5jZSBpdCBkZWxlZ2F0ZXMKKyAgICAgICAgICogIHRvIG5vdCBpbmhlcml0cyBmcm9tIHRoZSBUcmVlQWRhcHRvci4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIFQgQmVjb21lUm9vdChJVG9rZW4gbmV3Um9vdCwgVCBvbGRSb290KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorICAgICAgICAgKiAgVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgICAgICAgKiAgcmV3cml0ZSBydWxlIGFzIElNQUdbJHRva2VuTGFiZWxdLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgVCBDcmVhdGUoaW50IHRva2VuVHlwZSwgSVRva2VuIGZyb21Ub2tlbik7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgU2FtZSBhcyBjcmVhdGUodG9rZW5UeXBlLGZyb21Ub2tlbikgZXhjZXB0IHNldCB0aGUgdGV4dCB0b28uCisgICAgICAgICAqICBUaGlzIGlzIGludm9rZWQgZnJvbSBhbiBpbWFnaW5hcnkgbm9kZSByZWYgb24gcmlnaHQgc2lkZSBvZiBhCisgICAgICAgICAqICByZXdyaXRlIHJ1bGUgYXMgSU1BR1skdG9rZW5MYWJlbCwgIklNQUciXS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgVGhpcyBzaG91bGQgaW52b2tlIGNyZWF0ZVRva2VuKFRva2VuKS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIFQgQ3JlYXRlKGludCB0b2tlblR5cGUsIElUb2tlbiBmcm9tVG9rZW4sIHN0cmluZyB0ZXh0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorICAgICAgICAgKiAgVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgICAgICAgKiAgcmV3cml0ZSBydWxlIGFzIElNQUdbIklNQUciXS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgVGhpcyBzaG91bGQgaW52b2tlIGNyZWF0ZVRva2VuKGludCxTdHJpbmcpLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgVCBDcmVhdGUoaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQpOworCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQ29udGVudAorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Gb3IgdHJlZSBwYXJzaW5nLCBJIG5lZWQgdG8ga25vdyB0aGUgdG9rZW4gdHlwZSBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBHZXRUeXBlKFQgdCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk5vZGUgY29uc3RydWN0b3JzIGNhbiBzZXQgdGhlIHR5cGUgb2YgYSBub2RlPC9zdW1tYXJ5PiAqLworICAgICAgICB2b2lkIFNldFR5cGUoVCB0LCBpbnQgdHlwZSk7CisKKyAgICAgICAgc3RyaW5nIEdldFRleHQoVCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+Tm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdGV4dCBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0VGV4dChUIHQsIHN0cmluZyB0ZXh0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIHRva2VuIG9iamVjdCBmcm9tIHdoaWNoIHRoaXMgbm9kZSB3YXMgY3JlYXRlZC4KKyAgICAgICAgICogIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAqICBUaGUgZXJyb3IgZGlzcGxheSByb3V0aW5lIGluIEJhc2VSZWNvZ25pemVyIG5lZWRzIHRvCisgICAgICAgICAqICBkaXNwbGF5IHdoZXJlIHRoZSBpbnB1dCB0aGUgZXJyb3Igb2NjdXJyZWQuIElmIHlvdXIKKyAgICAgICAgICogIHRyZWUgb2YgbGltaXRhdGlvbiBkb2VzIG5vdCBzdG9yZSBpbmZvcm1hdGlvbiB0aGF0IGNhbgorICAgICAgICAgKiAgbGVhZCB5b3UgdG8gdGhlIHRva2VuLCB5b3UgY2FuIGNyZWF0ZSBhIHRva2VuIGZpbGxlZCB3aXRoCisgICAgICAgICAqICB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gYW5kIHBhc3MgdGhhdCBiYWNrLiAgU2VlCisgICAgICAgICAqICBCYXNlUmVjb2duaXplci5nZXRFcnJvck1lc3NhZ2UoKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIElUb2tlbiBHZXRUb2tlbihUIHQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoZXJlIGFyZSB0aGUgYm91bmRzIGluIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0gZm9yIHRoaXMgbm9kZSBhbmQKKyAgICAgICAgICogIGFsbCBjaGlsZHJlbj8gIEVhY2ggcnVsZSB0aGF0IGNyZWF0ZXMgQVNUIG5vZGVzIHdpbGwgY2FsbCB0aGlzCisgICAgICAgICAqICBtZXRob2QgcmlnaHQgYmVmb3JlIHJldHVybmluZy4gIEZsYXQgdHJlZXMgKGkuZS4sIGxpc3RzKSB3aWxsCisgICAgICAgICAqICBzdGlsbCB1c3VhbGx5IGhhdmUgYSBuaWwgcm9vdCBub2RlIGp1c3QgdG8gaG9sZCB0aGUgY2hpbGRyZW4gbGlzdC4KKyAgICAgICAgICogIFRoYXQgbm9kZSB3b3VsZCBjb250YWluIHRoZSBzdGFydC9zdG9wIGluZGV4ZXMgdGhlbi4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgU2V0VG9rZW5Cb3VuZGFyaWVzKFQgdCwgSVRva2VuIHN0YXJ0VG9rZW4sIElUb2tlbiBzdG9wVG9rZW4pOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgdGhlIHRva2VuIHN0YXJ0IGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4PC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgR2V0VG9rZW5TdGFydEluZGV4KFQgdCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdldCB0aGUgdG9rZW4gc3RvcCBpbmRleCBmb3IgdGhpcyBzdWJ0cmVlOyByZXR1cm4gLTEgaWYgbm8gc3VjaCBpbmRleDwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IEdldFRva2VuU3RvcEluZGV4KFQgdCk7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBOYXZpZ2F0aW9uIC8gVHJlZSBQYXJzaW5nCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdldCBhIGNoaWxkIDAuLm4tMSBub2RlPC9zdW1tYXJ5PiAqLworICAgICAgICBUIEdldENoaWxkKFQgdCwgaW50IGkpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgaXRoIGNoaWxkICgwLi5uLTEpIHRvIHQ7IHQgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLW5pbCBub2RlPC9zdW1tYXJ5PiAqLworICAgICAgICB2b2lkIFNldENoaWxkKFQgdCwgaW50IGksIFQgY2hpbGQpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZW1vdmUgaXRoIGNoaWxkIGFuZCBzaGlmdCBjaGlsZHJlbiBkb3duIGZyb20gcmlnaHQuPC9zdW1tYXJ5PiAqLworICAgICAgICBUIERlbGV0ZUNoaWxkKFQgdCwgaW50IGkpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Ib3cgbWFueSBjaGlsZHJlbj8gIElmIDAsIHRoZW4gdGhpcyBpcyBhIGxlYWYgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IEdldENoaWxkQ291bnQoVCB0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaG8gaXMgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZTsgaWYgbnVsbCwgaW1wbGllcyBub2RlIGlzIHJvb3QuCisgICAgICAgICAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICAgICAgICAgKiAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgVCBHZXRQYXJlbnQoVCB0KTsKKyAgICAgICAgdm9pZCBTZXRQYXJlbnQoVCB0LCBUIHBhcmVudCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAgICAgICAgICogIElmIHlvdXIgbm9kZSB0eXBlIGRvZXNuJ3QgaGFuZGxlIHRoaXMsIGl0J3Mgb2sgYnV0IHRoZSB0cmVlIHJld3JpdGVzCisgICAgICAgICAqICBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgR2V0Q2hpbGRJbmRleChUIHQpOworICAgICAgICB2b2lkIFNldENoaWxkSW5kZXgoVCB0LCBpbnQgaW5kZXgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlcGxhY2UgZnJvbSBzdGFydCB0byBzdG9wIGNoaWxkIGluZGV4IG9mIHBhcmVudCB3aXRoIHQsIHdoaWNoIG1pZ2h0CisgICAgICAgICAqICBiZSBhIGxpc3QuICBOdW1iZXIgb2YgY2hpbGRyZW4gbWF5IGJlIGRpZmZlcmVudCBhZnRlciB0aGlzIGNhbGwuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHBhcmVudCBpcyBudWxsLCBkb24ndCBkbyBhbnl0aGluZzsgbXVzdCBiZSBhdCByb290IG9mIG92ZXJhbGwgdHJlZS4KKyAgICAgICAgICogIENhbid0IHJlcGxhY2Ugd2hhdGV2ZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgZXh0ZXJuYWxseS4gIERvIG5vdGhpbmcuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFJlcGxhY2VDaGlsZHJlbihUIHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBUIHQpOworCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9UcmVlL0lUcmVlRmFjdG9yeS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1RyZWUvSVRyZWVGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTc2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TbGltUGFyc2luZy9UcmVlL0lUcmVlRmFjdG9yeS5jcwpAQCAtMCwwICsxLDU0IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgcHVibGljIGludGVyZmFjZSBJVHJlZUZhY3Rvcnk8VFRva2VuLCBUVHJlZT4KKyAgICAgICAgd2hlcmUgVFRva2VuIDogSVRva2VuCisgICAgICAgIHdoZXJlIFRUcmVlIDogSVRyZWUKKyAgICB7CisgICAgICAgIFRUcmVlIENyZWF0ZSggVFRva2VuIHBheWxvYWQgKTsKKworICAgICAgICBUVHJlZSBDbG9uZVRyZWUoIFRUcmVlIHRyZWUgKTsKKworICAgICAgICBUVHJlZSBDbG9uZU5vZGUoIFRUcmVlIG5vZGUgKTsKKworICAgICAgICBUVHJlZSBOaWwoKTsKKworICAgICAgICBUVHJlZSBDcmVhdGVFcnJvck5vZGUoIElUb2tlblN0cmVhbTxUVG9rZW4+IGlucHV0LCBUVG9rZW4gc3RhcnQsIFRUb2tlbiBzdG9wLCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBJVHJlZUZhY3RvcnkKKyAgICAgICAgOiBJVHJlZUZhY3Rvcnk8SVRva2VuLCBJVHJlZT4KKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0ICJhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1RyZWUvSVRyZWVOb2RlU3RyZWFtXDE0MDEuY3MiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1NsaW1QYXJzaW5nL1RyZWUvSVRyZWVOb2RlU3RyZWFtXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzE4M2YKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU2xpbVBhcnNpbmcvVHJlZS9JVHJlZU5vZGVTdHJlYW1cMTQwMS5jcyIKQEAgLTAsMCArMSwxNDIgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRyZWVOb2RlU3RyZWFtPFQ+CisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHZXQgYSB0cmVlIG5vZGUgYXQgYW4gYWJzb2x1dGUgaW5kZXggaTsgMC4ubi0xLgorICAgICAgICAgKiAgSWYgeW91IGRvbid0IHdhbnQgdG8gYnVmZmVyIHVwIG5vZGVzLCB0aGVuIHRoaXMgbWV0aG9kIG1ha2VzIG5vCisgICAgICAgICAqICBzZW5zZSBmb3IgeW91LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgVCB0aGlzW2ludCBpXQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHZXQgdHJlZSBub2RlIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgbm9kZS4KKyAgICAgICAgICogIGkmbHQ7MCBpbmRpY2F0ZXMgbm9kZXMgaW4gdGhlIHBhc3QuICBTbyBMVCgtMSkgaXMgcHJldmlvdXMgbm9kZSwgYnV0CisgICAgICAgICAqICBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBwcm92aWRlIHJlc3VsdHMgZm9yIGsgJmx0OyAtMS4KKyAgICAgICAgICogIExUKDApIGlzIHVuZGVmaW5lZC4gIEZvciBpJmd0Oz1uLCByZXR1cm4gbnVsbC4KKyAgICAgICAgICogIFJldHVybiBudWxsIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgICAgICAgICAqICB0aGF0IGlzIG5lZ2F0aXZlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIGlzIGFuYWxvZ3VzIHRvIHRoZSBMVCgpIG1ldGhvZCBvZiB0aGUgVG9rZW5TdHJlYW0sIGJ1dCB0aGlzCisgICAgICAgICAqICByZXR1cm5zIGEgdHJlZSBub2RlIGluc3RlYWQgb2YgYSB0b2tlbi4gIE1ha2VzIGNvZGUgZ2VuIGlkZW50aWNhbAorICAgICAgICAgKiAgZm9yIGJvdGggcGFyc2VyIGFuZCB0cmVlIGdyYW1tYXJzLiA6KQorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgVCBMVChpbnQgayk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hlcmUgaXMgdGhpcyBzdHJlYW0gcHVsbGluZyBub2RlcyBmcm9tPyAgVGhpcyBpcyBub3QgdGhlIG5hbWUsIGJ1dAorICAgICAgICAgKiAgdGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG5vZGUgb2JqZWN0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIG9iamVjdCBUcmVlU291cmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIElmIHRoZSB0cmVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbSB3YXMgY3JlYXRlZCBmcm9tIGEgVG9rZW5TdHJlYW0sCisgICAgICAgICAqICB5b3UgY2FuIHNwZWNpZnkgaXQgaGVyZS4gIFVzZWQgdG8gZG8gcnVsZSAkdGV4dCBhdHRyaWJ1dGUgaW4gdHJlZQorICAgICAgICAgKiAgcGFyc2VyLiAgT3B0aW9uYWwgdW5sZXNzIHlvdSB1c2UgdHJlZSBwYXJzZXIgcnVsZSB0ZXh0IGF0dHJpYnV0ZQorICAgICAgICAgKiAgb3Igb3V0cHV0PXRlbXBsYXRlIGFuZCByZXdyaXRlPXRydWUgb3B0aW9ucy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIElUb2tlblN0cmVhbSBUb2tlblN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IGFkYXB0b3IgY2FuIHRlbGwgbWUgaG93IHRvIGludGVycHJldC9uYXZpZ2F0ZSBub2RlcyBhbmQKKyAgICAgICAgICogIHRyZWVzLiAgRS5nLiwgZ2V0IHRleHQgb2YgYSBub2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSVRyZWVBZGFwdG9yPFQ+IFRyZWVBZGFwdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFzIHdlIGZsYXR0ZW4gdGhlIHRyZWUsIHdlIHVzZSBVUCwgRE9XTiBub2RlcyB0byByZXByZXNlbnQKKyAgICAgICAgICogIHRoZSB0cmVlIHN0cnVjdHVyZS4gIFdoZW4gZGVidWdnaW5nIHdlIG5lZWQgdW5pcXVlIG5vZGVzCisgICAgICAgICAqICBzbyB3ZSBoYXZlIHRvIGluc3RhbnRpYXRlIG5ldyBvbmVzLiAgV2hlbiBkb2luZyBub3JtYWwgdHJlZQorICAgICAgICAgKiAgcGFyc2luZywgaXQncyBzbG93IGFuZCBhIHdhc3RlIG9mIG1lbW9yeSB0byBjcmVhdGUgdW5pcXVlCisgICAgICAgICAqICBuYXZpZ2F0aW9uIG5vZGVzLiAgRGVmYXVsdCBzaG91bGQgYmUgZmFsc2U7CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBib29sIFVuaXF1ZU5hdmlnYXRpb25Ob2RlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIHRleHQgb2YgYWxsIG5vZGVzIGZyb20gc3RhcnQgdG8gc3RvcCwgaW5jbHVzaXZlLgorICAgICAgICAgKiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSBub2RlcyB0aGVuIGl0IGNhbiBzdGlsbAorICAgICAgICAgKiAgd2FsayByZWN1cnNpdmVseSBmcm9tIHN0YXJ0IHVudGlsIHN0b3AuICBZb3UgY2FuIGFsd2F5cyByZXR1cm4KKyAgICAgICAgICogIG51bGwgb3IgIiIgdG9vLCBidXQgdXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgICAgICAgICAqICBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHN0cmluZyBUb1N0cmluZyhUIHN0YXJ0LCBUIHN0b3ApOworCisKKyAgICAgICAgI3JlZ2lvbiBSRVdSSVRJTkcgVFJFRVMgKHVzZWQgYnkgdHJlZSBwYXJzZXIpCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVwbGFjZSBmcm9tIHN0YXJ0IHRvIHN0b3AgY2hpbGQgaW5kZXggb2YgcGFyZW50IHdpdGggdCwgd2hpY2ggbWlnaHQKKyAgICAgICAgICogIGJlIGEgbGlzdC4gIE51bWJlciBvZiBjaGlsZHJlbiBtYXkgYmUgZGlmZmVyZW50CisgICAgICAgICAqICBhZnRlciB0aGlzIGNhbGwuICBUaGUgc3RyZWFtIGlzIG5vdGlmaWVkIGJlY2F1c2UgaXQgaXMgd2Fsa2luZyB0aGUKKyAgICAgICAgICogIHRyZWUgYW5kIG1pZ2h0IG5lZWQgdG8ga25vdyB5b3UgYXJlIG1vbmtleWluZyB3aXRoIHRoZSB1bmRlcmx5aW5nCisgICAgICAgICAqICB0cmVlLiAgQWxzbywgaXQgbWlnaHQgYmUgYWJsZSB0byBtb2RpZnkgdGhlIG5vZGUgc3RyZWFtIHRvIGF2b2lkCisgICAgICAgICAqICByZXN0cmVhbWluZyBmb3IgZnV0dXJlIHBoYXNlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorICAgICAgICAgKiAgQ2FuJ3QgcmVwbGFjZSB3aGF0ZXZlciBwb2ludHMgdG8gdGhlIHBhcmVudCBleHRlcm5hbGx5LiAgRG8gbm90aGluZy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUmVwbGFjZUNoaWxkcmVuKFQgcGFyZW50LCBpbnQgc3RhcnRDaGlsZEluZGV4LCBpbnQgc3RvcENoaWxkSW5kZXgsIFQgdCk7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1N0cmluZ1RlbXBsYXRlT3V0cHV0LmczIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU3RyaW5nVGVtcGxhdGVPdXRwdXQuZzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2ZTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1N0cmluZ1RlbXBsYXRlT3V0cHV0LmczCkBAIC0wLDAgKzEsMzYgQEAKK++7v2dyYW1tYXIgU3RyaW5nVGVtcGxhdGVPdXRwdXQ7CisKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUNTaGFycDM7CisgICAgVG9rZW5MYWJlbFR5cGU9Q29tbW9uVG9rZW47CisgICAgb3V0cHV0PXRlbXBsYXRlOworfQorCitAbGV4ZXI6Om5hbWVzcGFjZXtBbnRscjMuUnVudGltZS5UZXN0fQorQHBhcnNlcjo6bmFtZXNwYWNle0FudGxyMy5SdW50aW1lLlRlc3R9CisKKy8qCisgKiBQYXJzZXIgUnVsZXMKKyAqLworCitwdWJsaWMKK2NvbXBpbGVVbml0CisgICAgOiAgIElEIGludGVnZXIgRU9GCisJCS0+IG5ldyhpZD17JElELnRleHR9LCB2YWx1ZT17JGludGVnZXIuc3R9KQorICAgIDsKKworaW50ZWdlcgorCToJaT0naW50JyAtPiB7JXskaS50ZXh0fX0KKwk7CisKKy8qCisgKiBMZXhlciBSdWxlcworICovCisKK0lECisJOgknYScuLid6JyoKKwk7CisKK1dTCisgICAgOiAgICcgJworICAgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1N0cmluZ1RlbXBsYXRlT3V0cHV0LmczLmxleGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU3RyaW5nVGVtcGxhdGVPdXRwdXQuZzMubGV4ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxZjk4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1N0cmluZ1RlbXBsYXRlT3V0cHV0LmczLmxleGVyLmNzCkBAIC0wLDAgKzEsNiBAQAor77u/bmFtZXNwYWNlIEFudGxyMy5SdW50aW1lLlRlc3QKK3sKKyAgICBwYXJ0aWFsIGNsYXNzIFN0cmluZ1RlbXBsYXRlT3V0cHV0TGV4ZXIKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU3RyaW5nVGVtcGxhdGVPdXRwdXQuZzMucGFyc2VyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvU3RyaW5nVGVtcGxhdGVPdXRwdXQuZzMucGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNDE5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9TdHJpbmdUZW1wbGF0ZU91dHB1dC5nMy5wYXJzZXIuY3MKQEAgLTAsMCArMSw2IEBACivvu79uYW1lc3BhY2UgQW50bHIzLlJ1bnRpbWUuVGVzdAoreworICAgIHBhcnRpYWwgY2xhc3MgU3RyaW5nVGVtcGxhdGVPdXRwdXRQYXJzZXIKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEFjdGlvbkZlYXR1cmVzLmczIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEFjdGlvbkZlYXR1cmVzLmczCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDUyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0QWN0aW9uRmVhdHVyZXMuZzMKQEAgLTAsMCArMSw2NSBAQAor77u/Z3JhbW1hciBUZXN0QWN0aW9uRmVhdHVyZXM7CisKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUNTaGFycDM7CisgICAgVG9rZW5MYWJlbFR5cGU9Q29tbW9uVG9rZW47CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KKworQGxleGVyOjpuYW1lc3BhY2V7QW50bHIzLlJ1bnRpbWUuVGVzdH0KK0BwYXJzZXI6Om5hbWVzcGFjZXtBbnRscjMuUnVudGltZS5UZXN0fQorCitAcGFyc2VyOjpoZWFkZXJ7dXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlO30KKworLyoKKyAqIFBhcnNlciBSdWxlcworICovCisKK3B1YmxpYworY29tcGlsZVVuaXQKKyAgICA6ICAgRU9GCisgICAgOworCisvLyBTRVRfRFlOQU1JQ19TQ09QRV9BVFRSCisKK3NldER5bmFtaWNTY29wZUF0dHIKK3Njb3BlIHtpbnQgaTt9CisJOglFT0YgeyRzZXREeW5hbWljU2NvcGVBdHRyOjppPTM7ICRzZXREeW5hbWljU2NvcGVBdHRyWzBdOjppPTM7ICRzZXREeW5hbWljU2NvcGVBdHRyWy0wXTo6aT0zO30KKwk7CisKKy8vIERZTkFNSUNfU0NPUEVfQVRUUgorCitkeW5hbWljU2NvcGVBdHRyCitzY29wZSB7aW50IGk7fQorCToJRU9GIHtDb25zb2xlLldyaXRlTGluZSgkZHluYW1pY1Njb3BlQXR0cjo6aSk7fQorCTsKKworLy8gRFlOQU1JQ19ORUdBVElWRV9JTkRFWEVEX1NDT1BFX0FUVFIKKworZHluYW1pY05lZ2F0aXZlSW5kZXhlZFNjb3BlQXR0cgorc2NvcGUge2ludCBpO30KKwk6CUVPRiB7Q29uc29sZS5Xcml0ZUxpbmUoJGR5bmFtaWNOZWdhdGl2ZUluZGV4ZWRTY29wZUF0dHJbLTFdOjppKTt9CisJOworCisvLyBEWU5BTUlDX0FCU09MVVRFX0lOREVYRURfU0NPUEVfQVRUUgorCitkeW5hbWljQWJzb2x1dGVJbmRleGVkU2NvcGVBdHRyCitzY29wZSB7aW50IGk7fQorCToJRU9GIHtDb25zb2xlLldyaXRlTGluZSgkZHluYW1pY05lZ2F0aXZlSW5kZXhlZFNjb3BlQXR0clswXTo6aSk7fQorCTsKKworLy8gSVNPTEFURURfRFlOQU1JQ19TQ09QRQorCitpc29sYXRlZER5bmFtaWNTY29wZQorc2NvcGUge2ludCBpO30KKwk6CUVPRiB7Q29uc29sZS5Xcml0ZUxpbmUoJGlzb2xhdGVkRHluYW1pY1Njb3BlLkNvdW50KTt9CisJOworCisvKgorICogTGV4ZXIgUnVsZXMKKyAqLworCitXUworICAgIDogICAnICcKKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0QWN0aW9uRmVhdHVyZXMuZzMubGV4ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0QWN0aW9uRmVhdHVyZXMuZzMubGV4ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3NDMyNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1Rlc3RBY3Rpb25GZWF0dXJlcy5nMy5sZXhlci5jcwpAQCAtMCwwICsxLDYgQEAKK++7v25hbWVzcGFjZSBBbnRscjMuUnVudGltZS5UZXN0Cit7CisgICAgcGFydGlhbCBjbGFzcyBUZXN0QWN0aW9uRmVhdHVyZXNMZXhlcgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0QWN0aW9uRmVhdHVyZXMuZzMucGFyc2VyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEFjdGlvbkZlYXR1cmVzLmczLnBhcnNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWRjZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEFjdGlvbkZlYXR1cmVzLmczLnBhcnNlci5jcwpAQCAtMCwwICsxLDYgQEAKK++7v25hbWVzcGFjZSBBbnRscjMuUnVudGltZS5UZXN0Cit7CisgICAgcGFydGlhbCBjbGFzcyBUZXN0QWN0aW9uRmVhdHVyZXNQYXJzZXIKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdERvdFRyZWVHZW5lcmF0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0RG90VHJlZUdlbmVyYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg0ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdERvdFRyZWVHZW5lcmF0b3IuY3MKQEAgLTAsMCArMSw4NSBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIzLlJ1bnRpbWUuVGVzdAoreworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKyAgICB1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKKworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRlc3REb3RUcmVlR2VuZXJhdG9yCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVGVzdENyZWF0ZURvdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFOVExSU3RyaW5nU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCAiMyAqIHgiICk7CisgICAgICAgICAgICBTaW1wbGVFeHByZXNzaW9uTGV4ZXIgbGV4ZXIgPSBuZXcgU2ltcGxlRXhwcmVzc2lvbkxleGVyKCBpbnB1dCApOworICAgICAgICAgICAgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKCBsZXhlciApOworICAgICAgICAgICAgU2ltcGxlRXhwcmVzc2lvblBhcnNlciBwYXJzZXIgPSBuZXcgU2ltcGxlRXhwcmVzc2lvblBhcnNlciggdG9rZW5zICk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLmV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgdmFyIHRyZWUgPSByZXN1bHQuVHJlZTsKKyAgICAgICAgICAgIHZhciBhZGFwdG9yID0gcGFyc2VyLlRyZWVBZGFwdG9yOworCisgICAgICAgICAgICBEb3RUcmVlR2VuZXJhdG9yIGdlbiA9IG5ldyBEb3RUcmVlR2VuZXJhdG9yKCk7CisgICAgICAgICAgICBzdHJpbmcgb3V0cHV0ID0gZ2VuLlRvRG90KCB0cmVlLCBhZGFwdG9yICk7CisgICAgICAgICAgICBzdHJpbmcgbmV3bGluZSA9IEVudmlyb25tZW50Lk5ld0xpbmU7CisgICAgICAgICAgICBzdHJpbmcgZXhwZWN0ZWQgPQorICAgICAgICAgICAgICAgIEAiZGlncmFwaCB7IiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiCW9yZGVyaW5nPW91dDsiICsgbmV3bGluZQorICAgICAgICAgICAgICAgICsgQCIJcmFua3NlcD0uNDsiICsgbmV3bGluZQorICAgICAgICAgICAgICAgICsgQCIJYmdjb2xvcj0iImxpZ2h0Z3JleSIiOyBub2RlIFtzaGFwZT1ib3gsIGZpeGVkc2l6ZT1mYWxzZSwgZm9udHNpemU9MTIsIGZvbnRuYW1lPSIiSGVsdmV0aWNhLWJvbGQiIiwgZm9udGNvbG9yPSIiYmx1ZSIiIiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiCQl3aWR0aD0uMjUsIGhlaWdodD0uMjUsIGNvbG9yPSIiYmxhY2siIiwgZmlsbGNvbG9yPSIid2hpdGUiIiwgc3R5bGU9IiJmaWxsZWQsIHNvbGlkLCBib2xkIiJdOyIgKyBuZXdsaW5lCisgICAgICAgICAgICAgICAgKyBAIgllZGdlIFthcnJvd3NpemU9LjUsIGNvbG9yPSIiYmxhY2siIiwgc3R5bGU9IiJib2xkIiJdIiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiICBuMCBbbGFiZWw9IiIiIl07IiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiICBuMSBbbGFiZWw9IiIqIiJdOyIgKyBuZXdsaW5lCisgICAgICAgICAgICAgICAgKyBAIiAgbjEgW2xhYmVsPSIiKiIiXTsiICsgbmV3bGluZQorICAgICAgICAgICAgICAgICsgQCIgIG4yIFtsYWJlbD0iIjMiIl07IiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiICBuMyBbbGFiZWw9IiJ4IiJdOyIgKyBuZXdsaW5lCisgICAgICAgICAgICAgICAgKyBAIiAgbjQgW2xhYmVsPSIiIiJdOyIgKyBuZXdsaW5lCisgICAgICAgICAgICAgICAgKyBuZXdsaW5lCisgICAgICAgICAgICAgICAgKyBAIiAgbjAgLT4gbjEgLy8gIiIiIiAtPiAiIioiIiIgKyBuZXdsaW5lCisgICAgICAgICAgICAgICAgKyBAIiAgbjEgLT4gbjIgLy8gIiIqIiIgLT4gIiIzIiIiICsgbmV3bGluZQorICAgICAgICAgICAgICAgICsgQCIgIG4xIC0+IG4zIC8vICIiKiIiIC0+ICIieCIiIiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiICBuMCAtPiBuNCAvLyAiIiIiIC0+ICIiIiIiICsgbmV3bGluZQorICAgICAgICAgICAgICAgICsgbmV3bGluZQorICAgICAgICAgICAgICAgICsgQCJ9IiArIG5ld2xpbmUKKyAgICAgICAgICAgICAgICArIEAiIjsKKworICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCBleHBlY3RlZCwgb3V0cHV0ICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0RXhwcmVzc2lvbkZlYXR1cmVzLmczIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmIwYWUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMwpAQCAtMCwwICsxLDE2MCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2dyYW1tYXIgVGVzdEV4cHJlc3Npb25GZWF0dXJlczsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9Q1NoYXJwMzsKKyAgICBUb2tlbkxhYmVsVHlwZT1Db21tb25Ub2tlbjsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorCit0b2tlbnMgeworCUxQQVJFTiA9ICcoJzsKKwlSUEFSRU4gPSAnKSc7CisJRE9UID0gJy4nOworCUxCUkFDSyA9ICdbJzsKKwlSQlJBQ0sgPSAnXSc7CisJSU5DID0gJysrJzsKKwlERUMgPSAnLS0nOworCVBMVVMgPSAnKyc7CisJTUlOVVMgPSAnLSc7CisJVElMREUgPSAnfic7CisJTk9UID0gJyEnOworCS8vTFNISUZUID0gJzw8JzsKKwkvL1JTSElGVCA9ICc+Pic7CisJLy9SVVNISUZUID0gJz4+Pic7CisJRVFVQUxTID0gJz09JzsKKwlOT1RFUSA9ICchPSc7CisJTU9EID0gJyUnOworCUNBUkVUID0gJ14nOworCUdUID0gJz4nOworCUxUID0gJzwnOworCUdFID0gJz49JzsKKwlMRSA9ICc8PSc7CisJQklUQU5EID0gJyYnOworCUJJVE9SID0gJ3wnOworCUFORCA9ICcmJic7CisJT1IgPSAnfHwnOworCisJS1dfVEhJUyA9ICd0aGlzJzsKKwlLV19TVVBFUiA9ICdzdXBlcic7CisJS1dfQ0xBU1MgPSAnY2xhc3MnOworCUtXX05FVyA9ICduZXcnOworCUtXX0lOU1RBTkNFT0YgPSAnaW5zdGFuY2VvZic7CisJS1dfSU5UID0gJ2ludCc7Cit9CisKK0BsZXhlcjo6bmFtZXNwYWNle0FudGxyMy5SdW50aW1lLlRlc3R9CitAcGFyc2VyOjpuYW1lc3BhY2V7QW50bHIzLlJ1bnRpbWUuVGVzdH0KKworQHBhcnNlcjo6aGVhZGVye3VzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTt9CisKKy8qCisgKiBQYXJzZXIgUnVsZXMKKyAqLworCitwdWJsaWMKK2NvbXBpbGVVbml0CisgICAgOiAgIGUgRU9GCisgICAgOworCitlICAgOiAgICcoJyEgZSAnKSchCisgICAgfCAgICd0aGlzJyAKKyAgICB8ICAgJ3N1cGVyJworICAgIHwgICBJTlQKKyAgICB8ICAgSUQKKyAgICB8ICAgdHlwZSAnLideICdjbGFzcycKKyAgICB8ICAgZSAnLideIElECisgICAgfCAgIGUgJy4nXiAndGhpcycKKyAgICB8ICAgZSAnLideICdzdXBlcicgJygnXiBleHByZXNzaW9uTGlzdD8gJyknIQorICAgIHwgICBlICcuJ14gJ25ldydeIElEICcoJyEgZXhwcmVzc2lvbkxpc3Q/ICcpJyEKKyAgICB8CSduZXcnXiB0eXBlICggJygnIGV4cHJlc3Npb25MaXN0PyAnKSchIHwgKG9wdGlvbnMge2s9MTt9OidbJyBlICddJyEpKykKKyAgICB8ICAgZSAnWydeIGUgJ10nIQorICAgIHwgICAnKCdeIHR5cGUgJyknISBlCisgICAgfCAgIGUgKCcrKydeIHwgJy0tJ14pCisgICAgfCAgIGUgJygnXiBleHByZXNzaW9uTGlzdD8gJyknIQorICAgIHwgICAoJysnXnwnLSdefCcrKydefCctLSdeKSBlCisgICAgfCAgICgnfidefCchJ14pIGUKKyAgICB8ICAgZSAoJyonXnwnLydefCclJ14pIGUKKyAgICB8ICAgZSAoJysnXnwnLSdeKSBlCisgICAgfCAgIGUgKCc8JyAnPCcgfCAnPicgJz4nICc+JyB8ICc+JyAnPicpIGUKKyAgICB8ICAgZSAoJzw9J14gfCAnPj0nXiB8ICc+J14gfCAnPCdeKSBlCisgICAgfCAgIGUgJ2luc3RhbmNlb2YnXiBlCisgICAgfCAgIGUgKCc9PSdeIHwgJyE9J14pIGUKKyAgICB8ICAgZSAnJideIGUKKyAgICB8ICAgZSAnXic8YXNzb2M9cmlnaHQ+XiBlCisgICAgfCAgIGUgJ3wnXiBlCisgICAgfCAgIGUgJyYmJ14gZQorICAgIHwgICBlICd8fCdeIGUKKy8vICAgIHwgICBlICc/JyBlICc6JyBlCisgICAgfCAgIGUgKCc9Jzxhc3NvYz1yaWdodD5eCisgICAgICAgICAgfCcrPSc8YXNzb2M9cmlnaHQ+XgorICAgICAgICAgIHwnLT0nPGFzc29jPXJpZ2h0Pl4KKyAgICAgICAgICB8Jyo9Jzxhc3NvYz1yaWdodD5eCisgICAgICAgICAgfCcvPSc8YXNzb2M9cmlnaHQ+XgorICAgICAgICAgIHwnJj0nPGFzc29jPXJpZ2h0Pl4KKyAgICAgICAgICB8J3w9Jzxhc3NvYz1yaWdodD5eCisgICAgICAgICAgfCdePSc8YXNzb2M9cmlnaHQ+XgorICAgICAgICAgIHwnPj49Jzxhc3NvYz1yaWdodD5eCisgICAgICAgICAgfCc+Pj49Jzxhc3NvYz1yaWdodD5eCisgICAgICAgICAgfCc8PD0nPGFzc29jPXJpZ2h0Pl4KKyAgICAgICAgICB8Jzw8PD0nPGFzc29jPXJpZ2h0Pl4KKyAgICAgICAgICB8JyU9Jzxhc3NvYz1yaWdodD5eKSBlCisgICAgOworCitleHByZXNzaW9uTGlzdAorCToJZSAoJywnISBlKSoKKwk7CisKK3R5cGU6IElEIAorCXwgSUQgJ1snXiAnXSchCisJfCAnaW50JworCXwgJ2ludCcgJ1snXiAnXSchIAorCTsKKworLyoKKyAqIExleGVyIFJ1bGVzCisgKi8KKworV1MKKyAgICA6ICAgKCcgJyB8ICdcdCcgfCAnXG4nIHwgJ1xyJykge1NraXAoKTt9CisgICAgOworCitJRAorCToJKCdhJy4uJ3onIHwgJ0EnLi4nWicgfCAnXycpICgnYScuLid6JyB8ICdBJy4uJ1onIHwgJzAnLi4nOScgfCAnXycpKgorCTsKKworSU5UCisJOgknMCcuLic5JysKKwk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0RXhwcmVzc2lvbkZlYXR1cmVzLmczLmxleGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMy5sZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQzZDhlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEV4cHJlc3Npb25GZWF0dXJlcy5nMy5sZXhlci5jcwpAQCAtMCwwICsxLDM4IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyMy5SdW50aW1lLlRlc3QKK3sKKyAgICBwYXJ0aWFsIGNsYXNzIFRlc3RFeHByZXNzaW9uRmVhdHVyZXNMZXhlcgorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0RXhwcmVzc2lvbkZlYXR1cmVzLmczLnBhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1Rlc3RFeHByZXNzaW9uRmVhdHVyZXMuZzMucGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdC9UZXN0RXhwcmVzc2lvbkZlYXR1cmVzLmczLnBhcnNlci5jcwpAQCAtMCwwICsxLDM4IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyMy5SdW50aW1lLlRlc3QKK3sKKyAgICBwYXJ0aWFsIGNsYXNzIFRlc3RFeHByZXNzaW9uRmVhdHVyZXNQYXJzZXIKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3QvVGVzdEZhc3RMZXhlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1Rlc3RGYXN0TGV4ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYzMyOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0L1Rlc3RGYXN0TGV4ZXIuY3MKQEAgLTAsMCArMSw5NCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIzLlJ1bnRpbWUuVGVzdAoreworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lOworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKKyAgICB1c2luZyBNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRlc3RUb29scy5Vbml0VGVzdGluZzsKKyAgICB1c2luZyBTeXN0ZW0uVGV4dDsKKworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRlc3RGYXN0TGV4ZXIKKyAgICB7CisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUZXN0QmFzaWNGYXN0TGV4ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaW5wdXRFbGVtZW50ID0gIngtMjM1NipBYnRlKzMyK2Vuby82NjIzK3kiOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIGlucHV0RWxlbWVudCwgMTAwMDAwMCAqIGlucHV0RWxlbWVudC5MZW5ndGggKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IDk5OTk5OTsgaSsrICkKKyAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCggaW5wdXRFbGVtZW50ICk7CisKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYnVpbGRlci5Ub1N0cmluZygpOworICAgICAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSA1OworICAgICAgICAgICAgLy8gd2FybXVwCisgICAgICAgICAgICBJdGVyYXRlRmFzdCggdGV4dCwgaXRlcmF0aW9ucyApOworICAgICAgICAgICAgSXRlcmF0ZSggdGV4dCwgaXRlcmF0aW9ucyApOworCisgICAgICAgICAgICB2YXIgdGltZSA9IEl0ZXJhdGUoIHRleHQsIGl0ZXJhdGlvbnMgKTsKKyAgICAgICAgICAgIHZhciB0aW1lRmFzdCA9IEl0ZXJhdGVGYXN0KCB0ZXh0LCBpdGVyYXRpb25zICk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiRWxhcHNlZCB0aW1lIChub3JtKTogezB9IHNlY29uZHMuIiwgdGltZS5Ub3RhbFNlY29uZHMgKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAiRWxhcHNlZCB0aW1lIChmYXN0KTogezB9IHNlY29uZHMuIiwgdGltZUZhc3QuVG90YWxTZWNvbmRzICk7CisgICAgICAgIH0KKworICAgICAgICBUaW1lU3BhbiBJdGVyYXRlKCBzdHJpbmcgdGV4dCwgaW50IGNvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0ZVRpbWUgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNpbXBsZUV4cHJlc3Npb25MZXhlciBsZXhlciA9IG5ldyBTaW1wbGVFeHByZXNzaW9uTGV4ZXIoIG5ldyBBTlRMUlN0cmluZ1N0cmVhbSggdGV4dCApICk7CisgICAgICAgICAgICAgICAgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKCBsZXhlciApOworICAgICAgICAgICAgICAgIHRva2Vucy5GaWxsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5Ob3cgLSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIFRpbWVTcGFuIEl0ZXJhdGVGYXN0KCBzdHJpbmcgdGV4dCwgaW50IGNvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0ZVRpbWUgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZhc3RTaW1wbGVFeHByZXNzaW9uTGV4ZXIgbGV4ZXIgPSBuZXcgRmFzdFNpbXBsZUV4cHJlc3Npb25MZXhlciggbmV3IFNsaW1TdHJpbmdTdHJlYW0oIHRleHQgKSApOworICAgICAgICAgICAgICAgIEZhc3RUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgRmFzdFRva2VuU3RyZWFtKCBsZXhlciApOworICAgICAgICAgICAgICAgIC8vRmFzdFRva2VuU3RyZWFtPFNsaW1Ub2tlbj4gdG9rZW5zID0gbmV3IEZhc3RUb2tlblN0cmVhbTxTbGltVG9rZW4+KCBsZXhlciApOworICAgICAgICAgICAgICAgIHRva2Vucy5GaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5Ob3cgLSBzdGFydDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS5zbG4gYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTAxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuc2xuCkBAIC0wLDAgKzEsMzYgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTAuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDA4CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkFudGxyMy5SdW50aW1lIiwgIkFudGxyMy5SdW50aW1lXEFudGxyMy5SdW50aW1lLmNzcHJvaiIsICJ7OEZEQzBBODctOTAwNS00RDVBLUFCNzUtRTU1Q0VCNTc1NTU5fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQW50bHIzLlJ1bnRpbWUuRGVidWciLCAiQW50bHIzLlJ1bnRpbWUuRGVidWdcQW50bHIzLlJ1bnRpbWUuRGVidWcuY3Nwcm9qIiwgIns1RUUyN0E5MC1CMDIzLTQyQzktQUFGMS01MkIwNDI0QzVEMEJ9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb3VyY2VDb2RlQ29udHJvbCkgPSBwcmVTb2x1dGlvbgorCQlTY2NOdW1iZXJPZlByb2plY3RzID0gMworCQlTY2NMb2NhbFBhdGgwID0gLgorCQlTY2NQcm9qZWN0VW5pcXVlTmFtZTEgPSBBbnRscjMuUnVudGltZVxcQW50bHIzLlJ1bnRpbWUuY3Nwcm9qCisJCVNjY0xvY2FsUGF0aDEgPSAuCisJCVNjY1Byb2plY3RGaWxlUGF0aFJlbGF0aXZpemVkRnJvbUNvbm5lY3Rpb24xID0gQW50bHIzLlJ1bnRpbWVcXAorCQlTY2NQcm9qZWN0VW5pcXVlTmFtZTIgPSBBbnRscjMuUnVudGltZS5EZWJ1Z1xcQW50bHIzLlJ1bnRpbWUuRGVidWcuY3Nwcm9qCisJCVNjY0xvY2FsUGF0aDIgPSAuCisJCVNjY1Byb2plY3RGaWxlUGF0aFJlbGF0aXZpemVkRnJvbUNvbm5lY3Rpb24yID0gQW50bHIzLlJ1bnRpbWUuRGVidWdcXAorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezhGREMwQTg3LTkwMDUtNEQ1QS1BQjc1LUU1NUNFQjU3NTU1OX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs4RkRDMEE4Ny05MDA1LTRENUEtQUI3NS1FNTVDRUI1NzU1NTl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezhGREMwQTg3LTkwMDUtNEQ1QS1BQjc1LUU1NUNFQjU3NTU1OX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OEZEQzBBODctOTAwNS00RDVBLUFCNzUtRTU1Q0VCNTc1NTU5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NUVFMjdBOTAtQjAyMy00MkM5LUFBRjEtNTJCMDQyNEM1RDBCfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezVFRTI3QTkwLUIwMjMtNDJDOS1BQUYxLTUyQjA0MjRDNUQwQn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NUVFMjdBOTAtQjAyMy00MkM5LUFBRjEtNTJCMDQyNEM1RDBCfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs1RUUyN0E5MC1CMDIzLTQyQzktQUFGMS01MkIwNDI0QzVEMEJ9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLnZzc3NjYyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS52c3NzY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiMDMxYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS52c3NzY2MKQEAgLTAsMCArMSwxMCBAQAor77u/IiIKK3sKKyJGSUxFX1ZFUlNJT04iID0gIjkyMzciCisiRU5MSVNUTUVOVF9DSE9JQ0UiID0gIk5FVkVSIgorIlBST0pFQ1RfRklMRV9SRUxBVElWRV9QQVRIIiA9ICIiCisiTlVNQkVSX09GX0VYQ0xVREVEX0ZJTEVTIiA9ICIwIgorIk9SSUdJTkFMX1BST0pFQ1RfRklMRV9QQVRIIiA9ICIiCisiTlVNQkVSX09GX05FU1RFRF9QUk9KRUNUUyIgPSAiMCIKKyJTT1VSQ0VfQ09OVFJPTF9TRVRUSU5HU19QUk9WSURFUiIgPSAiUFJPSkVDVCIKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BTlRMUkZpbGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzI1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmNzCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nOworICAgIHVzaW5nIEZpbGUgPSBTeXN0ZW0uSU8uRmlsZTsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhpcyBpcyBhIGNoYXIgYnVmZmVyIHN0cmVhbSB0aGF0IGlzIGxvYWRlZCBmcm9tIGEgZmlsZQorICAgICAqICBhbGwgYXQgb25jZSB3aGVuIHlvdSBjb25zdHJ1Y3QgdGhlIG9iamVjdC4gIFRoaXMgbG9va3MgdmVyeQorICAgICAqICBtdWNoIGxpa2UgYW4gQU5UTFJlYWRlciBvciBBTlRMUklucHV0U3RyZWFtLCBidXQgaXQncyBhIHNwZWNpYWwgY2FzZQorICAgICAqICBzaW5jZSB3ZSBrbm93IHRoZSBleGFjdCBzaXplIG9mIHRoZSBvYmplY3QgdG8gbG9hZC4gIFdlIGNhbiBhdm9pZCBsb3RzCisgICAgICogIG9mIGRhdGEgY29weWluZy4gCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBbU3lzdGVtLlNlY3VyaXR5LlBlcm1pc3Npb25zLkZpbGVJT1Blcm1pc3Npb24oU3lzdGVtLlNlY3VyaXR5LlBlcm1pc3Npb25zLlNlY3VyaXR5QWN0aW9uLkRlbWFuZCwgVW5yZXN0cmljdGVkID0gdHJ1ZSldCisgICAgcHVibGljIGNsYXNzIEFOVExSRmlsZVN0cmVhbSA6IEFOVExSU3RyaW5nU3RyZWFtCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgc3RyaW5nIGZpbGVOYW1lOworCisgICAgICAgIHB1YmxpYyBBTlRMUkZpbGVTdHJlYW0oIHN0cmluZyBmaWxlTmFtZSApIAorICAgICAgICAgICAgOiB0aGlzKCBmaWxlTmFtZSwgbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUkZpbGVTdHJlYW0oIHN0cmluZyBmaWxlTmFtZSwgRW5jb2RpbmcgZW5jb2RpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICAgICAgICBMb2FkKCBmaWxlTmFtZSwgZW5jb2RpbmcgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTG9hZCggc3RyaW5nIGZpbGVOYW1lLCBFbmNvZGluZyBlbmNvZGluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZmlsZU5hbWUgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmcgdGV4dDsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRleHQgPSBGaWxlLlJlYWRBbGxUZXh0KGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZXh0ID0gRmlsZS5SZWFkQWxsVGV4dChmaWxlTmFtZSwgZW5jb2RpbmcpOworCisgICAgICAgICAgICBkYXRhID0gdGV4dC5Ub0NoYXJBcnJheSgpOworICAgICAgICAgICAgbiA9IGRhdGEuTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BTlRMUklucHV0U3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FOVExSSW5wdXRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNmI2MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BTlRMUklucHV0U3RyZWFtLmNzCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBFbmNvZGluZyA9IFN5c3RlbS5UZXh0LkVuY29kaW5nOworICAgIHVzaW5nIFN0cmVhbSA9IFN5c3RlbS5JTy5TdHJlYW07CisgICAgdXNpbmcgU3RyZWFtUmVhZGVyID0gU3lzdGVtLklPLlN0cmVhbVJlYWRlcjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBraW5kIG9mIFJlYWRlclN0cmVhbSB0aGF0IHB1bGxzIGZyb20gYW4gSW5wdXRTdHJlYW0uCisgICAgICogIFVzZWZ1bCBmb3IgcmVhZGluZyBmcm9tIHN0ZGluIGFuZCBzcGVjaWZ5aW5nIGZpbGUgZW5jb2RpbmdzIGV0Yy4uLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEFOVExSSW5wdXRTdHJlYW0gOiBBTlRMUlJlYWRlclN0cmVhbQorICAgIHsKKyAgICAgICAgcHVibGljIEFOVExSSW5wdXRTdHJlYW0oIFN0cmVhbSBpbnB1dCApCisgICAgICAgICAgICA6IHRoaXMoIGlucHV0LCBudWxsICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFOVExSSW5wdXRTdHJlYW0oIFN0cmVhbSBpbnB1dCwgaW50IHNpemUgKQorICAgICAgICAgICAgOiB0aGlzKCBpbnB1dCwgc2l6ZSwgbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUklucHV0U3RyZWFtKCBTdHJlYW0gaW5wdXQsIEVuY29kaW5nIGVuY29kaW5nICkKKyAgICAgICAgICAgIDogdGhpcyggaW5wdXQsIEluaXRpYWxCdWZmZXJTaXplLCBlbmNvZGluZyApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUklucHV0U3RyZWFtKCBTdHJlYW0gaW5wdXQsIGludCBzaXplLCBFbmNvZGluZyBlbmNvZGluZyApCisgICAgICAgICAgICA6IHRoaXMoIGlucHV0LCBzaXplLCBSZWFkQnVmZmVyU2l6ZSwgZW5jb2RpbmcgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQU5UTFJJbnB1dFN0cmVhbSggU3RyZWFtIGlucHV0LCBpbnQgc2l6ZSwgaW50IHJlYWRCdWZmZXJTaXplLCBFbmNvZGluZyBlbmNvZGluZyApCisgICAgICAgICAgICA6IGJhc2UoR2V0U3RyZWFtUmVhZGVyKGlucHV0LCBlbmNvZGluZyksIHNpemUsIHJlYWRCdWZmZXJTaXplKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJlYW1SZWFkZXIgR2V0U3RyZWFtUmVhZGVyKFN0cmVhbSBpbnB1dCwgRW5jb2RpbmcgZW5jb2RpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtUmVhZGVyKGlucHV0LCBlbmNvZGluZyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVJlYWRlcihpbnB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQU5UTFJSZWFkZXJTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQU5UTFJSZWFkZXJTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlY2MyNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BTlRMUlJlYWRlclN0cmVhbS5jcwpAQCAtMCwwICsxLDkzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgVGV4dFJlYWRlciA9IFN5c3RlbS5JTy5UZXh0UmVhZGVyOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBWYWN1dW0gYWxsIGlucHV0IGZyb20gYSBSZWFkZXIgYW5kIHRoZW4gdHJlYXQgaXQgbGlrZSBhIFN0cmluZ1N0cmVhbS4KKyAgICAgKiAgTWFuYWdlIHRoZSBidWZmZXIgbWFudWFsbHkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZGF0YSBjb3B5aW5nLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIElmIHlvdSBuZWVkIGVuY29kaW5nLCB1c2UgQU5UTFJJbnB1dFN0cmVhbS4KKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBBTlRMUlJlYWRlclN0cmVhbSA6IEFOVExSU3RyaW5nU3RyZWFtCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFJlYWRCdWZmZXJTaXplID0gMTAyNDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJbml0aWFsQnVmZmVyU2l6ZSA9IDEwMjQ7CisKKyAgICAgICAgcHVibGljIEFOVExSUmVhZGVyU3RyZWFtKCBUZXh0UmVhZGVyIHIgKQorICAgICAgICAgICAgOiB0aGlzKCByLCBJbml0aWFsQnVmZmVyU2l6ZSwgUmVhZEJ1ZmZlclNpemUgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQU5UTFJSZWFkZXJTdHJlYW0oIFRleHRSZWFkZXIgciwgaW50IHNpemUgKQorICAgICAgICAgICAgOiB0aGlzKCByLCBzaXplLCBSZWFkQnVmZmVyU2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUlJlYWRlclN0cmVhbSggVGV4dFJlYWRlciByLCBpbnQgc2l6ZSwgaW50IHJlYWRDaHVua1NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBMb2FkKCByLCBzaXplLCByZWFkQ2h1bmtTaXplICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIExvYWQoIFRleHRSZWFkZXIgciwgaW50IHNpemUsIGludCByZWFkQ2h1bmtTaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCByID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc2l6ZSA8PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gSW5pdGlhbEJ1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHJlYWRDaHVua1NpemUgPD0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZENodW5rU2l6ZSA9IFJlYWRCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJsb2FkICIrc2l6ZSsiIGluIGNodW5rcyBvZiAiK3JlYWRDaHVua1NpemUpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YSA9IHIuUmVhZFRvRW5kKCkuVG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBiYXNlLm4gPSBkYXRhLkxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByLkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwNDY4MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5jcwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIEFyZ3VtZW50RXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uOworICAgIHVzaW5nIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb247CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBwcmV0dHkgcXVpY2sgQ2hhclN0cmVhbSB0aGF0IHB1bGxzIGFsbCBkYXRhIGZyb20gYW4gYXJyYXkKKyAgICAgKiAgZGlyZWN0bHkuICBFdmVyeSBtZXRob2QgY2FsbCBjb3VudHMgaW4gdGhlIGxleGVyLiAgSmF2YSdzCisgICAgICogIHN0cmluZ3MgYXJlbid0IHZlcnkgZ29vZCBzbyBJJ20gYXZvaWRpbmcuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQU5UTFJTdHJpbmdTdHJlYW0gOiBJQ2hhclN0cmVhbQorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBkYXRhIGJlaW5nIHNjYW5uZWQ8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBjaGFyW10gZGF0YTsKKworICAgICAgICAvKiogPHN1bW1hcnk+SG93IG1hbnkgY2hhcmFjdGVycyBhcmUgYWN0dWFsbHkgaW4gdGhlIGJ1ZmZlcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBuOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4wLi5uLTEgaW5kZXggaW50byBzdHJpbmcgb2YgbmV4dCBjaGFyPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IHAgPSAwOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5saW5lIG51bWJlciAxLi5uIHdpdGhpbiB0aGUgaW5wdXQ8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBsaW5lID0gMTsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5uLTE8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBjaGFyUG9zaXRpb25JbkxpbmUgPSAwOworCisgICAgICAgIC8qKiA8c3VtbWFyeT50cmFja3MgaG93IGRlZXAgbWFyaygpIGNhbGxzIGFyZSBuZXN0ZWQ8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbWFya0RlcHRoID0gMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIGxpc3Qgb2YgQ2hhclN0cmVhbVN0YXRlIG9iamVjdHMgdGhhdCB0cmFja3MgdGhlIHN0cmVhbSBzdGF0ZQorICAgICAgICAgKiAgdmFsdWVzIGxpbmUsIGNoYXJQb3NpdGlvbkluTGluZSwgYW5kIHAgdGhhdCBjYW4gY2hhbmdlIGFzIHlvdQorICAgICAgICAgKiAgbW92ZSB0aHJvdWdoIHRoZSBpbnB1dCBzdHJlYW0uICBJbmRleGVkIGZyb20gMS4ubWFya0RlcHRoLgorICAgICAgICAgKiAgQSBudWxsIGlzIGtlcHQgQCBpbmRleCAwLiAgQ3JlYXRlIHVwb24gZmlyc3QgY2FsbCB0byBtYXJrKCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSUxpc3Q8Q2hhclN0cmVhbVN0YXRlPiBtYXJrZXJzOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdE1hcmtlcjsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCBpcyBuYW1lIG9yIHNvdXJjZSBvZiB0aGlzIGNoYXIgc3RyZWFtPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHN0cmluZyBuYW1lOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Db3B5IGRhdGEgaW4gc3RyaW5nIHRvIGEgbG9jYWwgY2hhciBhcnJheTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIEFOVExSU3RyaW5nU3RyZWFtKCBzdHJpbmcgaW5wdXQgKQorICAgICAgICAgICAgOiB0aGlzKCBpbnB1dCwgbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBTlRMUlN0cmluZ1N0cmVhbSggc3RyaW5nIGlucHV0LCBzdHJpbmcgc291cmNlTmFtZSApCisgICAgICAgICAgICA6IHRoaXMoIGlucHV0LlRvQ2hhckFycmF5KCksIGlucHV0Lkxlbmd0aCwgc291cmNlTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGlzIGlzIHRoZSBwcmVmZXJyZWQgY29uc3RydWN0b3IgYXMgbm8gZGF0YSBpcyBjb3BpZWQ8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBBTlRMUlN0cmluZ1N0cmVhbSggY2hhcltdIGRhdGEsIGludCBudW1iZXJPZkFjdHVhbENoYXJzSW5BcnJheSApCisgICAgICAgICAgICA6IHRoaXMoIGRhdGEsIG51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5LCBudWxsICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFOVExSU3RyaW5nU3RyZWFtKCBjaGFyW10gZGF0YSwgaW50IG51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5LCBzdHJpbmcgc291cmNlTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiZGF0YSIpOworICAgICAgICAgICAgaWYgKG51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5IDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAobnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXkgPiBkYXRhLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgICAgIHRoaXMubiA9IG51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5OworICAgICAgICAgICAgdGhpcy5uYW1lID0gc291cmNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBBTlRMUlN0cmluZ1N0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBjaGFyWzBdOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCBpbmRleCAwLi5uIHdoZXJlIG4gaW5kaWNhdGVzIHRoZQorICAgICAgICAgKiAgbGFzdCBzeW1ib2wgaGFzIGJlZW4gcmVhZC4gIFRoZSBpbmRleCBpcyB0aGUgaW5kZXggb2YgY2hhciB0bworICAgICAgICAgKiAgYmUgcmV0dXJuZWQgZnJvbSBMQSgxKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBpdCdzIGluIHRoZSBzYW1lIHN0YXRlIGl0IHdhcworICAgICAgICAgKiAgd2hlbiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkICpleGNlcHQqIHRoZSBkYXRhIGFycmF5IGlzIG5vdAorICAgICAgICAgKiAgdG91Y2hlZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgIGxpbmUgPSAxOworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKyAgICAgICAgICAgIG1hcmtEZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENvbnN1bWUoKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicHJldiBwPSIrcCsiLCBjPSIrKGNoYXIpZGF0YVtwXSk7CisgICAgICAgICAgICBpZiAoIHAgPCBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUrKzsKKyAgICAgICAgICAgICAgICBpZiAoIGRhdGFbcF0gPT0gJ1xuJyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5ld2xpbmUgY2hhciBmb3VuZCBvbiBsaW5lOiAiK2xpbmUrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQCBwb3M9IitjaGFyUG9zaXRpb25JbkxpbmUpOworICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsaW5lKys7CisgICAgICAgICAgICAgICAgICAgIGNoYXJQb3NpdGlvbkluTGluZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicCBtb3ZlcyB0byAiK3ArIiAoYz0nIisoY2hhcilkYXRhW3BdKyInKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gdW5kZWZpbmVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGkgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7IC8vIGUuZy4sIHRyYW5zbGF0ZSBMQSgtMSkgdG8gdXNlIG9mZnNldCBpPTA7IHRoZW4gZGF0YVtwKzAtMV0KKyAgICAgICAgICAgICAgICBpZiAoICggcCArIGkgLSAxICkgPCAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZTsgLy8gaW52YWxpZDsgbm8gY2hhciBiZWZvcmUgZmlyc3QgY2hhcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoIHAgKyBpIC0gMSApID49IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjaGFyIExBKCIraSsiKT1FT0Y7IHA9IitwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2hhciBMQSgiK2krIik9IisoY2hhcilkYXRhW3AraS0xXSsiOyBwPSIrcCk7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiTEEoIitpKyIpOyBwPSIrcCsiIG49IituKyIgZGF0YS5sZW5ndGg9IitkYXRhLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtwICsgaSAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExUKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMQSggaSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1hcmsoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG1hcmtlcnMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFya2VycyA9IG5ldyBMaXN0PENoYXJTdHJlYW1TdGF0ZT4oKTsKKyAgICAgICAgICAgICAgICBtYXJrZXJzLkFkZCggbnVsbCApOyAvLyBkZXB0aCAwIG1lYW5zIG5vIGJhY2t0cmFja2luZywgbGVhdmUgYmxhbmsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcmtEZXB0aCsrOworICAgICAgICAgICAgQ2hhclN0cmVhbVN0YXRlIHN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIGlmICggbWFya0RlcHRoID49IG1hcmtlcnMuQ291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlID0gbmV3IENoYXJTdHJlYW1TdGF0ZSgpOworICAgICAgICAgICAgICAgIG1hcmtlcnMuQWRkKCBzdGF0ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlID0gbWFya2Vyc1ttYXJrRGVwdGhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUucCA9IHA7CisgICAgICAgICAgICBzdGF0ZS5saW5lID0gbGluZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYXJQb3NpdGlvbkluTGluZSA9IGNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgIGxhc3RNYXJrZXIgPSBtYXJrRGVwdGg7CisgICAgICAgICAgICByZXR1cm4gbWFya0RlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoIGludCBtICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG0gPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgLy9pZiAobSA+IG1hcmtEZXB0aCkKKyAgICAgICAgICAgIC8vICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBDaGFyU3RyZWFtU3RhdGUgc3RhdGUgPSBtYXJrZXJzW21dOworICAgICAgICAgICAgLy8gcmVzdG9yZSBzdHJlYW0gc3RhdGUKKyAgICAgICAgICAgIFNlZWsoIHN0YXRlLnAgKTsKKyAgICAgICAgICAgIGxpbmUgPSBzdGF0ZS5saW5lOworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gc3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgUmVsZWFzZSggbSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZXdpbmQoIGxhc3RNYXJrZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZSggaW50IG1hcmtlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHVud2luZCBhbnkgb3RoZXIgbWFya2VycyBtYWRlIGFmdGVyIG0gYW5kIHJlbGVhc2UgbQorICAgICAgICAgICAgbWFya0RlcHRoID0gbWFya2VyOworICAgICAgICAgICAgLy8gcmVsZWFzZSB0aGlzIG1hcmtlcgorICAgICAgICAgICAgbWFya0RlcHRoLS07CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBjb25zdW1lKCkgYWhlYWQgdW50aWwgcD09aW5kZXg7IGNhbid0IGp1c3Qgc2V0IHA9aW5kZXggYXMgd2UgbXVzdAorICAgICAgICAgKiAgdXBkYXRlIGxpbmUgYW5kIGNoYXJQb3NpdGlvbkluTGluZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2VlayggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbmRleCA8PSBwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwID0gaW5kZXg7IC8vIGp1c3QganVtcDsgZG9uJ3QgdXBkYXRlIHN0cmVhbSBzdGF0ZSAobGluZSwgLi4uKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNlZWsgZm9yd2FyZCwgY29uc3VtZSB1bnRpbCBwIGhpdHMgaW5kZXgKKyAgICAgICAgICAgIHdoaWxlICggcCA8IGluZGV4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU3Vic3RyaW5nKCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChzdGFydCArIGxlbmd0aCA+IGRhdGEuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBzdHJpbmcoIGRhdGEsIHN0YXJ0LCBsZW5ndGggKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgc3RyaW5nKGRhdGEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyMy5SdW50aW1lLmNzcHJvaiBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRscjMuUnVudGltZS5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlNGJmNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRscjMuUnVudGltZS5jc3Byb2oKQEAgLTAsMCArMSwxNDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezhGREMwQTg3LTkwMDUtNEQ1QS1BQjc1LUU1NUNFQjU3NTU1OX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkFudGxyLlJ1bnRpbWU8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5BbnRscjMuUnVudGltZTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYyLjA8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxTY2NQcm9qZWN0TmFtZT5TQUs8L1NjY1Byb2plY3ROYW1lPgorICAgIDxTY2NMb2NhbFBhdGg+U0FLPC9TY2NMb2NhbFBhdGg+CisgICAgPFNjY0F1eFBhdGg+U0FLPC9TY2NBdXhQYXRoPgorICAgIDxTY2NQcm92aWRlcj5TQUs8L1NjY1Byb3ZpZGVyPgorICAgIDxTaWduQXNzZW1ibHk+dHJ1ZTwvU2lnbkFzc2VtYmx5PgorICAgIDxBc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPi4uXC4uXC4uXC4uXC4uXC4uXC4uXGtleXNcYW50bHJcS2V5LnNuazwvQXNzZW1ibHlPcmlnaW5hdG9yS2V5RmlsZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgICA8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFOVExSRmlsZVN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBTlRMUklucHV0U3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFOVExSUmVhZGVyU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFOVExSU3RyaW5nU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzdFBhcnNlclJ1bGVSZXR1cm5TY29wZWAyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkJhc2VSZWNvZ25pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkJpdFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJCdWZmZXJlZFRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNoYXJTdHJlYW1Db25zdGFudHMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ2hhclN0cmVhbVN0YXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNsYXNzaWNUb2tlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21tb25Ub2tlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb21tb25Ub2tlblN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZWJ1Z1xJRGVidWdFdmVudExpc3RlbmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkRGQS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJFYXJseUV4aXRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkdyYW1tYXJSdWxlQXR0cmlidXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklBc3RSdWxlUmV0dXJuU2NvcGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSUFzdFJ1bGVSZXR1cm5TY29wZWAxLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklDaGFyU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklJbnRTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVJ1bGVSZXR1cm5TY29wZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJUnVsZVJldHVyblNjb3BlYDEuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVRlbXBsYXRlUnVsZVJldHVyblNjb3BlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZWAxLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklUb2tlbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJJVG9rZW5Tb3VyY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iSVRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IklUb2tlblN0cmVhbUluZm9ybWF0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkxlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkxleGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc2NcRmFzdFF1ZXVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc2NcRnVuY3Rpb25EZWxlZ2F0ZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWlzY1xMaXN0U3RhY2tgMS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNjXExvb2thaGVhZFN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5vVmlhYmxlQWx0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjb2duaXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUmVjb2duaXplclNoYXJlZFN0YXRlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlbXBsYXRlUGFyc2VyUnVsZVJldHVyblNjb3BlYDIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVG9rZW5DaGFubmVscy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUb2tlblJld3JpdGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVG9rZW5zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRva2VuVHlwZXMuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxBc3RUcmVlUnVsZVJldHVyblNjb3BlYDIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxCYXNlVHJlZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXEJhc2VUcmVlQWRhcHRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXEFudGxyUnVudGltZV9CYXNlVHJlZURlYnVnVmlldy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxDb21tb25FcnJvck5vZGUuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxDb21tb25UcmVlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyZWVcQ29tbW9uVHJlZUFkYXB0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxDb21tb25UcmVlTm9kZVN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXERvdFRyZWVHZW5lcmF0b3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxJVHJlZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXElUcmVlQWRhcHRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXElUcmVlTm9kZVN0cmVhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXElUcmVlVmlzaXRvckFjdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFBhcnNlVHJlZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxSZXdyaXRlUnVsZU5vZGVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyZWVcVGVtcGxhdGVUcmVlUnVsZVJldHVyblNjb3BlYDIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxUcmVlRmlsdGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyZWVcVHJlZUl0ZXJhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyZWVcVHJlZVBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFRyZWVQYXR0ZXJuTGV4ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJlZVxUcmVlUGF0dGVyblBhcnNlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFRyZWVSZXdyaXRlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFRyZWVSdWxlUmV0dXJuU2NvcGVgMS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmVlXFRyZWVWaXNpdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyZWVcVHJlZVdpemFyZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iLi5cLi5cLi5cLi5cLi5cLi5cLi5ca2V5c1xhbnRsclxLZXkuc25rIj4KKyAgICAgIDxMaW5rPktleS5zbms8L0xpbms+CisgICAgPC9Ob25lPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIzLlJ1bnRpbWUuY3Nwcm9qLnZzcHNjYyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRscjMuUnVudGltZS5jc3Byb2oudnNwc2NjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDMyODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIzLlJ1bnRpbWUuY3Nwcm9qLnZzcHNjYwpAQCAtMCwwICsxLDEwIEBACivvu78iIgoreworIkZJTEVfVkVSU0lPTiIgPSAiOTIzNyIKKyJFTkxJU1RNRU5UX0NIT0lDRSIgPSAiTkVWRVIiCisiUFJPSkVDVF9GSUxFX1JFTEFUSVZFX1BBVEgiID0gIiIKKyJOVU1CRVJfT0ZfRVhDTFVERURfRklMRVMiID0gIjAiCisiT1JJR0lOQUxfUFJPSkVDVF9GSUxFX1BBVEgiID0gIiIKKyJOVU1CRVJfT0ZfTkVTVEVEX1BST0pFQ1RTIiA9ICIwIgorIlNPVVJDRV9DT05UUk9MX1NFVFRJTkdTX1BST1ZJREVSIiA9ICJQUk9WSURFUiIKK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQXN0UGFyc2VyUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Bc3RQYXJzZXJSdWxlUmV0dXJuU2NvcGVcMTQwMi5jcyIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViZTMyZAotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQXN0UGFyc2VyUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiCkBAIC0wLDAgKzEsNjAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHB1YmxpYyBjbGFzcyBBc3RQYXJzZXJSdWxlUmV0dXJuU2NvcGU8VFRyZWUsIFRUb2tlbj4gOiBQYXJzZXJSdWxlUmV0dXJuU2NvcGU8VFRva2VuPiwgSUFzdFJ1bGVSZXR1cm5TY29wZTxUVHJlZT4sIElBc3RSdWxlUmV0dXJuU2NvcGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFRyZWUgX3RyZWU7CisKKyAgICAgICAgcHVibGljIFRUcmVlIFRyZWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdHJlZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2JqZWN0IElBc3RSdWxlUmV0dXJuU2NvcGUuVHJlZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9CYXNlUmVjb2duaXplci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9CYXNlUmVjb2duaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmExOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0Jhc2VSZWNvZ25pemVyLmNzCkBAIC0wLDAgKzEsMTE4NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBBcnJheSA9IFN5c3RlbS5BcnJheTsKKyAgICB1c2luZyBDb25kaXRpb25hbCA9IFN5c3RlbS5EaWFnbm9zdGljcy5Db25kaXRpb25hbEF0dHJpYnV0ZTsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIElEZWJ1Z0V2ZW50TGlzdGVuZXIgPSBBbnRsci5SdW50aW1lLkRlYnVnLklEZWJ1Z0V2ZW50TGlzdGVuZXI7CisgICAgdXNpbmcgTWV0aG9kQmFzZSA9IFN5c3RlbS5SZWZsZWN0aW9uLk1ldGhvZEJhc2U7CisgICAgdXNpbmcgTm90U3VwcG9ydGVkRXhjZXB0aW9uID0gU3lzdGVtLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKKyAgICB1c2luZyBSZWdleCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleDsKKyAgICB1c2luZyBTdGFja0ZyYW1lID0gU3lzdGVtLkRpYWdub3N0aWNzLlN0YWNrRnJhbWU7CisgICAgdXNpbmcgU3RhY2tUcmFjZSA9IFN5c3RlbS5EaWFnbm9zdGljcy5TdGFja1RyYWNlOworICAgIHVzaW5nIFRleHRXcml0ZXIgPSBTeXN0ZW0uSU8uVGV4dFdyaXRlcjsKKyAgICB1c2luZyBUeXBlID0gU3lzdGVtLlR5cGU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgZ2VuZXJpYyByZWNvZ25pemVyIHRoYXQgY2FuIGhhbmRsZSByZWNvZ25pemVycyBnZW5lcmF0ZWQgZnJvbQorICAgICAqICBsZXhlciwgcGFyc2VyLCBhbmQgdHJlZSBncmFtbWFycy4gIFRoaXMgaXMgYWxsIHRoZSBwYXJzaW5nCisgICAgICogIHN1cHBvcnQgY29kZSBlc3NlbnRpYWxseTsgbW9zdCBvZiBpdCBpcyBlcnJvciByZWNvdmVyeSBzdHVmZiBhbmQKKyAgICAgKiAgYmFja3RyYWNraW5nLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZWNvZ25pemVyCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IE1lbW9SdWxlRmFpbGVkID0gLTI7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWVtb1J1bGVVbmtub3duID0gLTE7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSW5pdGlhbEZvbGxvd1N0YWNrU2l6ZSA9IDEwMDsKKworICAgICAgICAvLyBjb3BpZXMgZnJvbSBUb2tlbiBvYmplY3QgZm9yIGNvbnZlbmllbmNlIGluIGFjdGlvbnMKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0VG9rZW5DaGFubmVsID0gVG9rZW5DaGFubmVscy5EZWZhdWx0OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEhpZGRlbiA9IFRva2VuQ2hhbm5lbHMuSGlkZGVuOworCisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTmV4dFRva2VuUnVsZU5hbWUgPSAibmV4dFRva2VuIjsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTdGF0ZSBvZiBhIGxleGVyLCBwYXJzZXIsIG9yIHRyZWUgcGFyc2VyIGFyZSBjb2xsZWN0ZWQgaW50byBhIHN0YXRlCisgICAgICAgICAqICBvYmplY3Qgc28gdGhlIHN0YXRlIGNhbiBiZSBzaGFyZWQuICBUaGlzIHNoYXJpbmcgaXMgbmVlZGVkIHRvCisgICAgICAgICAqICBoYXZlIG9uZSBncmFtbWFyIGltcG9ydCBvdGhlcnMgYW5kIHNoYXJlIHNhbWUgZXJyb3IgdmFyaWFibGVzCisgICAgICAgICAqICBhbmQgb3RoZXIgc3RhdGUgdmFyaWFibGVzLiAgSXQncyBhIGtpbmQgb2YgZXhwbGljaXQgbXVsdGlwbGUKKyAgICAgICAgICogIGluaGVyaXRhbmNlIHZpYSBkZWxlZ2F0aW9uIG9mIG1ldGhvZHMgYW5kIHNoYXJlZCBzdGF0ZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU7CisKKyAgICAgICAgcHVibGljIEJhc2VSZWNvZ25pemVyKCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCYXNlUmVjb2duaXplciggUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZSA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIEluaXRERkFzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGV4dFdyaXRlciBUcmFjZURlc3RpbmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgSW5pdERGQXMoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+cmVzZXQgdGhlIHBhcnNlcidzIHN0YXRlOyBzdWJjbGFzc2VzIG11c3QgcmV3aW5kcyB0aGUgaW5wdXQgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2FjayBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgIGlmICggc3RhdGUgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzaGFyZWQgc3RhdGUgd29yayB0byBkbworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUuX2ZzcCA9IC0xOworICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworICAgICAgICAgICAgc3RhdGUubGFzdEVycm9ySW5kZXggPSAtMTsKKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdGUuc3ludGF4RXJyb3JzID0gMDsKKyAgICAgICAgICAgIC8vIHdhY2sgZXZlcnl0aGluZyByZWxhdGVkIHRvIGJhY2t0cmFja2luZyBhbmQgbWVtb2l6YXRpb24KKyAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZyA9IDA7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IHN0YXRlLnJ1bGVNZW1vICE9IG51bGwgJiYgaSA8IHN0YXRlLnJ1bGVNZW1vLkxlbmd0aDsgaSsrICkKKyAgICAgICAgICAgIHsgLy8gd2lwZSBjYWNoZQorICAgICAgICAgICAgICAgIHN0YXRlLnJ1bGVNZW1vW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWF0Y2ggY3VycmVudCBpbnB1dCBzeW1ib2wgYWdhaW5zdCB0dHlwZS4gIEF0dGVtcHQKKyAgICAgICAgICogIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IgcmVjb3ZlcnkuICBJZgorICAgICAgICAgKiAgdGhhdCBmYWlscywgdGhyb3cgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUbyB0dXJuIG9mZiBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIGVycm9yCisgICAgICAgICAqICByZWNvdmVyeSwgb3ZlcnJpZGUgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oKSBhbmQgaGF2ZSBpdAorICAgICAgICAgKiAgdGhyb3cgYW4gZXhjZXB0aW9uLiBTZWUgVHJlZVBhcnNlci5yZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbigpLgorICAgICAgICAgKiAgVGhpcyB3YXkgYW55IGVycm9yIGluIGEgcnVsZSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBhbmQKKyAgICAgICAgICogIGltbWVkaWF0ZSBleGl0IGZyb20gcnVsZS4gIFJ1bGUgd291bGQgcmVjb3ZlciBieSByZXN5bmNocm9uaXppbmcKKyAgICAgICAgICogIHRvIHRoZSBzZXQgb2Ygc3ltYm9scyB0aGF0IGNhbiBmb2xsb3cgcnVsZSByZWYuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTWF0Y2goIElJbnRTdHJlYW0gaW5wdXQsIGludCB0dHlwZSwgQml0U2V0IGZvbGxvdyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJtYXRjaCAiKygoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKTsKKyAgICAgICAgICAgIG9iamVjdCBtYXRjaGVkU3ltYm9sID0gR2V0Q3VycmVudElucHV0U3ltYm9sKCBpbnB1dCApOworICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSggMSApID09IHR0eXBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlZFN5bWJvbCA9IFJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKCBpbnB1dCwgdHR5cGUsIGZvbGxvdyApOworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRTeW1ib2w7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+TWF0Y2ggdGhlIHdpbGRjYXJkOiBpbiBhIHN5bWJvbDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBNYXRjaEFueSggSUludFN0cmVhbSBpbnB1dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBNaXNtYXRjaElzVW53YW50ZWRUb2tlbiggSUludFN0cmVhbSBpbnB1dCwgaW50IHR0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LkxBKCAyICkgPT0gdHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIE1pc21hdGNoSXNNaXNzaW5nVG9rZW4oIElJbnRTdHJlYW0gaW5wdXQsIEJpdFNldCBmb2xsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGZvbGxvdyA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb2xsb3c7IHdlIGNhbiBvbmx5IGNvbnN1bWUKKyAgICAgICAgICAgICAgICAvLyBhIHNpbmdsZSB0b2tlbiBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjb21wdXRlIHdoYXQgY2FuIGZvbGxvdyB0aGlzIGdyYW1tYXIgZWxlbWVudCByZWZlcmVuY2UKKyAgICAgICAgICAgIGlmICggZm9sbG93Lk1lbWJlciggVG9rZW5UeXBlcy5FbmRPZlJ1bGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQml0U2V0IHZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlID0gQ29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKCk7CisgICAgICAgICAgICAgICAgZm9sbG93ID0gZm9sbG93Lk9yKCB2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSApOworICAgICAgICAgICAgICAgIGlmICggc3RhdGUuX2ZzcCA+PSAwICkKKyAgICAgICAgICAgICAgICB7IC8vIHJlbW92ZSBFT1IgaWYgd2UncmUgbm90IHRoZSBzdGFydCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93LlJlbW92ZSggVG9rZW5UeXBlcy5FbmRPZlJ1bGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIgc2V0CisgICAgICAgICAgICAvLyB0aGVuIHdlIGtub3cgd2UncmUgbWlzc2luZyBhIHRva2VuOyBlcnJvciByZWNvdmVyeSBpcyBmcmVlIHRvCisgICAgICAgICAgICAvLyAiaW5zZXJ0IiB0aGUgbWlzc2luZyB0b2tlbgorCisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigidmlhYmxlIHRva2Vucz0iK2ZvbGxvdy50b1N0cmluZyhnZXRUb2tlbk5hbWVzKCkpKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJMVCgxKT0iKygoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKTsKKworICAgICAgICAgICAgLy8gQml0U2V0IGNhbm5vdCBoYW5kbGUgbmVnYXRpdmUgbnVtYmVycyBsaWtlIC0xIChFT0YpIHNvIEkgbGVhdmUgRU9SCisgICAgICAgICAgICAvLyBpbiBmb2xsb3cgc2V0IHRvIGluZGljYXRlIHRoYXQgdGhlIGZhbGwgb2YgdGhlIHN0YXJ0IHN5bWJvbCBpcworICAgICAgICAgICAgLy8gaW4gdGhlIHNldCAoRU9GIGNhbiBmb2xsb3cpLgorICAgICAgICAgICAgaWYgKCBmb2xsb3cuTWVtYmVyKCBpbnB1dC5MQSggMSApICkgfHwgZm9sbG93Lk1lbWJlciggVG9rZW5UeXBlcy5FbmRPZlJ1bGUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxUKDEpPT0iKygoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKyIgaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgZm9sbG93czsgaW5zZXJ0aW5nLi4uIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmVwb3J0IGEgcmVjb2duaXRpb24gcHJvYmxlbS48L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgbWV0aG9kIHNldHMgZXJyb3JSZWNvdmVyeSB0byBpbmRpY2F0ZSB0aGUgcGFyc2VyIGlzIHJlY292ZXJpbmcKKyAgICAgICAgICogIG5vdCBwYXJzaW5nLiAgT25jZSBpbiByZWNvdmVyeSBtb2RlLCBubyBlcnJvcnMgYXJlIGdlbmVyYXRlZC4KKyAgICAgICAgICogIFRvIGdldCBvdXQgb2YgcmVjb3ZlcnkgbW9kZSwgdGhlIHBhcnNlciBtdXN0IHN1Y2Nlc3NmdWxseSBtYXRjaAorICAgICAgICAgKiAgYSB0b2tlbiAoYWZ0ZXIgYSByZXN5bmMpLiAgU28gaXQgd2lsbCBnbzoKKyAgICAgICAgICoKKyAgICAgICAgICogCQkxLiBlcnJvciBvY2N1cnMKKyAgICAgICAgICogCQkyLiBlbnRlciByZWNvdmVyeSBtb2RlLCByZXBvcnQgZXJyb3IKKyAgICAgICAgICogCQkzLiBjb25zdW1lIHVudGlsIHRva2VuIGZvdW5kIGluIHJlc3luY2ggc2V0CisgICAgICAgICAqIAkJNC4gdHJ5IHRvIHJlc3VtZSBwYXJzaW5nCisgICAgICAgICAqIAkJNS4gbmV4dCBtYXRjaCgpIHdpbGwgcmVzZXQgZXJyb3JSZWNvdmVyeSBtb2RlCisgICAgICAgICAqCisgICAgICAgICAqICBJZiB5b3Ugb3ZlcnJpZGUsIG1ha2Ugc3VyZSB0byB1cGRhdGUgc3ludGF4RXJyb3JzIGlmIHlvdSBjYXJlIGFib3V0IHRoYXQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcG9ydEVycm9yKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBhbmQgaGF2ZSBub3QgbWF0Y2hlZCBhIHRva2VuCisgICAgICAgICAgICAvLyB5ZXQgc3VjY2Vzc2Z1bGx5LCBkb24ndCByZXBvcnQgYW55IGVycm9ycy4KKyAgICAgICAgICAgIGlmICggc3RhdGUuZXJyb3JSZWNvdmVyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50KCJbU1BVUklPVVNdICIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLnN5bnRheEVycm9ycysrOyAvLyBkb24ndCBjb3VudCBzcHVyaW91cworICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IHRydWU7CisKKyAgICAgICAgICAgIERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKCB0aGlzLlRva2VuTmFtZXMsIGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRGlzcGxheVJlY29nbml0aW9uRXJyb3IoIHN0cmluZ1tdIHRva2VuTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaGRyID0gR2V0RXJyb3JIZWFkZXIoIGUgKTsKKyAgICAgICAgICAgIHN0cmluZyBtc2cgPSBHZXRFcnJvck1lc3NhZ2UoIGUsIHRva2VuTmFtZXMgKTsKKyAgICAgICAgICAgIEVtaXRFcnJvck1lc3NhZ2UoIGhkciArICIgIiArIG1zZyApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgdmFyaW91cyBleGNlcHRpb24gdHlwZXM/PC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBOb3QgdmVyeSBvYmplY3Qtb3JpZW50ZWQgY29kZSwgYnV0IEkgbGlrZSBoYXZpbmcgYWxsIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICogIGdlbmVyYXRpb24gd2l0aGluIG9uZSBtZXRob2QgcmF0aGVyIHRoYW4gc3ByZWFkIGFtb25nIGFsbCBvZiB0aGUKKyAgICAgICAgICogIGV4Y2VwdGlvbiBjbGFzc2VzLiBUaGlzIGFsc28gbWFrZXMgaXQgbXVjaCBlYXNpZXIgZm9yIHRoZSBleGNlcHRpb24KKyAgICAgICAgICogIGhhbmRsaW5nIGJlY2F1c2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGRvIG5vdCBoYXZlIHRvIGhhdmUgcG9pbnRlcnMgYmFjaworICAgICAgICAgKiAgdG8gdGhpcyBvYmplY3QgdG8gYWNjZXNzIHV0aWxpdHkgcm91dGluZXMgYW5kIHNvIG9uLiBBbHNvLCBjaGFuZ2luZworICAgICAgICAgKiAgdGhlIG1lc3NhZ2UgZm9yIGFuIGV4Y2VwdGlvbiB0eXBlIHdvdWxkIGJlIGRpZmZpY3VsdCBiZWNhdXNlIHlvdQorICAgICAgICAgKiAgd291bGQgaGF2ZSB0byBzdWJjbGFzc2luZyBleGNlcHRpb24sIGJ1dCB0aGVuIHNvbWVob3cgZ2V0IEFOVExSCisgICAgICAgICAqICB0byBtYWtlIHRob3NlIGtpbmRzIG9mIGV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuCisgICAgICAgICAqICBUaGlzIGxvb2tzIHdlaXJkLCBidXQgdHJ1c3QgbWUtLWl0IG1ha2VzIHRoZSBtb3N0IHNlbnNlIGluIHRlcm1zCisgICAgICAgICAqICBvZiBmbGV4aWJpbGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogIEZvciBncmFtbWFyIGRlYnVnZ2luZywgeW91IHdpbGwgd2FudCB0byBvdmVycmlkZSB0aGlzIHRvIGFkZAorICAgICAgICAgKiAgbW9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzdGFjayBmcmFtZSB3aXRoCisgICAgICAgICAqICBnZXRSdWxlSW52b2NhdGlvblN0YWNrKGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIGFuZCwKKyAgICAgICAgICogIGZvciBubyB2aWFibGUgYWx0cywgdGhlIGRlY2lzaW9uIGRlc2NyaXB0aW9uIGFuZCBzdGF0ZSBldGMuLi4KKyAgICAgICAgICoKKyAgICAgICAgICogIE92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBtZXNzYWdlIGdlbmVyYXRlZCBmb3Igb25lIG9yIG1vcmUKKyAgICAgICAgICogIGV4Y2VwdGlvbiB0eXBlcy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRFcnJvck1lc3NhZ2UoIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsIHN0cmluZ1tdIHRva2VuTmFtZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbXNnID0gZS5NZXNzYWdlOworICAgICAgICAgICAgaWYgKCBlIGlzIFVud2FudGVkVG9rZW5FeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVud2FudGVkVG9rZW5FeGNlcHRpb24gdXRlID0gKFVud2FudGVkVG9rZW5FeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdG9rZW5OYW1lID0gIjx1bmtub3duPiI7CisgICAgICAgICAgICAgICAgaWYgKCB1dGUuRXhwZWN0aW5nID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9ICJFbmRPZkZpbGUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSB0b2tlbk5hbWVzW3V0ZS5FeHBlY3RpbmddOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2cgPSAiZXh0cmFuZW91cyBpbnB1dCAiICsgR2V0VG9rZW5FcnJvckRpc3BsYXkoIHV0ZS5VbmV4cGVjdGVkVG9rZW4gKSArCisgICAgICAgICAgICAgICAgICAgICIgZXhwZWN0aW5nICIgKyB0b2tlbk5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBNaXNzaW5nVG9rZW5FeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbiBtdGUgPSAoTWlzc2luZ1Rva2VuRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRva2VuTmFtZSA9ICI8dW5rbm93bj4iOworICAgICAgICAgICAgICAgIGlmICggbXRlLkV4cGVjdGluZyA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRW5kT2ZGaWxlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gdG9rZW5OYW1lc1ttdGUuRXhwZWN0aW5nXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc3NpbmcgIiArIHRva2VuTmFtZSArICIgYXQgIiArIEdldFRva2VuRXJyb3JEaXNwbGF5KCBlLlRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPSAoTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRva2VuTmFtZSA9ICI8dW5rbm93bj4iOworICAgICAgICAgICAgICAgIGlmICggbXRlLkV4cGVjdGluZyA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRW5kT2ZGaWxlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gdG9rZW5OYW1lc1ttdGUuRXhwZWN0aW5nXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgaW5wdXQgIiArIEdldFRva2VuRXJyb3JEaXNwbGF5KCBlLlRva2VuICkgKworICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGluZyAiICsgdG9rZW5OYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGUgaXMgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24gbXRuZSA9IChNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgdG9rZW5OYW1lID0gIjx1bmtub3duPiI7CisgICAgICAgICAgICAgICAgaWYgKCBtdG5lLkV4cGVjdGluZyA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRW5kT2ZGaWxlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gdG9rZW5OYW1lc1ttdG5lLkV4cGVjdGluZ107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGEgLk5FVCBmcmFtZXdvcmsgYnVnIChOdWxsUmVmZXJlbmNlRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHN0cmluZyBub2RlVGV4dCA9ICggbXRuZS5Ob2RlICE9IG51bGwgKSA/IG10bmUuTm9kZS5Ub1N0cmluZygpID8/IHN0cmluZy5FbXB0eSA6IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCB0cmVlIG5vZGU6ICIgKyBub2RlVGV4dCArICIgZXhwZWN0aW5nICIgKyB0b2tlbk5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gKE5vVmlhYmxlQWx0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICJkZWNpc2lvbj08PCIrbnZhZS5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbisiPj4iCisgICAgICAgICAgICAgICAgLy8gYW5kICIoZGVjaXNpb249IitudmFlLmRlY2lzaW9uTnVtYmVyKyIpIGFuZAorICAgICAgICAgICAgICAgIC8vICJzdGF0ZSAiK252YWUuc3RhdGVOdW1iZXIKKyAgICAgICAgICAgICAgICBtc2cgPSAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICIgKyBHZXRUb2tlbkVycm9yRGlzcGxheSggZS5Ub2tlbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGUgaXMgRWFybHlFeGl0RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL0Vhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPSAoRWFybHlFeGl0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICIoZGVjaXNpb249IitlZWUuZGVjaXNpb25OdW1iZXIrIikiCisgICAgICAgICAgICAgICAgbXNnID0gInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgaW5wdXQgIiArCisgICAgICAgICAgICAgICAgICAgIEdldFRva2VuRXJyb3JEaXNwbGF5KCBlLlRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IChNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgaW5wdXQgIiArIEdldFRva2VuRXJyb3JEaXNwbGF5KCBlLlRva2VuICkgKworICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGluZyBzZXQgIiArIG1zZS5FeHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIG1zZSA9IChNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgaW5wdXQgIiArIEdldFRva2VuRXJyb3JEaXNwbGF5KCBlLlRva2VuICkgKworICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGluZyBzZXQgIiArIG1zZS5FeHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiBmcGUgPSAoRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gInJ1bGUgIiArIGZwZS5SdWxlTmFtZSArICIgZmFpbGVkIHByZWRpY2F0ZTogeyIgKworICAgICAgICAgICAgICAgICAgICBmcGUuUHJlZGljYXRlVGV4dCArICJ9PyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IG51bWJlciBvZiByZWNvZ25pdGlvbiBlcnJvcnMgKGxleGVyLCBwYXJzZXIsIHRyZWUgcGFyc2VyKS4gIEVhY2gKKyAgICAgICAgICogIHJlY29nbml6ZXIgdHJhY2tzIGl0cyBvd24gbnVtYmVyLiAgU28gcGFyc2VyIGFuZCBsZXhlciBlYWNoIGhhdmUKKyAgICAgICAgICogIHNlcGFyYXRlIGNvdW50LiAgRG9lcyBub3QgY291bnQgdGhlIHNwdXJpb3VzIGVycm9ycyBmb3VuZCBiZXR3ZWVuCisgICAgICAgICAqICBhbiBlcnJvciBhbmQgbmV4dCB2YWxpZCB0b2tlbiBtYXRjaAorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHNlZWFsc28gY3JlZj0icmVwb3J0RXJyb3IoKSIvPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE51bWJlck9mU3ludGF4RXJyb3JzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zeW50YXhFcnJvcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCBpcyB0aGUgZXJyb3IgaGVhZGVyLCBub3JtYWxseSBsaW5lL2NoYXJhY3RlciBwb3NpdGlvbiBpbmZvcm1hdGlvbj88L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHZXRFcnJvckhlYWRlciggUmVjb2duaXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBwcmVmaXggPSBTb3VyY2VOYW1lID8/IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgIGlmIChwcmVmaXguTGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBwcmVmaXggKz0gJyAnOworCisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiezB9bGluZSB7MX06ezJ9IiwgcHJlZml4LCBlLkxpbmUsIGUuQ2hhclBvc2l0aW9uSW5MaW5lICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBIb3cgc2hvdWxkIGEgdG9rZW4gYmUgZGlzcGxheWVkIGluIGFuIGVycm9yIG1lc3NhZ2U/IFRoZSBkZWZhdWx0CisgICAgICAgICAqICBpcyB0byBkaXNwbGF5IGp1c3QgdGhlIHRleHQsIGJ1dCBkdXJpbmcgZGV2ZWxvcG1lbnQgeW91IG1pZ2h0CisgICAgICAgICAqICB3YW50IHRvIGhhdmUgYSBsb3Qgb2YgaW5mb3JtYXRpb24gc3BpdCBvdXQuICBPdmVycmlkZSBpbiB0aGF0IGNhc2UKKyAgICAgICAgICogIHRvIHVzZSB0LlRvU3RyaW5nKCkgKHdoaWNoLCBmb3IgQ29tbW9uVG9rZW4sIGR1bXBzIGV2ZXJ5dGhpbmcgYWJvdXQKKyAgICAgICAgICogIHRoZSB0b2tlbikuIFRoaXMgaXMgYmV0dGVyIHRoYW4gZm9yY2luZyB5b3UgdG8gb3ZlcnJpZGUgYSBtZXRob2QgaW4KKyAgICAgICAgICogIHlvdXIgdG9rZW4gb2JqZWN0cyBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIHRvIGdvIG1vZGlmeSB5b3VyIGxleGVyCisgICAgICAgICAqICBzbyB0aGF0IGl0IGNyZWF0ZXMgYSBuZXcgSmF2YSB0eXBlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEdldFRva2VuRXJyb3JEaXNwbGF5KCBJVG9rZW4gdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzID0gdC5UZXh0OworICAgICAgICAgICAgaWYgKCBzID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdC5UeXBlID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgPSAiPEVPRj4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzID0gIjwiICsgdC5UeXBlICsgIj4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgPSBSZWdleC5SZXBsYWNlKCBzLCAiXG4iLCAiXFxcXG4iICk7CisgICAgICAgICAgICBzID0gUmVnZXguUmVwbGFjZSggcywgIlxyIiwgIlxcXFxyIiApOworICAgICAgICAgICAgcyA9IFJlZ2V4LlJlcGxhY2UoIHMsICJcdCIsICJcXFxcdCIgKTsKKyAgICAgICAgICAgIHJldHVybiAiJyIgKyBzICsgIiciOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB3aGVyZSBlcnJvciBtZXNzYWdlcyBnbzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbWl0RXJyb3JNZXNzYWdlKCBzdHJpbmcgbXNnICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFRyYWNlRGVzdGluYXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlTGluZSggbXNnICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZWNvdmVyIGZyb20gYW4gZXJyb3IgZm91bmQgb24gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgaXMKKyAgICAgICAgICogIGZvciBOb1ZpYWJsZUFsdCBhbmQgbWlzbWF0Y2hlZCBzeW1ib2wgZXhjZXB0aW9ucy4gIElmIHlvdSBlbmFibGUKKyAgICAgICAgICogIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gYW5kIGRlbGV0aW9uLCB0aGlzIHdpbGwgdXN1YWxseSBub3QKKyAgICAgICAgICogIGhhbmRsZSBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zIGJ1dCB0aGVyZSBjb3VsZCBiZSBhIG1pc21hdGNoZWQKKyAgICAgICAgICogIHRva2VuIHRoYXQgdGhlIG1hdGNoKCkgcm91dGluZSBjb3VsZCBub3QgcmVjb3ZlciBmcm9tLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWNvdmVyKCBJSW50U3RyZWFtIGlucHV0LCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUubGFzdEVycm9ySW5kZXggPT0gaW5wdXQuSW5kZXggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHVoIG9oLCBhbm90aGVyIGVycm9yIGF0IHNhbWUgdG9rZW4gaW5kZXg7IG11c3QgYmUgYSBjYXNlCisgICAgICAgICAgICAgICAgLy8gd2hlcmUgTFQoMSkgaXMgaW4gdGhlIHJlY292ZXJ5IHRva2VuIHNldCBzbyBub3RoaW5nIGlzCisgICAgICAgICAgICAgICAgLy8gY29uc3VtZWQ7IGNvbnN1bWUgYSBzaW5nbGUgdG9rZW4gc28gYXQgbGVhc3QgdG8gcHJldmVudAorICAgICAgICAgICAgICAgIC8vIGFuIGluZmluaXRlIGxvb3A7IHRoaXMgaXMgYSBmYWlsc2FmZS4KKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5sYXN0RXJyb3JJbmRleCA9IGlucHV0LkluZGV4OworICAgICAgICAgICAgQml0U2V0IGZvbGxvd1NldCA9IENvbXB1dGVFcnJvclJlY292ZXJ5U2V0KCk7CisgICAgICAgICAgICBCZWdpblJlc3luYygpOworICAgICAgICAgICAgQ29uc3VtZVVudGlsKCBpbnB1dCwgZm9sbG93U2V0ICk7CisgICAgICAgICAgICBFbmRSZXN5bmMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEEgaG9vayB0byBsaXN0ZW4gaW4gb24gdGhlIHRva2VuIGNvbnN1bXB0aW9uIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAgICAgICAgICogIFRoZSBEZWJ1Z1BhcnNlciBzdWJjbGFzc2VzIHRoaXMgdG8gZmlyZSBldmVudHMgdG8gdGhlIGxpc3RlbnRlci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVnaW5SZXN5bmMoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVuZFJlc3luYygpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qICBDb21wdXRlIHRoZSBlcnJvciByZWNvdmVyeSBzZXQgZm9yIHRoZSBjdXJyZW50IHJ1bGUuICBEdXJpbmcKKyAgICAgICAgICogIHJ1bGUgaW52b2NhdGlvbiwgdGhlIHBhcnNlciBwdXNoZXMgdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4KKyAgICAgICAgICogIGZvbGxvdyB0aGF0IHJ1bGUgcmVmZXJlbmNlIG9uIHRoZSBzdGFjazsgdGhpcyBhbW91bnRzIHRvCisgICAgICAgICAqICBjb21wdXRpbmcgRklSU1Qgb2Ygd2hhdCBmb2xsb3dzIHRoZSBydWxlIHJlZmVyZW5jZSBpbiB0aGUKKyAgICAgICAgICogIGVuY2xvc2luZyBydWxlLiBUaGlzIGxvY2FsIGZvbGxvdyBzZXQgb25seSBpbmNsdWRlcyB0b2tlbnMKKyAgICAgICAgICogIGZyb20gd2l0aGluIHRoZSBydWxlOyBpLmUuLCB0aGUgRklSU1QgY29tcHV0YXRpb24gZG9uZSBieQorICAgICAgICAgKiAgQU5UTFIgc3RvcHMgYXQgdGhlIGVuZCBvZiBhIHJ1bGUuCisgICAgICAgICAqCisgICAgICAgICAqICBFWEFNUExFCisgICAgICAgICAqCisgICAgICAgICAqICBXaGVuIHlvdSBmaW5kIGEgIm5vIHZpYWJsZSBhbHQgZXhjZXB0aW9uIiwgdGhlIGlucHV0IGlzIG5vdAorICAgICAgICAgKiAgY29uc2lzdGVudCB3aXRoIGFueSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGZvciBydWxlIHIuICBUaGUgYmVzdAorICAgICAgICAgKiAgdGhpbmcgdG8gZG8gaXMgdG8gY29uc3VtZSB0b2tlbnMgdW50aWwgeW91IHNlZSBzb21ldGhpbmcgdGhhdAorICAgICAgICAgKiAgY2FuIGxlZ2FsbHkgZm9sbG93IGEgY2FsbCB0byByICpvciogYW55IHJ1bGUgdGhhdCBjYWxsZWQgci4KKyAgICAgICAgICogIFlvdSBkb24ndCB3YW50IHRoZSBleGFjdCBzZXQgb2YgdmlhYmxlIG5leHQgdG9rZW5zIGJlY2F1c2UgdGhlCisgICAgICAgICAqICBpbnB1dCBtaWdodCBqdXN0IGJlIG1pc3NpbmcgYSB0b2tlbi0teW91IG1pZ2h0IGNvbnN1bWUgdGhlCisgICAgICAgICAqICByZXN0IG9mIHRoZSBpbnB1dCBsb29raW5nIGZvciBvbmUgb2YgdGhlIG1pc3NpbmcgdG9rZW5zLgorICAgICAgICAgKgorICAgICAgICAgKiAgQ29uc2lkZXIgZ3JhbW1hcjoKKyAgICAgICAgICoKKyAgICAgICAgICogIGEgOiAnWycgYiAnXScKKyAgICAgICAgICogICAgfCAnKCcgYiAnKScKKyAgICAgICAgICogICAgOworICAgICAgICAgKiAgYiA6IGMgJ14nIElOVCA7CisgICAgICAgICAqICBjIDogSUQKKyAgICAgICAgICogICAgfCBJTlQKKyAgICAgICAgICogICAgOworICAgICAgICAgKgorICAgICAgICAgKiAgQXQgZWFjaCBydWxlIGludm9jYXRpb24sIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY291bGQgZm9sbG93CisgICAgICAgICAqICB0aGF0IHJ1bGUgaXMgcHVzaGVkIG9uIGEgc3RhY2suICBIZXJlIGFyZSB0aGUgdmFyaW91cyAibG9jYWwiCisgICAgICAgICAqICBmb2xsb3cgc2V0czoKKyAgICAgICAgICoKKyAgICAgICAgICogIEZPTExPVyhiMV9pbl9hKSA9IEZJUlNUKCddJykgPSAnXScKKyAgICAgICAgICogIEZPTExPVyhiMl9pbl9hKSA9IEZJUlNUKCcpJykgPSAnKScKKyAgICAgICAgICogIEZPTExPVyhjX2luX2IpID0gRklSU1QoJ14nKSA9ICdeJworICAgICAgICAgKgorICAgICAgICAgKiAgVXBvbiBlcnJvbmVvdXMgaW5wdXQgIltdIiwgdGhlIGNhbGwgY2hhaW4gaXMKKyAgICAgICAgICoKKyAgICAgICAgICogIGEgLT4gYiAtPiBjCisgICAgICAgICAqCisgICAgICAgICAqICBhbmQsIGhlbmNlLCB0aGUgZm9sbG93IGNvbnRleHQgc3RhY2sgaXM6CisgICAgICAgICAqCisgICAgICAgICAqICBkZXB0aCAgbG9jYWwgZm9sbG93IHNldCAgICAgYWZ0ZXIgY2FsbCB0byBydWxlCisgICAgICAgICAqICAgIDAgICAgICAgICA8RU9GPiAgICAgICAgICAgICAgICAgICAgYSAoZnJvbSBtYWluKCkpCisgICAgICAgICAqICAgIDEgICAgICAgICAgJ10nICAgICAgICAgICAgICAgICAgICAgYgorICAgICAgICAgKiAgICAzICAgICAgICAgICdeJyAgICAgICAgICAgICAgICAgICAgIGMKKyAgICAgICAgICoKKyAgICAgICAgICogIE5vdGljZSB0aGF0ICcpJyBpcyBub3QgaW5jbHVkZWQsIGJlY2F1c2UgYiB3b3VsZCBoYXZlIHRvIGhhdmUKKyAgICAgICAgICogIGJlZW4gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCBpbiBydWxlIGEgZm9yICcpJyB0byBiZQorICAgICAgICAgKiAgaW5jbHVkZWQuCisgICAgICAgICAqCisgICAgICAgICAqICBGb3IgZXJyb3IgcmVjb3ZlcnksIHdlIGNhbm5vdCBjb25zaWRlciBGT0xMT1coYykKKyAgICAgICAgICogIChjb250ZXh0LXNlbnNpdGl2ZSBvciBvdGhlcndpc2UpLiAgV2UgbmVlZCB0aGUgY29tYmluZWQgc2V0IG9mCisgICAgICAgICAqICBhbGwgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldHMtLXRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0CisgICAgICAgICAqICBjb3VsZCBmb2xsb3cgYW55IHJlZmVyZW5jZSBpbiB0aGUgY2FsbCBjaGFpbi4gIFdlIG5lZWQgdG8KKyAgICAgICAgICogIHJlc3luYyB0byBvbmUgb2YgdGhvc2UgdG9rZW5zLiAgTm90ZSB0aGF0IEZPTExPVyhjKT0nXicgYW5kIGlmCisgICAgICAgICAqICB3ZSByZXN5bmMnZCB0byB0aGF0IHRva2VuLCB3ZSdkIGNvbnN1bWUgdW50aWwgRU9GLiAgV2UgbmVlZCB0bworICAgICAgICAgKiAgc3luYyB0byBjb250ZXh0LXNlbnNpdGl2ZSBGT0xMT1dzIGZvciBhLCBiLCBhbmQgYzogeyddJywnXid9LgorICAgICAgICAgKiAgSW4gdGhpcyBjYXNlLCBmb3IgaW5wdXQgIltdIiwgTEEoMSkgaXMgaW4gdGhpcyBzZXQgc28gd2Ugd291bGQKKyAgICAgICAgICogIG5vdCBjb25zdW1lIGFueXRoaW5nIGFuZCBhZnRlciBwcmludGluZyBhbiBlcnJvciBydWxlIGMgd291bGQKKyAgICAgICAgICogIHJldHVybiBub3JtYWxseS4gIEl0IHdvdWxkIG5vdCBmaW5kIHRoZSByZXF1aXJlZCAnXicgdGhvdWdoLgorICAgICAgICAgKiAgQXQgdGhpcyBwb2ludCwgaXQgZ2V0cyBhIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IgYW5kIHRocm93cyBhbgorICAgICAgICAgKiAgZXhjZXB0aW9uIChzaW5jZSBMQSgxKSBpcyBub3QgaW4gdGhlIHZpYWJsZSBmb2xsb3dpbmcgdG9rZW4KKyAgICAgICAgICogIHNldCkuICBUaGUgcnVsZSBleGNlcHRpb24gaGFuZGxlciB0cmllcyB0byByZWNvdmVyLCBidXQgZmluZHMKKyAgICAgICAgICogIHRoZSBzYW1lIHJlY292ZXJ5IHNldCBhbmQgZG9lc24ndCBjb25zdW1lIGFueXRoaW5nLiAgUnVsZSBiCisgICAgICAgICAqICBleGl0cyBub3JtYWxseSByZXR1cm5pbmcgdG8gcnVsZSBhLiAgTm93IGl0IGZpbmRzIHRoZSAnXScgKGFuZAorICAgICAgICAgKiAgd2l0aCB0aGUgc3VjY2Vzc2Z1bCBtYXRjaCBleGl0cyBlcnJvclJlY292ZXJ5IG1vZGUpLgorICAgICAgICAgKgorICAgICAgICAgKiAgU28sIHlvdSBjbmEgc2VlIHRoYXQgdGhlIHBhcnNlciB3YWxrcyB1cCBjYWxsIGNoYWluIGxvb2tpbmcKKyAgICAgICAgICogIGZvciB0aGUgdG9rZW4gdGhhdCB3YXMgYSBtZW1iZXIgb2YgdGhlIHJlY292ZXJ5IHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogIEVycm9ycyBhcmUgbm90IGdlbmVyYXRlZCBpbiBlcnJvclJlY292ZXJ5IG1vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICBBTlRMUidzIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBpcyBiYXNlZCB1cG9uIG9yaWdpbmFsIGlkZWFzOgorICAgICAgICAgKgorICAgICAgICAgKiAgIkFsZ29yaXRobXMgKyBEYXRhIFN0cnVjdHVyZXMgPSBQcm9ncmFtcyIgYnkgTmlrbGF1cyBXaXJ0aAorICAgICAgICAgKgorICAgICAgICAgKiAgYW5kCisgICAgICAgICAqCisgICAgICAgICAqICAiQSBub3RlIG9uIGVycm9yIHJlY292ZXJ5IGluIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlcnMiOgorICAgICAgICAgKiAgaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD05NDc5MDIuOTQ3OTA1CisgICAgICAgICAqCisgICAgICAgICAqICBMYXRlciwgSm9zZWYgR3Jvc2NoIGhhZCBzb21lIGdvb2QgaWRlYXM6CisgICAgICAgICAqCisgICAgICAgICAqICAiRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudAorICAgICAgICAgKiAgUGFyc2VycyI6CisgICAgICAgICAqICBmdHA6Ly93d3cuY29jb2xhYi5jb20vcHJvZHVjdHMvY29ja3RhaWwvZG9jYTQucHMvZWxsLnBzLnppcAorICAgICAgICAgKgorICAgICAgICAgKiAgTGlrZSBHcm9zY2ggSSBpbXBsZW1lbnRlZCBsb2NhbCBGT0xMT1cgc2V0cyB0aGF0IGFyZSBjb21iaW5lZAorICAgICAgICAgKiAgYXQgcnVuLXRpbWUgdXBvbiBlcnJvciB0byBhdm9pZCBvdmVyaGVhZCBkdXJpbmcgcGFyc2luZy4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIEJpdFNldCBDb21wdXRlRXJyb3JSZWNvdmVyeVNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21iaW5lRm9sbG93cyggZmFsc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIENvbXB1dGUgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXQgZm9yIGN1cnJlbnQgcnVsZS4KKyAgICAgICAgICogIFRoaXMgaXMgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhIHNwZWNpZmljIHJ1bGUKKyAgICAgICAgICogIHJlZmVyZW5jZSBnaXZlbiBhIHNwZWNpZmljIGNhbGwgY2hhaW4uICBZb3UgZ2V0IHRoZSBzZXQgb2YKKyAgICAgICAgICogIHZpYWJsZSB0b2tlbnMgdGhhdCBjYW4gcG9zc2libHkgY29tZSBuZXh0IChsb29rYWhlYWQgZGVwdGggMSkKKyAgICAgICAgICogIGdpdmVuIHRoZSBjdXJyZW50IGNhbGwgY2hhaW4uICBDb250cmFzdCB0aGlzIHdpdGggdGhlCisgICAgICAgICAqICBkZWZpbml0aW9uIG9mIHBsYWluIEZPTExPVyBmb3IgcnVsZSByOgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgIEZPTExPVyhyKT17eCB8IFM9PiphbHBoYSByIGJldGEgaW4gRyBhbmQgeCBpbiBGSVJTVChiZXRhKX0KKyAgICAgICAgICoKKyAgICAgICAgICogIHdoZXJlIHggaW4gVCogYW5kIGFscGhhLCBiZXRhIGluIFYqOyBUIGlzIHNldCBvZiB0ZXJtaW5hbHMgYW5kCisgICAgICAgICAqICBWIGlzIHRoZSBzZXQgb2YgdGVybWluYWxzIGFuZCBub250ZXJtaW5hbHMuICBJbiBvdGhlciB3b3JkcywKKyAgICAgICAgICogIEZPTExPVyhyKSBpcyB0aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdCBjYW4gcG9zc2libHkgZm9sbG93CisgICAgICAgICAqICByZWZlcmVuY2VzIHRvIHIgaW4gKmFueSogc2VudGVudGlhbCBmb3JtIChjb250ZXh0KS4gIEF0CisgICAgICAgICAqICBydW50aW1lLCBob3dldmVyLCB3ZSBrbm93IHByZWNpc2VseSB3aGljaCBjb250ZXh0IGFwcGxpZXMgYXMKKyAgICAgICAgICogIHdlIGhhdmUgdGhlIGNhbGwgY2hhaW4uICBXZSBtYXkgY29tcHV0ZSB0aGUgZXhhY3QgKHJhdGhlcgorICAgICAgICAgKiAgdGhhbiBjb3ZlcmluZyBzdXBlcnNldCkgc2V0IG9mIGZvbGxvd2luZyB0b2tlbnMuCisgICAgICAgICAqCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgZ3JhbW1hcjoKKyAgICAgICAgICoKKyAgICAgICAgICogIHN0YXQgOiBJRCAnPScgZXhwciAnOycgICAgICAvLyBGT0xMT1coc3RhdCk9PXtFT0Z9CisgICAgICAgICAqICAgICAgIHwgInJldHVybiIgZXhwciAnLicKKyAgICAgICAgICogICAgICAgOworICAgICAgICAgKiAgZXhwciA6IGF0b20gKCcrJyBhdG9tKSogOyAgIC8vIEZPTExPVyhleHByKT09eyc7JywnLicsJyknfQorICAgICAgICAgKiAgYXRvbSA6IElOVCAgICAgICAgICAgICAgICAgIC8vIEZPTExPVyhhdG9tKT09eycrJywnKScsJzsnLCcuJ30KKyAgICAgICAgICogICAgICAgfCAnKCcgZXhwciAnKScKKyAgICAgICAgICogICAgICAgOworICAgICAgICAgKgorICAgICAgICAgKiAgVGhlIEZPTExPVyBzZXRzIGFyZSBhbGwgaW5jbHVzaXZlIHdoZXJlYXMgY29udGV4dC1zZW5zaXRpdmUKKyAgICAgICAgICogIEZPTExPVyBzZXRzIGFyZSBwcmVjaXNlbHkgd2hhdCBjb3VsZCBmb2xsb3cgYSBydWxlIHJlZmVyZW5jZS4KKyAgICAgICAgICogIEZvciBpbnB1dCBpbnB1dCAiaT0oMyk7IiwgaGVyZSBpcyB0aGUgZGVyaXZhdGlvbjoKKyAgICAgICAgICoKKyAgICAgICAgICogIHN0YXQgPT4gSUQgJz0nIGV4cHIgJzsnCisgICAgICAgICAqICAgICAgID0+IElEICc9JyBhdG9tICgnKycgYXRvbSkqICc7JworICAgICAgICAgKiAgICAgICA9PiBJRCAnPScgJygnIGV4cHIgJyknICgnKycgYXRvbSkqICc7JworICAgICAgICAgKiAgICAgICA9PiBJRCAnPScgJygnIGF0b20gJyknICgnKycgYXRvbSkqICc7JworICAgICAgICAgKiAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgKCcrJyBhdG9tKSogJzsnCisgICAgICAgICAqICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAnOycKKyAgICAgICAgICoKKyAgICAgICAgICogIEF0IHRoZSAiMyIgdG9rZW4sIHlvdSdkIGhhdmUgYSBjYWxsIGNoYWluIG9mCisgICAgICAgICAqCisgICAgICAgICAqICAgIHN0YXQgLT4gZXhwciAtPiBhdG9tIC0+IGV4cHIgLT4gYXRvbQorICAgICAgICAgKgorICAgICAgICAgKiAgV2hhdCBjYW4gZm9sbG93IHRoYXQgc3BlY2lmaWMgbmVzdGVkIHJlZiB0byBhdG9tPyAgRXhhY3RseSAnKScKKyAgICAgICAgICogIGFzIHlvdSBjYW4gc2VlIGJ5IGxvb2tpbmcgYXQgdGhlIGRlcml2YXRpb24gb2YgdGhpcyBzcGVjaWZpYworICAgICAgICAgKiAgaW5wdXQuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIEZPTExPVyhhdG9tKT17JysnLCcpJywnOycsJy4nfS4KKyAgICAgICAgICoKKyAgICAgICAgICogIFlvdSB3YW50IHRoZSBleGFjdCB2aWFibGUgdG9rZW4gc2V0IHdoZW4gcmVjb3ZlcmluZyBmcm9tIGEKKyAgICAgICAgICogIHRva2VuIG1pc21hdGNoLiAgVXBvbiB0b2tlbiBtaXNtYXRjaCwgaWYgTEEoMSkgaXMgbWVtYmVyIG9mCisgICAgICAgICAqICB0aGUgdmlhYmxlIG5leHQgdG9rZW4gc2V0LCB0aGVuIHlvdSBrbm93IHRoZXJlIGlzIG1vc3QgbGlrZWx5CisgICAgICAgICAqICBhIG1pc3NpbmcgdG9rZW4gaW4gdGhlIGlucHV0IHN0cmVhbS4gICJJbnNlcnQiIG9uZSBieSBqdXN0IG5vdAorICAgICAgICAgKiAgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgQml0U2V0IENvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21iaW5lRm9sbG93cyggdHJ1ZSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2hhdCBpcyBleGFjdD8gaXQgc2VlbXMgdG8gb25seSBhZGQgc2V0cyBmcm9tIGFib3ZlIG9uIHN0YWNrCisgICAgICAgIC8vIGlmIEVPUiBpcyBpbiBzZXQgaS4gIFdoZW4gaXQgc2VlcyBhIHNldCB3L28gRU9SLCBpdCBzdG9wcyBhZGRpbmcuCisgICAgICAgIC8vIFdoeSB3b3VsZCB3ZSBldmVyIHdhbnQgdGhlbSBhbGw/ICBNYXliZSBubyB2aWFibGUgYWx0IGluc3RlYWQgb2YKKyAgICAgICAgLy8gbWlzbWF0Y2hlZCB0b2tlbj8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgQml0U2V0IENvbWJpbmVGb2xsb3dzKGJvb2wgZXhhY3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0b3AgPSBzdGF0ZS5fZnNwOworICAgICAgICAgICAgQml0U2V0IGZvbGxvd1NldCA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gdG9wOyBpID49IDA7IGktLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQml0U2V0IGxvY2FsRm9sbG93U2V0ID0gKEJpdFNldClzdGF0ZS5mb2xsb3dpbmdbaV07CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsIGZvbGxvdyBkZXB0aCAiK2krIj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEZvbGxvd1NldC50b1N0cmluZyhnZXRUb2tlbk5hbWVzKCkpKyIpIik7CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZm9sbG93U2V0Lk9ySW5QbGFjZSggbG9jYWxGb2xsb3dTZXQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGV4YWN0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhbiB3ZSBzZWUgZW5kIG9mIHJ1bGU/CisgICAgICAgICAgICAgICAgICAgIGlmICggbG9jYWxGb2xsb3dTZXQuTWVtYmVyKCBUb2tlblR5cGVzLkVuZE9mUnVsZSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBsZWF2ZSBFT1IgaW4gc2V0IGlmIGF0IHRvcCAoc3RhcnQgcnVsZSk7IHRoaXMgbGV0cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXMga25vdyBpZiBoYXZlIHRvIGluY2x1ZGUgZm9sbG93KHN0YXJ0IHJ1bGUpOyBpLmUuLCBFT0YKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaSA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd1NldC5SZW1vdmUoIFRva2VuVHlwZXMuRW5kT2ZSdWxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IC8vIGNhbid0IHNlZSBlbmQgb2YgcnVsZSwgcXVpdAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZm9sbG93U2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGEgc2luZ2xlIG1pc3Npbmcgb3IgZXh0cmEgdG9rZW4uPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgRVhUUkEgVE9LRU4KKyAgICAgICAgICoKKyAgICAgICAgICogIExBKDEpIGlzIG5vdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gIElmIExBKDIpIGhhcyB0aGUgcmlnaHQgdG9rZW4sCisgICAgICAgICAqICBob3dldmVyLCB0aGVuIGFzc3VtZSBMQSgxKSBpcyBzb21lIGV4dHJhIHNwdXJpb3VzIHRva2VuLiAgRGVsZXRlIGl0CisgICAgICAgICAqICBhbmQgTEEoMikgYXMgaWYgd2Ugd2VyZSBkb2luZyBhIG5vcm1hbCBtYXRjaCgpLCB3aGljaCBhZHZhbmNlcyB0aGUKKyAgICAgICAgICogIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiAgTUlTU0lORyBUT0tFTgorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgY3VycmVudCB0b2tlbiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBjb3VsZCBjb21lIGFmdGVyCisgICAgICAgICAqICB0dHlwZSB0aGVuIGl0IGlzIG9rIHRvICJpbnNlcnQiIHRoZSBtaXNzaW5nIHRva2VuLCBlbHNlIHRocm93CisgICAgICAgICAqICBleGNlcHRpb24gRm9yIGV4YW1wbGUsIElucHV0ICJpPSgzOyIgaXMgY2xlYXJseSBtaXNzaW5nIHRoZQorICAgICAgICAgKiAgJyknLiAgV2hlbiB0aGUgcGFyc2VyIHJldHVybnMgZnJvbSB0aGUgbmVzdGVkIGNhbGwgdG8gZXhwciwgaXQKKyAgICAgICAgICogIHdpbGwgaGF2ZSBjYWxsIGNoYWluOgorICAgICAgICAgKgorICAgICAgICAgKiAgICBzdGF0IC0+IGV4cHIgLT4gYXRvbQorICAgICAgICAgKgorICAgICAgICAgKiAgYW5kIGl0IHdpbGwgYmUgdHJ5aW5nIHRvIG1hdGNoIHRoZSAnKScgYXQgdGhpcyBwb2ludCBpbiB0aGUKKyAgICAgICAgICogIGRlcml2YXRpb246CisgICAgICAgICAqCisgICAgICAgICAqICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICogIG1hdGNoKCkgd2lsbCBzZWUgdGhhdCAnOycgZG9lc24ndCBtYXRjaCAnKScgYW5kIHJlcG9ydCBhCisgICAgICAgICAqICBtaXNtYXRjaGVkIHRva2VuIGVycm9yLiAgVG8gcmVjb3ZlciwgaXQgc2VlcyB0aGF0IExBKDEpPT0nOycKKyAgICAgICAgICogIGlzIGluIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuIGZvbGxvdyB0aGUgJyknIHRva2VuCisgICAgICAgICAqICByZWZlcmVuY2UgaW4gcnVsZSBhdG9tLiAgSXQgY2FuIGFzc3VtZSB0aGF0IHlvdSBmb3Jnb3QgdGhlICcpJy4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIG9iamVjdCBSZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbiggSUludFN0cmVhbSBpbnB1dCwgaW50IHR0eXBlLCBCaXRTZXQgZm9sbG93ICkKKyAgICAgICAgeworICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSA9IG51bGw7CisgICAgICAgICAgICAvLyBpZiBuZXh0IHRva2VuIGlzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZW4gImRlbGV0ZSIgdGhpcyB0b2tlbgorICAgICAgICAgICAgaWYgKCBNaXNtYXRjaElzVW53YW50ZWRUb2tlbiggaW5wdXQsIHR0eXBlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUgPSBuZXcgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiggdHR5cGUsIGlucHV0LCBUb2tlbk5hbWVzICk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuIGRlbGV0aW5nICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNpbmNlICIrKChUb2tlblN0cmVhbSlpbnB1dCkuTFQoMikrIiBpcyB3aGF0IHdlIHdhbnQiKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCZWdpblJlc3luYygpOworICAgICAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsgLy8gc2ltcGx5IGRlbGV0ZSBleHRyYSB0b2tlbgorICAgICAgICAgICAgICAgIEVuZFJlc3luYygpOworICAgICAgICAgICAgICAgIFJlcG9ydEVycm9yKCBlICk7ICAvLyByZXBvcnQgYWZ0ZXIgY29uc3VtaW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldHVybiB0aGUgdG9rZW4gd2UncmUgYWN0dWFsbHkgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICBvYmplY3QgbWF0Y2hlZFN5bWJvbCA9IEdldEN1cnJlbnRJbnB1dFN5bWJvbCggaW5wdXQgKTsKKyAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7IC8vIG1vdmUgcGFzdCB0dHlwZSB0b2tlbiBhcyBpZiBhbGwgd2VyZSBvaworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2FuJ3QgcmVjb3ZlciB3aXRoIHNpbmdsZSB0b2tlbiBkZWxldGlvbiwgdHJ5IGluc2VydGlvbgorICAgICAgICAgICAgaWYgKCBNaXNtYXRjaElzTWlzc2luZ1Rva2VuKCBpbnB1dCwgZm9sbG93ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCBpbnNlcnRlZCA9IEdldE1pc3NpbmdTeW1ib2woIGlucHV0LCBlLCB0dHlwZSwgZm9sbG93ICk7CisgICAgICAgICAgICAgICAgZSA9IG5ldyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oIHR0eXBlLCBpbnB1dCwgaW5zZXJ0ZWQgKTsKKyAgICAgICAgICAgICAgICBSZXBvcnRFcnJvciggZSApOyAgLy8gcmVwb3J0IGFmdGVyIGluc2VydGluZyBzbyBBVyBzZWVzIHRoZSB0b2tlbiBpbiB0aGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIGluc2VydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZXZlbiB0aGF0IGRpZG4ndCB3b3JrOyBtdXN0IHRocm93IHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIGUgPSBuZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHR0eXBlLCBpbnB1dCwgVG9rZW5OYW1lcyk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE5vdCBjdXJyZW50bHkgdXNlZCAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KCBJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgZm9sbG93ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBNaXNtYXRjaElzTWlzc2luZ1Rva2VuKCBpbnB1dCwgZm9sbG93ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigibWlzc2luZyB0b2tlbiIpOworICAgICAgICAgICAgICAgIFJlcG9ydEVycm9yKCBlICk7CisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgdG8gY29uanVyZSB1cCBhIHRva2VuIGZvciBzZXRzIHlldAorICAgICAgICAgICAgICAgIHJldHVybiBHZXRNaXNzaW5nU3ltYm9sKCBpbnB1dCwgZSwgVG9rZW5UeXBlcy5JbnZhbGlkLCBmb2xsb3cgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8gZG8gc2luZ2xlIHRva2VuIGRlbGV0aW9uIGxpa2UgYWJvdmUgZm9yIFRva2VuIG1pc21hdGNoCisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWF0Y2ggbmVlZHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCwgd2hpY2ggZ2V0cyBwdXQKKyAgICAgICAgICogIGludG8gdGhlIGxhYmVsIGZvciB0aGUgYXNzb2NpYXRlZCB0b2tlbiByZWY7IGUuZy4sIHg9SUQuICBUb2tlbgorICAgICAgICAgKiAgYW5kIHRyZWUgcGFyc2VycyBuZWVkIHRvIHJldHVybiBkaWZmZXJlbnQgb2JqZWN0cy4gUmF0aGVyIHRoYW4gdGVzdAorICAgICAgICAgKiAgZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKyAgICAgICAgICogIGEgc2ltcGxlIG1ldGhvZCB0byBhc2sgdGhlIHJlY29nbml6ZXIgdG8gdGVsbCBtZSB3aGF0IHRoZSBjdXJyZW50CisgICAgICAgICAqICBpbnB1dCBzeW1ib2wgaXMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz5UaGlzIGlzIGlnbm9yZWQgZm9yIGxleGVycy48L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBvYmplY3QgR2V0Q3VycmVudElucHV0U3ltYm9sKCBJSW50U3RyZWFtIGlucHV0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uanVyZSB1cCBhIG1pc3NpbmcgdG9rZW4gZHVyaW5nIGVycm9yIHJlY292ZXJ5Ljwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgVGhlIHJlY29nbml6ZXIgYXR0ZW1wdHMgdG8gcmVjb3ZlciBmcm9tIHNpbmdsZSBtaXNzaW5nCisgICAgICAgICAqICBzeW1ib2xzLiBCdXQsIGFjdGlvbnMgbWlnaHQgcmVmZXIgdG8gdGhhdCBtaXNzaW5nIHN5bWJvbC4KKyAgICAgICAgICogIEZvciBleGFtcGxlLCB4PUlEIHtmKCR4KTt9LiBUaGUgYWN0aW9uIGNsZWFybHkgYXNzdW1lcworICAgICAgICAgKiAgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBpZGVudGlmaWVyIG1hdGNoZWQgcHJldmlvdXNseSBhbmQgdGhhdAorICAgICAgICAgKiAgJHggcG9pbnRzIGF0IHRoYXQgdG9rZW4uIElmIHRoYXQgdG9rZW4gaXMgbWlzc2luZywgYnV0CisgICAgICAgICAqICB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtIGlzIHdoYXQgd2Ugd2FudCB3ZSBhc3N1bWUgdGhhdAorICAgICAgICAgKiAgdGhpcyB0b2tlbiBpcyBtaXNzaW5nIGFuZCB3ZSBrZWVwIGdvaW5nLiBCZWNhdXNlIHdlCisgICAgICAgICAqICBoYXZlIHRvIHJldHVybiBzb21lIHRva2VuIHRvIHJlcGxhY2UgdGhlIG1pc3NpbmcgdG9rZW4sCisgICAgICAgICAqICB3ZSBoYXZlIHRvIGNvbmp1cmUgb25lIHVwLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdXNlciBjb250cm9sCisgICAgICAgICAqICBvdmVyIHRoZSB0b2tlbnMgcmV0dXJuZWQgZm9yIG1pc3NpbmcgdG9rZW5zLiBNb3N0bHksCisgICAgICAgICAqICB5b3Ugd2lsbCB3YW50IHRvIGNyZWF0ZSBzb21ldGhpbmcgc3BlY2lhbCBmb3IgaWRlbnRpZmllcgorICAgICAgICAgKiAgdG9rZW5zLiBGb3IgbGl0ZXJhbHMgc3VjaCBhcyAneycgYW5kICcsJywgdGhlIGRlZmF1bHQKKyAgICAgICAgICogIGFjdGlvbiBpbiB0aGUgcGFyc2VyIG9yIHRyZWUgcGFyc2VyIHdvcmtzLiBJdCBzaW1wbHkgY3JlYXRlcworICAgICAgICAgKiAgYSBDb21tb25Ub2tlbiBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gVGhlIHRleHQgd2lsbCBiZSB0aGUgdG9rZW4uCisgICAgICAgICAqICBJZiB5b3UgY2hhbmdlIHdoYXQgdG9rZW5zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgbGV4ZXIsCisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHRva2Vucy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIG9iamVjdCBHZXRNaXNzaW5nU3ltYm9sKCBJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFRva2VuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBmb2xsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZVVudGlsKCBJSW50U3RyZWFtIGlucHV0LCBpbnQgdG9rZW5UeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWVVbnRpbCAiK3Rva2VuVHlwZSk7CisgICAgICAgICAgICBpbnQgdHR5cGUgPSBpbnB1dC5MQSggMSApOworICAgICAgICAgICAgd2hpbGUgKCB0dHlwZSAhPSBUb2tlblR5cGVzLkVuZE9mRmlsZSAmJiB0dHlwZSAhPSB0b2tlblR5cGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICB0dHlwZSA9IGlucHV0LkxBKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3VtZSB0b2tlbnMgdW50aWwgb25lIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIHNldDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBDb25zdW1lVW50aWwoIElJbnRTdHJlYW0gaW5wdXQsIEJpdFNldCBzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uc3VtZVVudGlsKCIrc2V0LnRvU3RyaW5nKGdldFRva2VuTmFtZXMoKSkrIikiKTsKKyAgICAgICAgICAgIGludCB0dHlwZSA9IGlucHV0LkxBKCAxICk7CisgICAgICAgICAgICB3aGlsZSAoIHR0eXBlICE9IFRva2VuVHlwZXMuRW5kT2ZGaWxlICYmICFzZXQuTWVtYmVyKCB0dHlwZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uc3VtZSBkdXJpbmcgcmVjb3ZlciBMQSgxKT0iK2dldFRva2VuTmFtZXMoKVtpbnB1dC5MQSgxKV0pOworICAgICAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICB0dHlwZSA9IGlucHV0LkxBKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UHVzaCBhIHJ1bGUncyBmb2xsb3cgc2V0IHVzaW5nIG91ciBvd24gaGFyZGNvZGVkIHN0YWNrPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoRm9sbG93KCBCaXRTZXQgZnNldCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBzdGF0ZS5fZnNwICsgMSApID49IHN0YXRlLmZvbGxvd2luZy5MZW5ndGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFycmF5LlJlc2l6ZShyZWYgc3RhdGUuZm9sbG93aW5nLCBzdGF0ZS5mb2xsb3dpbmcuTGVuZ3RoICogMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5mb2xsb3dpbmdbKytzdGF0ZS5fZnNwXSA9IGZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQb3BGb2xsb3coKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gTGlzdDxTdHJpbmc+IG9mIHRoZSBydWxlcyBpbiB5b3VyIHBhcnNlciBpbnN0YW5jZQorICAgICAgICAgKiAgbGVhZGluZyB1cCB0byBhIGNhbGwgdG8gdGhpcyBtZXRob2QuICBZb3UgY291bGQgb3ZlcnJpZGUgaWYKKyAgICAgICAgICogIHlvdSB3YW50IG1vcmUgZGV0YWlscyBzdWNoIGFzIHRoZSBmaWxlL2xpbmUgaW5mbyBvZiB3aGVyZQorICAgICAgICAgKiAgaW4gdGhlIHBhcnNlciBqYXZhIGNvZGUgYSBydWxlIGlzIGludm9rZWQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIGVycm9yIG1lc3NhZ2VzIGFuZCBmb3IgY29udGV4dC1zZW5zaXRpdmUKKyAgICAgICAgICogIGVycm9yIHJlY292ZXJ5LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8c3RyaW5nPiBHZXRSdWxlSW52b2NhdGlvblN0YWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldFJ1bGVJbnZvY2F0aW9uU3RhY2soIG5ldyBTdGFja1RyYWNlKHRydWUpICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIG1vcmUgZ2VuZXJhbCB2ZXJzaW9uIG9mIEdldFJ1bGVJbnZvY2F0aW9uU3RhY2sgd2hlcmUgeW91IGNhbgorICAgICAgICAgKiAgcGFzcyBpbiB0aGUgU3RhY2tUcmFjZSBvZiwgZm9yIGV4YW1wbGUsIGEgUmVjb2duaXRpb25FeGNlcHRpb24KKyAgICAgICAgICogIHRvIGdldCBpdCdzIHJ1bGUgc3RhY2sgdHJhY2UuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIElMaXN0PHN0cmluZz4gR2V0UnVsZUludm9jYXRpb25TdGFjayhTdGFja1RyYWNlIHRyYWNlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFjZSIpOworCisgICAgICAgICAgICBMaXN0PHN0cmluZz4gcnVsZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgICAgICBTdGFja0ZyYW1lW10gc3RhY2sgPSB0cmFjZS5HZXRGcmFtZXMoKSA/PyBuZXcgU3RhY2tGcmFtZVswXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YWNrLkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YWNrRnJhbWUgZnJhbWUgPSBzdGFja1tpXTsKKyAgICAgICAgICAgICAgICBNZXRob2RCYXNlIG1ldGhvZCA9IGZyYW1lLkdldE1ldGhvZCgpOworICAgICAgICAgICAgICAgIEdyYW1tYXJSdWxlQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IChHcmFtbWFyUnVsZUF0dHJpYnV0ZVtdKW1ldGhvZC5HZXRDdXN0b21BdHRyaWJ1dGVzKHR5cGVvZihHcmFtbWFyUnVsZUF0dHJpYnV0ZSksIHRydWUpOworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwgJiYgYXR0cmlidXRlcy5MZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICBydWxlcy5BZGQoYXR0cmlidXRlc1swXS5OYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJ1bGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEJhY2t0cmFja2luZ0xldmVsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5iYWNrdHJhY2tpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZXR1cm4gd2hldGhlciBvciBub3QgYSBiYWNrdHJhY2tpbmcgYXR0ZW1wdCBmYWlsZWQuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEZhaWxlZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVXNlZCB0byBwcmludCBvdXQgdG9rZW4gbmFtZXMgbGlrZSBJRCBkdXJpbmcgZGVidWdnaW5nIGFuZAorICAgICAgICAgKiAgZXJyb3IgcmVwb3J0aW5nLiAgVGhlIGdlbmVyYXRlZCBwYXJzZXJzIGltcGxlbWVudCBhIG1ldGhvZAorICAgICAgICAgKiAgdGhhdCBvdmVycmlkZXMgdGhpcyB0byBwb2ludCB0byB0aGVpciBTdHJpbmdbXSB0b2tlbk5hbWVzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nW10gVG9rZW5OYW1lcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEZvciBkZWJ1Z2dpbmcgYW5kIG90aGVyIHB1cnBvc2VzLCBtaWdodCB3YW50IHRoZSBncmFtbWFyIG5hbWUuCisgICAgICAgICAqICBIYXZlIEFOVExSIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBHcmFtbWFyRmlsZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RyaW5nIFNvdXJjZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHVzZSBtb3N0IG9mdGVuIHdpdGggdGVtcGxhdGUgcmV3cml0ZXMuCisgICAgICAgICAqICBDb252ZXJ0IGEgTGlzdDxUb2tlbj4gdG8gTGlzdDxTdHJpbmc+CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PHN0cmluZz4gVG9TdHJpbmdzKCBJQ29sbGVjdGlvbjxJVG9rZW4+IHRva2VucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdG9rZW5zID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBMaXN0PHN0cmluZz4gc3RyaW5ncyA9IG5ldyBMaXN0PHN0cmluZz4oIHRva2Vucy5Db3VudCApOworICAgICAgICAgICAgZm9yZWFjaCAoIElUb2tlbiB0b2tlbiBpbiB0b2tlbnMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZ3MuQWRkKCB0b2tlbi5UZXh0ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gYSBydWxlIG51bWJlciBhbmQgYSBzdGFydCB0b2tlbiBpbmRleCBudW1iZXIsIHJldHVybgorICAgICAgICAgKiAgTUVNT19SVUxFX1VOS05PV04gaWYgdGhlIHJ1bGUgaGFzIG5vdCBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgZnJvbQorICAgICAgICAgKiAgc3RhcnQgaW5kZXguICBJZiB0aGlzIHJ1bGUgaGFzIHBhcnNlZCBpbnB1dCBzdGFydGluZyBmcm9tIHRoZQorICAgICAgICAgKiAgc3RhcnQgaW5kZXggYmVmb3JlLCB0aGVuIHJldHVybiB3aGVyZSB0aGUgcnVsZSBzdG9wcGVkIHBhcnNpbmcuCisgICAgICAgICAqICBJdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0b2tlbiBtYXRjaGVkIGJ5IHRoZSBydWxlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBGb3Igbm93IHdlIHVzZSBhIGhhc2h0YWJsZSBhbmQganVzdCB0aGUgc2xvdyBPYmplY3QtYmFzZWQgb25lLgorICAgICAgICAgKiAgTGF0ZXIsIHdlIGNhbiBtYWtlIGEgc3BlY2lhbCBvbmUgZm9yIGludHMgYW5kIGFsc28gb25lIHRoYXQKKyAgICAgICAgICogIHRvc3NlcyBvdXQgZGF0YSBhZnRlciB3ZSBjb21taXQgcGFzdCBpbnB1dCBwb3NpdGlvbiBpLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFJ1bGVNZW1vaXphdGlvbiggaW50IHJ1bGVJbmRleCwgaW50IHJ1bGVTdGFydEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF0gPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHN0b3BJbmRleDsKKyAgICAgICAgICAgIGlmICggIXN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF0uVHJ5R2V0VmFsdWUoIHJ1bGVTdGFydEluZGV4LCBvdXQgc3RvcEluZGV4ICkgKQorICAgICAgICAgICAgICAgIHJldHVybiBNZW1vUnVsZVVua25vd247CisKKyAgICAgICAgICAgIHJldHVybiBzdG9wSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBIYXMgdGhpcyBydWxlIGFscmVhZHkgcGFyc2VkIGlucHV0IGF0IHRoZSBjdXJyZW50IGluZGV4IGluIHRoZQorICAgICAgICAgKiAgaW5wdXQgc3RyZWFtPyAgUmV0dXJuIHRoZSBzdG9wIHRva2VuIGluZGV4IG9yIE1FTU9fUlVMRV9VTktOT1dOLgorICAgICAgICAgKiAgSWYgd2UgYXR0ZW1wdGVkIGJ1dCBmYWlsZWQgdG8gcGFyc2UgcHJvcGVybHkgYmVmb3JlLCByZXR1cm4KKyAgICAgICAgICogIE1FTU9fUlVMRV9GQUlMRUQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgbWV0aG9kIGhhcyBhIHNpZGUtZWZmZWN0OiBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBpbnB1dCBmb3IKKyAgICAgICAgICogIHRoaXMgcnVsZSBhbmQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBiZWZvcmUsIHRoZW4gc2VlayBhaGVhZCB0bworICAgICAgICAgKiAgMSBwYXN0IHRoZSBzdG9wIHRva2VuIG1hdGNoZWQgZm9yIHRoaXMgcnVsZSBsYXN0IHRpbWUuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEFscmVhZHlQYXJzZWRSdWxlKCBJSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN0b3BJbmRleCA9IEdldFJ1bGVNZW1vaXphdGlvbiggcnVsZUluZGV4LCBpbnB1dC5JbmRleCApOworICAgICAgICAgICAgaWYgKCBzdG9wSW5kZXggPT0gTWVtb1J1bGVVbmtub3duICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0b3BJbmRleCA9PSBNZW1vUnVsZUZhaWxlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgIitydWxlSW5kZXgrIiB3aWxsIG5ldmVyIHN1Y2NlZWQiKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJzZWVuIHJ1bGUgIitydWxlSW5kZXgrIiBiZWZvcmU7IHNraXBwaW5nIGFoZWFkIHRvIEAiKyhzdG9wSW5kZXgrMSkrIiBmYWlsZWQ9IitzdGF0ZS5mYWlsZWQpOworICAgICAgICAgICAgICAgIGlucHV0LlNlZWsoIHN0b3BJbmRleCArIDEgKTsgLy8ganVtcCB0byBvbmUgcGFzdCBzdG9wIHRva2VuCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlY29yZCB3aGV0aGVyIG9yIG5vdCB0aGlzIHJ1bGUgcGFyc2VkIHRoZSBpbnB1dCBhdCB0aGlzIHBvc2l0aW9uCisgICAgICAgICAqICBzdWNjZXNzZnVsbHkuICBVc2UgYSBzdGFuZGFyZCBqYXZhIGhhc2h0YWJsZSBmb3Igbm93LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBNZW1vaXplKCBJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydWxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bGVTdGFydEluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN0b3BUb2tlbkluZGV4ID0gc3RhdGUuZmFpbGVkID8gTWVtb1J1bGVGYWlsZWQgOiBpbnB1dC5JbmRleCAtIDE7CisgICAgICAgICAgICBpZiAoIHN0YXRlLnJ1bGVNZW1vID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUcmFjZURlc3RpbmF0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIFRyYWNlRGVzdGluYXRpb24uV3JpdGVMaW5lKCAiISEhISEhISEhIG1lbW8gYXJyYXkgaXMgbnVsbCBmb3IgIiArIEdyYW1tYXJGaWxlTmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBydWxlSW5kZXggPj0gc3RhdGUucnVsZU1lbW8uTGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoVHJhY2VEZXN0aW5hdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlTGluZSgiISEhISEhISEhIG1lbW8gc2l6ZSBpcyAiICsgc3RhdGUucnVsZU1lbW8uTGVuZ3RoICsgIiwgYnV0IHJ1bGUgaW5kZXggaXMgIiArIHJ1bGVJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF0gIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XVtydWxlU3RhcnRJbmRleF0gPSBzdG9wVG9rZW5JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5yZXR1cm4gaG93IG1hbnkgcnVsZS9pbnB1dC1pbmRleCBwYWlycyB0aGVyZSBhcmUgaW4gdG90YWwuPC9zdW1tYXJ5PgorICAgICAgICAgKiAgVE9ETzogdGhpcyBpbmNsdWRlcyBzeW5wcmVkcy4gOigKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBHZXRSdWxlTWVtb2l6YXRpb25DYWNoZVNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IHN0YXRlLnJ1bGVNZW1vICE9IG51bGwgJiYgaSA8IHN0YXRlLnJ1bGVNZW1vLkxlbmd0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcnVsZU1hcCA9IHN0YXRlLnJ1bGVNZW1vW2ldOworICAgICAgICAgICAgICAgIGlmICggcnVsZU1hcCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4gKz0gcnVsZU1hcC5Db3VudDsgLy8gaG93IG1hbnkgaW5wdXQgaW5kZXhlcyBhcmUgcmVjb3JkZWQ/CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlSW4oc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4LCBvYmplY3QgaW5wdXRTeW1ib2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChUcmFjZURlc3RpbmF0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlKCJlbnRlciAiICsgcnVsZU5hbWUgKyAiICIgKyBpbnB1dFN5bWJvbCk7CisgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlKCIgYmFja3RyYWNraW5nPSIgKyBzdGF0ZS5iYWNrdHJhY2tpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVHJhY2VPdXQoc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4LCBvYmplY3QgaW5wdXRTeW1ib2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChUcmFjZURlc3RpbmF0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBUcmFjZURlc3RpbmF0aW9uLldyaXRlKCJleGl0ICIgKyBydWxlTmFtZSArICIgIiArIGlucHV0U3ltYm9sKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyYWNlRGVzdGluYXRpb24uV3JpdGUoIiBiYWNrdHJhY2tpbmc9IiArIHN0YXRlLmJhY2t0cmFja2luZyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkKKyAgICAgICAgICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZSgiIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZSgiIHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2VEZXN0aW5hdGlvbi5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gRGVidWdnaW5nIHN1cHBvcnQKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSURlYnVnRXZlbnRMaXN0ZW5lciBEZWJ1Z0xpc3RlbmVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRW50ZXJSdWxlKHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5FbnRlclJ1bGUoZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdFeGl0UnVsZShzdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBzdHJpbmcgcnVsZU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRXhpdFJ1bGUoZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdFbnRlclN1YlJ1bGUoaW50IGRlY2lzaW9uTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLkVudGVyU3ViUnVsZShkZWNpc2lvbk51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdFeGl0U3ViUnVsZShpbnQgZGVjaXNpb25OdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRXhpdFN1YlJ1bGUoZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRW50ZXJBbHQoaW50IGFsdCkKKyAgICAgICAgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5FbnRlckFsdChhbHQpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRW50ZXJEZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIsIGJvb2wgY291bGRCYWNrdHJhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRW50ZXJEZWNpc2lvbihkZWNpc2lvbk51bWJlciwgY291bGRCYWNrdHJhY2spOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnRXhpdERlY2lzaW9uKGludCBkZWNpc2lvbk51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5FeGl0RGVjaXNpb24oZGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnTG9jYXRpb24oaW50IGxpbmUsIGludCBjaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuTG9jYXRpb24obGluZSwgY2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z1NlbWFudGljUHJlZGljYXRlKGJvb2wgcmVzdWx0LCBzdHJpbmcgcHJlZGljYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLlNlbWFudGljUHJlZGljYXRlKHJlc3VsdCwgcHJlZGljYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z0JlZ2luQmFja3RyYWNrKGludCBsZXZlbCkKKyAgICAgICAgeworICAgICAgICAgICAgSURlYnVnRXZlbnRMaXN0ZW5lciBkYmcgPSBEZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5CZWdpbkJhY2t0cmFjayhsZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICBbQ29uZGl0aW9uYWwoIkFOVExSX0RFQlVHIildCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRGVidWdFbmRCYWNrdHJhY2soaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gRGVidWdMaXN0ZW5lcjsKKyAgICAgICAgICAgIGlmIChkYmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkYmcuRW5kQmFja3RyYWNrKGxldmVsLCBzdWNjZXNzZnVsKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfREVCVUciKV0KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEZWJ1Z1JlY29nbml0aW9uRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBJRGVidWdFdmVudExpc3RlbmVyIGRiZyA9IERlYnVnTGlzdGVuZXI7CisgICAgICAgICAgICBpZiAoZGJnICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0JpdFNldC5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9CaXRTZXQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4NjExYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9CaXRTZXQuY3MKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHVzaW5nIEFycmF5ID0gU3lzdGVtLkFycmF5OworICAgIHVzaW5nIENMU0NvbXBsaWFudCA9IFN5c3RlbS5DTFNDb21wbGlhbnRBdHRyaWJ1dGU7CisgICAgdXNpbmcgSUNsb25lYWJsZSA9IFN5c3RlbS5JQ2xvbmVhYmxlOworICAgIHVzaW5nIE1hdGggPSBTeXN0ZW0uTWF0aDsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBzdHJpcHBlZC1kb3duIHZlcnNpb24gb2Ygb3JnLmFudGxyLm1pc2MuQml0U2V0IHRoYXQgaXMganVzdAorICAgICAqICBnb29kIGVub3VnaCB0byBoYW5kbGUgcnVudGltZSByZXF1aXJlbWVudHMgc3VjaCBhcyBGT0xMT1cgc2V0cworICAgICAqICBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5LgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIHNlYWxlZCBjbGFzcyBCaXRTZXQgOiBJQ2xvbmVhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBCSVRTID0gNjQ7ICAgIC8vIG51bWJlciBvZiBiaXRzIC8gbG9uZworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBMT0dfQklUUyA9IDY7IC8vIDJeNiA9PSA2NAorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdlIHdpbGwgb2Z0ZW4gbmVlZCB0byBkbyBhIG1vZCBvcGVyYXRvciAoaSBtb2QgbmJpdHMpLiAgSXRzCisgICAgICAgICAqICB0dXJucyBvdXQgdGhhdCwgZm9yIHBvd2VycyBvZiB0d28sIHRoaXMgbW9kIG9wZXJhdGlvbiBpcworICAgICAgICAgKiAgc2FtZSBhcyAoaSAmIChuYml0cy0xKSkuICBTaW5jZSBtb2QgaXMgc2xvdywgd2UgdXNlIGEKKyAgICAgICAgICogIHByZWNvbXB1dGVkIG1vZCBtYXNrIHRvIGRvIHRoZSBtb2QgaW5zdGVhZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IE1PRF9NQVNLID0gQklUUyAtIDE7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoZSBhY3R1YWwgZGF0YSBiaXRzPC9zdW1tYXJ5PiAqLworICAgICAgICB1bG9uZ1tdIF9iaXRzOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Db25zdHJ1Y3QgYSBiaXRzZXQgb2Ygc2l6ZSBvbmUgd29yZCAoNjQgYml0cyk8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBCaXRTZXQoKQorICAgICAgICAgICAgOiB0aGlzKCBCSVRTICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkNvbnN0cnVjdGlvbiBmcm9tIGEgc3RhdGljIGFycmF5IG9mIGxvbmdzPC9zdW1tYXJ5PiAqLworICAgICAgICBbQ0xTQ29tcGxpYW50KCBmYWxzZSApXQorICAgICAgICBwdWJsaWMgQml0U2V0KCB1bG9uZ1tdIGJpdHMgKQorICAgICAgICB7CisgICAgICAgICAgICBfYml0cyA9IGJpdHM7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3RydWN0aW9uIGZyb20gYSBsaXN0IG9mIGludGVnZXJzPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgQml0U2V0KCBJRW51bWVyYWJsZTxpbnQ+IGl0ZW1zICkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCBpbnQgaSBpbiBpdGVtcyApCisgICAgICAgICAgICAgICAgQWRkKCBpICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q29uc3RydWN0IGEgYml0c2V0IGdpdmVuIHRoZSBzaXplPC9zdW1tYXJ5PgorICAgICAgICAgKiAgPHBhcmFtIG5hbWU9Im5iaXRzIj5UaGUgc2l6ZSBvZiB0aGUgYml0c2V0IGluIGJpdHM8L3BhcmFtPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJpdFNldCggaW50IG5iaXRzICkKKyAgICAgICAgeworICAgICAgICAgICAgX2JpdHMgPSBuZXcgdWxvbmdbKCAoIG5iaXRzIC0gMSApID4+IExPR19CSVRTICkgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IE9mKCBpbnQgZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRTZXQgcyA9IG5ldyBCaXRTZXQoIGVsICsgMSApOworICAgICAgICAgICAgcy5BZGQoIGVsICk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IE9mKCBpbnQgYSwgaW50IGIgKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRTZXQgcyA9IG5ldyBCaXRTZXQoIE1hdGguTWF4KCBhLCBiICkgKyAxICk7CisgICAgICAgICAgICBzLkFkZCggYSApOworICAgICAgICAgICAgcy5BZGQoIGIgKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgT2YoIGludCBhLCBpbnQgYiwgaW50IGMgKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRTZXQgcyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgIHMuQWRkKCBhICk7CisgICAgICAgICAgICBzLkFkZCggYiApOworICAgICAgICAgICAgcy5BZGQoIGMgKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgT2YoIGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkICkKKyAgICAgICAgeworICAgICAgICAgICAgQml0U2V0IHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgICAgICBzLkFkZCggYSApOworICAgICAgICAgICAgcy5BZGQoIGIgKTsKKyAgICAgICAgICAgIHMuQWRkKCBjICk7CisgICAgICAgICAgICBzLkFkZCggZCApOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+cmV0dXJuIHRoaXMgfCBhIGluIGEgbmV3IHNldDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIEJpdFNldCBPciggQml0U2V0IGEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGEgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCaXRTZXQgcyA9IChCaXRTZXQpdGhpcy5DbG9uZSgpOworICAgICAgICAgICAgcy5PckluUGxhY2UoIGEgKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pm9yIHRoaXMgZWxlbWVudCBpbnRvIHRoaXMgc2V0IChncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSk8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZCggaW50IGVsICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBXb3JkTnVtYmVyKCBlbCApOworICAgICAgICAgICAgaWYgKCBuID49IF9iaXRzLkxlbmd0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR3Jvd1RvSW5jbHVkZSggZWwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9iaXRzW25dIHw9IEJpdE1hc2soIGVsICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+R3Jvd3MgdGhlIHNldCB0byBhIGxhcmdlciBudW1iZXIgb2YgYml0cy48L3N1bW1hcnk+CisgICAgICAgICAqICA8cGFyYW0gbmFtZT0iYml0Ij5lbGVtZW50IHRoYXQgbXVzdCBmaXQgaW4gc2V0PC9wYXJhbT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIEdyb3dUb0luY2x1ZGUoIGludCBiaXQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IE1hdGguTWF4KCBfYml0cy5MZW5ndGggPDwgMSwgTnVtV29yZHNUb0hvbGQoIGJpdCApICk7CisgICAgICAgICAgICBTZXRTaXplKG5ld1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgT3JJblBsYWNlKCBCaXRTZXQgYSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYSA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHNtYWxsZXIgdGhhbiBhLCBncm93IHRoaXMgZmlyc3QKKyAgICAgICAgICAgIGlmICggYS5fYml0cy5MZW5ndGggPiBfYml0cy5MZW5ndGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldFNpemUoIGEuX2JpdHMuTGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWluID0gTWF0aC5NaW4oIF9iaXRzLkxlbmd0aCwgYS5fYml0cy5MZW5ndGggKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gbWluIC0gMTsgaSA+PSAwOyBpLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9iaXRzW2ldIHw9IGEuX2JpdHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+U2V0cyB0aGUgc2l6ZSBvZiBhIHNldC48L3N1bW1hcnk+CisgICAgICAgICAqICA8cGFyYW0gbmFtZT0ibndvcmRzIj5ob3cgbWFueSB3b3JkcyB0aGUgbmV3IHNldCBzaG91bGQgYmU8L3BhcmFtPgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFNpemUoIGludCBud29yZHMgKQorICAgICAgICB7CisgICAgICAgICAgICBBcnJheS5SZXNpemUocmVmIF9iaXRzLCBud29yZHMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdWxvbmcgQml0TWFzayggaW50IGJpdE51bWJlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiaXRQb3NpdGlvbiA9IGJpdE51bWJlciAmIE1PRF9NQVNLOyAvLyBiaXROdW1iZXIgbW9kIEJJVFMKKyAgICAgICAgICAgIHJldHVybiAxVUwgPDwgYml0UG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb2JqZWN0IENsb25lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaXRTZXQoICh1bG9uZ1tdKV9iaXRzLkNsb25lKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkZWcgPSAwOworICAgICAgICAgICAgZm9yICggaW50IGkgPSBfYml0cy5MZW5ndGggLSAxOyBpID49IDA7IGktLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWxvbmcgd29yZCA9IF9iaXRzW2ldOworICAgICAgICAgICAgICAgIGlmICggd29yZCAhPSAwTCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgYml0ID0gQklUUyAtIDE7IGJpdCA+PSAwOyBiaXQtLSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCB3b3JkICYgKCAxVUwgPDwgYml0ICkgKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWcrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN5c3RlbS5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKCBvYmplY3Qgb3RoZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG90aGVyID09IG51bGwgfHwgISggb3RoZXIgaXMgQml0U2V0ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQml0U2V0IG90aGVyU2V0ID0gKEJpdFNldClvdGhlcjsKKworICAgICAgICAgICAgaW50IG4gPSBNYXRoLk1pbiggdGhpcy5fYml0cy5MZW5ndGgsIG90aGVyU2V0Ll9iaXRzLkxlbmd0aCApOworCisgICAgICAgICAgICAvLyBmb3IgYW55IGJpdHMgaW4gY29tbW9uLCBjb21wYXJlCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdGhpcy5fYml0c1tpXSAhPSBvdGhlclNldC5fYml0c1tpXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYW55IGV4dHJhIGJpdHMgYXJlIG9mZgorCisgICAgICAgICAgICBpZiAoIHRoaXMuX2JpdHMuTGVuZ3RoID4gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBuICsgMTsgaSA8IHRoaXMuX2JpdHMuTGVuZ3RoOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLl9iaXRzW2ldICE9IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggb3RoZXJTZXQuX2JpdHMuTGVuZ3RoID4gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBuICsgMTsgaSA8IG90aGVyU2V0Ll9iaXRzLkxlbmd0aDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggb3RoZXJTZXQuX2JpdHNbaV0gIT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBNZW1iZXIoIGludCBlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZWwgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbiA9IFdvcmROdW1iZXIoIGVsICk7CisgICAgICAgICAgICBpZiAoIG4gPj0gX2JpdHMuTGVuZ3RoICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKCBfYml0c1tuXSAmIEJpdE1hc2soIGVsICkgKSAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoaXMgZWxlbWVudCBmcm9tIHRoaXMgc2V0CisgICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZSggaW50IGVsICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBXb3JkTnVtYmVyKCBlbCApOworICAgICAgICAgICAgaWYgKCBuIDwgX2JpdHMuTGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYml0c1tuXSAmPSB+Qml0TWFzayggZWwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIElzTmlsKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGkgPSBfYml0cy5MZW5ndGggLSAxOyBpID49IDA7IGktLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBfYml0c1tpXSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTnVtV29yZHNUb0hvbGQoIGludCBlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoIGVsID4+IExPR19CSVRTICkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBOdW1CaXRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9iaXRzLkxlbmd0aCA8PCBMT0dfQklUUzsgLy8gbnVtIHdvcmRzICogYml0cyBwZXIgd29yZAorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PnJldHVybiBob3cgbXVjaCBzcGFjZSBpcyBiZWluZyB1c2VkIGJ5IHRoZSBiaXRzIGFycmF5IG5vdCBob3cgbWFueSBhY3R1YWxseSBoYXZlIG1lbWJlciBiaXRzIG9uLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCBMZW5ndGhJbkxvbmdXb3JkcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfYml0cy5MZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvKipJcyB0aGlzIGNvbnRhaW5lZCB3aXRoaW4gYT8gKi8KKyAgICAgICAgLyoKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3Vic2V0KEJpdFNldCBhKSB7CisgICAgICAgICAgICBpZiAoYSA9PSBudWxsIHx8ICEoYSBpbnN0YW5jZW9mIEJpdFNldCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmFuZChhKS5lcXVhbHModGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBwdWJsaWMgaW50W10gVG9BcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludFtdIGVsZW1zID0gbmV3IGludFtTaXplKCldOworICAgICAgICAgICAgaW50IGVuID0gMDsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8ICggX2JpdHMuTGVuZ3RoIDw8IExPR19CSVRTICk7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBNZW1iZXIoIGkgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtc1tlbisrXSA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVsZW1zOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFdvcmROdW1iZXIoIGludCBiaXQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYml0ID4+IExPR19CSVRTOyAvLyBiaXQgLyBCSVRTCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFRvU3RyaW5nKCBzdHJpbmdbXSB0b2tlbk5hbWVzICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc3RyaW5nIHNlcGFyYXRvciA9ICIsIjsKKyAgICAgICAgICAgIGJvb2wgaGF2ZVByaW50ZWRBbkVsZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICd7JyApOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCAoIF9iaXRzLkxlbmd0aCA8PCBMT0dfQklUUyApOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggTWVtYmVyKCBpICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpID4gMCAmJiBoYXZlUHJpbnRlZEFuRWxlbWVudCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHNlcGFyYXRvciApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggdG9rZW5OYW1lcyAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggdG9rZW5OYW1lc1tpXSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggaSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhdmVQcmludGVkQW5FbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuQXBwZW5kKCAnfScgKTsKKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9CdWZmZXJlZFRva2VuU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0J1ZmZlcmVkVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3ZTY0YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9CdWZmZXJlZFRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsNDI1IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgQ0xTQ29tcGxpYW50ID0gU3lzdGVtLkNMU0NvbXBsaWFudEF0dHJpYnV0ZTsKKyAgICB1c2luZyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24gPSBTeXN0ZW0uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uOworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisgICAgLyoqIEJ1ZmZlciBhbGwgaW5wdXQgdG9rZW5zIGJ1dCBkbyBvbi1kZW1hbmQgZmV0Y2hpbmcgb2YgbmV3IHRva2VucyBmcm9tCisgICAgICogIGxleGVyLiBVc2VmdWwgd2hlbiB0aGUgcGFyc2VyIG9yIGxleGVyIGhhcyB0byBzZXQgY29udGV4dC9tb2RlIGluZm8gYmVmb3JlCisgICAgICogIHByb3BlciBsZXhpbmcgb2YgZnV0dXJlIHRva2Vucy4gVGhlIFNUIHRlbXBsYXRlIHBhcnNlciBuZWVkcyB0aGlzLAorICAgICAqICBmb3IgZXhhbXBsZSwgYmVjYXVzZSBpdCBoYXMgdG8gY29uc3RhbnRseSBmbGlwIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4KKyAgICAgKiAgaW5zaWRlL291dHB1dCB0ZW1wbGF0ZXMuIEUuZy4sIDxuYW1lczp7aGksIDxpdD59PiBoYXMgdG8gcGFyc2UgbmFtZXMKKyAgICAgKiAgYXMgcGFydCBvZiBhbiBleHByZXNzaW9uIGJ1dCAiaGksIDxpdD4iIGFzIGEgbmVzdGVkIHRlbXBsYXRlLgorICAgICAqCisgICAgICogIFlvdSBjYW4ndCB1c2UgdGhpcyBzdHJlYW0gaWYgeW91IHBhc3Mgd2hpdGVzcGFjZSBvciBvdGhlciBvZmYtY2hhbm5lbAorICAgICAqICB0b2tlbnMgdG8gdGhlIHBhcnNlci4gVGhlIHN0cmVhbSBjYW4ndCBpZ25vcmUgb2ZmLWNoYW5uZWwgdG9rZW5zLgorICAgICAqICAoVW5idWZmZXJlZFRva2VuU3RyZWFtIGlzIHRoZSBzYW1lIHdheS4pCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyBub3QgYSBzdWJjbGFzcyBvZiBVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0gYmVjYXVzZSBJIGRvbid0IHdhbnQKKyAgICAgKiAgdG8gY29uZnVzZSBzbWFsbCBtb3Zpbmcgd2luZG93IG9mIHRva2VucyBpdCB1c2VzIGZvciB0aGUgZnVsbCBidWZmZXIuCisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEJ1ZmZlcmVkVG9rZW5TdHJlYW0gOiBJVG9rZW5TdHJlYW0sIElUb2tlblN0cmVhbUluZm9ybWF0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIElUb2tlblNvdXJjZSBfdG9rZW5Tb3VyY2U7CisKKyAgICAgICAgLyoqIFJlY29yZCBldmVyeSBzaW5nbGUgdG9rZW4gcHVsbGVkIGZyb20gdGhlIHNvdXJjZSBzbyB3ZSBjYW4gcmVwcm9kdWNlCisgICAgICAgICAqICBjaHVua3Mgb2YgaXQgbGF0ZXIuICBUaGUgYnVmZmVyIGluIExvb2thaGVhZFN0cmVhbSBvdmVybGFwcyBzb21ldGltZXMKKyAgICAgICAgICogIGFzIGl0cyBtb3Zpbmcgd2luZG93IG1vdmVzIHRocm91Z2ggdGhlIGlucHV0LiAgVGhpcyBsaXN0IGNhcHR1cmVzCisgICAgICAgICAqICBldmVyeXRoaW5nIHNvIHdlIGNhbiBhY2Nlc3MgY29tcGxldGUgaW5wdXQgdGV4dC4KKyAgICAgICAgICovCisgICAgICAgIFtDTFNDb21wbGlhbnQoZmFsc2UpXQorICAgICAgICBwcm90ZWN0ZWQgTGlzdDxJVG9rZW4+IF90b2tlbnMgPSBuZXcgTGlzdDxJVG9rZW4+KDEwMCk7CisKKyAgICAgICAgLyoqIFRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLiAqLworICAgICAgICBwcml2YXRlIGludCBfbGFzdE1hcmtlcjsKKworICAgICAgICAvKiogVGhlIGluZGV4IGludG8gdGhlIHRva2VucyBsaXN0IG9mIHRoZSBjdXJyZW50IHRva2VuIChuZXh0IHRva2VuCisgICAgICAgICAqICB0byBjb25zdW1lKS4gIHRva2Vuc1twXSBzaG91bGQgYmUgTFQoMSkuICBwPS0xIGluZGljYXRlcyBuZWVkCisgICAgICAgICAqICB0byBpbml0aWFsaXplIHdpdGggZmlyc3QgdG9rZW4uICBUaGUgY3RvciBkb2Vzbid0IGdldCBhIHRva2VuLgorICAgICAgICAgKiAgRmlyc3QgY2FsbCB0byBMVCgxKSBvciB3aGF0ZXZlciBnZXRzIHRoZSBmaXJzdCB0b2tlbiBhbmQgc2V0cyBwPTA7CisgICAgICAgICAqLworICAgICAgICBbQ0xTQ29tcGxpYW50KGZhbHNlKV0KKyAgICAgICAgcHJvdGVjdGVkIGludCBfcCA9IC0xOworCisgICAgICAgIHB1YmxpYyBCdWZmZXJlZFRva2VuU3RyZWFtKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1ZmZlcmVkVG9rZW5TdHJlYW0oSVRva2VuU291cmNlIHRva2VuU291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl90b2tlblNvdXJjZSA9IHRva2VuU291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU291cmNlIFRva2VuU291cmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLl90b2tlblNvdXJjZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIF90b2tlbnMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBfcCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvdyBkZWVwIGhhdmUgd2UgZ29uZT8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFJhbmdlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90b2tlbnMuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2VuU291cmNlLlNvdXJjZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTGFzdFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBMQigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBMYXN0UmVhbFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICBJVG9rZW4gdG9rZW47CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBMQihpKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICh0b2tlbiAhPSBudWxsICYmIHRva2VuLkxpbmUgPD0gMCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTWF4TG9va0JlaGluZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Lk1heFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1hcmsoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3AgPT0gLTEpCisgICAgICAgICAgICAgICAgU2V0dXAoKTsKKyAgICAgICAgICAgIF9sYXN0TWFya2VyID0gSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gX2xhc3RNYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlbGVhc2UoaW50IG1hcmtlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm8gcmVzb3VyY2VzIHRvIHJlbGVhc2UKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKGludCBtYXJrZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlZWsobWFya2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VlayhfbGFzdE1hcmtlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX3AgPSAwOworICAgICAgICAgICAgX2xhc3RNYXJrZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZWVrKGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgX3AgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNb3ZlIHRoZSBpbnB1dCBwb2ludGVyIHRvIHRoZSBuZXh0IGluY29taW5nIHRva2VuLiAgVGhlIHN0cmVhbQorICAgICAgICAgKiAgbXVzdCBiZWNvbWUgYWN0aXZlIHdpdGggTFQoMSkgYXZhaWxhYmxlLiAgY29uc3VtZSgpIHNpbXBseQorICAgICAgICAgKiAgbW92ZXMgdGhlIGlucHV0IHBvaW50ZXIgc28gdGhhdCBMVCgxKSBwb2ludHMgYXQgdGhlIG5leHQKKyAgICAgICAgICogIGlucHV0IHN5bWJvbC4gQ29uc3VtZSBhdCBsZWFzdCBvbmUgdG9rZW4uCisgICAgICAgICAqCisgICAgICAgICAqICBXYWxrIHBhc3QgYW55IHRva2VuIG5vdCBvbiB0aGUgY2hhbm5lbCB0aGUgcGFyc2VyIGlzIGxpc3RlbmluZyB0by4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgX3ArKzsKKyAgICAgICAgICAgIFN5bmMoX3ApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2Ugc3VyZSBpbmRleCBpIGluIHRva2VucyBoYXMgYSB0b2tlbi4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTeW5jKGludCBpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IGkgLSBfdG9rZW5zLkNvdW50ICsgMTsgLy8gaG93IG1hbnkgbW9yZSBlbGVtZW50cyB3ZSBuZWVkPworICAgICAgICAgICAgaWYgKG4gPiAwKQorICAgICAgICAgICAgICAgIEZldGNoKG4pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIGFkZCBuIGVsZW1lbnRzIHRvIGJ1ZmZlciAqLworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEZldGNoKGludCBuKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVG9rZW4gdCA9IFRva2VuU291cmNlLk5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIHQuVG9rZW5JbmRleCA9IF90b2tlbnMuQ291bnQ7CisgICAgICAgICAgICAgICAgX3Rva2Vucy5BZGQodCk7CisgICAgICAgICAgICAgICAgaWYgKHQuVHlwZSA9PSBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gR2V0KGludCBpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBfdG9rZW5zLkNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oInRva2VuIGluZGV4ICIgKyBpICsgIiBvdXQgb2YgcmFuZ2UgMC4uIiArIChfdG9rZW5zLkNvdW50IC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF90b2tlbnNbaV07CisgICAgICAgIH0KKworI2lmIGZhbHNlIC8vIHdoeSBpcyB0aGlzIGRpZmZlcmVudCBmcm9tIEdldFRva2VucyhzdGFydCwgY291bnQpID8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0IGFsbCB0b2tlbnMgZnJvbSBzdGFydC4uKHN0YXJ0K2NvdW50LTEpIGluY2x1c2l2ZWx5CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIExpc3Q8SVRva2VuPiBHZXQoaW50IHN0YXJ0LCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigic3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiY291bnQiKTsKKyAgICAgICAgICAgIGlmIChzdGFydCArIGNvdW50ID49IF90b2tlbnMuQ291bnQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworCisgICAgICAgICAgICBMaXN0PElUb2tlbj4gc3Vic2V0ID0gbmV3IExpc3Q8SVRva2VuPihjb3VudCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRva2VuIHRva2VuID0gX3Rva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4uVHlwZSA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBzdWJzZXQuQWRkKHRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHN1YnNldDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKGludCBpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTFQoaSkuVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElUb2tlbiBMQihpbnQgaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChfcCAtIGspIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIF90b2tlbnNbX3AgLSBrXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBMVChpbnQgaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wID09IC0xKQorICAgICAgICAgICAgICAgIFNldHVwKCk7CisgICAgICAgICAgICBpZiAoayA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBMQigtayk7CisKKyAgICAgICAgICAgIGludCBpID0gX3AgKyBrIC0gMTsKKyAgICAgICAgICAgIFN5bmMoaSk7CisgICAgICAgICAgICBpZiAoaSA+PSBfdG9rZW5zLkNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEVPRiBtdXN0IGJlIGxhc3QgdG9rZW4KKyAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2Vuc1tfdG9rZW5zLkNvdW50IC0gMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpID4gUmFuZ2UpCisgICAgICAgICAgICAgICAgUmFuZ2UgPSBpOworCisgICAgICAgICAgICByZXR1cm4gX3Rva2Vuc1tfcCArIGsgLSAxXTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgU2V0dXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTeW5jKDApOworICAgICAgICAgICAgX3AgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucyhpbnQgc3RhcnQsIGludCBzdG9wKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0VG9rZW5zKHN0YXJ0LCBzdG9wLCBkZWZhdWx0KEJpdFNldCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEdpdmVuIGEgc3RhcnQgYW5kIHN0b3AgaW5kZXgsIHJldHVybiBhIExpc3Qgb2YgYWxsIHRva2VucyBpbgorICAgICAgICAgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgICAgICAgICAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucyhpbnQgc3RhcnQsIGludCBzdG9wLCBCaXRTZXQgdHlwZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgaWYgKHN0b3AgPj0gX3Rva2Vucy5Db3VudCkKKyAgICAgICAgICAgICAgICBzdG9wID0gX3Rva2Vucy5Db3VudCAtIDE7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGlmIChzdGFydCA+IHN0b3ApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIC8vIGxpc3QgPSB0b2tlbnNbc3RhcnQ6c3RvcF06e1Rva2VuIHQsIHQuZ2V0VHlwZSgpIGluIHR5cGVzfQorICAgICAgICAgICAgTGlzdDxJVG9rZW4+IGZpbHRlcmVkVG9rZW5zID0gbmV3IExpc3Q8SVRva2VuPigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVG9rZW4gdCA9IF90b2tlbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKHR5cGVzID09IG51bGwgfHwgdHlwZXMuTWVtYmVyKHQuVHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFRva2Vucy5BZGQodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbHRlcmVkVG9rZW5zLkNvdW50ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWRUb2tlbnMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgTGlzdDxJVG9rZW4+IEdldFRva2VucyhpbnQgc3RhcnQsIGludCBzdG9wLCBJRW51bWVyYWJsZTxpbnQ+IHR5cGVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0VG9rZW5zKHN0YXJ0LCBzdG9wLCBuZXcgQml0U2V0KHR5cGVzKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PElUb2tlbj4gR2V0VG9rZW5zKGludCBzdGFydCwgaW50IHN0b3AsIGludCB0dHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldFRva2VucyhzdGFydCwgc3RvcCwgQml0U2V0Lk9mKHR0eXBlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wID09IC0xKQorICAgICAgICAgICAgICAgIFNldHVwKCk7CisKKyAgICAgICAgICAgIEZpbGwoKTsKKyAgICAgICAgICAgIHJldHVybiBUb1N0cmluZygwLCBfdG9rZW5zLkNvdW50IC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmcoaW50IHN0YXJ0LCBpbnQgc3RvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdG9wIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgaWYgKHN0b3AgPj0gX3Rva2Vucy5Db3VudCkKKyAgICAgICAgICAgICAgICBzdG9wID0gX3Rva2Vucy5Db3VudCAtIDE7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBzdG9wOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRva2VuIHQgPSBfdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmICh0LlR5cGUgPT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQodC5UZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKElUb2tlbiBzdGFydCwgSVRva2VuIHN0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBudWxsICYmIHN0b3AgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoc3RhcnQuVG9rZW5JbmRleCwgc3RvcC5Ub2tlbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGaWxsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wID09IC0xKQorICAgICAgICAgICAgICAgIFNldHVwKCk7CisKKyAgICAgICAgICAgIGlmIChfdG9rZW5zW19wXS5UeXBlID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGkgPSBfcCArIDE7CisgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgd2hpbGUgKF90b2tlbnNbaV0uVHlwZSAhPSBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgU3luYyhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9DaGFyU3RyZWFtQ29uc3RhbnRzLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0NoYXJTdHJlYW1Db25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkMTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9DaGFyU3RyZWFtQ29uc3RhbnRzLmNzCkBAIC0wLDAgKzEsNDEgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hhclN0cmVhbUNvbnN0YW50cworICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFbmRPZkZpbGUgPSAtMTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9DaGFyU3RyZWFtU3RhdGUuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTU3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLmNzCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFdoZW4gd2Fsa2luZyBhaGVhZCB3aXRoIGN5Y2xpYyBERkEgb3IgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLAorICAgICAqICB3ZSBuZWVkIHRvIHJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIGlucHV0IHN0cmVhbSAoY2hhciBpbmRleCwKKyAgICAgKiAgbGluZSwgZXRjLi4uKSBzbyB0aGF0IHdlIGNhbiByZXdpbmQgdGhlIHN0YXRlIGFmdGVyIHNjYW5uaW5nIGFoZWFkLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+VGhpcyBpcyB0aGUgY29tcGxldGUgc3RhdGUgb2YgYSBzdHJlYW0uPC9yZW1hcmtzPgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBDaGFyU3RyZWFtU3RhdGUKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5JbmRleCBpbnRvIHRoZSBjaGFyIHN0cmVhbSBvZiBuZXh0IGxvb2thaGVhZCBjaGFyPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgaW50IHA7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgbGluZSBudW1iZXIgaXMgdGhlIHNjYW5uZXIgYXQgYmVmb3JlIHByb2Nlc3NpbmcgYnVmZmVyW3BdPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCBsaW5lOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGNoYXIgcG9zaXRpb24gMC4ubi0xIGluIGxpbmUgaXMgc2Nhbm5lciBiZWZvcmUgcHJvY2Vzc2luZyBidWZmZXJbcF0/PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgaW50IGNoYXJQb3NpdGlvbkluTGluZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQ2xhc3NpY1Rva2VuLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0NsYXNzaWNUb2tlbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFlNTliCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0NsYXNzaWNUb2tlbi5jcwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBUb2tlbiBvYmplY3QgbGlrZSB3ZSdkIHVzZSBpbiBBTlRMUiAyLng7IGhhcyBhbiBhY3R1YWwgc3RyaW5nIGNyZWF0ZWQKKyAgICAgKiAgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gIFRoZXNlIG9iamVjdHMgYXJlIG5lZWRlZCBmb3IgaW1hZ2luYXJ5CisgICAgICogIHRyZWUgbm9kZXMgdGhhdCBoYXZlIHBheWxvYWQgb2JqZWN0cy4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgVG9rZW4gb2JqZWN0CisgICAgICogIHRoYXQgaGFzIGEgc3RyaW5nOyB0aGUgdHJlZSBub2RlIHdpbGwgcG9pbnQgYXQgdGhpcyB0b2tlbi4gIENvbW1vblRva2VuCisgICAgICogIGhhcyBpbmRleGVzIGludG8gYSBjaGFyIHN0cmVhbSBhbmQgaGVuY2UgY2Fubm90IGJlIHVzZWQgdG8gaW50cm9kdWNlCisgICAgICogIG5ldyBzdHJpbmdzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENsYXNzaWNUb2tlbiA6IElUb2tlbgorICAgIHsKKyAgICAgICAgc3RyaW5nIHRleHQ7CisgICAgICAgIGludCB0eXBlOworICAgICAgICBpbnQgbGluZTsKKyAgICAgICAgaW50IGNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgdG9rZW4gbnVtYmVyIGlzIHRoaXMgZnJvbSAwLi5uLTEgdG9rZW5zPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgcHVibGljIENsYXNzaWNUb2tlbiggaW50IHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzaWNUb2tlbiggSVRva2VuIG9sZFRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgdGV4dCA9IG9sZFRva2VuLlRleHQ7CisgICAgICAgICAgICB0eXBlID0gb2xkVG9rZW4uVHlwZTsKKyAgICAgICAgICAgIGxpbmUgPSBvbGRUb2tlbi5MaW5lOworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gb2xkVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgY2hhbm5lbCA9IG9sZFRva2VuLkNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NpY1Rva2VuKCBpbnQgdHlwZSwgc3RyaW5nIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc2ljVG9rZW4oIGludCB0eXBlLCBzdHJpbmcgdGV4dCwgaW50IGNoYW5uZWwgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIElUb2tlbiBNZW1iZXJzCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRleHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ2hhbm5lbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU3RhcnRJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU3RvcEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUb2tlbkluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUNoYXJTdHJlYW0gSW5wdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKKyAgICAgICAgICAgIGlmICggY2hhbm5lbCA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWxTdHIgPSAiLGNoYW5uZWw9IiArIGNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgdHh0ID0gVGV4dDsKKyAgICAgICAgICAgIGlmICggdHh0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR4dCA9IHR4dC5SZXBsYWNlKCAiXG4iLCAiXFxcXG4iICk7CisgICAgICAgICAgICAgICAgdHh0ID0gdHh0LlJlcGxhY2UoICJcciIsICJcXFxcciIgKTsKKyAgICAgICAgICAgICAgICB0eHQgPSB0eHQuUmVwbGFjZSggIlx0IiwgIlxcXFx0IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR4dCA9ICI8bm8gdGV4dD4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJbQCIgKyBUb2tlbkluZGV4ICsgIiwnIiArIHR4dCArICInLDwiICsgdHlwZSArICI+IiArIGNoYW5uZWxTdHIgKyAiLCIgKyBsaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lICsgIl0iOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0NvbW1vblRva2VuLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0NvbW1vblRva2VuLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTdjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQ29tbW9uVG9rZW4uY3MKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBOb25TZXJpYWxpemVkID0gU3lzdGVtLk5vblNlcmlhbGl6ZWRBdHRyaWJ1dGU7CisgICAgdXNpbmcgUmVnZXggPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXg7CisgICAgdXNpbmcgU2VyaWFsaXphYmxlID0gU3lzdGVtLlNlcmlhbGl6YWJsZUF0dHJpYnV0ZTsKKworICAgIFtTZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENvbW1vblRva2VuIDogSVRva2VuCisgICAgeworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIGludCBjaGFyUG9zaXRpb25JbkxpbmUgPSAtMTsgLy8gc2V0IHRvIGludmFsaWQgcG9zaXRpb24KKyAgICAgICAgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgIFtOb25TZXJpYWxpemVkXQorICAgICAgICBJQ2hhclN0cmVhbSBpbnB1dDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXZSBuZWVkIHRvIGJlIGFibGUgdG8gY2hhbmdlIHRoZSB0ZXh0IG9uY2UgaW4gYSB3aGlsZS4gIElmCisgICAgICAgICAqICB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGdldFRleHQgc2hvdWxkIHJldHVybiB0aGlzLiAgTm90ZSB0aGF0CisgICAgICAgICAqICBzdGFydC9zdG9wIGFyZSBub3QgYWZmZWN0ZWQgYnkgY2hhbmdpbmcgdGhpcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICAqLworICAgICAgICBzdHJpbmcgdGV4dDsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCB0b2tlbiBudW1iZXIgaXMgdGhpcyBmcm9tIDAuLm4tMSB0b2tlbnM7ICZsdDsgMCBpbXBsaWVzIGludmFsaWQgaW5kZXg8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBpbmRleCA9IC0xOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdGFydHM8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBzdGFydDsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGNoYXIgcG9zaXRpb24gaW50byB0aGUgaW5wdXQgYnVmZmVyIHdoZXJlIHRoaXMgdG9rZW4gc3RvcHM8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBzdG9wOworCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbiggaW50IHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbW1vblRva2VuKCBJQ2hhclN0cmVhbSBpbnB1dCwgaW50IHR5cGUsIGludCBjaGFubmVsLCBpbnQgc3RhcnQsIGludCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgICAgICB0aGlzLnN0b3AgPSBzdG9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbW1vblRva2VuKCBpbnQgdHlwZSwgc3RyaW5nIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gVG9rZW5DaGFubmVscy5EZWZhdWx0OworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlbiggSVRva2VuIG9sZFRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgdGV4dCA9IG9sZFRva2VuLlRleHQ7CisgICAgICAgICAgICB0eXBlID0gb2xkVG9rZW4uVHlwZTsKKyAgICAgICAgICAgIGxpbmUgPSBvbGRUb2tlbi5MaW5lOworICAgICAgICAgICAgaW5kZXggPSBvbGRUb2tlbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gb2xkVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgY2hhbm5lbCA9IG9sZFRva2VuLkNoYW5uZWw7CisgICAgICAgICAgICBpbnB1dCA9IG9sZFRva2VuLklucHV0U3RyZWFtOworICAgICAgICAgICAgaWYgKCBvbGRUb2tlbiBpcyBDb21tb25Ub2tlbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSAoIChDb21tb25Ub2tlbilvbGRUb2tlbiApLnN0YXJ0OworICAgICAgICAgICAgICAgIHN0b3AgPSAoIChDb21tb25Ub2tlbilvbGRUb2tlbiApLnN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIElUb2tlbiBNZW1iZXJzCisgICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRleHQgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgICAgIGlmICggaW5wdXQgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IHN0b3AgJiYgc3RvcCA8IGlucHV0LkNvdW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU3Vic3RyaW5nKCBzdGFydCwgc3RvcCAtIHN0YXJ0ICsgMSApOworCisgICAgICAgICAgICAgICAgcmV0dXJuICI8RU9GPiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKiBPdmVycmlkZSB0aGUgdGV4dCBmb3IgdGhpcyB0b2tlbi4gIGdldFRleHQoKSB3aWxsIHJldHVybiB0aGlzIHRleHQKKyAgICAgICAgICAgICAgICAgKiAgcmF0aGVyIHRoYW4gcHVsbGluZyBmcm9tIHRoZSBidWZmZXIuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuCisgICAgICAgICAgICAgICAgICogIHRoYXQgc3RhcnQvc3RvcCBpbmRleGVzIGFyZSBub3QgdmFsaWQuICBJdCBtZWFucyB0aGF0IHRoYXQgaW5wdXQKKyAgICAgICAgICAgICAgICAgKiAgd2FzIGNvbnZlcnRlZCB0byBhIG5ldyBzdHJpbmcgaW4gdGhlIHRva2VuIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0ZXh0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IExpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENoYXJQb3NpdGlvbkluTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IENoYW5uZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFN0YXJ0SW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU3RvcEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUb2tlbkluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSUNoYXJTdHJlYW0gSW5wdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKKyAgICAgICAgICAgIGlmICggY2hhbm5lbCA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWxTdHIgPSAiLGNoYW5uZWw9IiArIGNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgdHh0ID0gVGV4dDsKKyAgICAgICAgICAgIGlmICggdHh0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR4dCA9IFJlZ2V4LlJlcGxhY2UoIHR4dCwgIlxuIiwgIlxcXFxuIiApOworICAgICAgICAgICAgICAgIHR4dCA9IFJlZ2V4LlJlcGxhY2UoIHR4dCwgIlxyIiwgIlxcXFxyIiApOworICAgICAgICAgICAgICAgIHR4dCA9IFJlZ2V4LlJlcGxhY2UoIHR4dCwgIlx0IiwgIlxcXFx0IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR4dCA9ICI8bm8gdGV4dD4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJbQCIgKyBUb2tlbkluZGV4ICsgIiwiICsgc3RhcnQgKyAiOiIgKyBzdG9wICsgIj0nIiArIHR4dCArICInLDwiICsgdHlwZSArICI+IiArIGNoYW5uZWxTdHIgKyAiLCIgKyBsaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lICsgIl0iOworICAgICAgICB9CisKKyAgICAgICAgW1N5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uT25TZXJpYWxpemluZ10KKyAgICAgICAgaW50ZXJuYWwgdm9pZCBPblNlcmlhbGl6aW5nKCBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQgY29udGV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdGV4dCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB0ZXh0ID0gVGV4dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWU0YTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uID0gU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb247CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFRoZSBtb3N0IGNvbW1vbiBzdHJlYW0gb2YgdG9rZW5zIGlzIG9uZSB3aGVyZSBldmVyeSB0b2tlbiBpcyBidWZmZXJlZCB1cAorICAgICAqICBhbmQgdG9rZW5zIGFyZSBwcmVmaWx0ZXJlZCBmb3IgYSBjZXJ0YWluIGNoYW5uZWwgKHRoZSBwYXJzZXIgd2lsbCBvbmx5CisgICAgICogIHNlZSB0aGVzZSB0b2tlbnMgYW5kIGNhbm5vdCBjaGFuZ2UgdGhlIGZpbHRlciBjaGFubmVsIG51bWJlciBkdXJpbmcgdGhlCisgICAgICogIHBhcnNlKS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPlRPRE86IGhvdyB0byBhY2Nlc3MgdGhlIGZ1bGwgdG9rZW4gc3RyZWFtPyAgSG93IHRvIHRyYWNrIGFsbCB0b2tlbnMgbWF0Y2hlZCBwZXIgcnVsZT88L3JlbWFya3M+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENvbW1vblRva2VuU3RyZWFtIDogQnVmZmVyZWRUb2tlblN0cmVhbQorICAgIHsKKyAgICAgICAgLyoqIFNraXAgdG9rZW5zIG9uIGFueSBjaGFubmVsIGJ1dCB0aGlzIG9uZTsgdGhpcyBpcyBob3cgd2Ugc2tpcCB3aGl0ZXNwYWNlLi4uICovCisgICAgICAgIHByaXZhdGUgaW50IF9jaGFubmVsOworCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpCisgICAgICAgICAgICA6IHRoaXModG9rZW5Tb3VyY2UsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbW1vblRva2VuU3RyZWFtKElUb2tlblNvdXJjZSB0b2tlblNvdXJjZSwgaW50IGNoYW5uZWwpCisgICAgICAgICAgICA6IGJhc2UodG9rZW5Tb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDaGFubmVsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXNldCB0aGlzIHRva2VuIHN0cmVhbSBieSBzZXR0aW5nIGl0cyB0b2tlbiBzb3VyY2UuICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJVG9rZW5Tb3VyY2UgVG9rZW5Tb3VyY2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuVG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlLlRva2VuU291cmNlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgX2NoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogQWx3YXlzIGxlYXZlIHAgb24gYW4gb24tY2hhbm5lbCB0b2tlbi4gKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgX3ArKzsKKyAgICAgICAgICAgIF9wID0gU2tpcE9mZlRva2VuQ2hhbm5lbHMoX3ApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIElUb2tlbiBMQihpbnQgaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGsgPT0gMCB8fCAoX3AgLSBrKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGludCBpID0gX3A7CisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKKyAgICAgICAgICAgIHdoaWxlIChuIDw9IGspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICAgICAgICBpID0gU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGkgLSAxKTsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gX3Rva2Vuc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJVG9rZW4gTFQoaW50IGspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcCA9PSAtMSkKKyAgICAgICAgICAgICAgICBTZXR1cCgpOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoLWspOworICAgICAgICAgICAgaW50IGkgPSBfcDsKKyAgICAgICAgICAgIGludCBuID0gMTsgLy8gd2Uga25vdyB0b2tlbnNbcF0gaXMgYSBnb29kIG9uZQorICAgICAgICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zCisgICAgICAgICAgICB3aGlsZSAobiA8IGspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICAgICAgICBpID0gU2tpcE9mZlRva2VuQ2hhbm5lbHMoaSArIDEpOworICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPiBSYW5nZSkKKyAgICAgICAgICAgICAgICBSYW5nZSA9IGk7CisKKyAgICAgICAgICAgIHJldHVybiBfdG9rZW5zW2ldOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEdpdmVuIGEgc3RhcnRpbmcgaW5kZXgsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uLWNoYW5uZWwKKyAgICAgICAgICogIHRva2VuLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgaW50IFNraXBPZmZUb2tlbkNoYW5uZWxzKGludCBpKQorICAgICAgICB7CisgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgd2hpbGUgKF90b2tlbnNbaV0uQ2hhbm5lbCAhPSBfY2hhbm5lbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhbHNvIHN0b3BzIGF0IEVPRiAoaXQncyBvbiBjaGFubmVsKQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBTeW5jKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGludCBpKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoaSA+PSAwICYmICgoSVRva2VuKV90b2tlbnNbaV0pLkNoYW5uZWwgIT0gX2NoYW5uZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIFNldHVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3AgPSAwOworICAgICAgICAgICAgX3AgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyhfcCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvREZBLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0RGQS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2UyZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0RGQS5jcwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIENvbmRpdGlvbmFsQXR0cmlidXRlID0gU3lzdGVtLkRpYWdub3N0aWNzLkNvbmRpdGlvbmFsQXR0cmlidXRlOworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKyAgICB1c2luZyBJRGVidWdFdmVudExpc3RlbmVyID0gQW50bHIuUnVudGltZS5EZWJ1Zy5JRGVidWdFdmVudExpc3RlbmVyOworCisgICAgcHVibGljIGRlbGVnYXRlIGludCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlciggREZBIGRmYSwgaW50IHMsIElJbnRTdHJlYW0gaW5wdXQgKTsKKworICAgIC8qKiA8c3VtbWFyeT5BIERGQSBpbXBsZW1lbnRlZCBhcyBhIHNldCBvZiB0cmFuc2l0aW9uIHRhYmxlcy48L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIEFueSBzdGF0ZSB0aGF0IGhhcyBhIHNlbWFudGljIHByZWRpY2F0ZSBlZGdlIGlzIHNwZWNpYWw7IHRob3NlIHN0YXRlcworICAgICAqICBhcmUgZ2VuZXJhdGVkIHdpdGggaWYtdGhlbi1lbHNlIHN0cnVjdHVyZXMgaW4gYSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKCkKKyAgICAgKiAgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGN5Y2xpY0RGQSB0ZW1wbGF0ZS4KKyAgICAgKgorICAgICAqICBUaGVyZSBhcmUgYXQgbW9zdCAzMjc2NyBzdGF0ZXMgKDE2LWJpdCBzaWduZWQgc2hvcnQpLgorICAgICAqICBDb3VsZCBnZXQgYXdheSB3aXRoIGJ5dGUgc29tZXRpbWVzIGJ1dCB3b3VsZCBoYXZlIHRvIGdlbmVyYXRlIGRpZmZlcmVudAorICAgICAqICB0eXBlcyBhbmQgdGhlIHNpbXVsYXRpb24gY29kZSB0b28uICBGb3IgYSBwb2ludCBvZiByZWZlcmVuY2UsIHRoZSBKYXZhCisgICAgICogIGxleGVyJ3MgVG9rZW5zIHJ1bGUgREZBIGhhcyAzMjYgc3RhdGVzIHJvdWdobHkuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgREZBCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgc2hvcnRbXSBlb3Q7CisgICAgICAgIHByb3RlY3RlZCBzaG9ydFtdIGVvZjsKKyAgICAgICAgcHJvdGVjdGVkIGNoYXJbXSBtaW47CisgICAgICAgIHByb3RlY3RlZCBjaGFyW10gbWF4OworICAgICAgICBwcm90ZWN0ZWQgc2hvcnRbXSBhY2NlcHQ7CisgICAgICAgIHByb3RlY3RlZCBzaG9ydFtdIHNwZWNpYWw7CisgICAgICAgIHByb3RlY3RlZCBzaG9ydFtdW10gdHJhbnNpdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IGRlY2lzaW9uTnVtYmVyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGljaCByZWNvZ25pemVyIGVuY2xvc2VzIHRoaXMgREZBPyAgTmVlZGVkIHRvIGNoZWNrIGJhY2t0cmFja2luZzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXI7CisKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IGJvb2wgZGVidWcgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgREZBKCkKKyAgICAgICAgICAgIDogdGhpcyggbmV3IFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyKCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uRGVmYXVsdCApICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERGQSggU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuU3BlY2lhbFN0YXRlVHJhbnNpdGlvbiA9IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24gPz8gbmV3IFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyKCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uRGVmYXVsdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIERlc2NyaXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAibi9hIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEZyb20gdGhlIGlucHV0IHN0cmVhbSwgcHJlZGljdCB3aGF0IGFsdGVybmF0aXZlIHdpbGwgc3VjY2VlZAorICAgICAgICAgKiAgdXNpbmcgdGhpcyBERkEgKHJlcHJlc2VudGluZyB0aGUgY292ZXJpbmcgcmVndWxhciBhcHByb3hpbWF0aW9uCisgICAgICAgICAqICB0byB0aGUgdW5kZXJseWluZyBDRkwpLiAgUmV0dXJuIGFuIGFsdGVybmF0aXZlIG51bWJlciAxLi5uLiAgVGhyb3cKKyAgICAgICAgICogIGFuIGV4Y2VwdGlvbiB1cG9uIGVycm9yLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFByZWRpY3QoIElJbnRTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGRlYnVnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSggIkVudGVyIERGQS5wcmVkaWN0IGZvciBkZWNpc2lvbiAiICsgZGVjaXNpb25OdW1iZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtYXJrID0gaW5wdXQuTWFyaygpOyAvLyByZW1lbWJlciB3aGVyZSBkZWNpc2lvbiBzdGFydGVkIGluIGlucHV0CisgICAgICAgICAgICBpbnQgcyA9IDA7IC8vIHdlIGFsd2F5cyBzdGFydCBhdCBzMAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggZGVidWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJERkEgIiArIGRlY2lzaW9uTnVtYmVyICsgIiBzdGF0ZSAiICsgcyArICIgTEEoMSk9IiArIChjaGFyKWlucHV0LkxBKCAxICkgKyAiKCIgKyBpbnB1dC5MQSggMSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSwgaW5kZXg9IiArIGlucHV0LkluZGV4ICk7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGVjaWFsU3RhdGUgPSBzcGVjaWFsW3NdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHNwZWNpYWxTdGF0ZSA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1ZyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJERkEgIiArIGRlY2lzaW9uTnVtYmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSAiICsgcyArICIgaXMgc3BlY2lhbCBzdGF0ZSAiICsgc3BlY2lhbFN0YXRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gU3BlY2lhbFN0YXRlVHJhbnNpdGlvbiggdGhpcywgc3BlY2lhbFN0YXRlLCBpbnB1dCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1ZyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJERkEgIiArIGRlY2lzaW9uTnVtYmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGZyb20gc3BlY2lhbCBzdGF0ZSAiICsgc3BlY2lhbFN0YXRlICsgIiB0byAiICsgcyApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzID09IC0xICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdCggcywgaW5wdXQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggYWNjZXB0W3NdID49IDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlYnVnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSggImFjY2VwdDsgcHJlZGljdCAiICsgYWNjZXB0W3NdICsgIiBmcm9tIHN0YXRlICIgKyBzICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXB0W3NdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgbm9ybWFsIGNoYXIgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcilpbnB1dC5MQSggMSApOyAvLyAtMSA9PSBcdUZGRkYsIGFsbCB0b2tlbnMgZml0IGluIDY1MDAwIHNwYWNlCisgICAgICAgICAgICAgICAgICAgIGlmICggYyA+PSBtaW5bc10gJiYgYyA8PSBtYXhbc10gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc25leHQgPSB0cmFuc2l0aW9uW3NdW2MgLSBtaW5bc11dOyAvLyBtb3ZlIHRvIG5leHQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc25leHQgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgaW4gcmFuZ2UgYnV0IG5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBjaGVjayBFT1QsIHdoaWNoIGlzIGxpa2UgdGhlIGVsc2UgY2xhdXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVvdFtzXT49MCBpbmRpY2F0ZXMgdGhhdCBhbiBFT1QgZWRnZSBnb2VzIHRvIGFub3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGVvdFtzXSA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAvLyBFT1QgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGVidWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJFT1QgdHJhbnNpdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGVvdFtzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBJIGhhZCB0aGlzIGFzIHJldHVybiBhY2NlcHRbZW90W3NdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBhc3N1bWVkIGhlcmUgdGhhdCB0aGUgRU9UIGVkZ2UgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlbnQgdG8gYW4gYWNjZXB0Li4uZmFzdGVyIHRvIGRvIHRoaXMsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGFib3V0IHByZWRpY2F0ZWQgZWRnZXMgY29taW5nIGZyb20gRU9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0KCBzLCBpbnB1dCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHNuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBlb3Rbc10gPj0gMCApCisgICAgICAgICAgICAgICAgICAgIHsgIC8vIEVPVCBUcmFuc2l0aW9uPworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1ZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJFT1QgdHJhbnNpdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBlb3Rbc107CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIGMgPT0gdW5jaGVja2VkKCAoY2hhcilUb2tlblR5cGVzLkVuZE9mRmlsZSApICYmIGVvZltzXSA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeyAgLy8gRU9GIFRyYW5zaXRpb24gdG8gYWNjZXB0IHN0YXRlPworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1ZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJhY2NlcHQgdmlhIEVPRjsgcHJlZGljdCAiICsgYWNjZXB0W2VvZltzXV0gKyAiIGZyb20gIiArIGVvZltzXSApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2VwdFtlb2Zbc11dOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbiByYW5nZSBhbmQgbm90IEVPRi9FT1QsIG11c3QgYmUgaW52YWxpZCBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1ZyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCAibWluWyIgKyBzICsgIl09IiArIG1pbltzXSApOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoICJtYXhbIiArIHMgKyAiXT0iICsgbWF4W3NdICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSggImVvdFsiICsgcyArICJdPSIgKyBlb3Rbc10gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCAiZW9mWyIgKyBzICsgIl09IiArIGVvZltzXSApOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IHAgPSAwOyBwIDwgdHJhbnNpdGlvbltzXS5MZW5ndGg7IHArKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSggdHJhbnNpdGlvbltzXVtwXSArICIgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdCggcywgaW5wdXQgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0LlJld2luZCggbWFyayApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBOb1ZpYWJsZUFsdCggaW50IHMsIElJbnRTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHJlY29nbml6ZXIuc3RhdGUuYmFja3RyYWNraW5nID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVjb2duaXplci5zdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiggRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lzaW9uTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCApOworICAgICAgICAgICAgRXJyb3IoIG52YWUgKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+QSBob29rIGZvciBkZWJ1Z2dpbmcgaW50ZXJmYWNlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVycm9yKCBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyIFNwZWNpYWxTdGF0ZVRyYW5zaXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy9wdWJsaWMgdmlydHVhbCBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbiggaW50IHMsIEludFN0cmVhbSBpbnB1dCApCisgICAgICAgIC8veworICAgICAgICAvLyAgICByZXR1cm4gLTE7CisgICAgICAgIC8vfQorCisgICAgICAgIHN0YXRpYyBpbnQgU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkRlZmF1bHQoIERGQSBkZmEsIGludCBzLCBJSW50U3RyZWFtIGlucHV0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gYSBTdHJpbmcgdGhhdCBoYXMgYSBydW4tbGVuZ3RoLWVuY29kaW5nIG9mIHNvbWUgdW5zaWduZWQgc2hvcnRzCisgICAgICAgICAqICBsaWtlICJcMVwyXDNcOSIsIGNvbnZlcnQgdG8gc2hvcnRbXSB7Miw5LDksOX0uICBXZSBkbyB0aGlzIHRvIGF2b2lkCisgICAgICAgICAqICBzdGF0aWMgc2hvcnRbXSB3aGljaCBnZW5lcmF0ZXMgc28gbXVjaCBpbml0IGNvZGUgdGhhdCB0aGUgY2xhc3Mgd29uJ3QKKyAgICAgICAgICogIGNvbXBpbGUuIDooCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHNob3J0W10gVW5wYWNrRW5jb2RlZFN0cmluZyggc3RyaW5nIGVuY29kZWRTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3YWxrIGZpcnN0IHRvIGZpbmQgaG93IGJpZyBpdCBpcy4KKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGVuY29kZWRTdHJpbmcuTGVuZ3RoOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgKz0gZW5jb2RlZFN0cmluZ1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNob3J0W10gZGF0YSA9IG5ldyBzaG9ydFtzaXplXTsKKyAgICAgICAgICAgIGludCBkaSA9IDA7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBlbmNvZGVkU3RyaW5nLkxlbmd0aDsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIG4gPSBlbmNvZGVkU3RyaW5nW2ldOworICAgICAgICAgICAgICAgIGNoYXIgdiA9IGVuY29kZWRTdHJpbmdbaSArIDFdOworICAgICAgICAgICAgICAgIC8vIGFkZCB2IG4gdGltZXMgdG8gZGF0YQorICAgICAgICAgICAgICAgIGZvciAoIGludCBqID0gMTsgaiA8PSBuOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtkaSsrXSA9IChzaG9ydCl2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkhpZGVvdXMgZHVwbGljYXRpb24gb2YgY29kZSwgYnV0IEkgbmVlZCBkaWZmZXJlbnQgdHlwZWQgYXJyYXlzIG91dCA6KDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjaGFyW10gVW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyggc3RyaW5nIGVuY29kZWRTdHJpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3YWxrIGZpcnN0IHRvIGZpbmQgaG93IGJpZyBpdCBpcy4KKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGVuY29kZWRTdHJpbmcuTGVuZ3RoOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgKz0gZW5jb2RlZFN0cmluZ1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBkYXRhID0gbmV3IGNoYXJbc2l6ZV07CisgICAgICAgICAgICBpbnQgZGkgPSAwOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgZW5jb2RlZFN0cmluZy5MZW5ndGg7IGkgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBuID0gZW5jb2RlZFN0cmluZ1tpXTsKKyAgICAgICAgICAgICAgICBjaGFyIHYgPSBlbmNvZGVkU3RyaW5nW2kgKyAxXTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdiBuIHRpbWVzIHRvIGRhdGEKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDE7IGogPD0gbjsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbZGkrK10gPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9ERUJVRyIpXQorICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERlYnVnUmVjb2duaXRpb25FeGNlcHRpb24oUmVjb2duaXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnID0gcmVjb2duaXplci5EZWJ1Z0xpc3RlbmVyOworICAgICAgICAgICAgaWYgKGRiZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRiZy5SZWNvZ25pdGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvRGVidWcvSURlYnVnRXZlbnRMaXN0ZW5lci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9EZWJ1Zy9JRGVidWdFdmVudExpc3RlbmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWQyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvRGVidWcvSURlYnVnRXZlbnRMaXN0ZW5lci5jcwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5EZWJ1ZworeworCisgICAgLyoqIDxzdW1tYXJ5PkFsbCBkZWJ1Z2dpbmcgZXZlbnRzIHRoYXQgYSByZWNvZ25pemVyIGNhbiB0cmlnZ2VyLjwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgSSBkaWQgbm90IGNyZWF0ZSBhIHNlcGFyYXRlIEFTVCBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGFzIGl0IHdvdWxkIGNyZWF0ZQorICAgICAqICBsb3RzIG9mIGV4dHJhIGNsYXNzZXMgYW5kIERlYnVnUGFyc2VyIGhhcyBhIGRiZyB2YXIgZGVmaW5lZCwgd2hpY2ggbWFrZXMKKyAgICAgKiAgaXQgaGFyZCB0byBjaGFuZ2UgdG8gQVNURGVidWdFdmVudExpc3RlbmVyLiAgSSBsb29rZWQgaGFyZCBhdCB0aGlzIGlzc3VlCisgICAgICogIGFuZCBpdCBpcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhcyBvbmUgbW9ub2xpdGhpYyBldmVudCBpbnRlcmZhY2UgZm9yIGFsbAorICAgICAqICBwb3NzaWJsZSBldmVudHMuICBIb3BlZnVsbHksIGFkZGluZyBTVCBkZWJ1Z2dpbmcgc3R1ZmYgd29uJ3QgYmUgYmFkLiAgTGVhdmUKKyAgICAgKiAgZm9yIGZ1dHVyZS4gNC8yNi8yMDA2LgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBJRGVidWdFdmVudExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIEluaXRpYWxpemUoKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgcGFyc2VyIGhhcyBqdXN0IGVudGVyZWQgYSBydWxlLiAgTm8gZGVjaXNpb24gaGFzIGJlZW4gbWFkZSBhYm91dAorICAgICAgICAgKiAgd2hpY2ggYWx0IGlzIHByZWRpY3RlZC4gIFRoaXMgaXMgZmlyZWQgQUZURVIgaW5pdCBhY3Rpb25zIGhhdmUgYmVlbgorICAgICAgICAgKiAgZXhlY3V0ZWQuICBBdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGFuZCBhdmFpbGFibGUgZXRjLi4uCisgICAgICAgICAqICBUaGUgZ3JhbW1hckZpbGVOYW1lIGFsbG93cyBjb21wb3NpdGUgZ3JhbW1hcnMgdG8ganVtcCBhcm91bmQgYW1vbmcKKyAgICAgICAgICogIG11bHRpcGxlIGdyYW1tYXIgZmlsZXMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEVudGVyUnVsZSggc3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgc3RyaW5nIHJ1bGVOYW1lICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQmVjYXVzZSBydWxlcyBjYW4gaGF2ZSBsb3RzIG9mIGFsdGVybmF0aXZlcywgaXQgaXMgdmVyeSB1c2VmdWwgdG8KKyAgICAgICAgICogIGtub3cgd2hpY2ggYWx0IHlvdSBhcmUgZW50ZXJpbmcuICBUaGlzIGlzIDEuLm4gZm9yIG4gYWx0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRW50ZXJBbHQoIGludCBhbHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGlzIGlzIHRoZSBsYXN0IHRoaW5nIGV4ZWN1dGVkIGJlZm9yZSBsZWF2aW5nIGEgcnVsZS4gIEl0IGlzCisgICAgICAgICAqICBleGVjdXRlZCBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBUaGlzIGlzIHRyaWdnZXJlZCBhZnRlcgorICAgICAgICAgKiAgZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeSBoYXZlIG9jY3VycmVkICh1bmxlc3MgdGhlIGV4Y2VwdGlvbiBpcworICAgICAgICAgKiAgbm90IGNhdWdodCBpbiB0aGlzIHJ1bGUpLiAgVGhpcyBpbXBsaWVzIGFuICJleGl0QWx0IiBldmVudC4KKyAgICAgICAgICogIFRoZSBncmFtbWFyRmlsZU5hbWUgYWxsb3dzIGNvbXBvc2l0ZSBncmFtbWFycyB0byBqdW1wIGFyb3VuZCBhbW9uZworICAgICAgICAgKiAgbXVsdGlwbGUgZ3JhbW1hciBmaWxlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRXhpdFJ1bGUoIHN0cmluZyBncmFtbWFyRmlsZU5hbWUsIHN0cmluZyBydWxlTmFtZSApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayBlbnRyeSBpbnRvIGFueSAoLi4uKSBzdWJydWxlIG90aGVyIEVCTkYgY29uc3RydWN0PC9zdW1tYXJ5PiAqLworICAgICAgICB2b2lkIEVudGVyU3ViUnVsZSggaW50IGRlY2lzaW9uTnVtYmVyICk7CisKKyAgICAgICAgdm9pZCBFeGl0U3ViUnVsZSggaW50IGRlY2lzaW9uTnVtYmVyICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRXZlcnkgZGVjaXNpb24sIGZpeGVkIGsgb3IgYXJiaXRyYXJ5LCBoYXMgYW4gZW50ZXIvZXhpdCBldmVudAorICAgICAgICAgKiAgc28gdGhhdCBhIEdVSSBjYW4gZWFzaWx5IHRyYWNrIHdoYXQgTFQvY29uc3VtZSBldmVudHMgYXJlCisgICAgICAgICAqICBhc3NvY2lhdGVkIHdpdGggcHJlZGljdGlvbi4gIFlvdSB3aWxsIHNlZSBhIHNpbmdsZSBlbnRlci9leGl0CisgICAgICAgICAqICBzdWJydWxlIGJ1dCBtdWx0aXBsZSBlbnRlci9leGl0IGRlY2lzaW9uIGV2ZW50cywgb25lIGZvciBlYWNoCisgICAgICAgICAqICBsb29wIGl0ZXJhdGlvbi4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRW50ZXJEZWNpc2lvbihpbnQgZGVjaXNpb25OdW1iZXIsIGJvb2wgY291bGRCYWNrdHJhY2spOworCisgICAgICAgIHZvaWQgRXhpdERlY2lzaW9uKCBpbnQgZGVjaXNpb25OdW1iZXIgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBbiBpbnB1dCB0b2tlbiB3YXMgY29uc3VtZWQ7IG1hdGNoZWQgYnkgYW55IGtpbmQgb2YgZWxlbWVudC4KKyAgICAgICAgICogIFRyaWdnZXIgYWZ0ZXIgdGhlIHRva2VuIHdhcyBtYXRjaGVkIGJ5IHRoaW5ncyBsaWtlIG1hdGNoKCksIG1hdGNoQW55KCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIENvbnN1bWVUb2tlbiggSVRva2VuIHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBbiBvZmYtY2hhbm5lbCBpbnB1dCB0b2tlbiB3YXMgY29uc3VtZWQuCisgICAgICAgICAqICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorICAgICAgICAgKiAgKHVubGVzcyBvZiBjb3Vyc2UgdGhlIGhpZGRlbiB0b2tlbiBpcyBmaXJzdCBzdHVmZiBpbiB0aGUgaW5wdXQgc3RyZWFtKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQ29uc3VtZUhpZGRlblRva2VuKCBJVG9rZW4gdCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFNvbWVib2R5IChhbnlib2R5KSBsb29rZWQgYWhlYWQuICBOb3RlIHRoYXQgdGhpcyBhY3R1YWxseSBnZXRzCisgICAgICAgICAqICB0cmlnZ2VyZWQgYnkgYm90aCBMQSBhbmQgTFQgY2FsbHMuICBUaGUgZGVidWdnZXIgd2lsbCB3YW50IHRvIGtub3cKKyAgICAgICAgICogIHdoaWNoIFRva2VuIG9iamVjdCB3YXMgZXhhbWluZWQuICBMaWtlIGNvbnN1bWVUb2tlbiwgdGhpcyBpbmRpY2F0ZXMKKyAgICAgICAgICogIHdoYXQgdG9rZW4gd2FzIHNlZW4gYXQgdGhhdCBkZXB0aC4gIEEgcmVtb3RlIGRlYnVnZ2VyIGNhbm5vdCBsb29rCisgICAgICAgICAqICBhaGVhZCBpbnRvIGEgZmlsZSBpdCBkb2Vzbid0IGhhdmUgc28gTFQgZXZlbnRzIG11c3QgcGFzcyB0aGUgdG9rZW4KKyAgICAgICAgICogIGV2ZW4gaWYgdGhlIGluZm8gaXMgcmVkdW5kYW50LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBMVCggaW50IGksIElUb2tlbiB0ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGhlIHBhcnNlciBpcyBnb2luZyB0byBsb29rIGFyYml0cmFyaWx5IGFoZWFkOyBtYXJrIHRoaXMgbG9jYXRpb24sCisgICAgICAgICAqICB0aGUgdG9rZW4gc3RyZWFtJ3MgbWFya2VyIGlzIHNlbnQgaW4gY2FzZSB5b3UgbmVlZCBpdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgTWFyayggaW50IG1hcmtlciApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFmdGVyIGFuIGFyYml0cmFpcmx5IGxvbmcgbG9va2FoZWFkIGFzIHdpdGggYSBjeWNsaWMgREZBIChvciB3aXRoCisgICAgICAgICAqICBhbnkgYmFja3RyYWNrKSwgdGhpcyBpbmZvcm1zIHRoZSBkZWJ1Z2dlciB0aGF0IHN0cmVhbSBzaG91bGQgYmUKKyAgICAgICAgICogIHJld291bmQgdG8gdGhlIHBvc2l0aW9uIGFzc29jaWF0ZWQgd2l0aCBtYXJrZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFJld2luZCggaW50IG1hcmtlciApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJld2luZCB0byB0aGUgaW5wdXQgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWFya2VyLgorICAgICAgICAgKiAgVXNlZCBjdXJyZW50bHkgb25seSBhZnRlciBhIGN5Y2xpYyBERkEgYW5kIGp1c3QKKyAgICAgICAgICogIGJlZm9yZSBzdGFydGluZyBhIHNlbS9zeW4gcHJlZGljYXRlIHRvIGdldCB0aGUKKyAgICAgICAgICogIGlucHV0IHBvc2l0aW9uIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkZWNpc2lvbi4KKyAgICAgICAgICogIERvIG5vdCAicG9wIiB0aGUgbWFya2VyIG9mZiB0aGUgc3RhdGUuICBtYXJrKGkpCisgICAgICAgICAqICBhbmQgcmV3aW5kKGkpIHNob3VsZCBiYWxhbmNlIHN0aWxsLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBSZXdpbmQoKTsKKworICAgICAgICB2b2lkIEJlZ2luQmFja3RyYWNrKCBpbnQgbGV2ZWwgKTsKKworICAgICAgICB2b2lkIEVuZEJhY2t0cmFjayggaW50IGxldmVsLCBib29sIHN1Y2Nlc3NmdWwgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUbyB3YXRjaCBhIHBhcnNlciBtb3ZlIHRocm91Z2ggdGhlIGdyYW1tYXIsIHRoZSBwYXJzZXIgbmVlZHMgdG8KKyAgICAgICAgICogIGluZm9ybSB0aGUgZGVidWdnZXIgd2hhdCBsaW5lL2NoYXJQb3MgaXQgaXMgcGFzc2luZyBpbiB0aGUgZ3JhbW1hci4KKyAgICAgICAgICogIEZvciBub3csIHRoaXMgZG9lcyBub3Qga25vdyBob3cgdG8gc3dpdGNoIGZyb20gb25lIGdyYW1tYXIgdG8gdGhlCisgICAgICAgICAqICBvdGhlciBhbmQgYmFjayBmb3IgaXNsYW5kIGdyYW1tYXJzIGV0Yy4uLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBhbHNvIGFsbG93IGJyZWFrcG9pbnRzIGJlY2F1c2UgdGhlIGRlYnVnZ2VyIGNhbiBzdG9wCisgICAgICAgICAqICB0aGUgcGFyc2VyIHdoZW5ldmVyIGl0IGhpdHMgdGhpcyBsaW5lL3Bvcy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgTG9jYXRpb24oIGludCBsaW5lLCBpbnQgcG9zICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQSByZWNvZ25pdGlvbiBleGNlcHRpb24gb2NjdXJyZWQgc3VjaCBhcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbi4gIEkgbWFkZQorICAgICAgICAgKiAgdGhpcyBhIGdlbmVyaWMgZXZlbnQgc28gdGhhdCBJIGNhbiBhbHRlciB0aGUgZXhjZXB0aW9uIGhpZXJhY2h5IGxhdGVyCisgICAgICAgICAqICB3aXRob3V0IGhhdmluZyB0byBhbHRlciBhbGwgdGhlIGRlYnVnIG9iamVjdHMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFVwb24gZXJyb3IsIHRoZSBzdGFjayBvZiBlbnRlciBydWxlL3N1YnJ1bGUgbXVzdCBiZSBwcm9wZXJseSB1bndvdW5kLgorICAgICAgICAgKiAgSWYgbm8gdmlhYmxlIGFsdCBvY2N1cnMgaXQgaXMgd2l0aGluIGFuIGVudGVyL2V4aXQgZGVjaXNpb24sIHdoaWNoCisgICAgICAgICAqICBhbHNvIG11c3QgYmUgcmV3b3VuZC4gIEV2ZW4gdGhlIHJld2luZCBmb3IgZWFjaCBtYXJrIG11c3QgYmUgdW53b3VudC4KKyAgICAgICAgICogIEluIHRoZSBKYXZhIHRhcmdldCB0aGlzIGlzIHByZXR0eSBlYXN5IHVzaW5nIHRyeS9maW5hbGx5LCBpZiBhIGJpdAorICAgICAgICAgKiAgdWdseSBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUaGUgcmV3aW5kIGlzIGdlbmVyYXRlZCBpbiBERkEucHJlZGljdCgpCisgICAgICAgICAqICBhY3R1YWxseSBzbyBubyBjb2RlIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBmb3IgdGhhdC4gIEZvciBsYW5ndWFnZXMKKyAgICAgICAgICogIHcvbyB0aGlzICJmaW5hbGx5IiBmZWF0dXJlIChDKys/KSwgdGhlIHRhcmdldCBpbXBsZW1lbnRvciB3aWxsIGhhdmUKKyAgICAgICAgICogIHRvIGJ1aWxkIGFuIGV2ZW50IHN0YWNrIG9yIHNvbWV0aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogIEFjcm9zcyBhIHNvY2tldCBmb3IgcmVtb3RlIGRlYnVnZ2luZywgb25seSB0aGUgUmVjb2duaXRpb25FeGNlcHRpb24KKyAgICAgICAgICogIGRhdGEgZmllbGRzIGFyZSB0cmFuc21pdHRlZC4gIFRoZSB0b2tlbiBvYmplY3Qgb3Igd2hhdGV2ZXIgdGhhdAorICAgICAgICAgKiAgY2F1c2VkIHRoZSBwcm9ibGVtIHdhcyB0aGUgbGFzdCBvYmplY3QgcmVmZXJlbmNlZCBieSBMVC4gIFRoZQorICAgICAgICAgKiAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIExUIGV2ZW50IHNob3VsZCBob2xkIHRoZSB1bmV4cGVjdGVkIFRva2VuIG9yCisgICAgICAgICAqICBjaGFyLgorICAgICAgICAgKgorICAgICAgICAgKiAgSGVyZSBpcyBhIHNhbXBsZSBldmVudCB0cmFjZSBmb3IgZ3JhbW1hcjoKKyAgICAgICAgICoKKyAgICAgICAgICogIGIgOiBDICh7O31BfEIpIC8vIHs7fSBpcyB0aGVyZSB0byBwcmV2ZW50IEF8QiBiZWNvbWluZyBhIHNldAorICAgICAgICAgKiAgICB8IEQKKyAgICAgICAgICogICAgOworICAgICAgICAgKgorICAgICAgICAgKiAgVGhlIHNlcXVlbmNlIGZvciB0aGlzIHJ1bGUgKHdpdGggbm8gdmlhYmxlIGFsdCBpbiB0aGUgc3VicnVsZSkgZm9yCisgICAgICAgICAqICBpbnB1dCAnYyBjJyAodGhlcmUgYXJlIDMgdG9rZW5zKSBpczoKKyAgICAgICAgICoKKyAgICAgICAgICoJCWNvbW1lbmNlCisgICAgICAgICAqCQlMVCgxKQorICAgICAgICAgKgkJZW50ZXJSdWxlIGIKKyAgICAgICAgICoJCWxvY2F0aW9uIDcgMQorICAgICAgICAgKgkJZW50ZXIgZGVjaXNpb24gMworICAgICAgICAgKgkJTFQoMSkKKyAgICAgICAgICoJCWV4aXQgZGVjaXNpb24gMworICAgICAgICAgKgkJZW50ZXJBbHQxCisgICAgICAgICAqCQlsb2NhdGlvbiA3IDUKKyAgICAgICAgICoJCUxUKDEpCisgICAgICAgICAqCQljb25zdW1lVG9rZW4gW2MvPDQ+LDE6MF0KKyAgICAgICAgICoJCWxvY2F0aW9uIDcgNworICAgICAgICAgKgkJZW50ZXJTdWJSdWxlIDIKKyAgICAgICAgICoJCWVudGVyIGRlY2lzaW9uIDIKKyAgICAgICAgICoJCUxUKDEpCisgICAgICAgICAqCQlMVCgxKQorICAgICAgICAgKgkJcmVjb2duaXRpb25FeGNlcHRpb24gTm9WaWFibGVBbHRFeGNlcHRpb24gMiAxIDIKKyAgICAgICAgICoJCWV4aXQgZGVjaXNpb24gMgorICAgICAgICAgKgkJZXhpdFN1YlJ1bGUgMgorICAgICAgICAgKgkJYmVnaW5SZXN5bmMKKyAgICAgICAgICoJCUxUKDEpCisgICAgICAgICAqCQljb25zdW1lVG9rZW4gW2MvPDQ+LDE6MV0KKyAgICAgICAgICoJCUxUKDEpCisgICAgICAgICAqCQllbmRSZXN5bmMKKyAgICAgICAgICoJCUxUKC0xKQorICAgICAgICAgKgkJZXhpdFJ1bGUgYgorICAgICAgICAgKgkJdGVybWluYXRlCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFJlY29nbml0aW9uRXhjZXB0aW9uKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSW5kaWNhdGVzIHRoZSByZWNvZ25pemVyIGlzIGFib3V0IHRvIGNvbnN1bWUgdG9rZW5zIHRvIHJlc3luY2hyb25pemUKKyAgICAgICAgICogIHRoZSBwYXJzZXIuICBBbnkgY29uc3VtZSBldmVudHMgZnJvbSBoZXJlIHVudGlsIHRoZSByZWNvdmVyZWQgZXZlbnQKKyAgICAgICAgICogIGFyZSBub3QgcGFydCBvZiB0aGUgcGFyc2UtLXRoZXkgYXJlIGRlYWQgdG9rZW5zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBCZWdpblJlc3luYygpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEluZGljYXRlcyB0aGF0IHRoZSByZWNvZ25pemVyIGhhcyBmaW5pc2hlZCBjb25zdW1pbmcgdG9rZW5zIGluIG9yZGVyCisgICAgICAgICAqICB0byByZXN5Y2hyb25pemUuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXJzCisgICAgICAgICAqICBiZWZvcmUgdGhlIHJlY29nbml6ZXIgY29tZXMgb3V0IG9mIGVycm9yUmVjb3ZlcnkgbW9kZSAoaW4gd2hpY2gKKyAgICAgICAgICogIG11bHRpcGxlIGVycm9ycyBhcmUgc3VwcHJlc3NlZCkuICBUaGlzIHdpbGwgYmUgdXNlZnVsCisgICAgICAgICAqICBpbiBhIGd1aSB3aGVyZSB5b3Ugd2FudCB0byBwcm9iYWJseSBncmV5IG91dCB0b2tlbnMgdGhhdCBhcmUgY29uc3VtZWQKKyAgICAgICAgICogIGJ1dCBub3QgbWF0Y2hlZCB0byBhbnl0aGluZyBpbiBncmFtbWFyLiAgQW55dGhpbmcgYmV0d2VlbgorICAgICAgICAgKiAgYSBiZWdpblJlc3luYy9lbmRSZXN5bmMgcGFpciB3YXMgdG9zc2VkIG91dCBieSB0aGUgcGFyc2VyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBFbmRSZXN5bmMoKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+QSBzZW1hbnRpYyBwcmVkaWNhdGUgd2FzIGV2YWx1YXRlIHdpdGggdGhpcyByZXN1bHQgYW5kIGFjdGlvbiB0ZXh0PC9zdW1tYXJ5PiAqLworICAgICAgICB2b2lkIFNlbWFudGljUHJlZGljYXRlKCBib29sIHJlc3VsdCwgc3RyaW5nIHByZWRpY2F0ZSApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKyAgICAgICAgICogIHNlbmRpbmcgZXZlbnRzIG92ZXIgYSBzb2NrZXQuICBBIEdVSSBmb3IgZXhhbXBsZSB3aWxsIGxhdW5jaCBhIHRocmVhZAorICAgICAgICAgKiAgdG8gY29ubmVjdCBhbmQgY29tbXVuaWNhdGUgd2l0aCBhIHJlbW90ZSBwYXJzZXIuICBUaGUgdGhyZWFkIHdpbGwgd2FudAorICAgICAgICAgKiAgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKyAgICAgICAgICogIHRyaWdnZXIgdGhpcyB1cG9uIGVudHJ5IHRvIHRoZSBmaXJzdCBydWxlICh0aGUgcnVsZUxldmVsIGlzIHVzZWQgdG8KKyAgICAgICAgICogIGZpZ3VyZSB0aGlzIG91dCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIENvbW1lbmNlKCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUGFyc2luZyBpcyBvdmVyOyBzdWNjZXNzZnVsbHkgb3Igbm90LiAgTW9zdGx5IHVzZWZ1bCBmb3IgdGVsbGluZworICAgICAgICAgKiAgcmVtb3RlIGRlYnVnZ2luZyBsaXN0ZW5lcnMgdGhhdCBpdCdzIHRpbWUgdG8gcXVpdC4gIFdoZW4gdGhlIHJ1bGUKKyAgICAgICAgICogIGludm9jYXRpb24gbGV2ZWwgZ29lcyB0byB6ZXJvIGF0IHRoZSBlbmQgb2YgYSBydWxlLCB3ZSBhcmUgZG9uZQorICAgICAgICAgKiAgcGFyc2luZy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgVGVybWluYXRlKCk7CisKKworICAgICAgICAjcmVnaW9uIFRyZWUgUGFyc2luZworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIElucHV0IGZvciBhIHRyZWUgcGFyc2VyIGlzIGFuIEFTVCwgYnV0IHdlIGtub3cgbm90aGluZyBmb3Igc3VyZQorICAgICAgICAgKiAgYWJvdXQgYSBub2RlIGV4Y2VwdCBpdHMgdHlwZSBhbmQgdGV4dCAob2J0YWluZWQgZnJvbSB0aGUgYWRhcHRvcikuCisgICAgICAgICAqICBUaGlzIGlzIHRoZSBhbmFsb2cgb2YgdGhlIGNvbnN1bWVUb2tlbiBtZXRob2QuICBBZ2FpbiwgdGhlIElEIGlzCisgICAgICAgICAqICB0aGUgaGFzaENvZGUgdXN1YWxseSBvZiB0aGUgbm9kZSBzbyBpdCBvbmx5IHdvcmtzIGlmIGhhc2hDb2RlIGlzCisgICAgICAgICAqICBub3QgaW1wbGVtZW50ZWQuICBJZiB0aGUgdHlwZSBpcyBVUCBvciBET1dOLCB0aGVuCisgICAgICAgICAqICB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisgICAgICAgICAqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cGFyYW0gbmFtZT0idCIgLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQ29uc3VtZU5vZGUoIG9iamVjdCB0ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGhlIHRyZWUgcGFyc2VyIGxvb2tlZGFoZWFkLiAgSWYgdGhlIHR5cGUgaXMgVVAgb3IgRE9XTiwKKyAgICAgICAgICogIHRoZW4gdGhlIElEIGlzIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCBhcyBpdCdzIGZpeGVkLS10aGVyZSBpcworICAgICAgICAgKiAganVzdCBvbmUgVVAgbm9kZSBhbmQgb25lIERPV04gbmF2aWdhdGlvbiBub2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBMVCggaW50IGksIG9iamVjdCB0ICk7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisKKyAgICAgICAgI3JlZ2lvbiBBU1QgRXZlbnRzCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQSBuaWwgd2FzIGNyZWF0ZWQgKGV2ZW4gbmlsIG5vZGVzIGhhdmUgYSB1bmlxdWUgSUQuLi4KKyAgICAgICAgICogIHRoZXkgYXJlIG5vdCAibnVsbCIgcGVyIHNlKS4gIEFzIG9mIDQvMjgvMjAwNiwgdGhpcworICAgICAgICAgKiAgc2VlbXMgdG8gYmUgdW5pcXVlbHkgdHJpZ2dlcmVkIHdoZW4gc3RhcnRpbmcgYSBuZXcgc3VidHJlZQorICAgICAgICAgKiAgc3VjaCBhcyB3aGVuIGVudGVyaW5nIGEgc3VicnVsZSBpbiBhdXRvbWF0aWMgbW9kZSBhbmQgd2hlbgorICAgICAgICAgKiAgYnVpbGRpbmcgYSB0cmVlIGluIHJld3JpdGUgbW9kZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAgICAgICAgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSB0LklEIGlzIHNldC4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgTmlsTm9kZSggb2JqZWN0IHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBVcG9uIHN5bnRheCBlcnJvciwgcmVjb2duaXplcnMgYnJhY2tldCB0aGUgZXJyb3Igd2l0aCBhbiBlcnJvciBub2RlCisgICAgICAgICAqICBpZiB0aGV5IGFyZSBidWlsZGluZyBBU1RzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHBhcmFtIG5hbWU9InQiLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgRXJyb3JOb2RlKCBvYmplY3QgdCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Bbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gdG9rZW4gZWxlbWVudHMgc3VjaCBhcyB0eXBlIGV0Yy4uLjwvc3VtbWFyeT4KKyAgICAgICAgICogCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKyAgICAgICAgICogIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgdC5JRCwgdHlwZSwgdGV4dCBhcmUKKyAgICAgICAgICogIHNldC4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQ3JlYXRlTm9kZSggb2JqZWN0IHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+QW5ub3VuY2UgYSBuZXcgbm9kZSBidWlsdCBmcm9tIGFuIGV4aXN0aW5nIHRva2VuLjwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAgICAgICAgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSBub2RlLklEIGFuZCB0b2tlbi50b2tlbkluZGV4CisgICAgICAgICAqICBhcmUgc2V0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBDcmVhdGVOb2RlKCBvYmplY3Qgbm9kZSwgSVRva2VuIHRva2VuICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk1ha2UgYSBub2RlIHRoZSBuZXcgcm9vdCBvZiBhbiBleGlzdGluZyByb290LiAgU2VlPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBOb3RlOiB0aGUgbmV3Um9vdElEIHBhcmFtZXRlciBpcyBwb3NzaWJseSBkaWZmZXJlbnQKKyAgICAgICAgICogIHRoYW4gdGhlIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBuZXdSb290IHBhcmFtZXRlci4KKyAgICAgICAgICogIEluIG91ciBjYXNlLCBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKKyAgICAgICAgICogIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBhbmQgbm90IHJvb3RfbiBvciB3aGF0ZXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogIFRoZSBsaXN0ZW5lciBzaG91bGQgYXNzdW1lIHRoYXQgdGhpcyBldmVudCBvY2N1cnMKKyAgICAgICAgICogIG9ubHkgd2hlbiB0aGUgY3VycmVudCBzdWJydWxlIChvciBydWxlKSBzdWJ0cmVlIGlzCisgICAgICAgICAqICBiZWluZyByZXNldCB0byBuZXdSb290SUQuCisgICAgICAgICAqIAorICAgICAgICAgKiAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAgICAgICAgKiAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSBJRHMgYXJlIHNldC4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxzZWVhbHNvIGNyZWY9IkFudGxyLlJ1bnRpbWUuVHJlZS5UcmVlQWRhcHRvci5iZWNvbWVSb290KCkiLz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQmVjb21lUm9vdCggb2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk1ha2UgY2hpbGRJRCBhIGNoaWxkIG9mIHJvb3RJRC48L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKyAgICAgICAgICogIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgSURzIGFyZSBzZXQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqCisgICAgICAgICAqICA8c2VlYWxzbyBjcmVmPSJBbnRsci5SdW50aW1lLlRyZWUuVHJlZUFkYXB0b3IuYWRkQ2hpbGQoKSIvPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBBZGRDaGlsZCggb2JqZWN0IHJvb3QsIG9iamVjdCBjaGlsZCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgdGhlIHRva2VuIHN0YXJ0L3N0b3AgdG9rZW4gaW5kZXggZm9yIGEgc3VidHJlZSByb290IG9yIG5vZGUuPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgICAqICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHQuSUQgaXMgc2V0LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMoIG9iamVjdCB0LCBpbnQgdG9rZW5TdGFydEluZGV4LCBpbnQgdG9rZW5TdG9wSW5kZXggKTsKKworICAgICAgICAjZW5kcmVnaW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9FYXJseUV4aXRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNmU4MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9FYXJseUV4aXRFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgLyoqIDxzdW1tYXJ5PlRoZSByZWNvZ25pemVyIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgZm9yIGEgKC4uKSsgbG9vcC48L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEVhcmx5RXhpdEV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZGVjaXNpb25OdW1iZXI7CisKKyAgICAgICAgcHVibGljIEVhcmx5RXhpdEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFYXJseUV4aXRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVhcmx5RXhpdEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWFybHlFeGl0RXhjZXB0aW9uKGludCBkZWNpc2lvbk51bWJlciwgSUludFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogYmFzZShpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFYXJseUV4aXRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBkZWNpc2lvbk51bWJlciwgSUludFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFYXJseUV4aXRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBkZWNpc2lvbk51bWJlciwgSUludFN0cmVhbSBpbnB1dCwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0LCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBFYXJseUV4aXRFeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICB0aGlzLl9kZWNpc2lvbk51bWJlciA9IGluZm8uR2V0SW50MzIoIkRlY2lzaW9uTnVtYmVyIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IERlY2lzaW9uTnVtYmVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZGVjaXNpb25OdW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkRlY2lzaW9uTnVtYmVyIiwgRGVjaXNpb25OdW1iZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0ZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkM2Y1OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIHNlbWFudGljIHByZWRpY2F0ZSBmYWlsZWQgZHVyaW5nIHZhbGlkYXRpb24uICBWYWxpZGF0aW9uIG9mIHByZWRpY2F0ZXMKKyAgICAgKiAgb2NjdXJzIHdoZW4gbm9ybWFsbHkgcGFyc2luZyB0aGUgYWx0ZXJuYXRpdmUganVzdCBsaWtlIG1hdGNoaW5nIGEgdG9rZW4uCisgICAgICogIERpc2FtYmlndWF0aW5nIHByZWRpY2F0ZSBldmFsdWF0aW9uIG9jY3VycyB3aGVuIHdlIGhvaXN0IGEgcHJlZGljYXRlIGludG8KKyAgICAgKiAgYSBwcmVkaWN0aW9uIGRlY2lzaW9uLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfcnVsZU5hbWU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9wcmVkaWNhdGVUZXh0OworCisgICAgICAgIHB1YmxpYyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihJSW50U3RyZWFtIGlucHV0LCBzdHJpbmcgcnVsZU5hbWUsIHN0cmluZyBwcmVkaWNhdGVUZXh0KQorICAgICAgICAgICAgOiBiYXNlKGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9ydWxlTmFtZSA9IHJ1bGVOYW1lOworICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlVGV4dCA9IHByZWRpY2F0ZVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBJSW50U3RyZWFtIGlucHV0LCBzdHJpbmcgcnVsZU5hbWUsIHN0cmluZyBwcmVkaWNhdGVUZXh0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9ydWxlTmFtZSA9IHJ1bGVOYW1lOworICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlVGV4dCA9IHByZWRpY2F0ZVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBJSW50U3RyZWFtIGlucHV0LCBzdHJpbmcgcnVsZU5hbWUsIHN0cmluZyBwcmVkaWNhdGVUZXh0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9ydWxlTmFtZSA9IHJ1bGVOYW1lOworICAgICAgICAgICAgdGhpcy5fcHJlZGljYXRlVGV4dCA9IHByZWRpY2F0ZVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fcnVsZU5hbWUgPSBpbmZvLkdldFN0cmluZygiUnVsZU5hbWUiKTsKKyAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZVRleHQgPSBpbmZvLkdldFN0cmluZygiUHJlZGljYXRlVGV4dCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBSdWxlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3J1bGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBQcmVkaWNhdGVUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcHJlZGljYXRlVGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiUnVsZU5hbWUiLCBfcnVsZU5hbWUpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiUHJlZGljYXRlVGV4dCIsIF9wcmVkaWNhdGVUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbigiICsgUnVsZU5hbWUgKyAiLHsiICsgUHJlZGljYXRlVGV4dCArICJ9PykiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0dyYW1tYXJSdWxlQXR0cmlidXRlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0dyYW1tYXJSdWxlQXR0cmlidXRlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzA4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvR3JhbW1hclJ1bGVBdHRyaWJ1dGUuY3MKQEAgLTAsMCArMSw1NyBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbSBIYXJ3ZWxsCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBBdHRyaWJ1dGUgPSBTeXN0ZW0uQXR0cmlidXRlOworICAgIHVzaW5nIEF0dHJpYnV0ZVRhcmdldHMgPSBTeXN0ZW0uQXR0cmlidXRlVGFyZ2V0czsKKyAgICB1c2luZyBBdHRyaWJ1dGVVc2FnZUF0dHJpYnV0ZSA9IFN5c3RlbS5BdHRyaWJ1dGVVc2FnZUF0dHJpYnV0ZTsKKworICAgIFtBdHRyaWJ1dGVVc2FnZShBdHRyaWJ1dGVUYXJnZXRzLk1ldGhvZCwgQWxsb3dNdWx0aXBsZSA9IGZhbHNlLCBJbmhlcml0ZWQgPSB0cnVlKV0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEdyYW1tYXJSdWxlQXR0cmlidXRlIDogQXR0cmlidXRlCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfbmFtZTsKKworICAgICAgICBwdWJsaWMgR3JhbW1hclJ1bGVBdHRyaWJ1dGUoc3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JQXN0UnVsZVJldHVyblNjb3BlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lBc3RSdWxlUmV0dXJuU2NvcGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkODgyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JQXN0UnVsZVJldHVyblNjb3BlLmNzCkBAIC0wLDAgKzEsNDQgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIC8qKiA8c3VtbWFyeT5BU1QgcnVsZXMgaGF2ZSB0cmVlczwvc3VtbWFyeT4gKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElBc3RSdWxlUmV0dXJuU2NvcGUgOiBJUnVsZVJldHVyblNjb3BlCisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+SGFzIGEgdmFsdWUgcG90ZW50aWFsbHkgaWYgb3V0cHV0PUFTVDs8L3N1bW1hcnk+ICovCisgICAgICAgIG9iamVjdCBUcmVlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSUFzdFJ1bGVSZXR1cm5TY29wZVwxNDAxLmNzIiAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSUFzdFJ1bGVSZXR1cm5TY29wZVwxNDAxLmNzIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk4YWY4Ci0tLSAvZGV2L251bGwKKysrICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JQXN0UnVsZVJldHVyblNjb3BlXDE0MDEuY3MiCkBAIC0wLDAgKzEsNDQgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgLyoqIDxzdW1tYXJ5PkFTVCBydWxlcyBoYXZlIHRyZWVzPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUFzdFJ1bGVSZXR1cm5TY29wZTxUQXN0TGFiZWw+IDogSUFzdFJ1bGVSZXR1cm5TY29wZQorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkhhcyBhIHZhbHVlIHBvdGVudGlhbGx5IGlmIG91dHB1dD1BU1Q7PC9zdW1tYXJ5PiAqLworICAgICAgICBuZXcgVEFzdExhYmVsIFRyZWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lDaGFyU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lDaGFyU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTRmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSUNoYXJTdHJlYW0uY3MKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworCisgICAgLyoqIDxzdW1tYXJ5PkEgc291cmNlIG9mIGNoYXJhY3RlcnMgZm9yIGFuIEFOVExSIGxleGVyPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNoYXJTdHJlYW0gOiBJSW50U3RyZWFtCisgICAgeworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEZvciBpbmZpbml0ZSBzdHJlYW1zLCB5b3UgZG9uJ3QgbmVlZCB0aGlzOyBwcmltYXJpbHkgSSdtIHByb3ZpZGluZworICAgICAgICAgKiAgYSB1c2VmdWwgaW50ZXJmYWNlIGZvciBhY3Rpb24gY29kZS4gIEp1c3QgbWFrZSBzdXJlIGFjdGlvbnMgZG9uJ3QKKyAgICAgICAgICogIHVzZSB0aGlzIG9uIHN0cmVhbXMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgc3RyaW5nIFN1YnN0cmluZyggaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IHRoZSBpdGggY2hhcmFjdGVyIG9mIGxvb2thaGVhZC4gIFRoaXMgaXMgdGhlIHNhbWUgdXN1YWxseSBhcworICAgICAgICAgKiAgTEEoaSkuICBUaGlzIHdpbGwgYmUgdXNlZCBmb3IgbGFiZWxzIGluIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgICogIGxleGVyIGNvZGUuICBJJ2QgcHJlZmVyIHRvIHJldHVybiBhIGNoYXIgaGVyZSB0eXBlLXdpc2UsIGJ1dCBpdCdzCisgICAgICAgICAqICBwcm9iYWJseSBiZXR0ZXIgdG8gYmUgMzItYml0IGNsZWFuIGFuZCBiZSBjb25zaXN0ZW50IHdpdGggTEEuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgTFQoIGludCBpICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkFOVExSIHRyYWNrcyB0aGUgbGluZSBpbmZvcm1hdGlvbiBhdXRvbWF0aWNhbGx5PC9zdW1tYXJ5PiAqLworICAgICAgICAvKiogPHN1bW1hcnk+QmVjYXVzZSB0aGlzIHN0cmVhbSBjYW4gcmV3aW5kLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhlIGxpbmU8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBMaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIDAuLm4tMTwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IENoYXJQb3NpdGlvbkluTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSUludFN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JSW50U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSUludFN0cmVhbS5jcwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIHNpbXBsZSBzdHJlYW0gb2YgaW50ZWdlcnMgdXNlZCB3aGVuIGFsbCBJIGNhcmUgYWJvdXQgaXMgdGhlIGNoYXIKKyAgICAgKiAgb3IgdG9rZW4gdHlwZSBzZXF1ZW5jZSAoc3VjaCBhcyBpbnRlcnByZXRhdGlvbikuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElJbnRTdHJlYW0KKyAgICB7CisgICAgICAgIHZvaWQgQ29uc3VtZSgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdldCBpbnQgYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBpbnQuCisgICAgICAgICAqICBOZWdhdGl2ZSBpbmRleGVzIGFyZSBhbGxvd2VkLiAgTEEoLTEpIGlzIHByZXZpb3VzIHRva2VuICh0b2tlbgorICAgICAgICAgKiAganVzdCBtYXRjaGVkKS4gIExBKC1pKSB3aGVyZSBpIGlzIGJlZm9yZSBmaXJzdCB0b2tlbiBzaG91bGQKKyAgICAgICAgICogIHlpZWxkIC0xLCBpbnZhbGlkIGNoYXIgLyBFT0YuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgTEEoIGludCBpICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGVsbCB0aGUgc3RyZWFtIHRvIHN0YXJ0IGJ1ZmZlcmluZyBpZiBpdCBoYXNuJ3QgYWxyZWFkeS4gIFJldHVybgorICAgICAgICAgKiAgY3VycmVudCBpbnB1dCBwb3NpdGlvbiwgSW5kZXgsIG9yIHNvbWUgb3RoZXIgbWFya2VyIHNvIHRoYXQKKyAgICAgICAgICogIHdoZW4gcGFzc2VkIHRvIHJld2luZCgpIHlvdSBnZXQgYmFjayB0byB0aGUgc2FtZSBzcG90LgorICAgICAgICAgKiAgcmV3aW5kKG1hcmsoKSkgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGlucHV0IGN1cnNvci4gIFRoZSBMZXhlcgorICAgICAgICAgKiAgdHJhY2sgbGluZS9jb2wgaW5mbyBhcyB3ZWxsIGFzIGlucHV0IGluZGV4IHNvIGl0cyBtYXJrZXJzIGFyZQorICAgICAgICAgKiAgbm90IHB1cmUgaW5wdXQgaW5kZXhlcy4gIFNhbWUgZm9yIHRyZWUgbm9kZSBzdHJlYW1zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgaW50IE1hcmsoKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGluZGV4IDAuLm4gd2hlcmUgbiBpbmRpY2F0ZXMgdGhlCisgICAgICAgICAqICBsYXN0IHN5bWJvbCBoYXMgYmVlbiByZWFkLiAgVGhlIGluZGV4IGlzIHRoZSBzeW1ib2wgYWJvdXQgdG8gYmUKKyAgICAgICAgICogIHJlYWQgbm90IHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgc3ltYm9sLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBuZXh0IGNhbGwgdG8gaW5kZXggd291bGQgcmV0dXJuIG1hcmtlci4KKyAgICAgICAgICogIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIEluZGV4IGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuICBJdCdzCisgICAgICAgICAqICBqdXN0IGEgbWFya2VyIHRvIGluZGljYXRlIHdoYXQgc3RhdGUgdGhlIHN0cmVhbSB3YXMgaW4uICBUaGlzIGlzCisgICAgICAgICAqICBlc3NlbnRpYWxseSBjYWxsaW5nIHJlbGVhc2UoKSBhbmQgc2VlaygpLiAgSWYgdGhlcmUgYXJlIG1hcmtlcnMKKyAgICAgICAgICogIGNyZWF0ZWQgYWZ0ZXIgdGhpcyBtYXJrZXIgYXJndW1lbnQsIHRoaXMgcm91dGluZSBtdXN0IHVucm9sbCB0aGVtCisgICAgICAgICAqICBsaWtlIGEgc3RhY2suICBBc3N1bWUgdGhlIHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluIHdoZW4gdGhpcyBtYXJrZXIKKyAgICAgICAgICogIHdhcyBjcmVhdGVkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBSZXdpbmQoIGludCBtYXJrZXIgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXdpbmQgdG8gdGhlIGlucHV0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hcmtlci4KKyAgICAgICAgICogIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0CisgICAgICAgICAqICBiZWZvcmUgc3RhcnRpbmcgYSBzZW0vc3luIHByZWRpY2F0ZSB0byBnZXQgdGhlCisgICAgICAgICAqICBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGVjaXNpb24uCisgICAgICAgICAqICBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgbWFyayhpKQorICAgICAgICAgKiAgYW5kIHJld2luZChpKSBzaG91bGQgYmFsYW5jZSBzdGlsbC4gSXQgaXMKKyAgICAgICAgICogIGxpa2UgaW52b2tpbmcgcmV3aW5kKGxhc3QgbWFya2VyKSBidXQgaXQgc2hvdWxkIG5vdCAicG9wIgorICAgICAgICAgKiAgdGhlIG1hcmtlciBvZmYuICBJdCdzIGxpa2Ugc2VlayhsYXN0IG1hcmtlcidzIGlucHV0IHBvc2l0aW9uKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUmV3aW5kKCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKyAgICAgICAgICogIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisgICAgICAgICAqICBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKyAgICAgICAgICogIHJld2luZCgpIGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dCB0aGUgYmFja3dhcmQgc2Vlay4KKyAgICAgICAgICogIFRoaXMgbXVzdCB0aHJvdyBhd2F5IHJlc291cmNlcyBmb3IgYWxsIG1hcmtlcnMgYmFjayB0byB0aGUgbWFya2VyCisgICAgICAgICAqICBhcmd1bWVudC4gIFNvIGlmIHlvdSdyZSBuZXN0ZWQgNSBsZXZlbHMgb2YgbWFyaygpLCBhbmQgdGhlbiByZWxlYXNlKDIpCisgICAgICAgICAqICB5b3UgaGF2ZSB0byByZWxlYXNlIHJlc291cmNlcyBmb3IgZGVwdGhzIDIuLjUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIFJlbGVhc2UoIGludCBtYXJrZXIgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTZXQgdGhlIGlucHV0IGN1cnNvciB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IGluZGV4LiAgVGhpcyBpcworICAgICAgICAgKiAgbm9ybWFsbHkgdXNlZCB0byBzZWVrIGFoZWFkIGluIHRoZSBpbnB1dCBzdHJlYW0uICBObyBidWZmZXJpbmcgaXMKKyAgICAgICAgICogIHJlcXVpcmVkIHRvIGRvIHRoaXMgdW5sZXNzIHlvdSBrbm93IHlvdXIgc3RyZWFtIHdpbGwgdXNlIHNlZWsgdG8KKyAgICAgICAgICogIG1vdmUgYmFja3dhcmRzIHN1Y2ggYXMgd2hlbiBiYWNrdHJhY2tpbmcuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gcmV3aW5kIGluIGl0cyBtdWx0aS1kaXJlY3Rpb25hbAorICAgICAgICAgKiAgcmVxdWlyZW1lbnQgYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorICAgICAgICAgKgorICAgICAgICAgKiAgRm9yIGNoYXIgc3RyZWFtcywgc2Vla2luZyBmb3J3YXJkIG11c3QgdXBkYXRlIHRoZSBzdHJlYW0gc3RhdGUgc3VjaAorICAgICAgICAgKiAgYXMgbGluZSBudW1iZXIuICBGb3Igc2Vla2luZyBiYWNrd2FyZHMsIHlvdSB3aWxsIGJlIHByZXN1bWFibHkKKyAgICAgICAgICogIGJhY2t0cmFja2luZyB1c2luZyB0aGUgbWFyay9yZXdpbmQgbWVjaGFuaXNtIHRoYXQgcmVzdG9yZXMgc3RhdGUgYW5kCisgICAgICAgICAqICBzbyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBuZWVkIHRvIHVwZGF0ZSBzdGF0ZSB3aGVuIHNlZWtpbmcgYmFja3dhcmRzLgorICAgICAgICAgKgorICAgICAgICAgKiAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZm9yIGVmZmljaWVudCBiYWNrdHJhY2tpbmcgdXNpbmcKKyAgICAgICAgICogIG1lbW9pemF0aW9uLCBidXQgaW4gdGhlIGZ1dHVyZSBpdCBtYXkgYmUgdXNlZCBmb3IgaW5jcmVtZW50YWwgcGFyc2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogIFRoZSBpbmRleCBpcyAwLi5uLTEuICBBIHNlZWsgdG8gcG9zaXRpb24gaSBtZWFucyB0aGF0IExBKDEpIHdpbGwKKyAgICAgICAgICogIHJldHVybiB0aGUgaXRoIHN5bWJvbC4gIFNvLCBzZWVraW5nIHRvIDAgbWVhbnMgTEEoMSkgd2lsbCByZXR1cm4gdGhlCisgICAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSBzdHJlYW0uIAorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBTZWVrKCBpbnQgaW5kZXggKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBPbmx5IG1ha2VzIHNlbnNlIGZvciBzdHJlYW1zIHRoYXQgYnVmZmVyIGV2ZXJ5dGhpbmcgdXAgcHJvYmFibHksIGJ1dAorICAgICAgICAgKiAgbWlnaHQgYmUgdXNlZnVsIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBzdHJlYW0gb3IgZm9yIHRlc3RpbmcuICBUaGlzCisgICAgICAgICAqICB2YWx1ZSBpbmNsdWRlcyBhIHNpbmdsZSBFT0YuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICAgICAgICAgKiAgcGFzcyB0aGUgYnVjayBhbGwgdGhlIHdheSB0byB0aGUgbGV4ZXIgd2hvIGNhbiBhc2sgaXRzIGlucHV0IHN0cmVhbQorICAgICAgICAgKiAgZm9yIHRoZSBmaWxlIG5hbWUgb3Igd2hhdGV2ZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSVJ1bGVSZXR1cm5TY29wZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JUnVsZVJldHVyblNjb3BlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjg2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSVJ1bGVSZXR1cm5TY29wZS5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJ1bGVzIGNhbiBoYXZlIHN0YXJ0L3N0b3AgaW5mby4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgSVJ1bGVSZXR1cm5TY29wZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgc3RhcnQgZWxlbWVudCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgb2JqZWN0IFN0YXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHN0b3AgZWxlbWVudCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgb2JqZWN0IFN0b3AKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0ICJhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JUnVsZVJldHVyblNjb3BlXDE0MDEuY3MiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JUnVsZVJldHVyblNjb3BlXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjRmNjQKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lSdWxlUmV0dXJuU2NvcGVcMTQwMS5jcyIKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSdWxlcyBjYW4gaGF2ZSBzdGFydC9zdG9wIGluZm8uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUTGFiZWwiPlRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIGlucHV0IHN0cmVhbS48L3R5cGVwYXJhbT4KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElSdWxlUmV0dXJuU2NvcGU8VExhYmVsPiA6IElSdWxlUmV0dXJuU2NvcGUKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIHN0YXJ0IGVsZW1lbnQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIG5ldyBUTGFiZWwgU3RhcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2V0cyB0aGUgc3RvcCBlbGVtZW50IGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBuZXcgVExhYmVsIFN0b3AKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVGVtcGxhdGVSdWxlUmV0dXJuU2NvcGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzZGU3NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVGVtcGxhdGVSdWxlUmV0dXJuU2NvcGUuY3MKQEAgLTAsMCArMSw0MiBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgcHVibGljIGludGVyZmFjZSBJVGVtcGxhdGVSdWxlUmV0dXJuU2NvcGUKKyAgICB7CisgICAgICAgIG9iamVjdCBUZW1wbGF0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZVwxNDAxLmNzIiAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSVRlbXBsYXRlUnVsZVJldHVyblNjb3BlXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWU4MWUKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZVwxNDAxLmNzIgpAQCAtMCwwICsxLDQyIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZTxUVGVtcGxhdGU+IDogSVRlbXBsYXRlUnVsZVJldHVyblNjb3BlCisgICAgeworICAgICAgICBuZXcgVFRlbXBsYXRlIFRlbXBsYXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVG9rZW4uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSVRva2VuLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ODc3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSVRva2VuLmNzCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUb2tlbgorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdldCB0aGUgdGV4dCBvZiB0aGUgdG9rZW48L3N1bW1hcnk+ICovCisgICAgICAgIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhpcyB0b2tlbiB3YXMgbWF0Y2hlZDsgbGluZT0xLi5uPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5uLTE8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBDaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IENoYW5uZWwKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IFN0YXJ0SW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IFN0b3BJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBbiBpbmRleCBmcm9tIDAuLm4tMSBvZiB0aGUgdG9rZW4gb2JqZWN0IGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICAqICBUaGlzIG11c3QgYmUgdmFsaWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBBTlRMUldvcmtzIGRlYnVnZ2VyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgaW50IFRva2VuSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRnJvbSB3aGF0IGNoYXJhY3RlciBzdHJlYW0gd2FzIHRoaXMgdG9rZW4gY3JlYXRlZD8gIFlvdSBkb24ndCBoYXZlIHRvCisgICAgICAgICAqICBpbXBsZW1lbnQgYnV0IGl0J3MgbmljZSB0byBrbm93IHdoZXJlIGEgVG9rZW4gY29tZXMgZnJvbSBpZiB5b3UgaGF2ZQorICAgICAgICAgKiAgaW5jbHVkZSBmaWxlcyBldGMuLi4gb24gdGhlIGlucHV0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSUNoYXJTdHJlYW0gSW5wdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUb2tlblNvdXJjZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVG9rZW5Tb3VyY2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhOWIyYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVG9rZW5Tb3VyY2UuY3MKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIHNvdXJjZSBvZiB0b2tlbnMgbXVzdCBwcm92aWRlIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIHZpYSBuZXh0VG9rZW4oKQorICAgICAqICBhbmQgYWxzbyBtdXN0IHJldmVhbCBpdCdzIHNvdXJjZSBvZiBjaGFyYWN0ZXJzOyBDb21tb25Ub2tlbidzIHRleHQgaXMKKyAgICAgKiAgY29tcHV0ZWQgZnJvbSBhIENoYXJTdHJlYW07IGl0IG9ubHkgc3RvcmUgaW5kaWNlcyBpbnRvIHRoZSBjaGFyIHN0cmVhbS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPgorICAgICAqICBFcnJvcnMgZnJvbSB0aGUgbGV4ZXIgYXJlIG5ldmVyIHBhc3NlZCB0byB0aGUgcGFyc2VyLiAgRWl0aGVyIHlvdSB3YW50CisgICAgICogIHRvIGtlZXAgZ29pbmcgb3IgeW91IGRvIG5vdCB1cG9uIHRva2VuIHJlY29nbml0aW9uIGVycm9yLiAgSWYgeW91IGRvIG5vdAorICAgICAqICB3YW50IHRvIGNvbnRpbnVlIGxleGluZyB0aGVuIHlvdSBkbyBub3Qgd2FudCB0byBjb250aW51ZSBwYXJzaW5nLiAgSnVzdAorICAgICAqICB0aHJvdyBhbiBleGNlcHRpb24gbm90IHVuZGVyIFJlY29nbml0aW9uRXhjZXB0aW9uIGFuZCBKYXZhIHdpbGwgbmF0dXJhbGx5CisgICAgICogIHRvc3MgeW91IGFsbCB0aGUgd2F5IG91dCBvZiB0aGUgcmVjb2duaXplcnMuICBJZiB5b3Ugd2FudCB0byBjb250aW51ZQorICAgICAqICBsZXhpbmcgdGhlbiB5b3Ugc2hvdWxkIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gdG8gdGhlIHBhcnNlci0taXQgaGFzIGFscmVhZHkKKyAgICAgKiAgcmVxdWVzdGVkIGEgdG9rZW4uICBLZWVwIGxleGluZyB1bnRpbCB5b3UgZ2V0IGEgdmFsaWQgb25lLiAgSnVzdCByZXBvcnQKKyAgICAgKiAgZXJyb3JzIGFuZCBrZWVwIGdvaW5nLCBsb29raW5nIGZvciBhIHZhbGlkIHRva2VuLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBJVG9rZW5Tb3VyY2UKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBhIFRva2VuIG9iamVjdCBmcm9tIHlvdXIgaW5wdXQgc3RyZWFtICh1c3VhbGx5IGEgQ2hhclN0cmVhbSkuCisgICAgICAgICAqICBEbyBub3QgZmFpbC9yZXR1cm4gdXBvbiBsZXhpbmcgZXJyb3I7IGtlZXAgY2hld2luZyBvbiB0aGUgY2hhcmFjdGVycworICAgICAgICAgKiAgdW50aWwgeW91IGdldCBhIGdvb2Qgb25lOyBlcnJvcnMgYXJlIG5vdCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgcGFyc2VyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSVRva2VuIE5leHRUb2tlbigpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoZXJlIGFyZSB5b3UgZ2V0dGluZyB0b2tlbnMgZnJvbT8gbm9ybWFsbHkgdGhlIGltcGxpY2F0aW9uIHdpbGwgc2ltcGx5CisgICAgICAgICAqICBhc2sgbGV4ZXJzIGlucHV0IHN0cmVhbS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZ1tdIFRva2VuTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUb2tlblN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ZTdmMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9JVG9rZW5TdHJlYW0uY3MKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKworICAgIC8qKiA8c3VtbWFyeT5BIHN0cmVhbSBvZiB0b2tlbnMgYWNjZXNzaW5nIHRva2VucyBmcm9tIGEgVG9rZW5Tb3VyY2U8L3N1bW1hcnk+ICovCisgICAgcHVibGljIGludGVyZmFjZSBJVG9rZW5TdHJlYW0gOiBJSW50U3RyZWFtCisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+R2V0IFRva2VuIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgVG9rZW4uCisgICAgICAgICAqICBpJmx0OzAgaW5kaWNhdGVzIHRva2VucyBpbiB0aGUgcGFzdC4gIFNvIC0xIGlzIHByZXZpb3VzIHRva2VuIGFuZCAtMiBpcworICAgICAgICAgKiAgdHdvIHRva2VucyBhZ28uIExUKDApIGlzIHVuZGVmaW5lZC4gIEZvciBpJmd0Oz1uLCByZXR1cm4gVG9rZW4uRU9GVG9rZW4uCisgICAgICAgICAqICBSZXR1cm4gbnVsbCBmb3IgTFQoMCkgYW5kIGFueSBpbmRleCB0aGF0IHJlc3VsdHMgaW4gYW4gYWJzb2x1dGUgYWRkcmVzcworICAgICAgICAgKiAgdGhhdCBpcyBuZWdhdGl2ZS48L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVG9rZW4gTFQoIGludCBrICk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSG93IGZhciBhaGVhZCBoYXMgdGhlIHN0cmVhbSBiZWVuIGFza2VkIHRvIGxvb2s/ICBUaGUgcmV0dXJuCisgICAgICAgIC8vLyB2YWx1ZSBpcyBhIHZhbGlkIGluZGV4IGZyb20gMC4ubi0xLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnQgUmFuZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IGEgdG9rZW4gYXQgYW4gYWJzb2x1dGUgaW5kZXggaTsgMC4ubi0xLiAgVGhpcyBpcyByZWFsbHkgb25seQorICAgICAgICAgKiAgbmVlZGVkIGZvciBwcm9maWxpbmcgYW5kIGRlYnVnZ2luZyBhbmQgdG9rZW4gc3RyZWFtIHJld3JpdGluZy4KKyAgICAgICAgICogIElmIHlvdSBkb24ndCB3YW50IHRvIGJ1ZmZlciB1cCB0b2tlbnMsIHRoZW4gdGhpcyBtZXRob2QgbWFrZXMgbm8KKyAgICAgICAgICogIHNlbnNlIGZvciB5b3UuICBOYXR1cmFsbHkgeW91IGNhbid0IHVzZSB0aGUgcmV3cml0ZSBzdHJlYW0gZmVhdHVyZS4KKyAgICAgICAgICogIEkgYmVsaWV2ZSBEZWJ1Z1Rva2VuU3RyZWFtIGNhbiBlYXNpbHkgYmUgYWx0ZXJlZCB0byBub3QgdXNlCisgICAgICAgICAqICB0aGlzIG1ldGhvZCwgcmVtb3ZpbmcgdGhlIGRlcGVuZGVuY3kuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVG9rZW4gR2V0KCBpbnQgaSApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoZXJlIGlzIHRoaXMgc3RyZWFtIHB1bGxpbmcgdG9rZW5zIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisgICAgICAgICAqICB0aGUgb2JqZWN0IHRoYXQgcHJvdmlkZXMgVG9rZW4gb2JqZWN0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIElUb2tlblNvdXJjZSBUb2tlblNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gdGhlIHRleHQgb2YgYWxsIHRva2VucyBmcm9tIHN0YXJ0IHRvIHN0b3AsIGluY2x1c2l2ZS4KKyAgICAgICAgICogIElmIHRoZSBzdHJlYW0gZG9lcyBub3QgYnVmZmVyIGFsbCB0aGUgdG9rZW5zIHRoZW4gaXQgY2FuIGp1c3QKKyAgICAgICAgICogIHJldHVybiAiIiBvciBudWxsOyAgVXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgICAgICAgICAqICBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHN0cmluZyBUb1N0cmluZyggaW50IHN0YXJ0LCBpbnQgc3RvcCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEJlY2F1c2UgdGhlIHVzZXIgaXMgbm90IHJlcXVpcmVkIHRvIHVzZSBhIHRva2VuIHdpdGggYW4gaW5kZXggc3RvcmVkCisgICAgICAgICAqICBpbiBpdCwgd2UgbXVzdCBwcm92aWRlIGEgbWVhbnMgZm9yIHR3byB0b2tlbiBvYmplY3RzIHRoZW1zZWx2ZXMgdG8KKyAgICAgICAgICogIGluZGljYXRlIHRoZSBzdGFydC9lbmQgbG9jYXRpb24uICBNb3N0IG9mdGVuIHRoaXMgd2lsbCBqdXN0IGRlbGVnYXRlCisgICAgICAgICAqICB0byB0aGUgb3RoZXIgdG9TdHJpbmcoaW50LGludCkuICBUaGlzIGlzIGFsc28gcGFyYWxsZWwgd2l0aAorICAgICAgICAgKiAgdGhlIFRyZWVOb2RlU3RyZWFtLnRvU3RyaW5nKE9iamVjdCxPYmplY3QpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgc3RyaW5nIFRvU3RyaW5nKCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUb2tlblN0cmVhbUluZm9ybWF0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0lUb2tlblN0cmVhbUluZm9ybWF0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MmYyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvSVRva2VuU3RyZWFtSW5mb3JtYXRpb24uY3MKQEAgLTAsMCArMSw0OCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUb2tlblN0cmVhbUluZm9ybWF0aW9uCisgICAgeworICAgICAgICBJVG9rZW4gTGFzdFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIElUb2tlbiBMYXN0UmVhbFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBNYXhMb29rQmVoaW5kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9MZWdhY3lDb21tb25Ub2tlblN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9MZWdhY3lDb21tb25Ub2tlblN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZmNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0xlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsNTI2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uID0gU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb247CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFRoZSBtb3N0IGNvbW1vbiBzdHJlYW0gb2YgdG9rZW5zIGlzIG9uZSB3aGVyZSBldmVyeSB0b2tlbiBpcyBidWZmZXJlZCB1cAorICAgICAqICBhbmQgdG9rZW5zIGFyZSBwcmVmaWx0ZXJlZCBmb3IgYSBjZXJ0YWluIGNoYW5uZWwgKHRoZSBwYXJzZXIgd2lsbCBvbmx5CisgICAgICogIHNlZSB0aGVzZSB0b2tlbnMgYW5kIGNhbm5vdCBjaGFuZ2UgdGhlIGZpbHRlciBjaGFubmVsIG51bWJlciBkdXJpbmcgdGhlCisgICAgICogIHBhcnNlKS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPlRPRE86IGhvdyB0byBhY2Nlc3MgdGhlIGZ1bGwgdG9rZW4gc3RyZWFtPyAgSG93IHRvIHRyYWNrIGFsbCB0b2tlbnMgbWF0Y2hlZCBwZXIgcnVsZT88L3JlbWFya3M+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIExlZ2FjeUNvbW1vblRva2VuU3RyZWFtIDogSVRva2VuU3RyZWFtCisgICAgeworICAgICAgICBbU3lzdGVtLk5vblNlcmlhbGl6ZWRdCisgICAgICAgIElUb2tlblNvdXJjZSBfdG9rZW5Tb3VyY2U7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVjb3JkIGV2ZXJ5IHNpbmdsZSB0b2tlbiBwdWxsZWQgZnJvbSB0aGUgc291cmNlIHNvIHdlIGNhbiByZXByb2R1Y2UKKyAgICAgICAgICogIGNodW5rcyBvZiBpdCBsYXRlci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBMaXN0PElUb2tlbj4gdG9rZW5zOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5NYXA8dG9rZW50eXBlLCBjaGFubmVsPiB0byBvdmVycmlkZSBzb21lIFRva2VucycgY2hhbm5lbCBudW1iZXJzPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgSURpY3Rpb25hcnk8aW50LCBpbnQ+IGNoYW5uZWxPdmVycmlkZU1hcDsKKworICAgICAgICAvKiogPHN1bW1hcnk+U2V0PHRva2VudHlwZT47IGRpc2NhcmQgYW55IHRva2VucyB3aXRoIHRoaXMgdHlwZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8aW50PiBkaXNjYXJkU2V0OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Ta2lwIHRva2VucyBvbiBhbnkgY2hhbm5lbCBidXQgdGhpcyBvbmU7IHRoaXMgaXMgaG93IHdlIHNraXAgd2hpdGVzcGFjZS4uLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBjaGFubmVsID0gVG9rZW5DaGFubmVscy5EZWZhdWx0OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5CeSBkZWZhdWx0LCB0cmFjayBhbGwgaW5jb21pbmcgdG9rZW5zPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBkaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyA9IGZhbHNlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdE1hcmtlcjsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgaW5kZXggaW50byB0aGUgdG9rZW5zIGxpc3Qgb2YgdGhlIGN1cnJlbnQgdG9rZW4gKG5leHQgdG9rZW4KKyAgICAgICAgICogIHRvIGNvbnN1bWUpLiAgcD09LTEgaW5kaWNhdGVzIHRoYXQgdGhlIHRva2VucyBsaXN0IGlzIGVtcHR5CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IHAgPSAtMTsKKworICAgICAgICBwdWJsaWMgTGVnYWN5Q29tbW9uVG9rZW5TdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICB0b2tlbnMgPSBuZXcgTGlzdDxJVG9rZW4+KCA1MDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMZWdhY3lDb21tb25Ub2tlblN0cmVhbShJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpCisgICAgICAgICAgICA6IHRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl90b2tlblNvdXJjZSA9IHRva2VuU291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExlZ2FjeUNvbW1vblRva2VuU3RyZWFtKCBJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UsIGludCBjaGFubmVsICkKKyAgICAgICAgICAgIDogdGhpcyggdG9rZW5Tb3VyY2UgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSG93IGRlZXAgaGF2ZSB3ZSBnb25lPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgUmFuZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJvdGVjdGVkIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZXNldCB0aGlzIHRva2VuIHN0cmVhbSBieSBzZXR0aW5nIGl0cyB0b2tlbiBzb3VyY2UuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRva2VuU291cmNlKCBJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl90b2tlblNvdXJjZSA9IHRva2VuU291cmNlOworICAgICAgICAgICAgdG9rZW5zLkNsZWFyKCk7CisgICAgICAgICAgICBwID0gLTE7CisgICAgICAgICAgICBjaGFubmVsID0gVG9rZW5DaGFubmVscy5EZWZhdWx0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTG9hZCBhbGwgdG9rZW5zIGZyb20gdGhlIHRva2VuIHNvdXJjZSBhbmQgcHV0IGluIHRva2Vucy4KKyAgICAgICAgICogIFRoaXMgaXMgZG9uZSB1cG9uIGZpcnN0IExUIHJlcXVlc3QgYmVjYXVzZSB5b3UgbWlnaHQgd2FudCB0bworICAgICAgICAgKiAgc2V0IHNvbWUgdG9rZW4gdHlwZSAvIGNoYW5uZWwgb3ZlcnJpZGVzIGJlZm9yZSBmaWxsaW5nIGJ1ZmZlci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRmlsbEJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZhc3QgcmV0dXJuIGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBmdWxsCisgICAgICAgICAgICBpZiAoIHAgIT0gLTEgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIElUb2tlbiB0ID0gX3Rva2VuU291cmNlLk5leHRUb2tlbigpOworICAgICAgICAgICAgd2hpbGUgKCB0ICE9IG51bGwgJiYgdC5UeXBlICE9IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGRpc2NhcmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNoYW5uZWwgb3ZlcnJpZGUgZm9yIHRva2VuIHR5cGU/CisgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxJOworICAgICAgICAgICAgICAgIGlmICggY2hhbm5lbE92ZXJyaWRlTWFwICE9IG51bGwgJiYgY2hhbm5lbE92ZXJyaWRlTWFwLlRyeUdldFZhbHVlKCB0LlR5cGUsIG91dCBjaGFubmVsSSApICkKKyAgICAgICAgICAgICAgICAgICAgdC5DaGFubmVsID0gY2hhbm5lbEk7CisKKyAgICAgICAgICAgICAgICAvL2lmICggY2hhbm5lbE92ZXJyaWRlTWFwICE9IG51bGwgJiYgY2hhbm5lbE92ZXJyaWRlTWFwLkNvbnRhaW5zS2V5KCB0LmdldFR5cGUoKSApICkKKyAgICAgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvLyAgICBvYmplY3QgY2hhbm5lbEkgPSBjaGFubmVsT3ZlcnJpZGVNYXAuZ2V0KCB0LmdldFR5cGUoKSApOworICAgICAgICAgICAgICAgIC8vICAgIGlmICggY2hhbm5lbEkgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgICAgIC8vICAgICAgICB0LnNldENoYW5uZWwoIChpbnQpY2hhbm5lbEkgKTsKKyAgICAgICAgICAgICAgICAvLyAgICB9CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgaWYgKCBkaXNjYXJkU2V0ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRTZXQuQ29udGFpbnMoIHQuVHlwZSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnMgJiYgdC5DaGFubmVsICE9IHRoaXMuY2hhbm5lbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAhZGlzY2FyZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0LlRva2VuSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zLkFkZCggdCApOworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gX3Rva2VuU291cmNlLk5leHRUb2tlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbGVhdmUgcCBwb2ludGluZyBhdCBmaXJzdCB0b2tlbiBvbiBjaGFubmVsCisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgIHAgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyggcCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTW92ZSB0aGUgaW5wdXQgcG9pbnRlciB0byB0aGUgbmV4dCBpbmNvbWluZyB0b2tlbi4gIFRoZSBzdHJlYW0KKyAgICAgICAgICogIG11c3QgYmVjb21lIGFjdGl2ZSB3aXRoIExUKDEpIGF2YWlsYWJsZS4gIGNvbnN1bWUoKSBzaW1wbHkKKyAgICAgICAgICogIG1vdmVzIHRoZSBpbnB1dCBwb2ludGVyIHNvIHRoYXQgTFQoMSkgcG9pbnRzIGF0IHRoZSBuZXh0CisgICAgICAgICAqICBpbnB1dCBzeW1ib2wuIENvbnN1bWUgYXQgbGVhc3Qgb25lIHRva2VuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBXYWxrIHBhc3QgYW55IHRva2VuIG5vdCBvbiB0aGUgY2hhbm5lbCB0aGUgcGFyc2VyIGlzIGxpc3RlbmluZyB0by4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA8IHRva2Vucy5Db3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIHAgPSBTa2lwT2ZmVG9rZW5DaGFubmVscyggcCApOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+R2l2ZW4gYSBzdGFydGluZyBpbmRleCwgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb24tY2hhbm5lbCB0b2tlbi48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBTa2lwT2ZmVG9rZW5DaGFubmVscyggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IHRva2Vucy5Db3VudDsKKyAgICAgICAgICAgIHdoaWxlICggaSA8IG4gJiYgKCAoSVRva2VuKXRva2Vuc1tpXSApLkNoYW5uZWwgIT0gY2hhbm5lbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICggaSA+PSAwICYmICggKElUb2tlbil0b2tlbnNbaV0gKS5DaGFubmVsICE9IGNoYW5uZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQSBzaW1wbGUgZmlsdGVyIG1lY2hhbmlzbSB3aGVyZWJ5IHlvdSBjYW4gdGVsbCB0aGlzIHRva2VuIHN0cmVhbQorICAgICAgICAgKiAgdG8gZm9yY2UgYWxsIHRva2VucyBvZiB0eXBlIHR0eXBlIHRvIGJlIG9uIGNoYW5uZWwuICBGb3IgZXhhbXBsZSwKKyAgICAgICAgICogIHdoZW4gaW50ZXJwcmV0aW5nLCB3ZSBjYW5ub3QgZXhlYyBhY3Rpb25zIHNvIHdlIG5lZWQgdG8gdGVsbAorICAgICAgICAgKiAgdGhlIHN0cmVhbSB0byBmb3JjZSBhbGwgV1MgYW5kIE5FV0xJTkUgdG8gYmUgYSBkaWZmZXJlbnQsIGlnbm9yZWQKKyAgICAgICAgICogIGNoYW5uZWwuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRva2VuVHlwZUNoYW5uZWwoIGludCB0dHlwZSwgaW50IGNoYW5uZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGNoYW5uZWxPdmVycmlkZU1hcCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsT3ZlcnJpZGVNYXAgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWxPdmVycmlkZU1hcFt0dHlwZV0gPSBjaGFubmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBEaXNjYXJkVG9rZW5UeXBlKCBpbnQgdHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGRpc2NhcmRTZXQgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzY2FyZFNldCA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc2NhcmRTZXQuQWRkKCB0dHlwZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXREaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyggYm9vbCBkaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnMgPSBkaXNjYXJkT2ZmQ2hhbm5lbFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUb2tlbj4gR2V0VG9rZW5zKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRva2VuPiBHZXRUb2tlbnMoIGludCBzdGFydCwgaW50IHN0b3AgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0VG9rZW5zKCBzdGFydCwgc3RvcCwgKEJpdFNldCludWxsICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHaXZlbiBhIHN0YXJ0IGFuZCBzdG9wIGluZGV4LCByZXR1cm4gYSBMaXN0IG9mIGFsbCB0b2tlbnMgaW4KKyAgICAgICAgICogIHRoZSB0b2tlbiB0eXBlIEJpdFNldC4gIFJldHVybiBudWxsIGlmIG5vIHRva2VucyB3ZXJlIGZvdW5kLiAgVGhpcworICAgICAgICAgKiAgbWV0aG9kIGxvb2tzIGF0IGJvdGggb24gYW5kIG9mZiBjaGFubmVsIHRva2Vucy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0PElUb2tlbj4gR2V0VG9rZW5zKCBpbnQgc3RhcnQsIGludCBzdG9wLCBCaXRTZXQgdHlwZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RvcCA+PSB0b2tlbnMuQ291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3AgPSB0b2tlbnMuQ291bnQgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGFydCA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhcnQgPiBzdG9wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbGlzdCA9IHRva2Vuc1tzdGFydDpzdG9wXTp7VG9rZW4gdCwgdC5nZXRUeXBlKCkgaW4gdHlwZXN9CisgICAgICAgICAgICBJTGlzdDxJVG9rZW4+IGZpbHRlcmVkVG9rZW5zID0gbmV3IExpc3Q8SVRva2VuPigpOworICAgICAgICAgICAgZm9yICggaW50IGkgPSBzdGFydDsgaSA8PSBzdG9wOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmICggdHlwZXMgPT0gbnVsbCB8fCB0eXBlcy5NZW1iZXIoIHQuVHlwZSApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkVG9rZW5zLkFkZCggdCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggZmlsdGVyZWRUb2tlbnMuQ291bnQgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWRUb2tlbnMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRva2VuPiBHZXRUb2tlbnMoIGludCBzdGFydCwgaW50IHN0b3AsIElMaXN0PGludD4gdHlwZXMgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0VG9rZW5zKCBzdGFydCwgc3RvcCwgbmV3IEJpdFNldCggdHlwZXMgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRva2VuPiBHZXRUb2tlbnMoIGludCBzdGFydCwgaW50IHN0b3AsIGludCB0dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRUb2tlbnMoIHN0YXJ0LCBzdG9wLCBCaXRTZXQuT2YoIHR0eXBlICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdldCB0aGUgaXRoIHRva2VuIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gMS4ubiB3aGVyZSBrPTEgaXMgdGhlCisgICAgICAgICAqICBmaXJzdCBzeW1ib2wgb2YgbG9va2FoZWFkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIExUKCBpbnQgayApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBrID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBrIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExCKCAtayApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCJMVChwPSIrcCsiLCIraysiKT0iKTsKKyAgICAgICAgICAgIGlmICggKCBwICsgayAtIDEgKSA+PSB0b2tlbnMuQ291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnNbdG9rZW5zLkNvdW50IC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMuZ2V0KHAray0xKSk7CisgICAgICAgICAgICBpbnQgaSA9IHA7CisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMKKyAgICAgICAgICAgIHdoaWxlICggbiA8IGsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNraXAgb2ZmLWNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICAgICAgaSA9IFNraXBPZmZUb2tlbkNoYW5uZWxzKCBpICsgMSApOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpID49IHRva2Vucy5Db3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vuc1t0b2tlbnMuQ291bnQgLSAxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPiBSYW5nZSkKKyAgICAgICAgICAgICAgICBSYW5nZSA9IGk7CisKKyAgICAgICAgICAgIHJldHVybiAoSVRva2VuKXRva2Vuc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Mb29rIGJhY2t3YXJkcyBrIHRva2VucyBvbi1jaGFubmVsIHRva2Vuczwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSVRva2VuIExCKCBpbnQgayApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludCgiTEIocD0iK3ArIiwiK2srIikgIik7CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggayA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggKCBwIC0gayApIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpID0gcDsKKyAgICAgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgICAgIC8vIGZpbmQgayBnb29kIHRva2VucyBsb29raW5nIGJhY2t3YXJkcworICAgICAgICAgICAgd2hpbGUgKCBuIDw9IGsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNraXAgb2ZmLWNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICAgICAgaSA9IFNraXBPZmZUb2tlbkNoYW5uZWxzUmV2ZXJzZSggaSAtIDEgKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggaSA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChJVG9rZW4pdG9rZW5zW2ldOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIGFic29sdXRlIHRva2VuIGk7IGlnbm9yZSB3aGljaCBjaGFubmVsIHRoZSB0b2tlbnMgYXJlIG9uOworICAgICAgICAgKiAgdGhhdCBpcywgY291bnQgYWxsIHRva2VucyBub3QganVzdCBvbi1jaGFubmVsIHRva2Vucy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBHZXQoIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChJVG9rZW4pdG9rZW5zW2ldOworICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICAvKiogR2V0IGFsbCB0b2tlbnMgZnJvbSBzdGFydC4uc3RvcCBpbmNsdXNpdmVseSAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBMaXN0PElUb2tlbj4gR2V0KGludCBzdGFydCwgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInN0YXJ0Iik7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvdW50Iik7CisKKyAgICAgICAgICAgIGlmIChwID09IC0xKQorICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PElUb2tlbj4odG9rZW5zLlNraXAoc3RhcnQpLlRha2UoY291bnQpKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMVCggaSApLlR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTWFyaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdE1hcmtlciA9IEluZGV4OworICAgICAgICAgICAgcmV0dXJuIGxhc3RNYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlbGVhc2UoIGludCBtYXJrZXIgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCggaW50IG1hcmtlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlZWsoIG1hcmtlciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBTZWVrKCBsYXN0TWFya2VyICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcCA9IDA7CisgICAgICAgICAgICBsYXN0TWFya2VyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2VlayggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgcCA9IGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU291cmNlIFRva2VuU291cmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW5Tb3VyY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5Tb3VyY2UuU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCAiQnVmZmVyIGlzIG5vdCB5ZXQgZmlsbGVkLiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyggMCwgdG9rZW5zLkNvdW50IC0gMSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBpbnQgc3RhcnQsIGludCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGFydCA8IDAgfHwgc3RvcCA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiggIkJ1ZmZlciBpcyBub3QgeWV0IGZpbGxlZC4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0b3AgPj0gdG9rZW5zLkNvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9wID0gdG9rZW5zLkNvdW50IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVG9rZW4gdCA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCB0LlRleHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1N0cmluZyggSVRva2VuIHN0YXJ0LCBJVG9rZW4gc3RvcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhcnQgIT0gbnVsbCAmJiBzdG9wICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyggc3RhcnQuVG9rZW5JbmRleCwgc3RvcC5Ub2tlbkluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9MZXhlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9MZXhlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0xleGVyLmNzCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgQ29uZGl0aW9uYWxBdHRyaWJ1dGUgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgbGV4ZXIgaXMgcmVjb2duaXplciB0aGF0IGRyYXdzIGlucHV0IHN5bWJvbHMgZnJvbSBhIGNoYXJhY3RlciBzdHJlYW0uCisgICAgICogIGxleGVyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LiBBIExleGVyIG9iamVjdAorICAgICAqICB1c2VzIHNpbXBsaWZpZWQgbWF0Y2goKSBhbmQgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtcyBpbiB0aGUgaW50ZXJlc3QKKyAgICAgKiAgb2Ygc3BlZWQuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGV4ZXIgOiBCYXNlUmVjb2duaXplciwgSVRva2VuU291cmNlCisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+V2hlcmUgaXMgdGhlIGxleGVyIGRyYXdpbmcgY2hhcmFjdGVycyBmcm9tPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIElDaGFyU3RyZWFtIGlucHV0OworCisgICAgICAgIHB1YmxpYyBMZXhlcigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMZXhlciggSUNoYXJTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGV4ZXIoIElDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUgKQorICAgICAgICAgICAgOiBiYXNlKHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKyAgICAgICAgcHVibGljIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiA8c3VtbWFyeT5SZXR1cm4gdGhlIHRleHQgbWF0Y2hlZCBzbyBmYXIgZm9yIHRoZSBjdXJyZW50IHRva2VuIG9yIGFueSB0ZXh0IG92ZXJyaWRlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3RhdGUudGV4dCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50ZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU3Vic3RyaW5nKCBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LCBDaGFySW5kZXggLSBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogPHN1bW1hcnk+U2V0IHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgdG9rZW47IGl0IHdpcGVzIGFueSBwcmV2aW91cyBjaGFuZ2VzIHRvIHRoZSB0ZXh0Ljwvc3VtbWFyeT4gKi8KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLnRleHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IExpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkxpbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBDaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0LkNoYXJQb3NpdGlvbkluTGluZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuUmVzZXQoKTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgICAgICAgICAvLyB3YWNrIExleGVyIHN0YXRlIHZhcmlhYmxlcworICAgICAgICAgICAgaWYgKCBpbnB1dCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5TZWVrKCAwICk7IC8vIHJld2luZCB0aGUgaW5wdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzaGFyZWQgc3RhdGUgd29yayB0byBkbworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUudG9rZW4gPSBudWxsOworICAgICAgICAgICAgc3RhdGUudHlwZSA9IFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gLTE7CisgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0TGluZSA9IC0xOworICAgICAgICAgICAgc3RhdGUudGV4dCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmV0dXJuIGEgdG9rZW4gZnJvbSB0aGlzIHNvdXJjZTsgaS5lLiwgbWF0Y2ggYSB0b2tlbiBvbiB0aGUgY2hhciBzdHJlYW0uPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTmV4dFRva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbiA9IG51bGw7CisgICAgICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IFRva2VuQ2hhbm5lbHMuRGVmYXVsdDsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gaW5wdXQuSW5kZXg7CisgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LkxpbmU7CisgICAgICAgICAgICAgICAgc3RhdGUudGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSggMSApID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUb2tlbiBlb2YgPSBuZXcgQ29tbW9uVG9rZW4oKElDaGFyU3RyZWFtKWlucHV0LCBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZSwgVG9rZW5DaGFubmVscy5EZWZhdWx0LCBpbnB1dC5JbmRleCwgaW5wdXQuSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBlb2YuTGluZSA9IExpbmU7CisgICAgICAgICAgICAgICAgICAgIGVvZi5DaGFyUG9zaXRpb25JbkxpbmUgPSBDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlb2Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VOZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS50b2tlbiA9PSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRW1pdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzdGF0ZS50b2tlbiA9PSBUb2tlbnMuU2tpcCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiBtcmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXBvcnRFcnJvcihtcmUpOworICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaFJhbmdlKCkgcm91dGluZSBoYXMgYWxyZWFkeSBjYWxsZWQgcmVjb3ZlcigpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwb3J0RXJyb3IobXRlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2goKSByb3V0aW5lIGhhcyBhbHJlYWR5IGNhbGxlZCByZWNvdmVyKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXBvcnRFcnJvciggcmUgKTsKKyAgICAgICAgICAgICAgICAgICAgUmVjb3ZlciggcmUgKTsgLy8gdGhyb3cgb3V0IGN1cnJlbnQgY2hhciBhbmQgdHJ5IGFnYWluCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSW5zdHJ1Y3QgdGhlIGxleGVyIHRvIHNraXAgY3JlYXRpbmcgYSB0b2tlbiBmb3IgY3VycmVudCBsZXhlciBydWxlCisgICAgICAgICAqICBhbmQgbG9vayBmb3IgYW5vdGhlciB0b2tlbi4gIG5leHRUb2tlbigpIGtub3dzIHRvIGtlZXAgbG9va2luZyB3aGVuCisgICAgICAgICAqICBhIGxleGVyIHJ1bGUgZmluaXNoZXMgd2l0aCB0b2tlbiBzZXQgdG8gU0tJUF9UT0tFTi4gIFJlY2FsbCB0aGF0CisgICAgICAgICAqICBpZiB0b2tlbj09bnVsbCBhdCBlbmQgb2YgYW55IHRva2VuIHJ1bGUsIGl0IGNyZWF0ZXMgb25lIGZvciB5b3UKKyAgICAgICAgICogIGFuZCBlbWl0cyBpdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2tpcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuID0gVG9rZW5zLlNraXA7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+VGhpcyBpcyB0aGUgbGV4ZXIgZW50cnkgcG9pbnQgdGhhdCBzZXRzIGluc3RhbmNlIHZhciAndG9rZW4nPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtVG9rZW5zKCk7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUNoYXJTdHJlYW0gQ2hhclN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogPHN1bW1hcnk+U2V0IHRoZSBjaGFyIHN0cmVhbSBhbmQgcmVzZXQgdGhlIGxleGVyPC9zdW1tYXJ5PiAqLworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsOworICAgICAgICAgICAgICAgIFJlc2V0KCk7CisgICAgICAgICAgICAgICAgaW5wdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGVtaXRzIHBlciBuZXh0VG9rZW4gaW52b2NhdGlvbgorICAgICAgICAgKiAgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gIFN1YmNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQKKyAgICAgICAgICogIG5leHRUb2tlbiAodG8gcHVzaCB0b2tlbnMgaW50byBhIGxpc3QgYW5kIHB1bGwgZnJvbSB0aGF0IGxpc3QgcmF0aGVyCisgICAgICAgICAqICB0aGFuIGEgc2luZ2xlIHZhcmlhYmxlIGFzIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcykuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEVtaXQoIElUb2tlbiB0b2tlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLnRva2VuID0gdG9rZW47CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGUgc3RhbmRhcmQgbWV0aG9kIGNhbGxlZCB0byBhdXRvbWF0aWNhbGx5IGVtaXQgYSB0b2tlbiBhdCB0aGUKKyAgICAgICAgICogIG91dGVybW9zdCBsZXhpY2FsIHJ1bGUuICBUaGUgdG9rZW4gb2JqZWN0IHNob3VsZCBwb2ludCBpbnRvIHRoZQorICAgICAgICAgKiAgY2hhciBidWZmZXIgc3RhcnQuLnN0b3AuICBJZiB0aGVyZSBpcyBhIHRleHQgb3ZlcnJpZGUgaW4gJ3RleHQnLAorICAgICAgICAgKiAgdXNlIHRoYXQgdG8gc2V0IHRoZSB0b2tlbidzIHRleHQuICBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlbWl0CisgICAgICAgICAqICBjdXN0b20gVG9rZW4gb2JqZWN0cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IGFyZSBidWlsZGluZyB0cmVlcywgdGhlbiB5b3Ugc2hvdWxkIGFsc28gb3ZlcnJpZGUKKyAgICAgICAgICogIFBhcnNlciBvciBUcmVlUGFyc2VyLmdldE1pc3NpbmdTeW1ib2woKS4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlbiBFbWl0KCkKKyAgICAgICAgeworICAgICAgICAgICAgSVRva2VuIHQgPSBuZXcgQ29tbW9uVG9rZW4oIGlucHV0LCBzdGF0ZS50eXBlLCBzdGF0ZS5jaGFubmVsLCBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LCBDaGFySW5kZXggLSAxICk7CisgICAgICAgICAgICB0LkxpbmUgPSBzdGF0ZS50b2tlblN0YXJ0TGluZTsKKyAgICAgICAgICAgIHQuVGV4dCA9IHN0YXRlLnRleHQ7CisgICAgICAgICAgICB0LkNoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICBFbWl0KCB0ICk7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWF0Y2goIHN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKCBpIDwgcy5MZW5ndGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoIDEgKSAhPSBzW2ldICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG10ZSA9IG5ldyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oc1tpXSwgaW5wdXQsIFRva2VuTmFtZXMpOworICAgICAgICAgICAgICAgICAgICBSZWNvdmVyKCBtdGUgKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBNYXRjaEFueSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWF0Y2goIGludCBjICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSggMSApICE9IGMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPSBuZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGMsIGlucHV0LCBUb2tlbk5hbWVzKTsKKyAgICAgICAgICAgICAgICBSZWNvdmVyKCBtdGUgKTsgIC8vIGRvbid0IHJlYWxseSByZWNvdmVyOyBqdXN0IGNvbnN1bWUgaW4gbGV4ZXIKKyAgICAgICAgICAgICAgICB0aHJvdyBtdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dC5Db25zdW1lKCk7CisgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTWF0Y2hSYW5nZSggaW50IGEsIGludCBiICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSggMSApIDwgYSB8fCBpbnB1dC5MQSggMSApID4gYiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIG1yZSA9IG5ldyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oYSwgYiwgaW5wdXQpOworICAgICAgICAgICAgICAgIFJlY292ZXIoIG1yZSApOworICAgICAgICAgICAgICAgIHRocm93IG1yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0LkNvbnN1bWUoKTsKKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlciBvZiBsb29rYWhlYWQ/PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ2hhckluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5JbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlcG9ydEVycm9yKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIFRPRE86IG5vdCB0aG91Z2h0IGFib3V0IHJlY292ZXJ5IGluIGxleGVyIHlldC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yIGFuZCBoYXZlIG5vdCBtYXRjaGVkIGEgdG9rZW4KKyAgICAgICAgICAgIC8vIHlldCBzdWNjZXNzZnVsbHksIGRvbid0IHJlcG9ydCBhbnkgZXJyb3JzLgorICAgICAgICAgICAgaWYgKCBlcnJvclJlY292ZXJ5ICkgeworICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludCgiW1NQVVJJT1VTXSAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvclJlY292ZXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBEaXNwbGF5UmVjb2duaXRpb25FcnJvciggdGhpcy5Ub2tlbk5hbWVzLCBlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdldEVycm9yTWVzc2FnZSggUmVjb2duaXRpb25FeGNlcHRpb24gZSwgc3RyaW5nW10gdG9rZW5OYW1lcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBtc2cgPSBudWxsOworICAgICAgICAgICAgaWYgKCBlIGlzIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG10ZSA9IChNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoIGUuQ2hhcmFjdGVyICkgKyAiIGV4cGVjdGluZyAiICsgR2V0Q2hhckVycm9yRGlzcGxheSggbXRlLkV4cGVjdGluZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGUgaXMgTm9WaWFibGVBbHRFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSAoTm9WaWFibGVBbHRFeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQsIGNhbiBhZGQgImRlY2lzaW9uPTw8IitudmFlLmdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uKyI+PiIKKyAgICAgICAgICAgICAgICAvLyBhbmQgIihkZWNpc2lvbj0iK252YWUuZGVjaXNpb25OdW1iZXIrIikgYW5kCisgICAgICAgICAgICAgICAgLy8gInN0YXRlICIrbnZhZS5zdGF0ZU51bWJlcgorICAgICAgICAgICAgICAgIG1zZyA9ICJubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgY2hhcmFjdGVyICIgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KCBlLkNoYXJhY3RlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGUgaXMgRWFybHlFeGl0RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0gKEVhcmx5RXhpdEV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiKGRlY2lzaW9uPSIrZWVlLmRlY2lzaW9uTnVtYmVyKyIpIgorICAgICAgICAgICAgICAgIG1zZyA9ICJyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGNoYXJhY3RlciAiICsgR2V0Q2hhckVycm9yRGlzcGxheSggZS5DaGFyYWN0ZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBlIGlzIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gbXNlID0gKE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24pZTsKKyAgICAgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiArIEdldENoYXJFcnJvckRpc3BsYXkoIGUuQ2hhcmFjdGVyICkgKyAiIGV4cGVjdGluZyBzZXQgIiArIG1zZS5FeHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZSBpcyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IChNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KCBlLkNoYXJhY3RlciApICsgIiBleHBlY3Rpbmcgc2V0ICIgKyBtc2UuRXhwZWN0aW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGUgaXMgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gbXJlID0gKE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiICsgR2V0Q2hhckVycm9yRGlzcGxheSggZS5DaGFyYWN0ZXIgKSArICIgZXhwZWN0aW5nIHNldCAiICsKKyAgICAgICAgICAgICAgICAgICAgICBHZXRDaGFyRXJyb3JEaXNwbGF5KCBtcmUuQSApICsgIi4uIiArIEdldENoYXJFcnJvckRpc3BsYXkoIG1yZS5CICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNnID0gYmFzZS5HZXRFcnJvck1lc3NhZ2UoIGUsIHRva2VuTmFtZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgR2V0Q2hhckVycm9yRGlzcGxheSggaW50IGMgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcyA9ICggKGNoYXIpYyApLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzd2l0Y2ggKCBjICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlcy5FbmRPZkZpbGU6CisgICAgICAgICAgICAgICAgcyA9ICI8RU9GPiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgcyA9ICJcXG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIHMgPSAiXFx0IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICBzID0gIlxcciI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIiciICsgcyArICInIjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIExleGVycyBjYW4gbm9ybWFsbHkgbWF0Y2ggYW55IGNoYXIgaW4gaXQncyB2b2NhYnVsYXJ5IGFmdGVyIG1hdGNoaW5nCisgICAgICAgICAqICBhIHRva2VuLCBzbyBkbyB0aGUgZWFzeSB0aGluZyBhbmQganVzdCBraWxsIGEgY2hhcmFjdGVyIGFuZCBob3BlCisgICAgICAgICAqICBpdCBhbGwgd29ya3Mgb3V0LiAgWW91IGNhbiBpbnN0ZWFkIHVzZSB0aGUgcnVsZSBpbnZvY2F0aW9uIHN0YWNrCisgICAgICAgICAqICB0byBkbyBzb3BoaXN0aWNhdGVkIGVycm9yIHJlY292ZXJ5IGlmIHlvdSBhcmUgaW4gYSBmcmFnbWVudCBydWxlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZWNvdmVyKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjb25zdW1pbmcgY2hhciAiKyhjaGFyKWlucHV0LkxBKDEpKyIgZHVyaW5nIHJlY292ZXJ5Iik7CisgICAgICAgICAgICAvL3JlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlSW4oIHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBpbnB1dFN5bWJvbCA9ICggKGNoYXIpaW5wdXQuTFQoIDEgKSApICsgIiBsaW5lPSIgKyBMaW5lICsgIjoiICsgQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgYmFzZS5UcmFjZUluKCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCApOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlT3V0KCBzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgaW5wdXRTeW1ib2wgPSAoIChjaGFyKWlucHV0LkxUKCAxICkgKSArICIgbGluZT0iICsgTGluZSArICI6IiArIENoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgIGJhc2UuVHJhY2VPdXQoIHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFBhcnNlTmV4dFRva2VuKCkKKyAgICAgICAgeworICAgICAgICAgICAgbVRva2VucygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc2MvRmFzdFF1ZXVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc2MvRmFzdFF1ZXVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzViZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzYy9GYXN0UXVldWUuY3MKQEAgLTAsMCArMSwxNDMgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuTWlzYworeworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIEFyZ3VtZW50RXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uOworICAgIHVzaW5nIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gPSBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKworICAgIC8qKiBBIHF1ZXVlIHRoYXQgY2FuIGRlcXVldWUgYW5kIGdldChpKSBpbiBPKDEpIGFuZCBncm93IGFyYml0cmFyaWx5IGxhcmdlLgorICAgICAqICBBIGxpbmtlZCBsaXN0IGlzIGZhc3QgYXQgZGVxdWV1ZSBidXQgc2xvdyBhdCBnZXQoaSkuICBBbiBhcnJheSBpcworICAgICAqICB0aGUgcmV2ZXJzZS4gIFRoaXMgaXMgTygxKSBmb3IgYm90aCBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogIExpc3QgZ3Jvd3MgdW50aWwgeW91IGRlcXVldWUgbGFzdCBlbGVtZW50IGF0IGVuZCBvZiBidWZmZXIuIFRoZW4KKyAgICAgKiAgaXQgcmVzZXRzIHRvIHN0YXJ0IGZpbGxpbmcgYXQgMCBhZ2Fpbi4gIElmIGFkZHMvcmVtb3ZlcyBhcmUgYmFsYW5jZWQsIHRoZQorICAgICAqICBidWZmZXIgd2lsbCBub3QgZ3JvdyB0b28gbGFyZ2UuCisgICAgICoKKyAgICAgKiAgTm8gaXRlcmF0b3Igc3R1ZmYgYXMgdGhhdCdzIG5vdCBob3cgd2UnbGwgdXNlIGl0LgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBGYXN0UXVldWU8VD4KKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT5keW5hbWljYWxseS1zaXplZCBidWZmZXIgb2YgZWxlbWVudHM8L3N1bW1hcnk+ICovCisgICAgICAgIGludGVybmFsIExpc3Q8VD4gX2RhdGEgPSBuZXcgTGlzdDxUPigpOworICAgICAgICAvKiogPHN1bW1hcnk+aW5kZXggb2YgbmV4dCBlbGVtZW50IHRvIGZpbGw8L3N1bW1hcnk+ICovCisgICAgICAgIGludGVybmFsIGludCBfcCA9IDA7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YS5Db3VudCAtIF9wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSG93IGRlZXAgaGF2ZSB3ZSBnb25lPworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgUmFuZ2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgcHJvdGVjdGVkIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBlbGVtZW50IGkgZWxlbWVudHMgYWhlYWQgb2YgY3VycmVudCBlbGVtZW50LiAgaT09MCBnZXRzCisgICAgICAgICAqICBjdXJyZW50IGVsZW1lbnQuICBUaGlzIGlzIG5vdCBhbiBhYnNvbHV0ZSBpbmRleCBpbnRvIHRoZSBkYXRhIGxpc3QKKyAgICAgICAgICogIHNpbmNlIHAgZGVmaW5lcyB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgbGlzdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFQgdGhpc1tpbnQgaV0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFic0luZGV4ID0gX3AgKyBpOworICAgICAgICAgICAgICAgIGlmIChhYnNJbmRleCA+PSBfZGF0YS5Db3VudCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoInF1ZXVlIGluZGV4IHswfSA+IGxhc3QgaW5kZXggezF9IiwgYWJzSW5kZXgsIF9kYXRhLkNvdW50IC0gMSkpOworICAgICAgICAgICAgICAgIGlmIChhYnNJbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJxdWV1ZSBpbmRleCB7MH0gPCAwIiwgYWJzSW5kZXgpKTsKKworICAgICAgICAgICAgICAgIGlmIChhYnNJbmRleCA+IFJhbmdlKQorICAgICAgICAgICAgICAgICAgICBSYW5nZSA9IGFic0luZGV4OworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9kYXRhW2Fic0luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgYW5kIHJlbW92ZSBmaXJzdCBlbGVtZW50IGluIHF1ZXVlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBUIERlcXVldWUoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBUIG8gPSB0aGlzWzBdOworICAgICAgICAgICAgX3ArKzsKKyAgICAgICAgICAgIC8vIGhhdmUgd2UgaGl0IGVuZCBvZiBidWZmZXI/CisgICAgICAgICAgICBpZiAoIF9wID09IF9kYXRhLkNvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBzbywgaXQncyBhbiBvcHBvcnR1bml0eSB0byBzdGFydCBmaWxsaW5nIGF0IGluZGV4IDAgYWdhaW4KKyAgICAgICAgICAgICAgICBDbGVhcigpOyAvLyBzaXplIGdvZXMgdG8gMCwgYnV0IHJldGFpbnMgbWVtb3J5CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRW5xdWV1ZSggVCBvICkKKyAgICAgICAgeworICAgICAgICAgICAgX2RhdGEuQWRkKCBvICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBUIFBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpc1swXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfcCA9IDA7CisgICAgICAgICAgICBfZGF0YS5DbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldHVybiBzdHJpbmcgb2YgY3VycmVudCBidWZmZXIgY29udGVudHM7IG5vbi1kZXN0cnVjdGl2ZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGludCBuID0gQ291bnQ7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHRoaXNbaV0gKTsKKyAgICAgICAgICAgICAgICBpZiAoICggaSArIDEgKSA8IG4gKQorICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCAiICIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9NaXNjL0Z1bmN0aW9uRGVsZWdhdGVzLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc2MvRnVuY3Rpb25EZWxlZ2F0ZXMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiOTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9NaXNjL0Z1bmN0aW9uRGVsZWdhdGVzLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5NaXNjCit7CisgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgQWN0aW9uKCk7CisKKyAgICBwdWJsaWMgZGVsZWdhdGUgVFJlc3VsdCBGdW5jPFRSZXN1bHQ+KCk7CisKKyAgICBwdWJsaWMgZGVsZWdhdGUgVFJlc3VsdCBGdW5jPFQsIFRSZXN1bHQ+KFQgYXJnKTsKK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzYy9MaXN0U3RhY2tcMTQwMS5jcyIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc2MvTGlzdFN0YWNrXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NmFkY2IKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc2MvTGlzdFN0YWNrXDE0MDEuY3MiCkBAIC0wLDAgKzEsOTggQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5NaXNjCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiA9IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOworCisgICAgcHVibGljIGNsYXNzIExpc3RTdGFjazxUPiA6IExpc3Q8VD4KKyAgICB7CisgICAgICAgIHB1YmxpYyBUIFBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUGVlaygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIFBlZWsoaW50IGRlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICBUIGl0ZW07CisgICAgICAgICAgICBpZiAoIVRyeVBlZWsoZGVwdGgsIG91dCBpdGVtKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sIFRyeVBlZWsob3V0IFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRyeVBlZWsoMCwgb3V0IGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgVHJ5UGVlayhpbnQgZGVwdGgsIG91dCBUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXB0aCA+PSBDb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gZGVmYXVsdChUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZW0gPSB0aGlzW0NvdW50IC0gZGVwdGggLSAxXTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgUG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgVCByZXN1bHQ7CisgICAgICAgICAgICBpZiAoIVRyeVBvcChvdXQgcmVzdWx0KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgVHJ5UG9wKG91dCBUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDb3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBkZWZhdWx0KFQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXRlbSA9IHRoaXNbQ291bnQgLSAxXTsKKyAgICAgICAgICAgIFJlbW92ZUF0KENvdW50IC0gMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFB1c2goVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICBBZGQoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzYy9Mb29rYWhlYWRTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzYy9Mb29rYWhlYWRTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9NaXNjL0xvb2thaGVhZFN0cmVhbS5jcwpAQCAtMCwwICsxLDIzNCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5NaXNjCit7CisgICAgdXNpbmcgQXJndW1lbnRFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnRFeGNlcHRpb247CisgICAgdXNpbmcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiA9IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGxvb2thaGVhZCBxdWV1ZSB0aGF0IGtub3dzIGhvdyB0byBtYXJrL3JlbGVhc2UgbG9jYXRpb25zCisgICAgICogIGluIHRoZSBidWZmZXIgZm9yIGJhY2t0cmFja2luZyBwdXJwb3Nlcy4gQW55IG1hcmtlcnMgZm9yY2UgdGhlIEZhc3RRdWV1ZQorICAgICAqICBzdXBlcmNsYXNzIHRvIGtlZXAgYWxsIHRva2VucyB1bnRpbCBubyBtb3JlIG1hcmtlcnM7IHRoZW4gY2FuIHJlc2V0CisgICAgICogIHRvIGF2b2lkIGdyb3dpbmcgYSBodWdlIGJ1ZmZlci4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rYWhlYWRTdHJlYW08VD4KKyAgICAgICAgOiBGYXN0UXVldWU8VD4KKyAgICAgICAgd2hlcmUgVCA6IGNsYXNzCisgICAgeworICAgICAgICAvKiogQWJzb2x1dGUgdG9rZW4gaW5kZXguIEl0J3MgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wgYWJvdXQgdG8gYmUKKyAgICAgICAgICogIHJlYWQgdmlhIExUKDEpLiBHb2VzIGZyb20gMCB0byBudW10b2tlbnMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBfY3VycmVudEVsZW1lbnRJbmRleCA9IDA7CisKKyAgICAgICAgcHJpdmF0ZSBUIF9wcmV2aW91c0VsZW1lbnQ7CisKKyAgICAgICAgLyoqIFRyYWNrIG9iamVjdCByZXR1cm5lZCBieSBuZXh0RWxlbWVudCB1cG9uIGVuZCBvZiBzdHJlYW07CisgICAgICAgICAqICBSZXR1cm4gaXQgbGF0ZXIgd2hlbiB0aGV5IGFzayBmb3IgTFQgcGFzc2VkIGVuZCBvZiBpbnB1dC4KKyAgICAgICAgICovCisgICAgICAgIFQgX2VvZiA9IG51bGw7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IF9sYXN0TWFya2VyOworCisgICAgICAgIC8qKiA8c3VtbWFyeT50cmFja3MgaG93IGRlZXAgbWFyaygpIGNhbGxzIGFyZSBuZXN0ZWQ8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBfbWFya0RlcHRoOworCisgICAgICAgIHB1YmxpYyBUIEVuZE9mRmlsZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2VvZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZW9mID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBQcmV2aW91c0VsZW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmV2aW91c0VsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xlYXIoKTsKKyAgICAgICAgICAgIF9jdXJyZW50RWxlbWVudEluZGV4ID0gMDsKKyAgICAgICAgICAgIF9wID0gMDsKKyAgICAgICAgICAgIF9wcmV2aW91c0VsZW1lbnQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSW1wbGVtZW50IG5leHRFbGVtZW50IHRvIHN1cHBseSBhIHN0cmVhbSBvZiBlbGVtZW50cyB0byB0aGlzCisgICAgICAgICAqICBsb29rYWhlYWQgYnVmZmVyLiAgUmV0dXJuIGVvZiB1cG9uIGVuZCBvZiB0aGUgc3RyZWFtIHdlJ3JlIHB1bGxpbmcgZnJvbS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUIE5leHRFbGVtZW50KCk7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNFbmRPZkZpbGUoVCBvKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+R2V0IGFuZCByZW1vdmUgZmlyc3QgZWxlbWVudCBpbiBxdWV1ZTsgb3ZlcnJpZGUgRmFzdFF1ZXVlLnJlbW92ZSgpPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVCBEZXF1ZXVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgVCBvID0gdGhpc1swXTsKKyAgICAgICAgICAgIF9wKys7CisgICAgICAgICAgICAvLyBoYXZlIHdlIGhpdCBlbmQgb2YgYnVmZmVyIGFuZCBub3QgYmFja3RyYWNraW5nPworICAgICAgICAgICAgaWYgKCBfcCA9PSBfZGF0YS5Db3VudCAmJiBfbWFya0RlcHRoID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlmIHNvLCBpdCdzIGFuIG9wcG9ydHVuaXR5IHRvIHN0YXJ0IGZpbGxpbmcgYXQgaW5kZXggMCBhZ2FpbgorICAgICAgICAgICAgICAgIENsZWFyKCk7IC8vIHNpemUgZ29lcyB0byAwLCBidXQgcmV0YWlucyBtZW1vcnkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRvIHJlbW92ZSwgZXZlbiBpZiBFT0Y8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5bmNBaGVhZCgxKTsKKyAgICAgICAgICAgIF9wcmV2aW91c0VsZW1lbnQgPSBEZXF1ZXVlKCk7CisgICAgICAgICAgICBfY3VycmVudEVsZW1lbnRJbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWFrZSBzdXJlIHdlIGhhdmUgJ25lZWQnIGVsZW1lbnRzIGZyb20gY3VycmVudCBwb3NpdGlvbiBwLiBMYXN0IHZhbGlkCisgICAgICAgICAqICBwIGluZGV4IGlzIGRhdGEuc2l6ZSgpLTEuICBwK25lZWQtMSBpcyB0aGUgZGF0YSBpbmRleCAnbmVlZCcgZWxlbWVudHMKKyAgICAgICAgICogIGFoZWFkLiAgSWYgd2UgbmVlZCAxIGVsZW1lbnQsIChwKzEtMSk9PXAgbXVzdCBiZSAmbHQ7IGRhdGEuc2l6ZSgpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBTeW5jQWhlYWQoIGludCBuZWVkICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSAoIF9wICsgbmVlZCAtIDEgKSAtIF9kYXRhLkNvdW50ICsgMTsgLy8gaG93IG1hbnkgbW9yZSBlbGVtZW50cyB3ZSBuZWVkPworICAgICAgICAgICAgaWYgKCBuID4gMCApCisgICAgICAgICAgICAgICAgRmlsbCggbiApOyAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGVsZW1lbnRzPworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PmFkZCBuIGVsZW1lbnRzIHRvIGJ1ZmZlcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGaWxsKCBpbnQgbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVCBvID0gTmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIElzRW5kT2ZGaWxlKG8pICkKKyAgICAgICAgICAgICAgICAgICAgX2VvZiA9IG87CisKKyAgICAgICAgICAgICAgICBfZGF0YS5BZGQoIG8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5TaXplIG9mIGVudGlyZSBzdHJlYW0gaXMgdW5rbm93bjsgd2Ugb25seSBrbm93IGJ1ZmZlciBzaXplIGZyb20gRmFzdFF1ZXVlPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCAic3RyZWFtcyBhcmUgb2YgdW5rbm93biBzaXplIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgVCBMVCggaW50IGsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGsgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGsgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoLWspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTeW5jQWhlYWQoIGsgKTsKKyAgICAgICAgICAgIGlmICgoX3AgKyBrIC0gMSkgPiBfZGF0YS5Db3VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2VvZjsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXNbayAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY3VycmVudEVsZW1lbnRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkKKyAgICAgICAgeworICAgICAgICAgICAgX21hcmtEZXB0aCsrOworICAgICAgICAgICAgX2xhc3RNYXJrZXIgPSBfcDsgLy8gdHJhY2sgd2hlcmUgd2UgYXJlIGluIGJ1ZmZlciwgbm90IGFic29sdXRlIHRva2VuIGluZGV4CisgICAgICAgICAgICByZXR1cm4gX2xhc3RNYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlbGVhc2UoIGludCBtYXJrZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX21hcmtEZXB0aCA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIF9tYXJrRGVwdGgtLTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCBpbnQgbWFya2VyICkKKyAgICAgICAgeworICAgICAgICAgICAgU2VlayggbWFya2VyICk7CisgICAgICAgICAgICBSZWxlYXNlKCBtYXJrZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmV3aW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmV3aW5kKCBfbGFzdE1hcmtlciApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgU2VlayB0byBhIDAtaW5kZXhlZCBwb3NpdGlvbiB3aXRoaW4gZGF0YSBidWZmZXIuICBDYW4ndCBoYW5kbGUKKyAgICAgICAgICogIGNhc2Ugd2hlcmUgeW91IHNlZWsgYmV5b25kIGVuZCBvZiBleGlzdGluZyBidWZmZXIuICBOb3JtYWxseSB1c2VkCisgICAgICAgICAqICB0byBzZWVrIGJhY2t3YXJkcyBpbiB0aGUgYnVmZmVyLiBEb2VzIG5vdCBmb3JjZSBsb2FkaW5nIG9mIG5vZGVzLgorICAgICAgICAgKiAgRG9lc24ndCBzZWUgdG8gYWJzb2x1dGUgcG9zaXRpb24gaW4gaW5wdXQgc3RyZWFtIHNpbmNlIHRoaXMgc3RyZWFtCisgICAgICAgICAqICBpcyB1bmJ1ZmZlcmVkLiBTZWVrcyBvbmx5IGludG8gb3VyIG1vdmluZyB3aW5kb3cgb2YgZWxlbWVudHMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNlZWsoIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wID0gaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBUIExCKGludCBrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoayA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBfcHJldmlvdXNFbGVtZW50OworCisgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGxvb2sgYmFja3dhcmRzIG1vcmUgdGhhbiBvbmUgdG9rZW4gaW4gdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYmM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIDogTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbihCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKGV4cGVjdGluZywgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZXhwZWN0aW5nLCBpbnB1dCwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKCIgKyBVbmV4cGVjdGVkVHlwZSArICIhPSIgKyBFeHBlY3RpbmcgKyAiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE0YWVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBBcmd1bWVudE51bGxFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIDogUmVjb2duaXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9hOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfYjsKKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oaW50IGEsIGludCBiLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9hID0gYTsKKyAgICAgICAgICAgIHRoaXMuX2IgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgaW50IGEsIGludCBiLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9hID0gYTsKKyAgICAgICAgICAgIHRoaXMuX2IgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgaW50IGEsIGludCBiLCBJSW50U3RyZWFtIGlucHV0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9hID0gYTsKKyAgICAgICAgICAgIHRoaXMuX2IgPSBiOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIHRoaXMuX2EgPSBpbmZvLkdldEludDMyKCJBIik7CisgICAgICAgICAgICB0aGlzLl9iID0gaW5mby5HZXRJbnQzMigiQiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBBCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkEiLCBfYSk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJCIiwgX2IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKCIgKyBVbmV4cGVjdGVkVHlwZSArICIgbm90IGluIFsiICsgQSArICIsIiArIEIgKyAiXSkiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJhZWNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uY3MKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gOiBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBCaXRTZXQgX2V4cGVjdGluZzsKKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKCBCaXRTZXQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0ICkKKyAgICAgICAgICAgIDogYmFzZSggaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9leHBlY3RpbmcgPSBleHBlY3Rpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgQml0U2V0IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRTZXRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEJpdFNldCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGV4cGVjdGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gKEJpdFNldClpbmZvLkdldFZhbHVlKCJFeHBlY3RpbmciLCB0eXBlb2YoQml0U2V0KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQml0U2V0IEV4cGVjdGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2V4cGVjdGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiRXhwZWN0aW5nIiwgX2V4cGVjdGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKCIgKyBVbmV4cGVjdGVkVHlwZSArICIhPSIgKyBFeHBlY3RpbmcgKyAiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWM5YWFiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbDsKKyAgICB1c2luZyBBcmd1bWVudE51bGxFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+QSBtaXNtYXRjaGVkIGNoYXIgb3IgVG9rZW4gb3IgdHJlZSBub2RlPC9zdW1tYXJ5PiAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gOiBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2V4cGVjdGluZyA9IFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZWFkT25seUNvbGxlY3Rpb248c3RyaW5nPiBfdG9rZW5OYW1lczsKKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogdGhpcyhleHBlY3RpbmcsIGlucHV0LCBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcykKKyAgICAgICAgICAgIDogYmFzZShpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworCisgICAgICAgICAgICBpZiAodG9rZW5OYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuTmFtZXMgPSBuZXcgTGlzdDxzdHJpbmc+KHRva2VuTmFtZXMpLkFzUmVhZE9ubHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcykKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworCisgICAgICAgICAgICBpZiAodG9rZW5OYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuTmFtZXMgPSBuZXcgTGlzdDxzdHJpbmc+KHRva2VuTmFtZXMpLkFzUmVhZE9ubHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcywgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0LCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworCisgICAgICAgICAgICBpZiAodG9rZW5OYW1lcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuTmFtZXMgPSBuZXcgTGlzdDxzdHJpbmc+KHRva2VuTmFtZXMpLkFzUmVhZE9ubHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICB0aGlzLl9leHBlY3RpbmcgPSBpbmZvLkdldEludDMyKCJFeHBlY3RpbmciKTsKKyAgICAgICAgICAgIHRoaXMuX3Rva2VuTmFtZXMgPSBuZXcgUmVhZE9ubHlDb2xsZWN0aW9uPHN0cmluZz4oKHN0cmluZ1tdKWluZm8uR2V0VmFsdWUoIlRva2VuTmFtZXMiLCB0eXBlb2Yoc3RyaW5nW10pKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEV4cGVjdGluZworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2V4cGVjdGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZWFkT25seUNvbGxlY3Rpb248c3RyaW5nPiBUb2tlbk5hbWVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdG9rZW5OYW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiRXhwZWN0aW5nIiwgX2V4cGVjdGluZyk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJUb2tlbk5hbWVzIiwgKF90b2tlbk5hbWVzICE9IG51bGwpID8gbmV3IExpc3Q8c3RyaW5nPihfdG9rZW5OYW1lcykuVG9BcnJheSgpIDogZGVmYXVsdChzdHJpbmdbXSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB1bmV4cGVjdGVkVHlwZSA9IFVuZXhwZWN0ZWRUeXBlOworICAgICAgICAgICAgc3RyaW5nIHVuZXhwZWN0ZWQgPSAoIFRva2VuTmFtZXMgIT0gbnVsbCAmJiB1bmV4cGVjdGVkVHlwZSA+PSAwICYmIHVuZXhwZWN0ZWRUeXBlIDwgVG9rZW5OYW1lcy5Db3VudCApID8gVG9rZW5OYW1lc1t1bmV4cGVjdGVkVHlwZV0gOiB1bmV4cGVjdGVkVHlwZS5Ub1N0cmluZygpOworICAgICAgICAgICAgc3RyaW5nIGV4cGVjdGVkID0gKCBUb2tlbk5hbWVzICE9IG51bGwgJiYgRXhwZWN0aW5nID49IDAgJiYgRXhwZWN0aW5nIDwgVG9rZW5OYW1lcy5Db3VudCApID8gVG9rZW5OYW1lc1tFeHBlY3RpbmddIDogRXhwZWN0aW5nLlRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gIk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbigiICsgdW5leHBlY3RlZCArICIhPSIgKyBleHBlY3RlZCArICIpIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzMyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBJVHJlZU5vZGVTdHJlYW0gPSBBbnRsci5SdW50aW1lLlRyZWUuSVRyZWVOb2RlU3RyZWFtOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZXhwZWN0aW5nOworCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiggaW50IGV4cGVjdGluZywgSVRyZWVOb2RlU3RyZWFtIGlucHV0ICkKKyAgICAgICAgICAgIDogYmFzZSggaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9leHBlY3RpbmcgPSBleHBlY3Rpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0aW5nLCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGV4cGVjdGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElUcmVlTm9kZVN0cmVhbSBpbnB1dCwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0LCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZXhwZWN0aW5nID0gZXhwZWN0aW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIHRoaXMuX2V4cGVjdGluZyA9IGluZm8uR2V0SW50MzIoIkV4cGVjdGluZyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBFeHBlY3RpbmcKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9leHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkV4cGVjdGluZyIsIF9leHBlY3RpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKCIgKyBVbmV4cGVjdGVkVHlwZSArICIhPSIgKyBFeHBlY3RpbmcgKyAiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTljYmExCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFdlIHdlcmUgZXhwZWN0aW5nIGEgdG9rZW4gYnV0IGl0J3Mgbm90IGZvdW5kLiAgVGhlIGN1cnJlbnQgdG9rZW4KKyAgICAgKiAgaXMgYWN0dWFsbHkgd2hhdCB3ZSB3YW50ZWQgbmV4dC4gIFVzZWQgZm9yIHRyZWUgbm9kZSBlcnJvcnMgdG9vLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbiA6IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2luc2VydGVkOworCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbihpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBvYmplY3QgaW5zZXJ0ZWQpCisgICAgICAgICAgICA6IHRoaXMoZXhwZWN0aW5nLCBpbnB1dCwgaW5zZXJ0ZWQsIG51bGwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCwgb2JqZWN0IGluc2VydGVkLCBJTGlzdDxzdHJpbmc+IHRva2VuTmFtZXMpCisgICAgICAgICAgICA6IGJhc2UoZXhwZWN0aW5nLCBpbnB1dCwgdG9rZW5OYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5faW5zZXJ0ZWQgPSBpbnNlcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNaXNzaW5nVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIG9iamVjdCBpbnNlcnRlZCwgSUxpc3Q8c3RyaW5nPiB0b2tlbk5hbWVzKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQsIHRva2VuTmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2luc2VydGVkID0gaW5zZXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBvYmplY3QgaW5zZXJ0ZWQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcywgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGV4cGVjdGluZywgaW5wdXQsIHRva2VuTmFtZXMsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9pbnNlcnRlZCA9IGluc2VydGVkOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE1pc3NpbmdUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBFeHBlY3Rpbmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pbnNlcnRlZCAhPSBudWxsICYmIFRva2VuICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nVG9rZW5FeGNlcHRpb24oaW5zZXJ0ZWQgIiArIF9pbnNlcnRlZCArICIgYXQgIiArIFRva2VuLlRleHQgKyAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVG9rZW4gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1pc3NpbmdUb2tlbkV4Y2VwdGlvbihhdCAiICsgVG9rZW4uVGV4dCArICIpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDc4YzZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL05vVmlhYmxlQWx0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA6IFJlY29nbml0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9kZWNpc2lvbk51bWJlcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3N0YXRlTnVtYmVyOworCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihzdHJpbmcgZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2dyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uID0gZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9WaWFibGVBbHRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiA9IGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5vVmlhYmxlQWx0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBzdHJpbmcgZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24sIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gPSBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihzdHJpbmcgZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24sIGludCBkZWNpc2lvbk51bWJlciwgaW50IHN0YXRlTnVtYmVyLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiBiYXNlKGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLl9ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiA9IGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOworICAgICAgICAgICAgdGhpcy5fZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKKyAgICAgICAgICAgIHRoaXMuX3N0YXRlTnVtYmVyID0gc3RhdGVOdW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9WaWFibGVBbHRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiwgaW50IGRlY2lzaW9uTnVtYmVyLCBpbnQgc3RhdGVOdW1iZXIsIElJbnRTdHJlYW0gaW5wdXQpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2dyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uID0gZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgICAgICAgICB0aGlzLl9kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyOworICAgICAgICAgICAgdGhpcy5fc3RhdGVOdW1iZXIgPSBzdGF0ZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uLCBpbnQgZGVjaXNpb25OdW1iZXIsIGludCBzdGF0ZU51bWJlciwgSUludFN0cmVhbSBpbnB1dCwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlucHV0LCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gPSBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisgICAgICAgICAgICB0aGlzLl9zdGF0ZU51bWJlciA9IHN0YXRlTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE5vVmlhYmxlQWx0RXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgdGhpcy5fZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gPSBpbmZvLkdldFN0cmluZygiR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIHRoaXMuX2RlY2lzaW9uTnVtYmVyID0gaW5mby5HZXRJbnQzMigiRGVjaXNpb25OdW1iZXIiKTsKKyAgICAgICAgICAgIHRoaXMuX3N0YXRlTnVtYmVyID0gaW5mby5HZXRJbnQzMigiU3RhdGVOdW1iZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgRGVjaXNpb25OdW1iZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNpc2lvbk51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgU3RhdGVOdW1iZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdGF0ZU51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE9iamVjdERhdGEoU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImluZm8iKTsKKworICAgICAgICAgICAgYmFzZS5HZXRPYmplY3REYXRhKGluZm8sIGNvbnRleHQpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24iLCBfZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24pOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiRGVjaXNpb25OdW1iZXIiLCBfZGVjaXNpb25OdW1iZXIpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiU3RhdGVOdW1iZXIiLCBfc3RhdGVOdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggSW5wdXQgaXMgSUNoYXJTdHJlYW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiTm9WaWFibGVBbHRFeGNlcHRpb24oJyIgKyAoY2hhcilVbmV4cGVjdGVkVHlwZSArICInQFsiICsgR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gKyAiXSkiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiTm9WaWFibGVBbHRFeGNlcHRpb24oIiArIFVuZXhwZWN0ZWRUeXBlICsgIkBbIiArIEdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uICsgIl0pIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9QYXJzZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzQxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvUGFyc2VyLmNzCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgQ29uZGl0aW9uYWxBdHRyaWJ1dGUgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgcGFyc2VyIGZvciBUb2tlblN0cmVhbXMuICAicGFyc2VyIGdyYW1tYXJzIiByZXN1bHQgaW4gYSBzdWJjbGFzcworICAgICAqICBvZiB0aGlzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIFBhcnNlciA6IEJhc2VSZWNvZ25pemVyCisgICAgeworICAgICAgICBwdWJsaWMgSVRva2VuU3RyZWFtIGlucHV0OworCisgICAgICAgIHB1YmxpYyBQYXJzZXIoIElUb2tlblN0cmVhbSBpbnB1dCApCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvL3N1cGVyKCk7IC8vIGhpZ2hsaWdodCB0aGF0IHdlIGdvIHRvIHN1cGVyIHRvIHNldCBzdGF0ZSBvYmplY3QKKyAgICAgICAgICAgIFRva2VuU3RyZWFtID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyc2VyKCBJVG9rZW5TdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSApCisgICAgICAgICAgICA6IGJhc2Uoc3RhdGUpIC8vIHNoYXJlIHRoZSBzdGF0ZSBvYmplY3Qgd2l0aCBhbm90aGVyIHBhcnNlcgorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuUmVzZXQoKTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAoIGlucHV0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0LlNlZWsoIDAgKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBHZXRDdXJyZW50SW5wdXRTeW1ib2woIElJbnRTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCAoSVRva2VuU3RyZWFtKWlucHV0ICkuTFQoIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgR2V0TWlzc2luZ1N5bWJvbCggSUludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRUb2tlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgZm9sbG93ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHRva2VuVGV4dCA9IG51bGw7CisgICAgICAgICAgICBpZiAoIGV4cGVjdGVkVG9rZW5UeXBlID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgICAgICB0b2tlblRleHQgPSAiPG1pc3NpbmcgRU9GPiI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5UZXh0ID0gIjxtaXNzaW5nICIgKyBUb2tlbk5hbWVzW2V4cGVjdGVkVG9rZW5UeXBlXSArICI+IjsKKyAgICAgICAgICAgIENvbW1vblRva2VuIHQgPSBuZXcgQ29tbW9uVG9rZW4oIGV4cGVjdGVkVG9rZW5UeXBlLCB0b2tlblRleHQgKTsKKyAgICAgICAgICAgIElUb2tlbiBjdXJyZW50ID0gKCAoSVRva2VuU3RyZWFtKWlucHV0ICkuTFQoIDEgKTsKKyAgICAgICAgICAgIGlmICggY3VycmVudC5UeXBlID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gKCAoSVRva2VuU3RyZWFtKWlucHV0ICkuTFQoIC0xICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0LkxpbmUgPSBjdXJyZW50LkxpbmU7CisgICAgICAgICAgICB0LkNoYXJQb3NpdGlvbkluTGluZSA9IGN1cnJlbnQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgdC5DaGFubmVsID0gRGVmYXVsdFRva2VuQ2hhbm5lbDsKKyAgICAgICAgICAgIHQuSW5wdXRTdHJlYW0gPSBjdXJyZW50LklucHV0U3RyZWFtOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+R2V0cyBvciBzZXRzIHRoZSB0b2tlbiBzdHJlYW07IHJlc2V0cyB0aGUgcGFyc2VyIHVwb24gYSBzZXQuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW5TdHJlYW0gVG9rZW5TdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsOworICAgICAgICAgICAgICAgIFJlc2V0KCk7CisgICAgICAgICAgICAgICAgaW5wdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFjZUluKCBzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLlRyYWNlSW4oIHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0LkxUKCAxICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUcmFjZU91dCggc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5UcmFjZU91dCggcnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoIDEgKSApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9QYXJzZXJSdWxlUmV0dXJuU2NvcGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9QYXJzZXJSdWxlUmV0dXJuU2NvcGUuY3MKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIENMU0NvbXBsaWFudCA9IFN5c3RlbS5DTFNDb21wbGlhbnRBdHRyaWJ1dGU7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIFJ1bGVzIHRoYXQgcmV0dXJuIG1vcmUgdGhhbiBhIHNpbmdsZSB2YWx1ZSBtdXN0IHJldHVybiBhbiBvYmplY3QKKyAgICAgKiAgY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcy4gIEJlc2lkZXMgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbgorICAgICAqICBSdWxlTGFiZWxTY29wZS5wcmVkZWZpbmVkUnVsZVByb3BlcnRpZXNTY29wZSB0aGVyZSBtYXkgYmUgdXNlci1kZWZpbmVkCisgICAgICogIHJldHVybiB2YWx1ZXMuICBUaGlzIGNsYXNzIHNpbXBseSBkZWZpbmVzIHRoZSBtaW5pbXVtIHByb3BlcnRpZXMgdGhhdAorICAgICAqICBhcmUgYWx3YXlzIGRlZmluZWQgYW5kIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBvdGhlcnMgdGhhdCBtaWdodCBiZQorICAgICAqICBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIG91dHB1dCBvcHRpb24gc3VjaCBhcyB0ZW1wbGF0ZSBhbmQgdHJlZS4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPgorICAgICAqICBOb3RlIHRleHQgaXMgbm90IGFuIGFjdHVhbCBwcm9wZXJ0eSBvZiB0aGUgcmV0dXJuIHZhbHVlLCBpdCBpcyBjb21wdXRlZAorICAgICAqICBmcm9tIHN0YXJ0IGFuZCBzdG9wIHVzaW5nIHRoZSBpbnB1dCBzdHJlYW0ncyB0b1N0cmluZygpIG1ldGhvZC4gIEkKKyAgICAgKiAgY291bGQgYWRkIGEgY3RvciB0byB0aGlzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaW4gYW5kIHN0b3JlIHRoZSBpbnB1dAorICAgICAqICBzdHJlYW0sIGJ1dCBJJ20gbm90IHN1cmUgd2Ugd2FudCB0byBkbyB0aGF0LiAgSXQgd291bGQgc2VlbSB0byBiZSB1bmRlZmluZWQKKyAgICAgKiAgdG8gZ2V0IHRoZSAudGV4dCBwcm9wZXJ0eSBhbnl3YXkgaWYgdGhlIHJ1bGUgbWF0Y2hlcyB0b2tlbnMgZnJvbSBtdWx0aXBsZQorICAgICAqICBpbnB1dCBzdHJlYW1zLgorICAgICAqCisgICAgICogIEkgZG8gbm90IHVzZSBnZXR0ZXJzIGZvciBmaWVsZHMgb2Ygb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHNpbXBseSB0bworICAgICAqICBncm91cCB2YWx1ZXMgc3VjaCBhcyB0aGlzIGFnZ3JlZ2F0ZS4gIFRoZSBnZXR0ZXJzL3NldHRlcnMgYXJlIHRoZXJlIHRvCisgICAgICogIHNhdGlzZnkgdGhlIHN1cGVyY2xhc3MgaW50ZXJmYWNlLgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIFBhcnNlclJ1bGVSZXR1cm5TY29wZTxUVG9rZW4+IDogSVJ1bGVSZXR1cm5TY29wZTxUVG9rZW4+CisgICAgeworICAgICAgICBwcml2YXRlIFRUb2tlbiBfc3RhcnQ7CisgICAgICAgIHByaXZhdGUgVFRva2VuIF9zdG9wOworCisgICAgICAgIHB1YmxpYyBUVG9rZW4gU3RhcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdGFydDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0YXJ0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRva2VuIFN0b3AKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RvcCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2JqZWN0IElSdWxlUmV0dXJuU2NvcGUuU3RhcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2JqZWN0IElSdWxlUmV0dXJuU2NvcGUuU3RvcAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDg5ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNzIgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eTsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoICJBbnRscjMuUnVudGltZSIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbiggIiIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCAiIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoICJQaXhlbCBNaW5lLCBJbmMuIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoICJBbnRscjMuUnVudGltZSIgKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSBTYW0gSGFyd2VsbCAyMDExIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCAiIiApXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoICIiICldCitbYXNzZW1ibHk6IENMU0NvbXBsaWFudCggdHJ1ZSApXQorW2Fzc2VtYmx5OiBBbGxvd1BhcnRpYWxseVRydXN0ZWRDYWxsZXJzXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUgCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tIAorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKCBmYWxzZSApXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCggIjdhMGI0ZGI3LWYxMjctNGNmNS1hYzJjLWUyOTQ5NTdlZmNkNiIgKV0KKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgZm91ciB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqCisgKiAgIE1ham9yLk1pbm9yLkJ1aWxkLlJldmlzaW9uCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1cGRhdGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nOgorICogICAxLiBNYWpvci5NaW5vciBmb2xsb3dzIHRoZSBBTlRMUiByZWxlYXNlIHNjaGVkdWxlCisgKiAgIDIuIEJ1aWxkIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgQyMgcG9ydCBpcyBwYWNrYWdlZCBmb3IgcmVsZWFzZSAocmVnYXJkbGVzcworICogICAgICBvZiB3aGV0aGVyIGl0J3MgYW4gaW5jcmVtZW50YWwgb3IgbmlnaHRseSkuIFRoZSB2YWx1ZSByZXNldHMgdG8gemVybyB3aGVuZXZlcgorICogICAgICB0aGUgTWFqb3Igb3IgTWlub3IgdmVyc2lvbiBpcyBpbmNyZW1lbnRlZC4KKyAqICAgMy4gUmV2aXNpb24gaXMgdGhlIFBlcmZvcmNlIGNoYW5nZWxpc3QgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzZS4KKyAqLworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjMuMy40Ljg1MTciKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMy4zLjQuODUxNyIpXQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzU2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uY3MKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLlRyZWU7CisKKyAgICB1c2luZyBBcmd1bWVudEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbjsKKyAgICB1c2luZyBBcmd1bWVudE51bGxFeGNlcHRpb24gPSBTeXN0ZW0uQXJndW1lbnROdWxsRXhjZXB0aW9uOworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+VGhlIHJvb3Qgb2YgdGhlIEFOVExSIGV4Y2VwdGlvbiBoaWVyYXJjaHkuPC9zdW1tYXJ5PgorICAgICAqCisgICAgICogIDxyZW1hcmtzPgorICAgICAqICBUbyBhdm9pZCBFbmdsaXNoLW9ubHkgZXJyb3IgbWVzc2FnZXMgYW5kIHRvIGdlbmVyYWxseSBtYWtlIHRoaW5ncworICAgICAqICBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZSwgdGhlc2UgZXhjZXB0aW9ucyBhcmUgbm90IGNyZWF0ZWQgd2l0aCBzdHJpbmdzLAorICAgICAqICBidXQgcmF0aGVyIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgYW4gZXJyb3IuICBUaGVuCisgICAgICogIHRoZSB2YXJpb3VzIHJlcG9ydGluZyBtZXRob2RzIGluIFBhcnNlciBhbmQgTGV4ZXIgY2FuIGJlIG92ZXJyaWRkZW4KKyAgICAgKiAgdG8gZ2VuZXJhdGUgYSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZS4gIEZvciBleGFtcGxlLCBNaXNtYXRjaGVkVG9rZW4KKyAgICAgKiAgZXhjZXB0aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgZXhwZWN0ZWQgdG9rZW4gdHlwZS4KKyAgICAgKiAgU28sIGRvbid0IGV4cGVjdCBnZXRNZXNzYWdlKCkgdG8gcmV0dXJuIGFueXRoaW5nLgorICAgICAqCisgICAgICogIE5vdGUgdGhhdCBhcyBvZiBKYXZhIDEuNCwgeW91IGNhbiBhY2Nlc3MgdGhlIHN0YWNrIHRyYWNlLCB3aGljaCBtZWFucworICAgICAqICB0aGF0IHlvdSBjYW4gY29tcHV0ZSB0aGUgY29tcGxldGUgdHJhY2Ugb2YgcnVsZXMgZnJvbSB0aGUgc3RhcnQgc3ltYm9sLgorICAgICAqICBUaGlzIGdpdmVzIHlvdSBjb25zaWRlcmFibGUgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIHRvIGdlbmVyYXRlCisgICAgICogIHVzZWZ1bCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqICBBTlRMUiBnZW5lcmF0ZXMgY29kZSB0aGF0IHRocm93cyBleGNlcHRpb25zIHVwb24gcmVjb2duaXRpb24gZXJyb3IgYW5kCisgICAgICogIGFsc28gZ2VuZXJhdGVzIGNvZGUgdG8gY2F0Y2ggdGhlc2UgZXhjZXB0aW9ucyBpbiBlYWNoIHJ1bGUuICBJZiB5b3UKKyAgICAgKiAgd2FudCB0byBxdWl0IHVwb24gZmlyc3QgZXJyb3IsIHlvdSBjYW4gdHVybiBvZmYgdGhlIGF1dG9tYXRpYyBlcnJvcgorICAgICAqICBoYW5kbGluZyBtZWNoYW5pc20gdXNpbmcgcnVsZWNhdGNoIGFjdGlvbiwgYnV0IHlvdSBzdGlsbCBuZWVkIHRvCisgICAgICogIG92ZXJyaWRlIG1ldGhvZHMgbWlzbWF0Y2ggYW5kIHJlY292ZXJGcm9tTWlzbWF0Y2hTZXQuCisgICAgICoKKyAgICAgKiAgSW4gZ2VuZXJhbCwgdGhlIHJlY29nbml0aW9uIGV4Y2VwdGlvbnMgY2FuIHRyYWNrIHdoZXJlIGluIGEgZ3JhbW1hciBhCisgICAgICogIHByb2JsZW0gb2NjdXJyZWQgYW5kL29yIHdoYXQgd2FzIHRoZSBleHBlY3RlZCBpbnB1dC4gIFdoaWxlIHRoZSBwYXJzZXIKKyAgICAgKiAga25vd3MgaXRzIHN0YXRlIChzdWNoIGFzIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFuZCBsaW5lIGluZm8pIHRoYXQKKyAgICAgKiAgc3RhdGUgY2FuIGNoYW5nZSBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBzbyBjdXJyZW50IHRva2VuIGluZGV4CisgICAgICogIGlzIGNvbXB1dGVkIGFuZCBzdG9yZWQgYXQgZXhjZXB0aW9uIHRpbWUuICBGcm9tIHRoaXMgaW5mbywgeW91IGNhbgorICAgICAqICBwZXJoYXBzIHByaW50IGFuIGVudGlyZSBsaW5lIG9mIGlucHV0IG5vdCBqdXN0IGEgc2luZ2xlIHRva2VuLCBmb3IgZXhhbXBsZS4KKyAgICAgKiAgQmV0dGVyIHRvIGp1c3Qgc2F5IHRoZSByZWNvZ25pemVyIGhhZCBhIHByb2JsZW0gYW5kIHRoZW4gbGV0IHRoZSBwYXJzZXIKKyAgICAgKiAgZmlndXJlIG91dCBhIGZhbmN5IHJlcG9ydC4KKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldoYXQgaW5wdXQgc3RyZWFtIGRpZCB0aGUgZXJyb3Igb2NjdXIgaW4/PC9zdW1tYXJ5PiAqLworICAgICAgICBwcml2YXRlIElJbnRTdHJlYW0gX2lucHV0OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGlzIGluZGV4IG9mIHRva2VuL2NoYXIgd2VyZSB3ZSBsb29raW5nIGF0IHdoZW4gdGhlIGVycm9yIG9jY3VycmVkPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2luZGV4OworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRoZSBjdXJyZW50IFRva2VuIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQuICBTaW5jZSBub3QgYWxsIHN0cmVhbXMKKyAgICAgICAgICogIGNhbiByZXRyaWV2ZSB0aGUgaXRoIFRva2VuLCB3ZSBoYXZlIHRvIHRyYWNrIHRoZSBUb2tlbiBvYmplY3QuCisgICAgICAgICAqICBGb3IgcGFyc2Vycy4gIEV2ZW4gd2hlbiBpdCdzIGEgdHJlZSBwYXJzZXIsIHRva2VuIG1pZ2h0IGJlIHNldC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgSVRva2VuIF90b2tlbjsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiB0aGlzIGlzIGEgdHJlZSBwYXJzZXIgZXhjZXB0aW9uLCBub2RlIGlzIHNldCB0byB0aGUgbm9kZSB3aXRoCisgICAgICAgICAqICB0aGUgcHJvYmxlbS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgb2JqZWN0IF9ub2RlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgY3VycmVudCBjaGFyIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQuIEZvciBsZXhlcnMuPC9zdW1tYXJ5PiAqLworICAgICAgICBwcml2YXRlIGludCBfYzsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUcmFjayB0aGUgbGluZSAoMS1iYXNlZCkgYXQgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkIGluIGNhc2UgdGhpcyBpcworICAgICAgICAgKiAgZ2VuZXJhdGVkIGZyb20gYSBsZXhlci4gIFdlIG5lZWQgdG8gdHJhY2sgdGhpcyBzaW5jZSB0aGUKKyAgICAgICAgICogIHVuZXhwZWN0ZWQgY2hhciBkb2Vzbid0IGNhcnJ5IHRoZSBsaW5lIGluZm8uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBfbGluZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgMC1iYXNlZCBpbmRleCBpbnRvIHRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2NoYXJQb3NpdGlvbkluTGluZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiB5b3UgYXJlIHBhcnNpbmcgYSB0cmVlIG5vZGUgc3RyZWFtLCB5b3Ugd2lsbCBlbmNvdW50ZXIgc29tCisgICAgICAgICAqICBpbWFnaW5hcnkgbm9kZXMgdy9vIGxpbmUvY29sIGluZm8uICBXZSBub3cgc2VhcmNoIGJhY2t3YXJkcyBsb29raW5nCisgICAgICAgICAqICBmb3IgbW9zdCByZWNlbnQgdG9rZW4gd2l0aCBsaW5lL2NvbCBpbmZvLCBidXQgbm90aWZ5IGdldEVycm9ySGVhZGVyKCkKKyAgICAgICAgICogIHRoYXQgaW5mbyBpcyBhcHByb3hpbWF0ZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbCBfYXBwcm94aW1hdGVMaW5lSW5mbzsKKworICAgICAgICAvKiogPHN1bW1hcnk+VXNlZCBmb3IgcmVtb3RlIGRlYnVnZ2VyIGRlc2VyaWFsaXphdGlvbjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFJlY29nbml0aW9uRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIDogdGhpcygiQSByZWNvZ25pdGlvbiBlcnJvciBvY2N1cnJlZC4iLCBudWxsLCBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24oIElJbnRTdHJlYW0gaW5wdXQgKQorICAgICAgICAgICAgOiB0aGlzKCJBIHJlY29nbml0aW9uIGVycm9yIG9jY3VycmVkLiIsIGlucHV0LCBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IHRoaXMobWVzc2FnZSwgbnVsbCwgbnVsbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlY29nbml0aW9uRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBJSW50U3RyZWFtIGlucHV0KQorICAgICAgICAgICAgOiB0aGlzKG1lc3NhZ2UsIGlucHV0LCBudWxsKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogdGhpcyhtZXNzYWdlLCBudWxsLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlY29nbml0aW9uRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBJSW50U3RyZWFtIGlucHV0LCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7CisgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IGlucHV0LkluZGV4OworICAgICAgICAgICAgICAgIGlmIChpbnB1dCBpcyBJVG9rZW5TdHJlYW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9ICgoSVRva2VuU3RyZWFtKWlucHV0KS5MVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9IF90b2tlbi5MaW5lOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFyUG9zaXRpb25JbkxpbmUgPSBfdG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIElUcmVlTm9kZVN0cmVhbSB0bnMgPSBpbnB1dCBhcyBJVHJlZU5vZGVTdHJlYW07CisgICAgICAgICAgICAgICAgaWYgKHRucyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEluZm9ybWF0aW9uRnJvbVRyZWVOb2RlU3RyZWFtKHRucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElDaGFyU3RyZWFtIGNoYXJTdHJlYW0gPSBpbnB1dCBhcyBJQ2hhclN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYyA9IGlucHV0LkxBKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9ICgoSUNoYXJTdHJlYW0paW5wdXQpLkxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFyUG9zaXRpb25JbkxpbmUgPSAoKElDaGFyU3RyZWFtKWlucHV0KS5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jID0gaW5wdXQuTEEoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUmVjb2duaXRpb25FeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICBfaW5kZXggPSBpbmZvLkdldEludDMyKCJJbmRleCIpOworICAgICAgICAgICAgX2MgPSBpbmZvLkdldEludDMyKCJDIik7CisgICAgICAgICAgICBfbGluZSA9IGluZm8uR2V0SW50MzIoIkxpbmUiKTsKKyAgICAgICAgICAgIF9jaGFyUG9zaXRpb25JbkxpbmUgPSBpbmZvLkdldEludDMyKCJDaGFyUG9zaXRpb25JbkxpbmUiKTsKKyAgICAgICAgICAgIF9hcHByb3hpbWF0ZUxpbmVJbmZvID0gaW5mby5HZXRCb29sZWFuKCJBcHByb3hpbWF0ZUxpbmVJbmZvIik7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+UmV0dXJuIHRoZSB0b2tlbiB0eXBlIG9yIGNoYXIgb2YgdGhlIHVuZXhwZWN0ZWQgaW5wdXQgZWxlbWVudDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFVuZXhwZWN0ZWRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggX2lucHV0IGlzIElUb2tlblN0cmVhbSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2VuLlR5cGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSVRyZWVOb2RlU3RyZWFtIHRyZWVOb2RlU3RyZWFtID0gX2lucHV0IGFzIElUcmVlTm9kZVN0cmVhbTsKKyAgICAgICAgICAgICAgICBpZiAoIHRyZWVOb2RlU3RyZWFtICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSB0cmVlTm9kZVN0cmVhbS5UcmVlQWRhcHRvcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuR2V0VHlwZSggX25vZGUgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBBcHByb3hpbWF0ZUxpbmVJbmZvCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfYXBwcm94aW1hdGVMaW5lSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYXBwcm94aW1hdGVMaW5lSW5mbyA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElJbnRTdHJlYW0gSW5wdXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pbnB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVG9rZW4gVG9rZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90b2tlbiA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBOb2RlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3RlY3RlZCBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbm9kZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBDaGFyYWN0ZXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvdGVjdGVkIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm90ZWN0ZWQgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2luZGV4ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IExpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2xpbmUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgQ2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoYXJQb3NpdGlvbkluTGluZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgR2V0T2JqZWN0RGF0YShTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiaW5mbyIpOworCisgICAgICAgICAgICBiYXNlLkdldE9iamVjdERhdGEoaW5mbywgY29udGV4dCk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJJbmRleCIsIF9pbmRleCk7CisgICAgICAgICAgICBpbmZvLkFkZFZhbHVlKCJDIiwgX2MpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiTGluZSIsIF9saW5lKTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkNoYXJQb3NpdGlvbkluTGluZSIsIF9jaGFyUG9zaXRpb25JbkxpbmUpOworICAgICAgICAgICAgaW5mby5BZGRWYWx1ZSgiQXBwcm94aW1hdGVMaW5lSW5mbyIsIF9hcHByb3hpbWF0ZUxpbmVJbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRXh0cmFjdEluZm9ybWF0aW9uRnJvbVRyZWVOb2RlU3RyZWFtKElUcmVlTm9kZVN0cmVhbSBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fbm9kZSA9IGlucHV0LkxUKDEpOworICAgICAgICAgICAgSVRva2VuU3RyZWFtSW5mb3JtYXRpb24gc3RyZWFtSW5mb3JtYXRpb24gPSBpbnB1dCBhcyBJVG9rZW5TdHJlYW1JbmZvcm1hdGlvbjsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JbmZvcm1hdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUb2tlbiBsYXN0VG9rZW4gPSBzdHJlYW1JbmZvcm1hdGlvbi5MYXN0VG9rZW47CisgICAgICAgICAgICAgICAgSVRva2VuIGxhc3RSZWFsVG9rZW4gPSBzdHJlYW1JbmZvcm1hdGlvbi5MYXN0UmVhbFRva2VuOworICAgICAgICAgICAgICAgIGlmIChsYXN0UmVhbFRva2VuICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IGxhc3RSZWFsVG9rZW47CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpbmUgPSBsYXN0UmVhbFRva2VuLkxpbmU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9IGxhc3RSZWFsVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHByb3hpbWF0ZUxpbmVJbmZvID0gbGFzdFJlYWxUb2tlbi5FcXVhbHMobGFzdFRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBpbnB1dC5UcmVlQWRhcHRvcjsKKyAgICAgICAgICAgICAgICBJVG9rZW4gcGF5bG9hZCA9IGFkYXB0b3IuR2V0VG9rZW4oX25vZGUpOworICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IHBheWxvYWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLkxpbmUgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2luYXJ5IG5vZGU7IG5vIGxpbmUvcG9zIGluZm87IHNjYW4gYmFja3dhcmRzCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHByaW9yTm9kZSA9IGlucHV0LkxUKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHByaW9yTm9kZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUb2tlbiBwcmlvclBheWxvYWQgPSBhZGFwdG9yLkdldFRva2VuKHByaW9yTm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW9yUGF5bG9hZCAhPSBudWxsICYmIHByaW9yUGF5bG9hZC5MaW5lID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIHRoZSBtb3N0IHJlY2VudCByZWFsIGxpbmUgLyBwb3MgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9saW5lID0gcHJpb3JQYXlsb2FkLkxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9IHByaW9yUGF5bG9hZC5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcHJveGltYXRlTGluZUluZm8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JOb2RlID0gaW5wdXQuTFQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yTm9kZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBjcmVhdGVkIGZyb20gcmVhbCB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZSA9IHBheWxvYWQuTGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJQb3NpdGlvbkluTGluZSA9IHBheWxvYWQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX25vZGUgaXMgVHJlZS5JVHJlZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpbmUgPSAoKFRyZWUuSVRyZWUpdGhpcy5fbm9kZSkuTGluZTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhclBvc2l0aW9uSW5MaW5lID0gKChUcmVlLklUcmVlKXRoaXMuX25vZGUpLkNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX25vZGUgaXMgQ29tbW9uVHJlZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSAoKENvbW1vblRyZWUpdGhpcy5fbm9kZSkuVG9rZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLkdldFR5cGUodGhpcy5fbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KHRoaXMuX25vZGUpOworICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBDb21tb25Ub2tlbih0eXBlLCB0ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjdjNmNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5jcwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIENMU0NvbXBsaWFudCA9IFN5c3RlbS5DTFNDb21wbGlhbnRBdHRyaWJ1dGU7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhlIHNldCBvZiBmaWVsZHMgbmVlZGVkIGJ5IGFuIGFic3RyYWN0IHJlY29nbml6ZXIgdG8gcmVjb2duaXplIGlucHV0CisgICAgICogIGFuZCByZWNvdmVyIGZyb20gZXJyb3JzIGV0Yy4uLiAgQXMgYSBzZXBhcmF0ZSBzdGF0ZSBvYmplY3QsIGl0IGNhbiBiZQorICAgICAqICBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgZ3JhbW1hcnM7IGUuZy4sIHdoZW4gb25lIGdyYW1tYXIgaW1wb3J0cyBhbm90aGVyLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIFRoZXNlIGZpZWxkcyBhcmUgcHVibGljYWxseSB2aXNpYmxlIGJ1dCB0aGUgYWN0dWFsIHN0YXRlIHBvaW50ZXIgcGVyCisgICAgICogIHBhcnNlciBpcyBwcm90ZWN0ZWQuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgUmVjb2duaXplclNoYXJlZFN0YXRlCisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUcmFjayB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhbnkgcnVsZSBpbnZvY2F0aW9uLgorICAgICAgICAgKiAgU3RhY2sgZ3Jvd3MgdXB3YXJkcy4gIFdoZW4gaXQgaGl0cyB0aGUgbWF4LCBpdCBncm93cyAyeCBpbiBzaXplCisgICAgICAgICAqICBhbmQga2VlcHMgZ29pbmcuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICAvL3B1YmxpYyBMaXN0PEJpdFNldD4gZm9sbG93aW5nOworICAgICAgICBwdWJsaWMgQml0U2V0W10gZm9sbG93aW5nOworICAgICAgICBbQ0xTQ29tcGxpYW50KCBmYWxzZSApXQorICAgICAgICBwdWJsaWMgaW50IF9mc3A7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGhpcyBpcyB0cnVlIHdoZW4gd2Ugc2VlIGFuIGVycm9yIGFuZCBiZWZvcmUgaGF2aW5nIHN1Y2Nlc3NmdWxseQorICAgICAgICAgKiAgbWF0Y2hlZCBhIHRva2VuLiAgUHJldmVudHMgZ2VuZXJhdGlvbiBvZiBtb3JlIHRoYW4gb25lIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICogIHBlciBlcnJvci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sIGVycm9yUmVjb3Zlcnk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGhlIGluZGV4IGludG8gdGhlIGlucHV0IHN0cmVhbSB3aGVyZSB0aGUgbGFzdCBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICogCVRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZXJlIGFuIGVycm9yIGlzIGZvdW5kCisgICAgICAgICAqICBidXQgbm8gdG9rZW4gaXMgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5Li4uYW5vdGhlciBlcnJvciBpcyBmb3VuZCwKKyAgICAgICAgICogIGFkIG5hc2V1bS4gIFRoaXMgaXMgYSBmYWlsc2FmZSBtZWNoYW5pc20gdG8gZ3VhcmFudGVlIHRoYXQgYXQgbGVhc3QKKyAgICAgICAgICogIG9uZSB0b2tlbi90cmVlIG5vZGUgaXMgY29uc3VtZWQgZm9yIHR3byBlcnJvcnMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGxhc3RFcnJvckluZGV4OworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEluIGxpZXUgb2YgYSByZXR1cm4gdmFsdWUsIHRoaXMgaW5kaWNhdGVzIHRoYXQgYSBydWxlIG9yIHRva2VuCisgICAgICAgICAqICBoYXMgZmFpbGVkIHRvIG1hdGNoLiAgUmVzZXQgdG8gZmFsc2UgdXBvbiB2YWxpZCB0b2tlbiBtYXRjaC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sIGZhaWxlZDsKKworICAgICAgICAvKiogPHN1bW1hcnk+RGlkIHRoZSByZWNvZ25pemVyIGVuY291bnRlciBhIHN5bnRheCBlcnJvcj8gIFRyYWNrIGhvdyBtYW55Ljwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCBzeW50YXhFcnJvcnM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgMCwgbm8gYmFja3RyYWNraW5nIGlzIGdvaW5nIG9uLiAgU2FmZSB0byBleGVjIGFjdGlvbnMgZXRjLi4uCisgICAgICAgICAqICBJZiA+MCB0aGVuIGl0J3MgdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgYmFja3RyYWNraW5nOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFuIGFycmF5W3NpemUgbnVtIHJ1bGVzXSBvZiBNYXA8SW50ZWdlcixJbnRlZ2VyPiB0aGF0IHRyYWNrcworICAgICAgICAgKiAgdGhlIHN0b3AgdG9rZW4gaW5kZXggZm9yIGVhY2ggcnVsZS4gIHJ1bGVNZW1vW3J1bGVJbmRleF0gaXMKKyAgICAgICAgICogIHRoZSBtZW1vaXphdGlvbiB0YWJsZSBmb3IgcnVsZUluZGV4LiAgRm9yIGtleSBydWxlU3RhcnRJbmRleCwgeW91CisgICAgICAgICAqICBnZXQgYmFjayB0aGUgc3RvcCB0b2tlbiBmb3IgYXNzb2NpYXRlZCBydWxlIG9yIE1FTU9fUlVMRV9GQUlMRUQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz5UaGlzIGlzIG9ubHkgdXNlZCBpZiBydWxlIG1lbW9pemF0aW9uIGlzIG9uICh3aGljaCBpdCBpcyBieSBkZWZhdWx0KS48L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8aW50LCBpbnQ+W10gcnVsZU1lbW87CisKKworICAgICAgICAvLyBMRVhFUiBGSUVMRFMgKG11c3QgYmUgaW4gc2FtZSBzdGF0ZSBvYmplY3QgdG8gYXZvaWQgY2FzdGluZworICAgICAgICAvLyAgICAgICAgICAgICAgIGNvbnN0YW50bHkgaW4gZ2VuZXJhdGVkIGNvZGUgYW5kIExleGVyIG9iamVjdCkgOigKKworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRoZSBnb2FsIG9mIGFsbCBsZXhlciBydWxlcy9tZXRob2RzIGlzIHRvIGNyZWF0ZSBhIHRva2VuIG9iamVjdC4KKyAgICAgICAgICogIFRoaXMgaXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYXMgbXVsdGlwbGUgcnVsZXMgbWF5IGNvbGxhYm9yYXRlIHRvCisgICAgICAgICAqICBjcmVhdGUgYSBzaW5nbGUgdG9rZW4uICBuZXh0VG9rZW4gd2lsbCByZXR1cm4gdGhpcyBvYmplY3QgYWZ0ZXIKKyAgICAgICAgICogIG1hdGNoaW5nIGxleGVyIHJ1bGUocykuICBJZiB5b3Ugc3ViY2xhc3MgdG8gYWxsb3cgbXVsdGlwbGUgdG9rZW4KKyAgICAgICAgICogIGVtaXNzaW9ucywgdGhlbiBzZXQgdGhpcyB0byB0aGUgbGFzdCB0b2tlbiB0byBiZSBtYXRjaGVkIG9yCisgICAgICAgICAqICBzb21ldGhpbmcgbm9ubnVsbCBzbyB0aGF0IHRoZSBhdXRvIHRva2VuIGVtaXQgbWVjaGFuaXNtIHdpbGwgbm90CisgICAgICAgICAqICBlbWl0IGFub3RoZXIgdG9rZW4uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSVRva2VuIHRva2VuOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoYXQgY2hhcmFjdGVyIGluZGV4IGluIHRoZSBzdHJlYW0gZGlkIHRoZSBjdXJyZW50IHRva2VuIHN0YXJ0IGF0PworICAgICAgICAgKiAgTmVlZGVkLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSB0ZXh0IGZvciBjdXJyZW50IHRva2VuLiAgU2V0IGF0CisgICAgICAgICAqICB0aGUgc3RhcnQgb2YgbmV4dFRva2VuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCB0b2tlblN0YXJ0Q2hhckluZGV4OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgbGluZSBvbiB3aGljaCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB0b2tlbiByZXNpZGVzPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgaW50IHRva2VuU3RhcnRMaW5lOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIGZpcnN0IGNoYXJhY3RlciB3aXRoaW4gdGhlIGxpbmU8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBpbnQgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGNoYW5uZWwgbnVtYmVyIGZvciB0aGUgY3VycmVudCB0b2tlbjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGludCBjaGFubmVsOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgdG9rZW4gdHlwZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBpbnQgdHlwZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBZb3UgY2FuIHNldCB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgdG9rZW4gdG8gb3ZlcnJpZGUgd2hhdCBpcyBpbgorICAgICAgICAgKiAgdGhlIGlucHV0IGNoYXIgYnVmZmVyLiAgVXNlIHNldFRleHQoKSBvciBjYW4gc2V0IHRoaXMgaW5zdGFuY2UgdmFyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0cmluZyB0ZXh0OworCisgICAgICAgIHB1YmxpYyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvL2ZvbGxvd2luZyA9IG5ldyBMaXN0PEJpdFNldD4oIEJhc2VSZWNvZ25pemVyLkluaXRpYWxGb2xsb3dTdGFja1NpemUgKTsKKyAgICAgICAgICAgIGZvbGxvd2luZyA9IG5ldyBCaXRTZXRbQmFzZVJlY29nbml6ZXIuSW5pdGlhbEZvbGxvd1N0YWNrU2l6ZV07CisgICAgICAgICAgICBfZnNwID0gLTE7CisgICAgICAgICAgICBsYXN0RXJyb3JJbmRleCA9IC0xOworICAgICAgICAgICAgdG9rZW5TdGFydENoYXJJbmRleCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSggUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigic3RhdGUiKTsKKworICAgICAgICAgICAgZm9sbG93aW5nID0gKEJpdFNldFtdKXN0YXRlLmZvbGxvd2luZy5DbG9uZSgpOworICAgICAgICAgICAgX2ZzcCA9IHN0YXRlLl9mc3A7CisgICAgICAgICAgICBlcnJvclJlY292ZXJ5ID0gc3RhdGUuZXJyb3JSZWNvdmVyeTsKKyAgICAgICAgICAgIGxhc3RFcnJvckluZGV4ID0gc3RhdGUubGFzdEVycm9ySW5kZXg7CisgICAgICAgICAgICBmYWlsZWQgPSBzdGF0ZS5mYWlsZWQ7CisgICAgICAgICAgICBzeW50YXhFcnJvcnMgPSBzdGF0ZS5zeW50YXhFcnJvcnM7CisgICAgICAgICAgICBiYWNrdHJhY2tpbmcgPSBzdGF0ZS5iYWNrdHJhY2tpbmc7CisKKyAgICAgICAgICAgIGlmICggc3RhdGUucnVsZU1lbW8gIT0gbnVsbCApCisgICAgICAgICAgICAgICAgcnVsZU1lbW8gPSAoSURpY3Rpb25hcnk8aW50LCBpbnQ+W10pc3RhdGUucnVsZU1lbW8uQ2xvbmUoKTsKKworICAgICAgICAgICAgdG9rZW4gPSBzdGF0ZS50b2tlbjsKKyAgICAgICAgICAgIHRva2VuU3RhcnRDaGFySW5kZXggPSBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4OworICAgICAgICAgICAgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICBjaGFubmVsID0gc3RhdGUuY2hhbm5lbDsKKyAgICAgICAgICAgIHR5cGUgPSBzdGF0ZS50eXBlOworICAgICAgICAgICAgdGV4dCA9IHN0YXRlLnRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RlbXBsYXRlUGFyc2VyUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UZW1wbGF0ZVBhcnNlclJ1bGVSZXR1cm5TY29wZVwxNDAyLmNzIgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTNjMTg1Ci0tLSAvZGV2L251bGwKKysrICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UZW1wbGF0ZVBhcnNlclJ1bGVSZXR1cm5TY29wZVwxNDAyLmNzIgpAQCAtMCwwICsxLDYwIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVtcGxhdGVQYXJzZXJSdWxlUmV0dXJuU2NvcGU8VFRlbXBsYXRlLCBUVG9rZW4+IDogUGFyc2VyUnVsZVJldHVyblNjb3BlPFRUb2tlbj4sIElUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZTxUVGVtcGxhdGU+LCBJVGVtcGxhdGVSdWxlUmV0dXJuU2NvcGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFRlbXBsYXRlIF90ZW1wbGF0ZTsKKworICAgICAgICBwdWJsaWMgVFRlbXBsYXRlIFRlbXBsYXRlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfdGVtcGxhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90ZW1wbGF0ZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2JqZWN0IElUZW1wbGF0ZVJ1bGVSZXR1cm5TY29wZS5UZW1wbGF0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVG9rZW5DaGFubmVscy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ub2tlbkNoYW5uZWxzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWEyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVG9rZW5DaGFubmVscy5jcwpAQCAtMCwwICsxLDUyIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuQ2hhbm5lbHMKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFsbCB0b2tlbnMgZ28gdG8gdGhlIHBhcnNlciAodW5sZXNzIHNraXAoKSBpcyBjYWxsZWQgaW4gdGhhdCBydWxlKQorICAgICAgICAgKiAgb24gYSBwYXJ0aWN1bGFyICJjaGFubmVsIi4gIFRoZSBwYXJzZXIgdHVuZXMgdG8gYSBwYXJ0aWN1bGFyIGNoYW5uZWwKKyAgICAgICAgICogIHNvIHRoYXQgd2hpdGVzcGFjZSBldGMuLi4gY2FuIGdvIHRvIHRoZSBwYXJzZXIgb24gYSAiaGlkZGVuIiBjaGFubmVsLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEZWZhdWx0ID0gMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBbnl0aGluZyBvbiBkaWZmZXJlbnQgY2hhbm5lbCB0aGFuIERFRkFVTFRfQ0hBTk5FTCBpcyBub3QgcGFyc2VkCisgICAgICAgICAqICBieSBwYXJzZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEhpZGRlbiA9IDk5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVG9rZW5SZXdyaXRlU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWI0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVG9rZW5SZXdyaXRlU3RyZWFtLmNzCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBBcmd1bWVudEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudEV4Y2VwdGlvbjsKKyAgICB1c2luZyBDb25zb2xlID0gU3lzdGVtLkNvbnNvbGU7CisgICAgdXNpbmcgTWF0aCA9IFN5c3RlbS5NYXRoOworICAgIHVzaW5nIERlYnVnZ2VyRGlzcGxheSA9IFN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlckRpc3BsYXlBdHRyaWJ1dGU7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKyAgICB1c2luZyBUeXBlID0gU3lzdGVtLlR5cGU7CisKKyAgICAvKiogVXNlZnVsIGZvciBkdW1waW5nIG91dCB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIGRvaW5nIHNvbWUKKyAgICAgKiAgYXVnbWVudGF0aW9uIG9yIG90aGVyIG1hbmlwdWxhdGlvbnMuCisgICAgICoKKyAgICAgKiAgWW91IGNhbiBpbnNlcnQgc3R1ZmYsIHJlcGxhY2UsIGFuZCBkZWxldGUgY2h1bmtzLiAgTm90ZSB0aGF0IHRoZQorICAgICAqICBvcGVyYXRpb25zIGFyZSBkb25lIGxhemlseS0tb25seSBpZiB5b3UgY29udmVydCB0aGUgYnVmZmVyIHRvIGEKKyAgICAgKiAgU3RyaW5nLiAgVGhpcyBpcyB2ZXJ5IGVmZmljaWVudCBiZWNhdXNlIHlvdSBhcmUgbm90IG1vdmluZyBkYXRhIGFyb3VuZAorICAgICAqICBhbGwgdGhlIHRpbWUuICBBcyB0aGUgYnVmZmVyIG9mIHRva2VucyBpcyBjb252ZXJ0ZWQgdG8gc3RyaW5ncywgdGhlCisgICAgICogIHRvU3RyaW5nKCkgbWV0aG9kKHMpIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBvcGVyYXRpb24gYXQgdGhlCisgICAgICogIGN1cnJlbnQgaW5kZXguICBJZiBzbywgdGhlIG9wZXJhdGlvbiBpcyBkb25lIGFuZCB0aGVuIG5vcm1hbCBTdHJpbmcKKyAgICAgKiAgcmVuZGVyaW5nIGNvbnRpbnVlcyBvbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyBsaWtlIGhhdmluZyBtdWx0aXBsZSBUdXJpbmcKKyAgICAgKiAgbWFjaGluZSBpbnN0cnVjdGlvbiBzdHJlYW1zIChwcm9ncmFtcykgb3BlcmF0aW5nIG9uIGEgc2luZ2xlIGlucHV0IHRhcGUuIDopCisgICAgICoKKyAgICAgKiAgU2luY2UgdGhlIG9wZXJhdGlvbnMgYXJlIGRvbmUgbGF6aWx5IGF0IHRvU3RyaW5nLXRpbWUsIG9wZXJhdGlvbnMgZG8gbm90CisgICAgICogIHNjcmV3IHVwIHRoZSB0b2tlbiBpbmRleCB2YWx1ZXMuICBUaGF0IGlzLCBhbiBpbnNlcnQgb3BlcmF0aW9uIGF0IHRva2VuCisgICAgICogIGluZGV4IGkgZG9lcyBub3QgY2hhbmdlIHRoZSBpbmRleCB2YWx1ZXMgZm9yIHRva2VucyBpKzEuLm4tMS4KKyAgICAgKgorICAgICAqICBCZWNhdXNlIG9wZXJhdGlvbnMgbmV2ZXIgYWN0dWFsbHkgYWx0ZXIgdGhlIGJ1ZmZlciwgeW91IG1heSBhbHdheXMgZ2V0CisgICAgICogIHRoZSBvcmlnaW5hbCB0b2tlbiBzdHJlYW0gYmFjayB3aXRob3V0IHVuZG9pbmcgYW55dGhpbmcuICBTaW5jZQorICAgICAqICB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBxdWV1ZWQgdXAsIHlvdSBjYW4gZWFzaWx5IHNpbXVsYXRlIHRyYW5zYWN0aW9ucyBhbmQKKyAgICAgKiAgcm9sbCBiYWNrIGFueSBjaGFuZ2VzIGlmIHRoZXJlIGlzIGFuIGVycm9yIGp1c3QgYnkgcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zLgorICAgICAqICBGb3IgZXhhbXBsZSwKKyAgICAgKgorICAgICAqICAgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUkZpbGVTdHJlYW0oImlucHV0Iik7CisgICAgICogICBUTGV4ZXIgbGV4ID0gbmV3IFRMZXhlcihpbnB1dCk7CisgICAgICogICBUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXgpOworICAgICAqICAgVCBwYXJzZXIgPSBuZXcgVCh0b2tlbnMpOworICAgICAqICAgcGFyc2VyLnN0YXJ0UnVsZSgpOworICAgICAqCisgICAgICogCSBUaGVuIGluIHRoZSBydWxlcywgeW91IGNhbiBleGVjdXRlCisgICAgICogICAgICBUb2tlbiB0LHU7CisgICAgICogICAgICAuLi4KKyAgICAgKiAgICAgIGlucHV0Lmluc2VydEFmdGVyKHQsICJ0ZXh0IHRvIHB1dCBhZnRlciB0Iik7fQorICAgICAqIAkJaW5wdXQuaW5zZXJ0QWZ0ZXIodSwgInRleHQgYWZ0ZXIgdSIpO30KKyAgICAgKiAJCVN5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMudG9TdHJpbmcoKSk7CisgICAgICoKKyAgICAgKiAgQWN0dWFsbHksIHlvdSBoYXZlIHRvIGNhc3QgdGhlICdpbnB1dCcgdG8gYSBUb2tlblJld3JpdGVTdHJlYW0uIDooCisgICAgICoKKyAgICAgKiAgWW91IGNhbiBhbHNvIGhhdmUgbXVsdGlwbGUgImluc3RydWN0aW9uIHN0cmVhbXMiIGFuZCBnZXQgbXVsdGlwbGUKKyAgICAgKiAgcmV3cml0ZXMgZnJvbSBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIGlucHV0LiAgSnVzdCBuYW1lIHRoZSBpbnN0cnVjdGlvbgorICAgICAqICBzdHJlYW1zIGFuZCB1c2UgdGhhdCBuYW1lIGFnYWluIHdoZW4gcHJpbnRpbmcgdGhlIGJ1ZmZlci4gIFRoaXMgY291bGQgYmUKKyAgICAgKiAgdXNlZnVsIGZvciBnZW5lcmF0aW5nIGEgQyBmaWxlIGFuZCBhbHNvIGl0cyBoZWFkZXIgZmlsZS0tYWxsIGZyb20gdGhlCisgICAgICogIHNhbWUgYnVmZmVyOgorICAgICAqCisgICAgICogICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoInBhc3MxIiwgdCwgInRleHQgdG8gcHV0IGFmdGVyIHQiKTt9CisgICAgICogCQl0b2tlbnMuaW5zZXJ0QWZ0ZXIoInBhc3MyIiwgdSwgInRleHQgYWZ0ZXIgdSIpO30KKyAgICAgKiAJCVN5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMudG9TdHJpbmcoInBhc3MxIikpOworICAgICAqIAkJU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy50b1N0cmluZygicGFzczIiKSk7CisgICAgICoKKyAgICAgKiAgSWYgeW91IGRvbid0IHVzZSBuYW1lZCByZXdyaXRlIHN0cmVhbXMsIGEgImRlZmF1bHQiIHN0cmVhbSBpcyB1c2VkIGFzCisgICAgICogIHRoZSBmaXJzdCBleGFtcGxlIHNob3dzLgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIFtEZWJ1Z2dlckRpc3BsYXkoICJUT0RPOiBUb2tlblJld3JpdGVTdHJlYW0gZGVidWdnZXIgZGlzcGxheSIgKV0KKyAgICBwdWJsaWMgY2xhc3MgVG9rZW5SZXdyaXRlU3RyZWFtIDogQ29tbW9uVG9rZW5TdHJlYW0KKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgREVGQVVMVF9QUk9HUkFNX05BTUUgPSAiZGVmYXVsdCI7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgUFJPR1JBTV9JTklUX1NJWkUgPSAxMDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTUlOX1RPS0VOX0lOREVYID0gMDsKKworICAgICAgICAvLyBEZWZpbmUgdGhlIHJld3JpdGUgb3BlcmF0aW9uIGhpZXJhcmNoeQorCisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBSZXdyaXRlT3BlcmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGluZGV4IGludG8gcmV3cml0ZXMgTGlzdCBhcmUgd2U/PC9zdW1tYXJ5PiAqLworICAgICAgICAgICAgcHVibGljIGludCBpbnN0cnVjdGlvbkluZGV4OworICAgICAgICAgICAgLyoqIDxzdW1tYXJ5PlRva2VuIGJ1ZmZlciBpbmRleC48L3N1bW1hcnk+ICovCisgICAgICAgICAgICBwdWJsaWMgaW50IGluZGV4OworICAgICAgICAgICAgcHVibGljIG9iamVjdCB0ZXh0OworICAgICAgICAgICAgLy8gb3V0ZXIKKyAgICAgICAgICAgIHByb3RlY3RlZCBUb2tlblJld3JpdGVTdHJlYW0gc3RyZWFtOworCisgICAgICAgICAgICBwcm90ZWN0ZWQgUmV3cml0ZU9wZXJhdGlvbihUb2tlblJld3JpdGVTdHJlYW0gc3RyZWFtLCBpbnQgaW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgUmV3cml0ZU9wZXJhdGlvbiggVG9rZW5SZXdyaXRlU3RyZWFtIHN0cmVhbSwgaW50IGluZGV4LCBvYmplY3QgdGV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICAgICAqICBFeGVjdXRlIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBieSBwb3NzaWJseSBhZGRpbmcgdG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAqICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXh0IHRva2VuIHRvIG9wZXJhdGUgb24uCisgICAgICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgRXhlY3V0ZSggU3RyaW5nQnVpbGRlciBidWYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG9wTmFtZSA9IHRoaXMuR2V0VHlwZSgpLk5hbWU7CisgICAgICAgICAgICAgICAgaW50IGRpbmRleCA9IG9wTmFtZS5JbmRleE9mKCAnJCcgKTsKKyAgICAgICAgICAgICAgICBvcE5hbWUgPSBvcE5hbWUuU3Vic3RyaW5nKCBkaW5kZXggKyAxICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjx7MH1AezF9OlwiezJ9XCI+Iiwgb3BOYW1lLCBzdHJlYW0uX3Rva2Vuc1tpbmRleF0sIHRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBJbnNlcnRCZWZvcmVPcCA6IFJld3JpdGVPcGVyYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEluc2VydEJlZm9yZU9wKCBUb2tlblJld3JpdGVTdHJlYW0gc3RyZWFtLCBpbnQgaW5kZXgsIG9iamVjdCB0ZXh0ICkgOgorICAgICAgICAgICAgICAgIGJhc2UoIHN0cmVhbSwgaW5kZXgsIHRleHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEV4ZWN1dGUoIFN0cmluZ0J1aWxkZXIgYnVmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCB0ZXh0ICk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5fdG9rZW5zW2luZGV4XS5UeXBlICE9IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKHN0cmVhbS5fdG9rZW5zW2luZGV4XS5UZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSSdtIGdvaW5nIHRvIHRyeSByZXBsYWNpbmcgcmFuZ2UgZnJvbSB4Li55IHdpdGggKHkteCkrMSBSZXBsYWNlT3AKKyAgICAgICAgICogIGluc3RydWN0aW9ucy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgUmVwbGFjZU9wIDogUmV3cml0ZU9wZXJhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGxhc3RJbmRleDsKKyAgICAgICAgICAgIHB1YmxpYyBSZXBsYWNlT3AoIFRva2VuUmV3cml0ZVN0cmVhbSBzdHJlYW0sIGludCBmcm9tLCBpbnQgdG8sIG9iamVjdCB0ZXh0ICkKKyAgICAgICAgICAgICAgICA6IGJhc2UoIHN0cmVhbSwgZnJvbSwgdGV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gdG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgRXhlY3V0ZSggU3RyaW5nQnVpbGRlciBidWYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdGV4dCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHRleHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RJbmRleCArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiPERlbGV0ZU9wQHswfS4uezF9PiIsIHN0cmVhbS5fdG9rZW5zW2luZGV4XSwgc3RyZWFtLl90b2tlbnNbbGFzdEluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjxSZXBsYWNlT3BAezB9Li57MX06XCJ7Mn1cIj4iLCBzdHJlYW0uX3Rva2Vuc1tpbmRleF0sIHN0cmVhbS5fdG9rZW5zW2xhc3RJbmRleF0sIHRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgWW91IG1heSBoYXZlIG11bHRpcGxlLCBuYW1lZCBzdHJlYW1zIG9mIHJld3JpdGUgb3BlcmF0aW9ucy4KKyAgICAgICAgICogIEknbSBjYWxsaW5nIHRoZXNlIHRoaW5ncyAicHJvZ3JhbXMuIgorICAgICAgICAgKiAgTWFwcyBTdHJpbmcgKG5hbWUpIC0+IHJld3JpdGUgKExpc3QpCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSURpY3Rpb25hcnk8c3RyaW5nLCBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPj4gcHJvZ3JhbXMgPSBudWxsOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5NYXAgU3RyaW5nIChwcm9ncmFtIG5hbWUpIC0+IEludGVnZXIgaW5kZXg8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBJRGljdGlvbmFyeTxzdHJpbmcsIGludD4gbGFzdFJld3JpdGVUb2tlbkluZGV4ZXMgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBUb2tlblJld3JpdGVTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBJbml0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvZ3JhbXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIElMaXN0PFJld3JpdGVPcGVyYXRpb24+PigpOworICAgICAgICAgICAgcHJvZ3JhbXNbREVGQVVMVF9QUk9HUkFNX05BTUVdID0gbmV3IExpc3Q8UmV3cml0ZU9wZXJhdGlvbj4oIFBST0dSQU1fSU5JVF9TSVpFICk7CisgICAgICAgICAgICBsYXN0UmV3cml0ZVRva2VuSW5kZXhlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRva2VuUmV3cml0ZVN0cmVhbSggSVRva2VuU291cmNlIHRva2VuU291cmNlICkKKyAgICAgICAgICAgIDogYmFzZSggdG9rZW5Tb3VyY2UgKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVG9rZW5SZXdyaXRlU3RyZWFtKCBJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UsIGludCBjaGFubmVsICkKKyAgICAgICAgICAgIDogYmFzZSggdG9rZW5Tb3VyY2UsIGNoYW5uZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBJbml0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJvbGxiYWNrKCBpbnQgaW5zdHJ1Y3Rpb25JbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvbGxiYWNrKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgaW5zdHJ1Y3Rpb25JbmRleCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUm9sbGJhY2sgdGhlIGluc3RydWN0aW9uIHN0cmVhbSBmb3IgYSBwcm9ncmFtIHNvIHRoYXQKKyAgICAgICAgICogIHRoZSBpbmRpY2F0ZWQgaW5zdHJ1Y3Rpb24gKHZpYSBpbnN0cnVjdGlvbkluZGV4KSBpcyBubworICAgICAgICAgKiAgbG9uZ2VyIGluIHRoZSBzdHJlYW0uICBVTlRFU1RFRCEKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUm9sbGJhY2soIHN0cmluZyBwcm9ncmFtTmFtZSwgaW50IGluc3RydWN0aW9uSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiBAaXM7CisgICAgICAgICAgICBpZiAoIHByb2dyYW1zLlRyeUdldFZhbHVlKCBwcm9ncmFtTmFtZSwgb3V0IEBpcyApICYmIEBpcyAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0PFJld3JpdGVPcGVyYXRpb24+IHN1Ymxpc3QgPSBuZXcgTGlzdDxSZXdyaXRlT3BlcmF0aW9uPigpOworICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gTUlOX1RPS0VOX0lOREVYOyBpIDw9IGluc3RydWN0aW9uSW5kZXg7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHN1Ymxpc3QuQWRkKCBAaXNbaV0gKTsKKworICAgICAgICAgICAgICAgIHByb2dyYW1zW3Byb2dyYW1OYW1lXSA9IHN1Ymxpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZVByb2dyYW0oKQorICAgICAgICB7CisgICAgICAgICAgICBEZWxldGVQcm9ncmFtKCBERUZBVUxUX1BST0dSQU1fTkFNRSApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJlc2V0IHRoZSBwcm9ncmFtIHNvIHRoYXQgbm8gaW5zdHJ1Y3Rpb25zIGV4aXN0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZVByb2dyYW0oIHN0cmluZyBwcm9ncmFtTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvbGxiYWNrKCBwcm9ncmFtTmFtZSwgTUlOX1RPS0VOX0lOREVYICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluc2VydEFmdGVyKCBJVG9rZW4gdCwgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBJbnNlcnRBZnRlciggREVGQVVMVF9QUk9HUkFNX05BTUUsIHQsIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgSW5zZXJ0QWZ0ZXIoIGludCBpbmRleCwgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBJbnNlcnRBZnRlciggREVGQVVMVF9QUk9HUkFNX05BTUUsIGluZGV4LCB0ZXh0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluc2VydEFmdGVyKCBzdHJpbmcgcHJvZ3JhbU5hbWUsIElUb2tlbiB0LCBvYmplY3QgdGV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEluc2VydEFmdGVyKCBwcm9ncmFtTmFtZSwgdC5Ub2tlbkluZGV4LCB0ZXh0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluc2VydEFmdGVyKCBzdHJpbmcgcHJvZ3JhbU5hbWUsIGludCBpbmRleCwgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0byBpbnNlcnQgYWZ0ZXIsIGp1c3QgaW5zZXJ0IGJlZm9yZSBuZXh0IGluZGV4IChldmVuIGlmIHBhc3QgZW5kKQorICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKCBwcm9ncmFtTmFtZSwgaW5kZXggKyAxLCB0ZXh0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluc2VydEJlZm9yZSggSVRva2VuIHQsIG9iamVjdCB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgdCwgdGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbnNlcnRCZWZvcmUoIGludCBpbmRleCwgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBJbnNlcnRCZWZvcmUoIERFRkFVTFRfUFJPR1JBTV9OQU1FLCBpbmRleCwgdGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBJbnNlcnRCZWZvcmUoIHN0cmluZyBwcm9ncmFtTmFtZSwgSVRva2VuIHQsIG9iamVjdCB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKCBwcm9ncmFtTmFtZSwgdC5Ub2tlbkluZGV4LCB0ZXh0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEluc2VydEJlZm9yZSggc3RyaW5nIHByb2dyYW1OYW1lLCBpbnQgaW5kZXgsIG9iamVjdCB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcCA9IG5ldyBJbnNlcnRCZWZvcmVPcCggdGhpcywgaW5kZXgsIHRleHQgKTsKKyAgICAgICAgICAgIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IHJld3JpdGVzID0gR2V0UHJvZ3JhbSggcHJvZ3JhbU5hbWUgKTsKKyAgICAgICAgICAgIG9wLmluc3RydWN0aW9uSW5kZXggPSByZXdyaXRlcy5Db3VudDsKKyAgICAgICAgICAgIHJld3JpdGVzLkFkZCggb3AgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZSggaW50IGluZGV4LCBvYmplY3QgdGV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlcGxhY2UoIERFRkFVTFRfUFJPR1JBTV9OQU1FLCBpbmRleCwgaW5kZXgsIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZSggaW50IGZyb20sIGludCB0bywgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBSZXBsYWNlKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgZnJvbSwgdG8sIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZSggSVRva2VuIGluZGV4VCwgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBSZXBsYWNlKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgaW5kZXhULCBpbmRleFQsIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZSggSVRva2VuIGZyb20sIElUb2tlbiB0bywgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBSZXBsYWNlKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgZnJvbSwgdG8sIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZSggc3RyaW5nIHByb2dyYW1OYW1lLCBpbnQgZnJvbSwgaW50IHRvLCBvYmplY3QgdGV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZnJvbSA+IHRvIHx8IGZyb20gPCAwIHx8IHRvIDwgMCB8fCB0byA+PSBfdG9rZW5zLkNvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oICJyZXBsYWNlOiByYW5nZSBpbnZhbGlkOiAiICsgZnJvbSArICIuLiIgKyB0byArICIoc2l6ZT0iICsgX3Rva2Vucy5Db3VudCArICIpIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcCA9IG5ldyBSZXBsYWNlT3AoIHRoaXMsIGZyb20sIHRvLCB0ZXh0ICk7CisgICAgICAgICAgICBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiByZXdyaXRlcyA9IEdldFByb2dyYW0oIHByb2dyYW1OYW1lICk7CisgICAgICAgICAgICBvcC5pbnN0cnVjdGlvbkluZGV4ID0gcmV3cml0ZXMuQ291bnQ7CisgICAgICAgICAgICByZXdyaXRlcy5BZGQoIG9wICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcGxhY2UoIHN0cmluZyBwcm9ncmFtTmFtZSwgSVRva2VuIGZyb20sIElUb2tlbiB0bywgb2JqZWN0IHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBSZXBsYWNlKCBwcm9ncmFtTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZnJvbS5Ub2tlbkluZGV4LAorICAgICAgICAgICAgICAgICAgICB0by5Ub2tlbkluZGV4LAorICAgICAgICAgICAgICAgICAgICB0ZXh0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZSggaW50IGluZGV4ICkKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgaW5kZXgsIGluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZSggaW50IGZyb20sIGludCB0byApCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZSggREVGQVVMVF9QUk9HUkFNX05BTUUsIGZyb20sIHRvICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZSggSVRva2VuIGluZGV4VCApCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZSggREVGQVVMVF9QUk9HUkFNX05BTUUsIGluZGV4VCwgaW5kZXhUICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZSggSVRva2VuIGZyb20sIElUb2tlbiB0byApCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZSggREVGQVVMVF9QUk9HUkFNX05BTUUsIGZyb20sIHRvICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZSggc3RyaW5nIHByb2dyYW1OYW1lLCBpbnQgZnJvbSwgaW50IHRvICkKKyAgICAgICAgeworICAgICAgICAgICAgUmVwbGFjZSggcHJvZ3JhbU5hbWUsIGZyb20sIHRvLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERlbGV0ZSggc3RyaW5nIHByb2dyYW1OYW1lLCBJVG9rZW4gZnJvbSwgSVRva2VuIHRvICkKKyAgICAgICAgeworICAgICAgICAgICAgUmVwbGFjZSggcHJvZ3JhbU5hbWUsIGZyb20sIHRvLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0TGFzdFJld3JpdGVUb2tlbkluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldExhc3RSZXdyaXRlVG9rZW5JbmRleCggREVGQVVMVF9QUk9HUkFNX05BTUUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBHZXRMYXN0UmV3cml0ZVRva2VuSW5kZXgoIHN0cmluZyBwcm9ncmFtTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICggbGFzdFJld3JpdGVUb2tlbkluZGV4ZXMuVHJ5R2V0VmFsdWUoIHByb2dyYW1OYW1lLCBvdXQgdmFsdWUgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFNldExhc3RSZXdyaXRlVG9rZW5JbmRleCggc3RyaW5nIHByb2dyYW1OYW1lLCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RSZXdyaXRlVG9rZW5JbmRleGVzW3Byb2dyYW1OYW1lXSA9IGk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiBHZXRQcm9ncmFtKCBzdHJpbmcgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IEBpczsKKyAgICAgICAgICAgIGlmICggIXByb2dyYW1zLlRyeUdldFZhbHVlKCBuYW1lLCBvdXQgQGlzICkgfHwgQGlzID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBpcyA9IEluaXRpYWxpemVQcm9ncmFtKCBuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiBJbml0aWFsaXplUHJvZ3JhbSggc3RyaW5nIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBJTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiBAaXMgPSBuZXcgTGlzdDxSZXdyaXRlT3BlcmF0aW9uPiggUFJPR1JBTV9JTklUX1NJWkUgKTsKKyAgICAgICAgICAgIHByb2dyYW1zW25hbWVdID0gQGlzOworICAgICAgICAgICAgcmV0dXJuIEBpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb09yaWdpbmFsU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsbCgpOworICAgICAgICAgICAgcmV0dXJuIFRvT3JpZ2luYWxTdHJpbmcoIE1JTl9UT0tFTl9JTkRFWCwgQ291bnQgLSAxICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9PcmlnaW5hbFN0cmluZyggaW50IHN0YXJ0LCBpbnQgZW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yICggaW50IGkgPSBzdGFydDsgaSA+PSBNSU5fVE9LRU5fSU5ERVggJiYgaSA8PSBlbmQgJiYgaSA8IF90b2tlbnMuQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEdldChpKS5UeXBlICE9IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKEdldChpKS5UZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxsKCk7CisgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoIE1JTl9UT0tFTl9JTkRFWCwgQ291bnQgLSAxICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmcoIHN0cmluZyBwcm9ncmFtTmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGwoKTsKKyAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyhwcm9ncmFtTmFtZSwgTUlOX1RPS0VOX0lOREVYLCBDb3VudCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZyggaW50IHN0YXJ0LCBpbnQgZW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKCBERUZBVUxUX1BST0dSQU1fTkFNRSwgc3RhcnQsIGVuZCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBzdHJpbmcgcHJvZ3JhbU5hbWUsIGludCBzdGFydCwgaW50IGVuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IHJld3JpdGVzOworICAgICAgICAgICAgaWYgKCAhcHJvZ3JhbXMuVHJ5R2V0VmFsdWUoIHByb2dyYW1OYW1lLCBvdXQgcmV3cml0ZXMgKSApCisgICAgICAgICAgICAgICAgcmV3cml0ZXMgPSBudWxsOworCisgICAgICAgICAgICAvLyBlbnN1cmUgc3RhcnQvZW5kIGFyZSBpbiByYW5nZQorICAgICAgICAgICAgaWYgKCBlbmQgPiBfdG9rZW5zLkNvdW50IC0gMSApCisgICAgICAgICAgICAgICAgZW5kID0gX3Rva2Vucy5Db3VudCAtIDE7CisgICAgICAgICAgICBpZiAoIHN0YXJ0IDwgMCApCisgICAgICAgICAgICAgICAgc3RhcnQgPSAwOworCisgICAgICAgICAgICBpZiAoIHJld3JpdGVzID09IG51bGwgfHwgcmV3cml0ZXMuQ291bnQgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRvT3JpZ2luYWxTdHJpbmcoIHN0YXJ0LCBlbmQgKTsgLy8gbm8gaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgLy8gRmlyc3QsIG9wdGltaXplIGluc3RydWN0aW9uIHN0cmVhbQorICAgICAgICAgICAgSURpY3Rpb25hcnk8aW50LCBSZXdyaXRlT3BlcmF0aW9uPiBpbmRleFRvT3AgPSBSZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4KCByZXdyaXRlcyApOworCisgICAgICAgICAgICAvLyBXYWxrIGJ1ZmZlciwgZXhlY3V0aW5nIGluc3RydWN0aW9ucyBhbmQgZW1pdHRpbmcgdG9rZW5zCisgICAgICAgICAgICBpbnQgaSA9IHN0YXJ0OworICAgICAgICAgICAgd2hpbGUgKCBpIDw9IGVuZCAmJiBpIDwgX3Rva2Vucy5Db3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBvcDsKKyAgICAgICAgICAgICAgICBib29sIGV4aXN0cyA9IGluZGV4VG9PcC5UcnlHZXRWYWx1ZSggaSwgb3V0IG9wICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc28gYW55IGxlZnQgaGF2ZSBpbmRleCBzaXplLTEKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhUb09wLlJlbW92ZSggaSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggIWV4aXN0cyB8fCBvcCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gX3Rva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gb3BlcmF0aW9uIGF0IHRoYXQgaW5kZXgsIGp1c3QgZHVtcCB0b2tlbgorICAgICAgICAgICAgICAgICAgICBpZiAodC5UeXBlICE9IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCh0LlRleHQpOworICAgICAgICAgICAgICAgICAgICBpKys7IC8vIG1vdmUgdG8gbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpID0gb3AuRXhlY3V0ZSggYnVmICk7IC8vIGV4ZWN1dGUgb3BlcmF0aW9uIGFuZCBza2lwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbmNsdWRlIHN0dWZmIGFmdGVyIGVuZCBpZiBpdCdzIGxhc3QgaW5kZXggaW4gYnVmZmVyCisgICAgICAgICAgICAvLyBTbywgaWYgdGhleSBkaWQgYW4gaW5zZXJ0QWZ0ZXIobGFzdFZhbGlkSW5kZXgsICJmb28iKSwgaW5jbHVkZQorICAgICAgICAgICAgLy8gZm9vIGlmIGVuZD09bGFzdFZhbGlkSW5kZXguCisgICAgICAgICAgICBpZiAoIGVuZCA9PSBfdG9rZW5zLkNvdW50IC0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2NhbiBhbnkgcmVtYWluaW5nIG9wZXJhdGlvbnMgYWZ0ZXIgbGFzdCB0b2tlbgorICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBpbmNsdWRlZCAodGhleSB3aWxsIGJlIGluc2VydHMpLgorICAgICAgICAgICAgICAgIGZvcmVhY2ggKCBSZXdyaXRlT3BlcmF0aW9uIG9wIGluIGluZGV4VG9PcC5WYWx1ZXMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBvcC5pbmRleCA+PSBfdG9rZW5zLkNvdW50IC0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCBvcC50ZXh0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFdlIG5lZWQgdG8gY29tYmluZSBvcGVyYXRpb25zIGFuZCByZXBvcnQgaW52YWxpZCBvcGVyYXRpb25zIChsaWtlCisgICAgICAgICAqICBvdmVybGFwcGluZyByZXBsYWNlcyB0aGF0IGFyZSBub3QgY29tcGxldGVkIG5lc3RlZCkuICBJbnNlcnRzIHRvCisgICAgICAgICAqICBzYW1lIGluZGV4IG5lZWQgdG8gYmUgY29tYmluZWQgZXRjLi4uICAgSGVyZSBhcmUgdGhlIGNhc2VzOgorICAgICAgICAgKgorICAgICAgICAgKiAgSS5pLnUgSS5qLnYJCQkJCQkJCWxlYXZlIGFsb25lLCBub25vdmVybGFwcGluZworICAgICAgICAgKiAgSS5pLnUgSS5pLnYJCQkJCQkJCWNvbWJpbmU6IElpdnUKKyAgICAgICAgICoKKyAgICAgICAgICogIFIuaS1qLnUgUi54LXkudgl8IGktaiBpbiB4LXkJCQlkZWxldGUgZmlyc3QgUgorICAgICAgICAgKiAgUi5pLWoudSBSLmktai52CQkJCQkJCWRlbGV0ZSBmaXJzdCBSCisgICAgICAgICAqICBSLmktai51IFIueC15LnYJfCB4LXkgaW4gaS1qCQkJRVJST1IKKyAgICAgICAgICogIFIuaS1qLnUgUi54LXkudgl8IGJvdW5kYXJpZXMgb3ZlcmxhcAlFUlJPUgorICAgICAgICAgKgorICAgICAgICAgKiAgRGVsZXRlIHNwZWNpYWwgY2FzZSBvZiByZXBsYWNlICh0ZXh0PT1udWxsKToKKyAgICAgICAgICogIEQuaS1qLnUgRC54LXkudgl8IGJvdW5kYXJpZXMgb3ZlcmxhcAljb21iaW5lIHRvIG1heChtaW4pLi5tYXgocmlnaHQpCisgICAgICAgICAqCisgICAgICAgICAqICBJLmkudSBSLngteS52IHwgaSBpbiAoeCsxKS15CQkJZGVsZXRlIEkgKHNpbmNlIGluc2VydCBiZWZvcmUKKyAgICAgICAgICoJCQkJCQkJCQkJCXdlJ3JlIG5vdCBkZWxldGluZyBpKQorICAgICAgICAgKiAgSS5pLnUgUi54LXkudiB8IGkgbm90IGluICh4KzEpLXkJCWxlYXZlIGFsb25lLCBub25vdmVybGFwcGluZworICAgICAgICAgKiAgUi54LXkudiBJLmkudSB8IGkgaW4geC15CQkJCUVSUk9SCisgICAgICAgICAqICBSLngteS52IEkueC51IAkJCQkJCQlSLngteS51diAoY29tYmluZSwgZGVsZXRlIEkpCisgICAgICAgICAqICBSLngteS52IEkuaS51IHwgaSBub3QgaW4geC15CQkJbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisgICAgICAgICAqCisgICAgICAgICAqICBJLmkudSA9IGluc2VydCB1IGJlZm9yZSBvcCBAIGluZGV4IGkKKyAgICAgICAgICogIFIueC15LnUgPSByZXBsYWNlIHgteSBpbmRleGVkIHRva2VucyB3aXRoIHUKKyAgICAgICAgICoKKyAgICAgICAgICogIEZpcnN0IHdlIG5lZWQgdG8gZXhhbWluZSByZXBsYWNlcy4gIEZvciBhbnkgcmVwbGFjZSBvcDoKKyAgICAgICAgICoKKyAgICAgICAgICogCQkxLiB3aXBlIG91dCBhbnkgaW5zZXJ0aW9ucyBiZWZvcmUgb3Agd2l0aGluIHRoYXQgcmFuZ2UuCisgICAgICAgICAqCQkyLiBEcm9wIGFueSByZXBsYWNlIG9wIGJlZm9yZSB0aGF0IGlzIGNvbnRhaW5lZCBjb21wbGV0ZWx5IHdpdGhpbgorICAgICAgICAgKiAgICAgICAgIHRoYXQgcmFuZ2UuCisgICAgICAgICAqCQkzLiBUaHJvdyBleGNlcHRpb24gdXBvbiBib3VuZGFyeSBvdmVybGFwIHdpdGggYW55IHByZXZpb3VzIHJlcGxhY2UuCisgICAgICAgICAqCisgICAgICAgICAqICBUaGVuIHdlIGNhbiBkZWFsIHdpdGggaW5zZXJ0czoKKyAgICAgICAgICoKKyAgICAgICAgICogCQkxLiBmb3IgYW55IGluc2VydHMgdG8gc2FtZSBpbmRleCwgY29tYmluZSBldmVuIGlmIG5vdCBhZGphY2VudC4KKyAgICAgICAgICogCQkyLiBmb3IgYW55IHByaW9yIHJlcGxhY2Ugd2l0aCBzYW1lIGxlZnQgYm91bmRhcnksIGNvbWJpbmUgdGhpcworICAgICAgICAgKiAgICAgICAgIGluc2VydCB3aXRoIHJlcGxhY2UgYW5kIGRlbGV0ZSB0aGlzIHJlcGxhY2UuCisgICAgICAgICAqIAkJMy4gdGhyb3cgZXhjZXB0aW9uIGlmIGluZGV4IGluIHNhbWUgcmFuZ2UgYXMgcHJldmlvdXMgcmVwbGFjZQorICAgICAgICAgKgorICAgICAgICAgKiAgRG9uJ3QgYWN0dWFsbHkgZGVsZXRlOyBtYWtlIG9wIG51bGwgaW4gbGlzdC4gRWFzaWVyIHRvIHdhbGsgbGlzdC4KKyAgICAgICAgICogIExhdGVyIHdlIGNhbiB0aHJvdyBhcyB3ZSBhZGQgdG8gaW5kZXggLT4gb3AgbWFwLgorICAgICAgICAgKgorICAgICAgICAgKiAgTm90ZSB0aGF0IEkuMiBSLjItMiB3aWxsIHdpcGUgb3V0IEkuMiBldmVuIHRob3VnaCwgdGVjaG5pY2FsbHksIHRoZQorICAgICAgICAgKiAgaW5zZXJ0ZWQgc3R1ZmYgd291bGQgYmUgYmVmb3JlIHRoZSByZXBsYWNlIHJhbmdlLiAgQnV0LCBpZiB5b3UKKyAgICAgICAgICogIGFkZCB0b2tlbnMgaW4gZnJvbnQgb2YgYSBtZXRob2QgYm9keSAneycgYW5kIHRoZW4gZGVsZXRlIHRoZSBtZXRob2QKKyAgICAgICAgICogIGJvZHksIEkgdGhpbmsgdGhlIHN0dWZmIGJlZm9yZSB0aGUgJ3snIHlvdSBhZGRlZCBzaG91bGQgZGlzYXBwZWFyIHRvby4KKyAgICAgICAgICoKKyAgICAgICAgICogIFJldHVybiBhIG1hcCBmcm9tIHRva2VuIGluZGV4IHRvIG9wZXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElEaWN0aW9uYXJ5PGludCwgUmV3cml0ZU9wZXJhdGlvbj4gUmVkdWNlVG9TaW5nbGVPcGVyYXRpb25QZXJJbmRleCggSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gcmV3cml0ZXMgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmV3cml0ZXM9IityZXdyaXRlcyk7CisKKyAgICAgICAgICAgIC8vIFdBTEsgUkVQTEFDRVMKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IHJld3JpdGVzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJld3JpdGVPcGVyYXRpb24gb3AgPSByZXdyaXRlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIG9wID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoICEoIG9wIGlzIFJlcGxhY2VPcCApICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgUmVwbGFjZU9wIHJvcCA9IChSZXBsYWNlT3ApcmV3cml0ZXNbaV07CisgICAgICAgICAgICAgICAgLy8gV2lwZSBwcmlvciBpbnNlcnRzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIHZhciBpbnNlcnRzID0gR2V0S2luZE9mT3BzKCByZXdyaXRlcywgdHlwZW9mKCBJbnNlcnRCZWZvcmVPcCApLCBpICk7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwOyBqIDwgaW5zZXJ0cy5Db3VudDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZU9wIGlvcCA9IChJbnNlcnRCZWZvcmVPcClpbnNlcnRzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoaW9wLmluZGV4ID09IHJvcC5pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRS5nLiwgaW5zZXJ0IGJlZm9yZSAyLCBkZWxldGUgMi4uMjsgdXBkYXRlIHJlcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgdG8gaW5jbHVkZSBpbnNlcnQgYmVmb3JlLCBraWxsIGluc2VydAorICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXNbaW9wLmluc3RydWN0aW9uSW5kZXhdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvcC50ZXh0ID0gaW9wLnRleHQuVG9TdHJpbmcoKSArIChyb3AudGV4dCAhPSBudWxsID8gcm9wLnRleHQuVG9TdHJpbmcoKSA6IHN0cmluZy5FbXB0eSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW9wLmluZGV4ID4gcm9wLmluZGV4ICYmIGlvcC5pbmRleCA8PSByb3AubGFzdEluZGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgaW5zZXJ0IGFzIGl0J3MgYSBuby1vcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW2lvcC5pbnN0cnVjdGlvbkluZGV4XSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRHJvcCBhbnkgcHJpb3IgcmVwbGFjZXMgY29udGFpbmVkIHdpdGhpbgorICAgICAgICAgICAgICAgIHZhciBwcmV2UmVwbGFjZXMgPSBHZXRLaW5kT2ZPcHMoIHJld3JpdGVzLCB0eXBlb2YoIFJlcGxhY2VPcCApLCBpICk7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwOyBqIDwgcHJldlJlcGxhY2VzLkNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwbGFjZU9wIHByZXZSb3AgPSAoUmVwbGFjZU9wKXByZXZSZXBsYWNlc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmV2Um9wLmluZGV4ID49IHJvcC5pbmRleCAmJiBwcmV2Um9wLmxhc3RJbmRleCA8PSByb3AubGFzdEluZGV4ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlIHJlcGxhY2UgYXMgaXQncyBhIG5vLW9wLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXNbcHJldlJvcC5pbnN0cnVjdGlvbkluZGV4XSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBleGNlcHRpb24gdW5sZXNzIGRpc2pvaW50IG9yIGlkZW50aWNhbAorICAgICAgICAgICAgICAgICAgICBib29sIGRpc2pvaW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSb3AubGFzdEluZGV4IDwgcm9wLmluZGV4IHx8IHByZXZSb3AuaW5kZXggPiByb3AubGFzdEluZGV4OworICAgICAgICAgICAgICAgICAgICBib29sIHNhbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJvcC5pbmRleCA9PSByb3AuaW5kZXggJiYgcHJldlJvcC5sYXN0SW5kZXggPT0gcm9wLmxhc3RJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHNwZWNpYWwgY2FzZSBvZiByZXBsYWNlICh0ZXh0PT1udWxsKToKKyAgICAgICAgICAgICAgICAgICAgLy8gRC5pLWoudSBELngteS52CXwgYm91bmRhcmllcyBvdmVybGFwCWNvbWJpbmUgdG8gbWF4KG1pbikuLm1heChyaWdodCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSb3AudGV4dCA9PSBudWxsICYmIHJvcC50ZXh0ID09IG51bGwgJiYgIWRpc2pvaW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigib3ZlcmxhcHBpbmcgZGVsZXRlczogIitwcmV2Um9wKyIsICIrcm9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW3ByZXZSb3AuaW5zdHJ1Y3Rpb25JbmRleF0gPSBudWxsOyAvLyBraWxsIGZpcnN0IGRlbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgcm9wLmluZGV4ID0gTWF0aC5NaW4ocHJldlJvcC5pbmRleCwgcm9wLmluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvcC5sYXN0SW5kZXggPSBNYXRoLk1heChwcmV2Um9wLmxhc3RJbmRleCwgcm9wLmxhc3RJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibmV3IHJvcCAiICsgcm9wKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggIWRpc2pvaW50ICYmICFzYW1lICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAicmVwbGFjZSBvcCBib3VuZGFyaWVzIG9mICIgKyByb3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG92ZXJsYXAgd2l0aCBwcmV2aW91cyAiICsgcHJldlJvcCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXQUxLIElOU0VSVFMKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IHJld3JpdGVzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJld3JpdGVPcGVyYXRpb24gb3AgPSAoUmV3cml0ZU9wZXJhdGlvbilyZXdyaXRlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIG9wID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoICEoIG9wIGlzIEluc2VydEJlZm9yZU9wICkgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmVPcCBpb3AgPSAoSW5zZXJ0QmVmb3JlT3ApcmV3cml0ZXNbaV07CisgICAgICAgICAgICAgICAgLy8gY29tYmluZSBjdXJyZW50IGluc2VydCB3aXRoIHByaW9yIGlmIGFueSBhdCBzYW1lIGluZGV4CisgICAgICAgICAgICAgICAgdmFyIHByZXZJbnNlcnRzID0gR2V0S2luZE9mT3BzKCByZXdyaXRlcywgdHlwZW9mKCBJbnNlcnRCZWZvcmVPcCApLCBpICk7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGogPSAwOyBqIDwgcHJldkluc2VydHMuQ291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmVPcCBwcmV2SW9wID0gKEluc2VydEJlZm9yZU9wKXByZXZJbnNlcnRzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZJb3AuaW5kZXggPT0gaW9wLmluZGV4ICkKKyAgICAgICAgICAgICAgICAgICAgeyAvLyBjb21iaW5lIG9iamVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5ncy4uLndlJ3JlIGluIHByb2Nlc3Mgb2YgdG9TdHJpbmcnaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSB0b2tlbiBidWZmZXIgc28gbm8gbGF6eSBldmFsIGlzc3VlIHdpdGggYW55IHRlbXBsYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgaW9wLnRleHQgPSBDYXRPcFRleHQoIGlvcC50ZXh0LCBwcmV2SW9wLnRleHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSByZWR1bmRhbnQgcHJpb3IgaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlc1twcmV2SW9wLmluc3RydWN0aW9uSW5kZXhdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBsb29rIGZvciByZXBsYWNlcyB3aGVyZSBpb3AuaW5kZXggaXMgaW4gcmFuZ2U7IGVycm9yCisgICAgICAgICAgICAgICAgdmFyIHByZXZSZXBsYWNlcyA9IEdldEtpbmRPZk9wcyggcmV3cml0ZXMsIHR5cGVvZiggUmVwbGFjZU9wICksIGkgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCBwcmV2UmVwbGFjZXMuQ291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlT3Agcm9wID0gKFJlcGxhY2VPcClwcmV2UmVwbGFjZXNbal07CisgICAgICAgICAgICAgICAgICAgIGlmICggaW9wLmluZGV4ID09IHJvcC5pbmRleCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvcC50ZXh0ID0gQ2F0T3BUZXh0KCBpb3AudGV4dCwgcm9wLnRleHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW2ldID0gbnVsbDsgIC8vIGRlbGV0ZSBjdXJyZW50IGluc2VydAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpb3AuaW5kZXggPj0gcm9wLmluZGV4ICYmIGlvcC5pbmRleCA8PSByb3AubGFzdEluZGV4ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiaW5zZXJ0IG9wICIgKyBpb3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGhpbiBib3VuZGFyaWVzIG9mIHByZXZpb3VzICIgKyByb3AgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmV3cml0ZXMgYWZ0ZXI9IityZXdyaXRlcyk7CisgICAgICAgICAgICBJRGljdGlvbmFyeTxpbnQsIFJld3JpdGVPcGVyYXRpb24+IG0gPSBuZXcgRGljdGlvbmFyeTxpbnQsIFJld3JpdGVPcGVyYXRpb24+KCk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCByZXdyaXRlcy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZXdyaXRlT3BlcmF0aW9uIG9wID0gKFJld3JpdGVPcGVyYXRpb24pcmV3cml0ZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCBvcCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSBkZWxldGVkIG9wcworCisgICAgICAgICAgICAgICAgUmV3cml0ZU9wZXJhdGlvbiBleGlzdGluZzsKKyAgICAgICAgICAgICAgICBpZiAoIG0uVHJ5R2V0VmFsdWUoIG9wLmluZGV4LCBvdXQgZXhpc3RpbmcgKSAmJiBleGlzdGluZyAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJzaG91bGQgb25seSBiZSBvbmUgb3AgcGVyIGluZGV4IiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtW29wLmluZGV4XSA9IG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImluZGV4IHRvIG9wOiAiK20pOworICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgQ2F0T3BUZXh0KCBvYmplY3QgYSwgb2JqZWN0IGIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkNvbmNhdCggYSwgYiApOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IEdldEtpbmRPZk9wcyggSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gcmV3cml0ZXMsIFR5cGUga2luZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRLaW5kT2ZPcHMoIHJld3JpdGVzLCBraW5kLCByZXdyaXRlcy5Db3VudCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdldCBhbGwgb3BlcmF0aW9ucyBiZWZvcmUgYW4gaW5kZXggb2YgYSBwYXJ0aWN1bGFyIGtpbmQ8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IEdldEtpbmRPZk9wcyggSUxpc3Q8UmV3cml0ZU9wZXJhdGlvbj4gcmV3cml0ZXMsIFR5cGUga2luZCwgaW50IGJlZm9yZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElMaXN0PFJld3JpdGVPcGVyYXRpb24+IG9wcyA9IG5ldyBMaXN0PFJld3JpdGVPcGVyYXRpb24+KCk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBiZWZvcmUgJiYgaSA8IHJld3JpdGVzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJld3JpdGVPcGVyYXRpb24gb3AgPSByZXdyaXRlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIG9wID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICBpZiAoIG9wLkdldFR5cGUoKSA9PSBraW5kICkKKyAgICAgICAgICAgICAgICAgICAgb3BzLkFkZCggb3AgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvcHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9EZWJ1Z1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUb0RlYnVnU3RyaW5nKCBNSU5fVE9LRU5fSU5ERVgsIENvdW50IC0gMSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvRGVidWdTdHJpbmcoIGludCBzdGFydCwgaW50IGVuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gc3RhcnQ7IGkgPj0gTUlOX1RPS0VOX0lOREVYICYmIGkgPD0gZW5kICYmIGkgPCBfdG9rZW5zLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIEdldCggaSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVG9rZW5UeXBlcy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ub2tlblR5cGVzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjkyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVG9rZW5UeXBlcy5jcwpAQCAtMCwwICsxLDQ2IEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuVHlwZXMKKyAgICB7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRW5kT2ZGaWxlID0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGU7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSW52YWxpZCA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgRW5kT2ZSdWxlID0gMTsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PmltYWdpbmFyeSB0cmVlIG5hdmlnYXRpb24gdHlwZTsgdHJhdmVyc2UgImdldCBjaGlsZCIgbGluazwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEb3duID0gMjsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PmltYWdpbmFyeSB0cmVlIG5hdmlnYXRpb24gdHlwZTsgZmluaXNoIHdpdGggYSBjaGlsZCBsaXN0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFVwID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBNaW4gPSBVcCArIDE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1Rva2Vucy5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ub2tlbnMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczNmYyZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9Ub2tlbnMuY3MKQEAgLTAsMCArMSw0NCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb2tlbnMKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEluIGFuIGFjdGlvbiwgYSBsZXhlciBydWxlIGNhbiBzZXQgdG9rZW4gdG8gdGhpcyBTS0lQX1RPS0VOIGFuZCBBTlRMUgorICAgICAgICAgKiAgd2lsbCBhdm9pZCBjcmVhdGluZyBhIHRva2VuIGZvciB0aGlzIHN5bWJvbCBhbmQgdHJ5IHRvIGZldGNoIGFub3RoZXIuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElUb2tlbiBTa2lwID0gbmV3IENvbW1vblRva2VuKCBUb2tlblR5cGVzLkludmFsaWQgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9BbnRsclJ1bnRpbWVfQmFzZVRyZWVEZWJ1Z1ZpZXcuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9BbnRsclJ1bnRpbWVfQmFzZVRyZWVEZWJ1Z1ZpZXcuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NmUzNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0FudGxyUnVudGltZV9CYXNlVHJlZURlYnVnVmlldy5jcwpAQCAtMCwwICsxLDYwIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKKworICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBBbnRsclJ1bnRpbWVfQmFzZVRyZWVEZWJ1Z1ZpZXcKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQmFzZVRyZWUgX3RyZWU7CisKKyAgICAgICAgcHVibGljIEFudGxyUnVudGltZV9CYXNlVHJlZURlYnVnVmlldyhCYXNlVHJlZSB0cmVlKQorICAgICAgICB7CisgICAgICAgICAgICBfdHJlZSA9IHRyZWU7CisgICAgICAgIH0KKworICAgICAgICBbRGVidWdnZXJCcm93c2FibGUoRGVidWdnZXJCcm93c2FibGVTdGF0ZS5Sb290SGlkZGVuKV0KKyAgICAgICAgcHVibGljIElUcmVlW10gQ2hpbGRyZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF90cmVlID09IG51bGwgfHwgX3RyZWUuQ2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICBJVHJlZVtdIGNoaWxkcmVuID0gbmV3IElUcmVlW190cmVlLkNoaWxkcmVuLkNvdW50XTsKKyAgICAgICAgICAgICAgICBfdHJlZS5DaGlsZHJlbi5Db3B5VG8oY2hpbGRyZW4sIDApOworICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Bc3RUcmVlUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiICJiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0FzdFRyZWVSdWxlUmV0dXJuU2NvcGVcMTQwMi5jcyIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4Y2I2ZgotLS0gL2Rldi9udWxsCisrKyAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Bc3RUcmVlUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiCkBAIC0wLDAgKzEsNjAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgcHVibGljIGNsYXNzIEFzdFRyZWVSdWxlUmV0dXJuU2NvcGU8VE91dHB1dFRyZWUsIFRJbnB1dFRyZWU+IDogVHJlZVJ1bGVSZXR1cm5TY29wZTxUSW5wdXRUcmVlPiwgSUFzdFJ1bGVSZXR1cm5TY29wZTxUT3V0cHV0VHJlZT4sIElBc3RSdWxlUmV0dXJuU2NvcGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgVE91dHB1dFRyZWUgX3RyZWU7CisKKyAgICAgICAgcHVibGljIFRPdXRwdXRUcmVlIFRyZWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdHJlZSA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2JqZWN0IElBc3RSdWxlUmV0dXJuU2NvcGUuVHJlZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0Jhc2VUcmVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvQmFzZVRyZWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmM2Q5NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0Jhc2VUcmVlLmNzCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIFN5c3RlbTsKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIHVzaW5nIFN0cmluZ0J1aWxkZXIgPSBTeXN0ZW0uVGV4dC5TdHJpbmdCdWlsZGVyOworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGdlbmVyaWMgdHJlZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG5vIHBheWxvYWQuICBZb3UgbXVzdCBzdWJjbGFzcyB0bworICAgICAqICBhY3R1YWxseSBoYXZlIGFueSB1c2VyIGRhdGEuICBBTlRMUiB2MyB1c2VzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcHByb2FjaAorICAgICAqICBpbnN0ZWFkIG9mIHRoZSBjaGlsZC1zaWJsaW5nIGFwcHJvYWNoIGluIHYyLiAgQSBmbGF0IHRyZWUgKGEgbGlzdCkgaXMKKyAgICAgKiAgYW4gZW1wdHkgbm9kZSB3aG9zZSBjaGlsZHJlbiByZXByZXNlbnQgdGhlIGxpc3QuICBBbiBlbXB0eSwgYnV0CisgICAgICogIG5vbi1udWxsIG5vZGUgaXMgY2FsbGVkICJuaWwiLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgW1N5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlclR5cGVQcm94eSh0eXBlb2YoQW50bHJSdW50aW1lX0Jhc2VUcmVlRGVidWdWaWV3KSldCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VUcmVlIDogSVRyZWUKKyAgICB7CisgICAgICAgIHByaXZhdGUgSUxpc3Q8SVRyZWU+IF9jaGlsZHJlbjsKKworICAgICAgICBwdWJsaWMgQmFzZVRyZWUoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBmcm9tIGFuIGV4aXN0aW5nIG5vZGUgZG9lcyBub3RoaW5nIGZvciBCYXNlVHJlZQorICAgICAgICAgKiAgYXMgdGhlcmUgYXJlIG5vIGZpZWxkcyBvdGhlciB0aGFuIHRoZSBjaGlsZHJlbiBsaXN0LCB3aGljaCBjYW5ub3QKKyAgICAgICAgICogIGJlIGNvcGllZCBhcyB0aGUgY2hpbGRyZW4gYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhpcyBub2RlLiAKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCYXNlVHJlZSggSVRyZWUgbm9kZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdldCB0aGUgY2hpbGRyZW4gaW50ZXJuYWwgTGlzdDsgbm90ZSB0aGF0IGlmIHlvdSBkaXJlY3RseSBtZXNzIHdpdGgKKyAgICAgICAgICogIHRoZSBsaXN0LCBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRyZWU+IENoaWxkcmVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfY2hpbGRyZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NoaWxkcmVuID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIElUcmVlIE1lbWJlcnMKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ2hpbGRDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIENoaWxkcmVuID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIHJldHVybiBDaGlsZHJlbi5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5CYXNlVHJlZSBkb2Vzbid0IHRyYWNrIHBhcmVudCBwb2ludGVycy48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlIFBhcmVudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBDaGlsZEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIElzTmlsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgVG9rZW5TdGFydEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgVG9rZW5TdG9wSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzdHJpbmcgVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgTGluZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZSBHZXRDaGlsZCggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIENoaWxkcmVuID09IG51bGwgfHwgaSA+PSBDaGlsZHJlbi5Db3VudCApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBDaGlsZHJlbltpXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlIEdldEZpcnN0Q2hpbGRXaXRoVHlwZSggaW50IHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3JlYWNoICggSVRyZWUgY2hpbGQgaW4gQ2hpbGRyZW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggY2hpbGQuVHlwZSA9PSB0eXBlICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5BZGQgdCBhcyBjaGlsZCBvZiB0aGlzIG5vZGUuPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAgICAgICAgICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHRoaXMgcm91dGluZSBtb3ZlcyBjaGlsZHJlbiB0byB0IHZpYQorICAgICAgICAgKiAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRDaGlsZCggSVRyZWUgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgY2hpbGQgIit0LnRvU3RyaW5nVHJlZSgpKyIgIit0aGlzLnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJleGlzdGluZyBjaGlsZHJlbjogIitjaGlsZHJlbik7CisgICAgICAgICAgICBpZiAoIHQgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nIHVwb24gYWRkQ2hpbGQobnVsbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdC5Jc05pbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdCBpcyBhbiBlbXB0eSBub2RlIHBvc3NpYmx5IHdpdGggY2hpbGRyZW4KKyAgICAgICAgICAgICAgICBCYXNlVHJlZSBjaGlsZFRyZWUgPSB0IGFzIEJhc2VUcmVlOworICAgICAgICAgICAgICAgIGlmICggY2hpbGRUcmVlICE9IG51bGwgJiYgdGhpcy5DaGlsZHJlbiAhPSBudWxsICYmIHRoaXMuQ2hpbGRyZW4gPT0gY2hpbGRUcmVlLkNoaWxkcmVuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJhdHRlbXB0IHRvIGFkZCBjaGlsZCBsaXN0IHRvIGl0c2VsZiIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgYWxsIG9mIGNoaWxkVHJlZSdzIGNoaWxkcmVuIHRvIHRoaXMKKyAgICAgICAgICAgICAgICBpZiAoIHQuQ2hpbGRDb3VudCA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzLkNoaWxkcmVuICE9IG51bGwgfHwgY2hpbGRUcmVlID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXMuQ2hpbGRyZW4gPT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DaGlsZHJlbiA9IENyZWF0ZUNoaWxkcmVuTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGNvcHksIHRoaXMgaGFzIGNoaWxkcmVuIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gdC5DaGlsZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHJlZSBjID0gdC5HZXRDaGlsZCggaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2hpbGRyZW4uQWRkKCBjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGRvdWJsZS1saW5rIHN0dWZmIGZvciBlYWNoIGNoaWxkIG9mIG5pbCByb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5QYXJlbnQgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuQ2hpbGRJbmRleCA9IENoaWxkcmVuLkNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNoaWxkcmVuIGZvciB0aGlzIGJ1dCB0IGlzIGEgQmFzZVRyZWUgd2l0aCBjaGlsZHJlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3Qgc2V0IHBvaW50ZXIgY2FsbCBnZW5lcmFsIGZyZXNoZW5lciByb3V0aW5lCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNoaWxkcmVuID0gY2hpbGRUcmVlLkNoaWxkcmVuOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY2hpbGQgaXMgbm90IG5pbCAoZG9uJ3QgY2FyZSBhYm91dCBjaGlsZHJlbikKKyAgICAgICAgICAgICAgICBpZiAoIENoaWxkcmVuID09IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW4gPSBDcmVhdGVDaGlsZHJlbkxpc3QoKTsgLy8gY3JlYXRlIGNoaWxkcmVuIGxpc3Qgb24gZGVtYW5kCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENoaWxkcmVuLkFkZCggdCApOworICAgICAgICAgICAgICAgIHQuUGFyZW50ID0gdGhpczsKKyAgICAgICAgICAgICAgICB0LkNoaWxkSW5kZXggPSBDaGlsZHJlbi5Db3VudCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vdyBjaGlsZHJlbiBhcmU6ICIrY2hpbGRyZW4pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkFkZCBhbGwgZWxlbWVudHMgb2Yga2lkcyBsaXN0IGFzIGNoaWxkcmVuIG9mIHRoaXMgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRDaGlsZHJlbiggSUVudW1lcmFibGU8SVRyZWU+IGtpZHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoa2lkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImtpZHMiKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoIElUcmVlIHQgaW4ga2lkcyApCisgICAgICAgICAgICAgICAgQWRkQ2hpbGQoIHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0Q2hpbGQoIGludCBpLCBJVHJlZSB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImkiKTsKKworICAgICAgICAgICAgaWYgKCB0ID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdC5Jc05pbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2FuJ3Qgc2V0IHNpbmdsZSBjaGlsZCB0byBhIGxpc3QiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIENoaWxkcmVuID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoaWxkcmVuID0gQ3JlYXRlQ2hpbGRyZW5MaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDaGlsZHJlbltpXSA9IHQ7CisgICAgICAgICAgICB0LlBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICB0LkNoaWxkSW5kZXggPSBpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IERlbGV0ZUNoaWxkKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJpIik7CisgICAgICAgICAgICBpZiAoaSA+PSBDaGlsZENvdW50KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIENoaWxkcmVuID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBJVHJlZSBraWxsZWQgPSBDaGlsZHJlbltpXTsKKyAgICAgICAgICAgIENoaWxkcmVuLlJlbW92ZUF0KCBpICk7CisgICAgICAgICAgICAvLyB3YWxrIHJlc3QgYW5kIGRlY3JlbWVudCB0aGVpciBjaGlsZCBpbmRleGVzCisgICAgICAgICAgICB0aGlzLkZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoIGkgKTsKKyAgICAgICAgICAgIHJldHVybiBraWxsZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKyAgICAgICAgICogIGEgbGlzdCAobmlsLXJvb3QgdHJlZSkuICBudW0gb2YgY2hpbGRyZW4gY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlLgorICAgICAgICAgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgICAgICAgICAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVwbGFjZUNoaWxkcmVuKCBpbnQgc3RhcnRDaGlsZEluZGV4LCBpbnQgc3RvcENoaWxkSW5kZXgsIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0YXJ0Q2hpbGRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKHN0b3BDaGlsZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAodCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInQiKTsKKyAgICAgICAgICAgIGlmIChzdG9wQ2hpbGRJbmRleCA8IHN0YXJ0Q2hpbGRJbmRleCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVwbGFjZUNoaWxkcmVuICIrc3RhcnRDaGlsZEluZGV4KyIsICIrc3RvcENoaWxkSW5kZXgrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoICIrKChCYXNlVHJlZSl0KS50b1N0cmluZ1RyZWUoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImluPSIrdG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICggQ2hpbGRyZW4gPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCAiaW5kZXhlcyBpbnZhbGlkOyBubyBjaGlsZHJlbiBpbiBsaXN0IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJlcGxhY2luZ0hvd01hbnkgPSBzdG9wQ2hpbGRJbmRleCAtIHN0YXJ0Q2hpbGRJbmRleCArIDE7CisgICAgICAgICAgICBpbnQgcmVwbGFjaW5nV2l0aEhvd01hbnk7CisgICAgICAgICAgICBJVHJlZSBuZXdUcmVlID0gKElUcmVlKXQ7CisgICAgICAgICAgICBJTGlzdDxJVHJlZT4gbmV3Q2hpbGRyZW4gPSBudWxsOworICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRvIGEgbGlzdCBvZiBjaGlsZHJlbiB0byBhZGQ6IG5ld0NoaWxkcmVuCisgICAgICAgICAgICBpZiAoIG5ld1RyZWUuSXNOaWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJhc2VUcmVlIGJhc2VUcmVlID0gbmV3VHJlZSBhcyBCYXNlVHJlZTsKKyAgICAgICAgICAgICAgICBpZiAoIGJhc2VUcmVlICE9IG51bGwgJiYgYmFzZVRyZWUuQ2hpbGRyZW4gIT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbiA9IGJhc2VUcmVlLkNoaWxkcmVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbiA9IENyZWF0ZUNoaWxkcmVuTGlzdCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IG5ld1RyZWUuQ2hpbGRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLkFkZCggbmV3VHJlZS5HZXRDaGlsZCggaSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuID0gbmV3IExpc3Q8SVRyZWU+KCAxICk7CisgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4uQWRkKCBuZXdUcmVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBsYWNpbmdXaXRoSG93TWFueSA9IG5ld0NoaWxkcmVuLkNvdW50OworICAgICAgICAgICAgaW50IG51bU5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW4uQ291bnQ7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSByZXBsYWNpbmdIb3dNYW55IC0gcmVwbGFjaW5nV2l0aEhvd01hbnk7CisgICAgICAgICAgICAvLyBpZiBzYW1lIG51bWJlciBvZiBub2RlcywgZG8gZGlyZWN0IHJlcGxhY2UKKyAgICAgICAgICAgIGlmICggZGVsdGEgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGogPSAwOyAvLyBpbmRleCBpbnRvIG5ldyBjaGlsZHJlbgorICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gc3RhcnRDaGlsZEluZGV4OyBpIDw9IHN0b3BDaGlsZEluZGV4OyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVRyZWUgY2hpbGQgPSBuZXdDaGlsZHJlbltqXTsKKyAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW5baV0gPSBjaGlsZDsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuUGFyZW50ID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuQ2hpbGRJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggZGVsdGEgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmZXdlciBuZXcgbm9kZXMgdGhhbiB0aGVyZSB3ZXJlCisgICAgICAgICAgICAgICAgLy8gc2V0IGNoaWxkcmVuIGFuZCB0aGVuIGRlbGV0ZSBleHRyYQorICAgICAgICAgICAgICAgIGZvciAoIGludCBqID0gMDsgaiA8IG51bU5ld0NoaWxkcmVuOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW5bc3RhcnRDaGlsZEluZGV4ICsgal0gPSBuZXdDaGlsZHJlbltqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGluZGV4VG9EZWxldGUgPSBzdGFydENoaWxkSW5kZXggKyBudW1OZXdDaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgYyA9IGluZGV4VG9EZWxldGU7IGMgPD0gc3RvcENoaWxkSW5kZXg7IGMrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgc2FtZSBpbmRleCwgc2hpZnRpbmcgZXZlcnlib2R5IGRvd24gZWFjaCB0aW1lCisgICAgICAgICAgICAgICAgICAgIENoaWxkcmVuLlJlbW92ZUF0KCBpbmRleFRvRGVsZXRlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoIHN0YXJ0Q2hpbGRJbmRleCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG1vcmUgbmV3IG5vZGVzIHRoYW4gd2VyZSB0aGVyZSBiZWZvcmUKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGluIGFzIG1hbnkgY2hpbGRyZW4gYXMgd2UgY2FuIChyZXBsYWNpbmdIb3dNYW55KSB3L28gbW92aW5nIGRhdGEKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDA7IGogPCByZXBsYWNpbmdIb3dNYW55OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW5bc3RhcnRDaGlsZEluZGV4ICsgal0gPSBuZXdDaGlsZHJlbltqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG51bVRvSW5zZXJ0ID0gcmVwbGFjaW5nV2l0aEhvd01hbnkgLSByZXBsYWNpbmdIb3dNYW55OworICAgICAgICAgICAgICAgIGZvciAoIGludCBqID0gcmVwbGFjaW5nSG93TWFueTsgaiA8IHJlcGxhY2luZ1dpdGhIb3dNYW55OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW4uSW5zZXJ0KCBzdGFydENoaWxkSW5kZXggKyBqLCBuZXdDaGlsZHJlbltqXSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCBzdGFydENoaWxkSW5kZXggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJvdXQ9Iit0b1N0cmluZ1RyZWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+T3ZlcnJpZGUgaW4gYSBzdWJjbGFzcyB0byBjaGFuZ2UgdGhlIGltcGwgb2YgY2hpbGRyZW4gbGlzdDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUxpc3Q8SVRyZWU+IENyZWF0ZUNoaWxkcmVuTGlzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdDxJVHJlZT4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggdmFsdWVzIGZvciBhbGwgY2hpbGQgb2YgdDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyggMCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCBpbnQgb2Zmc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBDaGlsZENvdW50OworICAgICAgICAgICAgZm9yICggaW50IGMgPSBvZmZzZXQ7IGMgPCBuOyBjKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUcmVlIGNoaWxkID0gR2V0Q2hpbGQoIGMgKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5DaGlsZEluZGV4ID0gYzsKKyAgICAgICAgICAgICAgICBjaGlsZC5QYXJlbnQgPSB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCBudWxsLCAtMSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyggSVRyZWUgcGFyZW50LCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcGFyZW50ICE9IHRoaXMuUGFyZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiggInBhcmVudHMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICIgKyBwYXJlbnQgKyAiIGZvdW5kICIgKyB0aGlzLlBhcmVudCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpICE9IHRoaXMuQ2hpbGRJbmRleCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oICJjaGlsZCBpbmRleGVzIGRvbid0IG1hdGNoOyBleHBlY3RlZCAiICsgaSArICIgZm91bmQgIiArIHRoaXMuQ2hpbGRJbmRleCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG4gPSB0aGlzLkNoaWxkQ291bnQ7CisgICAgICAgICAgICBmb3IgKCBpbnQgYyA9IDA7IGMgPCBuOyBjKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJhc2VUcmVlIGNoaWxkID0gKEJhc2VUcmVlKXRoaXMuR2V0Q2hpbGQoIGMgKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyggdGhpcywgYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldhbGsgdXB3YXJkcyBsb29raW5nIGZvciBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSGFzQW5jZXN0b3IoIGludCB0dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRBbmNlc3RvciggdHR5cGUgKSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRyZWUgR2V0QW5jZXN0b3IoIGludCB0dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIHQgPSB0aGlzOworICAgICAgICAgICAgdCA9IHQuUGFyZW50OworICAgICAgICAgICAgd2hpbGUgKCB0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdC5UeXBlID09IHR0eXBlICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICAgICAgdCA9IHQuUGFyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAgICAgICAgICogIGxpc3QgaXMgdGhlIHJvb3QgYW5kIHRoZSBsYXN0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUxpc3Q8SVRyZWU+IEdldEFuY2VzdG9ycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggUGFyZW50ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBMaXN0PElUcmVlPiBhbmNlc3RvcnMgPSBuZXcgTGlzdDxJVHJlZT4oKTsKKyAgICAgICAgICAgIElUcmVlIHQgPSB0aGlzOworICAgICAgICAgICAgdCA9IHQuUGFyZW50OworICAgICAgICAgICAgd2hpbGUgKCB0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFuY2VzdG9ycy5JbnNlcnQoIDAsIHQgKTsgLy8gaW5zZXJ0IGF0IHN0YXJ0CisgICAgICAgICAgICAgICAgdCA9IHQuUGFyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuY2VzdG9yczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5QcmludCBvdXQgYSB3aG9sZSB0cmVlIG5vdCBqdXN0IGEgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nVHJlZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggQ2hpbGRyZW4gPT0gbnVsbCB8fCBDaGlsZHJlbi5Db3VudCA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ub1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKCAhSXNOaWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICIoIiApOworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHRoaXMuVG9TdHJpbmcoKSApOworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICcgJyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBDaGlsZHJlbiAhPSBudWxsICYmIGkgPCBDaGlsZHJlbi5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVHJlZSB0ID0gQ2hpbGRyZW5baV07CisgICAgICAgICAgICAgICAgaWYgKCBpID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kKCAnICcgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggdC5Ub1N0cmluZ1RyZWUoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhSXNOaWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICIpIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pk92ZXJyaWRlIHRvIHNheSBob3cgYSBub2RlIChub3QgYSB0cmVlKSBzaG91bGQgbG9vayBhcyB0ZXh0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYWJzdHJhY3Qgc3RyaW5nIFRvU3RyaW5nKCk7CisKKyAgICAgICAgI3JlZ2lvbiBUcmVlIE1lbWJlcnMKKyAgICAgICAgcHVibGljIGFic3RyYWN0IElUcmVlIER1cE5vZGUoKTsKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0Jhc2VUcmVlQWRhcHRvci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0Jhc2VUcmVlQWRhcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdlMDMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvQmFzZVRyZWVBZGFwdG9yLmNzCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIElEaWN0aW9uYXJ5ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklEaWN0aW9uYXJ5OworICAgIHVzaW5nIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiA9IFN5c3RlbS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CisKKyAgICAvKiogPHN1bW1hcnk+QSBUcmVlQWRhcHRvciB0aGF0IHdvcmtzIHdpdGggYW55IFRyZWUgaW1wbGVtZW50YXRpb24uPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHJlZUFkYXB0b3IgOiBJVHJlZUFkYXB0b3IKKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKCkgaXMgbm90IGFsd2F5cyB1bmlxdWU7IHdlIGhhdmUgdG8KKyAgICAgICAgICogIHRyYWNrIG91cnNlbHZlcy4gIFRoYXQncyBvaywgaXQncyBvbmx5IGZvciBkZWJ1Z2dpbmcsIHRob3VnaCBpdCdzCisgICAgICAgICAqICBleHBlbnNpdmU6IHdlIGhhdmUgdG8gY3JlYXRlIGEgaGFzaHRhYmxlIHdpdGggYWxsIHRyZWUgbm9kZXMgaW4gaXQuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgSURpY3Rpb25hcnk8b2JqZWN0LCBpbnQ+IHRyZWVUb1VuaXF1ZUlETWFwOworICAgICAgICBwcm90ZWN0ZWQgaW50IHVuaXF1ZU5vZGVJRCA9IDE7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IE5pbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGUoIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIENyZWF0ZSB0cmVlIG5vZGUgdGhhdCBob2xkcyB0aGUgc3RhcnQgYW5kIHN0b3AgdG9rZW5zIGFzc29jaWF0ZWQKKyAgICAgICAgICogIHdpdGggYW4gZXJyb3IuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHlvdSBzcGVjaWZ5IHlvdXIgb3duIGtpbmQgb2YgdHJlZSBub2RlcywgeW91IHdpbGwgbGlrZWx5IGhhdmUgdG8KKyAgICAgICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBDb21tb25UcmVlIHJldHVybnMgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFCisgICAgICAgICAqICBpZiBubyB0b2tlbiBwYXlsb2FkIGJ1dCB5b3UgbWlnaHQgaGF2ZSB0byBzZXQgdG9rZW4gdHlwZSBmb3IgZGlmZgorICAgICAgICAgKiAgbm9kZSB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiAgWW91IGRvbid0IGhhdmUgdG8gc3ViY2xhc3MgQ29tbW9uRXJyb3JOb2RlOyB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0bworICAgICAgICAgKiAgc3ViY2xhc3MgeW91ciBvd24gdHJlZSBub2RlIGNsYXNzIHRvIGF2b2lkIGNsYXNzIGNhc3QgZXhjZXB0aW9uLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEVycm9yTm9kZSggSVRva2VuU3RyZWFtIGlucHV0LCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tbW9uRXJyb3JOb2RlIHQgPSBuZXcgQ29tbW9uRXJyb3JOb2RlKCBpbnB1dCwgc3RhcnQsIHN0b3AsIGUgKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJyZXR1cm5pbmcgZXJyb3Igbm9kZSAnIit0KyInIEBpbmRleD0iK2lucHV0LmluZGV4KCkpOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIElzTmlsKCBvYmplY3QgdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoIChJVHJlZSl0cmVlICkuSXNOaWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwTm9kZShpbnQgdHlwZSwgb2JqZWN0IHRyZWVOb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgdCA9IER1cE5vZGUodHJlZU5vZGUpOworICAgICAgICAgICAgU2V0VHlwZSh0LCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IER1cE5vZGUob2JqZWN0IHRyZWVOb2RlLCBzdHJpbmcgdGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IHQgPSBEdXBOb2RlKHRyZWVOb2RlKTsKKyAgICAgICAgICAgIFNldFRleHQodCwgdGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBEdXBOb2RlKGludCB0eXBlLCBvYmplY3QgdHJlZU5vZGUsIHN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3QgdCA9IER1cE5vZGUodHJlZU5vZGUpOworICAgICAgICAgICAgU2V0VHlwZSh0LCB0eXBlKTsKKyAgICAgICAgICAgIFNldFRleHQodCwgdGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBEdXBUcmVlKCBvYmplY3QgdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBEdXBUcmVlKCB0cmVlLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAgICAgICAgICogIHRyZWUgKG5vdCBqdXN0IElUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgICAgICAgICAqICBub3QgdGhlIHRyZWUgbm9kZSByb3V0aW5lcyB0byBkbyB0aGUgY29uc3RydWN0aW9uLiAgCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwVHJlZSggb2JqZWN0IHQsIG9iamVjdCBwYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHQgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmplY3QgbmV3VHJlZSA9IER1cE5vZGUoIHQgKTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSBuZXcgc3VidHJlZSByb290IGhhcyBwYXJlbnQvY2hpbGQgaW5kZXggc2V0CisgICAgICAgICAgICBTZXRDaGlsZEluZGV4KCBuZXdUcmVlLCBHZXRDaGlsZEluZGV4KCB0ICkgKTsgLy8gc2FtZSBpbmRleCBpbiBuZXcgdHJlZQorICAgICAgICAgICAgU2V0UGFyZW50KCBuZXdUcmVlLCBwYXJlbnQgKTsKKyAgICAgICAgICAgIGludCBuID0gR2V0Q2hpbGRDb3VudCggdCApOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBHZXRDaGlsZCggdCwgaSApOworICAgICAgICAgICAgICAgIG9iamVjdCBuZXdTdWJUcmVlID0gRHVwVHJlZSggY2hpbGQsIHQgKTsKKyAgICAgICAgICAgICAgICBBZGRDaGlsZCggbmV3VHJlZSwgbmV3U3ViVHJlZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld1RyZWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgICAgICAgICAqICBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAgICAgICAgICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHlvdSBjYW4gZGVjaWRlIGl0IGlzIG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB2aWEKKyAgICAgICAgICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAgICAgICAgICogIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZAorICAgICAgICAgKiAgQVNUcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQWRkQ2hpbGQoIG9iamVjdCB0LCBvYmplY3QgY2hpbGQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHQgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoIChJVHJlZSl0ICkuQWRkQ2hpbGQoIChJVHJlZSljaGlsZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAgICAgICAgICogIElmIG5vdCBhIG5pbCByb290LCBtYWtlIG9sZFJvb3QgYSBjaGlsZCBvZiBuZXdSb290LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1yIHlpZWxkcyBeKHIgYSBiIGMpCisgICAgICAgICAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAgICAgICAgICoKKyAgICAgICAgICogIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorICAgICAgICAgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICAgIG9sZD1eKG5pbCBhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIGEgYiBjKQorICAgICAgICAgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgb2xkUm9vdCB3YXMgbnVsbCwgaXQncyBvaywganVzdCByZXR1cm4gbmV3Um9vdCAoZXZlbiBpZiBpc05pbCkuCisgICAgICAgICAqCisgICAgICAgICAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICAgICAgICAgKiAgICBvbGQ9bnVsbCwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKG5pbCByKQorICAgICAgICAgKgorICAgICAgICAgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICAgICAgICAgKiAgc2ltcGxlIG5vZGUgb3IgbmlsIHJvb3Qgd2l0aCBhIHNpbmdsZSBjaGlsZCBub2RlLS1pdCBtdXN0IGJlIGEgcm9vdAorICAgICAgICAgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogIEJlIGFkdmlzZWQgdGhhdCBpdCdzIG9rIGZvciBuZXdSb290IHRvIHBvaW50IGF0IG9sZFJvb3QncworICAgICAgICAgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAgICAgICAgICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgICAgICAgICAqICBlZmZpY2llbmN5LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEJlY29tZVJvb3QoIG9iamVjdCBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJiZWNvbWVyb290IG5ldyAiK25ld1Jvb3QudG9TdHJpbmcoKSsiIG9sZCAiK29sZFJvb3QpOworICAgICAgICAgICAgSVRyZWUgbmV3Um9vdFRyZWUgPSAoSVRyZWUpbmV3Um9vdDsKKyAgICAgICAgICAgIElUcmVlIG9sZFJvb3RUcmVlID0gKElUcmVlKW9sZFJvb3Q7CisgICAgICAgICAgICBpZiAoIG9sZFJvb3QgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1Jvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBoYW5kbGUgXihuaWwgcmVhbC1ub2RlKQorICAgICAgICAgICAgaWYgKCBuZXdSb290VHJlZS5Jc05pbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5jID0gbmV3Um9vdFRyZWUuQ2hpbGRDb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIG5jID09IDEgKQorICAgICAgICAgICAgICAgICAgICBuZXdSb290VHJlZSA9IChJVHJlZSluZXdSb290VHJlZS5HZXRDaGlsZCggMCApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBuYyA+IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0cmVlIHJ1biB0aW1lIGV4Y2VwdGlvbnMgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oICJtb3JlIHRoYW4gb25lIG5vZGUgYXMgcm9vdCAoVE9ETzogbWFrZSBleGNlcHRpb24gaGllcmFyY2h5KSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhZGQgb2xkUm9vdCB0byBuZXdSb290OyBhZGRDaGlsZCB0YWtlcyBjYXJlIG9mIGNhc2Ugd2hlcmUgb2xkUm9vdAorICAgICAgICAgICAgLy8gaXMgYSBmbGF0IGxpc3QgKGkuZS4sIG5pbC1yb290ZWQgdHJlZSkuICBBbGwgY2hpbGRyZW4gb2Ygb2xkUm9vdAorICAgICAgICAgICAgLy8gYXJlIGFkZGVkIHRvIG5ld1Jvb3QuCisgICAgICAgICAgICBuZXdSb290VHJlZS5BZGRDaGlsZCggb2xkUm9vdFRyZWUgKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdSb290VHJlZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFuc2Zvcm0gXihuaWwgeCkgdG8geCBhbmQgbmlsIHRvIG51bGw8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBSdWxlUG9zdFByb2Nlc3NpbmcoIG9iamVjdCByb290ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGVQb3N0UHJvY2Vzc2luZzogIisoKFRyZWUpcm9vdCkudG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgSVRyZWUgciA9IChJVHJlZSlyb290OworICAgICAgICAgICAgaWYgKCByICE9IG51bGwgJiYgci5Jc05pbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCByLkNoaWxkQ291bnQgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHIuQ2hpbGRDb3VudCA9PSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIgPSAoSVRyZWUpci5HZXRDaGlsZCggMCApOworICAgICAgICAgICAgICAgICAgICAvLyB3aG9ldmVyIGludm9rZXMgcnVsZSB3aWxsIHNldCBwYXJlbnQgYW5kIGNoaWxkIGluZGV4CisgICAgICAgICAgICAgICAgICAgIHIuUGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgci5DaGlsZEluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQmVjb21lUm9vdCggSVRva2VuIG5ld1Jvb3QsIG9iamVjdCBvbGRSb290ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJlY29tZVJvb3QoIENyZWF0ZSggbmV3Um9vdCApLCBvbGRSb290ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQ3JlYXRlKCBpbnQgdG9rZW5UeXBlLCBJVG9rZW4gZnJvbVRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJvbVRva2VuID0gQ3JlYXRlVG9rZW4oIGZyb21Ub2tlbiApOworICAgICAgICAgICAgZnJvbVRva2VuLlR5cGUgPSB0b2tlblR5cGU7CisgICAgICAgICAgICBvYmplY3QgdCA9IENyZWF0ZSggZnJvbVRva2VuICk7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoIGludCB0b2tlblR5cGUsIElUb2tlbiBmcm9tVG9rZW4sIHN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBmcm9tVG9rZW4gPT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZSggdG9rZW5UeXBlLCB0ZXh0ICk7CisKKyAgICAgICAgICAgIGZyb21Ub2tlbiA9IENyZWF0ZVRva2VuKCBmcm9tVG9rZW4gKTsKKyAgICAgICAgICAgIGZyb21Ub2tlbi5UeXBlID0gdG9rZW5UeXBlOworICAgICAgICAgICAgZnJvbVRva2VuLlRleHQgPSB0ZXh0OworICAgICAgICAgICAgb2JqZWN0IHJlc3VsdCA9IENyZWF0ZShmcm9tVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBDcmVhdGUoSVRva2VuIGZyb21Ub2tlbiwgc3RyaW5nIHRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmcm9tVG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJmcm9tVG9rZW4iKTsKKworICAgICAgICAgICAgZnJvbVRva2VuID0gQ3JlYXRlVG9rZW4oZnJvbVRva2VuKTsKKyAgICAgICAgICAgIGZyb21Ub2tlbi5UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG9iamVjdCByZXN1bHQgPSBDcmVhdGUoZnJvbVRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQ3JlYXRlKCBpbnQgdG9rZW5UeXBlLCBzdHJpbmcgdGV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIElUb2tlbiBmcm9tVG9rZW4gPSBDcmVhdGVUb2tlbiggdG9rZW5UeXBlLCB0ZXh0ICk7CisgICAgICAgICAgICBvYmplY3QgdCA9IENyZWF0ZSggZnJvbVRva2VuICk7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBHZXRUeXBlKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIHRyZWUgPSBHZXRUcmVlKHQpOworICAgICAgICAgICAgaWYgKHRyZWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5JbnZhbGlkOworCisgICAgICAgICAgICByZXR1cm4gdHJlZS5UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUeXBlKCBvYmplY3QgdCwgaW50IHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCAiZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgVHJlZSBub2RlIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEdldFRleHQoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyZWUgdHJlZSA9IEdldFRyZWUodCk7CisgICAgICAgICAgICBpZiAodHJlZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gdHJlZS5UZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUZXh0KCBvYmplY3QgdCwgc3RyaW5nIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCAiZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgVHJlZSBub2RlIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldENoaWxkKCBvYmplY3QgdCwgaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJlZSB0cmVlID0gR2V0VHJlZSh0KTsKKyAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiB0cmVlLkdldENoaWxkKGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRDaGlsZCggb2JqZWN0IHQsIGludCBpLCBvYmplY3QgY2hpbGQgKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJlZSB0cmVlID0gR2V0VHJlZSh0KTsKKyAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBJVHJlZSBjaGlsZFRyZWUgPSBHZXRUcmVlKGNoaWxkKTsKKyAgICAgICAgICAgIHRyZWUuU2V0Q2hpbGQoaSwgY2hpbGRUcmVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBEZWxldGVDaGlsZCggb2JqZWN0IHQsIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICggKElUcmVlKXQgKS5EZWxldGVDaGlsZCggaSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldENoaWxkQ291bnQoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyZWUgdHJlZSA9IEdldFRyZWUodCk7CisgICAgICAgICAgICBpZiAodHJlZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICByZXR1cm4gdHJlZS5DaGlsZENvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFVuaXF1ZUlEKCBvYmplY3Qgbm9kZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdHJlZVRvVW5pcXVlSURNYXAgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJlZVRvVW5pcXVlSURNYXAgPSBuZXcgRGljdGlvbmFyeTxvYmplY3QsIGludD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgIGlmICggdHJlZVRvVW5pcXVlSURNYXAuVHJ5R2V0VmFsdWUoIG5vZGUsIG91dCBpZCApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gaWQ7CisKKyAgICAgICAgICAgIGlkID0gdW5pcXVlTm9kZUlEOworICAgICAgICAgICAgdHJlZVRvVW5pcXVlSURNYXBbbm9kZV0gPSBpZDsKKyAgICAgICAgICAgIHVuaXF1ZU5vZGVJRCsrOworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICAgICAgLy8gR0MgbWFrZXMgdGhlc2Ugbm9udW5pcXVlOgorICAgICAgICAgICAgLy8gcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAgICAgICAgICogIEZvciBleGFtcGxlLCB0aGVyZSBpcyBwcm9iYWJseSBubyBpbnB1dCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGltYWdpbmFyeQorICAgICAgICAgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgICAgICAgICAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVRva2VuIENyZWF0ZVRva2VuKCBpbnQgdG9rZW5UeXBlLCBzdHJpbmcgdGV4dCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgICAgICogIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgICAgICAgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgICAgICAgICAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICAgICAgICAgKiAgdG9rZW5zIHRvIEJMT0NLIGV0Yy4uLiAgWW91J2xsIHNlZQorICAgICAgICAgKgorICAgICAgICAgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICAgICAgICAgKgorICAgICAgICAgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVRva2VuIENyZWF0ZVRva2VuKCBJVG9rZW4gZnJvbVRva2VuICk7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBDcmVhdGUoIElUb2tlbiBwYXlsb2FkICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRHVwbGljYXRlIGEgbm9kZS4gIFRoaXMgaXMgcGFydCBvZiB0aGUgZmFjdG9yeTsKKyAgICAgICAgICogIG92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJIGNvdWxkIHVzZSByZWZsZWN0aW9uIHRvIHByZXZlbnQgaGF2aW5nIHRvIG92ZXJyaWRlIHRoaXMKKyAgICAgICAgICogIGJ1dCByZWZsZWN0aW9uIGlzIHNsb3cuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRHVwTm9kZShvYmplY3QgdHJlZU5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIHRyZWUgPSBHZXRUcmVlKHRyZWVOb2RlKTsKKyAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiB0cmVlLkR1cE5vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJVG9rZW4gR2V0VG9rZW4oIG9iamVjdCB0ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJhY2sgc3RhcnQvc3RvcCB0b2tlbiBmb3Igc3VidHJlZSByb290IGNyZWF0ZWQgZm9yIGEgcnVsZS4KKyAgICAgICAgICogIE9ubHkgd29ya3Mgd2l0aCBUcmVlIG5vZGVzLiAgRm9yIHJ1bGVzIHRoYXQgbWF0Y2ggbm90aGluZywKKyAgICAgICAgICogIHNlZW1zIGxpa2UgdGhpcyB3aWxsIHlpZWxkIHN0YXJ0PWkgYW5kIHN0b3A9aS0xIGluIGEgbmlsIG5vZGUuCisgICAgICAgICAqICBNaWdodCBiZSB1c2VmdWwgaW5mbyBzbyBJJ2xsIG5vdCBmb3JjZSB0byBiZSBpLi5pLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMob2JqZWN0IHQsIElUb2tlbiBzdGFydFRva2VuLCBJVG9rZW4gc3RvcFRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBJVHJlZSB0cmVlID0gR2V0VHJlZSh0KTsKKyAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICAgICAgaW50IHN0b3AgPSAwOworCisgICAgICAgICAgICBpZiAoc3RhcnRUb2tlbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRUb2tlbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgaWYgKHN0b3BUb2tlbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0b3AgPSBzdG9wVG9rZW4uVG9rZW5JbmRleDsKKworICAgICAgICAgICAgdHJlZS5Ub2tlblN0YXJ0SW5kZXggPSBzdGFydDsKKyAgICAgICAgICAgIHRyZWUuVG9rZW5TdG9wSW5kZXggPSBzdG9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFRva2VuU3RhcnRJbmRleChvYmplY3QgdCkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyZWUgdHJlZSA9IEdldFRyZWUodCk7CisgICAgICAgICAgICBpZiAodHJlZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgcmV0dXJuIHRyZWUuVG9rZW5TdGFydEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IEdldFRva2VuU3RvcEluZGV4KG9iamVjdCB0KQorICAgICAgICB7CisgICAgICAgICAgICBJVHJlZSB0cmVlID0gR2V0VHJlZSh0KTsKKyAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICByZXR1cm4gdHJlZS5Ub2tlblN0b3BJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBHZXRQYXJlbnQob2JqZWN0IHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIHRyZWUgPSBHZXRUcmVlKHQpOworICAgICAgICAgICAgaWYgKHRyZWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIHRyZWUuUGFyZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRQYXJlbnQob2JqZWN0IHQsIG9iamVjdCBwYXJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIHRyZWUgPSBHZXRUcmVlKHQpOworICAgICAgICAgICAgaWYgKHRyZWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIElUcmVlIHBhcmVudFRyZWUgPSBHZXRUcmVlKHBhcmVudCk7CisgICAgICAgICAgICB0cmVlLlBhcmVudCA9IHBhcmVudFRyZWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0Q2hpbGRJbmRleChvYmplY3QgdCkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyZWUgdHJlZSA9IEdldFRyZWUodCk7CisgICAgICAgICAgICBpZiAodHJlZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICByZXR1cm4gdHJlZS5DaGlsZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRDaGlsZEluZGV4KG9iamVjdCB0LCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIHRyZWUgPSBHZXRUcmVlKHQpOworICAgICAgICAgICAgaWYgKHRyZWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIHRyZWUuQ2hpbGRJbmRleCA9IGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlQ2hpbGRyZW4ob2JqZWN0IHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBvYmplY3QgdCkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyZWUgdHJlZSA9IEdldFRyZWUocGFyZW50KTsKKyAgICAgICAgICAgIGlmICh0cmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB0cmVlLlJlcGxhY2VDaGlsZHJlbihzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElUcmVlIEdldFRyZWUob2JqZWN0IHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIElUcmVlIHRyZWUgPSB0IGFzIElUcmVlOworICAgICAgICAgICAgaWYgKHRyZWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cmVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0J1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1YTAxZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0J1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uY3MKQEAgLTAsMCArMSw2NjMgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgdXNpbmcgQ29uc29sZSA9IFN5c3RlbS5Db25zb2xlOworICAgIHVzaW5nIElMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklMaXN0OworICAgIHVzaW5nIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gPSBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIC8qKiA8c3VtbWFyeT5BIGJ1ZmZlcmVkIHN0cmVhbSBvZiB0cmVlIG5vZGVzLiAgTm9kZXMgY2FuIGJlIGZyb20gYSB0cmVlIG9mIEFOWSBraW5kLjwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICBUaGlzIG5vZGUgc3RyZWFtIHN1Y2tzIGFsbCBub2RlcyBvdXQgb2YgdGhlIHRyZWUgc3BlY2lmaWVkIGluCisgICAgICogIHRoZSBjb25zdHJ1Y3RvciBkdXJpbmcgY29uc3RydWN0aW9uIGFuZCBtYWtlcyBwb2ludGVycyBpbnRvCisgICAgICogIHRoZSB0cmVlIHVzaW5nIGFuIGFycmF5IG9mIE9iamVjdCBwb2ludGVycy4gVGhlIHN0cmVhbSBuZWNlc3NhcmlseQorICAgICAqICBpbmNsdWRlcyBwb2ludGVycyB0byBET1dOIGFuZCBVUCBhbmQgRU9GIG5vZGVzLgorICAgICAqCisgICAgICogIFRoaXMgc3RyZWFtIGtub3dzIGhvdyB0byBtYXJrL3JlbGVhc2UgZm9yIGJhY2t0cmFja2luZy4KKyAgICAgKgorICAgICAqICBUaGlzIHN0cmVhbSBpcyBtb3N0IHN1aXRhYmxlIGZvciB0cmVlIGludGVycHJldGVycyB0aGF0IG5lZWQgdG8KKyAgICAgKiAganVtcCBhcm91bmQgYSBsb3Qgb3IgZm9yIHRyZWUgcGFyc2VycyByZXF1aXJpbmcgc3BlZWQgKGF0IGNvc3Qgb2YgbWVtb3J5KS4KKyAgICAgKiAgVGhlcmUgaXMgc29tZSBkdXBsaWNhdGVkIGZ1bmN0aW9uYWxpdHkgaGVyZSB3aXRoIFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbQorICAgICAqICBidXQganVzdCBpbiBib29ra2VlcGluZywgbm90IHRyZWUgd2Fsa2luZyBldGMuLi4KKyAgICAgKgorICAgICAqICBUQVJHRVQgREVWRUxPUEVSUzoKKyAgICAgKgorICAgICAqICBUaGlzIGlzIHRoZSBvbGQgQ29tbW9uVHJlZU5vZGVTdHJlYW0gdGhhdCBidWZmZXJlZCB1cCBlbnRpcmUgbm9kZSBzdHJlYW0uCisgICAgICogIE5vIG5lZWQgdG8gaW1wbGVtZW50IHJlYWxseSBhcyBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0gaXMgbXVjaCBiZXR0ZXIKKyAgICAgKiAgYW5kIGNvdmVycyB3aGF0IHdlIG5lZWQuCisgICAgICoKKyAgICAgKiAgQHNlZSBDb21tb25UcmVlTm9kZVN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIDogSVRyZWVOb2RlU3RyZWFtLCBJVG9rZW5TdHJlYW1JbmZvcm1hdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgPSAxMDsKKworICAgICAgICBwcm90ZWN0ZWQgc2VhbGVkIGNsYXNzIFN0cmVhbUl0ZXJhdG9yIDogSUVudW1lcmF0b3I8b2JqZWN0PgorICAgICAgICB7CisgICAgICAgICAgICBCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIF9vdXRlcjsKKyAgICAgICAgICAgIGludCBfaW5kZXg7CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJlYW1JdGVyYXRvciggQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSBvdXRlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dGVyID0gb3V0ZXI7CisgICAgICAgICAgICAgICAgX2luZGV4ID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3I8b2JqZWN0PiBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgQ3VycmVudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfaW5kZXggPCBfb3V0ZXIubm9kZXMuQ291bnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vdXRlci5ub2Rlc1tfaW5kZXhdOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3V0ZXIuZW9mOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICAgICAjcmVnaW9uIElEaXNwb3NhYmxlIE1lbWJlcnMKKworICAgICAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAgICAgI3JlZ2lvbiBJRW51bWVyYXRvciBNZW1iZXJzCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIF9pbmRleCA8IF9vdXRlci5ub2Rlcy5Db3VudCApCisgICAgICAgICAgICAgICAgICAgIF9pbmRleCsrOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF9pbmRleCA8IF9vdXRlci5ub2Rlcy5Db3VudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgUmVzZXQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbmRleCA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIH0KKworICAgICAgICAvLyBhbGwgdGhlc2UgbmF2aWdhdGlvbiBub2RlcyBhcmUgc2hhcmVkIGFuZCBoZW5jZSB0aGV5CisgICAgICAgIC8vIGNhbm5vdCBjb250YWluIGFueSBsaW5lL2NvbHVtbiBpbmZvCisKKyAgICAgICAgcHJvdGVjdGVkIG9iamVjdCBkb3duOworICAgICAgICBwcm90ZWN0ZWQgb2JqZWN0IHVwOworICAgICAgICBwcm90ZWN0ZWQgb2JqZWN0IGVvZjsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGNvbXBsZXRlIG1hcHBpbmcgZnJvbSBzdHJlYW0gaW5kZXggdG8gdHJlZSBub2RlLgorICAgICAgICAgKiAgVGhpcyBidWZmZXIgaW5jbHVkZXMgcG9pbnRlcnMgdG8gRE9XTiwgVVAsIGFuZCBFT0Ygbm9kZXMuCisgICAgICAgICAqICBJdCBpcyBidWlsdCB1cG9uIGN0b3IgaW52b2NhdGlvbi4gIFRoZSBlbGVtZW50cyBhcmUgdHlwZQorICAgICAgICAgKiAgT2JqZWN0IGFzIHdlIGRvbid0IHdoYXQgdGhlIHRyZWVzIGxvb2sgbGlrZS48L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICBMb2FkIHVwb24gZmlyc3QgbmVlZCBvZiB0aGUgYnVmZmVyIHNvIHdlIGNhbiBzZXQgdG9rZW4gdHlwZXMKKyAgICAgICAgICogIG9mIGludGVyZXN0IGZvciByZXZlcnNlSW5kZXhpbmcuICBTbG93cyB1cyBkb3duIGEgd2VlIGJpdCB0bworICAgICAgICAgKiAgZG8gYWxsIG9mIHRoZSBpZiBwPT0tMSB0ZXN0aW5nIGV2ZXJ5d2hlcmUgdGhvdWdoLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIElMaXN0IG5vZGVzOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5QdWxsIG5vZGVzIGZyb20gd2hpY2ggdHJlZT88L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBvYmplY3Qgcm9vdDsKKworICAgICAgICAvKiogPHN1bW1hcnk+SUYgdGhpcyB0cmVlIChyb290KSB3YXMgY3JlYXRlZCBmcm9tIGEgdG9rZW4gc3RyZWFtLCB0cmFjayBpdC48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBJVG9rZW5TdHJlYW0gdG9rZW5zOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IHRyZWUgYWRhcHRvciB3YXMgdXNlZCB0byBidWlsZCB0aGVzZSB0cmVlczwvc3VtbWFyeT4gKi8KKyAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXB0b3I7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldXNlIHNhbWUgRE9XTiwgVVAgbmF2aWdhdGlvbiBub2RlcyB1bmxlc3MgdGhpcyBpcyB0cnVlPC9zdW1tYXJ5PiAqLworICAgICAgICBib29sIHVuaXF1ZU5hdmlnYXRpb25Ob2RlcyA9IGZhbHNlOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgaW5kZXggaW50byB0aGUgbm9kZXMgbGlzdCBvZiB0aGUgY3VycmVudCBub2RlIChuZXh0IG5vZGUKKyAgICAgICAgICogIHRvIGNvbnN1bWUpLiAgSWYgLTEsIG5vZGVzIGFycmF5IG5vdCBmaWxsZWQgeWV0Ljwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgcCA9IC0xOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS48L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdE1hcmtlcjsKKworICAgICAgICAvKiogPHN1bW1hcnk+U3RhY2sgb2YgaW5kZXhlcyB1c2VkIGZvciBwdXNoL3BvcCBjYWxsczwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0YWNrPGludD4gY2FsbHM7CisKKyAgICAgICAgcHVibGljIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0oIG9iamVjdCB0cmVlICkKKyAgICAgICAgICAgIDogdGhpcyggbmV3IENvbW1vblRyZWVBZGFwdG9yKCksIHRyZWUgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0cmVlICkKKyAgICAgICAgICAgIDogdGhpcyggYWRhcHRvciwgdHJlZSwgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0oIElUcmVlQWRhcHRvciBhZGFwdG9yLCBvYmplY3QgdHJlZSwgaW50IGluaXRpYWxCdWZmZXJTaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yb290ID0gdHJlZTsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICBub2RlcyA9IG5ldyBMaXN0PG9iamVjdD4oIGluaXRpYWxCdWZmZXJTaXplICk7CisgICAgICAgICAgICBkb3duID0gYWRhcHRvci5DcmVhdGUoIFRva2VuVHlwZXMuRG93biwgIkRPV04iICk7CisgICAgICAgICAgICB1cCA9IGFkYXB0b3IuQ3JlYXRlKCBUb2tlblR5cGVzLlVwLCAiVVAiICk7CisgICAgICAgICAgICBlb2YgPSBhZGFwdG9yLkNyZWF0ZSggVG9rZW5UeXBlcy5FbmRPZkZpbGUsICJFT0YiICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCAiQ2Fubm90IGRldGVybWluZSB0aGUgQ291bnQgYmVmb3JlIHRoZSBidWZmZXIgaXMgZmlsbGVkLiIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVzLkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFRyZWVTb3VyY2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5TdHJlYW0uU291cmNlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUb2tlblN0cmVhbSBUb2tlblN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW5zID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZUFkYXB0b3IgVHJlZUFkYXB0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGFwdG9yID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIFVuaXF1ZU5hdmlnYXRpb25Ob2RlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTGFzdFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmVlQWRhcHRvci5HZXRUb2tlbihMQigxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gTGFzdFJlYWxUb2tlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgSVRva2VuIHRva2VuOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gVHJlZUFkYXB0b3IuR2V0VG9rZW4oTEIoaSkpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRva2VuICE9IG51bGwgJiYgdG9rZW4uTGluZSA8PSAwKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXhMb29rQmVoaW5kCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWF4VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgLyoqIFdhbGsgdHJlZSB3aXRoIGRlcHRoLWZpcnN0LXNlYXJjaCBhbmQgZmlsbCBub2RlcyBidWZmZXIuCisgICAgICAgICAqICBEb24ndCBkbyBET1dOLCBVUCBub2RlcyBpZiBpdHMgYSBsaXN0ICh0IGlzIGlzTmlsKS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRmlsbEJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGxCdWZmZXIoIHJvb3QgKTsKKyAgICAgICAgICAgIC8vQ29uc29sZS5PdXQuV3JpdGVMaW5lKCAicmV2SW5kZXg9IiArIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCApOworICAgICAgICAgICAgcCA9IDA7IC8vIGJ1ZmZlciBvZiBub2RlcyBpbnRpYWxpemVkIG5vdworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBGaWxsQnVmZmVyKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbmlsID0gYWRhcHRvci5Jc05pbCggdCApOworICAgICAgICAgICAgaWYgKCAhbmlsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub2Rlcy5BZGQoIHQgKTsgLy8gYWRkIHRoaXMgbm9kZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkIERPV04gbm9kZSBpZiB0IGhhcyBjaGlsZHJlbgorICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQoIHQgKTsKKyAgICAgICAgICAgIGlmICggIW5pbCAmJiBuID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkTmF2aWdhdGlvbk5vZGUoIFRva2VuVHlwZXMuRG93biApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYW5kIG5vdyBhZGQgYWxsIGl0cyBjaGlsZHJlbgorICAgICAgICAgICAgZm9yICggaW50IGMgPSAwOyBjIDwgbjsgYysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBhZGFwdG9yLkdldENoaWxkKCB0LCBjICk7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlciggY2hpbGQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZCBVUCBub2RlIGlmIHQgaGFzIGNoaWxkcmVuCisgICAgICAgICAgICBpZiAoICFuaWwgJiYgbiA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZE5hdmlnYXRpb25Ob2RlKCBUb2tlblR5cGVzLlVwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogV2hhdCBpcyB0aGUgc3RyZWFtIGluZGV4IGZvciBub2RlPyAwLi5uLTEKKyAgICAgICAgICogIFJldHVybiAtMSBpZiBub2RlIG5vdCBmb3VuZC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBHZXROb2RlSW5kZXgoIG9iamVjdCBub2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBub2Rlcy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgdCA9IG5vZGVzW2ldOworICAgICAgICAgICAgICAgIGlmICggdCA9PSBub2RlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBcyB3ZSBmbGF0dGVuIHRoZSB0cmVlLCB3ZSB1c2UgVVAsIERPV04gbm9kZXMgdG8gcmVwcmVzZW50CisgICAgICAgICAqICB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworICAgICAgICAgKiAgc28gaW5zdGFudGlhdGUgbmV3IG9uZXMgd2hlbiB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMgaXMgdHJ1ZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQWRkTmF2aWdhdGlvbk5vZGUoIGludCB0dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBuYXZOb2RlID0gbnVsbDsKKyAgICAgICAgICAgIGlmICggdHR5cGUgPT0gVG9rZW5UeXBlcy5Eb3duICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIFVuaXF1ZU5hdmlnYXRpb25Ob2RlcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYXZOb2RlID0gYWRhcHRvci5DcmVhdGUoIFRva2VuVHlwZXMuRG93biwgIkRPV04iICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5hdk5vZGUgPSBkb3duOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIFVuaXF1ZU5hdmlnYXRpb25Ob2RlcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuYXZOb2RlID0gYWRhcHRvci5DcmVhdGUoIFRva2VuVHlwZXMuVXAsICJVUCIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmF2Tm9kZSA9IHVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVzLkFkZCggbmF2Tm9kZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IHRoaXNbaW50IGldCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiggIkNhbm5vdCBnZXQgdGhlIG5vZGUgYXQgaW5kZXggaSBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBmaWxsZWQuIiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTFQoIGludCBrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGsgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGsgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTEIoIC1rICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnQoIkxUKHA9IitwKyIsIitrKyIpPSIpOworICAgICAgICAgICAgaWYgKCAoIHAgKyBrIC0gMSApID49IG5vZGVzLkNvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW9mOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGVzW3AgKyBrIC0gMV07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgR2V0Q3VycmVudFN5bWJvbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMVCggMSApOworICAgICAgICB9CisKKyNpZiBmYWxzZQorICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgZ2V0TGFzdFRyZWVOb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSBJbmRleDsKKyAgICAgICAgICAgIGlmICggaSA+PSBzaXplKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsgLy8gaWYgYXQgRU9GLCBoYXZlIHRvIHN0YXJ0IG9uZSBiYWNrCisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJzdGFydCBsYXN0IG5vZGU6ICIgKyBpICsgIiBzaXplPT0iICsgbm9kZXMuQ291bnQgKTsKKyAgICAgICAgICAgIHdoaWxlICggaSA+PSAwICYmCisgICAgICAgICAgICAgICAgKCBhZGFwdG9yLmdldFR5cGUoIHRoaXNbaV0gKSA9PSBUb2tlblR5cGVzLkVPRiB8fAorICAgICAgICAgICAgICAgICBhZGFwdG9yLmdldFR5cGUoIHRoaXNbaV0gKSA9PSBUb2tlblR5cGVzLlVQIHx8CisgICAgICAgICAgICAgICAgIGFkYXB0b3IuZ2V0VHlwZSggdGhpc1tpXSApID09IFRva2VuVHlwZXMuRE9XTiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJzdG9wIGF0IG5vZGU6ICIgKyBpICsgIiAiICsgbm9kZXNbaV0gKTsKKyAgICAgICAgICAgIHJldHVybiBub2Rlc1tpXTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5Pkxvb2sgYmFja3dhcmRzIGsgbm9kZXM8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIG9iamVjdCBMQiggaW50IGsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGsgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoICggcCAtIGsgKSA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGVzW3AgLSBrXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IExBKCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkdldFR5cGUoIExUKCBpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBNYXJrKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0TWFya2VyID0gSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gbGFzdE1hcmtlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsZWFzZSggaW50IG1hcmtlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIHJlc291cmNlcyB0byByZWxlYXNlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJld2luZCggaW50IG1hcmtlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlZWsoIG1hcmtlciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXdpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBTZWVrKCBsYXN0TWFya2VyICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNlZWsoIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWFrZSBzdHJlYW0ganVtcCB0byBhIG5ldyBsb2NhdGlvbiwgc2F2aW5nIG9sZCBsb2NhdGlvbi4KKyAgICAgICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFB1c2goIGludCBpbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY2FsbHMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbHMgPSBuZXcgU3RhY2s8aW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FsbHMuUHVzaCggcCApOyAvLyBzYXZlIGN1cnJlbnQgaW5kZXgKKyAgICAgICAgICAgIFNlZWsoIGluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTZWVrIGJhY2sgdG8gcHJldmlvdXMgaW5kZXggc2F2ZWQgZHVyaW5nIGxhc3QgcHVzaCgpIGNhbGwuCisgICAgICAgICAqICBSZXR1cm4gdG9wIG9mIHN0YWNrIChyZXR1cm4gaW5kZXgpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFBvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXQgPSBjYWxscy5Qb3AoKTsKKyAgICAgICAgICAgIFNlZWsoIHJldCApOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgIGxhc3RNYXJrZXIgPSAwOworICAgICAgICAgICAgaWYgKCBjYWxscyAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxscy5DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUVudW1lcmF0b3I8b2JqZWN0PiBJdGVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcCA9PSAtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbUl0ZXJhdG9yKCB0aGlzICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUUkVFIFJFV1JJVEUgSU5URVJGQUNFCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBSZXBsYWNlQ2hpbGRyZW4oIG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBhcmVudCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGFwdG9yLlJlcGxhY2VDaGlsZHJlbiggcGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+VXNlZCBmb3IgdGVzdGluZywganVzdCByZXR1cm4gdGhlIHRva2VuIHR5cGUgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9Ub2tlblR5cGVTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHAgPT0gLTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG5vZGVzLkNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggIiAiICk7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggYWRhcHRvci5HZXRUeXBlKCB0ICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5EZWJ1Z2dpbmc8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBUb1Rva2VuU3RyaW5nKCBpbnQgc3RhcnQsIGludCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxsQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHN0YXJ0OyBpIDwgbm9kZXMuQ291bnQgJiYgaSA8PSBzdG9wOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggIiAiICk7CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggYWRhcHRvci5HZXRUb2tlbiggdCApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9TdHJpbmcoIG9iamVjdCBzdGFydCwgb2JqZWN0IHN0b3AgKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoICJ0b1N0cmluZyIgKTsKKyAgICAgICAgICAgIGlmICggc3RhcnQgPT0gbnVsbCB8fCBzdG9wID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBwID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiggIkJ1ZmZlciBpcyBub3QgeWV0IGZpbGxlZC4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0NvbnNvbGUuT3V0LldyaXRlTGluZSggInN0b3A6ICIgKyBzdG9wICk7CisgICAgICAgICAgICBpZiAoIHN0YXJ0IGlzIENvbW1vblRyZWUgKQorICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlKCAidG9TdHJpbmc6ICIgKyAoIChDb21tb25UcmVlKXN0YXJ0ICkuVG9rZW4gKyAiLCAiICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ29uc29sZS5PdXQuV3JpdGVMaW5lKCBzdGFydCApOworICAgICAgICAgICAgaWYgKCBzdG9wIGlzIENvbW1vblRyZWUgKQorICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LldyaXRlTGluZSggKCAoQ29tbW9uVHJlZSlzdG9wICkuVG9rZW4gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBDb25zb2xlLk91dC5Xcml0ZUxpbmUoIHN0b3AgKTsKKyAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdGhlIHRva2VuIHN0cmVhbSwgdXNlIHRoYXQgdG8gZHVtcCB0ZXh0IGluIG9yZGVyCisgICAgICAgICAgICBpZiAoIHRva2VucyAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYmVnaW5Ub2tlbkluZGV4ID0gYWRhcHRvci5HZXRUb2tlblN0YXJ0SW5kZXgoIHN0YXJ0ICk7CisgICAgICAgICAgICAgICAgaW50IGVuZFRva2VuSW5kZXggPSBhZGFwdG9yLkdldFRva2VuU3RvcEluZGV4KCBzdG9wICk7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhIHRyZWUsIHVzZSBzdGFydC9zdG9wIGluZGV4IGZyb20gc3RhcnQgbm9kZQorICAgICAgICAgICAgICAgIC8vIGVsc2UgdXNlIHRva2VuIHJhbmdlIGZyb20gc3RhcnQvc3RvcCBub2RlcworICAgICAgICAgICAgICAgIGlmICggYWRhcHRvci5HZXRUeXBlKCBzdG9wICkgPT0gVG9rZW5UeXBlcy5VcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmRUb2tlbkluZGV4ID0gYWRhcHRvci5HZXRUb2tlblN0b3BJbmRleCggc3RhcnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGFkYXB0b3IuR2V0VHlwZSggc3RvcCApID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuZFRva2VuSW5kZXggPSBDb3VudCAtIDI7IC8vIGRvbid0IHVzZSBFT0YKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucy5Ub1N0cmluZyggYmVnaW5Ub2tlbkluZGV4LCBlbmRUb2tlbkluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3YWxrIG5vZGVzIGxvb2tpbmcgZm9yIHN0YXJ0CisgICAgICAgICAgICBvYmplY3QgdCA9IG51bGw7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKCA7IGkgPCBub2Rlcy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCB0ID09IHN0YXJ0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdyB3YWxrIHVudGlsIHdlIHNlZSBzdG9wLCBmaWxsaW5nIHN0cmluZyBidWZmZXIgd2l0aCB0ZXh0CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICB3aGlsZSAoIHQgIT0gc3RvcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHRleHQgPSBhZGFwdG9yLkdldFRleHQoIHQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHRleHQgPT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIiAiICsgYWRhcHRvci5HZXRUeXBlKCB0ICkuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggdGV4dCApOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB0ID0gbm9kZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpbmNsdWRlIHN0b3Agbm9kZSB0b28KKyAgICAgICAgICAgIHN0cmluZyB0ZXh0MiA9IGFkYXB0b3IuR2V0VGV4dCggc3RvcCApOworICAgICAgICAgICAgaWYgKCB0ZXh0MiA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXh0MiA9ICIgIiArIGFkYXB0b3IuR2V0VHlwZSggc3RvcCApLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuQXBwZW5kKCB0ZXh0MiApOworICAgICAgICAgICAgcmV0dXJuIGJ1Zi5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvQ29tbW9uRXJyb3JOb2RlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvQ29tbW9uRXJyb3JOb2RlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDkxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Db21tb25FcnJvck5vZGUuY3MKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworCisgICAgLyoqIDxzdW1tYXJ5PkEgbm9kZSByZXByZXNlbnRpbmcgZXJyb25lb3VzIHRva2VuIHJhbmdlIGluIHRva2VuIHN0cmVhbTwvc3VtbWFyeT4gKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQ29tbW9uRXJyb3JOb2RlIDogQ29tbW9uVHJlZQorICAgIHsKKyAgICAgICAgcHVibGljIElJbnRTdHJlYW0gaW5wdXQ7CisgICAgICAgIHB1YmxpYyBJVG9rZW4gc3RhcnQ7CisgICAgICAgIHB1YmxpYyBJVG9rZW4gc3RvcDsKKyAgICAgICAgcHVibGljIFJlY29nbml0aW9uRXhjZXB0aW9uIHRyYXBwZWRFeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIENvbW1vbkVycm9yTm9kZSggSVRva2VuU3RyZWFtIGlucHV0LCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigic3RhcnQ6ICIrc3RhcnQrIiwgc3RvcDogIitzdG9wKTsKKyAgICAgICAgICAgIGlmICggc3RvcCA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICggc3RvcC5Ub2tlbkluZGV4IDwgc3RhcnQuVG9rZW5JbmRleCAmJgorICAgICAgICAgICAgICAgICAgc3RvcC5UeXBlICE9IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyByZXN5bmMgZG9lcyBub3QgY29uc3VtZSBhIHRva2VuICh3aGVuIExUKDEpIGlzCisgICAgICAgICAgICAgICAgLy8gaW4gZm9sbG93IHNldC4gIFNvLCBzdG9wIHdpbGwgYmUgMSB0byBsZWZ0IHRvIHN0YXJ0LiBhZGp1c3QuCisgICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgY2FzZSB3aGVyZSBzdGFydCBpcyB0aGUgZmlyc3QgdG9rZW4gYW5kIG5vIHRva2VuCisgICAgICAgICAgICAgICAgLy8gaXMgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5OyBMVCgtMSkgd2lsbCByZXR1cm4gbnVsbC4KKyAgICAgICAgICAgICAgICBzdG9wID0gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgICAgICB0aGlzLnN0b3AgPSBzdG9wOworICAgICAgICAgICAgdGhpcy50cmFwcGVkRXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gUHJvcGVydGllcworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc05pbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBiYWRUZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXJ0IGlzIElUb2tlbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9ICggKElUb2tlbilzdGFydCApLlRva2VuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gKCAoSVRva2VuKXN0b3AgKS5Ub2tlbkluZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAoICggKElUb2tlbilzdG9wICkuVHlwZSA9PSBUb2tlblR5cGVzLkVuZE9mRmlsZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSAoIChJVG9rZW5TdHJlYW0paW5wdXQgKS5Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiYWRUZXh0ID0gKCAoSVRva2VuU3RyZWFtKWlucHV0ICkuVG9TdHJpbmcoIGksIGogKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHN0YXJ0IGlzIElUcmVlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJhZFRleHQgPSAoIChJVHJlZU5vZGVTdHJlYW0paW5wdXQgKS5Ub1N0cmluZyggc3RhcnQsIHN0b3AgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGVvcGxlIHNob3VsZCBzdWJjbGFzcyBpZiB0aGV5IGFsdGVyIHRoZSB0cmVlIHR5cGUgc28gdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IG9uZSBpcyBmb3Igc3VyZSBjb3JyZWN0LgorICAgICAgICAgICAgICAgICAgICBiYWRUZXh0ID0gIjx1bmtub3duPiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBiYWRUZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGVzLkludmFsaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdHJhcHBlZEV4Y2VwdGlvbiBpcyBNaXNzaW5nVG9rZW5FeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiPG1pc3NpbmcgdHlwZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICggKE1pc3NpbmdUb2tlbkV4Y2VwdGlvbil0cmFwcGVkRXhjZXB0aW9uICkuTWlzc2luZ1R5cGUgKworICAgICAgICAgICAgICAgICAgICAgICAiPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggdHJhcHBlZEV4Y2VwdGlvbiBpcyBVbndhbnRlZFRva2VuRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxleHRyYW5lb3VzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgKCAoVW53YW50ZWRUb2tlbkV4Y2VwdGlvbil0cmFwcGVkRXhjZXB0aW9uICkuVW5leHBlY3RlZFRva2VuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVzeW5jPSIgKyBUZXh0ICsgIj4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHRyYXBwZWRFeGNlcHRpb24gaXMgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxtaXNtYXRjaGVkIHRva2VuOiAiICsgdHJhcHBlZEV4Y2VwdGlvbi5Ub2tlbiArICIsIHJlc3luYz0iICsgVGV4dCArICI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB0cmFwcGVkRXhjZXB0aW9uIGlzIE5vVmlhYmxlQWx0RXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjx1bmV4cGVjdGVkOiAiICsgdHJhcHBlZEV4Y2VwdGlvbi5Ub2tlbiArCisgICAgICAgICAgICAgICAgICAgICAgICIsIHJlc3luYz0iICsgVGV4dCArICI+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiPGVycm9yOiAiICsgVGV4dCArICI+IjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0NvbW1vblRyZWUuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Db21tb25UcmVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjliZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Db21tb25UcmVlLmNzCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiA9IFN5c3RlbS5Bcmd1bWVudE51bGxFeGNlcHRpb247CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgdHJlZSBub2RlIHRoYXQgaXMgd3JhcHBlciBmb3IgYSBUb2tlbiBvYmplY3QuICBBZnRlciAzLjAgcmVsZWFzZQorICAgICAqICB3aGlsZSBidWlsZGluZyB0cmVlIHJld3JpdGUgc3R1ZmYsIGl0IGJlY2FtZSBjbGVhciB0aGF0IGNvbXB1dGluZworICAgICAqICBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IGlzIHZlcnkgZGlmZmljdWx0IGFuZCBjdW1iZXJzb21lLiAgQmV0dGVyIHRvCisgICAgICogIHNwZW5kIHRoZSBzcGFjZSBpbiBldmVyeSB0cmVlIG5vZGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGVzZSBleHRyYQorICAgICAqICBmaWVsZHMsIGl0J3MgZWFzeSB0byBjdXQgdGhlbSBvdXQgaW4geW91ciBvd24gQmFzZVRyZWUgc3ViY2xhc3MuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgQ29tbW9uVHJlZSA6IEJhc2VUcmVlCisgICAgeworICAgICAgICAvKiogPHN1bW1hcnk+QSBzaW5nbGUgdG9rZW4gaXMgdGhlIHBheWxvYWQ8L3N1bW1hcnk+ICovCisgICAgICAgIHByaXZhdGUgSVRva2VuIF90b2tlbjsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IHRva2VuIGluZGV4ZXMgYnJhY2tldCBhbGwgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUKKyAgICAgICAgICogIGFuZCBiZWxvdz8KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgc3RhcnRJbmRleCA9IC0xOworICAgICAgICBwcm90ZWN0ZWQgaW50IHN0b3BJbmRleCA9IC0xOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaG8gaXMgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZTsgaWYgbnVsbCwgaW1wbGllcyBub2RlIGlzIHJvb3Q8L3N1bW1hcnk+ICovCisgICAgICAgIENvbW1vblRyZWUgcGFyZW50OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5XaGF0IGluZGV4IGlzIHRoaXMgbm9kZSBpbiB0aGUgY2hpbGQgbGlzdD8gUmFuZ2U6IDAuLm4tMTwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IGNoaWxkSW5kZXggPSAtMTsKKworICAgICAgICBwdWJsaWMgQ29tbW9uVHJlZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25UcmVlKCBDb21tb25UcmVlIG5vZGUgKQorICAgICAgICAgICAgOiBiYXNlKCBub2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJub2RlIik7CisKKyAgICAgICAgICAgIHRoaXMuVG9rZW4gPSBub2RlLlRva2VuOworICAgICAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gbm9kZS5zdGFydEluZGV4OworICAgICAgICAgICAgdGhpcy5zdG9wSW5kZXggPSBub2RlLnN0b3BJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25UcmVlKCBJVG9rZW4gdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuVG9rZW4gPSB0OworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBDaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBUb2tlbiA9PSBudWxsIHx8IFRva2VuLkNoYXJQb3NpdGlvbkluTGluZSA9PSAtMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIENoaWxkQ291bnQgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGlsZHJlblswXS5DaGFyUG9zaXRpb25JbkxpbmU7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2UuQ2hhclBvc2l0aW9uSW5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IENoaWxkSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzTmlsCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbiA9PSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBMaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggVG9rZW4gPT0gbnVsbCB8fCBUb2tlbi5MaW5lID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBDaGlsZENvdW50ID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hpbGRyZW5bMF0uTGluZTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW4uTGluZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZS5MaW5lID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRyZWUgUGFyZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcmVudCA9IChDb21tb25UcmVlKXZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggVG9rZW4gPT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuLlRleHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElUb2tlbiBUb2tlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Rva2VuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdG9rZW4gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVG9rZW5TdGFydEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3RhcnRJbmRleCA9PSAtMSAmJiBUb2tlbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuLlRva2VuSW5kZXg7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUb2tlblN0b3BJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0b3BJbmRleCA9PSAtMSAmJiBUb2tlbiAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5Ub2tlbkluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RvcEluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9wSW5kZXggPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIFRva2VuID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlcy5JbnZhbGlkOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuLlR5cGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJVHJlZSBEdXBOb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tb25UcmVlKCB0aGlzICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBGb3IgZXZlcnkgbm9kZSBpbiB0aGlzIHN1YnRyZWUsIG1ha2Ugc3VyZSBpdCdzIHN0YXJ0L3N0b3AgdG9rZW4ncworICAgICAgICAgKiAgYXJlIHNldC4gIFdhbGsgZGVwdGggZmlyc3QsIHZpc2l0IGJvdHRvbSB1cC4gIE9ubHkgdXBkYXRlcyBub2RlcworICAgICAgICAgKiAgd2l0aCBhdCBsZWFzdCBvbmUgdG9rZW4gaW5kZXggJmx0OyAwLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBTZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBDaGlsZHJlbiA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXJ0SW5kZXggPCAwIHx8IHN0b3BJbmRleCA8IDAgKQorICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gc3RvcEluZGV4ID0gVG9rZW4uVG9rZW5JbmRleDsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yZWFjaCAoSVRyZWUgY2hpbGRUcmVlIGluIENoaWxkcmVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbW1vblRyZWUgY29tbW9uVHJlZSA9IGNoaWxkVHJlZSBhcyBDb21tb25UcmVlOworICAgICAgICAgICAgICAgIGlmIChjb21tb25UcmVlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY29tbW9uVHJlZS5TZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhcnRJbmRleCA+PSAwICYmIHN0b3BJbmRleCA+PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgc2V0CisKKyAgICAgICAgICAgIGlmICggQ2hpbGRyZW4uQ291bnQgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVHJlZSBmaXJzdENoaWxkID0gQ2hpbGRyZW5bMF07CisgICAgICAgICAgICAgICAgSVRyZWUgbGFzdENoaWxkID0gQ2hpbGRyZW5bQ2hpbGRyZW4uQ291bnQgLSAxXTsKKyAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gZmlyc3RDaGlsZC5Ub2tlblN0YXJ0SW5kZXg7CisgICAgICAgICAgICAgICAgc3RvcEluZGV4ID0gbGFzdENoaWxkLlRva2VuU3RvcEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc05pbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5pbCI7CisKKyAgICAgICAgICAgIGlmIChUeXBlID09IFRva2VuVHlwZXMuSW52YWxpZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxlcnJvcm5vZGU+IjsKKworICAgICAgICAgICAgaWYgKFRva2VuID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgcmV0dXJuIFRva2VuLlRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Db21tb25UcmVlQWRhcHRvci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0NvbW1vblRyZWVBZGFwdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Yzc1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Db21tb25UcmVlQWRhcHRvci5jcwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBUcmVlQWRhcHRvciB0aGF0IHdvcmtzIHdpdGggYW55IFRyZWUgaW1wbGVtZW50YXRpb24uICBJdCBwcm92aWRlcworICAgICAqICByZWFsbHkganVzdCBmYWN0b3J5IG1ldGhvZHM7IGFsbCB0aGUgd29yayBpcyBkb25lIGJ5IEJhc2VUcmVlQWRhcHRvci4KKyAgICAgKiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBkaWZmZXJlbnQgdG9rZW5zIGNyZWF0ZWQgdGhhbiBDbGFzc2ljVG9rZW4KKyAgICAgKiAgb2JqZWN0cywgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBhbmQgdGhlbiBzZXQgdGhlIHBhcnNlciB0cmVlIGFkYXB0b3IgdG8KKyAgICAgKiAgdXNlIHlvdXIgc3ViY2xhc3MuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgVG8gZ2V0IHlvdXIgcGFyc2VyIHRvIGJ1aWxkIG5vZGVzIG9mIGEgZGlmZmVyZW50IHR5cGUsIG92ZXJyaWRlCisgICAgICogIGNyZWF0ZShUb2tlbiksIGVycm9yTm9kZSgpLCBhbmQgdG8gYmUgc2FmZSwgWW91clRyZWVDbGFzcy5kdXBOb2RlKCkuCisgICAgICogIGR1cE5vZGUgaXMgY2FsbGVkIHRvIGR1cGxpY2F0ZSBub2RlcyBkdXJpbmcgcmV3cml0ZSBvcGVyYXRpb25zLgorICAgICAqICA8L3JlbWFya3M+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIENvbW1vblRyZWVBZGFwdG9yIDogQmFzZVRyZWVBZGFwdG9yCisgICAgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IENyZWF0ZSggSVRva2VuIHBheWxvYWQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1vblRyZWUoIHBheWxvYWQgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgICAgICogIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgICAgICAgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIHlvdSBjYXJlIHdoYXQgdGhlIHRva2VuIHBheWxvYWQgb2JqZWN0cycgdHlwZSBpcywgeW91IHNob3VsZAorICAgICAgICAgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElUb2tlbiBDcmVhdGVUb2tlbiggaW50IHRva2VuVHlwZSwgc3RyaW5nIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1vblRva2VuKCB0b2tlblR5cGUsIHRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgICAgICogIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgICAgICAgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgICAgICAgICAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICAgICAgICAgKiAgdG9rZW5zIHRvIEJMT0NLIGV0Yy4uLiAgWW91J2xsIHNlZQorICAgICAgICAgKgorICAgICAgICAgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICAgICAgICAgKgorICAgICAgICAgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRva2VuIENyZWF0ZVRva2VuKCBJVG9rZW4gZnJvbVRva2VuICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tb25Ub2tlbiggZnJvbVRva2VuICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IGlzIHRoZSBUb2tlbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlPyAgSWYKKyAgICAgICAgICogIHlvdSBhcmUgbm90IHVzaW5nIENvbW1vblRyZWUsIHRoZW4geW91IG11c3QKKyAgICAgICAgICogIG92ZXJyaWRlIHRoaXMgaW4geW91ciBvd24gYWRhcHRvci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJVG9rZW4gR2V0VG9rZW4oIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0IGlzIENvbW1vblRyZWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoIChDb21tb25UcmVlKXQgKS5Ub2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBubyBpZGVhIHdoYXQgdG8gZG8KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvQ29tbW9uVHJlZU5vZGVTdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjNDZiZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmNzCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLk1pc2M7CisKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKyAgICB1c2luZyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gPSBTeXN0ZW0uTm90U3VwcG9ydGVkRXhjZXB0aW9uOworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIENvbW1vblRyZWVOb2RlU3RyZWFtIDogTG9va2FoZWFkU3RyZWFtPG9iamVjdD4sIElUcmVlTm9kZVN0cmVhbQorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgPSAxMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+UHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/PC9zdW1tYXJ5PiAqLworICAgICAgICBvYmplY3QgX3Jvb3Q7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PklmIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuPC9zdW1tYXJ5PiAqLworICAgICAgICBwcm90ZWN0ZWQgSVRva2VuU3RyZWFtIHRva2VuczsKKworICAgICAgICAvKiogPHN1bW1hcnk+V2hhdCB0cmVlIGFkYXB0b3Igd2FzIHVzZWQgdG8gYnVpbGQgdGhlc2UgdHJlZXM8L3N1bW1hcnk+ICovCisgICAgICAgIFtTeXN0ZW0uTm9uU2VyaWFsaXplZF0KKyAgICAgICAgSVRyZWVBZGFwdG9yIF9hZGFwdG9yOworCisgICAgICAgIC8qKiBUaGUgdHJlZSBpdGVyYXRvciB3ZSBhcmUgdXNpbmcgKi8KKyAgICAgICAgVHJlZUl0ZXJhdG9yIF9pdDsKKworICAgICAgICAvKiogPHN1bW1hcnk+U3RhY2sgb2YgaW5kZXhlcyB1c2VkIGZvciBwdXNoL3BvcCBjYWxsczwvc3VtbWFyeT4gKi8KKyAgICAgICAgU3RhY2s8aW50PiBfY2FsbHM7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRyZWUgKG5pbCBBIEIgQykgdHJlZXMgbGlrZSBmbGF0IEEgQiBDIHN0cmVhbXM8L3N1bW1hcnk+ICovCisgICAgICAgIGJvb2wgX2hhc05pbFJvb3QgPSBmYWxzZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+VHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC48L3N1bW1hcnk+ICovCisgICAgICAgIGludCBfbGV2ZWwgPSAwOworCisgICAgICAgIHB1YmxpYyBDb21tb25UcmVlTm9kZVN0cmVhbSggb2JqZWN0IHRyZWUgKQorICAgICAgICAgICAgOiB0aGlzKCBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSwgdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tb25UcmVlTm9kZVN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIG9iamVjdCB0cmVlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHRyZWU7CisgICAgICAgICAgICB0aGlzLl9hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgICAgIF9pdCA9IG5ldyBUcmVlSXRlcmF0b3IoIGFkYXB0b3IsIF9yb290ICk7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFByb3BlcnRpZXMKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU291cmNlTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIFRva2VuU3RyZWFtID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblN0cmVhbS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuU3RyZWFtIFRva2VuU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2tlbnMgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElUcmVlQWRhcHRvciBUcmVlQWRhcHRvcgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2FkYXB0b3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hZGFwdG9yID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgVHJlZVNvdXJjZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIFVuaXF1ZU5hdmlnYXRpb25Ob2RlcworICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsZWFyKCk7CisgICAgICAgICAgICBfaXQuUmVzZXQoKTsKKyAgICAgICAgICAgIF9oYXNOaWxSb290ID0gZmFsc2U7CisgICAgICAgICAgICBfbGV2ZWwgPSAwOworICAgICAgICAgICAgaWYgKCBfY2FsbHMgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgX2NhbGxzLkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IE5leHRFbGVtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2l0Lk1vdmVOZXh0KCk7CisgICAgICAgICAgICBvYmplY3QgdCA9IF9pdC5DdXJyZW50OworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInB1bGxlZCAiK2FkYXB0b3IuZ2V0VHlwZSh0KSk7CisgICAgICAgICAgICBpZiAoIHQgPT0gX2l0LnVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICBpZiAoIF9sZXZlbCA9PSAwICYmIF9oYXNOaWxSb290ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9pdC5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2l0LkN1cnJlbnQ7IC8vIGRvbid0IGdpdmUgbGFzdCBVUDsgZ2V0IEVPRgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB0ID09IF9pdC5kb3duICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBfbGV2ZWwgPT0gMCAmJiBUcmVlQWRhcHRvci5Jc05pbCggdCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBuaWwgcm9vdCwgc2NhcmYgbmlsLCBET1dOCisgICAgICAgICAgICAgICAgX2hhc05pbFJvb3QgPSB0cnVlOworICAgICAgICAgICAgICAgIF9pdC5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHQgPSBfaXQuQ3VycmVudDsgLy8gdCBpcyBub3cgRE9XTiwgc28gZ2V0IGZpcnN0IHJlYWwgbm9kZSBuZXh0CisgICAgICAgICAgICAgICAgX2xldmVsKys7CisgICAgICAgICAgICAgICAgX2l0Lk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgdCA9IF9pdC5DdXJyZW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzRW5kT2ZGaWxlKG9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJlZUFkYXB0b3IuR2V0VHlwZShvKSA9PSBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGludCBMQSggaW50IGkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJlZUFkYXB0b3IuR2V0VHlwZSggTFQoIGkgKSApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICAgICAqICBTd2l0Y2ggYmFjayB3aXRoIHBvcCgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBQdXNoKCBpbnQgaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIF9jYWxscyA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2FsbHMgPSBuZXcgU3RhY2s8aW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2NhbGxzLlB1c2goIF9wICk7IC8vIHNhdmUgY3VycmVudCBpbmRleAorICAgICAgICAgICAgU2VlayggaW5kZXggKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBTZWVrIGJhY2sgdG8gcHJldmlvdXMgaW5kZXggc2F2ZWQgZHVyaW5nIGxhc3QgcHVzaCgpIGNhbGwuCisgICAgICAgICAqICBSZXR1cm4gdG9wIG9mIHN0YWNrIChyZXR1cm4gaW5kZXgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IFBvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXQgPSBfY2FsbHMuUG9wKCk7CisgICAgICAgICAgICBTZWVrKCByZXQgKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFRyZWUgcmV3cml0ZSBpbnRlcmZhY2UKKworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlcGxhY2VDaGlsZHJlbiggb2JqZWN0IHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcGFyZW50ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyZWVBZGFwdG9yLlJlcGxhY2VDaGlsZHJlbiggcGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nKCBvYmplY3Qgc3RhcnQsIG9iamVjdCBzdG9wICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UnbGwgaGF2ZSB0byB3YWxrIGZyb20gc3RhcnQgdG8gc3RvcCBpbiB0cmVlOyB3ZSdyZSBub3Qga2VlcGluZworICAgICAgICAgICAgLy8gYSBjb21wbGV0ZSBub2RlIHN0cmVhbSBidWZmZXIKKyAgICAgICAgICAgIHJldHVybiAibi9hIjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Gb3IgZGVidWdnaW5nOyBkZXN0cnVjdGl2ZTogbW92ZXMgdHJlZSBpdGVyYXRvciB0byBlbmQuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgVG9Ub2tlblR5cGVTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBSZXNldCgpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgb2JqZWN0IG8gPSBMVCggMSApOworICAgICAgICAgICAgaW50IHR5cGUgPSBUcmVlQWRhcHRvci5HZXRUeXBlKCBvICk7CisgICAgICAgICAgICB3aGlsZSAoIHR5cGUgIT0gVG9rZW5UeXBlcy5FbmRPZkZpbGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoICIgIiApOworICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmQoIHR5cGUgKTsKKyAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgbyA9IExUKCAxICk7CisgICAgICAgICAgICAgICAgdHlwZSA9IFRyZWVBZGFwdG9yLkdldFR5cGUoIG8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0RvdFRyZWVHZW5lcmF0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Eb3RUcmVlR2VuZXJhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzViNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9Eb3RUcmVlR2VuZXJhdG9yLmNzCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICAvKiogQSB1dGlsaXR5IGNsYXNzIHRvIGdlbmVyYXRlIERPVCBkaWFncmFtcyAoZ3JhcGh2aXopIGZyb20KKyAgICAgKiAgYXJiaXRyYXJ5IHRyZWVzLiAgWW91IGNhbiBwYXNzIGluIHlvdXIgb3duIHRlbXBsYXRlcyBhbmQKKyAgICAgKiAgY2FuIHBhc3MgaW4gYW55IGtpbmQgb2YgdHJlZSBvciB1c2UgVHJlZSBpbnRlcmZhY2UgbWV0aG9kLgorICAgICAqICBJIHdhbnRlZCB0aGlzIHNlcGFyYXRvciBzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGluY2x1ZGUKKyAgICAgKiAgU1QganVzdCB0byB1c2UgdGhlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKiBwYWNrYWdlLgorICAgICAqICBUaGlzIGlzIGEgc2V0IG9mIG5vbi1zdGF0aWMgbWV0aG9kcyBzbyB5b3UgY2FuIHN1YmNsYXNzCisgICAgICogIHRvIG92ZXJyaWRlLiAgRm9yIGV4YW1wbGUsIGhlcmUgaXMgYW4gaW52b2NhdGlvbjoKKyAgICAgKgorICAgICAqICAgICAgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUklucHV0U3RyZWFtKFN5c3RlbS5pbik7CisgICAgICogICAgICBUTGV4ZXIgbGV4ID0gbmV3IFRMZXhlcihpbnB1dCk7CisgICAgICogICAgICBDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTsKKyAgICAgKiAgICAgIFRQYXJzZXIgcGFyc2VyID0gbmV3IFRQYXJzZXIodG9rZW5zKTsKKyAgICAgKiAgICAgIFRQYXJzZXIuZV9yZXR1cm4gciA9IHBhcnNlci5lKCk7CisgICAgICogICAgICBUcmVlIHQgPSAoVHJlZSlyLnRyZWU7CisgICAgICogICAgICBTeXN0ZW0ub3V0LnByaW50bG4odC50b1N0cmluZ1RyZWUoKSk7CisgICAgICogICAgICBET1RUcmVlR2VuZXJhdG9yIGdlbiA9IG5ldyBET1RUcmVlR2VuZXJhdG9yKCk7CisgICAgICogICAgICBTdHJpbmdUZW1wbGF0ZSBzdCA9IGdlbi50b0RPVCh0KTsKKyAgICAgKiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdCk7CisgICAgICovCisgICAgcHVibGljIGNsYXNzIERvdFRyZWVHZW5lcmF0b3IKKyAgICB7CisgICAgICAgIHJlYWRvbmx5IHN0cmluZ1tdIEhlYWRlckxpbmVzID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGlncmFwaCB7IiwKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAiXHRvcmRlcmluZz1vdXQ7IiwKKyAgICAgICAgICAgICAgICAiXHRyYW5rc2VwPS40OyIsCisgICAgICAgICAgICAgICAgIlx0Ymdjb2xvcj1cImxpZ2h0Z3JleVwiOyBub2RlIFtzaGFwZT1ib3gsIGZpeGVkc2l6ZT1mYWxzZSwgZm9udHNpemU9MTIsIGZvbnRuYW1lPVwiSGVsdmV0aWNhLWJvbGRcIiwgZm9udGNvbG9yPVwiYmx1ZVwiIiwKKyAgICAgICAgICAgICAgICAiXHRcdHdpZHRoPS4yNSwgaGVpZ2h0PS4yNSwgY29sb3I9XCJibGFja1wiLCBmaWxsY29sb3I9XCJ3aGl0ZVwiLCBzdHlsZT1cImZpbGxlZCwgc29saWQsIGJvbGRcIl07IiwKKyAgICAgICAgICAgICAgICAiXHRlZGdlIFthcnJvd3NpemU9LjUsIGNvbG9yPVwiYmxhY2tcIiwgc3R5bGU9XCJib2xkXCJdIiwKKyAgICAgICAgICAgICAgICAiIgorICAgICAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc3RyaW5nIEZvb3RlciA9ICJ9IjsKKyAgICAgICAgY29uc3Qgc3RyaW5nIE5vZGVGb3JtYXQgPSAiICB7MH0gW2xhYmVsPVwiezF9XCJdOyI7CisgICAgICAgIGNvbnN0IHN0cmluZyBFZGdlRm9ybWF0ID0gIiAgezB9IC0+IHsxfSAvLyBcInsyfVwiIC0+IFwiezN9XCIiOworCisgICAgICAgIC8qKiBUcmFjayBub2RlIHRvIG51bWJlciBtYXBwaW5nIHNvIHdlIGNhbiBnZXQgcHJvcGVyIG5vZGUgbmFtZSBiYWNrICovCisgICAgICAgIERpY3Rpb25hcnk8b2JqZWN0LCBpbnQ+IG5vZGVUb051bWJlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PG9iamVjdCwgaW50PigpOworCisgICAgICAgIC8qKiBUcmFjayBub2RlIG51bWJlciBzbyB3ZSBjYW4gZ2V0IHVuaXF1ZSBub2RlIG5hbWVzICovCisgICAgICAgIGludCBub2RlTnVtYmVyID0gMDsKKworICAgICAgICAvKiogR2VuZXJhdGUgRE9UIChncmFwaHZpeikgZm9yIGEgd2hvbGUgdHJlZSBub3QganVzdCBhIG5vZGUuCisgICAgICAgICAqICBGb3IgZXhhbXBsZSwgMys0KjUgc2hvdWxkIGdlbmVyYXRlOgorICAgICAgICAgKgorICAgICAgICAgKiBkaWdyYXBoIHsKKyAgICAgICAgICogICBub2RlIFtzaGFwZT1wbGFpbnRleHQsIGZpeGVkc2l6ZT10cnVlLCBmb250c2l6ZT0xMSwgZm9udG5hbWU9IkNvdXJpZXIiLAorICAgICAgICAgKiAgICAgICAgIHdpZHRoPS40LCBoZWlnaHQ9LjJdOworICAgICAgICAgKiAgIGVkZ2UgW2Fycm93c2l6ZT0uN10KKyAgICAgICAgICogICAiKyItPjMKKyAgICAgICAgICogICAiKyItPiIqIgorICAgICAgICAgKiAgICIqIi0+NAorICAgICAgICAgKiAgICIqIi0+NQorICAgICAgICAgKiB9CisgICAgICAgICAqCisgICAgICAgICAqIFRha2VzIGEgVHJlZSBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvRG90KCBvYmplY3QgdHJlZSwgSVRyZWVBZGFwdG9yIGFkYXB0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yZWFjaCAoIHN0cmluZyBsaW5lIGluIEhlYWRlckxpbmVzICkKKyAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZExpbmUoIGxpbmUgKTsKKworICAgICAgICAgICAgbm9kZU51bWJlciA9IDA7CisgICAgICAgICAgICB2YXIgbm9kZXMgPSBEZWZpbmVOb2RlcyggdHJlZSwgYWRhcHRvciApOworICAgICAgICAgICAgbm9kZU51bWJlciA9IDA7CisgICAgICAgICAgICB2YXIgZWRnZXMgPSBEZWZpbmVFZGdlcyggdHJlZSwgYWRhcHRvciApOworCisgICAgICAgICAgICBmb3JlYWNoICggdmFyIHMgaW4gbm9kZXMgKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZSggcyApOworCisgICAgICAgICAgICBidWlsZGVyLkFwcGVuZExpbmUoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoIHZhciBzIGluIGVkZ2VzICkKKyAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZExpbmUoIHMgKTsKKworICAgICAgICAgICAgYnVpbGRlci5BcHBlbmRMaW5lKCk7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kTGluZSggRm9vdGVyICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5Ub1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvRG90KCBJVHJlZSB0cmVlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRvRG90KCB0cmVlLCBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSApOworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIElFbnVtZXJhYmxlPHN0cmluZz4gRGVmaW5lTm9kZXMoIG9iamVjdCB0cmVlLCBJVHJlZUFkYXB0b3IgYWRhcHRvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdHJlZSA9PSBudWxsICkKKyAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKworICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQoIHRyZWUgKTsKKyAgICAgICAgICAgIGlmICggbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYWxyZWFkeSBkdW1wZWQgYXMgY2hpbGQgZnJvbSBwcmV2aW91cworICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb247IGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICB5aWVsZCBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVmaW5lIHBhcmVudCBub2RlCisgICAgICAgICAgICB5aWVsZCByZXR1cm4gR2V0Tm9kZVRleHQoIGFkYXB0b3IsIHRyZWUgKTsKKworICAgICAgICAgICAgLy8gZm9yIGVhY2ggY2hpbGQsIGRvIGEgIjx1bmlxdWUtbmFtZT4gW2xhYmVsPXRleHRdIiBub2RlIGRlZgorICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBhZGFwdG9yLkdldENoaWxkKCB0cmVlLCBpICk7CisgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIEdldE5vZGVUZXh0KCBhZGFwdG9yLCBjaGlsZCApOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCB2YXIgdCBpbiBEZWZpbmVOb2RlcyggY2hpbGQsIGFkYXB0b3IgKSApCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8c3RyaW5nPiBEZWZpbmVFZGdlcyggb2JqZWN0IHRyZWUsIElUcmVlQWRhcHRvciBhZGFwdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0cmVlID09IG51bGwgKQorICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworCisgICAgICAgICAgICBpbnQgbiA9IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCggdHJlZSApOworICAgICAgICAgICAgaWYgKCBuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhbHJlYWR5IGR1bXBlZCBhcyBjaGlsZCBmcm9tIHByZXZpb3VzCisgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbjsgZG8gbm90aGluZworICAgICAgICAgICAgICAgIHlpZWxkIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmcgcGFyZW50TmFtZSA9ICJuIiArIEdldE5vZGVOdW1iZXIoIHRyZWUgKTsKKworICAgICAgICAgICAgLy8gZm9yIGVhY2ggY2hpbGQsIGRvIGEgcGFyZW50IC0+IGNoaWxkIGVkZ2UgdXNpbmcgdW5pcXVlIG5vZGUgbmFtZXMKKyAgICAgICAgICAgIHN0cmluZyBwYXJlbnRUZXh0ID0gYWRhcHRvci5HZXRUZXh0KCB0cmVlICk7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IGFkYXB0b3IuR2V0Q2hpbGQoIHRyZWUsIGkgKTsKKyAgICAgICAgICAgICAgICBzdHJpbmcgY2hpbGRUZXh0ID0gYWRhcHRvci5HZXRUZXh0KCBjaGlsZCApOworICAgICAgICAgICAgICAgIHN0cmluZyBjaGlsZE5hbWUgPSAibiIgKyBHZXROb2RlTnVtYmVyKCBjaGlsZCApOworICAgICAgICAgICAgICAgIHlpZWxkIHJldHVybiBzdHJpbmcuRm9ybWF0KCBFZGdlRm9ybWF0LCBwYXJlbnROYW1lLCBjaGlsZE5hbWUsIEZpeFN0cmluZyggcGFyZW50VGV4dCApLCBGaXhTdHJpbmcoIGNoaWxkVGV4dCApICk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoIHZhciB0IGluIERlZmluZUVkZ2VzKCBjaGlsZCwgYWRhcHRvciApICkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBzdHJpbmcgR2V0Tm9kZVRleHQoIElUcmVlQWRhcHRvciBhZGFwdG9yLCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gYWRhcHRvci5HZXRUZXh0KCB0ICk7CisgICAgICAgICAgICBzdHJpbmcgdW5pcXVlTmFtZSA9ICJuIiArIEdldE5vZGVOdW1iZXIoIHQgKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCBOb2RlRm9ybWF0LCB1bmlxdWVOYW1lLCBGaXhTdHJpbmcoIHRleHQgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgaW50IEdldE5vZGVOdW1iZXIoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpZiAoIG5vZGVUb051bWJlck1hcC5UcnlHZXRWYWx1ZSggdCwgb3V0IGkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZVRvTnVtYmVyTWFwW3RdID0gbm9kZU51bWJlcjsKKyAgICAgICAgICAgICAgICBub2RlTnVtYmVyKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVOdW1iZXIgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgc3RyaW5nIEZpeFN0cmluZyggc3RyaW5nIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHRleHQgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGV4dCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5SZXBsYWNlKCB0ZXh0LCAiXCIiLCAiXFxcXFwiIiApOworICAgICAgICAgICAgICAgIHRleHQgPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXguUmVwbGFjZSggdGV4dCwgIlxcdCIsICIgICAgIiApOworICAgICAgICAgICAgICAgIHRleHQgPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXguUmVwbGFjZSggdGV4dCwgIlxcbiIsICJcXFxcbiIgKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4LlJlcGxhY2UoIHRleHQsICJcXHIiLCAiXFxcXHIiICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIHRleHQuTGVuZ3RoID4gMjAgKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5TdWJzdHJpbmcoIDAsIDggKSArICIuLi4iICsgdGV4dC5TdWJzdHJpbmcoIHRleHQuTGVuZ3RoIC0gOCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvSVRyZWUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlYjAzNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlLmNzCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgV2hhdCBkb2VzIGEgdHJlZSBsb29rIGxpa2U/ICBBTlRMUiBoYXMgYSBudW1iZXIgb2Ygc3VwcG9ydCBjbGFzc2VzCisgICAgICogIHN1Y2ggYXMgQ29tbW9uVHJlZU5vZGVTdHJlYW0gdGhhdCB3b3JrIG9uIHRoZXNlIGtpbmRzIG9mIHRyZWVzLiAgWW91CisgICAgICogIGRvbid0IGhhdmUgdG8gbWFrZSB5b3VyIHRyZWVzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYnV0IGlmIHlvdSBkbywKKyAgICAgKiAgeW91J2xsIGJlIGFibGUgdG8gdXNlIG1vcmUgc3VwcG9ydCBjb2RlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIE5PVEU6IFdoZW4gY29uc3RydWN0aW5nIHRyZWVzLCBBTlRMUiBjYW4gYnVpbGQgYW55IGtpbmQgb2YgdHJlZTsgaXQgY2FuCisgICAgICogIGV2ZW4gdXNlIFRva2VuIG9iamVjdHMgYXMgdHJlZXMgaWYgeW91IGFkZCBhIGNoaWxkIGxpc3QgdG8geW91ciB0b2tlbnMuCisgICAgICoKKyAgICAgKiAgVGhpcyBpcyBhIHRyZWUgbm9kZSB3aXRob3V0IGFueSBwYXlsb2FkOyBqdXN0IG5hdmlnYXRpb24gYW5kIGZhY3Rvcnkgc3R1ZmYuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUcmVlCisgICAgeworCisgICAgICAgIElUcmVlIEdldENoaWxkKCBpbnQgaSApOworCisgICAgICAgIGludCBDaGlsZENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRyZWUgdHJhY2tzIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggbm93ID4gMy4wCisKKyAgICAgICAgSVRyZWUgUGFyZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5JcyB0aGVyZSBpcyBhIG5vZGUgYWJvdmUgd2l0aCB0b2tlbiB0eXBlIHR0eXBlPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgYm9vbCBIYXNBbmNlc3RvciggaW50IHR0eXBlICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PldhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgSVRyZWUgR2V0QW5jZXN0b3IoIGludCB0dHlwZSApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBhIGxpc3Qgb2YgYWxsIGFuY2VzdG9ycyBvZiB0aGlzIG5vZGUuICBUaGUgZmlyc3Qgbm9kZSBvZgorICAgICAgICAgKiAgbGlzdCBpcyB0aGUgcm9vdCBhbmQgdGhlIGxhc3QgaXMgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJTGlzdDxJVHJlZT4gR2V0QW5jZXN0b3JzKCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlRoaXMgbm9kZSBpcyB3aGF0IGNoaWxkIGluZGV4PyAwLi5uLTE8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBDaGlsZEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggdmFsdWVzIGZvciBhbGwgY2hpbGRyZW48L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcygpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorICAgICAgICAgKiAgaXMgbmlsLCBhZGQgYWxsIGNoaWxkcmVuIG9mIHQgdG8gdGhpcycgY2hpbGRyZW4uCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICB2b2lkIEFkZENoaWxkKCBJVHJlZSB0ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCBpdGggY2hpbGQgKDAuLm4tMSkgdG8gdDsgdCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tbmlsIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0Q2hpbGQoIGludCBpLCBJVHJlZSB0ICk7CisKKyAgICAgICAgb2JqZWN0IERlbGV0ZUNoaWxkKCBpbnQgaSApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIERlbGV0ZSBjaGlsZHJlbiBmcm9tIHN0YXJ0IHRvIHN0b3AgYW5kIHJlcGxhY2Ugd2l0aCB0IGV2ZW4gaWYgdCBpcworICAgICAgICAgKiAgYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisgICAgICAgICAqICBGb3IgaHVnZSBjaGlsZCBsaXN0cywgaW5zZXJ0aW5nIGNoaWxkcmVuIGNhbiBmb3JjZSB3YWxraW5nIHJlc3Qgb2YKKyAgICAgICAgICogIGNoaWxkcmVuIHRvIHNldCB0aGVpciBjaGlsZGluZGV4OyBjb3VsZCBiZSBzbG93LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBSZXBsYWNlQ2hpbGRyZW4oIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKyAgICAgICAgICogIHRoZSB0cmVlIGlzIGEgZmxhdCBsaXN0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBJc05pbAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IGlzIHRoZSBzbWFsbGVzdCB0b2tlbiBpbmRleCAoaW5kZXhpbmcgZnJvbSAwKSBmb3IgdGhpcyBub2RlCisgICAgICAgICAqICBhbmQgaXRzIGNoaWxkcmVuPworICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgaW50IFRva2VuU3RhcnRJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQ7CisgICAgICAgICAgICBzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGF0IGlzIHRoZSBsYXJnZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAgICAgICAgICogIGFuZCBpdHMgY2hpbGRyZW4/CisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgVG9rZW5TdG9wSW5kZXgKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CisKKyAgICAgICAgSVRyZWUgRHVwTm9kZSgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5SZXR1cm4gYSB0b2tlbiB0eXBlOyBuZWVkZWQgZm9yIHRyZWUgcGFyc2luZzwvc3VtbWFyeT4gKi8KKyAgICAgICAgaW50IFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIFRleHQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhIHRva2VuIHBheWxvYWQsIHdoYXQgaXMgdGhlIGxpbmUgZm9yIGVycm9ycz88L3N1bW1hcnk+ICovCisgICAgICAgIGludCBMaW5lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBDaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIFRvU3RyaW5nVHJlZSgpOworCisgICAgICAgIHN0cmluZyBUb1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlQWRhcHRvci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlQWRhcHRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDIzMGNjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvSVRyZWVBZGFwdG9yLmNzCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBIb3cgdG8gY3JlYXRlIGFuZCBuYXZpZ2F0ZSB0cmVlcy4gIFJhdGhlciB0aGFuIGhhdmUgYSBzZXBhcmF0ZSBmYWN0b3J5CisgICAgICogIGFuZCBhZGFwdG9yLCBJJ3ZlIG1lcmdlZCB0aGVtLiAgTWFrZXMgc2Vuc2UgdG8gZW5jYXBzdWxhdGUuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgVGhpcyB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHRyZWUgY29uc3RydWN0aW9uIGNvZGUgZ2VuZXJhdGVkIGluIHRoZQorICAgICAqICBnZW5lcmF0ZWQgY29kZSBpbiAyLnggYW5kIHRoZSBBU1RGYWN0b3J5LgorICAgICAqCisgICAgICogIEkgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiBhIHRyZWUgYXQgYWxsIHNvIHRoZXkgYXJlIGFsbAorICAgICAqICBnZW5lcmljIE9iamVjdHMuICBUaGlzIG1heSBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIHR5cGVjYXN0aW5nIG5lZWRlZC4gOigKKyAgICAgKiAgPC9yZW1hcmtzPgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRyZWVBZGFwdG9yCisgICAgeworICAgICAgICAjcmVnaW9uIENvbnN0cnVjdGlvbgorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIENyZWF0ZSBhIHRyZWUgbm9kZSBmcm9tIFRva2VuIG9iamVjdDsgZm9yIENvbW1vblRyZWUgdHlwZSB0cmVlcywKKyAgICAgICAgICogIHRoZW4gdGhlIHRva2VuIGp1c3QgYmVjb21lcyB0aGUgcGF5bG9hZC4gIFRoaXMgaXMgdGhlIG1vc3QKKyAgICAgICAgICogIGNvbW1vbiBjcmVhdGUgY2FsbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgT3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBvYmplY3QgQ3JlYXRlKElUb2tlbiBwYXlsb2FkKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorICAgICAgICAgKiAgVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgICAgICAgKiAgcmV3cml0ZSBydWxlIGFzIElNQUdbJHRva2VuTGFiZWxdLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IENyZWF0ZShpbnQgdG9rZW5UeXBlLCBJVG9rZW4gZnJvbVRva2VuKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBTYW1lIGFzIGNyZWF0ZSh0b2tlblR5cGUsZnJvbVRva2VuKSBleGNlcHQgc2V0IHRoZSB0ZXh0IHRvby4KKyAgICAgICAgICogIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAgICAgICAgICogIHJld3JpdGUgcnVsZSBhcyBJTUFHWyR0b2tlbkxhYmVsLCAiSU1BRyJdLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IENyZWF0ZShpbnQgdG9rZW5UeXBlLCBJVG9rZW4gZnJvbVRva2VuLCBzdHJpbmcgdGV4dCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgU2FtZSBhcyBjcmVhdGUoZnJvbVRva2VuKSBleGNlcHQgc2V0IHRoZSB0ZXh0IHRvby4KKyAgICAgICAgICogIFRoaXMgaXMgaW52b2tlZCB3aGVuIHRoZSA8Yz50ZXh0PC9jPiB0ZXJtaW5hbCBvcHRpb24gaXMgc2V0LCBhcyBpbgorICAgICAgICAgKiAgSU1BRyZsdDt0ZXh0PSdJTUFHJyZndDsuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRoaXMgc2hvdWxkIGludm9rZSBjcmVhdGVUb2tlbihUb2tlbikuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBvYmplY3QgQ3JlYXRlKElUb2tlbiBmcm9tVG9rZW4sIHN0cmluZyB0ZXh0KTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorICAgICAgICAgKiAgVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgICAgICAgKiAgcmV3cml0ZSBydWxlIGFzIElNQUdbIklNQUciXS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgVGhpcyBzaG91bGQgaW52b2tlIGNyZWF0ZVRva2VuKGludCxTdHJpbmcpLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IENyZWF0ZShpbnQgdG9rZW5UeXBlLCBzdHJpbmcgdGV4dCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkR1cGxpY2F0ZSBhIHNpbmdsZSB0cmVlIG5vZGUuPC9zdW1tYXJ5PgorICAgICAgICAgKiAgPHJlbWFya3M+T3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IER1cE5vZGUob2JqZWN0IHRyZWVOb2RlKTsKKworICAgICAgICBvYmplY3QgRHVwTm9kZShpbnQgdHlwZSwgb2JqZWN0IHRyZWVOb2RlKTsKKworICAgICAgICBvYmplY3QgRHVwTm9kZShvYmplY3QgdHJlZU5vZGUsIHN0cmluZyB0ZXh0KTsKKworICAgICAgICBvYmplY3QgRHVwTm9kZShpbnQgdHlwZSwgb2JqZWN0IHRyZWVOb2RlLCBzdHJpbmcgdGV4dCk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkR1cGxpY2F0ZSB0cmVlIHJlY3Vyc2l2ZWx5LCB1c2luZyBkdXBOb2RlKCkgZm9yIGVhY2ggbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgb2JqZWN0IER1cFRyZWUoIG9iamVjdCB0cmVlICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIGEgbmlsIG5vZGUgKGFuIGVtcHR5IGJ1dCBub24tbnVsbCBub2RlKSB0aGF0IGNhbiBob2xkCisgICAgICAgICAqICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICAgICAgICAgKiAgdXNlICJ0PWFkYXB0b3IubmlsKCk7IHQuYWRkQ2hpbGQoeCk7IHQuYWRkQ2hpbGQoeSk7IgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IE5pbCgpOworCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAgICAgICAgICogIHRva2VucyBjb25zdW1lZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuICBUaGUgc3RhcnQgdG9rZW4gaW5kaWNhdGVzIHRoZQorICAgICAgICAgKiAgaW5wdXQgc3ltYm9sIGF0IHdoaWNoIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuICBUaGUgc3RvcCB0b2tlbiBpbmRpY2F0ZXMKKyAgICAgICAgICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqICBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBpbnB1dCBzdHJlYW0gc28gdGhhdCB0aGUgZXJyb25lb3VzIHRleHQgY2FuCisgICAgICAgICAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgICAgICAgICAqICB0byBzb21lIGFwcGxpY2F0aW9uczsgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgcHRyIHRvIGl0IGluCisgICAgICAgICAqICB0aGUgQ29tbW9uRXJyb3JOb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiAgVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGR1cmluZyB0b2tlbiBwYXJzaW5nLCBub3QgdHJlZSBwYXJzaW5nLgorICAgICAgICAgKiAgVHJlZSBwYXJzaW5nIHNob3VsZCBoYXBwZW4gb25seSB3aGVuIHBhcnNpbmcgYW5kIHRyZWUgY29uc3RydWN0aW9uCisgICAgICAgICAqICBzdWNjZWVkLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IEVycm9yTm9kZSggSVRva2VuU3RyZWFtIGlucHV0LCBJVG9rZW4gc3RhcnQsIElUb2tlbiBzdG9wLCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PklzIHRyZWUgY29uc2lkZXJlZCBhIG5pbCBub2RlIHVzZWQgdG8gbWFrZSBsaXN0cyBvZiBjaGlsZCBub2Rlcz88L3N1bW1hcnk+ICovCisgICAgICAgIGJvb2wgSXNOaWwoIG9iamVjdCB0cmVlICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQWRkIGEgY2hpbGQgdG8gdGhlIHRyZWUgdC4gIElmIGNoaWxkIGlzIGEgZmxhdCB0cmVlIChhIGxpc3QpLCBtYWtlIGFsbAorICAgICAgICAgKiAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgICAgICAgICAqICBhbmQgY2hpbGQgaXNOaWwgdGhlbiB5b3UgY2FuIGRlY2lkZSBpdCBpcyBvayB0byBtb3ZlIGNoaWxkcmVuIHRvIHQgdmlhCisgICAgICAgICAqICB0LmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47IGkuZS4sIHdpdGhvdXQgY29weWluZyB0aGUgYXJyYXkuICBKdXN0CisgICAgICAgICAqICBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBoYXZlIHRoZSB1c2VyIHdpbGwgYnVpbGQKKyAgICAgICAgICogIEFTVHMuICBEbyBub3RoaW5nIGlmIHQgb3IgY2hpbGQgaXMgbnVsbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgQWRkQ2hpbGQoIG9iamVjdCB0LCBvYmplY3QgY2hpbGQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiBvbGRSb290IGlzIGEgbmlsIHJvb3QsIGp1c3QgY29weSBvciBtb3ZlIHRoZSBjaGlsZHJlbiB0byBuZXdSb290LgorICAgICAgICAgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAgICAgICAgICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgICAgICAgKgorICAgICAgICAgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgICAgICAgICAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgICAgICAgICAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgICAgICAgICAqCisgICAgICAgICAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAgICAgICAgICoKKyAgICAgICAgICogICAgb2xkPW51bGwsIG5ldz1yIHlpZWxkcyByCisgICAgICAgICAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgICAgICAgICAqCisgICAgICAgICAqICBSZXR1cm4gbmV3Um9vdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBuZXdSb290IGlzIG5vdCBhCisgICAgICAgICAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgICAgICAgICAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorICAgICAgICAgKgorICAgICAgICAgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgICAgICAgICAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorICAgICAgICAgKiAgY29uc3RydWN0aW5nIHRoZXNlIG5vZGVzIHNvIHdlIHNob3VsZCBoYXZlIHRoaXMgY29udHJvbCBmb3IKKyAgICAgICAgICogIGVmZmljaWVuY3kuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBvYmplY3QgQmVjb21lUm9vdCggb2JqZWN0IG5ld1Jvb3QsIG9iamVjdCBvbGRSb290ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUgY3JlYXRlZCBmb3IgdGhpcyBydWxlLCBwb3N0IHByb2Nlc3MKKyAgICAgICAgICogIGl0IHRvIGRvIGFueSBzaW1wbGlmaWNhdGlvbnMgb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBBIHJlcXVpcmVkCisgICAgICAgICAqICBiZWhhdmlvciBpcyB0byBjb252ZXJ0IF4obmlsIHNpbmdsZVN1YnRyZWUpIHRvIHNpbmdsZVN1YnRyZWUKKyAgICAgICAgICogIGFzIHRoZSBzZXR0aW5nIG9mIHN0YXJ0L3N0b3AgaW5kZXhlcyByZWxpZXMgb24gYSBzaW5nbGUgbm9uLW5pbCByb290CisgICAgICAgICAqICBmb3Igbm9uLWZsYXQgdHJlZXMuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIEZsYXQgdHJlZXMgc3VjaCBhcyBmb3IgbGlzdHMgbGlrZSAiaWRsaXN0IDogSUQrIDsiIGFyZSBsZWZ0IGFsb25lCisgICAgICAgICAqICB1bmxlc3MgdGhlcmUgaXMgb25seSBvbmUgSUQuICBGb3IgYSBsaXN0LCB0aGUgc3RhcnQvc3RvcCBpbmRleGVzCisgICAgICAgICAqICBhcmUgc2V0IGluIHRoZSBuaWwgbm9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGFmdGVyIGFsbCBydWxlIHRyZWUgY29uc3RydWN0aW9uIGFuZCByaWdodAorICAgICAgICAgKiAgYmVmb3JlIHNldFRva2VuQm91bmRhcmllcygpLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IFJ1bGVQb3N0UHJvY2Vzc2luZyggb2JqZWN0IHJvb3QgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+Rm9yIGlkZW50aWZ5aW5nIHRyZWVzLjwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSG93IHRvIGlkZW50aWZ5IG5vZGVzIHNvIHdlIGNhbiBzYXkgImFkZCBub2RlIHRvIGEgcHJpb3Igbm9kZSI/CisgICAgICAgICAqICBFdmVuIGJlY29tZVJvb3QgaXMgYW4gaXNzdWUuICBVc2UgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobm9kZSkKKyAgICAgICAgICogIHVzdWFsbHkuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBpbnQgR2V0VW5pcXVlSUQoIG9iamVjdCBub2RlICk7CisKKworICAgICAgICAvLyBSIGUgdyByIGkgdCBlICBSIHUgbCBlIHMKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDcmVhdGUgYSBub2RlIGZvciBuZXdSb290IG1ha2UgaXQgdGhlIHJvb3Qgb2Ygb2xkUm9vdC4KKyAgICAgICAgICogIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgICAgICAgICAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZXR1cm5zPgorICAgICAgICAgKiAgUmV0dXJuIG5vZGUgY3JlYXRlZCBmb3IgbmV3Um9vdC4KKyAgICAgICAgICogIDwvcmV0dXJucz4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgQmUgYWR2aXNlZDogd2hlbiBkZWJ1Z2dpbmcgQVNUcywgdGhlIERlYnVnVHJlZUFkYXB0b3IgbWFudWFsbHkKKyAgICAgICAgICogIGNhbGxzIGNyZWF0ZShUb2tlbiBjaGlsZCkgYW5kIHRoZW4gcGxhaW4gYmVjb21lUm9vdChub2RlLCBub2RlKQorICAgICAgICAgKiAgYmVjYXVzZSBpdCBuZWVkcyB0byB0cmFwIGNhbGxzIHRvIGNyZWF0ZSwgYnV0IGl0IGNhbid0IHNpbmNlIGl0IGRlbGVnYXRlcworICAgICAgICAgKiAgdG8gbm90IGluaGVyaXRzIGZyb20gdGhlIFRyZWVBZGFwdG9yLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IEJlY29tZVJvb3QoIElUb2tlbiBuZXdSb290LCBvYmplY3Qgb2xkUm9vdCApOworCisgICAgICAgICNlbmRyZWdpb24KKworCisgICAgICAgICNyZWdpb24gQ29udGVudAorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Gb3IgdHJlZSBwYXJzaW5nLCBJIG5lZWQgdG8ga25vdyB0aGUgdG9rZW4gdHlwZSBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBHZXRUeXBlKCBvYmplY3QgdCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Ob2RlIGNvbnN0cnVjdG9ycyBjYW4gc2V0IHRoZSB0eXBlIG9mIGEgbm9kZTwvc3VtbWFyeT4gKi8KKyAgICAgICAgdm9pZCBTZXRUeXBlKCBvYmplY3QgdCwgaW50IHR5cGUgKTsKKworICAgICAgICBzdHJpbmcgR2V0VGV4dCggb2JqZWN0IHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+Tm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdGV4dCBvZiBhIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0VGV4dCggb2JqZWN0IHQsIHN0cmluZyB0ZXh0ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmV0dXJuIHRoZSB0b2tlbiBvYmplY3QgZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQuCisgICAgICAgICAqICBDdXJyZW50bHkgdXNlZCBvbmx5IGZvciBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlLgorICAgICAgICAgKiAgVGhlIGVycm9yIGRpc3BsYXkgcm91dGluZSBpbiBCYXNlUmVjb2duaXplciBuZWVkcyB0bworICAgICAgICAgKiAgZGlzcGxheSB3aGVyZSB0aGUgaW5wdXQgdGhlIGVycm9yIG9jY3VycmVkLiBJZiB5b3VyCisgICAgICAgICAqICB0cmVlIG9mIGxpbWl0YXRpb24gZG9lcyBub3Qgc3RvcmUgaW5mb3JtYXRpb24gdGhhdCBjYW4KKyAgICAgICAgICogIGxlYWQgeW91IHRvIHRoZSB0b2tlbiwgeW91IGNhbiBjcmVhdGUgYSB0b2tlbiBmaWxsZWQgd2l0aAorICAgICAgICAgKiAgdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGFuZCBwYXNzIHRoYXQgYmFjay4gIFNlZQorICAgICAgICAgKiAgQmFzZVJlY29nbml6ZXIuZ2V0RXJyb3JNZXNzYWdlKCkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVG9rZW4gR2V0VG9rZW4oIG9iamVjdCB0ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hlcmUgYXJlIHRoZSBib3VuZHMgaW4gdGhlIGlucHV0IHRva2VuIHN0cmVhbSBmb3IgdGhpcyBub2RlIGFuZAorICAgICAgICAgKiAgYWxsIGNoaWxkcmVuPyAgRWFjaCBydWxlIHRoYXQgY3JlYXRlcyBBU1Qgbm9kZXMgd2lsbCBjYWxsIHRoaXMKKyAgICAgICAgICogIG1ldGhvZCByaWdodCBiZWZvcmUgcmV0dXJuaW5nLiAgRmxhdCB0cmVlcyAoaS5lLiwgbGlzdHMpIHdpbGwKKyAgICAgICAgICogIHN0aWxsIHVzdWFsbHkgaGF2ZSBhIG5pbCByb290IG5vZGUganVzdCB0byBob2xkIHRoZSBjaGlsZHJlbiBsaXN0LgorICAgICAgICAgKiAgVGhhdCBub2RlIHdvdWxkIGNvbnRhaW4gdGhlIHN0YXJ0L3N0b3AgaW5kZXhlcyB0aGVuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBTZXRUb2tlbkJvdW5kYXJpZXMoIG9iamVjdCB0LCBJVG9rZW4gc3RhcnRUb2tlbiwgSVRva2VuIHN0b3BUb2tlbiApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgdGhlIHRva2VuIHN0YXJ0IGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4PC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgR2V0VG9rZW5TdGFydEluZGV4KCBvYmplY3QgdCApOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgdGhlIHRva2VuIHN0b3AgaW5kZXggZm9yIHRoaXMgc3VidHJlZTsgcmV0dXJuIC0xIGlmIG5vIHN1Y2ggaW5kZXg8L3N1bW1hcnk+ICovCisgICAgICAgIGludCBHZXRUb2tlblN0b3BJbmRleCggb2JqZWN0IHQgKTsKKworICAgICAgICAjZW5kcmVnaW9uCisKKworICAgICAgICAjcmVnaW9uIE5hdmlnYXRpb24gLyBUcmVlIFBhcnNpbmcKKworICAgICAgICAvKiogPHN1bW1hcnk+R2V0IGEgY2hpbGQgMC4ubi0xIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIG9iamVjdCBHZXRDaGlsZCggb2JqZWN0IHQsIGludCBpICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCBpdGggY2hpbGQgKDAuLm4tMSkgdG8gdDsgdCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tbmlsIG5vZGU8L3N1bW1hcnk+ICovCisgICAgICAgIHZvaWQgU2V0Q2hpbGQoIG9iamVjdCB0LCBpbnQgaSwgb2JqZWN0IGNoaWxkICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJlbW92ZSBpdGggY2hpbGQgYW5kIHNoaWZ0IGNoaWxkcmVuIGRvd24gZnJvbSByaWdodC48L3N1bW1hcnk+ICovCisgICAgICAgIG9iamVjdCBEZWxldGVDaGlsZCggb2JqZWN0IHQsIGludCBpICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkhvdyBtYW55IGNoaWxkcmVuPyAgSWYgMCwgdGhlbiB0aGlzIGlzIGEgbGVhZiBub2RlPC9zdW1tYXJ5PiAqLworICAgICAgICBpbnQgR2V0Q2hpbGRDb3VudCggb2JqZWN0IHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaG8gaXMgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZTsgaWYgbnVsbCwgaW1wbGllcyBub2RlIGlzIHJvb3QuCisgICAgICAgICAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICAgICAgICAgKiAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IEdldFBhcmVudCggb2JqZWN0IHQgKTsKKyAgICAgICAgdm9pZCBTZXRQYXJlbnQoIG9iamVjdCB0LCBvYmplY3QgcGFyZW50ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAgICAgICAgICogIElmIHlvdXIgbm9kZSB0eXBlIGRvZXNuJ3QgaGFuZGxlIHRoaXMsIGl0J3Mgb2sgYnV0IHRoZSB0cmVlIHJld3JpdGVzCisgICAgICAgICAqICBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBpbnQgR2V0Q2hpbGRJbmRleCggb2JqZWN0IHQgKTsKKyAgICAgICAgdm9pZCBTZXRDaGlsZEluZGV4KCBvYmplY3QgdCwgaW50IGluZGV4ICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgUmVwbGFjZSBmcm9tIHN0YXJ0IHRvIHN0b3AgY2hpbGQgaW5kZXggb2YgcGFyZW50IHdpdGggdCwgd2hpY2ggbWlnaHQKKyAgICAgICAgICogIGJlIGEgbGlzdC4gIE51bWJlciBvZiBjaGlsZHJlbiBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIHRoaXMgY2FsbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorICAgICAgICAgKiAgQ2FuJ3QgcmVwbGFjZSB3aGF0ZXZlciBwb2ludHMgdG8gdGhlIHBhcmVudCBleHRlcm5hbGx5LiAgRG8gbm90aGluZy4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgUmVwbGFjZUNoaWxkcmVuKCBvYmplY3QgcGFyZW50LCBpbnQgc3RhcnRDaGlsZEluZGV4LCBpbnQgc3RvcENoaWxkSW5kZXgsIG9iamVjdCB0ICk7CisKKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlTm9kZVN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlTm9kZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMzZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvSVRyZWVOb2RlU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICAvKiogPHN1bW1hcnk+QSBzdHJlYW0gb2YgdHJlZSBub2RlcywgYWNjZXNzaW5nIG5vZGVzIGZyb20gYSB0cmVlIG9mIHNvbWUga2luZDwvc3VtbWFyeT4gKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElUcmVlTm9kZVN0cmVhbSA6IElJbnRTdHJlYW0KKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdldCBhIHRyZWUgbm9kZSBhdCBhbiBhYnNvbHV0ZSBpbmRleCBpOyAwLi5uLTEuCisgICAgICAgICAqICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBidWZmZXIgdXAgbm9kZXMsIHRoZW4gdGhpcyBtZXRob2QgbWFrZXMgbm8KKyAgICAgICAgICogIHNlbnNlIGZvciB5b3UuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBvYmplY3QgdGhpc1tpbnQgaV0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2V0IHRyZWUgbm9kZSBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkIHdoZXJlIGk9MSBpcyBuZXh0IG5vZGUuCisgICAgICAgICAqICBpJmx0OzAgaW5kaWNhdGVzIG5vZGVzIGluIHRoZSBwYXN0LiAgU28gTFQoLTEpIGlzIHByZXZpb3VzIG5vZGUsIGJ1dAorICAgICAgICAgKiAgaW1wbGVtZW50YXRpb25zIGFyZSBub3QgcmVxdWlyZWQgdG8gcHJvdmlkZSByZXN1bHRzIGZvciBrICZsdDsgLTEuCisgICAgICAgICAqICBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgaSZndDs9biwgcmV0dXJuIG51bGwuCisgICAgICAgICAqICBSZXR1cm4gbnVsbCBmb3IgTFQoMCkgYW5kIGFueSBpbmRleCB0aGF0IHJlc3VsdHMgaW4gYW4gYWJzb2x1dGUgYWRkcmVzcworICAgICAgICAgKiAgdGhhdCBpcyBuZWdhdGl2ZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgVGhpcyBpcyBhbmFsb2d1cyB0byB0aGUgTFQoKSBtZXRob2Qgb2YgdGhlIFRva2VuU3RyZWFtLCBidXQgdGhpcworICAgICAgICAgKiAgcmV0dXJucyBhIHRyZWUgbm9kZSBpbnN0ZWFkIG9mIGEgdG9rZW4uICBNYWtlcyBjb2RlIGdlbiBpZGVudGljYWwKKyAgICAgICAgICogIGZvciBib3RoIHBhcnNlciBhbmQgdHJlZSBncmFtbWFycy4gOikKKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIG9iamVjdCBMVCggaW50IGsgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIG5vZGVzIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisgICAgICAgICAqICB0aGUgb2JqZWN0IHRoYXQgcHJvdmlkZXMgbm9kZSBvYmplY3RzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IFRyZWVTb3VyY2UKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgSWYgdGhlIHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtIHdhcyBjcmVhdGVkIGZyb20gYSBUb2tlblN0cmVhbSwKKyAgICAgICAgICogIHlvdSBjYW4gc3BlY2lmeSBpdCBoZXJlLiAgVXNlZCB0byBkbyBydWxlICR0ZXh0IGF0dHJpYnV0ZSBpbiB0cmVlCisgICAgICAgICAqICBwYXJzZXIuICBPcHRpb25hbCB1bmxlc3MgeW91IHVzZSB0cmVlIHBhcnNlciBydWxlIHRleHQgYXR0cmlidXRlCisgICAgICAgICAqICBvciBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBvcHRpb25zLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgSVRva2VuU3RyZWFtIFRva2VuU3RyZWFtCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoYXQgYWRhcHRvciBjYW4gdGVsbCBtZSBob3cgdG8gaW50ZXJwcmV0L25hdmlnYXRlIG5vZGVzIGFuZAorICAgICAgICAgKiAgdHJlZXMuICBFLmcuLCBnZXQgdGV4dCBvZiBhIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBJVHJlZUFkYXB0b3IgVHJlZUFkYXB0b3IKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorICAgICAgICAgKiAgdGhlIHRyZWUgc3RydWN0dXJlLiAgV2hlbiBkZWJ1Z2dpbmcgd2UgbmVlZCB1bmlxdWUgbm9kZXMKKyAgICAgICAgICogIHNvIHdlIGhhdmUgdG8gaW5zdGFudGlhdGUgbmV3IG9uZXMuICBXaGVuIGRvaW5nIG5vcm1hbCB0cmVlCisgICAgICAgICAqICBwYXJzaW5nLCBpdCdzIHNsb3cgYW5kIGEgd2FzdGUgb2YgbWVtb3J5IHRvIGNyZWF0ZSB1bmlxdWUKKyAgICAgICAgICogIG5hdmlnYXRpb24gbm9kZXMuICBEZWZhdWx0IHNob3VsZCBiZSBmYWxzZTsKKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgVW5pcXVlTmF2aWdhdGlvbk5vZGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiB0aGUgdGV4dCBvZiBhbGwgbm9kZXMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgICAgICAgICAqICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIG5vZGVzIHRoZW4gaXQgY2FuIHN0aWxsCisgICAgICAgICAqICB3YWxrIHJlY3Vyc2l2ZWx5IGZyb20gc3RhcnQgdW50aWwgc3RvcC4gIFlvdSBjYW4gYWx3YXlzIHJldHVybgorICAgICAgICAgKiAgbnVsbCBvciAiIiB0b28sIGJ1dCB1c2VycyBzaG91bGQgbm90IGFjY2VzcyAkcnVsZUxhYmVsLnRleHQgaW4KKyAgICAgICAgICogIGFuIGFjdGlvbiBvZiBjb3Vyc2UgaW4gdGhhdCBjYXNlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgc3RyaW5nIFRvU3RyaW5nKCBvYmplY3Qgc3RhcnQsIG9iamVjdCBzdG9wICk7CisKKworICAgICAgICAjcmVnaW9uIFJFV1JJVElORyBUUkVFUyAodXNlZCBieSB0cmVlIHBhcnNlcikKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBSZXBsYWNlIGZyb20gc3RhcnQgdG8gc3RvcCBjaGlsZCBpbmRleCBvZiBwYXJlbnQgd2l0aCB0LCB3aGljaCBtaWdodAorICAgICAgICAgKiAgYmUgYSBsaXN0LiAgTnVtYmVyIG9mIGNoaWxkcmVuIG1heSBiZSBkaWZmZXJlbnQKKyAgICAgICAgICogIGFmdGVyIHRoaXMgY2FsbC4gIFRoZSBzdHJlYW0gaXMgbm90aWZpZWQgYmVjYXVzZSBpdCBpcyB3YWxraW5nIHRoZQorICAgICAgICAgKiAgdHJlZSBhbmQgbWlnaHQgbmVlZCB0byBrbm93IHlvdSBhcmUgbW9ua2V5aW5nIHdpdGggdGhlIHVuZGVybHlpbmcKKyAgICAgICAgICogIHRyZWUuICBBbHNvLCBpdCBtaWdodCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgbm9kZSBzdHJlYW0gdG8gYXZvaWQKKyAgICAgICAgICogIHJlc3RyZWFtaW5nIGZvciBmdXR1cmUgcGhhc2VzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBJZiBwYXJlbnQgaXMgbnVsbCwgZG9uJ3QgZG8gYW55dGhpbmc7IG11c3QgYmUgYXQgcm9vdCBvZiBvdmVyYWxsIHRyZWUuCisgICAgICAgICAqICBDYW4ndCByZXBsYWNlIHdoYXRldmVyIHBvaW50cyB0byB0aGUgcGFyZW50IGV4dGVybmFsbHkuICBEbyBub3RoaW5nLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBSZXBsYWNlQ2hpbGRyZW4oIG9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgb2JqZWN0IHQgKTsKKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9JVHJlZVZpc2l0b3JBY3Rpb24uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9JVHJlZVZpc2l0b3JBY3Rpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmMDE1NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL0lUcmVlVmlzaXRvckFjdGlvbi5jcwpAQCAtMCwwICsxLDkwIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICB1c2luZyBBbnRsci5SdW50aW1lLk1pc2M7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEhvdyB0byBleGVjdXRlIGNvZGUgZm9yIG5vZGUgdCB3aGVuIGEgdmlzaXRvciB2aXNpdHMgbm9kZSB0LiAgRXhlY3V0ZQorICAgICAqICBwcmUoKSBiZWZvcmUgdmlzaXRpbmcgY2hpbGRyZW4gYW5kIGV4ZWN1dGUgcG9zdCgpIGFmdGVyIHZpc2l0aW5nIGNoaWxkcmVuLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBJVHJlZVZpc2l0b3JBY3Rpb24KKyAgICB7CisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEV4ZWN1dGUgYW4gYWN0aW9uIGJlZm9yZSB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAgICAgICAgICogIGEgcmV3cml0dGVuIHQuICBJdCBpcyB1cCB0byB0aGUgdmlzaXRvciB0byBkZWNpZGUgd2hhdCB0byBkbworICAgICAgICAgKiAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLiAgQ2hpbGRyZW4gb2YgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZQorICAgICAgICAgKiAgdmlzaXRlZCBpZiB1c2luZyBUcmVlVmlzaXRvci52aXNpdCgpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IFByZSggb2JqZWN0IHQgKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBFeGVjdXRlIGFuIGFjdGlvbiBhZnRlciB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAgICAgICAgICogIGEgcmV3cml0dGVuIHQuICBJdCBpcyB1cCB0byB0aGUgdmlzaXRvciB0byBkZWNpZGUgd2hhdCB0byBkbworICAgICAgICAgKiAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgb2JqZWN0IFBvc3QoIG9iamVjdCB0ICk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRyZWVWaXNpdG9yQWN0aW9uCisgICAgICAgIDogSVRyZWVWaXNpdG9yQWN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8b2JqZWN0LCBvYmplY3Q+IF9wcmVBY3Rpb247CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxvYmplY3QsIG9iamVjdD4gX3Bvc3RBY3Rpb247CisKKyAgICAgICAgcHVibGljIFRyZWVWaXNpdG9yQWN0aW9uKCBGdW5jPG9iamVjdCwgb2JqZWN0PiBwcmVBY3Rpb24sIEZ1bmM8b2JqZWN0LCBvYmplY3Q+IHBvc3RBY3Rpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBfcHJlQWN0aW9uID0gcHJlQWN0aW9uOworICAgICAgICAgICAgX3Bvc3RBY3Rpb24gPSBwb3N0QWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBQcmUoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBfcHJlQWN0aW9uICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiBfcHJlQWN0aW9uKCB0ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBQb3N0KCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggX3Bvc3RBY3Rpb24gIT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmV0dXJuIF9wb3N0QWN0aW9uKCB0ICk7CisKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUGFyc2VUcmVlLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUGFyc2VUcmVlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTI2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9QYXJzZVRyZWUuY3MKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCisgICAgdXNpbmcgU3RyaW5nQnVpbGRlciA9IFN5c3RlbS5UZXh0LlN0cmluZ0J1aWxkZXI7CisKKyAgICAvKiogPHN1bW1hcnk+CisgICAgICogIEEgcmVjb3JkIG9mIHRoZSBydWxlcyB1c2VkIHRvIG1hdGNoIGEgdG9rZW4gc2VxdWVuY2UuICBUaGUgdG9rZW5zCisgICAgICogIGVuZCB1cCBhcyB0aGUgbGVhdmVzIG9mIHRoaXMgdHJlZSBhbmQgcnVsZSBub2RlcyBhcmUgdGhlIGludGVyaW9yIG5vZGVzLgorICAgICAqICBUaGlzIHJlYWxseSBhZGRzIG5vIGZ1bmN0aW9uYWxpdHksIGl0IGlzIGp1c3QgYW4gYWxpYXMgZm9yIENvbW1vblRyZWUKKyAgICAgKiAgdGhhdCBpcyBtb3JlIG1lYW5pbmdmdWwgKHNwZWNpZmljKSBhbmQgaG9sZHMgYSBTdHJpbmcgdG8gZGlzcGxheSBmb3IgYSBub2RlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFBhcnNlVHJlZSA6IEJhc2VUcmVlCisgICAgeworICAgICAgICBwdWJsaWMgb2JqZWN0IHBheWxvYWQ7CisgICAgICAgIHB1YmxpYyBMaXN0PElUb2tlbj4gaGlkZGVuVG9rZW5zOworCisgICAgICAgIHB1YmxpYyBQYXJzZVRyZWUoIG9iamVjdCBsYWJlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucGF5bG9hZCA9IGxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBQcm9wZXJ0aWVzCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVGV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVG9rZW5TdGFydEluZGV4CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBUb2tlblN0b3BJbmRleAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVRyZWUgRHVwTm9kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcGF5bG9hZCBpcyBJVG9rZW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUb2tlbiB0ID0gKElUb2tlbilwYXlsb2FkOworICAgICAgICAgICAgICAgIGlmICggdC5UeXBlID09IFRva2VuVHlwZXMuRW5kT2ZGaWxlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiPEVPRj4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdC5UZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEVtaXQgYSB0b2tlbiBhbmQgYWxsIGhpZGRlbiBub2RlcyBiZWZvcmUuICBFT0Ygbm9kZSBob2xkcyBhbGwKKyAgICAgICAgICogIGhpZGRlbiB0b2tlbnMgYWZ0ZXIgbGFzdCByZWFsIHRva2VuLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvU3RyaW5nV2l0aEhpZGRlblRva2VucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGlmICggaGlkZGVuVG9rZW5zICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGhpZGRlblRva2Vucy5Db3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUb2tlbiBoaWRkZW4gPSAoSVRva2VuKWhpZGRlblRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggaGlkZGVuLlRleHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgbm9kZVRleHQgPSB0aGlzLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoICFub2RlVGV4dC5FcXVhbHMoICI8RU9GPiIgKSApCisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggbm9kZVRleHQgKTsKKyAgICAgICAgICAgIHJldHVybiBidWYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFByaW50IG91dCB0aGUgbGVhdmVzIG9mIHRoaXMgdHJlZSwgd2hpY2ggbWVhbnMgcHJpbnRpbmcgb3JpZ2luYWwKKyAgICAgICAgICogIGlucHV0IGJhY2sgb3V0LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFRvSW5wdXRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBUb1N0cmluZ0xlYXZlcyggYnVmICk7CisgICAgICAgICAgICByZXR1cm4gYnVmLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIFRvU3RyaW5nTGVhdmVzKCBTdHJpbmdCdWlsZGVyIGJ1ZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcGF5bG9hZCBpcyBJVG9rZW4gKQorICAgICAgICAgICAgeyAvLyBsZWFmIG5vZGUgdG9rZW4/CisgICAgICAgICAgICAgICAgYnVmLkFwcGVuZCggdGhpcy5Ub1N0cmluZ1dpdGhIaWRkZW5Ub2tlbnMoKSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgQ2hpbGRyZW4gIT0gbnVsbCAmJiBpIDwgQ2hpbGRyZW4uQ291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGFyc2VUcmVlIHQgPSAoUGFyc2VUcmVlKUNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgIHQuVG9TdHJpbmdMZWF2ZXMoIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTAyODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgQXJndW1lbnROdWxsRXhjZXB0aW9uID0gU3lzdGVtLkFyZ3VtZW50TnVsbEV4Y2VwdGlvbjsKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBCYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIEFTVCByZXdyaXRlIGNvbnN0cnVjdGlvbi4KKyAgICAgKiAgVGhpcyBzaWduaWZpZXMgYSBjYXNlIHdoZXJlIHRoZSBjYXJkaW5hbGl0eSBvZiB0d28gb3IgbW9yZSBlbGVtZW50cworICAgICAqICBpbiBhIHN1YnJ1bGUgYXJlIGRpZmZlcmVudDogKElEIElOVCkrIHdoZXJlIHxJRHwhPXxJTlR8CisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uIDogRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZWxlbWVudERlc2NyaXB0aW9uOworCisgICAgICAgIHB1YmxpYyBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uKHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IHRoaXMoZWxlbWVudERlc2NyaXB0aW9uLCBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuX2VsZW1lbnREZXNjcmlwdGlvbiA9IGVsZW1lbnREZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24oc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiB0aGlzKGVsZW1lbnREZXNjcmlwdGlvbiwgZWxlbWVudERlc2NyaXB0aW9uLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBfZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBfZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIF9lbGVtZW50RGVzY3JpcHRpb24gPSBpbmZvLkdldFN0cmluZygiRWxlbWVudERlc2NyaXB0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBHZXRPYmplY3REYXRhKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpbmZvIik7CisKKyAgICAgICAgICAgIGJhc2UuR2V0T2JqZWN0RGF0YShpbmZvLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGluZm8uQWRkVmFsdWUoIkVsZW1lbnREZXNjcmlwdGlvbiIsIF9lbGVtZW50RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjNTFmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIEV4Y2VwdGlvbiA9IFN5c3RlbS5FeGNlcHRpb247CisgICAgdXNpbmcgU2VyaWFsaXphdGlvbkluZm8gPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25JbmZvOworICAgIHVzaW5nIFN0cmVhbWluZ0NvbnRleHQgPSBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlN0cmVhbWluZ0NvbnRleHQ7CisKKyAgICAvKiogPHN1bW1hcnk+Tm8gZWxlbWVudHMgd2l0aGluIGEgKC4uLikrIGluIGEgcmV3cml0ZSBydWxlPC9zdW1tYXJ5PiAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uIDogUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IGJhc2UoZWxlbWVudERlc2NyaXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24sIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShlbGVtZW50RGVzY3JpcHRpb24sIGlubmVyRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZWxlbWVudERlc2NyaXB0aW9uLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24oU2VyaWFsaXphdGlvbkluZm8gaW5mbywgU3RyZWFtaW5nQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgOiBiYXNlKGluZm8sIGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkwY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICB1c2luZyBFeGNlcHRpb24gPSBTeXN0ZW0uRXhjZXB0aW9uOworICAgIHVzaW5nIFNlcmlhbGl6YXRpb25JbmZvID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uSW5mbzsKKyAgICB1c2luZyBTdHJlYW1pbmdDb250ZXh0ID0gU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbi5TdHJlYW1pbmdDb250ZXh0OworCisgICAgLyoqIDxzdW1tYXJ5PlJlZiB0byBJRCBvciBleHByIGJ1dCBubyB0b2tlbnMgaW4gSUQgc3RyZWFtIG9yIHN1YnRyZWVzIGluIGV4cHIgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24gOiBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IGJhc2UoZWxlbWVudERlc2NyaXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24oc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQorICAgICAgICAgICAgOiBiYXNlKGVsZW1lbnREZXNjcmlwdGlvbiwgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZWxlbWVudERlc2NyaXB0aW9uKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZWxlbWVudERlc2NyaXB0aW9uLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbihTZXJpYWxpemF0aW9uSW5mbyBpbmZvLCBTdHJlYW1pbmdDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICA6IGJhc2UoaW5mbywgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlM2Q1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uY3MKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworICAgIHVzaW5nIElMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklMaXN0OworCisgICAgLyoqIDxzdW1tYXJ5PgorICAgICAqICBBIGdlbmVyaWMgbGlzdCBvZiBlbGVtZW50cyB0cmFja2VkIGluIGFuIGFsdGVybmF0aXZlIHRvIGJlIHVzZWQgaW4KKyAgICAgKiAgYSAtPiByZXdyaXRlIHJ1bGUuICBXZSBuZWVkIHRvIHN1YmNsYXNzIHRvIGZpbGwgaW4gdGhlIG5leHQoKSBtZXRob2QsCisgICAgICogIHdoaWNoIHJldHVybnMgZWl0aGVyIGFuIEFTVCBub2RlIHdyYXBwZWQgYXJvdW5kIGEgdG9rZW4gcGF5bG9hZCBvcgorICAgICAqICBhbiBleGlzdGluZyBzdWJ0cmVlLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgICoKKyAgICAgKiAgPHJlbWFya3M+CisgICAgICogIE9uY2UgeW91IHN0YXJ0IG5leHQoKWluZywgZG8gbm90IHRyeSB0byBhZGQgbW9yZSBlbGVtZW50cy4gIEl0IHdpbGwKKyAgICAgKiAgYnJlYWsgdGhlIGN1cnNvciB0cmFja2luZyBJIGJlbGlldmUuCisgICAgICoKKyAgICAgKiAgVE9ETzogYWRkIG1lY2hhbmlzbSB0byBkZXRlY3QvcHVrZSBvbiBtb2RpZmljYXRpb24gYWZ0ZXIgcmVhZGluZyBmcm9tIHN0cmVhbQorICAgICAqICA8L3JlbWFya3M+CisgICAgICoKKyAgICAgKiAgPHNlZSBjcmVmPSJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0iLz4KKyAgICAgKiAgPHNlZSBjcmVmPSJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIi8+CisgICAgICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbQorICAgIHsKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ3Vyc29yIDAuLm4tMS4gIElmIHNpbmdsZUVsZW1lbnQhPW51bGwsIGN1cnNvciBpcyAwIHVudGlsIHlvdSBuZXh0KCksCisgICAgICAgICAqICB3aGljaCBidW1wcyBpdCB0byAxIG1lYW5pbmcgbm8gbW9yZSBlbGVtZW50cy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBpbnQgY3Vyc29yID0gMDsKKworICAgICAgICAvKiogPHN1bW1hcnk+VHJhY2sgc2luZ2xlIGVsZW1lbnRzIHcvbyBjcmVhdGluZyBhIGxpc3QuICBVcG9uIDJuZCBhZGQsIGFsbG9jIGxpc3QgKi8KKyAgICAgICAgcHJvdGVjdGVkIG9iamVjdCBzaW5nbGVFbGVtZW50OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgbGlzdCBvZiB0b2tlbnMgb3Igc3VidHJlZXMgd2UgYXJlIHRyYWNraW5nICovCisgICAgICAgIHByb3RlY3RlZCBJTGlzdCBlbGVtZW50czsKKworICAgICAgICAvKiogPHN1bW1hcnk+T25jZSBhIG5vZGUgLyBzdWJ0cmVlIGhhcyBiZWVuIHVzZWQgaW4gYSBzdHJlYW0sIGl0IG11c3QgYmUgZHVwJ2QKKyAgICAgICAgICogIGZyb20gdGhlbiBvbi4gIFN0cmVhbXMgYXJlIHJlc2V0IGFmdGVyIHN1YnJ1bGVzIHNvIHRoYXQgdGhlIHN0cmVhbXMKKyAgICAgICAgICogIGNhbiBiZSByZXVzZWQgaW4gZnV0dXJlIHN1YnJ1bGVzLiAgU28sIHJlc2V0IG11c3Qgc2V0IGEgZGlydHkgYml0LgorICAgICAgICAgKiAgSWYgZGlydHksIHRoZW4gbmV4dCgpIGFsd2F5cyByZXR1cm5zIGEgZHVwLgorICAgICAgICAgKgorICAgICAgICAgKiAgSSB3YW50ZWQgdG8gdXNlICJuYXVnaHR5IGJpdCIgaGVyZSwgYnV0IGNvdWxkbid0IHRoaW5rIG9mIGEgd2F5CisgICAgICAgICAqICB0byB1c2UgIm5hdWdodHkiLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgZGlydHkgPSBmYWxzZTsKKworICAgICAgICAvKiogPHN1bW1hcnk+VGhlIGVsZW1lbnQgb3Igc3RyZWFtIGRlc2NyaXB0aW9uOyB1c3VhbGx5IGhhcyBuYW1lIG9mIHRoZSB0b2tlbiBvcgorICAgICAgICAgKiAgcnVsZSByZWZlcmVuY2UgdGhhdCB0aGlzIGxpc3QgdHJhY2tzLiAgQ2FuIGluY2x1ZGUgcnVsZW5hbWUgdG9vLCBidXQKKyAgICAgICAgICogIHRoZSBleGNlcHRpb24gd291bGQgdHJhY2sgdGhhdCBpbmZvLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb247CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKCBJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24sIG9iamVjdCBvbmVFbGVtZW50ICkKKyAgICAgICAgICAgIDogdGhpcyggYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgQWRkKCBvbmVFbGVtZW50ICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q3JlYXRlIGEgc3RyZWFtLCBidXQgZmVlZCBvZmYgYW4gZXhpc3RpbmcgbGlzdDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24sIElMaXN0IGVsZW1lbnRzICkKKyAgICAgICAgICAgIDogdGhpcyggYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zaW5nbGVFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJlc2V0IHRoZSBjb25kaXRpb24gb2YgdGhpcyBzdHJlYW0gc28gdGhhdCBpdCBhcHBlYXJzIHdlIGhhdmUKKyAgICAgICAgICogIG5vdCBjb25zdW1lZCBhbnkgb2YgaXRzIGVsZW1lbnRzLiAgRWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgdW50b3VjaGVkLgorICAgICAgICAgKiAgT25jZSB3ZSByZXNldCB0aGUgc3RyZWFtLCBhbnkgZnV0dXJlIHVzZSB3aWxsIG5lZWQgZHVwbGljYXRlcy4gIFNldAorICAgICAgICAgKiAgdGhlIGRpcnR5IGJpdC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICAgICAgZGlydHkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGQoIG9iamVjdCBlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgJyIrZWxlbWVudERlc2NyaXB0aW9uKyInIGlzICIrZWwpOworICAgICAgICAgICAgaWYgKCBlbCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGVsZW1lbnRzICE9IG51bGwgKQorICAgICAgICAgICAgeyAvLyBpZiBpbiBsaXN0LCBqdXN0IGFkZAorICAgICAgICAgICAgICAgIGVsZW1lbnRzLkFkZCggZWwgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHNpbmdsZUVsZW1lbnQgPT0gbnVsbCApCisgICAgICAgICAgICB7IC8vIG5vIGVsZW1lbnRzIHlldCwgdHJhY2sgdy9vIGxpc3QKKyAgICAgICAgICAgICAgICBzaW5nbGVFbGVtZW50ID0gZWw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWRkaW5nIDJuZCBlbGVtZW50LCBtb3ZlIHRvIGxpc3QKKyAgICAgICAgICAgIGVsZW1lbnRzID0gbmV3IExpc3Q8b2JqZWN0PiggNSApOworICAgICAgICAgICAgZWxlbWVudHMuQWRkKCBzaW5nbGVFbGVtZW50ICk7CisgICAgICAgICAgICBzaW5nbGVFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGVsZW1lbnRzLkFkZCggZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFJldHVybiB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBzdHJlYW0uICBJZiBvdXQgb2YgZWxlbWVudHMsIHRocm93CisgICAgICAgICAqICBhbiBleGNlcHRpb24gdW5sZXNzIHNpemUoKT09MS4gIElmIHNpemUgaXMgMSwgdGhlbiByZXR1cm4gZWxlbWVudHNbMF0uCisgICAgICAgICAqICBSZXR1cm4gYSBkdXBsaWNhdGUgbm9kZS9zdWJ0cmVlIGlmIHN0cmVhbSBpcyBvdXQgb2YgZWxlbWVudHMgYW5kCisgICAgICAgICAqICBzaXplPT0xLiAgSWYgd2UndmUgYWxyZWFkeSB1c2VkIHRoZSBlbGVtZW50LCBkdXAgKGRpcnR5IGJpdCBzZXQpLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IE5leHRUcmVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBDb3VudDsKKyAgICAgICAgICAgIGlmICggZGlydHkgfHwgKCBjdXJzb3IgPj0gbiAmJiBuID09IDEgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWYgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIGlzIDEsIGR1cAorICAgICAgICAgICAgICAgIG9iamVjdCBlbCA9IE5leHRDb3JlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIER1cCggZWwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRlc3Qgc2l6ZSBhYm92ZSB0aGVuIGZldGNoCisgICAgICAgICAgICBvYmplY3QgZWwyID0gTmV4dENvcmUoKTsKKyAgICAgICAgICAgIHJldHVybiBlbDI7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBEbyB0aGUgd29yayBvZiBnZXR0aW5nIHRoZSBuZXh0IGVsZW1lbnQsIG1ha2luZyBzdXJlIHRoYXQgaXQncworICAgICAgICAgKiAgYSB0cmVlIG5vZGUgb3Igc3VidHJlZS4gIERlYWwgd2l0aCB0aGUgb3B0aW1pemF0aW9uIG9mIHNpbmdsZS0KKyAgICAgICAgICogIGVsZW1lbnQgbGlzdCB2ZXJzdXMgbGlzdCBvZiBzaXplID4gMS4gIFRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgKiAgaWYgdGhlIHN0cmVhbSBpcyBlbXB0eSBvciB3ZSdyZSBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemU+MS4KKyAgICAgICAgICogIHByb3RlY3RlZCBzbyB5b3UgY2FuIG92ZXJyaWRlIGluIGEgc3ViY2xhc3MgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgb2JqZWN0IE5leHRDb3JlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBDb3VudDsKKyAgICAgICAgICAgIGlmICggbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKCBlbGVtZW50RGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggY3Vyc29yID49IG4gKQorICAgICAgICAgICAgeyAvLyBvdXQgb2YgZWxlbWVudHM/CisgICAgICAgICAgICAgICAgaWYgKCBuID09IDEgKQorICAgICAgICAgICAgICAgIHsgIC8vIGlmIHNpemUgaXMgMSwgaXQncyBvazsgcmV0dXJuIGFuZCB3ZSdsbCBkdXAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvVHJlZSggc2luZ2xlRWxlbWVudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemUgd2FzIG5vdCAxLCBzbyB3ZSBjYW4ndCBkdXAKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uKCBlbGVtZW50RGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlIGhhdmUgZWxlbWVudHMKKyAgICAgICAgICAgIGlmICggc2luZ2xlRWxlbWVudCAhPSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJzb3IrKzsgLy8gbW92ZSBjdXJzb3IgZXZlbiBmb3Igc2luZ2xlIGVsZW1lbnQgbGlzdAorICAgICAgICAgICAgICAgIHJldHVybiBUb1RyZWUoIHNpbmdsZUVsZW1lbnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBtb3JlIHRoYW4gb25lIGluIGxpc3QsIHB1bGwgZnJvbSBlbGVtZW50cworICAgICAgICAgICAgb2JqZWN0IG8gPSBUb1RyZWUoIGVsZW1lbnRzW2N1cnNvcl0gKTsKKyAgICAgICAgICAgIGN1cnNvcisrOworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBXaGVuIGNvbnN0cnVjdGluZyB0cmVlcywgc29tZXRpbWVzIHdlIG5lZWQgdG8gZHVwIGEgdG9rZW4gb3IgQVNUCisgICAgICAgICAqIAlzdWJ0cmVlLiAgRHVwJ2luZyBhIHRva2VuIG1lYW5zIGp1c3QgY3JlYXRpbmcgYW5vdGhlciBBU1Qgbm9kZQorICAgICAgICAgKiAgYXJvdW5kIGl0LiAgRm9yIHRyZWVzLCB5b3UgbXVzdCBjYWxsIHRoZSBhZGFwdG9yLmR1cFRyZWUoKSB1bmxlc3MKKyAgICAgICAgICogIHRoZSBlbGVtZW50IGlzIGZvciBhIHRyZWUgcm9vdDsgdGhlbiBpdCBtdXN0IGJlIGEgbm9kZSBkdXAuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb2JqZWN0IER1cCggb2JqZWN0IGVsICk7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRW5zdXJlIHN0cmVhbSBlbWl0cyB0cmVlczsgdG9rZW5zIG11c3QgYmUgY29udmVydGVkIHRvIEFTVCBub2Rlcy4KKyAgICAgICAgICogIEFTVCBub2RlcyBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5tb2xlc3RlZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIG9iamVjdCBUb1RyZWUoIG9iamVjdCBlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSGFzTmV4dAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBzaW5nbGVFbGVtZW50ICE9IG51bGwgJiYgY3Vyc29yIDwgMSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgKCBlbGVtZW50cyAhPSBudWxsICYmIGN1cnNvciA8IGVsZW1lbnRzLkNvdW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgQ291bnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgIGlmICggc2luZ2xlRWxlbWVudCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIGVsZW1lbnRzICE9IG51bGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLkNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBEZXNjcmlwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudERlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDM0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9SZXdyaXRlUnVsZU5vZGVTdHJlYW0uY3MKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgSUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7CisgICAgdXNpbmcgTm90U3VwcG9ydGVkRXhjZXB0aW9uID0gU3lzdGVtLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgUXVldWVzIHVwIG5vZGVzIG1hdGNoZWQgb24gbGVmdCBzaWRlIG9mIC0+IGluIGEgdHJlZSBwYXJzZXIuIFRoaXMgaXMKKyAgICAgKiAgdGhlIGFuYWxvZyBvZiBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIGZvciBub3JtYWwgcGFyc2Vycy4KKyAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAqLworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZU5vZGVTdHJlYW0gOiBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0KKyAgICB7CisKKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlTm9kZVN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24gKQorICAgICAgICAgICAgOiBiYXNlKCBhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24gKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q3JlYXRlIGEgc3RyZWFtIHdpdGggb25lIGVsZW1lbnQ8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBSZXdyaXRlUnVsZU5vZGVTdHJlYW0oIElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBvYmplY3Qgb25lRWxlbWVudCApCisgICAgICAgICAgICA6IGJhc2UoIGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgb25lRWxlbWVudCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVOb2RlU3RyZWFtKCBJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgSUxpc3QgZWxlbWVudHMgKQorICAgICAgICAgICAgOiBiYXNlKCBhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24sIGVsZW1lbnRzICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IE5leHROb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5leHRDb3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IFRvVHJlZSggb2JqZWN0IGVsICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuRHVwTm9kZSggZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgRHVwKCBvYmplY3QgZWwgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBkdXAgZXZlcnkgbm9kZSwgc28gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBjYWxsaW5nIGR1cDsgc2hvcnQtCisgICAgICAgICAgICAvLyBjaXJjdWl0ZWQgbmV4dCgpIHNvIGl0IGRvZXNuJ3QgY2FsbC4KKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oICJkdXAgY2FuJ3QgYmUgY2FsbGVkIGZvciBhIG5vZGUgc3RyZWFtLiIgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDRiODkxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmNzCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIElMaXN0ID0gU3lzdGVtLkNvbGxlY3Rpb25zLklMaXN0OworCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA6IFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbQorICAgIHsKKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24gKQorICAgICAgICAgICAgOiBiYXNlKCBhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24gKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+Q3JlYXRlIGEgc3RyZWFtIHdpdGggb25lIGVsZW1lbnQ8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oIElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBvYmplY3Qgb25lRWxlbWVudCApCisgICAgICAgICAgICA6IGJhc2UoIGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgb25lRWxlbWVudCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKCBJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiwgSUxpc3QgZWxlbWVudHMgKQorICAgICAgICAgICAgOiBiYXNlKCBhZGFwdG9yLCBlbGVtZW50RGVzY3JpcHRpb24sIGVsZW1lbnRzICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJlYXQgbmV4dCBlbGVtZW50IGFzIGEgc2luZ2xlIG5vZGUgZXZlbiBpZiBpdCdzIGEgc3VidHJlZS4KKyAgICAgICAgICogIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIG5leHQoKSB3aGVuIHRoZSByZXN1bHQgaGFzIHRvIGJlIGEKKyAgICAgICAgICogIHRyZWUgcm9vdCBub2RlLiAgQWxzbyBwcmV2ZW50cyB1cyBmcm9tIGR1cGxpY2F0aW5nIHJlY2VudGx5LWFkZGVkCisgICAgICAgICAqICBjaGlsZHJlbjsgZS5nLiwgXih0eXBlIElEKSsgYWRkcyBJRCB0byB0eXBlIGFuZCB0aGVuIDJuZCBpdGVyYXRpb24KKyAgICAgICAgICogIG11c3QgZHVwIHRoZSB0eXBlIG5vZGUsIGJ1dCBJRCBoYXMgYmVlbiBhZGRlZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICoKKyAgICAgICAgICogIDxyZW1hcmtzPgorICAgICAgICAgKiAgUmVmZXJlbmNpbmcgYSBydWxlIHJlc3VsdCB0d2ljZSBpcyBvazsgZHVwIGVudGlyZSB0cmVlIGFzCisgICAgICAgICAqICB3ZSBjYW4ndCBiZSBhZGRpbmcgdHJlZXMgYXMgcm9vdDsgZS5nLiwgZXhwciBleHByLgorICAgICAgICAgKgorICAgICAgICAgKiAgSGlkZW91cyBjb2RlIGR1cGxpY2F0aW9uIGhlcmUgd2l0aCBzdXBlci5uZXh0KCkuICBDYW4ndCB0aGluayBvZgorICAgICAgICAgKiAgYSBwcm9wZXIgd2F5IHRvIHJlZmFjdG9yLiAgVGhpcyBuZWVkcyB0byBhbHdheXMgY2FsbCBkdXAgbm9kZQorICAgICAgICAgKiAgYW5kIHN1cGVyLm5leHQoKSBkb2Vzbid0IGtub3cgd2hpY2ggdG8gY2FsbDogZHVwIG5vZGUgb3IgZHVwIHRyZWUuCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTmV4dE5vZGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5Db25zb2xlLldyaXRlTGluZSgibmV4dE5vZGU6IGVsZW1lbnRzPXswfSwgc2luZ2xlRWxlbWVudD17MX0iLCBlbGVtZW50cywgKChJVHJlZSlzaW5nbGVFbGVtZW50KS5Ub1N0cmluZ1RyZWUoKSk7CisgICAgICAgICAgICBpbnQgbiA9IENvdW50OworICAgICAgICAgICAgaWYgKCBkaXJ0eSB8fCAoIGN1cnNvciA+PSBuICYmIG4gPT0gMSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemUgaXMgMSwgZHVwIChhdCBtb3N0IGEgc2luZ2xlIG5vZGUKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGZvciBtYWtpbmcgcm9vdCBub2RlcykuCisgICAgICAgICAgICAgICAgb2JqZWN0IGVsID0gTmV4dENvcmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5EdXBOb2RlKCBlbCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGVzdCBzaXplIGFib3ZlIHRoZW4gZmV0Y2gKKyAgICAgICAgICAgIG9iamVjdCB0cmVlID0gTmV4dENvcmUoKTsKKyAgICAgICAgICAgIHdoaWxlIChhZGFwdG9yLklzTmlsKHRyZWUpICYmIGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0cmVlKSA9PSAxKQorICAgICAgICAgICAgICAgIHRyZWUgPSBhZGFwdG9yLkdldENoaWxkKHRyZWUsIDApOworICAgICAgICAgICAgLy9TeXN0ZW0uQ29uc29sZS5Xcml0ZUxpbmUoIl9uZXh0PXswfSIsICgoSVRyZWUpdHJlZSkuVG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgb2JqZWN0IGVsMiA9IGFkYXB0b3IuRHVwTm9kZSh0cmVlKTsgLy8gZHVwIGp1c3QgdGhlIHJvb3QgKHdhbnQgbm9kZSBoZXJlKQorICAgICAgICAgICAgcmV0dXJuIGVsMjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgRHVwKCBvYmplY3QgZWwgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5EdXBUcmVlKCBlbCApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVSdWxlVG9rZW5TdHJlYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0MWU0NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1Jld3JpdGVSdWxlVG9rZW5TdHJlYW0uY3MKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgSUxpc3QgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSUxpc3Q7CisgICAgdXNpbmcgTm90U3VwcG9ydGVkRXhjZXB0aW9uID0gU3lzdGVtLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKKworICAgIFtTeXN0ZW0uU2VyaWFsaXphYmxlXQorICAgIHB1YmxpYyBjbGFzcyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIDogUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtCisgICAgeworCisgICAgICAgIHB1YmxpYyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKCBJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nIGVsZW1lbnREZXNjcmlwdGlvbiApCisgICAgICAgICAgICA6IGJhc2UoIGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oIElUcmVlQWRhcHRvciBhZGFwdG9yLCBzdHJpbmcgZWxlbWVudERlc2NyaXB0aW9uLCBvYmplY3Qgb25lRWxlbWVudCApCisgICAgICAgICAgICA6IGJhc2UoIGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgb25lRWxlbWVudCApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5DcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSggSVRyZWVBZGFwdG9yIGFkYXB0b3IsIHN0cmluZyBlbGVtZW50RGVzY3JpcHRpb24sIElMaXN0IGVsZW1lbnRzICkKKyAgICAgICAgICAgIDogYmFzZSggYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uLCBlbGVtZW50cyApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5HZXQgbmV4dCB0b2tlbiBmcm9tIHN0cmVhbSBhbmQgbWFrZSBhIG5vZGUgZm9yIGl0PC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgTmV4dE5vZGUoKQorICAgICAgICB7CisgICAgICAgICAgICBJVG9rZW4gdCA9IChJVG9rZW4pTmV4dENvcmUoKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkNyZWF0ZSggdCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgSVRva2VuIE5leHRUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoSVRva2VuKU5leHRDb3JlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBEb24ndCBjb252ZXJ0IHRvIGEgdHJlZSB1bmxlc3MgdGhleSBleHBsaWNpdGx5IGNhbGwgbmV4dFRyZWUuCisgICAgICAgICAqICBUaGlzIHdheSB3ZSBjYW4gZG8gaGV0ZXJvIHRyZWUgbm9kZXMgaW4gcmV3cml0ZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgVG9UcmVlKCBvYmplY3QgZWwgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZWw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IER1cCggb2JqZWN0IGVsICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiggImR1cCBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgdG9rZW4gc3RyZWFtLiIgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCAiYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UZW1wbGF0ZVRyZWVSdWxlUmV0dXJuU2NvcGVcMTQwMi5jcyIgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVGVtcGxhdGVUcmVlUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWM1NGYKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVGVtcGxhdGVUcmVlUnVsZVJldHVyblNjb3BlXDE0MDIuY3MiCkBAIC0wLDAgKzEsNjAgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgcHVibGljIGNsYXNzIFRlbXBsYXRlVHJlZVJ1bGVSZXR1cm5TY29wZTxUVGVtcGxhdGUsIFRUcmVlPiA6IFRyZWVSdWxlUmV0dXJuU2NvcGU8VFRyZWU+LCBJVGVtcGxhdGVSdWxlUmV0dXJuU2NvcGU8VFRlbXBsYXRlPiwgSVRlbXBsYXRlUnVsZVJldHVyblNjb3BlCisgICAgeworICAgICAgICBwcml2YXRlIFRUZW1wbGF0ZSBfdGVtcGxhdGU7CisKKyAgICAgICAgcHVibGljIFRUZW1wbGF0ZSBUZW1wbGF0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RlbXBsYXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdGVtcGxhdGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9iamVjdCBJVGVtcGxhdGVSdWxlUmV0dXJuU2NvcGUuVGVtcGxhdGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZUZpbHRlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVGaWx0ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3YjQxMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVGaWx0ZXIuY3MKQEAgLTAsMCArMSw5OSBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgQW50bHIuUnVudGltZS5NaXNjOworCisgICAgcHVibGljIGNsYXNzIFRyZWVGaWx0ZXIgOiBUcmVlUGFyc2VyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgSVRva2VuU3RyZWFtIG9yaWdpbmFsVG9rZW5TdHJlYW07CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3Igb3JpZ2luYWxBZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBUcmVlRmlsdGVyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQgKQorICAgICAgICAgICAgOiB0aGlzKCBpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUcmVlRmlsdGVyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSApCisgICAgICAgICAgICA6IGJhc2UoIGlucHV0LCBzdGF0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9yaWdpbmFsQWRhcHRvciA9IGlucHV0LlRyZWVBZGFwdG9yOworICAgICAgICAgICAgb3JpZ2luYWxUb2tlblN0cmVhbSA9IGlucHV0LlRva2VuU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBcHBseU9uY2UoIG9iamVjdCB0LCBBY3Rpb24gd2hpY2hSdWxlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0ID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2hhcmUgVHJlZVBhcnNlciBvYmplY3QgYnV0IG5vdCBwYXJzaW5nLXJlbGF0ZWQgc3RhdGUKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSggb3JpZ2luYWxBZGFwdG9yLCB0ICk7CisgICAgICAgICAgICAgICAgKCAoQ29tbW9uVHJlZU5vZGVTdHJlYW0paW5wdXQgKS5Ub2tlblN0cmVhbSA9IG9yaWdpbmFsVG9rZW5TdHJlYW07CisgICAgICAgICAgICAgICAgQmFja3RyYWNraW5nTGV2ZWwgPSAxOworICAgICAgICAgICAgICAgIHdoaWNoUnVsZSgpOworICAgICAgICAgICAgICAgIEJhY2t0cmFja2luZ0xldmVsID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBEb3dudXAoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgVHJlZVZpc2l0b3IgdiA9IG5ldyBUcmVlVmlzaXRvciggbmV3IENvbW1vblRyZWVBZGFwdG9yKCkgKTsKKyAgICAgICAgICAgIEZ1bmM8b2JqZWN0LCBvYmplY3Q+IHByZSA9ICggbyApID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXBwbHlPbmNlKCBvLCBUb3Bkb3duICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgICAgICB9OworICAgICAgICAgICAgRnVuYzxvYmplY3QsIG9iamVjdD4gcG9zdCA9ICggbyApID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXBwbHlPbmNlKCBvLCBCb3R0b211cCApOworICAgICAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHYuVmlzaXQoIHQsIHByZSwgcG9zdCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyB0aGUgZG93bnVwIHN0cmF0ZWd5IHVzZXMgdG8gZG8gdGhlIHVwIGFuZCBkb3duIHJ1bGVzLgorICAgICAgICAvLyB0byBvdmVycmlkZSwganVzdCBkZWZpbmUgdHJlZSBncmFtbWFyIHJ1bGUgdG9wZG93biBhbmQgdHVybiBvbgorICAgICAgICAvLyBmaWx0ZXI9dHJ1ZS4KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBUb3Bkb3duKCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQm90dG9tdXAoKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlSXRlcmF0b3IuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlSXRlcmF0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1NDlkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVJdGVyYXRvci5jcwpAQCAtMCwwICsxLDE4MCBAQAor77u/LyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICAvKiogUmV0dXJuIGEgbm9kZSBzdHJlYW0gZnJvbSBhIGRvdWJseS1saW5rZWQgdHJlZSB3aG9zZSBub2RlcworICAgICAqICBrbm93IHdoYXQgY2hpbGQgaW5kZXggdGhleSBhcmUuICBObyByZW1vdmUoKSBpcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiAgRW1pdCBuYXZpZ2F0aW9uIG5vZGVzIChET1dOLCBVUCwgYW5kIEVPRikgdG8gbGV0IHNob3cgdHJlZSBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvciA6IElFbnVtZXJhdG9yPG9iamVjdD4KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBJVHJlZUFkYXB0b3IgYWRhcHRvcjsKKyAgICAgICAgcHJvdGVjdGVkIG9iamVjdCByb290OworICAgICAgICBwcm90ZWN0ZWQgb2JqZWN0IHRyZWU7CisgICAgICAgIHByb3RlY3RlZCBib29sIGZpcnN0VGltZSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgYm9vbCByZWFjaGVkRW9mOworCisgICAgICAgIC8vIG5hdmlnYXRpb24gbm9kZXMgdG8gcmV0dXJuIGR1cmluZyB3YWxrIGFuZCBhdCBlbmQKKyAgICAgICAgcHVibGljIG9iamVjdCB1cDsKKyAgICAgICAgcHVibGljIG9iamVjdCBkb3duOworICAgICAgICBwdWJsaWMgb2JqZWN0IGVvZjsKKworICAgICAgICAvKiogSWYgd2UgZW1pdCBVUC9ET1dOIG5vZGVzLCB3ZSBuZWVkIHRvIHNwaXQgb3V0IG11bHRpcGxlIG5vZGVzIHBlcgorICAgICAgICAgKiAgbmV4dCgpIGNhbGwuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgUXVldWU8b2JqZWN0PiBub2RlczsKKworICAgICAgICBwdWJsaWMgVHJlZUl0ZXJhdG9yKCBDb21tb25UcmVlIHRyZWUgKQorICAgICAgICAgICAgOiB0aGlzKCBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSwgdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUcmVlSXRlcmF0b3IoIElUcmVlQWRhcHRvciBhZGFwdG9yLCBvYmplY3QgdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOworICAgICAgICAgICAgdGhpcy5yb290ID0gdHJlZTsKKyAgICAgICAgICAgIG5vZGVzID0gbmV3IFF1ZXVlPG9iamVjdD4oKTsKKyAgICAgICAgICAgIGRvd24gPSBhZGFwdG9yLkNyZWF0ZSggVG9rZW5UeXBlcy5Eb3duLCAiRE9XTiIgKTsKKyAgICAgICAgICAgIHVwID0gYWRhcHRvci5DcmVhdGUoIFRva2VuVHlwZXMuVXAsICJVUCIgKTsKKyAgICAgICAgICAgIGVvZiA9IGFkYXB0b3IuQ3JlYXRlKCBUb2tlblR5cGVzLkVuZE9mRmlsZSwgIkVPRiIgKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gSUVudW1lcmF0b3I8b2JqZWN0PiBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIG9iamVjdCBDdXJyZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHByaXZhdGUgc2V0OworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gSURpc3Bvc2FibGUgTWVtYmVycworCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgI3JlZ2lvbiBJRW51bWVyYXRvciBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGZpcnN0VGltZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbCBjb25kaXRpb24KKyAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoIGFkYXB0b3IuR2V0Q2hpbGRDb3VudCggdHJlZSApID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIG5vZGUgdHJlZSAoc3BlY2lhbCkKKyAgICAgICAgICAgICAgICAgICAgbm9kZXMuRW5xdWV1ZSggZW9mICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSB0cmVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlmIGFueSBxdWV1ZWQgdXAsIHVzZSB0aG9zZSBmaXJzdAorICAgICAgICAgICAgICAgIGlmICggbm9kZXMgIT0gbnVsbCAmJiBub2Rlcy5Db3VudCA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IG5vZGVzLkRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gbm9kZXMgbGVmdD8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0cmVlID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50ID0gZW9mOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBub2RlIHdpbGwgYmUgY2hpbGQgMCBpZiBhbnkgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYWRhcHRvci5HZXRDaGlsZENvdW50KCB0cmVlICkgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gYWRhcHRvci5HZXRDaGlsZCggdHJlZSwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLkVucXVldWUoIHRyZWUgKTsgLy8gcmVhbCBub2RlIGlzIG5leHQgYWZ0ZXIgRE9XTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBkb3duOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIGNoaWxkcmVuLCBsb29rIGZvciBuZXh0IHNpYmxpbmcgb2YgdHJlZSBvciBhbmNlc3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBwYXJlbnQgPSBhZGFwdG9yLkdldFBhcmVudCggdHJlZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIHdlJ3JlIG91dCBvZiBzaWJsaW5ncywga2VlcCBwb3BwaW5nIGJhY2sgdXAgdG93YXJkcyByb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBwYXJlbnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5HZXRDaGlsZEluZGV4KCB0cmVlICkgKyAxID49IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCggcGFyZW50ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuRW5xdWV1ZSggdXAgKTsgLy8gd2UncmUgbW92aW5nIGJhY2sgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gYWRhcHRvci5HZXRQYXJlbnQoIHRyZWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBub2RlcyBsZWZ0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGFyZW50ID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9IG51bGw7IC8vIGJhY2sgYXQgcm9vdD8gbm90aGluZyBsZWZ0IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuRW5xdWV1ZSggZW9mICk7IC8vIGFkZCB0byBxdWV1ZSwgbWlnaHQgaGF2ZSBVUCBub2RlcyBpbiB0aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50ID0gbm9kZXMuRGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgZm91bmQgYSBub2RlIHdpdGggYW4gdW52aXNpdGVkIHNpYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBpdCBhbmQgcmV0dXJuIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0U2libGluZ0luZGV4ID0gYWRhcHRvci5HZXRDaGlsZEluZGV4KCB0cmVlICkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gYWRhcHRvci5HZXRDaGlsZCggcGFyZW50LCBuZXh0U2libGluZ0luZGV4ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLkVucXVldWUoIHRyZWUgKTsgLy8gYWRkIHRvIHF1ZXVlLCBtaWdodCBoYXZlIFVQIG5vZGVzIGluIHRoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBub2Rlcy5EZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIHJlc3VsdCA9IEN1cnJlbnQgIT0gZW9mIHx8ICFyZWFjaGVkRW9mOworICAgICAgICAgICAgcmVhY2hlZEVvZiA9IEN1cnJlbnQgPT0gZW9mOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3RUaW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyZWUgPSByb290OworICAgICAgICAgICAgbm9kZXMuQ2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUGFyc2VyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVBhcnNlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjdlZTIzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVBhcnNlci5jcwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgQ29uZGl0aW9uYWxBdHRyaWJ1dGUgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuQ29uZGl0aW9uYWxBdHRyaWJ1dGU7CisgICAgdXNpbmcgUmVnZXggPSBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXg7CisgICAgdXNpbmcgUmVnZXhPcHRpb25zID0gU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zLlJlZ2V4T3B0aW9uczsKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKKyAgICAgKiAgb2YgdGhpcy4gIEFsbCB0aGUgZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeSBpcyBzaGFyZWQgd2l0aCBQYXJzZXIgdmlhCisgICAgICogIHRoZSBCYXNlUmVjb2duaXplciBzdXBlcmNsYXNzLgorICAgICAqICA8L3N1bW1hcnk+CisgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVHJlZVBhcnNlciA6IEJhc2VSZWNvZ25pemVyCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERPV04gPSBUb2tlblR5cGVzLkRvd247CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVVAgPSBUb2tlblR5cGVzLlVwOworCisgICAgICAgIC8vIHByZWNvbXBpbGVkIHJlZ2V4IHVzZWQgYnkgaW5Db250ZXh0CisgICAgICAgIHN0YXRpYyBzdHJpbmcgZG90ZG90ID0gIi4qW14uXVxcLlxcLlteLl0uKiI7CisgICAgICAgIHN0YXRpYyBzdHJpbmcgZG91YmxlRXRjID0gIi4qXFwuXFwuXFwuXFxzK1xcLlxcLlxcLi4qIjsKKyAgICAgICAgc3RhdGljIFJlZ2V4IGRvdGRvdFBhdHRlcm4gPSBuZXcgUmVnZXgoIGRvdGRvdCwgUmVnZXhPcHRpb25zLkNvbXBpbGVkICk7CisgICAgICAgIHN0YXRpYyBSZWdleCBkb3VibGVFdGNQYXR0ZXJuID0gbmV3IFJlZ2V4KCBkb3VibGVFdGMsIFJlZ2V4T3B0aW9ucy5Db21waWxlZCApOworCisgICAgICAgIHByb3RlY3RlZCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQ7CisKKyAgICAgICAgcHVibGljIFRyZWVQYXJzZXIoIElUcmVlTm9kZVN0cmVhbSBpbnB1dCApCisgICAgICAgICAgICA6IGJhc2UoKSAvLyBoaWdobGlnaHQgdGhhdCB3ZSBnbyB0byBzdXBlciB0byBzZXQgc3RhdGUgb2JqZWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFRyZWVOb2RlU3RyZWFtKCBpbnB1dCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRyZWVQYXJzZXIoIElUcmVlTm9kZVN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKyAgICAgICAgICAgIDogYmFzZSggc3RhdGUgKSAvLyBzaGFyZSB0aGUgc3RhdGUgb2JqZWN0IHdpdGggYW5vdGhlciBwYXJzZXIKKyAgICAgICAgeworICAgICAgICAgICAgU2V0VHJlZU5vZGVTdHJlYW0oIGlucHV0ICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuUmVzZXQoKTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgICAgICAgICBpZiAoIGlucHV0ICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0LlNlZWsoIDAgKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlNldCB0aGUgaW5wdXQgc3RyZWFtPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFNldFRyZWVOb2RlU3RyZWFtKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVHJlZU5vZGVTdHJlYW0gR2V0VHJlZU5vZGVTdHJlYW0oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFNvdXJjZU5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LlNvdXJjZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb2JqZWN0IEdldEN1cnJlbnRJbnB1dFN5bWJvbCggSUludFN0cmVhbSBpbnB1dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoIChJVHJlZU5vZGVTdHJlYW0paW5wdXQgKS5MVCggMSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIG9iamVjdCBHZXRNaXNzaW5nU3ltYm9sKCBJSW50U3RyZWFtIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFRva2VuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldCBmb2xsb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdG9rZW5UZXh0ID0KKyAgICAgICAgICAgICAgICAiPG1pc3NpbmcgIiArIFRva2VuTmFtZXNbZXhwZWN0ZWRUb2tlblR5cGVdICsgIj4iOworICAgICAgICAgICAgSVRyZWVBZGFwdG9yIGFkYXB0b3IgPSAoKElUcmVlTm9kZVN0cmVhbSllLklucHV0KS5UcmVlQWRhcHRvcjsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdG9yLkNyZWF0ZShuZXcgQ29tbW9uVG9rZW4oZXhwZWN0ZWRUb2tlblR5cGUsIHRva2VuVGV4dCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKyAgICAgICAgICogIGVudGlyZSB0cmVlIGlmIG5vZGUgaGFzIGNoaWxkcmVuLiAgSWYgY2hpbGRyZW4sIHNjYW4gdW50aWwKKyAgICAgICAgICogIGNvcnJlc3BvbmRpbmcgVVAgbm9kZS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE1hdGNoQW55KCBJSW50U3RyZWFtIGlnbm9yZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgLy8gYWx3YXlzIGNvbnN1bWUgdGhlIGN1cnJlbnQgbm9kZQorICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgLy8gaWYgdGhlIG5leHQgbm9kZSBpcyBET1dOLCB0aGVuIHRoZSBjdXJyZW50IG5vZGUgaXMgYSBzdWJ0cmVlOgorICAgICAgICAgICAgLy8gc2tpcCB0byBjb3JyZXNwb25kaW5nIFVQLiBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCisgICAgICAgICAgICBpbnQgbG9vayA9IGlucHV0LkxBKCAxICk7CisgICAgICAgICAgICBpZiAoIGxvb2sgPT0gRE9XTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKCBsZXZlbCA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoIDEgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFVQOgorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZXMuRW5kT2ZGaWxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuQ29uc3VtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgorICAgICAgICAgKiAgcGx1cyB3ZSB3YW50IHRvIGFsdGVyIHRoZSBleGNlcHRpb24gdHlwZS4gIERvbid0IHRyeSB0byByZWNvdmVyCisgICAgICAgICAqICBmcm9tIHRyZWUgcGFyc2VyIGVycm9ycyBpbmxpbmUuLi4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBvYmplY3QgUmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oIElJbnRTdHJlYW0gaW5wdXQsIGludCB0dHlwZSwgQml0U2V0IGZvbGxvdyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oIHR0eXBlLCAoSVRyZWVOb2RlU3RyZWFtKWlucHV0ICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBQcmVmaXggZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBncmFtbWFyIG5hbWUgYmVjYXVzZSBtZXNzYWdlIGlzCisgICAgICAgICAqICBhbHdheXMgaW50ZW5kZWQgZm9yIHRoZSBwcm9ncmFtbWVyIGJlY2F1c2UgdGhlIHBhcnNlciBidWlsdAorICAgICAgICAgKiAgdGhlIGlucHV0IHRyZWUgbm90IHRoZSB1c2VyLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBHZXRFcnJvckhlYWRlciggUmVjb2duaXRpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHcmFtbWFyRmlsZU5hbWUgKyAiOiBub2RlIGZyb20gIiArCisgICAgICAgICAgICAgICAgICAgKCBlLkFwcHJveGltYXRlTGluZUluZm8gPyAiYWZ0ZXIgIiA6ICIiICkgKyAibGluZSAiICsgZS5MaW5lICsgIjoiICsgZS5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBUcmVlIHBhcnNlcnMgcGFyc2Ugbm9kZXMgdGhleSB1c3VhbGx5IGhhdmUgYSB0b2tlbiBvYmplY3QgYXMKKyAgICAgICAgICogIHBheWxvYWQuIFNldCB0aGUgZXhjZXB0aW9uIHRva2VuIGFuZCBkbyB0aGUgZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0RXJyb3JNZXNzYWdlKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlLCBzdHJpbmdbXSB0b2tlbk5hbWVzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0aGlzIGlzIFRyZWVQYXJzZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUcmVlQWRhcHRvciBhZGFwdG9yID0gKCAoSVRyZWVOb2RlU3RyZWFtKWUuSW5wdXQgKS5UcmVlQWRhcHRvcjsKKyAgICAgICAgICAgICAgICBlLlRva2VuID0gYWRhcHRvci5HZXRUb2tlbiggZS5Ob2RlICk7CisgICAgICAgICAgICAgICAgaWYgKCBlLlRva2VuID09IG51bGwgKQorICAgICAgICAgICAgICAgIHsgLy8gY291bGQgYmUgYW4gVVAvRE9XTiBub2RlCisgICAgICAgICAgICAgICAgICAgIGUuVG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4oIGFkYXB0b3IuR2V0VHlwZSggZS5Ob2RlICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5HZXRUZXh0KCBlLk5vZGUgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiYXNlLkdldEVycm9yTWVzc2FnZSggZSwgdG9rZW5OYW1lcyApOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlSW4oIHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuVHJhY2VJbiggcnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoIDEgKSApOworICAgICAgICB9CisKKyAgICAgICAgW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFRyYWNlT3V0KCBzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLlRyYWNlT3V0KCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCggMSApICk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVQYXR0ZXJuTGV4ZXIuY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUGF0dGVybkxleGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDIyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUGF0dGVybkxleGVyLmNzCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lLlRyZWUKK3sKKyAgICB1c2luZyBTdHJpbmdCdWlsZGVyID0gU3lzdGVtLlRleHQuU3RyaW5nQnVpbGRlcjsKKworICAgIHB1YmxpYyBjbGFzcyBUcmVlUGF0dGVybkxleGVyCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJlZ2luID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBFbmQgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IElkID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBBcmcgPSA0OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFBlcmNlbnQgPSA1OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IENvbG9uID0gNjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBEb3QgPSA3OworCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGUgdHJlZSBwYXR0ZXJuIHRvIGxleCBsaWtlICIoQSBCIEMpIjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBwYXR0ZXJuOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5JbmRleCBpbnRvIGlucHV0IHN0cmluZzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBwID0gLTE7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkN1cnJlbnQgY2hhcjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBjOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5Ib3cgbG9uZyBpcyB0aGUgcGF0dGVybiBpbiBjaGFyPzwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCBuOworCisgICAgICAgIC8qKiA8c3VtbWFyeT5TZXQgd2hlbiB0b2tlbiB0eXBlIGlzIElEIG9yIEFSRyAobmFtZSBtaW1pY3MgSmF2YSdzIFN0cmVhbVRva2VuaXplcik8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIHN2YWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHB1YmxpYyBib29sIGVycm9yID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRyZWVQYXR0ZXJuTGV4ZXIoIHN0cmluZyBwYXR0ZXJuICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMubiA9IHBhdHRlcm4uTGVuZ3RoOworICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgaW50IE5leHRUb2tlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN2YWwuTGVuZ3RoID0gMDsgLy8gcmVzZXQsIGJ1dCByZXVzZSBidWZmZXIKKyAgICAgICAgICAgIHdoaWxlICggYyAhPSBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICcgJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x0JyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoICggYyA+PSAnYScgJiYgYyA8PSAneicgKSB8fCAoIGMgPj0gJ0EnICYmIGMgPD0gJ1onICkgfHwgYyA9PSAnXycgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ZhbC5BcHBlbmQoIChjaGFyKWMgKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoICggYyA+PSAnYScgJiYgYyA8PSAneicgKSB8fCAoIGMgPj0gJ0EnICYmIGMgPD0gJ1onICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGMgPj0gJzAnICYmIGMgPD0gJzknICkgfHwgYyA9PSAnXycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdmFsLkFwcGVuZCggKGNoYXIpYyApOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICcoJyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCZWdpbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICcpJyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggYyA9PSAnJScgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyY2VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICc6JyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBjID09ICcuJyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEb3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggYyA9PSAnWycgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBbeF0gYXMgYSBzdHJpbmcsIHJldHVybmluZyB4CisgICAgICAgICAgICAgICAgICAgIENvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBjICE9ICddJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYyA9PSAnXFwnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjICE9ICddJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmFsLkFwcGVuZCggJ1xcJyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmFsLkFwcGVuZCggKGNoYXIpYyApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2YWwuQXBwZW5kKCAoY2hhciljICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zdW1lKCk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDaGFyU3RyZWFtQ29uc3RhbnRzLkVuZE9mRmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmICggcCA+PSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9IHBhdHRlcm5bcF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUGF0dGVyblBhcnNlci5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVQYXR0ZXJuUGFyc2VyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTIzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUGF0dGVyblBhcnNlci5jcwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiA9IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uOworCisgICAgcHVibGljIGNsYXNzIFRyZWVQYXR0ZXJuUGFyc2VyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgVHJlZVBhdHRlcm5MZXhlciB0b2tlbml6ZXI7CisgICAgICAgIHByb3RlY3RlZCBpbnQgdHR5cGU7CisgICAgICAgIHByb3RlY3RlZCBUcmVlV2l6YXJkIHdpemFyZDsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBUcmVlUGF0dGVyblBhcnNlciggVHJlZVBhdHRlcm5MZXhlciB0b2tlbml6ZXIsIFRyZWVXaXphcmQgd2l6YXJkLCBJVHJlZUFkYXB0b3IgYWRhcHRvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyOworICAgICAgICAgICAgdGhpcy53aXphcmQgPSB3aXphcmQ7CisgICAgICAgICAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7IC8vIGtpY2tzdGFydAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFBhdHRlcm4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHR0eXBlID09IFRyZWVQYXR0ZXJuTGV4ZXIuQmVnaW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVRyZWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLklkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3Qgbm9kZSA9IFBhcnNlTm9kZSgpOworICAgICAgICAgICAgICAgIGlmICggdHR5cGUgPT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBleHRyYSBqdW5rIG9uIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2VUcmVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0dHlwZSAhPSBUcmVlUGF0dGVybkxleGVyLkJlZ2luICkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm8gYmVnaW5uaW5nLiIpOworCisgICAgICAgICAgICB0dHlwZSA9IHRva2VuaXplci5OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIG9iamVjdCByb290ID0gUGFyc2VOb2RlKCk7CisgICAgICAgICAgICBpZiAoIHJvb3QgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoIHR0eXBlID09IFRyZWVQYXR0ZXJuTGV4ZXIuQmVnaW4gfHwKKyAgICAgICAgICAgICAgICAgICAgdHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5JZCB8fAorICAgICAgICAgICAgICAgICAgICB0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLlBlcmNlbnQgfHwKKyAgICAgICAgICAgICAgICAgICAgdHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5Eb3QgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggdHR5cGUgPT0gVHJlZVBhdHRlcm5MZXhlci5CZWdpbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvYmplY3Qgc3VidHJlZSA9IFBhcnNlVHJlZSgpOworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLkFkZENoaWxkKCByb290LCBzdWJ0cmVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZCA9IFBhcnNlTm9kZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGNoaWxkID09IG51bGwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLkFkZENoaWxkKCByb290LCBjaGlsZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB0dHlwZSAhPSBUcmVlUGF0dGVybkxleGVyLkVuZCApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIGVuZC4iKTsKKworICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7CisgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZU5vZGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAiJWxhYmVsOiIgcHJlZml4CisgICAgICAgICAgICBzdHJpbmcgbGFiZWwgPSBudWxsOworICAgICAgICAgICAgaWYgKCB0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLlBlcmNlbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGlmICggdHR5cGUgIT0gVHJlZVBhdHRlcm5MZXhlci5JZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFiZWwgPSB0b2tlbml6ZXIuc3ZhbC5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGlmICggdHR5cGUgIT0gVHJlZVBhdHRlcm5MZXhlci5Db2xvbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7IC8vIG1vdmUgdG8gSUQgZm9sbG93aW5nIGNvbG9uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdpbGRjYXJkPworICAgICAgICAgICAgaWYgKCB0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLkRvdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHR5cGUgPSB0b2tlbml6ZXIuTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgSVRva2VuIHdpbGRjYXJkUGF5bG9hZCA9IG5ldyBDb21tb25Ub2tlbiggMCwgIi4iICk7CisgICAgICAgICAgICAgICAgVHJlZVdpemFyZC5UcmVlUGF0dGVybiBub2RlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVXaXphcmQuV2lsZGNhcmRUcmVlUGF0dGVybiggd2lsZGNhcmRQYXlsb2FkICk7CisgICAgICAgICAgICAgICAgaWYgKCBsYWJlbCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vICJJRCIgb3IgIklEW2FyZ10iCisgICAgICAgICAgICBpZiAoIHR0eXBlICE9IFRyZWVQYXR0ZXJuTGV4ZXIuSWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyaW5nIHRva2VuTmFtZSA9IHRva2VuaXplci5zdmFsLlRvU3RyaW5nKCk7CisgICAgICAgICAgICB0dHlwZSA9IHRva2VuaXplci5OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICggdG9rZW5OYW1lLkVxdWFscyggIm5pbCIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0b3IuTmlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmcgdGV4dCA9IHRva2VuTmFtZTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhcmcKKyAgICAgICAgICAgIHN0cmluZyBhcmcgPSBudWxsOworICAgICAgICAgICAgaWYgKCB0dHlwZSA9PSBUcmVlUGF0dGVybkxleGVyLkFyZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJnID0gdG9rZW5pemVyLnN2YWwuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gYXJnOworICAgICAgICAgICAgICAgIHR0eXBlID0gdG9rZW5pemVyLk5leHRUb2tlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgbm9kZQorICAgICAgICAgICAgaW50IHRyZWVOb2RlVHlwZSA9IHdpemFyZC5HZXRUb2tlblR5cGUoIHRva2VuTmFtZSApOworICAgICAgICAgICAgaWYgKCB0cmVlTm9kZVR5cGUgPT0gVG9rZW5UeXBlcy5JbnZhbGlkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9iamVjdCBub2RlMjsKKyAgICAgICAgICAgIG5vZGUyID0gYWRhcHRvci5DcmVhdGUoIHRyZWVOb2RlVHlwZSwgdGV4dCApOworICAgICAgICAgICAgaWYgKCBsYWJlbCAhPSBudWxsICYmIG5vZGUyLkdldFR5cGUoKSA9PSB0eXBlb2YoIFRyZWVXaXphcmQuVHJlZVBhdHRlcm4gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCAoVHJlZVdpemFyZC5UcmVlUGF0dGVybilub2RlMiApLmxhYmVsID0gbGFiZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFyZyAhPSBudWxsICYmIG5vZGUyLkdldFR5cGUoKSA9PSB0eXBlb2YoIFRyZWVXaXphcmQuVHJlZVBhdHRlcm4gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCAoVHJlZVdpemFyZC5UcmVlUGF0dGVybilub2RlMiApLmhhc1RleHRBcmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5vZGUyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVJld3JpdGVyLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVJld3JpdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTBjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUmV3cml0ZXIuY3MKQEAgLTAsMCArMSwxNDQgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuTWlzYzsKKworICAgIHVzaW5nIENvbnNvbGUgPSBTeXN0ZW0uQ29uc29sZTsKKworICAgIHB1YmxpYyBjbGFzcyBUcmVlUmV3cml0ZXIgOiBUcmVlUGFyc2VyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzaG93VHJhbnNmb3JtYXRpb25zOworCisgICAgICAgIHByb3RlY3RlZCBJVG9rZW5TdHJlYW0gb3JpZ2luYWxUb2tlblN0cmVhbTsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBvcmlnaW5hbEFkYXB0b3I7CisKKyAgICAgICAgRnVuYzxJQXN0UnVsZVJldHVyblNjb3BlPiB0b3Bkb3duX2Z1bmM7CisgICAgICAgIEZ1bmM8SUFzdFJ1bGVSZXR1cm5TY29wZT4gYm90dG9tdXBfZnVuYzsKKworICAgICAgICBwdWJsaWMgVHJlZVJld3JpdGVyKCBJVHJlZU5vZGVTdHJlYW0gaW5wdXQgKQorICAgICAgICAgICAgOiB0aGlzKCBpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUcmVlUmV3cml0ZXIoIElUcmVlTm9kZVN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKyAgICAgICAgICAgIDogYmFzZSggaW5wdXQsIHN0YXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgb3JpZ2luYWxBZGFwdG9yID0gaW5wdXQuVHJlZUFkYXB0b3I7CisgICAgICAgICAgICBvcmlnaW5hbFRva2VuU3RyZWFtID0gaW5wdXQuVG9rZW5TdHJlYW07CisgICAgICAgICAgICB0b3Bkb3duX2Z1bmMgPSAoKSA9PiBUb3Bkb3duKCk7CisgICAgICAgICAgICBib3R0b211cF9mdW5jID0gKCkgPT4gQm90dG9tdXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBBcHBseU9uY2UoIG9iamVjdCB0LCBGdW5jPElBc3RSdWxlUmV0dXJuU2NvcGU+IHdoaWNoUnVsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggdCA9PSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2hhcmUgVHJlZVBhcnNlciBvYmplY3QgYnV0IG5vdCBwYXJzaW5nLXJlbGF0ZWQgc3RhdGUKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSggb3JpZ2luYWxBZGFwdG9yLCB0ICk7CisgICAgICAgICAgICAgICAgKCAoQ29tbW9uVHJlZU5vZGVTdHJlYW0paW5wdXQgKS5Ub2tlblN0cmVhbSA9IG9yaWdpbmFsVG9rZW5TdHJlYW07CisgICAgICAgICAgICAgICAgQmFja3RyYWNraW5nTGV2ZWwgPSAxOworICAgICAgICAgICAgICAgIElBc3RSdWxlUmV0dXJuU2NvcGUgciA9IHdoaWNoUnVsZSgpOworICAgICAgICAgICAgICAgIEJhY2t0cmFja2luZ0xldmVsID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIEZhaWxlZCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OworCisgICAgICAgICAgICAgICAgaWYgKHNob3dUcmFuc2Zvcm1hdGlvbnMgJiYgciAhPSBudWxsICYmICF0LkVxdWFscyhyLlRyZWUpICYmIHIuVHJlZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBSZXBvcnRUcmFuc2Zvcm1hdGlvbih0LCByLlRyZWUpOworCisgICAgICAgICAgICAgICAgaWYgKCByICE9IG51bGwgJiYgci5UcmVlICE9IG51bGwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5UcmVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFJlY29nbml0aW9uRXhjZXB0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgQXBwbHlSZXBlYXRlZGx5KCBvYmplY3QgdCwgRnVuYzxJQXN0UnVsZVJldHVyblNjb3BlPiB3aGljaFJ1bGUgKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIHRyZWVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlICggdHJlZUNoYW5nZWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCB1ID0gQXBwbHlPbmNlKCB0LCB3aGljaFJ1bGUgKTsKKyAgICAgICAgICAgICAgICB0cmVlQ2hhbmdlZCA9ICF0LkVxdWFscyggdSApOworICAgICAgICAgICAgICAgIHQgPSB1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRG93bnVwKCBvYmplY3QgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBEb3dudXAoIHQsIGZhbHNlICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgRG93bnVwKCBvYmplY3QgdCwgYm9vbCBzaG93VHJhbnNmb3JtYXRpb25zICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zaG93VHJhbnNmb3JtYXRpb25zID0gc2hvd1RyYW5zZm9ybWF0aW9uczsKKyAgICAgICAgICAgIFRyZWVWaXNpdG9yIHYgPSBuZXcgVHJlZVZpc2l0b3IoIG5ldyBDb21tb25UcmVlQWRhcHRvcigpICk7CisgICAgICAgICAgICB0ID0gdi5WaXNpdCggdCwgKCBvICkgPT4gQXBwbHlPbmNlKCBvLCB0b3Bkb3duX2Z1bmMgKSwgKCBvICkgPT4gQXBwbHlSZXBlYXRlZGx5KCBvLCBib3R0b211cF9mdW5jICkgKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyB0aGUgZG93bnVwIHN0cmF0ZWd5IHVzZXMgdG8gZG8gdGhlIHVwIGFuZCBkb3duIHJ1bGVzLgorICAgICAgICAvLyB0byBvdmVycmlkZSwganVzdCBkZWZpbmUgdHJlZSBncmFtbWFyIHJ1bGUgdG9wZG93biBhbmQgdHVybiBvbgorICAgICAgICAvLyBmaWx0ZXI9dHJ1ZS4KKyAgICAgICAgcHVibGljIHZpcnR1YWwgSUFzdFJ1bGVSZXR1cm5TY29wZSBUb3Bkb3duKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJQXN0UnVsZVJldHVyblNjb3BlIEJvdHRvbXVwKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogT3ZlcnJpZGUgdGhpcyBpZiB5b3UgbmVlZCB0cmFuc2Zvcm1hdGlvbiB0cmFjaW5nIHRvIGdvIHNvbWV3aGVyZQorICAgICAgICAgKiAgb3RoZXIgdGhhbiBzdGRvdXQgb3IgaWYgeW91J3JlIG5vdCB1c2luZyBJVHJlZS1kZXJpdmVkIHRyZWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBSZXBvcnRUcmFuc2Zvcm1hdGlvbihvYmplY3Qgb2xkVHJlZSwgb2JqZWN0IG5ld1RyZWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmVlIG9sZCA9IG9sZFRyZWUgYXMgSVRyZWU7CisgICAgICAgICAgICBJVHJlZSBAbmV3ID0gbmV3VHJlZSBhcyBJVHJlZTsKKyAgICAgICAgICAgIHN0cmluZyBvbGRNZXNzYWdlID0gb2xkICE9IG51bGwgPyBvbGQuVG9TdHJpbmdUcmVlKCkgOiAiPz8iOworICAgICAgICAgICAgc3RyaW5nIG5ld01lc3NhZ2UgPSBAbmV3ICE9IG51bGwgPyBAbmV3LlRvU3RyaW5nVHJlZSgpIDogIj8/IjsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gLT4gezF9Iiwgb2xkTWVzc2FnZSwgbmV3TWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgImEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVJ1bGVSZXR1cm5TY29wZVwxNDAxLmNzIiAiYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVHJlZS9UcmVlUnVsZVJldHVyblNjb3BlXDE0MDEuY3MiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTI4ZTIKLS0tIC9kZXYvbnVsbAorKysgImIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVJ1bGVSZXR1cm5TY29wZVwxNDAxLmNzIgpAQCAtMCwwICsxLDg0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFBhcnNlclJ1bGVSZXR1cm5TY29wZSBleGNlcHQgdGhhdAorICAgICAqICB0aGUgc3RhcnQgcHJvcGVydHkgaXMgYSB0cmVlIG5vZGVzIG5vdCBUb2tlbiBvYmplY3QKKyAgICAgKiAgd2hlbiB5b3UgYXJlIHBhcnNpbmcgdHJlZXMuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKi8KKyAgICBbU3lzdGVtLlNlcmlhbGl6YWJsZV0KKyAgICBwdWJsaWMgY2xhc3MgVHJlZVJ1bGVSZXR1cm5TY29wZTxUVHJlZT4gOiBJUnVsZVJldHVyblNjb3BlPFRUcmVlPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBUVHJlZSBfc3RhcnQ7CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkdldHMgdGhlIGZpcnN0IG5vZGUgb3Igcm9vdCBub2RlIG9mIHRyZWUgbWF0Y2hlZCBmb3IgdGhpcyBydWxlLjwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIFRUcmVlIFN0YXJ0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfc3RhcnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdGFydCA9IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2JqZWN0IElSdWxlUmV0dXJuU2NvcGUuU3RhcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVFRyZWUgSVJ1bGVSZXR1cm5TY29wZTxUVHJlZT4uU3RvcAorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUVHJlZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvYmplY3QgSVJ1bGVSZXR1cm5TY29wZS5TdG9wCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFRUcmVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVWaXNpdG9yLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVZpc2l0b3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlNDllYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVWaXNpdG9yLmNzCkBAIC0wLDAgKzEsODMgQEAKK++7vy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbmFtZXNwYWNlIEFudGxyLlJ1bnRpbWUuVHJlZQoreworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuTWlzYzsKKworICAgIC8qKiA8c3VtbWFyeT5EbyBhIGRlcHRoIGZpcnN0IHdhbGsgb2YgYSB0cmVlLCBhcHBseWluZyBwcmUoKSBhbmQgcG9zdCgpIGFjdGlvbnMgYXMgd2UgZ28uPC9zdW1tYXJ5PiAqLworICAgIHB1YmxpYyBjbGFzcyBUcmVlVmlzaXRvcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgICAgIHB1YmxpYyBUcmVlVmlzaXRvciggSVRyZWVBZGFwdG9yIGFkYXB0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUcmVlVmlzaXRvcigpCisgICAgICAgICAgICA6IHRoaXMoIG5ldyBDb21tb25UcmVlQWRhcHRvcigpICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVmlzaXQgZXZlcnkgbm9kZSBpbiB0cmVlIHQgYW5kIHRyaWdnZXIgYW4gYWN0aW9uIGZvciBlYWNoIG5vZGUKKyAgICAgICAgICogIGJlZm9yZS9hZnRlciBoYXZpbmcgdmlzaXRlZCBhbGwgb2YgaXRzIGNoaWxkcmVuLiAgQm90dG9tIHVwIHdhbGsuCisgICAgICAgICAqICBFeGVjdXRlIGJvdGggYWN0aW9ucyBldmVuIGlmIHQgaGFzIG5vIGNoaWxkcmVuLiAgSWdub3JlIHJldHVybgorICAgICAgICAgKiAgcmVzdWx0cyBmcm9tIHRyYW5zZm9ybWluZyBjaGlsZHJlbiBzaW5jZSB0aGV5IHdpbGwgaGF2ZSBhbHRlcmVkCisgICAgICAgICAqICB0aGUgY2hpbGQgbGlzdCBvZiB0aGlzIG5vZGUgKHRoZWlyIHBhcmVudCkuICBSZXR1cm4gcmVzdWx0IG9mCisgICAgICAgICAqICBhcHBseWluZyBwb3N0IGFjdGlvbiB0byB0aGlzIG5vZGUuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgb2JqZWN0IFZpc2l0KCBvYmplY3QgdCwgSVRyZWVWaXNpdG9yQWN0aW9uIGFjdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigidmlzaXQgIisoKFRyZWUpdCkudG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgYm9vbCBpc05pbCA9IGFkYXB0b3IuSXNOaWwoIHQgKTsKKyAgICAgICAgICAgIGlmICggYWN0aW9uICE9IG51bGwgJiYgIWlzTmlsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gYWN0aW9uLlByZSggdCApOyAvLyBpZiByZXdyaXR0ZW4sIHdhbGsgY2hpbGRyZW4gb2YgbmV3IHQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCh0KTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBhZGFwdG9yLkdldENoaWxkKCB0LCBpICk7CisgICAgICAgICAgICAgICAgVmlzaXQoIGNoaWxkLCBhY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYWN0aW9uICE9IG51bGwgJiYgIWlzTmlsICkKKyAgICAgICAgICAgICAgICB0ID0gYWN0aW9uLlBvc3QoIHQgKTsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG9iamVjdCBWaXNpdCggb2JqZWN0IHQsIEZ1bmM8b2JqZWN0LCBvYmplY3Q+IHByZUFjdGlvbiwgRnVuYzxvYmplY3QsIG9iamVjdD4gcG9zdEFjdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBWaXNpdCggdCwgbmV3IFRyZWVWaXNpdG9yQWN0aW9uKCBwcmVBY3Rpb24sIHBvc3RBY3Rpb24gKSApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1RyZWUvVHJlZVdpemFyZC5jcyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVXaXphcmQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjNzU5YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9UcmVlL1RyZWVXaXphcmQuY3MKQEAgLTAsMCArMSw3MzYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5jZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLy8gVE9ETzogYnVpbGQgaW5kZXhlcyBmb3Igd2l6YXJkCisvLyNkZWZpbmUgQlVJTERfSU5ERVhFUworCituYW1lc3BhY2UgQW50bHIuUnVudGltZS5UcmVlCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKKyAgICB1c2luZyBJTGlzdCA9IFN5c3RlbS5Db2xsZWN0aW9ucy5JTGlzdDsKKyNpZiBCVUlMRF9JTkRFWEVTCisgICAgdXNpbmcgSURpY3Rpb25hcnkgPSBTeXN0ZW0uQ29sbGVjdGlvbnMuSURpY3Rpb25hcnk7CisjZW5kaWYKKworICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgKiAgQnVpbGQgYW5kIG5hdmlnYXRlIHRyZWVzIHdpdGggdGhpcyBvYmplY3QuICBNdXN0IGtub3cgYWJvdXQgdGhlIG5hbWVzCisgICAgICogIG9mIHRva2VucyBzbyB5b3UgaGF2ZSB0byBwYXNzIGluIGEgbWFwIG9yIGFycmF5IG9mIHRva2VuIG5hbWVzIChmcm9tIHdoaWNoCisgICAgICogIHRoaXMgY2xhc3MgY2FuIGJ1aWxkIHRoZSBtYXApLiAgSS5lLiwgVG9rZW4gREVDTCBtZWFucyBub3RoaW5nIHVubGVzcyB0aGUKKyAgICAgKiAgY2xhc3MgY2FuIHRyYW5zbGF0ZSBpdCB0byBhIHRva2VuIHR5cGUuCisgICAgICogIDwvc3VtbWFyeT4KKyAgICAgKgorICAgICAqICA8cmVtYXJrcz4KKyAgICAgKiAgSW4gb3JkZXIgdG8gY3JlYXRlIG5vZGVzIGFuZCBuYXZpZ2F0ZSwgdGhpcyBjbGFzcyBuZWVkcyBhIFRyZWVBZGFwdG9yLgorICAgICAqCisgICAgICogIFRoaXMgY2xhc3MgY2FuIGJ1aWxkIGEgdG9rZW4gdHlwZSAtPiBub2RlIGluZGV4IGZvciByZXBlYXRlZCB1c2Ugb3IgZm9yCisgICAgICogIGl0ZXJhdGluZyBvdmVyIHRoZSB2YXJpb3VzIG5vZGVzIHdpdGggYSBwYXJ0aWN1bGFyIHR5cGUuCisgICAgICoKKyAgICAgKiAgVGhpcyBjbGFzcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBUcmVlQWRhcHRvciByYXRoZXIgdGhhbiBtb3ZpbmcKKyAgICAgKiAgYWxsIHRoaXMgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBhZGFwdG9yLiAgQW4gYWRhcHRvciBoZWxwcyBidWlsZCBhbmQKKyAgICAgKiAgbmF2aWdhdGUgdHJlZXMgdXNpbmcgbWV0aG9kcy4gIFRoaXMgY2xhc3MgaGVscHMgeW91IGRvIGl0IHdpdGggc3RyaW5nCisgICAgICogIHBhdHRlcm5zIGxpa2UgIihBIEIgQykiLiAgWW91IGNhbiBjcmVhdGUgYSB0cmVlIGZyb20gdGhhdCBwYXR0ZXJuIG9yCisgICAgICogIG1hdGNoIHN1YnRyZWVzIGFnYWluc3QgaXQuCisgICAgICogIDwvcmVtYXJrcz4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVHJlZVdpemFyZAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIElUcmVlQWRhcHRvciBhZGFwdG9yOworICAgICAgICBwcm90ZWN0ZWQgSURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IHRva2VuTmFtZVRvVHlwZU1hcDsKKworICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIElDb250ZXh0VmlzaXRvcgorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBjYWxsZWQgdmlzaXQgb3Igc29tZXRoaW5nIGVsc2U/CisgICAgICAgICAgICB2b2lkIFZpc2l0KCBvYmplY3QgdCwgb2JqZWN0IHBhcmVudCwgaW50IGNoaWxkSW5kZXgsIElEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PiBsYWJlbHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yIDogSUNvbnRleHRWaXNpdG9yCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVmlzaXQoIG9iamVjdCB0LCBvYmplY3QgcGFyZW50LCBpbnQgY2hpbGRJbmRleCwgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IGxhYmVscyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmlzaXQoIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFZpc2l0KCBvYmplY3QgdCApOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQWN0aW9uVmlzaXRvciA6IFZpc2l0b3IKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLkFjdGlvbjxvYmplY3Q+IF9hY3Rpb247CisKKyAgICAgICAgICAgIHB1YmxpYyBBY3Rpb25WaXNpdG9yKCBTeXN0ZW0uQWN0aW9uPG9iamVjdD4gYWN0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYWN0aW9uID0gYWN0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBWaXNpdCggb2JqZWN0IHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9hY3Rpb24oIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdoZW4gdXNpbmcgJWxhYmVsOlRPS0VOTkFNRSBpbiBhIHRyZWUgZm9yIHBhcnNlKCksIHdlIG11c3QKKyAgICAgICAgICogIHRyYWNrIHRoZSBsYWJlbC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjbGFzcyBUcmVlUGF0dGVybiA6IENvbW1vblRyZWUKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0cmluZyBsYWJlbDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGhhc1RleHRBcmc7CisgICAgICAgICAgICBwdWJsaWMgVHJlZVBhdHRlcm4oIElUb2tlbiBwYXlsb2FkICkgOgorICAgICAgICAgICAgICAgIGJhc2UoIHBheWxvYWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBsYWJlbCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiJSIgKyBsYWJlbCArICI6IjsgLy8rIGJhc2UuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgV2lsZGNhcmRUcmVlUGF0dGVybiA6IFRyZWVQYXR0ZXJuCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBXaWxkY2FyZFRyZWVQYXR0ZXJuKCBJVG9rZW4gcGF5bG9hZCApIDoKKyAgICAgICAgICAgICAgICBiYXNlKCBwYXlsb2FkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5UaGlzIGFkYXB0b3IgY3JlYXRlcyBUcmVlUGF0dGVybiBvYmplY3RzIGZvciB1c2UgZHVyaW5nIHNjYW4oKTwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHVibGljIGNsYXNzIFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IgOiBDb21tb25UcmVlQWRhcHRvcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IENyZWF0ZSggSVRva2VuIHBheWxvYWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZVBhdHRlcm4oIHBheWxvYWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgQlVJTERfSU5ERVhFUworICAgICAgICAvLyBUT0RPOiBidWlsZCBpbmRleGVzIGZvciB0aGUgd2l6YXJkCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRHVyaW5nIGZpbGxCdWZmZXIoKSwgd2UgY2FuIG1ha2UgYSByZXZlcnNlIGluZGV4IGZyb20gYSBzZXQKKyAgICAgICAgICogIG9mIHRva2VuIHR5cGVzIG9mIGludGVyZXN0IHRvIHRoZSBsaXN0IG9mIGluZGV4ZXMgaW50byB0aGUKKyAgICAgICAgICogIG5vZGUgc3RyZWFtLiAgVGhpcyBsZXRzIHVzIGNvbnZlcnQgYSBub2RlIHBvaW50ZXIgdG8gYQorICAgICAgICAgKiAgc3RyZWFtIGluZGV4IHNlbWktZWZmaWNpZW50bHkgZm9yIGEgbGlzdCBvZiBpbnRlcmVzdGluZworICAgICAgICAgKiAgbm9kZXMgc3VjaCBhcyBmdW5jdGlvbiBkZWZpbml0aW9uIG5vZGVzICh5b3UnbGwgd2FudCB0byBzZWVrCisgICAgICAgICAqICB0byB0aGVpciBib2RpZXMgZm9yIGFuIGludGVycHJldGVyKS4gIEFsc28gdXNlZnVsIGZvciBkb2luZworICAgICAgICAgKiAgZHluYW1pYyBzZWFyY2hlczsgaS5lLiwgZ28gZmluZCBtZSBhbGwgUExVUyBub2Rlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBJRGljdGlvbmFyeTxpbnQsIElMaXN0PGludD4+IHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcDsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBJZiB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggc2V0IHRvIElOREVYX0FMTCB0aGVuIGluZGV4aW5nCisgICAgICAgICAqICBvY2N1cnMgZm9yIGFsbCB0b2tlbiB0eXBlcy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSGFzaFNldDxpbnQ+IElOREVYX0FMTCA9IG5ldyBIYXNoU2V0PGludD4oKTsKKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBBIHNldCBvZiB0b2tlbiB0eXBlcyB1c2VyIHdvdWxkIGxpa2UgdG8gaW5kZXggZm9yIGZhc3RlciBsb29rdXAuCisgICAgICAgICAqICBJZiB0aGlzIGlzIElOREVYX0FMTCwgdGhlbiBhbGwgdG9rZW4gdHlwZXMgYXJlIHRyYWNrZWQuICBJZiBudWxsLAorICAgICAgICAgKiAgdGhlbiBub25lIGFyZSBpbmRleGVkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEhhc2hTZXQ8aW50PiB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggPSBudWxsOworI2VuZGlmCisKKyAgICAgICAgcHVibGljIFRyZWVXaXphcmQoIElUcmVlQWRhcHRvciBhZGFwdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUcmVlV2l6YXJkKCBJVHJlZUFkYXB0b3IgYWRhcHRvciwgSURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IHRva2VuTmFtZVRvVHlwZU1hcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLnRva2VuTmFtZVRvVHlwZU1hcCA9IHRva2VuTmFtZVRvVHlwZU1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUcmVlV2l6YXJkKCBJVHJlZUFkYXB0b3IgYWRhcHRvciwgc3RyaW5nW10gdG9rZW5OYW1lcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgICAgICAgICB0aGlzLnRva2VuTmFtZVRvVHlwZU1hcCA9IENvbXB1dGVUb2tlblR5cGVzKCB0b2tlbk5hbWVzICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHJlZVdpemFyZCggc3RyaW5nW10gdG9rZW5OYW1lcyApCisgICAgICAgICAgICA6IHRoaXMoIG5ldyBDb21tb25UcmVlQWRhcHRvcigpLCB0b2tlbk5hbWVzICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgQ29tcHV0ZSBhIE1hcCZsdDtTdHJpbmcsIEludGVnZXImZ3Q7IHRoYXQgaXMgYW4gaW52ZXJ0ZWQgaW5kZXggb2YKKyAgICAgICAgICogIHRva2VuTmFtZXMgKHdoaWNoIG1hcHMgaW50IHRva2VuIHR5cGVzIHRvIG5hbWVzKS4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBDb21wdXRlVG9rZW5UeXBlcyggc3RyaW5nW10gdG9rZW5OYW1lcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBtID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+KCk7CisgICAgICAgICAgICBpZiAoIHRva2VuTmFtZXMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKCBpbnQgdHR5cGUgPSBUb2tlblR5cGVzLk1pbjsgdHR5cGUgPCB0b2tlbk5hbWVzLkxlbmd0aDsgdHR5cGUrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSB0b2tlbk5hbWVzW3R0eXBlXTsKKyAgICAgICAgICAgICAgICBtW25hbWVdID0gdHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT5Vc2luZyB0aGUgbWFwIG9mIHRva2VuIG5hbWVzIHRvIHRva2VuIHR5cGVzLCByZXR1cm4gdGhlIHR5cGUuPC9zdW1tYXJ5PiAqLworICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgR2V0VG9rZW5UeXBlKCBzdHJpbmcgdG9rZW5OYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0b2tlbk5hbWVUb1R5cGVNYXAgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgaWYgKCB0b2tlbk5hbWVUb1R5cGVNYXAuVHJ5R2V0VmFsdWUoIHRva2VuTmFtZSwgb3V0IHZhbHVlICkgKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZXMuSW52YWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFdhbGsgdGhlIGVudGlyZSB0cmVlIGFuZCBtYWtlIGEgbm9kZSBuYW1lIHRvIG5vZGVzIG1hcHBpbmcuCisgICAgICAgICAqICBGb3Igbm93LCB1c2UgcmVjdXJzaW9uIGJ1dCBsYXRlciBub25yZWN1cnNpdmUgdmVyc2lvbiBtYXkgYmUKKyAgICAgICAgICogIG1vcmUgZWZmaWNpZW50LiAgUmV0dXJucyBNYXAmbHQ7SW50ZWdlciwgTGlzdCZndDsgd2hlcmUgdGhlIExpc3QgaXMKKyAgICAgICAgICogIG9mIHlvdXIgQVNUIG5vZGUgdHlwZS4gIFRoZSBJbnRlZ2VyIGlzIHRoZSB0b2tlbiB0eXBlIG9mIHRoZSBub2RlLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUT0RPOiBzYXZlIHRoaXMgaW5kZXggc28gdGhhdCBmaW5kIGFuZCB2aXNpdCBhcmUgZmFzdGVyCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8aW50LCBJTGlzdD4gSW5kZXgoIG9iamVjdCB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgSURpY3Rpb25hcnk8aW50LCBJTGlzdD4gbSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgSUxpc3Q+KCk7CisgICAgICAgICAgICBJbmRleENvcmUoIHQsIG0gKTsKKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkRvIHRoZSB3b3JrIGZvciBpbmRleDwvc3VtbWFyeT4gKi8KKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBJbmRleENvcmUoIG9iamVjdCB0LCBJRGljdGlvbmFyeTxpbnQsIElMaXN0PiBtICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0ID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB0dHlwZSA9IGFkYXB0b3IuR2V0VHlwZSggdCApOworICAgICAgICAgICAgSUxpc3QgZWxlbWVudHM7CisgICAgICAgICAgICBpZiAoICFtLlRyeUdldFZhbHVlKCB0dHlwZSwgb3V0IGVsZW1lbnRzICkgfHwgZWxlbWVudHMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgbVt0dHlwZV0gPSBlbGVtZW50czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW1lbnRzLkFkZCggdCApOworICAgICAgICAgICAgaW50IG4gPSBhZGFwdG9yLkdldENoaWxkQ291bnQoIHQgKTsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkID0gYWRhcHRvci5HZXRDaGlsZCggdCwgaSApOworICAgICAgICAgICAgICAgIEluZGV4Q29yZSggY2hpbGQsIG0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEZpbmRUcmVlV2l6YXJkVmlzaXRvciA6IFRyZWVXaXphcmQuVmlzaXRvcgorICAgICAgICB7CisgICAgICAgICAgICBJTGlzdCBfbm9kZXM7CisgICAgICAgICAgICBwdWJsaWMgRmluZFRyZWVXaXphcmRWaXNpdG9yKCBJTGlzdCBub2RlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX25vZGVzID0gbm9kZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBWaXNpdCggb2JqZWN0IHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ub2Rlcy5BZGQoIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbGFzcyBGaW5kVHJlZVdpemFyZENvbnRleHRWaXNpdG9yIDogVHJlZVdpemFyZC5JQ29udGV4dFZpc2l0b3IKKyAgICAgICAgeworICAgICAgICAgICAgVHJlZVdpemFyZCBfb3V0ZXI7CisgICAgICAgICAgICBUcmVlUGF0dGVybiBfdHBhdHRlcm47CisgICAgICAgICAgICBJTGlzdCBfc3VidHJlZXM7CisgICAgICAgICAgICBwdWJsaWMgRmluZFRyZWVXaXphcmRDb250ZXh0VmlzaXRvciggVHJlZVdpemFyZCBvdXRlciwgVHJlZVBhdHRlcm4gdHBhdHRlcm4sIElMaXN0IHN1YnRyZWVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0ZXIgPSBvdXRlcjsKKyAgICAgICAgICAgICAgICBfdHBhdHRlcm4gPSB0cGF0dGVybjsKKyAgICAgICAgICAgICAgICBfc3VidHJlZXMgPSBzdWJ0cmVlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgVmlzaXQoIG9iamVjdCB0LCBvYmplY3QgcGFyZW50LCBpbnQgY2hpbGRJbmRleCwgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IGxhYmVscyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBfb3V0ZXIuUGFyc2VDb3JlKCB0LCBfdHBhdHRlcm4sIG51bGwgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3VidHJlZXMuQWRkKCB0ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldHVybiBhIExpc3Qgb2YgdHJlZSBub2RlcyB3aXRoIHRva2VuIHR5cGUgdHR5cGU8L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0IEZpbmQoIG9iamVjdCB0LCBpbnQgdHR5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBJTGlzdCBub2RlcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKKyAgICAgICAgICAgIFZpc2l0KCB0LCB0dHlwZSwgbmV3IEZpbmRUcmVlV2l6YXJkVmlzaXRvciggbm9kZXMgKSApOworICAgICAgICAgICAgcmV0dXJuIG5vZGVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PlJldHVybiBhIExpc3Qgb2Ygc3VidHJlZXMgbWF0Y2hpbmcgcGF0dGVybi48L3N1bW1hcnk+ICovCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElMaXN0IEZpbmQoIG9iamVjdCB0LCBzdHJpbmcgcGF0dGVybiApCisgICAgICAgIHsKKyAgICAgICAgICAgIElMaXN0IHN1YnRyZWVzID0gbmV3IExpc3Q8b2JqZWN0PigpOworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgVHJlZVBhdHRlcm4gZnJvbSB0aGUgcGF0dGVybgorICAgICAgICAgICAgVHJlZVBhdHRlcm5MZXhlciB0b2tlbml6ZXIgPSBuZXcgVHJlZVBhdHRlcm5MZXhlciggcGF0dGVybiApOworICAgICAgICAgICAgVHJlZVBhdHRlcm5QYXJzZXIgcGFyc2VyID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZVBhdHRlcm5QYXJzZXIoIHRva2VuaXplciwgdGhpcywgbmV3IFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoKSApOworICAgICAgICAgICAgVHJlZVBhdHRlcm4gdHBhdHRlcm4gPSAoVHJlZVBhdHRlcm4pcGFyc2VyLlBhdHRlcm4oKTsKKyAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IGludmFsaWQgcGF0dGVybnMKKyAgICAgICAgICAgIGlmICggdHBhdHRlcm4gPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICB0cGF0dGVybi5Jc05pbCB8fAorICAgICAgICAgICAgICAgICB0cGF0dGVybi5HZXRUeXBlKCkgPT0gdHlwZW9mKCBXaWxkY2FyZFRyZWVQYXR0ZXJuICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHJvb3RUb2tlblR5cGUgPSB0cGF0dGVybi5UeXBlOworICAgICAgICAgICAgVmlzaXQoIHQsIHJvb3RUb2tlblR5cGUsIG5ldyBGaW5kVHJlZVdpemFyZENvbnRleHRWaXNpdG9yKCB0aGlzLCB0cGF0dGVybiwgc3VidHJlZXMgKSApOworICAgICAgICAgICAgcmV0dXJuIHN1YnRyZWVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEZpbmRGaXJzdCggb2JqZWN0IHQsIGludCB0dHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEZpbmRGaXJzdCggb2JqZWN0IHQsIHN0cmluZyBwYXR0ZXJuICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBWaXNpdCBldmVyeSB0dHlwZSBub2RlIGluIHQsIGludm9raW5nIHRoZSB2aXNpdG9yLiAgVGhpcyBpcyBhIHF1aWNrZXIKKyAgICAgICAgICogIHZlcnNpb24gb2YgdGhlIGdlbmVyYWwgdmlzaXQodCwgcGF0dGVybikgbWV0aG9kLiAgVGhlIGxhYmVscyBhcmcKKyAgICAgICAgICogIG9mIHRoZSB2aXNpdG9yIGFjdGlvbiBtZXRob2QgaXMgbmV2ZXIgc2V0IChpdCdzIG51bGwpIHNpbmNlIHVzaW5nCisgICAgICAgICAqICBhIHRva2VuIHR5cGUgcmF0aGVyIHRoYW4gYSBwYXR0ZXJuIGRvZXNuJ3QgbGV0IHVzIHNldCBhIGxhYmVsLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgVmlzaXQoIG9iamVjdCB0LCBpbnQgdHR5cGUsIElDb250ZXh0VmlzaXRvciB2aXNpdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgVmlzaXRDb3JlKCB0LCBudWxsLCAwLCB0dHlwZSwgdmlzaXRvciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgVmlzaXQoIG9iamVjdCB0LCBpbnQgdHR5cGUsIFN5c3RlbS5BY3Rpb248b2JqZWN0PiBhY3Rpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBWaXNpdCggdCwgdHR5cGUsIG5ldyBBY3Rpb25WaXNpdG9yKCBhY3Rpb24gKSApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PkRvIHRoZSByZWN1cnNpdmUgd29yayBmb3IgdmlzaXQ8L3N1bW1hcnk+ICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgVmlzaXRDb3JlKCBvYmplY3QgdCwgb2JqZWN0IHBhcmVudCwgaW50IGNoaWxkSW5kZXgsIGludCB0dHlwZSwgSUNvbnRleHRWaXNpdG9yIHZpc2l0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHQgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBhZGFwdG9yLkdldFR5cGUoIHQgKSA9PSB0dHlwZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlzaXRvci5WaXNpdCggdCwgcGFyZW50LCBjaGlsZEluZGV4LCBudWxsICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbiA9IGFkYXB0b3IuR2V0Q2hpbGRDb3VudCggdCApOworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgY2hpbGQgPSBhZGFwdG9yLkdldENoaWxkKCB0LCBpICk7CisgICAgICAgICAgICAgICAgVmlzaXRDb3JlKCBjaGlsZCwgdCwgaSwgdHR5cGUsIHZpc2l0b3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFZpc2l0VHJlZVdpemFyZENvbnRleHRWaXNpdG9yIDogVHJlZVdpemFyZC5JQ29udGV4dFZpc2l0b3IKKyAgICAgICAgeworICAgICAgICAgICAgVHJlZVdpemFyZCBfb3V0ZXI7CisgICAgICAgICAgICBJQ29udGV4dFZpc2l0b3IgX3Zpc2l0b3I7CisgICAgICAgICAgICBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gX2xhYmVsczsKKyAgICAgICAgICAgIFRyZWVQYXR0ZXJuIF90cGF0dGVybjsKKworICAgICAgICAgICAgcHVibGljIFZpc2l0VHJlZVdpemFyZENvbnRleHRWaXNpdG9yKCBUcmVlV2l6YXJkIG91dGVyLCBJQ29udGV4dFZpc2l0b3IgdmlzaXRvciwgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IGxhYmVscywgVHJlZVBhdHRlcm4gdHBhdHRlcm4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9vdXRlciA9IG91dGVyOworICAgICAgICAgICAgICAgIF92aXNpdG9yID0gdmlzaXRvcjsKKyAgICAgICAgICAgICAgICBfbGFiZWxzID0gbGFiZWxzOworICAgICAgICAgICAgICAgIF90cGF0dGVybiA9IHRwYXR0ZXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBWaXNpdCggb2JqZWN0IHQsIG9iamVjdCBwYXJlbnQsIGludCBjaGlsZEluZGV4LCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gdW51c2VkbGFiZWxzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgdW51c2VkbGFiZWxzIGFyZyBpcyBudWxsIGFzIHZpc2l0IG9uIHRva2VuIHR5cGUgZG9lc24ndCBzZXQuCisgICAgICAgICAgICAgICAgX2xhYmVscy5DbGVhcigpOworICAgICAgICAgICAgICAgIGlmICggX291dGVyLlBhcnNlQ29yZSggdCwgX3RwYXR0ZXJuLCBfbGFiZWxzICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3Zpc2l0b3IuVmlzaXQoIHQsIHBhcmVudCwgY2hpbGRJbmRleCwgX2xhYmVscyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEZvciBhbGwgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiwgZXhlY3V0ZSB0aGUgdmlzaXQgYWN0aW9uLgorICAgICAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGF0dGVybiBpbiBjb21iaW5hdGlvbgorICAgICAgICAgKiAgd2l0aCB2aXNpdCh0LCB0dHlwZSwgdmlzaXRvcikgc28gbmlsLXJvb3RlZCBwYXR0ZXJucyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgICAqICBQYXR0ZXJucyB3aXRoIHdpbGRjYXJkIHJvb3RzIGFyZSBhbHNvIG5vdCBhbGxvd2VkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgVmlzaXQoIG9iamVjdCB0LCBzdHJpbmcgcGF0dGVybiwgSUNvbnRleHRWaXNpdG9yIHZpc2l0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBUcmVlUGF0dGVybiBmcm9tIHRoZSBwYXR0ZXJuCisgICAgICAgICAgICBUcmVlUGF0dGVybkxleGVyIHRva2VuaXplciA9IG5ldyBUcmVlUGF0dGVybkxleGVyKCBwYXR0ZXJuICk7CisgICAgICAgICAgICBUcmVlUGF0dGVyblBhcnNlciBwYXJzZXIgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlUGF0dGVyblBhcnNlciggdG9rZW5pemVyLCB0aGlzLCBuZXcgVHJlZVBhdHRlcm5UcmVlQWRhcHRvcigpICk7CisgICAgICAgICAgICBUcmVlUGF0dGVybiB0cGF0dGVybiA9IChUcmVlUGF0dGVybilwYXJzZXIuUGF0dGVybigpOworICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgaW52YWxpZCBwYXR0ZXJucworICAgICAgICAgICAgaWYgKCB0cGF0dGVybiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgIHRwYXR0ZXJuLklzTmlsIHx8CisgICAgICAgICAgICAgICAgIHRwYXR0ZXJuLkdldFR5cGUoKSA9PSB0eXBlb2YoIFdpbGRjYXJkVHJlZVBhdHRlcm4gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IGxhYmVscyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgb2JqZWN0PigpOyAvLyByZXVzZWQgZm9yIGVhY2ggX3BhcnNlCisgICAgICAgICAgICBpbnQgcm9vdFRva2VuVHlwZSA9IHRwYXR0ZXJuLlR5cGU7CisgICAgICAgICAgICBWaXNpdCggdCwgcm9vdFRva2VuVHlwZSwgbmV3IFZpc2l0VHJlZVdpemFyZENvbnRleHRWaXNpdG9yKCB0aGlzLCB2aXNpdG9yLCBsYWJlbHMsIHRwYXR0ZXJuICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIEdpdmVuIGEgcGF0dGVybiBsaWtlIChBU1NJR04gJWxoczpJRCAlcmhzOi4pIHdpdGggb3B0aW9uYWwgbGFiZWxzCisgICAgICAgICAqICBvbiB0aGUgdmFyaW91cyBub2RlcyBhbmQgJy4nIChkb3QpIGFzIHRoZSBub2RlL3N1YnRyZWUgd2lsZGNhcmQsCisgICAgICAgICAqICByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGFuZCBmaWxsIHRoZSBsYWJlbHMgTWFwIHdpdGgKKyAgICAgICAgICogIHRoZSBsYWJlbHMgcG9pbnRpbmcgYXQgdGhlIGFwcHJvcHJpYXRlIG5vZGVzLiAgUmV0dXJuIGZhbHNlIGlmCisgICAgICAgICAqICB0aGUgcGF0dGVybiBpcyBtYWxmb3JtZWQgb3IgdGhlIHRyZWUgZG9lcyBub3QgbWF0Y2guCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIElmIGEgbm9kZSBzcGVjaWZpZXMgYSB0ZXh0IGFyZyBpbiBwYXR0ZXJuLCB0aGVuIHRoYXQgbXVzdCBtYXRjaAorICAgICAgICAgKiAgZm9yIHRoYXQgbm9kZSBpbiB0LgorICAgICAgICAgKgorICAgICAgICAgKiAgVE9ETzogd2hhdCdzIGEgYmV0dGVyIHdheSB0byBpbmRpY2F0ZSBiYWQgcGF0dGVybj8gRXhjZXB0aW9ucyBhcmUgYSBoYXNzbGUgCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbCBQYXJzZSggb2JqZWN0IHQsIHN0cmluZyBwYXR0ZXJuLCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgVHJlZVBhdHRlcm5MZXhlciB0b2tlbml6ZXIgPSBuZXcgVHJlZVBhdHRlcm5MZXhlciggcGF0dGVybiApOworICAgICAgICAgICAgVHJlZVBhdHRlcm5QYXJzZXIgcGFyc2VyID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZVBhdHRlcm5QYXJzZXIoIHRva2VuaXplciwgdGhpcywgbmV3IFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoKSApOworICAgICAgICAgICAgVHJlZVBhdHRlcm4gdHBhdHRlcm4gPSAoVHJlZVBhdHRlcm4pcGFyc2VyLlBhdHRlcm4oKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInQ9IisoKFRyZWUpdCkudG9TdHJpbmdUcmVlKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzY2FudD0iK3RwYXR0ZXJuLnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sIG1hdGNoZWQgPSBQYXJzZUNvcmUoIHQsIHRwYXR0ZXJuLCBsYWJlbHMgKTsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2wgUGFyc2UoIG9iamVjdCB0LCBzdHJpbmcgcGF0dGVybiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJzZSggdCwgcGF0dGVybiwgbnVsbCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgRG8gdGhlIHdvcmsgZm9yIHBhcnNlLiBDaGVjayB0byBzZWUgaWYgdGhlIHQyIHBhdHRlcm4gZml0cyB0aGUKKyAgICAgICAgICogIHN0cnVjdHVyZSBhbmQgdG9rZW4gdHlwZXMgaW4gdDEuICBDaGVjayB0ZXh0IGlmIHRoZSBwYXR0ZXJuIGhhcworICAgICAgICAgKiAgdGV4dCBhcmd1bWVudHMgb24gbm9kZXMuICBGaWxsIGxhYmVscyBtYXAgd2l0aCBwb2ludGVycyB0byBub2RlcworICAgICAgICAgKiAgaW4gdHJlZSBtYXRjaGVkIGFnYWluc3Qgbm9kZXMgaW4gcGF0dGVybiB3aXRoIGxhYmVscy4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGJvb2wgUGFyc2VDb3JlKCBvYmplY3QgdDEsIFRyZWVQYXR0ZXJuIHRwYXR0ZXJuLCBJRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gbGFiZWxzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGJvdGggYXJlIG5vbi1udWxsCisgICAgICAgICAgICBpZiAoIHQxID09IG51bGwgfHwgdHBhdHRlcm4gPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgcm9vdHMgKHdpbGRjYXJkIG1hdGNoZXMgYW55dGhpbmcpCisgICAgICAgICAgICBpZiAoIHRwYXR0ZXJuLkdldFR5cGUoKSAhPSB0eXBlb2YoIFdpbGRjYXJkVHJlZVBhdHRlcm4gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBhZGFwdG9yLkdldFR5cGUoIHQxICkgIT0gdHBhdHRlcm4uVHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGlmIHBhdHRlcm4gaGFzIHRleHQsIGNoZWNrIG5vZGUgdGV4dAorICAgICAgICAgICAgICAgIGlmICggdHBhdHRlcm4uaGFzVGV4dEFyZyAmJiAhYWRhcHRvci5HZXRUZXh0KCB0MSApLkVxdWFscyggdHBhdHRlcm4uVGV4dCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHRwYXR0ZXJuLmxhYmVsICE9IG51bGwgJiYgbGFiZWxzICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG1hcCBsYWJlbCBpbiBwYXR0ZXJuIHRvIG5vZGUgaW4gdDEKKyAgICAgICAgICAgICAgICBsYWJlbHNbdHBhdHRlcm4ubGFiZWxdID0gdDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBjaGlsZHJlbgorICAgICAgICAgICAgaW50IG4xID0gYWRhcHRvci5HZXRDaGlsZENvdW50KCB0MSApOworICAgICAgICAgICAgaW50IG4yID0gdHBhdHRlcm4uQ2hpbGRDb3VudDsKKyAgICAgICAgICAgIGlmICggbjEgIT0gbjIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG4xOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCBjaGlsZDEgPSBhZGFwdG9yLkdldENoaWxkKCB0MSwgaSApOworICAgICAgICAgICAgICAgIFRyZWVQYXR0ZXJuIGNoaWxkMiA9IChUcmVlUGF0dGVybil0cGF0dGVybi5HZXRDaGlsZCggaSApOworICAgICAgICAgICAgICAgIGlmICggIVBhcnNlQ29yZSggY2hpbGQxLCBjaGlsZDIsIGxhYmVscyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIENyZWF0ZSBhIHRyZWUgb3Igbm9kZSBmcm9tIHRoZSBpbmRpY2F0ZWQgdHJlZSBwYXR0ZXJuIHRoYXQgY2xvc2VseQorICAgICAgICAgKiAgZm9sbG93cyBBTlRMUiB0cmVlIGdyYW1tYXIgdHJlZSBlbGVtZW50IHN5bnRheDoKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICAocm9vdCBjaGlsZDEgLi4uIGNoaWxkMikuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFlvdSBjYW4gYWxzbyBqdXN0IHBhc3MgaW4gYSBub2RlOiBJRAorICAgICAgICAgKiAKKyAgICAgICAgICogIEFueSBub2RlIGNhbiBoYXZlIGEgdGV4dCBhcmd1bWVudDogSURbZm9vXQorICAgICAgICAgKiAgKG5vdGljZSB0aGVyZSBhcmUgbm8gcXVvdGVzIGFyb3VuZCBmb28tLWl0J3MgY2xlYXIgaXQncyBhIHN0cmluZykuCisgICAgICAgICAqCisgICAgICAgICAqICBuaWwgaXMgYSBzcGVjaWFsIG5hbWUgbWVhbmluZyAiZ2l2ZSBtZSBhIG5pbCBub2RlIi4gIFVzZWZ1bCBmb3IKKyAgICAgICAgICogIG1ha2luZyBsaXN0czogKG5pbCBBIEIgQykgaXMgYSBsaXN0IG9mIEEgQiBDLgorICAgICAgICAgKiAgPC9yZW1hcmtzPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IENyZWF0ZSggc3RyaW5nIHBhdHRlcm4gKQorICAgICAgICB7CisgICAgICAgICAgICBUcmVlUGF0dGVybkxleGVyIHRva2VuaXplciA9IG5ldyBUcmVlUGF0dGVybkxleGVyKCBwYXR0ZXJuICk7CisgICAgICAgICAgICBUcmVlUGF0dGVyblBhcnNlciBwYXJzZXIgPSBuZXcgVHJlZVBhdHRlcm5QYXJzZXIoIHRva2VuaXplciwgdGhpcywgYWRhcHRvciApOworICAgICAgICAgICAgb2JqZWN0IHQgPSBwYXJzZXIuUGF0dGVybigpOworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDb21wYXJlIHQxIGFuZCB0MjsgcmV0dXJuIHRydWUgaWYgdG9rZW4gdHlwZXMvdGV4dCwgc3RydWN0dXJlIG1hdGNoIGV4YWN0bHkuCisgICAgICAgICAqICBUaGUgdHJlZXMgYXJlIGV4YW1pbmVkIGluIHRoZWlyIGVudGlyZXR5IHNvIHRoYXQgKEEgQikgZG9lcyBub3QgbWF0Y2gKKyAgICAgICAgICogIChBIEIgQykgbm9yIChBIChCIEMpKS4gCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cmVtYXJrcz4KKyAgICAgICAgICogIFRPRE86IGFsbG93IHRoZW0gdG8gcGFzcyBpbiBhIGNvbXBhcmF0b3IKKyAgICAgICAgICogIFRPRE86IGhhdmUgYSB2ZXJzaW9uIHRoYXQgaXMgbm9uc3RhdGljIHNvIGl0IGNhbiB1c2UgaW5zdGFuY2UgYWRhcHRvcgorICAgICAgICAgKgorICAgICAgICAgKiAgSSBjYW5ub3QgcmVseSBvbiB0aGUgdHJlZSBub2RlJ3MgZXF1YWxzKCkgaW1wbGVtZW50YXRpb24gYXMgSSBtYWtlCisgICAgICAgICAqICBubyBjb25zdHJhaW50cyBhdCBhbGwgb24gdGhlIG5vZGUgdHlwZXMgbm9yIGludGVyZmFjZSBldGMuLi4gCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzKCBvYmplY3QgdDEsIG9iamVjdCB0MiwgSVRyZWVBZGFwdG9yIGFkYXB0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRXF1YWxzQ29yZSggdDEsIHQyLCBhZGFwdG9yICk7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBDb21wYXJlIHR5cGUsIHN0cnVjdHVyZSwgYW5kIHRleHQgb2YgdHdvIHRyZWVzLCBhc3N1bWluZyBhZGFwdG9yIGluCisgICAgICAgICAqICB0aGlzIGluc3RhbmNlIG9mIGEgVHJlZVdpemFyZC4KKyAgICAgICAgICogIDwvc3VtbWFyeT4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBuZXcgYm9vbCBFcXVhbHMoIG9iamVjdCB0MSwgb2JqZWN0IHQyICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVxdWFsc0NvcmUoIHQxLCB0MiwgYWRhcHRvciApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sIEVxdWFsc0NvcmUoIG9iamVjdCB0MSwgb2JqZWN0IHQyLCBJVHJlZUFkYXB0b3IgYWRhcHRvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBib3RoIGFyZSBub24tbnVsbAorICAgICAgICAgICAgaWYgKCB0MSA9PSBudWxsIHx8IHQyID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIHJvb3RzCisgICAgICAgICAgICBpZiAoIGFkYXB0b3IuR2V0VHlwZSggdDEgKSAhPSBhZGFwdG9yLkdldFR5cGUoIHQyICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggIWFkYXB0b3IuR2V0VGV4dCggdDEgKS5FcXVhbHMoIGFkYXB0b3IuR2V0VGV4dCggdDIgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBjaGlsZHJlbgorICAgICAgICAgICAgaW50IG4xID0gYWRhcHRvci5HZXRDaGlsZENvdW50KCB0MSApOworICAgICAgICAgICAgaW50IG4yID0gYWRhcHRvci5HZXRDaGlsZENvdW50KCB0MiApOworICAgICAgICAgICAgaWYgKCBuMSAhPSBuMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbjE7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkMSA9IGFkYXB0b3IuR2V0Q2hpbGQoIHQxLCBpICk7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNoaWxkMiA9IGFkYXB0b3IuR2V0Q2hpbGQoIHQyLCBpICk7CisgICAgICAgICAgICAgICAgaWYgKCAhRXF1YWxzQ29yZSggY2hpbGQxLCBjaGlsZDIsIGFkYXB0b3IgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworI2lmIEJVSUxEX0lOREVYRVMKKyAgICAgICAgLy8gVE9ETzogbmV4dCBzdHVmZiB0YWtlbiBmcm9tIENvbW1vblRyZWVOb2RlU3RyZWFtCisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgR2l2ZW4gYSBub2RlLCBhZGQgdGhpcyB0byB0aGUgcmV2ZXJzZSBpbmRleCB0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAuCisgICAgICAgICAqICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFsdGVyIGhvdyBpbmRleGluZyBvY2N1cnMuICBUaGUKKyAgICAgICAgICogIGRlZmF1bHQgaXMgdG8gY3JlYXRlIGEKKyAgICAgICAgICoKKyAgICAgICAgICogICAgTWFwJmx0O0ludGVnZXIgdG9rZW4gdHlwZSxBcnJheUxpc3QmbHQ7SW50ZWdlciBzdHJlYW0gaW5kZXgmZ3Q7Jmd0OworICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBUaGlzIGRhdGEgc3RydWN0dXJlIGFsbG93cyB5b3UgdG8gZmluZCBhbGwgbm9kZXMgd2l0aCB0eXBlIElOVCBpbiBvcmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogIElmIHlvdSByZWFsbHkgbmVlZCB0byBmaW5kIGEgbm9kZSBvZiB0eXBlLCBzYXksIEZVTkMgcXVpY2tseSB0aGVuIHBlcmhhcHMKKyAgICAgICAgICoKKyAgICAgICAgICogICAgTWFwJmx0O0ludGVnZXJ0b2tlbiB0eXBlLE1hcCZsdDtPYmplY3QgdHJlZSBub2RlLEludGVnZXIgc3RyZWFtIGluZGV4Jmd0OyZndDsKKyAgICAgICAgICoKKyAgICAgICAgICogIHdvdWxkIGJlIGJldHRlciBmb3IgeW91LiAgVGhlIGludGVyaW9yIG1hcHMgbWFwIGEgdHJlZSBub2RlIHRvCisgICAgICAgICAqICB0aGUgaW5kZXggc28geW91IGRvbid0IGhhdmUgdG8gc2VhcmNoIGxpbmVhcmx5IGZvciBhIHNwZWNpZmljIG5vZGUuCisgICAgICAgICAqCisgICAgICAgICAqICBJZiB5b3UgY2hhbmdlIHRoaXMgbWV0aG9kLCB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0byBjaGFuZ2UKKyAgICAgICAgICogIGdldE5vZGVJbmRleCgpLCB3aGljaCBleHRyYWN0cyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICogIDwvcmVtYXJrcz4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbGxSZXZlcnNlSW5kZXgoIG9iamVjdCBub2RlLCBpbnQgc3RyZWFtSW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmV2SW5kZXggIitub2RlKyJAIitzdHJlYW1JbmRleCk7CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGluZGV4aW5nIGlmIHRoaXMgaXMgZW1wdHkgKG5vdGhpbmcgb2YgaW50ZXJlc3QpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAgPSBuZXcgRGljdGlvbmFyeTxpbnQsIElMaXN0PGludD4+KCk7IC8vIGZpcnN0IGluZGV4aW5nIG9wCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgdG9rZW5UeXBlID0gYWRhcHRvci5nZXRUeXBlKCBub2RlICk7CisgICAgICAgICAgICBpZiAoICEoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBJTkRFWF9BTEwgfHwKKyAgICAgICAgICAgICAgICAgICB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXguQ29udGFpbnMoIHRva2VuVHlwZSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gdG9rZW5UeXBlIG5vdCBvZiBpbnRlcmVzdAorICAgICAgICAgICAgfQorICAgICAgICAgICAgSUxpc3Q8aW50PiBpbmRleGVzOworCisgICAgICAgICAgICBpZiAoICF0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAuVHJ5R2V0VmFsdWUoIHRva2VuVHlwZSwgb3V0IGluZGV4ZXMgKSB8fCBpbmRleGVzID09IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ZXMgPSBuZXcgTGlzdDxpbnQ+KCk7IC8vIG5vIGxpc3QgeWV0IGZvciB0aGlzIHRva2VuIHR5cGUKKyAgICAgICAgICAgICAgICBpbmRleGVzLkFkZCggc3RyZWFtSW5kZXggKTsgLy8gbm90IHRoZXJlIHlldCwgYWRkCisgICAgICAgICAgICAgICAgdG9rZW5UeXBlVG9TdHJlYW1JbmRleGVzTWFwW3Rva2VuVHlwZV0gPSBpbmRleGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggIWluZGV4ZXMuQ29udGFpbnMoIHN0cmVhbUluZGV4ICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5BZGQoIHN0cmVhbUluZGV4ICk7IC8vIG5vdCB0aGVyZSB5ZXQsIGFkZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiA8c3VtbWFyeT4KKyAgICAgICAgICogIFRyYWNrIHRoZSBpbmRpY2F0ZWQgdG9rZW4gdHlwZSBpbiB0aGUgcmV2ZXJzZSBpbmRleC4gIENhbGwgdGhpcworICAgICAgICAgKiAgcmVwZWF0ZWRseSBmb3IgZWFjaCB0eXBlIG9yIHVzZSB2YXJpYW50IHdpdGggU2V0IGFyZ3VtZW50IHRvCisgICAgICAgICAqICBzZXQgYWxsIGF0IG9uY2UuCisgICAgICAgICAqICA8L3N1bW1hcnk+CisgICAgICAgICAqCisgICAgICAgICAqICA8cGFyYW0gbmFtZT0idG9rZW5UeXBlIiAvPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmV2ZXJzZUluZGV4KCBpbnQgdG9rZW5UeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rZW5UeXBlc1RvUmV2ZXJzZUluZGV4ID0gbmV3IEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBJTkRFWF9BTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleC5hZGQoIHRva2VuVHlwZSApOworICAgICAgICB9CisKKyAgICAgICAgLyoqIDxzdW1tYXJ5PgorICAgICAgICAgKiAgVHJhY2sgdGhlIGluZGljYXRlZCB0b2tlbiB0eXBlcyBpbiB0aGUgcmV2ZXJzZSBpbmRleC4gU2V0CisgICAgICAgICAqICB0byBJTkRFWF9BTEwgdG8gdHJhY2sgYWxsIHRva2VuIHR5cGVzLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmV2ZXJzZUluZGV4KCBIYXNoU2V0PGludD4gdG9rZW5UeXBlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9IHRva2VuVHlwZXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogPHN1bW1hcnk+CisgICAgICAgICAqICBHaXZlbiBhIG5vZGUgcG9pbnRlciwgcmV0dXJuIGl0cyBpbmRleCBpbnRvIHRoZSBub2RlIHN0cmVhbS4KKyAgICAgICAgICogIFRoaXMgaXMgbm90IGl0cyBUb2tlbiBzdHJlYW0gaW5kZXguICBJZiB0aGVyZSBpcyBubyByZXZlcnNlIG1hcAorICAgICAgICAgKiAgZnJvbSBub2RlIHRvIHN0cmVhbSBpbmRleCBvciB0aGUgbWFwIGRvZXMgbm90IGNvbnRhaW4gZW50cmllcworICAgICAgICAgKiAgZm9yIG5vZGUncyB0b2tlbiB0eXBlLCBhIGxpbmVhciBzZWFyY2ggb2YgZW50aXJlIHN0cmVhbSBpcyB1c2VkLgorICAgICAgICAgKiAgPC9zdW1tYXJ5PgorICAgICAgICAgKgorICAgICAgICAgKiAgPHJlbWFya3M+CisgICAgICAgICAqICBSZXR1cm4gLTEgaWYgZXhhY3Qgbm9kZSBwb2ludGVyIG5vdCBpbiBzdHJlYW0uCisgICAgICAgICAqICA8L3JlbWFya3M+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE5vZGVJbmRleCggb2JqZWN0IG5vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0ICIrbm9kZSk7CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCA9PSBudWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZUluZGV4TGluZWFybHkoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB0b2tlblR5cGUgPSBhZGFwdG9yLmdldFR5cGUoIG5vZGUgKTsKKyAgICAgICAgICAgIElMaXN0PGludD4gaW5kZXhlczsKKyAgICAgICAgICAgIGlmICggIXRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcC5UcnlHZXRWYWx1ZSggdG9rZW5UeXBlLCBvdXQgaW5kZXhlcyApIHx8IGluZGV4ZXMgPT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGxpbmVhcmx5OyBzdHJlYW0gaW5kZXggPSAiK2dldE5vZGVJbmRleExpbmVhcmx5KG5vZGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZUluZGV4TGluZWFybHkoIG5vZGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGluZGV4ZXMuc2l6ZSgpOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzdHJlYW1JbmRleCA9IGluZGV4ZXNbaV07CisgICAgICAgICAgICAgICAgb2JqZWN0IG4gPSBnZXQoIHN0cmVhbUluZGV4ICk7CisgICAgICAgICAgICAgICAgaWYgKCBuID09IG5vZGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGluIGluZGV4OyBzdHJlYW0gaW5kZXggPSAiK3N0cmVhbUluZGV4SSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmRleDsgLy8gZm91bmQgaXQhCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9VbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uY3MgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVW5idWZmZXJlZFRva2VuU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmZjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9DU2hhcnAzL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvVW5idWZmZXJlZFRva2VuU3RyZWFtLmNzCkBAIC0wLDAgKzEsMTcyIEBACivvu78vKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2FtIEhhcndlbGwKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCituYW1lc3BhY2UgQW50bHIuUnVudGltZQoreworICAgIHVzaW5nIEFudGxyLlJ1bnRpbWUuTWlzYzsKKyAgICB1c2luZyBDTFNDb21wbGlhbnQgPSBTeXN0ZW0uQ0xTQ29tcGxpYW50QXR0cmlidXRlOworICAgIHVzaW5nIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiA9IFN5c3RlbS5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CisgICAgdXNpbmcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uID0gU3lzdGVtLkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbjsKKworICAgIC8qKiBBIHRva2VuIHN0cmVhbSB0aGF0IHB1bGxzIHRva2VucyBmcm9tIHRoZSBjb2RlIHNvdXJjZSBvbi1kZW1hbmQgYW5kCisgICAgICogIHdpdGhvdXQgdHJhY2tpbmcgYSBjb21wbGV0ZSBidWZmZXIgb2YgdGhlIHRva2Vucy4gVGhpcyBzdHJlYW0gYnVmZmVycworICAgICAqICB0aGUgbWluaW11bSBudW1iZXIgb2YgdG9rZW5zIHBvc3NpYmxlLiAgSXQncyB0aGUgc2FtZSBhcworICAgICAqICBPbkRlbWFuZFRva2VuU3RyZWFtIGV4Y2VwdCB0aGF0IE9uRGVtYW5kVG9rZW5TdHJlYW0gYnVmZmVycyBhbGwgdG9rZW5zLgorICAgICAqCisgICAgICogIFlvdSBjYW4ndCB1c2UgdGhpcyBzdHJlYW0gaWYgeW91IHBhc3Mgd2hpdGVzcGFjZSBvciBvdGhlciBvZmYtY2hhbm5lbAorICAgICAqICB0b2tlbnMgdG8gdGhlIHBhcnNlci4gVGhlIHN0cmVhbSBjYW4ndCBpZ25vcmUgb2ZmLWNoYW5uZWwgdG9rZW5zLgorICAgICAqIAorICAgICAqICBZb3UgY2FuIG9ubHkgbG9vayBiYWNrd2FyZHMgMSB0b2tlbjogTFQoLTEpLgorICAgICAqCisgICAgICogIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gcmVhZCBmcm9tIGEgc29ja2V0IG9yIG90aGVyIGluZmluaXRlIHN0cmVhbS4KKyAgICAgKgorICAgICAqICBAc2VlIEJ1ZmZlcmVkVG9rZW5TdHJlYW0KKyAgICAgKiAgQHNlZSBDb21tb25Ub2tlblN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0gOiBMb29rYWhlYWRTdHJlYW08SVRva2VuPiwgSVRva2VuU3RyZWFtLCBJVG9rZW5TdHJlYW1JbmZvcm1hdGlvbgorICAgIHsKKyAgICAgICAgW0NMU0NvbXBsaWFudChmYWxzZSldCisgICAgICAgIHByb3RlY3RlZCBJVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2U7CisgICAgICAgIHByb3RlY3RlZCBpbnQgdG9rZW5JbmRleDsgLy8gc2ltcGxlIGNvdW50ZXIgdG8gc2V0IHRva2VuIGluZGV4IGluIHRva2VucworCisgICAgICAgIC8qKiBTa2lwIHRva2VucyBvbiBhbnkgY2hhbm5lbCBidXQgdGhpcyBvbmU7IHRoaXMgaXMgaG93IHdlIHNraXAgd2hpdGVzcGFjZS4uLiAqLworICAgICAgICBwcm90ZWN0ZWQgaW50IGNoYW5uZWwgPSBUb2tlbkNoYW5uZWxzLkRlZmF1bHQ7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0U3RhY2s8SVRva2VuPiBfcmVhbFRva2VucyA9IG5ldyBMaXN0U3RhY2s8SVRva2VuPigpIHsgbnVsbCB9OworCisgICAgICAgIHB1YmxpYyBVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0oSVRva2VuU291cmNlIHRva2VuU291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRva2VuU291cmNlID0gdG9rZW5Tb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSVRva2VuU291cmNlIFRva2VuU291cmNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBTb3VyY2VOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblNvdXJjZS5Tb3VyY2VOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiBJVG9rZW5TdHJlYW1JbmZvcm1hdGlvbiBNZW1iZXJzCisKKyAgICAgICAgcHVibGljIElUb2tlbiBMYXN0VG9rZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExCKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElUb2tlbiBMYXN0UmVhbFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfcmVhbFRva2Vucy5QZWVrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IE1heExvb2tCZWhpbmQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IE1hcmsoKQorICAgICAgICB7CisgICAgICAgICAgICBfcmVhbFRva2Vucy5QdXNoKF9yZWFsVG9rZW5zLlBlZWsoKSk7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5NYXJrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWxlYXNlKGludCBtYXJrZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuUmVsZWFzZShtYXJrZXIpOworICAgICAgICAgICAgX3JlYWxUb2tlbnMuUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbGVhcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZWFsVG9rZW5zLkNsZWFyKCk7CisgICAgICAgICAgICBfcmVhbFRva2Vucy5QdXNoKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ29uc3VtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ29uc3VtZSgpOworICAgICAgICAgICAgaWYgKFByZXZpb3VzRWxlbWVudCAhPSBudWxsICYmIFByZXZpb3VzRWxlbWVudC5MaW5lID4gMCkKKyAgICAgICAgICAgICAgICBfcmVhbFRva2Vuc1tfcmVhbFRva2Vucy5Db3VudCAtIDFdID0gUHJldmlvdXNFbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJVG9rZW4gTmV4dEVsZW1lbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBJVG9rZW4gdCA9IHRoaXMudG9rZW5Tb3VyY2UuTmV4dFRva2VuKCk7CisgICAgICAgICAgICB0LlRva2VuSW5kZXggPSB0aGlzLnRva2VuSW5kZXgrKzsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNFbmRPZkZpbGUoSVRva2VuIG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvLlR5cGUgPT0gQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSVRva2VuIEdldChpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQWJzb2x1dGUgdG9rZW4gaW5kZXhlcyBhcmUgbWVhbmluZ2xlc3MgaW4gYW4gdW5idWZmZXJlZCBzdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgTEEoaW50IGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMVChpKS5UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBUb1N0cmluZyhpbnQgc3RhcnQsIGludCBzdG9wKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIm4vYSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIFRvU3RyaW5nKElUb2tlbiBzdGFydCwgSVRva2VuIHN0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAibi9hIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmNzIGIvYW50bHItMy40L3J1bnRpbWUvQ1NoYXJwMy9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliMzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0NTaGFycDMvU291cmNlcy9BbnRscjMuUnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2VuY2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK25hbWVzcGFjZSBBbnRsci5SdW50aW1lCit7CisgICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisgICAgdXNpbmcgRXhjZXB0aW9uID0gU3lzdGVtLkV4Y2VwdGlvbjsKKyAgICB1c2luZyBTZXJpYWxpemF0aW9uSW5mbyA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvbkluZm87CisgICAgdXNpbmcgU3RyZWFtaW5nQ29udGV4dCA9IFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uU3RyZWFtaW5nQ29udGV4dDsKKworICAgIC8qKiA8c3VtbWFyeT5BbiBleHRyYSB0b2tlbiB3aGlsZSBwYXJzaW5nIGEgVG9rZW5TdHJlYW08L3N1bW1hcnk+ICovCisgICAgW1N5c3RlbS5TZXJpYWxpemFibGVdCisgICAgcHVibGljIGNsYXNzIFVud2FudGVkVG9rZW5FeGNlcHRpb24gOiBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVud2FudGVkVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVud2FudGVkVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lckV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVud2FudGVkVG9rZW5FeGNlcHRpb24oaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCkKKyAgICAgICAgICAgIDogYmFzZShleHBlY3RpbmcsIGlucHV0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihpbnQgZXhwZWN0aW5nLCBJSW50U3RyZWFtIGlucHV0LCBJTGlzdDxzdHJpbmc+IHRva2VuTmFtZXMpCisgICAgICAgICAgICA6IGJhc2UoZXhwZWN0aW5nLCBpbnB1dCwgdG9rZW5OYW1lcykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVud2FudGVkVG9rZW5FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RpbmcsIElJbnRTdHJlYW0gaW5wdXQsIElMaXN0PHN0cmluZz4gdG9rZW5OYW1lcykKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBleHBlY3RpbmcsIGlucHV0LCB0b2tlbk5hbWVzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgaW50IGV4cGVjdGluZywgSUludFN0cmVhbSBpbnB1dCwgSUxpc3Q8c3RyaW5nPiB0b2tlbk5hbWVzLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgZXhwZWN0aW5nLCBpbnB1dCwgdG9rZW5OYW1lcywgaW5uZXJFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBVbndhbnRlZFRva2VuRXhjZXB0aW9uKFNlcmlhbGl6YXRpb25JbmZvIGluZm8sIFN0cmVhbWluZ0NvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIDogYmFzZShpbmZvLCBjb250ZXh0KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBJVG9rZW4gVW5leHBlY3RlZFRva2VuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICAvL2ludCB1bmV4cGVjdGVkVHlwZSA9IGdldFVuZXhwZWN0ZWRUeXBlKCk7CisgICAgICAgICAgICAvL3N0cmluZyB1bmV4cGVjdGVkID0gKCB0b2tlbk5hbWVzICE9IG51bGwgJiYgdW5leHBlY3RlZFR5cGUgPj0gMCAmJiB1bmV4cGVjdGVkVHlwZSA8IHRva2VuTmFtZXMuTGVuZ3RoICkgPyB0b2tlbk5hbWVzW3VuZXhwZWN0ZWRUeXBlXSA6IHVuZXhwZWN0ZWRUeXBlLlRvU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgZXhwZWN0ZWQgPSAoVG9rZW5OYW1lcyAhPSBudWxsICYmIEV4cGVjdGluZyA+PSAwICYmIEV4cGVjdGluZyA8IFRva2VuTmFtZXMuQ291bnQpID8gVG9rZW5OYW1lc1tFeHBlY3RpbmddIDogRXhwZWN0aW5nLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBleHAgPSAiLCBleHBlY3RlZCAiICsgZXhwZWN0ZWQ7CisgICAgICAgICAgICBpZiAoRXhwZWN0aW5nID09IFRva2VuVHlwZXMuSW52YWxpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleHAgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUb2tlbiA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0iICsgbnVsbCArIGV4cCArICIpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0iICsgVG9rZW4uVGV4dCArIGV4cCArICIpIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9MSUNFTlNFLlRYVCBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9MSUNFTlNFLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjMxYzFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL0xJQ0VOU0UuVFhUCkBAIC0wLDAgKzEsMzEgQEAKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOCBFcmlrIHZhbiBCaWxzZW4KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgc2hhbGwgYmUKKyAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvTk9USUNFLlRYVCBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9OT1RJQ0UuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGE3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvTk9USUNFLlRYVApAQCAtMCwwICsxLDM1IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHNvZnR3YXJlIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBBTlRMUiBWMyBKYXZhIFJ1bnRpbWUgTGlicmFyeQorZGV2ZWxvcGVkIGJ5IFRlcmVuY2UgUGFyciBpbiBhY2NvcmRhbmNlIHdpdGggaXQncyBsaWNlbnNlOgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwMy0yMDA2IFRlcmVuY2UgUGFycgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1JFQURNRS5UWFQgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvUkVBRE1FLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjllOWIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1JFQURNRS5UWFQKQEAgLTAsMCArMSwyNjUgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBTlRMUiB2MyBEZWxwaGkgQ29kZSBnZW5lcmF0b3IgYW5kIFJ1bnRpbWUgbGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworT2N0b2JlciAyNywgMjAwOAorRXJpayB2YW4gQmlsc2VuIChlcmlrIEFUIGJpbHNlbiBET1QgY29tKQorCitQbGVhc2Ugc2VlIExJQ0VOU0UuVFhUIGZvciB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIGFuZCBOT1RJQ0UuVFhUCitmb3IgYXR0cmlidXRpb24gbm90aWNlcy4KKworQXJjaGl0ZWN0dXJlCis9PT09PT09PT09PT0KK1RoZSBEZWxwaGkgdGFyZ2V0IGNvbnNpc3RzIG9mIGEgc2V0IG9mIGNvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXMgYW5kIGEgcnVudGltZSAKK2xpYnJhcnkgKHdyaXR0ZW4gaW4gRGVscGhpIDIwMDkpIGZvciB0aGUgV2luMzIgcGxhdGZvcm0uCitUaGUgRGVscGhpIGNvZGUgZ2VuZXJhdGlvbiB0YXJnZXRzIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5IGFyZSBtb2RlbGVkIG9uIHRoZSAKK0MjIHZlcnNpb24uCisKK1lvdSBuZWVkIHRvIHVzZSBEZWxwaGkgMjAwOSBvciBhIGxhdGVyIHZlcnNpb24gdG8gYmUgYWJsZSB0byB1c2UgdGhpcyB0YXJnZXQuIAorWW91IHdpbGwgbm90IGJlIGFibGUgdG8gY29tcGlsZSBnZW5lcmF0ZWQgY29kZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIERlbHBoaS4KK1RoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGlzIERlbHBoaSB0YXJnZXQgdXNlcyBhIGxvdCBvZiBuZXcgRGVscGhpIAorbGFuZ3VhZ2UgZmVhdHVyZXMgc3VjaCBhcyBnZW5lcmljcy4KKworVG8gdXNlIHRoZSBEZWxwaGkgdGFyZ2V0LCB5b3Ugb25seSBuZWVkIHRvIHB1dCB0aGUgcnVudGltZSBzb3VyY2UgY29kZSBpbiBhIAorZGlyZWN0b3J5IG9mIHlvdXIgY2hvaWNlLCBhbmQgYWRkIHRoaXMgZGlyZWN0b3J5IHRvIHlvdSBEZWxwaGkgbGlicmFyeSBwYXRoIG9yIAordG8geW91ciBwcm9qZWN0J3Mgc2VhcmNoIHBhdGguCisKK1RoZSBydW50aW1lIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgdW5pdHM6CistQW50bHIuUnVudGltZTogdGhlIG1haW4gQW50bHIgdW5pdCB0aGF0IGNvbnRhaW5zIHRoZSBwYXJzZXIgYW5kIGxleGVyIGNsYXNzZXMKKy1BbnRsci5SdW50aW1lLlRyZWU6IHRoZSB0cmVlIHBhcnNlciBjbGFzcyBhbmQgb3RoZXIgdHJlZSByZWxhdGVkIGNsYXNzZXMKKy1BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zOiBzZXZlcmFsIGNvbGxlY3Rpb24gdXRpbGl0aWVzCistQW50bHIuUnVudGltZS5Ub29sczogdGhpcyBpcyBhIHNwZWNpYWwgRGVscGhpIGFkZGl0aW9uIHRvIHRoZSBydW50aW1lIAorIGNvbnRhaW5pbmcgc2V2ZXJhbCBoZWxwZXIgY2xhc3NlcyBhbmQgdXRpbGl0aWVzCitZb3Ugd2lsbCBmaW5kIHRoZXNlIGZpbGVzIGluIHRoZSAiQW50bHIzLlJ1bnRpbWUiIHN1YmRpcmVjdG9yeS4KKworSW4geW91ciBwcm9qZWN0cywgeW91IHVzdWFsbHkgb25seSBuZWVkIHRvIHVzZSB0aGUgQW50bHIuUnVudGltZSB1bml0LCBhbmQgdGhlCitBbnRsci5SdW50aW1lLlRyZWUgdW5pdCBmb3IgdHJlZSBwYXJzZXJzLgorVGhpcyB0YXJnZXQgZG9lcyBub3QgcmVxdWlyZSBhbnkgdGhpcmQgcGFydHkgbGlicmFyaWVzLCBhbmQgeW91IGRvIG5vdCBoYXZlIHRvCitkZXBsb3kgYW55IERMTHMgb3Igb3RoZXIgZmlsZXMgd2l0aCB5b3VyIEFOVExSIERlbHBoaSBwcm9qZWN0cy4KKworUGxlYXNlIG5vdGUgdGhhdCB0aGlzIERlbHBoaSB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCBTdHJpbmdUZW1wbGF0ZSBvdXRwdXQsIGJ1dAoraXQgZG9lcyBzdXBwb3J0IGFsbCBvdGhlciBvdXRwdXQgdHlwZXMsIGluY2x1ZGluZyBBU1Qgb3V0cHV0LgorCitTdGF0dXMKKz09PT09PQorQXMgb2YgT2N0b2JlciAyMDA4LCB0aGUgRGVscGhpIHRhcmdldCBpcyBpbiBzeW5jIHdpdGggQU5UTFIgMy4xLgorCitUaGlzIHZlcnNpb24gcGFzc2VzIGFsbCB0aGUgdW5pdCB0ZXN0cyAod2hpY2ggeW91IGNhbiBmaW5kIGluIHRoZQorIkFudGxyMy5SdW50aW1lLlRlc3RzIiBzdWJkaXJlY3RvcnkpIHdpdGhvdXQgYW55IG1lbW9yeSBsZWFrcy4KK0Fsc28sIGFsbCB0aGUgZ3JhbW1hciBzYW1wbGVzIGluIHRoZSAiZXhhbXBsZXMtdjNcRGVscGhpIiBkaXJlY3RvcnkgZnVuY3Rpb24KK2NvcnJlY3RseSBhbmQgd2l0aG91dCBhbnkgbWVtb3J5IGxlYWtzLgorCitQZXJmb3JtYW5jZQorPT09PT09PT09PT0KK1RoaXMgdGFyZ2V0IHNob3VsZCBwZXJmb3JtIHJlYXNvbmFibHkgd2VsbCBjb21wYXJlZCB0byBvdGhlciBBTlRMUiB0YXJnZXRzLgorRm9yIHNvbWUgZ3JhbW1hcnMsIGVzcGVjaWFsbHkgdHJlZSBncmFtbWFycywgdGhlIGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQgaXMgbm90CithcyBlZmZpY2llbnQgYXMgZm9yIG90aGVyIHRhcmdldHMuIFRoaXMgaGFzIHRvIGRvIHdpdGggdGhlIHdheSB0aGUgY29kZSBpcworZ2VuZXJhdGVkIHRvIHdvcmsgYXJvdW5kIHNvbWUgaXNzdWVzIHdpdGggdGhlIERlbHBoaSBsYW5ndWFnZS4gQnV0IGV2ZW4gd2l0aAordGhlc2Ugd29ya2Fyb3VuZHMsIHRoZSB0YXJnZXQgcGVyZm9ybXMgd2l0aGluIHJlYXNvbmFibGUgYm91bmRhcmllcy4KKworVXNhZ2UKKz09PT09CitIZXJlIGlzIGEgc2hvcnQgbGlzdCBvZiBEZWxwaGkgc3BlY2lmaWMgaXNzdWVzIHlvdSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50Cit3aGVuIHVzaW5nIHRoaXMgdGFyZ2V0LiBQbGVhc2UgY2hlY2sgb3V0IHRoZSBEZWxwaGkgc2FtcGxlIGdyYW1tYXJzIGluIHRoZQorImV4YW1wbGVzLXYzIiBhcmNoaXZlIGZvciBleGFtcGxlcyBvZiBhbGwgdGhlIGlzc3VlcyBkZXNjcmliZWQgYmVsb3cuIEFuZCB0aGVzZQorZXhhbXBsZXMgYXJlIGEgZ3JlYXQgd2F5IHRvIGdldCBzdGFydGVkIHdpdGggQU5UTFIuCisKK1NwZWNpZnkgdGhhdCBEZWxwaGkgY29kZSBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciBhIGdyYW1tYXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RvIHNwZWNpZnkgdGhhdCB0aGUgQU5UTFIgdG9vbCBzaG91bGQgZ2VuZXJhdGUgRGVscGhpICgyMDA5KSBjb2RlIChyYXRoZXIgdGhhbgordGhlIGRlZmF1bHQgb2YgZ2VuZXJhdGluZyBKYXZhIGNvZGUpIGZvciBhIGdyYW1tYXIsIHNldCB0aGUgZ3JhbW1hci1sZXZlbCBvcHRpb24KK25hbWVkICJsYW5ndWFnZSIgdG8gdGhlIHZhbHVlICJEZWxwaGkiIGFzIHNob3duIGJlbG93OgorCisgIGdyYW1tYXIgTXlHcmFtbWFyOworCisgIG9wdGlvbnMgeworICAJbGFuZ3VhZ2U9RGVscGhpOworICB9CisgIC4uLgorCitGb3IgdGhlIGV4YW1wbGUgZ3JhbW1hciBuYW1lZCBNeUdyYW1tYXIgYWJvdmUsIHRoZSBncmFtbWFyIGZpbGUgd291bGQgdHlwaWNhbGx5CitiZSBuYW1lZCBNeUdyYW1tYXIuZy4gVGhlIGdyYW1tYXIgZmlsZW5hbWUgKGV4Y2x1ZGluZyB0aGUgZXh0ZW5zaW9uKSBtdXN0IG1hdGNoCit0aGUgZ3JhbW1hciBuYW1lIGFzIGRlY2xhcmVkIHdpdGggdGhlIGdyYW1tYXIgZGlyZWN0aXZlIGluIHRoZSBmaWxlLgorCitVc2UgRGVscGhpIGNvZGUgaW4gYWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK09idmlvdXNseSwgYW55IGN1c3RvbSBhY3Rpb25zIGluc2lkZSB5b3VyIGdyYW1tYXJzIHNob3VsZCBiZSB3cml0dGVuIGluIHRoZQorRGVscGhpIGxhbmd1YWdlLiBUaGlzIGFsc28gYXBwbGllcyB0byBsZXNzIG9idmlvdXMgYWN0aW9ucyBsaWtlCit7JGNoYW5uZWw9SElEREVOO30sIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIGFzIHskY2hhbm5lbDo9SElEREVOO30gKHdpdGggdGhlCitjb2xvbiBiZWZvcmUgdGhlIGVxdWFscyBzaWduKS4KKworUnVsZSBuYW1lcyBtdXN0IG5vdCBiZSBjYXNlIHNlbnNpdGl2ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2luY2UgdGhlIERlbHBoaSBsYW5ndWFnZSBpcyBub3QgY2FzZSBzZW5zaXRpdmUsIHlvdSBtdXN0IHRha2UgY2FyZSB0aGF0IHRoZQorbmFtZXMgb2YgcnVsZXMgaW4geW91ciBncmFtbWFycyBkaWZmZXIgYnkgbW9yZSB0aGFuIG9ubHkgY2FzZS4gRm9yIGV4YW1wbGUsIGlmCit5b3UgaGF2ZSBhIHBhcnNlciBydWxlIGNhbGxlZCAiZXhwcmVzc2lvbiIsIHRoZW4geW91IHNob3VsZG4ndCBoYXZlIGEgbGV4ZXIgcnVsZQorY2FsbGVkICJFWFBSRVNTSU9OIiBvciAiRXhwcmVzc2lvbiIgb3IgYW55IG90aGVyIGNvbWJpbmF0aW9uIG9mIHVwcGVyLSBhbmQgbG93ZXIKK2Nhc2UgY2hhcmFjdGVycyB0aGF0IG1hdGggdGhlIHNhbWUgd29yZC4gQU5UTFIgd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGdlbmVyYXRlCitEZWxwaGkgY29kZSBmb3IgdGhpcywgYnV0IHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbXBpbGUgaXQgYmVjYXVzZSBvZgorZHVwbGljYXRlIGlkZW50aWZpZXJzLgorCitUaGUgQG1lbWJlcnMgZ3JhbW1hciBhY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIERlbHBoaSB0YXJnZXQgZG9lcyBub3QgcmVjb2duaXplIHRoZSBkZWZhdWx0IEBtZW1iZXJzIGdyYW1tYXIgYWN0aW9uLiBJdAordXNlcyB0aGUgZm9sbG93aW5nIHRocmVlIGdyYW1tYXIgYWN0aW9ucyBpbnN0ZWFkIChzZWUgdGhlIEMgYW5kIEphdmEgc2FtcGxlCitncmFtbWFycyBmb3IgZXhhbXBsZXMpOgorCitAbWVtYmVyRGVjbGFyYXRpb25zOiB1c2UgdGhpcyBhY3Rpb24gdGhhdCBkZWNsYXJlIG1lbWJlcnMgaW4gdGhlIGdlbmVyYXRlZAorcGFyc2VyL2xleGVyIGNsYXNzLiBGb3IgZXhhbXBsZToKKworICBAbWVtYmVyRGVjbGFyYXRpb25zIHsKKwllbnVtSXNLZXl3b3JkOiBCb29sZWFuOworCWZ1bmN0aW9uIGlzVHlwZU5hbWUoY29uc3QgbmFtZTogU3RyaW5nKTogQm9vbGVhbjsKKyAgfQorCisgIFRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGFwcGVhciBpbnNpZGUgdGhlIHBhcnNlci9sZXhlciBjbGFzcyBkZWNsYXJhdGlvbi4KKworQG1lbWJlckluaXRpYWxpemF0aW9uczogdXNlIHRoaXMgYWN0aW9uIHRvIGluaXRpYWxpemUgdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZQorQG1lbWJlckRlY2xhcmF0aW9ucyBhY3Rpb24uIEZvciBleGFtcGxlOgorCisgIEBtZW1iZXJJbml0aWFsaXphdGlvbnMgeworCWVudW1Jc0tleXdvcmQgOj0gVHJ1ZTsKKyAgfQorCisgIFRoZXNlIHN0YXRlbWVudHMgd2lsbCBhcHBlYXIgaW5zaWRlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcGFyc2VyL2xleGVyIGNsYXNzLgorCitAbWVtYmVySW1wbGVtZW50YXRpb25zOiB1c2UgdGhpcyBhY3Rpb24gZm9yIGFueSBjb2RlIHRoYXQgbXVzdCBhcHBlYXIgaW4gdGhlCitwYXJzZXIgY2xhc3MgaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlOgorCisgIEBtZW1iZXJJbXBsZW1lbnRhdGlvbnMgeworICBmdW5jdGlvbiBUQ1BhcnNlci5pc1R5cGVOYW1lKGNvbnN0IG5hbWU6IFN0cmluZyk6IEJvb2xlYW47CisgIGJlZ2luCisgICAgUmVzdWx0IDo9IFsuLi5dCisgIGVuZDsKKyAgfQorCisgIFRoZSBjb2RlIGluc2lkZSB0aGlzIGFjdGlvbiBhcHBlYXJzIGFzLWlzIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBvZgorICB0aGUgcGFyc2VyL2xleGVyIHVuaXQuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBmdWxsIG5hbWUgb2YKKyAgdGhlIG1ldGhvZCwgaW5jbHVkaW5nIHRoZSBwYXJzZXIvbGV4ZXIgY2xhc3MgbmFtZSAoZWcuIFRDUGFyc2VyLmlzVHlwZU5hbWUpLgorICBUaGUgY2xhc3MgbmFtZSBpcyBiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUgZ3JhbW1hciwgYW5kIHdoZXRoZXIgaXQgaXMgYSBwYXJzZXIKKyAgb3IgbGV4ZXIuIFNvLCBpZiB5b3VyIGdyYW1tYXIgaXMgY2FsbGVkICJNeUdyYW1tYXIiLCB0aGVuIHRoZSBsZXhlciBjbGFzcyB3aWxsCisgIGJlIGNhbGxlZCBUTXlHcmFtbWFyTGV4ZXIgYW5kIHRoZSBwYXJzZXIgY2xhc3Mgd2lsbCBiZSBjYWxsZWQKKyAgVE15R3JhbW1hclBhcnNlci4KKworVGhlIEB2YXJzIGdyYW1tYXIgYWN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FOVExSIHN1cHBvcnRzIGFuIEBpbml0IChhbmQgQGFmdGVyKSBncmFtbWFyIGFjdGlvbiBmb3IgYW55IGNvZGUgeW91IHdhbnQgdG8KK2V4ZWN1dGUgYXQgdGhlIGJlZ2lubmluZyAob3IgZW5kKSBvZiBhIHJ1bGUuIElmIHRoYXQgY29kZSwgb3IgYW55IG90aGVyIGNvZGUKK2luc2lkZSB0aGUgcnVsZSwgbWFrZXMgdXNlIG9mIGEgbG9jYWwgdmFyaWFibGUsIHRoZW4geW91IG5lZWQgdG8gZGVjbGFyZSB0aGF0Cit2YXJpYWJsZSBmaXJzdC4gVGhlIERlbHBoaSB0YXJnZXQgYWRkcyB0aGUgQHZhcnMgZ3JhbW1hciBhY3Rpb24gZm9yIHRoaXMKK3B1cnBvc2UuIFlvdSBjYW4gZGVjbGFyZSBhbnkgbG9jYWwgdmFyaWFibGVzIGluc2lkZSB0aGlzIGFjdGlvbiwgYXMgaW4gdGhpcworZXhhbXBsZSAodGFrZW4gZnJvbSB0aGUgUHl0aG9uIGV4YW1wbGUgZ3JhbW1hcik6CisKKyAgTEVBRElOR19XUworICBAdmFycyB7CisgICAgc3BhY2VzOiBJbnRlZ2VyOworICAgIFM6IFN0cmluZzsKKyAgfQorICBAaW5pdCB7CisgICAgc3BhY2VzIDo9IDA7CisgIH0KKworVGhlIHZhcmlhYmxlcyB5b3UgZGVjbGFyZSBpbiB0aGUgQHZhcnMgYWN0aW9uIHdpbGwgYXBwZWFyIGluc2lkZSB0aGUgInZhciIKK2RlY2xhcmF0aW9uIGJsb2NrIG9mIHRoZSBtZXRob2QgZm9yIHRoZSBydWxlIChpbiB0aGlzIGNhc2UgZm9yIHRoZQorTEVBRElOR19XUyBydWxlKS4KKworVGhlIEB1c2VzSW50ZXJmYWNlIGFuZCBAdXNlZEltcGxlbWVudGF0aW9uIGdyYW1tYXIgYWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSWYgeW91IG5lZWQgdG8gYWRkIHVuaXRzIHRvIHRoZSB1c2VzIGNsYXVzZSBvZiB0aGUgZ2VuZXJhdGVkIHVuaXRzLCB0aGVuIHlvdSBjYW4KK3VzZSB0aGUgQHVzZXNJbnRlcmZhY2UgYW5kIEB1c2VzSW1wbGVtZW50YXRpb24gZ3JhbW1hciBhY3Rpb25zLiBGb3IgZXhhbXBsZSwgaWYKK3NvbWUgY29kZSBpbnNpZGUgdGhlIGdyYW1tZXIgcnVsZXMgbmVlZHMgYWNjZXNzIHRvIHRoZSBEZWxwaGkgVFN0cmluZ0xpc3QgY2xhc3MsCit0aGVuIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBDbGFzc2VzIHVuaXQuCitVc2UgdGhlIEB1c2VzSW50ZXJmYWNlIGFjdGlvbiBpZiB5b3UgbmVlZCB0aGUgdW5pdHMgdG8gYXBwZWFyIGluIHRoZSBpbnRlcmZhY2UKK3BhcnQsIG9yIEB1c2VzSW1wbGVtZW50YXRpb24gaWYgeW91IG9ubHkgbmVlZCBhIHVuaXQgaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvbi4KK0ZvciBleGFtcGxlOgorCisgIEB1c2VzSW1wbGVtZW50YXRpb24geworICAgIENsYXNzZXMsCisgICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIH0KKworTm90ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCBhIGNvbW1hIGFmdGVyIGVhY2ggdW5pdCBpbiB0aGlzIGxpc3QuIFRoZSBEZWxwaGkgdW5pdHMKK1N5c1V0aWxzLCBTdHJVdGlscyBhbmQgTWF0aCBhcmUgYWRkZWQgdG8gdGhlIHVzZXMgY2xhdXNlIGF1dG9tYXRpY2FsbHkuCitBbHNvIG5vdGUgdGhhdCB5b3Ugd2lsbCB1c3VhbGx5IHB1dCB0aGUgQHVzZXNJbnRlcmZhY2UvQHVzZXNJbXBsZW1lbnRhdGlvbgorYWN0aW9ucyBhdCB0aGUgdG9wIG9mIHlvdXIgZ3JhbW1hciBmaWxlLCBsaWtlIHlvdSB3b3VsZCB0aGUgd2l0aCB0aGUgQGhlYWRlcgorYWN0aW9uIGZvciBvdGhlciBsYW5ndWFnZSB0YXJnZXRzLgorCitUaGUgRGVscGhpIHRhcmdldCBpcyBpbnRlcmZhY2UgYmFzZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWxsIGNsYXNzZXMgaW5zaWRlIHRoZSBEZWxwaGkgQU5UTFIgcnVudGltZSB1c2Ugb2JqZWN0IGludGVyZmFjZXMuIFRoaXMgZ3JlYXRseQorc2ltcGxpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBhbmQgbWFrZXMgdXNpbmcgdGhlIHJ1bnRpbWUgbXVjaCBlYXNpZXIuIFRoaXMgbWVhbnMKK3RoYXQgeW91IHdpbGwgbmV2ZXIgZGVjbGFyZSBjbGFzcyB2YXJpYWJsZXMgZm9yIEFOVExSIG9iamVjdHMsIGJ1dCBvbmx5IHVzZQoraW50ZXJmYWNlIHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCB0ZXN0IHJpZyBpbiBEZWxwaGkgbG9va3MgbGlrZSB0aGlzCisodGFrZW4gZnJvbSB0aGUgU2ltcGxlQyBleGFtcGxlKToKKworICBwcm9jZWR1cmUgUnVuKGNvbnN0IElucHV0RmlsZW5hbWU6IFN0cmluZyk7CisgIHZhcgorICAgIElucHV0OiBJQ2hhclN0cmVhbTsKKyAgICBMZXg6IElTaW1wbGVDTGV4ZXI7CisgICAgVG9rZW5zOiBJQ29tbW9uVG9rZW5TdHJlYW07CisgICAgUGFyc2VyOiBJU2ltcGxlQ1BhcnNlcjsKKyAgICBSOiBJcHJvZ19yZXR1cm47CisgIGJlZ2luCisgICAgSW5wdXQgOj0gVEFOVExSRmlsZVN0cmVhbS5DcmVhdGUoSW5wdXRGaWxlbmFtZSk7CisgICAgTGV4IDo9IFRTaW1wbGVDTGV4ZXIuQ3JlYXRlKElucHV0KTsKKyAgICBUb2tlbnMgOj0gVENvbW1vblRva2VuU3RyZWFtLkNyZWF0ZShMZXgpOworICAgIFBhcnNlciA6PSBUU2ltcGxlQ1BhcnNlci5DcmVhdGUoVG9rZW5zKTsKKyAgICBSIDo9IFBhcnNlci5wcm9nOworICAgIFdyaXRlTG4oJ3RyZWU9JyArIChSLlRyZWUgYXMgSVRyZWUpLlRvU3RyaW5nVHJlZSk7CisgIGVuZDsKKworTm90ZSB0aGF0IGFsbCB2YXJpYWJsZXMgYXJlIGRlY2xhcmVkIGFzIGludGVyZmFjZSB2YXJpYWJsZXMgKHN0YXJ0aW5nIHdpdGggYQorY2FwaXRhbCBJKSBpbnN0ZWFkIG9mIGNsYXNzIHZhcmlhYmxlcyAod2l0aCBhIGNhcGl0YWwgVCkuIEFuZCB0aGVyZSBpcyBubyBuZWVkCit0byBkZXN0cm95IHRoZXNlIG9iamVjdHMgeW91cnNlbGYgKHRoZXJlIGFyZSBubyBjYWxscyB0byBGcmVlIGFuZCBubwordHJ5Li5maW5hbGx5IGJsb2NrcyB0byBwcm90ZWN0IHRoZXNlIHJlc291cmNlcykuCisKK0lmIHlvdSBhcmUgbmV3IHRvIGludGVyZmFjZS1iYXNlZCBwcm9ncmFtbWluZywgdGhlbiBkb24ndCB3b3JyeToganVzdCByZW1lbWJlcgordG8gZGVjbGFyZSBhbGwgQU5UTFIgb2JqZWN0cyB1c2luZyBpbnRlcmZhY2UgdmFyaWFibGVzLCBhbmQgZG9uJ3QgY2FsbCBGcmVlCitvbiB0aGVtLgorCitOb3RlIHRoYXQgdGhlIEMjIGFuZCBKYXZhIHZlcnNpb25zIG9mIHRoZSB0cmVlIGNyZWF0aW9uIGNsYXNzZXMgdXNlIHRoZSBnZW5lcmFsCitPYmplY3QgdHlwZSBmb3IgdHJlZSBub2Rlcy4gSW4gdGhlIERlbHBoaSB2ZXJzaW9uLCB0cmVlIG5vZGVzIGFyZSBvZiB0eXBlCitJQU5UTFJJbnRlcmZhY2UsIGFuZCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdmFyaW91cyBjbGFzcyAobGlrZSBUQ29tbW9uVHJlZSkuCisKK0FudGxyLlJ1bnRpbWUuVG9vbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgdW5pdCBjb250YWlucyBzb21lIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgeW91IG1heSBmaW5kIHVzZWZ1bCBpbnNpZGUgQU5UTFIKK3Byb2plY3RzLiBBbHNvLCB0aGlzIHVuaXQgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciB0aGUgSUFOVExSSW50ZXJmYWNlCitpbnRlcmZhY2UgYW5kIFRBTlRMUk9iamVjdCBjbGFzcy4gQWxsIEFOVExSIGNsYXNzZXMgZGVyaXZlIGZyb20gVEFOVExST2JqZWN0IGFuZAoraW1wbGVtZW50IHRoZSBJQU5UTFJJbnRlcmZhY2UgaW50ZXJmYWNlLgorCitPdGhlciBpbnRlcmZhY2VzL2NsYXNzZXMgeW91IG1heSBmaW5kIHVzZWZ1bCBhcmU6CisKKyogSUFOVExSU3RyaW5nIChpbXBsZW1lbnRlZCBpbiBUQU5UTFJTdHJpbmcpOiBhIHdyYXBwZXIgYXJvdW5kIGEgRGVscGhpIHN0cmluZworICB0aGF0IGFsbG93cyB5b3UgdG8gdHJlYXQgYSBzdHJpbmcgYXMgYSByZWd1bGFyIEFOVExSIG9iamVjdC4KKworKiBJTGlzdDxUPiAoaW1wbGVtZW50ZWQgaW4gVExpc3Q8VD4pOiBhIGdlbmVyaWMgbGlzdCBjb250YWluaW5nIGVsZW1lbnRzIG9mCisgIHR5cGUgPFQ+LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mIEludGVnZXJzIGxpa2UgdGhpczoKKworICB2YXIKKyAgICBMaXN0OiBJTGlzdDxJbnRlZ2VyPjsKKyAgYmVnaW4KKyAgICBMaXN0IDo9IFRMaXN0PEludGVnZXI+LkNyZWF0ZTsKKyAgICBMaXN0LkFkZCgxMjMpOworICBlbmQ7CisKKyAgTm90ZSB0aGF0IHRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIFRMaXN0PFQ+IGRlY2xhcmVkIGluIERlbHBoaSdzIHVuaXQKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIGJ1dCBpdCBpbXBsZW1lbnRzIHRoZSBJTGlzdDxUPiBpbnRlcmZhY2UuCisKKyogSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiAoaW1wbGVtZW50ZWQgaW4gVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPik6IGEKKyAgZ2VuZXJpYyBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBlbGVtZW50cyBvZiB0eXBlIDxUS2V5PiB0byA8VFZhbHVlPi4gRm9yIGV4YW1wbGUsCisgIHRvIG1hcCBTdHJpbmdzIHRvIFRBTlRMUk9iamVjdHMsIHVzZToKKworICB2YXIKKyAgICBNYXA6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPgorICBiZWdpbgorICAgIE1hcCA6PSBURGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICAgIE1hcC5BZGQoJ2ZvbycsIFRBTlRMUk9iamVjdC5DcmVhdGUpOworICBlbmQ7CisKKyAgQWdhaW4sIHRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byBEZWxwaGkncyBURGljdGlvbmFyeSwgYnV0IGl0IGltcGxlbWVudHMgdGhlCisgIElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gaW50ZXJmYWNlLgorCisKKworRXJpayB2YW4gQmlsc2VuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zLlRlc3RzLnBhcyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMuVGVzdHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDMwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zLlRlc3RzLnBhcwpAQCAtMCwwICsxLDEzNCBAQAordW5pdCBBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zLlRlc3RzOworeworCisgIERlbHBoaSBEVW5pdCBUZXN0IENhc2UKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUaGlzIHVuaXQgY29udGFpbnMgYSBza2VsZXRvbiB0ZXN0IGNhc2UgY2xhc3MgZ2VuZXJhdGVkIGJ5IHRoZSBUZXN0IENhc2UgV2l6YXJkLgorICBNb2RpZnkgdGhlIGdlbmVyYXRlZCBjb2RlIHRvIGNvcnJlY3RseSBzZXR1cCBhbmQgY2FsbCB0aGUgbWV0aG9kcyBmcm9tIHRoZSB1bml0IAorICBiZWluZyB0ZXN0ZWQuCisKK30KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgVGVzdEZyYW1ld29yaywKKyAgQW50bHIuUnVudGltZS5Db2xsZWN0aW9ucywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIEFudGxyLlJ1bnRpbWUuVG9vbHM7CisKK3R5cGUKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBJSGFzaExpc3QKKyAgVGVzdElIYXNoTGlzdCA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSUhhc2hMaXN0OiBJSGFzaExpc3Q8SW50ZWdlciwgU3RyaW5nPjsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFNldFVwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgVGVhckRvd247IG92ZXJyaWRlOworICBwdWJsaXNoZWQKKyAgICBwcm9jZWR1cmUgVGVzdEluc2VydGlvbk9yZGVyOworICAgIHByb2NlZHVyZSBUZXN0UmVtb3ZlOworICBlbmQ7CisKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBJU3RhY2tMaXN0CisgIFRlc3RJU3RhY2tMaXN0ID0gY2xhc3MoVFRlc3RDYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZJU3RhY2tMaXN0OiBJU3RhY2tMaXN0PFN0cmluZz47CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBTZXRVcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFRlYXJEb3duOyBvdmVycmlkZTsKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RQdXNoUG9wOworICAgIHByb2NlZHVyZSBUZXN0UGVlazsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCit1c2VzCisgIFN5c1V0aWxzOworCitjb25zdAorICBWYWx1ZXM6IGFycmF5IFswLi45XSBvZiBJbnRlZ2VyID0gKDUwLCAxLCAzMywgNzYsIC0yMiwgMjIsIDM0LCAyLCA4OCwgMTIpOworCitwcm9jZWR1cmUgVGVzdElIYXNoTGlzdC5TZXRVcDsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgRklIYXNoTGlzdCA6PSBUSGFzaExpc3Q8SW50ZWdlciwgU3RyaW5nPi5DcmVhdGU7CisgIGZvciBJIGluIFZhbHVlcyBkbworICAgIEZJSGFzaExpc3QuQWRkKEksJ1ZhbHVlJyArIEludFRvU3RyKEkpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJSGFzaExpc3QuVGVhckRvd247CitiZWdpbgorICBGSUhhc2hMaXN0IDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJSGFzaExpc3QuVGVzdEluc2VydGlvbk9yZGVyOwordmFyCisgIEk6IEludGVnZXI7CisgIFA6IFRQYWlyPEludGVnZXIsIFN0cmluZz47CitiZWdpbgorICBJIDo9IDA7CisgIGZvciBQIGluIEZJSGFzaExpc3QgZG8KKyAgYmVnaW4KKyAgICBDaGVja0VxdWFscyhQLktleSwgVmFsdWVzW0ldKTsKKyAgICBDaGVja0VxdWFscyhQLlZhbHVlLCAnVmFsdWUnICsgSW50VG9TdHIoVmFsdWVzW0ldKSk7CisgICAgSW5jKEkpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUhhc2hMaXN0LlRlc3RSZW1vdmU7Cit2YXIKKyAgSTogSW50ZWdlcjsKKyAgUDogVFBhaXI8SW50ZWdlciwgU3RyaW5nPjsKK2JlZ2luCisgIEZJSGFzaExpc3QuUmVtb3ZlKDM0KTsKKyAgSSA6PSAwOworICBmb3IgUCBpbiBGSUhhc2hMaXN0IGRvCisgIGJlZ2luCisgICAgaWYgKFZhbHVlc1tJXSA9IDM0KSB0aGVuCisgICAgICBJbmMoSSk7CisgICAgQ2hlY2tFcXVhbHMoUC5LZXksIFZhbHVlc1tJXSk7CisgICAgQ2hlY2tFcXVhbHMoUC5WYWx1ZSwgJ1ZhbHVlJyArIEludFRvU3RyKFZhbHVlc1tJXSkpOworICAgIEluYyhJKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVGVzdElTdGFja0xpc3QuU2V0VXA7CitiZWdpbgorICBGSVN0YWNrTGlzdCA6PSBUU3RhY2tMaXN0PFN0cmluZz4uQ3JlYXRlOworZW5kOworCitwcm9jZWR1cmUgVGVzdElTdGFja0xpc3QuVGVhckRvd247CitiZWdpbgorICBGSVN0YWNrTGlzdCA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVN0YWNrTGlzdC5UZXN0UHVzaFBvcDsKK3ZhcgorICBJdGVtOiBTdHJpbmc7CitiZWdpbgorICBJdGVtIDo9ICdJdGVtIDEnOworICBGSVN0YWNrTGlzdC5QdXNoKEl0ZW0pOworICBJdGVtIDo9ICdJdGVtIDInOworICBGSVN0YWNrTGlzdC5QdXNoKEl0ZW0pOworICBDaGVja0VxdWFscyhGSVN0YWNrTGlzdC5Qb3AsJ0l0ZW0gMicpOworICBDaGVja0VxdWFscyhGSVN0YWNrTGlzdC5Qb3AsJ0l0ZW0gMScpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElTdGFja0xpc3QuVGVzdFBlZWs7CitiZWdpbgorICBGSVN0YWNrTGlzdC5QdXNoKCdJdGVtIDEnKTsKKyAgRklTdGFja0xpc3QuUHVzaCgnSXRlbSAyJyk7CisgIEZJU3RhY2tMaXN0LlB1c2goJ0l0ZW0gMycpOworICBGSVN0YWNrTGlzdC5Qb3A7CisgIENoZWNrRXF1YWxzKEZJU3RhY2tMaXN0LlBlZWssICdJdGVtIDInKTsKKyAgQ2hlY2tFcXVhbHMoRklTdGFja0xpc3QuUG9wLCAnSXRlbSAyJyk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCisgIC8vIFJlZ2lzdGVyIGFueSB0ZXN0IGNhc2VzIHdpdGggdGhlIHRlc3QgcnVubmVyCisgIFJlZ2lzdGVyVGVzdChUZXN0SUhhc2hMaXN0LlN1aXRlKTsKKyAgUmVnaXN0ZXJUZXN0KFRlc3RJU3RhY2tMaXN0LlN1aXRlKTsKK2VuZC4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyLlJ1bnRpbWUuVGVzdHMucGFzIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvQW50bHIuUnVudGltZS5UZXN0cy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjZjQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyLlJ1bnRpbWUuVGVzdHMucGFzCkBAIC0wLDAgKzEsMTgzIEBACit1bml0IEFudGxyLlJ1bnRpbWUuVGVzdHM7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBUZXN0RnJhbWV3b3JrLAorICBBbnRsci5SdW50aW1lOworCit0eXBlCisgIC8vIFRlc3QgbWV0aG9kcyBmb3IgY2xhc3MgSUFOVExSU3RyaW5nU3RyZWFtCisgIFRlc3RBTlRMUlN0cmluZ1N0cmVhbSA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBjb25zdAorICAgICAgTkwgPSAjMTMjMTA7CisgICAgICBHUkFNTUFSU1RSID0gJycKKyAgICAgICAgKyAncGFyc2VyIGdyYW1tYXIgcDsnICsgTkwKKyAgICAgICAgKyAncHJvZyA6IFdISUxFIElEIExDVVJMWSAoYXNzaWduKSogUkNVUkxZIEVPRjsnICsgTkwKKyAgICAgICAgKyAnYXNzaWduIDogSUQgQVNTSUdOIGV4cHIgU0VNSSA7JyArIE5MCisgICAgICAgICsgJ2V4cHIgOiBJTlQgfCBGTE9BVCB8IElEIDsnICsgTkw7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBTZXRVcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFRlYXJEb3duOyBvdmVycmlkZTsKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RTaXplT25FbXB0eUFOVExSU3RyaW5nU3RyZWFtOworICAgIHByb2NlZHVyZSBUZXN0U2l6ZU9uQU5UTFJTdHJpbmdTdHJlYW07CisgICAgcHJvY2VkdXJlIFRlc3RDb25zdW1lT25BTlRMUlN0cmluZ1N0cmVhbTsKKyAgICBwcm9jZWR1cmUgVGVzdFJlc2V0T25BTlRMUlN0cmluZ1N0cmVhbTsKKyAgICBwcm9jZWR1cmUgVGVzdFN1YnN0cmluZ09uQU5UTFJTdHJpbmdTdHJlYW07CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKworeyBUZXN0QU5UTFJTdHJpbmdTdHJlYW0gfQorCitwcm9jZWR1cmUgVGVzdEFOVExSU3RyaW5nU3RyZWFtLlNldFVwOworYmVnaW4KK2VuZDsKKworcHJvY2VkdXJlIFRlc3RBTlRMUlN0cmluZ1N0cmVhbS5UZWFyRG93bjsKK2JlZ2luCitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0QU5UTFJTdHJpbmdTdHJlYW0uVGVzdENvbnN1bWVPbkFOVExSU3RyaW5nU3RyZWFtOwordmFyCisgIFN0cmVhbTogSUFOVExSU3RyaW5nU3RyZWFtOworYmVnaW4KKyAgU3RyZWFtIDo9IFRBTlRMUlN0cmluZ1N0cmVhbS5DcmVhdGUoJ09uZScjMTMjMTAnVHdvJyk7CisgIENoZWNrRXF1YWxzKDAsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDAsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygxLCBTdHJlYW0uTGluZSk7CisKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIE8KKyAgQ2hlY2tFcXVhbHMoMSwgU3RyZWFtLkluZGV4KTsKKyAgQ2hlY2tFcXVhbHMoMSwgU3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisgIENoZWNrRXF1YWxzKDEsIFN0cmVhbS5MaW5lKTsKKworICBTdHJlYW0uQ29uc3VtZTsgLy8gbgorICBDaGVja0VxdWFscygyLCBTdHJlYW0uSW5kZXgpOworICBDaGVja0VxdWFscygyLCBTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgQ2hlY2tFcXVhbHMoMSwgU3RyZWFtLkxpbmUpOworCisgIFN0cmVhbS5Db25zdW1lOyAvLyBlCisgIENoZWNrRXF1YWxzKDMsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDMsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygxLCBTdHJlYW0uTGluZSk7CisKKyAgU3RyZWFtLkNvbnN1bWU7IC8vICMxMworICBDaGVja0VxdWFscyg0LCBTdHJlYW0uSW5kZXgpOworICBDaGVja0VxdWFscyg0LCBTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgQ2hlY2tFcXVhbHMoMSwgU3RyZWFtLkxpbmUpOworCisgIFN0cmVhbS5Db25zdW1lOyAvLyAjMTAKKyAgQ2hlY2tFcXVhbHMoNSwgU3RyZWFtLkluZGV4KTsKKyAgQ2hlY2tFcXVhbHMoMCwgU3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisgIENoZWNrRXF1YWxzKDIsIFN0cmVhbS5MaW5lKTsKKworICBTdHJlYW0uQ29uc3VtZTsgLy8gVAorICBDaGVja0VxdWFscyg2LCBTdHJlYW0uSW5kZXgpOworICBDaGVja0VxdWFscygxLCBTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgQ2hlY2tFcXVhbHMoMiwgU3RyZWFtLkxpbmUpOworCisgIFN0cmVhbS5Db25zdW1lOyAvLyB3CisgIENoZWNrRXF1YWxzKDcsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDIsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygyLCBTdHJlYW0uTGluZSk7CisKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIG8KKyAgQ2hlY2tFcXVhbHMoOCwgU3RyZWFtLkluZGV4KTsKKyAgQ2hlY2tFcXVhbHMoMywgU3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisgIENoZWNrRXF1YWxzKDIsIFN0cmVhbS5MaW5lKTsKKworICBTdHJlYW0uQ29uc3VtZTsgLy8gRU9GCisgIENoZWNrRXF1YWxzKDgsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDMsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygyLCBTdHJlYW0uTGluZSk7CisKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIEVPRgorICBDaGVja0VxdWFscyg4LCBTdHJlYW0uSW5kZXgpOworICBDaGVja0VxdWFscygzLCBTdHJlYW0uQ2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgQ2hlY2tFcXVhbHMoMiwgU3RyZWFtLkxpbmUpOworZW5kOworCitwcm9jZWR1cmUgVGVzdEFOVExSU3RyaW5nU3RyZWFtLlRlc3RSZXNldE9uQU5UTFJTdHJpbmdTdHJlYW07Cit2YXIKKyAgU3RyZWFtOiBJQU5UTFJTdHJpbmdTdHJlYW07CitiZWdpbgorICBTdHJlYW0gOj0gVEFOVExSU3RyaW5nU3RyZWFtLkNyZWF0ZSgnT25lJyMxMyMxMCdUd28nKTsKKyAgQ2hlY2tFcXVhbHMoMCwgU3RyZWFtLkluZGV4KTsKKyAgQ2hlY2tFcXVhbHMoMCwgU3RyZWFtLkNoYXJQb3NpdGlvbkluTGluZSk7CisgIENoZWNrRXF1YWxzKDEsIFN0cmVhbS5MaW5lKTsKKworICBTdHJlYW0uQ29uc3VtZTsgLy8gTworICBTdHJlYW0uQ29uc3VtZTsgLy8gbgorCisgIENoZWNrRXF1YWxzKE9yZCgnZScpLCBTdHJlYW0uTEEoMSkpOworICBDaGVja0VxdWFscygyLCBTdHJlYW0uSW5kZXgpOworCisgIFN0cmVhbS5SZXNldDsKKyAgQ2hlY2tFcXVhbHMoT3JkKCdPJyksIFN0cmVhbS5MQSgxKSk7CisgIENoZWNrRXF1YWxzKDAsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDAsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygxLCBTdHJlYW0uTGluZSk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBPCisKKyAgQ2hlY2tFcXVhbHMoT3JkKCduJyksIFN0cmVhbS5MQSgxKSk7CisgIENoZWNrRXF1YWxzKDEsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDEsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygxLCBTdHJlYW0uTGluZSk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBuCisKKyAgQ2hlY2tFcXVhbHMoT3JkKCdlJyksIFN0cmVhbS5MQSgxKSk7CisgIENoZWNrRXF1YWxzKDIsIFN0cmVhbS5JbmRleCk7CisgIENoZWNrRXF1YWxzKDIsIFN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmUpOworICBDaGVja0VxdWFscygxLCBTdHJlYW0uTGluZSk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBuCitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0QU5UTFJTdHJpbmdTdHJlYW0uVGVzdFNpemVPbkFOVExSU3RyaW5nU3RyZWFtOwordmFyCisgIFMxLCBTMiwgUzM6IElBTlRMUlN0cmluZ1N0cmVhbTsKK2JlZ2luCisgIFMxIDo9IFRBTlRMUlN0cmluZ1N0cmVhbS5DcmVhdGUoJ2xleGVyJyMxMyMxMCk7CisgIENoZWNrRXF1YWxzKDcsIFMxLlNpemUpOworCisgIFMyIDo9IFRBTlRMUlN0cmluZ1N0cmVhbS5DcmVhdGUoR1JBTU1BUlNUUik7CisgIENoZWNrRXF1YWxzKExlbmd0aChHUkFNTUFSU1RSKSwgUzIuU2l6ZSk7CisKKyAgUzMgOj0gVEFOVExSU3RyaW5nU3RyZWFtLkNyZWF0ZSgnZ3JhbW1hciBQOycpOworICBDaGVja0VxdWFscygxMCwgUzMuU2l6ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0QU5UTFJTdHJpbmdTdHJlYW0uVGVzdFNpemVPbkVtcHR5QU5UTFJTdHJpbmdTdHJlYW07Cit2YXIKKyAgUzE6IElBTlRMUlN0cmluZ1N0cmVhbTsKK2JlZ2luCisgIFMxIDo9IFRBTlRMUlN0cmluZ1N0cmVhbS5DcmVhdGUoJycpOworICBDaGVja0VxdWFscygwLCBTMS5TaXplKTsKKyAgQ2hlY2tFcXVhbHMoMCwgUzEuSW5kZXgpOworZW5kOworCitwcm9jZWR1cmUgVGVzdEFOVExSU3RyaW5nU3RyZWFtLlRlc3RTdWJzdHJpbmdPbkFOVExSU3RyaW5nU3RyZWFtOwordmFyCisgIFN0cmVhbTogSUFOVExSU3RyaW5nU3RyZWFtOworYmVnaW4KKyAgU3RyZWFtIDo9IFRBTlRMUlN0cmluZ1N0cmVhbS5DcmVhdGUoJ09uZScjMTMjMTAnVHdvJyMxMyMxMCdUaHJlZScpOworCisgIENoZWNrRXF1YWxzKCdUd28nLCBTdHJlYW0uU3Vic3RyaW5nKDUsIDcpKTsKKyAgQ2hlY2tFcXVhbHMoJ09uZScsIFN0cmVhbS5TdWJzdHJpbmcoMCwgMikpOworICBDaGVja0VxdWFscygnVGhyZWUnLCBTdHJlYW0uU3Vic3RyaW5nKDEwLCAxNCkpOworCisgIFN0cmVhbS5Db25zdW1lOworCisgIENoZWNrRXF1YWxzKCdUd28nLCBTdHJlYW0uU3Vic3RyaW5nKDUsIDcpKTsKKyAgQ2hlY2tFcXVhbHMoJ09uZScsIFN0cmVhbS5TdWJzdHJpbmcoMCwgMikpOworICBDaGVja0VxdWFscygnVGhyZWUnLCBTdHJlYW0uU3Vic3RyaW5nKDEwLCAxNCkpOworZW5kOworCitpbml0aWFsaXphdGlvbgorICAvLyBSZWdpc3RlciBhbnkgdGVzdCBjYXNlcyB3aXRoIHRoZSB0ZXN0IHJ1bm5lcgorICBSZWdpc3RlclRlc3QoVGVzdEFOVExSU3RyaW5nU3RyZWFtLlN1aXRlKTsKK2VuZC4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyLlJ1bnRpbWUuVG9vbHMuVGVzdHMucGFzIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvQW50bHIuUnVudGltZS5Ub29scy5UZXN0cy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkOTY2MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyLlJ1bnRpbWUuVG9vbHMuVGVzdHMucGFzCkBAIC0wLDAgKzEsNjMzIEBACit1bml0IEFudGxyLlJ1bnRpbWUuVG9vbHMuVGVzdHM7Cit7CisKKyAgRGVscGhpIERVbml0IFRlc3QgQ2FzZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRoaXMgdW5pdCBjb250YWlucyBhIHNrZWxldG9uIHRlc3QgY2FzZSBjbGFzcyBnZW5lcmF0ZWQgYnkgdGhlIFRlc3QgQ2FzZSBXaXphcmQuCisgIE1vZGlmeSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gY29ycmVjdGx5IHNldHVwIGFuZCBjYWxsIHRoZSBtZXRob2RzIGZyb20gdGhlIHVuaXQKKyAgYmVpbmcgdGVzdGVkLgorCit9CisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUZXN0RnJhbWV3b3JrLAorICBHZW5lcmljcy5EZWZhdWx0cywKKyAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCisgIEFudGxyLlJ1bnRpbWUuVG9vbHM7CisKK3R5cGUKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBJQU5UTFJTdHJpbmcKKyAgVGVzdElBTlRMUlN0cmluZyA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSUFOVExSU3RyaW5nOiBJQU5UTFJTdHJpbmc7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBTZXRVcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFRlYXJEb3duOyBvdmVycmlkZTsKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RHZXRWYWx1ZTsKKyAgICBwcm9jZWR1cmUgVGVzdFNldFZhbHVlOworICBlbmQ7CisKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBUQU5UTFJTdHJpbmcKKyAgVGVzdFRBTlRMUlN0cmluZyA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQU5UTFJTdHJpbmc6IFRBTlRMUlN0cmluZzsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFNldFVwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgVGVhckRvd247IG92ZXJyaWRlOworICBwdWJsaXNoZWQKKyAgICBwcm9jZWR1cmUgVGVzdFRvU3RyaW5nOworICBlbmQ7CisKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBJQ2xvbmVhYmxlCisgIFRlc3RJQ2xvbmVhYmxlID0gY2xhc3MoVFRlc3RDYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZJQ2xvbmVhYmxlOiBJQ2xvbmVhYmxlOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgU2V0VXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBUZWFyRG93bjsgb3ZlcnJpZGU7CisgIHB1Ymxpc2hlZAorICAgIHByb2NlZHVyZSBUZXN0Q2xvbmU7CisgIGVuZDsKKworICAvLyBUZXN0IG1ldGhvZHMgZm9yIGNsYXNzIElMaXN0CisgIFRlc3RJTGlzdCA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSUxpc3Q6IElMaXN0PEludGVnZXI+OworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgU2V0VXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBUZWFyRG93bjsgb3ZlcnJpZGU7CisgIHB1Ymxpc2hlZAorICAgIHByb2NlZHVyZSBUZXN0R2V0Q2FwYWNpdHk7CisgICAgcHJvY2VkdXJlIFRlc3RTZXRDYXBhY2l0eTsKKyAgICBwcm9jZWR1cmUgVGVzdEdldENvdW50OworICAgIHByb2NlZHVyZSBUZXN0U2V0Q291bnQ7CisgICAgcHJvY2VkdXJlIFRlc3RHZXRJdGVtOworICAgIHByb2NlZHVyZSBUZXN0U2V0SXRlbTsKKyAgICBwcm9jZWR1cmUgVGVzdEFkZDsKKyAgICBwcm9jZWR1cmUgVGVzdEFkZFJhbmdlOworICAgIHByb2NlZHVyZSBUZXN0SW5zZXJ0OworICAgIHByb2NlZHVyZSBUZXN0UmVtb3ZlOworICAgIHByb2NlZHVyZSBUZXN0RGVsZXRlOworICAgIHByb2NlZHVyZSBUZXN0RGVsZXRlUmFuZ2U7CisgICAgcHJvY2VkdXJlIFRlc3RDbGVhcjsKKyAgICBwcm9jZWR1cmUgVGVzdENvbnRhaW5zOworICAgIHByb2NlZHVyZSBUZXN0SW5kZXhPZjsKKyAgZW5kOworCisgIC8vIFRlc3QgbWV0aG9kcyBmb3IgY2xhc3MgSURpY3Rpb25hcnkKKyAgVGVzdElEaWN0aW9uYXJ5ID0gY2xhc3MoVFRlc3RDYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZJRGljdGlvbmFyeTogSURpY3Rpb25hcnk8U3RyaW5nLCBJbnRlZ2VyPjsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFNldFVwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgVGVhckRvd247IG92ZXJyaWRlOworICBwdWJsaXNoZWQKKyAgICBwcm9jZWR1cmUgVGVzdEdldEl0ZW07CisgICAgcHJvY2VkdXJlIFRlc3RTZXRJdGVtOworICAgIHByb2NlZHVyZSBUZXN0R2V0Q291bnQ7CisgICAgcHJvY2VkdXJlIFRlc3RBZGQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZW1vdmU7CisgICAgcHJvY2VkdXJlIFRlc3RUcnlHZXRWYWx1ZTsKKyAgICBwcm9jZWR1cmUgVGVzdENvbnRhaW5zS2V5OworICAgIHByb2NlZHVyZSBUZXN0Q29udGFpbnNWYWx1ZTsKKyAgICBwcm9jZWR1cmUgVGVzdEVudW1lcmF0aW9uOworICBlbmQ7CisKKyAgLy8gVGVzdCBtZXRob2RzIGZvciByZWNvcmQgVExvY2FsU3RvcmFnZQorICBUZXN0VExvY2FsU3RvcmFnZSA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RMb2NhbEludGVnZXJTdG9yYWdlOworICAgIHByb2NlZHVyZSBUZXN0TG9jYWxJbnRlcmZhY2VTdG9yYWdlOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3R5cGUKKyAgSUZvbyA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezQ4RTNGQzcyLTRFNjMtNDZEOC04NDUwLUE1NjFFQ0Y3Njk5NX0nXQorICAgIGZ1bmN0aW9uIEdldFZhbHVlOiBTdHJpbmc7CisgICAgcHJvY2VkdXJlIFNldFZhbHVlKGNvbnN0IFY6IFN0cmluZyk7CisgICAgcHJvcGVydHkgVmFsdWU6IFN0cmluZyByZWFkIEdldFZhbHVlIHdyaXRlIFNldFZhbHVlOworICBlbmQ7CisKKyAgVEZvbyA9IGNsYXNzKFRBTlRMUk9iamVjdCwgSUNsb25lYWJsZSwgSUZvbykKKyAgICBGVmFsdWU6IFN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRWYWx1ZTogU3RyaW5nOworICAgIHByb2NlZHVyZSBTZXRWYWx1ZShjb25zdCBWOiBTdHJpbmcpOworICAgIGZ1bmN0aW9uIENsb25lOiBJQU5UTFJJbnRlcmZhY2U7CisgIGVuZDsKKworZnVuY3Rpb24gVEZvby5HZXRWYWx1ZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRGb28uU2V0VmFsdWUoY29uc3QgVjogU3RyaW5nKTsKK2JlZ2luCisgIEZWYWx1ZSA6PSBWOworZW5kOworCitmdW5jdGlvbiBURm9vLkNsb25lOiBJQU5UTFJJbnRlcmZhY2U7Cit2YXIKKyAgRm9vOiBJRm9vOworYmVnaW4KKyAgRm9vIDo9IFRGb28uQ3JlYXRlOworICBGb28uVmFsdWUgOj0gRlZhbHVlOworICBSZXN1bHQgOj0gRm9vOworZW5kOworCitwcm9jZWR1cmUgVGVzdElBTlRMUlN0cmluZy5TZXRVcDsKK2JlZ2luCisgIEZJQU5UTFJTdHJpbmcgOj0gVEFOVExSU3RyaW5nLkNyZWF0ZSgnZm9vJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUFOVExSU3RyaW5nLlRlYXJEb3duOworYmVnaW4KKyAgRklBTlRMUlN0cmluZyA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUFOVExSU3RyaW5nLlRlc3RHZXRWYWx1ZTsKK3ZhcgorICBSZXR1cm5WYWx1ZTogc3RyaW5nOworYmVnaW4KKyAgUmV0dXJuVmFsdWUgOj0gRklBTlRMUlN0cmluZy5HZXRWYWx1ZTsKKyAgQ2hlY2tFcXVhbHMoUmV0dXJuVmFsdWUsJ2ZvbycpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElBTlRMUlN0cmluZy5UZXN0U2V0VmFsdWU7Cit2YXIKKyAgVmFsdWU6IHN0cmluZzsKK2JlZ2luCisgIFZhbHVlIDo9ICdiYXInOworICBGSUFOVExSU3RyaW5nLlNldFZhbHVlKFZhbHVlKTsKKyAgQ2hlY2tFcXVhbHMoRklBTlRMUlN0cmluZy5WYWx1ZSwnYmFyJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0VEFOVExSU3RyaW5nLlNldFVwOworYmVnaW4KKyAgRkFOVExSU3RyaW5nIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoJ2ZvbycpOworZW5kOworCitwcm9jZWR1cmUgVGVzdFRBTlRMUlN0cmluZy5UZWFyRG93bjsKK2JlZ2luCisgIEZBTlRMUlN0cmluZy5GcmVlOworICBGQU5UTFJTdHJpbmcgOj0gbmlsOworZW5kOworCitwcm9jZWR1cmUgVGVzdFRBTlRMUlN0cmluZy5UZXN0VG9TdHJpbmc7Cit2YXIKKyAgUmV0dXJuVmFsdWU6IHN0cmluZzsKK2JlZ2luCisgIFJldHVyblZhbHVlIDo9IEZBTlRMUlN0cmluZy5Ub1N0cmluZzsKKyAgQ2hlY2tFcXVhbHMoUmV0dXJuVmFsdWUsJ2ZvbycpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDbG9uZWFibGUuU2V0VXA7Cit2YXIKKyAgRm9vOiBJRm9vOworYmVnaW4KKyAgRm9vIDo9IFRGb28uQ3JlYXRlOworICBGb28uVmFsdWUgOj0gJ29yaWdpbmFsJzsKKyAgRklDbG9uZWFibGUgOj0gRm9vIGFzIElDbG9uZWFibGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNsb25lYWJsZS5UZWFyRG93bjsKK2JlZ2luCisgIEZJQ2xvbmVhYmxlIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ2xvbmVhYmxlLlRlc3RDbG9uZTsKK3ZhcgorICBSZXR1cm5WYWx1ZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmV0dXJuVmFsdWUgOj0gRklDbG9uZWFibGUuQ2xvbmU7CisgIENoZWNrKFN1cHBvcnRzKFJldHVyblZhbHVlLCBJRm9vKSk7CisgIENoZWNrRXF1YWxzKChSZXR1cm5WYWx1ZSBhcyBJRm9vKS5WYWx1ZSwoRklDbG9uZWFibGUgYXMgSUZvbykuVmFsdWUpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlNldFVwOworYmVnaW4KKyAgRklMaXN0IDo9IFRMaXN0PEludGVnZXI+LkNyZWF0ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJTGlzdC5UZWFyRG93bjsKK2JlZ2luCisgIEZJTGlzdCA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdEdldENhcGFjaXR5OwordmFyCisgIFJldHVyblZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgRklMaXN0LkNhcGFjaXR5IDo9IDEwMDsKKyAgUmV0dXJuVmFsdWUgOj0gRklMaXN0LkdldENhcGFjaXR5OworICBDaGVja0VxdWFscyhSZXR1cm5WYWx1ZSwxMDApOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlRlc3RTZXRDYXBhY2l0eTsKK3ZhcgorICBWYWx1ZTogSW50ZWdlcjsKK2JlZ2luCisgIFZhbHVlIDo9IDEwMDsKKyAgRklMaXN0LlNldENhcGFjaXR5KFZhbHVlKTsKKyAgQ2hlY2tFcXVhbHMoRklMaXN0LkNhcGFjaXR5LDEwMCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdEdldENvdW50OwordmFyCisgIFJldHVyblZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgRklMaXN0LkNsZWFyOworICBGSUxpc3QuQWRkKDEyMyk7CisgIFJldHVyblZhbHVlIDo9IEZJTGlzdC5HZXRDb3VudDsKKyAgQ2hlY2tFcXVhbHMoUmV0dXJuVmFsdWUsMSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdFNldENvdW50OwordmFyCisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgVmFsdWUgOj0gNDsKKyAgRklMaXN0LlNldENvdW50KFZhbHVlKTsKKyAgQ2hlY2tFcXVhbHMoRklMaXN0LkNvdW50LDQpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlRlc3RHZXRJdGVtOwordmFyCisgIFJldHVyblZhbHVlOiBJbnRlZ2VyOworICBJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIEZJTGlzdC5DbGVhcjsKKyAgRklMaXN0LkFkZCgxMDApOworICBGSUxpc3QuQWRkKDIwMCk7CisgIEZJTGlzdC5BZGQoMzAwKTsKKyAgRklMaXN0LkFkZCg0MDApOworICBJbmRleCA6PSAyOworICBSZXR1cm5WYWx1ZSA6PSBGSUxpc3QuR2V0SXRlbShJbmRleCk7CisgIENoZWNrRXF1YWxzKFJldHVyblZhbHVlLDMwMCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdFNldEl0ZW07Cit2YXIKKyAgVmFsdWU6IEludGVnZXI7CisgIEluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgRklMaXN0LkNsZWFyOworICBGSUxpc3QuQWRkKDEwMCk7CisgIEZJTGlzdC5BZGQoMjAwKTsKKyAgRklMaXN0LkFkZCgzMDApOworICBGSUxpc3QuQWRkKDQwMCk7CisgIEluZGV4IDo9IDM7CisgIFZhbHVlIDo9IDMzMzsKKyAgRklMaXN0LlNldEl0ZW0oSW5kZXgsIFZhbHVlKTsKKyAgQ2hlY2tFcXVhbHMoRklMaXN0Lkl0ZW1zWzNdLDMzMyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdEFkZDsKK3ZhcgorICBSZXR1cm5WYWx1ZTogSW50ZWdlcjsKKyAgVmFsdWU6IEludGVnZXI7CitiZWdpbgorICBGSUxpc3QuQ2xlYXI7CisgIFZhbHVlIDo9IDM7CisgIFJldHVyblZhbHVlIDo9IEZJTGlzdC5BZGQoVmFsdWUpOworICBDaGVja0VxdWFscyhSZXR1cm5WYWx1ZSwwKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJTGlzdC5UZXN0QWRkUmFuZ2U7Cit2YXIKKyAgVmFsdWVzOiBhcnJheSBbMC4uM10gb2YgSW50ZWdlcjsKK2JlZ2luCisgIEZJTGlzdC5DbGVhcjsKKyAgVmFsdWVzWzBdIDo9IDExMTsKKyAgVmFsdWVzWzFdIDo9IDIyMjsKKyAgVmFsdWVzWzJdIDo9IDMzMzsKKyAgVmFsdWVzWzNdIDo9IDQ0NDsKKyAgRklMaXN0LkFkZFJhbmdlKFZhbHVlcyk7CisgIENoZWNrRXF1YWxzKEZJTGlzdFswXSwxMTEpOworICBDaGVja0VxdWFscyhGSUxpc3RbMV0sMjIyKTsKKyAgQ2hlY2tFcXVhbHMoRklMaXN0WzJdLDMzMyk7CisgIENoZWNrRXF1YWxzKEZJTGlzdFszXSw0NDQpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlRlc3RJbnNlcnQ7Cit2YXIKKyAgVmFsdWU6IEludGVnZXI7CisgIEluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgRklMaXN0LkNsZWFyOworICBGSUxpc3QuQWRkKDEwMCk7CisgIEZJTGlzdC5BZGQoMjAwKTsKKyAgRklMaXN0LkFkZCgzMDApOworICBGSUxpc3QuQWRkKDQwMCk7CisgIEluZGV4IDo9IDI7CisgIFZhbHVlIDo9IDI1MDsKKyAgRklMaXN0Lkluc2VydChJbmRleCwgVmFsdWUpOworICBDaGVja0VxdWFscyhGSUxpc3RbMV0sMjAwKTsKKyAgQ2hlY2tFcXVhbHMoRklMaXN0WzJdLDI1MCk7CisgIENoZWNrRXF1YWxzKEZJTGlzdFszXSwzMDApOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlRlc3RSZW1vdmU7Cit2YXIKKyAgUmV0dXJuVmFsdWU6IEludGVnZXI7CisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgRklMaXN0LkNsZWFyOworICBGSUxpc3QuQWRkKDEwMCk7CisgIEZJTGlzdC5BZGQoMjAwKTsKKyAgRklMaXN0LkFkZCgzMDApOworICBGSUxpc3QuQWRkKDQwMCk7CisgIFZhbHVlIDo9IDMwMDsKKyAgUmV0dXJuVmFsdWUgOj0gRklMaXN0LlJlbW92ZShWYWx1ZSk7CisgIENoZWNrRXF1YWxzKFJldHVyblZhbHVlLDIpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlRlc3REZWxldGU7Cit2YXIKKyAgSW5kZXg6IEludGVnZXI7CitiZWdpbgorICBGSUxpc3QuQ2xlYXI7CisgIEZJTGlzdC5BZGQoMTAwKTsKKyAgRklMaXN0LkFkZCgyMDApOworICBGSUxpc3QuQWRkKDMwMCk7CisgIEZJTGlzdC5BZGQoNDAwKTsKKyAgSW5kZXggOj0gMjsKKyAgRklMaXN0LkRlbGV0ZShJbmRleCk7CisgIENoZWNrRXF1YWxzKEZJTGlzdFsyXSw0MDApOworZW5kOworCitwcm9jZWR1cmUgVGVzdElMaXN0LlRlc3REZWxldGVSYW5nZTsKK3ZhcgorICBBQ291bnQ6IEludGVnZXI7CisgIEFJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIEZJTGlzdC5DbGVhcjsKKyAgRklMaXN0LkFkZCgxMDApOworICBGSUxpc3QuQWRkKDIwMCk7CisgIEZJTGlzdC5BZGQoMzAwKTsKKyAgRklMaXN0LkFkZCg0MDApOworICBBSW5kZXggOj0gMTsKKyAgQUNvdW50IDo9IDI7CisgIEZJTGlzdC5EZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudCk7CisgIENoZWNrRXF1YWxzKEZJbGlzdFswXSwxMDApOworICBDaGVja0VxdWFscyhGSWxpc3RbMV0sNDAwKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJTGlzdC5UZXN0Q2xlYXI7CitiZWdpbgorICBGSUxpc3QuQ2xlYXI7CisgIEZJTGlzdC5BZGQoMTAwKTsKKyAgRklMaXN0LkFkZCgyMDApOworICBGSUxpc3QuQWRkKDMwMCk7CisgIEZJTGlzdC5BZGQoNDAwKTsKKyAgRklMaXN0LkNsZWFyOworICBDaGVja0VxdWFscyhGSUxpc3QuQ291bnQsMCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdENvbnRhaW5zOwordmFyCisgIFJldHVyblZhbHVlOiBCb29sZWFuOworICBWYWx1ZTogSW50ZWdlcjsKK2JlZ2luCisgIEZJTGlzdC5DbGVhcjsKKyAgRklMaXN0LkFkZCgxMDApOworICBGSUxpc3QuQWRkKDIwMCk7CisgIEZJTGlzdC5BZGQoMzAwKTsKKyAgRklMaXN0LkFkZCg0MDApOworICBWYWx1ZSA6PSAyMDA7CisgIFJldHVyblZhbHVlIDo9IEZJTGlzdC5Db250YWlucyhWYWx1ZSk7CisgIENoZWNrVHJ1ZShSZXR1cm5WYWx1ZSk7CisgIFZhbHVlIDo9IDI1MDsKKyAgUmV0dXJuVmFsdWUgOj0gRklMaXN0LkNvbnRhaW5zKFZhbHVlKTsKKyAgQ2hlY2tGYWxzZShSZXR1cm5WYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUxpc3QuVGVzdEluZGV4T2Y7Cit2YXIKKyAgUmV0dXJuVmFsdWU6IEludGVnZXI7CisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgRklMaXN0LkNsZWFyOworICBGSUxpc3QuQWRkKDEwMCk7CisgIEZJTGlzdC5BZGQoMjAwKTsKKyAgRklMaXN0LkFkZCgzMDApOworICBGSUxpc3QuQWRkKDQwMCk7CisgIFZhbHVlIDo9IDMwMDsKKyAgUmV0dXJuVmFsdWUgOj0gRklMaXN0LkluZGV4T2YoVmFsdWUpOworICBDaGVja0VxdWFscyhSZXR1cm5WYWx1ZSwyKTsKKyAgVmFsdWUgOj0gMzAxOworICBSZXR1cm5WYWx1ZSA6PSBGSUxpc3QuSW5kZXhPZihWYWx1ZSk7CisgIENoZWNrRXF1YWxzKFJldHVyblZhbHVlLC0xKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJRGljdGlvbmFyeS5TZXRVcDsKK2JlZ2luCisgIEZJRGljdGlvbmFyeSA6PSBURGljdGlvbmFyeTxTdHJpbmcsIEludGVnZXI+LkNyZWF0ZTsKKyAgRklEaWN0aW9uYXJ5LkFkZCgnRm9vJywxKTsKKyAgRklEaWN0aW9uYXJ5LkFkZCgnQmFyJywzKTsKKyAgRklEaWN0aW9uYXJ5LkFkZCgnQmF6Jyw3KTsKKyAgRklEaWN0aW9uYXJ5LkFkZCgnWmlwJyw3KTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJRGljdGlvbmFyeS5UZWFyRG93bjsKK2JlZ2luCisgIEZJRGljdGlvbmFyeSA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SURpY3Rpb25hcnkuVGVzdEdldEl0ZW07Cit2YXIKKyAgUmV0dXJuVmFsdWU6IEludGVnZXI7CisgIEtleTogU3RyaW5nOworYmVnaW4KKyAgS2V5IDo9ICdCYXonOworICBSZXR1cm5WYWx1ZSA6PSBGSURpY3Rpb25hcnkuR2V0SXRlbShLZXkpOworICBDaGVja0VxdWFscyhSZXR1cm5WYWx1ZSw3KTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJRGljdGlvbmFyeS5UZXN0U2V0SXRlbTsKK3ZhcgorICBWYWx1ZTogSW50ZWdlcjsKKyAgS2V5OiBTdHJpbmc7CitiZWdpbgorICBLZXkgOj0gJ0Jhcic7CisgIFZhbHVlIDo9IDIwOworICBGSURpY3Rpb25hcnkuU2V0SXRlbShLZXksIFZhbHVlKTsKKyAgQ2hlY2tFcXVhbHMoRklEaWN0aW9uYXJ5WydCYXInXSwyMCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SURpY3Rpb25hcnkuVGVzdEdldENvdW50OwordmFyCisgIFJldHVyblZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgUmV0dXJuVmFsdWUgOj0gRklEaWN0aW9uYXJ5LkdldENvdW50OworICBDaGVja0VxdWFscyhSZXR1cm5WYWx1ZSw0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJRGljdGlvbmFyeS5UZXN0QWRkOwordmFyCisgIFZhbHVlOiBJbnRlZ2VyOworICBLZXk6IFN0cmluZzsKK2JlZ2luCisgIEtleSA6PSAnS2V5JzsKKyAgVmFsdWUgOj0gLTE7CisgIEZJRGljdGlvbmFyeS5BZGQoS2V5LCBWYWx1ZSk7CisgIENoZWNrRXF1YWxzKEZJRGljdGlvbmFyeVsnS2V5J10sLTEpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElEaWN0aW9uYXJ5LlRlc3RSZW1vdmU7Cit2YXIKKyAgS2V5OiBTdHJpbmc7CitiZWdpbgorICBLZXkgOj0gJ0Jhcic7CisgIEZJRGljdGlvbmFyeS5SZW1vdmUoS2V5KTsKKyAgQ2hlY2tFcXVhbHMoRklEaWN0aW9uYXJ5LkNvdW50LDMpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElEaWN0aW9uYXJ5LlRlc3RUcnlHZXRWYWx1ZTsKK3ZhcgorICBSZXR1cm5WYWx1ZTogQm9vbGVhbjsKKyAgVmFsdWU6IEludGVnZXI7CisgIEtleTogU3RyaW5nOworYmVnaW4KKyAgS2V5IDo9ICdaaXAnOworICBSZXR1cm5WYWx1ZSA6PSBGSURpY3Rpb25hcnkuVHJ5R2V0VmFsdWUoS2V5LCBWYWx1ZSk7CisgIENoZWNrVHJ1ZShSZXR1cm5WYWx1ZSk7CisgIENoZWNrRXF1YWxzKFZhbHVlLDcpOworCisgIEtleSA6PSAnT29wcyc7CisgIFJldHVyblZhbHVlIDo9IEZJRGljdGlvbmFyeS5UcnlHZXRWYWx1ZShLZXksIFZhbHVlKTsKKyAgQ2hlY2tGYWxzZShSZXR1cm5WYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SURpY3Rpb25hcnkuVGVzdENvbnRhaW5zS2V5OwordmFyCisgIFJldHVyblZhbHVlOiBCb29sZWFuOworICBLZXk6IFN0cmluZzsKK2JlZ2luCisgIEtleSA6PSAnRm9vJzsKKyAgUmV0dXJuVmFsdWUgOj0gRklEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KEtleSk7CisgIENoZWNrVHJ1ZShSZXR1cm5WYWx1ZSk7CisKKyAgS2V5IDo9ICdmb28nOworICBSZXR1cm5WYWx1ZSA6PSBGSURpY3Rpb25hcnkuQ29udGFpbnNLZXkoS2V5KTsKKyAgQ2hlY2tGYWxzZShSZXR1cm5WYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SURpY3Rpb25hcnkuVGVzdENvbnRhaW5zVmFsdWU7Cit2YXIKKyAgUmV0dXJuVmFsdWU6IEJvb2xlYW47CisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgVmFsdWUgOj0gMzsKKyAgUmV0dXJuVmFsdWUgOj0gRklEaWN0aW9uYXJ5LkNvbnRhaW5zVmFsdWUoVmFsdWUpOworICBDaGVja1RydWUoUmV0dXJuVmFsdWUpOworCisgIFZhbHVlIDo9IDI7CisgIFJldHVyblZhbHVlIDo9IEZJRGljdGlvbmFyeS5Db250YWluc1ZhbHVlKFZhbHVlKTsKKyAgQ2hlY2tGYWxzZShSZXR1cm5WYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SURpY3Rpb25hcnkuVGVzdEVudW1lcmF0aW9uOwordmFyCisgIFBhaXI6IFRQYWlyPFN0cmluZywgSW50ZWdlcj47CisgIEZvbywgQmFyLCBCYXosIFppcDogQm9vbGVhbjsKK2JlZ2luCisgIEZvbyA6PSBGYWxzZTsKKyAgQmFyIDo9IEZhbHNlOworICBCYXogOj0gRmFsc2U7CisgIFppcCA6PSBGYWxzZTsKKworICBmb3IgUGFpciBpbiBGSURpY3Rpb25hcnkgZG8KKyAgYmVnaW4KKyAgICBpZiAoUGFpci5LZXkgPSAnRm9vJykgdGhlbgorICAgIGJlZ2luCisgICAgICBGb28gOj0gVHJ1ZTsKKyAgICAgIENoZWNrRXF1YWxzKFBhaXIuVmFsdWUsIDEpOworICAgIGVuZAorICAgIGVsc2UKKyAgICBpZiAoUGFpci5LZXkgPSAnQmFyJykgdGhlbgorICAgIGJlZ2luCisgICAgICBCYXIgOj0gVHJ1ZTsKKyAgICAgIENoZWNrRXF1YWxzKFBhaXIuVmFsdWUsIDMpOworICAgIGVuZAorICAgIGVsc2UKKyAgICBpZiAoUGFpci5LZXkgPSAnQmF6JykgdGhlbgorICAgIGJlZ2luCisgICAgICBCYXogOj0gVHJ1ZTsKKyAgICAgIENoZWNrRXF1YWxzKFBhaXIuVmFsdWUsIDcpOworICAgIGVuZAorICAgIGVsc2UKKyAgICBpZiAoUGFpci5LZXkgPSAnWmlwJykgdGhlbgorICAgIGJlZ2luCisgICAgICBaaXAgOj0gVHJ1ZTsKKyAgICAgIENoZWNrRXF1YWxzKFBhaXIuVmFsdWUsIDcpOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIENoZWNrKEZhbHNlLCAnVW5rbm93biBrZXkgaW4gZGljdGlvbmFyeScpOworICBlbmQ7CisgIENoZWNrVHJ1ZShGb28pOworICBDaGVja1RydWUoQmFyKTsKKyAgQ2hlY2tUcnVlKEJheik7CisgIENoZWNrVHJ1ZShaaXApOworZW5kOworCit7IFRlc3RUTG9jYWxTdG9yYWdlIH0KKworcHJvY2VkdXJlIFRlc3RUTG9jYWxTdG9yYWdlLlRlc3RMb2NhbEludGVnZXJTdG9yYWdlOwordmFyCisgIExvY2FsczogVExvY2FsU3RvcmFnZTsKK2JlZ2luCisgIExvY2Fscy5Jbml0aWFsaXplOworICB0cnkKKyAgICBMb2NhbHMuQXNJbnRlZ2VyWyd4J10gOj0gMjsKKyAgICBMb2NhbHMuQXNJbnRlZ2VyWydYJ10gOj0gMzsKKyAgICBDaGVja0VxdWFscygyLCBMb2NhbHMuQXNJbnRlZ2VyWyd4J10pOworICAgIENoZWNrRXF1YWxzKDMsIExvY2Fscy5Bc0ludGVnZXJbJ1gnXSk7CisgICAgQ2hlY2tFcXVhbHMoMCwgTG9jYWxzLkFzSW50ZWdlclsneSddKTsKKyAgICBMb2NhbHMuQXNJbnRlZ2VyWydYJ10gOj0gTG9jYWxzLkFzSW50ZWdlclsneCddICogMjsKKyAgICBDaGVja0VxdWFscyg0LCBMb2NhbHMuQXNJbnRlZ2VyWydYJ10pOworICAgIENoZWNrRXF1YWxzKDIsIExvY2Fscy5Db3VudCk7CisgIGZpbmFsbHkKKyAgICBMb2NhbHMuRmluYWxpemU7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RUTG9jYWxTdG9yYWdlLlRlc3RMb2NhbEludGVyZmFjZVN0b3JhZ2U7Cit2YXIKKyAgTG9jYWxzOiBUTG9jYWxTdG9yYWdlOworYmVnaW4KKyAgTG9jYWxzLkluaXRpYWxpemU7CisgIHRyeQorICAgIHsgTG9jYWwgdmFyaWFibGUgWiBpcyBuZXZlciBhY2Nlc3NlZCBhZ2Fpbi4gV2UgYWRkIGl0IHRvIGNoZWNrIHRoYXQgdGhlcmUKKyAgICAgIHdpbGwgYmUgbm8gbWVtb3J5IGxlYWsuIH0KKyAgICBMb2NhbHNbJ1onXSA6PSBUQU5UTFJTdHJpbmcuQ3JlYXRlKCdWYWx1ZSBaJyk7CisKKyAgICBMb2NhbHNbJ3gnXSA6PSBUQU5UTFJTdHJpbmcuQ3JlYXRlKCdWYWx1ZSB4Jyk7CisgICAgTG9jYWxzWydYJ10gOj0gVEFOVExSU3RyaW5nLkNyZWF0ZSgnVmFsdWUgWCcpOworICAgIENoZWNrRXF1YWxzKCdWYWx1ZSB4JywgKExvY2Fsc1sneCddIGFzIElBTlRMUlN0cmluZykuVmFsdWUpOworICAgIENoZWNrRXF1YWxzKCdWYWx1ZSBYJywgKExvY2Fsc1snWCddIGFzIElBTlRMUlN0cmluZykuVmFsdWUpOworICAgIENoZWNrKExvY2Fsc1sneSddID0gbmlsKTsKKworICAgIExvY2Fsc1snWCddIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoCisgICAgICAoTG9jYWxzWydYJ10gYXMgSUFOVExSU3RyaW5nKS5WYWx1ZSArICcgVXBkYXRlJyk7CisgICAgQ2hlY2tFcXVhbHMoJ1ZhbHVlIFggVXBkYXRlJywgKExvY2Fsc1snWCddIGFzIElBTlRMUlN0cmluZykuVmFsdWUpOworICAgIENoZWNrRXF1YWxzKDMsIExvY2Fscy5Db3VudCk7CisgIGZpbmFsbHkKKyAgICBMb2NhbHMuRmluYWxpemU7CisgIGVuZDsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KKyAgLy8gUmVnaXN0ZXIgYW55IHRlc3QgY2FzZXMgd2l0aCB0aGUgdGVzdCBydW5uZXIKKyAgUmVnaXN0ZXJUZXN0KFRlc3RJQU5UTFJTdHJpbmcuU3VpdGUpOworICBSZWdpc3RlclRlc3QoVGVzdFRBTlRMUlN0cmluZy5TdWl0ZSk7CisgIFJlZ2lzdGVyVGVzdChUZXN0SUNsb25lYWJsZS5TdWl0ZSk7CisgIFJlZ2lzdGVyVGVzdChUZXN0SUxpc3QuU3VpdGUpOworICBSZWdpc3RlclRlc3QoVGVzdElEaWN0aW9uYXJ5LlN1aXRlKTsKKyAgUmVnaXN0ZXJUZXN0KFRlc3RUTG9jYWxTdG9yYWdlLlN1aXRlKTsKK2VuZC4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL0FudGxyLlJ1bnRpbWUuVHJlZS5UZXN0cy5wYXMgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BbnRsci5SdW50aW1lLlRyZWUuVGVzdHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWJhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9BbnRsci5SdW50aW1lLlRyZWUuVGVzdHMucGFzCkBAIC0wLDAgKzEsMjEzNiBAQAordW5pdCBBbnRsci5SdW50aW1lLlRyZWUuVGVzdHM7Cit7CisKKyAgRGVscGhpIERVbml0IFRlc3QgQ2FzZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRoaXMgdW5pdCBjb250YWlucyBhIHNrZWxldG9uIHRlc3QgY2FzZSBjbGFzcyBnZW5lcmF0ZWQgYnkgdGhlIFRlc3QgQ2FzZSBXaXphcmQuCisgIE1vZGlmeSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gY29ycmVjdGx5IHNldHVwIGFuZCBjYWxsIHRoZSBtZXRob2RzIGZyb20gdGhlIHVuaXQKKyAgYmVpbmcgdGVzdGVkLgorCit9CisKK2ludGVyZmFjZQorCit1c2VzCisgIFRlc3RGcmFtZXdvcmssCisgIEFudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMsCisgIEFudGxyLlJ1bnRpbWUuVHJlZSwKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIEFudGxyLlJ1bnRpbWUsCisgIEFudGxyLlJ1bnRpbWUuVG9vbHM7CisKK3R5cGUKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBJQ29tbW9uVHJlZQorICBUZXN0SUNvbW1vblRyZWUgPSBjbGFzcyhUVGVzdENhc2UpCisgIHB1YmxpYworICAgIHByb2NlZHVyZSBTZXRVcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFRlYXJEb3duOyBvdmVycmlkZTsKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RTaW5nbGVOb2RlOworICAgIHByb2NlZHVyZSBUZXN0NE5vZGVzOworICAgIHByb2NlZHVyZSBUZXN0TGlzdDsKKyAgICBwcm9jZWR1cmUgVGVzdExpc3QyOworICAgIHByb2NlZHVyZSBUZXN0QWRkTGlzdFRvRXhpc3RDaGlsZHJlbjsKKyAgICBwcm9jZWR1cmUgVGVzdER1cFRyZWU7CisgICAgcHJvY2VkdXJlIFRlc3RCZWNvbWVSb290OworICAgIHByb2NlZHVyZSBUZXN0QmVjb21lUm9vdDI7CisgICAgcHJvY2VkdXJlIFRlc3RCZWNvbWVSb290MzsKKyAgICBwcm9jZWR1cmUgVGVzdEJlY29tZVJvb3Q1OworICAgIHByb2NlZHVyZSBUZXN0QmVjb21lUm9vdDY7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBsYWNlV2l0aE5vQ2hpbGRyZW47CisgICAgcHJvY2VkdXJlIFRlc3RSZXBsYWNlV2l0aE9uZUNoaWxkcmVuOworICAgIHByb2NlZHVyZSBUZXN0UmVwbGFjZUluTWlkZGxlOworICAgIHByb2NlZHVyZSBUZXN0UmVwbGFjZUF0TGVmdDsKKyAgICBwcm9jZWR1cmUgVGVzdFJlcGxhY2VBdFJpZ2h0OworICAgIHByb2NlZHVyZSBUZXN0UmVwbGFjZU9uZVdpdGhUd29BdExlZnQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBsYWNlT25lV2l0aFR3b0F0UmlnaHQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBsYWNlT25lV2l0aFR3b0luTWlkZGxlOworICAgIHByb2NlZHVyZSBUZXN0UmVwbGFjZVR3b1dpdGhPbmVBdExlZnQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBsYWNlVHdvV2l0aE9uZUF0UmlnaHQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBsYWNlQWxsV2l0aE9uZTsKKyAgICBwcm9jZWR1cmUgVGVzdFJlcGxhY2VBbGxXaXRoVHdvOworICBlbmQ7CisKKyAgLy8gVGVzdCBtZXRob2RzIGZvciBjbGFzcyBJQ29tbW9uVHJlZU5vZGVTdHJlYW0KKyAgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbSA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIENyZWF0ZUNvbW1vblRyZWVOb2RlU3RyZWFtKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IElUcmVlTm9kZVN0cmVhbTsKKyAgICBmdW5jdGlvbiBHZXRTdHJpbmdPZkVudGlyZVN0cmVhbUNvbnRlbnRzV2l0aE5vZGVUeXBlc09ubHkoCisgICAgICBjb25zdCBOb2RlczogSVRyZWVOb2RlU3RyZWFtKTogU3RyaW5nOworICAgIGZ1bmN0aW9uIENyZWF0ZVVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJVHJlZU5vZGVTdHJlYW07CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBTZXRVcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFRlYXJEb3duOyBvdmVycmlkZTsKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RTaW5nbGVOb2RlOworICAgIHByb2NlZHVyZSBUZXN0NE5vZGVzOworICAgIHByb2NlZHVyZSBUZXN0TGlzdDsKKyAgICBwcm9jZWR1cmUgVGVzdEZsYXRMaXN0OworICAgIHByb2NlZHVyZSBUZXN0TGlzdFdpdGhPbmVOb2RlOworICAgIHByb2NlZHVyZSBUZXN0QW92ZXJCOworICAgIHByb2NlZHVyZSBUZXN0TFQ7CisgICAgcHJvY2VkdXJlIFRlc3RNYXJrUmV3aW5kRW50aXJlOworICAgIHByb2NlZHVyZSBUZXN0TWFya1Jld2luZEluTWlkZGxlOworICAgIHByb2NlZHVyZSBUZXN0TWFya1Jld2luZE5lc3RlZDsKKyAgICBwcm9jZWR1cmUgVGVzdFNlZWs7CisgICAgcHJvY2VkdXJlIFRlc3RTZWVrRnJvbVN0YXJ0OworICAgIHByb2NlZHVyZSBUZXN0UHVzaFBvcDsKKyAgICBwcm9jZWR1cmUgVGVzdE5lc3RlZFB1c2hQb3A7CisgICAgcHJvY2VkdXJlIFRlc3RQdXNoUG9wRnJvbUVPRjsKKyAgICBwcm9jZWR1cmUgVGVzdFN0YWNrU3RyZXRjaDsKKyAgICBwcm9jZWR1cmUgVGVzdEJ1ZmZlck92ZXJmbG93OworICAgIHByb2NlZHVyZSBUZXN0QnVmZmVyV3JhcDsKKyAgZW5kOworCisgIC8vIFRlc3QgbWV0aG9kcyBmb3IgY2xhc3MgSVJld3JpdGVSdWxlWHh4eFN0cmVhbQorICBUZXN0SVJld3JpdGVSdWxlWHh4eFN0cmVhbSA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBmdW5jdGlvbiBDcmVhdGVUcmVlQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICAgIGZ1bmN0aW9uIENyZWF0ZVRyZWUoY29uc3QgVG9rZW46IElUb2tlbik6IElUcmVlOworICAgIGZ1bmN0aW9uIENyZWF0ZVRva2VuKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTogSVRva2VuOworICAgIGZ1bmN0aW9uIENyZWF0ZVRva2VuTGlzdChjb25zdCBDb3VudDogSW50ZWdlcik6IElMaXN0PElUb2tlbj47CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBTZXRVcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFRlYXJEb3duOyBvdmVycmlkZTsKKyAgcHVibGlzaGVkCisgICAgcHJvY2VkdXJlIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtQ29uc3RydWN0b3JzOworICAgIHByb2NlZHVyZSBUZXN0UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtQ29uc3RydWN0b3JzOworICAgIHByb2NlZHVyZSBUZXN0UmV3cml0ZVJ1bGVOb2RlU3RyZWFtQ29uc3RydWN0b3JzOworCisgICAgcHJvY2VkdXJlIFRlc3RSUlRva2VuU3RyZWFtQmVoYXZpb3VyV2hpbGVFbXB0eTE7CisgICAgcHJvY2VkdXJlIFRlc3RSUlN1YnRyZWVTdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MTsKKyAgICBwcm9jZWR1cmUgVGVzdFJSTm9kZVN0cmVhbUJlaGF2aW91cldoaWxlRW1wdHkxOworCisgICAgcHJvY2VkdXJlIFRlc3RSUlRva2VuU3RyZWFtQmVoYXZpb3VyV2hpbGVFbXB0eTI7CisgICAgcHJvY2VkdXJlIFRlc3RSUlN1YnRyZWVTdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MjsKKyAgICBwcm9jZWR1cmUgVGVzdFJSTm9kZVN0cmVhbUJlaGF2aW91cldoaWxlRW1wdHkyOworCisgICAgcHJvY2VkdXJlIFRlc3RSUlRva2VuU3RyZWFtQmVoYXZpb3VyV2hpbGVFbXB0eTM7CisKKyAgICBwcm9jZWR1cmUgVGVzdFJSVG9rZW5TdHJlYW1CZWhhdmlvdXJXaXRoRWxlbWVudHM7CisgICAgcHJvY2VkdXJlIFRlc3RSUlN1YnRyZWVTdHJlYW1CZWhhdmlvdXJXaXRoRWxlbWVudHM7CisgICAgcHJvY2VkdXJlIFRlc3RSUk5vZGVTdHJlYW1CZWhhdmlvdXJXaXRoRWxlbWVudHM7CisgIGVuZDsKKworICAvLyBUZXN0IG1ldGhvZHMgZm9yIGNsYXNzIElUcmVlV2l6YXJkCisgIFRlc3RJVHJlZVdpemFyZCA9IGNsYXNzKFRUZXN0Q2FzZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGVG9rZW5zOiBUU3RyaW5nQXJyYXk7CisgIHN0cmljdCBwcml2YXRlCisgICAgdHlwZQorICAgICAgVFJlY29yZEFsbEVsZW1lbnRzVmlzaXRvciA9IGNsYXNzIHNlYWxlZChUVHJlZVdpemFyZC5UVmlzaXRvcikKKyAgICAgIHN0cmljdCBwcml2YXRlCisgICAgICAgIEZMaXN0OiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworICAgICAgc3RyaWN0IHByb3RlY3RlZAorICAgICAgICBwcm9jZWR1cmUgVmlzaXQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcnJpZGU7CisgICAgICBwdWJsaWMKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFMaXN0OiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+KTsKKyAgICAgIGVuZDsKKworICAgICAgVFRlc3QxQ29udGV4dFZpc2l0b3IgPSBjbGFzcyBzZWFsZWQoVEFOVExST2JqZWN0LCBJQ29udGV4dFZpc2l0b3IpCisgICAgICBzdHJpY3QgcHJpdmF0ZQorICAgICAgICBGQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICAgICAgICBGTGlzdDogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsKKyAgICAgIHByb3RlY3RlZAorICAgICAgICB7IElDb250ZXh0VmlzaXRvciB9CisgICAgICAgIHByb2NlZHVyZSBWaXNpdChjb25zdCBULCBQYXJlbnQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgQ2hpbGRJbmRleDogSW50ZWdlcjsKKyAgICAgICAgICBjb25zdCBMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPik7CisgICAgICBwdWJsaWMKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgICAgICAgY29uc3QgQUxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT4pOworICAgICAgZW5kOworCisgICAgICBUVGVzdDJDb250ZXh0VmlzaXRvciA9IGNsYXNzIHNlYWxlZChUQU5UTFJPYmplY3QsIElDb250ZXh0VmlzaXRvcikKKyAgICAgIHN0cmljdCBwcml2YXRlCisgICAgICAgIEZBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgICAgIEZMaXN0OiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworICAgICAgcHJvdGVjdGVkCisgICAgICAgIHsgSUNvbnRleHRWaXNpdG9yIH0KKyAgICAgICAgcHJvY2VkdXJlIFZpc2l0KGNvbnN0IFQsIFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBDaGlsZEluZGV4OiBJbnRlZ2VyOworICAgICAgICAgIGNvbnN0IExhYmVsczogSURpY3Rpb25hcnk8U3RyaW5nLCBJQU5UTFJJbnRlcmZhY2U+KTsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgICAgICAgICBjb25zdCBBTGlzdDogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPik7CisgICAgICBlbmQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShNZXRob2ROYW1lOiBTdHJpbmcpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0VXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBUZWFyRG93bjsgb3ZlcnJpZGU7CisgIHB1Ymxpc2hlZAorICAgIHByb2NlZHVyZSBUZXN0U2luZ2xlTm9kZTsKKyAgICBwcm9jZWR1cmUgVGVzdFNpbmdsZU5vZGVXaXRoQXJnOworICAgIHByb2NlZHVyZSBUZXN0U2luZ2xlTm9kZVRyZWU7CisgICAgcHJvY2VkdXJlIFRlc3RTaW5nbGVMZXZlbFRyZWU7CisgICAgcHJvY2VkdXJlIFRlc3RMaXN0VHJlZTsKKyAgICBwcm9jZWR1cmUgVGVzdEludmFsaWRMaXN0VHJlZTsKKyAgICBwcm9jZWR1cmUgVGVzdERvdWJsZUxldmVsVHJlZTsKKyAgICBwcm9jZWR1cmUgVGVzdFNpbmdsZU5vZGVJbmRleDsKKyAgICBwcm9jZWR1cmUgVGVzdE5vUmVwZWF0c0luZGV4OworICAgIHByb2NlZHVyZSBUZXN0UmVwZWF0c0luZGV4OworICAgIHByb2NlZHVyZSBUZXN0Tm9SZXBlYXRzVmlzaXQ7CisgICAgcHJvY2VkdXJlIFRlc3ROb1JlcGVhdHNWaXNpdDI7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBlYXRzVmlzaXQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBlYXRzVmlzaXQyOworICAgIHByb2NlZHVyZSBUZXN0UmVwZWF0c1Zpc2l0V2l0aENvbnRleHQ7CisgICAgcHJvY2VkdXJlIFRlc3RSZXBlYXRzVmlzaXRXaXRoTnVsbFBhcmVudEFuZENvbnRleHQ7CisgICAgcHJvY2VkdXJlIFRlc3RWaXNpdFBhdHRlcm47CisgICAgcHJvY2VkdXJlIFRlc3RWaXNpdFBhdHRlcm5NdWx0aXBsZTsKKyAgICBwcm9jZWR1cmUgVGVzdFZpc2l0UGF0dGVybk11bHRpcGxlV2l0aExhYmVsczsKKyAgICBwcm9jZWR1cmUgVGVzdFBhcnNlOworICAgIHByb2NlZHVyZSBUZXN0UGFyc2VTaW5nbGVOb2RlOworICAgIHByb2NlZHVyZSBUZXN0UGFyc2VGbGF0VHJlZTsKKyAgICBwcm9jZWR1cmUgVGVzdFdpbGRjYXJkOworICAgIHByb2NlZHVyZSBUZXN0UGFyc2VXaXRoVGV4dDsKKyAgICBwcm9jZWR1cmUgVGVzdFBhcnNlV2l0aFRleHRGYWlsczsKKyAgICBwcm9jZWR1cmUgVGVzdFBhcnNlTGFiZWxzOworICAgIHByb2NlZHVyZSBUZXN0UGFyc2VXaXRoV2lsZGNhcmRMYWJlbHM7CisgICAgcHJvY2VkdXJlIFRlc3RQYXJzZUxhYmVsc0FuZFRlc3RUZXh0OworICAgIHByb2NlZHVyZSBUZXN0UGFyc2VMYWJlbHNJbk5lc3RlZFRyZWU7CisgICAgcHJvY2VkdXJlIFRlc3RFcXVhbHM7CisgICAgcHJvY2VkdXJlIFRlc3RFcXVhbHNXaXRoVGV4dDsKKyAgICBwcm9jZWR1cmUgVGVzdEVxdWFsc1dpdGhNaXNtYXRjaGVkVGV4dDsKKyAgICBwcm9jZWR1cmUgVGVzdEZpbmRQYXR0ZXJuOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuU2V0VXA7CitiZWdpbgorZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlYXJEb3duOworYmVnaW4KK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0NE5vZGVzOwordmFyCisgIFIwOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIC8vIF4oMTAxIF4oMTAyIDEwMykgMTA0KQorICBSMCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSkpOworICBSMC5HZXRDaGlsZCgwKS5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNCkpKTsKKyAgQ2hlY2tOdWxsKFIwLlBhcmVudCk7CisgIENoZWNrRXF1YWxzKFIwLkNoaWxkSW5kZXgsLTEpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RBZGRMaXN0VG9FeGlzdENoaWxkcmVuOwordmFyCisgIFJvb3QsIFIwLCBDMCwgQzEsIEMyOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIC8vIEFkZCBjaGlsZCBeKG5pbCAxMDEgMTAyIDEwMykgdG8gcm9vdCBeKDUgNikKKyAgLy8gc2hvdWxkIGFkZCAxMDEgMTAyIDEwMyB0byBlbmQgb2YgNSdzIGNoaWxkIGxpc3QKKyAgUm9vdCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg1KSk7CisgIFJvb3QuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoNikpKTsKKworICAvLyBjaGlsZCB0cmVlCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShJVG9rZW4obmlsKSk7CisgIEMwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBDMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgQzIgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSk7CisgIFIwLkFkZENoaWxkKEMwKTsKKyAgUjAuQWRkQ2hpbGQoQzEpOworICBSMC5BZGRDaGlsZChDMik7CisKKyAgUm9vdC5BZGRDaGlsZChSMCk7CisKKyAgQ2hlY2tOdWxsKFJvb3QuUGFyZW50KTsKKyAgQ2hlY2tFcXVhbHMoUm9vdC5DaGlsZEluZGV4LCAtMSk7CisKKyAgLy8gY2hlY2sgY2hpbGRyZW4gb2Ygcm9vdCBhbGwgcG9pbnQgYXQgcm9vdAorICBDaGVjayhDMC5QYXJlbnQgPSBSb290KTsKKyAgQ2hlY2soQzAuQ2hpbGRJbmRleCA9IDEpOworICBDaGVjayhDMS5QYXJlbnQgPSBSb290KTsKKyAgQ2hlY2soQzEuQ2hpbGRJbmRleCA9IDIpOworICBDaGVjayhDMi5QYXJlbnQgPSBSb290KTsKKyAgQ2hlY2soQzIuQ2hpbGRJbmRleCA9IDMpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RCZWNvbWVSb290OwordmFyCisgIE9sZFJvb3QsIE5ld1Jvb3Q6IElDb21tb25UcmVlOworICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CitiZWdpbgorICAvLyA1IGJlY29tZXMgbmV3IHJvb3Qgb2YgXihuaWwgMTAxIDEwMiAxMDMpCisgIE5ld1Jvb3QgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoNSkpOworICBPbGRSb290IDo9IFRDb21tb25UcmVlLkNyZWF0ZShJVG9rZW4obmlsKSk7CisgIE9sZFJvb3QuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSkpOworICBPbGRSb290LkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMikpKTsKKyAgT2xkUm9vdC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgQWRhcHRvci5CZWNvbWVSb290KE5ld1Jvb3QsIE9sZFJvb3QpOworICBOZXdSb290LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RCZWNvbWVSb290MjsKK3ZhcgorICBPbGRSb290LCBOZXdSb290OiBJQ29tbW9uVHJlZTsKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworYmVnaW4KKyAgLy8gNSBiZWNvbWVzIG5ldyByb290IG9mIF4oMTAxIDEwMiAxMDMpCisgIE5ld1Jvb3QgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoNSkpOworICBPbGRSb290IDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBPbGRSb290LkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMikpKTsKKyAgT2xkUm9vdC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgQWRhcHRvci5CZWNvbWVSb290KE5ld1Jvb3QsIE9sZFJvb3QpOworICBOZXdSb290LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RCZWNvbWVSb290MzsKK3ZhcgorICBPbGRSb290LCBOZXdSb290OiBJQ29tbW9uVHJlZTsKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworYmVnaW4KKyAgLy8gXihuaWwgNSkgYmVjb21lcyBuZXcgcm9vdCBvZiBeKG5pbCAxMDEgMTAyIDEwMykKKyAgTmV3Um9vdCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoSVRva2VuKG5pbCkpOworICBOZXdSb290LkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDUpKSk7CisgIE9sZFJvb3QgOj0gVENvbW1vblRyZWUuQ3JlYXRlKElUb2tlbihuaWwpKTsKKyAgT2xkUm9vdC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKSk7CisgIE9sZFJvb3QuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSkpOworICBPbGRSb290LkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMykpKTsKKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBBZGFwdG9yLkJlY29tZVJvb3QoTmV3Um9vdCwgT2xkUm9vdCk7CisgIE5ld1Jvb3QuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdEJlY29tZVJvb3Q1OwordmFyCisgIE9sZFJvb3QsIE5ld1Jvb3Q6IElDb21tb25UcmVlOworICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CitiZWdpbgorICAvLyBeKG5pbCA1KSBiZWNvbWVzIG5ldyByb290IG9mIF4oMTAxIDEwMiAxMDMpCisgIE5ld1Jvb3QgOj0gVENvbW1vblRyZWUuQ3JlYXRlKElUb2tlbihuaWwpKTsKKyAgTmV3Um9vdC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg1KSkpOworICBPbGRSb290IDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBPbGRSb290LkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMikpKTsKKyAgT2xkUm9vdC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgQWRhcHRvci5CZWNvbWVSb290KE5ld1Jvb3QsIE9sZFJvb3QpOworICBOZXdSb290LlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RCZWNvbWVSb290NjsKK3ZhcgorICBSb290MCwgUm9vdDE6IElDb21tb25UcmVlOworICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CitiZWdpbgorICAvLyBlbXVsYXRlcyBjb25zdHJ1Y3Rpb24gb2YgXig1IDYpCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgUm9vdDAgOj0gQWRhcHRvci5HZXROaWxOb2RlIGFzIElDb21tb25UcmVlOworICBSb290MSA6PSBBZGFwdG9yLkdldE5pbE5vZGUgYXMgSUNvbW1vblRyZWU7CisgIFJvb3QxIDo9IEFkYXB0b3IuQmVjb21lUm9vdChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg1KSksIFJvb3QxKSBhcyBJQ29tbW9uVHJlZTsKKyAgQWRhcHRvci5BZGRDaGlsZChSb290MSwgVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoNikpKTsKKyAgQWRhcHRvci5BZGRDaGlsZChSb290MCwgUm9vdDEpOworICBSb290MC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0RHVwVHJlZTsKK3ZhcgorICBSMCwgUjEsIER1cDogSUNvbW1vblRyZWU7CisgIFIyOiBJVHJlZTsKKyAgQWRhcHRvcjogSUNvbW1vblRyZWVBZGFwdG9yOworYmVnaW4KKyAgLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICBSMCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgUjEgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSk7CisgIFIwLkFkZENoaWxkKFIxKTsKKyAgUjEuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSkpOworICBSMiA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDYpKTsKKyAgUjIuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA3KSkpOworICBSMS5BZGRDaGlsZChSMik7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNCkpKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA1KSkpOworCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgRHVwIDo9IEFkYXB0b3IuRHVwVHJlZShSMCkgYXMgSUNvbW1vblRyZWU7CisKKyAgQ2hlY2tOdWxsKER1cC5QYXJlbnQpOworICBDaGVja0VxdWFscyhEdXAuQ2hpbGRJbmRleCwgLTEpOworICBEdXAuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdExpc3Q7Cit2YXIKKyAgUjAsIEMwLCBDMSwgQzI6IElDb21tb25UcmVlOworYmVnaW4KKyAgLy8gXihuaWwgMTAxIDEwMiAxMDMpCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShJVG9rZW4obmlsKSk7CisgIEMwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBDMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgQzIgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSk7CisgIFIwLkFkZENoaWxkKEMwKTsKKyAgUjAuQWRkQ2hpbGQoQzEpOworICBSMC5BZGRDaGlsZChDMik7CisKKyAgQ2hlY2tOdWxsKFIwLlBhcmVudCk7CisgIENoZWNrRXF1YWxzKFIwLkNoaWxkSW5kZXgsIC0xKTsKKyAgQ2hlY2soQzAuUGFyZW50ID0gUjApOworICBDaGVja0VxdWFscyhDMC5DaGlsZEluZGV4LCAwKTsKKyAgQ2hlY2soQzEuUGFyZW50ID0gUjApOworICBDaGVja0VxdWFscyhDMS5DaGlsZEluZGV4LCAxKTsKKyAgQ2hlY2soQzIuUGFyZW50ID0gUjApOworICBDaGVja0VxdWFscyhDMi5DaGlsZEluZGV4LCAyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0TGlzdDI7Cit2YXIKKyAgUm9vdCwgUjAsIEMwLCBDMSwgQzI6IElDb21tb25UcmVlOworYmVnaW4KKyAgLy8gQWRkIGNoaWxkIF4obmlsIDEwMSAxMDIgMTAzKSB0byByb290IDUKKyAgLy8gc2hvdWxkIHB1bGwgMTAxIDEwMiAxMDMgZGlyZWN0bHkgdG8gYmVjb21lIDUncyBjaGlsZCBsaXN0CisgIFJvb3QgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDbGFzc2ljVG9rZW4uQ3JlYXRlKDUpKTsKKworICAvLyBjaGlsZCB0cmVlCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShJVG9rZW4obmlsKSk7CisgIEMwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBDMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgQzIgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSk7CisgIFIwLkFkZENoaWxkKEMwKTsKKyAgUjAuQWRkQ2hpbGQoQzEpOworICBSMC5BZGRDaGlsZChDMik7CisKKyAgUm9vdC5BZGRDaGlsZChSMCk7CisKKyAgQ2hlY2tOdWxsKFJvb3QuUGFyZW50KTsKKyAgQ2hlY2tFcXVhbHMoUm9vdC5DaGlsZEluZGV4LCAtMSk7CisKKyAgLy8gY2hlY2sgY2hpbGRyZW4gb2Ygcm9vdCBhbGwgcG9pbnQgYXQgcm9vdAorICBDaGVjayhDMC5QYXJlbnQgPSBSb290KTsKKyAgQ2hlY2soQzAuQ2hpbGRJbmRleCA9IDApOworICBDaGVjayhDMS5QYXJlbnQgPSBSb290KTsKKyAgQ2hlY2soQzEuQ2hpbGRJbmRleCA9IDEpOworICBDaGVjayhDMi5QYXJlbnQgPSBSb290KTsKKyAgQ2hlY2soQzIuQ2hpbGRJbmRleCA9IDIpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RSZXBsYWNlQWxsV2l0aE9uZTsKK3ZhcgorICBULCBOZXdDaGlsZDogSUNvbW1vblRyZWU7CitiZWdpbgorICBUIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYScpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2InKSkpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYycpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdkJykpKTsKKyAgTmV3Q2hpbGQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICd4JykpOworICBULlJlcGxhY2VDaGlsZHJlbigwLCAyLCBOZXdDaGlsZCk7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnKGEgeCknKTsKKyAgVC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0UmVwbGFjZUFsbFdpdGhUd287Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBULCBOZXdDaGlsZHJlbjogSUNvbW1vblRyZWU7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdhJykpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYicpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdjJykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2QnKSkpOworICBOZXdDaGlsZHJlbiA6PSBBZGFwdG9yLkdldE5pbE5vZGUgYXMgSUNvbW1vblRyZWU7CisgIE5ld0NoaWxkcmVuLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAneCcpKSk7CisgIE5ld0NoaWxkcmVuLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAneScpKSk7CisgIFQuUmVwbGFjZUNoaWxkcmVuKDAsIDIsIE5ld0NoaWxkcmVuKTsKKyAgQ2hlY2tFcXVhbHMoVC5Ub1N0cmluZ1RyZWUsICcoYSB4IHkpJyk7CisgIFQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdFJlcGxhY2VBdExlZnQ7Cit2YXIKKyAgVCwgTmV3Q2hpbGQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2EnKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdiJykpKTsgLy8gaW5kZXggMAorICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYycpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdkJykpKTsKKyAgTmV3Q2hpbGQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICd4JykpOworICBULlJlcGxhY2VDaGlsZHJlbigwLCAwLCBOZXdDaGlsZCk7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnKGEgeCBjIGQpJyk7CisgIFQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdFJlcGxhY2VBdFJpZ2h0OwordmFyCisgIFQsIE5ld0NoaWxkOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdhJykpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYicpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdjJykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2QnKSkpOyAvLyBpbmRleCAyCisgIE5ld0NoaWxkIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAneCcpKTsKKyAgVC5SZXBsYWNlQ2hpbGRyZW4oMiwgMiwgTmV3Q2hpbGQpOworICBDaGVja0VxdWFscyhULlRvU3RyaW5nVHJlZSwgJyhhIGIgYyB4KScpOworICBULlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RSZXBsYWNlSW5NaWRkbGU7Cit2YXIKKyAgVCwgTmV3Q2hpbGQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2EnKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdiJykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2MnKSkpOyAvLyBpbmRleCAxCisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdkJykpKTsKKyAgTmV3Q2hpbGQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICd4JykpOworICBULlJlcGxhY2VDaGlsZHJlbigxLCAxLCBOZXdDaGlsZCk7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnKGEgYiB4IGQpJyk7CisgIFQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdFJlcGxhY2VPbmVXaXRoVHdvQXRMZWZ0OwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgVCwgTmV3Q2hpbGRyZW46IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBUIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYScpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2InKSkpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYycpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdkJykpKTsKKyAgTmV3Q2hpbGRyZW4gOj0gQWRhcHRvci5HZXROaWxOb2RlIGFzIElDb21tb25UcmVlOworICBOZXdDaGlsZHJlbi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ3gnKSkpOworICBOZXdDaGlsZHJlbi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ3knKSkpOworICBULlJlcGxhY2VDaGlsZHJlbigwLCAwLCBOZXdDaGlsZHJlbik7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnKGEgeCB5IGMgZCknKTsKKyAgVC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0UmVwbGFjZU9uZVdpdGhUd29BdFJpZ2h0OwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgVCwgTmV3Q2hpbGRyZW46IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBUIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYScpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2InKSkpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYycpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdkJykpKTsKKyAgTmV3Q2hpbGRyZW4gOj0gQWRhcHRvci5HZXROaWxOb2RlIGFzIElDb21tb25UcmVlOworICBOZXdDaGlsZHJlbi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ3gnKSkpOworICBOZXdDaGlsZHJlbi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ3knKSkpOworICBULlJlcGxhY2VDaGlsZHJlbigyLCAyLCBOZXdDaGlsZHJlbik7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnKGEgYiBjIHggeSknKTsKKyAgVC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0UmVwbGFjZU9uZVdpdGhUd29Jbk1pZGRsZTsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFQsIE5ld0NoaWxkcmVuOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2EnKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdiJykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2MnKSkpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnZCcpKSk7CisgIE5ld0NoaWxkcmVuIDo9IEFkYXB0b3IuR2V0TmlsTm9kZSBhcyBJQ29tbW9uVHJlZTsKKyAgTmV3Q2hpbGRyZW4uQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICd4JykpKTsKKyAgTmV3Q2hpbGRyZW4uQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICd5JykpKTsKKyAgVC5SZXBsYWNlQ2hpbGRyZW4oMSwgMSwgTmV3Q2hpbGRyZW4pOworICBDaGVja0VxdWFscyhULlRvU3RyaW5nVHJlZSwgJyhhIGIgeCB5IGQpJyk7CisgIFQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdFJlcGxhY2VUd29XaXRoT25lQXRMZWZ0OwordmFyCisgIFQsIE5ld0NoaWxkOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdhJykpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYicpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdjJykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2QnKSkpOworICBOZXdDaGlsZCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ3gnKSk7CisgIFQuUmVwbGFjZUNoaWxkcmVuKDAsIDEsIE5ld0NoaWxkKTsKKyAgQ2hlY2tFcXVhbHMoVC5Ub1N0cmluZ1RyZWUsICcoYSB4IGQpJyk7CisgIFQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWUuVGVzdFJlcGxhY2VUd29XaXRoT25lQXRSaWdodDsKK3ZhcgorICBULCBOZXdDaGlsZDogSUNvbW1vblRyZWU7CitiZWdpbgorICBUIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYScpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2InKSkpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYycpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICdkJykpKTsKKyAgTmV3Q2hpbGQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoOTksICd4JykpOworICBULlJlcGxhY2VDaGlsZHJlbigxLCAyLCBOZXdDaGlsZCk7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnKGEgYiB4KScpOworICBULlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RSZXBsYWNlV2l0aE5vQ2hpbGRyZW47Cit2YXIKKyAgVCwgTmV3Q2hpbGQ6IElDb21tb25UcmVlOworICBFcnJvcjogQm9vbGVhbjsKK2JlZ2luCisgIEV4aXQ7IC8vIGFscmVhZHkgY2hlY2tlZC4gQXZvaWQgZXhjZXB0aW9uCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIE5ld0NoaWxkIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDUpKTsKKyAgRXJyb3IgOj0gRmFsc2U7CisgIHRyeQorICAgIFQuUmVwbGFjZUNoaWxkcmVuKDAsIDAsIE5ld0NoaWxkKTsKKyAgZXhjZXB0CisgICAgRXJyb3IgOj0gVHJ1ZTsKKyAgZW5kOworICBDaGVja1RydWUoRXJyb3IpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlLlRlc3RSZXBsYWNlV2l0aE9uZUNoaWxkcmVuOwordmFyCisgIFQsIEMwLCBOZXdDaGlsZDogSUNvbW1vblRyZWU7CitiZWdpbgorICAvLyBhc3N1bWUgdG9rZW4gdHlwZSA5OSBhbmQgdXNlIHRleHQKKyAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSg5OSwgJ2EnKSk7CisgIEMwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYicpKTsKKyAgVC5BZGRDaGlsZChDMCk7CisgIE5ld0NoaWxkIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDk5LCAnYycpKTsKKyAgVC5SZXBsYWNlQ2hpbGRyZW4oMCwgMCwgTmV3Q2hpbGQpOworICBDaGVja0VxdWFscyhULlRvU3RyaW5nVHJlZSwnKGEgYyknKTsKKyAgVC5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZS5UZXN0U2luZ2xlTm9kZTsKK3ZhcgorICBUOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIENoZWNrTnVsbChULlBhcmVudCk7CisgIENoZWNrRXF1YWxzKFQuQ2hpbGRJbmRleCwgLTEpOworZW5kOworCitmdW5jdGlvbiBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZUNvbW1vblRyZWVOb2RlU3RyZWFtKAorICBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJVHJlZU5vZGVTdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gVENvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZShUKTsKK2VuZDsKKworZnVuY3Rpb24gVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5DcmVhdGVVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0oCisgIGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IElUcmVlTm9kZVN0cmVhbTsKK2JlZ2luCisgIFJlc3VsdCA6PSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLkNyZWF0ZShUKTsKK2VuZDsKKworZnVuY3Rpb24gVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5HZXRTdHJpbmdPZkVudGlyZVN0cmVhbUNvbnRlbnRzV2l0aE5vZGVUeXBlc09ubHkoCisgIGNvbnN0IE5vZGVzOiBJVHJlZU5vZGVTdHJlYW0pOiBTdHJpbmc7Cit2YXIKKyAgQnVmOiBUU3RyaW5nQnVpbGRlcjsKKyAgSSwgVG9rZW5UeXBlOiBJbnRlZ2VyOworICBUOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBmb3IgSSA6PSAwIHRvIE5vZGVzLlNpemUgLSAxIGRvCisgICAgYmVnaW4KKyAgICAgIFQgOj0gTm9kZXMuTFQoSSArIDEpOworICAgICAgVG9rZW5UeXBlIDo9IE5vZGVzLlRyZWVBZGFwdG9yLkdldE5vZGVUeXBlKFQpOworICAgICAgaWYgKFRva2VuVHlwZSA8PiBUVG9rZW4uRE9XTikgYW5kIChUb2tlblR5cGUgPD4gVFRva2VuLlVQKSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBCdWYuQXBwZW5kKCcgJyk7CisgICAgICAgIEJ1Zi5BcHBlbmQoVG9rZW5UeXBlKQorICAgICAgZW5kOworICAgIGVuZDsKKyAgICBSZXN1bHQgOj0gQnVmLlRvU3RyaW5nOworICBmaW5hbGx5CisgICAgQnVmLkZyZWU7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZU5vZGVTdHJlYW0uU2V0VXA7CitiZWdpbgorZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZWFyRG93bjsKK2JlZ2luCitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3Q0Tm9kZXM7Cit2YXIKKyAgVDogSVRyZWU7CisgIFN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworYmVnaW4KKyAgLy8vIFRlc3QgYSB0cmVlIHdpdGggZm91ciBub2RlcyAtIF4oMTAxIF4oMTAyIDEwMykgMTA0KQorICBUIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBULkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMikpKTsKKyAgVC5HZXRDaGlsZCgwKS5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA0KSkpOworCisgIFN0cmVhbSA6PSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbShUKTsKKyAgQ2hlY2tFcXVhbHMoR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KFN0cmVhbSksJyAxMDEgMTAyIDEwMyAxMDQnKTsKKyAgQ2hlY2tFcXVhbHMoU3RyZWFtLlRvU3RyaW5nLCAnIDEwMSAyIDEwMiAyIDEwMyAzIDEwNCAzJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3RBb3ZlckI7Cit2YXIKKyAgVDogSVRyZWU7CisgIFN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworYmVnaW4KKyAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKSk7CisKKyAgU3RyZWFtIDo9IENyZWF0ZUNvbW1vblRyZWVOb2RlU3RyZWFtKFQpOworICBDaGVja0VxdWFscyhHZXRTdHJpbmdPZkVudGlyZVN0cmVhbUNvbnRlbnRzV2l0aE5vZGVUeXBlc09ubHkoU3RyZWFtKSwnIDEwMSAxMDInKTsKKyAgQ2hlY2tFcXVhbHMoU3RyZWFtLlRvU3RyaW5nLCAnIDEwMSAyIDEwMiAzJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3RCdWZmZXJPdmVyZmxvdzsKK3ZhcgorICBCdWYsIEJ1ZjI6IFRTdHJpbmdCdWlsZGVyOworICBTdHJlYW06IElUcmVlTm9kZVN0cmVhbTsKKyAgVDogSVRyZWU7CisgIEk6IEludGVnZXI7CitiZWdpbgorICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICBCdWYyIDo9IFRTdHJpbmdCdWlsZGVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgLy8gbWFrZSBeKDEwMSAxMDIgLi4uIG4pCisgICAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgICBCdWYuQXBwZW5kKCcgMTAxJyk7CisgICAgQnVmMi5BcHBlbmQoJyAxMDEnKTsKKyAgICBCdWYyLkFwcGVuZCgnICcpOworICAgIEJ1ZjIuQXBwZW5kKFRUb2tlbi5ET1dOKTsKKworICAgIGZvciBJIDo9IDAgdG8gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5JTklUSUFMX0xPT0tBSEVBRF9CVUZGRVJfU0laRSArIDEwIGRvCisgICAgYmVnaW4KKyAgICAgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyICsgSSkpKTsKKyAgICAgIEJ1Zi5BcHBlbmQoJyAnKTsKKyAgICAgIEJ1Zi5BcHBlbmQoMTAyICsgSSk7CisgICAgICBCdWYyLkFwcGVuZCgnICcpOworICAgICAgQnVmMi5BcHBlbmQoMTAyICsgSSk7CisgICAgZW5kOworICAgIEJ1ZjIuQXBwZW5kKCcgJyk7CisgICAgQnVmMi5BcHBlbmQoVFRva2VuLlVQKTsKKworICAgIFN0cmVhbSA6PSBDcmVhdGVVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0oVCk7CisgICAgQ2hlY2tFcXVhbHMoR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KFN0cmVhbSksIEJ1Zi5Ub1N0cmluZyk7CisgICAgQ2hlY2tFcXVhbHMoU3RyZWFtLlRvU3RyaW5nLCBCdWYyLlRvU3RyaW5nKTsKKyAgZmluYWxseQorICAgIEJ1ZjIuRnJlZTsKKyAgICBCdWYuRnJlZTsKKyAgZW5kOworZW5kOworCisvLy8gPHN1bW1hcnk+CisvLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiB0YWlsIGhpdHMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBidXQgdGhlcmUKKy8vLyBpcyBtb3JlIHJvb20gbGVmdC4KKy8vLyA8L3N1bW1hcnk+CisvLy8gPHJlbWFya3M+CisvLy8gU3BlY2lmaWNhbGx5IHRoYXQgd291bGQgbWVhbiB0aGF0IGhlYWQgaXMgbm90IGF0IDAgYnV0IGhhcworLy8vIGFkdmFuY2VkIHNvbWV3aGVyZSB0byB0aGUgbWlkZGxlIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyLgorLy8vCisvLy8gVXNlIENvbnN1bWUoKSB0byBhZHZhbmNlIE4gbm9kZXMgaW50byBsb29rYWhlYWQuICBUaGVuIHVzZSBMVCgpCisvLy8gdG8gbG9hZCBhdCBsZWFzdCBJTklUSUFMX0xPT0tBSEVBRF9CVUZGRVJfU0laRS1OIG5vZGVzIHNvIHRoZQorLy8vIGJ1ZmZlciBoYXMgdG8gd3JhcC4KKy8vLyA8L3JlbWFya3M+Citwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZXN0QnVmZmVyV3JhcDsKK2NvbnN0CisgIE4gPSAxMDsKKyAgV3JhcEJ5ID0gNDsgLy8gd3JhcCBhcm91bmQgYnkgNCBub2RlcwordmFyCisgIFQ6IElUcmVlOworICBJLCBSZW1haW5pbmc6IEludGVnZXI7CisgIFN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworICBOb2RlOiBJVHJlZTsKK2JlZ2luCisgIC8vIG1ha2UgdHJlZSB3aXRoIHR5cGVzOiAxIDIgLi4uIElOSVRJQUxfTE9PS0FIRUFEX0JVRkZFUl9TSVpFK04KKyAgVCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoSVRva2VuKG5pbCkpOworICBmb3IgSSA6PSAwIHRvIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uSU5JVElBTF9MT09LQUhFQURfQlVGRkVSX1NJWkUgKyBOIC0gMSBkbworICAgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoSSArIDEpKSk7CisKKyAgLy8gbW92ZSBoZWFkIHRvIGluZGV4IE4KKyAgU3RyZWFtIDo9IENyZWF0ZVVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbShUKTsKKyAgZm9yIEkgOj0gMSB0byBOIGRvCisgIGJlZ2luCisgICAgLy8gY29uc3VtZSBOCisgICAgTm9kZSA6PSBTdHJlYW0uTFQoMSkgYXMgSVRyZWU7CisgICAgQ2hlY2tFcXVhbHMoTm9kZS5Ub2tlblR5cGUsIEkpOworICAgIFN0cmVhbS5Db25zdW1lOworICBlbmQ7CisKKyAgLy8gbm93IHVzZSBMVCB0byBsb29rYWhlYWQgcGFzdCBlbmQgb2YgYnVmZmVyCisgIFJlbWFpbmluZyA6PSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLklOSVRJQUxfTE9PS0FIRUFEX0JVRkZFUl9TSVpFIC0gTjsKKyAgQ2hlY2tUcnVlKFdyYXBCeSA8IE4pOworICBmb3IgSSA6PSAxIHRvIFJlbWFpbmluZyArIFdyYXBCeSBkbworICBiZWdpbgorICAgIC8vIHdyYXAgcGFzdCBlbmQgb2YgYnVmZmVyCisgICAgTm9kZSA6PSBTdHJlYW0uTFQoSSkgYXMgSVRyZWU7IC8vIGxvb2sgYWhlYWQgdG8gaXRoIHRva2VuCisgICAgQ2hlY2tFcXVhbHMoTm9kZS5Ub2tlblR5cGUsIE4gKyBJKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZXN0RmxhdExpc3Q7Cit2YXIKKyAgUm9vdDogSVRyZWU7CisgIFN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworYmVnaW4KKyAgUm9vdCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoSVRva2VuKG5pbCkpOworICBSb290LkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpKTsKKyAgUm9vdC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKSk7CisgIFJvb3QuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSkpOworCisgIFN0cmVhbSA6PSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbShSb290KTsKKyAgQ2hlY2tFcXVhbHMoR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KFN0cmVhbSksJyAxMDEgMTAyIDEwMycpOworICBDaGVja0VxdWFscyhTdHJlYW0uVG9TdHJpbmcsICcgMTAxIDEwMiAxMDMnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZU5vZGVTdHJlYW0uVGVzdExpc3Q7Cit2YXIKKyAgUm9vdCwgVCwgVTogSVRyZWU7CisgIFN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworYmVnaW4KKyAgUm9vdCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoSVRva2VuKG5pbCkpOworCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSkpOworICBULkdldENoaWxkKDApLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDQpKSk7CisKKyAgVSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDUpKTsKKworICBSb290LkFkZENoaWxkKFQpOworICBSb290LkFkZENoaWxkKFUpOworCisgIFN0cmVhbSA6PSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbShSb290KTsKKyAgQ2hlY2tFcXVhbHMoR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KFN0cmVhbSksJyAxMDEgMTAyIDEwMyAxMDQgMTA1Jyk7CisgIENoZWNrRXF1YWxzKFN0cmVhbS5Ub1N0cmluZywgJyAxMDEgMiAxMDIgMiAxMDMgMyAxMDQgMyAxMDUnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZU5vZGVTdHJlYW0uVGVzdExpc3RXaXRoT25lTm9kZTsKK3ZhcgorICBSb290OiBJVHJlZTsKKyAgU3RyZWFtOiBJVHJlZU5vZGVTdHJlYW07CitiZWdpbgorICBSb290IDo9IFRDb21tb25UcmVlLkNyZWF0ZShJVG9rZW4obmlsKSk7CisgIFJvb3QuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSkpOworCisgIFN0cmVhbSA6PSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbShSb290KTsKKyAgQ2hlY2tFcXVhbHMoR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KFN0cmVhbSksJyAxMDEnKTsKKyAgQ2hlY2tFcXVhbHMoU3RyZWFtLlRvU3RyaW5nLCAnIDEwMScpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZXN0TFQ7Cit2YXIKKyAgVDogSVRyZWU7CisgIFN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworYmVnaW4KKyAgLy8gXigxMDEgXigxMDIgMTAzKSAxMDQpCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIFQuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSkpOworICBULkdldENoaWxkKDApLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMykpKTsKKyAgVC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDQpKSk7CisKKyAgU3RyZWFtIDo9IENyZWF0ZUNvbW1vblRyZWVOb2RlU3RyZWFtKFQpOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTAxKTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgyKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5ET1dOKTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgzKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwMik7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoNCkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uRE9XTik7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoNSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDMpOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDYpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLlVQKTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCg3KSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwNCk7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoOCkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uVVApOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDkpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLkVPRik7CisgIC8vIGNoZWNrIHdheSBhaGVhZAorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEwMCkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uRU9GKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZU5vZGVTdHJlYW0uVGVzdE1hcmtSZXdpbmRFbnRpcmU7Cit2YXIKKyAgUjAsIFIxLCBSMjogSVRyZWU7CisgIFN0cmVhbTogSUNvbW1vblRyZWVOb2RlU3RyZWFtOworICBNLCBLOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAvLyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgIC8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBSMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgUjAuQWRkQ2hpbGQoUjEpOworICBSMS5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIFIyIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNikpOworICBSMi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDcpKSk7CisgIFIxLkFkZENoaWxkKFIyKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA0KSkpOworICBSMC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDUpKSk7CisKKyAgU3RyZWFtIDo9IFRDb21tb25UcmVlTm9kZVN0cmVhbS5DcmVhdGUoUjApOworICBNIDo9IFN0cmVhbS5NYXJrOworICBmb3IgSyA6PSAxIHRvIDEzIGRvCisgIGJlZ2luCisgICAgLy8gY29uc3VtZSB0aWwgZW5kCisgICAgU3RyZWFtLkxUKDEpOworICAgIFN0cmVhbS5Db25zdW1lOworICBlbmQ7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uRU9GKTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgtMSkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uVVApOworICBTdHJlYW0uUmV3aW5kKE0pOworCisgIGZvciBLIDo9IDEgdG8gMTMgZG8KKyAgYmVnaW4KKyAgICAvLyBjb25zdW1lIHRpbCBlbmQKKyAgICBTdHJlYW0uTFQoMSk7CisgICAgU3RyZWFtLkNvbnN1bWU7CisgIGVuZDsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5FT0YpOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKC0xKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5VUCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3RNYXJrUmV3aW5kSW5NaWRkbGU7Cit2YXIKKyAgUjAsIFIxLCBSMjogSVRyZWU7CisgIFN0cmVhbTogSUNvbW1vblRyZWVOb2RlU3RyZWFtOworICBNLCBLOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAvLyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgIC8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBSMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgUjAuQWRkQ2hpbGQoUjEpOworICBSMS5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDMpKSk7CisgIFIyIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNikpOworICBSMi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDcpKSk7CisgIFIxLkFkZENoaWxkKFIyKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA0KSkpOworICBSMC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDUpKSk7CisKKyAgU3RyZWFtIDo9IFRDb21tb25UcmVlTm9kZVN0cmVhbS5DcmVhdGUoUjApOworICBmb3IgSyA6PSAxIHRvIDcgZG8KKyAgYmVnaW4KKyAgICAvLyBjb25zdW1lIHRpbCBtaWRkbGUKKyAgICBTdHJlYW0uQ29uc3VtZTsKKyAgZW5kOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTA3KTsKKyAgTSA6PSBTdHJlYW0uTWFyazsKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgMTA3CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIFVQCisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIFVQCisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwNAorICBTdHJlYW0uUmV3aW5kKE0pOworCisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDcpOworICBTdHJlYW0uQ29uc3VtZTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5VUCk7CisgIFN0cmVhbS5Db25zdW1lOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLlVQKTsKKyAgU3RyZWFtLkNvbnN1bWU7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDQpOworICBTdHJlYW0uQ29uc3VtZTsKKyAgLy8gbm93IHdlJ3JlIHBhc3QgcmV3aW5kIHBvc2l0aW9uCisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDUpOworICBTdHJlYW0uQ29uc3VtZTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5VUCk7CisgIFN0cmVhbS5Db25zdW1lOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLkVPRik7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoLTEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLlVQKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZU5vZGVTdHJlYW0uVGVzdE1hcmtSZXdpbmROZXN0ZWQ7Cit2YXIKKyAgUjAsIFIxLCBSMjogSVRyZWU7CisgIFN0cmVhbTogSUNvbW1vblRyZWVOb2RlU3RyZWFtOworICBNLCBNMjogSW50ZWdlcjsKK2JlZ2luCisgIC8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKyAgLy8gc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworICAvLyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVUCBVUCAxMDQgMTA1IFVQIEVPRgorICBSMCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgUjEgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSk7CisgIFIwLkFkZENoaWxkKFIxKTsKKyAgUjEuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSkpOworICBSMiA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDYpKTsKKyAgUjIuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA3KSkpOworICBSMS5BZGRDaGlsZChSMik7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNCkpKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA1KSkpOworCisgIFN0cmVhbSA6PSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uQ3JlYXRlKFIwKTsKKyAgTSA6PSBTdHJlYW0uTWFyazsgLy8gTUFSSyBhdCBzdGFydAorICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDEKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgRE4KKyAgTTI6PSBTdHJlYW0uTWFyazsgLy8gTUFSSyBvbiAxMDIKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgMTAyCisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIEROCisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwMworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDYKKyAgU3RyZWFtLlJld2luZChNMik7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDIpOworICBTdHJlYW0uQ29uc3VtZTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5ET1dOKTsKKyAgU3RyZWFtLkNvbnN1bWU7CisgIC8vIHN0b3AgYXQgMTAzIGFuZCByZXdpbmQgdG8gc3RhcnQKKyAgU3RyZWFtLlJld2luZChNKTsgLy8gUkVXSU5EIHRvIDEwMQorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTAxKTsKKyAgU3RyZWFtLkNvbnN1bWU7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uRE9XTik7CisgIFN0cmVhbS5Db25zdW1lOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTAyKTsKKyAgU3RyZWFtLkNvbnN1bWU7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uRE9XTik7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3ROZXN0ZWRQdXNoUG9wOworY29uc3QKKyAgSW5kZXhPZjEwMiA9IDI7CisgIEluZGV4T2YxMDQgPSA2OworICBJbmRleE9mMTA3ID0gMTI7Cit2YXIKKyAgUjAsIFIxLCBSMiwgUjM6IElUcmVlOworICBTdHJlYW06IElDb21tb25UcmVlTm9kZVN0cmVhbTsKKyAgSzogSW50ZWdlcjsKK2JlZ2luCisgIC8vIF4oMTAxIF4oMTAyIDEwMykgXigxMDQgMTA1KSBeKDEwNiAxMDcpIDEwOCAxMDkpCisgIC8vIHN0cmVhbSBoYXMgOSByZWFsICsgOCBuYXYgbm9kZXMKKyAgLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIFVQIDEwNCBETiAxMDUgVVAgMTA2IEROIDEwNyBVUCAxMDggMTA5IFVQCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBSMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgUjEuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSkpOworICBSMC5BZGRDaGlsZChSMSk7CisgIFIyIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNCkpOworICBSMi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDUpKSk7CisgIFIwLkFkZENoaWxkKFIyKTsKKyAgUjMgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA2KSk7CisgIFIzLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNykpKTsKKyAgUjAuQWRkQ2hpbGQoUjMpOworICBSMC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDgpKSk7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwOSkpKTsKKworICBTdHJlYW0gOj0gVENvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZShSMCk7CisgIENoZWNrRXF1YWxzKFN0cmVhbS5Ub1N0cmluZywgJyAxMDEgMiAxMDIgMiAxMDMgMyAxMDQgMiAxMDUgMyAxMDYgMiAxMDcgMyAxMDggMTA5IDMnKTsKKworICAvLyBBc3N1bWUgd2Ugd2FudCB0byBoaXQgbm9kZSAxMDcgYW5kIHRoZW4gImNhbGwgMTAyIiwgd2hpY2gKKyAgLy8gY2FsbHMgMTA0LCB0aGVuIHJldHVybgorICBmb3IgSyA6PSAxIHRvIEluZGV4T2YxMDcgZG8KKyAgICAvLyBjb25zdW1lIHRpbCAxMDcgbm9kZQorICAgIFN0cmVhbS5Db25zdW1lOworCisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDcpOworICAvLyBDQUxMIDEwMgorICBTdHJlYW0uUHVzaChJbmRleE9mMTAyKTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwMik7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwMgorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLkRPV04pOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSBETgorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTAzKTsKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgMTAzCisKKyAgLy8gQ0FMTCAxMDQKKyAgU3RyZWFtLlB1c2goSW5kZXhPZjEwNCk7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDQpOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDQKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5ET1dOKTsKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgRE4KKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwNSk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwNDUKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5VUCk7CisKKyAgLy8gUkVUVVJOICh0byBVUCBub2RlIGluIDEwMiBzdWJ0cmVlKQorICBTdHJlYW0uUG9wOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLlVQKTsKKworICAvLyBSRVRVUk4gKHRvIGVtcHR5IHN0YWNrKQorICBTdHJlYW0uUG9wOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTA3KTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJQ29tbW9uVHJlZU5vZGVTdHJlYW0uVGVzdFB1c2hQb3A7Citjb25zdAorICBJbmRleE9mMTAyID0gMjsKKyAgSW5kZXhPZjEwNyA9IDEyOwordmFyCisgIFIwLCBSMSwgUjIsIFIzOiBJVHJlZTsKKyAgU3RyZWFtOiBJQ29tbW9uVHJlZU5vZGVTdHJlYW07CisgIEs6IEludGVnZXI7CitiZWdpbgorICAvLyBeKDEwMSBeKDEwMiAxMDMpIF4oMTA0IDEwNSkgXigxMDYgMTA3KSAxMDggMTA5KQorICAvLyBzdHJlYW0gaGFzIDkgcmVhbCArIDggbmF2IG5vZGVzCisgIC8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyBVUCAxMDQgRE4gMTA1IFVQIDEwNiBETiAxMDcgVVAgMTA4IDEwOSBVUAorICBSMCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgUjEgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSk7CisgIFIxLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMykpKTsKKyAgUjAuQWRkQ2hpbGQoUjEpOworICBSMiA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDQpKTsKKyAgUjIuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA1KSkpOworICBSMC5BZGRDaGlsZChSMik7CisgIFIzIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNikpOworICBSMy5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDcpKSk7CisgIFIwLkFkZENoaWxkKFIzKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA4KSkpOworICBSMC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDkpKSk7CisKKyAgU3RyZWFtIDo9IFRDb21tb25UcmVlTm9kZVN0cmVhbS5DcmVhdGUoUjApOworICBDaGVja0VxdWFscyhTdHJlYW0uVG9TdHJpbmcsICcgMTAxIDIgMTAyIDIgMTAzIDMgMTA0IDIgMTA1IDMgMTA2IDIgMTA3IDMgMTA4IDEwOSAzJyk7CisKKyAgLy8gQXNzdW1lIHdlIHdhbnQgdG8gaGl0IG5vZGUgMTA3IGFuZCB0aGVuICJjYWxsIDEwMiIgdGhlbiByZXR1cm4KKyAgZm9yIEsgOj0gMSB0byBJbmRleE9mMTA3IGRvCisgICAgLy8gY29uc3VtZSB0aWwgMTA3IG5vZGUKKyAgICBTdHJlYW0uQ29uc3VtZTsKKworICAvLyBDQUxMIDEwMgorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTA3KTsKKyAgU3RyZWFtLlB1c2goSW5kZXhPZjEwMik7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDIpOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDIKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5ET1dOKTsKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgRE4KKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwMyk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwMworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLlVQKTsKKyAgLy8gUkVUVVJOCisgIFN0cmVhbS5Qb3A7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDcpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZXN0UHVzaFBvcEZyb21FT0Y7Citjb25zdAorICBJbmRleE9mMTAyID0gMjsKKyAgSW5kZXhPZjEwNCA9IDY7Cit2YXIKKyAgUjAsIFIxLCBSMiwgUjM6IElUcmVlOworICBTdHJlYW06IElDb21tb25UcmVlTm9kZVN0cmVhbTsKK2JlZ2luCisgIC8vIF4oMTAxIF4oMTAyIDEwMykgXigxMDQgMTA1KSBeKDEwNiAxMDcpIDEwOCAxMDkpCisgIC8vIHN0cmVhbSBoYXMgOSByZWFsICsgOCBuYXYgbm9kZXMKKyAgLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIFVQIDEwNCBETiAxMDUgVVAgMTA2IEROIDEwNyBVUCAxMDggMTA5IFVQCisgIFIwIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMSkpOworICBSMSA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDIpKTsKKyAgUjEuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSkpOworICBSMC5BZGRDaGlsZChSMSk7CisgIFIyIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNCkpOworICBSMi5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDUpKSk7CisgIFIwLkFkZENoaWxkKFIyKTsKKyAgUjMgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA2KSk7CisgIFIzLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNykpKTsKKyAgUjAuQWRkQ2hpbGQoUjMpOworICBSMC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDgpKSk7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwOSkpKTsKKworICBTdHJlYW0gOj0gVENvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZShSMCk7CisgIENoZWNrRXF1YWxzKFN0cmVhbS5Ub1N0cmluZywgJyAxMDEgMiAxMDIgMiAxMDMgMyAxMDQgMiAxMDUgMyAxMDYgMiAxMDcgMyAxMDggMTA5IDMnKTsKKworICB3aGlsZSAoU3RyZWFtLkxBKDEpIDw+IFRUb2tlbi5FT0YpIGRvCisgICAgU3RyZWFtLkNvbnN1bWU7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uRU9GKTsKKworICAvLyBDQUxMIDEwMgorICBTdHJlYW0uUHVzaChJbmRleE9mMTAyKTsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwMik7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwMgorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLkRPV04pOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSBETgorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsMTAzKTsKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgMTAzCisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSxUVG9rZW4uVVApOworICAvLyBSRVRVUk4gKHRvIGVtcHR5IHN0YWNrKQorICBTdHJlYW0uUG9wOworICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLkVPRik7CisKKyAgLy8gQ0FMTCAxMDQKKyAgU3RyZWFtLlB1c2goSW5kZXhPZjEwNCk7CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDQpOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDQKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5ET1dOKTsKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgRE4KKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwNSk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwNQorICBDaGVja0VxdWFscygoU3RyZWFtLkxUKDEpIGFzIElUcmVlKS5Ub2tlblR5cGUsVFRva2VuLlVQKTsKKyAgLy8gUkVUVVJOICh0byBlbXB0eSBzdGFjaykKKyAgU3RyZWFtLlBvcDsKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLFRUb2tlbi5FT0YpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZXN0U2VlazsKK3ZhcgorICBSMCwgUjEsIFIyOiBJVHJlZTsKKyAgU3RyZWFtOiBJQ29tbW9uVHJlZU5vZGVTdHJlYW07CitiZWdpbgorICAvLyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisgIC8vIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKyAgLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVVAgVVAgMTA0IDEwNSBVUCBFT0YKKyAgUjAgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIFIxIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMikpOworICBSMC5BZGRDaGlsZChSMSk7CisgIFIxLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwMykpKTsKKyAgUjIgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA2KSk7CisgIFIyLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNykpKTsKKyAgUjEuQWRkQ2hpbGQoUjIpOworICBSMC5BZGRDaGlsZChUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDQpKSk7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNSkpKTsKKworICBTdHJlYW0gOj0gVENvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZShSMCk7CisgIFN0cmVhbS5Db25zdW1lOyAvLyBjb25zdW1lIDEwMQorICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSBETgorICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDIKKyAgU3RyZWFtLlNlZWsoNyk7IC8vIHNlZWsgdG8gMTA3CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDcpOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDcKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgVVAKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgVVAKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwNCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3RTZWVrRnJvbVN0YXJ0OwordmFyCisgIFIwLCBSMSwgUjI6IElUcmVlOworICBTdHJlYW06IElDb21tb25UcmVlTm9kZVN0cmVhbTsKK2JlZ2luCisgIC8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKyAgLy8gc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworICAvLyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVUCBVUCAxMDQgMTA1IFVQIEVPRgorICBSMCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDEpKTsKKyAgUjEgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAyKSk7CisgIFIwLkFkZENoaWxkKFIxKTsKKyAgUjEuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAzKSkpOworICBSMiA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoVENvbW1vblRva2VuLkNyZWF0ZSgxMDYpKTsKKyAgUjIuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA3KSkpOworICBSMS5BZGRDaGlsZChSMik7CisgIFIwLkFkZENoaWxkKFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKDEwNCkpKTsKKyAgUjAuQWRkQ2hpbGQoVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTA1KSkpOworCisgIFN0cmVhbSA6PSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uQ3JlYXRlKFIwKTsKKyAgU3RyZWFtLlNlZWsoNyk7IC8vIHNlZWsgdG8gMTA3CisgIENoZWNrRXF1YWxzKChTdHJlYW0uTFQoMSkgYXMgSVRyZWUpLlRva2VuVHlwZSwxMDcpOworICBTdHJlYW0uQ29uc3VtZTsgLy8gY29uc3VtZSAxMDcKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgVVAKKyAgU3RyZWFtLkNvbnN1bWU7IC8vIGNvbnN1bWUgVVAKKyAgQ2hlY2tFcXVhbHMoKFN0cmVhbS5MVCgxKSBhcyBJVHJlZSkuVG9rZW5UeXBlLDEwNCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlRlc3RTaW5nbGVOb2RlOwordmFyCisgIFQ6IElUcmVlOworICBTdHJlYW06IElUcmVlTm9kZVN0cmVhbTsKK2JlZ2luCisgIFQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIFN0cmVhbSA6PSBDcmVhdGVDb21tb25UcmVlTm9kZVN0cmVhbShUKTsKKyAgQ2hlY2tFcXVhbHMoR2V0U3RyaW5nT2ZFbnRpcmVTdHJlYW1Db250ZW50c1dpdGhOb2RlVHlwZXNPbmx5KFN0cmVhbSksJyAxMDEnKTsKKyAgQ2hlY2tFcXVhbHMoU3RyZWFtLlRvU3RyaW5nLCAnIDEwMScpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElDb21tb25UcmVlTm9kZVN0cmVhbS5UZXN0U3RhY2tTdHJldGNoOwordmFyCisgIFIwOiBJQ29tbW9uVHJlZTsKKyAgU3RyZWFtOiBJQ29tbW9uVHJlZU5vZGVTdHJlYW07CisgIEk6IEludGVnZXI7CitiZWdpbgorICAvLyBtYWtlIG1vcmUgdGhhbiBJTklUSUFMX0NBTExfU1RBQ0tfU0laRSBwdXNoZXMKKyAgUjAgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRDb21tb25Ub2tlbi5DcmVhdGUoMTAxKSk7CisgIFN0cmVhbSA6PSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uQ3JlYXRlKFIwKTsKKworICAvLyBnbyAxIG92ZXIgaW5pdGlhbCBzaXplCisgIGZvciBJIDo9IDEgdG8gVENvbW1vblRyZWVOb2RlU3RyZWFtLklOSVRJQUxfQ0FMTF9TVEFDS19TSVpFICsgMSBkbworICAgIFN0cmVhbS5QdXNoKEkpOworCisgIENoZWNrRXF1YWxzKFN0cmVhbS5Qb3AsIDEwKTsKKyAgQ2hlY2tFcXVhbHMoU3RyZWFtLlBvcCwgOSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLkNyZWF0ZVRva2VuKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsKKyAgY29uc3QgVGV4dDogU3RyaW5nKTogSVRva2VuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoVG9rZW5UeXBlLCBUZXh0KTsKK2VuZDsKKworZnVuY3Rpb24gVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uQ3JlYXRlVG9rZW5MaXN0KAorICBjb25zdCBDb3VudDogSW50ZWdlcik6IElMaXN0PElUb2tlbj47Cit2YXIKKyAgSTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUTGlzdDxJVG9rZW4+LkNyZWF0ZTsKKyAgZm9yIEkgOj0gMCB0byBDb3VudCAtIDEgZG8KKyAgICBSZXN1bHQuQWRkKFRDb21tb25Ub2tlbi5DcmVhdGUoSSArIDEsJ3Rlc3QgdG9rZW4gJyArIEludFRvU3RyKEkgKyAxKQorICAgICAgKyAnIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCcpKTsKK2VuZDsKKworZnVuY3Rpb24gVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uQ3JlYXRlVHJlZShjb25zdCBUb2tlbjogSVRva2VuKTogSVRyZWU7CitiZWdpbgorICBSZXN1bHQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFRva2VuKTsKK2VuZDsKKworZnVuY3Rpb24gVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uQ3JlYXRlVHJlZUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uU2V0VXA7CitiZWdpbgorZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVhckRvd247CitiZWdpbgorZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVzdFJld3JpdGVSdWxlTm9kZVN0cmVhbUNvbnN0cnVjdG9yczsKK3ZhcgorICBOb2RlVGVzdDEsIE5vZGVUZXN0MiwgTm9kZVRlc3QzOiBJUmV3cml0ZVJ1bGVOb2RlU3RyZWFtOworYmVnaW4KKyAgTm9kZVRlc3QxIDo9IFRSZXdyaXRlUnVsZU5vZGVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLAorICAgICdSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdDEnKTsKKworICBOb2RlVGVzdDIgOj0gVFJld3JpdGVSdWxlTm9kZVN0cmVhbS5DcmVhdGUoQ3JlYXRlVHJlZUFkYXB0b3IsCisgICAgJ1Jld3JpdGVSdWxlTm9kZVN0cmVhbSB0ZXN0MicsCisgICAgQ3JlYXRlVG9rZW4oMSwndGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQnKSk7CisKKyAgTm9kZVRlc3QzIDo9IFRSZXdyaXRlUnVsZU5vZGVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLAorICAgICdSZXdyaXRlUnVsZU5vZGVTdHJlYW0gdGVzdDMnLCBDcmVhdGVUb2tlbkxpc3QoNCkpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVzdFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbUNvbnN0cnVjdG9yczsKK3ZhcgorICBTdWJ0cmVlVGVzdDEsIFN1YnRyZWVUZXN0MiwgU3VidHJlZVRlc3QzOiBJUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOworYmVnaW4KKyAgU3VidHJlZVRlc3QxIDo9IFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLAorICAgICdSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gdGVzdDEnKTsKKworICBTdWJ0cmVlVGVzdDIgOj0gVFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5DcmVhdGUoQ3JlYXRlVHJlZUFkYXB0b3IsCisgICAgJ1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0MicsCisgICAgQ3JlYXRlVG9rZW4oMSwndGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQnKSk7CisKKyAgU3VidHJlZVRlc3QzIDo9IFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLAorICAgICdSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gdGVzdDMnLCBDcmVhdGVUb2tlbkxpc3QoNCkpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW1Db25zdHJ1Y3RvcnM7Cit2YXIKKyAgVG9rZW5UZXN0MSwgVG9rZW5UZXN0MiwgVG9rZW5UZXN0MzogSVJld3JpdGVSdWxlVG9rZW5TdHJlYW07CitiZWdpbgorICBUb2tlblRlc3QxIDo9IFRSZXdyaXRlUnVsZVRva2VuU3RyZWFtLkNyZWF0ZShDcmVhdGVUcmVlQWRhcHRvciwKKyAgICAnUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB0ZXN0MScpOworCisgIFRva2VuVGVzdDIgOj0gVFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLAorICAgICdSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QyJywKKyAgICBDcmVhdGVUb2tlbigxLCAndGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQnKSk7CisKKyAgVG9rZW5UZXN0MyA6PSBUUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5DcmVhdGUoQ3JlYXRlVHJlZUFkYXB0b3IsCisgICAgJ1Jld3JpdGVSdWxlVG9rZW5TdHJlYW0gdGVzdDMnLCBDcmVhdGVUb2tlbkxpc3QoNCkpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVzdFJSTm9kZVN0cmVhbUJlaGF2aW91cldoaWxlRW1wdHkxOworY29uc3QKKyAgRGVzY3JpcHRpb24gPSAnUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIHRlc3QnOwordmFyCisgIE5vZGVUZXN0OiBJUmV3cml0ZVJ1bGVOb2RlU3RyZWFtOworYmVnaW4KKyAgRXhwZWN0ZWRFeGNlcHRpb24gOj0gRVJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbjsKKyAgTm9kZVRlc3QgOj0gVFJld3JpdGVSdWxlTm9kZVN0cmVhbS5DcmVhdGUoQ3JlYXRlVHJlZUFkYXB0b3IsIERlc2NyaXB0aW9uKTsKKworICBDaGVja0ZhbHNlKE5vZGVUZXN0Lkhhc05leHQpOworICBDaGVja0VxdWFscyhEZXNjcmlwdGlvbiwgTm9kZVRlc3QuRGVzY3JpcHRpb24pOworICBDaGVja0VxdWFscyhOb2RlVGVzdC5TaXplLCAwKTsKKyAgTm9kZVRlc3QuUmVzZXQ7CisgIENoZWNrRXF1YWxzKE5vZGVUZXN0LlNpemUsIDApOworICBOb2RlVGVzdC5OZXh0Tm9kZTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLlRlc3RSUk5vZGVTdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MjsKK2NvbnN0CisgIERlc2NyaXB0aW9uID0gJ1Jld3JpdGVSdWxlTm9kZVN0cmVhbSB0ZXN0JzsKK3ZhcgorICBOb2RlVGVzdDogSVJld3JpdGVSdWxlTm9kZVN0cmVhbTsKK2JlZ2luCisgIEV4cGVjdGVkRXhjZXB0aW9uIDo9IEVSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb247CisgIE5vZGVUZXN0IDo9IFRSZXdyaXRlUnVsZU5vZGVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLCBEZXNjcmlwdGlvbik7CisgIE5vZGVUZXN0Lk5leHRUcmVlOworZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVzdFJSTm9kZVN0cmVhbUJlaGF2aW91cldpdGhFbGVtZW50czsKK3ZhcgorICBOb2RlVGVzdDogSVJld3JpdGVSdWxlTm9kZVN0cmVhbTsKKyAgVG9rZW4xLCBUb2tlbjI6IElUb2tlbjsKKyAgVHJlZTEsIFRyZWUyOiBJVHJlZTsKKyAgUmV0dXJuZWRUcmVlOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEV4cGVjdGVkRXhjZXB0aW9uIDo9IEVSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb247CisgIE5vZGVUZXN0IDo9IFRSZXdyaXRlUnVsZU5vZGVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLCAnUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIHRlc3QnKTsKKyAgVG9rZW4xIDo9IENyZWF0ZVRva2VuKDEsICd0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCcpOworICBUcmVlMSA6PSBDcmVhdGVUcmVlKFRva2VuMSk7CisKKyAgLy8gVGVzdCBBZGQoKQorICBOb2RlVGVzdC5BZGQoVHJlZTEpOworICBDaGVja0VxdWFscyhOb2RlVGVzdC5TaXplLCAxKTsKKyAgQ2hlY2tUcnVlKE5vZGVUZXN0Lkhhc05leHQpOworCisgIC8vIFRlc3QgTmV4dE5vZGUoKQorICBSZXR1cm5lZFRyZWUgOj0gTm9kZVRlc3QuTmV4dE5vZGUgYXMgSUNvbW1vTlRyZWU7CisgIENoZWNrRXF1YWxzKFJldHVybmVkVHJlZS5Ub2tlblR5cGUsIFRyZWUxLlRva2VuVHlwZSk7CisgIENoZWNrRXF1YWxzKE5vZGVUZXN0LlNpemUsIDEpOworICBDaGVja0ZhbHNlKE5vZGVUZXN0Lkhhc05leHQpOworICBOb2RlVGVzdC5SZXNldDsKKyAgQ2hlY2tFcXVhbHMoTm9kZVRlc3QuU2l6ZSwgMSk7CisgIENoZWNrVHJ1ZShOb2RlVGVzdC5IYXNOZXh0KTsKKworICAvLyBUZXN0IE5leHRUcmVlKCkKKyAgUmV0dXJuZWRUcmVlIDo9IE5vZGVUZXN0Lk5leHRUcmVlIGFzIElDb21tb25UcmVlOworICBDaGVjayhTYW1lT2JqKFRva2VuMSwgUmV0dXJuZWRUcmVlLlRva2VuKSk7CisgIENoZWNrRXF1YWxzKE5vZGVUZXN0LlNpemUsIDEpOworICBDaGVja0ZhbHNlKE5vZGVUZXN0Lkhhc05leHQpOworICBOb2RlVGVzdC5SZXNldDsKKyAgQ2hlY2tFcXVhbHMoTm9kZVRlc3QuU2l6ZSwgMSk7CisgIENoZWNrVHJ1ZShOb2RlVGVzdC5IYXNOZXh0KTsKKworICAvLyBUZXN0LCB3aGF0IGhhcHBlbnMgd2l0aCB0d28gZWxlbWVudHMKKyAgVG9rZW4yIDo9IENyZWF0ZVRva2VuKDIsICd0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCcpOworICBUcmVlMiA6PSBDcmVhdGVUcmVlKFRva2VuMik7CisgIE5vZGVUZXN0LkFkZChUcmVlMik7CisgIENoZWNrRXF1YWxzKE5vZGVUZXN0LlNpemUsIDIpOworICBDaGVja1RydWUoTm9kZVRlc3QuSGFzTmV4dCk7CisgIFJldHVybmVkVHJlZSA6PSBOb2RlVGVzdC5OZXh0VHJlZSBhcyBJQ29tbW9uVHJlZTsKKyAgQ2hlY2soU2FtZU9iaihUb2tlbjEsIFJldHVybmVkVHJlZS5Ub2tlbikpOworICBDaGVja0VxdWFscyhOb2RlVGVzdC5TaXplLCAyKTsKKyAgQ2hlY2tUcnVlKE5vZGVUZXN0Lkhhc05leHQpOworICBSZXR1cm5lZFRyZWUgOj0gTm9kZVRlc3QuTmV4dFRyZWUgYXMgSUNvbW1vblRyZWU7CisgIENoZWNrKFNhbWVPYmooVG9rZW4yLCBSZXR1cm5lZFRyZWUuVG9rZW4pKTsKKyAgQ2hlY2tGYWxzZShOb2RlVGVzdC5IYXNOZXh0KTsKKworICAvLyBUZXN0IGV4Y2VwdGlvbgorICBOb2RlVGVzdC5OZXh0VHJlZTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLlRlc3RSUlN1YnRyZWVTdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MTsKK2NvbnN0CisgIERlc2NyaXB0aW9uID0gJ1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0JzsKK3ZhcgorICBTdWJ0cmVlVGVzdDogSVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTsKK2JlZ2luCisgIEV4cGVjdGVkRXhjZXB0aW9uIDo9IEVSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb247CisgIFN1YnRyZWVUZXN0IDo9IFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLCBEZXNjcmlwdGlvbik7CisKKyAgQ2hlY2tGYWxzZShTdWJ0cmVlVGVzdC5IYXNOZXh0KTsKKyAgQ2hlY2tFcXVhbHMoRGVzY3JpcHRpb24sIFN1YnRyZWVUZXN0LkRlc2NyaXB0aW9uKTsKKyAgQ2hlY2tFcXVhbHMoU3VidHJlZVRlc3QuU2l6ZSwgMCk7CisgIFN1YnRyZWVUZXN0LlJlc2V0OworICBDaGVja0VxdWFscyhTdWJ0cmVlVGVzdC5TaXplLCAwKTsKKyAgU3VidHJlZVRlc3QuTmV4dE5vZGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVJld3JpdGVSdWxlWHh4eFN0cmVhbS5UZXN0UlJTdWJ0cmVlU3RyZWFtQmVoYXZpb3VyV2hpbGVFbXB0eTI7Citjb25zdAorICBEZXNjcmlwdGlvbiA9ICdSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gdGVzdCc7Cit2YXIKKyAgU3VidHJlZVRlc3Q6IElSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW07CitiZWdpbgorICBFeHBlY3RlZEV4Y2VwdGlvbiA6PSBFUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uOworICBTdWJ0cmVlVGVzdCA6PSBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkNyZWF0ZShDcmVhdGVUcmVlQWRhcHRvciwgRGVzY3JpcHRpb24pOworICBTdWJ0cmVlVGVzdC5OZXh0VHJlZTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLlRlc3RSUlN1YnRyZWVTdHJlYW1CZWhhdmlvdXJXaXRoRWxlbWVudHM7Cit2YXIKKyAgU3VidHJlZVRlc3Q6IElSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW07CisgIFRva2VuMSwgVG9rZW4yOiBJVG9rZW47CisgIFRyZWUxLCBUcmVlMjogSVRyZWU7CisgIFJldHVybmVkVHJlZTogSUNvbW1vblRyZWU7CitiZWdpbgorICBFeHBlY3RlZEV4Y2VwdGlvbiA6PSBFUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uOworICBTdWJ0cmVlVGVzdCA6PSBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkNyZWF0ZShDcmVhdGVUcmVlQWRhcHRvciwgJ1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB0ZXN0Jyk7CisgIFRva2VuMSA6PSBDcmVhdGVUb2tlbigxLCAndGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQnKTsKKyAgVHJlZTEgOj0gQ3JlYXRlVHJlZShUb2tlbjEpOworCisgIC8vIFRlc3QgQWRkKCkKKyAgU3VidHJlZVRlc3QuQWRkKFRyZWUxKTsKKyAgQ2hlY2tFcXVhbHMoU3VidHJlZVRlc3QuU2l6ZSwgMSk7CisgIENoZWNrVHJ1ZShTdWJ0cmVlVGVzdC5IYXNOZXh0KTsKKworICAvLyBUZXN0IE5leHROb2RlKCkKKyAgQ2hlY2soU2FtZU9iaihTdWJ0cmVlVGVzdC5OZXh0Tm9kZSwgVHJlZTEpKTsKKyAgQ2hlY2tFcXVhbHMoU3VidHJlZVRlc3QuU2l6ZSwgMSk7CisgIENoZWNrRmFsc2UoU3VidHJlZVRlc3QuSGFzTmV4dCk7CisgIFN1YnRyZWVUZXN0LlJlc2V0OworICBDaGVja0VxdWFscyhTdWJ0cmVlVGVzdC5TaXplLCAxKTsKKyAgQ2hlY2tUcnVlKFN1YnRyZWVUZXN0Lkhhc05leHQpOworCisgIC8vIFRlc3QgTmV4dFRyZWUoKQorICBSZXR1cm5lZFRyZWUgOj0gU3VidHJlZVRlc3QuTmV4dFRyZWUgYXMgSUNvbW1vblRyZWU7CisgIENoZWNrKFNhbWVPYmooVG9rZW4xLCBSZXR1cm5lZFRyZWUuVG9rZW4pKTsKKyAgQ2hlY2tFcXVhbHMoU3VidHJlZVRlc3QuU2l6ZSwgMSk7CisgIENoZWNrRmFsc2UoU3VidHJlZVRlc3QuSGFzTmV4dCk7CisgIFN1YnRyZWVUZXN0LlJlc2V0OworICBDaGVja0VxdWFscyhTdWJ0cmVlVGVzdC5TaXplLCAxKTsKKyAgQ2hlY2tUcnVlKFN1YnRyZWVUZXN0Lkhhc05leHQpOworCisgIC8vIFRlc3QsIHdoYXQgaGFwcGVucyB3aXRoIHR3byBlbGVtZW50cworICBUb2tlbjIgOj0gQ3JlYXRlVG9rZW4oMiwgJ3Rlc3QgdG9rZW4gd2l0aG91dCBhbnkgcmVhbCBjb250ZXh0Jyk7CisgIFRyZWUyIDo9IENyZWF0ZVRyZWUoVG9rZW4yKTsKKyAgU3VidHJlZVRlc3QuQWRkKFRyZWUyKTsKKyAgQ2hlY2tFcXVhbHMoU3VidHJlZVRlc3QuU2l6ZSwgMik7CisgIENoZWNrVHJ1ZShTdWJ0cmVlVGVzdC5IYXNOZXh0KTsKKyAgUmV0dXJuZWRUcmVlIDo9IFN1YnRyZWVUZXN0Lk5leHRUcmVlIGFzIElDb21tb25UcmVlOworICBDaGVjayhTYW1lT2JqKFRva2VuMSwgUmV0dXJuZWRUcmVlLlRva2VuKSk7CisgIENoZWNrRXF1YWxzKFN1YnRyZWVUZXN0LlNpemUsIDIpOworICBDaGVja1RydWUoU3VidHJlZVRlc3QuSGFzTmV4dCk7CisgIFJldHVybmVkVHJlZSA6PSBTdWJ0cmVlVGVzdC5OZXh0VHJlZSBhcyBJQ29tbW9uVHJlZTsKKyAgQ2hlY2soU2FtZU9iaihUb2tlbjIsIFJldHVybmVkVHJlZS5Ub2tlbikpOworICBDaGVja0ZhbHNlKFN1YnRyZWVUZXN0Lkhhc05leHQpOworCisgIC8vIFRlc3QgZXhjZXB0aW9uCisgIFN1YnRyZWVUZXN0Lk5leHRUcmVlOworZW5kOworCitwcm9jZWR1cmUgVGVzdElSZXdyaXRlUnVsZVh4eHhTdHJlYW0uVGVzdFJSVG9rZW5TdHJlYW1CZWhhdmlvdXJXaGlsZUVtcHR5MTsKK2NvbnN0CisgIERlc2NyaXB0aW9uID0gJ1Jld3JpdGVSdWxlVG9rZW5TdHJlYW0gdGVzdCc7Cit2YXIKKyAgVG9rZW5UZXN0OiBJUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKK2JlZ2luCisgIEV4cGVjdGVkRXhjZXB0aW9uIDo9IEVSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb247CisgIFRva2VuVGVzdCA6PSBUUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5DcmVhdGUoQ3JlYXRlVHJlZUFkYXB0b3IsIERlc2NyaXB0aW9uKTsKKworICBDaGVja0ZhbHNlKFRva2VuVGVzdC5IYXNOZXh0KTsKKyAgQ2hlY2tFcXVhbHMoRGVzY3JpcHRpb24sIFRva2VuVGVzdC5EZXNjcmlwdGlvbik7CisgIENoZWNrRXF1YWxzKFRva2VuVGVzdC5TaXplLCAwKTsKKyAgVG9rZW5UZXN0LlJlc2V0OworICBDaGVja0VxdWFscyhUb2tlblRlc3QuU2l6ZSwgMCk7CisgIFRva2VuVGVzdC5OZXh0Tm9kZTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLlRlc3RSUlRva2VuU3RyZWFtQmVoYXZpb3VyV2hpbGVFbXB0eTI7Citjb25zdAorICBEZXNjcmlwdGlvbiA9ICdSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QnOwordmFyCisgIFRva2VuVGVzdDogSVJld3JpdGVSdWxlVG9rZW5TdHJlYW07CitiZWdpbgorICBFeHBlY3RlZEV4Y2VwdGlvbiA6PSBFUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uOworICBUb2tlblRlc3QgOj0gVFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLCBEZXNjcmlwdGlvbik7CisgIFRva2VuVGVzdC5OZXh0VHJlZTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLlRlc3RSUlRva2VuU3RyZWFtQmVoYXZpb3VyV2hpbGVFbXB0eTM7Citjb25zdAorICBEZXNjcmlwdGlvbiA9ICdSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QnOwordmFyCisgIFRva2VuVGVzdDogSVJld3JpdGVSdWxlVG9rZW5TdHJlYW07CitiZWdpbgorICBFeHBlY3RlZEV4Y2VwdGlvbiA6PSBFUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uOworICBUb2tlblRlc3QgOj0gVFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uQ3JlYXRlKENyZWF0ZVRyZWVBZGFwdG9yLCBEZXNjcmlwdGlvbik7CisgIFRva2VuVGVzdC5OZXh0VG9rZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVJld3JpdGVSdWxlWHh4eFN0cmVhbS5UZXN0UlJUb2tlblN0cmVhbUJlaGF2aW91cldpdGhFbGVtZW50czsKK3ZhcgorICBUb2tlblRlc3Q6IElSZXdyaXRlUnVsZVRva2VuU3RyZWFtOworICBUb2tlbjEsIFRva2VuMiwgUmV0dXJuZWRUb2tlbjogSVRva2VuOworICBUcmVlOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEV4cGVjdGVkRXhjZXB0aW9uIDo9IEVSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb247CisgIFRva2VuVGVzdCA6PSBUUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5DcmVhdGUoQ3JlYXRlVHJlZUFkYXB0b3IsICdSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHRlc3QnKTsKKyAgVG9rZW4xIDo9IENyZWF0ZVRva2VuKDEsICd0ZXN0IHRva2VuIHdpdGhvdXQgYW55IHJlYWwgY29udGV4dCcpOworCisgIC8vIFRlc3QgQWRkKCkKKyAgVG9rZW5UZXN0LkFkZChUb2tlbjEpOworICBDaGVja0VxdWFscyhUb2tlblRlc3QuU2l6ZSwgMSk7CisgIENoZWNrVHJ1ZShUb2tlblRlc3QuSGFzTmV4dCk7CisKKyAgLy8gVGVzdCBOZXh0Tm9kZSgpCisgIFRyZWUgOj0gVG9rZW5UZXN0Lk5leHROb2RlIGFzIElDb21tb25UcmVlOworICBDaGVjayhTYW1lT2JqKFRyZWUuVG9rZW4sIFRva2VuMSkpOworICBDaGVja0VxdWFscyhUb2tlblRlc3QuU2l6ZSwgMSk7CisgIENoZWNrRmFsc2UoVG9rZW5UZXN0Lkhhc05leHQpOworICBUb2tlblRlc3QuUmVzZXQ7CisgIENoZWNrRXF1YWxzKFRva2VuVGVzdC5TaXplLCAxKTsKKyAgQ2hlY2tUcnVlKFRva2VuVGVzdC5IYXNOZXh0KTsKKworICAvLyBUZXN0IE5leHRUb2tlbigpCisgIFJldHVybmVkVG9rZW4gOj0gVG9rZW5UZXN0Lk5leHRUb2tlbjsKKyAgQ2hlY2soU2FtZU9iaihUb2tlbjEsIFJldHVybmVkVG9rZW4pKTsKKyAgQ2hlY2tFcXVhbHMoVG9rZW5UZXN0LlNpemUsIDEpOworICBDaGVja0ZhbHNlKFRva2VuVGVzdC5IYXNOZXh0KTsKKyAgVG9rZW5UZXN0LlJlc2V0OworICBDaGVja0VxdWFscyhUb2tlblRlc3QuU2l6ZSwgMSk7CisgIENoZWNrVHJ1ZShUb2tlblRlc3QuSGFzTmV4dCk7CisKKyAgLy8gVGVzdCBOZXh0VHJlZSgpCisgIFJldHVybmVkVG9rZW4gOj0gVG9rZW5UZXN0Lk5leHRUcmVlIGFzIElUb2tlbjsKKyAgQ2hlY2soU2FtZU9iaihUb2tlbjEsIFJldHVybmVkVG9rZW4pKTsKKyAgQ2hlY2tFcXVhbHMoVG9rZW5UZXN0LlNpemUsIDEpOworICBDaGVja0ZhbHNlKFRva2VuVGVzdC5IYXNOZXh0KTsKKyAgVG9rZW5UZXN0LlJlc2V0OworICBDaGVja0VxdWFscyhUb2tlblRlc3QuU2l6ZSwgMSk7CisgIENoZWNrVHJ1ZShUb2tlblRlc3QuSGFzTmV4dCk7CisKKyAgLy8gVGVzdCwgd2hhdCBoYXBwZW5zIHdpdGggdHdvIGVsZW1lbnRzCisgIFRva2VuMiA6PSBDcmVhdGVUb2tlbigyLCAndGVzdCB0b2tlbiB3aXRob3V0IGFueSByZWFsIGNvbnRleHQnKTsKKyAgVG9rZW5UZXN0LkFkZChUb2tlbjIpOworICBDaGVja0VxdWFscyhUb2tlblRlc3QuU2l6ZSwgMik7CisgIENoZWNrVHJ1ZShUb2tlblRlc3QuSGFzTmV4dCk7CisgIFJldHVybmVkVG9rZW4gOj0gVG9rZW5UZXN0Lk5leHRUb2tlbjsKKyAgQ2hlY2soU2FtZU9iaihUb2tlbjEsIFJldHVybmVkVG9rZW4pKTsKKyAgQ2hlY2tFcXVhbHMoVG9rZW5UZXN0LlNpemUsIDIpOworICBDaGVja1RydWUoVG9rZW5UZXN0Lkhhc05leHQpOworICBSZXR1cm5lZFRva2VuIDo9IFRva2VuVGVzdC5OZXh0VG9rZW47CisgIENoZWNrKFNhbWVPYmooVG9rZW4yLCBSZXR1cm5lZFRva2VuKSk7CisgIENoZWNrRmFsc2UoVG9rZW5UZXN0Lkhhc05leHQpOworCisgIC8vIFRlc3QgZXhjZXB0aW9uCisgIFRva2VuVGVzdC5OZXh0VG9rZW47CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRlc3RJVHJlZVdpemFyZC5DcmVhdGUoTWV0aG9kTmFtZTogU3RyaW5nKTsKK2NvbnN0CisgIFRPS0VOUzogYXJyYXkgWzAuLjExXSBvZiBTdHJpbmcgPSAoJycsICcnLCAnJywgJycsICcnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0lEJywgJ1ZBUicpOwordmFyCisgIEk6IEludGVnZXI7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIFNldExlbmd0aChGVG9rZW5zLExlbmd0aChUT0tFTlMpKTsKKyAgZm9yIEkgOj0gMCB0byBMZW5ndGgoVE9LRU5TKSAtIDEgZG8KKyAgICBGVG9rZW5zW0ldIDo9IFRPS0VOU1tJXTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5TZXRVcDsKK2JlZ2luCitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVhckRvd247CitiZWdpbgorZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3REb3VibGVMZXZlbFRyZWU7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgKEIgQykgKEIgRCkgRSknKSBhcyBJQ29tbW9uVHJlZTsKKyAgQ2hlY2tFcXVhbHMoVC5Ub1N0cmluZ1RyZWUsICcoQSAoQiBDKSAoQiBEKSBFKScpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RFcXVhbHM7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUMSwgVDI6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUMSA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDKScpIGFzIElDb21tb25UcmVlOworICBUMiA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDKScpIGFzIElDb21tb25UcmVlOworICBDaGVja1RydWUoV2l6LkVxdWFscyhUMSwgVDIsIEFkYXB0b3IpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0RXF1YWxzV2l0aE1pc21hdGNoZWRUZXh0OwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDEsIFQyOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVDEgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEJbZm9vXSBDKScpIGFzIElDb21tb25UcmVlOworICBUMiA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDKScpIGFzIElDb21tb25UcmVlOworICBDaGVja0ZhbHNlKFdpei5FcXVhbHMoVDEsIFQyLCBBZGFwdG9yKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdEVxdWFsc1dpdGhUZXh0OwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDEsIFQyOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVDEgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEJbZm9vXSBDKScpIGFzIElDb21tb25UcmVlOworICBUMiA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQltmb29dIEMpJykgYXMgSUNvbW1vblRyZWU7CisgIENoZWNrVHJ1ZShXaXouRXF1YWxzKFQxLCBUMiwgQWRhcHRvcikpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RGaW5kUGF0dGVybjsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBTdWJ0cmVlcywgRWxlbWVudHM6IElMaXN0PElBTlRMUkludGVyZmFjZT47CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgQyAoQVtmb29dIEJbYmFyXSkgKEQgKEFbYmlnXSBCW2RvZ10pKSknKSBhcyBJQ29tbW9uVHJlZTsKKyAgU3VidHJlZXMgOj0gV2l6LkZpbmQoVCwgJyhBIEIpJyk7CisgIEVsZW1lbnRzIDo9IFN1YnRyZWVzOworICBDaGVja0VxdWFscygnW2ZvbywgYmlnXScsIFRDb2xsZWN0aW9uVXRpbHMuTGlzdFRvU3RyaW5nKEVsZW1lbnRzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdEludmFsaWRMaXN0VHJlZTsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCdBIEIgQycpIGFzIElDb21tb25UcmVlOworICBDaGVja051bGwoVCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdExpc3RUcmVlOwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhuaWwgQSBCIEMpJykgYXMgSUNvbW1vblRyZWU7CisgIENoZWNrRXF1YWxzKFQuVG9TdHJpbmdUcmVlLCAnQSBCIEMnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0Tm9SZXBlYXRzSW5kZXg7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKKyAgTTogSURpY3Rpb25hcnk8SW50ZWdlciwgSUxpc3Q8SUFOVExSSW50ZXJmYWNlPj47CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgQyBEKScpIGFzIElDb21tb25UcmVlOworICBNIDo9IFdpei5JbmRleChUKTsKKyAgQ2hlY2tFcXVhbHMoJ3s1PVtBXSwgOD1bRF0sIDc9W0NdLCA2PVtCXX0nICxUQ29sbGVjdGlvblV0aWxzLkRpY3Rpb25hcnlUb1N0cmluZyhNKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdE5vUmVwZWF0c1Zpc2l0OwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworICBWaXNpdG9yOiBJQ29udGV4dFZpc2l0b3I7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgQyBEKScpIGFzIElDb21tb25UcmVlOworICBFbGVtZW50cyA6PSBUTGlzdDxJQU5UTFJJbnRlcmZhY2U+LkNyZWF0ZTsKKyAgVmlzaXRvciA6PSBUUmVjb3JkQWxsRWxlbWVudHNWaXNpdG9yLkNyZWF0ZShFbGVtZW50cyk7CisgIFdpei5WaXNpdChULCBXaXouR2V0VG9rZW5UeXBlKCdCJyksIFZpc2l0b3IpOworICBDaGVja0VxdWFscygnW0JdJyAsVENvbGxlY3Rpb25VdGlscy5MaXN0VG9TdHJpbmcoRWxlbWVudHMpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0Tm9SZXBlYXRzVmlzaXQyOwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworICBWaXNpdG9yOiBJQ29udGV4dFZpc2l0b3I7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgKEEgQyBCKSBCIEQgRCknKSBhcyBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHMgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgIFZpc2l0b3IgOj0gVFJlY29yZEFsbEVsZW1lbnRzVmlzaXRvci5DcmVhdGUoRWxlbWVudHMpOworICBXaXouVmlzaXQoVCwgV2l6LkdldFRva2VuVHlwZSgnQycpLCBWaXNpdG9yKTsKKyAgQ2hlY2tFcXVhbHMoJ1tDXScgLFRDb2xsZWN0aW9uVXRpbHMuTGlzdFRvU3RyaW5nKEVsZW1lbnRzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFBhcnNlOwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgQyknKSBhcyBJQ29tbW9uVHJlZTsKKyAgQ2hlY2tUcnVlKFdpei5QYXJzZShULCAnKEEgQiBDKScpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0UGFyc2VGbGF0VHJlZTsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCcobmlsIEEgQiBDKScpIGFzIElDb21tb25UcmVlOworICBDaGVja1RydWUoV2l6LlBhcnNlKFQsICcobmlsIEEgQiBDKScpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0UGFyc2VMYWJlbHM7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKKyAgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT47CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgQyknKSBhcyBJQ29tbW9uVHJlZTsKKyAgTGFiZWxzIDo9IFREaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgIENoZWNrVHJ1ZShXaXouUGFyc2UoVCwgJyglYTpBICViOkIgJWM6QyknLCBMYWJlbHMpKTsKKyAgQ2hlY2tFcXVhbHMoJ0EnLCBMYWJlbHNbJ2EnXS5Ub1N0cmluZyk7CisgIENoZWNrRXF1YWxzKCdCJywgTGFiZWxzWydiJ10uVG9TdHJpbmcpOworICBDaGVja0VxdWFscygnQycsIExhYmVsc1snYyddLlRvU3RyaW5nKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0UGFyc2VMYWJlbHNBbmRUZXN0VGV4dDsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQltmb29dIEMpJykgYXMgSUNvbW1vblRyZWU7CisgIExhYmVscyA6PSBURGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICBDaGVja1RydWUoV2l6LlBhcnNlKFQsICcoJWE6QSAlYjpCW2Zvb10gJWM6QyknLCBMYWJlbHMpKTsKKyAgQ2hlY2tFcXVhbHMoJ0EnLCBMYWJlbHNbJ2EnXS5Ub1N0cmluZyk7CisgIENoZWNrRXF1YWxzKCdmb28nLCBMYWJlbHNbJ2InXS5Ub1N0cmluZyk7CisgIENoZWNrRXF1YWxzKCdDJywgTGFiZWxzWydjJ10uVG9TdHJpbmcpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RQYXJzZUxhYmVsc0luTmVzdGVkVHJlZTsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgKEIgQykgKEQgRSkpJykgYXMgSUNvbW1vblRyZWU7CisgIExhYmVscyA6PSBURGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICBDaGVja1RydWUoV2l6LlBhcnNlKFQsICcoJWE6QSAoJWI6QiAlYzpDKSAoJWQ6RCAlZTpFKSApJywgTGFiZWxzKSk7CisgIENoZWNrRXF1YWxzKCdBJywgTGFiZWxzWydhJ10uVG9TdHJpbmcpOworICBDaGVja0VxdWFscygnQicsIExhYmVsc1snYiddLlRvU3RyaW5nKTsKKyAgQ2hlY2tFcXVhbHMoJ0MnLCBMYWJlbHNbJ2MnXS5Ub1N0cmluZyk7CisgIENoZWNrRXF1YWxzKCdEJywgTGFiZWxzWydkJ10uVG9TdHJpbmcpOworICBDaGVja0VxdWFscygnRScsIExhYmVsc1snZSddLlRvU3RyaW5nKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0UGFyc2VTaW5nbGVOb2RlOwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJ0EnKSBhcyBJQ29tbW9uVHJlZTsKKyAgQ2hlY2tUcnVlKFdpei5QYXJzZShULCAnQScpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0UGFyc2VXaXRoVGV4dDsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCcoQSBCW2Zvb10gQ1tiYXJdKScpIGFzIElDb21tb25UcmVlOworICAvLyBDIHBhdHRlcm4gaGFzIG5vIHRleHQgYXJnIHNvIGRlc3BpdGUgW2Jhcl0gaW4gdCwgbm8gbmVlZAorICAvLyB0byBtYXRjaCB0ZXh0LS1jaGVjayBzdHJ1Y3R1cmUgb25seS4KKyAgQ2hlY2tUcnVlKFdpei5QYXJzZShULCAnKEEgQltmb29dIEMpJykpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RQYXJzZVdpdGhUZXh0RmFpbHM7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDKScpIGFzIElDb21tb25UcmVlOworICBDaGVja0ZhbHNlKFdpei5QYXJzZShULCAnKEFbZm9vXSBCIEMpJykpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RQYXJzZVdpdGhXaWxkY2FyZExhYmVsczsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDKScpIGFzIElDb21tb25UcmVlOworICBMYWJlbHMgOj0gVERpY3Rpb25hcnk8U3RyaW5nLCBJQU5UTFJJbnRlcmZhY2U+LkNyZWF0ZTsKKyAgQ2hlY2tUcnVlKFdpei5QYXJzZShULCAnKEEgJWI6LiAlYzouKScsIExhYmVscykpOworICBDaGVja0VxdWFscygnQicsIExhYmVsc1snYiddLlRvU3RyaW5nKTsKKyAgQ2hlY2tFcXVhbHMoJ0MnLCBMYWJlbHNbJ2MnXS5Ub1N0cmluZyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFJlcGVhdHNJbmRleDsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBNOiBJRGljdGlvbmFyeTxJbnRlZ2VyLCBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+PjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiAoQSBDIEIpIEIgRCBEKScpIGFzIElDb21tb25UcmVlOworICBNIDo9IFdpei5JbmRleChUKTsKKyAgQ2hlY2tFcXVhbHMoJ3s1PVtBLCBBXSwgOD1bRCwgRF0sIDc9W0NdLCA2PVtCLCBCLCBCXX0nICxUQ29sbGVjdGlvblV0aWxzLkRpY3Rpb25hcnlUb1N0cmluZyhNKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFJlcGVhdHNWaXNpdDsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBFbGVtZW50czogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsKKyAgVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCcoQSBCIChBIEMgQikgQiBEIEQpJykgYXMgSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzIDo9IFRMaXN0PElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICBWaXNpdG9yIDo9IFRSZWNvcmRBbGxFbGVtZW50c1Zpc2l0b3IuQ3JlYXRlKEVsZW1lbnRzKTsKKyAgV2l6LlZpc2l0KFQsIFdpei5HZXRUb2tlblR5cGUoJ0InKSwgVmlzaXRvcik7CisgIENoZWNrRXF1YWxzKCdbQiwgQiwgQl0nICxUQ29sbGVjdGlvblV0aWxzLkxpc3RUb1N0cmluZyhFbGVtZW50cykpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RSZXBlYXRzVmlzaXQyOwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworICBWaXNpdG9yOiBJQ29udGV4dFZpc2l0b3I7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgKEEgQyBCKSBCIEQgRCknKSBhcyBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHMgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgIFZpc2l0b3IgOj0gVFJlY29yZEFsbEVsZW1lbnRzVmlzaXRvci5DcmVhdGUoRWxlbWVudHMpOworICBXaXouVmlzaXQoVCwgV2l6LkdldFRva2VuVHlwZSgnQScpLCBWaXNpdG9yKTsKKyAgQ2hlY2tFcXVhbHMoJ1tBLCBBXScgLFRDb2xsZWN0aW9uVXRpbHMuTGlzdFRvU3RyaW5nKEVsZW1lbnRzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFJlcGVhdHNWaXNpdFdpdGhDb250ZXh0OwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworICBWaXNpdG9yOiBJQ29udGV4dFZpc2l0b3I7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBIEIgKEEgQyBCKSBCIEQgRCknKSBhcyBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHMgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgIFZpc2l0b3IgOj0gVFRlc3QxQ29udGV4dFZpc2l0b3IuQ3JlYXRlKEFkYXB0b3IsIEVsZW1lbnRzKTsKKyAgV2l6LlZpc2l0KFQsIFdpei5HZXRUb2tlblR5cGUoJ0InKSwgVmlzaXRvcik7CisgIENoZWNrRXF1YWxzKCdbQkBBWzBdLCBCQEFbMV0sIEJAQVsyXV0nLCBUQ29sbGVjdGlvblV0aWxzLkxpc3RUb1N0cmluZyhFbGVtZW50cykpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RSZXBlYXRzVmlzaXRXaXRoTnVsbFBhcmVudEFuZENvbnRleHQ7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHM6IElMaXN0PElBTlRMUkludGVyZmFjZT47CisgIFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiAoQSBDIEIpIEIgRCBEKScpIGFzIElDb21tb25UcmVlOworICBFbGVtZW50cyA6PSBUTGlzdDxJQU5UTFJJbnRlcmZhY2U+LkNyZWF0ZTsKKyAgVmlzaXRvciA6PSBUVGVzdDFDb250ZXh0VmlzaXRvci5DcmVhdGUoQWRhcHRvciwgRWxlbWVudHMpOworICBXaXouVmlzaXQoVCwgV2l6LkdldFRva2VuVHlwZSgnQScpLCBWaXNpdG9yKTsKKyAgQ2hlY2tFcXVhbHMoJ1tBQG5pbFswXSwgQUBBWzFdXScsIFRDb2xsZWN0aW9uVXRpbHMuTGlzdFRvU3RyaW5nKEVsZW1lbnRzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFNpbmdsZUxldmVsVHJlZTsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCcoQSBCIEMgRCknKSBhcyBJQ29tbW9uVHJlZTsKKyAgQ2hlY2tFcXVhbHMoVC5Ub1N0cmluZ1RyZWUsICcoQSBCIEMgRCknKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0U2luZ2xlTm9kZTsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCdJRCcpIGFzIElDb21tb25UcmVlOworICBDaGVja0VxdWFscyhULlRvU3RyaW5nVHJlZSwgJ0lEJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFNpbmdsZU5vZGVJbmRleDsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBNOiBJRGljdGlvbmFyeTxJbnRlZ2VyLCBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+PjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnSUQnKSBhcyBJQ29tbW9uVHJlZTsKKyAgTSA6PSBXaXouSW5kZXgoVCk7CisgIENoZWNrRXF1YWxzKCd7MTA9W0lEXX0nICxUQ29sbGVjdGlvblV0aWxzLkRpY3Rpb25hcnlUb1N0cmluZyhNKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFNpbmdsZU5vZGVUcmVlOwordmFyCisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgV2l6OiBJVHJlZVdpemFyZDsKKyAgVDogSUNvbW1vblRyZWU7CitiZWdpbgorICBBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7CisgIFdpeiA6PSBUVHJlZVdpemFyZC5DcmVhdGUoQWRhcHRvciwgRlRva2Vucyk7CisgIFQgOj0gV2l6LkNyZWF0ZVRyZWVPck5vZGUoJyhBKScpIGFzIElDb21tb25UcmVlOworICBDaGVja0VxdWFscyhULlRvU3RyaW5nVHJlZSwgJ0EnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0U2luZ2xlTm9kZVdpdGhBcmc7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnSURbZm9vXScpIGFzIElDb21tb25UcmVlOworICBDaGVja0VxdWFscyhULlRvU3RyaW5nVHJlZSwgJ2ZvbycpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RWaXNpdFBhdHRlcm47Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHM6IElMaXN0PElBTlRMUkludGVyZmFjZT47CisgIFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDIChBIEIpIEQpJykgYXMgSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzIDo9IFRMaXN0PElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICBWaXNpdG9yIDo9IFRSZWNvcmRBbGxFbGVtZW50c1Zpc2l0b3IuQ3JlYXRlKEVsZW1lbnRzKTsKKyAgV2l6LlZpc2l0KFQsICcoQSBCKScsIFZpc2l0b3IpOworICBDaGVja0VxdWFscygnW0FdJywgVENvbGxlY3Rpb25VdGlscy5MaXN0VG9TdHJpbmcoRWxlbWVudHMpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UZXN0VmlzaXRQYXR0ZXJuTXVsdGlwbGU7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBXaXo6IElUcmVlV2l6YXJkOworICBUOiBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHM6IElMaXN0PElBTlRMUkludGVyZmFjZT47CisgIFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcjsKK2JlZ2luCisgIEFkYXB0b3IgOj0gVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZTsKKyAgV2l6IDo9IFRUcmVlV2l6YXJkLkNyZWF0ZShBZGFwdG9yLCBGVG9rZW5zKTsKKyAgVCA6PSBXaXouQ3JlYXRlVHJlZU9yTm9kZSgnKEEgQiBDIChBIEIpIChEIChBIEIpKSknKSBhcyBJQ29tbW9uVHJlZTsKKyAgRWxlbWVudHMgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgIFZpc2l0b3IgOj0gVFRlc3QxQ29udGV4dFZpc2l0b3IuQ3JlYXRlKEFkYXB0b3IsIEVsZW1lbnRzKTsKKyAgV2l6LlZpc2l0KFQsICcoQSBCKScsIFZpc2l0b3IpOworICBDaGVja0VxdWFscygnW0FAQVsyXSwgQUBEWzBdXScsIFRDb2xsZWN0aW9uVXRpbHMuTGlzdFRvU3RyaW5nKEVsZW1lbnRzKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUZXN0SVRyZWVXaXphcmQuVGVzdFZpc2l0UGF0dGVybk11bHRpcGxlV2l0aExhYmVsczsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworICBFbGVtZW50czogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsKKyAgVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCcoQSBCIEMgKEFbZm9vXSBCW2Jhcl0pIChEIChBW2JpZ10gQltkb2ddKSkpJykgYXMgSUNvbW1vblRyZWU7CisgIEVsZW1lbnRzIDo9IFRMaXN0PElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICBWaXNpdG9yIDo9IFRUZXN0MkNvbnRleHRWaXNpdG9yLkNyZWF0ZShBZGFwdG9yLCBFbGVtZW50cyk7CisgIFdpei5WaXNpdChULCAnKCVhOkEgJWI6QiknLCBWaXNpdG9yKTsKKyAgQ2hlY2tFcXVhbHMoJ1tmb29AQVsyXWZvbyZiYXIsIGJpZ0BEWzBdYmlnJmRvZ10nLCBUQ29sbGVjdGlvblV0aWxzLkxpc3RUb1N0cmluZyhFbGVtZW50cykpOworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRlc3RXaWxkY2FyZDsKK3ZhcgorICBBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIFdpejogSVRyZWVXaXphcmQ7CisgIFQ6IElDb21tb25UcmVlOworYmVnaW4KKyAgQWRhcHRvciA6PSBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlOworICBXaXogOj0gVFRyZWVXaXphcmQuQ3JlYXRlKEFkYXB0b3IsIEZUb2tlbnMpOworICBUIDo9IFdpei5DcmVhdGVUcmVlT3JOb2RlKCcoQSBCIEMpJykgYXMgSUNvbW1vblRyZWU7CisgIENoZWNrVHJ1ZShXaXouUGFyc2UoVCwgJyhBIC4gLiknKSk7CitlbmQ7CisKK3sgVGVzdElUcmVlV2l6YXJkLlRSZWNvcmRBbGxFbGVtZW50c1Zpc2l0b3IgfQorCitjb25zdHJ1Y3RvciBUZXN0SVRyZWVXaXphcmQuVFJlY29yZEFsbEVsZW1lbnRzVmlzaXRvci5DcmVhdGUoCisgIGNvbnN0IEFMaXN0OiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZMaXN0IDo9IEFMaXN0OworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRSZWNvcmRBbGxFbGVtZW50c1Zpc2l0b3IuVmlzaXQoCisgIGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBGTGlzdC5BZGQoVCk7CitlbmQ7CisKK3sgVGVzdElUcmVlV2l6YXJkLlRUZXN0MUNvbnRleHRWaXNpdG9yIH0KKworY29uc3RydWN0b3IgVGVzdElUcmVlV2l6YXJkLlRUZXN0MUNvbnRleHRWaXNpdG9yLkNyZWF0ZSgKKyAgY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsgY29uc3QgQUxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkFkYXB0b3IgOj0gQUFkYXB0b3I7CisgIEZMaXN0IDo9IEFMaXN0OworZW5kOworCitwcm9jZWR1cmUgVGVzdElUcmVlV2l6YXJkLlRUZXN0MUNvbnRleHRWaXNpdG9yLlZpc2l0KGNvbnN0IFQsCisgIFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBDaGlsZEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPik7Cit2YXIKKyAgUzogU3RyaW5nOworYmVnaW4KKyAgUyA6PSBGQWRhcHRvci5HZXROb2RlVGV4dChUKSArICdAJzsKKyAgaWYgQXNzaWduZWQoUGFyZW50KSB0aGVuCisgICAgUyA6PSBTICsgRkFkYXB0b3IuR2V0Tm9kZVRleHQoUGFyZW50KQorICBlbHNlCisgICAgUyA6PSBTICsgJ25pbCc7CisgIEZMaXN0LkFkZChUQU5UTFJTdHJpbmcuQ3JlYXRlKFMgKyAnWycgKyBJbnRUb1N0cihDaGlsZEluZGV4KSArICddJykpOworZW5kOworCit7IFRlc3RJVHJlZVdpemFyZC5UVGVzdDJDb250ZXh0VmlzaXRvciB9CisKK2NvbnN0cnVjdG9yIFRlc3RJVHJlZVdpemFyZC5UVGVzdDJDb250ZXh0VmlzaXRvci5DcmVhdGUoCisgIGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7IGNvbnN0IEFMaXN0OiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZBZGFwdG9yIDo9IEFBZGFwdG9yOworICBGTGlzdCA6PSBBTGlzdDsKK2VuZDsKKworcHJvY2VkdXJlIFRlc3RJVHJlZVdpemFyZC5UVGVzdDJDb250ZXh0VmlzaXRvci5WaXNpdChjb25zdCBULAorICBQYXJlbnQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgQ2hpbGRJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOwordmFyCisgIFM6IFN0cmluZzsKK2JlZ2luCisgIFMgOj0gRkFkYXB0b3IuR2V0Tm9kZVRleHQoVCkgKyAnQCc7CisgIGlmIEFzc2lnbmVkKFBhcmVudCkgdGhlbgorICAgIFMgOj0gUyArIEZBZGFwdG9yLkdldE5vZGVUZXh0KFBhcmVudCkKKyAgZWxzZQorICAgIFMgOj0gUyArICduaWwnOworICBGTGlzdC5BZGQoVEFOVExSU3RyaW5nLkNyZWF0ZShTICsgJ1snICsgSW50VG9TdHIoQ2hpbGRJbmRleCkgKyAnXScKKyAgICArIExhYmVsc1snYSddLlRvU3RyaW5nICsgJyYnICsgTGFiZWxzWydiJ10uVG9TdHJpbmcpKTsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KKyAgLy8gUmVnaXN0ZXIgYW55IHRlc3QgY2FzZXMgd2l0aCB0aGUgdGVzdCBydW5uZXIKKyAgUmVnaXN0ZXJUZXN0KFRlc3RJQ29tbW9uVHJlZS5TdWl0ZSk7CisgIFJlZ2lzdGVyVGVzdChUZXN0SUNvbW1vblRyZWVOb2RlU3RyZWFtLlN1aXRlKTsKKyAgUmVnaXN0ZXJUZXN0KFRlc3RJUmV3cml0ZVJ1bGVYeHh4U3RyZWFtLlN1aXRlKTsKKyAgUmVnaXN0ZXJUZXN0KFRlc3RJVHJlZVdpemFyZC5TdWl0ZSk7CitlbmQuCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3REcml2ZXIuZHByIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUuVGVzdHMvVGVzdERyaXZlci5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjYWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3REcml2ZXIuZHByCkBAIC0wLDAgKzEsMzcgQEAKK3Byb2dyYW0gVGVzdERyaXZlcjsKK3sKKworICBEZWxwaGkgRFVuaXQgVGVzdCBQcm9qZWN0CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBwcm9qZWN0IGNvbnRhaW5zIHRoZSBEVW5pdCB0ZXN0IGZyYW1ld29yayBhbmQgdGhlIEdVSS9Db25zb2xlIHRlc3QgcnVubmVycy4KKyAgQWRkICJDT05TT0xFX1RFU1RSVU5ORVIiIHRvIHRoZSBjb25kaXRpb25hbCBkZWZpbmVzIGVudHJ5IGluIHRoZSBwcm9qZWN0IG9wdGlvbnMKKyAgdG8gdXNlIHRoZSBjb25zb2xlIHRlc3QgcnVubmVyLiAgT3RoZXJ3aXNlIHRoZSBHVUkgdGVzdCBydW5uZXIgd2lsbCBiZSB1c2VkIGJ5CisgIGRlZmF1bHQuCisKK30KKworeyRJRkRFRiBDT05TT0xFX1RFU1RSVU5ORVJ9Cit7JEFQUFRZUEUgQ09OU09MRX0KK3skRU5ESUZ9CisKK3VzZXMKKyAgRm9ybXMsCisgIFRlc3RGcmFtZXdvcmssCisgIEdVSVRlc3RSdW5uZXIsCisgIFRleHRUZXN0UnVubmVyLAorICBBbnRsci5SdW50aW1lLlRvb2xzLlRlc3RzIGluICdBbnRsci5SdW50aW1lLlRvb2xzLlRlc3RzLnBhcycsCisgIEFudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMuVGVzdHMgaW4gJ0FudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMuVGVzdHMucGFzJywKKyAgQW50bHIuUnVudGltZS5UcmVlLlRlc3RzIGluICdBbnRsci5SdW50aW1lLlRyZWUuVGVzdHMucGFzJywKKyAgQW50bHIuUnVudGltZS5UZXN0cyBpbiAnQW50bHIuUnVudGltZS5UZXN0cy5wYXMnOworCit7JFIgKi5SRVN9CisKK2JlZ2luCisgIFJlcG9ydE1lbW9yeUxlYWtzT25TaHV0ZG93biA6PSBUcnVlOworICBBcHBsaWNhdGlvbi5Jbml0aWFsaXplOworICBpZiBJc0NvbnNvbGUgdGhlbgorICAgIFRleHRUZXN0UnVubmVyLlJ1blJlZ2lzdGVyZWRUZXN0cworICBlbHNlCisgICAgR1VJVGVzdFJ1bm5lci5SdW5SZWdpc3RlcmVkVGVzdHM7CitlbmQuCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3REcml2ZXIuZHByb2ogYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9UZXN0RHJpdmVyLmRwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTZkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9UZXN0RHJpdmVyLmRwcm9qCkBAIC0wLDAgKzEsMTE1IEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPns2NjFDMzg2MC0yNTBFLTQxRUMtQTNENC1EQ0JERDA3NjU3NEZ9PC9Qcm9qZWN0R3VpZD4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4wPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCQk8TWFpblNvdXJjZT5UZXN0RHJpdmVyLmRwcjwvTWFpblNvdXJjZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzZScgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+JChCRFMpXFNvdXJjZVxEVW5pdFxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX0RlcGVuZGVuY3lDaGVja091dHB1dE5hbWU+VGVzdERyaXZlci5leGU8L0RDQ19EZXBlbmRlbmN5Q2hlY2tPdXRwdXROYW1lPgorCQkJPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+CisJCQk8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTtEYmlFcnJzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgorCQkJPERDQ19QbGF0Zm9ybT54ODY8L0RDQ19QbGF0Zm9ybT4KKwkJCTxEQ0NfRGVmaW5lPl9DT05TT0xFX1RFU1RSVU5ORVI7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCQk8RENDX04+ZmFsc2U8L0RDQ19OPgorCQkJPERDQ19TPmZhbHNlPC9EQ0NfUz4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi48L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX0U+ZmFsc2U8L0RDQ19FPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKwkJCTxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KKwkJCTxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KKwkJCTxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisJCQk8RENDX0RlYnVnRENVcz50cnVlPC9EQ0NfRGVidWdEQ1VzPgorCQkJPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iVGVzdERyaXZlci5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVG9vbHMuVGVzdHMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMuVGVzdHMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9IkFudGxyLlJ1bnRpbWUuVHJlZS5UZXN0cy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iQW50bHIuUnVudGltZS5UZXN0cy5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzZSI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKwkJCQk8S2V5PkNmZ18xPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJPC9JdGVtR3JvdXA+CisJCTxJbXBvcnQgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIvPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQkJPFBhcmFtZXRlcnM+CisJCQkJCQk8UGFyYW1ldGVycyBOYW1lPSJVc2VMYXVuY2hlciI+RmFsc2U8L1BhcmFtZXRlcnM+CisJCQkJCQk8UGFyYW1ldGVycyBOYW1lPSJMb2FkQWxsU3ltYm9scyI+VHJ1ZTwvUGFyYW1ldGVycz4KKwkJCQkJCTxQYXJhbWV0ZXJzIE5hbWU9IkxvYWRVbnNwZWNpZmllZFN5bWJvbHMiPkZhbHNlPC9QYXJhbWV0ZXJzPgorCQkJCQk8L1BhcmFtZXRlcnM+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPlRlc3REcml2ZXIuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxVbml0VGVzdGluZz4KKwkJCQkJPFRlc3RGcmFtZXdvcms+RFVuaXQgLyBEZWxwaGkgV2luMzI8L1Rlc3RGcmFtZXdvcms+CisJCQkJCTxUZXN0UnVubmVyPkdVSTwvVGVzdFJ1bm5lcj4KKwkJCQk8L1VuaXRUZXN0aW5nPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9UZXN0RHJpdmVyLnJlcyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lLlRlc3RzL1Rlc3REcml2ZXIucmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZGRmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS5UZXN0cy9UZXN0RHJpdmVyLnJlcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zLnBhcyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuQ29sbGVjdGlvbnMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMmVmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zLnBhcwpAQCAtMCwwICsxLDQzMSBAQAordW5pdCBBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zOworKCoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOCBFcmlrIHZhbiBCaWxzZW4KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKQorCitpbnRlcmZhY2UKKworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMH0KK3skTUVTU0FHRSBFUlJPUiAnWW91IG5lZWQgRGVscGhpIDIwMDkgb3IgaGlnaGVyIHRvIHVzZSB0aGUgQW50bHIgcnVudGltZSd9Cit7JElGRU5EfQorCit1c2VzCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBBbnRsci5SdW50aW1lLlRvb2xzOworCit0eXBlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFuIEhhc2h0YWJsZS1iYWNrZWQgZGljdGlvbmFyeSB0aGF0IGVudW1lcmF0ZXMgS2V5cyBhbmQgVmFsdWVzIGluCisgIC8vLyBpbnNlcnRpb24gb3JkZXIuCisgIC8vLyA8L3N1bW1hcnk+CisgIElIYXNoTGlzdDxUS2V5LCBUVmFsdWU+ID0gaW50ZXJmYWNlKElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4pCisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTdGFjayBhYnN0cmFjdGlvbiB0aGF0IGFsc28gc3VwcG9ydHMgdGhlIElMaXN0IGludGVyZmFjZQorICAvLy8gPC9zdW1tYXJ5PgorICBJU3RhY2tMaXN0PFQ+ID0gaW50ZXJmYWNlKElMaXN0PFQ+KQorICAgIHsgTWV0aG9kcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFkZHMgYW4gZWxlbWVudCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjayBsaXN0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFB1c2goY29uc3QgSXRlbTogVCk7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgbGlzdCBhbmQgcmV0dXJucyBpdC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz5UaGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay48L3JldHVybnM+CisgICAgZnVuY3Rpb24gUG9wOiBUOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGxpc3Qgd2l0aG91dCByZW1vdmluZyBpdC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz5UaGUgZWxlbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay48L3JldHVybnM+CisgICAgZnVuY3Rpb24gUGVlazogVDsKKyAgZW5kOworCit0eXBlCisgIFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+ID0gY2xhc3MoVEFOVExST2JqZWN0LCBJSGFzaExpc3Q8VEtleSwgVFZhbHVlPikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICB0eXBlCisgICAgICBUUGFpckVudW1lcmF0b3IgPSBjbGFzcyhURW51bWVyYXRvcjxUUGFpcjxUS2V5LCBUVmFsdWU+PikKKyAgICAgIHByaXZhdGUKKyAgICAgICAgRkhhc2hMaXN0OiBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPjsKKyAgICAgICAgRk9yZGVyTGlzdDogSUxpc3Q8VEtleT47CisgICAgICAgIEZJbmRleDogSW50ZWdlcjsKKyAgICAgICAgRlZlcnNpb246IEludGVnZXI7CisgICAgICAgIEZQYWlyOiBUUGFpcjxUS2V5LCBUVmFsdWU+OworICAgICAgICBmdW5jdGlvbiBHZXRDdXJyZW50OiBUUGFpcjxUS2V5LCBUVmFsdWU+OworICAgICAgcHJvdGVjdGVkCisgICAgICAgIGZ1bmN0aW9uIERvR2V0Q3VycmVudDogVFBhaXI8VEtleSwgVFZhbHVlPjsgb3ZlcnJpZGU7CisgICAgICAgIGZ1bmN0aW9uIERvTW92ZU5leHQ6IEJvb2xlYW47IG92ZXJyaWRlOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBSGFzaExpc3Q6IFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+KTsKKyAgICAgICAgZnVuY3Rpb24gTW92ZU5leHQ6IEJvb2xlYW47CisgICAgICAgIHByb3BlcnR5IEN1cnJlbnQ6IFRQYWlyPFRLZXksIFRWYWx1ZT4gcmVhZCBHZXRDdXJyZW50OworICAgICAgZW5kOworICBwcml2YXRlCisgICAgRkRpY3Rpb25hcnk6IElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT47CisgICAgRkluc2VydGlvbk9yZGVyTGlzdDogSUxpc3Q8VEtleT47CisgICAgRlZlcnNpb246IEludGVnZXI7CisgIHByb3RlY3RlZAorICAgIHsgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB9CisgICAgZnVuY3Rpb24gR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBBZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBDb250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBQ2FwYWNpdHk6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LCBUVmFsdWU+PjsKKworICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgZW5kOworCisgIFRTdGFja0xpc3Q8VD4gPSBjbGFzcyhUTGlzdDxUPiwgSVN0YWNrTGlzdDxUPikKKyAgcHJvdGVjdGVkCisgICAgeyBJU3RhY2tMaXN0PFQ+IH0KKyAgICBwcm9jZWR1cmUgUHVzaChjb25zdCBJdGVtOiBUKTsKKyAgICBmdW5jdGlvbiBQb3A6IFQ7CisgICAgZnVuY3Rpb24gUGVlazogVDsKKyAgZW5kOworCisgIFRDb2xsZWN0aW9uVXRpbHMgPSBjbGFzcworICBwdWJsaWMKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJRGljdGlvbmFyeS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyBhIGxpc3Qgb2YgdGhlIGNvbGxlY3Rpb24ncyBlbGVtZW50cyBpbiB0aGUgb3JkZXIKKyAgICAvLy8gdGhleSBhcmUgcmV0dXJuZWQgYnkgaXRzIGVudW1lcmF0b3IsIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNrZXRzICgie30iKS4KKyAgICAvLy8gVGhlIHNlcGFyYXRvciBpcyBhIGNvbW1hIGZvbGxvd2VkIGJ5IGEgc3BhY2UgaS5lLiAiLCAiLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJkaWN0Ij5EaWN0aW9uYXJ5IHdob3NlIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHJldHVybmVkPC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+QSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBkaWN0aW9uYXJ5IG9yICJudWxsIjwvcmV0dXJucz4KKyAgICBjbGFzcyBmdW5jdGlvbiBEaWN0aW9uYXJ5VG9TdHJpbmcoY29uc3QgRGljdDogSURpY3Rpb25hcnk8SW50ZWdlciwgSUxpc3Q8SUFOVExSSW50ZXJmYWNlPj4pOiBTdHJpbmc7IHN0YXRpYzsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIElMaXN0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIGEgbGlzdCBvZiB0aGUgY29sbGVjdGlvbidzIGVsZW1lbnRzIGluIHRoZSBvcmRlcgorICAgIC8vLyB0aGV5IGFyZSByZXR1cm5lZCBieSBpdHMgZW51bWVyYXRvciwgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzICgiW10iKS4KKyAgICAvLy8gVGhlIHNlcGFyYXRvciBpcyBhIGNvbW1hIGZvbGxvd2VkIGJ5IGEgc3BhY2UgaS5lLiAiLCAiLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xsIj5Db2xsZWN0aW9uIHdob3NlIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHJldHVybmVkPC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+QSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9yICJudWxsIjwvcmV0dXJucz4KKyAgICBjbGFzcyBmdW5jdGlvbiBMaXN0VG9TdHJpbmcoY29uc3QgQ29sbDogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPik6IFN0cmluZzsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBMaXN0VG9TdHJpbmcoY29uc3QgQ29sbDogSUxpc3Q8U3RyaW5nPik6IFN0cmluZzsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzOworCit7IFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+IH0KKworcHJvY2VkdXJlIFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+LkFkZChjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgRkRpY3Rpb25hcnkuQWRkKEtleSwgVmFsdWUpOworICBGSW5zZXJ0aW9uT3JkZXJMaXN0LkFkZChLZXkpOworICBJbmMoRlZlcnNpb24pOworZW5kOworCitwcm9jZWR1cmUgVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7CisgIGNvbnN0IFZhbHVlOiBUVmFsdWUpOworYmVnaW4KKyAgaWYgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoS2V5KSB0aGVuCisgICAgU2V0SXRlbShLZXksIFZhbHVlKQorICBlbHNlCisgICAgQWRkKEtleSwgVmFsdWUpOworZW5kOworCitwcm9jZWR1cmUgVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uQ2xlYXI7CitiZWdpbgorICBGRGljdGlvbmFyeS5DbGVhcjsKKyAgRkluc2VydGlvbk9yZGVyTGlzdC5DbGVhcjsKKyAgSW5jKEZWZXJzaW9uKTsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db250YWluc0tleShLZXkpOworZW5kOworCitmdW5jdGlvbiBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPi5Db250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LkNvbnRhaW5zVmFsdWUoVmFsdWUpOworZW5kOworCitjb25zdHJ1Y3RvciBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPi5DcmVhdGU7CitiZWdpbgorICBDcmVhdGUoLTEpOworZW5kOworCitjb25zdHJ1Y3RvciBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPi5DcmVhdGUoY29uc3QgQUNhcGFjaXR5OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIGlmIChBQ2FwYWNpdHkgPCAwKSB0aGVuCisgIGJlZ2luCisgICAgRkRpY3Rpb25hcnkgOj0gVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5DcmVhdGU7CisgICAgRkluc2VydGlvbk9yZGVyTGlzdCA6PSBUTGlzdDxUS2V5Pi5DcmVhdGU7CisgIGVuZAorICBlbHNlCisgIGJlZ2luCisgICAgRkRpY3Rpb25hcnkgOj0gVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5DcmVhdGUoQUNhcGFjaXR5KTsKKyAgICBGSW5zZXJ0aW9uT3JkZXJMaXN0IDo9IFRMaXN0PFRLZXk+LkNyZWF0ZTsKKyAgICBGSW5zZXJ0aW9uT3JkZXJMaXN0LkNhcGFjaXR5IDo9IEFDYXBhY2l0eTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db3VudDsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSwgVFZhbHVlPj47CitiZWdpbgorICBSZXN1bHQgOj0gVFBhaXJFbnVtZXJhdG9yLkNyZWF0ZShTZWxmKTsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hcnlbS2V5XTsKK2VuZDsKKworcHJvY2VkdXJlIFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+LlJlbW92ZShjb25zdCBLZXk6IFRLZXkpOworYmVnaW4KKyAgRkRpY3Rpb25hcnkuUmVtb3ZlKEtleSk7CisgIEZJbnNlcnRpb25PcmRlckxpc3QuUmVtb3ZlKEtleSk7CisgIEluYyhGVmVyc2lvbik7CitlbmQ7CisKK3Byb2NlZHVyZSBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPi5TZXRJdGVtKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7Cit2YXIKKyAgSXNOZXdFbnRyeTogQm9vbGVhbjsKK2JlZ2luCisgIElzTmV3RW50cnkgOj0gKG5vdCBGRGljdGlvbmFyeS5Db250YWluc0tleShLZXkpKTsKKyAgRkRpY3Rpb25hcnlbS2V5XSA6PSBWYWx1ZTsKKyAgaWYgKElzTmV3RW50cnkpIHRoZW4KKyAgICBGSW5zZXJ0aW9uT3JkZXJMaXN0LkFkZChLZXkpOworICBJbmMoRlZlcnNpb24pOworZW5kOworCitwcm9jZWR1cmUgVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uVHJpbUV4Y2VzczsKK2JlZ2luCisgIEZEaWN0aW9uYXJ5LlRyaW1FeGNlc3M7CisgIEZJbnNlcnRpb25PcmRlckxpc3QuQ2FwYWNpdHkgOj0gRkRpY3Rpb25hcnkuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+LlRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsKKyAgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LlRyeUdldFZhbHVlKEtleSxWYWx1ZSk7CitlbmQ7CisKK3sgVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uVFBhaXJFbnVtZXJhdG9yIH0KKworY29uc3RydWN0b3IgVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uVFBhaXJFbnVtZXJhdG9yLkNyZWF0ZSgKKyAgY29uc3QgQUhhc2hMaXN0OiBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGSGFzaExpc3QgOj0gQUhhc2hMaXN0OworICBGVmVyc2lvbiA6PSBGSGFzaExpc3QuRlZlcnNpb247CisgIEZPcmRlckxpc3QgOj0gRkhhc2hMaXN0LkZJbnNlcnRpb25PcmRlckxpc3Q7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+LlRQYWlyRW51bWVyYXRvci5Eb0dldEN1cnJlbnQ6IFRQYWlyPFRLZXksIFRWYWx1ZT47CitiZWdpbgorICBSZXN1bHQgOj0gR2V0Q3VycmVudDsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hMaXN0PFRLZXksIFRWYWx1ZT4uVFBhaXJFbnVtZXJhdG9yLkRvTW92ZU5leHQ6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gTW92ZU5leHQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoTGlzdDxUS2V5LCBUVmFsdWU+LlRQYWlyRW51bWVyYXRvci5HZXRDdXJyZW50OiBUUGFpcjxUS2V5LCBUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZQYWlyOworZW5kOworCitmdW5jdGlvbiBUSGFzaExpc3Q8VEtleSwgVFZhbHVlPi5UUGFpckVudW1lcmF0b3IuTW92ZU5leHQ6IEJvb2xlYW47CitiZWdpbgorICBpZiAoRlZlcnNpb24gPD4gRkhhc2hMaXN0LkZWZXJzaW9uKSB0aGVuCisgICAgcmFpc2UgRUludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCdDb2xsZWN0aW9uIHdhcyBtb2RpZmllZDsgZW51bWVyYXRpb24gb3BlcmF0aW9uIG1heSBub3QgZXhlY3V0ZS4nKTsKKyAgaWYgKEZJbmRleCA8IEZPcmRlckxpc3QuQ291bnQpIHRoZW4KKyAgYmVnaW4KKyAgICBGUGFpci5LZXkgOj0gRk9yZGVyTGlzdFtGSW5kZXhdOworICAgIEZQYWlyLlZhbHVlIDo9IEZIYXNoTGlzdFtGUGFpci5LZXldOworICAgIEluYyhGSW5kZXgpOworICAgIFJlc3VsdCA6PSBUcnVlOworICBlbmQKKyAgZWxzZQorICBiZWdpbgorICAgIEZQYWlyLktleSA6PSBEZWZhdWx0KFRLZXkpOworICAgIEZQYWlyLlZhbHVlIDo9IERlZmF1bHQoVFZhbHVlKTsKKyAgICBSZXN1bHQgOj0gRmFsc2U7CisgIGVuZDsKK2VuZDsKKworeyBUU3RhY2tMaXN0PFQ+IH0KKworZnVuY3Rpb24gVFN0YWNrTGlzdDxUPi5QZWVrOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldEl0ZW0oR2V0Q291bnQgLSAxKTsKK2VuZDsKKworZnVuY3Rpb24gVFN0YWNrTGlzdDxUPi5Qb3A6IFQ7Cit2YXIKKyAgSTogSW50ZWdlcjsKK2JlZ2luCisgIEkgOj0gR2V0Q291bnQgLSAxOworICBSZXN1bHQgOj0gR2V0SXRlbShJKTsKKyAgRGVsZXRlKEkpOworZW5kOworCitwcm9jZWR1cmUgVFN0YWNrTGlzdDxUPi5QdXNoKGNvbnN0IEl0ZW06IFQpOworYmVnaW4KKyAgQWRkKEl0ZW0pOworZW5kOworCit7IFRDb2xsZWN0aW9uVXRpbHMgfQorCitjbGFzcyBmdW5jdGlvbiBUQ29sbGVjdGlvblV0aWxzLkRpY3Rpb25hcnlUb1N0cmluZygKKyAgY29uc3QgRGljdDogSURpY3Rpb25hcnk8SW50ZWdlciwgSUxpc3Q8SUFOVExSSW50ZXJmYWNlPj4pOiBTdHJpbmc7Cit2YXIKKyAgU0I6IFRTdHJpbmdCdWlsZGVyOworICBJOiBJbnRlZ2VyOworICBFOiBUUGFpcjxJbnRlZ2VyLCBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+PjsKK2JlZ2luCisgIFNCIDo9IFRTdHJpbmdCdWlsZGVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgaWYgQXNzaWduZWQoRGljdCkgdGhlbgorICAgIGJlZ2luCisgICAgICBTQi5BcHBlbmQoJ3snKTsKKyAgICAgIEkgOj0gMDsKKyAgICAgIGZvciBFIGluIERpY3QgZG8KKyAgICAgIGJlZ2luCisgICAgICAgIGlmIChJID4gMCkgdGhlbgorICAgICAgICAgIFNCLkFwcGVuZCgnLCAnKTsKKyAgICAgICAgU0IuQXBwZW5kRm9ybWF0KCclZD0lcycsIFtFLktleSwgTGlzdFRvU3RyaW5nKEUuVmFsdWUpXSk7CisgICAgICAgIEluYyhJKTsKKyAgICAgIGVuZDsKKyAgICAgIFNCLkFwcGVuZCgnfScpOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFNCLkluc2VydCgwLCAnbnVsbCcpOworICAgIFJlc3VsdCA6PSBTQi5Ub1N0cmluZzsKKyAgZmluYWxseQorICAgIFNCLkZyZWU7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVENvbGxlY3Rpb25VdGlscy5MaXN0VG9TdHJpbmcoCisgIGNvbnN0IENvbGw6IElMaXN0PElBTlRMUkludGVyZmFjZT4pOiBTdHJpbmc7Cit2YXIKKyAgU0I6IFRTdHJpbmdCdWlsZGVyOworICBJOiBJbnRlZ2VyOworICBFbGVtZW50OiBJQU5UTFJJbnRlcmZhY2U7CisgIERpY3Q6IElEaWN0aW9uYXJ5PEludGVnZXIsIElMaXN0PElBTlRMUkludGVyZmFjZT4+OworICBMaXN0OiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworYmVnaW4KKyAgU0IgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBpZiAoQ29sbCA8PiBuaWwpIHRoZW4KKyAgICBiZWdpbgorICAgICAgU0IuQXBwZW5kKCdbJyk7CisgICAgICBmb3IgSSA6PSAwIHRvIENvbGwuQ291bnQgLSAxIGRvCisgICAgICBiZWdpbgorICAgICAgICBpZiAoSSA+IDApIHRoZW4KKyAgICAgICAgICBTQi5BcHBlbmQoJywgJyk7CisgICAgICAgIEVsZW1lbnQgOj0gQ29sbFtJXTsKKyAgICAgICAgaWYgKEVsZW1lbnQgPSBuaWwpIHRoZW4KKyAgICAgICAgICBTQi5BcHBlbmQoJ251bGwnKQorICAgICAgICBlbHNlCisgICAgICAgIGlmIFN1cHBvcnRzKEVsZW1lbnQsIElEaWN0aW9uYXJ5PEludGVnZXIsIElMaXN0PElBTlRMUkludGVyZmFjZT4+LCBEaWN0KSB0aGVuCisgICAgICAgICAgU0IuQXBwZW5kKERpY3Rpb25hcnlUb1N0cmluZyhEaWN0KSkKKyAgICAgICAgZWxzZQorICAgICAgICBpZiBTdXBwb3J0cyhFbGVtZW50LCBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+LCBMaXN0KSB0aGVuCisgICAgICAgICAgU0IuQXBwZW5kKExpc3RUb1N0cmluZyhMaXN0KSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNCLkFwcGVuZChFbGVtZW50LlRvU3RyaW5nKTsKKyAgICAgIGVuZDsKKyAgICAgIFNCLkFwcGVuZCgnXScpOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFNCLkluc2VydCgwLCAnbnVsbCcpOworICAgIFJlc3VsdCA6PSBTQi5Ub1N0cmluZzsKKyAgZmluYWxseQorICAgIFNCLkZyZWU7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVENvbGxlY3Rpb25VdGlscy5MaXN0VG9TdHJpbmcoY29uc3QgQ29sbDogSUxpc3Q8U3RyaW5nPik6IFN0cmluZzsKK3ZhcgorICBTQjogVFN0cmluZ0J1aWxkZXI7CisgIEk6IEludGVnZXI7CitiZWdpbgorICBTQiA6PSBUU3RyaW5nQnVpbGRlci5DcmVhdGU7CisgIHRyeQorICAgIGlmIChDb2xsIDw+IG5pbCkgdGhlbgorICAgIGJlZ2luCisgICAgICBTQi5BcHBlbmQoJ1snKTsKKyAgICAgIGZvciBJIDo9IDAgdG8gQ29sbC5Db3VudCAtIDEgZG8KKyAgICAgIGJlZ2luCisgICAgICAgIGlmIChJID4gMCkgdGhlbgorICAgICAgICAgIFNCLkFwcGVuZCgnLCAnKTsKKyAgICAgICAgU0IuQXBwZW5kKENvbGxbSV0pOworICAgICAgZW5kOworICAgICAgU0IuQXBwZW5kKCddJyk7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgU0IuSW5zZXJ0KDAsICdudWxsJyk7CisgICAgUmVzdWx0IDo9IFNCLlRvU3RyaW5nOworICBmaW5hbGx5CisgICAgU0IuRnJlZTsKKyAgZW5kOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRvb2xzLnBhcyBiL2FudGxyLTMuNC9ydW50aW1lL0RlbHBoaS9Tb3VyY2VzL0FudGxyMy5SdW50aW1lL0FudGxyLlJ1bnRpbWUuVG9vbHMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmY4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRvb2xzLnBhcwpAQCAtMCwwICsxLDk5OCBAQAordW5pdCBBbnRsci5SdW50aW1lLlRvb2xzOworKCoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOCBFcmlrIHZhbiBCaWxzZW4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKQorCitpbnRlcmZhY2UKKworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMH0KK3skTUVTU0FHRSBFUlJPUiAnWW91IG5lZWQgRGVscGhpIDIwMDkgb3IgaGlnaGVyIHRvIHVzZSB0aGUgQW50bHIgcnVudGltZSd9Cit7JElGRU5EfQorCit1c2VzCisgIENsYXNzZXMsCisgIEdlbmVyaWNzLkRlZmF1bHRzLAorICBHZW5lcmljcy5Db2xsZWN0aW9uczsKKwordHlwZQorICBUU21hbGxpbnRBcnJheSA9IGFycmF5IG9mIFNtYWxsaW50OworICBUU21hbGxpbnRNYXRyaXggPSBhcnJheSBvZiBUU21hbGxpbnRBcnJheTsKKyAgVEludGVnZXJBcnJheSA9IGFycmF5IG9mIEludGVnZXI7CisgIFRVSW50NjRBcnJheSA9IGFycmF5IG9mIFVJbnQ2NDsKKyAgVFN0cmluZ0FycmF5ID0gYXJyYXkgb2YgU3RyaW5nOworCit0eXBlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEJhc2UgaW50ZXJmYWNlIGZvciBBTlRMUiBvYmplY3RzCisgIC8vLyA8L3N1bW1hcnk+CisgIElBTlRMUkludGVyZmFjZSA9IGludGVyZmFjZQorICBbJ3tGQTk4RjJFRS04OUQzLTQyQTUtQkM5Qy0xRThBOUIyNzhDM0J9J10KKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOworICBlbmQ7CisgIFRBTlRMUkludGVyZmFjZUFycmF5ID0gYXJyYXkgb2YgSUFOVExSSW50ZXJmYWNlOworCit0eXBlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdpdmVzIGFjY2VzcyB0byBpbXBsZW1lbnRpbmcgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIElBTlRMUk9iamVjdCA9IGludGVyZmFjZQorICBbJ3tFNTZDRTI4Qi04RDkyLTQ5NjEtOTBFRC00MThBMUU4RkVERjJ9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0SW1wbGVtZW50b3I6IFRPYmplY3Q7CisKKyAgICB7IFByb3BlcnRpZXMgfQorICAgIHByb3BlcnR5IEltcGxlbWVudG9yOiBUT2JqZWN0IHJlYWQgR2V0SW1wbGVtZW50b3I7CisgIGVuZDsKKwordHlwZQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBCYXNlIGZvciBBTlRMUiBvYmplY3RzCisgIC8vLyA8L3N1bW1hcnk+CisgIFRBTlRMUk9iamVjdCA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJQU5UTFJJbnRlcmZhY2UsIElBTlRMUk9iamVjdCkKKyAgcHJvdGVjdGVkCisgICAgeyBJQU5UTFJPYmplY3QgfQorICAgIGZ1bmN0aW9uIEdldEltcGxlbWVudG9yOiBUT2JqZWN0OworICBlbmQ7CisKK3R5cGUKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3dzIHN0cmluZ3MgdG8gYmUgdHJlYXRlZCBhcyBvYmplY3QgaW50ZXJmYWNlcworICAvLy8gPC9zdW1tYXJ5PgorICBJQU5UTFJTdHJpbmcgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3sxQzdGMjAzMC00NDZDLTQ3NTYtODFFMy1FQzM3RTA0RTIyOTZ9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0VmFsdWU6IFN0cmluZzsKKyAgICBwcm9jZWR1cmUgU2V0VmFsdWUoY29uc3QgVmFsdWU6IFN0cmluZyk7CisKKyAgICB7IFByb3BlcnRpZXMgfQorICAgIHByb3BlcnR5IFZhbHVlOiBTdHJpbmcgcmVhZCBHZXRWYWx1ZSB3cml0ZSBTZXRWYWx1ZTsKKyAgZW5kOworCit0eXBlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFsbG93cyBzdHJpbmdzIHRvIGJlIHRyZWF0ZWQgYXMgb2JqZWN0IGludGVyZmFjZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgVEFOVExSU3RyaW5nID0gY2xhc3MoVEFOVExST2JqZWN0LCBJQU5UTFJTdHJpbmcpCisgIHN0cmljdCBwcml2YXRlCisgICAgRlZhbHVlOiBTdHJpbmc7CisgIHByb3RlY3RlZAorICAgIHsgSUFOVExSU3RyaW5nIH0KKyAgICBmdW5jdGlvbiBHZXRWYWx1ZTogU3RyaW5nOworICAgIHByb2NlZHVyZSBTZXRWYWx1ZShjb25zdCBWYWx1ZTogU3RyaW5nKTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFWYWx1ZTogU3RyaW5nKTsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworICBlbmQ7CisKK3R5cGUKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gV2luMzIgdmVyc2lvbiBvZiAuTkVUJ3MgSUNsb25lYWJsZQorICAvLy8gPC9zdW1tYXJ5PgorICBJQ2xvbmVhYmxlID0gaW50ZXJmYWNlKElBTlRMUkludGVyZmFjZSkKKyAgWyd7OTAyNDBCRjAtM0EwOS00NkI2LUJDNDctQzEzMDY0ODA5Rjk3fSddCisgICAgeyBNZXRob2RzIH0KKyAgICBmdW5jdGlvbiBDbG9uZTogSUFOVExSSW50ZXJmYWNlOworICBlbmQ7CisKK3R5cGUKKyAgSUxpc3Q8VD4gPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3sxMDdEQjJGRS1BMzUxLTRGMDgtQjlBRC1FMUJBOEE0NjkwRkZ9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0Q2FwYWNpdHk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworICAgIHByb2NlZHVyZSBTZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgZnVuY3Rpb24gR2V0T25Ob3RpZnk6IFRDb2xsZWN0aW9uTm90aWZ5RXZlbnQ8VD47CisgICAgcHJvY2VkdXJlIFNldE9uTm90aWZ5KFZhbHVlOiBUQ29sbGVjdGlvbk5vdGlmeUV2ZW50PFQ+KTsKKworICAgIHsgTWV0aG9kcyB9CisgICAgZnVuY3Rpb24gQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgTGlzdDogSUxpc3Q8VD4pOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBJbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IExpc3Q6IElMaXN0PFQ+KTsgb3ZlcmxvYWQ7CisKKyAgICBmdW5jdGlvbiBSZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBEZWxldGUoSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBEZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7CisKKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisKKyAgICBmdW5jdGlvbiBDb250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gTGFzdEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworCisgICAgcHJvY2VkdXJlIFJldmVyc2U7CisKKyAgICBwcm9jZWR1cmUgU29ydDsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRMaXN0PFQ+LlRFbnVtZXJhdG9yOworICAgIGZ1bmN0aW9uIEdldFJhbmdlKGNvbnN0IEluZGV4LCBDb3VudDogSW50ZWdlcik6IElMaXN0PFQ+OworCisgICAgeyBQcm9wZXJ0aWVzIH0KKworICAgIHByb3BlcnR5IENhcGFjaXR5OiBJbnRlZ2VyIHJlYWQgR2V0Q2FwYWNpdHkgd3JpdGUgU2V0Q2FwYWNpdHk7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJdGVtc1tJbmRleDogSW50ZWdlcl06IFQgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7CisgICAgcHJvcGVydHkgT25Ob3RpZnk6IFRDb2xsZWN0aW9uTm90aWZ5RXZlbnQ8VD4gcmVhZCBHZXRPbk5vdGlmeSB3cml0ZSBTZXRPbk5vdGlmeTsKKyAgZW5kOworCit0eXBlCisgIElEaWN0aW9uYXJ5PFRLZXksVFZhbHVlPiA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezU5MzdCRDIxLUMyQzgtNEUzMC05Nzg3LTRBRUZERjEwNzJDRH0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworCisgICAgeyBNZXRob2RzIH0KKyAgICBwcm9jZWR1cmUgQWRkKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBLZXk6IFRLZXkpOworICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIENvbnRhaW5zS2V5KGNvbnN0IEtleTogVEtleSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gQ29udGFpbnNWYWx1ZShjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LCBUVmFsdWU+PjsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgSXRlbXNbY29uc3QgS2V5OiBUS2V5XTogVFZhbHVlIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgIGVuZDsKKwordHlwZQorICBUTGlzdDxUPiA9IGNsYXNzKEdlbmVyaWNzLkNvbGxlY3Rpb25zLlRMaXN0PFQ+LCBJTGlzdDxUPikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUmVmQ291bnQ6IEludGVnZXI7CisgIHByb3RlY3RlZAorICAgIHsgSUludGVyZmFjZSB9CisgICAgZnVuY3Rpb24gUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEOiBUR1VJRDsgb3V0IE9iaik6IEhSZXN1bHQ7IHN0ZGNhbGw7CisgICAgZnVuY3Rpb24gX0FkZFJlZjogSW50ZWdlcjsgc3RkY2FsbDsKKyAgICBmdW5jdGlvbiBfUmVsZWFzZTogSW50ZWdlcjsgc3RkY2FsbDsKKworICAgIHsgSUxpc3Q8VD4gfQorICAgIGZ1bmN0aW9uIEdldENhcGFjaXR5OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIGZ1bmN0aW9uIEdldE9uTm90aWZ5OiBUQ29sbGVjdGlvbk5vdGlmeUV2ZW50PFQ+OworICAgIHByb2NlZHVyZSBTZXRPbk5vdGlmeShWYWx1ZTogVENvbGxlY3Rpb25Ob3RpZnlFdmVudDxUPik7CisgICAgZnVuY3Rpb24gR2V0UmFuZ2UoY29uc3QgSW5kZXgsIENvdW50OiBJbnRlZ2VyKTogSUxpc3Q8VD47CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IExpc3Q6IElMaXN0PFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBMaXN0OiBJTGlzdDxUPik7IG92ZXJsb2FkOworICBlbmQ7CisKK3R5cGUKKyAgVERpY3Rpb25hcnlBcnJheTxUS2V5LFRWYWx1ZT4gPSBhcnJheSBvZiBJRGljdGlvbmFyeTxUS2V5LFRWYWx1ZT47CisKKyAgeyBUaGUgVERpY3Rpb25hcnkgY2xhc3MgaW4gdGhlIGZpcnN0IHJlbGVhc2Ugb2YgRGVscGhpIDIwMDkgaXMgdmVyeSBidWdneS4KKyAgICBUaGlzIGlzIGEgcGFydGlhbCBjb3B5IG9mIHRoYXQgY2xhc3Mgd2l0aCBidWcgZml4ZXMuIH0KKyAgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+ID0gY2xhc3MoVEVudW1lcmFibGU8VFBhaXI8VEtleSxUVmFsdWU+PiwgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPikKKyAgcHJpdmF0ZQorICAgIHR5cGUKKyAgICAgIFRJdGVtID0gcmVjb3JkCisgICAgICAgIEhhc2hDb2RlOiBJbnRlZ2VyOworICAgICAgICBLZXk6IFRLZXk7CisgICAgICAgIFZhbHVlOiBUVmFsdWU7CisgICAgICBlbmQ7CisgICAgICBUSXRlbUFycmF5ID0gYXJyYXkgb2YgVEl0ZW07CisgIHByaXZhdGUKKyAgICBGSXRlbXM6IFRJdGVtQXJyYXk7CisgICAgRkNvdW50OiBJbnRlZ2VyOworICAgIEZDb21wYXJlcjogSUVxdWFsaXR5Q29tcGFyZXI8VEtleT47CisgICAgRkdyb3dUaHJlc2hvbGQ6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgU2V0Q2FwYWNpdHkoQUNhcGFjaXR5OiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgUmVoYXNoKE5ld0NhcFBvdzI6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBHcm93OworICAgIGZ1bmN0aW9uIEdldEJ1Y2tldEluZGV4KGNvbnN0IEtleTogVEtleTsgSGFzaENvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEhhc2goY29uc3QgS2V5OiBUS2V5KTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgUmVoYXNoQWRkKEhhc2hDb2RlOiBJbnRlZ2VyOyBjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBEb0FkZChIYXNoQ29kZSwgSW5kZXg6IEludGVnZXI7IGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIERvR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSxUVmFsdWU+Pjsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBQ2FwYWNpdHk6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDb21wYXJlcjogSUVxdWFsaXR5Q29tcGFyZXI8VEtleT4pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUNhcGFjaXR5OiBJbnRlZ2VyOyBjb25zdCBBQ29tcGFyZXI6IElFcXVhbGl0eUNvbXBhcmVyPFRLZXk+KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFRQYWlyPFRLZXksVFZhbHVlPj4pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VFBhaXI8VEtleSxUVmFsdWU+PjsgY29uc3QgQUNvbXBhcmVyOiBJRXF1YWxpdHlDb21wYXJlcjxUS2V5Pik7IG92ZXJsb2FkOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisKKyAgICB0eXBlCisgICAgICBUUGFpckVudW1lcmF0b3IgPSBjbGFzcyhURW51bWVyYXRvcjxUUGFpcjxUS2V5LFRWYWx1ZT4+KQorICAgICAgcHJpdmF0ZQorICAgICAgICBGRGljdGlvbmFyeTogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+OworICAgICAgICBGSW5kZXg6IEludGVnZXI7CisgICAgICAgIGZ1bmN0aW9uIEdldEN1cnJlbnQ6IFRQYWlyPFRLZXksVFZhbHVlPjsKKyAgICAgIHByb3RlY3RlZAorICAgICAgICBmdW5jdGlvbiBEb0dldEN1cnJlbnQ6IFRQYWlyPFRLZXksVFZhbHVlPjsgb3ZlcnJpZGU7CisgICAgICAgIGZ1bmN0aW9uIERvTW92ZU5leHQ6IEJvb2xlYW47IG92ZXJyaWRlOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBRGljdGlvbmFyeTogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+KTsKKyAgICAgICAgcHJvcGVydHkgQ3VycmVudDogVFBhaXI8VEtleSxUVmFsdWU+IHJlYWQgR2V0Q3VycmVudDsKKyAgICAgICAgZnVuY3Rpb24gTW92ZU5leHQ6IEJvb2xlYW47CisgICAgICBlbmQ7CisgIHByb3RlY3RlZAorICAgIHsgSUludGVyZmFjZSB9CisgICAgRlJlZkNvdW50OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRDogVEdVSUQ7IG91dCBPYmopOiBIUmVzdWx0OyBzdGRjYWxsOworICAgIGZ1bmN0aW9uIF9BZGRSZWY6IEludGVnZXI7IHN0ZGNhbGw7CisgICAgZnVuY3Rpb24gX1JlbGVhc2U6IEludGVnZXI7IHN0ZGNhbGw7CisgIHByb3RlY3RlZAorICAgIHsgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB9CisgICAgZnVuY3Rpb24gR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBBZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBDb250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICBwdWJsaWMKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LCBUVmFsdWU+PjsKKyAgZW5kOworCit0eXBlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhlbHBlciBmb3Igc3RvcmluZyBsb2NhbCB2YXJpYWJsZXMgaW5zaWRlIGEgcm91dGluZS4gVGhlIGNvZGUgdGhhdCBBTlRMUgorICAvLy8gZ2VuZXJhdGVzIGNvbnRhaW5zIGEgbG90IG9mIGJsb2NrLWxldmVsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgd2hpY2gKKyAgLy8vIHRoZSBEZWxwaGkgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydC4gV2hlbiBnZW5lcmF0aW5nIERlbHBoaSBzb3VyY2UgY29kZSwKKyAgLy8vIEkgdHJ5IHRvIGRldGVjdCB0aG9zZSBkZWNsYXJhdGlvbnMgYW5kIG1vdmUgdGhlbSB0byB0aGUgcm91dGluZSBoZWFkZXIKKyAgLy8vIGFzIG11Y2ggYXMgcG9zc2libGUuIEJ1dCBzb21ldGltZXMsIHRoaXMgaXMgaW1wb3NzaWJsZS4KKyAgLy8vIFRoaXMgaXMgYSBiaXQgb2YgYW4gdWdseSAoYW5kIHNsb3cpIHNvbHV0aW9uLCBidXQgaXQgd29ya3MuIERlY2xhcmUgYW4KKyAgLy8vIHZhcmlhYmxlIG9mIHRoZSBUTG9jYWxTdG9yYWdlIHR5cGUgaW5zaWRlIGEgcm91dGluZSwgYW5kIHlvdSBjYW4gdXNlIGl0CisgIC8vLyB0byBhY2Nlc3MgdmFyaWFibGVzIGJ5IG5hbWUuIEZvciBleGFtcGxlLCBzZWUgdGhlIGZvbGxvd2luZyBDIGNvZGU6CisgIC8vLyAgeworICAvLy8gICAgaW50IHggPSAzOworICAvLy8gICAgeworICAvLy8gICAgICBpbnQgeSA9IHggKiAyOworICAvLy8gICAgfQorICAvLy8gIH0KKyAgLy8vIElmIHRoZSBEZWxwaGkgY29kZSBnZW5lcmF0b3IgY2Fubm90IGRldGVjdCB0aGUgaW5uZXIgInkiIHZhcmlhYmxlLCB0aGVuCisgIC8vLyBpdCB1c2VzIHRoZSBsb2NhbCBzdG9yYWdlIGFzIGZvbGxvd3M6CisgIC8vLyAgdmFyCisgIC8vLyAgICB4OiBJbnRlZ2VyOworICAvLy8gICAgTG9jYWxzOiBUTG9jYWxTdG9yYWdlOworICAvLy8gIGJlZ2luCisgIC8vLyAgICBMb2NhbHMuSW5pdGlhbGl6ZTsKKyAgLy8vICAgIHRyeQorICAvLy8gICAgICB4IDo9IDM7CisgIC8vLyAgICAgIExvY2Fsc1sneSddIDo9IHggKiAyOworICAvLy8gICAgZmluYWxseQorICAvLy8gICAgICBMb2NhbHMuRmluYWxpemU7CisgIC8vLyAgICBlbmQ7CisgIC8vLyAgZW5kOworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBUaGlzIGlzIGEgc2xvdyBzb2x1dGlvbiBiZWNhdXNlIGl0IGludm9sdmVzIGxvb2tpbmcgdXAgdmFyaWFibGUgbmFtZXMuCisgIC8vLyBUaGlzIGNvdWxkIGJlIGRvbmUgdXNpbmcgaGFzaGluZyBvciBiaW5hcnkgc2VhcmNoLCBidXQgdGhpcyBpcyBpbmVmZmljaWVudAorICAvLy8gd2l0aCBzbWFsbCBjb2xsZWN0aW9ucy4gU2luY2Ugc21hbGwgY29sbGVjdGlvbnMgYXJlIG1vcmUgdHlwaWNhbCBpbiB0aGVzZQorICAvLy8gc2NlbmFyaW9zLCB3ZSB1c2Ugc2ltcGxlIGxpbmVhciBzZWFyY2ggaGVyZS4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gVGhlIFRMb2NhbFN0b3JhZ2UgcmVjb3JkIGhhcyBzcGFjZSBmb3IgMjU2IHZhcmlhYmxlcy4gRm9yIHBlcmZvcm1hbmNlCisgIC8vLyByZWFzb25zLCB0aGlzIHNwYWNlIGlzIHByZWFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kIGRvZXMgbm90IGdyb3cgaWYKKyAgLy8vIG5lZWRlZC4gQWxzbywgbm8gcmFuZ2UgY2hlY2tpbmcgaXMgZG9uZS4gQnV0IDI1NiBsb2NhbCB2YXJpYWJsZXMgc2hvdWxkCisgIC8vLyBiZSBlbm91Z2ggZm9yIGFsbCBnZW5lcmF0ZWQgY29kZS4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gQWxzbyBub3RlIHRoYXQgdGhlIHZhcmlhYmxlIG5hbWVzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgc28gJ3gnIGlzIGEKKyAgLy8vIGRpZmZlcmVudCB2YXJpYWJsZSB0aGFuICdYJy4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gVExvY2FsU3RvcmFnZSBjYW4gb25seSBzdG9yZSB2YXJpYWJsZXMgdGhhdCBhcmUgMzIgYml0cyBpbiBzaXplLCBhbmQKKyAgLy8vIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGF0YSB0eXBlc0wKKyAgLy8vICAtSW50ZWdlcgorICAvLy8gIC1JSW50ZXJmYWNlIGRlc2NlbmRhbnRzIChkZWZhdWx0IHByb3BlcnR5KQorICAvLy8gPC9yZW1hcmtzPgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBZb3UgTVVTVCBjYWxsIHRoZSBGaW5hbGl6ZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgcm91dGluZSB0byBtYWtlCisgIC8vLyBzdXJlIHRoYXQgYW55IHN0b3JlZCB2YXJpYWJsZXMgb2YgdHlwZSBJSW50ZXJmYWNlIGFyZSByZWxlYXNlZC4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgVExvY2FsU3RvcmFnZSA9IHJlY29yZAorICBwcml2YXRlCisgICAgdHlwZQorICAgICAgVExvY2FsU3RvcmFnZUVudHJ5ID0gcmVjb3JkCisgICAgICAgIEZOYW1lOiBTdHJpbmc7CisgICAgICAgIEZWYWx1ZTogUG9pbnRlcjsKKyAgICAgICAgRkRhdGFUeXBlOiAoZHRJbnRlZ2VyLCBkdEludGVyZmFjZSk7CisgICAgICBlbmQ7CisgIHByaXZhdGUKKyAgICBGRW50cmllczogYXJyYXkgWzAuLjI1NV0gb2YgVExvY2FsU3RvcmFnZUVudHJ5OworICAgIEZDb3VudDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRBc0ludGVnZXIoY29uc3QgTmFtZTogU3RyaW5nKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0QXNJbnRlZ2VyKGNvbnN0IE5hbWU6IFN0cmluZzsgY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEFzSW50ZXJmYWNlKGNvbnN0IE5hbWU6IFN0cmluZyk6IElJbnRlcmZhY2U7CisgICAgcHJvY2VkdXJlIFNldEFzSW50ZXJmYWNlKGNvbnN0IE5hbWU6IFN0cmluZzsgY29uc3QgVmFsdWU6IElJbnRlcmZhY2UpOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgSW5pdGlhbGl6ZTsKKyAgICBwcm9jZWR1cmUgRmluYWxpemU7CisKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEZDb3VudDsKKyAgICBwcm9wZXJ0eSBBc0ludGVnZXJbY29uc3QgTmFtZTogU3RyaW5nXTogSW50ZWdlciByZWFkIEdldEFzSW50ZWdlciB3cml0ZSBTZXRBc0ludGVnZXI7CisgICAgcHJvcGVydHkgQXNJbnRlcmZhY2VbY29uc3QgTmFtZTogU3RyaW5nXTogSUludGVyZmFjZSByZWFkIEdldEFzSW50ZXJmYWNlIHdyaXRlIFNldEFzSW50ZXJmYWNlOyBkZWZhdWx0OworICBlbmQ7CisKK2Z1bmN0aW9uIEluQ2lyY3VsYXJSYW5nZShCb3R0b20sIEl0ZW0sIFRvcEluYzogSW50ZWdlcik6IEJvb2xlYW47CisKK3sgQ2hlY2tzIGlmIEEgYW5kIEIgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBzYW1lIG9iamVjdCB9CitmdW5jdGlvbiBTYW1lT2JqKGNvbnN0IEEsIEI6IElJbnRlcmZhY2UpOiBCb29sZWFuOworCitmdW5jdGlvbiBJZlRoZW4oY29uc3QgQVZhbHVlOiBCb29sZWFuOyBjb25zdCBBVHJ1ZTogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBBRmFsc2U6IElBTlRMUkludGVyZmFjZSA9IG5pbCk6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7CisKK2Z1bmN0aW9uIElzVXBwZXIoY29uc3QgQzogQ2hhcik6IEJvb2xlYW47CisKK2ltcGxlbWVudGF0aW9uCisKK3VzZXMKKyAgV2luZG93cywKKyAgU3lzVXRpbHM7CisKK2Z1bmN0aW9uIFNhbWVPYmooY29uc3QgQSwgQjogSUludGVyZmFjZSk6IEJvb2xlYW47Cit2YXIKKyAgWCwgWTogSUludGVyZmFjZTsKK2JlZ2luCisgIGlmIChBID0gbmlsKSBvciAoQiA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAoQSA9IEIpCisgIGVsc2UgaWYgKEEuUXVlcnlJbnRlcmZhY2UoSUludGVyZmFjZSwgWCkgPSBTX09LKQorICAgIGFuZCAoQi5RdWVyeUludGVyZmFjZShJSW50ZXJmYWNlLCBZKSA9IFNfT0spCisgIHRoZW4KKyAgICBSZXN1bHQgOj0gKFggPSBZKQorICBlbHNlCisgICAgUmVzdWx0IDo9IChBID0gQik7CitlbmQ7CisKK2Z1bmN0aW9uIElmVGhlbihjb25zdCBBVmFsdWU6IEJvb2xlYW47IGNvbnN0IEFUcnVlOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IEFGYWxzZTogSUFOVExSSW50ZXJmYWNlID0gbmlsKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKK2JlZ2luCisgIGlmIEFWYWx1ZSB0aGVuCisgICAgUmVzdWx0IDo9IEFUcnVlCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gQUZhbHNlOworZW5kOworCitmdW5jdGlvbiBJc1VwcGVyKGNvbnN0IEM6IENoYXIpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IChDID49ICdBJykgYW5kIChDIDw9ICdaJyk7CisKK2VuZDsKK3sgVEFOVExST2JqZWN0IH0KKworZnVuY3Rpb24gVEFOVExST2JqZWN0LkdldEltcGxlbWVudG9yOiBUT2JqZWN0OworYmVnaW4KKyAgUmVzdWx0IDo9IFNlbGY7CitlbmQ7CisKK3sgVEFOVExSU3RyaW5nIH0KKworY29uc3RydWN0b3IgVEFOVExSU3RyaW5nLkNyZWF0ZShjb25zdCBBVmFsdWU6IFN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVmFsdWUgOj0gQVZhbHVlOworZW5kOworCitmdW5jdGlvbiBUQU5UTFJTdHJpbmcuR2V0VmFsdWU6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQU5UTFJTdHJpbmcuU2V0VmFsdWUoY29uc3QgVmFsdWU6IFN0cmluZyk7CitiZWdpbgorICBGVmFsdWUgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRBTlRMUlN0cmluZy5Ub1N0cmluZzogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZWYWx1ZTsKK2VuZDsKKworeyBUTGlzdDxUPiB9CisKK3Byb2NlZHVyZSBUTGlzdDxUPi5BZGRSYW5nZShjb25zdCBMaXN0OiBJTGlzdDxUPik7CitiZWdpbgorICBJbnNlcnRSYW5nZShHZXRDb3VudCwgTGlzdCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRMaXN0PFQ+LkdldENhcGFjaXR5OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGluaGVyaXRlZCBDYXBhY2l0eTsKK2VuZDsKKworZnVuY3Rpb24gVExpc3Q8VD4uR2V0Q291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gaW5oZXJpdGVkIENvdW50OworZW5kOworCitmdW5jdGlvbiBUTGlzdDxUPi5HZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsKK2JlZ2luCisgIFJlc3VsdCA6PSBpbmhlcml0ZWQgSXRlbXNbSW5kZXhdOworZW5kOworCitmdW5jdGlvbiBUTGlzdDxUPi5HZXRPbk5vdGlmeTogVENvbGxlY3Rpb25Ob3RpZnlFdmVudDxUPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBpbmhlcml0ZWQgT25Ob3RpZnk7CitlbmQ7CisKK2Z1bmN0aW9uIFRMaXN0PFQ+LkdldFJhbmdlKGNvbnN0IEluZGV4LCBDb3VudDogSW50ZWdlcik6IElMaXN0PFQ+OwordmFyCisgIEk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gVExpc3Q8VD4uQ3JlYXRlOworICBSZXN1bHQuQ2FwYWNpdHkgOj0gQ291bnQ7CisgIGZvciBJIDo9IEluZGV4IHRvIEluZGV4ICsgQ291bnQgLSAxIGRvCisgICAgUmVzdWx0LkFkZChHZXRJdGVtKEkpKTsKK2VuZDsKKworcHJvY2VkdXJlIFRMaXN0PFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBMaXN0OiBJTGlzdDxUPik7Cit2YXIKKyAgSXRlbTogVDsKK2JlZ2luCisgIGZvciBJdGVtIGluIExpc3QgZG8KKyAgYmVnaW4KKyAgICBJbnNlcnQoSW5kZXgsIEl0ZW0pOworICAgIEluYyhJbmRleCk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVExpc3Q8VD4uUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEOiBUR1VJRDsgb3V0IE9iaik6IEhSZXN1bHQ7CitiZWdpbgorICBpZiBHZXRJbnRlcmZhY2UoSUlELCBPYmopIHRoZW4KKyAgICBSZXN1bHQgOj0gMAorICBlbHNlCisgICAgUmVzdWx0IDo9IEVfTk9JTlRFUkZBQ0U7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGlzdDxUPi5TZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ2FwYWNpdHkgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGlzdDxUPi5TZXRDb3VudChWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ291bnQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGlzdDxUPi5TZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CitiZWdpbgorICBpbmhlcml0ZWQgSXRlbXNbSW5kZXhdIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVExpc3Q8VD4uU2V0T25Ob3RpZnkoVmFsdWU6IFRDb2xsZWN0aW9uTm90aWZ5RXZlbnQ8VD4pOworYmVnaW4KKyAgaW5oZXJpdGVkIE9uTm90aWZ5IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUTGlzdDxUPi5fQWRkUmVmOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEludGVybG9ja2VkSW5jcmVtZW50KEZSZWZDb3VudCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRMaXN0PFQ+Ll9SZWxlYXNlOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEludGVybG9ja2VkRGVjcmVtZW50KEZSZWZDb3VudCk7CisgIGlmIChSZXN1bHQgPSAwKSB0aGVuCisgICAgRGVzdHJveTsKK2VuZDsKKworeyBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IH0KKworcHJvY2VkdXJlIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5SZWhhc2goTmV3Q2FwUG93MjogSW50ZWdlcik7Cit2YXIKKyAgb2xkSXRlbXMsIG5ld0l0ZW1zOiBUSXRlbUFycmF5OworICBpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTmV3Q2FwUG93MiA9IExlbmd0aChGSXRlbXMpIHRoZW4KKyAgICBFeGl0CisgIGVsc2UgaWYgTmV3Q2FwUG93MiA8IDAgdGhlbgorICAgIE91dE9mTWVtb3J5RXJyb3I7CisKKyAgb2xkSXRlbXMgOj0gRkl0ZW1zOworICBTZXRMZW5ndGgobmV3SXRlbXMsIE5ld0NhcFBvdzIpOworICBGSXRlbXMgOj0gbmV3SXRlbXM7CisgIEZHcm93VGhyZXNob2xkIDo9IE5ld0NhcFBvdzIgc2hyIDEgKyBOZXdDYXBQb3cyIHNociAyOworCisgIGZvciBpIDo9IDAgdG8gTGVuZ3RoKG9sZEl0ZW1zKSAtIDEgZG8KKyAgICBpZiBvbGRJdGVtc1tpXS5IYXNoQ29kZSA8PiAwIHRoZW4KKyAgICAgIFJlaGFzaEFkZChvbGRJdGVtc1tpXS5IYXNoQ29kZSwgb2xkSXRlbXNbaV0uS2V5LCBvbGRJdGVtc1tpXS5WYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uU2V0Q2FwYWNpdHkoQUNhcGFjaXR5OiBJbnRlZ2VyKTsKK3ZhcgorICBuZXdDYXA6IEludGVnZXI7CitiZWdpbgorICBpZiBBQ2FwYWNpdHkgPCBGQ291bnQgdGhlbgorICAgIHJhaXNlIEVBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uQ3JlYXRlUmVzKEBzQXJndW1lbnRPdXRPZlJhbmdlKTsKKworICBpZiBBQ2FwYWNpdHkgPSAwIHRoZW4KKyAgICBSZWhhc2goMCkKKyAgZWxzZQorICBiZWdpbgorICAgIG5ld0NhcCA6PSA0OworICAgIHdoaWxlIG5ld0NhcCA8IEFDYXBhY2l0eSBkbworICAgICAgbmV3Q2FwIDo9IG5ld0NhcCBzaGwgMTsKKyAgICBSZWhhc2gobmV3Q2FwKTsKKyAgZW5kCitlbmQ7CisKK3Byb2NlZHVyZSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uR3JvdzsKK3ZhcgorICBuZXdDYXA6IEludGVnZXI7CitiZWdpbgorICBuZXdDYXAgOj0gTGVuZ3RoKEZJdGVtcykgKiAyOworICBpZiBuZXdDYXAgPSAwIHRoZW4KKyAgICBuZXdDYXAgOj0gNDsKKyAgUmVoYXNoKG5ld0NhcCk7CitlbmQ7CisKK2Z1bmN0aW9uIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5HZXRCdWNrZXRJbmRleChjb25zdCBLZXk6IFRLZXk7IEhhc2hDb2RlOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBzdGFydCwgaGM6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoRkl0ZW1zKSA9IDAgdGhlbgorICAgIEV4aXQobm90IEhpZ2goSW50ZWdlcikpOworCisgIHN0YXJ0IDo9IEhhc2hDb2RlIGFuZCAoTGVuZ3RoKEZJdGVtcykgLSAxKTsKKyAgUmVzdWx0IDo9IHN0YXJ0OworICB3aGlsZSBUcnVlIGRvCisgIGJlZ2luCisgICAgaGMgOj0gRkl0ZW1zW1Jlc3VsdF0uSGFzaENvZGU7CisKKyAgICAvLyBOb3QgZm91bmQ6IHJldHVybiBjb21wbGVtZW50IG9mIGluc2VydGlvbiBwb2ludC4KKyAgICBpZiBoYyA9IDAgdGhlbgorICAgICAgRXhpdChub3QgUmVzdWx0KTsKKworICAgIC8vIEZvdW5kOiByZXR1cm4gbG9jYXRpb24uCisgICAgaWYgKGhjID0gSGFzaENvZGUpIGFuZCBGQ29tcGFyZXIuRXF1YWxzKEZJdGVtc1tSZXN1bHRdLktleSwgS2V5KSB0aGVuCisgICAgICBFeGl0KFJlc3VsdCk7CisKKyAgICBJbmMoUmVzdWx0KTsKKyAgICBpZiBSZXN1bHQgPj0gTGVuZ3RoKEZJdGVtcykgdGhlbgorICAgICAgUmVzdWx0IDo9IDA7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5IYXNoKGNvbnN0IEtleTogVEtleSk6IEludGVnZXI7Citjb25zdAorICBQb3NpdGl2ZU1hc2sgPSBub3QgSW50ZWdlcigkODAwMDAwMDApOworYmVnaW4KKyAgLy8gRG91YmxlLUFicyB0byBhdm9pZCAtTWF4SW50IGFuZCBNaW5JbnQgcHJvYmxlbXMuCisgIC8vIE5vdCB1c2luZyBjb21waWxlci1BYnMgYmVjYXVzZSB3ZSAqbXVzdCogZ2V0IGEgcG9zaXRpdmUgaW50ZWdlcjsKKyAgLy8gZm9yIGNvbXBpbGVyLCBBYnMoTG93KEludGVnZXIpKSBpcyBhIG51bGwgb3AuCisgIFJlc3VsdCA6PSBQb3NpdGl2ZU1hc2sgYW5kICgoUG9zaXRpdmVNYXNrIGFuZCBGQ29tcGFyZXIuR2V0SGFzaENvZGUoS2V5KSkgKyAxKTsKK2VuZDsKKworZnVuY3Rpb24gVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOwordmFyCisgIGluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgaW5kZXggOj0gR2V0QnVja2V0SW5kZXgoS2V5LCBIYXNoKEtleSkpOworICBpZiBpbmRleCA8IDAgdGhlbgorICAgIHJhaXNlIEVMaXN0RXJyb3IuQ3JlYXRlUmVzKEBzR2VuZXJpY0l0ZW1Ob3RGb3VuZCk7CisgIFJlc3VsdCA6PSBGSXRlbXNbaW5kZXhdLlZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKK3ZhcgorICBpbmRleDogSW50ZWdlcjsKKyAgb2xkVmFsdWU6IFRWYWx1ZTsKK2JlZ2luCisgIGluZGV4IDo9IEdldEJ1Y2tldEluZGV4KEtleSwgSGFzaChLZXkpKTsKKyAgaWYgaW5kZXggPCAwIHRoZW4KKyAgICByYWlzZSBFTGlzdEVycm9yLkNyZWF0ZVJlcyhAc0dlbmVyaWNJdGVtTm90Rm91bmQpOworCisgIG9sZFZhbHVlIDo9IEZJdGVtc1tpbmRleF0uVmFsdWU7CisgIEZJdGVtc1tpbmRleF0uVmFsdWUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uUmVoYXNoQWRkKEhhc2hDb2RlOiBJbnRlZ2VyOyBjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOwordmFyCisgIGluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgaW5kZXggOj0gbm90IEdldEJ1Y2tldEluZGV4KEtleSwgSGFzaENvZGUpOworICBGSXRlbXNbaW5kZXhdLkhhc2hDb2RlIDo9IEhhc2hDb2RlOworICBGSXRlbXNbaW5kZXhdLktleSA6PSBLZXk7CisgIEZJdGVtc1tpbmRleF0uVmFsdWUgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEOiBUR1VJRDsKKyAgb3V0IE9iaik6IEhSZXN1bHQ7CitiZWdpbgorICBpZiBHZXRJbnRlcmZhY2UoSUlELCBPYmopIHRoZW4KKyAgICBSZXN1bHQgOj0gMAorICBlbHNlCisgICAgUmVzdWx0IDo9IEVfTk9JTlRFUkZBQ0U7CitlbmQ7CisKK2Z1bmN0aW9uIFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uX0FkZFJlZjogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBJbnRlcmxvY2tlZEluY3JlbWVudChGUmVmQ291bnQpOworZW5kOworCitmdW5jdGlvbiBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+Ll9SZWxlYXNlOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEludGVybG9ja2VkRGVjcmVtZW50KEZSZWZDb3VudCk7CisgIGlmIChSZXN1bHQgPSAwKSB0aGVuCisgICAgRGVzdHJveTsKK2VuZDsKKworY29uc3RydWN0b3IgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkNyZWF0ZShBQ2FwYWNpdHk6IEludGVnZXIgPSAwKTsKK2JlZ2luCisgIENyZWF0ZShBQ2FwYWNpdHksIG5pbCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5DcmVhdGUoY29uc3QgQUNvbXBhcmVyOiBJRXF1YWxpdHlDb21wYXJlcjxUS2V5Pik7CitiZWdpbgorICBDcmVhdGUoMCwgQUNvbXBhcmVyKTsKK2VuZDsKKworY29uc3RydWN0b3IgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkNyZWF0ZShBQ2FwYWNpdHk6IEludGVnZXI7IGNvbnN0IEFDb21wYXJlcjogSUVxdWFsaXR5Q29tcGFyZXI8VEtleT4pOwordmFyCisgIGNhcDogSW50ZWdlcjsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIGlmIEFDYXBhY2l0eSA8IDAgdGhlbgorICAgIHJhaXNlIEVBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uQ3JlYXRlUmVzKEBzQXJndW1lbnRPdXRPZlJhbmdlKTsKKyAgRkNvbXBhcmVyIDo9IEFDb21wYXJlcjsKKyAgaWYgRkNvbXBhcmVyID0gbmlsIHRoZW4KKyAgICBGQ29tcGFyZXIgOj0gVEVxdWFsaXR5Q29tcGFyZXI8VEtleT4uRGVmYXVsdDsKKyAgU2V0Q2FwYWNpdHkoQUNhcGFjaXR5KTsKK2VuZDsKKworY29uc3RydWN0b3IgVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5DcmVhdGUoCisgIENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFRQYWlyPFRLZXksIFRWYWx1ZT4+KTsKK3ZhcgorICBpdGVtOiBUUGFpcjxUS2V5LFRWYWx1ZT47CitiZWdpbgorICBDcmVhdGUoMCwgbmlsKTsKKyAgZm9yIGl0ZW0gaW4gQ29sbGVjdGlvbiBkbworICAgIEFkZE9yU2V0VmFsdWUoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOworZW5kOworCitjb25zdHJ1Y3RvciBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+LkNyZWF0ZSgKKyAgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VFBhaXI8VEtleSwgVFZhbHVlPj47CisgIGNvbnN0IEFDb21wYXJlcjogSUVxdWFsaXR5Q29tcGFyZXI8VEtleT4pOwordmFyCisgIGl0ZW06IFRQYWlyPFRLZXksVFZhbHVlPjsKK2JlZ2luCisgIENyZWF0ZSgwLCBBQ29tcGFyZXIpOworICBmb3IgaXRlbSBpbiBDb2xsZWN0aW9uIGRvCisgICAgQWRkT3JTZXRWYWx1ZShpdGVtLktleSwgaXRlbS5WYWx1ZSk7CitlbmQ7CisKK2Rlc3RydWN0b3IgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkRlc3Ryb3k7CitiZWdpbgorICBDbGVhcjsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkFkZChjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOwordmFyCisgIGluZGV4LCBoYzogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZDb3VudCA+PSBGR3Jvd1RocmVzaG9sZCB0aGVuCisgICAgR3JvdzsKKworICBoYyA6PSBIYXNoKEtleSk7CisgIGluZGV4IDo9IEdldEJ1Y2tldEluZGV4KEtleSwgaGMpOworICBpZiBpbmRleCA+PSAwIHRoZW4KKyAgICByYWlzZSBFTGlzdEVycm9yLkNyZWF0ZVJlcyhAc0dlbmVyaWNEdXBsaWNhdGVJdGVtKTsKKworICBEb0FkZChoYywgbm90IGluZGV4LCBLZXksIFZhbHVlKTsKK2VuZDsKKworZnVuY3Rpb24gSW5DaXJjdWxhclJhbmdlKEJvdHRvbSwgSXRlbSwgVG9wSW5jOiBJbnRlZ2VyKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoQm90dG9tIDwgSXRlbSkgYW5kIChJdGVtIDw9IFRvcEluYykgLy8gbm9ybWFsCisgICAgb3IgKFRvcEluYyA8IEJvdHRvbSkgYW5kIChJdGVtID4gQm90dG9tKSAvLyB0b3Agd3JhcHBlZAorICAgIG9yIChUb3BJbmMgPCBCb3R0b20pIGFuZCAoSXRlbSA8PSBUb3BJbmMpIC8vIHRvcCBhbmQgaXRlbSB3cmFwcGVkCitlbmQ7CisKK3Byb2NlZHVyZSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7Cit2YXIKKyAgZ2FwLCBpbmRleCwgaGMsIGJ1Y2tldDogSW50ZWdlcjsKKyAgb2xkVmFsdWU6IFRWYWx1ZTsKK2JlZ2luCisgIGhjIDo9IEhhc2goS2V5KTsKKyAgaW5kZXggOj0gR2V0QnVja2V0SW5kZXgoS2V5LCBoYyk7CisgIGlmIGluZGV4IDwgMCB0aGVuCisgICAgRXhpdDsKKworICAvLyBSZW1vdmluZyBpdGVtIGZyb20gbGluZWFyIHByb2JlIGhhc2ggdGFibGUgaXMgbW9kZXJhdGVseQorICAvLyB0cmlja3kuIFdlIG5lZWQgdG8gZmlsbCBpbiBnYXBzLCB3aGljaCB3aWxsIGludm9sdmUgbW92aW5nIGl0ZW1zCisgIC8vIHdoaWNoIG1heSBub3QgZXZlbiBoYXNoIHRvIHRoZSBzYW1lIGxvY2F0aW9uLgorICAvLyBLbnV0aCBjb3ZlcnMgaXQgd2VsbCBlbm91Z2ggaW4gVm9sIElJSS4gNi40LjsgYnV0IGJld2FyZSwgQWxnb3JpdGhtIFIKKyAgLy8gKDJuZCBlZCkgaGFzIGEgYnVnOiBzdGVwIFI0IHNob3VsZCBnbyB0byBzdGVwIFIxLCBub3QgUjIgKGFscmVhZHkgZXJyYXRhJ2QpLgorICAvLyBNeSB2ZXJzaW9uIGRvZXMgbGluZWFyIHByb2JpbmcgZm9yd2FyZCwgbm90IGJhY2t3YXJkLCBob3dldmVyLgorCisgIC8vIGdhcCByZWZlcnMgdG8gdGhlIGhvbGUgdGhhdCBuZWVkcyBmaWxsaW5nLWluIGJ5IHNoaWZ0aW5nIGl0ZW1zIGRvd24uCisgIC8vIGluZGV4IHNlYXJjaGVzIGZvciBpdGVtcyB0aGF0IGhhdmUgYmVlbiBwcm9iZWQgb3V0IG9mIHRoZWlyIHNsb3QsCisgIC8vIGJ1dCBiZWluZyBjYXJlZnVsIG5vdCB0byBtb3ZlIGl0ZW1zIGlmIHRoZWlyIGJ1Y2tldCBpcyBiZXR3ZWVuCisgIC8vIG91ciBnYXAgYW5kIG91ciBpbmRleCAoc28gdGhhdCB0aGV5J2QgYmUgbW92ZWQgYmVmb3JlIHRoZWlyIGJ1Y2tldCkuCisgIC8vIFdlIG1vdmUgdGhlIGl0ZW0gYXQgaW5kZXggaW50byB0aGUgZ2FwLCB3aGVyZXVwb24gdGhlIG5ldyBnYXAgaXMKKyAgLy8gYXQgdGhlIGluZGV4LiBJZiB0aGUgaW5kZXggaGl0cyBhIGhvbGUsIHRoZW4gd2UncmUgZG9uZS4KKworICAvLyBJZiBvdXIgbG9hZCBmYWN0b3Igd2FzIGV4YWN0bHkgMSwgd2UnbGwgbmVlZCB0byBoaXQgdGhpcyBob2xlCisgIC8vIGluIG9yZGVyIHRvIHRlcm1pbmF0ZS4gU2hvdWxkbid0IG5vcm1hbGx5IGJlIG5lY2Vzc2FyeSwgdGhvdWdoLgorICBGSXRlbXNbaW5kZXhdLkhhc2hDb2RlIDo9IDA7CisKKyAgZ2FwIDo9IGluZGV4OworICB3aGlsZSBUcnVlIGRvCisgIGJlZ2luCisgICAgSW5jKGluZGV4KTsKKyAgICBpZiBpbmRleCA9IExlbmd0aChGSXRlbXMpIHRoZW4KKyAgICAgIGluZGV4IDo9IDA7CisKKyAgICBoYyA6PSBGSXRlbXNbaW5kZXhdLkhhc2hDb2RlOworICAgIGlmIGhjID0gMCB0aGVuCisgICAgICBCcmVhazsKKworICAgIGJ1Y2tldCA6PSBoYyBhbmQgKExlbmd0aChGSXRlbXMpIC0gMSk7CisgICAgaWYgbm90IEluQ2lyY3VsYXJSYW5nZShnYXAsIGJ1Y2tldCwgaW5kZXgpIHRoZW4KKyAgICBiZWdpbgorICAgICAgRkl0ZW1zW2dhcF0gOj0gRkl0ZW1zW2luZGV4XTsKKyAgICAgIGdhcCA6PSBpbmRleDsKKyAgICAgIC8vIFRoZSBnYXAgbW92ZWQsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGZpbmQgaXQgdG8gdGVybWluYXRlLgorICAgICAgRkl0ZW1zW2dhcF0uSGFzaENvZGUgOj0gMDsKKyAgICBlbmQ7CisgIGVuZDsKKworICBGSXRlbXNbZ2FwXS5IYXNoQ29kZSA6PSAwOworICBGSXRlbXNbZ2FwXS5LZXkgOj0gRGVmYXVsdChUS2V5KTsKKyAgb2xkVmFsdWUgOj0gRkl0ZW1zW2dhcF0uVmFsdWU7CisgIEZJdGVtc1tnYXBdLlZhbHVlIDo9IERlZmF1bHQoVFZhbHVlKTsKKyAgRGVjKEZDb3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uQ2xlYXI7CitiZWdpbgorICBGQ291bnQgOj0gMDsKKyAgRkdyb3dUaHJlc2hvbGQgOj0gMDsKKyAgU2V0TGVuZ3RoKEZJdGVtcywgMCk7CisgIFNldENhcGFjaXR5KDApOworZW5kOworCitwcm9jZWR1cmUgVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRyaW1FeGNlc3M7CitiZWdpbgorICBTZXRDYXBhY2l0eShGQ291bnQpOworZW5kOworCitmdW5jdGlvbiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVHJ5R2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBvdXQgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47Cit2YXIKKyAgaW5kZXg6IEludGVnZXI7CitiZWdpbgorICBpbmRleCA6PSBHZXRCdWNrZXRJbmRleChLZXksIEhhc2goS2V5KSk7CisgIFJlc3VsdCA6PSBpbmRleCA+PSAwOworICBpZiBSZXN1bHQgdGhlbgorICAgIFZhbHVlIDo9IEZJdGVtc1tpbmRleF0uVmFsdWUKKyAgZWxzZQorICAgIFZhbHVlIDo9IERlZmF1bHQoVFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5Eb0FkZChIYXNoQ29kZSwgSW5kZXg6IEludGVnZXI7IGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGSXRlbXNbSW5kZXhdLkhhc2hDb2RlIDo9IEhhc2hDb2RlOworICBGSXRlbXNbSW5kZXhdLktleSA6PSBLZXk7CisgIEZJdGVtc1tJbmRleF0uVmFsdWUgOj0gVmFsdWU7CisgIEluYyhGQ291bnQpOworZW5kOworCitmdW5jdGlvbiBURGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+LkRvR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSwgVFZhbHVlPj47CitiZWdpbgorICBSZXN1bHQgOj0gR2V0RW51bWVyYXRvcjsKK2VuZDsKKworcHJvY2VkdXJlIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5BZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBpZiBDb250YWluc0tleShLZXkpIHRoZW4KKyAgICBTZXRJdGVtKEtleSxWYWx1ZSkKKyAgZWxzZQorICAgIEFkZChLZXksVmFsdWUpOworZW5kOworCitmdW5jdGlvbiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRCdWNrZXRJbmRleChLZXksIEhhc2goS2V5KSkgPj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LkNvbnRhaW5zVmFsdWUoY29uc3QgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47Cit2YXIKKyAgaTogSW50ZWdlcjsKKyAgYzogSUVxdWFsaXR5Q29tcGFyZXI8VFZhbHVlPjsKK2JlZ2luCisgIGMgOj0gVEVxdWFsaXR5Q29tcGFyZXI8VFZhbHVlPi5EZWZhdWx0OworCisgIGZvciBpIDo9IDAgdG8gTGVuZ3RoKEZJdGVtcykgLSAxIGRvCisgICAgaWYgKEZJdGVtc1tpXS5IYXNoQ29kZSA8PiAwKSBhbmQgYy5FcXVhbHMoRkl0ZW1zW2ldLlZhbHVlLCBWYWx1ZSkgdGhlbgorICAgICAgRXhpdChUcnVlKTsKKyAgUmVzdWx0IDo9IEZhbHNlOworZW5kOworCitmdW5jdGlvbiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uR2V0RW51bWVyYXRvcjogVFBhaXJFbnVtZXJhdG9yOworYmVnaW4KKyAgUmVzdWx0IDo9IFRQYWlyRW51bWVyYXRvci5DcmVhdGUoU2VsZik7CitlbmQ7CisKKy8vIFBhaXJzCisKK2NvbnN0cnVjdG9yIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UUGFpckVudW1lcmF0b3IuQ3JlYXRlKEFEaWN0aW9uYXJ5OiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkluZGV4IDo9IC0xOworICBGRGljdGlvbmFyeSA6PSBBRGljdGlvbmFyeTsKK2VuZDsKKworZnVuY3Rpb24gVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5UUGFpckVudW1lcmF0b3IuRG9HZXRDdXJyZW50OiBUUGFpcjxUS2V5LCBUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0IDo9IEdldEN1cnJlbnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uVFBhaXJFbnVtZXJhdG9yLkRvTW92ZU5leHQ6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gTW92ZU5leHQ7CitlbmQ7CisKK2Z1bmN0aW9uIFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UUGFpckVudW1lcmF0b3IuR2V0Q3VycmVudDogVFBhaXI8VEtleSxUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0LktleSA6PSBGRGljdGlvbmFyeS5GSXRlbXNbRkluZGV4XS5LZXk7CisgIFJlc3VsdC5WYWx1ZSA6PSBGRGljdGlvbmFyeS5GSXRlbXNbRkluZGV4XS5WYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRQYWlyRW51bWVyYXRvci5Nb3ZlTmV4dDogQm9vbGVhbjsKK2JlZ2luCisgIHdoaWxlIEZJbmRleCA8IExlbmd0aChGRGljdGlvbmFyeS5GSXRlbXMpIC0gMSBkbworICBiZWdpbgorICAgIEluYyhGSW5kZXgpOworICAgIGlmIEZEaWN0aW9uYXJ5LkZJdGVtc1tGSW5kZXhdLkhhc2hDb2RlIDw+IDAgdGhlbgorICAgICAgRXhpdChUcnVlKTsKKyAgZW5kOworICBSZXN1bHQgOj0gRmFsc2U7CitlbmQ7CisKK3sgVExvY2FsU3RvcmFnZSB9CisKK3Byb2NlZHVyZSBUTG9jYWxTdG9yYWdlLkZpbmFsaXplOwordmFyCisgIEk6IEludGVnZXI7CitiZWdpbgorICBmb3IgSSA6PSAwIHRvIEZDb3VudCAtIDEgZG8KKyAgICBpZiAoRkVudHJpZXNbSV0uRkRhdGFUeXBlID0gZHRJbnRlcmZhY2UpIHRoZW4KKyAgICAgIElJbnRlcmZhY2UoRkVudHJpZXNbSV0uRlZhbHVlKSA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRMb2NhbFN0b3JhZ2UuR2V0QXNJbnRlZ2VyKGNvbnN0IE5hbWU6IFN0cmluZyk6IEludGVnZXI7Cit2YXIKKyAgSTogSW50ZWdlcjsKK2JlZ2luCisgIGZvciBJIDo9IDAgdG8gRkNvdW50IC0gMSBkbworICAgIGlmIChGRW50cmllc1tJXS5GTmFtZSA9IE5hbWUpIHRoZW4KKyAgICAgIEV4aXQoSW50ZWdlcihGRW50cmllc1tJXS5GVmFsdWUpKTsKKyAgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRMb2NhbFN0b3JhZ2UuR2V0QXNJbnRlcmZhY2UoY29uc3QgTmFtZTogU3RyaW5nKTogSUludGVyZmFjZTsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgZm9yIEkgOj0gMCB0byBGQ291bnQgLSAxIGRvCisgICAgaWYgKEZFbnRyaWVzW0ldLkZOYW1lID0gTmFtZSkgdGhlbgorICAgICAgRXhpdChJSW50ZXJmYWNlKEZFbnRyaWVzW0ldLkZWYWx1ZSkpOworICBSZXN1bHQgOj0gbmlsOworZW5kOworCitwcm9jZWR1cmUgVExvY2FsU3RvcmFnZS5Jbml0aWFsaXplOworYmVnaW4KKyAgRkNvdW50IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUTG9jYWxTdG9yYWdlLlNldEFzSW50ZWdlcihjb25zdCBOYW1lOiBTdHJpbmc7IGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgZm9yIEkgOj0gMCB0byBGQ291bnQgLSAxIGRvCisgICAgaWYgKEZFbnRyaWVzW0ldLkZOYW1lID0gTmFtZSkgdGhlbgorICAgIGJlZ2luCisgICAgICBGRW50cmllc1tJXS5GVmFsdWUgOj0gUG9pbnRlcihWYWx1ZSk7CisgICAgICBFeGl0OworICAgIGVuZDsKKyAgRkVudHJpZXNbRkNvdW50XS5GTmFtZSA6PSBOYW1lOworICBGRW50cmllc1tGQ291bnRdLkZWYWx1ZSA6PSBQb2ludGVyKFZhbHVlKTsKKyAgRkVudHJpZXNbRkNvdW50XS5GRGF0YVR5cGUgOj0gZHRJbnRlZ2VyOworICBJbmMoRkNvdW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRMb2NhbFN0b3JhZ2UuU2V0QXNJbnRlcmZhY2UoY29uc3QgTmFtZTogU3RyaW5nOworICBjb25zdCBWYWx1ZTogSUludGVyZmFjZSk7Cit2YXIKKyAgSTogSW50ZWdlcjsKK2JlZ2luCisgIGZvciBJIDo9IDAgdG8gRkNvdW50IC0gMSBkbworICAgIGlmIChGRW50cmllc1tJXS5GTmFtZSA9IE5hbWUpIHRoZW4KKyAgICBiZWdpbgorICAgICAgSUludGVyZmFjZShGRW50cmllc1tJXS5GVmFsdWUpIDo9IFZhbHVlOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisgIEZFbnRyaWVzW0ZDb3VudF0uRk5hbWUgOj0gTmFtZTsKKyAgRkVudHJpZXNbRkNvdW50XS5GVmFsdWUgOj0gbmlsOworICBJSW50ZXJmYWNlKEZFbnRyaWVzW0ZDb3VudF0uRlZhbHVlKSA6PSBWYWx1ZTsKKyAgRkVudHJpZXNbRkNvdW50XS5GRGF0YVR5cGUgOj0gZHRJbnRlcmZhY2U7CisgIEluYyhGQ291bnQpOworZW5kOworCitlbmQuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLlRyZWUucGFzIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBmNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5UcmVlLnBhcwpAQCAtMCwwICsxLDUwNjMgQEAKK3VuaXQgQW50bHIuUnVudGltZS5UcmVlOworKCoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOCBFcmlrIHZhbiBCaWxzZW4KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIE1VU1QgUkVUQUlOIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBNVVNUIFJFUFJPRFVDRSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCisgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAorICAgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIFdSSVRURU4gcGVybWlzc2lvbi4KKzQuIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwgYW55IGNvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IAorICAgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyB3b3JrIHRvIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgbGljZW5zb3IKKyAgIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2UsIHdpdGhvdXQgYW55IAorICAgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKQorCitpbnRlcmZhY2UKKworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMH0KK3skTUVTU0FHRSBFUlJPUiAnWW91IG5lZWQgRGVscGhpIDIwMDkgb3IgaGlnaGVyIHRvIHVzZSB0aGUgQW50bHIgcnVudGltZSd9Cit7JElGRU5EfQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBBbnRsci5SdW50aW1lLAorICBBbnRsci5SdW50aW1lLlRvb2xzLAorICBBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zOworCit0eXBlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhvdyB0byBjcmVhdGUgYW5kIG5hdmlnYXRlIHRyZWVzLiAgUmF0aGVyIHRoYW4gaGF2ZSBhIHNlcGFyYXRlIGZhY3RvcnkKKyAgLy8vIGFuZCBhZGFwdG9yLCBJJ3ZlIG1lcmdlZCB0aGVtLiAgTWFrZXMgc2Vuc2UgdG8gZW5jYXBzdWxhdGUuCisgIC8vLworICAvLy8gVGhpcyB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHRyZWUgY29uc3RydWN0aW9uIGNvZGUgZ2VuZXJhdGVkIGluIHRoZQorICAvLy8gZ2VuZXJhdGVkIGNvZGUgaW4gMi54IGFuZCB0aGUgQVNURmFjdG9yeS4KKyAgLy8vCisgIC8vLyBJIGRvIG5vdCBuZWVkIHRvIGtub3cgdGhlIHR5cGUgb2YgYSB0cmVlIGF0IGFsbCBzbyB0aGV5IGFyZSBhbGwKKyAgLy8vIGdlbmVyaWMgT2JqZWN0cy4gIFRoaXMgbWF5IGluY3JlYXNlIHRoZSBhbW91bnQgb2YgdHlwZWNhc3RpbmcgbmVlZGVkLiA6KAorICAvLy8gPC9zdW1tYXJ5PgorICBJVHJlZUFkYXB0b3IgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3tGOURFQjI4Ni1GNTU1LTRDQzgtQTUxQS05M0YzRjY0OUIyNDh9J10KKyAgICB7IE1ldGhvZHMgfQorCisgICAgLy8gQyBvIG4gcyB0IHIgdSBjIHQgaSBvIG4KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ3JlYXRlIGEgdHJlZSBub2RlIGZyb20gVG9rZW4gb2JqZWN0OyBmb3IgQ29tbW9uVHJlZSB0eXBlIHRyZWVzLAorICAgIC8vLyB0aGVuIHRoZSB0b2tlbiBqdXN0IGJlY29tZXMgdGhlIHBheWxvYWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGNyZWF0ZSBjYWxsLiBPdmVycmlkZSBpZiB5b3Ugd2FudCBhbm90aGVyIGtpbmQgb2Ygbm9kZSB0byBiZSBidWlsdC4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIENyZWF0ZU5vZGUoY29uc3QgUGF5bG9hZDogSVRva2VuKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT5EdXBsaWNhdGUgYSBzaW5nbGUgdHJlZSBub2RlIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+IE92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LjwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBEdXBOb2RlKGNvbnN0IFRyZWVOb2RlOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+RHVwbGljYXRlIHRyZWUgcmVjdXJzaXZlbHksIHVzaW5nIER1cE5vZGUoKSBmb3IgZWFjaCBub2RlIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBEdXBUcmVlKGNvbnN0IFRyZWU6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJuIGEgbmlsIG5vZGUgKGFuIGVtcHR5IGJ1dCBub24tbnVsbCBub2RlKSB0aGF0IGNhbiBob2xkCisgICAgLy8vIGEgbGlzdCBvZiBlbGVtZW50IGFzIHRoZSBjaGlsZHJlbi4gIElmIHlvdSB3YW50IGEgZmxhdCB0cmVlIChhIGxpc3QpCisgICAgLy8vIHVzZSAidD1hZGFwdG9yLm5pbCgpOyB0LkFkZENoaWxkKHgpOyB0LkFkZENoaWxkKHkpOyIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEdldE5pbE5vZGU6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJuIGEgdHJlZSBub2RlIHJlcHJlc2VudGluZyBhbiBlcnJvci4gVGhpcyBub2RlIHJlY29yZHMgdGhlCisgICAgLy8vIHRva2VucyBjb25zdW1lZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuIFRoZSBzdGFydCB0b2tlbiBpbmRpY2F0ZXMgdGhlCisgICAgLy8vIGlucHV0IHN5bWJvbCBhdCB3aGljaCB0aGUgZXJyb3Igd2FzIGRldGVjdGVkLiBUaGUgc3RvcCB0b2tlbiBpbmRpY2F0ZXMKKyAgICAvLy8gdGhlIGxhc3Qgc3ltYm9sIGNvbnN1bWVkIGR1cmluZyByZWNvdmVyeS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gPHBhcmE+WW91IG11c3Qgc3BlY2lmeSB0aGUgaW5wdXQgc3RyZWFtIHNvIHRoYXQgdGhlIGVycm9uZW91cyB0ZXh0IGNhbgorICAgIC8vLyBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gVGhlIGV4Y2VwdGlvbiBjb3VsZCBiZSB1c2VmdWwKKyAgICAvLy8gdG8gc29tZSBhcHBsaWNhdGlvbnM7IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3RvcmVzIHB0ciB0byBpdCBpbgorICAgIC8vLyB0aGUgQ29tbW9uRXJyb3JOb2RlLjwvcGFyYT4KKyAgICAvLy8KKyAgICAvLy8gPHBhcmE+VGhpcyBvbmx5IG1ha2VzIHNlbnNlIGR1cmluZyB0b2tlbiBwYXJzaW5nLCBub3QgdHJlZSBwYXJzaW5nLgorICAgIC8vLyBUcmVlIHBhcnNpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gcGFyc2luZyBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24KKyAgICAvLy8gc3VjY2VlZC48L3BhcmE+CisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBFcnJvck5vZGUoY29uc3QgSW5wdXQ6IElUb2tlblN0cmVhbTsgY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbjsKKyAgICAgIGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSXMgdHJlZSBjb25zaWRlcmVkIGEgbmlsIG5vZGUgdXNlZCB0byBtYWtlIGxpc3RzIG9mIGNoaWxkIG5vZGVzPworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gSXNOaWwoY29uc3QgVHJlZTogSUFOVExSSW50ZXJmYWNlKTogQm9vbGVhbjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIGEgY2hpbGQgdG8gdGhlIHRyZWUgdC4gIElmIGNoaWxkIGlzIGEgZmxhdCB0cmVlIChhIGxpc3QpLCBtYWtlIGFsbAorICAgIC8vLyBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIDxwYXJhPgorICAgIC8vLyBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91CisgICAgLy8vIGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYSB0LmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47CisgICAgLy8vIGkuZS4sIHdpdGhvdXQgY29weWluZyB0aGUgYXJyYXkuICBKdXN0IG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudAorICAgIC8vLyB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZCBBU1RzLiBEbyBub3RoaW5nIGlmIHQgb3IgY2hpbGQgaXMgbnVsbC4KKyAgICAvLy8gPC9wYXJhPgorICAgIC8vLyA8cGFyYT4KKyAgICAvLy8gVGhpcyBpcyBmb3IgY29uc3RydWN0aW9uIGFuZCBJJ20gbm90IHN1cmUgaXQncyBjb21wbGV0ZWx5IGdlbmVyYWwgZm9yCisgICAgLy8vIGEgdHJlZSdzIGFkZENoaWxkIG1ldGhvZCB0byB3b3JrIHRoaXMgd2F5LiAgTWFrZSBzdXJlIHlvdSBkaWZmZXJlbnRpYXRlCisgICAgLy8vIGJldHdlZW4geW91ciB0cmVlJ3MgYWRkQ2hpbGQgYW5kIHRoaXMgcGFyc2VyIHRyZWUgY29uc3RydWN0aW9uIGFkZENoaWxkCisgICAgLy8vIGlmIGl0J3Mgbm90IG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB3aXRoIGEgc2ltcGxlIGFzc2lnbm1lbnQuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHByb2NlZHVyZSBBZGRDaGlsZChjb25zdCBULCBDaGlsZDogSUFOVExSSW50ZXJmYWNlKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAgICAvLy8gSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vCisgICAgLy8vICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAgICAvLy8gICBvbGQ9XihhIGIgYyksIG5ldz1yIHlpZWxkcyBeKHIgXihhIGIgYykpCisgICAgLy8vCisgICAgLy8vIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorICAgIC8vLyBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAgICAvLy8KKyAgICAvLy8gICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAgICAvLy8gICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgIC8vLworICAgIC8vLyBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAgICAvLy8KKyAgICAvLy8gICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAgICAvLy8gICBvbGQ9bnVsbCwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKG5pbCByKQorICAgIC8vLworICAgIC8vLyBSZXR1cm4gbmV3Um9vdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBuZXdSb290IGlzIG5vdCBhCisgICAgLy8vIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAgICAvLy8gbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAgICAvLy8KKyAgICAvLy8gQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgICAgLy8vIGNoaWxkcmVuOyBpLmUuLCB5b3UgZG9uJ3QgaGF2ZSB0byBjb3B5IHRoZSBsaXN0LiAgV2UgYXJlCisgICAgLy8vIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgICAgLy8vIGVmZmljaWVuY3kuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBCZWNvbWVSb290KGNvbnN0IE5ld1Jvb3QsIE9sZFJvb3Q6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdpdmVuIHRoZSByb290IG9mIHRoZSBzdWJ0cmVlIGNyZWF0ZWQgZm9yIHRoaXMgcnVsZSwgcG9zdCBwcm9jZXNzCisgICAgLy8vIGl0IHRvIGRvIGFueSBzaW1wbGlmaWNhdGlvbnMgb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBBIHJlcXVpcmVkCisgICAgLy8vIGJlaGF2aW9yIGlzIHRvIGNvbnZlcnQgXihuaWwgc2luZ2xlU3VidHJlZSkgdG8gc2luZ2xlU3VidHJlZQorICAgIC8vLyBhcyB0aGUgc2V0dGluZyBvZiBzdGFydC9zdG9wIGluZGV4ZXMgcmVsaWVzIG9uIGEgc2luZ2xlIG5vbi1uaWwgcm9vdAorICAgIC8vLyBmb3Igbm9uLWZsYXQgdHJlZXMuCisgICAgLy8vCisgICAgLy8vIEZsYXQgdHJlZXMgc3VjaCBhcyBmb3IgbGlzdHMgbGlrZSAiaWRsaXN0IDogSUQrIDsiIGFyZSBsZWZ0IGFsb25lCisgICAgLy8vIHVubGVzcyB0aGVyZSBpcyBvbmx5IG9uZSBJRC4gIEZvciBhIGxpc3QsIHRoZSBzdGFydC9zdG9wIGluZGV4ZXMKKyAgICAvLy8gYXJlIHNldCBpbiB0aGUgbmlsIG5vZGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGFmdGVyIGFsbCBydWxlIHRyZWUgY29uc3RydWN0aW9uIGFuZCByaWdodAorICAgIC8vLyBiZWZvcmUgU2V0VG9rZW5Cb3VuZGFyaWVzKCkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBSdWxlUG9zdFByb2Nlc3NpbmcoY29uc3QgUm9vdDogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBGb3IgaWRlbnRpZnlpbmcgdHJlZXMuIEhvdyB0byBpZGVudGlmeSBub2RlcyBzbyB3ZSBjYW4gc2F5ICJhZGQgbm9kZQorICAgIC8vLyB0byBhIHByaW9yIG5vZGUiPworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBFdmVuIEJlY29tZVJvb3QgaXMgYW4gaXNzdWUuIE9rLCB3ZSBjb3VsZDoKKyAgICAvLy8gPGxpc3QgdHlwZT0ibnVtYmVyIj4KKyAgICAvLy8gICA8aXRlbT5OdW1iZXIgdGhlIG5vZGVzIGFzIHRoZXkgYXJlIGNyZWF0ZWQ/PC9pdGVtPgorICAgIC8vLyAgIDxpdGVtPgorICAgIC8vLyAgICAgVXNlIHRoZSBvcmlnaW5hbCBmcmFtZXdvcmsgYXNzaWduZWQgaGFzaGNvZGUgdGhhdCdzIHVuaXF1ZQorICAgIC8vLyAgICAgYWNyb3NzIGluc3RhbmNlcyBvZiBhIGdpdmVuIHR5cGUuCisgICAgLy8vICAgICBXQVJOSU5HOiBUaGlzIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgZWl0aGVyIGFzIElMIHRvIG1ha2UgYQorICAgIC8vLyAgICAgbm9uLXZpcnQgY2FsbCB0byBvYmplY3QuR2V0SGFzaENvZGUoKSBvciBieSB2aWEgYSBjYWxsIHRvCisgICAgLy8vICAgICBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzLlJ1bnRpbWVIZWxwZXJzLkdldEhhc2hDb2RlKCkuCisgICAgLy8vICAgICBCb3RoIGhhdmUgaXNzdWVzIGVzcGVjaWFsbHkgb24gLk5FVCAxLnggYW5kIE1vbm8uCisgICAgLy8vICAgPC9pdGVtPgorICAgIC8vLyA8L2xpc3Q+CisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBHZXRVbmlxdWVJRChjb25zdCBOb2RlOiBJQU5UTFJJbnRlcmZhY2UpOiBJbnRlZ2VyOworCisgICAgLy8gUiBlIHcgciBpIHQgZSAgUiB1IGwgZSBzCisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENyZWF0ZSBhIG5vZGUgZm9yIG5ld1Jvb3QgbWFrZSBpdCB0aGUgcm9vdCBvZiBvbGRSb290LgorICAgIC8vLyBJZiBvbGRSb290IGlzIGEgbmlsIHJvb3QsIGp1c3QgY29weSBvciBtb3ZlIHRoZSBjaGlsZHJlbiB0byBuZXdSb290LgorICAgIC8vLyBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuIG5vZGUgY3JlYXRlZCBmb3IgbmV3Um9vdC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEJlY29tZVJvb3QoY29uc3QgTmV3Um9vdDogSVRva2VuOyBjb25zdCBPbGRSb290OiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PkNyZWF0ZSBhIG5ldyBub2RlIGRlcml2ZWQgZnJvbSBhIHRva2VuLCB3aXRoIGEgbmV3IHRva2VuIHR5cGUuCisgICAgLy8vIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAgICAvLy8gcmV3cml0ZSBydWxlIGFzIElNQUdbJHRva2VuTGFiZWxdLgorICAgIC8vLworICAgIC8vLyBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gQ3JlYXRlTm9kZShjb25zdCBUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IEZyb21Ub2tlbjogSVRva2VuKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT5TYW1lIGFzIENyZWF0ZSh0b2tlblR5cGUsZnJvbVRva2VuKSBleGNlcHQgc2V0IHRoZSB0ZXh0IHRvby4KKyAgICAvLy8gVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgIC8vLyByZXdyaXRlIHJ1bGUgYXMgSU1BR1skdG9rZW5MYWJlbCwgIklNQUciXS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBzaG91bGQgaW52b2tlIGNyZWF0ZVRva2VuKFRva2VuKS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIENyZWF0ZU5vZGUoY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOyBjb25zdCBGcm9tVG9rZW46IElUb2tlbjsKKyAgICAgIGNvbnN0IFRleHQ6IFN0cmluZyk6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+Q3JlYXRlIGEgbmV3IG5vZGUgZGVyaXZlZCBmcm9tIGEgdG9rZW4sIHdpdGggYSBuZXcgdG9rZW4gdHlwZS4KKyAgICAvLy8gVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICAgIC8vLyByZXdyaXRlIHJ1bGUgYXMgSU1BR1siSU1BRyJdLgorICAgIC8vLworICAgIC8vLyBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oaW50LFN0cmluZykuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBDcmVhdGVOb2RlKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKworICAgIC8vIEMgbyBuIHQgZSBuIHQKKworICAgIC8vLyA8c3VtbWFyeT5Gb3IgdHJlZSBwYXJzaW5nLCBJIG5lZWQgdG8ga25vdyB0aGUgdG9rZW4gdHlwZSBvZiBhIG5vZGUgPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEdldE5vZGVUeXBlKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+Tm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdHlwZSBvZiBhIG5vZGUgPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBTZXROb2RlVHlwZShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IE5vZGVUeXBlOiBJbnRlZ2VyKTsKKworICAgIGZ1bmN0aW9uIEdldE5vZGVUZXh0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IFN0cmluZzsKKworICAgIC8vLyA8c3VtbWFyeT5Ob2RlIGNvbnN0cnVjdG9ycyBjYW4gc2V0IHRoZSB0ZXh0IG9mIGEgbm9kZSA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFNldE5vZGVUZXh0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVGV4dDogU3RyaW5nKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJuIHRoZSB0b2tlbiBvYmplY3QgZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2UuIFRoZSBlcnJvcgorICAgIC8vLyBkaXNwbGF5IHJvdXRpbmUgaW4gQmFzZVJlY29nbml6ZXIgbmVlZHMgdG8gZGlzcGxheSB3aGVyZSB0aGUKKyAgICAvLy8gaW5wdXQgdGhlIGVycm9yIG9jY3VycmVkLiBJZiB5b3VyIHRyZWUgb2YgbGltaXRhdGlvbiBkb2VzIG5vdAorICAgIC8vLyBzdG9yZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBsZWFkIHlvdSB0byB0aGUgdG9rZW4sIHlvdSBjYW4gY3JlYXRlCisgICAgLy8vIGEgdG9rZW4gZmlsbGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGFuZCBwYXNzIHRoYXQgYmFjay4KKyAgICAvLy8gPHNlZSBjcmVmPSJCYXNlUmVjb2duaXplci5HZXRFcnJvck1lc3NhZ2UiLz4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIEdldFRva2VuKGNvbnN0IFRyZWVOb2RlOiBJQU5UTFJJbnRlcmZhY2UpOiBJVG9rZW47CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdoZXJlIGFyZSB0aGUgYm91bmRzIGluIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0gZm9yIHRoaXMgbm9kZSBhbmQKKyAgICAvLy8gYWxsIGNoaWxkcmVuPworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBFYWNoIHJ1bGUgdGhhdCBjcmVhdGVzIEFTVCBub2RlcyB3aWxsIGNhbGwgdGhpcworICAgIC8vLyBtZXRob2QgcmlnaHQgYmVmb3JlIHJldHVybmluZy4gIEZsYXQgdHJlZXMgKGkuZS4sIGxpc3RzKSB3aWxsCisgICAgLy8vIHN0aWxsIHVzdWFsbHkgaGF2ZSBhIG5pbCByb290IG5vZGUganVzdCB0byBob2xkIHRoZSBjaGlsZHJlbiBsaXN0LgorICAgIC8vLyBUaGF0IG5vZGUgd291bGQgY29udGFpbiB0aGUgc3RhcnQvc3RvcCBpbmRleGVzIHRoZW4uCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5Cb3VuZGFyaWVzKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgU3RhcnRUb2tlbiwKKyAgICAgIFN0b3BUb2tlbjogSVRva2VuKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IHRoZSB0b2tlbiBzdGFydCBpbmRleCBmb3IgdGhpcyBzdWJ0cmVlOyByZXR1cm4gLTEgaWYgbm8gc3VjaCBpbmRleAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdGFydEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgdG9rZW4gc3RvcCBpbmRleCBmb3IgdGhpcyBzdWJ0cmVlOyByZXR1cm4gLTEgaWYgbm8gc3VjaCBpbmRleAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdG9wSW5kZXgoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSW50ZWdlcjsKKworICAgIC8vIE4gYSB2IGkgZyBhIHQgaSBvIG4gIC8gIFQgciBlIGUgIFAgYSByIHMgaSBuIGcKKworICAgIC8vLyA8c3VtbWFyeT5HZXQgYSBjaGlsZCAwLi5uLTEgbm9kZSA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0Q2hpbGQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBJOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PlNldCBpdGggY2hpbGQgKDAuLm4tMSkgdG8gdDsgdCBtdXN0IGJlIG5vbi1udWxsIGFuZCBub24tbmlsIG5vZGU8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFNldENoaWxkKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgSTogSW50ZWdlcjsgY29uc3QgQ2hpbGQ6IElBTlRMUkludGVyZmFjZSk7CisKKyAgICAvLy8gPHN1bW1hcnk+UmVtb3ZlIGl0aCBjaGlsZCBhbmQgc2hpZnQgY2hpbGRyZW4gZG93biBmcm9tIHJpZ2h0Ljwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBEZWxldGVDaGlsZChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+SG93IG1hbnkgY2hpbGRyZW4/ICBJZiAwLCB0aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUgPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEdldENoaWxkQ291bnQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hvIGlzIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGlzIG5vZGU7IGlmIG51bGwsIGltcGxpZXMgbm9kZSBpcyByb290LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICAgIC8vLyBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBHZXRQYXJlbnQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOworICAgIHByb2NlZHVyZSBTZXRQYXJlbnQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2UpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaGF0IGluZGV4IGlzIHRoaXMgbm9kZSBpbiB0aGUgY2hpbGQgbGlzdD8gUmFuZ2U6IDAuLm4tMQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICAgIC8vLyBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBHZXRDaGlsZEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENoaWxkSWRleChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IEluZGV4OiBJbnRlZ2VyKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwbGFjZSBmcm9tIHN0YXJ0IHRvIHN0b3AgY2hpbGQgaW5kZXggb2YgcGFyZW50IHdpdGggdCwgd2hpY2ggbWlnaHQKKyAgICAvLy8gYmUgYSBsaXN0LiAgTnVtYmVyIG9mIGNoaWxkcmVuIG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgdGhpcyBjYWxsLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBJZiBwYXJlbnQgaXMgbnVsbCwgZG9uJ3QgZG8gYW55dGhpbmc7IG11c3QgYmUgYXQgcm9vdCBvZiBvdmVyYWxsIHRyZWUuCisgICAgLy8vIENhbid0IHJlcGxhY2Ugd2hhdGV2ZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgZXh0ZXJuYWxseS4gIERvIG5vdGhpbmcuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9jZWR1cmUgUmVwbGFjZUNoaWxkcmVuKGNvbnN0IFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBTdGFydENoaWxkSW5kZXgsCisgICAgICBTdG9wQ2hpbGRJbmRleDogSW50ZWdlcjsgY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT5BIHN0cmVhbSBvZiB0cmVlIG5vZGVzLCBhY2Nlc3Npbmcgbm9kZXMgZnJvbSBhIHRyZWUgb2Ygc29tZSBraW5kIDwvc3VtbWFyeT4KKyAgSVRyZWVOb2RlU3RyZWFtID0gaW50ZXJmYWNlKElJbnRTdHJlYW0pCisgIFsnezc1RUE1QzA2LTgxNDUtNDhGNS05QTU2LTQzRTQ4MUNFODZDNn0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRUcmVlU291cmNlOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdHJlYW06IElUb2tlblN0cmVhbTsKKyAgICBmdW5jdGlvbiBHZXRUcmVlQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICAgIHByb2NlZHVyZSBTZXRIYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMoY29uc3QgVmFsdWU6IEJvb2xlYW4pOworCisgICAgeyBNZXRob2RzIH0KKworICAgIC8vLyA8c3VtbWFyeT5HZXQgYSB0cmVlIG5vZGUgYXQgYW4gYWJzb2x1dGUgaW5kZXggaTsgMC4ubi0xLjwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIElmIHlvdSBkb24ndCB3YW50IHRvIGJ1ZmZlciB1cCBub2RlcywgdGhlbiB0aGlzIG1ldGhvZCBtYWtlcyBubworICAgIC8vLyBzZW5zZSBmb3IgeW91LgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gR2V0KGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0cmVlIG5vZGUgYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBub2RlLgorICAgIC8vLyBpJmx0OzAgaW5kaWNhdGVzIG5vZGVzIGluIHRoZSBwYXN0LiAgU28gTFQoLTEpIGlzIHByZXZpb3VzIG5vZGUsIGJ1dAorICAgIC8vLyBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBwcm92aWRlIHJlc3VsdHMgZm9yIGsgJmx0OyAtMS4KKyAgICAvLy8gTFQoMCkgaXMgdW5kZWZpbmVkLiAgRm9yIGkmZ3Q7PW4sIHJldHVybiBudWxsLgorICAgIC8vLyBSZXR1cm4gbnVsbCBmb3IgTFQoMCkgYW5kIGFueSBpbmRleCB0aGF0IHJlc3VsdHMgaW4gYW4gYWJzb2x1dGUgYWRkcmVzcworICAgIC8vLyB0aGF0IGlzIG5lZ2F0aXZlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGFuYWxvZ3VzIHRvIHRoZSBMVCgpIG1ldGhvZCBvZiB0aGUgVG9rZW5TdHJlYW0sIGJ1dCB0aGlzCisgICAgLy8vIHJldHVybnMgYSB0cmVlIG5vZGUgaW5zdGVhZCBvZiBhIHRva2VuLiAgTWFrZXMgY29kZSBnZW4gaWRlbnRpY2FsCisgICAgLy8vIGZvciBib3RoIHBhcnNlciBhbmQgdHJlZSBncmFtbWFycy4gOikKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIExUKGNvbnN0IEs6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCBub2RlcyBmcm9tIHN0YXJ0IHRvIHN0b3AsIGluY2x1c2l2ZS4KKyAgICAvLy8gSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSBub2RlcyB0aGVuIGl0IGNhbiBzdGlsbAorICAgIC8vLyB3YWxrIHJlY3Vyc2l2ZWx5IGZyb20gc3RhcnQgdW50aWwgc3RvcC4gIFlvdSBjYW4gYWx3YXlzIHJldHVybgorICAgIC8vLyBudWxsIG9yICIiIHRvbywgYnV0IHVzZXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorICAgIC8vLyBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJQU5UTFJJbnRlcmZhY2UpOiBTdHJpbmc7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJsb2FkOworCisgICAgLy8gUkVXUklUSU5HIFRSRUVTICh1c2VkIGJ5IHRyZWUgcGFyc2VyKQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXBsYWNlIGZyb20gc3RhcnQgdG8gc3RvcCBjaGlsZCBpbmRleCBvZiBwYXJlbnQgd2l0aCB0LCB3aGljaCBtaWdodAorICAgIC8vLyBiZSBhIGxpc3QuICBOdW1iZXIgb2YgY2hpbGRyZW4gbWF5IGJlIGRpZmZlcmVudCBhZnRlciB0aGlzIGNhbGwuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFRoZSBzdHJlYW0gaXMgbm90aWZpZWQgYmVjYXVzZSBpdCBpcyB3YWxraW5nIHRoZSB0cmVlIGFuZCBtaWdodCBuZWVkCisgICAgLy8vIHRvIGtub3cgeW91IGFyZSBtb25rZXlpbmcgd2l0aCB0aGUgdW5kZXJseWluZyB0cmVlLiAgQWxzbywgaXQgbWlnaHQgYmUKKyAgICAvLy8gYWJsZSB0byBtb2RpZnkgdGhlIG5vZGUgc3RyZWFtIHRvIGF2b2lkIHJlc3RyZWFtaW5nIGZvciBmdXR1cmUgcGhhc2VzLgorICAgIC8vLworICAgIC8vLyBJZiBwYXJlbnQgaXMgbnVsbCwgZG9uJ3QgZG8gYW55dGhpbmc7IG11c3QgYmUgYXQgcm9vdCBvZiBvdmVyYWxsIHRyZWUuCisgICAgLy8vIENhbid0IHJlcGxhY2Ugd2hhdGV2ZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgZXh0ZXJuYWxseS4gIERvIG5vdGhpbmcuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9jZWR1cmUgUmVwbGFjZUNoaWxkcmVuKGNvbnN0IFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBTdGFydENoaWxkSW5kZXgsCisgICAgICBTdG9wQ2hpbGRJbmRleDogSW50ZWdlcjsgY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTsKKworICAgIHsgUHJvcGVydGllcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdoZXJlIGlzIHRoaXMgc3RyZWFtIHB1bGxpbmcgbm9kZXMgZnJvbT8gIFRoaXMgaXMgbm90IHRoZSBuYW1lLCBidXQKKyAgICAvLy8gdGhlIG9iamVjdCB0aGF0IHByb3ZpZGVzIG5vZGUgb2JqZWN0cy4KKyAgICAvLy8KKyAgICAvLy8gVE9ETzogZG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFRyZWVTb3VyY2U6IElBTlRMUkludGVyZmFjZSByZWFkIEdldFRyZWVTb3VyY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgSVRva2VuU3RyZWFtIGZyb20gd2hpY2ggdGhpcyBzdHJlYW0ncyBUcmVlIHdhcyBjcmVhdGVkCisgICAgLy8vIChtYXkgYmUgbnVsbCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gSWYgdGhlIHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtIHdhcyBjcmVhdGVkIGZyb20gYQorICAgIC8vLyBUb2tlblN0cmVhbSwgeW91IGNhbiBzcGVjaWZ5IGl0IGhlcmUuICBVc2VkIHRvIGRvIHJ1bGUgJHRleHQKKyAgICAvLy8gYXR0cmlidXRlIGluIHRyZWUgcGFyc2VyLiAgT3B0aW9uYWwgdW5sZXNzIHlvdSB1c2UgdHJlZSBwYXJzZXIKKyAgICAvLy8gcnVsZSB0ZXh0IGF0dHJpYnV0ZSBvciBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBvcHRpb25zLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvcGVydHkgVG9rZW5TdHJlYW06IElUb2tlblN0cmVhbSByZWFkIEdldFRva2VuU3RyZWFtOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaGF0IGFkYXB0b3IgY2FuIHRlbGwgbWUgaG93IHRvIGludGVycHJldC9uYXZpZ2F0ZSBub2RlcyBhbmQgdHJlZXMuCisgICAgLy8vIEUuZy4sIGdldCB0ZXh0IG9mIGEgbm9kZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFRyZWVBZGFwdG9yOiBJVHJlZUFkYXB0b3IgcmVhZCBHZXRUcmVlQWRhcHRvcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorICAgIC8vLyB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworICAgIC8vLyBzbyB3ZSBoYXZlIHRvIGluc3RhbnRpYXRlIG5ldyBvbmVzLiAgV2hlbiBkb2luZyBub3JtYWwgdHJlZQorICAgIC8vLyBwYXJzaW5nLCBpdCdzIHNsb3cgYW5kIGEgd2FzdGUgb2YgbWVtb3J5IHRvIGNyZWF0ZSB1bmlxdWUKKyAgICAvLy8gbmF2aWdhdGlvbiBub2Rlcy4gIERlZmF1bHQgc2hvdWxkIGJlIGZhbHNlOworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgSGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzOiBCb29sZWFuIHdyaXRlIFNldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdoYXQgZG9lcyBhIHRyZWUgbG9vayBsaWtlPyAgQU5UTFIgaGFzIGEgbnVtYmVyIG9mIHN1cHBvcnQgY2xhc3NlcworICAvLy8gc3VjaCBhcyBDb21tb25UcmVlTm9kZVN0cmVhbSB0aGF0IHdvcmsgb24gdGhlc2Uga2luZHMgb2YgdHJlZXMuICBZb3UKKyAgLy8vIGRvbid0IGhhdmUgdG8gbWFrZSB5b3VyIHRyZWVzIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYnV0IGlmIHlvdSBkbywKKyAgLy8vIHlvdSdsbCBiZSBhYmxlIHRvIHVzZSBtb3JlIHN1cHBvcnQgY29kZS4KKyAgLy8vCisgIC8vLyBOT1RFOiBXaGVuIGNvbnN0cnVjdGluZyB0cmVlcywgQU5UTFIgY2FuIGJ1aWxkIGFueSBraW5kIG9mIHRyZWU7IGl0IGNhbgorICAvLy8gZXZlbiB1c2UgVG9rZW4gb2JqZWN0cyBhcyB0cmVlcyBpZiB5b3UgYWRkIGEgY2hpbGQgbGlzdCB0byB5b3VyIHRva2Vucy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgdHJlZSBub2RlIHdpdGhvdXQgYW55IHBheWxvYWQ7IGp1c3QgbmF2aWdhdGlvbiBhbmQgZmFjdG9yeSBzdHVmZi4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSVRyZWUgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3s0QjZFRkI1My1FQkY2LTQ2NDctQkE0RC00OEI2ODEzNERDMkF9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0Q2hpbGRDb3VudDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRQYXJlbnQ6IElUcmVlOworICAgIHByb2NlZHVyZSBTZXRQYXJlbnQoY29uc3QgVmFsdWU6IElUcmVlKTsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZEluZGV4OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDaGlsZEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJc05pbDogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblR5cGU6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0VGV4dDogU3RyaW5nOworICAgIGZ1bmN0aW9uIEdldExpbmU6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RhcnRJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdGFydEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblN0b3BJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdG9wSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworCisgICAgeyBNZXRob2RzIH0KKworICAgIC8vLyA8c3VtbWFyeT5TZXQgKG9yIHJlc2V0KSB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbmRleCB2YWx1ZXMgZm9yIGFsbCBjaGlsZHJlbjwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczsKKworICAgIGZ1bmN0aW9uIEdldENoaWxkKGNvbnN0IEk6IEludGVnZXIpOiBJVHJlZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisgICAgLy8vIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ0Ij5UcmVlIHRvIGFkZDwvcGFyYW0+CisgICAgcHJvY2VkdXJlIEFkZENoaWxkKGNvbnN0IFQ6IElUcmVlKTsKKworICAgIC8vLyA8c3VtbWFyeT5TZXQgaXRoIGNoaWxkICgwLi5uLTEpIHRvIHQ7IHQgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLW5pbCBub2RlPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBTZXRDaGlsZChjb25zdCBJOiBJbnRlZ2VyOyBjb25zdCBUOiBJVHJlZSk7CisKKyAgICBmdW5jdGlvbiBEZWxldGVDaGlsZChjb25zdCBJOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKyAgICAvLy8gYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisgICAgLy8vIEZvciBodWdlIGNoaWxkIGxpc3RzLCBpbnNlcnRpbmcgY2hpbGRyZW4gY2FuIGZvcmNlIHdhbGtpbmcgcmVzdCBvZgorICAgIC8vLyBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBSZXBsYWNlQ2hpbGRyZW4oY29uc3QgU3RhcnRDaGlsZEluZGV4LCBTdG9wQ2hpbGRJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7CisKKyAgICBmdW5jdGlvbiBEdXBOb2RlOiBJVHJlZTsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nVHJlZTogU3RyaW5nOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsKKworICAgIHsgUHJvcGVydGllcyB9CisKKyAgICBwcm9wZXJ0eSBDaGlsZENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q2hpbGRDb3VudDsKKworICAgIC8vIFRyZWUgdHJhY2tzIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggbm93ID4gMy4wCisgICAgcHJvcGVydHkgUGFyZW50OiBJVHJlZSByZWFkIEdldFBhcmVudCB3cml0ZSBTZXRQYXJlbnQ7CisKKyAgICAvLy8gPHN1bW1hcnk+VGhpcyBub2RlIGlzIHdoYXQgY2hpbGQgaW5kZXg/IDAuLm4tMTwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBDaGlsZEluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0Q2hpbGRJbmRleCB3cml0ZSBTZXRDaGlsZEluZGV4OworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKyAgICAvLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBJc05pbDogQm9vbGVhbiByZWFkIEdldElzTmlsOworCisgICAgLy8vIDxzdW1tYXJ5PlJldHVybiBhIHRva2VuIHR5cGU7IG5lZWRlZCBmb3IgdHJlZSBwYXJzaW5nIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUb2tlblR5cGU6IEludGVnZXIgcmVhZCBHZXRUb2tlblR5cGU7CisKKyAgICBwcm9wZXJ0eSBUZXh0OiBTdHJpbmcgcmVhZCBHZXRUZXh0OworCisgICAgLy8vIDxzdW1tYXJ5PkluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhIHRva2VuIHBheWxvYWQsIHdoYXQgaXMgdGhlIGxpbmUgZm9yIGVycm9ycz8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IExpbmU6IEludGVnZXIgcmVhZCBHZXRMaW5lOworICAgIHByb3BlcnR5IENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlciByZWFkIEdldENoYXJQb3NpdGlvbkluTGluZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hhdCBpcyB0aGUgc21hbGxlc3QgdG9rZW4gaW5kZXggKGluZGV4aW5nIGZyb20gMCkgZm9yIHRoaXMgbm9kZQorICAgIC8vLyBhbmQgaXRzIGNoaWxkcmVuPworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVG9rZW5TdGFydEluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0VG9rZW5TdGFydEluZGV4IHdyaXRlIFNldFRva2VuU3RhcnRJbmRleDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hhdCBpcyB0aGUgbGFyZ2VzdCB0b2tlbiBpbmRleCAoaW5kZXhpbmcgZnJvbSAwKSBmb3IgdGhpcyBub2RlCisgICAgLy8vIGFuZCBpdHMgY2hpbGRyZW4/CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUb2tlblN0b3BJbmRleDogSW50ZWdlciByZWFkIEdldFRva2VuU3RvcEluZGV4IHdyaXRlIFNldFRva2VuU3RvcEluZGV4OworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBnZW5lcmljIHRyZWUgaW1wbGVtZW50YXRpb24gd2l0aCBubyBwYXlsb2FkLiAgWW91IG11c3Qgc3ViY2xhc3MgdG8KKyAgLy8vIGFjdHVhbGx5IGhhdmUgYW55IHVzZXIgZGF0YS4gIEFOVExSIHYzIHVzZXMgYSBsaXN0IG9mIGNoaWxkcmVuIGFwcHJvYWNoCisgIC8vLyBpbnN0ZWFkIG9mIHRoZSBjaGlsZC1zaWJsaW5nIGFwcHJvYWNoIGluIHYyLiAgQSBmbGF0IHRyZWUgKGEgbGlzdCkgaXMKKyAgLy8vIGFuIGVtcHR5IG5vZGUgd2hvc2UgY2hpbGRyZW4gcmVwcmVzZW50IHRoZSBsaXN0LiAgQW4gZW1wdHksIGJ1dAorICAvLy8gbm9uLW51bGwgbm9kZSBpcyBjYWxsZWQgIm5pbCIuCisgIC8vLyA8L3N1bW1hcnk+CisgIElCYXNlVHJlZSA9IGludGVyZmFjZShJVHJlZSkKKyAgWyd7Njc3MkY2RUEtNUZFMC00MEM2LUJFNUMtODAwQUIyNTQwRTU1fSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldENoaWxkcmVuOiBJTGlzdDxJQmFzZVRyZWU+OworICAgIGZ1bmN0aW9uIEdldENoaWxkSW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENoaWxkSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFBhcmVudDogSVRyZWU7CisgICAgcHJvY2VkdXJlIFNldFBhcmVudChjb25zdCBWYWx1ZTogSVRyZWUpOworICAgIGZ1bmN0aW9uIEdldFRva2VuVHlwZTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblN0YXJ0SW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RhcnRJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdG9wSW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RvcEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRUZXh0OiBTdHJpbmc7CisKKyAgICB7IE1ldGhvZHMgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZGQgYWxsIGVsZW1lbnRzIG9mIGtpZHMgbGlzdCBhcyBjaGlsZHJlbiBvZiB0aGlzIG5vZGUKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0ia2lkcyI+PC9wYXJhbT4KKyAgICBwcm9jZWR1cmUgQWRkQ2hpbGRyZW4oY29uc3QgS2lkczogSUxpc3Q8SUJhc2VUcmVlPik7CisKKyAgICBwcm9jZWR1cmUgU2V0Q2hpbGQoY29uc3QgSTogSW50ZWdlcjsgY29uc3QgVDogSVRyZWUpOworICAgIHByb2NlZHVyZSBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKGNvbnN0IE9mZnNldDogSW50ZWdlcik7CisKKyAgICBwcm9jZWR1cmUgU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBTYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyhjb25zdCBQYXJlbnQ6IElUcmVlOworICAgICAgY29uc3QgSTogSW50ZWdlcik7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcmludCBvdXQgYSB3aG9sZSB0cmVlIG5vdCBqdXN0IGEgbm9kZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gVG9TdHJpbmdUcmVlOiBTdHJpbmc7CisKKyAgICBmdW5jdGlvbiBEdXBOb2RlOiBJVHJlZTsKKworICAgIHsgUHJvcGVydGllcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCB0aGUgY2hpbGRyZW4gaW50ZXJuYWwgbGlzdCBvZiBjaGlsZHJlbi4gTWFuaXB1bGF0aW5nIHRoZSBsaXN0CisgICAgLy8vIGRpcmVjdGx5IGlzIG5vdCBhIHN1cHBvcnRlZCBvcGVyYXRpb24gKGkuZS4geW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2spCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBDaGlsZHJlbjogSUxpc3Q8SUJhc2VUcmVlPiByZWFkIEdldENoaWxkcmVuOworCisgICAgLy8vIDxzdW1tYXJ5PkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy48L3N1bW1hcnk+CisgICAgcHJvcGVydHkgQ2hpbGRJbmRleDogSW50ZWdlciByZWFkIEdldENoaWxkSW5kZXggd3JpdGUgU2V0Q2hpbGRJbmRleDsKKworICAgIC8vLyA8c3VtbWFyeT5CYXNlVHJlZSBkb2Vzbid0IHRyYWNrIHBhcmVudCBwb2ludGVycy48L3N1bW1hcnk+CisgICAgcHJvcGVydHkgUGFyZW50OiBJVHJlZSByZWFkIEdldFBhcmVudCB3cml0ZSBTZXRQYXJlbnQ7CisKKyAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIGEgdG9rZW4gdHlwZTsgbmVlZGVkIGZvciB0cmVlIHBhcnNpbmcgPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFRva2VuVHlwZTogSW50ZWdlciByZWFkIEdldFRva2VuVHlwZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hhdCBpcyB0aGUgc21hbGxlc3QgdG9rZW4gaW5kZXggKGluZGV4aW5nIGZyb20gMCkgZm9yIHRoaXMgbm9kZQorICAgIC8vLyBhbmQgaXRzIGNoaWxkcmVuPworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVG9rZW5TdGFydEluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0VG9rZW5TdGFydEluZGV4IHdyaXRlIFNldFRva2VuU3RhcnRJbmRleDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hhdCBpcyB0aGUgbGFyZ2VzdCB0b2tlbiBpbmRleCAoaW5kZXhpbmcgZnJvbSAwKSBmb3IgdGhpcyBub2RlCisgICAgLy8vIGFuZCBpdHMgY2hpbGRyZW4/CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUb2tlblN0b3BJbmRleDogSW50ZWdlciByZWFkIEdldFRva2VuU3RvcEluZGV4IHdyaXRlIFNldFRva2VuU3RvcEluZGV4OworCisgICAgcHJvcGVydHkgVGV4dDogU3RyaW5nIHJlYWQgR2V0VGV4dDsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT5BIHRyZWUgbm9kZSB0aGF0IGlzIHdyYXBwZXIgZm9yIGEgVG9rZW4gb2JqZWN0LiA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz4KKyAgLy8vIEFmdGVyIDMuMCByZWxlYXNlIHdoaWxlIGJ1aWxkaW5nIHRyZWUgcmV3cml0ZSBzdHVmZiwgaXQgYmVjYW1lIGNsZWFyCisgIC8vLyB0aGF0IGNvbXB1dGluZyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IGlzIHZlcnkgZGlmZmljdWx0IGFuZCBjdW1iZXJzb21lLgorICAvLy8gQmV0dGVyIHRvIHNwZW5kIHRoZSBzcGFjZSBpbiBldmVyeSB0cmVlIG5vZGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGVzZQorICAvLy8gZXh0cmEgZmllbGRzLCBpdCdzIGVhc3kgdG8gY3V0IHRoZW0gb3V0IGluIHlvdXIgb3duIEJhc2VUcmVlIHN1YmNsYXNzLgorICAvLy8gPC9yZW1hcmtzPgorICBJQ29tbW9uVHJlZSA9IGludGVyZmFjZShJQmFzZVRyZWUpCisgIFsnezc5MUMwRUE2LTFFNEQtNDQzRS04M0UyLUNDMUVGRUFFQ0M4Qn0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRUb2tlbjogSVRva2VuOworICAgIGZ1bmN0aW9uIEdldFN0YXJ0SW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFN0b3BJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U3RvcEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgVG9rZW46IElUb2tlbiByZWFkIEdldFRva2VuOworICAgIHByb3BlcnR5IFN0YXJ0SW5kZXg6IEludGVnZXIgcmVhZCBHZXRTdGFydEluZGV4IHdyaXRlIFNldFN0YXJ0SW5kZXg7CisgICAgcHJvcGVydHkgU3RvcEluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0U3RvcEluZGV4IHdyaXRlIFNldFN0b3BJbmRleDsKKyAgZW5kOworCisgIC8vIEEgbm9kZSByZXByZXNlbnRpbmcgZXJyb25lb3VzIHRva2VuIHJhbmdlIGluIHRva2VuIHN0cmVhbQorICBJQ29tbW9uRXJyb3JOb2RlID0gaW50ZXJmYWNlKElDb21tb25UcmVlKQorICBbJ3syMEZGMzBCQS1DMDU1LTRFOEYtQjNFNy03RkZGNjMxMzg1M0V9J10KKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgVHJlZUFkYXB0b3IgdGhhdCB3b3JrcyB3aXRoIGFueSBUcmVlIGltcGxlbWVudGF0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIElCYXNlVHJlZUFkYXB0b3IgPSBpbnRlcmZhY2UoSVRyZWVBZGFwdG9yKQorICBbJ3tCOUNFNjcwQS1FNTNGLTQ5NEMtQjcwMC1FNEEzREY0MkQ0ODJ9J10KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgaXMgZ2VuZXJpYyBpbiB0aGUgc2Vuc2UgdGhhdCBpdCB3aWxsIHdvcmsgd2l0aCBhbnkga2luZCBvZgorICAgIC8vLyB0cmVlIChub3QganVzdCB0aGUgSVRyZWUgaW50ZXJmYWNlKS4gIEl0IGludm9rZXMgdGhlIGFkYXB0b3Igcm91dGluZXMKKyAgICAvLy8gbm90IHRoZSB0cmVlIG5vZGUgcm91dGluZXMgdG8gZG8gdGhlIGNvbnN0cnVjdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIER1cFRyZWUoY29uc3QgVHJlZTogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBEdXBUcmVlKGNvbnN0IFQsIFBhcmVudDogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgICAgLy8vIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgIC8vLyB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAgICAvLy8KKyAgICAvLy8gSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgLy8vIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnkgb3RoZXIgY3JlYXRlVG9rZW4gdmFyaWFudC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIENyZWF0ZVRva2VuKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTogSVRva2VuOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgICAgLy8vIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgIC8vLyB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBhIHZhcmlhbnQgb2YgY3JlYXRlVG9rZW4gd2hlcmUgdGhlIG5ldyB0b2tlbiBpcyBkZXJpdmVkIGZyb20KKyAgICAvLy8gYW4gYWN0dWFsIHJlYWwgaW5wdXQgdG9rZW4uICBUeXBpY2FsbHkgdGhpcyBpcyBmb3IgY29udmVydGluZyAneycKKyAgICAvLy8gdG9rZW5zIHRvIEJMT0NLIGV0Yy4uLiAgWW91J2xsIHNlZQorICAgIC8vLworICAgIC8vLyAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICAgIC8vLworICAgIC8vLyBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAgICAvLy8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gQ3JlYXRlVG9rZW4oY29uc3QgRnJvbVRva2VuOiBJVG9rZW4pOiBJVG9rZW47IG92ZXJsb2FkOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBUcmVlQWRhcHRvciB0aGF0IHdvcmtzIHdpdGggYW55IFRyZWUgaW1wbGVtZW50YXRpb24uICBJdCBwcm92aWRlcworICAvLy8gcmVhbGx5IGp1c3QgZmFjdG9yeSBtZXRob2RzOyBhbGwgdGhlIHdvcmsgaXMgZG9uZSBieSBCYXNlVHJlZUFkYXB0b3IuCisgIC8vLyBJZiB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGRpZmZlcmVudCB0b2tlbnMgY3JlYXRlZCB0aGFuIENsYXNzaWNUb2tlbgorICAvLy8gb2JqZWN0cywgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBhbmQgdGhlbiBzZXQgdGhlIHBhcnNlciB0cmVlIGFkYXB0b3IgdG8KKyAgLy8vIHVzZSB5b3VyIHN1YmNsYXNzLgorICAvLy8KKyAgLy8vIFRvIGdldCB5b3VyIHBhcnNlciB0byBidWlsZCBub2RlcyBvZiBhIGRpZmZlcmVudCB0eXBlLCBvdmVycmlkZQorICAvLy8gQ3JlYXRlKFRva2VuKS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSUNvbW1vblRyZWVBZGFwdG9yID0gaW50ZXJmYWNlKElCYXNlVHJlZUFkYXB0b3IpCisgIFsne0IwNjdFRTdBLTM4RUItNDE1Ni05NDQ3LUNERDZEREQ2RDEzQn0nXQorICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBidWZmZXJlZCBzdHJlYW0gb2YgdHJlZSBub2Rlcy4gIE5vZGVzIGNhbiBiZSBmcm9tIGEgdHJlZSBvZiBBTlkga2luZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gVGhpcyBub2RlIHN0cmVhbSBzdWNrcyBhbGwgbm9kZXMgb3V0IG9mIHRoZSB0cmVlIHNwZWNpZmllZCBpbiB0aGUKKyAgLy8vIGNvbnN0cnVjdG9yIGR1cmluZyBjb25zdHJ1Y3Rpb24gYW5kIG1ha2VzIHBvaW50ZXJzIGludG8gdGhlIHRyZWUKKyAgLy8vIHVzaW5nIGFuIGFycmF5IG9mIE9iamVjdCBwb2ludGVycy4gVGhlIHN0cmVhbSBuZWNlc3NhcmlseSBpbmNsdWRlcworICAvLy8gcG9pbnRlcnMgdG8gRE9XTiBhbmQgVVAgYW5kIEVPRiBub2Rlcy4KKyAgLy8vCisgIC8vLyBUaGlzIHN0cmVhbSBrbm93cyBob3cgdG8gbWFyay9yZWxlYXNlIGZvciBiYWNrdHJhY2tpbmcuCisgIC8vLworICAvLy8gVGhpcyBzdHJlYW0gaXMgbW9zdCBzdWl0YWJsZSBmb3IgdHJlZSBpbnRlcnByZXRlcnMgdGhhdCBuZWVkIHRvCisgIC8vLyBqdW1wIGFyb3VuZCBhIGxvdCBvciBmb3IgdHJlZSBwYXJzZXJzIHJlcXVpcmluZyBzcGVlZCAoYXQgY29zdCBvZiBtZW1vcnkpLgorICAvLy8gVGhlcmUgaXMgc29tZSBkdXBsaWNhdGVkIGZ1bmN0aW9uYWxpdHkgaGVyZSB3aXRoIFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbQorICAvLy8gYnV0IGp1c3QgaW4gYm9va2tlZXBpbmcsIG5vdCB0cmVlIHdhbGtpbmcgZXRjLi4uCisgIC8vLworICAvLy8gPHNlZSBjcmVmPSJVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0iLz4KKyAgLy8vCisgIC8vLyA8L3JlbWFya3M+CisgIElDb21tb25UcmVlTm9kZVN0cmVhbSA9IGludGVyZmFjZShJVHJlZU5vZGVTdHJlYW0pCisgIFsnezAxMTJGQjMxLUFBMUUtNDcxQy1BREMzLUQ5N0FDNUQ3N0UwNX0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRDdXJyZW50U3ltYm9sOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgZnVuY3Rpb24gR2V0VHJlZVNvdXJjZTogSUFOVExSSW50ZXJmYWNlOworICAgIGZ1bmN0aW9uIEdldFNvdXJjZU5hbWU6IFN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblN0cmVhbTogSVRva2VuU3RyZWFtOworICAgIHByb2NlZHVyZSBTZXRUb2tlblN0cmVhbShjb25zdCBWYWx1ZTogSVRva2VuU3RyZWFtKTsKKyAgICBmdW5jdGlvbiBHZXRUcmVlQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICAgIHByb2NlZHVyZSBTZXRUcmVlQWRhcHRvcihjb25zdCBWYWx1ZTogSVRyZWVBZGFwdG9yKTsKKyAgICBmdW5jdGlvbiBHZXRIYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIFNldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2Rlcyhjb25zdCBWYWx1ZTogQm9vbGVhbik7CisKKyAgICB7IE1ldGhvZHMgfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2FsayB0cmVlIHdpdGggZGVwdGgtZmlyc3Qtc2VhcmNoIGFuZCBmaWxsIG5vZGVzIGJ1ZmZlci4KKyAgICAvLy8gRG9uJ3QgZG8gRE9XTiwgVVAgbm9kZXMgaWYgaXRzIGEgbGlzdCAodCBpcyBpc05pbCkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgRmlsbEJ1ZmZlcihjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOworCisgICAgZnVuY3Rpb24gR2V0KGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICBmdW5jdGlvbiBMVChjb25zdCBLOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBMb29rIGJhY2t3YXJkcyBrIG5vZGVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBMQihjb25zdCBLOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNYWtlIHN0cmVhbSBqdW1wIHRvIGEgbmV3IGxvY2F0aW9uLCBzYXZpbmcgb2xkIGxvY2F0aW9uLgorICAgIC8vLyBTd2l0Y2ggYmFjayB3aXRoIHBvcCgpLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFB1c2goY29uc3QgSW5kZXg6IEludGVnZXIpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZWVrIGJhY2sgdG8gcHJldmlvdXMgaW5kZXggc2F2ZWQgZHVyaW5nIGxhc3QgUHVzaCgpIGNhbGwuCisgICAgLy8vIFJldHVybiB0b3Agb2Ygc3RhY2sgKHJldHVybiBpbmRleCkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBQb3A6IEludGVnZXI7CisKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgICAvLyBEZWJ1Z2dpbmcKKyAgICBmdW5jdGlvbiBUb1Rva2VuU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogU3RyaW5nOworICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJQU5UTFJJbnRlcmZhY2UpOiBTdHJpbmc7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJsb2FkOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKyAgICBwcm9wZXJ0eSBDdXJyZW50U3ltYm9sOiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBHZXRDdXJyZW50U3ltYm9sOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIG5vZGVzIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisgICAgLy8vIHRoZSBvYmplY3QgdGhhdCBwcm92aWRlcyBub2RlIG9iamVjdHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUcmVlU291cmNlOiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBHZXRUcmVlU291cmNlOworCisgICAgcHJvcGVydHkgU291cmNlTmFtZTogU3RyaW5nIHJlYWQgR2V0U291cmNlTmFtZTsKKyAgICBwcm9wZXJ0eSBUb2tlblN0cmVhbTogSVRva2VuU3RyZWFtIHJlYWQgR2V0VG9rZW5TdHJlYW0gd3JpdGUgU2V0VG9rZW5TdHJlYW07CisgICAgcHJvcGVydHkgVHJlZUFkYXB0b3I6IElUcmVlQWRhcHRvciByZWFkIEdldFRyZWVBZGFwdG9yIHdyaXRlIFNldFRyZWVBZGFwdG9yOworICAgIHByb3BlcnR5IEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczogQm9vbGVhbiByZWFkIEdldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcyB3cml0ZSBTZXRIYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXM7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIHJlY29yZCBvZiB0aGUgcnVsZXMgdXNlZCB0byBNYXRjaCBhIHRva2VuIHNlcXVlbmNlLiAgVGhlIHRva2VucworICAvLy8gZW5kIHVwIGFzIHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlIGFuZCBydWxlIG5vZGVzIGFyZSB0aGUgaW50ZXJpb3Igbm9kZXMuCisgIC8vLyBUaGlzIHJlYWxseSBhZGRzIG5vIGZ1bmN0aW9uYWxpdHksIGl0IGlzIGp1c3QgYW4gYWxpYXMgZm9yIENvbW1vblRyZWUKKyAgLy8vIHRoYXQgaXMgbW9yZSBtZWFuaW5nZnVsIChzcGVjaWZpYykgYW5kIGhvbGRzIGEgU3RyaW5nIHRvIGRpc3BsYXkgZm9yIGEgbm9kZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSVBhcnNlVHJlZSA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezE1NThGMjYwLUNBRjgtNDQ4OC1BMjQyLTM1NTlCQ0U0RTU3M30nXQorICAgIHsgTWV0aG9kcyB9CisKKyAgICAvLyBFbWl0IGEgdG9rZW4gYW5kIGFsbCBoaWRkZW4gbm9kZXMgYmVmb3JlLiAgRU9GIG5vZGUgaG9sZHMgYWxsCisgICAgLy8gaGlkZGVuIHRva2VucyBhZnRlciBsYXN0IHJlYWwgdG9rZW4uCisgICAgZnVuY3Rpb24gVG9TdHJpbmdXaXRoSGlkZGVuVG9rZW5zOiBTdHJpbmc7CisKKyAgICAvLyBQcmludCBvdXQgdGhlIGxlYXZlcyBvZiB0aGlzIHRyZWUsIHdoaWNoIG1lYW5zIHByaW50aW5nIG9yaWdpbmFsCisgICAgLy8gaW5wdXQgYmFjayBvdXQuCisgICAgZnVuY3Rpb24gVG9JbnB1dFN0cmluZzogU3RyaW5nOworCisgICAgcHJvY2VkdXJlIF9Ub1N0cmluZ0xlYXZlcyhjb25zdCBCdWY6IFRTdHJpbmdCdWlsZGVyKTsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgZ2VuZXJpYyBsaXN0IG9mIGVsZW1lbnRzIHRyYWNrZWQgaW4gYW4gYWx0ZXJuYXRpdmUgdG8gYmUgdXNlZCBpbgorICAvLy8gYSAtPiByZXdyaXRlIHJ1bGUuICBXZSBuZWVkIHRvIHN1YmNsYXNzIHRvIGZpbGwgaW4gdGhlIG5leHQoKSBtZXRob2QsCisgIC8vLyB3aGljaCByZXR1cm5zIGVpdGhlciBhbiBBU1Qgbm9kZSB3cmFwcGVkIGFyb3VuZCBhIHRva2VuIHBheWxvYWQgb3IKKyAgLy8vIGFuIGV4aXN0aW5nIHN1YnRyZWUuCisgIC8vLworICAvLy8gT25jZSB5b3Ugc3RhcnQgbmV4dCgpaW5nLCBkbyBub3QgdHJ5IHRvIGFkZCBtb3JlIGVsZW1lbnRzLiAgSXQgd2lsbAorICAvLy8gYnJlYWsgdGhlIGN1cnNvciB0cmFja2luZyBJIGJlbGlldmUuCisgIC8vLworICAvLy8gPHNlZSBjcmVmPSJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0iLz4KKyAgLy8vIDxzZWUgY3JlZj0iUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSIvPgorICAvLy8KKyAgLy8vIFRPRE86IGFkZCBtZWNoYW5pc20gdG8gZGV0ZWN0L3B1a2Ugb24gbW9kaWZpY2F0aW9uIGFmdGVyIHJlYWRpbmcgZnJvbSBzdHJlYW0KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezNDQjZDNTIxLUY1ODMtNDBEQy1BMUUzLTREN0Q1N0I5OEM3NH0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXREZXNjcmlwdGlvbjogU3RyaW5nOworCisgICAgeyBNZXRob2RzIH0KKyAgICBwcm9jZWR1cmUgQWRkKGNvbnN0IEVsOiBJQU5UTFJJbnRlcmZhY2UpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXNldCB0aGUgY29uZGl0aW9uIG9mIHRoaXMgc3RyZWFtIHNvIHRoYXQgaXQgYXBwZWFycyB3ZSBoYXZlCisgICAgLy8vIG5vdCBjb25zdW1lZCBhbnkgb2YgaXRzIGVsZW1lbnRzLiAgRWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgdW50b3VjaGVkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBPbmNlIHdlIHJlc2V0IHRoZSBzdHJlYW0sIGFueSBmdXR1cmUgdXNlIHdpbGwgbmVlZCBkdXBsaWNhdGVzLiAgU2V0CisgICAgLy8vIHRoZSBkaXJ0eSBiaXQuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgICBmdW5jdGlvbiBIYXNOZXh0OiBCb29sZWFuOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gTmV4dFRyZWU6IElBTlRMUkludGVyZmFjZTsKKyAgICBmdW5jdGlvbiBOZXh0Tm9kZTogSUFOVExSSW50ZXJmYWNlOworCisgICAgZnVuY3Rpb24gU2l6ZTogSW50ZWdlcjsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgRGVzY3JpcHRpb246IFN0cmluZyByZWFkIEdldERlc2NyaXB0aW9uOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUXVldWVzIHVwIG5vZGVzIG1hdGNoZWQgb24gbGVmdCBzaWRlIG9mIC0+IGluIGEgdHJlZSBwYXJzZXIuIFRoaXMgaXMKKyAgLy8vIHRoZSBhbmFsb2cgb2YgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBmb3Igbm9ybWFsIHBhcnNlcnMuCisgIC8vLyA8L3N1bW1hcnk+CisgIElSZXdyaXRlUnVsZU5vZGVTdHJlYW0gPSBpbnRlcmZhY2UoSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSkKKyAgWyd7RjYwRDFEMzYtRkUxMy00MzEyLTk5REEtMTFFNUY0QkVCQjY2fSddCisgICAgeyBNZXRob2RzIH0KKyAgICBmdW5jdGlvbiBOZXh0Tm9kZTogSUFOVExSSW50ZXJmYWNlOworICBlbmQ7CisKKyAgSVJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA9IGludGVyZmFjZShJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKQorICBbJ3tDNkJEQTE0NS1EOTI2LTQ1QkMtQjI5My02NzQ5MEQ3MjgyOUJ9J10KKyAgICB7IE1ldGhvZHMgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUcmVhdCBuZXh0IGVsZW1lbnQgYXMgYSBzaW5nbGUgbm9kZSBldmVuIGlmIGl0J3MgYSBzdWJ0cmVlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZiBuZXh0KCkgd2hlbiB0aGUgcmVzdWx0IGhhcyB0byBiZSBhCisgICAgLy8vIHRyZWUgcm9vdCBub2RlLiAgQWxzbyBwcmV2ZW50cyB1cyBmcm9tIGR1cGxpY2F0aW5nIHJlY2VudGx5LWFkZGVkCisgICAgLy8vIGNoaWxkcmVuOyBlLmcuLCBeKHR5cGUgSUQpKyBhZGRzIElEIHRvIHR5cGUgYW5kIHRoZW4gMm5kIGl0ZXJhdGlvbgorICAgIC8vLyBtdXN0IGR1cCB0aGUgdHlwZSBub2RlLCBidXQgSUQgaGFzIGJlZW4gYWRkZWQuCisgICAgLy8vCisgICAgLy8vIFJlZmVyZW5jaW5nIGEgcnVsZSByZXN1bHQgdHdpY2UgaXMgb2s7IGR1cCBlbnRpcmUgdHJlZSBhcworICAgIC8vLyB3ZSBjYW4ndCBiZSBhZGRpbmcgdHJlZXMgYXMgcm9vdDsgZS5nLiwgZXhwciBleHByLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gTmV4dE5vZGU6IElBTlRMUkludGVyZmFjZTsKKyAgZW5kOworCisgIElSZXdyaXRlUnVsZVRva2VuU3RyZWFtID0gaW50ZXJmYWNlKElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pCisgIFsnezRENDZBQjAwLTdBMTktNEY2OS1CMTU5LTFFRjA5REI4QzA5Q30nXQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJlYW0gYW5kIG1ha2UgYSBub2RlIGZvciBpdC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gSVRyZWVBZGFwdG9yLkNyZWF0ZSgpIHJldHVybnMgYW4gb2JqZWN0LCBzbyBubyBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBwb3NzaWJsZS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIE5leHROb2RlOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICBmdW5jdGlvbiBOZXh0VG9rZW46IElUb2tlbjsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgcGFyc2VyIGZvciBhIHN0cmVhbSBvZiB0cmVlIG5vZGVzLiAgInRyZWUgZ3JhbW1hcnMiIHJlc3VsdCBpbiBhIHN1YmNsYXNzCisgIC8vLyBvZiB0aGlzLiAgQWxsIHRoZSBlcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGlzIHNoYXJlZCB3aXRoIFBhcnNlciB2aWEKKyAgLy8vIHRoZSBCYXNlUmVjb2duaXplciBzdXBlcmNsYXNzLgorICAvLy8gPC9zdW1tYXJ5PgorICBJVHJlZVBhcnNlciA9IGludGVyZmFjZShJQmFzZVJlY29nbml6ZXIpCisgIFsnezIwNjExRkIzLTk4MzAtNDQ0RC1CMzg1LUU4QzJEMDk0NDg0Qn0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRUcmVlTm9kZVN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworICAgIHByb2NlZHVyZSBTZXRUcmVlTm9kZVN0cmVhbShjb25zdCBWYWx1ZTogSVRyZWVOb2RlU3RyZWFtKTsKKworICAgIHsgTWV0aG9kcyB9CisgICAgcHJvY2VkdXJlIFRyYWNlSW4oY29uc3QgUnVsZU5hbWU6IFN0cmluZzsgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgVHJlZU5vZGVTdHJlYW06IElUcmVlTm9kZVN0cmVhbSByZWFkIEdldFRyZWVOb2RlU3RyZWFtIHdyaXRlIFNldFRyZWVOb2RlU3RyZWFtOworICBlbmQ7CisKKyAgSVRyZWVQYXR0ZXJuTGV4ZXIgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3tDM0ZFQzYxNC05RTZGLTQ4RDItQUJBQi01OUZDODNEOEJDMkZ9J10KKyAgICB7IE1ldGhvZHMgfQorICAgIGZ1bmN0aW9uIE5leHRUb2tlbjogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBTVmFsOiBTdHJpbmc7CisgIGVuZDsKKworICBJQ29udGV4dFZpc2l0b3IgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3s5MkI4MEQyMy1DNjNFLTQ4QjQtQTlDRC1FQzI2MzkzMTdFNDN9J10KKyAgICB7IE1ldGhvZHMgfQorICAgIHByb2NlZHVyZSBWaXNpdChjb25zdCBULCBQYXJlbnQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgQ2hpbGRJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IExhYmVsczogSURpY3Rpb25hcnk8U3RyaW5nLCBJQU5UTFJJbnRlcmZhY2U+KTsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEJ1aWxkIGFuZCBuYXZpZ2F0ZSB0cmVlcyB3aXRoIHRoaXMgb2JqZWN0LiAgTXVzdCBrbm93IGFib3V0IHRoZSBuYW1lcworICAvLy8gb2YgdG9rZW5zIHNvIHlvdSBoYXZlIHRvIHBhc3MgaW4gYSBtYXAgb3IgYXJyYXkgb2YgdG9rZW4gbmFtZXMgKGZyb20gd2hpY2gKKyAgLy8vIHRoaXMgY2xhc3MgY2FuIGJ1aWxkIHRoZSBtYXApLiAgSS5lLiwgVG9rZW4gREVDTCBtZWFucyBub3RoaW5nIHVubGVzcyB0aGUKKyAgLy8vIGNsYXNzIGNhbiB0cmFuc2xhdGUgaXQgdG8gYSB0b2tlbiB0eXBlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBJbiBvcmRlciB0byBjcmVhdGUgbm9kZXMgYW5kIG5hdmlnYXRlLCB0aGlzIGNsYXNzIG5lZWRzIGEgVHJlZUFkYXB0b3IuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBjYW4gYnVpbGQgYSB0b2tlbiB0eXBlIC0+IG5vZGUgaW5kZXggZm9yIHJlcGVhdGVkIHVzZSBvciBmb3IKKyAgLy8vIGl0ZXJhdGluZyBvdmVyIHRoZSB2YXJpb3VzIG5vZGVzIHdpdGggYSBwYXJ0aWN1bGFyIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBUcmVlQWRhcHRvciByYXRoZXIgdGhhbiBtb3ZpbmcKKyAgLy8vIGFsbCB0aGlzIGZ1bmN0aW9uYWxpdHkgaW50byB0aGUgYWRhcHRvci4gIEFuIGFkYXB0b3IgaGVscHMgYnVpbGQgYW5kCisgIC8vLyBuYXZpZ2F0ZSB0cmVlcyB1c2luZyBtZXRob2RzLiAgVGhpcyBjbGFzcyBoZWxwcyB5b3UgZG8gaXQgd2l0aCBzdHJpbmcKKyAgLy8vIHBhdHRlcm5zIGxpa2UgIihBIEIgQykiLiAgWW91IGNhbiBjcmVhdGUgYSB0cmVlIGZyb20gdGhhdCBwYXR0ZXJuIG9yCisgIC8vLyBtYXRjaCBzdWJ0cmVlcyBhZ2FpbnN0IGl0LgorICAvLy8gPC9yZW1hcmtzPgorICBJVHJlZVdpemFyZCA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezRGNDQwRTE5LTg5M0EtNEU1Mi1BOTc5LUU1Mzc3RUFGQTNCOH0nXQorICAgIHsgTWV0aG9kcyB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDb21wdXRlIGEgTWFwJmx0O1N0cmluZywgSW50ZWdlciZndDsgdGhhdCBpcyBhbiBpbnZlcnRlZCBpbmRleCBvZgorICAgIC8vLyB0b2tlbk5hbWVzICh3aGljaCBtYXBzIGludCB0b2tlbiB0eXBlcyB0byBuYW1lcykuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBDb21wdXRlVG9rZW5UeXBlcyhjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBJRGljdGlvbmFyeTxTdHJpbmcsIEludGVnZXI+OworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBVc2luZyB0aGUgbWFwIG9mIHRva2VuIG5hbWVzIHRvIHRva2VuIHR5cGVzLCByZXR1cm4gdGhlIHR5cGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBHZXRUb2tlblR5cGUoY29uc3QgVG9rZW5OYW1lOiBTdHJpbmcpOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXYWxrIHRoZSBlbnRpcmUgdHJlZSBhbmQgbWFrZSBhIG5vZGUgbmFtZSB0byBub2RlcyBtYXBwaW5nLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBGb3Igbm93LCB1c2UgcmVjdXJzaW9uIGJ1dCBsYXRlciBub25yZWN1cnNpdmUgdmVyc2lvbiBtYXkgYmUKKyAgICAvLy8gbW9yZSBlZmZpY2llbnQuICBSZXR1cm5zIE1hcCZsdDtJbnRlZ2VyLCBMaXN0Jmd0OyB3aGVyZSB0aGUgTGlzdCBpcworICAgIC8vLyBvZiB5b3VyIEFTVCBub2RlIHR5cGUuICBUaGUgSW50ZWdlciBpcyB0aGUgdG9rZW4gdHlwZSBvZiB0aGUgbm9kZS4KKyAgICAvLy8KKyAgICAvLy8gVE9ETzogc2F2ZSB0aGlzIGluZGV4IHNvIHRoYXQgZmluZCBhbmQgdmlzaXQgYXJlIGZhc3RlcgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gSW5kZXgoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSURpY3Rpb25hcnk8SW50ZWdlciwgSUxpc3Q8SUFOVExSSW50ZXJmYWNlPj47CisKKyAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIGEgTGlzdCBvZiB0cmVlIG5vZGVzIHdpdGggdG9rZW4gdHlwZSB0dHlwZTwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBGaW5kKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyKTogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIGEgTGlzdCBvZiBzdWJ0cmVlcyBtYXRjaGluZyBwYXR0ZXJuPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEZpbmQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBQYXR0ZXJuOiBTdHJpbmcpOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OyBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIEZpbmRGaXJzdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gRmluZEZpcnN0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgUGF0dGVybjogU3RyaW5nKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVmlzaXQgZXZlcnkgdHR5cGUgbm9kZSBpbiB0LCBpbnZva2luZyB0aGUgdmlzaXRvci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhpcyBpcyBhIHF1aWNrZXIKKyAgICAvLy8gdmVyc2lvbiBvZiB0aGUgZ2VuZXJhbCB2aXNpdCh0LCBwYXR0ZXJuKSBtZXRob2QuICBUaGUgbGFiZWxzIGFyZworICAgIC8vLyBvZiB0aGUgdmlzaXRvciBhY3Rpb24gbWV0aG9kIGlzIG5ldmVyIHNldCAoaXQncyBudWxsKSBzaW5jZSB1c2luZworICAgIC8vLyBhIHRva2VuIHR5cGUgcmF0aGVyIHRoYW4gYSBwYXR0ZXJuIGRvZXNuJ3QgbGV0IHVzIHNldCBhIGxhYmVsLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvY2VkdXJlIFZpc2l0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICAgICAgY29uc3QgVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yKTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZvciBhbGwgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiwgZXhlY3V0ZSB0aGUgdmlzaXQgYWN0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgcm9vdCBub2RlIG9mIHRoZSBwYXR0ZXJuIGluIGNvbWJpbmF0aW9uCisgICAgLy8vIHdpdGggdmlzaXQodCwgdHR5cGUsIHZpc2l0b3IpIHNvIG5pbC1yb290ZWQgcGF0dGVybnMgYXJlIG5vdCBhbGxvd2VkLgorICAgIC8vLyBQYXR0ZXJucyB3aXRoIHdpbGRjYXJkIHJvb3RzIGFyZSBhbHNvIG5vdCBhbGxvd2VkLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvY2VkdXJlIFZpc2l0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgUGF0dGVybjogU3RyaW5nOworICAgICAgY29uc3QgVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yKTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdpdmVuIGEgcGF0dGVybiBsaWtlIChBU1NJR04gJWxoczpJRCAlcmhzOi4pIHdpdGggb3B0aW9uYWwgbGFiZWxzCisgICAgLy8vIG9uIHRoZSB2YXJpb3VzIG5vZGVzIGFuZCAnLicgKGRvdCkgYXMgdGhlIG5vZGUvc3VidHJlZSB3aWxkY2FyZCwKKyAgICAvLy8gcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBhbmQgZmlsbCB0aGUgbGFiZWxzIE1hcCB3aXRoCisgICAgLy8vIHRoZSBsYWJlbHMgcG9pbnRpbmcgYXQgdGhlIGFwcHJvcHJpYXRlIG5vZGVzLiAgUmV0dXJuIGZhbHNlIGlmCisgICAgLy8vIHRoZSBwYXR0ZXJuIGlzIG1hbGZvcm1lZCBvciB0aGUgdHJlZSBkb2VzIG5vdCBtYXRjaC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gSWYgYSBub2RlIHNwZWNpZmllcyBhIHRleHQgYXJnIGluIHBhdHRlcm4sIHRoZW4gdGhhdCBtdXN0IG1hdGNoCisgICAgLy8vIGZvciB0aGF0IG5vZGUgaW4gdC4KKyAgICAvLy8KKyAgICAvLy8gVE9ETzogd2hhdCdzIGEgYmV0dGVyIHdheSB0byBpbmRpY2F0ZSBiYWQgcGF0dGVybj8gRXhjZXB0aW9ucyBhcmUgYSBoYXNzbGUKKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIFBhcnNlKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgUGF0dGVybjogU3RyaW5nOworICAgICAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBQYXJzZShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFBhdHRlcm46IFN0cmluZyk6IEJvb2xlYW47IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDcmVhdGUgYSB0cmVlIG9yIG5vZGUgZnJvbSB0aGUgaW5kaWNhdGVkIHRyZWUgcGF0dGVybiB0aGF0IGNsb3NlbHkKKyAgICAvLy8gZm9sbG93cyBBTlRMUiB0cmVlIGdyYW1tYXIgdHJlZSBlbGVtZW50IHN5bnRheDoKKyAgICAvLy8KKyAgICAvLy8gICAocm9vdCBjaGlsZDEgLi4uIGNoaWxkMikuCisgICAgLy8vCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFlvdSBjYW4gYWxzbyBqdXN0IHBhc3MgaW4gYSBub2RlOiBJRAorICAgIC8vLworICAgIC8vLyBBbnkgbm9kZSBjYW4gaGF2ZSBhIHRleHQgYXJndW1lbnQ6IElEW2Zvb10KKyAgICAvLy8gKG5vdGljZSB0aGVyZSBhcmUgbm8gcXVvdGVzIGFyb3VuZCBmb28tLWl0J3MgY2xlYXIgaXQncyBhIHN0cmluZykuCisgICAgLy8vCisgICAgLy8vIG5pbCBpcyBhIHNwZWNpYWwgbmFtZSBtZWFuaW5nICJnaXZlIG1lIGEgbmlsIG5vZGUiLiAgVXNlZnVsIGZvcgorICAgIC8vLyBtYWtpbmcgbGlzdHM6IChuaWwgQSBCIEMpIGlzIGEgbGlzdCBvZiBBIEIgQy4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIENyZWF0ZVRyZWVPck5vZGUoY29uc3QgUGF0dGVybjogU3RyaW5nKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDb21wYXJlIHR5cGUsIHN0cnVjdHVyZSwgYW5kIHRleHQgb2YgdHdvIHRyZWVzLCBhc3N1bWluZyBhZGFwdG9yIGluCisgICAgLy8vIHRoaXMgaW5zdGFuY2Ugb2YgYSBUcmVlV2l6YXJkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gRXF1YWxzKGNvbnN0IFQxLCBUMjogSUFOVExSSW50ZXJmYWNlKTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbXBhcmUgdDEgYW5kIHQyOyByZXR1cm4gdHJ1ZSBpZiB0b2tlbiB0eXBlcy90ZXh0LCBzdHJ1Y3R1cmUgbWF0Y2ggZXhhY3RseS4KKyAgICAvLy8gVGhlIHRyZWVzIGFyZSBleGFtaW5lZCBpbiB0aGVpciBlbnRpcmV0eSBzbyB0aGF0IChBIEIpIGRvZXMgbm90IG1hdGNoCisgICAgLy8vIChBIEIgQykgbm9yIChBIChCIEMpKS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVE9ETzogYWxsb3cgdGhlbSB0byBwYXNzIGluIGEgY29tcGFyYXRvcgorICAgIC8vLyBUT0RPOiBoYXZlIGEgdmVyc2lvbiB0aGF0IGlzIG5vbnN0YXRpYyBzbyBpdCBjYW4gdXNlIGluc3RhbmNlIGFkYXB0b3IKKyAgICAvLy8KKyAgICAvLy8gSSBjYW5ub3QgcmVseSBvbiB0aGUgdHJlZSBub2RlJ3MgZXF1YWxzKCkgaW1wbGVtZW50YXRpb24gYXMgSSBtYWtlCisgICAgLy8vIG5vIGNvbnN0cmFpbnRzIGF0IGFsbCBvbiB0aGUgbm9kZSB0eXBlcyBub3IgaW50ZXJmYWNlIGV0Yy4uLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gRXF1YWxzKGNvbnN0IFQxLCBUMjogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBBZGFwdG9yOiBJVHJlZUFkYXB0b3IpOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgZW5kOworCisgIElUcmVlUGF0dGVyblBhcnNlciA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezBDRTNERjJBLTdFNEMtNEE3Qy04RkU4LUYxRDdBRkY5N0NBRX0nXQorICAgIHsgTWV0aG9kcyB9CisgICAgZnVuY3Rpb24gUGF0dGVybjogSUFOVExSSW50ZXJmYWNlOworICAgIGZ1bmN0aW9uIFBhcnNlVHJlZTogSUFOVExSSW50ZXJmYWNlOworICAgIGZ1bmN0aW9uIFBhcnNlTm9kZTogSUFOVExSSW50ZXJmYWNlOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFBhcnNlclJ1bGVSZXR1cm5TY29wZSBleGNlcHQgdGhhdAorICAvLy8gdGhlIHN0YXJ0IHByb3BlcnR5IGlzIGEgdHJlZSBub2RlIGFuZCBub3QgYSBUb2tlbiBvYmplY3QKKyAgLy8vIHdoZW4geW91IGFyZSBwYXJzaW5nIHRyZWVzLiAgVG8gYmUgZ2VuZXJpYyB0aGUgdHJlZSBub2RlIHR5cGVzCisgIC8vLyBoYXZlIHRvIGJlIE9iamVjdCA6KAorICAvLy8gPC9zdW1tYXJ5PgorICBJVHJlZVJ1bGVSZXR1cm5TY29wZSA9IGludGVyZmFjZShJUnVsZVJldHVyblNjb3BlKQorICBbJ3tGQTJCMTc2Ni0zNEU1LTREOTItODk5Ni0zNzFENUNGRUQ5OTl9J10KKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgc3RyZWFtIG9mIHRyZWUgbm9kZXMsIGFjY2Vzc2luZyBub2RlcyBmcm9tIGEgdHJlZSBvZiBBTlkga2luZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gTm8gbmV3IG5vZGVzIHNob3VsZCBiZSBjcmVhdGVkIGluIHRyZWUgZHVyaW5nIHRoZSB3YWxrLiAgQSBzbWFsbCBidWZmZXIKKyAgLy8vIG9mIHRva2VucyBpcyBrZXB0IHRvIGVmZmljaWVudGx5IGFuZCBlYXNpbHkgaGFuZGxlIExUKGkpIGNhbGxzLCB0aG91Z2gKKyAgLy8vIHRoZSBsb29rYWhlYWQgbWVjaGFuaXNtIGlzIGZhaXJseSBjb21wbGljYXRlZC4KKyAgLy8vCisgIC8vLyBGb3IgdHJlZSByZXdyaXRpbmcgZHVyaW5nIHRyZWUgcGFyc2luZywgdGhpcyBtdXN0IGFsc28gYmUgYWJsZQorICAvLy8gdG8gcmVwbGFjZSBhIHNldCBvZiBjaGlsZHJlbiB3aXRob3V0ICJsb3NpbmcgaXRzIHBsYWNlIi4KKyAgLy8vIFRoYXQgcGFydCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiAgV2lsbCBwZXJtaXQgYSBydWxlIHRvIHJldHVybgorICAvLy8gYSBkaWZmZXJlbnQgdHJlZSBhbmQgaGF2ZSBpdCBzdGl0Y2hlZCBpbnRvIHRoZSBvdXRwdXQgdHJlZSBwcm9iYWJseS4KKyAgLy8vCisgIC8vLyA8c2VlIGNyZWY9IkNvbW1vblRyZWVOb2RlU3RyZWFtIi8+CisgIC8vLworICAvLy8gPC9yZW1hcmtzPgorICBJVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtID0gaW50ZXJmYWNlKElUcmVlTm9kZVN0cmVhbSkKKyAgWyd7RTQ2MzY3QUQtRUQ0MS00RDk3LTgyNEUtNTc1QTQ4Rjc0MzVEfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgU2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRDdXJyZW50OiBJQU5UTFJJbnRlcmZhY2U7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdHJlYW06IElUb2tlblN0cmVhbTsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdHJlYW0oY29uc3QgVmFsdWU6IElUb2tlblN0cmVhbSk7CisKKyAgICB7IE1ldGhvZHMgfQorICAgIHByb2NlZHVyZSBSZXNldDsKKyAgICBmdW5jdGlvbiBNb3ZlTmV4dDogQm9vbGVhbjsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgSGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzOiBCb29sZWFuIHJlYWQgR2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzIHdyaXRlIFNldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICBwcm9wZXJ0eSBDdXJyZW50OiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBHZXRDdXJyZW50OworICAgIHByb3BlcnR5IFRva2VuU3RyZWFtOiBJVG9rZW5TdHJlYW0gcmVhZCBHZXRUb2tlblN0cmVhbSB3cml0ZSBTZXRUb2tlblN0cmVhbTsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT5CYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIEFTVCByZXdyaXRlIGNvbnN0cnVjdGlvbi48L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz4KKyAgLy8vIFRoaXMgc2lnbmlmaWVzIGEgY2FzZSB3aGVyZSB0aGUgY2FyZGluYWxpdHkgb2YgdHdvIG9yIG1vcmUgZWxlbWVudHMKKyAgLy8vIGluIGEgc3VicnVsZSBhcmUgZGlmZmVyZW50OiAoSUQgSU5UKSsgd2hlcmUgfElEfCE9fElOVHwKKyAgLy8vIDwvcmVtYXJrcz4KKyAgRVJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbiA9IGNsYXNzKEV4Y2VwdGlvbikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmc7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmcpOworCisgICAgcHJvcGVydHkgRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmcgcmVhZCBGRWxlbWVudERlc2NyaXB0aW9uIHdyaXRlIEZFbGVtZW50RGVzY3JpcHRpb247CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBObyBlbGVtZW50cyB3aXRoaW4gYSAoLi4uKSsgaW4gYSByZXdyaXRlIHJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRVJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24gPSBjbGFzcyhFUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uKQorICAgIC8vIE5vIG5ldyBkZWNsYXJhdGlvbnMKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlZiB0byBJRCBvciBleHByIGJ1dCBubyB0b2tlbnMgaW4gSUQgc3RyZWFtIG9yIHN1YnRyZWVzIGluIGV4cHIgc3RyZWFtCisgIC8vLyA8L3N1bW1hcnk+CisgIEVSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24gPSBjbGFzcyhFUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uKQorICAgIC8vIE5vIG5ldyBkZWNsYXJhdGlvbnMKKyAgZW5kOworCit0eXBlCisgIFRUcmVlID0gY2xhc3Mgc2VhbGVkCisgIHN0cmljdCBwcml2YXRlCisgICAgY2xhc3MgdmFyCisgICAgICBGSU5WQUxJRF9OT0RFOiBJVHJlZTsKKyAgcHJpdmF0ZQorICAgIGNsYXNzIHByb2NlZHVyZSBJbml0aWFsaXplOyBzdGF0aWM7CisgIHB1YmxpYworICAgIGNsYXNzIHByb3BlcnR5IElOVkFMSURfTk9ERTogSVRyZWUgcmVhZCBGSU5WQUxJRF9OT0RFOworICBlbmQ7CisKKyAgVEJhc2VUcmVlID0gY2xhc3MgYWJzdHJhY3QoVEFOVExST2JqZWN0LCBJQmFzZVRyZWUsIElUcmVlKQorICBwcm90ZWN0ZWQKKyAgICB7IElUcmVlIC8gSUJhc2VUcmVlIH0KKyAgICBmdW5jdGlvbiBHZXRQYXJlbnQ6IElUcmVlOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRQYXJlbnQoY29uc3QgVmFsdWU6IElUcmVlKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZEluZGV4OiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRDaGlsZEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblR5cGU6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIEdldFRleHQ6IFN0cmluZzsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdGFydEluZGV4OiBJbnRlZ2VyOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdGFydEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdG9wSW5kZXg6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBTZXRUb2tlblN0b3BJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIER1cE5vZGU6IElUcmVlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBUb1N0cmluZ1RyZWU6IFN0cmluZzsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZENvdW50OiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldElzTmlsOiBCb29sZWFuOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldExpbmU6IEludGVnZXI7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldENoaWxkKGNvbnN0IEk6IEludGVnZXIpOiBJVHJlZTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgQWRkQ2hpbGQoY29uc3QgVDogSVRyZWUpOworICAgIGZ1bmN0aW9uIERlbGV0ZUNoaWxkKGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgcHJvY2VkdXJlIEZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBSZXBsYWNlQ2hpbGRyZW4oY29uc3QgU3RhcnRDaGlsZEluZGV4LCBTdG9wQ2hpbGRJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7CisgIHByb3RlY3RlZAorICAgIHsgSUJhc2VUcmVlIH0KKyAgICBmdW5jdGlvbiBHZXRDaGlsZHJlbjogSUxpc3Q8SUJhc2VUcmVlPjsKKyAgICBwcm9jZWR1cmUgQWRkQ2hpbGRyZW4oY29uc3QgS2lkczogSUxpc3Q8SUJhc2VUcmVlPik7CisgICAgcHJvY2VkdXJlIFNldENoaWxkKGNvbnN0IEk6IEludGVnZXI7IGNvbnN0IFQ6IElUcmVlKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhjb25zdCBPZmZzZXQ6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyhjb25zdCBQYXJlbnQ6IElUcmVlOworICAgICAgY29uc3QgSTogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgRkNoaWxkcmVuOiBJTGlzdDxJQmFzZVRyZWU+OworCisgICAgLy8vIDxzdW1tYXJ5Pk92ZXJyaWRlIGluIGEgc3ViY2xhc3MgdG8gY2hhbmdlIHRoZSBpbXBsIG9mIGNoaWxkcmVuIGxpc3QgPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIENyZWF0ZUNoaWxkcmVuTGlzdDogSUxpc3Q8SUJhc2VUcmVlPjsgdmlydHVhbDsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PkNyZWF0ZSBhIG5ldyBub2RlIGZyb20gYW4gZXhpc3Rpbmcgbm9kZSBkb2VzIG5vdGhpbmcgZm9yIEJhc2VUcmVlCisgICAgLy8vIGFzIHRoZXJlIGFyZSBubyBmaWVsZHMgb3RoZXIgdGhhbiB0aGUgY2hpbGRyZW4gbGlzdCwgd2hpY2ggY2Fubm90CisgICAgLy8vIGJlIGNvcGllZCBhcyB0aGUgY2hpbGRyZW4gYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhpcyBub2RlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFOb2RlOiBJVHJlZSk7IG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcnJpZGU7IGFic3RyYWN0OworICBlbmQ7CisKKyAgVENvbW1vblRyZWUgPSBjbGFzcyhUQmFzZVRyZWUsIElDb21tb25UcmVlKQorICBzdHJpY3QgcHJvdGVjdGVkCisgICAgLy8vIDxzdW1tYXJ5PkEgc2luZ2xlIHRva2VuIGlzIHRoZSBwYXlsb2FkIDwvc3VtbWFyeT4KKyAgICBGVG9rZW46IElUb2tlbjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hhdCB0b2tlbiBpbmRleGVzIGJyYWNrZXQgYWxsIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgLy8vIGFuZCBiZWxvdz8KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZTdGFydEluZGV4OiBJbnRlZ2VyOworICAgIEZTdG9wSW5kZXg6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+V2hvIGlzIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGlzIG5vZGU7IGlmIG51bGwsIGltcGxpZXMgbm9kZSBpcyByb290PC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gRlBhcmVudCBzaG91bGQgYmUgb2YgdHlwZSBJQ29tbW9uVHJlZSwgYnV0IHRoYXQgd291bGQgaW50cm9kdWNlIGEKKyAgICAvLy8gY2lyY3VsYXIgcmVmZXJlbmNlIGJlY2F1c2UgdGhlIHRyZWUgYWxzbyBtYWludGFpbnMgbGlua3MgdG8gaXQncworICAgIC8vLyBjaGlsZHJlbi4gVGhpcyBjaXJjdWxhciByZWZlcmVuY2Ugd291bGQgY2F1c2UgYSBtZW1vcnkgbGVhayBiZWNhdXNlCisgICAgLy8vIHRoZSByZWZlcmVuY2UgY291bnQgd2lsbCBuZXZlciByZWFjaCAwLiBUaGlzIGlzIGF2b2lkZWQgYnkgbWFraW5nCisgICAgLy8vIEZQYXJlbnQgYSByZWd1bGFyIHBvaW50ZXIgYW5kIGxldHRpbmcgdGhlIEdldFBhcmVudCBhbmQgU2V0UGFyZW50CisgICAgLy8vIHByb3BlcnR5IGFjY2Vzc29ycyBkbyB0aGUgY29udmVyc2lvbiB0by9mcm9tIElDb21tb25UcmVlLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgRlBhcmVudDogUG9pbnRlcjsgeyBJQ29tbW9uVHJlZSA7IH0KKworICAgIC8vLyA8c3VtbWFyeT5XaGF0IGluZGV4IGlzIHRoaXMgbm9kZSBpbiB0aGUgY2hpbGQgbGlzdD8gUmFuZ2U6IDAuLm4tMTwvc3VtbWFyeT4KKyAgICBGQ2hpbGRJbmRleDogSW50ZWdlcjsKKyAgcHJvdGVjdGVkCisgICAgeyBJVHJlZSAvIElCYXNlVHJlZSB9CisgICAgZnVuY3Rpb24gR2V0SXNOaWw6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldFRva2VuVHlwZTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0VGV4dDogU3RyaW5nOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRMaW5lOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RhcnRJbmRleDogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RhcnRJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RvcEluZGV4OiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdG9wSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZEluZGV4OiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0Q2hpbGRJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldFBhcmVudDogSVRyZWU7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRQYXJlbnQoY29uc3QgVmFsdWU6IElUcmVlKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gRHVwTm9kZTogSVRyZWU7IG92ZXJyaWRlOworICBwcm90ZWN0ZWQKKyAgICB7IElDb21tb25UcmVlIH0KKyAgICBmdW5jdGlvbiBHZXRUb2tlbjogSVRva2VuOworICAgIGZ1bmN0aW9uIEdldFN0YXJ0SW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFN0b3BJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U3RvcEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQU5vZGU6IElDb21tb25UcmVlKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUb2tlbjogSVRva2VuKTsgb3ZlcmxvYWQ7CisKKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRDb21tb25FcnJvck5vZGUgPSBjbGFzcyhUQ29tbW9uVHJlZSwgSUNvbW1vbkVycm9yTm9kZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSW5wdXQ6IElJbnRTdHJlYW07CisgICAgRlN0YXJ0OiBJVG9rZW47CisgICAgRlN0b3A6IElUb2tlbjsKKyAgICBGVHJhcHBlZEV4Y2VwdGlvbjogRVJlY29nbml0aW9uRXhjZXB0aW9uOworICBwcm90ZWN0ZWQKKyAgICB7IElUcmVlIC8gSUJhc2VUcmVlIH0KKyAgICBmdW5jdGlvbiBHZXRJc05pbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRUZXh0OiBTdHJpbmc7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUlucHV0OiBJVG9rZW5TdHJlYW07IGNvbnN0IEFTdGFydCwgQVN0b3A6IElUb2tlbjsKKyAgICAgIGNvbnN0IEFFeGNlcHRpb246IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik7CisKKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRCYXNlVHJlZUFkYXB0b3IgPSBjbGFzcyBhYnN0cmFjdChUQU5UTFJPYmplY3QsIElCYXNlVHJlZUFkYXB0b3IsIElUcmVlQWRhcHRvcikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+QSBtYXAgb2YgdHJlZSBub2RlIHRvIHVuaXF1ZSBJRHMuPC9zdW1tYXJ5PgorICAgIEZUcmVlVG9VbmlxdWVJRE1hcDogSURpY3Rpb25hcnk8SUFOVExSSW50ZXJmYWNlLCBJbnRlZ2VyPjsKKworICAgIC8vLyA8c3VtbWFyeT5OZXh0IGF2YWlsYWJsZSB1bmlxdWUgSUQuPC9zdW1tYXJ5PgorICAgIEZVbmlxdWVOb2RlSUQ6IEludGVnZXI7CisgIHByb3RlY3RlZAorICAgIHsgSVRyZWVBZGFwdG9yIH0KKyAgICBmdW5jdGlvbiBDcmVhdGVOb2RlKGNvbnN0IFBheWxvYWQ6IElUb2tlbik6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIER1cE5vZGUoY29uc3QgVHJlZU5vZGU6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gRHVwVHJlZShjb25zdCBUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldE5pbE5vZGU6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBFcnJvck5vZGUoY29uc3QgSW5wdXQ6IElUb2tlblN0cmVhbTsgY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbjsKKyAgICAgIGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBJc05pbChjb25zdCBUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOiBCb29sZWFuOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBBZGRDaGlsZChjb25zdCBULCBDaGlsZDogSUFOVExSSW50ZXJmYWNlKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBCZWNvbWVSb290KGNvbnN0IE5ld1Jvb3QsIE9sZFJvb3Q6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gUnVsZVBvc3RQcm9jZXNzaW5nKGNvbnN0IFJvb3Q6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRVbmlxdWVJRChjb25zdCBOb2RlOiBJQU5UTFJJbnRlcmZhY2UpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEJlY29tZVJvb3QoY29uc3QgTmV3Um9vdDogSVRva2VuOyBjb25zdCBPbGRSb290OiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIENyZWF0ZU5vZGUoY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOyBjb25zdCBGcm9tVG9rZW46IElUb2tlbik6IElBTlRMUkludGVyZmFjZTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gQ3JlYXRlTm9kZShjb25zdCBUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IEZyb21Ub2tlbjogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogU3RyaW5nKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBDcmVhdGVOb2RlKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXROb2RlVHlwZShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXROb2RlVHlwZShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IE5vZGVUeXBlOiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXROb2RlVGV4dChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBTdHJpbmc7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldE5vZGVUZXh0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVGV4dDogU3RyaW5nKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRUb2tlbihjb25zdCBUcmVlTm9kZTogSUFOVExSSW50ZXJmYWNlKTogSVRva2VuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5Cb3VuZGFyaWVzKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgU3RhcnRUb2tlbiwKKyAgICAgIFN0b3BUb2tlbjogSVRva2VuKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdGFydEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RvcEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIEdldENoaWxkKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgSTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0Q2hpbGQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBJOiBJbnRlZ2VyOyBjb25zdCBDaGlsZDogSUFOVExSSW50ZXJmYWNlKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBEZWxldGVDaGlsZChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0Q2hpbGRDb3VudChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFBhcmVudChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBTZXRQYXJlbnQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBTZXRDaGlsZElkZXgoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBJbmRleDogSW50ZWdlcik7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZXBsYWNlQ2hpbGRyZW4oY29uc3QgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFN0YXJ0Q2hpbGRJbmRleCwKKyAgICAgIFN0b3BDaGlsZEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgcHJvdGVjdGVkCisgICAgeyBJQmFzZVRyZWVBZGFwdG9yIH0KKyAgICBmdW5jdGlvbiBEdXBUcmVlKGNvbnN0IFQsIFBhcmVudDogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBDcmVhdGVUb2tlbihjb25zdCBUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IFRleHQ6IFN0cmluZyk6IElUb2tlbjsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIENyZWF0ZVRva2VuKGNvbnN0IEZyb21Ub2tlbjogSVRva2VuKTogSVRva2VuOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgZW5kOworCisgIFRDb21tb25UcmVlQWRhcHRvciA9IGNsYXNzKFRCYXNlVHJlZUFkYXB0b3IsIElDb21tb25UcmVlQWRhcHRvcikKKyAgcHJvdGVjdGVkCisgICAgeyBJVHJlZUFkYXB0b3IgfQorICAgIGZ1bmN0aW9uIER1cE5vZGUoY29uc3QgVHJlZU5vZGU6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gQ3JlYXRlTm9kZShjb25zdCBQYXlsb2FkOiBJVG9rZW4pOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJsb2FkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5Cb3VuZGFyaWVzKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgU3RhcnRUb2tlbiwKKyAgICAgIFN0b3BUb2tlbjogSVRva2VuKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdGFydEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RvcEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldE5vZGVUZXh0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IFN0cmluZzsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0VG9rZW4oY29uc3QgVHJlZU5vZGU6IElBTlRMUkludGVyZmFjZSk6IElUb2tlbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0Tm9kZVR5cGUoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0Q2hpbGQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBJOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZENvdW50KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldFBhcmVudChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRQYXJlbnQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRDaGlsZEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRDaGlsZElkZXgoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBJbmRleDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZXBsYWNlQ2hpbGRyZW4oY29uc3QgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFN0YXJ0Q2hpbGRJbmRleCwKKyAgICAgIFN0b3BDaGlsZEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVycmlkZTsKKyAgcHJvdGVjdGVkCisgICAgeyBJQmFzZVRyZWVBZGFwdG9yIH0KKyAgICBmdW5jdGlvbiBDcmVhdGVUb2tlbihjb25zdCBUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IFRleHQ6IFN0cmluZyk6IElUb2tlbjsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIENyZWF0ZVRva2VuKGNvbnN0IEZyb21Ub2tlbjogSVRva2VuKTogSVRva2VuOyBvdmVybG9hZDsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUQ29tbW9uVHJlZU5vZGVTdHJlYW0gPSBjbGFzcyhUQU5UTFJPYmplY3QsIElDb21tb25UcmVlTm9kZVN0cmVhbSwgSVRyZWVOb2RlU3RyZWFtKQorICBwdWJsaWMKKyAgICBjb25zdAorICAgICAgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAwOworICAgICAgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgPSAxMDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLyBhbGwgdGhlc2UgbmF2aWdhdGlvbiBub2RlcyBhcmUgc2hhcmVkIGFuZCBoZW5jZSB0aGV5CisgICAgLy8gY2Fubm90IGNvbnRhaW4gYW55IGxpbmUvY29sdW1uIGluZm8KKyAgICBGRG93bjogSUFOVExSSW50ZXJmYWNlOworICAgIEZVcDogSUFOVExSSW50ZXJmYWNlOworICAgIEZFb2Y6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGNvbXBsZXRlIG1hcHBpbmcgZnJvbSBzdHJlYW0gaW5kZXggdG8gdHJlZSBub2RlLiBUaGlzIGJ1ZmZlcgorICAgIC8vLyBpbmNsdWRlcyBwb2ludGVycyB0byBET1dOLCBVUCwgYW5kIEVPRiBub2Rlcy4KKyAgICAvLy8KKyAgICAvLy8gSXQgaXMgYnVpbHQgdXBvbiBjdG9yIGludm9jYXRpb24uICBUaGUgZWxlbWVudHMgYXJlIHR5cGUgT2JqZWN0CisgICAgLy8vIGFzIHdlIGRvbid0IHdoYXQgdGhlIHRyZWVzIGxvb2sgbGlrZS4gTG9hZCB1cG9uIGZpcnN0IG5lZWQgb2YKKyAgICAvLy8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gc2V0IHRva2VuIHR5cGVzIG9mIGludGVyZXN0IGZvciByZXZlcnNlSW5kZXhpbmcuCisgICAgLy8vIFNsb3dzIHVzIGRvd24gYSB3ZWUgYml0ICB0byBkbyBhbGwgb2YgdGhlIGlmIHA9PS0xIHRlc3RpbmcgZXZlcnl3aGVyZSB0aG91Z2guCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGTm9kZXM6IElMaXN0PElBTlRMUkludGVyZmFjZT47CisKKyAgICAvLy8gPHN1bW1hcnk+UHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/IDwvc3VtbWFyeT4KKyAgICBGUm9vdDogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PklGIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQ8L3N1bW1hcnk+CisgICAgRlRva2VuczogSVRva2VuU3RyZWFtOworCisgICAgLy8vIDxzdW1tYXJ5PldoYXQgdHJlZSBhZGFwdG9yIHdhcyB1c2VkIHRvIGJ1aWxkIHRoZXNlIHRyZWVzPC9zdW1tYXJ5PgorICAgIEZBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldXNlIHNhbWUgRE9XTiwgVVAgbmF2aWdhdGlvbiBub2RlcyB1bmxlc3MgdGhpcyBpcyB0cnVlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGVW5pcXVlTmF2aWdhdGlvbk5vZGVzOiBCb29sZWFuOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgaW5kZXggaW50byB0aGUgbm9kZXMgbGlzdCBvZiB0aGUgY3VycmVudCBub2RlIChuZXh0IG5vZGUKKyAgICAvLy8gdG8gY29uc3VtZSkuICBJZiAtMSwgbm9kZXMgYXJyYXkgbm90IGZpbGxlZCB5ZXQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGUDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHJhY2sgdGhlIGxhc3QgbWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gcmV3aW5kKCkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGTGFzdE1hcmtlcjogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU3RhY2sgb2YgaW5kZXhlcyB1c2VkIGZvciBwdXNoL3BvcCBjYWxscworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRkNhbGxzOiBJU3RhY2tMaXN0PEludGVnZXI+OworICBwcm90ZWN0ZWQKKyAgICB7IElJbnRTdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldFNvdXJjZU5hbWU6IFN0cmluZzsgdmlydHVhbDsKKworICAgIHByb2NlZHVyZSBDb25zdW1lOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIExBKEk6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIExBQ2hhcihJOiBJbnRlZ2VyKTogQ2hhcjsKKyAgICBmdW5jdGlvbiBNYXJrOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEluZGV4OiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXdpbmQoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJld2luZDsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlbGVhc2UoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2Vlayhjb25zdCBJbmRleDogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gU2l6ZTogSW50ZWdlcjsgdmlydHVhbDsKKyAgcHJvdGVjdGVkCisgICAgeyBJVHJlZU5vZGVTdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldFRyZWVTb3VyY2U6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblN0cmVhbTogSVRva2VuU3RyZWFtOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFRyZWVBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgcHJvY2VkdXJlIFNldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2Rlcyhjb25zdCBWYWx1ZTogQm9vbGVhbik7CisKKyAgICBmdW5jdGlvbiBHZXQoY29uc3QgSTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsKKyAgICBmdW5jdGlvbiBMVChjb25zdCBLOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJQU5UTFJJbnRlcmZhY2UpOiBTdHJpbmc7IHJlaW50cm9kdWNlOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZUNoaWxkcmVuKGNvbnN0IFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBTdGFydENoaWxkSW5kZXgsCisgICAgICBTdG9wQ2hpbGRJbmRleDogSW50ZWdlcjsgY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTsKKyAgcHJvdGVjdGVkCisgICAgeyBJQ29tbW9uVHJlZU5vZGVTdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldEN1cnJlbnRTeW1ib2w6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdHJlYW0oY29uc3QgVmFsdWU6IElUb2tlblN0cmVhbSk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFRyZWVBZGFwdG9yKGNvbnN0IFZhbHVlOiBJVHJlZUFkYXB0b3IpOworICAgIGZ1bmN0aW9uIEdldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczogQm9vbGVhbjsKKworICAgIHByb2NlZHVyZSBGaWxsQnVmZmVyKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIExCKGNvbnN0IEs6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgcHJvY2VkdXJlIFB1c2goY29uc3QgSW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIFBvcDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisgICAgZnVuY3Rpb24gVG9Ub2tlblN0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2FsayB0cmVlIHdpdGggZGVwdGgtZmlyc3Qtc2VhcmNoIGFuZCBmaWxsIG5vZGVzIGJ1ZmZlci4KKyAgICAvLy8gRG9uJ3QgZG8gRE9XTiwgVVAgbm9kZXMgaWYgaXRzIGEgbGlzdCAodCBpcyBpc05pbCkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgRmlsbEJ1ZmZlcjsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFzIHdlIGZsYXR0ZW4gdGhlIHRyZWUsIHdlIHVzZSBVUCwgRE9XTiBub2RlcyB0byByZXByZXNlbnQKKyAgICAvLy8gdGhlIHRyZWUgc3RydWN0dXJlLiAgV2hlbiBkZWJ1Z2dpbmcgd2UgbmVlZCB1bmlxdWUgbm9kZXMKKyAgICAvLy8gc28gaW5zdGFudGlhdGUgbmV3IG9uZXMgd2hlbiB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMgaXMgdHJ1ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBBZGROYXZpZ2F0aW9uTm9kZShjb25zdCBUb2tlblR5cGU6IEludGVnZXIpOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm5zIHRoZSBzdHJlYW0gaW5kZXggZm9yIHRoZSBzcGNpZmllZCBub2RlIGluIHRoZSByYW5nZSAwLi5uLTEgb3IsCisgICAgLy8vIC0xIGlmIG5vZGUgbm90IGZvdW5kLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0Tm9kZUluZGV4KGNvbnN0IE5vZGU6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgICAgIGNvbnN0IEFUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgICAgIGNvbnN0IEFUcmVlOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IEFJbml0aWFsQnVmZmVyU2l6ZTogSW50ZWdlcik7IG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFBhcnNlVHJlZSA9IGNsYXNzKFRCYXNlVHJlZSwgSVBhcnNlVHJlZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUGF5bG9hZDogSUFOVExSSW50ZXJmYWNlOworICAgIEZIaWRkZW5Ub2tlbnM6IElMaXN0PElUb2tlbj47CisgIHByb3RlY3RlZAorICAgIHsgSVRyZWUgLyBJQmFzZVRyZWUgfQorICAgIGZ1bmN0aW9uIEdldFRva2VuVHlwZTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0VGV4dDogU3RyaW5nOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblN0YXJ0SW5kZXg6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRUb2tlblN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblN0b3BJbmRleDogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RvcEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gRHVwTm9kZTogSVRyZWU7IG92ZXJyaWRlOworICBwcm90ZWN0ZWQKKyAgICB7IElQYXJzZVRyZWUgfQorICAgIGZ1bmN0aW9uIFRvU3RyaW5nV2l0aEhpZGRlblRva2VuczogU3RyaW5nOworICAgIGZ1bmN0aW9uIFRvSW5wdXRTdHJpbmc6IFN0cmluZzsKKyAgICBwcm9jZWR1cmUgX1RvU3RyaW5nTGVhdmVzKGNvbnN0IEJ1ZjogVFN0cmluZ0J1aWxkZXIpOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUxhYmVsOiBJQU5UTFJJbnRlcmZhY2UpOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtID0gY2xhc3MgYWJzdHJhY3QoVEFOVExST2JqZWN0LCBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKQorICBwcml2YXRlCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDdXJzb3IgMC4ubi0xLiAgSWYgc2luZ2xlRWxlbWVudCE9bnVsbCwgY3Vyc29yIGlzIDAgdW50aWwgeW91IG5leHQoKSwKKyAgICAvLy8gd2hpY2ggYnVtcHMgaXQgdG8gMSBtZWFuaW5nIG5vIG1vcmUgZWxlbWVudHMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGQ3Vyc29yOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUcmFjayBzaW5nbGUgZWxlbWVudHMgdy9vIGNyZWF0aW5nIGEgbGlzdC4gIFVwb24gMm5kIGFkZCwgYWxsb2MgbGlzdAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRlNpbmdsZUVsZW1lbnQ6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGxpc3Qgb2YgdG9rZW5zIG9yIHN1YnRyZWVzIHdlIGFyZSB0cmFja2luZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRkVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUcmFja3Mgd2hldGhlciBhIG5vZGUgb3Igc3VidHJlZSBoYXMgYmVlbiB1c2VkIGluIGEgc3RyZWFtCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIE9uY2UgYSBub2RlIG9yIHN1YnRyZWUgaGFzIGJlZW4gdXNlZCBpbiBhIHN0cmVhbSwgaXQgbXVzdCBiZSBkdXAnZAorICAgIC8vLyBmcm9tIHRoZW4gb24uICBTdHJlYW1zIGFyZSByZXNldCBhZnRlciBzdWJydWxlcyBzbyB0aGF0IHRoZSBzdHJlYW1zCisgICAgLy8vIGNhbiBiZSByZXVzZWQgaW4gZnV0dXJlIHN1YnJ1bGVzLiAgU28sIHJlc2V0IG11c3Qgc2V0IGEgZGlydHkgYml0LgorICAgIC8vLyBJZiBkaXJ0eSwgdGhlbiBuZXh0KCkgYWx3YXlzIHJldHVybnMgYSBkdXAuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBGRGlydHk6IEJvb2xlYW47CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBlbGVtZW50IG9yIHN0cmVhbSBkZXNjcmlwdGlvbjsgdXN1YWxseSBoYXMgbmFtZSBvZiB0aGUgdG9rZW4gb3IKKyAgICAvLy8gcnVsZSByZWZlcmVuY2UgdGhhdCB0aGlzIGxpc3QgdHJhY2tzLiAgQ2FuIGluY2x1ZGUgcnVsZW5hbWUgdG9vLCBidXQKKyAgICAvLy8gdGhlIGV4Y2VwdGlvbiB3b3VsZCB0cmFjayB0aGF0IGluZm8uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmc7CisgICAgRkFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgcHJvdGVjdGVkCisgICAgeyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIH0KKyAgICBmdW5jdGlvbiBHZXREZXNjcmlwdGlvbjogU3RyaW5nOworCisgICAgcHJvY2VkdXJlIEFkZChjb25zdCBFbDogSUFOVExSSW50ZXJmYWNlKTsKKyAgICBwcm9jZWR1cmUgUmVzZXQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gSGFzTmV4dDogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBOZXh0VHJlZTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIE5leHROb2RlOiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFNpemU6IEludGVnZXI7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIERvIHRoZSB3b3JrIG9mIGdldHRpbmcgdGhlIG5leHQgZWxlbWVudCwgbWFraW5nIHN1cmUgdGhhdAorICAgIC8vLyBpdCdzIGEgdHJlZSBub2RlIG9yIHN1YnRyZWUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIERlYWwgd2l0aCB0aGUgb3B0aW1pemF0aW9uIG9mIHNpbmdsZS1lbGVtZW50IGxpc3QgdmVyc3VzCisgICAgLy8vIGxpc3Qgb2Ygc2l6ZSA+IDEuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmVhbSBpcworICAgIC8vLyBlbXB0eSBvciB3ZSdyZSBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemU+MS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIF9OZXh0OiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEVuc3VyZSBzdHJlYW0gZW1pdHMgdHJlZXM7IHRva2VucyBtdXN0IGJlIGNvbnZlcnRlZCB0byBBU1Qgbm9kZXMuCisgICAgLy8vIEFTVCBub2RlcyBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5tb2xlc3RlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIFRvVHJlZShjb25zdCBFbDogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgICAgIGNvbnN0IEFFbGVtZW50RGVzY3JpcHRpb246IFN0cmluZyk7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgICBjb25zdCBBRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmc7IGNvbnN0IEFPbmVFbGVtZW50OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQ3JlYXRlIGEgc3RyZWFtLCBidXQgZmVlZCBvZmYgYW4gZXhpc3RpbmcgbGlzdAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgICBjb25zdCBBRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmc7IGNvbnN0IEFFbGVtZW50czogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPik7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVFJld3JpdGVSdWxlTm9kZVN0cmVhbSA9IGNsYXNzKFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0sIElSZXdyaXRlUnVsZU5vZGVTdHJlYW0pCisgIHByb3RlY3RlZAorICAgIHsgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSB9CisgICAgZnVuY3Rpb24gTmV4dE5vZGU6IElBTlRMUkludGVyZmFjZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9UcmVlKGNvbnN0IEVsOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA9IGNsYXNzKFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0sIElSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0pCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgIC8vLyBUaGlzIGRlbGVnYXRlIGlzIHVzZWQgdG8gYWxsb3cgdGhlIG91dGZhY3RvcmluZyBvZiBzb21lIGNvbW1vbiBjb2RlLgorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibyI+VGhlIHRvIGJlIHByb2Nlc3NlZCBvYmplY3Q8L3BhcmFtPgorICAgICAgVFByb2Nlc3NIYW5kbGVyID0gZnVuY3Rpb24oY29uc3QgTzogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlIG9mIE9iamVjdDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgbWV0aG9kIGhhcyB0aGUgY29tbW9uIGNvZGUgb2YgdHdvIG90aGVyIG1ldGhvZHMsIHdoaWNoIGRpZmZlcmVkIGluIG9ubHkgb25lCisgICAgLy8vIGZ1bmN0aW9uIGNhbGwuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9InBoIj5UaGUgZGVsZWdhdGUsIHdoaWNoIGhhcyB0aGUgY2hvc2VuIGZ1bmN0aW9uPC9wYXJhbT4KKyAgICAvLy8gPHJldHVybnM+VGhlIHJlcXVpcmVkIG9iamVjdDwvcmV0dXJucz4KKyAgICBmdW5jdGlvbiBGZXRjaE9iamVjdChjb25zdCBQSDogVFByb2Nlc3NIYW5kbGVyKTogSUFOVExSSW50ZXJmYWNlOworICAgIGZ1bmN0aW9uIER1cE5vZGUoY29uc3QgTzogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUZXN0cywgaWYgdGhlIHRvIGJlIHJldHVybmVkIG9iamVjdCByZXF1aXJlcyBkdXBsaWNhdGlvbgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZXR1cm5zPjxjb2RlPnRydWU8L2NvZGU+LCBpZiBwb3NpdGl2ZSwgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZiBuZWdhdGl2ZS48L3JldHVybnM+CisgICAgZnVuY3Rpb24gUmVxdWlyZXNEdXBsaWNhdGlvbjogQm9vbGVhbjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGR1cCBhIHRva2VuIG9yIEFTVAorICAgIC8vLyBzdWJ0cmVlLiBEdXAnaW5nIGEgdG9rZW4gbWVhbnMganVzdCBjcmVhdGluZyBhbm90aGVyIEFTVCBub2RlCisgICAgLy8vIGFyb3VuZCBpdC4gRm9yIHRyZWVzLCB5b3UgbXVzdCBjYWxsIHRoZSBhZGFwdG9yLmR1cFRyZWUoKQorICAgIC8vLyB1bmxlc3MgdGhlIGVsZW1lbnQgaXMgZm9yIGEgdHJlZSByb290OyB0aGVuIGl0IG11c3QgYmUgYSBub2RlIGR1cAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gRHVwKGNvbnN0IE86IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKKyAgcHJvdGVjdGVkCisgICAgeyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIH0KKyAgICBmdW5jdGlvbiBOZXh0Tm9kZTogSUFOVExSSW50ZXJmYWNlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBOZXh0VHJlZTogSUFOVExSSW50ZXJmYWNlOyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRSZXdyaXRlUnVsZVRva2VuU3RyZWFtID0gY2xhc3MoVFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSwgSVJld3JpdGVSdWxlVG9rZW5TdHJlYW0pCisgIHByb3RlY3RlZAorICAgIHsgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSB9CisgICAgZnVuY3Rpb24gTmV4dE5vZGU6IElBTlRMUkludGVyZmFjZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gTmV4dFRva2VuOiBJVG9rZW47CisgICAgZnVuY3Rpb24gVG9UcmVlKGNvbnN0IEVsOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRyZWVQYXJzZXIgPSBjbGFzcyhUQmFzZVJlY29nbml6ZXIsIElUcmVlUGFyc2VyKQorICBwdWJsaWMKKyAgICBjb25zdAorICAgICAgRE9XTiA9IFRUb2tlbi5ET1dOOworICAgICAgVVAgPSBUVG9rZW4uVVA7CisgIHN0cmljdCBwcml2YXRlCisgICAgRklucHV0OiBJVHJlZU5vZGVTdHJlYW07CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9wZXJ0eSBJbnB1dDogSVRyZWVOb2RlU3RyZWFtIHJlYWQgRklucHV0OworICBwcm90ZWN0ZWQKKyAgICB7IElCYXNlUmVjb2duaXplciB9CisgICAgZnVuY3Rpb24gR2V0U291cmNlTmFtZTogU3RyaW5nOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVzZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBNYXRjaEFueShjb25zdCBJbnB1dDogSUludFN0cmVhbSk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldElucHV0OiBJSW50U3RyZWFtOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRFcnJvckhlYWRlcihjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOiBTdHJpbmc7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldEVycm9yTWVzc2FnZShjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7IG92ZXJyaWRlOworICBwcm90ZWN0ZWQKKyAgICB7IElUcmVlUGFyc2VyIH0KKyAgICBmdW5jdGlvbiBHZXRUcmVlTm9kZVN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRUcmVlTm9kZVN0cmVhbShjb25zdCBWYWx1ZTogSVRyZWVOb2RlU3RyZWFtKTsgdmlydHVhbDsKKworICAgIHByb2NlZHVyZSBUcmFjZUluKGNvbnN0IFJ1bGVOYW1lOiBTdHJpbmc7IGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcik7IHJlaW50cm9kdWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0Q3VycmVudElucHV0U3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTogSUFOVExSSW50ZXJmYWNlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRNaXNzaW5nU3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOyBjb25zdCBFeHBlY3RlZFRva2VuVHlwZTogSW50ZWdlcjsKKyAgICAgIGNvbnN0IEZvbGxvdzogSUJpdFNldCk6IElBTlRMUkludGVyZmFjZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE1pc21hdGNoKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOyBjb25zdCBUb2tlblR5cGU6IEludGVnZXI7CisgICAgICBjb25zdCBGb2xsb3c6IElCaXRTZXQpOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRyZWVOb2RlU3RyZWFtKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRyZWVOb2RlU3RyZWFtOworICAgICAgY29uc3QgQVN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlKTsgb3ZlcmxvYWQ7CisgIGVuZDsKKworICBUVHJlZVBhdHRlcm5MZXhlciA9IGNsYXNzKFRBTlRMUk9iamVjdCwgSVRyZWVQYXR0ZXJuTGV4ZXIpCisgIHB1YmxpYworICAgIGNvbnN0CisgICAgICBFT0YgPSAtMTsKKyAgICAgIFNUQVJUID0gMTsKKyAgICAgIFNUT1AgPSAyOworICAgICAgSUQgPSAzOworICAgICAgQVJHID0gNDsKKyAgICAgIFBFUkNFTlQgPSA1OworICAgICAgQ09MT04gPSA2OworICAgICAgRE9UID0gNzsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+VGhlIHRyZWUgcGF0dGVybiB0byBsZXggbGlrZSAiKEEgQiBDKSI8L3N1bW1hcnk+CisgICAgRlBhdHRlcm46IFN0cmluZzsKKworICAgIC8vLyA8c3VtbWFyeT5JbmRleCBpbnRvIGlucHV0IHN0cmluZzwvc3VtbWFyeT4KKyAgICBGUDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT5DdXJyZW50IGNoYXI8L3N1bW1hcnk+CisgICAgRkM6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+SG93IGxvbmcgaXMgdGhlIHBhdHRlcm4gaW4gY2hhcj88L3N1bW1hcnk+CisgICAgRk46IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNldCB3aGVuIHRva2VuIHR5cGUgaXMgSUQgb3IgQVJHIChuYW1lIG1pbWljcyBKYXZhJ3MgU3RyZWFtVG9rZW5pemVyKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRlNWYWw6IFRTdHJpbmdCdWlsZGVyOworCisgICAgRkVycm9yOiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICB7IElUcmVlUGF0dGVybkxleGVyIH0KKyAgICBmdW5jdGlvbiBOZXh0VG9rZW46IEludGVnZXI7CisgICAgZnVuY3Rpb24gU1ZhbDogU3RyaW5nOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbnN1bWU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFQYXR0ZXJuOiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRyZWVXaXphcmQgPSBjbGFzcyhUQU5UTFJPYmplY3QsIElUcmVlV2l6YXJkKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgRlRva2VuTmFtZVRvVHlwZU1hcDogSURpY3Rpb25hcnk8U3RyaW5nLCBJbnRlZ2VyPjsKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgLy8vIFdoZW4gdXNpbmcgJWxhYmVsOlRPS0VOTkFNRSBpbiBhIHRyZWUgZm9yIHBhcnNlKCksIHdlIG11c3QgdHJhY2sgdGhlIGxhYmVsLgorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIElUcmVlUGF0dGVybiA9IGludGVyZmFjZShJQ29tbW9uVHJlZSkKKyAgICAgIFsnezg5M0M2QjRFLTg0NzQtNEExRS1CRUFBLThCNzA0ODY4NDAxQn0nXQorICAgICAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgICAgIGZ1bmN0aW9uIEdldEhhc1RleHRBcmc6IEJvb2xlYW47CisgICAgICAgIHByb2NlZHVyZSBTZXRIYXNUZXh0QXJnKGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0VG9rZW5MYWJlbDogU3RyaW5nOworICAgICAgICBwcm9jZWR1cmUgU2V0VG9rZW5MYWJlbChjb25zdCBWYWx1ZTogU3RyaW5nKTsKKworICAgICAgICB7IFByb3BlcnRpZXMgfQorICAgICAgICBwcm9wZXJ0eSBIYXNUZXh0QXJnOiBCb29sZWFuIHJlYWQgR2V0SGFzVGV4dEFyZyB3cml0ZSBTZXRIYXNUZXh0QXJnOworICAgICAgICBwcm9wZXJ0eSBUb2tlbkxhYmVsOiBTdHJpbmcgcmVhZCBHZXRUb2tlbkxhYmVsIHdyaXRlIFNldFRva2VuTGFiZWw7CisgICAgICBlbmQ7CisKKyAgICAgIElXaWxkY2FyZFRyZWVQYXR0ZXJuID0gaW50ZXJmYWNlKElUcmVlUGF0dGVybikKKyAgICAgIFsnezQ3Nzg3ODlBLTVFQUItNDdFMy1BMDVCLTdGMzVDRDg3RUNFNH0nXQorICAgICAgZW5kOworICAgIHR5cGUKKyAgICAgIFRWaXNpdG9yID0gY2xhc3MgYWJzdHJhY3QoVEFOVExST2JqZWN0LCBJQ29udGV4dFZpc2l0b3IpCisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgeyBJQ29udGV4dFZpc2l0b3IgfQorICAgICAgICBwcm9jZWR1cmUgVmlzaXQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IENoaWxkSW5kZXg6IEludGVnZXI7CisgICAgICAgICAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOyBvdmVybG9hZDsKKyAgICAgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICAgICAgcHJvY2VkdXJlIFZpc2l0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICAgIGVuZDsKKworICAgICAgVFRyZWVQYXR0ZXJuID0gY2xhc3MoVENvbW1vblRyZWUsIElUcmVlUGF0dGVybikKKyAgICAgIHN0cmljdCBwcml2YXRlCisgICAgICAgIEZMYWJlbDogU3RyaW5nOworICAgICAgICBGSGFzVGV4dEFyZzogQm9vbGVhbjsKKyAgICAgIHByb3RlY3RlZAorICAgICAgICB7IElUcmVlUGF0dGVybiB9CisgICAgICAgIGZ1bmN0aW9uIEdldEhhc1RleHRBcmc6IEJvb2xlYW47CisgICAgICAgIHByb2NlZHVyZSBTZXRIYXNUZXh0QXJnKGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0VG9rZW5MYWJlbDogU3RyaW5nOworICAgICAgICBwcm9jZWR1cmUgU2V0VG9rZW5MYWJlbChjb25zdCBWYWx1ZTogU3RyaW5nKTsKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgICAgIGVuZDsKKworICAgICAgVFdpbGRjYXJkVHJlZVBhdHRlcm4gPSBjbGFzcyhUVHJlZVBhdHRlcm4sIElXaWxkY2FyZFRyZWVQYXR0ZXJuKQorCisgICAgICBlbmQ7CisKKyAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgIC8vLyBUaGlzIGFkYXB0b3IgY3JlYXRlcyBUcmVlUGF0dGVybiBvYmplY3RzIGZvciB1c2UgZHVyaW5nIHNjYW4oKQorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIFRUcmVlUGF0dGVyblRyZWVBZGFwdG9yID0gY2xhc3MoVENvbW1vblRyZWVBZGFwdG9yKQorICAgICAgcHJvdGVjdGVkCisgICAgICAgIHsgSVRyZWVBZGFwdG9yIH0KKyAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTm9kZShjb25zdCBQYXlsb2FkOiBJVG9rZW4pOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJsb2FkOyBvdmVycmlkZTsKKyAgICAgIGVuZDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICB0eXBlCisgICAgICBUUmVjb3JkQWxsRWxlbWVudHNWaXNpdG9yID0gY2xhc3Mgc2VhbGVkKFRWaXNpdG9yKQorICAgICAgc3RyaWN0IHByaXZhdGUKKyAgICAgICAgRkxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT47CisgICAgICBzdHJpY3QgcHJvdGVjdGVkCisgICAgICAgIHByb2NlZHVyZSBWaXNpdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVycmlkZTsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT4pOworICAgICAgZW5kOworCisgICAgdHlwZQorICAgICAgVFBhdHRlcm5NYXRjaGluZ0NvbnRleHRWaXNpdG9yID0gY2xhc3Mgc2VhbGVkKFRBTlRMUk9iamVjdCwgSUNvbnRleHRWaXNpdG9yKQorICAgICAgc3RyaWN0IHByaXZhdGUKKyAgICAgICAgRk93bmVyOiBUVHJlZVdpemFyZDsKKyAgICAgICAgRlBhdHRlcm46IElUcmVlUGF0dGVybjsKKyAgICAgICAgRkxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT47CisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgeyBJQ29udGV4dFZpc2l0b3IgfQorICAgICAgICBwcm9jZWR1cmUgVmlzaXQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IENoaWxkSW5kZXg6IEludGVnZXI7CisgICAgICAgICAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOyBvdmVybG9hZDsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQU93bmVyOiBUVHJlZVdpemFyZDsgY29uc3QgQVBhdHRlcm46IElUcmVlUGF0dGVybjsKKyAgICAgICAgICBjb25zdCBBTGlzdDogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPik7CisgICAgICBlbmQ7CisKKyAgICB0eXBlCisgICAgICBUSW52b2tlVmlzaXRvck9uUGF0dGVybk1hdGNoQ29udGV4dFZpc2l0b3IgPSBjbGFzcyBzZWFsZWQoVEFOVExST2JqZWN0LCBJQ29udGV4dFZpc2l0b3IpCisgICAgICBzdHJpY3QgcHJpdmF0ZQorICAgICAgICBGT3duZXI6IFRUcmVlV2l6YXJkOworICAgICAgICBGUGF0dGVybjogSVRyZWVQYXR0ZXJuOworICAgICAgICBGVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yOworICAgICAgICBGTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT47CisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgeyBJQ29udGV4dFZpc2l0b3IgfQorICAgICAgICBwcm9jZWR1cmUgVmlzaXQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IENoaWxkSW5kZXg6IEludGVnZXI7CisgICAgICAgICAgY29uc3QgVW51c2VkTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOyBvdmVybG9hZDsKKyAgICAgIHB1YmxpYworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQU93bmVyOiBUVHJlZVdpemFyZDsgY29uc3QgQVBhdHRlcm46IElUcmVlUGF0dGVybjsKKyAgICAgICAgICBjb25zdCBBVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yKTsKKyAgICAgIGVuZDsKKyAgcHJvdGVjdGVkCisgICAgeyBJVHJlZVdpemFyZCB9CisgICAgZnVuY3Rpb24gQ29tcHV0ZVRva2VuVHlwZXMoY29uc3QgVG9rZW5OYW1lczogVFN0cmluZ0FycmF5KTogSURpY3Rpb25hcnk8U3RyaW5nLCBJbnRlZ2VyPjsKKyAgICBmdW5jdGlvbiBHZXRUb2tlblR5cGUoY29uc3QgVG9rZW5OYW1lOiBTdHJpbmcpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IElEaWN0aW9uYXJ5PEludGVnZXIsIElMaXN0PElBTlRMUkludGVyZmFjZT4+OworICAgIGZ1bmN0aW9uIEZpbmQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBUb2tlblR5cGU6IEludGVnZXIpOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBGaW5kKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgUGF0dGVybjogU3RyaW5nKTogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gRmluZEZpcnN0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBGaW5kRmlyc3QoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBQYXR0ZXJuOiBTdHJpbmcpOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBWaXNpdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBWaXNpdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFBhdHRlcm46IFN0cmluZzsKKyAgICAgIGNvbnN0IFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFBhcnNlKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgUGF0dGVybjogU3RyaW5nOworICAgICAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBQYXJzZShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFBhdHRlcm46IFN0cmluZyk6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIENyZWF0ZVRyZWVPck5vZGUoY29uc3QgUGF0dGVybjogU3RyaW5nKTogSUFOVExSSW50ZXJmYWNlOworICAgIGZ1bmN0aW9uIEVxdWFscyhjb25zdCBUMSwgVDI6IElBTlRMUkludGVyZmFjZSk6IEJvb2xlYW47IHJlaW50cm9kdWNlOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBFcXVhbHMoY29uc3QgVDEsIFQyOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgICBjb25zdCBBZGFwdG9yOiBJVHJlZUFkYXB0b3IpOiBCb29sZWFuOyByZWludHJvZHVjZTsgb3ZlcmxvYWQ7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBfUGFyc2UoY29uc3QgVDE6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVDI6IElUcmVlUGF0dGVybjsKKyAgICAgIGNvbnN0IExhYmVsczogSURpY3Rpb25hcnk8U3RyaW5nLCBJQU5UTFJJbnRlcmZhY2U+KTogQm9vbGVhbjsKKworICAgIC8vLyA8c3VtbWFyeT5EbyB0aGUgd29yayBmb3IgaW5kZXg8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIF9JbmRleChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgICBjb25zdCBNOiBJRGljdGlvbmFyeTxJbnRlZ2VyLCBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+Pik7CisKKyAgICAvLy8gPHN1bW1hcnk+RG8gdGhlIHJlY3Vyc2l2ZSB3b3JrIGZvciB2aXNpdDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgX1Zpc2l0KGNvbnN0IFQsIFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBDaGlsZEluZGV4LAorICAgICAgVG9rZW5UeXBlOiBJbnRlZ2VyOyBjb25zdCBWaXNpdG9yOiBJQ29udGV4dFZpc2l0b3IpOworCisgICAgY2xhc3MgZnVuY3Rpb24gX0VxdWFscyhjb25zdCBUMSwgVDI6IElBTlRMUkludGVyZmFjZTsKKyAgICAgIGNvbnN0IEFkYXB0b3I6IElUcmVlQWRhcHRvcik6IEJvb2xlYW47IHN0YXRpYzsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3IpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgICAgIGNvbnN0IEFUb2tlbk5hbWVUb1R5cGVNYXA6IElEaWN0aW9uYXJ5PFN0cmluZywgSW50ZWdlcj4pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgICAgIGNvbnN0IFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheSk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOyBvdmVybG9hZDsKKyAgZW5kOworCisgIFRUcmVlUGF0dGVyblBhcnNlciA9IGNsYXNzKFRBTlRMUk9iamVjdCwgSVRyZWVQYXR0ZXJuUGFyc2VyKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZUb2tlbml6ZXI6IElUcmVlUGF0dGVybkxleGVyOworICAgIEZUb2tlblR5cGU6IEludGVnZXI7CisgICAgRldpemFyZDogSVRyZWVXaXphcmQ7CisgICAgRkFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgcHJvdGVjdGVkCisgICAgeyBJVHJlZVBhdHRlcm5QYXJzZXIgfQorICAgIGZ1bmN0aW9uIFBhdHRlcm46IElBTlRMUkludGVyZmFjZTsKKyAgICBmdW5jdGlvbiBQYXJzZVRyZWU6IElBTlRMUkludGVyZmFjZTsKKyAgICBmdW5jdGlvbiBQYXJzZU5vZGU6IElBTlRMUkludGVyZmFjZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUb2tlbml6ZXI6IElUcmVlUGF0dGVybkxleGVyOworICAgICAgY29uc3QgQVdpemFyZDogSVRyZWVXaXphcmQ7IGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3IpOworICBlbmQ7CisKKyAgVFRyZWVSdWxlUmV0dXJuU2NvcGUgPSBjbGFzcyhUUnVsZVJldHVyblNjb3BlLCBJVHJlZVJ1bGVSZXR1cm5TY29wZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+Rmlyc3Qgbm9kZSBvciByb290IG5vZGUgb2YgdHJlZSBtYXRjaGVkIGZvciB0aGlzIHJ1bGUuPC9zdW1tYXJ5PgorICAgIEZTdGFydDogSUFOVExSSW50ZXJmYWNlOworICBwcm90ZWN0ZWQKKyAgICB7IElSdWxlUmV0dXJuU2NvcGUgfQorICAgIGZ1bmN0aW9uIEdldFN0YXJ0OiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRTdGFydChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtID0gY2xhc3MoVEFOVExST2JqZWN0LCBJVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLCBJVHJlZU5vZGVTdHJlYW0pCisgIHB1YmxpYworICAgIGNvbnN0CisgICAgICBJTklUSUFMX0xPT0tBSEVBRF9CVUZGRVJfU0laRSA9IDU7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICB0eXBlCisgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAvLy8gV2hlbiB3YWxraW5nIGFoZWFkIHdpdGggY3ljbGljIERGQSBvciBmb3Igc3ludGFjdGljIHByZWRpY2F0ZXMsCisgICAgICAvLy8gd2UgbmVlZCB0byByZWNvcmQgdGhlIHN0YXRlIG9mIHRoZSB0cmVlIG5vZGUgc3RyZWFtLiAgVGhpcworICAgICAgLy8vIGNsYXNzIHdyYXBzIHVwIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uCisgICAgICAvLy8gQ2FsbGluZyBNYXJrKCkgd2lsbCBwdXNoIGFub3RoZXIgb2YgdGhlc2Ugb24gdGhlIG1hcmtlcnMgc3RhY2suCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgSVRyZWVXYWxrU3RhdGUgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICAgICAgWyd7NTA2RDEwMTQtNTNDRi00QjlELUJFMEUtMTY2NkU5QzIyMDkxfSddCisgICAgICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICAgICAgZnVuY3Rpb24gR2V0Q3VycmVudENoaWxkSW5kZXg6IEludGVnZXI7CisgICAgICAgIHByb2NlZHVyZSBTZXRDdXJyZW50Q2hpbGRJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgICAgIGZ1bmN0aW9uIEdldEFic29sdXRlTm9kZUluZGV4OiBJbnRlZ2VyOworICAgICAgICBwcm9jZWR1cmUgU2V0QWJzb2x1dGVOb2RlSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgICAgICBmdW5jdGlvbiBHZXRDdXJyZW50Tm9kZTogSUFOVExSSW50ZXJmYWNlOworICAgICAgICBwcm9jZWR1cmUgU2V0Q3VycmVudE5vZGUoY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7CisgICAgICAgIGZ1bmN0aW9uIEdldFByZXZpb3VzTm9kZTogSUFOVExSSW50ZXJmYWNlOworICAgICAgICBwcm9jZWR1cmUgU2V0UHJldmlvdXNOb2RlKGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOworICAgICAgICBmdW5jdGlvbiBHZXROb2RlU3RhY2tTaXplOiBJbnRlZ2VyOworICAgICAgICBwcm9jZWR1cmUgU2V0Tm9kZVN0YWNrU2l6ZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgICAgIGZ1bmN0aW9uIEdldEluZGV4U3RhY2tTaXplOiBpbnRlZ2VyOworICAgICAgICBwcm9jZWR1cmUgU2V0SW5kZXhTdGFja1NpemUoY29uc3QgVmFsdWU6IGludGVnZXIpOworICAgICAgICBmdW5jdGlvbiBHZXRMb29rQWhlYWQ6IFRBTlRMUkludGVyZmFjZUFycmF5OworICAgICAgICBwcm9jZWR1cmUgU2V0TG9va0FoZWFkKGNvbnN0IFZhbHVlOiBUQU5UTFJJbnRlcmZhY2VBcnJheSk7CisKKyAgICAgICAgeyBQcm9wZXJ0aWVzIH0KKyAgICAgICAgcHJvcGVydHkgQ3VycmVudENoaWxkSW5kZXg6IEludGVnZXIgcmVhZCBHZXRDdXJyZW50Q2hpbGRJbmRleCB3cml0ZSBTZXRDdXJyZW50Q2hpbGRJbmRleDsKKyAgICAgICAgcHJvcGVydHkgQWJzb2x1dGVOb2RlSW5kZXg6IEludGVnZXIgcmVhZCBHZXRBYnNvbHV0ZU5vZGVJbmRleCB3cml0ZSBTZXRBYnNvbHV0ZU5vZGVJbmRleDsKKyAgICAgICAgcHJvcGVydHkgQ3VycmVudE5vZGU6IElBTlRMUkludGVyZmFjZSByZWFkIEdldEN1cnJlbnROb2RlIHdyaXRlIFNldEN1cnJlbnROb2RlOworICAgICAgICBwcm9wZXJ0eSBQcmV2aW91c05vZGU6IElBTlRMUkludGVyZmFjZSByZWFkIEdldFByZXZpb3VzTm9kZSB3cml0ZSBTZXRQcmV2aW91c05vZGU7CisgICAgICAgIC8vLzxzdW1tYXJ5PlJlY29yZCBzdGF0ZSBvZiB0aGUgbm9kZVN0YWNrPC9zdW1tYXJ5PgorICAgICAgICBwcm9wZXJ0eSBOb2RlU3RhY2tTaXplOiBJbnRlZ2VyIHJlYWQgR2V0Tm9kZVN0YWNrU2l6ZSB3cml0ZSBTZXROb2RlU3RhY2tTaXplOworICAgICAgICAvLy88c3VtbWFyeT5SZWNvcmQgc3RhdGUgb2YgdGhlIGluZGV4U3RhY2s8L3N1bW1hcnk+CisgICAgICAgIHByb3BlcnR5IEluZGV4U3RhY2tTaXplOiBpbnRlZ2VyIHJlYWQgR2V0SW5kZXhTdGFja1NpemUgd3JpdGUgU2V0SW5kZXhTdGFja1NpemU7CisgICAgICAgIHByb3BlcnR5IExvb2tBaGVhZDogVEFOVExSSW50ZXJmYWNlQXJyYXkgcmVhZCBHZXRMb29rQWhlYWQgd3JpdGUgU2V0TG9va0FoZWFkOworICAgICAgZW5kOworCisgICAgICBUVHJlZVdhbGtTdGF0ZSA9IGNsYXNzKFRBTlRMUk9iamVjdCwgSVRyZWVXYWxrU3RhdGUpCisgICAgICBzdHJpY3QgcHJpdmF0ZQorICAgICAgICBGQ3VycmVudENoaWxkSW5kZXg6IEludGVnZXI7CisgICAgICAgIEZBYnNvbHV0ZU5vZGVJbmRleDogSW50ZWdlcjsKKyAgICAgICAgRkN1cnJlbnROb2RlOiBJQU5UTFJJbnRlcmZhY2U7CisgICAgICAgIEZQcmV2aW91c05vZGU6IElBTlRMUkludGVyZmFjZTsKKyAgICAgICAgLy8vPHN1bW1hcnk+UmVjb3JkIHN0YXRlIG9mIHRoZSBub2RlU3RhY2s8L3N1bW1hcnk+CisgICAgICAgIEZOb2RlU3RhY2tTaXplOiBJbnRlZ2VyOworICAgICAgICAvLy88c3VtbWFyeT5SZWNvcmQgc3RhdGUgb2YgdGhlIGluZGV4U3RhY2s8L3N1bW1hcnk+CisgICAgICAgIEZJbmRleFN0YWNrU2l6ZTogaW50ZWdlcjsKKyAgICAgICAgRkxvb2tBaGVhZDogVEFOVExSSW50ZXJmYWNlQXJyYXk7CisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgeyBJVHJlZVdhbGtTdGF0ZSB9CisgICAgICAgIGZ1bmN0aW9uIEdldEN1cnJlbnRDaGlsZEluZGV4OiBJbnRlZ2VyOworICAgICAgICBwcm9jZWR1cmUgU2V0Q3VycmVudENoaWxkSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgICAgICBmdW5jdGlvbiBHZXRBYnNvbHV0ZU5vZGVJbmRleDogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldEFic29sdXRlTm9kZUluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0Q3VycmVudE5vZGU6IElBTlRMUkludGVyZmFjZTsKKyAgICAgICAgcHJvY2VkdXJlIFNldEN1cnJlbnROb2RlKGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOworICAgICAgICBmdW5jdGlvbiBHZXRQcmV2aW91c05vZGU6IElBTlRMUkludGVyZmFjZTsKKyAgICAgICAgcHJvY2VkdXJlIFNldFByZXZpb3VzTm9kZShjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0Tm9kZVN0YWNrU2l6ZTogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldE5vZGVTdGFja1NpemUoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgICAgICBmdW5jdGlvbiBHZXRJbmRleFN0YWNrU2l6ZTogaW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldEluZGV4U3RhY2tTaXplKGNvbnN0IFZhbHVlOiBpbnRlZ2VyKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0TG9va0FoZWFkOiBUQU5UTFJJbnRlcmZhY2VBcnJheTsKKyAgICAgICAgcHJvY2VkdXJlIFNldExvb2tBaGVhZChjb25zdCBWYWx1ZTogVEFOVExSSW50ZXJmYWNlQXJyYXkpOworICAgICAgZW5kOworICBzdHJpY3QgcHJpdmF0ZQorICAgIC8vLyA8c3VtbWFyeT5SZXVzZSBzYW1lIERPV04sIFVQIG5hdmlnYXRpb24gbm9kZXMgdW5sZXNzIHRoaXMgaXMgdHJ1ZTwvc3VtbWFyeT4KKyAgICBGVW5pcXVlTmF2aWdhdGlvbk5vZGVzOiBCb29sZWFuOworCisgICAgLy8vIDxzdW1tYXJ5PlB1bGwgbm9kZXMgZnJvbSB3aGljaCB0cmVlPyA8L3N1bW1hcnk+CisgICAgRlJvb3Q6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT5JRiB0aGlzIHRyZWUgKHJvb3QpIHdhcyBjcmVhdGVkIGZyb20gYSB0b2tlbiBzdHJlYW0sIHRyYWNrIGl0Ljwvc3VtbWFyeT4KKyAgICBGVG9rZW5zOiBJVG9rZW5TdHJlYW07CisKKyAgICAvLy8gPHN1bW1hcnk+V2hhdCB0cmVlIGFkYXB0b3Igd2FzIHVzZWQgdG8gYnVpbGQgdGhlc2UgdHJlZXM8L3N1bW1hcnk+CisgICAgRkFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQXMgd2Ugd2FsayBkb3duIHRoZSBub2Rlcywgd2UgbXVzdCB0cmFjayBwYXJlbnQgbm9kZXMgc28gd2Uga25vdworICAgIC8vLyB3aGVyZSB0byBnbyBhZnRlciB3YWxraW5nIHRoZSBsYXN0IGNoaWxkIG9mIGEgbm9kZS4gIFdoZW4gdmlzaXRpbmcKKyAgICAvLy8gYSBjaGlsZCwgcHVzaCBjdXJyZW50IG5vZGUgYW5kIGN1cnJlbnQgaW5kZXguCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGTm9kZVN0YWNrOiBJU3RhY2tMaXN0PElBTlRMUkludGVyZmFjZT47CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRyYWNrIHdoaWNoIGNoaWxkIGluZGV4IHlvdSBhcmUgdmlzaXRpbmcgZm9yIGVhY2ggbm9kZSB3ZSBwdXNoLgorICAgIC8vLyBUT0RPOiBwcmV0dHkgaW5lZmZpY2llbnQuLi51c2UgaW50W10gd2hlbiB5b3UgaGF2ZSB0aW1lCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGSW5kZXhTdGFjazogSVN0YWNrTGlzdDxJbnRlZ2VyPjsKKworICAgIC8vLyA8c3VtbWFyeT5XaGljaCBub2RlIGFyZSB3ZSBjdXJyZW50bHkgdmlzaXRpbmc/IDwvc3VtbWFyeT4KKyAgICBGQ3VycmVudE5vZGU6IElBTlRMUkludGVyZmFjZTsKKworICAgIC8vLyA8c3VtbWFyeT5XaGljaCBub2RlIGRpZCB3ZSB2aXNpdCBsYXN0PyAgVXNlZCBmb3IgTFQoLTEpIGNhbGxzLiA8L3N1bW1hcnk+CisgICAgRlByZXZpb3VzTm9kZTogSUFOVExSSW50ZXJmYWNlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaGljaCBjaGlsZCBhcmUgd2UgY3VycmVudGx5IHZpc2l0aW5nPyAgSWYgLTEgd2UgaGF2ZSBub3QgdmlzaXRlZAorICAgIC8vLyB0aGlzIG5vZGUgeWV0OyBuZXh0IENvbnN1bWUoKSByZXF1ZXN0IHdpbGwgc2V0IGN1cnJlbnRJbmRleCB0byAwLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRkN1cnJlbnRDaGlsZEluZGV4OiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaGF0IG5vZGUgaW5kZXggZGlkIHdlIGp1c3QgY29uc3VtZT8gIGk9MC4ubi0xIGZvciBuIG5vZGUgdHJlZXMuCisgICAgLy8vIEludFN0cmVhbS5uZXh0IGlzIGhlbmNlIDEgKyB0aGlzIHZhbHVlLiAgU2l6ZSB3aWxsIGJlIHNhbWUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGQWJzb2x1dGVOb2RlSW5kZXg6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEJ1ZmZlciB0cmVlIG5vZGUgc3RyZWFtIGZvciB1c2Ugd2l0aCBMVChpKS4gIFRoaXMgbGlzdCBncm93cworICAgIC8vLyB0byBmaXQgbmV3IGxvb2thaGVhZCBkZXB0aHMsIGJ1dCBDb25zdW1lKCkgd3JhcHMgbGlrZSBhIGNpcmN1bGFyCisgICAgLy8vIGJ1ZmZlci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZMb29rYWhlYWQ6IFRBTlRMUkludGVyZmFjZUFycmF5OworCisgICAgLy8vIDxzdW1tYXJ5Pmxvb2thaGVhZFtoZWFkXSBpcyB0aGUgZmlyc3Qgc3ltYm9sIG9mIGxvb2thaGVhZCwgTFQoMSkuIDwvc3VtbWFyeT4KKyAgICBGSGVhZDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIG5ldyBsb29rYWhlYWQgYXQgbG9va2FoZWFkW3RhaWxdLiAgdGFpbCB3cmFwcyBhcm91bmQgYXQgdGhlCisgICAgLy8vIGVuZCBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBzbyB0YWlsIGNvdWxkIGJlIGxlc3MgdGhhbiBoZWFkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRlRhaWw6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENhbGxzIHRvIE1hcmsoKSBtYXkgYmUgbmVzdGVkIHNvIHdlIGhhdmUgdG8gdHJhY2sgYSBzdGFjayBvZiB0aGVtLgorICAgIC8vLyBUaGUgbWFya2VyIGlzIGFuIGluZGV4IGludG8gdGhpcyBzdGFjay4gVGhpcyBpcyBhIExpc3QmbHQ7VHJlZVdhbGtTdGF0ZSZndDsuCisgICAgLy8vIEluZGV4ZWQgZnJvbSAxLi5tYXJrRGVwdGguIEEgbnVsbCBpcyBrZXB0IGF0IGluZGV4IDAuIEl0IGlzIGNyZWF0ZWQKKyAgICAvLy8gdXBvbiBmaXJzdCBjYWxsIHRvIE1hcmsoKS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZNYXJrZXJzOiBJTGlzdDxJVHJlZVdhbGtTdGF0ZT47CisKKyAgICAvLy88c3VtbWFyeT4KKyAgICAvLy8gdHJhY2tzIGhvdyBkZWVwIE1hcmsoKSBjYWxscyBhcmUgbmVzdGVkCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGTWFya0RlcHRoOiBJbnRlZ2VyOworCisgICAgLy8vPHN1bW1hcnk+CisgICAgLy8vIFRyYWNrIHRoZSBsYXN0IE1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIFJld2luZCgpLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRkxhc3RNYXJrZXI6IEludGVnZXI7CisKKyAgICAvLyBuYXZpZ2F0aW9uIG5vZGVzCisgICAgRkRvd246IElBTlRMUkludGVyZmFjZTsKKyAgICBGVXA6IElBTlRMUkludGVyZmFjZTsKKyAgICBGRW9mOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICBGQ3VycmVudEVudW1lcmF0aW9uTm9kZTogSVRyZWU7CisgIHByb3RlY3RlZAorICAgIHsgSUludFN0cmVhbSB9CisgICAgZnVuY3Rpb24gR2V0U291cmNlTmFtZTogU3RyaW5nOworCisgICAgcHJvY2VkdXJlIENvbnN1bWU7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gTEEoSTogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gTEFDaGFyKEk6IEludGVnZXIpOiBDaGFyOworICAgIGZ1bmN0aW9uIE1hcms6IEludGVnZXI7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gSW5kZXg6IEludGVnZXI7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJld2luZChjb25zdCBNYXJrZXI6IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgUmV3aW5kOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVsZWFzZShjb25zdCBNYXJrZXI6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZWVrKGNvbnN0IEluZGV4OiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBTaXplOiBJbnRlZ2VyOyB2aXJ0dWFsOworICBwcm90ZWN0ZWQKKyAgICB7IElUcmVlTm9kZVN0cmVhbSB9CisgICAgZnVuY3Rpb24gR2V0VHJlZVNvdXJjZTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RyZWFtOiBJVG9rZW5TdHJlYW07CisgICAgZnVuY3Rpb24gR2V0VHJlZUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKworICAgIGZ1bmN0aW9uIEdldChjb25zdCBJOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIExUKGNvbnN0IEs6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gVG9TdHJpbmcoY29uc3QgU3RhcnQsIFN0b3A6IElBTlRMUkludGVyZmFjZSk6IFN0cmluZzsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXBsYWNlQ2hpbGRyZW4oY29uc3QgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFN0YXJ0Q2hpbGRJbmRleCwKKyAgICAgIFN0b3BDaGlsZEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOworICBwcm90ZWN0ZWQKKyAgICB7IElVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgU2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRDdXJyZW50OiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RyZWFtKGNvbnN0IFZhbHVlOiBJVG9rZW5TdHJlYW0pOworCisgICAgcHJvY2VkdXJlIFJlc2V0OyB2aXJ0dWFsOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBOYXZpZ2F0ZXMgdG8gdGhlIG5leHQgbm9kZSBmb3VuZCBkdXJpbmcgYSBkZXB0aC1maXJzdCB3YWxrIG9mIHJvb3QuCisgICAgLy8vIEFsc28sIGFkZHMgdGhlc2Ugbm9kZXMgYW5kIERPV04vVVAgaW1hZ2luYXJ5IG5vZGVzIGludG8gdGhlIGxva29haGVhZAorICAgIC8vLyBidWZmZXIgYXMgYSBzaWRlLWVmZmVjdC4gIE5vcm1hbGx5IHNpZGUtZWZmZWN0cyBhcmUgYmFkLCBidXQgYmVjYXVzZQorICAgIC8vLyB3ZSBjYW4gRW1pdCBtYW55IHRva2VucyBmb3IgZXZlcnkgTW92ZU5leHQoKSBjYWxsLCBpdCdzIHByZXR0eSBoYXJkIHRvCisgICAgLy8vIHVzZSBhIHNpbmdsZSByZXR1cm4gdmFsdWUgZm9yIHRoYXQuICBXZSBtdXN0IGFkZCB0aGVzZSB0b2tlbnMgdG8KKyAgICAvLy8gdGhlIGxvb2thaGVhZCBidWZmZXIuCisgICAgLy8vCisgICAgLy8vIFRoaXMgcm91dGluZSBkb2VzICpub3QqIGNhdXNlIHRoZSAnQ3VycmVudCcgcHJvcGVydHkgdG8gZXZlciByZXR1cm4gdGhlCisgICAgLy8vIERPV04vVVAgbm9kZXM7IHRob3NlIGFyZSBvbmx5IHJldHVybmVkIGJ5IHRoZSBMVCgpIG1ldGhvZC4KKyAgICAvLy8KKyAgICAvLy8gVWdoLiAgVGhpcyBtZWNoYW5pc20gaXMgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gYSByZWN1cnNpdmUKKyAgICAvLy8gc29sdXRpb24sIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0byBwcm92aWRlIG5vZGVzIG9uLWRlbWFuZCBpbnN0ZWFkCisgICAgLy8vIG9mIHdhbGtpbmcgb25jZSBjb21wbGV0ZWx5IHRocm91Z2ggYW5kIGJ1ZmZlcmluZyB1cCB0aGUgbm9kZXMuIDooCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBNb3ZlTmV4dDogQm9vbGVhbjsgdmlydHVhbDsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIC8vLyA8c3VtbWFyeT5NYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBrIHN5bWJvbHMgaW4gbG9va2FoZWFkIGJ1ZmZlciA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIEZpbGwoY29uc3QgSzogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gTG9va2FoZWFkU2l6ZTogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQWRkIGEgbm9kZSB0byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4gIEFkZCBhdCBsb29rYWhlYWRbdGFpbF0uCisgICAgLy8vIElmIHlvdSB0YWlsKzEgPT0gaGVhZCwgdGhlbiB3ZSBtdXN0IGNyZWF0ZSBhIGJpZ2dlciBidWZmZXIKKyAgICAvLy8gYW5kIGNvcHkgYWxsIHRoZSBub2RlcyBvdmVyIHBsdXMgcmVzZXQgaGVhZCwgdGFpbC4gIEFmdGVyCisgICAgLy8vIHRoaXMgbWV0aG9kLCBMVCgxKSB3aWxsIGJlIGxvb2thaGVhZFswXS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBBZGRMb29rYWhlYWQoY29uc3QgTm9kZTogSUFOVExSSW50ZXJmYWNlKTsgdmlydHVhbDsKKworICAgIHByb2NlZHVyZSBUb1N0cmluZ1dvcmsoY29uc3QgUCwgU3RvcDogSUFOVExSSW50ZXJmYWNlOworICAgICAgY29uc3QgQnVmOiBUU3RyaW5nQnVpbGRlcik7IHZpcnR1YWw7CisKKyAgICBmdW5jdGlvbiBIYW5kbGVSb290Tm9kZTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFZpc2l0Q2hpbGQoY29uc3QgQ2hpbGQ6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICBXYWxrIHVwd2FyZHMgbG9va2luZyBmb3IgYSBub2RlIHdpdGggbW9yZSBjaGlsZHJlbiB0byB3YWxrLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFdhbGtCYWNrVG9Nb3N0UmVjZW50Tm9kZVdpdGhVbnZpc2l0ZWRDaGlsZHJlbjsgdmlydHVhbDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorICAgIC8vLyB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworICAgIC8vLyBzbyBpbnN0YW50aWF0ZSBuZXcgb25lcyB3aGVuIHVuaXF1ZU5hdmlnYXRpb25Ob2RlcyBpcyB0cnVlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIEFkZE5hdmlnYXRpb25Ob2RlKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcik7IHZpcnR1YWw7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsgY29uc3QgQVRyZWU6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworICBlbmQ7CisKK3sgVGhlc2UgZnVuY3Rpb25zIHJldHVybiBYIG9yLCBpZiBYID0gbmlsLCBhbiBlbXB0eSBkZWZhdWx0IGluc3RhbmNlIH0KK2Z1bmN0aW9uIERlZihjb25zdCBYOiBJQ29tbW9uVHJlZSk6IElDb21tb25UcmVlOyBvdmVybG9hZDsKKworaW1wbGVtZW50YXRpb24KKwordXNlcworICBNYXRoOworCit7IFRUcmVlIH0KKworY2xhc3MgcHJvY2VkdXJlIFRUcmVlLkluaXRpYWxpemU7CitiZWdpbgorICBGSU5WQUxJRF9OT0RFIDo9IFRDb21tb25UcmVlLkNyZWF0ZShUVG9rZW4uSU5WQUxJRF9UT0tFTik7CitlbmQ7CisKK3sgVEJhc2VUcmVlIH0KKworY29uc3RydWN0b3IgVEJhc2VUcmVlLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlVHJlZS5BZGRDaGlsZChjb25zdCBUOiBJVHJlZSk7Cit2YXIKKyAgQ2hpbGRUcmVlOiBJQmFzZVRyZWU7CisgIEM6IElCYXNlVHJlZTsKK2JlZ2luCisgIGlmIChUID0gbmlsKSB0aGVuCisgICAgRXhpdDsKKworICBDaGlsZFRyZWUgOj0gVCBhcyBJQmFzZVRyZWU7CisgIGlmIENoaWxkVHJlZS5Jc05pbCB0aGVuIC8vIHQgaXMgYW4gZW1wdHkgbm9kZSBwb3NzaWJseSB3aXRoIGNoaWxkcmVuCisgIGJlZ2luCisgICAgaWYgQXNzaWduZWQoRkNoaWxkcmVuKSBhbmQgU2FtZU9iaihGQ2hpbGRyZW4sIENoaWxkVHJlZS5DaGlsZHJlbikgdGhlbgorICAgICAgcmFpc2UgRUludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCdBdHRlbXB0IHRvIGFkZCBjaGlsZCBsaXN0IHRvIGl0c2VsZicpOworCisgICAgLy8ganVzdCBhZGQgYWxsIG9mIGNoaWxkVHJlZSdzIGNoaWxkcmVuIHRvIHRoaXMKKyAgICBpZiBBc3NpZ25lZChDaGlsZFRyZWUuQ2hpbGRyZW4pIHRoZW4KKyAgICBiZWdpbgorICAgICAgaWYgQXNzaWduZWQoRkNoaWxkcmVuKSB0aGVuIC8vIG11c3QgY29weSwgdGhpcyBoYXMgY2hpbGRyZW4gYWxyZWFkeQorICAgICAgYmVnaW4KKyAgICAgICAgZm9yIEMgaW4gQ2hpbGRUcmVlLkNoaWxkcmVuIGRvCisgICAgICAgIGJlZ2luCisgICAgICAgICAgRkNoaWxkcmVuLkFkZChDKTsKKyAgICAgICAgICAvLyBoYW5kbGUgZG91YmxlLWxpbmsgc3R1ZmYgZm9yIGVhY2ggY2hpbGQgb2YgbmlsIHJvb3QKKyAgICAgICAgICBDLlBhcmVudCA6PSBTZWxmOworICAgICAgICAgIEMuQ2hpbGRJbmRleCA6PSBGQ2hpbGRyZW4uQ291bnQgLSAxOworICAgICAgICBlbmQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgLy8gbm8gY2hpbGRyZW4gZm9yIHRoaXMgYnV0IHQgaGFzIGNoaWxkcmVuOyBqdXN0IHNldCBwb2ludGVyCisgICAgICAgIC8vIGNhbGwgZ2VuZXJhbCBmcmVzaGVuZXIgcm91dGluZQorICAgICAgICBGQ2hpbGRyZW4gOj0gQ2hpbGRUcmVlLkNoaWxkcmVuOworICAgICAgICBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kCisgIGVsc2UKKyAgYmVnaW4KKyAgICAvLyBjaGlsZCBpcyBub3QgbmlsIChkb24ndCBjYXJlIGFib3V0IGNoaWxkcmVuKQorICAgIGlmIChGQ2hpbGRyZW4gPSBuaWwpIHRoZW4KKyAgICBiZWdpbgorICAgICAgRkNoaWxkcmVuIDo9IENyZWF0ZUNoaWxkcmVuTGlzdDsgLy8gY3JlYXRlIGNoaWxkcmVuIGxpc3Qgb24gZGVtYW5kCisgICAgZW5kOworICAgIEZDaGlsZHJlbi5BZGQoQ2hpbGRUcmVlKTsKKyAgICBDaGlsZFRyZWUuUGFyZW50IDo9IFNlbGY7CisgICAgQ2hpbGRUcmVlLkNoaWxkSW5kZXggOj0gRkNoaWxkcmVuLkNvdW50IC0gMTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlLkFkZENoaWxkcmVuKGNvbnN0IEtpZHM6IElMaXN0PElCYXNlVHJlZT4pOwordmFyCisgIFQ6IElCYXNlVHJlZTsKK2JlZ2luCisgIGZvciBUIGluIEtpZHMgZG8KKyAgICBBZGRDaGlsZChUKTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJhc2VUcmVlLkNyZWF0ZShjb25zdCBBTm9kZTogSVRyZWUpOworYmVnaW4KKyAgQ3JlYXRlOworICAvLyBObyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZS5DcmVhdGVDaGlsZHJlbkxpc3Q6IElMaXN0PElCYXNlVHJlZT47CitiZWdpbgorICBSZXN1bHQgOj0gVExpc3Q8SUJhc2VUcmVlPi5DcmVhdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZS5EZWxldGVDaGlsZChjb25zdCBJOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgaWYgKEZDaGlsZHJlbiA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSBuaWwKKyAgZWxzZQorICBiZWdpbgorICAgIFJlc3VsdCA6PSBGQ2hpbGRyZW5bSV07CisgICAgRkNoaWxkcmVuLkRlbGV0ZShJKTsKKyAgICAvLyB3YWxrIHJlc3QgYW5kIGRlY3JlbWVudCB0aGVpciBjaGlsZCBpbmRleGVzCisgICAgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhJKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlLkZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoY29uc3QgT2Zmc2V0OiBJbnRlZ2VyKTsKK3ZhcgorICBOLCBDOiBJbnRlZ2VyOworICBDaGlsZDogSVRyZWU7CitiZWdpbgorICBOIDo9IEdldENoaWxkQ291bnQ7CisgIGZvciBDIDo9IE9mZnNldCB0byBOIC0gMSBkbworICBiZWdpbgorICAgIENoaWxkIDo9IEdldENoaWxkKEMpOworICAgIENoaWxkLkNoaWxkSW5kZXggOj0gQzsKKyAgICBDaGlsZC5QYXJlbnQgOj0gU2VsZjsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlLkZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7CitiZWdpbgorICBGcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKDApOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWUuR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZS5HZXRDaGlsZChjb25zdCBJOiBJbnRlZ2VyKTogSVRyZWU7CitiZWdpbgorICBpZiAoRkNoaWxkcmVuID0gbmlsKSBvciAoSSA+PSBGQ2hpbGRyZW4uQ291bnQpIHRoZW4KKyAgICBSZXN1bHQgOj0gbmlsCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gRkNoaWxkcmVuW0ldOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWUuR2V0Q2hpbGRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZDaGlsZHJlbikgdGhlbgorICAgIFJlc3VsdCA6PSBGQ2hpbGRyZW4uQ291bnQKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWUuR2V0Q2hpbGRJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIC8vIE5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZS5HZXRDaGlsZHJlbjogSUxpc3Q8SUJhc2VUcmVlPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ2hpbGRyZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZS5HZXRJc05pbDogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGYWxzZTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VUcmVlLkdldExpbmU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VUcmVlLkdldFBhcmVudDogSVRyZWU7CitiZWdpbgorICAvLyBObyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVRyZWUuUmVwbGFjZUNoaWxkcmVuKGNvbnN0IFN0YXJ0Q2hpbGRJbmRleCwKKyAgU3RvcENoaWxkSW5kZXg6IEludGVnZXI7IGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7Cit2YXIKKyAgUmVwbGFjaW5nSG93TWFueSwgUmVwbGFjaW5nV2l0aEhvd01hbnksIE51bU5ld0NoaWxkcmVuLCBEZWx0YSwgSSwgSjogSW50ZWdlcjsKKyAgSW5kZXhUb0RlbGV0ZSwgQywgUmVwbGFjZWRTb0ZhcjogSW50ZWdlcjsKKyAgTmV3VHJlZSwgS2lsbGVkOiBJQmFzZVRyZWU7CisgIE5ld0NoaWxkcmVuOiBJTGlzdDxJQmFzZVRyZWU+OworICBDaGlsZDogSUJhc2VUcmVlOworYmVnaW4KKyAgaWYgKEZDaGlsZHJlbiA9IG5pbCkgdGhlbgorICAgIHJhaXNlIEVBcmd1bWVudEV4Y2VwdGlvbi5DcmVhdGUoJ2luZGV4ZXMgaW52YWxpZDsgbm8gY2hpbGRyZW4gaW4gbGlzdCcpOworICBSZXBsYWNpbmdIb3dNYW55IDo9IFN0b3BDaGlsZEluZGV4IC0gU3RhcnRDaGlsZEluZGV4ICsgMTsKKyAgTmV3VHJlZSA6PSBUIGFzIElCYXNlVHJlZTsKKworICAvLyBub3JtYWxpemUgdG8gYSBsaXN0IG9mIGNoaWxkcmVuIHRvIGFkZDogbmV3Q2hpbGRyZW4KKyAgaWYgKE5ld1RyZWUuSXNOaWwpIHRoZW4KKyAgICBOZXdDaGlsZHJlbiA6PSBOZXdUcmVlLkNoaWxkcmVuCisgIGVsc2UKKyAgYmVnaW4KKyAgICBOZXdDaGlsZHJlbiA6PSBUTGlzdDxJQmFzZVRyZWU+LkNyZWF0ZTsKKyAgICBOZXdDaGlsZHJlbi5BZGQoTmV3VHJlZSk7CisgIGVuZDsKKworICBSZXBsYWNpbmdXaXRoSG93TWFueSA6PSBOZXdDaGlsZHJlbi5Db3VudDsKKyAgTnVtTmV3Q2hpbGRyZW4gOj0gTmV3Q2hpbGRyZW4uQ291bnQ7CisgIERlbHRhIDo9IFJlcGxhY2luZ0hvd01hbnkgLSBSZXBsYWNpbmdXaXRoSG93TWFueTsKKworICAvLyBpZiBzYW1lIG51bWJlciBvZiBub2RlcywgZG8gZGlyZWN0IHJlcGxhY2UKKyAgaWYgKERlbHRhID0gMCkgdGhlbgorICBiZWdpbgorICAgIEogOj0gMDsgLy8gaW5kZXggaW50byBuZXcgY2hpbGRyZW4KKyAgICBmb3IgSSA6PSBTdGFydENoaWxkSW5kZXggdG8gU3RvcENoaWxkSW5kZXggZG8KKyAgICBiZWdpbgorICAgICAgQ2hpbGQgOj0gTmV3Q2hpbGRyZW5bSl07CisgICAgICBGQ2hpbGRyZW5bSV0gOj0gQ2hpbGQ7CisgICAgICBDaGlsZC5QYXJlbnQgOj0gU2VsZjsKKyAgICAgIENoaWxkLkNoaWxkSW5kZXggOj0gSTsKKyAgICAgIEluYyhKKTsKKyAgICBlbmQ7CisgIGVuZAorICBlbHNlCisgICAgaWYgKERlbHRhID4gMCkgdGhlbgorICAgIGJlZ2luCisgICAgICAvLyBmZXdlciBuZXcgbm9kZXMgdGhhbiB0aGVyZSB3ZXJlCisgICAgICAvLyBzZXQgY2hpbGRyZW4gYW5kIHRoZW4gZGVsZXRlIGV4dHJhCisgICAgICBmb3IgSiA6PSAwIHRvIE51bU5ld0NoaWxkcmVuIC0gMSBkbworICAgICAgICBGQ2hpbGRyZW5bU3RhcnRDaGlsZEluZGV4ICsgSl0gOj0gTmV3Q2hpbGRyZW5bSl07CisgICAgICBJbmRleFRvRGVsZXRlIDo9IFN0YXJ0Q2hpbGRJbmRleCArIE51bU5ld0NoaWxkcmVuOworICAgICAgZm9yIEMgOj0gSW5kZXhUb0RlbGV0ZSB0byBTdG9wQ2hpbGRJbmRleCBkbworICAgICAgYmVnaW4KKyAgICAgICAgLy8gZGVsZXRlIHNhbWUgaW5kZXgsIHNoaWZ0aW5nIGV2ZXJ5Ym9keSBkb3duIGVhY2ggdGltZQorICAgICAgICBLaWxsZWQgOj0gRkNoaWxkcmVuW0luZGV4VG9EZWxldGVdOworICAgICAgICBGQ2hpbGRyZW4uRGVsZXRlKEluZGV4VG9EZWxldGUpOworICAgICAgZW5kOworICAgICAgRnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhTdGFydENoaWxkSW5kZXgpOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIGJlZ2luCisgICAgICAgIC8vIG1vcmUgbmV3IG5vZGVzIHRoYW4gd2VyZSB0aGVyZSBiZWZvcmUKKyAgICAgICAgLy8gZmlsbCBpbiBhcyBtYW55IGNoaWxkcmVuIGFzIHdlIGNhbiAocmVwbGFjaW5nSG93TWFueSkgdy9vIG1vdmluZyBkYXRhCisgICAgICAgIFJlcGxhY2VkU29GYXIgOj0gMDsKKyAgICAgICAgd2hpbGUgKFJlcGxhY2VkU29GYXIgPCBSZXBsYWNpbmdIb3dNYW55KSBkbworICAgICAgICBiZWdpbgorICAgICAgICAgIEZDaGlsZHJlbltTdGFydENoaWxkSW5kZXggKyBSZXBsYWNlZFNvRmFyXSA6PSBOZXdDaGlsZHJlbltSZXBsYWNlZFNvRmFyXTsKKyAgICAgICAgICBJbmMoUmVwbGFjZWRTb0Zhcik7CisgICAgICAgIGVuZDsKKworICAgICAgICAvLyByZXBsYWNlZFNvRmFyIGhhcyBjb3JyZWN0IGluZGV4IGZvciBjaGlsZHJlbiB0byBhZGQKKyAgICAgICAgd2hpbGUgKFJlcGxhY2VkU29GYXIgPCBSZXBsYWNpbmdXaXRoSG93TWFueSkgZG8KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBGQ2hpbGRyZW4uSW5zZXJ0KFN0YXJ0Q2hpbGRJbmRleCArIFJlcGxhY2VkU29GYXIsTmV3Q2hpbGRyZW5bUmVwbGFjZWRTb0Zhcl0pOworICAgICAgICAgIEluYyhSZXBsYWNlZFNvRmFyKTsKKyAgICAgICAgZW5kOworCisgICAgICAgIEZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoU3RhcnRDaGlsZEluZGV4KTsKKyAgICAgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlVHJlZS5TYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKK2JlZ2luCisgIFNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKG5pbCwgLTEpOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlLlNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKGNvbnN0IFBhcmVudDogSVRyZWU7CisgIGNvbnN0IEk6IEludGVnZXIpOwordmFyCisgIE4sIEM6IEludGVnZXI7CisgIENoaWxkOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIGlmIG5vdCBTYW1lT2JqKFBhcmVudCwgR2V0UGFyZW50KSB0aGVuCisgICAgcmFpc2UgRUFyZ3VtZW50RXhjZXB0aW9uLkNyZWF0ZSgncGFyZW50cyBkb24nJ3QgbWF0Y2g7IGV4cGVjdGVkICcKKyAgICAgICsgUGFyZW50LlRvU3RyaW5nICsgJyBmb3VuZCAnICsgR2V0UGFyZW50LlRvU3RyaW5nKTsKKworICBpZiAoSSA8PiBHZXRDaGlsZEluZGV4KSB0aGVuCisgICAgcmFpc2UgRUFyZ3VtZW50RXhjZXB0aW9uLkNyZWF0ZSgnY2hpbGQgaW5kZXhlcyBkb24nJ3QgbWF0Y2g7IGV4cGVjdGVkICcKKyAgICAgICsgSW50VG9TdHIoSSkgKyAnIGZvdW5kICcgKyBJbnRUb1N0cihHZXRDaGlsZEluZGV4KSk7CisKKyAgTiA6PSBHZXRDaGlsZENvdW50OworICBmb3IgQyA6PSAwIHRvIE4gLSAxIGRvCisgIGJlZ2luCisgICAgQ2hpbGQgOj0gR2V0Q2hpbGQoQykgYXMgSUNvbW1vblRyZWU7CisgICAgQ2hpbGQuU2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoU2VsZiwgQyk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlVHJlZS5TZXRDaGlsZChjb25zdCBJOiBJbnRlZ2VyOyBjb25zdCBUOiBJVHJlZSk7CitiZWdpbgorICBpZiAoVCA9IG5pbCkgdGhlbgorICAgIEV4aXQ7CisKKyAgaWYgVC5Jc05pbCB0aGVuCisgICAgcmFpc2UgRUFyZ3VtZW50RXhjZXB0aW9uLkNyZWF0ZSgnQ2Fubm90IHNldCBzaW5nbGUgY2hpbGQgdG8gYSBsaXN0Jyk7CisKKyAgaWYgKEZDaGlsZHJlbiA9IG5pbCkgdGhlbgorICBiZWdpbgorICAgIEZDaGlsZHJlbiA6PSBDcmVhdGVDaGlsZHJlbkxpc3Q7CisgIGVuZDsKKworICBGQ2hpbGRyZW5bSV0gOj0gVCBhcyBJQmFzZVRyZWU7CisgIFQuUGFyZW50IDo9IFNlbGY7CisgIFQuQ2hpbGRJbmRleCA6PSBJOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlLlNldENoaWxkSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgLy8gTm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlLlNldFBhcmVudChjb25zdCBWYWx1ZTogSVRyZWUpOworYmVnaW4KKyAgLy8gTm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWUuVG9TdHJpbmdUcmVlOiBTdHJpbmc7Cit2YXIKKyAgQnVmOiBUU3RyaW5nQnVpbGRlcjsKKyAgSTogSW50ZWdlcjsKKyAgVDogSUJhc2VUcmVlOworYmVnaW4KKyAgaWYgKEZDaGlsZHJlbiA9IG5pbCkgb3IgKEZDaGlsZHJlbi5Db3VudCA9IDApIHRoZW4KKyAgICBSZXN1bHQgOj0gVG9TdHJpbmcKKyAgZWxzZQorICBiZWdpbgorICAgIEJ1ZiA6PSBUU3RyaW5nQnVpbGRlci5DcmVhdGU7CisgICAgdHJ5CisgICAgICBpZiAobm90IEdldElzTmlsKSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBCdWYuQXBwZW5kKCcoJyk7CisgICAgICAgIEJ1Zi5BcHBlbmQoVG9TdHJpbmcpOworICAgICAgICBCdWYuQXBwZW5kKCcgJyk7CisgICAgICBlbmQ7CisKKyAgICAgIGZvciBJIDo9IDAgdG8gRkNoaWxkcmVuLkNvdW50IC0gMSBkbworICAgICAgYmVnaW4KKyAgICAgICAgVCA6PSBGQ2hpbGRyZW5bSV07CisgICAgICAgIGlmIChJID4gMCkgdGhlbgorICAgICAgICAgIEJ1Zi5BcHBlbmQoJyAnKTsKKyAgICAgICAgQnVmLkFwcGVuZChULlRvU3RyaW5nVHJlZSk7CisgICAgICBlbmQ7CisKKyAgICAgIGlmIChub3QgR2V0SXNOaWwpIHRoZW4KKyAgICAgICAgQnVmLkFwcGVuZCgnKScpOworCisgICAgICBSZXN1bHQgOj0gQnVmLlRvU3RyaW5nOworICAgIGZpbmFsbHkKKyAgICAgIEJ1Zi5GcmVlOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRDb21tb25UcmVlIH0KKworY29uc3RydWN0b3IgVENvbW1vblRyZWUuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBGU3RhcnRJbmRleCA6PSAtMTsKKyAgRlN0b3BJbmRleCA6PSAtMTsKKyAgRkNoaWxkSW5kZXggOj0gLTE7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25UcmVlLkNyZWF0ZShjb25zdCBBTm9kZTogSUNvbW1vblRyZWUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBTm9kZSk7CisgIEZUb2tlbiA6PSBBTm9kZS5Ub2tlbjsKKyAgRlN0YXJ0SW5kZXggOj0gQU5vZGUuU3RhcnRJbmRleDsKKyAgRlN0b3BJbmRleCA6PSBBTm9kZS5TdG9wSW5kZXg7CisgIEZDaGlsZEluZGV4IDo9IC0xOworZW5kOworCitjb25zdHJ1Y3RvciBUQ29tbW9uVHJlZS5DcmVhdGUoY29uc3QgQVRva2VuOiBJVG9rZW4pOworYmVnaW4KKyAgQ3JlYXRlOworICBGVG9rZW4gOj0gQVRva2VuOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZS5EdXBOb2RlOiBJVHJlZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQ29tbW9uVHJlZS5DcmVhdGUoU2VsZikgYXMgSUNvbW1vblRyZWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlLkdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChGVG9rZW4gPSBuaWwpIG9yIChGVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lID0gLTEpIHRoZW4KKyAgYmVnaW4KKyAgICBpZiAoR2V0Q2hpbGRDb3VudCA+IDApIHRoZW4KKyAgICAgIFJlc3VsdCA6PSBHZXRDaGlsZCgwKS5DaGFyUG9zaXRpb25JbkxpbmUKKyAgICBlbHNlCisgICAgICBSZXN1bHQgOj0gMDsKKyAgZW5kCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gRlRva2VuLkNoYXJQb3NpdGlvbkluTGluZTsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWUuR2V0Q2hpbGRJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ2hpbGRJbmRleDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWUuR2V0SXNOaWw6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gKEZUb2tlbiA9IG5pbCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlLkdldExpbmU6IEludGVnZXI7CitiZWdpbgorICBpZiAoRlRva2VuID0gbmlsKSBvciAoRlRva2VuLkxpbmUgPSAwKSB0aGVuCisgIGJlZ2luCisgICAgaWYgKEdldENoaWxkQ291bnQgPiAwKSB0aGVuCisgICAgICBSZXN1bHQgOj0gR2V0Q2hpbGQoMCkuTGluZQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSAwCisgIGVuZAorICBlbHNlCisgICAgUmVzdWx0IDo9IEZUb2tlbi5MaW5lOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZS5HZXRQYXJlbnQ6IElUcmVlOworYmVnaW4KKyAgUmVzdWx0IDo9IElUcmVlKEZQYXJlbnQpOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZS5HZXRTdGFydEluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdGFydEluZGV4OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZS5HZXRTdG9wSW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlN0b3BJbmRleDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWUuR2V0VGV4dDogU3RyaW5nOworYmVnaW4KKyAgaWYgKEZUb2tlbiA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAnJworICBlbHNlCisgICAgUmVzdWx0IDo9IEZUb2tlbi5UZXh0OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZS5HZXRUb2tlbjogSVRva2VuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlbjsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWUuR2V0VG9rZW5TdGFydEluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEZTdGFydEluZGV4ID0gLTEpIGFuZCAoRlRva2VuIDw+IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSBGVG9rZW4uVG9rZW5JbmRleAorICBlbHNlCisgICAgUmVzdWx0IDo9IEZTdGFydEluZGV4OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZS5HZXRUb2tlblN0b3BJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChGU3RvcEluZGV4ID0gLTEpIGFuZCAoRlRva2VuIDw+IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSBGVG9rZW4uVG9rZW5JbmRleAorICBlbHNlCisgICAgUmVzdWx0IDo9IEZTdG9wSW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlLkdldFRva2VuVHlwZTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChGVG9rZW4gPSBuaWwpIHRoZW4KKyAgICBSZXN1bHQgOj0gVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRQorICBlbHNlCisgICAgUmVzdWx0IDo9IEZUb2tlbi5Ub2tlblR5cGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVHJlZS5TZXRDaGlsZEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDaGlsZEluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWUuU2V0UGFyZW50KGNvbnN0IFZhbHVlOiBJVHJlZSk7CitiZWdpbgorICBGUGFyZW50IDo9IFBvaW50ZXIoVmFsdWUgYXMgSUNvbW1vblRyZWUpOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWUuU2V0U3RhcnRJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGU3RhcnRJbmRleCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlLlNldFN0b3BJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGU3RvcEluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWUuU2V0VG9rZW5TdGFydEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZTdGFydEluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWUuU2V0VG9rZW5TdG9wSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlN0b3BJbmRleCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWUuVG9TdHJpbmc6IFN0cmluZzsKK2JlZ2luCisgIGlmIChHZXRJc05pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAnbmlsJworICBlbHNlCisgICAgaWYgKEdldFRva2VuVHlwZSA9IFRUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUpIHRoZW4KKyAgICAgIFJlc3VsdCA6PSAnPGVycm9ybm9kZT4nCisgICAgZWxzZQorICAgICAgaWYgKEZUb2tlbiA9IG5pbCkgdGhlbgorICAgICAgICBSZXN1bHQgOj0gJycKKyAgICAgIGVsc2UKKyAgICAgICAgUmVzdWx0IDo9IEZUb2tlbi5UZXh0OworZW5kOworCit7IFRDb21tb25FcnJvck5vZGUgfQorCitjb25zdHJ1Y3RvciBUQ29tbW9uRXJyb3JOb2RlLkNyZWF0ZShjb25zdCBBSW5wdXQ6IElUb2tlblN0cmVhbTsgY29uc3QgQVN0YXJ0LAorICBBU3RvcDogSVRva2VuOyBjb25zdCBBRXhjZXB0aW9uOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgaWYgKEFTdG9wID0gbmlsKSBvciAoKEFTdG9wLlRva2VuSW5kZXggPCBBU3RhcnQuVG9rZW5JbmRleCkKKyAgICBhbmQgKEFTdG9wLlRva2VuVHlwZSA8PiBUVG9rZW4uRU9GKSkKKyAgdGhlbgorICAgIC8vIHNvbWV0aW1lcyByZXN5bmMgZG9lcyBub3QgY29uc3VtZSBhIHRva2VuICh3aGVuIExUKDEpIGlzCisgICAgLy8gaW4gZm9sbG93IHNldCkuIFNvLCBzdG9wIHdpbGwgYmUgMSB0byBsZWZ0IHRvIHN0YXJ0LiBhZGp1c3QuCisgICAgLy8gQWxzbyBoYW5kbGUgY2FzZSB3aGVyZSBzdGFydCBpcyB0aGUgZmlyc3QgdG9rZW4gYW5kIG5vIHRva2VuCisgICAgLy8gaXMgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5OyBMVCgtMSkgd2lsbCByZXR1cm4gbnVsbC4KKyAgICBGU3RvcCA6PSBBU3RhcnQKKyAgZWxzZQorICAgIEZTdG9wIDo9IEFTdG9wOworICBGSW5wdXQgOj0gQUlucHV0OworICBGU3RhcnQgOj0gQVN0YXJ0OworICBGVHJhcHBlZEV4Y2VwdGlvbiA6PSBBRXhjZXB0aW9uOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uRXJyb3JOb2RlLkdldElzTmlsOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZhbHNlOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uRXJyb3JOb2RlLkdldFRleHQ6IFN0cmluZzsKK3ZhcgorICBJLCBKOiBJbnRlZ2VyOworYmVnaW4KKyAgSSA6PSBGU3RhcnQuVG9rZW5JbmRleDsKKyAgaWYgKEZTdG9wLlRva2VuVHlwZSA9IFRUb2tlbi5FT0YpIHRoZW4KKyAgICBKIDo9IChGSW5wdXQgYXMgSVRva2VuU3RyZWFtKS5TaXplCisgIGVsc2UKKyAgICBKIDo9IEZTdG9wLlRva2VuSW5kZXg7CisgIFJlc3VsdCA6PSAoRklucHV0IGFzIElUb2tlblN0cmVhbSkuVG9TdHJpbmcoSSwgSik7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25FcnJvck5vZGUuR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IFRUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25FcnJvck5vZGUuVG9TdHJpbmc6IFN0cmluZzsKK2JlZ2luCisgIGlmIChGVHJhcHBlZEV4Y2VwdGlvbiBpcyBFTWlzc2luZ1Rva2VuRXhjZXB0aW9uKSB0aGVuCisgICAgUmVzdWx0IDo9ICc8bWlzc2luZyB0eXBlOiAnCisgICAgICArIEludFRvU3RyKEVNaXNzaW5nVG9rZW5FeGNlcHRpb24oRlRyYXBwZWRFeGNlcHRpb24pLk1pc3NpbmdUeXBlKSArICc+JworICBlbHNlCisgICAgaWYgKEZUcmFwcGVkRXhjZXB0aW9uIGlzIEVVbndhbnRlZFRva2VuRXhjZXB0aW9uKSB0aGVuCisgICAgICBSZXN1bHQgOj0gJzxleHRyYW5lb3VzOiAnCisgICAgICAgICsgRVVud2FudGVkVG9rZW5FeGNlcHRpb24oRlRyYXBwZWRFeGNlcHRpb24pLlVuZXhwZWN0ZWRUb2tlbi5Ub1N0cmluZworICAgICAgICArICcsIHJlc3luYz0nICsgR2V0VGV4dCArICc+JworICAgIGVsc2UKKyAgICAgIGlmIChGVHJhcHBlZEV4Y2VwdGlvbiBpcyBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKSB0aGVuCisgICAgICAgIFJlc3VsdCA6PSAnPG1pc21hdGNoZWQgdG9rZW46ICcgKyBGVHJhcHBlZEV4Y2VwdGlvbi5Ub2tlbi5Ub1N0cmluZworICAgICAgICAgICsgJywgcmVzeW5jPScgKyBHZXRUZXh0ICsgJz4nCisgICAgICBlbHNlCisgICAgICAgIGlmIChGVHJhcHBlZEV4Y2VwdGlvbiBpcyBFTm9WaWFibGVBbHRFeGNlcHRpb24pIHRoZW4KKyAgICAgICAgICBSZXN1bHQgOj0gJzx1bmV4cGVjdGVkOiAnICsgRlRyYXBwZWRFeGNlcHRpb24uVG9rZW4uVG9TdHJpbmcKKyAgICAgICAgICAgICsgJywgcmVzeW5jPScgKyBHZXRUZXh0ICsgJz4nCisgICAgICAgIGVsc2UKKyAgICAgICAgICBSZXN1bHQgOj0gJzxlcnJvcjogJyArIEdldFRleHQgKyAnPic7CitlbmQ7CisKK3sgVEJhc2VUcmVlQWRhcHRvciB9CisKK3Byb2NlZHVyZSBUQmFzZVRyZWVBZGFwdG9yLkFkZENoaWxkKGNvbnN0IFQsIENoaWxkOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgaWYgQXNzaWduZWQoVCkgYW5kIEFzc2lnbmVkKENoaWxkKSB0aGVuCisgICAgKFQgYXMgSVRyZWUpLkFkZENoaWxkKENoaWxkIGFzIElUcmVlKTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VUcmVlQWRhcHRvci5CZWNvbWVSb290KGNvbnN0IE5ld1Jvb3QsCisgIE9sZFJvb3Q6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBOZXdSb290VHJlZSwgT2xkUm9vdFRyZWU6IElUcmVlOworICBOQzogSW50ZWdlcjsKK2JlZ2luCisgIE5ld1Jvb3RUcmVlIDo9IE5ld1Jvb3QgYXMgSVRyZWU7CisgIE9sZFJvb3RUcmVlIDo9IE9sZFJvb3QgYXMgSVRyZWU7CisgIGlmIChPbGRSb290ID0gbmlsKSB0aGVuCisgICAgUmVzdWx0IDo9IE5ld1Jvb3QKKyAgZWxzZQorICBiZWdpbgorICAgIC8vIGhhbmRsZSBeKG5pbCByZWFsLW5vZGUpCisgICAgaWYgKE5ld1Jvb3RUcmVlLklzTmlsKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIE5DIDo9IE5ld1Jvb3RUcmVlLkNoaWxkQ291bnQ7CisgICAgICBpZiAoTkMgPSAxKSB0aGVuCisgICAgICAgIE5ld1Jvb3RUcmVlIDo9IE5ld1Jvb3RUcmVlLkdldENoaWxkKDApCisgICAgICBlbHNlCisgICAgICAgIGlmIChOQyA+IDEpIHRoZW4KKyAgICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdtb3JlIHRoYW4gb25lIG5vZGUgYXMgcm9vdCcpOworICAgIGVuZDsKKyAgICAvLyBhZGQgb2xkUm9vdCB0byBuZXdSb290OyBBZGRDaGlsZCB0YWtlcyBjYXJlIG9mIGNhc2Ugd2hlcmUgb2xkUm9vdAorICAgIC8vIGlzIGEgZmxhdCBsaXN0IChpLmUuLCBuaWwtcm9vdGVkIHRyZWUpLiAgQWxsIGNoaWxkcmVuIG9mIG9sZFJvb3QKKyAgICAvLyBhcmUgYWRkZWQgdG8gbmV3Um9vdC4KKyAgICBOZXdSb290VHJlZS5BZGRDaGlsZChPbGRSb290VHJlZSk7CisgICAgUmVzdWx0IDo9IE5ld1Jvb3RUcmVlOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuQmVjb21lUm9vdChjb25zdCBOZXdSb290OiBJVG9rZW47CisgIGNvbnN0IE9sZFJvb3Q6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBCZWNvbWVSb290KENyZWF0ZU5vZGUoTmV3Um9vdCksIE9sZFJvb3QpOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWVBZGFwdG9yLkNyZWF0ZU5vZGUoY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICBjb25zdCBGcm9tVG9rZW46IElUb2tlbik6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBUb2tlbjogSVRva2VuOworYmVnaW4KKyAgVG9rZW4gOj0gQ3JlYXRlVG9rZW4oRnJvbVRva2VuKTsKKyAgVG9rZW4uVG9rZW5UeXBlIDo9IFRva2VuVHlwZTsKKyAgUmVzdWx0IDo9IENyZWF0ZU5vZGUoVG9rZW4pOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWVBZGFwdG9yLkNyZWF0ZU5vZGUoY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICBjb25zdCBUZXh0OiBTdHJpbmcpOiBJQU5UTFJJbnRlcmZhY2U7Cit2YXIKKyAgVG9rZW46IElUb2tlbjsKK2JlZ2luCisgIFRva2VuIDo9IENyZWF0ZVRva2VuKFRva2VuVHlwZSwgVGV4dCk7CisgIFJlc3VsdCA6PSBDcmVhdGVOb2RlKFRva2VuKTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VUcmVlQWRhcHRvci5DcmVhdGVOb2RlKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsKKyAgY29uc3QgRnJvbVRva2VuOiBJVG9rZW47IGNvbnN0IFRleHQ6IFN0cmluZyk6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBUb2tlbjogSVRva2VuOworYmVnaW4KKyAgVG9rZW4gOj0gQ3JlYXRlVG9rZW4oRnJvbVRva2VuKTsKKyAgVG9rZW4uVG9rZW5UeXBlIDo9IFRva2VuVHlwZTsKKyAgVG9rZW4uVGV4dCA6PSBUZXh0OworICBSZXN1bHQgOj0gQ3JlYXRlTm9kZShUb2tlbik7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlVHJlZUFkYXB0b3IuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlVuaXF1ZU5vZGVJRCA6PSAxOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWVBZGFwdG9yLkRlbGV0ZUNoaWxkKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsKKyAgY29uc3QgSTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSAoVCBhcyBJVHJlZSkuRGVsZXRlQ2hpbGQoSSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuRHVwVHJlZShjb25zdCBULAorICBQYXJlbnQ6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBJLCBOOiBJbnRlZ2VyOworICBDaGlsZCwgTmV3U3ViVHJlZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgaWYgKFQgPSBuaWwpIHRoZW4KKyAgICBSZXN1bHQgOj0gbmlsCisgIGVsc2UKKyAgYmVnaW4KKyAgICBSZXN1bHQgOj0gRHVwTm9kZShUKTsKKyAgICAvLyBlbnN1cmUgbmV3IHN1YnRyZWUgcm9vdCBoYXMgcGFyZW50L2NoaWxkIGluZGV4IHNldAorICAgIFNldENoaWxkSWRleChSZXN1bHQsIEdldENoaWxkSW5kZXgoVCkpOworICAgIFNldFBhcmVudChSZXN1bHQsIFBhcmVudCk7CisgICAgTiA6PSBHZXRDaGlsZENvdW50KFQpOworICAgIGZvciBJIDo9IDAgdG8gTiAtIDEgZG8KKyAgICBiZWdpbgorICAgICAgQ2hpbGQgOj0gR2V0Q2hpbGQoVCwgSSk7CisgICAgICBOZXdTdWJUcmVlIDo9IER1cFRyZWUoQ2hpbGQsIFQpOworICAgICAgQWRkQ2hpbGQoUmVzdWx0LCBOZXdTdWJUcmVlKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VUcmVlQWRhcHRvci5EdXBUcmVlKGNvbnN0IFRyZWU6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBEdXBUcmVlKFRyZWUsIG5pbCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuRXJyb3JOb2RlKGNvbnN0IElucHV0OiBJVG9rZW5TdHJlYW07IGNvbnN0IFN0YXJ0LAorICBTdG9wOiBJVG9rZW47IGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQ29tbW9uRXJyb3JOb2RlLkNyZWF0ZShJbnB1dCwgU3RhcnQsIFN0b3AsIEUpOworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWVBZGFwdG9yLkdldENoaWxkKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsKKyAgY29uc3QgSTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSAoVCBhcyBJVHJlZSkuR2V0Q2hpbGQoSSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuR2V0Q2hpbGRDb3VudChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IChUIGFzIElUcmVlKS5DaGlsZENvdW50OworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWVBZGFwdG9yLkdldE5pbE5vZGU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBDcmVhdGVOb2RlKG5pbCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuR2V0Tm9kZVRleHQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IChUIGFzIElUcmVlKS5UZXh0OworZW5kOworCitmdW5jdGlvbiBUQmFzZVRyZWVBZGFwdG9yLkdldE5vZGVUeXBlKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VUcmVlQWRhcHRvci5HZXRVbmlxdWVJRChjb25zdCBOb2RlOiBJQU5UTFJJbnRlcmZhY2UpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEZUcmVlVG9VbmlxdWVJRE1hcCA9IG5pbCkgdGhlbgorICAgIEZUcmVlVG9VbmlxdWVJRE1hcCA6PSBURGljdGlvbmFyeTxJQU5UTFJJbnRlcmZhY2UsIEludGVnZXI+LkNyZWF0ZTsKKyAgaWYgKG5vdCBGVHJlZVRvVW5pcXVlSURNYXAuVHJ5R2V0VmFsdWUoTm9kZSwgUmVzdWx0KSkgdGhlbgorICBiZWdpbgorICAgIFJlc3VsdCA6PSBGVW5pcXVlTm9kZUlEOworICAgIEZUcmVlVG9VbmlxdWVJRE1hcFtOb2RlXSA6PSBSZXN1bHQ7CisgICAgSW5jKEZVbmlxdWVOb2RlSUQpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuSXNOaWwoY29uc3QgVHJlZTogSUFOVExSSW50ZXJmYWNlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoVHJlZSBhcyBJVHJlZSkuSXNOaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlVHJlZUFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKAorICBjb25zdCBSb290OiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7Cit2YXIKKyAgUjogSVRyZWU7CitiZWdpbgorICBSIDo9IFJvb3QgYXMgSVRyZWU7CisgIGlmIEFzc2lnbmVkKFIpIGFuZCAoUi5Jc05pbCkgdGhlbgorICBiZWdpbgorICAgIGlmIChSLkNoaWxkQ291bnQgPSAwKSB0aGVuCisgICAgICBSIDo9IG5pbAorICAgIGVsc2UKKyAgICAgIGlmIChSLkNoaWxkQ291bnQgPSAxKSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBSIDo9IFIuR2V0Q2hpbGQoMCk7CisgICAgICAgIC8vIHdob2V2ZXIgaW52b2tlcyBydWxlIHdpbGwgc2V0IHBhcmVudCBhbmQgY2hpbGQgaW5kZXgKKyAgICAgICAgUi5QYXJlbnQgOj0gbmlsOworICAgICAgICBSLkNoaWxkSW5kZXggOj0gLTE7CisgICAgICBlbmQ7CisgIGVuZDsKKyAgUmVzdWx0IDo9IFI7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVRyZWVBZGFwdG9yLlNldENoaWxkKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgSTogSW50ZWdlcjsKKyAgY29uc3QgQ2hpbGQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICAoVCBhcyBJVHJlZSkuU2V0Q2hpbGQoSSwgQ2hpbGQgYXMgSVRyZWUpOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VUcmVlQWRhcHRvci5TZXROb2RlVGV4dChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IFRleHQ6IFN0cmluZyk7CitiZWdpbgorICByYWlzZSBFSW52YWxpZE9wZXJhdGlvbi5DcmVhdGUoJ2RvbicndCBrbm93IGVub3VnaCBhYm91dCBUcmVlIG5vZGUnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlVHJlZUFkYXB0b3IuU2V0Tm9kZVR5cGUoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBOb2RlVHlwZTogSW50ZWdlcik7CitiZWdpbgorICByYWlzZSBFSW52YWxpZE9wZXJhdGlvbi5DcmVhdGUoJ2RvbicndCBrbm93IGVub3VnaCBhYm91dCBUcmVlIG5vZGUnKTsKK2VuZDsKKworeyBUQ29tbW9uVHJlZUFkYXB0b3IgfQorCitmdW5jdGlvbiBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlTm9kZShjb25zdCBQYXlsb2FkOiBJVG9rZW4pOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gVENvbW1vblRyZWUuQ3JlYXRlKFBheWxvYWQpOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlVG9rZW4oY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICBjb25zdCBUZXh0OiBTdHJpbmcpOiBJVG9rZW47CitiZWdpbgorICBSZXN1bHQgOj0gVENvbW1vblRva2VuLkNyZWF0ZShUb2tlblR5cGUsIFRleHQpOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZUFkYXB0b3IuQ3JlYXRlVG9rZW4oY29uc3QgRnJvbVRva2VuOiBJVG9rZW4pOiBJVG9rZW47CitiZWdpbgorICBSZXN1bHQgOj0gVENvbW1vblRva2VuLkNyZWF0ZShGcm9tVG9rZW4pOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZUFkYXB0b3IuRHVwTm9kZSgKKyAgY29uc3QgVHJlZU5vZGU6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIGlmIChUcmVlTm9kZSA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSBuaWwKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAoVHJlZU5vZGUgYXMgSVRyZWUpLkR1cE5vZGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlQWRhcHRvci5HZXRDaGlsZChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBpZiAoVCA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSBuaWwKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAoVCBhcyBJVHJlZSkuR2V0Q2hpbGQoSSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlQWRhcHRvci5HZXRDaGlsZENvdW50KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CitiZWdpbgorICBpZiAoVCA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAwCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gKFQgYXMgSVRyZWUpLkNoaWxkQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlQWRhcHRvci5HZXRDaGlsZEluZGV4KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gKFQgYXMgSVRyZWUpLkNoaWxkSW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlQWRhcHRvci5HZXROb2RlVGV4dChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBTdHJpbmc7CitiZWdpbgorICBpZiAoVCA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAnJworICBlbHNlCisgICAgUmVzdWx0IDo9IChUIGFzIElUcmVlKS5UZXh0OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZUFkYXB0b3IuR2V0Tm9kZVR5cGUoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChUID0gbmlsKSB0aGVuCisgICAgUmVzdWx0IDo9IFRUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAoVCBhcyBJVHJlZSkuVG9rZW5UeXBlOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZUFkYXB0b3IuR2V0UGFyZW50KAorICBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gKFQgYXMgSVRyZWUpLlBhcmVudDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWVBZGFwdG9yLkdldFRva2VuKGNvbnN0IFRyZWVOb2RlOiBJQU5UTFJJbnRlcmZhY2UpOiBJVG9rZW47Cit2YXIKKyAgQ29tbW9uVHJlZTogSUNvbW1vblRyZWU7CitiZWdpbgorICBpZiBTdXBwb3J0cyhUcmVlTm9kZSwgSUNvbW1vblRyZWUsIENvbW1vblRyZWUpIHRoZW4KKyAgICBSZXN1bHQgOj0gQ29tbW9uVHJlZS5Ub2tlbgorICBlbHNlCisgICAgUmVzdWx0IDo9IG5pbDsgLy8gbm8gaWRlYSB3aGF0IHRvIGRvCitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlQWRhcHRvci5HZXRUb2tlblN0YXJ0SW5kZXgoCisgIGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IEludGVnZXI7CitiZWdpbgorICBpZiAoVCA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAtMQorICBlbHNlCisgICAgUmVzdWx0IDo9IChUIGFzIElUcmVlKS5Ub2tlblN0YXJ0SW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlQWRhcHRvci5HZXRUb2tlblN0b3BJbmRleCgKKyAgY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChUID0gbmlsKSB0aGVuCisgICAgUmVzdWx0IDo9IC0xCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gKFQgYXMgSVRyZWUpLlRva2VuU3RvcEluZGV4OworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVBZGFwdG9yLlJlcGxhY2VDaGlsZHJlbihjb25zdCBQYXJlbnQ6IElBTlRMUkludGVyZmFjZTsKKyAgY29uc3QgU3RhcnRDaGlsZEluZGV4LCBTdG9wQ2hpbGRJbmRleDogSW50ZWdlcjsgY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKFBhcmVudCkgdGhlbgorICAgIChQYXJlbnQgYXMgSVRyZWUpLlJlcGxhY2VDaGlsZHJlbihTdGFydENoaWxkSW5kZXgsIFN0b3BDaGlsZEluZGV4LCBUKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlQWRhcHRvci5TZXRDaGlsZElkZXgoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBJbmRleDogSW50ZWdlcik7CitiZWdpbgorICAoVCBhcyBJVHJlZSkuQ2hpbGRJbmRleCA6PSBJbmRleDsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlQWRhcHRvci5TZXRQYXJlbnQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgKFQgYXMgSVRyZWUpLlBhcmVudCA6PSAoUGFyZW50IGFzIElUcmVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlQWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBTdGFydFRva2VuLCBTdG9wVG9rZW46IElUb2tlbik7Cit2YXIKKyAgU3RhcnQsIFN0b3A6IEludGVnZXI7CitiZWdpbgorICBpZiBBc3NpZ25lZChUKSB0aGVuCisgIGJlZ2luCisgICAgaWYgQXNzaWduZWQoU3RhcnRUb2tlbikgdGhlbgorICAgICAgU3RhcnQgOj0gU3RhcnRUb2tlbi5Ub2tlbkluZGV4CisgICAgZWxzZQorICAgICAgU3RhcnQgOj0gMDsKKworICAgIGlmIEFzc2lnbmVkKFN0b3BUb2tlbikgdGhlbgorICAgICAgU3RvcCA6PSBTdG9wVG9rZW4uVG9rZW5JbmRleAorICAgIGVsc2UKKyAgICAgIFN0b3AgOj0gMDsKKworICAgIChUIGFzIElUcmVlKS5Ub2tlblN0YXJ0SW5kZXggOj0gU3RhcnQ7CisgICAgKFQgYXMgSVRyZWUpLlRva2VuU3RvcEluZGV4IDo9IFN0b3A7CisgIGVuZDsKK2VuZDsKKworeyBUQ29tbW9uVHJlZU5vZGVTdHJlYW0gfQorCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLkFkZE5hdmlnYXRpb25Ob2RlKGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcik7Cit2YXIKKyAgTmF2Tm9kZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgaWYgKFRva2VuVHlwZSA9IFRUb2tlbi5ET1dOKSB0aGVuCisgIGJlZ2luCisgICAgaWYgKEdldEhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcykgdGhlbgorICAgICAgTmF2Tm9kZSA6PSBGQWRhcHRvci5DcmVhdGVOb2RlKFRUb2tlbi5ET1dOLCAnRE9XTicpCisgICAgZWxzZQorICAgICAgTmF2Tm9kZSA6PSBGRG93bjsKKyAgZW5kCisgIGVsc2UKKyAgYmVnaW4KKyAgICBpZiAoR2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKSB0aGVuCisgICAgICBOYXZOb2RlIDo9IEZBZGFwdG9yLkNyZWF0ZU5vZGUoVFRva2VuLlVQLCAnVVAnKQorICAgIGVsc2UKKyAgICAgIE5hdk5vZGUgOj0gRlVwOworICBlbmQ7CisgIEZOb2Rlcy5BZGQoTmF2Tm9kZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uQ29uc3VtZTsKK2JlZ2luCisgIGlmIChGUCA9IC0xKSB0aGVuCisgICAgRmlsbEJ1ZmZlcjsKKyAgSW5jKEZQKTsKK2VuZDsKKworY29uc3RydWN0b3IgVENvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgRlAgOj0gLTE7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25UcmVlTm9kZVN0cmVhbS5DcmVhdGUoY29uc3QgQVRyZWU6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBDcmVhdGUoVENvbW1vblRyZWVBZGFwdG9yLkNyZWF0ZSwgQVRyZWUpOworZW5kOworCitjb25zdHJ1Y3RvciBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIGNvbnN0IEFUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgQ3JlYXRlKEFBZGFwdG9yLCBBVHJlZSwgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKTsKK2VuZDsKKworY29uc3RydWN0b3IgVENvbW1vblRyZWVOb2RlU3RyZWFtLkNyZWF0ZShjb25zdCBBQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBjb25zdCBBVHJlZTogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBBSW5pdGlhbEJ1ZmZlclNpemU6IEludGVnZXIpOworYmVnaW4KKyAgQ3JlYXRlOworICBGUm9vdCA6PSBBVHJlZTsKKyAgRkFkYXB0b3IgOj0gQUFkYXB0b3I7CisgIEZOb2RlcyA6PSBUTGlzdDxJQU5UTFJJbnRlcmZhY2U+LkNyZWF0ZTsKKyAgRk5vZGVzLkNhcGFjaXR5IDo9IEFJbml0aWFsQnVmZmVyU2l6ZTsKKyAgRkRvd24gOj0gRkFkYXB0b3IuQ3JlYXRlTm9kZShUVG9rZW4uRE9XTiwgJ0RPV04nKTsKKyAgRlVwIDo9IEZBZGFwdG9yLkNyZWF0ZU5vZGUoVFRva2VuLlVQLCAnVVAnKTsKKyAgRkVvZiA6PSBGQWRhcHRvci5DcmVhdGVOb2RlKFRUb2tlbi5FT0YsICdFT0YnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlTm9kZVN0cmVhbS5GaWxsQnVmZmVyOworYmVnaW4KKyAgRmlsbEJ1ZmZlcihGUm9vdCk7CisgIEZQIDo9IDA7IC8vIGJ1ZmZlciBvZiBub2RlcyBpbnRpYWxpemVkIG5vdworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLkZpbGxCdWZmZXIoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlKTsKK3ZhcgorICBJc05pbDogQm9vbGVhbjsKKyAgQywgTjogSW50ZWdlcjsKK2JlZ2luCisgIElzTmlsIDo9IEZBZGFwdG9yLklzTmlsKFQpOworICBpZiAobm90IElzTmlsKSB0aGVuCisgICAgRk5vZGVzLkFkZChUKTsgLy8gYWRkIHRoaXMgbm9kZQorCisgIC8vIGFkZCBET1dOIG5vZGUgaWYgdCBoYXMgY2hpbGRyZW4KKyAgTiA6PSBGQWRhcHRvci5HZXRDaGlsZENvdW50KFQpOworICBpZiAobm90IElzTmlsKSBhbmQgKE4gPiAwKSB0aGVuCisgICAgQWRkTmF2aWdhdGlvbk5vZGUoVFRva2VuLkRPV04pOworCisgIC8vIGFuZCBub3cgYWRkIGFsbCBpdHMgY2hpbGRyZW4KKyAgZm9yIEMgOj0gMCB0byBOIC0gMSBkbworICAgIEZpbGxCdWZmZXIoRkFkYXB0b3IuR2V0Q2hpbGQoVCwgQykpOworCisgIC8vIGFkZCBVUCBub2RlIGlmIHQgaGFzIGNoaWxkcmVuCisgIGlmIChub3QgSXNOaWwpIGFuZCAoTiA+IDApIHRoZW4KKyAgICBBZGROYXZpZ2F0aW9uTm9kZShUVG9rZW4uVVApOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uR2V0KGNvbnN0IEk6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBpZiAoRlAgPSAtMSkgdGhlbgorICAgIEZpbGxCdWZmZXI7CisgIFJlc3VsdCA6PSBGTm9kZXNbSV07CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5HZXRDdXJyZW50U3ltYm9sOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gTFQoMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5HZXRIYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRlVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWVOb2RlU3RyZWFtLkdldE5vZGVJbmRleCgKKyAgY29uc3QgTm9kZTogSUFOVExSSW50ZXJmYWNlKTogSW50ZWdlcjsKK3ZhcgorICBUOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBpZiAoRlAgPSAtMSkgdGhlbgorICAgIEZpbGxCdWZmZXI7CisgIGZvciBSZXN1bHQgOj0gMCB0byBGTm9kZXMuQ291bnQgLSAxIGRvCisgIGJlZ2luCisgICAgVCA6PSBGTm9kZXNbUmVzdWx0XTsKKyAgICBpZiAoVCA9IE5vZGUpIHRoZW4KKyAgICAgIEV4aXQ7CisgIGVuZDsKKyAgUmVzdWx0IDo9IC0xOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uR2V0U291cmNlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFRva2VuU3RyZWFtLlNvdXJjZU5hbWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5HZXRUb2tlblN0cmVhbTogSVRva2VuU3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlbnM7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5HZXRUcmVlQWRhcHRvcjogSVRyZWVBZGFwdG9yOworYmVnaW4KKyAgUmVzdWx0IDo9IEZBZGFwdG9yOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uR2V0VHJlZVNvdXJjZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZSb290OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uSW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlA7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5MQShJOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQWRhcHRvci5HZXROb2RlVHlwZShMVChJKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5MQUNoYXIoSTogSW50ZWdlcik6IENoYXI7CitiZWdpbgorICBSZXN1bHQgOj0gQ2hhcihMQShJKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5MQihjb25zdCBLOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgaWYgKEsgPSAwKSB0aGVuCisgICAgUmVzdWx0IDo9IG5pbAorICBlbHNlCisgICAgaWYgKChGUCAtIEspIDwgMCkgdGhlbgorICAgICAgUmVzdWx0IDo9IG5pbAorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSBGTm9kZXNbRlAgLSBLXTsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWVOb2RlU3RyZWFtLkxUKGNvbnN0IEs6IEludGVnZXIpOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBpZiAoRlAgPSAtMSkgdGhlbgorICAgIEZpbGxCdWZmZXI7CisgIGlmIChLID0gMCkgdGhlbgorICAgIFJlc3VsdCA6PSBuaWwKKyAgZWxzZQorICAgIGlmIChLIDwgMCkgdGhlbgorICAgICAgUmVzdWx0IDo9IExCKC1LKQorICAgIGVsc2UKKyAgICAgIGlmICgoRlAgKyBLIC0gMSkgPj0gRk5vZGVzLkNvdW50KSB0aGVuCisgICAgICAgIFJlc3VsdCA6PSBGRW9mCisgICAgICBlbHNlCisgICAgICAgIFJlc3VsdCA6PSBGTm9kZXNbRlAgKyBLIC0gMV07CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5NYXJrOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEZQID0gLTEpIHRoZW4KKyAgICBGaWxsQnVmZmVyOworICBGTGFzdE1hcmtlciA6PSBJbmRleDsKKyAgUmVzdWx0IDo9IEZMYXN0TWFya2VyOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uUG9wOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDYWxscy5Qb3A7CisgIFNlZWsoUmVzdWx0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlTm9kZVN0cmVhbS5QdXNoKGNvbnN0IEluZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIChGQ2FsbHMgPSBuaWwpIHRoZW4KKyAgICBGQ2FsbHMgOj0gVFN0YWNrTGlzdDxJbnRlZ2VyPi5DcmVhdGU7CisgIEZDYWxscy5QdXNoKEZQKTsgLy8gc2F2ZSBjdXJyZW50IGluZGV4CisgIFNlZWsoSW5kZXgpOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLlJlbGVhc2UoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIC8vIG5vIHJlc291cmNlcyB0byByZWxlYXNlCitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uUmVwbGFjZUNoaWxkcmVuKGNvbnN0IFBhcmVudDogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBTdGFydENoaWxkSW5kZXgsIFN0b3BDaGlsZEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgaWYgQXNzaWduZWQoUGFyZW50KSB0aGVuCisgICAgRkFkYXB0b3IuUmVwbGFjZUNoaWxkcmVuKFBhcmVudCwgU3RhcnRDaGlsZEluZGV4LCBTdG9wQ2hpbGRJbmRleCwgVCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uUmVzZXQ7CitiZWdpbgorICBGUCA6PSAtMTsKKyAgRkxhc3RNYXJrZXIgOj0gMDsKKyAgaWYgQXNzaWduZWQoRkNhbGxzKSB0aGVuCisgICAgRkNhbGxzLkNsZWFyOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLlJld2luZChjb25zdCBNYXJrZXI6IEludGVnZXIpOworYmVnaW4KKyAgU2VlayhNYXJrZXIpOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLlJld2luZDsKK2JlZ2luCisgIFNlZWsoRkxhc3RNYXJrZXIpOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLlNlZWsoY29uc3QgSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgaWYgKEZQID0gLTEpIHRoZW4KKyAgICBGaWxsQnVmZmVyOworICBGUCA6PSBJbmRleDsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25UcmVlTm9kZVN0cmVhbS5TZXRIYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMoCisgIGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKK2JlZ2luCisgIEZVbmlxdWVOYXZpZ2F0aW9uTm9kZXMgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uU2V0VG9rZW5TdHJlYW0oY29uc3QgVmFsdWU6IElUb2tlblN0cmVhbSk7CitiZWdpbgorICBGVG9rZW5zIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRyZWVOb2RlU3RyZWFtLlNldFRyZWVBZGFwdG9yKGNvbnN0IFZhbHVlOiBJVHJlZUFkYXB0b3IpOworYmVnaW4KKyAgRkFkYXB0b3IgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5TaXplOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEZQID0gLTEpIHRoZW4KKyAgICBGaWxsQnVmZmVyOworICBSZXN1bHQgOj0gRk5vZGVzLkNvdW50OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVHJlZU5vZGVTdHJlYW0uVG9TdHJpbmcoY29uc3QgU3RhcnQsCisgIFN0b3A6IElBTlRMUkludGVyZmFjZSk6IFN0cmluZzsKK3ZhcgorICBDb21tb25UcmVlOiBJQ29tbW9uVHJlZTsKKyAgSSwgQmVnaW5Ub2tlbkluZGV4LCBFbmRUb2tlbkluZGV4OiBJbnRlZ2VyOworICBUOiBJQU5UTFJJbnRlcmZhY2U7CisgIEJ1ZjogVFN0cmluZ0J1aWxkZXI7CisgIFRleHQ6IFN0cmluZzsKK2JlZ2luCisgIFdyaXRlTG4oJ1RvU3RyaW5nJyk7CisgIGlmIChTdGFydCA9IG5pbCkgb3IgKFN0b3AgPSBuaWwpIHRoZW4KKyAgICBFeGl0OworICBpZiAoRlAgPSAtMSkgdGhlbgorICAgIEZpbGxCdWZmZXI7CisKKyAgaWYgU3VwcG9ydHMoU3RhcnQsIElDb21tb25UcmVlLCBDb21tb25UcmVlKSB0aGVuCisgICAgV3JpdGUoJ1RvU3RyaW5nOiAnICsgQ29tbW9uVHJlZS5Ub2tlbi5Ub1N0cmluZyArICcsICcpCisgIGVsc2UKKyAgICBXcml0ZUxuKFN0YXJ0LlRvU3RyaW5nKTsKKworICBpZiBTdXBwb3J0cyhTdG9wLCBJQ29tbW9uVHJlZSwgQ29tbW9uVHJlZSkgdGhlbgorICAgIFdyaXRlTG4oQ29tbW9uVHJlZS5Ub2tlbi5Ub1N0cmluZykKKyAgZWxzZQorICAgIFdyaXRlTG4oU3RvcC5Ub1N0cmluZyk7CisKKyAgLy8gaWYgd2UgaGF2ZSB0aGUgdG9rZW4gc3RyZWFtLCB1c2UgdGhhdCB0byBkdW1wIHRleHQgaW4gb3JkZXIKKyAgaWYgQXNzaWduZWQoRlRva2VucykgdGhlbgorICBiZWdpbgorICAgIEJlZ2luVG9rZW5JbmRleCA6PSBGQWRhcHRvci5HZXRUb2tlblN0YXJ0SW5kZXgoU3RhcnQpOworICAgIEVuZFRva2VuSW5kZXggOj0gRkFkYXB0b3IuR2V0VG9rZW5TdGFydEluZGV4KFN0b3ApOworICAgIC8vIGlmIGl0J3MgYSB0cmVlLCB1c2Ugc3RhcnQvc3RvcCBpbmRleCBmcm9tIHN0YXJ0IG5vZGUKKyAgICAvLyBlbHNlIHVzZSB0b2tlbiByYW5nZSBmcm9tIHN0YXJ0L3N0b3Agbm9kZXMKKyAgICBpZiAoRkFkYXB0b3IuR2V0Tm9kZVR5cGUoU3RvcCkgPSBUVG9rZW4uVVApIHRoZW4KKyAgICAgIEVuZFRva2VuSW5kZXggOj0gRkFkYXB0b3IuR2V0VG9rZW5TdG9wSW5kZXgoU3RhcnQpCisgICAgZWxzZQorICAgICAgaWYgKEZBZGFwdG9yLkdldE5vZGVUeXBlKFN0b3ApID0gVFRva2VuLkVPRikgdGhlbgorICAgICAgICBFbmRUb2tlbkluZGV4IDo9IFNpemUgLSAyOyAvLyBkb24ndCB1c2UgRU9GCisgICAgUmVzdWx0IDo9IEZUb2tlbnMuVG9TdHJpbmcoQmVnaW5Ub2tlbkluZGV4LCBFbmRUb2tlbkluZGV4KTsKKyAgICBFeGl0OworICBlbmQ7CisKKyAgLy8gd2FsayBub2RlcyBsb29raW5nIGZvciBzdGFydAorICBUIDo9IG5pbDsKKyAgSSA6PSAwOworICB3aGlsZSAoSSA8IEZOb2Rlcy5Db3VudCkgZG8KKyAgYmVnaW4KKyAgICBUIDo9IEZOb2Rlc1tJXTsKKyAgICBpZiBTYW1lT2JqKFQsIFN0YXJ0KSB0aGVuCisgICAgICBCcmVhazsKKyAgICBJbmMoSSk7CisgIGVuZDsKKworICAvLyBub3cgd2FsayB1bnRpbCB3ZSBzZWUgc3RvcCwgZmlsbGluZyBzdHJpbmcgYnVmZmVyIHdpdGggdGV4dAorICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBUIDo9IEZOb2Rlc1tJXTsKKyAgICB3aGlsZSAoVCA8PiBTdG9wKSBkbworICAgIGJlZ2luCisgICAgICBUZXh0IDo9IEZBZGFwdG9yLkdldE5vZGVUZXh0KFQpOworICAgICAgaWYgKFRleHQgPSAnJykgdGhlbgorICAgICAgICBUZXh0IDo9ICcgJyArIEludFRvU3RyKEZBZGFwdG9yLkdldE5vZGVUeXBlKFQpKTsKKyAgICAgIEJ1Zi5BcHBlbmQoVGV4dCk7CisgICAgICBJbmMoSSk7CisgICAgICBUIDo9IEZOb2Rlc1tJXTsKKyAgICBlbmQ7CisKKyAgICAvLyBpbmNsdWRlIHN0b3Agbm9kZSB0b28KKyAgICBUZXh0IDo9IEZBZGFwdG9yLkdldE5vZGVUZXh0KFN0b3ApOworICAgIGlmIChUZXh0ID0gJycpIHRoZW4KKyAgICAgIFRleHQgOj0gJyAnICsgSW50VG9TdHIoRkFkYXB0b3IuR2V0Tm9kZVR5cGUoU3RvcCkpOworICAgIEJ1Zi5BcHBlbmQoVGV4dCk7CisgICAgUmVzdWx0IDo9IEJ1Zi5Ub1N0cmluZzsKKyAgZmluYWxseQorICAgIEJ1Zi5GcmVlOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25UcmVlTm9kZVN0cmVhbS5Ub1N0cmluZzogU3RyaW5nOwordmFyCisgIEJ1ZjogVFN0cmluZ0J1aWxkZXI7CisgIFQ6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIGlmIChGUCA9IC0xKSB0aGVuCisgICAgRmlsbEJ1ZmZlcjsKKyAgQnVmIDo9IFRTdHJpbmdCdWlsZGVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgZm9yIFQgaW4gRk5vZGVzIGRvCisgICAgYmVnaW4KKyAgICAgIEJ1Zi5BcHBlbmQoJyAnKTsKKyAgICAgIEJ1Zi5BcHBlbmQoRkFkYXB0b3IuR2V0Tm9kZVR5cGUoVCkpOworICAgIGVuZDsKKyAgICBSZXN1bHQgOj0gQnVmLlRvU3RyaW5nOworICBmaW5hbGx5CisgICAgQnVmLkZyZWU7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRyZWVOb2RlU3RyZWFtLlRvVG9rZW5TdHJpbmcoY29uc3QgU3RhcnQsCisgIFN0b3A6IEludGVnZXIpOiBTdHJpbmc7Cit2YXIKKyAgSTogSW50ZWdlcjsKKyAgVDogSUFOVExSSW50ZXJmYWNlOworICBCdWY6IFRTdHJpbmdCdWlsZGVyOworYmVnaW4KKyAgaWYgKEZQID0gLTEpIHRoZW4KKyAgICBGaWxsQnVmZmVyOworICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBmb3IgSSA6PSBTdG9wIHRvIE1pbihGTm9kZXMuQ291bnQgLSAxLCBTdG9wKSBkbworICAgIGJlZ2luCisgICAgICBUIDo9IEZOb2Rlc1tJXTsKKyAgICAgIEJ1Zi5BcHBlbmQoJyAnKTsKKyAgICAgIEJ1Zi5BcHBlbmQoRkFkYXB0b3IuR2V0VG9rZW4oVCkuVG9TdHJpbmcpOworICAgIGVuZDsKKworICAgIFJlc3VsdCA6PSBCdWYuVG9TdHJpbmc7CisgIGZpbmFsbHkKKyAgICBCdWYuRnJlZTsKKyAgZW5kOworZW5kOworCit7IFRQYXJzZVRyZWUgfQorCitjb25zdHJ1Y3RvciBUUGFyc2VUcmVlLkNyZWF0ZShjb25zdCBBTGFiZWw6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUGF5bG9hZCA6PSBBTGFiZWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRQYXJzZVRyZWUuRHVwTm9kZTogSVRyZWU7CitiZWdpbgorICBSZXN1bHQgOj0gbmlsOworZW5kOworCitmdW5jdGlvbiBUUGFyc2VUcmVlLkdldFRleHQ6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBUb1N0cmluZzsKK2VuZDsKKworZnVuY3Rpb24gVFBhcnNlVHJlZS5HZXRUb2tlblN0YXJ0SW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFBhcnNlVHJlZS5HZXRUb2tlblN0b3BJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUUGFyc2VUcmVlLkdldFRva2VuVHlwZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFBhcnNlVHJlZS5TZXRUb2tlblN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgLy8gTm8gaW1wbGVtZW50YXRpb24KK2VuZDsKKworcHJvY2VkdXJlIFRQYXJzZVRyZWUuU2V0VG9rZW5TdG9wSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgLy8gTm8gaW1wbGVtZW50YXRpb24KK2VuZDsKKworZnVuY3Rpb24gVFBhcnNlVHJlZS5Ub0lucHV0U3RyaW5nOiBTdHJpbmc7Cit2YXIKKyAgQnVmOiBUU3RyaW5nQnVpbGRlcjsKK2JlZ2luCisgIEJ1ZiA6PSBUU3RyaW5nQnVpbGRlci5DcmVhdGU7CisgIHRyeQorICAgIF9Ub1N0cmluZ0xlYXZlcyhCdWYpOworICAgIFJlc3VsdCA6PSBCdWYuVG9TdHJpbmc7CisgIGZpbmFsbHkKKyAgICBCdWYuRnJlZTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUUGFyc2VUcmVlLlRvU3RyaW5nOiBTdHJpbmc7Cit2YXIKKyAgVDogSVRva2VuOworYmVnaW4KKyAgaWYgU3VwcG9ydHMoRlBheWxvYWQsIElUb2tlbiwgVCkgdGhlbgorICBiZWdpbgorICAgIGlmIChULlRva2VuVHlwZSA9IFRUb2tlbi5FT0YpIHRoZW4KKyAgICAgIFJlc3VsdCA6PSAnPEVPRj4nCisgICAgZWxzZQorICAgICAgUmVzdWx0IDo9IFQuVGV4dDsKKyAgZW5kCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gRlBheWxvYWQuVG9TdHJpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRQYXJzZVRyZWUuVG9TdHJpbmdXaXRoSGlkZGVuVG9rZW5zOiBTdHJpbmc7Cit2YXIKKyAgQnVmOiBUU3RyaW5nQnVpbGRlcjsKKyAgSGlkZGVuOiBJVG9rZW47CisgIE5vZGVUZXh0OiBTdHJpbmc7CitiZWdpbgorICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBpZiBBc3NpZ25lZChGSGlkZGVuVG9rZW5zKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZvciBIaWRkZW4gaW4gRkhpZGRlblRva2VucyBkbworICAgICAgICBCdWYuQXBwZW5kKEhpZGRlbi5UZXh0KTsKKyAgICBlbmQ7CisgICAgTm9kZVRleHQgOj0gVG9TdHJpbmc7CisgICAgaWYgKE5vZGVUZXh0IDw+ICc8RU9GPicpIHRoZW4KKyAgICAgIEJ1Zi5BcHBlbmQoTm9kZVRleHQpOworICAgIFJlc3VsdCA6PSBCdWYuVG9TdHJpbmc7CisgIGZpbmFsbHkKKyAgICBCdWYuRnJlZTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFBhcnNlVHJlZS5fVG9TdHJpbmdMZWF2ZXMoY29uc3QgQnVmOiBUU3RyaW5nQnVpbGRlcik7Cit2YXIKKyAgVDogSUJhc2VUcmVlOworYmVnaW4KKyAgaWYgU3VwcG9ydHMoRlBheWxvYWQsIElUb2tlbikgdGhlbgorICBiZWdpbgorICAgIC8vIGxlYWYgbm9kZSB0b2tlbj8KKyAgICBCdWYuQXBwZW5kKFRvU3RyaW5nV2l0aEhpZGRlblRva2Vucyk7CisgICAgRXhpdDsKKyAgZW5kOworICBpZiBBc3NpZ25lZChGQ2hpbGRyZW4pIHRoZW4KKyAgICBmb3IgVCBpbiBGQ2hpbGRyZW4gZG8KKyAgICAgIChUIGFzIElQYXJzZVRyZWUpLl9Ub1N0cmluZ0xlYXZlcyhCdWYpOworZW5kOworCit7IEVSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24gfQorCitjb25zdHJ1Y3RvciBFUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLkNyZWF0ZSgKKyAgY29uc3QgQUVsZW1lbnREZXNjcmlwdGlvbjogU3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUVsZW1lbnREZXNjcmlwdGlvbik7CisgIEZFbGVtZW50RGVzY3JpcHRpb24gOj0gQUVsZW1lbnREZXNjcmlwdGlvbjsKK2VuZDsKKworeyBUUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIH0KKworcHJvY2VkdXJlIFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uQWRkKGNvbnN0IEVsOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgaWYgKEVsID0gbmlsKSB0aGVuCisgICAgRXhpdDsKKyAgaWYgQXNzaWduZWQoRkVsZW1lbnRzKSB0aGVuCisgICAgIC8vIGlmIGluIGxpc3QsIGp1c3QgYWRkCisgICAgRkVsZW1lbnRzLkFkZChFbCkKKyAgZWxzZQorICAgIGlmIChGU2luZ2xlRWxlbWVudCA9IG5pbCkgdGhlbgorICAgICAgLy8gbm8gZWxlbWVudHMgeWV0LCB0cmFjayB3L28gbGlzdAorICAgICAgRlNpbmdsZUVsZW1lbnQgOj0gRWwKKyAgICBlbHNlCisgICAgYmVnaW4KKyAgICAgIC8vIGFkZGluZyAybmQgZWxlbWVudCwgbW92ZSB0byBsaXN0CisgICAgICBGRWxlbWVudHMgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgICAgICBGRWxlbWVudHMuQ2FwYWNpdHkgOj0gNTsKKyAgICAgIEZFbGVtZW50cy5BZGQoRlNpbmdsZUVsZW1lbnQpOworICAgICAgRlNpbmdsZUVsZW1lbnQgOj0gbmlsOworICAgICAgRkVsZW1lbnRzLkFkZChFbCk7CisgICAgZW5kOworZW5kOworCitjb25zdHJ1Y3RvciBUUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLkNyZWF0ZShjb25zdCBBQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBjb25zdCBBRWxlbWVudERlc2NyaXB0aW9uOiBTdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkFkYXB0b3IgOj0gQUFkYXB0b3I7CisgIEZFbGVtZW50RGVzY3JpcHRpb24gOj0gQUVsZW1lbnREZXNjcmlwdGlvbjsKK2VuZDsKKworY29uc3RydWN0b3IgVFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5DcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgY29uc3QgQUVsZW1lbnREZXNjcmlwdGlvbjogU3RyaW5nOyBjb25zdCBBT25lRWxlbWVudDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIENyZWF0ZShBQWRhcHRvciwgQUVsZW1lbnREZXNjcmlwdGlvbik7CisgIEFkZChBT25lRWxlbWVudCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIGNvbnN0IEFFbGVtZW50RGVzY3JpcHRpb246IFN0cmluZzsgY29uc3QgQUVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+KTsKK2JlZ2luCisgIENyZWF0ZShBQWRhcHRvciwgQUVsZW1lbnREZXNjcmlwdGlvbik7CisgIEZFbGVtZW50cyA6PSBBRWxlbWVudHM7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uR2V0RGVzY3JpcHRpb246IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRWxlbWVudERlc2NyaXB0aW9uOworZW5kOworCitmdW5jdGlvbiBUUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLkhhc05leHQ6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gKChGU2luZ2xlRWxlbWVudCA8PiBuaWwpIGFuZCAoRkN1cnNvciA8IDEpKQorICAgIG9yICgoRkVsZW1lbnRzIDw+IG5pbCkgYW5kIChGQ3Vyc29yIDwgRkVsZW1lbnRzLkNvdW50KSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uTmV4dFRyZWU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBfTmV4dDsKK2VuZDsKKworcHJvY2VkdXJlIFRSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uUmVzZXQ7CitiZWdpbgorICBGQ3Vyc29yIDo9IDA7CisgIEZEaXJ0eSA6PSBUcnVlOworZW5kOworCitmdW5jdGlvbiBUUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLlNpemU6IEludGVnZXI7CitiZWdpbgorICBpZiBBc3NpZ25lZChGU2luZ2xlRWxlbWVudCkgdGhlbgorICAgIFJlc3VsdCA6PSAxCisgIGVsc2UKKyAgICBpZiBBc3NpZ25lZChGRWxlbWVudHMpIHRoZW4KKyAgICAgIFJlc3VsdCA6PSBGRWxlbWVudHMuQ291bnQKKyAgICBlbHNlCisgICAgICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5Ub1RyZWUoY29uc3QgRWw6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBFbDsKK2VuZDsKKworZnVuY3Rpb24gVFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5fTmV4dDogSUFOVExSSW50ZXJmYWNlOwordmFyCisgIFNpemU6IEludGVnZXI7CitiZWdpbgorICBTaXplIDo9IFNlbGYuU2l6ZTsKKyAgaWYgKFNpemUgPSAwKSB0aGVuCisgICAgcmFpc2UgRVJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5DcmVhdGUoRkVsZW1lbnREZXNjcmlwdGlvbik7CisKKyAgaWYgKEZDdXJzb3IgPj0gU2l6ZSkgdGhlbgorICBiZWdpbgorICAgICAvLyBvdXQgb2YgZWxlbWVudHM/CisgICAgIGlmIChTaXplID0gMSkgdGhlbgorICAgICAgIC8vIGlmIHNpemUgaXMgMSwgaXQncyBvazsgcmV0dXJuIGFuZCB3ZSdsbCBkdXAKKyAgICAgICBSZXN1bHQgOj0gVG9UcmVlKEZTaW5nbGVFbGVtZW50KQorICAgICBlbHNlCisgICAgICAgLy8gb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIHdhcyBub3QgMSwgc28gd2UgY2FuJ3QgZHVwCisgICAgICAgcmFpc2UgRVJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5DcmVhdGUoRkVsZW1lbnREZXNjcmlwdGlvbik7CisgIGVuZAorICBlbHNlCisgIGJlZ2luCisgICAgLy8gd2UgaGF2ZSBlbGVtZW50cworICAgIGlmIEFzc2lnbmVkKEZTaW5nbGVFbGVtZW50KSB0aGVuCisgICAgYmVnaW4KKyAgICAgIEluYyhGQ3Vyc29yKTsgLy8gbW92ZSBjdXJzb3IgZXZlbiBmb3Igc2luZ2xlIGVsZW1lbnQgbGlzdAorICAgICAgUmVzdWx0IDo9IFRvVHJlZShGU2luZ2xlRWxlbWVudCk7CisgICAgZW5kCisgICAgZWxzZQorICAgIGJlZ2luCisgICAgICAvLyBtdXN0IGhhdmUgbW9yZSB0aGFuIG9uZSBpbiBsaXN0LCBwdWxsIGZyb20gZWxlbWVudHMKKyAgICAgIFJlc3VsdCA6PSBUb1RyZWUoRkVsZW1lbnRzW0ZDdXJzb3JdKTsKKyAgICAgIEluYyhGQ3Vyc29yKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworeyBUUmV3cml0ZVJ1bGVOb2RlU3RyZWFtIH0KKworZnVuY3Rpb24gVFJld3JpdGVSdWxlTm9kZVN0cmVhbS5OZXh0Tm9kZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IF9OZXh0OworZW5kOworCitmdW5jdGlvbiBUUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLlRvVHJlZSgKKyAgY29uc3QgRWw6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQWRhcHRvci5EdXBOb2RlKEVsKTsKK2VuZDsKKworeyBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIH0KKworZnVuY3Rpb24gVFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5EdXAoCisgIGNvbnN0IE86IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQWRhcHRvci5EdXBUcmVlKE8pOworZW5kOworCitmdW5jdGlvbiBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkR1cE5vZGUoCisgIGNvbnN0IE86IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQWRhcHRvci5EdXBOb2RlKE8pOworZW5kOworCitmdW5jdGlvbiBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkZldGNoT2JqZWN0KAorICBjb25zdCBQSDogVFByb2Nlc3NIYW5kbGVyKTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgaWYgKFJlcXVpcmVzRHVwbGljYXRpb24pIHRoZW4KKyAgICAvLyBwcm9jZXNzIHRoZSBvYmplY3QKKyAgICBSZXN1bHQgOj0gUEgoX05leHQpCisgIGVsc2UKKyAgICAvLyB0ZXN0IGFib3ZlIHRoZW4gZmV0Y2gKKyAgICBSZXN1bHQgOj0gX05leHQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uTmV4dE5vZGU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIC8vIGlmIG5lY2Vzc2FyeSwgZHVwIChhdCBtb3N0IGEgc2luZ2xlIG5vZGUgc2luY2UgdGhpcyBpcyBmb3IgbWFraW5nIHJvb3Qgbm9kZXMpLgorICBSZXN1bHQgOj0gRmV0Y2hPYmplY3QoRHVwTm9kZSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uTmV4dFRyZWU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIC8vIGlmIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZSBpcyAxLCBkdXAKKyAgUmVzdWx0IDo9IEZldGNoT2JqZWN0KER1cCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uUmVxdWlyZXNEdXBsaWNhdGlvbjogQm9vbGVhbjsKK3ZhcgorICBTaXplOiBJbnRlZ2VyOworYmVnaW4KKyAgU2l6ZSA6PSBTZWxmLlNpemU7CisgIC8vIGlmIGRpcnR5IG9yIGlmIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZSBpcyAxCisgIFJlc3VsdCA6PSBGRGlydHkgb3IgKChGQ3Vyc29yID49IFNpemUpIGFuZCAoU2l6ZSA9IDEpKTsKK2VuZDsKKworeyBUUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSB9CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZVRva2VuU3RyZWFtLk5leHROb2RlOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gRkFkYXB0b3IuQ3JlYXRlTm9kZShfTmV4dCBhcyBJVG9rZW4pCitlbmQ7CisKK2Z1bmN0aW9uIFRSZXdyaXRlUnVsZVRva2VuU3RyZWFtLk5leHRUb2tlbjogSVRva2VuOworYmVnaW4KKyAgUmVzdWx0IDo9IF9OZXh0IGFzIElUb2tlbjsKK2VuZDsKKworZnVuY3Rpb24gVFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uVG9UcmVlKAorICBjb25zdCBFbDogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IEVsOworZW5kOworCit7IFRUcmVlUGFyc2VyIH0KKworY29uc3RydWN0b3IgVFRyZWVQYXJzZXIuQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRyZWVOb2RlU3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7IC8vIGhpZ2hsaWdodCB0aGF0IHdlIGdvIHRvIHN1cGVyIHRvIHNldCBzdGF0ZSBvYmplY3QKKyAgU2V0VHJlZU5vZGVTdHJlYW0oQUlucHV0KTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyZWVQYXJzZXIuQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRyZWVOb2RlU3RyZWFtOworICBjb25zdCBBU3RhdGU6IElSZWNvZ25pemVyU2hhcmVkU3RhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBU3RhdGUpOyAvLyBzaGFyZSB0aGUgc3RhdGUgb2JqZWN0IHdpdGggYW5vdGhlciBwYXJzZXIKKyAgU2V0VHJlZU5vZGVTdHJlYW0oQUlucHV0KTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVQYXJzZXIuR2V0Q3VycmVudElucHV0U3ltYm9sKAorICBjb25zdCBJbnB1dDogSUludFN0cmVhbSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSW5wdXQuTFQoMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlUGFyc2VyLkdldEVycm9ySGVhZGVyKGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRHcmFtbWFyRmlsZU5hbWUgKyAnOiBub2RlIGZyb20gJzsKKyAgaWYgKEUuQXBwcm94aW1hdGVMaW5lSW5mbykgdGhlbgorICAgIFJlc3VsdCA6PSBSZXN1bHQgKyAnYWZ0ZXIgJzsKKyAgUmVzdWx0IDo9IFJlc3VsdCArICdsaW5lICcgKyBJbnRUb1N0cihFLkxpbmUpICsgJzonICsgSW50VG9TdHIoRS5DaGFyUG9zaXRpb25JbkxpbmUpOworZW5kOworCitmdW5jdGlvbiBUVHJlZVBhcnNlci5HZXRFcnJvck1lc3NhZ2UoY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOworICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7Cit2YXIKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworYmVnaW4KKyAgaWYgKFNlbGYgaXMgVFRyZWVQYXJzZXIpIHRoZW4KKyAgYmVnaW4KKyAgICBBZGFwdG9yIDo9IChFLklucHV0IGFzIElUcmVlTm9kZVN0cmVhbSkuVHJlZUFkYXB0b3I7CisgICAgRS5Ub2tlbiA6PSBBZGFwdG9yLkdldFRva2VuKEUuTm9kZSk7CisgICAgaWYgKEUuVG9rZW4gPSBuaWwpIHRoZW4KKyAgICAgIC8vIGNvdWxkIGJlIGFuIFVQL0RPV04gbm9kZQorICAgICAgRS5Ub2tlbiA6PSBUQ29tbW9uVG9rZW4uQ3JlYXRlKEFkYXB0b3IuR2V0Tm9kZVR5cGUoRS5Ob2RlKSwKKyAgICAgICAgQWRhcHRvci5HZXROb2RlVGV4dChFLk5vZGUpKTsKKyAgZW5kOworICBSZXN1bHQgOj0gaW5oZXJpdGVkIEdldEVycm9yTWVzc2FnZShFLCBUb2tlbk5hbWVzKTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVQYXJzZXIuR2V0SW5wdXQ6IElJbnRTdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gRklucHV0OworZW5kOworCitmdW5jdGlvbiBUVHJlZVBhcnNlci5HZXRNaXNzaW5nU3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247IGNvbnN0IEV4cGVjdGVkVG9rZW5UeXBlOiBJbnRlZ2VyOworICBjb25zdCBGb2xsb3c6IElCaXRTZXQpOiBJQU5UTFJJbnRlcmZhY2U7Cit2YXIKKyAgVG9rZW5UZXh0OiBTdHJpbmc7CitiZWdpbgorICBUb2tlblRleHQgOj0gJzxtaXNzaW5nICcgKyBHZXRUb2tlbk5hbWVzW0V4cGVjdGVkVG9rZW5UeXBlXSArICc+JzsKKyAgUmVzdWx0IDo9IFRDb21tb25UcmVlLkNyZWF0ZShUQ29tbW9uVG9rZW4uQ3JlYXRlKEV4cGVjdGVkVG9rZW5UeXBlLCBUb2tlblRleHQpKTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVQYXJzZXIuR2V0U291cmNlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dC5Tb3VyY2VOYW1lOworZW5kOworCitmdW5jdGlvbiBUVHJlZVBhcnNlci5HZXRUcmVlTm9kZVN0cmVhbTogSVRyZWVOb2RlU3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmVlUGFyc2VyLk1hdGNoQW55KGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTsKK3ZhcgorICBMb29rOiBJQU5UTFJJbnRlcmZhY2U7CisgIExldmVsLCBUb2tlblR5cGU6IEludGVnZXI7CitiZWdpbgorICBGU3RhdGUuRXJyb3JSZWNvdmVyeSA6PSBGYWxzZTsKKyAgRlN0YXRlLkZhaWxlZCA6PSBGYWxzZTsKKyAgTG9vayA6PSBGSW5wdXQuTFQoMSk7CisgIGlmIChGSW5wdXQuVHJlZUFkYXB0b3IuR2V0Q2hpbGRDb3VudChMb29rKSA9IDApIHRoZW4KKyAgYmVnaW4KKyAgICBGSW5wdXQuQ29uc3VtZTsgLy8gbm90IHN1YnRyZWUsIGNvbnN1bWUgMSBub2RlIGFuZCByZXR1cm4KKyAgICBFeGl0OworICBlbmQ7CisKKyAgLy8gY3VycmVudCBub2RlIGlzIGEgc3VidHJlZSwgc2tpcCB0byBjb3JyZXNwb25kaW5nIFVQLgorICAvLyBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCisgIExldmVsIDo9IDA7CisgIFRva2VuVHlwZSA6PSBGSW5wdXQuVHJlZUFkYXB0b3IuR2V0Tm9kZVR5cGUoTG9vayk7CisgIHdoaWxlIChUb2tlblR5cGUgPD4gVFRva2VuLkVPRikgYW5kIG5vdCAoKFRva2VuVHlwZSA9IFVQKSBhbmQgKExldmVsID0gMCkpIGRvCisgIGJlZ2luCisgICAgRklucHV0LkNvbnN1bWU7CisgICAgTG9vayA6PSBGSW5wdXQuTFQoMSk7CisgICAgVG9rZW5UeXBlIDo9IEZJbnB1dC5UcmVlQWRhcHRvci5HZXROb2RlVHlwZShMb29rKTsKKyAgICBpZiAoVG9rZW5UeXBlID0gRE9XTikgdGhlbgorICAgICAgSW5jKExldmVsKQorICAgIGVsc2UKKyAgICAgIGlmIChUb2tlblR5cGUgPSBVUCkgdGhlbgorICAgICAgICBEZWMoTGV2ZWwpOworICBlbmQ7CisgIEZJbnB1dC5Db25zdW1lOyAvLyBjb25zdW1lIFVQCitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVBhcnNlci5NaXNtYXRjaChjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOyBjb25zdCBGb2xsb3c6IElCaXRTZXQpOworYmVnaW4KKyAgcmFpc2UgRU1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5DcmVhdGUoVG9rZW5UeXBlLCBGSW5wdXQpOworZW5kOworCitwcm9jZWR1cmUgVFRyZWVQYXJzZXIuUmVzZXQ7CitiZWdpbgorICBpbmhlcml0ZWQ7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworICBpZiBBc3NpZ25lZChGSW5wdXQpIHRoZW4KKyAgICBGSW5wdXQuU2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorZW5kOworCitwcm9jZWR1cmUgVFRyZWVQYXJzZXIuU2V0VHJlZU5vZGVTdHJlYW0oY29uc3QgVmFsdWU6IElUcmVlTm9kZVN0cmVhbSk7CitiZWdpbgorICBGSW5wdXQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVBhcnNlci5UcmFjZUluKGNvbnN0IFJ1bGVOYW1lOiBTdHJpbmc7IGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgVHJhY2VJbihSdWxlTmFtZSwgUnVsZUluZGV4LCBGSW5wdXQuTFQoMSkuVG9TdHJpbmcpOworZW5kOworCitwcm9jZWR1cmUgVFRyZWVQYXJzZXIuVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsKKyAgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBUcmFjZU91dChSdWxlTmFtZSwgUnVsZUluZGV4LCBGSW5wdXQuTFQoMSkuVG9TdHJpbmcpOworZW5kOworCit7IFRUcmVlUGF0dGVybkxleGVyIH0KKworY29uc3RydWN0b3IgVFRyZWVQYXR0ZXJuTGV4ZXIuQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBGU1ZhbCA6PSBUU3RyaW5nQnVpbGRlci5DcmVhdGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVBhdHRlcm5MZXhlci5Db25zdW1lOworYmVnaW4KKyAgSW5jKEZQKTsKKyAgaWYgKEZQID4gRk4pIHRoZW4KKyAgICBGQyA6PSBFT0YKKyAgZWxzZQorICAgIEZDIDo9IEludGVnZXIoRlBhdHRlcm5bRlBdKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyZWVQYXR0ZXJuTGV4ZXIuQ3JlYXRlKGNvbnN0IEFQYXR0ZXJuOiBTdHJpbmcpOworYmVnaW4KKyAgQ3JlYXRlOworICBGUGF0dGVybiA6PSBBUGF0dGVybjsKKyAgRk4gOj0gTGVuZ3RoKEZQYXR0ZXJuKTsKKyAgQ29uc3VtZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUVHJlZVBhdHRlcm5MZXhlci5EZXN0cm95OworYmVnaW4KKyAgRlNWYWwuRnJlZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitmdW5jdGlvbiBUVHJlZVBhdHRlcm5MZXhlci5OZXh0VG9rZW46IEludGVnZXI7CitiZWdpbgorICBGU1ZhbC5MZW5ndGggOj0gMDsgLy8gcmVzZXQsIGJ1dCByZXVzZSBidWZmZXIKKyAgd2hpbGUgKEZDIDw+IEVPRikgZG8KKyAgYmVnaW4KKyAgICBpZiAoRkMgPSAzMikgb3IgKEZDID0gMTApIG9yIChGQyA9IDEzKSBvciAoRkMgPSA5KSB0aGVuCisgICAgYmVnaW4KKyAgICAgIENvbnN1bWU7CisgICAgICBDb250aW51ZTsKKyAgICBlbmQ7CisKKyAgICBpZiAoKEZDID49IE9yZCgnYScpKSBhbmQgKEZDIDw9IE9yZCgneicpKSkKKyAgICAgIG9yICgoRkMgPj0gT3JkKCdBJykpIGFuZCAoRkMgPD0gT3JkKCdaJykpKQorICAgICAgb3IgKEZDID0gT3JkKCdfJykpCisgICAgdGhlbiBiZWdpbgorICAgICAgRlNWYWwuQXBwZW5kKENoYXIoRkMpKTsKKyAgICAgIENvbnN1bWU7CisgICAgICB3aGlsZSAoKEZDID49IE9yZCgnYScpKSBhbmQgKEZDIDw9IE9yZCgneicpKSkKKyAgICAgICAgb3IgKChGQyA+PSBPcmQoJ0EnKSkgYW5kIChGQyA8PSBPcmQoJ1onKSkpCisgICAgICAgIG9yICgoRkMgPj0gT3JkKCcwJykpIGFuZCAoRkMgPD0gT3JkKCc5JykpKQorICAgICAgICBvciAoRkMgPSBPcmQoJ18nKSkgZG8KKyAgICAgIGJlZ2luCisgICAgICAgIEZTVmFsLkFwcGVuZChDaGFyKEZDKSk7CisgICAgICAgIENvbnN1bWU7CisgICAgICBlbmQ7CisgICAgICBFeGl0KElEKTsKKyAgICBlbmQ7CisKKyAgICBpZiAoRkMgPSBPcmQoJygnKSkgdGhlbgorICAgIGJlZ2luCisgICAgICBDb25zdW1lOworICAgICAgRXhpdChTVEFSVCk7CisgICAgZW5kOworCisgICAgaWYgKEZDID0gT3JkKCcpJykpIHRoZW4KKyAgICBiZWdpbgorICAgICAgQ29uc3VtZTsKKyAgICAgIEV4aXQoU1RPUCk7CisgICAgZW5kOworCisgICAgaWYgKEZDID0gT3JkKCclJykpIHRoZW4KKyAgICBiZWdpbgorICAgICAgQ29uc3VtZTsKKyAgICAgIEV4aXQoUEVSQ0VOVCk7CisgICAgZW5kOworCisgICAgaWYgKEZDID0gT3JkKCc6JykpIHRoZW4KKyAgICBiZWdpbgorICAgICAgQ29uc3VtZTsKKyAgICAgIEV4aXQoQ09MT04pOworICAgIGVuZDsKKworICAgIGlmIChGQyA9IE9yZCgnLicpKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIENvbnN1bWU7CisgICAgICBFeGl0KERPVCk7CisgICAgZW5kOworCisgICAgaWYgKEZDID0gT3JkKCdbJykpIHRoZW4KKyAgICBiZWdpbgorICAgICAgLy8gZ3JhYiBbeF0gYXMgYSBzdHJpbmcsIHJldHVybmluZyB4CisgICAgICBDb25zdW1lOworICAgICAgd2hpbGUgKEZDIDw+IE9yZCgnXScpKSBkbworICAgICAgYmVnaW4KKyAgICAgICAgaWYgKEZDID0gT3JkKCdcJykpIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBDb25zdW1lOworICAgICAgICAgIGlmIChGQyA8PiBPcmQoJ10nKSkgdGhlbgorICAgICAgICAgICAgRlNWYWwuQXBwZW5kKCdcJyk7CisgICAgICAgICAgRlNWYWwuQXBwZW5kKENoYXIoRkMpKTsKKyAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICBGU1ZhbC5BcHBlbmQoQ2hhcihGQykpOworICAgICAgICBDb25zdW1lOworICAgICAgZW5kOworICAgICAgQ29uc3VtZTsKKyAgICAgIEV4aXQoQVJHKTsKKyAgICBlbmQ7CisKKyAgICBDb25zdW1lOworICAgIEZFcnJvciA6PSBUcnVlOworICAgIEV4aXQoRU9GKTsKKyAgZW5kOworICBSZXN1bHQgOj0gRU9GOworZW5kOworCitmdW5jdGlvbiBUVHJlZVBhdHRlcm5MZXhlci5TVmFsOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gRlNWYWwuVG9TdHJpbmc7CitlbmQ7CisKK3sgVFRyZWVXaXphcmQgfQorCitmdW5jdGlvbiBUVHJlZVdpemFyZC5Db21wdXRlVG9rZW5UeXBlcygKKyAgY29uc3QgVG9rZW5OYW1lczogVFN0cmluZ0FycmF5KTogSURpY3Rpb25hcnk8U3RyaW5nLCBJbnRlZ2VyPjsKK3ZhcgorICBUb2tlblR5cGU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gVERpY3Rpb25hcnk8U3RyaW5nLCBJbnRlZ2VyPi5DcmVhdGU7CisgIGlmIChMZW5ndGgoVG9rZW5OYW1lcykgPiAwKXRoZW4KKyAgYmVnaW4KKyAgICBmb3IgVG9rZW5UeXBlIDo9IFRUb2tlbi5NSU5fVE9LRU5fVFlQRSB0byBMZW5ndGgoVG9rZW5OYW1lcykgLSAxIGRvCisgICAgICBSZXN1bHQuQWRkKFRva2VuTmFtZXNbVG9rZW5UeXBlXSwgVG9rZW5UeXBlKTsKKyAgZW5kOworZW5kOworCitjb25zdHJ1Y3RvciBUVHJlZVdpemFyZC5DcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGQWRhcHRvciA6PSBBQWRhcHRvcjsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyZWVXaXphcmQuQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIGNvbnN0IEFUb2tlbk5hbWVUb1R5cGVNYXA6IElEaWN0aW9uYXJ5PFN0cmluZywgSW50ZWdlcj4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkFkYXB0b3IgOj0gQUFkYXB0b3I7CisgIEZUb2tlbk5hbWVUb1R5cGVNYXAgOj0gQVRva2VuTmFtZVRvVHlwZU1hcDsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyZWVXaXphcmQuQ3JlYXRlKGNvbnN0IEFBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgIGNvbnN0IFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGQWRhcHRvciA6PSBBQWRhcHRvcjsKKyAgRlRva2VuTmFtZVRvVHlwZU1hcCA6PSBDb21wdXRlVG9rZW5UeXBlcyhUb2tlbk5hbWVzKTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVXaXphcmQuQ3JlYXRlVHJlZU9yTm9kZShjb25zdCBQYXR0ZXJuOiBTdHJpbmcpOiBJQU5UTFJJbnRlcmZhY2U7Cit2YXIKKyAgVG9rZW5pemVyOiBJVHJlZVBhdHRlcm5MZXhlcjsKKyAgUGFyc2VyOiBJVHJlZVBhdHRlcm5QYXJzZXI7CitiZWdpbgorICBUb2tlbml6ZXIgOj0gVFRyZWVQYXR0ZXJuTGV4ZXIuQ3JlYXRlKFBhdHRlcm4pOworICBQYXJzZXIgOj0gVFRyZWVQYXR0ZXJuUGFyc2VyLkNyZWF0ZShUb2tlbml6ZXIsIFNlbGYsIEZBZGFwdG9yKTsKKyAgUmVzdWx0IDo9IFBhcnNlci5QYXR0ZXJuOworZW5kOworCitmdW5jdGlvbiBUVHJlZVdpemFyZC5FcXVhbHMoY29uc3QgVDEsIFQyOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IEFkYXB0b3I6IElUcmVlQWRhcHRvcik6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gX0VxdWFscyhUMSwgVDIsIEFkYXB0b3IpOworZW5kOworCitmdW5jdGlvbiBUVHJlZVdpemFyZC5FcXVhbHMoY29uc3QgVDEsIFQyOiBJQU5UTFJJbnRlcmZhY2UpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IF9FcXVhbHMoVDEsIFQyLCBGQWRhcHRvcik7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLkZpbmQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBQYXR0ZXJuOiBTdHJpbmcpOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OwordmFyCisgIFRva2VuaXplcjogSVRyZWVQYXR0ZXJuTGV4ZXI7CisgIFBhcnNlcjogSVRyZWVQYXR0ZXJuUGFyc2VyOworICBUcmVlUGF0dGVybjogSVRyZWVQYXR0ZXJuOworICBSb290VG9rZW5UeXBlOiBJbnRlZ2VyOworICBWaXNpdG9yOiBJQ29udGV4dFZpc2l0b3I7CitiZWdpbgorICBSZXN1bHQgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisKKyAgLy8gQ3JlYXRlIGEgVHJlZVBhdHRlcm4gZnJvbSB0aGUgcGF0dGVybgorICBUb2tlbml6ZXIgOj0gVFRyZWVQYXR0ZXJuTGV4ZXIuQ3JlYXRlKFBhdHRlcm4pOworICBQYXJzZXIgOj0gVFRyZWVQYXR0ZXJuUGFyc2VyLkNyZWF0ZShUb2tlbml6ZXIsIFNlbGYsIFRUcmVlUGF0dGVyblRyZWVBZGFwdG9yLkNyZWF0ZSk7CisgIFRyZWVQYXR0ZXJuIDo9IFBhcnNlci5QYXR0ZXJuIGFzIElUcmVlUGF0dGVybjsKKworICAvLyBkb24ndCBhbGxvdyBpbnZhbGlkIHBhdHRlcm5zCisgIGlmIChUcmVlUGF0dGVybiA9IG5pbCkgb3IgKFRyZWVQYXR0ZXJuLklzTmlsKQorICAgIG9yIFN1cHBvcnRzKFRyZWVQYXR0ZXJuLCBJV2lsZGNhcmRUcmVlUGF0dGVybikKKyAgdGhlbgorICAgIEV4aXQobmlsKTsKKworICBSb290VG9rZW5UeXBlIDo9IFRyZWVQYXR0ZXJuLlRva2VuVHlwZTsKKyAgVmlzaXRvciA6PSBUUGF0dGVybk1hdGNoaW5nQ29udGV4dFZpc2l0b3IuQ3JlYXRlKFNlbGYsIFRyZWVQYXR0ZXJuLCBSZXN1bHQpOworICBWaXNpdChULCBSb290VG9rZW5UeXBlLCBWaXNpdG9yKTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVXaXphcmQuRmluZChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcik6IElMaXN0PElBTlRMUkludGVyZmFjZT47CitiZWdpbgorICBSZXN1bHQgOj0gVExpc3Q8SUFOVExSSW50ZXJmYWNlPi5DcmVhdGU7CisgIFZpc2l0KFQsIFRva2VuVHlwZSwgVFJlY29yZEFsbEVsZW1lbnRzVmlzaXRvci5DcmVhdGUoUmVzdWx0KSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLkZpbmRGaXJzdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLkZpbmRGaXJzdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IFBhdHRlcm46IFN0cmluZyk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLkdldFRva2VuVHlwZShjb25zdCBUb2tlbk5hbWU6IFN0cmluZyk6IEludGVnZXI7CitiZWdpbgorICBpZiAoRlRva2VuTmFtZVRvVHlwZU1hcCA9IG5pbCkgdGhlbgorICAgIEV4aXQoVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRSk7CisgIGlmIChub3QgRlRva2VuTmFtZVRvVHlwZU1hcC5UcnlHZXRWYWx1ZShUb2tlbk5hbWUsIFJlc3VsdCkpIHRoZW4KKyAgICBSZXN1bHQgOj0gVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVXaXphcmQuSW5kZXgoCisgIGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk6IElEaWN0aW9uYXJ5PEludGVnZXIsIElMaXN0PElBTlRMUkludGVyZmFjZT4+OworYmVnaW4KKyAgUmVzdWx0IDo9IFREaWN0aW9uYXJ5PEludGVnZXIsIElMaXN0PElBTlRMUkludGVyZmFjZT4+LkNyZWF0ZTsKKyAgX0luZGV4KFQsIFJlc3VsdCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLlBhcnNlKGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZTsKKyAgY29uc3QgUGF0dGVybjogU3RyaW5nKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBQYXJzZShULCBQYXR0ZXJuLCBuaWwpOworZW5kOworCitmdW5jdGlvbiBUVHJlZVdpemFyZC5QYXJzZShjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFBhdHRlcm46IFN0cmluZzsKKyAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOiBCb29sZWFuOwordmFyCisgIFRva2VuaXplcjogSVRyZWVQYXR0ZXJuTGV4ZXI7CisgIFBhcnNlcjogSVRyZWVQYXR0ZXJuUGFyc2VyOworICBUcmVlUGF0dGVybjogSVRyZWVQYXR0ZXJuOworYmVnaW4KKyAgVG9rZW5pemVyIDo9IFRUcmVlUGF0dGVybkxleGVyLkNyZWF0ZShQYXR0ZXJuKTsKKyAgUGFyc2VyIDo9IFRUcmVlUGF0dGVyblBhcnNlci5DcmVhdGUoVG9rZW5pemVyLCBTZWxmLCBUVHJlZVBhdHRlcm5UcmVlQWRhcHRvci5DcmVhdGUpOworICBUcmVlUGF0dGVybiA6PSBQYXJzZXIuUGF0dGVybiBhcyBJVHJlZVBhdHRlcm47CisgIFJlc3VsdCA6PSBfUGFyc2UoVCwgVHJlZVBhdHRlcm4sIExhYmVscyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVdpemFyZC5WaXNpdChjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IFBhdHRlcm46IFN0cmluZzsKKyAgY29uc3QgVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yKTsKK3ZhcgorICBUb2tlbml6ZXI6IElUcmVlUGF0dGVybkxleGVyOworICBQYXJzZXI6IElUcmVlUGF0dGVyblBhcnNlcjsKKyAgVHJlZVBhdHRlcm46IElUcmVlUGF0dGVybjsKKyAgUm9vdFRva2VuVHlwZTogSW50ZWdlcjsKKyAgUGF0dGVyblZpc2l0b3I6IElDb250ZXh0VmlzaXRvcjsKK2JlZ2luCisgIC8vIENyZWF0ZSBhIFRyZWVQYXR0ZXJuIGZyb20gdGhlIHBhdHRlcm4KKyAgVG9rZW5pemVyIDo9IFRUcmVlUGF0dGVybkxleGVyLkNyZWF0ZShQYXR0ZXJuKTsKKyAgUGFyc2VyIDo9IFRUcmVlUGF0dGVyblBhcnNlci5DcmVhdGUoVG9rZW5pemVyLCBTZWxmLCBUVHJlZVBhdHRlcm5UcmVlQWRhcHRvci5DcmVhdGUpOworICBUcmVlUGF0dGVybiA6PSBQYXJzZXIuUGF0dGVybiBhcyBJVHJlZVBhdHRlcm47CisgIGlmIChUcmVlUGF0dGVybiA9IG5pbCkgb3IgKFRyZWVQYXR0ZXJuLklzTmlsKQorICAgIG9yIFN1cHBvcnRzKFRyZWVQYXR0ZXJuLCBJV2lsZGNhcmRUcmVlUGF0dGVybikKKyAgdGhlbgorICAgIEV4aXQ7CisgIFJvb3RUb2tlblR5cGUgOj0gVHJlZVBhdHRlcm4uVG9rZW5UeXBlOworICBQYXR0ZXJuVmlzaXRvciA6PSBUSW52b2tlVmlzaXRvck9uUGF0dGVybk1hdGNoQ29udGV4dFZpc2l0b3IuQ3JlYXRlKFNlbGYsIFRyZWVQYXR0ZXJuLCBWaXNpdG9yKTsKKyAgVmlzaXQoVCwgUm9vdFRva2VuVHlwZSwgUGF0dGVyblZpc2l0b3IpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJlZVdpemFyZC5fRXF1YWxzKGNvbnN0IFQxLCBUMjogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBBZGFwdG9yOiBJVHJlZUFkYXB0b3IpOiBCb29sZWFuOwordmFyCisgIEksIE4xLCBOMjogSW50ZWdlcjsKKyAgQ2hpbGQxLCBDaGlsZDI6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIC8vIG1ha2Ugc3VyZSBib3RoIGFyZSBub24tbnVsbAorICBpZiAoVDEgPSBuaWwpIG9yIChUMiA9IG5pbCkgdGhlbgorICAgIEV4aXQoRmFsc2UpOworCisgIC8vIGNoZWNrIHJvb3RzCisgIGlmIChBZGFwdG9yLkdldE5vZGVUeXBlKFQxKSA8PiBBZGFwdG9yLkdldE5vZGVUeXBlKFQyKSkgdGhlbgorICAgIEV4aXQoRmFsc2UpOworICBpZiAoQWRhcHRvci5HZXROb2RlVGV4dChUMSkgPD4gQWRhcHRvci5HZXROb2RlVGV4dChUMikpIHRoZW4KKyAgICBFeGl0KEZhbHNlKTsKKworICAvLyBjaGVjayBjaGlsZHJlbgorICBOMSA6PSBBZGFwdG9yLkdldENoaWxkQ291bnQoVDEpOworICBOMiA6PSBBZGFwdG9yLkdldENoaWxkQ291bnQoVDIpOworICBpZiAoTjEgPD4gTjIpIHRoZW4KKyAgICBFeGl0KEZhbHNlKTsKKyAgZm9yIEkgOj0gMCB0byBOMSAtIDEgZG8KKyAgYmVnaW4KKyAgICBDaGlsZDEgOj0gQWRhcHRvci5HZXRDaGlsZChUMSwgSSk7CisgICAgQ2hpbGQyIDo9IEFkYXB0b3IuR2V0Q2hpbGQoVDIsIEkpOworICAgIGlmIChub3QgX0VxdWFscyhDaGlsZDEsIENoaWxkMiwgQWRhcHRvcikpIHRoZW4KKyAgICAgIEV4aXQoRmFsc2UpOworICBlbmQ7CisKKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVdpemFyZC5fSW5kZXgoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOworICBjb25zdCBNOiBJRGljdGlvbmFyeTxJbnRlZ2VyLCBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+Pik7Cit2YXIKKyAgSSwgTiwgVFR5cGU6IEludGVnZXI7CisgIEVsZW1lbnRzOiBJTGlzdDxJQU5UTFJJbnRlcmZhY2U+OworYmVnaW4KKyAgaWYgKFQgPSBuaWwpIHRoZW4KKyAgICBFeGl0OworICBUVHlwZSA6PSBGQWRhcHRvci5HZXROb2RlVHlwZShUKTsKKyAgaWYgKG5vdCBNLlRyeUdldFZhbHVlKFRUeXBlLCBFbGVtZW50cykpIHRoZW4KKyAgICBFbGVtZW50cyA6PSBuaWw7CisgIGlmIChFbGVtZW50cyA9IG5pbCkgdGhlbgorICBiZWdpbgorICAgIEVsZW1lbnRzIDo9IFRMaXN0PElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworICAgIE0uQWRkKFRUeXBlLCBFbGVtZW50cyk7CisgIGVuZDsKKyAgRWxlbWVudHMuQWRkKFQpOworICBOIDo9IEZBZGFwdG9yLkdldENoaWxkQ291bnQoVCk7CisgIGZvciBJIDo9IDAgdG8gTiAtIDEgZG8KKyAgICBfSW5kZXgoRkFkYXB0b3IuR2V0Q2hpbGQoVCwgSSksIE0pOworZW5kOworCitmdW5jdGlvbiBUVHJlZVdpemFyZC5fUGFyc2UoY29uc3QgVDE6IElBTlRMUkludGVyZmFjZTsgY29uc3QgVDI6IElUcmVlUGF0dGVybjsKKyAgY29uc3QgTGFiZWxzOiBJRGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4pOiBCb29sZWFuOwordmFyCisgIEksIE4xLCBOMjogSW50ZWdlcjsKKyAgQ2hpbGQxOiBJQU5UTFJJbnRlcmZhY2U7CisgIENoaWxkMjogSVRyZWVQYXR0ZXJuOworYmVnaW4KKyAgLy8gbWFrZSBzdXJlIGJvdGggYXJlIG5vbi1udWxsCisgIGlmIChUMSA9IG5pbCkgb3IgKFQyID0gbmlsKSB0aGVuCisgICAgRXhpdChGYWxzZSk7CisKKyAgLy8gY2hlY2sgcm9vdHMgKHdpbGRjYXJkIG1hdGNoZXMgYW55dGhpbmcpCisgIGlmIChub3QgU3VwcG9ydHMoVDIsIElXaWxkY2FyZFRyZWVQYXR0ZXJuKSkgdGhlbgorICBiZWdpbgorICAgIGlmIChGQWRhcHRvci5HZXROb2RlVHlwZShUMSkgPD4gVDIuVG9rZW5UeXBlKSB0aGVuCisgICAgICBFeGl0KEZhbHNlKTsKKyAgICBpZiAoVDIuSGFzVGV4dEFyZykgYW5kIChGQWRhcHRvci5HZXROb2RlVGV4dChUMSkgPD4gVDIuVGV4dCkgdGhlbgorICAgICAgRXhpdChGYWxzZSk7CisgIGVuZDsKKworICBpZiAoVDIuVG9rZW5MYWJlbCA8PiAnJykgYW5kIEFzc2lnbmVkKExhYmVscykgdGhlbgorICAgIC8vIG1hcCBsYWJlbCBpbiBwYXR0ZXJuIHRvIG5vZGUgaW4gdDEKKyAgICBMYWJlbHMuQWRkT3JTZXRWYWx1ZShUMi5Ub2tlbkxhYmVsLCBUMSk7CisKKyAgLy8gY2hlY2sgY2hpbGRyZW4KKyAgTjEgOj0gRkFkYXB0b3IuR2V0Q2hpbGRDb3VudChUMSk7CisgIE4yIDo9IFQyLkNoaWxkQ291bnQ7CisgIGlmIChOMSA8PiBOMikgdGhlbgorICAgIEV4aXQoRmFsc2UpOworCisgIGZvciBJIDo9IDAgdG8gTjEgLSAxIGRvCisgIGJlZ2luCisgICAgQ2hpbGQxIDo9IEZBZGFwdG9yLkdldENoaWxkKFQxLCBJKTsKKyAgICBDaGlsZDIgOj0gVDIuR2V0Q2hpbGQoSSkgYXMgSVRyZWVQYXR0ZXJuOworICAgIGlmIChub3QgX1BhcnNlKENoaWxkMSwgQ2hpbGQyLCBMYWJlbHMpKSB0aGVuCisgICAgICBFeGl0KEZhbHNlKTsKKyAgZW5kOworCisgIFJlc3VsdCA6PSBUcnVlOworZW5kOworCitwcm9jZWR1cmUgVFRyZWVXaXphcmQuX1Zpc2l0KGNvbnN0IFQsIFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBDaGlsZEluZGV4LAorICBUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcik7Cit2YXIKKyAgSSwgTjogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChUID0gbmlsKSB0aGVuCisgICAgRXhpdDsKKyAgaWYgKEZBZGFwdG9yLkdldE5vZGVUeXBlKFQpID0gVG9rZW5UeXBlKSB0aGVuCisgICAgVmlzaXRvci5WaXNpdChULCBQYXJlbnQsIENoaWxkSW5kZXgsIG5pbCk7CisKKyAgTiA6PSBGQWRhcHRvci5HZXRDaGlsZENvdW50KFQpOworICBmb3IgSSA6PSAwIHRvIE4gLSAxIGRvCisgICAgX1Zpc2l0KEZBZGFwdG9yLkdldENoaWxkKFQsIEkpLCBULCBJLCBUb2tlblR5cGUsIFZpc2l0b3IpOworZW5kOworCitwcm9jZWR1cmUgVFRyZWVXaXphcmQuVmlzaXQoY29uc3QgVDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBUb2tlblR5cGU6IEludGVnZXI7CisgIGNvbnN0IFZpc2l0b3I6IElDb250ZXh0VmlzaXRvcik7CitiZWdpbgorICBfVmlzaXQoVCwgbmlsLCAwLCBUb2tlblR5cGUsIFZpc2l0b3IpOworZW5kOworCitjb25zdHJ1Y3RvciBUVHJlZVdpemFyZC5DcmVhdGUoY29uc3QgVG9rZW5OYW1lczogVFN0cmluZ0FycmF5KTsKK2JlZ2luCisgIENyZWF0ZShuaWwsIFRva2VuTmFtZXMpOworZW5kOworCit7IFRUcmVlUGF0dGVyblBhcnNlciB9CisKK2NvbnN0cnVjdG9yIFRUcmVlUGF0dGVyblBhcnNlci5DcmVhdGUoY29uc3QgQVRva2VuaXplcjogSVRyZWVQYXR0ZXJuTGV4ZXI7CisgIGNvbnN0IEFXaXphcmQ6IElUcmVlV2l6YXJkOyBjb25zdCBBQWRhcHRvcjogSVRyZWVBZGFwdG9yKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUb2tlbml6ZXIgOj0gQVRva2VuaXplcjsKKyAgRldpemFyZCA6PSBBV2l6YXJkOworICBGQWRhcHRvciA6PSBBQWRhcHRvcjsKKyAgRlRva2VuVHlwZSA6PSBGVG9rZW5pemVyLk5leHRUb2tlbjsgLy8ga2lja3N0YXJ0CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlUGF0dGVyblBhcnNlci5QYXJzZU5vZGU6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBMYmwsIFRva2VuTmFtZSwgVGV4dCwgQXJnOiBTdHJpbmc7CisgIFdpbGRjYXJkUGF5bG9hZDogSVRva2VuOworICBOb2RlOiBUVHJlZVdpemFyZC5JVHJlZVBhdHRlcm47CisgIFRyZWVOb2RlVHlwZTogSW50ZWdlcjsKK2JlZ2luCisgIC8vICIlbGFiZWw6IiBwcmVmaXgKKyAgTGJsIDo9ICcnOworICBpZiAoRlRva2VuVHlwZSA9IFRUcmVlUGF0dGVybkxleGVyLlBFUkNFTlQpIHRoZW4KKyAgYmVnaW4KKyAgICBGVG9rZW5UeXBlIDo9IEZUb2tlbml6ZXIuTmV4dFRva2VuOworICAgIGlmIChGVG9rZW5UeXBlIDw+IFRUcmVlUGF0dGVybkxleGVyLklEKSB0aGVuCisgICAgICBFeGl0KG5pbCk7CisgICAgTGJsIDo9IEZUb2tlbml6ZXIuU1ZhbDsKKyAgICBGVG9rZW5UeXBlIDo9IEZUb2tlbml6ZXIuTmV4dFRva2VuOworICAgIGlmIChGVG9rZW5UeXBlIDw+IFRUcmVlUGF0dGVybkxleGVyLkNPTE9OKSB0aGVuCisgICAgICBFeGl0KG5pbCk7CisgICAgRlRva2VuVHlwZSA6PSBGVG9rZW5pemVyLk5leHRUb2tlbjsgLy8gbW92ZSB0byBJRCBmb2xsb3dpbmcgY29sb24KKyAgZW5kOworCisgIC8vIFdpbGRjYXJkPworICBpZiAoRlRva2VuVHlwZSA9IFRUcmVlUGF0dGVybkxleGVyLkRPVCkgdGhlbgorICBiZWdpbgorICAgIEZUb2tlblR5cGUgOj0gRlRva2VuaXplci5OZXh0VG9rZW47CisgICAgV2lsZGNhcmRQYXlsb2FkIDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoMCwgJy4nKTsKKyAgICBOb2RlIDo9IFRUcmVlV2l6YXJkLlRXaWxkY2FyZFRyZWVQYXR0ZXJuLkNyZWF0ZShXaWxkY2FyZFBheWxvYWQpOworICAgIGlmIChMYmwgPD4gJycpIHRoZW4KKyAgICAgIE5vZGUuVG9rZW5MYWJlbCA6PSBMYmw7CisgICAgRXhpdChOb2RlKTsKKyAgZW5kOworCisgIC8vICJJRCIgb3IgIklEW2FyZ10iCisgIGlmIChGVG9rZW5UeXBlIDw+IFRUcmVlUGF0dGVybkxleGVyLklEKSB0aGVuCisgICAgRXhpdChuaWwpOworICBUb2tlbk5hbWUgOj0gRlRva2VuaXplci5TVmFsOworICBGVG9rZW5UeXBlIDo9IEZUb2tlbml6ZXIuTmV4dFRva2VuOworICBpZiAoVG9rZW5OYW1lID0gJ25pbCcpIHRoZW4KKyAgICBFeGl0KEZBZGFwdG9yLkdldE5pbE5vZGUpOworICBUZXh0IDo9IFRva2VuTmFtZTsKKworICAvLyBjaGVjayBmb3IgYXJnCisgIEFyZyA6PSAnJzsKKyAgaWYgKEZUb2tlblR5cGUgPSBUVHJlZVBhdHRlcm5MZXhlci5BUkcpIHRoZW4KKyAgYmVnaW4KKyAgICBBcmcgOj0gRlRva2VuaXplci5TVmFsOworICAgIFRleHQgOj0gQXJnOworICAgIEZUb2tlblR5cGUgOj0gRlRva2VuaXplci5OZXh0VG9rZW47CisgIGVuZDsKKworICAvLyBjcmVhdGUgbm9kZQorICBUcmVlTm9kZVR5cGUgOj0gRldpemFyZC5HZXRUb2tlblR5cGUoVG9rZW5OYW1lKTsKKyAgaWYgKFRyZWVOb2RlVHlwZSA9IFRUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUpIHRoZW4KKyAgICBFeGl0KG5pbCk7CisKKyAgUmVzdWx0IDo9IEZBZGFwdG9yLkNyZWF0ZU5vZGUoVHJlZU5vZGVUeXBlLCBUZXh0KTsKKyAgaWYgKExibCA8PiAnJykgYW5kIFN1cHBvcnRzKFJlc3VsdCwgVFRyZWVXaXphcmQuSVRyZWVQYXR0ZXJuLCBOb2RlKSB0aGVuCisgICAgTm9kZS5Ub2tlbkxhYmVsIDo9IExibDsKKyAgaWYgKEFyZyA8PiAnJykgYW5kIFN1cHBvcnRzKFJlc3VsdCwgVFRyZWVXaXphcmQuSVRyZWVQYXR0ZXJuLCBOb2RlKSB0aGVuCisgICAgTm9kZS5IYXNUZXh0QXJnIDo9IFRydWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlUGF0dGVyblBhcnNlci5QYXJzZVRyZWU6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBTdWJ0cmVlLCBDaGlsZDogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgaWYgKEZUb2tlblR5cGUgPD4gVFRyZWVQYXR0ZXJuTGV4ZXIuU1RBUlQpIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdubyBCRUdJTicpOworICAgIEV4aXQobmlsKTsKKyAgZW5kOworCisgIEZUb2tlblR5cGUgOj0gRlRva2VuaXplci5OZXh0VG9rZW47CisgIFJlc3VsdCA6PSBQYXJzZU5vZGU7CisgIGlmIChSZXN1bHQgPSBuaWwpIHRoZW4KKyAgICBFeGl0OworCisgIHdoaWxlIChGVG9rZW5UeXBlIGluIFtUVHJlZVBhdHRlcm5MZXhlci5TVEFSVCwgVFRyZWVQYXR0ZXJuTGV4ZXIuSUQsCisgICAgVFRyZWVQYXR0ZXJuTGV4ZXIuUEVSQ0VOVCwgVFRyZWVQYXR0ZXJuTGV4ZXIuRE9UXSkgZG8KKyAgYmVnaW4KKyAgICBpZiAoRlRva2VuVHlwZSA9IFRUcmVlUGF0dGVybkxleGVyLlNUQVJUKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIFN1YnRyZWUgOj0gUGFyc2VUcmVlOworICAgICAgRkFkYXB0b3IuQWRkQ2hpbGQoUmVzdWx0LCBTdWJ0cmVlKTsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgYmVnaW4KKyAgICAgIENoaWxkIDo9IFBhcnNlTm9kZTsKKyAgICAgIGlmIChDaGlsZCA9IG5pbCkgdGhlbgorICAgICAgICBFeGl0KG5pbCk7CisgICAgICBGQWRhcHRvci5BZGRDaGlsZChSZXN1bHQsIENoaWxkKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBpZiAoRlRva2VuVHlwZSA8PiBUVHJlZVBhdHRlcm5MZXhlci5TVE9QKSB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignbm8gRU5EJyk7CisgICAgRXhpdChuaWwpOworICBlbmQ7CisKKyAgRlRva2VuVHlwZSA6PSBGVG9rZW5pemVyLk5leHRUb2tlbjsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVQYXR0ZXJuUGFyc2VyLlBhdHRlcm46IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBOb2RlOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBpZiAoRlRva2VuVHlwZSA9IFRUcmVlUGF0dGVybkxleGVyLlNUQVJUKSB0aGVuCisgICAgRXhpdChQYXJzZVRyZWUpOworCisgIGlmIChGVG9rZW5UeXBlID0gVFRyZWVQYXR0ZXJuTGV4ZXIuSUQpIHRoZW4KKyAgYmVnaW4KKyAgICBOb2RlIDo9IFBhcnNlTm9kZTsKKyAgICBpZiAoRlRva2VuVHlwZSA9IFRUcmVlUGF0dGVybkxleGVyLkVPRikgdGhlbgorICAgICAgUmVzdWx0IDo9IE5vZGUKKyAgICBlbHNlCisgICAgICBSZXN1bHQgOj0gbmlsOyAvLyBleHRyYSBqdW5rIG9uIGVuZAorICBlbmQKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK3sgVFRyZWVXaXphcmQuVFZpc2l0b3IgfQorCitwcm9jZWR1cmUgVFRyZWVXaXphcmQuVFZpc2l0b3IuVmlzaXQoY29uc3QgVCwgUGFyZW50OiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IENoaWxkSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IExhYmVsczogSURpY3Rpb25hcnk8U3RyaW5nLCBJQU5UTFJJbnRlcmZhY2U+KTsKK2JlZ2luCisgIFZpc2l0KFQpOworZW5kOworCit7IFRUcmVlV2l6YXJkLlRSZWNvcmRBbGxFbGVtZW50c1Zpc2l0b3IgfQorCitjb25zdHJ1Y3RvciBUVHJlZVdpemFyZC5UUmVjb3JkQWxsRWxlbWVudHNWaXNpdG9yLkNyZWF0ZSgKKyAgY29uc3QgQUxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkxpc3QgOj0gQUxpc3Q7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVdpemFyZC5UUmVjb3JkQWxsRWxlbWVudHNWaXNpdG9yLlZpc2l0KGNvbnN0IFQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBGTGlzdC5BZGQoVCk7CitlbmQ7CisKK3sgVFRyZWVXaXphcmQuVFBhdHRlcm5NYXRjaGluZ0NvbnRleHRWaXNpdG9yIH0KKworY29uc3RydWN0b3IgVFRyZWVXaXphcmQuVFBhdHRlcm5NYXRjaGluZ0NvbnRleHRWaXNpdG9yLkNyZWF0ZSgKKyAgY29uc3QgQU93bmVyOiBUVHJlZVdpemFyZDsgY29uc3QgQVBhdHRlcm46IElUcmVlUGF0dGVybjsKKyAgY29uc3QgQUxpc3Q6IElMaXN0PElBTlRMUkludGVyZmFjZT4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRk93bmVyIDo9IEFPd25lcjsKKyAgRlBhdHRlcm4gOj0gQVBhdHRlcm47CisgIEZMaXN0IDo9IEFMaXN0OworZW5kOworCitwcm9jZWR1cmUgVFRyZWVXaXphcmQuVFBhdHRlcm5NYXRjaGluZ0NvbnRleHRWaXNpdG9yLlZpc2l0KGNvbnN0IFQsCisgIFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBDaGlsZEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPik7CitiZWdpbgorICBpZiAoRk93bmVyLl9QYXJzZShULCBGUGF0dGVybiwgbmlsKSkgdGhlbgorICAgIEZMaXN0LkFkZChUKTsKK2VuZDsKKworeyBUVHJlZVdpemFyZC5USW52b2tlVmlzaXRvck9uUGF0dGVybk1hdGNoQ29udGV4dFZpc2l0b3IgfQorCitjb25zdHJ1Y3RvciBUVHJlZVdpemFyZC5USW52b2tlVmlzaXRvck9uUGF0dGVybk1hdGNoQ29udGV4dFZpc2l0b3IuQ3JlYXRlKAorICBjb25zdCBBT3duZXI6IFRUcmVlV2l6YXJkOyBjb25zdCBBUGF0dGVybjogSVRyZWVQYXR0ZXJuOworICBjb25zdCBBVmlzaXRvcjogSUNvbnRleHRWaXNpdG9yKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZPd25lciA6PSBBT3duZXI7CisgIEZQYXR0ZXJuIDo9IEFQYXR0ZXJuOworICBGVmlzaXRvciA6PSBBVmlzaXRvcjsKKyAgRkxhYmVscyA6PSBURGljdGlvbmFyeTxTdHJpbmcsIElBTlRMUkludGVyZmFjZT4uQ3JlYXRlOworZW5kOworCitwcm9jZWR1cmUgVFRyZWVXaXphcmQuVEludm9rZVZpc2l0b3JPblBhdHRlcm5NYXRjaENvbnRleHRWaXNpdG9yLlZpc2l0KGNvbnN0IFQsCisgIFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBDaGlsZEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBVbnVzZWRMYWJlbHM6IElEaWN0aW9uYXJ5PFN0cmluZywgSUFOVExSSW50ZXJmYWNlPik7CitiZWdpbgorICAvLyB0aGUgdW51c2VkbGFiZWxzIGFyZyBpcyBudWxsIGFzIHZpc2l0IG9uIHRva2VuIHR5cGUgZG9lc24ndCBzZXQuCisgIEZMYWJlbHMuQ2xlYXI7CisgIGlmIChGT3duZXIuX1BhcnNlKFQsIEZQYXR0ZXJuLCBGTGFiZWxzKSkgdGhlbgorICAgIEZWaXNpdG9yLlZpc2l0KFQsIFBhcmVudCwgQ2hpbGRJbmRleCwgRkxhYmVscyk7CitlbmQ7CisKK3sgVFRyZWVXaXphcmQuVFRyZWVQYXR0ZXJuIH0KKworZnVuY3Rpb24gVFRyZWVXaXphcmQuVFRyZWVQYXR0ZXJuLkdldEhhc1RleHRBcmc6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkhhc1RleHRBcmc7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLlRUcmVlUGF0dGVybi5HZXRUb2tlbkxhYmVsOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gRkxhYmVsOworZW5kOworCitwcm9jZWR1cmUgVFRyZWVXaXphcmQuVFRyZWVQYXR0ZXJuLlNldEhhc1RleHRBcmcoY29uc3QgVmFsdWU6IEJvb2xlYW4pOworYmVnaW4KKyAgRkhhc1RleHRBcmcgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVdpemFyZC5UVHJlZVBhdHRlcm4uU2V0VG9rZW5MYWJlbChjb25zdCBWYWx1ZTogU3RyaW5nKTsKK2JlZ2luCisgIEZMYWJlbCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFRyZWVXaXphcmQuVFRyZWVQYXR0ZXJuLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBpZiAoRkxhYmVsIDw+ICcnKSB0aGVuCisgICAgUmVzdWx0IDo9ICclJyArIEZMYWJlbCArICc6JyArIGluaGVyaXRlZCBUb1N0cmluZworICBlbHNlCisgICAgUmVzdWx0IDo9IGluaGVyaXRlZCBUb1N0cmluZzsKK2VuZDsKKworeyBUVHJlZVdpemFyZC5UVHJlZVBhdHRlcm5UcmVlQWRhcHRvciB9CisKK2Z1bmN0aW9uIFRUcmVlV2l6YXJkLlRUcmVlUGF0dGVyblRyZWVBZGFwdG9yLkNyZWF0ZU5vZGUoCisgIGNvbnN0IFBheWxvYWQ6IElUb2tlbik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBUVHJlZVBhdHRlcm4uQ3JlYXRlKFBheWxvYWQpOworZW5kOworCit7IFRUcmVlUnVsZVJldHVyblNjb3BlIH0KKworZnVuY3Rpb24gVFRyZWVSdWxlUmV0dXJuU2NvcGUuR2V0U3RhcnQ6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RhcnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJlZVJ1bGVSZXR1cm5TY29wZS5TZXRTdGFydChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIEZTdGFydCA6PSBWYWx1ZTsKK2VuZDsKKworeyBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtIH0KKworcHJvY2VkdXJlIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uQWRkTG9va2FoZWFkKGNvbnN0IE5vZGU6IElBTlRMUkludGVyZmFjZSk7Cit2YXIKKyAgQmlnZ2VyOiBUQU5UTFJJbnRlcmZhY2VBcnJheTsKKyAgSSwgUmVtYWluZGVySGVhZFRvRW5kOiBJbnRlZ2VyOworYmVnaW4KKyAgRkxvb2thaGVhZFtGVGFpbF0gOj0gTm9kZTsKKyAgRlRhaWwgOj0gKEZUYWlsICsgMSkgbW9kIExlbmd0aChGTG9va2FoZWFkKTsKKyAgaWYgKEZUYWlsID0gRkhlYWQpIHRoZW4KKyAgYmVnaW4KKyAgICAvLyBidWZmZXIgb3ZlcmZsb3c6IHRhaWwgY2F1Z2h0IHVwIHdpdGggaGVhZAorICAgIC8vIGFsbG9jYXRlIGEgYnVmZmVyIDJ4IGFzIGJpZworICAgIFNldExlbmd0aChCaWdnZXIsMiAqIExlbmd0aChGTG9va2FoZWFkKSk7CisgICAgLy8gY29weSBoZWFkIHRvIGVuZCBvZiBidWZmZXIgdG8gYmVnaW5uaW5nIG9mIGJpZ2dlciBidWZmZXIKKyAgICBSZW1haW5kZXJIZWFkVG9FbmQgOj0gTGVuZ3RoKEZMb29rYWhlYWQpIC0gRkhlYWQ7CisgICAgZm9yIEkgOj0gMCB0byBSZW1haW5kZXJIZWFkVG9FbmQgLSAxIGRvCisgICAgICBCaWdnZXJbSV0gOj0gRkxvb2thaGVhZFtGSGVhZCArIEldOworICAgIC8vIGNvcHkgMC4udGFpbCB0byBhZnRlciB0aGF0CisgICAgZm9yIEkgOj0gMCB0byBGVGFpbCAtIDEgZG8KKyAgICAgIEJpZ2dlcltSZW1haW5kZXJIZWFkVG9FbmQgKyBJXSA6PSBGTG9va2FoZWFkW0ldOworICAgIEZMb29rYWhlYWQgOj0gQmlnZ2VyOyAvLyByZXNldCB0byBiaWdnZXIgYnVmZmVyCisgICAgRkhlYWQgOj0gMDsKKyAgICBJbmMoRlRhaWwsUmVtYWluZGVySGVhZFRvRW5kKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5BZGROYXZpZ2F0aW9uTm9kZShjb25zdCBUb2tlblR5cGU6IEludGVnZXIpOwordmFyCisgIE5hdk5vZGU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIGlmIChUb2tlblR5cGUgPSBUVG9rZW4uRE9XTikgdGhlbgorICBiZWdpbgorICAgIGlmIChHZXRIYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMpIHRoZW4KKyAgICAgIE5hdk5vZGUgOj0gRkFkYXB0b3IuQ3JlYXRlTm9kZShUVG9rZW4uRE9XTiwnRE9XTicpCisgICAgZWxzZQorICAgICAgTmF2Tm9kZSA6PSBGRG93bjsKKyAgZW5kCisgIGVsc2UKKyAgYmVnaW4KKyAgICBpZiAoR2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKSB0aGVuCisgICAgICBOYXZOb2RlIDo9IEZBZGFwdG9yLkNyZWF0ZU5vZGUoVFRva2VuLlVQLCdVUCcpCisgICAgZWxzZQorICAgICAgTmF2Tm9kZSA6PSBGVXA7CisgIGVuZDsKKyAgQWRkTG9va2FoZWFkKE5hdk5vZGUpOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5Db25zdW1lOworYmVnaW4KKyAgLy8gbWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyBpbiBsb29rYWhlYWQgYnVmLCB3aGljaCBtaWdodCBjYWxsIG5leHQoKQorICBGaWxsKDEpOworICBJbmMoRkFic29sdXRlTm9kZUluZGV4KTsKKyAgRlByZXZpb3VzTm9kZSA6PSBGTG9va2FoZWFkW0ZIZWFkXTsgLy8gdHJhY2sgcHJldmlvdXMgbm9kZSBiZWZvcmUgbW92aW5nIG9uCisgIEZIZWFkIDo9IChGSGVhZCArIDEpIG1vZCBMZW5ndGgoRkxvb2thaGVhZCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBTZXRMZW5ndGgoRkxvb2tBaGVhZCxJTklUSUFMX0xPT0tBSEVBRF9CVUZGRVJfU0laRSk7CisgIEZOb2RlU3RhY2sgOj0gVFN0YWNrTGlzdDxJQU5UTFJJbnRlcmZhY2U+LkNyZWF0ZTsKKyAgRkluZGV4U3RhY2sgOj0gVFN0YWNrTGlzdDxJbnRlZ2VyPi5DcmVhdGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uQ3JlYXRlKGNvbnN0IEFUcmVlOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgQ3JlYXRlKFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGUsIEFUcmVlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5DcmVhdGUoY29uc3QgQUFkYXB0b3I6IElUcmVlQWRhcHRvcjsKKyAgY29uc3QgQVRyZWU6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBDcmVhdGU7CisgIEZSb290IDo9IEFUcmVlOworICBGQWRhcHRvciA6PSBBQWRhcHRvcjsKKyAgUmVzZXQ7CisgIEZEb3duIDo9IEZBZGFwdG9yLkNyZWF0ZU5vZGUoVFRva2VuLkRPV04sICdET1dOJyk7CisgIEZVcCA6PSBGQWRhcHRvci5DcmVhdGVOb2RlKFRUb2tlbi5VUCwgJ1VQJyk7CisgIEZFb2YgOj0gRkFkYXB0b3IuQ3JlYXRlTm9kZShUVG9rZW4uRU9GLCAnRU9GJyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLkZpbGwoY29uc3QgSzogSW50ZWdlcik7Cit2YXIKKyAgSSwgTjogSW50ZWdlcjsKK2JlZ2luCisgIE4gOj0gTG9va2FoZWFkU2l6ZTsKKyAgZm9yIEkgOj0gMSB0byBLIC0gTiBkbworICAgIE1vdmVOZXh0OyAvLyBnZXQgYXQgbGVhc3Qgay1kZXB0aCBsb29rYWhlYWQgbm9kZXMKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5HZXQoY29uc3QgSTogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIHJhaXNlIEVJbnZhbGlkT3BlcmF0aW9uLkNyZWF0ZSgnc3RyZWFtIGlzIHVuYnVmZmVyZWQnKTsKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5HZXRDdXJyZW50OiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gRkN1cnJlbnRFbnVtZXJhdGlvbk5vZGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uR2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZVbmlxdWVOYXZpZ2F0aW9uTm9kZXM7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uR2V0U291cmNlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFRva2VuU3RyZWFtLlNvdXJjZU5hbWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uR2V0VG9rZW5TdHJlYW06IElUb2tlblN0cmVhbTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVG9rZW5zOworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLkdldFRyZWVBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CitiZWdpbgorICBSZXN1bHQgOj0gRkFkYXB0b3I7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uR2V0VHJlZVNvdXJjZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZSb290OworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLkhhbmRsZVJvb3ROb2RlOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gRkN1cnJlbnROb2RlOworICAvLyBwb2ludCB0byBmaXJzdCBjaGlsZCBpbiBwcmVwIGZvciBzdWJzZXF1ZW50IG5leHQoKQorICBGQ3VycmVudENoaWxkSW5kZXggOj0gMDsKKyAgaWYgKEZBZGFwdG9yLklzTmlsKFJlc3VsdCkpIHRoZW4KKyAgICAvLyBkb24ndCBjb3VudCB0aGlzIHJvb3QgbmlsIG5vZGUKKyAgICBSZXN1bHQgOj0gVmlzaXRDaGlsZChGQ3VycmVudENoaWxkSW5kZXgpCisgIGVsc2UKKyAgYmVnaW4KKyAgICBBZGRMb29rYWhlYWQoUmVzdWx0KTsKKyAgICBpZiAoRkFkYXB0b3IuR2V0Q2hpbGRDb3VudChGQ3VycmVudE5vZGUpID0gMCkgdGhlbgorICAgICAgLy8gc2luZ2xlIG5vZGUgY2FzZQorICAgICAgUmVzdWx0IDo9IG5pbDsgLy8gc2F5IHdlJ3JlIGRvbmUKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLkluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZBYnNvbHV0ZU5vZGVJbmRleCArIDE7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uTEEoSTogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgVDogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgVCA6PSBMVChJKTsKKyAgaWYgKFQgPSBuaWwpIHRoZW4KKyAgICBSZXN1bHQgOj0gVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRQorICBlbHNlCisgICAgUmVzdWx0IDo9IEZBZGFwdG9yLkdldE5vZGVUeXBlKFQpOworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLkxBQ2hhcihJOiBJbnRlZ2VyKTogQ2hhcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBDaGFyKExBKEkpKTsKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5Mb29rYWhlYWRTaXplOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEZUYWlsIDwgRkhlYWQpIHRoZW4KKyAgICBSZXN1bHQgOj0gTGVuZ3RoKEZMb29rYWhlYWQpIC0gRkhlYWQgKyBGVGFpbAorICBlbHNlCisgICAgUmVzdWx0IDo9IEZUYWlsIC0gRkhlYWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uTFQoY29uc3QgSzogSW50ZWdlcik6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIGlmIChLID0gLTEpIHRoZW4KKyAgICBFeGl0KEZQcmV2aW91c05vZGUpOworCisgIGlmIChLIDwgMCkgdGhlbgorICAgIHJhaXNlIEVBcmd1bWVudEV4Y2VwdGlvbi5DcmVhdGUoJ3RyZWUgbm9kZSBzdHJlYW1zIGNhbm5vdCBsb29rIGJhY2t3YXJkcyBtb3JlIHRoYW4gMSBub2RlJyk7CisKKyAgaWYgKEsgPSAwKSB0aGVuCisgICAgRXhpdChUVHJlZS5JTlZBTElEX05PREUpOworCisgIEZpbGwoSyk7CisgIFJlc3VsdCA6PSBGTG9va2FoZWFkWyhGSGVhZCArIEsgLSAxKSBtb2QgTGVuZ3RoKEZMb29rYWhlYWQpXTsKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5NYXJrOiBJbnRlZ2VyOwordmFyCisgIFN0YXRlOiBJVHJlZVdhbGtTdGF0ZTsKKyAgSSwgTiwgSzogSW50ZWdlcjsKKyAgTEE6IFRBTlRMUkludGVyZmFjZUFycmF5OworYmVnaW4KKyAgaWYgKEZNYXJrZXJzID0gbmlsKSB0aGVuCisgIGJlZ2luCisgICAgRk1hcmtlcnMgOj0gVExpc3Q8SVRyZWVXYWxrU3RhdGU+LkNyZWF0ZTsKKyAgICBGTWFya2Vycy5BZGQobmlsKTsgLy8gZGVwdGggMCBtZWFucyBubyBiYWNrdHJhY2tpbmcsIGxlYXZlIGJsYW5rCisgIGVuZDsKKworICBJbmMoRk1hcmtEZXB0aCk7CisgIFN0YXRlIDo9IG5pbDsKKyAgaWYgKEZNYXJrRGVwdGggPj0gRk1hcmtlcnMuQ291bnQpIHRoZW4KKyAgYmVnaW4KKyAgICBTdGF0ZSA6PSBUVHJlZVdhbGtTdGF0ZS5DcmVhdGU7CisgICAgRk1hcmtlcnMuQWRkKFN0YXRlKTsKKyAgZW5kCisgIGVsc2UKKyAgICBTdGF0ZSA6PSBGTWFya2Vyc1tGTWFya0RlcHRoXTsKKworICBTdGF0ZS5BYnNvbHV0ZU5vZGVJbmRleCA6PSBGQWJzb2x1dGVOb2RlSW5kZXg7CisgIFN0YXRlLkN1cnJlbnRDaGlsZEluZGV4IDo9IEZDdXJyZW50Q2hpbGRJbmRleDsKKyAgU3RhdGUuQ3VycmVudE5vZGUgOj0gRkN1cnJlbnROb2RlOworICBTdGF0ZS5QcmV2aW91c05vZGUgOj0gRlByZXZpb3VzTm9kZTsKKyAgU3RhdGUuTm9kZVN0YWNrU2l6ZSA6PSBGTm9kZVN0YWNrLkNvdW50OworICBTdGF0ZS5JbmRleFN0YWNrU2l6ZSA6PSBGSW5kZXhTdGFjay5Db3VudDsKKworICAvLyB0YWtlIHNuYXBzaG90IG9mIGxvb2thaGVhZCBidWZmZXIKKyAgTiA6PSBMb29rYWhlYWRTaXplOworICBJIDo9IDA7CisgIFNldExlbmd0aChMQSxOKTsKKyAgZm9yIEsgOj0gMSB0byBOIGRvCisgIGJlZ2luCisgICAgTEFbSV0gOj0gTFQoSyk7CisgICAgSW5jKEkpOworICBlbmQ7CisgIFN0YXRlLkxvb2tBaGVhZCA6PSBMQTsKKyAgRkxhc3RNYXJrZXIgOj0gRk1hcmtEZXB0aDsKKyAgUmVzdWx0IDo9IEZNYXJrRGVwdGg7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uTW92ZU5leHQ6IEJvb2xlYW47CitiZWdpbgorICAvLyBhbHJlYWR5IHdhbGtlZCBlbnRpcmUgdHJlZTsgbm90aGluZyB0byByZXR1cm4KKyAgaWYgKEZDdXJyZW50Tm9kZSA9IG5pbCkgdGhlbgorICBiZWdpbgorICAgIEFkZExvb2thaGVhZChGRW9mKTsKKyAgICBGQ3VycmVudEVudW1lcmF0aW9uTm9kZSA6PSBuaWw7CisgICAgLy8gdGhpcyBpcyBpbmZpbml0ZSBzdHJlYW0gcmV0dXJuaW5nIEVPRiBhdCBlbmQgZm9yZXZlcgorICAgIC8vIHNvIGRvbid0IHRocm93IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KKyAgICBFeGl0KEZhbHNlKTsKKyAgZW5kOworCisgIC8vIGluaXRpYWwgY29uZGl0aW9uIChmaXJzdCB0aW1lIG1ldGhvZCBpcyBjYWxsZWQpCisgIGlmIChGQ3VycmVudENoaWxkSW5kZXggPSAtMSkgdGhlbgorICBiZWdpbgorICAgIEZDdXJyZW50RW51bWVyYXRpb25Ob2RlIDo9IEhhbmRsZVJvb3ROb2RlIGFzIElUcmVlOworICAgIEV4aXQoVHJ1ZSk7CisgIGVuZDsKKworICAvLyBpbmRleCBpcyBpbiB0aGUgY2hpbGQgbGlzdD8KKyAgaWYgKEZDdXJyZW50Q2hpbGRJbmRleCA8IEZBZGFwdG9yLkdldENoaWxkQ291bnQoRkN1cnJlbnROb2RlKSkgdGhlbgorICBiZWdpbgorICAgIEZDdXJyZW50RW51bWVyYXRpb25Ob2RlIDo9IFZpc2l0Q2hpbGQoRkN1cnJlbnRDaGlsZEluZGV4KSBhcyBJVHJlZTsKKyAgICBFeGl0KFRydWUpOworICBlbmQ7CisKKyAgLy8gaGl0IGVuZCBvZiBjaGlsZCBsaXN0LCByZXR1cm4gdG8gcGFyZW50IG5vZGUgb3IgaXRzIHBhcmVudCAuLi4KKyAgV2Fsa0JhY2tUb01vc3RSZWNlbnROb2RlV2l0aFVudmlzaXRlZENoaWxkcmVuOworICBpZiAoRkN1cnJlbnROb2RlIDw+IG5pbCkgdGhlbgorICBiZWdpbgorICAgIEZDdXJyZW50RW51bWVyYXRpb25Ob2RlIDo9IFZpc2l0Q2hpbGQoRkN1cnJlbnRDaGlsZEluZGV4KSBhcyBJVHJlZTsKKyAgICBSZXN1bHQgOj0gVHJ1ZTsKKyAgZW5kCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gRmFsc2U7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlJlbGVhc2UoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIC8vIHVud2luZCBhbnkgb3RoZXIgbWFya2VycyBtYWRlIGFmdGVyIG1hcmtlciBhbmQgcmVsZWFzZSBtYXJrZXIKKyAgRk1hcmtEZXB0aCA6PSBNYXJrZXI7CisgIC8vIHJlbGVhc2UgdGhpcyBtYXJrZXIKKyAgRGVjKEZNYXJrRGVwdGgpOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5SZXBsYWNlQ2hpbGRyZW4oCisgIGNvbnN0IFBhcmVudDogSUFOVExSSW50ZXJmYWNlOyBjb25zdCBTdGFydENoaWxkSW5kZXgsIFN0b3BDaGlsZEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBUOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgcmFpc2UgRUludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCdjYW4nJ3QgZG8gc3RyZWFtIHJld3JpdGVzIHlldCcpOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5SZXNldDsKK2JlZ2luCisgIEZDdXJyZW50Tm9kZSA6PSBGUm9vdDsKKyAgRlByZXZpb3VzTm9kZSA6PSBuaWw7CisgIEZDdXJyZW50Q2hpbGRJbmRleCA6PSAtMTsKKyAgRkFic29sdXRlTm9kZUluZGV4IDo9IC0xOworICBGSGVhZCA6PSAwOworICBGVGFpbCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5SZXdpbmQoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsKK3ZhcgorICBTdGF0ZTogSVRyZWVXYWxrU3RhdGU7CitiZWdpbgorICBpZiAoRk1hcmtlcnMgPSBuaWwpIHRoZW4KKyAgICBFeGl0OworICBTdGF0ZSA6PSBGTWFya2Vyc1tNYXJrZXJdOworICBGQWJzb2x1dGVOb2RlSW5kZXggOj0gU3RhdGUuQWJzb2x1dGVOb2RlSW5kZXg7CisgIEZDdXJyZW50Q2hpbGRJbmRleCA6PSBTdGF0ZS5DdXJyZW50Q2hpbGRJbmRleDsKKyAgRkN1cnJlbnROb2RlIDo9IFN0YXRlLkN1cnJlbnROb2RlOworICBGUHJldmlvdXNOb2RlIDo9IFN0YXRlLlByZXZpb3VzTm9kZTsKKyAgLy8gZHJvcCBub2RlIGFuZCBpbmRleCBzdGFja3MgYmFjayB0byBvbGQgc2l6ZQorICBGTm9kZVN0YWNrLkNhcGFjaXR5IDo9IFN0YXRlLk5vZGVTdGFja1NpemU7CisgIEZJbmRleFN0YWNrLkNhcGFjaXR5IDo9IFN0YXRlLkluZGV4U3RhY2tTaXplOworICBGSGVhZCA6PSAwOyAvLyB3YWNrIGxvb2thaGVhZCBidWZmZXIgYW5kIHRoZW4gcmVmaWxsCisgIEZUYWlsIDo9IDA7CisgIHdoaWxlIChGVGFpbCA8IExlbmd0aChTdGF0ZS5Mb29rQWhlYWQpKSBkbworICBiZWdpbgorICAgIEZMb29rYWhlYWRbRlRhaWxdIDo9IFN0YXRlLkxvb2tBaGVhZFtGVGFpbF07CisgICAgSW5jKEZUYWlsKTsKKyAgZW5kOworICBSZWxlYXNlKE1hcmtlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlJld2luZDsKK2JlZ2luCisgIFJld2luZChGTGFzdE1hcmtlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlNlZWsoY29uc3QgSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgaWYgKEluZGV4IDwgU2VsZi5JbmRleCkgdGhlbgorICAgIHJhaXNlIEVBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uQ3JlYXRlKCdjYW4nJ3Qgc2VlayBiYWNrd2FyZHMgaW4gbm9kZSBzdHJlYW0nKTsKKworICAvLyBzZWVrIGZvcndhcmQsIGNvbnN1bWUgdW50aWwgd2UgaGl0IGluZGV4CisgIHdoaWxlIChTZWxmLkluZGV4IDwgSW5kZXgpIGRvCisgICAgQ29uc3VtZTsKK2VuZDsKKworcHJvY2VkdXJlIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uU2V0SGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKAorICBjb25zdCBWYWx1ZTogQm9vbGVhbik7CitiZWdpbgorICBGVW5pcXVlTmF2aWdhdGlvbk5vZGVzIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5TZXRUb2tlblN0cmVhbShjb25zdCBWYWx1ZTogSVRva2VuU3RyZWFtKTsKK2JlZ2luCisgIEZUb2tlbnMgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uU2l6ZTogSW50ZWdlcjsKK3ZhcgorICBTOiBJQ29tbW9uVHJlZU5vZGVTdHJlYW07CitiZWdpbgorICBTIDo9IFRDb21tb25UcmVlTm9kZVN0cmVhbS5DcmVhdGUoRlJvb3QpOworICBSZXN1bHQgOj0gUy5TaXplOworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gVG9TdHJpbmcoRlJvb3QsIG5pbCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRvU3RyaW5nV29yayhjb25zdCBQLCBTdG9wOiBJQU5UTFJJbnRlcmZhY2U7CisgIGNvbnN0IEJ1ZjogVFN0cmluZ0J1aWxkZXIpOwordmFyCisgIFRleHQ6IFN0cmluZzsKKyAgQywgTjogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChub3QgRkFkYXB0b3IuSXNOaWwoUCkpIHRoZW4KKyAgYmVnaW4KKyAgICBUZXh0IDo9IEZBZGFwdG9yLkdldE5vZGVUZXh0KFApOworICAgIGlmIChUZXh0ID0gJycpIHRoZW4KKyAgICAgIFRleHQgOj0gJyAnICsgSW50VG9TdHIoRkFkYXB0b3IuR2V0Tm9kZVR5cGUoUCkpOworICAgIEJ1Zi5BcHBlbmQoVGV4dCk7IC8vIGFzayB0aGUgbm9kZSB0byBnbyB0byBzdHJpbmcKKyAgZW5kOworCisgIGlmIFNhbWVPYmooUCwgU3RvcCkgdGhlbgorICAgIEV4aXQ7CisKKyAgTiA6PSBGQWRhcHRvci5HZXRDaGlsZENvdW50KFApOworICBpZiAoTiA+IDApIGFuZCAobm90IEZBZGFwdG9yLklzTmlsKFApKSB0aGVuCisgIGJlZ2luCisgICAgQnVmLkFwcGVuZCgnICcpOworICAgIEJ1Zi5BcHBlbmQoVFRva2VuLkRPV04pOworICBlbmQ7CisKKyAgZm9yIEMgOj0gMCB0byBOIC0gMSBkbworICAgIFRvU3RyaW5nV29yayhGQWRhcHRvci5HZXRDaGlsZChQLCBDKSwgU3RvcCwgQnVmKTsKKworICBpZiAoTiA+IDApIGFuZCAobm90IEZBZGFwdG9yLklzTmlsKFApKSB0aGVuCisgIGJlZ2luCisgICAgQnVmLkFwcGVuZCgnICcpOworICAgIEJ1Zi5BcHBlbmQoVFRva2VuLlVQKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlZpc2l0Q2hpbGQoCisgIGNvbnN0IENoaWxkOiBJbnRlZ2VyKTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IG5pbDsKKyAgLy8gc2F2ZSBzdGF0ZQorICBGTm9kZVN0YWNrLlB1c2goRkN1cnJlbnROb2RlKTsKKyAgRkluZGV4U3RhY2suUHVzaChDaGlsZCk7CisgIGlmIChDaGlsZCA9IDApIGFuZCAobm90IEZBZGFwdG9yLklzTmlsKEZDdXJyZW50Tm9kZSkpIHRoZW4KKyAgICBBZGROYXZpZ2F0aW9uTm9kZShUVG9rZW4uRE9XTik7CisgIC8vIHZpc2l0IGNoaWxkCisgIEZDdXJyZW50Tm9kZSA6PSBGQWRhcHRvci5HZXRDaGlsZChGQ3VycmVudE5vZGUsIENoaWxkKTsKKyAgRkN1cnJlbnRDaGlsZEluZGV4IDo9IDA7CisgIFJlc3VsdCA6PSBGQ3VycmVudE5vZGU7CisgIEFkZExvb2thaGVhZChSZXN1bHQpOworICBXYWxrQmFja1RvTW9zdFJlY2VudE5vZGVXaXRoVW52aXNpdGVkQ2hpbGRyZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLldhbGtCYWNrVG9Nb3N0UmVjZW50Tm9kZVdpdGhVbnZpc2l0ZWRDaGlsZHJlbjsKK2JlZ2luCisgIHdoaWxlIChGQ3VycmVudE5vZGUgPD4gbmlsKSBhbmQgKEZDdXJyZW50Q2hpbGRJbmRleCA+PSBGQWRhcHRvci5HZXRDaGlsZENvdW50KEZDdXJyZW50Tm9kZSkpIGRvCisgIGJlZ2luCisgICAgRkN1cnJlbnROb2RlIDo9IEZOb2RlU3RhY2suUG9wOworICAgIGlmIChGQ3VycmVudE5vZGUgPSBuaWwpIHRoZW4KKyAgICAgIC8vIGhpdCB0aGUgcm9vdD8KKyAgICAgIEV4aXQ7CisKKyAgICBGQ3VycmVudENoaWxkSW5kZXggOj0gRkluZGV4U3RhY2suUG9wOworICAgIEluYyhGQ3VycmVudENoaWxkSW5kZXgpOyAvLyBtb3ZlIHRvIG5leHQgY2hpbGQKKyAgICBpZiAoRkN1cnJlbnRDaGlsZEluZGV4ID49IEZBZGFwdG9yLkdldENoaWxkQ291bnQoRkN1cnJlbnROb2RlKSkgdGhlbgorICAgIGJlZ2luCisgICAgICBpZiAobm90IEZBZGFwdG9yLklzTmlsKEZDdXJyZW50Tm9kZSkpIHRoZW4KKyAgICAgICAgQWRkTmF2aWdhdGlvbk5vZGUoVFRva2VuLlVQKTsKKyAgICAgIGlmIFNhbWVPYmooRkN1cnJlbnROb2RlLCBGUm9vdCkgdGhlbgorICAgICAgICAvLyB3ZSBkb25lIHlldD8KKyAgICAgICAgRkN1cnJlbnROb2RlIDo9IG5pbDsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5Ub1N0cmluZyhjb25zdCBTdGFydCwKKyAgU3RvcDogSUFOVExSSW50ZXJmYWNlKTogU3RyaW5nOwordmFyCisgIEJlZ2luVG9rZW5JbmRleCwgRW5kVG9rZW5JbmRleDogSW50ZWdlcjsKKyAgQnVmOiBUU3RyaW5nQnVpbGRlcjsKK2JlZ2luCisgIGlmIChTdGFydCA9IG5pbCkgdGhlbgorICAgIEV4aXQoJycpOworCisgIC8vIGlmIHdlIGhhdmUgdGhlIHRva2VuIHN0cmVhbSwgdXNlIHRoYXQgdG8gZHVtcCB0ZXh0IGluIG9yZGVyCisgIGlmIChGVG9rZW5zIDw+IG5pbCkgdGhlbgorICBiZWdpbgorICAgIC8vIGRvbid0IHRydXN0IHN0b3Agbm9kZSBhcyBpdCdzIG9mdGVuIGFuIFVQIG5vZGUgZXRjLi4uCisgICAgLy8gd2FsayBiYWNrd2FyZHMgdW50aWwgeW91IGZpbmQgYSBub24tVVAsIG5vbi1ET1dOIG5vZGUKKyAgICAvLyBhbmQgYXNrIGZvciBpdCdzIHRva2VuIGluZGV4LgorICAgIEJlZ2luVG9rZW5JbmRleCA6PSBGQWRhcHRvci5HZXRUb2tlblN0YXJ0SW5kZXgoU3RhcnQpOworICAgIGlmIChTdG9wIDw+IG5pbCkgYW5kIChGQWRhcHRvci5HZXROb2RlVHlwZShTdG9wKSA9IFRUb2tlbi5VUCkgdGhlbgorICAgICAgRW5kVG9rZW5JbmRleCA6PSBGQWRhcHRvci5HZXRUb2tlblN0b3BJbmRleChTdGFydCkKKyAgICBlbHNlCisgICAgICBFbmRUb2tlbkluZGV4IDo9IFNpemUgLSAxOworICAgIEV4aXQoRlRva2Vucy5Ub1N0cmluZyhCZWdpblRva2VuSW5kZXgsIEVuZFRva2VuSW5kZXgpKTsKKyAgZW5kOworCisgIEJ1ZiA6PSBUU3RyaW5nQnVpbGRlci5DcmVhdGU7CisgIHRyeQorICAgIFRvU3RyaW5nV29yayhTdGFydCwgU3RvcCwgQnVmKTsKKyAgICBSZXN1bHQgOj0gQnVmLlRvU3RyaW5nOworICBmaW5hbGx5CisgICAgQnVmLkZyZWU7CisgIGVuZDsKK2VuZDsKKworeyBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRUcmVlV2Fsa1N0YXRlIH0KKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5HZXRBYnNvbHV0ZU5vZGVJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQWJzb2x1dGVOb2RlSW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uVFRyZWVXYWxrU3RhdGUuR2V0Q3VycmVudENoaWxkSW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkN1cnJlbnRDaGlsZEluZGV4OworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRUcmVlV2Fsa1N0YXRlLkdldEN1cnJlbnROb2RlOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gRkN1cnJlbnROb2RlOworZW5kOworCitmdW5jdGlvbiBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRUcmVlV2Fsa1N0YXRlLkdldEluZGV4U3RhY2tTaXplOiBpbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbmRleFN0YWNrU2l6ZTsKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5HZXRMb29rQWhlYWQ6IFRBTlRMUkludGVyZmFjZUFycmF5OworYmVnaW4KKyAgUmVzdWx0IDo9IEZMb29rQWhlYWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uVFRyZWVXYWxrU3RhdGUuR2V0Tm9kZVN0YWNrU2l6ZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTm9kZVN0YWNrU2l6ZTsKK2VuZDsKKworZnVuY3Rpb24gVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5HZXRQcmV2aW91c05vZGU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGUHJldmlvdXNOb2RlOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5TZXRBYnNvbHV0ZU5vZGVJbmRleCgKKyAgY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkFic29sdXRlTm9kZUluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5TZXRDdXJyZW50Q2hpbGRJbmRleCgKKyAgY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkN1cnJlbnRDaGlsZEluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5TZXRDdXJyZW50Tm9kZSgKKyAgY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBGQ3VycmVudE5vZGUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRUcmVlV2Fsa1N0YXRlLlNldEluZGV4U3RhY2tTaXplKAorICBjb25zdCBWYWx1ZTogaW50ZWdlcik7CitiZWdpbgorICBGSW5kZXhTdGFja1NpemUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRUcmVlV2Fsa1N0YXRlLlNldExvb2tBaGVhZCgKKyAgY29uc3QgVmFsdWU6IFRBTlRMUkludGVyZmFjZUFycmF5KTsKK2JlZ2luCisgIEZMb29rQWhlYWQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLlRUcmVlV2Fsa1N0YXRlLlNldE5vZGVTdGFja1NpemUoCisgIGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZOb2RlU3RhY2tTaXplIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5UVHJlZVdhbGtTdGF0ZS5TZXRQcmV2aW91c05vZGUoCisgIGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgRlByZXZpb3VzTm9kZSA6PSBWYWx1ZTsKK2VuZDsKKworeyBVdGlsaXRpZXMgfQorCit2YXIKKyAgRW1wdHlDb21tb25UcmVlOiBJQ29tbW9uVHJlZSA9IG5pbDsKKworZnVuY3Rpb24gRGVmKGNvbnN0IFg6IElDb21tb25UcmVlKTogSUNvbW1vblRyZWU7IG92ZXJsb2FkOworYmVnaW4KKyAgaWYgQXNzaWduZWQoWCkgdGhlbgorICAgIFJlc3VsdCA6PSBYCisgIGVsc2UKKyAgYmVnaW4KKyAgICBpZiAoRW1wdHlDb21tb25UcmVlID0gbmlsKSB0aGVuCisgICAgICBFbXB0eUNvbW1vblRyZWUgOj0gVENvbW1vblRyZWUuQ3JlYXRlOworICAgIFJlc3VsdCA6PSBFbXB0eUNvbW1vblRyZWU7CisgIGVuZDsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KKyAgVFRyZWUuSW5pdGlhbGl6ZTsKKworZW5kLgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5wYXMgYi9hbnRsci0zLjQvcnVudGltZS9EZWxwaGkvU291cmNlcy9BbnRscjMuUnVudGltZS9BbnRsci5SdW50aW1lLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODFmZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvRGVscGhpL1NvdXJjZXMvQW50bHIzLlJ1bnRpbWUvQW50bHIuUnVudGltZS5wYXMKQEAgLTAsMCArMSw2NTYzIEBACit1bml0IEFudGxyLlJ1bnRpbWU7CisoKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA4IEVyaWsgdmFuIEJpbHNlbgorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgTVVTVCBSRVRBSU4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIE1VU1QgUkVQUk9EVUNFIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCisgICBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgV1JJVFRFTiBwZXJtaXNzaW9uLgorNC4gVW5sZXNzIGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgCisgICBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIHdvcmsgdG8gdGhlIGNvcHlyaWdodCBvd25lciBvciBsaWNlbnNvcgorICAgc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgbGljZW5zZSwgd2l0aG91dCBhbnkgCisgICBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyopCisKK2ludGVyZmFjZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIwfQoreyRNRVNTQUdFIEVSUk9SICdZb3UgbmVlZCBEZWxwaGkgMjAwOSBvciBoaWdoZXIgdG8gdXNlIHRoZSBBbnRsciBydW50aW1lJ30KK3skSUZFTkR9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIENsYXNzZXMsCisgIEdlbmVyaWNzLkRlZmF1bHRzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgQW50bHIuUnVudGltZS5Ub29scywKKyAgQW50bHIuUnVudGltZS5Db2xsZWN0aW9uczsKKwordHlwZQorICBUQ2hhclN0cmVhbUNvbnN0YW50cyA9IChjc2NFT0YgPSAtMSk7CisKK3R5cGUKKyAgRVJlY29nbml0aW9uRXhjZXB0aW9uID0gY2xhc3M7CisgIEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA9IGNsYXNzOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgc2ltcGxlIHN0cmVhbSBvZiBpbnRlZ2Vycy4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhbGwgd2UgY2FyZSBhYm91dCBpcyB0aGUgY2hhcgorICAvLy8gb3IgdG9rZW4gdHlwZSBzZXF1ZW5jZSAoc3VjaCBhcyBmb3IgaW50ZXJwcmV0YXRpb24pLgorICAvLy8gPC9zdW1tYXJ5PgorICBJSW50U3RyZWFtID0gaW50ZXJmYWNlKElBTlRMUkludGVyZmFjZSkKKyAgWyd7NkI4NTFCREItREQ5Qy00MjJCLUFEMUUtNTY3RTUyRDI2NTRGfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldFNvdXJjZU5hbWU6IFN0cmluZzsKKworICAgIHsgTWV0aG9kcyB9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBZHZhbmNlcyB0aGUgcmVhZCBwb3NpdGlvbiBvZiB0aGUgc3RyZWFtLiBVcGRhdGVzIGxpbmUgYW5kIGNvbHVtbiBzdGF0ZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIENvbnN1bWU7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCBpbnQgYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgSSBhaGVhZCAod2hlcmUgST0xIGlzIG5leHQgaW50KQorICAgIC8vLyBOZWdhdGl2ZSBpbmRleGVzIGFyZSBhbGxvd2VkLiAgTEEoLTEpIGlzIHByZXZpb3VzIHRva2VuICh0b2tlbiBqdXN0IG1hdGNoZWQpLgorICAgIC8vLyBMQSgtaSkgd2hlcmUgaSBpcyBiZWZvcmUgZmlyc3QgdG9rZW4gc2hvdWxkIHlpZWxkIC0xLCBpbnZhbGlkIGNoYXIgb3IgRU9GLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gTEEoSTogSW50ZWdlcik6IEludGVnZXI7CisgICAgZnVuY3Rpb24gTEFDaGFyKEk6IEludGVnZXIpOiBDaGFyOworCisgICAgLy8vIDxzdW1tYXJ5PlRlbGwgdGhlIHN0cmVhbSB0byBzdGFydCBidWZmZXJpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkuPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gRXhlY3V0aW5nIFJld2luZChNYXJrKCkpIG9uIGEgc3RyZWFtIHNob3VsZCBub3QgYWZmZWN0IHRoZSBpbnB1dCBwb3NpdGlvbi4KKyAgICAvLy8gVGhlIExleGVyIHRyYWNrcyBsaW5lL2NvbCBpbmZvIGFzIHdlbGwgYXMgaW5wdXQgaW5kZXggc28gaXRzIG1hcmtlcnMgYXJlCisgICAgLy8vIG5vdCBwdXJlIGlucHV0IGluZGV4ZXMuICBTYW1lIGZvciB0cmVlIG5vZGUgc3RyZWFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICAvLy8gPHJldHVybnM+UmV0dXJuIGEgbWFya2VyIHRoYXQgY2FuIGJlIHBhc3NlZCB0bworICAgIC8vLyA8c2VlIGNyZWY9IklJbnRTdHJlYW0uUmV3aW5kKEludGVnZXIpIi8+IHRvIHJldHVybiB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAvLy8gVGhpcyBjb3VsZCBiZSB0aGUgY3VycmVudCBpbnB1dCBwb3NpdGlvbiwgYSB2YWx1ZSByZXR1cm4gZnJvbQorICAgIC8vLyA8c2VlIGNyZWY9IklJbnRTdHJlYW0uSW5kZXgiLz4sIG9yIHNvbWUgb3RoZXIgbWFya2VyLjwvcmV0dXJucz4KKyAgICBmdW5jdGlvbiBNYXJrOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGluZGV4IDAuLk4gd2hlcmUgTiBpbmRpY2F0ZXMgdGhlCisgICAgLy8vIGxhc3Qgc3ltYm9sIGhhcyBiZWVuIHJlYWQuIFRoZSBpbmRleCBpcyB0aGUgc3ltYm9sIGFib3V0IHRvIGJlCisgICAgLy8vIHJlYWQgbm90IHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgc3ltYm9sLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gSW5kZXg6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJlc2V0cyB0aGUgc3RyZWFtIHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0bworICAgIC8vLyA8c2VlIGNyZWY9IklJbnRTdHJlYW0uSW5kZXgiLz4gd291bGQgIHJldHVybiBtYXJrZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIDxzZWUgY3JlZj0iSUludFN0cmVhbS5JbmRleCIvPiBidXQKKyAgICAvLy8gaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSXQncyBqdXN0IGEgbWFya2VyIHRvIGluZGljYXRlIHdoYXQKKyAgICAvLy8gc3RhdGUgdGhlIHN0cmVhbSB3YXMgaW4uICBUaGlzIGlzIGVzc2VudGlhbGx5IGNhbGxpbmcKKyAgICAvLy8gPHNlZSBjcmVmPSJJSW50U3RyZWFtLlJlbGVhc2UiLz4gYW5kIDxzZWUgY3JlZj0iSUludFN0cmVhbS5TZWVrIi8+LgorICAgIC8vLyBJZiB0aGVyZSBhcmUgb3RoZXIgbWFya2VycyBjcmVhdGVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgbWFya2VyLAorICAgIC8vLyB0aGlzIHJvdXRpbmUgbXVzdCB1bnJvbGwgdGhlbSBsaWtlIGEgc3RhY2suICBBc3N1bWVzIHRoZSBzdGF0ZSB0aGUKKyAgICAvLy8gc3RyZWFtIHdhcyBpbiB3aGVuIHRoaXMgbWFya2VyIHdhcyBjcmVhdGVkLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvY2VkdXJlIFJld2luZChjb25zdCBNYXJrZXI6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV3aW5kIHRvIHRoZSBpbnB1dCBwb3NpdGlvbiBvZiB0aGUgbGFzdCBtYXJrZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0IGJlZm9yZSBzdGFydGluZworICAgIC8vLyBhIHNlbS9zeW4gcHJlZGljYXRlIHRvIGdldCB0aGUgaW5wdXQgcG9zaXRpb24gYmFjayB0byB0aGUgc3RhcnQKKyAgICAvLy8gb2YgdGhlIGRlY2lzaW9uLiBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgTWFyayhJKQorICAgIC8vLyBhbmQgUmV3aW5kKEkpIHNob3VsZCBiYWxhbmNlIHN0aWxsLiBJdCBpcyBsaWtlIGludm9raW5nCisgICAgLy8vIFJld2luZChsYXN0IG1hcmtlcikgYnV0IGl0IHNob3VsZCBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYuCisgICAgLy8vIEl0J3MgbGlrZSBTZWVrKGxhc3QgbWFya2VyJ3MgaW5wdXQgcG9zaXRpb24pLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvY2VkdXJlIFJld2luZDsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFlvdSBtYXkgd2FudCB0byBjb21taXQgdG8gYSBiYWNrdHJhY2sgYnV0IGRvbid0IHdhbnQgdG8gZm9yY2UgdGhlCisgICAgLy8vIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisgICAgLy8vIG5vIGxvbmdlciBuZWNlc3NhcnkuICBUaGlzIHdpbGwgaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBhcworICAgIC8vLyA8c2VlIGNyZWY9IklJbnRTdHJlYW0uUmV3aW5kKEludGVnZXIpIi8+IGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dAorICAgIC8vLyB0aGUgYmFja3dhcmQgc2Vlay4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhpcyBtdXN0IHRocm93IGF3YXkgcmVzb3VyY2VzIGZvciBhbGwgbWFya2VycyBiYWNrIHRvIHRoZSBtYXJrZXIKKyAgICAvLy8gYXJndW1lbnQuIFNvIGlmIHlvdSdyZSBuZXN0ZWQgNSBsZXZlbHMgb2YgTWFyaygpLCBhbmQgdGhlbiBSZWxlYXNlKDIpCisgICAgLy8vIHlvdSBoYXZlIHRvIHJlbGVhc2UgcmVzb3VyY2VzIGZvciBkZXB0aHMgMi4uNS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHByb2NlZHVyZSBSZWxlYXNlKGNvbnN0IE1hcmtlcjogSW50ZWdlcik7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNldCB0aGUgaW5wdXQgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXguICBUaGlzIGlzCisgICAgLy8vIG5vcm1hbGx5IHVzZWQgdG8gc2VlayBhaGVhZCBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBObyBidWZmZXJpbmcgaXMgcmVxdWlyZWQgdG8gZG8gdGhpcyB1bmxlc3MgeW91IGtub3cgeW91ciBzdHJlYW0KKyAgICAvLy8gd2lsbCB1c2Ugc2VlayB0byBtb3ZlIGJhY2t3YXJkcyBzdWNoIGFzIHdoZW4gYmFja3RyYWNraW5nLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHJld2luZCBpbiBpdHMgbXVsdGktZGlyZWN0aW9uYWwgcmVxdWlyZW1lbnQKKyAgICAvLy8gYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorICAgIC8vLworICAgIC8vLyBGb3IgY2hhciBzdHJlYW1zLCBzZWVraW5nIGZvcndhcmQgbXVzdCB1cGRhdGUgdGhlIHN0cmVhbSBzdGF0ZSBzdWNoCisgICAgLy8vIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisgICAgLy8vIGJhY2t0cmFja2luZyB1c2luZyB0aGUKKyAgICAvLy8gPHNlZSBjcmVmPSJJSW50U3RyZWFtLk1hcmsiLz4vPHNlZSBjcmVmPSJJSW50U3RyZWFtLlJld2luZChJbnRlZ2VyKSIvPgorICAgIC8vLyBtZWNoYW5pc20gdGhhdCByZXN0b3JlcyBzdGF0ZSBhbmQgc28gdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0bworICAgIC8vLyB1cGRhdGUgc3RhdGUgd2hlbiBzZWVraW5nIGJhY2t3YXJkcy4KKyAgICAvLy8KKyAgICAvLy8gQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZm9yIGVmZmljaWVudCBiYWNrdHJhY2tpbmcgdXNpbmcKKyAgICAvLy8gbWVtb2l6YXRpb24sIGJ1dCBpbiB0aGUgZnV0dXJlIGl0IG1heSBiZSB1c2VkIGZvciBpbmNyZW1lbnRhbCBwYXJzaW5nLgorICAgIC8vLworICAgIC8vLyBUaGUgaW5kZXggaXMgMC4uTi0xLiBBIHNlZWsgdG8gcG9zaXRpb24gaSBtZWFucyB0aGF0IExBKDEpIHdpbGwgcmV0dXJuCisgICAgLy8vIHRoZSBpdGggc3ltYm9sLiAgU28sIHNlZWtpbmcgdG8gMCBtZWFucyBMQSgxKSB3aWxsIHJldHVybiB0aGUgZmlyc3QKKyAgICAvLy8gZWxlbWVudCBpbiB0aGUgc3RyZWFtLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvY2VkdXJlIFNlZWsoY29uc3QgSW5kZXg6IEludGVnZXIpOworCisgICAgLy8vIDxzdW1tYXJ5PlJldHVybnMgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBzdHJlYW0uPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LAorICAgIC8vLyBidXQgbWlnaHQgYmUgdXNlZnVsIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBzdHJlYW0gb3IgZm9yIHRlc3RpbmcuCisgICAgLy8vIFRoaXMgdmFsdWUgaW5jbHVkZXMgYSBzaW5nbGUgRU9GLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gU2l6ZTogSW50ZWdlcjsKKworICAgIHsgUHJvcGVydGllcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdoZXJlIGFyZSB5b3UgZ2V0dGluZyBzeW1ib2xzIGZyb20/ICBOb3JtYWxseSwgaW1wbGVtZW50YXRpb25zIHdpbGwKKyAgICAvLy8gcGFzcyB0aGUgYnVjayBhbGwgdGhlIHdheSB0byB0aGUgbGV4ZXIgd2hvIGNhbiBhc2sgaXRzIGlucHV0IHN0cmVhbQorICAgIC8vLyBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFNvdXJjZU5hbWU6IFN0cmluZyByZWFkIEdldFNvdXJjZU5hbWU7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+QSBzb3VyY2Ugb2YgY2hhcmFjdGVycyBmb3IgYW4gQU5UTFIgbGV4ZXIgPC9zdW1tYXJ5PgorICBJQ2hhclN0cmVhbSA9IGludGVyZmFjZShJSW50U3RyZWFtKQorICBbJ3tDMzBFRjBEQi1GNEJELTRDQkMtOEM4Ri04MjhEQUJCNkZGMzZ9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0TGluZTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0TGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDaGFyUG9zaXRpb25JbkxpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOworCisgICAgeyBNZXRob2RzIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IHRoZSBpdGggY2hhcmFjdGVyIG9mIGxvb2thaGVhZC4gIFRoaXMgaXMgdXN1YWxseSB0aGUgc2FtZSBhcworICAgIC8vLyBMQShJKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZCBsZXhlciBjb2RlLgorICAgIC8vLyBJJ2QgcHJlZmVyIHRvIHJldHVybiBhIGNoYXIgaGVyZSB0eXBlLXdpc2UsIGJ1dCBpdCdzIHByb2JhYmx5CisgICAgLy8vIGJldHRlciB0byBiZSAzMi1iaXQgY2xlYW4gYW5kIGJlIGNvbnNpc3RlbnQgd2l0aCBMQS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIExUKGNvbnN0IEk6IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGlzIHByaW1hcmlseSBhIHVzZWZ1bCBpbnRlcmZhY2UgZm9yIGFjdGlvbiBjb2RlIChqdXN0IG1ha2Ugc3VyZQorICAgIC8vLyBhY3Rpb25zIGRvbid0IHVzZSB0aGlzIG9uIHN0cmVhbXMgdGhhdCBkb24ndCBzdXBwb3J0IGl0KS4KKyAgICAvLy8gRm9yIGluZmluaXRlIHN0cmVhbXMsIHlvdSBkb24ndCBuZWVkIHRoaXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBTdWJzdHJpbmcoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXIpOiBTdHJpbmc7CisKKyAgICB7IFByb3BlcnRpZXMgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgY3VycmVudCBsaW5lIGluIHRoZSBjaGFyYWN0ZXIgc3RyZWFtIChBTlRMUiB0cmFja3MgdGhlCisgICAgLy8vIGxpbmUgaW5mb3JtYXRpb24gYXV0b21hdGljYWxseS4gVG8gc3VwcG9ydCByZXdpbmRpbmcgY2hhcmFjdGVyCisgICAgLy8vIHN0cmVhbXMsIHdlIGFyZSBhYmxlIHRvIFtyZS1dc2V0IHRoZSBsaW5lLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgTGluZTogSW50ZWdlciByZWFkIEdldExpbmUgd3JpdGUgU2V0TGluZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAvLy8gbGluZSAoMC4uTi0xKS4gVG8gc3VwcG9ydCByZXdpbmRpbmcgY2hhcmFjdGVyIHN0cmVhbXMsIHdlIGFyZQorICAgIC8vLyBhYmxlIHRvIFtyZS1dc2V0IHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXIgcmVhZCBHZXRDaGFyUG9zaXRpb25JbkxpbmUgd3JpdGUgU2V0Q2hhclBvc2l0aW9uSW5MaW5lOworICBlbmQ7CisKKyAgSVRva2VuID0gaW50ZXJmYWNlKElBTlRMUkludGVyZmFjZSkKKyAgWyd7NzNCRjEyOUMtMkY0NS00QzY4LTgzOEUtQkY1RDM1MzZBQzZEfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldFRva2VuVHlwZTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5UeXBlKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRMaW5lOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRMaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENoYXJQb3NpdGlvbkluTGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q2hhbm5lbDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2hhbm5lbChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5JbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5JbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VGV4dDogU3RyaW5nOworICAgIHByb2NlZHVyZSBTZXRUZXh0KGNvbnN0IFZhbHVlOiBTdHJpbmcpOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKyAgICBwcm9wZXJ0eSBUb2tlblR5cGU6IEludGVnZXIgcmVhZCBHZXRUb2tlblR5cGUgd3JpdGUgU2V0VG9rZW5UeXBlOworCisgICAgLy8vIDxzdW1tYXJ5PlRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGlzIHRva2VuIHdhcyBtYXRjaGVkOyBsaW5lPTEuLk48L3N1bW1hcnk+CisgICAgcHJvcGVydHkgTGluZTogSW50ZWdlciByZWFkIEdldExpbmUgd3JpdGUgU2V0TGluZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5OLTEKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlciByZWFkIEdldENoYXJQb3NpdGlvbkluTGluZSB3cml0ZSBTZXRDaGFyUG9zaXRpb25JbkxpbmU7CisKKyAgICAvLy8gPHN1bW1hcnk+VGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoaXMgdG9rZW4gd2FzIG1hdGNoZWQ7IGxpbmU9MS4uTjwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBDaGFubmVsOiBJbnRlZ2VyIHJlYWQgR2V0Q2hhbm5lbCB3cml0ZSBTZXRDaGFubmVsOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBbiBpbmRleCBmcm9tIDAuLk4tMSBvZiB0aGUgdG9rZW4gb2JqZWN0IGluIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhpcyBtdXN0IGJlIHZhbGlkIGluIG9yZGVyIHRvIHVzZSB0aGUgQU5UTFJXb3JrcyBkZWJ1Z2dlci4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHByb3BlcnR5IFRva2VuSW5kZXg6IEludGVnZXIgcmVhZCBHZXRUb2tlbkluZGV4IHdyaXRlIFNldFRva2VuSW5kZXg7CisKKyAgICAvLy8gPHN1bW1hcnk+VGhlIHRleHQgb2YgdGhlIHRva2VuPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gV2hlbiBzZXR0aW5nIHRoZSB0ZXh0LCBpdCBtaWdodCBiZSBhIE5PUCBzdWNoIGFzIGZvciB0aGUgQ29tbW9uVG9rZW4sCisgICAgLy8vIHdoaWNoIGRvZXNuJ3QgaGF2ZSBzdHJpbmcgcG9pbnRlcnMsIGp1c3QgaW5kZXhlcyBpbnRvIGEgY2hhciBidWZmZXIuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9wZXJ0eSBUZXh0OiBTdHJpbmcgcmVhZCBHZXRUZXh0IHdyaXRlIFNldFRleHQ7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIHNvdXJjZSBvZiB0b2tlbnMgbXVzdCBwcm92aWRlIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIHZpYSBOZXh0VG9rZW4oKQorICAvLy8gYW5kIGFsc28gbXVzdCByZXZlYWwgaXQncyBzb3VyY2Ugb2YgY2hhcmFjdGVyczsgQ29tbW9uVG9rZW4ncyB0ZXh0IGlzCisgIC8vLyBjb21wdXRlZCBmcm9tIGEgQ2hhclN0cmVhbTsgaXQgb25seSBzdG9yZSBpbmRpY2VzIGludG8gdGhlIGNoYXIgc3RyZWFtLgorICAvLy8KKyAgLy8vIEVycm9ycyBmcm9tIHRoZSBsZXhlciBhcmUgbmV2ZXIgcGFzc2VkIHRvIHRoZSBwYXJzZXIuICBFaXRoZXIgeW91IHdhbnQKKyAgLy8vIHRvIGtlZXAgZ29pbmcgb3IgeW91IGRvIG5vdCB1cG9uIHRva2VuIHJlY29nbml0aW9uIGVycm9yLiAgSWYgeW91IGRvIG5vdAorICAvLy8gd2FudCB0byBjb250aW51ZSBsZXhpbmcgdGhlbiB5b3UgZG8gbm90IHdhbnQgdG8gY29udGludWUgcGFyc2luZy4gIEp1c3QKKyAgLy8vIHRocm93IGFuIGV4Y2VwdGlvbiBub3QgdW5kZXIgUmVjb2duaXRpb25FeGNlcHRpb24gYW5kIERlbHBoaSB3aWxsIG5hdHVyYWxseQorICAvLy8gdG9zcyB5b3UgYWxsIHRoZSB3YXkgb3V0IG9mIHRoZSByZWNvZ25pemVycy4gIElmIHlvdSB3YW50IHRvIGNvbnRpbnVlCisgIC8vLyBsZXhpbmcgdGhlbiB5b3Ugc2hvdWxkIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gdG8gdGhlIHBhcnNlci0taXQgaGFzIGFscmVhZHkKKyAgLy8vIHJlcXVlc3RlZCBhIHRva2VuLiAgS2VlcCBsZXhpbmcgdW50aWwgeW91IGdldCBhIHZhbGlkIG9uZS4gIEp1c3QgcmVwb3J0CisgIC8vLyBlcnJvcnMgYW5kIGtlZXAgZ29pbmcsIGxvb2tpbmcgZm9yIGEgdmFsaWQgdG9rZW4uCisgIC8vLyA8L3N1bW1hcnk+CisgIElUb2tlblNvdXJjZSA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezJDNzFGQUQwLUFFRUUtNDE3RC1CNTc2LTQwNTlGN0M0Q0VCNH0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRTb3VyY2VOYW1lOiBTdHJpbmc7CisKKyAgICB7IE1ldGhvZHMgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm5zIGEgVG9rZW4gb2JqZWN0IGZyb20gdGhlIGlucHV0IHN0cmVhbSAodXN1YWxseSBhIENoYXJTdHJlYW0pLgorICAgIC8vLyBEb2VzIG5vdCBmYWlsL3JldHVybiB1cG9uIGxleGluZyBlcnJvcjsganVzdCBrZWVwcyBjaGV3aW5nIG9uIHRoZQorICAgIC8vLyBjaGFyYWN0ZXJzIHVudGlsIGl0IGdldHMgYSBnb29kIG9uZTsgZXJyb3JzIGFyZSBub3QgcGFzc2VkIHRocm91Z2gKKyAgICAvLy8gdG8gdGhlIHBhcnNlci4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIE5leHRUb2tlbjogSVRva2VuOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHRva2VucyBmcm9tPyBub3JtYWxseSB0aGUgaW1wbGljYXRpb24gd2lsbCBzaW1wbHkKKyAgICAvLy8gYXNrIGxleGVycyBpbnB1dCBzdHJlYW0uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBTb3VyY2VOYW1lOiBTdHJpbmcgcmVhZCBHZXRTb3VyY2VOYW1lOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PkEgc3RyZWFtIG9mIHRva2VucyBhY2Nlc3NpbmcgdG9rZW5zIGZyb20gYSBUb2tlblNvdXJjZSA8L3N1bW1hcnk+CisgIElUb2tlblN0cmVhbSA9IGludGVyZmFjZShJSW50U3RyZWFtKQorICBbJ3s1OUU1QjM5RC0zMUE2LTQ5NkQtOUZBOS1BQzc1Q0M1ODRCNjh9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0VG9rZW5Tb3VyY2U6IElUb2tlblNvdXJjZTsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5Tb3VyY2UoY29uc3QgVmFsdWU6IElUb2tlblNvdXJjZSk7CisKKyAgICB7IE1ldGhvZHMgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBHZXQgVG9rZW4gYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgSSBhaGVhZCAod2hlcmUgST0xIGlzIG5leHQKKyAgICAvLy8gVG9rZW4pLgorICAgIC8vLyBJICZsdDsgMCBpbmRpY2F0ZXMgdG9rZW5zIGluIHRoZSBwYXN0LiAgU28gLTEgaXMgcHJldmlvdXMgdG9rZW4gYW5kIC0yIGlzCisgICAgLy8vIHR3byB0b2tlbnMgYWdvLiBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgST49TiwgcmV0dXJuIFRva2VuLkVPRlRva2VuLgorICAgIC8vLyBSZXR1cm4gbnVsbCBmb3IgTFQoMCkgYW5kIGFueSBpbmRleCB0aGF0IHJlc3VsdHMgaW4gYW4gYWJzb2x1dGUgYWRkcmVzcworICAgIC8vLyB0aGF0IGlzIG5lZ2F0aXZlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gTFQoY29uc3QgSzogSW50ZWdlcik6IElUb2tlbjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2V0IGEgdG9rZW4gYXQgYW4gYWJzb2x1dGUgaW5kZXggSTsgMC4uTi0xLiAgVGhpcyBpcyByZWFsbHkgb25seQorICAgIC8vLyBuZWVkZWQgZm9yIHByb2ZpbGluZyBhbmQgZGVidWdnaW5nIGFuZCB0b2tlbiBzdHJlYW0gcmV3cml0aW5nLgorICAgIC8vLyBJZiB5b3UgZG9uJ3Qgd2FudCB0byBidWZmZXIgdXAgdG9rZW5zLCB0aGVuIHRoaXMgbWV0aG9kIG1ha2VzIG5vCisgICAgLy8vIHNlbnNlIGZvciB5b3UuICBOYXR1cmFsbHkgeW91IGNhbid0IHVzZSB0aGUgcmV3cml0ZSBzdHJlYW0gZmVhdHVyZS4KKyAgICAvLy8gSSBiZWxpZXZlIERlYnVnVG9rZW5TdHJlYW0gY2FuIGVhc2lseSBiZSBhbHRlcmVkIHRvIG5vdCB1c2UKKyAgICAvLy8gdGhpcyBtZXRob2QsIHJlbW92aW5nIHRoZSBkZXBlbmRlbmN5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0KGNvbnN0IEk6IEludGVnZXIpOiBJVG9rZW47CisKKyAgICAvLy8gPHN1bW1hcnk+UmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgICAgLy8vIElmIHRoZSBzdHJlYW0gZG9lcyBub3QgYnVmZmVyIGFsbCB0aGUgdG9rZW5zIHRoZW4gaXQgY2FuIGp1c3QKKyAgICAvLy8gcmV0dXJuICcnOyAgVXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgICAgLy8vIGFuIGFjdGlvbiBvZiBjb3Vyc2UgaW4gdGhhdCBjYXNlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gVG9TdHJpbmcoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXIpOiBTdHJpbmc7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PkJlY2F1c2UgdGhlIHVzZXIgaXMgbm90IHJlcXVpcmVkIHRvIHVzZSBhIHRva2VuIHdpdGggYW4gaW5kZXggc3RvcmVkCisgICAgLy8vIGluIGl0LCB3ZSBtdXN0IHByb3ZpZGUgYSBtZWFucyBmb3IgdHdvIHRva2VuIG9iamVjdHMgdGhlbXNlbHZlcyB0bworICAgIC8vLyBpbmRpY2F0ZSB0aGUgc3RhcnQvZW5kIGxvY2F0aW9uLiAgTW9zdCBvZnRlbiB0aGlzIHdpbGwganVzdCBkZWxlZ2F0ZQorICAgIC8vLyB0byB0aGUgb3RoZXIgVG9TdHJpbmcoSW50ZWdlcixJbnRlZ2VyKS4gIFRoaXMgaXMgYWxzbyBwYXJhbGxlbCB3aXRoCisgICAgLy8vIHRoZSBUcmVlTm9kZVN0cmVhbS5Ub1N0cmluZyhPYmplY3QsT2JqZWN0KS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJVG9rZW4pOiBTdHJpbmc7IG92ZXJsb2FkOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKyAgICBwcm9wZXJ0eSBUb2tlblNvdXJjZTogSVRva2VuU291cmNlIHJlYWQgR2V0VG9rZW5Tb3VyY2Ugd3JpdGUgU2V0VG9rZW5Tb3VyY2U7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGlzIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiBhIHN0cmVhbS4KKyAgLy8vCisgIC8vLyBXaGVuIHdhbGtpbmcgYWhlYWQgd2l0aCBjeWNsaWMgREZBIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcywgd2UKKyAgLy8vIG5lZWQgdG8gcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgc3RyZWFtIChjaGFyIGluZGV4LCBsaW5lLAorICAvLy8gZXRjLi4uKSBzbyB0aGF0IHdlIGNhbiByZXdpbmQgdGhlIHN0YXRlIGFmdGVyIHNjYW5uaW5nIGFoZWFkLgorICAvLy8gPC9zdW1tYXJ5PgorICBJQ2hhclN0cmVhbVN0YXRlID0gaW50ZXJmYWNlKElBTlRMUkludGVyZmFjZSkKKyAgWyd7NjJEMkExQ0QtRUQzQS00Qzk1LUEzNjYtQUI4RjJFNTQwNjBCfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldFA6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFAoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldExpbmU6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldExpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2hhclBvc2l0aW9uSW5MaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgLy8vIDxzdW1tYXJ5PkluZGV4IGludG8gdGhlIGNoYXIgc3RyZWFtIG9mIG5leHQgbG9va2FoZWFkIGNoYXIgPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFA6IEludGVnZXIgcmVhZCBHZXRQIHdyaXRlIFNldFA7CisKKyAgICAvLy8gPHN1bW1hcnk+V2hhdCBsaW5lIG51bWJlciBpcyB0aGUgc2Nhbm5lciBhdCBiZWZvcmUgcHJvY2Vzc2luZyBidWZmZXJbUF0/IDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBMaW5lOiBJbnRlZ2VyIHJlYWQgR2V0TGluZSB3cml0ZSBTZXRMaW5lOworCisgICAgLy8vIDxzdW1tYXJ5PldoYXQgY2hhciBwb3NpdGlvbiAwLi5OLTEgaW4gbGluZSBpcyBzY2FubmVyIGJlZm9yZSBwcm9jZXNzaW5nIGJ1ZmZlcltQXT8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlciByZWFkIEdldENoYXJQb3NpdGlvbkluTGluZSB3cml0ZSBTZXRDaGFyUG9zaXRpb25JbkxpbmU7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIHByZXR0eSBxdWljayA8c2VlIGNyZWY9IklDaGFyU3RyZWFtIi8+IHRoYXQgdXNlcyBhIGNoYXJhY3RlciBhcnJheQorICAvLy8gZGlyZWN0bHkgYXMgaXQncyB1bmRlcmx5aW5nIHNvdXJjZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSUFOVExSU3RyaW5nU3RyZWFtID0gaW50ZXJmYWNlKElDaGFyU3RyZWFtKQorICBbJ3syRkEyNDI5OS1GRjk3LTRBQjYtOENBNi01RDNEQTEzQzRBQjJ9J10KKyAgICB7IE1ldGhvZHMgfQorCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXNldHMgdGhlIHN0cmVhbSBzbyB0aGF0IGl0IGlzIGluIHRoZSBzYW1lIHN0YXRlIGl0IHdhcworICAgIC8vLyB3aGVuIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgKmV4Y2VwdCogdGhlIGRhdGEgYXJyYXkgaXMgbm90CisgICAgLy8vIHRvdWNoZWQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgY2hhcmFjdGVyIHN0cmVhbSAtIGFuIDxzZWUgY3JlZj0iSUNoYXJTdHJlYW0iLz4gLSB0aGF0IGxvYWRzCisgIC8vLyBhbmQgY2FjaGVzIHRoZSBjb250ZW50cyBvZiBpdCdzIHVuZGVybHlpbmcgZmlsZSBmdWxseSBkdXJpbmcKKyAgLy8vIG9iamVjdCBjb25zdHJ1Y3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gVGhpcyBsb29rcyB2ZXJ5IG11Y2ggbGlrZSBhbiBBTlRMUmVhZGVyU3RyZWFtIG9yIGFuIEFOVExSSW5wdXRTdHJlYW0KKyAgLy8vIGJ1dCwgaXQgaXMgYSBzcGVjaWFsIGNhc2UuIFNpbmNlIHdlIGtub3cgdGhlIGV4YWN0IHNpemUgb2YgdGhlIGZpbGUgdG8KKyAgLy8vIGxvYWQsIHdlIGNhbiBhdm9pZCBsb3RzIG9mIGRhdGEgY29weWluZyBhbmQgYnVmZmVyIHJlc2l6aW5nLgorICAvLy8gPC9yZW1hcmtzPgorICBJQU5UTFJGaWxlU3RyZWFtID0gaW50ZXJmYWNlKElBTlRMUlN0cmluZ1N0cmVhbSkKKyAgWyd7MkIwMTQ1REItMkRBQS00OEEwLTgzMTYtQjQ3QTY5RURERDFBfSddCisgICAgeyBNZXRob2RzIH0KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gTG9hZHMgYW5kIGJ1ZmZlcnMgdGhlIHNwZWNpZmllZCBmaWxlIHRvIGJlIHVzZWQgYXMgdGhpcworICAgIC8vLyBBTlRMUkZpbGVTdHJlYW0ncyBzb3VyY2UKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iRmlsZU5hbWUiPkZpbGUgdG8gbG9hZDwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJFbmNvZGluZyI+RW5jb2RpbmcgdG8gYXBwbHkgdG8gZmlsZTwvcGFyYW0+CisgICAgcHJvY2VkdXJlIExvYWQoY29uc3QgRmlsZU5hbWU6IFN0cmluZzsgY29uc3QgRW5jb2Rpbmc6IFRFbmNvZGluZyk7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIHN0cmlwcGVkLWRvd24gdmVyc2lvbiBvZiBvcmcuYW50bHIubWlzYy5CaXRTZXQgdGhhdCBpcyBqdXN0CisgIC8vLyBnb29kIGVub3VnaCB0byBoYW5kbGUgcnVudGltZSByZXF1aXJlbWVudHMgc3VjaCBhcyBGT0xMT1cgc2V0cworICAvLy8gZm9yIGF1dG9tYXRpYyBlcnJvciByZWNvdmVyeS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSUJpdFNldCA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsne0YyMDQ1MDQ1LUZDNDYtNDc3OS1BNjVELTU2QzY1RDI1N0E4RX0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRJc05pbDogQm9vbGVhbjsKKworICAgIHsgTWV0aG9kcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+cmV0dXJuICJ0aGlzIG9yIGEiIGluIGEgbmV3IHNldCA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gQml0U2V0T3IoY29uc3QgQTogSUJpdFNldCk6IElCaXRTZXQ7CisKKyAgICAvLy8gPHN1bW1hcnk+T3IgdGhpcyBlbGVtZW50IGludG8gdGhpcyBzZXQgKGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlKTwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgQWRkKGNvbnN0IEVsOiBJbnRlZ2VyKTsKKworICAgIC8vLyA8c3VtbWFyeT4gR3Jvd3MgdGhlIHNldCB0byBhIGxhcmdlciBudW1iZXIgb2YgYml0cy48L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJiaXQiPmVsZW1lbnQgdGhhdCBtdXN0IGZpdCBpbiBzZXQKKyAgICAvLy8gPC9wYXJhbT4KKyAgICBwcm9jZWR1cmUgR3Jvd1RvSW5jbHVkZShjb25zdCBCaXQ6IEludGVnZXIpOworCisgICAgcHJvY2VkdXJlIE9ySW5QbGFjZShjb25zdCBBOiBJQml0U2V0KTsKKyAgICBmdW5jdGlvbiBTaXplOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIE1lbWJlcihjb25zdCBFbDogSW50ZWdlcik6IEJvb2xlYW47CisKKyAgICAvLyByZW1vdmUgdGhpcyBlbGVtZW50IGZyb20gdGhpcyBzZXQKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEVsOiBJbnRlZ2VyKTsKKworICAgIGZ1bmN0aW9uIE51bUJpdHM6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+cmV0dXJuIGhvdyBtdWNoIHNwYWNlIGlzIGJlaW5nIHVzZWQgYnkgdGhlIGJpdHMgYXJyYXkgbm90CisgICAgLy8vIGhvdyBtYW55IGFjdHVhbGx5IGhhdmUgbWVtYmVyIGJpdHMgb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBMZW5ndGhJbkxvbmdXb3JkczogSW50ZWdlcjsKKworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRJbnRlZ2VyQXJyYXk7CisgICAgZnVuY3Rpb24gVG9QYWNrZWRBcnJheTogVFVJbnQ2NEFycmF5OworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gVG9TdHJpbmcoY29uc3QgVG9rZW5OYW1lczogVFN0cmluZ0FycmF5KTogU3RyaW5nOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBFcXVhbHMoT2JqOiBUT2JqZWN0KTogQm9vbGVhbjsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgSXNOaWw6IEJvb2xlYW4gcmVhZCBHZXRJc05pbDsKKyAgZW5kOworICBUQml0U2V0QXJyYXkgPSBhcnJheSBvZiBJQml0U2V0OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBzZXQgb2YgZmllbGRzIG5lZWRlZCBieSBhbiBhYnN0cmFjdCByZWNvZ25pemVyIHRvIHJlY29nbml6ZSBpbnB1dAorICAvLy8gYW5kIHJlY292ZXIgZnJvbSBlcnJvcnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gQXMgYSBzZXBhcmF0ZSBzdGF0ZSBvYmplY3QsIGl0IGNhbiBiZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgZ3JhbW1hcnM7CisgIC8vLyBlLmcuLCB3aGVuIG9uZSBncmFtbWFyIGltcG9ydHMgYW5vdGhlci4KKyAgLy8vIFRoZXNlIGZpZWxkcyBhcmUgcHVibGljbHkgdmlzaWJsZSBidXQgdGhlIGFjdHVhbCBzdGF0ZSBwb2ludGVyIHBlcgorICAvLy8gcGFyc2VyIGlzIHByb3RlY3RlZC4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgSVJlY29nbml6ZXJTaGFyZWRTdGF0ZSA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezZDQjZFMTdBLTBCMDEtNEFBNy04RDQ5LTU3NDJBM0NCODkwMX0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRGb2xsb3dpbmc6IFRCaXRTZXRBcnJheTsKKyAgICBwcm9jZWR1cmUgU2V0Rm9sbG93aW5nKGNvbnN0IFZhbHVlOiBUQml0U2V0QXJyYXkpOworICAgIGZ1bmN0aW9uIEdldEZvbGxvd2luZ1N0YWNrUG9pbnRlcjogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Rm9sbG93aW5nU3RhY2tQb2ludGVyKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRFcnJvclJlY292ZXJ5OiBCb29sZWFuOworICAgIHByb2NlZHVyZSBTZXRFcnJvclJlY292ZXJ5KGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRMYXN0RXJyb3JJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0TGFzdEVycm9ySW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEZhaWxlZDogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgU2V0RmFpbGVkKGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRTeW50YXhFcnJvcnM6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFN5bnRheEVycm9ycyhjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0QmFja3RyYWNraW5nOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRCYWNrdHJhY2tpbmcoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFJ1bGVNZW1vOiBURGljdGlvbmFyeUFycmF5PEludGVnZXIsIEludGVnZXI+OworICAgIGZ1bmN0aW9uIEdldFJ1bGVNZW1vQ291bnQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFJ1bGVNZW1vQ291bnQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFRva2VuOiBJVG9rZW47CisgICAgcHJvY2VkdXJlIFNldFRva2VuKGNvbnN0IFZhbHVlOiBJVG9rZW4pOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RhcnRDaGFySW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RhcnRDaGFySW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RhcnRMaW5lOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRUb2tlblN0YXJ0TGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q2hhbm5lbDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2hhbm5lbChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRUb2tlblR5cGUoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFRleHQ6IFN0cmluZzsKKyAgICBwcm9jZWR1cmUgU2V0VGV4dChjb25zdCBWYWx1ZTogU3RyaW5nKTsKKworICAgIHsgUHJvcGVydGllcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRyYWNrcyB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhbnkgcnVsZSBpbnZvY2F0aW9uLgorICAgIC8vLyBTdGFjayBncm93cyB1cHdhcmRzLiAgV2hlbiBpdCBoaXRzIHRoZSBtYXgsIGl0IGdyb3dzIDJ4IGluIHNpemUKKyAgICAvLy8gYW5kIGtlZXBzIGdvaW5nLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgRm9sbG93aW5nOiBUQml0U2V0QXJyYXkgcmVhZCBHZXRGb2xsb3dpbmcgd3JpdGUgU2V0Rm9sbG93aW5nOworICAgIHByb3BlcnR5IEZvbGxvd2luZ1N0YWNrUG9pbnRlcjogSW50ZWdlciByZWFkIEdldEZvbGxvd2luZ1N0YWNrUG9pbnRlciB3cml0ZSBTZXRGb2xsb3dpbmdTdGFja1BvaW50ZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoaXMgaXMgdHJ1ZSB3aGVuIHdlIHNlZSBhbiBlcnJvciBhbmQgYmVmb3JlIGhhdmluZyBzdWNjZXNzZnVsbHkKKyAgICAvLy8gbWF0Y2hlZCBhIHRva2VuLiAgUHJldmVudHMgZ2VuZXJhdGlvbiBvZiBtb3JlIHRoYW4gb25lIGVycm9yIG1lc3NhZ2UKKyAgICAvLy8gcGVyIGVycm9yLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgRXJyb3JSZWNvdmVyeTogQm9vbGVhbiByZWFkIEdldEVycm9yUmVjb3Zlcnkgd3JpdGUgU2V0RXJyb3JSZWNvdmVyeTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGluZGV4IGludG8gdGhlIGlucHV0IHN0cmVhbSB3aGVyZSB0aGUgbGFzdCBlcnJvciBvY2N1cnJlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlcmUgYW4gZXJyb3IgaXMgZm91bmQKKyAgICAvLy8gYnV0IG5vIHRva2VuIGlzIGNvbnN1bWVkIGR1cmluZyByZWNvdmVyeS4uLmFub3RoZXIgZXJyb3IgaXMgZm91bmQsCisgICAgLy8vIGFkIG5hc2V1bS4gIFRoaXMgaXMgYSBmYWlsc2FmZSBtZWNoYW5pc20gdG8gZ3VhcmFudGVlIHRoYXQgYXQgbGVhc3QKKyAgICAvLy8gb25lIHRva2VuL3RyZWUgbm9kZSBpcyBjb25zdW1lZCBmb3IgdHdvIGVycm9ycy4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHByb3BlcnR5IExhc3RFcnJvckluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0TGFzdEVycm9ySW5kZXggd3JpdGUgU2V0TGFzdEVycm9ySW5kZXg7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluIGxpZXUgb2YgYSByZXR1cm4gdmFsdWUsIHRoaXMgaW5kaWNhdGVzIHRoYXQgYSBydWxlIG9yIHRva2VuCisgICAgLy8vIGhhcyBmYWlsZWQgdG8gbWF0Y2guICBSZXNldCB0byBmYWxzZSB1cG9uIHZhbGlkIHRva2VuIG1hdGNoLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgRmFpbGVkOiBCb29sZWFuIHJlYWQgR2V0RmFpbGVkIHdyaXRlIFNldEZhaWxlZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRGlkIHRoZSByZWNvZ25pemVyIGVuY291bnRlciBhIHN5bnRheCBlcnJvcj8gIFRyYWNrIGhvdyBtYW55LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgU3ludGF4RXJyb3JzOiBJbnRlZ2VyIHJlYWQgR2V0U3ludGF4RXJyb3JzIHdyaXRlIFNldFN5bnRheEVycm9yczsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSWYgMCwgbm8gYmFja3RyYWNraW5nIGlzIGdvaW5nIG9uLiAgU2FmZSB0byBleGVjIGFjdGlvbnMgZXRjLi4uCisgICAgLy8vIElmID4wIHRoZW4gaXQncyB0aGUgbGV2ZWwgb2YgYmFja3RyYWNraW5nLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgQmFja3RyYWNraW5nOiBJbnRlZ2VyIHJlYWQgR2V0QmFja3RyYWNraW5nIHdyaXRlIFNldEJhY2t0cmFja2luZzsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXJyYXlbc2l6ZSBudW0gcnVsZXNdIG9mIE1hcCZsdDtJbnRlZ2VyLEludGVnZXImZ3Q7IHRoYXQgdHJhY2tzCisgICAgLy8vIHRoZSBzdG9wIHRva2VuIGluZGV4IGZvciBlYWNoIHJ1bGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vICBSdWxlTWVtb1tSdWxlSW5kZXhdIGlzIHRoZSBtZW1vaXphdGlvbiB0YWJsZSBmb3IgUnVsZUluZGV4LgorICAgIC8vLyAgRm9yIGtleSBSdWxlU3RhcnRJbmRleCwgeW91IGdldCBiYWNrIHRoZSBzdG9wIHRva2VuIGZvcgorICAgIC8vLyAgYXNzb2NpYXRlZCBydWxlIG9yIE1FTU9fUlVMRV9GQUlMRUQuCisgICAgLy8vCisgICAgLy8vICBUaGlzIGlzIG9ubHkgdXNlZCBpZiBydWxlIG1lbW9pemF0aW9uIGlzIG9uICh3aGljaCBpdCBpcyBieSBkZWZhdWx0KS4KKyAgICAvLy8gIDwvcmVtYXJrcz4KKyAgICBwcm9wZXJ0eSBSdWxlTWVtbzogVERpY3Rpb25hcnlBcnJheTxJbnRlZ2VyLCBJbnRlZ2VyPiByZWFkIEdldFJ1bGVNZW1vOworICAgIHByb3BlcnR5IFJ1bGVNZW1vQ291bnQ6IEludGVnZXIgcmVhZCBHZXRSdWxlTWVtb0NvdW50IHdyaXRlIFNldFJ1bGVNZW1vQ291bnQ7CisKKyAgICAvLyBMZXhlciBTcGVjaWZpYyBNZW1iZXJzCisgICAgLy8gTEVYRVIgRklFTERTIChtdXN0IGJlIGluIHNhbWUgc3RhdGUgb2JqZWN0IHRvIGF2b2lkIGNhc3RpbmcKKyAgICAvLyAgICAgICAgICAgICAgIGNvbnN0YW50bHkgaW4gZ2VuZXJhdGVkIGNvZGUgYW5kIExleGVyIG9iamVjdCkgOigKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVG9rZW4gb2JqZWN0IG5vcm1hbGx5IHJldHVybmVkIGJ5IE5leHRUb2tlbigpIGFmdGVyIG1hdGNoaW5nIGxleGVyIHJ1bGVzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGUgZ29hbCBvZiBhbGwgbGV4ZXIgcnVsZXMvbWV0aG9kcyBpcyB0byBjcmVhdGUgYSB0b2tlbiBvYmplY3QuCisgICAgLy8vIFRoaXMgaXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYXMgbXVsdGlwbGUgcnVsZXMgbWF5IGNvbGxhYm9yYXRlIHRvCisgICAgLy8vIGNyZWF0ZSBhIHNpbmdsZSB0b2tlbi4gIE5leHRUb2tlbiB3aWxsIHJldHVybiB0aGlzIG9iamVjdCBhZnRlcgorICAgIC8vLyBtYXRjaGluZyBsZXhlciBydWxlKHMpLiAgSWYgeW91IHN1YmNsYXNzIHRvIGFsbG93IG11bHRpcGxlIHRva2VuCisgICAgLy8vIGVtaXNzaW9ucywgdGhlbiBzZXQgdGhpcyB0byB0aGUgbGFzdCB0b2tlbiB0byBiZSBtYXRjaGVkIG9yCisgICAgLy8vIHNvbWV0aGluZyBub25udWxsIHNvIHRoYXQgdGhlIGF1dG8gdG9rZW4gZW1pdCBtZWNoYW5pc20gd2lsbCBub3QKKyAgICAvLy8gZW1pdCBhbm90aGVyIHRva2VuLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgcHJvcGVydHkgVG9rZW46IElUb2tlbiByZWFkIEdldFRva2VuIHdyaXRlIFNldFRva2VuOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBXaGF0IGNoYXJhY3RlciBpbmRleCBpbiB0aGUgc3RyZWFtIGRpZCB0aGUgY3VycmVudCB0b2tlbiBzdGFydCBhdD8KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gTmVlZGVkLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSB0ZXh0IGZvciBjdXJyZW50IHRva2VuLiAgU2V0IGF0CisgICAgLy8vIHRoZSBzdGFydCBvZiBuZXh0VG9rZW4uCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9wZXJ0eSBUb2tlblN0YXJ0Q2hhckluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0VG9rZW5TdGFydENoYXJJbmRleCB3cml0ZSBTZXRUb2tlblN0YXJ0Q2hhckluZGV4OworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgbGluZSBvbiB3aGljaCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB0b2tlbiByZXNpZGVzCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUb2tlblN0YXJ0TGluZTogSW50ZWdlciByZWFkIEdldFRva2VuU3RhcnRMaW5lIHdyaXRlIFNldFRva2VuU3RhcnRMaW5lOworCisgICAgLy8vIDxzdW1tYXJ5PlRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgZmlyc3QgY2hhcmFjdGVyIHdpdGhpbiB0aGUgbGluZTwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUb2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyIHJlYWQgR2V0VG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSB3cml0ZSBTZXRUb2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworCisgICAgLy8vIDxzdW1tYXJ5PlRoZSBjaGFubmVsIG51bWJlciBmb3IgdGhlIGN1cnJlbnQgdG9rZW48L3N1bW1hcnk+CisgICAgcHJvcGVydHkgQ2hhbm5lbDogSW50ZWdlciByZWFkIEdldENoYW5uZWwgd3JpdGUgU2V0Q2hhbm5lbDsKKworICAgIC8vLyA8c3VtbWFyeT5UaGUgdG9rZW4gdHlwZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW48L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVG9rZW5UeXBlOiBJbnRlZ2VyIHJlYWQgR2V0VG9rZW5UeXBlIHdyaXRlIFNldFRva2VuVHlwZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gWW91IGNhbiBzZXQgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHRva2VuIHRvIG92ZXJyaWRlIHdoYXQgaXMgaW4KKyAgICAvLy8gdGhlIGlucHV0IGNoYXIgYnVmZmVyLiAgVXNlIHNldFRleHQoKSBvciBjYW4gc2V0IHRoaXMgaW5zdGFuY2UgdmFyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVGV4dDogU3RyaW5nIHJlYWQgR2V0VGV4dCB3cml0ZSBTZXRUZXh0OworICBlbmQ7CisKKyAgSUNvbW1vblRva2VuID0gaW50ZXJmYWNlKElUb2tlbikKKyAgWyd7MDZCMUIwQzMtMkEwRC00NzdBLUFFMzAtNDE0RjUxQUNFOEEwfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldFN0YXJ0SW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFN0b3BJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U3RvcEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJbnB1dFN0cmVhbTogSUNoYXJTdHJlYW07CisgICAgcHJvY2VkdXJlIFNldElucHV0U3RyZWFtKGNvbnN0IFZhbHVlOiBJQ2hhclN0cmVhbSk7CisKKyAgICB7IE1ldGhvZHMgfQorICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7CisKKyAgICB7IFByb3BlcnRpZXMgfQorICAgIHByb3BlcnR5IFN0YXJ0SW5kZXg6IEludGVnZXIgcmVhZCBHZXRTdGFydEluZGV4IHdyaXRlIFNldFN0YXJ0SW5kZXg7CisgICAgcHJvcGVydHkgU3RvcEluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0U3RvcEluZGV4IHdyaXRlIFNldFN0b3BJbmRleDsKKyAgICBwcm9wZXJ0eSBJbnB1dFN0cmVhbTogSUNoYXJTdHJlYW0gcmVhZCBHZXRJbnB1dFN0cmVhbSB3cml0ZSBTZXRJbnB1dFN0cmVhbTsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgVG9rZW4gb2JqZWN0IGxpa2Ugd2UnZCB1c2UgaW4gQU5UTFIgMi54OyBoYXMgYW4gYWN0dWFsIHN0cmluZyBjcmVhdGVkCisgIC8vLyBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiAgVGhlc2Ugb2JqZWN0cyBhcmUgbmVlZGVkIGZvciBpbWFnaW5hcnkKKyAgLy8vIHRyZWUgbm9kZXMgdGhhdCBoYXZlIHBheWxvYWQgb2JqZWN0cy4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgVG9rZW4gb2JqZWN0CisgIC8vLyB0aGF0IGhhcyBhIHN0cmluZzsgdGhlIHRyZWUgbm9kZSB3aWxsIHBvaW50IGF0IHRoaXMgdG9rZW4uICBDb21tb25Ub2tlbgorICAvLy8gaGFzIGluZGV4ZXMgaW50byBhIGNoYXIgc3RyZWFtIGFuZCBoZW5jZSBjYW5ub3QgYmUgdXNlZCB0byBpbnRyb2R1Y2UKKyAgLy8vIG5ldyBzdHJpbmdzLgorICAvLy8gPC9zdW1tYXJ5PgorICBJQ2xhc3NpY1Rva2VuID0gaW50ZXJmYWNlKElUb2tlbikKKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRUb2tlblR5cGUoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldExpbmU6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldExpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2hhclBvc2l0aW9uSW5MaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDaGFubmVsOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDaGFubmVsKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRUb2tlbkluZGV4OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRUb2tlbkluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRUZXh0OiBTdHJpbmc7CisgICAgcHJvY2VkdXJlIFNldFRleHQoY29uc3QgVmFsdWU6IFN0cmluZyk7CisgICAgZnVuY3Rpb24gR2V0SW5wdXRTdHJlYW06IElDaGFyU3RyZWFtOworICAgIHByb2NlZHVyZSBTZXRJbnB1dFN0cmVhbShjb25zdCBWYWx1ZTogSUNoYXJTdHJlYW0pOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKyAgICBwcm9wZXJ0eSBUb2tlblR5cGU6IEludGVnZXIgcmVhZCBHZXRUb2tlblR5cGUgd3JpdGUgU2V0VG9rZW5UeXBlOworICAgIHByb3BlcnR5IExpbmU6IEludGVnZXIgcmVhZCBHZXRMaW5lIHdyaXRlIFNldExpbmU7CisgICAgcHJvcGVydHkgQ2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyIHJlYWQgR2V0Q2hhclBvc2l0aW9uSW5MaW5lIHdyaXRlIFNldENoYXJQb3NpdGlvbkluTGluZTsKKyAgICBwcm9wZXJ0eSBDaGFubmVsOiBJbnRlZ2VyIHJlYWQgR2V0Q2hhbm5lbCB3cml0ZSBTZXRDaGFubmVsOworICAgIHByb3BlcnR5IFRva2VuSW5kZXg6IEludGVnZXIgcmVhZCBHZXRUb2tlbkluZGV4IHdyaXRlIFNldFRva2VuSW5kZXg7CisgICAgcHJvcGVydHkgVGV4dDogU3RyaW5nIHJlYWQgR2V0VGV4dCB3cml0ZSBTZXRUZXh0OworICAgIHByb3BlcnR5IElucHV0U3RyZWFtOiBJQ2hhclN0cmVhbSByZWFkIEdldElucHV0U3RyZWFtIHdyaXRlIFNldElucHV0U3RyZWFtOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBnZW5lcmljIHJlY29nbml6ZXIgdGhhdCBjYW4gaGFuZGxlIHJlY29nbml6ZXJzIGdlbmVyYXRlZCBmcm9tCisgIC8vLyBsZXhlciwgcGFyc2VyLCBhbmQgdHJlZSBncmFtbWFycy4gIFRoaXMgaXMgYWxsIHRoZSBwYXJzaW5nCisgIC8vLyBzdXBwb3J0IGNvZGUgZXNzZW50aWFsbHk7IG1vc3Qgb2YgaXQgaXMgZXJyb3IgcmVjb3Zlcnkgc3R1ZmYgYW5kCisgIC8vLyBiYWNrdHJhY2tpbmcuCisgIC8vLyA8L3N1bW1hcnk+CisgIElCYXNlUmVjb2duaXplciA9IGludGVyZmFjZShJQU5UTFJPYmplY3QpCisgIFsnezkwODEzQ0UyLTYxNEItNDc3My1BMjZFLTkzNkU3REU3RTlFOX0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRJbnB1dDogSUludFN0cmVhbTsKKyAgICBmdW5jdGlvbiBHZXRCYWNrdHJhY2tpbmdMZXZlbDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRTdGF0ZTogSVJlY29nbml6ZXJTaGFyZWRTdGF0ZTsKKyAgICBmdW5jdGlvbiBHZXROdW1iZXJPZlN5bnRheEVycm9yczogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRHcmFtbWFyRmlsZU5hbWU6IFN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRTb3VyY2VOYW1lOiBTdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5OYW1lczogVFN0cmluZ0FycmF5OworCisgICAgeyBNZXRob2RzIH0KKyAgICBwcm9jZWR1cmUgQmVnaW5CYWNrdHJhY2soY29uc3QgTGV2ZWw6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBFbmRCYWNrdHJhY2soY29uc3QgTGV2ZWw6IEludGVnZXI7IGNvbnN0IFN1Y2Nlc3NmdWw6IEJvb2xlYW4pOworCisgICAgLy8vIDxzdW1tYXJ5PlJlc2V0IHRoZSBwYXJzZXIncyBzdGF0ZS4gU3ViY2xhc3NlcyBtdXN0IHJld2luZCB0aGUgaW5wdXQgc3RyZWFtLjwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIE1hdGNoIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFnYWluc3QgdHR5cGUuICBBdHRlbXB0CisgICAgLy8vIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IgcmVjb3ZlcnkuICBJZgorICAgIC8vLyB0aGF0IGZhaWxzLCB0aHJvdyBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUbyB0dXJuIG9mZiBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIGVycm9yCisgICAgLy8vIHJlY292ZXJ5LCBvdmVycmlkZSBNaXNtYXRjaFJlY292ZXIoKSBhbmQgaGF2ZSBpdCBjYWxsCisgICAgLy8vIHBsYWluIE1pc21hdGNoKCksIHdoaWNoIGRvZXMgbm90IHJlY292ZXIuIFRoZW4gYW55IGVycm9yCisgICAgLy8vIGluIGEgcnVsZSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBhbmQgaW1tZWRpYXRlIGV4aXQgZnJvbQorICAgIC8vLyBydWxlLiBSdWxlIHdvdWxkIHJlY292ZXIgYnkgcmVzeW5jaHJvbml6aW5nIHRvIHRoZSBzZXQgb2YKKyAgICAvLy8gc3ltYm9scyB0aGF0IGNhbiBmb2xsb3cgcnVsZSByZWYuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBNYXRjaChjb25zdCBJbnB1dDogSUludFN0cmVhbTsgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICAgICAgY29uc3QgRm9sbG93OiBJQml0U2V0KTogSUFOVExSSW50ZXJmYWNlOworCisgICAgZnVuY3Rpb24gTWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4oY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07CisgICAgICBjb25zdCBUb2tlblR5cGU6IEludGVnZXIpOiBCb29sZWFuOworCisgICAgZnVuY3Rpb24gTWlzbWF0Y2hJc01pc3NpbmdUb2tlbihjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgICAgIGNvbnN0IEZvbGxvdzogSUJpdFNldCk6IEJvb2xlYW47CisKKyAgICAvLy8gPHN1bW1hcnk+QSBob29rIHRvIGxpc3RlbiBpbiBvbiB0aGUgdG9rZW4gY29uc3VtcHRpb24gZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorICAgIC8vLyBUaGUgRGVidWdQYXJzZXIgc3ViY2xhc3NlcyB0aGlzIHRvIGZpcmUgZXZlbnRzIHRvIHRoZSBsaXN0ZW50ZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgQmVnaW5SZXN5bmM7CisgICAgcHJvY2VkdXJlIEVuZFJlc3luYzsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVwb3J0IGEgcmVjb2duaXRpb24gcHJvYmxlbS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gVGhpcyBtZXRob2Qgc2V0cyBlcnJvclJlY292ZXJ5IHRvIGluZGljYXRlIHRoZSBwYXJzZXIgaXMgcmVjb3ZlcmluZworICAgIC8vLyBub3QgcGFyc2luZy4gIE9uY2UgaW4gcmVjb3ZlcnkgbW9kZSwgbm8gZXJyb3JzIGFyZSBnZW5lcmF0ZWQuCisgICAgLy8vIFRvIGdldCBvdXQgb2YgcmVjb3ZlcnkgbW9kZSwgdGhlIHBhcnNlciBtdXN0IHN1Y2Nlc3NmdWxseSBNYXRjaAorICAgIC8vLyBhIHRva2VuIChhZnRlciBhIHJlc3luYykuICBTbyBpdCB3aWxsIGdvOgorICAgIC8vLworICAgIC8vLyAxLiBlcnJvciBvY2N1cnMKKyAgICAvLy8gMi4gZW50ZXIgcmVjb3ZlcnkgbW9kZSwgcmVwb3J0IGVycm9yCisgICAgLy8vIDMuIGNvbnN1bWUgdW50aWwgdG9rZW4gZm91bmQgaW4gcmVzeW5jaCBzZXQKKyAgICAvLy8gNC4gdHJ5IHRvIHJlc3VtZSBwYXJzaW5nCisgICAgLy8vIDUuIG5leHQgTWF0Y2goKSB3aWxsIHJlc2V0IGVycm9yUmVjb3ZlcnkgbW9kZQorICAgIC8vLworICAgIC8vLyBJZiB5b3Ugb3ZlcnJpZGUsIG1ha2Ugc3VyZSB0byB1cGRhdGUgc3ludGF4RXJyb3JzIGlmIHlvdSBjYXJlIGFib3V0IHRoYXQuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBwcm9jZWR1cmUgUmVwb3J0RXJyb3IoY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uKTsKKworICAgIC8vLyA8c3VtbWFyeT4gTWF0Y2ggdGhlIHdpbGRjYXJkOiBpbiBhIHN5bWJvbDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgTWF0Y2hBbnkoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW0pOworCisgICAgcHJvY2VkdXJlIERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKGNvbnN0IFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheTsKKyAgICAgIGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdoYXQgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgdmFyaW91cyBleGNlcHRpb24gdHlwZXM/CisgICAgLy8vCisgICAgLy8vIE5vdCB2ZXJ5IG9iamVjdC1vcmllbnRlZCBjb2RlLCBidXQgSSBsaWtlIGhhdmluZyBhbGwgZXJyb3IgbWVzc2FnZSBnZW5lcmF0aW9uCisgICAgLy8vIHdpdGhpbiBvbmUgbWV0aG9kIHJhdGhlciB0aGFuIHNwcmVhZCBhbW9uZyBhbGwgb2YgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLiBUaGlzCisgICAgLy8vIGFsc28gbWFrZXMgaXQgbXVjaCBlYXNpZXIgZm9yIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgYmVjYXVzZSB0aGUgZXhjZXB0aW9uCisgICAgLy8vIGNsYXNzZXMgZG8gbm90IGhhdmUgdG8gaGF2ZSBwb2ludGVycyBiYWNrIHRvIHRoaXMgb2JqZWN0IHRvIGFjY2VzcyB1dGlsaXR5CisgICAgLy8vIHJvdXRpbmVzIGFuZCBzbyBvbi4gQWxzbywgY2hhbmdpbmcgdGhlIG1lc3NhZ2UgZm9yIGFuIGV4Y2VwdGlvbiB0eXBlIHdvdWxkIGJlCisgICAgLy8vIGRpZmZpY3VsdCBiZWNhdXNlIHlvdSB3b3VsZCBoYXZlIHRvIHN1YmNsYXNzaW5nIGV4Y2VwdGlvbiwgYnV0IHRoZW4gc29tZWhvdyBnZXQKKyAgICAvLy8gQU5UTFIgdG8gbWFrZSB0aG9zZSBraW5kcyBvZiBleGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LgorICAgIC8vLworICAgIC8vLyBUaGlzIGxvb2tzIHdlaXJkLCBidXQgdHJ1c3QgbWUtLWl0IG1ha2VzIHRoZSBtb3N0IHNlbnNlIGluIHRlcm1zIG9mIGZsZXhpYmlsaXR5LgorICAgIC8vLworICAgIC8vLyBGb3IgZ3JhbW1hciBkZWJ1Z2dpbmcsIHlvdSB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyB0byBhZGQgbW9yZSBpbmZvcm1hdGlvbgorICAgIC8vLyBzdWNoIGFzIHRoZSBzdGFjayBmcmFtZSB3aXRoIEdldFJ1bGVJbnZvY2F0aW9uU3RhY2soZSwgdGhpcy5HZXRUeXBlKCkuRnVsbG5hbWUpCisgICAgLy8vIGFuZCwgZm9yIG5vIHZpYWJsZSBhbHRzLCB0aGUgZGVjaXNpb24gZGVzY3JpcHRpb24gYW5kIHN0YXRlIGV0Yy4uLgorICAgIC8vLworICAgIC8vLyBPdmVycmlkZSB0aGlzIHRvIGNoYW5nZSB0aGUgbWVzc2FnZSBnZW5lcmF0ZWQgZm9yIG9uZSBvciBtb3JlIGV4Y2VwdGlvbiB0eXBlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEdldEVycm9yTWVzc2FnZShjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdoYXQgaXMgdGhlIGVycm9yIGhlYWRlciwgbm9ybWFsbHkgbGluZS9jaGFyYWN0ZXIgcG9zaXRpb24gaW5mb3JtYXRpb24/CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBHZXRFcnJvckhlYWRlcihjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOiBTdHJpbmc7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhvdyBzaG91bGQgYSB0b2tlbiBiZSBkaXNwbGF5ZWQgaW4gYW4gZXJyb3IgbWVzc2FnZT8gVGhlIGRlZmF1bHQKKyAgICAvLy8gaXMgdG8gZGlzcGxheSBqdXN0IHRoZSB0ZXh0LCBidXQgZHVyaW5nIGRldmVsb3BtZW50IHlvdSBtaWdodAorICAgIC8vLyB3YW50IHRvIGhhdmUgYSBsb3Qgb2YgaW5mb3JtYXRpb24gc3BpdCBvdXQuICBPdmVycmlkZSBpbiB0aGF0IGNhc2UKKyAgICAvLy8gdG8gdXNlIHQuVG9TdHJpbmcoKSAod2hpY2gsIGZvciBDb21tb25Ub2tlbiwgZHVtcHMgZXZlcnl0aGluZyBhYm91dAorICAgIC8vLyB0aGUgdG9rZW4pLiBUaGlzIGlzIGJldHRlciB0aGFuIGZvcmNpbmcgeW91IHRvIG92ZXJyaWRlIGEgbWV0aG9kIGluCisgICAgLy8vIHlvdXIgdG9rZW4gb2JqZWN0cyBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIHRvIGdvIG1vZGlmeSB5b3VyIGxleGVyCisgICAgLy8vIHNvIHRoYXQgaXQgY3JlYXRlcyBhIG5ldyB0eXBlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0VG9rZW5FcnJvckRpc3BsYXkoY29uc3QgVDogSVRva2VuKTogU3RyaW5nOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2Ugd2hlcmUgZXJyb3IgbWVzc2FnZXMgZ28KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBFbWl0RXJyb3JNZXNzYWdlKGNvbnN0IE1zZzogU3RyaW5nKTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmVjb3ZlciBmcm9tIGFuIGVycm9yIGZvdW5kIG9uIHRoZSBpbnB1dCBzdHJlYW0uICBUaGlzIGlzCisgICAgLy8vIGZvciBOb1ZpYWJsZUFsdCBhbmQgbWlzbWF0Y2hlZCBzeW1ib2wgZXhjZXB0aW9ucy4gIElmIHlvdSBlbmFibGUKKyAgICAvLy8gc2luZ2xlIHRva2VuIGluc2VydGlvbiBhbmQgZGVsZXRpb24sIHRoaXMgd2lsbCB1c3VhbGx5IG5vdAorICAgIC8vLyBoYW5kbGUgbWlzbWF0Y2hlZCBzeW1ib2wgZXhjZXB0aW9ucyBidXQgdGhlcmUgY291bGQgYmUgYSBtaXNtYXRjaGVkCisgICAgLy8vIHRva2VuIHRoYXQgdGhlIE1hdGNoKCkgcm91dGluZSBjb3VsZCBub3QgcmVjb3ZlciBmcm9tLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFJlY292ZXIoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07IGNvbnN0IFJFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOworCisgICAgLy8gTm90IGN1cnJlbnRseSB1c2VkCisgICAgZnVuY3Rpb24gUmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOyBjb25zdCBGb2xsb3c6IElCaXRTZXQpOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICBwcm9jZWR1cmUgQ29uc3VtZVVudGlsKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOyBjb25zdCBUb2tlblR5cGU6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT5Db25zdW1lIHRva2VucyB1bnRpbCBvbmUgbWF0Y2hlcyB0aGUgZ2l2ZW4gdG9rZW4gc2V0IDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgQ29uc3VtZVVudGlsKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOyBjb25zdCBCaXRTZXQ6IElCaXRTZXQpOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJucyBMaXN0ICZsdDtTdHJpbmcmZ3Q7IG9mIHRoZSBydWxlcyBpbiB5b3VyIHBhcnNlciBpbnN0YW5jZQorICAgIC8vLyBsZWFkaW5nIHVwIHRvIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4gIFlvdSBjb3VsZCBvdmVycmlkZSBpZgorICAgIC8vLyB5b3Ugd2FudCBtb3JlIGRldGFpbHMgc3VjaCBhcyB0aGUgZmlsZS9saW5lIGluZm8gb2Ygd2hlcmUKKyAgICAvLy8gaW4gdGhlIHBhcnNlciBzb3VyY2UgY29kZSBhIHJ1bGUgaXMgaW52b2tlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gTk9UIElNUExFTUVOVEVEIElOIFRIRSBERUxQSEkgVkVSU0lPTiBZRVQKKyAgICAvLy8gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIGZvciBjb250ZXh0LXNlbnNpdGl2ZQorICAgIC8vLyBlcnJvciByZWNvdmVyeS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vZnVuY3Rpb24gR2V0UnVsZUludm9jYXRpb25TdGFjazogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgbW9yZSBnZW5lcmFsIHZlcnNpb24gb2YgR2V0UnVsZUludm9jYXRpb25TdGFjayB3aGVyZSB5b3UgY2FuCisgICAgLy8vIHBhc3MgaW4sIGZvciBleGFtcGxlLCBhIFJlY29nbml0aW9uRXhjZXB0aW9uIHRvIGdldCBpdCdzIHJ1bGUKKyAgICAvLy8gc3RhY2sgdHJhY2UuICBUaGlzIHJvdXRpbmUgaXMgc2hhcmVkIHdpdGggYWxsIHJlY29nbml6ZXJzLCBoZW5jZSwKKyAgICAvLy8gc3RhdGljLgorICAgIC8vLworICAgIC8vLyBUT0RPOiBtb3ZlIHRvIGEgdXRpbGl0eSBjbGFzcyBvciBzb21ldGhpbmc7IHdlaXJkIGhhdmluZyBsZXhlciBjYWxsIHRoaXMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gTk9UIElNUExFTUVOVEVEIElOIFRIRSBERUxQSEkgVkVSU0lPTiBZRVQKKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIC8vZnVuY3Rpb24gR2V0UnVsZUludm9jYXRpb25TdGFjayhjb25zdCBFOiBFeGNlcHRpb247CisgICAgLy8gIGNvbnN0IFJlY29nbml6ZXJDbGFzc05hbWU6IFN0cmluZyk6IElMaXN0PElBTlRMUkludGVyZmFjZT47IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PkEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB1c2UgbW9zdCBvZnRlbiB3aXRoIHRlbXBsYXRlIHJld3JpdGVzLgorICAgIC8vLyBDb252ZXJ0IGEgTGlzdCZsdDtUb2tlbiZndDsgdG8gTGlzdCZsdDtTdHJpbmcmZ3Q7CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBmdW5jdGlvbiBUb1N0cmluZ3MoY29uc3QgVG9rZW5zOiBJTGlzdDxJVG9rZW4+KTogSUxpc3Q8U3RyaW5nPjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2l2ZW4gYSBydWxlIG51bWJlciBhbmQgYSBzdGFydCB0b2tlbiBpbmRleCBudW1iZXIsIHJldHVybgorICAgIC8vLyBNRU1PX1JVTEVfVU5LTk9XTiBpZiB0aGUgcnVsZSBoYXMgbm90IHBhcnNlZCBpbnB1dCBzdGFydGluZyBmcm9tCisgICAgLy8vIHN0YXJ0IGluZGV4LiAgSWYgdGhpcyBydWxlIGhhcyBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAvLy8gc3RhcnQgaW5kZXggYmVmb3JlLCB0aGVuIHJldHVybiB3aGVyZSB0aGUgcnVsZSBzdG9wcGVkIHBhcnNpbmcuCisgICAgLy8vIEl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHRva2VuIG1hdGNoZWQgYnkgdGhlIHJ1bGUuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIEZvciBub3cgd2UgdXNlIGEgaGFzaHRhYmxlIGFuZCBqdXN0IHRoZSBzbG93IE9iamVjdC1iYXNlZCBvbmUuCisgICAgLy8vIExhdGVyLCB3ZSBjYW4gbWFrZSBhIHNwZWNpYWwgb25lIGZvciBpbnRzIGFuZCBhbHNvIG9uZSB0aGF0CisgICAgLy8vIHRvc3NlcyBvdXQgZGF0YSBhZnRlciB3ZSBjb21taXQgcGFzdCBpbnB1dCBwb3NpdGlvbiBpLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gR2V0UnVsZU1lbW9pemF0aW9uKGNvbnN0IFJ1bGVJbmRleCwgUnVsZVN0YXJ0SW5kZXg6IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBIYXMgdGhpcyBydWxlIGFscmVhZHkgcGFyc2VkIGlucHV0IGF0IHRoZSBjdXJyZW50IGluZGV4IGluIHRoZQorICAgIC8vLyBpbnB1dCBzdHJlYW0/ICBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gaW5kZXggb3IgTUVNT19SVUxFX1VOS05PV04uCisgICAgLy8vIElmIHdlIGF0dGVtcHRlZCBidXQgZmFpbGVkIHRvIHBhcnNlIHByb3Blcmx5IGJlZm9yZSwgcmV0dXJuCisgICAgLy8vIE1FTU9fUlVMRV9GQUlMRUQuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIGhhcyBhIHNpZGUtZWZmZWN0OiBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBpbnB1dCBmb3IKKyAgICAvLy8gdGhpcyBydWxlIGFuZCBzdWNjZXNzZnVsbHkgcGFyc2VkIGJlZm9yZSwgdGhlbiBzZWVrIGFoZWFkIHRvCisgICAgLy8vIDEgcGFzdCB0aGUgc3RvcCB0b2tlbiBtYXRjaGVkIGZvciB0aGlzIHJ1bGUgbGFzdCB0aW1lLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gQWxyZWFkeVBhcnNlZFJ1bGUoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07CisgICAgICBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZWNvcmQgd2hldGhlciBvciBub3QgdGhpcyBydWxlIHBhcnNlZCB0aGUgaW5wdXQgYXQgdGhpcyBwb3NpdGlvbgorICAgIC8vLyBzdWNjZXNzZnVsbHkuICBVc2UgYSBzdGFuZGFyZCBoYXNodGFibGUgZm9yIG5vdy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBNZW1vaXplKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOyBjb25zdCBSdWxlSW5kZXgsCisgICAgICBSdWxlU3RhcnRJbmRleDogSW50ZWdlcik7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldHVybiBob3cgbWFueSBydWxlL2lucHV0LWluZGV4IHBhaXJzIHRoZXJlIGFyZSBpbiB0b3RhbC4KKyAgICAvLy8gIFRPRE86IHRoaXMgaW5jbHVkZXMgc3lucHJlZHMuIDooCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAgIGZ1bmN0aW9uIEdldFJ1bGVNZW1vaXphdGlvbkNoYWNlU2l6ZTogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBUcmFjZUluKGNvbnN0IFJ1bGVOYW1lOiBTdHJpbmc7IGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IElucHV0U3ltYm9sOiBTdHJpbmcpOworICAgIHByb2NlZHVyZSBUcmFjZU91dChjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXI7CisgICAgICBjb25zdCBJbnB1dFN5bWJvbDogU3RyaW5nKTsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgSW5wdXQ6IElJbnRTdHJlYW0gcmVhZCBHZXRJbnB1dDsKKyAgICBwcm9wZXJ0eSBCYWNrdHJhY2tpbmdMZXZlbDogSW50ZWdlciByZWFkIEdldEJhY2t0cmFja2luZ0xldmVsOworICAgIHByb3BlcnR5IFN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlIHJlYWQgR2V0U3RhdGU7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCBudW1iZXIgb2YgcmVjb2duaXRpb24gZXJyb3JzIChsZXhlciwgcGFyc2VyLCB0cmVlIHBhcnNlcikuICBFYWNoCisgICAgLy8vIHJlY29nbml6ZXIgdHJhY2tzIGl0cyBvd24gbnVtYmVyLiAgU28gcGFyc2VyIGFuZCBsZXhlciBlYWNoIGhhdmUKKyAgICAvLy8gc2VwYXJhdGUgY291bnQuICBEb2VzIG5vdCBjb3VudCB0aGUgc3B1cmlvdXMgZXJyb3JzIGZvdW5kIGJldHdlZW4KKyAgICAvLy8gYW4gZXJyb3IgYW5kIG5leHQgdmFsaWQgdG9rZW4gbWF0Y2gKKyAgICAvLy8KKyAgICAvLy8gU2VlIGFsc28gUmVwb3J0RXJyb3IoKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgTnVtYmVyT2ZTeW50YXhFcnJvcnM6IEludGVnZXIgcmVhZCBHZXROdW1iZXJPZlN5bnRheEVycm9yczsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRm9yIGRlYnVnZ2luZyBhbmQgb3RoZXIgcHVycG9zZXMsIG1pZ2h0IHdhbnQgdGhlIGdyYW1tYXIgbmFtZS4KKyAgICAvLy8gSGF2ZSBBTlRMUiBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHJvcGVydHkgR3JhbW1hckZpbGVOYW1lOiBTdHJpbmcgcmVhZCBHZXRHcmFtbWFyRmlsZU5hbWU7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZvciBkZWJ1Z2dpbmcgYW5kIG90aGVyIHB1cnBvc2VzLCBtaWdodCB3YW50IHRoZSBzb3VyY2UgbmFtZS4KKyAgICAvLy8gSGF2ZSBBTlRMUiBwcm92aWRlIGEgaG9vayBmb3IgdGhpcyBwcm9wZXJ0eS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmV0dXJucz5UaGUgc291cmNlIG5hbWU8L3JldHVybnM+CisgICAgcHJvcGVydHkgU291cmNlTmFtZTogU3RyaW5nIHJlYWQgR2V0U291cmNlTmFtZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVXNlZCB0byBwcmludCBvdXQgdG9rZW4gbmFtZXMgbGlrZSBJRCBkdXJpbmcgZGVidWdnaW5nIGFuZAorICAgIC8vLyBlcnJvciByZXBvcnRpbmcuICBUaGUgZ2VuZXJhdGVkIHBhcnNlcnMgaW1wbGVtZW50IGEgbWV0aG9kCisgICAgLy8vIHRoYXQgb3ZlcnJpZGVzIHRoaXMgdG8gcG9pbnQgdG8gdGhlaXIgc3RyaW5nW10gdG9rZW5OYW1lcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheSByZWFkIEdldFRva2VuTmFtZXM7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgbW9zdCBjb21tb24gc3RyZWFtIG9mIHRva2VucyBpcyBvbmUgd2hlcmUgZXZlcnkgdG9rZW4gaXMgYnVmZmVyZWQgdXAKKyAgLy8vIGFuZCB0b2tlbnMgYXJlIHByZWZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKKyAgLy8vIHNlZSB0aGVzZSB0b2tlbnMgYW5kIGNhbm5vdCBjaGFuZ2UgdGhlIGZpbHRlciBjaGFubmVsIG51bWJlciBkdXJpbmcgdGhlCisgIC8vLyBwYXJzZSkuCisgIC8vLworICAvLy8gVE9ETzogaG93IHRvIGFjY2VzcyB0aGUgZnVsbCB0b2tlbiBzdHJlYW0/ICBIb3cgdG8gdHJhY2sgYWxsIHRva2VucyBtYXRjaGVkIHBlciBydWxlPworICAvLy8gPC9zdW1tYXJ5PgorICBJQ29tbW9uVG9rZW5TdHJlYW0gPSBpbnRlcmZhY2UoSVRva2VuU3RyZWFtKQorICAgIHsgTWV0aG9kcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgc2ltcGxlIGZpbHRlciBtZWNoYW5pc20gd2hlcmVieSB5b3UgY2FuIHRlbGwgdGhpcyB0b2tlbiBzdHJlYW0KKyAgICAvLy8gdG8gZm9yY2UgYWxsIHRva2VucyBvZiB0eXBlIFRUeXBlIHRvIGJlIG9uIENoYW5uZWwuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIEZvciBleGFtcGxlLAorICAgIC8vLyB3aGVuIGludGVycHJldGluZywgd2UgY2Fubm90IGV4ZWMgYWN0aW9ucyBzbyB3ZSBuZWVkIHRvIHRlbGwKKyAgICAvLy8gdGhlIHN0cmVhbSB0byBmb3JjZSBhbGwgV1MgYW5kIE5FV0xJTkUgdG8gYmUgYSBkaWZmZXJlbnQsIGlnbm9yZWQKKyAgICAvLy8gY2hhbm5lbC4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHByb2NlZHVyZSBTZXRUb2tlblR5cGVDaGFubmVsKGNvbnN0IFRUeXBlLCBDaGFubmVsOiBJbnRlZ2VyKTsKKworICAgIHByb2NlZHVyZSBEaXNjYXJkVG9rZW5UeXBlKGNvbnN0IFRUeXBlOiBJbnRlZ2VyKTsKKworICAgIHByb2NlZHVyZSBEaXNjYXJkT2ZmQ2hhbm5lbFRva2Vucyhjb25zdCBEaXNjYXJkOiBCb29sZWFuKTsKKworICAgIGZ1bmN0aW9uIEdldFRva2VuczogSUxpc3Q8SVRva2VuPjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogSUxpc3Q8SVRva2VuPjsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+R2l2ZW4gYSBzdGFydCBhbmQgc3RvcCBpbmRleCwgcmV0dXJuIGEgTGlzdCBvZiBhbGwgdG9rZW5zIGluCisgICAgLy8vIHRoZSB0b2tlbiB0eXBlIEJpdFNldC4gIFJldHVybiBudWxsIGlmIG5vIHRva2VucyB3ZXJlIGZvdW5kLiAgVGhpcworICAgIC8vLyBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOworICAgICAgY29uc3QgVHlwZXM6IElCaXRTZXQpOiBJTGlzdDxJVG9rZW4+OyBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIEdldFRva2Vucyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFR5cGVzOiBJTGlzdDxJbnRlZ2VyPik6IElMaXN0PElUb2tlbj47IG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LCBTdG9wLAorICAgICAgVG9rZW5UeXBlOiBJbnRlZ2VyKTogSUxpc3Q8SVRva2VuPjsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisgIGVuZDsKKworICBJREZBID0gaW50ZXJmYWNlOworCisgIFRTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlciA9IGZ1bmN0aW9uKGNvbnN0IERGQTogSURGQTsgUzogSW50ZWdlcjsKKyAgICBjb25zdCBJbnB1dDogSUludFN0cmVhbSk6IEludGVnZXIgb2YgT2JqZWN0OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICBBIERGQSBpbXBsZW1lbnRlZCBhcyBhIHNldCBvZiB0cmFuc2l0aW9uIHRhYmxlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gPHBhcmE+CisgIC8vLyBBbnkgc3RhdGUgdGhhdCBoYXMgYSBzZW1hbnRpYyBwcmVkaWNhdGUgZWRnZSBpcyBzcGVjaWFsOyB0aG9zZSBzdGF0ZXMgYXJlCisgIC8vLyBnZW5lcmF0ZWQgd2l0aCBpZi10aGVuLWVsc2Ugc3RydWN0dXJlcyBpbiBhIFNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oKQorICAvLy8gd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGN5Y2xpY0RGQSB0ZW1wbGF0ZS4KKyAgLy8vIDwvcGFyYT4KKyAgLy8vIDxwYXJhPgorICAvLy8gVGhlcmUgYXJlIGF0IG1vc3QgMzI3Njcgc3RhdGVzICgxNi1iaXQgc2lnbmVkIHNob3J0KS4gQ291bGQgZ2V0IGF3YXkgd2l0aCBieXRlCisgIC8vLyBzb21ldGltZXMgYnV0IHdvdWxkIGhhdmUgdG8gZ2VuZXJhdGUgZGlmZmVyZW50IHR5cGVzIGFuZCB0aGUgc2ltdWxhdGlvbiBjb2RlIHRvby4KKyAgLy8vIDwvcGFyYT4KKyAgLy8vIDxwYXJhPgorICAvLy8gQXMgYSBwb2ludCBvZiByZWZlcmVuY2UsIHRoZSBUb2tlbnMgcnVsZSBERkEgZm9yIHRoZSBsZXhlciBpbiB0aGUgSmF2YSBncmFtbWFyCisgIC8vLyBzYW1wbGUgaGFzIGFwcHJveGltYXRlbHkgMzI2IHN0YXRlcy4KKyAgLy8vIDwvcGFyYT4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgSURGQSA9IGludGVyZmFjZShJQU5UTFJJbnRlcmZhY2UpCisgIFsnezM2MzEyQjU5LUI3MTgtNDhFRi1BMEVDLTQ1MjlERTcwRjRDMn0nXQorICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICBmdW5jdGlvbiBHZXRTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlcjogVFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyOworICAgIHByb2NlZHVyZSBTZXRTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlcihjb25zdCBWYWx1ZTogVFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyKTsKKworICAgIHsgTWV0aG9kcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEZyb20gdGhlIGlucHV0IHN0cmVhbSwgcHJlZGljdCB3aGF0IGFsdGVybmF0aXZlIHdpbGwgc3VjY2VlZCB1c2luZyB0aGlzCisgICAgLy8vIERGQSAocmVwcmVzZW50aW5nIHRoZSBjb3ZlcmluZyByZWd1bGFyIGFwcHJveGltYXRpb24gdG8gdGhlIHVuZGVybHlpbmcgQ0ZMKS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5wdXQiPklucHV0IHN0cmVhbTwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPlJldHVybiBhbiBhbHRlcm5hdGl2ZSBudW1iZXIgMS4uTi4gIFRocm93IGFuIGV4Y2VwdGlvbiB1cG9uIGVycm9yLjwvcmV0dXJucz4KKyAgICBmdW5jdGlvbiBQcmVkaWN0KGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQSBob29rIGZvciBkZWJ1Z2dpbmcgaW50ZXJmYWNlCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Ik5WQUUiPjwvcGFyYW0+CisgICAgcHJvY2VkdXJlIEVycm9yKGNvbnN0IE5WQUU6IEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbik7CisKKyAgICBmdW5jdGlvbiBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGNvbnN0IFM6IEludGVnZXI7IGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTogSW50ZWdlcjsKKworICAgIGZ1bmN0aW9uIERlc2NyaXB0aW9uOiBTdHJpbmc7CisKKyAgICBmdW5jdGlvbiBTcGVjaWFsVHJhbnNpdGlvbihjb25zdCBTdGF0ZSwgU3ltYm9sOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIHsgUHJvcGVydGllcyB9CisgICAgcHJvcGVydHkgU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXI6IFRTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlciByZWFkIEdldFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyIHdyaXRlIFNldFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBsZXhlciBpcyByZWNvZ25pemVyIHRoYXQgZHJhd3MgaW5wdXQgc3ltYm9scyBmcm9tIGEgY2hhcmFjdGVyIHN0cmVhbS4KKyAgLy8vIGxleGVyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LiBBIExleGVyIG9iamVjdAorICAvLy8gdXNlcyBzaW1wbGlmaWVkIE1hdGNoKCkgYW5kIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbXMgaW4gdGhlIGludGVyZXN0CisgIC8vLyBvZiBzcGVlZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSUxleGVyID0gaW50ZXJmYWNlKElCYXNlUmVjb2duaXplcikKKyAgWyd7MzMxQUFCNDktRTdDRC00MEU3LUFFRjUtNDI3RjdENjU3N0FEfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldENoYXJTdHJlYW06IElDaGFyU3RyZWFtOworICAgIHByb2NlZHVyZSBTZXRDaGFyU3RyZWFtKGNvbnN0IFZhbHVlOiBJQ2hhclN0cmVhbSk7CisgICAgZnVuY3Rpb24gR2V0TGluZTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBHZXRDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0Q2hhckluZGV4OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEdldFRleHQ6IFN0cmluZzsKKyAgICBwcm9jZWR1cmUgU2V0VGV4dChjb25zdCBWYWx1ZTogU3RyaW5nKTsKKworICAgIHsgTWV0aG9kcyB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldHVybiBhIHRva2VuIGZyb20gdGhpcyBzb3VyY2U7IGkuZS4sIE1hdGNoIGEgdG9rZW4gb24gdGhlIGNoYXIgc3RyZWFtLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gTmV4dFRva2VuOiBJVG9rZW47CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluc3RydWN0IHRoZSBsZXhlciB0byBza2lwIGNyZWF0aW5nIGEgdG9rZW4gZm9yIGN1cnJlbnQgbGV4ZXIgcnVsZSBhbmQKKyAgICAvLy8gbG9vayBmb3IgYW5vdGhlciB0b2tlbi4gIE5leHRUb2tlbigpIGtub3dzIHRvIGtlZXAgbG9va2luZyB3aGVuIGEgbGV4ZXIKKyAgICAvLy8gcnVsZSBmaW5pc2hlcyB3aXRoIHRva2VuIHNldCB0byBTS0lQX1RPS0VOLiAgUmVjYWxsIHRoYXQgaWYgdG9rZW49PW51bGwKKyAgICAvLy8gYXQgZW5kIG9mIGFueSB0b2tlbiBydWxlLCBpdCBjcmVhdGVzIG9uZSBmb3IgeW91IGFuZCBlbWl0cyBpdC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBTa2lwOworCisgICAgLy8vIDxzdW1tYXJ5PlRoaXMgaXMgdGhlIGxleGVyIGVudHJ5IHBvaW50IHRoYXQgc2V0cyBpbnN0YW5jZSB2YXIgJ3Rva2VuJyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIERvVG9rZW5zOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBlbWl0cyBwZXIgbmV4dFRva2VuIGludm9jYXRpb24KKyAgICAvLy8gZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gIFN1YmNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQKKyAgICAvLy8gTmV4dFRva2VuICh0byBwdXNoIHRva2VucyBpbnRvIGEgbGlzdCBhbmQgcHVsbCBmcm9tIHRoYXQgbGlzdCByYXRoZXIKKyAgICAvLy8gdGhhbiBhIHNpbmdsZSB2YXJpYWJsZSBhcyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMpLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIEVtaXQoY29uc3QgVG9rZW46IElUb2tlbik7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUaGUgc3RhbmRhcmQgbWV0aG9kIGNhbGxlZCB0byBhdXRvbWF0aWNhbGx5IGVtaXQgYSB0b2tlbiBhdCB0aGUKKyAgICAvLy8gb3V0ZXJtb3N0IGxleGljYWwgcnVsZS4gIFRoZSB0b2tlbiBvYmplY3Qgc2hvdWxkIHBvaW50IGludG8gdGhlCisgICAgLy8vIGNoYXIgYnVmZmVyIHN0YXJ0Li5zdG9wLiAgSWYgdGhlcmUgaXMgYSB0ZXh0IG92ZXJyaWRlIGluICd0ZXh0JywKKyAgICAvLy8gdXNlIHRoYXQgdG8gc2V0IHRoZSB0b2tlbidzIHRleHQuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+PHBhcmE+T3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZW1pdCBjdXN0b20gVG9rZW4gb2JqZWN0cy48L3BhcmE+CisgICAgLy8vIDxwYXJhPklmIHlvdSBhcmUgYnVpbGRpbmcgdHJlZXMsIHRoZW4geW91IHNob3VsZCBhbHNvIG92ZXJyaWRlCisgICAgLy8vIFBhcnNlciBvciBUcmVlUGFyc2VyLkdldE1pc3NpbmdTeW1ib2woKS48L3BhcmE+CisgICAgLy8vPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIEVtaXQ6IElUb2tlbjsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgTWF0Y2goY29uc3QgUzogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIE1hdGNoKGNvbnN0IEM6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgTWF0Y2hBbnk7CisgICAgcHJvY2VkdXJlIE1hdGNoUmFuZ2UoY29uc3QgQSwgQjogSW50ZWdlcik7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIExleGVycyBjYW4gbm9ybWFsbHkgTWF0Y2ggYW55IGNoYXIgaW4gaXQncyB2b2NhYnVsYXJ5IGFmdGVyIG1hdGNoaW5nCisgICAgLy8vIGEgdG9rZW4sIHNvIGRvIHRoZSBlYXN5IHRoaW5nIGFuZCBqdXN0IGtpbGwgYSBjaGFyYWN0ZXIgYW5kIGhvcGUKKyAgICAvLy8gaXQgYWxsIHdvcmtzIG91dC4gIFlvdSBjYW4gaW5zdGVhZCB1c2UgdGhlIHJ1bGUgaW52b2NhdGlvbiBzdGFjaworICAgIC8vLyB0byBkbyBzb3BoaXN0aWNhdGVkIGVycm9yIHJlY292ZXJ5IGlmIHlvdSBhcmUgaW4gYSBGcmFnbWVudCBydWxlLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIFJlY292ZXIoY29uc3QgUkU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik7CisKKyAgICBmdW5jdGlvbiBHZXRDaGFyRXJyb3JEaXNwbGF5KGNvbnN0IEM6IEludGVnZXIpOiBTdHJpbmc7CisKKyAgICBwcm9jZWR1cmUgVHJhY2VJbihjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBUcmFjZU91dChjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKworICAgIC8vLyA8c3VtbWFyeT5TZXQgdGhlIGNoYXIgc3RyZWFtIGFuZCByZXNldCB0aGUgbGV4ZXIgPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IENoYXJTdHJlYW06IElDaGFyU3RyZWFtIHJlYWQgR2V0Q2hhclN0cmVhbSB3cml0ZSBTZXRDaGFyU3RyZWFtOworICAgIHByb3BlcnR5IExpbmU6IEludGVnZXIgcmVhZCBHZXRMaW5lOworICAgIHByb3BlcnR5IENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlciByZWFkIEdldENoYXJQb3NpdGlvbkluTGluZTsKKworICAgIC8vLyA8c3VtbWFyeT5XaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgb2YgbG9va2FoZWFkPyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgQ2hhckluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0Q2hhckluZGV4OworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBHZXRzIG9yIHNldHMgdGhlICdsZXhlbWUnIGZvciB0aGUgY3VycmVudCB0b2tlbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIHNvIGZhciBmb3IgdGhlIGN1cnJlbnQgdG9rZW4gb3IgYW55CisgICAgLy8vIHRleHQgb3ZlcnJpZGUuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPHBhcmE+CisgICAgLy8vIFRoZSBzZXR0ZXIgc2V0cyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHRva2VuLiBJdCBvdmVycmlkZXMvd2lwZXMgYW55CisgICAgLy8vIHByZXZpb3VzIGNoYW5nZXMgdG8gdGhlIHRleHQuCisgICAgLy8vIDwvcGFyYT4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIHByb3BlcnR5IFRleHQ6IFN0cmluZyByZWFkIEdldFRleHQgd3JpdGUgU2V0VGV4dDsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT5BIHBhcnNlciBmb3IgVG9rZW5TdHJlYW1zLiAgUGFyc2VyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzCisgIC8vLyBvZiB0aGlzLgorICAvLy8gPC9zdW1tYXJ5PgorICBJUGFyc2VyID0gaW50ZXJmYWNlKElCYXNlUmVjb2duaXplcikKKyAgWyd7NzQyMDg3OUEtNUQxRi00M0NBLUJENDktMjI2NEQ3NTE0NTAxfSddCisgICAgeyBQcm9wZXJ0eSBhY2Nlc3NvcnMgfQorICAgIGZ1bmN0aW9uIEdldFRva2VuU3RyZWFtOiBJVG9rZW5TdHJlYW07CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RyZWFtKGNvbnN0IFZhbHVlOiBJVG9rZW5TdHJlYW0pOworCisgICAgeyBNZXRob2RzIH0KKyAgICBwcm9jZWR1cmUgVHJhY2VJbihjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBUcmFjZU91dChjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKworICAgIC8vLyA8c3VtbWFyeT5TZXQgdGhlIHRva2VuIHN0cmVhbSBhbmQgcmVzZXQgdGhlIHBhcnNlciA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVG9rZW5TdHJlYW06IElUb2tlblN0cmVhbSByZWFkIEdldFRva2VuU3RyZWFtIHdyaXRlIFNldFRva2VuU3RyZWFtOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUnVsZXMgY2FuIHJldHVybiBzdGFydC9zdG9wIGluZm8gYXMgd2VsbCBhcyBwb3NzaWJsZSB0cmVlcyBhbmQgdGVtcGxhdGVzCisgIC8vLyA8L3N1bW1hcnk+CisgIElSdWxlUmV0dXJuU2NvcGUgPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICBbJ3tFOTg3MDA1Ni1CRjZELTRDQjItQjcxQy0xMEI4MDc5N0MwQjR9J10KKyAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgZnVuY3Rpb24gR2V0U3RhcnQ6IElBTlRMUkludGVyZmFjZTsKKyAgICBwcm9jZWR1cmUgU2V0U3RhcnQoY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7CisgICAgZnVuY3Rpb24gR2V0U3RvcDogSUFOVExSSW50ZXJmYWNlOworICAgIHByb2NlZHVyZSBTZXRTdG9wKGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOworICAgIGZ1bmN0aW9uIEdldFRyZWU6IElBTlRMUkludGVyZmFjZTsKKyAgICBwcm9jZWR1cmUgU2V0VHJlZShjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKKyAgICBmdW5jdGlvbiBHZXRUZW1wbGF0ZTogSUFOVExSSW50ZXJmYWNlOworCisgICAgeyBQcm9wZXJ0aWVzIH0KKworICAgIC8vLyA8c3VtbWFyeT5SZXR1cm4gdGhlIHN0YXJ0IHRva2VuIG9yIHRyZWUgPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IFN0YXJ0OiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBHZXRTdGFydCB3cml0ZSBTZXRTdGFydDsKKworICAgIC8vLyA8c3VtbWFyeT5SZXR1cm4gdGhlIHN0b3AgdG9rZW4gb3IgdHJlZSA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgU3RvcDogSUFOVExSSW50ZXJmYWNlIHJlYWQgR2V0U3RvcCB3cml0ZSBTZXRTdG9wOworCisgICAgLy8vIDxzdW1tYXJ5PkhhcyBhIHZhbHVlIHBvdGVudGlhbGx5IGlmIG91dHB1dD1BU1Q7IDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUcmVlOiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBHZXRUcmVlIHdyaXRlIFNldFRyZWU7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEhhcyBhIHZhbHVlIHBvdGVudGlhbGx5IGlmIG91dHB1dD10ZW1wbGF0ZTsKKyAgICAvLy8gRG9uJ3QgdXNlIFN0cmluZ1RlbXBsYXRlIHR5cGUgdG8gYXZvaWQgZGVwZW5kZW5jeSBvbiBTVCBhc3NlbWJseQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVGVtcGxhdGU6IElBTlRMUkludGVyZmFjZSByZWFkIEdldFRlbXBsYXRlOworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUnVsZXMgdGhhdCByZXR1cm4gbW9yZSB0aGFuIGEgc2luZ2xlIHZhbHVlIG11c3QgcmV0dXJuIGFuIG9iamVjdAorICAvLy8gY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcy4gIEJlc2lkZXMgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbgorICAvLy8gUnVsZUxhYmVsU2NvcGUuUHJlZGVmaW5lZFJ1bGVQcm9wZXJ0aWVzU2NvcGUgdGhlcmUgbWF5IGJlIHVzZXItZGVmaW5lZAorICAvLy8gcmV0dXJuIHZhbHVlcy4gIFRoaXMgY2xhc3Mgc2ltcGx5IGRlZmluZXMgdGhlIG1pbmltdW0gcHJvcGVydGllcyB0aGF0CisgIC8vLyBhcmUgYWx3YXlzIGRlZmluZWQgYW5kIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBvdGhlcnMgdGhhdCBtaWdodCBiZQorICAvLy8gYXZhaWxhYmxlIGRlcGVuZGluZyBvbiBvdXRwdXQgb3B0aW9uIHN1Y2ggYXMgdGVtcGxhdGUgYW5kIHRyZWUuCisgIC8vLworICAvLy8gTm90ZSB0ZXh0IGlzIG5vdCBhbiBhY3R1YWwgcHJvcGVydHkgb2YgdGhlIHJldHVybiB2YWx1ZSwgaXQgaXMgY29tcHV0ZWQKKyAgLy8vIGZyb20gc3RhcnQgYW5kIHN0b3AgdXNpbmcgdGhlIGlucHV0IHN0cmVhbSdzIFRvU3RyaW5nKCkgbWV0aG9kLiAgSQorICAvLy8gY291bGQgYWRkIGEgY3RvciB0byB0aGlzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaW4gYW5kIHN0b3JlIHRoZSBpbnB1dAorICAvLy8gc3RyZWFtLCBidXQgSSdtIG5vdCBzdXJlIHdlIHdhbnQgdG8gZG8gdGhhdC4gIEl0IHdvdWxkIHNlZW0gdG8gYmUgdW5kZWZpbmVkCisgIC8vLyB0byBnZXQgdGhlIC50ZXh0IHByb3BlcnR5IGFueXdheSBpZiB0aGUgcnVsZSBtYXRjaGVzIHRva2VucyBmcm9tIG11bHRpcGxlCisgIC8vLyBpbnB1dCBzdHJlYW1zLgorICAvLy8KKyAgLy8vIEkgZG8gbm90IHVzZSBnZXR0ZXJzIGZvciBmaWVsZHMgb2Ygb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHNpbXBseSB0bworICAvLy8gZ3JvdXAgdmFsdWVzIHN1Y2ggYXMgdGhpcyBhZ2dyZWdhdGUuCisgIC8vLyA8L3N1bW1hcnk+CisgIElQYXJzZXJSdWxlUmV0dXJuU2NvcGUgPSBpbnRlcmZhY2UoSVJ1bGVSZXR1cm5TY29wZSkKKyAgWyd7OUZCNjIwNTAtRTIzQi00RkU0LTg3RDUtMkMxRUU2N0FFQzNFfSddCisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+VXNlZnVsIGZvciBkdW1waW5nIG91dCB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIGRvaW5nIHNvbWUKKyAgLy8vIGF1Z21lbnRhdGlvbiBvciBvdGhlciBtYW5pcHVsYXRpb25zLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gWW91IGNhbiBpbnNlcnQgc3R1ZmYsIFJlcGxhY2UsIGFuZCBkZWxldGUgY2h1bmtzLiAgTm90ZSB0aGF0IHRoZQorICAvLy8gb3BlcmF0aW9ucyBhcmUgZG9uZSBsYXppbHktLW9ubHkgaWYgeW91IGNvbnZlcnQgdGhlIGJ1ZmZlciB0byBhCisgIC8vLyBTdHJpbmcuICBUaGlzIGlzIHZlcnkgZWZmaWNpZW50IGJlY2F1c2UgeW91IGFyZSBub3QgbW92aW5nIGRhdGEgYXJvdW5kCisgIC8vLyBhbGwgdGhlIHRpbWUuICBBcyB0aGUgYnVmZmVyIG9mIHRva2VucyBpcyBjb252ZXJ0ZWQgdG8gc3RyaW5ncywgdGhlCisgIC8vLyBUb1N0cmluZygpIG1ldGhvZChzKSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gb3BlcmF0aW9uIGF0IHRoZQorICAvLy8gY3VycmVudCBpbmRleC4gIElmIHNvLCB0aGUgb3BlcmF0aW9uIGlzIGRvbmUgYW5kIHRoZW4gbm9ybWFsIFN0cmluZworICAvLy8gcmVuZGVyaW5nIGNvbnRpbnVlcyBvbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyBsaWtlIGhhdmluZyBtdWx0aXBsZSBUdXJpbmcKKyAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyAocHJvZ3JhbXMpIG9wZXJhdGluZyBvbiBhIHNpbmdsZSBpbnB1dCB0YXBlLiA6KQorICAvLy8KKyAgLy8vIFNpbmNlIHRoZSBvcGVyYXRpb25zIGFyZSBkb25lIGxhemlseSBhdCBUb1N0cmluZy10aW1lLCBvcGVyYXRpb25zIGRvIG5vdAorICAvLy8gc2NyZXcgdXAgdGhlIHRva2VuIGluZGV4IHZhbHVlcy4gIFRoYXQgaXMsIGFuIGluc2VydCBvcGVyYXRpb24gYXQgdG9rZW4KKyAgLy8vIGluZGV4IEkgZG9lcyBub3QgY2hhbmdlIHRoZSBpbmRleCB2YWx1ZXMgZm9yIHRva2VucyBJKzEuLk4tMS4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIG9wZXJhdGlvbnMgbmV2ZXIgYWN0dWFsbHkgYWx0ZXIgdGhlIGJ1ZmZlciwgeW91IG1heSBhbHdheXMgZ2V0CisgIC8vLyB0aGUgb3JpZ2luYWwgdG9rZW4gc3RyZWFtIGJhY2sgd2l0aG91dCB1bmRvaW5nIGFueXRoaW5nLiAgU2luY2UKKyAgLy8vIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHF1ZXVlZCB1cCwgeW91IGNhbiBlYXNpbHkgc2ltdWxhdGUgdHJhbnNhY3Rpb25zIGFuZAorICAvLy8gcm9sbCBiYWNrIGFueSBjaGFuZ2VzIGlmIHRoZXJlIGlzIGFuIGVycm9yIGp1c3QgYnkgcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zLgorICAvLy8gRm9yIGV4YW1wbGUsCisgIC8vLworICAvLy8gdmFyCisgIC8vLyAgIElucHV0OiBJQ2hhclN0cmVhbTsKKyAgLy8vICAgTGV4OiBJTGV4ZXI7CisgIC8vLyAgIFRva2VuczogSVRva2VuUmV3cml0ZVN0cmVhbTsKKyAgLy8vICAgUGFyc2VyOiBJUGFyc2VyOworICAvLy8gSW5wdXQgOj0gVEFOVExSRmlsZVN0cmVhbS5DcmVhdGUoJ2lucHV0Jyk7CisgIC8vLyBMZXggOj0gVExleGVyLkNyZWF0ZShJbnB1dCk7CisgIC8vLyBUb2tlbnMgOj0gVFRva2VuUmV3cml0ZVN0cmVhbS5DcmVhdGUoTGV4KTsKKyAgLy8vIFBhcnNlciA6PSBUUGFyc2VyLkNyZWF0ZSh0b2tlbnMpOworICAvLy8gUGFyc2VyLnN0YXJ0UnVsZSgpOworICAvLy8KKyAgLy8vIFRoZW4gaW4gdGhlIHJ1bGVzLCB5b3UgY2FuIGV4ZWN1dGUKKyAgLy8vIHZhcgorICAvLy8gICB0LHU6IElUb2tlbjsKKyAgLy8vIC4uLgorICAvLy8gSW5wdXQuSW5zZXJ0QWZ0ZXIodCwgJ3RleHQgdG8gcHV0IGFmdGVyIHQnKTsKKyAgLy8vIElucHV0Lkluc2VydEFmdGVyKHUsICd0ZXh0IGFmdGVyIHUnKTsKKyAgLy8vIFdyaXRlTG4oVG9rZW5zLlRvU3RyaW5nKCkpOworICAvLy8KKyAgLy8vIEFjdHVhbGx5LCB5b3UgaGF2ZSB0byBjYXN0IHRoZSAnaW5wdXQnIHRvIGEgVG9rZW5SZXdyaXRlU3RyZWFtLiA6KAorICAvLy8KKyAgLy8vIFlvdSBjYW4gYWxzbyBoYXZlIG11bHRpcGxlICJpbnN0cnVjdGlvbiBzdHJlYW1zIiBhbmQgZ2V0IG11bHRpcGxlCisgIC8vLyByZXdyaXRlcyBmcm9tIGEgc2luZ2xlIHBhc3Mgb3ZlciB0aGUgaW5wdXQuICBKdXN0IG5hbWUgdGhlIGluc3RydWN0aW9uCisgIC8vLyBzdHJlYW1zIGFuZCB1c2UgdGhhdCBuYW1lIGFnYWluIHdoZW4gcHJpbnRpbmcgdGhlIGJ1ZmZlci4gIFRoaXMgY291bGQgYmUKKyAgLy8vIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBhIEMgZmlsZSBhbmQgYWxzbyBpdHMgaGVhZGVyIGZpbGUtLWFsbCBmcm9tIHRoZQorICAvLy8gc2FtZSBidWZmZXI6CisgIC8vLworICAvLy8gVG9rZW5zLkluc2VydEFmdGVyKCdwYXNzMScsIHQsICd0ZXh0IHRvIHB1dCBhZnRlciB0Jyk7CisgIC8vLyBUb2tlbnMuSW5zZXJ0QWZ0ZXIoJ3Bhc3MyJywgdSwgJ3RleHQgYWZ0ZXIgdScpOworICAvLy8gV3JpdGVMbihUb2tlbnMuVG9TdHJpbmcoJ3Bhc3MxJykpOworICAvLy8gV3JpdGVMbihUb2tlbnMuVG9TdHJpbmcoJ3Bhc3MyJykpOworICAvLy8KKyAgLy8vIElmIHlvdSBkb24ndCB1c2UgbmFtZWQgcmV3cml0ZSBzdHJlYW1zLCBhICJkZWZhdWx0IiBzdHJlYW0gaXMgdXNlZCBhcworICAvLy8gdGhlIGZpcnN0IGV4YW1wbGUgc2hvd3MuCisgIC8vLyA8L3JlbWFya3M+CisgIElUb2tlblJld3JpdGVTdHJlYW0gPSBpbnRlcmZhY2UoSUNvbW1vblRva2VuU3RyZWFtKQorICBbJ3s3QjQ5Q0JCNi05Mzk1LTQ3ODEtQjYxNi1GMjAxODg5RUVBMTN9J10KKyAgICB7IE1ldGhvZHMgfQorICAgIHByb2NlZHVyZSBSb2xsYmFjayhjb25zdCBJbnN0cnVjdGlvbkluZGV4OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+Um9sbGJhY2sgdGhlIGluc3RydWN0aW9uIHN0cmVhbSBmb3IgYSBwcm9ncmFtIHNvIHRoYXQKKyAgICAvLy8gdGhlIGluZGljYXRlZCBpbnN0cnVjdGlvbiAodmlhIGluc3RydWN0aW9uSW5kZXgpIGlzIG5vCisgICAgLy8vIGxvbmdlciBpbiB0aGUgc3RyZWFtLiAgVU5URVNURUQhCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgUm9sbGJhY2soY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgICAgIGNvbnN0IEluc3RydWN0aW9uSW5kZXg6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBEZWxldGVQcm9ncmFtOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT5SZXNldCB0aGUgcHJvZ3JhbSBzbyB0aGF0IG5vIGluc3RydWN0aW9ucyBleGlzdCA8L3N1bW1hcnk+CisgICAgcHJvY2VkdXJlIERlbGV0ZVByb2dyYW0oY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZyk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IFQ6IElUb2tlbjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0QWZ0ZXIoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgVDogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IEluZGV4OiBJbnRlZ2VyOworICAgICAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IFQ6IElUb2tlbjsgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0QWZ0ZXIoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgVDogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IEluZGV4OiBJbnRlZ2VyOworICAgICAgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgSW5zZXJ0QmVmb3JlKGNvbnN0IFQ6IElUb2tlbjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEJlZm9yZShjb25zdCBJbmRleDogSW50ZWdlcjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEJlZm9yZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBUOiBJVG9rZW47CisgICAgICBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0QmVmb3JlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IEluZGV4OiBJbnRlZ2VyOworICAgICAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEJlZm9yZShjb25zdCBUOiBJVG9rZW47IGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRCZWZvcmUoY29uc3QgSW5kZXg6IEludGVnZXI7IGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRCZWZvcmUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgVDogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEJlZm9yZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgSW5kZXg6IEludGVnZXI7IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZShjb25zdCBJbmRleFQ6IElUb2tlbjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXI7CisgICAgICBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwgU3RvcDogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgSW5kZXg6IEludGVnZXI7IGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZShjb25zdCBJbmRleFQ6IElUb2tlbjsgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbjsgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXI7CisgICAgICBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwgU3RvcDogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgRGVsZXRlKGNvbnN0IEluZGV4OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIERlbGV0ZShjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBEZWxldGUoY29uc3QgSW5kZXhUOiBJVG9rZW4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgRGVsZXRlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJVG9rZW4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgRGVsZXRlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIERlbGV0ZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwgU3RvcDogSVRva2VuKTsgb3ZlcmxvYWQ7CisKKyAgICBmdW5jdGlvbiBHZXRMYXN0UmV3cml0ZVRva2VuSW5kZXg6IEludGVnZXI7CisKKyAgICBmdW5jdGlvbiBUb09yaWdpbmFsU3RyaW5nOiBTdHJpbmc7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFRvT3JpZ2luYWxTdHJpbmcoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXIpOiBTdHJpbmc7IG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmcoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZyk6IFN0cmluZzsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gVG9TdHJpbmcoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgICAgIGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogU3RyaW5nOyBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIFRvRGVidWdTdHJpbmc6IFN0cmluZzsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gVG9EZWJ1Z1N0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsgb3ZlcmxvYWQ7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+VGhlIHJvb3Qgb2YgdGhlIEFOVExSIGV4Y2VwdGlvbiBoaWVyYXJjaHkuPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBUbyBhdm9pZCBFbmdsaXNoLW9ubHkgZXJyb3IgbWVzc2FnZXMgYW5kIHRvIGdlbmVyYWxseSBtYWtlIHRoaW5ncworICAvLy8gYXMgZmxleGlibGUgYXMgcG9zc2libGUsIHRoZXNlIGV4Y2VwdGlvbnMgYXJlIG5vdCBjcmVhdGVkIHdpdGggc3RyaW5ncywKKyAgLy8vIGJ1dCByYXRoZXIgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBnZW5lcmF0ZSBhbiBlcnJvci4gIFRoZW4KKyAgLy8vIHRoZSB2YXJpb3VzIHJlcG9ydGluZyBtZXRob2RzIGluIFBhcnNlciBhbmQgTGV4ZXIgY2FuIGJlIG92ZXJyaWRkZW4KKyAgLy8vIHRvIGdlbmVyYXRlIGEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UuICBGb3IgZXhhbXBsZSwgTWlzbWF0Y2hlZFRva2VuCisgIC8vLyBleGNlcHRpb25zIGFyZSBidWlsdCB3aXRoIHRoZSBleHBlY3RlZCB0b2tlbiB0eXBlLgorICAvLy8gU28sIGRvbid0IGV4cGVjdCBnZXRNZXNzYWdlKCkgdG8gcmV0dXJuIGFueXRoaW5nLgorICAvLy8KKyAgLy8vIFlvdSBjYW4gYWNjZXNzIHRoZSBzdGFjayB0cmFjZSwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgY2FuIGNvbXB1dGUgdGhlCisgIC8vLyBjb21wbGV0ZSB0cmFjZSBvZiBydWxlcyBmcm9tIHRoZSBzdGFydCBzeW1ib2wuIFRoaXMgZ2l2ZXMgeW91IGNvbnNpZGVyYWJsZQorICAvLy8gY29udGV4dCBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIHRvIGdlbmVyYXRlIHVzZWZ1bCBlcnJvciBtZXNzYWdlcy4KKyAgLy8vCisgIC8vLyBBTlRMUiBnZW5lcmF0ZXMgY29kZSB0aGF0IHRocm93cyBleGNlcHRpb25zIHVwb24gcmVjb2duaXRpb24gZXJyb3IgYW5kCisgIC8vLyBhbHNvIGdlbmVyYXRlcyBjb2RlIHRvIGNhdGNoIHRoZXNlIGV4Y2VwdGlvbnMgaW4gZWFjaCBydWxlLiAgSWYgeW91CisgIC8vLyB3YW50IHRvIHF1aXQgdXBvbiBmaXJzdCBlcnJvciwgeW91IGNhbiB0dXJuIG9mZiB0aGUgYXV0b21hdGljIGVycm9yCisgIC8vLyBoYW5kbGluZyBtZWNoYW5pc20gdXNpbmcgcnVsZWNhdGNoIGFjdGlvbiwgYnV0IHlvdSBzdGlsbCBuZWVkIHRvCisgIC8vLyBvdmVycmlkZSBtZXRob2RzIG1pc21hdGNoIGFuZCByZWNvdmVyRnJvbU1pc21hdGNoU2V0LgorICAvLy8KKyAgLy8vIEluIGdlbmVyYWwsIHRoZSByZWNvZ25pdGlvbiBleGNlcHRpb25zIGNhbiB0cmFjayB3aGVyZSBpbiBhIGdyYW1tYXIgYQorICAvLy8gcHJvYmxlbSBvY2N1cnJlZCBhbmQvb3Igd2hhdCB3YXMgdGhlIGV4cGVjdGVkIGlucHV0LiAgV2hpbGUgdGhlIHBhcnNlcgorICAvLy8ga25vd3MgaXRzIHN0YXRlIChzdWNoIGFzIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFuZCBsaW5lIGluZm8pIHRoYXQKKyAgLy8vIHN0YXRlIGNhbiBjaGFuZ2UgYmVmb3JlIHRoZSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgc28gY3VycmVudCB0b2tlbiBpbmRleAorICAvLy8gaXMgY29tcHV0ZWQgYW5kIHN0b3JlZCBhdCBleGNlcHRpb24gdGltZS4gIEZyb20gdGhpcyBpbmZvLCB5b3UgY2FuCisgIC8vLyBwZXJoYXBzIHByaW50IGFuIGVudGlyZSBsaW5lIG9mIGlucHV0IG5vdCBqdXN0IGEgc2luZ2xlIHRva2VuLCBmb3IgZXhhbXBsZS4KKyAgLy8vIEJldHRlciB0byBqdXN0IHNheSB0aGUgcmVjb2duaXplciBoYWQgYSBwcm9ibGVtIGFuZCB0aGVuIGxldCB0aGUgcGFyc2VyCisgIC8vLyBmaWd1cmUgb3V0IGEgZmFuY3kgcmVwb3J0LgorICAvLy8gPC9yZW1hcmtzPgorICBFUmVjb2duaXRpb25FeGNlcHRpb24gPSBjbGFzcyhFeGNlcHRpb24pCisgIHN0cmljdCBwcml2YXRlCisgICAgRkFwcHJveGltYXRlTGluZUluZm86IEJvb2xlYW47CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICAvLy8gPHN1bW1hcnk+V2hhdCBpbnB1dCBzdHJlYW0gZGlkIHRoZSBlcnJvciBvY2N1ciBpbj8gPC9zdW1tYXJ5PgorICAgIEZJbnB1dDogSUludFN0cmVhbTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gV2hhdCBpcyBpbmRleCBvZiB0b2tlbi9jaGFyIHdlcmUgd2UgbG9va2luZyBhdCB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZD8KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZJbmRleDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGN1cnJlbnQgVG9rZW4gd2hlbiBhbiBlcnJvciBvY2N1cnJlZC4gIFNpbmNlIG5vdCBhbGwgc3RyZWFtcworICAgIC8vLyBjYW4gcmV0cmlldmUgdGhlIGl0aCBUb2tlbiwgd2UgaGF2ZSB0byB0cmFjayB0aGUgVG9rZW4gb2JqZWN0LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRlRva2VuOiBJVG9rZW47CisKKyAgICAvLy8gPHN1bW1hcnk+W1RyZWUgcGFyc2VyXSBOb2RlIHdpdGggdGhlIHByb2JsZW0uPC9zdW1tYXJ5PgorICAgIEZOb2RlOiBJQU5UTFJJbnRlcmZhY2U7CisKKyAgICAvLy8gPHN1bW1hcnk+VGhlIGN1cnJlbnQgY2hhciB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiBGb3IgbGV4ZXJzLiA8L3N1bW1hcnk+CisgICAgRkM6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+VHJhY2sgdGhlIGxpbmUgYXQgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkIGluIGNhc2UgdGhpcyBpcworICAgIC8vLyBnZW5lcmF0ZWQgZnJvbSBhIGxleGVyLiAgV2UgbmVlZCB0byB0cmFjayB0aGlzIHNpbmNlIHRoZQorICAgIC8vLyB1bmV4cGVjdGVkIGNoYXIgZG9lc24ndCBjYXJyeSB0aGUgbGluZSBpbmZvLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRkxpbmU6IEludGVnZXI7CisgICAgRkNoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBFeHRyYWN0SW5mb3JtYXRpb25Gcm9tVHJlZU5vZGVTdHJlYW0oY29uc3QgSW5wdXQ6IElJbnRTdHJlYW0pOworICAgIGZ1bmN0aW9uIEdldFVuZXhwZWN0ZWRUeXBlOiBJbnRlZ2VyOyB2aXJ0dWFsOworICBwdWJsaWMKKyAgICAvLy8gPHN1bW1hcnk+VXNlZCBmb3IgcmVtb3RlIGRlYnVnZ2VyIGRlc2VyaWFsaXphdGlvbiA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQU1lc3NhZ2U6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBSW5wdXQ6IElJbnRTdHJlYW0pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQU1lc3NhZ2U6IFN0cmluZzsgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIElmIHlvdSBhcmUgcGFyc2luZyBhIHRyZWUgbm9kZSBzdHJlYW0sIHlvdSB3aWxsIGVuY291bnRlciBzb21lCisgICAgLy8vIGltYWdpbmFyeSBub2RlcyB3L28gbGluZS9jb2wgaW5mby4gIFdlIG5vdyBzZWFyY2ggYmFja3dhcmRzIGxvb2tpbmcKKyAgICAvLy8gZm9yIG1vc3QgcmVjZW50IHRva2VuIHdpdGggbGluZS9jb2wgaW5mbywgYnV0IG5vdGlmeSBnZXRFcnJvckhlYWRlcigpCisgICAgLy8vIHRoYXQgaW5mbyBpcyBhcHByb3hpbWF0ZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IEFwcHJveGltYXRlTGluZUluZm86IEJvb2xlYW4gcmVhZCBGQXBwcm94aW1hdGVMaW5lSW5mbyB3cml0ZSBGQXBwcm94aW1hdGVMaW5lSW5mbzsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBUb2tlbiB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZCAoZm9yIHBhcnNlcnMKKyAgICAvLy8gYWx0aG91Z2ggYSB0cmVlIHBhcnNlciBtaWdodCBhbHNvIHNldCB0aGUgdG9rZW4pCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9wZXJ0eSBUb2tlbjogSVRva2VuIHJlYWQgRlRva2VuIHdyaXRlIEZUb2tlbjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJucyB0aGUgW3RyZWUgcGFyc2VyXSBub2RlIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkIChmb3IgdHJlZSBwYXJzZXJzKS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IE5vZGU6IElBTlRMUkludGVyZmFjZSByZWFkIEZOb2RlIHdyaXRlIEZOb2RlOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm5zIHRoZSBsaW5lIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZCAoZm9yIGxleGVycykKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb3BlcnR5IExpbmU6IEludGVnZXIgcmVhZCBGTGluZSB3cml0ZSBGTGluZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBsaW5lIHdoZW4gdGhlIGVycm9yCisgICAgLy8vIG9jY3VycmVkIChmb3IgbGV4ZXJzKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgQ2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyIHJlYWQgRkNoYXJQb3NpdGlvbkluTGluZSB3cml0ZSBGQ2hhclBvc2l0aW9uSW5MaW5lOworCisgICAgLy8vIDxzdW1tYXJ5PlJldHVybnMgdGhlIGlucHV0IHN0cmVhbSBpbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQ8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgSW5wdXQ6IElJbnRTdHJlYW0gcmVhZCBGSW5wdXQgd3JpdGUgRklucHV0OworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm5zIHRoZSB0b2tlbiB0eXBlIG9yIGNoYXIgb2YgdGhlIHVuZXhwZWN0ZWQgaW5wdXQgZWxlbWVudAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgVW5leHBlY3RlZFR5cGU6IEludGVnZXIgcmVhZCBHZXRVbmV4cGVjdGVkVHlwZTsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBjaGFyIHdoZW4gdGhlIGVycm9yIG9jY3VycmVkIChmb3IgbGV4ZXJzKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgQ2hhcmFjdGVyOiBJbnRlZ2VyIHJlYWQgRkMgd3JpdGUgRkM7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFJldHVybnMgdGhlIHRva2VuL2NoYXIgaW5kZXggaW4gdGhlIHN0cmVhbSB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHJvcGVydHkgSW5kZXg6IEludGVnZXIgcmVhZCBGSW5kZXggd3JpdGUgRkluZGV4OworICBlbmQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBtaXNtYXRjaGVkIGNoYXIgb3IgVG9rZW4gb3IgdHJlZSBub2RlLgorICAvLy8gPC9zdW1tYXJ5PgorICBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uID0gY2xhc3MoRVJlY29nbml0aW9uRXhjZXB0aW9uKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZFeHBlY3Rpbmc6IEludGVnZXI7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBRXhwZWN0aW5nOiBJbnRlZ2VyOyBjb25zdCBBSW5wdXQ6IElJbnRTdHJlYW0pOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcnJpZGU7CisKKyAgICBwcm9wZXJ0eSBFeHBlY3Rpbmc6IEludGVnZXIgcmVhZCBGRXhwZWN0aW5nIHdyaXRlIEZFeHBlY3Rpbmc7CisgIGVuZDsKKworICBFVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiA9IGNsYXNzKEVNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pCisgIHN0cmljdCBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0VW5leHBlY3RlZFRva2VuOiBJVG9rZW47CisgIHB1YmxpYworICAgIHByb3BlcnR5IFVuZXhwZWN0ZWRUb2tlbjogSVRva2VuIHJlYWQgR2V0VW5leHBlY3RlZFRva2VuOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcnJpZGU7CisgIGVuZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBXZSB3ZXJlIGV4cGVjdGluZyBhIHRva2VuIGJ1dCBpdCdzIG5vdCBmb3VuZC4gVGhlIGN1cnJlbnQgdG9rZW4KKyAgLy8vIGlzIGFjdHVhbGx5IHdoYXQgd2Ugd2FudGVkIG5leHQuIFVzZWQgZm9yIHRyZWUgbm9kZSBlcnJvcnMgdG9vLgorICAvLy8gPC9zdW1tYXJ5PgorICBFTWlzc2luZ1Rva2VuRXhjZXB0aW9uID0gY2xhc3MoRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSW5zZXJ0ZWQ6IElBTlRMUkludGVyZmFjZTsKKyAgICBmdW5jdGlvbiBHZXRNaXNzaW5nVHlwZTogSW50ZWdlcjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFFeHBlY3Rpbmc6IEludGVnZXI7IGNvbnN0IEFJbnB1dDogSUludFN0cmVhbTsKKyAgICAgIGNvbnN0IEFJbnNlcnRlZDogSUFOVExSSW50ZXJmYWNlKTsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworCisgICAgcHJvcGVydHkgTWlzc2luZ1R5cGU6IEludGVnZXIgcmVhZCBHZXRNaXNzaW5nVHlwZTsKKyAgICBwcm9wZXJ0eSBJbnNlcnRlZDogSUFOVExSSW50ZXJmYWNlIHJlYWQgRkluc2VydGVkIHdyaXRlIEZJbnNlcnRlZDsKKyAgZW5kOworCisgIEVNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24gPSBjbGFzcyhFUmVjb2duaXRpb25FeGNlcHRpb24pCisgIHN0cmljdCBwcml2YXRlCisgICAgRkV4cGVjdGluZzogSW50ZWdlcjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFFeHBlY3Rpbmc6IEludGVnZXI7IGNvbnN0IEFJbnB1dDogSUludFN0cmVhbSk7CisKKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKworICAgIHByb3BlcnR5IEV4cGVjdGluZzogSW50ZWdlciByZWFkIEZFeHBlY3Rpbmcgd3JpdGUgRkV4cGVjdGluZzsKKyAgZW5kOworCisgIEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA9IGNsYXNzKEVSZWNvZ25pdGlvbkV4Y2VwdGlvbikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb246IFN0cmluZzsKKyAgICBGRGVjaXNpb25OdW1iZXI6IEludGVnZXI7CisgICAgRlN0YXRlTnVtYmVyOiBJbnRlZ2VyOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uOiBTdHJpbmc7CisgICAgICBjb25zdCBBRGVjaXNpb25OdW1iZXIsIEFTdGF0ZU51bWJlcjogSW50ZWdlcjsgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworCisgICAgcHJvcGVydHkgR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb246IFN0cmluZyByZWFkIEZHcmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbjsKKyAgICBwcm9wZXJ0eSBEZWNpc2lvbk51bWJlcjogSW50ZWdlciByZWFkIEZEZWNpc2lvbk51bWJlcjsKKyAgICBwcm9wZXJ0eSBTdGF0ZU51bWJlcjogSW50ZWdlciByZWFkIEZTdGF0ZU51bWJlcjsKKyAgZW5kOworCisgIEVFYXJseUV4aXRFeGNlcHRpb24gPSBjbGFzcyhFUmVjb2duaXRpb25FeGNlcHRpb24pCisgIHN0cmljdCBwcml2YXRlCisgICAgRkRlY2lzaW9uTnVtYmVyOiBJbnRlZ2VyOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQURlY2lzaW9uTnVtYmVyOiBJbnRlZ2VyOyBjb25zdCBBSW5wdXQ6IElJbnRTdHJlYW0pOworCisgICAgcHJvcGVydHkgRGVjaXNpb25OdW1iZXI6IEludGVnZXIgcmVhZCBGRGVjaXNpb25OdW1iZXI7CisgIGVuZDsKKworICBFTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiA9IGNsYXNzKEVSZWNvZ25pdGlvbkV4Y2VwdGlvbikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGRXhwZWN0aW5nOiBJQml0U2V0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUV4cGVjdGluZzogSUJpdFNldDsgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworCisgICAgcHJvcGVydHkgRXhwZWN0aW5nOiBJQml0U2V0IHJlYWQgRkV4cGVjdGluZyB3cml0ZSBGRXhwZWN0aW5nOworICBlbmQ7CisKKyAgRU1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gPSBjbGFzcyhFTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbikKKworICBwdWJsaWMKKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgZW5kOworCisgIEVGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gPSBjbGFzcyhFUmVjb2duaXRpb25FeGNlcHRpb24pCisgIHN0cmljdCBwcml2YXRlCisgICAgRlJ1bGVOYW1lOiBTdHJpbmc7CisgICAgRlByZWRpY2F0ZVRleHQ6IFN0cmluZzsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSUludFN0cmVhbTsgY29uc3QgQVJ1bGVOYW1lLAorICAgICAgQVByZWRpY2F0ZVRleHQ6IFN0cmluZyk7CisKKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKworICAgIHByb3BlcnR5IFJ1bGVOYW1lOiBTdHJpbmcgcmVhZCBGUnVsZU5hbWUgd3JpdGUgRlJ1bGVOYW1lOworICAgIHByb3BlcnR5IFByZWRpY2F0ZVRleHQ6IFN0cmluZyByZWFkIEZQcmVkaWNhdGVUZXh0IHdyaXRlIEZQcmVkaWNhdGVUZXh0OworICBlbmQ7CisKKyAgRU1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiA9IGNsYXNzKEVSZWNvZ25pdGlvbkV4Y2VwdGlvbikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQTogSW50ZWdlcjsKKyAgICBGQjogSW50ZWdlcjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFBLCBBQjogSW50ZWdlcjsgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworCisgICAgcHJvcGVydHkgQTogSW50ZWdlciByZWFkIEZBIHdyaXRlIEZBOworICAgIHByb3BlcnR5IEI6IEludGVnZXIgcmVhZCBGQiB3cml0ZSBGQjsKKyAgZW5kOworCit0eXBlCisgIFRDaGFyU3RyZWFtU3RhdGUgPSBjbGFzcyhUQU5UTFJPYmplY3QsIElDaGFyU3RyZWFtU3RhdGUpCisgIHN0cmljdCBwcml2YXRlCisgICAgRlA6IEludGVnZXI7CisgICAgRkxpbmU6IEludGVnZXI7CisgICAgRkNoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgcHJvdGVjdGVkCisgICAgeyBJQ2hhclN0cmVhbVN0YXRlIH0KKyAgICBmdW5jdGlvbiBHZXRQOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRQKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRMaW5lOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRMaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENoYXJQb3NpdGlvbkluTGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgIGVuZDsKKwordHlwZQorICBUQU5UTFJTdHJpbmdTdHJlYW0gPSBjbGFzcyhUQU5UTFJPYmplY3QsIElBTlRMUlN0cmluZ1N0cmVhbSwgSUNoYXJTdHJlYW0pCisgIHByaXZhdGUKKyAgICBGRGF0YTogUENoYXI7CisgICAgRk93bnNEYXRhOiBCb29sZWFuOworCisgICAgLy8vIDxzdW1tYXJ5PkhvdyBtYW55IGNoYXJhY3RlcnMgYXJlIGFjdHVhbGx5IGluIHRoZSBidWZmZXI/PC9zdW1tYXJ5PgorICAgIEZOOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PkN1cnJlbnQgbGluZSBudW1iZXIgd2l0aGluIHRoZSBpbnB1dCAoMS4ubiApPC9zdW1tYXJ5PgorICAgIEZMaW5lOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PkluZGV4IGluIG91ciBhcnJheSBmb3IgdGhlIG5leHQgY2hhciAoMC4ubi0xKTwvc3VtbWFyeT4KKyAgICBGUDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAvLy8gbGluZSAoMC4ubi0xKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRkNoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHJhY2tzIHRoZSBkZXB0aCBvZiBuZXN0ZWQgPHNlZSBjcmVmPSJJSW50U3RyZWFtLk1hcmsiLz4gY2FsbHMKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZNYXJrRGVwdGg6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEEgbGlzdCBvZiBDaGFyU3RyZWFtU3RhdGUgb2JqZWN0cyB0aGF0IHRyYWNrcyB0aGUgc3RyZWFtIHN0YXRlCisgICAgLy8vIChpLmUuIGxpbmUsIGNoYXJQb3NpdGlvbkluTGluZSwgYW5kIHApIHRoYXQgY2FuIGNoYW5nZSBhcyB5b3UKKyAgICAvLy8gbW92ZSB0aHJvdWdoIHRoZSBpbnB1dCBzdHJlYW0uICBJbmRleGVkIGZyb20gMS4ubWFya0RlcHRoLgorICAgIC8vLyBBIG51bGwgaXMga2VwdCBAIGluZGV4IDAuICBDcmVhdGUgdXBvbiBmaXJzdCBjYWxsIHRvIE1hcmsoKS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZNYXJrZXJzOiBJTGlzdDxJQ2hhclN0cmVhbVN0YXRlPjsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gVHJhY2sgdGhlIGxhc3QgTWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gUmV3aW5kKCkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGTGFzdE1hcmtlcjogSW50ZWdlcjsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFdoYXQgaXMgbmFtZSBvciBzb3VyY2Ugb2YgdGhpcyBjaGFyIHN0cmVhbT8KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZOYW1lOiBTdHJpbmc7CisgIHByb3RlY3RlZAorICAgIHsgSUludFN0cmVhbSB9CisgICAgZnVuY3Rpb24gR2V0U291cmNlTmFtZTogU3RyaW5nOyB2aXJ0dWFsOworCisgICAgcHJvY2VkdXJlIENvbnN1bWU7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gTEEoSTogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gTEFDaGFyKEk6IEludGVnZXIpOiBDaGFyOworICAgIGZ1bmN0aW9uIEluZGV4OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFNpemU6IEludGVnZXI7CisgICAgZnVuY3Rpb24gTWFyazogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgUmV3aW5kKGNvbnN0IE1hcmtlcjogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXdpbmQ7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZWxlYXNlKGNvbnN0IE1hcmtlcjogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNlZWsoY29uc3QgSW5kZXg6IEludGVnZXIpOyB2aXJ0dWFsOworCisgICAgcHJvcGVydHkgU291cmNlTmFtZTogU3RyaW5nIHJlYWQgR2V0U291cmNlTmFtZSB3cml0ZSBGTmFtZTsKKyAgcHJvdGVjdGVkCisgICAgeyBJQ2hhclN0cmVhbSB9CisgICAgZnVuY3Rpb24gR2V0TGluZTogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0TGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRDaGFyUG9zaXRpb25JbkxpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIExUKGNvbnN0IEk6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFN1YnN0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsgdmlydHVhbDsKKyAgcHJvdGVjdGVkCisgICAgeyBJQU5UTFJTdHJpbmdTdHJlYW0gfQorICAgIHByb2NlZHVyZSBSZXNldDsgdmlydHVhbDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFOVExSU3RyaW5nU3RyZWFtIGNsYXNzIGZvciB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHN0cmluZy4gVGhpcyBjb3BpZXMgZGF0YSBmcm9tIHRoZSBzdHJpbmcgdG8gYSBsb2NhbAorICAgIC8vLyBjaGFyYWN0ZXIgYXJyYXkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBSW5wdXQ6IFN0cmluZyk7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQU5UTFJTdHJpbmdTdHJlYW0gY2xhc3MgZm9yIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgY2hhcmFjdGVyIGFycmF5LiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgY29uc3RydWN0b3IgYXMKKyAgICAvLy8gbm8gZGF0YSBpcyBjb3BpZWQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBRGF0YTogUENoYXI7CisgICAgICBjb25zdCBBTnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXk6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUQU5UTFJGaWxlU3RyZWFtID0gY2xhc3MoVEFOVExSU3RyaW5nU3RyZWFtLCBJQU5UTFJGaWxlU3RyZWFtKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIC8vLyA8c3VtbWFyeT5GdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3RyZWFtJ3MgdW5kZXJseWluZyBmaWxlPC9zdW1tYXJ5PgorICAgIEZGaWxlTmFtZTogU3RyaW5nOworICBwcm90ZWN0ZWQKKyAgICB7IElJbnRTdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldFNvdXJjZU5hbWU6IFN0cmluZzsgb3ZlcnJpZGU7CisgIHByb3RlY3RlZAorICAgIHsgSUFOVExSRmlsZVN0cmVhbSB9CisKKyAgICBwcm9jZWR1cmUgTG9hZChjb25zdCBGaWxlTmFtZTogU3RyaW5nOyBjb25zdCBFbmNvZGluZzogVEVuY29kaW5nKTsgdmlydHVhbDsKKyAgcHVibGljCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQU5UTFJGaWxlU3RyZWFtIGNsYXNzIGZvciB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGZpbGUgbmFtZQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFGaWxlTmFtZTogU3RyaW5nKTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBTlRMUkZpbGVTdHJlYW0gY2xhc3MgZm9yIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgZmlsZSBuYW1lIGFuZCBlbmNvZGluZworICAgIC8vLyA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFGaWxlTmFtZTogU3RyaW5nOyBjb25zdCBBRW5jb2Rpbmc6IFRFbmNvZGluZyk7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVEJpdFNldCA9IGNsYXNzKFRBTlRMUk9iamVjdCwgSUJpdFNldCwgSUNsb25lYWJsZSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBjb25zdAorICAgICAgQklUUyA9IDY0OyAvLyBudW1iZXIgb2YgYml0cyAvIHVsb25nCisgICAgICBMT0dfQklUUyA9IDY7IC8vIDIgc2hsIDYgPSA2NAorCisgICAgICAvLy88c3VtbWFyeT4gV2Ugd2lsbCBvZnRlbiBuZWVkIHRvIGRvIGEgbW9kIG9wZXJhdG9yIChpIG1vZCBuYml0cykuCisgICAgICAvLy8gSXRzIHR1cm5zIG91dCB0aGF0LCBmb3IgcG93ZXJzIG9mIHR3bywgdGhpcyBtb2Qgb3BlcmF0aW9uIGlzCisgICAgICAvLy8gIHNhbWUgYXMgPCFbQ0RBVEFbKEkgYW5kIChuYml0cy0xKSldXT4uICBTaW5jZSBtb2QgaXMgc2xvdywgd2UgdXNlIGEgcHJlY29tcHV0ZWQKKyAgICAgIC8vLyBtb2QgbWFzayB0byBkbyB0aGUgbW9kIGluc3RlYWQuCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgTU9EX01BU0sgPSBCSVRTIC0gMTsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+VGhlIGFjdHVhbCBkYXRhIGJpdHMgPC9zdW1tYXJ5PgorICAgIEZCaXRzOiBUVUludDY0QXJyYXk7CisgIHN0cmljdCBwcml2YXRlCisgICAgY2xhc3MgZnVuY3Rpb24gV29yZE51bWJlcihjb25zdCBCaXQ6IEludGVnZXIpOiBJbnRlZ2VyOyBzdGF0aWM7CisgICAgY2xhc3MgZnVuY3Rpb24gQml0TWFzayhjb25zdCBCaXROdW1iZXI6IEludGVnZXIpOiBVSW50NjQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBOdW1Xb3Jkc1RvSG9sZChjb25zdCBFbDogSW50ZWdlcik6IEludGVnZXI7IHN0YXRpYzsKKyAgcHJvdGVjdGVkCisgICAgeyBJQ2xvbmVhYmxlIH0KKyAgICBmdW5jdGlvbiBDbG9uZTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICBwcm90ZWN0ZWQKKyAgICB7IElCaXRTZXQgfQorICAgIGZ1bmN0aW9uIEdldElzTmlsOiBCb29sZWFuOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEJpdFNldE9yKGNvbnN0IEE6IElCaXRTZXQpOiBJQml0U2V0OyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgRWw6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBHcm93VG9JbmNsdWRlKGNvbnN0IEJpdDogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIE9ySW5QbGFjZShjb25zdCBBOiBJQml0U2V0KTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBTaXplOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIE1lbWJlcihjb25zdCBFbDogSW50ZWdlcik6IEJvb2xlYW47IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBFbDogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gTnVtQml0czogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBMZW5ndGhJbkxvbmdXb3JkczogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUSW50ZWdlckFycmF5OyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFRvUGFja2VkQXJyYXk6IFRVSW50NjRBcnJheTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBUb1N0cmluZyhjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7IHJlaW50cm9kdWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgcHVibGljCisgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdCBhIGJpdHNldCBvZiBzaXplIG9uZSB3b3JkICg2NCBiaXRzKSA8L3N1bW1hcnk+CisgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKworICAgIC8vLyA8c3VtbWFyeT5Db25zdHJ1Y3Rpb24gZnJvbSBhIHN0YXRpYyBhcnJheSBvZiB1bG9uZ3MgPC9zdW1tYXJ5PgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBQml0czogYXJyYXkgb2YgVUludDY0KTsgb3ZlcmxvYWQ7CisKKyAgICAvLy8gPHN1bW1hcnk+Q29uc3RydWN0aW9uIGZyb20gYSBsaXN0IG9mIGludGVnZXJzIDwvc3VtbWFyeT4KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUl0ZW1zOiBJTGlzdDxJbnRlZ2VyPik7IG92ZXJsb2FkOworCisgICAgLy8vIDxzdW1tYXJ5PkNvbnN0cnVjdCBhIGJpdHNldCBnaXZlbiB0aGUgc2l6ZTwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9Im5iaXRzIj5UaGUgc2l6ZSBvZiB0aGUgYml0c2V0IGluIGJpdHM8L3BhcmFtPgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBTkJpdHM6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIGNsYXNzIGZ1bmN0aW9uIEJpdFNldE9mKGNvbnN0IEVsOiBJbnRlZ2VyKTogSUJpdFNldDsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBCaXRTZXRPZihjb25zdCBBLCBCOiBJbnRlZ2VyKTogSUJpdFNldDsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBCaXRTZXRPZihjb25zdCBBLCBCLCBDOiBJbnRlZ2VyKTogSUJpdFNldDsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBCaXRTZXRPZihjb25zdCBBLCBCLCBDLCBEOiBJbnRlZ2VyKTogSUJpdFNldDsgb3ZlcmxvYWQ7IHN0YXRpYzsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJsb2FkOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBFcXVhbHMoT2JqOiBUT2JqZWN0KTogQm9vbGVhbjsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUUmVjb2duaXplclNoYXJlZFN0YXRlID0gY2xhc3MoVEFOVExST2JqZWN0LCBJUmVjb2duaXplclNoYXJlZFN0YXRlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZGb2xsb3dpbmc6IFRCaXRTZXRBcnJheTsKKyAgICBGRm9sbG93aW5nU3RhY2tQb2ludGVyOiBJbnRlZ2VyOworICAgIEZFcnJvclJlY292ZXJ5OiBCb29sZWFuOworICAgIEZMYXN0RXJyb3JJbmRleDogSW50ZWdlcjsKKyAgICBGRmFpbGVkOiBCb29sZWFuOworICAgIEZTeW50YXhFcnJvcnM6IEludGVnZXI7CisgICAgRkJhY2t0cmFja2luZzogSW50ZWdlcjsKKyAgICBGUnVsZU1lbW86IFREaWN0aW9uYXJ5QXJyYXk8SW50ZWdlciwgSW50ZWdlcj47CisgICAgRlRva2VuOiBJVG9rZW47CisgICAgRlRva2VuU3RhcnRDaGFySW5kZXg6IEludGVnZXI7CisgICAgRlRva2VuU3RhcnRMaW5lOiBJbnRlZ2VyOworICAgIEZUb2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOworICAgIEZDaGFubmVsOiBJbnRlZ2VyOworICAgIEZUb2tlblR5cGU6IEludGVnZXI7CisgICAgRlRleHQ6IFN0cmluZzsKKyAgcHJvdGVjdGVkCisgICAgeyBJUmVjb2duaXplclNoYXJlZFN0YXRlIH0KKyAgICBmdW5jdGlvbiBHZXRGb2xsb3dpbmc6IFRCaXRTZXRBcnJheTsKKyAgICBwcm9jZWR1cmUgU2V0Rm9sbG93aW5nKGNvbnN0IFZhbHVlOiBUQml0U2V0QXJyYXkpOworICAgIGZ1bmN0aW9uIEdldEZvbGxvd2luZ1N0YWNrUG9pbnRlcjogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Rm9sbG93aW5nU3RhY2tQb2ludGVyKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRFcnJvclJlY292ZXJ5OiBCb29sZWFuOworICAgIHByb2NlZHVyZSBTZXRFcnJvclJlY292ZXJ5KGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRMYXN0RXJyb3JJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0TGFzdEVycm9ySW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEZhaWxlZDogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgU2V0RmFpbGVkKGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRTeW50YXhFcnJvcnM6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFN5bnRheEVycm9ycyhjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0QmFja3RyYWNraW5nOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRCYWNrdHJhY2tpbmcoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFJ1bGVNZW1vOiBURGljdGlvbmFyeUFycmF5PEludGVnZXIsIEludGVnZXI+OworICAgIGZ1bmN0aW9uIEdldFJ1bGVNZW1vQ291bnQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFJ1bGVNZW1vQ291bnQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFRva2VuOiBJVG9rZW47CisgICAgcHJvY2VkdXJlIFNldFRva2VuKGNvbnN0IFZhbHVlOiBJVG9rZW4pOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RhcnRDaGFySW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU3RhcnRDaGFySW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFRva2VuU3RhcnRMaW5lOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRUb2tlblN0YXJ0TGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q2hhbm5lbDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2hhbm5lbChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRUb2tlblR5cGUoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFRleHQ6IFN0cmluZzsKKyAgICBwcm9jZWR1cmUgU2V0VGV4dChjb25zdCBWYWx1ZTogU3RyaW5nKTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKKyAgVENvbW1vblRva2VuID0gY2xhc3MoVEFOVExST2JqZWN0LCBJQ29tbW9uVG9rZW4sIElUb2tlbikKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZUb2tlblR5cGU6IEludGVnZXI7CisgICAgRkxpbmU6IEludGVnZXI7CisgICAgRkNoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgICBGQ2hhbm5lbDogSW50ZWdlcjsKKyAgICBGSW5wdXQ6IElDaGFyU3RyZWFtOworCisgICAgLy8vIDxzdW1tYXJ5PldlIG5lZWQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHRleHQgb25jZSBpbiBhIHdoaWxlLiAgSWYKKyAgICAvLy8gdGhpcyBpcyBub24tbnVsbCwgdGhlbiBnZXRUZXh0IHNob3VsZCByZXR1cm4gdGhpcy4gIE5vdGUgdGhhdAorICAgIC8vLyBzdGFydC9zdG9wIGFyZSBub3QgYWZmZWN0ZWQgYnkgY2hhbmdpbmcgdGhpcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZUZXh0OiBTdHJpbmc7CisKKyAgICAvLy8gPHN1bW1hcnk+V2hhdCB0b2tlbiBudW1iZXIgaXMgdGhpcyBmcm9tIDAuLm4tMSB0b2tlbnM7ICZsdDsgMCBpbXBsaWVzIGludmFsaWQgaW5kZXggPC9zdW1tYXJ5PgorICAgIEZJbmRleDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT5UaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdGFydHMgPC9zdW1tYXJ5PgorICAgIEZTdGFydDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT5UaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdG9wcyA8L3N1bW1hcnk+CisgICAgRlN0b3A6IEludGVnZXI7CisgIHByb3RlY3RlZAorICAgIHsgSVRva2VuIH0KKyAgICBmdW5jdGlvbiBHZXRUb2tlblR5cGU6IEludGVnZXI7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFRva2VuVHlwZShjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0TGluZTogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0TGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRDaGFyUG9zaXRpb25JbkxpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldENoYW5uZWw6IEludGVnZXI7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldENoYW5uZWwoY29uc3QgVmFsdWU6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFRva2VuSW5kZXg6IEludGVnZXI7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFRva2VuSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFRleHQ6IFN0cmluZzsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0VGV4dChjb25zdCBWYWx1ZTogU3RyaW5nKTsgdmlydHVhbDsKKyAgcHJvdGVjdGVkCisgICAgeyBJQ29tbW9uVG9rZW4gfQorICAgIGZ1bmN0aW9uIEdldFN0YXJ0SW5kZXg6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFN0b3BJbmRleDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U3RvcEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJbnB1dFN0cmVhbTogSUNoYXJTdHJlYW07CisgICAgcHJvY2VkdXJlIFNldElucHV0U3RyZWFtKGNvbnN0IFZhbHVlOiBJQ2hhclN0cmVhbSk7CisgIHByb3RlY3RlZAorICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBVG9rZW5UeXBlOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSUNoYXJTdHJlYW07IGNvbnN0IEFUb2tlblR5cGUsIEFDaGFubmVsLAorICAgICAgQVN0YXJ0LCBBU3RvcDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBVG9rZW5UeXBlOiBJbnRlZ2VyOyBjb25zdCBBVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFPbGRUb2tlbjogSVRva2VuKTsgb3ZlcmxvYWQ7CisKKyAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRDbGFzc2ljVG9rZW4gPSBjbGFzcyhUQU5UTFJPYmplY3QsIElDbGFzc2ljVG9rZW4sIElUb2tlbikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGVGV4dDogU3RyaW5nOworICAgIEZUb2tlblR5cGU6IEludGVnZXI7CisgICAgRkxpbmU6IEludGVnZXI7CisgICAgRkNoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKKyAgICBGQ2hhbm5lbDogSW50ZWdlcjsKKworICAgIC8vLyA8c3VtbWFyeT5XaGF0IHRva2VuIG51bWJlciBpcyB0aGlzIGZyb20gMC4ubi0xIHRva2VucyA8L3N1bW1hcnk+CisgICAgRkluZGV4OiBJbnRlZ2VyOworICBwcm90ZWN0ZWQKKyAgICB7IElDbGFzc2ljVG9rZW4gfQorICAgIGZ1bmN0aW9uIEdldFRva2VuVHlwZTogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5UeXBlKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRMaW5lOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRMaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXI7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldENoYXJQb3NpdGlvbkluTGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0Q2hhbm5lbDogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0Q2hhbm5lbChjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5JbmRleDogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5JbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0VGV4dDogU3RyaW5nOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRUZXh0KGNvbnN0IFZhbHVlOiBTdHJpbmcpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldElucHV0U3RyZWFtOiBJQ2hhclN0cmVhbTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0SW5wdXRTdHJlYW0oY29uc3QgVmFsdWU6IElDaGFyU3RyZWFtKTsgdmlydHVhbDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUb2tlblR5cGU6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQU9sZFRva2VuOiBJVG9rZW4pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQVRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgQVRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBVG9rZW5UeXBlOiBJbnRlZ2VyOyBjb25zdCBBVGV4dDogU3RyaW5nOworICAgICAgY29uc3QgQUNoYW5uZWw6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVFRva2VuID0gY2xhc3Mgc2VhbGVkCisgIHB1YmxpYworICAgIGNvbnN0CisgICAgICBFT1JfVE9LRU5fVFlQRSA9IDE7CisKKyAgICAgIC8vLyA8c3VtbWFyeT5pbWFnaW5hcnkgdHJlZSBuYXZpZ2F0aW9uIHR5cGU7IHRyYXZlcnNlICJnZXQgY2hpbGQiIGxpbmsgPC9zdW1tYXJ5PgorICAgICAgRE9XTiA9IDI7CisKKyAgICAgIC8vLyA8c3VtbWFyeT5pbWFnaW5hcnkgdHJlZSBuYXZpZ2F0aW9uIHR5cGU7IGZpbmlzaCB3aXRoIGEgY2hpbGQgbGlzdCA8L3N1bW1hcnk+CisgICAgICBVUCA9IDM7CisKKyAgICAgIE1JTl9UT0tFTl9UWVBFID0gVVAgKyAxOworICAgICAgRU9GID0gSW50ZWdlcihjc2NFT0YpOworICAgICAgSU5WQUxJRF9UT0tFTl9UWVBFID0gMDsKKworICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgLy8vIEFsbCB0b2tlbnMgZ28gdG8gdGhlIHBhcnNlciAodW5sZXNzIHNraXAoKSBpcyBjYWxsZWQgaW4gdGhhdCBydWxlKQorICAgICAgLy8vIG9uIGEgcGFydGljdWxhciAiY2hhbm5lbCIuICBUaGUgcGFyc2VyIHR1bmVzIHRvIGEgcGFydGljdWxhciBjaGFubmVsCisgICAgICAvLy8gc28gdGhhdCB3aGl0ZXNwYWNlIGV0Yy4uLiBjYW4gZ28gdG8gdGhlIHBhcnNlciBvbiBhICJoaWRkZW4iIGNoYW5uZWwuCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgREVGQVVMVF9DSEFOTkVMID0gMDsKKworICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgLy8vIEFueXRoaW5nIG9uIGRpZmZlcmVudCBjaGFubmVsIHRoYW4gREVGQVVMVF9DSEFOTkVMIGlzIG5vdCBwYXJzZWQgYnkgcGFyc2VyLgorICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgIEhJRERFTl9DSEFOTkVMID0gOTk7CisgIHB1YmxpYworICAgIGNsYXNzIHZhcgorICAgICAgRU9GX1RPS0VOOiBJVG9rZW47CisgICAgICBJTlZBTElEX1RPS0VOOiBJVG9rZW47CisgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAvLy8gSW4gYW4gYWN0aW9uLCBhIGxleGVyIHJ1bGUgY2FuIHNldCB0b2tlbiB0byB0aGlzIFNLSVBfVE9LRU4gYW5kIEFOVExSCisgICAgICAvLy8gd2lsbCBhdm9pZCBjcmVhdGluZyBhIHRva2VuIGZvciB0aGlzIHN5bWJvbCBhbmQgdHJ5IHRvIGZldGNoIGFub3RoZXIuCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgU0tJUF9UT0tFTjogSVRva2VuOworICBwcml2YXRlCisgICAgY2xhc3MgcHJvY2VkdXJlIEluaXRpYWxpemU7IHN0YXRpYzsKKyAgZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gR2xvYmFsIGNvbnN0YW50cworICAvLy8gPC9zdW1tYXJ5PgorICBUQ29uc3RhbnRzID0gY2xhc3Mgc2VhbGVkCisgIHB1YmxpYworICAgIGNvbnN0CisgICAgICBWRVJTSU9OID0gJzMuMWIxJzsKKworICAgICAgLy8gTW92ZWQgdG8gdmVyc2lvbiAyIGZvciB2My4xOiBhZGRlZCBncmFtbWFyIG5hbWUgdG8gZW50ZXIvZXhpdCBSdWxlCisgICAgICBERUJVR19QUk9UT0NPTF9WRVJTSU9OID0gJzInOworCisgICAgICBBTlRMUldPUktTX0RJUiA9ICdhbnRscndvcmtzJzsKKyAgZW5kOworCisgIFRCYXNlUmVjb2duaXplciA9IGNsYXNzIGFic3RyYWN0KFRBTlRMUk9iamVjdCwgSUJhc2VSZWNvZ25pemVyKQorICBwdWJsaWMKKyAgICBjb25zdAorICAgICAgTUVNT19SVUxFX0ZBSUxFRCA9IC0yOworICAgICAgTUVNT19SVUxFX1VOS05PV04gPSAtMTsKKyAgICAgIElOSVRJQUxfRk9MTE9XX1NUQUNLX1NJWkUgPSAxMDA7CisgICAgICBORVhUX1RPS0VOX1JVTEVfTkFNRSA9ICduZXh0VG9rZW4nOworICAgICAgLy8gY29waWVzIGZyb20gVG9rZW4gb2JqZWN0IGZvciBjb252ZW5pZW5jZSBpbiBhY3Rpb25zCisgICAgICBERUZBVUxUX1RPS0VOX0NIQU5ORUwgPSBUVG9rZW4uREVGQVVMVF9DSEFOTkVMOworICAgICAgSElEREVOID0gVFRva2VuLkhJRERFTl9DSEFOTkVMOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBbiBleHRlcm5hbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIC0gc2hhcmVhYmxlIC0gaW50ZXJuYWwgc3RhdGUgb2YKKyAgICAvLy8gdGhpcyBsZXhlciwgcGFyc2VyIG9yIHRyZWUgcGFyc2VyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxyZW1hcmtzPgorICAgIC8vLyBUaGUgc3RhdGUgb2YgYSBsZXhlciwgcGFyc2VyLCBvciB0cmVlIHBhcnNlciBhcmUgY29sbGVjdGVkIGludG8KKyAgICAvLy8gZXh0ZXJuYWwgc3RhdGUgb2JqZWN0cyBzbyB0aGF0IHRoZSBzdGF0ZSBjYW4gYmUgc2hhcmVkLiBUaGlzIHNoYXJpbmcKKyAgICAvLy8gaXMgbmVlZGVkIHRvIGhhdmUgb25lIGdyYW1tYXIgaW1wb3J0IG90aGVycyBhbmQgc2hhcmUgc2FtZSBlcnJvcgorICAgIC8vLyB2YXJpYWJsZXMgYW5kIG90aGVyIHN0YXRlIHZhcmlhYmxlcy4gIEl0J3MgYSBraW5kIG9mIGV4cGxpY2l0IG11bHRpcGxlCisgICAgLy8vIGluaGVyaXRhbmNlIHZpYSBkZWxlZ2F0aW9uIG9mIG1ldGhvZHMgYW5kIHNoYXJlZCBzdGF0ZS4KKyAgICAvLy8gPC9yZW1hcmtzPgorICAgIEZTdGF0ZTogSVJlY29nbml6ZXJTaGFyZWRTdGF0ZTsKKworICAgIHByb3BlcnR5IFN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlIHJlYWQgRlN0YXRlOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNYXRjaCBuZWVkcyB0byByZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sLCB3aGljaCBnZXRzIHB1dAorICAgIC8vLyBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKyAgICAvLy8gYW5kIHRyZWUgcGFyc2VycyBuZWVkIHRvIHJldHVybiBkaWZmZXJlbnQgb2JqZWN0cy4gUmF0aGVyIHRoYW4gdGVzdAorICAgIC8vLyBmb3IgaW5wdXQgc3RyZWFtIHR5cGUgb3IgY2hhbmdlIHRoZSBJbnRTdHJlYW0gaW50ZXJmYWNlLCBJIHVzZQorICAgIC8vLyBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorICAgIC8vLyBpbnB1dCBzeW1ib2wgaXMuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+VGhpcyBpcyBpZ25vcmVkIGZvciBsZXhlcnMuPC9yZW1hcmtzPgorICAgIGZ1bmN0aW9uIEdldEN1cnJlbnRJbnB1dFN5bWJvbChjb25zdCBJbnB1dDogSUludFN0cmVhbSk6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRmFjdG9yIG91dCB3aGF0IHRvIGRvIHVwb24gdG9rZW4gbWlzbWF0Y2ggc28gdHJlZSBwYXJzZXJzIGNhbiBiZWhhdmUKKyAgICAvLy8gZGlmZmVyZW50bHkuICBPdmVycmlkZSBhbmQgY2FsbCBNaXNtYXRjaFJlY292ZXIoaW5wdXQsIHR0eXBlLCBmb2xsb3cpCisgICAgLy8vIHRvIGdldCBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbi4gVXNlIHRoaXMgdG8gdHVybiBvZmYKKyAgICAvLy8gc2luZ2xlIHRva2VuIGluc2VydGlvbiBhbmQgZGVsZXRpb24uIE92ZXJyaWRlIG1pc21hdGNoUmVjb3ZlcgorICAgIC8vLyB0byBjYWxsIHRoaXMgaW5zdGVhZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHByb2NlZHVyZSBNaXNtYXRjaChjb25zdCBJbnB1dDogSUludFN0cmVhbTsgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICAgICAgY29uc3QgRm9sbG93OiBJQml0U2V0KTsgdmlydHVhbDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQXR0ZW1wdCB0byBSZWNvdmVyIGZyb20gYSBzaW5nbGUgbWlzc2luZyBvciBleHRyYSB0b2tlbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8cmVtYXJrcz4KKyAgICAvLy8gRVhUUkEgVE9LRU4KKyAgICAvLy8KKyAgICAvLy8gTEEoMSkgaXMgbm90IHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgSWYgTEEoMikgaGFzIHRoZSByaWdodCB0b2tlbiwKKyAgICAvLy8gaG93ZXZlciwgdGhlbiBhc3N1bWUgTEEoMSkgaXMgc29tZSBleHRyYSBzcHVyaW91cyB0b2tlbi4gIERlbGV0ZSBpdAorICAgIC8vLyBhbmQgTEEoMikgYXMgaWYgd2Ugd2VyZSBkb2luZyBhIG5vcm1hbCBNYXRjaCgpLCB3aGljaCBhZHZhbmNlcyB0aGUKKyAgICAvLy8gaW5wdXQuCisgICAgLy8vCisgICAgLy8vIE1JU1NJTkcgVE9LRU4KKyAgICAvLy8KKyAgICAvLy8gSWYgY3VycmVudCB0b2tlbiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBjb3VsZCBjb21lIGFmdGVyCisgICAgLy8vIHR0eXBlIHRoZW4gaXQgaXMgb2sgdG8gImluc2VydCIgdGhlIG1pc3NpbmcgdG9rZW4sIGVsc2UgdGhyb3cKKyAgICAvLy8gZXhjZXB0aW9uIEZvciBleGFtcGxlLCBJbnB1dCAiaT0oMzsiIGlzIGNsZWFybHkgbWlzc2luZyB0aGUKKyAgICAvLy8gJyknLiAgV2hlbiB0aGUgcGFyc2VyIHJldHVybnMgZnJvbSB0aGUgbmVzdGVkIGNhbGwgdG8gZXhwciwgaXQKKyAgICAvLy8gd2lsbCBoYXZlIGNhbGwgY2hhaW46CisgICAgLy8vCisgICAgLy8vIHN0YXQgLT4gZXhwciAtPiBhdG9tCisgICAgLy8vCisgICAgLy8vIGFuZCBpdCB3aWxsIGJlIHRyeWluZyB0byBNYXRjaCB0aGUgJyknIGF0IHRoaXMgcG9pbnQgaW4gdGhlCisgICAgLy8vIGRlcml2YXRpb246CisgICAgLy8vCisgICAgLy8vID0+IElEICc9JyAnKCcgSU5UICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAvLy8gXgorICAgIC8vLyBNYXRjaCgpIHdpbGwgc2VlIHRoYXQgJzsnIGRvZXNuJ3QgTWF0Y2ggJyknIGFuZCByZXBvcnQgYQorICAgIC8vLyBtaXNtYXRjaGVkIHRva2VuIGVycm9yLiAgVG8gUmVjb3ZlciwgaXQgc2VlcyB0aGF0IExBKDEpPT0nOycKKyAgICAvLy8gaXMgaW4gdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZSAnKScgdG9rZW4KKyAgICAvLy8gcmVmZXJlbmNlIGluIHJ1bGUgYXRvbS4gIEl0IGNhbiBhc3N1bWUgdGhhdCB5b3UgZm9yZ290IHRoZSAnKScuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBSZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbihjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgICAgIGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgRm9sbG93OiBJQml0U2V0KTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBDb25qdXJlIHVwIGEgbWlzc2luZyB0b2tlbiBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+CisgICAgLy8vIFRoZSByZWNvZ25pemVyIGF0dGVtcHRzIHRvIHJlY292ZXIgZnJvbSBzaW5nbGUgbWlzc2luZworICAgIC8vLyBzeW1ib2xzLiBCdXQsIGFjdGlvbnMgbWlnaHQgcmVmZXIgdG8gdGhhdCBtaXNzaW5nIHN5bWJvbC4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIHg9SUQge2YoJHgpO30uIFRoZSBhY3Rpb24gY2xlYXJseSBhc3N1bWVzCisgICAgLy8vIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4gaWRlbnRpZmllciBtYXRjaGVkIHByZXZpb3VzbHkgYW5kIHRoYXQKKyAgICAvLy8gJHggcG9pbnRzIGF0IHRoYXQgdG9rZW4uIElmIHRoYXQgdG9rZW4gaXMgbWlzc2luZywgYnV0CisgICAgLy8vIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gaXMgd2hhdCB3ZSB3YW50IHdlIGFzc3VtZSB0aGF0CisgICAgLy8vIHRoaXMgdG9rZW4gaXMgbWlzc2luZyBhbmQgd2Uga2VlcCBnb2luZy4gQmVjYXVzZSB3ZQorICAgIC8vLyBoYXZlIHRvIHJldHVybiBzb21lIHRva2VuIHRvIHJlcGxhY2UgdGhlIG1pc3NpbmcgdG9rZW4sCisgICAgLy8vIHdlIGhhdmUgdG8gY29uanVyZSBvbmUgdXAuIFRoaXMgbWV0aG9kIGdpdmVzIHRoZSB1c2VyIGNvbnRyb2wKKyAgICAvLy8gb3ZlciB0aGUgdG9rZW5zIHJldHVybmVkIGZvciBtaXNzaW5nIHRva2Vucy4gTW9zdGx5LAorICAgIC8vLyB5b3Ugd2lsbCB3YW50IHRvIGNyZWF0ZSBzb21ldGhpbmcgc3BlY2lhbCBmb3IgaWRlbnRpZmllcgorICAgIC8vLyB0b2tlbnMuIEZvciBsaXRlcmFscyBzdWNoIGFzICd7JyBhbmQgJywnLCB0aGUgZGVmYXVsdAorICAgIC8vLyBhY3Rpb24gaW4gdGhlIHBhcnNlciBvciB0cmVlIHBhcnNlciB3b3Jrcy4gSXQgc2ltcGx5IGNyZWF0ZXMKKyAgICAvLy8gYSBDb21tb25Ub2tlbiBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gVGhlIHRleHQgd2lsbCBiZSB0aGUgdG9rZW4uCisgICAgLy8vIElmIHlvdSBjaGFuZ2Ugd2hhdCB0b2tlbnMgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBsZXhlciwKKyAgICAvLy8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0b2tlbnMuCisgICAgLy8vIDwvcmVtYXJrcz4KKyAgICBmdW5jdGlvbiBHZXRNaXNzaW5nU3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOyBjb25zdCBFeHBlY3RlZFRva2VuVHlwZTogSW50ZWdlcjsKKyAgICAgIGNvbnN0IEZvbGxvdzogSUJpdFNldCk6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHVzaCBhIHJ1bGUncyBmb2xsb3cgc2V0IHVzaW5nIG91ciBvd24gaGFyZGNvZGVkIHN0YWNrCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHBhcmFtIG5hbWU9ImZzZXQiPjwvcGFyYW0+CisgICAgcHJvY2VkdXJlIFB1c2hGb2xsb3coY29uc3QgRlNldDogSUJpdFNldCk7CisKKyAgICAvLy8gPHN1bW1hcnk+Q29tcHV0ZSB0aGUgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldCBmb3IgY3VycmVudCBydWxlLgorICAgIC8vLyBUaGlzIGlzIHNldCBvZiB0b2tlbiB0eXBlcyB0aGF0IGNhbiBmb2xsb3cgYSBzcGVjaWZpYyBydWxlCisgICAgLy8vIHJlZmVyZW5jZSBnaXZlbiBhIHNwZWNpZmljIGNhbGwgY2hhaW4uICBZb3UgZ2V0IHRoZSBzZXQgb2YKKyAgICAvLy8gdmlhYmxlIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBjb21lIG5leHQgKGxvb2thaGVhZCBkZXB0aCAxKQorICAgIC8vLyBnaXZlbiB0aGUgY3VycmVudCBjYWxsIGNoYWluLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorICAgIC8vLyBkZWZpbml0aW9uIG9mIHBsYWluIEZPTExPVyBmb3IgcnVsZSByOgorICAgIC8vLworICAgIC8vLyBGT0xMT1cocik9e3ggfCBTPT4qYWxwaGEgciBiZXRhIGluIEcgYW5kIHggaW4gRklSU1QoYmV0YSl9CisgICAgLy8vCisgICAgLy8vIHdoZXJlIHggaW4gVCogYW5kIGFscGhhLCBiZXRhIGluIFYqOyBUIGlzIHNldCBvZiB0ZXJtaW5hbHMgYW5kCisgICAgLy8vIFYgaXMgdGhlIHNldCBvZiB0ZXJtaW5hbHMgYW5kIG5vbnRlcm1pbmFscy4gIEluIG90aGVyIHdvcmRzLAorICAgIC8vLyBGT0xMT1cocikgaXMgdGhlIHNldCBvZiBhbGwgdG9rZW5zIHRoYXQgY2FuIHBvc3NpYmx5IGZvbGxvdworICAgIC8vLyByZWZlcmVuY2VzIHRvIHIgaW4gKmFueSogc2VudGVudGlhbCBmb3JtIChjb250ZXh0KS4gIEF0CisgICAgLy8vIHJ1bnRpbWUsIGhvd2V2ZXIsIHdlIGtub3cgcHJlY2lzZWx5IHdoaWNoIGNvbnRleHQgYXBwbGllcyBhcworICAgIC8vLyB3ZSBoYXZlIHRoZSBjYWxsIGNoYWluLiAgV2UgbWF5IGNvbXB1dGUgdGhlIGV4YWN0IChyYXRoZXIKKyAgICAvLy8gdGhhbiBjb3ZlcmluZyBzdXBlcnNldCkgc2V0IG9mIGZvbGxvd2luZyB0b2tlbnMuCisgICAgLy8vCisgICAgLy8vIEZvciBleGFtcGxlLCBjb25zaWRlciBncmFtbWFyOgorICAgIC8vLworICAgIC8vLyBzdGF0IDogSUQgJz0nIGV4cHIgJzsnICAgICAgLy8gRk9MTE9XKHN0YXQpPT17RU9GfQorICAgIC8vLyB8ICJyZXR1cm4iIGV4cHIgJy4nCisgICAgLy8vIDsKKyAgICAvLy8gZXhwciA6IGF0b20gKCcrJyBhdG9tKSogOyAgIC8vIEZPTExPVyhleHByKT09eyc7JywnLicsJyknfQorICAgIC8vLyBhdG9tIDogSU5UICAgICAgICAgICAgICAgICAgLy8gRk9MTE9XKGF0b20pPT17JysnLCcpJywnOycsJy4nfQorICAgIC8vLyB8ICcoJyBleHByICcpJworICAgIC8vLyA7CisgICAgLy8vCisgICAgLy8vIFRoZSBGT0xMT1cgc2V0cyBhcmUgYWxsIGluY2x1c2l2ZSB3aGVyZWFzIGNvbnRleHQtc2Vuc2l0aXZlCisgICAgLy8vIEZPTExPVyBzZXRzIGFyZSBwcmVjaXNlbHkgd2hhdCBjb3VsZCBmb2xsb3cgYSBydWxlIHJlZmVyZW5jZS4KKyAgICAvLy8gRm9yIGlucHV0IGlucHV0ICJpPSgzKTsiLCBoZXJlIGlzIHRoZSBkZXJpdmF0aW9uOgorICAgIC8vLworICAgIC8vLyBzdGF0ID0+IElEICc9JyBleHByICc7JworICAgIC8vLyA9PiBJRCAnPScgYXRvbSAoJysnIGF0b20pKiAnOycKKyAgICAvLy8gPT4gSUQgJz0nICcoJyBleHByICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAvLy8gPT4gSUQgJz0nICcoJyBhdG9tICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAvLy8gPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JworICAgIC8vLyA9PiBJRCAnPScgJygnIElOVCAnKScgJzsnCisgICAgLy8vCisgICAgLy8vIEF0IHRoZSAiMyIgdG9rZW4sIHlvdSdkIGhhdmUgYSBjYWxsIGNoYWluIG9mCisgICAgLy8vCisgICAgLy8vIHN0YXQgLT4gZXhwciAtPiBhdG9tIC0+IGV4cHIgLT4gYXRvbQorICAgIC8vLworICAgIC8vLyBXaGF0IGNhbiBmb2xsb3cgdGhhdCBzcGVjaWZpYyBuZXN0ZWQgcmVmIHRvIGF0b20/ICBFeGFjdGx5ICcpJworICAgIC8vLyBhcyB5b3UgY2FuIHNlZSBieSBsb29raW5nIGF0IHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgc3BlY2lmaWMKKyAgICAvLy8gaW5wdXQuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIEZPTExPVyhhdG9tKT17JysnLCcpJywnOycsJy4nfS4KKyAgICAvLy8KKyAgICAvLy8gWW91IHdhbnQgdGhlIGV4YWN0IHZpYWJsZSB0b2tlbiBzZXQgd2hlbiByZWNvdmVyaW5nIGZyb20gYQorICAgIC8vLyB0b2tlbiBtaXNtYXRjaC4gIFVwb24gdG9rZW4gbWlzbWF0Y2gsIGlmIExBKDEpIGlzIG1lbWJlciBvZgorICAgIC8vLyB0aGUgdmlhYmxlIG5leHQgdG9rZW4gc2V0LCB0aGVuIHlvdSBrbm93IHRoZXJlIGlzIG1vc3QgbGlrZWx5CisgICAgLy8vIGEgbWlzc2luZyB0b2tlbiBpbiB0aGUgaW5wdXQgc3RyZWFtLiAgIkluc2VydCIgb25lIGJ5IGp1c3Qgbm90CisgICAgLy8vIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIENvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVzogSUJpdFNldDsgdmlydHVhbDsKKworICAgICgqICBDb21wdXRlIHRoZSBlcnJvciByZWNvdmVyeSBzZXQgZm9yIHRoZSBjdXJyZW50IHJ1bGUuICBEdXJpbmcKKyAgICAqICBydWxlIGludm9jYXRpb24sIHRoZSBwYXJzZXIgcHVzaGVzIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuCisgICAgKiAgZm9sbG93IHRoYXQgcnVsZSByZWZlcmVuY2Ugb24gdGhlIHN0YWNrOyB0aGlzIGFtb3VudHMgdG8KKyAgICAqICBjb21wdXRpbmcgRklSU1Qgb2Ygd2hhdCBmb2xsb3dzIHRoZSBydWxlIHJlZmVyZW5jZSBpbiB0aGUKKyAgICAqICBlbmNsb3NpbmcgcnVsZS4gVGhpcyBsb2NhbCBmb2xsb3cgc2V0IG9ubHkgaW5jbHVkZXMgdG9rZW5zCisgICAgKiAgZnJvbSB3aXRoaW4gdGhlIHJ1bGU7IGkuZS4sIHRoZSBGSVJTVCBjb21wdXRhdGlvbiBkb25lIGJ5CisgICAgKiAgQU5UTFIgc3RvcHMgYXQgdGhlIGVuZCBvZiBhIHJ1bGUuCisgICAgKgorICAgICogIEVYQU1QTEUKKyAgICAqCisgICAgKiAgV2hlbiB5b3UgZmluZCBhICJubyB2aWFibGUgYWx0IGV4Y2VwdGlvbiIsIHRoZSBpbnB1dCBpcyBub3QKKyAgICAqICBjb25zaXN0ZW50IHdpdGggYW55IG9mIHRoZSBhbHRlcm5hdGl2ZXMgZm9yIHJ1bGUgci4gIFRoZSBiZXN0CisgICAgKiAgdGhpbmcgdG8gZG8gaXMgdG8gY29uc3VtZSB0b2tlbnMgdW50aWwgeW91IHNlZSBzb21ldGhpbmcgdGhhdAorICAgICogIGNhbiBsZWdhbGx5IGZvbGxvdyBhIGNhbGwgdG8gciAqb3IqIGFueSBydWxlIHRoYXQgY2FsbGVkIHIuCisgICAgKiAgWW91IGRvbid0IHdhbnQgdGhlIGV4YWN0IHNldCBvZiB2aWFibGUgbmV4dCB0b2tlbnMgYmVjYXVzZSB0aGUKKyAgICAqICBpbnB1dCBtaWdodCBqdXN0IGJlIG1pc3NpbmcgYSB0b2tlbi0teW91IG1pZ2h0IGNvbnN1bWUgdGhlCisgICAgKiAgcmVzdCBvZiB0aGUgaW5wdXQgbG9va2luZyBmb3Igb25lIG9mIHRoZSBtaXNzaW5nIHRva2Vucy4KKyAgICAqCisgICAgKiAgQ29uc2lkZXIgZ3JhbW1hcjoKKyAgICAqCisgICAgKiAgYSA6ICdbJyBiICddJworICAgICogICAgfCAnKCcgYiAnKScKKyAgICAqICAgIDsKKyAgICAqICBiIDogYyAnXicgSU5UIDsKKyAgICAqICBjIDogSUQKKyAgICAqICAgIHwgSU5UCisgICAgKiAgICA7CisgICAgKgorICAgICogIEF0IGVhY2ggcnVsZSBpbnZvY2F0aW9uLCB0aGUgc2V0IG9mIHRva2VucyB0aGF0IGNvdWxkIGZvbGxvdworICAgICogIHRoYXQgcnVsZSBpcyBwdXNoZWQgb24gYSBzdGFjay4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzICJsb2NhbCIKKyAgICAqICBmb2xsb3cgc2V0czoKKyAgICAqCisgICAgKiAgRk9MTE9XKGIxX2luX2EpID0gRklSU1QoJ10nKSA9ICddJworICAgICogIEZPTExPVyhiMl9pbl9hKSA9IEZJUlNUKCcpJykgPSAnKScKKyAgICAqICBGT0xMT1coY19pbl9iKSA9IEZJUlNUKCdeJykgPSAnXicKKyAgICAqCisgICAgKiAgVXBvbiBlcnJvbmVvdXMgaW5wdXQgIltdIiwgdGhlIGNhbGwgY2hhaW4gaXMKKyAgICAqCisgICAgKiAgYSAtPiBiIC0+IGMKKyAgICAqCisgICAgKiAgYW5kLCBoZW5jZSwgdGhlIGZvbGxvdyBjb250ZXh0IHN0YWNrIGlzOgorICAgICoKKyAgICAqICBkZXB0aCAgbG9jYWwgZm9sbG93IHNldCAgICAgYWZ0ZXIgY2FsbCB0byBydWxlCisgICAgKiAgICAwICAgICAgICAgPEVPRj4gICAgICAgICAgICAgICAgICAgIGEgKGZyb20gbWFpbigpKQorICAgICogICAgMSAgICAgICAgICAnXScgICAgICAgICAgICAgICAgICAgICBiCisgICAgKiAgICAzICAgICAgICAgICdeJyAgICAgICAgICAgICAgICAgICAgIGMKKyAgICAqCisgICAgKiAgTm90aWNlIHRoYXQgJyknIGlzIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSBiIHdvdWxkIGhhdmUgdG8gaGF2ZQorICAgICogIGJlZW4gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCBpbiBydWxlIGEgZm9yICcpJyB0byBiZQorICAgICogIGluY2x1ZGVkLgorICAgICoKKyAgICAqICBGb3IgZXJyb3IgcmVjb3ZlcnksIHdlIGNhbm5vdCBjb25zaWRlciBGT0xMT1coYykKKyAgICAqICAoY29udGV4dC1zZW5zaXRpdmUgb3Igb3RoZXJ3aXNlKS4gIFdlIG5lZWQgdGhlIGNvbWJpbmVkIHNldCBvZgorICAgICogIGFsbCBjb250ZXh0LXNlbnNpdGl2ZSBGT0xMT1cgc2V0cy0tdGhlIHNldCBvZiBhbGwgdG9rZW5zIHRoYXQKKyAgICAqICBjb3VsZCBmb2xsb3cgYW55IHJlZmVyZW5jZSBpbiB0aGUgY2FsbCBjaGFpbi4gIFdlIG5lZWQgdG8KKyAgICAqICByZXN5bmMgdG8gb25lIG9mIHRob3NlIHRva2Vucy4gIE5vdGUgdGhhdCBGT0xMT1coYyk9J14nIGFuZCBpZgorICAgICogIHdlIHJlc3luYydkIHRvIHRoYXQgdG9rZW4sIHdlJ2QgY29uc3VtZSB1bnRpbCBFT0YuICBXZSBuZWVkIHRvCisgICAgKiAgc3luYyB0byBjb250ZXh0LXNlbnNpdGl2ZSBGT0xMT1dzIGZvciBhLCBiLCBhbmQgYzogeyddJywnXid9LgorICAgICogIEluIHRoaXMgY2FzZSwgZm9yIGlucHV0ICJbXSIsIExBKDEpIGlzIGluIHRoaXMgc2V0IHNvIHdlIHdvdWxkCisgICAgKiAgbm90IGNvbnN1bWUgYW55dGhpbmcgYW5kIGFmdGVyIHByaW50aW5nIGFuIGVycm9yIHJ1bGUgYyB3b3VsZAorICAgICogIHJldHVybiBub3JtYWxseS4gIEl0IHdvdWxkIG5vdCBmaW5kIHRoZSByZXF1aXJlZCAnXicgdGhvdWdoLgorICAgICogIEF0IHRoaXMgcG9pbnQsIGl0IGdldHMgYSBtaXNtYXRjaGVkIHRva2VuIGVycm9yIGFuZCB0aHJvd3MgYW4KKyAgICAqICBleGNlcHRpb24gKHNpbmNlIExBKDEpIGlzIG5vdCBpbiB0aGUgdmlhYmxlIGZvbGxvd2luZyB0b2tlbgorICAgICogIHNldCkuICBUaGUgcnVsZSBleGNlcHRpb24gaGFuZGxlciB0cmllcyB0byBSZWNvdmVyLCBidXQgZmluZHMKKyAgICAqICB0aGUgc2FtZSByZWNvdmVyeSBzZXQgYW5kIGRvZXNuJ3QgY29uc3VtZSBhbnl0aGluZy4gIFJ1bGUgYgorICAgICogIGV4aXRzIG5vcm1hbGx5IHJldHVybmluZyB0byBydWxlIGEuICBOb3cgaXQgZmluZHMgdGhlICddJyAoYW5kCisgICAgKiAgd2l0aCB0aGUgc3VjY2Vzc2Z1bCBNYXRjaCBleGl0cyBlcnJvclJlY292ZXJ5IG1vZGUpLgorICAgICoKKyAgICAqICBTbywgeW91IGNuYSBzZWUgdGhhdCB0aGUgcGFyc2VyIHdhbGtzIHVwIGNhbGwgY2hhaW4gbG9va2luZworICAgICogIGZvciB0aGUgdG9rZW4gdGhhdCB3YXMgYSBtZW1iZXIgb2YgdGhlIHJlY292ZXJ5IHNldC4KKyAgICAqCisgICAgKiAgRXJyb3JzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGVycm9yUmVjb3ZlcnkgbW9kZS4KKyAgICAqCisgICAgKiAgQU5UTFIncyBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gaXMgYmFzZWQgdXBvbiBvcmlnaW5hbCBpZGVhczoKKyAgICAqCisgICAgKiAgIkFsZ29yaXRobXMgKyBEYXRhIFN0cnVjdHVyZXMgPSBQcm9ncmFtcyIgYnkgTmlrbGF1cyBXaXJ0aAorICAgICoKKyAgICAqICBhbmQKKyAgICAqCisgICAgKiAgIkEgbm90ZSBvbiBlcnJvciByZWNvdmVyeSBpbiByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXJzIjoKKyAgICAqICBodHRwOi8vcG9ydGFsLmFjbS5vcmcvY2l0YXRpb24uY2ZtP2lkPTk0NzkwMi45NDc5MDUKKyAgICAqCisgICAgKiAgTGF0ZXIsIEpvc2VmIEdyb3NjaCBoYWQgc29tZSBnb29kIGlkZWFzOgorICAgICoKKyAgICAqICAiRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudAorICAgICogIFBhcnNlcnMiOgorICAgICogIGZ0cDovL3d3dy5jb2NvbGFiLmNvbS9wcm9kdWN0cy9jb2NrdGFpbC9kb2NhNC5wcy9lbGwucHMuemlwCisgICAgKgorICAgICogIExpa2UgR3Jvc2NoIEkgaW1wbGVtZW50ZWQgbG9jYWwgRk9MTE9XIHNldHMgdGhhdCBhcmUgY29tYmluZWQKKyAgICAqICBhdCBydW4tdGltZSB1cG9uIGVycm9yIHRvIGF2b2lkIG92ZXJoZWFkIGR1cmluZyBwYXJzaW5nLgorICAgICopCisgICAgZnVuY3Rpb24gQ29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ6IElCaXRTZXQ7IHZpcnR1YWw7CisKKyAgICBmdW5jdGlvbiBDb21iaW5lRm9sbG93cyhjb25zdCBFeGFjdDogQm9vbGVhbik6IElCaXRTZXQ7CisgIHByb3RlY3RlZAorICAgIHsgSUJhc2VSZWNvZ25pemVyIH0KKyAgICBmdW5jdGlvbiBHZXRJbnB1dDogSUludFN0cmVhbTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gR2V0QmFja3RyYWNraW5nTGV2ZWw6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0U3RhdGU6IElSZWNvZ25pemVyU2hhcmVkU3RhdGU7CisgICAgZnVuY3Rpb24gR2V0TnVtYmVyT2ZTeW50YXhFcnJvcnM6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0R3JhbW1hckZpbGVOYW1lOiBTdHJpbmc7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0U291cmNlTmFtZTogU3RyaW5nOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBHZXRUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXk7IHZpcnR1YWw7CisKKyAgICBwcm9jZWR1cmUgQmVnaW5CYWNrdHJhY2soY29uc3QgTGV2ZWw6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBFbmRCYWNrdHJhY2soY29uc3QgTGV2ZWw6IEludGVnZXI7IGNvbnN0IFN1Y2Nlc3NmdWw6IEJvb2xlYW4pOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXNldDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBNYXRjaChjb25zdCBJbnB1dDogSUludFN0cmVhbTsgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyOworICAgICAgY29uc3QgRm9sbG93OiBJQml0U2V0KTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIE1pc21hdGNoSXNVbndhbnRlZFRva2VuKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyKTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBNaXNtYXRjaElzTWlzc2luZ1Rva2VuKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgRm9sbG93OiBJQml0U2V0KTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQmVnaW5SZXN5bmM7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIEVuZFJlc3luYzsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgUmVwb3J0RXJyb3IoY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgTWF0Y2hBbnkoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW0pOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBEaXNwbGF5UmVjb2duaXRpb25FcnJvcihjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXk7CisgICAgICBjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldEVycm9yTWVzc2FnZShjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0RXJyb3JIZWFkZXIoY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uKTogU3RyaW5nOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFRva2VuRXJyb3JEaXNwbGF5KGNvbnN0IFQ6IElUb2tlbik6IFN0cmluZzsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgRW1pdEVycm9yTWVzc2FnZShjb25zdCBNc2c6IFN0cmluZyk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJlY292ZXIoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07IGNvbnN0IFJFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldChjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgICAgIGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbjsgY29uc3QgRm9sbG93OiBJQml0U2V0KTogSUFOVExSSW50ZXJmYWNlOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBDb25zdW1lVW50aWwoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07IGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBDb25zdW1lVW50aWwoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07IGNvbnN0IEJpdFNldDogSUJpdFNldCk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIC8vZnVuY3Rpb24gR2V0UnVsZUludm9jYXRpb25TdGFjazogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgLy9mdW5jdGlvbiBHZXRSdWxlSW52b2NhdGlvblN0YWNrKGNvbnN0IEU6IEV4Y2VwdGlvbjsKKyAgICAvLyAgY29uc3QgUmVjb2duaXplckNsYXNzTmFtZTogU3RyaW5nKTogSUxpc3Q8SUFOVExSSW50ZXJmYWNlPjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gVG9TdHJpbmdzKGNvbnN0IFRva2VuczogSUxpc3Q8SVRva2VuPik6IElMaXN0PFN0cmluZz47IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0UnVsZU1lbW9pemF0aW9uKGNvbnN0IFJ1bGVJbmRleCwgUnVsZVN0YXJ0SW5kZXg6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEFscmVhZHlQYXJzZWRSdWxlKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgTWVtb2l6ZShjb25zdCBJbnB1dDogSUludFN0cmVhbTsgY29uc3QgUnVsZUluZGV4LAorICAgICAgUnVsZVN0YXJ0SW5kZXg6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFJ1bGVNZW1vaXphdGlvbkNoYWNlU2l6ZTogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBUcmFjZUluKGNvbnN0IFJ1bGVOYW1lOiBTdHJpbmc7IGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IElucHV0U3ltYm9sOiBTdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBUcmFjZU91dChjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXI7CisgICAgICBjb25zdCBJbnB1dFN5bWJvbDogU3RyaW5nKTsgdmlydHVhbDsKKworICAgIHByb3BlcnR5IElucHV0OiBJSW50U3RyZWFtIHJlYWQgR2V0SW5wdXQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFTdGF0ZTogSVJlY29nbml6ZXJTaGFyZWRTdGF0ZSk7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVENvbW1vblRva2VuU3RyZWFtID0gY2xhc3MoVEFOVExST2JqZWN0LCBJQ29tbW9uVG9rZW5TdHJlYW0sIElUb2tlblN0cmVhbSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGVG9rZW5Tb3VyY2U6IElUb2tlblNvdXJjZTsKKworICAgIC8vLyA8c3VtbWFyeT5SZWNvcmQgZXZlcnkgc2luZ2xlIHRva2VuIHB1bGxlZCBmcm9tIHRoZSBzb3VyY2Ugc28gd2UgY2FuIHJlcHJvZHVjZQorICAgIC8vLyBjaHVua3Mgb2YgaXQgbGF0ZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBGVG9rZW5zOiBJTGlzdDxJVG9rZW4+OworCisgICAgLy8vIDxzdW1tYXJ5PjwhW0NEQVRBW01hcDx0b2tlbnR5cGUsIGNoYW5uZWw+XV0+IHRvIG92ZXJyaWRlIHNvbWUgVG9rZW5zJyBjaGFubmVsIG51bWJlcnMgPC9zdW1tYXJ5PgorICAgIEZDaGFubmVsT3ZlcnJpZGVNYXA6IElEaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworCisgICAgLy8vIDxzdW1tYXJ5PjwhW0NEQVRBW1NldDx0b2tlbnR5cGU+O11dPiBkaXNjYXJkIGFueSB0b2tlbnMgd2l0aCB0aGlzIHR5cGUgPC9zdW1tYXJ5PgorICAgIEZEaXNjYXJkU2V0OiBJSGFzaExpc3Q8SW50ZWdlciwgSW50ZWdlcj47CisKKyAgICAvLy8gPHN1bW1hcnk+U2tpcCB0b2tlbnMgb24gYW55IGNoYW5uZWwgYnV0IHRoaXMgb25lOyB0aGlzIGlzIGhvdyB3ZSBza2lwIHdoaXRlc3BhY2UuLi4gPC9zdW1tYXJ5PgorICAgIEZDaGFubmVsOiBJbnRlZ2VyOworCisgICAgLy8vIDxzdW1tYXJ5PkJ5IGRlZmF1bHQsIHRyYWNrIGFsbCBpbmNvbWluZyB0b2tlbnMgPC9zdW1tYXJ5PgorICAgIEZEaXNjYXJkT2ZmQ2hhbm5lbFRva2VuczogQm9vbGVhbjsKKworICAgIC8vLyA8c3VtbWFyeT5UcmFjayB0aGUgbGFzdCBNYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiBSZXdpbmQoKS48L3N1bW1hcnk+CisgICAgRkxhc3RNYXJrZXI6IEludGVnZXI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgIC8vLyB0byBjb25zdW1lKS4gIHA9PS0xIGluZGljYXRlcyB0aGF0IHRoZSB0b2tlbnMgbGlzdCBpcyBlbXB0eQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgRlA6IEludGVnZXI7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICAvLy8gPHN1bW1hcnk+TG9hZCBhbGwgdG9rZW5zIGZyb20gdGhlIHRva2VuIHNvdXJjZSBhbmQgcHV0IGluIHRva2Vucy4KKyAgICAvLy8gVGhpcyBpcyBkb25lIHVwb24gZmlyc3QgTFQgcmVxdWVzdCBiZWNhdXNlIHlvdSBtaWdodCB3YW50IHRvCisgICAgLy8vIHNldCBzb21lIHRva2VuIHR5cGUgLyBjaGFubmVsIG92ZXJyaWRlcyBiZWZvcmUgZmlsbGluZyBidWZmZXIuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwcm9jZWR1cmUgRmlsbEJ1ZmZlcjsgdmlydHVhbDsKKworICAgIC8vLyA8c3VtbWFyeT5Mb29rIGJhY2t3YXJkcyBrIHRva2VucyBvbi1jaGFubmVsIHRva2VucyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gTEIoY29uc3QgSzogSW50ZWdlcik6IElUb2tlbjsgdmlydHVhbDsKKworICAgIC8vLyA8c3VtbWFyeT5HaXZlbiBhIHN0YXJ0aW5nIGluZGV4LCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvbi1jaGFubmVsCisgICAgLy8vIHRva2VuLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgZnVuY3Rpb24gU2tpcE9mZlRva2VuQ2hhbm5lbHMoY29uc3QgSTogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gU2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGNvbnN0IEk6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICBwcm90ZWN0ZWQKKyAgICB7IElJbnRTdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldFNvdXJjZU5hbWU6IFN0cmluZzsgdmlydHVhbDsKKworICAgIHByb2NlZHVyZSBDb25zdW1lOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIExBKEk6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIExBQ2hhcihJOiBJbnRlZ2VyKTogQ2hhcjsKKyAgICBmdW5jdGlvbiBNYXJrOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEluZGV4OiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXdpbmQoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJld2luZDsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJlbGVhc2UoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2Vlayhjb25zdCBJbmRleDogSW50ZWdlcik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gU2l6ZTogSW50ZWdlcjsgdmlydHVhbDsKKyAgcHJvdGVjdGVkCisgICAgeyBJVG9rZW5TdHJlYW0gfQorICAgIGZ1bmN0aW9uIEdldFRva2VuU291cmNlOiBJVG9rZW5Tb3VyY2U7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFRva2VuU291cmNlKGNvbnN0IFZhbHVlOiBJVG9rZW5Tb3VyY2UpOyB2aXJ0dWFsOworCisgICAgZnVuY3Rpb24gTFQoY29uc3QgSzogSW50ZWdlcik6IElUb2tlbjsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXQoY29uc3QgSTogSW50ZWdlcik6IElUb2tlbjsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBUb1N0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJVG9rZW4pOiBTdHJpbmc7IHJlaW50cm9kdWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgcHJvdGVjdGVkCisgICAgeyBJQ29tbW9uVG9rZW5TdHJlYW0gfQorICAgIHByb2NlZHVyZSBTZXRUb2tlblR5cGVDaGFubmVsKGNvbnN0IFRUeXBlLCBDaGFubmVsOiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgRGlzY2FyZFRva2VuVHlwZShjb25zdCBUVHlwZTogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIERpc2NhcmRPZmZDaGFubmVsVG9rZW5zKGNvbnN0IERpc2NhcmQ6IEJvb2xlYW4pOworICAgIGZ1bmN0aW9uIEdldFRva2VuczogSUxpc3Q8SVRva2VuPjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogSUxpc3Q8SVRva2VuPjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOworICAgICAgY29uc3QgVHlwZXM6IElCaXRTZXQpOiBJTGlzdDxJVG9rZW4+OyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBHZXRUb2tlbnMoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXI7CisgICAgICBjb25zdCBUeXBlczogSUxpc3Q8SW50ZWdlcj4pOiBJTGlzdDxJVG9rZW4+OyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBHZXRUb2tlbnMoY29uc3QgU3RhcnQsIFN0b3AsCisgICAgICBUb2tlblR5cGU6IEludGVnZXIpOiBJTGlzdDxJVG9rZW4+OyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVzZXQ7IHZpcnR1YWw7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUb2tlblNvdXJjZTogSVRva2VuU291cmNlKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFUb2tlblNvdXJjZTogSVRva2VuU291cmNlOworICAgICAgY29uc3QgQUNoYW5uZWw6IEludGVnZXIpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUxleGVyOiBJTGV4ZXIpOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUxleGVyOiBJTGV4ZXI7CisgICAgICBjb25zdCBBQ2hhbm5lbDogSW50ZWdlcik7IG92ZXJsb2FkOworCisgICAgZnVuY3Rpb24gVG9TdHJpbmc6IFN0cmluZzsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVERGQSA9IGNsYXNzIGFic3RyYWN0KFRBTlRMUk9iamVjdCwgSURGQSkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXI6IFRTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlcjsKKyAgICBGRU9UOiBUU21hbGxpbnRBcnJheTsKKyAgICBGRU9GOiBUU21hbGxpbnRBcnJheTsKKyAgICBGTWluOiBUQ2hhckFycmF5OworICAgIEZNYXg6IFRDaGFyQXJyYXk7CisgICAgRkFjY2VwdDogVFNtYWxsaW50QXJyYXk7CisgICAgRlNwZWNpYWw6IFRTbWFsbGludEFycmF5OworICAgIEZUcmFuc2l0aW9uOiBUU21hbGxpbnRNYXRyaXg7CisgICAgRkRlY2lzaW9uTnVtYmVyOiBJbnRlZ2VyOworICAgIEZSZWNvZ25pemVyOiBQb2ludGVyOyB7IElCYXNlUmVjb2duaXplciB9CisgICAgZnVuY3Rpb24gR2V0UmVjb2duaXplcjogSUJhc2VSZWNvZ25pemVyOworICAgIHByb2NlZHVyZSBTZXRSZWNvZ25pemVyKGNvbnN0IFZhbHVlOiBJQmFzZVJlY29nbml6ZXIpOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIE5vVmlhYmxlQWx0KGNvbnN0IFM6IEludGVnZXI7IGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTsKKworICAgIHByb3BlcnR5IFJlY29nbml6ZXI6IElCYXNlUmVjb2duaXplciByZWFkIEdldFJlY29nbml6ZXIgd3JpdGUgU2V0UmVjb2duaXplcjsKKyAgICBwcm9wZXJ0eSBEZWNpc2lvbk51bWJlcjogSW50ZWdlciByZWFkIEZEZWNpc2lvbk51bWJlciB3cml0ZSBGRGVjaXNpb25OdW1iZXI7CisgICAgcHJvcGVydHkgRU9UOiBUU21hbGxpbnRBcnJheSByZWFkIEZFT1Qgd3JpdGUgRkVPVDsKKyAgICBwcm9wZXJ0eSBFT0Y6IFRTbWFsbGludEFycmF5IHJlYWQgRkVPRiB3cml0ZSBGRU9GOworICAgIHByb3BlcnR5IE1pbjogVENoYXJBcnJheSByZWFkIEZNaW4gd3JpdGUgRk1pbjsKKyAgICBwcm9wZXJ0eSBNYXg6IFRDaGFyQXJyYXkgcmVhZCBGTWF4IHdyaXRlIEZNYXg7CisgICAgcHJvcGVydHkgQWNjZXB0OiBUU21hbGxpbnRBcnJheSByZWFkIEZBY2NlcHQgd3JpdGUgRkFjY2VwdDsKKyAgICBwcm9wZXJ0eSBTcGVjaWFsOiBUU21hbGxpbnRBcnJheSByZWFkIEZTcGVjaWFsIHdyaXRlIEZTcGVjaWFsOworICAgIHByb3BlcnR5IFRyYW5zaXRpb246IFRTbWFsbGludE1hdHJpeCByZWFkIEZUcmFuc2l0aW9uIHdyaXRlIEZUcmFuc2l0aW9uOworICBwcm90ZWN0ZWQKKyAgICB7IElERkEgfQorICAgIGZ1bmN0aW9uIEdldFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyOiBUU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXI7CisgICAgcHJvY2VkdXJlIFNldFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyKGNvbnN0IFZhbHVlOiBUU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIpOworCisgICAgZnVuY3Rpb24gUHJlZGljdChjb25zdCBJbnB1dDogSUludFN0cmVhbSk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIEVycm9yKGNvbnN0IE5WQUU6IEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbik7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gU3BlY2lhbFN0YXRlVHJhbnNpdGlvbihjb25zdCBTOiBJbnRlZ2VyOworICAgICAgY29uc3QgSW5wdXQ6IElJbnRTdHJlYW0pOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIERlc2NyaXB0aW9uOiBTdHJpbmc7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gU3BlY2lhbFRyYW5zaXRpb24oY29uc3QgU3RhdGUsIFN5bWJvbDogSW50ZWdlcik6IEludGVnZXI7CisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIFVucGFja0VuY29kZWRTdHJpbmcoY29uc3QgRW5jb2RlZFN0cmluZzogU3RyaW5nKTogVFNtYWxsaW50QXJyYXk7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBVbnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoY29uc3QgRW5jb2RlZFN0cmluZ3M6IFRTdHJpbmdBcnJheSk6IFRTbWFsbGludE1hdHJpeDsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBVbnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoY29uc3QgRW5jb2RlZFN0cmluZ3M6IGFycmF5IG9mIFN0cmluZyk6IFRTbWFsbGludE1hdHJpeDsgb3ZlcmxvYWQ7IHN0YXRpYzsKKyAgICBjbGFzcyBmdW5jdGlvbiBVbnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKGNvbnN0IEVuY29kZWRTdHJpbmc6IFN0cmluZyk6IFRDaGFyQXJyYXk7IHN0YXRpYzsKKyAgZW5kOworCisgIFRMZXhlciA9IGNsYXNzIGFic3RyYWN0KFRCYXNlUmVjb2duaXplciwgSUxleGVyLCBJVG9rZW5Tb3VyY2UpCisgIHN0cmljdCBwcml2YXRlCisgICAgY29uc3QKKyAgICAgIFRPS0VOX2RvdF9FT0YgPSBPcmQoY3NjRU9GKTsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+V2hlcmUgaXMgdGhlIGxleGVyIGRyYXdpbmcgY2hhcmFjdGVycyBmcm9tPyA8L3N1bW1hcnk+CisgICAgRklucHV0OiBJQ2hhclN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgeyBJQmFzZVJlY29nbml6ZXIgfQorICAgIGZ1bmN0aW9uIEdldFNvdXJjZU5hbWU6IFN0cmluZzsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0SW5wdXQ6IElJbnRTdHJlYW07IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZXNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlcG9ydEVycm9yKGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldEVycm9yTWVzc2FnZShjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7IG92ZXJyaWRlOworICBwcm90ZWN0ZWQKKyAgICB7IElMZXhlciB9CisgICAgZnVuY3Rpb24gR2V0Q2hhclN0cmVhbTogSUNoYXJTdHJlYW07IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldENoYXJTdHJlYW0oY29uc3QgVmFsdWU6IElDaGFyU3RyZWFtKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRMaW5lOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRDaGFySW5kZXg6IEludGVnZXI7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0VGV4dDogU3RyaW5nOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRUZXh0KGNvbnN0IFZhbHVlOiBTdHJpbmcpOyB2aXJ0dWFsOworCisgICAgZnVuY3Rpb24gTmV4dFRva2VuOiBJVG9rZW47IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNraXA7CisgICAgcHJvY2VkdXJlIERvVG9rZW5zOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgRW1pdChjb25zdCBUb2tlbjogSVRva2VuKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gRW1pdDogSVRva2VuOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgTWF0Y2goY29uc3QgUzogU3RyaW5nKTsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBNYXRjaChjb25zdCBDOiBJbnRlZ2VyKTsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBNYXRjaEFueTsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBNYXRjaFJhbmdlKGNvbnN0IEEsIEI6IEludGVnZXIpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZWNvdmVyKGNvbnN0IFJFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOyByZWludHJvZHVjZTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0Q2hhckVycm9yRGlzcGxheShjb25zdCBDOiBJbnRlZ2VyKTogU3RyaW5nOworICAgIHByb2NlZHVyZSBUcmFjZUluKGNvbnN0IFJ1bGVOYW1lOiBTdHJpbmc7IGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcik7IHJlaW50cm9kdWNlOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyB2aXJ0dWFsOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvcGVydHkgSW5wdXQ6IElDaGFyU3RyZWFtIHJlYWQgRklucHV0OworICAgIHByb3BlcnR5IENoYXJJbmRleDogSW50ZWdlciByZWFkIEdldENoYXJJbmRleDsKKyAgICBwcm9wZXJ0eSBUZXh0OiBTdHJpbmcgcmVhZCBHZXRUZXh0IHdyaXRlIFNldFRleHQ7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSUNoYXJTdHJlYW0pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUlucHV0OiBJQ2hhclN0cmVhbTsKKyAgICAgIGNvbnN0IEFTdGF0ZTogSVJlY29nbml6ZXJTaGFyZWRTdGF0ZSk7IG92ZXJsb2FkOworICBlbmQ7CisKKyAgVFBhcnNlciA9IGNsYXNzKFRCYXNlUmVjb2duaXplciwgSVBhcnNlcikKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSW5wdXQ6IElUb2tlblN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgcHJvcGVydHkgSW5wdXQ6IElUb2tlblN0cmVhbSByZWFkIEZJbnB1dDsKKyAgcHJvdGVjdGVkCisgICAgeyBJQmFzZVJlY29nbml6ZXIgfQorICAgIHByb2NlZHVyZSBSZXNldDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0Q3VycmVudElucHV0U3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTogSUFOVExSSW50ZXJmYWNlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRNaXNzaW5nU3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICAgICAgY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOyBjb25zdCBFeHBlY3RlZFRva2VuVHlwZTogSW50ZWdlcjsKKyAgICAgIGNvbnN0IEZvbGxvdzogSUJpdFNldCk6IElBTlRMUkludGVyZmFjZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0U291cmNlTmFtZTogU3RyaW5nOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRJbnB1dDogSUludFN0cmVhbTsgb3ZlcnJpZGU7CisgIHByb3RlY3RlZAorICAgIHsgSVBhcnNlciB9CisgICAgZnVuY3Rpb24gR2V0VG9rZW5TdHJlYW06IElUb2tlblN0cmVhbTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0VG9rZW5TdHJlYW0oY29uc3QgVmFsdWU6IElUb2tlblN0cmVhbSk7IHZpcnR1YWw7CisKKyAgICBwcm9jZWR1cmUgVHJhY2VJbihjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOyByZWludHJvZHVjZTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFRyYWNlT3V0KGNvbnN0IFJ1bGVOYW1lOiBTdHJpbmc7IGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcik7IHJlaW50cm9kdWNlOyBvdmVybG9hZDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRva2VuU3RyZWFtKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRva2VuU3RyZWFtOworICAgICAgY29uc3QgQVN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlKTsgb3ZlcmxvYWQ7CisgIGVuZDsKKworICBUUnVsZVJldHVyblNjb3BlID0gY2xhc3MoVEFOVExST2JqZWN0LCBJUnVsZVJldHVyblNjb3BlKQorICBwcm90ZWN0ZWQKKyAgICB7IElSdWxlUmV0dXJuU2NvcGUgfQorICAgIGZ1bmN0aW9uIEdldFN0YXJ0OiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFN0YXJ0KGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIEdldFN0b3A6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U3RvcChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRUcmVlOiBJQU5UTFJJbnRlcmZhY2U7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldFRyZWUoY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gR2V0VGVtcGxhdGU6IElBTlRMUkludGVyZmFjZTsgdmlydHVhbDsKKyAgZW5kOworCisgIFRQYXJzZXJSdWxlUmV0dXJuU2NvcGUgPSBjbGFzcyhUUnVsZVJldHVyblNjb3BlLCBJUGFyc2VyUnVsZVJldHVyblNjb3BlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTdGFydDogSVRva2VuOworICAgIEZTdG9wOiBJVG9rZW47CisgIHByb3RlY3RlZAorICAgIHsgSVJ1bGVSZXR1cm5TY29wZSB9CisgICAgZnVuY3Rpb24gR2V0U3RhcnQ6IElBTlRMUkludGVyZmFjZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFN0YXJ0KGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBHZXRTdG9wOiBJQU5UTFJJbnRlcmZhY2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRTdG9wKGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVycmlkZTsKKyAgZW5kOworCisgIFRUb2tlblJld3JpdGVTdHJlYW0gPSBjbGFzcyhUQ29tbW9uVG9rZW5TdHJlYW0sIElUb2tlblJld3JpdGVTdHJlYW0pCisgIHB1YmxpYworICAgIGNvbnN0CisgICAgICBERUZBVUxUX1BST0dSQU1fTkFNRSA9ICdkZWZhdWx0JzsKKyAgICAgIFBST0dSQU1fSU5JVF9TSVpFID0gMTAwOworICAgICAgTUlOX1RPS0VOX0lOREVYID0gMDsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIC8vIERlZmluZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gaGllcmFyY2h5CisgICAgdHlwZQorICAgICAgSVJld3JpdGVPcGVyYXRpb24gPSBpbnRlcmZhY2UoSUFOVExSSW50ZXJmYWNlKQorICAgICAgWyd7Mjg1QTU0RUQtNThGRi00NEIxLUEyNjgtMjY4NjQ3NkQ0NDE5fSddCisgICAgICAgIHsgUHJvcGVydHkgYWNjZXNzb3JzIH0KKyAgICAgICAgZnVuY3Rpb24gR2V0SW5zdHJ1Y3Rpb25JbmRleDogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldEluc3RydWN0aW9uSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgICAgICBmdW5jdGlvbiBHZXRJbmRleDogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0VGV4dDogSUFOVExSSW50ZXJmYWNlOworICAgICAgICBwcm9jZWR1cmUgU2V0VGV4dChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0UGFyZW50OiBJVG9rZW5SZXdyaXRlU3RyZWFtOworICAgICAgICBwcm9jZWR1cmUgU2V0UGFyZW50KGNvbnN0IFZhbHVlOiBJVG9rZW5SZXdyaXRlU3RyZWFtKTsKKworICAgICAgICB7IE1ldGhvZHMgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT5FeGVjdXRlIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBieSBwb3NzaWJseSBhZGRpbmcgdG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8vIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgdG9rZW4gdG8gb3BlcmF0ZSBvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgZnVuY3Rpb24gRXhlY3V0ZShjb25zdCBCdWY6IFRTdHJpbmdCdWlsZGVyKTogSW50ZWdlcjsKKworICAgICAgICB7IFByb3BlcnRpZXMgfQorICAgICAgICBwcm9wZXJ0eSBJbnN0cnVjdGlvbkluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0SW5zdHJ1Y3Rpb25JbmRleCB3cml0ZSBTZXRJbnN0cnVjdGlvbkluZGV4OworICAgICAgICBwcm9wZXJ0eSBJbmRleDogSW50ZWdlciByZWFkIEdldEluZGV4IHdyaXRlIFNldEluZGV4OworICAgICAgICBwcm9wZXJ0eSBUZXh0OiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBHZXRUZXh0IHdyaXRlIFNldFRleHQ7CisgICAgICAgIHByb3BlcnR5IFBhcmVudDogSVRva2VuUmV3cml0ZVN0cmVhbSByZWFkIEdldFBhcmVudCB3cml0ZSBTZXRQYXJlbnQ7CisgICAgICBlbmQ7CisKKyAgICAgIFRSZXdyaXRlT3BlcmF0aW9uID0gY2xhc3MoVEFOVExST2JqZWN0LCBJUmV3cml0ZU9wZXJhdGlvbikKKyAgICAgIHN0cmljdCBwcml2YXRlCisgICAgICAgIC8vIFdoYXQgaW5kZXggaW50byByZXdyaXRlcyBMaXN0IGFyZSB3ZT8KKyAgICAgICAgRkluc3RydWN0aW9uSW5kZXg6IEludGVnZXI7CisgICAgICAgIC8vIFRva2VuIGJ1ZmZlciBpbmRleAorICAgICAgICBGSW5kZXg6IEludGVnZXI7CisgICAgICAgIEZUZXh0OiBJQU5UTFJJbnRlcmZhY2U7CisgICAgICAgIEZQYXJlbnQ6IFBvaW50ZXI7IHtJVG9rZW5SZXdyaXRlU3RyZWFtO30KKyAgICAgIHByb3RlY3RlZAorICAgICAgICB7IElSZXdyaXRlT3BlcmF0aW9uIH0KKyAgICAgICAgZnVuY3Rpb24gR2V0SW5zdHJ1Y3Rpb25JbmRleDogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldEluc3RydWN0aW9uSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgICAgICBmdW5jdGlvbiBHZXRJbmRleDogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0VGV4dDogSUFOVExSSW50ZXJmYWNlOworICAgICAgICBwcm9jZWR1cmUgU2V0VGV4dChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKKyAgICAgICAgZnVuY3Rpb24gR2V0UGFyZW50OiBJVG9rZW5SZXdyaXRlU3RyZWFtOworICAgICAgICBwcm9jZWR1cmUgU2V0UGFyZW50KGNvbnN0IFZhbHVlOiBJVG9rZW5SZXdyaXRlU3RyZWFtKTsKKworICAgICAgICBmdW5jdGlvbiBFeGVjdXRlKGNvbnN0IEJ1ZjogVFN0cmluZ0J1aWxkZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgICAgcHJvdGVjdGVkCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBSW5kZXg6IEludGVnZXI7IGNvbnN0IEFUZXh0OiBJQU5UTFJJbnRlcmZhY2U7CisgICAgICAgICAgY29uc3QgQVBhcmVudDogSVRva2VuUmV3cml0ZVN0cmVhbSk7CisKKyAgICAgICAgcHJvcGVydHkgSW5kZXg6IEludGVnZXIgcmVhZCBGSW5kZXggd3JpdGUgRkluZGV4OworICAgICAgICBwcm9wZXJ0eSBUZXh0OiBJQU5UTFJJbnRlcmZhY2UgcmVhZCBGVGV4dCB3cml0ZSBGVGV4dDsKKyAgICAgICAgcHJvcGVydHkgUGFyZW50OiBJVG9rZW5SZXdyaXRlU3RyZWFtIHJlYWQgR2V0UGFyZW50IHdyaXRlIFNldFBhcmVudDsKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgICAgIGVuZDsKKworICAgICAgSUluc2VydEJlZm9yZU9wID0gaW50ZXJmYWNlKElSZXdyaXRlT3BlcmF0aW9uKQorICAgICAgWyd7QkZCNzMyRTItQkU2QS00NjkxLUFFM0ItNUM4MDEzREU5MjRFfSddCisgICAgICBlbmQ7CisKKyAgICAgIFRJbnNlcnRCZWZvcmVPcCA9IGNsYXNzKFRSZXdyaXRlT3BlcmF0aW9uLCBJSW5zZXJ0QmVmb3JlT3ApCisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgeyBJUmV3cml0ZU9wZXJhdGlvbiB9CisgICAgICAgIGZ1bmN0aW9uIEV4ZWN1dGUoY29uc3QgQnVmOiBUU3RyaW5nQnVpbGRlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgICAvLy8gPHN1bW1hcnk+SSdtIGdvaW5nIHRvIHRyeSByZXBsYWNpbmcgcmFuZ2UgZnJvbSB4Li55IHdpdGggKHkteCkrMSBSZXBsYWNlT3AKKyAgICAgIC8vLyBpbnN0cnVjdGlvbnMuCisgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgSVJlcGxhY2VPcCA9IGludGVyZmFjZShJUmV3cml0ZU9wZXJhdGlvbikKKyAgICAgIFsnezYzMEM0MzRBLTk5RUEtNDU4OS1BNjVELTY0QTdCM0RBQzQwN30nXQorICAgICAgICB7IFByb3BlcnR5IGFjY2Vzc29ycyB9CisgICAgICAgIGZ1bmN0aW9uIEdldExhc3RJbmRleDogSW50ZWdlcjsKKyAgICAgICAgcHJvY2VkdXJlIFNldExhc3RJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisKKyAgICAgICAgeyBQcm9wZXJ0aWVzIH0KKyAgICAgICAgcHJvcGVydHkgTGFzdEluZGV4OiBJbnRlZ2VyIHJlYWQgR2V0TGFzdEluZGV4IHdyaXRlIFNldExhc3RJbmRleDsKKyAgICAgIGVuZDsKKworICAgICAgVFJlcGxhY2VPcCA9IGNsYXNzKFRSZXdyaXRlT3BlcmF0aW9uLCBJUmVwbGFjZU9wKQorICAgICAgcHJpdmF0ZQorICAgICAgICBGTGFzdEluZGV4OiBJbnRlZ2VyOworICAgICAgcHJvdGVjdGVkCisgICAgICAgIHsgSVJld3JpdGVPcGVyYXRpb24gfQorICAgICAgICBmdW5jdGlvbiBFeGVjdXRlKGNvbnN0IEJ1ZjogVFN0cmluZ0J1aWxkZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICAgIHByb3RlY3RlZAorICAgICAgICB7IElSZXBsYWNlT3AgfQorICAgICAgICBmdW5jdGlvbiBHZXRMYXN0SW5kZXg6IEludGVnZXI7CisgICAgICAgIHByb2NlZHVyZSBTZXRMYXN0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgICAgcHVibGljCisgICAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBU3RhcnQsIEFTdG9wOiBJbnRlZ2VyOworICAgICAgICAgIGNvbnN0IEFUZXh0OiBJQU5UTFJJbnRlcmZhY2U7IGNvbnN0IEFQYXJlbnQ6IElUb2tlblJld3JpdGVTdHJlYW0pOworCisgICAgICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgICBJRGVsZXRlT3AgPSBpbnRlcmZhY2UoSVJld3JpdGVPcGVyYXRpb24pCisgICAgICBbJ3tDMzkzNDVCQy1GMTcwLTRDM0EtQTk4OS02NUU2QjlGMDcxMkJ9J10KKyAgICAgIGVuZDsKKworICAgICAgVERlbGV0ZU9wID0gY2xhc3MoVFJlcGxhY2VPcCkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBUb1N0cmluZzogU3RyaW5nOyBvdmVycmlkZTsKKyAgICAgIGVuZDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICB0eXBlCisgICAgICBUUmV3cml0ZU9wQ29tcGFyZXI8VDogSVJld3JpdGVPcGVyYXRpb24+ID0gY2xhc3MoVENvbXBhcmVyPFQ+KQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIENvbXBhcmUoY29uc3QgTGVmdCwgUmlnaHQ6IFQpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICAgIGVuZDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICAvLy8gPHN1bW1hcnk+WW91IG1heSBoYXZlIG11bHRpcGxlLCBuYW1lZCBzdHJlYW1zIG9mIHJld3JpdGUgb3BlcmF0aW9ucy4KKyAgICAvLy8gSSdtIGNhbGxpbmcgdGhlc2UgdGhpbmdzICJwcm9ncmFtcy4iCisgICAgLy8vIE1hcHMgU3RyaW5nIChuYW1lKSAtPiByZXdyaXRlIChJTGlzdCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEZQcm9ncmFtczogSURpY3Rpb25hcnk8U3RyaW5nLCBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj4+OworCisgICAgLy8vIDxzdW1tYXJ5Pk1hcCBTdHJpbmcgKHByb2dyYW0gbmFtZSkgLT4gSW50ZWdlciBpbmRleCA8L3N1bW1hcnk+CisgICAgRkxhc3RSZXdyaXRlVG9rZW5JbmRleGVzOiBJRGljdGlvbmFyeTxTdHJpbmcsIEludGVnZXI+OworICBzdHJpY3QgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEluaXRpYWxpemVQcm9ncmFtKGNvbnN0IE5hbWU6IFN0cmluZyk6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsKKyAgcHJvdGVjdGVkCisgICAgeyBJVG9rZW5SZXdyaXRlU3RyZWFtIH0KKyAgICBwcm9jZWR1cmUgUm9sbGJhY2soY29uc3QgSW5zdHJ1Y3Rpb25JbmRleDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSb2xsYmFjayhjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOworICAgICAgY29uc3QgSW5zdHJ1Y3Rpb25JbmRleDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworCisgICAgcHJvY2VkdXJlIERlbGV0ZVByb2dyYW07IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBEZWxldGVQcm9ncmFtKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmcpOyBvdmVybG9hZDsgdmlydHVhbDsKKworICAgIHByb2NlZHVyZSBJbnNlcnRBZnRlcihjb25zdCBUOiBJVG9rZW47IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBJbnNlcnRBZnRlcihjb25zdCBJbmRleDogSW50ZWdlcjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFQ6IElUb2tlbjsKKyAgICAgIGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBJbnNlcnRBZnRlcihjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBJbnNlcnRBZnRlcihjb25zdCBUOiBJVG9rZW47IGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRBZnRlcihjb25zdCBJbmRleDogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydEFmdGVyKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFQ6IElUb2tlbjsKKyAgICAgIGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRBZnRlcihjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIEluc2VydEJlZm9yZShjb25zdCBUOiBJVG9rZW47IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBJbnNlcnRCZWZvcmUoY29uc3QgSW5kZXg6IEludGVnZXI7IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBJbnNlcnRCZWZvcmUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgVDogSVRva2VuOworICAgICAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIEluc2VydEJlZm9yZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgICAgIGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBJbnNlcnRCZWZvcmUoY29uc3QgVDogSVRva2VuOyBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0QmVmb3JlKGNvbnN0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0QmVmb3JlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFQ6IElUb2tlbjsKKyAgICAgIGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRCZWZvcmUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgSW5kZXg6IEludGVnZXI7CisgICAgICBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZShjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgSW5kZXhUOiBJVG9rZW47IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJVG9rZW47IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOworICAgICAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbjsKKyAgICAgIGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBTdHJpbmcpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgUmVwbGFjZShjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgSW5kZXhUOiBJVG9rZW47IGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJVG9rZW47IGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBSZXBsYWNlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOworICAgICAgY29uc3QgVGV4dDogU3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFJlcGxhY2UoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbjsKKyAgICAgIGNvbnN0IFRleHQ6IFN0cmluZyk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIERlbGV0ZShjb25zdCBJbmRleDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBEZWxldGUoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgRGVsZXRlKGNvbnN0IEluZGV4VDogSVRva2VuKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIERlbGV0ZShjb25zdCBTdGFydCwgU3RvcDogSVRva2VuKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIERlbGV0ZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBEZWxldGUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbik7IG92ZXJsb2FkOyB2aXJ0dWFsOworCisgICAgZnVuY3Rpb24gR2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsKKworICAgIGZ1bmN0aW9uIFRvT3JpZ2luYWxTdHJpbmc6IFN0cmluZzsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gVG9PcmlnaW5hbFN0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisKKyAgICBmdW5jdGlvbiBUb1N0cmluZyhjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nKTogU3RyaW5nOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBUb1N0cmluZyhjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOworICAgICAgY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXIpOiBTdHJpbmc7IG92ZXJsb2FkOyB2aXJ0dWFsOworCisgICAgZnVuY3Rpb24gVG9EZWJ1Z1N0cmluZzogU3RyaW5nOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBUb0RlYnVnU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogU3RyaW5nOyBvdmVybG9hZDsgdmlydHVhbDsKKyAgcHJvdGVjdGVkCisgICAgeyBJVG9rZW5TdHJlYW0gfQorICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogU3RyaW5nOyBvdmVybG9hZDsgb3ZlcnJpZGU7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgSW5pdDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRQcm9ncmFtKGNvbnN0IE5hbWU6IFN0cmluZyk6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBHZXRMYXN0UmV3cml0ZVRva2VuSW5kZXgoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZyk6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRMYXN0UmV3cml0ZVRva2VuSW5kZXgoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgSTogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBSZXR1cm4gYSBtYXAgZnJvbSB0b2tlbiBpbmRleCB0byBvcGVyYXRpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHJlbWFya3M+V2UgbmVlZCB0byBjb21iaW5lIG9wZXJhdGlvbnMgYW5kIHJlcG9ydCBpbnZhbGlkIG9wZXJhdGlvbnMgKGxpa2UKKyAgICAvLy8gb3ZlcmxhcHBpbmcgcmVwbGFjZXMgdGhhdCBhcmUgbm90IGNvbXBsZXRlZCBuZXN0ZWQpLiAgSW5zZXJ0cyB0bworICAgIC8vLyBzYW1lIGluZGV4IG5lZWQgdG8gYmUgY29tYmluZWQgZXRjLi4uICAgSGVyZSBhcmUgdGhlIGNhc2VzOgorICAgIC8vLworICAgIC8vLyBJLmkudSBJLmoudiAgICAgICAgICAgICAgIGxlYXZlIGFsb25lLCBub25vdmVybGFwcGluZworICAgIC8vLyBJLmkudSBJLmkudiAgICAgICAgICAgICAgIGNvbWJpbmU6IElpdnUKKyAgICAvLy8KKyAgICAvLy8gUi5pLWoudSBSLngteS52IHwgaS1qIGluIHgteSAgICAgIGRlbGV0ZSBmaXJzdCBSCisgICAgLy8vIFIuaS1qLnUgUi5pLWoudiAgICAgICAgICAgICBkZWxldGUgZmlyc3QgUgorICAgIC8vLyBSLmktai51IFIueC15LnYgfCB4LXkgaW4gaS1qICAgICAgRVJST1IKKyAgICAvLy8gUi5pLWoudSBSLngteS52IHwgYm91bmRhcmllcyBvdmVybGFwICBFUlJPUgorICAgIC8vLworICAgIC8vLyBJLmkudSBSLngteS52IHwgaSBpbiB4LXkgICAgICAgIGRlbGV0ZSBJCisgICAgLy8vIEkuaS51IFIueC15LnYgfCBpIG5vdCBpbiB4LXkgICAgICBsZWF2ZSBhbG9uZSwgbm9ub3ZlcmxhcHBpbmcKKyAgICAvLy8gUi54LXkudiBJLmkudSB8IGkgaW4geC15ICAgICAgICBFUlJPUgorICAgIC8vLyBSLngteS52IEkueC51ICAgICAgICAgICAgICAgUi54LXkudXYgKGNvbWJpbmUsIGRlbGV0ZSBJKQorICAgIC8vLyBSLngteS52IEkuaS51IHwgaSBub3QgaW4geC15ICAgICAgbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisgICAgLy8vCisgICAgLy8vIEkuaS51ID0gaW5zZXJ0IHUgYmVmb3JlIG9wIEAgaW5kZXggaQorICAgIC8vLyBSLngteS51ID0gcmVwbGFjZSB4LXkgaW5kZXhlZCB0b2tlbnMgd2l0aCB1CisgICAgLy8vCisgICAgLy8vIEZpcnN0IHdlIG5lZWQgdG8gZXhhbWluZSByZXBsYWNlcy4gIEZvciBhbnkgcmVwbGFjZSBvcDoKKyAgICAvLy8KKyAgICAvLy8gICAxLiB3aXBlIG91dCBhbnkgaW5zZXJ0aW9ucyBiZWZvcmUgb3Agd2l0aGluIHRoYXQgcmFuZ2UuCisgICAgLy8vICAgMi4gRHJvcCBhbnkgcmVwbGFjZSBvcCBiZWZvcmUgdGhhdCBpcyBjb250YWluZWQgY29tcGxldGVseSB3aXRoaW4KKyAgICAvLy8gICAgICAgIHRoYXQgcmFuZ2UuCisgICAgLy8vICAgMy4gVGhyb3cgZXhjZXB0aW9uIHVwb24gYm91bmRhcnkgb3ZlcmxhcCB3aXRoIGFueSBwcmV2aW91cyByZXBsYWNlLgorICAgIC8vLworICAgIC8vLyBUaGVuIHdlIGNhbiBkZWFsIHdpdGggaW5zZXJ0czoKKyAgICAvLy8KKyAgICAvLy8gICAxLiBmb3IgYW55IGluc2VydHMgdG8gc2FtZSBpbmRleCwgY29tYmluZSBldmVuIGlmIG5vdCBhZGphY2VudC4KKyAgICAvLy8gICAyLiBmb3IgYW55IHByaW9yIHJlcGxhY2Ugd2l0aCBzYW1lIGxlZnQgYm91bmRhcnksIGNvbWJpbmUgdGhpcworICAgIC8vLyAgICAgICAgaW5zZXJ0IHdpdGggcmVwbGFjZSBhbmQgZGVsZXRlIHRoaXMgcmVwbGFjZS4KKyAgICAvLy8gICAzLiB0aHJvdyBleGNlcHRpb24gaWYgaW5kZXggaW4gc2FtZSByYW5nZSBhcyBwcmV2aW91cyByZXBsYWNlCisgICAgLy8vCisgICAgLy8vIERvbid0IGFjdHVhbGx5IGRlbGV0ZTsgbWFrZSBvcCBudWxsIGluIGxpc3QuIEVhc2llciB0byB3YWxrIGxpc3QuCisgICAgLy8vIExhdGVyIHdlIGNhbiB0aHJvdyBhcyB3ZSBhZGQgdG8gaW5kZXggLT4gb3AgbWFwLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgSS4yIFIuMi0yIHdpbGwgd2lwZSBvdXQgSS4yIGV2ZW4gdGhvdWdoLCB0ZWNobmljYWxseSwgdGhlCisgICAgLy8vIGluc2VydGVkIHN0dWZmIHdvdWxkIGJlIGJlZm9yZSB0aGUgcmVwbGFjZSByYW5nZS4gIEJ1dCwgaWYgeW91CisgICAgLy8vIGFkZCB0b2tlbnMgaW4gZnJvbnQgb2YgYSBtZXRob2QgYm9keSAneycgYW5kIHRoZW4gZGVsZXRlIHRoZSBtZXRob2QKKyAgICAvLy8gYm9keSwgSSB0aGluayB0aGUgc3R1ZmYgYmVmb3JlIHRoZSAneycgeW91IGFkZGVkIHNob3VsZCBkaXNhcHBlYXIgdG9vLgorICAgIC8vLyA8L3JlbWFya3M+CisgICAgZnVuY3Rpb24gUmVkdWNlVG9TaW5nbGVPcGVyYXRpb25QZXJJbmRleCgKKyAgICAgIGNvbnN0IFJld3JpdGVzOiBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj4pOiBJRGljdGlvbmFyeTxJbnRlZ2VyLCBJUmV3cml0ZU9wZXJhdGlvbj47CisKKyAgICBmdW5jdGlvbiBHZXRLaW5kT2ZPcHMoY29uc3QgUmV3cml0ZXM6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsKKyAgICAgIGNvbnN0IEtpbmQ6IFRHVUlEKTogSUxpc3Q8SVJld3JpdGVPcGVyYXRpb24+OyBvdmVybG9hZDsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEdldCBhbGwgb3BlcmF0aW9ucyBiZWZvcmUgYW4gaW5kZXggb2YgYSBwYXJ0aWN1bGFyIGtpbmQKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGZ1bmN0aW9uIEdldEtpbmRPZk9wcyhjb25zdCBSZXdyaXRlczogSUxpc3Q8SVJld3JpdGVPcGVyYXRpb24+OworICAgICAgY29uc3QgS2luZDogVEdVSUQ7IGNvbnN0IEJlZm9yZTogSW50ZWdlcik6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsgb3ZlcmxvYWQ7CisKKyAgICBmdW5jdGlvbiBDYXRPcFRleHQoY29uc3QgQSwgQjogSUFOVExSSW50ZXJmYWNlKTogSUFOVExSSW50ZXJmYWNlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBVG9rZW5Tb3VyY2U6IElUb2tlblNvdXJjZSk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBVG9rZW5Tb3VyY2U6IElUb2tlblNvdXJjZTsKKyAgICAgIGNvbnN0IEFDaGFubmVsOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFMZXhlcjogSUxleGVyKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFMZXhlcjogSUxleGVyOworICAgICAgY29uc3QgQUNoYW5uZWw6IEludGVnZXIpOyBvdmVybG9hZDsKKworICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBTdHJpbmc7IG92ZXJsb2FkOyBvdmVycmlkZTsKKyAgZW5kOworCit7IFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gWCBvciwgaWYgWCA9IG5pbCwgYW4gZW1wdHkgZGVmYXVsdCBpbnN0YW5jZSB9CitmdW5jdGlvbiBEZWYoY29uc3QgWDogSVRva2VuKTogSVRva2VuOyBvdmVybG9hZDsKK2Z1bmN0aW9uIERlZihjb25zdCBYOiBJUnVsZVJldHVyblNjb3BlKTogSVJ1bGVSZXR1cm5TY29wZTsgb3ZlcmxvYWQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3VzZXMKKyAgU3RyVXRpbHMsCisgIE1hdGgsCisgIEFudGxyLlJ1bnRpbWUuVHJlZTsKKworeyBFUmVjb2duaXRpb25FeGNlcHRpb24gfQorCitjb25zdHJ1Y3RvciBFUmVjb2duaXRpb25FeGNlcHRpb24uQ3JlYXRlOworYmVnaW4KKyAgQ3JlYXRlKCcnLCBuaWwpOworZW5kOworCitjb25zdHJ1Y3RvciBFUmVjb2duaXRpb25FeGNlcHRpb24uQ3JlYXRlKGNvbnN0IEFNZXNzYWdlOiBTdHJpbmcpOworYmVnaW4KKyAgQ3JlYXRlKEFNZXNzYWdlLCBuaWwpOworZW5kOworCitjb25zdHJ1Y3RvciBFUmVjb2duaXRpb25FeGNlcHRpb24uQ3JlYXRlKGNvbnN0IEFJbnB1dDogSUludFN0cmVhbSk7CitiZWdpbgorICBDcmVhdGUoJycsIEFJbnB1dCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIEVSZWNvZ25pdGlvbkV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgQU1lc3NhZ2U6IFN0cmluZzsKKyAgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsKK3ZhcgorICBUb2tlblN0cmVhbTogSVRva2VuU3RyZWFtOworICBDaGFyU3RyZWFtOiBJQ2hhclN0cmVhbTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQU1lc3NhZ2UpOworICBGSW5wdXQgOj0gQUlucHV0OworICBGSW5kZXggOj0gQUlucHV0LkluZGV4OworCisgIGlmIFN1cHBvcnRzKEFJbnB1dCwgSVRva2VuU3RyZWFtLCBUb2tlblN0cmVhbSkgdGhlbgorICBiZWdpbgorICAgIEZUb2tlbiA6PSBUb2tlblN0cmVhbS5MVCgxKTsKKyAgICBGTGluZSA6PSBGVG9rZW4uTGluZTsKKyAgICBGQ2hhclBvc2l0aW9uSW5MaW5lIDo9IEZUb2tlbi5DaGFyUG9zaXRpb25JbkxpbmU7CisgIGVuZDsKKworICBpZiBTdXBwb3J0cyhBSW5wdXQsIElUcmVlTm9kZVN0cmVhbSkgdGhlbgorICAgIEV4dHJhY3RJbmZvcm1hdGlvbkZyb21UcmVlTm9kZVN0cmVhbShBSW5wdXQpCisgIGVsc2UKKyAgYmVnaW4KKyAgICBpZiBTdXBwb3J0cyhBSW5wdXQsIElDaGFyU3RyZWFtLCBDaGFyU3RyZWFtKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIEZDIDo9IEFJbnB1dC5MQSgxKTsKKyAgICAgIEZMaW5lIDo9IENoYXJTdHJlYW0uTGluZTsKKyAgICAgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gQ2hhclN0cmVhbS5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgRkMgOj0gQUlucHV0LkxBKDEpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBFUmVjb2duaXRpb25FeGNlcHRpb24uRXh0cmFjdEluZm9ybWF0aW9uRnJvbVRyZWVOb2RlU3RyZWFtKAorICBjb25zdCBJbnB1dDogSUludFN0cmVhbSk7Cit2YXIKKyAgTm9kZXM6IElUcmVlTm9kZVN0cmVhbTsKKyAgQWRhcHRvcjogSVRyZWVBZGFwdG9yOworICBQYXlsb2FkLCBQcmlvclBheWxvYWQ6IElUb2tlbjsKKyAgSSwgTm9kZVR5cGU6IEludGVnZXI7CisgIFByaW9yTm9kZTogSUFOVExSSW50ZXJmYWNlOworICBUcmVlOiBJVHJlZTsKKyAgVGV4dDogU3RyaW5nOworICBDb21tb25UcmVlOiBJQ29tbW9uVHJlZTsKK2JlZ2luCisgIE5vZGVzIDo9IElucHV0IGFzIElUcmVlTm9kZVN0cmVhbTsKKyAgRk5vZGUgOj0gTm9kZXMuTFQoMSk7CisgIEFkYXB0b3IgOj0gTm9kZXMuVHJlZUFkYXB0b3I7CisgIFBheWxvYWQgOj0gQWRhcHRvci5HZXRUb2tlbihGTm9kZSk7CisKKyAgaWYgQXNzaWduZWQoUGF5bG9hZCkgdGhlbgorICBiZWdpbgorICAgIEZUb2tlbiA6PSBQYXlsb2FkOworICAgIGlmIChQYXlsb2FkLkxpbmUgPD0gMCkgdGhlbgorICAgIGJlZ2luCisgICAgICAvLyBpbWFnaW5hcnkgbm9kZTsgbm8gbGluZS9wb3MgaW5mbzsgc2NhbiBiYWNrd2FyZHMKKyAgICAgIEkgOj0gLTE7CisgICAgICBQcmlvck5vZGUgOj0gTm9kZXMuTFQoSSk7CisgICAgICB3aGlsZSBBc3NpZ25lZChQcmlvck5vZGUpIGRvCisgICAgICBiZWdpbgorICAgICAgICBQcmlvclBheWxvYWQgOj0gQWRhcHRvci5HZXRUb2tlbihQcmlvck5vZGUpOworICAgICAgICBpZiBBc3NpZ25lZChQcmlvclBheWxvYWQpIGFuZCAoUHJpb3JQYXlsb2FkLkxpbmUgPiAwKSB0aGVuCisgICAgICAgIGJlZ2luCisgICAgICAgICAgLy8gd2UgZm91bmQgdGhlIG1vc3QgcmVjZW50IHJlYWwgbGluZSAvIHBvcyBpbmZvCisgICAgICAgICAgRkxpbmUgOj0gUHJpb3JQYXlsb2FkLkxpbmU7CisgICAgICAgICAgRkNoYXJQb3NpdGlvbkluTGluZSA6PSBQcmlvclBheWxvYWQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICAgIEZBcHByb3hpbWF0ZUxpbmVJbmZvIDo9IFRydWU7CisgICAgICAgICAgQnJlYWs7CisgICAgICAgIGVuZDsKKyAgICAgICAgRGVjKEkpOworICAgICAgICBQcmlvck5vZGUgOj0gTm9kZXMuTFQoSSkKKyAgICAgIGVuZDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgYmVnaW4KKyAgICAgIC8vIG5vZGUgY3JlYXRlZCBmcm9tIHJlYWwgdG9rZW4KKyAgICAgIEZMaW5lIDo9IFBheWxvYWQuTGluZTsKKyAgICAgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gUGF5bG9hZC5DaGFyUG9zaXRpb25JbkxpbmU7CisgICAgZW5kOworICBlbmQgZWxzZQorICAgIGlmIFN1cHBvcnRzKEZOb2RlLCBJVHJlZSwgVHJlZSkgdGhlbgorICAgIGJlZ2luCisgICAgICBGTGluZSA6PSBUcmVlLkxpbmU7CisgICAgICBGQ2hhclBvc2l0aW9uSW5MaW5lIDo9IFRyZWUuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgaWYgU3VwcG9ydHMoRk5vZGUsIElDb21tb25UcmVlLCBDb21tb25UcmVlKSB0aGVuCisgICAgICAgIEZUb2tlbiA6PSBDb21tb25UcmVlLlRva2VuOworICAgIGVuZAorICAgIGVsc2UKKyAgICBiZWdpbgorICAgICAgTm9kZVR5cGUgOj0gQWRhcHRvci5HZXROb2RlVHlwZShGTm9kZSk7CisgICAgICBUZXh0IDo9IEFkYXB0b3IuR2V0Tm9kZVRleHQoRk5vZGUpOworICAgICAgRlRva2VuIDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoTm9kZVR5cGUsIFRleHQpOworICAgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gRVJlY29nbml0aW9uRXhjZXB0aW9uLkdldFVuZXhwZWN0ZWRUeXBlOiBJbnRlZ2VyOwordmFyCisgIE5vZGVzOiBJVHJlZU5vZGVTdHJlYW07CisgIEFkYXB0b3I6IElUcmVlQWRhcHRvcjsKK2JlZ2luCisgIGlmIFN1cHBvcnRzKEZJbnB1dCwgSVRva2VuU3RyZWFtKSB0aGVuCisgICAgUmVzdWx0IDo9IEZUb2tlbi5Ub2tlblR5cGUKKyAgZWxzZQorICAgIGlmIFN1cHBvcnRzKEZJbnB1dCwgSVRyZWVOb2RlU3RyZWFtLCBOb2RlcykgdGhlbgorICAgIGJlZ2luCisgICAgICBBZGFwdG9yIDo9IE5vZGVzLlRyZWVBZGFwdG9yOworICAgICAgUmVzdWx0IDo9IEFkYXB0b3IuR2V0Tm9kZVR5cGUoRk5vZGUpOworICAgIGVuZCBlbHNlCisgICAgICBSZXN1bHQgOj0gRkM7CitlbmQ7CisKK3sgRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiB9CisKK2NvbnN0cnVjdG9yIEVNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uQ3JlYXRlKGNvbnN0IEFFeHBlY3Rpbmc6IEludGVnZXI7CisgIGNvbnN0IEFJbnB1dDogSUludFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFJbnB1dCk7CisgIEZFeHBlY3RpbmcgOj0gQUV4cGVjdGluZzsKK2VuZDsKKworZnVuY3Rpb24gRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5Ub1N0cmluZzogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9ICdNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oJyArIEludFRvU3RyKFVuZXhwZWN0ZWRUeXBlKQorICAgICsgJyE9JyArIEludFRvU3RyKEV4cGVjdGluZykgKyAnKSc7CisKK2VuZDsKKworeyBFVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIEVVbndhbnRlZFRva2VuRXhjZXB0aW9uLkdldFVuZXhwZWN0ZWRUb2tlbjogSVRva2VuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlbjsKK2VuZDsKKworZnVuY3Rpb24gRVVud2FudGVkVG9rZW5FeGNlcHRpb24uVG9TdHJpbmc6IFN0cmluZzsKK3ZhcgorICBFeHA6IFN0cmluZzsKK2JlZ2luCisgIGlmIChFeHBlY3RpbmcgPSBUVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFKSB0aGVuCisgICAgRXhwIDo9ICcnCisgIGVsc2UKKyAgICBFeHAgOj0gJywgZXhwZWN0ZWQgJyArIEludFRvU3RyKEV4cGVjdGluZyk7CisgIGlmIChUb2tlbiA9IG5pbCkgdGhlbgorICAgIFJlc3VsdCA6PSAnVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD1uaWwnICsgRXhwICsgJyknCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gJ1Vud2FudGVkVG9rZW5FeGNlcHRpb24oZm91bmQ9JyArIFRva2VuLlRleHQgKyBFeHAgKyAnKScKK2VuZDsKKworeyBFTWlzc2luZ1Rva2VuRXhjZXB0aW9uIH0KKworY29uc3RydWN0b3IgRU1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgQUV4cGVjdGluZzogSW50ZWdlcjsKKyAgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtOyBjb25zdCBBSW5zZXJ0ZWQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFFeHBlY3RpbmcsIEFJbnB1dCk7CisgIEZJbnNlcnRlZCA6PSBBSW5zZXJ0ZWQ7CitlbmQ7CisKK2Z1bmN0aW9uIEVNaXNzaW5nVG9rZW5FeGNlcHRpb24uR2V0TWlzc2luZ1R5cGU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRXhwZWN0aW5nOworZW5kOworCitmdW5jdGlvbiBFTWlzc2luZ1Rva2VuRXhjZXB0aW9uLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBpZiBBc3NpZ25lZChGSW5zZXJ0ZWQpIGFuZCBBc3NpZ25lZChGVG9rZW4pIHRoZW4KKyAgICBSZXN1bHQgOj0gJ01pc3NpbmdUb2tlbkV4Y2VwdGlvbihpbnNlcnRlZCAnICsgRkluc2VydGVkLlRvU3RyaW5nCisgICAgICArICcgYXQgJyArIEZUb2tlbi5UZXh0ICsgJyknCisgIGVsc2UKKyAgICBpZiBBc3NpZ25lZChGVG9rZW4pIHRoZW4KKyAgICAgIFJlc3VsdCA6PSAnTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGF0ICcgKyBGVG9rZW4uVGV4dCArICcpJworICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSAnTWlzc2luZ1Rva2VuRXhjZXB0aW9uJzsKK2VuZDsKKworeyBFTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIH0KKworY29uc3RydWN0b3IgRU1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgQUV4cGVjdGluZzogSW50ZWdlcjsKKyAgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUlucHV0KTsKKyAgRkV4cGVjdGluZyA6PSBBRXhwZWN0aW5nOworZW5kOworCitmdW5jdGlvbiBFTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJ01pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbignICsgSW50VG9TdHIoVW5leHBlY3RlZFR5cGUpCisgICAgKyAnIT0nICsgSW50VG9TdHIoRXhwZWN0aW5nKSArICcpJzsKK2VuZDsKKworeyBFTm9WaWFibGVBbHRFeGNlcHRpb24gfQorCitjb25zdHJ1Y3RvciBFTm9WaWFibGVBbHRFeGNlcHRpb24uQ3JlYXRlKAorICBjb25zdCBBR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb246IFN0cmluZzsgY29uc3QgQURlY2lzaW9uTnVtYmVyLAorICBBU3RhdGVOdW1iZXI6IEludGVnZXI7IGNvbnN0IEFJbnB1dDogSUludFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFJbnB1dCk7CisgIEZHcmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiA6PSBBR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgIEZEZWNpc2lvbk51bWJlciA6PSBBRGVjaXNpb25OdW1iZXI7CisgIEZTdGF0ZU51bWJlciA6PSBBU3RhdGVOdW1iZXI7CitlbmQ7CisKK2Z1bmN0aW9uIEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5Ub1N0cmluZzogU3RyaW5nOworYmVnaW4KKyAgaWYgU3VwcG9ydHMoSW5wdXQsIElDaGFyU3RyZWFtKSB0aGVuCisgICAgUmVzdWx0IDo9ICdOb1ZpYWJsZUFsdEV4Y2VwdGlvbignJycgKyBDaGFyKFVuZXhwZWN0ZWRUeXBlKSArICcnJ0BbJworICAgICAgKyBGR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gKyAnXSknCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gJ05vVmlhYmxlQWx0RXhjZXB0aW9uKCcnJyArIEludFRvU3RyKFVuZXhwZWN0ZWRUeXBlKSArICcnJ0BbJworICAgICAgKyBGR3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24gKyAnXSknCitlbmQ7CisKK3sgRUVhcmx5RXhpdEV4Y2VwdGlvbiB9CisKK2NvbnN0cnVjdG9yIEVFYXJseUV4aXRFeGNlcHRpb24uQ3JlYXRlKGNvbnN0IEFEZWNpc2lvbk51bWJlcjogSW50ZWdlcjsKKyAgY29uc3QgQUlucHV0OiBJSW50U3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUlucHV0KTsKKyAgRkRlY2lzaW9uTnVtYmVyIDo9IEFEZWNpc2lvbk51bWJlcjsKK2VuZDsKKworeyBFTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiB9CisKK2NvbnN0cnVjdG9yIEVNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBBRXhwZWN0aW5nOiBJQml0U2V0OworICBjb25zdCBBSW5wdXQ6IElJbnRTdHJlYW0pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBSW5wdXQpOworICBGRXhwZWN0aW5nIDo9IEFFeHBlY3Rpbmc7CitlbmQ7CisKK2Z1bmN0aW9uIEVNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJ01pc21hdGNoZWRTZXRFeGNlcHRpb24oJyArIEludFRvU3RyKFVuZXhwZWN0ZWRUeXBlKQorICAgICsgJyE9JyArIEV4cGVjdGluZy5Ub1N0cmluZyArICcpJzsKK2VuZDsKKworeyBFTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIEVNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJ01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24oJyArIEludFRvU3RyKFVuZXhwZWN0ZWRUeXBlKQorICAgICsgJyE9JyArIEV4cGVjdGluZy5Ub1N0cmluZyArICcpJzsKK2VuZDsKKworeyBFRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIH0KKworY29uc3RydWN0b3IgRUZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgQUlucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBBUnVsZU5hbWUsIEFQcmVkaWNhdGVUZXh0OiBTdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBSW5wdXQpOworICBGUnVsZU5hbWUgOj0gQVJ1bGVOYW1lOworICBGUHJlZGljYXRlVGV4dCA6PSBBUHJlZGljYXRlVGV4dDsKK2VuZDsKKworZnVuY3Rpb24gRUZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5Ub1N0cmluZzogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9ICdGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oJyArIEZSdWxlTmFtZSArICcseycgKyBGUHJlZGljYXRlVGV4dCArICd9PyknOworZW5kOworCit7IEVNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gfQorCitjb25zdHJ1Y3RvciBFTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLkNyZWF0ZShjb25zdCBBQSwgQUI6IEludGVnZXI7CisgIGNvbnN0IEFJbnB1dDogSUludFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEZJbnB1dCk7CisgIEZBIDo9IEFBOworICBGQiA6PSBBQjsKK2VuZDsKKworZnVuY3Rpb24gRU1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5Ub1N0cmluZzogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9ICdNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKCcgKyBJbnRUb1N0cihVbmV4cGVjdGVkVHlwZSkKKyAgICArICcgbm90IGluIFsnICsgSW50VG9TdHIoRkEpKyAnLCcgKyBJbnRUb1N0cihGQikgKyAnXSknOworZW5kOworCit7IFRDaGFyU3RyZWFtU3RhdGUgfQorCitmdW5jdGlvbiBUQ2hhclN0cmVhbVN0YXRlLkdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ2hhclBvc2l0aW9uSW5MaW5lOworZW5kOworCitmdW5jdGlvbiBUQ2hhclN0cmVhbVN0YXRlLkdldExpbmU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpbmU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDaGFyU3RyZWFtU3RhdGUuR2V0UDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGUDsKK2VuZDsKKworcHJvY2VkdXJlIFRDaGFyU3RyZWFtU3RhdGUuU2V0Q2hhclBvc2l0aW9uSW5MaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2hhclN0cmVhbVN0YXRlLlNldExpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkxpbmUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2hhclN0cmVhbVN0YXRlLlNldFAoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlAgOj0gVmFsdWU7CitlbmQ7CisKK3sgVEFOVExSU3RyaW5nU3RyZWFtIH0KKworY29uc3RydWN0b3IgVEFOVExSU3RyaW5nU3RyZWFtLkNyZWF0ZShjb25zdCBBSW5wdXQ6IFN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTGluZSA6PSAxOworICBGT3duc0RhdGEgOj0gVHJ1ZTsKKyAgRk4gOj0gTGVuZ3RoKEFJbnB1dCk7CisgIGlmIChGTiA+IDApIHRoZW4KKyAgYmVnaW4KKyAgICBHZXRNZW0oRkRhdGEsRk4gKiBTaXplT2YoQ2hhcikpOworICAgIE1vdmUoQUlucHV0WzFdLEZEYXRhXixGTiAqIFNpemVPZihDaGFyKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRBTlRMUlN0cmluZ1N0cmVhbS5Db25zdW1lOworYmVnaW4KKyAgaWYgKEZQIDwgRk4pIHRoZW4KKyAgYmVnaW4KKyAgICBJbmMoRkNoYXJQb3NpdGlvbkluTGluZSk7CisgICAgaWYgKEZEYXRhW0ZQXSA9ICMxMCkgdGhlbgorICAgIGJlZ2luCisgICAgICBJbmMoRkxpbmUpOworICAgICAgRkNoYXJQb3NpdGlvbkluTGluZSA6PSAwOworICAgIGVuZDsKKyAgICBJbmMoRlApOworICBlbmQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRBTlRMUlN0cmluZ1N0cmVhbS5DcmVhdGUoY29uc3QgQURhdGE6IFBDaGFyOworICBjb25zdCBBTnVtYmVyT2ZBY3R1YWxDaGFyc0luQXJyYXk6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkxpbmUgOj0gMTsKKyAgRk93bnNEYXRhIDo9IEZhbHNlOworICBGRGF0YSA6PSBBRGF0YTsKKyAgRk4gOj0gQU51bWJlck9mQWN0dWFsQ2hhcnNJbkFycmF5OworZW5kOworCitjb25zdHJ1Y3RvciBUQU5UTFJTdHJpbmdTdHJlYW0uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRkxpbmUgOj0gMTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQU5UTFJTdHJpbmdTdHJlYW0uRGVzdHJveTsKK2JlZ2luCisgIGlmIChGT3duc0RhdGEpIHRoZW4KKyAgICBGcmVlTWVtKEZEYXRhKTsKKyAgaW5oZXJpdGVkOworZW5kOworCitmdW5jdGlvbiBUQU5UTFJTdHJpbmdTdHJlYW0uR2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDaGFyUG9zaXRpb25JbkxpbmU7CitlbmQ7CisKK2Z1bmN0aW9uIFRBTlRMUlN0cmluZ1N0cmVhbS5HZXRMaW5lOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaW5lOworZW5kOworCitmdW5jdGlvbiBUQU5UTFJTdHJpbmdTdHJlYW0uR2V0U291cmNlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZOYW1lOworZW5kOworCitmdW5jdGlvbiBUQU5UTFJTdHJpbmdTdHJlYW0uSW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlA7CitlbmQ7CisKK2Z1bmN0aW9uIFRBTlRMUlN0cmluZ1N0cmVhbS5MQShJOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChJID0gMCkgdGhlbgorICAgIFJlc3VsdCA6PSAwIC8vIHVuZGVmaW5lZAorICBlbHNlIGJlZ2luCisgICAgaWYgKEkgPCAwKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIEluYyhJKTsgLy8gZS5nLiwgdHJhbnNsYXRlIExBKC0xKSB0byB1c2Ugb2Zmc2V0IGk9MDsgdGhlbiBkYXRhW3ArMC0xXQorICAgICAgaWYgKChGUCArIEkgLSAxKSA8IDApIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIFJlc3VsdCA6PSBJbnRlZ2VyKGNzY0VPRik7CisgICAgICAgIEV4aXQ7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgaWYgKChGUCArIEkgLSAxKSA+PSBGTikgdGhlbgorICAgICAgUmVzdWx0IDo9IEludGVnZXIoY3NjRU9GKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSBJbnRlZ2VyKEZEYXRhW0ZQICsgSSAtIDFdKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQU5UTFJTdHJpbmdTdHJlYW0uTEFDaGFyKEk6IEludGVnZXIpOiBDaGFyOworYmVnaW4KKyAgUmVzdWx0IDo9IENoYXIoTEEoSSkpOworZW5kOworCitmdW5jdGlvbiBUQU5UTFJTdHJpbmdTdHJlYW0uTFQoY29uc3QgSTogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gTEEoSSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRBTlRMUlN0cmluZ1N0cmVhbS5NYXJrOiBJbnRlZ2VyOwordmFyCisgIFN0YXRlOiBJQ2hhclN0cmVhbVN0YXRlOworYmVnaW4KKyAgaWYgKEZNYXJrZXJzID0gbmlsKSB0aGVuCisgIGJlZ2luCisgICAgRk1hcmtlcnMgOj0gVExpc3Q8SUNoYXJTdHJlYW1TdGF0ZT4uQ3JlYXRlOworICAgIEZNYXJrZXJzLkFkZChuaWwpOyAgLy8gZGVwdGggMCBtZWFucyBubyBiYWNrdHJhY2tpbmcsIGxlYXZlIGJsYW5rCisgIGVuZDsKKworICBJbmMoRk1hcmtEZXB0aCk7CisgIGlmIChGTWFya0RlcHRoID49IEZNYXJrZXJzLkNvdW50KSB0aGVuCisgIGJlZ2luCisgICAgU3RhdGUgOj0gVENoYXJTdHJlYW1TdGF0ZS5DcmVhdGU7CisgICAgRk1hcmtlcnMuQWRkKFN0YXRlKTsKKyAgZW5kCisgIGVsc2UKKyAgICBTdGF0ZSA6PSBGTWFya2Vyc1tGTWFya0RlcHRoXTsKKworICBTdGF0ZS5QIDo9IEZQOworICBTdGF0ZS5MaW5lIDo9IEZMaW5lOworICBTdGF0ZS5DaGFyUG9zaXRpb25JbkxpbmUgOj0gRkNoYXJQb3NpdGlvbkluTGluZTsKKyAgRkxhc3RNYXJrZXIgOj0gRk1hcmtEZXB0aDsKKyAgUmVzdWx0IDo9IEZNYXJrRGVwdGg7CitlbmQ7CisKK3Byb2NlZHVyZSBUQU5UTFJTdHJpbmdTdHJlYW0uUmVsZWFzZShjb25zdCBNYXJrZXI6IEludGVnZXIpOworYmVnaW4KKyAgLy8gdW53aW5kIGFueSBvdGhlciBtYXJrZXJzIG1hZGUgYWZ0ZXIgbSBhbmQgcmVsZWFzZSBtCisgIEZNYXJrRGVwdGggOj0gTWFya2VyOworICAvLyByZWxlYXNlIHRoaXMgbWFya2VyCisgIERlYyhGTWFya0RlcHRoKTsKK2VuZDsKKworcHJvY2VkdXJlIFRBTlRMUlN0cmluZ1N0cmVhbS5SZXNldDsKK2JlZ2luCisgIEZQIDo9IDA7CisgIEZMaW5lIDo9IDE7CisgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gMDsKKyAgRk1hcmtEZXB0aCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVEFOVExSU3RyaW5nU3RyZWFtLlJld2luZChjb25zdCBNYXJrZXI6IEludGVnZXIpOwordmFyCisgIFN0YXRlOiBJQ2hhclN0cmVhbVN0YXRlOworYmVnaW4KKyAgU3RhdGUgOj0gRk1hcmtlcnNbTWFya2VyXTsKKyAgLy8gcmVzdG9yZSBzdHJlYW0gc3RhdGUKKyAgU2VlayhTdGF0ZS5QKTsKKyAgRkxpbmUgOj0gU3RhdGUuTGluZTsKKyAgRkNoYXJQb3NpdGlvbkluTGluZSA6PSBTdGF0ZS5DaGFyUG9zaXRpb25JbkxpbmU7CisgIFJlbGVhc2UoTWFya2VyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRBTlRMUlN0cmluZ1N0cmVhbS5SZXdpbmQ7CitiZWdpbgorICBSZXdpbmQoRkxhc3RNYXJrZXIpOworZW5kOworCitwcm9jZWR1cmUgVEFOVExSU3RyaW5nU3RyZWFtLlNlZWsoY29uc3QgSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgaWYgKEluZGV4IDw9IEZQKSB0aGVuCisgICAgRlAgOj0gSW5kZXggLy8ganVzdCBqdW1wOyBkb24ndCB1cGRhdGUgc3RyZWFtIHN0YXRlIChsaW5lLCAuLi4pCisgIGVsc2UgYmVnaW4KKyAgICAvLyBzZWVrIGZvcndhcmQsIGNvbnN1bWUgdW50aWwgcCBoaXRzIGluZGV4CisgICAgd2hpbGUgKEZQIDwgSW5kZXgpIGRvCisgICAgICBDb25zdW1lOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQU5UTFJTdHJpbmdTdHJlYW0uU2V0Q2hhclBvc2l0aW9uSW5MaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQU5UTFJTdHJpbmdTdHJlYW0uU2V0TGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGTGluZSA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEFOVExSU3RyaW5nU3RyZWFtLlNpemU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRk47CitlbmQ7CisKK2Z1bmN0aW9uIFRBTlRMUlN0cmluZ1N0cmVhbS5TdWJzdHJpbmcoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXIpOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gQ29weShGRGF0YSwgU3RhcnQgKyAxLCBTdG9wIC0gU3RhcnQgKyAxKTsKK2VuZDsKKworeyBUQU5UTFJGaWxlU3RyZWFtIH0KKworY29uc3RydWN0b3IgVEFOVExSRmlsZVN0cmVhbS5DcmVhdGUoY29uc3QgQUZpbGVOYW1lOiBTdHJpbmcpOworYmVnaW4KKyAgQ3JlYXRlKEFGaWxlbmFtZSxURW5jb2RpbmcuRGVmYXVsdCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRBTlRMUkZpbGVTdHJlYW0uQ3JlYXRlKGNvbnN0IEFGaWxlTmFtZTogU3RyaW5nOworICBjb25zdCBBRW5jb2Rpbmc6IFRFbmNvZGluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGRmlsZU5hbWUgOj0gQUZpbGVOYW1lOworICBMb2FkKEZGaWxlTmFtZSwgQUVuY29kaW5nKTsKK2VuZDsKKworZnVuY3Rpb24gVEFOVExSRmlsZVN0cmVhbS5HZXRTb3VyY2VOYW1lOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gRkZpbGVOYW1lOworZW5kOworCitwcm9jZWR1cmUgVEFOVExSRmlsZVN0cmVhbS5Mb2FkKGNvbnN0IEZpbGVOYW1lOiBTdHJpbmc7CisgIGNvbnN0IEVuY29kaW5nOiBURW5jb2RpbmcpOwordmFyCisgIEZSOiBUU3RyZWFtUmVhZGVyOworICBTOiBTdHJpbmc7CitiZWdpbgorICBpZiAoRkZpbGVOYW1lIDw+ICcnKSB0aGVuCisgIGJlZ2luCisgICAgaWYgKEVuY29kaW5nID0gbmlsKSB0aGVuCisgICAgICBGUiA6PSBUU3RyZWFtUmVhZGVyLkNyZWF0ZShGaWxlTmFtZSxURW5jb2RpbmcuRGVmYXVsdCkKKyAgICBlbHNlCisgICAgICBGUiA6PSBUU3RyZWFtUmVhZGVyLkNyZWF0ZShGaWxlTmFtZSxFbmNvZGluZyk7CisKKyAgICB0cnkKKyAgICAgIGlmIChGT3duc0RhdGEpIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIEZyZWVNZW0oRkRhdGEpOworICAgICAgICBGRGF0YSA6PSBuaWw7CisgICAgICBlbmQ7CisKKyAgICAgIEZPd25zRGF0YSA6PSBUcnVlOworICAgICAgUyA6PSBGUi5SZWFkVG9FbmQ7CisgICAgICBGTiA6PSBMZW5ndGgoUyk7CisgICAgICBpZiAoRk4gPiAwKSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBHZXRNZW0oRkRhdGEsRk4gKiBTaXplT2YoQ2hhcikpOworICAgICAgICBNb3ZlKFNbMV0sRkRhdGFeLEZOICogU2l6ZU9mKENoYXIpKTsKKyAgICAgIGVuZDsKKyAgICBmaW5hbGx5CisgICAgICBGUi5GcmVlOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRCaXRTZXQgfQorCitjbGFzcyBmdW5jdGlvbiBUQml0U2V0LkJpdFNldE9mKGNvbnN0IEVsOiBJbnRlZ2VyKTogSUJpdFNldDsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQml0U2V0LkNyZWF0ZShFbCArIDEpOworICBSZXN1bHQuQWRkKEVsKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEJpdFNldC5CaXRTZXRPZihjb25zdCBBLCBCOiBJbnRlZ2VyKTogSUJpdFNldDsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQml0U2V0LkNyZWF0ZShNYXgoQSxCKSArIDEpOworICBSZXN1bHQuQWRkKEEpOworICBSZXN1bHQuQWRkKEIpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQml0U2V0LkJpdFNldE9mKGNvbnN0IEEsIEIsIEM6IEludGVnZXIpOiBJQml0U2V0OworYmVnaW4KKyAgUmVzdWx0IDo9IFRCaXRTZXQuQ3JlYXRlOworICBSZXN1bHQuQWRkKEEpOworICBSZXN1bHQuQWRkKEIpOworICBSZXN1bHQuQWRkKEMpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQml0U2V0LkJpdFNldE9mKGNvbnN0IEEsIEIsIEMsIEQ6IEludGVnZXIpOiBJQml0U2V0OworYmVnaW4KKyAgUmVzdWx0IDo9IFRCaXRTZXQuQ3JlYXRlOworICBSZXN1bHQuQWRkKEEpOworICBSZXN1bHQuQWRkKEIpOworICBSZXN1bHQuQWRkKEMpOworICBSZXN1bHQuQWRkKEQpOworZW5kOworCitwcm9jZWR1cmUgVEJpdFNldC5BZGQoY29uc3QgRWw6IEludGVnZXIpOwordmFyCisgIE46IEludGVnZXI7CitiZWdpbgorICBOIDo9IFdvcmROdW1iZXIoRWwpOworICBpZiAoTiA+PSBMZW5ndGgoRkJpdHMpKSB0aGVuCisgICAgR3Jvd1RvSW5jbHVkZShFbCk7CisgIEZCaXRzW05dIDo9IEZCaXRzW05dIG9yIEJpdE1hc2soRWwpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQml0U2V0LkJpdE1hc2soY29uc3QgQml0TnVtYmVyOiBJbnRlZ2VyKTogVUludDY0OwordmFyCisgIEJpdFBvc2l0aW9uOiBJbnRlZ2VyOworYmVnaW4KKyAgQml0UG9zaXRpb24gOj0gQml0TnVtYmVyIGFuZCBNT0RfTUFTSzsKKyAgUmVzdWx0IDo9IFVJbnQ2NCgxKSBzaGwgQml0UG9zaXRpb247CitlbmQ7CisKK2Z1bmN0aW9uIFRCaXRTZXQuQml0U2V0T3IoY29uc3QgQTogSUJpdFNldCk6IElCaXRTZXQ7CitiZWdpbgorICBSZXN1bHQgOj0gQ2xvbmUgYXMgSUJpdFNldDsKKyAgUmVzdWx0Lk9ySW5QbGFjZShBKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpdFNldC5DbG9uZTogSUFOVExSSW50ZXJmYWNlOwordmFyCisgIEJTOiBUQml0U2V0OworYmVnaW4KKyAgQlMgOj0gVEJpdFNldC5DcmVhdGU7CisgIFJlc3VsdCA6PSBCUzsKKyAgU2V0TGVuZ3RoKEJTLkZCaXRzLExlbmd0aChGQml0cykpOworICBpZiAoTGVuZ3RoKEZCaXRzKSA+IDApIHRoZW4KKyAgICBNb3ZlKEZCaXRzWzBdLEJTLkZCaXRzWzBdLExlbmd0aChGQml0cykgKiBTaXplT2YoVUludDY0KSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCaXRTZXQuQ3JlYXRlOworYmVnaW4KKyAgQ3JlYXRlKEJJVFMpOworZW5kOworCitjb25zdHJ1Y3RvciBUQml0U2V0LkNyZWF0ZShjb25zdCBBQml0czogYXJyYXkgb2YgVUludDY0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIFNldExlbmd0aChGQml0cywgTGVuZ3RoKEFCaXRzKSk7CisgIGlmIChMZW5ndGgoQUJpdHMpID4gMCkgdGhlbgorICAgIE1vdmUoQUJpdHNbMF0sIEZCaXRzWzBdLCBMZW5ndGgoQUJpdHMpICogU2l6ZU9mKFVJbnQ2NCkpOworZW5kOworCitjb25zdHJ1Y3RvciBUQml0U2V0LkNyZWF0ZShjb25zdCBBSXRlbXM6IElMaXN0PEludGVnZXI+KTsKK3ZhcgorICBWOiBJbnRlZ2VyOworYmVnaW4KKyAgQ3JlYXRlKEJJVFMpOworICBmb3IgViBpbiBBSXRlbXMgZG8KKyAgICBBZGQoVik7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCaXRTZXQuQ3JlYXRlKGNvbnN0IEFOQml0czogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBTZXRMZW5ndGgoRkJpdHMsKChBTkJpdHMgLSAxKSBzaHIgTE9HX0JJVFMpICsgMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaXRTZXQuRXF1YWxzKE9iajogVE9iamVjdCk6IEJvb2xlYW47Cit2YXIKKyAgT3RoZXJTZXQ6IFRCaXRTZXQgYWJzb2x1dGUgT2JqOworICBJLCBOOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZhbHNlOworICBpZiAoT2JqID0gbmlsKSBvciAobm90IChPYmogaXMgVEJpdFNldCkpIHRoZW4KKyAgICBFeGl0OworCisgIE4gOj0gTWluKExlbmd0aChGQml0cyksIExlbmd0aChPdGhlclNldC5GQml0cykpOworCisgIC8vIGZvciBhbnkgYml0cyBpbiBjb21tb24sIGNvbXBhcmUKKyAgZm9yIEkgOj0gMCB0byBOIC0gMSBkbworICBiZWdpbgorICAgIGlmIChGQml0c1tJXSA8PiBPdGhlclNldC5GQml0c1tJXSkgdGhlbgorICAgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIG1ha2Ugc3VyZSBhbnkgZXh0cmEgYml0cyBhcmUgb2ZmCisgIGlmIChMZW5ndGgoRkJpdHMpID4gTikgdGhlbgorICBiZWdpbgorICAgIGZvciBJIDo9IE4gKyAxIHRvIExlbmd0aChGQml0cykgLSAxIGRvCisgICAgYmVnaW4KKyAgICAgIGlmIChGQml0c1tJXSA8PiAwKSB0aGVuCisgICAgICAgIEV4aXQ7CisgICAgZW5kOworICBlbmQKKyAgZWxzZQorICAgIGlmIChMZW5ndGgoT3RoZXJTZXQuRkJpdHMpID4gTikgdGhlbgorICAgIGJlZ2luCisgICAgICBmb3IgSSA6PSBOICsgMSB0byBMZW5ndGgoT3RoZXJTZXQuRkJpdHMpIC0gMSBkbworICAgICAgYmVnaW4KKyAgICAgICAgaWYgKE90aGVyU2V0LkZCaXRzW0ldIDw+IDApIHRoZW4KKyAgICAgICAgICBFeGl0OworICAgICAgZW5kOworICAgIGVuZDsKKworICBSZXN1bHQgOj0gVHJ1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEJpdFNldC5HZXRJc05pbDogQm9vbGVhbjsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgZm9yIEkgOj0gTGVuZ3RoKEZCaXRzKSAtIDEgZG93bnRvIDAgZG8KKyAgICBpZiAoRkJpdHNbSV0gPD4gMCkgdGhlbgorICAgIGJlZ2luCisgICAgICBSZXN1bHQgOj0gRmFsc2U7CisgICAgICBFeGl0OworICAgIGVuZDsKKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQml0U2V0Lkdyb3dUb0luY2x1ZGUoY29uc3QgQml0OiBJbnRlZ2VyKTsKK3ZhcgorICBOZXdTaXplOiBJbnRlZ2VyOworYmVnaW4KKyAgTmV3U2l6ZSA6PSBNYXgoTGVuZ3RoKEZCaXRzKSBzaGwgMSxOdW1Xb3Jkc1RvSG9sZChCaXQpKTsKKyAgU2V0TGVuZ3RoKEZCaXRzLE5ld1NpemUpOworZW5kOworCitmdW5jdGlvbiBUQml0U2V0Lkxlbmd0aEluTG9uZ1dvcmRzOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IExlbmd0aChGQml0cyk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaXRTZXQuTWVtYmVyKGNvbnN0IEVsOiBJbnRlZ2VyKTogQm9vbGVhbjsKK3ZhcgorICBOOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEVsIDwgMCkgdGhlbgorICAgIFJlc3VsdCA6PSBGYWxzZQorICBlbHNlCisgIGJlZ2luCisgICAgTiA6PSBXb3JkTnVtYmVyKEVsKTsKKyAgICBpZiAoTiA+PSBMZW5ndGgoRkJpdHMpKSB0aGVuCisgICAgICBSZXN1bHQgOj0gRmFsc2UKKyAgICBlbHNlCisgICAgICBSZXN1bHQgOj0gKChGQml0c1tOXSBhbmQgQml0TWFzayhFbCkpIDw+IDApOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaXRTZXQuTnVtQml0czogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBMZW5ndGgoRkJpdHMpIHNobCBMT0dfQklUUzsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEJpdFNldC5OdW1Xb3Jkc1RvSG9sZChjb25zdCBFbDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gKEVsIHNociBMT0dfQklUUykgKyAxOworZW5kOworCitwcm9jZWR1cmUgVEJpdFNldC5PckluUGxhY2UoY29uc3QgQTogSUJpdFNldCk7Cit2YXIKKyAgSSwgTTogSW50ZWdlcjsKKyAgQUJpdHM6IFRVSW50NjRBcnJheTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEEpIHRoZW4KKyAgYmVnaW4KKyAgICAvLyBJZiB0aGlzIGlzIHNtYWxsZXIgdGhhbiBhLCBncm93IHRoaXMgZmlyc3QKKyAgICBpZiAoQS5MZW5ndGhJbkxvbmdXb3JkcyA+IExlbmd0aChGQml0cykpIHRoZW4KKyAgICAgIFNldExlbmd0aChGQml0cyxBLkxlbmd0aEluTG9uZ1dvcmRzKTsKKyAgICBNIDo9IE1pbihMZW5ndGgoRkJpdHMpLCBBLkxlbmd0aEluTG9uZ1dvcmRzKTsKKyAgICBBQml0cyA6PSBBLlRvUGFja2VkQXJyYXk7CisgICAgZm9yIEkgOj0gTSAtIDEgZG93bnRvIDAgZG8KKyAgICAgIEZCaXRzW0ldIDo9IEZCaXRzW0ldIG9yIEFCaXRzW0ldOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQml0U2V0LlJlbW92ZShjb25zdCBFbDogSW50ZWdlcik7Cit2YXIKKyAgTjogSW50ZWdlcjsKK2JlZ2luCisgIE4gOj0gV29yZE51bWJlcihFbCk7CisgIGlmIChOIDwgTGVuZ3RoKEZCaXRzKSkgdGhlbgorICAgIEZCaXRzW05dIDo9IChGQml0c1tOXSBhbmQgbm90IEJpdE1hc2soRWwpKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpdFNldC5TaXplOiBJbnRlZ2VyOwordmFyCisgIEksIEJpdDogSW50ZWdlcjsKKyAgVzogVUludDY0OworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CisgIGZvciBJIDo9IExlbmd0aChGQml0cykgLSAxIGRvd250byAwIGRvCisgIGJlZ2luCisgICAgVyA6PSBGQml0c1tJXTsKKyAgICBpZiAoVyA8PiAwKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIGZvciBCaXQgOj0gQklUUyAtIDEgZG93bnRvIDAgZG8KKyAgICAgIGJlZ2luCisgICAgICAgIGlmICgoVyBhbmQgKFVJbnQ2NCgxKSBzaGwgQml0KSkgPD4gMCkgdGhlbgorICAgICAgICAgIEluYyhSZXN1bHQpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQml0U2V0LlRvQXJyYXk6IFRJbnRlZ2VyQXJyYXk7Cit2YXIKKyAgSSwgRW46IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoUmVzdWx0LFNpemUpOworICBFbiA6PSAwOworICBmb3IgSSA6PSAwIHRvIChMZW5ndGgoRkJpdHMpIHNobCBMT0dfQklUUykgLSAxIGRvCisgIGJlZ2luCisgICAgaWYgTWVtYmVyKEkpIHRoZW4KKyAgICBiZWdpbgorICAgICAgUmVzdWx0W0VuXSA6PSBJOworICAgICAgSW5jKEVuKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJpdFNldC5Ub1BhY2tlZEFycmF5OiBUVUludDY0QXJyYXk7CitiZWdpbgorICBSZXN1bHQgOj0gRkJpdHM7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaXRTZXQuVG9TdHJpbmc6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBUb1N0cmluZyhuaWwpOworZW5kOworCitmdW5jdGlvbiBUQml0U2V0LlRvU3RyaW5nKGNvbnN0IFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheSk6IFN0cmluZzsKK3ZhcgorICBCdWY6IFRTdHJpbmdCdWlsZGVyOworICBJOiBJbnRlZ2VyOworICBIYXZlUHJpbnRlZEFuRWxlbWVudDogQm9vbGVhbjsKK2JlZ2luCisgIEhhdmVQcmludGVkQW5FbGVtZW50IDo9IEZhbHNlOworICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBCdWYuQXBwZW5kKCd7Jyk7CisgICAgZm9yIEkgOj0gMCB0byAoTGVuZ3RoKEZCaXRzKSBzaGwgTE9HX0JJVFMpIC0gMSBkbworICAgIGJlZ2luCisgICAgICBpZiBNZW1iZXIoSSkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgaWYgKEkgPiAwKSBhbmQgSGF2ZVByaW50ZWRBbkVsZW1lbnQgdGhlbgorICAgICAgICAgIEJ1Zi5BcHBlbmQoJywnKTsKKyAgICAgICAgaWYgQXNzaWduZWQoVG9rZW5OYW1lcykgdGhlbgorICAgICAgICAgIEJ1Zi5BcHBlbmQoVG9rZW5OYW1lc1tJXSkKKyAgICAgICAgZWxzZQorICAgICAgICAgIEJ1Zi5BcHBlbmQoSSk7CisgICAgICAgIEhhdmVQcmludGVkQW5FbGVtZW50IDo9IFRydWU7CisgICAgICBlbmQ7CisgICAgZW5kOworICAgIEJ1Zi5BcHBlbmQoJ30nKTsKKyAgICBSZXN1bHQgOj0gQnVmLlRvU3RyaW5nOworICBmaW5hbGx5CisgICAgQnVmLkZyZWU7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEJpdFNldC5Xb3JkTnVtYmVyKGNvbnN0IEJpdDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gQml0IHNociBMT0dfQklUUzsgLy8gQml0IC8gQklUUworZW5kOworCit7IFRSZWNvZ25pemVyU2hhcmVkU3RhdGUgfQorCitjb25zdHJ1Y3RvciBUUmVjb2duaXplclNoYXJlZFN0YXRlLkNyZWF0ZTsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBTZXRMZW5ndGgoRkZvbGxvd2luZyxUQmFzZVJlY29nbml6ZXIuSU5JVElBTF9GT0xMT1dfU1RBQ0tfU0laRSk7CisgIGZvciBJIDo9IDAgdG8gVEJhc2VSZWNvZ25pemVyLklOSVRJQUxfRk9MTE9XX1NUQUNLX1NJWkUgLSAxIGRvCisgICAgRkZvbGxvd2luZ1tJXSA6PSBUQml0U2V0LkNyZWF0ZTsKKyAgRkZvbGxvd2luZ1N0YWNrUG9pbnRlciA6PSAtMTsKKyAgRkxhc3RFcnJvckluZGV4IDo9IC0xOworICBGVG9rZW5TdGFydENoYXJJbmRleCA6PSAtMTsKK2VuZDsKKworZnVuY3Rpb24gVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5HZXRCYWNrdHJhY2tpbmc6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkJhY2t0cmFja2luZzsKK2VuZDsKKworZnVuY3Rpb24gVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5HZXRDaGFubmVsOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDaGFubmVsOworZW5kOworCitmdW5jdGlvbiBUUmVjb2duaXplclNoYXJlZFN0YXRlLkdldEVycm9yUmVjb3Zlcnk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkVycm9yUmVjb3Zlcnk7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0RmFpbGVkOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZGYWlsZWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0Rm9sbG93aW5nOiBUQml0U2V0QXJyYXk7CitiZWdpbgorICBSZXN1bHQgOj0gRkZvbGxvd2luZzsKK2VuZDsKKworZnVuY3Rpb24gVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5HZXRGb2xsb3dpbmdTdGFja1BvaW50ZXI6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkZvbGxvd2luZ1N0YWNrUG9pbnRlcjsKK2VuZDsKKworZnVuY3Rpb24gVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5HZXRMYXN0RXJyb3JJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGFzdEVycm9ySW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0UnVsZU1lbW86IFREaWN0aW9uYXJ5QXJyYXk8SW50ZWdlciwgSW50ZWdlcj47CitiZWdpbgorICBSZXN1bHQgOj0gRlJ1bGVNZW1vOworZW5kOworCitmdW5jdGlvbiBUUmVjb2duaXplclNoYXJlZFN0YXRlLkdldFJ1bGVNZW1vQ291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gTGVuZ3RoKEZSdWxlTWVtbyk7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0U3ludGF4RXJyb3JzOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTeW50YXhFcnJvcnM7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0VGV4dDogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUZXh0OworZW5kOworCitmdW5jdGlvbiBUUmVjb2duaXplclNoYXJlZFN0YXRlLkdldFRva2VuOiBJVG9rZW47CitiZWdpbgorICBSZXN1bHQgOj0gRlRva2VuOworZW5kOworCitmdW5jdGlvbiBUUmVjb2duaXplclNoYXJlZFN0YXRlLkdldFRva2VuU3RhcnRDaGFySW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlRva2VuU3RhcnRDaGFySW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0VG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKK2VuZDsKKworZnVuY3Rpb24gVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5HZXRUb2tlblN0YXJ0TGluZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVG9rZW5TdGFydExpbmU7CitlbmQ7CisKK2Z1bmN0aW9uIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlblR5cGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUUmVjb2duaXplclNoYXJlZFN0YXRlLlNldEJhY2t0cmFja2luZyhjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQmFja3RyYWNraW5nIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRDaGFubmVsKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDaGFubmVsIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRFcnJvclJlY292ZXJ5KGNvbnN0IFZhbHVlOiBCb29sZWFuKTsKK2JlZ2luCisgIEZFcnJvclJlY292ZXJ5IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRGYWlsZWQoY29uc3QgVmFsdWU6IEJvb2xlYW4pOworYmVnaW4KKyAgRkZhaWxlZCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuU2V0Rm9sbG93aW5nKGNvbnN0IFZhbHVlOiBUQml0U2V0QXJyYXkpOworYmVnaW4KKyAgRkZvbGxvd2luZyA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuU2V0Rm9sbG93aW5nU3RhY2tQb2ludGVyKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZGb2xsb3dpbmdTdGFja1BvaW50ZXIgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUUmVjb2duaXplclNoYXJlZFN0YXRlLlNldExhc3RFcnJvckluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMYXN0RXJyb3JJbmRleCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuU2V0UnVsZU1lbW9Db3VudChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBTZXRMZW5ndGgoRlJ1bGVNZW1vLCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUUmVjb2duaXplclNoYXJlZFN0YXRlLlNldFN5bnRheEVycm9ycyhjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGU3ludGF4RXJyb3JzIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRUZXh0KGNvbnN0IFZhbHVlOiBTdHJpbmcpOworYmVnaW4KKyAgRlRleHQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUUmVjb2duaXplclNoYXJlZFN0YXRlLlNldFRva2VuKGNvbnN0IFZhbHVlOiBJVG9rZW4pOworYmVnaW4KKyAgRlRva2VuIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRUb2tlblN0YXJ0Q2hhckluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZUb2tlblN0YXJ0Q2hhckluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRUb2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lKAorICBjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGVG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRSZWNvZ25pemVyU2hhcmVkU3RhdGUuU2V0VG9rZW5TdGFydExpbmUoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlRva2VuU3RhcnRMaW5lIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5TZXRUb2tlblR5cGUoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlRva2VuVHlwZSA6PSBWYWx1ZTsKK2VuZDsKKworeyBUQ29tbW9uVG9rZW4gfQorCitjb25zdHJ1Y3RvciBUQ29tbW9uVG9rZW4uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBGQ2hhbm5lbCA6PSBUVG9rZW4uREVGQVVMVF9DSEFOTkVMOworICBGQ2hhclBvc2l0aW9uSW5MaW5lIDo9IC0xOworICBGSW5kZXggOj0gLTE7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25Ub2tlbi5DcmVhdGUoY29uc3QgQVRva2VuVHlwZTogSW50ZWdlcik7CitiZWdpbgorICBDcmVhdGU7CisgIEZUb2tlblR5cGUgOj0gQVRva2VuVHlwZTsKK2VuZDsKKworY29uc3RydWN0b3IgVENvbW1vblRva2VuLkNyZWF0ZShjb25zdCBBSW5wdXQ6IElDaGFyU3RyZWFtOyBjb25zdCBBVG9rZW5UeXBlLAorICBBQ2hhbm5lbCwgQVN0YXJ0LCBBU3RvcDogSW50ZWdlcik7CitiZWdpbgorICBDcmVhdGU7CisgIEZJbnB1dCA6PSBBSW5wdXQ7CisgIEZUb2tlblR5cGUgOj0gQVRva2VuVHlwZTsKKyAgRkNoYW5uZWwgOj0gQUNoYW5uZWw7CisgIEZTdGFydCA6PSBBU3RhcnQ7CisgIEZTdG9wIDo9IEFTdG9wOworZW5kOworCitjb25zdHJ1Y3RvciBUQ29tbW9uVG9rZW4uQ3JlYXRlKGNvbnN0IEFUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IEFUZXh0OiBTdHJpbmcpOworYmVnaW4KKyAgQ3JlYXRlOworICBGVG9rZW5UeXBlIDo9IEFUb2tlblR5cGU7CisgIEZDaGFubmVsIDo9IFRUb2tlbi5ERUZBVUxUX0NIQU5ORUw7CisgIEZUZXh0IDo9IEFUZXh0OworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW4uR2V0Q2hhbm5lbDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ2hhbm5lbDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuLkdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ2hhclBvc2l0aW9uSW5MaW5lOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW4uR2V0SW5wdXRTdHJlYW06IElDaGFyU3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuLkdldExpbmU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpbmU7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlbi5HZXRTdGFydEluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdGFydDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuLkdldFN0b3BJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RvcDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuLkdldFRleHQ6IFN0cmluZzsKK2JlZ2luCisgIGlmIChGVGV4dCA8PiAnJykgdGhlbgorICAgIFJlc3VsdCA6PSBGVGV4dAorICBlbHNlCisgICAgaWYgKEZJbnB1dCA9IG5pbCkgdGhlbgorICAgICAgUmVzdWx0IDo9ICcnCisgICAgZWxzZQorICAgICAgUmVzdWx0IDo9IEZJbnB1dC5TdWJzdHJpbmcoRlN0YXJ0LCBGU3RvcCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlbi5HZXRUb2tlbkluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbmRleDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuLkdldFRva2VuVHlwZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVG9rZW5UeXBlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuLlNldENoYW5uZWwoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkNoYW5uZWwgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVG9rZW4uU2V0Q2hhclBvc2l0aW9uSW5MaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVG9rZW4uU2V0SW5wdXRTdHJlYW0oY29uc3QgVmFsdWU6IElDaGFyU3RyZWFtKTsKK2JlZ2luCisgIEZJbnB1dCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlbi5TZXRMaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaW5lIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuLlNldFN0YXJ0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlN0YXJ0IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuLlNldFN0b3BJbmRleChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGU3RvcCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlbi5TZXRUZXh0KGNvbnN0IFZhbHVlOiBTdHJpbmcpOworYmVnaW4KKyAgKCogT3ZlcnJpZGUgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4uICBUaGUgcHJvcGVydHkgZ2V0dGVyCisgICAqIHdpbGwgcmV0dXJuIHRoaXMgdGV4dCByYXRoZXIgdGhhbiBwdWxsaW5nIGZyb20gdGhlIGJ1ZmZlci4KKyAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHN0YXJ0L3N0b3AgaW5kZXhlcyBhcmUKKyAgICogbm90IHZhbGlkLiAgSXQgbWVhbnMgdGhhdCB0aGUgaW5wdXQgd2FzIGNvbnZlcnRlZCB0byBhIG5ldworICAgKiBzdHJpbmcgaW4gdGhlIHRva2VuIG9iamVjdC4KKyAgICopCisgIEZUZXh0IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuLlNldFRva2VuSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuLlNldFRva2VuVHlwZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGVG9rZW5UeXBlIDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW4uVG9TdHJpbmc6IFN0cmluZzsKK3ZhcgorICBDaGFubmVsU3RyLCBUeHQ6IFN0cmluZzsKK2JlZ2luCisgIGlmIChGQ2hhbm5lbCA+IDApIHRoZW4KKyAgICBDaGFubmVsU3RyIDo9ICcsY2hhbm5lbD0nICsgSW50VG9TdHIoRkNoYW5uZWwpCisgIGVsc2UKKyAgICBDaGFubmVsU3RyIDo9ICcnOworCisgIFR4dCA6PSBHZXRUZXh0OworICBpZiAoVHh0IDw+ICcnKSB0aGVuCisgIGJlZ2luCisgICAgVHh0IDo9IFJlcGxhY2VTdHIoVHh0LCMxMCwnXG4nKTsKKyAgICBUeHQgOj0gUmVwbGFjZVN0cihUeHQsIzEzLCdccicpOworICAgIFR4dCA6PSBSZXBsYWNlU3RyKFR4dCwjOSwnXHQnKTsKKyAgZW5kIGVsc2UKKyAgICBUeHQgOj0gJzxubyB0ZXh0Pic7CisKKyAgUmVzdWx0IDo9IEZvcm1hdCgnW0AlZCwlZDolZD0nJyVzJycsPCVkPiVzLCVkOiVkXScsCisgICAgW0ZJbmRleCxGU3RhcnQsRlN0b3AsVHh0LEZUb2tlblR5cGUsQ2hhbm5lbFN0cixGTGluZSxGQ2hhclBvc2l0aW9uSW5MaW5lXSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25Ub2tlbi5DcmVhdGUoY29uc3QgQU9sZFRva2VuOiBJVG9rZW4pOwordmFyCisgIE9sZENvbW1vblRva2VuOiBJQ29tbW9uVG9rZW47CitiZWdpbgorICBDcmVhdGU7CisgIEZUZXh0IDo9IEFPbGRUb2tlbi5UZXh0OworICBGVG9rZW5UeXBlIDo9IEFPbGRUb2tlbi5Ub2tlblR5cGU7CisgIEZMaW5lIDo9IEFPbGRUb2tlbi5MaW5lOworICBGSW5kZXggOj0gQU9sZFRva2VuLlRva2VuSW5kZXg7CisgIEZDaGFyUG9zaXRpb25JbkxpbmUgOj0gQU9sZFRva2VuLkNoYXJQb3NpdGlvbkluTGluZTsKKyAgRkNoYW5uZWwgOj0gQU9sZFRva2VuLkNoYW5uZWw7CisgIGlmIFN1cHBvcnRzKEFPbGRUb2tlbiwgSUNvbW1vblRva2VuLCBPbGRDb21tb25Ub2tlbikgdGhlbgorICBiZWdpbgorICAgIEZTdGFydCA6PSBPbGRDb21tb25Ub2tlbi5TdGFydEluZGV4OworICAgIEZTdG9wIDo9IE9sZENvbW1vblRva2VuLlN0b3BJbmRleDsKKyAgZW5kOworZW5kOworCit7IFRDbGFzc2ljVG9rZW4gfQorCitjb25zdHJ1Y3RvciBUQ2xhc3NpY1Rva2VuLkNyZWF0ZShjb25zdCBBT2xkVG9rZW46IElUb2tlbik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVGV4dCA6PSBBT2xkVG9rZW4uVGV4dDsKKyAgRlRva2VuVHlwZSA6PSBBT2xkVG9rZW4uVG9rZW5UeXBlOworICBGTGluZSA6PSBBT2xkVG9rZW4uTGluZTsKKyAgRkNoYXJQb3NpdGlvbkluTGluZSA6PSBBT2xkVG9rZW4uQ2hhclBvc2l0aW9uSW5MaW5lOworICBGQ2hhbm5lbCA6PSBBT2xkVG9rZW4uQ2hhbm5lbDsKK2VuZDsKKworY29uc3RydWN0b3IgVENsYXNzaWNUb2tlbi5DcmVhdGUoY29uc3QgQVRva2VuVHlwZTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVG9rZW5UeXBlIDo9IEFUb2tlblR5cGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDbGFzc2ljVG9rZW4uQ3JlYXRlKGNvbnN0IEFUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IEFUZXh0OiBTdHJpbmc7CisgIGNvbnN0IEFDaGFubmVsOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUb2tlblR5cGUgOj0gQVRva2VuVHlwZTsKKyAgRlRleHQgOj0gQVRleHQ7CisgIEZDaGFubmVsIDo9IEFDaGFubmVsOworZW5kOworCitjb25zdHJ1Y3RvciBUQ2xhc3NpY1Rva2VuLkNyZWF0ZShjb25zdCBBVG9rZW5UeXBlOiBJbnRlZ2VyOworICBjb25zdCBBVGV4dDogU3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUb2tlblR5cGUgOj0gQVRva2VuVHlwZTsKKyAgRlRleHQgOj0gQVRleHQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDbGFzc2ljVG9rZW4uR2V0Q2hhbm5lbDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ2hhbm5lbDsKK2VuZDsKKworZnVuY3Rpb24gVENsYXNzaWNUb2tlbi5HZXRDaGFyUG9zaXRpb25JbkxpbmU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkNoYXJQb3NpdGlvbkluTGluZTsKK2VuZDsKKworZnVuY3Rpb24gVENsYXNzaWNUb2tlbi5HZXRJbnB1dFN0cmVhbTogSUNoYXJTdHJlYW07CitiZWdpbgorICAvLyBObyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRDbGFzc2ljVG9rZW4uR2V0TGluZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGluZTsKK2VuZDsKKworZnVuY3Rpb24gVENsYXNzaWNUb2tlbi5HZXRUZXh0OiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gRlRleHQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDbGFzc2ljVG9rZW4uR2V0VG9rZW5JbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRDbGFzc2ljVG9rZW4uR2V0VG9rZW5UeXBlOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlblR5cGU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2xhc3NpY1Rva2VuLlNldENoYW5uZWwoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkNoYW5uZWwgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2xhc3NpY1Rva2VuLlNldENoYXJQb3NpdGlvbkluTGluZShjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ2hhclBvc2l0aW9uSW5MaW5lIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENsYXNzaWNUb2tlbi5TZXRJbnB1dFN0cmVhbShjb25zdCBWYWx1ZTogSUNoYXJTdHJlYW0pOworYmVnaW4KKyAgLy8gTm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorZW5kOworCitwcm9jZWR1cmUgVENsYXNzaWNUb2tlbi5TZXRMaW5lKGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaW5lIDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENsYXNzaWNUb2tlbi5TZXRUZXh0KGNvbnN0IFZhbHVlOiBTdHJpbmcpOworYmVnaW4KKyAgRlRleHQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ2xhc3NpY1Rva2VuLlNldFRva2VuSW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkluZGV4IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVENsYXNzaWNUb2tlbi5TZXRUb2tlblR5cGUoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlRva2VuVHlwZSA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVENsYXNzaWNUb2tlbi5Ub1N0cmluZzogU3RyaW5nOwordmFyCisgIENoYW5uZWxTdHIsIFR4dDogU3RyaW5nOworYmVnaW4KKyAgaWYgKEZDaGFubmVsID4gMCkgdGhlbgorICAgIENoYW5uZWxTdHIgOj0gJyxjaGFubmVsPScgKyBJbnRUb1N0cihGQ2hhbm5lbCkKKyAgZWxzZQorICAgIENoYW5uZWxTdHIgOj0gJyc7CisgIFR4dCA6PSBGVGV4dDsKKyAgaWYgKFR4dCA8PiAnJykgdGhlbgorICBiZWdpbgorICAgIFR4dCA6PSBSZXBsYWNlU3RyKFR4dCwjMTAsJ1xuJyk7CisgICAgVHh0IDo9IFJlcGxhY2VTdHIoVHh0LCMxMywnXHInKTsKKyAgICBUeHQgOj0gUmVwbGFjZVN0cihUeHQsIzksJ1x0Jyk7CisgIGVuZCBlbHNlCisgICAgVHh0IDo9ICc8bm8gdGV4dD4nOworCisgIFJlc3VsdCA6PSBGb3JtYXQoJ1tAJWQsJyclcycnLDwlZD4lcywlZDolZF0nLAorICAgIFtGSW5kZXgsVHh0LEZUb2tlblR5cGUsQ2hhbm5lbFN0cixGTGluZSxGQ2hhclBvc2l0aW9uSW5MaW5lXSk7CitlbmQ7CisKK3sgVFRva2VuIH0KKworY2xhc3MgcHJvY2VkdXJlIFRUb2tlbi5Jbml0aWFsaXplOworYmVnaW4KKyAgRU9GX1RPS0VOIDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoRU9GKTsKKyAgSU5WQUxJRF9UT0tFTiA6PSBUQ29tbW9uVG9rZW4uQ3JlYXRlKElOVkFMSURfVE9LRU5fVFlQRSk7CisgIFNLSVBfVE9LRU4gOj0gVENvbW1vblRva2VuLkNyZWF0ZShJTlZBTElEX1RPS0VOX1RZUEUpOworZW5kOworCit7IFRCYXNlUmVjb2duaXplciB9CisKK2NvbnN0cnVjdG9yIFRCYXNlUmVjb2duaXplci5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIEZTdGF0ZSA6PSBUUmVjb2duaXplclNoYXJlZFN0YXRlLkNyZWF0ZTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLkFscmVhZHlQYXJzZWRSdWxlKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOwordmFyCisgIFN0b3BJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFN0b3BJbmRleCA6PSBHZXRSdWxlTWVtb2l6YXRpb24oUnVsZUluZGV4LCBJbnB1dC5JbmRleCk7CisgIFJlc3VsdCA6PSAoU3RvcEluZGV4IDw+IE1FTU9fUlVMRV9VTktOT1dOKTsKKyAgaWYgUmVzdWx0IHRoZW4KKyAgYmVnaW4KKyAgICBpZiAoU3RvcEluZGV4ID0gTUVNT19SVUxFX0ZBSUxFRCkgdGhlbgorICAgICAgRlN0YXRlLkZhaWxlZCA6PSBUcnVlCisgICAgZWxzZQorICAgICAgSW5wdXQuU2VlayhTdG9wSW5kZXggKyAxKTsgIC8vIGp1bXAgdG8gb25lIHBhc3Qgc3RvcCB0b2tlbgorICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVJlY29nbml6ZXIuQmVnaW5CYWNrdHJhY2soY29uc3QgTGV2ZWw6IEludGVnZXIpOworYmVnaW4KKyAgLy8gTm8gZGVmZWF1bHQgaW1wbGVtZW50YXRpb24KK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlUmVjb2duaXplci5CZWdpblJlc3luYzsKK2JlZ2luCisgIC8vIE5vIGRlZmVhdWx0IGltcGxlbWVudGF0aW9uCitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVJlY29nbml6ZXIuQ29uc3VtZVVudGlsKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBUb2tlblR5cGU6IEludGVnZXIpOwordmFyCisgIFRUeXBlOiBJbnRlZ2VyOworYmVnaW4KKyAgVFR5cGUgOj0gSW5wdXQuTEEoMSk7CisgIHdoaWxlIChUVHlwZSA8PiBUVG9rZW4uRU9GKSBhbmQgKFRUeXBlIDw+IFRva2VuVHlwZSkgZG8KKyAgYmVnaW4KKyAgICBJbnB1dC5Db25zdW1lOworICAgIFRUeXBlIDo9IElucHV0LkxBKDEpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5Db21iaW5lRm9sbG93cyhjb25zdCBFeGFjdDogQm9vbGVhbik6IElCaXRTZXQ7Cit2YXIKKyAgSSwgVG9wOiBJbnRlZ2VyOworICBMb2NhbEZvbGxvd1NldDogSUJpdFNldDsKK2JlZ2luCisgIFRvcCA6PSBGU3RhdGUuRm9sbG93aW5nU3RhY2tQb2ludGVyOworICBSZXN1bHQgOj0gVEJpdFNldC5DcmVhdGU7CisgIGZvciBJIDo9IFRvcCBkb3dudG8gMCBkbworICBiZWdpbgorICAgIExvY2FsRm9sbG93U2V0IDo9IEZTdGF0ZS5Gb2xsb3dpbmdbSV07CisgICAgUmVzdWx0Lk9ySW5QbGFjZShMb2NhbEZvbGxvd1NldCk7CisgICAgaWYgKEV4YWN0KSB0aGVuCisgICAgYmVnaW4KKyAgICAgIC8vIGNhbiB3ZSBzZWUgZW5kIG9mIHJ1bGU/CisgICAgICBpZiBMb2NhbEZvbGxvd1NldC5NZW1iZXIoVFRva2VuLkVPUl9UT0tFTl9UWVBFKSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICAvLyBPbmx5IGxlYXZlIEVPUiBpbiBzZXQgaWYgYXQgdG9wIChzdGFydCBydWxlKTsgdGhpcyBsZXRzCisgICAgICAgIC8vIHVzIGtub3cgaWYgaGF2ZSB0byBpbmNsdWRlIGZvbGxvdyhzdGFydCBydWxlKTsgaS5lLiwgRU9GCisgICAgICAgIGlmIChJID4gMCkgdGhlbgorICAgICAgICAgIFJlc3VsdC5SZW1vdmUoVFRva2VuLkVPUl9UT0tFTl9UWVBFKTsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyBjYW4ndCBzZWUgZW5kIG9mIHJ1bGUsIHF1aXQKKyAgICAgICAgQnJlYWs7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5Db21wdXRlQ29udGV4dFNlbnNpdGl2ZVJ1bGVGT0xMT1c6IElCaXRTZXQ7CitiZWdpbgorICBSZXN1bHQgOj0gQ29tYmluZUZvbGxvd3MoVHJ1ZSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5Db21wdXRlRXJyb3JSZWNvdmVyeVNldDogSUJpdFNldDsKK2JlZ2luCisgIFJlc3VsdCA6PSBDb21iaW5lRm9sbG93cyhGYWxzZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVJlY29nbml6ZXIuQ29uc3VtZVVudGlsKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBCaXRTZXQ6IElCaXRTZXQpOwordmFyCisgIFRUeXBlOiBJbnRlZ2VyOworYmVnaW4KKyAgVFR5cGUgOj0gSW5wdXQuTEEoMSk7CisgIHdoaWxlIChUVHlwZSA8PiBUVG9rZW4uRU9GKSBhbmQgKG5vdCBCaXRTZXQuTWVtYmVyKFRUeXBlKSkgZG8KKyAgYmVnaW4KKyAgICBJbnB1dC5Db25zdW1lOworICAgIFRUeXBlIDo9IElucHV0LkxBKDEpOworICBlbmQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlUmVjb2duaXplci5DcmVhdGUoY29uc3QgQVN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlKTsKK2JlZ2luCisgIGlmIChBU3RhdGUgPSBuaWwpIHRoZW4KKyAgICBDcmVhdGUKKyAgZWxzZQorICBiZWdpbgorICAgIGluaGVyaXRlZCBDcmVhdGU7CisgICAgRlN0YXRlIDo9IEFTdGF0ZTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VSZWNvZ25pemVyLkRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKAorICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXk7IGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik7Cit2YXIKKyAgSGRyLCBNc2c6IFN0cmluZzsKK2JlZ2luCisgIEhkciA6PSBHZXRFcnJvckhlYWRlcihFKTsKKyAgTXNnIDo9IEdldEVycm9yTWVzc2FnZShFLCBUb2tlbk5hbWVzKTsKKyAgRW1pdEVycm9yTWVzc2FnZShIZHIgKyAnICcgKyBNc2cpOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VSZWNvZ25pemVyLkVtaXRFcnJvck1lc3NhZ2UoY29uc3QgTXNnOiBTdHJpbmcpOworYmVnaW4KKyAgV3JpdGVMbihNc2cpOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VSZWNvZ25pemVyLkVuZEJhY2t0cmFjayhjb25zdCBMZXZlbDogSW50ZWdlcjsKKyAgY29uc3QgU3VjY2Vzc2Z1bDogQm9vbGVhbik7CitiZWdpbgorICAvLyBObyBkZWZlYXVsdCBpbXBsZW1lbnRhdGlvbgorZW5kOworCitwcm9jZWR1cmUgVEJhc2VSZWNvZ25pemVyLkVuZFJlc3luYzsKK2JlZ2luCisgIC8vIE5vIGRlZmVhdWx0IGltcGxlbWVudGF0aW9uCitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5HZXRCYWNrdHJhY2tpbmdMZXZlbDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RhdGUuQmFja3RyYWNraW5nOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuR2V0Q3VycmVudElucHV0U3ltYm9sKAorICBjb25zdCBJbnB1dDogSUludFN0cmVhbSk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIC8vIE5vIGRlZmVhdWx0IGltcGxlbWVudGF0aW9uCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5HZXRFcnJvckhlYWRlcihjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJ2xpbmUgJyArIEludFRvU3RyKEUuTGluZSkgKyAnOicgKyBJbnRUb1N0cihFLkNoYXJQb3NpdGlvbkluTGluZSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5HZXRFcnJvck1lc3NhZ2UoY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOworICBjb25zdCBUb2tlbk5hbWVzOiBUU3RyaW5nQXJyYXkpOiBTdHJpbmc7Cit2YXIKKyAgVVRFOiBFVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiBhYnNvbHV0ZSBFOworICBNVEU6IEVNaXNzaW5nVG9rZW5FeGNlcHRpb24gYWJzb2x1dGUgRTsKKyAgTU1URTogRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBhYnNvbHV0ZSBFOworICBNVE5FOiBFTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIGFic29sdXRlIEU7CisgIE5WQUU6IEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBhYnNvbHV0ZSBFOworICBFRUU6IEVFYXJseUV4aXRFeGNlcHRpb24gYWJzb2x1dGUgRTsKKyAgTVNFOiBFTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBhYnNvbHV0ZSBFOworICBNTlNFOiBFTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiBhYnNvbHV0ZSBFOworICBGUEU6IEVGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gYWJzb2x1dGUgRTsKKyAgVG9rZW5OYW1lOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gRS5NZXNzYWdlOworICBpZiAoRSBpcyBFVW53YW50ZWRUb2tlbkV4Y2VwdGlvbikgdGhlbgorICBiZWdpbgorICAgIGlmIChVVEUuRXhwZWN0aW5nID0gVFRva2VuLkVPRikgdGhlbgorICAgICAgVG9rZW5OYW1lIDo9ICdFT0YnCisgICAgZWxzZQorICAgICAgVG9rZW5OYW1lIDo9IFRva2VuTmFtZXNbVVRFLkV4cGVjdGluZ107CisgICAgUmVzdWx0IDo9ICdleHRyYW5lb3VzIGlucHV0ICcgKyBHZXRUb2tlbkVycm9yRGlzcGxheShVVEUuVW5leHBlY3RlZFRva2VuKQorICAgICAgKyAnIGV4cGVjdGluZyAnICsgVG9rZW5OYW1lOworICBlbmQKKyAgZWxzZQorICAgIGlmIChFIGlzIEVNaXNzaW5nVG9rZW5FeGNlcHRpb24pIHRoZW4KKyAgICBiZWdpbgorICAgICAgaWYgKE1URS5FeHBlY3RpbmcgPSBUVG9rZW4uRU9GKSB0aGVuCisgICAgICAgIFRva2VuTmFtZSA6PSAnRU9GJworICAgICAgZWxzZQorICAgICAgICBUb2tlbk5hbWUgOj0gVG9rZW5OYW1lc1tNVEUuRXhwZWN0aW5nXTsKKyAgICAgIFJlc3VsdCA6PSAnbWlzc2luZyAnICsgVG9rZW5OYW1lICsgJyBhdCAnICsgR2V0VG9rZW5FcnJvckRpc3BsYXkoRS5Ub2tlbik7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgaWYgKEUgaXMgRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbikgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgaWYgKE1NVEUuRXhwZWN0aW5nID0gVFRva2VuLkVPRikgdGhlbgorICAgICAgICAgIFRva2VuTmFtZSA6PSAnRU9GJworICAgICAgICBlbHNlCisgICAgICAgICAgVG9rZW5OYW1lIDo9IFRva2VuTmFtZXNbTU1URS5FeHBlY3RpbmddOworICAgICAgICBSZXN1bHQgOj0gJ21pc21hdGNoZWQgaW5wdXQgJyArIEdldFRva2VuRXJyb3JEaXNwbGF5KEUuVG9rZW4pCisgICAgICAgICAgKyAnIGV4cGVjdGluZyAnICsgVG9rZW5OYW1lOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIGlmIChFIGlzIEVNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24pIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBpZiAoTVRORS5FeHBlY3RpbmcgPSBUVG9rZW4uRU9GKSB0aGVuCisgICAgICAgICAgICBSZXN1bHQgOj0gJ0VPRicKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBSZXN1bHQgOj0gVG9rZW5OYW1lc1tNVE5FLkV4cGVjdGluZ107CisgICAgICAgICAgLy8gVGhlIHRlcm5hcnkgb3BlcmF0b3IgaXMgb25seSBuZWNlc3NhcnkgYmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgLk5FVCBmcmFtZXdvcmsKKyAgICAgICAgICBSZXN1bHQgOj0gJ21pc21hdGNoZWQgdHJlZSBub2RlOiAnOworICAgICAgICAgIGlmIChNVE5FLk5vZGUgPD4gbmlsKSBhbmQgKE1UTkUuTm9kZS5Ub1N0cmluZyA8PiAnJykgdGhlbgorICAgICAgICAgICAgUmVzdWx0IDo9IFJlc3VsdCArIE1UTkUuTm9kZS5Ub1N0cmluZzsKKyAgICAgICAgICBSZXN1bHQgOj0gUmVzdWx0ICsgJyBleHBlY3RpbmcgJyArIFRva2VuTmFtZTsKKyAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZiAoRSBpcyBFTm9WaWFibGVBbHRFeGNlcHRpb24pIHRoZW4KKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICJkZWNpc2lvbj08PCIrbnZhZS5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbisiPj4iCisgICAgICAgICAgICAvLyBhbmQgIihkZWNpc2lvbj0iK252YWUuZGVjaXNpb25OdW1iZXIrIikgYW5kCisgICAgICAgICAgICAvLyAic3RhdGUgIitudmFlLnN0YXRlTnVtYmVyCisgICAgICAgICAgICBSZXN1bHQgOj0gJ25vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBpbnB1dCAnICsgR2V0VG9rZW5FcnJvckRpc3BsYXkoRS5Ub2tlbik7CisgICAgICAgICAgZW5kCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKEUgaXMgRUVhcmx5RXhpdEV4Y2VwdGlvbikgdGhlbgorICAgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICIoZGVjaXNpb249IitlZWUuZGVjaXNpb25OdW1iZXIrIikiCisgICAgICAgICAgICAgIFJlc3VsdCA6PSAncmVxdWlyZWQgKC4uLikrIGxvb3AgZGlkIG5vdCAgbWF0Y2ggYW55dGluZyBhdCBpbnB1dCAnCisgICAgICAgICAgICAgICAgKyBHZXRUb2tlbkVycm9yRGlzcGxheShFLlRva2VuKTsKKyAgICAgICAgICAgIGVuZCBlbHNlCisgICAgICAgICAgICAgIGlmIChFIGlzIEVNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKSB0aGVuCisgICAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgICAgUmVzdWx0IDo9ICdtaXNtYXRjaGVkIGlucHV0ICcgKyBHZXRUb2tlbkVycm9yRGlzcGxheShFLlRva2VuKQorICAgICAgICAgICAgICAgICAgKyAnIGV4cGVjdGluZyBzZXQgJyArIE1TRS5FeHBlY3RpbmcuVG9TdHJpbmc7CisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKEUgaXMgRU1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24pIHRoZW4KKyAgICAgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgICAgUmVzdWx0IDo9ICdtaXNtYXRjaGVkIGlucHV0ICcgKyBHZXRUb2tlbkVycm9yRGlzcGxheShFLlRva2VuKQorICAgICAgICAgICAgICAgICAgICArICcgZXhwZWN0aW5nIHNldCAnICsgTVNFLkV4cGVjdGluZy5Ub1N0cmluZzsKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBpZiAoRSBpcyBFRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKSB0aGVuCisgICAgICAgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgICAgICBSZXN1bHQgOj0gJ3J1bGUgJyArIEZQRS5SdWxlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICsgJyBmYWlsZWQgcHJlZGljYXRlOiB7JyArIEZQRS5QcmVkaWNhdGVUZXh0ICsgJ30/JzsKKyAgICAgICAgICAgICAgICAgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLkdldEdyYW1tYXJGaWxlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgLy8gTm8gZGVmZWF1bHQgaW1wbGVtZW50YXRpb24KKyAgUmVzdWx0IDo9ICcnOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuR2V0TWlzc2luZ1N5bWJvbChjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgY29uc3QgRTogRVJlY29nbml0aW9uRXhjZXB0aW9uOyBjb25zdCBFeHBlY3RlZFRva2VuVHlwZTogSW50ZWdlcjsKKyAgY29uc3QgRm9sbG93OiBJQml0U2V0KTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgLy8gTm8gZGVmZWF1bHQgaW1wbGVtZW50YXRpb24KKyAgUmVzdWx0IDo9IG5pbDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLkdldE51bWJlck9mU3ludGF4RXJyb3JzOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdGF0ZS5TeW50YXhFcnJvcnM7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5HZXRSdWxlTWVtb2l6YXRpb24oY29uc3QgUnVsZUluZGV4LAorICBSdWxlU3RhcnRJbmRleDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgRGljdDogSURpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CitiZWdpbgorICBEaWN0IDo9IEZTdGF0ZS5SdWxlTWVtb1tSdWxlSW5kZXhdOworICBpZiAoRGljdCA9IG5pbCkgdGhlbgorICBiZWdpbgorICAgIERpY3QgOj0gVERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4uQ3JlYXRlOworICAgIEZTdGF0ZS5SdWxlTWVtb1tSdWxlSW5kZXhdIDo9IERpY3Q7CisgIGVuZDsKKyAgaWYgKG5vdCBEaWN0LlRyeUdldFZhbHVlKFJ1bGVTdGFydEluZGV4LCBSZXN1bHQpKSB0aGVuCisgICAgUmVzdWx0IDo9IE1FTU9fUlVMRV9VTktOT1dOOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuR2V0UnVsZU1lbW9pemF0aW9uQ2hhY2VTaXplOiBJbnRlZ2VyOwordmFyCisgIFJ1bGVNYXA6IElEaWN0aW9uYXJ5PEludGVnZXIsIEludGVnZXI+OworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CisgIGlmIEFzc2lnbmVkKEZTdGF0ZS5SdWxlTWVtbykgdGhlbgorICBiZWdpbgorICAgIGZvciBSdWxlTWFwIGluIEZTdGF0ZS5SdWxlTWVtbyBkbworICAgICAgaWYgQXNzaWduZWQoUnVsZU1hcCkgdGhlbgorICAgICAgICBJbmMoUmVzdWx0LFJ1bGVNYXAuQ291bnQpOyAgLy8gaG93IG1hbnkgaW5wdXQgaW5kZXhlcyBhcmUgcmVjb3JkZWQ/CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLkdldFN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdGF0ZTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLkdldFRva2VuRXJyb3JEaXNwbGF5KGNvbnN0IFQ6IElUb2tlbik6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBULlRleHQ7CisgIGlmIChSZXN1bHQgPSAnJykgdGhlbgorICBiZWdpbgorICAgIGlmIChULlRva2VuVHlwZSA9IFRUb2tlbi5FT0YpIHRoZW4KKyAgICAgIFJlc3VsdCA6PSAnPEVPRj4nCisgICAgZWxzZQorICAgICAgUmVzdWx0IDo9ICc8JyArIEludFRvU3RyKFQuVG9rZW5UeXBlKSArICc+JzsKKyAgZW5kOworICBSZXN1bHQgOj0gUmVwbGFjZVN0cihSZXN1bHQsIzEwLCdcbicpOworICBSZXN1bHQgOj0gUmVwbGFjZVN0cihSZXN1bHQsIzEzLCdccicpOworICBSZXN1bHQgOj0gUmVwbGFjZVN0cihSZXN1bHQsIzksJ1x0Jyk7CisgIFJlc3VsdCA6PSAnJycnICsgUmVzdWx0ICsgJycnJzsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLkdldFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheTsKK2JlZ2luCisgIC8vIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgUmVzdWx0IDo9IG5pbDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VSZWNvZ25pemVyLk1hdGNoKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBUb2tlblR5cGU6IEludGVnZXI7IGNvbnN0IEZvbGxvdzogSUJpdFNldCk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRDdXJyZW50SW5wdXRTeW1ib2woSW5wdXQpOworICBpZiAoSW5wdXQuTEEoMSkgPSBUb2tlblR5cGUpIHRoZW4KKyAgYmVnaW4KKyAgICBJbnB1dC5Db25zdW1lOworICAgIEZTdGF0ZS5FcnJvclJlY292ZXJ5IDo9IEZhbHNlOworICAgIEZTdGF0ZS5GYWlsZWQgOj0gRmFsc2U7CisgIGVuZCBlbHNlCisgIGJlZ2luCisgICAgaWYgKEZTdGF0ZS5CYWNrdHJhY2tpbmcgPiAwKSB0aGVuCisgICAgICBGU3RhdGUuRmFpbGVkIDo9IFRydWUKKyAgICBlbHNlCisgICAgYmVnaW4KKyAgICAgIE1pc21hdGNoKElucHV0LCBUb2tlblR5cGUsIEZvbGxvdyk7CisgICAgICBSZXN1bHQgOj0gUmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oSW5wdXQsIFRva2VuVHlwZSwgRm9sbG93KTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlUmVjb2duaXplci5NYXRjaEFueShjb25zdCBJbnB1dDogSUludFN0cmVhbSk7CitiZWdpbgorICBGU3RhdGUuRXJyb3JSZWNvdmVyeSA6PSBGYWxzZTsKKyAgRlN0YXRlLkZhaWxlZCA6PSBGYWxzZTsKKyAgSW5wdXQuQ29uc3VtZTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlUmVjb2duaXplci5NZW1vaXplKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOyBjb25zdCBSdWxlSW5kZXgsCisgIFJ1bGVTdGFydEluZGV4OiBJbnRlZ2VyKTsKK3ZhcgorICBTdG9wVG9rZW5JbmRleDogSW50ZWdlcjsKKyAgRGljdDogSURpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj47CitiZWdpbgorICBEaWN0IDo9IEZTdGF0ZS5SdWxlTWVtb1tSdWxlSW5kZXhdOworICBpZiBBc3NpZ25lZChEaWN0KSB0aGVuCisgIGJlZ2luCisgICAgaWYgRlN0YXRlLkZhaWxlZCB0aGVuCisgICAgICBTdG9wVG9rZW5JbmRleCA6PSBNRU1PX1JVTEVfRkFJTEVECisgICAgZWxzZQorICAgICAgU3RvcFRva2VuSW5kZXggOj0gSW5wdXQuSW5kZXggLSAxOworICAgIERpY3QuQWRkT3JTZXRWYWx1ZShSdWxlU3RhcnRJbmRleCwgU3RvcFRva2VuSW5kZXgpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVJlY29nbml6ZXIuTWlzbWF0Y2goY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07CisgIGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgRm9sbG93OiBJQml0U2V0KTsKK2JlZ2luCisgIGlmIE1pc21hdGNoSXNVbndhbnRlZFRva2VuKElucHV0LCBUb2tlblR5cGUpIHRoZW4KKyAgICByYWlzZSBFVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5DcmVhdGUoVG9rZW5UeXBlLCBJbnB1dCkKKyAgZWxzZQorICAgIGlmIE1pc21hdGNoSXNNaXNzaW5nVG9rZW4oSW5wdXQsIEZvbGxvdykgdGhlbgorICAgICAgcmFpc2UgRU1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5DcmVhdGUoVG9rZW5UeXBlLCBJbnB1dCwgbmlsKQorICAgIGVsc2UKKyAgICAgIHJhaXNlIEVNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uQ3JlYXRlKFRva2VuVHlwZSwgSW5wdXQpOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuTWlzbWF0Y2hJc01pc3NpbmdUb2tlbihjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgY29uc3QgRm9sbG93OiBJQml0U2V0KTogQm9vbGVhbjsKK3ZhcgorICBWaWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSwgRm9sbG93MjogSUJpdFNldDsKK2JlZ2luCisgIGlmIChGb2xsb3cgPSBuaWwpIHRoZW4KKyAgICAvLyB3ZSBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb2xsb3c7IHdlIGNhbiBvbmx5IGNvbnN1bWUKKyAgICAvLyBhIHNpbmdsZSB0b2tlbiBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKKyAgICBSZXN1bHQgOj0gRmFsc2UKKyAgZWxzZQorICBiZWdpbgorICAgIEZvbGxvdzIgOj0gRm9sbG93OworICAgIC8vIGNvbXB1dGUgd2hhdCBjYW4gZm9sbG93IHRoaXMgZ3JhbW1hciBlbGVtZW50IHJlZmVyZW5jZQorICAgIGlmIChGb2xsb3cuTWVtYmVyKFRUb2tlbi5FT1JfVE9LRU5fVFlQRSkpIHRoZW4KKyAgICBiZWdpbgorICAgICAgVmlhYmxlVG9rZW5zRm9sbG93aW5nVGhpc1J1bGUgOj0gQ29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKCk7CisgICAgICBGb2xsb3cyIDo9IEZvbGxvdy5CaXRTZXRPcihWaWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSk7CisgICAgICBpZiAoRlN0YXRlLkZvbGxvd2luZ1N0YWNrUG9pbnRlciA+PSAwKSB0aGVuCisgICAgICAgIC8vIHJlbW92ZSBFT1IgaWYgd2UncmUgbm90IHRoZSBzdGFydCBzeW1ib2wKKyAgICAgICAgRm9sbG93Mi5SZW1vdmUoVFRva2VuLkVPUl9UT0tFTl9UWVBFKTsKKyAgICBlbmQ7CisKKyAgICAvLyBpZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIgc2V0CisgICAgLy8gdGhlbiB3ZSBrbm93IHdlJ3JlIG1pc3NpbmcgYSB0b2tlbjsgZXJyb3IgcmVjb3ZlcnkgaXMgZnJlZSB0bworICAgIC8vICJpbnNlcnQiIHRoZSBtaXNzaW5nIHRva2VuCisKKyAgICAvLyBCaXRTZXQgY2Fubm90IGhhbmRsZSBuZWdhdGl2ZSBudW1iZXJzIGxpa2UgLTEgKEVPRikgc28gSSBsZWF2ZSBFT1IKKyAgICAvLyBpbiBmb2xsb3cgc2V0IHRvIGluZGljYXRlIHRoYXQgdGhlIGZhbGwgb2YgdGhlIHN0YXJ0IHN5bWJvbCBpcworICAgIC8vIGluIHRoZSBzZXQgKEVPRiBjYW4gZm9sbG93KS4KKyAgICBpZiAoRm9sbG93Mi5NZW1iZXIoSW5wdXQuTEEoMSkpIG9yIEZvbGxvdzIuTWVtYmVyKFRUb2tlbi5FT1JfVE9LRU5fVFlQRSkpIHRoZW4KKyAgICAgIFJlc3VsdCA6PSBUcnVlCisgICAgZWxzZQorICAgICAgUmVzdWx0IDo9IEZhbHNlOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlUmVjb2duaXplci5NaXNtYXRjaElzVW53YW50ZWRUb2tlbihjb25zdCBJbnB1dDogSUludFN0cmVhbTsKKyAgY29uc3QgVG9rZW5UeXBlOiBJbnRlZ2VyKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoSW5wdXQuTEEoMikgPSBUb2tlblR5cGUpOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VSZWNvZ25pemVyLlB1c2hGb2xsb3coY29uc3QgRlNldDogSUJpdFNldCk7Cit2YXIKKyAgRjogVEJpdFNldEFycmF5OworICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKChGU3RhdGUuRm9sbG93aW5nU3RhY2tQb2ludGVyICsgMSkgPj0gTGVuZ3RoKEZTdGF0ZS5Gb2xsb3dpbmcpKSB0aGVuCisgIGJlZ2luCisgICAgU2V0TGVuZ3RoKEYsIExlbmd0aChGU3RhdGUuRm9sbG93aW5nKSAqIDIpOworICAgIEZpbGxDaGFyKEZbMF0sIExlbmd0aChGKSAqIFNpemVPZihJQml0U2V0KSwgMCk7CisgICAgZm9yIEkgOj0gMCB0byBMZW5ndGgoRlN0YXRlLkZvbGxvd2luZykgLSAxIGRvCisgICAgICBGW0ldIDo9IEZTdGF0ZS5Gb2xsb3dpbmdbSV07CisgICAgRlN0YXRlLkZvbGxvd2luZyA6PSBGOworICBlbmQ7CisgIEZTdGF0ZS5Gb2xsb3dpbmdTdGFja1BvaW50ZXIgOj0gRlN0YXRlLkZvbGxvd2luZ1N0YWNrUG9pbnRlciArIDE7CisgIEZTdGF0ZS5Gb2xsb3dpbmdbRlN0YXRlLkZvbGxvd2luZ1N0YWNrUG9pbnRlcl0gOj0gRlNldDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlUmVjb2duaXplci5SZWNvdmVyKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBSRTogRVJlY29nbml0aW9uRXhjZXB0aW9uKTsKK3ZhcgorICBGb2xsb3dTZXQ6IElCaXRTZXQ7CitiZWdpbgorICBpZiAoRlN0YXRlLkxhc3RFcnJvckluZGV4ID0gSW5wdXQuSW5kZXgpIHRoZW4KKyAgICAvLyB1aCBvaCwgYW5vdGhlciBlcnJvciBhdCBzYW1lIHRva2VuIGluZGV4OyBtdXN0IGJlIGEgY2FzZQorICAgIC8vIHdoZXJlIExUKDEpIGlzIGluIHRoZSByZWNvdmVyeSB0b2tlbiBzZXQgc28gbm90aGluZyBpcworICAgIC8vIGNvbnN1bWVkOyBjb25zdW1lIGEgc2luZ2xlIHRva2VuIHNvIGF0IGxlYXN0IHRvIHByZXZlbnQKKyAgICAvLyBhbiBpbmZpbml0ZSBsb29wOyB0aGlzIGlzIGEgZmFpbHNhZmUuCisgICAgSW5wdXQuQ29uc3VtZTsKKyAgRlN0YXRlLkxhc3RFcnJvckluZGV4IDo9IElucHV0LkluZGV4OworICBGb2xsb3dTZXQgOj0gQ29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ7CisgIEJlZ2luUmVzeW5jOworICBDb25zdW1lVW50aWwoSW5wdXQsRm9sbG93U2V0KTsKKyAgRW5kUmVzeW5jOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuUmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247IGNvbnN0IEZvbGxvdzogSUJpdFNldCk6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIGlmIE1pc21hdGNoSXNNaXNzaW5nVG9rZW4oSW5wdXQsIEZvbGxvdykgdGhlbgorICBiZWdpbgorICAgIFJlcG9ydEVycm9yKEUpOworICAgIC8vIHdlIGRvbid0IGtub3cgaG93IHRvIGNvbmp1cmUgdXAgYSB0b2tlbiBmb3Igc2V0cyB5ZXQKKyAgICBSZXN1bHQgOj0gR2V0TWlzc2luZ1N5bWJvbChJbnB1dCwgRSwgVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRSwgRm9sbG93KTsKKyAgZW5kCisgIGVsc2UKKyAgYmVnaW4KKyAgICAvLyBUT0RPIGRvIHNpbmdsZSB0b2tlbiBkZWxldGlvbiBsaWtlIGFib3ZlIGZvciBUb2tlbiBtaXNtYXRjaAorICAgIFJlc3VsdCA6PSBuaWw7CisgICAgcmFpc2UgRTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuUmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07CisgIGNvbnN0IFRva2VuVHlwZTogSW50ZWdlcjsgY29uc3QgRm9sbG93OiBJQml0U2V0KTogSUFOVExSSW50ZXJmYWNlOwordmFyCisgIEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIC8vIGlmIG5leHQgdG9rZW4gaXMgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgdGhlbiAiZGVsZXRlIiB0aGlzIHRva2VuCisgIGlmIE1pc21hdGNoSXNVbndhbnRlZFRva2VuKElucHV0LCBUb2tlblR5cGUpIHRoZW4KKyAgYmVnaW4KKyAgICBFIDo9IEVVbndhbnRlZFRva2VuRXhjZXB0aW9uLkNyZWF0ZShUb2tlblR5cGUsIElucHV0KTsKKyAgICBCZWdpblJlc3luYzsKKyAgICBJbnB1dC5Db25zdW1lOyAvLyBzaW1wbHkgZGVsZXRlIGV4dHJhIHRva2VuCisgICAgRW5kUmVzeW5jOworICAgIFJlcG9ydEVycm9yKEUpOyAgLy8gcmVwb3J0IGFmdGVyIGNvbnN1bWluZyBzbyBBVyBzZWVzIHRoZSB0b2tlbiBpbiB0aGUgZXhjZXB0aW9uCisgICAgLy8gd2Ugd2FudCB0byByZXR1cm4gdGhlIHRva2VuIHdlJ3JlIGFjdHVhbGx5IG1hdGNoaW5nCisgICAgUmVzdWx0IDo9IEdldEN1cnJlbnRJbnB1dFN5bWJvbChJbnB1dCk7CisgICAgSW5wdXQuQ29uc3VtZTsgIC8vIG1vdmUgcGFzdCB0dHlwZSB0b2tlbiBhcyBpZiBhbGwgd2VyZSBvaworICBlbmQKKyAgZWxzZQorICBiZWdpbgorICAgIC8vIGNhbid0IHJlY292ZXIgd2l0aCBzaW5nbGUgdG9rZW4gZGVsZXRpb24sIHRyeSBpbnNlcnRpb24KKyAgICBpZiBNaXNtYXRjaElzTWlzc2luZ1Rva2VuKElucHV0LCBGb2xsb3cpIHRoZW4KKyAgICBiZWdpbgorICAgICAgRSA6PSBuaWw7CisgICAgICBSZXN1bHQgOj0gR2V0TWlzc2luZ1N5bWJvbChJbnB1dCwgRSwgVG9rZW5UeXBlLCBGb2xsb3cpOworICAgICAgRSA6PSBFTWlzc2luZ1Rva2VuRXhjZXB0aW9uLkNyZWF0ZShUb2tlblR5cGUsIElucHV0LCBSZXN1bHQpOworICAgICAgUmVwb3J0RXJyb3IoRSk7ICAvLyByZXBvcnQgYWZ0ZXIgaW5zZXJ0aW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICBlbmQKKyAgICBlbHNlCisgICAgYmVnaW4KKyAgICAgIC8vIGV2ZW4gdGhhdCBkaWRuJ3Qgd29yazsgbXVzdCB0aHJvdyB0aGUgZXhjZXB0aW9uCisgICAgICByYWlzZSBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLkNyZWF0ZShUb2tlblR5cGUsIElucHV0KTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlUmVjb2duaXplci5SZXBvcnRFcnJvcihjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb24pOworYmVnaW4KKyAgLy8gaWYgd2UndmUgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBhbmQgaGF2ZSBub3QgbWF0Y2hlZCBhIHRva2VuCisgIC8vIHlldCBzdWNjZXNzZnVsbHksIGRvbid0IHJlcG9ydCBhbnkgZXJyb3JzLgorICBpZiAobm90IEZTdGF0ZS5FcnJvclJlY292ZXJ5KSB0aGVuCisgIGJlZ2luCisgICAgRlN0YXRlLlN5bnRheEVycm9ycyA6PSBGU3RhdGUuU3ludGF4RXJyb3JzICsgMTsgLy8gZG9uJ3QgY291bnQgc3B1cmlvdXMKKyAgICBGU3RhdGUuRXJyb3JSZWNvdmVyeSA6PSBUcnVlOworICAgIERpc3BsYXlSZWNvZ25pdGlvbkVycm9yKEdldFRva2VuTmFtZXMsIEUpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVJlY29nbml6ZXIuUmVzZXQ7Cit2YXIKKyAgSTogSW50ZWdlcjsKK2JlZ2luCisgIC8vIHdhY2sgZXZlcnl0aGluZyByZWxhdGVkIHRvIGVycm9yIHJlY292ZXJ5CisgIGlmIChGU3RhdGUgPSBuaWwpIHRoZW4KKyAgICBFeGl0OyAgLy8gbm8gc2hhcmVkIHN0YXRlIHdvcmsgdG8gZG8KKworICBGU3RhdGUuRm9sbG93aW5nU3RhY2tQb2ludGVyIDo9IC0xOworICBGU3RhdGUuRXJyb3JSZWNvdmVyeSA6PSBGYWxzZTsKKyAgRlN0YXRlLkxhc3RFcnJvckluZGV4IDo9IC0xOworICBGU3RhdGUuRmFpbGVkIDo9IEZhbHNlOworICBGU3RhdGUuU3ludGF4RXJyb3JzIDo9IDA7CisKKyAgLy8gd2FjayBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gYmFja3RyYWNraW5nIGFuZCBtZW1vaXphdGlvbgorICBGU3RhdGUuQmFja3RyYWNraW5nIDo9IDA7CisgIGlmIEFzc2lnbmVkKEZTdGF0ZS5SdWxlTWVtbykgdGhlbgorICAgIGZvciBJIDo9IDAgdG8gTGVuZ3RoKEZTdGF0ZS5SdWxlTWVtbykgLSAxIGRvCisgICAgYmVnaW4KKyAgICAgIC8vIHdpcGUgY2FjaGUKKyAgICAgIEZTdGF0ZS5SdWxlTWVtb1tJXSA6PSBuaWw7CisgICAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQmFzZVJlY29nbml6ZXIuVG9TdHJpbmdzKGNvbnN0IFRva2VuczogSUxpc3Q8SVRva2VuPik6IElMaXN0PFN0cmluZz47Cit2YXIKKyAgVG9rZW46IElUb2tlbjsKK2JlZ2luCisgIGlmIChUb2tlbnMgPSBuaWwpIHRoZW4KKyAgICBSZXN1bHQgOj0gbmlsCisgIGVsc2UKKyAgYmVnaW4KKyAgICBSZXN1bHQgOj0gVExpc3Q8U3RyaW5nPi5DcmVhdGU7CisgICAgZm9yIFRva2VuIGluIFRva2VucyBkbworICAgICAgUmVzdWx0LkFkZChUb2tlbi5UZXh0KTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJhc2VSZWNvZ25pemVyLlRyYWNlSW4oY29uc3QgUnVsZU5hbWU6IFN0cmluZzsKKyAgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyOyBjb25zdCBJbnB1dFN5bWJvbDogU3RyaW5nKTsKK2JlZ2luCisgIFdyaXRlKCdlbnRlciAnICsgUnVsZU5hbWUgKyAnICcgKyBJbnB1dFN5bWJvbCk7CisgIGlmIChGU3RhdGUuRmFpbGVkKSB0aGVuCisgICAgV3JpdGVMbignIGZhaWxlZD1UcnVlJyk7CisgIGlmIChGU3RhdGUuQmFja3RyYWNraW5nID4gMCkgdGhlbgorICAgIFdyaXRlKCcgYmFja3RyYWNraW5nPScgKyBJbnRUb1N0cihGU3RhdGUuQmFja3RyYWNraW5nKSk7CisgIFdyaXRlTG47CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVJlY29nbml6ZXIuVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsKKyAgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyOyBjb25zdCBJbnB1dFN5bWJvbDogU3RyaW5nKTsKK2JlZ2luCisgIFdyaXRlKCdleGl0ICcgKyBSdWxlTmFtZSArICcgJyArIElucHV0U3ltYm9sKTsKKyAgaWYgKEZTdGF0ZS5GYWlsZWQpIHRoZW4KKyAgICBXcml0ZUxuKCcgZmFpbGVkPVRydWUnKTsKKyAgaWYgKEZTdGF0ZS5CYWNrdHJhY2tpbmcgPiAwKSB0aGVuCisgICAgV3JpdGUoJyBiYWNrdHJhY2tpbmc9JyArIEludFRvU3RyKEZTdGF0ZS5CYWNrdHJhY2tpbmcpKTsKKyAgV3JpdGVMbjsKK2VuZDsKKworeyBUQ29tbW9uVG9rZW5TdHJlYW0gfQorCitwcm9jZWR1cmUgVENvbW1vblRva2VuU3RyZWFtLkNvbnN1bWU7CitiZWdpbgorICBpZiAoRlAgPCBGVG9rZW5zLkNvdW50KSB0aGVuCisgIGJlZ2luCisgICAgSW5jKEZQKTsKKyAgICBGUCA6PSBTa2lwT2ZmVG9rZW5DaGFubmVscyhGUCk7IC8vIGxlYXZlIHAgb24gdmFsaWQgdG9rZW4KKyAgZW5kOworZW5kOworCitjb25zdHJ1Y3RvciBUQ29tbW9uVG9rZW5TdHJlYW0uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBGUCA6PSAtMTsKKyAgRkNoYW5uZWwgOj0gVFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgRlRva2VucyA6PSBUTGlzdDxJVG9rZW4+LkNyZWF0ZTsKKyAgRlRva2Vucy5DYXBhY2l0eSA6PSA1MDA7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25Ub2tlblN0cmVhbS5DcmVhdGUoY29uc3QgQVRva2VuU291cmNlOiBJVG9rZW5Tb3VyY2UpOworYmVnaW4KKyAgQ3JlYXRlOworICBGVG9rZW5Tb3VyY2UgOj0gQVRva2VuU291cmNlOworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuU3RyZWFtLkRpc2NhcmRPZmZDaGFubmVsVG9rZW5zKGNvbnN0IERpc2NhcmQ6IEJvb2xlYW4pOworYmVnaW4KKyAgRkRpc2NhcmRPZmZDaGFubmVsVG9rZW5zIDo9IERpc2NhcmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQ29tbW9uVG9rZW5TdHJlYW0uRGlzY2FyZFRva2VuVHlwZShjb25zdCBUVHlwZTogSW50ZWdlcik7CitiZWdpbgorICBpZiAoRkRpc2NhcmRTZXQgPSBuaWwpIHRoZW4KKyAgICBGRGlzY2FyZFNldCA6PSBUSGFzaExpc3Q8SW50ZWdlciwgSW50ZWdlcj4uQ3JlYXRlOworICBGRGlzY2FyZFNldC5BZGQoVFR5cGUsIFRUeXBlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlblN0cmVhbS5GaWxsQnVmZmVyOwordmFyCisgIEluZGV4OiBJbnRlZ2VyOworICBUOiBJVG9rZW47CisgIERpc2NhcmQ6IEJvb2xlYW47CitiZWdpbgorICBJbmRleCA6PSAwOworICBUIDo9IEZUb2tlblNvdXJjZS5OZXh0VG9rZW47CisgIHdoaWxlIEFzc2lnbmVkKFQpIGFuZCAoVC5Ub2tlblR5cGUgPD4gSW50ZWdlcihjc2NFT0YpKSBkbworICBiZWdpbgorICAgIERpc2NhcmQgOj0gRmFsc2U7CisgICAgLy8gaXMgdGhlcmUgYSBjaGFubmVsIG92ZXJyaWRlIGZvciB0b2tlbiB0eXBlPworICAgIGlmIEFzc2lnbmVkKEZDaGFubmVsT3ZlcnJpZGVNYXApIHRoZW4KKyAgICAgIGlmIEZDaGFubmVsT3ZlcnJpZGVNYXAuQ29udGFpbnNLZXkoVC5Ub2tlblR5cGUpIHRoZW4KKyAgICAgICAgVC5DaGFubmVsIDo9IEZDaGFubmVsT3ZlcnJpZGVNYXBbVC5Ub2tlblR5cGVdOworCisgICAgaWYgQXNzaWduZWQoRkRpc2NhcmRTZXQpIGFuZCBGRGlzY2FyZFNldC5Db250YWluc0tleShULlRva2VuVHlwZSkgdGhlbgorICAgICAgRGlzY2FyZCA6PSBUcnVlCisgICAgZWxzZQorICAgICAgaWYgRkRpc2NhcmRPZmZDaGFubmVsVG9rZW5zIGFuZCAoVC5DaGFubmVsIDw+IEZDaGFubmVsKSB0aGVuCisgICAgICAgIERpc2NhcmQgOj0gVHJ1ZTsKKworICAgIGlmIChub3QgRGlzY2FyZCkgdGhlbgorICAgIGJlZ2luCisgICAgICBULlRva2VuSW5kZXggOj0gSW5kZXg7CisgICAgICBGVG9rZW5zLkFkZChUKTsKKyAgICAgIEluYyhJbmRleCk7CisgICAgZW5kOworCisgICAgVCA6PSBGVG9rZW5Tb3VyY2UuTmV4dFRva2VuOworICBlbmQ7CisgIC8vIGxlYXZlIHAgcG9pbnRpbmcgYXQgZmlyc3QgdG9rZW4gb24gY2hhbm5lbAorICBGUCA6PSAwOworICBGUCA6PSBTa2lwT2ZmVG9rZW5DaGFubmVscyhGUCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5HZXQoY29uc3QgSTogSW50ZWdlcik6IElUb2tlbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVG9rZW5zW0ldOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uR2V0U291cmNlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlblNvdXJjZS5Tb3VyY2VOYW1lOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyOworICBjb25zdCBUeXBlczogSUxpc3Q8SW50ZWdlcj4pOiBJTGlzdDxJVG9rZW4+OworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFRva2VucyhTdGFydCwgU3RvcCwgVEJpdFNldC5DcmVhdGUoVHlwZXMpKTsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuU3RyZWFtLkdldFRva2Vucyhjb25zdCBTdGFydCwgU3RvcCwKKyAgVG9rZW5UeXBlOiBJbnRlZ2VyKTogSUxpc3Q8SVRva2VuPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRUb2tlbnMoU3RhcnQsIFN0b3AsIFRCaXRTZXQuQml0U2V0T2YoVG9rZW5UeXBlKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5HZXRUb2tlbnMoY29uc3QgU3RhcnQsIFN0b3A6IEludGVnZXI7CisgIGNvbnN0IFR5cGVzOiBJQml0U2V0KTogSUxpc3Q8SVRva2VuPjsKK3ZhcgorICBJLCBTdGFydEluZGV4LCBTdG9wSW5kZXg6IEludGVnZXI7CisgIFQ6IElUb2tlbjsKK2JlZ2luCisgIGlmIChGUCA9IC0xKSB0aGVuCisgICAgRmlsbEJ1ZmZlcjsKKyAgU3RvcEluZGV4IDo9IE1pbihTdG9wLEZUb2tlbnMuQ291bnQgLSAxKTsKKyAgU3RhcnRJbmRleCA6PSBNYXgoU3RhcnQsMCk7CisgIGlmIChTdGFydEluZGV4ID4gU3RvcEluZGV4KSB0aGVuCisgICAgUmVzdWx0IDo9IG5pbAorICBlbHNlCisgIGJlZ2luCisgICAgUmVzdWx0IDo9IFRMaXN0PElUb2tlbj4uQ3JlYXRlOworICAgIGZvciBJIDo9IFN0YXJ0SW5kZXggdG8gU3RvcEluZGV4IGRvCisgICAgYmVnaW4KKyAgICAgIFQgOj0gRlRva2Vuc1tJXTsKKyAgICAgIGlmIChUeXBlcyA9IG5pbCkgb3IgVHlwZXMuTWVtYmVyKFQuVG9rZW5UeXBlKSB0aGVuCisgICAgICAgIFJlc3VsdC5BZGQoVCk7CisgICAgZW5kOworICAgIGlmIChSZXN1bHQuQ291bnQgPSAwKSB0aGVuCisgICAgICBSZXN1bHQgOj0gbmlsOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5HZXRUb2tlbnM6IElMaXN0PElUb2tlbj47CitiZWdpbgorICBpZiAoRlAgPSAtMSkgdGhlbgorICAgIEZpbGxCdWZmZXI7CisgIFJlc3VsdCA6PSBGVG9rZW5zOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uR2V0VG9rZW5zKGNvbnN0IFN0YXJ0LAorICBTdG9wOiBJbnRlZ2VyKTogSUxpc3Q8SVRva2VuPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRUb2tlbnMoU3RhcnQsIFN0b3AsIElCaXRTZXQobmlsKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5HZXRUb2tlblNvdXJjZTogSVRva2VuU291cmNlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlblNvdXJjZTsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuU3RyZWFtLkluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZQOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uTEEoSTogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gTFQoSSkuVG9rZW5UeXBlOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uTEFDaGFyKEk6IEludGVnZXIpOiBDaGFyOworYmVnaW4KKyAgUmVzdWx0IDo9IENoYXIoTEEoSSkpOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uTEIoY29uc3QgSzogSW50ZWdlcik6IElUb2tlbjsKK3ZhcgorICBJLCBOOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgKEZQID0gLTEpIHRoZW4KKyAgICBGaWxsQnVmZmVyOworICBpZiAoSyA9IDApIHRoZW4KKyAgICBSZXN1bHQgOj0gbmlsCisgIGVsc2UKKyAgICBpZiAoKEZQIC0gSykgPCAwKSB0aGVuCisgICAgICBSZXN1bHQgOj0gbmlsCisgICAgZWxzZQorICAgIGJlZ2luCisgICAgICBJIDo9IEZQOworICAgICAgTiA6PSAxOworICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zIGxvb2tpbmcgYmFja3dhcmRzCisgICAgICB3aGlsZSAoTiA8PSBLKSBkbworICAgICAgYmVnaW4KKyAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgSSA6PSBTa2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoSSAtIDEpOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisgICAgICAgIEluYyhOKTsKKyAgICAgIGVuZDsKKyAgICAgIGlmIChJIDwgMCkgdGhlbgorICAgICAgICBSZXN1bHQgOj0gbmlsCisgICAgICBlbHNlCisgICAgICAgIFJlc3VsdCA6PSBGVG9rZW5zW0ldOworICAgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuU3RyZWFtLkxUKGNvbnN0IEs6IEludGVnZXIpOiBJVG9rZW47Cit2YXIKKyAgSSwgTjogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChGUCA9IC0xKSB0aGVuCisgICAgRmlsbEJ1ZmZlcjsKKyAgaWYgKEsgPSAwKSB0aGVuCisgICAgUmVzdWx0IDo9IG5pbAorICBlbHNlCisgICAgaWYgKEsgPCAwKSB0aGVuCisgICAgICBSZXN1bHQgOj0gTEIoLUspCisgICAgZWxzZQorICAgICAgaWYgKChGUCArIEsgLSAxKSA+PSBGVG9rZW5zLkNvdW50KSB0aGVuCisgICAgICAgIFJlc3VsdCA6PSBUVG9rZW4uRU9GX1RPS0VOCisgICAgICBlbHNlCisgICAgICBiZWdpbgorICAgICAgICBJIDo9IEZQOworICAgICAgICBOIDo9IDE7CisgICAgICAgIC8vIGZpbmQgayBnb29kIHRva2VucworICAgICAgICB3aGlsZSAoTiA8IEspIGRvCisgICAgICAgIGJlZ2luCisgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICBJIDo9IFNraXBPZmZUb2tlbkNoYW5uZWxzKEkgKyAxKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgIEluYyhOKTsKKyAgICAgICAgZW5kOworICAgICAgICBpZiAoSSA+PSBGVG9rZW5zLkNvdW50KSB0aGVuCisgICAgICAgICAgUmVzdWx0IDo9IFRUb2tlbi5FT0ZfVE9LRU4KKyAgICAgICAgZWxzZQorICAgICAgICAgIFJlc3VsdCA6PSBGVG9rZW5zW0ldOworICAgICAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uTWFyazogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChGUCA9IC0xKSB0aGVuCisgICAgRmlsbEJ1ZmZlcjsKKyAgRkxhc3RNYXJrZXIgOj0gSW5kZXg7CisgIFJlc3VsdCA6PSBGTGFzdE1hcmtlcjsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlblN0cmVhbS5SZWxlYXNlKGNvbnN0IE1hcmtlcjogSW50ZWdlcik7CitiZWdpbgorICAvLyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuU3RyZWFtLlJlc2V0OworYmVnaW4KKyAgRlAgOj0gMDsKKyAgRkxhc3RNYXJrZXIgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlblN0cmVhbS5SZXdpbmQoY29uc3QgTWFya2VyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFNlZWsoTWFya2VyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlblN0cmVhbS5SZXdpbmQ7CitiZWdpbgorICBTZWVrKEZMYXN0TWFya2VyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlblN0cmVhbS5TZWVrKGNvbnN0IEluZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZQIDo9IEluZGV4OworZW5kOworCitwcm9jZWR1cmUgVENvbW1vblRva2VuU3RyZWFtLlNldFRva2VuU291cmNlKGNvbnN0IFZhbHVlOiBJVG9rZW5Tb3VyY2UpOworYmVnaW4KKyAgRlRva2VuU291cmNlIDo9IFZhbHVlOworICBGVG9rZW5zLkNsZWFyOworICBGUCA6PSAtMTsKKyAgRkNoYW5uZWwgOj0gVFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21tb25Ub2tlblN0cmVhbS5TZXRUb2tlblR5cGVDaGFubmVsKGNvbnN0IFRUeXBlLCBDaGFubmVsOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIChGQ2hhbm5lbE92ZXJyaWRlTWFwID0gbmlsKSB0aGVuCisgICAgRkNoYW5uZWxPdmVycmlkZU1hcCA6PSBURGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPi5DcmVhdGU7CisgIEZDaGFubmVsT3ZlcnJpZGVNYXBbVFR5cGVdIDo9IENoYW5uZWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5TaXplOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZUb2tlbnMuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5Ta2lwT2ZmVG9rZW5DaGFubmVscyhjb25zdCBJOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBOOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEk7CisgIE4gOj0gRlRva2Vucy5Db3VudDsKKyAgd2hpbGUgKFJlc3VsdCA8IE4pIGFuZCAoRlRva2Vuc1tSZXN1bHRdLkNoYW5uZWwgPD4gRkNoYW5uZWwpIGRvCisgICAgSW5jKFJlc3VsdCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5Ta2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoCisgIGNvbnN0IEk6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEk7CisgIHdoaWxlIChSZXN1bHQgPj0gMCkgYW5kIChGVG9rZW5zW1Jlc3VsdF0uQ2hhbm5lbCA8PiBGQ2hhbm5lbCkgZG8KKyAgICBEZWMoUmVzdWx0KTsKK2VuZDsKKworZnVuY3Rpb24gVENvbW1vblRva2VuU3RyZWFtLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBpZiAoRlAgPSAtMSkgdGhlbgorICAgIEZpbGxCdWZmZXI7CisgIFJlc3VsdCA6PSBUb1N0cmluZygwLCBGVG9rZW5zLkNvdW50IC0gMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21tb25Ub2tlblN0cmVhbS5Ub1N0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsKK3ZhcgorICBJLCBGaW5pc2g6IEludGVnZXI7CisgIEJ1ZjogVFN0cmluZ0J1aWxkZXI7CisgIFQ6IElUb2tlbjsKK2JlZ2luCisgIGlmIChTdGFydCA8IDApIG9yIChTdG9wIDwgMCkgdGhlbgorICAgIFJlc3VsdCA6PSAnJworICBlbHNlCisgIGJlZ2luCisgICAgaWYgKEZQID0gLTEpIHRoZW4KKyAgICAgIEZpbGxCdWZmZXI7CisgICAgaWYgKFN0b3AgPj0gRlRva2Vucy5Db3VudCkgdGhlbgorICAgICAgRmluaXNoIDo9IEZUb2tlbnMuQ291bnQgLSAxCisgICAgZWxzZQorICAgICAgRmluaXNoIDo9IFN0b3A7CisgICAgQnVmIDo9IFRTdHJpbmdCdWlsZGVyLkNyZWF0ZTsKKyAgICB0cnkKKyAgICAgIGZvciBJIDo9IFN0YXJ0IHRvIEZpbmlzaCBkbworICAgICAgYmVnaW4KKyAgICAgICAgVCA6PSBGVG9rZW5zW0ldOworICAgICAgICBCdWYuQXBwZW5kKFQuVGV4dCk7CisgICAgICBlbmQ7CisgICAgICBSZXN1bHQgOj0gQnVmLlRvU3RyaW5nOworICAgIGZpbmFsbHkKKyAgICAgIEJ1Zi5GcmVlOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQ29tbW9uVG9rZW5TdHJlYW0uVG9TdHJpbmcoY29uc3QgU3RhcnQsIFN0b3A6IElUb2tlbik6IFN0cmluZzsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKFN0YXJ0KSBhbmQgQXNzaWduZWQoU3RvcCkgdGhlbgorICAgIFJlc3VsdCA6PSBUb1N0cmluZyhTdGFydC5Ub2tlbkluZGV4LCBTdG9wLlRva2VuSW5kZXgpCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gJyc7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25Ub2tlblN0cmVhbS5DcmVhdGUoY29uc3QgQVRva2VuU291cmNlOiBJVG9rZW5Tb3VyY2U7CisgIGNvbnN0IEFDaGFubmVsOiBJbnRlZ2VyKTsKK2JlZ2luCisgIENyZWF0ZShBVG9rZW5Tb3VyY2UpOworICBGQ2hhbm5lbCA6PSBBQ2hhbm5lbDsKK2VuZDsKKworY29uc3RydWN0b3IgVENvbW1vblRva2VuU3RyZWFtLkNyZWF0ZShjb25zdCBBTGV4ZXI6IElMZXhlcik7CitiZWdpbgorICBDcmVhdGUoQUxleGVyIGFzIElUb2tlblNvdXJjZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRDb21tb25Ub2tlblN0cmVhbS5DcmVhdGUoY29uc3QgQUxleGVyOiBJTGV4ZXI7CisgIGNvbnN0IEFDaGFubmVsOiBJbnRlZ2VyKTsKK2JlZ2luCisgIENyZWF0ZShBTGV4ZXIgYXMgSVRva2VuU291cmNlLCBBQ2hhbm5lbCk7CitlbmQ7CisKK3sgVERGQSB9CisKK2Z1bmN0aW9uIFRERkEuRGVzY3JpcHRpb246IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSAnbi9hJzsKK2VuZDsKKworcHJvY2VkdXJlIFRERkEuRXJyb3IoY29uc3QgTlZBRTogRU5vVmlhYmxlQWx0RXhjZXB0aW9uKTsKK2JlZ2luCisgIC8vIE5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KK2VuZDsKKworZnVuY3Rpb24gVERGQS5HZXRSZWNvZ25pemVyOiBJQmFzZVJlY29nbml6ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gSUJhc2VSZWNvZ25pemVyKEZSZWNvZ25pemVyKTsKK2VuZDsKKworZnVuY3Rpb24gVERGQS5HZXRTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlcjogVFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlcjsKK2VuZDsKKworcHJvY2VkdXJlIFRERkEuTm9WaWFibGVBbHQoY29uc3QgUzogSW50ZWdlcjsgY29uc3QgSW5wdXQ6IElJbnRTdHJlYW0pOwordmFyCisgIE5WQUU6IEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbjsKK2JlZ2luCisgIGlmIChSZWNvZ25pemVyLlN0YXRlLkJhY2t0cmFja2luZyA+IDApIHRoZW4KKyAgICBSZWNvZ25pemVyLlN0YXRlLkZhaWxlZCA6PSBUcnVlCisgIGVsc2UKKyAgYmVnaW4KKyAgICBOVkFFIDo9IEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5DcmVhdGUoRGVzY3JpcHRpb24sIEZEZWNpc2lvbk51bWJlciwgUywgSW5wdXQpOworICAgIEVycm9yKE5WQUUpOworICAgIHJhaXNlIE5WQUU7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVERGQS5QcmVkaWN0KGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTogSW50ZWdlcjsKK3ZhcgorICBNYXJrLCBTLCBTTmV4dCwgU3BlY2lhbFN0YXRlOiBJbnRlZ2VyOworICBDOiBDaGFyOworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CisgIE1hcmsgOj0gSW5wdXQuTWFyazsgLy8gcmVtZW1iZXIgd2hlcmUgZGVjaXNpb24gc3RhcnRlZCBpbiBpbnB1dAorICBTIDo9IDA7IC8vIHdlIGFsd2F5cyBzdGFydCBhdCBzMAorICB0cnkKKyAgICB3aGlsZSBUcnVlIGRvCisgICAgYmVnaW4KKyAgICAgIFNwZWNpYWxTdGF0ZSA6PSBGU3BlY2lhbFtTXTsKKyAgICAgIGlmIChTcGVjaWFsU3RhdGUgPj0gMCkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgUyA6PSBGU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIoU2VsZiwgU3BlY2lhbFN0YXRlLCBJbnB1dCk7CisgICAgICAgIGlmIChTID0gLTEpIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBOb1ZpYWJsZUFsdChTLCBJbnB1dCk7CisgICAgICAgICAgRXhpdDsKKyAgICAgICAgZW5kOworICAgICAgICBJbnB1dC5Db25zdW1lOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKworICAgICAgaWYgKEZBY2NlcHRbU10gPj0gMSkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgUmVzdWx0IDo9IEZBY2NlcHRbU107CisgICAgICAgIEV4aXQ7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIGxvb2sgZm9yIGEgbm9ybWFsIGNoYXIgdHJhbnNpdGlvbgorICAgICAgQyA6PSBDaGFyKElucHV0LkxBKDEpKTsgLy8gLTEgPT0gXHVGRkZGLCBhbGwgdG9rZW5zIGZpdCBpbiA2NTAwMCBzcGFjZQorICAgICAgaWYgKEMgPj0gRk1pbltTXSkgYW5kIChDIDw9IEZNYXhbU10pIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIFNOZXh0IDo9IEZUcmFuc2l0aW9uW1MsSW50ZWdlcihDKSAtIEludGVnZXIoRk1pbltTXSldOyAgLy8gbW92ZSB0byBuZXh0IHN0YXRlCisgICAgICAgIGlmIChTTmV4dCA8IDApIHRoZW4KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICAvLyB3YXMgaW4gcmFuZ2UgYnV0IG5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uCisgICAgICAgICAgLy8gbXVzdCBjaGVjayBFT1QsIHdoaWNoIGlzIGxpa2UgdGhlIGVsc2UgY2xhdXNlLgorICAgICAgICAgIC8vIGVvdFtzXT49MCBpbmRpY2F0ZXMgdGhhdCBhbiBFT1QgZWRnZSBnb2VzIHRvIGFub3RoZXIKKyAgICAgICAgICAvLyBzdGF0ZS4KKyAgICAgICAgICBpZiAoRkVPVFtTXSA+PSAwKSB0aGVuICAvLyBFT1QgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgIFMgOj0gRkVPVFtTXTsKKyAgICAgICAgICAgIElucHV0LkNvbnN1bWU7CisgICAgICAgICAgICAvLyBUT0RPOiBJIGhhZCB0aGlzIGFzIHJldHVybiBhY2NlcHRbZW90W3NdXQorICAgICAgICAgICAgLy8gd2hpY2ggYXNzdW1lZCBoZXJlIHRoYXQgdGhlIEVPVCBlZGdlIGFsd2F5cworICAgICAgICAgICAgLy8gd2VudCB0byBhbiBhY2NlcHQuLi5mYXN0ZXIgdG8gZG8gdGhpcywgYnV0CisgICAgICAgICAgICAvLyB3aGF0IGFib3V0IHByZWRpY2F0ZWQgZWRnZXMgY29taW5nIGZyb20gRU9UCisgICAgICAgICAgICAvLyB0YXJnZXQ/CisgICAgICAgICAgICBDb250aW51ZTsKKyAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICBOb1ZpYWJsZUFsdChTLCBJbnB1dCk7CisgICAgICAgICAgRXhpdDsKKyAgICAgICAgZW5kOworICAgICAgICBTIDo9IFNOZXh0OworICAgICAgICBJbnB1dC5Db25zdW1lOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKworICAgICAgaWYgKEZFT1RbU10gPj0gMCkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgLy8gRU9UIFRyYW5zaXRpb24/CisgICAgICAgIFMgOj0gRkVPVFtTXTsKKyAgICAgICAgSW5wdXQuQ29uc3VtZTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisKKyAgICAgIGlmIChDID0gQ2hhcihUVG9rZW4uRU9GKSkgYW5kIChGRU9GW1NdID49IDApIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIC8vIEVPRiBUcmFuc2l0aW9uIHRvIGFjY2VwdCBzdGF0ZT8KKyAgICAgICAgUmVzdWx0IDo9IEZBY2NlcHRbRkVPRltTXV07CisgICAgICAgIEV4aXQ7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIG5vdCBpbiByYW5nZSBhbmQgbm90IEVPRi9FT1QsIG11c3QgYmUgaW52YWxpZCBzeW1ib2wKKyAgICAgIE5vVmlhYmxlQWx0KFMsIElucHV0KTsKKyAgICAgIEV4aXQ7CisgICAgZW5kOworICBmaW5hbGx5CisgICAgSW5wdXQuUmV3aW5kKE1hcmspOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUREZBLlNldFJlY29nbml6ZXIoY29uc3QgVmFsdWU6IElCYXNlUmVjb2duaXplcik7CitiZWdpbgorICBGUmVjb2duaXplciA6PSBQb2ludGVyKFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRERkEuU2V0U3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIoCisgIGNvbnN0IFZhbHVlOiBUU3BlY2lhbFN0YXRlVHJhbnNpdGlvbkhhbmRsZXIpOworYmVnaW4KKyAgRlNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyIDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUREZBLlNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oY29uc3QgUzogSW50ZWdlcjsKKyAgY29uc3QgSW5wdXQ6IElJbnRTdHJlYW0pOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gTm8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICBSZXN1bHQgOj0gLTE7CitlbmQ7CisKK2Z1bmN0aW9uIFRERkEuU3BlY2lhbFRyYW5zaXRpb24oY29uc3QgU3RhdGUsIFN5bWJvbDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gMDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKAorICBjb25zdCBFbmNvZGVkU3RyaW5nOiBTdHJpbmcpOiBUU21hbGxpbnRBcnJheTsKK3ZhcgorICBJLCBKLCBESSwgU2l6ZTogSW50ZWdlcjsKKyAgTiwgVjogQ2hhcjsKK2JlZ2luCisgIFNpemUgOj0gMDsKKyAgSSA6PSAxOworICB3aGlsZSAoSSA8PSBMZW5ndGgoRW5jb2RlZFN0cmluZykpIGRvCisgIGJlZ2luCisgICAgSW5jKFNpemUsSW50ZWdlcihFbmNvZGVkU3RyaW5nW0ldKSk7CisgICAgSW5jKEksMik7CisgIGVuZDsKKworICBTZXRMZW5ndGgoUmVzdWx0LFNpemUpOworICBESSA6PSAwOworICBJIDo9IDE7CisgIHdoaWxlIChJIDw9IExlbmd0aChFbmNvZGVkU3RyaW5nKSkgZG8KKyAgYmVnaW4KKyAgICBOIDo9IEVuY29kZWRTdHJpbmdbSV07CisgICAgViA6PSBFbmNvZGVkU3RyaW5nW0kgKyAxXTsKKyAgICAvLyBhZGQgdiBuIHRpbWVzIHRvIGRhdGEKKyAgICBmb3IgSiA6PSAxIHRvIEludGVnZXIoTikgZG8KKyAgICBiZWdpbgorICAgICAgUmVzdWx0W0RJXSA6PSBTbWFsbGludChWKTsKKyAgICAgIEluYyhESSk7CisgICAgZW5kOworICAgIEluYyhJLDIpOworICBlbmQ7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRERkEuVW5wYWNrRW5jb2RlZFN0cmluZ0FycmF5KAorICBjb25zdCBFbmNvZGVkU3RyaW5nczogYXJyYXkgb2YgU3RyaW5nKTogVFNtYWxsaW50TWF0cml4OwordmFyCisgIEk6IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoUmVzdWx0LExlbmd0aChFbmNvZGVkU3RyaW5ncykpOworICBmb3IgSSA6PSAwIHRvIExlbmd0aChFbmNvZGVkU3RyaW5ncykgLSAxIGRvCisgICAgUmVzdWx0W0ldIDo9IFVucGFja0VuY29kZWRTdHJpbmcoRW5jb2RlZFN0cmluZ3NbSV0pOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUREZBLlVucGFja0VuY29kZWRTdHJpbmdBcnJheSgKKyAgY29uc3QgRW5jb2RlZFN0cmluZ3M6IFRTdHJpbmdBcnJheSk6IFRTbWFsbGludE1hdHJpeDsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKFJlc3VsdCxMZW5ndGgoRW5jb2RlZFN0cmluZ3MpKTsKKyAgZm9yIEkgOj0gMCB0byBMZW5ndGgoRW5jb2RlZFN0cmluZ3MpIC0gMSBkbworICAgIFJlc3VsdFtJXSA6PSBVbnBhY2tFbmNvZGVkU3RyaW5nKEVuY29kZWRTdHJpbmdzW0ldKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKAorICBjb25zdCBFbmNvZGVkU3RyaW5nOiBTdHJpbmcpOiBUQ2hhckFycmF5OwordmFyCisgIEksIEosIERJLCBTaXplOiBJbnRlZ2VyOworICBOLCBWOiBDaGFyOworYmVnaW4KKyAgU2l6ZSA6PSAwOworICBJIDo9IDE7CisgIHdoaWxlIChJIDw9IExlbmd0aChFbmNvZGVkU3RyaW5nKSkgZG8KKyAgYmVnaW4KKyAgICBJbmMoU2l6ZSxJbnRlZ2VyKEVuY29kZWRTdHJpbmdbSV0pKTsKKyAgICBJbmMoSSwyKTsKKyAgZW5kOworCisgIFNldExlbmd0aChSZXN1bHQsU2l6ZSk7CisgIERJIDo9IDA7CisgIEkgOj0gMTsKKyAgd2hpbGUgKEkgPD0gTGVuZ3RoKEVuY29kZWRTdHJpbmcpKSBkbworICBiZWdpbgorICAgIE4gOj0gRW5jb2RlZFN0cmluZ1tJXTsKKyAgICBWIDo9IEVuY29kZWRTdHJpbmdbSSArIDFdOworICAgIC8vIGFkZCB2IG4gdGltZXMgdG8gZGF0YQorICAgIGZvciBKIDo9IDEgdG8gSW50ZWdlcihOKSBkbworICAgIGJlZ2luCisgICAgICBSZXN1bHRbREldIDo9IFY7CisgICAgICBJbmMoREkpOworICAgIGVuZDsKKyAgICBJbmMoSSwyKTsKKyAgZW5kOworZW5kOworCit7IFRMZXhlciB9CisKK2NvbnN0cnVjdG9yIFRMZXhlci5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRMZXhlci5DcmVhdGUoY29uc3QgQUlucHV0OiBJQ2hhclN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGSW5wdXQgOj0gQUlucHV0OworZW5kOworCitjb25zdHJ1Y3RvciBUTGV4ZXIuQ3JlYXRlKGNvbnN0IEFJbnB1dDogSUNoYXJTdHJlYW07CisgIGNvbnN0IEFTdGF0ZTogSVJlY29nbml6ZXJTaGFyZWRTdGF0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFTdGF0ZSk7CisgIEZJbnB1dCA6PSBBSW5wdXQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRMZXhlci5FbWl0OiBJVG9rZW47CitiZWdpbgorICBSZXN1bHQgOj0gVENvbW1vblRva2VuLkNyZWF0ZShGSW5wdXQsIEZTdGF0ZS5Ub2tlblR5cGUsIEZTdGF0ZS5DaGFubmVsLAorICAgIEZTdGF0ZS5Ub2tlblN0YXJ0Q2hhckluZGV4LCBHZXRDaGFySW5kZXggLSAxKTsKKyAgUmVzdWx0LkxpbmUgOj0gRlN0YXRlLlRva2VuU3RhcnRMaW5lOworICBSZXN1bHQuVGV4dCA6PSBGU3RhdGUuVGV4dDsKKyAgUmVzdWx0LkNoYXJQb3NpdGlvbkluTGluZSA6PSBGU3RhdGUuVG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKyAgRW1pdChSZXN1bHQpOworZW5kOworCitwcm9jZWR1cmUgVExleGVyLkVtaXQoY29uc3QgVG9rZW46IElUb2tlbik7CitiZWdpbgorICBGU3RhdGUuVG9rZW4gOj0gVG9rZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRMZXhlci5HZXRDaGFyRXJyb3JEaXNwbGF5KGNvbnN0IEM6IEludGVnZXIpOiBTdHJpbmc7CitiZWdpbgorICBjYXNlIEMgb2YKKyAgICAvLyBUVG9rZW4uRU9GCisgICAgVE9LRU5fZG90X0VPRjoKKyAgICAgIFJlc3VsdCA6PSAnPEVPRj4nOworICAgIDEwOgorICAgICAgUmVzdWx0IDo9ICdcbic7CisgICAgOToKKyAgICAgIFJlc3VsdCA6PSAnXHQnOworICAgIDEzOgorICAgICAgUmVzdWx0IDo9ICdccic7CisgICAgZWxzZQorICAgICAgUmVzdWx0IDo9IENoYXIoQyk7CisgIGVuZDsKKyAgUmVzdWx0IDo9ICcnJycgKyBSZXN1bHQgKyAnJycnOworZW5kOworCitmdW5jdGlvbiBUTGV4ZXIuR2V0Q2hhckluZGV4OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dC5JbmRleDsKK2VuZDsKKworZnVuY3Rpb24gVExleGVyLkdldENoYXJQb3NpdGlvbkluTGluZTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSW5wdXQuQ2hhclBvc2l0aW9uSW5MaW5lOworZW5kOworCitmdW5jdGlvbiBUTGV4ZXIuR2V0Q2hhclN0cmVhbTogSUNoYXJTdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gRklucHV0OworZW5kOworCitmdW5jdGlvbiBUTGV4ZXIuR2V0RXJyb3JNZXNzYWdlKGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKyAgY29uc3QgVG9rZW5OYW1lczogVFN0cmluZ0FycmF5KTogU3RyaW5nOwordmFyCisgIE1URTogRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBhYnNvbHV0ZSBFOworICBOVkFFOiBFTm9WaWFibGVBbHRFeGNlcHRpb24gYWJzb2x1dGUgRTsKKyAgRUVFOiBFRWFybHlFeGl0RXhjZXB0aW9uIGFic29sdXRlIEU7CisgIE1OU0U6IEVNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIGFic29sdXRlIEU7CisgIE1TRTogRU1pc21hdGNoZWRTZXRFeGNlcHRpb24gYWJzb2x1dGUgRTsKKyAgTVJFOiBFTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIGFic29sdXRlIEU7CitiZWdpbgorICBpZiAoRSBpcyBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKSB0aGVuCisgICAgUmVzdWx0IDo9ICdtaXNtYXRjaGVkIGNoYXJhY3RlciAnICsgR2V0Q2hhckVycm9yRGlzcGxheShFLkNoYXJhY3RlcikKKyAgICAgICsgJyBleHBlY3RpbmcgJyArIEdldENoYXJFcnJvckRpc3BsYXkoTVRFLkV4cGVjdGluZykKKyAgZWxzZQorICAgIGlmIChFIGlzIEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbikgdGhlbgorICAgICAgLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICJkZWNpc2lvbj08PCIrbnZhZS5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbisiPj4iCisgICAgICAvLyBhbmQgIihkZWNpc2lvbj0iK252YWUuZGVjaXNpb25OdW1iZXIrIikgYW5kCisgICAgICAvLyAic3RhdGUgIitudmFlLnN0YXRlTnVtYmVyCisgICAgICBSZXN1bHQgOj0gJ25vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgJyArIEdldENoYXJFcnJvckRpc3BsYXkoTlZBRS5DaGFyYWN0ZXIpCisgICAgZWxzZQorICAgICAgaWYgKEUgaXMgRUVhcmx5RXhpdEV4Y2VwdGlvbikgdGhlbgorICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQsIGNhbiBhZGQgIihkZWNpc2lvbj0iK2VlZS5kZWNpc2lvbk51bWJlcisiKSIKKyAgICAgICAgUmVzdWx0IDo9ICdyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGNoYXJhY3RlciAnCisgICAgICAgICAgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KEVFRS5DaGFyYWN0ZXIpCisgICAgICBlbHNlCisgICAgICAgIGlmIChFIGlzIEVNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKSB0aGVuCisgICAgICAgICAgUmVzdWx0IDo9ICdtaXNtYXRjaGVkIGNoYXJhY3RlciAnICsgR2V0Q2hhckVycm9yRGlzcGxheShNTlNFLkNoYXJhY3RlcikKKyAgICAgICAgICAgICsgJyBleHBlY3Rpbmcgc2V0ICcgKyBNTlNFLkV4cGVjdGluZy5Ub1N0cmluZworICAgICAgICBlbHNlCisgICAgICAgICAgaWYgKEUgaXMgRU1pc21hdGNoZWRTZXRFeGNlcHRpb24pIHRoZW4KKyAgICAgICAgICAgIFJlc3VsdCA6PSAnbWlzbWF0Y2hlZCBjaGFyYWN0ZXIgJyArIEdldENoYXJFcnJvckRpc3BsYXkoTVNFLkNoYXJhY3RlcikKKyAgICAgICAgICAgICAgKyAnIGV4cGVjdGluZyBzZXQgJyArIE1TRS5FeHBlY3RpbmcuVG9TdHJpbmcKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoRSBpcyBFTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKSB0aGVuCisgICAgICAgICAgICAgIFJlc3VsdCA6PSAnbWlzbWF0Y2hlZCBjaGFyYWN0ZXIgJyArIEdldENoYXJFcnJvckRpc3BsYXkoTVJFLkNoYXJhY3RlcikKKyAgICAgICAgICAgICAgICArICcgZXhwZWN0aW5nIHNldCAnICsgR2V0Q2hhckVycm9yRGlzcGxheShNUkUuQSkgKyAnLi4nCisgICAgICAgICAgICAgICAgKyBHZXRDaGFyRXJyb3JEaXNwbGF5KE1SRS5CKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBSZXN1bHQgOj0gaW5oZXJpdGVkIEdldEVycm9yTWVzc2FnZShFLCBUb2tlbk5hbWVzKTsKK2VuZDsKKworZnVuY3Rpb24gVExleGVyLkdldElucHV0OiBJSW50U3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dDsKK2VuZDsKKworZnVuY3Rpb24gVExleGVyLkdldExpbmU6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRklucHV0LkxpbmU7CitlbmQ7CisKK2Z1bmN0aW9uIFRMZXhlci5HZXRTb3VyY2VOYW1lOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gRklucHV0LlNvdXJjZU5hbWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRMZXhlci5HZXRUZXh0OiBTdHJpbmc7CitiZWdpbgorICBpZiAoRlN0YXRlLlRleHQgPD4gJycpIHRoZW4KKyAgICBSZXN1bHQgOj0gRlN0YXRlLlRleHQKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBGSW5wdXQuU3Vic3RyaW5nKEZTdGF0ZS5Ub2tlblN0YXJ0Q2hhckluZGV4LCBHZXRDaGFySW5kZXggLSAxKQorZW5kOworCitwcm9jZWR1cmUgVExleGVyLk1hdGNoKGNvbnN0IFM6IFN0cmluZyk7Cit2YXIKKyAgSTogSW50ZWdlcjsKKyAgTVRFOiBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOworYmVnaW4KKyAgZm9yIEkgOj0gMSB0byBMZW5ndGgoUykgZG8KKyAgYmVnaW4KKyAgICBpZiAoRklucHV0LkxBKDEpIDw+IEludGVnZXIoU1tJXSkpIHRoZW4KKyAgICBiZWdpbgorICAgICAgaWYgKEZTdGF0ZS5CYWNrdHJhY2tpbmcgPiAwKSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBGU3RhdGUuRmFpbGVkIDo9IFRydWU7CisgICAgICAgIEV4aXQ7CisgICAgICBlbmQ7CisgICAgICBNVEUgOj0gRU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5DcmVhdGUoSW50ZWdlcihTW0ldKSwgRklucHV0KTsKKyAgICAgIFJlY292ZXIoTVRFKTsgLy8gZG9uJ3QgcmVhbGx5IHJlY292ZXI7IGp1c3QgY29uc3VtZSBpbiBsZXhlcgorICAgICAgcmFpc2UgTVRFOworICAgIGVuZDsKKyAgICBGSW5wdXQuQ29uc3VtZTsKKyAgICBGU3RhdGUuRmFpbGVkIDo9IEZhbHNlOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGV4ZXIuTWF0Y2goY29uc3QgQzogSW50ZWdlcik7Cit2YXIKKyAgTVRFOiBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOworYmVnaW4KKyAgaWYgKEZJbnB1dC5MQSgxKSA8PiBDKSB0aGVuCisgIGJlZ2luCisgICAgaWYgKEZTdGF0ZS5CYWNrdHJhY2tpbmcgPiAwKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIEZTdGF0ZS5GYWlsZWQgOj0gVHJ1ZTsKKyAgICAgIEV4aXQ7CisgICAgZW5kOworICAgIE1URSA6PSBFTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLkNyZWF0ZShDLCBGSW5wdXQpOworICAgIFJlY292ZXIoTVRFKTsKKyAgICByYWlzZSBNVEU7CisgIGVuZDsKKyAgRklucHV0LkNvbnN1bWU7CisgIEZTdGF0ZS5GYWlsZWQgOj0gRmFsc2U7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGV4ZXIuTWF0Y2hBbnk7CitiZWdpbgorICBGSW5wdXQuQ29uc3VtZTsKK2VuZDsKKworcHJvY2VkdXJlIFRMZXhlci5NYXRjaFJhbmdlKGNvbnN0IEEsIEI6IEludGVnZXIpOwordmFyCisgIE1SRTogRU1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbjsKK2JlZ2luCisgIGlmIChGSW5wdXQuTEEoMSkgPCBBKSBvciAoRklucHV0LkxBKDEpID4gQikgdGhlbgorICBiZWdpbgorICAgIGlmIChGU3RhdGUuQmFja3RyYWNraW5nID4gMCkgdGhlbgorICAgIGJlZ2luCisgICAgICBGU3RhdGUuRmFpbGVkIDo9IFRydWU7CisgICAgICBFeGl0OworICAgIGVuZDsKKyAgICBNUkUgOj0gRU1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5DcmVhdGUoQSwgQiwgRklucHV0KTsKKyAgICBSZWNvdmVyKE1SRSk7CisgICAgcmFpc2UgTVJFOworICBlbmQ7CisgIEZJbnB1dC5Db25zdW1lOworICBGU3RhdGUuRmFpbGVkIDo9IEZhbHNlOworZW5kOworCitmdW5jdGlvbiBUTGV4ZXIuTmV4dFRva2VuOiBJVG9rZW47CitiZWdpbgorICB3aGlsZSBUcnVlIGRvCisgIGJlZ2luCisgICAgRlN0YXRlLlRva2VuIDo9IG5pbDsKKyAgICBGU3RhdGUuQ2hhbm5lbCA6PSBUVG9rZW4uREVGQVVMVF9DSEFOTkVMOworICAgIEZTdGF0ZS5Ub2tlblN0YXJ0Q2hhckluZGV4IDo9IEZJbnB1dC5JbmRleDsKKyAgICBGU3RhdGUuVG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA6PSBGSW5wdXQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgIEZTdGF0ZS5Ub2tlblN0YXJ0TGluZSA6PSBGaW5wdXQuTGluZTsKKyAgICBGU3RhdGUuVGV4dCA6PSAnJzsKKyAgICBpZiAoRklucHV0LkxBKDEpID0gSW50ZWdlcihjc2NFT0YpKSB0aGVuCisgICAgYmVnaW4KKyAgICAgIFJlc3VsdCA6PSBUVG9rZW4uRU9GX1RPS0VOOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICB0cnkKKyAgICAgIERvVG9rZW5zOworICAgICAgaWYgKEZTdGF0ZS5Ub2tlbiA9IG5pbCkgdGhlbgorICAgICAgICBFbWl0CisgICAgICBlbHNlCisgICAgICAgIGlmIChGU3RhdGUuVG9rZW4gPSBUVG9rZW4uU0tJUF9UT0tFTikgdGhlbgorICAgICAgICAgIENvbnRpbnVlOworICAgICAgRXhpdChGU3RhdGUuVG9rZW4pOworICAgIGV4Y2VwdAorICAgICAgb24gTlZBOiBFTm9WaWFibGVBbHRFeGNlcHRpb24gZG8KKyAgICAgIGJlZ2luCisgICAgICAgIFJlcG9ydEVycm9yKE5WQSk7CisgICAgICAgIFJlY292ZXIoTlZBKTsgIC8vIHRocm93IG91dCBjdXJyZW50IGNoYXIgYW5kIHRyeSBhZ2FpbgorICAgICAgZW5kOworCisgICAgICBvbiBSRTogRVJlY29nbml0aW9uRXhjZXB0aW9uIGRvCisgICAgICBiZWdpbgorICAgICAgICBSZXBvcnRFcnJvcihSRSk7CisgICAgICAgIC8vIE1hdGNoKCkgcm91dGluZSBoYXMgYWxyZWFkeSBjYWxsZWQgUmVjb3ZlcigpCisgICAgICBlbmQ7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGV4ZXIuUmVjb3Zlcihjb25zdCBSRTogRVJlY29nbml0aW9uRXhjZXB0aW9uKTsKK2JlZ2luCisgIEZJbnB1dC5Db25zdW1lOworZW5kOworCitwcm9jZWR1cmUgVExleGVyLlJlcG9ydEVycm9yKGNvbnN0IEU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbik7CitiZWdpbgorICBEaXNwbGF5UmVjb2duaXRpb25FcnJvcihHZXRUb2tlbk5hbWVzLCBFKTsKK2VuZDsKKworcHJvY2VkdXJlIFRMZXhlci5SZXNldDsKK2JlZ2luCisgIGluaGVyaXRlZDsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgIC8vIHdhY2sgTGV4ZXIgc3RhdGUgdmFyaWFibGVzCisgIGlmIEFzc2lnbmVkKEZJbnB1dCkgdGhlbgorICAgIEZJbnB1dC5TZWVrKDApOyAgLy8gcmV3aW5kIHRoZSBpbnB1dAorICBpZiAoRlN0YXRlID0gbmlsKSB0aGVuCisgICAgRXhpdDsgIC8vIG5vIHNoYXJlZCBzdGF0ZSB3b3JrIHRvIGRvCisgIEZTdGF0ZS5Ub2tlbiA6PSBuaWw7CisgIEZTdGF0ZS5Ub2tlblR5cGUgOj0gVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRTsKKyAgRlN0YXRlLkNoYW5uZWwgOj0gVFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgRlN0YXRlLlRva2VuU3RhcnRDaGFySW5kZXggOj0gLTE7CisgIEZTdGF0ZS5Ub2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lIDo9IC0xOworICBGU3RhdGUuVG9rZW5TdGFydExpbmUgOj0gLTE7CisgIEZTdGF0ZS5UZXh0IDo9ICcnOworZW5kOworCitwcm9jZWR1cmUgVExleGVyLlNldENoYXJTdHJlYW0oY29uc3QgVmFsdWU6IElDaGFyU3RyZWFtKTsKK2JlZ2luCisgIEZJbnB1dCA6PSBuaWw7CisgIFJlc2V0OworICBGSW5wdXQgOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGV4ZXIuU2V0VGV4dChjb25zdCBWYWx1ZTogU3RyaW5nKTsKK2JlZ2luCisgIEZTdGF0ZS5UZXh0IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVExleGVyLlNraXA7CitiZWdpbgorICBGU3RhdGUuVG9rZW4gOj0gVFRva2VuLlNLSVBfVE9LRU47CitlbmQ7CisKK3Byb2NlZHVyZSBUTGV4ZXIuVHJhY2VJbihjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOwordmFyCisgIElucHV0U3ltYm9sOiBTdHJpbmc7CitiZWdpbgorICBJbnB1dFN5bWJvbCA6PSBDaGFyKEZJbnB1dC5MVCgxKSkgKyAnIGxpbmU9JyArIEludFRvU3RyKEdldExpbmUpICsgJzonCisgICAgKyBJbnRUb1N0cihHZXRDaGFyUG9zaXRpb25JbkxpbmUpOworICBpbmhlcml0ZWQgVHJhY2VJbihSdWxlTmFtZSwgUnVsZUluZGV4LCBJbnB1dFN5bWJvbCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUTGV4ZXIuVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsKK3ZhcgorICBJbnB1dFN5bWJvbDogU3RyaW5nOworYmVnaW4KKyAgSW5wdXRTeW1ib2wgOj0gQ2hhcihGSW5wdXQuTFQoMSkpICsgJyBsaW5lPScgKyBJbnRUb1N0cihHZXRMaW5lKSArICc6JworICAgICsgSW50VG9TdHIoR2V0Q2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgaW5oZXJpdGVkIFRyYWNlT3V0KFJ1bGVOYW1lLCBSdWxlSW5kZXgsIElucHV0U3ltYm9sKTsKK2VuZDsKKworeyBUUGFyc2VyIH0KKworY29uc3RydWN0b3IgVFBhcnNlci5DcmVhdGUoY29uc3QgQUlucHV0OiBJVG9rZW5TdHJlYW0pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsgLy8gaGlnaGxpZ2h0IHRoYXQgd2UgZ28gdG8gYmFzZSBjbGFzcyB0byBzZXQgc3RhdGUgb2JqZWN0CisgIFNldFRva2VuU3RyZWFtKEFJbnB1dCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRQYXJzZXIuQ3JlYXRlKGNvbnN0IEFJbnB1dDogSVRva2VuU3RyZWFtOworICBjb25zdCBBU3RhdGU6IElSZWNvZ25pemVyU2hhcmVkU3RhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBU3RhdGUpOyAvLyBzaGFyZSB0aGUgc3RhdGUgb2JqZWN0IHdpdGggYW5vdGhlciBwYXJzZXIKKyAgU2V0VG9rZW5TdHJlYW0oQUlucHV0KTsKK2VuZDsKKworZnVuY3Rpb24gVFBhcnNlci5HZXRDdXJyZW50SW5wdXRTeW1ib2woCisgIGNvbnN0IElucHV0OiBJSW50U3RyZWFtKTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dC5MVCgxKQorZW5kOworCitmdW5jdGlvbiBUUGFyc2VyLkdldElucHV0OiBJSW50U3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dDsKK2VuZDsKKworZnVuY3Rpb24gVFBhcnNlci5HZXRNaXNzaW5nU3ltYm9sKGNvbnN0IElucHV0OiBJSW50U3RyZWFtOworICBjb25zdCBFOiBFUmVjb2duaXRpb25FeGNlcHRpb247IGNvbnN0IEV4cGVjdGVkVG9rZW5UeXBlOiBJbnRlZ2VyOworICBjb25zdCBGb2xsb3c6IElCaXRTZXQpOiBJQU5UTFJJbnRlcmZhY2U7Cit2YXIKKyAgVG9rZW5UZXh0OiBTdHJpbmc7CisgIFQ6IElDb21tb25Ub2tlbjsKKyAgQ3VycmVudDogSVRva2VuOworYmVnaW4KKyAgaWYgKEV4cGVjdGVkVG9rZW5UeXBlID0gVFRva2VuLkVPRikgdGhlbgorICAgIFRva2VuVGV4dCA6PSAnPG1pc3NpbmcgRU9GPicKKyAgZWxzZQorICAgIFRva2VuVGV4dCA6PSAnPG1pc3NpbmcgJyArIEdldFRva2VuTmFtZXNbRXhwZWN0ZWRUb2tlblR5cGVdICsgJz4nOworICBUIDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoRXhwZWN0ZWRUb2tlblR5cGUsIFRva2VuVGV4dCk7CisgIEN1cnJlbnQgOj0gRklucHV0LkxUKDEpOworICBpZiAoQ3VycmVudC5Ub2tlblR5cGUgPSBUVG9rZW4uRU9GKSB0aGVuCisgICAgQ3VycmVudCA6PSBGSW5wdXQuTFQoLTEpOworICBULkxpbmUgOj0gQ3VycmVudC5MaW5lOworICBULkNoYXJQb3NpdGlvbkluTGluZSA6PSBDdXJyZW50LkNoYXJQb3NpdGlvbkluTGluZTsKKyAgVC5DaGFubmVsIDo9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgUmVzdWx0IDo9IFQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRQYXJzZXIuR2V0U291cmNlTmFtZTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dC5Tb3VyY2VOYW1lOworZW5kOworCitmdW5jdGlvbiBUUGFyc2VyLkdldFRva2VuU3RyZWFtOiBJVG9rZW5TdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gRklucHV0OworZW5kOworCitwcm9jZWR1cmUgVFBhcnNlci5SZXNldDsKK2JlZ2luCisgIGluaGVyaXRlZDsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgIGlmIEFzc2lnbmVkKEZJbnB1dCkgdGhlbgorICAgIEZJbnB1dC5TZWVrKDApOyAvLyByZXdpbmQgdGhlIGlucHV0CitlbmQ7CisKK3Byb2NlZHVyZSBUUGFyc2VyLlNldFRva2VuU3RyZWFtKGNvbnN0IFZhbHVlOiBJVG9rZW5TdHJlYW0pOworYmVnaW4KKyAgRklucHV0IDo9IG5pbDsKKyAgUmVzZXQ7CisgIEZJbnB1dCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRQYXJzZXIuVHJhY2VJbihjb25zdCBSdWxlTmFtZTogU3RyaW5nOyBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIFRyYWNlSW4oUnVsZU5hbWUsIFJ1bGVJbmRleCwgRklucHV0LkxUKDEpLlRvU3RyaW5nKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQYXJzZXIuVHJhY2VPdXQoY29uc3QgUnVsZU5hbWU6IFN0cmluZzsgY29uc3QgUnVsZUluZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBUcmFjZU91dChSdWxlTmFtZSwgUnVsZUluZGV4LCBGSW5wdXQuTFQoMSkuVG9TdHJpbmcpOworZW5kOworCit7IFRSdWxlUmV0dXJuU2NvcGUgfQorCitmdW5jdGlvbiBUUnVsZVJldHVyblNjb3BlLkdldFN0YXJ0OiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gbmlsOworZW5kOworCitmdW5jdGlvbiBUUnVsZVJldHVyblNjb3BlLkdldFN0b3A6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRSdWxlUmV0dXJuU2NvcGUuR2V0VGVtcGxhdGU6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRSdWxlUmV0dXJuU2NvcGUuR2V0VHJlZTogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRSdWxlUmV0dXJuU2NvcGUuU2V0U3RhcnQoY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICByYWlzZSBFSW52YWxpZE9wZXJhdGlvbi5DcmVhdGUoJ1NldHRlciBoYXMgbm90IGJlZW4gZGVmaW5lZCBmb3IgdGhpcyBwcm9wZXJ0eS4nKTsKK2VuZDsKKworcHJvY2VkdXJlIFRSdWxlUmV0dXJuU2NvcGUuU2V0U3RvcChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIHJhaXNlIEVJbnZhbGlkT3BlcmF0aW9uLkNyZWF0ZSgnU2V0dGVyIGhhcyBub3QgYmVlbiBkZWZpbmVkIGZvciB0aGlzIHByb3BlcnR5LicpOworZW5kOworCitwcm9jZWR1cmUgVFJ1bGVSZXR1cm5TY29wZS5TZXRUcmVlKGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgcmFpc2UgRUludmFsaWRPcGVyYXRpb24uQ3JlYXRlKCdTZXR0ZXIgaGFzIG5vdCBiZWVuIGRlZmluZWQgZm9yIHRoaXMgcHJvcGVydHkuJyk7CitlbmQ7CisKK3sgVFBhcnNlclJ1bGVSZXR1cm5TY29wZSB9CisKK2Z1bmN0aW9uIFRQYXJzZXJSdWxlUmV0dXJuU2NvcGUuR2V0U3RhcnQ6IElBTlRMUkludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU3RhcnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRQYXJzZXJSdWxlUmV0dXJuU2NvcGUuR2V0U3RvcDogSUFOVExSSW50ZXJmYWNlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdG9wOworZW5kOworCitwcm9jZWR1cmUgVFBhcnNlclJ1bGVSZXR1cm5TY29wZS5TZXRTdGFydChjb25zdCBWYWx1ZTogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIEZTdGFydCA6PSBWYWx1ZSBhcyBJVG9rZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUUGFyc2VyUnVsZVJldHVyblNjb3BlLlNldFN0b3AoY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBGU3RvcCA6PSBWYWx1ZSBhcyBJVG9rZW47CitlbmQ7CisKK3sgVFRva2VuUmV3cml0ZVN0cmVhbSB9CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkRlbGV0ZShjb25zdCBTdGFydCwgU3RvcDogSVRva2VuKTsKK2JlZ2luCisgIERlbGV0ZShERUZBVUxUX1BST0dSQU1fTkFNRSwgU3RhcnQsIFN0b3ApOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5EZWxldGUoY29uc3QgSW5kZXhUOiBJVG9rZW4pOworYmVnaW4KKyAgRGVsZXRlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBJbmRleFQsIEluZGV4VCk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUb2tlblJld3JpdGVTdHJlYW0uQ3JlYXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBJbml0OworZW5kOworCitjb25zdHJ1Y3RvciBUVG9rZW5SZXdyaXRlU3RyZWFtLkNyZWF0ZShjb25zdCBBVG9rZW5Tb3VyY2U6IElUb2tlblNvdXJjZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFUb2tlblNvdXJjZSk7CisgIEluaXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUb2tlblJld3JpdGVTdHJlYW0uQ3JlYXRlKGNvbnN0IEFMZXhlcjogSUxleGVyKTsKK2JlZ2luCisgIENyZWF0ZShBTGV4ZXIgYXMgSVRva2VuU291cmNlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRva2VuUmV3cml0ZVN0cmVhbS5DcmVhdGUoY29uc3QgQUxleGVyOiBJTGV4ZXI7CisgIGNvbnN0IEFDaGFubmVsOiBJbnRlZ2VyKTsKK2JlZ2luCisgIENyZWF0ZShBTGV4ZXIgYXMgSVRva2VuU291cmNlLCBBQ2hhbm5lbCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uQ2F0T3BUZXh0KGNvbnN0IEEsIEI6IElBTlRMUkludGVyZmFjZSk6IElBTlRMUkludGVyZmFjZTsKK3ZhcgorICBYLCBZOiBTdHJpbmc7CitiZWdpbgorICBpZiBBc3NpZ25lZChBKSB0aGVuCisgICAgWCA6PSBBLlRvU3RyaW5nCisgIGVsc2UKKyAgICBYIDo9ICcnOworCisgIGlmIEFzc2lnbmVkKEIpIHRoZW4KKyAgICBZIDo9IEIuVG9TdHJpbmcKKyAgZWxzZQorICAgIFkgOj0gJyc7CisKKyAgUmVzdWx0IDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoWCArIFkpOworZW5kOworCitjb25zdHJ1Y3RvciBUVG9rZW5SZXdyaXRlU3RyZWFtLkNyZWF0ZShjb25zdCBBVG9rZW5Tb3VyY2U6IElUb2tlblNvdXJjZTsKKyAgY29uc3QgQUNoYW5uZWw6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBVG9rZW5Tb3VyY2UsIEFDaGFubmVsKTsKKyAgSW5pdDsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uRGVsZXRlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFN0YXJ0LAorICBTdG9wOiBJVG9rZW4pOworYmVnaW4KKyAgUmVwbGFjZShQcm9ncmFtTmFtZSwgU3RhcnQsIFN0b3AsIG5pbCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkRlbGV0ZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwKKyAgU3RvcDogSW50ZWdlcik7CitiZWdpbgorICBSZXBsYWNlKFByb2dyYW1OYW1lLCBTdGFydCwgU3RvcCwgbmlsKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uRGVsZXRlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTsKK2JlZ2luCisgIERlbGV0ZShERUZBVUxUX1BST0dSQU1fTkFNRSwgU3RhcnQsIFN0b3ApOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5EZWxldGUoY29uc3QgSW5kZXg6IEludGVnZXIpOworYmVnaW4KKyAgRGVsZXRlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBJbmRleCwgSW5kZXgpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5EZWxldGVQcm9ncmFtKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmcpOworYmVnaW4KKyAgUm9sbGJhY2soUHJvZ3JhbU5hbWUsIE1JTl9UT0tFTl9JTkRFWCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkRlbGV0ZVByb2dyYW07CitiZWdpbgorICBEZWxldGVQcm9ncmFtKERFRkFVTFRfUFJPR1JBTV9OQU1FKTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5HZXRMYXN0UmV3cml0ZVRva2VuSW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gR2V0TGFzdFJld3JpdGVUb2tlbkluZGV4KERFRkFVTFRfUFJPR1JBTV9OQU1FKTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5HZXRLaW5kT2ZPcHMoCisgIGNvbnN0IFJld3JpdGVzOiBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj47CisgIGNvbnN0IEtpbmQ6IFRHVUlEKTogSUxpc3Q8SVJld3JpdGVPcGVyYXRpb24+OworYmVnaW4KKyAgUmVzdWx0IDo9IEdldEtpbmRPZk9wcyhSZXdyaXRlcywgS2luZCwgUmV3cml0ZXMuQ291bnQpOworZW5kOworCitmdW5jdGlvbiBUVG9rZW5SZXdyaXRlU3RyZWFtLkdldEtpbmRPZk9wcygKKyAgY29uc3QgUmV3cml0ZXM6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsgY29uc3QgS2luZDogVEdVSUQ7CisgIGNvbnN0IEJlZm9yZTogSW50ZWdlcik6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsKK3ZhcgorICBJOiBJbnRlZ2VyOworICBPcDogSVJld3JpdGVPcGVyYXRpb247CisgIE9iajogSUludGVyZmFjZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBUTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj4uQ3JlYXRlOworICBJIDo9IDA7CisgIHdoaWxlIChJIDwgQmVmb3JlKSBhbmQgKEkgPCBSZXdyaXRlcy5Db3VudCkgZG8KKyAgYmVnaW4KKyAgICBPcCA6PSBSZXdyaXRlc1tJXTsKKyAgICBpZiBBc3NpZ25lZChPcCkgYW5kIChPcC5RdWVyeUludGVyZmFjZShLaW5kLCBPYmopID0gMCkgdGhlbgorICAgICAgUmVzdWx0LkFkZChPcCk7CisgICAgSW5jKEkpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uR2V0TGFzdFJld3JpdGVUb2tlbkluZGV4KAorICBjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIChub3QgRkxhc3RSZXdyaXRlVG9rZW5JbmRleGVzLlRyeUdldFZhbHVlKFByb2dyYW1OYW1lLCBSZXN1bHQpKSB0aGVuCisgICAgUmVzdWx0IDo9IC0xOworZW5kOworCitmdW5jdGlvbiBUVG9rZW5SZXdyaXRlU3RyZWFtLkdldFByb2dyYW0oCisgIGNvbnN0IE5hbWU6IFN0cmluZyk6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsKK3ZhcgorICBJbnN0cnVjdGlvblN0cmVhbTogSUxpc3Q8SVJld3JpdGVPcGVyYXRpb24+OworYmVnaW4KKyAgSW5zdHJ1Y3Rpb25TdHJlYW0gOj0gRlByb2dyYW1zW05hbWVdOworICBpZiAoSW5zdHJ1Y3Rpb25TdHJlYW0gPSBuaWwpIHRoZW4KKyAgICBJbnN0cnVjdGlvblN0cmVhbSA6PSBJbml0aWFsaXplUHJvZ3JhbShOYW1lKTsKKyAgUmVzdWx0IDo9IEluc3RydWN0aW9uU3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5JbnNlcnRBZnRlcihjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOworICBjb25zdCBUOiBJVG9rZW47IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBJbnNlcnRBZnRlcihQcm9ncmFtTmFtZSwgVC5Ub2tlbkluZGV4LCBUZXh0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uSW5pdDsKK3ZhcgorICBMaXN0OiBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj47CitiZWdpbgorICBGUHJvZ3JhbXMgOj0gVERpY3Rpb25hcnk8U3RyaW5nLCBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj4+LkNyZWF0ZTsKKyAgTGlzdCA6PSBUTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj4uQ3JlYXRlOworICBMaXN0LkNhcGFjaXR5IDo9IFBST0dSQU1fSU5JVF9TSVpFOworICBGUHJvZ3JhbXMuQWRkKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBMaXN0KTsKKyAgRkxhc3RSZXdyaXRlVG9rZW5JbmRleGVzIDo9IFREaWN0aW9uYXJ5PFN0cmluZywgSW50ZWdlcj4uQ3JlYXRlOworZW5kOworCitmdW5jdGlvbiBUVG9rZW5SZXdyaXRlU3RyZWFtLkluaXRpYWxpemVQcm9ncmFtKAorICBjb25zdCBOYW1lOiBTdHJpbmcpOiBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj47CitiZWdpbgorICBSZXN1bHQgOj0gVExpc3Q8SVJld3JpdGVPcGVyYXRpb24+LkNyZWF0ZTsKKyAgUmVzdWx0LkNhcGFjaXR5IDo9IFBST0dSQU1fSU5JVF9TSVpFOworICBGUHJvZ3JhbXNbTmFtZV0gOj0gUmVzdWx0OworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5JbnNlcnRBZnRlcihjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOworICBjb25zdCBJbmRleDogSW50ZWdlcjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIC8vIHRvIGluc2VydCBhZnRlciwganVzdCBpbnNlcnQgYmVmb3JlIG5leHQgaW5kZXggKGV2ZW4gaWYgcGFzdCBlbmQpCisgIEluc2VydEJlZm9yZShQcm9ncmFtTmFtZSwgSW5kZXggKyAxLCBUZXh0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uSW5zZXJ0QWZ0ZXIoY29uc3QgVDogSVRva2VuOworICBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgSW5zZXJ0QWZ0ZXIoREVGQVVMVF9QUk9HUkFNX05BTUUsIFQsIFRleHQpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5JbnNlcnRBZnRlcihjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIEluc2VydEFmdGVyKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBJbmRleCwgVGV4dCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkluc2VydEJlZm9yZShjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIEluc2VydEJlZm9yZShERUZBVUxUX1BST0dSQU1fTkFNRSwgSW5kZXgsIFRleHQpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5JbnNlcnRCZWZvcmUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgY29uc3QgVDogSVRva2VuOyBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgSW5zZXJ0QmVmb3JlKFByb2dyYW1OYW1lLCBULlRva2VuSW5kZXgsIFRleHQpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5JbnNlcnRCZWZvcmUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgY29uc3QgSW5kZXg6IEludGVnZXI7IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7Cit2YXIKKyAgT3A6IElSZXdyaXRlT3BlcmF0aW9uOworYmVnaW4KKyAgT3AgOj0gVEluc2VydEJlZm9yZU9wLkNyZWF0ZShJbmRleCwgVGV4dCwgU2VsZik7CisgIEdldFByb2dyYW0oUHJvZ3JhbU5hbWUpLkFkZChPcCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkluc2VydEJlZm9yZShjb25zdCBUOiBJVG9rZW47CisgIGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBJbnNlcnRCZWZvcmUoREVGQVVMVF9QUk9HUkFNX05BTUUsIFQsIFRleHQpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5SZXBsYWNlKGNvbnN0IFN0YXJ0LCBTdG9wOiBJVG9rZW47CisgIGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBSZXBsYWNlKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBTdG9wLCBTdG9wLCBUZXh0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBJbmRleFQ6IElUb2tlbjsKKyAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIFJlcGxhY2UoREVGQVVMVF9QUk9HUkFNX05BTUUsIEluZGV4VCwgSW5kZXhULCBUZXh0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwKKyAgU3RvcDogSW50ZWdlcjsgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsKK3ZhcgorICBPcDogSVJld3JpdGVPcGVyYXRpb247CisgIFJld3JpdGVzOiBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj47CitiZWdpbgorICBpZiAoU3RhcnQgPiBTdG9wKSBvciAoU3RhcnQgPCAwKSBvciAoU3RvcCA8IDApIG9yIChTdG9wID49IEdldFRva2Vucy5Db3VudCkgdGhlbgorICAgIHJhaXNlIEVBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uQ3JlYXRlKCdyZXBsYWNlOiByYW5nZSBpbnZhbGlkOiAnCisgICAgICArIEludFRvU3RyKFN0YXJ0KSArICcuLicgKyBJbnRUb1N0cihTdG9wKSArICcoc2l6ZT0nCisgICAgICArIEludFRvU3RyKEdldFRva2Vucy5Db3VudCkgKyAnKScpOworCisgIE9wIDo9IFRSZXBsYWNlT3AuQ3JlYXRlKFN0YXJ0LCBTdG9wLCBUZXh0LCBTZWxmKTsKKyAgUmV3cml0ZXMgOj0gR2V0UHJvZ3JhbShQcm9ncmFtTmFtZSk7CisgIE9wLkluc3RydWN0aW9uSW5kZXggOj0gUmV3cml0ZXMuQ291bnQ7CisgIFJld3JpdGVzLkFkZChPcCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uUmVkdWNlVG9TaW5nbGVPcGVyYXRpb25QZXJJbmRleCgKKyAgY29uc3QgUmV3cml0ZXM6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPik6IElEaWN0aW9uYXJ5PEludGVnZXIsIElSZXdyaXRlT3BlcmF0aW9uPjsKK3ZhcgorICBJLCBKOiBJbnRlZ2VyOworICBPcDogSVJld3JpdGVPcGVyYXRpb247CisgIFJPcCwgUHJldlJPcDogSVJlcGxhY2VPcDsKKyAgSU9wLCBQcmV2SU9wOiBJSW5zZXJ0QmVmb3JlT3A7CisgIEluc2VydHMsIFByZXZJbnNlcnRzLCBQcmV2UmVwbGFjZXM6IElMaXN0PElSZXdyaXRlT3BlcmF0aW9uPjsKKyAgRGlzam9pbnQsIFNhbWU6IEJvb2xlYW47CitiZWdpbgorICAvLyBXQUxLIFJFUExBQ0VTCisgIGZvciBJIDo9IDAgdG8gUmV3cml0ZXMuQ291bnQgLSAxIGRvCisgIGJlZ2luCisgICAgT3AgOj0gUmV3cml0ZXNbSV07CisgICAgaWYgKE9wID0gbmlsKSB0aGVuCisgICAgICBDb250aW51ZTsKKyAgICBpZiAobm90IFN1cHBvcnRzKE9wLCBJUmVwbGFjZU9wLCBST3ApKSB0aGVuCisgICAgICBDb250aW51ZTsKKworICAgIC8vIFdpcGUgcHJpb3IgaW5zZXJ0cyB3aXRoaW4gcmFuZ2UKKyAgICBJbnNlcnRzIDo9IEdldEtpbmRPZk9wcyhSZXdyaXRlcywgSUluc2VydEJlZm9yZU9wLCBJKTsKKyAgICBmb3IgSiA6PSAwIHRvIEluc2VydHMuQ291bnQgLSAxIGRvCisgICAgYmVnaW4KKyAgICAgIElPcCA6PSBJbnNlcnRzW0pdIGFzIElJbnNlcnRCZWZvcmVPcDsKKyAgICAgIGlmIChJT3AuSW5kZXggPj0gUk9wLkluZGV4KSBhbmQgKElPcC5JbmRleCA8PSBST3AuTGFzdEluZGV4KSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICAvLyBkZWxldGUgaW5zZXJ0IGFzIGl0J3MgYSBuby1vcC4KKyAgICAgICAgUmV3cml0ZXNbSU9wLkluc3RydWN0aW9uSW5kZXhdIDo9IG5pbDsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICAvLyBEcm9wIGFueSBwcmlvciByZXBsYWNlcyBjb250YWluZWQgd2l0aGluCisgICAgUHJldlJlcGxhY2VzIDo9IEdldEtpbmRPZk9wcyhSZXdyaXRlcywgSVJlcGxhY2VPcCwgSSk7CisgICAgZm9yIEogOj0gMCB0byBQcmV2UmVwbGFjZXMuQ291bnQgLSAxIGRvCisgICAgYmVnaW4KKyAgICAgIFByZXZST3AgOj0gUHJldlJlcGxhY2VzW0pdIGFzIElSZXBsYWNlT3A7CisgICAgICBpZiAoUHJldlJPcC5JbmRleCA+PSBST3AuSW5kZXgpIGFuZCAoUHJldlJPcC5MYXN0SW5kZXggPD0gUk9wLkxhc3RJbmRleCkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgLy8gZGVsZXRlIHJlcGxhY2UgYXMgaXQncyBhIG5vLW9wLgorICAgICAgICBSZXdyaXRlc1tQcmV2Uk9wLkluc3RydWN0aW9uSW5kZXhdIDo9IG5pbDsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisgICAgICAvLyB0aHJvdyBleGNlcHRpb24gdW5sZXNzIGRpc2pvaW50IG9yIGlkZW50aWNhbAorICAgICAgRGlzam9pbnQgOj0gKFByZXZST3AuTGFzdEluZGV4IDwgUk9wLkluZGV4KSBvciAoUHJldlJPcC5JbmRleCA+IFJPcC5MYXN0SW5kZXgpOworICAgICAgU2FtZSA6PSAoUHJldlJPcC5JbmRleCA9IFJPcC5JbmRleCkgYW5kIChQcmV2Uk9wLkxhc3RJbmRleCA9IFJPcC5MYXN0SW5kZXgpOworICAgICAgaWYgKG5vdCBEaXNqb2ludCkgYW5kIChub3QgU2FtZSkgdGhlbgorICAgICAgICByYWlzZSBFQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLkNyZWF0ZSgncmVwbGFjZSBvZiBib3VuZGFyaWVzIG9mICcKKyAgICAgICAgICArIFJPcC5Ub1N0cmluZyArICcgb3ZlcmxhcCB3aXRoIHByZXZpb3VzICcgKyBQcmV2Uk9wLlRvU3RyaW5nKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBXQUxLIElOU0VSVFMKKyAgZm9yIEkgOj0gMCB0byBSZXdyaXRlcy5Db3VudCAtIDEgZG8KKyAgYmVnaW4KKyAgICBPcCA6PSBSZXdyaXRlc1tJXTsKKyAgICBpZiAoT3AgPSBuaWwpIHRoZW4KKyAgICAgIENvbnRpbnVlOworICAgIGlmIChub3QgU3VwcG9ydHMoT3AsIElJbnNlcnRCZWZvcmVPcCwgSU9wKSkgdGhlbgorICAgICAgQ29udGludWU7CisKKyAgICAvLyBjb21iaW5lIGN1cnJlbnQgaW5zZXJ0IHdpdGggcHJpb3IgaWYgYW55IGF0IHNhbWUgaW5kZXgKKyAgICBQcmV2SW5zZXJ0cyA6PSBHZXRLaW5kT2ZPcHMoUmV3cml0ZXMsIElJbnNlcnRCZWZvcmVPcCwgSSk7CisgICAgZm9yIEogOj0gMCB0byBQcmV2SW5zZXJ0cy5Db3VudCAtIDEgZG8KKyAgICBiZWdpbgorICAgICAgUHJldklPcCA6PSBQcmV2SW5zZXJ0c1tKXSBhcyBJSW5zZXJ0QmVmb3JlT3A7CisgICAgICBpZiAoUHJldklPcC5JbmRleCA9IElPcC5JbmRleCkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgLy8gY29tYmluZSBvYmplY3RzCisgICAgICAgIC8vIGNvbnZlcnQgdG8gc3RyaW5ncy4uLndlJ3JlIGluIHByb2Nlc3Mgb2YgdG9TdHJpbmcnaW5nCisgICAgICAgIC8vIHdob2xlIHRva2VuIGJ1ZmZlciBzbyBubyBsYXp5IGV2YWwgaXNzdWUgd2l0aCBhbnkgdGVtcGxhdGVzCisgICAgICAgIElPcC5UZXh0IDo9IENhdE9wVGV4dChJT3AuVGV4dCwgUHJldklPcC5UZXh0KTsKKyAgICAgICAgLy8gZGVsZXRlIHJlZHVuZGFudCBwcmlvciBpbnNlcnQKKyAgICAgICAgUmV3cml0ZXNbUHJldklPcC5JbnN0cnVjdGlvbkluZGV4XSA6PSBuaWw7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgLy8gbG9vayBmb3IgcmVwbGFjZXMgd2hlcmUgaW9wLmluZGV4IGlzIGluIHJhbmdlOyBlcnJvcgorICAgIFByZXZSZXBsYWNlcyA6PSBHZXRLaW5kT2ZPcHMoUmV3cml0ZXMsIElSZXBsYWNlT3AsIEkpOworICAgIGZvciBKIDo9IDAgdG8gUHJldlJlcGxhY2VzLkNvdW50IC0gMSBkbworICAgIGJlZ2luCisgICAgICBSb3AgOj0gUHJldlJlcGxhY2VzW0pdIGFzIElSZXBsYWNlT3A7CisgICAgICBpZiAoSU9wLkluZGV4ID0gUk9wLkluZGV4KSB0aGVuCisgICAgICBiZWdpbgorICAgICAgICBST3AuVGV4dCA6PSBDYXRPcFRleHQoSU9wLlRleHQsIFJPcC5UZXh0KTsKKyAgICAgICAgUmV3cml0ZXNbSV0gOj0gbmlsOyAgLy8gZGVsZXRlIGN1cnJlbnQgaW5zZXJ0CisgICAgICAgIENvbnRpbnVlOworICAgICAgZW5kOworICAgICAgaWYgKElPcC5JbmRleCA+PSBST3AuSW5kZXgpIGFuZCAoSU9wLkluZGV4IDw9IFJPcC5MYXN0SW5kZXgpIHRoZW4KKyAgICAgICAgcmFpc2UgRUFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbi5DcmVhdGUoJ2luc2VydCBvcCAnCisgICAgICAgICAgKyBJT3AuVG9TdHJpbmcgKyAnIHdpdGhpbiBib3VuZGFyaWVzIG9mIHByZXZpb3VzICcgKyBST3AuVG9TdHJpbmcpOworICAgIGVuZDsKKyAgZW5kOworCisgIFJlc3VsdCA6PSBURGljdGlvbmFyeTxJbnRlZ2VyLCBJUmV3cml0ZU9wZXJhdGlvbj4uQ3JlYXRlOworICBmb3IgT3AgaW4gUmV3cml0ZXMgZG8KKyAgYmVnaW4KKyAgICBpZiAoT3AgPSBuaWwpIHRoZW4KKyAgICAgIENvbnRpbnVlOyAvLyBpZ25vcmUgZGVsZXRlZCBvcHMKKyAgICBpZiAoUmVzdWx0LkNvbnRhaW5zS2V5KE9wLkluZGV4KSkgdGhlbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnc2hvdWxkIG9ubHkgYmUgb25lIG9wIHBlciBpbmRleCcpOworICAgIFJlc3VsdC5BZGQoT3AuSW5kZXgsIE9wKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5SZXBsYWNlKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7IGNvbnN0IFN0YXJ0LAorICBTdG9wOiBJVG9rZW47IGNvbnN0IFRleHQ6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBSZXBsYWNlKFByb2dyYW1OYW1lLCBTdGFydC5Ub2tlbkluZGV4LCBTdG9wLlRva2VuSW5kZXgsIFRleHQpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5SZXBsYWNlKGNvbnN0IEluZGV4OiBJbnRlZ2VyOworICBjb25zdCBUZXh0OiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgUmVwbGFjZShERUZBVUxUX1BST0dSQU1fTkFNRSwgSW5kZXgsIEluZGV4LCBUZXh0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcjsKKyAgY29uc3QgVGV4dDogSUFOVExSSW50ZXJmYWNlKTsKK2JlZ2luCisgIFJlcGxhY2UoREVGQVVMVF9QUk9HUkFNX05BTUUsIFN0YXJ0LCBTdG9wLCBUZXh0KTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUm9sbGJhY2soY29uc3QgSW5zdHJ1Y3Rpb25JbmRleDogSW50ZWdlcik7CitiZWdpbgorICBSb2xsYmFjayhERUZBVUxUX1BST0dSQU1fTkFNRSwgSW5zdHJ1Y3Rpb25JbmRleCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLlJvbGxiYWNrKGNvbnN0IFByb2dyYW1OYW1lOiBTdHJpbmc7CisgIGNvbnN0IEluc3RydWN0aW9uSW5kZXg6IEludGVnZXIpOwordmFyCisgIEluc3RydWN0aW9uU3RyZWFtOiBJTGlzdDxJUmV3cml0ZU9wZXJhdGlvbj47CitiZWdpbgorICBJbnN0cnVjdGlvblN0cmVhbSA6PSBGUHJvZ3JhbXNbUHJvZ3JhbU5hbWVdOworICBpZiBBc3NpZ25lZChJbnN0cnVjdGlvblN0cmVhbSkgdGhlbgorICAgIEZQcm9ncmFtc1tQcm9ncmFtTmFtZV0gOj0gSW5zdHJ1Y3Rpb25TdHJlYW0uR2V0UmFuZ2UoTUlOX1RPS0VOX0lOREVYLAorICAgICAgSW5zdHJ1Y3Rpb25JbmRleCAtIE1JTl9UT0tFTl9JTkRFWCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLlNldExhc3RSZXdyaXRlVG9rZW5JbmRleCgKKyAgY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgSTogSW50ZWdlcik7CitiZWdpbgorICBGTGFzdFJld3JpdGVUb2tlbkluZGV4ZXNbUHJvZ3JhbU5hbWVdIDo9IEk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uVG9EZWJ1Z1N0cmluZzogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IFRvRGVidWdTdHJpbmcoTUlOX1RPS0VOX0lOREVYLCBTaXplIC0gMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uVG9EZWJ1Z1N0cmluZyhjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcik6IFN0cmluZzsKK3ZhcgorICBCdWY6IFRTdHJpbmdCdWlsZGVyOworICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgQnVmIDo9IFRTdHJpbmdCdWlsZGVyLkNyZWF0ZTsKKyAgdHJ5CisgICAgaWYgKFN0YXJ0ID49IE1JTl9UT0tFTl9JTkRFWCkgdGhlbgorICAgICAgZm9yIEkgOj0gU3RhcnQgdG8gTWluKFN0b3AsR2V0VG9rZW5zLkNvdW50IC0gMSkgZG8KKyAgICAgICAgQnVmLkFwcGVuZChHZXQoSSkuVG9TdHJpbmcpOworICBmaW5hbGx5CisgICAgQnVmLkZyZWU7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5Ub09yaWdpbmFsU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gVG9PcmlnaW5hbFN0cmluZyhNSU5fVE9LRU5fSU5ERVgsIFNpemUgLSAxKTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5Ub09yaWdpbmFsU3RyaW5nKGNvbnN0IFN0YXJ0LAorICBTdG9wOiBJbnRlZ2VyKTogU3RyaW5nOwordmFyCisgIEJ1ZjogVFN0cmluZ0J1aWxkZXI7CisgIEk6IEludGVnZXI7CitiZWdpbgorICBCdWYgOj0gVFN0cmluZ0J1aWxkZXIuQ3JlYXRlOworICB0cnkKKyAgICBpZiAoU3RhcnQgPj0gTUlOX1RPS0VOX0lOREVYKSB0aGVuCisgICAgICBmb3IgSSA6PSBTdGFydCB0byBNaW4oU3RvcCwgR2V0VG9rZW5zLkNvdW50IC0gMSkgZG8KKyAgICAgICAgQnVmLkFwcGVuZChHZXQoSSkuVGV4dCk7CisgICAgUmVzdWx0IDo9IEJ1Zi5Ub1N0cmluZzsKKyAgZmluYWxseQorICAgIEJ1Zi5GcmVlOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uVG9TdHJpbmc6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBUb1N0cmluZyhNSU5fVE9LRU5fSU5ERVgsIFNpemUgLSAxKTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5Ub1N0cmluZyhjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nKTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IFRvU3RyaW5nKFByb2dyYW1OYW1lLCBNSU5fVE9LRU5fSU5ERVgsIFNpemUgLSAxKTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5Ub1N0cmluZyhjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwKKyAgU3RvcDogSW50ZWdlcik6IFN0cmluZzsKK3ZhcgorICBSZXdyaXRlczogSUxpc3Q8SVJld3JpdGVPcGVyYXRpb24+OworICBJLCBTdGFydEluZGV4LCBTdG9wSW5kZXg6IEludGVnZXI7CisgIEluZGV4VG9PcDogSURpY3Rpb25hcnk8SW50ZWdlciwgSVJld3JpdGVPcGVyYXRpb24+OworICBCdWY6IFRTdHJpbmdCdWlsZGVyOworICBUb2tlbnM6IElMaXN0PElUb2tlbj47CisgIFQ6IElUb2tlbjsKKyAgT3A6IElSZXdyaXRlT3BlcmF0aW9uOworICBQYWlyOiBUUGFpcjxJbnRlZ2VyLCBJUmV3cml0ZU9wZXJhdGlvbj47CitiZWdpbgorICBSZXdyaXRlcyA6PSBGUHJvZ3JhbXNbUHJvZ3JhbU5hbWVdOworICBUb2tlbnMgOj0gR2V0VG9rZW5zOworICAvLyBlbnN1cmUgc3RhcnQvZW5kIGFyZSBpbiByYW5nZQorICBTdG9wSW5kZXggOj0gTWluKFN0b3AsVG9rZW5zLkNvdW50IC0gMSk7CisgIFN0YXJ0SW5kZXggOj0gTWF4KFN0YXJ0LDApOworCisgIGlmIChSZXdyaXRlcyA9IG5pbCkgb3IgKFJld3JpdGVzLkNvdW50ID0gMCkgdGhlbgorICBiZWdpbgorICAgICAvLyBubyBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZQorICAgIFJlc3VsdCA6PSBUb09yaWdpbmFsU3RyaW5nKFN0YXJ0SW5kZXgsIFN0b3BJbmRleCk7CisgICAgRXhpdDsKKyAgZW5kOworCisgIEJ1ZiA6PSBUU3RyaW5nQnVpbGRlci5DcmVhdGU7CisgIHRyeQorICAgIC8vIEZpcnN0LCBvcHRpbWl6ZSBpbnN0cnVjdGlvbiBzdHJlYW0KKyAgICBJbmRleFRvT3AgOj0gUmVkdWNlVG9TaW5nbGVPcGVyYXRpb25QZXJJbmRleChSZXdyaXRlcyk7CisKKyAgICAvLyBXYWxrIGJ1ZmZlciwgZXhlY3V0aW5nIGluc3RydWN0aW9ucyBhbmQgZW1pdHRpbmcgdG9rZW5zCisgICAgSSA6PSBTdGFydEluZGV4OworICAgIHdoaWxlIChJIDw9IFN0b3BJbmRleCkgYW5kIChJIDwgVG9rZW5zLkNvdW50KSBkbworICAgIGJlZ2luCisgICAgICBpZiAobm90IEluZGV4VG9PcC5UcnlHZXRWYWx1ZShJLCBPcCkpIHRoZW4KKyAgICAgICAgT3AgOj0gbmlsOworICAgICAgSW5kZXhUb09wLlJlbW92ZShJKTsgLy8gcmVtb3ZlIHNvIGFueSBsZWZ0IGhhdmUgaW5kZXggc2l6ZS0xCisgICAgICBUIDo9IFRva2Vuc1tJXTsKKyAgICAgIGlmIChPcCA9IG5pbCkgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgLy8gbm8gb3BlcmF0aW9uIGF0IHRoYXQgaW5kZXgsIGp1c3QgZHVtcCB0b2tlbgorICAgICAgICBCdWYuQXBwZW5kKFQuVGV4dCk7CisgICAgICAgIEluYyhJKTsgLy8gbW92ZSB0byBuZXh0IHRva2VuCisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgSSA6PSBPcC5FeGVjdXRlKEJ1Zik7IC8vIGV4ZWN1dGUgb3BlcmF0aW9uIGFuZCBza2lwCisgICAgZW5kOworCisgICAgLy8gaW5jbHVkZSBzdHVmZiBhZnRlciBlbmQgaWYgaXQncyBsYXN0IGluZGV4IGluIGJ1ZmZlcgorICAgIC8vIFNvLCBpZiB0aGV5IGRpZCBhbiBpbnNlcnRBZnRlcihsYXN0VmFsaWRJbmRleCwgImZvbyIpLCBpbmNsdWRlCisgICAgLy8gZm9vIGlmIGVuZD09bGFzdFZhbGlkSW5kZXguCisgICAgaWYgKFN0b3BJbmRleCA9IFRva2Vucy5Db3VudCAtIDEpIHRoZW4KKyAgICBiZWdpbgorICAgICAgLy8gU2NhbiBhbnkgcmVtYWluaW5nIG9wZXJhdGlvbnMgYWZ0ZXIgbGFzdCB0b2tlbgorICAgICAgLy8gc2hvdWxkIGJlIGluY2x1ZGVkICh0aGV5IHdpbGwgYmUgaW5zZXJ0cykuCisgICAgICBmb3IgUGFpciBpbiBJbmRleFRvT3AgZG8KKyAgICAgIGJlZ2luCisgICAgICAgIGlmIChQYWlyLlZhbHVlLkluZGV4ID49IFRva2Vucy5Db3VudCAtIDEpIHRoZW4KKyAgICAgICAgICBCdWYuQXBwZW5kKFBhaXIuVmFsdWUuVGV4dC5Ub1N0cmluZyk7CisgICAgICBlbmQ7CisgICAgZW5kOworICAgIFJlc3VsdCA6PSBCdWYuVG9TdHJpbmc7CisgIGZpbmFsbHkKKyAgICBCdWYuRnJlZTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVG9rZW5SZXdyaXRlU3RyZWFtLlRvU3RyaW5nKGNvbnN0IFN0YXJ0LCBTdG9wOiBJbnRlZ2VyKTogU3RyaW5nOworYmVnaW4KKyAgUmVzdWx0IDo9IFRvU3RyaW5nKERFRkFVTFRfUFJPR1JBTV9OQU1FLCBTdGFydCwgU3RvcCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkluc2VydEJlZm9yZShjb25zdCBJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgVGV4dDogU3RyaW5nKTsKK3ZhcgorICBTOiBJQU5UTFJTdHJpbmc7CitiZWdpbgorICBTIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoVGV4dCk7CisgIEluc2VydEJlZm9yZShJbmRleCwgUyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkluc2VydEJlZm9yZShjb25zdCBUOiBJVG9rZW47IGNvbnN0IFRleHQ6IFN0cmluZyk7Cit2YXIKKyAgUzogSUFOVExSU3RyaW5nOworYmVnaW4KKyAgUyA6PSBUQU5UTFJTdHJpbmcuQ3JlYXRlKFRleHQpOworICBJbnNlcnRCZWZvcmUoVCwgUyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLkluc2VydEJlZm9yZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOworICBjb25zdCBJbmRleDogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTsKK3ZhcgorICBTOiBJQU5UTFJTdHJpbmc7CitiZWdpbgorICBTIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoVGV4dCk7CisgIEluc2VydEJlZm9yZShQcm9ncmFtTmFtZSwgSW5kZXgsIFMpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5JbnNlcnRCZWZvcmUoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgY29uc3QgVDogSVRva2VuOyBjb25zdCBUZXh0OiBTdHJpbmcpOwordmFyCisgIFM6IElBTlRMUlN0cmluZzsKK2JlZ2luCisgIFMgOj0gVEFOVExSU3RyaW5nLkNyZWF0ZShUZXh0KTsKKyAgSW5zZXJ0QmVmb3JlKFByb2dyYW1OYW1lLCBULCBTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uSW5zZXJ0QWZ0ZXIoY29uc3QgSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IFRleHQ6IFN0cmluZyk7Cit2YXIKKyAgUzogSUFOVExSU3RyaW5nOworYmVnaW4KKyAgUyA6PSBUQU5UTFJTdHJpbmcuQ3JlYXRlKFRleHQpOworICBJbnNlcnRBZnRlcihJbmRleCxTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uSW5zZXJ0QWZ0ZXIoY29uc3QgVDogSVRva2VuOyBjb25zdCBUZXh0OiBTdHJpbmcpOwordmFyCisgIFM6IElBTlRMUlN0cmluZzsKK2JlZ2luCisgIFMgOj0gVEFOVExSU3RyaW5nLkNyZWF0ZShUZXh0KTsKKyAgSW5zZXJ0QWZ0ZXIoVCxTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uSW5zZXJ0QWZ0ZXIoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgY29uc3QgSW5kZXg6IEludGVnZXI7IGNvbnN0IFRleHQ6IFN0cmluZyk7Cit2YXIKKyAgUzogSUFOVExSU3RyaW5nOworYmVnaW4KKyAgUyA6PSBUQU5UTFJTdHJpbmcuQ3JlYXRlKFRleHQpOworICBJbnNlcnRBZnRlcihQcm9ncmFtTmFtZSxJbmRleCxTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uSW5zZXJ0QWZ0ZXIoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsKKyAgY29uc3QgVDogSVRva2VuOyBjb25zdCBUZXh0OiBTdHJpbmcpOwordmFyCisgIFM6IElBTlRMUlN0cmluZzsKK2JlZ2luCisgIFMgOj0gVEFOVExSU3RyaW5nLkNyZWF0ZShUZXh0KTsKKyAgSW5zZXJ0QWZ0ZXIoUHJvZ3JhbU5hbWUsVCxTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBJbmRleFQ6IElUb2tlbjsgY29uc3QgVGV4dDogU3RyaW5nKTsKK3ZhcgorICBTOiBJQU5UTFJTdHJpbmc7CitiZWdpbgorICBTIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoVGV4dCk7CisgIFJlcGxhY2UoSW5kZXhULCBTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBTdGFydCwgU3RvcDogSW50ZWdlcjsKKyAgY29uc3QgVGV4dDogU3RyaW5nKTsKK3ZhcgorICBTOiBJQU5UTFJTdHJpbmc7CitiZWdpbgorICBTIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoVGV4dCk7CisgIFJlcGxhY2UoU3RhcnQsIFN0b3AsIFMpOworZW5kOworCitwcm9jZWR1cmUgVFRva2VuUmV3cml0ZVN0cmVhbS5SZXBsYWNlKGNvbnN0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBUZXh0OiBTdHJpbmcpOwordmFyCisgIFM6IElBTlRMUlN0cmluZzsKK2JlZ2luCisgIFMgOj0gVEFOVExSU3RyaW5nLkNyZWF0ZShUZXh0KTsKKyAgUmVwbGFjZShJbmRleCwgUyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLlJlcGxhY2UoY29uc3QgUHJvZ3JhbU5hbWU6IFN0cmluZzsgY29uc3QgU3RhcnQsCisgIFN0b3A6IElUb2tlbjsgY29uc3QgVGV4dDogU3RyaW5nKTsKK3ZhcgorICBTOiBJQU5UTFJTdHJpbmc7CitiZWdpbgorICBTIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoVGV4dCk7CisgIFJlcGxhY2UoUHJvZ3JhbU5hbWUsIFN0YXJ0LCBTdG9wLCBTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBQcm9ncmFtTmFtZTogU3RyaW5nOyBjb25zdCBTdGFydCwKKyAgU3RvcDogSW50ZWdlcjsgY29uc3QgVGV4dDogU3RyaW5nKTsKK3ZhcgorICBTOiBJQU5UTFJTdHJpbmc7CitiZWdpbgorICBTIDo9IFRBTlRMUlN0cmluZy5DcmVhdGUoVGV4dCk7CisgIFJlcGxhY2UoUHJvZ3JhbU5hbWUsIFN0YXJ0LCBTdG9wLCBTKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uUmVwbGFjZShjb25zdCBTdGFydCwgU3RvcDogSVRva2VuOworICBjb25zdCBUZXh0OiBTdHJpbmcpOwordmFyCisgIFM6IElBTlRMUlN0cmluZzsKK2JlZ2luCisgIFMgOj0gVEFOVExSU3RyaW5nLkNyZWF0ZShUZXh0KTsKKyAgUmVwbGFjZShTdGFydCwgU3RvcCwgUyk7CitlbmQ7CisKK3sgVFRva2VuUmV3cml0ZVN0cmVhbS5UUmV3cml0ZU9wZXJhdGlvbiB9CisKK2NvbnN0cnVjdG9yIFRUb2tlblJld3JpdGVTdHJlYW0uVFJld3JpdGVPcGVyYXRpb24uQ3JlYXRlKGNvbnN0IEFJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgQVRleHQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgQVBhcmVudDogSVRva2VuUmV3cml0ZVN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGSW5kZXggOj0gQUluZGV4OworICBGVGV4dCA6PSBBVGV4dDsKKyAgRlBhcmVudCA6PSBQb2ludGVyKEFQYXJlbnQpOworZW5kOworCitmdW5jdGlvbiBUVG9rZW5SZXdyaXRlU3RyZWFtLlRSZXdyaXRlT3BlcmF0aW9uLkV4ZWN1dGUoCisgIGNvbnN0IEJ1ZjogVFN0cmluZ0J1aWxkZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbmRleDsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5UUmV3cml0ZU9wZXJhdGlvbi5HZXRJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSW5kZXg7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uVFJld3JpdGVPcGVyYXRpb24uR2V0SW5zdHJ1Y3Rpb25JbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSW5zdHJ1Y3Rpb25JbmRleDsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5UUmV3cml0ZU9wZXJhdGlvbi5HZXRQYXJlbnQ6IElUb2tlblJld3JpdGVTdHJlYW07CitiZWdpbgorICBSZXN1bHQgOj0gSVRva2VuUmV3cml0ZVN0cmVhbShGUGFyZW50KTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5UUmV3cml0ZU9wZXJhdGlvbi5HZXRUZXh0OiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gRlRleHQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLlRSZXdyaXRlT3BlcmF0aW9uLlNldEluZGV4KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZJbmRleCA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uVFJld3JpdGVPcGVyYXRpb24uU2V0SW5zdHJ1Y3Rpb25JbmRleCgKKyAgY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkluc3RydWN0aW9uSW5kZXggOj0gVmFsdWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUVG9rZW5SZXdyaXRlU3RyZWFtLlRSZXdyaXRlT3BlcmF0aW9uLlNldFBhcmVudCgKKyAgY29uc3QgVmFsdWU6IElUb2tlblJld3JpdGVTdHJlYW0pOworYmVnaW4KKyAgRlBhcmVudCA6PSBQb2ludGVyKFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uVFJld3JpdGVPcGVyYXRpb24uU2V0VGV4dCgKKyAgY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7CitiZWdpbgorICBGVGV4dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5UUmV3cml0ZU9wZXJhdGlvbi5Ub1N0cmluZzogU3RyaW5nOwordmFyCisgIE9wTmFtZTogU3RyaW5nOworICBEb2xsYXJJbmRleDogSW50ZWdlcjsKK2JlZ2luCisgIE9wTmFtZSA6PSBDbGFzc05hbWU7CisgIERvbGxhckluZGV4IDo9IFBvcygnJCcsT3BOYW1lKSAtIDE7IC8vIERlbHBoaSBzdHJpbmdzIGFyZSAxLWJhc2VkCisgIGlmIChEb2xsYXJJbmRleCA+PSAwKSB0aGVuCisgICAgT3BOYW1lIDo9IENvcHkoT3BOYW1lLERvbGxhckluZGV4ICsgMSxMZW5ndGgoT3BOYW1lKSAtIChEb2xsYXJJbmRleCArIDEpKTsKKyAgUmVzdWx0IDo9ICc8JyArIE9wTmFtZSArICdAJyArIEludFRvU3RyKEZJbmRleCkgKyAnOiInICsgRlRleHQuVG9TdHJpbmcgKyAnIj4nOworZW5kOworCit7IFRUb2tlblJld3JpdGVTdHJlYW0uVFJld3JpdGVPcENvbXBhcmVyPFQ+IH0KKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5UUmV3cml0ZU9wQ29tcGFyZXI8VD4uQ29tcGFyZShjb25zdCBMZWZ0LAorICBSaWdodDogVCk6IEludGVnZXI7CitiZWdpbgorICBpZiAoTGVmdC5HZXRJbmRleCA8IFJpZ2h0LkdldEluZGV4KSB0aGVuCisgICAgUmVzdWx0IDo9IC0xCisgIGVsc2UKKyAgICBpZiAoTGVmdC5HZXRJbmRleCA+IFJpZ2h0LkdldEluZGV4KSB0aGVuCisgICAgICBSZXN1bHQgOj0gMQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSAwOworZW5kOworCit7IFRUb2tlblJld3JpdGVTdHJlYW0uVEluc2VydEJlZm9yZU9wIH0KKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5USW5zZXJ0QmVmb3JlT3AuRXhlY3V0ZSgKKyAgY29uc3QgQnVmOiBUU3RyaW5nQnVpbGRlcik6IEludGVnZXI7CitiZWdpbgorICBCdWYuQXBwZW5kKFRleHQuVG9TdHJpbmcpOworICBCdWYuQXBwZW5kKFBhcmVudC5HZXQoSW5kZXgpLlRleHQpOworICBSZXN1bHQgOj0gSW5kZXggKyAxOworZW5kOworCit7IFRUb2tlblJld3JpdGVTdHJlYW0uVFJlcGxhY2VPcCB9CisKK2NvbnN0cnVjdG9yIFRUb2tlblJld3JpdGVTdHJlYW0uVFJlcGxhY2VPcC5DcmVhdGUoY29uc3QgQVN0YXJ0LCBBU3RvcDogSW50ZWdlcjsKKyAgY29uc3QgQVRleHQ6IElBTlRMUkludGVyZmFjZTsgY29uc3QgQVBhcmVudDogSVRva2VuUmV3cml0ZVN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFTdGFydCwgQVRleHQsIEFQYXJlbnQpOworICBGTGFzdEluZGV4IDo9IEFTdG9wOworZW5kOworCitmdW5jdGlvbiBUVG9rZW5SZXdyaXRlU3RyZWFtLlRSZXBsYWNlT3AuRXhlY3V0ZSgKKyAgY29uc3QgQnVmOiBUU3RyaW5nQnVpbGRlcik6IEludGVnZXI7CitiZWdpbgorICBpZiAoVGV4dCA8PiBuaWwpIHRoZW4KKyAgICBCdWYuQXBwZW5kKFRleHQuVG9TdHJpbmcpOworICBSZXN1bHQgOj0gRkxhc3RJbmRleCArIDE7CitlbmQ7CisKK2Z1bmN0aW9uIFRUb2tlblJld3JpdGVTdHJlYW0uVFJlcGxhY2VPcC5HZXRMYXN0SW5kZXg6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxhc3RJbmRleDsKK2VuZDsKKworcHJvY2VkdXJlIFRUb2tlblJld3JpdGVTdHJlYW0uVFJlcGxhY2VPcC5TZXRMYXN0SW5kZXgoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkxhc3RJbmRleCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5UUmVwbGFjZU9wLlRvU3RyaW5nOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJzxSZXBsYWNlT3BAJyArIEludFRvU3RyKEluZGV4KSArICcuLicgKyBJbnRUb1N0cihGTGFzdEluZGV4KQorICAgICsgJzoiJyArIFRleHQuVG9TdHJpbmcgKyAnIj4nOworZW5kOworCit7IFRUb2tlblJld3JpdGVTdHJlYW0uVERlbGV0ZU9wIH0KKworZnVuY3Rpb24gVFRva2VuUmV3cml0ZVN0cmVhbS5URGVsZXRlT3AuVG9TdHJpbmc6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSAnPERlbGV0ZU9wQCcgKyBJbnRUb1N0cihJbmRleCkgKyAnLi4nICsgSW50VG9TdHIoRkxhc3RJbmRleCkgKyAnPic7CitlbmQ7CisKK3sgVXRpbGl0aWVzIH0KKwordmFyCisgIEVtcHR5VG9rZW46IElUb2tlbiA9IG5pbDsKKyAgRW1wdHlSdWxlUmV0dXJuU2NvcGU6IElSdWxlUmV0dXJuU2NvcGUgPSBuaWw7CisKK2Z1bmN0aW9uIERlZihjb25zdCBYOiBJVG9rZW4pOiBJVG9rZW47IG92ZXJsb2FkOworYmVnaW4KKyAgaWYgQXNzaWduZWQoWCkgdGhlbgorICAgIFJlc3VsdCA6PSBYCisgIGVsc2UKKyAgYmVnaW4KKyAgICBpZiAoRW1wdHlUb2tlbiA9IG5pbCkgdGhlbgorICAgICAgRW1wdHlUb2tlbiA6PSBUQ29tbW9uVG9rZW4uQ3JlYXRlOworICAgIFJlc3VsdCA6PSBFbXB0eVRva2VuOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIERlZihjb25zdCBYOiBJUnVsZVJldHVyblNjb3BlKTogSVJ1bGVSZXR1cm5TY29wZTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKFgpIHRoZW4KKyAgICBSZXN1bHQgOj0gWAorICBlbHNlCisgIGJlZ2luCisgICAgaWYgKEVtcHR5UnVsZVJldHVyblNjb3BlID0gbmlsKSB0aGVuCisgICAgICBFbXB0eVJ1bGVSZXR1cm5TY29wZSA6PSBUUnVsZVJldHVyblNjb3BlLkNyZWF0ZTsKKyAgICBSZXN1bHQgOj0gRW1wdHlSdWxlUmV0dXJuU2NvcGU7CisgIGVuZDsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KKyAgVFRva2VuLkluaXRpYWxpemU7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmEvYW50bHIuY29uZmlnIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9hbnRsci5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvYW50bHIuY29uZmlnCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhL2RveHlmaWxlIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9kb3h5ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJhOWEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9kb3h5ZmlsZQpAQCAtMCwwICsxLDI2NCBAQAorIyBEb3h5ZmlsZSAxLjUuMgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJBTlRMUiBBUEkiCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gMy40CitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gYXBpCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0gIlRoZSAkbmFtZSBjbGFzcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgd2lkZ2V0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSBmaWxlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gWUVTCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSAvQXBwbGljYXRpb25zLworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IAorU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCitKQVZBRE9DX0FVVE9CUklFRiAgICAgID0gTk8KK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworREVUQUlMU19BVF9UT1AgICAgICAgICA9IE5PCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCitTRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8KK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA4CitBTElBU0VTICAgICAgICAgICAgICAgID0gCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBZRVMKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGQgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBOTworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IE5PCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gTk8KK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBOTworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IAorTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCitTSE9XX0RJUkVDVE9SSUVTICAgICAgID0gTk8KK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJTlBVVCAgICAgICAgICAgICAgICAgID0gL1VzZXJzL3BhcnJ0L2FudGxyL2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL0phdmEvc3JjCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY3h4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5qYXZhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLml4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaSsrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlubCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmhoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmh4eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5ocHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaCsrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlkbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5vZGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoucGhwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnBocDMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaW5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICoubW0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICouZG94IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLnB5CitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCitFWENMVURFICAgICAgICAgICAgICAgID0gCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSBqYXZhOjp1dGlsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhOjppbworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorRVhBTVBMRV9QQVRURVJOUyAgICAgICA9ICoKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorRklMVEVSX1BBVFRFUk5TICAgICAgICA9IAorRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gTk8KK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBOTworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gLgorSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKK0VYVFJBX1BBQ0tBR0VTICAgICAgICAgPSAKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSAKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBOTworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCitYTUxfRFREICAgICAgICAgICAgICAgID0gCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvciAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IE5PCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSAKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKK1BSRURFRklORUQgICAgICAgICAgICAgPSAKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSAKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcyAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFHRklMRVMgICAgICAgICAgICAgICA9IAorR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBOTworTVNDR0VOX1BBVEggICAgICAgICAgICA9IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzLworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworSEFWRV9ET1QgICAgICAgICAgICAgICA9IFlFUworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworQ09MTEFCT1JBVElPTl9HUkFQSCAgICA9IFlFUworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCitET1RfUEFUSCAgICAgICAgICAgICAgID0gL0FwcGxpY2F0aW9ucy9Eb3h5Z2VuLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIHRoZSBzZWFyY2ggZW5naW5lICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmEvcG9tLnhtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhiMTNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9wb20ueG1sCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmFudGxyLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgIAorICA8IS0tCisgICAgSW5oZXJpdCBmcm9tIHRoZSBBTlRMUiBtYXN0ZXIgcG9tLCB3aGljaCB0ZWxscyB1cyB3aGF0CisgICAgdmVyc2lvbiB3ZSBhcmUgYW5kIGFsbG93cyB1cyB0byBpbmhlcml0IGRlcGVuZGVuY2llcworICAgIGFuZCBzbyBvbi4KKyAgICAtLT4KKyAgPHBhcmVudD4KKyAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudGxyLW1hc3RlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisgIAorCisgIDxuYW1lPkFudGxyIDMuNCBSdW50aW1lPC9uYW1lPgorCisgIDxkZXNjcmlwdGlvbj5BIGZyYW1ld29yayBmb3IgY29uc3RydWN0aW5nIHJlY29nbml6ZXJzLCBjb21waWxlcnMsIGFuZCB0cmFuc2xhdG9ycyBmcm9tIGdyYW1tYXRpY2FsIGRlc2NyaXB0aW9ucyBjb250YWluaW5nIEphdmEsIEMjLCBDKyssIG9yIFB5dGhvbiBhY3Rpb25zLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cDovL3d3dy5hbnRsci5vcmc8L3VybD4KKyAgICAgIDxkZXZlbG9wZXJzPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+VGVyZW5jZSBQYXJyPC9uYW1lPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5VU0ZDQTwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvblVybD5odHRwOi8vd3d3LmNzLnVzZmNhLmVkdTwvb3JnYW5pemF0aW9uVXJsPgorICAgICAgICAgICAgPGVtYWlsPnBhcnJ0QGFudGxyLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+UHJvamVjdCBMZWFkZXI8L3JvbGU+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyIC0gSmF2YSBUYXJnZXQ8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICAgICAgPHRpbWV6b25lPlBTVDwvdGltZXpvbmU+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+SmltIElkbGU8L25hbWU+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPlRlbXBvcmFsIFdhdmUgTExDPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uVXJsPmh0dHA6Ly93d3cudGVtcG9yYWwtd2F2ZS5jb208L29yZ2FuaXphdGlvblVybD4KKyAgICAgICAgICAgIDxlbWFpbD5qaW1pQHRlbXBvcmFsLXdhdmUuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgLSBNYXZlbiBzdHVmZjwvcm9sZT4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgLSBDIFRhcmdldDwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgICAgICA8dGltZXpvbmU+UFNUPC90aW1lem9uZT4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgPC9kZXZlbG9wZXJzPgorICAgIAorICA8c2NtPgorICAgIDx1cmw+aHR0cDovL2Zpc2hleWUyLmNlbnF1YS5jb20vYnJvd3NlL2FudGxyPC91cmw+CisgICAgPGNvbm5lY3Rpb24+aHR0cDovL2Zpc2hleWUyLmNlbnF1YS5jb20vYnJvd3NlL2FudGxyPC9jb25uZWN0aW9uPgorICA8L3NjbT4KKyAgCisgIDxkZXBlbmRlbmNpZXM+CisgICAgCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zdHJpbmd0ZW1wbGF0ZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMi4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICAKKyAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+YW50bHI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFudGxyPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjcuNzwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4gICAgCisKKyAgPC9kZXBlbmRlbmNpZXM+CisgIAorPGJ1aWxkPgorICAgIDxkZWZhdWx0R29hbD5pbnN0YWxsPC9kZWZhdWx0R29hbD4KKyAgICA8cGx1Z2lucz4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICA8dGFyZ2V0PmpzcjE0PC90YXJnZXQ+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5maW5kYnVncy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxmaW5kYnVnc1htbE91dHB1dD50cnVlPC9maW5kYnVnc1htbE91dHB1dD4KKyAgICAgICAgICAgICAgICA8ZmluZGJ1Z3NYbWxXaXRoTWVzc2FnZXM+dHJ1ZTwvZmluZGJ1Z3NYbWxXaXRoTWVzc2FnZXM+CisgICAgICAgICAgICAgICAgPHhtbE91dHB1dD50cnVlPC94bWxPdXRwdXQ+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKzwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL0FOVExSRmlsZVN0cmVhbS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUklucHV0U3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJJbnB1dFN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUklucHV0U3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9BTlRMUklucHV0U3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUlJlYWRlclN0cmVhbS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0FOVExSUmVhZGVyU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL0FOVExSUmVhZGVyU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9BTlRMUlJlYWRlclN0cmVhbS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0Jhc2VSZWNvZ25pemVyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQmFzZVJlY29nbml6ZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvQmFzZVJlY29nbml6ZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0Jhc2VSZWNvZ25pemVyLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9CaXRTZXQuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9CaXRTZXQuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvQml0U2V0LmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9CaXRTZXQuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0J1ZmZlcmVkVG9rZW5TdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9CdWZmZXJlZFRva2VuU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL0J1ZmZlcmVkVG9rZW5TdHJlYW0uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0J1ZmZlcmVkVG9rZW5TdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW0uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW1TdGF0ZS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW1TdGF0ZS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtU3RhdGUuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW1TdGF0ZS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ2xhc3NpY1Rva2VuLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQ2xhc3NpY1Rva2VuLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL0NsYXNzaWNUb2tlbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQ2xhc3NpY1Rva2VuLmphdmEKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlbi5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkOWI4OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgQ29tbW9uVG9rZW4gaW1wbGVtZW50cyBUb2tlbiwgU2VyaWFsaXphYmxlIHsKKwlwcm90ZWN0ZWQgaW50IHR5cGU7CisJcHJvdGVjdGVkIGludCBsaW5lOworCXByb3RlY3RlZCBpbnQgY2hhclBvc2l0aW9uSW5MaW5lID0gLTE7IC8vIHNldCB0byBpbnZhbGlkIHBvc2l0aW9uCisJcHJvdGVjdGVkIGludCBjaGFubmVsPURFRkFVTFRfQ0hBTk5FTDsKKwlwcm90ZWN0ZWQgdHJhbnNpZW50IENoYXJTdHJlYW0gaW5wdXQ7CisKKwkvKiogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdGV4dCBvbmNlIGluIGEgd2hpbGUuICBJZgorCSAqICB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGdldFRleHQgc2hvdWxkIHJldHVybiB0aGlzLiAgTm90ZSB0aGF0CisJICogIHN0YXJ0L3N0b3AgYXJlIG5vdCBhZmZlY3RlZCBieSBjaGFuZ2luZyB0aGlzLgorCSAgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7CisKKwkvKiogV2hhdCB0b2tlbiBudW1iZXIgaXMgdGhpcyBmcm9tIDAuLm4tMSB0b2tlbnM7IDwgMCBpbXBsaWVzIGludmFsaWQgaW5kZXggKi8KKwlwcm90ZWN0ZWQgaW50IGluZGV4ID0gLTE7CisKKwkvKiogVGhlIGNoYXIgcG9zaXRpb24gaW50byB0aGUgaW5wdXQgYnVmZmVyIHdoZXJlIHRoaXMgdG9rZW4gc3RhcnRzICovCisJcHJvdGVjdGVkIGludCBzdGFydDsKKworCS8qKiBUaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdG9wcyAqLworCXByb3RlY3RlZCBpbnQgc3RvcDsKKworCXB1YmxpYyBDb21tb25Ub2tlbihpbnQgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCXB1YmxpYyBDb21tb25Ub2tlbihDaGFyU3RyZWFtIGlucHV0LCBpbnQgdHlwZSwgaW50IGNoYW5uZWwsIGludCBzdGFydCwgaW50IHN0b3ApIHsKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7CisJCXRoaXMuc3RvcCA9IHN0b3A7CisJfQorCisJcHVibGljIENvbW1vblRva2VuKGludCB0eXBlLCBTdHJpbmcgdGV4dCkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmNoYW5uZWwgPSBERUZBVUxUX0NIQU5ORUw7CisJCXRoaXMudGV4dCA9IHRleHQ7CisJfQorCisJcHVibGljIENvbW1vblRva2VuKFRva2VuIG9sZFRva2VuKSB7CisJCXRleHQgPSBvbGRUb2tlbi5nZXRUZXh0KCk7CisJCXR5cGUgPSBvbGRUb2tlbi5nZXRUeXBlKCk7CisJCWxpbmUgPSBvbGRUb2tlbi5nZXRMaW5lKCk7CisJCWluZGV4ID0gb2xkVG9rZW4uZ2V0VG9rZW5JbmRleCgpOworCQljaGFyUG9zaXRpb25JbkxpbmUgPSBvbGRUb2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJY2hhbm5lbCA9IG9sZFRva2VuLmdldENoYW5uZWwoKTsKKyAgICAgICAgaW5wdXQgPSBvbGRUb2tlbi5nZXRJbnB1dFN0cmVhbSgpOworCQlpZiAoIG9sZFRva2VuIGluc3RhbmNlb2YgQ29tbW9uVG9rZW4gKSB7CisJCQlzdGFydCA9ICgoQ29tbW9uVG9rZW4pb2xkVG9rZW4pLnN0YXJ0OworCQkJc3RvcCA9ICgoQ29tbW9uVG9rZW4pb2xkVG9rZW4pLnN0b3A7CisJCX0KKwl9CisKKwlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKKwkJdGhpcy5saW5lID0gbGluZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCWlmICggdGV4dCE9bnVsbCApIHsKKwkJCXJldHVybiB0ZXh0OworCQl9CisJCWlmICggaW5wdXQ9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKKwkJaWYgKCBzdGFydDxuICYmIHN0b3A8bikgeworCQkJcmV0dXJuIGlucHV0LnN1YnN0cmluZyhzdGFydCxzdG9wKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiAiPEVPRj4iOworCQl9CisJfQorCisJLyoqIE92ZXJyaWRlIHRoZSB0ZXh0IGZvciB0aGlzIHRva2VuLiAgZ2V0VGV4dCgpIHdpbGwgcmV0dXJuIHRoaXMgdGV4dAorCSAqICByYXRoZXIgdGhhbiBwdWxsaW5nIGZyb20gdGhlIGJ1ZmZlci4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4KKwkgKiAgdGhhdCBzdGFydC9zdG9wIGluZGV4ZXMgYXJlIG5vdCB2YWxpZC4gIEl0IG1lYW5zIHRoYXQgdGhhdCBpbnB1dAorCSAqICB3YXMgY29udmVydGVkIHRvIGEgbmV3IHN0cmluZyBpbiB0aGUgdG9rZW4gb2JqZWN0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKKwkJdGhpcy50ZXh0ID0gdGV4dDsKKwl9CisKKwlwdWJsaWMgaW50IGdldExpbmUoKSB7CisJCXJldHVybiBsaW5lOworCX0KKworCXB1YmxpYyBpbnQgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkgeworCQlyZXR1cm4gY2hhclBvc2l0aW9uSW5MaW5lOworCX0KKworCXB1YmxpYyB2b2lkIHNldENoYXJQb3NpdGlvbkluTGluZShpbnQgY2hhclBvc2l0aW9uSW5MaW5lKSB7CisJCXRoaXMuY2hhclBvc2l0aW9uSW5MaW5lID0gY2hhclBvc2l0aW9uSW5MaW5lOworCX0KKworCXB1YmxpYyBpbnQgZ2V0Q2hhbm5lbCgpIHsKKwkJcmV0dXJuIGNoYW5uZWw7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2hhbm5lbChpbnQgY2hhbm5lbCkgeworCQl0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKSB7CisJCXJldHVybiBzdGFydDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTdGFydEluZGV4KGludCBzdGFydCkgeworCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7CisJfQorCisJcHVibGljIGludCBnZXRTdG9wSW5kZXgoKSB7CisJCXJldHVybiBzdG9wOworCX0KKworCXB1YmxpYyB2b2lkIHNldFN0b3BJbmRleChpbnQgc3RvcCkgeworCQl0aGlzLnN0b3AgPSBzdG9wOworCX0KKworCXB1YmxpYyBpbnQgZ2V0VG9rZW5JbmRleCgpIHsKKwkJcmV0dXJuIGluZGV4OworCX0KKworCXB1YmxpYyB2b2lkIHNldFRva2VuSW5kZXgoaW50IGluZGV4KSB7CisJCXRoaXMuaW5kZXggPSBpbmRleDsKKwl9CisKKwlwdWJsaWMgQ2hhclN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKwkJcmV0dXJuIGlucHV0OworCX0KKworCXB1YmxpYyB2b2lkIHNldElucHV0U3RyZWFtKENoYXJTdHJlYW0gaW5wdXQpIHsKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZyBjaGFubmVsU3RyID0gIiI7CisJCWlmICggY2hhbm5lbD4wICkgeworCQkJY2hhbm5lbFN0cj0iLGNoYW5uZWw9IitjaGFubmVsOworCQl9CisJCVN0cmluZyB0eHQgPSBnZXRUZXh0KCk7CisJCWlmICggdHh0IT1udWxsICkgeworCQkJdHh0ID0gdHh0LnJlcGxhY2VBbGwoIlxuIiwiXFxcXG4iKTsKKwkJCXR4dCA9IHR4dC5yZXBsYWNlQWxsKCJcciIsIlxcXFxyIik7CisJCQl0eHQgPSB0eHQucmVwbGFjZUFsbCgiXHQiLCJcXFxcdCIpOworCQl9CisJCWVsc2UgeworCQkJdHh0ID0gIjxubyB0ZXh0PiI7CisJCX0KKwkJcmV0dXJuICJbQCIrZ2V0VG9rZW5JbmRleCgpKyIsIitzdGFydCsiOiIrc3RvcCsiPSciK3R4dCsiJyw8Iit0eXBlKyI+IitjaGFubmVsU3RyKyIsIitsaW5lKyI6IitnZXRDaGFyUG9zaXRpb25JbkxpbmUoKSsiXSI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmVhN2VjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWU7CisKKy8qKiBUaGUgbW9zdCBjb21tb24gc3RyZWFtIG9mIHRva2VucyB3aGVyZSBldmVyeSB0b2tlbiBpcyBidWZmZXJlZCB1cAorICogIGFuZCB0b2tlbnMgYXJlIGZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKKyAqICBzZWUgdGhlc2UgdG9rZW5zKS4KKyAqCisgKiAgRXZlbiB0aG91Z2ggaXQgYnVmZmVycyBhbGwgb2YgdGhlIHRva2VucywgdGhpcyB0b2tlbiBzdHJlYW0gcHVsbHMgdG9rZW5zCisgKiAgZnJvbSB0aGUgdG9rZW5zIHNvdXJjZSBvbiBkZW1hbmQuIEluIG90aGVyIHdvcmRzLCB1bnRpbCB5b3UgYXNrIGZvciBhCisgKiAgdG9rZW4gdXNpbmcgY29uc3VtZSgpLCBMVCgpLCBldGMuIHRoZSBzdHJlYW0gZG9lcyBub3QgcHVsbCBmcm9tIHRoZSBsZXhlci4KKyAqCisgKiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgc3RyZWFtIGFuZCBCdWZmZXJlZFRva2VuU3RyZWFtIHN1cGVyY2xhc3MKKyAqICBpcyB0aGF0IHRoaXMgc3RyZWFtIGtub3dzIGhvdyB0byBpZ25vcmUgb2ZmIGNoYW5uZWwgdG9rZW5zLiBUaGVyZSBtYXkgYmUKKyAqICBhIHBlcmZvcm1hbmNlIGFkdmFudGFnZSB0byB1c2luZyB0aGUgc3VwZXJjbGFzcyBpZiB5b3UgZG9uJ3QgcGFzcworICogIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGV0Yy4gdG8gdGhlIHBhcnNlciBvbiBhIGhpZGRlbiBjaGFubmVsIChpLmUuLAorICogIHlvdSBzZXQgJGNoYW5uZWwgaW5zdGVhZCBvZiBjYWxsaW5nIHNraXAoKSBpbiBsZXhlciBydWxlcy4pCisgKgorICogIEBzZWUgb3JnLmFudGxyLnJ1bnRpbWUuVW5idWZmZXJlZFRva2VuU3RyZWFtCisgKiAgQHNlZSBvcmcuYW50bHIucnVudGltZS5CdWZmZXJlZFRva2VuU3RyZWFtCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tb25Ub2tlblN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkVG9rZW5TdHJlYW0geworICAgIC8qKiBTa2lwIHRva2VucyBvbiBhbnkgY2hhbm5lbCBidXQgdGhpcyBvbmU7IHRoaXMgaXMgaG93IHdlIHNraXAgd2hpdGVzcGFjZS4uLiAqLworICAgIHByb3RlY3RlZCBpbnQgY2hhbm5lbCA9IFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKworICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbSgpIHsgOyB9CisKKyAgICBwdWJsaWMgQ29tbW9uVG9rZW5TdHJlYW0oVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgc3VwZXIodG9rZW5Tb3VyY2UpOworICAgIH0KKworICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbShUb2tlblNvdXJjZSB0b2tlblNvdXJjZSwgaW50IGNoYW5uZWwpIHsKKyAgICAgICAgdGhpcyh0b2tlblNvdXJjZSk7CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgfQorCisgICAgLyoqIEFsd2F5cyBsZWF2ZSBwIG9uIGFuIG9uLWNoYW5uZWwgdG9rZW4uICovCisgICAgcHVibGljIHZvaWQgY29uc3VtZSgpIHsKKyAgICAgICAgaWYgKCBwID09IC0xICkgc2V0dXAoKTsKKyAgICAgICAgcCsrOworICAgICAgICBzeW5jKHApOworICAgICAgICB3aGlsZSAoIHRva2Vucy5nZXQocCkuZ2V0Q2hhbm5lbCgpIT1jaGFubmVsICkgeworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgc3luYyhwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBUb2tlbiBMQihpbnQgaykgeworICAgICAgICBpZiAoIGs9PTAgfHwgKHAtayk8MCApIHJldHVybiBudWxsOworCisgICAgICAgIGludCBpID0gcDsKKyAgICAgICAgaW50IG4gPSAxOworICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKKyAgICAgICAgd2hpbGUgKCBuPD1rICkgeworICAgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICAgIGkgPSBza2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoaS0xKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGk8MCApIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gdG9rZW5zLmdldChpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVG9rZW4gTFQoaW50IGspIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudGVyIExUKCIraysiKSIpOworICAgICAgICBpZiAoIHAgPT0gLTEgKSBzZXR1cCgpOworICAgICAgICBpZiAoIGsgPT0gMCApIHJldHVybiBudWxsOworICAgICAgICBpZiAoIGsgPCAwICkgcmV0dXJuIExCKC1rKTsKKyAgICAgICAgaW50IGkgPSBwOworICAgICAgICBpbnQgbiA9IDE7IC8vIHdlIGtub3cgdG9rZW5zW3BdIGlzIGEgZ29vZCBvbmUKKyAgICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zCisgICAgICAgIHdoaWxlICggbjxrICkgeworICAgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICAgIGkgPSBza2lwT2ZmVG9rZW5DaGFubmVscyhpKzEpOworICAgICAgICAgICAgbisrOworICAgICAgICB9CisJCWlmICggaT5yYW5nZSApIHJhbmdlID0gaTsKKyAgICAgICAgcmV0dXJuIHRva2Vucy5nZXQoaSk7CisgICAgfQorCisgICAgLyoqIEdpdmVuIGEgc3RhcnRpbmcgaW5kZXgsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uLWNoYW5uZWwKKyAgICAgKiAgdG9rZW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBza2lwT2ZmVG9rZW5DaGFubmVscyhpbnQgaSkgeworICAgICAgICBzeW5jKGkpOworICAgICAgICB3aGlsZSAoIHRva2Vucy5nZXQoaSkuZ2V0Q2hhbm5lbCgpIT1jaGFubmVsICkgeyAvLyBhbHNvIHN0b3BzIGF0IEVPRiAoaXQncyBvbmNoYW5uZWwpCisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBzeW5jKGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgc2tpcE9mZlRva2VuQ2hhbm5lbHNSZXZlcnNlKGludCBpKSB7CisgICAgICAgIHdoaWxlICggaT49MCAmJiAoKFRva2VuKXRva2Vucy5nZXQoaSkpLmdldENoYW5uZWwoKSE9Y2hhbm5lbCApIHsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCByZXNldCgpIHsKKwkJc3VwZXIucmVzZXQoKTsKKwkJcCA9IHNraXBPZmZUb2tlbkNoYW5uZWxzKDApOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldHVwKCkgeworICAgICAgICBwID0gMDsKKyAgICAgICAgc3luYygwKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoIHRva2Vucy5nZXQoaSkuZ2V0Q2hhbm5lbCgpIT1jaGFubmVsICkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgc3luYyhpKTsKKyAgICAgICAgfQorICAgICAgICBwID0gaTsKKyAgICB9CisKKwkvKiogQ291bnQgRU9GIGp1c3Qgb25jZS4gKi8KKwlwdWJsaWMgaW50IGdldE51bWJlck9mT25DaGFubmVsVG9rZW5zKCkgeworCQlpbnQgbiA9IDA7CisJCWZpbGwoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyBpKyspIHsKKwkJCVRva2VuIHQgPSB0b2tlbnMuZ2V0KGkpOworCQkJaWYgKCB0LmdldENoYW5uZWwoKT09Y2hhbm5lbCApIG4rKzsKKwkJCWlmICggdC5nZXRUeXBlKCk9PVRva2VuLkVPRiApIGJyZWFrOworCQl9CisJCXJldHVybiBuOworCX0KKworICAgIC8qKiBSZXNldCB0aGlzIHRva2VuIHN0cmVhbSBieSBzZXR0aW5nIGl0cyB0b2tlbiBzb3VyY2UuICovCisgICAgcHVibGljIHZvaWQgc2V0VG9rZW5Tb3VyY2UoVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpIHsKKyAgICAgICAgc3VwZXIuc2V0VG9rZW5Tb3VyY2UodG9rZW5Tb3VyY2UpOworICAgICAgICBjaGFubmVsID0gVG9rZW4uREVGQVVMVF9DSEFOTkVMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9ERkEuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9ERkEuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvREZBLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9ERkEuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9FYXJseUV4aXRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL0ZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9JbnRTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9JbnRTdHJlYW0uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvSW50U3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9JbnRTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0xlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvTGVnYWN5Q29tbW9uVG9rZW5TdHJlYW0uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvTGVnYWN5Q29tbW9uVG9rZW5TdHJlYW0uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0xlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9MZXhlci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL0xleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhMjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9MZXhlci5qYXZhCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZTsKKworLyoqIEEgbGV4ZXIgaXMgcmVjb2duaXplciB0aGF0IGRyYXdzIGlucHV0IHN5bWJvbHMgZnJvbSBhIGNoYXJhY3RlciBzdHJlYW0uCisgKiAgbGV4ZXIgZ3JhbW1hcnMgcmVzdWx0IGluIGEgc3ViY2xhc3Mgb2YgdGhpcyBvYmplY3QuIEEgTGV4ZXIgb2JqZWN0CisgKiAgdXNlcyBzaW1wbGlmaWVkIG1hdGNoKCkgYW5kIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbXMgaW4gdGhlIGludGVyZXN0CisgKiAgb2Ygc3BlZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMZXhlciBleHRlbmRzIEJhc2VSZWNvZ25pemVyIGltcGxlbWVudHMgVG9rZW5Tb3VyY2UgeworCS8qKiBXaGVyZSBpcyB0aGUgbGV4ZXIgZHJhd2luZyBjaGFyYWN0ZXJzIGZyb20/ICovCisJcHJvdGVjdGVkIENoYXJTdHJlYW0gaW5wdXQ7CisKKwlwdWJsaWMgTGV4ZXIoKSB7CisJfQorCisJcHVibGljIExleGVyKENoYXJTdHJlYW0gaW5wdXQpIHsKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworCX0KKworCXB1YmxpYyBMZXhlcihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKwkJc3VwZXIoc3RhdGUpOworCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisJfQorCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworCQkvLyB3YWNrIExleGVyIHN0YXRlIHZhcmlhYmxlcworCQlpZiAoIGlucHV0IT1udWxsICkgeworCQkJaW5wdXQuc2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorCQl9CisJCWlmICggc3RhdGU9PW51bGwgKSB7CisJCQlyZXR1cm47IC8vIG5vIHNoYXJlZCBzdGF0ZSB3b3JrIHRvIGRvCisJCX0KKwkJc3RhdGUudG9rZW4gPSBudWxsOworCQlzdGF0ZS50eXBlID0gVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFOworCQlzdGF0ZS5jaGFubmVsID0gVG9rZW4uREVGQVVMVF9DSEFOTkVMOworCQlzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisJCXN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSAtMTsKKwkJc3RhdGUudG9rZW5TdGFydExpbmUgPSAtMTsKKwkJc3RhdGUudGV4dCA9IG51bGw7CisJfQorCisJLyoqIFJldHVybiBhIHRva2VuIGZyb20gdGhpcyBzb3VyY2U7IGkuZS4sIG1hdGNoIGEgdG9rZW4gb24gdGhlIGNoYXIKKwkgKiAgc3RyZWFtLgorCSAqLworCXB1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB7CisJCXdoaWxlICh0cnVlKSB7CisJCQlzdGF0ZS50b2tlbiA9IG51bGw7CisJCQlzdGF0ZS5jaGFubmVsID0gVG9rZW4uREVGQVVMVF9DSEFOTkVMOworCQkJc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LmluZGV4KCk7CisJCQlzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gaW5wdXQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCQlzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LmdldExpbmUoKTsKKwkJCXN0YXRlLnRleHQgPSBudWxsOworCQkJaWYgKCBpbnB1dC5MQSgxKT09Q2hhclN0cmVhbS5FT0YgKSB7CisgICAgICAgICAgICAgICAgVG9rZW4gZW9mID0gbmV3IENvbW1vblRva2VuKChDaGFyU3RyZWFtKWlucHV0LFRva2VuLkVPRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uREVGQVVMVF9DSEFOTkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbmRleCgpLGlucHV0LmluZGV4KCkpOworICAgICAgICAgICAgICAgIGVvZi5zZXRMaW5lKGdldExpbmUoKSk7CisgICAgICAgICAgICAgICAgZW9mLnNldENoYXJQb3NpdGlvbkluTGluZShnZXRDaGFyUG9zaXRpb25JbkxpbmUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVvZjsKKwkJCX0KKwkJCXRyeSB7CisJCQkJbVRva2VucygpOworCQkJCWlmICggc3RhdGUudG9rZW49PW51bGwgKSB7CisJCQkJCWVtaXQoKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIHN0YXRlLnRva2VuPT1Ub2tlbi5TS0lQX1RPS0VOICkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0dXJuIHN0YXRlLnRva2VuOworCQkJfQorCQkJY2F0Y2ggKE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiByZSkgeworCQkJCXJlcG9ydEVycm9yKHJlKTsKKwkJCQkvLyBtYXRjaFJhbmdlKCkgcm91dGluZSBoYXMgYWxyZWFkeSBjYWxsZWQgcmVjb3ZlcigpCisJCQl9CisJCQljYXRjaCAoTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIHJlKSB7CisJCQkJcmVwb3J0RXJyb3IocmUpOworCQkJCS8vIG1hdGNoKCkgcm91dGluZSBoYXMgYWxyZWFkeSBjYWxsZWQgcmVjb3ZlcigpCisJCQl9CisJCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJCQlyZXBvcnRFcnJvcihyZSk7CisJCQkJcmVjb3ZlcihyZSk7IC8vIHRocm93IG91dCBjdXJyZW50IGNoYXIgYW5kIHRyeSBhZ2FpbgorCQkJfQorCQl9CisJfQorCisJLyoqIEluc3RydWN0IHRoZSBsZXhlciB0byBza2lwIGNyZWF0aW5nIGEgdG9rZW4gZm9yIGN1cnJlbnQgbGV4ZXIgcnVsZQorCSAqICBhbmQgbG9vayBmb3IgYW5vdGhlciB0b2tlbi4gIG5leHRUb2tlbigpIGtub3dzIHRvIGtlZXAgbG9va2luZyB3aGVuCisJICogIGEgbGV4ZXIgcnVsZSBmaW5pc2hlcyB3aXRoIHRva2VuIHNldCB0byBTS0lQX1RPS0VOLiAgUmVjYWxsIHRoYXQKKwkgKiAgaWYgdG9rZW49PW51bGwgYXQgZW5kIG9mIGFueSB0b2tlbiBydWxlLCBpdCBjcmVhdGVzIG9uZSBmb3IgeW91CisJICogIGFuZCBlbWl0cyBpdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBza2lwKCkgeworCQlzdGF0ZS50b2tlbiA9IFRva2VuLlNLSVBfVE9LRU47CisJfQorCisJLyoqIFRoaXMgaXMgdGhlIGxleGVyIGVudHJ5IHBvaW50IHRoYXQgc2V0cyBpbnN0YW5jZSB2YXIgJ3Rva2VuJyAqLworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247CisKKwkvKiogU2V0IHRoZSBjaGFyIHN0cmVhbSBhbmQgcmVzZXQgdGhlIGxleGVyICovCisJcHVibGljIHZvaWQgc2V0Q2hhclN0cmVhbShDaGFyU3RyZWFtIGlucHV0KSB7CisJCXRoaXMuaW5wdXQgPSBudWxsOworCQlyZXNldCgpOworCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisJfQorCisJcHVibGljIENoYXJTdHJlYW0gZ2V0Q2hhclN0cmVhbSgpIHsKKwkJcmV0dXJuIHRoaXMuaW5wdXQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gaW5wdXQuZ2V0U291cmNlTmFtZSgpOworCX0KKworCS8qKiBDdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBlbWl0cyBwZXIgbmV4dFRva2VuIGludm9jYXRpb24KKwkgKiAgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gIFN1YmNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQKKwkgKiAgbmV4dFRva2VuICh0byBwdXNoIHRva2VucyBpbnRvIGEgbGlzdCBhbmQgcHVsbCBmcm9tIHRoYXQgbGlzdCByYXRoZXIKKwkgKiAgdGhhbiBhIHNpbmdsZSB2YXJpYWJsZSBhcyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMpLgorCSAqLworCXB1YmxpYyB2b2lkIGVtaXQoVG9rZW4gdG9rZW4pIHsKKwkJc3RhdGUudG9rZW4gPSB0b2tlbjsKKwl9CisKKwkvKiogVGhlIHN0YW5kYXJkIG1ldGhvZCBjYWxsZWQgdG8gYXV0b21hdGljYWxseSBlbWl0IGEgdG9rZW4gYXQgdGhlCisJICogIG91dGVybW9zdCBsZXhpY2FsIHJ1bGUuICBUaGUgdG9rZW4gb2JqZWN0IHNob3VsZCBwb2ludCBpbnRvIHRoZQorCSAqICBjaGFyIGJ1ZmZlciBzdGFydC4uc3RvcC4gIElmIHRoZXJlIGlzIGEgdGV4dCBvdmVycmlkZSBpbiAndGV4dCcsCisJICogIHVzZSB0aGF0IHRvIHNldCB0aGUgdG9rZW4ncyB0ZXh0LiAgT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZW1pdAorCSAqICBjdXN0b20gVG9rZW4gb2JqZWN0cy4KKwkgKgorCSAqICBJZiB5b3UgYXJlIGJ1aWxkaW5nIHRyZWVzLCB0aGVuIHlvdSBzaG91bGQgYWxzbyBvdmVycmlkZQorCSAqICBQYXJzZXIgb3IgVHJlZVBhcnNlci5nZXRNaXNzaW5nU3ltYm9sKCkuCisJICovCisJcHVibGljIFRva2VuIGVtaXQoKSB7CisJCVRva2VuIHQgPSBuZXcgQ29tbW9uVG9rZW4oaW5wdXQsIHN0YXRlLnR5cGUsIHN0YXRlLmNoYW5uZWwsIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXgsIGdldENoYXJJbmRleCgpLTEpOworCQl0LnNldExpbmUoc3RhdGUudG9rZW5TdGFydExpbmUpOworCQl0LnNldFRleHQoc3RhdGUudGV4dCk7CisJCXQuc2V0Q2hhclBvc2l0aW9uSW5MaW5lKHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUpOworCQllbWl0KHQpOworCQlyZXR1cm4gdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBtYXRjaChTdHJpbmcgcykgdGhyb3dzIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiB7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKCBpPHMubGVuZ3RoKCkgKSB7CisJCQlpZiAoIGlucHV0LkxBKDEpIT1zLmNoYXJBdChpKSApIHsKKwkJCQlpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICkgeworCQkJCQlzdGF0ZS5mYWlsZWQgPSB0cnVlOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPQorCQkJCQluZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHMuY2hhckF0KGkpLCBpbnB1dCk7CisJCQkJcmVjb3ZlcihtdGUpOworCQkJCXRocm93IG10ZTsKKwkJCX0KKwkJCWkrKzsKKwkJCWlucHV0LmNvbnN1bWUoKTsKKwkJCXN0YXRlLmZhaWxlZCA9IGZhbHNlOworCQl9CisJfQorCisJcHVibGljIHZvaWQgbWF0Y2hBbnkoKSB7CisJCWlucHV0LmNvbnN1bWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtYXRjaChpbnQgYykgdGhyb3dzIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiB7CisJCWlmICggaW5wdXQuTEEoMSkhPWMgKSB7CisJCQlpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICkgeworCQkJCXN0YXRlLmZhaWxlZCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQkJTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG10ZSA9CisJCQkJbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihjLCBpbnB1dCk7CisJCQlyZWNvdmVyKG10ZSk7ICAvLyBkb24ndCByZWFsbHkgcmVjb3ZlcjsganVzdCBjb25zdW1lIGluIGxleGVyCisJCQl0aHJvdyBtdGU7CisJCX0KKwkJaW5wdXQuY29uc3VtZSgpOworCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBtYXRjaFJhbmdlKGludCBhLCBpbnQgYikKKwkJdGhyb3dzIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbgorCXsKKwkJaWYgKCBpbnB1dC5MQSgxKTxhIHx8IGlucHV0LkxBKDEpPmIgKSB7CisJCQlpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICkgeworCQkJCXN0YXRlLmZhaWxlZCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQkJTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIG1yZSA9CisJCQkJbmV3IE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbihhLGIsaW5wdXQpOworCQkJcmVjb3ZlcihtcmUpOworCQkJdGhyb3cgbXJlOworCQl9CisJCWlucHV0LmNvbnN1bWUoKTsKKwkJc3RhdGUuZmFpbGVkID0gZmFsc2U7CisJfQorCisJcHVibGljIGludCBnZXRMaW5lKCkgeworCQlyZXR1cm4gaW5wdXQuZ2V0TGluZSgpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkgeworCQlyZXR1cm4gaW5wdXQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJfQorCisJLyoqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlciBvZiBsb29rYWhlYWQ/ICovCisJcHVibGljIGludCBnZXRDaGFySW5kZXgoKSB7CisJCXJldHVybiBpbnB1dC5pbmRleCgpOworCX0KKworCS8qKiBSZXR1cm4gdGhlIHRleHQgbWF0Y2hlZCBzbyBmYXIgZm9yIHRoZSBjdXJyZW50IHRva2VuIG9yIGFueQorCSAqICB0ZXh0IG92ZXJyaWRlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJaWYgKCBzdGF0ZS50ZXh0IT1udWxsICkgeworCQkJcmV0dXJuIHN0YXRlLnRleHQ7CisJCX0KKwkJcmV0dXJuIGlucHV0LnN1YnN0cmluZyhzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LGdldENoYXJJbmRleCgpLTEpOworCX0KKworCS8qKiBTZXQgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyB0b2tlbjsgaXQgd2lwZXMgYW55IHByZXZpb3VzCisJICogIGNoYW5nZXMgdG8gdGhlIHRleHQuCisJICovCisJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworCQlzdGF0ZS50ZXh0ID0gdGV4dDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisJCS8qKiBUT0RPOiBub3QgdGhvdWdodCBhYm91dCByZWNvdmVyeSBpbiBsZXhlciB5ZXQuCisJCSAqCisJCS8vIGlmIHdlJ3ZlIGFscmVhZHkgcmVwb3J0ZWQgYW4gZXJyb3IgYW5kIGhhdmUgbm90IG1hdGNoZWQgYSB0b2tlbgorCQkvLyB5ZXQgc3VjY2Vzc2Z1bGx5LCBkb24ndCByZXBvcnQgYW55IGVycm9ycy4KKwkJaWYgKCBlcnJvclJlY292ZXJ5ICkgeworCQkJLy9TeXN0ZW0uZXJyLnByaW50KCJbU1BVUklPVVNdICIpOworCQkJcmV0dXJuOworCQl9CisJCWVycm9yUmVjb3ZlcnkgPSB0cnVlOworCQkgKi8KKworCQlkaXNwbGF5UmVjb2duaXRpb25FcnJvcih0aGlzLmdldFRva2VuTmFtZXMoKSwgZSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoUmVjb2duaXRpb25FeGNlcHRpb24gZSwgU3RyaW5nW10gdG9rZW5OYW1lcykgeworCQlTdHJpbmcgbXNnID0gbnVsbDsKKwkJaWYgKCBlIGluc3RhbmNlb2YgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICkgeworCQkJTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG10ZSA9IChNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pZTsKKwkJCW1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK2dldENoYXJFcnJvckRpc3BsYXkoZS5jKSsiIGV4cGVjdGluZyAiK2dldENoYXJFcnJvckRpc3BsYXkobXRlLmV4cGVjdGluZyk7CisJCX0KKwkJZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApIHsKKwkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSAoTm9WaWFibGVBbHRFeGNlcHRpb24pZTsKKwkJCS8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiZGVjaXNpb249PDwiK252YWUuZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIj4+IgorCQkJLy8gYW5kICIoZGVjaXNpb249IitudmFlLmRlY2lzaW9uTnVtYmVyKyIpIGFuZAorCQkJLy8gInN0YXRlICIrbnZhZS5zdGF0ZU51bWJlcgorCQkJbXNnID0gIm5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgIitnZXRDaGFyRXJyb3JEaXNwbGF5KGUuYyk7CisJCX0KKwkJZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBFYXJseUV4aXRFeGNlcHRpb24gKSB7CisJCQlFYXJseUV4aXRFeGNlcHRpb24gZWVlID0gKEVhcmx5RXhpdEV4Y2VwdGlvbillOworCQkJLy8gZm9yIGRldmVsb3BtZW50LCBjYW4gYWRkICIoZGVjaXNpb249IitlZWUuZGVjaXNpb25OdW1iZXIrIikiCisJCQltc2cgPSAicmVxdWlyZWQgKC4uLikrIGxvb3AgZGlkIG5vdCBtYXRjaCBhbnl0aGluZyBhdCBjaGFyYWN0ZXIgIitnZXRDaGFyRXJyb3JEaXNwbGF5KGUuYyk7CisJCX0KKwkJZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICkgeworCQkJTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiBtc2UgPSAoTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbillOworCQkJbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiK21zZS5leHBlY3Rpbmc7CisJCX0KKwkJZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICkgeworCQkJTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSAoTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbillOworCQkJbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiK21zZS5leHBlY3Rpbmc7CisJCX0KKwkJZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gKSB7CisJCQlNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gbXJlID0gKE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbillOworCQkJbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiKworCQkJCSAgZ2V0Q2hhckVycm9yRGlzcGxheShtcmUuYSkrIi4uIitnZXRDaGFyRXJyb3JEaXNwbGF5KG1yZS5iKTsKKwkJfQorCQllbHNlIHsKKwkJCW1zZyA9IHN1cGVyLmdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKKwkJfQorCQlyZXR1cm4gbXNnOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhckVycm9yRGlzcGxheShpbnQgYykgeworCQlTdHJpbmcgcyA9IFN0cmluZy52YWx1ZU9mKChjaGFyKWMpOworCQlzd2l0Y2ggKCBjICkgeworCQkJY2FzZSBUb2tlbi5FT0YgOgorCQkJCXMgPSAiPEVPRj4iOworCQkJCWJyZWFrOworCQkJY2FzZSAnXG4nIDoKKwkJCQlzID0gIlxcbiI7CisJCQkJYnJlYWs7CisJCQljYXNlICdcdCcgOgorCQkJCXMgPSAiXFx0IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xyJyA6CisJCQkJcyA9ICJcXHIiOworCQkJCWJyZWFrOworCQl9CisJCXJldHVybiAiJyIrcysiJyI7CisJfQorCisJLyoqIExleGVycyBjYW4gbm9ybWFsbHkgbWF0Y2ggYW55IGNoYXIgaW4gaXQncyB2b2NhYnVsYXJ5IGFmdGVyIG1hdGNoaW5nCisJICogIGEgdG9rZW4sIHNvIGRvIHRoZSBlYXN5IHRoaW5nIGFuZCBqdXN0IGtpbGwgYSBjaGFyYWN0ZXIgYW5kIGhvcGUKKwkgKiAgaXQgYWxsIHdvcmtzIG91dC4gIFlvdSBjYW4gaW5zdGVhZCB1c2UgdGhlIHJ1bGUgaW52b2NhdGlvbiBzdGFjaworCSAqICB0byBkbyBzb3BoaXN0aWNhdGVkIGVycm9yIHJlY292ZXJ5IGlmIHlvdSBhcmUgaW4gYSBmcmFnbWVudCBydWxlLgorCSAqLworCXB1YmxpYyB2b2lkIHJlY292ZXIoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWluZyBjaGFyICIrKGNoYXIpaW5wdXQuTEEoMSkrIiBkdXJpbmcgcmVjb3ZlcnkiKTsKKwkJLy9yZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJaW5wdXQuY29uc3VtZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHRyYWNlSW4oU3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSAgeworCQlTdHJpbmcgaW5wdXRTeW1ib2wgPSAoKGNoYXIpaW5wdXQuTFQoMSkpKyIgbGluZT0iK2dldExpbmUoKSsiOiIrZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCXN1cGVyLnRyYWNlSW4ocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXRTeW1ib2wpOworCX0KKworCXB1YmxpYyB2b2lkIHRyYWNlT3V0KFN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgIHsKKwkJU3RyaW5nIGlucHV0U3ltYm9sID0gKChjaGFyKWlucHV0LkxUKDEpKSsiIGxpbmU9IitnZXRMaW5lKCkrIjoiK2dldENoYXJQb3NpdGlvbkluTGluZSgpOworCQlzdXBlci50cmFjZU91dChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9NaXNzaW5nVG9rZW5FeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uamF2YQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1BhcnNlci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMGNmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuZGVidWcuRGVidWdUb2tlblN0cmVhbTsKKworLyoqIEEgcGFyc2VyIGZvciBUb2tlblN0cmVhbXMuICAicGFyc2VyIGdyYW1tYXJzIiByZXN1bHQgaW4gYSBzdWJjbGFzcworICogIG9mIHRoaXMuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZXIgZXh0ZW5kcyBCYXNlUmVjb2duaXplciB7CisJcHVibGljIFRva2VuU3RyZWFtIGlucHV0OworCisJcHVibGljIFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCkgeworCQlzdXBlcigpOyAvLyBoaWdobGlnaHQgdGhhdCB3ZSBnbyB0byBzdXBlciB0byBzZXQgc3RhdGUgb2JqZWN0CisJCXNldFRva2VuU3RyZWFtKGlucHV0KTsKKyAgICB9CisKKwlwdWJsaWMgUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKwkJc3VwZXIoc3RhdGUpOyAvLyBzaGFyZSB0aGUgc3RhdGUgb2JqZWN0IHdpdGggYW5vdGhlciBwYXJzZXIKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0KKworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdXBlci5yZXNldCgpOyAvLyByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKKwkJaWYgKCBpbnB1dCE9bnVsbCApIHsKKwkJCWlucHV0LnNlZWsoMCk7IC8vIHJld2luZCB0aGUgaW5wdXQKKwkJfQorCX0KKworCXByb3RlY3RlZCBPYmplY3QgZ2V0Q3VycmVudElucHV0U3ltYm9sKEludFN0cmVhbSBpbnB1dCkgeworCQlyZXR1cm4gKChUb2tlblN0cmVhbSlpbnB1dCkuTFQoMSk7CisJfQorCisJcHJvdGVjdGVkIE9iamVjdCBnZXRNaXNzaW5nU3ltYm9sKEludFN0cmVhbSBpbnB1dCwKKwkJCQkJCQkJCSAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKKwkJCQkJCQkJCSAgaW50IGV4cGVjdGVkVG9rZW5UeXBlLAorCQkJCQkJCQkJICBCaXRTZXQgZm9sbG93KQorCXsKKwkJU3RyaW5nIHRva2VuVGV4dCA9IG51bGw7CisJCWlmICggZXhwZWN0ZWRUb2tlblR5cGU9PVRva2VuLkVPRiApIHRva2VuVGV4dCA9ICI8bWlzc2luZyBFT0Y+IjsKKwkJZWxzZSB0b2tlblRleHQgPSAiPG1pc3NpbmcgIitnZXRUb2tlbk5hbWVzKClbZXhwZWN0ZWRUb2tlblR5cGVdKyI+IjsKKwkJQ29tbW9uVG9rZW4gdCA9IG5ldyBDb21tb25Ub2tlbihleHBlY3RlZFRva2VuVHlwZSwgdG9rZW5UZXh0KTsKKwkJVG9rZW4gY3VycmVudCA9ICgoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpOworCQlpZiAoIGN1cnJlbnQuZ2V0VHlwZSgpID09IFRva2VuLkVPRiApIHsKKwkJCWN1cnJlbnQgPSAoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgtMSk7CisJCX0KKwkJdC5saW5lID0gY3VycmVudC5nZXRMaW5lKCk7CisJCXQuY2hhclBvc2l0aW9uSW5MaW5lID0gY3VycmVudC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJdC5jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworCQl0LmlucHV0ID0gY3VycmVudC5nZXRJbnB1dFN0cmVhbSgpOworCQlyZXR1cm4gdDsKKwl9CisKKwkvKiogU2V0IHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJlc2V0IHRoZSBwYXJzZXIgKi8KKwlwdWJsaWMgdm9pZCBzZXRUb2tlblN0cmVhbShUb2tlblN0cmVhbSBpbnB1dCkgeworCQl0aGlzLmlucHV0ID0gbnVsbDsKKwkJcmVzZXQoKTsKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworCX0KKworICAgIHB1YmxpYyBUb2tlblN0cmVhbSBnZXRUb2tlblN0cmVhbSgpIHsKKwkJcmV0dXJuIGlucHV0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIGlucHV0LmdldFNvdXJjZU5hbWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFjZUluKFN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgIHsKKwkJc3VwZXIudHJhY2VJbihydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7CisJfQorCisJcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSAgeworCQlzdXBlci50cmFjZU91dChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTM4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWU7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWU7CisKKy8qKiBSdWxlcyB0aGF0IHJldHVybiBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUgbXVzdCByZXR1cm4gYW4gb2JqZWN0CisgKiAgY29udGFpbmluZyBhbGwgdGhlIHZhbHVlcy4gIEJlc2lkZXMgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbgorICogIFJ1bGVMYWJlbFNjb3BlLnByZWRlZmluZWRSdWxlUHJvcGVydGllc1Njb3BlIHRoZXJlIG1heSBiZSB1c2VyLWRlZmluZWQKKyAqICByZXR1cm4gdmFsdWVzLiAgVGhpcyBjbGFzcyBzaW1wbHkgZGVmaW5lcyB0aGUgbWluaW11bSBwcm9wZXJ0aWVzIHRoYXQKKyAqICBhcmUgYWx3YXlzIGRlZmluZWQgYW5kIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBvdGhlcnMgdGhhdCBtaWdodCBiZQorICogIGF2YWlsYWJsZSBkZXBlbmRpbmcgb24gb3V0cHV0IG9wdGlvbiBzdWNoIGFzIHRlbXBsYXRlIGFuZCB0cmVlLgorICoKKyAqICBOb3RlIHRleHQgaXMgbm90IGFuIGFjdHVhbCBwcm9wZXJ0eSBvZiB0aGUgcmV0dXJuIHZhbHVlLCBpdCBpcyBjb21wdXRlZAorICogIGZyb20gc3RhcnQgYW5kIHN0b3AgdXNpbmcgdGhlIGlucHV0IHN0cmVhbSdzIHRvU3RyaW5nKCkgbWV0aG9kLiAgSQorICogIGNvdWxkIGFkZCBhIGN0b3IgdG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBwYXNzIGluIGFuZCBzdG9yZSB0aGUgaW5wdXQKKyAqICBzdHJlYW0sIGJ1dCBJJ20gbm90IHN1cmUgd2Ugd2FudCB0byBkbyB0aGF0LiAgSXQgd291bGQgc2VlbSB0byBiZSB1bmRlZmluZWQKKyAqICB0byBnZXQgdGhlIC50ZXh0IHByb3BlcnR5IGFueXdheSBpZiB0aGUgcnVsZSBtYXRjaGVzIHRva2VucyBmcm9tIG11bHRpcGxlCisgKiAgaW5wdXQgc3RyZWFtcy4KKyAqCisgKiAgSSBkbyBub3QgdXNlIGdldHRlcnMgZm9yIGZpZWxkcyBvZiBvYmplY3RzIHRoYXQgYXJlIHVzZWQgc2ltcGx5IHRvCisgKiAgZ3JvdXAgdmFsdWVzIHN1Y2ggYXMgdGhpcyBhZ2dyZWdhdGUuICBUaGUgZ2V0dGVycy9zZXR0ZXJzIGFyZSB0aGVyZSB0bworICogIHNhdGlzZnkgdGhlIHN1cGVyY2xhc3MgaW50ZXJmYWNlLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VyUnVsZVJldHVyblNjb3BlIGV4dGVuZHMgUnVsZVJldHVyblNjb3BlIHsKKwlwdWJsaWMgVG9rZW4gc3RhcnQsIHN0b3A7CisJcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsgcmV0dXJuIHN0YXJ0OyB9CisJcHVibGljIE9iamVjdCBnZXRTdG9wKCkgeyByZXR1cm4gc3RvcDsgfQorCisJcHVibGljIE9iamVjdCB0cmVlOyAvLyBvbmx5IHVzZWQgd2hlbiBvdXRwdXQ9QVNUCisJcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9SZWNvZ25pemVyU2hhcmVkU3RhdGUuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9SZWNvZ25pemVyU2hhcmVkU3RhdGUuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9SZWNvZ25pemVyU2hhcmVkU3RhdGUuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL1J1bGVSZXR1cm5TY29wZS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1J1bGVSZXR1cm5TY29wZS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9SdWxlUmV0dXJuU2NvcGUuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1J1bGVSZXR1cm5TY29wZS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvU2VyaWFsaXplZEdyYW1tYXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9TZXJpYWxpemVkR3JhbW1hci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9TZXJpYWxpemVkR3JhbW1hci5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvU2VyaWFsaXplZEdyYW1tYXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW4uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW4uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1Rva2VuLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5SZXdyaXRlU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU291cmNlLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5Tb3VyY2UuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5Tb3VyY2UuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU291cmNlLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9Ub2tlblN0cmVhbS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9Ub2tlblN0cmVhbS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVW5idWZmZXJlZFRva2VuU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvVW5idWZmZXJlZFRva2VuU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL1VuYnVmZmVyZWRUb2tlblN0cmVhbS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvVW5idWZmZXJlZFRva2VuU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9CbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0JsYW5rRGVidWdFdmVudExpc3RlbmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9CbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvQmxhbmtEZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRIdWIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z0V2ZW50SHViLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRIdWIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRIdWIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRMaXN0ZW5lci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRMaXN0ZW5lci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRMaXN0ZW5lci5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdFdmVudFJlcGVhdGVyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdFdmVudFJlcGVhdGVyLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnRXZlbnRSZXBlYXRlci5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdFdmVudFJlcGVhdGVyLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z0V2ZW50U29ja2V0UHJveHkuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z0V2ZW50U29ja2V0UHJveHkuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdFdmVudFNvY2tldFByb3h5LmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z0V2ZW50U29ja2V0UHJveHkuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnUGFyc2VyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdQYXJzZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdQYXJzZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnUGFyc2VyLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdUb2tlblN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1Rva2VuU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVBZGFwdG9yLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdUcmVlQWRhcHRvci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVBZGFwdG9yLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVBZGFwdG9yLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVOb2RlU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdUcmVlTm9kZVN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVOb2RlU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVOb2RlU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdUcmVlUGFyc2VyLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9EZWJ1Z1RyZWVQYXJzZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1BhcnNlVHJlZUJ1aWxkZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9QYXJzZVRyZWVCdWlsZGVyLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1BhcnNlVHJlZUJ1aWxkZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1BhcnNlVHJlZUJ1aWxkZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1Byb2ZpbGVyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvUHJvZmlsZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvUHJvZmlsZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1Byb2ZpbGVyLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9SZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1RyYWNlRGVidWdFdmVudExpc3RlbmVyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL1RyYWNlRGVidWdFdmVudExpc3RlbmVyLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9UcmFjZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9UcmFjZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvVHJhY2VyLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9kZWJ1Zy9UcmFjZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL21pc2MvRG91YmxlS2V5TWFwLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9Eb3VibGVLZXlNYXAuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9Eb3VibGVLZXlNYXAuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL21pc2MvRG91YmxlS2V5TWFwLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9taXNjL0Zhc3RRdWV1ZS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL21pc2MvRmFzdFF1ZXVlLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL21pc2MvRmFzdFF1ZXVlLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9taXNjL0Zhc3RRdWV1ZS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9JbnRBcnJheS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL21pc2MvSW50QXJyYXkuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9JbnRBcnJheS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9JbnRBcnJheS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9Mb29rYWhlYWRTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9taXNjL0xvb2thaGVhZFN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS9taXNjL0xvb2thaGVhZFN0cmVhbS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvbWlzYy9Mb29rYWhlYWRTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL21pc2MvU3RhdHMuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS9taXNjL1N0YXRzLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL21pc2MvU3RhdHMuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL21pc2MvU3RhdHMuamF2YQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWUuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkZDA1MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogQSBnZW5lcmljIHRyZWUgaW1wbGVtZW50YXRpb24gd2l0aCBubyBwYXlsb2FkLiAgWW91IG11c3Qgc3ViY2xhc3MgdG8KKyAqICBhY3R1YWxseSBoYXZlIGFueSB1c2VyIGRhdGEuICBBTlRMUiB2MyB1c2VzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcHByb2FjaAorICogIGluc3RlYWQgb2YgdGhlIGNoaWxkLXNpYmxpbmcgYXBwcm9hY2ggaW4gdjIuICBBIGZsYXQgdHJlZSAoYSBsaXN0KSBpcworICogIGFuIGVtcHR5IG5vZGUgd2hvc2UgY2hpbGRyZW4gcmVwcmVzZW50IHRoZSBsaXN0LiAgQW4gZW1wdHksIGJ1dAorICogIG5vbi1udWxsIG5vZGUgaXMgY2FsbGVkICJuaWwiLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVRyZWUgaW1wbGVtZW50cyBUcmVlIHsKKwlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKKworCXB1YmxpYyBCYXNlVHJlZSgpIHsKKwl9CisKKwkvKiogQ3JlYXRlIGEgbmV3IG5vZGUgZnJvbSBhbiBleGlzdGluZyBub2RlIGRvZXMgbm90aGluZyBmb3IgQmFzZVRyZWUKKwkgKiAgYXMgdGhlcmUgYXJlIG5vIGZpZWxkcyBvdGhlciB0aGFuIHRoZSBjaGlsZHJlbiBsaXN0LCB3aGljaCBjYW5ub3QKKwkgKiAgYmUgY29waWVkIGFzIHRoZSBjaGlsZHJlbiBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGlzIG5vZGUuCisJICovCisJcHVibGljIEJhc2VUcmVlKFRyZWUgbm9kZSkgeworCX0KKworCXB1YmxpYyBUcmVlIGdldENoaWxkKGludCBpKSB7CisJCWlmICggY2hpbGRyZW49PW51bGwgfHwgaT49Y2hpbGRyZW4uc2l6ZSgpICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIChUcmVlKWNoaWxkcmVuLmdldChpKTsKKwl9CisKKwkvKiogR2V0IHRoZSBjaGlsZHJlbiBpbnRlcm5hbCBMaXN0OyBub3RlIHRoYXQgaWYgeW91IGRpcmVjdGx5IG1lc3Mgd2l0aAorCSAqICB0aGUgbGlzdCwgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKKwkJcmV0dXJuIGNoaWxkcmVuOworCX0KKworCXB1YmxpYyBUcmVlIGdldEZpcnN0Q2hpbGRXaXRoVHlwZShpbnQgdHlwZSkgeworCQlmb3IgKGludCBpID0gMDsgY2hpbGRyZW4hPW51bGwgJiYgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlUcmVlIHQgPSAoVHJlZSkgY2hpbGRyZW4uZ2V0KGkpOworCQkJaWYgKCB0LmdldFR5cGUoKT09dHlwZSApIHsKKwkJCQlyZXR1cm4gdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWlmICggY2hpbGRyZW49PW51bGwgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKiBBZGQgdCBhcyBjaGlsZCBvZiB0aGlzIG5vZGUuCisJICoKKwkgKiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisJICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHRoaXMgcm91dGluZSBtb3ZlcyBjaGlsZHJlbiB0byB0IHZpYQorCSAqICB0LmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47IGkuZS4sIHdpdGhvdXQgY29weWluZyB0aGUgYXJyYXkuCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVHJlZSB0KSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgY2hpbGQgIit0LnRvU3RyaW5nVHJlZSgpKyIgIit0aGlzLnRvU3RyaW5nVHJlZSgpKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4aXN0aW5nIGNoaWxkcmVuOiAiK2NoaWxkcmVuKTsKKwkJaWYgKCB0PT1udWxsICkgeworCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nIHVwb24gYWRkQ2hpbGQobnVsbCkKKwkJfQorCQlCYXNlVHJlZSBjaGlsZFRyZWUgPSAoQmFzZVRyZWUpdDsKKwkJaWYgKCBjaGlsZFRyZWUuaXNOaWwoKSApIHsgLy8gdCBpcyBhbiBlbXB0eSBub2RlIHBvc3NpYmx5IHdpdGggY2hpbGRyZW4KKwkJCWlmICggdGhpcy5jaGlsZHJlbiE9bnVsbCAmJiB0aGlzLmNoaWxkcmVuID09IGNoaWxkVHJlZS5jaGlsZHJlbiApIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiYXR0ZW1wdCB0byBhZGQgY2hpbGQgbGlzdCB0byBpdHNlbGYiKTsKKwkJCX0KKwkJCS8vIGp1c3QgYWRkIGFsbCBvZiBjaGlsZFRyZWUncyBjaGlsZHJlbiB0byB0aGlzCisJCQlpZiAoIGNoaWxkVHJlZS5jaGlsZHJlbiE9bnVsbCApIHsKKwkJCQlpZiAoIHRoaXMuY2hpbGRyZW4hPW51bGwgKSB7IC8vIG11c3QgY29weSwgdGhpcyBoYXMgY2hpbGRyZW4gYWxyZWFkeQorCQkJCQlpbnQgbiA9IGNoaWxkVHJlZS5jaGlsZHJlbi5zaXplKCk7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJCQlUcmVlIGMgPSAoVHJlZSljaGlsZFRyZWUuY2hpbGRyZW4uZ2V0KGkpOworCQkJCQkJdGhpcy5jaGlsZHJlbi5hZGQoYyk7CisJCQkJCQkvLyBoYW5kbGUgZG91YmxlLWxpbmsgc3R1ZmYgZm9yIGVhY2ggY2hpbGQgb2YgbmlsIHJvb3QKKwkJCQkJCWMuc2V0UGFyZW50KHRoaXMpOworCQkJCQkJYy5zZXRDaGlsZEluZGV4KGNoaWxkcmVuLnNpemUoKS0xKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gbm8gY2hpbGRyZW4gZm9yIHRoaXMgYnV0IHQgaGFzIGNoaWxkcmVuOyBqdXN0IHNldCBwb2ludGVyCisJCQkJCS8vIGNhbGwgZ2VuZXJhbCBmcmVzaGVuZXIgcm91dGluZQorCQkJCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRUcmVlLmNoaWxkcmVuOworCQkJCQl0aGlzLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7IC8vIGNoaWxkIGlzIG5vdCBuaWwgKGRvbid0IGNhcmUgYWJvdXQgY2hpbGRyZW4pCisJCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgeworCQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW5MaXN0KCk7IC8vIGNyZWF0ZSBjaGlsZHJlbiBsaXN0IG9uIGRlbWFuZAorCQkJfQorCQkJY2hpbGRyZW4uYWRkKHQpOworCQkJY2hpbGRUcmVlLnNldFBhcmVudCh0aGlzKTsKKwkJCWNoaWxkVHJlZS5zZXRDaGlsZEluZGV4KGNoaWxkcmVuLnNpemUoKS0xKTsKKwkJfQorCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vdyBjaGlsZHJlbiBhcmU6ICIrY2hpbGRyZW4pOworCX0KKworCS8qKiBBZGQgYWxsIGVsZW1lbnRzIG9mIGtpZHMgbGlzdCBhcyBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihMaXN0IGtpZHMpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBraWRzLnNpemUoKTsgaSsrKSB7CisJCQlUcmVlIHQgPSAoVHJlZSkga2lkcy5nZXQoaSk7CisJCQlhZGRDaGlsZCh0KTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldENoaWxkKGludCBpLCBUcmVlIHQpIHsKKwkJaWYgKCB0PT1udWxsICkgeworCQkJcmV0dXJuOworCQl9CisJCWlmICggdC5pc05pbCgpICkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHNpbmdsZSBjaGlsZCB0byBhIGxpc3QiKTsKKwkJfQorCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgeworCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbkxpc3QoKTsKKwkJfQorCQljaGlsZHJlbi5zZXQoaSwgdCk7CisJCXQuc2V0UGFyZW50KHRoaXMpOworCQl0LnNldENoaWxkSW5kZXgoaSk7CisJfQorCisJLyoqIEluc2VydCBjaGlsZCB0IGF0IGNoaWxkIHBvc2l0aW9uIGkgKDAuLm4tMSkgYnkgc2hpZnRpbmcgY2hpbGRyZW4KKwkJaSsxLi5uLTEgdG8gdGhlIHJpZ2h0IG9uZSBwb3NpdGlvbi4gU2V0IHBhcmVudCAvIGluZGV4ZXMgcHJvcGVybHkKKwkgCWJ1dCBkb2VzIE5PVCBjb2xsYXBzZSBuaWwtcm9vdGVkIHQncyB0aGF0IGNvbWUgaW4gaGVyZSBsaWtlIGFkZENoaWxkLgorCSAqLworCXB1YmxpYyB2b2lkIGluc2VydENoaWxkKGludCBpLCBPYmplY3QgdCkgeworCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgcmV0dXJuOworCQljaGlsZHJlbi5hZGQoaSwgdCk7CisJCS8vIHdhbGsgb3RoZXJzIHRvIGluY3JlbWVudCB0aGVpciBjaGlsZCBpbmRleGVzCisJCS8vIHNldCBpbmRleCwgcGFyZW50IG9mIHRoaXMgb25lIHRvbworCQl0aGlzLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoaSk7CisJfQorCisJcHVibGljIE9iamVjdCBkZWxldGVDaGlsZChpbnQgaSkgeworCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJVHJlZSBraWxsZWQgPSAoVHJlZSljaGlsZHJlbi5yZW1vdmUoaSk7CisJCS8vIHdhbGsgcmVzdCBhbmQgZGVjcmVtZW50IHRoZWlyIGNoaWxkIGluZGV4ZXMKKwkJdGhpcy5mcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKGkpOworCQlyZXR1cm4ga2lsbGVkOworCX0KKworCS8qKiBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKwkgKiAgYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisJICogIEZvciBodWdlIGNoaWxkIGxpc3RzLCBpbnNlcnRpbmcgY2hpbGRyZW4gY2FuIGZvcmNlIHdhbGtpbmcgcmVzdCBvZgorCSAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXBsYWNlQ2hpbGRyZW4oaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBPYmplY3QgdCkgeworCQkvKgorCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlcGxhY2VDaGlsZHJlbiAiK3N0YXJ0Q2hpbGRJbmRleCsiLCAiK3N0b3BDaGlsZEluZGV4KworCQkJCQkJICAgIiB3aXRoICIrKChCYXNlVHJlZSl0KS50b1N0cmluZ1RyZWUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiaW49Iit0b1N0cmluZ1RyZWUoKSk7CisJCSovCisJCWlmICggY2hpbGRyZW49PW51bGwgKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleGVzIGludmFsaWQ7IG5vIGNoaWxkcmVuIGluIGxpc3QiKTsKKwkJfQorCQlpbnQgcmVwbGFjaW5nSG93TWFueSA9IHN0b3BDaGlsZEluZGV4IC0gc3RhcnRDaGlsZEluZGV4ICsgMTsKKwkJaW50IHJlcGxhY2luZ1dpdGhIb3dNYW55OworCQlCYXNlVHJlZSBuZXdUcmVlID0gKEJhc2VUcmVlKXQ7CisJCUxpc3QgbmV3Q2hpbGRyZW4gPSBudWxsOworCQkvLyBub3JtYWxpemUgdG8gYSBsaXN0IG9mIGNoaWxkcmVuIHRvIGFkZDogbmV3Q2hpbGRyZW4KKwkJaWYgKCBuZXdUcmVlLmlzTmlsKCkgKSB7CisJCQluZXdDaGlsZHJlbiA9IG5ld1RyZWUuY2hpbGRyZW47CisJCX0KKwkJZWxzZSB7CisJCQluZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMSk7CisJCQluZXdDaGlsZHJlbi5hZGQobmV3VHJlZSk7CisJCX0KKwkJcmVwbGFjaW5nV2l0aEhvd01hbnkgPSBuZXdDaGlsZHJlbi5zaXplKCk7CisJCWludCBudW1OZXdDaGlsZHJlbiA9IG5ld0NoaWxkcmVuLnNpemUoKTsKKwkJaW50IGRlbHRhID0gcmVwbGFjaW5nSG93TWFueSAtIHJlcGxhY2luZ1dpdGhIb3dNYW55OworCQkvLyBpZiBzYW1lIG51bWJlciBvZiBub2RlcywgZG8gZGlyZWN0IHJlcGxhY2UKKwkJaWYgKCBkZWx0YSA9PSAwICkgeworCQkJaW50IGogPSAwOyAvLyBpbmRleCBpbnRvIG5ldyBjaGlsZHJlbgorCQkJZm9yIChpbnQgaT1zdGFydENoaWxkSW5kZXg7IGk8PXN0b3BDaGlsZEluZGV4OyBpKyspIHsKKwkJCQlCYXNlVHJlZSBjaGlsZCA9IChCYXNlVHJlZSluZXdDaGlsZHJlbi5nZXQoaik7CisJCQkJY2hpbGRyZW4uc2V0KGksIGNoaWxkKTsKKwkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7CisJCQkJY2hpbGQuc2V0Q2hpbGRJbmRleChpKTsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9CisJCX0KKwkJZWxzZSBpZiAoIGRlbHRhID4gMCApIHsgLy8gZmV3ZXIgbmV3IG5vZGVzIHRoYW4gdGhlcmUgd2VyZQorCQkJLy8gc2V0IGNoaWxkcmVuIGFuZCB0aGVuIGRlbGV0ZSBleHRyYQorCQkJZm9yIChpbnQgaj0wOyBqPG51bU5ld0NoaWxkcmVuOyBqKyspIHsKKwkJCQljaGlsZHJlbi5zZXQoc3RhcnRDaGlsZEluZGV4K2osIG5ld0NoaWxkcmVuLmdldChqKSk7CisJCQl9CisJCQlpbnQgaW5kZXhUb0RlbGV0ZSA9IHN0YXJ0Q2hpbGRJbmRleCtudW1OZXdDaGlsZHJlbjsKKwkJCWZvciAoaW50IGM9aW5kZXhUb0RlbGV0ZTsgYzw9c3RvcENoaWxkSW5kZXg7IGMrKykgeworCQkJCS8vIGRlbGV0ZSBzYW1lIGluZGV4LCBzaGlmdGluZyBldmVyeWJvZHkgZG93biBlYWNoIHRpbWUKKwkJCQljaGlsZHJlbi5yZW1vdmUoaW5kZXhUb0RlbGV0ZSk7CisJCQl9CisJCQlmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKHN0YXJ0Q2hpbGRJbmRleCk7CisJCX0KKwkJZWxzZSB7IC8vIG1vcmUgbmV3IG5vZGVzIHRoYW4gd2VyZSB0aGVyZSBiZWZvcmUKKwkJCS8vIGZpbGwgaW4gYXMgbWFueSBjaGlsZHJlbiBhcyB3ZSBjYW4gKHJlcGxhY2luZ0hvd01hbnkpIHcvbyBtb3ZpbmcgZGF0YQorCQkJZm9yIChpbnQgaj0wOyBqPHJlcGxhY2luZ0hvd01hbnk7IGorKykgeworCQkJCWNoaWxkcmVuLnNldChzdGFydENoaWxkSW5kZXgraiwgbmV3Q2hpbGRyZW4uZ2V0KGopKTsKKwkJCX0KKwkJCWludCBudW1Ub0luc2VydCA9IHJlcGxhY2luZ1dpdGhIb3dNYW55LXJlcGxhY2luZ0hvd01hbnk7CisJCQlmb3IgKGludCBqPXJlcGxhY2luZ0hvd01hbnk7IGo8cmVwbGFjaW5nV2l0aEhvd01hbnk7IGorKykgeworCQkJCWNoaWxkcmVuLmFkZChzdGFydENoaWxkSW5kZXgraiwgbmV3Q2hpbGRyZW4uZ2V0KGopKTsKKwkJCX0KKwkJCWZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoc3RhcnRDaGlsZEluZGV4KTsKKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigib3V0PSIrdG9TdHJpbmdUcmVlKCkpOworCX0KKworCS8qKiBPdmVycmlkZSBpbiBhIHN1YmNsYXNzIHRvIGNoYW5nZSB0aGUgaW1wbCBvZiBjaGlsZHJlbiBsaXN0ICovCisJcHJvdGVjdGVkIExpc3QgY3JlYXRlQ2hpbGRyZW5MaXN0KCkgeworCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzTmlsKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqIFNldCB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbmRleCB2YWx1ZXMgZm9yIGFsbCBjaGlsZCBvZiB0ICovCisJcHVibGljIHZvaWQgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcygpIHsKKwkJZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcygwKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKGludCBvZmZzZXQpIHsKKwkJaW50IG4gPSBnZXRDaGlsZENvdW50KCk7CisJCWZvciAoaW50IGMgPSBvZmZzZXQ7IGMgPCBuOyBjKyspIHsKKwkJCVRyZWUgY2hpbGQgPSAoVHJlZSlnZXRDaGlsZChjKTsKKwkJCWNoaWxkLnNldENoaWxkSW5kZXgoYyk7CisJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzRGVlcGx5KCkgeworCQlmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzRGVlcGx5KDApOworCX0KKworCXB1YmxpYyB2b2lkIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXNEZWVwbHkoaW50IG9mZnNldCkgeworCQlpbnQgbiA9IGdldENoaWxkQ291bnQoKTsKKwkJZm9yIChpbnQgYyA9IG9mZnNldDsgYyA8IG47IGMrKykgeworCQkJQmFzZVRyZWUgY2hpbGQgPSAoQmFzZVRyZWUpZ2V0Q2hpbGQoYyk7CisJCQljaGlsZC5zZXRDaGlsZEluZGV4KGMpOworCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOworCQkJY2hpbGQuZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlc0RlZXBseSgpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKSB7CisJCXNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKG51bGwsIC0xKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyhUcmVlIHBhcmVudCwgaW50IGkpIHsKKwkJaWYgKCBwYXJlbnQhPXRoaXMuZ2V0UGFyZW50KCkgKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJlbnRzIGRvbid0IG1hdGNoOyBleHBlY3RlZCAiK3BhcmVudCsiIGZvdW5kICIrdGhpcy5nZXRQYXJlbnQoKSk7CisJCX0KKwkJaWYgKCBpIT10aGlzLmdldENoaWxkSW5kZXgoKSApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNoaWxkIGluZGV4ZXMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICIraSsiIGZvdW5kICIrdGhpcy5nZXRDaGlsZEluZGV4KCkpOworCQl9CisJCWludCBuID0gdGhpcy5nZXRDaGlsZENvdW50KCk7CisJCWZvciAoaW50IGMgPSAwOyBjIDwgbjsgYysrKSB7CisJCQlDb21tb25UcmVlIGNoaWxkID0gKENvbW1vblRyZWUpdGhpcy5nZXRDaGlsZChjKTsKKwkJCWNoaWxkLnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKHRoaXMsIGMpOworCQl9CisJfQorCisJLyoqIEJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy4gKi8KKwlwdWJsaWMgaW50IGdldENoaWxkSW5kZXgoKSB7CisJCXJldHVybiAwOworCX0KKwlwdWJsaWMgdm9pZCBzZXRDaGlsZEluZGV4KGludCBpbmRleCkgeworCX0KKworCS8qKiBCYXNlVHJlZSBkb2Vzbid0IHRyYWNrIHBhcmVudCBwb2ludGVycy4gKi8KKwlwdWJsaWMgVHJlZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUcmVlIHQpIHsKKwl9CisKKyAgICAvKiogV2FsayB1cHdhcmRzIGxvb2tpbmcgZm9yIGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0FuY2VzdG9yKGludCB0dHlwZSkgeyByZXR1cm4gZ2V0QW5jZXN0b3IodHR5cGUpIT1udWxsOyB9CisKKyAgICAvKiogV2FsayB1cHdhcmRzIGFuZCBnZXQgZmlyc3QgYW5jZXN0b3Igd2l0aCB0aGlzIHRva2VuIHR5cGUuICovCisgICAgcHVibGljIFRyZWUgZ2V0QW5jZXN0b3IoaW50IHR0eXBlKSB7CisgICAgICAgIFRyZWUgdCA9IHRoaXM7CisgICAgICAgIHQgPSB0LmdldFBhcmVudCgpOworICAgICAgICB3aGlsZSAoIHQhPW51bGwgKSB7CisgICAgICAgICAgICBpZiAoIHQuZ2V0VHlwZSgpPT10dHlwZSApIHJldHVybiB0OworICAgICAgICAgICAgdCA9IHQuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGFuY2VzdG9ycyBvZiB0aGlzIG5vZGUuICBUaGUgZmlyc3Qgbm9kZSBvZgorICAgICAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRBbmNlc3RvcnMoKSB7CisgICAgICAgIGlmICggZ2V0UGFyZW50KCk9PW51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgTGlzdCBhbmNlc3RvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFRyZWUgdCA9IHRoaXM7CisgICAgICAgIHQgPSB0LmdldFBhcmVudCgpOworICAgICAgICB3aGlsZSAoIHQhPW51bGwgKSB7CisgICAgICAgICAgICBhbmNlc3RvcnMuYWRkKDAsIHQpOyAvLyBpbnNlcnQgYXQgc3RhcnQKKyAgICAgICAgICAgIHQgPSB0LmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmNlc3RvcnM7CisgICAgfQorCisgICAgLyoqIFByaW50IG91dCBhIHdob2xlIHRyZWUgbm90IGp1c3QgYSBub2RlICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZ1RyZWUoKSB7CisJCWlmICggY2hpbGRyZW49PW51bGwgfHwgY2hpbGRyZW4uc2l6ZSgpPT0wICkgeworCQkJcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsKKwkJfQorCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpZiAoICFpc05pbCgpICkgeworCQkJYnVmLmFwcGVuZCgiKCIpOworCQkJYnVmLmFwcGVuZCh0aGlzLnRvU3RyaW5nKCkpOworCQkJYnVmLmFwcGVuZCgnICcpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBjaGlsZHJlbiE9bnVsbCAmJiBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCVRyZWUgdCA9IChUcmVlKWNoaWxkcmVuLmdldChpKTsKKwkJCWlmICggaT4wICkgeworCQkJCWJ1Zi5hcHBlbmQoJyAnKTsKKwkJCX0KKwkJCWJ1Zi5hcHBlbmQodC50b1N0cmluZ1RyZWUoKSk7CisJCX0KKwkJaWYgKCAhaXNOaWwoKSApIHsKKwkJCWJ1Zi5hcHBlbmQoIikiKTsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisgICAgcHVibGljIGludCBnZXRMaW5lKCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwdWJsaWMgaW50IGdldENoYXJQb3NpdGlvbkluTGluZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoqIE92ZXJyaWRlIHRvIHNheSBob3cgYSBub2RlIChub3QgYSB0cmVlKSBzaG91bGQgbG9vayBhcyB0ZXh0ICovCisJcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOworfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWVBZGFwdG9yLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZUFkYXB0b3IuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZUFkYXB0b3IuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWVBZGFwdG9yLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0J1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0J1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0J1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25FcnJvck5vZGUuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25FcnJvck5vZGUuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWUuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWUuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWUuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVBZGFwdG9yLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuamF2YQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZU5vZGVTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkYmRkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLnRyZWU7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5taXNjLkxvb2thaGVhZFN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5taXNjLkludEFycmF5OworCitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBDb21tb25UcmVlTm9kZVN0cmVhbSBleHRlbmRzIExvb2thaGVhZFN0cmVhbTxPYmplY3Q+IGltcGxlbWVudHMgVHJlZU5vZGVTdHJlYW0geworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSA9IDEwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0NBTExfU1RBQ0tfU0laRSA9IDEwOworCisJLyoqIFB1bGwgbm9kZXMgZnJvbSB3aGljaCB0cmVlPyAqLworCXByb3RlY3RlZCBPYmplY3Qgcm9vdDsKKworCS8qKiBJZiB0aGlzIHRyZWUgKHJvb3QpIHdhcyBjcmVhdGVkIGZyb20gYSB0b2tlbiBzdHJlYW0sIHRyYWNrIGl0LiAqLworCXByb3RlY3RlZCBUb2tlblN0cmVhbSB0b2tlbnM7CisKKwkvKiogV2hhdCB0cmVlIGFkYXB0b3Igd2FzIHVzZWQgdG8gYnVpbGQgdGhlc2UgdHJlZXMgKi8KKwlUcmVlQWRhcHRvciBhZGFwdG9yOworCisgICAgLyoqIFRoZSB0cmVlIGl0ZXJhdG9yIHdlIHVzaW5nICovCisgICAgcHJvdGVjdGVkIFRyZWVJdGVyYXRvciBpdDsKKworICAgIC8qKiBTdGFjayBvZiBpbmRleGVzIHVzZWQgZm9yIHB1c2gvcG9wIGNhbGxzICovCisgICAgcHJvdGVjdGVkIEludEFycmF5IGNhbGxzOworCisgICAgLyoqIFRyZWUgKG5pbCBBIEIgQykgdHJlZXMgbGlrZSBmbGF0IEEgQiBDIHN0cmVhbXMgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOaWxSb290ID0gZmFsc2U7CisKKyAgICAvKiogVHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxldmVsID0gMDsKKworCXB1YmxpYyBDb21tb25UcmVlTm9kZVN0cmVhbShPYmplY3QgdHJlZSkgeworCQl0aGlzKG5ldyBDb21tb25UcmVlQWRhcHRvcigpLCB0cmVlKTsKKwl9CisKKwlwdWJsaWMgQ29tbW9uVHJlZU5vZGVTdHJlYW0oVHJlZUFkYXB0b3IgYWRhcHRvciwgT2JqZWN0IHRyZWUpIHsKKwkJdGhpcy5yb290ID0gdHJlZTsKKwkJdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICAgICAgaXQgPSBuZXcgVHJlZUl0ZXJhdG9yKGFkYXB0b3Iscm9vdCk7CisJfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgICAgIGl0LnJlc2V0KCk7CisgICAgICAgIGhhc05pbFJvb3QgPSBmYWxzZTsKKyAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICBpZiAoIGNhbGxzICE9IG51bGwgKSBjYWxscy5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBQdWxsIGVsZW1lbnRzIGZyb20gdHJlZSBpdGVyYXRvci4gIFRyYWNrIHRyZWUgbGV2ZWwgMC4ubWF4X2xldmVsLgorICAgICAqICBJZiBuaWwgcm9vdGVkIHRyZWUsIGRvbid0IGdpdmUgaW5pdGlhbCBuaWwgYW5kIERPV04gbm9yIGZpbmFsIFVQLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7CisgICAgICAgIE9iamVjdCB0ID0gaXQubmV4dCgpOworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicHVsbGVkICIrYWRhcHRvci5nZXRUeXBlKHQpKTsKKyAgICAgICAgaWYgKCB0ID09IGl0LnVwICkgeworICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgIGlmICggbGV2ZWw9PTAgJiYgaGFzTmlsUm9vdCApIHJldHVybiBpdC5uZXh0KCk7IC8vIGRvbid0IGdpdmUgbGFzdCBVUDsgZ2V0IEVPRgorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB0ID09IGl0LmRvd24gKSBsZXZlbCsrOworICAgICAgICBpZiAoIGxldmVsPT0wICYmIGFkYXB0b3IuaXNOaWwodCkgKSB7IC8vIGlmIG5pbCByb290LCBzY2FyZiBuaWwsIERPV04KKyAgICAgICAgICAgIGhhc05pbFJvb3QgPSB0cnVlOworICAgICAgICAgICAgdCA9IGl0Lm5leHQoKTsgLy8gdCBpcyBub3cgRE9XTiwgc28gZ2V0IGZpcnN0IHJlYWwgbm9kZSBuZXh0CisgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VPRihPYmplY3QgbykgeyByZXR1cm4gYWRhcHRvci5nZXRUeXBlKG8pID09IFRva2VuLkVPRjsgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlTmF2aWdhdGlvbk5vZGVzKGJvb2xlYW4gdW5pcXVlTmF2aWdhdGlvbk5vZGVzKSB7IH0KKworCXB1YmxpYyBPYmplY3QgZ2V0VHJlZVNvdXJjZSgpIHsJcmV0dXJuIHJvb3Q7IH0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsgcmV0dXJuIGdldFRva2VuU3RyZWFtKCkuZ2V0U291cmNlTmFtZSgpOyB9CisKKwlwdWJsaWMgVG9rZW5TdHJlYW0gZ2V0VG9rZW5TdHJlYW0oKSB7IHJldHVybiB0b2tlbnM7IH0KKworCXB1YmxpYyB2b2lkIHNldFRva2VuU3RyZWFtKFRva2VuU3RyZWFtIHRva2VucykgeyB0aGlzLnRva2VucyA9IHRva2VuczsgfQorCisJcHVibGljIFRyZWVBZGFwdG9yIGdldFRyZWVBZGFwdG9yKCkgeyByZXR1cm4gYWRhcHRvcjsgfQorCisJcHVibGljIHZvaWQgc2V0VHJlZUFkYXB0b3IoVHJlZUFkYXB0b3IgYWRhcHRvcikgeyB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOyB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkFic29sdXRlIG5vZGUgaW5kZXhlcyBhcmUgbWVhbmluZ2xlc3MgaW4gYW4gdW5idWZmZXJlZCBzdHJlYW0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IExBKGludCBpKSB7IHJldHVybiBhZGFwdG9yLmdldFR5cGUoTFQoaSkpOyB9CisKKyAgICAvKiogTWFrZSBzdHJlYW0ganVtcCB0byBhIG5ldyBsb2NhdGlvbiwgc2F2aW5nIG9sZCBsb2NhdGlvbi4KKyAgICAgKiAgU3dpdGNoIGJhY2sgd2l0aCBwb3AoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoKGludCBpbmRleCkgeworICAgICAgICBpZiAoIGNhbGxzPT1udWxsICkgeworICAgICAgICAgICAgY2FsbHMgPSBuZXcgSW50QXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBjYWxscy5wdXNoKHApOyAvLyBzYXZlIGN1cnJlbnQgaW5kZXgKKyAgICAgICAgc2VlayhpbmRleCk7CisgICAgfQorCisgICAgLyoqIFNlZWsgYmFjayB0byBwcmV2aW91cyBpbmRleCBzYXZlZCBkdXJpbmcgbGFzdCBwdXNoKCkgY2FsbC4KKyAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHBvcCgpIHsKKyAgICAgICAgaW50IHJldCA9IGNhbGxzLnBvcCgpOworICAgICAgICBzZWVrKHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisJLy8gVFJFRSBSRVdSSVRFIElOVEVSRkFDRQorCisJcHVibGljIHZvaWQgcmVwbGFjZUNoaWxkcmVuKE9iamVjdCBwYXJlbnQsIGludCBzdGFydENoaWxkSW5kZXgsIGludCBzdG9wQ2hpbGRJbmRleCwgT2JqZWN0IHQpIHsKKwkJaWYgKCBwYXJlbnQhPW51bGwgKSB7CisJCQlhZGFwdG9yLnJlcGxhY2VDaGlsZHJlbihwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCwgc3RvcENoaWxkSW5kZXgsIHQpOworCQl9CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhPYmplY3Qgc3RhcnQsIE9iamVjdCBzdG9wKSB7CisgICAgICAgIC8vIHdlJ2xsIGhhdmUgdG8gd2FsayBmcm9tIHN0YXJ0IHRvIHN0b3AgaW4gdHJlZTsgd2UncmUgbm90IGtlZXBpbmcKKyAgICAgICAgLy8gYSBjb21wbGV0ZSBub2RlIHN0cmVhbSBidWZmZXIKKyAgICAgICAgcmV0dXJuICJuL2EiOworCX0KKworICAgIC8qKiBGb3IgZGVidWdnaW5nOyBkZXN0cnVjdGl2ZTogbW92ZXMgdHJlZSBpdGVyYXRvciB0byBlbmQuICovCisgICAgcHVibGljIFN0cmluZyB0b1Rva2VuVHlwZVN0cmluZygpIHsKKyAgICAgICAgcmVzZXQoKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgT2JqZWN0IG8gPSBMVCgxKTsKKyAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLmdldFR5cGUobyk7CisgICAgICAgIHdoaWxlICggdHlwZSE9VG9rZW4uRU9GICkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCh0eXBlKTsKKyAgICAgICAgICAgIGNvbnN1bWUoKTsKKyAgICAgICAgICAgIG8gPSBMVCgxKTsKKyAgICAgICAgICAgIHR5cGUgPSBhZGFwdG9yLmdldFR5cGUobyk7CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0RPVFRyZWVHZW5lcmF0b3IuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL0RPVFRyZWVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzUxOWQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvRE9UVHJlZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlOworCitpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLlN0cmluZ1RlbXBsYXRlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKiBBIHV0aWxpdHkgY2xhc3MgdG8gZ2VuZXJhdGUgRE9UIGRpYWdyYW1zIChncmFwaHZpeikgZnJvbQorICogIGFyYml0cmFyeSB0cmVlcy4gIFlvdSBjYW4gcGFzcyBpbiB5b3VyIG93biB0ZW1wbGF0ZXMgYW5kCisgKiAgY2FuIHBhc3MgaW4gYW55IGtpbmQgb2YgdHJlZSBvciB1c2UgVHJlZSBpbnRlcmZhY2UgbWV0aG9kLgorICogIEkgd2FudGVkIHRoaXMgc2VwYXJhdG9yIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gaW5jbHVkZQorICogIFNUIGp1c3QgdG8gdXNlIHRoZSBvcmcuYW50bHIucnVudGltZS50cmVlLiogcGFja2FnZS4KKyAqICBUaGlzIGlzIGEgc2V0IG9mIG5vbi1zdGF0aWMgbWV0aG9kcyBzbyB5b3UgY2FuIHN1YmNsYXNzCisgKiAgdG8gb3ZlcnJpZGUuICBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhbiBpbnZvY2F0aW9uOgorICoKKyAqICAgICAgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUklucHV0U3RyZWFtKFN5c3RlbS5pbik7CisgKiAgICAgIFRMZXhlciBsZXggPSBuZXcgVExleGVyKGlucHV0KTsKKyAqICAgICAgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleCk7CisgKiAgICAgIFRQYXJzZXIgcGFyc2VyID0gbmV3IFRQYXJzZXIodG9rZW5zKTsKKyAqICAgICAgVFBhcnNlci5lX3JldHVybiByID0gcGFyc2VyLmUoKTsKKyAqICAgICAgVHJlZSB0ID0gKFRyZWUpci50cmVlOworICogICAgICBTeXN0ZW0ub3V0LnByaW50bG4odC50b1N0cmluZ1RyZWUoKSk7CisgKiAgICAgIERPVFRyZWVHZW5lcmF0b3IgZ2VuID0gbmV3IERPVFRyZWVHZW5lcmF0b3IoKTsKKyAqICAgICAgU3RyaW5nVGVtcGxhdGUgc3QgPSBnZW4udG9ET1QodCk7CisgKiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdCk7CisgKi8KK3B1YmxpYyBjbGFzcyBET1RUcmVlR2VuZXJhdG9yIHsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nVGVtcGxhdGUgX3RyZWVTVCA9CisJCW5ldyBTdHJpbmdUZW1wbGF0ZSgKKwkJCSJkaWdyYXBoIHtcblxuIiArCisJCQkiXHRvcmRlcmluZz1vdXQ7XG4iICsKKwkJCSJcdHJhbmtzZXA9LjQ7XG4iICsKKwkJCSJcdGJnY29sb3I9XCJsaWdodGdyZXlcIjsgbm9kZSBbc2hhcGU9Ym94LCBmaXhlZHNpemU9ZmFsc2UsIGZvbnRzaXplPTEyLCBmb250bmFtZT1cIkhlbHZldGljYS1ib2xkXCIsIGZvbnRjb2xvcj1cImJsdWVcIlxuIiArCisJCQkiXHRcdHdpZHRoPS4yNSwgaGVpZ2h0PS4yNSwgY29sb3I9XCJibGFja1wiLCBmaWxsY29sb3I9XCJ3aGl0ZVwiLCBzdHlsZT1cImZpbGxlZCwgc29saWQsIGJvbGRcIl07XG4iICsKKwkJCSJcdGVkZ2UgW2Fycm93c2l6ZT0uNSwgY29sb3I9XCJibGFja1wiLCBzdHlsZT1cImJvbGRcIl1cblxuIiArCisJCQkiICAkbm9kZXMkXG4iICsKKwkJCSIgICRlZGdlcyRcbiIgKworCQkJIn1cbiIpOworCisJcHVibGljIHN0YXRpYyBTdHJpbmdUZW1wbGF0ZSBfbm9kZVNUID0KKwkJCW5ldyBTdHJpbmdUZW1wbGF0ZSgiJG5hbWUkIFtsYWJlbD1cIiR0ZXh0JFwiXTtcbiIpOworCisJcHVibGljIHN0YXRpYyBTdHJpbmdUZW1wbGF0ZSBfZWRnZVNUID0KKwkJCW5ldyBTdHJpbmdUZW1wbGF0ZSgiJHBhcmVudCQgLT4gJGNoaWxkJCAvLyBcIiRwYXJlbnRUZXh0JFwiIC0+IFwiJGNoaWxkVGV4dCRcIlxuIik7CisKKwkvKiogVHJhY2sgbm9kZSB0byBudW1iZXIgbWFwcGluZyBzbyB3ZSBjYW4gZ2V0IHByb3BlciBub2RlIG5hbWUgYmFjayAqLworCUhhc2hNYXAgbm9kZVRvTnVtYmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKKworCS8qKiBUcmFjayBub2RlIG51bWJlciBzbyB3ZSBjYW4gZ2V0IHVuaXF1ZSBub2RlIG5hbWVzICovCisJaW50IG5vZGVOdW1iZXIgPSAwOworCisJcHVibGljIFN0cmluZ1RlbXBsYXRlIHRvRE9UKE9iamVjdCB0cmVlLAorCQkJCQkJCQlUcmVlQWRhcHRvciBhZGFwdG9yLAorCQkJCQkJCQlTdHJpbmdUZW1wbGF0ZSBfdHJlZVNULAorCQkJCQkJCQlTdHJpbmdUZW1wbGF0ZSBfZWRnZVNUKQorCXsKKwkJU3RyaW5nVGVtcGxhdGUgdHJlZVNUID0gX3RyZWVTVC5nZXRJbnN0YW5jZU9mKCk7CisJCW5vZGVOdW1iZXIgPSAwOworCQl0b0RPVERlZmluZU5vZGVzKHRyZWUsIGFkYXB0b3IsIHRyZWVTVCk7CisJCW5vZGVOdW1iZXIgPSAwOworCQl0b0RPVERlZmluZUVkZ2VzKHRyZWUsIGFkYXB0b3IsIHRyZWVTVCk7CisJCS8qCisJCWlmICggYWRhcHRvci5nZXRDaGlsZENvdW50KHRyZWUpPT0wICkgeworICAgICAgICAgICAgLy8gc2luZ2xlIG5vZGUsIGRvbid0IGRvIGVkZ2UuCisgICAgICAgICAgICB0cmVlU1QuYWRkKCJub2RlcyIsIGFkYXB0b3IuZ2V0VGV4dCh0cmVlKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKwkJcmV0dXJuIHRyZWVTVDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nVGVtcGxhdGUgdG9ET1QoT2JqZWN0IHRyZWUsCisJCQkJCQkJCVRyZWVBZGFwdG9yIGFkYXB0b3IpCisJeworCQlyZXR1cm4gdG9ET1QodHJlZSwgYWRhcHRvciwgX3RyZWVTVCwgX2VkZ2VTVCk7CisJfQorCisJLyoqIEdlbmVyYXRlIERPVCAoZ3JhcGh2aXopIGZvciBhIHdob2xlIHRyZWUgbm90IGp1c3QgYSBub2RlLgorCSAqICBGb3IgZXhhbXBsZSwgMys0KjUgc2hvdWxkIGdlbmVyYXRlOgorCSAqCisJICogZGlncmFwaCB7CisJICogICBub2RlIFtzaGFwZT1wbGFpbnRleHQsIGZpeGVkc2l6ZT10cnVlLCBmb250c2l6ZT0xMSwgZm9udG5hbWU9IkNvdXJpZXIiLAorCSAqICAgICAgICAgd2lkdGg9LjQsIGhlaWdodD0uMl07CisJICogICBlZGdlIFthcnJvd3NpemU9LjddCisJICogICAiKyItPjMKKwkgKiAgICIrIi0+IioiCisJICogICAiKiItPjQKKwkgKiAgICIqIi0+NQorCSAqIH0KKwkgKgorCSAqIFJldHVybiB0aGUgU1Qgbm90IGEgc3RyaW5nIGluIGNhc2UgcGVvcGxlIHdhbnQgdG8gYWx0ZXIuCisJICoKKwkgKiBUYWtlcyBhIFRyZWUgaW50ZXJmYWNlIG9iamVjdC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nVGVtcGxhdGUgdG9ET1QoVHJlZSB0cmVlKSB7CisJCXJldHVybiB0b0RPVCh0cmVlLCBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdG9ET1REZWZpbmVOb2RlcyhPYmplY3QgdHJlZSwKKwkJCQkJCQkJCVRyZWVBZGFwdG9yIGFkYXB0b3IsCisJCQkJCQkJCQlTdHJpbmdUZW1wbGF0ZSB0cmVlU1QpCisJeworCQlpZiAoIHRyZWU9PW51bGwgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IG4gPSBhZGFwdG9yLmdldENoaWxkQ291bnQodHJlZSk7CisJCWlmICggbj09MCApIHsKKwkJCS8vIG11c3QgaGF2ZSBhbHJlYWR5IGR1bXBlZCBhcyBjaGlsZCBmcm9tIHByZXZpb3VzCisJCQkvLyBpbnZvY2F0aW9uOyBkbyBub3RoaW5nCisJCQlyZXR1cm47CisJCX0KKworCQkvLyBkZWZpbmUgcGFyZW50IG5vZGUKKwkJU3RyaW5nVGVtcGxhdGUgcGFyZW50Tm9kZVNUID0gZ2V0Tm9kZVNUKGFkYXB0b3IsIHRyZWUpOworCQl0cmVlU1Quc2V0QXR0cmlidXRlKCJub2RlcyIsIHBhcmVudE5vZGVTVCk7CisKKwkJLy8gZm9yIGVhY2ggY2hpbGQsIGRvIGEgIjx1bmlxdWUtbmFtZT4gW2xhYmVsPXRleHRdIiBub2RlIGRlZgorCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworCQkJT2JqZWN0IGNoaWxkID0gYWRhcHRvci5nZXRDaGlsZCh0cmVlLCBpKTsKKwkJCVN0cmluZ1RlbXBsYXRlIG5vZGVTVCA9IGdldE5vZGVTVChhZGFwdG9yLCBjaGlsZCk7CisJCQl0cmVlU1Quc2V0QXR0cmlidXRlKCJub2RlcyIsIG5vZGVTVCk7CisJCQl0b0RPVERlZmluZU5vZGVzKGNoaWxkLCBhZGFwdG9yLCB0cmVlU1QpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdG9ET1REZWZpbmVFZGdlcyhPYmplY3QgdHJlZSwKKwkJCQkJCQkJCVRyZWVBZGFwdG9yIGFkYXB0b3IsCisJCQkJCQkJCQlTdHJpbmdUZW1wbGF0ZSB0cmVlU1QpCisJeworCQlpZiAoIHRyZWU9PW51bGwgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IG4gPSBhZGFwdG9yLmdldENoaWxkQ291bnQodHJlZSk7CisJCWlmICggbj09MCApIHsKKwkJCS8vIG11c3QgaGF2ZSBhbHJlYWR5IGR1bXBlZCBhcyBjaGlsZCBmcm9tIHByZXZpb3VzCisJCQkvLyBpbnZvY2F0aW9uOyBkbyBub3RoaW5nCisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgcGFyZW50TmFtZSA9ICJuIitnZXROb2RlTnVtYmVyKHRyZWUpOworCisJCS8vIGZvciBlYWNoIGNoaWxkLCBkbyBhIHBhcmVudCAtPiBjaGlsZCBlZGdlIHVzaW5nIHVuaXF1ZSBub2RlIG5hbWVzCisJCVN0cmluZyBwYXJlbnRUZXh0ID0gYWRhcHRvci5nZXRUZXh0KHRyZWUpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworCQkJT2JqZWN0IGNoaWxkID0gYWRhcHRvci5nZXRDaGlsZCh0cmVlLCBpKTsKKwkJCVN0cmluZyBjaGlsZFRleHQgPSBhZGFwdG9yLmdldFRleHQoY2hpbGQpOworCQkJU3RyaW5nIGNoaWxkTmFtZSA9ICJuIitnZXROb2RlTnVtYmVyKGNoaWxkKTsKKwkJCVN0cmluZ1RlbXBsYXRlIGVkZ2VTVCA9IF9lZGdlU1QuZ2V0SW5zdGFuY2VPZigpOworCQkJZWRnZVNULnNldEF0dHJpYnV0ZSgicGFyZW50IiwgcGFyZW50TmFtZSk7CisJCQllZGdlU1Quc2V0QXR0cmlidXRlKCJjaGlsZCIsIGNoaWxkTmFtZSk7CisJCQllZGdlU1Quc2V0QXR0cmlidXRlKCJwYXJlbnRUZXh0IiwgZml4U3RyaW5nKHBhcmVudFRleHQpKTsKKwkJCWVkZ2VTVC5zZXRBdHRyaWJ1dGUoImNoaWxkVGV4dCIsIGZpeFN0cmluZyhjaGlsZFRleHQpKTsKKwkJCXRyZWVTVC5zZXRBdHRyaWJ1dGUoImVkZ2VzIiwgZWRnZVNUKTsKKwkJCXRvRE9URGVmaW5lRWRnZXMoY2hpbGQsIGFkYXB0b3IsIHRyZWVTVCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nVGVtcGxhdGUgZ2V0Tm9kZVNUKFRyZWVBZGFwdG9yIGFkYXB0b3IsIE9iamVjdCB0KSB7CisJCVN0cmluZyB0ZXh0ID0gYWRhcHRvci5nZXRUZXh0KHQpOworCQlTdHJpbmdUZW1wbGF0ZSBub2RlU1QgPSBfbm9kZVNULmdldEluc3RhbmNlT2YoKTsKKwkJU3RyaW5nIHVuaXF1ZU5hbWUgPSAibiIrZ2V0Tm9kZU51bWJlcih0KTsKKwkJbm9kZVNULnNldEF0dHJpYnV0ZSgibmFtZSIsIHVuaXF1ZU5hbWUpOworCisJCW5vZGVTVC5zZXRBdHRyaWJ1dGUoInRleHQiLCBmaXhTdHJpbmcodGV4dCkpOworCQlyZXR1cm4gbm9kZVNUOworCX0KKworCXByb3RlY3RlZCBpbnQgZ2V0Tm9kZU51bWJlcihPYmplY3QgdCkgeworCQlJbnRlZ2VyIG5JID0gKEludGVnZXIpbm9kZVRvTnVtYmVyTWFwLmdldCh0KTsKKwkJaWYgKCBuSSE9bnVsbCApIHsKKwkJCXJldHVybiBuSS5pbnRWYWx1ZSgpOworCQl9CisJCWVsc2UgeworCQkJbm9kZVRvTnVtYmVyTWFwLnB1dCh0LCBuZXcgSW50ZWdlcihub2RlTnVtYmVyKSk7CisJCQlub2RlTnVtYmVyKys7CisJCQlyZXR1cm4gbm9kZU51bWJlci0xOworCQl9CisJfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBmaXhTdHJpbmcoU3RyaW5nIGluKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBpbjsKKworICAgICAgICBpZiAodGV4dCE9bnVsbCkgeworCisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCJcIiIsICJcXFxcXCIiKTsKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoIlxcdCIsICIgICAgIik7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCJcXG4iLCAiXFxcXG4iKTsKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoIlxcciIsICJcXFxcciIpOworICAgICAgICAgICAgaWYgICh0ZXh0Lmxlbmd0aCgpID4gMjApICAgIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgOCkgKyAiLi4uIiArIHRleHQuc3Vic3RyaW5nKHRleHQubGVuZ3RoKCktOCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1BhcnNlVHJlZS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUGFyc2VUcmVlLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUGFyc2VUcmVlLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1BhcnNlVHJlZS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlVG9rZW5TdHJlYW0uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5qYXZhCmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZS5qYXZhCnJlbmFtZSB0byBhbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVBZGFwdG9yLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlQWRhcHRvci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVBZGFwdG9yLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVBZGFwdG9yLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVGaWx0ZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVGaWx0ZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlRmlsdGVyLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVGaWx0ZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZUl0ZXJhdG9yLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlSXRlcmF0b3IuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlSXRlcmF0b3IuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZUl0ZXJhdG9yLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVOb2RlU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlTm9kZVN0cmVhbS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVOb2RlU3RyZWFtLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVOb2RlU3RyZWFtLmphdmEKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXJzZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBmODFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKiogQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKKyAqICBvZiB0aGlzLiAgQWxsIHRoZSBlcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGlzIHNoYXJlZCB3aXRoIFBhcnNlciB2aWEKKyAqICB0aGUgQmFzZVJlY29nbml6ZXIgc3VwZXJjbGFzcy4KKyovCitwdWJsaWMgY2xhc3MgVHJlZVBhcnNlciBleHRlbmRzIEJhc2VSZWNvZ25pemVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOID0gVG9rZW4uRE9XTjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUCA9IFRva2VuLlVQOworCisgICAgLy8gcHJlY29tcGlsZWQgcmVnZXggdXNlZCBieSBpbkNvbnRleHQKKyAgICBzdGF0aWMgU3RyaW5nIGRvdGRvdCA9ICIuKlteLl1cXC5cXC5bXi5dLioiOworICAgIHN0YXRpYyBTdHJpbmcgZG91YmxlRXRjID0gIi4qXFwuXFwuXFwuXFxzK1xcLlxcLlxcLi4qIjsKKyAgICBzdGF0aWMgUGF0dGVybiBkb3Rkb3RQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKGRvdGRvdCk7CisgICAgc3RhdGljIFBhdHRlcm4gZG91YmxlRXRjUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShkb3VibGVFdGMpOworCisJcHJvdGVjdGVkIFRyZWVOb2RlU3RyZWFtIGlucHV0OworCisJcHVibGljIFRyZWVQYXJzZXIoVHJlZU5vZGVTdHJlYW0gaW5wdXQpIHsKKwkJc3VwZXIoKTsgLy8gaGlnaGxpZ2h0IHRoYXQgd2UgZ28gdG8gc3VwZXIgdG8gc2V0IHN0YXRlIG9iamVjdAorCQlzZXRUcmVlTm9kZVN0cmVhbShpbnB1dCk7CisJfQorCisJcHVibGljIFRyZWVQYXJzZXIoVHJlZU5vZGVTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgeworCQlzdXBlcihzdGF0ZSk7IC8vIHNoYXJlIHRoZSBzdGF0ZSBvYmplY3Qgd2l0aCBhbm90aGVyIHBhcnNlcgorCQlzZXRUcmVlTm9kZVN0cmVhbShpbnB1dCk7CisgICAgfQorCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCXN1cGVyLnJlc2V0KCk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworCQlpZiAoIGlucHV0IT1udWxsICkgeworCQkJaW5wdXQuc2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorCQl9CisJfQorCisJLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtICovCisJcHVibGljIHZvaWQgc2V0VHJlZU5vZGVTdHJlYW0oVHJlZU5vZGVTdHJlYW0gaW5wdXQpIHsKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworCX0KKworCXB1YmxpYyBUcmVlTm9kZVN0cmVhbSBnZXRUcmVlTm9kZVN0cmVhbSgpIHsKKwkJcmV0dXJuIGlucHV0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIGlucHV0LmdldFNvdXJjZU5hbWUoKTsKKwl9CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldEN1cnJlbnRJbnB1dFN5bWJvbChJbnRTdHJlYW0gaW5wdXQpIHsKKwkJcmV0dXJuICgoVHJlZU5vZGVTdHJlYW0paW5wdXQpLkxUKDEpOworCX0KKworCXByb3RlY3RlZCBPYmplY3QgZ2V0TWlzc2luZ1N5bWJvbChJbnRTdHJlYW0gaW5wdXQsCisJCQkJCQkJCQkgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsCisJCQkJCQkJCQkgIGludCBleHBlY3RlZFRva2VuVHlwZSwKKwkJCQkJCQkJCSAgQml0U2V0IGZvbGxvdykKKwl7CisJCVN0cmluZyB0b2tlblRleHQgPQorCQkJIjxtaXNzaW5nICIrZ2V0VG9rZW5OYW1lcygpW2V4cGVjdGVkVG9rZW5UeXBlXSsiPiI7CisgICAgICAgIFRyZWVBZGFwdG9yIGFkYXB0b3IgPSAoKFRyZWVOb2RlU3RyZWFtKWUuaW5wdXQpLmdldFRyZWVBZGFwdG9yKCk7CisgICAgICAgIHJldHVybiBhZGFwdG9yLmNyZWF0ZShuZXcgQ29tbW9uVG9rZW4oZXhwZWN0ZWRUb2tlblR5cGUsIHRva2VuVGV4dCkpOworCX0KKworICAgIC8qKiBNYXRjaCAnLicgaW4gdHJlZSBwYXJzZXIgaGFzIHNwZWNpYWwgbWVhbmluZy4gIFNraXAgbm9kZSBvcgorCSAqICBlbnRpcmUgdHJlZSBpZiBub2RlIGhhcyBjaGlsZHJlbi4gIElmIGNoaWxkcmVuLCBzY2FuIHVudGlsCisJICogIGNvcnJlc3BvbmRpbmcgVVAgbm9kZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYXRjaEFueShJbnRTdHJlYW0gaWdub3JlKSB7IC8vIGlnbm9yZSBzdHJlYW0sIGNvcHkgb2YgaW5wdXQKKwkJc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOworCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKwkJT2JqZWN0IGxvb2sgPSBpbnB1dC5MVCgxKTsKKwkJaWYgKCBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldENoaWxkQ291bnQobG9vayk9PTAgKSB7CisJCQlpbnB1dC5jb25zdW1lKCk7IC8vIG5vdCBzdWJ0cmVlLCBjb25zdW1lIDEgbm9kZSBhbmQgcmV0dXJuCisJCQlyZXR1cm47CisJCX0KKwkJLy8gY3VycmVudCBub2RlIGlzIGEgc3VidHJlZSwgc2tpcCB0byBjb3JyZXNwb25kaW5nIFVQLgorCQkvLyBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCisJCWludCBsZXZlbD0wOworCQlpbnQgdG9rZW5UeXBlID0gaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUeXBlKGxvb2spOworCQl3aGlsZSAoIHRva2VuVHlwZSE9VG9rZW4uRU9GICYmICEodG9rZW5UeXBlPT1VUCAmJiBsZXZlbD09MCkgKSB7CisJCQlpbnB1dC5jb25zdW1lKCk7CisJCQlsb29rID0gaW5wdXQuTFQoMSk7CisJCQl0b2tlblR5cGUgPSBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFR5cGUobG9vayk7CisJCQlpZiAoIHRva2VuVHlwZSA9PSBET1dOICkgeworCQkJCWxldmVsKys7CisJCQl9CisJCQllbHNlIGlmICggdG9rZW5UeXBlID09IFVQICkgeworCQkJCWxldmVsLS07CisJCQl9CisJCX0KKwkJaW5wdXQuY29uc3VtZSgpOyAvLyBjb25zdW1lIFVQCisJfQorCisgICAgLyoqIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgorCSAqICBwbHVzIHdlIHdhbnQgdG8gYWx0ZXIgdGhlIGV4Y2VwdGlvbiB0eXBlLiAgRG9uJ3QgdHJ5IHRvIHJlY292ZXIKKwkgKiAgZnJvbSB0cmVlIHBhcnNlciBlcnJvcnMgaW5saW5lLi4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbihJbnRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgZm9sbG93KQorICAgICAgICB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRocm93IG5ldyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24odHR5cGUsIChUcmVlTm9kZVN0cmVhbSlpbnB1dCk7CisgICAgfQorCisgICAgLyoqIFByZWZpeCBlcnJvciBtZXNzYWdlIHdpdGggdGhlIGdyYW1tYXIgbmFtZSBiZWNhdXNlIG1lc3NhZ2UgaXMKKwkgKiAgYWx3YXlzIGludGVuZGVkIGZvciB0aGUgcHJvZ3JhbW1lciBiZWNhdXNlIHRoZSBwYXJzZXIgYnVpbHQKKwkgKiAgdGhlIGlucHV0IHRyZWUgbm90IHRoZSB1c2VyLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JIZWFkZXIoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworCQlyZXR1cm4gZ2V0R3JhbW1hckZpbGVOYW1lKCkrIjogbm9kZSBmcm9tICIrCisJCQkgICAoZS5hcHByb3hpbWF0ZUxpbmVJbmZvPyJhZnRlciAiOiIiKSsibGluZSAiK2UubGluZSsiOiIrZS5jaGFyUG9zaXRpb25JbkxpbmU7CisJfQorCisJLyoqIFRyZWUgcGFyc2VycyBwYXJzZSBub2RlcyB0aGV5IHVzdWFsbHkgaGF2ZSBhIHRva2VuIG9iamVjdCBhcworCSAqICBwYXlsb2FkLiBTZXQgdGhlIGV4Y2VwdGlvbiB0b2tlbiBhbmQgZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoUmVjb2duaXRpb25FeGNlcHRpb24gZSwgU3RyaW5nW10gdG9rZW5OYW1lcykgeworCQlpZiAoIHRoaXMgaW5zdGFuY2VvZiBUcmVlUGFyc2VyICkgeworCQkJVHJlZUFkYXB0b3IgYWRhcHRvciA9ICgoVHJlZU5vZGVTdHJlYW0pZS5pbnB1dCkuZ2V0VHJlZUFkYXB0b3IoKTsKKwkJCWUudG9rZW4gPSBhZGFwdG9yLmdldFRva2VuKGUubm9kZSk7CisJCQlpZiAoIGUudG9rZW49PW51bGwgKSB7IC8vIGNvdWxkIGJlIGFuIFVQL0RPV04gbm9kZQorCQkJCWUudG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4oYWRhcHRvci5nZXRUeXBlKGUubm9kZSksCisJCQkJCQkJCQkJICBhZGFwdG9yLmdldFRleHQoZS5ub2RlKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKKwl9CisKKwkvKiogQ2hlY2sgaWYgY3VycmVudCBub2RlIGluIGlucHV0IGhhcyBhIGNvbnRleHQuICBDb250ZXh0IG1lYW5zIHNlcXVlbmNlCisJICogIG9mIG5vZGVzIHRvd2FyZHMgcm9vdCBvZiB0cmVlLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBzYXkgY29udGV4dAorCSAqICBpcyAiTVVMVCIgd2hpY2ggbWVhbnMgbXkgcGFyZW50IG11c3QgYmUgTVVMVC4gICJDTEFTUyBWQVJERUYiIHNheXMKKwkgKiAgY3VycmVudCBub2RlIG11c3QgYmUgY2hpbGQgb2YgYSBWQVJERUYgYW5kIHdob3NlIHBhcmVudCBpcyBhIENMQVNTIG5vZGUuCisJICogIFlvdSBjYW4gdXNlICIuLi4iIHRvIG1lYW4gemVyby1vci1tb3JlIG5vZGVzLiAgIk1FVEhPRCAuLi4gVkFSREVGIgorCSAqICBtZWFucyBteSBwYXJlbnQgaXMgVkFSREVGIGFuZCBzb21ld2hlcmUgYWJvdmUgdGhhdCBpcyBhIE1FVEhPRCBub2RlLgorCSAqICBUaGUgZmlyc3Qgbm9kZSBpbiB0aGUgY29udGV4dCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHJvb3QuICBUaGUgY29udGV4dAorCSAqICBtYXRjaGVyIHN0b3BzIG1hdGNoaW5nIGFuZCByZXR1cm5zIHRydWUgd2hlbiBpdCBydW5zIG91dCBvZiBjb250ZXh0LgorCSAqICBUaGVyZSBpcyBubyB3YXkgdG8gZm9yY2UgdGhlIGZpcnN0IG5vZGUgdG8gYmUgdGhlIHJvb3QuCisJICovCisJcHVibGljIGJvb2xlYW4gaW5Db250ZXh0KFN0cmluZyBjb250ZXh0KSB7CisJCXJldHVybiBpbkNvbnRleHQoaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKSwgZ2V0VG9rZW5OYW1lcygpLCBpbnB1dC5MVCgxKSwgY29udGV4dCk7CisJfQorCisJLyoqIFRoZSB3b3JrZXIgZm9yIGluQ29udGV4dC4gIEl0J3Mgc3RhdGljIGFuZCBmdWxsIG9mIHBhcmFtZXRlcnMgZm9yCisJICogIHRlc3RpbmcgcHVycG9zZXMuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGluQ29udGV4dChUcmVlQWRhcHRvciBhZGFwdG9yLAorCQkJCQkJCQkJU3RyaW5nW10gdG9rZW5OYW1lcywKKwkJCQkJCQkJCU9iamVjdCB0LAorCQkJCQkJCQkJU3RyaW5nIGNvbnRleHQpCisJeworCQlNYXRjaGVyIGRvdGRvdE1hdGNoZXIgPSBkb3Rkb3RQYXR0ZXJuLm1hdGNoZXIoY29udGV4dCk7CisJCU1hdGNoZXIgZG91YmxlRXRjTWF0Y2hlciA9IGRvdWJsZUV0Y1BhdHRlcm4ubWF0Y2hlcihjb250ZXh0KTsKKwkJaWYgKCBkb3Rkb3RNYXRjaGVyLmZpbmQoKSApIHsgLy8gZG9uJ3QgYWxsb3cgIi4uIiwgbXVzdCBiZSAiLi4uIgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzeW50YXg6IC4uIik7CisJCX0KKwkJaWYgKCBkb3VibGVFdGNNYXRjaGVyLmZpbmQoKSApIHsgLy8gZG9uJ3QgYWxsb3cgZG91YmxlICIuLi4iCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN5bnRheDogLi4uIC4uLiIpOworCQl9CisJCWNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2VBbGwoIlxcLlxcLlxcLiIsICIgLi4uICIpOyAvLyBlbnN1cmUgc3BhY2VzIGFyb3VuZCAuLi4KKwkJY29udGV4dCA9IGNvbnRleHQudHJpbSgpOworCQlTdHJpbmdbXSBub2RlcyA9IGNvbnRleHQuc3BsaXQoIlxccysiKTsKKwkJaW50IG5pID0gbm9kZXMubGVuZ3RoLTE7CisJCXQgPSBhZGFwdG9yLmdldFBhcmVudCh0KTsKKwkJd2hpbGUgKCBuaT49MCAmJiB0IT1udWxsICkgeworCQkJaWYgKCBub2Rlc1tuaV0uZXF1YWxzKCIuLi4iKSApIHsKKwkJCQkvLyB3YWxrIHVwd2FyZHMgdW50aWwgd2Ugc2VlIG5vZGVzW25pLTFdIHRoZW4gY29udGludWUgd2Fsa2luZworCQkJCWlmICggbmk9PTAgKSByZXR1cm4gdHJ1ZTsgLy8gLi4uIGF0IHN0YXJ0IGlzIG5vLW9wCisJCQkJU3RyaW5nIGdvYWwgPSBub2Rlc1tuaS0xXTsKKwkJCQlPYmplY3QgYW5jZXN0b3IgPSBnZXRBbmNlc3RvcihhZGFwdG9yLCB0b2tlbk5hbWVzLCB0LCBnb2FsKTsKKwkJCQlpZiAoIGFuY2VzdG9yPT1udWxsICkgcmV0dXJuIGZhbHNlOworCQkJCXQgPSBhbmNlc3RvcjsKKwkJCQluaS0tOworCQkJfQorCQkJU3RyaW5nIG5hbWUgPSB0b2tlbk5hbWVzW2FkYXB0b3IuZ2V0VHlwZSh0KV07CisJCQlpZiAoICFuYW1lLmVxdWFscyhub2Rlc1tuaV0pICkgeworCQkJCS8vU3lzdGVtLmVyci5wcmludGxuKCJub3QgbWF0Y2hlZDogIitub2Rlc1tuaV0rIiBhdCAiK3QpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCS8vIGFkdmFuY2UgdG8gcGFyZW50IGFuZCB0byBwcmV2aW91cyBlbGVtZW50IGluIGNvbnRleHQgbm9kZSBsaXN0CisJCQluaS0tOworCQkJdCA9IGFkYXB0b3IuZ2V0UGFyZW50KHQpOworCQl9CisKKwkJaWYgKCB0PT1udWxsICYmIG5pPj0wICkgcmV0dXJuIGZhbHNlOyAvLyBhdCByb290IGJ1dCBtb3JlIG5vZGVzIHRvIG1hdGNoCisJCXJldHVybiB0cnVlOworCX0KKworCS8qKiBIZWxwZXIgZm9yIHN0YXRpYyBpbkNvbnRleHQgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZXRBbmNlc3RvcihUcmVlQWRhcHRvciBhZGFwdG9yLCBTdHJpbmdbXSB0b2tlbk5hbWVzLCBPYmplY3QgdCwgU3RyaW5nIGdvYWwpIHsKKwkJd2hpbGUgKCB0IT1udWxsICkgeworCQkJU3RyaW5nIG5hbWUgPSB0b2tlbk5hbWVzW2FkYXB0b3IuZ2V0VHlwZSh0KV07CisJCQlpZiAoIG5hbWUuZXF1YWxzKGdvYWwpICkgcmV0dXJuIHQ7CisJCQl0ID0gYWRhcHRvci5nZXRQYXJlbnQodCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgdHJhY2VJbihTdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpICB7CisJCXN1cGVyLnRyYWNlSW4ocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoMSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRyYWNlT3V0KFN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgIHsKKwkJc3VwZXIudHJhY2VPdXQocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXQuTFQoMSkpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXR0ZXJuTGV4ZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXR0ZXJuTGV4ZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUGF0dGVybkxleGVyLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXR0ZXJuTGV4ZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhdHRlcm5QYXJzZXIuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXR0ZXJuUGFyc2VyLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhdHRlcm5QYXJzZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhdHRlcm5QYXJzZXIuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVJld3JpdGVyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUmV3cml0ZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUmV3cml0ZXIuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVJld3JpdGVyLmphdmEKZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUnVsZVJldHVyblNjb3BlLmphdmEKcmVuYW1lIHRvIGFudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVZpc2l0b3IuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVWaXNpdG9yLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVZpc2l0b3IuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVZpc2l0b3IuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVZpc2l0b3JBY3Rpb24uamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL0phdmEvc3JjL21haW4vamF2YS9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVWaXNpdG9yQWN0aW9uLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVZpc2l0b3JBY3Rpb24uamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVZpc2l0b3JBY3Rpb24uamF2YQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVdpemFyZC5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVdpemFyZC5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVXaXphcmQuamF2YQpyZW5hbWUgdG8gYW50bHItMy40L3J1bnRpbWUvSmF2YS9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVdpemFyZC5qYXZhCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L0FVVEhPUlMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGFiY2RiMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvQVVUSE9SUwpAQCAtMCwwICsxLDMgQEAKK0pvc2NoYSBGZXRoIDxqb3NjaGEgYXQgZmV0aCBkb3QgY29tPjogQ29udHJpYnV0b3IKK0pvc2VwaCBIdXJzdCA8amh1cnN0dXMgYXQgZ21haWwgZG90IGNvbT46IE1haW50YWluZXIKK0plZmYgU2FyZW1pIDxqZWZmc2FyZW1pIGF0IHlhaG9vIGRvdCBjb20+OiBDb250cmlidXRvcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9DaGFuZ2VMb2cgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODBlMjlkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9DaGFuZ2VMb2cKQEAgLTAsMCArMSwyIEBACiswLjAuMQ0KKyAgICAtIEZpcnN0IHJlbGVhc2UhDQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC9SRUFETUUgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L2J1aWxkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDk1MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC9SRUFETUUKQEAgLTAsMCArMSw1MSBAQAorIyMjIERFUEVOREVOQ0lFUyAjIyMKKworUHJlcmVxdWlzaXRlczoKKyAgKiBKYXZhIEpSRSAxLjYgb3IgZ3JlYXRlci4KKyAgKiBBcGFjaGUgQW50IDEuNy4wIG9yIGdyZWF0ZXI7IHNlZSBodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2luc3RhbGwuaHRtbAorCitCZWZvcmUgYnVpbGRpbmcgdGhlIEphdmFTY3JpcHQgdGFyZ2V0IHlvdSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgYSBmZXcgdGhpcmQKK3BhcnR5IG9wZW4gc291cmNlIGxpYnJhcmllczoKKworICAqIGFudC1jb250cmliOiBEb3dubG9hZCBhbnQtY29udHJpYiBoZXJlOiBodHRwOi8vZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9hbnQtY29udHJpYi9hbnQtY29udHJpYi0xLjBiMy1iaW4uemlwP21vZHRpbWU9MTE2MjQ4NjczOCZiaWdfbWlycm9yPTAKKyAgKiBVbnppcCB0aGUgZG93bmxvYWRlZCBmaWxlLgorICAqIE1vdmUgYW50LWNvbnRyaWItMS4wYjMuamFyIGZyb20gdGhlIHVuemlwcGVkIGRpcmVjdG9yeSB0byBydW50aW1lL0phdmFTY3JpcHQvdGhpcmQvCisKKyAgKiBjbG9zdXJlIGNvbXBpbGVyOiBEb3dubG9hZCBoZXJlOiBodHRwOi8vY2xvc3VyZS1jb21waWxlci5nb29nbGVjb2RlLmNvbS9maWxlcy9jb21waWxlci1sYXRlc3QuemlwCisgICogVW56aXAgdGhlIGRvd25sb2FkZWQgZmlsZS4KKyAgKiBNb3ZlIGNvbXBpbGVyLmphciBmcm9tIHRoZSB1bnppcHBlZCBkaXJlY3RvcnkgdG8gcnVudGltZS9KYXZhU2NyaXB0L3RoaXJkLworCisgICoganNkb2MtdG9vbGtpdDogRG93bmxvYWQgdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gaGVyZTogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzZG9jLXRvb2xraXQvZG93bmxvYWRzL2xpc3QKKyAgKiBVbnppcCB0aGUgZG93bmxvYWRlZCBmaWxlLgorICAqIE1vdmUgdGhlIHVuemlwcGVkIGZvbGRlciB0byBydW50aW1lL0phdmFTY3JpcHQvdGhpcmQvanNkb2MtdG9vbGtpdAorCisgICoganN1bml0OiBEb3dubG9hZCBoZXJlOiBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MjgwNDEmcGFja2FnZV9pZD0xOTgyMyZyZWxlYXNlX2lkPTQwNDI3NyAKKyAgKiBVbnppcCB0aGUgZG93bmxvYWRlZCBmaWxlLgorICAqIE1vdmUgdGhlIHVuemlwcGVkIGZvbGRlciB0byBydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvanN1bml0CisKKyMjIyBCVUlMRCAjIyMKKzEpIEluIGEgc2hlbGwgY2QgdG8gcnVudGltZS9KYXZhU2NyaXB0L2J1aWxkLgorMikgUnVuICdhbnQnLiBUaGlzIHdpbGwgYnVpbGQgdGhlIEphdmFTY3JpcHQgcnVudGltZSBsaWJyYXJpZXMgaW50byB0aGUKKyAgIHJ1bnRpbWUvSmF2YVNjcmlwdC9saWIgZm9sZGVyLgorCisjIyMgVEVTVFMgIyMjCitDb21waWxlIFRlc3RzOgorMSkgQnVpbGQgdGhlIEFudGxyIHRvb2wgaXRzZWxmIChzZWUgbWFpbiBBbnRsciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzKS4KKyAgIFRoaXMgaXMgbW9zdCBlYXNpbHkgZG9uZSBieSBjZCdpbmcgdG8gdGhlIHJvb3Qgb2YgdGhlIGFudGxyIGNvZGUgYW5kIHJ1bm5pbmcKKyAgICdtdm4gLURtYXZlbi50ZXN0LnNraXA9dHJ1ZSBwYWNrYWdlIGFzc2VtYmx5OmFzc2VtYmx5Jy4gIElmIHVzaW5nIGEKKyAgIGRpZmZlcmVudCBidWlsZCBtZXRob2QsIHVwZGF0ZSBydW50aW1lL0phdmFTY3JpcHQvYnVpbGQvYW50bHIzLnByb3BlcnRpZXMgdG8KKyAgIHBvaW50IHRvIHRoZSBhbHRlcm5hdGl2ZSBqYXIuCisyKSBJbiBhIHNoZWxsIGNkIHRvIHJ1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC4KKzMpIFJ1biAnYW50IGNvbXBpbGUtdGVzdHMnLiAgVGhpcyBjYW4gdGFrZSBhIHdoaWxlLiAgV2FybmluZ3MgKGJ1dCBub3QgZXJyb3JzKQorICAgaXNzdWVkIGR1cmluZyB0aGlzIHN0ZXAgYXJlIGV4cGVjdGVkLiAgKFdlIHRlc3QgdGhlIEpTIHJ1bnRpbWUgYWdhaW5zdAorICAgZ3JhbW1hcnMgdGhhdCBoYXZlIHJlY292ZXJhYmxlIHByb2JsZW1zLikKKworUnVuIFRlc3RzOgorMSkgQ29tcGlsZSB0aGUgdGVzdHMgdXNpbmcgdGhlIGRpcmVjdGlvbnMgYWJvdmUuCisyKSBPcGVuIHJ1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9qc3VuaXQvdGVzdFJ1bm5lci5odG1sIGluIGEgYnJvd3Nlci4gIE5vdGUKKyAgIHRoYXQgc29tZSBicm93c2VycyAobm90YWJseSwgRmlyZWZveCAzLjUpIHdpbGwgaGF2ZSB0cm91YmxlIHdpdGggdGhpcyBwYWdlCisgICB3aGVuIG9wZW5lZCB3aXRoIHRoZSAnZmlsZTovLycgcHJvdG9jb2wuICBUbyBjaXJjdW12ZW50IHRoaXMgaXNzdWUsIHN0YXJ0CisgICBhbmQgYWNjZXNzIHRoZSBwYWdlIHRocm91Z2ggYSBsaWdodHdlaWdodCBodHRwIHNlcnZlciAoZS5nLiBNb25nb29zZSkuCiszKSBTZWxlY3QgdGhlIGZpbGUgcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvYWxsLmh0bWwgKG9yIGFueSBvdGhlcgorICAgdGVzdCBodG1sIGZpbGUpLgorNCkgSGl0ICdSdW4nIGFuZCAoaG9wZWZ1bGx5IDspIHdhdGNoIHRoZSBwcmV0dHkgZ3JlZW4gYmFyIGdyb3cuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L2J1aWxkL2FudGxyMy5wcm9wZXJ0aWVzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC9hbnRscjMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTAxNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC9hbnRscjMucHJvcGVydGllcwpAQCAtMCwwICsxLDU4IEBACisjIGxpY2Vuc2UgZmlsZSB0byBiZSBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZpbGUKK2FudGxyMy5saWNlbnNlPWxpY2Vuc2UudHh0CisKKyMgbGlzdCBvZiBidWlsZCB0YXJnZXRzCithbnRscjMubGlzdD1hbGwsY2xpCisKKyMgdGhlIGVudGlyZSBhbnRscjMgbGlicmFyeQorYW50bHIzLmFsbC5saXN0PVwKKyAgICBvcmcvYW50bHIuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbnMuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9ucy5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS9CaXRTZXQuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL0NoYXJTdHJlYW0uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL1Rva2VuLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlbi5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWUuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlQWRhcHRvci5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlQWRhcHRvci5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS9Ub2tlblJld3JpdGVTdHJlYW0uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZU5vZGVTdHJlYW0uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZU5vZGVTdHJlYW0uanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVRva2VuU3RyZWFtLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvQmFzZVJlY29nbml6ZXIuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL0xleGVyLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS9QYXJzZXJSdWxlUmV0dXJuU2NvcGUuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVJ1bGVSZXR1cm5TY29wZS5qcyxcCisgICAgb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyLmpzLFwKKyAgICBvcmcvYW50bHIvcnVudGltZS9ERkEuanMsXAorICAgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5qcworCisjIHNlcnZlciBzaWRlIGpzIHN1cHBvcnQgbGlicmFyeQorYW50bHIzLmNsaS5saXN0PVwKKyAgICBvcmcvYW50bHIvcnVudGltZS9BTlRMUkZpbGVTdHJlYW0uanMKKworIyBwYXRoIHRvIGFudGxyIHRvb2wgamFyCithbnRscjMudG9vbD0uLi8uLi90YXJnZXQvYW50bHItbWFzdGVyLTMuMi4xLVNOQVBTSE9ULWNvbXBsZXRlamFyLmphcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC9idWlsZC54bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L2J1aWxkL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzIyM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9idWlsZC9idWlsZC54bWwKQEAgLTAsMCArMSwxNTMgQEAKKzxwcm9qZWN0IG5hbWU9IkFudGxyM0phdmFTY3JpcHRSdW50aW1lIiBiYXNlZGlyPSIuLiIgZGVmYXVsdD0iYnVpbGQiPgorPGRlc2NyaXB0aW9uPgorQnVpbGQgcHJvY2VkdXJlIGFuZCB0YXNrIGF1dG9tYXRpb24gZm9yIHRoZSBBTlRMUiBKYXZhU2NyaXB0IHRhcmdldC4KKzwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ib3V0LmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9vdXQiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L2xpYiIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZG9jLmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vZG9jIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVzdHMiIC8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGhpcmQuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS90aGlyZCIgLz4KKyAgICA8cHJvcGVydHkgZmlsZT0iJHtidWlsZC5kaXJ9L2FudGxyMy5wcm9wZXJ0aWVzIiAvPgorCisgICAgPHRhc2tkZWYgZmlsZT0iJHt0aGlyZC5kaXJ9L2FudGNvbnRyaWIucHJvcGVydGllcyIgY2xhc3NwYXRoPSIke3RoaXJkLmRpcn0vYW50LWNvbnRyaWItMS4wYjMuamFyIiAvPgorCisgICAgPCEtLSAqKioqKioqIC0tPgorICAgIDwhLS0gTElCUkFSWSAtLT4KKyAgICA8IS0tICoqKioqKiogLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSItaW5pdCIgZGVzY3JpcHRpb249IkJ1aWxkIEFOVExSIEphdmFTY3JpcHQgcnVudGltZSBsaWJyYXJ5LiI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iLW1ha2UtZGVidWciIC8+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iLW1ha2UtbWluIiAvPgorICAgICAgICA8IS0tPGFudGNhbGwgdGFyZ2V0PSItbWFrZS1kb2NzIiAvPi0tPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9Ii1kZWwtYnVpbGQiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIE1ha2UgdW5jb21wcmVzc2VkIEpTIHJ1bnRpbWUgZmlsZXMgLS0+CisgICAgPHRhcmdldCBuYW1lPSItbWFrZS1kZWJ1ZyI+CisgICAgICAgIDwhLS0gbm8gZmlsZSBuYW1lIHN1ZmZpeCBmb3IgZGVidWcgZmlsZXMgLS0+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZWJ1Z29ybWluIiB2YWx1ZT0iIiAvPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9Ii1tYWtlLXBhY2thZ2VzIiBpbmhlcml0YWxsPSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBNYWtlIGNvbXByZXNzZWQgSlMgZmlsZXMgLS0+CisgICAgPHRhcmdldCBuYW1lPSItbWFrZS1taW4iPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVidWdvcm1pbiIgdmFsdWU9Ii1taW4iIC8+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iLW1ha2UtcGFja2FnZXMiIGluaGVyaXRhbGw9InRydWUiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIE1ha2UgZWFjaCBwYWNrYWdlIGRlZmluZWQgaW4gYXRscjMubGlzdCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Ii1tYWtlLXBhY2thZ2VzIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InBrZyIgdmFsdWU9IiIgLz4KKyAgICAgICAgPGZvcmVhY2ggbGlzdD0iJHthbnRscjMubGlzdH0iIHRhcmdldD0iLW1ha2UtcGFja2FnZSIgcGFyYW09InBrZyIgaW5oZXJpdGFsbD0idHJ1ZSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gQ3JlYXRlIGEgcGFja2FnZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Ii1tYWtlLXBhY2thZ2UiPgorICAgICAgICA8dmFyIG5hbWU9InBhY2thZ2UiIHZhbHVlPSIke3BrZ30iIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXN0IiB2YWx1ZT0iJHtsaWIuZGlyfS9hbnRscjMtJHtwYWNrYWdlfSR7ZGVidWdvcm1pbn0uanMiIC8+CisgICAgICAgIDxwcm9wZXJ0eWNvcHkgcHJvcGVydHk9Imxpc3QiIGZyb209ImFudGxyMy4ke3BhY2thZ2V9Lmxpc3QiIG92ZXJyaWRlPSJ0cnVlIiAvPgorICAgICAgICA8cHJvcGVydHlyZWdleCBwcm9wZXJ0eT0ibGlzdCIgaW5wdXQ9IiR7bGlzdH0iIHJlZ2V4cD0iICsiIHJlcGxhY2U9IiIgb3ZlcnJpZGU9InRydWUiIC8+CisKKyAgICAgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHtkZXN0fSI+CisgICAgICAgICAgICA8ZmlsZWxpc3QgZGlyPSIke3NyYy5kaXJ9IiBmaWxlcz0iJHtsaXN0fSIgLz4KKyAgICAgICAgPC9jb25jYXQ+CisKKyAgICAgICAgPGlmPgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2RlYnVnb3JtaW59IiBhcmcyPSItbWluIiAvPgorICAgICAgICAgICAgPHRoZW4+CisgICAgICAgICAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSItY29tcHJlc3MiIGluaGVyaXRhbGw9InRydWUiIC8+CisgICAgICAgICAgICA8L3RoZW4+CisgICAgICAgIDwvaWY+CisKKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSItYWRkLWxpY2Vuc2UiIGluaGVyaXRhbGw9InRydWUiIC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8IS0tIENvbXByZXNzIEphdmFTY3JpcHQgdXNpbmcgQ2xvc3VyZSBDb21waWxlciAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Ii1jb21wcmVzcyI+CisgICAgICAgIDxqYXZhIGZvcms9InRydWUiIGphcj0iJHt0aGlyZC5kaXJ9L2NvbXBpbGVyLmphciI+CisgICAgICAgICAgICA8YXJnIGxpbmU9Ii0tanMiIC8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke2Rlc3R9IiAvPgorICAgICAgICAgICAgPGFyZyBsaW5lPSItLWpzX291dHB1dF9maWxlIiAvPgorICAgICAgICAgICAgPGFyZyBsaW5lPSIke2Rlc3R9LnRtcCIgLz4KKyAgICAgICAgPC9qYXZhPgorICAgICAgICA8bW92ZSBmaWxlPSIke2Rlc3R9LnRtcCIgdG9maWxlPSIke2Rlc3R9IiAvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSBpbnNlcnQgcmVxdWlyZWQgbGVnYWxlemUgYXQgdGhlIHRvcCBvZiBhIGZpbGUgLS0+CisgICAgPHRhcmdldCBuYW1lPSItYWRkLWxpY2Vuc2UiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idG1wLWZpbGUiIHZhbHVlPSIke2Rlc3R9LnRtcCIgLz4KKyAgICAgICAgPG1vdmUgZmlsZT0iJHtkZXN0fSIgdG9maWxlPSIke3RtcC1maWxlfSIgLz4KKyAgICAgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHtkZXN0fSI+CisgICAgICAgICAgICA8aGVhZGVyIGZpbGU9IiR7YnVpbGQuZGlyfS8ke2FudGxyMy5saWNlbnNlfSIgLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dG1wLWZpbGV9IiAvPgorICAgICAgICA8L2NvbmNhdD4KKyAgICAgICAgPGRlbGV0ZSBmaWxlPSIke3RtcC1maWxlfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gZGVsZXRlIGJ1aWxkIGRpcmVjdG9yeSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Ii1kZWwtYnVpbGQiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtvdXQuZGlyfSIgLz4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gKioqKiogLS0+CisgICAgPCEtLSBURVNUUyAtLT4KKyAgICA8IS0tICoqKioqIC0tPgorCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3RzIiBkZXBlbmRzPSJidWlsZCIgZGVzY3JpcHRpb249IkNvbXBpbGUgYWxsIHRlc3QgZ3JhbW1hcnMuIj4KKyAgICAgICAgPGZvcmVhY2ggdGFyZ2V0PSItY29tcGlsZS10ZXN0LWNsYXNzIiBwYXJhbT0idGVzdGRpcmVjdG9yeSIgaW5oZXJpdGFsbD0idHJ1ZSI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8ZGlyc2V0IGRpcj0iJHt0ZXN0LmRpcn0iIGluY2x1ZGVzPSIqIiBleGNsdWRlcz0iUkVBRE1FIiAvPgorICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICA8L2ZvcmVhY2g+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jb21waWxlLXRlc3QtY2xhc3MiID4KKyAgICAgICAgPGZvcmVhY2ggdGFyZ2V0PSItY29tcGlsZS1zaW5nbGUtdGVzdCIgcGFyYW09ImdyYW1tYXIiIGluaGVyaXRhbGw9InRydWUiPgorICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3RkaXJlY3Rvcnl9IiBpbmNsdWRlcz0iKi5nIiBleGNsdWRlcz0iKl9fLmciIC8+CisgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgIDwvZm9yZWFjaD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLWNvbXBpbGUtc2luZ2xlLXRlc3QiPgorICAgICAgICA8IS0tIHR1cm4gb24gYW50bHIgdHJhY2luZyBpZiBuZWNlc3NhcnkgLS0+CisgICAgICAgIDx2YXIgbmFtZT0iZyIgdmFsdWU9IiR7Z3JhbW1hcn0iIC8+CisgICAgICAgIDxsb2FkZmlsZSBwcm9wZXJ0eT0iZy1jb250ZW50cyIgc3JjZmlsZT0iJHtnfSIgLz4KKyAgICAgICAgPHZhciBuYW1lPSJvcHQiIHZhbHVlPSIiIC8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0cmFjZS1rZXkiIHZhbHVlPSIvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UiIC8+CisgICAgICAgIDxpZj4KKyAgICAgICAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7Zy1jb250ZW50c30iIHN1YnN0cmluZz0iJHt0cmFjZS1rZXl9IiAvPgorICAgICAgICAgICAgPHRoZW4+CisgICAgICAgICAgICAgICAgPHZhciBuYW1lPSJvcHQiIHZhbHVlPSItdHJhY2UiIC8+CisgICAgICAgICAgICA8L3RoZW4+CisgICAgICAgIDwvaWY+CisKKyAgICAgICAgPGphdmEgZGlyPSIke3Rlc3RkaXJlY3Rvcnl9IiBqYXI9IiR7YW50bHIzLnRvb2x9IiBmb3JrPSJ5ZXMiPgorICAgICAgICAgICAgPGFyZyBsaW5lPSIke29wdH0iIC8+CisgICAgICAgICAgICA8YXJnIGxpbmU9IiR7Z30iIC8+CisgICAgICAgIDwvamF2YT4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gKioqKiAtLT4KKyAgICA8IS0tIERPQ1MgLS0+CisgICAgPCEtLSAqKioqIC0tPgorCisgICAgPHRhcmdldCBuYW1lPSJtYWtlLWRvY3MiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBqc2RvYyBBUEkgZG9jdW1lbnRhdGlvbi4iIGRlcGVuZHM9Ii1pbml0Ij4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImpzZG9jLmRpciIgdmFsdWU9IiR7dGhpcmQuZGlyfS9qc2RvYy10b29sa2l0IiAvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZG9jcy5kaXIiIHZhbHVlPSIke2xpYi5kaXJ9L2RvY3MiIC8+CisKKyAgICAgICAgPG1rZGlyIGRpcj0iJHtkb2NzLmRpcn0iIC8+CisgICAgICAgIDxqYXZhIGphcj0iJHtqc2RvYy5kaXJ9L2pzcnVuLmphciIgZm9yaz0ieWVzIj4KKyAgICAgICAgICAgIDxhcmcgbGluZT0iJHtqc2RvYy5kaXJ9L2FwcC9ydW4uanMgJHtzcmMuZGlyfSAtcj0xMCAtdD0ke2pzZG9jLmRpcn0vdGVtcGxhdGVzL2pzZG9jIC1kPSR7ZG9jcy5kaXJ9IiAvPgorICAgICAgICA8L2phdmE+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1pbml0Ij4KKyAgICAgICAgPCEtLSBjbGVhciBidWlsZCBkaXIgLS0+CisgICAgICAgIDxkZWxldGUgZGlyPSIke291dC5kaXJ9IiBxdWlldD0idHJ1ZSIgLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXQuZGlyfSIgLz4KKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvYnVpbGQvbGljZW5zZS50eHQgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L2J1aWxkL2xpY2Vuc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMjk3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L2J1aWxkL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsMTAgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBUZXJlbmNlIFBhcnIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitDb2RlIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgTGljZW5zZToKK2h0dHA6Ly93d3cuYW50bHIub3JnL2xpY2Vuc2UuaHRtbAorCitTb21lIHBhcnRzIG9mIHRoZSBBTlRMUiBjbGFzczoKK0NvcHlyaWdodCAoYykgMjAwOCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0NvZGUgbGljZW5zZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlOgoraHR0cDovL2RldmVsb3Blci55YWhvby5uZXQveXVpL2xpY2Vuc2UudHh0CisqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjMWFkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIuanMKQEAgLTAsMCArMSw1MDQgQEAKKy8qCitTb21lIHBvcnRpb25zOgorQ29weXJpZ2h0IChjKSAyMDA4LCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6CitodHRwOi8vZGV2ZWxvcGVyLnlhaG9vLm5ldC95dWkvbGljZW5zZS50eHQKK3ZlcnNpb246IDIuNS4xCisqLworCisvLyBjcmVhdGUgb3JnLmFudGxyIG1vZHVsZQoraWYgKHR5cGVvZiBvcmcgPT0gInVuZGVmaW5lZCIgfHwgIW9yZykgeworICAgIHZhciBvcmcgPSB7fTsKK30KK2lmICh0eXBlb2Ygb3JnLmFudGxyID09ICJ1bmRlZmluZWQiIHx8ICFvcmcuYW50bHIpIHsKKyAgICAvKioKKyAgICAgKiBUaGUgb3JnLmFudGxyIGdsb2JhbCBuYW1lc3BhY2Ugb2JqZWN0LiAgSWYgYW50bHIgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGUKKyAgICAgKiBleGlzdGluZyBhbnRsciBvYmplY3Qgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4gc28gdGhhdCBkZWZpbmVkCisgICAgICogbmFtZXNwYWNlcyBhcmUgcHJlc2VydmVkLgorICAgICAqIEBuYW1lc3BhY2Ugb3JnLmFudGxyCisgICAgICovCisgICAgb3JnLmFudGxyID0ge307Cit9CisKKy8qKgorICogVGhlIGdsb2JhbCBKYXZhU2NyaXB0IG9iamVjdC4KKyAqLworb3JnLmFudGxyLmdsb2JhbCA9IChmdW5jdGlvbigpIHsKKyAgICByZXR1cm4gdGhpczsKK30pLmNhbGwobnVsbCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHNwZWNpZmllZCBhbmQgY3JlYXRlcyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICoKKyAqIEJlIGNhcmVmdWwgd2hlbiBuYW1pbmcgcGFja2FnZXMuIFJlc2VydmVkIHdvcmRzIG1heSB3b3JrIGluIHNvbWUgYnJvd3NlcnMKKyAqIGFuZCBub3Qgb3RoZXJzLiBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgd2lsbCBmYWlsIGluIFNhZmFyaToKKyAqIDxwcmU+CisgKiBvcmcuYW50bHIubmFtZXNwYWNlKCJyZWFsbHkubG9uZy5uZXN0ZWQubmFtZXNwYWNlIik7CisgKiA8L3ByZT4KKyAqIFRoaXMgZmFpbHMgYmVjYXVzZSAibG9uZyIgaXMgYSBmdXR1cmUgcmVzZXJ2ZWQgd29yZCBpbiBFQ01BU2NyaXB0CisgKgorICogQHN0YXRpYworICogQHBhcmFtICB7QXJyYXkuPFN0cmluZz59IGFyZ3VtZW50cyAxLW4gbmFtZXNwYWNlcyB0byBjcmVhdGUgCisgKiBAcmV0dXJuIHtPYmplY3R9ICBBIHJlZmVyZW5jZSB0byB0aGUgbGFzdCBuYW1lc3BhY2Ugb2JqZWN0IGNyZWF0ZWQKKyAqIEBleGFtcGxlCisgKiBvcmcuYW50bHIubmFtZXNwYWNlKCJvcmcuYW50bHIucHJvcGVydHkucGFja2FnZSIpOworICovCitvcmcuYW50bHIubmFtZXNwYWNlID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIGE9YXJndW1lbnRzLCBvPW51bGwsIGksIGosIGQ7CisgICAgZm9yIChpPTA7IGk8YS5sZW5ndGg7IGk9aSsxKSB7CisgICAgICAgIGQ9YVtpXS5zcGxpdCgiLiIpOworICAgICAgICBvPW9yZy5hbnRsci5nbG9iYWw7CisKKyAgICAgICAgLy8gQU5UTFIgaXMgaW1wbGllZCwgc28gaXQgaXMgaWdub3JlZCBpZiBpdCBpcyBpbmNsdWRlZAorICAgICAgICBmb3IgKGo9MDsgajxkLmxlbmd0aDsgaj1qKzEpIHsKKyAgICAgICAgICAgIG9bZFtqXV09b1tkW2pdXSB8fCB7fTsKKyAgICAgICAgICAgIG89b1tkW2pdXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvOworfTsKKworLyoqCisgKiBvcmcuYW50bHIuZW52IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGlzIGtub3duIGFib3V0IHRoZSBsaWJyYXJ5IGFuZAorICogdGhlIGJyb3dzaW5nIGVudmlyb25tZW50CisgKiBAbmFtZXNwYWNlIG9yZy5hbnRsci5lbnYKKyAqLworb3JnLmFudGxyLmVudiA9IG9yZy5hbnRsci5lbnYgfHwge307CisKKy8qKgorICogRG8gbm90IGZvcmsgZm9yIGEgYnJvd3NlciBpZiBpdCBjYW4gYmUgYXZvaWRlZC4gIFVzZSBmZWF0dXJlIGRldGVjdGlvbiB3aGVuCisgKiB5b3UgY2FuLiAgVXNlIHRoZSB1c2VyIGFnZW50IGFzIGEgbGFzdCByZXNvcnQuICBvcmcuYW50bHIuZW52LnVhIHN0b3JlcyBhCisgKiB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIGJyb3dzZXIgZW5naW5lLCAwIG90aGVyd2lzZS4gIFRoaXMgdmFsdWUgbWF5IG9yIG1heQorICogbm90IG1hcCB0byB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGJyb3dzZXIgdXNpbmcgdGhlIGVuZ2luZS4gIFRoZSB2YWx1ZSBpcyAKKyAqIHByZXNlbnRlZCBhcyBhIGZsb2F0IHNvIHRoYXQgaXQgY2FuIGVhc2lseSBiZSB1c2VkIGZvciBib29sZWFuIGV2YWx1YXRpb24gCisgKiBhcyB3ZWxsIGFzIGZvciBsb29raW5nIGZvciBhIHBhcnRpY3VsYXIgcmFuZ2Ugb2YgdmVyc2lvbnMuICBCZWNhdXNlIG9mIHRoaXMsIAorICogc29tZSBvZiB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHZlcnNpb24gaW5mbyBtYXkgYmUgbG9zdCAoZS5nLiwgR2Vja28gMS44LjAuOSAKKyAqIHJlcG9ydHMgMS44KS4KKyAqIEBuYW1lc3BhY2Ugb3JnLmFudGxyLmVudi51YQorICovCitvcmcuYW50bHIuZW52LnVhID0gZnVuY3Rpb24oKSB7CisgICAgdmFyIG89IC8qKiBAbGVuZHMgb3JnLmFudGxyLmVudi51YSAqLyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVybmV0IEV4cGxvcmVyIHZlcnNpb24gbnVtYmVyIG9yIDAuICBFeGFtcGxlOiA2CisgICAgICAgICAqIEBwcm9wZXJ0eSBpZQorICAgICAgICAgKiBAdHlwZSBmbG9hdAorICAgICAgICAgKi8KKyAgICAgICAgaWU6MCwKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlcmEgdmVyc2lvbiBudW1iZXIgb3IgMC4gIEV4YW1wbGU6IDkuMgorICAgICAgICAgKiBAcHJvcGVydHkgb3BlcmEKKyAgICAgICAgICogQHR5cGUgZmxvYXQKKyAgICAgICAgICovCisgICAgICAgIG9wZXJhOjAsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlY2tvIGVuZ2luZSByZXZpc2lvbiBudW1iZXIuICBXaWxsIGV2YWx1YXRlIHRvIDEgaWYgR2Vja28gCisgICAgICAgICAqIGlzIGRldGVjdGVkIGJ1dCB0aGUgcmV2aXNpb24gY291bGQgbm90IGJlIGZvdW5kLiBPdGhlciBicm93c2VycworICAgICAgICAgKiB3aWxsIGJlIDAuICBFeGFtcGxlOiAxLjgKKyAgICAgICAgICogPHByZT4KKyAgICAgICAgICogRmlyZWZveCAxLjAuMC40OiAxLjcuOCAgIDwtLSBSZXBvcnRzIDEuNworICAgICAgICAgKiBGaXJlZm94IDEuNS4wLjk6IDEuOC4wLjkgPC0tIFJlcG9ydHMgMS44CisgICAgICAgICAqIEZpcmVmb3ggMi4wLjAuMzogMS44LjEuMyA8LS0gUmVwb3J0cyAxLjgKKyAgICAgICAgICogRmlyZWZveCAzIGFscGhhOiAxLjlhNCAgIDwtLSBSZXBvcnRzIDEuOQorICAgICAgICAgKiA8L3ByZT4KKyAgICAgICAgICogQHByb3BlcnR5IGdlY2tvCisgICAgICAgICAqIEB0eXBlIGZsb2F0CisgICAgICAgICAqLworICAgICAgICBnZWNrbzowLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBsZVdlYktpdCB2ZXJzaW9uLiAgS0hUTUwgYnJvd3NlcnMgdGhhdCBhcmUgbm90IFdlYktpdCBicm93c2VycyAKKyAgICAgICAgICogd2lsbCBldmFsdWF0ZSB0byAxLCBvdGhlciBicm93c2VycyAwLiAgRXhhbXBsZTogNDE4LjkuMQorICAgICAgICAgKiA8cHJlPgorICAgICAgICAgKiBTYWZhcmkgMS4zLjIgKDMxMi42KTogMzEyLjguMSA8LS0gUmVwb3J0cyAzMTIuOCAtLSBjdXJyZW50bHkgdGhlIAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0IGF2YWlsYWJsZSBmb3IgTWFjIE9TWCAxMC4zLgorICAgICAgICAgKiBTYWZhcmkgMi4wLjI6ICAgICAgICAgNDE2ICAgICA8LS0gaGFzT3duUHJvcGVydHkgaW50cm9kdWNlZAorICAgICAgICAgKiBTYWZhcmkgMi4wLjQ6ICAgICAgICAgNDE4ICAgICA8LS0gcHJldmVudERlZmF1bHQgZml4ZWQKKyAgICAgICAgICogU2FmYXJpIDIuMC40ICg0MTkuMyk6IDQxOC45LjEgPC0tIE9uZSB2ZXJzaW9uIG9mIFNhZmFyaSBtYXkgcnVuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgdmVyc2lvbnMgb2Ygd2Via2l0CisgICAgICAgICAqIFNhZmFyaSAyLjAuNCAoNDE5LjMpOiA0MTkgICAgIDwtLSBUaWdlciBpbnN0YWxsYXRpb25zIHRoYXQgaGF2ZSBiZWVuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLCBidXQgbm90IHVwZGF0ZWQKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBsYXRlc3QgcGF0Y2guCisgICAgICAgICAqIFdlYmtpdCAyMTIgbmlnaHRseTogICA1MjIrICAgIDwtLSBTYWZhcmkgMy4wIHByZWN1cnNvciAod2l0aCBuYXRpdmUgU1ZHCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWFueSBtYWpvciBpc3N1ZXMgZml4ZWQpLiAgCisgICAgICAgICAqIDMueCB5YWhvby5jb20sIGZsaWNrcjo0MjIgICAgIDwtLSBTYWZhcmkgMy54IGhhY2tzIHRoZSB1c2VyIGFnZW50CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgd2hlbiBoaXR0aW5nIHlhaG9vLmNvbSBhbmQgCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlja3IuY29tLgorICAgICAgICAgKiBTYWZhcmkgMy4wLjQgKDUyMy4xMik6NTIzLjEyICA8LS0gRmlyc3QgVGlnZXIgcmVsZWFzZSAtIGF1dG9tYXRpYyB1cGRhdGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMi54IHZpYSB0aGUgMTAuNC4xMSBPUyBwYXRjaAorICAgICAgICAgKiBXZWJraXQgbmlnaHRseSAxLzIwMDg6NTI1KyAgICA8LS0gU3VwcG9ydHMgRE9NQ29udGVudExvYWRlZCBldmVudC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhaG9vLmNvbSB1c2VyIGFnZW50IGhhY2sgcmVtb3ZlZC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgKiA8L3ByZT4KKyAgICAgICAgICogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vaW50ZXJuZXQvc2FmYXJpL3VhbWF0cml4Lmh0bWwKKyAgICAgICAgICogQHByb3BlcnR5IHdlYmtpdAorICAgICAgICAgKiBAdHlwZSBmbG9hdAorICAgICAgICAgKi8KKyAgICAgICAgd2Via2l0OiAwLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9iaWxlIHByb3BlcnR5IHdpbGwgYmUgc2V0IHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW55IHJlbGV2YW50CisgICAgICAgICAqIHVzZXIgYWdlbnQgaW5mb3JtYXRpb24gd2hlbiBhIG1vZGVybiBtb2JpbGUgYnJvd3NlciBpcyBkZXRlY3RlZC4KKyAgICAgICAgICogQ3VycmVudGx5IGxpbWl0ZWQgdG8gU2FmYXJpIG9uIHRoZSBpUGhvbmUvaVBvZCBUb3VjaCwgTm9raWEgTi1zZXJpZXMKKyAgICAgICAgICogZGV2aWNlcyB3aXRoIHRoZSBXZWJLaXQtYmFzZWQgYnJvd3NlciwgYW5kIE9wZXJhIE1pbmkuICAKKyAgICAgICAgICogQHByb3BlcnR5IG1vYmlsZSAKKyAgICAgICAgICogQHR5cGUgc3RyaW5nCisgICAgICAgICAqLworICAgICAgICBtb2JpbGU6IG51bGwsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkb2JlIEFJUiB2ZXJzaW9uIG51bWJlciBvciAwLiAgT25seSBwb3B1bGF0ZWQgaWYgd2Via2l0IGlzIGRldGVjdGVkLgorICAgICAgICAgKiBFeGFtcGxlOiAxLjAKKyAgICAgICAgICogQHByb3BlcnR5IGFpcgorICAgICAgICAgKiBAdHlwZSBmbG9hdAorICAgICAgICAgKi8KKyAgICAgICAgYWlyOiAwLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJcyB0aGlzIHRoZSBSaGlubyBpbnRlcnByZXRlcj8KKyAgICAgICAgICogQHByb3BlcnR5IHJoaW5vCisgICAgICAgICAqIEB0eXBlIEJvb2xlYW4KKyAgICAgICAgICovCisgICAgICAgIHJoaW5vOiBmYWxzZQorCisgICAgfTsKKworICAgIHZhciB1YSwgbTsKKworICAgIHRyeSB7CisgICAgICAgIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKKworICAgICAgICAvLyBNb2Rlcm4gS0hUTUwgYnJvd3NlcnMgc2hvdWxkIHF1YWxpZnkgYXMgU2FmYXJpIFgtR3JhZGUKKyAgICAgICAgaWYgKCgvS0hUTUwvKS50ZXN0KHVhKSkgeworICAgICAgICAgICAgby53ZWJraXQ9MTsKKyAgICAgICAgfQorICAgICAgICAvLyBNb2Rlcm4gV2ViS2l0IGJyb3dzZXJzIGFyZSBhdCBsZWFzdCBYLUdyYWRlCisgICAgICAgIG09dWEubWF0Y2goL0FwcGxlV2ViS2l0XC8oW15cc10qKS8pOworICAgICAgICBpZiAobSYmbVsxXSkgeworICAgICAgICAgICAgby53ZWJraXQ9cGFyc2VGbG9hdChtWzFdKTsKKworICAgICAgICAgICAgLy8gTW9iaWxlIGJyb3dzZXIgY2hlY2sKKyAgICAgICAgICAgIGlmICgvIE1vYmlsZVwvLy50ZXN0KHVhKSkgeworICAgICAgICAgICAgICAgIG8ubW9iaWxlID0gIkFwcGxlIjsgLy8gaVBob25lIG9yIGlQb2QgVG91Y2gKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG09dWEubWF0Y2goL05va2lhTlteXC9dKi8pOworICAgICAgICAgICAgaWYgKG0pIHsKKyAgICAgICAgICAgICAgICBvLm1vYmlsZSA9IG1bMF07IC8vIE5va2lhIE4tc2VyaWVzLCBleDogTm9raWFOOTUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG09dWEubWF0Y2goL0Fkb2JlQUlSXC8oW15cc10qKS8pOworICAgICAgICBpZiAobSkgeworICAgICAgICAgICAgby5haXIgPSBtWzBdOyAvLyBBZG9iZSBBSVIgMS4wIG9yIGJldHRlcgorICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICghby53ZWJraXQpIHsgLy8gbm90IHdlYmtpdAorICAgICAgICAgICAgLy8gQHRvZG8gY2hlY2sgT3BlcmEvOC4wMSAoSjJNRS9NSURQOyBPcGVyYSBNaW5pLzIuMC40NTA5LzEzMTY7IGZpOyBVOyBzc3IpCisgICAgICAgICAgICBtPXVhLm1hdGNoKC9PcGVyYVtcc1wvXShbXlxzXSopLyk7CisgICAgICAgICAgICBpZiAobSYmbVsxXSkgeworICAgICAgICAgICAgICAgIG8ub3BlcmE9cGFyc2VGbG9hdChtWzFdKTsKKyAgICAgICAgICAgICAgICBtPXVhLm1hdGNoKC9PcGVyYSBNaW5pW147XSovKTsKKyAgICAgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgICAgICAgby5tb2JpbGUgPSBtWzBdOyAvLyBleDogT3BlcmEgTWluaS8yLjAuNDUwOS8xMzE2CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBub3Qgb3BlcmEgb3Igd2Via2l0CisgICAgICAgICAgICAgICAgbT11YS5tYXRjaCgvTVNJRVxzKFteO10qKS8pOworICAgICAgICAgICAgICAgIGlmIChtJiZtWzFdKSB7CisgICAgICAgICAgICAgICAgICAgIG8uaWU9cGFyc2VGbG9hdChtWzFdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBub3Qgb3BlcmEsIHdlYmtpdCwgb3IgaWUKKyAgICAgICAgICAgICAgICAgICAgbT11YS5tYXRjaCgvR2Vja29cLyhbXlxzXSopLyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvLmdlY2tvPTE7IC8vIEdlY2tvIGRldGVjdGVkLCBsb29rIGZvciByZXZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgbT11YS5tYXRjaCgvcnY6KFteXHNcKV0qKS8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0mJm1bMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmdlY2tvPXBhcnNlRmxvYXQobVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgLy8gaWdub3JlIHRoaXMgaWYgd2UncmUgbm90IGluIGEgYnJvd3NlcgorICAgIH0KKworICAgIHRyeSB7CisgICAgICAgIGlmICh0eXBlb2Ygd2luZG93PT0idW5kZWZpbmVkIiAmJiB0eXBlb2YgbG9hZENsYXNzIT0idW5kZWZpbmVkIikgeworICAgICAgICAgICAgby5yaGlubyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGNhdGNoKGUpIHt9CisKKyAgICAKKyAgICByZXR1cm4gbzsKK30oKTsKKworLyoqCisgKiBKYXZhU2NyaXB0IHJ1bnRpbWUgbGlicmFyeSBjb2RlLgorICogQG5hbWUgb3JnLmFudGxyLnJ1bnRpbWUKKyAqIEBuYW1lc3BhY2UKKyAqLworLyoqCisgKiBKYXZhU2NyaXB0IHJ1bnRpbWUgbGlicmFyeSB0cmVlIHBhcnNlciBjb2RlLgorICogQG5hbWUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZQorICogQG5hbWVzcGFjZQorICovCitvcmcuYW50bHIubmFtZXNwYWNlKCJvcmcuYW50bHIucnVudGltZS50cmVlIik7CisKKy8qKgorICogUHJvdmlkZXMgdGhlIGxhbmd1YWdlIHV0aWxpdGVzIGFuZCBleHRlbnNpb25zIHVzZWQgYnkgdGhlIGxpYnJhcnkKKyAqIEBuYW1lc3BhY2Ugb3JnLmFudGxyLmxhbmcKKyAqLworb3JnLmFudGxyLmxhbmcgPSBvcmcuYW50bHIubGFuZyB8fCAvKiogQGxlbmRzIG9yZy5hbnRsci5sYW5nICovIHsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYW4gYXJyYXkuCisgICAgICogVGVzdGluZyB0eXBlb2YvaW5zdGFuY2VvZi9jb25zdHJ1Y3RvciBvZiBhcnJheXMgYWNyb3NzIGZyYW1lIAorICAgICAqIGJvdW5kYXJpZXMgaXNuJ3QgcG9zc2libGUgaW4gU2FmYXJpIHVubGVzcyB5b3UgaGF2ZSBhIHJlZmVyZW5jZQorICAgICAqIHRvIHRoZSBvdGhlciBmcmFtZSB0byB0ZXN0IGFnYWluc3QgaXRzIEFycmF5IHByb3RvdHlwZS4gIFRvCisgICAgICogaGFuZGxlIHRoaXMgY2FzZSwgd2UgdGVzdCB3ZWxsLWtub3duIGFycmF5IHByb3BlcnRpZXMgaW5zdGVhZC4KKyAgICAgKiBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB7YW55fSBvIFRoZSBvYmplY3QgYmVpbmcgdGVzdGluZworICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBpc0FycmF5OiBmdW5jdGlvbihvKSB7IAorICAgICAgICBpZiAobykgeworICAgICAgICAgICB2YXIgbCA9IG9yZy5hbnRsci5sYW5nOworICAgICAgICAgICByZXR1cm4gbC5pc051bWJlcihvLmxlbmd0aCkgJiYgbC5pc0Z1bmN0aW9uKG8uc3BsaWNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhIGJvb2xlYW4KKyAgICAgKiBAcGFyYW0ge2FueX0gbyBUaGUgb2JqZWN0IGJlaW5nIHRlc3RpbmcKKyAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0aGUgcmVzdWx0CisgICAgICovCisgICAgaXNCb29sZWFuOiBmdW5jdGlvbihvKSB7CisgICAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Jvb2xlYW4nOworICAgIH0sCisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGEgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0ge2FueX0gbyBUaGUgb2JqZWN0IGJlaW5nIHRlc3RpbmcKKyAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0aGUgcmVzdWx0CisgICAgICovCisgICAgaXNGdW5jdGlvbjogZnVuY3Rpb24obykgeworICAgICAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbic7CisgICAgfSwKKyAgICAgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIG51bGwKKyAgICAgKiBAcGFyYW0ge2FueX0gbyBUaGUgb2JqZWN0IGJlaW5nIHRlc3RpbmcKKyAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0aGUgcmVzdWx0CisgICAgICovCisgICAgaXNOdWxsOiBmdW5jdGlvbihvKSB7CisgICAgICAgIHJldHVybiBvID09PSBudWxsOworICAgIH0sCisgICAgICAgIAorICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhIGxlZ2FsIG51bWJlcgorICAgICAqIEBwYXJhbSB7YW55fSBvIFRoZSBvYmplY3QgYmVpbmcgdGVzdGluZworICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBpc051bWJlcjogZnVuY3Rpb24obykgeworICAgICAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdudW1iZXInICYmIGlzRmluaXRlKG8pOworICAgIH0sCisgICAgICAKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm92aWRlZCBvYmplY3QgaXMgb2YgdHlwZSBvYmplY3QKKyAgICAgKiBvciBmdW5jdGlvbgorICAgICAqIEBwYXJhbSB7YW55fSBvIFRoZSBvYmplY3QgYmVpbmcgdGVzdGluZworICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQKKyAgICAgKi8gIAorICAgIGlzT2JqZWN0OiBmdW5jdGlvbihvKSB7CityZXR1cm4gKG8gJiYgKHR5cGVvZiBvID09PSAnb2JqZWN0JyB8fCBvcmcuYW50bHIubGFuZy5pc0Z1bmN0aW9uKG8pKSkgfHwgZmFsc2U7CisgICAgfSwKKyAgICAgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGEgc3RyaW5nCisgICAgICogQHBhcmFtIHthbnl9IG8gVGhlIG9iamVjdCBiZWluZyB0ZXN0aW5nCisgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdGhlIHJlc3VsdAorICAgICAqLworICAgIGlzU3RyaW5nOiBmdW5jdGlvbihvKSB7CisgICAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ3N0cmluZyc7CisgICAgfSwKKyAgICAgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIHVuZGVmaW5lZAorICAgICAqIEBwYXJhbSB7YW55fSBvIFRoZSBvYmplY3QgYmVpbmcgdGVzdGluZworICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBpc1VuZGVmaW5lZDogZnVuY3Rpb24obykgeworICAgICAgICByZXR1cm4gdHlwZW9mIG8gPT09ICd1bmRlZmluZWQnOworICAgIH0sCisgICAgCisgICAgLyoqCisgICAgICogSUUgd2lsbCBub3QgZW51bWVyYXRlIG5hdGl2ZSBmdW5jdGlvbnMgaW4gYSBkZXJpdmVkIG9iamVjdCBldmVuIGlmIHRoZQorICAgICAqIGZ1bmN0aW9uIHdhcyBvdmVycmlkZGVuLiAgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAKKyAgICAgKiB3ZSBjYXJlIGFib3V0IG9uIHRoZSBPYmplY3QgcHJvdG90eXBlLiAKKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByICB0aGUgb2JqZWN0IHRvIHJlY2VpdmUgdGhlIGF1Z21lbnRhdGlvbgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHMgIHRoZSBvYmplY3QgdGhhdCBzdXBwbGllcyB0aGUgcHJvcGVydGllcyB0byBhdWdtZW50CisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBfSUVFbnVtRml4OiBmdW5jdGlvbihyLCBzKSB7CisgICAgICAgIGlmIChvcmcuYW50bHIuZW52LnVhLmllKSB7CisgICAgICAgICAgICB2YXIgYWRkPVsidG9TdHJpbmciLCAidmFsdWVPZiJdLCBpOworICAgICAgICAgICAgZm9yIChpPTA7aTxhZGQubGVuZ3RoO2k9aSsxKSB7CisgICAgICAgICAgICAgICAgdmFyIGZuYW1lPWFkZFtpXSxmPXNbZm5hbWVdOworICAgICAgICAgICAgICAgIGlmIChvcmcuYW50bHIubGFuZy5pc0Z1bmN0aW9uKGYpICYmIGYhPU9iamVjdC5wcm90b3R5cGVbZm5hbWVdKSB7CisgICAgICAgICAgICAgICAgICAgIHJbZm5hbWVdPWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IHRvIHNldCB1cCB0aGUgcHJvdG90eXBlLCBjb25zdHJ1Y3RvciBhbmQgc3VwZXJjbGFzcyBwcm9wZXJ0aWVzIHRvCisgICAgICogc3VwcG9ydCBhbiBpbmhlcml0YW5jZSBzdHJhdGVneSB0aGF0IGNhbiBjaGFpbiBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMuCisgICAgICogU3RhdGljIG1lbWJlcnMgd2lsbCBub3QgYmUgaW5oZXJpdGVkLgorICAgICAqCisgICAgICogQG1ldGhvZCBleHRlbmQKKyAgICAgKiBAc3RhdGljCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ViYyAgIHRoZSBvYmplY3QgdG8gbW9kaWZ5CisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJjIHRoZSBvYmplY3QgdG8gaW5oZXJpdAorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3ZlcnJpZGVzXSAgYWRkaXRpb25hbCBwcm9wZXJ0aWVzL21ldGhvZHMgdG8gYWRkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3MgcHJvdG90eXBlLiAgVGhlc2Ugd2lsbCBvdmVycmlkZSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nIGl0ZW1zIG9idGFpbmVkIGZyb20gdGhlIHN1cGVyY2xhc3MgCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcmVzZW50LgorICAgICAqLworICAgIGV4dGVuZDogZnVuY3Rpb24oc3ViYywgc3VwZXJjLCBvdmVycmlkZXMpIHsKKyAgICAgICAgaWYgKCFzdXBlcmN8fCFzdWJjKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm9yZy5hbnRsci5sYW5nLmV4dGVuZCBmYWlsZWQsIHBsZWFzZSBjaGVjayB0aGF0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbmNsdWRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCkge307CisgICAgICAgIEYucHJvdG90eXBlPXN1cGVyYy5wcm90b3R5cGU7CisgICAgICAgIHN1YmMucHJvdG90eXBlPW5ldyBGKCk7CisgICAgICAgIHN1YmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPXN1YmM7CisgICAgICAgIHN1YmMuc3VwZXJjbGFzcz1zdXBlcmMucHJvdG90eXBlOworICAgICAgICBpZiAoc3VwZXJjLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9PSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBzdXBlcmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPXN1cGVyYzsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAob3ZlcnJpZGVzKSB7CisgICAgICAgICAgICBmb3IgKHZhciBpIGluIG92ZXJyaWRlcykgeworICAgICAgICAgICAgICAgIHN1YmMucHJvdG90eXBlW2ldPW92ZXJyaWRlc1tpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3JnLmFudGxyLmxhbmcuX0lFRW51bUZpeChzdWJjLnByb3RvdHlwZSwgb3ZlcnJpZGVzKTsKKyAgICAgICAgfQorICAgIH0sCisgICAKKyAgICAvKioKKyAgICAgKiBBcHBsaWVzIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBzdXBwbGllciB0byB0aGUgcmVjZWl2ZXIgaWYgdGhlCisgICAgICogcmVjZWl2ZXIgZG9lcyBub3QgaGF2ZSB0aGVzZSBwcm9wZXJ0aWVzIHlldC4gIE9wdGlvbmFsbHksIG9uZSBvciAKKyAgICAgKiBtb3JlIG1ldGhvZHMvcHJvcGVydGllcyBjYW4gYmUgc3BlY2lmaWVkIChhcyBhZGRpdGlvbmFsIAorICAgICAqIHBhcmFtZXRlcnMpLiAgVGhpcyBvcHRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIHByb3BlcnR5IGlmIHJlY2VpdmVyIAorICAgICAqIGhhcyBpdCBhbHJlYWR5LiAgSWYgdHJ1ZSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciwgYWxsIAorICAgICAqIHByb3BlcnRpZXMgd2lsbCBiZSBhcHBsaWVkIGFuZCBfd2lsbF8gb3ZlcndyaXRlIHByb3BlcnRpZXMgaW4gCisgICAgICogdGhlIHJlY2VpdmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gciAgdGhlIG9iamVjdCB0byByZWNlaXZlIHRoZSBhdWdtZW50YXRpb24KKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzICB0aGUgb2JqZWN0IHRoYXQgc3VwcGxpZXMgdGhlIHByb3BlcnRpZXMgdG8gYXVnbWVudAorICAgICAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz58Ym9vbGVhbn0gIFthcmd1bWVudHNdIHplcm8gb3IgbW9yZSBwcm9wZXJ0aWVzCisgICAgICogICAgICAgIG1ldGhvZHMgIHRvIGF1Z21lbnQgdGhlIHJlY2VpdmVyIHdpdGguICBJZiBub25lIHNwZWNpZmllZCwKKyAgICAgKiAgICAgICAgZXZlcnl0aGluZyBpbiB0aGUgc3VwcGxpZXIgd2lsbCBiZSB1c2VkIHVubGVzcyBpdCB3b3VsZAorICAgICAqICAgICAgICBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgcHJvcGVydHkgaW4gdGhlIHJlY2VpdmVyLiBJZiB0cnVlCisgICAgICogICAgICAgIGlzIHNwZWNpZmllZCBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyLCBhbGwgcHJvcGVydGllcyB3aWxsCisgICAgICogICAgICAgIGJlIGFwcGxpZWQgYW5kIHdpbGwgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHByb3BlcnR5IGluCisgICAgICogICAgICAgIHRoZSByZWNlaXZlcgorICAgICAqLworICAgIGF1Z21lbnRPYmplY3Q6IGZ1bmN0aW9uKHIsIHMpIHsKKyAgICAgICAgaWYgKCFzfHwhcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBYnNvcmIgZmFpbGVkLCB2ZXJpZnkgZGVwZW5kZW5jaWVzLiIpOworICAgICAgICB9CisgICAgICAgIHZhciBhPWFyZ3VtZW50cywgaSwgcCwgb3ZlcnJpZGU9YVsyXTsKKyAgICAgICAgaWYgKG92ZXJyaWRlICYmIG92ZXJyaWRlIT09dHJ1ZSkgeyAvLyBvbmx5IGFic29yYiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGZvciAoaT0yOyBpPGEubGVuZ3RoOyBpPWkrMSkgeworICAgICAgICAgICAgICAgIHJbYVtpXV0gPSBzW2FbaV1dOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyB0YWtlIGV2ZXJ5dGhpbmcsIG92ZXJ3cml0aW5nIG9ubHkgaWYgdGhlIHRoaXJkIHBhcmFtZXRlciBpcyB0cnVlCisgICAgICAgICAgICBmb3IgKHAgaW4gcykgeyAKKyAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGUgfHwgIXJbcF0pIHsKKyAgICAgICAgICAgICAgICAgICAgcltwXSA9IHNbcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcmcuYW50bHIubGFuZy5fSUVFbnVtRml4KHIsIHMpOworICAgICAgICB9CisgICAgfSwKKyAKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIG9yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3QsIGV4Y2VwdCBpdCBvbmx5IGFwcGxpZXMgcHJvdG90eXBlIHByb3BlcnRpZXMKKyAgICAgKiBAc2VlIG9yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3QKKyAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByICB0aGUgb2JqZWN0IHRvIHJlY2VpdmUgdGhlIGF1Z21lbnRhdGlvbgorICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHMgIHRoZSBvYmplY3QgdGhhdCBzdXBwbGllcyB0aGUgcHJvcGVydGllcyB0byBhdWdtZW50CisgICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPnxib29sZWFufSAgW2FyZ3VtZW50c10gemVybyBvciBtb3JlIHByb3BlcnRpZXMgbWV0aG9kcyAKKyAgICAgKiAgICAgICAgdG8gYXVnbWVudCB0aGUgcmVjZWl2ZXIgd2l0aC4gIElmIG5vbmUgc3BlY2lmaWVkLCBldmVyeXRoaW5nIAorICAgICAqICAgICAgICBpbiB0aGUgc3VwcGxpZXIgd2lsbCBiZSB1c2VkIHVubGVzcyBpdCB3b3VsZCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgCisgICAgICogICAgICAgIHByb3BlcnR5IGluIHRoZSByZWNlaXZlci4gIGlmIHRydWUgaXMgc3BlY2lmaWVkIGFzIHRoZSB0aGlyZCAKKyAgICAgKiAgICAgICAgcGFyYW1ldGVyLCBhbGwgcHJvcGVydGllcyB3aWxsIGJlIGFwcGxpZWQgYW5kIHdpbGwgb3ZlcndyaXRlIGFuIAorICAgICAqICAgICAgICBleGlzdGluZyBwcm9wZXJ0eSBpbiB0aGUgcmVjZWl2ZXIKKyAgICAgKi8KKyAgICBhdWdtZW50UHJvdG86IGZ1bmN0aW9uKHIsIHMpIHsKKyAgICAgICAgaWYgKCFzfHwhcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdWdtZW50IGZhaWxlZCwgdmVyaWZ5IGRlcGVuZGVuY2llcy4iKTsKKyAgICAgICAgfQorICAgICAgICAvL3ZhciBhPVtdLmNvbmNhdChhcmd1bWVudHMpOworICAgICAgICB2YXIgYT1bci5wcm90b3R5cGUscy5wcm90b3R5cGVdOworICAgICAgICBmb3IgKHZhciBpPTI7aTxhcmd1bWVudHMubGVuZ3RoO2k9aSsxKSB7CisgICAgICAgICAgICBhLnB1c2goYXJndW1lbnRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0LmFwcGx5KHRoaXMsIGEpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBjb250YWluaW5nIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZgorICAgICAqIGFsbCB0aGUgc3VwcGxpZWQgb2JqZWN0cy4gIFRoZSBwcm9wZXJ0aWVzIGZyb20gbGF0ZXIgb2JqZWN0cworICAgICAqIHdpbGwgb3ZlcndyaXRlIHRob3NlIGluIGVhcmxpZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIHtPYmplY3QqfSB0aGUgb2JqZWN0cyB0byBtZXJnZQorICAgICAqIEByZXR1cm4gdGhlIG5ldyBtZXJnZWQgb2JqZWN0CisgICAgICovCisgICAgbWVyZ2U6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbz17fSwgYT1hcmd1bWVudHM7CisgICAgICAgIGZvciAodmFyIGk9MCwgbD1hLmxlbmd0aDsgaTxsOyBpPWkrMSkgeworICAgICAgICAgICAgb3JnLmFudGxyLmxhbmcuYXVnbWVudE9iamVjdChvLCBhW2ldLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbzsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGRldGVjdGluZyBhIGxlZ2l0aW1hdGUgbm9uLW51bGwgdmFsdWUuCisgICAgICogUmV0dXJucyBmYWxzZSBmb3IgbnVsbC91bmRlZmluZWQvTmFOLCB0cnVlIGZvciBvdGhlciB2YWx1ZXMsIAorICAgICAqIGluY2x1ZGluZyAwL2ZhbHNlLycnCisgICAgICogQHBhcmFtIG8ge2FueX0gdGhlIGl0ZW0gdG8gdGVzdAorICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgaXQgaXMgbm90IG51bGwvdW5kZWZpbmVkL05hTiB8fCBmYWxzZQorICAgICAqLworICAgIGlzVmFsdWU6IGZ1bmN0aW9uKG8pIHsKKyAgICAgICAgdmFyIGwgPSBvcmcuYW50bHIubGFuZzsKK3JldHVybiAobC5pc09iamVjdChvKSB8fCBsLmlzU3RyaW5nKG8pIHx8IGwuaXNOdW1iZXIobykgfHwgbC5pc0Jvb2xlYW4obykpOworICAgIH0sCisKKyAgICAvKiogQG5hbWVzcGFjZSBvcmcuYW50bHIubGFuZy5hcnJheSBBcnJheSBjb252ZW5pZW5jZSBtZXRob2RzLiAqLworICAgIGFycmF5OiAvKiogQGxlbmRzIG9yZy5hbnRsci5sYW5nLmFycmF5ICovIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFRocm93cyBhbiBlcnJvciBpZiBhIGlzIG5vdAorICAgICAgICAgKiBhbiBhcnJheSBvciBlbXB0eS4KKyAgICAgICAgICogQHBhcmFtIGEge0FycmF5fSB0aGUgYXJyYXkgc3RhY2sgdG8gcGVlayBpbgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGFycmF5CisgICAgICAgICAqLworICAgICAgICAgcGVlazogZnVuY3Rpb24oYSkgeworICAgICAgICAgICAgaWYgKCFvcmcuYW50bHIubGFuZy5pc0FycmF5KGEpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJvcmcuYW50bHIubGFuZy5hcnJheS5wZWVrOiBhIGlzIG5vdCBhbiBhcnJheS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBsID0gYS5sZW5ndGg7CisgICAgICAgICAgICBpZiAobDw9MCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigib3JnLmFudGxyLmxhbmcuYXJyYXkucGVlazogYSBpcyBlbXB0eS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhW2wtMV07CisgICAgICAgIH0KKyAgICB9Cit9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyZDBlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9BTlRMUkZpbGVTdHJlYW0uanMKQEAgLTAsMCArMSw2MyBAQAorLyoqIAorICogTG9hZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhbGwgYXQgb25jZSBhbmQgcGFzc2VzIGl0cyBjb250ZW50cyBvZmYgdG8KKyAqIHtAbGluayBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbX0uCisgKiBDdXJyZW50bHkgdGhpcyBjbGFzcyBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBSaGlubyBKUyBpbnRlcnByZXRlci4KKyAqIEBjbGFzcworICogQGV4dGVuZHMgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0KKyAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlTmFtZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZAorICogQHBhcmFtIHtTdHJpbmd9IFtlbmNvZGluZ10gbmFtZSBvZiB0aGUgY2hhcnNldCB1c2VkIGZvciBkZWNvZGluZworICovCitvcmcuYW50bHIucnVudGltZS5BTlRMUkZpbGVTdHJlYW0gPSBmdW5jdGlvbihmaWxlTmFtZSwgZW5jb2RpbmcpIHsKKyAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisKKyAgICAvLyBAdG9kbyBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBvdGhlciBKUyBpbnRlcnByZXRlcnMgdGhhdCBoYXZlIGZpbGUgaS9vCisgICAgLy8gaG9va3MgKFNwaWRlck1vbmtleSBhbmQgV1NIIGNvbWUgdG8gbWluZCkuCisgICAgdmFyIG1ldGhvZDsKKyAgICBpZiAob3JnLmFudGxyLmVudi51YS5yaGlubykgeworICAgICAgICBtZXRob2QgPSAibG9hZEZpbGVVc2luZ0phdmEiOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigKKyAgICAgICAgICAgICJBTlRMUiBGaWxlIEkvTyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgSlMgaW1wbGVtZW50YXRpb24uIgorICAgICAgICApOworICAgIH0KKworICAgIHZhciBkYXRhID0gdGhpc1ttZXRob2RdKGZpbGVOYW1lLCBlbmNvZGluZyk7CisgICAgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJGaWxlU3RyZWFtLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBkYXRhKTsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS5BTlRMUkZpbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSwKKy8qKiBAbGVuZHMgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJGaWxlU3RyZWFtLnByb3RvdHlwZSAqL3sKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbGUgcGF0aCBmcm9tIHdoaWNoIHRoZSBpbnB1dCB3YXMgbG9hZGVkLgorICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBmaWxlIHBhdGggZnJvbSB3aGljaCB0aGUgaW5wdXQgd2FzIGxvYWRlZAorICAgICAqLworICAgIGdldFNvdXJjZU5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5maWxlTmFtZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb250ZW50cyBhcyBhIEpTIHN0cmluZy4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlTmFtZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbZW5jb2RpbmddIG5hbWUgb2YgdGhlIGNoYXJzZXQgdXNlZCBmb3IgZGVjb2RpbmcKKyAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUKKyAgICAgKi8KKyAgICBsb2FkRmlsZVVzaW5nSmF2YTogZnVuY3Rpb24oZmlsZU5hbWUsIGVuY29kaW5nKSB7CisgICAgICAgIC8vIHJlYWQgdGhlIGZpbGUgdXNpbmcgSmF2YSBtZXRob2RzCisgICAgICAgIHZhciBmID0gbmV3IGphdmEuaW8uRmlsZShmaWxlTmFtZSksCisgICAgICAgICAgICBzaXplID0gZi5sZW5ndGgoKSwKKyAgICAgICAgICAgIGlzciwKKyAgICAgICAgICAgIGZpcyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmKTsKKyAgICAgICAgaWYgKGVuY29kaW5nKSB7CisgICAgICAgICAgICBpc3IgPSBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihmaXMsIGVuY29kaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlzciA9IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGZpcyk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGRhdGEgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShqYXZhLmxhbmcuQ2hhcmFjdGVyLlRZUEUsIHNpemUpOworICAgICAgICBpc3IucmVhZChkYXRhLCAwLCBzaXplKTsKKworICAgICAgICAvLyBjb252ZXJ0IGphdmEgY2hhciBhcnJheSB0byBhIGphdmFzY3JpcHQgc3RyaW5nCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKG5ldyBqYXZhLmxhbmcuU3RyaW5nKGRhdGEpKTsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0FOVExSU3RyaW5nU3RyZWFtLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQxMzc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0FOVExSU3RyaW5nU3RyZWFtLmpzCkBAIC0wLDAgKzEsMzE4IEBACisvKioKKyAqIEEgc3RyZWFtIG9mIGNoYXJhY3RlcnMgY3JlYXRlZCBmcm9tIGEgSmF2YVNjcmlwdCBzdHJpbmcgdGhhdCBpbiB0dXJuIGdldHMKKyAqIGZlZCB0byBhIGxleGVyLgorICogQGNsYXNzCisgKiBAZXh0ZW5kcyBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtCisgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSB0aGUgc3RyaW5nIGZyb20gd2hpY2ggdGhpcyBzdHJlYW0gd2lsbCBiZSBjcmVhdGVkLgorICovCitvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSA9IGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAvKioKKyAgICAgKiBMb2NhdGlvbiBpbiB0aGUgc3RyZWFtLgorICAgICAqIFJhbmdlcyBmcm9tIDAgdG8gKHN0cmVhbSBsZW5ndGggLSAxKS4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIHRoaXMucCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBsaW5lIGluIHRoZSBpbnB1dC4KKyAgICAgKiBSYW5nZXMgZnJvbSAxIHRvIChudW1iZXIgb2YgbGluZXMpLgorICAgICAqIEBwcml2YXRlCisgICAgICogQHR5cGUgTnVtYmVyCisgICAgICovCisgICAgdGhpcy5saW5lID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuCisgICAgICogUmFuZ2VzIGZyb20gMCB0byAobGVuZ3RoIG9mIGxpbmUgLSAxKS4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIHRoaXMuY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyBob3cgZGVlcCBtYXJrKCkgY2FsbHMgYXJlIG5lc3RlZAorICAgICAqIEBwcml2YXRlCisgICAgICogQHR5cGUgTnVtYmVyCisgICAgICovCisgICAgdGhpcy5tYXJrRGVwdGggPSAwOworCisgICAgLyoqCisgICAgICogQW4gQXJyYXkgb2Ygb2JqZWN0cyB0aGF0IHRyYWNrcyB0aGUgc3RyZWFtIHN0YXRlCisgICAgICogdmFsdWVzIGxpbmUsIGNoYXJQb3NpdGlvbkluTGluZSwgYW5kIHAgdGhhdCBjYW4gY2hhbmdlIGFzIHlvdQorICAgICAqIG1vdmUgdGhyb3VnaCB0aGUgaW5wdXQgc3RyZWFtLiAgSW5kZXhlZCBmcm9tIDEuLm1hcmtEZXB0aC4KKyAgICAgKiBBIG51bGwgaXMga2VwdCBhdCBpbmRleCAwLiAgQ3JlYXRlZCB1cG9uIGZpcnN0IGNhbGwgdG8gbWFyaygpLgorICAgICAqIEBwcml2YXRlCisgICAgICogQHR5cGUgQXJyYXkKKyAgICAgKi8KKyAgICB0aGlzLm1hcmtlcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogVHJhY2sgdGhlIGxhc3QgbWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gcmV3aW5kKCkuCisgICAgICogQHByaXZhdGUKKyAgICAgKiBAdHlwZSBOdW1iZXIKKyAgICAgKi8KKyAgICB0aGlzLmxhc3RNYXJrZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgYmVpbmcgc2Nhbm5lZC4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEB0eXBlIFN0cmluZworICAgICAqLworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmVhbS4KKyAgICAgKiBAcHJpdmF0ZQorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIHRoaXMubiA9IGRhdGEubGVuZ3RoOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW0sCisvKiogQGxlbmRzIG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtLnByb3RvdHlwZSAqLworeworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBpdCdzIGluIHRoZSBzYW1lIHN0YXRlIGl0IHdhcworICAgICAqIHdoZW4gdGhlIG9iamVjdCB3YXMgY3JlYXRlZCAqZXhjZXB0KiB0aGUgZGF0YSBhcnJheSBpcyBub3QKKyAgICAgKiB0b3VjaGVkLgorICAgICAqLworICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKKyAgICAgICB0aGlzLnAgPSAwOworICAgICAgIHRoaXMubGluZSA9IDE7CisgICAgICAgdGhpcy5jaGFyUG9zaXRpb25JbkxpbmUgPSAwOworICAgICAgIHRoaXMubWFya0RlcHRoID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQ29uc3VtZSB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgZGF0YSBpbiB0aGUgc3RyZWFtLgorICAgICAqLworICAgIGNvbnN1bWU6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAoIHRoaXMucCA8IHRoaXMubiApIHsKKyAgICAgICAgICAgIHRoaXMuY2hhclBvc2l0aW9uSW5MaW5lKys7CisgICAgICAgICAgICBpZiAoIHRoaXMuZGF0YS5jaGFyQXQodGhpcy5wKT09PSJcbiIgKSB7CisgICAgICAgICAgICAgICAgdGhpcy5saW5lKys7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFyUG9zaXRpb25JbkxpbmU9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucCsrOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEdldCBjaGFyYWN0ZXIgYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBpbnQuCisgICAgICogTmVnYXRpdmUgaW5kZXhlcyBhcmUgYWxsb3dlZC4gIExBKC0xKSBpcyBwcmV2aW91cyB0b2tlbiAodG9rZW4KKyAgICAgKiBqdXN0IG1hdGNoZWQpLiAgTEEoLWkpIHdoZXJlIGkgaXMgYmVmb3JlIGZpcnN0IHRva2VuIHNob3VsZAorICAgICAqIHlpZWxkIC0xLCBpbnZhbGlkIGNoYXIgLyBFT0YuCisgICAgICogQHBhcmFtIHtOdW1iZXJ9IGkgbm9uLXplcm8gYW1vdW50IG9mIGxvb2thaGVhZCBvciBsb29rYmFjaworICAgICAqIEByZXR1cm5zIHtTdHJpbmd8TnVtYmVyfSBUaGUgY2hhcmN0ZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBvciAtMSBpZgorICAgICAqICAgICAgeW91IGZlbGwgb2ZmIGVpdGhlciBlbmQgb2YgdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBMQTogZnVuY3Rpb24oaSkgeworICAgICAgICBpZiAoIGk8MCApIHsKKyAgICAgICAgICAgIGkrKzsgLy8gZS5nLiwgdHJhbnNsYXRlIExBKC0xKSB0byB1c2Ugb2Zmc2V0IGk9MDsgdGhlbiBkYXRhW3ArMC0xXQorICAgICAgICB9CisKKyAgICAgICAgdmFyIG5ld19wb3MgPSB0aGlzLnAraS0xOworICAgICAgICBpZiAobmV3X3Bvcz49dGhpcy5uIHx8IG5ld19wb3M8MCkgeworICAgICAgICAgICAgcmV0dXJuIG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW0uRU9GOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRhdGEuY2hhckF0KG5ld19wb3MpOworICAgIH0sCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wgaW5kZXggMC4ubiB3aGVyZSBuIGluZGljYXRlcyB0aGUKKyAgICAgKiBsYXN0IHN5bWJvbCBoYXMgYmVlbiByZWFkLiAgVGhlIGluZGV4IGlzIHRoZSBpbmRleCBvZiBjaGFyIHRvCisgICAgICogYmUgcmV0dXJuZWQgZnJvbSBMQSgxKSAoaS5lLiB0aGUgb25lIGFib3V0IHRvIGJlIGNvbnN1bWVkKS4KKyAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sCisgICAgICovCisgICAgaW5kZXg6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoaXMgc3RyZWFtLgorICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBsZW5ndGggb2YgdGhpcyBzdHJlYW0uCisgICAgICovCisgICAgc2l6ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm47CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFRlbGwgdGhlIHN0cmVhbSB0byBzdGFydCBidWZmZXJpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkuICBSZXR1cm4KKyAgICAgKiBjdXJyZW50IGlucHV0IHBvc2l0aW9uLCBpbmRleCgpLCBvciBzb21lIG90aGVyIG1hcmtlciBzbyB0aGF0CisgICAgICogd2hlbiBwYXNzZWQgdG8gcmV3aW5kKCkgeW91IGdldCBiYWNrIHRvIHRoZSBzYW1lIHNwb3QuCisgICAgICogcmV3aW5kKG1hcmsoKSkgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGlucHV0IGN1cnNvci4gIFRoZSBMZXhlcgorICAgICAqIHRyYWNrcyBsaW5lL2NvbCBpbmZvIGFzIHdlbGwgYXMgaW5wdXQgaW5kZXggc28gaXRzIG1hcmtlcnMgYXJlCisgICAgICogbm90IHB1cmUgaW5wdXQgaW5kZXhlcy4gIFNhbWUgZm9yIHRyZWUgbm9kZSBzdHJlYW1zLgorICAgICAqCisgICAgICogPHA+TWFya2luZyBpcyBhIG1lY2hhbmlzbSBmb3Igc3RvcmluZyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBhIHN0cmVhbQorICAgICAqIGluIGEgc3RhY2suICBUaGlzIGNvcnJlc3BvbmRzIHdpdGggdGhlIHByZWRpY3RpdmUgbG9vay1haGVhZCBtZWNoYW5pc20KKyAgICAgKiB1c2VkIGluIExleGVycy48L3A+CisgICAgICogQHJldHVybnMge051bWJlcn0gdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgbWFyayBzdGFjay4KKyAgICAgKi8KKyAgICBtYXJrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAhdGhpcy5tYXJrZXJzICkgeworICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gW107CisgICAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaChudWxsKTsgLy8gZGVwdGggMCBtZWFucyBubyBiYWNrdHJhY2tpbmcsIGxlYXZlIGJsYW5rCisgICAgICAgIH0KKyAgICAgICAgdGhpcy5tYXJrRGVwdGgrKzsKKyAgICAgICAgdmFyIHN0YXRlID0gbnVsbDsKKyAgICAgICAgaWYgKCB0aGlzLm1hcmtEZXB0aD49dGhpcy5tYXJrZXJzLmxlbmd0aCApIHsKKyAgICAgICAgICAgIHN0YXRlID0ge307CisgICAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaChzdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRoaXMubWFya2Vyc1t0aGlzLm1hcmtEZXB0aF07CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUucCA9IHRoaXMucDsKKyAgICAgICAgc3RhdGUubGluZSA9IHRoaXMubGluZTsKKyAgICAgICAgc3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lID0gdGhpcy5jaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHRoaXMubWFya0RlcHRoOworICAgICAgICByZXR1cm4gdGhpcy5tYXJrRGVwdGg7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJld2luZCB0byB0aGUgaW5wdXQgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWFya2VyLgorICAgICAqIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0CisgICAgICogYmVmb3JlIHN0YXJ0aW5nIGEgc2VtL3N5biBwcmVkaWNhdGUgdG8gZ2V0IHRoZQorICAgICAqIGlucHV0IHBvc2l0aW9uIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkZWNpc2lvbi4KKyAgICAgKiBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgbWFyayhpKQorICAgICAqIGFuZCByZXdpbmQoaSkgc2hvdWxkIGJhbGFuY2Ugc3RpbGwuIEl0IGlzCisgICAgICogbGlrZSBpbnZva2luZyByZXdpbmQobGFzdCBtYXJrZXIpIGJ1dCBpdCBzaG91bGQgbm90ICJwb3AiCisgICAgICogdGhlIG1hcmtlciBvZmYuICBJdCdzIGxpa2Ugc2VlayhsYXN0IG1hcmtlcidzIGlucHV0IHBvc2l0aW9uKS4KKyAgICAgKiBAcGFyYW0ge051bWJlcn0gW21dIHRoZSBpbmRleCBpbiB0aGUgbWFyayBzdGFjayB0byBsb2FkIGluc3RlYWQgb2YgdGhlCisgICAgICogICAgICBsYXN0LgorICAgICAqLworICAgIHJld2luZDogZnVuY3Rpb24obSkgeworICAgICAgICBpZiAoIW9yZy5hbnRsci5sYW5nLmlzTnVtYmVyKG0pKSB7CisgICAgICAgICAgICBtID0gdGhpcy5sYXN0TWFya2VyOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5tYXJrZXJzW21dOworICAgICAgICAvLyByZXN0b3JlIHN0cmVhbSBzdGF0ZQorICAgICAgICB0aGlzLnNlZWsoc3RhdGUucCk7CisgICAgICAgIHRoaXMubGluZSA9IHN0YXRlLmxpbmU7CisgICAgICAgIHRoaXMuY2hhclBvc2l0aW9uSW5MaW5lID0gc3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICB0aGlzLnJlbGVhc2UobSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFlvdSBtYXkgd2FudCB0byBjb21taXQgdG8gYSBiYWNrdHJhY2sgYnV0IGRvbid0IHdhbnQgdG8gZm9yY2UgdGhlCisgICAgICogc3RyZWFtIHRvIGtlZXAgYm9va2tlZXBpbmcgb2JqZWN0cyBhcm91bmQgZm9yIGEgbWFya2VyIHRoYXQgaXMKKyAgICAgKiBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKyAgICAgKiByZXdpbmQoKSBleGNlcHQgaXQgcmVsZWFzZXMgcmVzb3VyY2VzIHdpdGhvdXQgdGhlIGJhY2t3YXJkIHNlZWsuCisgICAgICogVGhpcyBtdXN0IHRocm93IGF3YXkgcmVzb3VyY2VzIGZvciBhbGwgbWFya2VycyBiYWNrIHRvIHRoZSBtYXJrZXIKKyAgICAgKiBhcmd1bWVudC4gIFNvIGlmIHlvdSdyZSBuZXN0ZWQgNSBsZXZlbHMgb2YgbWFyaygpLCBhbmQgdGhlbiByZWxlYXNlKDIpCisgICAgICogeW91IGhhdmUgdG8gcmVsZWFzZSByZXNvdXJjZXMgZm9yIGRlcHRocyAyLi41LgorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXJrZXIgdGhlIG1hcmsgZGVwdGggYWJvdmUgd2hpY2ggYWxsIG1hcmsgc3RhdGVzIHdpbGwKKyAgICAgKiAgICAgIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIHJlbGVhc2U6IGZ1bmN0aW9uKG1hcmtlcikgeworICAgICAgICAvLyB1bndpbmQgYW55IG90aGVyIG1hcmtlcnMgbWFkZSBhZnRlciBtIGFuZCByZWxlYXNlIG0KKyAgICAgICAgdGhpcy5tYXJrRGVwdGggPSBtYXJrZXI7CisgICAgICAgIC8vIHJlbGVhc2UgdGhpcyBtYXJrZXIKKyAgICAgICAgdGhpcy5tYXJrRGVwdGgtLTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCBjdXJzb3IgdG8gdGhlIHBvc2l0aW9uIGluZGljYXRlZCBieSBpbmRleC4gIFRoaXMgaXMKKyAgICAgKiBub3JtYWxseSB1c2VkIHRvIHNlZWsgYWhlYWQgaW4gdGhlIGlucHV0IHN0cmVhbS4gIE5vIGJ1ZmZlcmluZyBpcworICAgICAqIHJlcXVpcmVkIHRvIGRvIHRoaXMgdW5sZXNzIHlvdSBrbm93IHlvdXIgc3RyZWFtIHdpbGwgdXNlIHNlZWsgdG8KKyAgICAgKiBtb3ZlIGJhY2t3YXJkcyBzdWNoIGFzIHdoZW4gYmFja3RyYWNraW5nLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBkaWZmZXJlbnQgZnJvbSByZXdpbmQgaW4gaXRzIG11bHRpLWRpcmVjdGlvbmFsCisgICAgICogcmVxdWlyZW1lbnQgYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvcgorICAgICAqIChpbmRleCkuPC9wPgorICAgICAqCisgICAgICogPHA+Rm9yIGNoYXIgc3RyZWFtcywgc2Vla2luZyBmb3J3YXJkIG11c3QgdXBkYXRlIHRoZSBzdHJlYW0gc3RhdGUgc3VjaAorICAgICAqIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisgICAgICogYmFja3RyYWNraW5nIHVzaW5nIHRoZSBtYXJrL3Jld2luZCBtZWNoYW5pc20gdGhhdCByZXN0b3JlcyBzdGF0ZSBhbmQKKyAgICAgKiBzbyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBuZWVkIHRvIHVwZGF0ZSBzdGF0ZSB3aGVuIHNlZWtpbmcgYmFja3dhcmRzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkN1cnJlbnRseSwgdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGZvciBlZmZpY2llbnQgYmFja3RyYWNraW5nIHVzaW5nCisgICAgICogbWVtb2l6YXRpb24sIGJ1dCBpbiB0aGUgZnV0dXJlIGl0IG1heSBiZSB1c2VkIGZvciBpbmNyZW1lbnRhbAorICAgICAqIHBhcnNpbmcuPC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGluZGV4IGlzIDAuLm4tMS4gIEEgc2VlayB0byBwb3NpdGlvbiBpIG1lYW5zIHRoYXQgTEEoMSkgd2lsbAorICAgICAqIHJldHVybiB0aGUgaXRoIHN5bWJvbC4gIFNvLCBzZWVraW5nIHRvIDAgbWVhbnMgTEEoMSkgd2lsbCByZXR1cm4gdGhlCisgICAgICogZmlyc3QgZWxlbWVudCBpbiB0aGUgc3RyZWFtLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkVzZW50aWFsbHkgdGhpcyBtZXRob2QgbWV0aG9kIG1vdmVzIHRoZSBpbnB1dCBwb3NpdGlvbiwKKyAgICAgKiB7QGxpbmsgI2NvbnN1bWV9LWluZyBkYXRhIGlmIG5lY2Vzc2FyeS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggdGhlIHBvc2l0aW9uIHRvIHNlZWsgdG8uCisgICAgICovCisgICAgc2VlazogZnVuY3Rpb24oaW5kZXgpIHsKKyAgICAgICAgaWYgKCBpbmRleDw9dGhpcy5wICkgeworICAgICAgICAgICAgdGhpcy5wID0gaW5kZXg7IC8vIGp1c3QganVtcDsgZG9uJ3QgdXBkYXRlIHN0cmVhbSBzdGF0ZSAobGluZSwgLi4uKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHNlZWsgZm9yd2FyZCwgY29uc3VtZSB1bnRpbCBwIGhpdHMgaW5kZXgKKyAgICAgICAgd2hpbGUgKCB0aGlzLnA8aW5kZXggKSB7CisgICAgICAgICAgICB0aGlzLmNvbnN1bWUoKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHN1YnN0cmluZyBmcm9tIHRoaXMgc3RyZWFtLgorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHN1YnN0cmluZyAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RvcCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc3Vic3RyaW5nIChpbmNsdXNpdmUpLgorICAgICAqIEByZXR1cm5zIHtTdHJpbmd9CisgICAgICovCisgICAgc3Vic3RyaW5nOiBmdW5jdGlvbihzdGFydCwgc3RvcCkgeworICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnN1YnN0cihzdGFydCxzdG9wLXN0YXJ0KzEpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLgorICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBjdXJyZW50IGxpbmUgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSAoMS4ubnVtbGluZXMpLgorICAgICAqLworICAgIGdldExpbmU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5saW5lOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KKyAgICAgKiBSYW5nZXMgZnJvbSAwIHRvIChsZW5ndGggb2YgbGluZSAtIDEpLgorICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9CisgICAgICovCisgICAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2hhclBvc2l0aW9uSW5MaW5lOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IHdoZW4gcGVyZm9ybWluZyByZXdpbmRzLgorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsaW5lCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBzZXRMaW5lOiBmdW5jdGlvbihsaW5lKSB7CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgorICAgICAqIFJhbmdlcyBmcm9tIDAgdG8gKGxlbmd0aCBvZiBsaW5lIC0gMSkuCisgICAgICogQHBhcmFtIHtOdW1iZXJ9IHBvcworICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgc2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBmdW5jdGlvbihwb3MpIHsKKyAgICAgICAgdGhpcy5jaGFyUG9zaXRpb25JbkxpbmUgPSBwb3M7CisgICAgfSwKKworICAgIC8qKiBXaGVyZSBhcmUgeW91IGdldHRpbmcgc3ltYm9scyBmcm9tPyBOb3JtYWxseSwgaW1wbGVtZW50YXRpb25zIHdpbGwKKyAgICAgKiAgcGFzcyB0aGUgYnVjayBhbGwgdGhlIHdheSB0byB0aGUgbGV4ZXIgd2hvIGNhbiBhc2sgaXRzIGlucHV0IHN0cmVhbQorICAgICAqICBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKyAgICAgKi8KKyAgICBnZXRTb3VyY2VOYW1lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfSk7CisKKy8qKgorICogQWxpYXMgZm9yIHtAbGluayAjTEF9LgorICogQG1ldGhvZE9mIG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtLnByb3RvdHlwZQorICovCitvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbS5wcm90b3R5cGUuTFQgPSBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbS5wcm90b3R5cGUuTEE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9CYXNlUmVjb2duaXplci5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0Jhc2VSZWNvZ25pemVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiMzZjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9CYXNlUmVjb2duaXplci5qcwpAQCAtMCwwICsxLDk1NCBAQAorLyoqIEEgZ2VuZXJpYyByZWNvZ25pemVyIHRoYXQgY2FuIGhhbmRsZSByZWNvZ25pemVycyBnZW5lcmF0ZWQgZnJvbQorICogIGxleGVyLCBwYXJzZXIsIGFuZCB0cmVlIGdyYW1tYXJzLiAgVGhpcyBpcyBhbGwgdGhlIHBhcnNpbmcKKyAqICBzdXBwb3J0IGNvZGUgZXNzZW50aWFsbHk7IG1vc3Qgb2YgaXQgaXMgZXJyb3IgcmVjb3Zlcnkgc3R1ZmYgYW5kCisgKiAgYmFja3RyYWNraW5nLgorICoKKyAqICA8cD5UaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LiAgSW5zdGVhZCwgdXNlIG9uZSBvZiBpdHMKKyAqICBzdWJjbGFzc2VzLjwvcD4KKyAqCisgKiAgQGNsYXNzCisgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5SZWNvZ25pemVyU2hhcmVkU3RhdGV9IFtzdGF0ZV0gc3RhdGUgb2JqZWN0IHdpdGgKKyAqICAgICAgd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGlzIHJlY29nbml6ZXIuCisgKi8KK29yZy5hbnRsci5ydW50aW1lLkJhc2VSZWNvZ25pemVyID0gZnVuY3Rpb24oc3RhdGUpIHsKKyAgICAvKiogU3RhdGUgb2YgYSBsZXhlciwgcGFyc2VyLCBvciB0cmVlIHBhcnNlciBhcmUgY29sbGVjdGVkIGludG8gYSBzdGF0ZQorICAgICAqICBvYmplY3Qgc28gdGhlIHN0YXRlIGNhbiBiZSBzaGFyZWQuICBUaGlzIHNoYXJpbmcgaXMgbmVlZGVkIHRvCisgICAgICogIGhhdmUgb25lIGdyYW1tYXIgaW1wb3J0IG90aGVycyBhbmQgc2hhcmUgc2FtZSBlcnJvciB2YXJpYWJsZXMKKyAgICAgKiAgYW5kIG90aGVyIHN0YXRlIHZhcmlhYmxlcy4gIEl0J3MgYSBraW5kIG9mIGV4cGxpY2l0IG11bHRpcGxlCisgICAgICogIGluaGVyaXRhbmNlIHZpYSBkZWxlZ2F0aW9uIG9mIG1ldGhvZHMgYW5kIHNoYXJlZCBzdGF0ZS4KKyAgICAgKiAgQHR5cGUgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXplclNoYXJlZFN0YXRlCisgICAgICovCisgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IG5ldyBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKK307CisKK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3Qob3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIsIHsKKyAgICAvKioKKyAgICAgKiBAbWVtYmVyT2Ygb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIKKyAgICAgKiBAdHlwZSBOdW1iZXIKKyAgICAgKi8KKyAgICBNRU1PX1JVTEVfRkFJTEVEOiAtMiwKKworICAgIC8qKgorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CYXNlUmVjb2duaXplcgorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIE1FTU9fUlVMRV9VTktOT1dOOiAtMSwKKworICAgIC8qKgorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CYXNlUmVjb2duaXplcgorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIElOSVRJQUxfRk9MTE9XX1NUQUNLX1NJWkU6IDEwMCwKKworICAgIC8qKgorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CYXNlUmVjb2duaXplcgorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIE1FTU9fUlVMRV9GQUlMRURfSTogLTIsCisKKyAgICAvKioKKyAgICAgKiBAbWVtYmVyT2Ygb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIKKyAgICAgKiBAdHlwZSBOdW1iZXIKKyAgICAgKi8KKyAgICBERUZBVUxUX1RPS0VOX0NIQU5ORUw6IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRFRkFVTFRfQ0hBTk5FTCwKKworICAgIC8qKgorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CYXNlUmVjb2duaXplcgorICAgICAqIEB0eXBlIE51bWJlcgorICAgICAqLworICAgIEhJRERFTjogb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uSElEREVOX0NIQU5ORUwsCisKKyAgICAvKioKKyAgICAgKiBAbWVtYmVyT2Ygb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIKKyAgICAgKiBAdHlwZSBTdHJpbmcgCisgICAgICovCisgICAgTkVYVF9UT0tFTl9SVUxFX05BTUU6ICJuZXh0VG9rZW4iCit9KTsKKworb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIucHJvdG90eXBlID0geworICAgIC8qKiBSZXNldCB0aGUgcGFyc2VyJ3Mgc3RhdGUuICBTdWJjbGFzc2VzIG11c3QgcmV3aW5kcyB0aGUgaW5wdXQgc3RyZWFtICovCisgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaSwgbGVuOworCisgICAgICAgIC8vIHdhY2sgZXZlcnl0aGluZyByZWxhdGVkIHRvIGVycm9yIHJlY292ZXJ5CisgICAgICAgIGlmICghdGhpcy5zdGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBzaGFyZWQgc3RhdGUgd29yayB0byBkbworICAgICAgICB9CisgICAgICAgIHRoaXMuc3RhdGUuX2ZzcCA9IC0xOworICAgICAgICB0aGlzLnN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5zdGF0ZS5sYXN0RXJyb3JJbmRleCA9IC0xOworICAgICAgICB0aGlzLnN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICB0aGlzLnN0YXRlLnN5bnRheEVycm9ycyA9IDA7CisgICAgICAgIC8vIHdhY2sgZXZlcnl0aGluZyByZWxhdGVkIHRvIGJhY2t0cmFja2luZyBhbmQgbWVtb2l6YXRpb24KKyAgICAgICAgdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmcgPSAwOworICAgICAgICAvLyB3aXBlIGNhY2hlCisgICAgICAgIGlmICh0aGlzLnN0YXRlLnJ1bGVNZW1vKSB7CisgICAgICAgICAgICBmb3IgKGk9MCwgbGVuPXRoaXMuc3RhdGUucnVsZU1lbW8ubGVuZ3RoOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ydWxlTWVtb1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIE1hdGNoIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFnYWluc3QgdHR5cGUuICBBdHRlbXB0CisgICAgICogIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IgcmVjb3ZlcnkuICBJZgorICAgICAqICB0aGF0IGZhaWxzLCB0aHJvdyB7QGxpbmsgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqICA8cD5UbyB0dXJuIG9mZiBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIGVycm9yCisgICAgICogIHJlY292ZXJ5LCBvdmVycmlkZSB7QGxpbmsgI21pc21hdGNoUmVjb3Zlcn0gYW5kIGhhdmUgaXQgY2FsbAorICAgICAqICBwbGFpbiB7QGxpbmsgI21pc21hdGNofSwgd2hpY2ggZG9lcyBub3QgcmVjb3Zlci4gIFRoZW4gYW55IGVycm9yCisgICAgICogIGluIGEgcnVsZSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBhbmQgaW1tZWRpYXRlIGV4aXQgZnJvbQorICAgICAqICBydWxlLiAgUnVsZSB3b3VsZCByZWNvdmVyIGJ5IHJlc3luY2hyb25pemluZyB0byB0aGUgc2V0IG9mCisgICAgICogIHN5bWJvbHMgdGhhdCBjYW4gZm9sbG93IHJ1bGUgcmVmLjwvcD4KKyAgICAgKgorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbX0gaW5wdXQgaW5wdXQgc3RyZWFtIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICogIEBwYXJhbSB7TnVtYmVyfSB0dHlwZSAgaW5wdXQgdHlwZSB0byBtYXRjaC4KKyAgICAgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9IFtmb2xsb3ddIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZQorICAgICAqICAgICAgbWF0Y2hlZCB0b2tlbi4KKyAgICAgKiAgQHJldHVybnMge09iamVjdH0gdGhlIG1hdGNoZWQgc3ltYm9sCisgICAgICovCisgICAgbWF0Y2g6IGZ1bmN0aW9uKGlucHV0LCB0dHlwZSwgZm9sbG93KSB7CisgICAgICAgIHZhciBtYXRjaGVkU3ltYm9sID0gdGhpcy5nZXRDdXJyZW50SW5wdXRTeW1ib2woaW5wdXQpOworICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT09dHR5cGUgKSB7CisgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisgICAgICAgICAgICB0aGlzLnN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjAgKSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKyAgICAgICAgfQorICAgICAgICBtYXRjaGVkU3ltYm9sID0gdGhpcy5yZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbihpbnB1dCwgdHR5cGUsIGZvbGxvdyk7CisgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBNYXRjaCBhbnkgdG9rZW4uCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5JbnRTdHJlYW19IGlucHV0IGlucHV0IHN0cmVhbSB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAqLworICAgIG1hdGNoQW55OiBmdW5jdGlvbihpbnB1dCkgeworICAgICAgICB0aGlzLnN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5zdGF0ZS5mYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgaW5wdXQuY29uc3VtZSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgZm9sbG93aW5nIHRva2VuIChMQSgyKSkgdGhlIHVud2FudGVkIHR5cGUgKHR0eXBlKT8KKyAgICAgKiBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbX0gaW5wdXQgaW5wdXQgc3RyZWFtIHRvIG1hdGNoIGFnYWluc3QuCisgICAgICogQHBhcmFtIHtOdW1iZXJ9IHR0eXBlIHRoZSB1bmRlc2lyZWQgdG9rZW4gdHlwZS4KKyAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZm9sbG93aW5nIHRva2VuIGlzIHRoZQorICAgICAqICAgICAgdW53YW50ZWQgdHlwZS4KKyAgICAgKi8KKyAgICBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjogZnVuY3Rpb24oaW5wdXQsIHR0eXBlKSB7CisgICAgICAgIHJldHVybiBpbnB1dC5MQSgyKT09PXR0eXBlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBzdHJlYW0gYXBwZWFyIHRvIGJlIG1pc3NpbmcgYSBzaW5nbGUgdG9rZW4/CisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5JbnRTdHJlYW19IGlucHV0IGlucHV0IHN0cmVhbSB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fSBbZm9sbG93XSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuIGZvbGxvdyB0aGUKKyAgICAgKiAgICAgIG1hdGNoZWQgdG9rZW4uCisgICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgaXQgYXBwZWFycyB0aGF0IHRoZSBzdHJlYW0gaXMKKyAgICAgKiAgICAgIG1pc3NpbmcgYSBzaW5nbGUgdG9rZW4uCisgICAgICovCisgICAgbWlzbWF0Y2hJc01pc3NpbmdUb2tlbjogZnVuY3Rpb24oaW5wdXQsIGZvbGxvdykgeworICAgICAgICBpZiAoICFmb2xsb3cgKSB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb2xsb3c7IHdlIGNhbiBvbmx5IGNvbnN1bWUKKyAgICAgICAgICAgIC8vIGEgc2luZ2xlIHRva2VuIGFuZCBob3BlIGZvciB0aGUgYmVzdAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGNvbXB1dGUgd2hhdCBjYW4gZm9sbG93IHRoaXMgZ3JhbW1hciBlbGVtZW50IHJlZmVyZW5jZQorICAgICAgICBpZiAoIGZvbGxvdy5tZW1iZXIob3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9SX1RPS0VOX1RZUEUpICkgeworICAgICAgICAgICAgdmFyIHZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlID0gdGhpcy5jb21wdXRlQ29udGV4dFNlbnNpdGl2ZVJ1bGVGT0xMT1coKTsKKyAgICAgICAgICAgIGZvbGxvdyA9IGZvbGxvdy5vcih0aGlzLnZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlKTsKKyAgICAgICAgICAgIGlmICggdGhpcy5zdGF0ZS5fZnNwPj0wICkgeyAvLyByZW1vdmUgRU9SIGlmIHdlJ3JlIG5vdCB0aGUgc3RhcnQgc3ltYm9sCisgICAgICAgICAgICAgICAgZm9sbG93LnJlbW92ZShvcmcuYW50bHIucnVudGltZS5Ub2tlbi5FT1JfVE9LRU5fVFlQRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgY3VycmVudCB0b2tlbiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBjb3VsZCBjb21lIGFmdGVyIHNldAorICAgICAgICAvLyB0aGVuIHdlIGtub3cgd2UncmUgbWlzc2luZyBhIHRva2VuOyBlcnJvciByZWNvdmVyeSBpcyBmcmVlIHRvCisgICAgICAgIC8vICJpbnNlcnQiIHRoZSBtaXNzaW5nIHRva2VuCisKKyAgICAgICAgLy8gQml0U2V0IGNhbm5vdCBoYW5kbGUgbmVnYXRpdmUgbnVtYmVycyBsaWtlIC0xIChFT0YpIHNvIEkgbGVhdmUgRU9SCisgICAgICAgIC8vIGluIGZvbGxvdyBzZXQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmFsbCBvZiB0aGUgc3RhcnQgc3ltYm9sIGlzCisgICAgICAgIC8vIGluIHRoZSBzZXQgKEVPRiBjYW4gZm9sbG93KS4KKyAgICAgICAgaWYgKCBmb2xsb3cubWVtYmVyKGlucHV0LkxBKDEpKSB8fAorICAgICAgICAgICAgIGZvbGxvdy5tZW1iZXIob3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9SX1RPS0VOX1RZUEUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0sCisKKyAgICAvKiogRmFjdG9yIG91dCB3aGF0IHRvIGRvIHVwb24gdG9rZW4gbWlzbWF0Y2ggc28gdHJlZSBwYXJzZXJzIGNhbiBiZWhhdmUKKyAgICAgKiAgZGlmZmVyZW50bHkuICBPdmVycmlkZSBhbmQgY2FsbCB7QGxpbmsgI21pc21hdGNoUmVjb3Zlcn0KKyAgICAgKiAgdG8gZ2V0IHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gYW5kIGRlbGV0aW9uLgorICAgICAqCisgICAgICogIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuSW50U3RyZWFtfSBpbnB1dCBpbnB1dCBzdHJlYW0gdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IHR0eXBlICBpbnB1dCB0eXBlIHRvIG1hdGNoLgorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gW2ZvbGxvd10gc2V0IG9mIHRva2VucyB0aGF0IGNhbiBmb2xsb3cgdGhlCisgICAgICogICAgICBtYXRjaGVkIHRva2VuLgorICAgICAqLworICAgIG1pc21hdGNoOiBmdW5jdGlvbihpbnB1dCwgdHR5cGUsIGZvbGxvdykgeworICAgICAgICBpZiAoIHRoaXMubWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4oaW5wdXQsIHR0eXBlKSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYW50bHIucnVudGltZS5VbndhbnRlZFRva2VuRXhjZXB0aW9uKHR0eXBlLCBpbnB1dCk7CisgICAgICAgIH0gZWxzZSBpZiAoIHRoaXMubWlzbWF0Y2hJc01pc3NpbmdUb2tlbihpbnB1dCwgZm9sbG93KSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYW50bHIucnVudGltZS5NaXNzaW5nVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0LCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHR0eXBlLCBpbnB1dCk7CisgICAgfSwKKworICAgIC8qKiBSZXBvcnQgYSByZWNvZ25pdGlvbiBwcm9ibGVtLgorICAgICAqCisgICAgICogIDxwPlRoaXMgbWV0aG9kIHNldHMgZXJyb3JSZWNvdmVyeSB0byBpbmRpY2F0ZSB0aGUgcGFyc2VyIGlzIHJlY292ZXJpbmcKKyAgICAgKiAgbm90IHBhcnNpbmcuICBPbmNlIGluIHJlY292ZXJ5IG1vZGUsIG5vIGVycm9ycyBhcmUgZ2VuZXJhdGVkLgorICAgICAqICBUbyBnZXQgb3V0IG9mIHJlY292ZXJ5IG1vZGUsIHRoZSBwYXJzZXIgbXVzdCBzdWNjZXNzZnVsbHkgbWF0Y2gKKyAgICAgKiAgYSB0b2tlbiAoYWZ0ZXIgYSByZXN5bmMpLiAgU28gaXQgd2lsbCBnbzo8L3A+CisgICAgICogIDxvbD4KKyAgICAgKiAgICAgIDxsaT5lcnJvciBvY2N1cnM8L2xpPgorICAgICAqICAgICAgPGxpPmVudGVyIHJlY292ZXJ5IG1vZGUsIHJlcG9ydCBlcnJvcjwvbGk+CisgICAgICogICAgICA8bGk+Y29uc3VtZSB1bnRpbCB0b2tlbiBmb3VuZCBpbiByZXN5bmNoIHNldDwvbGk+CisgICAgICogICAgICA8bGk+dHJ5IHRvIHJlc3VtZSBwYXJzaW5nPC9saT4KKyAgICAgKiAgICAgIDxsaT5uZXh0IG1hdGNoKCkgd2lsbCByZXNldCBlcnJvclJlY292ZXJ5IG1vZGU8L2xpPgorICAgICAqICA8L29sPgorICAgICAqCisgICAgICogIDxwPklmIHlvdSBvdmVycmlkZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGlzLnN0YXRlLnN5bnRheEVycm9ycyBpZiB5b3UKKyAgICAgKiAgY2FyZSBhYm91dCB0aGF0LjwvcD4KKyAgICAgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbn0gZSB0aGUgZXJyb3IgdG8gYmUgcmVwb3J0ZWQuCisgICAgICovCisgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBhbmQgaGF2ZSBub3QgbWF0Y2hlZCBhIHRva2VuCisgICAgICAgIC8vIHlldCBzdWNjZXNzZnVsbHksIGRvbid0IHJlcG9ydCBhbnkgZXJyb3JzLgorICAgICAgICBpZiAoIHRoaXMuc3RhdGUuZXJyb3JSZWNvdmVyeSApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnN0YXRlLnN5bnRheEVycm9ycysrOworICAgICAgICB0aGlzLnN0YXRlLmVycm9yUmVjb3ZlcnkgPSB0cnVlOworCisgICAgICAgIHRoaXMuZGlzcGxheVJlY29nbml0aW9uRXJyb3IodGhpcy5nZXRUb2tlbk5hbWVzKCksIGUpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBBc3NlbWJsZSByZWNvZ25pdGlvbiBlcnJvciBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IHRva2VuTmFtZXMgYXJyYXkgb2YgdG9rZW4gbmFtZXMgKHN0cmluZ3MpLgorICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb259IGUgdGhlIGVycm9yIHRvIGJlIHJlcG9ydGVkLgorICAgICAqLworICAgIGRpc3BsYXlSZWNvZ25pdGlvbkVycm9yOiBmdW5jdGlvbih0b2tlbk5hbWVzLCBlKSB7CisgICAgICAgIHZhciBoZHIgPSB0aGlzLmdldEVycm9ySGVhZGVyKGUpLAorICAgICAgICAgICAgbXNnID0gdGhpcy5nZXRFcnJvck1lc3NhZ2UoZSwgdG9rZW5OYW1lcyk7CisgICAgICAgIHRoaXMuZW1pdEVycm9yTWVzc2FnZShoZHIrIiAiK21zZyk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBlcnJvciBoZWFkZXIgbWVzc2FnZS4gIEZvcm1hdCBpcyA8cT5saW5lCisgICAgICogbGluZU51bWJlcjpwb3NpdGlvbkluTGluZTwvcT4uCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbn0gZSB0aGUgZXJyb3IgdG8gYmUgcmVwb3J0ZWQuCisgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIGVycm9yIGhlYWRlci4KKyAgICAgKi8KKyAgICBnZXRFcnJvckhlYWRlcjogZnVuY3Rpb24oZSkgeworICAgICAgICAvKiBoYW5kbGUgbnVsbCBpbnB1dCAqLworICAgICAgICBpZiAoIW9yZy5hbnRsci5sYW5nLmlzTnVtYmVyKGUubGluZSkpIHsKKyAgICAgICAgICAgIGUubGluZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJsaW5lICIrZS5saW5lKyI6IitlLmNoYXJQb3NpdGlvbkluTGluZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHdoZXJlIGVycm9yIG1lc3NhZ2VzIGdvLgorICAgICAqIERlZmF1bHRzIHRvICJhbGVydCItaW5nIHRoZSBlcnJvciBpbiBicm93c2VycyBhbmQgInByaW50Ii1pbmcgdGhlIGVycm9yCisgICAgICogaW4gb3RoZXIgZW52aXJvbm1lbnRzIChlLmcuIFJoaW5vLCBTcGlkZXJNb25rZXkpLgorICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIGVtaXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKG1zZykgeworICAgICAgICBpZiAodHlwZW9mKHdpbmRvdykgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmFsZXJ0KSB7CisgICAgICAgICAgICBhbGVydChtc2cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQobXNnKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKiogV2hhdCBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSB2YXJpb3VzCisgICAgICogIGV4Y2VwdGlvbiB0eXBlcz8KKyAgICAgKgorICAgICAqICA8cD5Ob3QgdmVyeSBvYmplY3Qtb3JpZW50ZWQgY29kZSwgYnV0IEkgbGlrZSBoYXZpbmcgYWxsIGVycm9yIG1lc3NhZ2UKKyAgICAgKiAgZ2VuZXJhdGlvbiB3aXRoaW4gb25lIG1ldGhvZCByYXRoZXIgdGhhbiBzcHJlYWQgYW1vbmcgYWxsIG9mIHRoZQorICAgICAqICBleGNlcHRpb24gY2xhc3Nlcy4gVGhpcyBhbHNvIG1ha2VzIGl0IG11Y2ggZWFzaWVyIGZvciB0aGUgZXhjZXB0aW9uCisgICAgICogIGhhbmRsaW5nIGJlY2F1c2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGRvIG5vdCBoYXZlIHRvIGhhdmUgcG9pbnRlcnMgYmFjaworICAgICAqICB0byB0aGlzIG9iamVjdCB0byBhY2Nlc3MgdXRpbGl0eSByb3V0aW5lcyBhbmQgc28gb24uIEFsc28sIGNoYW5naW5nCisgICAgICogIHRoZSBtZXNzYWdlIGZvciBhbiBleGNlcHRpb24gdHlwZSB3b3VsZCBiZSBkaWZmaWN1bHQgYmVjYXVzZSB5b3UKKyAgICAgKiAgd291bGQgaGF2ZSB0byBiZSBzdWJjbGFzc2luZyBleGNlcHRpb25zLCBidXQgdGhlbiBzb21laG93IGdldCBBTlRMUgorICAgICAqICB0byBtYWtlIHRob3NlIGtpbmRzIG9mIGV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuPC9wPgorICAgICAqCisgICAgICogIDxwPkZvciBncmFtbWFyIGRlYnVnZ2luZywgeW91IHdpbGwgd2FudCB0byBvdmVycmlkZSB0aGlzIHRvIGFkZAorICAgICAqICBtb3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YWNrIGZyYW1lIGFuZCBubyB2aWFibGUgYWx0cy48L3A+CisgICAgICoKKyAgICAgKiAgPHA+T3ZlcnJpZGUgdGhpcyB0byBjaGFuZ2UgdGhlIG1lc3NhZ2UgZ2VuZXJhdGVkIGZvciBvbmUgb3IgbW9yZQorICAgICAqICBleGNlcHRpb24gdHlwZXMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHtBcnJheX0gdG9rZW5OYW1lcyBhcnJheSBvZiB0b2tlbiBuYW1lcyAoc3RyaW5ncykuCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbn0gZSB0aGUgZXJyb3IgdG8gYmUgcmVwb3J0ZWQuCisgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZW1pdHRlZC4KKyAgICAgKi8KKyAgICBnZXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKGUsIHRva2VuTmFtZXMpIHsKKyAgICAgICAgdmFyIG1zZyA9IChlICYmIGUuZ2V0TWVzc2FnZSkgPyBlLmdldE1lc3NhZ2UoKSA6IG51bGwsCisgICAgICAgICAgICBtdGUsCisgICAgICAgICAgICB0b2tlbk5hbWU7CisgICAgICAgIGlmICggZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlVud2FudGVkVG9rZW5FeGNlcHRpb24gKSB7CisgICAgICAgICAgICB2YXIgdXRlID0gZTsKKyAgICAgICAgICAgIHRva2VuTmFtZT0iPHVua25vd24+IjsKKyAgICAgICAgICAgIGlmICggdXRlLmV4cGVjdGluZz09IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRiApIHsKKyAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRU9GIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gdG9rZW5OYW1lc1t1dGUuZXhwZWN0aW5nXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZyA9ICJleHRyYW5lb3VzIGlucHV0ICIrdGhpcy5nZXRUb2tlbkVycm9yRGlzcGxheSh1dGUuZ2V0VW5leHBlY3RlZFRva2VuKCkpKworICAgICAgICAgICAgICAgICIgZXhwZWN0aW5nICIrdG9rZW5OYW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzc2luZ1Rva2VuRXhjZXB0aW9uICkgeworICAgICAgICAgICAgbXRlID0gZTsKKyAgICAgICAgICAgIHRva2VuTmFtZT0iPHVua25vd24+IjsKKyAgICAgICAgICAgIGlmICggbXRlLmV4cGVjdGluZz09IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRiApIHsKKyAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRU9GIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gdG9rZW5OYW1lc1ttdGUuZXhwZWN0aW5nXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZyA9ICJtaXNzaW5nICIrdG9rZW5OYW1lKyIgYXQgIit0aGlzLmdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICkgeworICAgICAgICAgICAgbXRlID0gZTsKKyAgICAgICAgICAgIHRva2VuTmFtZT0iPHVua25vd24+IjsKKyAgICAgICAgICAgIGlmICggbXRlLmV4cGVjdGluZz09IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRiApIHsKKyAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRU9GIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9IHRva2VuTmFtZXNbbXRlLmV4cGVjdGluZ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBpbnB1dCAiK3RoaXMuZ2V0VG9rZW5FcnJvckRpc3BsYXkoZS50b2tlbikrCisgICAgICAgICAgICAgICAgIiBleHBlY3RpbmcgIit0b2tlbk5hbWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1zZyA9ICJubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgIit0aGlzLmdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuRWFybHlFeGl0RXhjZXB0aW9uICkgeworICAgICAgICAgICAgbXNnID0gInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgaW5wdXQgIisKKyAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGlucHV0ICIrdGhpcy5nZXRUb2tlbkVycm9yRGlzcGxheShlLnRva2VuKSsKKyAgICAgICAgICAgICAgICAiIGV4cGVjdGluZyBzZXQgIitlLmV4cGVjdGluZzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gKSB7CisgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBpbnB1dCAiK3RoaXMuZ2V0VG9rZW5FcnJvckRpc3BsYXkoZS50b2tlbikrCisgICAgICAgICAgICAgICAgIiBleHBlY3Rpbmcgc2V0ICIrZS5leHBlY3Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gKSB7CisgICAgICAgICAgICBtc2cgPSAicnVsZSAiK2UucnVsZU5hbWUrIiBmYWlsZWQgcHJlZGljYXRlOiB7IisKKyAgICAgICAgICAgICAgICBlLnByZWRpY2F0ZVRleHQrIn0/IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXNnOworICAgIH0sCisKKyAgICAvKiogPHA+R2V0IG51bWJlciBvZiByZWNvZ25pdGlvbiBlcnJvcnMgKGxleGVyLCBwYXJzZXIsIHRyZWUgcGFyc2VyKS4gIEVhY2gKKyAgICAgKiAgcmVjb2duaXplciB0cmFja3MgaXRzIG93biBudW1iZXIuICBTbyBwYXJzZXIgYW5kIGxleGVyIGVhY2ggaGF2ZQorICAgICAqICBzZXBhcmF0ZSBjb3VudC4gIERvZXMgbm90IGNvdW50IHRoZSBzcHVyaW91cyBlcnJvcnMgZm91bmQgYmV0d2VlbgorICAgICAqICBhbiBlcnJvciBhbmQgbmV4dCB2YWxpZCB0b2tlbiBtYXRjaC48L3A+CisgICAgICoKKyAgICAgKiAgPHA+U2VlIGFsc28ge0BsaW5rICNyZXBvcnRFcnJvcn0oKQorICAgICAqICBAcmV0dXJucyB7TnVtYmVyfSBudW1iZXIgb2Ygc3ludGF4IGVycm9ycyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIGdldE51bWJlck9mU3ludGF4RXJyb3JzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuc3ludGF4RXJyb3JzOworICAgIH0sCisKKyAgICAvKiogSG93IHNob3VsZCBhIHRva2VuIGJlIGRpc3BsYXllZCBpbiBhbiBlcnJvciBtZXNzYWdlPyBUaGUgZGVmYXVsdAorICAgICAqICBpcyB0byBkaXNwbGF5IGp1c3QgdGhlIHRleHQsIGJ1dCBkdXJpbmcgZGV2ZWxvcG1lbnQgeW91IG1pZ2h0CisgICAgICogIHdhbnQgdG8gaGF2ZSBhIGxvdCBvZiBpbmZvcm1hdGlvbiBzcGl0IG91dC4gIE92ZXJyaWRlIGluIHRoYXQgY2FzZQorICAgICAqICB0byB1c2UgdC50b1N0cmluZygpICh3aGljaCwgZm9yIENvbW1vblRva2VuLCBkdW1wcyBldmVyeXRoaW5nIGFib3V0CisgICAgICogIHRoZSB0b2tlbikuCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5Ub2tlbn0gdCB0b2tlbiB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRva2VuCisgICAgICovCisgICAgZ2V0VG9rZW5FcnJvckRpc3BsYXk6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgdmFyIHMgPSB0LmdldFRleHQoKTsKKyAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZShzKSApIHsKKyAgICAgICAgICAgIGlmICggdC5nZXRUeXBlKCk9PW9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRiApIHsKKyAgICAgICAgICAgICAgICBzID0gIjxFT0Y+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHMgPSAiPCIrdC5nZXRUeXBlKCkrIj4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHMgPSBzLnJlcGxhY2UoL1xuL2csIlxcbiIpOworICAgICAgICBzID0gcy5yZXBsYWNlKC9cci9nLCJcXHIiKTsKKyAgICAgICAgcyA9IHMucmVwbGFjZSgvXHQvZywiXFx0Iik7CisgICAgICAgIHJldHVybiAiJyIrcysiJyI7CisgICAgfSwKKworICAgIC8qKiBSZWNvdmVyIGZyb20gYW4gZXJyb3IgZm91bmQgb24gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgaXMKKyAgICAgKiAgZm9yIE5vVmlhYmxlQWx0IGFuZCBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zLiAgSWYgeW91IGVuYWJsZQorICAgICAqICBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiwgdGhpcyB3aWxsIHVzdWFsbHkgbm90CisgICAgICogIGhhbmRsZSBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zIGJ1dCB0aGVyZSBjb3VsZCBiZSBhIG1pc21hdGNoZWQKKyAgICAgKiAgdG9rZW4gdGhhdCB0aGUgbWF0Y2goKSByb3V0aW5lIGNvdWxkIG5vdCByZWNvdmVyIGZyb20uCisgICAgICogIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuSW50U3RyZWFtfSBpbnB1dCB0aGUgaW50cHV0IHN0cmVhbQorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLlJlY29nbnRpb25FeGNlcHRpb259IHRoZSBlcnJvciBmb3VuZCBvbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgcmVjb3ZlcjogZnVuY3Rpb24oaW5wdXQsIHJlKSB7CisgICAgICAgIGlmICggdGhpcy5zdGF0ZS5sYXN0RXJyb3JJbmRleD09aW5wdXQuaW5kZXgoKSApIHsKKyAgICAgICAgICAgIC8vIHVoIG9oLCBhbm90aGVyIGVycm9yIGF0IHNhbWUgdG9rZW4gaW5kZXg7IG11c3QgYmUgYSBjYXNlCisgICAgICAgICAgICAvLyB3aGVyZSBMVCgxKSBpcyBpbiB0aGUgcmVjb3ZlcnkgdG9rZW4gc2V0IHNvIG5vdGhpbmcgaXMKKyAgICAgICAgICAgIC8vIGNvbnN1bWVkOyBjb25zdW1lIGEgc2luZ2xlIHRva2VuIHNvIGF0IGxlYXN0IHRvIHByZXZlbnQKKyAgICAgICAgICAgIC8vIGFuIGluZmluaXRlIGxvb3A7IHRoaXMgaXMgYSBmYWlsc2FmZS4KKyAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnN0YXRlLmxhc3RFcnJvckluZGV4ID0gaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgdmFyIGZvbGxvd1NldCA9IHRoaXMuY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQoKTsKKyAgICAgICAgdGhpcy5iZWdpblJlc3luYygpOworICAgICAgICB0aGlzLmNvbnN1bWVVbnRpbChpbnB1dCwgZm9sbG93U2V0KTsKKyAgICAgICAgdGhpcy5lbmRSZXN5bmMoKTsKKyAgICB9LAorCisgICAgLyoqIEEgaG9vayB0byBsaXN0ZW4gaW4gb24gdGhlIHRva2VuIGNvbnN1bXB0aW9uIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAgICAgKi8KKyAgICBiZWdpblJlc3luYzogZnVuY3Rpb24oKSB7CisgICAgfSwKKworICAgIC8qKiBBIGhvb2sgdG8gbGlzdGVuIGluIG9uIHRoZSB0b2tlbiBjb25zdW1wdGlvbiBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuCisgICAgICovCisgICAgZW5kUmVzeW5jOiBmdW5jdGlvbigpIHsKKyAgICB9LAorCisgICAgLyoqIENvbXB1dGUgdGhlIGVycm9yIHJlY292ZXJ5IHNldCBmb3IgdGhlIGN1cnJlbnQgcnVsZS4KKyAgICAgKiAgPHA+RHVyaW5nIHJ1bGUgaW52b2NhdGlvbiwgdGhlIHBhcnNlciBwdXNoZXMgdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4KKyAgICAgKiAgZm9sbG93IHRoYXQgcnVsZSByZWZlcmVuY2Ugb24gdGhlIHN0YWNrOyB0aGlzIGFtb3VudHMgdG8KKyAgICAgKiAgY29tcHV0aW5nIEZJUlNUIG9mIHdoYXQgZm9sbG93cyB0aGUgcnVsZSByZWZlcmVuY2UgaW4gdGhlCisgICAgICogIGVuY2xvc2luZyBydWxlLiBUaGlzIGxvY2FsIGZvbGxvdyBzZXQgb25seSBpbmNsdWRlcyB0b2tlbnMKKyAgICAgKiAgZnJvbSB3aXRoaW4gdGhlIHJ1bGU7IGkuZS4sIHRoZSBGSVJTVCBjb21wdXRhdGlvbiBkb25lIGJ5CisgICAgICogIEFOVExSIHN0b3BzIGF0IHRoZSBlbmQgb2YgYSBydWxlLjwvcD4KKyAgICAgKgorICAgICAqICA8cD5FWEFNUExFPC9wPgorICAgICAqCisgICAgICogIDxwPldoZW4geW91IGZpbmQgYSAibm8gdmlhYmxlIGFsdCBleGNlcHRpb24iLCB0aGUgaW5wdXQgaXMgbm90CisgICAgICogIGNvbnNpc3RlbnQgd2l0aCBhbnkgb2YgdGhlIGFsdGVybmF0aXZlcyBmb3IgcnVsZSByLiAgVGhlIGJlc3QKKyAgICAgKiAgdGhpbmcgdG8gZG8gaXMgdG8gY29uc3VtZSB0b2tlbnMgdW50aWwgeW91IHNlZSBzb21ldGhpbmcgdGhhdAorICAgICAqICBjYW4gbGVnYWxseSBmb2xsb3cgYSBjYWxsIHRvIHIgKm9yKiBhbnkgcnVsZSB0aGF0IGNhbGxlZCByLgorICAgICAqICBZb3UgZG9uJ3Qgd2FudCB0aGUgZXhhY3Qgc2V0IG9mIHZpYWJsZSBuZXh0IHRva2VucyBiZWNhdXNlIHRoZQorICAgICAqICBpbnB1dCBtaWdodCBqdXN0IGJlIG1pc3NpbmcgYSB0b2tlbi0teW91IG1pZ2h0IGNvbnN1bWUgdGhlCisgICAgICogIHJlc3Qgb2YgdGhlIGlucHV0IGxvb2tpbmcgZm9yIG9uZSBvZiB0aGUgbWlzc2luZyB0b2tlbnMuPC9wPgorICAgICAqCisgICAgICogIDxwPkNvbnNpZGVyIGdyYW1tYXI6PC9wPgorICAgICAqICA8Y29kZT48cHJlPgorICAgICAqICBhIDogJ1snIGIgJ10nCisgICAgICogICAgfCAnKCcgYiAnKScKKyAgICAgKiAgICA7CisgICAgICogIGIgOiBjICdeJyBJTlQgOworICAgICAqICBjIDogSUQKKyAgICAgKiAgICB8IElOVAorICAgICAqICAgIDsKKyAgICAgKiAgPC9wcmU+PC9jb2RlPgorICAgICAqCisgICAgICogIDxwPkF0IGVhY2ggcnVsZSBpbnZvY2F0aW9uLCB0aGUgc2V0IG9mIHRva2VucyB0aGF0IGNvdWxkIGZvbGxvdworICAgICAqICB0aGF0IHJ1bGUgaXMgcHVzaGVkIG9uIGEgc3RhY2suICBIZXJlIGFyZSB0aGUgdmFyaW91cyAibG9jYWwiCisgICAgICogIGZvbGxvdyBzZXRzOjwvcD4KKyAgICAgKgorICAgICAqICA8Y29kZT48cHJlPgorICAgICAqICBGT0xMT1coYjFfaW5fYSkgPSBGSVJTVCgnXScpID0gJ10nCisgICAgICogIEZPTExPVyhiMl9pbl9hKSA9IEZJUlNUKCcpJykgPSAnKScKKyAgICAgKiAgRk9MTE9XKGNfaW5fYikgPSBGSVJTVCgnXicpID0gJ14nCisgICAgICogIDwvcHJlPjwvY29kZT4KKyAgICAgKgorICAgICAqICA8cD5VcG9uIGVycm9uZW91cyBpbnB1dCAiW10iLCB0aGUgY2FsbCBjaGFpbiBpczwvcD4KKyAgICAgKgorICAgICAqICA8Y29kZT5hIC0+IGIgLT4gYzwvY29kZT4KKyAgICAgKgorICAgICAqICA8cD5hbmQsIGhlbmNlLCB0aGUgZm9sbG93IGNvbnRleHQgc3RhY2sgaXM6PC9wPgorICAgICAqCisgICAgICogIDxjb2RlPjxwcmU+CisgICAgICogIGRlcHRoICBsb2NhbCBmb2xsb3cgc2V0ICAgICBhZnRlciBjYWxsIHRvIHJ1bGUKKyAgICAgKiAgICAwICAgICAgICAgPEVPRj4gICAgICAgICAgICAgICAgICAgIGEgKGZyb20gbWFpbigpKQorICAgICAqICAgIDEgICAgICAgICAgJ10nICAgICAgICAgICAgICAgICAgICAgYgorICAgICAqICAgIDMgICAgICAgICAgJ14nICAgICAgICAgICAgICAgICAgICAgYworICAgICAqICA8L3ByZT48L2NvZGU+CisgICAgICoKKyAgICAgKiAgPHA+Tm90aWNlIHRoYXQgJyknIGlzIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSBiIHdvdWxkIGhhdmUgdG8gaGF2ZQorICAgICAqICBiZWVuIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IGNvbnRleHQgaW4gcnVsZSBhIGZvciAnKScgdG8gYmUKKyAgICAgKiAgaW5jbHVkZWQuPC9wPgorICAgICAqCisgICAgICogIDxwPkZvciBlcnJvciByZWNvdmVyeSwgd2UgY2Fubm90IGNvbnNpZGVyIEZPTExPVyhjKQorICAgICAqICAoY29udGV4dC1zZW5zaXRpdmUgb3Igb3RoZXJ3aXNlKS4gIFdlIG5lZWQgdGhlIGNvbWJpbmVkIHNldCBvZgorICAgICAqICBhbGwgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldHMtLXRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0CisgICAgICogIGNvdWxkIGZvbGxvdyBhbnkgcmVmZXJlbmNlIGluIHRoZSBjYWxsIGNoYWluLiAgV2UgbmVlZCB0bworICAgICAqICByZXN5bmMgdG8gb25lIG9mIHRob3NlIHRva2Vucy4gIE5vdGUgdGhhdCBGT0xMT1coYyk9J14nIGFuZCBpZgorICAgICAqICB3ZSByZXN5bmMnZCB0byB0aGF0IHRva2VuLCB3ZSdkIGNvbnN1bWUgdW50aWwgRU9GLiAgV2UgbmVlZCB0bworICAgICAqICBzeW5jIHRvIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPV3MgZm9yIGEsIGIsIGFuZCBjOiB7J10nLCdeJ30uCisgICAgICogIEluIHRoaXMgY2FzZSwgZm9yIGlucHV0ICJbXSIsIExBKDEpIGlzIGluIHRoaXMgc2V0IHNvIHdlIHdvdWxkCisgICAgICogIG5vdCBjb25zdW1lIGFueXRoaW5nIGFuZCBhZnRlciBwcmludGluZyBhbiBlcnJvciBydWxlIGMgd291bGQKKyAgICAgKiAgcmV0dXJuIG5vcm1hbGx5LiAgSXQgd291bGQgbm90IGZpbmQgdGhlIHJlcXVpcmVkICdeJyB0aG91Z2guCisgICAgICogIEF0IHRoaXMgcG9pbnQsIGl0IGdldHMgYSBtaXNtYXRjaGVkIHRva2VuIGVycm9yIGFuZCB0aHJvd3MgYW4KKyAgICAgKiAgZXhjZXB0aW9uIChzaW5jZSBMQSgxKSBpcyBub3QgaW4gdGhlIHZpYWJsZSBmb2xsb3dpbmcgdG9rZW4KKyAgICAgKiAgc2V0KS4gIFRoZSBydWxlIGV4Y2VwdGlvbiBoYW5kbGVyIHRyaWVzIHRvIHJlY292ZXIsIGJ1dCBmaW5kcworICAgICAqICB0aGUgc2FtZSByZWNvdmVyeSBzZXQgYW5kIGRvZXNuJ3QgY29uc3VtZSBhbnl0aGluZy4gIFJ1bGUgYgorICAgICAqICBleGl0cyBub3JtYWxseSByZXR1cm5pbmcgdG8gcnVsZSBhLiAgTm93IGl0IGZpbmRzIHRoZSAnXScgKGFuZAorICAgICAqICB3aXRoIHRoZSBzdWNjZXNzZnVsIG1hdGNoIGV4aXRzIGVycm9yUmVjb3ZlcnkgbW9kZSkuPC9wPgorICAgICAqCisgICAgICogIDxwPlNvLCB5b3UgY25hIHNlZSB0aGF0IHRoZSBwYXJzZXIgd2Fsa3MgdXAgY2FsbCBjaGFpbiBsb29raW5nCisgICAgICogIGZvciB0aGUgdG9rZW4gdGhhdCB3YXMgYSBtZW1iZXIgb2YgdGhlIHJlY292ZXJ5IHNldC48L3A+CisgICAgICoKKyAgICAgKiAgPHA+RXJyb3JzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGVycm9yUmVjb3ZlcnkgbW9kZS48L3A+CisgICAgICoKKyAgICAgKiAgPHA+QU5UTFIncyBlcnJvciByZWNvdmVyeSBtZWNoYW5pc20gaXMgYmFzZWQgdXBvbiBvcmlnaW5hbCBpZGVhczo8L3A+CisgICAgICoKKyAgICAgKiAgPHA+IkFsZ29yaXRobXMgKyBEYXRhIFN0cnVjdHVyZXMgPSBQcm9ncmFtcyIgYnkgTmlrbGF1cyBXaXJ0aDwvcD4KKyAgICAgKgorICAgICAqICA8cD5hbmQ8L3A+CisgICAgICoKKyAgICAgKiAgPHA+IkEgbm90ZSBvbiBlcnJvciByZWNvdmVyeSBpbiByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXJzIjoKKyAgICAgKiAgaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9pZD05NDc5MDIuOTQ3OTA1PC9wPgorICAgICAqCisgICAgICogIDxwPkxhdGVyLCBKb3NlZiBHcm9zY2ggaGFkIHNvbWUgZ29vZCBpZGVhczo8L3A+CisgICAgICoKKyAgICAgKiAgPHA+IkVmZmljaWVudCBhbmQgQ29tZm9ydGFibGUgRXJyb3IgUmVjb3ZlcnkgaW4gUmVjdXJzaXZlIERlc2NlbnQKKyAgICAgKiAgUGFyc2VycyI6CisgICAgICogIGZ0cDovL3d3dy5jb2NvbGFiLmNvbS9wcm9kdWN0cy9jb2NrdGFpbC9kb2NhNC5wcy9lbGwucHMuemlwPC9wPgorICAgICAqCisgICAgICogIDxwPkxpa2UgR3Jvc2NoIEkgaW1wbGVtZW50ZWQgbG9jYWwgRk9MTE9XIHNldHMgdGhhdCBhcmUgY29tYmluZWQKKyAgICAgKiAgYXQgcnVuLXRpbWUgdXBvbiBlcnJvciB0byBhdm9pZCBvdmVyaGVhZCBkdXJpbmcgcGFyc2luZy48L3A+CisgICAgICogIEByZXR1cm5zIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9CisgICAgICovCisgICAgY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21iaW5lRm9sbG93cyhmYWxzZSk7CisgICAgfSwKKworCisgICAgLyoqIENvbXB1dGUgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXQgZm9yIGN1cnJlbnQgcnVsZS4KKyAgICAgKiAgPHA+VGhpcyBpcyBzZXQgb2YgdG9rZW4gdHlwZXMgdGhhdCBjYW4gZm9sbG93IGEgc3BlY2lmaWMgcnVsZQorICAgICAqICByZWZlcmVuY2UgZ2l2ZW4gYSBzcGVjaWZpYyBjYWxsIGNoYWluLiAgWW91IGdldCB0aGUgc2V0IG9mCisgICAgICogIHZpYWJsZSB0b2tlbnMgdGhhdCBjYW4gcG9zc2libHkgY29tZSBuZXh0IChsb29rYWhlYWQgZGVwdGggMSkKKyAgICAgKiAgZ2l2ZW4gdGhlIGN1cnJlbnQgY2FsbCBjaGFpbi4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUKKyAgICAgKiAgZGVmaW5pdGlvbiBvZiBwbGFpbiBGT0xMT1cgZm9yIHJ1bGUgcjo8L3A+CisgICAgICoKKyAgICAgKiAgIDxjb2RlPkZPTExPVyhyKT17eCB8IFM9PiphbHBoYSByIGJldGEgaW4gRyBhbmQgeCBpbiBGSVJTVChiZXRhKX08L2NvZGU+CisgICAgICoKKyAgICAgKiAgPHA+d2hlcmUgeCBpbiBUKiBhbmQgYWxwaGEsIGJldGEgaW4gVio7IFQgaXMgc2V0IG9mIHRlcm1pbmFscyBhbmQKKyAgICAgKiAgViBpcyB0aGUgc2V0IG9mIHRlcm1pbmFscyBhbmQgbm9udGVybWluYWxzLiAgSW4gb3RoZXIgd29yZHMsCisgICAgICogIEZPTExPVyhyKSBpcyB0aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdCBjYW4gcG9zc2libHkgZm9sbG93CisgICAgICogIHJlZmVyZW5jZXMgdG8gciBpbiAqYW55KiBzZW50ZW50aWFsIGZvcm0gKGNvbnRleHQpLiAgQXQKKyAgICAgKiAgcnVudGltZSwgaG93ZXZlciwgd2Uga25vdyBwcmVjaXNlbHkgd2hpY2ggY29udGV4dCBhcHBsaWVzIGFzCisgICAgICogIHdlIGhhdmUgdGhlIGNhbGwgY2hhaW4uICBXZSBtYXkgY29tcHV0ZSB0aGUgZXhhY3QgKHJhdGhlcgorICAgICAqICB0aGFuIGNvdmVyaW5nIHN1cGVyc2V0KSBzZXQgb2YgZm9sbG93aW5nIHRva2Vucy48L3A+CisgICAgICoKKyAgICAgKiAgPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIGdyYW1tYXI6PC9wPgorICAgICAqCisgICAgICogIDxjb2RlPjxwcmU+CisgICAgICogIHN0YXQgOiBJRCAnPScgZXhwciAnOycgICAgICAvLyBGT0xMT1coc3RhdCk9PXtFT0Z9CisgICAgICogICAgICAgfCAicmV0dXJuIiBleHByICcuJworICAgICAqICAgICAgIDsKKyAgICAgKiAgZXhwciA6IGF0b20gKCcrJyBhdG9tKSogOyAgIC8vIEZPTExPVyhleHByKT09eyc7JywnLicsJyknfQorICAgICAqICBhdG9tIDogSU5UICAgICAgICAgICAgICAgICAgLy8gRk9MTE9XKGF0b20pPT17JysnLCcpJywnOycsJy4nfQorICAgICAqICAgICAgIHwgJygnIGV4cHIgJyknCisgICAgICogICAgICAgOworICAgICAqICA8L3ByZT48L2NvZGU+CisgICAgICoKKyAgICAgKiAgPHA+VGhlIEZPTExPVyBzZXRzIGFyZSBhbGwgaW5jbHVzaXZlIHdoZXJlYXMgY29udGV4dC1zZW5zaXRpdmUKKyAgICAgKiAgRk9MTE9XIHNldHMgYXJlIHByZWNpc2VseSB3aGF0IGNvdWxkIGZvbGxvdyBhIHJ1bGUgcmVmZXJlbmNlLgorICAgICAqICBGb3IgaW5wdXQgaW5wdXQgImk9KDMpOyIsIGhlcmUgaXMgdGhlIGRlcml2YXRpb246PC9wPgorICAgICAqCisgICAgICogIDxjb2RlPjxwcmU+CisgICAgICogIHN0YXQgPT4gSUQgJz0nIGV4cHIgJzsnCisgICAgICogICAgICAgPT4gSUQgJz0nIGF0b20gKCcrJyBhdG9tKSogJzsnCisgICAgICogICAgICAgPT4gSUQgJz0nICcoJyBleHByICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgKiAgICAgICA9PiBJRCAnPScgJygnIGF0b20gJyknICgnKycgYXRvbSkqICc7JworICAgICAqICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgKiAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgJzsnCisgICAgICogIDwvcHJlPjwvY29kZT4KKyAgICAgKgorICAgICAqICA8cD5BdCB0aGUgIjMiIHRva2VuLCB5b3UnZCBoYXZlIGEgY2FsbCBjaGFpbiBvZjwvcD4KKyAgICAgKgorICAgICAqICA8Y29kZT4gIHN0YXQgLT4gZXhwciAtPiBhdG9tIC0+IGV4cHIgLT4gYXRvbTwvY29kZT4KKyAgICAgKgorICAgICAqICA8cD5XaGF0IGNhbiBmb2xsb3cgdGhhdCBzcGVjaWZpYyBuZXN0ZWQgcmVmIHRvIGF0b20/ICBFeGFjdGx5ICcpJworICAgICAqICBhcyB5b3UgY2FuIHNlZSBieSBsb29raW5nIGF0IHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgc3BlY2lmaWMKKyAgICAgKiAgaW5wdXQuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIEZPTExPVyhhdG9tKT17JysnLCcpJywnOycsJy4nfS48L3A+CisgICAgICoKKyAgICAgKiAgPHA+WW91IHdhbnQgdGhlIGV4YWN0IHZpYWJsZSB0b2tlbiBzZXQgd2hlbiByZWNvdmVyaW5nIGZyb20gYQorICAgICAqICB0b2tlbiBtaXNtYXRjaC4gIFVwb24gdG9rZW4gbWlzbWF0Y2gsIGlmIExBKDEpIGlzIG1lbWJlciBvZgorICAgICAqICB0aGUgdmlhYmxlIG5leHQgdG9rZW4gc2V0LCB0aGVuIHlvdSBrbm93IHRoZXJlIGlzIG1vc3QgbGlrZWx5CisgICAgICogIGEgbWlzc2luZyB0b2tlbiBpbiB0aGUgaW5wdXQgc3RyZWFtLiAgIkluc2VydCIgb25lIGJ5IGp1c3Qgbm90CisgICAgICogIHRocm93aW5nIGFuIGV4Y2VwdGlvbi48L3A+CisgICAgICogIEByZXR1cm5zIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9CisgICAgICovCisgICAgY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29tYmluZUZvbGxvd3ModHJ1ZSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgZm9yIHtAbGluayAjY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXR9IGFuZAorICAgICAqIHtAbGluayBjb21wdXRlQ29udGV4dFNlbnNpdGl2ZVJ1bGVGT0xMT30uCisgICAgICogQHBhcmFtIHtCb29sZWFufSBleGFjdAorICAgICAqIEByZXR1cm5zIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9CisgICAgICovCisgICAgY29tYmluZUZvbGxvd3M6IGZ1bmN0aW9uKGV4YWN0KSB7CisgICAgICAgIHZhciB0b3AgPSB0aGlzLnN0YXRlLl9mc3AsCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgbG9jYWxGb2xsb3dTZXQsCisgICAgICAgICAgICBmb2xsb3dTZXQgPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0KCk7CisgICAgICAgIGZvciAoaT10b3A7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgbG9jYWxGb2xsb3dTZXQgPSB0aGlzLnN0YXRlLmZvbGxvd2luZ1tpXTsKKyAgICAgICAgICAgIGZvbGxvd1NldC5vckluUGxhY2UobG9jYWxGb2xsb3dTZXQpOworICAgICAgICAgICAgaWYgKCBleGFjdCApIHsKKyAgICAgICAgICAgICAgICAvLyBjYW4gd2Ugc2VlIGVuZCBvZiBydWxlPworICAgICAgICAgICAgICAgIGlmICggbG9jYWxGb2xsb3dTZXQubWVtYmVyKG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPUl9UT0tFTl9UWVBFKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGxlYXZlIEVPUiBpbiBzZXQgaWYgYXQgdG9wIChzdGFydCBydWxlKTsgdGhpcyBsZXRzCisgICAgICAgICAgICAgICAgICAgIC8vIHVzIGtub3cgaWYgaGF2ZSB0byBpbmNsdWRlIGZvbGxvdyhzdGFydCBydWxlKTsgaS5lLiwgRU9GCisgICAgICAgICAgICAgICAgICAgIGlmICggaT4wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93U2V0LnJlbW92ZShvcmcuYW50bHIucnVudGltZS5Ub2tlbi5FT1JfVE9LRU5fVFlQRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7IC8vIGNhbid0IHNlZSBlbmQgb2YgcnVsZSwgcXVpdAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvbGxvd1NldDsKKyAgICB9LAorCisgICAgLyoqIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGEgc2luZ2xlIG1pc3Npbmcgb3IgZXh0cmEgdG9rZW4uCisgICAgICoKKyAgICAgKiAgPHA+RVhUUkEgVE9LRU48L3A+CisgICAgICoKKyAgICAgKiAgPHA+TEEoMSkgaXMgbm90IHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLiAgSWYgTEEoMikgaGFzIHRoZSByaWdodCB0b2tlbiwKKyAgICAgKiAgaG93ZXZlciwgdGhlbiBhc3N1bWUgTEEoMSkgaXMgc29tZSBleHRyYSBzcHVyaW91cyB0b2tlbi4gIERlbGV0ZSBpdAorICAgICAqICBhbmQgTEEoMikgYXMgaWYgd2Ugd2VyZSBkb2luZyBhIG5vcm1hbCBtYXRjaCgpLCB3aGljaCBhZHZhbmNlcyB0aGUKKyAgICAgKiAgaW5wdXQuPC9wPgorICAgICAqCisgICAgICogIDxwPk1JU1NJTkcgVE9LRU48L3A+CisgICAgICoKKyAgICAgKiAgPHA+SWYgY3VycmVudCB0b2tlbiBpcyBjb25zaXN0ZW50IHdpdGggd2hhdCBjb3VsZCBjb21lIGFmdGVyCisgICAgICogIHR0eXBlIHRoZW4gaXQgaXMgb2sgdG8gImluc2VydCIgdGhlIG1pc3NpbmcgdG9rZW4sIGVsc2UgdGhyb3cKKyAgICAgKiAgZXhjZXB0aW9uIEZvciBleGFtcGxlLCBJbnB1dCAiaT0oMzsiIGlzIGNsZWFybHkgbWlzc2luZyB0aGUKKyAgICAgKiAgJyknLiAgV2hlbiB0aGUgcGFyc2VyIHJldHVybnMgZnJvbSB0aGUgbmVzdGVkIGNhbGwgdG8gZXhwciwgaXQKKyAgICAgKiAgd2lsbCBoYXZlIGNhbGwgY2hhaW46PC9wPgorICAgICAqCisgICAgICogIDxwcmU+PGNvZGU+ICBzdGF0IC0+IGV4cHIgLT4gYXRvbTwvY29kZT48L3ByZT4KKyAgICAgKgorICAgICAqICA8cD5hbmQgaXQgd2lsbCBiZSB0cnlpbmcgdG8gbWF0Y2ggdGhlICcpJyBhdCB0aGlzIHBvaW50IGluIHRoZQorICAgICAqICBkZXJpdmF0aW9uOjwvcD4KKyAgICAgKgorICAgICAqICA8cHJlPjxjb2RlPiAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JzwvY29kZT48L3ByZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAqICA8cD5tYXRjaCgpIHdpbGwgc2VlIHRoYXQgJzsnIGRvZXNuJ3QgbWF0Y2ggJyknIGFuZCByZXBvcnQgYQorICAgICAqICBtaXNtYXRjaGVkIHRva2VuIGVycm9yLiAgVG8gcmVjb3ZlciwgaXQgc2VlcyB0aGF0IExBKDEpPT0nOycKKyAgICAgKiAgaXMgaW4gdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZSAnKScgdG9rZW4KKyAgICAgKiAgcmVmZXJlbmNlIGluIHJ1bGUgYXRvbS4gIEl0IGNhbiBhc3N1bWUgdGhhdCB5b3UgZm9yZ290IHRoZSAnKScuPC9wPgorICAgICAqCisgICAgICogIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuSW50U3RyZWFtfSBpbnB1dAorICAgICAqICBAcGFyYW0ge051bWJlcn0gdHR5cGUKKyAgICAgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9IGZvbGxvdworICAgICAqICBAcmV0dXJucyB7T2JqZWN0fQorICAgICAqLworICAgIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuOiBmdW5jdGlvbihpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvdykKKyAgICB7CisgICAgICAgIHZhciBlID0gbnVsbDsKKyAgICAgICAgLy8gaWYgbmV4dCB0b2tlbiBpcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvciB0aGVuICJkZWxldGUiIHRoaXMgdG9rZW4KKyAgICAgICAgaWYgKCB0aGlzLm1pc21hdGNoSXNVbndhbnRlZFRva2VuKGlucHV0LCB0dHlwZSkgKSB7CisgICAgICAgICAgICBlID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLlVud2FudGVkVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0KTsKKyAgICAgICAgICAgIHRoaXMuYmVnaW5SZXN5bmMoKTsKKyAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsgLy8gc2ltcGx5IGRlbGV0ZSBleHRyYSB0b2tlbgorICAgICAgICAgICAgdGhpcy5lbmRSZXN5bmMoKTsKKyAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IoZSk7ICAvLyByZXBvcnQgYWZ0ZXIgY29uc3VtaW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSB0b2tlbiB3ZSdyZSBhY3R1YWxseSBtYXRjaGluZworICAgICAgICAgICAgdmFyIG1hdGNoZWRTeW1ib2wgPSB0aGlzLmdldEN1cnJlbnRJbnB1dFN5bWJvbChpbnB1dCk7CisgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7IC8vIG1vdmUgcGFzdCB0dHlwZSB0b2tlbiBhcyBpZiBhbGwgd2VyZSBvaworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRTeW1ib2w7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuJ3QgcmVjb3ZlciB3aXRoIHNpbmdsZSB0b2tlbiBkZWxldGlvbiwgdHJ5IGluc2VydGlvbgorICAgICAgICBpZiAoIHRoaXMubWlzbWF0Y2hJc01pc3NpbmdUb2tlbihpbnB1dCwgZm9sbG93KSApIHsKKyAgICAgICAgICAgIHZhciBpbnNlcnRlZCA9IHRoaXMuZ2V0TWlzc2luZ1N5bWJvbChpbnB1dCwgZSwgdHR5cGUsIGZvbGxvdyk7CisgICAgICAgICAgICBlID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLk1pc3NpbmdUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQsIGluc2VydGVkKTsKKyAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IoZSk7ICAvLyByZXBvcnQgYWZ0ZXIgaW5zZXJ0aW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIHJldHVybiBpbnNlcnRlZDsKKyAgICAgICAgfQorICAgICAgICAvLyBldmVuIHRoYXQgZGlkbid0IHdvcms7IG11c3QgdGhyb3cgdGhlIGV4Y2VwdGlvbgorICAgICAgICBlID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpOworICAgICAgICB0aHJvdyBlOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZWNvdmVyIGZyb20gYSBtaXNtYXRjaGVkIHNldCBleGNlcHRpb24uCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5JbnRTdHJlYW19IGlucHV0CisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbn0gZQorICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fSBmb2xsb3cKKyAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQorICAgICAqLworICAgIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldDogZnVuY3Rpb24oaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93KQorICAgIHsKKyAgICAgICAgaWYgKCB0aGlzLm1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQsIGZvbGxvdykgKSB7CisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1pc3NpbmcgdG9rZW4iKTsKKyAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IoZSk7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyB0byBjb25qdXJlIHVwIGEgdG9rZW4gZm9yIHNldHMgeWV0CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRNaXNzaW5nU3ltYm9sKGlucHV0LCBlLCBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEUsIGZvbGxvdyk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgZTsKKyAgICB9LAorCisgICAgLyoqIE1hdGNoIG5lZWRzIHRvIHJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wsIHdoaWNoIGdldHMgcHV0CisgICAgICogIGludG8gdGhlIGxhYmVsIGZvciB0aGUgYXNzb2NpYXRlZCB0b2tlbiByZWY7IGUuZy4sIHg9SUQuICBUb2tlbgorICAgICAqICBhbmQgdHJlZSBwYXJzZXJzIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBvYmplY3RzLiBSYXRoZXIgdGhhbiB0ZXN0CisgICAgICogIGZvciBpbnB1dCBzdHJlYW0gdHlwZSBvciBjaGFuZ2UgdGhlIEludFN0cmVhbSBpbnRlcmZhY2UsIEkgdXNlCisgICAgICogIGEgc2ltcGxlIG1ldGhvZCB0byBhc2sgdGhlIHJlY29nbml6ZXIgdG8gdGVsbCBtZSB3aGF0IHRoZSBjdXJyZW50CisgICAgICogIGlucHV0IHN5bWJvbCBpcy4KKyAgICAgKiAKKyAgICAgKiAgPHA+VGhpcyBpcyBpZ25vcmVkIGZvciBsZXhlcnMuPC9wPgorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbX0gaW5wdXQKKyAgICAgKiAgQHJldHVybnMge09iamVjdH0KKyAgICAgKi8KKyAgICBnZXRDdXJyZW50SW5wdXRTeW1ib2w6IGZ1bmN0aW9uKGlucHV0KSB7IHJldHVybiBudWxsOyB9LAorCisgICAgLyoqIENvbmp1cmUgdXAgYSBtaXNzaW5nIHRva2VuIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAgICAgKgorICAgICAqICA8cD5UaGUgcmVjb2duaXplciBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gc2luZ2xlIG1pc3NpbmcKKyAgICAgKiAgc3ltYm9scy4gQnV0LCBhY3Rpb25zIG1pZ2h0IHJlZmVyIHRvIHRoYXQgbWlzc2luZyBzeW1ib2wuCisgICAgICogIEZvciBleGFtcGxlLCB4PUlEIHtmKCR4KTt9LiBUaGUgYWN0aW9uIGNsZWFybHkgYXNzdW1lcworICAgICAqICB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGlkZW50aWZpZXIgbWF0Y2hlZCBwcmV2aW91c2x5IGFuZCB0aGF0CisgICAgICogICR4IHBvaW50cyBhdCB0aGF0IHRva2VuLiBJZiB0aGF0IHRva2VuIGlzIG1pc3NpbmcsIGJ1dAorICAgICAqICB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtIGlzIHdoYXQgd2Ugd2FudCB3ZSBhc3N1bWUgdGhhdAorICAgICAqICB0aGlzIHRva2VuIGlzIG1pc3NpbmcgYW5kIHdlIGtlZXAgZ29pbmcuIEJlY2F1c2Ugd2UKKyAgICAgKiAgaGF2ZSB0byByZXR1cm4gc29tZSB0b2tlbiB0byByZXBsYWNlIHRoZSBtaXNzaW5nIHRva2VuLAorICAgICAqICB3ZSBoYXZlIHRvIGNvbmp1cmUgb25lIHVwLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdXNlciBjb250cm9sCisgICAgICogIG92ZXIgdGhlIHRva2VucyByZXR1cm5lZCBmb3IgbWlzc2luZyB0b2tlbnMuIE1vc3RseSwKKyAgICAgKiAgeW91IHdpbGwgd2FudCB0byBjcmVhdGUgc29tZXRoaW5nIHNwZWNpYWwgZm9yIGlkZW50aWZpZXIKKyAgICAgKiAgdG9rZW5zLiBGb3IgbGl0ZXJhbHMgc3VjaCBhcyAneycgYW5kICcsJywgdGhlIGRlZmF1bHQKKyAgICAgKiAgYWN0aW9uIGluIHRoZSBwYXJzZXIgb3IgdHJlZSBwYXJzZXIgd29ya3MuIEl0IHNpbXBseSBjcmVhdGVzCisgICAgICogIGEgQ29tbW9uVG9rZW4gb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuIFRoZSB0ZXh0IHdpbGwgYmUgdGhlIHRva2VuLgorICAgICAqICBJZiB5b3UgY2hhbmdlIHdoYXQgdG9rZW5zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgbGV4ZXIsCisgICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdG9rZW5zLjwvcD4KKyAgICAgKgorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbX0gaW5wdXQKKyAgICAgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbn0gZQorICAgICAqICBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRUb2tlblR5cGUKKyAgICAgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9IGZvbGxvdworICAgICAqICBAcmV0dXJucyB7T2JqZWN0fQorICAgICAqLworICAgIGdldE1pc3NpbmdTeW1ib2w6IGZ1bmN0aW9uKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUb2tlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKworCisgICAgLyoqCisgICAgICogQ29uc3VtZSB0b2tlbnMgdW50aWwgb25lIG1hdGNoZXMgdGhlIGdpdmVuIHRva2VuIG9yIHRva2VuIHNldAorICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuSW50U3RyZWFtfSBpbnB1dAorICAgICAqIEBwYXJhbSB7TnVtYmVyfG9yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gc2V0CisgICAgICovCisgICAgY29uc3VtZVVudGlsOiBmdW5jdGlvbihpbnB1dCwgc2V0KSB7CisgICAgICAgIHZhciB0dHlwZSA9IGlucHV0LkxBKDEpOworICAgICAgICB3aGlsZSAodHR5cGUgIT0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GICYmICFzZXQubWVtYmVyKHR0eXBlKSApIHsKKyAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgIHR0eXBlID0gaW5wdXQuTEEoMSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogUHVzaCBhIHJ1bGUncyBmb2xsb3cgc2V0IHVzaW5nIG91ciBvd24gaGFyZGNvZGVkIHN0YWNrLgorICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fSBmc2V0CisgICAgICovCisgICAgcHVzaEZvbGxvdzogZnVuY3Rpb24oZnNldCkgeworICAgICAgICBpZiAoICh0aGlzLnN0YXRlLl9mc3AgKzEpPj10aGlzLnN0YXRlLmZvbGxvd2luZy5sZW5ndGggKSB7CisgICAgICAgICAgICB2YXIgZiA9IFtdOworICAgICAgICAgICAgdmFyIGk7CisgICAgICAgICAgICBmb3IgKGk9dGhpcy5zdGF0ZS5mb2xsb3dpbmcubGVuZ3RoLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIGZbaV0gPSB0aGlzLnN0YXRlLmZvbGxvd2luZ1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuc3RhdGUuZm9sbG93aW5nID0gZjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnN0YXRlLl9mc3ArKzsKKyAgICAgICAgdGhpcy5zdGF0ZS5mb2xsb3dpbmdbdGhpcy5zdGF0ZS5fZnNwXSA9IGZzZXQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNhZGx5IEphdmFTY3JpcHQgZG9lc24ndCBwcm92aWRlIGEgcm9idXN0IG1lY2hhbmlzbSBmb3IgcnVudGltZSBzdGFjayByZWZsZWN0aW9uLgorICAgICAqIFRoaXMgbWFrZXMgaW1wbGVtZW50aW5nIHRoaXMgZnVuY3Rpb24gaW1wb3NzaWJsZSB3aXRob3V0IG1haW50YWluaW5nIGFuIGF1eGlsbGFyeQorICAgICAqIHN0YWNrIGRhdGEgc3RydWN0dXJlLCB3aGljaCB3b3VsZCBiZSBjcmF6eSBleHBlbnNpdmUsIGVzcGVjaWFsbHkgaW4gTGV4ZXJzLiAgQXMgc3VjaCwKKyAgICAgKiB0aGlzIG1ldGhvZCByZW1haW5zIHVuaW1wbGVtZW50ZWQuCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBnZXRSdWxlSW52b2NhdGlvblN0YWNrOiBmdW5jdGlvbihlLCByZWNvZ25pemVyQ2xhc3NOYW1lKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQuIik7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEdldCB0aGlzIHJlY29nbml6ZXIncyBiYWNrdHJhY2tpbmcgbGV2ZWwuCisgICAgICogQHJldHVybnMge051bWJlcn0gYmFja3RyYWNraW5nIGxldmVsCisgICAgICovCisgICAgZ2V0QmFja3RyYWNraW5nTGV2ZWw6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc7CisgICAgfSwKKworICAgIC8qKiBVc2VkIHRvIHByaW50IG91dCB0b2tlbiBuYW1lcyBsaWtlIElEIGR1cmluZyBkZWJ1Z2dpbmcgYW5kCisgICAgICogIGVycm9yIHJlcG9ydGluZy4gIFRoZSBnZW5lcmF0ZWQgcGFyc2VycyBpbXBsZW1lbnQgYSBtZXRob2QKKyAgICAgKiAgdGhhdCBvdmVycmlkZXMgdGhpcyB0byBwb2ludCB0byB0aGVpciBTdHJpbmdbXSB0b2tlbk5hbWVzLgorICAgICAqICBAcmV0dXJucyB7QXJyYXl9IFN0cmluZyBhcnJheSBvZiB0b2tlbiBuYW1lcy4KKyAgICAgKi8KKyAgICBnZXRUb2tlbk5hbWVzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKworICAgIC8qKiBGb3IgZGVidWdnaW5nIGFuZCBvdGhlciBwdXJwb3NlcywgbWlnaHQgd2FudCB0aGUgZ3JhbW1hciBuYW1lLgorICAgICAqICBIYXZlIEFOVExSIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiAgQHJldHVybnMge1N0cmluZ30gdGhlIGdyYW1tYXIgbmFtZS4KKyAgICAgKi8KKyAgICBnZXRHcmFtbWFyRmlsZU5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisgICAgLyoqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB1c2UgbW9zdCBvZnRlbiB3aXRoIHRlbXBsYXRlIHJld3JpdGVzLgorICAgICAqICBDb252ZXJ0IGFuIGFycmF5IG9mIFRva2VucyB0byBhbiBhcnJheSBvZiBTdHJpbmdzLgorICAgICAqICBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBvcmcuYW50bHIucnVudGltZS5Ub2tlbiBvYmplY3RzLgorICAgICAqICBAcmV0dXJucyB7QXJyYXl9IGFycmF5IG9mIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGFyZ3VtZW50LgorICAgICAqLworICAgIHRvU3RyaW5nczogZnVuY3Rpb24odG9rZW5zKSB7CisgICAgICAgIGlmICggIXRva2VucyApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHZhciBzdHJpbmdzID0gW107CisgICAgICAgIHZhciBpOworICAgICAgICBmb3IgKGk9MDsgaTx0b2tlbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHN0cmluZ3MucHVzaCh0b2tlbnNbaV0uZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nczsKKyAgICB9LAorCisgICAgLyoqIEdpdmVuIGEgcnVsZSBudW1iZXIgYW5kIGEgc3RhcnQgdG9rZW4gaW5kZXggbnVtYmVyLCByZXR1cm4KKyAgICAgKiAgTUVNT19SVUxFX1VOS05PV04gaWYgdGhlIHJ1bGUgaGFzIG5vdCBwYXJzZWQgaW5wdXQgc3RhcnRpbmcgZnJvbQorICAgICAqICBzdGFydCBpbmRleC4gIElmIHRoaXMgcnVsZSBoYXMgcGFyc2VkIGlucHV0IHN0YXJ0aW5nIGZyb20gdGhlCisgICAgICogIHN0YXJ0IGluZGV4IGJlZm9yZSwgdGhlbiByZXR1cm4gd2hlcmUgdGhlIHJ1bGUgc3RvcHBlZCBwYXJzaW5nLgorICAgICAqICBJdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0b2tlbiBtYXRjaGVkIGJ5IHRoZSBydWxlLgorICAgICAqCisgICAgICogIDxwPkZvciBub3cgd2UgdXNlIGEgaGFzaHRhYmxlIGFuZCBqdXN0IHRoZSBzbG93IE9iamVjdC1iYXNlZCBvbmUuCisgICAgICogIExhdGVyLCB3ZSBjYW4gbWFrZSBhIHNwZWNpYWwgb25lIGZvciBpbnRzIGFuZCBhbHNvIG9uZSB0aGF0CisgICAgICogIHRvc3NlcyBvdXQgZGF0YSBhZnRlciB3ZSBjb21taXQgcGFzdCBpbnB1dCBwb3NpdGlvbiBpLjwvcD4KKyAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IHJ1bGVJbmRleAorICAgICAqICBAcGFyYW0ge051bWJlcn0gcnVsZVN0YXJ0SW5kZXgKKyAgICAgKiAgQHJldHVybnMge051bWJlcn0KKyAgICAgKi8KKyAgICBnZXRSdWxlTWVtb2l6YXRpb246IGZ1bmN0aW9uKHJ1bGVJbmRleCwgcnVsZVN0YXJ0SW5kZXgpIHsKKyAgICAgICAgaWYgKCAhdGhpcy5zdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdICkgeworICAgICAgICAgICAgdGhpcy5zdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdID0ge307CisgICAgICAgIH0KKyAgICAgICAgdmFyIHN0b3BJbmRleEkgPQorICAgICAgICAgICAgdGhpcy5zdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdW3J1bGVTdGFydEluZGV4XTsKKyAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoc3RvcEluZGV4SSkgKSB7CisgICAgICAgICAgICByZXR1cm4gb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuTUVNT19SVUxFX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0b3BJbmRleEk7CisgICAgfSwKKworICAgIC8qKiBIYXMgdGhpcyBydWxlIGFscmVhZHkgcGFyc2VkIGlucHV0IGF0IHRoZSBjdXJyZW50IGluZGV4IGluIHRoZQorICAgICAqICBpbnB1dCBzdHJlYW0/ICBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gaW5kZXggb3IgTUVNT19SVUxFX1VOS05PV04uCisgICAgICogIElmIHdlIGF0dGVtcHRlZCBidXQgZmFpbGVkIHRvIHBhcnNlIHByb3Blcmx5IGJlZm9yZSwgcmV0dXJuCisgICAgICogIE1FTU9fUlVMRV9GQUlMRUQuCisgICAgICoKKyAgICAgKiAgPHA+VGhpcyBtZXRob2QgaGFzIGEgc2lkZS1lZmZlY3Q6IGlmIHdlIGhhdmUgc2VlbiB0aGlzIGlucHV0IGZvcgorICAgICAqICB0aGlzIHJ1bGUgYW5kIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYmVmb3JlLCB0aGVuIHNlZWsgYWhlYWQgdG8KKyAgICAgKiAgMSBwYXN0IHRoZSBzdG9wIHRva2VuIG1hdGNoZWQgZm9yIHRoaXMgcnVsZSBsYXN0IHRpbWUuPC9wPgorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbX0gaW5wdXQKKyAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IHJ1bGVJbmRleAorICAgICAqICBAcmV0dXJucyB7Qm9vbGVhbn0KKyAgICAgKi8KKyAgICBhbHJlYWR5UGFyc2VkUnVsZTogZnVuY3Rpb24oaW5wdXQsIHJ1bGVJbmRleCkgeworICAgICAgICB2YXIgc3RvcEluZGV4ID0gdGhpcy5nZXRSdWxlTWVtb2l6YXRpb24ocnVsZUluZGV4LCBpbnB1dC5pbmRleCgpKTsKKyAgICAgICAgaWYgKCBzdG9wSW5kZXg9PW9yZy5hbnRsci5ydW50aW1lLkJhc2VSZWNvZ25pemVyLk1FTU9fUlVMRV9VTktOT1dOICkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICggc3RvcEluZGV4PT1vcmcuYW50bHIucnVudGltZS5CYXNlUmVjb2duaXplci5NRU1PX1JVTEVfRkFJTEVEICkgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgIitydWxlSW5kZXgrIiB3aWxsIG5ldmVyIHN1Y2NlZWQiKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFpbGVkPXRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnB1dC5zZWVrKHN0b3BJbmRleCsxKTsgLy8ganVtcCB0byBvbmUgcGFzdCBzdG9wIHRva2VuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKiBSZWNvcmQgd2hldGhlciBvciBub3QgdGhpcyBydWxlIHBhcnNlZCB0aGUgaW5wdXQgYXQgdGhpcyBwb3NpdGlvbgorICAgICAqICBzdWNjZXNzZnVsbHkuICBVc2UgYSBzdGFuZGFyZCBqYXZhIGhhc2h0YWJsZSBmb3Igbm93LgorICAgICAqICBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbX0gaW5wdXQKKyAgICAgKiAgQHBhcmFtIHtOdW1iZXJ9IHJ1bGVJbmRleAorICAgICAqICBAcGFyYW0ge051bWJlcn0gcnVsZVN0YXJ0SW5kZXgKKyAgICAgKi8KKyAgICBtZW1vaXplOiBmdW5jdGlvbihpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBydWxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgcnVsZVN0YXJ0SW5kZXgpCisgICAgeworICAgICAgICB2YXIgc3RvcFRva2VuSW5kZXggPSB0aGlzLnN0YXRlLmZhaWxlZCA/IAorICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuTUVNT19SVUxFX0ZBSUxFRCA6IGlucHV0LmluZGV4KCktMTsKKyAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0aGlzLnN0YXRlLnJ1bGVNZW1vKSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiISEhISEhISEhIG1lbW8gYXJyYXkgaXMgbnVsbCBmb3IgIisgdGhpcy5nZXRHcmFtbWFyRmlsZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBydWxlSW5kZXggPj0gdGhpcy5zdGF0ZS5ydWxlTWVtby5sZW5ndGggKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiEhISEhISEhISBtZW1vIHNpemUgaXMgIit0aGlzLnN0YXRlLnJ1bGVNZW1vLmxlbmd0aCsiLCBidXQgcnVsZSBpbmRleCBpcyAiK3J1bGVJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHRoaXMuc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XSkgKSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF1bcnVsZVN0YXJ0SW5kZXhdID0gc3RvcFRva2VuSW5kZXg7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIHJldHVybiBob3cgbWFueSBydWxlL2lucHV0LWluZGV4IHBhaXJzIHRoZXJlIGFyZSBpbiB0b3RhbC4KKyAgICAgKiAgVE9ETzogdGhpcyBpbmNsdWRlcyBzeW5wcmVkcy4KKyAgICAgKiAgQHJldHVybnMge051bWJlcn0KKyAgICAgKi8KKyAgICBnZXRSdWxlTWVtb2l6YXRpb25DYWNoZVNpemU6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbiA9IDAsIGk7CisgICAgICAgIGZvciAoaSA9IDA7IHRoaXMuc3RhdGUucnVsZU1lbW8gJiYgaSA8IHRoaXMuc3RhdGUucnVsZU1lbW8ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHZhciBydWxlTWFwID0gdGhpcy5zdGF0ZS5ydWxlTWVtb1tpXTsKKyAgICAgICAgICAgIGlmICggcnVsZU1hcCApIHsKKyAgICAgICAgICAgICAgICAvLyBAdG9kbyBuZWVkIHRvIGdldCBzaXplIG9mIHJ1bGVtYXA/CisgICAgICAgICAgICAgICAgbiArPSBydWxlTWFwLmxlbmd0aDsgLy8gaG93IG1hbnkgaW5wdXQgaW5kZXhlcyBhcmUgcmVjb3JkZWQ/CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFdoZW4gYSBncmFtbWFyIGlzIGNvbXBpbGVkIHdpdGggdGhlIHRyYWNpbmcgZmxhZyBlbmFibGVkLCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCisgICAgICogYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcnVsZS4KKyAgICAgKiBAcGFyYW0ge1N0cmluZ30gcnVsZU5hbWUgdGhlIGN1cnJlbnQgcnVsZU5hbWUKKyAgICAgKiBAcGFyYW0ge051bWJlcn0gcnVsZUluZGV4CisgICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0U3ltYm9sCisgICAgICovCisgICAgdHJhY2VJbjogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXRTeW1ib2wpICB7CisgICAgICAgIHRoaXMuZW1pdEVycm9yTWVzc2FnZSgiZW50ZXIgIitydWxlTmFtZSsiICIraW5wdXRTeW1ib2wpOworICAgICAgICBpZiAoIHRoaXMuc3RhdGUuZmFpbGVkICkgeworICAgICAgICAgICAgdGhpcy5lbWl0RXJyb3JNZXNzYWdlKCIgZmFpbGVkPSIrdGhpcy5mYWlsZWQpOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKKyAgICAgICAgICAgIHRoaXMuZW1pdEVycm9yTWVzc2FnZSgiIGJhY2t0cmFja2luZz0iK3RoaXMuc3RhdGUuYmFja3RyYWNraW5nKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogV2hlbiBhIGdyYW1tYXIgaXMgY29tcGlsZWQgd2l0aCB0aGUgdHJhY2luZyBmbGFnIGVuYWJsZWQsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKiBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4KKyAgICAgKiBAcGFyYW0ge1N0cmluZ30gcnVsZU5hbWUgdGhlIGN1cnJlbnQgcnVsZU5hbWUKKyAgICAgKiBAcGFyYW0ge051bWJlcn0gcnVsZUluZGV4CisgICAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0U3ltYm9sCisgICAgICovCisgICAgdHJhY2VPdXQ6IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKSB7CisgICAgICAgIHRoaXMuZW1pdEVycm9yTWVzc2FnZSgiZXhpdCAiK3J1bGVOYW1lKyIgIitpbnB1dFN5bWJvbCk7CisgICAgICAgIGlmICggdGhpcy5zdGF0ZS5mYWlsZWQgKSB7CisgICAgICAgICAgICB0aGlzLmVtaXRFcnJvck1lc3NhZ2UoIiBmYWlsZWQ9Iit0aGlzLnN0YXRlLmZhaWxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB0aGlzLnN0YXRlLmJhY2t0cmFja2luZz4wICkgeworICAgICAgICAgICAgdGhpcy5lbWl0RXJyb3JNZXNzYWdlKCIgYmFja3RyYWNraW5nPSIrdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmcpOworICAgICAgICB9CisgICAgfQorfTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0JpdFNldC5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0JpdFNldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OWJmZGExCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQml0U2V0LmpzCkBAIC0wLDAgKzEsNzA2IEBACisvKioKKyAqIEEgQml0U2V0IHNpbWlsYXIgdG8gamF2YS51dGlsLkJpdFNldC4KKyAqCisgKiA8cD5KYXZhU2NyaXB0IE5vdGU6IFRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIGltcGxlbWVudCBzb21ldGhpbmcgbGlrZSB0aGlzIGluIAorICogSmF2YVNjcmlwdC4gIEpTIGhhcyBubyB0cnVlIGludCB0eXBlLCBhcnJheXMgYXJlIHVzdWFsbHkgaW1wbGVtZW50ZWQgYXMKKyAqIGhhc2hlcywgZXRjLiAgVGhpcyBjbGFzcyBzaG91bGQgcHJvYmFibHkgYmUgbml4ZWQgZm9yIHNvbWV0aGluZyB0aGF0IGlzCisgKiBzaW1pbGFybHkgKGluKWVmZmljaWVudCwgYnV0IG1vcmUgY2xlYXIuPC9wPgorICoKKyAqIEBjbGFzcworICogQHBhcmFtIHtOdW1iZXJ8QXJyYXl9IFtiaXRzXSBhIDMyIGJpdCBudW1iZXIgb3IgYXJyYXkgb2YgMzIgYml0IG51bWJlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZSBiaXRzZXQuICBUaGVzZSBhcmUgdHlwaWNhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBieSB0aGUgQU5UTFIgVG9vbC4KKyAqLworb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0ID0gZnVuY3Rpb24oYml0cykgeworICAgIGlmICghYml0cykgeworICAgICAgICBiaXRzID0gb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0LkJJVFM7CisgICAgfQorCisgICAgaWYgKG9yZy5hbnRsci5sYW5nLmlzQXJyYXkoYml0cykpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGFycmF5IG9mIE51bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBCaXRTZXQuCisgICAgICAgICAqIEB0eXBlIEFycmF5CisgICAgICAgICAqLworICAgICAgICB0aGlzLmJpdHMgPSBiaXRzOworICAgIH0gZWxzZSBpZihvcmcuYW50bHIubGFuZy5pc051bWJlcihiaXRzKSkgeworICAgICAgICB0aGlzLmJpdHMgPSBbXTsKKyAgICB9Cit9OworCitvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0KG9yZy5hbnRsci5ydW50aW1lLkJpdFNldCwgeworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBiaXRzIGluIGVhY2ggbnVtYmVyLgorICAgICAqIEBjb25zdGFudAorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQKKyAgICAgKi8KKyAgICBCSVRTOiAzMiwKKworICAgIC8qKgorICAgICAqIExvZyAoYmFzZSAyKSBvZiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBudW1iZXIuCisgICAgICogQGNvbnN0YW50CisgICAgICogQG1lbWJlck9mIG9yZy5hbnRsci5ydW50aW1lLkJpdFNldAorICAgICAqLworICAgIExPR19CSVRTOiA1LCAgLy8gMl41ID09IDMyIAorCisgICAgLyoqCisgICAgICogV2Ugd2lsbCBvZnRlbiBuZWVkIHRvIGRvIGEgbW9kIG9wZXJhdG9yIChpIG1vZCBuYml0cykuICBJdHMKKyAgICAgKiB0dXJucyBvdXQgdGhhdCwgZm9yIHBvd2VycyBvZiB0d28sIHRoaXMgbW9kIG9wZXJhdGlvbiBpcworICAgICAqIHNhbWUgYXMgKGkgJiAobmJpdHMtMSkpLiAgU2luY2UgbW9kIGlzIHNsb3csIHdlIHVzZSBhCisgICAgICogcHJlY29tcHV0ZWQgbW9kIG1hc2sgdG8gZG8gdGhlIG1vZCBpbnN0ZWFkLgorICAgICAqIEBjb25zdGFudAorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQKKyAgICAgKi8KKyAgICBNT0RfTUFTSzogMzEsIC8vIEJJVFMgLSAxCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbWFzayBmb3IgYml0IG1vZGRlZCB0byBmaXQgaW4gYSBzaW5nbGUgd29yZC4KKyAgICAgKiBAZXhhbXBsZQorICAgICAqIGJpdG1hc2soMzUpID0+IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwCisgICAgICogYml0bWFzaygzKSAgPT4gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAKKyAgICAgKiBAcGFyYW0ge051bWJlcn0gYml0TnVtYmVyIHRoZSBiaXQgdG8gY3JlYXRlIGEgbWFzayBmb3IuCisgICAgICogQHJldHVybnMge051bWJlcn0gdGhlIGJpdG1hc2suCisgICAgICogQG1lbWJlck9mIG9yZy5hbnRsci5ydW50aW1lLkJpdFNldAorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgYml0TWFzazogZnVuY3Rpb24oYml0TnVtYmVyKSB7CisgICAgICAgIHZhciBiaXRQb3NpdGlvbiA9IGJpdE51bWJlciAmIG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5NT0RfTUFTSzsKKyAgICAgICAgcmV0dXJuIDEgPDwgYml0UG9zaXRpb247CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IGVsLgorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbCBhIG51bWJlciB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQml0U2V0LgorICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgYml0cyBuZWVkIHRvIGNyZWF0ZSBhIEJpdFNldCB3aXRoIG1lbWJlcgorICAgICAqICAgICAgICAgICAgICAgICAgIGVsLgorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIG51bVdvcmRzVG9Ib2xkOiBmdW5jdGlvbihlbCkgeworICAgICAgICByZXR1cm4gKGVsID4+IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5MT0dfQklUUykgKyAxOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ge051bWJlcn0gYml0IGEgbnVtYmVyIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBCaXRTZXQKKyAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIHdvcmQgaW4gdGhlIGZpZWxkIGJpdHMgdGhhdCB3b3VsZAorICAgICAqICAgICAgICAgICAgICAgICAgIGhvbGQgYml0LgorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHdvcmROdW1iZXI6IGZ1bmN0aW9uKGJpdCkgeworICAgICAgICByZXR1cm4gYml0ID4+IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5MT0dfQklUUzsgLy8gYml0IC8gQklUUworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBCaXRTZXQgZmFjdG9yeSBtZXRob2QuCisgICAgICogCisgICAgICogPHA+T3BlcmF0ZXMgaW4gYSBudW1iZXIgb2YgbW9kZXM6CisgICAgICogPHVsPgorICAgICAqIDxsaT5JZiBlbCBpcyBhIG51bWJlciBjcmVhdGUgdGhlIEJpdFNldCBjb250YWluaW5nIHRoYXQgbnVtYmVyLjwvbGk+CisgICAgICogPGxpPklmIGVsIGlzIGFuIGFycmF5IGNyZWF0ZSB0aGUgQml0U2V0IGNvbnRhaW5pbmcgZWFjaCBudW1iZXIgaW4gdGhlCisgICAgICogYXJyYXkuPC9saT4KKyAgICAgKiA8bGk+SWYgZWwgaXMgYSBCaXRTZXQgcmV0dXJuIGVsLjwvbGk+CisgICAgICogPGxpPklmIGVsIGlzIGFuIE9iamVjdCBjcmVhdGUgdGhlIEJpdFNldCBjb250YWluaW5nIGVhY2ggbnVtZXJpYyB2YWx1ZQorICAgICAqIGluIGVsLjwvbGk+CisgICAgICogPGxpPklmIGVsIGlzIGEgbnVtYmVyIGFuZCBlbDIgaXMgYSBudW1iZXIgcmV0dXJuIGEgQml0U2V0IGNvbnRhaW5pbmcKKyAgICAgKiB0aGUgbnVtYmVycyBiZXR3ZWVuIGVsIGFuZCBlbDIgKGluY2x1c2l2ZSkuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0ge051bWJlcnxBcnJheXxvcmcuYW50bHIucnVudGltZS5CaXRTZXR8T2JqZWN0fSBlbAorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbDIKKyAgICAgKiBAcmV0dXJucyB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fQorICAgICAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQKKyAgICAgKi8KKyAgICBvZjogZnVuY3Rpb24oZWwsIGVsMikgeworICAgICAgICB2YXIgaSwgbiwgcywga2V5czsKKworICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoZWwpKSB7CisgICAgICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoZWwyKSkgeworICAgICAgICAgICAgICAgIHMgPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0KGVsMiArIDEpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IGVsOyBpIDw9IGVsMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBvcmcuYW50bHIucnVudGltZS5CaXRTZXQud29yZE51bWJlcihpKTsKKyAgICAgICAgICAgICAgICAgICAgcy5iaXRzW25dIHw9IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5iaXRNYXNrKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IG5ldyBvcmcuYW50bHIucnVudGltZS5CaXRTZXQoZWwgKyAxKTsKKyAgICAgICAgICAgICAgICBzLmFkZChlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihvcmcuYW50bHIubGFuZy5pc0FycmF5KGVsKSkgeworICAgICAgICAgICAgcyA9IG5ldyBvcmcuYW50bHIucnVudGltZS5CaXRTZXQoKTsKKyAgICAgICAgICAgIGZvciAoaT1lbC5sZW5ndGgtMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgcy5hZGQoZWxbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQpIHsKKyAgICAgICAgICAgIGlmICghZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlbDsKKyAgICAgICAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLkludGVydmFsU2V0KSB7CisgICAgICAgICAgICBpZiAoIWVsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldCgpOworICAgICAgICAgICAgcy5hZGRBbGwoZWwpOworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0gZWxzZSBpZiAob3JnLmFudGxyLmxhbmcuaXNPYmplY3QoZWwpKSB7CisgICAgICAgICAgICBrZXlzID0gW107CisgICAgICAgICAgICBmb3IgKGkgaW4gZWwpIHsKKyAgICAgICAgICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQub2Yoa2V5cyk7CisgICAgICAgIH0KKyAgICB9Cit9KTsKKworCisKK29yZy5hbnRsci5ydW50aW1lLkJpdFNldC5wcm90b3R5cGUgPSB7CisgICAgLyoqCisgICAgICogQWRkIGVsIGludG8gdGhpcyBzZXQuCisgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVsIHRoZSBudW1iZXIgdG8gYWRkIHRvIHRoZSBzZXQuCisgICAgICovCisgICAgYWRkOiBmdW5jdGlvbihlbCkgeworICAgICAgICB2YXIgbiA9IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC53b3JkTnVtYmVyKGVsKTsKKyAgICAgICAgaWYgKG4gPj0gdGhpcy5iaXRzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhpcy5ncm93VG9JbmNsdWRlKGVsKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJpdHNbbl0gfD0gb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0LmJpdE1hc2soZWwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBBZGQgbXVsdGlwbGUgZWxlbWVudHMgaW50byB0aGlzIHNldC4KKyAgICAgKiBAcGFyYW0ge0FycmF5fG9yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIGJlIGFkZGVkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzZXQuCisgICAgICovCisgICAgYWRkQWxsOiBmdW5jdGlvbihlbGVtZW50cykgeworICAgICAgICB2YXIgb3RoZXIsCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgZTsKKworICAgICAgICBpZiAoIGVsZW1lbnRzIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0ICkgeworICAgICAgICAgICAgdGhpcy5vckluUGxhY2UoZWxlbWVudHMpOworICAgICAgICB9CisJCWVsc2UgaWYgKCBlbGVtZW50cyBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLkludGVydmFsU2V0ICkgeworCQkJb3RoZXIgPSBlbGVtZW50czsKKwkJCS8vIHdhbGsgc2V0IGFuZCBhZGQgZWFjaCBpbnRlcnZhbAorICAgICAgICAgICAgLyogQHRvZG8gYWZ0ZXIgaW1wbGVtZW50aW5nIGludGVydmFsc2V0CisJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvdGhlci5pbnRlcnZhbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQkJSW50ZXJ2YWwgSSA9IChJbnRlcnZhbCkgaXRlci5uZXh0KCk7CisJCQkJdGhpcy5vckluUGxhY2UoQml0U2V0LnJhbmdlKEkuYSxJLmIpKTsKKwkJCX0qLworCQl9IGVsc2UgaWYgKG9yZy5hbnRsci5sYW5nLmlzQXJyYXkoZWxlbWVudHMpKSB7CisgICAgCQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkgICAgCQllID0gZWxlbWVudHNbaV07CisJCSAgICAJdGhpcy5hZGQoZSk7CisgICAgCQl9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwl9LAorCisgICAgLyoqCisgICAgICogQ2xvbmUgdGhpcyBCaXRTZXQgYW5kIHRoZW4ge0BsaW5rICNhbmRJblBsYWNlfSB3aXRoIGEuCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9IGEgYSBiaXQgc2V0LgorICAgICAqIEByZXR1cm5zIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9CisgICAgICovCisgICAgYW5kOiBmdW5jdGlvbihhKSB7CisgICAgICAgIHZhciBzID0gdGhpcy5jbG9uZSgpOworICAgICAgICBzLmFuZEluUGxhY2UoYSk7CisgICAgICAgIHJldHVybiBzOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEgbG9naWNhbCBBTkQgb2YgdGhpcyB0YXJnZXQgQml0U2V0IHdpdGggdGhlIGFyZ3VtZW50IEJpdFNldC4KKyAgICAgKgorICAgICAqIFRoaXMgYml0IHNldCBpcyBtb2RpZmllZCBzbyB0aGF0IGVhY2ggYml0IGluIGl0IGhhcyB0aGUgdmFsdWUgdHJ1ZSBpZiAKKyAgICAgKiBhbmQgb25seSBpZiBpdCBib3RoIGluaXRpYWxseSBoYWQgdGhlIHZhbHVlIHRydWUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIAorICAgICAqIGJpdCBpbiB0aGUgYml0IHNldCBhcmd1bWVudCBhbHNvIGhhZCB0aGUgdmFsdWUgdHJ1ZS4gCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9IGEgYSBiaXQgc2V0LgorICAgICAqIEByZXR1cm5zIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9CisgICAgICovCisgICAgYW5kSW5QbGFjZTogZnVuY3Rpb24oYSkgeworICAgICAgICB2YXIgbWluID0gTWF0aC5taW4odGhpcy5iaXRzLmxlbmd0aCwgYS5iaXRzLmxlbmd0aCksCisgICAgICAgICAgICBpOworICAgICAgICBmb3IgKGkgPSBtaW4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgdGhpcy5iaXRzW2ldICY9IGEuYml0c1tpXTsKKyAgICAgICAgfQorICAgICAgICAvLyBjbGVhciBhbGwgYml0cyBpbiB0aGlzIG5vdCBwcmVzZW50IGluIGEgKGlmIHRoaXMgYmlnZ2VyIHRoYW4gYSkuCisgICAgICAgIGZvciAoaSA9IG1pbjsgaSA8IHRoaXMuYml0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGhpcy5iaXRzW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbGwgYml0cyBvciBhIHNwZWNpZmljIGJpdC4KKyAgICAgKgorICAgICAqIElmIG5vIGFyZ3VtZW50cyBnaXZlbiwgc2V0cyBhbGwgb2YgdGhlIGJpdHMgaW4gdGhpcyBCaXRTZXQgdG8gZmFsc2UuCisgICAgICogSWYgb25lIGFyZ3VtZW50IGdpdmVuLCBzZXRzIHRoZSBiaXQgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0ge051bWJlcn0gW2VsXSB0aGUgaW5kZXggb2YgdGhlIGJpdCB0byBiZSBjbGVhcmVkLgorICAgICAqLworICAgIGNsZWFyOiBmdW5jdGlvbihlbCkgeworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTApIHsKKyAgICAgICAgICAgIHZhciBpOworICAgICAgICAgICAgZm9yIChpID0gdGhpcy5iaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgdGhpcy5iaXRzW2ldID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBuID0gb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0LndvcmROdW1iZXIoZWwpOworICAgICAgICBpZiAobiA+PSB0aGlzLmJpdHMubGVuZ3RoKSB7CS8vIGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlCisgICAgICAgICAgICB0aGlzLmdyb3dUb0luY2x1ZGUoZWwpOworICAgICAgICB9CisgICAgICAgIHRoaXMuYml0c1tuXSAmPSB+b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0LmJpdE1hc2soZWwpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBDbG9uaW5nIHRoaXMgQml0U2V0IHByb2R1Y2VzIGEgbmV3IEJpdFNldCAgdGhhdCBpcyBlcXVhbCB0byBpdC4gCisgICAgICoKKyAgICAgKiBUaGUgY2xvbmUgb2YgdGhlIGJpdCBzZXQgaXMgYW5vdGhlciBiaXQgc2V0IHRoYXQgaGFzIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAgKiBiaXQgc2V0IHRvIHRydWUgYXMgdGhpcyBiaXQgc2V0LiAKKyAgICAgKiBAcmV0dXJucyB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fSBhIGNsb25lIG9mIHRoaXMgQml0U2V0LgorICAgICAqLworICAgIGNsb25lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGksIGxlbiwgYj1bXTsKKyAgICAgICAgZm9yIChpPTAsIGxlbj10aGlzLmJpdHMubGVuZ3RoOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICAgICBiW2ldID0gdGhpcy5iaXRzW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0KGIpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBvZiBzcGFjZSBhY3R1YWxseSBpbiB1c2UgYnkgdGhpcyBCaXRTZXQgdG8gCisgICAgICogcmVwcmVzZW50IGJpdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBUaGUgbWF4aW11bSBlbGVtZW50IGluIHRoZSBzZXQgaXMgdGhlIHNpemUgLSAxc3QgZWxlbWVudC4gCisgICAgICogQHJldHVybnMge051bWJlcn0gdGhlIG51bWJlciBvZiBiaXRzIGN1cnJlbnRseSBpbiB0aGlzIGJpdCBzZXQuCisgICAgICovCisgICAgc2l6ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBkZWcgPSAwLCBpLCB3b3JkLCBiaXQ7CisgICAgICAgIGZvciAoaSA9IHRoaXMuYml0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgd29yZCA9IHRoaXMuYml0c1tpXTsKKyAgICAgICAgICAgIGlmICh3b3JkICE9PSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChiaXQgPSBvcmcuYW50bHIucnVudGltZS5CaXRTZXQuQklUUyAtIDE7IGJpdCA+PSAwOyBiaXQtLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmQgJiAoMSA8PCBiaXQpKSAhPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVnKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZzsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhpcyBvYmplY3QgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRoZSByZXN1bHQgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IG51bGwgYW5kIGlzIGEKKyAgICAgKiBCaXRTZXQgb2JqZWN0IHRoYXQgaGFzIGV4YWN0bHkgdGhlIHNhbWUgc2V0IG9mIGJpdHMgc2V0IHRvIHRydWUgYXMKKyAgICAgKiB0aGlzIGJpdCBzZXQuIFRoYXQgaXMsIGZvciBldmVyeSBub25uZWdhdGl2ZSBpbnQgaW5kZXggaywKKyAgICAgKiA8cHJlPjxjb2RlPgorICAgICAqICgoQml0U2V0KW9iaikuZ2V0KGspID09IHRoaXMuZ2V0KGspCisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqIG11c3QgYmUgdHJ1ZS4gVGhlIGN1cnJlbnQgc2l6ZXMgb2YgdGhlIHR3byBiaXQgc2V0cyBhcmUgbm90IGNvbXBhcmVkLgorICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aC4KKyAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaWYgdGhlIG9iamVjdHMgYXJlIHRoZSBzYW1lOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikgeworICAgICAgICBpZiAoICFvdGhlciB8fCAhKG90aGVyIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0KSApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBvdGhlclNldCA9IG90aGVyLAorICAgICAgICAgICAgaSwKKyAgICAgICAgICAgIG4gPSBNYXRoLm1pbih0aGlzLmJpdHMubGVuZ3RoLCBvdGhlclNldC5iaXRzLmxlbmd0aCk7CisKKyAgICAgICAgLy8gZm9yIGFueSBiaXRzIGluIGNvbW1vbiwgY29tcGFyZQorICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmJpdHNbaV0gIT0gb3RoZXJTZXQuYml0c1tpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSBhbnkgZXh0cmEgYml0cyBhcmUgb2ZmCisKKyAgICAgICAgaWYgKHRoaXMuYml0cy5sZW5ndGggPiBuKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBuKzE7IGk8dGhpcy5iaXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuYml0c1tpXSAhPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG90aGVyU2V0LmJpdHMubGVuZ3RoID4gbikgeworICAgICAgICAgICAgZm9yIChpID0gbisxOyBpPG90aGVyU2V0LmJpdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXJTZXQuYml0c1tpXSAhPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEdyb3dzIHRoZSBzZXQgdG8gYSBsYXJnZXIgbnVtYmVyIG9mIGJpdHMuCisgICAgICogQHBhcmFtIHtOdW1iZXJ9IGJpdCBlbGVtZW50IHRoYXQgbXVzdCBmaXQgaW4gc2V0CisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBncm93VG9JbmNsdWRlOiBmdW5jdGlvbihiaXQpIHsKKyAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1heCh0aGlzLmJpdHMubGVuZ3RoIDw8IDEsIG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5udW1Xb3Jkc1RvSG9sZChiaXQpKSwKKyAgICAgICAgICAgIG5ld2JpdHMgPSBbXSwgLy9uZXcgQXJyYXkobmV3U2l6ZSksCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgbGVuOworICAgICAgICBmb3IgKGk9MCwgbGVuPXRoaXMuYml0cy5sZW5ndGg7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgIG5ld2JpdHNbaV0gPSB0aGlzLmJpdHNbaV07CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iaXRzID0gbmV3Yml0czsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGJpdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgYml0IHdpdGggdGhlIGluZGV4IGVsIGlzIGN1cnJlbnRseSBzZXQgCisgICAgICogaW4gdGhpcyBCaXRTZXQ7IG90aGVyd2lzZSwgdGhlIHJlc3VsdCBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0ge051bWJlcn0gZWwgdGhlIGJpdCBpbmRleC4KKyAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIHZhbHVlIG9mIHRoZSBiaXQgd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAqLworICAgIG1lbWJlcjogZnVuY3Rpb24oZWwpIHsKKyAgICAgICAgdmFyIG4gPSBvcmcuYW50bHIucnVudGltZS5CaXRTZXQud29yZE51bWJlcihlbCk7CisgICAgICAgIGlmIChuID49IHRoaXMuYml0cy5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHJldHVybiAodGhpcy5iaXRzW25dICYgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0LmJpdE1hc2soZWwpKSAhPT0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJpdCB0aGF0IGlzIHNldCB0byB0cnVlLgorICAgICAqIElmIG5vIHN1Y2ggYml0IGV4aXN0cyB0aGVuIC0xIGlzIHJldHVybmVkLgorICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzZXQgYml0LgorICAgICAqLworICAgIGdldFNpbmdsZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICh0aGlzLmJpdHMubGVuZ3RoIDw8IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5MT0dfQklUUyk7IGkrKykgeworICAgICAgICAgICAgaWYgKHRoaXMubWVtYmVyKGkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOyAvL0xhYmVsLklOVkFMSUQ7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIEJpdFNldCBjb250YWlucyBubyBiaXRzIHRoYXQgYXJlIHNldCB0byB0cnVlLgorICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIEJpdFNldCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpc05pbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBpOworICAgICAgICBmb3IgKGkgPSB0aGlzLmJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmJpdHNbaV0gIT09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIElmIGEgYml0IHNldCBhcmd1bWVudCBpcyBwYXNzZWQgcGVyZm9ybXMgYSB7QGxpbmsgI3N1YnRyYWN0fSBvZiB0aGlzIGJpdAorICAgICAqIHNldCB3aXRoIHRoZSBhcmd1bWVudCBiaXQgc2V0LiAgSWYgbm8gYXJndW1lbnQgaXMgcGFzc2VkLCBjbG9uZSB0aGlzIGJpdAorICAgICAqIHNldCBhbmQge0BsaW5rICNub3RJblBsYWNlfS4KKyAgICAgKiBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gW3NldF0KKyAgICAgKiBAcmV0dXJucyB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fQorICAgICAqLworICAgIGNvbXBsZW1lbnQ6IGZ1bmN0aW9uKHNldCkgeworICAgICAgICBpZiAoc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gc2V0LnN1YnRyYWN0KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmNsb25lKCk7CisgICAgICAgICAgICBzLm5vdEluUGxhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHNldHMgYWxsIGJpdHMgdG8gdGhlIGNvbXBsZW1lbnQgb2YgdGhlaXIKKyAgICAgKiBjdXJyZW50IHZhbHVlcy4gIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgc2V0cyBlYWNoIGJpdCBmcm9tIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiB0aGUgYml0IHNldCB0byBpbmRleDEgKGluY2x1c2l2ZSkgdG8gdGhlIGNvbXBsZW1lbnQgb2YgaXRzCisgICAgICogY3VycmVudCB2YWx1ZS4gIElmIHR3byBhcmd1bWVudHMgYXJlIHBhc3NlZCBzZXRzIGVhY2ggYml0IGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIGluZGV4MSAoaW5jbHVzaXZlKSB0byB0aGUgc2VwY2lmaWVkIGluZGV4MiAoaW5jbHVzaXZlKSB0byB0aGUKKyAgICAgKiBjb21wbGVtZW50IG9mIGl0cyBjdXJyZW50IHZhbHVlLgorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleDEKKyAgICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXgyCisgICAgICovCisgICAgbm90SW5QbGFjZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBtaW5CaXQsIG1heEJpdCwgaSwgbjsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0wKSB7CisgICAgICAgICAgICBmb3IgKGkgPSB0aGlzLmJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICB0aGlzLmJpdHNbaV0gPSB+dGhpcy5iaXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0xKSB7CisgICAgICAgICAgICAgICAgbWluQml0ID0gMDsKKyAgICAgICAgICAgICAgICBtYXhCaXQgPSBhcmd1bWVudHNbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pbkJpdCA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgICAgICAgICBtYXhCaXQgPSBhcmd1bWVudHNbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJvb20gZm9yIG1heEJpdAorICAgICAgICAgICAgdGhpcy5ncm93VG9JbmNsdWRlKG1heEJpdCk7CisgICAgICAgICAgICBmb3IgKGkgPSBtaW5CaXQ7IGkgPD0gbWF4Qml0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBuID0gb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0LndvcmROdW1iZXIoaSk7CisgICAgICAgICAgICAgICAgdGhpcy5iaXRzW25dIF49IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5iaXRNYXNrKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBsb2dpY2FsIE9SIG9mIHRoaXMgYml0IHNldCB3aXRoIHRoZSBiaXQgc2V0IGFyZ3VtZW50LgorICAgICAqIElmIG5vIGFyZ3VtZW50IGlzIHBhc3NlZCwgcmV0dXJuIHRoaXMgYml0IHNldC4gIE90aGVyd2lzZSBhIGNsb25lIG9mCisgICAgICogdGhpcyBiaXQgc2V0IGlzIG1vZGlmaWVkIHNvIHRoYXQgYSBiaXQgaW4gaXQgaGFzIHRoZSB2YWx1ZSB0cnVlIGlmIGFuZAorICAgICAqIG9ubHkgaWYgaXQgZWl0aGVyIGFscmVhZHkgaGFkIHRoZSB2YWx1ZSB0cnVlIG9yIHRoZSBjb3JyZXNwb25kaW5nIGJpdAorICAgICAqIGluIHRoZSBiaXQgc2V0IGFyZ3VtZW50IGhhcyB0aGUgdmFsdWUgdHJ1ZS4KKyAgICAgKiBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gW2FdIGEgYml0IHNldC4KKyAgICAgKiBAcmV0dXJucyB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fQorICAgICAqLworICAgIG9yOiBmdW5jdGlvbihhKSB7CisJCWlmICggIWEgKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorICAgICAgICB2YXIgcyA9IHRoaXMuY2xvbmUoKTsKKyAgICAgICAgcy5vckluUGxhY2UoYSk7CisgICAgICAgIHJldHVybiBzOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGxvZ2ljYWwge0BsaW5rICNvcn0gaW4gcGxhY2UuCisgICAgICogQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9IFthXQorICAgICAqIEByZXR1cm5zIHtvcmcuYW50bHIucnVudGltZS5CaXRTZXR9CisgICAgICovCisgICAgb3JJblBsYWNlOiBmdW5jdGlvbihhKSB7CisJCWlmICggIWEgKSB7CisJCQlyZXR1cm47CisJCX0KKyAgICAgICAgLy8gSWYgdGhpcyBpcyBzbWFsbGVyIHRoYW4gYSwgZ3JvdyB0aGlzIGZpcnN0CisgICAgICAgIGlmIChhLmJpdHMubGVuZ3RoID4gdGhpcy5iaXRzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhpcy5zZXRTaXplKGEuYml0cy5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbih0aGlzLmJpdHMubGVuZ3RoLCBhLmJpdHMubGVuZ3RoKSwKKyAgICAgICAgICAgIGk7CisgICAgICAgIGZvciAoaSA9IG1pbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICB0aGlzLmJpdHNbaV0gfD0gYS5iaXRzW2ldOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJpdCBzcGVjaWZpZWQgYnkgdGhlIGluZGV4IHRvIGZhbHNlLgorICAgICAqIEBwYXJhbSB7TnVtYmVyfSBiaXRJbmRleCB0aGUgaW5kZXggb2YgdGhlIGJpdCB0byBiZSBjbGVhcmVkLgorICAgICAqLworICAgIHJlbW92ZTogZnVuY3Rpb24oZWwpIHsKKyAgICAgICAgdmFyIG4gPSBvcmcuYW50bHIucnVudGltZS5CaXRTZXQud29yZE51bWJlcihlbCk7CisgICAgICAgIGlmIChuID49IHRoaXMuYml0cy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRoaXMuZ3Jvd1RvSW5jbHVkZShlbCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5iaXRzW25dICY9IH5vcmcuYW50bHIucnVudGltZS5CaXRTZXQuYml0TWFzayhlbCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIEdyb3dzIHRoZSBpbnRlcm5hbCBiaXRzIGFycmF5IHRvIGluY2x1ZGUgYXQgbGVhc3QgbndvcmRzIG51bWJlcnMuCisgICAgICogQHBhcmFtIHtOdW1iZXJ9IG53b3JkcyBob3cgbWFueSB3b3JkcyB0aGUgbmV3IHNldCBzaG91bGQgYmUKKyAgICAgKiBAcHJpdmF0ZQorICAgICAqLworICAgIHNldFNpemU6IGZ1bmN0aW9uKG53b3JkcykgeworICAgICAgICB2YXIgbiA9IG53b3JkcyAtIHRoaXMuYml0cy5sZW5ndGg7CisgICAgICAgIHdoaWxlIChuPj0wKSB7CisgICAgICAgICAgICB0aGlzLmJpdHMucHVzaCgwKTsKKyAgICAgICAgICAgIG4tLTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBjYXBhYmxlIG9mIGJlaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgYml0IHNldAorICAgICAqIGdpdmVuIGl0cyBjdXJyZW50IHNpemUuCisgICAgICogQHJldHVybnMge051bWJlcn0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgbW9tZW50LgorICAgICAqIEBwcml2YXRlCisgICAgICovCisgICAgbnVtQml0czogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJpdHMubGVuZ3RoIDw8IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5MT0dfQklUUzsgLy8gbnVtIHdvcmRzICogYml0cyBwZXIgd29yZAorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaG93IG11Y2ggc3BhY2UgaXMgYmVpbmcgdXNlZCBieSB0aGUgYml0cyBhcnJheSBub3QKKyAgICAgKiBob3cgbWFueSBhY3R1YWxseSBoYXZlIG1lbWJlciBiaXRzIG9uLgorICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBsZW5ndGggb2YgdGhlIGludGVybmFsIGJpdHMgYXJyYXkuCisgICAgICogQHByaXZhdGUKKyAgICAgKi8KKyAgICBsZW5ndGhJbkxvbmdXb3JkczogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJpdHMubGVuZ3RoOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGJpdCBzZXQgY29udGFpbmVkIHdpdGhpbiBhPworICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fSBhIGJpdCBzZXQKKyAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiBhIGlzIGEgc3Vic2V0IG9mIHRoaXMgYml0IHNldC4KKyAgICAgKi8KKyAgICBzdWJzZXQ6IGZ1bmN0aW9uKGEpIHsKKyAgICAgICAgaWYgKCFhKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICByZXR1cm4gdGhpcy5hbmQoYSkuZXF1YWxzKHRoaXMpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTdWJ0cmFjdCB0aGUgZWxlbWVudHMgb2YgdGhlIGFyZ3VtZW50IGJpdCBzZXQgZnJvbSB0aGlzIGJpdCBzZXQgaW4gcGxhY2UuCisgICAgICogVGhhdCBpcywgZm9yIGVhY2ggc2V0IGJpdCBpbiB0aGUgYXJndW1lbnQgYml0IHNldCwgc2V0IHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogYml0IGluIHRoaXMgYml0IHNldCB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0ge29yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gYSBiaXQgc2V0LgorICAgICAqLworICAgIHN1YnRyYWN0SW5QbGFjZTogZnVuY3Rpb24oYSkgeworICAgICAgICBpZiAoIWEpIHsgcmV0dXJuOyB9CisgICAgICAgIC8vIGZvciBhbGwgd29yZHMgb2YgJ2EnLCB0dXJuIG9mZiBjb3JyZXNwb25kaW5nIGJpdHMgb2YgJ3RoaXMnCisgICAgICAgIHZhciBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5iaXRzLmxlbmd0aCAmJiBpIDwgYS5iaXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0aGlzLmJpdHNbaV0gJj0gfmEuYml0c1tpXTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGEge0BsaW5rICNzdWJ0cmFjdEluUGxhY2V9IG9uIGEgY2xvbmUgb2YgdGhpcyBiaXQgc2V0LgorICAgICAqIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0fSBhIGJpdCBzZXQuCisgICAgICogQHJldHVybnMge29yZy5hbnRsci5ydW50aW1lLkJpdFNldH0gdGhlIG5ldyBiaXQgc2V0LgorICAgICAqLworICAgIHN1YnRyYWN0OiBmdW5jdGlvbihhKSB7CisgICAgICAgIGlmICghYSB8fCAhKGEgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5CaXRTZXQpKSB7IHJldHVybiBudWxsOyB9CisKKyAgICAgICAgdmFyIHMgPSB0aGlzLmNsb25lKCk7CisgICAgICAgIHMuc3VidHJhY3RJblBsYWNlKGEpOworICAgICAgICByZXR1cm4gczsKKyAgICB9LAorCisgICAgLyogYW50bHItamF2YSBuZWVkcyB0aGlzIHRvIG1ha2UgaXRzIGNsYXNzIGhpZXJhcmNoeSBoYXBweSAuIC4gLgorICAgIHRvTGlzdDogZnVuY3Rpb24oKSB7CisJCXRocm93IG5ldyBFcnJvcigiQml0U2V0LnRvTGlzdCgpIHVuaW1wbGVtZW50ZWQiKTsKKwl9LAorICAgICovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBpbmRleGVzIG9mIGVhY2ggYml0IHNldCBpbiB0aGlzIGJpdCBzZXQuCisgICAgICogQHJldHVybnMge0FycmF5fQorICAgICAqLworICAgIHRvQXJyYXk6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgZWxlbXMgPSBbXSwgLy9uZXcgQXJyYXkodGhpcy5zaXplKCkpLAorICAgICAgICAgICAgaSwKKyAgICAgICAgICAgIGVuID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICh0aGlzLmJpdHMubGVuZ3RoIDw8IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5MT0dfQklUUyk7IGkrKykgeworICAgICAgICAgICAgaWYgKHRoaXMubWVtYmVyKGkpKSB7CisgICAgICAgICAgICAgICAgZWxlbXNbZW4rK10gPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtczsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiaXQgc2V0LgorICAgICAqIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgYW4gYXJyYXkgb2YgbnVtYmVycywgZWFjaCByZXByZXNlbnRpbmcgMzIgYml0cy4KKyAgICAgKiBAcmV0dXJucyB7QXJyYXl9CisgICAgICovCisgICAgdG9QYWNrZWRBcnJheTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJpdHM7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiaXQgc2V0LgorICAgICAqIDxwPkZvciBldmVyeSBpbmRleCBmb3Igd2hpY2ggdGhpcyBCaXRTZXQgY29udGFpbnMgYSBiaXQgaW4gdGhlIHNldCBzdGF0ZSwKKyAgICAgKiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGF0IGluZGV4IGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCisgICAgICogU3VjaCBpbmRpY2VzIGFyZSBsaXN0ZWQgaW4gb3JkZXIgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCwgc2VwYXJhdGVkIGJ5CisgICAgICogIiwgIiAoYSBjb21tYSBhbmQgYSBzcGFjZSkgYW5kIHN1cnJvdW5kZWQgYnkgYnJhY2VzLCByZXN1bHRpbmcgaW4gdGhlCisgICAgICogdXN1YWwgbWF0aGVtYXRpY2FsIG5vdGF0aW9uIGZvciBhIHNldCBvZiBpbnRlZ2Vycy48L3A+CisgICAgICogCisgICAgICogPHA+SWYgYSBncmFtbWFyIGcgaXMgcGFzc2VkLCBwcmludCBnLmdldFRva2VuRGlzcGxheU5hbWUoaSkgZm9yIGVhY2ggc2V0CisgICAgICogaW5kZXggaW5zdGVhZCBvZiB0aGUgbnVtZXJpY2FsIGluZGV4LjwvcD4KKyAgICAgKgorICAgICAqIDw+SWYgdHdvIGFyZ3VtZW50cyBhcmUgcGFzc2VkLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkIGFzIGEgY3VzdG9tCisgICAgICogc2VwYXJhdG9yIHN0cmluZy4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYW4gYXJyYXkgd2hvc2UgaS10aCBlbGVtZW50CisgICAgICogd2lsbCBiZSBhZGRlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaXMgc2V0LjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gW2FyZzFdIGFuIE9iamVjdCB3aXRoIGZ1bmN0aW9uIHByb3BlcnR5CisgICAgICogICAgICBnZXRUb2tlbkRpc3BhbHlOYW1lIG9yIGEgU3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgbGlzdAorICAgICAqICAgICAgc2VwYXJhdG9yLgorICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2b2NhYnVsYXJ5XSBhcnJheSBmcm9tIHdoaWNoIHRoZSBpLXRoIHZhbHVlIHdpbGwgYmUKKyAgICAgKiAgICAgIGRyYXduIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQuICBNdXN0IHBhc3MgYSBzdHJpbmcgYXMgdGhlCisgICAgICogICAgICBmaXJzdCBhcmd1bWVudCBpZiB1c2luZyB0aGlzIG9wdGlvbi4KKyAgICAgKiBAcmV0dXJuIEEgY29tbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcworICAgICAqLworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0wKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZzEobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNTdHJpbmcoYXJndW1lbnRzWzBdKSkgeworICAgICAgICAgICAgICAgIGlmICghb3JnLmFudGxyLmxhbmcuaXNWYWx1ZShhcmd1bWVudHNbMV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nMShudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZzIoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcxKGFyZ3VtZW50c1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGEgYml0IHNldCBpbnRvIGEgc3RyaW5nIGJ5IGZvcm1hdHRpbmcgZWFjaCBlbGVtZW50IGFzIGFuCisgICAgICogaW50ZWdlciBzZXBhcmF0b3IgVGhlIHN0cmluZyB0byBwdXQgaW4gYmV0d2VlbiBlbGVtZW50cworICAgICAqIEBwcml2YXRlCisgICAgICogQHJldHVybiBBIGNvbW1tYS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMKKyAgICAgKi8KKyAgICB0b1N0cmluZzE6IGZ1bmN0aW9uKGcpIHsKKyAgICAgICAgdmFyIGJ1ZiA9ICJ7IiwKKyAgICAgICAgICAgIHNlcGFyYXRvciA9ICIsIiwKKyAgICAgICAgICAgIGksCisJCSAgICBoYXZlUHJpbnRlZEFuRWxlbWVudCA9IGZhbHNlOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAodGhpcy5iaXRzLmxlbmd0aCA8PCBvcmcuYW50bHIucnVudGltZS5CaXRTZXQuTE9HX0JJVFMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0aGlzLm1lbWJlcihpKSkgeworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBoYXZlUHJpbnRlZEFuRWxlbWVudCApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IHNlcGFyYXRvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBnICkgeworICAgICAgICAgICAgICAgICAgICBidWYgKz0gZy5nZXRUb2tlbkRpc3BsYXlOYW1lKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IGkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJaGF2ZVByaW50ZWRBbkVsZW1lbnQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYgKyAifSI7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGVyZSBpbnN0ZWFkIG9mIGludGVnZXIgZWxlbWVudHMsIHRoZQorICAgICAqIGl0aCBlbGVtZW50IG9mIHZvY2FidWxhcnkgaXMgZGlzcGxheWVkIGluc3RlYWQuICBWb2NhYnVsYXJ5IGlzIGEgVmVjdG9yCisgICAgICogb2YgU3RyaW5ncy4KKyAgICAgKiBzZXBhcmF0b3IgVGhlIHN0cmluZyB0byBwdXQgaW4gYmV0d2VlbiBlbGVtZW50cworICAgICAqIEBwcml2YXRlCisgICAgICogQHJldHVybiBBIGNvbW1tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgICAqLworICAgIHRvU3RyaW5nMjogZnVuY3Rpb24oc2VwYXJhdG9yLCB2b2NhYnVsYXJ5KSB7CisgICAgICAgIHZhciBzdHIgPSAiIiwKKyAgICAgICAgICAgIGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAodGhpcy5iaXRzLmxlbmd0aCA8PCBvcmcuYW50bHIucnVudGltZS5CaXRTZXQuTE9HX0JJVFMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0aGlzLm1lbWJlcihpKSkgeworICAgICAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdHIgKz0gc2VwYXJhdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA+PSB2b2NhYnVsYXJ5LnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBzdHIgKz0gIiciICsgaSArICInIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIW9yZy5hbnRsci5sYW5nLmlzVmFsdWUodm9jYWJ1bGFyeS5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSAiJyIgKyBpICsgIiciOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9IHZvY2FidWxhcnkuZ2V0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyOworICAgIH0KK307CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9DaGFyU3RyZWFtLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ2hhclN0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMmRmNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ2hhclN0cmVhbS5qcwpAQCAtMCwwICsxLDIxIEBACisvKioKKyAqIEEgc291cmNlIG9mIGNoYXJhY3RlcnMgZm9yIGFuIEFOVExSIGxleGVyLgorICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBvbmUgb2YgaXRzIHN1YmNsYXNzZXMuCisgKiBAY2xhc3MKKyAqIEBleHRlbmRzIG9yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbQorICovCitvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtID0gZnVuY3Rpb24oKSB7fTsKK29yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbSA9IGZ1bmN0aW9uKCkge307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbSk7ICAKKworb3JnLmFudGxyLmxhbmcuYXVnbWVudE9iamVjdChvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtLAorLyoqIEBsZW5kcyBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtICovCit7CisgICAgLyoqCisgICAgICogVG9rZW4gdHlwZSBvZiB0aGUgRU9GIGNoYXJhY3Rlci4KKyAgICAgKiBAdHlwZSBOdW1iZXIKKyAgICAgKi8KKyAgICBFT0Y6IC0xCit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW4uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQ4YmNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuLmpzCkBAIC0wLDAgKzEsMTQ3IEBACitvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbiA9IGZ1bmN0aW9uKCkgeworICAgIHZhciBvbGRUb2tlbjsKKworICAgIHRoaXMuY2hhclBvc2l0aW9uSW5MaW5lID0gLTE7IC8vIHNldCB0byBpbnZhbGlkIHBvc2l0aW9uCisgICAgdGhpcy5jaGFubmVsID0gMDsgLy8gb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW4uREVGQVVMVF9DSEFOTkVMCisgICAgdGhpcy5pbmRleCA9IC0xOworCisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgeworICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoYXJndW1lbnRzWzBdKSkgeworICAgICAgICAgICAgdGhpcy50eXBlID0gYXJndW1lbnRzWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2xkVG9rZW4gPSBhcmd1bWVudHNbMF07CisgICAgICAgICAgICB0aGlzLnRleHQgPSBvbGRUb2tlbi5nZXRUZXh0KCk7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSBvbGRUb2tlbi5nZXRUeXBlKCk7CisgICAgICAgICAgICB0aGlzLmxpbmUgPSBvbGRUb2tlbi5nZXRMaW5lKCk7CisgICAgICAgICAgICB0aGlzLmluZGV4ID0gb2xkVG9rZW4uZ2V0VG9rZW5JbmRleCgpOworICAgICAgICAgICAgdGhpcy5jaGFyUG9zaXRpb25JbkxpbmUgPSBvbGRUb2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IG9sZFRva2VuLmdldENoYW5uZWwoKTsKKyAgICAgICAgICAgIGlmICggb2xkVG9rZW4gaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbiApIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0ID0gb2xkVG9rZW4uc3RhcnQ7CisgICAgICAgICAgICAgICAgdGhpcy5zdG9wID0gb2xkVG9rZW4uc3RvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7CisgICAgICAgIHRoaXMudHlwZSA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgdGhpcy50ZXh0ID0gYXJndW1lbnRzWzFdOworICAgICAgICB0aGlzLmNoYW5uZWwgPSAwOyAvLyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbi5ERUZBVUxUX0NIQU5ORUwKKyAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gNSkgeworICAgICAgICB0aGlzLmlucHV0ID0gYXJndW1lbnRzWzBdOworICAgICAgICB0aGlzLnR5cGUgPSBhcmd1bWVudHNbMV07CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IGFyZ3VtZW50c1syXTsKKyAgICAgICAgdGhpcy5zdGFydCA9IGFyZ3VtZW50c1szXTsKKyAgICAgICAgdGhpcy5zdG9wID0gYXJndW1lbnRzWzRdOworICAgIH0KK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS5Ub2tlbiwKK3sKKyAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsKKyAgICB9LAorCisgICAgc2V0TGluZTogZnVuY3Rpb24obGluZSkgeworICAgICAgICB0aGlzLmxpbmUgPSBsaW5lOworICAgIH0sCisKKyAgICBnZXRUZXh0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCBvcmcuYW50bHIubGFuZy5pc1N0cmluZyh0aGlzLnRleHQpICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICF0aGlzLmlucHV0ICkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcodGhpcy5zdGFydCx0aGlzLnN0b3ApOworICAgICAgICByZXR1cm4gdGhpcy50ZXh0OworICAgIH0sCisKKyAgICAvKiogT3ZlcnJpZGUgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4uICBnZXRUZXh0KCkgd2lsbCByZXR1cm4gdGhpcyB0ZXh0CisgICAgICogIHJhdGhlciB0aGFuIHB1bGxpbmcgZnJvbSB0aGUgYnVmZmVyLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbWVhbgorICAgICAqICB0aGF0IHN0YXJ0L3N0b3AgaW5kZXhlcyBhcmUgbm90IHZhbGlkLiAgSXQgbWVhbnMgdGhhdCB0aGF0IGlucHV0CisgICAgICogIHdhcyBjb252ZXJ0ZWQgdG8gYSBuZXcgc3RyaW5nIGluIHRoZSB0b2tlbiBvYmplY3QuCisgICAgICovCisgICAgc2V0VGV4dDogZnVuY3Rpb24odGV4dCkgeworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgIH0sCisKKyAgICBnZXRMaW5lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZTsKKyAgICB9LAorCisgICAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2hhclBvc2l0aW9uSW5MaW5lOworICAgIH0sCisKKyAgICBzZXRDaGFyUG9zaXRpb25JbkxpbmU6IGZ1bmN0aW9uKGNoYXJQb3NpdGlvbkluTGluZSkgeworICAgICAgICB0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IGNoYXJQb3NpdGlvbkluTGluZTsKKyAgICB9LAorCisgICAgZ2V0Q2hhbm5lbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWw7CisgICAgfSwKKworICAgIHNldENoYW5uZWw6IGZ1bmN0aW9uKGNoYW5uZWwpIHsKKyAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICB9LAorCisgICAgc2V0VHlwZTogZnVuY3Rpb24odHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0sCisKKyAgICBnZXRTdGFydEluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQ7CisgICAgfSwKKworICAgIHNldFN0YXJ0SW5kZXg6IGZ1bmN0aW9uKHN0YXJ0KSB7CisgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB9LAorCisgICAgZ2V0U3RvcEluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RvcDsKKyAgICB9LAorCisgICAgc2V0U3RvcEluZGV4OiBmdW5jdGlvbihzdG9wKSB7CisgICAgICAgIHRoaXMuc3RvcCA9IHN0b3A7CisgICAgfSwKKworICAgIGdldFRva2VuSW5kZXg6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbmRleDsKKyAgICB9LAorCisgICAgc2V0VG9rZW5JbmRleDogZnVuY3Rpb24oaW5kZXgpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgIH0sCisKKyAgICBnZXRJbnB1dFN0cmVhbTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlucHV0OworICAgIH0sCisKKyAgICBzZXRJbnB1dFN0cmVhbTogZnVuY3Rpb24oaW5wdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0sCisKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBjaGFubmVsU3RyID0gIiI7CisgICAgICAgIGlmICggdGhpcy5jaGFubmVsPjAgKSB7CisgICAgICAgICAgICBjaGFubmVsU3RyPSIsY2hhbm5lbD0iK3RoaXMuY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICB2YXIgdHh0ID0gdGhpcy5nZXRUZXh0KCk7CisgICAgICAgIGlmICggIW9yZy5hbnRsci5sYW5nLmlzTnVsbCh0eHQpICkgeworICAgICAgICAgICAgdHh0ID0gdHh0LnJlcGxhY2UoL1xuL2csIlxcXFxuIik7CisgICAgICAgICAgICB0eHQgPSB0eHQucmVwbGFjZSgvXHIvZywiXFxcXHIiKTsKKyAgICAgICAgICAgIHR4dCA9IHR4dC5yZXBsYWNlKC9cdC9nLCJcXFxcdCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdHh0ID0gIjxubyB0ZXh0PiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJbQCIrdGhpcy5nZXRUb2tlbkluZGV4KCkrIiwiK3RoaXMuc3RhcnQrIjoiK3RoaXMuc3RvcCsiPSciK3R4dCsiJyw8Iit0aGlzLnR5cGUrIj4iK2NoYW5uZWxTdHIrIiwiK3RoaXMubGluZSsiOiIrdGhpcy5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSsiXSI7CisgICAgfQorfSk7CisKKy8qIE1vbmtleSBwYXRjaCBUb2tlbiBzdGF0aWMgdmFycyB0aGF0IGRlcGVuZCBvbiBDb21tb25Ub2tlbi4gKi8KK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3Qob3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4sIHsKKyAgICBFT0ZfVE9LRU46IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbihvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtLkVPRiksCisgICAgSU5WQUxJRF9UT0tFTjogbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKDApLAorICAgIFNLSVBfVE9LRU46IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbigwKQorfSwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuU3RyZWFtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhZjU2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5qcwpAQCAtMCwwICsxLDMyMyBAQAorLyoqIFRoZSBtb3N0IGNvbW1vbiBzdHJlYW0gb2YgdG9rZW5zIGlzIG9uZSB3aGVyZSBldmVyeSB0b2tlbiBpcyBidWZmZXJlZCB1cAorICogIGFuZCB0b2tlbnMgYXJlIHByZWZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKKyAqICBzZWUgdGhlc2UgdG9rZW5zIGFuZCBjYW5ub3QgY2hhbmdlIHRoZSBmaWx0ZXIgY2hhbm5lbCBudW1iZXIgZHVyaW5nIHRoZQorICogIHBhcnNlKS4KKyAqCisgKiAgVE9ETzogaG93IHRvIGFjY2VzcyB0aGUgZnVsbCB0b2tlbiBzdHJlYW0/ICBIb3cgdG8gdHJhY2sgYWxsIHRva2VucyBtYXRjaGVkIHBlciBydWxlPworICovCitvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbSA9IGZ1bmN0aW9uKHRva2VuU291cmNlLCBjaGFubmVsKSB7CisgICAgdGhpcy5wID0gLTE7CisgICAgdGhpcy5jaGFubmVsID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uREVGQVVMVF9DSEFOTkVMOworICAgIHRoaXMudl9kaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyA9IGZhbHNlOworCisgICAgdGhpcy50b2tlbnMgPSBbXTsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CisgICAgICAgIHRoaXMudG9rZW5Tb3VyY2UgPSB0b2tlblNvdXJjZTsKKyAgICB9Cit9Oworb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5TdHJlYW0gPSBmdW5jdGlvbigpIHt9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQob3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5TdHJlYW0sICAgICAgIAoreworICAgIC8qKiBSZXNldCB0aGlzIHRva2VuIHN0cmVhbSBieSBzZXR0aW5nIGl0cyB0b2tlbiBzb3VyY2UuICovCisgICAgc2V0VG9rZW5Tb3VyY2U6IGZ1bmN0aW9uKHRva2VuU291cmNlKSB7CisgICAgICAgIHRoaXMudG9rZW5Tb3VyY2UgPSB0b2tlblNvdXJjZTsKKyAgICAgICAgdGhpcy50b2tlbnMgPSBbXTsKKyAgICAgICAgdGhpcy5wID0gLTE7CisgICAgICAgIHRoaXMuY2hhbm5lbCA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICB9LAorCisgICAgLyoqIExvYWQgYWxsIHRva2VucyBmcm9tIHRoZSB0b2tlbiBzb3VyY2UgYW5kIHB1dCBpbiB0b2tlbnMuCisgICAgICogIFRoaXMgaXMgZG9uZSB1cG9uIGZpcnN0IExUIHJlcXVlc3QgYmVjYXVzZSB5b3UgbWlnaHQgd2FudCB0bworICAgICAqICBzZXQgc29tZSB0b2tlbiB0eXBlIC8gY2hhbm5lbCBvdmVycmlkZXMgYmVmb3JlIGZpbGxpbmcgYnVmZmVyLgorICAgICAqLworICAgIGZpbGxCdWZmZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaW5kZXggPSAwLAorICAgICAgICAgICAgdCA9IHRoaXMudG9rZW5Tb3VyY2UubmV4dFRva2VuKCksCisgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgY2hhbm5lbEk7CisgICAgICAgIHdoaWxlICggb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0KSAmJiAKKyAgICAgICAgICAgICAgICB0LmdldFR5cGUoKSE9b3JnLmFudGxyLnJ1bnRpbWUuQ2hhclN0cmVhbS5FT0YgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNjYXJkID0gZmFsc2U7CisgICAgICAgICAgICAvLyBpcyB0aGVyZSBhIGNoYW5uZWwgb3ZlcnJpZGUgZm9yIHRva2VuIHR5cGU/CisgICAgICAgICAgICBpZiAoIHRoaXMuY2hhbm5lbE92ZXJyaWRlTWFwICkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxJID0gdGhpcy5jaGFubmVsT3ZlcnJpZGVNYXBbdC5nZXRUeXBlKCldOworICAgICAgICAgICAgICAgIGlmICggb3JnLmFudGxyLmxhbmcuaXNWYWx1ZShjaGFubmVsSSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHQuc2V0Q2hhbm5lbChjaGFubmVsSSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCB0aGlzLmRpc2NhcmRTZXQgJiYgdGhpcy5kaXNjYXJkU2V0W3QuZ2V0VHlwZSgpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzY2FyZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggdGhpcy52X2Rpc2NhcmRPZmZDaGFubmVsVG9rZW5zICYmCisgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q2hhbm5lbCgpIT10aGlzLmNoYW5uZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhZGlzY2FyZCApICAgIHsKKyAgICAgICAgICAgICAgICB0LnNldFRva2VuSW5kZXgoaW5kZXgpOworICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godCk7CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSB0aGlzLnRva2VuU291cmNlLm5leHRUb2tlbigpOworICAgICAgICB9CisgICAgICAgIC8vIGxlYXZlIHAgcG9pbnRpbmcgYXQgZmlyc3QgdG9rZW4gb24gY2hhbm5lbAorICAgICAgICB0aGlzLnAgPSAwOworICAgICAgICB0aGlzLnAgPSB0aGlzLnNraXBPZmZUb2tlbkNoYW5uZWxzKHRoaXMucCk7CisgICAgfSwKKworICAgIC8qKiBNb3ZlIHRoZSBpbnB1dCBwb2ludGVyIHRvIHRoZSBuZXh0IGluY29taW5nIHRva2VuLiAgVGhlIHN0cmVhbQorICAgICAqICBtdXN0IGJlY29tZSBhY3RpdmUgd2l0aCBMVCgxKSBhdmFpbGFibGUuICBjb25zdW1lKCkgc2ltcGx5CisgICAgICogIG1vdmVzIHRoZSBpbnB1dCBwb2ludGVyIHNvIHRoYXQgTFQoMSkgcG9pbnRzIGF0IHRoZSBuZXh0CisgICAgICogIGlucHV0IHN5bWJvbC4gQ29uc3VtZSBhdCBsZWFzdCBvbmUgdG9rZW4uCisgICAgICoKKyAgICAgKiAgV2FsayBwYXN0IGFueSB0b2tlbiBub3Qgb24gdGhlIGNoYW5uZWwgdGhlIHBhcnNlciBpcyBsaXN0ZW5pbmcgdG8uCisgICAgICovCisgICAgY29uc3VtZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggdGhpcy5wPHRoaXMudG9rZW5zLmxlbmd0aCApIHsKKyAgICAgICAgICAgIHRoaXMucCsrOworICAgICAgICAgICAgdGhpcy5wID0gdGhpcy5za2lwT2ZmVG9rZW5DaGFubmVscyh0aGlzLnApOyAvLyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIEdpdmVuIGEgc3RhcnRpbmcgaW5kZXgsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uLWNoYW5uZWwKKyAgICAgKiAgdG9rZW4uCisgICAgICovCisgICAgc2tpcE9mZlRva2VuQ2hhbm5lbHM6IGZ1bmN0aW9uKGkpIHsKKyAgICAgICAgdmFyIG4gPSB0aGlzLnRva2Vucy5sZW5ndGg7CisgICAgICAgIHdoaWxlICggaTxuICYmICh0aGlzLnRva2Vuc1tpXSkuZ2V0Q2hhbm5lbCgpIT10aGlzLmNoYW5uZWwgKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGk7CisgICAgfSwKKworICAgIHNraXBPZmZUb2tlbkNoYW5uZWxzUmV2ZXJzZTogZnVuY3Rpb24oaSkgeworICAgICAgICB3aGlsZSAoIGk+PTAgJiYgKHRoaXMudG9rZW5zW2ldKS5nZXRDaGFubmVsKCkhPXRoaXMuY2hhbm5lbCApIHsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaTsKKyAgICB9LAorCisgICAgLyoqIEEgc2ltcGxlIGZpbHRlciBtZWNoYW5pc20gd2hlcmVieSB5b3UgY2FuIHRlbGwgdGhpcyB0b2tlbiBzdHJlYW0KKyAgICAgKiAgdG8gZm9yY2UgYWxsIHRva2VucyBvZiB0eXBlIHR0eXBlIHRvIGJlIG9uIGNoYW5uZWwuICBGb3IgZXhhbXBsZSwKKyAgICAgKiAgd2hlbiBpbnRlcnByZXRpbmcsIHdlIGNhbm5vdCBleGVjIGFjdGlvbnMgc28gd2UgbmVlZCB0byB0ZWxsCisgICAgICogIHRoZSBzdHJlYW0gdG8gZm9yY2UgYWxsIFdTIGFuZCBORVdMSU5FIHRvIGJlIGEgZGlmZmVyZW50LCBpZ25vcmVkCisgICAgICogIGNoYW5uZWwuCisgICAgICovCisgICAgc2V0VG9rZW5UeXBlQ2hhbm5lbDogZnVuY3Rpb24odHR5cGUsIGNoYW5uZWwpIHsKKyAgICAgICAgaWYgKCAhdGhpcy5jaGFubmVsT3ZlcnJpZGVNYXAgKSB7CisgICAgICAgICAgICB0aGlzLmNoYW5uZWxPdmVycmlkZU1hcCA9IHt9OworICAgICAgICB9CisgICAgICAgIHRoaXMuY2hhbm5lbE92ZXJyaWRlTWFwW3R0eXBlXSA9IGNoYW5uZWw7CisgICAgfSwKKworICAgIGRpc2NhcmRUb2tlblR5cGU6IGZ1bmN0aW9uKHR0eXBlKSB7CisgICAgICAgIGlmICggIXRoaXMuZGlzY2FyZFNldCApIHsKKyAgICAgICAgICAgIHRoaXMuZGlzY2FyZFNldCA9IHt9OworICAgICAgICB9CisgICAgICAgIHRoaXMuZGlzY2FyZFNldFt0dHlwZV0gPSB0cnVlOworICAgIH0sCisKKyAgICBkaXNjYXJkT2ZmQ2hhbm5lbFRva2VuczogZnVuY3Rpb24oYikgeworICAgICAgICB0aGlzLnZfZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnMgPSBiOworICAgIH0sCisKKyAgICAvKiogR2l2ZW4gYSBzdGFydCBhbmQgc3RvcCBpbmRleCwgcmV0dXJuIGEgTGlzdCBvZiBhbGwgdG9rZW5zIGluCisgICAgICogIHRoZSB0b2tlbiB0eXBlIEJpdFNldC4gIFJldHVybiBudWxsIGlmIG5vIHRva2VucyB3ZXJlIGZvdW5kLiAgVGhpcworICAgICAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgICAqLworICAgIGdldFRva2VuczogZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHR5cGVzKSB7CisgICAgICAgIGlmICggdGhpcy5wID09PSAtMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0wKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNBcnJheSh0eXBlcykpIHsKKyAgICAgICAgICAgIHR5cGVzID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldCh0eXBlcyk7CisgICAgICAgIH0gZWxzZSBpZiAob3JnLmFudGxyLmxhbmcuaXNOdW1iZXIodHlwZXMpKSB7CisgICAgICAgICAgICB0eXBlcyA9IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldC5vZih0eXBlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHN0b3A+PXRoaXMudG9rZW5zLmxlbmd0aCApIHsKKyAgICAgICAgICAgIHN0b3A9dGhpcy50b2tlbnMubGVuZ3RoLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzdGFydDwwICkgeworICAgICAgICAgICAgc3RhcnQ9MDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHN0YXJ0PnN0b3AgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxpc3QgPSB0b2tlbnNbc3RhcnQ6c3RvcF06e1Rva2VuIHQsIHQuZ2V0VHlwZSgpIGluIHR5cGVzfQorICAgICAgICB2YXIgZmlsdGVyZWRUb2tlbnMgPSBbXSwKKyAgICAgICAgICAgIGksCisgICAgICAgICAgICB0OworICAgICAgICBmb3IgKGk9c3RhcnQ7IGk8PXN0b3A7IGkrKykgeworICAgICAgICAgICAgdCA9IHRoaXMudG9rZW5zW2ldOworICAgICAgICAgICAgaWYgKCAhdGhpcy50eXBlcyB8fCB0eXBlcy5tZW1iZXIodC5nZXRUeXBlKCkpICkgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkVG9rZW5zLnB1c2godCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBmaWx0ZXJlZFRva2Vucy5sZW5ndGg9PT0wICkgeworICAgICAgICAgICAgZmlsdGVyZWRUb2tlbnMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWx0ZXJlZFRva2VuczsKKyAgICB9LAorCisgICAgLyoqIEdldCB0aGUgaXRoIHRva2VuIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gMS4ubiB3aGVyZSBrPTEgaXMgdGhlCisgICAgICogIGZpcnN0IHN5bWJvbCBvZiBsb29rYWhlYWQuCisgICAgICovCisgICAgTFQ6IGZ1bmN0aW9uKGspIHsKKyAgICAgICAgaWYgKCB0aGlzLnAgPT09IC0xICkgeworICAgICAgICAgICAgdGhpcy5maWxsQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBrPT09MCApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICggazwwICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuTEIoLTEqayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAodGhpcy5wK2stMSkgPj0gdGhpcy50b2tlbnMubGVuZ3RoICkgeworICAgICAgICAgICAgcmV0dXJuIG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRl9UT0tFTjsKKyAgICAgICAgfQorICAgICAgICB2YXIgaSA9IHRoaXMucCwKKyAgICAgICAgICAgIG4gPSAxOworICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMKKyAgICAgICAgd2hpbGUgKCBuPGsgKSB7CisgICAgICAgICAgICAvLyBza2lwIG9mZi1jaGFubmVsIHRva2VucworICAgICAgICAgICAgaSA9IHRoaXMuc2tpcE9mZlRva2VuQ2hhbm5lbHMoaSsxKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIGlmICggaT49dGhpcy50b2tlbnMubGVuZ3RoICkgeworICAgICAgICAgICAgcmV0dXJuIG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRl9UT0tFTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy50b2tlbnNbaV07CisgICAgfSwKKworICAgIC8qKiBMb29rIGJhY2t3YXJkcyBrIHRva2VucyBvbi1jaGFubmVsIHRva2VucyAqLworICAgIExCOiBmdW5jdGlvbihrKSB7CisgICAgICAgIGlmICggdGhpcy5wID09PSAtMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIGlmICggaz09PTAgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICh0aGlzLnAtayk8MCApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGkgPSB0aGlzLnAsCisgICAgICAgICAgICBuID0gMTsKKyAgICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zIGxvb2tpbmcgYmFja3dhcmRzCisgICAgICAgIHdoaWxlICggbjw9ayApIHsKKyAgICAgICAgICAgIC8vIHNraXAgb2ZmLWNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICBpID0gdGhpcy5za2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoaS0xKTsgLy8gbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIGlmICggaTwwICkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zW2ldOworICAgIH0sCisKKyAgICAvKiogUmV0dXJuIGFic29sdXRlIHRva2VuIGk7IGlnbm9yZSB3aGljaCBjaGFubmVsIHRoZSB0b2tlbnMgYXJlIG9uOworICAgICAqICB0aGF0IGlzLCBjb3VudCBhbGwgdG9rZW5zIG5vdCBqdXN0IG9uLWNoYW5uZWwgdG9rZW5zLgorICAgICAqLworICAgIGdldDogZnVuY3Rpb24oaSkgeworICAgICAgICByZXR1cm4gdGhpcy50b2tlbnNbaV07CisgICAgfSwKKworICAgIExBOiBmdW5jdGlvbihpKSB7CisgICAgICAgIHJldHVybiB0aGlzLkxUKGkpLmdldFR5cGUoKTsKKyAgICB9LAorCisgICAgbWFyazogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggdGhpcy5wID09PSAtMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHRoaXMuaW5kZXgoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMubGFzdE1hcmtlcjsKKyAgICB9LAorCisgICAgcmVsZWFzZTogZnVuY3Rpb24obWFya2VyKSB7CisgICAgICAgIC8vIG5vIHJlc291cmNlcyB0byByZWxlYXNlCisgICAgfSwKKworICAgIHNpemU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMubGVuZ3RoOworICAgIH0sCisKKyAgICBpbmRleDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnA7CisgICAgfSwKKworICAgIHJld2luZDogZnVuY3Rpb24obWFya2VyKSB7CisgICAgICAgIGlmICghb3JnLmFudGxyLmxhbmcuaXNOdW1iZXIobWFya2VyKSkgeworICAgICAgICAgICAgbWFya2VyID0gdGhpcy5sYXN0TWFya2VyOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2VlayhtYXJrZXIpOworICAgIH0sCisKKyAgICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucCA9IDA7CisgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IDA7CisgICAgfSwKKworICAgIHNlZWs6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgICAgIHRoaXMucCA9IGluZGV4OworICAgIH0sCisKKyAgICBnZXRUb2tlblNvdXJjZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRva2VuU291cmNlOworICAgIH0sCisKKyAgICBnZXRTb3VyY2VOYW1lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Tb3VyY2UoKS5nZXRTb3VyY2VOYW1lKCk7CisgICAgfSwKKworICAgIHRvU3RyaW5nOiBmdW5jdGlvbihzdGFydCwgc3RvcCkgeworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTApIHsKKyAgICAgICAgICAgIGlmICggdGhpcy5wID09PSAtMSApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIHN0b3AgPSB0aGlzLnRva2Vucy5sZW5ndGgtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghb3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoc3RhcnQpICYmICFvcmcuYW50bHIubGFuZy5pc051bWJlcihzdG9wKSkgeworICAgICAgICAgICAgaWYgKCBvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHN0YXJ0KSAmJiBvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHN0b3ApICkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQuZ2V0VG9rZW5JbmRleCgpOworICAgICAgICAgICAgICAgIHN0b3AgPSBzdG9wLmdldFRva2VuSW5kZXgoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgYnVmID0gIiIsCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgdDsKKyAKKyAgICAgICAgaWYgKCBzdGFydDwwIHx8IHN0b3A8MCApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5wID09IC0xICkgeworICAgICAgICAgICAgdGhpcy5maWxsQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzdG9wPj10aGlzLnRva2Vucy5sZW5ndGggKSB7CisgICAgICAgICAgICBzdG9wID0gdGhpcy50b2tlbnMubGVuZ3RoLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSsrKSB7CisgICAgICAgICAgICB0ID0gdGhpcy50b2tlbnNbaV07CisgICAgICAgICAgICBidWYgPSBidWYgKyB0aGlzLnRva2Vuc1tpXS5nZXRUZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0RGQS5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0RGQS5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYjY5OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvREZBLmpzCkBAIC0wLDAgKzEsMTQ5IEBACisvKiogQSBERkEgaW1wbGVtZW50ZWQgYXMgYSBzZXQgb2YgdHJhbnNpdGlvbiB0YWJsZXMuCisgKgorICogIEFueSBzdGF0ZSB0aGF0IGhhcyBhIHNlbWFudGljIHByZWRpY2F0ZSBlZGdlIGlzIHNwZWNpYWw7IHRob3NlIHN0YXRlcworICogIGFyZSBnZW5lcmF0ZWQgd2l0aCBpZi10aGVuLWVsc2Ugc3RydWN0dXJlcyBpbiBhIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oKQorICogIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBjeWNsaWNERkEgdGVtcGxhdGUuCisgKgorICogIFRoZXJlIGFyZSBhdCBtb3N0IDMyNzY3IHN0YXRlcyAoMTYtYml0IHNpZ25lZCBzaG9ydCkuCisgKiAgQ291bGQgZ2V0IGF3YXkgd2l0aCBieXRlIHNvbWV0aW1lcyBidXQgd291bGQgaGF2ZSB0byBnZW5lcmF0ZSBkaWZmZXJlbnQKKyAqICB0eXBlcyBhbmQgdGhlIHNpbXVsYXRpb24gY29kZSB0b28uICBGb3IgYSBwb2ludCBvZiByZWZlcmVuY2UsIHRoZSBKYXZhCisgKiAgbGV4ZXIncyBUb2tlbnMgcnVsZSBERkEgaGFzIDMyNiBzdGF0ZXMgcm91Z2hseS4KKyAqLworb3JnLmFudGxyLnJ1bnRpbWUuREZBID0gZnVuY3Rpb24oKSB7fTsKKworb3JnLmFudGxyLnJ1bnRpbWUuREZBLnByb3RvdHlwZSA9IHsKKyAgICAvKiogRnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBwcmVkaWN0IHdoYXQgYWx0ZXJuYXRpdmUgd2lsbCBzdWNjZWVkCisgICAgICogIHVzaW5nIHRoaXMgREZBIChyZXByZXNlbnRpbmcgdGhlIGNvdmVyaW5nIHJlZ3VsYXIgYXBwcm94aW1hdGlvbgorICAgICAqICB0byB0aGUgdW5kZXJseWluZyBDRkwpLiAgUmV0dXJuIGFuIGFsdGVybmF0aXZlIG51bWJlciAxLi5uLiAgVGhyb3cKKyAgICAgKiAgYW4gZXhjZXB0aW9uIHVwb24gZXJyb3IuCisgICAgICovCisgICAgcHJlZGljdDogZnVuY3Rpb24oaW5wdXQpIHsKKyAgICAgICAgdmFyIG1hcmsgPSBpbnB1dC5tYXJrKCksIC8vIHJlbWVtYmVyIHdoZXJlIGRlY2lzaW9uIHN0YXJ0ZWQgaW4gaW5wdXQKKyAgICAgICAgICAgIHMgPSAwLCAvLyB3ZSBhbHdheXMgc3RhcnQgYXQgczAKKyAgICAgICAgICAgIHNwZWNpYWxTdGF0ZSwKKyAgICAgICAgICAgIGMsCisgICAgICAgICAgICBzbmV4dDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKCB0cnVlICkgeworICAgICAgICAgICAgICAgIHNwZWNpYWxTdGF0ZSA9IHRoaXMuc3BlY2lhbFtzXTsKKyAgICAgICAgICAgICAgICBpZiAoIHNwZWNpYWxTdGF0ZT49MCApIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHRoaXMuc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihzcGVjaWFsU3RhdGUsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAocz09PS0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vVmlhYmxlQWx0KHMsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggdGhpcy5hY2NlcHRbc10gPj0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXB0W3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBhIG5vcm1hbCBjaGFyIHRyYW5zaXRpb24KKyAgICAgICAgICAgICAgICBjID0gaW5wdXQuTEEoMSk7IC8vIC0xID09IFx1RkZGRiwgYWxsIHRva2VucyBmaXQgaW4gNjUwMDAgc3BhY2UKKworICAgICAgICAgICAgICAgIGlmIChjPT09b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yZy5hbnRsci5sYW5nLmlzU3RyaW5nKGMpKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBjLmNoYXJDb2RlQXQoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGM+PXRoaXMubWluW3NdICYmIGM8PXRoaXMubWF4W3NdKSB7CisgICAgICAgICAgICAgICAgICAgIHNuZXh0ID0gdGhpcy50cmFuc2l0aW9uW3NdW2MtdGhpcy5taW5bc11dOyAvLyBtb3ZlIHRvIG5leHQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzbmV4dCA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgaW4gcmFuZ2UgYnV0IG5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGNoZWNrIEVPVCwgd2hpY2ggaXMgbGlrZSB0aGUgZWxzZSBjbGF1c2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlb3Rbc10+PTAgaW5kaWNhdGVzIHRoYXQgYW4gRU9UIGVkZ2UgZ29lcyB0byBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGhpcy5lb3Rbc10+PTAgKSB7ICAvLyBFT1QgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHRoaXMuZW90W3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBJIGhhZCB0aGlzIGFzIHJldHVybiBhY2NlcHRbZW90W3NdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFzc3VtZWQgaGVyZSB0aGF0IHRoZSBFT1QgZWRnZSBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZW50IHRvIGFuIGFjY2VwdC4uLmZhc3RlciB0byBkbyB0aGlzLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGFib3V0IHByZWRpY2F0ZWQgZWRnZXMgY29taW5nIGZyb20gRU9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub1ZpYWJsZUFsdChzLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMgPSBzbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCB0aGlzLmVvdFtzXT49MCApIHsgIC8vIEVPVCBUcmFuc2l0aW9uPworICAgICAgICAgICAgICAgICAgICBzID0gdGhpcy5lb3Rbc107CisgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggYz09b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GICYmIHRoaXMuZW9mW3NdPj0wICkgeyAgLy8gRU9GIFRyYW5zaXRpb24gdG8gYWNjZXB0IHN0YXRlPworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY2NlcHRbdGhpcy5lb2Zbc11dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBub3QgaW4gcmFuZ2UgYW5kIG5vdCBFT0YvRU9ULCBtdXN0IGJlIGludmFsaWQgc3ltYm9sCisgICAgICAgICAgICAgICAgdGhpcy5ub1ZpYWJsZUFsdChzLGlucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlucHV0LnJld2luZChtYXJrKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBub1ZpYWJsZUFsdDogZnVuY3Rpb24ocywgaW5wdXQpIHsKKyAgICAgICAgaWYgKHRoaXMucmVjb2duaXplci5zdGF0ZS5iYWNrdHJhY2tpbmc+MCkgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyLnN0YXRlLmZhaWxlZD10cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZhciBudmFlID0KKyAgICAgICAgICAgIG5ldyBvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbih0aGlzLmdldERlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KTsKKyAgICAgICAgdGhpcy5lcnJvcihudmFlKTsKKyAgICAgICAgdGhyb3cgbnZhZTsKKyAgICB9LAorCisgICAgLyoqIEEgaG9vayBmb3IgZGVidWdnaW5nIGludGVyZmFjZSAqLworICAgIGVycm9yOiBmdW5jdGlvbihudmFlKSB7IH0sCisKKyAgICBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uOiBmdW5jdGlvbihzLCBpbnB1dCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSwKKworICAgIGdldERlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJuL2EiOworICAgIH0KK307CisKK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3Qob3JnLmFudGxyLnJ1bnRpbWUuREZBLCB7CisgICAgLyoqIEdpdmVuIGEgU3RyaW5nIHRoYXQgaGFzIGEgcnVuLWxlbmd0aC1lbmNvZGluZyBvZiBzb21lIHVuc2lnbmVkIHNob3J0cworICAgICAqICBsaWtlICJcMVwyXDNcOSIsIGNvbnZlcnQgdG8gc2hvcnRbXSB7Miw5LDksOX0uCisgICAgICovCisgICAgdW5wYWNrRW5jb2RlZFN0cmluZzogZnVuY3Rpb24oZW5jb2RlZFN0cmluZykgeworICAgICAgICAvLyB3YWxrIGZpcnN0IHRvIGZpbmQgaG93IGJpZyBpdCBpcy4KKyAgICAgICAgdmFyIGksCisgICAgICAgICAgICBkYXRhID0gW10sCisgICAgICAgICAgICBkaSA9IDAsCisgICAgICAgICAgICBuLAorICAgICAgICAgICAgdiwKKyAgICAgICAgICAgIGo7CisgICAgICAgIGZvciAoaT0wOyBpPGVuY29kZWRTdHJpbmcubGVuZ3RoOyBpKz0yKSB7CisgICAgICAgICAgICBuID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpOworICAgICAgICAgICAgdiA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKzEpOworICAgICAgICAgICAgaWYgKHY9PT0weGZmZmYpIHsKKyAgICAgICAgICAgICAgICB2ID0gLTE7IC8vIG92ZXJmbG93IGF0IDE2IGJpdHMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZCB2IG4gdGltZXMgdG8gZGF0YQorICAgICAgICAgICAgZm9yIChqPTE7IGo8PW47IGorKykgeworICAgICAgICAgICAgICAgIGRhdGFbZGkrK10gPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0sCisKKyAgICAvLyBhbGlhcworICAgIHVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnM6IGZ1bmN0aW9uKGVuY29kZWRTdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIG9yZy5hbnRsci5ydW50aW1lLkRGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGVuY29kZWRTdHJpbmcpOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvRWFybHlFeGl0RXhjZXB0aW9uLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvRWFybHlFeGl0RXhjZXB0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwYjhiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9FYXJseUV4aXRFeGNlcHRpb24uanMKQEAgLTAsMCArMSwyMyBAQAorLyoqIFRoZSByZWNvZ25pemVyIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgZm9yIGEgKCkrIGxvb3AuCisgKgorICogIEBjbGFzcworICogIEBwYXJhbSB7TnVtYmVyfSBkZWNpc2lvbk51bWJlcgorICogIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW18b3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbXxvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbX0gaW5wdXQgaW5wdXQgc3RyZWFtIHRoYXQgaGFzIGFuIGV4Y2VwdGlvbi4KKyAqICBAZXh0ZW5kcyBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbgorICovCitvcmcuYW50bHIucnVudGltZS5FYXJseUV4aXRFeGNlcHRpb24gPSBmdW5jdGlvbihkZWNpc2lvbk51bWJlciwgaW5wdXQpIHsKKyAgICBvcmcuYW50bHIucnVudGltZS5FYXJseUV4aXRFeGNlcHRpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKAorICAgICAgICAgICAgdGhpcywgaW5wdXQpOworICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSBkZWNpc2lvbk51bWJlcjsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZCgKKyAgICBvcmcuYW50bHIucnVudGltZS5FYXJseUV4aXRFeGNlcHRpb24sCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb24sCisvKiogQGxlbmRzIG9yZy5hbnRsci5ydW50aW1lLkVhcmx5RXhpdEV4Y2VwdGlvbi5wcm90b3R5cGUgKi8KK3sKKyAgICAvKiogTmFtZSBvZiB0aGlzIGNsYXNzLgorICAgICAqICBAdHlwZSBTdHJpbmcKKyAgICAgKi8KKyAgICBuYW1lOiAib3JnLmFudGxyLnJ1bnRpbWUuRWFybHlFeGl0RXhjZXB0aW9uIgorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTRiNjhiNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0ZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5qcwpAQCAtMCwwICsxLDM0IEBACisvKiogQSBzZW1hbnRpYyBwcmVkaWNhdGUgZmFpbGVkIGR1cmluZyB2YWxpZGF0aW9uLiAgVmFsaWRhdGlvbiBvZiBwcmVkaWNhdGVzCisgKiAgb2NjdXJzIHdoZW4gbm9ybWFsbHkgcGFyc2luZyB0aGUgYWx0ZXJuYXRpdmUganVzdCBsaWtlIG1hdGNoaW5nIGEgdG9rZW4uCisgKiAgRGlzYW1iaWd1YXRpbmcgcHJlZGljYXRlIGV2YWx1YXRpb24gb2NjdXJzIHdoZW4gd2UgaG9pc3QgYSBwcmVkaWNhdGUgaW50bworICogIGEgcHJlZGljdGlvbiBkZWNpc2lvbi4KKyAqCisgKiAgQGNsYXNzCisgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbXxvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtfG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtfSBpbnB1dCBpbnB1dCBzdHJlYW0gdGhhdCBoYXMgYW4gZXhjZXB0aW9uLgorICogIEBwYXJhbSB7U3RyaW5nfSBydWxlTmFtZSBuYW1lIG9mIHRoZSBydWxlIGluIHdoaWNoIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCisgKiAgQHBhcmFtIHtTdHJpbmd9IHByZWRpY2F0ZVRleHQgdGhlIHByZWRpY2F0ZSB0aGF0IGZhaWxlZC4KKyAqICBAZXh0ZW5kcyBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbgorICovCitvcmcuYW50bHIucnVudGltZS5GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gPSBmdW5jdGlvbihpbnB1dCwgcnVsZU5hbWUsIHByZWRpY2F0ZVRleHQpeworICAgIG9yZy5hbnRsci5ydW50aW1lLkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgaW5wdXQpOworICAgIHRoaXMucnVsZU5hbWUgPSBydWxlTmFtZTsKKyAgICB0aGlzLnByZWRpY2F0ZVRleHQgPSBwcmVkaWNhdGVUZXh0OworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKAorICAgIG9yZy5hbnRsci5ydW50aW1lLkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiwKKyAgICBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbiwKKy8qKiBAbGVuZHMgb3JnLmFudGxyLnJ1bnRpbWUuRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLnByb3RvdHlwZSAqLworeworICAgIC8qKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBleGNlcHRpb24uCisgICAgICogIEByZXR1cm5zIHtTdHJpbmd9CisgICAgICovIAorICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oIit0aGlzLnJ1bGVOYW1lKyIseyIrdGhpcy5wcmVkaWNhdGVUZXh0KyJ9PykiOworICAgIH0sCisKKyAgICAvKiogTmFtZSBvZiB0aGlzIGNsYXNzLgorICAgICAqICBAdHlwZSBTdHJpbmcKKyAgICAgKi8KKyAgICBuYW1lOiAib3JnLmFudGxyLnJ1bnRpbWUuRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIgorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9ucy5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb25zLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxMzMwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9JbmRleE91dE9mQm91bmRzRXhjZXB0aW9ucy5qcwpAQCAtMCwwICsxLDcgQEAKK29yZy5hbnRsci5ydW50aW1lLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gPSBmdW5jdGlvbihtKSB7CisgICAgb3JnLmFudGxyLnJ1bnRpbWUuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbSk7Cit9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQob3JnLmFudGxyLnJ1bnRpbWUuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgRXJyb3IsIHsKKyAgICBuYW1lOiAib3JnLmFudGxyLnJ1bnRpbWUuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIKK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTGV4ZXIuanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9MZXhlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NDJkZDQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTGV4ZXIuanMKQEAgLTAsMCArMSwyODQgQEAKKy8qKiBBIGxleGVyIGlzIHJlY29nbml6ZXIgdGhhdCBkcmF3cyBpbnB1dCBzeW1ib2xzIGZyb20gYSBjaGFyYWN0ZXIgc3RyZWFtLgorICogIGxleGVyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LiBBIExleGVyIG9iamVjdAorICogIHVzZXMgc2ltcGxpZmllZCBtYXRjaCgpIGFuZCBlcnJvciByZWNvdmVyeSBtZWNoYW5pc21zIGluIHRoZSBpbnRlcmVzdAorICogIG9mIHNwZWVkLgorICovCitvcmcuYW50bHIucnVudGltZS5MZXhlciA9IGZ1bmN0aW9uKGlucHV0LCBzdGF0ZSkgeworICAgIGlmIChzdGF0ZSkgeworICAgICAgICBvcmcuYW50bHIucnVudGltZS5MZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgc3RhdGUpOworICAgIH0KKyAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0KK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS5MZXhlciwgb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIsIHsKKyAgICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgIC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworICAgICAgICBvcmcuYW50bHIucnVudGltZS5MZXhlci5zdXBlcmNsYXNzLnJlc2V0LmNhbGwodGhpcyk7CisgICAgICAgIGlmICggb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0aGlzLmlucHV0KSApIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQuc2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorICAgICAgICB9CisgICAgICAgIGlmICggIW9yZy5hbnRsci5sYW5nLmlzVmFsdWUodGhpcy5zdGF0ZSkgKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIG5vIHNoYXJlZCBzdGF0ZSB3b3JrIHRvIGRvCisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdGF0ZS50b2tlbiA9IG51bGw7CisgICAgICAgIHRoaXMuc3RhdGUudHlwZSA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLklOVkFMSURfVE9LRU5fVFlQRTsKKyAgICAgICAgdGhpcy5zdGF0ZS5jaGFubmVsID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uREVGQVVMVF9DSEFOTkVMOworICAgICAgICB0aGlzLnN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSAtMTsKKyAgICAgICAgdGhpcy5zdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gLTE7CisgICAgICAgIHRoaXMuc3RhdGUudG9rZW5TdGFydExpbmUgPSAtMTsKKyAgICAgICAgdGhpcy5zdGF0ZS50ZXh0ID0gbnVsbDsKKyAgICB9LAorCisgICAgLyoqIFJldHVybiBhIHRva2VuIGZyb20gdGhpcyBzb3VyY2U7IGkuZS4sIG1hdGNoIGEgdG9rZW4gb24gdGhlIGNoYXIKKyAgICAgKiAgc3RyZWFtLgorICAgICAqLworICAgIG5leHRUb2tlbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlLnRva2VuID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUuY2hhbm5lbCA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IHRoaXMuaW5wdXQuaW5kZXgoKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IHRoaXMuaW5wdXQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisgICAgICAgICAgICB0aGlzLnN0YXRlLnRva2VuU3RhcnRMaW5lID0gdGhpcy5pbnB1dC5nZXRMaW5lKCk7CisgICAgICAgICAgICB0aGlzLnN0YXRlLnRleHQgPSBudWxsOworICAgICAgICAgICAgaWYgKCB0aGlzLmlucHV0LkxBKDEpPT09b3JnLmFudGxyLnJ1bnRpbWUuQ2hhclN0cmVhbS5FT0YgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRl9UT0tFTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5tVG9rZW5zKCk7CisgICAgICAgICAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0aGlzLnN0YXRlLnRva2VuKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB0aGlzLnN0YXRlLnRva2VuPT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5TS0lQX1RPS0VOICkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAocmUpIHsKKyAgICAgICAgICAgICAgICBpZiAocmUgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyKHJlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCByZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uICkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIEluc3RydWN0IHRoZSBsZXhlciB0byBza2lwIGNyZWF0aW5nIGEgdG9rZW4gZm9yIGN1cnJlbnQgbGV4ZXIgcnVsZQorICAgICAqICBhbmQgbG9vayBmb3IgYW5vdGhlciB0b2tlbi4gIG5leHRUb2tlbigpIGtub3dzIHRvIGtlZXAgbG9va2luZyB3aGVuCisgICAgICogIGEgbGV4ZXIgcnVsZSBmaW5pc2hlcyB3aXRoIHRva2VuIHNldCB0byBTS0lQX1RPS0VOLiAgUmVjYWxsIHRoYXQKKyAgICAgKiAgaWYgdG9rZW49PW51bGwgYXQgZW5kIG9mIGFueSB0b2tlbiBydWxlLCBpdCBjcmVhdGVzIG9uZSBmb3IgeW91CisgICAgICogIGFuZCBlbWl0cyBpdC4KKyAgICAgKi8KKyAgICBza2lwOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5zdGF0ZS50b2tlbiA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLlNLSVBfVE9LRU47CisgICAgfSwKKworICAgIC8qKiBTZXQgdGhlIGNoYXIgc3RyZWFtIGFuZCByZXNldCB0aGUgbGV4ZXIgKi8KKyAgICBzZXRDaGFyU3RyZWFtOiBmdW5jdGlvbihpbnB1dCkgeworICAgICAgICB0aGlzLmlucHV0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5yZXNldCgpOworICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgfSwKKworICAgIGdldENoYXJTdHJlYW06IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbnB1dDsKKyAgICB9LAorCisgICAgZ2V0U291cmNlTmFtZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlucHV0LmdldFNvdXJjZU5hbWUoKTsKKyAgICB9LAorCisgICAgLyoqIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGVtaXRzIHBlciBuZXh0VG9rZW4gaW52b2NhdGlvbgorICAgICAqICBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAgU3ViY2xhc3MgYW5kIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAorICAgICAqICBuZXh0VG9rZW4gKHRvIHB1c2ggdG9rZW5zIGludG8gYSBsaXN0IGFuZCBwdWxsIGZyb20gdGhhdCBsaXN0IHJhdGhlcgorICAgICAqICB0aGFuIGEgc2luZ2xlIHZhcmlhYmxlIGFzIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcykuCisgICAgICoKKyAgICAgKiAgVGhlIHN0YW5kYXJkIG1ldGhvZCBjYWxsZWQgdG8gYXV0b21hdGljYWxseSBlbWl0IGEgdG9rZW4gYXQgdGhlCisgICAgICogIG91dGVybW9zdCBsZXhpY2FsIHJ1bGUuICBUaGUgdG9rZW4gb2JqZWN0IHNob3VsZCBwb2ludCBpbnRvIHRoZQorICAgICAqICBjaGFyIGJ1ZmZlciBzdGFydC4uc3RvcC4gIElmIHRoZXJlIGlzIGEgdGV4dCBvdmVycmlkZSBpbiAndGV4dCcsCisgICAgICogIHVzZSB0aGF0IHRvIHNldCB0aGUgdG9rZW4ncyB0ZXh0LiAgT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZW1pdAorICAgICAqICBjdXN0b20gVG9rZW4gb2JqZWN0cy4KKyAgICAgKgorICAgICAqICBJZiB5b3UgYXJlIGJ1aWxkaW5nIHRyZWVzLCB0aGVuIHlvdSBzaG91bGQgYWxzbyBvdmVycmlkZQorICAgICAqICBQYXJzZXIgb3IgVHJlZVBhcnNlci5nZXRNaXNzaW5nU3ltYm9sKCkuCisgICAgICovCisgICAgZW1pdDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MCkgeworICAgICAgICAgICAgdmFyIHQgPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW4odGhpcy5pbnB1dCwgdGhpcy5zdGF0ZS50eXBlLCB0aGlzLnN0YXRlLmNoYW5uZWwsIHRoaXMuc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCwgdGhpcy5nZXRDaGFySW5kZXgoKS0xKTsKKyAgICAgICAgICAgIHQuc2V0TGluZSh0aGlzLnN0YXRlLnRva2VuU3RhcnRMaW5lKTsKKyAgICAgICAgICAgIHQuc2V0VGV4dCh0aGlzLnN0YXRlLnRleHQpOworICAgICAgICAgICAgdC5zZXRDaGFyUG9zaXRpb25JbkxpbmUodGhpcy5zdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUudG9rZW4gPSB0OworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnN0YXRlLnRva2VuID0gYXJndW1lbnRzWzBdOworICAgICAgICB9CisgICAgfSwKKworICAgIG1hdGNoOiBmdW5jdGlvbihzKSB7CisgICAgICAgIHZhciBpID0gMCwKKyAgICAgICAgICAgIG10ZTsKKworICAgICAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNTdHJpbmcocykpIHsKKyAgICAgICAgICAgIHdoaWxlICggaTxzLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRoaXMuaW5wdXQuTEEoMSkhPXMuY2hhckF0KGkpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXRlID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzLmNoYXJBdChpKSwgdGhpcy5pbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3ZlcihtdGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBtdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB0aGlzLmlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9yZy5hbnRsci5sYW5nLmlzTnVtYmVyKHMpKSB7CisgICAgICAgICAgICBpZiAoIHRoaXMuaW5wdXQuTEEoMSkhPXMgKSB7CisgICAgICAgICAgICAgICAgaWYgKCB0aGlzLnN0YXRlLmJhY2t0cmFja2luZz4wICkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXRlID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzLCB0aGlzLmlucHV0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnJlY292ZXIobXRlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgbWF0Y2hBbnk6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmlucHV0LmNvbnN1bWUoKTsKKyAgICB9LAorCisgICAgbWF0Y2hSYW5nZTogZnVuY3Rpb24oYSwgYikgeworICAgICAgICBpZiAoIHRoaXMuaW5wdXQuTEEoMSk8YSB8fCB0aGlzLmlucHV0LkxBKDEpPmIgKSB7CisgICAgICAgICAgICBpZiAoIHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjAgKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5mYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBtcmUgPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKGEsYix0aGlzLmlucHV0KTsKKyAgICAgICAgICAgIHRoaXMucmVjb3ZlcihtcmUpOworICAgICAgICAgICAgdGhyb3cgbXJlOworICAgICAgICB9CisgICAgICAgIHRoaXMuaW5wdXQuY29uc3VtZSgpOworICAgICAgICB0aGlzLnN0YXRlLmZhaWxlZCA9IGZhbHNlOworICAgIH0sCisKKyAgICBnZXRMaW5lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuZ2V0TGluZSgpOworICAgIH0sCisKKyAgICBnZXRDaGFyUG9zaXRpb25JbkxpbmU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKyAgICB9LAorCisgICAgLyoqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNoYXJhY3RlciBvZiBsb29rYWhlYWQ/ICovCisgICAgZ2V0Q2hhckluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuaW5kZXgoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybiB0aGUgdGV4dCBtYXRjaGVkIHNvIGZhciBmb3IgdGhlIGN1cnJlbnQgdG9rZW4gb3IgYW55CisgICAgICogIHRleHQgb3ZlcnJpZGUuCisgICAgICovCisgICAgZ2V0VGV4dDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggb3JnLmFudGxyLmxhbmcuaXNTdHJpbmcodGhpcy5zdGF0ZS50ZXh0KSApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnRleHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuc3Vic3RyaW5nKHRoaXMuc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCx0aGlzLmdldENoYXJJbmRleCgpLTEpOworICAgIH0sCisKKyAgICAvKiogU2V0IHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgdG9rZW47IGl0IHdpcGVzIGFueSBwcmV2aW91cworICAgICAqICBjaGFuZ2VzIHRvIHRoZSB0ZXh0LgorICAgICAqLworICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQpIHsKKyAgICAgICAgdGhpcy5zdGF0ZS50ZXh0ID0gdGV4dDsKKyAgICB9LAorCisgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgLyoqIFRPRE86IG5vdCB0aG91Z2h0IGFib3V0IHJlY292ZXJ5IGluIGxleGVyIHlldC4KKyAgICAgICAgICoKKyAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBhbmQgaGF2ZSBub3QgbWF0Y2hlZCBhIHRva2VuCisgICAgICAgIC8vIHlldCBzdWNjZXNzZnVsbHksIGRvbid0IHJlcG9ydCBhbnkgZXJyb3JzLgorICAgICAgICBpZiAoIGVycm9yUmVjb3ZlcnkgKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnQoIltTUFVSSU9VU10gIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JSZWNvdmVyeSA9IHRydWU7CisgICAgICAgICAqLworCisgICAgICAgIHRoaXMuZGlzcGxheVJlY29nbml0aW9uRXJyb3IodGhpcy5nZXRUb2tlbk5hbWVzKCksIGUpOworICAgIH0sCisKKyAgICBnZXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKGUsIHRva2VuTmFtZXMpIHsKKyAgICAgICAgdmFyIG1zZyA9IG51bGw7CisgICAgICAgIGlmICggZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK3RoaXMuZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nICIrdGhpcy5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuZXhwZWN0aW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uICkgeworICAgICAgICAgICAgbXNnID0gIm5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgIit0aGlzLmdldENoYXJFcnJvckRpc3BsYXkoZS5jKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLkVhcmx5RXhpdEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1zZyA9ICJyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGNoYXJhY3RlciAiK3RoaXMuZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK3RoaXMuZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiK2UuZXhwZWN0aW5nOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK3RoaXMuZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpKyIgZXhwZWN0aW5nIHNldCAiK2UuZXhwZWN0aW5nOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uICkgeworICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgY2hhcmFjdGVyICIrdGhpcy5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykrIiBleHBlY3Rpbmcgc2V0ICIrCisgICAgICAgICAgICAgICAgdGhpcy5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuYSkrIi4uIit0aGlzLmdldENoYXJFcnJvckRpc3BsYXkoZS5iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1zZyA9IG9yZy5hbnRsci5ydW50aW1lLkxleGVyLnN1cGVyY2xhc3MuZ2V0RXJyb3JNZXNzYWdlLmNhbGwodGhpcywgZSwgdG9rZW5OYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9LAorCisgICAgZ2V0Q2hhckVycm9yRGlzcGxheTogZnVuY3Rpb24oYykgeworICAgICAgICB2YXIgcyA9IGM7IC8vU3RyaW5nLmZyb21DaGFyQ29kZShjKTsKKyAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgICAgIGNhc2Ugb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GIDoKKyAgICAgICAgICAgICAgICBzID0gIjxFT0Y+IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIlxuIiA6CisgICAgICAgICAgICAgICAgcyA9ICJcXG4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAiXHQiIDoKKyAgICAgICAgICAgICAgICBzID0gIlxcdCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICJcciIgOgorICAgICAgICAgICAgICAgIHMgPSAiXFxyIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiciK3MrIiciOworICAgIH0sCisKKyAgICAvKiogTGV4ZXJzIGNhbiBub3JtYWxseSBtYXRjaCBhbnkgY2hhciBpbiBpdCdzIHZvY2FidWxhcnkgYWZ0ZXIgbWF0Y2hpbmcKKyAgICAgKiAgYSB0b2tlbiwgc28gZG8gdGhlIGVhc3kgdGhpbmcgYW5kIGp1c3Qga2lsbCBhIGNoYXJhY3RlciBhbmQgaG9wZQorICAgICAqICBpdCBhbGwgd29ya3Mgb3V0LiAgWW91IGNhbiBpbnN0ZWFkIHVzZSB0aGUgcnVsZSBpbnZvY2F0aW9uIHN0YWNrCisgICAgICogIHRvIGRvIHNvcGhpc3RpY2F0ZWQgZXJyb3IgcmVjb3ZlcnkgaWYgeW91IGFyZSBpbiBhIGZyYWdtZW50IHJ1bGUuCisgICAgICovCisgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgdGhpcy5pbnB1dC5jb25zdW1lKCk7CisgICAgfSwKKworICAgIHRyYWNlSW46IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpICB7CisgICAgICAgIHZhciBpbnB1dFN5bWJvbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5pbnB1dC5MVCgxKSkrIiBsaW5lPSIrdGhpcy5nZXRMaW5lKCkrIjoiK3RoaXMuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLkxleGVyLnN1cGVyY2xhc3MudHJhY2VJbi5jYWxsKHRoaXMsIHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKTsKKyAgICB9LAorCisgICAgdHJhY2VPdXQ6IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpICB7CisJCXZhciBpbnB1dFN5bWJvbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5pbnB1dC5MVCgxKSkrIiBsaW5lPSIrdGhpcy5nZXRMaW5lKCkrIjoiK3RoaXMuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCW9yZy5hbnRsci5ydW50aW1lLkxleGVyLnN1cGVyY2xhc3MudHJhY2VPdXQuY2FsbCh0aGlzLCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCk7CisJfQorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYTE4ZDNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5qcwpAQCAtMCwwICsxLDEzIEBACitvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uID0gZnVuY3Rpb24oZXhwZWN0aW5nLCBpbnB1dCkgeworICAgIG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGV4cGVjdGluZywgaW5wdXQpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKAorICAgIG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24sCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKCIgKworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VW5leHBlY3RlZFR5cGUoKSArICIhPSIgKyB0aGlzLmV4cGVjdGluZyArICIpIjsKKyAgICB9LAorICAgIG5hbWU6ICJvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIgorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb25zLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9ucy5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Zjk5ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9ucy5qcwpAQCAtMCwwICsxLDIwIEBACitvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gPSBmdW5jdGlvbihhLCBiLCBpbnB1dCkgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKAorICAgICAgICAgICAgdGhpcywgaW5wdXQpOworICAgIHRoaXMuYSA9IGE7CisgICAgdGhpcy5iID0gYjsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZCgKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24sCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb24sIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKCIgKworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VW5leHBlY3RlZFR5cGUoKSsiIG5vdCBpbiBbIit0aGlzLmErIiwiK3RoaXMuYisiXSkiOworICAgIH0sCisgICAgbmFtZTogIm9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiIKK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFmZWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24uanMKQEAgLTAsMCArMSwxNSBAQAorb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKGV4cGVjdGluZywgaW5wdXQpIHsKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkU2V0RXhjZXB0aW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCgKKyAgICAgICAgICAgIHRoaXMsIGlucHV0KTsKKyAgICB0aGlzLmV4cGVjdGluZyA9IGV4cGVjdGluZzsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZCgKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkU2V0RXhjZXB0aW9uLAorICAgIG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uLCB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gIk1pc21hdGNoZWRTZXRFeGNlcHRpb24oIiArCisgICAgICAgICAgICAgICAgdGhpcy5nZXRVbmV4cGVjdGVkVHlwZSgpICsgIiE9IiArIHRoaXMuZXhwZWN0aW5nICsgIikiOworICAgIH0sCisgICAgbmFtZTogIm9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRTZXRFeGNlcHRpb24iCit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wY2QxYjcyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMTkgQEAKK29yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKGV4cGVjdGluZywgaW5wdXQpIHsKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTApIHsKKyAgICAgICAgdGhpcy5leHBlY3RpbmcgPSBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCgKKyAgICAgICAgICAgICAgICB0aGlzLCBpbnB1dCk7CisgICAgICAgIHRoaXMuZXhwZWN0aW5nID0gZXhwZWN0aW5nOworICAgIH0KK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZCgKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24sCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb24sIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKCIgKworICAgICAgICAgICAgICAgIHRoaXMuZ2V0VW5leHBlY3RlZFR5cGUoKSArICIhPSIgKyB0aGlzLmV4cGVjdGluZyArICIpIjsKKyAgICB9LAorICAgIG5hbWU6ICJvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24iCit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMTJlODdlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMTcgQEAKK29yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKGV4cGVjdGluZywgaW5wdXQpIHsKKyAgICBpZiAoZXhwZWN0aW5nICYmIGlucHV0KSB7CisgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwoCisgICAgICAgICAgICAgICAgdGhpcywgaW5wdXQpOworICAgICAgICB0aGlzLmV4cGVjdGluZyA9IGV4cGVjdGluZzsKKyAgICB9Cit9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQoCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLAorICAgIG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uLCB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gIk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbigiICsKKyAgICAgICAgICAgICAgICB0aGlzLmdldFVuZXhwZWN0ZWRUeXBlKCkgKyAiIT0iICsgdGhpcy5leHBlY3RpbmcgKyAiKSI7CisgICAgfSwKKyAgICBuYW1lOiAib3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIgorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNzaW5nVG9rZW5FeGNlcHRpb24uanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9NaXNzaW5nVG9rZW5FeGNlcHRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzFhNWYwNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5qcwpAQCAtMCwwICsxLDI4IEBACitvcmcuYW50bHIucnVudGltZS5NaXNzaW5nVG9rZW5FeGNlcHRpb24gPSBmdW5jdGlvbihleHBlY3RpbmcsIGlucHV0LCBpbnNlcnRlZCkgeworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPjApIHsKKyAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuTWlzc2luZ1Rva2VuRXhjZXB0aW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCgKKyAgICAgICAgICAgICAgICB0aGlzLCBleHBlY3RpbmcsIGlucHV0KTsKKyAgICAgICAgdGhpcy5pbnNlcnRlZCA9IGluc2VydGVkOworICAgIH0KK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZCgKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNzaW5nVG9rZW5FeGNlcHRpb24sCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLCB7CisgICAgZ2V0TWlzc2luZ1R5cGU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5leHBlY3Rpbmc7CisgICAgfSwKKworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKG9yZy5hbnRsci5sYW5nLmlzVmFsdWUodGhpcy5pbnNlcnRlZCkgJiYKKyAgICAgICAgICAgIG9yZy5hbnRsci5sYW5nLmlzVmFsdWUodGhpcy50b2tlbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGluc2VydGVkICIrdGhpcy5pbnNlcnRlZCsiIGF0ICIrdGhpcy50b2tlbi5nZXRUZXh0KCkrIikiOworICAgICAgICB9CisgICAgICAgIGlmICggb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0aGlzLnRva2VuKSApIHsKKyAgICAgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGF0ICIrdGhpcy50b2tlbi5nZXRUZXh0KCkrIikiOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uIjsKKyAgICB9LAorICAgIG5hbWU6ICJvcmcuYW50bHIucnVudGltZS5NaXNzaW5nVG9rZW5FeGNlcHRpb24iCit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL05vVmlhYmxlQWx0RXhjZXB0aW9uLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvTm9WaWFibGVBbHRFeGNlcHRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Y1ZWVmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL05vVmlhYmxlQWx0RXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMjQgQEAKK29yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uID0gZnVuY3Rpb24oZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lzaW9uTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQpCit7CisgICAgb3JnLmFudGxyLnJ1bnRpbWUuTm9WaWFibGVBbHRFeGNlcHRpb24uc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGlucHV0KTsKKyAgICB0aGlzLmdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uID0gZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb247CisgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyOworICAgIHRoaXMuc3RhdGVOdW1iZXIgPSBzdGF0ZU51bWJlcjsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZCgKKyAgICBvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiwKKyAgICBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbiwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCB0aGlzLmlucHV0IGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuQ2hhclN0cmVhbSApIHsKKyAgICAgICAgICAgIHJldHVybiAiTm9WaWFibGVBbHRFeGNlcHRpb24oJyIrdGhpcy5nZXRVbmV4cGVjdGVkVHlwZSgpKyInQFsiK3RoaXMuZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIl0pIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiTm9WaWFibGVBbHRFeGNlcHRpb24oIit0aGlzLmdldFVuZXhwZWN0ZWRUeXBlKCkrIkBbIit0aGlzLmdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uKyJdKSI7CisgICAgICAgIH0KKyAgICB9LAorICAgIG5hbWU6ICJvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiIKK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3YTI2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9QYXJzZXIuanMKQEAgLTAsMCArMSw3MSBAQAorLyoqIEEgcGFyc2VyIGZvciBUb2tlblN0cmVhbXMuICAicGFyc2VyIGdyYW1tYXJzIiByZXN1bHQgaW4gYSBzdWJjbGFzcworICogIG9mIHRoaXMuCisgKi8KK29yZy5hbnRsci5ydW50aW1lLlBhcnNlciA9IGZ1bmN0aW9uKGlucHV0LCBzdGF0ZSkgeworICAgIG9yZy5hbnRsci5ydW50aW1lLlBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgc3RhdGUpOworICAgIHRoaXMuc2V0VG9rZW5TdHJlYW0oaW5wdXQpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLlBhcnNlciwgb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIsIHsKKyAgICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgIC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworCQlvcmcuYW50bHIucnVudGltZS5QYXJzZXIuc3VwZXJjbGFzcy5yZXNldC5jYWxsKHRoaXMpOworCQlpZiAoIG9yZy5hbnRsci5sYW5nLmlzVmFsdWUodGhpcy5pbnB1dCkgKSB7CisJCQl0aGlzLmlucHV0LnNlZWsoMCk7IC8vIHJld2luZCB0aGUgaW5wdXQKKwkJfQorCX0sCisKKyAgICBnZXRDdXJyZW50SW5wdXRTeW1ib2w6IGZ1bmN0aW9uKGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5MVCgxKTsKKyAgICB9LAorCisgICAgZ2V0TWlzc2luZ1N5bWJvbDogZnVuY3Rpb24oaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFRva2VuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3cpCisgICAgeworICAgICAgICB2YXIgdG9rZW5UZXh0ID0KKyAgICAgICAgICAgICI8bWlzc2luZyAiK3RoaXMuZ2V0VG9rZW5OYW1lcygpW2V4cGVjdGVkVG9rZW5UeXBlXSsiPiI7CisgICAgICAgIHZhciB0ID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKGV4cGVjdGVkVG9rZW5UeXBlLCB0b2tlblRleHQpOworICAgICAgICB2YXIgY3VycmVudCA9IGlucHV0LkxUKDEpOworICAgICAgICB2YXIgb2xkX2N1cnJlbnQ7CisgICAgICAgIGlmICggY3VycmVudC5nZXRUeXBlKCkgPT09IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRiApIHsKKyAgICAgICAgICAgIG9sZF9jdXJyZW50ID0gY3VycmVudDsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBpbnB1dC5MVCgtMSk7CisgICAgICAgICAgICAvLyBoYW5kbGUgZWRnZSBjYXNlIHdoZXJlIHRoZXJlIGFyZSBubyBnb29kIHRva2VucyBpbiB0aGUgc3RyZWFtCisgICAgICAgICAgICBpZiAoIWN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gb2xkX2N1cnJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdC5saW5lID0gY3VycmVudC5nZXRMaW5lKCk7CisgICAgICAgIHQuY2hhclBvc2l0aW9uSW5MaW5lID0gY3VycmVudC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKyAgICAgICAgdC5jaGFubmVsID0gb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXIuREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICByZXR1cm4gdDsKKyAgICB9LAorCisKKwkvKiogU2V0IHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJlc2V0IHRoZSBwYXJzZXIgKi8KKyAgICBzZXRUb2tlblN0cmVhbTogZnVuY3Rpb24oaW5wdXQpIHsKKwkJdGhpcy5pbnB1dCA9IG51bGw7CisJCXRoaXMucmVzZXQoKTsKKwkJdGhpcy5pbnB1dCA9IGlucHV0OworCX0sCisKKyAgICBnZXRUb2tlblN0cmVhbTogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmlucHV0OworCX0sCisKKyAgICBnZXRTb3VyY2VOYW1lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuZ2V0U291cmNlTmFtZSgpOworICAgIH0sCisKKyAgICB0cmFjZUluOiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSAgeworCQlvcmcuYW50bHIucnVudGltZS5QYXJzZXIuc3VwZXJjbGFzcy50cmFjZUluLmNhbGwoCisgICAgICAgICAgICAgICAgdGhpcywgcnVsZU5hbWUsIHJ1bGVJbmRleCwgdGhpcy5pbnB1dC5MVCgxKSk7CisJfSwKKworICAgIHRyYWNlT3V0OiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSAgeworCQlvcmcuYW50bHIucnVudGltZS5QYXJzZXIuc3VwZXJjbGFzcy50cmFjZU91dC5jYWxsKAorICAgICAgICAgICAgICAgIHRoaXMsIHJ1bGVOYW1lLCBydWxlSW5kZXgsIHRoaXMuaW5wdXQuTFQoMSkpOworCX0KK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmOWM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9QYXJzZXJSdWxlUmV0dXJuU2NvcGUuanMKQEAgLTAsMCArMSwyNyBAQAorLyoqIFJ1bGVzIHRoYXQgcmV0dXJuIG1vcmUgdGhhbiBhIHNpbmdsZSB2YWx1ZSBtdXN0IHJldHVybiBhbiBvYmplY3QKKyAqICBjb250YWluaW5nIGFsbCB0aGUgdmFsdWVzLiAgQmVzaWRlcyB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluCisgKiAgUnVsZUxhYmVsU2NvcGUucHJlZGVmaW5lZFJ1bGVQcm9wZXJ0aWVzU2NvcGUgdGhlcmUgbWF5IGJlIHVzZXItZGVmaW5lZAorICogIHJldHVybiB2YWx1ZXMuICBUaGlzIGNsYXNzIHNpbXBseSBkZWZpbmVzIHRoZSBtaW5pbXVtIHByb3BlcnRpZXMgdGhhdAorICogIGFyZSBhbHdheXMgZGVmaW5lZCBhbmQgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIG90aGVycyB0aGF0IG1pZ2h0IGJlCisgKiAgYXZhaWxhYmxlIGRlcGVuZGluZyBvbiBvdXRwdXQgb3B0aW9uIHN1Y2ggYXMgdGVtcGxhdGUgYW5kIHRyZWUuCisgKgorICogIE5vdGUgdGV4dCBpcyBub3QgYW4gYWN0dWFsIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gdmFsdWUsIGl0IGlzIGNvbXB1dGVkCisgKiAgZnJvbSBzdGFydCBhbmQgc3RvcCB1c2luZyB0aGUgaW5wdXQgc3RyZWFtJ3MgdG9TdHJpbmcoKSBtZXRob2QuICBJCisgKiAgY291bGQgYWRkIGEgY3RvciB0byB0aGlzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaW4gYW5kIHN0b3JlIHRoZSBpbnB1dAorICogIHN0cmVhbSwgYnV0IEknbSBub3Qgc3VyZSB3ZSB3YW50IHRvIGRvIHRoYXQuICBJdCB3b3VsZCBzZWVtIHRvIGJlIHVuZGVmaW5lZAorICogIHRvIGdldCB0aGUgLnRleHQgcHJvcGVydHkgYW55d2F5IGlmIHRoZSBydWxlIG1hdGNoZXMgdG9rZW5zIGZyb20gbXVsdGlwbGUKKyAqICBpbnB1dCBzdHJlYW1zLgorICoKKyAqICBJIGRvIG5vdCB1c2UgZ2V0dGVycyBmb3IgZmllbGRzIG9mIG9iamVjdHMgdGhhdCBhcmUgdXNlZCBzaW1wbHkgdG8KKyAqICBncm91cCB2YWx1ZXMgc3VjaCBhcyB0aGlzIGFnZ3JlZ2F0ZS4gIFRoZSBnZXR0ZXJzL3NldHRlcnMgYXJlIHRoZXJlIHRvCisgKiAgc2F0aXNmeSB0aGUgc3VwZXJjbGFzcyBpbnRlcmZhY2UuCisgKi8KK29yZy5hbnRsci5ydW50aW1lLlBhcnNlclJ1bGVSZXR1cm5TY29wZSA9IGZ1bmN0aW9uKCkge307CitvcmcuYW50bHIucnVudGltZS5SdWxlUmV0dXJuU2NvcGUgPSBmdW5jdGlvbigpIHt9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQob3JnLmFudGxyLnJ1bnRpbWUuUGFyc2VyUnVsZVJldHVyblNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLlJ1bGVSZXR1cm5TY29wZSwKK3sKKyAgICBnZXRTdGFydDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnN0YXJ0OyB9LAorICAgIGdldFN0b3A6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5zdG9wOyB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM5ODYwNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMTgxIEBACisvKiogVGhlIHJvb3Qgb2YgdGhlIEFOVExSIGV4Y2VwdGlvbiBoaWVyYXJjaHkuCisgKgorICogIDxwPlRvIGF2b2lkIEVuZ2xpc2gtb25seSBlcnJvciBtZXNzYWdlcyBhbmQgdG8gZ2VuZXJhbGx5IG1ha2UgdGhpbmdzCisgKiAgYXMgZmxleGlibGUgYXMgcG9zc2libGUsIHRoZXNlIGV4Y2VwdGlvbnMgYXJlIG5vdCBjcmVhdGVkIHdpdGggc3RyaW5ncywKKyAqICBidXQgcmF0aGVyIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgYW4gZXJyb3IuICBUaGVuCisgKiAgdGhlIHZhcmlvdXMgcmVwb3J0aW5nIG1ldGhvZHMgaW4gUGFyc2VyIGFuZCBMZXhlciBjYW4gYmUgb3ZlcnJpZGRlbgorICogIHRvIGdlbmVyYXRlIGEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UuICBGb3IgZXhhbXBsZSwgTWlzbWF0Y2hlZFRva2VuCisgKiAgZXhjZXB0aW9ucyBhcmUgYnVpbHQgd2l0aCB0aGUgZXhwZWN0ZWQgdG9rZW4gdHlwZS4KKyAqICBTbywgZG9uJ3QgZXhwZWN0IGdldE1lc3NhZ2UoKSB0byByZXR1cm4gYW55dGhpbmcuPC9wPgorICoKKyAqICA8cD5BTlRMUiBnZW5lcmF0ZXMgY29kZSB0aGF0IHRocm93cyBleGNlcHRpb25zIHVwb24gcmVjb2duaXRpb24gZXJyb3IgYW5kCisgKiAgYWxzbyBnZW5lcmF0ZXMgY29kZSB0byBjYXRjaCB0aGVzZSBleGNlcHRpb25zIGluIGVhY2ggcnVsZS4gIElmIHlvdQorICogIHdhbnQgdG8gcXVpdCB1cG9uIGZpcnN0IGVycm9yLCB5b3UgY2FuIHR1cm4gb2ZmIHRoZSBhdXRvbWF0aWMgZXJyb3IKKyAqICBoYW5kbGluZyBtZWNoYW5pc20gdXNpbmcgcnVsZWNhdGNoIGFjdGlvbiwgYnV0IHlvdSBzdGlsbCBuZWVkIHRvCisgKiAgb3ZlcnJpZGUgbWV0aG9kcyBtaXNtYXRjaCBhbmQgcmVjb3ZlckZyb21NaXNtYXRjaFNldC48L3A+CisgKgorICogIDxwPkluIGdlbmVyYWwsIHRoZSByZWNvZ25pdGlvbiBleGNlcHRpb25zIGNhbiB0cmFjayB3aGVyZSBpbiBhIGdyYW1tYXIgYQorICogIHByb2JsZW0gb2NjdXJyZWQgYW5kL29yIHdoYXQgd2FzIHRoZSBleHBlY3RlZCBpbnB1dC4gIFdoaWxlIHRoZSBwYXJzZXIKKyAqICBrbm93cyBpdHMgc3RhdGUgKHN1Y2ggYXMgY3VycmVudCBpbnB1dCBzeW1ib2wgYW5kIGxpbmUgaW5mbykgdGhhdAorICogIHN0YXRlIGNhbiBjaGFuZ2UgYmVmb3JlIHRoZSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgc28gY3VycmVudCB0b2tlbiBpbmRleAorICogIGlzIGNvbXB1dGVkIGFuZCBzdG9yZWQgYXQgZXhjZXB0aW9uIHRpbWUuICBGcm9tIHRoaXMgaW5mbywgeW91IGNhbgorICogIHBlcmhhcHMgcHJpbnQgYW4gZW50aXJlIGxpbmUgb2YgaW5wdXQgbm90IGp1c3QgYSBzaW5nbGUgdG9rZW4sIGZvciBleGFtcGxlLgorICogIEJldHRlciB0byBqdXN0IHNheSB0aGUgcmVjb2duaXplciBoYWQgYSBwcm9ibGVtIGFuZCB0aGVuIGxldCB0aGUgcGFyc2VyCisgKiAgZmlndXJlIG91dCBhIGZhbmN5IHJlcG9ydC48L3A+CisgKgorICogIEBjbGFzcworICogIEBwYXJhbSB7b3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW18b3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbXxvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbX0gaW5wdXQgaW5wdXQgc3RyZWFtIHRoYXQgaGFzIGFuIGV4Y2VwdGlvbi4KKyAqICBAZXh0ZW5kcyBFcnJvcgorICoKKyAqLworb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb24gPSBmdW5jdGlvbihpbnB1dCkgeworICAgIG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzKTsKKyAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgdGhpcy5pbmRleCA9IGlucHV0LmluZGV4KCk7CisgICAgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlRva2VuU3RyZWFtICkgeworICAgICAgICB0aGlzLnRva2VuID0gaW5wdXQuTFQoMSk7CisgICAgICAgIHRoaXMubGluZSA9IHRoaXMudG9rZW4uZ2V0TGluZSgpOworICAgICAgICB0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IHRoaXMudG9rZW4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisgICAgfQorICAgIGlmICggaW5wdXQgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtICkgeworICAgICAgICB0aGlzLmV4dHJhY3RJbmZvcm1hdGlvbkZyb21UcmVlTm9kZVN0cmVhbShpbnB1dCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW0gKSB7CisgICAgICAgIC8vIE5vdGU6IHJlbW92ZWQgQ2hhclN0cmVhbSBmcm9tIGhpZXJhcmNoeSBpbiBKUyBwb3J0IHNvIGNoZWNraW5nIGZvcgorICAgICAgICAvLyBTdHJpbmdTdHJlYW0gaW5zdGVhZAorICAgICAgICB0aGlzLmMgPSBpbnB1dC5MQSgxKTsKKyAgICAgICAgdGhpcy5saW5lID0gaW5wdXQuZ2V0TGluZSgpOworICAgICAgICB0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LmdldENoYXJQb3NpdGlvbkluTGluZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGhpcy5jID0gaW5wdXQuTEEoMSk7CisgICAgfQorCisgICAgdGhpcy5tZXNzYWdlID0gdGhpcy50b1N0cmluZygpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uLCBFcnJvciwKKy8qKiBAbGVuZHMgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb24ucHJvdG90eXBlICovCit7CisJLyoqCisgICAgICogV2hhdCBpbnB1dCBzdHJlYW0gZGlkIHRoZSBlcnJvciBvY2N1ciBpbj8KKyAgICAgKi8KKyAgICBpbnB1dDogbnVsbCwKKworICAgIC8qKiBXaGF0IGlzIGluZGV4IG9mIHRva2VuL2NoYXIgd2VyZSB3ZSBsb29raW5nIGF0IHdoZW4gdGhlIGVycm9yIG9jY3VycmVkPworICAgICAqICBAdHlwZSBOdW1iZXIKKyAgICAgKi8KKwlpbmRleDogbnVsbCwKKworCS8qKiBUaGUgY3VycmVudCBUb2tlbiB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiAgU2luY2Ugbm90IGFsbCBzdHJlYW1zCisJICogIGNhbiByZXRyaWV2ZSB0aGUgaXRoIFRva2VuLCB3ZSBoYXZlIHRvIHRyYWNrIHRoZSBUb2tlbiBvYmplY3QuCisJICogIEZvciBwYXJzZXJzLiAgRXZlbiB3aGVuIGl0J3MgYSB0cmVlIHBhcnNlciwgdG9rZW4gbWlnaHQgYmUgc2V0LgorICAgICAqICBAdHlwZSBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbgorCSAqLworCXRva2VuOiBudWxsLAorCisJLyoqIElmIHRoaXMgaXMgYSB0cmVlIHBhcnNlciBleGNlcHRpb24sIG5vZGUgaXMgc2V0IHRvIHRoZSBub2RlIHdpdGgKKwkgKiAgdGhlIHByb2JsZW0uCisgICAgICogIEB0eXBlIE9iamVjdAorCSAqLworCW5vZGU6IG51bGwsCisKKwkvKiogVGhlIGN1cnJlbnQgY2hhciB3aGVuIGFuIGVycm9yIG9jY3VycmVkLiBGb3IgbGV4ZXJzLgorICAgICAqICBAdHlwZSBOdW1iZXIKKyAgICAgKi8KKwljOiBudWxsLAorCisJLyoqIFRyYWNrIHRoZSBsaW5lIGF0IHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZCBpbiBjYXNlIHRoaXMgaXMKKwkgKiAgZ2VuZXJhdGVkIGZyb20gYSBsZXhlci4gIFdlIG5lZWQgdG8gdHJhY2sgdGhpcyBzaW5jZSB0aGUKKwkgKiAgdW5leHBlY3RlZCBjaGFyIGRvZXNuJ3QgY2FycnkgdGhlIGxpbmUgaW5mby4KKyAgICAgKiAgQHR5cGUgTnVtYmVyCisJICovCisJbGluZTogbnVsbCwKKworICAgIC8qKiBUaGUgZXhjZXB0aW9uJ3MgY2xhc3MgbmFtZS4KKyAgICAgKiAgQHR5cGUgU3RyaW5nCisgICAgICovCisgICAgbmFtZTogIm9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uIiwKKworICAgIC8qKiBQb3NpdGlvbiBpbiB0aGUgbGluZSB3aGVyZSBleGNlcHRpb24gb2NjdXJyZWQuCisgICAgICogIEB0eXBlIE51bWJlcgorICAgICAqLworCWNoYXJQb3NpdGlvbkluTGluZTogbnVsbCwKKworCS8qKiBJZiB5b3UgYXJlIHBhcnNpbmcgYSB0cmVlIG5vZGUgc3RyZWFtLCB5b3Ugd2lsbCBlbmNvdW50ZXIgc29tCisJICogIGltYWdpbmFyeSBub2RlcyB3L28gbGluZS9jb2wgaW5mby4gIFdlIG5vdyBzZWFyY2ggYmFja3dhcmRzIGxvb2tpbmcKKwkgKiAgZm9yIG1vc3QgcmVjZW50IHRva2VuIHdpdGggbGluZS9jb2wgaW5mbywgYnV0IG5vdGlmeSBnZXRFcnJvckhlYWRlcigpCisJICogIHRoYXQgaW5mbyBpcyBhcHByb3hpbWF0ZS4KKyAgICAgKiAgQHR5cGUgQm9vbGVhbgorCSAqLworCWFwcHJveGltYXRlTGluZUluZm86IG51bGwsCisKKyAgICAvKiogR2F0aGVyIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGlucHV0IHN0cmVhbS4KKyAgICAgKiAgQHBhcmFtIHtvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbXxvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtfG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtfSBpbnB1dCBpbnB1dCBzdHJlYW0gdGhhdCBoYXMgYW4gZXhjZXB0aW9uLgorICAgICAqLworCWV4dHJhY3RJbmZvcm1hdGlvbkZyb21UcmVlTm9kZVN0cmVhbTogZnVuY3Rpb24oaW5wdXQpIHsKKwkJdmFyIG5vZGVzID0gaW5wdXQsCisgICAgICAgICAgICBwcmlvck5vZGUsCisgICAgICAgICAgICBwcmlvclBheWxvYWQsCisgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgIGk7CisKKwkJdGhpcy5ub2RlID0gbm9kZXMuTFQoMSk7CisJCXZhciBhZGFwdG9yID0gbm9kZXMuZ2V0VHJlZUFkYXB0b3IoKSwKKwkJICAgIHBheWxvYWQgPSBhZGFwdG9yLmdldFRva2VuKHRoaXMubm9kZSk7CisJCWlmICggcGF5bG9hZCApIHsKKwkJCXRoaXMudG9rZW4gPSBwYXlsb2FkOworCQkJaWYgKCBwYXlsb2FkLmdldExpbmUoKTw9IDAgKSB7CisJCQkJLy8gaW1hZ2luYXJ5IG5vZGU7IG5vIGxpbmUvcG9zIGluZm87IHNjYW4gYmFja3dhcmRzCisJCQkJaSA9IC0xOworCQkJCXByaW9yTm9kZSA9IG5vZGVzLkxUKGkpOworCQkJCXdoaWxlICggcHJpb3JOb2RlICkgeworCQkJCQlwcmlvclBheWxvYWQgPSBhZGFwdG9yLmdldFRva2VuKHByaW9yTm9kZSk7CisJCQkJCWlmICggcHJpb3JQYXlsb2FkICYmIHByaW9yUGF5bG9hZC5nZXRMaW5lKCk+MCApIHsKKwkJCQkJCS8vIHdlIGZvdW5kIHRoZSBtb3N0IHJlY2VudCByZWFsIGxpbmUgLyBwb3MgaW5mbworCQkJCQkJdGhpcy5saW5lID0gcHJpb3JQYXlsb2FkLmdldExpbmUoKTsKKwkJCQkJCXRoaXMuY2hhclBvc2l0aW9uSW5MaW5lID0gcHJpb3JQYXlsb2FkLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQkJCQkJdGhpcy5hcHByb3hpbWF0ZUxpbmVJbmZvID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS0taTsKKwkJCQkJcHJpb3JOb2RlID0gbm9kZXMuTFQoaSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7IC8vIG5vZGUgY3JlYXRlZCBmcm9tIHJlYWwgdG9rZW4KKwkJCQl0aGlzLmxpbmUgPSBwYXlsb2FkLmdldExpbmUoKTsKKwkJCQl0aGlzLmNoYXJQb3NpdGlvbkluTGluZSA9IHBheWxvYWQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHRoaXMubm9kZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZSkgeworCQkJdGhpcy5saW5lID0gdGhpcy5ub2RlLmdldExpbmUoKTsKKwkJCXRoaXMuY2hhclBvc2l0aW9uSW5MaW5lID0gdGhpcy5ub2RlLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQkJaWYgKCB0aGlzLm5vZGUgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUpIHsKKwkJCQl0aGlzLnRva2VuID0gdGhpcy5ub2RlLnRva2VuOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJdHlwZSA9IGFkYXB0b3IuZ2V0VHlwZSh0aGlzLm5vZGUpOworCQkJdGV4dCA9IGFkYXB0b3IuZ2V0VGV4dCh0aGlzLm5vZGUpOworCQkJdGhpcy50b2tlbiA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbih0eXBlLCB0ZXh0KTsKKwkJfQorCX0sCisKKwkvKiogUmV0dXJuIHRoZSB0b2tlbiB0eXBlIG9yIGNoYXIgb2YgdGhlIHVuZXhwZWN0ZWQgaW5wdXQgZWxlbWVudAorICAgICAqICBAcmV0dXJuIHtOdW1iZXJ9IHR5cGUgb2YgdGhlIHVuZXhwZWN0ZWQgaW5wdXQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBnZXRVbmV4cGVjdGVkVHlwZTogZnVuY3Rpb24oKSB7CisJCWlmICggdGhpcy5pbnB1dCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlRva2VuU3RyZWFtICkgeworCQkJcmV0dXJuIHRoaXMudG9rZW4uZ2V0VHlwZSgpOworCQl9CisJCWVsc2UgaWYgKCB0aGlzLmlucHV0IGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbSApIHsKKwkJCXZhciBub2RlcyA9IHRoaXMuaW5wdXQ7CisJCQl2YXIgYWRhcHRvciA9IG5vZGVzLmdldFRyZWVBZGFwdG9yKCk7CisJCQlyZXR1cm4gYWRhcHRvci5nZXRUeXBlKHRoaXMubm9kZSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gdGhpcy5jOworCQl9CisJfQorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9SZWNvZ25pemVyU2hhcmVkU3RhdGUuanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9SZWNvZ25pemVyU2hhcmVkU3RhdGUuanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NhMjVkNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5qcwpAQCAtMCwwICsxLDkwIEBACisvKiogVGhlIHNldCBvZiBmaWVsZHMgbmVlZGVkIGJ5IGFuIGFic3RyYWN0IHJlY29nbml6ZXIgdG8gcmVjb2duaXplIGlucHV0CisgKiAgYW5kIHJlY292ZXIgZnJvbSBlcnJvcnMgZXRjLi4uICBBcyBhIHNlcGFyYXRlIHN0YXRlIG9iamVjdCwgaXQgY2FuIGJlCisgKiAgc2hhcmVkIGFtb25nIG11bHRpcGxlIGdyYW1tYXJzOyBlLmcuLCB3aGVuIG9uZSBncmFtbWFyIGltcG9ydHMgYW5vdGhlci4KKyAqCisgKiAgVGhlc2UgZmllbGRzIGFyZSBwdWJsaWNhbGx5IHZpc2libGUgYnV0IHRoZSBhY3R1YWwgc3RhdGUgcG9pbnRlciBwZXIKKyAqICBwYXJzZXIgaXMgcHJvdGVjdGVkLgorICovCitvcmcuYW50bHIucnVudGltZS5SZWNvZ25pemVyU2hhcmVkU3RhdGUgPSBmdW5jdGlvbigpIHsKKyAgICAvKiogVHJhY2sgdGhlIHNldCBvZiB0b2tlbiB0eXBlcyB0aGF0IGNhbiBmb2xsb3cgYW55IHJ1bGUgaW52b2NhdGlvbi4KKyAgICAgKiAgU3RhY2sgZ3Jvd3MgdXB3YXJkcy4gIFdoZW4gaXQgaGl0cyB0aGUgbWF4LCBpdCBncm93cyAyeCBpbiBzaXplCisgICAgICogIGFuZCBrZWVwcyBnb2luZy4KKyAgICAgKi8KKyAgICB0aGlzLmZvbGxvd2luZyA9IFtdOworCisgICAgdGhpcy5fZnNwID0gLTE7CisKKyAgICAvKiogVGhpcyBpcyB0cnVlIHdoZW4gd2Ugc2VlIGFuIGVycm9yIGFuZCBiZWZvcmUgaGF2aW5nIHN1Y2Nlc3NmdWxseQorICAgICAqICBtYXRjaGVkIGEgdG9rZW4uICBQcmV2ZW50cyBnZW5lcmF0aW9uIG9mIG1vcmUgdGhhbiBvbmUgZXJyb3IgbWVzc2FnZQorICAgICAqICBwZXIgZXJyb3IuCisgICAgICovCisgICAgdGhpcy5lcnJvclJlY292ZXJ5ID0gZmFsc2U7CisKKyAgICAvKiogVGhlIGluZGV4IGludG8gdGhlIGlucHV0IHN0cmVhbSB3aGVyZSB0aGUgbGFzdCBlcnJvciBvY2N1cnJlZC4KKyAgICAgKiAgVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlcmUgYW4gZXJyb3IgaXMgZm91bmQKKyAgICAgKiAgYnV0IG5vIHRva2VuIGlzIGNvbnN1bWVkIGR1cmluZyByZWNvdmVyeS4uLmFub3RoZXIgZXJyb3IgaXMgZm91bmQsCisgICAgICogIGFkIG5hc2V1bS4gIFRoaXMgaXMgYSBmYWlsc2FmZSBtZWNoYW5pc20gdG8gZ3VhcmFudGVlIHRoYXQgYXQgbGVhc3QKKyAgICAgKiAgb25lIHRva2VuL3RyZWUgbm9kZSBpcyBjb25zdW1lZCBmb3IgdHdvIGVycm9ycy4KKyAgICAgKi8KKyAgICB0aGlzLmxhc3RFcnJvckluZGV4ID0gLTE7CisKKyAgICAvKiogSW4gbGlldSBvZiBhIHJldHVybiB2YWx1ZSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHJ1bGUgb3IgdG9rZW4KKyAgICAgKiAgaGFzIGZhaWxlZCB0byBtYXRjaC4gIFJlc2V0IHRvIGZhbHNlIHVwb24gdmFsaWQgdG9rZW4gbWF0Y2guCisgICAgICovCisgICAgdGhpcy5mYWlsZWQgPSBmYWxzZTsKKworICAgIC8qKiBEaWQgdGhlIHJlY29nbml6ZXIgZW5jb3VudGVyIGEgc3ludGF4IGVycm9yPyAgVHJhY2sgaG93IG1hbnkuICovCisgICAgdGhpcy5zeW50YXhFcnJvcnMgPSAwOworCisgICAgLyoqIElmIDAsIG5vIGJhY2t0cmFja2luZyBpcyBnb2luZyBvbi4gIFNhZmUgdG8gZXhlYyBhY3Rpb25zIGV0Yy4uLgorICAgICAqICBJZiA+MCB0aGVuIGl0J3MgdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZy4KKyAgICAgKi8KKyAgICB0aGlzLmJhY2t0cmFja2luZyA9IDA7CisKKyAgICAvKiogQW4gYXJyYXlbc2l6ZSBudW0gcnVsZXNdIG9mIE1hcDxJbnRlZ2VyLEludGVnZXI+IHRoYXQgdHJhY2tzCisgICAgICogIHRoZSBzdG9wIHRva2VuIGluZGV4IGZvciBlYWNoIHJ1bGUuICBydWxlTWVtb1tydWxlSW5kZXhdIGlzCisgICAgICogIHRoZSBtZW1vaXphdGlvbiB0YWJsZSBmb3IgcnVsZUluZGV4LiAgRm9yIGtleSBydWxlU3RhcnRJbmRleCwgeW91CisgICAgICogIGdldCBiYWNrIHRoZSBzdG9wIHRva2VuIGZvciBhc3NvY2lhdGVkIHJ1bGUgb3IgTUVNT19SVUxFX0ZBSUxFRC4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIG9ubHkgdXNlZCBpZiBydWxlIG1lbW9pemF0aW9uIGlzIG9uICh3aGljaCBpdCBpcyBieSBkZWZhdWx0KS4KKyAgICAgKi8KKyAgICB0aGlzLnJ1bGVNZW1vID0gbnVsbDsKKworCisgICAgLy8gTEVYRVIgRklFTERTIChtdXN0IGJlIGluIHNhbWUgc3RhdGUgb2JqZWN0IHRvIGF2b2lkIGNhc3RpbmcKKyAgICAvLyAgICAgICAgICAgICAgIGNvbnN0YW50bHkgaW4gZ2VuZXJhdGVkIGNvZGUgYW5kIExleGVyIG9iamVjdCkgOigKKworCisgICAgLyoqIFRoZSBnb2FsIG9mIGFsbCBsZXhlciBydWxlcy9tZXRob2RzIGlzIHRvIGNyZWF0ZSBhIHRva2VuIG9iamVjdC4KKyAgICAgKiAgVGhpcyBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSBhcyBtdWx0aXBsZSBydWxlcyBtYXkgY29sbGFib3JhdGUgdG8KKyAgICAgKiAgY3JlYXRlIGEgc2luZ2xlIHRva2VuLiAgbmV4dFRva2VuIHdpbGwgcmV0dXJuIHRoaXMgb2JqZWN0IGFmdGVyCisgICAgICogIG1hdGNoaW5nIGxleGVyIHJ1bGUocykuICBJZiB5b3Ugc3ViY2xhc3MgdG8gYWxsb3cgbXVsdGlwbGUgdG9rZW4KKyAgICAgKiAgZW1pc3Npb25zLCB0aGVuIHNldCB0aGlzIHRvIHRoZSBsYXN0IHRva2VuIHRvIGJlIG1hdGNoZWQgb3IKKyAgICAgKiAgc29tZXRoaW5nIG5vbm51bGwgc28gdGhhdCB0aGUgYXV0byB0b2tlbiBlbWl0IG1lY2hhbmlzbSB3aWxsIG5vdAorICAgICAqICBlbWl0IGFub3RoZXIgdG9rZW4uCisgICAgICovCisgICAgdGhpcy50b2tlbiA9IG51bGw7CisKKyAgICAvKiogV2hhdCBjaGFyYWN0ZXIgaW5kZXggaW4gdGhlIHN0cmVhbSBkaWQgdGhlIGN1cnJlbnQgdG9rZW4gc3RhcnQgYXQ/CisgICAgICogIE5lZWRlZCwgZm9yIGV4YW1wbGUsIHRvIGdldCB0aGUgdGV4dCBmb3IgY3VycmVudCB0b2tlbi4gIFNldCBhdAorICAgICAqICB0aGUgc3RhcnQgb2YgbmV4dFRva2VuLgorICAgICAqLworICAgIHRoaXMudG9rZW5TdGFydENoYXJJbmRleCA9IC0xOworCisgICAgLyoqIFRoZSBsaW5lIG9uIHdoaWNoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHRva2VuIHJlc2lkZXMgKi8KKyAgICAvLyB0aGlzLnRva2VuU3RhcnRMaW5lOworCisgICAgLyoqIFRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgZmlyc3QgY2hhcmFjdGVyIHdpdGhpbiB0aGUgbGluZSAqLworICAgIC8vIHRoaXMudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKworICAgIC8qKiBUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHRva2VuICovCisgICAgLy8gdGhpcy5jaGFubmVsOworCisgICAgLyoqIFRoZSB0b2tlbiB0eXBlIGZvciB0aGUgY3VycmVudCB0b2tlbiAqLworICAgIC8vIHRoaXMudHlwZTsKKworICAgIC8qKiBZb3UgY2FuIHNldCB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgdG9rZW4gdG8gb3ZlcnJpZGUgd2hhdCBpcyBpbgorICAgICAqICB0aGUgaW5wdXQgY2hhciBidWZmZXIuICBVc2Ugc2V0VGV4dCgpIG9yIGNhbiBzZXQgdGhpcyBpbnN0YW5jZSB2YXIuCisgICAgICovCisgICAgdGhpcy50ZXh0ID0gbnVsbDsKK307CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Ub2tlbi5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmNmE4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9Ub2tlbi5qcwpAQCAtMCwwICsxLDQyIEBACisvLyBOQjogQmVjYXVzZSBUb2tlbiBoYXMgc3RhdGljIG1lbWJlcnMgb2YgdHlwZSBDb21tb25Ub2tlbiwgdGhlIFRva2VuIGR1bW15CisvLyBjb25zdHJ1Y3RvciBpcyBkZWZpbmVkIGluIENvbW1vblRva2VuLiAgQWxsIG1ldGhvZHMgYW5kIHZhcnMgb2YgVG9rZW4gYXJlCisvLyBkZWZpbmVkIGhlcmUuICBUb2tlbiBpcyBhbiBpbnRlcmZhY2UsIG5vdCBhIHN1YmNsYXNzIGluIHRoZSBKYXZhIHJ1bnRpbWUuCisKKy8qKgorICogQGNsYXNzIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgYWxsIHRva2VuIHR5cGVzLgorICogQG5hbWUgVG9rZW4KKyAqIEBtZW1iZXJPZiBvcmcuYW50bHIucnVudGltZQorICovCitvcmcuYW50bHIucnVudGltZS5Ub2tlbiA9IGZ1bmN0aW9uKCkge307CitvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0KG9yZy5hbnRsci5ydW50aW1lLlRva2VuLCAvKiogQGxlbmRzIFRva2VuICovIHsKKyAgICBFT1JfVE9LRU5fVFlQRTogMSwKKworICAgIC8qKiBpbWFnaW5hcnkgdHJlZSBuYXZpZ2F0aW9uIHR5cGU7IHRyYXZlcnNlICJnZXQgY2hpbGQiIGxpbmsgKi8KKyAgICBET1dOOiAyLAorICAgIC8qKiBpbWFnaW5hcnkgdHJlZSBuYXZpZ2F0aW9uIHR5cGU7IGZpbmlzaCB3aXRoIGEgY2hpbGQgbGlzdCAqLworICAgIFVQOiAzLAorCisgICAgTUlOX1RPS0VOX1RZUEU6IDQsIC8vIFVQKzEsCisKKyAgICBFT0Y6IG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW0uRU9GLAorICAgIEVPRl9UT0tFTjogbnVsbCwKKworICAgIElOVkFMSURfVE9LRU5fVFlQRTogMCwKKyAgICBJTlZBTElEX1RPS0VOOiBudWxsLAorCisgICAgLyoqIEluIGFuIGFjdGlvbiwgYSBsZXhlciBydWxlIGNhbiBzZXQgdG9rZW4gdG8gdGhpcyBTS0lQX1RPS0VOIGFuZCBBTlRMUgorICAgICAqICB3aWxsIGF2b2lkIGNyZWF0aW5nIGEgdG9rZW4gZm9yIHRoaXMgc3ltYm9sIGFuZCB0cnkgdG8gZmV0Y2ggYW5vdGhlci4KKyAgICAgKi8KKyAgICBTS0lQX1RPS0VOOiBudWxsLAorCisgICAgLyoqIEFsbCB0b2tlbnMgZ28gdG8gdGhlIHBhcnNlciAodW5sZXNzIHNraXAoKSBpcyBjYWxsZWQgaW4gdGhhdCBydWxlKQorICAgICAqICBvbiBhIHBhcnRpY3VsYXIgImNoYW5uZWwiLiAgVGhlIHBhcnNlciB0dW5lcyB0byBhIHBhcnRpY3VsYXIgY2hhbm5lbAorICAgICAqICBzbyB0aGF0IHdoaXRlc3BhY2UgZXRjLi4uIGNhbiBnbyB0byB0aGUgcGFyc2VyIG9uIGEgImhpZGRlbiIgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBERUZBVUxUX0NIQU5ORUw6IDAsCisKKyAgICAvKiogQW55dGhpbmcgb24gZGlmZmVyZW50IGNoYW5uZWwgdGhhbiBERUZBVUxUX0NIQU5ORUwgaXMgbm90IHBhcnNlZAorICAgICAqICBieSBwYXJzZXIuCisgICAgICovCisgICAgSElEREVOX0NIQU5ORUw6IDk5Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuUmV3cml0ZVN0cmVhbS5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1Rva2VuUmV3cml0ZVN0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODFkMTFiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvVG9rZW5SZXdyaXRlU3RyZWFtLmpzCkBAIC0wLDAgKzEsNDYxIEBACisvKiBVc2VmdWwgZm9yIGR1bXBpbmcgb3V0IHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgZG9pbmcgc29tZQorICogIGF1Z21lbnRhdGlvbiBvciBvdGhlciBtYW5pcHVsYXRpb25zLgorICoKKyAqICBZb3UgY2FuIGluc2VydCBzdHVmZiwgcmVwbGFjZSwgYW5kIGRlbGV0ZSBjaHVua3MuICBOb3RlIHRoYXQgdGhlCisgKiAgb3BlcmF0aW9ucyBhcmUgZG9uZSBsYXppbHktLW9ubHkgaWYgeW91IGNvbnZlcnQgdGhlIGJ1ZmZlciB0byBhCisgKiAgU3RyaW5nLiAgVGhpcyBpcyB2ZXJ5IGVmZmljaWVudCBiZWNhdXNlIHlvdSBhcmUgbm90IG1vdmluZyBkYXRhIGFyb3VuZAorICogIGFsbCB0aGUgdGltZS4gIEFzIHRoZSBidWZmZXIgb2YgdG9rZW5zIGlzIGNvbnZlcnRlZCB0byBzdHJpbmdzLCB0aGUKKyAqICB0b1N0cmluZygpIG1ldGhvZChzKSBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gb3BlcmF0aW9uIGF0IHRoZQorICogIGN1cnJlbnQgaW5kZXguICBJZiBzbywgdGhlIG9wZXJhdGlvbiBpcyBkb25lIGFuZCB0aGVuIG5vcm1hbCBTdHJpbmcKKyAqICByZW5kZXJpbmcgY29udGludWVzIG9uIHRoZSBidWZmZXIuICBUaGlzIGlzIGxpa2UgaGF2aW5nIG11bHRpcGxlIFR1cmluZworICogIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcyAocHJvZ3JhbXMpIG9wZXJhdGluZyBvbiBhIHNpbmdsZSBpbnB1dCB0YXBlLiA6KQorICoKKyAqICBTaW5jZSB0aGUgb3BlcmF0aW9ucyBhcmUgZG9uZSBsYXppbHkgYXQgdG9TdHJpbmctdGltZSwgb3BlcmF0aW9ucyBkbyBub3QKKyAqICBzY3JldyB1cCB0aGUgdG9rZW4gaW5kZXggdmFsdWVzLiAgVGhhdCBpcywgYW4gaW5zZXJ0IG9wZXJhdGlvbiBhdCB0b2tlbgorICogIGluZGV4IGkgZG9lcyBub3QgY2hhbmdlIHRoZSBpbmRleCB2YWx1ZXMgZm9yIHRva2VucyBpKzEuLm4tMS4KKyAqCisgKiAgQmVjYXVzZSBvcGVyYXRpb25zIG5ldmVyIGFjdHVhbGx5IGFsdGVyIHRoZSBidWZmZXIsIHlvdSBtYXkgYWx3YXlzIGdldAorICogIHRoZSBvcmlnaW5hbCB0b2tlbiBzdHJlYW0gYmFjayB3aXRob3V0IHVuZG9pbmcgYW55dGhpbmcuICBTaW5jZQorICogIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHF1ZXVlZCB1cCwgeW91IGNhbiBlYXNpbHkgc2ltdWxhdGUgdHJhbnNhY3Rpb25zIGFuZAorICogIHJvbGwgYmFjayBhbnkgY2hhbmdlcyBpZiB0aGVyZSBpcyBhbiBlcnJvciBqdXN0IGJ5IHJlbW92aW5nIGluc3RydWN0aW9ucy4KKyAqICBGb3IgZXhhbXBsZSwKKyAqCisgKiAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKCJpbnB1dCIpOworICogICBUTGV4ZXIgbGV4ID0gbmV3IFRMZXhlcihpbnB1dCk7CisgKiAgIFRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleCk7CisgKiAgIFQgcGFyc2VyID0gbmV3IFQodG9rZW5zKTsKKyAqICAgcGFyc2VyLnN0YXJ0UnVsZSgpOworICoKKyAqICAgICAgVGhlbiBpbiB0aGUgcnVsZXMsIHlvdSBjYW4gZXhlY3V0ZQorICogICAgICBUb2tlbiB0LHU7CisgKiAgICAgIC4uLgorICogICAgICBpbnB1dC5pbnNlcnRBZnRlcih0LCAidGV4dCB0byBwdXQgYWZ0ZXIgdCIpO30KKyAqICAgICAgICAgaW5wdXQuaW5zZXJ0QWZ0ZXIodSwgInRleHQgYWZ0ZXIgdSIpO30KKyAqICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy50b1N0cmluZygpKTsKKyAqCisgKiAgQWN0dWFsbHksIHlvdSBoYXZlIHRvIGNhc3QgdGhlICdpbnB1dCcgdG8gYSBUb2tlblJld3JpdGVTdHJlYW0uIDooCisgKgorICogIFlvdSBjYW4gYWxzbyBoYXZlIG11bHRpcGxlICJpbnN0cnVjdGlvbiBzdHJlYW1zIiBhbmQgZ2V0IG11bHRpcGxlCisgKiAgcmV3cml0ZXMgZnJvbSBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIGlucHV0LiAgSnVzdCBuYW1lIHRoZSBpbnN0cnVjdGlvbgorICogIHN0cmVhbXMgYW5kIHVzZSB0aGF0IG5hbWUgYWdhaW4gd2hlbiBwcmludGluZyB0aGUgYnVmZmVyLiAgVGhpcyBjb3VsZCBiZQorICogIHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBhIEMgZmlsZSBhbmQgYWxzbyBpdHMgaGVhZGVyIGZpbGUtLWFsbCBmcm9tIHRoZQorICogIHNhbWUgYnVmZmVyOgorICoKKyAqICAgICAgdG9rZW5zLmluc2VydEFmdGVyKCJwYXNzMSIsIHQsICJ0ZXh0IHRvIHB1dCBhZnRlciB0Iik7fQorICogICAgICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoInBhc3MyIiwgdSwgInRleHQgYWZ0ZXIgdSIpO30KKyAqICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy50b1N0cmluZygicGFzczEiKSk7CisgKiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMudG9TdHJpbmcoInBhc3MyIikpOworICoKKyAqICBJZiB5b3UgZG9uJ3QgdXNlIG5hbWVkIHJld3JpdGUgc3RyZWFtcywgYSAiZGVmYXVsdCIgc3RyZWFtIGlzIHVzZWQgYXMKKyAqICB0aGUgZmlyc3QgZXhhbXBsZSBzaG93cy4KKyAqLworCitvcmcuYW50bHIucnVudGltZS5Ub2tlblJld3JpdGVTdHJlYW0gPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3VwID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5SZXdyaXRlU3RyZWFtLnN1cGVyY2xhc3M7CisKKyAgICAvKiogWW91IG1heSBoYXZlIG11bHRpcGxlLCBuYW1lZCBzdHJlYW1zIG9mIHJld3JpdGUgb3BlcmF0aW9ucy4KKyAgICAgKiAgSSdtIGNhbGxpbmcgdGhlc2UgdGhpbmdzICJwcm9ncmFtcy4iCisgICAgICogIE1hcHMgU3RyaW5nIChuYW1lKSAtPiByZXdyaXRlIChMaXN0KQorICAgICAqLworICAgIHRoaXMucHJvZ3JhbXMgPSBudWxsOworCisgICAgLyoqIE1hcCBTdHJpbmcgKHByb2dyYW0gbmFtZSkgLT4gSW50ZWdlciBpbmRleCAqLworICAgIHRoaXMubGFzdFJld3JpdGVUb2tlbkluZGV4ZXMgPSBudWxsOworCisKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTApIHsKKyAgICAgICAgdGhpcy5pbml0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VwLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgIHRoaXMuaW5pdCgpOworICAgIH0KK307CisKKyhmdW5jdGlvbigpewordmFyIHRycyA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuUmV3cml0ZVN0cmVhbTsKKworb3JnLmFudGxyLmxhbmcuYXVnbWVudE9iamVjdCh0cnMsIHsKKyAgICBERUZBVUxUX1BST0dSQU1fTkFNRTogImRlZmF1bHQiLAorICAgIFBST0dSQU1fSU5JVF9TSVpFOiAxMDAsCisgICAgTUlOX1RPS0VOX0lOREVYOiAwCit9KTsKKworLy8KKy8vIERlZmluZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gaGllcmFyY2h5CisvLworCit0cnMuUmV3cml0ZU9wZXJhdGlvbiA9IGZ1bmN0aW9uKGluZGV4LCB0ZXh0KSB7CisgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgIHRoaXMudGV4dCA9IHRleHQ7Cit9OworCisvKiogRXhlY3V0ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gYnkgcG9zc2libHkgYWRkaW5nIHRvIHRoZSBidWZmZXIuCisgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB0b2tlbiB0byBvcGVyYXRlIG9uLgorICovCit0cnMuUmV3cml0ZU9wZXJhdGlvbi5wcm90b3R5cGUgPSB7CisgICAgZXhlY3V0ZTogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHJldHVybiB0aGlzLmluZGV4OworICAgIH0sCisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICAvKlN0cmluZyBvcE5hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgaW50ICRpbmRleCA9IG9wTmFtZS5pbmRleE9mKCckJyk7CisgICAgICAgIG9wTmFtZSA9IG9wTmFtZS5zdWJzdHJpbmcoJGluZGV4KzEsIG9wTmFtZS5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiBvcE5hbWUrIkAiK2luZGV4KyciJyt0ZXh0KyciJzsqLworICAgICAgICByZXR1cm4gdGhpcy50ZXh0OworICAgIH0KK307CisKK3Rycy5JbnNlcnRCZWZvcmVPcCA9IGZ1bmN0aW9uKGluZGV4LCB0ZXh0KSB7CisgICAgdHJzLkluc2VydEJlZm9yZU9wLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBpbmRleCwgdGV4dCk7Cit9Oworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKHRycy5JbnNlcnRCZWZvcmVPcCwgdHJzLlJld3JpdGVPcGVyYXRpb24sIHsKKyAgICBleGVjdXRlOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgYnVmLnB1c2godGhpcy50ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7CisgICAgfQorfSk7CisKKy8qKiBJJ20gZ29pbmcgdG8gdHJ5IHJlcGxhY2luZyByYW5nZSBmcm9tIHguLnkgd2l0aCAoeS14KSsxIFJlcGxhY2VPcAorICogIGluc3RydWN0aW9ucy4KKyAqLwordHJzLlJlcGxhY2VPcCA9IGZ1bmN0aW9uKGZyb20sIHRvLCB0ZXh0KSB7CisgICAgdHJzLlJlcGxhY2VPcC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgZnJvbSwgdGV4dCk7IAorICAgIHRoaXMubGFzdEluZGV4ID0gdG87Cit9Oworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKHRycy5SZXBsYWNlT3AsIHRycy5SZXdyaXRlT3BlcmF0aW9uLCB7CisgICAgZXhlY3V0ZTogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIGlmIChvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHRoaXMudGV4dCkpIHsKKyAgICAgICAgICAgIGJ1Zi5wdXNoKHRoaXMudGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMubGFzdEluZGV4KzE7CisgICAgfQorfSk7CisKK3Rycy5EZWxldGVPcCA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7CisgICAgdHJzLkRlbGV0ZU9wLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBmcm9tLCB0byk7IAorfTsKK29yZy5hbnRsci5sYW5nLmV4dGVuZCh0cnMuRGVsZXRlT3AsIHRycy5SZXBsYWNlT3ApOworCitvcmcuYW50bHIubGFuZy5leHRlbmQodHJzLCBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbSwgeworICAgIGluaXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnByb2dyYW1zID0ge307CisgICAgICAgIHRoaXMucHJvZ3JhbXNbdHJzLkRFRkFVTFRfUFJPR1JBTV9OQU1FXSA9IFtdOworICAgICAgICB0aGlzLmxhc3RSZXdyaXRlVG9rZW5JbmRleGVzID0ge307CisgICAgfSwKKworICAgIC8qKiBSb2xsYmFjayB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGZvciBhIHByb2dyYW0gc28gdGhhdAorICAgICAqICB0aGUgaW5kaWNhdGVkIGluc3RydWN0aW9uICh2aWEgaW5zdHJ1Y3Rpb25JbmRleCkgaXMgbm8KKyAgICAgKiAgbG9uZ2VyIGluIHRoZSBzdHJlYW0uICBVTlRFU1RFRCEKKyAgICAgKi8KKyAgICByb2xsYmFjazogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwcm9ncmFtTmFtZSwKKyAgICAgICAgICAgIGluc3RydWN0aW9uSW5kZXg7CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0xKSB7CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHRycy5ERUZBVUxUX1BST0dSQU1fTkFNRTsKKyAgICAgICAgICAgIGluc3RydWN0aW9uSW5kZXggPSBhcmd1bWVudHNbMF07CisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTIpIHsKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gYXJndW1lbnRzWzBdOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25JbmRleCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgfQorICAgICAgICB2YXIgaXMgPSB0aGlzLnByb2dyYW1zW3Byb2dyYW1OYW1lXTsKKyAgICAgICAgaWYgKGlzKSB7CisgICAgICAgICAgICBwcm9ncmFtc1twcm9ncmFtTmFtZV0gPSBpcy5zbGljZSh0cnMuTUlOX1RPS0VOX0lOREVYLCB0aGlzLmluc3RydWN0aW9uSW5kZXgpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKiBSZXNldCB0aGUgcHJvZ3JhbSBzbyB0aGF0IG5vIGluc3RydWN0aW9ucyBleGlzdCAqLworICAgIGRlbGV0ZVByb2dyYW06IGZ1bmN0aW9uKHByb2dyYW1OYW1lKSB7CisgICAgICAgIHByb2dyYW1OYW1lID0gcHJvZ3JhbU5hbWUgfHwgdHJzLkRFRkFVTFRfUFJPR1JBTV9OQU1FOworICAgICAgICB0aGlzLnJvbGxiYWNrKHByb2dyYW1OYW1lLCB0cnMuTUlOX1RPS0VOX0lOREVYKTsKKyAgICB9LAorCisgICAgLyoqIEFkZCBhbiBpbnN0cnVjdGlvbiB0byB0aGUgcmV3cml0ZSBpbnN0cnVjdGlvbiBsaXN0IG9yZGVyZWQgYnkKKyAgICAgKiAgdGhlIGluc3RydWN0aW9uIG51bWJlciAodXNlIGEgYmluYXJ5IHNlYXJjaCBmb3IgZWZmaWNpZW5jeSkuCisgICAgICogIFRoZSBsaXN0IGlzIG9yZGVyZWQgc28gdGhhdCB0b1N0cmluZygpIGNhbiBiZSBkb25lIGVmZmljaWVudGx5LgorICAgICAqCisgICAgICogIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGluc3RydWN0aW9ucyBhdCB0aGUgc2FtZSBpbmRleCwgdGhlIGluc3RydWN0aW9ucworICAgICAqICBtdXN0IGJlIG9yZGVyZWQgdG8gZW5zdXJlIHByb3BlciBiZWhhdmlvci4gIEZvciBleGFtcGxlLCBhIGRlbGV0ZSBhdAorICAgICAqICBpbmRleCBpIG11c3Qga2lsbCBhbnkgcmVwbGFjZSBvcGVyYXRpb24gYXQgaS4gIEluc2VydC1iZWZvcmUgb3BlcmF0aW9ucworICAgICAqICBtdXN0IGNvbWUgYmVmb3JlIGFueSByZXBsYWNlIC8gZGVsZXRlIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGFyZQorICAgICAqICBtdWx0aXBsZSBpbnNlcnQgaW5zdHJ1Y3Rpb25zIGZvciBhIHNpbmdsZSBpbmRleCwgdGhleSBhcmUgZG9uZSBpbgorICAgICAqICByZXZlcnNlIGluc2VydGlvbiBvcmRlciBzbyB0aGF0ICJpbnNlcnQgZm9vIiB0aGVuICJpbnNlcnQgYmFyIiB5aWVsZHMKKyAgICAgKiAgImZvb2JhciIgaW4gZnJvbnQgcmF0aGVyIHRoYW4gImJhcmZvbyIuICBUaGlzIGlzIGNvbnZlbmllbnQgYmVjYXVzZQorICAgICAqICBJIGNhbiBpbnNlcnQgbmV3IEluc2VydE9wIGluc3RydWN0aW9ucyBhdCB0aGUgaW5kZXggcmV0dXJuZWQgYnkKKyAgICAgKiAgdGhlIGJpbmFyeSBzZWFyY2guICBBIFJlcGxhY2VPcCBraWxscyBhbnkgcHJldmlvdXMgcmVwbGFjZSBvcC4gIFNpbmNlCisgICAgICogIGRlbGV0ZSBpcyB0aGUgc2FtZSBhcyByZXBsYWNlIHdpdGggbnVsbCB0ZXh0LCBpIGNhbiBjaGVjayBmb3IKKyAgICAgKiAgUmVwbGFjZU9wIGFuZCBjb3ZlciBEZWxldGVPcCBhdCBzYW1lIHRpbWUuIDopCisgICAgICovCisgICAgYWRkVG9Tb3J0ZWRSZXdyaXRlTGlzdDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwcm9ncmFtTmFtZSwKKyAgICAgICAgICAgIG9wOworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTEpIHsKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gdHJzLkRFRkFVTFRfUFJPR1JBTV9OQU1FOworICAgICAgICAgICAgb3AgPSBhcmd1bWVudHNbMF07CisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTIpIHsKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gYXJndW1lbnRzWzBdOworICAgICAgICAgICAgb3AgPSBhcmd1bWVudHNbMV07CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmV3cml0ZXMgPSB0aGlzLmdldFByb2dyYW0ocHJvZ3JhbU5hbWUpOworICAgICAgICB2YXIgbGVuLCBwb3MsIHNlYXJjaE9wLCByZXBsYWNlZCwgcHJldk9wLCBpOworICAgICAgICBmb3IgKHBvcz0wLCBsZW49cmV3cml0ZXMubGVuZ3RoOyBwb3M8bGVuOyBwb3MrKykgeworICAgICAgICAgICAgc2VhcmNoT3AgPSByZXdyaXRlc1twb3NdOworICAgICAgICAgICAgaWYgKHNlYXJjaE9wLmluZGV4PT09b3AuaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBub3cgcG9zIGlzIHRoZSBpbmRleCBpbiByZXdyaXRlcyBvZiBmaXJzdCBvcCB3aXRoIG9wLmluZGV4CisKKyAgICAgICAgICAgICAgICAvLyBhbiBpbnN0cnVjdGlvbiBvcGVyYXRpbmcgYWxyZWFkeSBvbiB0aGF0IGluZGV4IHdhcyBmb3VuZDsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHRoaXMgb25lIGhhcHBlbiBhZnRlciBhbGwgdGhlIG90aGVycworICAgICAgICAgICAgICAgIGlmIChvcCBpbnN0YW5jZW9mIHRycy5SZXBsYWNlT3ApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYW4gZXhpc3RpbmcgcmVwbGFjZQorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9cG9zOyBpPHJld3JpdGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2T3AgPSByZXdyaXRlc1twb3NdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZPcC5pbmRleCE9PW9wLmluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk9wIGluc3RhbmNlb2YgdHJzLlJlcGxhY2VPcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW3Bvc10gPSBvcDsgLy8gcmVwbGFjZSBvbGQgd2l0aCBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZD10cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBnb2luZzsgbXVzdCBiZSBhbiBpbnNlcnQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoICFyZXBsYWNlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCByZXBsYWNlIG9wIHRvIHRoZSBlbmQgb2YgYWxsIHRoZSBpbnNlcnRzCisgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlcy5zcGxpY2UoaSwgMCwgb3ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0cyBhcmUgYWRkZWQgaW4gZnJvbnQgb2YgZXhpc3RpbmcgaW5zZXJ0cworICAgICAgICAgICAgICAgICAgICByZXdyaXRlcy5zcGxpY2UocG9zLCAwLCBvcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hPcC5pbmRleCA+IG9wLmluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV3cml0ZXMuc3BsaWNlKHBvcywgMCwgb3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwb3M9PT1sZW4pIHsKKyAgICAgICAgICAgIHJld3JpdGVzLnB1c2gob3ApOworICAgICAgICB9CisgICAgfSwKKworICAgIGluc2VydEFmdGVyOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGluZGV4LCBwcm9ncmFtTmFtZSwgdGV4dDsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0yKSB7CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHRycy5ERUZBVUxUX1BST0dSQU1fTkFNRTsKKyAgICAgICAgICAgIGluZGV4ID0gYXJndW1lbnRzWzBdOworICAgICAgICAgICAgdGV4dCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MykgeworICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSBhcmd1bWVudHNbMF07CisgICAgICAgICAgICBpbmRleCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgICAgIHRleHQgPSBhcmd1bWVudHNbMl07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Ub2tlbikgeworICAgICAgICAgICAgLy8gaW5kZXggaXMgYSBUb2tlbiwgZ3JhYiBpdCdzIHN0cmVhbSBpbmRleAorICAgICAgICAgICAgaW5kZXggPSBpbmRleC5pbmRleDsgLy8gdGhhdCdzIHVnbHkKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluc2VydCBhZnRlciBpcyB0aGUgc2FtZSBhcyBpbnNlcnQgYmVmb3JlIHRoZSBuZXh0IGluZGV4CisgICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKHByb2dyYW1OYW1lLCBpbmRleCsxLCB0ZXh0KTsKKyAgICB9LAorCisgICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGluZGV4LCBwcm9ncmFtTmFtZSwgdGV4dDsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0yKSB7CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHRycy5ERUZBVUxUX1BST0dSQU1fTkFNRTsKKyAgICAgICAgICAgIGluZGV4ID0gYXJndW1lbnRzWzBdOworICAgICAgICAgICAgdGV4dCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MykgeworICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSBhcmd1bWVudHNbMF07CisgICAgICAgICAgICBpbmRleCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgICAgIHRleHQgPSBhcmd1bWVudHNbMl07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Ub2tlbikgeworICAgICAgICAgICAgLy8gaW5kZXggaXMgYSBUb2tlbiwgZ3JhYiBpdCdzIHN0cmVhbSBpbmRleAorICAgICAgICAgICAgaW5kZXggPSBpbmRleC5pbmRleDsgLy8gdGhhdCdzIHVnbHkKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuYWRkVG9Tb3J0ZWRSZXdyaXRlTGlzdCgKKyAgICAgICAgICAgICAgICBwcm9ncmFtTmFtZSwKKyAgICAgICAgICAgICAgICBuZXcgdHJzLkluc2VydEJlZm9yZU9wKGluZGV4LHRleHQpCisgICAgICAgICAgICAgICAgKTsKKyAgICB9LAorCisgICAgcmVwbGFjZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwcm9ncmFtTmFtZSwgZmlyc3QsIGxhc3QsIHRleHQ7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MikgeworICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSB0cnMuREVGQVVMVF9QUk9HUkFNX05BTUU7CisgICAgICAgICAgICBmaXJzdCA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgICAgIGxhc3QgPSBhcmd1bWVudHNbMF07CisgICAgICAgICAgICB0ZXh0ID0gYXJndW1lbnRzWzFdOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0zKSB7CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHRycy5ERUZBVUxUX1BST0dSQU1fTkFNRTsKKyAgICAgICAgICAgIGZpcnN0ID0gYXJndW1lbnRzWzBdOworICAgICAgICAgICAgbGFzdCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgICAgIHRleHQgPSBhcmd1bWVudHNbMl07CisgICAgICAgIH0gaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT00KSB7CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgICAgIGZpcnN0ID0gYXJndW1lbnRzWzFdOworICAgICAgICAgICAgbGFzdCA9IGFyZ3VtZW50c1syXTsKKyAgICAgICAgICAgIHRleHQgPSBhcmd1bWVudHNbM107CisgICAgICAgIH0gCisKKyAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4pIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmlyc3QuaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlRva2VuKSB7CisgICAgICAgICAgICBsYXN0ID0gbGFzdC5pbmRleDsgLy8gdGhhdCdzIHVnbHkKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZmlyc3QgPiBsYXN0IHx8IGxhc3Q8MCB8fCBmaXJzdDwwICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRoaXMuYWRkVG9Tb3J0ZWRSZXdyaXRlTGlzdCgKKyAgICAgICAgICAgICAgICBwcm9ncmFtTmFtZSwKKyAgICAgICAgICAgICAgICBuZXcgdHJzLlJlcGxhY2VPcChmaXJzdCwgbGFzdCwgdGV4dCkpOworICAgIH0sCisKKyAgICAvLyAhISEgQVBJIEJyZWFrOiBkZWxldGUgaXMgYSBKUyBrZXl3b3JkLCBzbyB1c2luZyByZW1vdmUgaW5zdGVhZC4KKyAgICByZW1vdmU6IGZ1bmN0aW9uKCkgeworICAgICAgICAvLyBjb252ZXJ0IGFyZ3VtZW50cyB0byBhIHJlYWwgYXJyYXkKKyAgICAgICAgdmFyIGFyZ3M9W10sIGk9YXJndW1lbnRzLmxlbmd0aC0xOworICAgICAgICB3aGlsZSAoaT49MCkgeworICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorCisgICAgICAgIGFyZ3MucHVzaCgiIik7CisgICAgICAgIHRoaXMucmVwbGFjZS5hcHBseSh0aGlzLCBhcmdzKTsKKyAgICB9LAorCisgICAgZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OiBmdW5jdGlvbihwcm9ncmFtTmFtZSkgeworICAgICAgICBwcm9ncmFtTmFtZSA9IHByb2dyYW1OYW1lIHx8IHRycy5ERUZBVUxUX1BST0dSQU1fTkFNRTsKKyAgICAgICAgcmV0dXJuIHRoaXMubGFzdFJld3JpdGVUb2tlbkluZGV4ZXNbcHJvZ3JhbU5hbWVdIHx8IC0xOworICAgIH0sCisKKyAgICBzZXRMYXN0UmV3cml0ZVRva2VuSW5kZXg6IGZ1bmN0aW9uKHByb2dyYW1OYW1lLCBpKSB7CisgICAgICAgIHRoaXMubGFzdFJld3JpdGVUb2tlbkluZGV4ZXNbcHJvZ3JhbU5hbWVdID0gaTsKKyAgICB9LAorCisgICAgZ2V0UHJvZ3JhbTogZnVuY3Rpb24obmFtZSkgeworICAgICAgICB2YXIgaXMgPSB0aGlzLnByb2dyYW1zW25hbWVdOworICAgICAgICBpZiAoICFpcyApIHsKKyAgICAgICAgICAgIGlzID0gdGhpcy5pbml0aWFsaXplUHJvZ3JhbShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXM7CisgICAgfSwKKworICAgIGluaXRpYWxpemVQcm9ncmFtOiBmdW5jdGlvbihuYW1lKSB7CisgICAgICAgIHZhciBpcyA9IFtdOworICAgICAgICB0aGlzLnByb2dyYW1zW25hbWVdID0gaXM7CisgICAgICAgIHJldHVybiBpczsKKyAgICB9LAorCisgICAgdG9PcmlnaW5hbFN0cmluZzogZnVuY3Rpb24oc3RhcnQsIGVuZCkgeworICAgICAgICBpZiAoIW9yZy5hbnRsci5sYW5nLmlzTnVtYmVyKHN0YXJ0KSkgeworICAgICAgICAgICAgc3RhcnQgPSB0cnMuTUlOX1RPS0VOX0lOREVYOworICAgICAgICB9CisgICAgICAgIGlmICghb3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoZW5kKSkgeworICAgICAgICAgICAgZW5kID0gdGhpcy5zaXplKCktMTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBbXSwgaTsKKyAgICAgICAgZm9yIChpPXN0YXJ0OyBpPj10cnMuTUlOX1RPS0VOX0lOREVYICYmIGk8PWVuZCAmJiBpPHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWYucHVzaCh0aGlzLmdldChpKS5nZXRUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYuam9pbigiIik7CisgICAgfSwKKworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHByb2dyYW1OYW1lLCBzdGFydCwgZW5kOworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTApIHsKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gdHJzLkRFRkFVTFRfUFJPR1JBTV9OQU1FOworICAgICAgICAgICAgc3RhcnQgPSB0cnMuTUlOX1RPS0VOX0lOREVYOworICAgICAgICAgICAgZW5kID0gdGhpcy5zaXplKCkgLSAxOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0xKSB7CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgICAgIHN0YXJ0ID0gdHJzLk1JTl9UT0tFTl9JTkRFWDsKKyAgICAgICAgICAgIGVuZCA9IHRoaXMuc2l6ZSgpIC0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MikgeworICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSB0cnMuREVGQVVMVF9QUk9HUkFNX05BTUU7CisgICAgICAgICAgICBzdGFydCA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgICAgIGVuZCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXdyaXRlcyA9IHRoaXMucHJvZ3JhbXNbcHJvZ3JhbU5hbWVdOworICAgICAgICBpZiAoICFyZXdyaXRlcyB8fCByZXdyaXRlcy5sZW5ndGg9PT0wICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9PcmlnaW5hbFN0cmluZyhzdGFydCxlbmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIEluZGV4IG9mIGZpcnN0IHJld3JpdGUgd2UgaGF2ZSBub3QgZG9uZQorICAgICAgICB2YXIgcmV3cml0ZU9wSW5kZXggPSAwLAorICAgICAgICAgICAgdG9rZW5DdXJzb3I9c3RhcnQsCisgICAgICAgICAgICBidWYgPSBbXSwKKyAgICAgICAgICAgIG9wOworICAgICAgICB3aGlsZSAoIHRva2VuQ3Vyc29yPj10cnMuTUlOX1RPS0VOX0lOREVYICYmCisgICAgICAgICAgICAgICAgdG9rZW5DdXJzb3I8PWVuZCAmJgorICAgICAgICAgICAgICAgIHRva2VuQ3Vyc29yPHRoaXMudG9rZW5zLmxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4ZWN1dGUgaW5zdHJ1Y3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRva2VuIGluZGV4CisgICAgICAgICAgICBpZiAoIHJld3JpdGVPcEluZGV4PHJld3JpdGVzLmxlbmd0aCApIHsKKyAgICAgICAgICAgICAgICBvcCA9IHJld3JpdGVzW3Jld3JpdGVPcEluZGV4XTsKKworICAgICAgICAgICAgICAgIC8vIHNraXAgYWxsIG9wcyBhdCBsb3dlciBpbmRleAorICAgICAgICAgICAgICAgIHdoaWxlIChvcC5pbmRleDx0b2tlbkN1cnNvciAmJiByZXdyaXRlT3BJbmRleDxyZXdyaXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0ZU9wSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCByZXdyaXRlT3BJbmRleDxyZXdyaXRlcy5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHJld3JpdGVzW3Jld3JpdGVPcEluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdoaWxlIHdlIGhhdmUgb3BzIGZvciB0aGlzIHRva2VuIGluZGV4LCBleGVjIHRoZW0KKyAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW5DdXJzb3I9PT1vcC5pbmRleCAmJiByZXdyaXRlT3BJbmRleDxyZXdyaXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4ZWN1dGUgIitvcCsiIGF0IGluc3RydWN0aW9uICIrcmV3cml0ZU9wSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB0b2tlbkN1cnNvciA9IG9wLmV4ZWN1dGUoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFmdGVyIGV4ZWN1dGUgdG9rZW5DdXJzb3IgPSAiK3Rva2VuQ3Vyc29yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0ZU9wSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCByZXdyaXRlT3BJbmRleDxyZXdyaXRlcy5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHJld3JpdGVzW3Jld3JpdGVPcEluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGR1bXAgdGhlIHRva2VuIGF0IHRoaXMgaW5kZXgKKyAgICAgICAgICAgIGlmICggdG9rZW5DdXJzb3I8PWVuZCApIHsKKyAgICAgICAgICAgICAgICBidWYucHVzaCh0aGlzLmdldCh0b2tlbkN1cnNvcikuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICB0b2tlbkN1cnNvcisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG5vdyBzZWUgaWYgdGhlcmUgYXJlIG9wZXJhdGlvbnMgKGFwcGVuZCkgYmV5b25kIGxhc3QgdG9rZW4gaW5kZXgKKyAgICAgICAgdmFyIG9waTsKKyAgICAgICAgZm9yIChvcGk9cmV3cml0ZU9wSW5kZXg7IG9waTxyZXdyaXRlcy5sZW5ndGg7IG9waSsrKSB7CisgICAgICAgICAgICBvcCA9IHJld3JpdGVzW29waV07CisgICAgICAgICAgICBpZiAoIG9wLmluZGV4Pj10aGlzLnNpemUoKSApIHsKKyAgICAgICAgICAgICAgICBvcC5leGVjdXRlKGJ1Zik7IC8vIG11c3QgYmUgaW5zZXJ0aW9ucyBpZiBhZnRlciBsYXN0IHRva2VuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLmpvaW4oIiIpOworICAgIH0sCisKKyAgICB0b0RlYnVnU3RyaW5nOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7CisgICAgICAgIGlmICghb3JnLmFudGxyLmxhbmcuaXNOdW1iZXIoc3RhcnQpKSB7CisgICAgICAgICAgICBzdGFydCA9IHRycy5NSU5fVE9LRU5fSU5ERVg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvcmcuYW50bHIubGFuZy5pc051bWJlcihlbmQpKSB7CisgICAgICAgICAgICBlbmQgPSB0aGlzLnNpemUoKS0xOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGJ1ZiA9IFtdLAorICAgICAgICAgICAgaTsKKyAgICAgICAgZm9yIChpPXN0YXJ0OyBpPj10cnMuTUlOX1RPS0VOX0lOREVYICYmIGk8PWVuZCAmJiBpPHRoaXMudG9rZW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWYucHVzaCh0aGlzLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCIiKTsKKyAgICB9Cit9KTsKKworfSkoKTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24uanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxMzRlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMjYgQEAKKy8qKiBBbiBleHRyYSB0b2tlbiB3aGlsZSBwYXJzaW5nIGEgVG9rZW5TdHJlYW0gKi8KK29yZy5hbnRsci5ydW50aW1lLlVud2FudGVkVG9rZW5FeGNlcHRpb24gPSBmdW5jdGlvbihleHBlY3RpbmcsIGlucHV0KSB7CisgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg+MCkgeworICAgICAgICBvcmcuYW50bHIucnVudGltZS5VbndhbnRlZFRva2VuRXhjZXB0aW9uLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCgKKyAgICAgICAgICAgICAgICB0aGlzLCBleHBlY3RpbmcsIGlucHV0KTsKKyAgICB9Cit9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQoCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiwKKyAgICBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24sIHsKKyAgICBnZXRVbmV4cGVjdGVkVG9rZW46IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy50b2tlbjsKKyAgICB9LAorICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGV4cCA9ICIsIGV4cGVjdGVkICIrdGhpcy5leHBlY3Rpbmc7CisgICAgICAgIGlmICggdGhpcy5leHBlY3Rpbmc9PT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEUgKSB7CisgICAgICAgICAgICBleHAgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoICFvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHRoaXMudG9rZW4pICkgeworICAgICAgICAgICAgcmV0dXJuICJVbndhbnRlZFRva2VuRXhjZXB0aW9uKGZvdW5kPSIrZXhwKyIpIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlVud2FudGVkVG9rZW5FeGNlcHRpb24oZm91bmQ9Iit0aGlzLnRva2VuLmdldFRleHQoKStleHArIikiOworICAgIH0sCisgICAgbmFtZTogIm9yZy5hbnRsci5ydW50aW1lLlVud2FudGVkVG9rZW5FeGNlcHRpb24iCit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWUuanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ZGQ4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmpzCkBAIC0wLDAgKzEsMjgyIEBACisvKiogQSBnZW5lcmljIHRyZWUgaW1wbGVtZW50YXRpb24gd2l0aCBubyBwYXlsb2FkLiAgWW91IG11c3Qgc3ViY2xhc3MgdG8KKyAqICBhY3R1YWxseSBoYXZlIGFueSB1c2VyIGRhdGEuICBBTlRMUiB2MyB1c2VzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcHByb2FjaAorICogIGluc3RlYWQgb2YgdGhlIGNoaWxkLXNpYmxpbmcgYXBwcm9hY2ggaW4gdjIuICBBIGZsYXQgdHJlZSAoYSBsaXN0KSBpcworICogIGFuIGVtcHR5IG5vZGUgd2hvc2UgY2hpbGRyZW4gcmVwcmVzZW50IHRoZSBsaXN0LiAgQW4gZW1wdHksIGJ1dAorICogIG5vbi1udWxsIG5vZGUgaXMgY2FsbGVkICJuaWwiLgorICovCitvcmcuYW50bHIucnVudGltZS50cmVlLkJhc2VUcmVlID0gZnVuY3Rpb24oKSB7fTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQmFzZVRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlLAoreworICAgIGdldENoaWxkOiBmdW5jdGlvbihpKSB7CisgICAgICAgIGlmICggIXRoaXMuY2hpbGRyZW4gfHwgaT49dGhpcy5jaGlsZHJlbi5sZW5ndGggKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpXTsKKyAgICB9LAorCisgICAgLyoqIEdldCB0aGUgY2hpbGRyZW4gaW50ZXJuYWwgTGlzdDsgbm90ZSB0aGF0IGlmIHlvdSBkaXJlY3RseSBtZXNzIHdpdGgKKyAgICAgKiAgdGhlIGxpc3QsIGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgICAgICovCisgICAgZ2V0Q2hpbGRyZW46IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjsKKyAgICB9LAorCisgICAgZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOiBmdW5jdGlvbih0eXBlKSB7CisgICAgICAgIHZhciBpLCB0OworICAgICAgICBmb3IgKGkgPSAwOyB0aGlzLmNoaWxkcmVuICYmIGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0ID0gdGhpcy5jaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICggdC5nZXRUeXBlKCk9PT10eXBlICkgeworICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICB9ICAgIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9LAorCisgICAgZ2V0Q2hpbGRDb3VudDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggIXRoaXMuY2hpbGRyZW4gKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CisgICAgfSwKKworICAgIC8qKiBBZGQgdCBhcyBjaGlsZCBvZiB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgICAgICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHRoaXMgcm91dGluZSBtb3ZlcyBjaGlsZHJlbiB0byB0IHZpYQorICAgICAqICB0LmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47IGkuZS4sIHdpdGhvdXQgY29weWluZyB0aGUgYXJyYXkuCisgICAgICovCisgICAgYWRkQ2hpbGQ6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0KSApIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gZG8gbm90aGluZyB1cG9uIGFkZENoaWxkKG51bGwpCisgICAgICAgIH0KKyAgICAgICAgdmFyIGNoaWxkVHJlZSA9IHQsIG4sIGksIGM7CisgICAgICAgIGlmICggY2hpbGRUcmVlLmlzTmlsKCkgKSB7IC8vIHQgaXMgYW4gZW1wdHkgbm9kZSBwb3NzaWJseSB3aXRoIGNoaWxkcmVuCisgICAgICAgICAgICBpZiAoIHRoaXMuY2hpbGRyZW4gJiYgdGhpcy5jaGlsZHJlbiA9PSBjaGlsZFRyZWUuY2hpbGRyZW4gKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhdHRlbXB0IHRvIGFkZCBjaGlsZCBsaXN0IHRvIGl0c2VsZiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8ganVzdCBhZGQgYWxsIG9mIGNoaWxkVHJlZSdzIGNoaWxkcmVuIHRvIHRoaXMKKyAgICAgICAgICAgIGlmICggY2hpbGRUcmVlLmNoaWxkcmVuICkgeworICAgICAgICAgICAgICAgIGlmICggdGhpcy5jaGlsZHJlbiApIHsgLy8gbXVzdCBjb3B5LCB0aGlzIGhhcyBjaGlsZHJlbiBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIG4gPSBjaGlsZFRyZWUuY2hpbGRyZW4ubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gY2hpbGRUcmVlLmNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGRvdWJsZS1saW5rIHN0dWZmIGZvciBlYWNoIGNoaWxkIG9mIG5pbCByb290CisgICAgICAgICAgICAgICAgICAgICAgICBjLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0Q2hpbGRJbmRleCh0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2hpbGRyZW4gZm9yIHRoaXMgYnV0IHQgaGFzIGNoaWxkcmVuOyBqdXN0IHNldCBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgZ2VuZXJhbCBmcmVzaGVuZXIgcm91dGluZQorICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRUcmVlLmNoaWxkcmVuOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGNoaWxkIGlzIG5vdCBuaWwgKGRvbid0IGNhcmUgYWJvdXQgY2hpbGRyZW4pCisgICAgICAgICAgICBpZiAoICF0aGlzLmNoaWxkcmVuICkgeworICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLmNyZWF0ZUNoaWxkcmVuTGlzdCgpOyAvLyBjcmVhdGUgY2hpbGRyZW4gbGlzdCBvbiBkZW1hbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaCh0KTsKKyAgICAgICAgICAgIGNoaWxkVHJlZS5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgICAgICBjaGlsZFRyZWUuc2V0Q2hpbGRJbmRleCh0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKiogQWRkIGFsbCBlbGVtZW50cyBvZiBraWRzIGxpc3QgYXMgY2hpbGRyZW4gb2YgdGhpcyBub2RlICovCisgICAgYWRkQ2hpbGRyZW46IGZ1bmN0aW9uKGtpZHMpIHsKKyAgICAgICAgdmFyIGksIHQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0ID0ga2lkc1tpXTsKKyAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQodCk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgc2V0Q2hpbGQ6IGZ1bmN0aW9uKGksIHQpIHsKKyAgICAgICAgaWYgKCAhdCApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHQuaXNOaWwoKSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuJ3Qgc2V0IHNpbmdsZSBjaGlsZCB0byBhIGxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICF0aGlzLmNoaWxkcmVuICkgeworICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMuY3JlYXRlQ2hpbGRyZW5MaXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jaGlsZHJlbltpXSA9IHQ7CisgICAgICAgIHQuc2V0UGFyZW50KHRoaXMpOworICAgICAgICB0LnNldENoaWxkSW5kZXgoaSk7CisgICAgfSwKKworICAgIGRlbGV0ZUNoaWxkOiBmdW5jdGlvbihpKSB7CisgICAgICAgIGlmICggIXRoaXMuY2hpbGRyZW4gKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaTwwIHx8IGk+PXRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZHMuIik7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGtpbGxlZCA9IHRoaXMuY2hpbGRyZW4uc3BsaWNlKGksIDEpWzBdOworICAgICAgICAvLyB3YWxrIHJlc3QgYW5kIGRlY3JlbWVudCB0aGVpciBjaGlsZCBpbmRleGVzCisgICAgICAgIHRoaXMuZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhpKTsKKyAgICAgICAgcmV0dXJuIGtpbGxlZDsKKyAgICB9LAorCisgICAgLyoqIERlbGV0ZSBjaGlsZHJlbiBmcm9tIHN0YXJ0IHRvIHN0b3AgYW5kIHJlcGxhY2Ugd2l0aCB0IGV2ZW4gaWYgdCBpcworICAgICAqICBhIGxpc3QgKG5pbC1yb290IHRyZWUpLiAgbnVtIG9mIGNoaWxkcmVuIGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZS4KKyAgICAgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgICAgICogIGNoaWxkcmVuIHRvIHNldCB0aGVpciBjaGlsZGluZGV4OyBjb3VsZCBiZSBzbG93LgorICAgICAqLworICAgIHJlcGxhY2VDaGlsZHJlbjogZnVuY3Rpb24oc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCkgeworICAgICAgICBpZiAoICF0aGlzLmNoaWxkcmVuICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbmRleGVzIGludmFsaWQ7IG5vIGNoaWxkcmVuIGluIGxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgcmVwbGFjaW5nSG93TWFueSA9IHN0b3BDaGlsZEluZGV4IC0gc3RhcnRDaGlsZEluZGV4ICsgMTsKKyAgICAgICAgdmFyIHJlcGxhY2luZ1dpdGhIb3dNYW55OworICAgICAgICB2YXIgbmV3VHJlZSA9IHQ7CisgICAgICAgIHZhciBuZXdDaGlsZHJlbiA9IG51bGw7CisgICAgICAgIC8vIG5vcm1hbGl6ZSB0byBhIGxpc3Qgb2YgY2hpbGRyZW4gdG8gYWRkOiBuZXdDaGlsZHJlbgorICAgICAgICBpZiAoIG5ld1RyZWUuaXNOaWwoKSApIHsKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuID0gbmV3VHJlZS5jaGlsZHJlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuID0gW107CisgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKG5ld1RyZWUpOworICAgICAgICB9CisgICAgICAgIHJlcGxhY2luZ1dpdGhIb3dNYW55ID0gbmV3Q2hpbGRyZW4ubGVuZ3RoOworICAgICAgICB2YXIgbnVtTmV3Q2hpbGRyZW4gPSBuZXdDaGlsZHJlbi5sZW5ndGg7CisgICAgICAgIHZhciBkZWx0YSA9IHJlcGxhY2luZ0hvd01hbnkgLSByZXBsYWNpbmdXaXRoSG93TWFueTsKKyAgICAgICAgdmFyIGosIGksIGNoaWxkLCBpbmRleFRvRGVsZXRlLCBjLCBraWxsZWQsIG51bVRvSW5zZXJ0OworICAgICAgICAvLyBpZiBzYW1lIG51bWJlciBvZiBub2RlcywgZG8gZGlyZWN0IHJlcGxhY2UKKyAgICAgICAgaWYgKCBkZWx0YSA9PT0gMCApIHsKKyAgICAgICAgICAgIGogPSAwOyAvLyBpbmRleCBpbnRvIG5ldyBjaGlsZHJlbgorICAgICAgICAgICAgZm9yIChpPXN0YXJ0Q2hpbGRJbmRleDsgaTw9c3RvcENoaWxkSW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgIGNoaWxkID0gbmV3Q2hpbGRyZW5bal07CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXSA9IGNoaWxkOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRDaGlsZEluZGV4KGkpOworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZGVsdGEgPiAwICkgeyAvLyBmZXdlciBuZXcgbm9kZXMgdGhhbiB0aGVyZSB3ZXJlCisgICAgICAgICAgICAvLyBzZXQgY2hpbGRyZW4gYW5kIHRoZW4gZGVsZXRlIGV4dHJhCisgICAgICAgICAgICBmb3IgKGo9MDsgajxudW1OZXdDaGlsZHJlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltzdGFydENoaWxkSW5kZXgral0gPSBuZXdDaGlsZHJlbltqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4VG9EZWxldGUgPSBzdGFydENoaWxkSW5kZXgrbnVtTmV3Q2hpbGRyZW47CisgICAgICAgICAgICBmb3IgKGM9aW5kZXhUb0RlbGV0ZTsgYzw9c3RvcENoaWxkSW5kZXg7IGMrKykgeworICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBzYW1lIGluZGV4LCBzaGlmdGluZyBldmVyeWJvZHkgZG93biBlYWNoIHRpbWUKKyAgICAgICAgICAgICAgICBraWxsZWQgPSB0aGlzLmNoaWxkcmVuLnNwbGljZShpbmRleFRvRGVsZXRlLCAxKVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhzdGFydENoaWxkSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBtb3JlIG5ldyBub2RlcyB0aGFuIHdlcmUgdGhlcmUgYmVmb3JlCisgICAgICAgICAgICAvLyBmaWxsIGluIGFzIG1hbnkgY2hpbGRyZW4gYXMgd2UgY2FuIChyZXBsYWNpbmdIb3dNYW55KSB3L28gbW92aW5nIGRhdGEKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPHJlcGxhY2luZ0hvd01hbnk7IGorKykgeworICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5bc3RhcnRDaGlsZEluZGV4K2pdID0gbmV3Q2hpbGRyZW5bal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1Ub0luc2VydCA9IHJlcGxhY2luZ1dpdGhIb3dNYW55LXJlcGxhY2luZ0hvd01hbnk7CisgICAgICAgICAgICBmb3IgKGo9cmVwbGFjaW5nSG93TWFueTsgajxyZXBsYWNpbmdXaXRoSG93TWFueTsgaisrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2Uoc3RhcnRDaGlsZEluZGV4K2osIDAsIG5ld0NoaWxkcmVuW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhzdGFydENoaWxkSW5kZXgpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKiBPdmVycmlkZSBpbiBhIHN1YmNsYXNzIHRvIGNoYW5nZSB0aGUgaW1wbCBvZiBjaGlsZHJlbiBsaXN0ICovCisgICAgY3JlYXRlQ2hpbGRyZW5MaXN0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIFtdOworICAgIH0sCisKKyAgICBpc05pbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczogZnVuY3Rpb24ob2Zmc2V0KSB7CisgICAgICAgIGlmICghb3JnLmFudGxyLmxhbmcuaXNOdW1iZXIob2Zmc2V0KSkgeworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICB2YXIgbiA9IHRoaXMuZ2V0Q2hpbGRDb3VudCgpLAorICAgICAgICAgICAgYywKKyAgICAgICAgICAgIGNoaWxkOworICAgICAgICBmb3IgKGMgPSBvZmZzZXQ7IGMgPCBuOyBjKyspIHsKKyAgICAgICAgICAgIGNoaWxkID0gdGhpcy5nZXRDaGlsZChjKTsKKyAgICAgICAgICAgIGNoaWxkLnNldENoaWxkSW5kZXgoYyk7CisgICAgICAgICAgICBjaGlsZC5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6IGZ1bmN0aW9uKHBhcmVudCwgaSkgeworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTApIHsKKyAgICAgICAgICAgIHBhcmVudCA9IG51bGw7CisgICAgICAgICAgICBpID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBhcmVudCE9PXRoaXMuZ2V0UGFyZW50KCkgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInBhcmVudHMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICIrcGFyZW50KyIgZm91bmQgIit0aGlzLmdldFBhcmVudCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGkhPT10aGlzLmdldENoaWxkSW5kZXgoKSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiY2hpbGQgaW5kZXhlcyBkb24ndCBtYXRjaDsgZXhwZWN0ZWQgIitpKyIgZm91bmQgIit0aGlzLmdldENoaWxkSW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIG4gPSB0aGlzLmdldENoaWxkQ291bnQoKSwKKyAgICAgICAgICAgIGMsCisgICAgICAgICAgICBjaGlsZDsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IG47IGMrKykgeworICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmdldENoaWxkKGMpOworICAgICAgICAgICAgY2hpbGQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXModGhpcywgYyk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIEJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy4gKi8KKyAgICBnZXRDaGlsZEluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSwKKyAgICBzZXRDaGlsZEluZGV4OiBmdW5jdGlvbihpbmRleCkgeworICAgIH0sCisKKyAgICAvKiogQmFzZVRyZWUgZG9lc24ndCB0cmFjayBwYXJlbnQgcG9pbnRlcnMuICovCisgICAgZ2V0UGFyZW50OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfSwKKyAgICBzZXRQYXJlbnQ6IGZ1bmN0aW9uKHQpIHsKKyAgICB9LAorCisgICAgZ2V0VHJlZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0sCisKKyAgICAvKiogUHJpbnQgb3V0IGEgd2hvbGUgdHJlZSBub3QganVzdCBhIG5vZGUgKi8KKyAgICB0b1N0cmluZ1RyZWU6IGZ1bmN0aW9uKCkgeworICAgICAgICBpZiAoICF0aGlzLmNoaWxkcmVuIHx8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoPT09MCApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJ1ZiA9ICIiLAorICAgICAgICAgICAgaSwKKyAgICAgICAgICAgIHQ7CisgICAgICAgIGlmICggIXRoaXMuaXNOaWwoKSApIHsKKyAgICAgICAgICAgIGJ1ZiArPSAiKCI7CisgICAgICAgICAgICBidWYgKz0gdGhpcy50b1N0cmluZygpOworICAgICAgICAgICAgYnVmICs9ICcgJzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyB0aGlzLmNoaWxkcmVuICYmIGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0ID0gdGhpcy5jaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICggaT4wICkgeworICAgICAgICAgICAgICAgIGJ1ZiArPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgKz0gdC50b1N0cmluZ1RyZWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICF0aGlzLmlzTmlsKCkgKSB7CisgICAgICAgICAgICBidWYgKz0gIikiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7CisgICAgfSwKKworICAgIGdldExpbmU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9LAorCisgICAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlQWRhcHRvci5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWVBZGFwdG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5MmZmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlQWRhcHRvci5qcwpAQCAtMCwwICsxLDIxMSBAQAorLyoqIEEgVHJlZUFkYXB0b3IgdGhhdCB3b3JrcyB3aXRoIGFueSBUcmVlIGltcGxlbWVudGF0aW9uLiAqLworb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5CYXNlVHJlZUFkYXB0b3IgPSBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnVuaXF1ZU5vZGVJRCA9IDE7Cit9Oworb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvciA9IGZ1bmN0aW9uKCkge307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS50cmVlLkJhc2VUcmVlQWRhcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVBZGFwdG9yLAoreworICAgIG5pbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShudWxsKTsKKyAgICB9LAorCisgICAgLyoqIGNyZWF0ZSB0cmVlIG5vZGUgdGhhdCBob2xkcyB0aGUgc3RhcnQgYW5kIHN0b3AgdG9rZW5zIGFzc29jaWF0ZWQKKyAgICAgKiAgd2l0aCBhbiBlcnJvci4KKyAgICAgKgorICAgICAqICBJZiB5b3Ugc3BlY2lmeSB5b3VyIG93biBraW5kIG9mIHRyZWUgbm9kZXMsIHlvdSB3aWxsIGxpa2VseSBoYXZlIHRvCisgICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBDb21tb25UcmVlIHJldHVybnMgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFCisgICAgICogIGlmIG5vIHRva2VuIHBheWxvYWQgYnV0IHlvdSBtaWdodCBoYXZlIHRvIHNldCB0b2tlbiB0eXBlIGZvciBkaWZmCisgICAgICogIG5vZGUgdHlwZS4KKyAgICAgKi8KKyAgICBlcnJvck5vZGU6IGZ1bmN0aW9uKGlucHV0LCBzdGFydCwgc3RvcCwgZSkgeworICAgICAgICB2YXIgdCA9IG5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vbkVycm9yTm9kZShpbnB1dCwgc3RhcnQsIHN0b3AsIGUpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9LAorCisgICAgaXNOaWw6IGZ1bmN0aW9uKHRyZWUpIHsKKyAgICAgICAgcmV0dXJuIHRyZWUuaXNOaWwoKTsKKyAgICB9LAorCisgICAgLyoqIFRoaXMgaXMgZ2VuZXJpYyBpbiB0aGUgc2Vuc2UgdGhhdCBpdCB3aWxsIHdvcmsgd2l0aCBhbnkga2luZCBvZgorICAgICAqICB0cmVlIChub3QganVzdCBUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgICAgICogIG5vdCB0aGUgdHJlZSBub2RlIHJvdXRpbmVzIHRvIGRvIHRoZSBjb25zdHJ1Y3Rpb24uICAKKyAgICAgKi8KKyAgICBkdXBUcmVlOiBmdW5jdGlvbih0LCBwYXJlbnQpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0xKSB7CisgICAgICAgICAgICBwYXJlbnQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICggIXQgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB2YXIgbmV3VHJlZSA9IHRoaXMuZHVwTm9kZSh0KTsKKyAgICAgICAgLy8gZW5zdXJlIG5ldyBzdWJ0cmVlIHJvb3QgaGFzIHBhcmVudC9jaGlsZCBpbmRleCBzZXQKKyAgICAgICAgdGhpcy5zZXRDaGlsZEluZGV4KG5ld1RyZWUsIHRoaXMuZ2V0Q2hpbGRJbmRleCh0KSk7IC8vIHNhbWUgaW5kZXggaW4gbmV3IHRyZWUKKyAgICAgICAgdGhpcy5zZXRQYXJlbnQobmV3VHJlZSwgcGFyZW50KTsKKyAgICAgICAgdmFyIG4gPSB0aGlzLmdldENoaWxkQ291bnQodCksCisgICAgICAgICAgICBpLCBjaGlsZCwgbmV3U3ViVHJlZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmdldENoaWxkKHQsIGkpOworICAgICAgICAgICAgbmV3U3ViVHJlZSA9IHRoaXMuZHVwVHJlZShjaGlsZCwgdCk7CisgICAgICAgICAgICB0aGlzLmFkZENoaWxkKG5ld1RyZWUsIG5ld1N1YlRyZWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdUcmVlOworICAgIH0sCisKKyAgICAvKiogQWRkIGEgY2hpbGQgdG8gdGhlIHRyZWUgdC4gIElmIGNoaWxkIGlzIGEgZmxhdCB0cmVlIChhIGxpc3QpLCBtYWtlIGFsbAorICAgICAqICBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAgICAgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICAgICAqICB0LmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47IGkuZS4sIHdpdGhvdXQgY29weWluZyB0aGUgYXJyYXkuICBKdXN0CisgICAgICogIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZAorICAgICAqICBBU1RzLgorICAgICAqLworICAgIGFkZENoaWxkOiBmdW5jdGlvbih0LCBjaGlsZCkgeworICAgICAgICBpZiAoIHQgJiYgb3JnLmFudGxyLmxhbmcuaXNWYWx1ZShjaGlsZCkgKSB7CisgICAgICAgICAgICB0LmFkZENoaWxkKGNoaWxkKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKiogSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAgICAgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgICAgICoKKyAgICAgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIGEgYiBjKQorICAgICAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAgICAgKgorICAgICAqICBJZiBuZXdSb290IGlzIGEgbmlsLXJvb3RlZCBzaW5nbGUgY2hpbGQgdHJlZSwgdXNlIHRoZSBzaW5nbGUKKyAgICAgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgICAgICoKKyAgICAgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAgICAgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICAgICAqCisgICAgICogIElmIG9sZFJvb3Qgd2FzIG51bGwsIGl0J3Mgb2ssIGp1c3QgcmV0dXJuIG5ld1Jvb3QgKGV2ZW4gaWYgaXNOaWwpLgorICAgICAqCisgICAgICogICAgb2xkPW51bGwsIG5ldz1yIHlpZWxkcyByCisgICAgICogICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKyAgICAgKgorICAgICAqICBSZXR1cm4gbmV3Um9vdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBuZXdSb290IGlzIG5vdCBhCisgICAgICogIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAgICAgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAgICAgKgorICAgICAqICBCZSBhZHZpc2VkIHRoYXQgaXQncyBvayBmb3IgbmV3Um9vdCB0byBwb2ludCBhdCBvbGRSb290J3MKKyAgICAgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAgICAgKiAgY29uc3RydWN0aW5nIHRoZXNlIG5vZGVzIHNvIHdlIHNob3VsZCBoYXZlIHRoaXMgY29udHJvbCBmb3IKKyAgICAgKiAgZWZmaWNpZW5jeS4KKyAgICAgKi8KKyAgICBiZWNvbWVSb290OiBmdW5jdGlvbihuZXdSb290LCBvbGRSb290KSB7CisgICAgICAgIGlmIChuZXdSb290IGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4gfHwgIW5ld1Jvb3QpIHsKKyAgICAgICAgICAgIG5ld1Jvb3QgPSB0aGlzLmNyZWF0ZShuZXdSb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBuZXdSb290VHJlZSA9IG5ld1Jvb3QsCisgICAgICAgICAgICBvbGRSb290VHJlZSA9IG9sZFJvb3Q7CisgICAgICAgIGlmICggIW9sZFJvb3QgKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3Um9vdDsKKyAgICAgICAgfQorICAgICAgICAvLyBoYW5kbGUgXihuaWwgcmVhbC1ub2RlKQorICAgICAgICBpZiAoIG5ld1Jvb3RUcmVlLmlzTmlsKCkgKSB7CisgICAgICAgICAgICB2YXIgbmMgPSBuZXdSb290VHJlZS5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBpZiAobmM9PT0xKSB7CisgICAgICAgICAgICAgICAgbmV3Um9vdFRyZWUgPSBuZXdSb290VHJlZS5nZXRDaGlsZCgwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIG5jPjEgKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0cmVlIHJ1biB0aW1lIGV4Y2VwdGlvbnMgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtb3JlIHRoYW4gb25lIG5vZGUgYXMgcm9vdCAoVE9ETzogbWFrZSBleGNlcHRpb24gaGllcmFyY2h5KSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGFkZCBvbGRSb290IHRvIG5ld1Jvb3Q7IGFkZENoaWxkIHRha2VzIGNhcmUgb2YgY2FzZSB3aGVyZSBvbGRSb290CisgICAgICAgIC8vIGlzIGEgZmxhdCBsaXN0IChpLmUuLCBuaWwtcm9vdGVkIHRyZWUpLiAgQWxsIGNoaWxkcmVuIG9mIG9sZFJvb3QKKyAgICAgICAgLy8gYXJlIGFkZGVkIHRvIG5ld1Jvb3QuCisgICAgICAgIG5ld1Jvb3RUcmVlLmFkZENoaWxkKG9sZFJvb3RUcmVlKTsKKyAgICAgICAgcmV0dXJuIG5ld1Jvb3RUcmVlOworICAgIH0sCisKKyAgICAvKiogVHJhbnNmb3JtIF4obmlsIHgpIHRvIHggKi8KKyAgICBydWxlUG9zdFByb2Nlc3Npbmc6IGZ1bmN0aW9uKHJvb3QpIHsKKyAgICAgICAgdmFyIHIgPSByb290OworICAgICAgICBpZiAoIHIgJiYgci5pc05pbCgpICkgeworICAgICAgICAgICAgaWYgKCByLmdldENoaWxkQ291bnQoKT09PTAgKSB7CisgICAgICAgICAgICAgICAgciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggci5nZXRDaGlsZENvdW50KCk9PT0xICkgeworICAgICAgICAgICAgICAgIHIgPSByLmdldENoaWxkKDApOworICAgICAgICAgICAgICAgIC8vIHdob2V2ZXIgaW52b2tlcyBydWxlIHdpbGwgc2V0IHBhcmVudCBhbmQgY2hpbGQgaW5kZXgKKyAgICAgICAgICAgICAgICByLnNldFBhcmVudChudWxsKTsKKyAgICAgICAgICAgICAgICByLnNldENoaWxkSW5kZXgoLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICBjcmVhdGU6IGZ1bmN0aW9uKHRva2VuVHlwZSwgZnJvbVRva2VuKSB7CisgICAgICAgIHZhciB0ZXh0LCB0OworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTIpIHsKKyAgICAgICAgICAgIGlmIChvcmcuYW50bHIubGFuZy5pc1N0cmluZyhhcmd1bWVudHNbMV0pKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgICAgICAgICBmcm9tVG9rZW4gPSB0aGlzLmNyZWF0ZVRva2VuKHRva2VuVHlwZSwgdGV4dCk7CisgICAgICAgICAgICAgICAgdCA9IHRoaXMuY3JlYXRlKGZyb21Ub2tlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyb21Ub2tlbiA9IHRoaXMuY3JlYXRlVG9rZW4oZnJvbVRva2VuKTsKKyAgICAgICAgICAgICAgICBmcm9tVG9rZW4uc2V0VHlwZSh0b2tlblR5cGUpOworICAgICAgICAgICAgICAgIHQgPSB0aGlzLmNyZWF0ZShmcm9tVG9rZW4pOworICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0zKSB7CisgICAgICAgICAgICB0ZXh0ID0gYXJndW1lbnRzWzJdOworICAgICAgICAgICAgZnJvbVRva2VuID0gdGhpcy5jcmVhdGVUb2tlbihmcm9tVG9rZW4pOworICAgICAgICAgICAgZnJvbVRva2VuLnNldFR5cGUodG9rZW5UeXBlKTsKKyAgICAgICAgICAgIGZyb21Ub2tlbi5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgdCA9IHRoaXMuY3JlYXRlKGZyb21Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBnZXRUeXBlOiBmdW5jdGlvbih0KSB7CisgICAgICAgIHQuZ2V0VHlwZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9LAorCisgICAgc2V0VHlwZTogZnVuY3Rpb24odCwgdHlwZSkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRvbid0IGtub3cgZW5vdWdoIGFib3V0IFRyZWUgbm9kZSIpOworICAgIH0sCisKKyAgICBnZXRUZXh0OiBmdW5jdGlvbih0KSB7CisgICAgICAgIHJldHVybiB0LmdldFRleHQoKTsKKyAgICB9LAorCisgICAgc2V0VGV4dDogZnVuY3Rpb24odCwgdGV4dCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRvbid0IGtub3cgZW5vdWdoIGFib3V0IFRyZWUgbm9kZSIpOworICAgIH0sCisKKyAgICBnZXRDaGlsZDogZnVuY3Rpb24odCwgaSkgeworICAgICAgICByZXR1cm4gdC5nZXRDaGlsZChpKTsKKyAgICB9LAorCisgICAgc2V0Q2hpbGQ6IGZ1bmN0aW9uKHQsIGksIGNoaWxkKSB7CisgICAgICAgIHQuc2V0Q2hpbGQoaSwgY2hpbGQpOworICAgIH0sCisKKyAgICBkZWxldGVDaGlsZDogZnVuY3Rpb24odCwgaSkgeworICAgICAgICByZXR1cm4gdC5kZWxldGVDaGlsZChpKTsKKyAgICB9LAorCisgICAgZ2V0Q2hpbGRDb3VudDogZnVuY3Rpb24odCkgeworICAgICAgICByZXR1cm4gdC5nZXRDaGlsZENvdW50KCk7CisgICAgfSwKKworICAgIGdldFVuaXF1ZUlEOiBmdW5jdGlvbihub2RlKSB7CisgICAgICAgIGlmICggIXRoaXMudHJlZVRvVW5pcXVlSURNYXAgKSB7CisgICAgICAgICAgICAgdGhpcy50cmVlVG9VbmlxdWVJRE1hcCA9IHt9OworICAgICAgICB9CisgICAgICAgIHZhciBwcmV2SUQgPSB0aGlzLnRyZWVUb1VuaXF1ZUlETWFwW25vZGVdOworICAgICAgICBpZiAoIG9yZy5hbnRsci5sYW5nLmlzVmFsdWUocHJldklEKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2SUQ7CisgICAgICAgIH0KKyAgICAgICAgdmFyIElEID0gdGhpcy51bmlxdWVOb2RlSUQ7CisgICAgICAgIHRoaXMudHJlZVRvVW5pcXVlSURNYXBbbm9kZV0gPSBJRDsKKyAgICAgICAgdGhpcy51bmlxdWVOb2RlSUQrKzsKKyAgICAgICAgcmV0dXJuIElEOworICAgICAgICAvLyBHQyBtYWtlcyB0aGVzZSBub251bmlxdWU6CisgICAgICAgIC8vIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShub2RlKTsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25FcnJvck5vZGUuanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE1ZmNiOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uRXJyb3JOb2RlLmpzCkBAIC0wLDAgKzEsNjggQEAKK29yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uRXJyb3JOb2RlID0gZnVuY3Rpb24oaW5wdXQsIHN0YXJ0LCBzdG9wLCBlKSB7CisgICAgaWYgKCAhc3RvcCB8fAorICAgICAgICAgICAgKHN0b3AuZ2V0VG9rZW5JbmRleCgpIDwgc3RhcnQuZ2V0VG9rZW5JbmRleCgpICYmCisgICAgICAgICAgICAgc3RvcC5nZXRUeXBlKCkhPW9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRikgKQorICAgIHsKKyAgICAgICAgLy8gc29tZXRpbWVzIHJlc3luYyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gKHdoZW4gTFQoMSkgaXMKKyAgICAgICAgLy8gaW4gZm9sbG93IHNldC4gIFNvLCBzdG9wIHdpbGwgYmUgMSB0byBsZWZ0IHRvIHN0YXJ0LiBhZGp1c3QuCisgICAgICAgIC8vIEFsc28gaGFuZGxlIGNhc2Ugd2hlcmUgc3RhcnQgaXMgdGhlIGZpcnN0IHRva2VuIGFuZCBubyB0b2tlbgorICAgICAgICAvLyBpcyBjb25zdW1lZCBkdXJpbmcgcmVjb3Zlcnk7IExUKC0xKSB3aWxsIHJldHVybiBudWxsLgorICAgICAgICBzdG9wID0gc3RhcnQ7CisgICAgfQorICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgdGhpcy5zdG9wID0gc3RvcDsKKyAgICB0aGlzLnRyYXBwZWRFeGNlcHRpb24gPSBlOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uRXJyb3JOb2RlLCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIHsKKyAgICBpc05pbDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9LAorCisgICAgZ2V0VHlwZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEU7CisgICAgfSwKKworICAgIGdldFRleHQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgYmFkVGV4dCA9IG51bGw7CisgICAgICAgIGlmICggdGhpcy5zdGFydCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlRva2VuICkgeworICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnN0YXJ0LmdldFRva2VuSW5kZXgoKTsKKyAgICAgICAgICAgIHZhciBqID0gdGhpcy5zdG9wLmdldFRva2VuSW5kZXgoKTsKKyAgICAgICAgICAgIGlmICggdGhpcy5zdG9wLmdldFR5cGUoKSA9PT0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GICkgeworICAgICAgICAgICAgICAgIGogPSB0aGlzLmlucHV0LnNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhZFRleHQgPSB0aGlzLmlucHV0LnRvU3RyaW5nKGksIGopOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB0aGlzLnN0YXJ0IGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlICkgeworICAgICAgICAgICAgYmFkVGV4dCA9IHRoaXMuaW5wdXQudG9TdHJpbmcodGhpcy5zdGFydCwgdGhpcy5zdG9wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBlb3BsZSBzaG91bGQgc3ViY2xhc3MgaWYgdGhleSBhbHRlciB0aGUgdHJlZSB0eXBlIHNvIHRoaXMKKyAgICAgICAgICAgIC8vIG5leHQgb25lIGlzIGZvciBzdXJlIGNvcnJlY3QuCisgICAgICAgICAgICBiYWRUZXh0ID0gIjx1bmtub3duPiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhZFRleHQ7CisgICAgfSwKKworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCB0aGlzLnRyYXBwZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5NaXNzaW5nVG9rZW5FeGNlcHRpb24gKSB7CisgICAgICAgICAgICByZXR1cm4gIjxtaXNzaW5nIHR5cGU6ICIrCisgICAgICAgICAgICAgICAgICAgdGhpcy50cmFwcGVkRXhjZXB0aW9uLmdldE1pc3NpbmdUeXBlKCkrCisgICAgICAgICAgICAgICAgICAgIj4iOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB0aGlzLnRyYXBwZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5VbndhbnRlZFRva2VuRXhjZXB0aW9uICkgeworICAgICAgICAgICAgcmV0dXJuICI8ZXh0cmFuZW91czogIisKKyAgICAgICAgICAgICAgICAgICB0aGlzLnRyYXBwZWRFeGNlcHRpb24uZ2V0VW5leHBlY3RlZFRva2VuKCkrCisgICAgICAgICAgICAgICAgICAgIiwgcmVzeW5jPSIrdGhpcy5nZXRUZXh0KCkrIj4iOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB0aGlzLnRyYXBwZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKSB7CisgICAgICAgICAgICByZXR1cm4gIjxtaXNtYXRjaGVkIHRva2VuOiAiK3RoaXMudHJhcHBlZEV4Y2VwdGlvbi50b2tlbisiLCByZXN5bmM9Iit0aGlzLmdldFRleHQoKSsiPiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHRoaXMudHJhcHBlZEV4Y2VwdGlvbiBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uICkgeworICAgICAgICAgICAgcmV0dXJuICI8dW5leHBlY3RlZDogIit0aGlzLnRyYXBwZWRFeGNlcHRpb24udG9rZW4rCisgICAgICAgICAgICAgICAgICAgIiwgcmVzeW5jPSIrdGhpcy5nZXRUZXh0KCkrIj4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiPGVycm9yOiAiK3RoaXMuZ2V0VGV4dCgpKyI+IjsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZS5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWU3MzVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlLmpzCkBAIC0wLDAgKzEsMTM1IEBACisvKiogQSB0cmVlIG5vZGUgdGhhdCBpcyB3cmFwcGVyIGZvciBhIFRva2VuIG9iamVjdC4gIEFmdGVyIDMuMCByZWxlYXNlCisgKiAgd2hpbGUgYnVpbGRpbmcgdHJlZSByZXdyaXRlIHN0dWZmLCBpdCBiZWNhbWUgY2xlYXIgdGhhdCBjb21wdXRpbmcKKyAqICBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IGlzIHZlcnkgZGlmZmljdWx0IGFuZCBjdW1iZXJzb21lLiAgQmV0dGVyIHRvCisgKiAgc3BlbmQgdGhlIHNwYWNlIGluIGV2ZXJ5IHRyZWUgbm9kZS4gIElmIHlvdSBkb24ndCB3YW50IHRoZXNlIGV4dHJhCisgKiAgZmllbGRzLCBpdCdzIGVhc3kgdG8gY3V0IHRoZW0gb3V0IGluIHlvdXIgb3duIEJhc2VUcmVlIHN1YmNsYXNzLgorICovCitvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUgPSBmdW5jdGlvbihub2RlKSB7CisgICAgLyoqIFdoYXQgdG9rZW4gaW5kZXhlcyBicmFja2V0IGFsbCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZQorICAgICAqICBhbmQgYmVsb3c/CisgICAgICovCisgICAgdGhpcy5zdGFydEluZGV4ID0gLTE7CisgICAgdGhpcy5zdG9wSW5kZXggPSAtMTsKKworICAgIC8qKiBXaGF0IGluZGV4IGlzIHRoaXMgbm9kZSBpbiB0aGUgY2hpbGQgbGlzdD8gUmFuZ2U6IDAuLm4tMSAqLworICAgIHRoaXMuY2hpbGRJbmRleCA9IC0xOworCisgICAgLyoqIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdCAqLworICAgIHRoaXMucGFyZW50ID0gbnVsbDsKKworICAgIC8qKiBBIHNpbmdsZSB0b2tlbiBpcyB0aGUgcGF5bG9hZCAqLworICAgIHRoaXMudG9rZW4gPSBudWxsOworCisgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUpIHsKKyAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBub2RlKTsKKyAgICAgICAgdGhpcy50b2tlbiA9IG5vZGUudG9rZW47CisgICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IG5vZGUuc3RhcnRJbmRleDsKKyAgICAgICAgdGhpcy5zdG9wSW5kZXggPSBub2RlLnN0b3BJbmRleDsKKyAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbikgeworICAgICAgICB0aGlzLnRva2VuID0gbm9kZTsKKyAgICB9Cit9OworCisvKiogQSB0cmVlIG5vZGUgdGhhdCBpcyB3cmFwcGVyIGZvciBhIFRva2VuIG9iamVjdC4gKi8KK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQmFzZVRyZWUsIHsKKyAgICBnZXRUb2tlbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRva2VuOworICAgIH0sCisKKyAgICBkdXBOb2RlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUodGhpcyk7CisgICAgfSwKKworICAgIGlzTmlsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICF0aGlzLnRva2VuOworICAgIH0sCisKKyAgICBnZXRUeXBlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAhdGhpcy50b2tlbiApIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4uZ2V0VHlwZSgpOworICAgIH0sCisKKyAgICBnZXRUZXh0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAhdGhpcy50b2tlbiApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnRva2VuLmdldFRleHQoKTsKKyAgICB9LAorCisgICAgZ2V0TGluZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggIXRoaXMudG9rZW4gfHwgdGhpcy50b2tlbi5nZXRMaW5lKCk9PT0wICkgeworICAgICAgICAgICAgaWYgKCB0aGlzLmdldENoaWxkQ291bnQoKT4wICkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmdldExpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnRva2VuLmdldExpbmUoKTsKKyAgICB9LAorCisgICAgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCAhdGhpcy50b2tlbiB8fCB0aGlzLnRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpPT09LTEgKSB7CisgICAgICAgICAgICBpZiAoIHRoaXMuZ2V0Q2hpbGRDb3VudCgpPjAgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGQoMCkuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy50b2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKyAgICB9LAorCisgICAgZ2V0VG9rZW5TdGFydEluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCB0aGlzLnRva2VuICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4uZ2V0VG9rZW5JbmRleCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0SW5kZXg7CisgICAgfSwKKworICAgIHNldFRva2VuU3RhcnRJbmRleDogZnVuY3Rpb24oaW5kZXgpIHsKKyAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gaW5kZXg7CisgICAgfSwKKworICAgIGdldFRva2VuU3RvcEluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCB0aGlzLnRva2VuICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4uZ2V0VG9rZW5JbmRleCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnN0b3BJbmRleDsKKyAgICB9LAorCisgICAgc2V0VG9rZW5TdG9wSW5kZXg6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgICAgIHRoaXMuc3RvcEluZGV4ID0gaW5kZXg7CisgICAgfSwKKworICAgIGdldENoaWxkSW5kZXg6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEluZGV4OworICAgIH0sCisKKyAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7CisgICAgfSwKKworICAgIHNldFBhcmVudDogZnVuY3Rpb24odCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHQ7CisgICAgfSwKKworICAgIHNldENoaWxkSW5kZXg6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgICAgIHRoaXMuY2hpbGRJbmRleCA9IGluZGV4OworICAgIH0sCisKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggdGhpcy5pc05pbCgpICkgeworICAgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5nZXRUeXBlKCk9PT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEUgKSB7CisgICAgICAgICAgICByZXR1cm4gIjxlcnJvcm5vZGU+IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoICF0aGlzLnRva2VuICkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4uZ2V0VGV4dCgpOworICAgIH0KK30pOworCisvKiBNb25rZXkgcGF0Y2ggVHJlZSBzdGF0aWMgcHJvcGVydHkgd2l0aCBDb21tb25Ub2tlbiB2YWx1ZS4gKi8KK29yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZS5JTlZBTElEX05PREUgPQorICBuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlKG9yZy5hbnRsci5ydW50aW1lLlRva2VuLklOVkFMSURfVE9LRU4pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlQWRhcHRvci5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2QwMGNhMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuanMKQEAgLTAsMCArMSwxNzEgQEAKKy8qKiBBIFRyZWVBZGFwdG9yIHRoYXQgd29ya3Mgd2l0aCBhbnkgVHJlZSBpbXBsZW1lbnRhdGlvbi4gIEl0IHByb3ZpZGVzCisgKiAgcmVhbGx5IGp1c3QgZmFjdG9yeSBtZXRob2RzOyBhbGwgdGhlIHdvcmsgaXMgZG9uZSBieSBCYXNlVHJlZUFkYXB0b3IuCisgKiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBkaWZmZXJlbnQgdG9rZW5zIGNyZWF0ZWQgdGhhbiBDbGFzc2ljVG9rZW4KKyAqICBvYmplY3RzLCB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGFuZCB0aGVuIHNldCB0aGUgcGFyc2VyIHRyZWUgYWRhcHRvciB0bworICogIHVzZSB5b3VyIHN1YmNsYXNzLgorICoKKyAqICBUbyBnZXQgeW91ciBwYXJzZXIgdG8gYnVpbGQgbm9kZXMgb2YgYSBkaWZmZXJlbnQgdHlwZSwgb3ZlcnJpZGUKKyAqICBjcmVhdGUoVG9rZW4pLgorICovCitvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWVBZGFwdG9yID0gZnVuY3Rpb24oKSB7fTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZUFkYXB0b3IsCisgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS50cmVlLkJhc2VUcmVlQWRhcHRvciwgeworICAgIC8qKiBEdXBsaWNhdGUgYSBub2RlLiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBmYWN0b3J5OworICAgICAqICAgIG92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LgorICAgICAqCisgICAgICogIEkgY291bGQgdXNlIHJlZmxlY3Rpb24gdG8gcHJldmVudCBoYXZpbmcgdG8gb3ZlcnJpZGUgdGhpcworICAgICAqICBidXQgcmVmbGVjdGlvbiBpcyBzbG93LgorICAgICAqLworICAgIGR1cE5vZGU6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0KSApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0LmR1cE5vZGUoKTsKKyAgICB9LAorCisgICAgY3JlYXRlOiBmdW5jdGlvbihwYXlsb2FkKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPjEpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWVBZGFwdG9yLnN1cGVyY2xhc3MuY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUocGF5bG9hZCk7CisgICAgfSwKKworICAgIC8qKiBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgICAgICogIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorICAgICAqCisgICAgICogIElmIHlvdSBjYXJlIHdoYXQgdGhlIHRva2VuIHBheWxvYWQgb2JqZWN0cycgdHlwZSBpcywgeW91IHNob3VsZAorICAgICAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICoKKyAgICAgKiBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorICAgICAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgICAgICogIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorICAgICAqCisgICAgICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgICAgICogIGFuIGFjdHVhbCByZWFsIGlucHV0IHRva2VuLiAgVHlwaWNhbGx5IHRoaXMgaXMgZm9yIGNvbnZlcnRpbmcgJ3snCisgICAgICogIHRva2VucyB0byBCTE9DSyBldGMuLi4gIFlvdSdsbCBzZWUKKyAgICAgKgorICAgICAqICAgIHIgOiBsYz0neycgSUQrICd9JyAtPiBeKEJMT0NLWyRsY10gSUQrKSA7CisgICAgICoKKyAgICAgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgICAgICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbnkgb3RoZXIgY3JlYXRlVG9rZW4gdmFyaWFudC4KKyAgICAgKi8KKyAgICBjcmVhdGVUb2tlbjogZnVuY3Rpb24oZnJvbVRva2VuKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPT09MikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbihhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKGFyZ3VtZW50c1swXSk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIFRyYWNrIHN0YXJ0L3N0b3AgdG9rZW4gZm9yIHN1YnRyZWUgcm9vdCBjcmVhdGVkIGZvciBhIHJ1bGUuCisgICAgICogIE9ubHkgd29ya3Mgd2l0aCBUcmVlIG5vZGVzLiAgRm9yIHJ1bGVzIHRoYXQgbWF0Y2ggbm90aGluZywKKyAgICAgKiAgc2VlbXMgbGlrZSB0aGlzIHdpbGwgeWllbGQgc3RhcnQ9aSBhbmQgc3RvcD1pLTEgaW4gYSBuaWwgbm9kZS4KKyAgICAgKiAgTWlnaHQgYmUgdXNlZnVsIGluZm8gc28gSSdsbCBub3QgZm9yY2UgdG8gYmUgaS4uaS4KKyAgICAgKi8KKyAgICBzZXRUb2tlbkJvdW5kYXJpZXM6IGZ1bmN0aW9uKHQsIHN0YXJ0VG9rZW4sIHN0b3BUb2tlbikgeworICAgICAgICBpZiAoICFvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHQpICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZhciBzdGFydCA9IDAsCisgICAgICAgICAgICBzdG9wID0gMDsKKyAgICAgICAgaWYgKCBvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHN0YXJ0VG9rZW4pICkgeworICAgICAgICAgICAgaWYgKHN0YXJ0VG9rZW4uZ2V0VG9rZW5JbmRleCkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRUb2tlbi5nZXRUb2tlbkluZGV4KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0VG9rZW4uZ2V0U3RhcnRJbmRleCkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRUb2tlbi5nZXRTdGFydEluZGV4KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRUb2tlbi5nZXRUb2tlblN0YXJ0SW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIG9yZy5hbnRsci5sYW5nLmlzVmFsdWUoc3RvcFRva2VuKSApIHsKKyAgICAgICAgICAgIGlmIChzdG9wLmdldFRva2VuSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBzdG9wID0gc3RvcFRva2VuLmdldFRva2VuSW5kZXgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcFRva2VuLmdldFN0b3BJbmRleCkgeworICAgICAgICAgICAgICAgIHN0b3AgPSBzdG9wVG9rZW4uZ2V0U3RvcEluZGV4KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3AgPSBzdG9wVG9rZW4uZ2V0VG9rZW5TdG9wSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0LnNldFRva2VuU3RhcnRJbmRleChzdGFydCk7CisgICAgICAgIHQuc2V0VG9rZW5TdG9wSW5kZXgoc3RvcCk7CisgICAgfSwKKworICAgIGdldFRva2VuU3RhcnRJbmRleDogZnVuY3Rpb24odCkgeworICAgICAgICBpZiAoIXQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdC5nZXRUb2tlblN0YXJ0SW5kZXgoKTsKKyAgICB9LAorCisgICAgZ2V0VG9rZW5TdG9wSW5kZXg6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgaWYgKCF0KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQuZ2V0VG9rZW5TdG9wSW5kZXgoKTsKKyAgICB9LAorCisgICAgZ2V0VGV4dDogZnVuY3Rpb24odCkgeworICAgICAgICBpZiAoIXQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0LmdldFRleHQoKTsKKyAgICB9LAorCisgICAgZ2V0VHlwZTogZnVuY3Rpb24odCkgeworICAgICAgICBpZiAoIXQpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5JTlZBTElEX1RPS0VOX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQuZ2V0VHlwZSgpOworICAgIH0sCisKKyAgICAvKiogV2hhdCBpcyB0aGUgVG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZT8gIElmCisgICAgICogIHlvdSBhcmUgbm90IHVzaW5nIENvbW1vblRyZWUsIHRoZW4geW91IG11c3QKKyAgICAgKiAgb3ZlcnJpZGUgdGhpcyBpbiB5b3VyIG93biBhZGFwdG9yLgorICAgICAqLworICAgIGdldFRva2VuOiBmdW5jdGlvbih0KSB7CisgICAgICAgIGlmICggdCBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSApIHsKKyAgICAgICAgICAgIHJldHVybiB0LmdldFRva2VuKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vIGlkZWEgd2hhdCB0byBkbworICAgIH0sCisKKyAgICBnZXRDaGlsZDogZnVuY3Rpb24odCwgaSkgeworICAgICAgICBpZiAoIXQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0LmdldENoaWxkKGkpOworICAgIH0sCisKKyAgICBnZXRDaGlsZENvdW50OiBmdW5jdGlvbih0KSB7CisgICAgICAgIGlmICghdCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQuZ2V0Q2hpbGRDb3VudCgpOworICAgIH0sCisKKyAgICBnZXRQYXJlbnQ6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgcmV0dXJuIHQuZ2V0UGFyZW50KCk7CisgICAgfSwKKworICAgIHNldFBhcmVudDogZnVuY3Rpb24odCwgcGFyZW50KSB7CisgICAgICAgIHQuc2V0UGFyZW50KHBhcmVudCk7CisgICAgfSwKKworICAgIGdldENoaWxkSW5kZXg6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgcmV0dXJuIHQuZ2V0Q2hpbGRJbmRleCgpOworICAgIH0sCisKKyAgICBzZXRDaGlsZEluZGV4OiBmdW5jdGlvbih0LCBpbmRleCkgeworICAgICAgICB0LnNldENoaWxkSW5kZXgoaW5kZXgpOworICAgIH0sCisKKyAgICByZXBsYWNlQ2hpbGRyZW46IGZ1bmN0aW9uKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCkgeworICAgICAgICBpZiAoIHBhcmVudCApIHsKKyAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGRyZW4oc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7CisgICAgICAgIH0KKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZU5vZGVTdHJlYW0uanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNWZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmpzCkBAIC0wLDAgKzEsMzk0IEBACisvKiogQSBidWZmZXJlZCBzdHJlYW0gb2YgdHJlZSBub2Rlcy4gIE5vZGVzIGNhbiBiZSBmcm9tIGEgdHJlZSBvZiBBTlkga2luZC4KKyAqCisgKiAgVGhpcyBub2RlIHN0cmVhbSBzdWNrcyBhbGwgbm9kZXMgb3V0IG9mIHRoZSB0cmVlIHNwZWNpZmllZCBpbgorICogIHRoZSBjb25zdHJ1Y3RvciBkdXJpbmcgY29uc3RydWN0aW9uIGFuZCBtYWtlcyBwb2ludGVycyBpbnRvCisgKiAgdGhlIHRyZWUgdXNpbmcgYW4gYXJyYXkgb2YgT2JqZWN0IHBvaW50ZXJzLiBUaGUgc3RyZWFtIG5lY2Vzc2FyaWx5CisgKiAgaW5jbHVkZXMgcG9pbnRlcnMgdG8gRE9XTiBhbmQgVVAgYW5kIEVPRiBub2Rlcy4KKyAqCisgKiAgVGhpcyBzdHJlYW0ga25vd3MgaG93IHRvIG1hcmsvcmVsZWFzZSBmb3IgYmFja3RyYWNraW5nLgorICoKKyAqICBUaGlzIHN0cmVhbSBpcyBtb3N0IHN1aXRhYmxlIGZvciB0cmVlIGludGVycHJldGVycyB0aGF0IG5lZWQgdG8KKyAqICBqdW1wIGFyb3VuZCBhIGxvdCBvciBmb3IgdHJlZSBwYXJzZXJzIHJlcXVpcmluZyBzcGVlZCAoYXQgY29zdCBvZiBtZW1vcnkpLgorICogIFRoZXJlIGlzIHNvbWUgZHVwbGljYXRlZCBmdW5jdGlvbmFsaXR5IGhlcmUgd2l0aCBVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0KKyAqICBidXQganVzdCBpbiBib29ra2VlcGluZywgbm90IHRyZWUgd2Fsa2luZyBldGMuLi4KKyAqCisgKiAgQHNlZSBVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0KKyAqLworb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbSA9IGZ1bmN0aW9uKGFkYXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQnVmZmVyU2l6ZSkKK3sKKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD09PTEpIHsKKyAgICAgICAgdHJlZSA9IGFkYXB0b3I7CisgICAgICAgIGFkYXB0b3IgPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlQWRhcHRvcigpOworICAgIH0KKyAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAyKSB7CisgICAgICAgIGluaXRpYWxCdWZmZXJTaXplID0KKyAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0uREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFOworICAgIH0KKworICAgIC8qKiBSZXVzZSBzYW1lIERPV04sIFVQIG5hdmlnYXRpb24gbm9kZXMgdW5sZXNzIHRoaXMgaXMgdHJ1ZSAqLworICAgIHRoaXMudW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gZmFsc2U7CisKKyAgICAvKiogVGhlIGluZGV4IGludG8gdGhlIG5vZGVzIGxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSAobmV4dCBub2RlCisgICAgICogIHRvIGNvbnN1bWUpLiAgSWYgLTEsIG5vZGVzIGFycmF5IG5vdCBmaWxsZWQgeWV0LgorICAgICAqLworICAgIHRoaXMucCA9IC0xOworCisgICAgdmFyIFRva2VuID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CisgICAgdGhpcy5yb290ID0gdHJlZTsKKyAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgIHRoaXMubm9kZXMgPSBbXTsgLy9uZXcgQXJyYXlMaXN0KGluaXRpYWxCdWZmZXJTaXplKTsKKyAgICB0aGlzLmRvd24gPSB0aGlzLmFkYXB0b3IuY3JlYXRlKFRva2VuLkRPV04sICJET1dOIik7CisgICAgdGhpcy51cCA9IHRoaXMuYWRhcHRvci5jcmVhdGUoVG9rZW4uVVAsICJVUCIpOworICAgIHRoaXMuZW9mID0gdGhpcy5hZGFwdG9yLmNyZWF0ZShUb2tlbi5FT0YsICJFT0YiKTsKK307CisKK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3Qob3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbSwgeworICAgIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRTogMTAwLAorICAgIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFOiAxMAorfSk7CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWVOb2RlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbSwgCit7CisgICAgU3RyZWFtSXRlcmF0b3I6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgaSA9IDAsCisgICAgICAgICAgICBub2RlcyA9IHRoaXMubm9kZXMsCisgICAgICAgICAgICBlb2YgPSB0aGlzLmVvZjsKKworICAgICAgICByZXR1cm4geworICAgICAgICAgICAgaGFzTmV4dDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk8bm9kZXMubGVuZ3RoOworICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBpOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBpZiAoIGN1cnJlbnQgPCBub2Rlcy5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2Rlc1tjdXJyZW50XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVvZjsKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgcmVtb3ZlIG5vZGVzIGZyb20gc3RyZWFtIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfSwKKworICAgIC8qKiBXYWxrIHRyZWUgd2l0aCBkZXB0aC1maXJzdC1zZWFyY2ggYW5kIGZpbGwgbm9kZXMgYnVmZmVyLgorICAgICAqICBEb24ndCBkbyBET1dOLCBVUCBub2RlcyBpZiBpdHMgYSBsaXN0ICh0IGlzIGlzTmlsKS4KKyAgICAgKi8KKyAgICBmaWxsQnVmZmVyOiBmdW5jdGlvbih0KSB7CisgICAgICAgIHZhciByZXNldF9wID0gZmFsc2U7CisgICAgICAgIGlmIChvcmcuYW50bHIubGFuZy5pc1VuZGVmaW5lZCh0KSkgeworICAgICAgICAgICAgdCA9IHRoaXMucm9vdDsKKyAgICAgICAgICAgIHJlc2V0X3AgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIG5pbCA9IHRoaXMuYWRhcHRvci5pc05pbCh0KTsKKyAgICAgICAgaWYgKCAhbmlsICkgeworICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKHQpOyAvLyBhZGQgdGhpcyBub2RlCisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIERPV04gbm9kZSBpZiB0IGhhcyBjaGlsZHJlbgorICAgICAgICB2YXIgbiA9IHRoaXMuYWRhcHRvci5nZXRDaGlsZENvdW50KHQpOworICAgICAgICBpZiAoICFuaWwgJiYgbj4wICkgeworICAgICAgICAgICAgdGhpcy5hZGROYXZpZ2F0aW9uTm9kZShvcmcuYW50bHIucnVudGltZS5Ub2tlbi5ET1dOKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbmQgbm93IGFkZCBhbGwgaXRzIGNoaWxkcmVuCisgICAgICAgIHZhciBjLCBjaGlsZDsKKyAgICAgICAgZm9yIChjPTA7IGM8bjsgYysrKSB7CisgICAgICAgICAgICBjaGlsZCA9IHRoaXMuYWRhcHRvci5nZXRDaGlsZCh0LGMpOworICAgICAgICAgICAgdGhpcy5maWxsQnVmZmVyKGNoaWxkKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgVVAgbm9kZSBpZiB0IGhhcyBjaGlsZHJlbgorICAgICAgICBpZiAoICFuaWwgJiYgbj4wICkgeworICAgICAgICAgICAgdGhpcy5hZGROYXZpZ2F0aW9uTm9kZShvcmcuYW50bHIucnVudGltZS5Ub2tlbi5VUCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzZXRfcCkgeworICAgICAgICAgICAgdGhpcy5wID0gMDsgLy8gYnVmZmVyIG9mIG5vZGVzIGludGlhbGl6ZWQgbm93CisgICAgICAgIH0KKyAgICB9LAorCisgICAgZ2V0Tm9kZUluZGV4OiBmdW5jdGlvbihub2RlKSB7CisgICAgICAgIGlmICggdGhpcy5wPT0tMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHZhciBpLCB0OworICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLm5vZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0ID0gdGhpcy5ub2Rlc1tpXTsKKyAgICAgICAgICAgIGlmICggdD09PW5vZGUgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0sCisKKyAgICAvKiogQXMgd2UgZmxhdHRlbiB0aGUgdHJlZSwgd2UgdXNlIFVQLCBET1dOIG5vZGVzIHRvIHJlcHJlc2VudAorICAgICAqICB0aGUgdHJlZSBzdHJ1Y3R1cmUuICBXaGVuIGRlYnVnZ2luZyB3ZSBuZWVkIHVuaXF1ZSBub2RlcworICAgICAqICBzbyBpbnN0YW50aWF0ZSBuZXcgb25lcyB3aGVuIHVuaXF1ZU5hdmlnYXRpb25Ob2RlcyBpcyB0cnVlLgorICAgICAqLworICAgIGFkZE5hdmlnYXRpb25Ob2RlOiBmdW5jdGlvbih0dHlwZSkgeworICAgICAgICB2YXIgbmF2Tm9kZSA9IG51bGw7CisgICAgICAgIGlmICggdHR5cGU9PT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5ET1dOICkgeworICAgICAgICAgICAgaWYgKCB0aGlzLmhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcygpICkgeworICAgICAgICAgICAgICAgIG5hdk5vZGUgPSB0aGlzLmFkYXB0b3IuY3JlYXRlKG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRPV04sICJET1dOIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYXZOb2RlID0gdGhpcy5kb3duOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCB0aGlzLmhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcygpICkgeworICAgICAgICAgICAgICAgIG5hdk5vZGUgPSB0aGlzLmFkYXB0b3IuY3JlYXRlKG9yZy5hbnRsci5ydW50aW1lLlRva2VuLlVQLCAiVVAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG5hdk5vZGUgPSB0aGlzLnVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMubm9kZXMucHVzaChuYXZOb2RlKTsKKyAgICB9LAorCisgICAgZ2V0OiBmdW5jdGlvbihpKSB7CisgICAgICAgIGlmICggdGhpcy5wPT09LTEgKSB7CisgICAgICAgICAgICB0aGlzLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tpXTsKKyAgICB9LAorCisgICAgTFQ6IGZ1bmN0aW9uKGspIHsKKyAgICAgICAgaWYgKCB0aGlzLnA9PT0tMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIGlmICggaz09PTAgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGs8MCApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLkxCKC0xKmspOworICAgICAgICB9CisgICAgICAgIGlmICggKHRoaXMucCtrLTEpID49IHRoaXMubm9kZXMubGVuZ3RoICkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW9mOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMucCtrLTFdOworICAgIH0sCisKKyAgICBnZXRDdXJyZW50U3ltYm9sOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuTFQoMSk7IH0sCisKKyAgICAvKiogTG9vayBiYWNrd2FyZHMgayBub2RlcyAqLworICAgIExCOiBmdW5jdGlvbihrKSB7CisgICAgICAgIGlmICggaz09PTAgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICh0aGlzLnAtayk8MCApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMucC1rXTsKKyAgICB9LAorCisgICAgZ2V0VHJlZVNvdXJjZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7CisgICAgfSwKKworICAgIGdldFNvdXJjZU5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlblN0cmVhbSgpLmdldFNvdXJjZU5hbWUoKTsKKyAgICB9LAorCisgICAgZ2V0VG9rZW5TdHJlYW06IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7CisgICAgfSwKKworICAgIHNldFRva2VuU3RyZWFtOiBmdW5jdGlvbih0b2tlbnMpIHsKKyAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7CisgICAgfSwKKworICAgIGdldFRyZWVBZGFwdG9yOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRvcjsKKyAgICB9LAorCisgICAgc2V0VHJlZUFkYXB0b3I6IGZ1bmN0aW9uKGFkYXB0b3IpIHsKKyAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICB9LAorCisgICAgaGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudW5pcXVlTmF2aWdhdGlvbk5vZGVzOworICAgIH0sCisKKyAgICBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6IGZ1bmN0aW9uKHVuaXF1ZU5hdmlnYXRpb25Ob2RlcykgeworICAgICAgICB0aGlzLnVuaXF1ZU5hdmlnYXRpb25Ob2RlcyA9IHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICB9LAorCisgICAgY29uc3VtZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggdGhpcy5wPT09LTEgKSB7CisgICAgICAgICAgICB0aGlzLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnArKzsKKyAgICB9LAorCisgICAgTEE6IGZ1bmN0aW9uKGkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRvci5nZXRUeXBlKHRoaXMuTFQoaSkpOworICAgIH0sCisKKyAgICBtYXJrOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCB0aGlzLnA9PT0tMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHRoaXMuaW5kZXgoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMubGFzdE1hcmtlcjsKKyAgICB9LAorCisgICAgcmVsZWFzZTogZnVuY3Rpb24obWFya2VyKSB7CisgICAgICAgIC8vIG5vIHJlc291cmNlcyB0byByZWxlYXNlCisgICAgfSwKKworICAgIGluZGV4OiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucDsKKyAgICB9LAorCisgICAgcmV3aW5kOiBmdW5jdGlvbihtYXJrZXIpIHsKKyAgICAgICAgaWYgKCFvcmcuYW50bHIubGFuZy5pc051bWJlcihtYXJrZXIpKSB7CisgICAgICAgICAgICBtYXJrZXIgPSB0aGlzLmxhc3RNYXJrZXI7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zZWVrKG1hcmtlcik7CisgICAgfSwKKworICAgIHNlZWs6IGZ1bmN0aW9uKGluZGV4KSB7CisgICAgICAgIGlmICggdGhpcy5wPT09LTEgKSB7CisgICAgICAgICAgICB0aGlzLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnAgPSBpbmRleDsKKyAgICB9LAorCisgICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisgICAgICovCisgICAgcHVzaDogZnVuY3Rpb24oaW5kZXgpIHsKKyAgICAgICAgaWYgKCAhdGhpcy5jYWxscyApIHsKKyAgICAgICAgICAgIHRoaXMuY2FsbHMgPSBbXTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNhbGxzLnB1c2godGhpcy5wKTsgLy8gc2F2ZSBjdXJyZW50IGluZGV4CisgICAgICAgIHRoaXMuc2VlayhpbmRleCk7CisgICAgfSwKKworICAgIC8qKiBTZWVrIGJhY2sgdG8gcHJldmlvdXMgaW5kZXggc2F2ZWQgZHVyaW5nIGxhc3QgcHVzaCgpIGNhbGwuCisgICAgICogIFJldHVybiB0b3Agb2Ygc3RhY2sgKHJldHVybiBpbmRleCkuCisgICAgICovCisgICAgcG9wOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHJldCA9IHRoaXMuY2FsbHMucG9wKCk7CisgICAgICAgIHRoaXMuc2VlayhyZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICByZXNldDogZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucCA9IDA7CisgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IDA7CisgICAgICAgIGlmICh0aGlzLmNhbGxzKSB7CisgICAgICAgICAgICB0aGlzLmNhbGxzID0gW107CisgICAgICAgIH0KKyAgICB9LAorCisgICAgc2l6ZTogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICggdGhpcy5wPT09LTEgKSB7CisgICAgICAgICAgICB0aGlzLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGg7CisgICAgfSwKKworICAgIGl0ZXJhdG9yOiBmdW5jdGlvbigpIHsKKyAgICAgICAgaWYgKCB0aGlzLnA9PT0tMSApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLlN0cmVhbUl0ZXJhdG9yKCk7CisgICAgfSwKKworICAgIHJlcGxhY2VDaGlsZHJlbjogZnVuY3Rpb24ocGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0KSB7CisgICAgICAgIGlmICggcGFyZW50ICkgeworICAgICAgICAgICAgdGhpcy5hZGFwdG9yLnJlcGxhY2VDaGlsZHJlbihwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCwgc3RvcENoaWxkSW5kZXgsIHQpOworICAgICAgICB9CisgICAgfSwKKworICAgIC8qKiBEZWJ1Z2dpbmcgKi8KKyAgICB0b1Rva2VuU3RyaW5nOiBmdW5jdGlvbihzdGFydCwgc3RvcCkgeworICAgICAgICBpZiAoIHRoaXMucD09PS0xICkgeworICAgICAgICAgICAgdGhpcy5maWxsQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJ1Zj0nJywgaSwgdDsKKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCB0aGlzLm5vZGVzLmxlbmd0aCAmJiBpIDw9IHN0b3A7IGkrKykgeworICAgICAgICAgICAgdCA9IHRoaXMubm9kZXNbaV07CisgICAgICAgICAgICBidWYgKz0gIiAiK3RoaXMuYWRhcHRvci5nZXRUb2tlbih0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmOworICAgIH0sCisKKyAgICAvKiogVXNlZCBmb3IgdGVzdGluZywganVzdCByZXR1cm4gdGhlIHRva2VuIHR5cGUgc3RyZWFtICovCisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wKSB7CisgICAgICAgIHZhciBidWYgPSAiIiwKKyAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICB0LAorICAgICAgICAgICAgaTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0wKSB7CisgICAgICAgICAgICBpZiAoIHRoaXMucD09PS0xICkgeworICAgICAgICAgICAgICAgIHRoaXMuZmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0ID0gdGhpcy5ub2Rlc1tpXTsKKyAgICAgICAgICAgICAgICBidWYgKz0gIiAiOworICAgICAgICAgICAgICAgIGJ1ZiArPSB0aGlzLmFkYXB0b3IuZ2V0VHlwZSh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoICFvcmcuYW50bHIubGFuZy5pc051bWJlcihzdGFydCkgfHwgIW9yZy5hbnRsci5sYW5nLmlzTnVtYmVyKHN0b3ApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCB0aGlzLnA9PT0tMSApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgdGhlIHRva2VuIHN0cmVhbSwgdXNlIHRoYXQgdG8gZHVtcCB0ZXh0IGluIG9yZGVyCisgICAgICAgICAgICB2YXIgYmVnaW5Ub2tlbkluZGV4LAorICAgICAgICAgICAgICAgIGVuZFRva2VuSW5kZXg7CisgICAgICAgICAgICBpZiAoIHRoaXMudG9rZW5zICkgeworICAgICAgICAgICAgICAgIGJlZ2luVG9rZW5JbmRleCA9IHRoaXMuYWRhcHRvci5nZXRUb2tlblN0YXJ0SW5kZXgoc3RhcnQpOworICAgICAgICAgICAgICAgIGVuZFRva2VuSW5kZXggPSB0aGlzLmFkYXB0b3IuZ2V0VG9rZW5TdG9wSW5kZXgoc3RvcCk7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhIHRyZWUsIHVzZSBzdGFydC9zdG9wIGluZGV4IGZyb20gc3RhcnQgbm9kZQorICAgICAgICAgICAgICAgIC8vIGVsc2UgdXNlIHRva2VuIHJhbmdlIGZyb20gc3RhcnQvc3RvcCBub2RlcworICAgICAgICAgICAgICAgIGlmICggdGhpcy5hZGFwdG9yLmdldFR5cGUoc3RvcCk9PT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5VUCApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kVG9rZW5JbmRleCA9IHRoaXMuYWRhcHRvci5nZXRUb2tlblN0b3BJbmRleChzdGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB0aGlzLmFkYXB0b3IuZ2V0VHlwZShzdG9wKT09b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuZFRva2VuSW5kZXggPSB0aGlzLnNpemUoKS0yOyAvLyBkb24ndCB1c2UgRU9GCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRva2Vucy50b1N0cmluZyhiZWdpblRva2VuSW5kZXgsIGVuZFRva2VuSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2FsayBub2RlcyBsb29raW5nIGZvciBzdGFydAorICAgICAgICAgICAgdCA9IG51bGw7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGZvciAoOyBpIDwgdGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHQgPSB0aGlzLm5vZGVzW2ldOworICAgICAgICAgICAgICAgIGlmICggdD09PXN0YXJ0ICkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBub3cgd2FsayB1bnRpbCB3ZSBzZWUgc3RvcCwgZmlsbGluZyBzdHJpbmcgYnVmZmVyIHdpdGggdGV4dAorICAgICAgICAgICAgYnVmID0gdGV4dCA9ICIiOworICAgICAgICAgICAgdCA9IHRoaXMubm9kZXNbaV07CisgICAgICAgICAgICB3aGlsZSAoIHQhPT1zdG9wICkgeworICAgICAgICAgICAgICAgIHRleHQgPSB0aGlzLmFkYXB0b3IuZ2V0VGV4dCh0KTsKKyAgICAgICAgICAgICAgICBpZiAoICFvcmcuYW50bHIubGFuZy5pc1N0cmluZyh0ZXh0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIgIit0aGlzLmFkYXB0b3IuZ2V0VHlwZSh0KS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYgKz0gdGV4dDsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgdCA9IG5vZGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaW5jbHVkZSBzdG9wIG5vZGUgdG9vCisgICAgICAgICAgICB0ZXh0ID0gdGhpcy5hZGFwdG9yLmdldFRleHQoc3RvcCk7CisgICAgICAgICAgICBpZiAoICFvcmcuYW50bHIubGFuZy5pc1N0cmluZyh0ZXh0KSApIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIiAiK3RoaXMuYWRhcHRvci5nZXRUeXBlKHN0b3ApLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgKz0gdGV4dDsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQwODNiMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMTkgQEAKK29yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uID0gZnVuY3Rpb24oZWxlbWVudERlc2NyaXB0aW9uKSB7CisgICAgdGhpcy5lbGVtZW50RGVzY3JpcHRpb24gPSBlbGVtZW50RGVzY3JpcHRpb247Cit9OworCisvKiogQmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgdGhyb3duIGR1cmluZyBBU1QgcmV3cml0ZSBjb25zdHJ1Y3Rpb24uCisgKiAgVGhpcyBzaWduaWZpZXMgYSBjYXNlIHdoZXJlIHRoZSBjYXJkaW5hbGl0eSBvZiB0d28gb3IgbW9yZSBlbGVtZW50cworICogIGluIGEgc3VicnVsZSBhcmUgZGlmZmVyZW50OiAoSUQgSU5UKSsgd2hlcmUgfElEfCE9fElOVHwKKyAqLworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLCBFcnJvciwgeworICAgIGdldE1lc3NhZ2U6IGZ1bmN0aW9uKCkgeworCQlpZiAoIG9yZy5hbnRsci5sYW5nLmlzU3RyaW5nKHRoaXMuZWxlbWVudERlc2NyaXB0aW9uKSApIHsKKwkJCXJldHVybiB0aGlzLmVsZW1lbnREZXNjcmlwdGlvbjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9LAorICAgIG5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gIm9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uIjsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTA0ODQwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uLmpzCkBAIC0wLDAgKzEsMTUgQEAKKy8qKiBObyBlbGVtZW50cyB3aXRoaW4gYSAoLi4uKSsgaW4gYSByZXdyaXRlIHJ1bGUgKi8KK29yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKGVsZW1lbnREZXNjcmlwdGlvbikgeworICAgIHZhciBzdXAgPSBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uc3VwZXJjbGFzczsKKyAgICBpZiAob3JnLmFudGxyLmxhbmcuaXNVbmRlZmluZWQoZWxlbWVudERlc2NyaXB0aW9uKSkgeworICAgICAgICBlbGVtZW50RGVzY3JpcHRpb24gPSBudWxsOworICAgIH0KKyAgICBzdXAuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBlbGVtZW50RGVzY3JpcHRpb24pOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uLCB7CisgICAgbmFtZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAib3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uIjsKKyAgICB9ICAgIAorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwOTQzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbi5qcwpAQCAtMCwwICsxLDEyIEBACisvKiogUmVmIHRvIElEIG9yIGV4cHIgYnV0IG5vIHRva2VucyBpbiBJRCBzdHJlYW0gb3Igc3VidHJlZXMgaW4gZXhwciBzdHJlYW0gKi8KK29yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uID0gZnVuY3Rpb24oZWxlbWVudERlc2NyaXB0aW9uKSB7CisgICAgdmFyIHN1cCA9IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uLnN1cGVyY2xhc3M7IAorICAgIHN1cC5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIGVsZW1lbnREZXNjcmlwdGlvbik7Cit9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQob3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbiwgeworICAgIG5hbWU6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gIm9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uIjsKKyAgICB9Cit9KTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQzN2E3OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmpzCkBAIC0wLDAgKzEsMTQ4IEBACisvKiogQSBnZW5lcmljIGxpc3Qgb2YgZWxlbWVudHMgdHJhY2tlZCBpbiBhbiBhbHRlcm5hdGl2ZSB0byBiZSB1c2VkIGluCisgKiAgYSAtPiByZXdyaXRlIHJ1bGUuICBXZSBuZWVkIHRvIHN1YmNsYXNzIHRvIGZpbGwgaW4gdGhlIG5leHQoKSBtZXRob2QsCisgKiAgd2hpY2ggcmV0dXJucyBlaXRoZXIgYW4gQVNUIG5vZGUgd3JhcHBlZCBhcm91bmQgYSB0b2tlbiBwYXlsb2FkIG9yCisgKiAgYW4gZXhpc3Rpbmcgc3VidHJlZS4KKyAqCisgKiAgT25jZSB5b3Ugc3RhcnQgbmV4dCgpaW5nLCBkbyBub3QgdHJ5IHRvIGFkZCBtb3JlIGVsZW1lbnRzLiAgSXQgd2lsbAorICogIGJyZWFrIHRoZSBjdXJzb3IgdHJhY2tpbmcgSSBiZWxpZXZlLgorICoKKyAqICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtCisgKiAgQHNlZSBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlVG9rZW5TdHJlYW0KKyAqCisgKiAgVE9ETzogYWRkIG1lY2hhbmlzbSB0byBkZXRlY3QvcHVrZSBvbiBtb2RpZmljYXRpb24gYWZ0ZXIgcmVhZGluZyBmcm9tIHN0cmVhbQorICovCitvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSA9IGZ1bmN0aW9uKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgZWwpIHsKKyAgICAvKiogQ3Vyc29yIDAuLm4tMS4gIElmIHNpbmdsZUVsZW1lbnQhPW51bGwsIGN1cnNvciBpcyAwIHVudGlsIHlvdSBuZXh0KCksCisgICAgICogIHdoaWNoIGJ1bXBzIGl0IHRvIDEgbWVhbmluZyBubyBtb3JlIGVsZW1lbnRzLgorICAgICAqLworICAgIHRoaXMuY3Vyc29yID0gMDsKKworICAgIC8qKiBPbmNlIGEgbm9kZSAvIHN1YnRyZWUgaGFzIGJlZW4gdXNlZCBpbiBhIHN0cmVhbSwgaXQgbXVzdCBiZSBkdXAnZAorICAgICAqICBmcm9tIHRoZW4gb24uICBTdHJlYW1zIGFyZSByZXNldCBhZnRlciBzdWJydWxlcyBzbyB0aGF0IHRoZSBzdHJlYW1zCisgICAgICogIGNhbiBiZSByZXVzZWQgaW4gZnV0dXJlIHN1YnJ1bGVzLiAgU28sIHJlc2V0IG11c3Qgc2V0IGEgZGlydHkgYml0LgorICAgICAqICBJZiBkaXJ0eSwgdGhlbiBuZXh0KCkgYWx3YXlzIHJldHVybnMgYSBkdXAuCisgICAgICoKKyAgICAgKiAgSSB3YW50ZWQgdG8gdXNlICJuYXVnaHR5IGJpdCIgaGVyZSwgYnV0IGNvdWxkbid0IHRoaW5rIG9mIGEgd2F5CisgICAgICogIHRvIHVzZSAibmF1Z2h0eSIuCisgICAgICovCisgICAgdGhpcy5kaXJ0eSA9IGZhbHNlOworCisgICAgdGhpcy5lbGVtZW50RGVzY3JpcHRpb24gPSBlbGVtZW50RGVzY3JpcHRpb247CisgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICBpZiAoZWwpIHsKKyAgICAgICAgaWYgKG9yZy5hbnRsci5sYW5nLmlzQXJyYXkoZWwpKSB7CisgICAgICAgICAgICB0aGlzLnNpbmdsZUVsZW1lbnQgPSBudWxsOworICAgICAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5hZGQoZWwpOworICAgICAgICB9CisgICAgfQorfTsKKworb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ucHJvdG90eXBlID0geworICAgIC8qKiBSZXNldCB0aGUgY29uZGl0aW9uIG9mIHRoaXMgc3RyZWFtIHNvIHRoYXQgaXQgYXBwZWFycyB3ZSBoYXZlCisgICAgICogIG5vdCBjb25zdW1lZCBhbnkgb2YgaXRzIGVsZW1lbnRzLiAgRWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgdW50b3VjaGVkLgorICAgICAqICBPbmNlIHdlIHJlc2V0IHRoZSBzdHJlYW0sIGFueSBmdXR1cmUgdXNlIHdpbGwgbmVlZCBkdXBsaWNhdGVzLiAgU2V0CisgICAgICogIHRoZSBkaXJ0eSBiaXQuCisgICAgICovCisgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmN1cnNvciA9IDA7CisgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOworICAgIH0sCisKKyAgICBhZGQ6IGZ1bmN0aW9uKGVsKSB7CisgICAgICAgIGlmICggIW9yZy5hbnRsci5sYW5nLmlzVmFsdWUoZWwpICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5lbGVtZW50cyApIHsgLy8gaWYgaW4gbGlzdCwganVzdCBhZGQKKyAgICAgICAgICAgIHRoaXMuZWxlbWVudHMucHVzaChlbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0aGlzLnNpbmdsZUVsZW1lbnQpICkgeyAvLyBubyBlbGVtZW50cyB5ZXQsIHRyYWNrIHcvbyBsaXN0CisgICAgICAgICAgICB0aGlzLnNpbmdsZUVsZW1lbnQgPSBlbDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGRpbmcgMm5kIGVsZW1lbnQsIG1vdmUgdG8gbGlzdAorICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107CisgICAgICAgIHRoaXMuZWxlbWVudHMucHVzaCh0aGlzLnNpbmdsZUVsZW1lbnQpOworICAgICAgICB0aGlzLnNpbmdsZUVsZW1lbnQgPSBudWxsOworICAgICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWwpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIHN0cmVhbS4gIElmIG91dCBvZiBlbGVtZW50cywgdGhyb3cKKyAgICAgKiAgYW4gZXhjZXB0aW9uIHVubGVzcyBzaXplKCk9PTEuICBJZiBzaXplIGlzIDEsIHRoZW4gcmV0dXJuIGVsZW1lbnRzWzBdLgorICAgICAqICBSZXR1cm4gYSBkdXBsaWNhdGUgbm9kZS9zdWJ0cmVlIGlmIHN0cmVhbSBpcyBvdXQgb2YgZWxlbWVudHMgYW5kCisgICAgICogIHNpemU9PTEuICBJZiB3ZSd2ZSBhbHJlYWR5IHVzZWQgdGhlIGVsZW1lbnQsIGR1cCAoZGlydHkgYml0IHNldCkuCisgICAgICovCisgICAgbmV4dFRyZWU6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgbiA9IHRoaXMuc2l6ZSgpLAorICAgICAgICAgICAgZWw7CisgICAgICAgIGlmICggdGhpcy5kaXJ0eSB8fCAodGhpcy5jdXJzb3I+PW4gJiYgbj09MSkgKSB7CisgICAgICAgICAgICAvLyBpZiBvdXQgb2YgZWxlbWVudHMgYW5kIHNpemUgaXMgMSwgZHVwCisgICAgICAgICAgICBlbCA9IHRoaXMuX25leHQoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmR1cChlbCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGVzdCBzaXplIGFib3ZlIHRoZW4gZmV0Y2gKKyAgICAgICAgZWwgPSB0aGlzLl9uZXh0KCk7CisgICAgICAgIHJldHVybiBlbDsKKyAgICB9LAorCisgICAgLyoqIGRvIHRoZSB3b3JrIG9mIGdldHRpbmcgdGhlIG5leHQgZWxlbWVudCwgbWFraW5nIHN1cmUgdGhhdCBpdCdzCisgICAgICogIGEgdHJlZSBub2RlIG9yIHN1YnRyZWUuICBEZWFsIHdpdGggdGhlIG9wdGltaXphdGlvbiBvZiBzaW5nbGUtCisgICAgICogIGVsZW1lbnQgbGlzdCB2ZXJzdXMgbGlzdCBvZiBzaXplID4gMS4gIFRocm93IGFuIGV4Y2VwdGlvbgorICAgICAqICBpZiB0aGUgc3RyZWFtIGlzIGVtcHR5IG9yIHdlJ3JlIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZT4xLgorICAgICAqICBwcm90ZWN0ZWQgc28geW91IGNhbiBvdmVycmlkZSBpbiBhIHN1YmNsYXNzIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBfbmV4dDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBuID0gdGhpcy5zaXplKCk7CisgICAgICAgIGlmIChuPT09MCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKHRoaXMuZWxlbWVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHRoaXMuY3Vyc29yPj0gbikgeyAvLyBvdXQgb2YgZWxlbWVudHM/CisgICAgICAgICAgICBpZiAoIG49PT0xICkgeyAgLy8gaWYgc2l6ZSBpcyAxLCBpdCdzIG9rOyByZXR1cm4gYW5kIHdlJ2xsIGR1cAorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvVHJlZSh0aGlzLnNpbmdsZUVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIHdhcyBub3QgMSwgc28gd2UgY2FuJ3QgZHVwCisgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24odGhpcy5lbGVtZW50RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIC8vIHdlIGhhdmUgZWxlbWVudHMKKyAgICAgICAgaWYgKCBvcmcuYW50bHIubGFuZy5pc1ZhbHVlKHRoaXMuc2luZ2xlRWxlbWVudCkgKSB7CisgICAgICAgICAgICB0aGlzLmN1cnNvcisrOyAvLyBtb3ZlIGN1cnNvciBldmVuIGZvciBzaW5nbGUgZWxlbWVudCBsaXN0CisgICAgICAgICAgICByZXR1cm4gdGhpcy50b1RyZWUodGhpcy5zaW5nbGVFbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICAvLyBtdXN0IGhhdmUgbW9yZSB0aGFuIG9uZSBpbiBsaXN0LCBwdWxsIGZyb20gZWxlbWVudHMKKyAgICAgICAgdmFyIG8gPSB0aGlzLnRvVHJlZSh0aGlzLmVsZW1lbnRzW3RoaXMuY3Vyc29yXSk7CisgICAgICAgIHRoaXMuY3Vyc29yKys7CisgICAgICAgIHJldHVybiBvOworICAgIH0sCisKKyAgICAvKiogRW5zdXJlIHN0cmVhbSBlbWl0cyB0cmVlczsgdG9rZW5zIG11c3QgYmUgY29udmVydGVkIHRvIEFTVCBub2Rlcy4KKyAgICAgKiAgQVNUIG5vZGVzIGNhbiBiZSBwYXNzZWQgdGhyb3VnaCB1bm1vbGVzdGVkLgorICAgICAqLworICAgIHRvVHJlZTogZnVuY3Rpb24oZWwpIHsKKyAgICAgICAgaWYgKGVsICYmIGVsLmdldFRyZWUpIHsKKyAgICAgICAgICAgIHJldHVybiBlbC5nZXRUcmVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsOworICAgIH0sCisKKyAgICBoYXNOZXh0OiBmdW5jdGlvbigpIHsKKyAgICAgICAgIHJldHVybiAob3JnLmFudGxyLmxhbmcuaXNWYWx1ZSh0aGlzLnNpbmdsZUVsZW1lbnQpICYmIHRoaXMuY3Vyc29yIDwgMSkgfHwKKyAgICAgICAgICAgICAgICh0aGlzLmVsZW1lbnRzICYmIHRoaXMuY3Vyc29yIDwgdGhpcy5lbGVtZW50cy5sZW5ndGgpOworICAgIH0sCisKKyAgICBzaXplOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG4gPSAwOworICAgICAgICBpZiAoIG9yZy5hbnRsci5sYW5nLmlzVmFsdWUodGhpcy5zaW5nbGVFbGVtZW50KSApIHsKKyAgICAgICAgICAgIG4gPSAxOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5lbGVtZW50cyApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbjsKKyAgICB9LAorCisgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50RGVzY3JpcHRpb247CisgICAgfQorfTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZU5vZGVTdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQyZTUwMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmpzCkBAIC0wLDAgKzEsMjQgQEAKKy8qKiBRdWV1ZXMgdXAgbm9kZXMgbWF0Y2hlZCBvbiBsZWZ0IHNpZGUgb2YgLT4gaW4gYSB0cmVlIHBhcnNlci4gVGhpcyBpcworICogIHRoZSBhbmFsb2cgb2YgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBmb3Igbm9ybWFsIHBhcnNlcnMuIAorICovCitvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlTm9kZVN0cmVhbSA9IGZ1bmN0aW9uKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgZWwpIHsKKyAgICBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlTm9kZVN0cmVhbS5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQob3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZU5vZGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSwKK3sKKyAgICBuZXh0Tm9kZTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9uZXh0KCk7CisgICAgfSwKKworICAgIHRvVHJlZTogZnVuY3Rpb24oZWwpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRvci5kdXBOb2RlKGVsKTsKKyAgICB9LAorCisgICAgZHVwOiBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8gd2UgZHVwIGV2ZXJ5IG5vZGUsIHNvIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgY2FsbGluZyBkdXA7IHNob3J0LQorICAgICAgICAvLyBjaXJjdWl0ZWQgbmV4dCgpIHNvIGl0IGRvZXNuJ3QgY2FsbC4KKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkdXAgY2FuJ3QgYmUgY2FsbGVkIGZvciBhIG5vZGUgc3RyZWFtLiIpOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGVhMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uanMKQEAgLTAsMCArMSwzOCBAQAorb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gPSBmdW5jdGlvbigpIHsKKyAgICB2YXIgc3VwID0gb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uc3VwZXJjbGFzczsKKyAgICBzdXAuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLCB7CisJLyoqIFRyZWF0IG5leHQgZWxlbWVudCBhcyBhIHNpbmdsZSBub2RlIGV2ZW4gaWYgaXQncyBhIHN1YnRyZWUuCisJICogIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIG5leHQoKSB3aGVuIHRoZSByZXN1bHQgaGFzIHRvIGJlIGEKKwkgKiAgdHJlZSByb290IG5vZGUuICBBbHNvIHByZXZlbnRzIHVzIGZyb20gZHVwbGljYXRpbmcgcmVjZW50bHktYWRkZWQKKwkgKiAgY2hpbGRyZW47IGUuZy4sIF4odHlwZSBJRCkrIGFkZHMgSUQgdG8gdHlwZSBhbmQgdGhlbiAybmQgaXRlcmF0aW9uCisJICogIG11c3QgZHVwIHRoZSB0eXBlIG5vZGUsIGJ1dCBJRCBoYXMgYmVlbiBhZGRlZC4KKwkgKgorCSAqICBSZWZlcmVuY2luZyBhIHJ1bGUgcmVzdWx0IHR3aWNlIGlzIG9rOyBkdXAgZW50aXJlIHRyZWUgYXMKKwkgKiAgd2UgY2FuJ3QgYmUgYWRkaW5nIHRyZWVzIGFzIHJvb3Q7IGUuZy4sIGV4cHIgZXhwci4KKwkgKgorCSAqICBIaWRlb3VzIGNvZGUgZHVwbGljYXRpb24gaGVyZSB3aXRoIHN1cGVyLm5leHQoKS4gIENhbid0IHRoaW5rIG9mCisJICogIGEgcHJvcGVyIHdheSB0byByZWZhY3Rvci4gIFRoaXMgbmVlZHMgdG8gYWx3YXlzIGNhbGwgZHVwIG5vZGUKKwkgKiAgYW5kIHN1cGVyLm5leHQoKSBkb2Vzbid0IGtub3cgd2hpY2ggdG8gY2FsbDogZHVwIG5vZGUgb3IgZHVwIHRyZWUuCisJICovCisgICAgbmV4dE5vZGU6IGZ1bmN0aW9uKCkgeworCQl2YXIgbiA9IHRoaXMuc2l6ZSgpLAorICAgICAgICAgICAgZWw7CisJCWlmICggdGhpcy5kaXJ0eSB8fCAodGhpcy5jdXJzb3I+PW4gJiYgbj09PTEpICkgeworCQkJLy8gaWYgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIGlzIDEsIGR1cCAoYXQgbW9zdCBhIHNpbmdsZSBub2RlCisJCQkvLyBzaW5jZSB0aGlzIGlzIGZvciBtYWtpbmcgcm9vdCBub2RlcykuCisJCQllbCA9IHRoaXMuX25leHQoKTsKKwkJCXJldHVybiB0aGlzLmFkYXB0b3IuZHVwTm9kZShlbCk7CisJCX0KKwkJLy8gdGVzdCBzaXplIGFib3ZlIHRoZW4gZmV0Y2gKKwkJZWwgPSB0aGlzLl9uZXh0KCk7CisJCXJldHVybiBlbDsKKwl9LAorCisgICAgZHVwOiBmdW5jdGlvbihlbCkgeworCQlyZXR1cm4gdGhpcy5hZGFwdG9yLmR1cFRyZWUoZWwpOworCX0KK30pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzJlZjYxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVRva2VuU3RyZWFtLmpzCkBAIC0wLDAgKzEsMjggQEAKK29yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSA9IGZ1bmN0aW9uKGFkYXB0b3IsIGVsZW1lbnREZXNjcmlwdGlvbiwgZWwpIHsKKyAgICB2YXIgc3VwID0gb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtLnN1cGVyY2xhc3M7CisgICAgc3VwLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9OworCitvcmcuYW50bHIubGFuZy5leHRlbmQob3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtLAorICAgICAgICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0sIHsKKyAgICAvKiogR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJlYW0gYW5kIG1ha2UgYSBub2RlIGZvciBpdCAqLworICAgIG5leHROb2RlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHQgPSB0aGlzLl9uZXh0KCk7CisgICAgICAgIHJldHVybiB0aGlzLmFkYXB0b3IuY3JlYXRlKHQpOworICAgIH0sCisKKyAgICBuZXh0VG9rZW46IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5fbmV4dCgpOworICAgIH0sCisKKyAgICAvKiogRG9uJ3QgY29udmVydCB0byBhIHRyZWUgdW5sZXNzIHRoZXkgZXhwbGljaXRseSBjYWxsIG5leHRUcmVlLgorICAgICAqICBUaGlzIHdheSB3ZSBjYW4gZG8gaGV0ZXJvIHRyZWUgbm9kZXMgaW4gcmV3cml0ZS4KKyAgICAgKi8KKyAgICB0b1RyZWU6IGZ1bmN0aW9uKGVsKSB7CisgICAgICAgIHJldHVybiBlbDsKKyAgICB9LAorCisgICAgZHVwOiBmdW5jdGlvbihlbCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImR1cCBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgdG9rZW4gc3RyZWFtLiIpOworICAgIH0KK30pOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmpzIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ4YmE4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWUuanMKQEAgLTAsMCArMSwxMSBAQAorLyoqIFdoYXQgZG9lcyBhIHRyZWUgbG9vayBsaWtlPyAgQU5UTFIgaGFzIGEgbnVtYmVyIG9mIHN1cHBvcnQgY2xhc3NlcworICogIHN1Y2ggYXMgQ29tbW9uVHJlZU5vZGVTdHJlYW0gdGhhdCB3b3JrIG9uIHRoZXNlIGtpbmRzIG9mIHRyZWVzLiAgWW91CisgKiAgZG9uJ3QgaGF2ZSB0byBtYWtlIHlvdXIgdHJlZXMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBidXQgaWYgeW91IGRvLAorICogIHlvdSdsbCBiZSBhYmxlIHRvIHVzZSBtb3JlIHN1cHBvcnQgY29kZS4KKyAqCisgKiAgTk9URTogV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIEFOVExSIGNhbiBidWlsZCBhbnkga2luZCBvZiB0cmVlOyBpdCBjYW4KKyAqICBldmVuIHVzZSBUb2tlbiBvYmplY3RzIGFzIHRyZWVzIGlmIHlvdSBhZGQgYSBjaGlsZCBsaXN0IHRvIHlvdXIgdG9rZW5zLgorICoKKyAqICBUaGlzIGlzIGEgdHJlZSBub2RlIHdpdGhvdXQgYW55IHBheWxvYWQ7IGp1c3QgbmF2aWdhdGlvbiBhbmQgZmFjdG9yeSBzdHVmZi4KKyAqLworb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlID0gZnVuY3Rpb24oKXt9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlTm9kZVN0cmVhbS5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZU5vZGVTdHJlYW0uanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYwYTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZU5vZGVTdHJlYW0uanMKQEAgLTAsMCArMSw2IEBACisvKiogQSBzdHJlYW0gb2YgdHJlZSBub2RlcywgYWNjZXNzaW5nIG5vZGVzIGZyb20gYSB0cmVlIG9mIHNvbWUga2luZCAqLworb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbSA9IGZ1bmN0aW9uKCkge307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLkludFN0cmVhbSk7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5qcyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MDNjYjViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlUGFyc2VyLmpzCkBAIC0wLDAgKzEsMTI0IEBACisvKiogQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKKyAqICBvZiB0aGlzLiAgQWxsIHRoZSBlcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGlzIHNoYXJlZCB3aXRoIFBhcnNlciB2aWEKKyAqICB0aGUgQmFzZVJlY29nbml6ZXIgc3VwZXJjbGFzcy4KKyovCitvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVQYXJzZXIgPSBmdW5jdGlvbihpbnB1dCkgeworICAgIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZVBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTsKKyAgICB0aGlzLnNldFRyZWVOb2RlU3RyZWFtKGlucHV0KTsKK307CisKKyhmdW5jdGlvbigpewordmFyIFRQID0gb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlUGFyc2VyOworCitvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0KFRQLCB7CisgICAgRE9XTjogb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRE9XTiwKKyAgICBVUDogb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uVVAKK30pOworCitvcmcuYW50bHIubGFuZy5leHRlbmQoVFAsIG9yZy5hbnRsci5ydW50aW1lLkJhc2VSZWNvZ25pemVyLCB7CisgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgeworICAgICAgICBUUC5zdXBlcmNsYXNzLnJlc2V0LmNhbGwodGhpcyk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworICAgICAgICBpZiAoIHRoaXMuaW5wdXQgKSB7CisgICAgICAgICAgICB0aGlzLmlucHV0LnNlZWsoMCk7IC8vIHJld2luZCB0aGUgaW5wdXQKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0gKi8KKyAgICBzZXRUcmVlTm9kZVN0cmVhbTogZnVuY3Rpb24oaW5wdXQpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgIH0sCisKKyAgICBnZXRUcmVlTm9kZVN0cmVhbTogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlucHV0OworICAgIH0sCisKKyAgICBnZXRTb3VyY2VOYW1lOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQuZ2V0U291cmNlTmFtZSgpOworICAgIH0sCisKKyAgICBnZXRDdXJyZW50SW5wdXRTeW1ib2w6IGZ1bmN0aW9uKGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5MVCgxKTsKKyAgICB9LAorCisgICAgZ2V0TWlzc2luZ1N5bWJvbDogZnVuY3Rpb24oaW5wdXQsIGUsIGV4cGVjdGVkVG9rZW5UeXBlLCBmb2xsb3cpIHsKKyAgICAgICAgdmFyIHRva2VuVGV4dCA9CisgICAgICAgICAgICAiPG1pc3NpbmcgIit0aGlzLmdldFRva2VuTmFtZXMoKVtleHBlY3RlZFRva2VuVHlwZV0rIj4iOworICAgICAgICByZXR1cm4gbmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZShuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW4oZXhwZWN0ZWRUb2tlblR5cGUsIHRva2VuVGV4dCkpOworICAgIH0sCisKKyAgICAvKiogTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKyAgICAgKiAgZW50aXJlIHRyZWUgaWYgbm9kZSBoYXMgY2hpbGRyZW4uICBJZiBjaGlsZHJlbiwgc2NhbiB1bnRpbAorICAgICAqICBjb3JyZXNwb25kaW5nIFVQIG5vZGUuCisgICAgICovCisgICAgbWF0Y2hBbnk6IGZ1bmN0aW9uKGlnbm9yZSkgeyAvLyBpZ25vcmUgc3RyZWFtLCBjb3B5IG9mIHRoaXMuaW5wdXQKKyAgICAgICAgdGhpcy5zdGF0ZS5lcnJvclJlY292ZXJ5ID0gZmFsc2U7CisgICAgICAgIHRoaXMuc3RhdGUuZmFpbGVkID0gZmFsc2U7CisgICAgICAgIHZhciBsb29rID0gdGhpcy5pbnB1dC5MVCgxKTsKKyAgICAgICAgaWYgKCB0aGlzLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0Q2hpbGRDb3VudChsb29rKT09PTAgKSB7CisgICAgICAgICAgICB0aGlzLmlucHV0LmNvbnN1bWUoKTsgLy8gbm90IHN1YnRyZWUsIGNvbnN1bWUgMSBub2RlIGFuZCByZXR1cm4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjdXJyZW50IG5vZGUgaXMgYSBzdWJ0cmVlLCBza2lwIHRvIGNvcnJlc3BvbmRpbmcgVVAuCisgICAgICAgIC8vIG11c3QgY291bnQgbmVzdGluZyBsZXZlbCB0byBnZXQgcmlnaHQgVVAKKyAgICAgICAgdmFyIGxldmVsPTAsCisgICAgICAgICAgICB0b2tlblR5cGUgPSB0aGlzLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VHlwZShsb29rKTsKKyAgICAgICAgd2hpbGUgKCB0b2tlblR5cGUhPT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5FT0YgJiYKKyAgICAgICAgICAgICAgICAhKHRva2VuVHlwZT09PVRQLlVQICYmIGxldmVsPT09MCkgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgIGxvb2sgPSB0aGlzLmlucHV0LkxUKDEpOworICAgICAgICAgICAgdG9rZW5UeXBlID0gdGhpcy5pbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFR5cGUobG9vayk7CisgICAgICAgICAgICBpZiAoIHRva2VuVHlwZSA9PT0gVFAuRE9XTiApIHsKKyAgICAgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHRva2VuVHlwZSA9PT0gVFAuVVAgKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmlucHV0LmNvbnN1bWUoKTsgLy8gY29uc3VtZSBVUAorICAgIH0sCisKKyAgICAvKiogV2UgaGF2ZSBET1dOL1VQIG5vZGVzIGluIHRoZSBzdHJlYW0gdGhhdCBoYXZlIG5vIGxpbmUgaW5mbzsgb3ZlcnJpZGUuCisgICAgICogIHBsdXMgd2Ugd2FudCB0byBhbHRlciB0aGUgZXhjZXB0aW9uIHR5cGUuICBEb24ndCB0cnkgdG8gcmVjb3ZlcgorICAgICAqICAgICAgICogIGZyb20gdHJlZSBwYXJzZXIgZXJyb3JzIGlubGluZS4uLgorICAgICAqLworICAgIG1pc21hdGNoOiBmdW5jdGlvbihpbnB1dCwgdHR5cGUsIGZvbGxvdykgeworICAgICAgICB0aHJvdyBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKHR0eXBlLCBpbnB1dCk7CisgICAgfSwKKworICAgIC8qKiBQcmVmaXggZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBncmFtbWFyIG5hbWUgYmVjYXVzZSBtZXNzYWdlIGlzCisgICAgICogIGFsd2F5cyBpbnRlbmRlZCBmb3IgdGhlIHByb2dyYW1tZXIgYmVjYXVzZSB0aGUgcGFyc2VyIGJ1aWx0CisgICAgICogIHRoZSBpbnB1dCB0cmVlIG5vdCB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBnZXRFcnJvckhlYWRlcjogZnVuY3Rpb24oZSkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRHcmFtbWFyRmlsZU5hbWUoKSsiOiBub2RlIGZyb20gIisKKyAgICAgICAgICAgICAgIChlLmFwcHJveGltYXRlTGluZUluZm8/ImFmdGVyICI6IiIpKyJsaW5lICIrZS5saW5lKyI6IitlLmNoYXJQb3NpdGlvbkluTGluZTsKKyAgICB9LAorCisgICAgLyoqIFRyZWUgcGFyc2VycyBwYXJzZSBub2RlcyB0aGV5IHVzdWFsbHkgaGF2ZSBhIHRva2VuIG9iamVjdCBhcworICAgICAqICBwYXlsb2FkLiBTZXQgdGhlIGV4Y2VwdGlvbiB0b2tlbiBhbmQgZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICovCisgICAgZ2V0RXJyb3JNZXNzYWdlOiBmdW5jdGlvbihlLCB0b2tlbk5hbWVzKSB7CisgICAgICAgIHZhciBhZGFwdG9yOworICAgICAgICBpZiAoIHRoaXMgaW5zdGFuY2VvZiBUUCApIHsKKyAgICAgICAgICAgIGFkYXB0b3IgPSBlLmlucHV0LmdldFRyZWVBZGFwdG9yKCk7CisgICAgICAgICAgICBlLnRva2VuID0gYWRhcHRvci5nZXRUb2tlbihlLm5vZGUpOworICAgICAgICAgICAgaWYgKCAhb3JnLmFudGxyLmxhbmcuaXNWYWx1ZShlLnRva2VuKSApIHsgLy8gY291bGQgYmUgYW4gVVAvRE9XTiBub2RlCisgICAgICAgICAgICAgICAgZS50b2tlbiA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuZ2V0VHlwZShlLm5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5nZXRUZXh0KGUubm9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBUUC5zdXBlcmNsYXNzLmdldEVycm9yTWVzc2FnZS5jYWxsKHRoaXMsIGUsIHRva2VuTmFtZXMpOworICAgIH0sCisKKyAgICB0cmFjZUluOiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgIFRQLnN1cGVyY2xhc3MudHJhY2VJbi5jYWxsKHRoaXMsIHJ1bGVOYW1lLCBydWxlSW5kZXgsIHRoaXMuaW5wdXQuTFQoMSkpOworICAgIH0sCisKKyAgICB0cmFjZU91dDogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICBUUC5zdXBlcmNsYXNzLnRyYWNlT3V0LmNhbGwodGhpcywgcnVsZU5hbWUsIHJ1bGVJbmRleCwgdGhpcy5pbnB1dC5MVCgxKSk7CisgICAgfQorfSk7CisKK30pKCk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuanMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVSdWxlUmV0dXJuU2NvcGUuanMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRlZjNjZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVJ1bGVSZXR1cm5TY29wZS5qcwpAQCAtMCwwICsxLDEyIEBACisvKiogVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFBhcnNlclJ1bGVSZXR1cm5TY29wZSBleGNlcHQgdGhhdAorICogIHRoZSBzdGFydCBwcm9wZXJ0eSBpcyBhIHRyZWUgbm9kZXMgbm90IFRva2VuIG9iamVjdAorICogIHdoZW4geW91IGFyZSBwYXJzaW5nIHRyZWVzLiAgVG8gYmUgZ2VuZXJpYyB0aGUgdHJlZSBub2RlIHR5cGVzCisgKiAgaGF2ZSB0byBiZSBPYmplY3QuCisgKi8KK29yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZVJ1bGVSZXR1cm5TY29wZSA9IGZ1bmN0aW9uKCl7fTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZVJ1bGVSZXR1cm5TY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS5SdWxlUmV0dXJuU2NvcGUsCit7CisgICAgZ2V0U3RhcnQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5zdGFydDsgfQorfSk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvUHl0aG9uLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvUHl0aG9uLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGMyNTE1MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC9QeXRob24uZwpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyBbVGhlICdCU0QgbGljZW5jZSddCisgQ29weXJpZ2h0IChjKSAyMDA0IFRlcmVuY2UgUGFyciBhbmQgTG9yaW5nIENyYXltZXIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIFB5dGhvbiAyLjMuMyBHcmFtbWFyCisgKgorICogIFRlcmVuY2UgUGFyciBhbmQgTG9yaW5nIENyYXltZXIKKyAqICBGZWJydWFyeSAyMDA0CisgKgorICogIENvbnZlcnRlZCB0byBBTlRMUiB2MyBOb3ZlbWJlciAyMDA1IGJ5IFRlcmVuY2UgUGFyci4KKyAqCisgKiAgVGhpcyBncmFtbWFyIHdhcyBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgUHl0aG9uIDIuMy4zCisgKiAgcGFyc2VyIGdyYW1tYXIgdG8gZ2V0IGEgc3ludGFjdGljYWxseSBjb3JyZWN0IEFOVExSIGdyYW1tYXIKKyAqICBmb3IgUHl0aG9uLiAgVGhlbiBUZXJlbmNlIGhhbmQgdHdlYWtlZCBpdCB0byBiZSBzZW1hbnRpY2FsbHkKKyAqICBjb3JyZWN0OyBpLmUuLCByZW1vdmVkIGxvb2thaGVhZCBpc3N1ZXMgZXRjLi4uICBJdCBpcyBMTCgxKQorICogIGV4Y2VwdCBmb3IgdGhlIChzb21ldGltZXMgb3B0aW9uYWwpIHRyYWlsaW5nIGNvbW1hcyBhbmQgc2VtaS1jb2xvbnMuCisgKiAgSXQgbmVlZHMgdHdvIHN5bWJvbHMgb2YgbG9va2FoZWFkIGluIHRoaXMgY2FzZS4KKyAqCisgKiAgU3RhcnRpbmcgd2l0aCBMb3JpbmcncyBwcmVsaW1pbmFyeSBsZXhlciBmb3IgUHl0aG9uLCBJIG1vZGlmaWVkIGl0CisgKiAgdG8gZG8gbXkgdmVyc2lvbiBvZiB0aGUgd2hvbGUgbmFzdHkgSU5ERU5UL0RFREVOVCBpc3N1ZSBqdXN0IHNvIEkKKyAqICBjb3VsZCB1bmRlcnN0YW5kIHRoZSBwcm9ibGVtIGJldHRlci4gIFRoaXMgZ3JhbW1hciByZXF1aXJlcworICogIFB5dGhvblRva2VuU3RyZWFtLmphdmEgdG8gd29yay4gIEFsc28gSSB1c2VkIHNvbWUgcnVsZXMgZnJvbSB0aGUKKyAqICBzZW1pLWZvcm1hbCBncmFtbWFyIG9uIHRoZSB3ZWIgZm9yIFB5dGhvbiAoYXV0b21hdGljYWxseQorICogIHRyYW5zbGF0ZWQgdG8gQU5UTFIgZm9ybWF0IGJ5IGFuIEFOVExSIGdyYW1tYXIsIG5hdHVyYWxseSA8Z3Jpbj4pLgorICogIFRoZSBsZXhpY2FsIHJ1bGVzIGZvciBweXRob24gYXJlIHBhcnRpY3VsYXJseSBuYXN0eSBhbmQgaXQgdG9vayBtZQorICogIGEgbG9uZyB0aW1lIHRvIGdldCBpdCAncmlnaHQnOyBpLmUuLCB0aGluayBhYm91dCBpdCBpbiB0aGUgcHJvcGVyCisgKiAgd2F5LiAgUmVzaXN0IGNoYW5naW5nIHRoZSBsZXhlciB1bmxlc3MgeW91J3ZlIHVzZWQgQU5UTFIgYSBsb3QuIDspCisgKgorICogIEkgKFRlcmVuY2UpIHRlc3RlZCB0aGlzIGJ5IHJ1bm5pbmcgaXQgb24gdGhlIGp5dGhvbi0yLjEvTGliCisgKiAgZGlyZWN0b3J5IG9mIDQwayBsaW5lcyBvZiBQeXRob24uCisgKgorICogIFJFUVVJUkVTIEFOVExSIHYzCisgKi8KK2dyYW1tYXIgUHl0aG9uOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDt9CisKK3Rva2VucyB7CisgICAgSU5ERU5UOworICAgIERFREVOVDsKK30KKworQGxleGVyOjptZW1iZXJzIHsKKy8qKiBIYW5kbGVzIGNvbnRleHQtc2Vuc2l0aXZlIGxleGluZyBvZiBpbXBsaWNpdCBsaW5lIGpvaW5pbmcgc3VjaCBhcworICogIHRoZSBjYXNlIHdoZXJlIG5ld2xpbmUgaXMgaWdub3JlZCBpbiBjYXNlcyBsaWtlIHRoaXM6CisgKiAgYSA9IFszLAorICogICAgICAgNF0KKyAqLworCXRoaXMuaW1wbGljaXRMaW5lSm9pbmluZ0xldmVsPSAwOworCXRoaXMuc3RhcnRQb3MgPSAtMTsKK30KKworc2luZ2xlX2lucHV0CisgICAgOiBORVdMSU5FCisJfCBzaW1wbGVfc3RtdAorCXwgY29tcG91bmRfc3RtdCBORVdMSU5FCisJOworCitmaWxlX2lucHV0CisgICAgOiAgIChORVdMSU5FIHwgc3RtdCkqCisJOworCitldmFsX2lucHV0CisgICAgOiAgIChORVdMSU5FKSogdGVzdGxpc3QgKE5FV0xJTkUpKgorCTsKKworZnVuY2RlZgorICAgIDogICAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgQ09MT04gc3VpdGUKKwl7eGxvZygiZm91bmQgbWV0aG9kIGRlZiAiKyROQU1FLnRleHQpO30KKwk7CisKK3BhcmFtZXRlcnMKKyAgICA6ICAgTFBBUkVOICh2YXJhcmdzbGlzdCk/IFJQQVJFTgorCTsKKwordmFyYXJnc2xpc3QKKyAgICA6ICAgZGVmcGFyYW1ldGVyIChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9OkNPTU1BIGRlZnBhcmFtZXRlcikqCisgICAgICAgIChDT01NQQorICAgICAgICAgICAgKCBTVEFSIE5BTUUgKENPTU1BIERPVUJMRVNUQVIgTkFNRSk/CisgICAgICAgICAgICB8IERPVUJMRVNUQVIgTkFNRQorICAgICAgICAgICAgKT8KKyAgICAgICAgKT8KKyAgICB8ICAgU1RBUiBOQU1FIChDT01NQSBET1VCTEVTVEFSIE5BTUUpPworICAgIHwgICBET1VCTEVTVEFSIE5BTUUKKyAgICA7CisKK2RlZnBhcmFtZXRlcgorICAgIDogICBmcGRlZiAoQVNTSUdOIHRlc3QpPworICAgIDsKKworZnBkZWYKKyAgICA6ICAgTkFNRQorCXwgICBMUEFSRU4gZnBsaXN0IFJQQVJFTgorCTsKKworZnBsaXN0CisgICAgOiAgIGZwZGVmIChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9OkNPTU1BIGZwZGVmKSogKENPTU1BKT8KKwk7CisKKworc3RtdDogc2ltcGxlX3N0bXQKKwl8IGNvbXBvdW5kX3N0bXQKKwk7CisKK3NpbXBsZV9zdG10CisgICAgOiAgIHNtYWxsX3N0bXQgKG9wdGlvbnMge2dyZWVkeT10cnVlO306U0VNSSBzbWFsbF9zdG10KSogKFNFTUkpPyBORVdMSU5FCisJOworCitzbWFsbF9zdG10OiBleHByX3N0bXQKKwl8IHByaW50X3N0bXQKKwl8IGRlbF9zdG10CisJfCBwYXNzX3N0bXQKKwl8IGZsb3dfc3RtdAorCXwgaW1wb3J0X3N0bXQKKwl8IGdsb2JhbF9zdG10CisJfCBleGVjX3N0bXQKKwl8IGFzc2VydF9zdG10CisJOworCitleHByX3N0bXQKKwk6CXRlc3RsaXN0CisJCSgJYXVnYXNzaWduIHRlc3RsaXN0CisJCXwJKEFTU0lHTiB0ZXN0bGlzdCkrCisJCSk/CisJOworCithdWdhc3NpZ24KKyAgICA6IFBMVVNFUVVBTAorCXwgTUlOVVNFUVVBTAorCXwgU1RBUkVRVUFMCisJfCBTTEFTSEVRVUFMCisJfCBQRVJDRU5URVFVQUwKKwl8IEFNUEVSRVFVQUwKKwl8IFZCQVJFUVVBTAorCXwgQ0lSQ1VNRkxFWEVRVUFMCisJfCBMRUZUU0hJRlRFUVVBTAorCXwgUklHSFRTSElGVEVRVUFMCisJfCBET1VCTEVTVEFSRVFVQUwKKwl8IERPVUJMRVNMQVNIRVFVQUwKKwk7CisKK3ByaW50X3N0bXQ6CisgICAgICAgICdwcmludCcKKyAgICAgICAgKCAgIHRlc3RsaXN0CisgICAgICAgIHwgICBSSUdIVFNISUZUIHRlc3RsaXN0CisgICAgICAgICk/CisJOworCitkZWxfc3RtdDogJ2RlbCcgZXhwcmxpc3QKKwk7CisKK3Bhc3Nfc3RtdDogJ3Bhc3MnCisJOworCitmbG93X3N0bXQ6IGJyZWFrX3N0bXQKKwl8IGNvbnRpbnVlX3N0bXQKKwl8IHJldHVybl9zdG10CisJfCByYWlzZV9zdG10CisJfCB5aWVsZF9zdG10CisJOworCiticmVha19zdG10OiAnYnJlYWsnCisJOworCitjb250aW51ZV9zdG10OiAnY29udGludWUnCisJOworCityZXR1cm5fc3RtdDogJ3JldHVybicgKHRlc3RsaXN0KT8KKwk7CisKK3lpZWxkX3N0bXQ6ICd5aWVsZCcgdGVzdGxpc3QKKwk7CisKK3JhaXNlX3N0bXQ6ICdyYWlzZScgKHRlc3QgKENPTU1BIHRlc3QgKENPTU1BIHRlc3QpPyk/KT8KKwk7CisKK2ltcG9ydF9zdG10CisgICAgOiAgICdpbXBvcnQnIGRvdHRlZF9hc19uYW1lIChDT01NQSBkb3R0ZWRfYXNfbmFtZSkqCisJfCAgICdmcm9tJyBkb3R0ZWRfbmFtZSAnaW1wb3J0JworICAgICAgICAoU1RBUiB8IGltcG9ydF9hc19uYW1lIChDT01NQSBpbXBvcnRfYXNfbmFtZSkqKQorCTsKKworaW1wb3J0X2FzX25hbWUKKyAgICA6ICAgTkFNRSAoTkFNRSBOQU1FKT8KKwk7CisKK2RvdHRlZF9hc19uYW1lOiBkb3R0ZWRfbmFtZSAoTkFNRSBOQU1FKT8KKwk7CisKK2RvdHRlZF9uYW1lOiBOQU1FIChET1QgTkFNRSkqCisJOworCitnbG9iYWxfc3RtdDogJ2dsb2JhbCcgTkFNRSAoQ09NTUEgTkFNRSkqCisJOworCitleGVjX3N0bXQ6ICdleGVjJyBleHByICgnaW4nIHRlc3QgKENPTU1BIHRlc3QpPyk/CisJOworCithc3NlcnRfc3RtdDogJ2Fzc2VydCcgdGVzdCAoQ09NTUEgdGVzdCk/CisJOworCisKK2NvbXBvdW5kX3N0bXQ6IGlmX3N0bXQKKwl8IHdoaWxlX3N0bXQKKwl8IGZvcl9zdG10CisJfCB0cnlfc3RtdAorCXwgZnVuY2RlZgorCXwgY2xhc3NkZWYKKwk7CisKK2lmX3N0bXQ6ICdpZicgdGVzdCBDT0xPTiBzdWl0ZSAoJ2VsaWYnIHRlc3QgQ09MT04gc3VpdGUpKiAoJ2Vsc2UnIENPTE9OIHN1aXRlKT8KKwk7CisKK3doaWxlX3N0bXQ6ICd3aGlsZScgdGVzdCBDT0xPTiBzdWl0ZSAoJ2Vsc2UnIENPTE9OIHN1aXRlKT8KKwk7CisKK2Zvcl9zdG10OiAnZm9yJyBleHBybGlzdCAnaW4nIHRlc3RsaXN0IENPTE9OIHN1aXRlICgnZWxzZScgQ09MT04gc3VpdGUpPworCTsKKwordHJ5X3N0bXQKKyAgICA6ICAgJ3RyeScgQ09MT04gc3VpdGUKKyAgICAgICAgKCAgIChleGNlcHRfY2xhdXNlIENPTE9OIHN1aXRlKSsgKCdlbHNlJyBDT0xPTiBzdWl0ZSk/CisgICAgICAgIHwgICAnZmluYWxseScgQ09MT04gc3VpdGUKKyAgICAgICAgKQorCTsKKworZXhjZXB0X2NsYXVzZTogJ2V4Y2VwdCcgKHRlc3QgKENPTU1BIHRlc3QpPyk/CisJOworCitzdWl0ZTogc2ltcGxlX3N0bXQKKwl8IE5FV0xJTkUgSU5ERU5UIChzdG10KSsgREVERU5UCisJOworCisKK3Rlc3Q6IGFuZF90ZXN0ICgnb3InIGFuZF90ZXN0KSoKKwl8IGxhbWJkZWYKKwk7CisKK2FuZF90ZXN0CisJOiBub3RfdGVzdCAoJ2FuZCcgbm90X3Rlc3QpKgorCTsKKworbm90X3Rlc3QKKwk6ICdub3QnIG5vdF90ZXN0CisJfCBjb21wYXJpc29uCisJOworCitjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgorCTsKKworY29tcF9vcDogTEVTUworCXxHUkVBVEVSCisJfEVRVUFMCisJfEdSRUFURVJFUVVBTAorCXxMRVNTRVFVQUwKKwl8QUxUX05PVEVRVUFMCisJfE5PVEVRVUFMCisJfCdpbicKKwl8J25vdCcgJ2luJworCXwnaXMnCisJfCdpcycgJ25vdCcKKwk7CisKK2V4cHI6IHhvcl9leHByIChWQkFSIHhvcl9leHByKSoKKwk7CisKK3hvcl9leHByOiBhbmRfZXhwciAoQ0lSQ1VNRkxFWCBhbmRfZXhwcikqCisJOworCithbmRfZXhwcjogc2hpZnRfZXhwciAoQU1QRVIgc2hpZnRfZXhwcikqCisJOworCitzaGlmdF9leHByOiBhcml0aF9leHByICgoTEVGVFNISUZUfFJJR0hUU0hJRlQpIGFyaXRoX2V4cHIpKgorCTsKKworYXJpdGhfZXhwcjogdGVybSAoKFBMVVN8TUlOVVMpIHRlcm0pKgorCTsKKwordGVybTogZmFjdG9yICgoU1RBUiB8IFNMQVNIIHwgUEVSQ0VOVCB8IERPVUJMRVNMQVNIICkgZmFjdG9yKSoKKwk7CisKK2ZhY3RvcgorCTogKFBMVVN8TUlOVVN8VElMREUpIGZhY3RvcgorCXwgcG93ZXIKKwk7CisKK3Bvd2VyCisJOiAgIGF0b20gKHRyYWlsZXIpKiAob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpET1VCTEVTVEFSIGZhY3Rvcik/CisJOworCithdG9tOiBMUEFSRU4gKHRlc3RsaXN0KT8gUlBBUkVOCisJfCBMQlJBQ0sgKGxpc3RtYWtlcik/IFJCUkFDSworCXwgTENVUkxZIChkaWN0bWFrZXIpPyBSQ1VSTFkKKwl8IEJBQ0tRVU9URSB0ZXN0bGlzdCBCQUNLUVVPVEUKKwl8IE5BTUUKKwl8IElOVAorICAgIHwgTE9OR0lOVAorICAgIHwgRkxPQVQKKyAgICB8IENPTVBMRVgKKwl8IChTVFJJTkcpKworCTsKKworbGlzdG1ha2VyOiB0ZXN0ICggbGlzdF9mb3IgfCAob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpDT01NQSB0ZXN0KSogKSAoQ09NTUEpPworCTsKKworbGFtYmRlZjogJ2xhbWJkYScgKHZhcmFyZ3NsaXN0KT8gQ09MT04gdGVzdAorCTsKKwordHJhaWxlcjogTFBBUkVOIChhcmdsaXN0KT8gUlBBUkVOCisJfCBMQlJBQ0sgc3Vic2NyaXB0bGlzdCBSQlJBQ0sKKwl8IERPVCBOQU1FCisJOworCitzdWJzY3JpcHRsaXN0CisgICAgOiAgIHN1YnNjcmlwdCAob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpDT01NQSBzdWJzY3JpcHQpKiAoQ09NTUEpPworCTsKKworc3Vic2NyaXB0CisJOiBET1QgRE9UIERPVAorICAgIHwgdGVzdCAoQ09MT04gKHRlc3QpPyAoc2xpY2VvcCk/KT8KKyAgICB8IENPTE9OICh0ZXN0KT8gKHNsaWNlb3ApPworICAgIDsKKworc2xpY2VvcDogQ09MT04gKHRlc3QpPworCTsKKworZXhwcmxpc3QKKyAgICA6ICAgZXhwciAob3B0aW9ucyB7az0yO306Q09NTUEgZXhwcikqIChDT01NQSk/CisJOworCit0ZXN0bGlzdAorICAgIDogICB0ZXN0IChvcHRpb25zIHtrPTI7fTogQ09NTUEgdGVzdCkqIChDT01NQSk/CisgICAgOworCitkaWN0bWFrZXIKKyAgICA6ICAgdGVzdCBDT0xPTiB0ZXN0CisgICAgICAgIChvcHRpb25zIHtrPTI7fTpDT01NQSB0ZXN0IENPTE9OIHRlc3QpKiAoQ09NTUEpPworICAgIDsKKworY2xhc3NkZWY6ICdjbGFzcycgTkFNRSAoTFBBUkVOIHRlc3RsaXN0IFJQQVJFTik/IENPTE9OIHN1aXRlCisJe3hsb2coImZvdW5kIGNsYXNzIGRlZiAiKyROQU1FLnRleHQpO30KKwk7CisKK2FyZ2xpc3Q6IGFyZ3VtZW50IChDT01NQSBhcmd1bWVudCkqCisgICAgICAgICggQ09NTUEKKyAgICAgICAgICAoIFNUQVIgdGVzdCAoQ09NTUEgRE9VQkxFU1RBUiB0ZXN0KT8KKyAgICAgICAgICB8IERPVUJMRVNUQVIgdGVzdAorICAgICAgICAgICk/CisgICAgICAgICk/CisgICAgfCAgIFNUQVIgdGVzdCAoQ09NTUEgRE9VQkxFU1RBUiB0ZXN0KT8KKyAgICB8ICAgRE9VQkxFU1RBUiB0ZXN0CisgICAgOworCithcmd1bWVudCA6IHRlc3QgKEFTU0lHTiB0ZXN0KT8KKyAgICAgICAgIDsKKworbGlzdF9pdGVyOiBsaXN0X2ZvcgorCXwgbGlzdF9pZgorCTsKKworbGlzdF9mb3I6ICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdGxpc3QgKGxpc3RfaXRlcik/CisJOworCitsaXN0X2lmOiAnaWYnIHRlc3QgKGxpc3RfaXRlcik/CisJOworCitMUEFSRU4JOiAnKCcge3RoaXMuaW1wbGljaXRMaW5lSm9pbmluZ0xldmVsKys7fSA7CisKK1JQQVJFTgk6ICcpJyB7dGhpcy5pbXBsaWNpdExpbmVKb2luaW5nTGV2ZWwtLTt9IDsKKworTEJSQUNLCTogJ1snIHt0aGlzLmltcGxpY2l0TGluZUpvaW5pbmdMZXZlbCsrO30gOworCitSQlJBQ0sJOiAnXScge3RoaXMuaW1wbGljaXRMaW5lSm9pbmluZ0xldmVsLS07fSA7CisKK0NPTE9OIAk6ICc6JyA7CisKK0NPTU1BCTogJywnIDsKKworU0VNSQk6ICc7JyA7CisKK1BMVVMJOiAnKycgOworCitNSU5VUwk6ICctJyA7CisKK1NUQVIJOiAnKicgOworCitTTEFTSAk6ICcvJyA7CisKK1ZCQVIJOiAnfCcgOworCitBTVBFUgk6ICcmJyA7CisKK0xFU1MJOiAnPCcgOworCitHUkVBVEVSCTogJz4nIDsKKworQVNTSUdOCTogJz0nIDsKKworUEVSQ0VOVAk6ICclJyA7CisKK0JBQ0tRVU9URQk6ICdgJyA7CisKK0xDVVJMWQk6ICd7JyB7dGhpcy5pbXBsaWNpdExpbmVKb2luaW5nTGV2ZWwrKzt9IDsKKworUkNVUkxZCTogJ30nIHt0aGlzLmltcGxpY2l0TGluZUpvaW5pbmdMZXZlbC0tO30gOworCitDSVJDVU1GTEVYCTogJ14nIDsKKworVElMREUJOiAnficgOworCitFUVVBTAk6ICc9PScgOworCitOT1RFUVVBTAk6ICchPScgOworCitBTFRfTk9URVFVQUw6ICc8PicgOworCitMRVNTRVFVQUwJOiAnPD0nIDsKKworTEVGVFNISUZUCTogJzw8JyA7CisKK0dSRUFURVJFUVVBTAk6ICc+PScgOworCitSSUdIVFNISUZUCTogJz4+JyA7CisKK1BMVVNFUVVBTAk6ICcrPScgOworCitNSU5VU0VRVUFMCTogJy09JyA7CisKK0RPVUJMRVNUQVIJOiAnKionIDsKKworU1RBUkVRVUFMCTogJyo9JyA7CisKK0RPVUJMRVNMQVNICTogJy8vJyA7CisKK1NMQVNIRVFVQUwJOiAnLz0nIDsKKworVkJBUkVRVUFMCTogJ3w9JyA7CisKK1BFUkNFTlRFUVVBTAk6ICclPScgOworCitBTVBFUkVRVUFMCTogJyY9JyA7CisKK0NJUkNVTUZMRVhFUVVBTAk6ICdePScgOworCitMRUZUU0hJRlRFUVVBTAk6ICc8PD0nIDsKKworUklHSFRTSElGVEVRVUFMCTogJz4+PScgOworCitET1VCTEVTVEFSRVFVQUwJOiAnKio9JyA7CisKK0RPVUJMRVNMQVNIRVFVQUwJOiAnLy89JyA7CisKK0RPVCA6ICcuJyA7CisKK0ZMT0FUCisJOgknLicgRElHSVRTIChFeHBvbmVudCk/CisgICAgfCAgIERJR0lUUyAoJy4nIChESUdJVFMgKEV4cG9uZW50KT8pPyB8IEV4cG9uZW50KQorICAgIDsKKworTE9OR0lOVAorICAgIDogICBJTlQgKCdsJ3wnTCcpCisgICAgOworCitmcmFnbWVudAorRXhwb25lbnQKKwk6CSgnZScgfCAnRScpICggJysnIHwgJy0nICk/IERJR0lUUworCTsKKworSU5UIDogICAvLyBIZXgKKyAgICAgICAgJzAnICgneCcgfCAnWCcpICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnICkrCisgICAgICAgICgnbCcgfCAnTCcpPworICAgIHwgICAvLyBPY3RhbAorICAgICAgICAnMCcgRElHSVRTKgorICAgIHwgICAnMScuLic5JyBESUdJVFMqCisgICAgOworCitDT01QTEVYCisgICAgOiAgIElOVCAoJ2onfCdKJykKKyAgICB8ICAgRkxPQVQgKCdqJ3wnSicpCisgICAgOworCitmcmFnbWVudAorRElHSVRTIDogKCAnMCcgLi4gJzknICkrIDsKKworTkFNRToJKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJykKKyAgICAgICAgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICA7CisKKy8qKiBNYXRjaCB2YXJpb3VzIHN0cmluZyB0eXBlcy4gIE5vdGUgdGhhdCBncmVlZHk9ZmFsc2UgaW1wbGllcyAnJycKKyAqICBzaG91bGQgbWFrZSB1cyBleGl0IGxvb3Agbm90IGNvbnRpbnVlLgorICovCitTVFJJTkcKKyAgICA6ICAgKCdyJ3wndSd8J3VyJyk/CisgICAgICAgICggICAnXCdcJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306LikqICdcJ1wnXCcnCisgICAgICAgIHwgICAnIiIiJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306LikqICciIiInCisgICAgICAgIHwgICAnIicgKEVTQ3x+KCdcXCd8J1xuJ3wnIicpKSogJyInCisgICAgICAgIHwgICAnXCcnIChFU0N8fignXFwnfCdcbid8J1wnJykpKiAnXCcnCisgICAgICAgICkKKwk7CisKK2ZyYWdtZW50CitFU0MKKwk6CSdcXCcgLgorCTsKKworLyoqIENvbnN1bWUgYSBuZXdsaW5lIGFuZCBhbnkgd2hpdGVzcGFjZSBhdCBzdGFydCBvZiBuZXh0IGxpbmUgKi8KK0NPTlRJTlVFRF9MSU5FCisJOgknXFwnICgnXHInKT8gJ1xuJyAoJyAnfCdcdCcpKiB7ICRjaGFubmVsPUhJRERFTjsgfQorCTsKKworLyoqIFRyZWF0IGEgc2VxdWVuY2Ugb2YgYmxhbmsgbGluZXMgYXMgYSBzaW5nbGUgYmxhbmsgbGluZS4gIElmCisgKiAgbmVzdGVkIHdpdGhpbiBhICguLiksIHsuLn0sIG9yIFsuLl0sIHRoZW4gaWdub3JlIG5ld2xpbmVzLgorICogIElmIHRoZSBmaXJzdCBuZXdsaW5lIHN0YXJ0cyBpbiBjb2x1bW4gb25lLCB0aGV5IGFyZSB0byBiZSBpZ25vcmVkLgorICovCitORVdMSU5FCisgICAgOiAgICgoJ1xyJyk/ICdcbicgKSsKKyAgICAgICAge2lmICggdGhpcy5zdGFydFBvcz09MCB8fCB0aGlzLmltcGxpY2l0TGluZUpvaW5pbmdMZXZlbD4wICkKKyAgICAgICAgICAgICRjaGFubmVsPUhJRERFTjsKKyAgICAgICAgfQorICAgIDsKKworV1MJOgl7dGhpcy5zdGFydFBvcz4wfT89PiAoJyAnfCdcdCcpKyB7JGNoYW5uZWw9SElEREVOO30KKwk7CisJCisvKiogR3JhYiBldmVyeXRoaW5nIGJlZm9yZSBhIHJlYWwgc3ltYm9sLiAgVGhlbiBpZiBuZXdsaW5lLCBraWxsIGl0CisgKiAgYXMgdGhpcyBpcyBhIGJsYW5rIGxpbmUuICBJZiB3aGl0ZXNwYWNlIGZvbGxvd2VkIGJ5IGNvbW1lbnQsIGtpbGwgaXQKKyAqICBhcyBpdCdzIGEgY29tbWVudCBvbiBhIGxpbmUgYnkgaXRzZWxmLgorICoKKyAqICBJZ25vcmUgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gbmVzdGVkIGluIFsuLl0sICguLiksIHsuLn0uCisgKi8KK0xFQURJTkdfV1MKK0Bpbml0IHsKKyAgICB2YXIgc3BhY2VzID0gMDsKK30KKyAgICA6ICAge3RoaXMuc3RhcnRQb3M9PTB9Pz0+CisgICAgCSggICB7dGhpcy5pbXBsaWNpdExpbmVKb2luaW5nTGV2ZWw+MH0/ICggJyAnIHwgJ1x0JyApKyB7JGNoYW5uZWw9SElEREVOO30KKyAgICAgICAJfAkoIAknICcgIHsgc3BhY2VzKys7IH0KKyAgICAgICAgCXwJJ1x0JyB7IHNwYWNlcyArPSA4OyBzcGFjZXMgLT0gKHNwYWNlcyBcJSA4KTsgfQorICAgICAgIAkJKSsKKyAgICAgICAgCXsKKyAgICAgICAgICAgIC8vIG1ha2UgYSBzdHJpbmcgb2YgbiBzcGFjZXMgd2hlcmUgbiBpcyBjb2x1bW4gbnVtYmVyIC0gMQorICAgICAgICAgICAgdmFyIGluZGVudGF0aW9uID0gbmV3IEFycmF5KHNwYWNlcyk7CisgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c3BhY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbltpXSA9ICcgJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBzID0gaW5kZW50YXRpb24uam9pbigiIik7CisgICAgICAgICAgICB0aGlzLmVtaXQobmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKHRoaXMuTEVBRElOR19XUyxzKSk7CisgICAgICAgIAl9CisgICAgICAgIAkvLyBraWxsIHRyYWlsaW5nIG5ld2xpbmUgaWYgcHJlc2VudCBhbmQgdGhlbiBpZ25vcmUKKyAgICAgICAgCSggKCdccicpPyAnXG4nIHtpZiAodGhpcy5zdGF0ZS50b2tlbiE9bnVsbCkgdGhpcy5zdGF0ZS50b2tlbi5zZXRDaGFubmVsKEhJRERFTik7IGVsc2UgJGNoYW5uZWw9SElEREVOO30pKgorICAgICAgICAgICAvLyB7dGhpcy50b2tlbi5zZXRDaGFubmVsKDk5KTsgfQorICAgICAgICApCisgICAgOworCisvKiogQ29tbWVudHMgbm90IG9uIGxpbmUgYnkgdGhlbXNlbHZlcyBhcmUgdHVybmVkIGludG8gbmV3bGluZXMuCisKKyAgICBiID0gYSAjIGVuZCBvZiBsaW5lIGNvbW1lbnQKKworICAgIG9yCisKKyAgICBhID0gWzEsICMgd2VpcmQKKyAgICAgICAgIDJdCisKKyAgICBUaGlzIHJ1bGUgaXMgaW52b2tlZCBkaXJlY3RseSBieSBuZXh0VG9rZW4gd2hlbiB0aGUgY29tbWVudCBpcyBpbgorICAgIGZpcnN0IGNvbHVtbiBvciB3aGVuIGNvbW1lbnQgaXMgb24gZW5kIG9mIG5vbndoaXRlc3BhY2UgbGluZS4KKworCU9ubHkgbWF0Y2ggXG4gaGVyZSBpZiB3ZSBkaWRuJ3Qgc3RhcnQgb24gbGVmdCBlZGdlOyBsZXQgTkVXTElORSByZXR1cm4gdGhhdC4KKwlLaWxsIGlmIG5ld2xpbmVzIGlmIHdlIGxpdmUgb24gYSBsaW5lIGJ5IG91cnNlbHZlcworCQorCUNvbnN1bWUgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBpZiBpdCBzdGFydHMgb24gbGVmdCBlZGdlLgorICovCitDT01NRU5UCitAaW5pdCB7CisgICAgJGNoYW5uZWw9SElEREVOOworfQorICAgIDoJe3RoaXMuc3RhcnRQb3M9PTB9Pz0+ICgnICd8J1x0JykqICcjJyAofidcbicpKiAnXG4nKworICAgIHwJe3RoaXMuc3RhcnRQb3M+MH0/PT4gJyMnICh+J1xuJykqIC8vIGxldCBORVdMSU5FIGhhbmRsZSBcbiB1bmxlc3MgY2hhciBwb3M9PTAgZm9yICcjJworICAgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC9hbGwuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC9hbGwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTQ2ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL2FsbC5odG1sCkBAIC0wLDAgKzEsMTIyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+VGVzdCBTdWl0ZXM8L3RpdGxlPgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gbGV4ZXJTdWl0ZSgpIHsKKyAgICAgICAgdmFyIGxleGVyX3N1aXRlID0gbmV3IHRvcC5qc1VuaXRUZXN0U3VpdGUoKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwMWxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwMmxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwM2xleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwNGxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwNWxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwNmxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwN2xleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwOGxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAwOWxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAxMGxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAxMWxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAxMmxleGVyWE1MLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAxOWxleGVyLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAyMGZ1enp5Lmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAyN2VvZi5odG1sIik7CisgICAgICAgIGxleGVyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMzhsZXhlclJ1bGVMYWJlbC5odG1sIik7CisgICAgICAgIGxleGVyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwNDBidWc4MC5odG1sIik7CisgICAgICAgIGxleGVyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwNDZyZXdyaXRlLmh0bWwiKTsKKyAgICAgICAgbGV4ZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDA0OHJld3JpdGUuaHRtbCIpOworICAgICAgICByZXR1cm4gbGV4ZXJfc3VpdGU7CisgICAgfQorCisgICAgZnVuY3Rpb24gcGFyc2VyU3VpdGUoKSB7CisgICAgICAgIHZhciBwYXJzZXJfc3VpdGUgPSBuZXcgdG9wLmpzVW5pdFRlc3RTdWl0ZSgpOworICAgICAgICBwYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAxM3BhcnNlci5odG1sIik7CisgICAgICAgIHBhcnNlcl9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDE0cGFyc2VyLmh0bWwiKTsKKyAgICAgICAgcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMTVjYWxjLmh0bWwiKTsKKyAgICAgICAgcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMTZhY3Rpb25zLmh0bWwiKTsKKyAgICAgICAgcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMTdwYXJzZXIuaHRtbCIpOworICAgICAgICBwYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAxOGxsc3Rhci5odG1sIik7CisgICAgICAgIHBhcnNlcl9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDI0ZmluYWxseS5odG1sIik7CisgICAgICAgIHBhcnNlcl9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDI2YWN0aW9ucy5odG1sIik7CisgICAgICAgIHBhcnNlcl9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDMyc3VicnVsZVByZWRpY3QuaHRtbCIpOworICAgICAgICBwYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAzM2JhY2t0cmFja2luZy5odG1sIik7CisgICAgICAgIHBhcnNlcl9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDQ1ZGZhYnVnLmh0bWwiKTsKKyAgICAgICAgcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMzR0b2tlbkxhYmVsUHJvcGVydHlSZWYuaHRtbCIpOworICAgICAgICBwYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmLmh0bWwiKTsKKyAgICAgICAgcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMzZtdWx0aXBsZVJldHVyblZhbHVlcy5odG1sIik7CisgICAgICAgIHBhcnNlcl9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDM3cnVsZVByb3BlcnR5UmVmLmh0bWwiKTsKKyAgICAgICAgcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMzlsYWJlbHMuaHRtbCIpOworICAgICAgICBwYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDA0MXBhcmFtZXRlcnMuaHRtbCIpOworICAgICAgICBwYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDA0NHRyYWNlLmh0bWwiKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlcl9zdWl0ZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0cmVlUGFyc2VyU3VpdGUoKSB7CisgICAgICAgIHZhciB0cmVlX3BhcnNlcl9zdWl0ZSA9IG5ldyB0b3AuanNVbml0VGVzdFN1aXRlKCk7CisgICAgICAgIHRyZWVfcGFyc2VyX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwNDd0cmVlcGFyc2VyLmh0bWwiKTsKKyAgICAgICAgdHJlZV9wYXJzZXJfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXIuaHRtbCIpOworICAgICAgICByZXR1cm4gdHJlZV9wYXJzZXJfc3VpdGU7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBzZW1wcmVkU3VpdGUoKSB7CisgICAgICAgIHZhciBzZW1wcmVkX3N1aXRlID0gbmV3IHRvcC5qc1VuaXRUZXN0U3VpdGUoKTsKKyAgICAgICAgc2VtcHJlZF9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDIxaG9pc3QuaHRtbCIpOworICAgICAgICBzZW1wcmVkX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwMzBzcGVjaWFsU3RhdGVzLmh0bWwiKTsKKyAgICAgICAgc2VtcHJlZF9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDMxZW1wdHlBbHQuaHRtbCIpOworICAgICAgICByZXR1cm4gc2VtcHJlZF9zdWl0ZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBzeW5wcmVkU3VpdGUoKSB7CisgICAgICAgIHZhciBzeW5wcmVkX3N1aXRlID0gbmV3IHRvcC5qc1VuaXRUZXN0U3VpdGUoKTsKKyAgICAgICAgc3lucHJlZF9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDI5c3lucHJlZGdhdGUuaHRtbCIpOworICAgICAgICBzeW5wcmVkX3N1aXRlLmFkZFRlc3RQYWdlKCIuLi9mdW5jdGlvbmFsL3QwNDNzeW5wcmVkLmh0bWwiKTsKKyAgICAgICAgcmV0dXJuIHN5bnByZWRfc3VpdGU7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBzY29wZVN1aXRlKCkgeworICAgICAgICB2YXIgc2NvcGVfc3VpdGUgPSBuZXcgdG9wLmpzVW5pdFRlc3RTdWl0ZSgpOworICAgICAgICBzY29wZV9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDIyc2NvcGVzLmh0bWwiKTsKKyAgICAgICAgc2NvcGVfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDAyM3Njb3Blcy5odG1sIik7CisgICAgICAgIHJldHVybiBzY29wZV9zdWl0ZTsKKyAgICB9CisKKyAgICAgZnVuY3Rpb24gYXN0U3VpdGUoKSB7CisgICAgICAgIHZhciBhc3Rfc3VpdGUgPSBuZXcgdG9wLmpzVW5pdFRlc3RTdWl0ZSgpOworICAgICAgICBhc3Rfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDA0MmFzdC5odG1sIik7CisgICAgICAgIHJldHVybiBhc3Rfc3VpdGU7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGhyZWVwb2ludDFTdWl0ZSgpIHsKKyAgICAgICAgdmFyIGFzdF9zdWl0ZSA9IG5ldyB0b3AuanNVbml0VGVzdFN1aXRlKCk7CisgICAgICAgIGFzdF9zdWl0ZS5hZGRUZXN0UGFnZSgiLi4vZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1QuaHRtbCIpOworICAgICAgICBhc3Rfc3VpdGUuYWRkVGVzdFBhZ2UoIi4uL2Z1bmN0aW9uYWwvdDA1MmltcG9ydC5odG1sIik7CisgICAgICAgIHJldHVybiBhc3Rfc3VpdGU7CisgICAgfQorCisgICAgZnVuY3Rpb24gc3VpdGUoKSB7CisgICAgICAgIHZhciBhbGwgPSBuZXcgdG9wLmpzVW5pdFRlc3RTdWl0ZSgpOworICAgICAgICBhbGwuYWRkVGVzdFN1aXRlKGxleGVyU3VpdGUoKSk7CisgICAgICAgIGFsbC5hZGRUZXN0U3VpdGUocGFyc2VyU3VpdGUoKSk7CisgICAgICAgIGFsbC5hZGRUZXN0U3VpdGUoc2VtcHJlZFN1aXRlKCkpOworICAgICAgICBhbGwuYWRkVGVzdFN1aXRlKHN5bnByZWRTdWl0ZSgpKTsKKyAgICAgICAgYWxsLmFkZFRlc3RTdWl0ZShzY29wZVN1aXRlKCkpOworICAgICAgICBhbGwuYWRkVGVzdFN1aXRlKGFzdFN1aXRlKCkpOworICAgICAgICBhbGwuYWRkVGVzdFN1aXRlKHRyZWVQYXJzZXJTdWl0ZSgpKTsKKyAgICAgICAgYWxsLmFkZFRlc3RTdWl0ZSh0aHJlZXBvaW50MVN1aXRlKCkpOworICAgICAgICByZXR1cm4gYWxsOworICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+VGVzdCBTdWl0ZXM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3JoaW5vLXB5dGhvbi5leHRlbnNpb25zIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3JoaW5vLXB5dGhvbi5leHRlbnNpb25zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlYTkxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvcmhpbm8tcHl0aG9uLmV4dGVuc2lvbnMKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNCBUZXJlbmNlIFBhcnIgYW5kIExvcmluZyBDcmF5bWVyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKworLyoqIFB5dGhvbiBkb2VzIG5vdCBleHBsaWNpdGx5IHByb3ZpZGUgYmVnaW4gYW5kIGVuZCBuZXN0aW5nIHNpZ25hbHMuCisgUmF0aGVyLCB0aGUgaW5kZW50YXRpb24gbGV2ZWwgaW5kaWNhdGVzIHdoZW4geW91IGJlZ2luIGFuZCBlbmQuCisgVGhpcyBpcyBhbiBpbnRlcmVzdGluZyBsZXhpY2FsIHByb2JsZW0gYmVjYXVzZSBtdWx0aXBsZSBERURFTlQKKyB0b2tlbnMgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHBhcnNlciBzb21ldGltZXMgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcKKyBpbnB1dCBzeW1ib2whICBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKyBhPTEKKyBpZiBhPjE6CisgICAgIHByaW50IGEKKyBiPTMKKworIEhlcmUgdGhlICJiIiB0b2tlbiBvbiB0aGUgbGVmdCBlZGdlIHNpZ25hbHMgdGhhdCBhIERFREVOVCBpcyBuZWVkZWQKKyBhZnRlciB0aGUgInByaW50IGEgXG4iIGFuZCBiZWZvcmUgdGhlICJiIi4gIFRoZSBzZXF1ZW5jZSBzaG91bGQgYmUKKworIC4uLiAxIENPTE9OIE5FV0xJTkUgSU5ERU5UIFBSSU5UIGEgTkVXTElORSBERURFTlQgYiBBU1NJR04gMyAuLi4KKworIEZvciBtb3JlIGV4YW1wbGVzLCBzZWUgdGhlIGJpZyBjb21tZW50IGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLgorCisgVGhpcyBUb2tlblN0cmVhbSBub3JtYWxseSBqdXN0IHBhc3NlcyB0b2tlbnMgdGhyb3VnaCB0byB0aGUgcGFyc2VyLgorIFVwb24gTkVXTElORSB0b2tlbiBmcm9tIHRoZSBsZXhlciwgaG93ZXZlciwgYW4gSU5ERU5UIG9yIERFREVOVCB0b2tlbgorIG1heSBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlIHBhcnNlci4gIFRoZSBORVdMSU5FIGlzIHRoZSB0cmlnZ2VyIGZvcgorIHRoaXMgY2xhc3MgdG8gZG8gaXQncyBqb2IuICBORVdMSU5FIGlzIHNhdmVkIGFuZCB0aGVuIHRoZSBmaXJzdCB0b2tlbgorIG9mIHRoZSBuZXh0IGxpbmUgaXMgZXhhbWluZWQuICBJZiBub24tbGVhZGluZy13aGl0ZXNwYWNlIHRva2VuLAorIHRoZW4gY2hlY2sgYWdhaW5zdCBzdGFjayBmb3IgaW5kZW50IHZzIGRlZGVudC4gIElmIExFQURJTkdfV1MsIHRoZW4KKyB0aGUgY29sdW1uIG9mIHRoZSBuZXh0IG5vbi13aGl0ZXNwYWNlIHRva2VuIHdpbGwgZGljdGF0ZSBpbmRlbnQgdnMKKyBkZWRlbnQuICBUaGUgY29sdW1uIG9mIHRoZSBuZXh0IHJlYWwgdG9rZW4gaXMgbnVtYmVyIG9mIHNwYWNlcworIGluIHRoZSBMRUFESU5HX1dTIHRva2VuICsgMSAodG8gbW92ZSBwYXN0IHRoZSB3aGl0ZXNwYWNlKS4gIFRoZQorIGxleGVyIGdyYW1tYXIgbXVzdCBzZXQgdGhlIHRleHQgb2YgdGhlIExFQURJTkdfV1MgdG9rZW4gdG8gYmUKKyB0aGUgcHJvcGVyIG51bWJlciBvZiBzcGFjZXMgKGFuZCBkbyB0YWIgY29udmVyc2lvbiBldGMuLi4pLgorCisgQSBzdGFjayBvZiBjb2x1bW4gbnVtYmVycyBpcyB0cmFja2VkIGFuZCB1c2VkIHRvIGRldGVjdCBjaGFuZ2VzCisgaW4gaW5kZW50IGxldmVsIGZyb20gb25lIHRva2VuIHRvIHRoZSBuZXh0LgorCisgQSBxdWV1ZSBvZiB0b2tlbnMgaXMgYnVpbHQgdXAgdG8gaG9sZCBtdWx0aXBsZSBERURFTlQgdG9rZW5zIHRoYXQKKyBhcmUgZ2VuZXJhdGVkLiAgQmVmb3JlIGFza2luZyB0aGUgbGV4ZXIgZm9yIGFub3RoZXIgdG9rZW4gdmlhCisgbmV4dFRva2VuKCksIHRoZSBxdWV1ZSBpcyBmbHVzaGVkIGZpcnN0IG9uZSB0b2tlbiBhdCBhIHRpbWUuCisKKyBUZXJlbmNlIFBhcnIgYW5kIExvcmluZyBDcmF5bWVyCisgRmVicnVhcnkgMjAwNAorICovCitQeXRob25Ub2tlblNvdXJjZSA9IGZ1bmN0aW9uKHN0cmVhbSkgeworICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOworCS8qKiBUaGUgc3RhY2sgb2YgaW5kZW50IGxldmVscyAoY29sdW1uIG51bWJlcnMpICovCisJdGhpcy5pbmRlbnRTdGFjayA9IG5ldyBBcnJheShQeXRob25Ub2tlblNvdXJjZS5NQVhfSU5ERU5UUyk7CisJLyoqIHN0YWNrIHBvaW50ZXIgKi8KKwl0aGlzLnNwPS0xOyAvLyBncm93IHVwd2FyZHMKKworCS8qKiBUaGUgcXVldWUgb2YgdG9rZW5zICovCisJdGhpcy50b2tlbnMgPSBbXTsKKwl0aGlzLmxhc3RUb2tlbkFkZGVkSW5kZXggPSAtMTsKKwl0aGlzLnB1c2goUHl0aG9uVG9rZW5Tb3VyY2UuRklSU1RfQ0hBUl9QT1NJVElPTik7Cit9OworCitBTlRMUi5sYW5nLmF1Z21lbnRPYmplY3QoUHl0aG9uVG9rZW5Tb3VyY2UsIHsKKwlNQVhfSU5ERU5UUzogMTAwLAorCUZJUlNUX0NIQVJfUE9TSVRJT046IDAsCit9KTsKKworUHl0aG9uVG9rZW5Tb3VyY2UucHJvdG90eXBlID0geworCWdldFNvdXJjZU5hbWU6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5zdHJlYW0uZ2V0U291cmNlTmFtZSgpOworCX0sCisKKwkvKiogRnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuMi4zL3JlZi9pbmRlbnRhdGlvbi5odG1sCisKKwkgIkJlZm9yZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZmlsZSBpcyByZWFkLCBhIHNpbmdsZSB6ZXJvIGlzCisJIHB1c2hlZCBvbiB0aGUgc3RhY2s7IHRoaXMgd2lsbCBuZXZlciBiZSBwb3BwZWQgb2ZmIGFnYWluLiBUaGUKKwkgbnVtYmVycyBwdXNoZWQgb24gdGhlIHN0YWNrIHdpbGwgYWx3YXlzIGJlIHN0cmljdGx5IGluY3JlYXNpbmcKKwkgZnJvbSBib3R0b20gdG8gdG9wLiBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbG9naWNhbCBsaW5lLCB0aGUKKwkgbGluZSdzIGluZGVudGF0aW9uIGxldmVsIGlzIGNvbXBhcmVkIHRvIHRoZSB0b3Agb2YgdGhlCisJIHN0YWNrLiBJZiBpdCBpcyBlcXVhbCwgbm90aGluZyBoYXBwZW5zLiBJZiBpdCBpcyBsYXJnZXIsIGl0IGlzCisJIHB1c2hlZCBvbiB0aGUgc3RhY2ssIGFuZCBvbmUgSU5ERU5UIHRva2VuIGlzIGdlbmVyYXRlZC4gSWYgaXQKKwkgaXMgc21hbGxlciwgaXQgbXVzdCBiZSBvbmUgb2YgdGhlIG51bWJlcnMgb2NjdXJyaW5nIG9uIHRoZQorCSBzdGFjazsgYWxsIG51bWJlcnMgb24gdGhlIHN0YWNrIHRoYXQgYXJlIGxhcmdlciBhcmUgcG9wcGVkCisJIG9mZiwgYW5kIGZvciBlYWNoIG51bWJlciBwb3BwZWQgb2ZmIGEgREVERU5UIHRva2VuIGlzCisJIGdlbmVyYXRlZC4gQXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgYSBERURFTlQgdG9rZW4gaXMgZ2VuZXJhdGVkCisJIGZvciBlYWNoIG51bWJlciByZW1haW5pbmcgb24gdGhlIHN0YWNrIHRoYXQgaXMgbGFyZ2VyIHRoYW4KKwkgemVyby4iCisKKwkgSSB1c2UgY2hhciBwb3NpdGlvbiBpbiBsaW5lIDAuLm4tMSBpbnN0ZWFkLgorCisJIFRoZSBERURFTlRTIHBvc3NpYmx5IG5lZWRlZCBhdCBFT0YgYXJlIGdyYWNlZnVsbHkgaGFuZGxlZCBieSBmb3JjaW5nCisJIEVPRiB0byBoYXZlIGNoYXIgcG9zIDAgZXZlbiB0aG91Z2ggd2l0aCBVTklYIGl0J3MgaGFyZCB0byBnZXQgRU9GCisJIGF0IGEgbm9uIGxlZnQgZWRnZS4KKwkgKi8KKwluZXh0VG9rZW46IGZ1bmN0aW9uKCkgeworCQkvLyBpZiBzb21ldGhpbmcgaW4gcXVldWUsIGp1c3QgcmVtb3ZlIGFuZCByZXR1cm4gaXQKKwkJaWYgKHRoaXMudG9rZW5zLmxlbmd0aD4wICkgeworCQkJdmFyIHQgPSB0aGlzLnRva2Vuc1swXTsKKwkJCXRoaXMudG9rZW5zLnNwbGljZSgwLDEpOworCQkJcmV0dXJuIHQ7CisJCX0KKworCQl0aGlzLmluc2VydEltYWdpbmFyeUluZGVudERlZGVudFRva2VucygpOworCisJCXJldHVybiB0aGlzLm5leHRUb2tlbigpOworCX0sCisKKwlpbnNlcnRJbWFnaW5hcnlJbmRlbnREZWRlbnRUb2tlbnM6IGZ1bmN0aW9uKCkKKwl7CisJCXZhciB0ID0gdGhpcy5zdHJlYW0uTFQoMSk7CisJCXRoaXMuc3RyZWFtLmNvbnN1bWUoKTsKKworCQkvLyBpZiBub3QgYSBORVdMSU5FLCBkb2Vzbid0IHNpZ25hbCBpbmRlbnQvZGVkZW50IHdvcms7IGp1c3QgZW5xdWV1ZQorCQlpZiAoIHQuZ2V0VHlwZSgpIT1QeXRob25MZXhlci5ORVdMSU5FICkgeworCQkJdmFyIGhpZGRlblRva2VucyA9IHRoaXMuc3RyZWFtLmdldFRva2Vucyh0aGlzLmxhc3RUb2tlbkFkZGVkSW5kZXgrMSx0LmdldFRva2VuSW5kZXgoKS0xKTsKKwkJCWlmICggaGlkZGVuVG9rZW5zIT1udWxsICkgeworCQkJCXRoaXMudG9rZW5zID0gdGhpcy50b2tlbnMuY29uY2F0KGhpZGRlblRva2Vucyk7CisJCQl9CisJCQl0aGlzLmxhc3RUb2tlbkFkZGVkSW5kZXggPSB0LmdldFRva2VuSW5kZXgoKTsKKwkJCXRoaXMudG9rZW5zLnB1c2godCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBzYXZlIE5FV0xJTkUgaW4gdGhlIHF1ZXVlCisJCXZhciBoaWRkZW5Ub2tlbnMgPSB0aGlzLnN0cmVhbS5nZXRUb2tlbnModGhpcy5sYXN0VG9rZW5BZGRlZEluZGV4KzEsdC5nZXRUb2tlbkluZGV4KCktMSk7CisJCWlmICggaGlkZGVuVG9rZW5zIT1udWxsICkgeworCQkJdGhpcy50b2tlbnMgPSB0aGlzLnRva2Vucy5jb25jYXQoaGlkZGVuVG9rZW5zKTsKKwkJfQorCQl0aGlzLmxhc3RUb2tlbkFkZGVkSW5kZXggPSB0LmdldFRva2VuSW5kZXgoKTsKKwkJdGhpcy50b2tlbnMucHVzaCh0KTsKKworCQkvLyBncmFiIGZpcnN0IHRva2VuIG9mIG5leHQgbGluZQorCQl0ID0gdGhpcy5zdHJlYW0uTFQoMSk7CisJCXRoaXMuc3RyZWFtLmNvbnN1bWUoKTsKKworCQloaWRkZW5Ub2tlbnMgPSB0aGlzLnN0cmVhbS5nZXRUb2tlbnModGhpcy5sYXN0VG9rZW5BZGRlZEluZGV4KzEsdC5nZXRUb2tlbkluZGV4KCktMSk7CisJCWlmICggaGlkZGVuVG9rZW5zIT1udWxsICkgeworCQkJdGhpcy50b2tlbnMgPSB0aGlzLnRva2Vucy5jb25jYXQoaGlkZGVuVG9rZW5zKTsKKwkJfQorCQl0aGlzLmxhc3RUb2tlbkFkZGVkSW5kZXggPSB0LmdldFRva2VuSW5kZXgoKTsKKworCQkvLyBjb21wdXRlIGNwb3MgYXMgdGhlIGNoYXIgcG9zIG9mIG5leHQgbm9uLVdTIHRva2VuIGluIGxpbmUKKwkJdmFyIGNwb3MgPSB0LmdldENoYXJQb3NpdGlvbkluTGluZSgpOyAvLyBjb2x1bW4gZGljdGF0ZXMgaW5kZW50L2RlZGVudAorCQlpZiAoIHQuZ2V0VHlwZSgpPT1BTlRMUi5ydW50aW1lLlRva2VuLkVPRiApIHsKKwkJCWNwb3MgPSAtMTsgLy8gcHJldGVuZCBFT0YgYWx3YXlzIGhhcHBlbnMgYXQgbGVmdCBlZGdlCisJCX0KKwkJZWxzZSBpZiAoIHQuZ2V0VHlwZSgpPT1QeXRob25MZXhlci5MRUFESU5HX1dTICkgeworCQkJY3BvcyA9IHQuZ2V0VGV4dCgpLmxlbmd0aDsKKwkJfQorCisJCS8vIGNvbXBhcmUgdG8gbGFzdCBpbmRlbnQgbGV2ZWwKKwkJdmFyIGxhc3RJbmRlbnQgPSB0aGlzLnBlZWsoKTsKKwkJaWYgKCBjcG9zID4gbGFzdEluZGVudCApIHsgLy8gdGhleSBpbmRlbnRlZDsgdHJhY2sgYW5kIGdlbiBJTkRFTlQKKwkJCXRoaXMucHVzaChjcG9zKTsKKwkJCXZhciBpbmRlbnQgPSBuZXcgQU5UTFIucnVudGltZS5Db21tb25Ub2tlbihQeXRob25QYXJzZXIuSU5ERU5ULCAiIik7CisJCQlpbmRlbnQuc2V0Q2hhclBvc2l0aW9uSW5MaW5lKHQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkpOworCQkJaW5kZW50LnNldExpbmUodC5nZXRMaW5lKCkpOworCQkJdGhpcy50b2tlbnMucHVzaChpbmRlbnQpOworCQl9CisJCWVsc2UgaWYgKCBjcG9zIDwgbGFzdEluZGVudCApIHsgLy8gdGhleSBkZWRlbnRlZAorCQkJLy8gaG93IGZhciBiYWNrIGRpZCB3ZSBkZWRlbnQ/CisJCQl2YXIgcHJldkluZGV4ID0gdGhpcy5maW5kUHJldmlvdXNJbmRlbnQoY3Bvcyk7CisJCQkvLyBnZW5lcmF0ZSBERURFTlRzIGZvciBlYWNoIGluZGVudCBsZXZlbCB3ZSBiYWNrZWQgdXAgb3ZlcgorCQkJZm9yICh2YXIgZD10aGlzLnNwLTE7IGQ+PXByZXZJbmRleDsgZC0tKSB7CisJCQkJdmFyIGRlZGVudCA9IG5ldyBBTlRMUi5ydW50aW1lLkNvbW1vblRva2VuKFB5dGhvblBhcnNlci5ERURFTlQsICIiKTsKKwkJCQlkZWRlbnQuc2V0Q2hhclBvc2l0aW9uSW5MaW5lKHQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkpOworCQkJCWRlZGVudC5zZXRMaW5lKHQuZ2V0TGluZSgpKTsKKwkJCQl0aGlzLnRva2Vucy5wdXNoKGRlZGVudCk7CisJCQl9CisJCQl0aGlzLnNwID0gcHJldkluZGV4OyAvLyBwb3AgdGhvc2Ugb2ZmIGluZGVudCBsZXZlbAorCQl9CisJCWlmICggdC5nZXRUeXBlKCkhPVB5dGhvbkxleGVyLkxFQURJTkdfV1MgKSB7IC8vIGRpc2NhcmQgV1MKKwkJCXRoaXMudG9rZW5zLnB1c2godCk7CisJCX0KKwl9LAorCisJLy8gIFQgTyBLIEUgTiAgUyBUIEEgQyBLICBNIEUgVCBIIE8gRCBTCisKKwlwdXNoOiBmdW5jdGlvbihpKSB7CisJCWlmICh0aGlzLnNwPj1QeXRob25Ub2tlblNvdXJjZS5NQVhfSU5ERU5UUykgeworCQkJdGhyb3cgbmV3IEVycm9yKCJzdGFjayBvdmVyZmxvdyIpOworCQl9CisJCXRoaXMuc3ArKzsKKwkJdGhpcy5pbmRlbnRTdGFja1t0aGlzLnNwXSA9IGk7CisJfSwKKworCXBvcDogZnVuY3Rpb24oKSB7CisJCWlmICh0aGlzLnNwPDApIHsKKwkJCXRocm93IG5ldyBFcnJvcigic3RhY2sgdW5kZXJmbG93Iik7CisJCX0KKwkJdmFyIHRvcCA9IHRoaXMuaW5kZW50U3RhY2tbdGhpcy5zcF07CisJCXRoaXMuc3AtLTsKKwkJcmV0dXJuIHRvcDsKKwl9LAorCisJcGVlazogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlzLmluZGVudFN0YWNrW3RoaXMuc3BdOworCX0sCisKKwkvKiogUmV0dXJuIHRoZSBpbmRleCBvbiBzdGFjayBvZiBwcmV2aW91cyBpbmRlbnQgbGV2ZWwgPT0gaSBlbHNlIC0xICovCisJZmluZFByZXZpb3VzSW5kZW50OiBmdW5jdGlvbihpKSB7CisJCWZvciAodmFyIGo9dGhpcy5zcC0xOyBqPj0wOyBqLS0pIHsKKwkJCWlmICh0aGlzLmluZGVudFN0YWNrW2pdPT1pICkgeworCQkJCXJldHVybiBqOworCQkJfQorCQl9CisJCXJldHVybiBQeXRob25Ub2tlblNvdXJjZS5GSVJTVF9DSEFSX1BPU0lUSU9OOworCX0sCisKKwlzdGFja1N0cmluZzogZnVuY3Rpb24oKSB7CisJCXZhciBidWYgPSBbXTsKKwkJZm9yICh2YXIgaj10aGlzLnNwOyBqPj0wOyBqLS0pIHsKKwkJCWJ1Zi5wdXNoKHRoaXMuaW5kZW50U3RhY2tbal0pOworCQl9CisJCXJldHVybiBidWYuam9pbigiICIpOworCX0KKworfQorCisvKiBNb3JlIGV4YW1wbGUgaW5wdXQgLyBvdXRwdXQgcGFpcnMgd2l0aCBjb2RlIHNpbXBsaWZpZWQgdG8gc2luZ2xlIGNoYXJzCistLS0tLS0tIHQxIC0tLS0tLS0KK2EgYQorICAgICAgICBiIGIKKyAgICAgICAgYworZAorYSBhIFxuIElOREVOVCBiIGIgXG4gYyBcbiBERURFTlQgZCBcbiBFT0YKKy0tLS0tLS0gdDIgLS0tLS0tLQorYSAgYworIGIKK2MKK2EgYyBcbiBJTkRFTlQgYiBcbiBERURFTlQgYyBcbiBFT0YgCistLS0tLS0tIHQzIC0tLS0tLS0KK2EKKyAgICAgICAgYgorICAgICAgICAgICAgICAgIGMKK2QKK2EgXG4gSU5ERU5UIGIgXG4gSU5ERU5UIGMgXG4gREVERU5UIERFREVOVCBkIFxuIEVPRiAKKy0tLS0tLS0gdDQgLS0tLS0tLQorYQorICAgIGMKKyAgICAgICAgICAgICAgICAgIGQKKyAgICBlCisgICAgZgorICAgICAgICAgICAgIGcKKyAgICAgICAgICAgICBoCisgICAgICAgICAgICAgaQorICAgICAgICAgICAgICBqCisgICAgaworYSBcbiBJTkRFTlQgYyBcbiBJTkRFTlQgZCBcbiBERURFTlQgZSBcbiBmIFxuIElOREVOVCBnIFxuIGggXG4gaSBcbiBJTkRFTlQgaiBcbiBERURFTlQgREVERU5UIGsgXG4gREVERU5UIEVPRiAKKy0tLS0tLS0gdDUgLS0tLS0tLQorYQorICAgICAgICBiCisgICAgICAgIGMKKyAgICAgICAgICAgICAgICBkCisgICAgICAgICAgICAgICAgZQorYSBcbiBJTkRFTlQgYiBcbiBjIFxuIElOREVOVCBkIFxuIGUgXG4gREVERU5UIERFREVOVCBFT0YgCisqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3JoaW5vLXB5dGhvbi5pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC9yaGluby1weXRob24uaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGVkM2YyZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC9yaGluby1weXRob24uaW5wdXQKQEAgLTAsMCArMSwyMTAgQEAKKyIiIlRoaXMgaXMgYSBzdWJzdGFudGlhbGx5IGltcHJvdmVkIHZlcnNpb24gb2YgdGhlIG9sZGVyIEludGVycHJldGVyLnB5IGRlbW8KK0l0IGNyZWF0ZXMgYSBzaW1wbGUgR1VJIEpQeXRob24gY29uc29sZSB3aW5kb3cgd2l0aCBzaW1wbGUgaGlzdG9yeQorYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byBpbnRlcnVwdCBydW5uaW5nIGNvZGUgKHdpdGggdGhlIEVTQyBrZXkpLgorCitMaWtlIEludGVycHJldGVyLnB5LCB0aGlzIGlzIHN0aWxsIGp1c3QgYSBkZW1vLCBhbmQgbmVlZHMgc3Vic3RhbnRpYWwKK3dvcmsgYmVmb3JlIHNlcmlvdXMgdXNlLgorCitUaGFua3MgdG8gR2V6YSBHcm9tYSAoZ3JvbWFAZXZlcnguc3piay51LXN6ZWdlZC5odSkgZm9yIHNldmVyYWwgdmFsdWFibGUKK2lkZWFzIGZvciB0aGlzIHRvb2wgLS0gaGlzIEpQQ29uc29sZSBpcyBhIG1vcmUgcmVmaW5lZCBpbXBsZW1lbnRhdGlvbgorb2Ygc2ltaWxhciBpZGVhcy4KKyIiIgorCitmcm9tIFN0eWxlcyBpbXBvcnQgU3R5bGVzCitmcm9tIEtleW1hcCBpbXBvcnQgS2V5bWFwCisKK2Zyb20gcGF3dCBpbXBvcnQgc3dpbmcsIGNvbG9ycworZnJvbSBqYXZhLmF3dC5ldmVudC5LZXlFdmVudCBpbXBvcnQgVktfVVAsIFZLX0RPV04KK2Zyb20gamF2YS5hd3QuZXZlbnQgaW1wb3J0IEFjdGlvbkV2ZW50Citmcm9tIGphdmEubGFuZyBpbXBvcnQgVGhyZWFkLCBTeXN0ZW0KK2Zyb20gY29kZSBpbXBvcnQgY29tcGlsZV9jb21tYW5kCitpbXBvcnQgc3RyaW5nLCBzeXMsIHJlCisKK2NsYXNzIE91dHB1dEJ1ZmZlcjoKKwlkZWYgX19pbml0X18oc2VsZiwgY29uc29sZSwgc3R5bGVuYW1lKToKKwkJc2VsZi5jb25zb2xlID0gY29uc29sZQorCQlzZWxmLnN0eWxlbmFtZSA9IHN0eWxlbmFtZQorCQkKKwlkZWYgZmx1c2goc2VsZik6CisJCXBhc3MKKwkJCisJZGVmIHdyaXRlKHNlbGYsIHRleHQpOgorCQlzZWxmLmNvbnNvbGUud3JpdGUodGV4dCwgc2VsZi5zdHlsZW5hbWUpCisKK2NsYXNzIENvbnNvbGU6CisJZGVmIF9faW5pdF9fKHNlbGYsIHN0eWxlcz1Ob25lLCBrZXltYXA9Tm9uZSk6CisJCWlmIHN0eWxlcyBpcyBOb25lOgorCQkJc3R5bGVzID0gU3R5bGVzKCkKKwkJCWJhc2ljID0gc3R5bGVzLmFkZCgnbm9ybWFsJywgdGFic2l6ZT0zLCBmb250U2l6ZT0xMiwgZm9udEZhbWlseT0iQ291cmllciIpCisJCQlzdHlsZXMuYWRkKCdlcnJvcicsIHBhcmVudD1iYXNpYywgZm9yZWdyb3VuZD1jb2xvcnMucmVkKQorCQkJc3R5bGVzLmFkZCgnb3V0cHV0JywgcGFyZW50PWJhc2ljLCBmb3JlZ3JvdW5kPWNvbG9ycy5ibHVlKQorCQkJc3R5bGVzLmFkZCgnaW5wdXQnLCBwYXJlbnQ9YmFzaWMsIGZvcmVncm91bmQ9Y29sb3JzLmJsYWNrKQorCQkJc3R5bGVzLmFkZCgncHJvbXB0JywgcGFyZW50PWJhc2ljLCBmb3JlZ3JvdW5kPWNvbG9ycy5wdXJwbGUpCisJCXNlbGYuc3R5bGVzID0gc3R5bGVzCisJCQorCQkjIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhdCBhbiBpbm5lciBjbGFzcworCQkjIFRoaXMgd2lsbCBub3QgYmUgcmVxdWlyZWQgaW4gSlB5dGhvbi0xLjEKKwkJRm9yZWdyb3VuZEFjdGlvbiA9IGdldGF0dHIoc3dpbmcudGV4dCwgJ1N0eWxlZEVkaXRvcktpdCRGb3JlZ3JvdW5kQWN0aW9uJykKKwkJc2VsZi5pbnB1dEFjdGlvbiA9IEZvcmVncm91bmRBY3Rpb24oInN0YXJ0IGlucHV0IiwgY29sb3JzLmJsYWNrKQorCisJCWlmIGtleW1hcCBpcyBOb25lOgorCQkJa2V5bWFwID0gS2V5bWFwKCkKKwkJa2V5bWFwLmJpbmQoJ2VudGVyJywgc2VsZi5lbnRlcikKKwkJa2V5bWFwLmJpbmQoJ3RhYicsIHNlbGYudGFiKQorCQlrZXltYXAuYmluZCgnZXNjYXBlJywgc2VsZi5lc2NhcGUpCisJCWtleW1hcC5iaW5kKCd1cCcsIHNlbGYudXBoaXN0b3J5KQorCQlrZXltYXAuYmluZCgnZG93bicsIHNlbGYuZG93bmhpc3RvcnkpCisJCQorCQlzZWxmLmtleW1hcCA9IGtleW1hcAorCQkKKwkJc2VsZi5kb2N1bWVudCA9IHN3aW5nLnRleHQuRGVmYXVsdFN0eWxlZERvY3VtZW50KHNlbGYuc3R5bGVzKQorCQlzZWxmLmRvY3VtZW50LnNldExvZ2ljYWxTdHlsZSgwLCBzZWxmLnN0eWxlcy5nZXQoJ25vcm1hbCcpKQorCisJCXNlbGYudGV4dHBhbmUgPSBzd2luZy5KVGV4dFBhbmUoc2VsZi5kb2N1bWVudCkKKwkJc2VsZi50ZXh0cGFuZS5rZXltYXAgPSBzZWxmLmtleW1hcAorCQkKKwkJc2VsZi5oaXN0b3J5ID0gW10KKwkJc2VsZi5vbGRIaXN0b3J5TGVuZ3RoID0gMAorCQlzZWxmLmhpc3RvcnlQb3NpdGlvbiA9IDAKKwkJCisJCXNlbGYuY29tbWFuZCA9IFtdCisJCXNlbGYubG9jYWxzID0ge30KKworCWRlZiB3cml0ZShzZWxmLCB0ZXh0LCBzdHlsZW5hbWU9J25vcm1hbCcpOgorCQlzdHlsZSA9IHNlbGYuc3R5bGVzLmdldChzdHlsZW5hbWUpCisJCXNlbGYuZG9jdW1lbnQuaW5zZXJ0U3RyaW5nKHNlbGYuZG9jdW1lbnQubGVuZ3RoLCB0ZXh0LCBzdHlsZSkKKwkJCisJZGVmIGJlZXAoc2VsZik6CisJCXNlbGYudGV4dHBhbmUudG9vbGtpdC5iZWVwKCkKKworCWRlZiBzdGFydFVzZXJJbnB1dChzZWxmLCBwcm9tcHQ9Tm9uZSk6CisJCWlmIHByb21wdCBpcyBub3QgTm9uZToKKwkJCXNlbGYud3JpdGUocHJvbXB0LCAncHJvbXB0JykKKwkJc2VsZi5zdGFydElucHV0ID0gc2VsZi5kb2N1bWVudC5jcmVhdGVQb3NpdGlvbihzZWxmLmRvY3VtZW50Lmxlbmd0aC0xKQorCQkjc2VsZi5kb2N1bWVudC5zZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKHNlbGYuZG9jdW1lbnQubGVuZ3RoLTEsIDEsIHNlbGYuc3R5bGVzLmdldCgnaW5wdXQnKSwgMSkKKwkJc2VsZi50ZXh0cGFuZS5jYXJldFBvc2l0aW9uID0gc2VsZi5kb2N1bWVudC5sZW5ndGgKKwkJYWUgPSBBY3Rpb25FdmVudChzZWxmLnRleHRwYW5lLCBBY3Rpb25FdmVudC5BQ1RJT05fUEVSRk9STUVELCAnc3RhcnQgaW5wdXQnKQorCQlzZWxmLmlucHV0QWN0aW9uLmFjdGlvblBlcmZvcm1lZChhZSkKKworCWRlZiBnZXRpbnB1dChzZWxmKToKKwkJb2Zmc2V0ID0gc2VsZi5zdGFydElucHV0Lm9mZnNldAorCQlsaW5lID0gc2VsZi5kb2N1bWVudC5nZXRUZXh0KG9mZnNldCsxLCBzZWxmLmRvY3VtZW50Lmxlbmd0aC1vZmZzZXQpCisJCXJldHVybiBzdHJpbmcucnN0cmlwKGxpbmUpCisKKwlkZWYgcmVwbGFjZWlucHV0KHNlbGYsIHRleHQpOgorCQlvZmZzZXQgPSBzZWxmLnN0YXJ0SW5wdXQub2Zmc2V0ICsgMQorCQlzZWxmLmRvY3VtZW50LnJlbW92ZShvZmZzZXQsIHNlbGYuZG9jdW1lbnQubGVuZ3RoLW9mZnNldCkKKwkJc2VsZi53cml0ZSh0ZXh0LCAnaW5wdXQnKQorCQkKKwlkZWYgZW50ZXIoc2VsZik6CisJCWxpbmUgPSBzZWxmLmdldGlucHV0KCkKKwkJc2VsZi53cml0ZSgnXG4nLCAnaW5wdXQnKQorCQkKKwkJc2VsZi5oaXN0b3J5LmFwcGVuZChsaW5lKQorCQlzZWxmLmhhbmRsZUxpbmUobGluZSkKKwkJCisJZGVmIGdldGhpc3Rvcnkoc2VsZiwgZGlyZWN0aW9uKToKKwkJaGlzdG9yeUxlbmd0aCA9IGxlbihzZWxmLmhpc3RvcnkpCisJCWlmIHNlbGYub2xkSGlzdG9yeUxlbmd0aCA8IGhpc3RvcnlMZW5ndGg6CisJCQkjIG5ldyBsaW5lIHdhcyBlbnRlcmVkIGFmdGVyIGxhc3QgY2FsbAorCQkJc2VsZi5vbGRIaXN0b3J5TGVuZ3RoID0gaGlzdG9yeUxlbmd0aAorCQkJaWYgc2VsZi5oaXN0b3J5W3NlbGYuaGlzdG9yeVBvc2l0aW9uXSAhPSBzZWxmLmhpc3RvcnlbLTFdOgorCQkJCXNlbGYuaGlzdG9yeVBvc2l0aW9uID0gaGlzdG9yeUxlbmd0aAorCisJCXBvcyA9IHNlbGYuaGlzdG9yeVBvc2l0aW9uICsgZGlyZWN0aW9uCisKKwkJaWYgMCA8PSBwb3MgPCBoaXN0b3J5TGVuZ3RoOgorCQkJc2VsZi5oaXN0b3J5UG9zaXRpb24gPSBwb3MKKwkJCXNlbGYucmVwbGFjZWlucHV0KHNlbGYuaGlzdG9yeVtwb3NdKQorCQllbHNlOgorCQkJc2VsZi5iZWVwKCkKKworCWRlZiB1cGhpc3Rvcnkoc2VsZik6CisJCXNlbGYuZ2V0aGlzdG9yeSgtMSkKKworCWRlZiBkb3duaGlzdG9yeShzZWxmKToKKwkJc2VsZi5nZXRoaXN0b3J5KDEpCisKKwlkZWYgdGFiKHNlbGYpOgorCQlzZWxmLndyaXRlKCdcdCcsICdpbnB1dCcpCisJCQorCWRlZiBlc2NhcGUoc2VsZik6CisJCWlmIChub3QgaGFzYXR0cihzZWxmLCAncHl0aG9uVGhyZWFkJykgb3Igc2VsZi5weXRob25UaHJlYWQgaXMgTm9uZSBvciBub3Qgc2VsZi5weXRob25UaHJlYWQuYWxpdmUpOgorCQkJc2VsZi5iZWVwKCkKKwkJCXJldHVybgorCQkJCisJCXNlbGYucHl0aG9uVGhyZWFkLnN0b3BQeXRob24oKQorCisJZGVmIGNhcHR1cmVQeXRob25PdXRwdXQoc2VsZiwgc3Rkb3V0U3R5bGU9J291dHB1dCcsIHN0ZGVyclN0eWxlPSdlcnJvcicpOgorCQlpbXBvcnQgc3lzCisJCXN5cy5zdGRvdXQgPSBPdXRwdXRCdWZmZXIoc2VsZiwgc3Rkb3V0U3R5bGUpCisJCXN5cy5zdGRlcnIgPSBPdXRwdXRCdWZmZXIoc2VsZiwgc3RkZXJyU3R5bGUpCisKKwlkZWYgaGFuZGxlTGluZShzZWxmLCB0ZXh0KToKKwkJc2VsZi5jb21tYW5kLmFwcGVuZCh0ZXh0KQorCQkKKwkJdHJ5OgorCQkJY29kZSA9IGNvbXBpbGVfY29tbWFuZChzdHJpbmcuam9pbihzZWxmLmNvbW1hbmQsICdcbicpKQorCQlleGNlcHQgU3ludGF4RXJyb3I6CisJCQl0cmFjZWJhY2sucHJpbnRfZXhjKDApCisJCQlzZWxmLmNvbW1hbmQgPSBbXQorCQkJc2VsZi5zdGFydFVzZXJJbnB1dChzdHIoc3lzLnBzMSkrJ1x0JykKKwkJCXJldHVybgorCisJCWlmIGNvZGUgaXMgTm9uZToKKwkJCXNlbGYuc3RhcnRVc2VySW5wdXQoc3RyKHN5cy5wczIpKydcdCcpCisJCQlyZXR1cm4KKwkJCisJCXNlbGYuY29tbWFuZCA9IFtdCisJCQorCQlwdCA9IFB5dGhvblRocmVhZChjb2RlLCBzZWxmKQorCQlzZWxmLnB5dGhvblRocmVhZCA9IHB0CisJCXB0LnN0YXJ0KCkKKwkJCisJZGVmIG5ld0lucHV0KHNlbGYpOgorCQlzZWxmLnN0YXJ0VXNlcklucHV0KHN0cihzeXMucHMxKSsnXHQnKQorCQkKK2ltcG9ydCB0cmFjZWJhY2sKKworY2xhc3MgUHl0aG9uVGhyZWFkKFRocmVhZCk6CisJZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUsIGNvbnNvbGUpOgorCQlzZWxmLmNvZGUgPSBjb2RlCisJCXNlbGYuY29uc29sZSA9IGNvbnNvbGUKKwkJc2VsZi5sb2NhbHMgPSBjb25zb2xlLmxvY2FscworCQkKKwlkZWYgcnVuKHNlbGYpOgorCQl0cnk6CisJCQlleGVjIHNlbGYuY29kZSBpbiBzZWxmLmxvY2FscworCQkJCisJCSNJbmNsdWRlIHRoZXNlIGxpbmVzIHRvIGFjdHVhbGx5IGV4aXQgb24gYSBzeXMuZXhpdCgpIGNhbGwKKwkJI2V4Y2VwdCBTeXN0ZW1FeGl0LCB2YWx1ZToKKwkJIwlyYWlzZSBTeXN0ZW1FeGl0LCB2YWx1ZQorCQkKKwkJZXhjZXB0OgorCQkJZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCisJCQlsID0gbGVuKHRyYWNlYmFjay5leHRyYWN0X3RiKHN5cy5leGNfdHJhY2ViYWNrKSkKKwkJCXRyeToKKwkJCQkxLzAKKwkJCWV4Y2VwdDoKKwkJCQltID0gbGVuKHRyYWNlYmFjay5leHRyYWN0X3RiKHN5cy5leGNfdHJhY2ViYWNrKSkKKwkJCXRyYWNlYmFjay5wcmludF9leGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaywgbC1tKQorCQkJCisJCXNlbGYuY29uc29sZS5uZXdJbnB1dCgpCisKKwlkZWYgc3RvcFB5dGhvbihzZWxmKToKKwkJI1Nob3VsZCBzcGVuZCAyIHNlY29uZHMgdHJ5aW5nIHRvIGtpbGwgdGhyZWFkIGluIG5pY2UgUHl0aG9uIHN0eWxlIGZpcnN0Li4uCisJCXNlbGYuc3RvcCgpCisKK2hlYWRlciA9ICIiIlwKK0pQeXRob24gJSh2ZXJzaW9uKXMgb24gJShwbGF0Zm9ybSlzCislKGNvcHlyaWdodClzCisiIiIgJSB7J3ZlcnNpb24nOnN5cy52ZXJzaW9uLCAncGxhdGZvcm0nOnN5cy5wbGF0Zm9ybSwgJ2NvcHlyaWdodCc6c3lzLmNvcHlyaWdodH0KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwljID0gQ29uc29sZSgpCisJcGFuZSA9IHN3aW5nLkpTY3JvbGxQYW5lKGMudGV4dHBhbmUpCisJc3dpbmcudGVzdChwYW5lLCBzaXplPSg1MDAsNDAwKSwgbmFtZT0nSlB5dGhvbiBDb25zb2xlJykKKwljLndyaXRlKGhlYWRlciwgJ291dHB1dCcpCisJYy5jYXB0dXJlUHl0aG9uT3V0cHV0KCkKKwljLnRleHRwYW5lLnJlcXVlc3RGb2N1cygpCisJYy5uZXdJbnB1dCgpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvcmhpbm8tcHl0aG9uLm91dHB1dCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC9yaGluby1weXRob24ub3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwMmIzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvcmhpbm8tcHl0aG9uLm91dHB1dApAQCAtMCwwICsxLDI0IEBACitmb3VuZCBtZXRob2QgZGVmIF9faW5pdF9fCitmb3VuZCBtZXRob2QgZGVmIGZsdXNoCitmb3VuZCBtZXRob2QgZGVmIHdyaXRlCitmb3VuZCBjbGFzcyBkZWYgT3V0cHV0QnVmZmVyCitmb3VuZCBtZXRob2QgZGVmIF9faW5pdF9fCitmb3VuZCBtZXRob2QgZGVmIHdyaXRlCitmb3VuZCBtZXRob2QgZGVmIGJlZXAKK2ZvdW5kIG1ldGhvZCBkZWYgc3RhcnRVc2VySW5wdXQKK2ZvdW5kIG1ldGhvZCBkZWYgZ2V0aW5wdXQKK2ZvdW5kIG1ldGhvZCBkZWYgcmVwbGFjZWlucHV0Citmb3VuZCBtZXRob2QgZGVmIGVudGVyCitmb3VuZCBtZXRob2QgZGVmIGdldGhpc3RvcnkKK2ZvdW5kIG1ldGhvZCBkZWYgdXBoaXN0b3J5Citmb3VuZCBtZXRob2QgZGVmIGRvd25oaXN0b3J5Citmb3VuZCBtZXRob2QgZGVmIHRhYgorZm91bmQgbWV0aG9kIGRlZiBlc2NhcGUKK2ZvdW5kIG1ldGhvZCBkZWYgY2FwdHVyZVB5dGhvbk91dHB1dAorZm91bmQgbWV0aG9kIGRlZiBoYW5kbGVMaW5lCitmb3VuZCBtZXRob2QgZGVmIG5ld0lucHV0Citmb3VuZCBjbGFzcyBkZWYgQ29uc29sZQorZm91bmQgbWV0aG9kIGRlZiBfX2luaXRfXworZm91bmQgbWV0aG9kIGRlZiBydW4KK2ZvdW5kIG1ldGhvZCBkZWYgc3RvcFB5dGhvbgorZm91bmQgY2xhc3MgZGVmIFB5dGhvblRocmVhZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3JoaW5vLXB5dGhvbi5wcm9nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3JoaW5vLXB5dGhvbi5wcm9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1MDNmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvcmhpbm8tcHl0aG9uLnByb2cKQEAgLTAsMCArMSw4MCBAQAorLyogVGVzdCBJbmZyYXN0cnVjdHVyZSAqLworCitmdW5jdGlvbiBsb2FkRmlsZShmaWxlTmFtZSwgZW5jb2RpbmcpIHsKKyAgICB2YXIgZiA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZU5hbWUpLAorICAgICAgICBzaXplID0gZi5sZW5ndGgoKSwKKyAgICAgICAgaXNyLAorICAgICAgICBmaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZik7CisgICAgaWYgKGVuY29kaW5nKSB7CisgICAgICAgIGlzciA9IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGZpcywgZW5jb2RpbmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlzciA9IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGZpcyk7CisgICAgfQorCisgICAgLyogU2hvdWxkIHVzZSB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIGlzci5yZWFkIGhlcmUsIGJ1dCBjYW4ndCBmaWd1cmUKKyAgICAgKiBvdXQgaG93IHRvIGNyZWF0ZSBhIEphdmEgY2hhciBhcnJheSBmcm9tIEpTLiAuIC4KKyAgICAgKiBAdG9kbworICAgICAqLworICAgIHZhciBjaGFyQ29kZSwgZGF0YT1bXTsKKyAgICB3aGlsZSAoKGNoYXJDb2RlID0gaXNyLnJlYWQoKSkgPj0gMCkgeworICAgICAgICBkYXRhLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSkpOworICAgIH0KKyAgICByZXR1cm4gZGF0YS5qb2luKCIiKTsKK30KKworZXZhbChsb2FkRmlsZSgiLi4vLi4vbGliL2FudGxyMy1hbGwuanMiKSk7CitldmFsKGxvYWRGaWxlKCIuLi8uLi9saWIvYW50bHIzLWNsaS5qcyIpKTsKK2V2YWwobG9hZEZpbGUoIlB5dGhvbkxleGVyLmpzIikpOworZXZhbChsb2FkRmlsZSgiUHl0aG9uUGFyc2VyLmpzIikpOworZXZhbChsb2FkRmlsZSgicmhpbm8tcHl0aG9uLmV4dGVuc2lvbnMiKSk7CisKKy8qIFBhcnNlciBFeHRlbnNpb25zICovCisKK3ZhciBvdXRwdXQgPSBbXTsKK2Z1bmN0aW9uIHhsb2cobXNnKSB7CisgICAgb3V0cHV0LnB1c2gobXNnKTsKK30KKworZnVuY3Rpb24gTXlMZXhlcigpIHsKKyAgICBNeUxleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK30KK0FOVExSLmxhbmcuZXh0ZW5kKE15TGV4ZXIsIFB5dGhvbkxleGVyLCB7CisgICAgbmV4dFRva2VuOiBmdW5jdGlvbigpIHsKKyAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGlzIHRva2VuJ3MgcG9zaXRpb24gaW4gbGluZSBiZWNhdXNlIFB5dGhvbiBpcworICAgICAgICAvLyB3aGl0ZXNwYWNlIHNlbnNpdGl2ZQorICAgICAgICB0aGlzLnN0YXJ0UG9zID0gdGhpcy5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKyAgICAgICAgcmV0dXJuIE15TGV4ZXIuc3VwZXJjbGFzcy5uZXh0VG9rZW4uY2FsbCh0aGlzKTsKKyAgICB9Cit9KTsKK015TGV4ZXIucHJvdG90eXBlLmVtaXRFcnJvck1lc3NhZ2UgPSBmdW5jdGlvbihtc2cpIHt4bG9nKG1zZyk7fQorUHl0aG9uUGFyc2VyLnByb3RvdHlwZS5lbWl0RXJyb3JNZXNzYWdlID0gZnVuY3Rpb24obXNnKSB7eGxvZyhtc2cpO30KKworLyogVGVzdCAqLworCitmdW5jdGlvbiBwYXJzZSh0ZXh0KSB7ICAgICAgICAKKyAgICB0cnkgeyAgICAKKyAgICAgICAgdmFyIGlucHV0ID0gbmV3IEFOVExSLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0odGV4dCk7CisgICAgICAgIHZhciBsZXhlciA9IG5ldyBNeUxleGVyKGlucHV0KTsgICAgICAgICAgICAgIAorICAgICAgICB2YXIgdG9rZW5zID0gbmV3IEFOVExSLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpOworICAgICAgICB0b2tlbnMuZGlzY2FyZE9mZkNoYW5uZWxUb2tlbnM9dHJ1ZTsKKyAgICAgICAgdmFyIGluZGVudGVkU291cmNlID0gbmV3IFB5dGhvblRva2VuU291cmNlKHRva2Vucyk7CisgICAgICAgIHRva2VucyA9IG5ldyBBTlRMUi5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGluZGVudGVkU291cmNlKTsKKyAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBQeXRob25QYXJzZXIodG9rZW5zKTsKKyAgICAgICAgcGFyc2VyLmZpbGVfaW5wdXQoKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIHhsb2coZS50b1N0cmluZygpKTsKKyAgICB9IGZpbmFsbHkgeworICAgIH0KK30KKwordmFyIGlucHV0ID0gbG9hZEZpbGUoInJoaW5vLXB5dGhvbi5pbnB1dCIpOwordmFyIGV4cGVjdGVkID0gbG9hZEZpbGUoInJoaW5vLXB5dGhvbi5vdXRwdXQiKTsKK3BhcnNlKGlucHV0KTsKK3ZhciBhY3R1YWwgPSBvdXRwdXQuam9pbigiXG4iKSsiXG4iOworaWYgKGFjdHVhbD09ZXhwZWN0ZWQpIHsKKyAgICBwcmludCgiVGVzdCBQYXNzZWQhIik7Cit9IGVsc2UgeworICAgIHByaW50KCJUZXN0IEZhaWxlZCEiKTsKKyAgICBwcmludChhY3R1YWwpOworICAgIHByaW50KGV4cGVjdGVkKTsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDAxbGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDAxbGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZWUyMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDFsZXhlci5nCkBAIC0wLDAgKzEsNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDAxbGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCitaRVJPOiAnMCc7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwMWxleGVyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwMWxleGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQxY2VlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDAxbGV4ZXIuaHRtbApAQCAtMCwwICsxLDU3IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAwMWxleGVyPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMDFsZXhlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBUTGV4ZXIoKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMDFsZXhlciwgeworICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkKCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCIwIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLlpFUk8pOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVPRik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0KCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCcxJyksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgZmFpbCgibmV4dFRva2VuIHNob3VsZCBoYXZlIHRocm93biBhIG5vdmlhYmxlYXRsIG9uIGJhZCB0b2tlbi4iKTsKKyAgICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5leHBlY3RpbmcsICcwJyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRVbmV4cGVjdGVkVHlwZSgpLCAnMScpOworICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDAxbGV4ZXI8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDJsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDJsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiMmUxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwMmxleGVyLmcKQEAgLTAsMCArMSw3IEBACitsZXhlciBncmFtbWFyIHQwMDJsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK1pFUk86ICcwJzsKK09ORTogJzEnOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDJsZXhlci5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDJsZXhlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5NWM5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwMmxleGVyLmh0bWwKQEAgLTAsMCArMSw1OCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMDJsZXhlcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDAybGV4ZXIuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gVExleGVyKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVExleGVyLCB0MDAybGV4ZXIsIHsKKyAgICAgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiMDEiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuWkVSTyk7CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuT05FKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5FT0YpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RNYWxmb3JtZWRJbnB1dCgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnMicpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKHN0cmVhbSksCisgICAgICAgICAgICB0b2tlbjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGZhaWwoIm5leHRUb2tlbiBzaG91bGQgaGF2ZSB0aHJvd24gZXJyb3Igb24gaW52YWxpZCBpbnB1dCIpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRVbmV4cGVjdGVkVHlwZSgpLCAnMicpOworICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDAybGV4ZXI8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDNsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDNsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2Yjc0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwM2xleGVyLmcKQEAgLTAsMCArMSw4IEBACitsZXhlciBncmFtbWFyIHQwMDNsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK1pFUk86ICcwJzsKK09ORTogJzEnOworRk9PWkU6ICdmb296ZSc7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwM2xleGVyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwM2xleGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDcxZGU2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDAzbGV4ZXIuaHRtbApAQCAtMCwwICsxLDYyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAwM2xleGVyPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMDNsZXhlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBUTGV4ZXIoKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMDNsZXhlciwgeworICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oIjBmb296ZTEiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuWkVSTyk7CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRk9PWkUpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLk9ORSk7CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRU9GKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oJzInKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBmYWlsKCJuZXh0VG9rZW4gc2hvdWxkIGhhdmUgdGhyb3duIGVycm9yIG9uIGludmFsaWQgaW5wdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0VW5leHBlY3RlZFR5cGUoKSwgJzInKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAwM2xleGVyPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA0bGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA0bGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMjA0YjUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDRsZXhlci5nCkBAIC0wLDAgKzEsNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDA0bGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCitGT086ICdmJyAnbycqOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDRsZXhlci5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDRsZXhlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0ZTBlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwNGxleGVyLmh0bWwKQEAgLTAsMCArMSw3OCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMDRsZXhlcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDA0bGV4ZXIuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gVExleGVyKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVExleGVyLCB0MDA0bGV4ZXIsIHsKKyAgICAgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkKCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmZm9mb29mb29vIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAiZiIpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDEpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnZm8nKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5GT08pOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RhcnRJbmRleCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0b3BJbmRleCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJ2ZvbycpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDkpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnZm9vbycpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVPRik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0KCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCcyJyksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgZmFpbCgibmV4dFRva2VuIHNob3VsZCBoYXZlIHRocm93biBlcnJvciBvbiBpbnZhbGlkIGlucHV0Iik7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmV4cGVjdGluZywgJ2YnKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmdldFVuZXhwZWN0ZWRUeXBlKCksICcyJyk7CisgICAgICAgIH0KKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMDRsZXhlcjwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwNWxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwNWxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRlZGRiOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA1bGV4ZXIuZwpAQCAtMCwwICsxLDYgQEAKK2xleGVyIGdyYW1tYXIgdDAwNWxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworRk9POiAnZicgJ28nKzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA1bGV4ZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA1bGV4ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOWQzZDZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDVsZXhlci5odG1sCkBAIC0wLDAgKzEsODUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDA1bGV4ZXI8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAwNWxleGVyLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIFRMZXhlcigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDAwNWxleGVyLCB7CisgICAgICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiZm9mb29mb29vIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDEpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAiZm8iKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5GT08pOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RhcnRJbmRleCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0b3BJbmRleCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJ2ZvbycpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDUpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDgpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnZm9vbycpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVPRik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0MSgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnMicpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKHN0cmVhbSksCisgICAgICAgICAgICB0b2tlbjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGZhaWwoIm5leHRUb2tlbiBzaG91bGQgaGF2ZSB0aHJvd24gZXJyb3Igb24gaW52YWxpZCBpbnB1dCIpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5leHBlY3RpbmcsICdmJyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRVbmV4cGVjdGVkVHlwZSgpLCAnMicpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0MigpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnZicpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKHN0cmVhbSksCisgICAgICAgICAgICB0b2tlbjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGZhaWwoIm5leHRUb2tlbiBzaG91bGQgaGF2ZSB0aHJvd24gZXJyb3Igb24gaW52YWxpZCBpbnB1dCIpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRVbmV4cGVjdGVkVHlwZSgpLCBsZXhlci5FT0YpOworICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDA1bGV4ZXI8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDZsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDZsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk2NTRiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwNmxleGVyLmcKQEAgLTAsMCArMSw2IEBACitsZXhlciBncmFtbWFyIHQwMDZsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK0ZPTzogJ2YnICgnbycgfCAnYScpKjsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA2bGV4ZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA2bGV4ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZjMzODBiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDZsZXhlci5odG1sCkBAIC0wLDAgKzEsNjkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDA2bGV4ZXI8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAwNmxleGVyLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIFRMZXhlcigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDAwNmxleGVyLCB7CisgICAgICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiZm9mYWFvb2EiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRk9PKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdG9wSW5kZXgoKSwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICJmbyIpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDcpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnZmFhb29hJyk7CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRU9GKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oJ2ZvZm9hb29hb2EyJyksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBmYWlsKCJuZXh0VG9rZW4gc2hvdWxkIGhhdmUgdGhyb3duIGVycm9yIG9uIGludmFsaWQgaW5wdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZXhwZWN0aW5nLCAnZicpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0VW5leHBlY3RlZFR5cGUoKSwgJzInKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmNoYXJQb3NpdGlvbkluTGluZSwgMTApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUubGluZSwgMSk7CisgICAgICAgIH0KKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMDZsZXhlcjwvaDE+Cis8L2JvZHk+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwN2xleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwN2xleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTUyOTE0YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA3bGV4ZXIuZwpAQCAtMCwwICsxLDYgQEAKK2xleGVyIGdyYW1tYXIgdDAwN2xleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworRk9POiAnZicgKCdvJyB8ICdhJyAnYicrKSo7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwN2xleGVyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwN2xleGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWIxZGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA3bGV4ZXIuaHRtbApAQCAtMCwwICsxLDY2IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAwN2xleGVyPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMDdsZXhlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBUTGV4ZXIoKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMDdsZXhlciwgeworICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImZvZmFiYWJib29hYmIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRk9PKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdG9wSW5kZXgoKSwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICJmbyIpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDEyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJ2ZhYmFiYm9vYWJiJyk7CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRU9GKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oJ2ZvYWJvYW8nKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBmYWlsKCJuZXh0VG9rZW4gc2hvdWxkIGhhdmUgdGhyb3duIGVycm9yIG9uIGludmFsaWQgaW5wdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0VW5leHBlY3RlZFR5cGUoKSwgJ28nKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmNoYXJQb3NpdGlvbkluTGluZSwgNik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5saW5lLCAxKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAwN2xleGVyPC9oMT4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA4bGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA4bGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjkxOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDhsZXhlci5nCkBAIC0wLDAgKzEsNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDA4bGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCitGT086ICdmJyAnYSc/OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDhsZXhlci5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDhsZXhlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyZDgzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAwOGxleGVyLmh0bWwKQEAgLTAsMCArMSw3NCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMDhsZXhlcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDA4bGV4ZXIuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gVExleGVyKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVExleGVyLCB0MDA4bGV4ZXIsIHsKKyAgICAgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkKCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmZmFmIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAiZiIpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkZPTyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDEpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnZmEnKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5GT08pOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RhcnRJbmRleCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0b3BJbmRleCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJ2YnKTsKKworICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVPRik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0KCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCdmYWZiJyksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBmYWlsKCJuZXh0VG9rZW4gc2hvdWxkIGhhdmUgdGhyb3duIGVycm9yIG9uIGludmFsaWQgaW5wdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0VW5leHBlY3RlZFR5cGUoKSwgJ2InKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmNoYXJQb3NpdGlvbkluTGluZSwgMyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5saW5lLCAxKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAwOGxleGVyPC9oMT4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA5bGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA5bGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOTVjMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDlsZXhlci5nCkBAIC0wLDAgKzEsNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDA5bGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCitESUdJVDogJzAnIC4uICc5JzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA5bGV4ZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDA5bGV4ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGY2Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMDlsZXhlci5odG1sCkBAIC0wLDAgKzEsNzUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDA5bGV4ZXI8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAwOWxleGVyLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIFRMZXhlcigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDAwOWxleGVyLCB7CisgICAgICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiMDg1IiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkRJR0lUKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdG9wSW5kZXgoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICIwIik7CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRElHSVQpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RhcnRJbmRleCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0b3BJbmRleCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJzgnKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5ESUdJVCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnNScpOworCisgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuRU9GKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oJzJhJyksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGZhaWwoIm5leHRUb2tlbiBzaG91bGQgaGF2ZSB0aHJvd24gZXJyb3Igb24gaW52YWxpZCBpbnB1dCIpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5hLCAnMCcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuYiwgJzknKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmdldFVuZXhwZWN0ZWRUeXBlKCksICdhJyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5jaGFyUG9zaXRpb25JbkxpbmUsIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUubGluZSwgMSk7CisgICAgICAgIH0KKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMDlsZXhlcjwvaDE+Cis8L2JvZHk+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMGxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMGxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDlmYTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDEwbGV4ZXIuZwpAQCAtMCwwICsxLDcgQEAKK2xleGVyIGdyYW1tYXIgdDAxMGxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworSURFTlRJRklFUjogKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqOworV1M6ICgnICcgfCAnXG4nKSs7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMGxleGVyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMGxleGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU2NGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDEwbGV4ZXIuaHRtbApAQCAtMCwwICsxLDg3IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAxMGxleGVyPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMTBsZXhlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBUTGV4ZXIoKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMTBsZXhlciwgeworICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImZvb2JhciBfQWI5OCBcbiBBMTJzZGYiKSwKKworICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKHN0cmVhbSksCisgICAgICAgICAgICB0b2tlbjsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5JREVOVElGSUVSKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdG9wSW5kZXgoKSwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICJmb29iYXIiKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5XUyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnICcpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLklERU5USUZJRVIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RhcnRJbmRleCgpLCA3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0b3BJbmRleCgpLCAxMSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICdfQWI5OCcpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLldTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMTIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDE0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgIiBcbiAiKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5JREVOVElGSUVSKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMTUpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDIwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJ0ExMnNkZicpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVPRik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0KCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCdhLWInKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgZmFpbCgibmV4dFRva2VuIHNob3VsZCBoYXZlIHRocm93biBlcnJvciBvbiBpbnZhbGlkIGlucHV0Iik7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTm9WaWFibGVBbHRFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0VW5leHBlY3RlZFR5cGUoKSwgJy0nKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmNoYXJQb3NpdGlvbkluTGluZSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5saW5lLCAxKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAxMGxleGVyPC9oMT4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDExbGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDExbGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTMzYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTFsZXhlci5nCkBAIC0wLDAgKzEsMTkgQEAKK2xleGVyIGdyYW1tYXIgdDAxMWxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworSURFTlRJRklFUjogCisgICAgICAgICgnYScuLid6J3wnQScuLidaJ3wnXycpIAorICAgICAgICAoJ2EnLi4neicKKyAgICAgICAgfCdBJy4uJ1onCisgICAgICAgIHwnMCcuLic5JworICAgICAgICB8J18nCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICB0bG9nKCJVbmRlcnNjb3JlIik7CisgICAgICAgICAgICAgIHRsb2coImZvbyIpOworICAgICAgICAgICAgfQorICAgICAgICApKgorICAgIDsKKworV1M6ICgnICcgfCAnXG4nKSs7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMWxleGVyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMWxleGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI3Mzk4OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDExbGV4ZXIuaHRtbApAQCAtMCwwICsxLDg3IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAxMWxleGVyPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMTFsZXhlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBUTGV4ZXIoKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMTFsZXhlciwgeworICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImZvb2JhciBfQWI5OCBcbiBBMTJzZGYiKSwKKworICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKHN0cmVhbSksCisgICAgICAgICAgICB0b2tlbjsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5JREVOVElGSUVSKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdG9wSW5kZXgoKSwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICJmb29iYXIiKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5XUyk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRTdGFydEluZGV4KCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VGV4dCgpLCAnICcpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLklERU5USUZJRVIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RhcnRJbmRleCgpLCA3KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0b3BJbmRleCgpLCAxMSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUZXh0KCksICdfQWI5OCcpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLldTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMTIpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDE0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgIiBcbiAiKTsKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0VHlwZSgpLCBsZXhlci5JREVOVElGSUVSKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFN0YXJ0SW5kZXgoKSwgMTUpOworICAgICAgICBhc3NlcnRFcXVhbHModG9rZW4uZ2V0U3RvcEluZGV4KCksIDIwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFRleHQoKSwgJ0ExMnNkZicpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVPRik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0KCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCdhLWInKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgZmFpbCgibmV4dFRva2VuIHNob3VsZCBoYXZlIHRocm93biBlcnJvciBvbiBpbnZhbGlkIGlucHV0Iik7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTm9WaWFibGVBbHRFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0VW5leHBlY3RlZFR5cGUoKSwgJy0nKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlLmNoYXJQb3NpdGlvbkluTGluZSwgMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5saW5lLCAxKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAxMWxleGVyPC9oMT4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDEybGV4ZXJYTUwuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDEybGV4ZXJYTUwuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzFlZGQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTJsZXhlclhNTC5nCkBAIC0wLDAgKzEsMTI3IEBACisvKiogWE1MIHBhcnNlciBieSBPbGl2ZXIgWmVpZ2VybWFubiBPY3RvYmVyIDEwLCAyMDA1ICovCitsZXhlciBncmFtbWFyIHQwMTJsZXhlclhNTDsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK0BsZXhlcjo6bWVtYmVycyB7Cit0aGlzLmxvdXQgPSBbXTsKK3RoaXMub3V0cHV0ID0gZnVuY3Rpb24obGluZSkgeworICAgIHRoaXMubG91dC5wdXNoKGxpbmUpOworfTsKK30KKworRE9DVU1FTlQKKyAgICA6ICBYTUxERUNMPyBXUz8gRE9DVFlQRT8gV1M/IEVMRU1FTlQgV1M/IAorICAgIDsKKworZnJhZ21lbnQgRE9DVFlQRQorICAgIDoKKyAgICAgICAgJzwhRE9DVFlQRScgV1Mgcm9vdEVsZW1lbnROYW1lPUdFTkVSSUNfSUQgCisgICAgICAgIHt0aGlzLm91dHB1dCgiUk9PVEVMRU1FTlQ6ICIrJHJvb3RFbGVtZW50TmFtZS50ZXh0KX0KKyAgICAgICAgV1MKKyAgICAgICAgKCAKKyAgICAgICAgICAgICggJ1NZU1RFTScgV1Mgc3lzMT1WQUxVRQorICAgICAgICAgICAgICAgIHt0aGlzLm91dHB1dCgiU1lTVEVNOiAiKyRzeXMxLnRleHQpfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfCAnUFVCTElDJyBXUyBwdWI9VkFMVUUgV1Mgc3lzMj1WQUxVRQorICAgICAgICAgICAgICAgIHt0aGlzLm91dHB1dCgiUFVCTElDOiAiKyRwdWIudGV4dCl9CisgICAgICAgICAgICAgICAge3RoaXMub3V0cHV0KCJTWVNURU06ICIrJHN5czIudGV4dCl9ICAgCisgICAgICAgICAgICApCisgICAgICAgICAgICAoIFdTICk/CisgICAgICAgICk/CisgICAgICAgICggZHRkPUlOVEVSTkFMX0RURAorICAgICAgICAgICAge3RoaXMub3V0cHV0KCJJTlRFUk5BTCBEVEQ6ICIrJGR0ZC50ZXh0KX0KKyAgICAgICAgKT8KKwkJJz4nCisJOworCitmcmFnbWVudCBJTlRFUk5BTF9EVEQgOiAnWycgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLikqICddJyA7CisKK2ZyYWdtZW50IFBJIDoKKyAgICAgICAgJzw/JyB0YXJnZXQ9R0VORVJJQ19JRCBXUz8gCisgICAgICAgICAge3RoaXMub3V0cHV0KCJQSTogIiskdGFyZ2V0LnRleHQpfQorICAgICAgICAoIEFUVFJJQlVURSBXUz8gKSogICc/PicKKwk7CisKK2ZyYWdtZW50IFhNTERFQ0wgOgorICAgICAgICAnPD8nICgneCd8J1gnKSAoJ20nfCdNJykgKCdsJ3wnTCcpIFdTPyAKKyAgICAgICAgICB7dGhpcy5vdXRwdXQoIlhNTCBkZWNsYXJhdGlvbiIpfQorICAgICAgICAoIEFUVFJJQlVURSBXUz8gKSogICc/PicKKwk7CisKKworZnJhZ21lbnQgRUxFTUVOVAorICAgIDogKCBTVEFSVF9UQUcKKyAgICAgICAgICAgIChFTEVNRU5UCisgICAgICAgICAgICB8IHQ9UENEQVRBCisgICAgICAgICAgICAgICAge3RoaXMub3V0cHV0KCJQQ0RBVEE6IFwiIiskdC50ZXh0KyJcIiIpfQorICAgICAgICAgICAgfCB0PUNEQVRBCisgICAgICAgICAgICAgICAge3RoaXMub3V0cHV0KCJDREFUQTogXCIiKyR0LnRleHQrIlwiIil9CisgICAgICAgICAgICB8IHQ9Q09NTUVOVAorICAgICAgICAgICAgICAgIHt0aGlzLm91dHB1dCgiQ29tbWVudDogXCIiKyR0LnRleHQrIlwiIil9CisgICAgICAgICAgICB8IHBpPVBJCisgICAgICAgICAgICApKgorICAgICAgICAgICAgRU5EX1RBRworICAgICAgICB8IEVNUFRZX0VMRU1FTlQKKyAgICAgICAgKQorICAgIDsKKworZnJhZ21lbnQgU1RBUlRfVEFHIAorICAgIDogJzwnIFdTPyBuYW1lPUdFTkVSSUNfSUQgV1M/CisgICAgICAgICAge3RoaXMub3V0cHV0KCJTdGFydCBUYWc6ICIrJG5hbWUudGV4dCl9CisgICAgICAgICggQVRUUklCVVRFIFdTPyApKiAnPicKKyAgICA7CisKK2ZyYWdtZW50IEVNUFRZX0VMRU1FTlQgCisgICAgOiAnPCcgV1M/IG5hbWU9R0VORVJJQ19JRCBXUz8KKyAgICAgICAgICB7dGhpcy5vdXRwdXQoIkVtcHR5IEVsZW1lbnQ6ICIrJG5hbWUudGV4dCl9CisgICAgICAgICggQVRUUklCVVRFIFdTPyApKiAnLz4nCisgICAgOworCitmcmFnbWVudCBBVFRSSUJVVEUgCisgICAgOiBuYW1lPUdFTkVSSUNfSUQgV1M/ICc9JyBXUz8gdmFsdWU9VkFMVUUKKyAgICAgICAge3RoaXMub3V0cHV0KCJBdHRyOiAiKyRuYW1lLnRleHQrIj0iKyR2YWx1ZS50ZXh0KX0KKyAgICA7CisKK2ZyYWdtZW50IEVORF9UQUcgCisgICAgOiAnPC8nIFdTPyBuYW1lPUdFTkVSSUNfSUQgV1M/ICc+JworICAgICAgICB7dGhpcy5vdXRwdXQoIkVuZCBUYWc6ICIrJG5hbWUudGV4dCl9CisgICAgOworCitmcmFnbWVudCBDT01NRU5UCisJOgknPCEtLScgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLikqICctLT4nCisJOworCitmcmFnbWVudCBDREFUQQorCToJJzwhW0NEQVRBWycgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLikqICddXT4nCisJOworCitmcmFnbWVudCBQQ0RBVEEgOiAofic8JykrIDsgCisKK2ZyYWdtZW50IFZBTFVFIDogCisgICAgICAgICggJ1wiJyAofidcIicpKiAnXCInCisgICAgICAgIHwgJ1wnJyAofidcJycpKiAnXCcnCisgICAgICAgICkKKwk7CisKK2ZyYWdtZW50IEdFTkVSSUNfSUQgCisgICAgOiAoIExFVFRFUiB8ICdfJyB8ICc6JykgCisgICAgICAgICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6IExFVFRFUiB8ICcwJy4uJzknIHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonICkqCisJOworCitmcmFnbWVudCBMRVRURVIKKwk6ICdhJy4uJ3onIAorCXwgJ0EnLi4nWicKKwk7CisKK2ZyYWdtZW50IFdTICA6CisgICAgICAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICB8CSdcclxuJworICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICApCisgICAgICAgICkrCisgICAgOyAgICAKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTJsZXhlclhNTC5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTJsZXhlclhNTC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3NGFhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxMmxleGVyWE1MLmh0bWwKQEAgLTAsMCArMSwxODcgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDEybGV4ZXJYTUw8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxMmxleGVyWE1MLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIFRMZXhlcigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDAxMmxleGVyWE1MLCB7CisgICAgICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHhpbnB1dCA9IFsKKyAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+IiwKKyAgICAgICAgICAgICAgICAiPCFET0NUWVBFIGNvbXBvbmVudCBbIiwKKyAgICAgICAgICAgICAgICAiPCFFTEVNRU5UIGNvbXBvbmVudCAoUENEQVRBfHN1YikqPiIsCisgICAgICAgICAgICAgICAgIjwhQVRUTElTVCBjb21wb25lbnQiLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgYXR0ciBDREFUQSAjSU1QTElFRCIsCisgICAgICAgICAgICAgICAgIiAgICAgICAgICBhdHRyMiBDREFUQSAjSU1QTElFRCIsCisgICAgICAgICAgICAgICAgIj4iLAorICAgICAgICAgICAgICAgICI8IUVMTUVOVCBzdWIgRU1QVFk+IiwKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAiXT4iLAorICAgICAgICAgICAgICAgICI8Y29tcG9uZW50IGF0dHI9XCJ2YWwndWVcIiBhdHRyMj0ndmFsXCJ1ZSc+IiwKKyAgICAgICAgICAgICAgICAiPCEtLSBUaGlzIGlzIGEgY29tbWVudCAtLT4iLAorICAgICAgICAgICAgICAgICJUZXh0IiwKKyAgICAgICAgICAgICAgICAiPCFbQ0RBVEFbaHVodV1dPiIsCisgICAgICAgICAgICAgICAgIsO2w6TDvMOfIiwKKyAgICAgICAgICAgICAgICAiJmFtcDsiLAorICAgICAgICAgICAgICAgICImbHQ7IiwKKyAgICAgICAgICAgICAgICAiPD94dGFsIGN1cnNvcj0nMTEnPz4iLAorICAgICAgICAgICAgICAgICI8c3ViLz4iLAorICAgICAgICAgICAgICAgICI8c3ViPjwvc3ViPiIsCisgICAgICAgICAgICAgICAgIjwvY29tcG9uZW50PiIKKyAgICAgICAgICAgIF0uam9pbigiXG4iKSwKKyAgICAgICAgICAgIHhvdXRwdXQgPSBbCisgICAgICAgICAgICAgICAgIlhNTCBkZWNsYXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIkF0dHI6IHZlcnNpb249JzEuMCciLAorICAgICAgICAgICAgICAgICJST09URUxFTUVOVDogY29tcG9uZW50IiwKKyAgICAgICAgICAgICAgICAiSU5URVJOQUwgRFREOiBbIiwKKyAgICAgICAgICAgICAgICAiPCFFTEVNRU5UIGNvbXBvbmVudCAoUENEQVRBfHN1YikqPiIsCisgICAgICAgICAgICAgICAgIjwhQVRUTElTVCBjb21wb25lbnQiLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgYXR0ciBDREFUQSAjSU1QTElFRCIsCisgICAgICAgICAgICAgICAgIiAgICAgICAgICBhdHRyMiBDREFUQSAjSU1QTElFRCIsCisgICAgICAgICAgICAgICAgIj4iLAorICAgICAgICAgICAgICAgICI8IUVMTUVOVCBzdWIgRU1QVFk+IiwKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAiXSIsCisgICAgICAgICAgICAgICAgIlN0YXJ0IFRhZzogY29tcG9uZW50IiwKKyAgICAgICAgICAgICAgICAiQXR0cjogYXR0cj1cInZhbCd1ZVwiIiwKKyAgICAgICAgICAgICAgICAiQXR0cjogYXR0cjI9J3ZhbFwidWUnIiwKKyAgICAgICAgICAgICAgICAiUENEQVRBOiBcIiIsCisgICAgICAgICAgICAgICAgIlwiIiwKKyAgICAgICAgICAgICAgICAiQ29tbWVudDogXCI8IS0tIFRoaXMgaXMgYSBjb21tZW50IC0tPlwiIiwKKyAgICAgICAgICAgICAgICAiUENEQVRBOiBcIiIsCisgICAgICAgICAgICAgICAgIlRleHQiLAorICAgICAgICAgICAgICAgICJcIiIsCisgICAgICAgICAgICAgICAgIkNEQVRBOiBcIjwhW0NEQVRBW2h1aHVdXT5cIiIsCisgICAgICAgICAgICAgICAgIlBDREFUQTogXCIiLAorICAgICAgICAgICAgICAgICLDtsOkw7zDnyIsCisgICAgICAgICAgICAgICAgIiZhbXA7IiwKKyAgICAgICAgICAgICAgICAiJmx0OyIsCisgICAgICAgICAgICAgICAgIlwiIiwKKyAgICAgICAgICAgICAgICAiUEk6IHh0YWwiLAorICAgICAgICAgICAgICAgICJBdHRyOiBjdXJzb3I9JzExJyIsCisgICAgICAgICAgICAgICAgIlBDREFUQTogXCIiLAorICAgICAgICAgICAgICAgICJcIiIsCisgICAgICAgICAgICAgICAgIkVtcHR5IEVsZW1lbnQ6IHN1YiIsCisgICAgICAgICAgICAgICAgIlBDREFUQTogXCIiLAorICAgICAgICAgICAgICAgICJcIiIsCisgICAgICAgICAgICAgICAgIlN0YXJ0IFRhZzogc3ViIiwKKyAgICAgICAgICAgICAgICAiRW5kIFRhZzogc3ViIiwKKyAgICAgICAgICAgICAgICAiUENEQVRBOiBcIiIsCisgICAgICAgICAgICAgICAgIlwiIiwKKyAgICAgICAgICAgICAgICAiRW5kIFRhZzogY29tcG9uZW50IgorICAgICAgICAgICAgXS5qb2luKCJcbiIpLAorICAgICAgICAgICAgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoeG91dHB1dCwgbGV4ZXIubG91dC5qb2luKCJcbiIpKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQxKCkgeworICAgICAgICB2YXIgaW5wdXQgPSBbCisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+IiwKKyAgICAgICAgICAgICI8ZG9jdW1lbnQgZD4iLAorICAgICAgICAgICAgIjwvZG9jdW1lbnQ+IgorICAgICAgICBdLmpvaW4oIlxuIiksCisgICAgICAgIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbShpbnB1dCksCisgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICB0b2tlbjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWlsKCJibG9jayBzaG91bGQgaGF2ZSB0aHJvd24gYW4gbnZhZSIpOworICAgICAgICB9IGNhdGNoKGV4YykgeworICAgICAgICAgICAgYXNzZXJ0KGV4YyBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleGMuZ2V0VW5leHBlY3RlZFR5cGUoKSwgIj4iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleGMuY2hhclBvc2l0aW9uSW5MaW5lLCAxMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhjLmxpbmUsIDIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0MigpIHsKKyAgICAgICAgdmFyIGlucHV0ID0gWworICAgICAgICAgICAgIjw/dG1sIHZlcnNpb249JzEuMCc/PiIsCisgICAgICAgICAgICAiPGRvY3VtZW50PiIsCisgICAgICAgICAgICAiPC9kb2N1bWVudD4iCisgICAgICAgIF0uam9pbigiXG4iKSwKKyAgICAgICAgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKGlucHV0KSwKKyAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKHN0cmVhbSksCisgICAgICAgIHRva2VuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoImJsb2NrIHNob3VsZCBoYXZlIHRocm93biBhbiBudmFlIik7CisgICAgICAgIH0gY2F0Y2goZXhjKSB7CisgICAgICAgICAgICBhc3NlcnQoZXhjIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhjLmdldFVuZXhwZWN0ZWRUeXBlKCksICJ0Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhjLmNoYXJQb3NpdGlvbkluTGluZSwgMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhjLmxpbmUsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0MygpIHsKKyAgICAgICAgdmFyIGlucHV0ID0gWworICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+IiwKKyAgICAgICAgIjxkb2N1IG1lbnQgYXR0cj1cImZvb1wiPiIsCisgICAgICAgICI8L2RvY3VtZW50PiIKKyAgICAgICAgXS5qb2luKCJcbiIpLAorICAgICAgICBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oaW5wdXQpLAorICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgdG9rZW47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5FT0YpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiYmxvY2sgc2hvdWxkIGhhdmUgdGhyb3duIGFuIG52YWUiKTsKKyAgICAgICAgfSBjYXRjaChleGMpIHsKKyAgICAgICAgICAgIGFzc2VydChleGMgaW5zdGFuY2VvZiBvcmcuYW50bHIucnVudGltZS5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhjLmdldFVuZXhwZWN0ZWRUeXBlKCksICJhIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhjLmNoYXJQb3NpdGlvbkluTGluZSwgMTEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4Yy5saW5lLCAyKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMTJsZXhlclhNTDwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxM3BhcnNlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTNwYXJzZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOWIzZTEyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTNwYXJzZXIuZwpAQCAtMCwwICsxLDIzIEBACitncmFtbWFyIHQwMTNwYXJzZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCitAcGFyc2VyOjptZW1iZXJzIHsKK3RoaXMuaWRlbnRpZmllcnMgPSBbXTsKK3RoaXMucmVwb3J0ZWRFcnJvcnMgPSBbXTsKKwordGhpcy5mb3VuZElkZW50aWZpZXIgPSBmdW5jdGlvbihuYW1lKSB7CisgICAgdGhpcy5pZGVudGlmaWVycy5wdXNoKG5hbWUpOworfTsKKwordGhpcy5lbWl0RXJyb3JNZXNzYWdlID0gZnVuY3Rpb24obXNnKSB7CisgICAgdGhpcy5yZXBvcnRlZEVycm9ycy5wdXNoKG1zZyk7Cit9OworfQorCitkb2N1bWVudDoKKyAgICAgICAgdD1JREVOVElGSUVSIHt0aGlzLmZvdW5kSWRlbnRpZmllcigkdC50ZXh0KX0KKyAgICAgICAgOworCitJREVOVElGSUVSOiAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSo7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxM3BhcnNlci5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTNwYXJzZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOWJlYjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTNwYXJzZXIuaHRtbApAQCAtMCwwICsxLDQ1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAxM3BhcnNlcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDEzcGFyc2VyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxM3BhcnNlclBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb29iYXIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMTNwYXJzZXJMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IHQwMTNwYXJzZXJQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgcGFyc2VyLmRvY3VtZW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIucmVwb3J0ZWRFcnJvcnMubGVuZ3RoLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5pZGVudGlmaWVycy5sZW5ndGgsIDEpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RNYWxmb3JtZWRJbnB1dDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMTNwYXJzZXJMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IHQwMTNwYXJzZXJQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5kb2N1bWVudCgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgZmFpbGVkIG9uIGVtcHR5IGlucHV0Iik7CisgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDEzcGFyc2VyPC9oMT4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE0cGFyc2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxNHBhcnNlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlNTJhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxNHBhcnNlci5nCkBAIC0wLDAgKzEsMzYgQEAKK2dyYW1tYXIgdDAxNHBhcnNlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK0BwYXJzZXI6Om1lbWJlcnMgewordGhpcy5yZXBvcnRlZEVycm9ycyA9IFtdOwordGhpcy5ldmVudHMgPSBbXTsKK3RoaXMuZW1pdEVycm9yTWVzc2FnZSA9IGZ1bmN0aW9uKG1zZykgeworICAgIHRoaXMucmVwb3J0ZWRFcnJvcnMucHVzaChtc2cpOworfTsKK3RoaXMuZXZlbnRNZXNzYWdlID0gZnVuY3Rpb24obXNnKSB7CisgICAgdGhpcy5ldmVudHMucHVzaChtc2cpOworfTsKK30KKyAgICAgICAgCisKK2RvY3VtZW50OgorICAgICAgICAoIGRlY2xhcmF0aW9uCisgICAgICAgIHwgY2FsbAorICAgICAgICApKgorICAgICAgICBFT0YKKyAgICA7CisKK2RlY2xhcmF0aW9uOgorICAgICAgICAndmFyJyB0PUlERU5USUZJRVIgJzsnCisgICAgICAgIHt0aGlzLmV2ZW50TWVzc2FnZShbJ2RlY2wnLCAkdC5nZXRUZXh0KCldKTt9CisgICAgOworCitjYWxsOgorICAgICAgICB0PUlERU5USUZJRVIgJygnICcpJyAnOycKKyAgICAgICAge3RoaXMuZXZlbnRNZXNzYWdlKFsnY2FsbCcsICR0LmdldFRleHQoKV0pO30KKyAgICA7CisKK0lERU5USUZJRVI6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKjsKK1dTOiAgKCcgJ3wnXHInfCdcdCd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTRwYXJzZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE0cGFyc2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQ5MzA2YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE0cGFyc2VyLmh0bWwKQEAgLTAsMCArMSw5MSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMTRwYXJzZXI8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxNHBhcnNlckxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMTRwYXJzZXJQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJ2YXIgZm9vYmFyOyBnbmFyeigpOyB2YXIgYmx1cHA7IGZsdXBwICggKSA7IiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDE0cGFyc2VyTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyB0MDE0cGFyc2VyUGFyc2VyKHRzdHJlYW0pLAorICAgICAgICAgICAgaSwKKyAgICAgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgICAgIFsiZGVjbCIsICJmb29iYXIiXSwKKyAgICAgICAgICAgICAgICBbImNhbGwiLCAiZ25hcnoiXSwKKyAgICAgICAgICAgICAgICBbImRlY2wiLCAiYmx1cHAiXSwKKyAgICAgICAgICAgICAgICBbImNhbGwiLCAiZmx1cHAiXQorICAgICAgICAgICAgXTsKKworICAgICAgICBwYXJzZXIuZG9jdW1lbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBhcnNlci5yZXBvcnRlZEVycm9ycy5sZW5ndGgpOworICAgICAgICBmb3IgKGk9MDsgaTxwYXJzZXIuZXZlbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLmV2ZW50c1tpXVswXSwgZXhwZWN0ZWRbaV1bMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5ldmVudHNbaV1bMV0sIGV4cGVjdGVkW2ldWzFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RNYWxmb3JtZWRJbnB1dDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJ2YXI7IGZvbygpOyIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAxNHBhcnNlckxleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgdDAxNHBhcnNlclBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICBwYXJzZXIuZG9jdW1lbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5yZXBvcnRlZEVycm9ycy5sZW5ndGgsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLnJlcG9ydGVkRXJyb3JzWzBdLmluZGV4T2YoImxpbmUgMTozIiksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLmV2ZW50cy5sZW5ndGgsIDApOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RNYWxmb3JtZWRJbnB1dDIoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJ2YXIgZm9vYmFyKCk7IGduYXJ6KCk7IiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDE0cGFyc2VyTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyB0MDE0cGFyc2VyUGFyc2VyKHRzdHJlYW0pLAorICAgICAgICAgICAgZXhwZWN0ZWQgPSBbWyJjYWxsIiwgImduYXJ6Il1dOworCisgICAgICAgIHBhcnNlci5kb2N1bWVudCgpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLnJlcG9ydGVkRXJyb3JzLmxlbmd0aCwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIucmVwb3J0ZWRFcnJvcnNbMF0uaW5kZXhPZigibGluZSAxOjEwIiksIDApOworICAgICAgICB2YXIgaTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5ldmVudHMubGVuZ3RoLCBleHBlY3RlZC5sZW5ndGgpOworICAgICAgICBmb3IgKGk9MDsgaTxleHBlY3RlZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5ldmVudHNbaV1bMF0sIGV4cGVjdGVkW2ldWzBdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIuZXZlbnRzW2ldWzFdLCBleHBlY3RlZFtpXVsxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQzKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiZ25hcnooOyBmbHVwcCgpOyIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAxNHBhcnNlckxleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgdDAxNHBhcnNlclBhcnNlcih0c3RyZWFtKSwKKyAgICAgICAgICAgIGV4cGVjdGVkID0gW1siY2FsbCIsImduYXJ6Il0sWyJjYWxsIiwiZmx1cHAiXV07CisKKyAgICAgICAgcGFyc2VyLmRvY3VtZW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIucmVwb3J0ZWRFcnJvcnMubGVuZ3RoLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5yZXBvcnRlZEVycm9yc1swXS5pbmRleE9mKCJsaW5lIDE6NiIpLCAwKTsKKyAgICAgICAgdmFyIGk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIuZXZlbnRzLmxlbmd0aCwgZXhwZWN0ZWQubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpPTA7IGk8ZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIuZXZlbnRzW2ldWzBdLCBleHBlY3RlZFtpXVswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLmV2ZW50c1tpXVsxXSwgZXhwZWN0ZWRbaV1bMV0pOworICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDE0cGFyc2VyPC9oMT4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE1Y2FsYy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTVjYWxjLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M5ZTI3NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE1Y2FsYy5nCkBAIC0wLDAgKzEsNTAgQEAKK2dyYW1tYXIgdDAxNWNhbGM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCitAcGFyc2VyOjptZW1iZXJzIHsKK3RoaXMuZW1pdEVycm9yTWVzc2FnZSA9IGZ1bmN0aW9uKG1zZykgeworICAgIGlmICghdGhpcy5yZXBvcnRlZEVycm9ycykgeworICAgICAgICB0aGlzLnJlcG9ydGVkRXJyb3JzID0gW21zZ107CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy5yZXBvcnRlZEVycm9ycy5wdXNoKG1zZykKKyAgICB9Cit9OworfQorCitldmFsdWF0ZSByZXR1cm5zIFtyZXN1bHRdOiByPWV4cHJlc3Npb24ge3Jlc3VsdCA9IHI7fTsKKworZXhwcmVzc2lvbiByZXR1cm5zIFtyZXN1bHRdOiByPW11bHQgKAorICAgICcrJyByMj1tdWx0IHtyICs9IHIyO30KKyAgfCAnLScgcjI9bXVsdCB7ciAtPSByMjt9CisgICkqIHtyZXN1bHQgPSByfTsKKworbXVsdCByZXR1cm5zIFtyZXN1bHRdOiByPWxvZyAoCisgICAgJyonIHIyPWxvZyB7ciAqPSByMjt9CisgIHwgJy8nIHIyPWxvZyB7ciAvPSByMjt9CisgICkqIHtyZXN1bHQgPSByfTsKKworbG9nIHJldHVybnMgW3Jlc3VsdF06ICdsbicgcj1leHAge3Jlc3VsdCA9IE1hdGgubG9nKHIpO30KKyAgICB8IHI9ZXhwIHtyZXN1bHQgPSByO30KKyAgICA7CisKK2V4cCByZXR1cm5zIFtyZXN1bHRdOiByPWF0b20gKCdeJyByMj1hdG9tIHtyID0gTWF0aC5wb3cocixyMik7fSApPyB7cmVzdWx0ID0gcjt9CisgICAgOworCithdG9tIHJldHVybnMgW3Jlc3VsdF06CisgICAgbj1JTlRFR0VSIHtyZXN1bHQgPSBwYXJzZUludCgkbi50ZXh0LCAxMCk7fQorICB8IG49REVDSU1BTCB7cmVzdWx0ID0gcGFyc2VGbG9hdCgkbi50ZXh0KTt9IAorICB8ICcoJyByPWV4cHJlc3Npb24ge3Jlc3VsdCA9IHI7fSAnKScKKyAgfCAnUEknIHtyZXN1bHQgPSBNYXRoLlBJO30KKyAgfCAnRScge3Jlc3VsdCA9IE1hdGguRTt9CisgIDsKKworSU5URUdFUjogRElHSVQrOworCitERUNJTUFMOiBESUdJVCsgJy4nIERJR0lUKzsKKworZnJhZ21lbnQKK0RJR0lUOiAnMCcuLic5JzsKKworV1M6ICgnICcgfCAnXG4nIHwgJ1x0JykrIHskY2hhbm5lbCA9IEhJRERFTjt9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTVjYWxjLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxNWNhbGMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NGQxNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTVjYWxjLmh0bWwKQEAgLTAsMCArMSw2NiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMTVjYWxjPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMTVjYWxjTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxNWNhbGNQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBfZXZhbHVhdGUoZXhwciwgZXhwZWN0ZWQsIGVycm9ycykgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbShleHByKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMTVjYWxjTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyB0MDE1Y2FsY1BhcnNlcih0c3RyZWFtKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VyLmV2YWx1YXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGVkKTsKKyAgICAgICAgaWYgKCFlcnJvcnMpIHsKKyAgICAgICAgICAgIGFzc2VydFVuZGVmaW5lZChwYXJzZXIucmVwb3J0ZWRFcnJvcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5yZXBvcnRlZEVycm9ycy5sZW5ndGgsIGVycm9ycy5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMDEoKSB7CisgICAgICAgIF9ldmFsdWF0ZSgiMSArIDIiLCAzKTsKKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDAyKCkgeworICAgICAgICBfZXZhbHVhdGUoIjEgKyAyICogMyIsIDcpOworICAgIH0KKworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMDMoKSB7CisgICAgICAgIF9ldmFsdWF0ZSgiMTAgLyAyIiwgNSk7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQwNCgpIHsKKyAgICAgICAgX2V2YWx1YXRlKCI2ICsgMiooMysxKSAtIDQiLCAxMCk7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiB0ZXN0TWFsZm9ybWVkSW5wdXQoKSB7CisgICAgICAgIF9ldmFsdWF0ZSgiNiAtICgyKjEiLCA0LCBbIm1pc21hdGNoZWQgdG9rZW4gYXQgcG9zIDgiXSk7CisgICAgfQorICAgICAgICAKKyAgICAvLyBGSVhNRTogbW9zdCBwYXJzZSBlcnJvcnMgcmVzdWx0IGluIFR5cGVFcnJvcnMgaW4gYWN0aW9uIGNvZGUsIGJlY2F1c2UKKyAgICAvLyBydWxlcyByZXR1cm4gTm9uZSwgd2hpY2ggaXMgdGhlbiBhZGRlZC9tdWx0aXBsaWVkLi4uIHRvIGludGVnZXJzLgorICAgIC8vIGV2YWx1YXRlKCI2IC0gZm9vIDIiLCA0LCBbInNvbWUgZXJyb3IiXSkKKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAxNWNhbGM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTZhY3Rpb25zLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxNmFjdGlvbnMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iN2Q0Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTZhY3Rpb25zLmcKQEAgLTAsMCArMSwzMSBAQAorZ3JhbW1hciB0MDE2YWN0aW9uczsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK2RlY2xhcmF0aW9uIHJldHVybnMgW25hbWVdCisgICAgOiAgIGZ1bmN0aW9uSGVhZGVyICc7JworICAgICAgICB7JG5hbWUgPSAkZnVuY3Rpb25IZWFkZXIubmFtZTt9CisgICAgOworCitmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtuYW1lXQorICAgIDogICB0eXBlIElECisJeyRuYW1lID0gJElELnRleHQ7fQorICAgIDsKKwordHlwZQorICAgIDogICAnaW50JyAgIAorICAgIHwgICAnY2hhcicgIAorICAgIHwgICAndm9pZCcKKyAgICA7CisKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgOworCitXUyAgOiAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgICdccicKKyAgICAgICAgfCAgICdcbicKKyAgICAgICAgKSsKKyAgICAgICAge19jaGFubmVsPUhJRERFTn0KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTZhY3Rpb25zLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxNmFjdGlvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDU5MmJjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTZhY3Rpb25zLmh0bWwKQEAgLTAsMCArMSwzMyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMTZhY3Rpb25zPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMTZhY3Rpb25zTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxNmFjdGlvbnNQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJpbnQgZm9vOyIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAxNmFjdGlvbnNMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IHQwMTZhY3Rpb25zUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZXIuZGVjbGFyYXRpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZXN1bHQpOworICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAxNmFjdGlvbnM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTdwYXJzZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE3cGFyc2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFiOTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE3cGFyc2VyLmcKQEAgLTAsMCArMSw5MSBAQAorZ3JhbW1hciB0MDE3cGFyc2VyOworCitvcHRpb25zIHsKKyAgICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK3Byb2dyYW0KKyAgICA6ICAgZGVjbGFyYXRpb24rCisgICAgOworCitkZWNsYXJhdGlvbgorICAgIDogICB2YXJpYWJsZQorICAgIHwgICBmdW5jdGlvbkhlYWRlciAnOycKKyAgICB8ICAgZnVuY3Rpb25IZWFkZXIgYmxvY2sKKyAgICA7CisKK3ZhcmlhYmxlCisgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAnOycKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgSUQgCisgICAgOworCitmdW5jdGlvbkhlYWRlcgorICAgIDogICB0eXBlIElEICcoJyAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gJyknCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICAgICAgICAKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgJ2ludCcgICAKKyAgICB8ICAgJ2NoYXInICAKKyAgICB8ICAgJ3ZvaWQnCisgICAgfCAgIElEICAgICAgICAKKyAgICA7CisKK2Jsb2NrCisgICAgOiAgICd7JworICAgICAgICAgICAgdmFyaWFibGUqCisgICAgICAgICAgICBzdGF0KgorICAgICAgICAnfScKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnICAgICAgCisgICAgfCBibG9jaworICAgIHwgYXNzaWduU3RhdCAnOycKKyAgICB8ICc7JworICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCAnPScgZXhwciAgICAgICAgCisgICAgOworCitleHByOiAgIGNvbmRFeHByCisgICAgOworCitjb25kRXhwcgorICAgIDogICBhZXhwciAoICgnPT0nIHwgJzwnKSBhZXhwciApPworICAgIDsKKworYWV4cHIKKyAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgOworCithdG9tCisgICAgOiBJRCAgICAgIAorICAgIHwgSU5UICAgICAgCisgICAgfCAnKCcgZXhwciAnKScKKyAgICA7IAorCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOO30KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTdwYXJzZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE3cGFyc2VyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2Q1YjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE3cGFyc2VyLmh0bWwKQEAgLTAsMCArMSw2OCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMTdwYXJzZXI8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxN3BhcnNlckxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMTdwYXJzZXJQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBUZXN0UGFyc2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRlc3RQYXJzZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB0aGlzLnJlcG9ydGVkRXJyb3JzID0gW107CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVGVzdFBhcnNlciwgdDAxN3BhcnNlclBhcnNlciwgeworICAgICAgICBlbWl0RXJyb3JNZXNzYWdlOiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgIHRoaXMucmVwb3J0ZWRFcnJvcnMucHVzaChtc2cpOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJpbnQgZm9vOyIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAxN3BhcnNlckxleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVGVzdFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICBwYXJzZXIucHJvZ3JhbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLnJlcG9ydGVkRXJyb3JzLmxlbmd0aCwgMCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0MSgpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImludCBmb28oKSB7IDErMiB9Iik7CisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDE3cGFyc2VyTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUZXN0UGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHBhcnNlci5wcm9ncmFtKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIucmVwb3J0ZWRFcnJvcnMubGVuZ3RoLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcnNlci5yZXBvcnRlZEVycm9yc1swXS5pbmRleE9mKCJsaW5lIDE6MTYiKSwgMCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdE1hbGZvcm1lZElucHV0MigpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImludCBmb28oKSB7IDErOyAxKzIgfSIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAxN3BhcnNlckxleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVGVzdFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICBwYXJzZXIucHJvZ3JhbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLnJlcG9ydGVkRXJyb3JzLmxlbmd0aCwgMik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIucmVwb3J0ZWRFcnJvcnNbMF0uaW5kZXhPZigibGluZSAxOjE0IiksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLnJlcG9ydGVkRXJyb3JzWzFdLmluZGV4T2YoImxpbmUgMToyMCIpLCAwKTsKKyAgICB9CisKKworPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDE3cGFyc2VyPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE4bGxzdGFyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxOGxsc3Rhci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5MjBkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxOGxsc3Rhci5nCkBAIC0wLDAgKzEsMTEwIEBACitncmFtbWFyIHQwMThsbHN0YXI7CisKK29wdGlvbnMgeworICAgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworQG1lbWJlcnMgewordGhpcy5vbG9nID0gW107Cit0aGlzLm91dHB1dCA9IGZ1bmN0aW9uKG1zZykgeworICAgIHRoaXMub2xvZy5wdXNoKG1zZyk7Cit9OworfQorCitwcm9ncmFtCisgICAgOiAgIGRlY2xhcmF0aW9uKworICAgIDsKKworLyoqIEluIHRoaXMgcnVsZSwgdGhlIGZ1bmN0aW9uSGVhZGVyIGxlZnQgcHJlZml4IG9uIHRoZSBsYXN0IHR3bworICogIGFsdGVybmF0aXZlcyBpcyBub3QgTEwoaykgZm9yIGEgZml4ZWQgay4gIEhvd2V2ZXIsIGl0IGlzCisgKiAgTEwoKikuICBUaGUgTEwoKikgYWxnb3JpdGhtIHNpbXBseSBzY2FucyBhaGVhZCB1bnRpbCBpdCBzZWVzCisgKiAgZWl0aGVyIHRoZSAnOycgb3IgdGhlICd7JyBvZiB0aGUgYmxvY2sgYW5kIHRoZW4gaXQgcGlja3MKKyAqICB0aGUgYXBwcm9wcmlhdGUgYWx0ZXJuYXRpdmUuICBMb29raGVhZCBjYW4gYmUgYXJiaXRyYXJpbHkKKyAqICBsb25nIGluIHRoZW9yeSwgYnV0IGlzIDw9MTAgaW4gbW9zdCBjYXNlcy4gIFdvcmtzIGdyZWF0LgorICogIFVzZSBBTlRMUldvcmtzIHRvIHNlZSB0aGUgbG9va2FoZWFkIHVzZSAoc3RlcCBieSBMb2NhdGlvbikKKyAqICBhbmQgbG9vayBmb3IgYmx1ZSB0b2tlbnMgaW4gdGhlIGlucHV0IHdpbmRvdyBwYW5lLiA6KQorICovCitkZWNsYXJhdGlvbgorICAgIDogICB2YXJpYWJsZQorICAgIHwgICBmdW5jdGlvbkhlYWRlciAnOycKKwl7dGhpcy5vdXRwdXQoJGZ1bmN0aW9uSGVhZGVyLm5hbWUrIiBpcyBhIGRlY2xhcmF0aW9uIik7fQorICAgIHwgICBmdW5jdGlvbkhlYWRlciBibG9jaworCXt0aGlzLm91dHB1dCgkZnVuY3Rpb25IZWFkZXIubmFtZSsiIGlzIGEgZGVmaW5pdGlvbiIpO30KKyAgICA7CisKK3ZhcmlhYmxlCisgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAnOycKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgSUQgCisgICAgOworCitmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtuYW1lXQorICAgIDogICB0eXBlIElEICcoJyAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gJyknCisJeyRuYW1lID0gJElELnRleHR9CisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICAgICAgICAKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgJ2ludCcgICAKKyAgICB8ICAgJ2NoYXInICAKKyAgICB8ICAgJ3ZvaWQnCisgICAgfCAgIElEICAgICAgICAKKyAgICA7CisKK2Jsb2NrCisgICAgOiAgICd7JworICAgICAgICAgICAgdmFyaWFibGUqCisgICAgICAgICAgICBzdGF0KgorICAgICAgICAnfScKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnICAgICAgCisgICAgfCBibG9jaworICAgIHwgYXNzaWduU3RhdCAnOycKKyAgICB8ICc7JworICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCAnPScgZXhwciAgICAgICAgCisgICAgOworCitleHByOiAgIGNvbmRFeHByCisgICAgOworCitjb25kRXhwcgorICAgIDogICBhZXhwciAoICgnPT0nIHwgJzwnKSBhZXhwciApPworICAgIDsKKworYWV4cHIKKyAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgOworCithdG9tCisgICAgOiBJRCAgICAgIAorICAgIHwgSU5UICAgICAgCisgICAgfCAnKCcgZXhwciAnKScKKyAgICA7IAorCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxOGxsc3Rhci5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMThsbHN0YXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjdmNjgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMThsbHN0YXIuaHRtbApAQCAtMCwwICsxLDYxIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAxOGxsc3RhcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDE4bGxzdGFyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxOGxsc3RhclBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIFRlc3RQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVGVzdFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgIHRoaXMucmVwb3J0ZWRFcnJvcnMgPSBbXTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUZXN0UGFyc2VyLCB0MDE4bGxzdGFyUGFyc2VyLCB7CisgICAgICAgIGVtaXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKG1zZykgeworICAgICAgICAgICAgdGhpcy5yZXBvcnRlZEVycm9ycy5wdXNoKG1zZyk7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHhpbnB1dCA9IFsKKyAgICAgICAgICAgICAgICAiY2hhciBjOyIsCisgICAgICAgICAgICAgICAgImludCB4OyIsCisgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgInZvaWQgYmFyKGludCB4KTsiLAorICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICJpbnQgZm9vKGludCB5LCBjaGFyIGQpIHsiLAorICAgICAgICAgICAgICAgICIgIGludCBpOyIsCisgICAgICAgICAgICAgICAgIiAgZm9yIChpPTA7IGk8MzsgaT1pKzEpIHsiLAorICAgICAgICAgICAgICAgICIgICAgeD0zOyIsCisgICAgICAgICAgICAgICAgIiAgICB5PTU7IiwKKyAgICAgICAgICAgICAgICAiICB9IiwKKyAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgIF0uam9pbigiXG4iKSwKKyAgICAgICAgICAgIHhvdXRwdXQgPSBbCisgICAgICAgICAgICAgICAgImJhciBpcyBhIGRlY2xhcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAiZm9vIGlzIGEgZGVmaW5pdGlvbiIKKyAgICAgICAgICAgIF0uam9pbigiXG4iKTsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMThsbHN0YXJMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRlc3RQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgcGFyc2VyLnByb2dyYW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHhvdXRwdXQsIHBhcnNlci5vbG9nLmpvaW4oIlxuIikpOworICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAxOGxsc3RhcjwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxOWxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAxOWxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q1Yjg4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE5bGV4ZXIuZwpAQCAtMCwwICsxLDY0IEBACitsZXhlciBncmFtbWFyIHQwMTlsZXhlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgZmlsdGVyPXRydWU7Cit9CisKK0lNUE9SVAorCToJJ2ltcG9ydCcgV1MgbmFtZT1RSURTdGFyIFdTPyAnOycKKwk7CisJCisvKiogQXZvaWRzIGhhdmluZyAicmV0dXJuIGZvbzsiIG1hdGNoIGFzIGEgZmllbGQgKi8KK1JFVFVSTgorCToJJ3JldHVybicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9Oi4pKiAnOycKKwk7CisKK0NMQVNTCisJOgknY2xhc3MnIFdTIG5hbWU9SUQgV1M/ICgnZXh0ZW5kcycgV1MgUUlEIFdTPyk/CisJCSgnaW1wbGVtZW50cycgV1MgUUlEIFdTPyAoJywnIFdTPyBRSUQgV1M/KSopPyAneycKKwk7CisJCitDT01NRU5UCisgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgOworCitTVFJJTkcKKyAgICA6CSciJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnIicKKwk7CisKK0NIQVIKKwk6CSdcJycgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OiBFU0MgfCAuKSogJ1wnJworCTsKKworV1MgIDogICAoJyAnfCdcdCd8J1xuJykrCisgICAgOworCitmcmFnbWVudAorUUlEIDoJSUQgKCcuJyBJRCkqCisJOworCQorLyoqIFFJRCBjYW5ub3Qgc2VlIGJleW9uZCBlbmQgb2YgdG9rZW4gc28gdXNpbmcgUUlEICcuKic/IHNvbWV3aGVyZSB3b24ndAorICogIGV2ZXIgbWF0Y2ggc2luY2Ugaz0xIGxvb2thaGVhZCBpbiB0aGUgUUlEIGxvb3Agb2YgJy4nIHdpbGwgbWFrZSBpdCBsb29wLgorICogIEkgbWFkZSB0aGlzIHJ1bGUgdG8gY29tcGVuc2F0ZS4KKyAqLworZnJhZ21lbnQKK1FJRFN0YXIKKwk6CUlEICgnLicgSUQpKiAnLionPworCTsKKworZnJhZ21lbnQKK1RZUEU6ICAgUUlEICdbXSc/CisgICAgOworICAgIAorZnJhZ21lbnQKK0FSRyA6ICAgVFlQRSBXUyBJRAorICAgIDsKKworZnJhZ21lbnQKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisgICAgOworCitmcmFnbWVudAorRVNDCToJJ1xcJyAoJyInfCdcJyd8J1xcJykKKwk7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE5bGV4ZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDE5bGV4ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmJjZjNlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMTlsZXhlci5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDE5bGV4ZXI8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAxOWxleGVyLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHhpbnB1dCA9IFsKKyAgICAgICAgICAgICAgICAiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7IiwKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAicHVibGljIGNsYXNzIE1haW4geyIsCisgICAgICAgICAgICAgICAgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsiLAorICAgICAgICAgICAgICAgICIJICAgIGZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7IiwKKyAgICAgICAgICAgICAgICAiCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzW2ldKTsiLAorICAgICAgICAgICAgICAgICIJCUZ1enp5SmF2YSBsZXggPSBuZXcgRnV6enlKYXZhKGlucHV0KTsiLAorICAgICAgICAgICAgICAgICIJCVRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOyIsCisgICAgICAgICAgICAgICAgIgkJdG9rZW5zLnRvU3RyaW5nKCk7IiwKKyAgICAgICAgICAgICAgICAiCQkvL1N5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMpOyIsCisgICAgICAgICAgICAgICAgIgkgICAgfSIsCisgICAgICAgICAgICAgICAgIgl9IiwKKyAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgIF0uam9pbigiXG4iKTsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMTlsZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHModHN0cmVhbS5nZXRUb2tlbnMoKS5sZW5ndGgsIDM4KTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMTlsZXhlcjwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyMGZ1enp5LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyMGZ1enp5LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWFjMjk2MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIwZnV6enkuZwpAQCAtMCwwICsxLDk1IEBACitsZXhlciBncmFtbWFyIHQwMjBmdXp6eTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgZmlsdGVyPXRydWU7Cit9CisKK0BtZW1iZXJzIHsKK3RoaXMub3V0YnVmID0gW107Cit0aGlzLm91dHB1dCA9IGZ1bmN0aW9uKG1zZykgeworICAgIHRoaXMub3V0YnVmLnB1c2gobXNnKTsKK307Cit9CisKK0lNUE9SVAorCToJJ2ltcG9ydCcgV1MgbmFtZT1RSURTdGFyIFdTPyAnOycKKwk7CisJCisvKiogQXZvaWRzIGhhdmluZyAicmV0dXJuIGZvbzsiIG1hdGNoIGFzIGEgZmllbGQgKi8KK1JFVFVSTgorCToJJ3JldHVybicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9Oi4pKiAnOycKKwk7CisKK0NMQVNTCisJOgknY2xhc3MnIFdTIG5hbWU9SUQgV1M/ICgnZXh0ZW5kcycgV1MgUUlEIFdTPyk/CisJCSgnaW1wbGVtZW50cycgV1MgUUlEIFdTPyAoJywnIFdTPyBRSUQgV1M/KSopPyAneycKKyAgICAgICAge3RoaXMub3V0cHV0KCJmb3VuZCBjbGFzcyAiKyRuYW1lLnRleHQrIlxuIik7fQorCTsKKwkKK01FVEhPRAorICAgIDogICBUWVBFIFdTIG5hbWU9SUQgV1M/ICcoJyAoIEFSRyBXUz8gKCcsJyBXUz8gQVJHIFdTPykqICk/ICcpJyBXUz8gCisgICAgICAgKCd0aHJvd3MnIFdTIFFJRCBXUz8gKCcsJyBXUz8gUUlEIFdTPykqKT8gJ3snCisgICAgICAgIHt0aGlzLm91dHB1dCgiZm91bmQgbWV0aG9kICIrJG5hbWUudGV4dCsiXG4iKTt9CisgICAgOworCitGSUVMRAorICAgIDogICBUWVBFIFdTIG5hbWU9SUQgJ1tdJz8gV1M/ICgnOyd8Jz0nKQorICAgICAgICB7dGhpcy5vdXRwdXQoImZvdW5kIHZhciAiKyRuYW1lLnRleHQrIlxuIik7fQorICAgIDsKKworU1RBVDoJKCdpZid8J3doaWxlJ3wnc3dpdGNoJ3wnZm9yJykgV1M/ICcoJyA7CisJCitDQUxMCisgICAgOiAgIG5hbWU9UUlEIFdTPyAnKCcKKyAgICAgICAge3RoaXMub3V0cHV0KCJmb3VuZCBjYWxsICIrJG5hbWUudGV4dCsiXG4iKTt9CisgICAgOworCitDT01NRU5UCisgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgICAgIHt0aGlzLm91dHB1dCgiZm91bmQgY29tbWVudCAiK3RoaXMuZ2V0VGV4dCgpKyJcbiIpO30KKyAgICA7CisKK1NMX0NPTU1FTlQKKyAgICA6ICAgJy8vJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqICdcbicKKyAgICAgICAge3RoaXMub3V0cHV0KCJmb3VuZCAvLyBjb21tZW50ICIrdGhpcy5nZXRUZXh0KCkrIlxuIik7fQorICAgIDsKKwkKK1NUUklORworCToJJyInIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTogRVNDIHwgLikqICciJworCTsKKworQ0hBUgorCToJJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnXCcnCisJOworCitXUyAgOiAgICgnICd8J1x0J3wnXG4nKSsKKyAgICA7CisKK2ZyYWdtZW50CitRSUQgOglJRCAoJy4nIElEKSoKKwk7CisJCisvKiogUUlEIGNhbm5vdCBzZWUgYmV5b25kIGVuZCBvZiB0b2tlbiBzbyB1c2luZyBRSUQgJy4qJz8gc29tZXdoZXJlIHdvbid0CisgKiAgZXZlciBtYXRjaCBzaW5jZSBrPTEgbG9va2FoZWFkIGluIHRoZSBRSUQgbG9vcCBvZiAnLicgd2lsbCBtYWtlIGl0IGxvb3AuCisgKiAgSSBtYWRlIHRoaXMgcnVsZSB0byBjb21wZW5zYXRlLgorICovCitmcmFnbWVudAorUUlEU3RhcgorCToJSUQgKCcuJyBJRCkqICcuKic/CisJOworCitmcmFnbWVudAorVFlQRTogICBRSUQgJ1tdJz8KKyAgICA7CisgICAgCitmcmFnbWVudAorQVJHIDogICBUWVBFIFdTIElECisgICAgOworCitmcmFnbWVudAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICA7CisKK2ZyYWdtZW50CitFU0MJOgknXFwnICgnIid8J1wnJ3wnXFwnKQorCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIwZnV6enkuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIwZnV6enkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMTkxNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjBmdXp6eS5odG1sCkBAIC0wLDAgKzEsNjIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDIwZnV6enk8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAyMGZ1enp5LmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIHRlc3RWYWxpZCgpIHsKKyAgICAgICAgdmFyIHhpbnB1dCA9IFsKKyAgICAgICAgICAgICAgICAiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7IiwKKyAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAicHVibGljIGNsYXNzIE1haW4geyIsCisgICAgICAgICAgICAgICAgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsiLAorICAgICAgICAgICAgICAgICIJICAgIGZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7IiwKKyAgICAgICAgICAgICAgICAiCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzW2ldKTsiLAorICAgICAgICAgICAgICAgICIJCUZ1enp5SmF2YSBsZXggPSBuZXcgRnV6enlKYXZhKGlucHV0KTsiLAorICAgICAgICAgICAgICAgICIJCVRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOyIsCisgICAgICAgICAgICAgICAgIgkJdG9rZW5zLnRvU3RyaW5nKCk7IiwKKyAgICAgICAgICAgICAgICAiCQkvL1N5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMpOyIsCisgICAgICAgICAgICAgICAgIgkgICAgfSIsCisgICAgICAgICAgICAgICAgIgl9IiwKKyAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgIF0uam9pbigiXG4iKSwKKyAgICAgICAgICAgIHhvdXRwdXQgPSBbCisgICAgICAgICAgICAgICAgImZvdW5kIGNsYXNzIE1haW4iLAorICAgICAgICAgICAgICAgICJmb3VuZCBtZXRob2QgbWFpbiIsCisgICAgICAgICAgICAgICAgImZvdW5kIHZhciBpIiwKKyAgICAgICAgICAgICAgICAiZm91bmQgdmFyIGlucHV0IiwKKyAgICAgICAgICAgICAgICAiZm91bmQgY2FsbCBBTlRMUkZpbGVTdHJlYW0iLAorICAgICAgICAgICAgICAgICJmb3VuZCB2YXIgbGV4IiwKKyAgICAgICAgICAgICAgICAiZm91bmQgY2FsbCBGdXp6eUphdmEiLAorICAgICAgICAgICAgICAgICJmb3VuZCB2YXIgdG9rZW5zIiwKKyAgICAgICAgICAgICAgICAiZm91bmQgY2FsbCBDb21tb25Ub2tlblN0cmVhbSIsCisgICAgICAgICAgICAgICAgImZvdW5kIGNhbGwgdG9rZW5zLnRvU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAiZm91bmQgLy8gY29tbWVudCAvL1N5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMpO1xuIgorICAgICAgICAgICAgXTsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjBmdXp6eShjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgaTsKKworICAgICAgICBhc3NlcnRFcXVhbHModHN0cmVhbS5nZXRUb2tlbnMoKS5sZW5ndGgsIDM2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxleGVyLm91dGJ1Zi5sZW5ndGgsIHhvdXRwdXQubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpPTA7IGk8eG91dHB1dC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGxleGVyLm91dGJ1ZltpXSwgeG91dHB1dFtpXSsiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAyMGZ1enp5PC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIxaG9pc3QuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIxaG9pc3QuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MzNjOGQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjFob2lzdC5nCkBAIC0wLDAgKzEsMzcgQEAKK2dyYW1tYXIgdDAyMWhvaXN0Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KKworLyogV2l0aCB0aGlzIHRydWUsIGVudW0gaXMgc2VlbiBhcyBhIGtleXdvcmQuICBGYWxzZSwgaXQncyBhbiBpZGVudGlmaWVyICovCitAbWVtYmVycyB7Cit0aGlzLmVuYWJsZUVudW0gPSBmYWxzZTsKK30KKworc3RhdCByZXR1cm5zIFtlbnVtSXNdCisgICAgOiBpZGVudGlmaWVyICAgIHtlbnVtSXMgPSAiSUQifQorICAgIHwgZW51bUFzS2V5d29yZCB7ZW51bUlzID0gImtleXdvcmQifQorICAgIDsKKworaWRlbnRpZmllcgorICAgIDogSUQKKyAgICB8IGVudW1Bc0lECisgICAgOworCitlbnVtQXNLZXl3b3JkIDoge3RoaXMuZW5hYmxlRW51bX0/ICdlbnVtJyA7CisKK2VudW1Bc0lEIDogeyF0aGlzLmVuYWJsZUVudW19PyAnZW51bScgOworCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOO30KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjFob2lzdC5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjFob2lzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1Yjg4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyMWhvaXN0Lmh0bWwKQEAgLTAsMCArMSw0NyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMjFob2lzdDwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDIxaG9pc3RMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDIxaG9pc3RQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiZW51bSIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAyMWhvaXN0TGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyB0MDIxaG9pc3RQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgcGFyc2VyLmVuYWJsZUVudW0gPSB0cnVlOworICAgICAgICB2YXIgZW51bUlzID0gcGFyc2VyLnN0YXQoKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscyhlbnVtSXMsICJrZXl3b3JkIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMigpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImVudW0iKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjFob2lzdExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgdDAyMWhvaXN0UGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHBhcnNlci5lbmFibGVFbnVtID0gZmFsc2U7CisgICAgICAgIHZhciBlbnVtSXMgPSBwYXJzZXIuc3RhdCgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudW1JcywgIklEIik7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDIxaG9pc3Q8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjJzY29wZXMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIyc2NvcGVzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTVlNTBkNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIyc2NvcGVzLmcKQEAgLTAsMCArMSwxMzIgQEAKK2dyYW1tYXIgdDAyMnNjb3BlczsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KKworLyogZ2xvYmFsIHNjb3BlcyAqLworCitzY29wZSBhU2NvcGUgeworbmFtZXMKK30KKworYQorc2NvcGUgYVNjb3BlOworICAgIDogICB7JGFTY29wZTo6bmFtZXMgPSBbXTt9IElEKgorICAgIDsKKworCisvKiBydWxlIHNjb3BlcywgZnJvbSB0aGUgYm9vaywgZmluYWwgYmV0YSwgcC4xNDcgKi8KKworYlt2XQorc2NvcGUge3h9CisgICAgOiB7JGI6OnggPSB2O30gYjIKKyAgICA7CisKK2IyCisgICAgOiBiMworICAgIDsKKworYjMgCisgICAgOiB7JGI6Onh9Pz0+IElEIC8vIG9ubHkgdmlzaWJsZSwgaWYgYiB3YXMgY2FsbGVkIHdpdGggVHJ1ZQorICAgIHwgTlVNCisgICAgOworCisKKy8qIHJ1bGUgc2NvcGVzLCBmcm9tIHRoZSBib29rLCBmaW5hbCBiZXRhLCBwLjE0OCAqLworCitjIHJldHVybnMgW3Jlc10KK3Njb3BlIHsKKyAgICBzeW1ib2xzCit9CitAaW5pdCB7CisgICAgJGM6OnN5bWJvbHMgPSB7fTsKK30KKyAgICA6ICd7JyBjMSogYzIrICd9JworICAgICAgICB7ICRyZXMgPSAkYzo6c3ltYm9sczsgfQorICAgIDsKKworYzEKKyAgICA6ICdpbnQnIElEIHskYzo6c3ltYm9sc1skSUQudGV4dF0gPSB0cnVlO30gJzsnCisgICAgOworCitjMgorICAgIDogSUQgJz0nIE5VTSAnOycKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEgJGM6OnN5bWJvbHNbJElELnRleHRdKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCRJRC50ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIDsKKworLyogcmVjdXJzaXZlIHJ1bGUgc2NvcGVzLCBmcm9tIHRoZSBib29rLCBmaW5hbCBiZXRhLCBwLjE1MCAqLworCitkIHJldHVybnMgW3Jlc10KK3Njb3BlIHsKKyAgICBzeW1ib2xzCit9CitAaW5pdCB7CisgICAgJGQ6OnN5bWJvbHMgPSB7fTsKK30KKyAgICA6ICd7JyBkMSogZDIqICd9JworICAgICAgICB7ICRyZXMgPSAkZDo6c3ltYm9sczsgfQorICAgIDsKKworZDEKKyAgICA6ICdpbnQnIElEIHskZDo6c3ltYm9sc1skSUQudGV4dF0gPSB0cnVlO30gJzsnCisgICAgOworCitkMgorICAgIDogSUQgJz0nIE5VTSAnOycKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGksIGlzRGVmaW5lZDsKKyAgICAgICAgICAgIGZvciAoaT0kZC5sZW5ndGgtMSwgaXNEZWZpbmVkPWZhbHNlOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoJGRbaV06OnN5bWJvbHNbJElELnRleHRdKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNEZWZpbmVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmRlZmluZWQgdmFyaWFibGUgIiskSUQudGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB8IGQKKyAgICA7CisKKy8qIHJlY3Vyc2l2ZSBydWxlIHNjb3BlcywgYWNjZXNzIGJvdHRvbS1tb3N0IHNjb3BlICovCisKK2UgcmV0dXJucyBbcmVzXQorc2NvcGUgeworICAgIGEKK30KK0BhZnRlciB7CisgICAgJHJlcyA9ICRlOjphOworfQorICAgIDogTlVNIHsgJGVbMF06OmEgPSBwYXJzZUludCgkTlVNLnRleHQsIDEwKTsgfQorICAgIHwgJ3snIGUgJ30nCisgICAgOworCisKKy8qIHJlY3Vyc2l2ZSBydWxlIHNjb3BlcywgYWNjZXNzIHdpdGggbmVnYXRpdmUgaW5kZXggKi8KKworZiByZXR1cm5zIFtyZXNdCitzY29wZSB7CisgICAgYQorfQorQGFmdGVyIHsKKyAgICAkcmVzID0gJGY6OmE7Cit9CisgICAgOiBOVU0geyB2YXIgbGVuID0gJGYubGVuZ3RoLTI7ICRmW2xlbj49MCA/IGxlbiA6IDBdOjphID0gcGFyc2VJbnQoJE5VTS50ZXh0LCAxMCk7IH0KKyAgICB8ICd7JyBmICd9JworICAgIDsKKworCisvKiB0b2tlbnMgKi8KK0lEICA6ICAgKCdhJy4uJ3onKSsKKyAgICA7CisKK05VTSA6ICAgKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCcgJ3wnXG4nfCdccicpKyB7JGNoYW5uZWw9SElEREVOO30KKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyMnNjb3Blcy5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjJzY29wZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NTZjNGJjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjJzY29wZXMuaHRtbApAQCAtMCwwICsxLDE2NyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMjJzY29wZXM8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAyMnNjb3Blc0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMjJzY29wZXNQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwMjJzY29wZXNQYXJzZXIsIHsKKyAgICAgICAgZW1pdEVycm9yTWVzc2FnZTogZnVuY3Rpb24obXNnKSB7fSwKKyAgICAgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKGUpIHsgdGhyb3cgZTsgfQorICAgIH0pOworCisKKyAgICBmdW5jdGlvbiB0ZXN0YTEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb29iYXIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjJzY29wZXNMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgLy8ganVzdCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBlcnJvcnMKKyAgICAgICAgcGFyc2VyLmEoKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0YjEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb29iYXIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjJzY29wZXNMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5iKGZhbHNlKTsKKyAgICAgICAgICAgIGZhaWwoImFib3ZlIHNob3VsZCBoYXZlIHRocm93IGVycm9yIik7CisgICAgICAgIH0gY2F0Y2goZSkgeworICAgICAgICAgICAgYXNzZXJ0KG9yZy5hbnRsci5sYW5nLmlzVmFsdWUoZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdGIyKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiZm9vYmFyIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDIyc2NvcGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHBhcnNlci5iKHRydWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RjMSgpIHsKKyAgICAgICAgdmFyIHhpbnB1dCA9IFsKKyAgICAgICAgICAgICJ7IiwKKyAgICAgICAgICAgICIgICBpbnQgaTsiLAorICAgICAgICAgICAgIiAgIGludCBqOyIsCisgICAgICAgICAgICAiICAgaSA9IDA7IiwKKyAgICAgICAgICAgICJ9IgorICAgICAgICBdLmpvaW4oIlxuIik7CisKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjJzY29wZXNMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSksCisgICAgICAgICAgICBpOworCisgICAgICAgIHZhciBzeW1ib2xzID0gcGFyc2VyLmMoKTsKKyAgICAgICAgYXNzZXJ0KHN5bWJvbHMuaSk7CisgICAgICAgIGFzc2VydChzeW1ib2xzLmopOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RjMigpIHsKKyAgICAgICAgdmFyIHhpbnB1dCA9IFsKKyAgICAgICAgICAgICJ7IiwKKyAgICAgICAgICAgICIgICBpbnQgaTsiLAorICAgICAgICAgICAgIiAgIGludCBqOyIsCisgICAgICAgICAgICAiICAgaSA9IDA7IiwKKyAgICAgICAgICAgICIgICB4ID0gNDsiLAorICAgICAgICAgICAgIn0iCisgICAgICAgIF0uam9pbigiXG4iKTsKKworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSh4aW5wdXQpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAyMnNjb3Blc0xleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKSwKKyAgICAgICAgICAgIGk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5jKCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5tZXNzYWdlLCAieCIpOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdGQxKCkgeworICAgICAgICB2YXIgeGlucHV0ID0gWworICAgICAgICAgICAgInsiLAorICAgICAgICAgICAgIiAgIGludCBpOyIsCisgICAgICAgICAgICAiICAgaW50IGo7IiwKKyAgICAgICAgICAgICIgICBpID0gMDsiLAorICAgICAgICAgICAgIiAgIHsiLAorICAgICAgICAgICAgIiAgICAgICBpbnQgaTsiLAorICAgICAgICAgICAgIiAgICAgICBpbnQgeDsiLAorICAgICAgICAgICAgIiAgICAgICB4ID0gNTsiLAorICAgICAgICAgICAgIiAgIH0iLAorICAgICAgICAgICAgIn0iCisgICAgICAgIF0uam9pbigiXG4iKTsKKworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSh4aW5wdXQpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAyMnNjb3Blc0xleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKSwKKyAgICAgICAgICAgIGk7CisKKyAgICAgICAgdmFyIHN5bWJvbHMgPSBwYXJzZXIuZCgpOworICAgICAgICBhc3NlcnQoc3ltYm9scy5pKTsKKyAgICAgICAgYXNzZXJ0KHN5bWJvbHMuaik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdGUxKCkgeworICAgICAgICB2YXIgeGlucHV0ID0gInsgeyB7IHsgMTIgfSB9IH0gfSI7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDIyc2NvcGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciByZXMgPSBwYXJzZXIuZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzLCAxMik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdGYxKCkgeworICAgICAgICB2YXIgeGlucHV0ID0gInsgeyB7IHsgMTIgfSB9IH0gfSI7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDIyc2NvcGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciByZXMgPSBwYXJzZXIuZigpOworICAgICAgICBhc3NlcnRVbmRlZmluZWQocmVzKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0ZjIoKSB7CisgICAgICAgIHZhciB4aW5wdXQgPSAieyB7IDEyIH0gfSI7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDIyc2NvcGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciByZXMgPSBwYXJzZXIuZigpOworICAgICAgICBhc3NlcnRVbmRlZmluZWQocmVzKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMjJzY29wZXM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjNzY29wZXMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIzc2NvcGVzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjgwZTBkMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIzc2NvcGVzLmcKQEAgLTAsMCArMSwxOCBAQAorZ3JhbW1hciB0MDIzc2NvcGVzOworCitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworfQorCitwcm9nCitzY29wZSB7CituYW1lCit9CisgICAgOiAgIElEIHskcHJvZzo6bmFtZT0kSUQudGV4dDt9CisgICAgOworCitJRCAgOiAgICgnYScuLid6JykrCisgICAgOworCitXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPW9yZy5hbnRsci5ydW50aW1lLkJhc2VSZWNvZ25pemVyLkhJRERFTjt9CisgICAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjNzY29wZXMuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIzc2NvcGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTIyZDRhNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDIzc2NvcGVzLmh0bWwKQEAgLTAsMCArMSwzOSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMjNzY29wZXM8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAyM3Njb3Blc0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMjNzY29wZXNQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwMjNzY29wZXNQYXJzZXIpOworCisKKyAgICBmdW5jdGlvbiB0ZXN0YTEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb29iYXIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjNzY29wZXNMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgLy8ganVzdCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBlcnJvcnMKKyAgICAgICAgcGFyc2VyLnByb2coKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMjNzY29wZXM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjRmaW5hbGx5LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNGZpbmFsbHkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjBkZWIwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjRmaW5hbGx5LmcKQEAgLTAsMCArMSwxOSBAQAorZ3JhbW1hciB0MDI0ZmluYWxseTsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KKworcHJvZyByZXR1cm5zIFtldmVudHNdCitAaW5pdCB7ZXZlbnRzID0gW107fQorQGFmdGVyIHtldmVudHMucHVzaCgnYWZ0ZXInKTt9CisgICAgOiAgIElEIHt0aHJvdyBuZXcgRXJyb3IoInF1dXgiKTt9CisgICAgOworICAgIGNhdGNoIFtlXSB7ZXZlbnRzLnB1c2goJ2NhdGNoJyk7fQorICAgIGZpbmFsbHkge2V2ZW50cy5wdXNoKCdmaW5hbGx5Jyk7fQorCitJRCAgOiAgICgnYScuLid6JykrCisgICAgOworCitXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPW9yZy5hbnRsci5ydW50aW1lLkJhc2VSZWNvZ25pemVyLkhJRERFTn0KKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNGZpbmFsbHkuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI0ZmluYWxseS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5ODA1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNGZpbmFsbHkuaHRtbApAQCAtMCwwICsxLDM5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAyNGZpbmFsbHk8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAyNGZpbmFsbHlMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDI0ZmluYWxseVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUUGFyc2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRQYXJzZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH0KKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDAyNGZpbmFsbHlQYXJzZXIpOworCisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiZm9vYmFyIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDI0ZmluYWxseUxleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICB2YXIgZXZlbnRzID0gcGFyc2VyLnByb2coKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoZXZlbnRzLCBbImNhdGNoIiwgImZpbmFsbHkiXSk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDI0ZmluYWxseTwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTJlMWFjNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWYuZwpAQCAtMCwwICsxLDE4IEBACitsZXhlciBncmFtbWFyIHQwMjVsZXhlclJ1bGVQcm9wZXJ0eVJlZjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK0BsZXhlcjo6aW5pdCB7Cit0aGlzLnByb3BlcnRpZXMgPSBbXTsKK30KKworSURFTlRJRklFUjogCisgICAgICAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgICAgICB7Cit0aGlzLnByb3BlcnRpZXMucHVzaCgKKyAgICBbJHRleHQsICR0eXBlLCAkbGluZSwgJHBvcywgJGluZGV4LCAkY2hhbm5lbCwgJHN0YXJ0LCAkc3RvcF0KKyk7CisgICAgICAgIH0KKyAgICA7CitXUzogKCcgJyB8ICdcbicpKzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWYuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTZmNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjVsZXhlclJ1bGVQcm9wZXJ0eVJlZi5odG1sCkBAIC0wLDAgKzEsNzIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWY8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImZvb2JhciBfQWI5OCBcbiBBMTJzZGYiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjVsZXhlclJ1bGVQcm9wZXJ0eVJlZihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpPT09b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMobGV4ZXIucHJvcGVydGllcy5sZW5ndGgsIDMpOworCisgICAgICAgIHZhciBwMSA9IFsKKyAgICAgICAgICAgICJmb29iYXIiLAorICAgICAgICAgICAgbGV4ZXIuSURFTlRJRklFUiwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgLTEsCisgICAgICAgICAgICBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5ERUZBVUxUX0NIQU5ORUwsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgNQorICAgICAgICBdOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhsZXhlci5wcm9wZXJ0aWVzWzBdLCBwMSk7CisKKyAgICAgICAgdmFyIHAyID0gWworICAgICAgICAgICAgIl9BYjk4IiwKKyAgICAgICAgICAgIGxleGVyLklERU5USUZJRVIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgNywKKyAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uREVGQVVMVF9DSEFOTkVMLAorICAgICAgICAgICAgNywKKyAgICAgICAgICAgIDExCisgICAgICAgIF07CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGxleGVyLnByb3BlcnRpZXNbMV0sIHAyKTsKKworICAgICAgICB2YXIgcDMgPSBbCisgICAgICAgICAgICAiQTEyc2RmIiwKKyAgICAgICAgICAgIGxleGVyLklERU5USUZJRVIsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uREVGQVVMVF9DSEFOTkVMLAorICAgICAgICAgICAgMTUsCisgICAgICAgICAgICAyMAorICAgICAgICBdOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhsZXhlci5wcm9wZXJ0aWVzWzJdLCBwMyk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWY8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjZhY3Rpb25zLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNmFjdGlvbnMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNzk5OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjZhY3Rpb25zLmcKQEAgLTAsMCArMSw0MSBAQAorZ3JhbW1hciB0MDI2YWN0aW9uczsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK0BsZXhlcjo6aW5pdCB7CisgICAgdGhpcy54bG9nID0gW107CisgICAgdGhpcy5mb29iYXIgPSAiYXR0cmlidXRlOyI7Cit9CisKK3Byb2cKK0Bpbml0IHsKKyAgICB0aGlzLnhsb2cgPSBbXTsKKyAgICB0aGlzLnhsb2cucHVzaCgiaW5pdDsiKTsKK30KK0BhZnRlciB7CisgICAgdGhpcy54bG9nLnB1c2goImFmdGVyOyIpOworfQorICAgIDogICBJREVOVElGSUVSIEVPRgorICAgIDsKKyAgICBjYXRjaCBbIGV4YyBdIHsKKyAgICAgICAgdGhpcy54bG9nLnB1c2goImNhdGNoOyIpOworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKyAgICB9CisgICAgZmluYWxseSB7CisgICAgICAgIHRoaXMueGxvZy5wdXNoKCJmaW5hbGx5OyIpOworICAgIH0KKworCitJREVOVElGSUVSCisgICAgOiAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSoKKyAgICAgICAgeworICAgICAgICAgIC8vIGEgY29tbWVudAorICAgICAgICAgIHRoaXMueGxvZy5wdXNoKCJhY3Rpb247Iik7CisgICAgICAgICAgdGhpcy54bG9nLnB1c2goWyR0ZXh0LCAkdHlwZSwgJGxpbmUsICRwb3MsICRpbmRleCwgJGNoYW5uZWwsICRzdGFydCwgJHN0b3BdLmpvaW4oIiAiKSk7CisgICAgICAgICAgaWYgKHRydWUpCisgICAgICAgICAgICAgIHRoaXMueGxvZy5wdXNoKHRoaXMuZm9vYmFyKTsKKyAgICAgICAgfQorICAgIDsKKworV1M6ICgnICcgfCAnXG4nKSs7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNmFjdGlvbnMuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI2YWN0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxOTIzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyNmFjdGlvbnMuaHRtbApAQCAtMCwwICsxLDM2IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAyNmFjdGlvbnM8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAyNmFjdGlvbnNMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDI2YWN0aW9uc1BhcnNlci5qcyI+PC9zY3JpcHQ+CisKKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImZvb2JhciBfQWI5OCBcbiBBMTJzZGYiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjZhY3Rpb25zTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IHQwMjZhY3Rpb25zUGFyc2VyKHRzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgcGFyc2VyLmVtaXRFcnJvck1lc3NhZ2UgPSBmdW5jdGlvbigpIHt9OworICAgICAgICBwYXJzZXIucHJvZygpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhwYXJzZXIueGxvZywgWyJpbml0OyIsICJhZnRlcjsiLCAiZmluYWxseTsiXSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGxleGVyLnhsb2csIFsiYWN0aW9uOyIsICJmb29iYXIgNCAxIDAgLTEgMCAwIDUiLCAiYXR0cmlidXRlOyIsICJhY3Rpb247IiwgIl9BYjk4IDQgMSA3IC0xIDAgNyAxMSIsICJhdHRyaWJ1dGU7IiwgImFjdGlvbjsiLCAiQTEyc2RmIDQgMiAxIC0xIDAgMTUgMjAiLCAiYXR0cmlidXRlOyJdKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMjZhY3Rpb25zPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI3ZW9mLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyN2VvZi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxNTA0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyN2VvZi5nCkBAIC0wLDAgKzEsOCBAQAorbGV4ZXIgZ3JhbW1hciB0MDI3ZW9mOworCitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworfQorCitFTkQ6ICdcdTAwMDAnOworU1BBQ0U6ICcgJzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI3ZW9mLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyN2VvZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhNGY3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyN2VvZi5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDI3ZW9mPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMjdlb2YuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMSgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiIFx1MDAwMCIpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgdDAyN2VvZihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2VuLmdldFR5cGUoKSwgbGV4ZXIuU1BBQ0UpOworCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0b2tlbi5nZXRUeXBlKCksIGxleGVyLkVORCk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDI3ZW9mPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI5c3lucHJlZGdhdGUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDI5c3lucHJlZGdhdGUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjE1NjFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjlzeW5wcmVkZ2F0ZS5nCkBAIC0wLDAgKzEsMTYgQEAKK2xleGVyIGdyYW1tYXIgdDAyOXN5bnByZWRnYXRlOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworRk9PCisgICAgOiAoJ2FiJyk9PkEKKyAgICB8ICgnYWMnKT0+QgorICAgIDsKKworZnJhZ21lbnQKK0E6ICdhJzsKKworZnJhZ21lbnQKK0I6ICdhJzsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjlzeW5wcmVkZ2F0ZS5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMjlzeW5wcmVkZ2F0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMzE2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAyOXN5bnByZWRnYXRlLmh0bWwKQEAgLTAsMCArMSwyOSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMjlzeW5wcmVkZ2F0ZTwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDI5c3lucHJlZGdhdGUuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMSgpIHsKKyAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiYWMiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMjlzeW5wcmVkZ2F0ZShzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMjlzeW5wcmVkZ2F0ZTwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzMHNwZWNpYWxTdGF0ZXMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMwc3BlY2lhbFN0YXRlcy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0MzkwZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzMHNwZWNpYWxTdGF0ZXMuZwpAQCAtMCwwICsxLDIyIEBACitncmFtbWFyIHQwMzBzcGVjaWFsU3RhdGVzOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworQG1lbWJlcnMgewordGhpcy5yZWNvdmVyID0gZnVuY3Rpb24oaW5wdXQsIHJlKSB7CisgICAgdGhyb3cgcmU7Cit9OworfQorCityCisgICAgOiAoIHt0aGlzLmNvbmR9PyBOQU1FCisgICAgICAgIHwgeyF0aGlzLmNvbmR9PyBOQU1FIFdTKyBOQU1FCisgICAgICAgICkKKyAgICAgICAgKCBXUysgTkFNRSApPworICAgICAgICBFT0YKKyAgICA7CisKK05BTUU6ICgnYScuLid6JykgKCdhJy4uJ3onIHwgJzAnLi4nOScpKzsKK05VTUJFUjogKCcwJy4uJzknKSs7CitXUzogJyAnKzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMwc3BlY2lhbFN0YXRlcy5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzBzcGVjaWFsU3RhdGVzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZiYTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMwc3BlY2lhbFN0YXRlcy5odG1sCkBAIC0wLDAgKzEsNjkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDMwc3BlY2lhbFN0YXRlczwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDMwc3BlY2lhbFN0YXRlc0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzBzcGVjaWFsU3RhdGVzUGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5jb25kID0gdHJ1ZTsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUUGFyc2VyLCB0MDMwc3BlY2lhbFN0YXRlc1BhcnNlcik7CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb28iKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzBzcGVjaWFsU3RhdGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciBldmVudHMgPSBwYXJzZXIucigpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDIoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb28gbmFtZTEiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzBzcGVjaWFsU3RhdGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciBldmVudHMgPSBwYXJzZXIucigpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDMoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJiYXIgbmFtZTEiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzBzcGVjaWFsU3RhdGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHBhcnNlci5jb25kID0gZmFsc2U7CisgICAgICAgIHZhciBldmVudHMgPSBwYXJzZXIucigpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDQoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJiYXIgbmFtZTEgbmFtZTIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzBzcGVjaWFsU3RhdGVzTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHBhcnNlci5jb25kID0gZmFsc2U7CisgICAgICAgIHZhciBldmVudHMgPSBwYXJzZXIucigpOworICAgIH0KKworPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDMwc3BlY2lhbFN0YXRlczwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzMWVtcHR5QWx0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzMWVtcHR5QWx0LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFhNzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMxZW1wdHlBbHQuZwpAQCAtMCwwICsxLDE2IEBACitncmFtbWFyIHQwMzFlbXB0eUFsdDsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK3IKKyAgICA6IE5BTUUgCisgICAgICAgICgge3RoaXMuY29uZH0/PT4gV1MrIE5BTUUKKyAgICAgICAgfCAKKyAgICAgICAgKQorICAgICAgICBFT0YKKyAgICA7CisKK05BTUU6ICgnYScuLid6JykgKCdhJy4uJ3onIHwgJzAnLi4nOScpKzsKK05VTUJFUjogKCcwJy4uJzknKSs7CitXUzogJyAnKzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMxZW1wdHlBbHQuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMxZW1wdHlBbHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjNjZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzFlbXB0eUFsdC5odG1sCkBAIC0wLDAgKzEsNjkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDMxZW1wdHlBbHQ8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzMWVtcHR5QWx0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzMWVtcHR5QWx0UGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdGhpcy5jb25kID0gdHJ1ZTsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUUGFyc2VyLCB0MDMxZW1wdHlBbHRQYXJzZXIsIHsKKyAgICAgICAgZW1pdEVycm9yTWVzc2FnZTogZnVuY3Rpb24oKSB7IC8qIGRvbid0IHJlcG9ydCBlcnJvcnMgKi8gfSwKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb28iKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzFlbXB0eUFsdExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICBwYXJzZXIuY29uZCA9IGZhbHNlOworICAgICAgICBwYXJzZXIucigpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDIoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJmb28gIGpmZWY5amZlODhkIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDMxZW1wdHlBbHRMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgcGFyc2VyLmNvbmQgPSB0cnVlOworICAgICAgICBwYXJzZXIucigpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RJbnZhbGlkMSgpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImZvbyBiYXIiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzFlbXB0eUFsdExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLmNvbmQgPSBmYWxzZTsKKyAgICAgICAgICAgIHBhcnNlci5yKCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGRuJ3QgcmVhY2ggaGVyZSIpOworICAgICAgICB9IGNhdGNoKGUpIHt9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDMxZW1wdHlBbHQ8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzJzdWJydWxlUHJlZGljdC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzJzdWJydWxlUHJlZGljdC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5NDc1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzMnN1YnJ1bGVQcmVkaWN0LmcKQEAgLTAsMCArMSw4IEBACitncmFtbWFyIHQwMzJzdWJydWxlUHJlZGljdDsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK2E6ICdCRUdJTicgYiBXUysgJ0VORCc7CitiOiAoIFdTKyAnQScgKSs7CitXUzogJyAnOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzJzdWJydWxlUHJlZGljdC5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzJzdWJydWxlUHJlZGljdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwYzI5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzMnN1YnJ1bGVQcmVkaWN0Lmh0bWwKQEAgLTAsMCArMSw1NyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMzJzdWJydWxlUHJlZGljdDwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDMyc3VicnVsZVByZWRpY3RMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDMyc3VicnVsZVByZWRpY3RQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmNvbmQgPSB0cnVlOworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwMzJzdWJydWxlUHJlZGljdFBhcnNlciwgeworICAgICAgICBlbWl0RXJyb3JNZXNzYWdlOiBmdW5jdGlvbigpIHsgLyogZG9uJ3QgcmVwb3J0IGVycm9ycyAqLyB9LAorICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMSgpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oIkJFR0lOIEEgRU5EIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDMyc3VicnVsZVByZWRpY3RMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgcGFyc2VyLmEoKTsKKyAgICB9CisKKyAgICAvKiBAdG9kbyBERkEgZG9lc24ndCBjYXRjaCBFT0YgdHJhbnNpdGlvbiBjb3JyZWN0bHkuICBMb29rcyBsaWtlIGFuIGFuYWx5c2lzCisgICAgICogYnVnIGluIHRoZSBBTlRMUiBUb29sLgorICAgIGZ1bmN0aW9uIFtyZW1vdmVddGVzdFZhbGlkMigpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oIiBBIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyB0MDMyc3VicnVsZVByZWRpY3RMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgcGFyc2VyLmIoKTsKKyAgICB9CisgICAgKi8KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDAzMnN1YnJ1bGVQcmVkaWN0PC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMzYmFja3RyYWNraW5nLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzM2JhY2t0cmFja2luZy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwOTNjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzM2JhY2t0cmFja2luZy5nCkBAIC0wLDAgKzEsNTE5IEBACitncmFtbWFyIHQwMzNiYWNrdHJhY2tpbmc7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIGJhY2t0cmFjaz10cnVlOworICAgIG1lbW9pemU9dHJ1ZTsKKyAgICBrPTI7Cit9CisKK3Njb3BlIFN5bWJvbHMgeworCXR5cGVzOworfQorCitAbWVtYmVycyB7Cit0aGlzLmlzVHlwZU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7CisgICAgdmFyIGksIHNjb3BlOworICAgIGZvciAoaT10aGlzLlN5bWJvbHNfc3RhY2subGVuZ3RoLTE7IGk+PTA7IGktLSkgeworICAgICAgICBzY29wZSA9IHRoaXMuU3ltYm9sc19zdGFja1tpXTsKKyAgICAgICAgaWYgKCFvcmcuYW50bHIubGFuZy5pc1VuZGVmaW5lZChzY29wZS50eXBlc1tuYW1lXSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK307Cit9CisKK3RyYW5zbGF0aW9uX3VuaXQKK3Njb3BlIFN5bWJvbHM7IC8vIGVudGlyZSBmaWxlIGlzIGEgc2NvcGUKK0Bpbml0IHsKKyAgJFN5bWJvbHM6OnR5cGVzID0ge307Cit9CisJOiBleHRlcm5hbF9kZWNsYXJhdGlvbisKKwk7CisKKy8qKiBFaXRoZXIgYSBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGFueSBvdGhlciBraW5kIG9mIEMgZGVjbC9kZWYuCisgKiAgVGhlIExMKCopIGFuYWx5c2lzIGFsZ29yaXRobSBmYWlscyB0byBkZWFsIHdpdGggdGhpcyBkdWUgdG8KKyAqICByZWN1cnNpb24gaW4gdGhlIGRlY2xhcmF0b3IgcnVsZXMuICBJJ20gcHV0dGluZyBpbiBhCisgKiAgbWFudWFsIHByZWRpY2F0ZSBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgYmFja3RyYWNrIG92ZXIKKyAqICB0aGUgZW50aXJlIGZ1bmN0aW9uLiAgRnVydGhlciwgeW91IGdldCBhIGJldHRlciBlcnJvcgorICogIGFzIGVycm9ycyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiBkb24ndCBtYWtlIGl0IGZhaWwKKyAqICB0byBwcmVkaWN0IHRoYXQgaXQncyBhIGZ1bmN0aW9uLiAgV2VpcmQgZXJyb3JzIHByZXZpb3VzbHkuCisgKiAgUmVtZW1iZXI6IHRoZSBnb2FsIGlzIHRvIGF2b2lkIGJhY2t0cmFjayBsaWtlIHRoZSBwbGFndWUKKyAqICBiZWNhdXNlIGl0IG1ha2VzIGRlYnVnZ2luZywgYWN0aW9ucywgYW5kIGVycm9ycyBoYXJkZXIuCisgKgorICogIE5vdGUgdGhhdCBrPTEgcmVzdWx0cyBpbiBhIG11Y2ggc21hbGxlciBwcmVkaWN0b3IgZm9yIHRoZSAKKyAqICBmaXhlZCBsb29rYWhlYWQ7IGs9MiBtYWRlIGEgZmV3IGV4dHJhIHRob3VzYW5kIGxpbmVzLiA7KQorICogIEknbGwgaGF2ZSB0byBvcHRpbWl6ZSB0aGF0IGluIHRoZSBmdXR1cmUuCisgKi8KK2V4dGVybmFsX2RlY2xhcmF0aW9uCitvcHRpb25zIHtrPTE7fQorCTogKCBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzPyBkZWNsYXJhdG9yIGRlY2xhcmF0aW9uKiAneycgKT0+IGZ1bmN0aW9uX2RlZmluaXRpb24KKwl8IGRlY2xhcmF0aW9uCisJOworCitmdW5jdGlvbl9kZWZpbml0aW9uCitzY29wZSBTeW1ib2xzOyAvLyBwdXQgcGFyYW1ldGVycyBhbmQgbG9jYWxzIGludG8gc2FtZSBzY29wZSBmb3Igbm93CitAaW5pdCB7CisgICRTeW1ib2xzOjp0eXBlcyA9IHNldCgpCit9CisJOglkZWNsYXJhdGlvbl9zcGVjaWZpZXJzPyBkZWNsYXJhdG9yCisvLyAJCSgJZGVjbGFyYXRpb24rIGNvbXBvdW5kX3N0YXRlbWVudAkvLyBLJlIgc3R5bGUKKy8vIAkJfAljb21wb3VuZF9zdGF0ZW1lbnQJCQkJLy8gQU5TSSBzdHlsZQorLy8gCQkpCisJOworCitkZWNsYXJhdGlvbgorc2NvcGUgeworICBpc1R5cGVkZWY7Cit9CitAaW5pdCB7CisgICRkZWNsYXJhdGlvbjo6aXNUeXBlZGVmID0gZmFsc2U7Cit9CisJOiAndHlwZWRlZicgZGVjbGFyYXRpb25fc3BlY2lmaWVycz8geyRkZWNsYXJhdGlvbjo6aXNUeXBlZGVmID0gdHJ1ZTt9CisJICBpbml0X2RlY2xhcmF0b3JfbGlzdCAnOycgLy8gc3BlY2lhbCBjYXNlLCBsb29raW5nIGZvciB0eXBlZGVmCQorCXwgZGVjbGFyYXRpb25fc3BlY2lmaWVycyBpbml0X2RlY2xhcmF0b3JfbGlzdD8gJzsnCisJOworCitkZWNsYXJhdGlvbl9zcGVjaWZpZXJzCisJOiAgICggICBzdG9yYWdlX2NsYXNzX3NwZWNpZmllcgorCQl8ICAgdHlwZV9zcGVjaWZpZXIKKyAgICAgICAgfCAgIHR5cGVfcXVhbGlmaWVyCisgICAgICAgICkrCisJOworCitpbml0X2RlY2xhcmF0b3JfbGlzdAorCTogaW5pdF9kZWNsYXJhdG9yICgnLCcgaW5pdF9kZWNsYXJhdG9yKSoKKwk7CisKK2luaXRfZGVjbGFyYXRvcgorCTogZGVjbGFyYXRvciAvLygnPScgaW5pdGlhbGl6ZXIpPworCTsKKworc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIKKwk6ICdleHRlcm4nCisJfCAnc3RhdGljJworCXwgJ2F1dG8nCisJfCAncmVnaXN0ZXInCisJOworCit0eXBlX3NwZWNpZmllcgorCTogJ3ZvaWQnCisJfCAnY2hhcicKKwl8ICdzaG9ydCcKKwl8ICdpbnQnCisJfCAnbG9uZycKKwl8ICdmbG9hdCcKKwl8ICdkb3VibGUnCisJfCAnc2lnbmVkJworCXwgJ3Vuc2lnbmVkJworLy8gCXwgc3RydWN0X29yX3VuaW9uX3NwZWNpZmllcgorLy8gCXwgZW51bV9zcGVjaWZpZXIKKwl8IHR5cGVfaWQKKwk7CisKK3R5cGVfaWQKKyAgICA6ICAge3RoaXMuaXNUeXBlTmFtZSh0aGlzLmlucHV0LkxUKDEpLmdldFRleHQoKSl9PyBJREVOVElGSUVSCisvLyAgICAJe1N5c3RlbS5vdXQucHJpbnRsbigkSURFTlRJRklFUi50ZXh0KyIgaXMgYSB0eXBlIik7fQorICAgIDsKKworLy8gc3RydWN0X29yX3VuaW9uX3NwZWNpZmllcgorLy8gb3B0aW9ucyB7az0zO30KKy8vIHNjb3BlIFN5bWJvbHM7IC8vIHN0cnVjdHMgYXJlIHNjb3BlcworLy8gQGluaXQgeworLy8gICAkU3ltYm9sczo6dHlwZXMgPSBzZXQoKQorLy8gfQorLy8gCTogc3RydWN0X29yX3VuaW9uIElERU5USUZJRVI/ICd7JyBzdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdCAnfScKKy8vIAl8IHN0cnVjdF9vcl91bmlvbiBJREVOVElGSUVSCisvLyAJOworCisvLyBzdHJ1Y3Rfb3JfdW5pb24KKy8vIAk6ICdzdHJ1Y3QnCisvLyAJfCAndW5pb24nCisvLyAJOworCisvLyBzdHJ1Y3RfZGVjbGFyYXRpb25fbGlzdAorLy8gCTogc3RydWN0X2RlY2xhcmF0aW9uKworLy8gCTsKKworLy8gc3RydWN0X2RlY2xhcmF0aW9uCisvLyAJOiBzcGVjaWZpZXJfcXVhbGlmaWVyX2xpc3Qgc3RydWN0X2RlY2xhcmF0b3JfbGlzdCAnOycKKy8vIAk7CisKKy8vIHNwZWNpZmllcl9xdWFsaWZpZXJfbGlzdAorLy8gCTogKCB0eXBlX3F1YWxpZmllciB8IHR5cGVfc3BlY2lmaWVyICkrCisvLyAJOworCisvLyBzdHJ1Y3RfZGVjbGFyYXRvcl9saXN0CisvLyAJOiBzdHJ1Y3RfZGVjbGFyYXRvciAoJywnIHN0cnVjdF9kZWNsYXJhdG9yKSoKKy8vIAk7CisKKy8vIHN0cnVjdF9kZWNsYXJhdG9yCisvLyAJOiBkZWNsYXJhdG9yICgnOicgY29uc3RhbnRfZXhwcmVzc2lvbik/CisvLyAJfCAnOicgY29uc3RhbnRfZXhwcmVzc2lvbgorLy8gCTsKKworLy8gZW51bV9zcGVjaWZpZXIKKy8vIG9wdGlvbnMge2s9Mzt9CisvLyAJOiAnZW51bScgJ3snIGVudW1lcmF0b3JfbGlzdCAnfScKKy8vIAl8ICdlbnVtJyBJREVOVElGSUVSICd7JyBlbnVtZXJhdG9yX2xpc3QgJ30nCisvLyAJfCAnZW51bScgSURFTlRJRklFUgorLy8gCTsKKworLy8gZW51bWVyYXRvcl9saXN0CisvLyAJOiBlbnVtZXJhdG9yICgnLCcgZW51bWVyYXRvcikqCisvLyAJOworCisvLyBlbnVtZXJhdG9yCisvLyAJOiBJREVOVElGSUVSICgnPScgY29uc3RhbnRfZXhwcmVzc2lvbik/CisvLyAJOworCit0eXBlX3F1YWxpZmllcgorCTogJ2NvbnN0JworCXwgJ3ZvbGF0aWxlJworCTsKKworZGVjbGFyYXRvcgorCTogcG9pbnRlcj8gZGlyZWN0X2RlY2xhcmF0b3IKKwl8IHBvaW50ZXIKKwk7CisKK2RpcmVjdF9kZWNsYXJhdG9yCisJOiAgICgJSURFTlRJRklFUgorCQkJeworCQkJaWYgKCRkZWNsYXJhdGlvbi5sZW5ndGggPjAgJiYgJGRlY2xhcmF0aW9uOjppc1R5cGVkZWYpIHsKKwkJCQkkU3ltYm9sczo6dHlwZXNbJElERU5USUZJRVIudGV4dF0gPSB0cnVlOworCQkJCWFsZXJ0ICgiZGVmaW5lIHR5cGUgIiskSURFTlRJRklFUi50ZXh0KTsKKyAgICAgICAgICAgIH0KKwkJCX0KKwkJfAknKCcgZGVjbGFyYXRvciAnKScKKwkJKQorICAgICAgICBkZWNsYXJhdG9yX3N1ZmZpeCoKKwk7CisKK2RlY2xhcmF0b3Jfc3VmZml4CisJOiAgIC8qJ1snIGNvbnN0YW50X2V4cHJlc3Npb24gJ10nCisgICAgfCovICAgJ1snICddJworLy8gICAgIHwgICAnKCcgcGFyYW1ldGVyX3R5cGVfbGlzdCAnKScKKy8vICAgICB8ICAgJygnIGlkZW50aWZpZXJfbGlzdCAnKScKKyAgICB8ICAgJygnICcpJworCTsKKworcG9pbnRlcgorCTogJyonIHR5cGVfcXVhbGlmaWVyKyBwb2ludGVyPworCXwgJyonIHBvaW50ZXIKKwl8ICcqJworCTsKKworLy8gcGFyYW1ldGVyX3R5cGVfbGlzdAorLy8gCTogcGFyYW1ldGVyX2xpc3QgKCcsJyAnLi4uJyk/CisvLyAJOworCisvLyBwYXJhbWV0ZXJfbGlzdAorLy8gCTogcGFyYW1ldGVyX2RlY2xhcmF0aW9uICgnLCcgcGFyYW1ldGVyX2RlY2xhcmF0aW9uKSoKKy8vIAk7CisKKy8vIHBhcmFtZXRlcl9kZWNsYXJhdGlvbgorLy8gCTogZGVjbGFyYXRpb25fc3BlY2lmaWVycyAoZGVjbGFyYXRvcnxhYnN0cmFjdF9kZWNsYXJhdG9yKSoKKy8vIAk7CisKKy8vIGlkZW50aWZpZXJfbGlzdAorLy8gCTogSURFTlRJRklFUiAoJywnIElERU5USUZJRVIpKgorLy8gCTsKKworLy8gdHlwZV9uYW1lCisvLyAJOiBzcGVjaWZpZXJfcXVhbGlmaWVyX2xpc3QgYWJzdHJhY3RfZGVjbGFyYXRvcj8KKy8vIAk7CisKKy8vIGFic3RyYWN0X2RlY2xhcmF0b3IKKy8vIAk6IHBvaW50ZXIgZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3I/CisvLyAJfCBkaXJlY3RfYWJzdHJhY3RfZGVjbGFyYXRvcgorLy8gCTsKKworLy8gZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3IKKy8vIAk6CSggJygnIGFic3RyYWN0X2RlY2xhcmF0b3IgJyknIHwgYWJzdHJhY3RfZGVjbGFyYXRvcl9zdWZmaXggKSBhYnN0cmFjdF9kZWNsYXJhdG9yX3N1ZmZpeCoKKy8vIAk7CisKKy8vIGFic3RyYWN0X2RlY2xhcmF0b3Jfc3VmZml4CisvLyAJOgknWycgJ10nCisvLyAJfAknWycgY29uc3RhbnRfZXhwcmVzc2lvbiAnXScKKy8vIAl8CScoJyAnKScKKy8vIAl8CScoJyBwYXJhbWV0ZXJfdHlwZV9saXN0ICcpJworLy8gCTsKKwkKKy8vIGluaXRpYWxpemVyCisvLyAJOiBhc3NpZ25tZW50X2V4cHJlc3Npb24KKy8vIAl8ICd7JyBpbml0aWFsaXplcl9saXN0ICcsJz8gJ30nCisvLyAJOworCisvLyBpbml0aWFsaXplcl9saXN0CisvLyAJOiBpbml0aWFsaXplciAoJywnIGluaXRpYWxpemVyKSoKKy8vIAk7CisKKy8vIC8vIEUgeCBwIHIgZSBzIHMgaSBvIG4gcworCisvLyBhcmd1bWVudF9leHByZXNzaW9uX2xpc3QKKy8vIAk6ICAgYXNzaWdubWVudF9leHByZXNzaW9uICgnLCcgYXNzaWdubWVudF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGFkZGl0aXZlX2V4cHJlc3Npb24KKy8vIAk6IChtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uKSAoJysnIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24gfCAnLScgbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uCisvLyAJOiAoY2FzdF9leHByZXNzaW9uKSAoJyonIGNhc3RfZXhwcmVzc2lvbiB8ICcvJyBjYXN0X2V4cHJlc3Npb24gfCAnJScgY2FzdF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGNhc3RfZXhwcmVzc2lvbgorLy8gCTogJygnIHR5cGVfbmFtZSAnKScgY2FzdF9leHByZXNzaW9uCisvLyAJfCB1bmFyeV9leHByZXNzaW9uCisvLyAJOworCisvLyB1bmFyeV9leHByZXNzaW9uCisvLyAJOiBwb3N0Zml4X2V4cHJlc3Npb24KKy8vIAl8ICcrKycgdW5hcnlfZXhwcmVzc2lvbgorLy8gCXwgJy0tJyB1bmFyeV9leHByZXNzaW9uCisvLyAJfCB1bmFyeV9vcGVyYXRvciBjYXN0X2V4cHJlc3Npb24KKy8vIAl8ICdzaXplb2YnIHVuYXJ5X2V4cHJlc3Npb24KKy8vIAl8ICdzaXplb2YnICcoJyB0eXBlX25hbWUgJyknCisvLyAJOworCisvLyBwb3N0Zml4X2V4cHJlc3Npb24KKy8vIAk6ICAgcHJpbWFyeV9leHByZXNzaW9uCisvLyAgICAgICAgICggICAnWycgZXhwcmVzc2lvbiAnXScKKy8vICAgICAgICAgfCAgICcoJyAnKScKKy8vICAgICAgICAgfCAgICcoJyBhcmd1bWVudF9leHByZXNzaW9uX2xpc3QgJyknCisvLyAgICAgICAgIHwgICAnLicgSURFTlRJRklFUgorLy8gICAgICAgICB8ICAgJyonIElERU5USUZJRVIKKy8vICAgICAgICAgfCAgICctPicgSURFTlRJRklFUgorLy8gICAgICAgICB8ICAgJysrJworLy8gICAgICAgICB8ICAgJy0tJworLy8gICAgICAgICApKgorLy8gCTsKKworLy8gdW5hcnlfb3BlcmF0b3IKKy8vIAk6ICcmJworLy8gCXwgJyonCisvLyAJfCAnKycKKy8vIAl8ICctJworLy8gCXwgJ34nCisvLyAJfCAnIScKKy8vIAk7CisKKy8vIHByaW1hcnlfZXhwcmVzc2lvbgorLy8gCTogSURFTlRJRklFUgorLy8gCXwgY29uc3RhbnQKKy8vIAl8ICcoJyBleHByZXNzaW9uICcpJworLy8gCTsKKworLy8gY29uc3RhbnQKKy8vICAgICA6ICAgSEVYX0xJVEVSQUwKKy8vICAgICB8ICAgT0NUQUxfTElURVJBTAorLy8gICAgIHwgICBERUNJTUFMX0xJVEVSQUwKKy8vICAgICB8CUNIQVJBQ1RFUl9MSVRFUkFMCisvLyAJfAlTVFJJTkdfTElURVJBTAorLy8gICAgIHwgICBGTE9BVElOR19QT0lOVF9MSVRFUkFMCisvLyAgICAgOworCisvLyAvLy8vLworCisvLyBleHByZXNzaW9uCisvLyAJOiBhc3NpZ25tZW50X2V4cHJlc3Npb24gKCcsJyBhc3NpZ25tZW50X2V4cHJlc3Npb24pKgorLy8gCTsKKworLy8gY29uc3RhbnRfZXhwcmVzc2lvbgorLy8gCTogY29uZGl0aW9uYWxfZXhwcmVzc2lvbgorLy8gCTsKKworLy8gYXNzaWdubWVudF9leHByZXNzaW9uCisvLyAJOiBsdmFsdWUgYXNzaWdubWVudF9vcGVyYXRvciBhc3NpZ25tZW50X2V4cHJlc3Npb24KKy8vIAl8IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24KKy8vIAk7CisJCisvLyBsdmFsdWUKKy8vIAk6CXVuYXJ5X2V4cHJlc3Npb24KKy8vIAk7CisKKy8vIGFzc2lnbm1lbnRfb3BlcmF0b3IKKy8vIAk6ICc9JworLy8gCXwgJyo9JworLy8gCXwgJy89JworLy8gCXwgJyU9JworLy8gCXwgJys9JworLy8gCXwgJy09JworLy8gCXwgJzw8PScKKy8vIAl8ICc+Pj0nCisvLyAJfCAnJj0nCisvLyAJfCAnXj0nCisvLyAJfCAnfD0nCisvLyAJOworCisvLyBjb25kaXRpb25hbF9leHByZXNzaW9uCisvLyAJOiBsb2dpY2FsX29yX2V4cHJlc3Npb24gKCc/JyBleHByZXNzaW9uICc6JyBjb25kaXRpb25hbF9leHByZXNzaW9uKT8KKy8vIAk7CisKKy8vIGxvZ2ljYWxfb3JfZXhwcmVzc2lvbgorLy8gCTogbG9naWNhbF9hbmRfZXhwcmVzc2lvbiAoJ3x8JyBsb2dpY2FsX2FuZF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24KKy8vIAk6IGluY2x1c2l2ZV9vcl9leHByZXNzaW9uICgnJiYnIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uCisvLyAJOiBleGNsdXNpdmVfb3JfZXhwcmVzc2lvbiAoJ3wnIGV4Y2x1c2l2ZV9vcl9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGV4Y2x1c2l2ZV9vcl9leHByZXNzaW9uCisvLyAJOiBhbmRfZXhwcmVzc2lvbiAoJ14nIGFuZF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGFuZF9leHByZXNzaW9uCisvLyAJOiBlcXVhbGl0eV9leHByZXNzaW9uICgnJicgZXF1YWxpdHlfZXhwcmVzc2lvbikqCisvLyAJOworLy8gZXF1YWxpdHlfZXhwcmVzc2lvbgorLy8gCTogcmVsYXRpb25hbF9leHByZXNzaW9uICgoJz09J3wnIT0nKSByZWxhdGlvbmFsX2V4cHJlc3Npb24pKgorLy8gCTsKKworLy8gcmVsYXRpb25hbF9leHByZXNzaW9uCisvLyAJOiBzaGlmdF9leHByZXNzaW9uICgoJzwnfCc+J3wnPD0nfCc+PScpIHNoaWZ0X2V4cHJlc3Npb24pKgorLy8gCTsKKworLy8gc2hpZnRfZXhwcmVzc2lvbgorLy8gCTogYWRkaXRpdmVfZXhwcmVzc2lvbiAoKCc8PCd8Jz4+JykgYWRkaXRpdmVfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyAvLyBTIHQgYSB0IGUgbSBlIG4gdCBzCisKKy8vIHN0YXRlbWVudAorLy8gCTogbGFiZWxlZF9zdGF0ZW1lbnQKKy8vIAl8IGNvbXBvdW5kX3N0YXRlbWVudAorLy8gCXwgZXhwcmVzc2lvbl9zdGF0ZW1lbnQKKy8vIAl8IHNlbGVjdGlvbl9zdGF0ZW1lbnQKKy8vIAl8IGl0ZXJhdGlvbl9zdGF0ZW1lbnQKKy8vIAl8IGp1bXBfc3RhdGVtZW50CisvLyAJOworCisvLyBsYWJlbGVkX3N0YXRlbWVudAorLy8gCTogSURFTlRJRklFUiAnOicgc3RhdGVtZW50CisvLyAJfCAnY2FzZScgY29uc3RhbnRfZXhwcmVzc2lvbiAnOicgc3RhdGVtZW50CisvLyAJfCAnZGVmYXVsdCcgJzonIHN0YXRlbWVudAorLy8gCTsKKworLy8gY29tcG91bmRfc3RhdGVtZW50CisvLyBzY29wZSBTeW1ib2xzOyAvLyBibG9ja3MgaGF2ZSBhIHNjb3BlIG9mIHN5bWJvbHMKKy8vIEBpbml0IHsKKy8vICAgJFN5bWJvbHM6OnR5cGVzID0ge30KKy8vIH0KKy8vIAk6ICd7JyBkZWNsYXJhdGlvbiogc3RhdGVtZW50X2xpc3Q/ICd9JworLy8gCTsKKworLy8gc3RhdGVtZW50X2xpc3QKKy8vIAk6IHN0YXRlbWVudCsKKy8vIAk7CisKKy8vIGV4cHJlc3Npb25fc3RhdGVtZW50CisvLyAJOiAnOycKKy8vIAl8IGV4cHJlc3Npb24gJzsnCisvLyAJOworCisvLyBzZWxlY3Rpb25fc3RhdGVtZW50CisvLyAJOiAnaWYnICcoJyBleHByZXNzaW9uICcpJyBzdGF0ZW1lbnQgKG9wdGlvbnMge2s9MTsgYmFja3RyYWNrPWZhbHNlO306J2Vsc2UnIHN0YXRlbWVudCk/CisvLyAJfCAnc3dpdGNoJyAnKCcgZXhwcmVzc2lvbiAnKScgc3RhdGVtZW50CisvLyAJOworCisvLyBpdGVyYXRpb25fc3RhdGVtZW50CisvLyAJOiAnd2hpbGUnICcoJyBleHByZXNzaW9uICcpJyBzdGF0ZW1lbnQKKy8vIAl8ICdkbycgc3RhdGVtZW50ICd3aGlsZScgJygnIGV4cHJlc3Npb24gJyknICc7JworLy8gCXwgJ2ZvcicgJygnIGV4cHJlc3Npb25fc3RhdGVtZW50IGV4cHJlc3Npb25fc3RhdGVtZW50IGV4cHJlc3Npb24/ICcpJyBzdGF0ZW1lbnQKKy8vIAk7CisKKy8vIGp1bXBfc3RhdGVtZW50CisvLyAJOiAnZ290bycgSURFTlRJRklFUiAnOycKKy8vIAl8ICdjb250aW51ZScgJzsnCisvLyAJfCAnYnJlYWsnICc7JworLy8gCXwgJ3JldHVybicgJzsnCisvLyAJfCAncmV0dXJuJyBleHByZXNzaW9uICc7JworLy8gCTsKKworSURFTlRJRklFUgorCToJTEVUVEVSIChMRVRURVJ8JzAnLi4nOScpKgorCTsKKwkKK2ZyYWdtZW50CitMRVRURVIKKwk6CSckJworCXwJJ0EnLi4nWicKKwl8CSdhJy4uJ3onCisJfAknXycKKwk7CisKK0NIQVJBQ1RFUl9MSVRFUkFMCisgICAgOiAgICdcJycgKCBFc2NhcGVTZXF1ZW5jZSB8IH4oJ1wnJ3wnXFwnKSApICdcJycKKyAgICA7CisKK1NUUklOR19MSVRFUkFMCisgICAgOiAgJyInICggRXNjYXBlU2VxdWVuY2UgfCB+KCdcXCd8JyInKSApKiAnIicKKyAgICA7CisKK0hFWF9MSVRFUkFMIDogJzAnICgneCd8J1gnKSBIZXhEaWdpdCsgSW50ZWdlclR5cGVTdWZmaXg/IDsKKworREVDSU1BTF9MSVRFUkFMIDogKCcwJyB8ICcxJy4uJzknICcwJy4uJzknKikgSW50ZWdlclR5cGVTdWZmaXg/IDsKKworT0NUQUxfTElURVJBTCA6ICcwJyAoJzAnLi4nNycpKyBJbnRlZ2VyVHlwZVN1ZmZpeD8gOworCitmcmFnbWVudAorSGV4RGlnaXQgOiAoJzAnLi4nOSd8J2EnLi4nZid8J0EnLi4nRicpIDsKKworZnJhZ21lbnQKK0ludGVnZXJUeXBlU3VmZml4CisJOgkoJ3UnfCdVJyk/ICgnbCd8J0wnKQorCXwJKCd1J3wnVScpICAoJ2wnfCdMJyk/CisJOworCitGTE9BVElOR19QT0lOVF9MSVRFUkFMCisgICAgOiAgICgnMCcuLic5JykrICcuJyAoJzAnLi4nOScpKiBFeHBvbmVudD8gRmxvYXRUeXBlU3VmZml4PworICAgIHwgICAnLicgKCcwJy4uJzknKSsgRXhwb25lbnQ/IEZsb2F0VHlwZVN1ZmZpeD8KKyAgICB8ICAgKCcwJy4uJzknKSsgRXhwb25lbnQgRmxvYXRUeXBlU3VmZml4PworICAgIHwgICAoJzAnLi4nOScpKyBFeHBvbmVudD8gRmxvYXRUeXBlU3VmZml4CisJOworCitmcmFnbWVudAorRXhwb25lbnQgOiAoJ2UnfCdFJykgKCcrJ3wnLScpPyAoJzAnLi4nOScpKyA7CisKK2ZyYWdtZW50CitGbG9hdFR5cGVTdWZmaXggOiAoJ2YnfCdGJ3wnZCd8J0QnKSA7CisKK2ZyYWdtZW50CitFc2NhcGVTZXF1ZW5jZQorICAgIDogICAnXFwnICgnYid8J3QnfCduJ3wnZid8J3InfCdcIid8J1wnJ3wnXFwnKQorICAgIHwgICBPY3RhbEVzY2FwZQorICAgIDsKKworZnJhZ21lbnQKK09jdGFsRXNjYXBlCisgICAgOiAgICdcXCcgKCcwJy4uJzMnKSAoJzAnLi4nNycpICgnMCcuLic3JykKKyAgICB8ICAgJ1xcJyAoJzAnLi4nNycpICgnMCcuLic3JykKKyAgICB8ICAgJ1xcJyAoJzAnLi4nNycpCisgICAgOworCitmcmFnbWVudAorVW5pY29kZUVzY2FwZQorICAgIDogICAnXFwnICd1JyBIZXhEaWdpdCBIZXhEaWdpdCBIZXhEaWdpdCBIZXhEaWdpdAorICAgIDsKKworV1MgIDogICgnICd8J1xyJ3wnXHQnfCdcdTAwMEMnfCdcbicpIHskY2hhbm5lbD1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5ISURERU5fQ0hBTk5FTDt9CisgICAgOworCitDT01NRU5UCisgICAgOiAgICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4gKSogJyovJyB7JGNoYW5uZWw9b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uSElEREVOX0NIQU5ORUw7fQorICAgIDsKKworTElORV9DT01NRU5UCisgICAgOiAnLy8nIH4oJ1xuJ3wnXHInKSogJ1xyJz8gJ1xuJyB7JGNoYW5uZWw9b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uSElEREVOX0NIQU5ORUw7fQorICAgIDsKKworLy8gaWdub3JlICNsaW5lIGluZm8gZm9yIG5vdworTElORV9DT01NQU5EIAorICAgIDogJyMnIH4oJ1xuJ3wnXHInKSogJ1xyJz8gJ1xuJyB7JGNoYW5uZWw9b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uSElEREVOX0NIQU5ORUw7fQorICAgIDsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzNiYWNrdHJhY2tpbmcuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMzYmFja3RyYWNraW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQyYjZmNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDMzYmFja3RyYWNraW5nLmh0bWwKQEAgLTAsMCArMSw0NSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMzNiYWNrdHJhY2tpbmc8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzM2JhY2t0cmFja2luZ0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzNiYWNrdHJhY2tpbmdQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmNvbmQgPSB0cnVlOworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwMzNiYWNrdHJhY2tpbmdQYXJzZXIsIHsKKyAgICAgICAgZW1pdEVycm9yTWVzc2FnZTogZnVuY3Rpb24oKSB7IC8qIGRvbid0IHJlcG9ydCBlcnJvcnMgKi8gfSwKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJpbnQgYTsiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IHQwMzNiYWNrdHJhY2tpbmdMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgdmFyIGV2ZW50cyA9IHBhcnNlci50cmFuc2xhdGlvbl91bml0KCk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDMzYmFja3RyYWNraW5nPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiNTI0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZi5nCkBAIC0wLDAgKzEsMzMgQEAKK2dyYW1tYXIgdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK0BoZWFkZXIgewordmFyIHhsb2cgPSBbXTsKK30KKworYTogdD1BCisgICAgICAgIHsKKyAgICAgICAgICAgIHhsb2cucHVzaCgkdC50ZXh0KTsKKyAgICAgICAgICAgIHhsb2cucHVzaCgkdC50eXBlKTsKKyAgICAgICAgICAgIHhsb2cucHVzaCgkdC5saW5lKTsKKyAgICAgICAgICAgIHhsb2cucHVzaCgkdC5wb3MpOworICAgICAgICAgICAgeGxvZy5wdXNoKCR0LmNoYW5uZWwpOworICAgICAgICAgICAgeGxvZy5wdXNoKCR0LmluZGV4KTsKKyAgICAgICAgfQorICAgIDsKKworQTogJ2EnLi4neic7CisKK1dTICA6CisgICAgICAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICB8CSdcclxuJworICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICApCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWwgPSBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5ISURERU5fQ0hBTk5FTDsgfQorICAgIDsgICAgCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1ODRlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZi5odG1sCkBAIC0wLDAgKzEsNTQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzR0b2tlbkxhYmVsUHJvcGVydHlSZWZMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmUGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRMZXhlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZkxleGVyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZlBhcnNlciwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMSgpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oIiAgIGEiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgdmFyIGV2ZW50cyA9IHBhcnNlci5hKCk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKFsiYSIsNCwxLDMsMCwxXSwgeGxvZyk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM1cnVsZUxhYmVsUHJvcGVydHlSZWYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM1cnVsZUxhYmVsUHJvcGVydHlSZWYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ODk3MzViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZi5nCkBAIC0wLDAgKzEsMTYgQEAKK2dyYW1tYXIgdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworYSByZXR1cm5zIFtibGFdOiB0PWIKKyAgICAgICAgeworICAgICAgICAgICAgJGJsYSA9IFskdC5zdGFydCwgJHQuc3RvcCwgJHQudGV4dF07CisgICAgICAgIH0KKyAgICA7CisKK2I6IEErOworCitBOiAnYScuLid6JzsKKworV1M6ICcgJysgIHsgJGNoYW5uZWwgPSBISURERU47IH07CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWI5YjY5OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM1cnVsZUxhYmVsUHJvcGVydHlSZWYuaHRtbApAQCAtMCwwICsxLDYwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZlBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUTGV4ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZkxleGVyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmUGFyc2VyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiICAgYSBhIGEgYSAgIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciBhID0gcGFyc2VyLmEoKSwKKyAgICAgICAgICAgIHN0YXJ0ID0gYVswXSwKKyAgICAgICAgICAgIHN0b3AgPSBhWzFdLAorICAgICAgICAgICAgdGV4dCA9IGFbMl07CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0LmluZGV4LCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0b3AuaW5kZXgsIDcpOworICAgICAgICBhc3NlcnRFcXVhbHModGV4dCwgImEgYSBhIGEiKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZjwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDM3NDVmMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXMuZwpAQCAtMCwwICsxLDI1IEBACitncmFtbWFyIHQwMzZtdWx0aXBsZVJldHVyblZhbHVlczsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7Cit9CisKK2EgcmV0dXJucyBbZm9vLCBiYXJdOiBBCisgICAgICAgIHsKKyAgICAgICAgICAgICRmb28gPSAiZm9vIjsKKyAgICAgICAgICAgICRiYXIgPSAiYmFyIjsKKyAgICAgICAgfQorICAgIDsKKworQTogJ2EnLi4neic7CisKK1dTICA6CisgICAgICAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICB8CSdcclxuJworICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICApCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWwgPSBISURERU4gfQorICAgIDsgICAgCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXMuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMmIzOTRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzZtdWx0aXBsZVJldHVyblZhbHVlcy5odG1sCkBAIC0wLDAgKzEsNTYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXM8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzUGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRMZXhlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzTGV4ZXIsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUUGFyc2VyLCB0MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXNQYXJzZXIsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCIgICBhIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciByZXQgPSBwYXJzZXIuYSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXQuZm9vLCAiZm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXQuYmFyLCAiYmFyIik7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzdydWxlUHJvcGVydHlSZWYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM3cnVsZVByb3BlcnR5UmVmLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjE5NmJiOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM3cnVsZVByb3BlcnR5UmVmLmcKQEAgLTAsMCArMSwxNSBAQAorZ3JhbW1hciB0MDM3cnVsZVByb3BlcnR5UmVmOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworYSByZXR1cm5zIFtibGFdCitAYWZ0ZXIgeworICAgICRibGEgPSBbJHN0YXJ0LCAkc3RvcCwgJHRleHRdOworfQorICAgIDogQSsKKyAgICA7CisKK0E6ICdhJy4uJ3onOworCitXUzogJyAnKyAgeyAkY2hhbm5lbCA9IEhJRERFTiB9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzdydWxlUHJvcGVydHlSZWYuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM3cnVsZVByb3BlcnR5UmVmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBkOGY5MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM3cnVsZVByb3BlcnR5UmVmLmh0bWwKQEAgLTAsMCArMSw1NyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwMzdydWxlUHJvcGVydHlSZWY8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzN3J1bGVQcm9wZXJ0eVJlZkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzdydWxlUHJvcGVydHlSZWZQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVExleGVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVExleGVyLCB0MDM3cnVsZVByb3BlcnR5UmVmTGV4ZXIsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUUGFyc2VyLCB0MDM3cnVsZVByb3BlcnR5UmVmUGFyc2VyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnICAgYSBhIGEgYSAgJyksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRzdHJlYW0pOworCisgICAgICAgIHZhciByZXQgPSBwYXJzZXIuYSgpLmJsYTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmV0WzBdLmluZGV4LCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFsxXS5pbmRleCwgNyk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXRbMl0sICJhIGEgYSBhIik7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDM3cnVsZVByb3BlcnR5UmVmPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM4bGV4ZXJSdWxlTGFiZWwuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM4bGV4ZXJSdWxlTGFiZWwuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZGZkMDAwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzhsZXhlclJ1bGVMYWJlbC5nCkBAIC0wLDAgKzEsMjggQEAKK2xleGVyIGdyYW1tYXIgdDAzOGxleGVyUnVsZUxhYmVsOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworQTogJ2EnLi4neicgV1MgJzAnLi4nOScKKyAgICAgICAgeworICAgICAgICAgICAgLypwcmludCAkV1MKKyAgICAgICAgICAgIHByaW50ICRXUy50eXBlCisgICAgICAgICAgICBwcmludCAkV1MubGluZQorICAgICAgICAgICAgcHJpbnQgJFdTLnBvcworICAgICAgICAgICAgcHJpbnQgJFdTLmNoYW5uZWwKKyAgICAgICAgICAgIHByaW50ICRXUy5pbmRleAorICAgICAgICAgICAgcHJpbnQgJFdTLnRleHQqLworICAgICAgICB9CisgICAgOworCitmcmFnbWVudCBXUyAgOgorICAgICAgICAoICAgJyAnCisgICAgICAgIHwgICAnXHQnCisgICAgICAgIHwgICggJ1xuJworICAgICAgICAgICAgfAknXHJcbicKKyAgICAgICAgICAgIHwJJ1xyJworICAgICAgICAgICAgKQorICAgICAgICApKworICAgICAgICB7ICRjaGFubmVsID0gSElEREVOIH0KKyAgICA7ICAgIAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzOGxleGVyUnVsZUxhYmVsLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzOGxleGVyUnVsZUxhYmVsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGI4Mjk5YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM4bGV4ZXJSdWxlTGFiZWwuaHRtbApAQCAtMCwwICsxLDQxIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAzOGxleGVyUnVsZUxhYmVsPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwMzhsZXhlclJ1bGVMYWJlbC5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVExleGVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVExleGVyLCB0MDM4bGV4ZXJSdWxlTGFiZWwsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24oaW5wdXQsIHJlKSB7IHRocm93IHJlOyB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCJhICAyIiksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKT09PW9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPRikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDM4bGV4ZXJSdWxlTGFiZWw8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzlsYWJlbHMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM5bGFiZWxzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWQ2MDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDM5bGFiZWxzLmcKQEAgLTAsMCArMSwxOCBAQAorZ3JhbW1hciB0MDM5bGFiZWxzOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworYSByZXR1cm5zIFtsXQorICAgIDogaWRzKz1BICggJywnIGlkcys9KEF8QikgKSogQyBEIHc9LiBpZHMrPS4gRiBFT0YKKyAgICAgICAgeyBsID0gWyRpZHMsICR3XTsgfQorICAgIDsKKworQTogJ2EnLi4neic7CitCOiAnMCcuLic5JzsKK0M6IGE9J0EnOworRDogYT0nRk9PQkFSJzsKK0U6ICdHTlUnIGE9LjsKK0Y6ICdCTEFSWicgYT1FT0Y7CisKK1dTOiAnICcrICB7ICRjaGFubmVsID0gSElEREVOIH07CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDAzOWxhYmVscy5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzlsYWJlbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzFmNmRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwMzlsYWJlbHMuaHRtbApAQCAtMCwwICsxLDYyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDAzOWxhYmVsczwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDM5bGFiZWxzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDAzOWxhYmVsc1BhcnNlci5qcyI+PC9zY3JpcHQ+CisKKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUTGV4ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwMzlsYWJlbHNMZXhlciwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciBUUGFyc2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRQYXJzZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwMzlsYWJlbHNQYXJzZXIsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKCdhLCBiLCBjLCAxLCAyIEEgRk9PQkFSIEdOVTEgQSBCTEFSWicpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICB2YXIgcmV0ID0gcGFyc2VyLmEoKSwKKyAgICAgICAgICAgIGlkcyA9IHJldFswXSwKKyAgICAgICAgICAgIHcgPSByZXRbMV07CisKKyAgICAgICAgdmFyIGksIGE9W107CisgICAgICAgIGZvciAoaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYS5wdXNoKGlkc1tpXS5nZXRUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKFsiYSIsICJiIiwgImMiLCAiMSIsICIyIiwgIkEiXSwgYSk7CisgICAgICAgIGFzc2VydEVxdWFscyh3LmdldFRleHQoKSwgIkdOVTEiKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwMzlsYWJlbHM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDBidWc4MC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDBidWc4MC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0Mzk4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0MGJ1ZzgwLmcKQEAgLTAsMCArMSwxMyBAQAorbGV4ZXIgZ3JhbW1hciB0MDQwYnVnODA7IAorb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKyAKK0lEX0xJS0UKKyAgICA6ICdkZWZpbmVkJyAKKyAgICB8IHtmYWxzZX0/IElkZW50aWZpZXIgCisgICAgfCBJZGVudGlmaWVyIAorICAgIDsgCisgCitmcmFnbWVudCAKK0lkZW50aWZpZXI6ICdhJy4uJ3onKyA7IC8vIHdpdGgganVzdCAnYScsIG91dHB1dCBjb21waWxlcyAKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQwYnVnODAuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQwYnVnODAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjk2NzEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDBidWc4MC5odG1sCkBAIC0wLDAgKzEsNDEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQwYnVnODA8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0MGJ1ZzgwLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUTGV4ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwNDBidWc4MCwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihpbnB1dCwgcmUpIHsgdGhyb3cgcmU7IH0KKyAgICB9KTsKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oImRlZmluZWQiKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihzdHJlYW0pLAorICAgICAgICAgICAgdG9rZW47CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpPT09b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwNDBidWc4MDwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0MXBhcmFtZXRlcnMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQxcGFyYW1ldGVycy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkYWVjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0MXBhcmFtZXRlcnMuZwpAQCAtMCwwICsxLDE2IEBACitncmFtbWFyIHQwNDFwYXJhbWV0ZXJzOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworYVthcmcxLCBhcmcyXSByZXR1cm5zIFtsXQorICAgIDogQSsgRU9GCisgICAgICAgIHsgCisgICAgICAgICAgICBsID0gWyRhcmcxLCAkYXJnMl07CisgICAgICAgICAgICAkYXJnMSA9ICJnbmFyeiI7CisgICAgICAgIH0KKyAgICA7CisKK0E6ICdhJy4uJ3onOworCitXUzogJyAnKyAgeyAkY2hhbm5lbCA9IEhJRERFTjsgfTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQxcGFyYW1ldGVycy5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDFwYXJhbWV0ZXJzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ4NTNjZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQxcGFyYW1ldGVycy5odG1sCkBAIC0wLDAgKzEsNTQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQxcGFyYW1ldGVyczwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQxcGFyYW1ldGVyc0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDFwYXJhbWV0ZXJzUGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRMZXhlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDA0MXBhcmFtZXRlcnNMZXhlciwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciBUUGFyc2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRQYXJzZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwNDFwYXJhbWV0ZXJzUGFyc2VyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnYSBhIGEnKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisKKyAgICAgICAgdmFyIHJldCA9IHBhcnNlci5hKCJmb28iLCAiYmFyIik7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKFsiZm9vIiwgImJhciJdLCByZXQpOworICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA0MXBhcmFtZXRlcnM8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDJhc3QuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQyYXN0LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc1ZTNhYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQyYXN0LmcKQEAgLTAsMCArMSwzNTkgQEAKK2dyYW1tYXIgdDA0MmFzdDsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKKyAgICBvdXRwdXQgPSBBU1Q7Cit9CisKK3Rva2VucyB7CisgICAgVkFSREVGOworICAgIEZMT0FUOworICAgIEVYUFI7CisgICAgQkxPQ0s7CisgICAgVkFSSUFCTEU7CisgICAgRklFTEQ7CisgICAgQ0FMTDsKKyAgICBJTkRFWDsKKyAgICBGSUVMREFDQ0VTUzsKK30KKworQGhlYWRlciB7CitvcmcuYW50bHIubGFuZy5tYXAgPSBmdW5jdGlvbihhLCBmbikgeworICAgIHZhciBpLCBsZW4sIHI9W107CisgICAgZm9yIChpPTAsIGxlbj1hLmxlbmd0aDsgaTxsZW47IGkrKykgeworICAgICAgICByLnB1c2goZm4oYVtpXSwgaSkpOworICAgIH0KKyAgICByZXR1cm4gcjsKK307Cit9CisKK3IxCisgICAgOiBJTlQgKCcrJ14gSU5UKSoKKyAgICA7CisKK3IyCisgICAgOiAnYXNzZXJ0J14geD1leHByZXNzaW9uICgnOichIHk9ZXhwcmVzc2lvbik/ICc7JyEKKyAgICA7CisKK3IzCisgICAgOiAnaWYnXiBleHByZXNzaW9uIHMxPXN0YXRlbWVudCAoJ2Vsc2UnISBzMj1zdGF0ZW1lbnQpPworICAgIDsKKworcjQKKyAgICA6ICd3aGlsZSdeIGV4cHJlc3Npb24gc3RhdGVtZW50CisgICAgOworCityNQorICAgIDogJ3JldHVybideIGV4cHJlc3Npb24/ICc7JyEKKyAgICA7CisKK3I2CisgICAgOiAoSU5UfElEKSsKKyAgICA7CisKK3I3CisgICAgOiBJTlQgLT4gCisgICAgOworCityOAorICAgIDogJ3ZhcicgSUQgJzonIHR5cGUgLT4gXigndmFyJyB0eXBlIElEKSAKKyAgICA7CisKK3I5CisgICAgOiB0eXBlIElEICc7JyAtPiBeKFZBUkRFRiB0eXBlIElEKSAKKyAgICA7CisKK3IxMAorICAgIDogSU5UIC0+IHtuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlKG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbihGTE9BVCwgJElOVC50ZXh0ICsgIi4wIikpfQorICAgIDsKKworcjExCisgICAgOiBleHByZXNzaW9uIC0+IF4oRVhQUiBleHByZXNzaW9uKQorICAgIHwgLT4gRVhQUgorICAgIDsKKworcjEyCisgICAgOiBJRCAoJywnIElEKSogLT4gSUQrCisgICAgOworCityMTMKKyAgICA6IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgSUQrKQorICAgIDsKKworcjE0CisgICAgOiAgIGV4cHJlc3Npb24/IHN0YXRlbWVudCogdHlwZSsKKyAgICAgICAgLT4gXihFWFBSIGV4cHJlc3Npb24/IHN0YXRlbWVudCogdHlwZSspCisgICAgOworCityMTUKKyAgICA6IElOVCAtPiBJTlQgSU5UCisgICAgOworCityMTYKKyAgICA6ICdpbnQnIElEICgnLCcgSUQpKiAtPiBeKCdpbnQnIElEKSsKKyAgICA7CisKK3IxNworICAgIDogJ2ZvcicgJygnIHN0YXJ0PXN0YXRlbWVudCAnOycgZXhwcmVzc2lvbiAnOycgbmV4dD1zdGF0ZW1lbnQgJyknIHN0YXRlbWVudAorICAgICAgICAtPiBeKCdmb3InICRzdGFydCBleHByZXNzaW9uICRuZXh0IHN0YXRlbWVudCkKKyAgICA7CisKK3IxOAorICAgIDogdD0nZm9yJyAtPiBeKEJMT0NLKQorICAgIDsKKworcjE5CisgICAgOiB0PSdmb3InIC0+IF4oQkxPQ0tbJHRdKQorICAgIDsKKworcjIwCisgICAgOiB0PSdmb3InIC0+IF4oQkxPQ0tbJHQsIkZPUiJdKQorICAgIDsKKworcjIxCisgICAgOiB0PSdmb3InIC0+IEJMT0NLCisgICAgOworCityMjIKKyAgICA6IHQ9J2ZvcicgLT4gQkxPQ0tbJHRdCisgICAgOworCityMjMKKyAgICA6IHQ9J2ZvcicgLT4gQkxPQ0tbJHQsIkZPUiJdCisgICAgOworCityMjQKKyAgICA6IHI9c3RhdGVtZW50IGV4cHJlc3Npb24gLT4gXigkciBleHByZXNzaW9uKQorICAgIDsKKworcjI1CisgICAgOiByKz1zdGF0ZW1lbnQgKCcsJyByKz1zdGF0ZW1lbnQpKyBleHByZXNzaW9uIC0+IF4oJHIgZXhwcmVzc2lvbikKKyAgICA7CisKK3IyNgorICAgIDogcis9c3RhdGVtZW50ICgnLCcgcis9c3RhdGVtZW50KSsgLT4gXihCTE9DSyAkcispCisgICAgOworCityMjcKKyAgICA6IHI9c3RhdGVtZW50IGV4cHJlc3Npb24gLT4gXigkciBeKCRyIGV4cHJlc3Npb24pKQorICAgIDsKKworcjI4CisgICAgOiAoJ2ZvbzI4YSd8J2ZvbzI4YicpIC0+CisgICAgOworCityMjkKKyAgICA6IChyKz1zdGF0ZW1lbnQpKiAtPiBeKEJMT0NLICRyKykKKyAgICA7CisKK3IzMAorICAgIDogc3RhdGVtZW50KiAtPiBeKEJMT0NLIHN0YXRlbWVudD8pCisgICAgOworCityMzEKKyAgICA6IG1vZGlmaWVyIHR5cGUgSUQgKCc9JyBleHByZXNzaW9uKT8gJzsnCisgICAgICAgIC0+IHt0aGlzLmZsYWcgPT09IDB9PyBeKFZBUkRFRiBJRCBtb2RpZmllciogdHlwZSBleHByZXNzaW9uPykKKyAgICAgICAgLT4ge3RoaXMuZmxhZyA9PT0gMX0/IF4oVkFSSUFCTEUgSUQgbW9kaWZpZXIqIHR5cGUgZXhwcmVzc2lvbj8pCisgICAgICAgIC0+ICAgICAgICAgICAgICAgICAgIF4oRklFTEQgSUQgbW9kaWZpZXIqIHR5cGUgZXhwcmVzc2lvbj8pCisgICAgOworCityMzJbd2hpY2hdCisgIDogSUQgSU5UIC0+IHt3aGljaD09MX0/IElECisgICAgICAgICAgIC0+IHt3aGljaD09Mn0/IElOVAorICAgICAgICAgICAtPiAvLyB5aWVsZCBub3RoaW5nIGFzIGVsc2UtY2xhdXNlCisgIDsKKworcjMzCisgICAgOiAgIG1vZGlmaWVycyEgc3RhdGVtZW50CisgICAgOworCityMzQKKyAgICA6ICAgbW9kaWZpZXJzISByMzRhWyRtb2RpZmllcnMudHJlZV0KKyAgICAvL3wgICBtb2RpZmllcnMhIHIzM2JbJG1vZGlmaWVycy50cmVlXQorICAgIDsKKworcjM0YVttb2RdCisgICAgOiAgICdjbGFzcycgSUQgKCdleHRlbmRzJyBzdXA9dHlwZSk/CisgICAgICAgICggJ2ltcGxlbWVudHMnIGkrPXR5cGUgKCcsJyBpKz10eXBlKSopPworICAgICAgICAneycgc3RhdGVtZW50KiAnfScKKyAgICAgICAgLT4gXignY2xhc3MnIElEIHskbW9kfSBeKCdleHRlbmRzJyAkc3VwKT8gXignaW1wbGVtZW50cycgJGkrKT8gc3RhdGVtZW50KiApCisgICAgOworCityMzUKKyAgICA6ICd7JyAnZXh0ZW5kcycgKHN1cD10eXBlKT8gJ30nCisgICAgICAgIC0+ICBeKCdleHRlbmRzJyAkc3VwKT8KKyAgICA7CisKK3IzNgorICAgIDogJ2lmJyAnKCcgZXhwcmVzc2lvbiAnKScgczE9c3RhdGVtZW50CisgICAgICAgICggJ2Vsc2UnIHMyPXN0YXRlbWVudCAtPiBeKCdpZicgXihFWFBSIGV4cHJlc3Npb24pICRzMSAkczIpCisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAtPiBeKCdpZicgXihFWFBSIGV4cHJlc3Npb24pICRzMSkKKyAgICAgICAgKQorICAgIDsKKworcjM3CisgICAgOiAoSU5UIC0+IElOVCkgKCcrJyBpPUlOVCAtPiBeKCcrJyAkcjM3ICRpKSApKiAKKyAgICA7CisKK3IzOAorICAgIDogSU5UICgnKydeIElOVCkqCisgICAgOworCityMzkKKyAgICA6IChwcmltYXJ5LT5wcmltYXJ5KSAvLyBzZXQgcmV0dXJuIHRyZWUgdG8ganVzdCBwcmltYXJ5CisgICAgICAgICggJygnIGFyZz1leHByZXNzaW9uICcpJworICAgICAgICAgICAgLT4gXihDQUxMICRyMzkgJGFyZykKKyAgICAgICAgfCAnWycgaWU9ZXhwcmVzc2lvbiAnXScKKyAgICAgICAgICAgIC0+IF4oSU5ERVggJHIzOSAkaWUpCisgICAgICAgIHwgJy4nIHA9cHJpbWFyeQorICAgICAgICAgICAgLT4gXihGSUVMREFDQ0VTUyAkcjM5ICRwKQorICAgICAgICApKgorICAgIDsKKworcjQwCisgICAgOiAoSU5UIC0+IElOVCkgKCAoJysnIGkrPUlOVCkqIC0+IF4oJysnICRyNDAgJGkqKSApICc7JworICAgIDsKKworcjQxCisgICAgOiAoSU5UIC0+IElOVCkgKCAoJysnIGk9SU5UKSAtPiBeKCRpICRyNDEpICkqICc7JworICAgIDsKKworcjQyCisgICAgOiBpZHMrPUlEICgnLCchIGlkcys9SUQpKgorICAgIDsKKworcjQzIHJldHVybnMgW3Jlc10KKyAgICA6IGlkcys9SUQhICgnLCchIGlkcys9SUQhKSogeyRyZXMgPSBvcmcuYW50bHIubGFuZy5tYXAoJGlkcywgZnVuY3Rpb24oaWQpIHsgcmV0dXJuIGlkLmdldFRleHQoKTsgfSk7fQorICAgIDsKKworcjQ0CisgICAgOiBpZHMrPUlEXiAoJywnISBpZHMrPUlEXikqCisgICAgOworCityNDUKKyAgICA6IHByaW1hcnleCisgICAgOworCityNDYgcmV0dXJucyBbcmVzXQorICAgIDogaWRzKz1wcmltYXJ5ISAoJywnISBpZHMrPXByaW1hcnkhKSogeyRyZXMgPSBvcmcuYW50bHIubGFuZy5tYXAoJGlkcywgZnVuY3Rpb24oaWQpIHsgcmV0dXJuIGlkLmdldFRleHQoKTsgfSk7fQorICAgIDsKKworcjQ3CisgICAgOiBpZHMrPXByaW1hcnkgKCcsJyEgaWRzKz1wcmltYXJ5KSoKKyAgICA7CisKK3I0OAorICAgIDogaWRzKz0uICgnLCchIGlkcys9LikqCisgICAgOworCityNDkKKyAgICA6IC5eIElECisgICAgOworCityNTAKKyAgICA6IElEIAorICAgICAgICAtPiBeKHtuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlKG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbihGTE9BVCwgIjEuMCIpKX0gSUQpCisgICAgOworCisvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICB0b2tlbkxhYmVsUHJvcGVydHlSZWZfdHJlZQorKi8KK3I1MSByZXR1cm5zIFtyZXNdCisgICAgOiBJRCB0PUlEIElECisgICAgICAgIHsgJHJlcyA9ICR0LnRyZWU7IH0KKyAgICA7CisKKy8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgIHJ1bGVQcm9wZXJ0eVJlZl90cmVlCisqLworcjUyIHJldHVybnMgW3Jlc10KK0BhZnRlciB7CisgICAgJHJlcyA9ICR0cmVlOworfQorICAgIDogSUQKKyAgICA7CisKKy8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgIHJ1bGVMYWJlbFByb3BlcnR5UmVmX3RyZWUKKyovCityNTMgcmV0dXJucyBbcmVzXQorICAgIDogdD1wcmltYXJ5CisgICAgICAgIHsgJHJlcyA9ICR0LnRyZWU7IH0KKyAgICA7CisKKy8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgIHJ1bGVTZXRQcm9wZXJ0eVJlZl90cmVlCisqLworcjU0IHJldHVybnMgW3Jlc10KK0BhZnRlciB7CisgICAgJHRyZWUgPSAkdC50cmVlOzsKK30KKyAgICA6IElEIHQ9ZXhwcmVzc2lvbiBJRAorICAgIDsKKworLyoqIGJhY2t0cmFja2luZyAqLworcjU1CitvcHRpb25zIHsgYmFja3RyYWNrPXRydWU7IGs9MTsgfQorICAgIDogKG1vZGlmaWVyKyBJTlQpPT4gbW9kaWZpZXIrIGV4cHJlc3Npb24KKyAgICB8IG1vZGlmaWVyKyBzdGF0ZW1lbnQKKyAgICA7CisKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcmV3cml0ZVRva2VuUmVmIHdpdGggbGVuKGFyZ3MpPjAKKyovCityNTYKKyAgICA6IHQ9SUQqIC0+IElEWyR0LCdmb28nXQorICAgIDsKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcmV3cml0ZVRva2VuUmVmUm9vdCB3aXRoIGxlbihhcmdzKT4wCisqLworcjU3CisgICAgOiB0PUlEKiAtPiBeKElEWyR0LCdmb28nXSkKKyAgICA7CisKKy8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgID8/PworKi8KK3I1OAorICAgIDogKHtuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlKG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbihGTE9BVCwgIjIuMCIpKX0pXgorICAgIDsKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmUm9vdAorKi8KK3I1OQorICAgIDogKHQrPUlEKSsgc3RhdGVtZW50IC0+IF4oJHQgc3RhdGVtZW50KSsKKyAgICA7CisKK3ByaW1hcnkKKyAgICA6IElECisgICAgOworCitleHByZXNzaW9uCisgICAgOiByMQorICAgIDsKKworc3RhdGVtZW50CisgICAgOiAnZm9vemUnCisgICAgfCAnZm9vemUyJworICAgIDsKKworbW9kaWZpZXJzCisgICAgOiBtb2RpZmllcisKKyAgICA7CisKK21vZGlmaWVyCisgICAgOiAncHVibGljJworICAgIHwgJ3ByaXZhdGUnCisgICAgOworCit0eXBlCisgICAgOiAnaW50JworICAgIHwgJ2Jvb2wnCisgICAgOworCitJRCA6ICdhJy4uJ3onICsgOworSU5UIDogJzAnLi4nOScgKzsKK1dTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDJhc3QuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQyYXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjJlNzM0OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQyYXN0Lmh0bWwKQEAgLTAsMCArMSw0NjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQyYXN0PC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDJhc3RMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQyYXN0UGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRMZXhlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDA0MmFzdExleGVyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDA0MmFzdFBhcnNlciwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworCisgICAgZnVuY3Rpb24gcGFyc2UodGV4dCwgbWV0aG9kLCByQXJncywga3dhcmdzKSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHRleHQpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICAgICAgckFyZ3MgPSByQXJncyB8fCBbXTsKKyAgICAgICAgICAgIGt3YXJncyA9IGt3YXJncyB8fCB7fTsKKworICAgICAgICAgICAgb3JnLmFudGxyLmxhbmcuYXVnbWVudE9iamVjdChwYXJzZXIsIGt3YXJncyk7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VyW21ldGhvZF0uYXBwbHkocGFyc2VyLCByQXJncyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIxKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCIxICsgMiIsICJyMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKCsgMSAyKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMmEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImFzc2VydCAyKzM7IiwgInIyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoYXNzZXJ0ICgrIDIgMykpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIyYigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiYXNzZXJ0IDIrMyA6IDU7IiwgInIyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoYXNzZXJ0ICgrIDIgMykgNSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjNhKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJpZiAxIGZvb3plIiwgInIzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoaWYgMSBmb296ZSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjNiKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJpZiAxIGZvb3plIGVsc2UgZm9vemUiLCAicjMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihpZiAxIGZvb3plIGZvb3plKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNGEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIndoaWxlIDIgZm9vemUiLCAicjQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIih3aGlsZSAyIGZvb3plKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNGIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIndoaWxlIDIgZm9vemUiLCAicjQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIih3aGlsZSAyIGZvb3plKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNWEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoInJldHVybjsiLCAicjUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgInJldHVybiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNWIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoInJldHVybiAyKzM7IiwgInI1Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIocmV0dXJuICgrIDIgMykpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI2YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiMyIsICJyNiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiMyIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNmIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIjMgYSIsICJyNiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiMyBhIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI3KCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCIzIiwgInI3Iik7CisgICAgICAgIGFzc2VydE51bGwoci50cmVlKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjgoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoInZhciBmb286Ym9vbCIsICJyOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKHZhciBib29sIGZvbykiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjkoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImludCBmb287IiwgInI5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoVkFSREVGIGludCBmb28pIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIxMCgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiMTAiLCAicjEwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIxMC4wIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIxMWEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIjErMiIsICJyMTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihFWFBSICgrIDEgMikpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIxMWIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIiIsICJyMTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIkVYUFIiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjEyYSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZm9vIiwgInIxMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiZm9vIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIxMmIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImZvbywgYmFyLCBnbnVyeiIsICJyMTIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgImZvbyBiYXIgZ251cnoiKTsKKyAgICB9CisgICAKKyAgICBmdW5jdGlvbiB0ZXN0UjEzYSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiaW50IGZvbzsiLCAicjEzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoaW50IGZvbykiKTsKKyAgICB9CisgICAKKyAgICBmdW5jdGlvbiB0ZXN0UjEzYigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiYm9vbCBmb28sIGJhciwgZ251cno7IiwgInIxMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKGJvb2wgZm9vIGJhciBnbnVyeikiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjE0YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiMSsyIGludCIsICJyMTQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihFWFBSICgrIDEgMikgaW50KSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTRiKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCIxKzIgaW50IGJvb2wiLCAicjE0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoRVhQUiAoKyAxIDIpIGludCBib29sKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTRjKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJpbnQgYm9vbCIsICJyMTQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihFWFBSIGludCBib29sKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTRkKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJmb296ZSBmb296ZSBpbnQgYm9vbCIsICJyMTQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihFWFBSIGZvb3plIGZvb3plIGludCBib29sKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTRlKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCI3KzkgZm9vemUgZm9vemUgaW50IGJvb2wiLCAicjE0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoRVhQUiAoKyA3IDkpIGZvb3plIGZvb3plIGludCBib29sKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTUoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIjciLCAicjE1Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICI3IDciKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjE2YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiaW50IGZvbyIsICJyMTYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihpbnQgZm9vKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTZiKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJpbnQgZm9vLCBiYXIsIGdudXJ6IiwgInIxNiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKGludCBmb28pIChpbnQgYmFyKSAoaW50IGdudXJ6KSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMTdhKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJmb3IgKCBmb296ZSA7IDEgKyAyIDsgZm9vemUgKSBmb296ZSIsICJyMTciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihmb3IgZm9vemUgKCsgMSAyKSBmb296ZSBmb296ZSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjE4YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZm9yIiwgInIxOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiQkxPQ0siKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjE5YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZm9yIiwgInIxOSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiZm9yIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIyMGEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImZvciIsICJyMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIkZPUiIpOworICAgIH0KKyAgCisgICAgZnVuY3Rpb24gdGVzdFIyMWEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImZvciIsICJyMjEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIkJMT0NLIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIyMmEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImZvciIsICJyMjIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgImZvciIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMjNhKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJmb3IiLCAicjIzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICJGT1IiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjI0YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZm9vemUgMSArIDIiLCAicjI0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoZm9vemUgKCsgMSAyKSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjI1YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZm9vemUsIGZvb3plIDEgKyAyIiwgInIyNSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKGZvb3plICgrIDEgMikpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIyNmEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImZvb3plLCBmb296ZTIiLCAicjI2Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoQkxPQ0sgZm9vemUgZm9vemUyKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMjdhKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJmb296ZSAxICsgMiIsICJyMjciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihmb296ZSAoZm9vemUgKCsgMSAyKSkpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIyOCgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZm9vMjhhIiwgInIyOCIpOworICAgICAgICBhc3NlcnROdWxsKHIuZ2V0VHJlZSgpKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjI5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHIgPSBwYXJzZSgiIiwgInIyOSIpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIG5vdCByZWFjaCBoZXJlIik7CisgICAgICAgIH0gY2F0Y2goZSkge30KKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjMxYSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgicHVibGljIGludCBnbnVyeiA9IDEgKyAyOyIsICJyMzEiLCBudWxsLCB7ZmxhZzowfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICcoVkFSREVGIGdudXJ6IHB1YmxpYyBpbnQgKCsgMSAyKSknKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjMxYigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgicHVibGljIGludCBnbnVyeiA9IDEgKyAyOyIsICJyMzEiLCBudWxsLCB7ZmxhZzoxfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICcoVkFSSUFCTEUgZ251cnogcHVibGljIGludCAoKyAxIDIpKScpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMzFjKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJwdWJsaWMgaW50IGdudXJ6ID0gMSArIDI7IiwgInIzMSIsIG51bGwsIHtmbGFnOjJ9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgJyhGSUVMRCBnbnVyeiBwdWJsaWMgaW50ICgrIDEgMikpJyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIzMmEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImdudXJ6IDMyIiwgInIzMiIsIFsxXSwge2ZsYWc6Mn0pOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAnZ251cnonKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjMyYigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZ251cnogMzIiLCAicjMyIiwgWzJdLCB7ZmxhZzoyfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICczMicpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMzJjKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiAzMiIsICJyMzIiLCBbM10sIHtmbGFnOjJ9KTsKKyAgICAgICAgYXNzZXJ0TnVsbChyLnRyZWUpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMzNhKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJwdWJsaWMgcHJpdmF0ZSBmb296ZSIsICJyMzMiLCBbMl0sIHtmbGFnOjJ9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgJ2Zvb3plJyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIzNGEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoInB1YmxpYyBjbGFzcyBnbnVyeiB7IGZvb3plIGZvb3plMiB9IiwgInIzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKGNsYXNzIGdudXJ6IHB1YmxpYyBmb296ZSBmb296ZTIpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIzNGIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoInB1YmxpYyBjbGFzcyBnbnVyeiBleHRlbmRzIGJvb2wgaW1wbGVtZW50cyBpbnQsIGJvb2wgeyBmb296ZSBmb296ZTIgfSIsICJyMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihjbGFzcyBnbnVyeiBwdWJsaWMgKGV4dGVuZHMgYm9vbCkgKGltcGxlbWVudHMgaW50IGJvb2wpIGZvb3plIGZvb3plMikiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjM1KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIHIgPSBwYXJzZSgieyBleHRlbmRzIH0iLCAicjM1Iik7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgbm90IHJlYWNoIGhlcmUiKTsKKyAgICAgICAgfSBjYXRjaChlKSB7fQorICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMzZhKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJpZiAoIDEgKyAyICkgZm9vemUiLCAicjM2Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoaWYgKEVYUFIgKCsgMSAyKSkgZm9vemUpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIzNmIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImlmICggMSArIDIgKSBmb296ZSBlbHNlIGZvb3plMiIsICJyMzYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihpZiAoRVhQUiAoKyAxIDIpKSBmb296ZSBmb296ZTIpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFIzNygpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiMSArIDIgKyAzIiwgInIzNyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKCsgKCsgMSAyKSAzKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMzgoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIjEgKyAyICsgMyIsICJyMzgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIigrICgrIDEgMikgMykiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjM5YSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZ251cnpbMV0iLCAicjM5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoSU5ERVggZ251cnogMSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjM5YigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZ251cnooMikiLCAicjM5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoQ0FMTCBnbnVyeiAyKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSMzljKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyei5nbnVyeiIsICJyMzkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihGSUVMREFDQ0VTUyBnbnVyeiBnbnVyeikiKTsKKyAgICB9CisgCisgICAgZnVuY3Rpb24gdGVzdFIzOWQoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImdudXJ6LmduYXJ6Lmdub3J6IiwgInIzOSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKEZJRUxEQUNDRVNTIChGSUVMREFDQ0VTUyBnbnVyeiBnbmFyeikgZ25vcnopIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI0MCgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiMSArIDIgKyAzOyIsICJyNDAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIigrIDEgMiAzKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNDEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoIjEgKyAyICsgMzsiLCAicjQxIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoMyAoMiAxKSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjQyKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiwgZ25hcnosIGdub3J6IiwgInI0MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiZ251cnogZ25hcnogZ25vcnoiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjQzKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiwgZ25hcnosIGdub3J6IiwgInI0MyIpOworICAgICAgICBhc3NlcnROdWxsKHIudHJlZSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHIucmVzLCBbImdudXJ6IiwgImduYXJ6IiwgImdub3J6Il0pOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNDQoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImdudXJ6LCBnbmFyeiwgZ25vcnoiLCAicjQ0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoZ25vcnogKGduYXJ6IGdudXJ6KSkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjQ1KCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiIsICJyNDUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgImdudXJ6Iik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI0NigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZ251cnosIGduYXJ6LCBnbm9yeiIsICJyNDYiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyLnRyZWUpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhyLnJlcywgWyJnbnVyeiIsICJnbmFyeiIsICJnbm9yeiJdKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjQ3KCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiwgZ25hcnosIGdub3J6IiwgInI0NyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiZ251cnogZ25hcnogZ25vcnoiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjQ4KCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiwgZ25hcnosIGdub3J6IiwgInI0OCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiZ251cnogZ25hcnogZ25vcnoiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjQ5KCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiBnbm9yeiIsICJyNDkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIihnbnVyeiBnbm9yeikiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjUwKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJnbnVyeiIsICJyNTAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgIigxLjAgZ251cnopIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI1MSgpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiZ251cnphIGdudXJ6YiBnbnVyemMiLCAicjUxIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnJlcy50b1N0cmluZ1RyZWUoKSwgImdudXJ6YiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNTIoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImdudXJ6IiwgInI1MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5yZXMudG9TdHJpbmdUcmVlKCksICJnbnVyeiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNTMoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImdudXJ6IiwgInI1MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5yZXMudG9TdHJpbmdUcmVlKCksICJnbnVyeiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNTQoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImdudXJ6YSAxICsgMiBnbnVyemIiLCAicjU0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICIoKyAxIDIpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI1NWEoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoInB1YmxpYyBwcml2YXRlIDEgKyAyIiwgInI1NSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAicHVibGljIHByaXZhdGUgKCsgMSAyKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNTViKCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJwdWJsaWMgZm9vemUiLCAicjU1Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLnRyZWUudG9TdHJpbmdUcmVlKCksICJwdWJsaWMgZm9vemUiKTsgCisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFI1NigpIHsKKyAgICAgICAgdmFyIHIgPSBwYXJzZSgiYSBiIGMgZCIsICJyNTYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIudHJlZS50b1N0cmluZ1RyZWUoKSwgImZvbyIpOyAKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UjU3KCkgeworICAgICAgICB2YXIgciA9IHBhcnNlKCJhIGIgYyBkIiwgInI1NyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiZm9vIik7IAorICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSNTkoKSB7CisgICAgICAgIHZhciByID0gcGFyc2UoImEgYiBjIGZvb3plIiwgInI1OSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci50cmVlLnRvU3RyaW5nVHJlZSgpLCAiKGEgZm9vemUpIChiIGZvb3plKSAoYyBmb296ZSkiKTsgCisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDQyYXN0PC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQzc3lucHJlZC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDNzeW5wcmVkLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjI5MzE1MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQzc3lucHJlZC5nCkBAIC0wLDAgKzEsMTQgQEAKK2dyYW1tYXIgdDA0M3N5bnByZWQ7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBKYXZhU2NyaXB0OworfQorCithOiAoKHMrIFApPT4gcysgYik/IEU7CitiOiBQICdmb28nOworCitzOiBTOworCisKK1M6ICcgJzsKK1A6ICcrJzsKK0U6ICc+JzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQzc3lucHJlZC5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDNzeW5wcmVkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQzNGJkYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQzc3lucHJlZC5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQzc3lucHJlZDwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQzc3lucHJlZExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDNzeW5wcmVkUGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRMZXhlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDA0M3N5bnByZWRMZXhlciwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciBUUGFyc2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRQYXJzZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRQYXJzZXIsIHQwNDNzeW5wcmVkUGFyc2VyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisKKyAgICBmdW5jdGlvbiB0ZXN0VmFsaWQxKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnICAgK2Zvbz4nKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDQzc3lucHJlZDwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NHRyYWNlLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NHRyYWNlLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBmMjdjNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ0dHJhY2UuZwpAQCAtMCwwICsxLDEyIEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK2dyYW1tYXIgdDA0NHRyYWNlOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gSmF2YVNjcmlwdDsKK30KKworYTogJzwnICgoSU5UICcrJyk9PmJ8YykgJz4nOworYjogYyAoJysnIGMpKjsKK2M6IElOVDsKKworSU5UOiAoJzAnLi4nOScpKzsKK1dTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ0dHJhY2UuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ0dHJhY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMGI5OWNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDR0cmFjZS5odG1sCkBAIC0wLDAgKzEsNzYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQ0dHJhY2U8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0NHRyYWNlTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0NHRyYWNlUGFyc2VyLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUTGV4ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgdGhpcy50cmFjZXMgPSBbXTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwNDR0cmFjZUxleGVyLCB7CisgICAgICAgIHRyYWNlSW46IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgIHRoaXMudHJhY2VzLnB1c2goIj4iK3J1bGVOYW1lKTsKKyAgICAgICAgfSwKKyAgICAgICAgdHJhY2VPdXQ6IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgIHRoaXMudHJhY2VzLnB1c2goIjwiK3J1bGVOYW1lKTsKKyAgICAgICAgfSwKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgVFBhcnNlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUUGFyc2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgdGhpcy50cmFjZXMgPSBbXTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUUGFyc2VyLCB0MDQ0dHJhY2VQYXJzZXIsIHsKKyAgICAgICAgdHJhY2VJbjogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPiIrcnVsZU5hbWUpOworICAgICAgICB9LAorICAgICAgICB0cmFjZU91dDogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPCIrcnVsZU5hbWUpOworICAgICAgICB9LAorICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworCisgICAgZnVuY3Rpb24gdGVzdFRyYWNlKCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgnPCAxICsgMiArIDMgPicpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKworICAgICAgICBwYXJzZXIuYSgpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhsZXhlci50cmFjZXMsCisgICAgICAgICAgICBbICc+VF9fNicsICc8VF9fNicsICc+V1MnLCAnPFdTJywgJz5JTlQnLCAnPElOVCcsICc+V1MnLCAnPFdTJywKKyAgICAgICAgICAgICAgJz5UX184JywgJzxUX184JywgJz5XUycsICc8V1MnLCAnPklOVCcsICc8SU5UJywgJz5XUycsICc8V1MnLAorICAgICAgICAgICAgICAnPlRfXzgnLCAnPFRfXzgnLCAnPldTJywgJzxXUycsICc+SU5UJywgJzxJTlQnLCAnPldTJywgJzxXUycsCisgICAgICAgICAgICAgICc+VF9fNycsICc8VF9fNyddCisgICAgICAgICk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHBhcnNlci50cmFjZXMsCisgICAgICAgICAgICBbICc+YScsICc+c3lucHJlZDFfdDA0NHRyYWNlX2ZyYWdtZW50JywgJzxzeW5wcmVkMV90MDQ0dHJhY2VfZnJhZ21lbnQnLCAnPmInLCAnPmMnLAorICAgICAgICAgICAgICAnPGMnLCAnPmMnLCAnPGMnLCAnPmMnLCAnPGMnLCAnPGInLCAnPGEnIF0KKyAgICAgICAgKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwNDR0cmFjZTwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NWRmYWJ1Zy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDVkZmFidWcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjJjNTcyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDVkZmFidWcuZwpAQCAtMCwwICsxLDMxIEBACitncmFtbWFyIHQwNDVkZmFidWc7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZSA9IEphdmFTY3JpcHQ7CisgICAgb3V0cHV0ID0gQVNUOworfQorCisKK3IKK29wdGlvbnMgeyBiYWNrdHJhY2s9dHJ1ZTsgfQorICAgIDogKG1vZGlmaWVyKyBJTlQpPT4gbW9kaWZpZXIrIGV4cHJlc3Npb24KKyAgICB8IG1vZGlmaWVyKyBzdGF0ZW1lbnQKKyAgICA7CisKK2V4cHJlc3Npb24KKyAgICA6IElOVCAnKycgSU5UCisgICAgOworCitzdGF0ZW1lbnQKKyAgICA6ICdmb296ZScKKyAgICB8ICdmb296ZTInCisgICAgOworCittb2RpZmllcgorICAgIDogJ3B1YmxpYycKKyAgICB8ICdwcml2YXRlJworICAgIDsKKworSUQgOiAnYScuLid6JyArIDsKK0lOVCA6ICcwJy4uJzknICs7CitXUzogKCcgJyB8ICdcbicgfCAnXHQnKSsgeyRjaGFubmVsID0gSElEREVOO307CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ1ZGZhYnVnLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NWRmYWJ1Zy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmOWRmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NWRmYWJ1Zy5odG1sCkBAIC0wLDAgKzEsNTIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQ1ZGZhYnVnPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDVkZmFidWdMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ1ZGZhYnVnUGFyc2VyLmpzIj48L3NjcmlwdD4KKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIFRMZXhlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICBUTGV4ZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRMZXhlciwgdDA0NWRmYWJ1Z0xleGVyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDA0NWRmYWJ1Z1BhcnNlciwgeworICAgICAgICByZWNvdmVyOiBmdW5jdGlvbihyZSkgeworICAgICAgICAgICAgLyogZG9uJ3QgcmVjb3ZlciwganVzdCBjcmFzaCAqLworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0KKyAgICB9KTsKKworCisgICAgZnVuY3Rpb24gdGVzdFZhbGlkMSgpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oJ3B1YmxpYyBmb296ZScpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKyAgICAgICAgcGFyc2VyLnIoKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwNDVkZmFidWc8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDZyZXdyaXRlLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NnJld3JpdGUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MWFhYjgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDZyZXdyaXRlLmcKQEAgLTAsMCArMSw1NiBAQAorZ3JhbW1hciB0MDQ2cmV3cml0ZTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7Cit9CisKK3Byb2dyYW0KK0Bpbml0IHsKKyAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0LkxUKDEpOworfQorICAgIDogICBtZXRob2QrCisgICAgICAgIHsKKyAgICAgICAgdGhpcy5pbnB1dC5pbnNlcnRCZWZvcmUoc3RhcnQsInB1YmxpYyBjbGFzcyBXcmFwcGVyIHtcbiIpCisgICAgICAgIHRoaXMuaW5wdXQuaW5zZXJ0QWZ0ZXIoJG1ldGhvZC5zdG9wLCAiXG59XG4iKQorICAgICAgICB9CisgICAgOworCittZXRob2QKKyAgICA6ICAgbT0nbWV0aG9kJyBJRCAnKCcgJyknIGJvZHkKKyAgICAgICAge3RoaXMuaW5wdXQucmVwbGFjZSgkbSwgInB1YmxpYyB2b2lkIik7fQorICAgIDsgCisKK2JvZHkKK3Njb3BlIHsKKyAgICBkZWNscworfQorQGluaXQgeworICAgICRib2R5OjpkZWNscyA9IHt9OworfQorICAgIDogICBsY3VybHk9J3snIHN0YXQqICd9JworICAgICAgICB7CisgICAgICAgIHZhciBpdDsKKyAgICAgICAgZm9yIChpdCBpbiAkYm9keTo6ZGVjbHMpIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQuaW5zZXJ0QWZ0ZXIoJGxjdXJseSwgIlxuaW50ICIraXQrIjsiKQorICAgICAgICB9CisgICAgICAgIH0KKyAgICA7CisKK3N0YXQ6ICAgSUQgJz0nIGV4cHIgJzsnIHskYm9keTo6ZGVjbHNbJElELnRleHRdID0gdHJ1ZTt9CisgICAgOworCitleHByOiAgIG11bCAoJysnIG11bCkqIAorICAgIDsKKworbXVsIDogICBhdG9tICgnKicgYXRvbSkqCisgICAgOworCithdG9tOiAgIElECisgICAgfCAgIElOVAorICAgIDsKKworSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWicpKyA7CisKK0lOVCA6ICAgKCcwJy4uJzknKSsgOworCitXUyAgOiAgICgnICd8J1x0J3wnXG4nKSsgeyRjaGFubmVsPUhJRERFTjt9CisgICAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDZyZXdyaXRlLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0NnJld3JpdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZWQ3ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDZyZXdyaXRlLmh0bWwKQEAgLTAsMCArMSw4MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwNDZyZXdyaXRlPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDZyZXdyaXRlTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0NnJld3JpdGVQYXJzZXIuanMiPjwvc2NyaXB0PgorCisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgVExleGVyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRMZXhlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVExleGVyLCB0MDQ2cmV3cml0ZUxleGVyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDA0NnJld3JpdGVQYXJzZXIsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgICAgIC8qIGRvbid0IHJlY292ZXIsIGp1c3QgY3Jhc2ggKi8KKyAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICB9CisgICAgfSk7CisKKworICAgIGZ1bmN0aW9uIHRlc3RWYWxpZDEoKSB7CisgICAgICAgIHZhciB4aW5wdXQgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0aG9kIGZvbygpIHsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgaSA9IDM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIGsgPSBpOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICBpID0gayo0OyIsCisgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZXRob2QgYmFyKCkgeyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICBqID0gaSoyOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgIF0uam9pbigiXG4iKTsKKyAgICAgICAgdmFyIHhvdXRwdXQgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIGNsYXNzIFdyYXBwZXIgeyIsCisgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIHZvaWQgZm9vKCkgeyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGs7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgaTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgaSA9IDM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIGsgPSBpOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICBpID0gayo0OyIsCisgICAgICAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWMgdm9pZCBiYXIoKSB7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgajsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgaiA9IGkqMjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oIlxuIik7CisgCisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBUTGV4ZXIoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLlRva2VuUmV3cml0ZVN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVFBhcnNlcih0c3RyZWFtKTsKKyAgICAgICAgcGFyc2VyLnByb2dyYW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRzdHJlYW0udG9TdHJpbmcoKSwgeG91dHB1dCk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDQ2cmV3cml0ZTwvaDE+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0N3RyZWVwYXJzZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ3dHJlZXBhcnNlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3NDRmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0N3RyZWVwYXJzZXIuZwpAQCAtMCwwICsxLDExMyBAQAorZ3JhbW1hciB0MDQ3dHJlZXBhcnNlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KKwordG9rZW5zIHsKKyAgICBWQVJfREVGOworICAgIEFSR19ERUY7CisgICAgRlVOQ19IRFI7CisgICAgRlVOQ19ERUNMOworICAgIEZVTkNfREVGOworICAgIEJMT0NLOworfQorCitwcm9ncmFtCisgICAgOiAgIGRlY2xhcmF0aW9uKworICAgIDsKKworZGVjbGFyYXRpb24KKyAgICA6ICAgdmFyaWFibGUKKyAgICB8ICAgZnVuY3Rpb25IZWFkZXIgJzsnIC0+IF4oRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyKQorICAgIHwgICBmdW5jdGlvbkhlYWRlciBibG9jayAtPiBeKEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrKQorICAgIDsKKwordmFyaWFibGUKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICc7JyAtPiBeKFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yKQorICAgIDsKKworZGVjbGFyYXRvcgorICAgIDogICBJRCAKKyAgICA7CisKK2Z1bmN0aW9uSGVhZGVyCisgICAgOiAgIHR5cGUgSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScKKyAgICAgICAgLT4gXihGVU5DX0hEUiB0eXBlIElEIGZvcm1hbFBhcmFtZXRlcispCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yIC0+IF4oQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IpCisgICAgOworCit0eXBlCisgICAgOiAgICdpbnQnICAgCisgICAgfCAgICdjaGFyJyAgCisgICAgfCAgICd2b2lkJworICAgIHwgICBJRCAgICAgICAgCisgICAgOworCitibG9jaworICAgIDogICBsYz0neycKKyAgICAgICAgICAgIHZhcmlhYmxlKgorICAgICAgICAgICAgc3RhdCoKKyAgICAgICAgJ30nCisgICAgICAgIC0+IF4oQkxPQ0tbJGxjLCJCTE9DSyJdIHZhcmlhYmxlKiBzdGF0KikKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnIQorICAgIHwgYmxvY2sKKyAgICB8IGFzc2lnblN0YXQgJzsnIQorICAgIHwgJzsnIQorICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgc3RhcnQ9YXNzaWduU3RhdCAnOycgZXhwciAnOycgbmV4dD1hc3NpZ25TdGF0ICcpJyBibG9jaworICAgICAgICAtPiBeKCdmb3InICRzdGFydCBleHByICRuZXh0IGJsb2NrKQorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCBFUSBleHByIC0+IF4oRVEgSUQgZXhwcikKKyAgICA7CisKK2V4cHI6ICAgY29uZEV4cHIKKyAgICA7CisKK2NvbmRFeHByCisgICAgOiAgIGFleHByICggKCc9PSdeIHwgJzwnXikgYWV4cHIgKT8KKyAgICA7CisKK2FleHByCisgICAgOiAgIGF0b20gKCAnKydeIGF0b20gKSoKKyAgICA7CisKK2F0b20KKyAgICA6IElEICAgICAgCisgICAgfCBJTlQgICAgICAKKyAgICB8ICcoJyBleHByICcpJyAtPiBleHByCisgICAgOyAKKworRk9SIDogJ2ZvcicgOworSU5UX1RZUEUgOiAnaW50JyA7CitDSEFSOiAnY2hhcic7CitWT0lEOiAndm9pZCc7CisKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgOworCitJTlQgOgkoJzAnLi4nOScpKworICAgIDsKKworRVEgICA6ICc9JyA7CitFUUVRIDogJz09JyA7CitMVCAgIDogJzwnIDsKK1BMVVMgOiAnKycgOworCitXUyAgOiAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgICdccicKKyAgICAgICAgfCAgICdcbicKKyAgICAgICAgKSsKKyAgICAgICAgeyAkY2hhbm5lbD1ISURERU47IH0KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDd0cmVlcGFyc2VyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0N3RyZWVwYXJzZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzM1NmYyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDd0cmVlcGFyc2VyLmh0bWwKQEAgLTAsMCArMSwxMjkgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQ3dHJlZXBhcnNlcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ3dHJlZXBhcnNlckxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDd0cmVlcGFyc2VyUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDd0cmVlcGFyc2VyV2Fsa2VyLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUTGV4ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwNDd0cmVlcGFyc2VyTGV4ZXIsIHsKKyAgICAgICAgcmVwb3J0RXJyb3I6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgdmFyIFRQYXJzZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVFBhcnNlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgfTsKKyAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFBhcnNlciwgdDA0N3RyZWVwYXJzZXJQYXJzZXIsIHsKKyAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24ocmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByaXZhdGVFcnJvcihyZSk7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciBUV2Fsa2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgIFRXYWxrZXIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICAgICAgICB0aGlzLnRyYWNlcyA9IFtdOworICAgIH07CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFRXYWxrZXIsIHQwNDd0cmVlcGFyc2VyV2Fsa2VyLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmF0ZUVycm9yKHJlKTsKKyAgICAgICAgfSwKKyAgICAgICAgdHJhY2VJbjogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPiIrcnVsZU5hbWUpOworICAgICAgICB9LAorICAgICAgICB0cmFjZU91dDogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPCIrcnVsZU5hbWUpOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBmdW5jdGlvbiB0ZXN0V2Fsa2VyKCkgeworICAgICAgICB2YXIgeGlucHV0ID0gWworICAgICAgICAgICAgICAgICAgICAgICAgImNoYXIgYzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCB4OyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2b2lkIGJhcihpbnQgeCk7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCBmb28oaW50IHksIGNoYXIgZCkgeyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgaTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgZm9yIChpPTA7IGk8MzsgaT1pKzEpIHsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB4PTM7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgeT01OyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCJcbiIpLAorICAgICAgICAgICAgeG91dHB1dCA9ICIoVkFSX0RFRiBjaGFyIGMpIChWQVJfREVGIGludCB4KSAoRlVOQ19ERUNMIChGVU5DX0hEUiB2b2lkIGJhciAoQVJHX0RFRiBpbnQgeCkpKSAoRlVOQ19ERUYgKEZVTkNfSERSIGludCBmb28gKEFSR19ERUYgaW50IHkpIChBUkdfREVGIGNoYXIgZCkpIChCTE9DSyAoVkFSX0RFRiBpbnQgaSkgKGZvciAoPSBpIDApICg8IGkgMykgKD0gaSAoKyBpIDEpKSAoQkxPQ0sgKD0geCAzKSAoPSB5IDUpKSkpKSIsCisgICAgICAgICAgICB0cmFjZXMgPSBbCisgICAgICAgICAgICAgICc+cHJvZ3JhbScsICc+ZGVjbGFyYXRpb24nLCAnPnZhcmlhYmxlJywgJz50eXBlJywgJzx0eXBlJywKKyAgICAgICAgICAgICAgJz5kZWNsYXJhdG9yJywgJzxkZWNsYXJhdG9yJywgJzx2YXJpYWJsZScsICc8ZGVjbGFyYXRpb24nLAorICAgICAgICAgICAgICAnPmRlY2xhcmF0aW9uJywgJz52YXJpYWJsZScsICc+dHlwZScsICc8dHlwZScsICc+ZGVjbGFyYXRvcicsCisgICAgICAgICAgICAgICc8ZGVjbGFyYXRvcicsICc8dmFyaWFibGUnLCAnPGRlY2xhcmF0aW9uJywgJz5kZWNsYXJhdGlvbicsCisgICAgICAgICAgICAgICc+ZnVuY3Rpb25IZWFkZXInLCAnPnR5cGUnLCAnPHR5cGUnLCAnPmZvcm1hbFBhcmFtZXRlcicsCisgICAgICAgICAgICAgICc+dHlwZScsICc8dHlwZScsICc+ZGVjbGFyYXRvcicsICc8ZGVjbGFyYXRvcicsCisgICAgICAgICAgICAgICc8Zm9ybWFsUGFyYW1ldGVyJywgJzxmdW5jdGlvbkhlYWRlcicsICc8ZGVjbGFyYXRpb24nLAorICAgICAgICAgICAgICAnPmRlY2xhcmF0aW9uJywgJz5mdW5jdGlvbkhlYWRlcicsICc+dHlwZScsICc8dHlwZScsCisgICAgICAgICAgICAgICc+Zm9ybWFsUGFyYW1ldGVyJywgJz50eXBlJywgJzx0eXBlJywgJz5kZWNsYXJhdG9yJywKKyAgICAgICAgICAgICAgJzxkZWNsYXJhdG9yJywgJzxmb3JtYWxQYXJhbWV0ZXInLCAnPmZvcm1hbFBhcmFtZXRlcicsICc+dHlwZScsCisgICAgICAgICAgICAgICc8dHlwZScsICc+ZGVjbGFyYXRvcicsICc8ZGVjbGFyYXRvcicsICc8Zm9ybWFsUGFyYW1ldGVyJywKKyAgICAgICAgICAgICAgJzxmdW5jdGlvbkhlYWRlcicsICc+YmxvY2snLCAnPnZhcmlhYmxlJywgJz50eXBlJywgJzx0eXBlJywKKyAgICAgICAgICAgICAgJz5kZWNsYXJhdG9yJywgJzxkZWNsYXJhdG9yJywgJzx2YXJpYWJsZScsICc+c3RhdCcsICc+Zm9yU3RhdCcsCisgICAgICAgICAgICAgICc+ZXhwcicsICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsICc8ZXhwcicsICc8ZXhwcicsICc+ZXhwcicsCisgICAgICAgICAgICAgICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsICc8ZXhwcicsICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsCisgICAgICAgICAgICAgICc8ZXhwcicsICc8ZXhwcicsICc+ZXhwcicsICc+ZXhwcicsICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsCisgICAgICAgICAgICAgICc8ZXhwcicsICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsICc8ZXhwcicsICc8ZXhwcicsICc8ZXhwcicsCisgICAgICAgICAgICAgICc+YmxvY2snLCAnPnN0YXQnLCAnPmV4cHInLCAnPmV4cHInLCAnPmF0b20nLCAnPGF0b20nLCAnPGV4cHInLAorICAgICAgICAgICAgICAnPGV4cHInLCAnPHN0YXQnLCAnPnN0YXQnLCAnPmV4cHInLCAnPmV4cHInLCAnPmF0b20nLCAnPGF0b20nLAorICAgICAgICAgICAgICAnPGV4cHInLCAnPGV4cHInLCAnPHN0YXQnLCAnPGJsb2NrJywgJzxmb3JTdGF0JywgJzxzdGF0JywKKyAgICAgICAgICAgICAgJzxibG9jaycsICc8ZGVjbGFyYXRpb24nLCAnPHByb2dyYW0nCisgICAgICAgICAgICBdOworCisKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSk7CisgICAgICAgIHZhciByID0gcGFyc2VyLnByb2dyYW0oKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRUcmVlKCkudG9TdHJpbmdUcmVlKCksIHhvdXRwdXQpOworCisgICAgICAgIHZhciBub2RlcyA9IG5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWVOb2RlU3RyZWFtKHIuZ2V0VHJlZSgpKTsKKyAgICAgICAgbm9kZXMuc2V0VG9rZW5TdHJlYW0odHN0cmVhbSk7CisgICAgICAgIHZhciB3YWxrZXIgPSBuZXcgVFdhbGtlcihub2Rlcyk7CisgICAgICAgIHdhbGtlci5wcm9ncmFtKCk7CisKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMod2Fsa2VyLnRyYWNlcywgdHJhY2VzKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UnVsZUxhYmVsUHJvcGVydHlSZWZUZXh0KCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSgiXG5jaGFyIGM7XG4iKSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IFRMZXhlcihjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IFRQYXJzZXIodHN0cmVhbSksCisgICAgICAgICAgICByID0gcGFyc2VyLnZhcmlhYmxlKCk7CisKKyAgICAgICAgdmFyIG5vZGVzID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci5nZXRUcmVlKCkpOworICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0c3RyZWFtKTsKKyAgICAgICAgdmFyIHdhbGtlciA9IG5ldyBUV2Fsa2VyKG5vZGVzKTsKKyAgICAgICAgciA9IHdhbGtlci52YXJpYWJsZSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyLCAnYycpOworICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA0N3RyZWVwYXJzZXI8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDd0cmVlcGFyc2VyV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0N3RyZWVwYXJzZXJXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOWFiODU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDd0cmVlcGFyc2VyV2Fsa2VyLmcKQEAgLTAsMCArMSw2OCBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA0N3RyZWVwYXJzZXJXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIHRva2VuVm9jYWI9dDA0N3RyZWVwYXJzZXI7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7Cit9CisKK3Byb2dyYW0KKyAgICA6ICAgZGVjbGFyYXRpb24rCisgICAgOworCitkZWNsYXJhdGlvbgorICAgIDogICB2YXJpYWJsZQorICAgIHwgICBeKEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlcikKKyAgICB8ICAgXihGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jaykKKyAgICA7CisKK3ZhcmlhYmxlIHJldHVybnMgW3Jlc10KKyAgICA6ICAgXihWQVJfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICAgICAgeyAKKyAgICAgICAgICAgICRyZXMgPSAkZGVjbGFyYXRvci50ZXh0OworICAgICAgICB9CisgICAgOworCitkZWNsYXJhdG9yCisgICAgOiAgIElEIAorICAgIDsKKworZnVuY3Rpb25IZWFkZXIKKyAgICA6ICAgXihGVU5DX0hEUiB0eXBlIElEIGZvcm1hbFBhcmFtZXRlcispCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgXihBUkdfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgJ2ludCcKKyAgICB8ICAgJ2NoYXInCisgICAgfCAgICd2b2lkJworICAgIHwgICBJRCAgICAgICAgCisgICAgOworCitibG9jaworICAgIDogICBeKEJMT0NLIHZhcmlhYmxlKiBzdGF0KikKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIKKyAgICB8IGJsb2NrCisgICAgOworCitmb3JTdGF0CisgICAgOiAgIF4oJ2ZvcicgZXhwciBleHByIGV4cHIgYmxvY2spCisgICAgOworCitleHByOiAgIF4oRVFFUSBleHByIGV4cHIpCisgICAgfCAgIF4oTFQgZXhwciBleHByKQorICAgIHwgICBeKFBMVVMgZXhwciBleHByKQorICAgIHwgICBeKEVRIElEIGV4cHIpCisgICAgfCAgIGF0b20KKyAgICA7CisKK2F0b20KKyAgICA6IElEICAgICAgCisgICAgfCBJTlQgICAgICAKKyAgICA7IApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDhyZXdyaXRlLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OHJld3JpdGUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMmExZjhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDhyZXdyaXRlLmcKQEAgLTAsMCArMSw5IEBACitsZXhlciBncmFtbWFyIHQwNDhyZXdyaXRlOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KKworQTogJ2EnOworQjogJ2InOworQzogJ2MnOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OHJld3JpdGUuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ4cmV3cml0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0MDBlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OHJld3JpdGUuaHRtbApAQCAtMCwwICsxLDI4NSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwNDhyZXdyaXRlPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDhyZXdyaXRlLmpzIj48L3NjcmlwdD4KKworPCEtLSBKc1VuaXQgaW5jbHVkZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL2pzdW5pdC9hcHAvanNVbml0Q29yZS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gVGVzdCBDb2RlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBUTGV4ZXIgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgVExleGVyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICB9OworICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChUTGV4ZXIsIHQwNDhyZXdyaXRlLCB7CisgICAgICAgIHJlY292ZXI6IGZ1bmN0aW9uKHJlKSB7CisgICAgICAgICAgICAvKiBkb24ndCByZWNvdmVyLCBqdXN0IGNyYXNoICovCisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgZnVuY3Rpb24gX3BhcnNlKHhpbnB1dCkgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSh4aW5wdXQpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgVExleGVyKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Ub2tlblJld3JpdGVTdHJlYW0obGV4ZXIpOworICAgICAgICB0c3RyZWFtLkxUKDEpOyAvLyBmaWxsIGJ1ZmZlcgorICAgICAgICByZXR1cm4gdHN0cmVhbTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0SW5zZXJ0QmVmb3JlSW5kZXgwKCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmMiKTsKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCIwIik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gIjBhYmMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RJbnNlcnRBZnRlckxhc3RJbmRleCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjIik7CisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcigyLCJ4Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gImFiY3giOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3QySW5zZXJ0QmVmb3JlQWZ0ZXJNaWRkbGVJbmRleCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjIik7CisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMSwieCIpOworICAgICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoMSwgIngiKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCksCisgICAgICAgICAgICBleHBlY3RpbmcgPSAiYXhieGMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlSW5kZXgwKCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmMiKTsKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCwieCIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJ4YmMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlTGFzdEluZGV4KCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmMiKTsKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwieCIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJhYngiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlTWlkZGxlSW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCJ4Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gImF4YyI7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdDJSZXBsYWNlTWlkZGxlSW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCJ4Iik7CisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsInkiKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCksCisgICAgICAgICAgICBleHBlY3RpbmcgPSAiYXljIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmVwbGFjZVRoZW5EZWxldGVNaWRkbGVJbmRleCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjIik7CisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsIngiKTsKKyAgICAgICAgdG9rZW5zLnJlbW92ZSgxKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCksCisgICAgICAgICAgICBleHBlY3RpbmcgPSAiYWMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlVGhlbkluc2VydFNhbWVJbmRleCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjIik7CisgICAgICAgIHRva2Vucy5yZXBsYWNlKDAsIngiKTsKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCIwIik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gIjB4YmMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlVGhlbjJJbnNlcnRTYW1lSW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgwLCJ4Iik7CisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwieSIpOworICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsInoiKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCksCisgICAgICAgICAgICBleHBlY3RpbmcgPSAienl4YmMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RJbnNlcnRUaGVuUmVwbGFjZVNhbWVJbmRleCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjIik7CisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwiMCIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgwLCJ4Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gIjB4YmMiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3QySW5zZXJ0TWlkZGxlSW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsIngiKTsKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgxLCJ5Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gImF5eGJjIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0Mkluc2VydFRoZW5SZXBsYWNlSW5kZXgwKCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmMiKTsKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCJ4Iik7CisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwieSIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgwLCJ6Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gInl4emJjIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmVwbGFjZVRoZW5JbnNlcnRCZWZvcmVMYXN0SW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCJ4Iik7CisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMiwieSIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJhYnl4IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0SW5zZXJ0VGhlblJlcGxhY2VMYXN0SW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDIsInkiKTsKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwieCIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJhYnl4IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmVwbGFjZVRoZW5JbnNlcnRMYXN0SW5kZXgoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiYyIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCJ4Iik7CisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcigyLCJ5Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gImFieHkiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlUmFuZ2VUaGVuSW5zZXJ0SW5NaWRkbGUoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiY2NjYmEiKTsKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiw0LCJ4Iik7CisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMywieSIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJhYnhiYSI7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFJlcGxhY2VSYW5nZVRoZW5JbnNlcnRBdExlZnRFZGdlKCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmNjY2JhIik7CisgICAgICAgIHRva2Vucy5yZXBsYWNlKDIsNCwieCIpOworICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDIsInkiKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCksCisgICAgICAgICAgICBleHBlY3RpbmcgPSAiYWJ5eGJhIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmVwbGFjZVJhbmdlVGhlbkluc2VydEF0UmlnaHRFZGdlKCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmNjY2JhIik7CisgICAgICAgIHRva2Vucy5yZXBsYWNlKDIsNCwieCIpOworICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDQsInkiKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCksCisgICAgICAgICAgICBleHBlY3RpbmcgPSAiYWJ4YmEiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlUmFuZ2VUaGVuSW5zZXJ0QWZ0ZXJSaWdodEVkZ2UoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiY2NjYmEiKTsKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiw0LCJ4Iik7CisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcig0LCJ5Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gImFieHliYSI7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFJlcGxhY2VBbGwoKSB7CisgICAgICAgIHZhciB0b2tlbnMgPSBfcGFyc2UoImFiY2NjYmEiKTsKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCw2LCJ4Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gIngiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlU3Vic2V0VGhlbkZldGNoKCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmNjY2JhIik7CisgICAgICAgIHRva2Vucy5yZXBsYWNlKDIsNCwieHl6Iik7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygwLDYpLAorICAgICAgICAgICAgZXhwZWN0aW5nID0gImFieHl6YmEiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlVGhlblJlcGxhY2VTdXBlcnNldCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjY2NiYSIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgyLDQsInh5eiIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgyLDUsImZvbyIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJhYmZvb2EiOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXBsYWNlVGhlblJlcGxhY2VMb3dlckluZGV4ZWRTdXBlcnNldCgpIHsKKyAgICAgICAgdmFyIHRva2VucyA9IF9wYXJzZSgiYWJjY2NiYSIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgyLDQsInh5eiIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgxLDMsImZvbyIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJhZm9vY2JhIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmVwbGFjZVNpbmdsZU1pZGRsZVRoZW5PdmVybGFwcGluZ1N1cGVyc2V0KCkgeworICAgICAgICB2YXIgdG9rZW5zID0gX3BhcnNlKCJhYmNiYSIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgyLDIsInh5eiIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgwLDMsImZvbyIpOworCisgICAgICAgIHZhciByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJmb29hIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA0OHJld3JpdGU8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTJmZTJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyLmh0bWwKQEAgLTAsMCArMSwxODIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLz4KKzx0aXRsZT50MDQ5dHJlZXBhcnNlcjwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmFMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJhV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyYkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyYlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmJXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJjTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJjUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyY1dhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmRMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJkV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyZUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyZVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmVXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJmTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJmUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyZldhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmdMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJnV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyaExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyaFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDQ5dHJlZXBhcnNlcmhXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJpTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA0OXRyZWVwYXJzZXJpUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNDl0cmVlcGFyc2VyaVdhbGtlci5qcyI+PC9zY3JpcHQ+CisKKworCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gZXhlY1RyZWVQYXJzZXIobGV4ZXJDbHMsIHBhcnNlckNscywgZ3JhbW1hckVudHJ5LCB3YWxrZXJDbHMsIHRyZWVFbnRyeSwgeGlucHV0KQorICAgIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IGxleGVyQ2xzKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VyQ2xzKHRzdHJlYW0pOworICAgICAgICB2YXIgciA9IHBhcnNlcltncmFtbWFyRW50cnldKCk7CisKKyAgICAgICAgdmFyIG5vZGVzID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci5nZXRUcmVlKCkpOworICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0c3RyZWFtKTsKKyAgICAgICAgdmFyIHdhbGtlciA9IG5ldyAod2Fsa2VyQ2xhc3Mod2Fsa2VyQ2xzKSkobm9kZXMpOworICAgICAgICB3YWxrZXJbdHJlZUVudHJ5XSgpOworCisgICAgICAgIHJldHVybiB3YWxrZXIuX291dHB1dDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB3YWxrZXJDbGFzcyhiYXNlKSB7CisgICAgICAgIHZhciBUV2Fsa2VyID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBUV2Fsa2VyLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHRoaXMuX291dHB1dCA9ICIiOworICAgICAgICAgICAgdGhpcy50cmFjZXMgPSBbXTsKKyAgICAgICAgfTsKKworICAgICAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFdhbGtlciwgYmFzZSwgeworICAgICAgICAgICAgY2FwdHVyZTogZnVuY3Rpb24odCkgeworICAgICAgICAgICAgICAgIHRoaXMuX291dHB1dCArPSB0OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRyYWNlSW46IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRyYWNlcy5wdXNoKCI+IitydWxlTmFtZSk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgdHJhY2VPdXQ6IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRyYWNlcy5wdXNoKCI8IitydWxlTmFtZSk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgcmVjb3ZlcjogZnVuY3Rpb24oaW5wdXQsIHJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBUV2Fsa2VyOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RGbGF0TGlzdCgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA0OXRyZWVwYXJzZXJhTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJhUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDQ5dHJlZXBhcnNlcmFXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiYWJjLCAzNCIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RTaW1wbGVUcmVlKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDQ5dHJlZXBhcnNlcmJMZXhlciwKKyAgICAgICAgICAgICAgICB0MDQ5dHJlZXBhcnNlcmJQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyYldhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICJhYmMsIDM0Iik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdEZsYXRWc1RyZWVEZWNpc2lvbigpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA0OXRyZWVwYXJzZXJjTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJjUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDQ5dHJlZXBhcnNlcmNXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhIDEgYiAyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIl4oYSAxKWIgMlxuIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdEZsYXRWc1RyZWVEZWNpc2lvbjIoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNDl0cmVlcGFyc2VyZExleGVyLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyZFBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJkV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAxIDIgMyBiIDQgNSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICJeKGEgMyliIDVcbiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RDeWNsaWNERkFMb29rYWhlYWQoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNDl0cmVlcGFyc2VyZUxleGVyLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyZVBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJlV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAxIDIgMy4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiYWx0IDEiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TnVsbGFibGVDaGlsZExpc3QoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNDl0cmVlcGFyc2VyZkxleGVyLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyZlBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJmV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgImFiYyIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3ROdWxsYWJsZUNoaWxkTGlzdDIoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNDl0cmVlcGFyc2VyZ0xleGVyLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyZ1BhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJnV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIDM7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgImFiYyIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3ROdWxsYWJsZUNoaWxkTGlzdDMoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNDl0cmVlcGFyc2VyaExleGVyLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyaFBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA0OXRyZWVwYXJzZXJoV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIDMgZGVmOyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICJhYmMsIGRlZiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RBY3Rpb25zQWZ0ZXJSb290KCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDQ5dHJlZXBhcnNlcmlMZXhlciwKKyAgICAgICAgICAgICAgICB0MDQ5dHJlZXBhcnNlcmlQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNDl0cmVlcGFyc2VyaVdhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYzsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiYWJjLCAyIik7CisgICAgfQorCisKKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA0OXRyZWVwYXJzZXI8L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZiNzU0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJhLmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNDl0cmVlcGFyc2VyYTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQ7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmFXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmFXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTQ4N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYVdhbGtlci5nCkBAIC0wLDAgKzEsOSBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA0OXRyZWVwYXJzZXJhV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KK2EgOiBJRCBJTlQKKyAgICB7dGhpcy5jYXB0dXJlKCRJRCsiLCAiKyRJTlQpO30KKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0YWYwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJiLmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNDl0cmVlcGFyc2VyYjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYldhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYldhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjNzY3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJiV2Fsa2VyLmcKQEAgLTAsMCArMSw5IEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDQ5dHJlZXBhcnNlcmJXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorYSA6IF4oSUQgSU5UKQorICAgIHt0aGlzLmNhcHR1cmUoJElEKyIsICIrJElOVCl9CisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZmVlNzRiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyYy5nCkBAIC0wLDAgKzEsMTEgQEAKK2dyYW1tYXIgdDA0OXRyZWVwYXJzZXJjOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IGIgYyA7CitiIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKK2MgOiBJRCBJTlQ7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJjV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJjV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGMxYTcxOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmNXYWxrZXIuZwpAQCAtMCwwICsxLDkgQEAKK3RyZWUgZ3JhbW1hciB0MDQ5dHJlZXBhcnNlcmNXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorYSA6IGIgYiA7CitiIDogSUQgSU5UICAgIHt0aGlzLmNhcHR1cmUoJElEKyIgIiskSU5UKyJcbiIpO30KKyAgfCBeKElEIElOVCkge3RoaXMuY2FwdHVyZSgiXigiKyRJRCsiICIrJElOVCsiKSIpO30KKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5NzgzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJkLmcKQEAgLTAsMCArMSwxMSBAQAorZ3JhbW1hciB0MDQ5dHJlZXBhcnNlcmQ7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogYiBjIDsKK2IgOiBJRCBJTlQrIC0+IF4oSUQgSU5UKyk7CitjIDogSUQgSU5UKzsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZFdhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZFdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhNjQ5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJkV2Fsa2VyLmcKQEAgLTAsMCArMSw5IEBACit0cmVlIGdyYW1tYXIgdDA0OXRyZWVwYXJzZXJkV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KK2EgOiBiIGIgOworYiA6IElEIElOVCsgICAge3RoaXMuY2FwdHVyZSgkSUQrIiAiKyRJTlQrIlxuIik7fQorICB8IF4oeD1JRCAoeT1JTlQpKykge3RoaXMuY2FwdHVyZSgiXigiKyR4KycgJyskeSsiKSIpO30KKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlYzA3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJlLmcKQEAgLTAsMCArMSwxMSBAQAorZ3JhbW1hciB0MDQ5dHJlZXBhcnNlcmU7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgSU5UKyBQRVJJT0Q7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitTRU1JIDogJzsnIDsKK1BFUklPRCA6ICcuJyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmVXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmVXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZTIxNGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZVdhbGtlci5nCkBAIC0wLDAgKzEsOSBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA0OXRyZWVwYXJzZXJlV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KK2EgOiBJRCBJTlQrIFBFUklPRCB7dGhpcy5jYXB0dXJlKCJhbHQgMSIpO30KKyAgfCBJRCBJTlQrIFNFTUkgICB7dGhpcy5jYXB0dXJlKCJhbHQgMiIpO30KKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhYWRkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJmLmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNDl0cmVlcGFyc2VyZjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQ/IC0+IF4oSUQgSU5UPyk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJmV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJmV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDA3YWViZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmZXYWxrZXIuZwpAQCAtMCwwICsxLDkgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNDl0cmVlcGFyc2VyZldhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7Cit9CithIDogXihJRCBJTlQ/KQorICAgIHt0aGlzLmNhcHR1cmUoJElEKTt9CisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMWY0MTJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZy5nCkBAIC0wLDAgKzEsMTAgQEAKK2dyYW1tYXIgdDA0OXRyZWVwYXJzZXJnOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVD8gU0VNSSAtPiBeKElEIElOVD8pIFNFTUkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworU0VNSSA6ICc7JyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmdXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmdXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZmM0ZGFlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyZ1dhbGtlci5nCkBAIC0wLDAgKzEsOSBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA0OXRyZWVwYXJzZXJnV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KK2EgOiBeKElEIElOVD8pIFNFTUkKKyAgICB7dGhpcy5jYXB0dXJlKCRJRCk7fQorICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJoLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJoLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM3NTNkMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmguZwpAQCAtMCwwICsxLDEwIEBACitncmFtbWFyIHQwNDl0cmVlcGFyc2VyaDsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiB4PUlEIElOVD8gKHk9SUQpPyBTRU1JIC0+IF4oJHggSU5UPyAkeT8pIFNFTUkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworU0VNSSA6ICc7JyA7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJoV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJoV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYxMzJhZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDQ5dHJlZXBhcnNlcmhXYWxrZXIuZwpAQCAtMCwwICsxLDEwIEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDQ5dHJlZXBhcnNlcmhXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQorYSA6IF4oSUQgSU5UPyBiKSBTRU1JCisgICAge3RoaXMuY2FwdHVyZSgkSUQrIiwgIiskYi50ZXh0KTt9CisgIDsKK2IgOiBJRD8gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyaS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyaS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVlMzM2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJpLmcKQEAgLTAsMCArMSwxMCBAQAorZ3JhbW1hciB0MDQ5dHJlZXBhcnNlcmk7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogeD1JRCBJTlQ/IFNFTUkgLT4gXigkeCBJTlQ/KSA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitTRU1JIDogJzsnIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyaVdhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNDl0cmVlcGFyc2VyaVdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExNTVlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA0OXRyZWVwYXJzZXJpV2Fsa2VyLmcKQEAgLTAsMCArMSw4IEBACit0cmVlIGdyYW1tYXIgdDA0OXRyZWVwYXJzZXJpV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KK2EgQGluaXQge3ZhciB4PTA7fSA6IF4oSUQge3g9MTt9IHt4PTI7fSBJTlQ/KQorICAgIHt0aGlzLmNhcHR1cmUoJElEKyIsICIreCk7fQorICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNULmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNULmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjNkMTA0NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1QuaHRtbApAQCAtMCwwICsxLDQ1NCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwNTF0cmVlUmV3cml0ZUFTVDwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RhTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUYVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RhV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGJMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RiUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGJXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUY0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUY1dhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RkTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUZFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RkV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGVMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RlUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGVXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUZkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUZldhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RnTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUZ1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RnV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGhMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RoUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGhXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUaUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGlQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUaVdhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RqTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUalBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RqV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGtMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RrUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGtXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUbExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGxQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUbFdhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RtTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUbVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RtV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVG5MZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RuUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVG5XYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUb0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVG9QYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUb1dhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUcFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RwV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHFMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RxUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHFXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUckxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHJQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUcldhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUc1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RzV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHRMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R0UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHRXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUdUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHVQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUdVdhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUdlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R2V2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHdMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R3UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHdXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUeExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHhQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUeFdhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUeVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R5V2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHpMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1R6UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVHpXYWxrZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUYWFMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RhYVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RhYVdhbGtlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUxdHJlZVJld3JpdGVBU1RhYkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGFiUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGFiV2Fsa2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTF0cmVlUmV3cml0ZUFTVGFjTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUYWNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MXRyZWVSZXdyaXRlQVNUYWNXYWxrZXIuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgZnVuY3Rpb24gZXhlY1RyZWVQYXJzZXIobGV4ZXJDbHMsIHBhcnNlckNscywgZ3JhbW1hckVudHJ5LCB3YWxrZXJDbHMsIHRyZWVFbnRyeSwgeGlucHV0KQorICAgIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IGxleGVyQ2xzKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VyQ2xzKHRzdHJlYW0pOworICAgICAgICB2YXIgciA9IHBhcnNlcltncmFtbWFyRW50cnldKCk7CisKKyAgICAgICAgdmFyIG5vZGVzID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci5nZXRUcmVlKCkpOworICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0c3RyZWFtKTsKKyAgICAgICAgdmFyIHdhbGtlciA9IG5ldyAod2Fsa2VyQ2xhc3Mod2Fsa2VyQ2xzKSkobm9kZXMpOworICAgICAgICB2YXIgdyA9IHdhbGtlclt0cmVlRW50cnldKCk7CisKKyAgICAgICAgaWYgKHcudHJlZSkgeworICAgICAgICAgICAgcmV0dXJuIHcudHJlZS50b1N0cmluZ1RyZWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgZnVuY3Rpb24gd2Fsa2VyQ2xhc3MoYmFzZSkgeworICAgICAgICB2YXIgVFdhbGtlciA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgVFdhbGtlci5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICB0aGlzLnRyYWNlcyA9IFtdOworICAgICAgICAgICAgdGhpcy5idWYgPSAiIjsKKyAgICAgICAgfTsKKworICAgICAgICBvcmcuYW50bHIubGFuZy5leHRlbmQoVFdhbGtlciwgYmFzZSwgeworICAgICAgICAgICAgdHJhY2VJbjogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICAgICAgICAgIHRoaXMudHJhY2VzLnB1c2goIj4iK3J1bGVOYW1lKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB0cmFjZU91dDogZnVuY3Rpb24ocnVsZU5hbWUsIHJ1bGVJbmRleCkgeworICAgICAgICAgICAgICAgIHRoaXMudHJhY2VzLnB1c2goIjwiK3J1bGVOYW1lKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24oaW5wdXQsIHJlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBUV2Fsa2VyOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RGbGF0TGlzdCgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUYUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGFQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGFXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiMzQgYWJjIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFNpbXBsZVRyZWUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVGJMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RiUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RiV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIigzNCBhYmMpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdENvbWJpbmVkUmV3cml0ZUFuZEF1dG8oKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVGNMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RjUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RjV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIigzNCBhYmMpIik7CisKKyAgICAgICAgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RjTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUY1BhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUY1dhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgIjM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIjM0Iik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdEF2b2lkRHVwKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RkTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUZFBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUZFdhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICIoYWJjIGFiYykiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TG9vcCgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUZUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGVQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGVXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhIGIgYyAzIDQgNSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICIzIDQgNSBhIGIgYyIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RBdXRvRHVwKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RmTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUZlBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUZldhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICJhYmMiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0QXV0b0R1cFJ1bGUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVGdMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RnUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RnV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAxIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgImEgMSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RBdXRvRHVwTXVsdGlwbGUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVGhMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RoUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RoV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSBiIDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiYSBiIDMiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0QXV0b0R1cFRyZWUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVGlMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RpUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RpV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIihhIDMpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdEF1dG9EdXBUcmVlV2l0aExhYmVscygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUakxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGpQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGpXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhIDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiKGEgMykiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0QXV0b0R1cFRyZWVXaXRoTGlzdExhYmVscygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUa0xleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGtQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGtXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhIDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiKGEgMykiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0QXV0b0R1cFRyZWVXaXRoUnVsZVJvb3QoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVGxMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RsUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RsV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIihhIDMpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGFiZWxzKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RtTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUbVBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUbVdhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImEgMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICIoYSAzKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExpc3RMYWJlbHMoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVG5MZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RuUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RuV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIihhIDMpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdEF1dG9EdXBOZXN0ZWRUcmVlKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RvTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUb1BhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUb1dhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImEgYiAzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIihhIChiIDMpKSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3REZWxldGUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVHBMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RwUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RwV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIiIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RTZXRNYXRjaE5vUmV3cml0ZSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUcUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHFQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHFXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiYWJjIDM0Iik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFNldE1hdGNoTm9SZXdyaXRlTGV2ZWwyKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RyTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUclBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUcldhbGtlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICIoYWJjIDM0KSIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RTZXRNYXRjaE5vUmV3cml0ZUxldmVsMlJvb3QoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVHNMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RzUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RzV2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIihhYmMgMzQpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFJld3JpdGVNb2RlQ29tYmluZWRSZXdyaXRlQW5kQXV0bygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUdExleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHRQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHRXYWxrZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiKGljayAzNCkiKTsKKworICAgICAgICBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKHQwNTF0cmVlUmV3cml0ZUFTVHRMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1R0UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1R0V2Fsa2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiMzQiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmV3cml0ZU1vZGVGbGF0VHJlZSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUdUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHVQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHVXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiYWJjIDEiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVGbGF0VHJlZSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUdkxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHZQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHZXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiMzQgYWJjIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUd0xleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHdQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHdXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiMzQiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMigpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUeExleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHhQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHhXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiMzQiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUeUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHlQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVHlXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJib28gYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgImJvbyAzNCIpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWU0KCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1R6TGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUelBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUeldhbGtlciwKKyAgICAgICAgICAgICAgICAicyIsCisgICAgICAgICAgICAgICAgImJvbyBhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiKGJvbyAzNCkiKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUYWFMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RhYVBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUYWFXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJib28gYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3VuZCwgIihib28gMzQpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFJld3JpdGVNb2RlV2l0aFByZWRpY2F0ZWRSZXdyaXRlcygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIodDA1MXRyZWVSZXdyaXRlQVNUYWJMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RhYlBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgdDA1MXRyZWVSZXdyaXRlQVNUYWJXYWxrZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvdW5kLCAiKHJvb3QgKGljayAzNCkpIik7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFdpbGRjYXJkKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjVHJlZVBhcnNlcih0MDUxdHJlZVJld3JpdGVBU1RhY0xleGVyLAorICAgICAgICAgICAgICAgIHQwNTF0cmVlUmV3cml0ZUFTVGFjUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUxdHJlZVJld3JpdGVBU1RhY1dhbGtlciwKKyAgICAgICAgICAgICAgICAicyIsCisgICAgICAgICAgICAgICAgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm91bmQsICIzNCIpOworICAgIH0KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA1MXRyZWVSZXdyaXRlQVNUPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3MGM3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYS5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RhOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzk4NjU1YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhV2Fsa2VyLmcKQEAgLTAsMCArMSwxMCBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUYVdhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVGE7Cit9CisKK2EgOiBJRCBJTlQgLT4gSU5UIElEOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFhLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYWEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmU1YjVkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFhLmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGFhOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6ICdib28nIElEIElOVCAtPiBeKCdib28nIF4oSUQgSU5UKSkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYWFXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhYVdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwNDVlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYWFXYWxrZXIuZwpAQCAtMCwwICsxLDE0IEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RhYVdhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVGFhOworICAgIHJld3JpdGU9dHJ1ZTsKK30KK3Rva2VucyB7IFg7IH0KK3MgOiBeKGEgYikgOyAvLyBzLnRyZWUgaXMgYS50cmVlCithIDogJ2JvbycgOworYiA6IF4oSUQgSU5UKSAtPiBJTlQKKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFiLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYWIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTFkMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFiLmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGFiOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEWyJyb290Il0gXihJRCBJTlQpKSB8IElOVCAtPiBeKElEWyJyb290Il0gSU5UKSA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhYldhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFiV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmFiOTUzNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhYldhbGtlci5nCkBAIC0wLDAgKzEsMTMgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGFiV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUYWI7CisgICAgcmV3cml0ZT10cnVlOworfQorcyA6IF4oSUQgYSkgeyB0aGlzLmJ1ZiArPSAkcy5zdGFydC50b1N0cmluZ1RyZWUoKSB9OworYSA6IF4oSUQgSU5UKSAtPiB7dHJ1ZX0/IF4oSURbImljayJdIElOVCkKKyAgICAgICAgICAgICAgLT4gSU5UCisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhYy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFjLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ0ZjBiNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhYy5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RhYzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQgLT4gXihJRFsicm9vdCJdIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhY1dhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGFjV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDFjN2EwYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RhY1dhbGtlci5nCkBAIC0wLDAgKzEsMTAgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGFjV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUYWM7Cit9CitzIDogXihJRCBjPS4pIC0+ICRjCisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RiLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0OGY2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYi5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RiOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYldhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGJXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDkyNWNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGJXYWxrZXIuZwpAQCAtMCwwICsxLDkgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGJXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RiOworfQorYSA6IF4oSUQgSU5UKSAtPiBeKElOVCBJRCk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUYy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDllNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGMuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUYzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQgLT4gXihJRCBJTlQpIHwgSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RjV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUY1dhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3NmU2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUY1dhbGtlci5nCkBAIC0wLDAgKzEsOCBAQAordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGNXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDQ5dHJlZXBhcnNlcmM7Cit9CithIDogXihJRCBJTlQpIC0+IF4oSU5UIElEKSB8IElOVDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RkLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiOWNlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZC5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RkOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RkV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZFdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmNTRkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZFdhbGtlci5nCkBAIC0wLDAgKzEsMTAgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGRXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RkOworfQorCithIDogSUQgLT4gXihJRCBJRCk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZGJmYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGUuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUZTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCsgSU5UKyAtPiAoXihJRCBJTlQpKSsgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGVXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RlV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWFlZDUyYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RlV2Fsa2VyLmcKQEAgLTAsMCArMSw5IEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RlV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUZTsKK30KK2EgOiAoXihJRCBJTlQpKSsgLT4gSU5UKyBJRCs7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjRmNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGYuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUZjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZldhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGZXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzEwZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGZXYWxrZXIuZwpAQCAtMCwwICsxLDkgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGZXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RmOworfQorYTogSUQ7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUZy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTlmNWYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGcuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUZzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGdXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RnV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEzZDNlNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RnV2Fsa2VyLmcKQEAgLTAsMCArMSwxMSBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUZ1dhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVGc7Cit9CithIDogYiBjIDsKK2IgOiBJRCA7CitjIDogSU5UIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RoLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUaC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5MzVjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUaC5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RoOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElEIElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUaFdhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGhXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYmIxNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGhXYWxrZXIuZwpAQCAtMCwwICsxLDkgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGhXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RoOworfQorYSA6IElEIElEIElOVCA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUaS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWRkOGYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGkuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUaTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGlXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RpV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWVkMDc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RpV2Fsa2VyLmcKQEAgLTAsMCArMSwxMCBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUaVdhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVGk7Cit9CithIDogXihJRCBJTlQpCisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RqLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUai5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg1ODI3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUai5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RqOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUaldhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGpXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44M2M3NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGpXYWxrZXIuZwpAQCAtMCwwICsxLDEwIEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RqV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUajsKK30KK2EgOiBeKHg9SUQgeT1JTlQpCisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RrLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUay5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5NGIwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUay5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RrOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RrV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUa1dhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4NjQ3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUa1dhbGtlci5nCkBAIC0wLDAgKzEsMTAgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGtXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RrOworfQorYSA6IF4oeD1JRCB5PUlOVCkKKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGwuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RsLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODEzNWU0MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RsLmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVGw7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVGxXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RsV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWQ4OTkxMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RsV2Fsa2VyLmcKQEAgLTAsMCArMSwxMCBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUbFdhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVGw7Cit9CithIDogXihiIElOVCkgOworYiA6IElEIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RtLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2NWZhODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbS5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RtOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RtV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbVdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhOTU3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbVdhbGtlci5nCkBAIC0wLDAgKzEsMTAgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVG1XYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RtOworfQorYSA6IF4oeD1iIElOVCkgOworYiA6IElEIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RuLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjMzY0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbi5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RuOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RuV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbldhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNzE4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUbldhbGtlci5nCkBAIC0wLDAgKzEsMTEgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVG5XYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RuOworfQorYSA6IF4oeCs9YiB5Kz1jKSA7CitiIDogSUQgOworYyA6IElOVCA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUby5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVG8uZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDBhNThmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVG8uZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUbzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiB4PUlEIHk9SUQgSU5UIC0+IF4oJHggXigkeSBJTlQpKTsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RvV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUb1dhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3MjMzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUb1dhbGtlci5nCkBAIC0wLDAgKzEsMTAgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVG9XYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RvOworfQorYSA6IF4oSUQgXihJRCBJTlQpKQorICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUcC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYmZhYTZkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHAuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUcDsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RwV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUcFdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiZWFiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUcFdhbGtlci5nCkBAIC0wLDAgKzEsMTAgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHBXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1RwOworfQorYSA6IElEIC0+IAorICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUcS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTg4ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHEuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUcTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUcVdhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHFXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjQyOWFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHFXYWxrZXIuZwpAQCAtMCwwICsxLDEwIEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RxV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUcTsKK30KK2EgOiBiIElOVDsKK2IgOiBJRCB8IElOVDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0MjVmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUci5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IHg9SUQgSU5UIC0+IF4oJHggSU5UKTsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHJXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RyV2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmVhOWU1MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RyV2Fsa2VyLmcKQEAgLTAsMCArMSw5IEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1RyV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUcjsKK30KK2EgOiBeKElEIChJRCB8IElOVCkgKSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUcy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iODNkMTdkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHMuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUczsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiB4PUlEIElOVCAtPiBeKCR4IElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1RzV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUc1dhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1Yjg2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUc1dhbGtlci5nCkBAIC0wLDAgKzEsOSBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUc1dhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVHM7Cit9CithIDogXigoSUQgfCBJTlQpIElOVCkgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHQuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R0LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWNjNDY2MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R0LmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHQ7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgSU5UIC0+IF4oSUQgSU5UKSB8IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdFdhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHRXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZmE5NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHRXYWxrZXIuZwpAQCAtMCwwICsxLDEyIEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1R0V2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUdDsKKyAgICByZXdyaXRlPXRydWU7Cit9CithIDogXihJRCBJTlQpIC0+IF4oSURbImljayJdIElOVCkKKyAgfCBJTlQgLy8gbGVhdmVzIGl0IGFsb25lLCByZXR1cm5pbmcgJGEuc3RhcnQKKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2I0OTE1NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R1LmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHU7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgSU5UIC0+IElEIElOVCB8IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R1V2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdVdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwYzljOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdVdhbGtlci5nCkBAIC0wLDAgKzEsMTIgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHVXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1R1OworICAgIHJld3JpdGU9dHJ1ZTsKK30KK3MgOiBJRCBhIDsKK2EgOiBJTlQgLT4gSU5UWyIxIl0KKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R2LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTIzYWMyNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R2LmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHY7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgSU5UIC0+IElEIElOVCB8IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R2V2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdldhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4NDNiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdldhbGtlci5nCkBAIC0wLDAgKzEsMTMgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHZXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1R2OworICAgIHJld3JpdGU9dHJ1ZTsKK30KK3MgOiBhIDsKK2EgOiBiIDsKK2IgOiBJRCBJTlQgLT4gSU5UIElECisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R3LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMTljMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUdy5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1R3Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUd1dhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHdXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGRjNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHdXYWxrZXIuZwpAQCAtMCwwICsxLDEzIEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1R3V2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUdzsKKyAgICByZXdyaXRlPXRydWU7Cit9CitzIDogYSA7CithIDogYiA7IC8vIGEudHJlZSBtdXN0IGJlY29tZSBiLnRyZWUKK2IgOiBeKElEIElOVCkgLT4gSU5UCisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R4LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUeC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmNjNkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUeC5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1R4Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVCAtPiBeKElEIElOVCkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUeFdhbGtlci5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHhXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOWJkNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHhXYWxrZXIuZwpAQCAtMCwwICsxLDE0IEBACisvLyBAQEFOVExSIFRvb2wgT3B0aW9uc0BAOiAtdHJhY2UKK3RyZWUgZ3JhbW1hciB0MDUxdHJlZVJld3JpdGVBU1R4V2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgIHRva2VuVm9jYWI9dDA1MXRyZWVSZXdyaXRlQVNUeDsKKyAgICByZXdyaXRlPXRydWU7Cit9Cit0b2tlbnMgeyBYOyB9CitzIDogYSogYiA7IC8vIG9ubHkgYiBjb250cmlidXRlcyB0byB0cmVlLCBidXQgaXQncyBhZnRlciBhKjsgcy50cmVlID0gYi50cmVlCithIDogWCA7CitiIDogXihJRCBJTlQpIC0+IElOVAorICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUeS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTllY2VkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHkuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUeTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiAnYm9vJyBJRCBJTlQgLT4gJ2JvbycgXihJRCBJTlQpIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHlXYWxrZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R5V2Fsa2VyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZThhMTUzZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R5V2Fsa2VyLmcKQEAgLTAsMCArMSwxNCBAQAorLy8gQEBBTlRMUiBUb29sIE9wdGlvbnNAQDogLXRyYWNlCit0cmVlIGdyYW1tYXIgdDA1MXRyZWVSZXdyaXRlQVNUeVdhbGtlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICB0b2tlblZvY2FiPXQwNTF0cmVlUmV3cml0ZUFTVHk7CisgICAgcmV3cml0ZT10cnVlOworfQordG9rZW5zIHsgWDsgfQorcyA6ICdib28nIGEqIGIgOyAvLyBkb24ndCByZXNldCBzLnRyZWUgdG8gYi50cmVlIGR1ZSB0byAnYm9vJworYSA6IFggOworYiA6IF4oSUQgSU5UKSAtPiBJTlQKKyAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTF0cmVlUmV3cml0ZUFTVHouZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R6LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTliZmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R6LmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHo7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogJ2JvbycgSUQgSU5UIC0+IF4oJ2JvbycgXihJRCBJTlQpKSA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUxdHJlZVJld3JpdGVBU1R6V2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUeldhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjMGNkODIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MXRyZWVSZXdyaXRlQVNUeldhbGtlci5nCkBAIC0wLDAgKzEsMTQgQEAKKy8vIEBAQU5UTFIgVG9vbCBPcHRpb25zQEA6IC10cmFjZQordHJlZSBncmFtbWFyIHQwNTF0cmVlUmV3cml0ZUFTVHpXYWxrZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgdG9rZW5Wb2NhYj10MDUxdHJlZVJld3JpdGVBU1R6OworICAgIHJld3JpdGU9dHJ1ZTsKK30KK3Rva2VucyB7IFg7IH0KK3MgOiBeKCdib28nIGEqIGIpIDsgLy8gZG9uJ3QgcmVzZXQgcy50cmVlIHRvIGIudHJlZSBkdWUgdG8gJ2JvbycKK2EgOiBYIDsKK2IgOiBeKElEIElOVCkgLT4gSU5UCisgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0Lmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5NDg4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydC5odG1sCkBAIC0wLDAgKzEsMTc1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDA1MmltcG9ydDwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTMS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTFfdDA1MmltcG9ydFMxLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNMUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNMVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTMi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTJfdDA1MmltcG9ydFMyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNMkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNMlBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTMy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTNfdDA1MmltcG9ydFMzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNM0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNM1BhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTNC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0VDQuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MmltcG9ydE00X3QwNTJpbXBvcnRTNC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTRfdDA1MmltcG9ydFQ0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNFBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTNS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0VDUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1MmltcG9ydE01X3QwNTJpbXBvcnRTNS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTVfdDA1MmltcG9ydFQ1LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTNi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTZfdDA1MmltcG9ydFM2LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNlBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTNy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TTdfdDA1MmltcG9ydFM3LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNNy5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRTOC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUyaW1wb3J0TThfdDA1MmltcG9ydFM4LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTJpbXBvcnRNOC5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAvLyBQYXJzZXIgVGVzdHMKKworICAgIGZ1bmN0aW9uIGV4ZWNMZXhlcihsZXhlckNscywgeGlucHV0KSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyAoRW5oYW5jZWRQYXJzZXIobGV4ZXJDbHMpKShjc3RyZWFtKSwKKyAgICAgICAgICAgIHRva2VuOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCB0b2tlbi5nZXRUeXBlKCk9PT1vcmcuYW50bHIucnVudGltZS5Ub2tlbi5FT0YpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxleGVyLmJ1ZiArPSB0b2tlbi5nZXRUZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGV4ZXIuYnVmOyAKKyAgICB9CisKKyAgICBmdW5jdGlvbiBleGVjUGFyc2VyKGxleGVyQ2xzLCBwYXJzZXJDbHMsIGdyYW1tYXJFbnRyeSwgeGlucHV0KSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyAoRW5oYW5jZWRQYXJzZXIobGV4ZXJDbHMpKShjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IChFbmhhbmNlZFBhcnNlcihwYXJzZXJDbHMpKSh0c3RyZWFtKTsKKyAgICAgICAgdmFyIHIgPSBwYXJzZXJbZ3JhbW1hckVudHJ5XSgpOworCisgICAgICAgIHJldHVybiBwYXJzZXIuYnVmOyAKKyAgICB9CisKKyAgICBmdW5jdGlvbiBFbmhhbmNlZFBhcnNlcihiYXNlKSB7CisgICAgICAgIHZhciBUID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBULnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHRoaXMudHJhY2VzID0gW107CisgICAgICAgICAgICB0aGlzLmJ1ZiA9ICIiOworICAgICAgICB9OworCisgICAgICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChULCBiYXNlLCB7CisgICAgICAgICAgICBjYXB0dXJlOiBmdW5jdGlvbih0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5idWYgKz0gdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB0cmFjZUluOiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPiIrcnVsZU5hbWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRyYWNlT3V0OiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPCIrcnVsZU5hbWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihpbnB1dCwgcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIFQ7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdERlbGVnYXRvckludm9rZXNEZWxlZ2F0ZVJ1bGUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1MmltcG9ydE0xTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MmltcG9ydE0xUGFyc2VyLAorICAgICAgICAgICAgICAgICJzIiwKKyAgICAgICAgICAgICAgICAiYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlMuYSIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0RGVsZWdhdG9ySW52b2tlc0RlbGVnYXRlUnVsZVdpdGhBcmdzKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTJpbXBvcnRNMkxleGVyLAorICAgICAgICAgICAgICAgIHQwNTJpbXBvcnRNMlBhcnNlciwKKyAgICAgICAgICAgICAgICAicyIsCisgICAgICAgICAgICAgICAgImIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTLmExMDAwIiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3REZWxlZ2F0b3JBY2Nlc3Nlc0RlbGVnYXRlTWVtYmVycygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDUyaW1wb3J0TTNMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUyaW1wb3J0TTNQYXJzZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3REZWxlZ2F0b3JJbnZva2VzRmlyc3RWZXJzaW9uT2ZEZWxlZ2F0ZVJ1bGUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1MmltcG9ydE00TGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1MmltcG9ydE00UGFyc2VyLAorICAgICAgICAgICAgICAgICJzIiwKKyAgICAgICAgICAgICAgICAiYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlMuYSIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0RGVsZWdhdGVzU2VlU2FtZVRva2VuVHlwZSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDUyaW1wb3J0TTVMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUyaW1wb3J0TTVQYXJzZXIsCisgICAgICAgICAgICAgICAgInMiLAorICAgICAgICAgICAgICAgICJhYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlMueCBULnkiLCBmb3VuZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdERlbGVnYXRvclJ1bGVPdmVycmlkZXNEZWxlZ2F0ZSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDUyaW1wb3J0TTZMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUyaW1wb3J0TTZQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiUy5hIiwgZm91bmQpOworICAgIH0KKworICAgIC8vIExleGVyIFRlc3RzCisKKyAgICBmdW5jdGlvbiB0ZXN0TGV4ZXJEZWxlZ2F0b3JJbnZva2VzRGVsZWdhdGVSdWxlKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjTGV4ZXIodDA1MmltcG9ydE03LCAiYWJjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiUy5BIGFiYyIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0TGV4ZXJEZWxlZ2F0b3JSdWxlT3ZlcnJpZGVzRGVsZWdhdGUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNMZXhlcih0MDUyaW1wb3J0TTgsICJhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiTS5BIGEiLCBmb3VuZCk7CisgICAgfQorPC9zY3JpcHQ+CisKKzwvaGVhZD4KKzxib2R5PgorICAgIDxoMT50MDUyaW1wb3J0PC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTcwNTYxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRNMS5nCkBAIC0wLDAgKzEsOCBAQAorZ3JhbW1hciB0MDUyaW1wb3J0TTE7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworfQoraW1wb3J0IHQwNTJpbXBvcnRTMTsKK3MgOiBhIDsKK0IgOiAnYicgOyAvLyBkZWZpbmVzIEIgZnJvbSBpbmhlcml0ZWQgdG9rZW4gc3BhY2UKK1dTIDogKCcgJ3wnXG4nKSB7dGhpcy5za2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE0yLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE0yLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGEyOGE2MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTIuZwpAQCAtMCwwICsxLDggQEAKK2dyYW1tYXIgdDA1MmltcG9ydE0yOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK2ltcG9ydCB0MDUyaW1wb3J0UzI7CitzIDogbGFiZWw9YVszXSB7dGhpcy5jYXB0dXJlKCRsYWJlbC55KTt9IDsKK0IgOiAnYicgOyAvLyBkZWZpbmVzIEIgZnJvbSBpbmhlcml0ZWQgdG9rZW4gc3BhY2UKK1dTIDogKCcgJ3wnXG4nKSB7dGhpcy5za2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE0zLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE0zLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDUyOTBkMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTMuZwpAQCAtMCwwICsxLDcgQEAKK2dyYW1tYXIgdDA1MmltcG9ydE0zOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK2ltcG9ydCB0MDUyaW1wb3J0UzM7CitzIDogJ2InIHt0aGlzLmd0MDUyaW1wb3J0UzMuZm9vKCk7fSA7IC8vIGdTIGlzIGltcG9ydCBwb2ludGVyCitXUyA6ICgnICd8J1xuJykge3RoaXMuc2tpcCgpO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRNNC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRNNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmYTVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE00LmcKQEAgLTAsMCArMSw4IEBACitncmFtbWFyIHQwNTJpbXBvcnRNNDsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7Cit9CitpbXBvcnQgdDA1MmltcG9ydFM0LCB0MDUyaW1wb3J0VDQ7CitzIDogYSA7CitCIDogJ2InIDsKK1dTIDogKCcgJ3wnXG4nKSB7dGhpcy5za2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE01LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE01LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTRjOTNlNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTUuZwpAQCAtMCwwICsxLDEwIEBACitncmFtbWFyIHQwNTJpbXBvcnRNNTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7Cit9CitpbXBvcnQgdDA1MmltcG9ydFM1LCB0MDUyaW1wb3J0VDU7CitzIDogeCB5IDsgLy8gbWF0Y2hlcyBBQSwgd2hpY2ggc2hvdWxkIGJlICJhYSIKK0IgOiAnYicgOyAvLyBhbm90aGVyIG9yZGVyOiBCLCBBLCBDCitBIDogJ2EnIDsKK0MgOiAnYycgOworV1MgOiAoJyAnfCdcbicpIHt0aGlzLnNraXAoKTt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDM3OTlhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRNNi5nCkBAIC0wLDAgKzEsNyBAQAorZ3JhbW1hciB0MDUyaW1wb3J0TTY7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworfQoraW1wb3J0IHQwNTJpbXBvcnRTNjsKK2IgOiAnYid8J2MnIDsKK1dTIDogKCcgJ3wnXG4nKSB7dGhpcy5za2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE03LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE03LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmZlNjRkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTcuZwpAQCAtMCwwICsxLDcgQEAKK2xleGVyIGdyYW1tYXIgdDA1MmltcG9ydE03Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK2ltcG9ydCB0MDUyaW1wb3J0Uzc7CitCIDogJ2InIDsKK1dTIDogKCcgJ3wnXG4nKSB7dGhpcy5za2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE04LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydE04LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2RmYTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0TTguZwpAQCAtMCwwICsxLDcgQEAKK2xleGVyIGdyYW1tYXIgdDA1MmltcG9ydE04Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK2ltcG9ydCB0MDUyaW1wb3J0Uzg7CitBIDogJ2EnIHt0aGlzLmNhcHR1cmUoIk0uQSAiKTt9IDsKK1dTIDogKCcgJ3wnXG4nKSB7dGhpcy5za2lwKCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFMxLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFMxLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjVkZjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzEuZwpAQCAtMCwwICsxLDExIEBACitwYXJzZXIgZ3JhbW1hciB0MDUyaW1wb3J0UzE7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworfQorQG1lbWJlcnMgeworICAgIHRoaXMuY2FwdHVyZSA9IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgdGhpcy5ndDA1MmltcG9ydE0xLmNhcHR1cmUodCk7CisgICAgfTsKK30KKworYSA6IEIgeyB0aGlzLmNhcHR1cmUoIlMuYSIpIH0gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTMi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTMi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4Zjk4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFMyLmcKQEAgLTAsMCArMSwxMCBAQAorcGFyc2VyIGdyYW1tYXIgdDA1MmltcG9ydFMyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK0BtZW1iZXJzIHsKKyAgICB0aGlzLmNhcHR1cmUgPSBmdW5jdGlvbih0KSB7CisgICAgICAgIHRoaXMuZ3QwNTJpbXBvcnRNMi5jYXB0dXJlKHQpOworICAgIH0KK30KK2FbeF0gcmV0dXJucyBbeV0gOiBCIHt0aGlzLmNhcHR1cmUoIlMuYSIpOyAkeT0iMTAwMCI7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFMzLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFMzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmEwMTBkOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzMuZwpAQCAtMCwwICsxLDE0IEBACitwYXJzZXIgZ3JhbW1hciB0MDUyaW1wb3J0UzM7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworfQorQG1lbWJlcnMgeworICAgIHRoaXMuY2FwdHVyZSA9IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgdGhpcy5ndDA1MmltcG9ydE0zLmNhcHR1cmUodCk7CisgICAgfTsKKyAgICB0aGlzLmZvbyA9IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLmNhcHR1cmUoImZvbyIpOworICAgIH07Cit9CisgICAgICAgIAorYSA6IEIgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTNC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5NWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFM0LmcKQEAgLTAsMCArMSwxMSBAQAorcGFyc2VyIGdyYW1tYXIgdDA1MmltcG9ydFM0Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK0BtZW1iZXJzIHsKKyAgICB0aGlzLmNhcHR1cmUgPSBmdW5jdGlvbih0KSB7CisgICAgICAgIHRoaXMuZ3QwNTJpbXBvcnRNNC5jYXB0dXJlKHQpOworICAgIH07Cit9CithIDogYiB7dGhpcy5jYXB0dXJlKCJTLmEiKTt9IDsKK2IgOiBCIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDA0YmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTNS5nCkBAIC0wLDAgKzEsMTEgQEAKK3BhcnNlciBncmFtbWFyIHQwNTJpbXBvcnRTNTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7Cit9Cit0b2tlbnMgeyBBOyBCOyBDOyB9CitAbWVtYmVycyB7CisgICAgdGhpcy5jYXB0dXJlID0gZnVuY3Rpb24odCkgeworICAgICAgICB0aGlzLmd0MDUyaW1wb3J0TTUuY2FwdHVyZSh0KTsKKyAgICB9OworfQoreCA6IEEge3RoaXMuY2FwdHVyZSgiUy54ICIpO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTNi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTNi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhNTBmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFM2LmcKQEAgLTAsMCArMSwxMSBAQAorcGFyc2VyIGdyYW1tYXIgdDA1MmltcG9ydFM2Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK0BtZW1iZXJzIHsKKyAgICB0aGlzLmNhcHR1cmUgPSBmdW5jdGlvbih0KSB7CisgICAgICAgIHRoaXMuZ3QwNTJpbXBvcnRNNi5jYXB0dXJlKHQpOworICAgIH07Cit9CithIDogYiB7IHRoaXMuY2FwdHVyZSgiUy5hIikgfSA7CitiIDogQiA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFM3LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFM3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ4M2JkYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzcuZwpAQCAtMCwwICsxLDExIEBACitsZXhlciBncmFtbWFyIHQwNTJpbXBvcnRTNzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7Cit9CitAbWVtYmVycyB7CisgICAgdGhpcy5jYXB0dXJlID0gZnVuY3Rpb24odCkgeworICAgICAgICB0aGlzLmd0MDUyaW1wb3J0TTcuY2FwdHVyZSh0KTsKKyAgICB9OworfQorQSA6ICdhJyB7dGhpcy5jYXB0dXJlKCJTLkEgIik7fSA7CitDIDogJ2MnIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUyaW1wb3J0UzguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYzg0OWIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRTOC5nCkBAIC0wLDAgKzEsMTAgQEAKK2xleGVyIGdyYW1tYXIgdDA1MmltcG9ydFM4Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK0BtZW1iZXJzIHsKKyAgICB0aGlzLmNhcHR1cmUgPSBmdW5jdGlvbih0KSB7CisgICAgICAgIHRoaXMuZ3QwNTJpbXBvcnRNOC5jYXB0dXJlKHQpOworICAgIH07Cit9CitBIDogJ2EnIHt0aGlzLmNhcHR1cmUoIlMuQSIpO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRUNC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRUNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkZGNjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFQ0LmcKQEAgLTAsMCArMSwxMCBAQAorcGFyc2VyIGdyYW1tYXIgdDA1MmltcG9ydFQ0Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK0BtZW1iZXJzIHsKKyAgICB0aGlzLmNhcHR1cmUgPSBmdW5jdGlvbih0KSB7CisgICAgICAgIHRoaXMuZ3QwNTJpbXBvcnRNNC5jYXB0dXJlKHQpOworICAgIH07Cit9CithIDogQiB7dGhpcy5jYXB0dXJlKCJULmEiKTt9IDsgLy8gaGlkZGVuIGJ5IFMuYQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRUNS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTJpbXBvcnRUNS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3YjFiNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1MmltcG9ydFQ1LmcKQEAgLTAsMCArMSwxMSBAQAorcGFyc2VyIGdyYW1tYXIgdDA1MmltcG9ydFQ1Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKK30KK3Rva2VucyB7IEM7IEI7IEE7IH0gLy8vIHJldmVyc2Ugb3JkZXIKK0BtZW1iZXJzIHsKKyAgICB0aGlzLmNhcHR1cmUgPSBmdW5jdGlvbih0KSB7CisgICAgICAgIHRoaXMuZ3QwNTJpbXBvcnRNNS5jYXB0dXJlKHQpOworICAgIH07Cit9Cit5IDogQSB7dGhpcy5jYXB0dXJlKCJULnkiKTt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvLmh0bWwgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5MjhlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyby5odG1sCkBAIC0wLDAgKzEsMzM5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDA1M2hldGVybzwvdGl0bGU+CisKKzwhLS0gQU5UTFIgaW5jbHVkZXMgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi8uLi9saWIvYW50bHIzLWFsbC5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMlBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UM0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UM1BhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UNExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UNFBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UNUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UNVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UNkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UNlBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UN0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UN1BhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UOExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UOFBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UOUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UOVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMTBMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDEwUGFyc2VyLmpzIj48L3NjcmlwdD4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1QxMUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMTFQYXJzZXIuanMiPjwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDEyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1QxMlBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMTNMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDEzUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UUDEzUGFyc2VyLmpzIj48L3NjcmlwdD4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1QxNExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMTRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1RQMTRQYXJzZXIuanMiPjwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDE1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1QxNVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVFAxNVBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMTZMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDE2UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UUDE2UGFyc2VyLmpzIj48L3NjcmlwdD4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1QxN0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMTdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1RQMTdQYXJzZXIuanMiPjwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDE4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1QxOFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVFAxOFBhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UMThMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVDE4UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTNoZXRlcm9UUDE4UGFyc2VyLmpzIj48L3NjcmlwdD4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1M2hldGVyb1RMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDUzaGV0ZXJvVFBQYXJzZXIuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgLy8gUGFyc2VyIFRlc3RzCisKKyAgICBmdW5jdGlvbiBleGVjUGFyc2VyKGxleGVyQ2xzLCBwYXJzZXJDbHMsIGdyYW1tYXJFbnRyeSwgeGlucHV0KSB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyAoRW5oYW5jZWRQYXJzZXIobGV4ZXJDbHMpKShjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IChFbmhhbmNlZFBhcnNlcihwYXJzZXJDbHMpKSh0c3RyZWFtKTsKKyAgICAgICAgdmFyIHIgPSBwYXJzZXJbZ3JhbW1hckVudHJ5XSgpOworCisgICAgICAgIGlmIChyKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRUcmVlKCkudG9TdHJpbmdUcmVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIGZ1bmN0aW9uIGV4ZWNUcmVlUGFyc2VyKGxleGVyQ2xzLCBwYXJzZXJDbHMsIGdyYW1tYXJFbnRyeSwgd2Fsa2VyQ2xzLCB0cmVlRW50cnksIHhpbnB1dCkKKyAgICB7CisgICAgICAgIHZhciBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyAoRW5oYW5jZWRQYXJzZXIobGV4ZXJDbHMpKShjc3RyZWFtKSwKKyAgICAgICAgICAgIHRzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpLAorICAgICAgICAgICAgcGFyc2VyID0gbmV3IChFbmhhbmNlZFBhcnNlcihwYXJzZXJDbHMpKSh0c3RyZWFtKTsKKyAgICAgICAgdmFyIHIgPSBwYXJzZXJbZ3JhbW1hckVudHJ5XSgpOworCisgICAgICAgIHZhciBub2RlcyA9IG5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWVOb2RlU3RyZWFtKHIuZ2V0VHJlZSgpKTsKKyAgICAgICAgbm9kZXMuc2V0VG9rZW5TdHJlYW0odHN0cmVhbSk7CisgICAgICAgIHZhciB3YWxrZXIgPSBuZXcgd2Fsa2VyQ2xzKG5vZGVzKTsKKyAgICAgICAgciA9IHdhbGtlclt0cmVlRW50cnldKCk7CisKKyAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldFRyZWUoKS50b1N0cmluZ1RyZWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisKKyAgICBmdW5jdGlvbiBFbmhhbmNlZFBhcnNlcihiYXNlKSB7CisgICAgICAgIHZhciBUID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBULnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHRoaXMudHJhY2VzID0gW107CisgICAgICAgICAgICB0aGlzLmJ1ZiA9ICIiOworICAgICAgICB9OworCisgICAgICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChULCBiYXNlLCB7CisgICAgICAgICAgICBjYXB0dXJlOiBmdW5jdGlvbih0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5idWYgKz0gdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB0cmFjZUluOiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPiIrcnVsZU5hbWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRyYWNlT3V0OiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPCIrcnVsZU5hbWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHJlcG9ydEVycm9yOiBmdW5jdGlvbihpbnB1dCwgcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIFQ7CisgICAgfQorCisgICAgLy8gUEFSU0VSUyAtLSBBVVRPIEFTVAorCisgICAgZnVuY3Rpb24gdGVzdFRva2VuKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMVBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPFY+IiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RUb2tlbldpdGhMYWJlbCgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcigKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDJMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDJQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYTxWPiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0VG9rZW5XaXRoTGlzdExhYmVsKCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UM0xleGVyLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UM1BhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPFY+IiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RUb2tlblJvb3QoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIoCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1Q0TGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1Q0UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE8Vj4iLCBmb3VuZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFRva2VuUm9vdFdpdGhMaXN0TGFiZWwoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIoCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1Q1TGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1Q1UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE8Vj4iLCBmb3VuZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFN0cmluZygpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcigKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDZMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDZQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJiZWdpbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJlZ2luPFY+IiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmdSb290KCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UN0xleGVyLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UN1BhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImJlZ2luIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYmVnaW48Vj4iLCBmb3VuZCk7CisgICAgfQorCisgICAgLy8gUEFSU0VSUyAtLSBSRVdSSVRFIEFTVAorCisgICAgZnVuY3Rpb24gdGVzdFJld3JpdGVUb2tlbigpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcigKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDhMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDhQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYTxWPiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0cmV3cml0ZXRva2Vud2l0aGFyZ3MoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIoCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1Q5TGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1Q5UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjxWPjs0MjE5MzAgYTxWPjs5OTAwIiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXdyaXRlVG9rZW5Sb290KCkgeworICAgICAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTBMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDEwUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYSAyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiKGE8Vj4gMikiLCBmb3VuZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFJld3JpdGVTdHJpbmcoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIoCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1QxMUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTFQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICJiZWdpbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJlZ2luPFY+IiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RSZXdyaXRlU3RyaW5nUm9vdCgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcigKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDEyTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1QxMlBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImJlZ2luIDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoYmVnaW48Vj4gMikiLCBmb3VuZCk7CisgICAgfQorCisgICAgLy8gVFJFRSBQQVJTRVJTIC0tIFJFV1JJVEUgQVNUCisKKyAgICBmdW5jdGlvbiB0ZXN0VHJlZVBhcnNlclJld3JpdGVGbGF0TGlzdCgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1QxM0xleGVyLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTNQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UUDEzUGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMzQ8Vj4gYWJjPFc+IiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RUcmVlUGFyc2VyUmV3cml0ZVRyZWUoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTRMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDE0UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVFAxNFBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIigzNDxWPiBhYmM8Vz4pIiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeSgpIHsKKyAgICAgICAgdmFyIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1QxNUxleGVyLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTVQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UUDE1UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICAiYWJjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiUk9PVDxWPiBhYmMiLCBmb3VuZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5V2l0aEFyZ3MoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTZMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDE2UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVFAxNlBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJPT1Q8Vj47NDIgYWJjIiwgZm91bmQpOworICAgIH0KKworICAgIGZ1bmN0aW9uIHRlc3RUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeVJvb3QoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMTdMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDE3UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVFAxN1BhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIihST09UPFY+IGFiYykiLCBmb3VuZCk7CisgICAgfQorCisgICAgZnVuY3Rpb24gdGVzdFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5RnJvbVJlYWwoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UMThMZXhlciwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVDE4UGFyc2VyLAorICAgICAgICAgICAgICAgICJhIiwKKyAgICAgICAgICAgICAgICB0MDUzaGV0ZXJvVFAxOFBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJPT1Q8Vj5AMSIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiB0ZXN0VHJlZVBhcnNlckF1dG9IZXRlcm9BU1QoKSB7CisgICAgICAgIHZhciBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UTGV4ZXIsCisgICAgICAgICAgICAgICAgdDA1M2hldGVyb1RQYXJzZXIsCisgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgIHQwNTNoZXRlcm9UUFBhcnNlciwKKyAgICAgICAgICAgICAgICAiYSIsCisgICAgICAgICAgICAgICAgImFiYzsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmM8Vj4gOzxWPiIsIGZvdW5kKTsKKyAgICB9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwNTNoZXRlcm88L2gxPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9ULmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MTM1ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9ULmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTNoZXRlcm9UOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEICc7JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZWNlY2MxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMS5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1QxOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogSUQ8Vj4gOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDEwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxMC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxMWI5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxMC5nCkBAIC0wLDAgKzEsMjIgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1QxMDsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK0BoZWFkZXIgeworZnVuY3Rpb24gVigpIHsKKyAgICBWLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWLCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFRleHQoKSArICI8Vj4iOworICAgIH0KK30pOworfQorYSA6IElEIElOVCAtPiBeKElEPFY+IElOVCkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDExLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxMS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhZTRkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxMS5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1QxMTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK0BoZWFkZXIgeworZnVuY3Rpb24gVigpIHsKKyAgICBWLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWLCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFRleHQoKSArICI8Vj4iOworICAgIH0KK30pOworfQorYSA6ICdiZWdpbicgLT4gJ2JlZ2luJzxWPiA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDEyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjBlYmQxYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDEyLmcKQEAgLTAsMCArMSwyMSBAQAorZ3JhbW1hciB0MDUzaGV0ZXJvVDEyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogJ2JlZ2luJyBJTlQgLT4gXignYmVnaW4nPFY+IElOVCkgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxMy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzA5ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTMuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1QxMzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCBJTlQ7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDE0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhM2IzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxNC5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUzaGV0ZXJvVDE0Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIElOVDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDE1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjJhZGRmZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDE1LmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTNoZXRlcm9UMTU7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxNi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjFlNDlkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTYuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1QxNjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK2EgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDE3LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxNy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyMmU1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QxNy5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDUzaGV0ZXJvVDE3Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorYSA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMTguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDE4LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmJhNGJjZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDE4LmcKQEAgLTAsMCArMSw5IEBACitncmFtbWFyIHQwNTNoZXRlcm9UMTg7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7Cit9CithIDogSUQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1QyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQ2YjljOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDIuZwpAQCAtMCwwICsxLDIwIEBACitncmFtbWFyIHQwNTNoZXRlcm9UMjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK0BoZWFkZXIgeworZnVuY3Rpb24gVigpIHsKKyAgICBWLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWLCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFRleHQoKSArICI8Vj4iOworICAgIH0KK30pOworfQorYSA6IHg9SUQ8Vj4gOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjFjOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UMy5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1QzOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogeCs9SUQ8Vj4gOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDQuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjNiOTIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UNC5nCkBAIC0wLDAgKzEsMjEgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1Q0Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogSUQ8Vj5eIDsKK0lEIDogJ2EnLi4neicrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNjcyZjNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UNS5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1Q1Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogeCs9SUQ8Vj5eIDsKK0lEIDogJ2EnLi4neicrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1Q2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1Q2LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmE0Yjk3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDYuZwpAQCAtMCwwICsxLDIwIEBACitncmFtbWFyIHQwNTNoZXRlcm9UNjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKK30KK0BoZWFkZXIgeworZnVuY3Rpb24gVigpIHsKKyAgICBWLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWLCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFRleHQoKSArICI8Vj4iOworICAgIH0KK30pOworfQorYSA6ICdiZWdpbic8Vj4gOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41N2EzNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UNy5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1Q3Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogJ2JlZ2luJzxWPl4gOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZDA2MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UOC5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1Q4Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWKCkgeworICAgIFYuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogSUQgLT4gSUQ8Vj4gOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVDkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOWNlM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UOS5nCkBAIC0wLDAgKzEsNDUgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1Q5Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworfQorQGhlYWRlciB7CitmdW5jdGlvbiBWMigpIHsKKyAgICB2YXIgeCwgeSwgeiwgdG9rZW4sIHR0eXBlOworICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPT09NCkgeworICAgICAgICB0dHlwZSA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgeCA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgeSA9IGFyZ3VtZW50c1syXTsKKyAgICAgICAgeiA9IGFyZ3VtZW50c1szXTsKKyAgICAgICAgdG9rZW4gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW4odHR5cGUsICIiKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PT0zKSB7CisgICAgICAgIHR0eXBlID0gYXJndW1lbnRzWzBdOworICAgICAgICB0b2tlbiA9IGFyZ3VtZW50c1sxXTsKKyAgICAgICAgeCA9IGFyZ3VtZW50c1syXTsKKyAgICAgICAgeSA9IDA7CisgICAgICAgIHogPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBhcmdzIik7CisgICAgfQorCisgICAgVjIuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHRva2VuKTsKKyAgICB0aGlzLnggPSB4OworICAgIHRoaXMueSA9IHk7CisgICAgdGhpcy56ID0gejsKK307CisKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWMiwgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlLCB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgdHh0ID0gIiI7CisgICAgICAgIGlmICh0aGlzLnRva2VuKSB7CisgICAgICAgICAgICB0eHQgKz0gdGhpcy5nZXRUZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgdHh0ICs9ICI8Vj47Iit0aGlzLngudG9TdHJpbmcoKSt0aGlzLnkudG9TdHJpbmcoKSt0aGlzLnoudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHR4dDsKKyAgICB9Cit9KTsKK30KK2EgOiBJRCAtPiBJRDxWMj5bNDIsMTksMzBdIElEPFYyPlskSUQsOTldOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZDAyYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUC5nCkBAIC0wLDAgKzEsMTkgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1RQOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIHRva2VuVm9jYWI9dDA1M2hldGVyb1Q7Cit9Cit0b2tlbnMgeyBST09UOyB9CitAaGVhZGVyIHsKK2Z1bmN0aW9uIFZYKHR0eXBlLCB0cmVlKSB7CisgICAgVlguc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWWCwgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlLCB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gVlguc3VwZXJjbGFzcy50b1N0cmluZy5jYWxsKHRoaXMpICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogSUQ8Vj4gJzsnPFY+OworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1RQMTMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAxMy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhYmVjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1RQMTMuZwpAQCAtMCwwICsxLDI4IEBACitncmFtbWFyIHQwNTNoZXRlcm9UUDEzOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9SmF2YVNjcmlwdDsKKyAgICBvdXRwdXQ9QVNUOworICAgIHRva2VuVm9jYWI9dDA1M2hldGVyb1QxMzsKK30KK0BoZWFkZXIgeworZnVuY3Rpb24gVigpIHsKKyAgICBWLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CitvcmcuYW50bHIubGFuZy5leHRlbmQoViwgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlLCB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRUZXh0KCkgKyAiPFY+IjsKKyAgICB9Cit9KTsKKworZnVuY3Rpb24gVygpIHsKKyAgICBXLnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CitvcmcuYW50bHIubGFuZy5leHRlbmQoVywgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlLCB7CisgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRUZXh0KCkgKyAiPFc+IjsKKyAgICB9Cit9KTsKK30KK2EgOiBJRCBJTlQgLT4gSU5UPFY+IElEPFc+CisgIDsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1RQMTQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNWUwYWMzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE0LmcKQEAgLTAsMCArMSwyOCBAQAorZ3JhbW1hciB0MDUzaGV0ZXJvVFAxNDsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICB0b2tlblZvY2FiPXQwNTNoZXRlcm9UMTQ7Cit9CitAaGVhZGVyIHsKK2Z1bmN0aW9uIFYoKSB7CisgICAgVi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9Oworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxWPiI7CisgICAgfQorfSk7CisKK2Z1bmN0aW9uIFcoKSB7CisgICAgVy5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9Oworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFcsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpICsgIjxXPiI7CisgICAgfQorfSk7Cit9CithIDogSUQgSU5UIC0+IF4oSU5UPFY+IElEPFc+KQorICA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAxNS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDRmMTgzMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAxNS5nCkBAIC0wLDAgKzEsMjEgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1RQMTU7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgdG9rZW5Wb2NhYj10MDUzaGV0ZXJvVDE1OworICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworfQordG9rZW5zIHsgUk9PVDsgfQorQGhlYWRlciB7CitmdW5jdGlvbiBWMTUodHR5cGUpIHsKKyAgICBWMTUuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbih0dHlwZSkpOworfTsKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWMTUsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHQwNTNoZXRlcm9UUDE1UGFyc2VyLnRva2VuTmFtZXNbdGhpcy5nZXRUeXBlKCldICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogSUQgLT4gUk9PVDxWMTU+IElECisgIDsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1RQMTYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZDMwOTljCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE2LmcKQEAgLTAsMCArMSwyMSBAQAorZ3JhbW1hciB0MDUzaGV0ZXJvVFAxNjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICB0b2tlblZvY2FiPXQwNTNoZXRlcm9UMTY7Cit9Cit0b2tlbnMgeyBST09UOyB9CitAaGVhZGVyIHsKK2Z1bmN0aW9uIFYxNih0dHlwZSwgeCkgeworICAgIFYxNi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKHR0eXBlKSk7CisgICAgdGhpcy5mb29iYXIgPSB4OworfTsKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWMTYsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHQwNTNoZXRlcm9UUDE2UGFyc2VyLnRva2VuTmFtZXNbdGhpcy5nZXRUeXBlKCldICsgIjxWPjsiICsgdGhpcy5mb29iYXI7CisgICAgfQorfSk7Cit9CithIDogSUQgLT4gUk9PVDxWMTY+WzQyXSBJRAorICA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAxNy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGJkMzMwYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDUzaGV0ZXJvVFAxNy5nCkBAIC0wLDAgKzEsMjAgQEAKK2dyYW1tYXIgdDA1M2hldGVyb1RQMTc7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1KYXZhU2NyaXB0OworICAgIG91dHB1dD1BU1Q7CisgICAgdG9rZW5Wb2NhYj10MDUzaGV0ZXJvVDE3OworfQordG9rZW5zIHsgUk9PVDsgfQorQGhlYWRlciB7CitmdW5jdGlvbiBWMTcodHR5cGUpIHsKKyAgICBWMTcuc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbih0dHlwZSkpOworfTsKK29yZy5hbnRsci5sYW5nLmV4dGVuZChWMTcsIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZSwgeworICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHQwNTNoZXRlcm9UUDE3UGFyc2VyLnRva2VuTmFtZXNbdGhpcy5nZXRUeXBlKCldICsgIjxWPiI7CisgICAgfQorfSk7Cit9CithIDogSUQgLT4gXihST09UPFYxNz4gSUQpCisgIDsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE4LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1M2hldGVyb1RQMTguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTJmZjMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTNoZXRlcm9UUDE4LmcKQEAgLTAsMCArMSwyNiBAQAorZ3JhbW1hciB0MDUzaGV0ZXJvVFAxODsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPUphdmFTY3JpcHQ7CisgICAgb3V0cHV0PUFTVDsKKyAgICB0b2tlblZvY2FiPXQwNTNoZXRlcm9UMTg7Cit9Cit0b2tlbnMgeyBST09UOyB9CitAaGVhZGVyIHsKK2Z1bmN0aW9uIFYxOCh0dHlwZSwgdHJlZSkgeworICAgIGlmICghdHJlZSkgeworICAgICAgICBWMTguc3VwZXJjbGFzcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbih0dHlwZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFYxOC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgdHJlZSk7CisgICAgICAgIHRoaXMudG9rZW4udHlwZSA9IHR0eXBlOworICAgIH0KK307CitvcmcuYW50bHIubGFuZy5leHRlbmQoVjE4LCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUsIHsKKyAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0MDUzaGV0ZXJvVFAxOFBhcnNlci50b2tlbk5hbWVzW3RoaXMuZ2V0VHlwZSgpXSArICI8Vj5AIiArCisgICAgICAgICAgICB0aGlzLnRva2VuLmdldExpbmUoKTsKKyAgICB9Cit9KTsKK30KK2EgOiBJRCAtPiBST09UPFYxOD5bJElEXQorICA7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NjcxZjFiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlci5odG1sCkBAIC0wLDAgKzEsMTUwIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDA1NmxleGVyPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjFMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIxUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjJMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIyUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjNMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIzUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjRMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXI0UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjVMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXI1UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjZMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXI2UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjdMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXI3UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjhMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXI4UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjlMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXI5UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTZsZXhlcjEwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1NmxleGVyMTBQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1NmxleGVyMTFMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIxMVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIxMi5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIxMy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIxNC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU2bGV4ZXIxNS5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBmdW5jdGlvbiBleGVjUGFyc2VyKGxleGVyQ2xzLCBwYXJzZXJDbHMsIGdyYW1tYXJFbnRyeSwgeGlucHV0KQorICAgIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IGxleGVyQ2xzKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VyQ2xzKHRzdHJlYW0pLAorICAgICAgICAgICAgb3V0cHV0ID0gIiI7CisgICAgICAgIGxleGVyLnhsb2cgPSBmdW5jdGlvbihtc2cpe291dHB1dCArPSBtc2c7fTsKKyAgICAgICAgcGFyc2VyLnhsb2cgPSBsZXhlci54bG9nOworICAgICAgICB2YXIgciA9IHBhcnNlcltncmFtbWFyRW50cnldKCk7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBleGVjTGV4ZXIobGV4ZXJDbHMsIHhpbnB1dCkgeworICAgICAgICB2YXIgdG9rZW4sCisgICAgICAgICAgICBjc3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtKHhpbnB1dCksCisgICAgICAgICAgICBsZXhlciA9IG5ldyBsZXhlckNscyhjc3RyZWFtKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKTsKKyAgICAgICAgfSB3aGlsZSAodG9rZW4uZ2V0VHlwZSgpIT09bGV4ZXIuRU9GKTsKKyAgICB9CisKK2Z1bmN0aW9uIHRlc3RTZXRUZXh0KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1NmxleGVyMUxleGVyLCB0MDU2bGV4ZXIxUGFyc2VyLCAiYSIsICJcXHQiKTsKKyAgICBhc3NlcnRFcXVhbHMoIiAgIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UmVmVG9SdWxlRG9lc05vdFNldFRva2VuTm9yRW1pdEFub3RoZXIoKSB7CisgICAgLy8gdGhpcyBtdXN0IHJldHVybiBBIG5vdCBJIHRvIHRoZSBwYXJzZXI7IGNhbGxpbmcgYSBub25mcmFnbWVudCBydWxlCisgICAgLy8gZnJvbSBhIG5vbmZyYWdtZW50IHJ1bGUgZG9lcyBub3Qgc2V0IHRoZSBvdmVyYWxsIHRva2VuLgorICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1NmxleGVyMkxleGVyLCB0MDU2bGV4ZXIyUGFyc2VyLCAiYSIsICItMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoIi0zNCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFJlZlRvUnVsZURvZXNOb3RTZXRDaGFubmVsKCkgeworICAgIC8vIHRoaXMgbXVzdCBzZXQgY2hhbm5lbCBvZiBBIHRvIEhJRERFTi4gICRjaGFubmVsIGlzIGxvY2FsIHRvIHJ1bGUKKyAgICAvLyBsaWtlICR0eXBlLgorICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1NmxleGVyM0xleGVyLCB0MDU2bGV4ZXIzUGFyc2VyLCAiYSIsICItIDM0Iik7CisgICAgYXNzZXJ0RXF1YWxzKCItIDM0LCBjaGFubmVsPTAiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RXZUNhblNldFR5cGUoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU2bGV4ZXI0TGV4ZXIsIHQwNTZsZXhlcjRQYXJzZXIsICJhIiwgIi0zNCIpOworICAgIGFzc2VydEVxdWFscygiLTM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UmVmVG9GcmFnbWVudCgpIHsKKyAgICAvLyB0aGlzIG11c3QgcmV0dXJuIEEgbm90IEkgdG8gdGhlIHBhcnNlcjsgY2FsbGluZyBhIG5vbmZyYWdtZW50IHJ1bGUKKyAgICAvLyBmcm9tIGEgbm9uZnJhZ21lbnQgcnVsZSBkb2VzIG5vdCBzZXQgdGhlIG92ZXJhbGwgdG9rZW4uCisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU2bGV4ZXI1TGV4ZXIsIHQwNTZsZXhlcjVQYXJzZXIsICJhIiwgIi0zNCIpOworICAgIGFzc2VydEVxdWFscygiLTM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGlwbGVSZWZUb0ZyYWdtZW50KCkgeworICAgIC8vIHRoaXMgbXVzdCByZXR1cm4gQSBub3QgSSB0byB0aGUgcGFyc2VyOyBjYWxsaW5nIGEgbm9uZnJhZ21lbnQgcnVsZQorICAgIC8vIGZyb20gYSBub25mcmFnbWVudCBydWxlIGRvZXMgbm90IHNldCB0aGUgb3ZlcmFsbCB0b2tlbi4KKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTZsZXhlcjZMZXhlciwgdDA1NmxleGVyNlBhcnNlciwgImEiLCAiMy4xNDE1OSIpOworICAgIGFzc2VydEVxdWFscygiMy4xNDE1OSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdExhYmVsSW5TdWJydWxlKCkgeworICAgIC8vIGNhbiB3ZSBzZWUgdiBvdXRzaWRlPworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1NmxleGVyN0xleGVyLCB0MDU2bGV4ZXI3UGFyc2VyLCAiYSIsICJoaSAzNDIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjM0MiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFJlZlRvVG9rZW5JbkxleGVyKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1NmxleGVyOExleGVyLCB0MDU2bGV4ZXI4UGFyc2VyLCAiYSIsICIzNDIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjM0MiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdExpc3RMYWJlbEluTGV4ZXIoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU2bGV4ZXI5TGV4ZXIsIHQwNTZsZXhlcjlQYXJzZXIsICJhIiwgIjMzIDI5NyIpOworICAgIGFzc2VydEVxdWFscygiIDMzIDI5NyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdER1cExpc3RSZWZJbkxleGVyKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1NmxleGVyMTBMZXhlciwgdDA1NmxleGVyMTBQYXJzZXIsICJhIiwgIjMzIDI5NyIpOworICAgIGFzc2VydEVxdWFscygiIDMzIDI5NyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENoYXJMYWJlbEluTGV4ZXIoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU2bGV4ZXIxMUxleGVyLCB0MDU2bGV4ZXIxMVBhcnNlciwgImEiLCAiYSIpOworICAgIGFzc2VydEVxdWFscygiYSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFJlcGVhdGVkTGFiZWxJbkxleGVyKCkgeworICAgIGV4ZWNMZXhlcih0MDU2bGV4ZXIxMiwgImFiYWJhYiIpOworfQorCitmdW5jdGlvbiB0ZXN0UmVwZWF0ZWRSdWxlTGFiZWxJbkxleGVyKCkgeworICAgIGV4ZWNMZXhlcih0MDU2bGV4ZXIxMywgImFhIik7Cit9CisKK2Z1bmN0aW9uIHRlc3RJc29sYXRlZEVPVEVkZ2UoKSB7CisgICAgZXhlY0xleGVyKHQwNTZsZXhlcjE0LCAicWJhbG9nbmEhcSIpOworfQorCitmdW5jdGlvbiB0ZXN0RXNjYXBlZExpdGVyYWxzKCkgeworICAgIGV4ZWNMZXhlcih0MDU2bGV4ZXIxNSwgIlxcXCIiKTsKK30KKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA1NmxleGVyPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIxLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTU3OGUyYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIxLmcKQEAgLTAsMCArMSw1IEBACitncmFtbWFyIHQwNTZsZXhlcjE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK2EgOiBBIHt0aGlzLnhsb2codGhpcy5pbnB1dCk7fSA7CitBIDogJ1xcJyAndCcge3RoaXMuc2V0VGV4dCgiICAiKTt9IDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjEwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YzlhZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjEwLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTZsZXhlcjEwOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDt9CithIDogQSA7CitBIDogaSs9SSBXUyBpKz1JIHskY2hhbm5lbD0wOyBmb3IgKHZhciBwPTA7IHA8JGkubGVuZ3RoOyBwKyspIHRoaXMueGxvZygiICIrJGlbcF0uZ2V0VGV4dCgpKTsgfSA7CitmcmFnbWVudCBJIDogJzAnLi4nOScrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjExLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZGJiMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjExLmcKQEAgLTAsMCArMSw0IEBACitncmFtbWFyIHQwNTZsZXhlcjExOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDt9CithIDogQiA7CitCIDogeD0nYScge3RoaXMueGxvZygkeCk7fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIxMi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4NTQxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTIuZwpAQCAtMCwwICsxLDMgQEAKK2xleGVyIGdyYW1tYXIgdDA1NmxleGVyMTI7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK0IgOiB4PSdhJyB4PSdiJyA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIxMy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmNGFlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTMuZwpAQCAtMCwwICsxLDQgQEAKK2xleGVyIGdyYW1tYXIgdDA1NmxleGVyMTM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK0IgOiB4PUEgeD1BIDsKK2ZyYWdtZW50IEEgOiAnYScgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjE0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mM2Y4Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjE0LmcKQEAgLTAsMCArMSw0IEBACitsZXhlciBncmFtbWFyIHQwNTZsZXhlcjE0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDt9CitRVU9URURfQ09OVEVOVCAKKyAgICAgICAgOiAncScgKH4ncScpKiAoKCd4JyAncScpICkqICdxJyA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIxNS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3ZGE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMTUuZwpAQCAtMCwwICsxLDQgQEAKK2xleGVyIGdyYW1tYXIgdDA1NmxleGVyMTU7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK0EgOiAnXCInIDsKK0IgOiAnXFxcIicgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWYyNDM4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXIyLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTZsZXhlcjI7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK2EgOiBBIEVPRiB7dGhpcy54bG9nKHRoaXMuaW5wdXQpO30gOworQSA6ICctJyBJIDsKK0kgOiAnMCcuLic5JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyMy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZWY1MDY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjMuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1NmxleGVyMzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7fQorYSA6IEEgRU9GIHt0aGlzLnhsb2coJEEudGV4dCsiLCBjaGFubmVsPSIrJEEuY2hhbm5lbCk7fSA7CitBIDogJy0nIFdTIEkgOworSSA6ICcwJy4uJzknKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXI0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3MTViMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyNC5nCkBAIC0wLDAgKzEsNyBAQAorZ3JhbW1hciB0MDU2bGV4ZXI0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDt9Cit0b2tlbnMge1g7fQorYSA6IFggRU9GIHt0aGlzLnhsb2codGhpcy5pbnB1dCk7fSA7CitBIDogJy0nIEkgeyR0eXBlID0gdGhpcy5YO30gOworSSA6ICcwJy4uJzknKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXI1LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyNS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4NjE2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyNS5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU2bGV4ZXI1Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDt9CithIDogQSB7dGhpcy54bG9nKHRoaXMuaW5wdXQpO30gOworQSA6ICctJyBJIDsKK2ZyYWdtZW50IEkgOiAnMCcuLic5JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyNi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNDliZGQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjYuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1NmxleGVyNjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7fQorYSA6IEEgRU9GIHt0aGlzLnhsb2codGhpcy5pbnB1dCk7fSA7CitBIDogSSAnLicgSSA7CitmcmFnbWVudCBJIDogJzAnLi4nOScrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXI3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDE5ZTUxMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXI3LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTZsZXhlcjc7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK2EgOiBBIEVPRiA7CitBIDogJ2hpJyBXUyAodj1JKT8geyRjaGFubmVsPTA7IHRoaXMueGxvZygkdi50ZXh0KTt9IDsKK2ZyYWdtZW50IEkgOiAnMCcuLic5JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1NmxleGVyOC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42Zjc1ODEyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjguZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1NmxleGVyODsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7fQorYSA6IEEgRU9GIDsKK0EgOiBJIHt0aGlzLnhsb2coJEkudGV4dCk7fSA7CitmcmFnbWVudCBJIDogJzAnLi4nOScrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTZsZXhlcjkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXI5LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRiZGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU2bGV4ZXI5LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTZsZXhlcjk7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O30KK2EgOiBBIDsKK0EgOiBpKz1JKyB7IGZvciAodmFyIHA9MDsgcDwkaS5sZW5ndGg7IHArKykgdGhpcy54bG9nKCIgIiskaVtwXS5nZXRUZXh0KCkpOyB9IDsKK2ZyYWdtZW50IEkgOiAnMCcuLic5JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QuaHRtbCBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiNDA2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QuaHRtbApAQCAtMCwwICsxLDQ5NSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPgorPHRpdGxlPnQwNTdhdXRvQVNUPC90aXRsZT4KKworPCEtLSBBTlRMUiBpbmNsdWRlcyAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2xpYi9hbnRscjMtYWxsLmpzIj48L3NjcmlwdD4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU3YXV0b0FTVDNMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU3YXV0b0FTVDNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU3YXV0b0FTVDZMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU3YXV0b0FTVDZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q3UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUOExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUOFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU3YXV0b0FTVDlMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU3YXV0b0FTVDlQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxMExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTBQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxMUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxMkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTJQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxM0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxNExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxNUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTVQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxNkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxN0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxOExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMThQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QxOUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMTlQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyMExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjBQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyMUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyMkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjJQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyM0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyNExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyNUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjVQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyNkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyN0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyOExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjhQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QyOUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMjlQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzMExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzBQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzMUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzMkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzJQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzM0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzNExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzNUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzVQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzNkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzN0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzOExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzhQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1QzOUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUMzlQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0MExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDBQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0MUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0MkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDJQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0M0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0NExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0NUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDVQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0NkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0N0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0OExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDhQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q0OUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNDlQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1MExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTBQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1MUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1MkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTJQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1M0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTNQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1NExleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1NUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTVQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1NkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTZQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1N2F1dG9BU1Q1N0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNTdhdXRvQVNUNTdQYXJzZXIuanMiPjwvc2NyaXB0PgorCis8IS0tIEpzVW5pdCBpbmNsdWRlIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vanN1bml0L2FwcC9qc1VuaXRDb3JlLmpzIj48L3NjcmlwdD4KKworPCEtLSBUZXN0IENvZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgLy8gUGFyc2VyIFRlc3RzCisKKyAgICBmdW5jdGlvbiBleGVjUGFyc2VyKGxleGVyQ2xzLCBwYXJzZXJDbHMsIGdyYW1tYXJFbnRyeSwgeGlucHV0LCBleHBlY3RFcnJvcnMpIHsKKyAgICAgICAgdmFyIGNzdHJlYW0gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJTdHJpbmdTdHJlYW0oeGlucHV0KSwKKyAgICAgICAgICAgIGxleGVyID0gbmV3IChFbmhhbmNlZFBhcnNlcihsZXhlckNscykpKGNzdHJlYW0pLAorICAgICAgICAgICAgdHN0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlblN0cmVhbShsZXhlciksCisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgKEVuaGFuY2VkUGFyc2VyKHBhcnNlckNscykpKHRzdHJlYW0pOworICAgICAgICB2YXIgciA9IHBhcnNlcltncmFtbWFyRW50cnldKCk7CisKKyAgICAgICAgaWYgKCFleHBlY3RFcnJvcnMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJzZXIuX2Vycm9ycy5sZW5ndGgsIDApOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHJlc3VsdCA9ICIiOworICAgICAgICBpZiAocikgeworICAgICAgICAgICAgaWYgKHIucmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHIucmVzdWx0CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoci5nZXRUcmVlKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gci5nZXRUcmVlKCkudG9TdHJpbmdUcmVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWV4cGVjdEVycm9ycykgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBwYXJzZXIuX2Vycm9yc107CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBFbmhhbmNlZFBhcnNlcihiYXNlKSB7CisgICAgICAgIHZhciBUID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBULnN1cGVyY2xhc3MuY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHRoaXMudHJhY2VzID0gW107CisgICAgICAgICAgICB0aGlzLmJ1ZiA9ICIiOworICAgICAgICAgICAgdGhpcy5fZXJyb3JzID0gW107CisgICAgICAgIH07CisKKyAgICAgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKFQsIGJhc2UsIHsKKyAgICAgICAgICAgIGNhcHR1cmU6IGZ1bmN0aW9uKHQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmJ1ZiArPSB0OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRyYWNlSW46IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRyYWNlcy5wdXNoKCI+IitydWxlTmFtZSk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgdHJhY2VPdXQ6IGZ1bmN0aW9uKHJ1bGVOYW1lLCBydWxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRyYWNlcy5wdXNoKCI8IitydWxlTmFtZSk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgZW1pdEVycm9yTWVzc2FnZTogZnVuY3Rpb24obXNnKSB7CisgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIFQ7CisgICAgfQorCitmdW5jdGlvbiB0ZXN0VG9rZW5MaXN0KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QxTGV4ZXIsIHQwNTdhdXRvQVNUMVBhcnNlciwgImEiLCAiYWJjIDM0Iik7CisgICAgYXNzZXJ0RXF1YWxzKCJhYmMgMzQiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RUb2tlbkxpc3RJblNpbmdsZUFsdEJsb2NrKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QyTGV4ZXIsIHQwNTdhdXRvQVNUMlBhcnNlciwiYSIsICJhYmMgMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoImFiYyAzNCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNpbXBsZVJvb3RBdE91dGVyTGV2ZWwoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDNMZXhlciwgdDA1N2F1dG9BU1QzUGFyc2VyLCAiYSIsICJhYmMgMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihhYmMgMzQpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2ltcGxlUm9vdEF0T3V0ZXJMZXZlbFJldmVyc2UoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDRMZXhlciwgdDA1N2F1dG9BU1Q0UGFyc2VyLCAiYSIsICIzNCBhYmMiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihhYmMgMzQpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0QmFuZygpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUNUxleGVyLCB0MDU3YXV0b0FTVDVQYXJzZXIsICJhIiwgImFiYyAzNCBkYWcgNDUzMiIpOworICAgIGFzc2VydEVxdWFscygiYWJjIDQ1MzIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RPcHRpb25hbFRoZW5Sb290KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1Q2TGV4ZXIsIHQwNTdhdXRvQVNUNlBhcnNlciwgImEiLCAiYSAxIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihiIGEgMSkiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RMYWJlbGVkU3RyaW5nUm9vdCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUN0xleGVyLCB0MDU3YXV0b0FTVDdQYXJzZXIsICJhIiwgInZvaWQgZm9vOyIpOworICAgIGFzc2VydEVxdWFscygiKHZvaWQgZm9vIDspIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0V2lsZGNhcmQoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDhMZXhlciwgdDA1N2F1dG9BU1Q4UGFyc2VyLCAiYSIsICJ2b2lkIGZvbzsiKTsKKyAgICBhc3NlcnRFcXVhbHMoIih2b2lkIGZvbyA7KSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFdpbGRjYXJkUm9vdCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUOUxleGVyLCB0MDU3YXV0b0FTVDlQYXJzZXIsICJhIiwgInZvaWQgZm9vOyIpOworICAgIGFzc2VydEVxdWFscygiKGZvbyB2b2lkIDspIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0V2lsZGNhcmRSb290V2l0aExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QxMExleGVyLCB0MDU3YXV0b0FTVDEwUGFyc2VyLCAiYSIsICJ2b2lkIGZvbzsiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihmb28gdm9pZCA7KSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFdpbGRjYXJkUm9vdFdpdGhMaXN0TGFiZWwoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDExTGV4ZXIsIHQwNTdhdXRvQVNUMTFQYXJzZXIsICJhIiwgInZvaWQgZm9vOyIpOworICAgIGFzc2VydEVxdWFscygiKGZvbyB2b2lkIDspIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0Um9vdFJvb3QoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDEyTGV4ZXIsIHQwNTdhdXRvQVNUMTJQYXJzZXIsICJhIiwgImEgMzQgYyIpOworICAgIGFzc2VydEVxdWFscygiKDM0IGEgYykiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSb290Um9vdDIoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDEzTGV4ZXIsIHQwNTdhdXRvQVNUMTNQYXJzZXIsICJhIiwgImEgMzQgYyIpOworICAgIGFzc2VydEVxdWFscygiKGMgKDM0IGEpKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFJvb3RUaGVuUm9vdEluTG9vcCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMTRMZXhlciwgdDA1N2F1dG9BU1QxNFBhcnNlciwgImEiLCAiYSAzNCAqIGIgOSAqIGMiKTsKKyAgICBhc3NlcnRFcXVhbHMoIigqICgqIChhIDM0KSBiIDkpIGMpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TmVzdGVkU3VicnVsZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMTVMZXhlciwgdDA1N2F1dG9BU1QxNVBhcnNlciwgImEiLCAidm9pZCBhIGI7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIGEgYiA7IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0SW52b2tlUnVsZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMTZMZXhlciwgdDA1N2F1dG9BU1QxNlBhcnNlciwgImEiLCAiaW50IGEiKTsKKyAgICBhc3NlcnRFcXVhbHMoImludCBhIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0SW52b2tlUnVsZUFzUm9vdCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMTdMZXhlciwgdDA1N2F1dG9BU1QxN1BhcnNlciwgImEiLCAiaW50IGEiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihpbnQgYSkiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RJbnZva2VSdWxlQXNSb290V2l0aExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QxOExleGVyLCB0MDU3YXV0b0FTVDE4UGFyc2VyLCAiYSIsICJpbnQgYSIpOworICAgIGFzc2VydEVxdWFscygiKGludCBhKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdEludm9rZVJ1bGVBc1Jvb3RXaXRoTGlzdExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QxOUxleGVyLCB0MDU3YXV0b0FTVDE5UGFyc2VyLCAiYSIsICJpbnQgYSIpOworICAgIGFzc2VydEVxdWFscygiKGludCBhKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFJ1bGVSb290SW5Mb29wKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QyMExleGVyLCB0MDU3YXV0b0FTVDIwUGFyc2VyLCAiYSIsICJhK2IrYytkIik7CisgICAgYXNzZXJ0RXF1YWxzKCIoKyAoKyAoKyBhIGIpIGMpIGQpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UnVsZUludm9jYXRpb25SdWxlUm9vdEluTG9vcCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMjFMZXhlciwgdDA1N2F1dG9BU1QyMVBhcnNlciwgImEiLCAiYStiK2MtZCIpOworICAgIGFzc2VydEVxdWFscygiKC0gKCsgKCsgYSBiKSBjKSBkKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRhaWxSZWN1cnNpb24oKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDIyTGV4ZXIsIHQwNTdhdXRvQVNUMjJQYXJzZXIsICJzIiwgIjMgZXhwIDQgZXhwIDUiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihleHAgMyAoZXhwIDQgNSkpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2V0KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QyM0xleGVyLCB0MDU3YXV0b0FTVDIzUGFyc2VyLCAiYSIsICJhYmMiKTsKKyAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNldFJvb3QoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDI0TGV4ZXIsIHQwNTdhdXRvQVNUMjRQYXJzZXIsICJhIiwgIithYmMiKTsKKyAgICBhc3NlcnRFcXVhbHMoIigrIGFiYykiLCBmb3VuZCk7Cit9CisKKy8vQHRlc3RiYXNlLmJyb2tlbigiRkFJTFMgdW50aWwgYW50bHIuZyByZWJ1aWx0IGluIHYzIiwgUnVudGltZUVycm9yKTsKK2Z1bmN0aW9uIHRlc3RTZXRSb290V2l0aExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QyNUxleGVyLCB0MDU3YXV0b0FTVDI1UGFyc2VyLCAiYSIsICIrYWJjIik7CisgICAgYXNzZXJ0RXF1YWxzKCIoKyBhYmMpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2V0QXNSdWxlUm9vdEluTG9vcCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMjZMZXhlciwgdDA1N2F1dG9BU1QyNlBhcnNlciwgImEiLCAiYStiLWMiKTsKKyAgICBhc3NlcnRFcXVhbHMoIigtICgrIGEgYikgYykiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3ROb3RTZXQoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDI3TGV4ZXIsIHQwNTdhdXRvQVNUMjdQYXJzZXIsICJhIiwgIjM0KzIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjM0ICsgMiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE5vdFNldFdpdGhMYWJlbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMjhMZXhlciwgdDA1N2F1dG9BU1QyOFBhcnNlciwgImEiLCAiMzQrMiIpOworICAgIGFzc2VydEVxdWFscygiMzQgKyAyIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0Tm90U2V0V2l0aExpc3RMYWJlbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMjlMZXhlciwgdDA1N2F1dG9BU1QyOVBhcnNlciwgImEiLCAiMzQrMiIpOworICAgIGFzc2VydEVxdWFscygiMzQgKyAyIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0Tm90U2V0Um9vdCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUMzBMZXhlciwgdDA1N2F1dG9BU1QzMFBhcnNlciwgImEiLCAiMzQgNTUiKTsKKyAgICBhc3NlcnRFcXVhbHMoIigzNCA1NSkiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3ROb3RTZXRSb290V2l0aExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzMUxleGVyLCB0MDU3YXV0b0FTVDMxUGFyc2VyLCAiYSIsICIzNCA1NSIpOworICAgIGFzc2VydEVxdWFscygiKDM0IDU1KSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE5vdFNldFJvb3RXaXRoTGlzdExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzMkxleGVyLCB0MDU3YXV0b0FTVDMyUGFyc2VyLCAiYSIsICIzNCA1NSIpOworICAgIGFzc2VydEVxdWFscygiKDM0IDU1KSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE5vdFNldFJ1bGVSb290SW5Mb29wKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzM0xleGVyLCB0MDU3YXV0b0FTVDMzUGFyc2VyLCAiYSIsICIzKzQrNSIpOworICAgIGFzc2VydEVxdWFscygiKCsgKCsgMyA0KSA1KSIsIGZvdW5kKTsKK30KKworLy9AdGVzdGJhc2UuYnJva2VuKCJGSVhNRTogV2hhdCBoYXBwZW5lZCB0byB0aGUgc2VtaWNvbG9uPyIsIEFzc2VydGlvbkVycm9yKTsKK2Z1bmN0aW9uIHRlc3RUb2tlbkxhYmVsUmV1c2UoKSB7CisvLyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbSBkdWUgdG8gbXVsdGlwbGUgZGVmaW5lcworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzNExleGVyLCB0MDU3YXV0b0FTVDM0UGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjJuZCBpZD1iO2EgYiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRva2VuTGFiZWxSZXVzZTIoKSB7CisvLyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbSBkdWUgdG8gbXVsdGlwbGUgZGVmaW5lcworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzNUxleGVyLCB0MDU3YXV0b0FTVDM1UGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjJuZCBpZD1iLChiIGEpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0VG9rZW5MaXN0TGFiZWxSZXVzZSgpIHsKKy8vIGNoZWNrIGZvciBjb21waWxhdGlvbiBwcm9ibGVtIGR1ZSB0byBtdWx0aXBsZSBkZWZpbmVzCisvLyBtYWtlIHN1cmUgaWRzIGhhcyBib3RoIElEIHRva2VucworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzNkxleGVyLCB0MDU3YXV0b0FTVDM2UGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBleHBlY3RpbmcgPSAiaWQgbGlzdD1bYSxiXSxhIGIiCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRva2VuTGlzdExhYmVsUmV1c2UyKCkgeworLy8gY2hlY2sgZm9yIGNvbXBpbGF0aW9uIHByb2JsZW0gZHVlIHRvIG11bHRpcGxlIGRlZmluZXMKKy8vIG1ha2Ugc3VyZSBpZHMgaGFzIGJvdGggSUQgdG9rZW5zCisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDM3TGV4ZXIsIHQwNTdhdXRvQVNUMzdQYXJzZXIsICJhIiwgImEgYiIpOworICAgIGV4cGVjdGluZyA9ICJpZCBsaXN0PVthLGJdLChhIGIpIgorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RUb2tlbkxpc3RMYWJlbFJ1bGVSb290KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzOExleGVyLCB0MDU3YXV0b0FTVDM4UGFyc2VyLCAiYSIsICJhIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0VG9rZW5MaXN0TGFiZWxCYW5nKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1QzOUxleGVyLCB0MDU3YXV0b0FTVDM5UGFyc2VyLCAiYSIsICJhIik7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSdWxlTGlzdExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1Q0MExleGVyLCB0MDU3YXV0b0FTVDQwUGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjJuZCB4PWIsYSBiIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UnVsZUxpc3RMYWJlbFJ1bGVSb290KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1Q0MUxleGVyLCB0MDU3YXV0b0FTVDQxUGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIng9KGIgYSksKGIgYSkiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSdWxlTGlzdExhYmVsQmFuZygpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUNDJMZXhlciwgdDA1N2F1dG9BU1Q0MlBhcnNlciwgImEiLCAiYSBiIik7CisgICAgYXNzZXJ0RXF1YWxzKCIxc3QgeD1hLGIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RDb21wbGljYXRlZE1lbGFuZ2UoKSB7CisvLyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbQorICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1Q0M0xleGVyLCB0MDU3YXV0b0FTVDQzUGFyc2VyLCAiYSIsICJhIGIgYiBjIGMgZCIpOworICAgIGFzc2VydEVxdWFscygiYSBiIGIgYyBjIGQiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSZXR1cm5WYWx1ZVdpdGhBU1QoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDQ0TGV4ZXIsIHQwNTdhdXRvQVNUNDRQYXJzZXIsICJhIiwgImFiYyAzNCIpOworICAgIGFzc2VydEVxdWFscygiMzRcbmFiYyAzNCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNldExvb3AoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDQ1TGV4ZXIsIHQwNTdhdXRvQVNUNDVQYXJzZXIsICJyIiwgImFiYyAzNCBkIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhYmMgMzQgZCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdEV4dHJhVG9rZW5JblNpbXBsZURlY2woKSB7CisgICAgZm91bmQsIGVycm9ycyA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1Q0NkxleGVyLCB0MDU3YXV0b0FTVDQ2UGFyc2VyLCAiZGVjbCIsICJpbnQgMzQgeD0xOyIsCisgICAgICAgICAgICB0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHMoWyJsaW5lIDE6NCBleHRyYW5lb3VzIGlucHV0IHUnMzQnIGV4cGVjdGluZyBJRCJdLAorICAgICAgICAgICAgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoIihpbnQgeCAxKSIsIGZvdW5kKTsgLy8gdHJlZSBnZXRzIGNvcnJlY3QgeCBhbmQgMSB0b2tlbnMKK30KKworZnVuY3Rpb24gdGVzdE1pc3NpbmdJREluU2ltcGxlRGVjbCgpIHsKKyAgICBmb3VuZCwgZXJyb3JzID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDQ3TGV4ZXIsIHQwNTdhdXRvQVNUNDdQYXJzZXIsICJkZWNsIiwgImludCA9MTsiLAorICAgICAgICAgICAgdHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKFsibGluZSAxOjQgbWlzc2luZyBJRCBhdCB1Jz0nIl0sIGVycm9ycyk7CisgICAgYXNzZXJ0RXF1YWxzKCIoaW50IDxtaXNzaW5nIElEPiAxKSIsIGZvdW5kKTsgLy8gdHJlZSBnZXRzIGludmVudGVkIElEIHRva2VuCit9CisKK2Z1bmN0aW9uIHRlc3RNaXNzaW5nU2V0SW5TaW1wbGVEZWNsKCkgeworICAgIGZvdW5kLCBlcnJvcnMgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUNDhMZXhlciwgdDA1N2F1dG9BU1Q0OFBhcnNlciwgImRlY2wiLCAieD0xOyIsCisgICAgICAgICAgICB0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHMoWyJsaW5lIDE6MCBtaXNtYXRjaGVkIGlucHV0IHUneCcgZXhwZWN0aW5nIHNldCBOb25lIl0sIGVycm9ycyk7CisgICAgYXNzZXJ0RXF1YWxzKCIoPGVycm9yOiB4PiB4IDEpIiwgZm91bmQpOyAvLyB0cmVlIGdldHMgaW52ZW50ZWQgSUQgdG9rZW4KK30KKworZnVuY3Rpb24gdGVzdE1pc3NpbmdUb2tlbkdpdmVzRXJyb3JOb2RlKCkgeworICAgIGZvdW5kLCBlcnJvcnMgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUNDlMZXhlciwgdDA1N2F1dG9BU1Q0OVBhcnNlciwgImEiLCAiYWJjIiwgdHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKFsibGluZSAwOi0xIG1pc3NpbmcgSU5UIGF0ICc8RU9GPiciXSwgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoImFiYyA8bWlzc2luZyBJTlQ+IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TWlzc2luZ1Rva2VuR2l2ZXNFcnJvck5vZGVJbkludm9rZWRSdWxlKCkgeworICAgIGZvdW5kLCBlcnJvcnMgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUNTBMZXhlciwgdDA1N2F1dG9BU1Q1MFBhcnNlciwgImEiLCAiYWJjIiwgdHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKFsibGluZSAwOi0xIG1pc3NpbmcgSU5UIGF0ICc8RU9GPiciXSwgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoImFiYyA8bWlzc2luZyBJTlQ+IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0RXh0cmFUb2tlbkdpdmVzRXJyb3JOb2RlKCkgeworICAgIGZvdW5kLCBlcnJvcnMgPSBleGVjUGFyc2VyKHQwNTdhdXRvQVNUNTFMZXhlciwgdDA1N2F1dG9BU1Q1MVBhcnNlciwgImEiLCAiYWJjIGljayAzNCIsCisgICAgICAgICAgICB0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHMoWyJsaW5lIDE6NCBleHRyYW5lb3VzIGlucHV0IHUnaWNrJyBleHBlY3RpbmcgSU5UIl0sCisgICAgICAgICAgICBlcnJvcnMpOworICAgIGFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZSgpIHsKKyAgICBmb3VuZCwgZXJyb3JzID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDUyTGV4ZXIsIHQwNTdhdXRvQVNUNTJQYXJzZXIsICJhIiwgIjM0IiwgdHJ1ZSk7CisgICAgYXNzZXJ0RXF1YWxzKFsibGluZSAxOjAgbWlzc2luZyBJRCBhdCB1JzM0JyJdLCBlcnJvcnMpOworICAgIGFzc2VydEVxdWFscygiPG1pc3NpbmcgSUQ+IDM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZTIoKSB7CisgICAgZm91bmQsIGVycm9ycyA9IGV4ZWNQYXJzZXIodDA1N2F1dG9BU1Q1M0xleGVyLCB0MDU3YXV0b0FTVDUzUGFyc2VyLCAiYSIsICIzNCIsIHRydWUpOworLy8gZmluZHMgYW4gZXJyb3IgYXQgdGhlIGZpcnN0IHRva2VuLCAzNCwgYW5kIHJlLXN5bmNzLgorLy8gcmUtc3luY2hyb25pemluZyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gYmVjYXVzZSAzNCBmb2xsb3dzCisvLyByZWYgdG8gcnVsZSBiIChzdGFydCBvZiBjKS4gSXQgdGhlbiBtYXRjaGVzIDM0IGluIGMuCisgICAgYXNzZXJ0RXF1YWxzKFsibGluZSAxOjAgbWlzc2luZyBJRCBhdCB1JzM0JyJdLCBlcnJvcnMpOworICAgIGFzc2VydEVxdWFscygiPG1pc3NpbmcgSUQ+IDM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0Tm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZSgpIHsKKyAgICBmb3VuZCwgZXJyb3JzID0gZXhlY1BhcnNlcih0MDU3YXV0b0FTVDU0TGV4ZXIsIHQwNTdhdXRvQVNUNTRQYXJzZXIsICJhIiwgIioiLCB0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHMoWyJsaW5lIDE6MCBubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgdScqJyJdLAorICAgICAgICAgICAgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoIjx1bmV4cGVjdGVkOiBbQDAsMDowPXUnKicsPDY+LDE6MF0sIHJlc3luYz0qPiIsCisgICAgICAgICAgICBmb3VuZCk7Cit9CisKKzwvc2NyaXB0PgorCis8L2hlYWQ+Cis8Ym9keT4KKyAgICA8aDE+dDA1N2F1dG9BU1Q8L2gxPgorPC9ib2R5PgorPC9odG1sPgorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZjY4NDFiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMS5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTAuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEwLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTdmZjRiNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEwLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTA7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IHY9J3ZvaWQnIHg9Ll4gJzsnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDExLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzY5Y2FkZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDExLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IHY9J3ZvaWQnIHg9Ll4gJzsnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNhOTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEyLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTI7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEXiBJTlReIElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWMyMjc1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDEzLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIElOVF4gSUReIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTQuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE0LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWRlMmEyOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE0LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTQ7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEXiAoSU5UICcqJ14gSUQpKyA7CitJRCAgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QxNS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWZjODI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTUuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QxNTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogJ3ZvaWQnICgoe3Bhc3N9SUR8SU5UKSBJRCB8ICdudWxsJyApICc7JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QxNi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjYmRmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QxNi5nCkBAIC0wLDAgKzEsNyBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDE2Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgIDogdHlwZSBJRCA7Cit0eXBlIDoge3Bhc3N9J2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWZjOGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE3LmcKQEAgLTAsMCArMSw3IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTc7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSAgOiB0eXBlXiBJRCA7Cit0eXBlIDoge3Bhc3N9J2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE4LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFlMGM2MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDE4LmcKQEAgLTAsMCArMSw3IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMTg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSAgOiB4PXR5cGVeIElEIDsKK3R5cGUgOiB7cGFzc30naW50JyB8ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QxOS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTM4M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMTkuZwpAQCAtMCwwICsxLDcgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QxOTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithICA6IHgrPXR5cGVeIElEIDsKK3R5cGUgOiB7cGFzc30naW50JyB8ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDcxYTAwZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDIuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QyOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiAoSUQgSU5UKSA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDIwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyMC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzYWNjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyMC5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDIwOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCAoJysnXiBJRCkqIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDIxLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNThiYWU4NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDIxLmcKQEAgLTAsMCArMSw3IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMjE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIChvcF4gSUQpKiA7CitvcCA6IHtwYXNzfScrJyB8ICctJyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDIyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyMi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlODY1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyMi5nCkBAIC0wLDAgKzEsOCBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDIyOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3MgOiBhIDsKK2EgOiBhdG9tICgnZXhwJ14gYSk/IDsKK2F0b20gOiBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyMy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmM5YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjMuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QyMzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUR8SU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjQuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI0LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M0M2YwMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI0LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMjQ7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6ICgnKycgfCAnLScpXiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI1LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyNS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhNDdmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyNS5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDI1Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiB4PSgnKycgfCAnLScpXiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyNi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmYTQ5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyNi5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDI2Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCAoKCcrJ3wnLScpXiBJRCkqIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRmZmZkMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI3LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMjc7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IH5JRCAnKycgSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI4LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2JmMmFhYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDI4LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMjg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IHg9fklEICcrJyBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QyOS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDk5Yjk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMjkuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QyOTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogeD1+SUQgJysnIElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWVlMzUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMy5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEXiBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzMC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZWVkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzAuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QzMDsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogficrJ14gSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDMxLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFmMGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDMxLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMzE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IH4nKydeIElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDMyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzMi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwMGFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzMi5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDMyOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiB+JysnXiBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzMy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kN2I0YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzMuZwpAQCAtMCwwICsxLDcgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QzMzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSU5UICh+SU5UXiBJTlQpKiA7CitibG9ydCA6ICcrJyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDM0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MmQwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzNC5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDM0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgcmV0dXJucyBbcmVzdWx0XSA6IGlkPUlEIGlkPUlEIHskcmVzdWx0ID0gIjJuZCBpZD0iKyRpZC50ZXh0KyI7Ijt9IDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDM1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTRjMzI5YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDM1LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUMzU7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSByZXR1cm5zIFtyZXN1bHRdOiBpZD1JRCBpZD1JRF4geyRyZXN1bHQgPSAiMm5kIGlkPSIrJGlkLnRleHQrJywnO30gOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzNi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZmI1ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzYuZwpAQCAtMCwwICsxLDEyIEBACitncmFtbWFyIHQwNTdhdXRvQVNUMzY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSByZXR1cm5zIFtyZXN1bHRdIDogaWRzKz1JRCBpZHMrPUlEIHsKKyAgICB2YXIgcCwgYnVmZmVyPVtdOworICAgIGZvciAocD0wOyBwPCRpZHMubGVuZ3RoOyBwKyspIHsKKyAgICAgICAgYnVmZmVyLnB1c2goJGlkc1twXSk7CisgICAgfQorICAgICRyZXN1bHQgPSAiaWQgbGlzdD1bIitidWZmZXIuam9pbigiLCIpKyJdLCI7Cit9IDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDM3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTE2NTdmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDM3LmcKQEAgLTAsMCArMSwxMiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDM3Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgcmV0dXJucyBbcmVzdWx0XSA6IGlkcys9SUReIGlkcys9SUQgeworICAgIHZhciBwLCBidWZmZXI9W107CisgICAgZm9yIChwPTA7IHA8JGlkcy5sZW5ndGg7IHArKykgeworICAgICAgICBidWZmZXIucHVzaCgkaWRzW3BdKTsKKyAgICB9CisgICAgJHJlc3VsdCA9ICJpZCBsaXN0PVsiK2J1ZmZlci5qb2luKCIsIikrIl0sIjsKK30gOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzOC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YzkwY2RjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUMzguZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1QzODsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogaWQrPUlEXiA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDM5LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzOS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjODQ4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1QzOS5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDM5Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBpZCs9SUQhIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzNzBlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNDsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSU5UIElEXiA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0MC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3MzQ1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0MC5nCkBAIC0wLDAgKzEsMTAgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q0MDsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIHJldHVybnMgW3Jlc3VsdF06IHgrPWIgeCs9YiB7Cit0PSR4WzFdCiskcmVzdWx0ID0gIjJuZCB4PSIrdC50b1N0cmluZ1RyZWUoKSsnLCc7Cit9OworYiA6IElEOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0MS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNTFjZGZkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDEuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q0MTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIHJldHVybnMgW3Jlc3VsdF0gOiAoIHgrPWJeICkrIHsKKyRyZXN1bHQgPSAieD0iKyR4WzFdLnRvU3RyaW5nVHJlZSgpKycsJzsKK30gOworYiA6IElEOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0Mi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Y2U2MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDIuZwpAQCAtMCwwICsxLDkgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q0MjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIHJldHVybnMgW3Jlc3VsdF0gOiB4Kz1iISB4Kz1iIHsKKyRyZXN1bHQgPSAiMXN0IHg9IiskeFswXS50b1N0cmluZ1RyZWUoKSsnLCc7Cit9IDsKK2IgOiBJRDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzQyODk2YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQzLmcKQEAgLTAsMCArMSw4IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNDM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IEEgYj1CIGI9QiBjKz1DIGMrPUMgRCB7cyA9ICRELnRleHR9IDsKK0EgOiAnYScgOworQiA6ICdiJyA7CitDIDogJ2MnIDsKK0QgOiAnZCcgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0NC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjI2MmNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDQuZwpAQCAtMCwwICsxLDEwIEBACitncmFtbWFyIHQwNTdhdXRvQVNUNDQ7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSByZXR1cm5zIFtyZXN1bHRdIDogSUQgYiB7CisvKiBAdG9kbyAqLworLyogJHJlc3VsdCA9ICRiLmkudG9TdHJpbmcoKSArICdcbic7ICovCit9IDsKK2IgcmV0dXJucyBbaV0gOiBJTlQgeyRpPXBhcnNlSW50KCRJTlQudGV4dCk7fSA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQ1LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0NS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAyZWU3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0NS5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDQ1Oworb3B0aW9ucyB7IGxhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDsgfQorciA6IChJTlR8SUQpKyA7IAorSUQgOiAnYScuLid6JyArIDsKK0lOVCA6ICcwJy4uJzknICs7CitXUzogKCcgJyB8ICdcbicgfCAnXFx0JykrIHskY2hhbm5lbCA9IEhJRERFTjt9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQ2LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjg2NDJlYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQ2LmcKQEAgLTAsMCArMSw3IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNDY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorZGVjbCA6IHR5cGVeIElEICc9JyEgSU5UICc7JyEgOwordHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQ3LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0Ny5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjNmNjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0Ny5nCkBAIC0wLDAgKzEsOCBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDQ3Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7RVhQUjt9CitkZWNsIDogdHlwZV4gSUQgJz0nISBJTlQgJzsnISA7Cit0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQ4LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGJhY2NiOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDQ4LmcKQEAgLTAsMCArMSw4IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNDg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtFWFBSO30KK2RlY2wgOiB0eXBlXiBJRCAnPSchIElOVCAnOychIDsKK3R5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q0OS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NmNlYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNDkuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q0OTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgSU5UIDsgLy8gZm9sbG93IGlzIEVPRgorSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWQwMTlkNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDUuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q1Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCBJTlQhIElEISBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1MC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNTAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNTg5ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNTAuZwpAQCAtMCwwICsxLDcgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q1MDsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogYiA7CitiIDogSUQgSU5UIDsgLy8gZm9sbG93IHNob3VsZCBzZWUgRU9GCitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDUxLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1MS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMDI4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1MS5nCkBAIC0wLDAgKzEsOCBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDUxOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBiIGMgOworYiA6IElEIDsKK2MgOiBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1Mi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNTIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGNjNmRkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNTIuZwpAQCAtMCwwICsxLDYgQEAKK2dyYW1tYXIgdDA1N2F1dG9BU1Q1MjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNTMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDUzLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQ4YmY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDUzLmcKQEAgLTAsMCArMSw4IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNTM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IGIgYyA7CitiIDogSUQgOworYyA6IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDU0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1NC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyNGUxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q1NC5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDU0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBiIHwgYyA7CitiIDogSUQgOworYyA6IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitTIDogJyonIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0ZTUzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q2LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogKCBJRCBJTlQgKT8gSUReIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUNy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhYTNiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1N2F1dG9BU1Q3LmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNTdhdXRvQVNUNzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogdj0ndm9pZCdeIElEICc7JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDguZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODBlMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUOC5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IHY9J3ZvaWQnXiAuICc7JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU3YXV0b0FTVDkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2ZhMjNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNTdhdXRvQVNUOS5nCkBAIC0wLDAgKzEsNiBAQAorZ3JhbW1hciB0MDU3YXV0b0FTVDk7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IHY9J3ZvaWQnIC5eICc7JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVC5odG1sIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNULmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmJiODg4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVC5odG1sCkBAIC0wLDAgKzEsNzMyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+Cis8dGl0bGU+dDA1OHJld3JpdGVBU1Q8L3RpdGxlPgorCis8IS0tIEFOVExSIGluY2x1ZGVzIC0tPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi4vLi4vbGliL2FudGxyMy1hbGwuanMiPjwvc2NyaXB0PgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDFMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDFQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyUGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNThyZXdyaXRlQVNUM0xleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNThyZXdyaXRlQVNUM1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDRMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDRQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNThyZXdyaXRlQVNUNkxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNThyZXdyaXRlQVNUNlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDdMZXhlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDdQYXJzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q4UGFyc2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNThyZXdyaXRlQVNUOUxleGVyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InQwNThyZXdyaXRlQVNUOVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDEwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxMFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDExTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxMVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDEyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxMlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDEzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxM1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDE0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxNFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDE1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxNVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDE2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxNlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDE3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxN1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDE4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxOFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDE5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QxOVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDIwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyMFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDIxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyMVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDIyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyMlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDIzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyM1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDI0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyNFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDI1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyNVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDI2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyNlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDI3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyN1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDI4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyOFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDI5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QyOVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDMwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzMFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDMxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzMVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDMyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzMlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDMzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzM1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDM0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzNFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDM1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzNVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDM2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzNlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDM3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzN1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDM4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzOFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDM5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1QzOVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0MFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0MVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0MlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0M1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQ0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0NFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQ1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0NVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQ2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0NlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQ3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0N1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQ4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0OFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDQ5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q0OVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDUwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1MFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDUxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1MVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDUyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1MlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDUzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1M1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDU0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1NFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDU1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1NVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDU2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1NlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDU3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1N1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDU4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1OFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDU5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q1OVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDYwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2MFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDYxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2MVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDYyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2MlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDYzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2M1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDY0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2NFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDY1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2NVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDY2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2NlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDY3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2N1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDY4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2OFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDY5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q2OVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDcwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3MFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDcxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3MVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDcyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3MlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDczTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3M1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDc0TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3NFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDc1TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3NVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDc2TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3NlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDc3TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3N1BhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDc4TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3OFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDc5TGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q3OVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDgwTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q4MFBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDgxTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q4MVBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDgyTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q4MlBhcnNlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0MDU4cmV3cml0ZUFTVDgzTGV4ZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idDA1OHJld3JpdGVBU1Q4M1BhcnNlci5qcyI+PC9zY3JpcHQ+CisKKzwhLS0gSnNVbml0IGluY2x1ZGUgLS0+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIuLi9qc3VuaXQvYXBwL2pzVW5pdENvcmUuanMiPjwvc2NyaXB0PgorCis8IS0tIFRlc3QgQ29kZSAtLT4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAvLyBQYXJzZXIgVGVzdHMKKworICAgIGZ1bmN0aW9uIGV4ZWNQYXJzZXIobGV4ZXJDbHMsIHBhcnNlckNscywgZ3JhbW1hckVudHJ5LCB4aW5wdXQsIGV4cGVjdEVycm9ycykgeworICAgICAgICB2YXIgY3N0cmVhbSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbSh4aW5wdXQpLAorICAgICAgICAgICAgbGV4ZXIgPSBuZXcgKEVuaGFuY2VkUGFyc2VyKGxleGVyQ2xzKSkoY3N0cmVhbSksCisgICAgICAgICAgICB0c3RyZWFtID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKSwKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyAoRW5oYW5jZWRQYXJzZXIocGFyc2VyQ2xzKSkodHN0cmVhbSk7CisgICAgICAgIHZhciByID0gcGFyc2VyW2dyYW1tYXJFbnRyeV0oKTsKKworICAgICAgICBpZiAoIWV4cGVjdEVycm9ycykgeworICAgICAgICAgICAgdGhyb3cgcGFyc2VyLl9lcnJvcnNbMF07CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFyc2VyLl9lcnJvcnMubGVuZ3RoLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXN1bHQgPSAiIjsKKyAgICAgICAgaWYgKHIpIHsKKyAgICAgICAgICAgIGlmIChyLnJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSByLnJlc3VsdAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHIuZ2V0VHJlZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHIuZ2V0VHJlZSgpLnRvU3RyaW5nVHJlZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFleHBlY3RFcnJvcnMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgcGFyc2VyLl9lcnJvcnNdOworICAgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gRW5oYW5jZWRQYXJzZXIoYmFzZSkgeworICAgICAgICB2YXIgVCA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgVC5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICB0aGlzLnRyYWNlcyA9IFtdOworICAgICAgICAgICAgdGhpcy5idWYgPSAiIjsKKyAgICAgICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdOworICAgICAgICB9OworCisgICAgICAgIG9yZy5hbnRsci5sYW5nLmV4dGVuZChULCBiYXNlLCB7CisgICAgICAgICAgICBjYXB0dXJlOiBmdW5jdGlvbih0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5idWYgKz0gdDsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB0cmFjZUluOiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPiIrcnVsZU5hbWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRyYWNlT3V0OiBmdW5jdGlvbihydWxlTmFtZSwgcnVsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhpcy50cmFjZXMucHVzaCgiPCIrcnVsZU5hbWUpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGVtaXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKG1zZykgeworICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBUOworICAgIH0KKworZnVuY3Rpb24gdGVzdERlbGV0ZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMUxleGVyLCB0MDU4cmV3cml0ZUFTVDFQYXJzZXIsICJhIiwgImFiYyAzNCIpOworICAgIGFzc2VydEVxdWFscygiIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2luZ2xlVG9rZW4oKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDJMZXhlciwgdDA1OHJld3JpdGVBU1QyUGFyc2VyLCAiYSIsICJhYmMiKTsKKyAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNpbmdsZVRva2VuVG9OZXdOb2RlKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QzTGV4ZXIsIHQwNThyZXdyaXRlQVNUM1BhcnNlciwgImEiLCAiYWJjIik7CisgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2luZ2xlVG9rZW5Ub05ld05vZGVSb290KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q0TGV4ZXIsIHQwNThyZXdyaXRlQVNUNFBhcnNlciwgImEiLCAiYWJjIik7CisgICAgYXNzZXJ0RXF1YWxzKCIoeCBJTlQpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2luZ2xlVG9rZW5Ub05ld05vZGUyKCkgeworICAgIC8vIEFsbG93IGNyZWF0aW9uIG9mIG5ldyBub2RlcyB3L28gYXJncy4KKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNUxleGVyLCB0MDU4cmV3cml0ZUFTVDVQYXJzZXIsICJhIiwgImFiYyIpOworICAgIGFzc2VydEVxdWFscygiSUQiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTaW5nbGVDaGFyTGl0ZXJhbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNkxleGVyLCB0MDU4cmV3cml0ZUFTVDZQYXJzZXIsICJhIiwgImMiKTsKKyAgICBhc3NlcnRFcXVhbHMoImMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTaW5nbGVTdHJpbmdMaXRlcmFsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q3TGV4ZXIsIHQwNThyZXdyaXRlQVNUN1BhcnNlciwgImEiLCAiaWNrIik7CisgICAgYXNzZXJ0RXF1YWxzKCJpY2siLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTaW5nbGVSdWxlKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q4TGV4ZXIsIHQwNThyZXdyaXRlQVNUOFBhcnNlciwgImEiLCAiYWJjIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSZW9yZGVyVG9rZW5zKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q5TGV4ZXIsIHQwNThyZXdyaXRlQVNUOVBhcnNlciwgImEiLCAiYWJjIDM0Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIzNCBhYmMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSZW9yZGVyVG9rZW5BbmRSdWxlKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QxMExleGVyLCB0MDU4cmV3cml0ZUFTVDEwUGFyc2VyLCAiYSIsICJhYmMgMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjM0IGFiYyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRva2VuVHJlZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMTFMZXhlciwgdDA1OHJld3JpdGVBU1QxMVBhcnNlciwgImEiLCAiYWJjIDM0Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoMzQgYWJjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRva2VuVHJlZUFmdGVyT3RoZXJTdHVmZigpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMTJMZXhlciwgdDA1OHJld3JpdGVBU1QxMlBhcnNlciwgImEiLCAidm9pZCBhYmMgMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoInZvaWQgKDM0IGFiYykiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3ROZXN0ZWRUb2tlblRyZWVXaXRoT3V0ZXJMb29wKCkgeworICAgIC8vIHZlcmlmeSB0aGF0IElEIGFuZCBJTlQgYm90aCBpdGVyYXRlIG92ZXIgb3V0ZXIgaW5kZXggdmFyaWFibGUKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMTNMZXhlciwgdDA1OHJld3JpdGVBU1QxM1BhcnNlciwgImEiLCAiYSAxIGIgMiIpOworICAgIGFzc2VydEVxdWFscygiKERVSCBhIChEVUggMSkpIChEVUggYiAoRFVIIDIpKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE9wdGlvbmFsU2luZ2xlVG9rZW4oKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDE0TGV4ZXIsIHQwNThyZXdyaXRlQVNUMTRQYXJzZXIsICJhIiwgImFiYyIpOworICAgIGFzc2VydEVxdWFscygiYWJjIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0Q2xvc3VyZVNpbmdsZVRva2VuKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QxNUxleGVyLCB0MDU4cmV3cml0ZUFTVDE1UGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFBvc2l0aXZlQ2xvc3VyZVNpbmdsZVRva2VuKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QxNkxleGVyLCB0MDU4cmV3cml0ZUFTVDE2UGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE9wdGlvbmFsU2luZ2xlUnVsZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMTdMZXhlciwgdDA1OHJld3JpdGVBU1QxN1BhcnNlciwgImEiLCAiYWJjIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RDbG9zdXJlU2luZ2xlUnVsZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMThMZXhlciwgdDA1OHJld3JpdGVBU1QxOFBhcnNlciwgImEiLCAiYSBiIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RDbG9zdXJlT2ZMYWJlbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMTlMZXhlciwgdDA1OHJld3JpdGVBU1QxOVBhcnNlciwgImEiLCAiYSBiIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RPcHRpb25hbExhYmVsTm9MaXN0TGFiZWwoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDIwTGV4ZXIsIHQwNThyZXdyaXRlQVNUMjBQYXJzZXIsICJhIiwgImEiKTsKKyAgICBhc3NlcnRFcXVhbHMoImEiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RQb3NpdGl2ZUNsb3N1cmVTaW5nbGVSdWxlKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QyMUxleGVyLCB0MDU4cmV3cml0ZUFTVDIxUGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNpbmdsZVByZWRpY2F0ZVQoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDIyTGV4ZXIsIHQwNThyZXdyaXRlQVNUMjJQYXJzZXIsICJhIiwgImFiYyIpOworICAgIGFzc2VydEVxdWFscygiYWJjIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2luZ2xlUHJlZGljYXRlRigpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMjNMZXhlciwgdDA1OHJld3JpdGVBU1QyM1BhcnNlciwgImEiLCAiYWJjIik7CisgICAgYXNzZXJ0RXF1YWxzKCIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RNdWx0aXBsZVByZWRpY2F0ZSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMjRMZXhlciwgdDA1OHJld3JpdGVBU1QyNFBhcnNlciwgImEiLCAiYSAyIik7CisgICAgYXNzZXJ0RXF1YWxzKCIyIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TXVsdGlwbGVQcmVkaWNhdGVUcmVlcygpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMjVMZXhlciwgdDA1OHJld3JpdGVBU1QyNVBhcnNlciwgImEiLCAiYSAyIik7CisgICAgYXNzZXJ0RXF1YWxzKCIoMiBhKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNpbXBsZVRyZWUoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDI2TGV4ZXIsIHQwNThyZXdyaXRlQVNUMjZQYXJzZXIsICJhIiwgIi0zNCIpOworICAgIGFzc2VydEVxdWFscygiKC0gMzQpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0U2ltcGxlVHJlZTIoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDI3TGV4ZXIsIHQwNThyZXdyaXRlQVNUMjdQYXJzZXIsICJhIiwgIisgMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoIigzNCArKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE5lc3RlZFRyZWVzKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QyOExleGVyLCB0MDU4cmV3cml0ZUFTVDI4UGFyc2VyLCAiYSIsICJ2YXIgYTppbnQ7IGI6ZmxvYXQ7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIodmFyICg6IGEgaW50KSAoOiBiIGZsb2F0KSkiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RJbWFnaW5hcnlUb2tlbkNvcHkoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDI5TGV4ZXIsIHQwNThyZXdyaXRlQVNUMjlQYXJzZXIsICJhIiwgImEsYixjIik7CisgICAgYXNzZXJ0RXF1YWxzKCIoVkFSIGEpIChWQVIgYikgKFZBUiBjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRva2VuVW5yZWZlcmVuY2VkT25MZWZ0QnV0RGVmaW5lZCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMzBMZXhlciwgdDA1OHJld3JpdGVBU1QzMFBhcnNlciwgImEiLCAiYSIpOworICAgIGFzc2VydEVxdWFscygiSUQiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RJbWFnaW5hcnlUb2tlbkNvcHlTZXRUZXh0KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QzMUxleGVyLCB0MDU4cmV3cml0ZUFTVDMxUGFyc2VyLCAiYSIsICJhLGIsYyIpOworICAgIGFzc2VydEVxdWFscygiKHZhciBhKSAodmFyIGIpICh2YXIgYykiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RJbWFnaW5hcnlUb2tlbk5vQ29weUZyb21Ub2tlbigpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMzJMZXhlciwgdDA1OHJld3JpdGVBU1QzMlBhcnNlciwgImEiLCAie2EgYiBjfSIpOworICAgIGFzc2VydEVxdWFscygiKHsgYSBiIGMpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0SW1hZ2luYXJ5VG9rZW5Ob0NvcHlGcm9tVG9rZW5TZXRUZXh0KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QzM0xleGVyLCB0MDU4cmV3cml0ZUFTVDMzUGFyc2VyLCAiYSIsICJ7YSBiIGN9Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoYmxvY2sgYSBiIGMpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TWl4ZWRSZXdyaXRlQW5kQXV0b0FTVCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUMzRMZXhlciwgdDA1OHJld3JpdGVBU1QzNFBhcnNlciwgImEiLCAiYSAxIDIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIigyIDEgYSkiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTdWJydWxlV2l0aFJld3JpdGUoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDM1TGV4ZXIsIHQwNThyZXdyaXRlQVNUMzVQYXJzZXIsICJhIiwgImEgMSAyIDMiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjEgYSAyIDMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTdWJydWxlV2l0aFJld3JpdGUyKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QzNkxleGVyLCB0MDU4cmV3cml0ZUFTVDM2UGFyc2VyLCAiYSIsICJpbnQgYTsgaW50IGI9MzsiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihUWVBFIGludCBhKSAoVFlQRSBpbnQgYiAzKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE5lc3RlZFJld3JpdGVTaHV0c09mZkF1dG9BU1QoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDM3TGV4ZXIsIHQwNThyZXdyaXRlQVNUMzdQYXJzZXIsICJhIiwgImEgYiBjIGQ7IDQyIik7CisgICAgYXNzZXJ0RXF1YWxzKCJkIDQyIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UmV3cml0ZUFjdGlvbnMoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDM4TGV4ZXIsIHQwNThyZXdyaXRlQVNUMzhQYXJzZXIsICJhIiwgIjMiKTsKKyAgICBhc3NlcnRFcXVhbHMoIig5IDMpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UmV3cml0ZUFjdGlvbnMyKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1QzOUxleGVyLCB0MDU4cmV3cml0ZUFTVDM5UGFyc2VyLCAiYSIsICIzIik7CisgICAgYXNzZXJ0RXF1YWxzKCI5IDMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSZWZUb09sZFZhbHVlKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q0MExleGVyLCB0MDU4cmV3cml0ZUFTVDQwUGFyc2VyLCAiYSIsICIzKzQrNSIpOworICAgIGFzc2VydEVxdWFscygiKCsgKCsgMyA0KSA1KSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlcygpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNDFMZXhlciwgdDA1OHJld3JpdGVBU1Q0MVBhcnNlciwgImEiLCAiMyIpOworICAgIGFzc2VydEVxdWFscygiKDMgMykiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RDb3B5U2VtYW50aWNzRm9yUnVsZXMyKCkgeworICAgIC8vIGNvcHkgdHlwZSBhcyBhIHJvb3QgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiAoLi4uKSsgaW4gcmV3cml0ZQorICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q0MkxleGVyLCB0MDU4cmV3cml0ZUFTVDQyUGFyc2VyLCAiYSIsICJpbnQgYSxiLGM7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoaW50IGEpIChpbnQgYikgKGludCBjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlczMoKSB7CisgICAgLy8gY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKyAgICAvLyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDQzTGV4ZXIsIHQwNThyZXdyaXRlQVNUNDNQYXJzZXIsICJhIiwgInB1YmxpYyBpbnQgYSxiLGM7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlczNEb3VibGUoKSB7CisgICAgLy8gY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKyAgICAvLyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDQ0TGV4ZXIsIHQwNThyZXdyaXRlQVNUNDRQYXJzZXIsICJhIiwgInB1YmxpYyBpbnQgYSxiLGM7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKSAoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlczQoKSB7CisgICAgLy8gY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKyAgICAvLyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDQ1TGV4ZXIsIHQwNThyZXdyaXRlQVNUNDVQYXJzZXIsICJhIiwgInB1YmxpYyBpbnQgYSxiLGM7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoaW50IChNT0QgcHVibGljKSBhKSAoaW50IChNT0QgcHVibGljKSBiKSAoaW50IChNT0QgcHVibGljKSBjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlTZW1hbnRpY3NMaXN0cygpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNDZMZXhlciwgdDA1OHJld3JpdGVBU1Q0NlBhcnNlciwgImEiLCAiYSxiLGM7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIgYyBhIGIgYyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlSdWxlTGFiZWwoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDQ3TGV4ZXIsIHQwNThyZXdyaXRlQVNUNDdQYXJzZXIsICJhIiwgImEiKTsKKyAgICBhc3NlcnRFcXVhbHMoImEgYSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdENvcHlSdWxlTGFiZWwyKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q0OExleGVyLCB0MDU4cmV3cml0ZUFTVDQ4UGFyc2VyLCAiYSIsICJhIik7CisgICAgYXNzZXJ0RXF1YWxzKCIoYSBhKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFF1ZXVlaW5nT2ZUb2tlbnMoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDQ5TGV4ZXIsIHQwNThyZXdyaXRlQVNUNDlQYXJzZXIsICJhIiwgImludCBhLGIsYzsiKTsKKyAgICBhc3NlcnRFcXVhbHMoIihpbnQgYSBiIGMpIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0Q29weU9mVG9rZW5zKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q1MExleGVyLCB0MDU4cmV3cml0ZUFTVDUwUGFyc2VyLCAiYSIsICJpbnQgYTsiKTsKKyAgICBhc3NlcnRFcXVhbHMoImludCBhIGludCBhIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0VG9rZW5Db3B5SW5Mb29wKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q1MUxleGVyLCB0MDU4cmV3cml0ZUFTVDUxUGFyc2VyLCAiYSIsICJpbnQgYSxiLGM7Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIoaW50IGEpIChpbnQgYikgKGludCBjKSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFRva2VuQ29weUluTG9vcEFnYWluc3RUd29PdGhlcnMoKSB7CisgICAgLy8gbXVzdCBzbWVhciAnaW50JyBjb3BpZXMgYWNyb3NzIGFzIHJvb3Qgb2YgbXVsdGlwbGUgdHJlZXMKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNTJMZXhlciwgdDA1OHJld3JpdGVBU1Q1MlBhcnNlciwgImEiLCAiaW50IGE6MSxiOjIsYzozOyIpOworICAgIGFzc2VydEVxdWFscygiKGludCBhIDEpIChpbnQgYiAyKSAoaW50IGMgMykiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RMaXN0UmVmZE9uZUF0QVRpbWUoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDUzTGV4ZXIsIHQwNThyZXdyaXRlQVNUNTNQYXJzZXIsICJhIiwgImEgYiBjIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIgYyIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNwbGl0TGlzdFdpdGhMYWJlbHMoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDU0TGV4ZXIsIHQwNThyZXdyaXRlQVNUNTRQYXJzZXIsICJhIiwgImEgYiBjIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIFZBUiBiIGMiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RDb21wbGljYXRlZE1lbGFuZ2UoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDU1TGV4ZXIsIHQwNThyZXdyaXRlQVNUNTVQYXJzZXIsICJhIiwgImEgYSBiIGIgYiBjIGMgYyBkIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGEgYiBiIGIgYyBjIGMgZCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFJ1bGVMYWJlbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNTZMZXhlciwgdDA1OHJld3JpdGVBU1Q1NlBhcnNlciwgImEiLCAiYSIpOworICAgIGFzc2VydEVxdWFscygiYSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdEFtYmlndW91c1J1bGUoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDU3TGV4ZXIsIHQwNThyZXdyaXRlQVNUNTdQYXJzZXIsCisgICAgICAgICAgICAiYSIsICJhYmMgMzQiKTsKKyAgICBhc3NlcnRFcXVhbHMoIjM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0UnVsZUxpc3RMYWJlbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNThMZXhlciwgdDA1OHJld3JpdGVBU1Q1OFBhcnNlciwgImEiLCAiYSBiIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RSdWxlTGlzdExhYmVsMigpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNTlMZXhlciwgdDA1OHJld3JpdGVBU1Q1OVBhcnNlciwgImEiLCAiYSBiIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RPcHRpb25hbCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNjBMZXhlciwgdDA1OHJld3JpdGVBU1Q2MFBhcnNlciwgImEiLCAiYSIpOworICAgIGFzc2VydEVxdWFscygiYSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE9wdGlvbmFsMigpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNjFMZXhlciwgdDA1OHJld3JpdGVBU1Q2MVBhcnNlciwgImEiLCAiYSBiIik7CisgICAgYXNzZXJ0RXF1YWxzKCJhIGIiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RPcHRpb25hbDMoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDYyTGV4ZXIsIHQwNThyZXdyaXRlQVNUNjJQYXJzZXIsICJhIiwgImEgYiIpOworICAgIGFzc2VydEVxdWFscygiYSBiIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0T3B0aW9uYWw0KCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q2M0xleGVyLCB0MDU4cmV3cml0ZUFTVDYzUGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE9wdGlvbmFsNSgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNjRMZXhlciwgdDA1OHJld3JpdGVBU1Q2NFBhcnNlciwgImEiLCAiYSIpOworICAgIGFzc2VydEVxdWFscygiYSIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdEFyYml0cmFyeUV4cHJUeXBlKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q2NUxleGVyLCB0MDU4cmV3cml0ZUFTVDY1UGFyc2VyLCAiYSIsICJhIGIiKTsKKyAgICBhc3NlcnRFcXVhbHMoIiIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdFNldCgpIHsKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNjZMZXhlciwgdDA1OHJld3JpdGVBU1Q2NlBhcnNlciwgImEiLCAiMiBhIDM0IGRlIik7CisgICAgYXNzZXJ0RXF1YWxzKCIyIDM0IGEgZGUiLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RTZXQyKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q2N0xleGVyLCB0MDU4cmV3cml0ZUFTVDY3UGFyc2VyLCAiYSIsICIyIik7CisgICAgYXNzZXJ0RXF1YWxzKCIyIiwgZm91bmQpOworfQorCisvKgorICogQGZhaWxzIC0gdGhlIGdyYW1tYXIgc2hvdWxkbid0IGJlIHZhbGlkLCBidXQgaXMKKyAqCitmdW5jdGlvbiB0ZXN0U2V0V2l0aExhYmVsKCkgeworICAgIHZhciBmb3VuZCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q2OExleGVyLCB0MDU4cmV3cml0ZUFTVDY4UGFyc2VyLCAiYSIsICIyIik7CisgICAgYXNzZXJ0RXF1YWxzKCIyIiwgZm91bmQpOworfQorKi8KKworZnVuY3Rpb24gdGVzdFJld3JpdGVBY3Rpb24oKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDY5TGV4ZXIsIHQwNThyZXdyaXRlQVNUNjlQYXJzZXIsICJyIiwgIjI1Iik7CisgICAgYXNzZXJ0RXF1YWxzKCIyNS4wIiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0T3B0aW9uYWxTdWJydWxlV2l0aG91dFJlYWxFbGVtZW50cygpIHsKKyAgICAvLyBjb3B5IHR5cGUgKmFuZCogbW9kaWZpZXIgZXZlbiB0aG91Z2ggaXQncyBvcHRpb25hbAorICAgIC8vIGZvciBlYWNoIGludm9jYXRpb24gb2YgKC4uLikrIGluIHJld3JpdGUKKyAgICB2YXIgZm91bmQgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNzBMZXhlciwgdDA1OHJld3JpdGVBU1Q3MFBhcnNlciwgIm1vZHVsbyIsICJtb2R1bG8gYWJjICh4IHkpIik7CisgICAgYXNzZXJ0RXF1YWxzKCIobW9kdWxvIGFiYyAoUEFSTVMgeCB5KSkiLCBmb3VuZCk7Cit9CisKKy8vLy8gQyBBIFIgRCBJIE4gQSBMIEkgVCBZICBJIFMgUyBVIEUgUworCitmdW5jdGlvbiB0ZXN0Q2FyZGluYWxpdHkoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDcxTGV4ZXIsIHQwNThyZXdyaXRlQVNUNzFQYXJzZXIsICJhIiwgImEgYiAzIDQgNSIpOworICAgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgInRva2VuIElEIik7CisgICAgfQorfQorCisKK2Z1bmN0aW9uIHRlc3RDYXJkaW5hbGl0eTIoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDcyTGV4ZXIsIHQwNThyZXdyaXRlQVNUNzJQYXJzZXIsICJhIiwgImEgYiIpOworICAgICAgICBmYWlsKCk7CisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgInRva2VuIElEIik7CisgICAgfQorfQorCitmdW5jdGlvbiB0ZXN0Q2FyZGluYWxpdHkzKCkgeworICAgIHRyeSB7CisgICAgICAgIGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q3M0xleGVyLCB0MDU4cmV3cml0ZUFTVDczUGFyc2VyLCAiYSIsICIzIik7CisgICAgICAgIGZhaWwoKTsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAidG9rZW4gSUQiKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RMb29wQ2FyZGluYWxpdHkoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDc0TGV4ZXIsIHQwNThyZXdyaXRlQVNUNzRQYXJzZXIsICJhIiwgIjMiKTsKKyAgICAgICAgZmFpbCgpOworICAgIH0gY2F0Y2goZSkgeworICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbik7CisgICAgfQorfQorCitmdW5jdGlvbiB0ZXN0V2lsZGNhcmQoKSB7CisgICAgdmFyIGZvdW5kID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDc1TGV4ZXIsIHQwNThyZXdyaXRlQVNUNzVQYXJzZXIsICJhIiwgImFiYyAzNCIpOworICAgIGFzc2VydEVxdWFscygiMzRcbiIsIGZvdW5kKTsKK30KKworLy8gRSBSIFIgTyBSIFMKKworZnVuY3Rpb24gdGVzdEV4dHJhVG9rZW5JblNpbXBsZURlY2woKSB7CisgICAgdmFyIHJldHZhbCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q3NkxleGVyLCB0MDU4cmV3cml0ZUFTVDc2UGFyc2VyLCAiZGVjbCIsICJpbnQgMzQgeD0xOyIsCisgICAgICAgICAgICB0cnVlKTsKKyAgICB2YXIgZm91bmQgPSByZXR2YWxbMF0sIGVycm9ycyA9IHJldHZhbFsxXTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyhbImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgJzM0JyBleHBlY3RpbmcgSUQiXSwKKyAgICAgICAgICAgIGVycm9ycyk7CisgICAgYXNzZXJ0RXF1YWxzKCIoRVhQUiBpbnQgeCAxKSIsIGZvdW5kKSAvLyB0cmVlIGdldHMgY29ycmVjdCB4IGFuZCAxIHRva2VucworfQorCisKK2Z1bmN0aW9uIHRlc3RNaXNzaW5nSURJblNpbXBsZURlY2woKSB7CisgICAgdmFyIHJldHZhbCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q3N0xleGVyLCB0MDU4cmV3cml0ZUFTVDc3UGFyc2VyLCAiZGVjbCIsICJpbnQgPTE7IiwKKyAgICAgICAgICAgIHRydWUpOworICAgIHZhciBmb3VuZCA9IHJldHZhbFswXSwgZXJyb3JzID0gcmV0dmFsWzFdOworICAgIGFzc2VydEFycmF5RXF1YWxzKFsibGluZSAxOjQgbWlzc2luZyBJRCBhdCAnPSciXSwgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoIihFWFBSIGludCA8bWlzc2luZyBJRD4gMSkiLCBmb3VuZCkgLy8gdHJlZSBnZXRzIGludmVudGVkIElEIHRva2VuCit9CisKK2Z1bmN0aW9uIHRlc3RNaXNzaW5nU2V0SW5TaW1wbGVEZWNsKCkgeworICAgIHZhciByZXR2YWwgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNzhMZXhlciwgdDA1OHJld3JpdGVBU1Q3OFBhcnNlciwgImRlY2wiLCAieD0xOyIsCisgICAgICAgICAgICB0cnVlKTsKKyAgICB2YXIgZm91bmQgPSByZXR2YWxbMF0sIGVycm9ycyA9IHJldHZhbFsxXTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyhbImxpbmUgMTowIG1pc21hdGNoZWQgaW5wdXQgJ3gnIGV4cGVjdGluZyBzZXQgbnVsbCJdLAorICAgICAgICAgICAgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoIihFWFBSIDxlcnJvcjogeD4geCAxKSIsIGZvdW5kKSAvLyB0cmVlIGdldHMgaW52ZW50ZWQgSUQgdG9rZW4KK30KKworZnVuY3Rpb24gdGVzdE1pc3NpbmdUb2tlbkdpdmVzRXJyb3JOb2RlKCkgeworICAgIHZhciByZXR2YWwgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUNzlMZXhlciwgdDA1OHJld3JpdGVBU1Q3OVBhcnNlciwgImEiLCAiYWJjIiwKKyAgICAgICAgICAgIHRydWUpOworICAgIHZhciBmb3VuZCA9IHJldHZhbFswXSwgZXJyb3JzID0gcmV0dmFsWzFdOworICAgIGFzc2VydEFycmF5RXF1YWxzKFsibGluZSAwOi0xIG1pc3NpbmcgSU5UIGF0ICc8RU9GPiciXSwgZXJyb3JzKTsKKyAgICAvLyBkb2Vzbid0IGRvIGluLWxpbmUgcmVjb3ZlcnkgZm9yIHNldHMgKHlldD8pOworICAgIGFzc2VydEVxdWFscygiYWJjIDxtaXNzaW5nIElOVD4iLCBmb3VuZCk7Cit9CisKK2Z1bmN0aW9uIHRlc3RFeHRyYVRva2VuR2l2ZXNFcnJvck5vZGUoKSB7CisgICAgdmFyIHJldHZhbCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q4MExleGVyLCB0MDU4cmV3cml0ZUFTVDgwUGFyc2VyLCAiYSIsICJhYmMgaWNrIDM0IiwKKyAgICAgICAgICAgIHRydWUpOworICAgIHZhciBmb3VuZCA9IHJldHZhbFswXSwgZXJyb3JzID0gcmV0dmFsWzFdOworICAgIGFzc2VydEFycmF5RXF1YWxzKFsibGluZSAxOjQgZXh0cmFuZW91cyBpbnB1dCAnaWNrJyBleHBlY3RpbmcgSU5UIl0sCisgICAgICAgICAgICBlcnJvcnMpOworICAgIGFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpOworfQorCitmdW5jdGlvbiB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZSgpIHsKKyAgICB2YXIgcmV0dmFsID0gZXhlY1BhcnNlcih0MDU4cmV3cml0ZUFTVDgxTGV4ZXIsIHQwNThyZXdyaXRlQVNUODFQYXJzZXIsICJhIiwgIjM0IiwgdHJ1ZSk7CisgICAgdmFyIGZvdW5kID0gcmV0dmFsWzBdLCBlcnJvcnMgPSByZXR2YWxbMV07CisgICAgYXNzZXJ0QXJyYXlFcXVhbHMoWyJsaW5lIDE6MCBtaXNzaW5nIElEIGF0ICczNCciXSwgZXJyb3JzKTsKKyAgICBhc3NlcnRFcXVhbHMoIjxtaXNzaW5nIElEPiAzNCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE1pc3NpbmdGaXJzdFRva2VuR2l2ZXNFcnJvck5vZGUyKCkgeworICAgIHZhciByZXR2YWwgPSBleGVjUGFyc2VyKHQwNThyZXdyaXRlQVNUODJMZXhlciwgdDA1OHJld3JpdGVBU1Q4MlBhcnNlciwgImEiLCAiMzQiLCB0cnVlKTsKKyAgICB2YXIgZm91bmQgPSByZXR2YWxbMF0sIGVycm9ycyA9IHJldHZhbFsxXTsKKyAgICAvLyBmaW5kcyBhbiBlcnJvciBhdCB0aGUgZmlyc3QgdG9rZW4sIDM0LCBhbmQgcmUtc3luY3MuCisgICAgLy8gcmUtc3luY2hyb25pemluZyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gYmVjYXVzZSAzNCBmb2xsb3dzCisgICAgLy8gcmVmIHRvIHJ1bGUgYiAoc3RhcnQgb2YgYykuIEl0IHRoZW4gbWF0Y2hlcyAzNCBpbiBjLgorICAgIGFzc2VydEFycmF5RXF1YWxzKFsibGluZSAxOjAgbWlzbWF0Y2hlZCBpbnB1dCAnMzQnIGV4cGVjdGluZyBJRCJdLCBlcnJvcnMpOworICAgIGFzc2VydEVxdWFscygiPG1pc21hdGNoZWQgdG9rZW46IFtAMCwwOjE9JzM0Jyw8NT4sMTowXSwgcmVzeW5jPTM0PiAzNCIsIGZvdW5kKTsKK30KKworZnVuY3Rpb24gdGVzdE5vVmlhYmxlQWx0R2l2ZXNFcnJvck5vZGUoKSB7CisgICAgdmFyIHJldHZhbCA9IGV4ZWNQYXJzZXIodDA1OHJld3JpdGVBU1Q4M0xleGVyLCB0MDU4cmV3cml0ZUFTVDgzUGFyc2VyLCAiYSIsICIqIiwgdHJ1ZSk7CisgICAgdmFyIGZvdW5kID0gcmV0dmFsWzBdLCBlcnJvcnMgPSByZXR2YWxbMV07CisgICAgLy8gZmluZHMgYW4gZXJyb3IgYXQgdGhlIGZpcnN0IHRva2VuLCAzNCwgYW5kIHJlLXN5bmNzLgorICAgIC8vIHJlLXN5bmNocm9uaXppbmcgZG9lcyBub3QgY29uc3VtZSBhIHRva2VuIGJlY2F1c2UgMzQgZm9sbG93cworICAgIC8vIHJlZiB0byBydWxlIGIgKHN0YXJ0IG9mIGMpLiBJdCB0aGVuIG1hdGNoZXMgMzQgaW4gYy4KKyAgICBhc3NlcnRBcnJheUVxdWFscyhbImxpbmUgMTowIG5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBpbnB1dCAnKiciXSwKKyAgICAgICAgICAgIGVycm9ycyk7CisgICAgYXNzZXJ0RXF1YWxzKCI8dW5leHBlY3RlZDogW0AwLDA6MD0nKicsPDY+LDE6MF0sIHJlc3luYz0qPiIsCisgICAgICAgICAgICBmb3VuZCk7Cit9Cis8L3NjcmlwdD4KKworPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPnQwNThyZXdyaXRlQVNUPC9oMT4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxYzM3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxLmcKQEAgLTAsMCArMSw2IEBACitncmFtbWFyIHQwNThyZXdyaXRlQVNUMTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgSU5UIC0+IDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDEwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxMC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1ZmNmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxMC5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMTA7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IGIgSU5UIC0+IElOVCBiOworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDExLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxMS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjYmYwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxMS5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMTE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIElOVCAtPiBeKElOVCBJRCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxMi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzNmMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTIuZwpAQCAtMCwwICsxLDcgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDEyOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiAndm9pZCcgSUQgSU5UIC0+ICd2b2lkJyBeKElOVCBJRCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxMy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMjJjOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTMuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDEzOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7RFVIO30KK2EgOiBJRCBJTlQgSUQgSU5UIC0+IF4oIERVSCBJRCBeKCBEVUggSU5UKSApKyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxNC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45N2M3NmEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTQuZwpAQCAtMCwwICsxLDcgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDE0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCAtPiBJRD8gOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDE1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWM1NDFlYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDE1LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QxNTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgSUQgLT4gSUQqIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDE2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxNi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlMWQyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxNi5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMTY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIElEIC0+IElEKyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxNy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDkzNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTcuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDE3Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBiIC0+IGI/OworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDE4LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxOC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4NGQ3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxOC5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMTg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IGIgYiAtPiBiKjsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QxOS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYjgzOTA2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMTkuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDE5Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiB4Kz1iIHgrPWIgLT4gJHgqOworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmZiYjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMi5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgLT4gSUQ7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyMC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGYwNzMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjAuZwpAQCAtMCwwICsxLDcgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDIwOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiAoeD1JRCk/IC0+ICR4PzsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDIxLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyMS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2ZGRkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyMS5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMjE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IGIgYiAtPiBiKzsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyMi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44M2JhODFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjIuZwpAQCAtMCwwICsxLDcgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDIyOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCAtPiB7dHJ1ZX0/IElEIC0+IDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDIzLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyMy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmYjczODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyMy5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMjM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIC0+IHtmYWxzZX0/IElEIC0+IDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4YjJjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyNC5nCkBAIC0wLDAgKzEsMTAgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDI0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCBJTlQgLT4ge2ZhbHNlfT8gSUQKKyAgICAgICAgICAgLT4ge3RydWV9PyBJTlQKKyAgICAgICAgICAgLT4gCisgIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI1LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyNS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2Y2I4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyNS5nCkBAIC0wLDAgKzEsMTAgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDI1Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCBJTlQgLT4ge2ZhbHNlfT8gXihJRCBJTlQpCisgICAgICAgICAgIC0+IHt0cnVlfT8gXihJTlQgSUQpCisgICAgICAgICAgIC0+IElECisgIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyNi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlOThiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyNi5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMjY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IG9wIElOVCAtPiBeKG9wIElOVCk7CitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjc3OTVkNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI3LmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QyNzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogb3AgSU5UIC0+IF4oSU5UIG9wKTsKK29wIDogJysnfCctJyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QyOC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YTZlYmZkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjguZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDI4Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiAndmFyJyAoSUQgJzonIHR5cGUgJzsnKSsgLT4gXigndmFyJyBeKCc6JyBJRCB0eXBlKSspIDsKK3R5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMjkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI5LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmI4Yjg0YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDI5LmcKQEAgLTAsMCArMSw5IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QyOTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge1ZBUjt9CithIDogSUQgKCcsJyBJRCkqLT4gXihWQVIgSUQpKyA7Cit0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYTE3Y2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMy5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgLT4gSURbIngiXTsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzMC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5YjMwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzMC5nCkBAIC0wLDAgKzEsOSBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMzA7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtWQVI7fQorYSA6IGIgLT4gSUQgOworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMxLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzMS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExM2NjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzMS5nCkBAIC0wLDAgKzEsOSBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMzE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtWQVI7fQorYSA6IElEICgnLCcgSUQpKi0+IF4oVkFSWyJ2YXIiXSBJRCkrIDsKK3R5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2MzYzNhYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMyLmcKQEAgLTAsMCArMSw5IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QzMjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiBsYz0neycgSUQrICd9JyAtPiBeKEJMT0NLWyRsY10gSUQrKSA7Cit0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDMzLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzMy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NzU0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzMy5nCkBAIC0wLDAgKzEsOSBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMzM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtCTE9DSzt9CithIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGMsImJsb2NrIl0gSUQrKSA7Cit0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDM0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzNC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmYzcyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzNC5nCkBAIC0wLDAgKzEsMTEgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDM0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IGIgYl4gOyAvLyAybmQgYiBtYXRjaGVzIG9ubHkgYW4gSU5UOyBjYW4gbWFrZSBpdCByb290CitiIDogSUQgSU5UIC0+IElOVCBJRAorICB8IElOVAorICA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzNS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzUuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMzI1ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzUuZwpAQCAtMCwwICsxLDEwIEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QzNTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiBiIGIgOworYiA6IChJRCBJTlQgLT4gSU5UIElEIHwgSU5UIElOVCAtPiBJTlQrICkKKyAgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDM2LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWU1Y2ExNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDM2LmcKQEAgLTAsMCArMSwxNCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUMzY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtUWVBFO30KK2EgOiBiIGIgOworYiA6ICdpbnQnCisgICAgKCBJRCAtPiBeKFRZUEUgJ2ludCcgSUQpCisgICAgfCBJRCAnPScgSU5UIC0+IF4oVFlQRSAnaW50JyBJRCBJTlQpCisgICAgKQorICAgICc7JworICA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzNy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNDc1ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzcuZwpAQCAtMCwwICsxLDExIEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QzNzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiBiIGIgOworYiA6IElEICggSUQgKGxhc3Q9SUQgLT4gJGxhc3QpKyApICc7JyAvLyBnZXQgbGFzdCBJRAorICB8IElOVCAvLyBzaG91bGQgc3RpbGwgZ2V0IGF1dG8gQVNUIGNvbnN0cnVjdGlvbgorICA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1QzOC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wODEyOGNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzguZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDM4Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBhdG9tIC0+IF4oe3RoaXMuYWRhcHRvci5jcmVhdGUoSU5ULCI5Iil9IGF0b20pIDsKK2F0b20gOiBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUMzkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDM5LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGUwM2YwOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDM5LmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1QzOTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogYXRvbSAtPiB7dGhpcy5hZGFwdG9yLmNyZWF0ZShJTlQsIjkiKX0gYXRvbSA7CithdG9tIDogSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjhhMzhhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNC5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNDsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgLT4gXihJRFsieCJdIElOVCk7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0MC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNjM0ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDAuZwpAQCAtMCwwICsxLDkgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDQwOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IChhdG9tIC0+IGF0b20pIChvcD0nKycgcj1hdG9tIC0+IF4oJG9wICRhICRyKSApKiA7CithdG9tIDogSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQxLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0MS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwMTY5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0MS5nCkBAIC0wLDAgKzEsOSBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNDE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtCTE9DSzt9CithIDogYXRvbSAtPiBeKGF0b20gYXRvbSkgOyAvLyBOT1QgQ1lDTEUhIChkdXAgYXRvbSkKK2F0b20gOiBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjdhMzhjYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQyLmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q0MjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBJRCkrIDsKK3R5cGUgOiAnaW50JyA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0My5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMWRhZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDMuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDQzOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBtb2RpZmllcj8gdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBtb2RpZmllcj8gSUQpKyA7Cit0eXBlIDogJ2ludCcgOworbW9kaWZpZXIgOiAncHVibGljJyA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0NC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzA0MGYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDQuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDQ0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBtb2RpZmllcj8gdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBtb2RpZmllcj8gSUQpKyBeKHR5cGUgbW9kaWZpZXI/IElEKSsgOwordHlwZSA6ICdpbnQnIDsKK21vZGlmaWVyIDogJ3B1YmxpYycgOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQ1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRkY2ViNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQ1LmcKQEAgLTAsMCArMSw5IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q0NTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge01PRDt9CithIDogbW9kaWZpZXI/IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgXihNT0QgbW9kaWZpZXIpPyBJRCkrIDsKK3R5cGUgOiAnaW50JyA7Cittb2RpZmllciA6ICdwdWJsaWMnIDsKK0lEIDogJ2EnLi4neicrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDQ2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0Ni5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4Y2UzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0Ni5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNDY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtNT0Q7fQorYSA6IElEICgnLCcgSUQpKiAnOycgLT4gSUQrIElEKyA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0Ny5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDcuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NmY1NDVhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDcuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDQ3Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IHg9YiAtPiAkeCAkeDsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0OC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wODljYTQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDguZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDQ4Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IHg9YiAtPiBeKCR4ICR4KTsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q0OS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NGFkMzEyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNDkuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDQ5Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiAnaW50JyBJRCAoJywnIElEKSogJzsnIC0+IF4oJ2ludCcgSUQrKSA7CitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlMzY3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q1Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCAtPiBJRFsgXTsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDUwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1MC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5ZTI2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1MC5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNTA7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6ICdpbnQnIElEICc7JyAtPiAnaW50JyBJRCAnaW50JyBJRCA7CitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNTEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDUxLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDI2MWM4OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDUxLmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q1MTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogJ2ludCcgSUQgKCcsJyBJRCkqICc7JyAtPiBeKCdpbnQnIElEKSsgOworb3AgOiAnKyd8Jy0nIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDUyLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1Mi5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwYTU2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1Mi5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNTI7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6ICdpbnQnIElEICc6JyBJTlQgKCcsJyBJRCAnOicgSU5UKSogJzsnIC0+IF4oJ2ludCcgSUQgSU5UKSsgOworb3AgOiAnKyd8Jy0nIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDUzLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1My5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwY2IxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1My5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNTM7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEKyAtPiBJRCBJRCBJRCA7IC8vIHdvcmtzIGlmIDMgaW5wdXQgSURzCitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNTQuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU0LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmRmNzFlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU0LmcKQEAgLTAsMCArMSw5IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q1NDsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge1ZBUjt9CithIDogZmlyc3Q9SUQgb3RoZXJzKz1JRCogLT4gJGZpcnN0IFZBUiAkb3RoZXJzKyA7CitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNTUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAyOWY5MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU1LmcKQEAgLTAsMCArMSwxMSBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNTU7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtCTE9DSzt9CithIDogQSBBIGI9QiBCIGI9QiBjKz1DIEMgYys9QyBEIHtzPSRELnRleHR9IC0+IEErIEIrIEMrIEQgOwordHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CitBIDogJ2EnIDsKK0IgOiAnYicgOworQyA6ICdjJyA7CitEIDogJ2QnIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1Ni5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMDQzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1Ni5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNTY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtCTE9DSzt9CithIDogeD1iIC0+ICR4OworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU3LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1Ny5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzMGE4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1Ny5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNTc7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIGEgLT4gYSB8IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQ6ICcwJy4uJzknKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q1OC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNTguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTBmODY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNTguZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDU4Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IHgrPWIgeCs9YiAtPiAkeCs7CitiIDogSUQgOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNTkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU5LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGU3NzdhNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDU5LmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q1OTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiB4Kz1iIHgrPWIgLT4gJHggJHgqOworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZjA5ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNi5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogJ2MnIC0+ICdjJzsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2MC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkYWI3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2MC5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNjA7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtCTE9DSzt9CithIDogeD1iICh5PWIpPyAtPiAkeCAkeT87CitiIDogSUQgOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjEuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYxLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWE0OTA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYxLmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q2MTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiB4PUlEICh5PWIpPyAtPiAkeCAkeT87CitiIDogSUQgOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmFlOGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDYyLmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q2MjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiB4PUlEICh5PWIpPyAtPiAoJHggJHkpPzsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2My5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZWJmN2FmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjMuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDYzOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IHgrPUlEICh5PWIpPyAtPiAoJHggJHkpPzsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2NC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjQuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTgwZjYyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjQuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDY0Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IElEIC0+IElEPyA7IC8vIG1hdGNoIGFuIElEIHRvIG9wdGlvbmFsIElECitiIDogSUQgOworSUQgOiAnYScuLid6JysgOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDY1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmZjYWJiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDY1LmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q2NTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0JMT0NLO30KK2EgOiB4Kz1iIHgrPWIgLT4ge25ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUobnVsbCl9OworYiA6IElEIDsKK0lEIDogJ2EnLi4neicrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDY2LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2Ni5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3YTM3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2Ni5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNjY7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fSAKK2E6IChJTlR8SUQpKyAtPiBJTlQrIElEKyA7CitJTlQ6ICcwJy4uJzknKzsKK0lEIDogJ2EnLi4neicrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjcuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDY3LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjc1ZjMyMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDY3LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q2NzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9IAorYTogKElOVHxJRCkgLT4gSU5UPyBJRD8gOworSU5UOiAnMCcuLic5Jys7CitJRCA6ICdhJy4uJ3onKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDY4LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2OC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxZjhiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2OC5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNjg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fSAKK2EgOiB4PShJTlR8SUQpIC0+ICR4IDsKK0lOVDogJzAnLi4nOScrOworSUQgOiAnYScuLid6Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q2OS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjkuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWYwMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNjkuZwpAQCAtMCwwICsxLDkgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDY5Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7IEZMT0FUOyB9CityCisgICAgOiBJTlQgLT4ge25ldyBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWUobmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKEZMT0FULCAkSU5ULnRleHQrIi4wIikpfSAKKyAgICA7IAorSU5UIDogJzAnLi4nOScrOyAKK1dTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNy5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2N2RkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q3Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiAnaWNrJyAtPiAnaWNrJzsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDcwLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3MC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4YWVkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3MC5nCkBAIC0wLDAgKzEsOSBAQAorZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDcwOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30gCit0b2tlbnMge1BBUk1TO30gCittb2R1bG8gCisgOiAnbW9kdWxvJyBJRCAoJygnIHBhcm1zKyAnKScpPyAtPiBeKCdtb2R1bG8nIElEIF4oUEFSTVMgcGFybXMrKT8pIAorIDsgCitwYXJtcyA6ICcjJ3xJRDsgCitJRCA6ICgnYScuLid6JyB8ICdBJy4uJ1onKSs7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3MS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzEuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZjY2Njc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzEuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDcxOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7QkxPQ0s7fQorYSA6IElEIElEIElOVCBJTlQgSU5UIC0+IChJRCBJTlQpKzsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsgCitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3Mi5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzIuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTUxYWZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzIuZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDcyOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCsgLT4gSUQgSUQgSUQgOyAvLyBvbmx5IDIgaW5wdXQgSURzCitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzMuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDczLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmNjN2YxMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDczLmcKQEAgLTAsMCArMSw4IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q3MzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQ/IElOVCAtPiBJRCBJTlQgOworb3AgOiAnKyd8Jy0nIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc0LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3NC5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2NzY1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3NC5nCkBAIC0wLDAgKzEsOCBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNzQ7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEPyBJTlQgLT4gSUQrIElOVCA7CitvcCA6ICcrJ3wnLScgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzUuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc1LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzg1ODFlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc1LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q3NTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgYz0uIC0+ICRjOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzYuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc2LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTY3ZmI3YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc2LmcKQEAgLTAsMCArMSw5IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q3NjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9Cit0b2tlbnMge0VYUFI7fQorZGVjbCA6IHR5cGUgSUQgJz0nIElOVCAnOycgLT4gXihFWFBSIHR5cGUgSUQgSU5UKSA7Cit0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc3LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3Ny5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlZmQ5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3Ny5nCkBAIC0wLDAgKzEsOSBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUNzc7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQordG9rZW5zIHtFWFBSO30KK2RlY2wgOiB0eXBlIElEICc9JyBJTlQgJzsnIC0+IF4oRVhQUiB0eXBlIElEIElOVCkgOwordHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q3OC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzguZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjYwNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzguZwpAQCAtMCwwICsxLDkgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDc4Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK3Rva2VucyB7RVhQUjt9CitkZWNsIDogdHlwZSBJRCAnPScgSU5UICc7JyAtPiBeKEVYUFIgdHlwZSBJRCBJTlQpIDsKK3R5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUNzkuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc5LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTI1ZWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDc5LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q3OTsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogSUQgSU5UIC0+IElEIElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q4LmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q4LmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzNhNmZmZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDguZwpAQCAtMCwwICsxLDggQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDg7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IGIgLT4gYjsKK2IgOiBJRCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q4MC5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUODAuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmU1MGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUODAuZwpAQCAtMCwwICsxLDkgQEAKKworZ3JhbW1hciB0MDU4cmV3cml0ZUFTVDgwOworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBiIGMgLT4gYiBjOworYiA6IElEIC0+IElEIDsKK2MgOiBJTlQgLT4gSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK0lOVCA6ICcwJy4uJzknKzsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDgxLmcgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q4MS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZWUxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q4MS5nCkBAIC0wLDAgKzEsNyBAQAorCitncmFtbWFyIHQwNThyZXdyaXRlQVNUODE7CitvcHRpb25zIHtsYW5ndWFnZT1KYXZhU2NyaXB0O291dHB1dD1BU1Q7fQorYSA6IElEIElOVCAtPiBJRCBJTlQgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUODIuZyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDgyLmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjBkNDVmMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL0phdmFTY3JpcHQvdGVzdHMvZnVuY3Rpb25hbC90MDU4cmV3cml0ZUFTVDgyLmcKQEAgLTAsMCArMSw5IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q4MjsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogYiBjIC0+IGIgYzsKK2IgOiBJRCAtPiBJRCA7CitjIDogSU5UIC0+IElOVCA7CitJRCA6ICdhJy4uJ3onKyA7CitJTlQgOiAnMCcuLic5Jys7CitXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q4My5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUODMuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzU0YjdjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUODMuZwpAQCAtMCwwICsxLDEwIEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q4MzsKK29wdGlvbnMge2xhbmd1YWdlPUphdmFTY3JpcHQ7b3V0cHV0PUFTVDt9CithIDogYiAtPiBiIHwgYyAtPiBjOworYiA6IElEIC0+IElEIDsKK2MgOiBJTlQgLT4gSU5UIDsKK0lEIDogJ2EnLi4neicrIDsKK1MgOiAnKicgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUOS5nIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90ZXN0cy9mdW5jdGlvbmFsL3QwNThyZXdyaXRlQVNUOS5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxM2ZjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3Rlc3RzL2Z1bmN0aW9uYWwvdDA1OHJld3JpdGVBU1Q5LmcKQEAgLTAsMCArMSw3IEBACisKK2dyYW1tYXIgdDA1OHJld3JpdGVBU1Q5Oworb3B0aW9ucyB7bGFuZ3VhZ2U9SmF2YVNjcmlwdDtvdXRwdXQ9QVNUO30KK2EgOiBJRCBJTlQgLT4gSU5UIElEOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrOworV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90aGlyZC9hbnRjb250cmliLnByb3BlcnRpZXMgYi9hbnRsci0zLjQvcnVudGltZS9KYXZhU2NyaXB0L3RoaXJkL2FudGNvbnRyaWIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzZjOWQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvSmF2YVNjcmlwdC90aGlyZC9hbnRjb250cmliLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorYW50Y2xpcHNlPW5ldC5zZi5hbnRjb250cmliLmFudGNsaXBzZS5DbGFzc1BhdGhUYXNrCithbnRzZXJ2ZXI9bmV0LnNmLmFudGNvbnRyaWIuYW50c2VydmVyLnNlcnZlci5TZXJ2ZXJUYXNrCityZW1vdGVhbnQ9bmV0LnNmLmFudGNvbnRyaWIuYW50c2VydmVyLmNsaWVudC5DbGllbnRUYXNrCit2ZXJpZnlkZXNpZ249bmV0LnNmLmFudGNvbnRyaWIuZGVzaWduLlZlcmlmeURlc2lnbgoraW5pZmlsZT1uZXQuc2YuYW50Y29udHJpYi5pbmlmaWxlLkluaUZpbGVUYXNrCitpZj1uZXQuc2YuYW50Y29udHJpYi5sb2dpYy5JZlRhc2sKK2ZvcmVhY2g9bmV0LnNmLmFudGNvbnRyaWIubG9naWMuRm9yRWFjaAorZm9yPW5ldC5zZi5hbnRjb250cmliLmxvZ2ljLkZvclRhc2sKK3Rocm93PW5ldC5zZi5hbnRjb250cmliLmxvZ2ljLlRocm93Cit0cnljYXRjaD1uZXQuc2YuYW50Y29udHJpYi5sb2dpYy5UcnlDYXRjaFRhc2sKK3N3aXRjaD1uZXQuc2YuYW50Y29udHJpYi5sb2dpYy5Td2l0Y2gKK291dG9mZGF0ZT1uZXQuc2YuYW50Y29udHJpYi5sb2dpYy5PdXRPZkRhdGUKK3J1bnRhcmdldD1uZXQuc2YuYW50Y29udHJpYi5sb2dpYy5SdW5UYXJnZXRUYXNrCit0aW1lc3RhbXBzZWxlY3Rvcj1uZXQuc2YuYW50Y29udHJpYi5sb2dpYy5UaW1lc3RhbXBTZWxlY3RvcgorYW50Y2FsbGJhY2s9bmV0LnNmLmFudGNvbnRyaWIubG9naWMuQW50Q2FsbEJhY2sKK2FudGZldGNoPW5ldC5zZi5hbnRjb250cmliLmxvZ2ljLkFudEZldGNoCithc3NlcnQ9bmV0LnNmLmFudGNvbnRyaWIubG9naWMuQXNzZXJ0CityZWxlbnRsZXNzPW5ldC5zZi5hbnRjb250cmliLmxvZ2ljLlJlbGVudGxlc3MKK21hdGg9bmV0LnNmLmFudGNvbnRyaWIubWF0aC5NYXRoVGFzaworcG9zdD1uZXQuc2YuYW50Y29udHJpYi5uZXQuUG9zdFRhc2sKK3N0b3B3YXRjaD1uZXQuc2YuYW50Y29udHJpYi5wZXJmLlN0b3BXYXRjaFRhc2sKK29zZmFtaWx5PW5ldC5zZi5hbnRjb250cmliLnBsYXRmb3JtLk9zRmFtaWx5CitzaGVsbHNjcmlwdD1uZXQuc2YuYW50Y29udHJpYi5wbGF0Zm9ybS5TaGVsbFNjcmlwdFRhc2sKK2ZvcmdldD1uZXQuc2YuYW50Y29udHJpYi5wcm9jZXNzLkZvcmdldFRhc2sKK2xpbWl0PW5ldC5zZi5hbnRjb250cmliLnByb2Nlc3MuTGltaXQKK3Byb3BlcnR5Y29weT1uZXQuc2YuYW50Y29udHJpYi5wcm9wZXJ0eS5Qcm9wZXJ0eUNvcHkKK3BhdGh0b2ZpbGVzZXQ9bmV0LnNmLmFudGNvbnRyaWIucHJvcGVydHkuUGF0aFRvRmlsZVNldAorcHJvcGVydHlzZWxlY3Rvcj1uZXQuc2YuYW50Y29udHJpYi5wcm9wZXJ0eS5Qcm9wZXJ0eVNlbGVjdG9yCitwcm9wZXJ0eXJlZ2V4PW5ldC5zZi5hbnRjb250cmliLnByb3BlcnR5LlJlZ2V4VGFzaworc29ydGxpc3Q9bmV0LnNmLmFudGNvbnRyaWIucHJvcGVydHkuU29ydExpc3QKK3VybGVuY29kZT1uZXQuc2YuYW50Y29udHJpYi5wcm9wZXJ0eS5VUkxFbmNvZGVUYXNrCit2YXI9bmV0LnNmLmFudGNvbnRyaWIucHJvcGVydHkuVmFyaWFibGUKK2NvbXBpbGV3aXRod2FsbHM9bmV0LnNmLmFudGNvbnRyaWIud2FsbHMuQ29tcGlsZVdpdGhXYWxscwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrLnppcCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQwNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0FOVExSIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvQU5UTFIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjdjMWQzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0FOVExSCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzFlNzgzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJERkEuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuU291cmNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisKKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVFeGNlcHRpb24uaD4KKworI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPgorCisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKworI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VNYXBFbGVtZW50LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQmFzZU1hcEVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTEwMGFjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1NCBAQAorLy8KKy8vICBBTlRMUkJhc2VNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTGlua0Jhc2UuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VNYXBFbGVtZW50IDogQU5UTFJMaW5rQmFzZSB7CisgICAgTlNOdW1iZXIgKmluZGV4OworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEluZGV4LCBzZXR0ZXI9c2V0SW5kZXg6KSBOU051bWJlciAqaW5kZXg7CisKKysgKGlkKSBuZXdBTlRMUkJhc2VNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSQmFzZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU051bWJlciAqKWdldEluZGV4OworLSAodm9pZClzZXRJbmRleDooTlNOdW1iZXIgKilhbklkeDsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCYXNlUmVjb2duaXplci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VSZWNvZ25pemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE5MjJiZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCYXNlUmVjb2duaXplci5oCkBAIC0wLDAgKzEsMTgzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKy8vIFRoaXMgaXMgYW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgbGV4ZXJzIGFuZCBwYXJzZXJzLgorCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9GQUlMRUQgLTIKKyNkZWZpbmUgQU5UTFJfTUVNT19SVUxFX1VOS05PV04gLTEKKyNkZWZpbmUgQU5UTFJfSU5JVElBTF9GT0xMT1dfU1RBQ0tfU0laRSAxMDAKKworI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSQmFzZVJlY29nbml6ZXIgOiBOU09iamVjdCB7CisJQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOwkvLyB0aGUgc3RhdGUgb2YgdGhpcyByZWNvZ25pemVyLiBNaWdodCBiZSBzaGFyZWQgd2l0aCBvdGhlciByZWNvZ25pemVycywgZS5nLiBpbiBncmFtbWFyIGltcG9ydCBzY2VuYXJpb3MuCisJTlNTdHJpbmcgKmdyYW1tYXJGaWxlTmFtZTsJCQkvLyB3aGVyZSBkaWQgdGhlIGdyYW1tYXIgY29tZSBmcm9tLiBmaWxsZWQgaW4gYnkgY29kZWdlbmVyYXRpb24KKy8vICAgIEJPT0wgZmFpbGVkOworICAgIE5TU3RyaW5nICpzb3VyY2VOYW1lOworLy8gICAgTlNJbnRlZ2VyIG51bWJlck9mU3ludGF4RXJyb3JzOworICAgIE5TQXJyYXkgKnRva2VuTmFtZXM7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhdGUsIHNldHRlcj1zZXRTdGF0ZSkgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRHcmFtbWFyRmlsZU5hbWUsIHNldHRlcj1zZXRHcmFtbWFyRmlsZU5hbWUpIE5TU3RyaW5nICpncmFtbWFyRmlsZU5hbWU7CisvL0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0RmFpbGVkLCBzZXR0ZXI9c2V0RmFpbGVkKSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5OYW1lcywgc2V0dGVyPXNldFRva2VuTmFtZXMpIE5TQXJyYXkgKnRva2VuTmFtZXM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFNvdXJjZU5hbWUsIHNldHRlcj1zZXRTb3VyY2VOYW1lKSBOU1N0cmluZyAqc291cmNlTmFtZTsKKy8vQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXROdW1iZXJPZlN5bnRheEVycm9ycywgc2V0dGVyPXNldE51bWJlck9mU3ludGF4RXJyb3JzKSBOU0ludGVnZXIgbnVtYmVyT2ZTeW50YXhFcnJvcnM7CisKKysgKHZvaWQpIGluaXRpYWxpemU7CisKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcldpdGhSdWxlTGVuOihOU0ludGVnZXIpYUxlbjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKysgKE5TQXJyYXkgKilnZXRUb2tlbk5hbWVzOworKyAodm9pZClzZXRUb2tlbk5hbWVzOihOU0FycmF5ICopYVRva05hbUFycmF5OworKyAodm9pZClzZXRHcmFtbWFyRmlsZU5hbWU6KE5TU3RyaW5nICopYUZpbGVOYW1lOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy8vIHNpbXBsZSBhY2Nlc3NvcnMKKy0gKE5TSW50ZWdlcikgZ2V0QmFja3RyYWNraW5nTGV2ZWw7CistICh2b2lkKSBzZXRCYWNrdHJhY2tpbmdMZXZlbDooTlNJbnRlZ2VyKSBsZXZlbDsKKworLSAoQk9PTCkgZ2V0RmFpbGVkOworLSAodm9pZCkgc2V0RmFpbGVkOiAoQk9PTCkgZmxhZzsKKworLSAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgZ2V0U3RhdGU7CistICh2b2lkKSBzZXRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgdGhlU3RhdGU7CisKKy8vIHJlc2V0IHRoaXMgcmVjb2duaXplciAtIG1pZ2h0IGJlIGV4dGVuZGVkIGJ5IGNvZGVnZW5lcmF0aW9uL2dyYW1tYXIKKy0gKHZvaWQpIHJlc2V0OworCisvKiogTWF0Y2ggbmVlZHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCwgd2hpY2ggZ2V0cyBwdXQKKyAqICBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKyAqICBhbmQgdHJlZSBwYXJzZXJzIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBvYmplY3RzLiBSYXRoZXIgdGhhbiB0ZXN0CisgKiAgZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKyAqICBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorICogIGlucHV0IHN5bWJvbCBpcy4KKyAqIAorICogIFRoaXMgaXMgaWdub3JlZCBmb3IgbGV4ZXJzLgorICovCistIChpZCkgZ2V0SW5wdXQ7CisKKy0gKHZvaWQpc2tpcDsKKworLy8gZG8gYWN0dWFsIG1hdGNoaW5nIG9mIHRva2Vucy9jaGFyYWN0ZXJzCistIChpZCkgbWF0Y2g6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CistIChCT09MKSBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVG9rZW5UeXBlOihOU0ludGVnZXIpIHR0eXBlOworLSAoQk9PTCkgbWlzbWF0Y2hJc01pc3NpbmdUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLy8gZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeQorLSAodm9pZCkgcmVwb3J0RXJyb3I6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworLSAodm9pZCkgZGlzcGxheVJlY29nbml0aW9uRXJyb3I6KE5TQXJyYXkgKil0aGVUb2tOYW1zIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldEVycm9yTWVzc2FnZTooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUgVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChOU0ludGVnZXIpIGdldE51bWJlck9mU3ludGF4RXJyb3JzOworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldFRva2VuRXJyb3JEaXNwbGF5OihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgZW1pdEVycm9yTWVzc2FnZTooTlNTdHJpbmcgKiltc2c7CistICh2b2lkKSByZWNvdmVyOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworCisvLyBiZWdpbiBob29rcyBmb3IgZGVidWdnZXIKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLy8gZW5kIGhvb2tzIGZvciBkZWJ1Z2dlcgorCisvLyBjb21wdXRlIHRoZSBiaXRzZXRzIG5lY2Vzc2FyeSB0byBkbyBtYXRjaGluZyBhbmQgcmVjb3ZlcnkKKy0gKEFOVExSQml0U2V0ICopY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ7CistIChBTlRMUkJpdFNldCAqKWNvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVzsKKy0gKEFOVExSQml0U2V0ICopY29tYmluZUZvbGxvd3M6KEJPT0wpIGV4YWN0OworCistIChpZDxBTlRMUlRva2VuPikgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5UeXBlOihOU0ludGVnZXIpdHR5cGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistIChpZDxBTlRMUlRva2VuPilyZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBnZXRNaXNzaW5nU3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgIFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CisKKy8vIGhlbHBlciBtZXRob2RzIGZvciByZWNvdmVyeS4gdHJ5IHRvIHJlc3luYyBzb21ld2hlcmUKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbFRUeXBlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBUb2tlblR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbEZvbGxvdzooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWJpdFNldDsKKy0gKHZvaWQpIHB1c2hGb2xsb3c6KEFOVExSQml0U2V0ICopZnNldDsKKy0gKEFOVExSQml0U2V0ICopcG9wRm9sbG93OworCisvLyB0byBiZSB1c2VkIGJ5IHRoZSBkZWJ1Z2dlciB0byBkbyByZXBvcnRpbmcuIG1heWJlIGhvb2sgaW4gaW5jcmVtZW50YWwgc3R1ZmYgaGVyZSwgdG9vLgorLSAoTlNNdXRhYmxlQXJyYXkgKikgZ2V0UnVsZUludm9jYXRpb25TdGFjazsKKy0gKE5TTXV0YWJsZUFycmF5ICopIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2s6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKilleGNlcHRpb24KKwkJCQkJICAgICAgICAgICAgIFJlY29nbml6ZXI6KE5TU3RyaW5nICopcmVjb2duaXplckNsYXNzTmFtZTsKKworLSAoTlNBcnJheSAqKSBnZXRUb2tlbk5hbWVzOworLSAoTlNTdHJpbmcgKilnZXRHcmFtbWFyRmlsZU5hbWU7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CistIChOU011dGFibGVBcnJheSAqKSB0b1N0cmluZ3M6KE5TQXJyYXkgKil0b2tlbnM7CisvLyBzdXBwb3J0IGZvciBtZW1vaXphdGlvbgorLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb246KE5TSW50ZWdlcilydWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoQk9PTCkgYWxyZWFkeVBhcnNlZFJ1bGU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKy0gKHZvaWQpIG1lbW9pemU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisJICAgICBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKKwkgICAgU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb25DYWNoZVNpemU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKy0gKHZvaWQpdHJhY2VPdXQ6KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKworCisvLyBzdXBwb3J0IGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gdGhlc2UgYXJlIGNhbGxlZCBpbmRpcmVjdGx5IHRvIHN1cHBvcnQgZnVua3kgc3R1ZmYgaW4gZ3JhbW1hcnMsCisvLyBsaWtlIHN1cHBseWluZyBzZWxlY3RvcnMgaW5zdGVhZCBvZiB3cml0aW5nIGNvZGUgZGlyZWN0bHkgaW50byB0aGUgYWN0aW9ucyBvZiB0aGUgZ3JhbW1hci4KKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworLy8gc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VTdGFjay5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VTdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjkwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQmFzZVN0YWNrLmgKQEAgLTAsMCArMSw2NiBAQAorLy8KKy8vICBBTlRMUkJhc2VSZWNvZ25pemVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUHRyQnVmZmVyLmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorLy8jZGVmaW5lIExPQ0FMX1NDT1BFICAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJCYXNlU3RhY2sgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy9BTlRMUlJ1bGVTdGFjayAqZk5leHQ7CisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSUnVsZVN0YWNrICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2gpIE5TSW50ZWdlciBMYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKEFOVExSQmFzZVN0YWNrICopbmV3QU5UTFJCYXNlU3RhY2s7CisrIChBTlRMUkJhc2VTdGFjayAqKW5ld0FOVExSQmFzZVN0YWNrV2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKHZvaWQpZGVhbGxvYzsKKworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0gKE5TSW50ZWdlcilnZXRMYXN0SGFzaDsKKy0gKHZvaWQpc2V0TGFzdEhhc2g6KE5TSW50ZWdlcilhVmFsOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQmFzZVRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCYXNlVHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk2NTEzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQmFzZVRyZWUuaApAQCAtMCwwICsxLDE5OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAcHJvdG9jb2wgQU5UTFJCYXNlVHJlZSA8QU5UTFJUcmVlPgorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoaWxkcmVuLCBzZXR0ZXI9c2V0Q2hpbGRyZW4pIE5TTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKKworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSQmFzZVRyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJCYXNlVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGluaXQ7CistIChpZDxBTlRMUkJhc2VUcmVlPikgaW5pdFdpdGg6KGlkPEFOVExSVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldENoaWxkOihOU1VJbnRlZ2VyKWk7CistIChOU011dGFibGVBcnJheSAqKWdldENoaWxkcmVuOworLSAodm9pZCkgc2V0Q2hpbGRyZW46KE5TTXV0YWJsZUFycmF5ICopYW5BcnJheTsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWdldEZpcnN0Q2hpbGRXaXRoVHlwZTooTlNJbnRlZ2VyKXR5cGU7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBBZGQgdCBhcyBhIGNoaWxkIHRvIHRoaXMgbm9kZS4gIElmIHQgaXMgbnVsbCwgZG8gbm90aGluZy4gIElmIHQKKy8vICBpcyBuaWwsIGFkZCBhbGwgY2hpbGRyZW4gb2YgdCB0byB0aGlzJyBjaGlsZHJlbi4KKworLSAodm9pZCkgYWRkQ2hpbGQ6KGlkPEFOVExSVHJlZT4pIHRyZWU7CistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy0gKHZvaWQpIHNldENoaWxkOihOU0ludGVnZXIpIGkgV2l0aDooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQpIGRlbGV0ZUNoaWxkOihOU0ludGVnZXIpIGk7CistIChOU011dGFibGVBcnJheSAqKSBjcmVhdGVDaGlsZHJlbkxpc3Q7CistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW5Gcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpIHQ7CisvLyBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKy8vIHRoZSB0cmVlIGlzIGEgZmxhdCBsaXN0LgorCistIChCT09MKSBpc05pbDsKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5TdGFydEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdGFydEluZGV4OihOU0ludGVnZXIpIGluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczooTlNJbnRlZ2VyKSBvZmZzZXQ7CistICh2b2lkKSBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOihpZDxBTlRMUlRyZWU+KSBwYXJlbnQgQXQ6KE5TSW50ZWdlcikgaTsKKworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooTlNJbnRlZ2VyKWk7CisKKy0gKGlkPEFOVExSVHJlZT4pZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0QW5jZXN0b3JzOworCisjcHJhZ21hIG1hcmsgQ29weWluZworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CS8vIHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkIGhlcmUhCistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisjcHJhZ21hIG1hcmsgVHJlZSBQYXJzZXIgc3VwcG9ydAorLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dDsKKy8vIEluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhIHRva2VuIHBheWxvYWQsIHdoYXQgaXMgdGhlIGxpbmUgZm9yIGVycm9ycz8KKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TSW50ZWdlcikgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworCisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistIChOU1N0cmluZyAqKSB0cmVlRGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ1RyZWU7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlIDogTlNPYmplY3QgPEFOVExSVHJlZT4KK3sKKwlOU011dGFibGVBcnJheSAqY2hpbGRyZW47CisgICAgTlNFeGNlcHRpb24gKmFuRXhjZXB0aW9uOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoaWxkcmVuLCBzZXR0ZXI9c2V0Q2hpbGRyZW4pIE5TTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKKworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSQmFzZVRyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJCYXNlVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKyAgICAgICAgIAorLSAoaWQ8QU5UTFJUcmVlPikgaW5pdDsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBpbml0V2l0aDooaWQ8QU5UTFJUcmVlPilub2RlOworCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0Q2hpbGRyZW47CistICh2b2lkKSBzZXRDaGlsZHJlbjooTlNNdXRhYmxlQXJyYXkgKilhbkFycmF5OworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOihOU0ludGVnZXIpdHlwZTsKKy0gKE5TVUludGVnZXIpIGdldENoaWxkQ291bnQ7CisKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJUcmVlPikgdHJlZTsKKy0gKHZvaWQpIGFkZENoaWxkcmVuOihOU0FycmF5ICopIHRoZUNoaWxkcmVuOworCistICh2b2lkKSBzZXRDaGlsZDooTlNJbnRlZ2VyKSBpIFdpdGg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNJbnRlZ2VyKSBpOworLSAoTlNNdXRhYmxlQXJyYXkgKikgY3JlYXRlQ2hpbGRyZW5MaXN0OworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworLy8gSW5kaWNhdGVzIHRoZSBub2RlIGlzIGEgbmlsIG5vZGUgYnV0IG1heSBzdGlsbCBoYXZlIGNoaWxkcmVuLCBtZWFuaW5nCisJLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdG9wSW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CisKKy0gKHZvaWQpIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7CistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOihOU0ludGVnZXIpIG9mZnNldDsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6KGlkPEFOVExSVHJlZT4pIHBhcmVudCBBdDooTlNJbnRlZ2VyKSBpOworCistIChOU0ludGVnZXIpIGdldENoaWxkSW5kZXg7CistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpaTsKKworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CistIChpZDxBTlRMUlRyZWU+KWdldEFuY2VzdG9yOihOU0ludGVnZXIpdHR5cGU7CistIChOU011dGFibGVBcnJheSAqKWdldEFuY2VzdG9yczsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisJLy8gUmV0dXJuIGEgdG9rZW4gdHlwZTsgbmVlZGVkIGZvciB0cmVlIHBhcnNpbmcKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisKKwkvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKXBvczsKKworLSAoTlNTdHJpbmcgKikgdHJlZURlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nVHJlZTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlIDogQU5UTFJCYXNlVHJlZSB7Cit9CistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gOiBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSB7Cit9CisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gKikgZ2V0TmF2aWdhdGlvbk5vZGVEb3duOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZVVwIDogQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGUgeworfQorKyAoQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVVcCAqKSBnZXROYXZpZ2F0aW9uTm9kZVVwOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiA6IEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlIHsKK30KKysgKEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRU9GICopIGdldE5hdmlnYXRpb25Ob2RlRU9GOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRG93biAqbmF2aWdhdGlvbk5vZGVEb3duOworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgKm5hdmlnYXRpb25Ob2RlVXA7CitleHRlcm4gQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVFT0YgKm5hdmlnYXRpb25Ob2RlRU9GOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VUcmVlQWRhcHRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJhc2VUcmVlQWRhcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjhkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQmFzZVRyZWVBZGFwdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25FcnJvck5vZGUuaCIKKyNpbXBvcnQgIkFOVExSVW5pcXVlSURNYXAuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlQWRhcHRvciA6IE5TT2JqZWN0IDxBTlRMUlRyZWVBZGFwdG9yLCBOU0NvcHlpbmc+IHsKKyAgICBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKKwlOU0ludGVnZXIgdW5pcXVlTm9kZUlEOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWVUb1VuaXF1ZUlETWFwLCBzZXR0ZXI9c2V0VHJlZVRvVW5pcXVlSURNYXA6KSBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFVuaXF1ZU5vZGVJRCwgc2V0dGVyPXNldFVuaXF1ZU5vZGVJRDopIE5TSW50ZWdlciB1bmlxdWVOb2RlSUQ7CisKKysgKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBuZXdFbXB0eVRyZWU7CisKKy0gKGlkKSBpbml0OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoaWQpIGVtcHR5Tm9kZTsKKworLSAoQU5UTFJVbmlxdWVJRE1hcCAqKWdldFRyZWVUb1VuaXF1ZUlETWFwOworLSAodm9pZCkgc2V0VHJlZVRvVW5pcXVlSURNYXA6KEFOVExSVW5pcXVlSURNYXAgKilhTWFwTm9kZTsKKworLSAoTlNJbnRlZ2VyKWdldFVuaXF1ZUlEOworLSAodm9pZCkgc2V0VW5pcXVlTm9kZUlEOihOU0ludGVnZXIpYVVuaXF1ZU5vZGVJRDsKKworLyoqIGNyZWF0ZSB0cmVlIG5vZGUgdGhhdCBob2xkcyB0aGUgc3RhcnQgYW5kIHN0b3AgdG9rZW5zIGFzc29jaWF0ZWQKKyAqICB3aXRoIGFuIGVycm9yLgorICoKKyAqICBJZiB5b3Ugc3BlY2lmeSB5b3VyIG93biBraW5kIG9mIHRyZWUgbm9kZXMsIHlvdSB3aWxsIGxpa2VseSBoYXZlIHRvCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIENvbW1vblRyZWUgcmV0dXJucyBUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUKKyAqICBpZiBubyB0b2tlbiBwYXlsb2FkIGJ1dCB5b3UgbWlnaHQgaGF2ZSB0byBzZXQgdG9rZW4gdHlwZSBmb3IgZGlmZgorICogIG5vZGUgdHlwZS4KKyAqCisgKiAgWW91IGRvbid0IGhhdmUgdG8gc3ViY2xhc3MgQ29tbW9uRXJyb3JOb2RlOyB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0bworICogIHN1YmNsYXNzIHlvdXIgb3duIHRyZWUgbm9kZSBjbGFzcyB0byBhdm9pZCBjbGFzcyBjYXN0IGV4Y2VwdGlvbi4KKyAqLworLSAoaWQpIGVycm9yTm9kZTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuCisgICAgICAgRXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKSBlOworCistIChCT09MKSBpc05pbDooaWQ8QU5UTFJUcmVlPikgYVRyZWU7CisKKy0gKGlkPEFOVExSVHJlZT4pZHVwVHJlZTooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKy8qKiBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAqICB0cmVlIChub3QganVzdCBUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgKiAgbm90IHRoZSB0cmVlIG5vZGUgcm91dGluZXMgdG8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIAorICovCistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWUgUGFyZW50OihpZDxBTlRMUlRyZWU+KXBhcmVudDsKKy0gKGlkPEFOVExSVHJlZT4pZHVwTm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy8qKiBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgKiAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAqICBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBoYXZlIHRoZSB1c2VyIHdpbGwgYnVpbGQKKyAqICBBU1RzLgorICovCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJUcmVlPilhQ2hpbGQgdG9UcmVlOihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisvKiogSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIGEgYiBjKQorICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBuZXdSb290IGlzIGEgbmlsLXJvb3RlZCBzaW5nbGUgY2hpbGQgdHJlZSwgdXNlIHRoZSBzaW5nbGUKKyAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgKgorICogIElmIG9sZFJvb3Qgd2FzIG51bGwsIGl0J3Mgb2ssIGp1c3QgcmV0dXJuIG5ld1Jvb3QgKGV2ZW4gaWYgaXNOaWwpLgorICoKKyAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICogICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKyAqCisgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICogIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorICoKKyAqICBCZSBhZHZpc2VkIHRoYXQgaXQncyBvayBmb3IgbmV3Um9vdCB0byBwb2ludCBhdCBvbGRSb290J3MKKyAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgKiAgZWZmaWNpZW5jeS4KKyAqLworLSAoaWQ8QU5UTFJUcmVlPiliZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KWFOZXdSb290IG9sZDooaWQ8QU5UTFJUcmVlPilvbGRSb290OworCisvKiogVHJhbnNmb3JtIF4obmlsIHgpIHRvIHggYW5kIG5pbCB0byBudWxsICovCistIChpZDxBTlRMUlRyZWU+KXJ1bGVQb3N0UHJvY2Vzc2luZzooaWQ8QU5UTFJUcmVlPilhUm9vdDsKKworLSAoaWQ8QU5UTFJUcmVlPiliZWNvbWVSb290ZnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhTmV3Um9vdCBvbGQ6KGlkPEFOVExSVHJlZT4pb2xkUm9vdDsKKworLSAoaWQ8QU5UTFJUcmVlPiljcmVhdGVUcmVlOihOU0ludGVnZXIpYVRUeXBlIFdpdGg6KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW47CisKKy0gKGlkPEFOVExSVHJlZT4pY3JlYXRlVHJlZTooTlNJbnRlZ2VyKWFUVHlwZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW4gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChpZDxBTlRMUlRyZWU+KWNyZWF0ZVRyZWU6KE5TSW50ZWdlcilhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChOU0ludGVnZXIpIGdldFR5cGU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CisKKy0gKHZvaWQpIHNldFR5cGU6KGlkPEFOVExSVHJlZT4pYVRyZWUgVHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLSAodm9pZCkgc2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhVHJlZSBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy0gKGlkPEFOVExSVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUlRyZWU+KWFUcmVlIEF0OihOU0ludGVnZXIpaTsKKworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkPEFOVExSVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJUcmVlPilhQ2hpbGQ7CisKKy0gKGlkPEFOVExSVHJlZT4pIGRlbGV0ZUNoaWxkOihpZDxBTlRMUlRyZWU+KWFUcmVlIEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRDb3VudDooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLSAoTlNJbnRlZ2VyKSBnZXRVbmlxdWVJRDooaWQ8QU5UTFJUcmVlPilub2RlOworCisvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAqCisgKiAgVGhpcyBpcyBhIHZhcmlhbnQgb2YgY3JlYXRlVG9rZW4gd2hlcmUgdGhlIG5ldyB0b2tlbiBpcyBkZXJpdmVkIGZyb20KKyAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICogIHRva2VucyB0byBCTE9DSyBldGMuLi4gIFlvdSdsbCBzZWUKKyAqCisgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICoKKyAqICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgKi8KKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoaWQ8QU5UTFJUb2tlbj4pY3JlYXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCaXRTZXQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCaXRTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMWJlMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJpdFNldC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCisjZGVmaW5lIEJJVFMgKHNpemVvZihOU1VJbnRlZ2VyKSAqIDgpCisjZGVmaW5lIExPR19CSVRTICgoc2l6ZW9mKE5TVUludGVnZXIpPT04KT82OjUpCisKKy8vIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIENvcmVGb3VuZGF0aW9uIGJpdCB2ZWN0b3JzIHRvIHNoaWVsZCB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKy8vIGZyb20gdGhlIHNwZWNpZmljcyBvZiB0aGUgQml0VmVjdG9yIGluaXRpYWxpemF0aW9uIGFuZCBxdWVyeSBmdW5jdGlvbnMuCisvLyBUaGlzIGlzIGZhc3QsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVpbnZlbnQgdGhlIHdoZWVsIGp1c3QgeWV0LgorCitAaW50ZXJmYWNlIEFOVExSQml0U2V0IDogTlNPYmplY3QgPCBOU011dGFibGVDb3B5aW5nID4geworCUNGTXV0YWJsZUJpdFZlY3RvclJlZiBiaXRWZWN0b3I7Cit9CisKKyNwcmFnbWEgbWFyayBDbGFzcyBNZXRob2RzCisKKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0OworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoVHlwZTooQU5UTFJUb2tlblR5cGUpdHlwZTsKKy8qKiBDb25zdHJ1Y3QgYSBBTlRMUkJpdFNldCBnaXZlbiB0aGUgc2l6ZQorICogQHBhcmFtIG5iaXRzIFRoZSBzaXplIG9mIHRoZSBBTlRMUkJpdFNldCBpbiBiaXRzCisgKi8KKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0V2l0aE5CaXRzOihOU1VJbnRlZ2VyKW5iaXRzOworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoQXJyYXk6KE5TTXV0YWJsZUFycmF5ICopdHlwZXM7CisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKil0aGVCaXRzIENvdW50OihOU1VJbnRlZ2VyKWxvbmdDb3VudDsKKworKyAoQU5UTFJCaXRTZXQgKikgb2Y6KE5TVUludGVnZXIpZWw7CisrIChBTlRMUkJpdFNldCAqKSBvZjooTlNVSW50ZWdlcilhIEFuZDI6KE5TVUludGVnZXIpYjsKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYzsKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYyBBbmQ0OihOU1VJbnRlZ2VyKWQ7CisKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorCistIChBTlRMUkJpdFNldCAqKSBpbml0OworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSl0eXBlOworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhOQml0czooTlNVSW50ZWdlciluYml0czsKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoQml0VmVjdG9yOihDRk11dGFibGVCaXRWZWN0b3JSZWYpdGhlQml0VmVjdG9yOworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgY29uc3QqKXRoZUJpdHMgQ291bnQ6KE5TVUludGVnZXIpdGhlQ291bnQ7CistIChBTlRMUkJpdFNldCAqKSBpbml0V2l0aEFycmF5T2ZCaXRzOihOU0FycmF5ICopdGhlQXJyYXk7CisKKyNwcmFnbWEgbWFyayBPcGVyYXRpb25zCistIChBTlRMUkJpdFNldCAqKSBvcjooQU5UTFJCaXRTZXQgKikgYUJpdFNldDsKKy0gKHZvaWQpIG9ySW5QbGFjZTooQU5UTFJCaXRTZXQgKikgYUJpdFNldDsKKy0gKHZvaWQpIGFkZDooTlNVSW50ZWdlcikgYml0OworLSAodm9pZCkgcmVtb3ZlOihOU1VJbnRlZ2VyKSBiaXQ7CistICh2b2lkKSBzZXRBbGxCaXRzOihCT09MKSBhU3RhdGU7CisKKy0gKE5TSW50ZWdlcikgbnVtQml0czsKKy0gKE5TVUludGVnZXIpIHNpemU7CistICh2b2lkKSBzZXRTaXplOihOU1VJbnRlZ2VyKSBub09mV29yZHM7CisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistICh1bnNpZ25lZCBsb25nIGxvbmcpIGJpdE1hc2s6KE5TVUludGVnZXIpIGJpdE51bWJlcjsKKy0gKEJPT0wpIG1lbWJlcjooTlNVSW50ZWdlciliaXROdW1iZXI7CistIChCT09MKSBpc05pbDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CisKKyNwcmFnbWEgbWFyayBOU0NvcHlpbmcgc3VwcG9ydAorCistIChpZCkgbXV0YWJsZUNvcHlXaXRoWm9uZTooTlNab25lICopIHRoZVpvbmU7CisKKworLy9wcml2YXRlCistIChDRk11dGFibGVCaXRWZWN0b3JSZWYpIF9iaXRWZWN0b3I7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThhNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDk4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtIDogTlNPYmplY3QgPEFOVExSVG9rZW5TdHJlYW0+IAoreworaWQ8QU5UTFJUb2tlblNvdXJjZT4gdG9rZW5Tb3VyY2U7CisgICAgCisgICAgLyoqIFJlY29yZCBldmVyeSBzaW5nbGUgdG9rZW4gcHVsbGVkIGZyb20gdGhlIHNvdXJjZSBzbyB3ZSBjYW4gcmVwcm9kdWNlCisgICAgICogIGNodW5rcyBvZiBpdCBsYXRlci4gIFRoZSBidWZmZXIgaW4gTG9va2FoZWFkU3RyZWFtIG92ZXJsYXBzIHNvbWV0aW1lcworICAgICAqICBhcyBpdHMgbW92aW5nIHdpbmRvdyBtb3ZlcyB0aHJvdWdoIHRoZSBpbnB1dC4gIFRoaXMgbGlzdCBjYXB0dXJlcworICAgICAqICBldmVyeXRoaW5nIHNvIHdlIGNhbiBhY2Nlc3MgY29tcGxldGUgaW5wdXQgdGV4dC4KKyAgICAgKi8KK05TTXV0YWJsZUFycmF5ICp0b2tlbnM7CisgICAgCisgICAgLyoqIFRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLiAqLworTlNJbnRlZ2VyIGxhc3RNYXJrZXI7CisgICAgCisgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAqICB0byBjb25zdW1lKS4gIHRva2Vuc1twXSBzaG91bGQgYmUgTFQoMSkuICBwPS0xIGluZGljYXRlcyBuZWVkCisgICAgICogIHRvIGluaXRpYWxpemUgd2l0aCBmaXJzdCB0b2tlbi4gIFRoZSBjdG9yIGRvZXNuJ3QgZ2V0IGEgdG9rZW4uCisgICAgICogIEZpcnN0IGNhbGwgdG8gTFQoMSkgb3Igd2hhdGV2ZXIgZ2V0cyB0aGUgZmlyc3QgdG9rZW4gYW5kIHNldHMgcD0wOworICAgICAqLworTlNJbnRlZ2VyIHA7CisgICAgCitOU0ludGVnZXIgcmFuZ2U7IC8vIGhvdyBkZWVwIGhhdmUgd2UgZ29uZT8KKyAgICAKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5Tb3VyY2Usc2V0dGVyPXNldFRva2VuU291cmNlKSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5zLHNldHRlcj1zZXRUb2tlbnMpIE5TTXV0YWJsZUFycmF5ICp0b2tlbnM7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldExhc3RNYXJrZXIsc2V0dGVyPXNldExhc3RNYXJrZXIpIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJbmRleCxzZXR0ZXI9c2V0SW5kZXgpIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRSYW5nZSxzZXR0ZXI9c2V0UmFuZ2UpIE5TSW50ZWdlciByYW5nZTsKKworKyAoQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbTsKKysgKEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW1XaXRoOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGluaXRXaXRoU291cmNlOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgc2V0SW5kZXg6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgZ2V0UmFuZ2U7CistICh2b2lkKSBzZXRSYW5nZTooTlNJbnRlZ2VyKWFuSW50OworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVzZXQ7CistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworLSAoTlNJbnRlZ2VyKSBzaXplOworLSAodm9pZCkgY29uc3VtZTsKKy0gKHZvaWQpIHN5bmM6KE5TSW50ZWdlcikgaTsKKy0gKHZvaWQpIGZldGNoOihOU0ludGVnZXIpIG47CistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcikgaTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0RnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcikgc3RvcEluZGV4OworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRva2VuPikgTFQ6KE5TSW50ZWdlcikgazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKSBrOworLSAodm9pZCkgc2V0dXA7CistIChpZDxBTlRMUlRva2VuU291cmNlPikgZ2V0VG9rZW5Tb3VyY2U7CistICh2b2lkKSBzZXRUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zOworLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zRnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU011dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGg6KEFOVExSQml0U2V0ICopdHlwZXM7CistIChOU011dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGhMaXN0OihOU011dGFibGVBcnJheSAqKXR5cGVzOworLSAoTlNNdXRhYmxlQXJyYXkgKilnZXRUb2tlbnNGcm9tOihOU0ludGVnZXIpc3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BJbmRleCBXaXRoVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydEluZGV4IFRvRW5kOihOU0ludGVnZXIpc3RvcEluZGV4OworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0YXJ0SW5kZXggVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RvcEluZGV4OworLSAodm9pZCkgZmlsbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxOGVhMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vCisvLyAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCisjZGVmaW5lIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSAxMDAKKyNkZWZpbmUgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgMTAKKworI2lmZGVmIERPTlRVU0VOT01PCitAaW50ZXJmYWNlIEFOVExSU3RyZWFtSXRlcmF0b3IgOiBBTlRMUlRyZWVJdGVyYXRvcgoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIGlucHV0OworICAgIE5TTXV0YWJsZUFycmF5ICpub2RlczsKK30KKworKyAoaWQpIG5ld0FOVExSU3RyZWFtSXRlcmF0b3I6KEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSB0aGVTdHJlYW07CisKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIHRoZVN0cmVhbTsKKworLSAoQk9PTCkgaGFzTmV4dDsKKy0gKGlkKSBuZXh0OworLSAodm9pZCkgcmVtb3ZlOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIDogTlNPYmplY3QgPEFOVExSVHJlZU5vZGVTdHJlYW0+IAoreworCWlkPEFOVExSVHJlZT4gdXA7CisJaWQ8QU5UTFJUcmVlPiBkb3duOworCWlkPEFOVExSVHJlZT4gZW9mOworCQorCU5TTXV0YWJsZUFycmF5ICpub2RlczsKKwkKKwlpZDxBTlRMUlRyZWU+IHJvb3Q7IC8vIHJvb3QKKwkKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiB0b2tlbnM7CisJQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKwkKKwlCT09MIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKwlOU0ludGVnZXIgcDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlBTlRMUkludEFycmF5ICpjYWxsczsKKwkKKwlOU0VudW1lcmF0b3IgKmU7CisgICAgaWQgY3VycmVudFN5bWJvbDsKKwkKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRVcCwgc2V0dGVyPXNldFVwOikgaWQ8QU5UTFJUcmVlPiB1cDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RG93biwgc2V0dGVyPXNldERvd246KSBpZDxBTlRMUlRyZWU+IGRvd247CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEVvZiwgc2V0dGVyPXNldEVvZjopIGlkPEFOVExSVHJlZT4gZW9mOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXROb2Rlcywgc2V0dGVyPXNldE5vZGVzOikgTlNNdXRhYmxlQXJyYXkgKm5vZGVzOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlU291cmNlLCBzZXR0ZXI9c2V0VHJlZVNvdXJjZTopIGlkPEFOVExSVHJlZT4gcm9vdDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5TdHJlYW0sIHNldHRlcj1zZXRUb2tlblN0cmVhbTopIGlkPEFOVExSVG9rZW5TdHJlYW0+IHRva2VuczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QWRhcHRvciwgc2V0dGVyPXNldEFkYXB0b3I6KSBBTlRMUkNvbW1vblRyZWVBZGFwdG9yICphZGFwdG9yOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXMsIHNldHRlcj1zZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KSBCT09MIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0SW5kZXgsIHNldHRlcj1zZXRJbmRleDopIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMYXN0TWFya2VyLCBzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDYWxscywgc2V0dGVyPXNldENhbGxzOikgQU5UTFJJbnRBcnJheSAqY2FsbHM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEVudW0sIHNldHRlcj1zZXRFbnVtOikgTlNFbnVtZXJhdG9yICplOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDdXJyZW50U3ltYm9sLCBzZXR0ZXI9c2V0Q3VycmVudFN5bWJvbDopIGlkIGN1cnJlbnRTeW1ib2w7CisKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZT4pdHJlZTsKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooaWQ8QU5UTFJUcmVlPil0cmVlOworKyAoQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWUgd2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilpbml0aWFsQnVmZmVyU2l6ZTsKKworI3ByYWdtYSBtYXJrIENvbnN0cnVjdG9yCistIChpZCkgaW5pdFdpdGhUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWUgV2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilidWZmZXJTaXplOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLy8gcHJvdGVjdGVkIG1ldGhvZHMuIERPIE5PVCBVU0UKKyNwcmFnbWEgbWFyayBQcm90ZWN0ZWQgTWV0aG9kcworLSAodm9pZCkgZmlsbEJ1ZmZlcjsKKy0gKHZvaWQpIGZpbGxCdWZmZXJXaXRoVHJlZTooaWQ8QU5UTFJUcmVlPikgdHJlZTsKKy0gKE5TSW50ZWdlcikgZ2V0Tm9kZUluZGV4OihpZDxBTlRMUlRyZWU+KSBub2RlOworLSAodm9pZCkgYWRkTmF2aWdhdGlvbk5vZGU6KE5TSW50ZWdlcikgdHlwZTsKKy0gKGlkKSBnZXROb2RlOihOU0ludGVnZXIpIGk7CistIChpZCkgTFQ6KE5TSW50ZWdlcikgazsKKy0gKGlkKSBnZXRDdXJyZW50U3ltYm9sOworLSAoaWQpIExCOihOU0ludGVnZXIpIGk7CisjcHJhZ21hIG1hcmsgR2VuZXJhbCBNZXRob2RzCistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgZ2V0VG9rZW5TdHJlYW07CistICh2b2lkKSBzZXRUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pIHRva2VuczsKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPikgYW5BZGFwdG9yOworCistIChCT09MKWdldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClhVmFsOworCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKSBpOworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgc2V0SW5kZXg6KE5TSW50ZWdlcikgaWR4OworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaWR4OworCistICh2b2lkKSBwdXNoOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIHBvcDsKKworLSAodm9pZCkgcmVzZXQ7CistIChOU1VJbnRlZ2VyKSBjb3VudDsKKy0gKE5TRW51bWVyYXRvciAqKSBvYmplY3RFbnVtZXJhdG9yOworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworCistIChOU1N0cmluZyAqKSB0b1Rva2VuVHlwZVN0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvVG9rZW5TdHJpbmc6KE5TSW50ZWdlcilhU3RhcnQgVG9FbmQ6KE5TSW50ZWdlcilhU3RvcDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKWFTdGFydCBUb05vZGU6KGlkKWFTdG9wOworCisvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCistIChOU011dGFibGVBcnJheSAqKSBnZXROb2RlczsKKy0gKGlkPEFOVExSVHJlZT4pIGdldEVvZjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkNoYXJTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDaGFyU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzc5NzM0YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDaGFyU3RyZWFtLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKyNkZWZpbmUJQU5UTFJDaGFyU3RyZWFtRU9GIC0xCisKKworQHByb3RvY29sIEFOVExSQ2hhclN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLSAoTlNTdHJpbmcgKikgc3Vic3RyaW5nV2l0aFJhbmdlOihOU1JhbmdlKSB0aGVSYW5nZTsKKworLyoqIEdldCB0aGUgaXRoIGNoYXJhY3RlciBvZiBsb29rYWhlYWQuICBUaGlzIGlzIHRoZSBzYW1lIHVzdWFsbHkgYXMKKyAqICBMQShpKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZAorICogIGxleGVyIGNvZGUuICBJJ2QgcHJlZmVyIHRvIHJldHVybiBhIGNoYXIgaGVyZSB0eXBlLXdpc2UsIGJ1dCBpdCdzCisgKiAgcHJvYmFibHkgYmV0dGVyIHRvIGJlIDMyLWJpdCBjbGVhbiBhbmQgYmUgY29uc2lzdGVudCB3aXRoIExBLgorICovCistIChOU0ludGVnZXIpTFQ6KE5TSW50ZWdlcikgaTsKKworLy8gQU5UTFIgdHJhY2tzIHRoZSBsaW5lIGluZm9ybWF0aW9uIGF1dG9tYXRpY2FsbHkKKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKworLy8gQmVjYXVzZSB0aGlzIHN0cmVhbSBjYW4gcmV3aW5kLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhlIGxpbmUKKy0gKHZvaWQpIHNldExpbmU6KE5TSW50ZWdlcikgdGhlTGluZTsKKworLy8gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5uLTEKKy0gKE5TSW50ZWdlcikgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworCistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TSW50ZWdlcikgdGhlUG9zOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzg3Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8vCisvLyAgQU5UTFJDaGFyU3RyZWFtU3RhdGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJDaGFyU3RyZWFtU3RhdGUgOiBOU09iamVjdAoreworTlNJbnRlZ2VyIHA7CitOU0ludGVnZXIgbGluZTsKK05TSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFAsc2V0dGVyPXNldFA6KSBOU0ludGVnZXIgcDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExpbmUsc2V0dGVyPXNldExpbmU6KSBOU0ludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYXJQb3NpdGlvbkluTGluZSxzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKworKyBuZXdBTlRMUkNoYXJTdHJlYW1TdGF0ZTsKKworLSAoaWQpIGluaXQ7CisKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6IChOU0ludGVnZXIpIGFuSW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKy0gKHZvaWQpIHNldExpbmU6IChOU0ludGVnZXIpIGFMaW5lOworCistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKWFDaGFyUG9zaXRpb25JbkxpbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25FcnJvck5vZGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25FcnJvck5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJhZGMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkNvbW1vbkVycm9yTm9kZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJDb21tb25FcnJvck5vZGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJJbnRTdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJVbldhbnRlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25FcnJvck5vZGUgOiBBTlRMUkNvbW1vblRyZWUKK3sKK2lkPEFOVExSSW50U3RyZWFtPiBpbnB1dDsKK2lkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CitBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICp0cmFwcGVkRXhjZXB0aW9uOworfQorCisrIChpZCkgbmV3QU5UTFJDb21tb25FcnJvck5vZGU6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgIEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGU7CisKKy0gKGlkKSBpbml0V2l0aElucHV0OihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKikgZTsKKy0gKEJPT0wpIGlzTmlsOworCistIChOU0ludGVnZXIpIGdldFR5cGU7CisKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVG9rZW4uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2NjIzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVG9rZW4uaApAQCAtMCwwICsxLDEwNSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVG9rZW4gOiBOU09iamVjdCA8IEFOVExSVG9rZW4gPiB7CisJTlNTdHJpbmcgKnRleHQ7CisJTlNJbnRlZ2VyIHR5cGU7CisJLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRva2VuJ3MgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbQorCU5TVUludGVnZXIgbGluZTsKKwlOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU1VJbnRlZ2VyIGNoYW5uZWw7CisJLy8gdGhpcyB0b2tlbidzIHBvc2l0aW9uIGluIHRoZSBUb2tlblN0cmVhbQorCU5TVUludGVnZXIgaW5kZXg7CisJCisJLy8gaW5kaWNlcyBpbnRvIHRoZSBDaGFyU3RyZWFtIHRvIGF2b2lkIGNvcHlpbmcgdGhlIHRleHQKKwkvLyBjYW4gbWFudWFsbHkgb3ZlcnJpZGUgdGhlIHRleHQgYnkgdXNpbmcgLXNldFRleHQ6CisJTlNVSW50ZWdlciBzdGFydEluZGV4OworCU5TVUludGVnZXIgc3RvcEluZGV4OworCS8vIHRoZSBhY3R1YWwgaW5wdXQgc3RyZWFtIHRoaXMgdG9rZW4gd2FzIGZvdW5kIGluCisJaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUeXBlLCBzZXR0ZXI9c2V0VHlwZTopIE5TSW50ZWdlciB0eXBlOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMaW5lLCBzZXR0ZXI9c2V0TGluZTopIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hhclBvc2l0aW9uSW5MaW5lLCBzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNVSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldENoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNVSW50ZWdlciBjaGFubmVsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlbkluZGV4LCBzZXR0ZXI9c2V0VG9rZW5JbmRleDopIE5TVUludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBOU1VJbnRlZ2VyIHN0YXJ0SW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgTlNVSW50ZWdlciBzdG9wSW5kZXg7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldElucHV0LCBzZXR0ZXI9c2V0SW5wdXQ6KSBpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OworCisrICh2b2lkKSBpbml0aWFsaXplOworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdBTlRMUkNvbW1vblRva2VuOworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdBTlRMUkNvbW1vblRva2VuOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKWFUVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydDooTlNJbnRlZ2VyKWFTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpYVN0b3A7CisrIChBTlRMUkNvbW1vblRva2VuICopIG5ld0FOVExSQ29tbW9uVG9rZW46KEFOVExSVG9rZW5UeXBlKWFUeXBlOworKyAoaWQ8QU5UTFJUb2tlbj4pIG5ld0FOVExSQ29tbW9uVG9rZW46KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisrIChpZDxBTlRMUlRva2VuPikgbmV3QU5UTFJDb21tb25Ub2tlbldpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIGVvZlRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIHNraXBUb2tlbjsKKysgKGlkPEFOVExSVG9rZW4+KSBpbnZhbGlkVG9rZW47CisrIChBTlRMUlRva2VuQ2hhbm5lbCkgZGVmYXVsdENoYW5uZWw7CisKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIuIFRoaXMgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB3YXkgdG8gaW5pdGlhbGl6ZSBhIFRva2VuIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdDsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcilhVFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbDooTlNJbnRlZ2VyKWFDaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6KE5TSW50ZWdlcil0aGVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpdGhlU3RvcDsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVHlwZTsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisKKy0gKGlkPEFOVExSQ2hhclN0cmVhbT4pIGdldElucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUkNoYXJTdHJlYW0+KSBhbklucHV0OworCistIChOU1VJbnRlZ2VyKSBnZXRTdGFydDsKKy0gKHZvaWQpIHNldFN0YXJ0OiAoTlNVSW50ZWdlcikgYVN0YXJ0OworCistIChOU1VJbnRlZ2VyKSBnZXRTdG9wOworLSAodm9pZCkgc2V0U3RvcDogKE5TVUludGVnZXIpIGFTdG9wOworCisvLyB0aGUgaW5kZXggb2YgdGhpcyBUb2tlbiBpbnRvIHRoZSBUb2tlblN0cmVhbQorLSAoTlNVSW50ZWdlcikgZ2V0VG9rZW5JbmRleDsKKy0gKHZvaWQpIHNldFRva2VuSW5kZXg6IChOU1VJbnRlZ2VyKSBhVG9rZW5JbmRleDsKKworLy8gY29uZm9ybSB0byBOU0NvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTlmOWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gOiBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0gPCBBTlRMUlRva2VuU3RyZWFtID4KK3sKKwlOU011dGFibGVEaWN0aW9uYXJ5ICpjaGFubmVsT3ZlcnJpZGU7CisJTlNJbnRlZ2VyIGNoYW5uZWw7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Q2hhbm5lbE92ZXJyaWRlLHNldHRlcj1zZXRDaGFubmVsT3ZlcnJpZGUpIE5TTXV0YWJsZURpY3Rpb25hcnkgKmNoYW5uZWxPdmVycmlkZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hhbm5lbCxzZXR0ZXI9c2V0Q2hhbm5lbCkgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gKiluZXdBTlRMUkNvbW1vblRva2VuU3RyZWFtOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbDsKKworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGdldFRva2VuU291cmNlOworLSAodm9pZCkgc2V0VG9rZW5Tb3VyY2U6IChpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIExUOihOU0ludGVnZXIpazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKWs7CisKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnM6KE5TSW50ZWdlcikgaTsKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnNSZXZlcnNlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpc2V0dXA7CisKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2U7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIGluQml0U2V0OihBTlRMUkJpdFNldCAqKWFCaXRTZXQ7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGhUeXBlczooTlNBcnJheSAqKXRva2VuVHlwZXM7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGhUeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcilpOworCistIChOU0ludGVnZXIpIHNpemU7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpbWFya2VyOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKWluZGV4OworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnRJbmRleCBUb0VuZDooTlNJbnRlZ2VyKXN0b3BJbmRleDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlcilnZXRDaGFubmVsOworLSAodm9pZClzZXRDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKE5TTXV0YWJsZURpY3Rpb25hcnkgKilnZXRDaGFubmVsT3ZlcnJpZGU7CistICh2b2lkKXNldENoYW5uZWxPdmVycmlkZTooTlNNdXRhYmxlRGljdGlvbmFyeSAqKWFuT3ZlcnJpZGU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25UcmVlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5NjYwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZS5oCkBAIC0wLDAgKzEsODggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZSA6IEFOVExSQmFzZVRyZWUgPEFOVExSVHJlZT4geworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuOworCU5TSW50ZWdlciBzdGFydEluZGV4OworCU5TSW50ZWdlciBzdG9wSW5kZXg7CisgICAgQU5UTFJDb21tb25UcmVlICpwYXJlbnQ7CisgICAgTlNJbnRlZ2VyIGNoaWxkSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QU5UTFJDb21tb25Ub2tlbiwgc2V0dGVyPXNldEFOVExSQ29tbW9uVG9rZW4pIEFOVExSQ29tbW9uVG9rZW4gKnRva2VuOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlblN0YXJ0SW5kZXgsIHNldHRlcj1zZXRUb2tlblN0YXJ0SW5kZXgpIE5TSW50ZWdlciBzdGFydEluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlblN0b3BJbmRleCwgc2V0dGVyPXNldFRva2VuU3RvcEluZGV4KSBOU0ludGVnZXIgc3RvcEluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQYXJlbnQsIHNldHRlcj1zZXRQYXJlbnQ6KSBBTlRMUkNvbW1vblRyZWUgKnBhcmVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hpbGRJbmRleCwgc2V0dGVyPXNldENoaWxkSW5kZXgpIE5TSW50ZWdlciBjaGlsZEluZGV4OworCisrIChBTlRMUkNvbW1vblRyZWUgKikgaW52YWxpZE5vZGU7CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3QU5UTFJDb21tb25UcmVlOworKyAoQU5UTFJDb21tb25UcmVlICopIG5ld0FOVExSQ29tbW9uVHJlZVdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKyNpZmRlZiBET05UVVNFWUVUCisrIChpZDxBTlRMUlRyZWU+KSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdG9rZW5UZXh0OworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisjZW5kaWYKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlTm9kZTooQU5UTFJDb21tb25UcmVlICopYU5vZGU7CistIChpZCkgaW5pdFdpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGU7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoaWQ8QU5UTFJUcmVlPikgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoQk9PTCkgaXNOaWw7CisKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgZ2V0VG9rZW47CistICh2b2lkKSBzZXRUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKGlkPEFOVExSVHJlZT4pIGR1cE5vZGU7CistIChOU0ludGVnZXIpIGdldFR5cGU7CistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAoTlNVSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBnZXRQYXJlbnQ7CistICh2b2lkKSBzZXRQYXJlbnQ6KEFOVExSQ29tbW9uVHJlZSAqKSB0OworCisjaWZkZWYgRE9OVFVTRU5PTU8KKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKyNlbmRpZgorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistICh2b2lkKSBzZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6IChOU0ludGVnZXIpIGFTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OiAoTlNJbnRlZ2VyKSBhU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzMjg3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaApAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25UcmVlQWRhcHRvciA6IEFOVExSQmFzZVRyZWVBZGFwdG9yIHsKK30KKworKyAoaWQ8QU5UTFJUcmVlPikgbmV3RW1wdHlUcmVlOworKyAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKW5ld0FOVExSQ29tbW9uVHJlZUFkYXB0b3I7CistIChpZCkgaW5pdDsKKy0gKGlkPEFOVExSVHJlZT4pZHVwTm9kZTooaWQ8QU5UTFJUcmVlPil0OyAgICAKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWNyZWF0ZVRyZWU6KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CistIChBTlRMUkNvbW1vblRyZWUgKiljcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKHZvaWQpIHNldFRva2VuQm91bmRhcmllczooaWQ8QU5UTFJUcmVlPil0IEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4gVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0YXJ0SW5kZXg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0b3BJbmRleDooaWQ8QU5UTFJUcmVlPil0OworLSAoTlNTdHJpbmcgKilnZXRUZXh0OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKXNldFRleHQ6KGlkPEFOVExSVHJlZT4pdCBUZXh0OihOU1N0cmluZyAqKXRleHQ7CistIChOU0ludGVnZXIpZ2V0VHlwZTooaWQ8QU5UTFJUcmVlPil0OworLSAodm9pZCkgc2V0VHlwZTooaWQ8QU5UTFJUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGU7CistIChpZDxBTlRMUlRva2VuPilnZXRUb2tlbjooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQ8QU5UTFJUcmVlPilnZXRDaGlsZDooaWQ8QU5UTFJUcmVlPil0IEF0OihOU0ludGVnZXIpaTsKKy0gKHZvaWQpIHNldENoaWxkOihpZDxBTlRMUlRyZWU+KXQgQXQ6KE5TSW50ZWdlcilpIENoaWxkOihpZDxBTlRMUlRyZWU+KWNoaWxkOworLSAoTlNJbnRlZ2VyKWdldENoaWxkQ291bnQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKGlkPEFOVExSVHJlZT4pZ2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKXNldFBhcmVudDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KGlkPEFOVExSVHJlZT4pcGFyZW50OworLSAoTlNJbnRlZ2VyKWdldENoaWxkSW5kZXg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpc2V0Q2hpbGRJbmRleDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KE5TSW50ZWdlcilpbmRleDsKKy0gKHZvaWQpcmVwbGFjZUNoaWxkcmVuOihpZDxBTlRMUlRyZWU+KXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjNjhmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDExNiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0gOiBBTlRMUkxvb2thaGVhZFN0cmVhbSA8QU5UTFJUcmVlTm9kZVN0cmVhbT4geworI2RlZmluZSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgMTAwCisjZGVmaW5lIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFIDEwCisgICAgCisvKiogUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/ICovCitpZCByb290OworICAgIAorLyoqIElmIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuICovCitpZCA8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworICAgIAorCS8qKiBXaGF0IHRyZWUgYWRhcHRvciB3YXMgdXNlZCB0byBidWlsZCB0aGVzZSB0cmVlcyAqLworQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKyAgICAKKy8qKiBUaGUgdHJlZSBpdGVyYXRvciB3ZSB1c2luZyAqLworQU5UTFJUcmVlSXRlcmF0b3IgKml0OworICAgIAorLyoqIFN0YWNrIG9mIGluZGV4ZXMgdXNlZCBmb3IgcHVzaC9wb3AgY2FsbHMgKi8KK0FOVExSSW50QXJyYXkgKmNhbGxzOyAgICAKKyAgICAKKy8qKiBUcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zICovCitCT09MIGhhc05pbFJvb3Q7CisgICAgCisvKiogVHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC4gKi8KK05TSW50ZWdlciBsZXZlbDsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Um9vdCwgc2V0dGVyPXNldFJvb3Q6KSBBTlRMUkNvbW1vblRyZWUgKnJvb3Q7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VucyxzZXR0ZXI9c2V0VG9rZW5zOikgaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlQWRhcHRvciwgc2V0dGVyPXNldFRyZWVBZGFwdG9yOikgQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKyAgICAKKy0gKHZvaWQpIHJlc2V0OworICAgIAorICAgIC8qKiBQdWxsIGVsZW1lbnRzIGZyb20gdHJlZSBpdGVyYXRvci4gIFRyYWNrIHRyZWUgbGV2ZWwgMC4ubWF4X2xldmVsLgorICAgICAqICBJZiBuaWwgcm9vdGVkIHRyZWUsIGRvbid0IGdpdmUgaW5pdGlhbCBuaWwgYW5kIERPV04gbm9yIGZpbmFsIFVQLgorICAgICAqLworLSAoaWQpIG5leHRFbGVtZW50OworICAgIAorLSAoQk9PTCkgaXNFT0Y6KGlkPEFOVExSVHJlZT4pIG87CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICAKKy0gKGlkKSBnZXRUcmVlU291cmNlOworICAgIAorLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKyAgICAKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRUb2tlblN0cmVhbTsKKyAgICAKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPikgdG9rZW5zOworICAgIAorLSAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKSBnZXRUcmVlQWRhcHRvcjsKKyAgICAKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopIGFkYXB0b3I7CisgICAgCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisgICAgCisgICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisgICAgICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXROb2RlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgaW5kZXg7CisgICAgCisgICAgLyoqIFNlZWsgYmFjayB0byBwcmV2aW91cyBpbmRleCBzYXZlZCBkdXJpbmcgbGFzdCBwdXNoKCkgY2FsbC4KKyAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgKi8KKy0gKE5TSW50ZWdlcikgcG9wOworICAgIAorLy8gVFJFRSBSRVdSSVRFIElOVEVSRkFDRQorICAgIAorLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworICAgIAorLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQ8QU5UTFJUcmVlPilzdGFydE5vZGUgVG9Ob2RlOihpZDxBTlRMUlRyZWU+KXN0b3BOb2RlOworCisvKiogRm9yIGRlYnVnZ2luZzsgZGVzdHJ1Y3RpdmU6IG1vdmVzIHRyZWUgaXRlcmF0b3IgdG8gZW5kLiAqLworLSAoTlNTdHJpbmcgKikgdG9Ub2tlblR5cGVTdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJERkEuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJERkEuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MDk0YTNkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRGQS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJERkEgOiBOU09iamVjdCB7CisJLy8gdGhlIHRhYmxlcyBhcmUgc2V0IGJ5IHN1YmNsYXNzZXMgdG8gdGhlaXIgb3duIHN0YXRpYyB2ZXJzaW9ucy4KKwljb25zdCBpbnQgKmVvdDsKKwljb25zdCBpbnQgKmVvZjsKKwljb25zdCB1bmljaGFyICptaW47CisJY29uc3QgdW5pY2hhciAqbWF4OworCWNvbnN0IGludCAqYWNjZXB0OworCWNvbnN0IGludCAqc3BlY2lhbDsKKwljb25zdCBpbnQgKip0cmFuc2l0aW9uOworCQorCUFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CisJTlNJbnRlZ2VyIGRlY2lzaW9uTnVtYmVyOworICAgIE5TSW50ZWdlciBsZW47Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UmVjb2duaXplcixzZXR0ZXI9c2V0UmVjb2duaXplcjopIEFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldERlY2lzaW9uLHNldHRlcj1zZXREZWNpc2lvbjopIE5TSW50ZWdlciBkZWNpc2lvbk51bWJlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGVuLHNldHRlcj1zZXRMZW46KSBOU0ludGVnZXIgbGVuOworCistIChpZCkgaW5pdFdpdGhSZWNvZ25pemVyOihpZCkgdGhlUmVjb2duaXplcjsKKy8vIHNpbXVsYXRlIHRoZSBERkEgdXNpbmcgdGhlIHN0YXRpYyB0YWJsZXMgYW5kIHByZWRpY3QgYW4gYWx0ZXJuYXRpdmUKKy0gKE5TSW50ZWdlcikgcHJlZGljdDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0OworLSAodm9pZCkgbm9WaWFibGVBbHQ6KE5TSW50ZWdlcilzdGF0ZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCistIChOU0ludGVnZXIpIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb246KE5TSW50ZWdlcilzdGF0ZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworLy8gLSAoTlNJbnRlZ2VyKSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uOihOU0ludGVnZXIpIHN0YXRlOworLy8tICh1bmljaGFyKSBzcGVjaWFsVHJhbnNpdGlvbjoodW5pY2hhcikgc3RhdGUgc3ltYm9sOihOU0ludGVnZXIpIHN5bWJvbDsKKworLy8gaG9vayBmb3IgZGVidWdnZXIgc3VwcG9ydAorLSAodm9pZCkgZXJyb3I6KEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKiludmFlOworCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworCisrICh2b2lkKSBzZXRJc0VtaXR0aW5nRGVidWdJbmZvOihCT09MKSBzaG91bGRFbWl0RGVidWdJbmZvOworCistIChOU0ludGVnZXIpZ2V0RGVjaXNpb247CistICh2b2lkKXNldERlY2lzaW9uOihOU0ludGVnZXIpYURlY2lzb247CisKKy0gKEFOVExSQmFzZVJlY29nbml6ZXIgKilnZXRSZWNvZ25pemVyOworLSAodm9pZClzZXRSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopYVJlY29nbml6ZXI7CistIChOU0ludGVnZXIpbGVuZ3RoOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWcuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3MzgzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWcuaApAQCAtMCwwICsxLDMzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudExpc3RlbmVyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1BhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZVBhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmJlZTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oCkBAIC0wLDAgKzEsMjc1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0Bwcm90b2NvbCBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lciAKKworI2RlZmluZSBBTlRMUkRlYnVnUHJvdG9jb2xWZXJzaW9uIDEKKworLyoqIFRoZSBwYXJzZXIgaGFzIGp1c3QgZW50ZXJlZCBhIHJ1bGUuICBObyBkZWNpc2lvbiBoYXMgYmVlbiBtYWRlIGFib3V0CisqICB3aGljaCBhbHQgaXMgcHJlZGljdGVkLiAgVGhpcyBpcyBmaXJlZCBBRlRFUiBpbml0IGFjdGlvbnMgaGF2ZSBiZWVuCisqICBleGVjdXRlZC4gIEF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgYW5kIGF2YWlsYWJsZSBldGMuLi4KKyovCistICh2b2lkKSBlbnRlclJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CisKKy8qKiBCZWNhdXNlIHJ1bGVzIGNhbiBoYXZlIGxvdHMgb2YgYWx0ZXJuYXRpdmVzLCBpdCBpcyB2ZXJ5IHVzZWZ1bCB0bworKiAga25vdyB3aGljaCBhbHQgeW91IGFyZSBlbnRlcmluZy4gIFRoaXMgaXMgMS4ubiBmb3IgbiBhbHRzLgorKi8KKy0gKHZvaWQpIGVudGVyQWx0OihOU0ludGVnZXIpYWx0OworCisvKiogVGhpcyBpcyB0aGUgbGFzdCB0aGluZyBleGVjdXRlZCBiZWZvcmUgbGVhdmluZyBhIHJ1bGUuICBJdCBpcworKiAgZXhlY3V0ZWQgZXZlbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgVGhpcyBpcyB0cmlnZ2VyZWQgYWZ0ZXIKKyogIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaGF2ZSBvY2N1cnJlZCAodW5sZXNzIHRoZSBleGNlcHRpb24gaXMKKwkJCQkJCQkJCQkJICAgKiAgbm90IGNhdWdodCBpbiB0aGlzIHJ1bGUpLiAgVGhpcyBpbXBsaWVzIGFuICJleGl0QWx0IiBldmVudC4KKyovCistICh2b2lkKSBleGl0UnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKworLyoqIFRyYWNrIGVudHJ5IGludG8gYW55ICguLi4pIHN1YnJ1bGUgb3RoZXIgRUJORiBjb25zdHJ1Y3QgKi8KKy0gKHZvaWQpIGVudGVyU3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCistICh2b2lkKSBleGl0U3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCisvKiogRXZlcnkgZGVjaXNpb24sIGZpeGVkIGsgb3IgYXJiaXRyYXJ5LCBoYXMgYW4gZW50ZXIvZXhpdCBldmVudAorKiAgc28gdGhhdCBhIEdVSSBjYW4gZWFzaWx5IHRyYWNrIHdoYXQgTFQvY29uc3VtZSBldmVudHMgYXJlCisqICBhc3NvY2lhdGVkIHdpdGggcHJlZGljdGlvbi4gIFlvdSB3aWxsIHNlZSBhIHNpbmdsZSBlbnRlci9leGl0CisqICBzdWJydWxlIGJ1dCBtdWx0aXBsZSBlbnRlci9leGl0IGRlY2lzaW9uIGV2ZW50cywgb25lIGZvciBlYWNoCisqICBsb29wIGl0ZXJhdGlvbi4KKyovCistICh2b2lkKSBlbnRlckRlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisKKy0gKHZvaWQpIGV4aXREZWNpc2lvbjooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCisvKiogQW4gaW5wdXQgdG9rZW4gd2FzIGNvbnN1bWVkOyBtYXRjaGVkIGJ5IGFueSBraW5kIG9mIGVsZW1lbnQuCisqICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKworLyoqIEFuIG9mZi1jaGFubmVsIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZC4KKyogIFRyaWdnZXIgYWZ0ZXIgdGhlIHRva2VuIHdhcyBtYXRjaGVkIGJ5IHRoaW5ncyBsaWtlIG1hdGNoKCksIG1hdGNoQW55KCkuCisqICAodW5sZXNzIG9mIGNvdXJzZSB0aGUgaGlkZGVuIHRva2VuIGlzIGZpcnN0IHN0dWZmIGluIHRoZSBpbnB1dCBzdHJlYW0pLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVIaWRkZW5Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKworLyoqIFNvbWVib2R5IChhbnlib2R5KSBsb29rZWQgYWhlYWQuICBOb3RlIHRoYXQgdGhpcyBhY3R1YWxseSBnZXRzCisqICB0cmlnZ2VyZWQgYnkgYm90aCBMQSBhbmQgTFQgY2FsbHMuICBUaGUgZGVidWdnZXIgd2lsbCB3YW50IHRvIGtub3cKKyogIHdoaWNoIFRva2VuIG9iamVjdCB3YXMgZXhhbWluZWQuICBMaWtlIGNvbnN1bWVUb2tlbiwgdGhpcyBpbmRpY2F0ZXMKKyogIHdoYXQgdG9rZW4gd2FzIHNlZW4gYXQgdGhhdCBkZXB0aC4gIEEgcmVtb3RlIGRlYnVnZ2VyIGNhbm5vdCBsb29rCisqICBhaGVhZCBpbnRvIGEgZmlsZSBpdCBkb2Vzbid0IGhhdmUgc28gTFQgZXZlbnRzIG11c3QgcGFzcyB0aGUgdG9rZW4KKyogIGV2ZW4gaWYgdGhlIGluZm8gaXMgcmVkdW5kYW50LgorKi8KKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0OworCisvKiogVGhlIHBhcnNlciBpcyBnb2luZyB0byBsb29rIGFyYml0cmFyaWx5IGFoZWFkOyBtYXJrIHRoaXMgbG9jYXRpb24sCisqICB0aGUgdG9rZW4gc3RyZWFtJ3MgbWFya2VyIGlzIHNlbnQgaW4gY2FzZSB5b3UgbmVlZCBpdC4KKyovCistICh2b2lkKSBtYXJrOihOU0ludGVnZXIpbWFya2VyOworCisvKiogQWZ0ZXIgYW4gYXJiaXRyYWlybHkgbG9uZyBsb29rYWhlYWQgYXMgd2l0aCBhIGN5Y2xpYyBERkEgKG9yIHdpdGgKKyogIGFueSBiYWNrdHJhY2spLCB0aGlzIGluZm9ybXMgdGhlIGRlYnVnZ2VyIHRoYXQgc3RyZWFtIHNob3VsZCBiZQorKiAgcmV3b3VuZCB0byB0aGUgcG9zaXRpb24gYXNzb2NpYXRlZCB3aXRoIG1hcmtlci4KKyovCistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlciltYXJrZXI7CisKKy8qKiBSZXdpbmQgdG8gdGhlIGlucHV0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hcmtlci4KKyogIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0CisqICBiZWZvcmUgc3RhcnRpbmcgYSBzZW0vc3luIHByZWRpY2F0ZSB0byBnZXQgdGhlCisqICBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGVjaXNpb24uCisqICBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgbWFyayhpKQorKiAgYW5kIHJld2luZChpKSBzaG91bGQgYmFsYW5jZSBzdGlsbC4KKyovCistICh2b2lkKSByZXdpbmQ7CisKKy0gKHZvaWQpIGJlZ2luQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWw7CisKKy0gKHZvaWQpIGVuZEJhY2t0cmFjazooTlNJbnRlZ2VyKWxldmVsIHdhc1N1Y2Nlc3NmdWw6KEJPT0wpc3VjY2Vzc2Z1bDsKKworLyoqIFRvIHdhdGNoIGEgcGFyc2VyIG1vdmUgdGhyb3VnaCB0aGUgZ3JhbW1hciwgdGhlIHBhcnNlciBuZWVkcyB0bworKiAgaW5mb3JtIHRoZSBkZWJ1Z2dlciB3aGF0IGxpbmUvY2hhclBvcyBpdCBpcyBwYXNzaW5nIGluIHRoZSBncmFtbWFyLgorKiAgRm9yIG5vdywgdGhpcyBkb2VzIG5vdCBrbm93IGhvdyB0byBzd2l0Y2ggZnJvbSBvbmUgZ3JhbW1hciB0byB0aGUKKyogIG90aGVyIGFuZCBiYWNrIGZvciBpc2xhbmQgZ3JhbW1hcnMgZXRjLi4uCisqCisqICBUaGlzIHNob3VsZCBhbHNvIGFsbG93IGJyZWFrcG9pbnRzIGJlY2F1c2UgdGhlIGRlYnVnZ2VyIGNhbiBzdG9wCisqICB0aGUgcGFyc2VyIHdoZW5ldmVyIGl0IGhpdHMgdGhpcyBsaW5lL3Bvcy4KKyovCistICh2b2lkKSBsb2NhdGlvbkxpbmU6KE5TSW50ZWdlcilsaW5lIGNvbHVtbjooTlNJbnRlZ2VyKXBvczsKKworLyoqIEEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFeGNlcHRpb24uICBJIG1hZGUKKyogIHRoaXMgYSBnZW5lcmljIGV2ZW50IHNvIHRoYXQgSSBjYW4gYWx0ZXIgdGhlIGV4Y2VwdGlvbiBoaWVyYWNoeSBsYXRlcgorKiAgd2l0aG91dCBoYXZpbmcgdG8gYWx0ZXIgYWxsIHRoZSBkZWJ1ZyBvYmplY3RzLgorKgorKiAgVXBvbiBlcnJvciwgdGhlIHN0YWNrIG9mIGVudGVyIHJ1bGUvc3VicnVsZSBtdXN0IGJlIHByb3Blcmx5IHVud291bmQuCisqICBJZiBubyB2aWFibGUgYWx0IG9jY3VycyBpdCBpcyB3aXRoaW4gYW4gZW50ZXIvZXhpdCBkZWNpc2lvbiwgd2hpY2gKKyogIGFsc28gbXVzdCBiZSByZXdvdW5kLiAgRXZlbiB0aGUgcmV3aW5kIGZvciBlYWNoIG1hcmsgbXVzdCBiZSB1bndvdW50LgorKiAgSW4gdGhlIEphdmEgdGFyZ2V0IHRoaXMgaXMgcHJldHR5IGVhc3kgdXNpbmcgdHJ5L2ZpbmFsbHksIGlmIGEgYml0CisqICB1Z2x5IGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRoZSByZXdpbmQgaXMgZ2VuZXJhdGVkIGluIERGQS5wcmVkaWN0KCkKKyogIGFjdHVhbGx5IHNvIG5vIGNvZGUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGF0LiAgRm9yIGxhbmd1YWdlcworKiAgdy9vIHRoaXMgImZpbmFsbHkiIGZlYXR1cmUgKEMrKz8pLCB0aGUgdGFyZ2V0IGltcGxlbWVudG9yIHdpbGwgaGF2ZQorKiAgdG8gYnVpbGQgYW4gZXZlbnQgc3RhY2sgb3Igc29tZXRoaW5nLgorKgorKiAgQWNyb3NzIGEgc29ja2V0IGZvciByZW1vdGUgZGVidWdnaW5nLCBvbmx5IHRoZSBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorKiAgZGF0YSBmaWVsZHMgYXJlIHRyYW5zbWl0dGVkLiAgVGhlIHRva2VuIG9iamVjdCBvciB3aGF0ZXZlciB0aGF0CisqICBjYXVzZWQgdGhlIHByb2JsZW0gd2FzIHRoZSBsYXN0IG9iamVjdCByZWZlcmVuY2VkIGJ5IExULiAgVGhlCisqICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgTFQgZXZlbnQgc2hvdWxkIGhvbGQgdGhlIHVuZXhwZWN0ZWQgVG9rZW4gb3IKKyogIGNoYXIuCisqCisqICBIZXJlIGlzIGEgc2FtcGxlIGV2ZW50IHRyYWNlIGZvciBncmFtbWFyOgorKgorKiAgYiA6IEMgKHs7fUF8QikgLy8gezt9IGlzIHRoZXJlIHRvIHByZXZlbnQgQXxCIGJlY29taW5nIGEgc2V0CisqICAgIHwgRAorKiAgICA7CisqCisqICBUaGUgc2VxdWVuY2UgZm9yIHRoaXMgcnVsZSAod2l0aCBubyB2aWFibGUgYWx0IGluIHRoZSBzdWJydWxlKSBmb3IKKyogIGlucHV0ICdjIGMnICh0aGVyZSBhcmUgMyB0b2tlbnMpIGlzOgorKgorKgkJY29tbWVuY2UKKyoJCUxUKDEpCisqCQllbnRlclJ1bGUgYgorKgkJbG9jYXRpb24gNyAxCisqCQllbnRlciBkZWNpc2lvbiAzCisqCQlMVCgxKQorKgkJZXhpdCBkZWNpc2lvbiAzCisqCQllbnRlckFsdDEKKyoJCWxvY2F0aW9uIDcgNQorKgkJTFQoMSkKKyoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMTowXQorKgkJbG9jYXRpb24gNyA3CisqCQllbnRlclN1YlJ1bGUgMgorKgkJZW50ZXIgZGVjaXNpb24gMgorKgkJTFQoMSkKKyoJCUxUKDEpCisqCQlyZWNvZ25pdGlvbkV4Y2VwdGlvbiBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAyIDEgMgorKgkJZXhpdCBkZWNpc2lvbiAyCisqCQlleGl0U3ViUnVsZSAyCisqCQliZWdpblJlc3luYworKgkJTFQoMSkKKyoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMToxXQorKgkJTFQoMSkKKyoJCWVuZFJlc3luYworKgkJTFQoLTEpCisqCQlleGl0UnVsZSBiCisqCQl0ZXJtaW5hdGUKKyovCistICh2b2lkKSByZWNvZ25pdGlvbkV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CisKKy8qKiBJbmRpY2F0ZXMgdGhlIHJlY29nbml6ZXIgaXMgYWJvdXQgdG8gY29uc3VtZSB0b2tlbnMgdG8gcmVzeW5jaHJvbml6ZQorKiAgdGhlIHBhcnNlci4gIEFueSBjb25zdW1lIGV2ZW50cyBmcm9tIGhlcmUgdW50aWwgdGhlIHJlY292ZXJlZCBldmVudAorKiAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXJzZS0tdGhleSBhcmUgZGVhZCB0b2tlbnMuCisqLworLSAodm9pZCkgYmVnaW5SZXN5bmM7CisKKy8qKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb2duaXplciBoYXMgZmluaXNoZWQgY29uc3VtaW5nIHRva2VucyBpbiBvcmRlcgorKiAgdG8gcmVzeWNocm9uaXplLiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIGJlZ2luUmVzeW5jL2VuZFJlc3luYyBwYWlycworKiAgYmVmb3JlIHRoZSByZWNvZ25pemVyIGNvbWVzIG91dCBvZiBlcnJvclJlY292ZXJ5IG1vZGUgKGluIHdoaWNoCisqICBtdWx0aXBsZSBlcnJvcnMgYXJlIHN1cHByZXNzZWQpLiAgVGhpcyB3aWxsIGJlIHVzZWZ1bAorKiAgaW4gYSBndWkgd2hlcmUgeW91IHdhbnQgdG8gcHJvYmFibHkgZ3JleSBvdXQgdG9rZW5zIHRoYXQgYXJlIGNvbnN1bWVkCisqICBidXQgbm90IG1hdGNoZWQgdG8gYW55dGhpbmcgaW4gZ3JhbW1hci4gIEFueXRoaW5nIGJldHdlZW4KKyogIGEgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXIgd2FzIHRvc3NlZCBvdXQgYnkgdGhlIHBhcnNlci4KKyovCistICh2b2lkKSBlbmRSZXN5bmM7CisKKy8qKiBBIHNlbWFudGljIHByZWRpY2F0ZSB3YXMgZXZhbHVhdGUgd2l0aCB0aGlzIHJlc3VsdCBhbmQgYWN0aW9uIHRleHQgKi8KKy0gKHZvaWQpIHNlbWFudGljUHJlZGljYXRlOihOU1N0cmluZyAqKXByZWRpY2F0ZSBtYXRjaGVkOihCT09MKXJlc3VsdDsKKworLyoqIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKyogIHNlbmRpbmcgZXZlbnRzIG92ZXIgYSBzb2NrZXQuICBBIEdVSSBmb3IgZXhhbXBsZSB3aWxsIGxhdW5jaCBhIHRocmVhZAorKiAgdG8gY29ubmVjdCBhbmQgY29tbXVuaWNhdGUgd2l0aCBhIHJlbW90ZSBwYXJzZXIuICBUaGUgdGhyZWFkIHdpbGwgd2FudAorKiAgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKyogIHRyaWdnZXIgdGhpcyB1cG9uIGVudHJ5IHRvIHRoZSBmaXJzdCBydWxlICh0aGUgcnVsZUxldmVsIGlzIHVzZWQgdG8KKyogIGZpZ3VyZSB0aGlzIG91dCkuCisqLworLSAodm9pZCkgY29tbWVuY2U7CisKKy8qKiBQYXJzaW5nIGlzIG92ZXI7IHN1Y2Nlc3NmdWxseSBvciBub3QuICBNb3N0bHkgdXNlZnVsIGZvciB0ZWxsaW5nCisqICByZW1vdGUgZGVidWdnaW5nIGxpc3RlbmVycyB0aGF0IGl0J3MgdGltZSB0byBxdWl0LiAgV2hlbiB0aGUgcnVsZQorKiAgaW52b2NhdGlvbiBsZXZlbCBnb2VzIHRvIHplcm8gYXQgdGhlIGVuZCBvZiBhIHJ1bGUsIHdlIGFyZSBkb25lCisqICBwYXJzaW5nLgorKi8KKy0gKHZvaWQpIHRlcm1pbmF0ZTsKKworCisvLyBUIHIgZSBlICBQIGEgciBzIGkgbiBnCisKKy8qKiBJbnB1dCBmb3IgYSB0cmVlIHBhcnNlciBpcyBhbiBBU1QsIGJ1dCB3ZSBrbm93IG5vdGhpbmcgZm9yIHN1cmUKKyogIGFib3V0IGEgbm9kZSBleGNlcHQgaXRzIHR5cGUgYW5kIHRleHQgKG9idGFpbmVkIGZyb20gdGhlIGFkYXB0b3IpLgorKiAgVGhpcyBpcyB0aGUgYW5hbG9nIG9mIHRoZSBjb25zdW1lVG9rZW4gbWV0aG9kLiAgQWdhaW4sIHRoZSBJRCBpcworKiAgdGhlIGhhc2hDb2RlIHVzdWFsbHkgb2YgdGhlIG5vZGUgc28gaXQgb25seSB3b3JrcyBpZiBoYXNoQ29kZSBpcworKiAgbm90IGltcGxlbWVudGVkLiAgSWYgdGhlIHR5cGUgaXMgVVAgb3IgRE9XTiwgdGhlbgorKiAgdGhlIElEIGlzIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCBhcyBpdCdzIGZpeGVkLS10aGVyZSBpcworKiAganVzdCBvbmUgVVAgbm9kZSBhbmQgb25lIERPV04gbmF2aWdhdGlvbiBub2RlLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVOb2RlOihOU0ludGVnZXIpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKy8qKiBUaGUgdHJlZSBwYXJzZXIgbG9va2VkYWhlYWQuICBJZiB0aGUgdHlwZSBpcyBVUCBvciBET1dOLAorKiAgdGhlbiB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisqLworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKworLy8gQSBTIFQgIEUgdiBlIG4gdCBzCisKKy8qKiBBIG5pbCB3YXMgY3JlYXRlZCAoZXZlbiBuaWwgbm9kZXMgaGF2ZSBhIHVuaXF1ZSBJRC4uLgorKiAgdGhleSBhcmUgbm90ICJudWxsIiBwZXIgc2UpLiAgQXMgb2YgNC8yOC8yMDA2LCB0aGlzCisqICBzZWVtcyB0byBiZSB1bmlxdWVseSB0cmlnZ2VyZWQgd2hlbiBzdGFydGluZyBhIG5ldyBzdWJ0cmVlCisqICBzdWNoIGFzIHdoZW4gZW50ZXJpbmcgYSBzdWJydWxlIGluIGF1dG9tYXRpYyBtb2RlIGFuZCB3aGVuCisqICBidWlsZGluZyBhIHRyZWUgaW4gcmV3cml0ZSBtb2RlLgorKi8KKy0gKHZvaWQpIGNyZWF0ZU5pbE5vZGU6KHVuc2lnbmVkKWhhc2g7CisKKy8qKiBBbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gdGV4dCAqLworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCB0ZXh0OihOU1N0cmluZyAqKXRleHQgdHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy8qKiBBbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gYW4gZXhpc3RpbmcgdG9rZW4gKi8KKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggZnJvbVRva2VuQXRJbmRleDooTlNJbnRlZ2VyKXRva2VuSW5kZXg7CisKKy8qKiBNYWtlIGEgbm9kZSB0aGUgbmV3IHJvb3Qgb2YgYW4gZXhpc3Rpbmcgcm9vdC4gIFNlZQorKgorKiAgTm90ZTogdGhlIG5ld1Jvb3RJRCBwYXJhbWV0ZXIgaXMgcG9zc2libHkgZGlmZmVyZW50CisqICB0aGFuIHRoZSBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgbmV3Um9vdCBwYXJhbWV0ZXIuCisqICBJbiBvdXIgY2FzZSwgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisqICBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgYW5kIG5vdCByb290X24gb3Igd2hhdGV2ZXIuCisqCisqICBUaGUgbGlzdGVuZXIgc2hvdWxkIGFzc3VtZSB0aGF0IHRoaXMgZXZlbnQgb2NjdXJzCisqICBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgc3VicnVsZSAob3IgcnVsZSkgc3VidHJlZSBpcworKiAgYmVpbmcgcmVzZXQgdG8gbmV3Um9vdElELgorKgorKi8KKy0gKHZvaWQpIG1ha2VOb2RlOih1bnNpZ25lZCluZXdSb290SGFzaCBwYXJlbnRPZjoodW5zaWduZWQpb2xkUm9vdEhhc2g7CisKKy8qKiBNYWtlIGNoaWxkSUQgYSBjaGlsZCBvZiByb290SUQuCisqICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3IuYWRkQ2hpbGQoKQorKi8KKy0gKHZvaWQpIGFkZENoaWxkOih1bnNpZ25lZCljaGlsZEhhc2ggdG9UcmVlOih1bnNpZ25lZCl0cmVlSGFzaDsKKworLyoqIFNldCB0aGUgdG9rZW4gc3RhcnQvc3RvcCB0b2tlbiBpbmRleCBmb3IgYSBzdWJ0cmVlIHJvb3Qgb3Igbm9kZSAqLworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzRm9yVHJlZToodW5zaWduZWQpbm9kZUhhc2ggRnJvbTooTlNVSW50ZWdlcil0b2tlblN0YXJ0SW5kZXggVG86KE5TVUludGVnZXIpdG9rZW5TdG9wSW5kZXg7CisKKy0gKHZvaWQpIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb247CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OWJmNjdiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRQcm94eS5oCkBAIC0wLDAgKzEsMTEyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlBhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKyNpbXBvcnQgPHN5cy9zb2NrZXQuaD4KKyNpbXBvcnQgPG5ldGluZXQvaW4uaD4KKyNpbXBvcnQgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKy8vIGRlZmF1bHQgcG9ydCBmb3IgQU5UTFJXb3JrcworI2RlZmluZSBERUZBVUxUX0RFQlVHR0VSX1BPUlQgMHhDMDAxCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z0V2ZW50UHJveHkgOiBOU09iamVjdCA8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IHsKKwlpbnQgc2VydmVyU29ja2V0OworCQorCXN0cnVjdCBzb2NrYWRkciBkZWJ1Z2dlcl9zb2NrYWRkcjsKKwlzb2NrbGVuX3QgZGVidWdnZXJfc29ja2xlbjsKKwlpbnQgZGVidWdnZXJTb2NrZXQ7CisJTlNGaWxlSGFuZGxlICpkZWJ1Z2dlckZIOworCQorCU5TU3RyaW5nICpncmFtbWFyTmFtZTsKKwlpbnQgZGVidWdnZXJQb3J0OworfQorCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEdyYW1tYXJOYW1lOihOU1N0cmluZyAqKWFHcmFtbWFyTmFtZSBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilhUG9ydDsKKy0gKHZvaWQpIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb247CistICh2b2lkKSB3YWl0Rm9yQWNrOworLSAodm9pZCkgc2VuZFRvRGVidWdnZXI6KE5TU3RyaW5nICopbWVzc2FnZTsKKy0gKHZvaWQpIHNlbmRUb0RlYnVnZ2VyOihOU1N0cmluZyAqKW1lc3NhZ2Ugd2FpdEZvclJlc3BvbnNlOihCT09MKXdhaXQ7CisKKy0gKE5TSW50ZWdlcikgc2VydmVyU29ja2V0OworLSAodm9pZCkgc2V0U2VydmVyU29ja2V0OiAoTlNJbnRlZ2VyKSBhU2VydmVyU29ja2V0OworCistIChOU0ludGVnZXIpIGRlYnVnZ2VyU29ja2V0OworLSAodm9pZCkgc2V0RGVidWdnZXJTb2NrZXQ6IChOU0ludGVnZXIpIGFEZWJ1Z2dlclNvY2tldDsKKworLSAoTlNTdHJpbmcgKikgZ3JhbW1hck5hbWU7CistICh2b2lkKSBzZXRHcmFtbWFyTmFtZTogKE5TU3RyaW5nICopIGFHcmFtbWFyTmFtZTsKKworLSAoTlNJbnRlZ2VyKSBkZWJ1Z2dlclBvcnQ7CistICh2b2lkKSBzZXREZWJ1Z2dlclBvcnQ6IChOU0ludGVnZXIpIGFEZWJ1Z2dlclBvcnQ7CisKKy0gKE5TU3RyaW5nICopIGVzY2FwZU5ld2xpbmVzOihOU1N0cmluZyAqKWFTdHJpbmc7CisKKyNwcmFnbWEgbWFyayAtCisKKyNwcmFnbWEgbWFyayBEZWJ1Z0V2ZW50TGlzdGVuZXIgUHJvdG9jb2wKKy0gKHZvaWQpIGVudGVyUnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKy0gKHZvaWQpIGVudGVyQWx0OihOU0ludGVnZXIpYWx0OworLSAodm9pZCkgZXhpdFJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CistICh2b2lkKSBlbnRlclN1YlJ1bGU6KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpIGV4aXRTdWJSdWxlOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBlbnRlckRlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBleGl0RGVjaXNpb246KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpIGNvbnN1bWVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIGNvbnN1bWVIaWRkZW5Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgbWFyazooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIGJlZ2luQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWw7CistICh2b2lkKSBlbmRCYWNrdHJhY2s6KE5TSW50ZWdlcilsZXZlbCB3YXNTdWNjZXNzZnVsOihCT09MKXN1Y2Nlc3NmdWw7CistICh2b2lkKSBsb2NhdGlvbkxpbmU6KE5TSW50ZWdlcilsaW5lIGNvbHVtbjooTlNJbnRlZ2VyKXBvczsKKy0gKHZvaWQpIHJlY29nbml0aW9uRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLSAodm9pZCkgc2VtYW50aWNQcmVkaWNhdGU6KE5TU3RyaW5nICopcHJlZGljYXRlIG1hdGNoZWQ6KEJPT0wpcmVzdWx0OworLSAodm9pZCkgY29tbWVuY2U7CistICh2b2lkKSB0ZXJtaW5hdGU7CisKKworI3ByYWdtYSBtYXJrIFRyZWUgUGFyc2luZworLSAodm9pZCkgY29uc3VtZU5vZGU6KHVuc2lnbmVkKW5vZGVIYXNoIG9mVHlwZTooTlNJbnRlZ2VyKXR5cGUgdGV4dDooTlNTdHJpbmcgKil0ZXh0OworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKworI3ByYWdtYSBtYXJrIEFTVCBFdmVudHMKKworLSAodm9pZCkgY3JlYXRlTmlsTm9kZToodW5zaWduZWQpaGFzaDsKKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggdGV4dDooTlNTdHJpbmcgKil0ZXh0IHR5cGU6KE5TSW50ZWdlcil0eXBlOworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCBmcm9tVG9rZW5BdEluZGV4OihOU0ludGVnZXIpdG9rZW5JbmRleDsKKy0gKHZvaWQpIG1ha2VOb2RlOih1bnNpZ25lZCluZXdSb290SGFzaCBwYXJlbnRPZjoodW5zaWduZWQpb2xkUm9vdEhhc2g7CistICh2b2lkKSBhZGRDaGlsZDoodW5zaWduZWQpY2hpbGRIYXNoIHRvVHJlZToodW5zaWduZWQpdHJlZUhhc2g7CistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXNGb3JUcmVlOih1bnNpZ25lZClub2RlSGFzaCBGcm9tOihOU0ludGVnZXIpdG9rZW5TdGFydEluZGV4IFRvOihOU0ludGVnZXIpdG9rZW5TdG9wSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z1BhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRlYnVnUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjIzZmY1MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z1BhcnNlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z1BhcnNlciA6IEFOVExSUGFyc2VyIHsKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbTsKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSAgZGVidWdnZXJQb3J0OihOU0ludGVnZXIpcG9ydE51bWJlcjsKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pdGhlRGVidWdMaXN0ZW5lcgorCQkJICBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM1YjAwMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVG9rZW5TdHJlYW0gOiBOU09iamVjdCA8QU5UTFJUb2tlblN0cmVhbT4KK3sKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiBpbnB1dDsKKwlCT09MIGluaXRpYWxTdHJlYW1TdGF0ZTsKKyAgICBOU0ludGVnZXIgbGFzdE1hcmtlcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pZGVidWdnZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgZ2V0SW5wdXQ7CistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVRva2VuU3RyZWFtOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihOU0ludGVnZXIpaW5kZXg7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBnZXRUb2tlblNvdXJjZTsKKy0gKE5TU3RyaW5nICopIGdldFNvdXJjZU5hbWU7CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUb1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWdUcmVlQWRhcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxOTY1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWdUcmVlQWRhcHRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVHJlZUFkYXB0b3IgOiBBTlRMUkJhc2VUcmVlQWRhcHRvciB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6IChpZDxBTlRMUlRyZWVBZGFwdG9yPikgYVRyZWVBZGFwdG9yOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MGY5OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDY3IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbSA6IE5TT2JqZWN0IDxBTlRMUlRyZWVOb2RlU3RyZWFtPiB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7CisJQk9PTCBpbml0aWFsU3RyZWFtU3RhdGU7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWRlYnVnZ2VyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGdldElucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgYVRyZWVOb2RlU3RyZWFtOworCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjogKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhVHJlZUFkYXB0b3I7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVOb2RlU3RyZWFtIGNvbmZvcm1hbmNlCisKKy0gKGlkKSBMVDooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpZmxhZzsKKworI3ByYWdtYSBtYXJrIEFOVExSSW50U3RyZWFtIGNvbmZvcm1hbmNlCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNVSW50ZWdlcikgaTsKKy0gKE5TVUludGVnZXIpIG1hcms7CistIChOU1VJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKHZvaWQpIHJld2luZDooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVsZWFzZTooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNVSW50ZWdlcikgaW5kZXg7CistIChOU1VJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWdUcmVlUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRGVidWdUcmVlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2JlYWM3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWVQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudFByb3h5LmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVHJlZVBhcnNlciA6IEFOVExSVHJlZVBhcnNlciB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW07CistIChpZCkgaW5pdFdpdGhUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlU3RyZWFtCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXI7CisJLy8gZGVzaWduYXRlZCBpbml0aWFsaXplcgorLSAoaWQpIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZVN0cmVhbQorCQkJCWRlYnVnTGlzdGVuZXI6KGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPil0aGVEZWJ1Z0xpc3RlbmVyCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTg5YmJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKK30KKworKyAoQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0U3RyZWFtIGRlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpIGFEZWNpc2lvbk51bWJlcjsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW0gZGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcikgYURlY2lzaW9uTnVtYmVyOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRXJyb3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjU3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRXJyb3IuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSRXJyb3IuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMzAvMDMvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisjZGVmaW5lIEFOVExSRXJyb3JEb21haW4gQCJBTlRMUkVycm9yIgorCisjZGVmaW5lIEFOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEAiQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iCisjZGVmaW5lIEFOVExSSWxsZWdhbFN0YXRlRXhjZXB0aW9uIEAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIgorLy8jZGVmaW5lIEFOVExSUnVudGltZUV4Y2VwdGlvbiBAIlJ1bnRpbWVFeGNlcHRpb24iCisvLyNkZWZpbmUgQU5UTFJOb1N1Y2hNZXRob2RFeGNlcHRpb24gQCJOb1N1Y2hNZXRob2RFeGNlcHRpb24iCisvLyNkZWZpbmUgQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIEAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIKKy8vI2RlZmluZSBBTlRMUlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIEAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iCisKKworLyp0eXBlZGVmIGVudW0KK3sKKwlBTlRMUklsbGVnYWxTdGF0ZSA9IDEsCisJQU5UTFJJbGxlZ2FsQXJndW1lbnQgPSAyLAorCUFOVExSUmVjb2duaXRpb25FcnJvciA9IDMsCisJQU5UTFJNaXNzaW5nVG9rZW5FcnJvciA9IDQsCisJQU5UTFJVbndhbnRlZFRva2VuRXJyb3IgPSA1LAorCUFOVExSTWlzbWF0ZWNoZWRUb2tlbkVycm9yID0gNiwKKwlBTlRMUk5vVmlhYmxlQWx0RXJyb3IgPSA3CisJCit9IEFOVExSRXJyb3JDb2RlOyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3ODhjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKKworQGludGVyZmFjZSBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24KK3sKKwlOU1N0cmluZyAqcHJlZGljYXRlOworCU5TU3RyaW5nICpydWxlTmFtZTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQcmVkaWNhdGUsIHNldHRlcj1zZXRQcmVkaWNhdGU6KSBOU1N0cmluZyAqcHJlZGljYXRlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTmFtZSwgc2V0dGVyPXNldFJ1bGVOYW1lOikgTlNTdHJpbmcgKnJ1bGVOYW1lOworCisrIChBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoUnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWUgcHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CistIChBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiAqKSBpbml0V2l0aFJ1bGVOYW1lOihOU1N0cmluZyAqKXRoZVJ1bGVOYW1lIHByZWRpY2F0ZTooTlNTdHJpbmcgKil0aGVQcmVkaWNhdGUgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworCisjaWZkZWYgRE9OVFVTRVlFVAorLSAoTlNTdHJpbmcgKikgZ2V0UHJlZGljYXRlOworLSAodm9pZCkgc2V0UHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZTsKKy0gKE5TU3RyaW5nICopIGdldFJ1bGVOYW1lOworLSAodm9pZCkgc2V0UnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWU7CisjZW5kaWYKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkZhc3RRdWV1ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkZhc3RRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODE4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSRmFzdFF1ZXVlLmgKQEAgLTAsMCArMSw2OCBAQAorLy8KKy8vICBBTlRMUkZhc3RRdWV1ZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAyNi8wNC8yMDEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworCitAaW50ZXJmYWNlIEFOVExSRmFzdFF1ZXVlIDogTlNPYmplY3QgPE5TQ29weWluZz4KK3sKKwlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbDsKKwlOU011dGFibGVBcnJheSAqZGF0YTsKKwlOU0ludGVnZXIgcDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQb29sLCBzZXR0ZXI9c2V0UG9vbCkgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldERhdGEsIHNldHRlcj1zZXREYXRhKSBOU011dGFibGVBcnJheSAqZGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0UCwgc2V0dGVyPXNldFApIE5TSW50ZWdlciBwOworCisrIChpZCkgbmV3QU5UTFJGYXN0UXVldWU7CisKKy0gKGlkKSBpbml0OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAodm9pZCkgcmVzZXQ7CistIChpZCkgcmVtb3ZlOworLSAodm9pZCkgYWRkT2JqZWN0OihpZCkgbzsKKy0gKE5TSW50ZWdlcikgY291bnQ7CistIChOU0ludGVnZXIpIHNpemU7CistIChpZCkgaGVhZDsKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpIGk7CistICh2b2lkKSBjbGVhcjsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNBdXRvcmVsZWFzZVBvb2wgKilnZXRQb29sOworLSAodm9pZClzZXRQb29sOihOU0F1dG9yZWxlYXNlUG9vbCAqKWFQb29sOworLSAoTlNNdXRhYmxlQXJyYXkgKilnZXREYXRhOworLSAodm9pZClzZXREYXRhOihOU011dGFibGVBcnJheSAqKW15RGF0YTsKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6KE5TSW50ZWdlcilhbkludDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkhhc2hNYXAuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJIYXNoTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhY2E3YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJIYXNoTWFwLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vCisvLyAgQU5UTFJIYXNoTWFwLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKyNkZWZpbmUgTE9DQUxfU0NPUEUgICAgICAgIDEKKyNkZWZpbmUgSEFTSFNJWkUgICAgICAgICAxMDEKKyNkZWZpbmUgSEJVRlNJWkUgICAgICAweDIwMDAKKworQGludGVyZmFjZSBBTlRMUkhhc2hNYXAgOiBBTlRMUkxpbmtCYXNlIHsKKwkvLwlBTlRMUkhhc2hNYXAgKmZOZXh0OworICAgIC8vICAgIFRTdHJpbmdQb29sICpmUG9vbDsKKyAgICBOU0ludGVnZXIgU2NvcGU7CisgICAgTlNJbnRlZ2VyIExhc3RIYXNoOworICAgIE5TSW50ZWdlciBCdWZmU2l6ZTsKKyAgICBBTlRMUk1hcEVsZW1lbnQgKnB0ckJ1ZmZlcltIQVNIU0laRV07CisgICAgTlNJbnRlZ2VyIG1vZGU7Cit9CisKKy8vQHByb3BlcnR5IChjb3B5KSBBTlRMUkhhc2hNYXAgKmZOZXh0OworLy9AcHJvcGVydHkgKGNvcHkpIFRTdHJpbmdQb29sICpmUG9vbDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFNjb3BlLCBzZXR0ZXI9c2V0U2NvcGU6KSBOU0ludGVnZXIgU2NvcGU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoOikgTlNJbnRlZ2VyIExhc3RIYXNoOworCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyAoaWQpbmV3QU5UTFJIYXNoTWFwOworKyAoaWQpbmV3QU5UTFJIYXNoTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKy0gKEFOVExSSGFzaE1hcCAqKVB1c2hTY29wZTooIEFOVExSSGFzaE1hcCAqKiltYXA7CistIChBTlRMUkhhc2hNYXAgKilQb3BTY29wZTooIEFOVExSSGFzaE1hcCAqKiltYXA7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCisvKiAgICBmb3JtIGhhc2ggdmFsdWUgZm9yIHN0cmluZyBzICovCistIChOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKEFOVExSSGFzaE1hcCAqKWZpbmRzY29wZTooaW50KWxldmVsOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzIFNjb3BlOihpbnQpc2NvcGU7CisvKiAgIGxvb2sgZm9yIHMgaW4gcHRyQnVmZmVyICAqLworLSAoaWQpaW5zdGFsbDooQU5UTFJNYXBFbGVtZW50ICopc3ltIFNjb3BlOihpbnQpc2NvcGU7CisvKiAgIGxvb2sgZm9yIHMgaW4gcHRyQnVmZmVyICAqLworLSAodm9pZClkZWxldGVBTlRMUkhhc2hNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoaW50KVJlbW92ZVN5bTooTlNTdHJpbmcgKilzOworLSAodm9pZClkZWxldGVfY2hhaW46KEFOVExSTWFwRWxlbWVudCAqKW5wOworI2lmZGVmIERPTlRVU0VZRVQKKy0gKGludClibGRfc3ltdGFiOihLV19UQUJMRSAqKXRva25hbXM7CisjZW5kaWYKKy0gKEFOVExSTWFwRWxlbWVudCAqKilnZXRwdHJCdWZmZXI7CistIChBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooaW50KWlkeDsKKy0gKHZvaWQpc2V0cHRyQnVmZmVyOihBTlRMUk1hcEVsZW1lbnQgKilucCBJbmRleDooaW50KWlkeDsKKy0gKE5TSW50ZWdlcilnZXRTY29wZTsKKy0gKHZvaWQpc2V0U2NvcGU6KE5TSW50ZWdlcilpOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNJbnRlZ2VyKWdldE1vZGU7CistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZTsKKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZCkgc2V0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZClhZGRPYmplY3Q6KGlkKWFuT2JqZWN0OworLSAoQU5UTFJNYXBFbGVtZW50ICopIGdldE5hbWU6KE5TU3RyaW5nICopYU5hbWU7CistICh2b2lkKSBwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGU7CisKKy0gKE5TRW51bWVyYXRvciAqKW9iamVjdEVudW1lcmF0b3I7CistIChCT09MKSBoYXNOZXh0OworLSAoQU5UTFJNYXBFbGVtZW50ICopbmV4dE9iamVjdDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJIYXNoTWFwLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSSGFzaE1hcC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzQyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSSGFzaE1hcC5tCkBAIC0wLDAgKzEsNTIxIEBACisvLworLy8gIEFOVExSSGFzaE1hcC5tCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisKK3N0YXRpYyBOU0ludGVnZXIgaXRJbmRleDsKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaE1hcAorICovCitAaW1wbGVtZW50YXRpb24gQU5UTFJIYXNoTWFwCisKK0BzeW50aGVzaXplIFNjb3BlOworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwCit7CisgICAgQU5UTFJIYXNoTWFwICphTmV3QU5UTFJIYXNoTWFwOworICAgIAorICAgIGFOZXdBTlRMUkhhc2hNYXAgPSBbW0FOVExSSGFzaE1hcCBhbGxvY10gaW5pdF07CisJcmV0dXJuKCBhTmV3QU5UTFJIYXNoTWFwICk7Cit9CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZQoreworICAgIEFOVExSSGFzaE1hcCAqYU5ld0FOVExSSGFzaE1hcDsKKyAgICAKKyAgICBhTmV3QU5UTFJIYXNoTWFwID0gW1tBTlRMUkhhc2hNYXAgYWxsb2NdIGluaXRXaXRoTGVuOmFCdWZmU2l6ZV07CisJcmV0dXJuKCBhTmV3QU5UTFJIYXNoTWFwICk7Cit9CisKKy0oaWQpaW5pdAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJZk5leHQgPSBuaWw7CisgICAgICAgIEJ1ZmZTaXplID0gSEFTSFNJWkU7CisJCVNjb3BlID0gMDsKKwkJaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisJCQlTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworCQkJZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisJCQkJcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisJCQl9CisJCX0KKyAgICAgICAgbW9kZSA9IDA7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKyAgICAgICAgQnVmZlNpemUgPSBhQnVmZlNpemU7CisJCVNjb3BlID0gMDsKKwkJaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisJCQlTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworCQkJZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisJCQkJcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisJCQl9CisJCX0KKyAgICAgICAgbW9kZSA9IDA7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKHZvaWQpZGVhbGxvYworeworICAgIEFOVExSTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworCQorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCAmJiB0bXAgIT0gWygoQU5UTFJIYXNoTWFwICopZk5leHQpIGdldHB0ckJ1ZmZlckVudHJ5OmlkeF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICAvLyB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJNYXBFbGVtZW50ICopdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNJbnRlZ2VyKWNvdW50Cit7CisgICAgaWQgYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhQ250ID0gMDsKKyAgICAKKyAgICBmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgc2l6ZQoreworICAgIGlkIGFuRWxlbWVudDsKKyAgICBOU0ludGVnZXIgYVNpemUgPSAwOworICAgIAorICAgIGZvciAoTlNJbnRlZ2VyIGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0odm9pZClkZWxldGVBTlRMUkhhc2hNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXAsICpydG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICYmIHRtcCAhPSAoQU5UTFJMaW5rQmFzZSAqKVsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBnZXRwdHJCdWZmZXJFbnRyeTppZHhdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gW3RtcCBnZXRmTmV4dF07CisgICAgICAgICAgICAgICAgW3J0bXAgZGVhbGxvY107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy0oQU5UTFJIYXNoTWFwICopUHVzaFNjb3BlOihBTlRMUkhhc2hNYXAgKiopbWFwCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICBBTlRMUkhhc2hNYXAgKmh0bXA7CisgICAgCisgICAgaHRtcCA9IFtBTlRMUkhhc2hNYXAgbmV3QU5UTFJIYXNoTWFwXTsKKyAgICBpZiAoICptYXAgIT0gbmlsICkgeworICAgICAgICAoKEFOVExSSGFzaE1hcCAqKWh0bXApLT5mTmV4dCA9ICptYXA7CisgICAgICAgIFtodG1wIHNldFNjb3BlOlsoKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0KSBnZXRTY29wZV0rMV07CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gICAgZ1Njb3BlTGV2ZWwrKzsKKyAgICAqbWFwID0gaHRtcDsKKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworLShBTlRMUkhhc2hNYXAgKilQb3BTY29wZTooQU5UTFJIYXNoTWFwICoqKW1hcAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXA7CisJQU5UTFJIYXNoTWFwICpodG1wOworICAgIAorICAgIGh0bXAgPSAqbWFwOworICAgIGlmICggKCptYXApLT5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgaWYgKCBodG1wLT5wdHJCdWZmZXJbaWR4XSA9PSBuaWwgfHwKKyAgICAgICAgICAgICAgICBodG1wLT5wdHJCdWZmZXJbaWR4XSA9PSAoKm1hcCktPnB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wID0gaHRtcC0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbXVzdCBkZWFsIHdpdGggcGFybXMsIGxvY2FscyBhbmQgbGFiZWxzIGF0IHNvbWUgcG9pbnQKKyAgICAgICAgICAgICAqIGNhbiBub3QgZm9yZ2V0IHRoZSBkZWJ1Z2dlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgIFsgdG1wIGRlYWxsb2NdOworICAgICAgICB9CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIC8vICAgICAgICBnU2NvcGVMZXZlbC0tOworICAgIH0KKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSEFTSCAgICAgICAgaGFzaCBlbnRyeSB0byBnZXQgaW5kZXggdG8gdGFibGUKKyAqICBOU0ludGVnZXIgaGFzaCggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgKnMgICAgICAgICAgICAgc3RyaW5nIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogTlNJbnRlZ2VyICAgICAgICAgICAgICAgICBoYXNoZWQgdmFsdWUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzICAgICAgIC8qICAgIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KK3sKKwlOU0ludGVnZXIgaGFzaHZhbDsKKwljb25zdCBjaGFyICp0bXA7CisgICAgCisJdG1wID0gW3MgY1N0cmluZ1VzaW5nRW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKwlmb3IoIGhhc2h2YWwgPSAwOyAqdG1wICE9ICdcMCc7ICkKKyAgICAgICAgaGFzaHZhbCArPSAqdG1wKys7CisJc2VsZi0+TGFzdEhhc2ggPSBoYXNodmFsICUgQnVmZlNpemU7CisJcmV0dXJuKCBzZWxmLT5MYXN0SGFzaCApOworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBGSU5EU0NPUEUgIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBBTlRMUkhhc2hNYXAgKmZpbmRzY29wZSggQU5UTFJIYXNoTWFwICpzZWxmLCBOU0ludGVnZXIgc2NvcGUgKTsKKyAqCisgKiAgICAgSW5wdXRzOiAgTlNJbnRlZ2VyICAgICAgIHNjb3BlIC0tIHNjb3BlIGxldmVsIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogQU5UTFJIYXNoTWFwICAgcG9pbnRlciB0byBwdHJCdWZmZXIgb2YgcHJvcGVyIHNjb3BlIGxldmVsCisgKgorICogIExhc3QgUmV2aXNpb24gOS8wMy85MAorICovCisjZW5kaWYKKy0oQU5UTFJIYXNoTWFwICopZmluZHNjb3BlOihOU0ludGVnZXIpc2NvcGUKK3sKKyAgICBpZiAoIHNlbGYtPlNjb3BlID09IHNjb3BlICkgeworICAgICAgICByZXR1cm4oIHNlbGYgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZOZXh0ICkgeworICAgICAgICByZXR1cm4oIFsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBmaW5kc2NvcGU6c2NvcGVdICk7CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIExPT0tVUCAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIEFOVExSTWFwRWxlbWVudCAqbG9va3VwKCBBTlRMUkhhc2hNYXAgKnNlbGYsIGNoYXIgKnMsIE5TSW50ZWdlciBzY29wZSApOworICoKKyAqICAgICBJbnB1dHM6ICBjaGFyICAgICAqcyAgICAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBBTlRMUk1hcEVsZW1lbnQgICogICAgICAgICAgIHBvaW50ZXIgdG8gZW50cnkKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShpZClsb29rdXA6KE5TU3RyaW5nICopcyBTY29wZTooTlNJbnRlZ2VyKXNjb3BlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIG5wID0gc2VsZi0+cHRyQnVmZmVyW1tzZWxmIGhhc2g6c11dOyBucCAhPSBuaWw7IG5wID0gW25wIGdldGZOZXh0XSApIHsKKyAgICAgICAgaWYgKCBbcyBpc0VxdWFsVG9TdHJpbmc6W25wIGdldE5hbWVdXSApIHsKKyAgICAgICAgICAgIHJldHVybiggbnAgKTsgICAgICAgIC8qICAgZm91bmQgaXQgICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBJTlNUQUxMIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBOU0ludGVnZXIgaW5zdGFsbCggQU5UTFJIYXNoTWFwICpzZWxmLCBBTlRMUk1hcEVsZW1lbnQgKnN5bSwgTlNJbnRlZ2VyIHNjb3BlICk7CisgKgorICogICAgIElucHV0czogIEFOVExSTWFwRWxlbWVudCAgICAqc3ltICAgLS0gc3ltYm9sIHB0ciB0byBpbnN0YWxsCisgKiAgICAgICAgICAgICAgTlNJbnRlZ2VyICAgICAgICAgc2NvcGUgLS0gbGV2ZWwgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBCb29sZWFuICAgICBUUlVFICAgaWYgaW5zdGFsbGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgIGlmIGFscmVhZHkgaW4gdGFibGUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShBTlRMUk1hcEVsZW1lbnQgKilpbnN0YWxsOihBTlRMUk1hcEVsZW1lbnQgKilzeW0gU2NvcGU6KE5TSW50ZWdlcilzY29wZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgCisgICAgbnAgPSBbc2VsZiBsb29rdXA6W3N5bSBnZXROYW1lXSBTY29wZTpzY29wZSBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBbc3ltIHJldGFpbl07CisgICAgICAgIFtzeW0gc2V0Rk5leHQ6c2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdXTsKKyAgICAgICAgc2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdID0gc3ltOworICAgICAgICByZXR1cm4oIHNlbGYtPnB0ckJ1ZmZlclsgc2VsZi0+TGFzdEhhc2ggXSApOworICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgUmVtb3ZlU3ltICBzZWFyY2ggaGFzaGVkIGxpc3QgZm9yIGVudHJ5CisgKiAgTlNJbnRlZ2VyIFJlbW92ZVN5bSggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgICAgICpzICAgICAgICAgIHN0cmluZyB0byBmaW5kCisgKgorICogICAgIFJldHVybnM6IE5TSW50ZWdlciAgICAgIGluZGljYXRvciBvZiBTVUNDRVNTIE9SIEZBSUxVUkUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpUmVtb3ZlU3ltOihOU1N0cmluZyAqKXMKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wLCAqdG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWR4ID0gW3NlbGYgaGFzaDpzXTsKKyAgICBmb3IgKCB0bXAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XSwgbnAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICB0bXAgPSBbbnAgZ2V0Zk5leHRdOyAgICAgICAgICAgICAvKiBnZXQgdGhlIG5leHQgbGluayAgKi8KKyAgICAgICAgICAgIFtucCBkZWFsbG9jXTsKKyAgICAgICAgICAgIHJldHVybiggU1VDQ0VTUyApOyAgICAgICAgICAgIC8qIHJlcG9ydCBTVUNDRVNTICAgICAqLworICAgICAgICB9CisgICAgICAgIHRtcCA9IFtucCBnZXRmTmV4dF07ICAgICAgICAgICAgICAvLyAgQkFEISEhISEhCisgICAgfQorICAgIHJldHVybiggRkFJTFVSRSApOyAgICAgICAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk1hcEVsZW1lbnQgKilucAoreworICAgIGlmICggW25wIGdldGZOZXh0XSAhPSBuaWwgKQorCQlbc2VsZiBkZWxldGVfY2hhaW46W25wIGdldGZOZXh0XV07CisJW25wIGRlYWxsb2NdOworfQorCisjaWZkZWYgRE9OVFVTRVlFVAorLShOU0ludGVnZXIpYmxkX3N5bXRhYjooS1dfVEFCTEUgKil0b2tuYW1zCit7CisgICAgTlNJbnRlZ2VyIGk7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyAqKHRva25hbXNbaV0ubmFtZSkgIT0gJ1wwJzsgaSsrICkgeworICAgICAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICAgICAgbnAgPSBbQU5UTFJNYXBFbGVtZW50IG5ld0FOVExSTWFwRWxlbWVudDpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiwgdG9rbmFtc1tpXS5uYW1lXV07CisgICAgICAgIC8vICAgICAgICBucC0+ZlR5cGUgPSB0b2tuYW1zW2ldLnRva251bTsKKyAgICAgICAgW3NlbGYgaW5zdGFsbDpucCBTY29wZTowXTsKKyAgICB9CisgICAgcmV0dXJuKCBTVUNDRVNTICk7Cit9CisjZW5kaWYKKworLShBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggcHRyQnVmZmVyW2lkeF0gKTsKK30KKworLShBTlRMUk1hcEVsZW1lbnQgKiopZ2V0cHRyQnVmZmVyCit7CisJcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldHB0ckJ1ZmZlcjooQU5UTFJNYXBFbGVtZW50ICopbnAgSW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKwlpZiAoIGlkeCA8IEJ1ZmZTaXplICkgeworICAgICAgICBbbnAgcmV0YWluXTsKKwkJcHRyQnVmZmVyW2lkeF0gPSBucDsKKyAgICB9Cit9CisKKy0oTlNJbnRlZ2VyKWdldFNjb3BlCit7CisJcmV0dXJuKCBTY29wZSApOworfQorCistKHZvaWQpc2V0U2NvcGVTY29wZTooTlNJbnRlZ2VyKWkKK3sKKwlTY29wZSA9IGk7Cit9CisKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldFRUeXBlOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07Cit9CisKKy8qCisgKiB3b3JrcyBvbmx5IGZvciBtYXBsaXN0IGluZGV4ZWQgbm90IGJ5IG5hbWUgYnV0IGJ5IFRva2VuTnVtYmVyCisgKi8KKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgTlNJbnRlZ2VyIGFUVHlwZTsKKworICAgIGFUVHlwZSA9IHR0eXBlICUgQnVmZlNpemU7CisgICAgZm9yKCBucCA9IHNlbGYtPnB0ckJ1ZmZlclt0dHlwZV07IG5wICE9IG5pbDsgbnAgPSBbbnAgZ2V0Zk5leHRdICkgeworICAgICAgICBpZiAoIFtucC5pbmRleCBpbnRlZ2VyVmFsdWVdID09IHR0eXBlICkgeworICAgICAgICAgICAgcmV0dXJuKCBucCApOyAgICAgICAgLyogICBmb3VuZCBpdCAgICAgICAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKy0gKEFOVExSTGlua0Jhc2UgKilnZXROYW1lOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07IC8qICBuaWwgaWYgbm90IGZvdW5kICAgICAgKi8gICAgCit9CisKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6W05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6bmFtZV0gVHlwZTp0dHlwZV07CisgICAgLy8gICAgICAgIG5wLT5mVHlwZSA9IHRva25hbXNbaV0udG9rbnVtOworICAgIFtzZWxmIGluc3RhbGw6bnAgU2NvcGU6MF07Cit9CisKKy0gKE5TSW50ZWdlcilnZXRNb2RlCit7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlCit7CisgICAgbW9kZSA9IGFNb2RlOworfQorCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKWFSdWxlCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKworICAgIGlkeCA9IFtzZWxmIGNvdW50XTsKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCisvKiB0aGlzIG1heSBoYXZlIHRvIGhhbmRsZSBsaW5raW5nIGludG8gdGhlIGNoYWluCisgKi8KKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmICggaWR4ID49IEJ1ZmZTaXplICkgeworICAgICAgICBpZHggJT0gQnVmZlNpemU7CisgICAgfQorICAgIGlmIChhUnVsZSAhPSBwdHJCdWZmZXJbaWR4XSkgeworICAgICAgICBpZiAocHRyQnVmZmVyW2lkeF0gIT0gbmlsKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChpZClvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIGlkeCAlPSBCdWZmU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHB0ckJ1ZmZlcltpZHhdOworfQorCisvKiB0aGlzIHdpbGwgbmV2ZXIgbGluayBpbnRvIHRoZSBjaGFpbgorICovCistICh2b2lkKSBzZXRPYmplY3Q6KGlkKWFSdWxlIGF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBpZiAoYVJ1bGUgIT0gcHRyQnVmZmVyW2lkeF0pIHsKKyAgICAgICAgaWYgKHB0ckJ1ZmZlcltpZHhdICE9IG5pbCkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBbYVJ1bGUgcmV0YWluXTsKKyAgICB9CisgICAgcHRyQnVmZmVyW2lkeF0gPSBhUnVsZTsKK30KKworLSAodm9pZClwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIAorICAgIG5wID0gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MCBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6bmFtZSBOb2RlOmFOb2RlXTsKKyAgICAgICAgaWYgKHB0ckJ1ZmZlcltMYXN0SGFzaF0gIT0gbmlsKQorICAgICAgICAgICAgW3B0ckJ1ZmZlcltMYXN0SGFzaF0gcmVsZWFzZV07CisgICAgICAgIFtucCByZXRhaW5dOworICAgICAgICBucC5mTmV4dCA9IHB0ckJ1ZmZlclsgTGFzdEhhc2ggXTsKKyAgICAgICAgcHRyQnVmZmVyWyBMYXN0SGFzaCBdID0gbnA7CisgICAgfQorICAgIHJldHVybjsgICAgCit9CisKKy0gKE5TRW51bWVyYXRvciAqKW9iamVjdEVudW1lcmF0b3IKK3sKKyAgICBOU0VudW1lcmF0b3IgKmFuRW51bWVyYXRvcjsKKworICAgIGl0SW5kZXggPSAwOworICAgIHJldHVybiBhbkVudW1lcmF0b3I7Cit9CisKKy0gKEJPT0wpaGFzTmV4dAoreworICAgIGlmIChzZWxmICYmIFtzZWxmIGNvdW50XSA8IEJ1ZmZTaXplLTEpIHsKKyAgICAgICAgcmV0dXJuIFlFUzsKKyAgICB9CisgICAgcmV0dXJuIE5POworfQorCistIChBTlRMUk1hcEVsZW1lbnQgKiluZXh0T2JqZWN0Cit7CisgICAgaWYgKHNlbGYgJiYgaXRJbmRleCA8IEJ1ZmZTaXplLTEpIHsKKyAgICAgICAgcmV0dXJuIHB0ckJ1ZmZlcltpdEluZGV4XTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkhhc2hSdWxlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSSGFzaFJ1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU1OGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkhhc2hSdWxlLmgKQEAgLTAsMCArMSw3MiBAQAorLy8KKy8vICBBTlRMUkhhc2hSdWxlLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdWxlTWVtby5oIgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSSGFzaFJ1bGUgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy8JQU5UTFJIYXNoUnVsZSAqZk5leHQ7CisgICAgLy8gICAgVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKKyAgICBOU0ludGVnZXIgbW9kZTsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSSGFzaFJ1bGUgKmZOZXh0OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdEhhc2gsIHNldHRlcj1zZXRMYXN0SGFzaDopIE5TSW50ZWdlciBMYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKGlkKW5ld0FOVExSSGFzaFJ1bGU7CisrIChpZCluZXdBTlRMUkhhc2hSdWxlV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistICh2b2lkKWRlbGV0ZUFOVExSSGFzaFJ1bGU6KEFOVExSUnVsZU1lbW8gKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnA7CistIChBTlRMUlJ1bGVNZW1vICoqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihBTlRMUlJ1bGVNZW1vICoqKW5wOworLSAoTlNOdW1iZXIgKilnZXRSdWxlTWVtb1N0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAodm9pZClwdXRSdWxlTWVtb0F0U3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXg7CistIChOU0ludGVnZXIpZ2V0TW9kZTsKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlOworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKUluZGV4OworLSAoQU5UTFJSdWxlTWVtbyAqKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJIYXNoUnVsZS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkhhc2hSdWxlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjZTNhMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJIYXNoUnVsZS5tCkBAIC0wLDAgKzEsMjgxIEBACisvLworLy8gIEFOVExSSGFzaFJ1bGUubQorLy8gIEFOVExSCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9VTktOT1dOIC0xCisKKyNpbXBvcnQgIkFOVExSSGFzaFJ1bGUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaFJ1bGUKKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSSGFzaFJ1bGUKKworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoUnVsZQoreworICAgIEFOVExSSGFzaFJ1bGUgKmFOZXdBTlRMUkhhc2hSdWxlOworICAgIAorICAgIGFOZXdBTlRMUkhhc2hSdWxlID0gW1tBTlRMUkhhc2hSdWxlIGFsbG9jXSBpbml0XTsKKwlyZXR1cm4oIGFOZXdBTlRMUkhhc2hSdWxlICk7Cit9CisKKysoaWQpbmV3QU5UTFJIYXNoUnVsZVdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphTmV3QU5UTFJIYXNoUnVsZTsKKyAgICAKKyAgICBhTmV3QU5UTFJIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBhbGxvY10gaW5pdFdpdGhMZW46YUJ1ZmZTaXplXTsKKwlyZXR1cm4oIGFOZXdBTlRMUkhhc2hSdWxlICk7Cit9CisKKy0oaWQpaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpIQVNIU0laRV0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0oaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46YUJ1ZmZTaXplXSkgIT0gbmlsKSB7CisJCWZOZXh0ID0gbmlsOworICAgICAgICBtb2RlID0gMDsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisgICAgQU5UTFJSdWxlTWVtbyAqdG1wLCAqcnRtcDsKKyAgICBpbnQgSW5kZXg7CisJCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBJbmRleCA9IDA7IEluZGV4IDwgQnVmZlNpemU7IEluZGV4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgJiYgdG1wICE9IHB0ckJ1ZmZlcltJbmRleF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICAvLyB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJSdWxlTWVtbyAqKXRtcC5mTmV4dDsKKyAgICAgICAgICAgICAgICBbcnRtcCBkZWFsbG9jXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TSW50ZWdlciljb3VudAoreworICAgIGlkIGFuRWxlbWVudDsKKyAgICBOU0ludGVnZXIgYUNudCA9IDA7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrKSB7CisgICAgICAgIGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXTsKKyAgICAgICAgaWYgKCBhbkVsZW1lbnQgIT0gbmlsICkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgbGVuZ3RoCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistIChOU0ludGVnZXIpIHNpemUKK3sKKyAgICBpZCBhbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFTaXplID0gMDsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkgeworICAgICAgICAgICAgYVNpemUgKz0gc2l6ZW9mKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYVNpemU7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistKHZvaWQpZGVsZXRlQU5UTFJIYXNoUnVsZTooQU5UTFJSdWxlTWVtbyAqKW5wCit7CisgICAgQU5UTFJSdWxlTWVtbyAqdG1wLCAqcnRtcDsKKyAgICBpbnQgSW5kZXg7CisgICAgCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBJbmRleCA9IDA7IEluZGV4IDwgQnVmZlNpemU7IEluZGV4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgJiYgdG1wICE9IHB0ckJ1ZmZlcltJbmRleCBdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnAKK3sKKyAgICBpZiAoIG5wLmZOZXh0ICE9IG5pbCApCisJCVtzZWxmIGRlbGV0ZV9jaGFpbjpucC5mTmV4dF07CisJW25wIGRlYWxsb2NdOworfQorCistKEFOVExSUnVsZU1lbW8gKiopZ2V0UHRyQnVmZmVyCit7CisJcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldFB0ckJ1ZmZlcjooQU5UTFJSdWxlTWVtbyAqKilucAoreworCXB0ckJ1ZmZlciA9IG5wOworfQorCistIChOU051bWJlciAqKWdldFJ1bGVNZW1vU3RvcEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphUnVsZTsKKyAgICBOU051bWJlciAqc3RvcEluZGV4OworICAgIE5TSW50ZWdlciBhbkluZGV4OworICAgIAorICAgIGFuSW5kZXggPSAoIGFTdGFydEluZGV4ID49IEJ1ZmZTaXplICkgPyBhU3RhcnRJbmRleCAlPSBCdWZmU2l6ZSA6IGFTdGFydEluZGV4OworICAgIGlmICgoYVJ1bGUgPSBwdHJCdWZmZXJbYW5JbmRleF0pID09IG5pbCkgeworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBzdG9wSW5kZXggPSBbYVJ1bGUgZ2V0U3RvcEluZGV4OmFTdGFydEluZGV4XTsKKyAgICByZXR1cm4gc3RvcEluZGV4OworfQorCistICh2b2lkKXB1dFJ1bGVNZW1vOihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgQXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBOU0ludGVnZXIgYW5JbmRleDsKKyAgICAKKyAgICBhbkluZGV4ID0gKGFTdGFydEluZGV4ID49IEJ1ZmZTaXplKSA/IGFTdGFydEluZGV4ICU9IEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKCBwdHJCdWZmZXJbYW5JbmRleF0gPT0gbmlsICkgeworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoIFthUnVsZS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV0gPT0gYVN0YXJ0SW5kZXggKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHNldFN0YXJ0SW5kZXg6YVJ1bGUuc3RvcEluZGV4XTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZSA9IGFSdWxlLmZOZXh0OworICAgICAgICB9IHdoaWxlICggYVJ1bGUgIT0gbmlsICk7CisgICAgfQorfQorCistICh2b2lkKXB1dFJ1bGVNZW1vQXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXggU3RvcEluZGV4OihOU0ludGVnZXIpYVN0b3BJbmRleAoreworICAgIEFOVExSUnVsZU1lbW8gKmFSdWxlLCAqbmV3UnVsZTsKKyAgICBOU0ludGVnZXIgYW5JbmRleDsKKyAgICBOU0ludGVnZXIgYU1hdGNoSW5kZXg7CisKKyAgICBhbkluZGV4ID0gKGFTdGFydEluZGV4ID49IEJ1ZmZTaXplKSA/IGFTdGFydEluZGV4ICU9IEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKChhUnVsZSA9IHB0ckJ1ZmZlclthbkluZGV4XSkgPT0gbmlsICkgeworICAgICAgICBhUnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcEluZGV4OltOU051bWJlciBudW1iZXJXaXRoSW50ZWdlcjphU3RvcEluZGV4XV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFNYXRjaEluZGV4ID0gW2FSdWxlLnN0YXJ0SW5kZXggaW50ZWdlclZhbHVlXTsKKyAgICAgICAgaWYgKCBhU3RhcnRJbmRleCA+IGFNYXRjaEluZGV4ICkgeworICAgICAgICAgICAgaWYgKCBhUnVsZSAhPSBwdHJCdWZmZXJbYW5JbmRleF0gKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZS5mTmV4dCA9IHB0ckJ1ZmZlclthbkluZGV4XTsKKyAgICAgICAgICAgIHB0ckJ1ZmZlclthbkluZGV4XSA9IGFSdWxlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChhUnVsZS5mTmV4dCAhPSBuaWwpIHsKKyAgICAgICAgICAgIGFNYXRjaEluZGV4ID0gWygoQU5UTFJSdWxlTWVtbyAqKWFSdWxlLmZOZXh0KS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV07CisgICAgICAgICAgICBpZiAoIGFTdGFydEluZGV4ID4gYU1hdGNoSW5kZXggKSB7CisgICAgICAgICAgICAgICAgbmV3UnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0b3BJbmRleF1dOworICAgICAgICAgICAgICAgIFtuZXdSdWxlIHJldGFpbl07CisgICAgICAgICAgICAgICAgbmV3UnVsZS5mTmV4dCA9IGFSdWxlLmZOZXh0OworICAgICAgICAgICAgICAgIGFSdWxlLmZOZXh0ID0gbmV3UnVsZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFNYXRjaEluZGV4ID09IGFTdGFydEluZGV4ICkgeworICAgICAgICAgICAgICAgIFthUnVsZSBzZXRTdGFydEluZGV4OmFSdWxlLnN0b3BJbmRleF07CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYVJ1bGUgPSBhUnVsZS5mTmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworLSAoTlNJbnRlZ2VyKWdldExhc3RIYXNoCit7CisgICAgcmV0dXJuIExhc3RIYXNoOworfQorCistICh2b2lkKXNldExhc3RIYXNoOihOU0ludGVnZXIpYUhhc2gKK3sKKyAgICBMYXN0SGFzaCA9IGFIYXNoOworfQorCistIChOU0ludGVnZXIpZ2V0TW9kZQoreworICAgIHJldHVybiBtb2RlOworfQorCistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZQoreworICAgIG1vZGUgPSBhTW9kZTsKK30KKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKKyAgICBOU0ludGVnZXIgSW5kZXg7CisgICAgCisgICAgSW5kZXggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJT0gQnVmZlNpemUgOiBhbkluZGV4OworICAgIGlmIChhUnVsZSAhPSBwdHJCdWZmZXJbSW5kZXhdKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbSW5kZXhdICE9IG5pbCkgeworICAgICAgICAgICAgW3B0ckJ1ZmZlcltJbmRleF0gcmVsZWFzZV07CisgICAgICAgIH0KKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltJbmRleF0gPSBhUnVsZTsKK30KKworLSAoQU5UTFJSdWxlTWVtbyAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilhbkluZGV4Cit7CisgICAgTlNJbnRlZ2VyIGFuSWR4OworCisgICAgYW5JZHggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJT0gQnVmZlNpemUgOiBhbkluZGV4OworICAgIHJldHVybiBwdHJCdWZmZXJbYW5JZHhdOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJJbnRBcnJheS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkludEFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2OWIyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJJbnRBcnJheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJJbnRBcnJheS5oCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBBTlRMUl9JTlRfQVJSQVlfSU5JVElBTF9TSVpFIDEwCisKK0BpbnRlcmZhY2UgQU5UTFJJbnRBcnJheSA6IEFOVExSUHRyQnVmZmVyIAoreworfQorCisrIChBTlRMUkludEFycmF5ICopbmV3QU5UTFJJbnRBcnJheTsKKysgKEFOVExSSW50QXJyYXkgKiluZXdBTlRMUkludEFycmF5V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoTGVuOihOU0ludGVnZXIpYUxlbjsKKworLSAodm9pZCkgZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKHZvaWQpIGFkZEludGVnZXI6KE5TSW50ZWdlcikgdjsKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgdjsKKy0gKE5TSW50ZWdlcikgcG9wOworLSAoTlNJbnRlZ2VyKSBpbnRlZ2VyQXRJbmRleDooTlNJbnRlZ2VyKSBpOworLSAodm9pZCkgaW5zZXJ0SW50ZWdlcjooTlNJbnRlZ2VyKWFuSW50ZWdlciBBdEluZGV4OihOU0ludGVnZXIpIGlkeDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKHZvaWQpIHJlc2V0OworCistIChOU0ludGVnZXIpIGNvdW50OworLSAoTlNJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSSW50U3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSSW50U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzc5MGNkOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJJbnRTdHJlYW0uaApAQCAtMCwwICsxLDkzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQHByb3RvY29sIEFOVExSSW50U3RyZWFtIDwgTlNPYmplY3QsIE5TQ29weWluZyA+CisKKy0gKHZvaWQpIGNvbnN1bWU7CisKKy8vIEdldCB1bmljaGFyIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgY2hhcmFjdGVyIGFzIGludCBmb3IgaW5jbHVkaW5nIEFOVExSQ2hhclN0cmVhbUVPRiAoLTEpIGluIHRoZSBkYXRhIHJhbmdlCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisKKy8vIFRlbGwgdGhlIHN0cmVhbSB0byBzdGFydCBidWZmZXJpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkuICBSZXR1cm4KKy8vIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24sIGluZGV4KCksIG9yIHNvbWUgb3RoZXIgbWFya2VyIHNvIHRoYXQKKy8vIHdoZW4gcGFzc2VkIHRvIHJld2luZCgpIHlvdSBnZXQgYmFjayB0byB0aGUgc2FtZSBzcG90LgorLy8gcmV3aW5kKG1hcmsoKSkgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGlucHV0IGN1cnNvci4KKy8vIFRPRE86IHByb2JsZW0gaW4gdGhhdCBsZXhlciBzdHJlYW0gcmV0dXJucyBub3QgaW5kZXggYnV0IHNvbWUgbWFya2VyIAorCistIChOU0ludGVnZXIpIG1hcms7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wgaW5kZXggMC4ubiB3aGVyZSBuIGluZGljYXRlcyB0aGUKKy8vIGxhc3Qgc3ltYm9sIGhhcyBiZWVuIHJlYWQuCisKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXg7CisKKy8vIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBuZXh0IGNhbGwgdG8gaW5kZXggd291bGQgcmV0dXJuIG1hcmtlci4KKy8vIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIC1pbmRleCBidXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSXQncworLy8ganVzdCBhIG1hcmtlciB0byBpbmRpY2F0ZSB3aGF0IHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluLiAgVGhpcyBpcworLy8gZXNzZW50aWFsbHkgY2FsbGluZyAtcmVsZWFzZTogYW5kIC1zZWVrOi4gIElmIHRoZXJlIGFyZSBtYXJrZXJzCisvLyBjcmVhdGVkIGFmdGVyIHRoaXMgbWFya2VyIGFyZ3VtZW50LCB0aGlzIHJvdXRpbmUgbXVzdCB1bnJvbGwgdGhlbQorLy8gbGlrZSBhIHN0YWNrLiAgQXNzdW1lIHRoZSBzdGF0ZSB0aGUgc3RyZWFtIHdhcyBpbiB3aGVuIHRoaXMgbWFya2VyCisvLyB3YXMgY3JlYXRlZC4KKworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKworLy8gWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKy8vIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisvLyBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKy8vIHJld2luZCgpIGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dCB0aGUgYmFja3dhcmQgc2Vlay4KKworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CisKKy8vIFNldCB0aGUgaW5wdXQgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXguICBUaGlzIGlzCisvLyBub3JtYWxseSB1c2VkIHRvIHNlZWsgYWhlYWQgaW4gdGhlIGlucHV0IHN0cmVhbS4gIE5vIGJ1ZmZlcmluZyBpcworLy8gcmVxdWlyZWQgdG8gZG8gdGhpcyB1bmxlc3MgeW91IGtub3cgeW91ciBzdHJlYW0gd2lsbCB1c2Ugc2VlayB0bworLy8gbW92ZSBiYWNrd2FyZHMgc3VjaCBhcyB3aGVuIGJhY2t0cmFja2luZy4KKy8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gcmV3aW5kIGluIGl0cyBtdWx0aS1kaXJlY3Rpb25hbAorLy8gcmVxdWlyZW1lbnQgYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorLy8KKy8vIEZvciBjaGFyIHN0cmVhbXMsIHNlZWtpbmcgZm9yd2FyZCBtdXN0IHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIHN1Y2gKKy8vIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisvLyBiYWNrdHJhY2tpbmcgdXNpbmcgdGhlIG1hcmsvcmV3aW5kIG1lY2hhbmlzbSB0aGF0IHJlc3RvcmVzIHN0YXRlIGFuZAorLy8gc28gdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byB1cGRhdGUgc3RhdGUgd2hlbiBzZWVraW5nIGJhY2t3YXJkcy4KKy8vCisvLyBDdXJyZW50bHksIHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBmb3IgZWZmaWNpZW50IGJhY2t0cmFja2luZywgYnV0CisvLyBpbiB0aGUgZnV0dXJlIGl0IG1heSBiZSB1c2VkIGZvciBpbmNyZW1lbnRhbCBwYXJzaW5nLgorCistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworCisvKiogT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCBidXQKKyAqICBtaWdodCBiZSB1c2VmdWwgdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmVhbSBvciBmb3IgdGVzdGluZy4gIFRoaXMKKyAqICB2YWx1ZSBpbmNsdWRlcyBhIHNpbmdsZSBFT0YuCisgKi8KKy0gKE5TVUludGVnZXIpIHNpemU7CisvKiogV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICogIHBhc3MgdGhlIGJ1Y2sgYWxsIHRoZSB3YXkgdG8gdGhlIGxleGVyIHdobyBjYW4gYXNrIGl0cyBpbnB1dCBzdHJlYW0KKyAqICBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjZmIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTGV4ZXIuaApAQCAtMCwwICsxLDkwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJMZXhlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgPEFOVExSVG9rZW5Tb3VyY2U+IHsKKwlpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OyAgICAgIC8vLzwgVGhlIGNoYXJhY3RlciBzdHJlYW0gd2UgcHVsbCB0b2tlbnMgb3V0IG9mLgorCU5TVUludGVnZXIgcnVsZU5lc3RpbmdMZXZlbDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRJbnB1dCwgc2V0dGVyPXNldElucHV0OikgaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFJ1bGVOZXN0aW5nTGV2ZWwsIHNldHRlcj1zZXRSdWxlTmVzdGluZ0xldmVsKSBOU1VJbnRlZ2VyIHJ1bGVOZXN0aW5nTGV2ZWw7CisKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPikgYW5JbnB1dDsKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopem9uZTsKKworLSAodm9pZCkgcmVzZXQ7CisKKy8vIC0gKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIHN0YXRlOworCisjcHJhZ21hIG1hcmsgVG9rZW5zCistIChpZDxBTlRMUlRva2VuPilnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbjsKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistICh2b2lkKSBtVG9rZW5zOwkJLy8gYWJzdHJhY3QsIGRlZmluZWQgaW4gZ2VuZXJhdGVkIHNvdXJjZXMKKy0gKHZvaWQpIHNraXA7CistIChpZDxBTlRMUkNoYXJTdHJlYW0+KSBnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OihpZDxBTlRMUkNoYXJTdHJlYW0+KWFDaGFyU3RyZWFtOworCistICh2b2lkKSBlbWl0OworLSAodm9pZCkgZW1pdDooaWQ8QU5UTFJUb2tlbj4pYVRva2VuOworCisjcHJhZ21hIG1hcmsgTWF0Y2hpbmcKKy0gKHZvaWQpIG1hdGNoU3RyaW5nOihOU1N0cmluZyAqKWFTdHJpbmc7CistICh2b2lkKSBtYXRjaEFueTsKKy0gKHZvaWQpIG1hdGNoQ2hhcjoodW5pY2hhcikgYUNoYXI7CistICh2b2lkKSBtYXRjaFJhbmdlRnJvbUNoYXI6KHVuaWNoYXIpZnJvbUNoYXIgdG86KHVuaWNoYXIpdG9DaGFyOworCisjcHJhZ21hIG1hcmsgSW5mb3JtYXRpb25hbAorLSAoTlNVSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXg7CistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworLy8gZXJyb3IgaGFuZGxpbmcKKy0gKHZvaWQpIHJlcG9ydEVycm9yOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihOU011dGFibGVBcnJheSAqKXRva2VuTmFtZXM7CistIChOU1N0cmluZyAqKWdldENoYXJFcnJvckRpc3BsYXk6KE5TSW50ZWdlciljOworLSAodm9pZCkgcmVjb3ZlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKXRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4YWUzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworQGludGVyZmFjZSBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlIDogTlNPYmplY3QgeworCWludCBzdGFydFRva2VuOworCWludCBzdG9wVG9rZW47Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0U3RhcnQ7CistICh2b2lkKSBzZXRTdGFydDogKE5TSW50ZWdlcikgYVN0YXJ0OworCistIChOU0ludGVnZXIpIGdldFN0b3A7CistICh2b2lkKSBzZXRTdG9wOiAoTlNJbnRlZ2VyKSBhU3RvcDsKKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJMaW5rQmFzZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkxpbmtCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMTllNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJMaW5rQmFzZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vCisvLyAgQU5UTFJMaW5rQmFzZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE0LzEwLgorLy8gIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0Bwcm90b2NvbCBBTlRMUkxpbmtMaXN0IDxOU09iamVjdD4KKworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTsKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U6KGlkPEFOVExSTGlua0xpc3Q+KW5wIFByZXY6KGlkPEFOVExSTGlua0xpc3Q+KXBwOworCistICh2b2lkKSBkZWFsbG9jOworCistIChpZDxBTlRMUkxpbmtMaXN0PikgYXBwZW5kOihpZDxBTlRMUkxpbmtMaXN0Pilub2RlOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pIGluc2VydDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pIGdldGZOZXh0OworLSAodm9pZCkgc2V0Rk5leHQ6KGlkPEFOVExSTGlua0xpc3Q+KW5wOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0ZlByZXY7CistICh2b2lkKSBzZXRGUHJldjooaWQ8QU5UTFJMaW5rTGlzdD4pcHA7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkxpbmtCYXNlIDogTlNPYmplY3QgPEFOVExSTGlua0xpc3Q+IHsKKwlpZDxBTlRMUkxpbmtMaXN0PiBmUHJldjsKKwlpZDxBTlRMUkxpbmtMaXN0PiBmTmV4dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRmUHJldiwgc2V0dGVyPXNldEZQcmV2OikgaWQ8QU5UTFJMaW5rTGlzdD4gZlByZXY7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldGZOZXh0LCBzZXR0ZXI9c2V0Rk5leHQ6KSBpZDxBTlRMUkxpbmtMaXN0PiBmTmV4dDsKKworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTsKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U6KGlkPEFOVExSTGlua0xpc3Q+KW5wIFByZXY6KGlkPEFOVExSTGlua0xpc3Q+KXBwOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4paW5pdDsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluaXRXaXRoUHRyOihpZClucCBQcmV2OihpZClwcDsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWFwcGVuZDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluc2VydDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0Zk5leHQ7CistICh2b2lkKXNldEZOZXh0OihpZDxBTlRMUkxpbmtMaXN0PikgbnA7CistIChpZDxBTlRMUkxpbmtMaXN0PilnZXRmUHJldjsKKy0gKHZvaWQpc2V0RlByZXY6KGlkPEFOVExSTGlua0xpc3Q+KSBwcDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJMb29rYWhlYWRTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJMb29rYWhlYWRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQ4ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUkxvb2thaGVhZFN0cmVhbS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vCisvLyAgQU5UTFJMb29rYWhlYWRTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vICBbVGhlICJCU0QgbGljZW5jZSJdCisvLyAgQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkZhc3RRdWV1ZS5oIgorCisjZGVmaW5lIFVOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYIE5TSW50ZWdlck1heAorCitAaW50ZXJmYWNlIEFOVExSTG9va2FoZWFkU3RyZWFtIDogQU5UTFJGYXN0UXVldWUKK3sKKwlpZCBlb2Y7CisJTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworfQorCitAcHJvcGVydHkgKHJlYWR3cml0ZSwgcmV0YWluLCBnZXR0ZXI9Z2V0RW9mLCBzZXR0ZXI9c2V0RW9mKSBpZCBlb2Y7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEVvZkVsZW1lbnRJbmRleCwgc2V0dGVyPXNldEVvZkVsZW1lbnRJbmRleCkgTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGFzdE1hcmtlciwgc2V0dGVyPXNldExhc3RNYXJrZXIpIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRNYXJrRGVwdGgsIHNldHRlcj1zZXRNYXJrRGVwdGgpIE5TSW50ZWdlciBtYXJrRGVwdGg7CisKKy0gKGlkKSBpbml0V2l0aEVPRjooaWQpIG87CistIChpZCkgbmV4dEVsZW1lbnQ7CistICh2b2lkKSBjb25zdW1lOworLSAodm9pZCkgc3luYzooTlNJbnRlZ2VyKSBuZWVkOworLSAodm9pZCkgZmlsbDooTlNJbnRlZ2VyKSBuOworLSAoaWQpIExUOihOU0ludGVnZXIpIGk7CistIChpZCkgTEI6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBjdXJyZW50U3ltYm9sOworLSAoTlNJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKE5TSW50ZWdlcikgbWFyazsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBnZXRFb2Y7CistICh2b2lkKSBzZXRFb2Y6KGlkKSBhbklEOworLSAoTlNJbnRlZ2VyKSBnZXRFb2ZFbGVtZW50SW5kZXg7CistICh2b2lkKSBzZXRFb2ZFbGVtZW50SW5kZXg6KE5TSW50ZWdlcikgYW5JbnQ7CistIChOU0ludGVnZXIpIGdldExhc3RNYXJrZXI7CistICh2b2lkKSBzZXRMYXN0TWFya2VyOihOU0ludGVnZXIpIGFuSW50OworLSAoTlNJbnRlZ2VyKSBnZXRNYXJrRGVwdGg7CistICh2b2lkKSBzZXRNYXJrRGVwdGg6KE5TSW50ZWdlcikgYW5JbnQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNYXAuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFkNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1hcC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vCisvLyAgQU5UTFJNYXAuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAwCisvLyNkZWZpbmUgTE9DQUxfU0NPUEUgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSTWFwIDogQU5UTFJQdHJCdWZmZXIgeworCS8vQU5UTFJNYXAgKmZOZXh0OyAvLyBmb3VuZCBpbiBzdXBlcmNsYXNzCisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBsYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSTWFwICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2g6KSBOU0ludGVnZXIgbGFzdEhhc2g7CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrIChpZCluZXdBTlRMUk1hcDsKKysgKGlkKW5ld0FOVExSTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFIYXNoU2l6ZTsKKworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSAodm9pZClkZWFsbG9jOworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKy8qIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KKy0oTlNJbnRlZ2VyKWhhc2g6KE5TU3RyaW5nICopczsKKy8qICAgbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzOworLyogbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistKGlkKWluc3RhbGw6KEFOVExSTWFwRWxlbWVudCAqKXN5bTsKKy8qCisgKiBkZWxldGUgZW50cnkgZnJvbSBsaXN0CisgKi8KKy0gKHZvaWQpZGVsZXRlQU5UTFJNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoTlNJbnRlZ2VyKVJlbW92ZVN5bTooTlNTdHJpbmcgKilzOworLSAodm9pZClkZWxldGVfY2hhaW46KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TSW50ZWdlcilnZXROb2RlOihBTlRMUk1hcEVsZW1lbnQgKilhTm9kZTsKKy0gKHZvaWQpcHV0Tm9kZTooTlNJbnRlZ2VyKWFUVHlwZSBOb2RlOihpZClhTm9kZTsKKy0gKHZvaWQpcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIFRUeXBlOihOU0ludGVnZXIpdHR5cGU7CistICh2b2lkKXB1dE5hbWU6KE5TU3RyaW5nICopbmFtZSBOb2RlOihpZClhTm9kZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZDAxYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw2NSBAQAorLy8KKy8vICBBTlRMUk1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VNYXBFbGVtZW50LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNYXBFbGVtZW50IDogQU5UTFJCYXNlTWFwRWxlbWVudCB7CisgICAgTlNTdHJpbmcgKm5hbWU7CisgICAgaWQgICAgICAgIG5vZGU7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5hbWUsIHNldHRlcj1zZXROYW1lOikgTlNTdHJpbmcgKm5hbWU7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5vZGUsIHNldHRlcj1zZXROb2RlOikgaWQgbm9kZTsKKworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudDsKKysgKGlkKSBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBUeXBlOihOU0ludGVnZXIpYVRUeXBlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIE5vZGU6KGlkKWFOb2RlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhPYmoxOihpZClhbk9iajEgT2JqMjooaWQpYW5PYmoyOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIFR5cGU6KE5TSW50ZWdlcilhVFR5cGU7CistIChpZCkgaW5pdFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBOb2RlOihpZClhTm9kZTsKKy0gKGlkKSBpbml0V2l0aE9iajE6KGlkKWFuT2JqMSBPYmoyOihpZClhbk9iajI7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU0ludGVnZXIpIGNvdW50OworLSAoTlNJbnRlZ2VyKSBzaXplOworLSAoTlNTdHJpbmcgKilnZXROYW1lOworLSAodm9pZClzZXROYW1lOihOU1N0cmluZyAqKWFOYW1lOworLSAoaWQpZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQpYU5vZGU7CistICh2b2lkKXB1dE5vZGU6KGlkKWFOb2RlOworLSAodm9pZClwdXROb2RlOihpZClhTm9kZSBXaXRoOihOU0ludGVnZXIpdW5pcXVlSUQ7CisvLy0gKHZvaWQpc2V0T2JqZWN0OihpZClhTm9kZSBhdEluZGV4OmFuSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzkxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTMvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbgoreworICAgIEFOVExSQml0U2V0ICpleHBlY3Rpbmc7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZykgQU5UTFJCaXRTZXQgKmV4cGVjdGluZzsKKworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3QU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uOworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3QU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihBTlRMUkJpdFNldCAqKWV4cGVjdGluZzsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IEZvbGxvdzooQU5UTFJCaXRTZXQgKilleHBlY3Rpbmc7CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYmRhM2JiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TUmFuZ2UgcmFuZ2U7Cit9CisKKysgKGlkKSBleGNlcHRpb25XaXRoUmFuZ2U6KE5TUmFuZ2UpIGFSYW5nZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlSW5wdXQ7CistIChpZCkgaW5pdFdpdGhSYW5nZTooTlNSYW5nZSkgYVJhbmdlIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSB0aGVJbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JkNDVmYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU1NldCAqZXhwZWN0aW5nOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TU2V0ICpleHBlY3Rpbmc7CisKKysgKGlkKSBleGNlcHRpb25XaXRoU2V0OihOU1NldCAqKSB0aGVFeHBlY3RlZFNldCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoU2V0OihOU1NldCAqKSB0aGVFeHBlY3RlZFNldCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlU3RyZWFtOworCistIChOU1NldCAqKSBnZXRFeHBlY3Rpbmc7CistICh2b2lkKSBzZXRFeHBlY3Rpbmc6IChOU1NldCAqKSBhbkV4cGVjdGVkU2V0OworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZTFkNzdkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU0ludGVnZXIgZXhwZWN0aW5nOworCXVuaWNoYXIgZXhwZWN0aW5nQ2hhcjsKKwlCT09MIGlzVG9rZW5UeXBlOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TSW50ZWdlciBleHBlY3Rpbmc7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZ0NoYXIsIHNldHRlcj1zZXRFeHBlY3RpbmdDaGFyOikgdW5pY2hhciBleHBlY3RpbmdDaGFyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJc1Rva2VuVHlwZSwgc2V0dGVyPXNldElzVG9rZW5UeXBlOikgQk9PTCBpc1Rva2VuVHlwZTsKKworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKysgKGlkKSBuZXdBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbk1pc3Npbmc6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW46KGlkPEFOVExSVG9rZW4+KWluc2VydGVkOworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uQ2hhcjoodW5pY2hhcilleHBlY3RlZENoYXJhY3RlciBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworLShpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICBUb2tlbjooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWQ7CistIChpZCkgaW5pdFdpdGhDaGFyYWN0ZXI6KHVuaWNoYXIpZXhwZWN0ZWRDaGFyYWN0ZXIgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2MWFiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0Bwcm90b2NvbCBBTlRMUkludFN0cmVhbTsKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TSW50ZWdlciBleHBlY3Rpbmc7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZykgTlNJbnRlZ2VyIGV4cGVjdGluZzsKKworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk4ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uIDogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworICAgIGlkPEFOVExSVG9rZW4+IGluc2VydGVkOworfQorLyoqIFVzZWQgZm9yIHJlbW90ZSBkZWJ1Z2dlciBkZXNlcmlhbGl6YXRpb24gKi8KKysgKGlkKSBuZXdBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbjsKKysgKGlkKSBuZXdBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGg6KGlkPEFOVExSVG9rZW4+KWluc2VydGVkVG9rZW47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0OihOU0ludGVnZXIpZXhwZWN0ZWQgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBXaXRoOihpZDxBTlRMUlRva2VuPilpbnNlcnRlZFRva2VuOworCistIChOU0ludGVnZXIpIGdldE1pc3NpbmdUeXBlOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI3MWJhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaApAQCAtMCwwICsxLDQzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKKwlpbnQgc3RhdGVOdW1iZXI7Cit9CisKKysgKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKikgbmV3QU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbjooTlNJbnRlZ2VyKXRoZURlY2lzaW9uTnVtYmVyIHN0YXRlOihOU0ludGVnZXIpdGhlU3RhdGVOdW1iZXIgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworLSAoQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqKSBpbml0V2l0aERlY2lzaW9uOihOU0ludGVnZXIpdGhlRGVjaXNpb25OdW1iZXIgc3RhdGU6KE5TSW50ZWdlcil0aGVTdGF0ZU51bWJlciBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CisKKy0gKHZvaWQpc2V0RGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpc2V0U3RhdGVOdW1iZXI6KE5TSW50ZWdlcilzdGF0ZU51bWJlcjsKKworCitAZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk5vZGVNYXBFbGVtZW50LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSTm9kZU1hcEVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBjOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUk5vZGVNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1NiBAQAorLy8KKy8vICBBTlRMUlJ1bGVNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZU1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSTm9kZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBpZDxBTlRMUlRyZWU+IG5vZGU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZCBub2RlOworCisrICh2b2lkKWluaXRpYWxpemU7CisKKysgKGlkKSBuZXdBTlRMUk5vZGVNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSTm9kZU1hcEVsZW1lbnRXaXRoSW5kZXg6KGlkKWFuSW5kZXggTm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooaWQpYW5JbmRleCBOb2RlOihpZClhTm9kZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkPEFOVExSVHJlZT4pZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJQYXJzZVRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJQYXJzZVRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU1NGUzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlBhcnNlVHJlZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJQYXJzZVRyZWUuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNy8xMi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSUGFyc2VUcmVlIDogQU5UTFJCYXNlVHJlZSB7CisJaWQ8QU5UTFJUb2tlbj4gcGF5bG9hZDsKKwlOU011dGFibGVBcnJheSAqaGlkZGVuVG9rZW5zOworfQorLyoqIEEgcmVjb3JkIG9mIHRoZSBydWxlcyB1c2VkIHRvIG1hdGNoIGEgdG9rZW4gc2VxdWVuY2UuICBUaGUgdG9rZW5zCisgKiAgZW5kIHVwIGFzIHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlIGFuZCBydWxlIG5vZGVzIGFyZSB0aGUgaW50ZXJpb3Igbm9kZXMuCisgKiAgVGhpcyByZWFsbHkgYWRkcyBubyBmdW5jdGlvbmFsaXR5LCBpdCBpcyBqdXN0IGFuIGFsaWFzIGZvciBDb21tb25UcmVlCisgKiAgdGhhdCBpcyBtb3JlIG1lYW5pbmdmdWwgKHNwZWNpZmljKSBhbmQgaG9sZHMgYSBTdHJpbmcgdG8gZGlzcGxheSBmb3IgYSBub2RlLgorICovCisrIChBTlRMUlBhcnNlVHJlZSAqKW5ld0FOVExSUGFyc2VUcmVlOihpZDxBTlRMUlRva2VuPilsYWJlbDsKKy0gKGlkKWluaXRXaXRoTGFiZWw6KGlkPEFOVExSVG9rZW4+KWxhYmVsOworCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU7CistIChOU0ludGVnZXIpZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKXNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKWluZGV4OworLSAoTlNJbnRlZ2VyKWdldFRva2VuU3RvcEluZGV4OworLSAodm9pZClzZXRUb2tlblN0b3BJbmRleDooTlNJbnRlZ2VyKWluZGV4OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdXaXRoSGlkZGVuVG9rZW5zOworLSAoTlNTdHJpbmcgKil0b0lucHV0U3RyaW5nOworLSAodm9pZClfdG9TdHJpbmdMZWF2ZXM6KE5TTXV0YWJsZVN0cmluZyAqKWJ1ZjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlBhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkZGFmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUGFyc2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVJlY29nbml6ZXIuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgeworCWlkPEFOVExSVG9rZW5TdHJlYW0+IGlucHV0OworfQorKyAoQU5UTFJQYXJzZXIgKiluZXdBTlRMUlBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dDsKKysgKEFOVExSUGFyc2VyICopbmV3QU5UTFJQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQgU3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopYVN0YXRlOworCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OiAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGFuSW5wdXQ7CisKKy0gKHZvaWQpIHJlc2V0OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworLSAoQU5UTFJDb21tb25Ub2tlbiAqKWdldE1pc3NpbmdTeW1ib2w6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pZ2V0VG9rZW5TdHJlYW07CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KGludClydWxlSW5kZXg7CistICh2b2lkKSB0cmFjZU91dDooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKSBydWxlSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZWYzZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSA6IEFOVExSUnVsZVJldHVyblNjb3BlIHsKKwlpZDxBTlRMUlRva2VuPiBzdGFydFRva2VuOworCWlkPEFOVExSVG9rZW4+IHN0b3BUb2tlbjsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnQsIHNldHRlcj1zZXRTdGFydDopIGlkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgICBpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRTdGFydDsKKy0gKHZvaWQpIHNldFN0YXJ0OiAoaWQ8QU5UTFJUb2tlbj4pIGFTdGFydDsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CistICh2b2lkKSBzZXRTdG9wOiAoaWQ8QU5UTFJUb2tlbj4pIGFTdG9wOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKil0aGVab25lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUHRyQnVmZmVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUHRyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4ZjU5NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJQdHJCdWZmZXIuaApAQCAtMCwwICsxLDkxIEBACisvLworLy8gIEFOVExSUHRyQnVmZmVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBCVUZGU0laRSAgICAgICAgIDEwMQorCitAaW50ZXJmYWNlIEFOVExSUHRyQnVmZmVyIDogQU5UTFJMaW5rQmFzZSB7CisJLy9BTlRMUlB0ckJ1ZmZlciAqZk5leHQ7CisgICAgTlNJbnRlZ2VyIEJ1ZmZTaXplOworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKKyAgICBpZCAqcHRyQnVmZmVyOworICAgIE5TSW50ZWdlciBjb3VudDsKKyAgICBOU0ludGVnZXIgcHRyOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRCdWZmU2l6ZSwgc2V0dGVyPXNldEJ1ZmZTaXplOikgTlNJbnRlZ2VyIEJ1ZmZTaXplOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRCdWZmZXIsIHNldHRlcj1zZXRCdWZmZXI6KSBOU011dGFibGVEYXRhICpidWZmZXI7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFB0ckJ1ZmZlciwgc2V0dGVyPXNldFB0ckJ1ZmZlcjopIGlkICpwdHJCdWZmZXI7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDb3VudCwgc2V0dGVyPXNldENvdW50OikgTlNJbnRlZ2VyIGNvdW50OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UHRyLCBzZXR0ZXI9c2V0UHRyOikgTlNJbnRlZ2VyIHB0cjsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcjsKKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcldpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCistIChOU011dGFibGVEYXRhICopZ2V0QnVmZmVyOworLSAodm9pZClzZXRCdWZmZXI6KE5TTXV0YWJsZURhdGEgKilucDsKKy0gKE5TSW50ZWdlcilnZXRDb3VudDsKKy0gKHZvaWQpc2V0Q291bnQ6KE5TSW50ZWdlcilhQ291bnQ7CistIChpZCAqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihpZCAqKW5wOworLSAoTlNJbnRlZ2VyKWdldFB0cjsKKy0gKHZvaWQpc2V0UHRyOihOU0ludGVnZXIpbnA7CisKKy0gKHZvaWQpIHB1c2g6KGlkKSB2OworLSAoaWQpIHBvcDsKKy0gKGlkKSBwZWVrOworCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKSB2OworLSAodm9pZCkgYWRkT2JqZWN0c0Zyb21BcnJheTooQU5UTFJQdHJCdWZmZXIgKilhbkFycmF5OworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoaWQpICAgb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKHZvaWQpIHJlbW92ZUFsbE9iamVjdHM7CisKKy0gKHZvaWQpIGVuc3VyZUNhcGFjaXR5OihOU0ludGVnZXIpIGluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg1M2RjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaApAQCAtMCwwICsxLDcyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiA6IEFOVExSUnVudGltZUV4Y2VwdGlvbiB7CisJaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworCU5TSW50ZWdlciBpbmRleDsKKwlpZDxBTlRMUlRva2VuPiB0b2tlbjsKKwlpZDxBTlRMUlRyZWU+IG5vZGU7CisJdW5pY2hhciBjOworCU5TSW50ZWdlciBsaW5lOworCU5TSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RyZWFtLCBzZXR0ZXI9c2V0U3RyZWFtOikgaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuOikgaWQ8QU5UTFJUb2tlbj50b2tlbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZDxBTlRMUlRyZWU+bm9kZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExpbmUsIHNldHRlcj1zZXRMaW5lOikgTlNJbnRlZ2VyIGxpbmU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDaGFyUG9zaXRpb25JbkxpbmUsIHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU0ludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworCisrIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIG5ld0FOVExSUmVjb2duaXRpb25FeGNlcHRpb247CisrIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgYW5JbnB1dFN0cmVhbTsgCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW07CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0U3RyZWFtIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoTlNJbnRlZ2VyKSB1bmV4cGVjdGVkVHlwZTsKKy0gKGlkPEFOVExSVG9rZW4+KWdldFVuZXhwZWN0ZWRUb2tlbjsKKworLSAoaWQ8QU5UTFJJbnRTdHJlYW0+KSBnZXRTdHJlYW07CistICh2b2lkKSBzZXRTdHJlYW06IChpZDxBTlRMUkludFN0cmVhbT4pIGFTdHJlYW07CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbjsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Tm9kZTsKKy0gKHZvaWQpIHNldE5vZGU6IChpZDxBTlRMUlRyZWU+KSBhTm9kZTsKKworLSAoTlNTdHJpbmcgKilnZXRNZXNzYWdlOworCistIChOU0ludGVnZXIpZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworLSAodm9pZClzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TSW50ZWdlcilhUG9zOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQzMGI3OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaApAQCAtMCwwICsxLDExNiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgOiBOU09iamVjdCB7CisJTlNNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsgICAgICAgICAgLy8gYSBzdGFjayBvZiBGT0xMT1cgYml0c2V0cyB1c2VkIGZvciBjb250ZXh0IHNlbnNpdGl2ZSBwcmVkaWN0aW9uIGFuZCByZWNvdmVyeQorICAgIE5TSW50ZWdlciBfZnNwOyAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvdyBzdGFjayBwb2ludGVyCisJQk9PTCBlcnJvclJlY292ZXJ5OyAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIHJlY292ZXJpbmc/CisJTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworCUJPT0wgZmFpbGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgc29tZSBtYXRjaCBmYWlsZWQKKyAgICBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworCU5TSW50ZWdlciBiYWNrdHJhY2tpbmc7ICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcKKwlBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CQkJLy8gc3RvcmUgcHJldmlvdXMgcmVzdWx0cyBvZiBtYXRjaGluZyBydWxlcyBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGFnYWluLiBIb29rIGluIGluY3JlbWVudGFsIHN0dWZmIGhlcmUsIHRvby4KKworCWlkPEFOVExSVG9rZW4+IHRva2VuOworCU5TSW50ZWdlciAgdG9rZW5TdGFydENoYXJJbmRleDsKKwlOU1VJbnRlZ2VyIHRva2VuU3RhcnRMaW5lOworCU5TVUludGVnZXIgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKwlOU1VJbnRlZ2VyIGNoYW5uZWw7CisJTlNVSW50ZWdlciB0eXBlOworCU5TU3RyaW5nICAgKnRleHQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Rm9sbG93aW5nLCBzZXR0ZXI9c2V0Rm9sbG93aW5nOikgTlNNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgX2ZzcDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIGVycm9yUmVjb3Zlcnk7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRGYWlsZWQsIHNldHRlcj1zZXRGYWlsZWQ6KSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRCYWNrdHJhY2tpbmcsIHNldHRlcj1zZXRCYWNrdHJhY2tpbmcpIE5TSW50ZWdlciBiYWNrdHJhY2tpbmc7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFJ1bGVNZW1vLCBzZXR0ZXI9c2V0UnVsZU1lbW86KSBBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CitAcHJvcGVydHkgKGNvcHksIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuKSBpZDxBTlRMUlRva2VuPiB0b2tlbjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFR5cGUsc2V0dGVyPXNldFR5cGU6KSBOU1VJbnRlZ2VyIHR5cGU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDaGFubmVsLHNldHRlcj1zZXRDaGFubmVsOikgTlNVSW50ZWdlciBjaGFubmVsOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5TdGFydExpbmUsc2V0dGVyPXNldFRva2VuU3RhcnRMaW5lOikgTlNVSW50ZWdlciB0b2tlblN0YXJ0TGluZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYXJQb3NpdGlvbkluTGluZSxzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNVSW50ZWdlciB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5TdGFydENoYXJJbmRleCxzZXR0ZXI9c2V0VG9rZW5TdGFydENoYXJJbmRleDopIE5TSW50ZWdlciB0b2tlblN0YXJ0Q2hhckluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dCkgTlNTdHJpbmcgKnRleHQ7CisKKysgKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlOworKyAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CisrIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOworLSAodm9pZCkgc2V0VG9rZW46KGlkPEFOVExSVG9rZW4+KSB0aGVUb2tlbjsKKworLSAoTlNVSW50ZWdlcikgZ2V0VHlwZTsKKy0gKHZvaWQpIHNldFR5cGU6KE5TVUludGVnZXIpIHRoZVRva2VuVHlwZTsKKworLSAoTlNVSW50ZWdlcikgZ2V0Q2hhbm5lbDsKKy0gKHZvaWQpIHNldENoYW5uZWw6KE5TVUludGVnZXIpIHRoZUNoYW5uZWw7CisKKy0gKE5TVUludGVnZXIpIGdldFRva2VuU3RhcnRMaW5lOworLSAodm9pZCkgc2V0VG9rZW5TdGFydExpbmU6KE5TVUludGVnZXIpIHRoZVRva2VuU3RhcnRMaW5lOworCistIChOU1VJbnRlZ2VyKSBnZXRDaGFyUG9zaXRpb25JbkxpbmU7CistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpIHRoZUNoYXJQb3NpdGlvbjsKKworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0Q2hhckluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdGFydENoYXJJbmRleDooTlNJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0Q2hhckluZGV4OworCistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworCistIChOU011dGFibGVBcnJheSAqKSBnZXRGb2xsb3dpbmc7CistICh2b2lkKXNldEZvbGxvd2luZzooTlNNdXRhYmxlQXJyYXkgKilhRm9sbG93OworLSAoQU5UTFJSdWxlU3RhY2sgKikgZ2V0UnVsZU1lbW87CistICh2b2lkKXNldFJ1bGVNZW1vOihBTlRMUlJ1bGVTdGFjayAqKWFSdWxlTWVtbzsKKy0gKEJPT0wpIGlzRXJyb3JSZWNvdmVyeTsKKy0gKHZvaWQpIHNldElzRXJyb3JSZWNvdmVyeTogKEJPT0wpIGZsYWc7CisKKy0gKEJPT0wpIGdldEZhaWxlZDsKKy0gKHZvaWQpIHNldEZhaWxlZDogKEJPT0wpIGZsYWc7CisKKy0gKE5TSW50ZWdlcikgIGdldEJhY2t0cmFja2luZzsKKy0gKHZvaWQpIHNldEJhY2t0cmFja2luZzooTlNJbnRlZ2VyKSB2YWx1ZTsKKy0gKHZvaWQpIGluY3JlYXNlQmFja3RyYWNraW5nOworLSAodm9pZCkgZGVjcmVhc2VCYWNrdHJhY2tpbmc7CistIChCT09MKSBpc0JhY2t0cmFja2luZzsKKworLSAoTlNJbnRlZ2VyKSBsYXN0RXJyb3JJbmRleDsKKy0gKHZvaWQpIHNldExhc3RFcnJvckluZGV4OihOU0ludGVnZXIpIHZhbHVlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTMyYTBjYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaApAQCAtMCwwICsxLDg1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKwordHlwZWRlZiB1bmlvbiB7CisgICAgaWQgc2luZ2xlOworICAgIE5TTXV0YWJsZUFycmF5ICptdWx0aXBsZTsKK30gRWxlbWVudHM7CisKKy8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHNlcGFyYXRlZCBpbnRvIHN0cmVhbSBhbmQgZW51bWVyYXRvciBjbGFzc2VzCitAaW50ZXJmYWNlIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIDogTlNPYmplY3QgeworICAgIE5TSW50ZWdlciBjdXJzb3I7CisgICAgQk9PTCBkaXJ0eTsgICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgcmV0dXJuIGNvcGllcyBvZiBpdHMgZWxlbWVudHMsIHNldCB0byB0cnVlIGFmdGVyIGEgY2FsbCB0byAtcmVzZXQKKyAgICBCT09MIGlzU2luZ2xlRWxlbWVudDsKKyAgICBFbGVtZW50cyBlbGVtZW50czsKKyAgICAKKyAgICBOU1N0cmluZyAqZWxlbWVudERlc2NyaXB0aW9uOworICAgIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPUdldEN1cnNvciwgc2V0dGVyPVNldEN1cnNvcjopIE5TSW50ZWdlciBjdXJzb3I7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPUdldGRpcnR5LCBzZXR0ZXI9U2V0ZGlydHk6KSBCT09MIGRpcnR5OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1HZXRJc1NpbmdsZUVsZW1lbnQsIHNldHRlcj1TZXRJc1NpbmdsZUVsZW1lbnQ6KSBCT09MIGlzU2luZ2xlRWxlbWVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9R2V0RWxlbWVudCwgc2V0dGVyPVNldEVsZW1lbnQ6KSBFbGVtZW50cyBlbGVtZW50czsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9R2V0RWxlbWVudERlc2NyaXB0aW9uLCBzZXR0ZXI9U2V0RWxlbWVudERlc2NyaXB0aW9uOikgTlNTdHJpbmcgKmVsZW1lbnREZXNjcmlwdGlvbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9R2V0VHJlZUFkYXB0b3IsIHNldHRlcj1TZXRUcmVlQWRhcHRvcjopIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworCisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKysgKEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKikgbmV3QU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNBcnJheSAqKXRoZUVsZW1lbnRzOworCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbiBlbGVtZW50OihpZClhbkVsZW1lbnQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKHZvaWQpcmVzZXQ7CisKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3I7CisKKy0gKHZvaWQpIGFkZEVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsMCisgCistIChCT09MKSBoYXNOZXh0OworLSAoaWQ8QU5UTFJUcmVlPikgbmV4dFRyZWU7CistIChpZDxBTlRMUlRyZWU+KSBfbmV4dDsgICAgICAgLy8gaW50ZXJuYWw6IFRPRE86IHJlZGVzaWduIGlmIG5lY2Vzc2FyeS4gbWF5YmUgZGVsZWdhdGUKKworLSAoaWQpIGNvcHlFbGVtZW50OihpZCllbGVtZW50OworLSAoaWQpIHRvVHJlZTooaWQpZWxlbWVudDsKKworLSAoTlNTdHJpbmcgKikgZ2V0RGVzY3JpcHRpb247CistICh2b2lkKSBzZXREZXNjcmlwdGlvbjooTlNTdHJpbmcgKilkZXNjcmlwdGlvbjsKKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQxOGIyNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaApAQCAtMCwwICsxLDUwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmgiDAwKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA6IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKworfQorCisrIChBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqKSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbjsKKysgKEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICopIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpYW5FbGVtZW50OworKyAoQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKKworLSAoaWQpIG5leHROb2RlOworLSAoaWQpIGR1cDooaWQpZWxlbWVudDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2E1MTZkZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIgorCisKK0BpbnRlcmZhY2UgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIDogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworCit9CisKKysgKGlkKSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKillbGVtZW50RGVzY3JpcHRpb247CisvKiogQ3JlYXRlIGEgc3RyZWFtIHdpdGggb25lIGVsZW1lbnQgKi8KKysgKGlkKSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopZWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OihpZCkgb25lRWxlbWVudDsKKy8qKiBDcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0ICovCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNNdXRhYmxlQXJyYXkgKillbGVtZW50czsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhRGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYURlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpZWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KE5TTXV0YWJsZUFycmF5ICopZWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJlYW0gYW5kIG1ha2UgYSBub2RlIGZvciBpdCAqLworLSAoaWQpIG5leHROb2RlOworCistIChpZCkgbmV4dFRva2VuOworCisvKiogRG9uJ3QgY29udmVydCB0byBhIHRyZWUgdW5sZXNzIHRoZXkgZXhwbGljaXRseSBjYWxsIG5leHRUcmVlLgorICogIFRoaXMgd2F5IHdlIGNhbiBkbyBoZXRlcm8gdHJlZSBub2RlcyBpbiByZXdyaXRlLgorICovCistIChpZDxBTlRMUlRyZWU+KSB0b1RyZWU6KGlkPEFOVExSVG9rZW4+KWVsZW1lbnQ7CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUnVsZU1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdWxlTWFwRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDBiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUnVsZU1hcEVsZW1lbnQuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZU1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlTWFwRWxlbWVudC5oIgorCitAaW50ZXJmYWNlIEFOVExSUnVsZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBOU051bWJlciAqcnVsZU51bTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTnVtLCBzZXR0ZXI9c2V0UnVsZU51bTopIE5TTnVtYmVyICpydWxlTnVtOworCisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnQ7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooTlNOdW1iZXIgKilhbklkeDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TTnVtYmVyICopZ2V0UnVsZU51bTsKKy0gKHZvaWQpc2V0UnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdWxlTWVtby5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlJ1bGVNZW1vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhNWFlMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdWxlTWVtby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJSdWxlTWVtby5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE2LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkxpbmtCYXNlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSdWxlTWVtbyA6IEFOVExSTGlua0Jhc2UgeworICAgIE5TTnVtYmVyICpzdGFydEluZGV4OworICAgIE5TTnVtYmVyICpzdG9wSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnRJbmRleCwgc2V0dGVyPXNldFN0YXJ0SW5kZXgpIE5TTnVtYmVyICpzdGFydEluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTdG9wSW5kZXgsIHNldHRlcj1zZXRTdG9wSW5kZXgpIE5TTnVtYmVyICpzdG9wSW5kZXg7CisKKysgKEFOVExSUnVsZU1lbW8gKiluZXdBTlRMUlJ1bGVNZW1vOworKyAoQU5UTFJSdWxlTWVtbyAqKW5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDooTlNOdW1iZXIgKilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TTnVtYmVyICopYVN0b3BJbmRleDsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJSdWxlTWVtbyAqKWdldFJ1bGVXaXRoU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXg7CistIChOU051bWJlciAqKWdldFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OworLSAodm9pZClzZXRTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdG9wSW5kZXg7CistICh2b2lkKXNldFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUnVsZVJldHVyblNjb3BlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUnVsZVJldHVyblNjb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1MGMxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZVJldHVyblNjb3BlLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlJ1bGVSZXR1cm5TY29wZSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+IHsKKworfQorCisvKiogUmV0dXJuIHRoZSBzdGFydCB0b2tlbiBvciB0cmVlICovCistIChpZDxBTlRMUlRva2VuPikgZ2V0U3RhcnQ7CisKKy8qKiBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gb3IgdHJlZSAqLworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9QVNUOyAqLworLSAoaWQpIGdldE5vZGU7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9dGVtcGxhdGU7IERvbid0IHVzZSBTdHJpbmdUZW1wbGF0ZQorICogIHR5cGUgYXMgaXQgdGhlbiBjYXVzZXMgYSBkZXBlbmRlbmN5IHdpdGggU1QgbGliLgorICovCistIChpZCkgZ2V0VGVtcGxhdGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdWxlU3RhY2suaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdWxlU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0NTBiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJIYXNoUnVsZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSUnVsZVN0YWNrIDogQU5UTFJCYXNlU3RhY2sgeworfQorCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOworKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250OworLShpZClpbml0OworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0odm9pZClkZWFsbG9jOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy8qIGNsZWFyIC0tIHJlaW5pdGlhbGl6ZSB0aGUgbWFwbGlzdCBhcnJheSAqLworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJIYXNoUnVsZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJIYXNoUnVsZSAqKWFIYXNoUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoQU5UTFJIYXNoUnVsZSAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHg7CistICh2b2lkKXB1dEhhc2hSdWxlQXRSdWxlSW5kZXg6KE5TSW50ZWdlcilhUnVsZUluZGV4IFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TSW50ZWdlcilhU3RvcEluZGV4OworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTE5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLm0KQEAgLTAsMCArMSwxNDcgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2subQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSUnVsZVN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJ1bGVTdGFjaworCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrCit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRXaXRoTGVuOmNudF07Cit9CisKKy0gKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46Y250XSkgIT0gbmlsKSB7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgcmV0dXJuIFtzdXBlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkKKyAgICAgICAgICAgIGFDbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGFDbnQ7Cit9CisKKy0gKE5TSW50ZWdlcilzaXplCit7CisgICAgQU5UTFJSdWxlTWVtbyAqYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhU2l6ZSA9IDA7CisgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKworLSAoQU5UTFJIYXNoUnVsZSAqKXBvcAoreworICAgIHJldHVybiAoQU5UTFJIYXNoUnVsZSAqKVtzdXBlciBwb3BdOworfQorCistICh2b2lkKSBpbnNlcnRPYmplY3Q6KEFOVExSSGFzaFJ1bGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIE5TTG9nKCBAIkluIEFOVExSUnVsZVN0YWNrIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGFSdWxlIGF0IEluZGV4ICVkLCBidXQgQnVmZmVyIGlzIG9ubHkgJWQgbG9uZ1xuIiwgaWR4LCBCdWZmU2l6ZSApOworICAgICAgICBbc2VsZiBlbnN1cmVDYXBhY2l0eTppZHhdOworICAgIH0KKyAgICBpZiAoIGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICBpZiAocHRyQnVmZmVyW2lkeF0gIT0gbmlsKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChBTlRMUkhhc2hSdWxlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmIChpZHggPCBCdWZmU2l6ZSkgeworICAgICAgICByZXR1cm4gcHRyQnVmZmVyW2lkeF07CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpcHV0SGFzaFJ1bGVBdFJ1bGVJbmRleDooTlNJbnRlZ2VyKWFSdWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXgKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphSGFzaFJ1bGU7CisgICAgQU5UTFJSdWxlTWVtbyAqYVJ1bGVNZW1vOworCisgICAgaWYgKGFSdWxlSW5kZXggPj0gQnVmZlNpemUpIHsKKyAgICAgICAgTlNMb2coIEAicHV0SGFzaFJ1bGVBdFJ1bGVJbmRleCBhdHRlbXB0aW5nIHRvIGluc2VydCBhUnVsZSBhdCBJbmRleCAlZCwgYnV0IEJ1ZmZlciBpcyBvbmx5ICVkIGxvbmdcbiIsIGFSdWxlSW5kZXgsIEJ1ZmZTaXplICk7CisgICAgICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OmFSdWxlSW5kZXhdOworICAgIH0KKyAgICBpZiAoKGFIYXNoUnVsZSA9IHB0ckJ1ZmZlclthUnVsZUluZGV4XSkgPT0gbmlsKSB7CisgICAgICAgIGFIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBuZXdBTlRMUkhhc2hSdWxlV2l0aExlbjoxN10gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyW2FSdWxlSW5kZXhdID0gYUhhc2hSdWxlOworICAgIH0KKyAgICBpZiAoKCBhUnVsZU1lbW8gPSBbYUhhc2hSdWxlIG9iamVjdEF0SW5kZXg6YVN0YXJ0SW5kZXhdICkgPT0gbmlsICkgeworICAgICAgICBhUnVsZU1lbW8gPSBbW0FOVExSUnVsZU1lbW8gbmV3QU5UTFJSdWxlTWVtb10gcmV0YWluXTsKKyAgICAgICAgW2FIYXNoUnVsZSBpbnNlcnRPYmplY3Q6YVJ1bGVNZW1vIGF0SW5kZXg6YVN0YXJ0SW5kZXhdOworICAgIH0KKyAgICBbYVJ1bGVNZW1vIHNldFN0YXJ0SW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdGFydEluZGV4XV07CisgICAgW2FSdWxlTWVtbyBzZXRTdG9wSW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdG9wSW5kZXhdXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmMDkxOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw1NCBAQAorLy8KKy8vICBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi81LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgQU5UTFJSdW50aW1lRXhjZXB0aW9uIDogTlNFeGNlcHRpb24KK3sKK30KKworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3QU5UTFJSdW50aW1lRXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3QU5UTFJSdW50aW1lRXhjZXB0aW9uOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSUnVudGltZUV4Y2VwdGlvbjooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzphVXNlckluZm87CisKKy0gKGlkKSBpbml0OworLSAoaWQpaW5pdFdpdGhSdW50aW1lOihOU1N0cmluZyAqKWFSZWFzb247CistIChpZClpbml0V2l0aFJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm87CisKKy0gKE5TU3RyaW5nICopIERlc2NyaXB0aW9uOworCisvLyAgICAtICh2b2lkKXNldERlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisvLyAgICAtICh2b2lkKXNldFN0YXRlTnVtYmVyOihOU0ludGVnZXIpc3RhdGVOdW1iZXI7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSU3RyZWFtRW51bWVyYXRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGUwZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaApAQCAtMCwwICsxLDQ1IEBACisvLworLy8gIEFOVExSU3RyZWFtRW51bWVydG9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI5LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJTdHJlYW1FbnVtZXJhdG9yIDogTlNFbnVtZXJhdG9yIAoreworCU5TSW50ZWdlciBpOworCWlkIGVvZjsKKwlOU011dGFibGVBcnJheSAqbm9kZXM7Cit9CisKKy0oaWQpIGluaXRXaXRoTm9kZXM6KE5TTXV0YWJsZUFycmF5ICopIG4gYW5kRU9GOihpZCkgbzsKKy0oQk9PTCkgaGFzTmV4dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlN0cmluZ1N0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlN0cmluZ1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJiMTNjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSU3RyaW5nU3RyZWFtLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbVN0YXRlLmgiCisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorCitAaW50ZXJmYWNlIEFOVExSU3RyaW5nU3RyZWFtIDogTlNPYmplY3QgPCBBTlRMUkNoYXJTdHJlYW0gPiB7CisJTlNTdHJpbmcgKmRhdGE7CisJTlNJbnRlZ2VyIG47CisJTlNJbnRlZ2VyIHA7CisJTlNJbnRlZ2VyIGxpbmU7CisJTlNJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworCUFOVExSUHRyQnVmZmVyICptYXJrZXJzOworCU5TSW50ZWdlciBsYXN0TWFya2VyOworCU5TU3RyaW5nICpuYW1lOworICAgIEFOVExSQ2hhclN0cmVhbVN0YXRlICpjaGFyU3RhdGU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RGF0YSxzZXR0ZXI9c2V0RGF0YTopIE5TU3RyaW5nICpkYXRhOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UCxzZXR0ZXI9c2V0UDopIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TixzZXR0ZXI9c2V0TjopIE5TSW50ZWdlciBuOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGluZSxzZXR0ZXI9c2V0TGluZTopIE5TSW50ZWdlciBsaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0Q2hhclBvc2l0aW9uSW5MaW5lLHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU0ludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TWFya0RlcHRoLHNldHRlcj1zZXRNYXJrRGVwdGg6KSBOU0ludGVnZXIgbWFya0RlcHRoOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRNYXJrZXJzLCBzZXR0ZXI9c2V0TWFya2VyczopIEFOVExSUHRyQnVmZmVyICptYXJrZXJzOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdE1hcmtlcixzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTb3VyY2VOYW1lLCBzZXR0ZXI9c2V0U291cmNlTmFtZTopIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDaGFyU3RhdGUsIHNldHRlcj1zZXRDaGFyU3RhdGU6KSBBTlRMUkNoYXJTdHJlYW1TdGF0ZSAqY2hhclN0YXRlOworCisrIG5ld0FOVExSU3RyaW5nU3RyZWFtOworCisrIG5ld0FOVExSU3RyaW5nU3RyZWFtOihOU1N0cmluZyAqKWFTdHJpbmc7CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW06KGNoYXIgKilteURhdGEgQ291bnQ6KE5TSW50ZWdlciludW1CeXRlczsKKworLSAoaWQpIGluaXQ7CisKKy8vIHRoaXMgaW5pdGlhbGl6ZXIgY29waWVzIHRoZSBzdHJpbmcKKy0gKGlkKSBpbml0V2l0aFN0cmluZzooTlNTdHJpbmcgKikgdGhlU3RyaW5nOworCisvLyBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgY29uc3RydWN0b3IgYXMgbm8gZGF0YSBpcyBjb3BpZWQKKy0gKGlkKSBpbml0V2l0aFN0cmluZ05vQ29weTooTlNTdHJpbmcgKikgdGhlU3RyaW5nOworCistIChpZCkgaW5pdFdpdGhEYXRhOihjaGFyICopbXlEYXRhIENvdW50OihOU0ludGVnZXIpbnVtQnl0ZXM7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisvLyByZXNldCB0aGUgc3RyZWFtJ3Mgc3RhdGUsIGJ1dCBrZWVwIHRoZSBkYXRhIHRvIGZlZWQgb2ZmCistICh2b2lkKSByZXNldDsKKy8vIGNvbnN1bWUgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0KKy0gKHZvaWQpIGNvbnN1bWU7CisKKy8vIGxvb2sgYWhlYWQgaSBjaGFyYWN0ZXJzCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIExUOihOU0ludGVnZXIpIGk7CisKKy8vIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbAorLSAoTlNJbnRlZ2VyKSBnZXRJbmRleDsKKy8vIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorLSAoTlNJbnRlZ2VyKSBzaXplOworCisvLyBzZWVrIGFuZCByZXdpbmQgaW4gdGhlIHN0cmVhbQorLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKSBpbmRleDsKKworLy8gcHJvdmlkZSB0aGUgc3RyZWFtcyBkYXRhIChlLmcuIGZvciB0b2tlbnMgdXNpbmcgaW5kaWNlcykKKy0gKE5TU3RyaW5nICopIHN1YnN0cmluZzooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU1N0cmluZyAqKSBzdWJzdHJpbmdXaXRoUmFuZ2U6KE5TUmFuZ2UpIHRoZVJhbmdlOworCisvLyB1c2VkIGZvciB0cmFja2luZyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtCistIChOU0ludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOihOU0ludGVnZXIpIHRoZUxpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKSB0aGVQb3M7CisKKy0gKE5TSW50ZWdlcikgZ2V0TjsKKy0gKHZvaWQpIHNldE46KE5TSW50ZWdlciludW07CisKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6KE5TSW50ZWdlciludW07CisKKy0gKEFOVExSUHRyQnVmZmVyICopZ2V0TWFya2VyczsKKy0gKHZvaWQpIHNldE1hcmtlcnM6KEFOVExSUHRyQnVmZmVyICopYU1hcmtlckxpc3Q7CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworLy8gYWNjZXNzb3JzIHRvIHRoZSByYXcgZGF0YSBvZiB0aGlzIHN0cmVhbQorLSAoTlNTdHJpbmcgKikgZ2V0RGF0YTsKKy0gKHZvaWQpIHNldERhdGE6IChOU1N0cmluZyAqKSBhRGF0YTsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2suaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJTeW1ib2xTdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWRmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2suaApAQCAtMCwwICsxLDc1IEBACisvLworLy8gIEFOVExSU3ltYm9sU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorLy8gI2ltcG9ydCAiQU5UTFJTeW1ib2xTY29wZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSU3ltYm9sc1Njb3BlIDogTlNPYmplY3QKK3sKKyAgICAKK30KKworKyAoQU5UTFJTeW1ib2xzU2NvcGUgKiluZXdBTlRMUlN5bWJvbHNTY29wZTsKKworLSAoaWQpaW5pdDsKK0BlbmQKKworCitAaW50ZXJmYWNlIEFOVExSU3ltYm9sU3RhY2sgOiBBTlRMUkJhc2VTdGFjayB7Cit9CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrKEFOVExSU3ltYm9sU3RhY2sgKiluZXdBTlRMUlN5bWJvbFN0YWNrOworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKilnZXRIYXNoTWFwRW50cnk6KE5TSW50ZWdlcilpZHg7CisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKiopZ2V0SGFzaE1hcDsKKworLShBTlRMUlN5bWJvbHNTY29wZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJTeW1ib2xzU2NvcGUgKilhU2NvcGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKEFOVExSU3ltYm9sc1Njb3BlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlN5bWJvbFN0YWNrLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2subQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQ2Nzc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlN5bWJvbFN0YWNrLm0KQEAgLTAsMCArMSwxMjMgQEAKKy8vCisvLyAgQU5UTFJTeW1ib2xTdGFjay5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJTeW1ib2xTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSU3ltYm9sc1Njb3BlCisKKysgKEFOVExSU3ltYm9sc1Njb3BlICopbmV3QU5UTFJTeW1ib2xzU2NvcGUKK3sKKyAgICByZXR1cm4oIFtbQU5UTFJTeW1ib2xzU2NvcGUgYWxsb2NdIGluaXRdICk7Cit9CisKKy0gKGlkKWluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgIH0KKyAgICByZXR1cm4gKHNlbGYpOworfQorCitAZW5kCisKKy8qCisgKiBTdGFydCBvZiBBTlRMUlN5bWJvbFN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlN5bWJvbFN0YWNrCisKKysoQU5UTFJTeW1ib2xTdGFjayAqKW5ld0FOVExSU3ltYm9sU3RhY2sKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0XTsKK30KKworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0V2l0aExlbjpjbnRdOworfQorCistKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpjbnRdKSAhPSBuaWwpIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZQoreworICAgIHJldHVybiBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsKK30KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKWdldEhhc2hNYXBFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggKEFOVExSU3ltYm9sc1Njb3BlICopW3N1cGVyIG9iamVjdEF0SW5kZXg6aWR4XSApOworfQorCistKEFOVExSU3ltYm9sc1Njb3BlICoqKWdldEhhc2hNYXAKK3sKKwlyZXR1cm4oIChBTlRMUlN5bWJvbHNTY29wZSAqKilwdHJCdWZmZXIgKTsKK30KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKSBwb3AKK3sKKyAgICByZXR1cm4gKEFOVExSU3ltYm9sc1Njb3BlICopW3N1cGVyIHBvcF07Cit9CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJTeW1ib2xzU2NvcGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbaWR4XSAhPSBuaWwpIFtwdHJCdWZmZXJbaWR4XSByZWxlYXNlXTsKKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltpZHhdID0gYVJ1bGU7Cit9CisKKy0gKEFOVExSU3ltYm9sc1Njb3BlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIHJldHVybiAoQU5UTFJTeW1ib2xzU2NvcGUgKilbc3VwZXIgb2JqZWN0QXRJbmRleDppZHhdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjU5ZTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaApAQCAtMCwwICsxLDQxIEBACisvLworLy8gIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEtheSBSw7Zwa2Ugb24gMDMuMTIuMjAwNi4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25Ub2tlbihEZWJ1Z2dlclN1cHBvcnQpCisKKy0gKE5TU3RyaW5nICopZGVidWdnZXJEZXNjcmlwdGlvbjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRva2VuLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVG9rZW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDUyNGYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRva2VuLmgKQEAgLTAsMCArMSw3OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUlRva2VuVHlwZUVPRiA9IC0xLAorCUFOVExSVG9rZW5UeXBlSW52YWxpZCwKKwlBTlRMUlRva2VuVHlwZUVPUiwKKwlBTlRMUlRva2VuVHlwZURPV04sCisJQU5UTFJUb2tlblR5cGVVUCwKKwlBTlRMUlRva2VuVHlwZU1JTgorfSBBTlRMUlRva2VuVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgPSAwLAorICAgIEFOVExSVG9rZW5DaGFubmVsSGlkZGVuID0gOTkKK30gQU5UTFJUb2tlbkNoYW5uZWw7CisKKyNkZWZpbmUgSElEREVOIDk5CisKK0Bwcm90b2NvbCBBTlRMUlRva2VuIDwgTlNPYmplY3QsIE5TQ29weWluZyA+CisKKy8vIFRoZSBzaW5nbGV0b24gZW9mVG9rZW4gaW5zdGFuY2UuCisrIChpZDxBTlRMUlRva2VuPikgZW9mVG9rZW47CisvLyBUaGUgZGVmYXVsdCBjaGFubmVsIGZvciB0aGlzIGNsYXNzIG9mIFRva2VucworKyAoQU5UTFJUb2tlbkNoYW5uZWwpIGRlZmF1bHRDaGFubmVsOworCisvLyBwcm92aWRlIGhvb2tzIHRvIGV4cGxpY2l0ZWx5IHNldCB0aGUgdGV4dCBhcyBvcHBvc2VkIHRvIHVzZSB0aGUgaW5kaWNlcyBpbnRvIHRoZSBDaGFyU3RyZWFtCistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOworLSAodm9pZCkgc2V0VHlwZTogKE5TSW50ZWdlcikgYVR5cGU7CisKKy8vIEFOVExSIHYzIHByb3ZpZGVzIGF1dG9tYXRpYyBsaW5lIGFuZCBwb3NpdGlvbiB0cmFja2luZy4gU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0bworLy8gb3ZlcnJpZGUgdGhlc2UsIGlmIHRoZXkgZG8gbm90IHdhbnQgdG8gc3RvcmUgbGluZS9wb3MgdHJhY2tpbmcgaW5mb3JtYXRpb24KKy0gKE5TVUludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOiAoTlNVSW50ZWdlcikgYUxpbmU7CisKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTogKE5TVUludGVnZXIpIGFDaGFyUG9zaXRpb25JbkxpbmU7CisKKy8vIGV4cGxpY2l0ZWx5IGNoYW5nZSB0aGUgY2hhbm5lbCB0aGlzIFRva2VuIGlzIG9uLiBUaGUgZGVmYXVsdCBwYXJzZXIgaW1wbGVtZW50YXRpb24KKy8vIGp1c3Qgc2VlcyB0aGUgZGVmYXVsdENoYW5uZWwKKy8vIENvbW1vbiBpZGlvbSBpcyB0byBwdXQgd2hpdGVzcGFjZSB0b2tlbnMgb24gY2hhbm5lbCA5OS4KKy0gKE5TVUludGVnZXIpIGdldENoYW5uZWw7CistICh2b2lkKSBzZXRDaGFubmVsOiAoTlNVSW50ZWdlcikgYUNoYW5uZWw7CisKKy8vIHRoZSBpbmRleCBvZiB0aGlzIFRva2VuIGludG8gdGhlIFRva2VuU3RyZWFtCistIChOU1VJbnRlZ2VyKSBnZXRUb2tlbkluZGV4OworLSAodm9pZCkgc2V0VG9rZW5JbmRleDogKE5TVUludGVnZXIpIGFUb2tlbkluZGV4OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODY4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8vCisvLyAgQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisjaW1wb3J0ICJBTlRMUk1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKworLy8gRGVmaW5lIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBoaWVyYXJjaHkKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVPcGVyYXRpb24gOiBBTlRMUkNvbW1vblRva2VuU3RyZWFtCit7CisvKiogV2hhdCBpbmRleCBpbnRvIHJld3JpdGVzIExpc3QgYXJlIHdlPyAqLworTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CisvKiogVG9rZW4gYnVmZmVyIGluZGV4LiAqLworTlNJbnRlZ2VyIGluZGV4OworTlNTdHJpbmcgKnRleHQ7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldEluc3RydWN0aW9uSW5kZXgsIHNldHRlcj1zZXRJbnN0cnVjdGlvbkluZGV4OikgTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CitAcHJvcGVydHkgKGdldHRlcj1nZXRJbmRleCwgc2V0dGVyPXNldEluZGV4OikgTlNJbnRlZ2VyIGluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworCisrIChBTlRMUlJld3JpdGVPcGVyYXRpb24gKikgbmV3QU5UTFJSZXdyaXRlT3BlcmF0aW9uOihOU0ludGVnZXIpaW5kZXggVGV4dDooTlNTdHJpbmcgKil0ZXh0OworCistIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCisvKiogRXhlY3V0ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gYnkgcG9zc2libHkgYWRkaW5nIHRvIHRoZSBidWZmZXIuCisgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB0b2tlbiB0byBvcGVyYXRlIG9uLgorICovCistIChOU0ludGVnZXIpIGV4ZWN1dGU6KE5TU3RyaW5nICopYnVmOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNJbnRlZ2VyKSBpbmRleE9mOihjaGFyKWFDaGFyIGluU3RyaW5nOihOU1N0cmluZyAqKWFTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJJbnNlcnRCZWZvcmVPcCA6IEFOVExSUmV3cml0ZU9wZXJhdGlvbiB7Cit9CisKKysgKEFOVExSSW5zZXJ0QmVmb3JlT3AgKikgbmV3QU5UTFJJbnNlcnRCZWZvcmVPcDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAoaWQpIGluaXRXaXRoSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworQGVuZAorCisvKiogSSdtIGdvaW5nIHRvIHRyeSByZXBsYWNpbmcgcmFuZ2UgZnJvbSB4Li55IHdpdGggKHkteCkrMSBSZXBsYWNlT3AKKyAqICBpbnN0cnVjdGlvbnMuCisgKi8KK0BpbnRlcmZhY2UgQU5UTFJSZXBsYWNlT3AgOiBBTlRMUlJld3JpdGVPcGVyYXRpb24geworICAgIE5TSW50ZWdlciBsYXN0SW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RJbmRleCwgc2V0dGVyPXNldExhc3RJbmRleDopIE5TSW50ZWdlciBsYXN0SW5kZXg7CisKKysgKEFOVExSUmVwbGFjZU9wICopIG5ld0FOVExSUmVwbGFjZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcqKXRoZVRleHQ7CistIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBleGVjdXRlOihOU1N0cmluZyAqKWJ1ZjsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkRlbGV0ZU9wIDogQU5UTFJSZXBsYWNlT3AgeworfQorKyAoQU5UTFJEZWxldGVPcCAqKSBuZXdBTlRMUkRlbGV0ZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CisKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtIDogQU5UTFJDb21tb25Ub2tlblN0cmVhbSB7CisvKiogWW91IG1heSBoYXZlIG11bHRpcGxlLCBuYW1lZCBzdHJlYW1zIG9mIHJld3JpdGUgb3BlcmF0aW9ucy4KKyAqICBJJ20gY2FsbGluZyB0aGVzZSB0aGluZ3MgInByb2dyYW1zLiIKKyAqICBNYXBzIFN0cmluZyAobmFtZSkgLT4gcmV3cml0ZSAoTGlzdCkKKyAqLworQU5UTFJIYXNoTWFwICpwcm9ncmFtczsKKworLyoqIE1hcCBTdHJpbmcgKHByb2dyYW0gbmFtZSkgLT4gSW50ZWdlciBpbmRleCAqLworQU5UTFJIYXNoTWFwICpsYXN0UmV3cml0ZVRva2VuSW5kZXhlczsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQcm9ncmFtcywgc2V0dGVyPXNldFByb2dyYW1zOikgQU5UTFJIYXNoTWFwICpwcm9ncmFtczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TGFzdFJld3JpdGVUb2tlbkluZGV4ZXMsIHNldHRlcj1zZXRMYXN0UmV3cml0ZVRva2VuSW5kZXhlczopIEFOVExSSGFzaE1hcCAqbGFzdFJld3JpdGVUb2tlbkluZGV4ZXM7CisKKysgKEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtICopbmV3QU5UTFJUb2tlblJld3JpdGVTdHJlYW07CisrIChBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSAqKW5ld0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtOihpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlOworKyAoQU5UTFJUb2tlblJld3JpdGVTdHJlYW0gKiluZXdBTlRMUlRva2VuUmV3cml0ZVN0cmVhbTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZSBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKGlkKSBpbml0OworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlOworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbDsKKworLSAoQU5UTFJIYXNoTWFwICopZ2V0UHJvZ3JhbXM7CistICh2b2lkKXNldFByb2dyYW1zOihBTlRMUkhhc2hNYXAgKilhUHJvZ0xpc3Q7CisKKy0gKHZvaWQpIHJvbGxiYWNrOihOU0ludGVnZXIpaW5zdHJ1Y3Rpb25JbmRleDsKKy0gKHZvaWQpIHJvbGxiYWNrOihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnN0cnVjdGlvbkluZGV4OworLSAodm9pZCkgZGVsZXRlUHJvZ3JhbTsKKy0gKHZvaWQpIGRlbGV0ZVByb2dyYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWU7CistICh2b2lkKSBpbnNlcnRBZnRlclRva2VuOihpZDxBTlRMUlRva2VuPil0IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEFmdGVySW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEFmdGVyUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCisKKy0gKHZvaWQpIGluc2VydEJlZm9yZVRva2VuOihpZDxBTlRMUlRva2VuPil0IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEJlZm9yZUluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSBpbnNlcnRCZWZvcmVQcm9nTmFtZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilpbmRleFQgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZVByb2dOYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgZGVsZXRlOihOU0ludGVnZXIpYW5JbmRleDsKKy0gKHZvaWQpIGRlbGV0ZTooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvOworLSAodm9pZCkgZGVsZXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWluZGV4VDsKKy0gKHZvaWQpIGRlbGV0ZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0bzsKKy0gKHZvaWQpIGRlbGV0ZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWZyb20gVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdG87CistICh2b2lkKSBkZWxldGU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CistIChOU0ludGVnZXIpZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OworLSAoTlNJbnRlZ2VyKWdldExhc3RSZXdyaXRlVG9rZW5JbmRleDooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKHZvaWQpc2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnQ7CistIChBTlRMUkhhc2hNYXAgKikgZ2V0UHJvZ3JhbTooTlNTdHJpbmcgKiluYW1lOworLSAoQU5UTFJIYXNoTWFwICopIGluaXRpYWxpemVQcm9ncmFtOihOU1N0cmluZyAqKW5hbWU7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc6KE5TSW50ZWdlcilzdGFydCBFbmQ6KE5TSW50ZWdlcillbmQ7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNTdHJpbmcgKil0b1N0cmluZzooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydCBUb0VuZDooTlNJbnRlZ2VyKWVuZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnQgVG9FbmQ6KE5TSW50ZWdlcillbmQ7CistIChBTlRMUkhhc2hNYXAgKilyZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4OihBTlRMUkhhc2hNYXAgKilyZXdyaXRlczsKKy0gKEFOVExSSGFzaE1hcCAqKWdldEtpbmRPZk9wczooQU5UTFJIYXNoTWFwICopcmV3cml0ZXMgS2luZE9mQ2xhc3M6KENsYXNzKWtpbmQ7CistIChBTlRMUkhhc2hNYXAgKilnZXRLaW5kT2ZPcHM6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzIEtpbmRPZkNsYXNzOihDbGFzcylraW5kIEluZGV4OihOU0ludGVnZXIpYmVmb3JlOworLSAoTlNTdHJpbmcgKiljYXRPcFRleHQ6KGlkKWEgUHJldlRleHQ6KGlkKWI7CistIChOU011dGFibGVTdHJpbmcgKil0b0RlYnVnU3RyaW5nOworLSAoTlNNdXRhYmxlU3RyaW5nICopdG9EZWJ1Z1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0IFRvRW5kOihOU0ludGVnZXIpZW5kOworICAgICAgICAgICAgICAgICAgICAKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUb2tlblNvdXJjZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRva2VuU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQ2YjZlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUb2tlblNvdXJjZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworLy8gQW55dGhpbmcgdGhhdCByZXNwb25kcyB0byAtbmV4dFRva2VuIGNhbiBiZSB0cmVhdGVkIGFzIGEgbGV4ZXIuCisvLyBGb3IgaW5zdGFuY2UgdGhpcyBjYW4gYmUgYSBmbGV4IGxleGVyIG9yIGEgaGFuZHdyaXR0ZW4gb25lIG9yIGV2ZW4KKy8vIGEgcHJveHkgZm9yIGEgcmVtb3RlbHkgcnVubmluZyB0b2tlbiBzb3VyY2UgKGRhdGFiYXNlLCBsZXhlciwgd2hhdGV2ZXIpLgorQHByb3RvY29sIEFOVExSVG9rZW5Tb3VyY2UgPE5TT2JqZWN0LCBOU0NvcHlpbmc+CisKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxMDQ1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAcHJvdG9jb2wgQU5UTFJUb2tlblN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLy8gR2V0IFRva2VuIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgVG9rZW4uCisvLyBpPDAgaW5kaWNhdGVzIHRva2VucyBpbiB0aGUgcGFzdC4gIFNvIC0xIGlzIHByZXZpb3VzIHRva2VuIGFuZCAtMiBpcworLy8gdHdvIHRva2VucyBhZ28uIExUOjAgaXMgdW5kZWZpbmVkLiAgRm9yIGk+PW4sIHJldHVybiBUb2tlbi5FT0ZUb2tlbi4KKy8vIFJldHVybiBudWxsIGZvciBMVDowIGFuZCBhbnkgaW5kZXggdGhhdCByZXN1bHRzIGluIGFuIGFic29sdXRlIGFkZHJlc3MKKy8vIHRoYXQgaXMgbmVnYXRpdmUuCisKKy0gKGlkPEFOVExSVG9rZW4+KSBMVDooTlNJbnRlZ2VyKSBpOworCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TVUludGVnZXIpIGk7CisKKy0gKGlkKSBnZXRUb2tlblNvdXJjZTsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisvKiogUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgKiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSB0b2tlbnMgdGhlbiBpdCBjYW4ganVzdAorICogIHJldHVybiAiIiBvciBudWxsOyAgVXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgKiAgYW4gYWN0aW9uIG9mIGNvdXJzZSBpbiB0aGF0IGNhc2UuCisgKi8KKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydElkeCBUb0VuZDooTlNJbnRlZ2VyKXN0b3BJZHg7CisKKy8qKiBCZWNhdXNlIHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UgYSB0b2tlbiB3aXRoIGFuIGluZGV4IHN0b3JlZAorICogIGluIGl0LCB3ZSBtdXN0IHByb3ZpZGUgYSBtZWFucyBmb3IgdHdvIHRva2VuIG9iamVjdHMgdGhlbXNlbHZlcyB0bworICogIGluZGljYXRlIHRoZSBzdGFydC9lbmQgbG9jYXRpb24uICBNb3N0IG9mdGVuIHRoaXMgd2lsbCBqdXN0IGRlbGVnYXRlCisgKiAgdG8gdGhlIG90aGVyIHRvU3RyaW5nKGludCxpbnQpLiAgVGhpcyBpcyBhbHNvIHBhcmFsbGVsIHdpdGgKKyAqICB0aGUgVHJlZU5vZGVTdHJlYW0udG9TdHJpbmcoT2JqZWN0LE9iamVjdCkuCisgKi8KKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjY5YjJkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWUuaApAQCAtMCwwICsxLDEyMyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0Bwcm90b2NvbCBBTlRMUlRyZWUgPCBOU09iamVjdCwgTlNDb3B5aW5nID4KKworLy8rIChpZDxBTlRMUlRyZWU+KSBpbnZhbGlkTm9kZTsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaW5kZXg7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBUcmVlIHRyYWNrcyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IG5vdyA+IDMuMAorCistIChpZDxBTlRMUlRyZWU+KWdldFBhcmVudDsKKworLSAodm9pZCkgc2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CisKKy8qKiBJcyB0aGVyZSBpcyBhIG5vZGUgYWJvdmUgd2l0aCB0b2tlbiB0eXBlIHR0eXBlPyAqLworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKworLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CisKKy8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAqLworLSAoTlNNdXRhYmxlQXJyYXkgKikgZ2V0QW5jZXN0b3JzOworCisvKiogVGhpcyBub2RlIGlzIHdoYXQgY2hpbGQgaW5kZXg/IDAuLm4tMSAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworCistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCisvKiogU2V0IHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IHZhbHVlcyBmb3IgYWxsIGNoaWxkcmVuICovCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworCisvKiogQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisgKiAgaXMgbmlsLCBhZGQgYWxsIGNoaWxkcmVuIG9mIHQgdG8gdGhpcycgY2hpbGRyZW4uCisgKi8KKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUlRyZWU+KSB0OworCisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KE5TSW50ZWdlcilpIFdpdGg6KGlkPEFOVExSVHJlZT4pIHQ7CisKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNJbnRlZ2VyKSBpOworCisvKiogRGVsZXRlIGNoaWxkcmVuIGZyb20gc3RhcnQgdG8gc3RvcCBhbmQgcmVwbGFjZSB3aXRoIHQgZXZlbiBpZiB0IGlzCisgKiAgYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgKiAgY2hpbGRyZW4gdG8gc2V0IHRoZWlyIGNoaWxkaW5kZXg7IGNvdWxkIGJlIHNsb3cuCisgKi8KKy0gKHZvaWQpIHJlcGxhY2VDaGlsZHJlbkZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZCl0OwkKKworLSAoTlNBcnJheSAqKSBnZXRDaGlsZHJlbjsKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhIG5pbCBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworCisvKiogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CisKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKSBpbmRleDsKKworLyoqICBXaGF0IGlzIHRoZSBsYXJnZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCistIChpZDxBTlRMUlRyZWU+KSBkdXBOb2RlOworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKworI3ByYWdtYSBtYXJrIENvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOwkvLyB0aGUgY2hpbGRyZW4gdGhlbXNlbHZlcyBhcmUgbm90IGNvcGllZCBoZXJlIQorLSAoaWQpIGRlZXBDb3B5OwkJCQkJLy8gcGVyZm9ybXMgYSBkZWVwQ29weVdpdGhab25lOiB3aXRoIHRoZSBkZWZhdWx0IHpvbmUKKy0gKGlkKSBkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworI3ByYWdtYSBtYXJrIFRyZWUgUGFyc2VyIHN1cHBvcnQKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKXBvczsKKworI3ByYWdtYSBtYXJrIEluZm9ybWF0aW9uYWwKKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlQWRhcHRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVBZGFwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY1NzljZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlQWRhcHRvci5oCkBAIC0wLDAgKzEsMTU5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorCisjcHJhZ21hIHdhcm5pbmcgdHJlZS9ub2RlIGRpY3Rpb24gaXMgYnJva2VuLgorCitAcHJvdG9jb2wgQU5UTFJUcmVlQWRhcHRvciA8TlNPYmplY3QsIE5TQ29weWluZz4KKworI3ByYWdtYSBtYXJrIENvbnN0cnVjdGlvbgorCisrIChpZDxBTlRMUlRyZWU+KSBuZXdFbXB0eVRyZWU7CisKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVBZGFwdG9yIGltcGxlbWVudGF0aW9uCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU6KGlkPEFOVExSVHJlZT4pYU5vZGU7CS8vIGNvcGllcyBqdXN0IHRoZSBub2RlCistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CS8vIGNvcGllcyB0aGUgZW50aXJlIHN1YnRyZWUsIHJlY3Vyc2l2ZWx5CisKKy8qKiBSZXR1cm4gYSBuaWwgbm9kZSAoYW4gZW1wdHkgYnV0IG5vbi1udWxsIG5vZGUpIHRoYXQgY2FuIGhvbGQKKyAqICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICogIHVzZSAidD1hZGFwdG9yLm5pbCgpOyB0LmFkZENoaWxkKHgpOyB0LmFkZENoaWxkKHkpOyIKKyAqLworLSAoaWQpIGVtcHR5Tm9kZTsKKworLyoqIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAqICB0b2tlbnMgY29uc3VtZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5LiAgVGhlIHN0YXJ0IHRva2VuIGluZGljYXRlcyB0aGUKKyAqICBpbnB1dCBzeW1ib2wgYXQgd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gIFRoZSBzdG9wIHRva2VuIGluZGljYXRlcworICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGlucHV0IHN0cmVhbSBzbyB0aGF0IHRoZSBlcnJvbmVvdXMgdGV4dCBjYW4KKyAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgKiAgdG8gc29tZSBhcHBsaWNhdGlvbnM7IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3RvcmVzIHB0ciB0byBpdCBpbgorICogIHRoZSBDb21tb25FcnJvck5vZGUuCisgKgorICogIFRoaXMgb25seSBtYWtlcyBzZW5zZSBkdXJpbmcgdG9rZW4gcGFyc2luZywgbm90IHRyZWUgcGFyc2luZy4KKyAqICBUcmVlIHBhcnNpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gcGFyc2luZyBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24KKyAqICBzdWNjZWVkLgorICovCistIChpZCkgZXJyb3JOb2RlOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICBGcm9tOihpZDxBTlRMUlRva2VuPilhU3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pYVN0b3BUb2tlbgorICAgICAgIEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKikgZTsKKworLyoqIElzIHRyZWUgY29uc2lkZXJlZCBhIG5pbCBub2RlIHVzZWQgdG8gbWFrZSBsaXN0cyBvZiBjaGlsZCBub2Rlcz8gKi8KKy0gKEJPT0wpIGlzTmlsOihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisKKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUlRyZWU+KWNoaWxkIHRvVHJlZTooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLyoqIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAqCisgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAqCisgKiAgICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgKgorICogIFJldHVybiBuZXdSb290LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5ld1Jvb3QgaXMgbm90IGEKKyAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAqCisgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAqICBjb25zdHJ1Y3RpbmcgdGhlc2Ugbm9kZXMgc28gd2Ugc2hvdWxkIGhhdmUgdGhpcyBjb250cm9sIGZvcgorICogIGVmZmljaWVuY3kuCisgKi8KKy0gKGlkKSBiZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KW5ld1Jvb3Qgb2xkOihpZDxBTlRMUlRyZWU+KW9sZFJvb3Q7CisKKy0gKGlkKSBydWxlUG9zdFByb2Nlc3Npbmc6KGlkPEFOVExSVHJlZT4pcm9vdDsKKworI3ByYWdtYSBtYXJrIFJld3JpdGUgUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLSAoTlNVSW50ZWdlcikgZ2V0VW5pcXVlSUQ6KGlkPEFOVExSVHJlZT4pYU5vZGU7CisKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW47CistIChpZDxBTlRMUlRyZWU+KSBjcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIEZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0ZXh0OworCisjcHJhZ21hIG1hcmsgQ29udGVudAorCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU6KGlkPEFOVExSVHJlZT4pYU5vZGU7CistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CisKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKHZvaWQpIHNldFR5cGU6KGlkPEFOVExSVHJlZT4pYU5vZGUgVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKHZvaWQpIHNldFRleHQ6KGlkPEFOVExSVHJlZT4pYU5vZGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooaWQ8QU5UTFJUcmVlPil0OworCistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXM6KGlkPEFOVExSVHJlZT4pYVRyZWUgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg6KGlkPEFOVExSVHJlZT4pYVRyZWU7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisjcHJhZ21hIG1hcmsgTmF2aWdhdGlvbiAvIFRyZWUgUGFyc2luZworCisvKiogR2V0IGEgY2hpbGQgMC4ubi0xIG5vZGUgKi8KKy0gKGlkPEFOVExSVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUlRyZWU+KWFOb2RlIEF0OihOU0ludGVnZXIpIGk7CisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkPEFOVExSVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJUcmVlPiljaGlsZDsKKy8qKiBSZW1vdmUgaXRoIGNoaWxkIGFuZCBzaGlmdCBjaGlsZHJlbiBkb3duIGZyb20gcmlnaHQuICovCistIChpZDxBTlRMUlRyZWU+KSBkZWxldGVDaGlsZDooaWQ8QU5UTFJUcmVlPil0IEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy8qKiBIb3cgbWFueSBjaGlsZHJlbj8gIElmIDAsIHRoZW4gdGhpcyBpcyBhIGxlYWYgbm9kZSAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZENvdW50OihpZDxBTlRMUlRyZWU+KSBhVHJlZTsKKworLyoqIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdC4KKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoaWQ8QU5UTFJUcmVlPilnZXRQYXJlbnQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpIHNldFBhcmVudDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KGlkPEFOVExSVHJlZT4pcGFyZW50OworCisvKiogV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKSBzZXRDaGlsZEluZGV4OihpZDxBTlRMUlRyZWU+KXQgV2l0aDooTlNJbnRlZ2VyKWluZGV4OworCistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KGlkPEFOVExSVHJlZT4pcGFyZW50IEZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZDxBTlRMUlRyZWU+KXQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlYzVjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlRXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJaWQ8QU5UTFJUcmVlPiBvbGRSb290OworCWlkPEFOVExSVHJlZT4gbmV3Um9vdDsKK30KKworKyAoaWQpIGV4Y2VwdGlvbldpdGhPbGRSb290OihpZDxBTlRMUlRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CistIChpZCkgaW5pdFdpdGhPbGRSb290OihpZDxBTlRMUlRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CisKKy0gKHZvaWQpIHNldE9sZFJvb3Q6KGlkPEFOVExSVHJlZT4pYVRyZWU7CistICh2b2lkKSBzZXROZXdSb290OihpZDxBTlRMUlRyZWU+KWFUcmVlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZUl0ZXJhdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZUl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkNWU3MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlSXRlcmF0b3IuaApAQCAtMCwwICsxLDY3IEBACisvLworLy8gIEFOVExSVHJlZUl0ZXJhdG9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI2LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJGYXN0UXVldWUuaCIKKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVHJlZUl0ZXJhdG9yIDogTlNPYmplY3QgCit7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKwlpZDxBTlRMUlRyZWU+IHJvb3Q7CisJaWQ8QU5UTFJUcmVlPiB0cmVlOworCUJPT0wgZmlyc3RUaW1lOworCWlkPEFOVExSVHJlZT4gdXA7CisJaWQ8QU5UTFJUcmVlPiBkb3duOworCWlkPEFOVExSVHJlZT4gZW9mOworCQorCUFOVExSRmFzdFF1ZXVlICpub2RlczsKK30KKworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUlRyZWU+IHVwOworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUlRyZWU+IGRvd247CitAcHJvcGVydHkocmV0YWluLCByZWFkd3JpdGUpIGlkPEFOVExSVHJlZT4gZW9mOworCisrIG5ld0FOVFJMVHJlZUl0ZXJhdG9yOworKyAoQU5UTFJUcmVlSXRlcmF0b3IgKikgbmV3QU5UUkxUcmVlSXRlcmF0b3JXaXRoQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZFRyZWU6KGlkPEFOVExSVHJlZT4pdHJlZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVHJlZTooaWQ8QU5UTFJUcmVlPikgdDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPikgYSBhbmRUcmVlOihpZDxBTlRMUlRyZWU+KSB0OworCistICh2b2lkKSByZXNldDsKKy0gKEJPT0wpIGhhc05leHQ7CistIChpZCkgbmV4dE9iamVjdDsKKy0gKE5TQXJyYXkgKikgYWxsT2JqZWN0czsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVOb2RlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZU5vZGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjYzNDJjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVOb2RlU3RyZWFtLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKworQHByb3RvY29sIEFOVExSVHJlZU5vZGVTdHJlYW0gPCBBTlRMUkludFN0cmVhbSA+IAorCistIChpZCkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KXRoZUFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIExUOihOU0ludGVnZXIpazsKKy0gKGlkKSBnZXRUcmVlU291cmNlOworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGdldFRva2VuU3RyZWFtOyAKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClmbGFnOworCistIChpZCkgZ2V0Tm9kZTooTlNJbnRlZ2VyKSBpZHg7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKXN0YXJ0Tm9kZSBUb05vZGU6KGlkKXN0b3BOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVBhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMmYwMWVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVQYXJzZXIuaApAQCAtMCwwICsxLDg5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVJlY29nbml6ZXIuaCIKKyNpbXBvcnQgIkFOVExSVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGFyc2VyIDogQU5UTFJCYXNlUmVjb2duaXplciB7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0SW5wdXQsIHNldHRlcj1zZXRJbnB1dDopIGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+IGlucHV0OworCisrIChpZCkgbmV3QU5UTFJUcmVlUGFyc2VyOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0FOVExSVHJlZVBhcnNlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVJbnB1dDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlSW5wdXQKKyAgICAgICAgICAgICAgICBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworCistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0OworCistICh2b2lkKSBzZXRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGFuSW5wdXQ7CistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgZ2V0VHJlZU5vZGVTdHJlYW07CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoaWQpIGdldEN1cnJlbnRJbnB1dFN5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0OworCistIChpZCkgZ2V0TWlzc2luZ1N5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KWlucHV0CisgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKSBlCisgICAgICAgICAgRXhwZWN0ZWRUb2tlbjooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICBCaXRTZXQ6KEFOVExSQml0U2V0ICopZm9sbG93OworCisvKiogTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKyAqICBlbnRpcmUgdHJlZSBpZiBub2RlIGhhcyBjaGlsZHJlbi4gIElmIGNoaWxkcmVuLCBzY2FuIHVudGlsCisgKiAgY29ycmVzcG9uZGluZyBVUCBub2RlLgorICovCistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWlnbm9yZTsKKworLyoqIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgorICogIHBsdXMgd2Ugd2FudCB0byBhbHRlciB0aGUgZXhjZXB0aW9uIHR5cGUuICBEb24ndCB0cnkgdG8gcmVjb3ZlcgorICogIGZyb20gdHJlZSBwYXJzZXIgZXJyb3JzIGlubGluZS4uLgorICovCistIChpZCkgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcil0dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLyoqIFByZWZpeCBlcnJvciBtZXNzYWdlIHdpdGggdGhlIGdyYW1tYXIgbmFtZSBiZWNhdXNlIG1lc3NhZ2UgaXMKKyAqICBhbHdheXMgaW50ZW5kZWQgZm9yIHRoZSBwcm9ncmFtbWVyIGJlY2F1c2UgdGhlIHBhcnNlciBidWlsdAorICogIHRoZSBpbnB1dCB0cmVlIG5vdCB0aGUgdXNlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CisKKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihOU0FycmF5ICopIHRva2VuTmFtZXM7CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKSB0cmFjZU91dDooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlUGF0dGVybkxleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5MZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDU5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5MZXhlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vCisvLyAgQU5UTFJUcmVlUGF0dGVybkxleGVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUkxleGVyVG9rZW5UeXBlRU9GID0gLTEsCisJQU5UTFJMZXhlclRva2VuVHlwZUludmFsaWQsCisJQU5UTFJMZXhlclRva2VuVHlwZUJFR0lOLAorCUFOVExSTGV4ZXJUb2tlblR5cGVFTkQsCisJQU5UTFJMZXhlclRva2VuVHlwZUlELAorCUFOVExSTGV4ZXJUb2tlblR5cGVBUkcsCisJQU5UTFJMZXhlclRva2VuVHlwZVBFUkNFTlQsCisJQU5UTFJMZXhlclRva2VuVHlwZUNPTE9OLAorCUFOVExSTGV4ZXJUb2tlblR5cGVET1QsCit9IEFOVExSTGV4ZXJUb2tlblR5cGU7CisKKworQGludGVyZmFjZSBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgOiBOU09iamVjdCB7CisKKy8qKiBUaGUgdHJlZSBwYXR0ZXJuIHRvIGxleCBsaWtlICIoQSBCIEMpIiAqLworTlNTdHJpbmcgKnBhdHRlcm47CisgICAgCisvKiogSW5kZXggaW50byBpbnB1dCBzdHJpbmcgKi8KK05TSW50ZWdlciBwOworICAgIAorLyoqIEN1cnJlbnQgY2hhciAqLworTlNJbnRlZ2VyIGM7CisgICAgCisvKiogSG93IGxvbmcgaXMgdGhlIHBhdHRlcm4gaW4gY2hhcj8gKi8KK05TSW50ZWdlciBuOworICAgIAorLyoqIFNldCB3aGVuIHRva2VuIHR5cGUgaXMgSUQgb3IgQVJHIChuYW1lIG1pbWljcyBKYXZhJ3MgU3RyZWFtVG9rZW5pemVyKSAqLworTlNNdXRhYmxlRGF0YSAqc3ZhbDsKK2NoYXIgKmRhdGE7CisgICAgCitCT09MIGVycm9yOworCit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UGF0dGVybiwgc2V0dGVyPXNldFBhdHRlcm46KSBOU1N0cmluZyAqcGF0dGVybjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFAsIHNldHRlcj1zZXRQOikgTlNJbnRlZ2VyIHA7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDLCBzZXR0ZXI9c2V0QzopIE5TSW50ZWdlciBjOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0Tiwgc2V0dGVyPXNldE46KSBOU0ludGVnZXIgbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3ZhbCwgc2V0dGVyPXNldFN2YWw6KSBOU011dGFibGVEYXRhICpzdmFsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXREYXRhLCBzZXR0ZXI9c2V0RGF0YTopIGNoYXIgKmRhdGE7CitAcHJvcGVydHkgKGdldHRlcj1nZXRFcnJvciwgc2V0dGVyPXNldEVycm9yKSBCT09MIGVycm9yOworCisrIChBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuTGV4ZXI6KE5TU3RyaW5nICopYVBhdHRlcm47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFBhdHRlcm46KE5TU3RyaW5nICopYVBhdHRlcm47CistIChOU0ludGVnZXIpIG5leHRUb2tlbjsKKy0gKHZvaWQpIGNvbnN1bWU7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCistIChOU011dGFibGVEYXRhICopZ2V0U3ZhbDsKKy0gKHZvaWQpIHNldFN2YWw6KE5TTXV0YWJsZURhdGEgKilhU3ZhbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ2ZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKQEAgLTAsMCArMSw1NyBAQAorLy8KKy8vICBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZVBhdHRlcm5MZXhlci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlV2l6YXJkLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVyblBhcnNlciA6IE5TT2JqZWN0IHsKKworQU5UTFJUcmVlUGF0dGVybkxleGVyICp0b2tlbml6ZXI7CitOU0ludGVnZXIgdHR5cGU7CitBTlRMUlRyZWVXaXphcmQgKndpemFyZDsKK2lkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7CisgICAgCit9CisKKysgKEFOVExSVHJlZVBhdHRlcm5QYXJzZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyOihBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKilhVG9rZW5pemVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5pemVyOihBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKil0b2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICBBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3I7CistIChpZDxBTlRMUlRyZWU+KSBwYXR0ZXJuOworLSAoaWQ8QU5UTFJUcmVlPikgcGFyc2VUcmVlOworLSAoaWQ8QU5UTFJUcmVlPikgcGFyc2VOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVJld3JpdGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVJld3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlODczZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlUmV3cml0ZXIuaApAQCAtMCwwICsxLDcyIEBACisvLworLy8gIEFOVExSVHJlZVJld3JpdGVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZVBhcnNlci5oIgorCitAaW50ZXJmYWNlIEFOVExSZnB0ciA6IE5TT2JqZWN0IHsKKyAgICBpZCAgYWN0b3I7CisgICAgU0VMIHJ1bGVTRUw7Cit9CisKKysgKEFOVExSZnB0ciAqKW5ld0FOVExSZnB0cldpdGhSdWxlOihTRUwpYVJ1bGVBY3Rpb24gd2l0aE9iamVjdDooaWQpYW5PYmplY3Q7CistaW5pdFdpdGhSdWxlOihTRUwpcnVsZUFjdGlvbiB3aXRoT2JqZWN0OihpZClhbk9iamVjdDsKKworLSAoaWQpcnVsZTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZVJld3JpdGVyIDogQU5UTFJUcmVlUGFyc2VyIHsKKyAgICBCT09MIHNob3dUcmFuc2Zvcm1hdGlvbnM7CisgICAgaWQ8QU5UTFJUb2tlblN0cmVhbT4gb3JpZ2luYWxUb2tlblN0cmVhbTsKKyAgICBpZDxBTlRMUlRyZWVBZGFwdG9yPiBvcmlnaW5hbEFkYXB0b3I7CisgICAgQU5UTFJmcHRyICpydWxlOworICAgIEFOVExSZnB0ciAqdG9wZG93bl9mcHRyOworICAgIEFOVExSZnB0ciAqYm90dG9tdXBfZnRwcjsKK30KKworKyAoQU5UTFJUcmVlUmV3cml0ZXIgKikgbmV3QU5UTFJUcmVlUmV3cml0ZXI6KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQ7CisrIChBTlRMUlRyZWVSZXdyaXRlciAqKSBuZXdBTlRMUlRyZWVSZXdyaXRlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CistIChpZClpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKWluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGFwcGx5T25jZTooaWQ8QU5UTFJUcmVlPil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGFwcGx5UmVwZWF0ZWRseTooaWQ8QU5UTFJUcmVlPil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGRvd251cDooaWQ8QU5UTFJUcmVlPil0OworLSAoQU5UTFJUcmVlUmV3cml0ZXIgKikgcHJlOihpZDxBTlRMUlRyZWU+KXQ7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBwb3N0OihpZDxBTlRMUlRyZWU+KXQ7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBkb3dudXA6KGlkPEFOVExSVHJlZT4pdCBYRm9ybTooQk9PTClhU2hvd1RyYW5zZm9ybWF0aW9uczsKKy0gKHZvaWQpcmVwb3J0VHJhbnNmb3JtYXRpb246KGlkPEFOVExSVHJlZT4pb2xkVHJlZSBUcmVlOihpZDxBTlRMUlRyZWU+KW5ld1RyZWU7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSB0b3Bkb3duX2ZwdHI7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBib3R0b211cF9mdHByOworLSAoQU5UTFJUcmVlUmV3cml0ZXIgKikgdG9wZG93bjsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGJvdHRvbXVwOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYThhNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQ5IEBACisvLworLy8gIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE3LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJ1bGVSZXR1cm5TY29wZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlIDogQU5UTFJSdWxlUmV0dXJuU2NvcGUgeworICAgIEFOVExSQ29tbW9uVHJlZSAqc3RhcnROb2RlOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBBTlRMUkNvbW1vblRyZWUgKnN0YXJ0Tm9kZTsKKworLyoqIEZpcnN0IG5vZGUgb3Igcm9vdCBub2RlIG9mIHRyZWUgbWF0Y2hlZCBmb3IgdGhpcyBydWxlLiAqLworCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRTdGFydDsKKy0gKHZvaWQpc2V0U3RhcnQ6KEFOVExSQ29tbW9uVHJlZSAqKWFTdGFydE5vZGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlRyZWVWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxNjdiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vCisvLyAgQU5UTFJUcmVlVmlzaXRvci5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlVmlzaXRvciA6IE5TT2JqZWN0IHsKKyAgIGlkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7Cit9CisrIChBTlRMUlRyZWVWaXNpdG9yICopbmV3QU5UTFJUcmVlVmlzaXRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGFuQWRhcHRvcjsKKysgKEFOVExSVHJlZVZpc2l0b3IgKiluZXdBTlRMUlRyZWVWaXNpdG9yOworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworLSAoQU5UTFJUcmVlVmlzaXRvciAqKXZpc2l0OihpZDxBTlRMUlRyZWU+KXQgQWN0aW9uOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopYWN0aW9uOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzA4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaApAQCAtMCwwICsxLDU2IEBACisvLworLy8gIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlVmlzaXRvckFjdGlvbiA6IE5TT2JqZWN0Cit7CisKK30KKworKyAoQU5UTFJUcmVlVmlzaXRvckFjdGlvbiAqKW5ld0FOVExSVHJlZVZpc2l0b3JBY3Rpb247CistIChpZCkgaW5pdDsKKworLyoqIEV4ZWN1dGUgYW4gYWN0aW9uIGJlZm9yZSB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuICBDaGlsZHJlbiBvZiByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlCisgKiAgdmlzaXRlZCBpZiB1c2luZyBUcmVlVmlzaXRvci52aXNpdCgpLgorICovCistIChBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopcHJlOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQ7CisKKy8qKiBFeGVjdXRlIGFuIGFjdGlvbiBhZnRlciB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilwb3N0OihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJUcmVlV2l6YXJkLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVdpemFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTI1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVHJlZVdpemFyZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvLworLy8gIEFOVExSVHJlZVdpemFyZC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSTWFwRWxlbWVudC5oIgorI2ltcG9ydCAiQU5UTFJNYXAuaCIKKworQGNsYXNzIEFOVExSVmlzaXRvcjsKKworQHByb3RvY29sIEFOVExSQ29udGV4dFZpc2l0b3IgPE5TT2JqZWN0PgorLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgY2FsbGVkIHZpc2l0IG9yIHNvbWV0aGluZyBlbHNlPworLSAodm9pZCkgdmlzaXQ6KGlkPEFOVExSVHJlZT4pdCBQYXJlbnQ6KGlkPEFOVExSVHJlZT4pcGFyZW50IENoaWxkSW5kZXg6KE5TSW50ZWdlciljaGlsZEluZGV4IE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlZpc2l0b3IgOiBOU09iamVjdCA8QU5UTFJDb250ZXh0VmlzaXRvcj4geworICAgIE5TSW50ZWdlciBhY3Rpb247CisgICAgaWQgYWN0b3I7CisgICAgaWQgb2JqZWN0MTsKKyAgICBpZCBvYmplY3QyOworfQorKyAoQU5UTFJWaXNpdG9yICopbmV3QU5UTFJWaXNpdG9yOihOU0ludGVnZXIpYW5BY3Rpb24gQWN0b3I6KGlkKWFuQWN0b3IgT2JqZWN0OihpZClhbk9iamVjdDEgT2JqZWN0OihpZClhbk9iamVjdDI7CistIChpZCkgaW5pdFdpdGhBY3Rpb246KE5TSW50ZWdlcilhbkFjdGlvbiBBY3RvcjooaWQpYW5BY3RvciBPYmplY3Q6KGlkKWFuT2JqZWN0MSBPYmplY3Q6KGlkKWFuT2JqZWN0MjsKKworLSAodm9pZCkgdmlzaXQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpIHZpc2l0OihpZDxBTlRMUlRyZWU+KXQgUGFyZW50OihpZDxBTlRMUlRyZWU+KXBhcmVudCBDaGlsZEluZGV4OihOU0ludGVnZXIpY2hpbGRJbmRleCBNYXA6KEFOVExSTWFwICopbGFiZWxzOworCitAZW5kCisKKy8qKiBXaGVuIHVzaW5nICVsYWJlbDpUT0tFTk5BTUUgaW4gYSB0cmVlIGZvciBwYXJzZSgpLCB3ZSBtdXN0CisgKiAgdHJhY2sgdGhlIGxhYmVsLgorICovCitAaW50ZXJmYWNlIEFOVExSVHJlZVBhdHRlcm4gOiBBTlRMUkNvbW1vblRyZWUgeworICAgIE5TU3RyaW5nICpsYWJlbDsKKyAgICBCT09MICAgICAgaGFzVGV4dEFyZzsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TGFiZWwsIHNldHRlcj1zZXRMYWJlbDopIE5TU3RyaW5nICpsYWJlbDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0SGFzVGV4dEFyZywgc2V0dGVyPXNldEhhc1RleHRBcmc6KSBCT09MIGhhc1RleHRBcmc7CisKKysgKEFOVExSVHJlZVBhdHRlcm4gKiluZXdBTlRMUlRyZWVQYXR0ZXJuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworCistIChpZCkgaW5pdFdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJXaWxkY2FyZFRyZWVQYXR0ZXJuIDogQU5UTFJUcmVlUGF0dGVybiB7Cit9CisKKysgKEFOVExSV2lsZGNhcmRUcmVlUGF0dGVybiAqKW5ld0FOVExSV2lsZGNhcmRUcmVlUGF0dGVybjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKy0gKGlkKSBpbml0V2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworQGVuZAorCisvKiogVGhpcyBhZGFwdG9yIGNyZWF0ZXMgVHJlZVBhdHRlcm4gb2JqZWN0cyBmb3IgdXNlIGR1cmluZyBzY2FuKCkgKi8KK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yIDogQU5UTFJDb21tb25UcmVlQWRhcHRvciB7Cit9CisrIChBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IgKiluZXdUcmVlQWRhcHRvcjsKKyNpZmRlZiBET05UVVNFTk9NTworKyAoQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yICopbmV3VHJlZUFkYXB0b3I6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisjZW5kaWYKKy0gKGlkKSBpbml0OworI2lmZGVmIERPTlRVU0VOT01PCistIGluaXRXaXRoVG9rZW46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisjZW5kaWYKKy0gKGlkPEFOVExSVHJlZT4pY3JlYXRlVHJlZVBhdHRlcm46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVXaXphcmQgOiBOU09iamVjdCB7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKwlBTlRMUk1hcCAqdG9rZW5OYW1lVG9UeXBlTWFwOworfQorKyAoQU5UTFJUcmVlV2l6YXJkICopIG5ld0FOVExSVHJlZVdpemFyZDooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yIE1hcDooQU5UTFJNYXAgKilhVG9rZW5OYW1lVG9UeXBlTWFwOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yIFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkV2l0aFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yOworLSAoaWQpIGluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBNYXA6KEFOVExSTWFwICopdG9rZW5OYW1lVG9UeXBlTWFwOworLSAoaWQpIGluaXRXaXRoVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChpZCkgaW5pdFdpdGhUb2tlbk5hbWVzOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChBTlRMUk1hcCAqKWNvbXB1dGVUb2tlblR5cGVzOihOU0FycmF5ICopdGhlVG9rTmFtczsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblR5cGU6KE5TU3RyaW5nICopdG9rZW5OYW1lOworLSAoQU5UTFJNYXAgKilpbmRleDooaWQ8QU5UTFJUcmVlPil0OworLSAodm9pZCkgX2luZGV4OihpZDxBTlRMUlRyZWU+KXQgTWFwOihBTlRMUk1hcCAqKW07CistIChOU011dGFibGVBcnJheSAqKWZpbmQ6KGlkPEFOVExSVHJlZT4pIHQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuOworLSAoQU5UTFJUcmVlV2l6YXJkICopZmluZEZpcnN0OihpZDxBTlRMUlRyZWU+KSB0IFR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKEFOVExSVHJlZVdpemFyZCAqKWZpbmRGaXJzdDooaWQ8QU5UTFJUcmVlPikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistICh2b2lkKSB2aXNpdDooaWQ8QU5UTFJUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0dHlwZSBWaXNpdG9yOihBTlRMUlZpc2l0b3IgKil2aXNpdG9yOworLSAodm9pZCkgX3Zpc2l0OihpZDxBTlRMUlRyZWU+KXQKKyAgICAgICAgIFBhcmVudDooaWQ8QU5UTFJUcmVlPilwYXJlbnQKKyAgICAgQ2hpbGRJbmRleDooTlNJbnRlZ2VyKWNoaWxkSW5kZXgKKyAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKXR0eXBlCisgICAgICAgIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistICh2b2lkKXZpc2l0OihpZDxBTlRMUlRyZWU+KXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistIChCT09MKXBhcnNlOihpZDxBTlRMUlRyZWU+KXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChCT09MKSBwYXJzZTooaWQ8QU5UTFJUcmVlPikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKSBfcGFyc2U6KGlkPEFOVExSVHJlZT4pdDEgUGF0dGVybjooQU5UTFJUcmVlUGF0dGVybiAqKXRwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChpZDxBTlRMUlRyZWU+KSBjcmVhdGVUcmVlOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKWVxdWFsczooaWQpdDEgTzI6KGlkKXQyIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKEJPT0wpZXF1YWxzOihpZCl0MSBPMjooaWQpdDI7CistIChCT09MKSBfZXF1YWxzOihpZCl0MSBPMjooaWQpdDIgQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWU3OWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUgOiBOU09iamVjdCB7CisJQU5UTFJDb21tb25UcmVlICpjdXJyZW50Tm9kZTsKKwlBTlRMUkNvbW1vblRyZWUgKnByZXZpb3VzTm9kZTsKKworCWludCBjdXJyZW50Q2hpbGRJbmRleDsKKwlpbnQgYWJzb2x1dGVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IG5vZGVTdGFja1NpemU7CisJdW5zaWduZWQgaW50IGluZGV4U3RhY2tTaXplOworCQorCU5TTXV0YWJsZUFycmF5ICpsb29rYWhlYWQ7Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBjdXJyZW50Tm9kZTsKKy0gKHZvaWQpIHNldEN1cnJlbnROb2RlOiAoQU5UTFJDb21tb25UcmVlICopIGFDdXJyZW50Tm9kZTsKKworLSAoQU5UTFJDb21tb25UcmVlICopIHByZXZpb3VzTm9kZTsKKy0gKHZvaWQpIHNldFByZXZpb3VzTm9kZTogKEFOVExSQ29tbW9uVHJlZSAqKSBhUHJldmlvdXNOb2RlOworCistIChOU0ludGVnZXIpIGN1cnJlbnRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q3VycmVudENoaWxkSW5kZXg6IChOU0ludGVnZXIpIGFDdXJyZW50Q2hpbGRJbmRleDsKKworLSAoTlNJbnRlZ2VyKSBhYnNvbHV0ZU5vZGVJbmRleDsKKy0gKHZvaWQpIHNldEFic29sdXRlTm9kZUluZGV4OiAoTlNJbnRlZ2VyKSBhbkFic29sdXRlTm9kZUluZGV4OworCistIChOU1VJbnRlZ2VyKSBub2RlU3RhY2tTaXplOworLSAodm9pZCkgc2V0Tm9kZVN0YWNrU2l6ZTogKE5TVUludGVnZXIpIGFOb2RlU3RhY2tTaXplOworCistIChOU1VJbnRlZ2VyKSBpbmRleFN0YWNrU2l6ZTsKKy0gKHZvaWQpIHNldEluZGV4U3RhY2tTaXplOiAoTlNVSW50ZWdlcikgYW5JbmRleFN0YWNrU2l6ZTsKKworLSAoTlNNdXRhYmxlQXJyYXkgKikgbG9va2FoZWFkOworLSAodm9pZCkgc2V0TG9va2FoZWFkOiAoTlNNdXRhYmxlQXJyYXkgKikgYUxvb2thaGVhZDsKKworLSAodm9pZCkgYWRkVG9Mb29rYWhlYWQ6IChpZClsb29rYWhlYWRPYmplY3Q7CistICh2b2lkKSByZW1vdmVGcm9tTG9va2FoZWFkOiAoaWQpbG9va2FoZWFkT2JqZWN0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmODYzMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLworLy8gIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvMTIvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJMb29rYWhlYWRTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbSA6IEFOVExSTG9va2FoZWFkU3RyZWFtIHsKKwlpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKKyAgICBOU0ludGVnZXIgdG9rZW5JbmRleDsgLy8gc2ltcGxlIGNvdW50ZXIgdG8gc2V0IHRva2VuIGluZGV4IGluIHRva2VucworICAgIE5TSW50ZWdlciBjaGFubmVsOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VuU291cmNlLCBzZXR0ZXI9c2V0VG9rZW5Tb3VyY2U6KSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFRva2VuSW5kZXgsIHNldHRlcj1zZXRUb2tlbkluZGV4KSBOU0ludGVnZXIgdG9rZW5JbmRleDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtICopbmV3QU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pbmV4dEVsZW1lbnQ7CistIChCT09MKWlzRU9GOihpZDxBTlRMUlRva2VuPikgYVRva2VuOworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pZ2V0VG9rZW5Tb3VyY2U7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhU3RhcnQgVG9FbmQ6KGlkPEFOVExSVG9rZW4+KWFTdG9wOworLSAoTlNJbnRlZ2VyKUxBOihOU0ludGVnZXIpYW5JZHg7CistIChpZDxBTlRMUlRva2VuPilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpYW5JZHg7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlVuaXF1ZUlETWFwLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVW5pcXVlSURNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODA1YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlVuaXF1ZUlETWFwLmgKQEAgLTAsMCArMSw2NCBAQAorLy8KKy8vICBBTlRMUlVuaXF1ZUlETWFwLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKyNpbXBvcnQgIkFOVExSTm9kZU1hcEVsZW1lbnQuaCIKKworI2RlZmluZSBTVUNDRVNTICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkFJTFVSRSAgICAgICAgICAgICAtMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSVW5pcXVlSURNYXAgOiBBTlRMUlB0ckJ1ZmZlciB7CisgICAgTlNJbnRlZ2VyIGxhc3RIYXNoOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoKSBOU0ludGVnZXIgbGFzdEhhc2g7CisKKysgKGlkKW5ld0FOVExSVW5pcXVlSURNYXA7CisrIChpZCluZXdBTlRMUlVuaXF1ZUlETWFwV2l0aExlbjooTlNJbnRlZ2VyKWFIYXNoU2l6ZTsKKworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSAodm9pZClkZWFsbG9jOworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisvKiBjbGVhciAtLSByZWluaXRpYWxpemUgdGhlIG1hcGxpc3QgYXJyYXkgKi8KKy0gKHZvaWQpIGNsZWFyOworCistICh2b2lkKWRlbGV0ZUFOVExSVW5pcXVlSURNYXA6KEFOVExSTm9kZU1hcEVsZW1lbnQgKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk5vZGVNYXBFbGVtZW50ICopbnA7CistIChpZClnZXROb2RlOihpZDxBTlRMUlRyZWU+KWFOb2RlOworLSAodm9pZClwdXRJRDooaWQpYW5JRCBOb2RlOihpZDxBTlRMUlRyZWU+KWFOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9IZWFkZXJzL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ1YmZlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvSGVhZGVycy9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaApAQCAtMCwwICsxLDQ3IEBACisvLworLy8gIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIDogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworCit9CisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb247CisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb246KE5TSW50ZWdlcilleHBlY3RlZCBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgQW5kOihOU0ludGVnZXIpZXhwZWN0ZWQ7CistIChpZDxBTlRMUlRva2VuPilnZXRVbmV4cGVjdGVkVG9rZW47CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgCisgICAgCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWI3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9SZXNvdXJjZXMvSW5mby5wbGlzdCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1Jlc291cmNlcy9JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDM2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9SZXNvdXJjZXMvSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5vcmcuYW50bHIuYW50bHJmcmFtZXdvcms8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkZNV0s8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvQU5UTFIgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0FOVExSCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3YzFkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0FOVExSCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjcxZTc4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJERkEuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuU291cmNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisKKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVFeGNlcHRpb24uaD4KKworI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPgorCisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKworI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZU1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkJhc2VNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMDBhYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkJhc2VNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1NCBAQAorLy8KKy8vICBBTlRMUkJhc2VNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTGlua0Jhc2UuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VNYXBFbGVtZW50IDogQU5UTFJMaW5rQmFzZSB7CisgICAgTlNOdW1iZXIgKmluZGV4OworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEluZGV4LCBzZXR0ZXI9c2V0SW5kZXg6KSBOU051bWJlciAqaW5kZXg7CisKKysgKGlkKSBuZXdBTlRMUkJhc2VNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSQmFzZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU051bWJlciAqKWdldEluZGV4OworLSAodm9pZClzZXRJbmRleDooTlNOdW1iZXIgKilhbklkeDsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkJhc2VSZWNvZ25pemVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCYXNlUmVjb2duaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhOTIyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCYXNlUmVjb2duaXplci5oCkBAIC0wLDAgKzEsMTgzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKy8vIFRoaXMgaXMgYW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgbGV4ZXJzIGFuZCBwYXJzZXJzLgorCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9GQUlMRUQgLTIKKyNkZWZpbmUgQU5UTFJfTUVNT19SVUxFX1VOS05PV04gLTEKKyNkZWZpbmUgQU5UTFJfSU5JVElBTF9GT0xMT1dfU1RBQ0tfU0laRSAxMDAKKworI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSQmFzZVJlY29nbml6ZXIgOiBOU09iamVjdCB7CisJQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOwkvLyB0aGUgc3RhdGUgb2YgdGhpcyByZWNvZ25pemVyLiBNaWdodCBiZSBzaGFyZWQgd2l0aCBvdGhlciByZWNvZ25pemVycywgZS5nLiBpbiBncmFtbWFyIGltcG9ydCBzY2VuYXJpb3MuCisJTlNTdHJpbmcgKmdyYW1tYXJGaWxlTmFtZTsJCQkvLyB3aGVyZSBkaWQgdGhlIGdyYW1tYXIgY29tZSBmcm9tLiBmaWxsZWQgaW4gYnkgY29kZWdlbmVyYXRpb24KKy8vICAgIEJPT0wgZmFpbGVkOworICAgIE5TU3RyaW5nICpzb3VyY2VOYW1lOworLy8gICAgTlNJbnRlZ2VyIG51bWJlck9mU3ludGF4RXJyb3JzOworICAgIE5TQXJyYXkgKnRva2VuTmFtZXM7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhdGUsIHNldHRlcj1zZXRTdGF0ZSkgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRHcmFtbWFyRmlsZU5hbWUsIHNldHRlcj1zZXRHcmFtbWFyRmlsZU5hbWUpIE5TU3RyaW5nICpncmFtbWFyRmlsZU5hbWU7CisvL0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0RmFpbGVkLCBzZXR0ZXI9c2V0RmFpbGVkKSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5OYW1lcywgc2V0dGVyPXNldFRva2VuTmFtZXMpIE5TQXJyYXkgKnRva2VuTmFtZXM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFNvdXJjZU5hbWUsIHNldHRlcj1zZXRTb3VyY2VOYW1lKSBOU1N0cmluZyAqc291cmNlTmFtZTsKKy8vQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXROdW1iZXJPZlN5bnRheEVycm9ycywgc2V0dGVyPXNldE51bWJlck9mU3ludGF4RXJyb3JzKSBOU0ludGVnZXIgbnVtYmVyT2ZTeW50YXhFcnJvcnM7CisKKysgKHZvaWQpIGluaXRpYWxpemU7CisKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcldpdGhSdWxlTGVuOihOU0ludGVnZXIpYUxlbjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKysgKE5TQXJyYXkgKilnZXRUb2tlbk5hbWVzOworKyAodm9pZClzZXRUb2tlbk5hbWVzOihOU0FycmF5ICopYVRva05hbUFycmF5OworKyAodm9pZClzZXRHcmFtbWFyRmlsZU5hbWU6KE5TU3RyaW5nICopYUZpbGVOYW1lOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy8vIHNpbXBsZSBhY2Nlc3NvcnMKKy0gKE5TSW50ZWdlcikgZ2V0QmFja3RyYWNraW5nTGV2ZWw7CistICh2b2lkKSBzZXRCYWNrdHJhY2tpbmdMZXZlbDooTlNJbnRlZ2VyKSBsZXZlbDsKKworLSAoQk9PTCkgZ2V0RmFpbGVkOworLSAodm9pZCkgc2V0RmFpbGVkOiAoQk9PTCkgZmxhZzsKKworLSAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgZ2V0U3RhdGU7CistICh2b2lkKSBzZXRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgdGhlU3RhdGU7CisKKy8vIHJlc2V0IHRoaXMgcmVjb2duaXplciAtIG1pZ2h0IGJlIGV4dGVuZGVkIGJ5IGNvZGVnZW5lcmF0aW9uL2dyYW1tYXIKKy0gKHZvaWQpIHJlc2V0OworCisvKiogTWF0Y2ggbmVlZHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCwgd2hpY2ggZ2V0cyBwdXQKKyAqICBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKyAqICBhbmQgdHJlZSBwYXJzZXJzIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBvYmplY3RzLiBSYXRoZXIgdGhhbiB0ZXN0CisgKiAgZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKyAqICBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorICogIGlucHV0IHN5bWJvbCBpcy4KKyAqIAorICogIFRoaXMgaXMgaWdub3JlZCBmb3IgbGV4ZXJzLgorICovCistIChpZCkgZ2V0SW5wdXQ7CisKKy0gKHZvaWQpc2tpcDsKKworLy8gZG8gYWN0dWFsIG1hdGNoaW5nIG9mIHRva2Vucy9jaGFyYWN0ZXJzCistIChpZCkgbWF0Y2g6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CistIChCT09MKSBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVG9rZW5UeXBlOihOU0ludGVnZXIpIHR0eXBlOworLSAoQk9PTCkgbWlzbWF0Y2hJc01pc3NpbmdUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLy8gZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeQorLSAodm9pZCkgcmVwb3J0RXJyb3I6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworLSAodm9pZCkgZGlzcGxheVJlY29nbml0aW9uRXJyb3I6KE5TQXJyYXkgKil0aGVUb2tOYW1zIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldEVycm9yTWVzc2FnZTooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUgVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChOU0ludGVnZXIpIGdldE51bWJlck9mU3ludGF4RXJyb3JzOworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldFRva2VuRXJyb3JEaXNwbGF5OihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgZW1pdEVycm9yTWVzc2FnZTooTlNTdHJpbmcgKiltc2c7CistICh2b2lkKSByZWNvdmVyOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworCisvLyBiZWdpbiBob29rcyBmb3IgZGVidWdnZXIKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLy8gZW5kIGhvb2tzIGZvciBkZWJ1Z2dlcgorCisvLyBjb21wdXRlIHRoZSBiaXRzZXRzIG5lY2Vzc2FyeSB0byBkbyBtYXRjaGluZyBhbmQgcmVjb3ZlcnkKKy0gKEFOVExSQml0U2V0ICopY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ7CistIChBTlRMUkJpdFNldCAqKWNvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVzsKKy0gKEFOVExSQml0U2V0ICopY29tYmluZUZvbGxvd3M6KEJPT0wpIGV4YWN0OworCistIChpZDxBTlRMUlRva2VuPikgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5UeXBlOihOU0ludGVnZXIpdHR5cGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistIChpZDxBTlRMUlRva2VuPilyZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBnZXRNaXNzaW5nU3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgIFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CisKKy8vIGhlbHBlciBtZXRob2RzIGZvciByZWNvdmVyeS4gdHJ5IHRvIHJlc3luYyBzb21ld2hlcmUKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbFRUeXBlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBUb2tlblR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbEZvbGxvdzooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWJpdFNldDsKKy0gKHZvaWQpIHB1c2hGb2xsb3c6KEFOVExSQml0U2V0ICopZnNldDsKKy0gKEFOVExSQml0U2V0ICopcG9wRm9sbG93OworCisvLyB0byBiZSB1c2VkIGJ5IHRoZSBkZWJ1Z2dlciB0byBkbyByZXBvcnRpbmcuIG1heWJlIGhvb2sgaW4gaW5jcmVtZW50YWwgc3R1ZmYgaGVyZSwgdG9vLgorLSAoTlNNdXRhYmxlQXJyYXkgKikgZ2V0UnVsZUludm9jYXRpb25TdGFjazsKKy0gKE5TTXV0YWJsZUFycmF5ICopIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2s6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKilleGNlcHRpb24KKwkJCQkJICAgICAgICAgICAgIFJlY29nbml6ZXI6KE5TU3RyaW5nICopcmVjb2duaXplckNsYXNzTmFtZTsKKworLSAoTlNBcnJheSAqKSBnZXRUb2tlbk5hbWVzOworLSAoTlNTdHJpbmcgKilnZXRHcmFtbWFyRmlsZU5hbWU7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CistIChOU011dGFibGVBcnJheSAqKSB0b1N0cmluZ3M6KE5TQXJyYXkgKil0b2tlbnM7CisvLyBzdXBwb3J0IGZvciBtZW1vaXphdGlvbgorLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb246KE5TSW50ZWdlcilydWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoQk9PTCkgYWxyZWFkeVBhcnNlZFJ1bGU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKy0gKHZvaWQpIG1lbW9pemU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisJICAgICBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKKwkgICAgU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb25DYWNoZVNpemU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKy0gKHZvaWQpdHJhY2VPdXQ6KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKworCisvLyBzdXBwb3J0IGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gdGhlc2UgYXJlIGNhbGxlZCBpbmRpcmVjdGx5IHRvIHN1cHBvcnQgZnVua3kgc3R1ZmYgaW4gZ3JhbW1hcnMsCisvLyBsaWtlIHN1cHBseWluZyBzZWxlY3RvcnMgaW5zdGVhZCBvZiB3cml0aW5nIGNvZGUgZGlyZWN0bHkgaW50byB0aGUgYWN0aW9ucyBvZiB0aGUgZ3JhbW1hci4KKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworLy8gc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZVN0YWNrLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCYXNlU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY5MDMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZVN0YWNrLmgKQEAgLTAsMCArMSw2NiBAQAorLy8KKy8vICBBTlRMUkJhc2VSZWNvZ25pemVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUHRyQnVmZmVyLmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorLy8jZGVmaW5lIExPQ0FMX1NDT1BFICAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJCYXNlU3RhY2sgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy9BTlRMUlJ1bGVTdGFjayAqZk5leHQ7CisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSUnVsZVN0YWNrICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2gpIE5TSW50ZWdlciBMYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKEFOVExSQmFzZVN0YWNrICopbmV3QU5UTFJCYXNlU3RhY2s7CisrIChBTlRMUkJhc2VTdGFjayAqKW5ld0FOVExSQmFzZVN0YWNrV2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKHZvaWQpZGVhbGxvYzsKKworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0gKE5TSW50ZWdlcilnZXRMYXN0SGFzaDsKKy0gKHZvaWQpc2V0TGFzdEhhc2g6KE5TSW50ZWdlcilhVmFsOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCYXNlVHJlZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZVRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NjUxM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZVRyZWUuaApAQCAtMCwwICsxLDE5OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAcHJvdG9jb2wgQU5UTFJCYXNlVHJlZSA8QU5UTFJUcmVlPgorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoaWxkcmVuLCBzZXR0ZXI9c2V0Q2hpbGRyZW4pIE5TTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKKworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSQmFzZVRyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJCYXNlVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGluaXQ7CistIChpZDxBTlRMUkJhc2VUcmVlPikgaW5pdFdpdGg6KGlkPEFOVExSVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldENoaWxkOihOU1VJbnRlZ2VyKWk7CistIChOU011dGFibGVBcnJheSAqKWdldENoaWxkcmVuOworLSAodm9pZCkgc2V0Q2hpbGRyZW46KE5TTXV0YWJsZUFycmF5ICopYW5BcnJheTsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWdldEZpcnN0Q2hpbGRXaXRoVHlwZTooTlNJbnRlZ2VyKXR5cGU7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBBZGQgdCBhcyBhIGNoaWxkIHRvIHRoaXMgbm9kZS4gIElmIHQgaXMgbnVsbCwgZG8gbm90aGluZy4gIElmIHQKKy8vICBpcyBuaWwsIGFkZCBhbGwgY2hpbGRyZW4gb2YgdCB0byB0aGlzJyBjaGlsZHJlbi4KKworLSAodm9pZCkgYWRkQ2hpbGQ6KGlkPEFOVExSVHJlZT4pIHRyZWU7CistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy0gKHZvaWQpIHNldENoaWxkOihOU0ludGVnZXIpIGkgV2l0aDooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQpIGRlbGV0ZUNoaWxkOihOU0ludGVnZXIpIGk7CistIChOU011dGFibGVBcnJheSAqKSBjcmVhdGVDaGlsZHJlbkxpc3Q7CistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW5Gcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpIHQ7CisvLyBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKy8vIHRoZSB0cmVlIGlzIGEgZmxhdCBsaXN0LgorCistIChCT09MKSBpc05pbDsKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5TdGFydEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdGFydEluZGV4OihOU0ludGVnZXIpIGluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczooTlNJbnRlZ2VyKSBvZmZzZXQ7CistICh2b2lkKSBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOihpZDxBTlRMUlRyZWU+KSBwYXJlbnQgQXQ6KE5TSW50ZWdlcikgaTsKKworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooTlNJbnRlZ2VyKWk7CisKKy0gKGlkPEFOVExSVHJlZT4pZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0QW5jZXN0b3JzOworCisjcHJhZ21hIG1hcmsgQ29weWluZworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CS8vIHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkIGhlcmUhCistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisjcHJhZ21hIG1hcmsgVHJlZSBQYXJzZXIgc3VwcG9ydAorLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dDsKKy8vIEluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhIHRva2VuIHBheWxvYWQsIHdoYXQgaXMgdGhlIGxpbmUgZm9yIGVycm9ycz8KKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TSW50ZWdlcikgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworCisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistIChOU1N0cmluZyAqKSB0cmVlRGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ1RyZWU7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlIDogTlNPYmplY3QgPEFOVExSVHJlZT4KK3sKKwlOU011dGFibGVBcnJheSAqY2hpbGRyZW47CisgICAgTlNFeGNlcHRpb24gKmFuRXhjZXB0aW9uOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoaWxkcmVuLCBzZXR0ZXI9c2V0Q2hpbGRyZW4pIE5TTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKKworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSQmFzZVRyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJCYXNlVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKyAgICAgICAgIAorLSAoaWQ8QU5UTFJUcmVlPikgaW5pdDsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBpbml0V2l0aDooaWQ8QU5UTFJUcmVlPilub2RlOworCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0Q2hpbGRyZW47CistICh2b2lkKSBzZXRDaGlsZHJlbjooTlNNdXRhYmxlQXJyYXkgKilhbkFycmF5OworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOihOU0ludGVnZXIpdHlwZTsKKy0gKE5TVUludGVnZXIpIGdldENoaWxkQ291bnQ7CisKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJUcmVlPikgdHJlZTsKKy0gKHZvaWQpIGFkZENoaWxkcmVuOihOU0FycmF5ICopIHRoZUNoaWxkcmVuOworCistICh2b2lkKSBzZXRDaGlsZDooTlNJbnRlZ2VyKSBpIFdpdGg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNJbnRlZ2VyKSBpOworLSAoTlNNdXRhYmxlQXJyYXkgKikgY3JlYXRlQ2hpbGRyZW5MaXN0OworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworLy8gSW5kaWNhdGVzIHRoZSBub2RlIGlzIGEgbmlsIG5vZGUgYnV0IG1heSBzdGlsbCBoYXZlIGNoaWxkcmVuLCBtZWFuaW5nCisJLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdG9wSW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CisKKy0gKHZvaWQpIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7CistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOihOU0ludGVnZXIpIG9mZnNldDsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6KGlkPEFOVExSVHJlZT4pIHBhcmVudCBBdDooTlNJbnRlZ2VyKSBpOworCistIChOU0ludGVnZXIpIGdldENoaWxkSW5kZXg7CistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpaTsKKworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CistIChpZDxBTlRMUlRyZWU+KWdldEFuY2VzdG9yOihOU0ludGVnZXIpdHR5cGU7CistIChOU011dGFibGVBcnJheSAqKWdldEFuY2VzdG9yczsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisJLy8gUmV0dXJuIGEgdG9rZW4gdHlwZTsgbmVlZGVkIGZvciB0cmVlIHBhcnNpbmcKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisKKwkvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKXBvczsKKworLSAoTlNTdHJpbmcgKikgdHJlZURlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nVHJlZTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlIDogQU5UTFJCYXNlVHJlZSB7Cit9CistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gOiBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSB7Cit9CisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gKikgZ2V0TmF2aWdhdGlvbk5vZGVEb3duOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZVVwIDogQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGUgeworfQorKyAoQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVVcCAqKSBnZXROYXZpZ2F0aW9uTm9kZVVwOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiA6IEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlIHsKK30KKysgKEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRU9GICopIGdldE5hdmlnYXRpb25Ob2RlRU9GOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRG93biAqbmF2aWdhdGlvbk5vZGVEb3duOworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgKm5hdmlnYXRpb25Ob2RlVXA7CitleHRlcm4gQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVFT0YgKm5hdmlnYXRpb25Ob2RlRU9GOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZVRyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY4ZGFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQmFzZVRyZWVBZGFwdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25FcnJvck5vZGUuaCIKKyNpbXBvcnQgIkFOVExSVW5pcXVlSURNYXAuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlQWRhcHRvciA6IE5TT2JqZWN0IDxBTlRMUlRyZWVBZGFwdG9yLCBOU0NvcHlpbmc+IHsKKyAgICBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKKwlOU0ludGVnZXIgdW5pcXVlTm9kZUlEOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWVUb1VuaXF1ZUlETWFwLCBzZXR0ZXI9c2V0VHJlZVRvVW5pcXVlSURNYXA6KSBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFVuaXF1ZU5vZGVJRCwgc2V0dGVyPXNldFVuaXF1ZU5vZGVJRDopIE5TSW50ZWdlciB1bmlxdWVOb2RlSUQ7CisKKysgKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBuZXdFbXB0eVRyZWU7CisKKy0gKGlkKSBpbml0OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoaWQpIGVtcHR5Tm9kZTsKKworLSAoQU5UTFJVbmlxdWVJRE1hcCAqKWdldFRyZWVUb1VuaXF1ZUlETWFwOworLSAodm9pZCkgc2V0VHJlZVRvVW5pcXVlSURNYXA6KEFOVExSVW5pcXVlSURNYXAgKilhTWFwTm9kZTsKKworLSAoTlNJbnRlZ2VyKWdldFVuaXF1ZUlEOworLSAodm9pZCkgc2V0VW5pcXVlTm9kZUlEOihOU0ludGVnZXIpYVVuaXF1ZU5vZGVJRDsKKworLyoqIGNyZWF0ZSB0cmVlIG5vZGUgdGhhdCBob2xkcyB0aGUgc3RhcnQgYW5kIHN0b3AgdG9rZW5zIGFzc29jaWF0ZWQKKyAqICB3aXRoIGFuIGVycm9yLgorICoKKyAqICBJZiB5b3Ugc3BlY2lmeSB5b3VyIG93biBraW5kIG9mIHRyZWUgbm9kZXMsIHlvdSB3aWxsIGxpa2VseSBoYXZlIHRvCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIENvbW1vblRyZWUgcmV0dXJucyBUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUKKyAqICBpZiBubyB0b2tlbiBwYXlsb2FkIGJ1dCB5b3UgbWlnaHQgaGF2ZSB0byBzZXQgdG9rZW4gdHlwZSBmb3IgZGlmZgorICogIG5vZGUgdHlwZS4KKyAqCisgKiAgWW91IGRvbid0IGhhdmUgdG8gc3ViY2xhc3MgQ29tbW9uRXJyb3JOb2RlOyB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0bworICogIHN1YmNsYXNzIHlvdXIgb3duIHRyZWUgbm9kZSBjbGFzcyB0byBhdm9pZCBjbGFzcyBjYXN0IGV4Y2VwdGlvbi4KKyAqLworLSAoaWQpIGVycm9yTm9kZTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuCisgICAgICAgRXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKSBlOworCistIChCT09MKSBpc05pbDooaWQ8QU5UTFJUcmVlPikgYVRyZWU7CisKKy0gKGlkPEFOVExSVHJlZT4pZHVwVHJlZTooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKy8qKiBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAqICB0cmVlIChub3QganVzdCBUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgKiAgbm90IHRoZSB0cmVlIG5vZGUgcm91dGluZXMgdG8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIAorICovCistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWUgUGFyZW50OihpZDxBTlRMUlRyZWU+KXBhcmVudDsKKy0gKGlkPEFOVExSVHJlZT4pZHVwTm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy8qKiBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgKiAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAqICBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBoYXZlIHRoZSB1c2VyIHdpbGwgYnVpbGQKKyAqICBBU1RzLgorICovCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJUcmVlPilhQ2hpbGQgdG9UcmVlOihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisvKiogSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIGEgYiBjKQorICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBuZXdSb290IGlzIGEgbmlsLXJvb3RlZCBzaW5nbGUgY2hpbGQgdHJlZSwgdXNlIHRoZSBzaW5nbGUKKyAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgKgorICogIElmIG9sZFJvb3Qgd2FzIG51bGwsIGl0J3Mgb2ssIGp1c3QgcmV0dXJuIG5ld1Jvb3QgKGV2ZW4gaWYgaXNOaWwpLgorICoKKyAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICogICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKyAqCisgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICogIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorICoKKyAqICBCZSBhZHZpc2VkIHRoYXQgaXQncyBvayBmb3IgbmV3Um9vdCB0byBwb2ludCBhdCBvbGRSb290J3MKKyAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgKiAgZWZmaWNpZW5jeS4KKyAqLworLSAoaWQ8QU5UTFJUcmVlPiliZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KWFOZXdSb290IG9sZDooaWQ8QU5UTFJUcmVlPilvbGRSb290OworCisvKiogVHJhbnNmb3JtIF4obmlsIHgpIHRvIHggYW5kIG5pbCB0byBudWxsICovCistIChpZDxBTlRMUlRyZWU+KXJ1bGVQb3N0UHJvY2Vzc2luZzooaWQ8QU5UTFJUcmVlPilhUm9vdDsKKworLSAoaWQ8QU5UTFJUcmVlPiliZWNvbWVSb290ZnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhTmV3Um9vdCBvbGQ6KGlkPEFOVExSVHJlZT4pb2xkUm9vdDsKKworLSAoaWQ8QU5UTFJUcmVlPiljcmVhdGVUcmVlOihOU0ludGVnZXIpYVRUeXBlIFdpdGg6KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW47CisKKy0gKGlkPEFOVExSVHJlZT4pY3JlYXRlVHJlZTooTlNJbnRlZ2VyKWFUVHlwZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW4gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChpZDxBTlRMUlRyZWU+KWNyZWF0ZVRyZWU6KE5TSW50ZWdlcilhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChOU0ludGVnZXIpIGdldFR5cGU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CisKKy0gKHZvaWQpIHNldFR5cGU6KGlkPEFOVExSVHJlZT4pYVRyZWUgVHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLSAodm9pZCkgc2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhVHJlZSBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy0gKGlkPEFOVExSVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUlRyZWU+KWFUcmVlIEF0OihOU0ludGVnZXIpaTsKKworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkPEFOVExSVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJUcmVlPilhQ2hpbGQ7CisKKy0gKGlkPEFOVExSVHJlZT4pIGRlbGV0ZUNoaWxkOihpZDxBTlRMUlRyZWU+KWFUcmVlIEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRDb3VudDooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLSAoTlNJbnRlZ2VyKSBnZXRVbmlxdWVJRDooaWQ8QU5UTFJUcmVlPilub2RlOworCisvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAqCisgKiAgVGhpcyBpcyBhIHZhcmlhbnQgb2YgY3JlYXRlVG9rZW4gd2hlcmUgdGhlIG5ldyB0b2tlbiBpcyBkZXJpdmVkIGZyb20KKyAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICogIHRva2VucyB0byBCTE9DSyBldGMuLi4gIFlvdSdsbCBzZWUKKyAqCisgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICoKKyAqICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgKi8KKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoaWQ8QU5UTFJUb2tlbj4pY3JlYXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkJpdFNldC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQml0U2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTFiZTExNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkJpdFNldC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCisjZGVmaW5lIEJJVFMgKHNpemVvZihOU1VJbnRlZ2VyKSAqIDgpCisjZGVmaW5lIExPR19CSVRTICgoc2l6ZW9mKE5TVUludGVnZXIpPT04KT82OjUpCisKKy8vIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIENvcmVGb3VuZGF0aW9uIGJpdCB2ZWN0b3JzIHRvIHNoaWVsZCB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKy8vIGZyb20gdGhlIHNwZWNpZmljcyBvZiB0aGUgQml0VmVjdG9yIGluaXRpYWxpemF0aW9uIGFuZCBxdWVyeSBmdW5jdGlvbnMuCisvLyBUaGlzIGlzIGZhc3QsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVpbnZlbnQgdGhlIHdoZWVsIGp1c3QgeWV0LgorCitAaW50ZXJmYWNlIEFOVExSQml0U2V0IDogTlNPYmplY3QgPCBOU011dGFibGVDb3B5aW5nID4geworCUNGTXV0YWJsZUJpdFZlY3RvclJlZiBiaXRWZWN0b3I7Cit9CisKKyNwcmFnbWEgbWFyayBDbGFzcyBNZXRob2RzCisKKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0OworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoVHlwZTooQU5UTFJUb2tlblR5cGUpdHlwZTsKKy8qKiBDb25zdHJ1Y3QgYSBBTlRMUkJpdFNldCBnaXZlbiB0aGUgc2l6ZQorICogQHBhcmFtIG5iaXRzIFRoZSBzaXplIG9mIHRoZSBBTlRMUkJpdFNldCBpbiBiaXRzCisgKi8KKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0V2l0aE5CaXRzOihOU1VJbnRlZ2VyKW5iaXRzOworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoQXJyYXk6KE5TTXV0YWJsZUFycmF5ICopdHlwZXM7CisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKil0aGVCaXRzIENvdW50OihOU1VJbnRlZ2VyKWxvbmdDb3VudDsKKworKyAoQU5UTFJCaXRTZXQgKikgb2Y6KE5TVUludGVnZXIpZWw7CisrIChBTlRMUkJpdFNldCAqKSBvZjooTlNVSW50ZWdlcilhIEFuZDI6KE5TVUludGVnZXIpYjsKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYzsKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYyBBbmQ0OihOU1VJbnRlZ2VyKWQ7CisKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorCistIChBTlRMUkJpdFNldCAqKSBpbml0OworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSl0eXBlOworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhOQml0czooTlNVSW50ZWdlciluYml0czsKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoQml0VmVjdG9yOihDRk11dGFibGVCaXRWZWN0b3JSZWYpdGhlQml0VmVjdG9yOworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgY29uc3QqKXRoZUJpdHMgQ291bnQ6KE5TVUludGVnZXIpdGhlQ291bnQ7CistIChBTlRMUkJpdFNldCAqKSBpbml0V2l0aEFycmF5T2ZCaXRzOihOU0FycmF5ICopdGhlQXJyYXk7CisKKyNwcmFnbWEgbWFyayBPcGVyYXRpb25zCistIChBTlRMUkJpdFNldCAqKSBvcjooQU5UTFJCaXRTZXQgKikgYUJpdFNldDsKKy0gKHZvaWQpIG9ySW5QbGFjZTooQU5UTFJCaXRTZXQgKikgYUJpdFNldDsKKy0gKHZvaWQpIGFkZDooTlNVSW50ZWdlcikgYml0OworLSAodm9pZCkgcmVtb3ZlOihOU1VJbnRlZ2VyKSBiaXQ7CistICh2b2lkKSBzZXRBbGxCaXRzOihCT09MKSBhU3RhdGU7CisKKy0gKE5TSW50ZWdlcikgbnVtQml0czsKKy0gKE5TVUludGVnZXIpIHNpemU7CistICh2b2lkKSBzZXRTaXplOihOU1VJbnRlZ2VyKSBub09mV29yZHM7CisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistICh1bnNpZ25lZCBsb25nIGxvbmcpIGJpdE1hc2s6KE5TVUludGVnZXIpIGJpdE51bWJlcjsKKy0gKEJPT0wpIG1lbWJlcjooTlNVSW50ZWdlciliaXROdW1iZXI7CistIChCT09MKSBpc05pbDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CisKKyNwcmFnbWEgbWFyayBOU0NvcHlpbmcgc3VwcG9ydAorCistIChpZCkgbXV0YWJsZUNvcHlXaXRoWm9uZTooTlNab25lICopIHRoZVpvbmU7CisKKworLy9wcml2YXRlCistIChDRk11dGFibGVCaXRWZWN0b3JSZWYpIF9iaXRWZWN0b3I7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YTZmNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDk4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtIDogTlNPYmplY3QgPEFOVExSVG9rZW5TdHJlYW0+IAoreworaWQ8QU5UTFJUb2tlblNvdXJjZT4gdG9rZW5Tb3VyY2U7CisgICAgCisgICAgLyoqIFJlY29yZCBldmVyeSBzaW5nbGUgdG9rZW4gcHVsbGVkIGZyb20gdGhlIHNvdXJjZSBzbyB3ZSBjYW4gcmVwcm9kdWNlCisgICAgICogIGNodW5rcyBvZiBpdCBsYXRlci4gIFRoZSBidWZmZXIgaW4gTG9va2FoZWFkU3RyZWFtIG92ZXJsYXBzIHNvbWV0aW1lcworICAgICAqICBhcyBpdHMgbW92aW5nIHdpbmRvdyBtb3ZlcyB0aHJvdWdoIHRoZSBpbnB1dC4gIFRoaXMgbGlzdCBjYXB0dXJlcworICAgICAqICBldmVyeXRoaW5nIHNvIHdlIGNhbiBhY2Nlc3MgY29tcGxldGUgaW5wdXQgdGV4dC4KKyAgICAgKi8KK05TTXV0YWJsZUFycmF5ICp0b2tlbnM7CisgICAgCisgICAgLyoqIFRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLiAqLworTlNJbnRlZ2VyIGxhc3RNYXJrZXI7CisgICAgCisgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAqICB0byBjb25zdW1lKS4gIHRva2Vuc1twXSBzaG91bGQgYmUgTFQoMSkuICBwPS0xIGluZGljYXRlcyBuZWVkCisgICAgICogIHRvIGluaXRpYWxpemUgd2l0aCBmaXJzdCB0b2tlbi4gIFRoZSBjdG9yIGRvZXNuJ3QgZ2V0IGEgdG9rZW4uCisgICAgICogIEZpcnN0IGNhbGwgdG8gTFQoMSkgb3Igd2hhdGV2ZXIgZ2V0cyB0aGUgZmlyc3QgdG9rZW4gYW5kIHNldHMgcD0wOworICAgICAqLworTlNJbnRlZ2VyIHA7CisgICAgCitOU0ludGVnZXIgcmFuZ2U7IC8vIGhvdyBkZWVwIGhhdmUgd2UgZ29uZT8KKyAgICAKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5Tb3VyY2Usc2V0dGVyPXNldFRva2VuU291cmNlKSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5zLHNldHRlcj1zZXRUb2tlbnMpIE5TTXV0YWJsZUFycmF5ICp0b2tlbnM7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldExhc3RNYXJrZXIsc2V0dGVyPXNldExhc3RNYXJrZXIpIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJbmRleCxzZXR0ZXI9c2V0SW5kZXgpIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRSYW5nZSxzZXR0ZXI9c2V0UmFuZ2UpIE5TSW50ZWdlciByYW5nZTsKKworKyAoQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbTsKKysgKEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW1XaXRoOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGluaXRXaXRoU291cmNlOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgc2V0SW5kZXg6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgZ2V0UmFuZ2U7CistICh2b2lkKSBzZXRSYW5nZTooTlNJbnRlZ2VyKWFuSW50OworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVzZXQ7CistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworLSAoTlNJbnRlZ2VyKSBzaXplOworLSAodm9pZCkgY29uc3VtZTsKKy0gKHZvaWQpIHN5bmM6KE5TSW50ZWdlcikgaTsKKy0gKHZvaWQpIGZldGNoOihOU0ludGVnZXIpIG47CistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcikgaTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0RnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcikgc3RvcEluZGV4OworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRva2VuPikgTFQ6KE5TSW50ZWdlcikgazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKSBrOworLSAodm9pZCkgc2V0dXA7CistIChpZDxBTlRMUlRva2VuU291cmNlPikgZ2V0VG9rZW5Tb3VyY2U7CistICh2b2lkKSBzZXRUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zOworLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zRnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU011dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGg6KEFOVExSQml0U2V0ICopdHlwZXM7CistIChOU011dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGhMaXN0OihOU011dGFibGVBcnJheSAqKXR5cGVzOworLSAoTlNNdXRhYmxlQXJyYXkgKilnZXRUb2tlbnNGcm9tOihOU0ludGVnZXIpc3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BJbmRleCBXaXRoVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydEluZGV4IFRvRW5kOihOU0ludGVnZXIpc3RvcEluZGV4OworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0YXJ0SW5kZXggVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RvcEluZGV4OworLSAodm9pZCkgZmlsbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MThlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vCisvLyAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCisjZGVmaW5lIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSAxMDAKKyNkZWZpbmUgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgMTAKKworI2lmZGVmIERPTlRVU0VOT01PCitAaW50ZXJmYWNlIEFOVExSU3RyZWFtSXRlcmF0b3IgOiBBTlRMUlRyZWVJdGVyYXRvcgoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIGlucHV0OworICAgIE5TTXV0YWJsZUFycmF5ICpub2RlczsKK30KKworKyAoaWQpIG5ld0FOVExSU3RyZWFtSXRlcmF0b3I6KEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSB0aGVTdHJlYW07CisKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIHRoZVN0cmVhbTsKKworLSAoQk9PTCkgaGFzTmV4dDsKKy0gKGlkKSBuZXh0OworLSAodm9pZCkgcmVtb3ZlOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIDogTlNPYmplY3QgPEFOVExSVHJlZU5vZGVTdHJlYW0+IAoreworCWlkPEFOVExSVHJlZT4gdXA7CisJaWQ8QU5UTFJUcmVlPiBkb3duOworCWlkPEFOVExSVHJlZT4gZW9mOworCQorCU5TTXV0YWJsZUFycmF5ICpub2RlczsKKwkKKwlpZDxBTlRMUlRyZWU+IHJvb3Q7IC8vIHJvb3QKKwkKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiB0b2tlbnM7CisJQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKwkKKwlCT09MIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKwlOU0ludGVnZXIgcDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlBTlRMUkludEFycmF5ICpjYWxsczsKKwkKKwlOU0VudW1lcmF0b3IgKmU7CisgICAgaWQgY3VycmVudFN5bWJvbDsKKwkKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRVcCwgc2V0dGVyPXNldFVwOikgaWQ8QU5UTFJUcmVlPiB1cDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RG93biwgc2V0dGVyPXNldERvd246KSBpZDxBTlRMUlRyZWU+IGRvd247CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEVvZiwgc2V0dGVyPXNldEVvZjopIGlkPEFOVExSVHJlZT4gZW9mOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXROb2Rlcywgc2V0dGVyPXNldE5vZGVzOikgTlNNdXRhYmxlQXJyYXkgKm5vZGVzOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlU291cmNlLCBzZXR0ZXI9c2V0VHJlZVNvdXJjZTopIGlkPEFOVExSVHJlZT4gcm9vdDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5TdHJlYW0sIHNldHRlcj1zZXRUb2tlblN0cmVhbTopIGlkPEFOVExSVG9rZW5TdHJlYW0+IHRva2VuczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QWRhcHRvciwgc2V0dGVyPXNldEFkYXB0b3I6KSBBTlRMUkNvbW1vblRyZWVBZGFwdG9yICphZGFwdG9yOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXMsIHNldHRlcj1zZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KSBCT09MIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0SW5kZXgsIHNldHRlcj1zZXRJbmRleDopIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMYXN0TWFya2VyLCBzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDYWxscywgc2V0dGVyPXNldENhbGxzOikgQU5UTFJJbnRBcnJheSAqY2FsbHM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEVudW0sIHNldHRlcj1zZXRFbnVtOikgTlNFbnVtZXJhdG9yICplOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDdXJyZW50U3ltYm9sLCBzZXR0ZXI9c2V0Q3VycmVudFN5bWJvbDopIGlkIGN1cnJlbnRTeW1ib2w7CisKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZT4pdHJlZTsKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooaWQ8QU5UTFJUcmVlPil0cmVlOworKyAoQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWUgd2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilpbml0aWFsQnVmZmVyU2l6ZTsKKworI3ByYWdtYSBtYXJrIENvbnN0cnVjdG9yCistIChpZCkgaW5pdFdpdGhUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWUgV2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilidWZmZXJTaXplOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLy8gcHJvdGVjdGVkIG1ldGhvZHMuIERPIE5PVCBVU0UKKyNwcmFnbWEgbWFyayBQcm90ZWN0ZWQgTWV0aG9kcworLSAodm9pZCkgZmlsbEJ1ZmZlcjsKKy0gKHZvaWQpIGZpbGxCdWZmZXJXaXRoVHJlZTooaWQ8QU5UTFJUcmVlPikgdHJlZTsKKy0gKE5TSW50ZWdlcikgZ2V0Tm9kZUluZGV4OihpZDxBTlRMUlRyZWU+KSBub2RlOworLSAodm9pZCkgYWRkTmF2aWdhdGlvbk5vZGU6KE5TSW50ZWdlcikgdHlwZTsKKy0gKGlkKSBnZXROb2RlOihOU0ludGVnZXIpIGk7CistIChpZCkgTFQ6KE5TSW50ZWdlcikgazsKKy0gKGlkKSBnZXRDdXJyZW50U3ltYm9sOworLSAoaWQpIExCOihOU0ludGVnZXIpIGk7CisjcHJhZ21hIG1hcmsgR2VuZXJhbCBNZXRob2RzCistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgZ2V0VG9rZW5TdHJlYW07CistICh2b2lkKSBzZXRUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pIHRva2VuczsKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPikgYW5BZGFwdG9yOworCistIChCT09MKWdldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClhVmFsOworCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKSBpOworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgc2V0SW5kZXg6KE5TSW50ZWdlcikgaWR4OworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaWR4OworCistICh2b2lkKSBwdXNoOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIHBvcDsKKworLSAodm9pZCkgcmVzZXQ7CistIChOU1VJbnRlZ2VyKSBjb3VudDsKKy0gKE5TRW51bWVyYXRvciAqKSBvYmplY3RFbnVtZXJhdG9yOworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworCistIChOU1N0cmluZyAqKSB0b1Rva2VuVHlwZVN0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvVG9rZW5TdHJpbmc6KE5TSW50ZWdlcilhU3RhcnQgVG9FbmQ6KE5TSW50ZWdlcilhU3RvcDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKWFTdGFydCBUb05vZGU6KGlkKWFTdG9wOworCisvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCistIChOU011dGFibGVBcnJheSAqKSBnZXROb2RlczsKKy0gKGlkPEFOVExSVHJlZT4pIGdldEVvZjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ2hhclN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ2hhclN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3OTczNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJDaGFyU3RyZWFtLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKyNkZWZpbmUJQU5UTFJDaGFyU3RyZWFtRU9GIC0xCisKKworQHByb3RvY29sIEFOVExSQ2hhclN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLSAoTlNTdHJpbmcgKikgc3Vic3RyaW5nV2l0aFJhbmdlOihOU1JhbmdlKSB0aGVSYW5nZTsKKworLyoqIEdldCB0aGUgaXRoIGNoYXJhY3RlciBvZiBsb29rYWhlYWQuICBUaGlzIGlzIHRoZSBzYW1lIHVzdWFsbHkgYXMKKyAqICBMQShpKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZAorICogIGxleGVyIGNvZGUuICBJJ2QgcHJlZmVyIHRvIHJldHVybiBhIGNoYXIgaGVyZSB0eXBlLXdpc2UsIGJ1dCBpdCdzCisgKiAgcHJvYmFibHkgYmV0dGVyIHRvIGJlIDMyLWJpdCBjbGVhbiBhbmQgYmUgY29uc2lzdGVudCB3aXRoIExBLgorICovCistIChOU0ludGVnZXIpTFQ6KE5TSW50ZWdlcikgaTsKKworLy8gQU5UTFIgdHJhY2tzIHRoZSBsaW5lIGluZm9ybWF0aW9uIGF1dG9tYXRpY2FsbHkKKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKworLy8gQmVjYXVzZSB0aGlzIHN0cmVhbSBjYW4gcmV3aW5kLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhlIGxpbmUKKy0gKHZvaWQpIHNldExpbmU6KE5TSW50ZWdlcikgdGhlTGluZTsKKworLy8gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5uLTEKKy0gKE5TSW50ZWdlcikgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworCistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TSW50ZWdlcikgdGhlUG9zOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ2hhclN0cmVhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4N2M3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8vCisvLyAgQU5UTFJDaGFyU3RyZWFtU3RhdGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJDaGFyU3RyZWFtU3RhdGUgOiBOU09iamVjdAoreworTlNJbnRlZ2VyIHA7CitOU0ludGVnZXIgbGluZTsKK05TSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFAsc2V0dGVyPXNldFA6KSBOU0ludGVnZXIgcDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExpbmUsc2V0dGVyPXNldExpbmU6KSBOU0ludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYXJQb3NpdGlvbkluTGluZSxzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKworKyBuZXdBTlRMUkNoYXJTdHJlYW1TdGF0ZTsKKworLSAoaWQpIGluaXQ7CisKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6IChOU0ludGVnZXIpIGFuSW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKy0gKHZvaWQpIHNldExpbmU6IChOU0ludGVnZXIpIGFMaW5lOworCistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKWFDaGFyUG9zaXRpb25JbkxpbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNvbW1vbkVycm9yTm9kZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uRXJyb3JOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliYWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNvbW1vbkVycm9yTm9kZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJDb21tb25FcnJvck5vZGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJJbnRTdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJVbldhbnRlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25FcnJvck5vZGUgOiBBTlRMUkNvbW1vblRyZWUKK3sKK2lkPEFOVExSSW50U3RyZWFtPiBpbnB1dDsKK2lkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CitBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICp0cmFwcGVkRXhjZXB0aW9uOworfQorCisrIChpZCkgbmV3QU5UTFJDb21tb25FcnJvck5vZGU6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgIEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGU7CisKKy0gKGlkKSBpbml0V2l0aElucHV0OihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKikgZTsKKy0gKEJPT0wpIGlzTmlsOworCistIChOU0ludGVnZXIpIGdldFR5cGU7CisKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVG9rZW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NjYyMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVG9rZW4uaApAQCAtMCwwICsxLDEwNSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVG9rZW4gOiBOU09iamVjdCA8IEFOVExSVG9rZW4gPiB7CisJTlNTdHJpbmcgKnRleHQ7CisJTlNJbnRlZ2VyIHR5cGU7CisJLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRva2VuJ3MgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbQorCU5TVUludGVnZXIgbGluZTsKKwlOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU1VJbnRlZ2VyIGNoYW5uZWw7CisJLy8gdGhpcyB0b2tlbidzIHBvc2l0aW9uIGluIHRoZSBUb2tlblN0cmVhbQorCU5TVUludGVnZXIgaW5kZXg7CisJCisJLy8gaW5kaWNlcyBpbnRvIHRoZSBDaGFyU3RyZWFtIHRvIGF2b2lkIGNvcHlpbmcgdGhlIHRleHQKKwkvLyBjYW4gbWFudWFsbHkgb3ZlcnJpZGUgdGhlIHRleHQgYnkgdXNpbmcgLXNldFRleHQ6CisJTlNVSW50ZWdlciBzdGFydEluZGV4OworCU5TVUludGVnZXIgc3RvcEluZGV4OworCS8vIHRoZSBhY3R1YWwgaW5wdXQgc3RyZWFtIHRoaXMgdG9rZW4gd2FzIGZvdW5kIGluCisJaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUeXBlLCBzZXR0ZXI9c2V0VHlwZTopIE5TSW50ZWdlciB0eXBlOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMaW5lLCBzZXR0ZXI9c2V0TGluZTopIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hhclBvc2l0aW9uSW5MaW5lLCBzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNVSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldENoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNVSW50ZWdlciBjaGFubmVsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlbkluZGV4LCBzZXR0ZXI9c2V0VG9rZW5JbmRleDopIE5TVUludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBOU1VJbnRlZ2VyIHN0YXJ0SW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgTlNVSW50ZWdlciBzdG9wSW5kZXg7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldElucHV0LCBzZXR0ZXI9c2V0SW5wdXQ6KSBpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OworCisrICh2b2lkKSBpbml0aWFsaXplOworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdBTlRMUkNvbW1vblRva2VuOworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdBTlRMUkNvbW1vblRva2VuOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKWFUVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydDooTlNJbnRlZ2VyKWFTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpYVN0b3A7CisrIChBTlRMUkNvbW1vblRva2VuICopIG5ld0FOVExSQ29tbW9uVG9rZW46KEFOVExSVG9rZW5UeXBlKWFUeXBlOworKyAoaWQ8QU5UTFJUb2tlbj4pIG5ld0FOVExSQ29tbW9uVG9rZW46KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisrIChpZDxBTlRMUlRva2VuPikgbmV3QU5UTFJDb21tb25Ub2tlbldpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIGVvZlRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIHNraXBUb2tlbjsKKysgKGlkPEFOVExSVG9rZW4+KSBpbnZhbGlkVG9rZW47CisrIChBTlRMUlRva2VuQ2hhbm5lbCkgZGVmYXVsdENoYW5uZWw7CisKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIuIFRoaXMgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB3YXkgdG8gaW5pdGlhbGl6ZSBhIFRva2VuIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdDsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcilhVFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbDooTlNJbnRlZ2VyKWFDaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6KE5TSW50ZWdlcil0aGVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpdGhlU3RvcDsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVHlwZTsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisKKy0gKGlkPEFOVExSQ2hhclN0cmVhbT4pIGdldElucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUkNoYXJTdHJlYW0+KSBhbklucHV0OworCistIChOU1VJbnRlZ2VyKSBnZXRTdGFydDsKKy0gKHZvaWQpIHNldFN0YXJ0OiAoTlNVSW50ZWdlcikgYVN0YXJ0OworCistIChOU1VJbnRlZ2VyKSBnZXRTdG9wOworLSAodm9pZCkgc2V0U3RvcDogKE5TVUludGVnZXIpIGFTdG9wOworCisvLyB0aGUgaW5kZXggb2YgdGhpcyBUb2tlbiBpbnRvIHRoZSBUb2tlblN0cmVhbQorLSAoTlNVSW50ZWdlcikgZ2V0VG9rZW5JbmRleDsKKy0gKHZvaWQpIHNldFRva2VuSW5kZXg6IChOU1VJbnRlZ2VyKSBhVG9rZW5JbmRleDsKKworLy8gY29uZm9ybSB0byBOU0NvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ZjlkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gOiBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0gPCBBTlRMUlRva2VuU3RyZWFtID4KK3sKKwlOU011dGFibGVEaWN0aW9uYXJ5ICpjaGFubmVsT3ZlcnJpZGU7CisJTlNJbnRlZ2VyIGNoYW5uZWw7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Q2hhbm5lbE92ZXJyaWRlLHNldHRlcj1zZXRDaGFubmVsT3ZlcnJpZGUpIE5TTXV0YWJsZURpY3Rpb25hcnkgKmNoYW5uZWxPdmVycmlkZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hhbm5lbCxzZXR0ZXI9c2V0Q2hhbm5lbCkgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gKiluZXdBTlRMUkNvbW1vblRva2VuU3RyZWFtOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbDsKKworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGdldFRva2VuU291cmNlOworLSAodm9pZCkgc2V0VG9rZW5Tb3VyY2U6IChpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIExUOihOU0ludGVnZXIpazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKWs7CisKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnM6KE5TSW50ZWdlcikgaTsKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnNSZXZlcnNlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpc2V0dXA7CisKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2U7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIGluQml0U2V0OihBTlRMUkJpdFNldCAqKWFCaXRTZXQ7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGhUeXBlczooTlNBcnJheSAqKXRva2VuVHlwZXM7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGhUeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcilpOworCistIChOU0ludGVnZXIpIHNpemU7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpbWFya2VyOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKWluZGV4OworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnRJbmRleCBUb0VuZDooTlNJbnRlZ2VyKXN0b3BJbmRleDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlcilnZXRDaGFubmVsOworLSAodm9pZClzZXRDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKE5TTXV0YWJsZURpY3Rpb25hcnkgKilnZXRDaGFubmVsT3ZlcnJpZGU7CistICh2b2lkKXNldENoYW5uZWxPdmVycmlkZTooTlNNdXRhYmxlRGljdGlvbmFyeSAqKWFuT3ZlcnJpZGU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNvbW1vblRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkNvbW1vblRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOTY2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZS5oCkBAIC0wLDAgKzEsODggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZSA6IEFOVExSQmFzZVRyZWUgPEFOVExSVHJlZT4geworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuOworCU5TSW50ZWdlciBzdGFydEluZGV4OworCU5TSW50ZWdlciBzdG9wSW5kZXg7CisgICAgQU5UTFJDb21tb25UcmVlICpwYXJlbnQ7CisgICAgTlNJbnRlZ2VyIGNoaWxkSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QU5UTFJDb21tb25Ub2tlbiwgc2V0dGVyPXNldEFOVExSQ29tbW9uVG9rZW4pIEFOVExSQ29tbW9uVG9rZW4gKnRva2VuOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlblN0YXJ0SW5kZXgsIHNldHRlcj1zZXRUb2tlblN0YXJ0SW5kZXgpIE5TSW50ZWdlciBzdGFydEluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlblN0b3BJbmRleCwgc2V0dGVyPXNldFRva2VuU3RvcEluZGV4KSBOU0ludGVnZXIgc3RvcEluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQYXJlbnQsIHNldHRlcj1zZXRQYXJlbnQ6KSBBTlRMUkNvbW1vblRyZWUgKnBhcmVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hpbGRJbmRleCwgc2V0dGVyPXNldENoaWxkSW5kZXgpIE5TSW50ZWdlciBjaGlsZEluZGV4OworCisrIChBTlRMUkNvbW1vblRyZWUgKikgaW52YWxpZE5vZGU7CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3QU5UTFJDb21tb25UcmVlOworKyAoQU5UTFJDb21tb25UcmVlICopIG5ld0FOVExSQ29tbW9uVHJlZVdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKyNpZmRlZiBET05UVVNFWUVUCisrIChpZDxBTlRMUlRyZWU+KSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdG9rZW5UZXh0OworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisjZW5kaWYKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlTm9kZTooQU5UTFJDb21tb25UcmVlICopYU5vZGU7CistIChpZCkgaW5pdFdpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGU7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoaWQ8QU5UTFJUcmVlPikgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoQk9PTCkgaXNOaWw7CisKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgZ2V0VG9rZW47CistICh2b2lkKSBzZXRUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKGlkPEFOVExSVHJlZT4pIGR1cE5vZGU7CistIChOU0ludGVnZXIpIGdldFR5cGU7CistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAoTlNVSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBnZXRQYXJlbnQ7CistICh2b2lkKSBzZXRQYXJlbnQ6KEFOVExSQ29tbW9uVHJlZSAqKSB0OworCisjaWZkZWYgRE9OVFVTRU5PTU8KKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKyNlbmRpZgorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistICh2b2lkKSBzZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6IChOU0ludGVnZXIpIGFTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OiAoTlNJbnRlZ2VyKSBhU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MzI4N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaApAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25UcmVlQWRhcHRvciA6IEFOVExSQmFzZVRyZWVBZGFwdG9yIHsKK30KKworKyAoaWQ8QU5UTFJUcmVlPikgbmV3RW1wdHlUcmVlOworKyAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKW5ld0FOVExSQ29tbW9uVHJlZUFkYXB0b3I7CistIChpZCkgaW5pdDsKKy0gKGlkPEFOVExSVHJlZT4pZHVwTm9kZTooaWQ8QU5UTFJUcmVlPil0OyAgICAKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWNyZWF0ZVRyZWU6KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CistIChBTlRMUkNvbW1vblRyZWUgKiljcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKHZvaWQpIHNldFRva2VuQm91bmRhcmllczooaWQ8QU5UTFJUcmVlPil0IEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4gVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0YXJ0SW5kZXg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0b3BJbmRleDooaWQ8QU5UTFJUcmVlPil0OworLSAoTlNTdHJpbmcgKilnZXRUZXh0OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKXNldFRleHQ6KGlkPEFOVExSVHJlZT4pdCBUZXh0OihOU1N0cmluZyAqKXRleHQ7CistIChOU0ludGVnZXIpZ2V0VHlwZTooaWQ8QU5UTFJUcmVlPil0OworLSAodm9pZCkgc2V0VHlwZTooaWQ8QU5UTFJUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGU7CistIChpZDxBTlRMUlRva2VuPilnZXRUb2tlbjooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQ8QU5UTFJUcmVlPilnZXRDaGlsZDooaWQ8QU5UTFJUcmVlPil0IEF0OihOU0ludGVnZXIpaTsKKy0gKHZvaWQpIHNldENoaWxkOihpZDxBTlRMUlRyZWU+KXQgQXQ6KE5TSW50ZWdlcilpIENoaWxkOihpZDxBTlRMUlRyZWU+KWNoaWxkOworLSAoTlNJbnRlZ2VyKWdldENoaWxkQ291bnQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKGlkPEFOVExSVHJlZT4pZ2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKXNldFBhcmVudDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KGlkPEFOVExSVHJlZT4pcGFyZW50OworLSAoTlNJbnRlZ2VyKWdldENoaWxkSW5kZXg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpc2V0Q2hpbGRJbmRleDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KE5TSW50ZWdlcilpbmRleDsKKy0gKHZvaWQpcmVwbGFjZUNoaWxkcmVuOihpZDxBTlRMUlRyZWU+KXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzY4ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDExNiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0gOiBBTlRMUkxvb2thaGVhZFN0cmVhbSA8QU5UTFJUcmVlTm9kZVN0cmVhbT4geworI2RlZmluZSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgMTAwCisjZGVmaW5lIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFIDEwCisgICAgCisvKiogUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/ICovCitpZCByb290OworICAgIAorLyoqIElmIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuICovCitpZCA8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworICAgIAorCS8qKiBXaGF0IHRyZWUgYWRhcHRvciB3YXMgdXNlZCB0byBidWlsZCB0aGVzZSB0cmVlcyAqLworQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKyAgICAKKy8qKiBUaGUgdHJlZSBpdGVyYXRvciB3ZSB1c2luZyAqLworQU5UTFJUcmVlSXRlcmF0b3IgKml0OworICAgIAorLyoqIFN0YWNrIG9mIGluZGV4ZXMgdXNlZCBmb3IgcHVzaC9wb3AgY2FsbHMgKi8KK0FOVExSSW50QXJyYXkgKmNhbGxzOyAgICAKKyAgICAKKy8qKiBUcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zICovCitCT09MIGhhc05pbFJvb3Q7CisgICAgCisvKiogVHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC4gKi8KK05TSW50ZWdlciBsZXZlbDsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Um9vdCwgc2V0dGVyPXNldFJvb3Q6KSBBTlRMUkNvbW1vblRyZWUgKnJvb3Q7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VucyxzZXR0ZXI9c2V0VG9rZW5zOikgaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlQWRhcHRvciwgc2V0dGVyPXNldFRyZWVBZGFwdG9yOikgQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKyAgICAKKy0gKHZvaWQpIHJlc2V0OworICAgIAorICAgIC8qKiBQdWxsIGVsZW1lbnRzIGZyb20gdHJlZSBpdGVyYXRvci4gIFRyYWNrIHRyZWUgbGV2ZWwgMC4ubWF4X2xldmVsLgorICAgICAqICBJZiBuaWwgcm9vdGVkIHRyZWUsIGRvbid0IGdpdmUgaW5pdGlhbCBuaWwgYW5kIERPV04gbm9yIGZpbmFsIFVQLgorICAgICAqLworLSAoaWQpIG5leHRFbGVtZW50OworICAgIAorLSAoQk9PTCkgaXNFT0Y6KGlkPEFOVExSVHJlZT4pIG87CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICAKKy0gKGlkKSBnZXRUcmVlU291cmNlOworICAgIAorLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKyAgICAKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRUb2tlblN0cmVhbTsKKyAgICAKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPikgdG9rZW5zOworICAgIAorLSAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKSBnZXRUcmVlQWRhcHRvcjsKKyAgICAKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopIGFkYXB0b3I7CisgICAgCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisgICAgCisgICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisgICAgICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXROb2RlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgaW5kZXg7CisgICAgCisgICAgLyoqIFNlZWsgYmFjayB0byBwcmV2aW91cyBpbmRleCBzYXZlZCBkdXJpbmcgbGFzdCBwdXNoKCkgY2FsbC4KKyAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgKi8KKy0gKE5TSW50ZWdlcikgcG9wOworICAgIAorLy8gVFJFRSBSRVdSSVRFIElOVEVSRkFDRQorICAgIAorLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworICAgIAorLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQ8QU5UTFJUcmVlPilzdGFydE5vZGUgVG9Ob2RlOihpZDxBTlRMUlRyZWU+KXN0b3BOb2RlOworCisvKiogRm9yIGRlYnVnZ2luZzsgZGVzdHJ1Y3RpdmU6IG1vdmVzIHRyZWUgaXRlcmF0b3IgdG8gZW5kLiAqLworLSAoTlNTdHJpbmcgKikgdG9Ub2tlblR5cGVTdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRGQS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSREZBLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTA5NGEzZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRGQS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJERkEgOiBOU09iamVjdCB7CisJLy8gdGhlIHRhYmxlcyBhcmUgc2V0IGJ5IHN1YmNsYXNzZXMgdG8gdGhlaXIgb3duIHN0YXRpYyB2ZXJzaW9ucy4KKwljb25zdCBpbnQgKmVvdDsKKwljb25zdCBpbnQgKmVvZjsKKwljb25zdCB1bmljaGFyICptaW47CisJY29uc3QgdW5pY2hhciAqbWF4OworCWNvbnN0IGludCAqYWNjZXB0OworCWNvbnN0IGludCAqc3BlY2lhbDsKKwljb25zdCBpbnQgKip0cmFuc2l0aW9uOworCQorCUFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CisJTlNJbnRlZ2VyIGRlY2lzaW9uTnVtYmVyOworICAgIE5TSW50ZWdlciBsZW47Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UmVjb2duaXplcixzZXR0ZXI9c2V0UmVjb2duaXplcjopIEFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldERlY2lzaW9uLHNldHRlcj1zZXREZWNpc2lvbjopIE5TSW50ZWdlciBkZWNpc2lvbk51bWJlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGVuLHNldHRlcj1zZXRMZW46KSBOU0ludGVnZXIgbGVuOworCistIChpZCkgaW5pdFdpdGhSZWNvZ25pemVyOihpZCkgdGhlUmVjb2duaXplcjsKKy8vIHNpbXVsYXRlIHRoZSBERkEgdXNpbmcgdGhlIHN0YXRpYyB0YWJsZXMgYW5kIHByZWRpY3QgYW4gYWx0ZXJuYXRpdmUKKy0gKE5TSW50ZWdlcikgcHJlZGljdDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0OworLSAodm9pZCkgbm9WaWFibGVBbHQ6KE5TSW50ZWdlcilzdGF0ZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCistIChOU0ludGVnZXIpIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb246KE5TSW50ZWdlcilzdGF0ZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworLy8gLSAoTlNJbnRlZ2VyKSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uOihOU0ludGVnZXIpIHN0YXRlOworLy8tICh1bmljaGFyKSBzcGVjaWFsVHJhbnNpdGlvbjoodW5pY2hhcikgc3RhdGUgc3ltYm9sOihOU0ludGVnZXIpIHN5bWJvbDsKKworLy8gaG9vayBmb3IgZGVidWdnZXIgc3VwcG9ydAorLSAodm9pZCkgZXJyb3I6KEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKiludmFlOworCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworCisrICh2b2lkKSBzZXRJc0VtaXR0aW5nRGVidWdJbmZvOihCT09MKSBzaG91bGRFbWl0RGVidWdJbmZvOworCistIChOU0ludGVnZXIpZ2V0RGVjaXNpb247CistICh2b2lkKXNldERlY2lzaW9uOihOU0ludGVnZXIpYURlY2lzb247CisKKy0gKEFOVExSQmFzZVJlY29nbml6ZXIgKilnZXRSZWNvZ25pemVyOworLSAodm9pZClzZXRSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopYVJlY29nbml6ZXI7CistIChOU0ludGVnZXIpbGVuZ3RoOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Zy5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NzM4M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWcuaApAQCAtMCwwICsxLDMzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudExpc3RlbmVyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1BhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZVBhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiZWU2YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oCkBAIC0wLDAgKzEsMjc1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0Bwcm90b2NvbCBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lciAKKworI2RlZmluZSBBTlRMUkRlYnVnUHJvdG9jb2xWZXJzaW9uIDEKKworLyoqIFRoZSBwYXJzZXIgaGFzIGp1c3QgZW50ZXJlZCBhIHJ1bGUuICBObyBkZWNpc2lvbiBoYXMgYmVlbiBtYWRlIGFib3V0CisqICB3aGljaCBhbHQgaXMgcHJlZGljdGVkLiAgVGhpcyBpcyBmaXJlZCBBRlRFUiBpbml0IGFjdGlvbnMgaGF2ZSBiZWVuCisqICBleGVjdXRlZC4gIEF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgYW5kIGF2YWlsYWJsZSBldGMuLi4KKyovCistICh2b2lkKSBlbnRlclJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CisKKy8qKiBCZWNhdXNlIHJ1bGVzIGNhbiBoYXZlIGxvdHMgb2YgYWx0ZXJuYXRpdmVzLCBpdCBpcyB2ZXJ5IHVzZWZ1bCB0bworKiAga25vdyB3aGljaCBhbHQgeW91IGFyZSBlbnRlcmluZy4gIFRoaXMgaXMgMS4ubiBmb3IgbiBhbHRzLgorKi8KKy0gKHZvaWQpIGVudGVyQWx0OihOU0ludGVnZXIpYWx0OworCisvKiogVGhpcyBpcyB0aGUgbGFzdCB0aGluZyBleGVjdXRlZCBiZWZvcmUgbGVhdmluZyBhIHJ1bGUuICBJdCBpcworKiAgZXhlY3V0ZWQgZXZlbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgVGhpcyBpcyB0cmlnZ2VyZWQgYWZ0ZXIKKyogIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaGF2ZSBvY2N1cnJlZCAodW5sZXNzIHRoZSBleGNlcHRpb24gaXMKKwkJCQkJCQkJCQkJICAgKiAgbm90IGNhdWdodCBpbiB0aGlzIHJ1bGUpLiAgVGhpcyBpbXBsaWVzIGFuICJleGl0QWx0IiBldmVudC4KKyovCistICh2b2lkKSBleGl0UnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKworLyoqIFRyYWNrIGVudHJ5IGludG8gYW55ICguLi4pIHN1YnJ1bGUgb3RoZXIgRUJORiBjb25zdHJ1Y3QgKi8KKy0gKHZvaWQpIGVudGVyU3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCistICh2b2lkKSBleGl0U3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCisvKiogRXZlcnkgZGVjaXNpb24sIGZpeGVkIGsgb3IgYXJiaXRyYXJ5LCBoYXMgYW4gZW50ZXIvZXhpdCBldmVudAorKiAgc28gdGhhdCBhIEdVSSBjYW4gZWFzaWx5IHRyYWNrIHdoYXQgTFQvY29uc3VtZSBldmVudHMgYXJlCisqICBhc3NvY2lhdGVkIHdpdGggcHJlZGljdGlvbi4gIFlvdSB3aWxsIHNlZSBhIHNpbmdsZSBlbnRlci9leGl0CisqICBzdWJydWxlIGJ1dCBtdWx0aXBsZSBlbnRlci9leGl0IGRlY2lzaW9uIGV2ZW50cywgb25lIGZvciBlYWNoCisqICBsb29wIGl0ZXJhdGlvbi4KKyovCistICh2b2lkKSBlbnRlckRlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisKKy0gKHZvaWQpIGV4aXREZWNpc2lvbjooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCisvKiogQW4gaW5wdXQgdG9rZW4gd2FzIGNvbnN1bWVkOyBtYXRjaGVkIGJ5IGFueSBraW5kIG9mIGVsZW1lbnQuCisqICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKworLyoqIEFuIG9mZi1jaGFubmVsIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZC4KKyogIFRyaWdnZXIgYWZ0ZXIgdGhlIHRva2VuIHdhcyBtYXRjaGVkIGJ5IHRoaW5ncyBsaWtlIG1hdGNoKCksIG1hdGNoQW55KCkuCisqICAodW5sZXNzIG9mIGNvdXJzZSB0aGUgaGlkZGVuIHRva2VuIGlzIGZpcnN0IHN0dWZmIGluIHRoZSBpbnB1dCBzdHJlYW0pLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVIaWRkZW5Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKworLyoqIFNvbWVib2R5IChhbnlib2R5KSBsb29rZWQgYWhlYWQuICBOb3RlIHRoYXQgdGhpcyBhY3R1YWxseSBnZXRzCisqICB0cmlnZ2VyZWQgYnkgYm90aCBMQSBhbmQgTFQgY2FsbHMuICBUaGUgZGVidWdnZXIgd2lsbCB3YW50IHRvIGtub3cKKyogIHdoaWNoIFRva2VuIG9iamVjdCB3YXMgZXhhbWluZWQuICBMaWtlIGNvbnN1bWVUb2tlbiwgdGhpcyBpbmRpY2F0ZXMKKyogIHdoYXQgdG9rZW4gd2FzIHNlZW4gYXQgdGhhdCBkZXB0aC4gIEEgcmVtb3RlIGRlYnVnZ2VyIGNhbm5vdCBsb29rCisqICBhaGVhZCBpbnRvIGEgZmlsZSBpdCBkb2Vzbid0IGhhdmUgc28gTFQgZXZlbnRzIG11c3QgcGFzcyB0aGUgdG9rZW4KKyogIGV2ZW4gaWYgdGhlIGluZm8gaXMgcmVkdW5kYW50LgorKi8KKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0OworCisvKiogVGhlIHBhcnNlciBpcyBnb2luZyB0byBsb29rIGFyYml0cmFyaWx5IGFoZWFkOyBtYXJrIHRoaXMgbG9jYXRpb24sCisqICB0aGUgdG9rZW4gc3RyZWFtJ3MgbWFya2VyIGlzIHNlbnQgaW4gY2FzZSB5b3UgbmVlZCBpdC4KKyovCistICh2b2lkKSBtYXJrOihOU0ludGVnZXIpbWFya2VyOworCisvKiogQWZ0ZXIgYW4gYXJiaXRyYWlybHkgbG9uZyBsb29rYWhlYWQgYXMgd2l0aCBhIGN5Y2xpYyBERkEgKG9yIHdpdGgKKyogIGFueSBiYWNrdHJhY2spLCB0aGlzIGluZm9ybXMgdGhlIGRlYnVnZ2VyIHRoYXQgc3RyZWFtIHNob3VsZCBiZQorKiAgcmV3b3VuZCB0byB0aGUgcG9zaXRpb24gYXNzb2NpYXRlZCB3aXRoIG1hcmtlci4KKyovCistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlciltYXJrZXI7CisKKy8qKiBSZXdpbmQgdG8gdGhlIGlucHV0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hcmtlci4KKyogIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0CisqICBiZWZvcmUgc3RhcnRpbmcgYSBzZW0vc3luIHByZWRpY2F0ZSB0byBnZXQgdGhlCisqICBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGVjaXNpb24uCisqICBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgbWFyayhpKQorKiAgYW5kIHJld2luZChpKSBzaG91bGQgYmFsYW5jZSBzdGlsbC4KKyovCistICh2b2lkKSByZXdpbmQ7CisKKy0gKHZvaWQpIGJlZ2luQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWw7CisKKy0gKHZvaWQpIGVuZEJhY2t0cmFjazooTlNJbnRlZ2VyKWxldmVsIHdhc1N1Y2Nlc3NmdWw6KEJPT0wpc3VjY2Vzc2Z1bDsKKworLyoqIFRvIHdhdGNoIGEgcGFyc2VyIG1vdmUgdGhyb3VnaCB0aGUgZ3JhbW1hciwgdGhlIHBhcnNlciBuZWVkcyB0bworKiAgaW5mb3JtIHRoZSBkZWJ1Z2dlciB3aGF0IGxpbmUvY2hhclBvcyBpdCBpcyBwYXNzaW5nIGluIHRoZSBncmFtbWFyLgorKiAgRm9yIG5vdywgdGhpcyBkb2VzIG5vdCBrbm93IGhvdyB0byBzd2l0Y2ggZnJvbSBvbmUgZ3JhbW1hciB0byB0aGUKKyogIG90aGVyIGFuZCBiYWNrIGZvciBpc2xhbmQgZ3JhbW1hcnMgZXRjLi4uCisqCisqICBUaGlzIHNob3VsZCBhbHNvIGFsbG93IGJyZWFrcG9pbnRzIGJlY2F1c2UgdGhlIGRlYnVnZ2VyIGNhbiBzdG9wCisqICB0aGUgcGFyc2VyIHdoZW5ldmVyIGl0IGhpdHMgdGhpcyBsaW5lL3Bvcy4KKyovCistICh2b2lkKSBsb2NhdGlvbkxpbmU6KE5TSW50ZWdlcilsaW5lIGNvbHVtbjooTlNJbnRlZ2VyKXBvczsKKworLyoqIEEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFeGNlcHRpb24uICBJIG1hZGUKKyogIHRoaXMgYSBnZW5lcmljIGV2ZW50IHNvIHRoYXQgSSBjYW4gYWx0ZXIgdGhlIGV4Y2VwdGlvbiBoaWVyYWNoeSBsYXRlcgorKiAgd2l0aG91dCBoYXZpbmcgdG8gYWx0ZXIgYWxsIHRoZSBkZWJ1ZyBvYmplY3RzLgorKgorKiAgVXBvbiBlcnJvciwgdGhlIHN0YWNrIG9mIGVudGVyIHJ1bGUvc3VicnVsZSBtdXN0IGJlIHByb3Blcmx5IHVud291bmQuCisqICBJZiBubyB2aWFibGUgYWx0IG9jY3VycyBpdCBpcyB3aXRoaW4gYW4gZW50ZXIvZXhpdCBkZWNpc2lvbiwgd2hpY2gKKyogIGFsc28gbXVzdCBiZSByZXdvdW5kLiAgRXZlbiB0aGUgcmV3aW5kIGZvciBlYWNoIG1hcmsgbXVzdCBiZSB1bndvdW50LgorKiAgSW4gdGhlIEphdmEgdGFyZ2V0IHRoaXMgaXMgcHJldHR5IGVhc3kgdXNpbmcgdHJ5L2ZpbmFsbHksIGlmIGEgYml0CisqICB1Z2x5IGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRoZSByZXdpbmQgaXMgZ2VuZXJhdGVkIGluIERGQS5wcmVkaWN0KCkKKyogIGFjdHVhbGx5IHNvIG5vIGNvZGUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGF0LiAgRm9yIGxhbmd1YWdlcworKiAgdy9vIHRoaXMgImZpbmFsbHkiIGZlYXR1cmUgKEMrKz8pLCB0aGUgdGFyZ2V0IGltcGxlbWVudG9yIHdpbGwgaGF2ZQorKiAgdG8gYnVpbGQgYW4gZXZlbnQgc3RhY2sgb3Igc29tZXRoaW5nLgorKgorKiAgQWNyb3NzIGEgc29ja2V0IGZvciByZW1vdGUgZGVidWdnaW5nLCBvbmx5IHRoZSBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorKiAgZGF0YSBmaWVsZHMgYXJlIHRyYW5zbWl0dGVkLiAgVGhlIHRva2VuIG9iamVjdCBvciB3aGF0ZXZlciB0aGF0CisqICBjYXVzZWQgdGhlIHByb2JsZW0gd2FzIHRoZSBsYXN0IG9iamVjdCByZWZlcmVuY2VkIGJ5IExULiAgVGhlCisqICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgTFQgZXZlbnQgc2hvdWxkIGhvbGQgdGhlIHVuZXhwZWN0ZWQgVG9rZW4gb3IKKyogIGNoYXIuCisqCisqICBIZXJlIGlzIGEgc2FtcGxlIGV2ZW50IHRyYWNlIGZvciBncmFtbWFyOgorKgorKiAgYiA6IEMgKHs7fUF8QikgLy8gezt9IGlzIHRoZXJlIHRvIHByZXZlbnQgQXxCIGJlY29taW5nIGEgc2V0CisqICAgIHwgRAorKiAgICA7CisqCisqICBUaGUgc2VxdWVuY2UgZm9yIHRoaXMgcnVsZSAod2l0aCBubyB2aWFibGUgYWx0IGluIHRoZSBzdWJydWxlKSBmb3IKKyogIGlucHV0ICdjIGMnICh0aGVyZSBhcmUgMyB0b2tlbnMpIGlzOgorKgorKgkJY29tbWVuY2UKKyoJCUxUKDEpCisqCQllbnRlclJ1bGUgYgorKgkJbG9jYXRpb24gNyAxCisqCQllbnRlciBkZWNpc2lvbiAzCisqCQlMVCgxKQorKgkJZXhpdCBkZWNpc2lvbiAzCisqCQllbnRlckFsdDEKKyoJCWxvY2F0aW9uIDcgNQorKgkJTFQoMSkKKyoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMTowXQorKgkJbG9jYXRpb24gNyA3CisqCQllbnRlclN1YlJ1bGUgMgorKgkJZW50ZXIgZGVjaXNpb24gMgorKgkJTFQoMSkKKyoJCUxUKDEpCisqCQlyZWNvZ25pdGlvbkV4Y2VwdGlvbiBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAyIDEgMgorKgkJZXhpdCBkZWNpc2lvbiAyCisqCQlleGl0U3ViUnVsZSAyCisqCQliZWdpblJlc3luYworKgkJTFQoMSkKKyoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMToxXQorKgkJTFQoMSkKKyoJCWVuZFJlc3luYworKgkJTFQoLTEpCisqCQlleGl0UnVsZSBiCisqCQl0ZXJtaW5hdGUKKyovCistICh2b2lkKSByZWNvZ25pdGlvbkV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CisKKy8qKiBJbmRpY2F0ZXMgdGhlIHJlY29nbml6ZXIgaXMgYWJvdXQgdG8gY29uc3VtZSB0b2tlbnMgdG8gcmVzeW5jaHJvbml6ZQorKiAgdGhlIHBhcnNlci4gIEFueSBjb25zdW1lIGV2ZW50cyBmcm9tIGhlcmUgdW50aWwgdGhlIHJlY292ZXJlZCBldmVudAorKiAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXJzZS0tdGhleSBhcmUgZGVhZCB0b2tlbnMuCisqLworLSAodm9pZCkgYmVnaW5SZXN5bmM7CisKKy8qKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb2duaXplciBoYXMgZmluaXNoZWQgY29uc3VtaW5nIHRva2VucyBpbiBvcmRlcgorKiAgdG8gcmVzeWNocm9uaXplLiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIGJlZ2luUmVzeW5jL2VuZFJlc3luYyBwYWlycworKiAgYmVmb3JlIHRoZSByZWNvZ25pemVyIGNvbWVzIG91dCBvZiBlcnJvclJlY292ZXJ5IG1vZGUgKGluIHdoaWNoCisqICBtdWx0aXBsZSBlcnJvcnMgYXJlIHN1cHByZXNzZWQpLiAgVGhpcyB3aWxsIGJlIHVzZWZ1bAorKiAgaW4gYSBndWkgd2hlcmUgeW91IHdhbnQgdG8gcHJvYmFibHkgZ3JleSBvdXQgdG9rZW5zIHRoYXQgYXJlIGNvbnN1bWVkCisqICBidXQgbm90IG1hdGNoZWQgdG8gYW55dGhpbmcgaW4gZ3JhbW1hci4gIEFueXRoaW5nIGJldHdlZW4KKyogIGEgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXIgd2FzIHRvc3NlZCBvdXQgYnkgdGhlIHBhcnNlci4KKyovCistICh2b2lkKSBlbmRSZXN5bmM7CisKKy8qKiBBIHNlbWFudGljIHByZWRpY2F0ZSB3YXMgZXZhbHVhdGUgd2l0aCB0aGlzIHJlc3VsdCBhbmQgYWN0aW9uIHRleHQgKi8KKy0gKHZvaWQpIHNlbWFudGljUHJlZGljYXRlOihOU1N0cmluZyAqKXByZWRpY2F0ZSBtYXRjaGVkOihCT09MKXJlc3VsdDsKKworLyoqIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKyogIHNlbmRpbmcgZXZlbnRzIG92ZXIgYSBzb2NrZXQuICBBIEdVSSBmb3IgZXhhbXBsZSB3aWxsIGxhdW5jaCBhIHRocmVhZAorKiAgdG8gY29ubmVjdCBhbmQgY29tbXVuaWNhdGUgd2l0aCBhIHJlbW90ZSBwYXJzZXIuICBUaGUgdGhyZWFkIHdpbGwgd2FudAorKiAgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKyogIHRyaWdnZXIgdGhpcyB1cG9uIGVudHJ5IHRvIHRoZSBmaXJzdCBydWxlICh0aGUgcnVsZUxldmVsIGlzIHVzZWQgdG8KKyogIGZpZ3VyZSB0aGlzIG91dCkuCisqLworLSAodm9pZCkgY29tbWVuY2U7CisKKy8qKiBQYXJzaW5nIGlzIG92ZXI7IHN1Y2Nlc3NmdWxseSBvciBub3QuICBNb3N0bHkgdXNlZnVsIGZvciB0ZWxsaW5nCisqICByZW1vdGUgZGVidWdnaW5nIGxpc3RlbmVycyB0aGF0IGl0J3MgdGltZSB0byBxdWl0LiAgV2hlbiB0aGUgcnVsZQorKiAgaW52b2NhdGlvbiBsZXZlbCBnb2VzIHRvIHplcm8gYXQgdGhlIGVuZCBvZiBhIHJ1bGUsIHdlIGFyZSBkb25lCisqICBwYXJzaW5nLgorKi8KKy0gKHZvaWQpIHRlcm1pbmF0ZTsKKworCisvLyBUIHIgZSBlICBQIGEgciBzIGkgbiBnCisKKy8qKiBJbnB1dCBmb3IgYSB0cmVlIHBhcnNlciBpcyBhbiBBU1QsIGJ1dCB3ZSBrbm93IG5vdGhpbmcgZm9yIHN1cmUKKyogIGFib3V0IGEgbm9kZSBleGNlcHQgaXRzIHR5cGUgYW5kIHRleHQgKG9idGFpbmVkIGZyb20gdGhlIGFkYXB0b3IpLgorKiAgVGhpcyBpcyB0aGUgYW5hbG9nIG9mIHRoZSBjb25zdW1lVG9rZW4gbWV0aG9kLiAgQWdhaW4sIHRoZSBJRCBpcworKiAgdGhlIGhhc2hDb2RlIHVzdWFsbHkgb2YgdGhlIG5vZGUgc28gaXQgb25seSB3b3JrcyBpZiBoYXNoQ29kZSBpcworKiAgbm90IGltcGxlbWVudGVkLiAgSWYgdGhlIHR5cGUgaXMgVVAgb3IgRE9XTiwgdGhlbgorKiAgdGhlIElEIGlzIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCBhcyBpdCdzIGZpeGVkLS10aGVyZSBpcworKiAganVzdCBvbmUgVVAgbm9kZSBhbmQgb25lIERPV04gbmF2aWdhdGlvbiBub2RlLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVOb2RlOihOU0ludGVnZXIpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKy8qKiBUaGUgdHJlZSBwYXJzZXIgbG9va2VkYWhlYWQuICBJZiB0aGUgdHlwZSBpcyBVUCBvciBET1dOLAorKiAgdGhlbiB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisqLworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKworLy8gQSBTIFQgIEUgdiBlIG4gdCBzCisKKy8qKiBBIG5pbCB3YXMgY3JlYXRlZCAoZXZlbiBuaWwgbm9kZXMgaGF2ZSBhIHVuaXF1ZSBJRC4uLgorKiAgdGhleSBhcmUgbm90ICJudWxsIiBwZXIgc2UpLiAgQXMgb2YgNC8yOC8yMDA2LCB0aGlzCisqICBzZWVtcyB0byBiZSB1bmlxdWVseSB0cmlnZ2VyZWQgd2hlbiBzdGFydGluZyBhIG5ldyBzdWJ0cmVlCisqICBzdWNoIGFzIHdoZW4gZW50ZXJpbmcgYSBzdWJydWxlIGluIGF1dG9tYXRpYyBtb2RlIGFuZCB3aGVuCisqICBidWlsZGluZyBhIHRyZWUgaW4gcmV3cml0ZSBtb2RlLgorKi8KKy0gKHZvaWQpIGNyZWF0ZU5pbE5vZGU6KHVuc2lnbmVkKWhhc2g7CisKKy8qKiBBbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gdGV4dCAqLworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCB0ZXh0OihOU1N0cmluZyAqKXRleHQgdHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy8qKiBBbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gYW4gZXhpc3RpbmcgdG9rZW4gKi8KKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggZnJvbVRva2VuQXRJbmRleDooTlNJbnRlZ2VyKXRva2VuSW5kZXg7CisKKy8qKiBNYWtlIGEgbm9kZSB0aGUgbmV3IHJvb3Qgb2YgYW4gZXhpc3Rpbmcgcm9vdC4gIFNlZQorKgorKiAgTm90ZTogdGhlIG5ld1Jvb3RJRCBwYXJhbWV0ZXIgaXMgcG9zc2libHkgZGlmZmVyZW50CisqICB0aGFuIHRoZSBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgbmV3Um9vdCBwYXJhbWV0ZXIuCisqICBJbiBvdXIgY2FzZSwgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisqICBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgYW5kIG5vdCByb290X24gb3Igd2hhdGV2ZXIuCisqCisqICBUaGUgbGlzdGVuZXIgc2hvdWxkIGFzc3VtZSB0aGF0IHRoaXMgZXZlbnQgb2NjdXJzCisqICBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgc3VicnVsZSAob3IgcnVsZSkgc3VidHJlZSBpcworKiAgYmVpbmcgcmVzZXQgdG8gbmV3Um9vdElELgorKgorKi8KKy0gKHZvaWQpIG1ha2VOb2RlOih1bnNpZ25lZCluZXdSb290SGFzaCBwYXJlbnRPZjoodW5zaWduZWQpb2xkUm9vdEhhc2g7CisKKy8qKiBNYWtlIGNoaWxkSUQgYSBjaGlsZCBvZiByb290SUQuCisqICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3IuYWRkQ2hpbGQoKQorKi8KKy0gKHZvaWQpIGFkZENoaWxkOih1bnNpZ25lZCljaGlsZEhhc2ggdG9UcmVlOih1bnNpZ25lZCl0cmVlSGFzaDsKKworLyoqIFNldCB0aGUgdG9rZW4gc3RhcnQvc3RvcCB0b2tlbiBpbmRleCBmb3IgYSBzdWJ0cmVlIHJvb3Qgb3Igbm9kZSAqLworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzRm9yVHJlZToodW5zaWduZWQpbm9kZUhhc2ggRnJvbTooTlNVSW50ZWdlcil0b2tlblN0YXJ0SW5kZXggVG86KE5TVUludGVnZXIpdG9rZW5TdG9wSW5kZXg7CisKKy0gKHZvaWQpIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb247CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRQcm94eS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWdFdmVudFByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTliZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRQcm94eS5oCkBAIC0wLDAgKzEsMTEyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlBhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKyNpbXBvcnQgPHN5cy9zb2NrZXQuaD4KKyNpbXBvcnQgPG5ldGluZXQvaW4uaD4KKyNpbXBvcnQgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKy8vIGRlZmF1bHQgcG9ydCBmb3IgQU5UTFJXb3JrcworI2RlZmluZSBERUZBVUxUX0RFQlVHR0VSX1BPUlQgMHhDMDAxCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z0V2ZW50UHJveHkgOiBOU09iamVjdCA8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IHsKKwlpbnQgc2VydmVyU29ja2V0OworCQorCXN0cnVjdCBzb2NrYWRkciBkZWJ1Z2dlcl9zb2NrYWRkcjsKKwlzb2NrbGVuX3QgZGVidWdnZXJfc29ja2xlbjsKKwlpbnQgZGVidWdnZXJTb2NrZXQ7CisJTlNGaWxlSGFuZGxlICpkZWJ1Z2dlckZIOworCQorCU5TU3RyaW5nICpncmFtbWFyTmFtZTsKKwlpbnQgZGVidWdnZXJQb3J0OworfQorCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEdyYW1tYXJOYW1lOihOU1N0cmluZyAqKWFHcmFtbWFyTmFtZSBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilhUG9ydDsKKy0gKHZvaWQpIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb247CistICh2b2lkKSB3YWl0Rm9yQWNrOworLSAodm9pZCkgc2VuZFRvRGVidWdnZXI6KE5TU3RyaW5nICopbWVzc2FnZTsKKy0gKHZvaWQpIHNlbmRUb0RlYnVnZ2VyOihOU1N0cmluZyAqKW1lc3NhZ2Ugd2FpdEZvclJlc3BvbnNlOihCT09MKXdhaXQ7CisKKy0gKE5TSW50ZWdlcikgc2VydmVyU29ja2V0OworLSAodm9pZCkgc2V0U2VydmVyU29ja2V0OiAoTlNJbnRlZ2VyKSBhU2VydmVyU29ja2V0OworCistIChOU0ludGVnZXIpIGRlYnVnZ2VyU29ja2V0OworLSAodm9pZCkgc2V0RGVidWdnZXJTb2NrZXQ6IChOU0ludGVnZXIpIGFEZWJ1Z2dlclNvY2tldDsKKworLSAoTlNTdHJpbmcgKikgZ3JhbW1hck5hbWU7CistICh2b2lkKSBzZXRHcmFtbWFyTmFtZTogKE5TU3RyaW5nICopIGFHcmFtbWFyTmFtZTsKKworLSAoTlNJbnRlZ2VyKSBkZWJ1Z2dlclBvcnQ7CistICh2b2lkKSBzZXREZWJ1Z2dlclBvcnQ6IChOU0ludGVnZXIpIGFEZWJ1Z2dlclBvcnQ7CisKKy0gKE5TU3RyaW5nICopIGVzY2FwZU5ld2xpbmVzOihOU1N0cmluZyAqKWFTdHJpbmc7CisKKyNwcmFnbWEgbWFyayAtCisKKyNwcmFnbWEgbWFyayBEZWJ1Z0V2ZW50TGlzdGVuZXIgUHJvdG9jb2wKKy0gKHZvaWQpIGVudGVyUnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKy0gKHZvaWQpIGVudGVyQWx0OihOU0ludGVnZXIpYWx0OworLSAodm9pZCkgZXhpdFJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CistICh2b2lkKSBlbnRlclN1YlJ1bGU6KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpIGV4aXRTdWJSdWxlOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBlbnRlckRlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBleGl0RGVjaXNpb246KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpIGNvbnN1bWVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIGNvbnN1bWVIaWRkZW5Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgbWFyazooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIGJlZ2luQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWw7CistICh2b2lkKSBlbmRCYWNrdHJhY2s6KE5TSW50ZWdlcilsZXZlbCB3YXNTdWNjZXNzZnVsOihCT09MKXN1Y2Nlc3NmdWw7CistICh2b2lkKSBsb2NhdGlvbkxpbmU6KE5TSW50ZWdlcilsaW5lIGNvbHVtbjooTlNJbnRlZ2VyKXBvczsKKy0gKHZvaWQpIHJlY29nbml0aW9uRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLSAodm9pZCkgc2VtYW50aWNQcmVkaWNhdGU6KE5TU3RyaW5nICopcHJlZGljYXRlIG1hdGNoZWQ6KEJPT0wpcmVzdWx0OworLSAodm9pZCkgY29tbWVuY2U7CistICh2b2lkKSB0ZXJtaW5hdGU7CisKKworI3ByYWdtYSBtYXJrIFRyZWUgUGFyc2luZworLSAodm9pZCkgY29uc3VtZU5vZGU6KHVuc2lnbmVkKW5vZGVIYXNoIG9mVHlwZTooTlNJbnRlZ2VyKXR5cGUgdGV4dDooTlNTdHJpbmcgKil0ZXh0OworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKworI3ByYWdtYSBtYXJrIEFTVCBFdmVudHMKKworLSAodm9pZCkgY3JlYXRlTmlsTm9kZToodW5zaWduZWQpaGFzaDsKKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggdGV4dDooTlNTdHJpbmcgKil0ZXh0IHR5cGU6KE5TSW50ZWdlcil0eXBlOworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCBmcm9tVG9rZW5BdEluZGV4OihOU0ludGVnZXIpdG9rZW5JbmRleDsKKy0gKHZvaWQpIG1ha2VOb2RlOih1bnNpZ25lZCluZXdSb290SGFzaCBwYXJlbnRPZjoodW5zaWduZWQpb2xkUm9vdEhhc2g7CistICh2b2lkKSBhZGRDaGlsZDoodW5zaWduZWQpY2hpbGRIYXNoIHRvVHJlZToodW5zaWduZWQpdHJlZUhhc2g7CistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXNGb3JUcmVlOih1bnNpZ25lZClub2RlSGFzaCBGcm9tOihOU0ludGVnZXIpdG9rZW5TdGFydEluZGV4IFRvOihOU0ludGVnZXIpdG9rZW5TdG9wSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyM2ZmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1BhcnNlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z1BhcnNlciA6IEFOVExSUGFyc2VyIHsKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbTsKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSAgZGVidWdnZXJQb3J0OihOU0ludGVnZXIpcG9ydE51bWJlcjsKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pdGhlRGVidWdMaXN0ZW5lcgorCQkJICBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWdUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWdUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzNWIwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVG9rZW5TdHJlYW0gOiBOU09iamVjdCA8QU5UTFJUb2tlblN0cmVhbT4KK3sKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiBpbnB1dDsKKwlCT09MIGluaXRpYWxTdHJlYW1TdGF0ZTsKKyAgICBOU0ludGVnZXIgbGFzdE1hcmtlcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pZGVidWdnZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgZ2V0SW5wdXQ7CistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVRva2VuU3RyZWFtOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihOU0ludGVnZXIpaW5kZXg7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBnZXRUb2tlblNvdXJjZTsKKy0gKE5TU3RyaW5nICopIGdldFNvdXJjZU5hbWU7CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUb1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTk2NWZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRGVidWdUcmVlQWRhcHRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVHJlZUFkYXB0b3IgOiBBTlRMUkJhc2VUcmVlQWRhcHRvciB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6IChpZDxBTlRMUlRyZWVBZGFwdG9yPikgYVRyZWVBZGFwdG9yOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBmOTkzOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDY3IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbSA6IE5TT2JqZWN0IDxBTlRMUlRyZWVOb2RlU3RyZWFtPiB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7CisJQk9PTCBpbml0aWFsU3RyZWFtU3RhdGU7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWRlYnVnZ2VyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGdldElucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgYVRyZWVOb2RlU3RyZWFtOworCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjogKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhVHJlZUFkYXB0b3I7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVOb2RlU3RyZWFtIGNvbmZvcm1hbmNlCisKKy0gKGlkKSBMVDooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpZmxhZzsKKworI3ByYWdtYSBtYXJrIEFOVExSSW50U3RyZWFtIGNvbmZvcm1hbmNlCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNVSW50ZWdlcikgaTsKKy0gKE5TVUludGVnZXIpIG1hcms7CistIChOU1VJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKHZvaWQpIHJld2luZDooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVsZWFzZTooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNVSW50ZWdlcikgaW5kZXg7CistIChOU1VJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkRlYnVnVHJlZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiZWFjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWVQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudFByb3h5LmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVHJlZVBhcnNlciA6IEFOVExSVHJlZVBhcnNlciB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW07CistIChpZCkgaW5pdFdpdGhUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlU3RyZWFtCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXI7CisJLy8gZGVzaWduYXRlZCBpbml0aWFsaXplcgorLSAoaWQpIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZVN0cmVhbQorCQkJCWRlYnVnTGlzdGVuZXI6KGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPil0aGVEZWJ1Z0xpc3RlbmVyCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE4OWJiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKK30KKworKyAoQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0U3RyZWFtIGRlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpIGFEZWNpc2lvbk51bWJlcjsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW0gZGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcikgYURlY2lzaW9uTnVtYmVyOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJFcnJvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjY1N2FmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRXJyb3IuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSRXJyb3IuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMzAvMDMvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisjZGVmaW5lIEFOVExSRXJyb3JEb21haW4gQCJBTlRMUkVycm9yIgorCisjZGVmaW5lIEFOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEAiQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iCisjZGVmaW5lIEFOVExSSWxsZWdhbFN0YXRlRXhjZXB0aW9uIEAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIgorLy8jZGVmaW5lIEFOVExSUnVudGltZUV4Y2VwdGlvbiBAIlJ1bnRpbWVFeGNlcHRpb24iCisvLyNkZWZpbmUgQU5UTFJOb1N1Y2hNZXRob2RFeGNlcHRpb24gQCJOb1N1Y2hNZXRob2RFeGNlcHRpb24iCisvLyNkZWZpbmUgQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIEAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIKKy8vI2RlZmluZSBBTlRMUlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIEAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iCisKKworLyp0eXBlZGVmIGVudW0KK3sKKwlBTlRMUklsbGVnYWxTdGF0ZSA9IDEsCisJQU5UTFJJbGxlZ2FsQXJndW1lbnQgPSAyLAorCUFOVExSUmVjb2duaXRpb25FcnJvciA9IDMsCisJQU5UTFJNaXNzaW5nVG9rZW5FcnJvciA9IDQsCisJQU5UTFJVbndhbnRlZFRva2VuRXJyb3IgPSA1LAorCUFOVExSTWlzbWF0ZWNoZWRUb2tlbkVycm9yID0gNiwKKwlBTlRMUk5vVmlhYmxlQWx0RXJyb3IgPSA3CisJCit9IEFOVExSRXJyb3JDb2RlOyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Nzg4Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKKworQGludGVyZmFjZSBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24KK3sKKwlOU1N0cmluZyAqcHJlZGljYXRlOworCU5TU3RyaW5nICpydWxlTmFtZTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQcmVkaWNhdGUsIHNldHRlcj1zZXRQcmVkaWNhdGU6KSBOU1N0cmluZyAqcHJlZGljYXRlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTmFtZSwgc2V0dGVyPXNldFJ1bGVOYW1lOikgTlNTdHJpbmcgKnJ1bGVOYW1lOworCisrIChBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoUnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWUgcHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CistIChBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiAqKSBpbml0V2l0aFJ1bGVOYW1lOihOU1N0cmluZyAqKXRoZVJ1bGVOYW1lIHByZWRpY2F0ZTooTlNTdHJpbmcgKil0aGVQcmVkaWNhdGUgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworCisjaWZkZWYgRE9OVFVTRVlFVAorLSAoTlNTdHJpbmcgKikgZ2V0UHJlZGljYXRlOworLSAodm9pZCkgc2V0UHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZTsKKy0gKE5TU3RyaW5nICopIGdldFJ1bGVOYW1lOworLSAodm9pZCkgc2V0UnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWU7CisjZW5kaWYKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRmFzdFF1ZXVlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJGYXN0UXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjgxODE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSRmFzdFF1ZXVlLmgKQEAgLTAsMCArMSw2OCBAQAorLy8KKy8vICBBTlRMUkZhc3RRdWV1ZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAyNi8wNC8yMDEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworCitAaW50ZXJmYWNlIEFOVExSRmFzdFF1ZXVlIDogTlNPYmplY3QgPE5TQ29weWluZz4KK3sKKwlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbDsKKwlOU011dGFibGVBcnJheSAqZGF0YTsKKwlOU0ludGVnZXIgcDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQb29sLCBzZXR0ZXI9c2V0UG9vbCkgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldERhdGEsIHNldHRlcj1zZXREYXRhKSBOU011dGFibGVBcnJheSAqZGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0UCwgc2V0dGVyPXNldFApIE5TSW50ZWdlciBwOworCisrIChpZCkgbmV3QU5UTFJGYXN0UXVldWU7CisKKy0gKGlkKSBpbml0OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAodm9pZCkgcmVzZXQ7CistIChpZCkgcmVtb3ZlOworLSAodm9pZCkgYWRkT2JqZWN0OihpZCkgbzsKKy0gKE5TSW50ZWdlcikgY291bnQ7CistIChOU0ludGVnZXIpIHNpemU7CistIChpZCkgaGVhZDsKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpIGk7CistICh2b2lkKSBjbGVhcjsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNBdXRvcmVsZWFzZVBvb2wgKilnZXRQb29sOworLSAodm9pZClzZXRQb29sOihOU0F1dG9yZWxlYXNlUG9vbCAqKWFQb29sOworLSAoTlNNdXRhYmxlQXJyYXkgKilnZXREYXRhOworLSAodm9pZClzZXREYXRhOihOU011dGFibGVBcnJheSAqKW15RGF0YTsKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6KE5TSW50ZWdlcilhbkludDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSSGFzaE1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSSGFzaE1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWNhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJIYXNoTWFwLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vCisvLyAgQU5UTFJIYXNoTWFwLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKyNkZWZpbmUgTE9DQUxfU0NPUEUgICAgICAgIDEKKyNkZWZpbmUgSEFTSFNJWkUgICAgICAgICAxMDEKKyNkZWZpbmUgSEJVRlNJWkUgICAgICAweDIwMDAKKworQGludGVyZmFjZSBBTlRMUkhhc2hNYXAgOiBBTlRMUkxpbmtCYXNlIHsKKwkvLwlBTlRMUkhhc2hNYXAgKmZOZXh0OworICAgIC8vICAgIFRTdHJpbmdQb29sICpmUG9vbDsKKyAgICBOU0ludGVnZXIgU2NvcGU7CisgICAgTlNJbnRlZ2VyIExhc3RIYXNoOworICAgIE5TSW50ZWdlciBCdWZmU2l6ZTsKKyAgICBBTlRMUk1hcEVsZW1lbnQgKnB0ckJ1ZmZlcltIQVNIU0laRV07CisgICAgTlNJbnRlZ2VyIG1vZGU7Cit9CisKKy8vQHByb3BlcnR5IChjb3B5KSBBTlRMUkhhc2hNYXAgKmZOZXh0OworLy9AcHJvcGVydHkgKGNvcHkpIFRTdHJpbmdQb29sICpmUG9vbDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFNjb3BlLCBzZXR0ZXI9c2V0U2NvcGU6KSBOU0ludGVnZXIgU2NvcGU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoOikgTlNJbnRlZ2VyIExhc3RIYXNoOworCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyAoaWQpbmV3QU5UTFJIYXNoTWFwOworKyAoaWQpbmV3QU5UTFJIYXNoTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKy0gKEFOVExSSGFzaE1hcCAqKVB1c2hTY29wZTooIEFOVExSSGFzaE1hcCAqKiltYXA7CistIChBTlRMUkhhc2hNYXAgKilQb3BTY29wZTooIEFOVExSSGFzaE1hcCAqKiltYXA7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCisvKiAgICBmb3JtIGhhc2ggdmFsdWUgZm9yIHN0cmluZyBzICovCistIChOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKEFOVExSSGFzaE1hcCAqKWZpbmRzY29wZTooaW50KWxldmVsOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzIFNjb3BlOihpbnQpc2NvcGU7CisvKiAgIGxvb2sgZm9yIHMgaW4gcHRyQnVmZmVyICAqLworLSAoaWQpaW5zdGFsbDooQU5UTFJNYXBFbGVtZW50ICopc3ltIFNjb3BlOihpbnQpc2NvcGU7CisvKiAgIGxvb2sgZm9yIHMgaW4gcHRyQnVmZmVyICAqLworLSAodm9pZClkZWxldGVBTlRMUkhhc2hNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoaW50KVJlbW92ZVN5bTooTlNTdHJpbmcgKilzOworLSAodm9pZClkZWxldGVfY2hhaW46KEFOVExSTWFwRWxlbWVudCAqKW5wOworI2lmZGVmIERPTlRVU0VZRVQKKy0gKGludClibGRfc3ltdGFiOihLV19UQUJMRSAqKXRva25hbXM7CisjZW5kaWYKKy0gKEFOVExSTWFwRWxlbWVudCAqKilnZXRwdHJCdWZmZXI7CistIChBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooaW50KWlkeDsKKy0gKHZvaWQpc2V0cHRyQnVmZmVyOihBTlRMUk1hcEVsZW1lbnQgKilucCBJbmRleDooaW50KWlkeDsKKy0gKE5TSW50ZWdlcilnZXRTY29wZTsKKy0gKHZvaWQpc2V0U2NvcGU6KE5TSW50ZWdlcilpOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNJbnRlZ2VyKWdldE1vZGU7CistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZTsKKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZCkgc2V0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZClhZGRPYmplY3Q6KGlkKWFuT2JqZWN0OworLSAoQU5UTFJNYXBFbGVtZW50ICopIGdldE5hbWU6KE5TU3RyaW5nICopYU5hbWU7CistICh2b2lkKSBwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGU7CisKKy0gKE5TRW51bWVyYXRvciAqKW9iamVjdEVudW1lcmF0b3I7CistIChCT09MKSBoYXNOZXh0OworLSAoQU5UTFJNYXBFbGVtZW50ICopbmV4dE9iamVjdDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkhhc2hNYXAubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkhhc2hNYXAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjM0MjZiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSSGFzaE1hcC5tCkBAIC0wLDAgKzEsNTIxIEBACisvLworLy8gIEFOVExSSGFzaE1hcC5tCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisKK3N0YXRpYyBOU0ludGVnZXIgaXRJbmRleDsKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaE1hcAorICovCitAaW1wbGVtZW50YXRpb24gQU5UTFJIYXNoTWFwCisKK0BzeW50aGVzaXplIFNjb3BlOworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwCit7CisgICAgQU5UTFJIYXNoTWFwICphTmV3QU5UTFJIYXNoTWFwOworICAgIAorICAgIGFOZXdBTlRMUkhhc2hNYXAgPSBbW0FOVExSSGFzaE1hcCBhbGxvY10gaW5pdF07CisJcmV0dXJuKCBhTmV3QU5UTFJIYXNoTWFwICk7Cit9CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZQoreworICAgIEFOVExSSGFzaE1hcCAqYU5ld0FOVExSSGFzaE1hcDsKKyAgICAKKyAgICBhTmV3QU5UTFJIYXNoTWFwID0gW1tBTlRMUkhhc2hNYXAgYWxsb2NdIGluaXRXaXRoTGVuOmFCdWZmU2l6ZV07CisJcmV0dXJuKCBhTmV3QU5UTFJIYXNoTWFwICk7Cit9CisKKy0oaWQpaW5pdAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJZk5leHQgPSBuaWw7CisgICAgICAgIEJ1ZmZTaXplID0gSEFTSFNJWkU7CisJCVNjb3BlID0gMDsKKwkJaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisJCQlTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworCQkJZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisJCQkJcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisJCQl9CisJCX0KKyAgICAgICAgbW9kZSA9IDA7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKyAgICAgICAgQnVmZlNpemUgPSBhQnVmZlNpemU7CisJCVNjb3BlID0gMDsKKwkJaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisJCQlTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworCQkJZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisJCQkJcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisJCQl9CisJCX0KKyAgICAgICAgbW9kZSA9IDA7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKHZvaWQpZGVhbGxvYworeworICAgIEFOVExSTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworCQorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCAmJiB0bXAgIT0gWygoQU5UTFJIYXNoTWFwICopZk5leHQpIGdldHB0ckJ1ZmZlckVudHJ5OmlkeF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICAvLyB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJNYXBFbGVtZW50ICopdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNJbnRlZ2VyKWNvdW50Cit7CisgICAgaWQgYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhQ250ID0gMDsKKyAgICAKKyAgICBmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgc2l6ZQoreworICAgIGlkIGFuRWxlbWVudDsKKyAgICBOU0ludGVnZXIgYVNpemUgPSAwOworICAgIAorICAgIGZvciAoTlNJbnRlZ2VyIGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0odm9pZClkZWxldGVBTlRMUkhhc2hNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXAsICpydG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICYmIHRtcCAhPSAoQU5UTFJMaW5rQmFzZSAqKVsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBnZXRwdHJCdWZmZXJFbnRyeTppZHhdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gW3RtcCBnZXRmTmV4dF07CisgICAgICAgICAgICAgICAgW3J0bXAgZGVhbGxvY107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy0oQU5UTFJIYXNoTWFwICopUHVzaFNjb3BlOihBTlRMUkhhc2hNYXAgKiopbWFwCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICBBTlRMUkhhc2hNYXAgKmh0bXA7CisgICAgCisgICAgaHRtcCA9IFtBTlRMUkhhc2hNYXAgbmV3QU5UTFJIYXNoTWFwXTsKKyAgICBpZiAoICptYXAgIT0gbmlsICkgeworICAgICAgICAoKEFOVExSSGFzaE1hcCAqKWh0bXApLT5mTmV4dCA9ICptYXA7CisgICAgICAgIFtodG1wIHNldFNjb3BlOlsoKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0KSBnZXRTY29wZV0rMV07CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gICAgZ1Njb3BlTGV2ZWwrKzsKKyAgICAqbWFwID0gaHRtcDsKKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworLShBTlRMUkhhc2hNYXAgKilQb3BTY29wZTooQU5UTFJIYXNoTWFwICoqKW1hcAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXA7CisJQU5UTFJIYXNoTWFwICpodG1wOworICAgIAorICAgIGh0bXAgPSAqbWFwOworICAgIGlmICggKCptYXApLT5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgaWYgKCBodG1wLT5wdHJCdWZmZXJbaWR4XSA9PSBuaWwgfHwKKyAgICAgICAgICAgICAgICBodG1wLT5wdHJCdWZmZXJbaWR4XSA9PSAoKm1hcCktPnB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wID0gaHRtcC0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbXVzdCBkZWFsIHdpdGggcGFybXMsIGxvY2FscyBhbmQgbGFiZWxzIGF0IHNvbWUgcG9pbnQKKyAgICAgICAgICAgICAqIGNhbiBub3QgZm9yZ2V0IHRoZSBkZWJ1Z2dlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgIFsgdG1wIGRlYWxsb2NdOworICAgICAgICB9CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIC8vICAgICAgICBnU2NvcGVMZXZlbC0tOworICAgIH0KKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSEFTSCAgICAgICAgaGFzaCBlbnRyeSB0byBnZXQgaW5kZXggdG8gdGFibGUKKyAqICBOU0ludGVnZXIgaGFzaCggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgKnMgICAgICAgICAgICAgc3RyaW5nIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogTlNJbnRlZ2VyICAgICAgICAgICAgICAgICBoYXNoZWQgdmFsdWUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzICAgICAgIC8qICAgIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KK3sKKwlOU0ludGVnZXIgaGFzaHZhbDsKKwljb25zdCBjaGFyICp0bXA7CisgICAgCisJdG1wID0gW3MgY1N0cmluZ1VzaW5nRW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKwlmb3IoIGhhc2h2YWwgPSAwOyAqdG1wICE9ICdcMCc7ICkKKyAgICAgICAgaGFzaHZhbCArPSAqdG1wKys7CisJc2VsZi0+TGFzdEhhc2ggPSBoYXNodmFsICUgQnVmZlNpemU7CisJcmV0dXJuKCBzZWxmLT5MYXN0SGFzaCApOworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBGSU5EU0NPUEUgIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBBTlRMUkhhc2hNYXAgKmZpbmRzY29wZSggQU5UTFJIYXNoTWFwICpzZWxmLCBOU0ludGVnZXIgc2NvcGUgKTsKKyAqCisgKiAgICAgSW5wdXRzOiAgTlNJbnRlZ2VyICAgICAgIHNjb3BlIC0tIHNjb3BlIGxldmVsIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogQU5UTFJIYXNoTWFwICAgcG9pbnRlciB0byBwdHJCdWZmZXIgb2YgcHJvcGVyIHNjb3BlIGxldmVsCisgKgorICogIExhc3QgUmV2aXNpb24gOS8wMy85MAorICovCisjZW5kaWYKKy0oQU5UTFJIYXNoTWFwICopZmluZHNjb3BlOihOU0ludGVnZXIpc2NvcGUKK3sKKyAgICBpZiAoIHNlbGYtPlNjb3BlID09IHNjb3BlICkgeworICAgICAgICByZXR1cm4oIHNlbGYgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZOZXh0ICkgeworICAgICAgICByZXR1cm4oIFsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBmaW5kc2NvcGU6c2NvcGVdICk7CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIExPT0tVUCAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIEFOVExSTWFwRWxlbWVudCAqbG9va3VwKCBBTlRMUkhhc2hNYXAgKnNlbGYsIGNoYXIgKnMsIE5TSW50ZWdlciBzY29wZSApOworICoKKyAqICAgICBJbnB1dHM6ICBjaGFyICAgICAqcyAgICAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBBTlRMUk1hcEVsZW1lbnQgICogICAgICAgICAgIHBvaW50ZXIgdG8gZW50cnkKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShpZClsb29rdXA6KE5TU3RyaW5nICopcyBTY29wZTooTlNJbnRlZ2VyKXNjb3BlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIG5wID0gc2VsZi0+cHRyQnVmZmVyW1tzZWxmIGhhc2g6c11dOyBucCAhPSBuaWw7IG5wID0gW25wIGdldGZOZXh0XSApIHsKKyAgICAgICAgaWYgKCBbcyBpc0VxdWFsVG9TdHJpbmc6W25wIGdldE5hbWVdXSApIHsKKyAgICAgICAgICAgIHJldHVybiggbnAgKTsgICAgICAgIC8qICAgZm91bmQgaXQgICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBJTlNUQUxMIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBOU0ludGVnZXIgaW5zdGFsbCggQU5UTFJIYXNoTWFwICpzZWxmLCBBTlRMUk1hcEVsZW1lbnQgKnN5bSwgTlNJbnRlZ2VyIHNjb3BlICk7CisgKgorICogICAgIElucHV0czogIEFOVExSTWFwRWxlbWVudCAgICAqc3ltICAgLS0gc3ltYm9sIHB0ciB0byBpbnN0YWxsCisgKiAgICAgICAgICAgICAgTlNJbnRlZ2VyICAgICAgICAgc2NvcGUgLS0gbGV2ZWwgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBCb29sZWFuICAgICBUUlVFICAgaWYgaW5zdGFsbGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgIGlmIGFscmVhZHkgaW4gdGFibGUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShBTlRMUk1hcEVsZW1lbnQgKilpbnN0YWxsOihBTlRMUk1hcEVsZW1lbnQgKilzeW0gU2NvcGU6KE5TSW50ZWdlcilzY29wZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgCisgICAgbnAgPSBbc2VsZiBsb29rdXA6W3N5bSBnZXROYW1lXSBTY29wZTpzY29wZSBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBbc3ltIHJldGFpbl07CisgICAgICAgIFtzeW0gc2V0Rk5leHQ6c2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdXTsKKyAgICAgICAgc2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdID0gc3ltOworICAgICAgICByZXR1cm4oIHNlbGYtPnB0ckJ1ZmZlclsgc2VsZi0+TGFzdEhhc2ggXSApOworICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgUmVtb3ZlU3ltICBzZWFyY2ggaGFzaGVkIGxpc3QgZm9yIGVudHJ5CisgKiAgTlNJbnRlZ2VyIFJlbW92ZVN5bSggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgICAgICpzICAgICAgICAgIHN0cmluZyB0byBmaW5kCisgKgorICogICAgIFJldHVybnM6IE5TSW50ZWdlciAgICAgIGluZGljYXRvciBvZiBTVUNDRVNTIE9SIEZBSUxVUkUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpUmVtb3ZlU3ltOihOU1N0cmluZyAqKXMKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wLCAqdG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWR4ID0gW3NlbGYgaGFzaDpzXTsKKyAgICBmb3IgKCB0bXAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XSwgbnAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICB0bXAgPSBbbnAgZ2V0Zk5leHRdOyAgICAgICAgICAgICAvKiBnZXQgdGhlIG5leHQgbGluayAgKi8KKyAgICAgICAgICAgIFtucCBkZWFsbG9jXTsKKyAgICAgICAgICAgIHJldHVybiggU1VDQ0VTUyApOyAgICAgICAgICAgIC8qIHJlcG9ydCBTVUNDRVNTICAgICAqLworICAgICAgICB9CisgICAgICAgIHRtcCA9IFtucCBnZXRmTmV4dF07ICAgICAgICAgICAgICAvLyAgQkFEISEhISEhCisgICAgfQorICAgIHJldHVybiggRkFJTFVSRSApOyAgICAgICAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk1hcEVsZW1lbnQgKilucAoreworICAgIGlmICggW25wIGdldGZOZXh0XSAhPSBuaWwgKQorCQlbc2VsZiBkZWxldGVfY2hhaW46W25wIGdldGZOZXh0XV07CisJW25wIGRlYWxsb2NdOworfQorCisjaWZkZWYgRE9OVFVTRVlFVAorLShOU0ludGVnZXIpYmxkX3N5bXRhYjooS1dfVEFCTEUgKil0b2tuYW1zCit7CisgICAgTlNJbnRlZ2VyIGk7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyAqKHRva25hbXNbaV0ubmFtZSkgIT0gJ1wwJzsgaSsrICkgeworICAgICAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICAgICAgbnAgPSBbQU5UTFJNYXBFbGVtZW50IG5ld0FOVExSTWFwRWxlbWVudDpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiwgdG9rbmFtc1tpXS5uYW1lXV07CisgICAgICAgIC8vICAgICAgICBucC0+ZlR5cGUgPSB0b2tuYW1zW2ldLnRva251bTsKKyAgICAgICAgW3NlbGYgaW5zdGFsbDpucCBTY29wZTowXTsKKyAgICB9CisgICAgcmV0dXJuKCBTVUNDRVNTICk7Cit9CisjZW5kaWYKKworLShBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggcHRyQnVmZmVyW2lkeF0gKTsKK30KKworLShBTlRMUk1hcEVsZW1lbnQgKiopZ2V0cHRyQnVmZmVyCit7CisJcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldHB0ckJ1ZmZlcjooQU5UTFJNYXBFbGVtZW50ICopbnAgSW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKwlpZiAoIGlkeCA8IEJ1ZmZTaXplICkgeworICAgICAgICBbbnAgcmV0YWluXTsKKwkJcHRyQnVmZmVyW2lkeF0gPSBucDsKKyAgICB9Cit9CisKKy0oTlNJbnRlZ2VyKWdldFNjb3BlCit7CisJcmV0dXJuKCBTY29wZSApOworfQorCistKHZvaWQpc2V0U2NvcGVTY29wZTooTlNJbnRlZ2VyKWkKK3sKKwlTY29wZSA9IGk7Cit9CisKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldFRUeXBlOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07Cit9CisKKy8qCisgKiB3b3JrcyBvbmx5IGZvciBtYXBsaXN0IGluZGV4ZWQgbm90IGJ5IG5hbWUgYnV0IGJ5IFRva2VuTnVtYmVyCisgKi8KKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgTlNJbnRlZ2VyIGFUVHlwZTsKKworICAgIGFUVHlwZSA9IHR0eXBlICUgQnVmZlNpemU7CisgICAgZm9yKCBucCA9IHNlbGYtPnB0ckJ1ZmZlclt0dHlwZV07IG5wICE9IG5pbDsgbnAgPSBbbnAgZ2V0Zk5leHRdICkgeworICAgICAgICBpZiAoIFtucC5pbmRleCBpbnRlZ2VyVmFsdWVdID09IHR0eXBlICkgeworICAgICAgICAgICAgcmV0dXJuKCBucCApOyAgICAgICAgLyogICBmb3VuZCBpdCAgICAgICAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKy0gKEFOVExSTGlua0Jhc2UgKilnZXROYW1lOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07IC8qICBuaWwgaWYgbm90IGZvdW5kICAgICAgKi8gICAgCit9CisKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6W05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6bmFtZV0gVHlwZTp0dHlwZV07CisgICAgLy8gICAgICAgIG5wLT5mVHlwZSA9IHRva25hbXNbaV0udG9rbnVtOworICAgIFtzZWxmIGluc3RhbGw6bnAgU2NvcGU6MF07Cit9CisKKy0gKE5TSW50ZWdlcilnZXRNb2RlCit7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlCit7CisgICAgbW9kZSA9IGFNb2RlOworfQorCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKWFSdWxlCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKworICAgIGlkeCA9IFtzZWxmIGNvdW50XTsKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCisvKiB0aGlzIG1heSBoYXZlIHRvIGhhbmRsZSBsaW5raW5nIGludG8gdGhlIGNoYWluCisgKi8KKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmICggaWR4ID49IEJ1ZmZTaXplICkgeworICAgICAgICBpZHggJT0gQnVmZlNpemU7CisgICAgfQorICAgIGlmIChhUnVsZSAhPSBwdHJCdWZmZXJbaWR4XSkgeworICAgICAgICBpZiAocHRyQnVmZmVyW2lkeF0gIT0gbmlsKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChpZClvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIGlkeCAlPSBCdWZmU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHB0ckJ1ZmZlcltpZHhdOworfQorCisvKiB0aGlzIHdpbGwgbmV2ZXIgbGluayBpbnRvIHRoZSBjaGFpbgorICovCistICh2b2lkKSBzZXRPYmplY3Q6KGlkKWFSdWxlIGF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBpZiAoYVJ1bGUgIT0gcHRyQnVmZmVyW2lkeF0pIHsKKyAgICAgICAgaWYgKHB0ckJ1ZmZlcltpZHhdICE9IG5pbCkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBbYVJ1bGUgcmV0YWluXTsKKyAgICB9CisgICAgcHRyQnVmZmVyW2lkeF0gPSBhUnVsZTsKK30KKworLSAodm9pZClwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIAorICAgIG5wID0gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MCBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6bmFtZSBOb2RlOmFOb2RlXTsKKyAgICAgICAgaWYgKHB0ckJ1ZmZlcltMYXN0SGFzaF0gIT0gbmlsKQorICAgICAgICAgICAgW3B0ckJ1ZmZlcltMYXN0SGFzaF0gcmVsZWFzZV07CisgICAgICAgIFtucCByZXRhaW5dOworICAgICAgICBucC5mTmV4dCA9IHB0ckJ1ZmZlclsgTGFzdEhhc2ggXTsKKyAgICAgICAgcHRyQnVmZmVyWyBMYXN0SGFzaCBdID0gbnA7CisgICAgfQorICAgIHJldHVybjsgICAgCit9CisKKy0gKE5TRW51bWVyYXRvciAqKW9iamVjdEVudW1lcmF0b3IKK3sKKyAgICBOU0VudW1lcmF0b3IgKmFuRW51bWVyYXRvcjsKKworICAgIGl0SW5kZXggPSAwOworICAgIHJldHVybiBhbkVudW1lcmF0b3I7Cit9CisKKy0gKEJPT0wpaGFzTmV4dAoreworICAgIGlmIChzZWxmICYmIFtzZWxmIGNvdW50XSA8IEJ1ZmZTaXplLTEpIHsKKyAgICAgICAgcmV0dXJuIFlFUzsKKyAgICB9CisgICAgcmV0dXJuIE5POworfQorCistIChBTlRMUk1hcEVsZW1lbnQgKiluZXh0T2JqZWN0Cit7CisgICAgaWYgKHNlbGYgJiYgaXRJbmRleCA8IEJ1ZmZTaXplLTEpIHsKKyAgICAgICAgcmV0dXJuIHB0ckJ1ZmZlcltpdEluZGV4XTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSSGFzaFJ1bGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkhhc2hSdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NThlOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkhhc2hSdWxlLmgKQEAgLTAsMCArMSw3MiBAQAorLy8KKy8vICBBTlRMUkhhc2hSdWxlLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdWxlTWVtby5oIgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSSGFzaFJ1bGUgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy8JQU5UTFJIYXNoUnVsZSAqZk5leHQ7CisgICAgLy8gICAgVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKKyAgICBOU0ludGVnZXIgbW9kZTsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSSGFzaFJ1bGUgKmZOZXh0OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdEhhc2gsIHNldHRlcj1zZXRMYXN0SGFzaDopIE5TSW50ZWdlciBMYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKGlkKW5ld0FOVExSSGFzaFJ1bGU7CisrIChpZCluZXdBTlRMUkhhc2hSdWxlV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistICh2b2lkKWRlbGV0ZUFOVExSSGFzaFJ1bGU6KEFOVExSUnVsZU1lbW8gKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnA7CistIChBTlRMUlJ1bGVNZW1vICoqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihBTlRMUlJ1bGVNZW1vICoqKW5wOworLSAoTlNOdW1iZXIgKilnZXRSdWxlTWVtb1N0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAodm9pZClwdXRSdWxlTWVtb0F0U3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXg7CistIChOU0ludGVnZXIpZ2V0TW9kZTsKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlOworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKUluZGV4OworLSAoQU5UTFJSdWxlTWVtbyAqKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkhhc2hSdWxlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJIYXNoUnVsZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2UzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJIYXNoUnVsZS5tCkBAIC0wLDAgKzEsMjgxIEBACisvLworLy8gIEFOVExSSGFzaFJ1bGUubQorLy8gIEFOVExSCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9VTktOT1dOIC0xCisKKyNpbXBvcnQgIkFOVExSSGFzaFJ1bGUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaFJ1bGUKKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSSGFzaFJ1bGUKKworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoUnVsZQoreworICAgIEFOVExSSGFzaFJ1bGUgKmFOZXdBTlRMUkhhc2hSdWxlOworICAgIAorICAgIGFOZXdBTlRMUkhhc2hSdWxlID0gW1tBTlRMUkhhc2hSdWxlIGFsbG9jXSBpbml0XTsKKwlyZXR1cm4oIGFOZXdBTlRMUkhhc2hSdWxlICk7Cit9CisKKysoaWQpbmV3QU5UTFJIYXNoUnVsZVdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphTmV3QU5UTFJIYXNoUnVsZTsKKyAgICAKKyAgICBhTmV3QU5UTFJIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBhbGxvY10gaW5pdFdpdGhMZW46YUJ1ZmZTaXplXTsKKwlyZXR1cm4oIGFOZXdBTlRMUkhhc2hSdWxlICk7Cit9CisKKy0oaWQpaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpIQVNIU0laRV0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0oaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46YUJ1ZmZTaXplXSkgIT0gbmlsKSB7CisJCWZOZXh0ID0gbmlsOworICAgICAgICBtb2RlID0gMDsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisgICAgQU5UTFJSdWxlTWVtbyAqdG1wLCAqcnRtcDsKKyAgICBpbnQgSW5kZXg7CisJCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBJbmRleCA9IDA7IEluZGV4IDwgQnVmZlNpemU7IEluZGV4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgJiYgdG1wICE9IHB0ckJ1ZmZlcltJbmRleF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICAvLyB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJSdWxlTWVtbyAqKXRtcC5mTmV4dDsKKyAgICAgICAgICAgICAgICBbcnRtcCBkZWFsbG9jXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TSW50ZWdlciljb3VudAoreworICAgIGlkIGFuRWxlbWVudDsKKyAgICBOU0ludGVnZXIgYUNudCA9IDA7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrKSB7CisgICAgICAgIGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXTsKKyAgICAgICAgaWYgKCBhbkVsZW1lbnQgIT0gbmlsICkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgbGVuZ3RoCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistIChOU0ludGVnZXIpIHNpemUKK3sKKyAgICBpZCBhbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFTaXplID0gMDsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkgeworICAgICAgICAgICAgYVNpemUgKz0gc2l6ZW9mKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYVNpemU7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistKHZvaWQpZGVsZXRlQU5UTFJIYXNoUnVsZTooQU5UTFJSdWxlTWVtbyAqKW5wCit7CisgICAgQU5UTFJSdWxlTWVtbyAqdG1wLCAqcnRtcDsKKyAgICBpbnQgSW5kZXg7CisgICAgCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBJbmRleCA9IDA7IEluZGV4IDwgQnVmZlNpemU7IEluZGV4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgJiYgdG1wICE9IHB0ckJ1ZmZlcltJbmRleCBdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnAKK3sKKyAgICBpZiAoIG5wLmZOZXh0ICE9IG5pbCApCisJCVtzZWxmIGRlbGV0ZV9jaGFpbjpucC5mTmV4dF07CisJW25wIGRlYWxsb2NdOworfQorCistKEFOVExSUnVsZU1lbW8gKiopZ2V0UHRyQnVmZmVyCit7CisJcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldFB0ckJ1ZmZlcjooQU5UTFJSdWxlTWVtbyAqKilucAoreworCXB0ckJ1ZmZlciA9IG5wOworfQorCistIChOU051bWJlciAqKWdldFJ1bGVNZW1vU3RvcEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphUnVsZTsKKyAgICBOU051bWJlciAqc3RvcEluZGV4OworICAgIE5TSW50ZWdlciBhbkluZGV4OworICAgIAorICAgIGFuSW5kZXggPSAoIGFTdGFydEluZGV4ID49IEJ1ZmZTaXplICkgPyBhU3RhcnRJbmRleCAlPSBCdWZmU2l6ZSA6IGFTdGFydEluZGV4OworICAgIGlmICgoYVJ1bGUgPSBwdHJCdWZmZXJbYW5JbmRleF0pID09IG5pbCkgeworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBzdG9wSW5kZXggPSBbYVJ1bGUgZ2V0U3RvcEluZGV4OmFTdGFydEluZGV4XTsKKyAgICByZXR1cm4gc3RvcEluZGV4OworfQorCistICh2b2lkKXB1dFJ1bGVNZW1vOihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgQXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBOU0ludGVnZXIgYW5JbmRleDsKKyAgICAKKyAgICBhbkluZGV4ID0gKGFTdGFydEluZGV4ID49IEJ1ZmZTaXplKSA/IGFTdGFydEluZGV4ICU9IEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKCBwdHJCdWZmZXJbYW5JbmRleF0gPT0gbmlsICkgeworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoIFthUnVsZS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV0gPT0gYVN0YXJ0SW5kZXggKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHNldFN0YXJ0SW5kZXg6YVJ1bGUuc3RvcEluZGV4XTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZSA9IGFSdWxlLmZOZXh0OworICAgICAgICB9IHdoaWxlICggYVJ1bGUgIT0gbmlsICk7CisgICAgfQorfQorCistICh2b2lkKXB1dFJ1bGVNZW1vQXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXggU3RvcEluZGV4OihOU0ludGVnZXIpYVN0b3BJbmRleAoreworICAgIEFOVExSUnVsZU1lbW8gKmFSdWxlLCAqbmV3UnVsZTsKKyAgICBOU0ludGVnZXIgYW5JbmRleDsKKyAgICBOU0ludGVnZXIgYU1hdGNoSW5kZXg7CisKKyAgICBhbkluZGV4ID0gKGFTdGFydEluZGV4ID49IEJ1ZmZTaXplKSA/IGFTdGFydEluZGV4ICU9IEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKChhUnVsZSA9IHB0ckJ1ZmZlclthbkluZGV4XSkgPT0gbmlsICkgeworICAgICAgICBhUnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcEluZGV4OltOU051bWJlciBudW1iZXJXaXRoSW50ZWdlcjphU3RvcEluZGV4XV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFNYXRjaEluZGV4ID0gW2FSdWxlLnN0YXJ0SW5kZXggaW50ZWdlclZhbHVlXTsKKyAgICAgICAgaWYgKCBhU3RhcnRJbmRleCA+IGFNYXRjaEluZGV4ICkgeworICAgICAgICAgICAgaWYgKCBhUnVsZSAhPSBwdHJCdWZmZXJbYW5JbmRleF0gKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZS5mTmV4dCA9IHB0ckJ1ZmZlclthbkluZGV4XTsKKyAgICAgICAgICAgIHB0ckJ1ZmZlclthbkluZGV4XSA9IGFSdWxlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChhUnVsZS5mTmV4dCAhPSBuaWwpIHsKKyAgICAgICAgICAgIGFNYXRjaEluZGV4ID0gWygoQU5UTFJSdWxlTWVtbyAqKWFSdWxlLmZOZXh0KS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV07CisgICAgICAgICAgICBpZiAoIGFTdGFydEluZGV4ID4gYU1hdGNoSW5kZXggKSB7CisgICAgICAgICAgICAgICAgbmV3UnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0b3BJbmRleF1dOworICAgICAgICAgICAgICAgIFtuZXdSdWxlIHJldGFpbl07CisgICAgICAgICAgICAgICAgbmV3UnVsZS5mTmV4dCA9IGFSdWxlLmZOZXh0OworICAgICAgICAgICAgICAgIGFSdWxlLmZOZXh0ID0gbmV3UnVsZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFNYXRjaEluZGV4ID09IGFTdGFydEluZGV4ICkgeworICAgICAgICAgICAgICAgIFthUnVsZSBzZXRTdGFydEluZGV4OmFSdWxlLnN0b3BJbmRleF07CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYVJ1bGUgPSBhUnVsZS5mTmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworLSAoTlNJbnRlZ2VyKWdldExhc3RIYXNoCit7CisgICAgcmV0dXJuIExhc3RIYXNoOworfQorCistICh2b2lkKXNldExhc3RIYXNoOihOU0ludGVnZXIpYUhhc2gKK3sKKyAgICBMYXN0SGFzaCA9IGFIYXNoOworfQorCistIChOU0ludGVnZXIpZ2V0TW9kZQoreworICAgIHJldHVybiBtb2RlOworfQorCistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZQoreworICAgIG1vZGUgPSBhTW9kZTsKK30KKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKKyAgICBOU0ludGVnZXIgSW5kZXg7CisgICAgCisgICAgSW5kZXggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJT0gQnVmZlNpemUgOiBhbkluZGV4OworICAgIGlmIChhUnVsZSAhPSBwdHJCdWZmZXJbSW5kZXhdKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbSW5kZXhdICE9IG5pbCkgeworICAgICAgICAgICAgW3B0ckJ1ZmZlcltJbmRleF0gcmVsZWFzZV07CisgICAgICAgIH0KKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltJbmRleF0gPSBhUnVsZTsKK30KKworLSAoQU5UTFJSdWxlTWVtbyAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilhbkluZGV4Cit7CisgICAgTlNJbnRlZ2VyIGFuSWR4OworCisgICAgYW5JZHggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJT0gQnVmZlNpemUgOiBhbkluZGV4OworICAgIHJldHVybiBwdHJCdWZmZXJbYW5JZHhdOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkludEFycmF5LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJJbnRBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjliMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJJbnRBcnJheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJJbnRBcnJheS5oCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBBTlRMUl9JTlRfQVJSQVlfSU5JVElBTF9TSVpFIDEwCisKK0BpbnRlcmZhY2UgQU5UTFJJbnRBcnJheSA6IEFOVExSUHRyQnVmZmVyIAoreworfQorCisrIChBTlRMUkludEFycmF5ICopbmV3QU5UTFJJbnRBcnJheTsKKysgKEFOVExSSW50QXJyYXkgKiluZXdBTlRMUkludEFycmF5V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoTGVuOihOU0ludGVnZXIpYUxlbjsKKworLSAodm9pZCkgZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKHZvaWQpIGFkZEludGVnZXI6KE5TSW50ZWdlcikgdjsKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgdjsKKy0gKE5TSW50ZWdlcikgcG9wOworLSAoTlNJbnRlZ2VyKSBpbnRlZ2VyQXRJbmRleDooTlNJbnRlZ2VyKSBpOworLSAodm9pZCkgaW5zZXJ0SW50ZWdlcjooTlNJbnRlZ2VyKWFuSW50ZWdlciBBdEluZGV4OihOU0ludGVnZXIpIGlkeDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKHZvaWQpIHJlc2V0OworCistIChOU0ludGVnZXIpIGNvdW50OworLSAoTlNJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJJbnRTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkludFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3OTBjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJJbnRTdHJlYW0uaApAQCAtMCwwICsxLDkzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQHByb3RvY29sIEFOVExSSW50U3RyZWFtIDwgTlNPYmplY3QsIE5TQ29weWluZyA+CisKKy0gKHZvaWQpIGNvbnN1bWU7CisKKy8vIEdldCB1bmljaGFyIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgY2hhcmFjdGVyIGFzIGludCBmb3IgaW5jbHVkaW5nIEFOVExSQ2hhclN0cmVhbUVPRiAoLTEpIGluIHRoZSBkYXRhIHJhbmdlCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisKKy8vIFRlbGwgdGhlIHN0cmVhbSB0byBzdGFydCBidWZmZXJpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkuICBSZXR1cm4KKy8vIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24sIGluZGV4KCksIG9yIHNvbWUgb3RoZXIgbWFya2VyIHNvIHRoYXQKKy8vIHdoZW4gcGFzc2VkIHRvIHJld2luZCgpIHlvdSBnZXQgYmFjayB0byB0aGUgc2FtZSBzcG90LgorLy8gcmV3aW5kKG1hcmsoKSkgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGlucHV0IGN1cnNvci4KKy8vIFRPRE86IHByb2JsZW0gaW4gdGhhdCBsZXhlciBzdHJlYW0gcmV0dXJucyBub3QgaW5kZXggYnV0IHNvbWUgbWFya2VyIAorCistIChOU0ludGVnZXIpIG1hcms7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wgaW5kZXggMC4ubiB3aGVyZSBuIGluZGljYXRlcyB0aGUKKy8vIGxhc3Qgc3ltYm9sIGhhcyBiZWVuIHJlYWQuCisKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXg7CisKKy8vIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBuZXh0IGNhbGwgdG8gaW5kZXggd291bGQgcmV0dXJuIG1hcmtlci4KKy8vIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIC1pbmRleCBidXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSXQncworLy8ganVzdCBhIG1hcmtlciB0byBpbmRpY2F0ZSB3aGF0IHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluLiAgVGhpcyBpcworLy8gZXNzZW50aWFsbHkgY2FsbGluZyAtcmVsZWFzZTogYW5kIC1zZWVrOi4gIElmIHRoZXJlIGFyZSBtYXJrZXJzCisvLyBjcmVhdGVkIGFmdGVyIHRoaXMgbWFya2VyIGFyZ3VtZW50LCB0aGlzIHJvdXRpbmUgbXVzdCB1bnJvbGwgdGhlbQorLy8gbGlrZSBhIHN0YWNrLiAgQXNzdW1lIHRoZSBzdGF0ZSB0aGUgc3RyZWFtIHdhcyBpbiB3aGVuIHRoaXMgbWFya2VyCisvLyB3YXMgY3JlYXRlZC4KKworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKworLy8gWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKy8vIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisvLyBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKy8vIHJld2luZCgpIGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dCB0aGUgYmFja3dhcmQgc2Vlay4KKworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CisKKy8vIFNldCB0aGUgaW5wdXQgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXguICBUaGlzIGlzCisvLyBub3JtYWxseSB1c2VkIHRvIHNlZWsgYWhlYWQgaW4gdGhlIGlucHV0IHN0cmVhbS4gIE5vIGJ1ZmZlcmluZyBpcworLy8gcmVxdWlyZWQgdG8gZG8gdGhpcyB1bmxlc3MgeW91IGtub3cgeW91ciBzdHJlYW0gd2lsbCB1c2Ugc2VlayB0bworLy8gbW92ZSBiYWNrd2FyZHMgc3VjaCBhcyB3aGVuIGJhY2t0cmFja2luZy4KKy8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gcmV3aW5kIGluIGl0cyBtdWx0aS1kaXJlY3Rpb25hbAorLy8gcmVxdWlyZW1lbnQgYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorLy8KKy8vIEZvciBjaGFyIHN0cmVhbXMsIHNlZWtpbmcgZm9yd2FyZCBtdXN0IHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIHN1Y2gKKy8vIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisvLyBiYWNrdHJhY2tpbmcgdXNpbmcgdGhlIG1hcmsvcmV3aW5kIG1lY2hhbmlzbSB0aGF0IHJlc3RvcmVzIHN0YXRlIGFuZAorLy8gc28gdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byB1cGRhdGUgc3RhdGUgd2hlbiBzZWVraW5nIGJhY2t3YXJkcy4KKy8vCisvLyBDdXJyZW50bHksIHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBmb3IgZWZmaWNpZW50IGJhY2t0cmFja2luZywgYnV0CisvLyBpbiB0aGUgZnV0dXJlIGl0IG1heSBiZSB1c2VkIGZvciBpbmNyZW1lbnRhbCBwYXJzaW5nLgorCistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworCisvKiogT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCBidXQKKyAqICBtaWdodCBiZSB1c2VmdWwgdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmVhbSBvciBmb3IgdGVzdGluZy4gIFRoaXMKKyAqICB2YWx1ZSBpbmNsdWRlcyBhIHNpbmdsZSBFT0YuCisgKi8KKy0gKE5TVUludGVnZXIpIHNpemU7CisvKiogV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICogIHBhc3MgdGhlIGJ1Y2sgYWxsIHRoZSB3YXkgdG8gdGhlIGxleGVyIHdobyBjYW4gYXNrIGl0cyBpbnB1dCBzdHJlYW0KKyAqICBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Y2ZiMzZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTGV4ZXIuaApAQCAtMCwwICsxLDkwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJMZXhlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgPEFOVExSVG9rZW5Tb3VyY2U+IHsKKwlpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OyAgICAgIC8vLzwgVGhlIGNoYXJhY3RlciBzdHJlYW0gd2UgcHVsbCB0b2tlbnMgb3V0IG9mLgorCU5TVUludGVnZXIgcnVsZU5lc3RpbmdMZXZlbDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRJbnB1dCwgc2V0dGVyPXNldElucHV0OikgaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFJ1bGVOZXN0aW5nTGV2ZWwsIHNldHRlcj1zZXRSdWxlTmVzdGluZ0xldmVsKSBOU1VJbnRlZ2VyIHJ1bGVOZXN0aW5nTGV2ZWw7CisKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPikgYW5JbnB1dDsKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopem9uZTsKKworLSAodm9pZCkgcmVzZXQ7CisKKy8vIC0gKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIHN0YXRlOworCisjcHJhZ21hIG1hcmsgVG9rZW5zCistIChpZDxBTlRMUlRva2VuPilnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbjsKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistICh2b2lkKSBtVG9rZW5zOwkJLy8gYWJzdHJhY3QsIGRlZmluZWQgaW4gZ2VuZXJhdGVkIHNvdXJjZXMKKy0gKHZvaWQpIHNraXA7CistIChpZDxBTlRMUkNoYXJTdHJlYW0+KSBnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OihpZDxBTlRMUkNoYXJTdHJlYW0+KWFDaGFyU3RyZWFtOworCistICh2b2lkKSBlbWl0OworLSAodm9pZCkgZW1pdDooaWQ8QU5UTFJUb2tlbj4pYVRva2VuOworCisjcHJhZ21hIG1hcmsgTWF0Y2hpbmcKKy0gKHZvaWQpIG1hdGNoU3RyaW5nOihOU1N0cmluZyAqKWFTdHJpbmc7CistICh2b2lkKSBtYXRjaEFueTsKKy0gKHZvaWQpIG1hdGNoQ2hhcjoodW5pY2hhcikgYUNoYXI7CistICh2b2lkKSBtYXRjaFJhbmdlRnJvbUNoYXI6KHVuaWNoYXIpZnJvbUNoYXIgdG86KHVuaWNoYXIpdG9DaGFyOworCisjcHJhZ21hIG1hcmsgSW5mb3JtYXRpb25hbAorLSAoTlNVSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXg7CistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworLy8gZXJyb3IgaGFuZGxpbmcKKy0gKHZvaWQpIHJlcG9ydEVycm9yOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihOU011dGFibGVBcnJheSAqKXRva2VuTmFtZXM7CistIChOU1N0cmluZyAqKWdldENoYXJFcnJvckRpc3BsYXk6KE5TSW50ZWdlciljOworLSAodm9pZCkgcmVjb3ZlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKXRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOGFlMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworQGludGVyZmFjZSBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlIDogTlNPYmplY3QgeworCWludCBzdGFydFRva2VuOworCWludCBzdG9wVG9rZW47Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0U3RhcnQ7CistICh2b2lkKSBzZXRTdGFydDogKE5TSW50ZWdlcikgYVN0YXJ0OworCistIChOU0ludGVnZXIpIGdldFN0b3A7CistICh2b2lkKSBzZXRTdG9wOiAoTlNJbnRlZ2VyKSBhU3RvcDsKKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkxpbmtCYXNlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJMaW5rQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJMaW5rQmFzZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vCisvLyAgQU5UTFJMaW5rQmFzZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE0LzEwLgorLy8gIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0Bwcm90b2NvbCBBTlRMUkxpbmtMaXN0IDxOU09iamVjdD4KKworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTsKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U6KGlkPEFOVExSTGlua0xpc3Q+KW5wIFByZXY6KGlkPEFOVExSTGlua0xpc3Q+KXBwOworCistICh2b2lkKSBkZWFsbG9jOworCistIChpZDxBTlRMUkxpbmtMaXN0PikgYXBwZW5kOihpZDxBTlRMUkxpbmtMaXN0Pilub2RlOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pIGluc2VydDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pIGdldGZOZXh0OworLSAodm9pZCkgc2V0Rk5leHQ6KGlkPEFOVExSTGlua0xpc3Q+KW5wOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0ZlByZXY7CistICh2b2lkKSBzZXRGUHJldjooaWQ8QU5UTFJMaW5rTGlzdD4pcHA7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkxpbmtCYXNlIDogTlNPYmplY3QgPEFOVExSTGlua0xpc3Q+IHsKKwlpZDxBTlRMUkxpbmtMaXN0PiBmUHJldjsKKwlpZDxBTlRMUkxpbmtMaXN0PiBmTmV4dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRmUHJldiwgc2V0dGVyPXNldEZQcmV2OikgaWQ8QU5UTFJMaW5rTGlzdD4gZlByZXY7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldGZOZXh0LCBzZXR0ZXI9c2V0Rk5leHQ6KSBpZDxBTlRMUkxpbmtMaXN0PiBmTmV4dDsKKworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTsKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U6KGlkPEFOVExSTGlua0xpc3Q+KW5wIFByZXY6KGlkPEFOVExSTGlua0xpc3Q+KXBwOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4paW5pdDsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluaXRXaXRoUHRyOihpZClucCBQcmV2OihpZClwcDsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWFwcGVuZDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluc2VydDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0Zk5leHQ7CistICh2b2lkKXNldEZOZXh0OihpZDxBTlRMUkxpbmtMaXN0PikgbnA7CistIChpZDxBTlRMUkxpbmtMaXN0PilnZXRmUHJldjsKKy0gKHZvaWQpc2V0RlByZXY6KGlkPEFOVExSTGlua0xpc3Q+KSBwcDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkxvb2thaGVhZFN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTG9va2FoZWFkU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0OGZmNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUkxvb2thaGVhZFN0cmVhbS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vCisvLyAgQU5UTFJMb29rYWhlYWRTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vICBbVGhlICJCU0QgbGljZW5jZSJdCisvLyAgQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkZhc3RRdWV1ZS5oIgorCisjZGVmaW5lIFVOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYIE5TSW50ZWdlck1heAorCitAaW50ZXJmYWNlIEFOVExSTG9va2FoZWFkU3RyZWFtIDogQU5UTFJGYXN0UXVldWUKK3sKKwlpZCBlb2Y7CisJTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworfQorCitAcHJvcGVydHkgKHJlYWR3cml0ZSwgcmV0YWluLCBnZXR0ZXI9Z2V0RW9mLCBzZXR0ZXI9c2V0RW9mKSBpZCBlb2Y7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEVvZkVsZW1lbnRJbmRleCwgc2V0dGVyPXNldEVvZkVsZW1lbnRJbmRleCkgTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGFzdE1hcmtlciwgc2V0dGVyPXNldExhc3RNYXJrZXIpIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRNYXJrRGVwdGgsIHNldHRlcj1zZXRNYXJrRGVwdGgpIE5TSW50ZWdlciBtYXJrRGVwdGg7CisKKy0gKGlkKSBpbml0V2l0aEVPRjooaWQpIG87CistIChpZCkgbmV4dEVsZW1lbnQ7CistICh2b2lkKSBjb25zdW1lOworLSAodm9pZCkgc3luYzooTlNJbnRlZ2VyKSBuZWVkOworLSAodm9pZCkgZmlsbDooTlNJbnRlZ2VyKSBuOworLSAoaWQpIExUOihOU0ludGVnZXIpIGk7CistIChpZCkgTEI6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBjdXJyZW50U3ltYm9sOworLSAoTlNJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKE5TSW50ZWdlcikgbWFyazsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBnZXRFb2Y7CistICh2b2lkKSBzZXRFb2Y6KGlkKSBhbklEOworLSAoTlNJbnRlZ2VyKSBnZXRFb2ZFbGVtZW50SW5kZXg7CistICh2b2lkKSBzZXRFb2ZFbGVtZW50SW5kZXg6KE5TSW50ZWdlcikgYW5JbnQ7CistIChOU0ludGVnZXIpIGdldExhc3RNYXJrZXI7CistICh2b2lkKSBzZXRMYXN0TWFya2VyOihOU0ludGVnZXIpIGFuSW50OworLSAoTlNJbnRlZ2VyKSBnZXRNYXJrRGVwdGg7CistICh2b2lkKSBzZXRNYXJrRGVwdGg6KE5TSW50ZWdlcikgYW5JbnQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1hcC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vCisvLyAgQU5UTFJNYXAuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAwCisvLyNkZWZpbmUgTE9DQUxfU0NPUEUgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSTWFwIDogQU5UTFJQdHJCdWZmZXIgeworCS8vQU5UTFJNYXAgKmZOZXh0OyAvLyBmb3VuZCBpbiBzdXBlcmNsYXNzCisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBsYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSTWFwICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2g6KSBOU0ludGVnZXIgbGFzdEhhc2g7CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrIChpZCluZXdBTlRMUk1hcDsKKysgKGlkKW5ld0FOVExSTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFIYXNoU2l6ZTsKKworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSAodm9pZClkZWFsbG9jOworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKy8qIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KKy0oTlNJbnRlZ2VyKWhhc2g6KE5TU3RyaW5nICopczsKKy8qICAgbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzOworLyogbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistKGlkKWluc3RhbGw6KEFOVExSTWFwRWxlbWVudCAqKXN5bTsKKy8qCisgKiBkZWxldGUgZW50cnkgZnJvbSBsaXN0CisgKi8KKy0gKHZvaWQpZGVsZXRlQU5UTFJNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoTlNJbnRlZ2VyKVJlbW92ZVN5bTooTlNTdHJpbmcgKilzOworLSAodm9pZClkZWxldGVfY2hhaW46KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TSW50ZWdlcilnZXROb2RlOihBTlRMUk1hcEVsZW1lbnQgKilhTm9kZTsKKy0gKHZvaWQpcHV0Tm9kZTooTlNJbnRlZ2VyKWFUVHlwZSBOb2RlOihpZClhTm9kZTsKKy0gKHZvaWQpcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIFRUeXBlOihOU0ludGVnZXIpdHR5cGU7CistICh2b2lkKXB1dE5hbWU6KE5TU3RyaW5nICopbmFtZSBOb2RlOihpZClhTm9kZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWFwRWxlbWVudC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWFwRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGQwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw2NSBAQAorLy8KKy8vICBBTlRMUk1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VNYXBFbGVtZW50LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNYXBFbGVtZW50IDogQU5UTFJCYXNlTWFwRWxlbWVudCB7CisgICAgTlNTdHJpbmcgKm5hbWU7CisgICAgaWQgICAgICAgIG5vZGU7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5hbWUsIHNldHRlcj1zZXROYW1lOikgTlNTdHJpbmcgKm5hbWU7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5vZGUsIHNldHRlcj1zZXROb2RlOikgaWQgbm9kZTsKKworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudDsKKysgKGlkKSBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBUeXBlOihOU0ludGVnZXIpYVRUeXBlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIE5vZGU6KGlkKWFOb2RlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhPYmoxOihpZClhbk9iajEgT2JqMjooaWQpYW5PYmoyOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIFR5cGU6KE5TSW50ZWdlcilhVFR5cGU7CistIChpZCkgaW5pdFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBOb2RlOihpZClhTm9kZTsKKy0gKGlkKSBpbml0V2l0aE9iajE6KGlkKWFuT2JqMSBPYmoyOihpZClhbk9iajI7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU0ludGVnZXIpIGNvdW50OworLSAoTlNJbnRlZ2VyKSBzaXplOworLSAoTlNTdHJpbmcgKilnZXROYW1lOworLSAodm9pZClzZXROYW1lOihOU1N0cmluZyAqKWFOYW1lOworLSAoaWQpZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQpYU5vZGU7CistICh2b2lkKXB1dE5vZGU6KGlkKWFOb2RlOworLSAodm9pZClwdXROb2RlOihpZClhTm9kZSBXaXRoOihOU0ludGVnZXIpdW5pcXVlSUQ7CisvLy0gKHZvaWQpc2V0T2JqZWN0OihpZClhTm9kZSBhdEluZGV4OmFuSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM5MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTMvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbgoreworICAgIEFOVExSQml0U2V0ICpleHBlY3Rpbmc7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZykgQU5UTFJCaXRTZXQgKmV4cGVjdGluZzsKKworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3QU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uOworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3QU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihBTlRMUkJpdFNldCAqKWV4cGVjdGluZzsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IEZvbGxvdzooQU5UTFJCaXRTZXQgKilleHBlY3Rpbmc7CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWJkYTNiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TUmFuZ2UgcmFuZ2U7Cit9CisKKysgKGlkKSBleGNlcHRpb25XaXRoUmFuZ2U6KE5TUmFuZ2UpIGFSYW5nZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlSW5wdXQ7CistIChpZCkgaW5pdFdpdGhSYW5nZTooTlNSYW5nZSkgYVJhbmdlIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSB0aGVJbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiZDQ1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU1NldCAqZXhwZWN0aW5nOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TU2V0ICpleHBlY3Rpbmc7CisKKysgKGlkKSBleGNlcHRpb25XaXRoU2V0OihOU1NldCAqKSB0aGVFeHBlY3RlZFNldCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoU2V0OihOU1NldCAqKSB0aGVFeHBlY3RlZFNldCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlU3RyZWFtOworCistIChOU1NldCAqKSBnZXRFeHBlY3Rpbmc7CistICh2b2lkKSBzZXRFeHBlY3Rpbmc6IChOU1NldCAqKSBhbkV4cGVjdGVkU2V0OworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWUxZDc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU0ludGVnZXIgZXhwZWN0aW5nOworCXVuaWNoYXIgZXhwZWN0aW5nQ2hhcjsKKwlCT09MIGlzVG9rZW5UeXBlOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TSW50ZWdlciBleHBlY3Rpbmc7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZ0NoYXIsIHNldHRlcj1zZXRFeHBlY3RpbmdDaGFyOikgdW5pY2hhciBleHBlY3RpbmdDaGFyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJc1Rva2VuVHlwZSwgc2V0dGVyPXNldElzVG9rZW5UeXBlOikgQk9PTCBpc1Rva2VuVHlwZTsKKworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKysgKGlkKSBuZXdBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbk1pc3Npbmc6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW46KGlkPEFOVExSVG9rZW4+KWluc2VydGVkOworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uQ2hhcjoodW5pY2hhcilleHBlY3RlZENoYXJhY3RlciBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworLShpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICBUb2tlbjooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWQ7CistIChpZCkgaW5pdFdpdGhDaGFyYWN0ZXI6KHVuaWNoYXIpZXhwZWN0ZWRDaGFyYWN0ZXIgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjFhYjUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0Bwcm90b2NvbCBBTlRMUkludFN0cmVhbTsKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TSW50ZWdlciBleHBlY3Rpbmc7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZykgTlNJbnRlZ2VyIGV4cGVjdGluZzsKKworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5OGUyNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uIDogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworICAgIGlkPEFOVExSVG9rZW4+IGluc2VydGVkOworfQorLyoqIFVzZWQgZm9yIHJlbW90ZSBkZWJ1Z2dlciBkZXNlcmlhbGl6YXRpb24gKi8KKysgKGlkKSBuZXdBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbjsKKysgKGlkKSBuZXdBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGg6KGlkPEFOVExSVG9rZW4+KWluc2VydGVkVG9rZW47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0OihOU0ludGVnZXIpZXhwZWN0ZWQgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBXaXRoOihpZDxBTlRMUlRva2VuPilpbnNlcnRlZFRva2VuOworCistIChOU0ludGVnZXIpIGdldE1pc3NpbmdUeXBlOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNzFiYWZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaApAQCAtMCwwICsxLDQzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKKwlpbnQgc3RhdGVOdW1iZXI7Cit9CisKKysgKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKikgbmV3QU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbjooTlNJbnRlZ2VyKXRoZURlY2lzaW9uTnVtYmVyIHN0YXRlOihOU0ludGVnZXIpdGhlU3RhdGVOdW1iZXIgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworLSAoQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqKSBpbml0V2l0aERlY2lzaW9uOihOU0ludGVnZXIpdGhlRGVjaXNpb25OdW1iZXIgc3RhdGU6KE5TSW50ZWdlcil0aGVTdGF0ZU51bWJlciBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CisKKy0gKHZvaWQpc2V0RGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpc2V0U3RhdGVOdW1iZXI6KE5TSW50ZWdlcilzdGF0ZU51bWJlcjsKKworCitAZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSTm9kZU1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk5vZGVNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwYzkxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUk5vZGVNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1NiBAQAorLy8KKy8vICBBTlRMUlJ1bGVNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZU1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSTm9kZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBpZDxBTlRMUlRyZWU+IG5vZGU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZCBub2RlOworCisrICh2b2lkKWluaXRpYWxpemU7CisKKysgKGlkKSBuZXdBTlRMUk5vZGVNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSTm9kZU1hcEVsZW1lbnRXaXRoSW5kZXg6KGlkKWFuSW5kZXggTm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooaWQpYW5JbmRleCBOb2RlOihpZClhTm9kZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkPEFOVExSVHJlZT4pZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlBhcnNlVHJlZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUGFyc2VUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1NTRlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlBhcnNlVHJlZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJQYXJzZVRyZWUuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNy8xMi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSUGFyc2VUcmVlIDogQU5UTFJCYXNlVHJlZSB7CisJaWQ8QU5UTFJUb2tlbj4gcGF5bG9hZDsKKwlOU011dGFibGVBcnJheSAqaGlkZGVuVG9rZW5zOworfQorLyoqIEEgcmVjb3JkIG9mIHRoZSBydWxlcyB1c2VkIHRvIG1hdGNoIGEgdG9rZW4gc2VxdWVuY2UuICBUaGUgdG9rZW5zCisgKiAgZW5kIHVwIGFzIHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlIGFuZCBydWxlIG5vZGVzIGFyZSB0aGUgaW50ZXJpb3Igbm9kZXMuCisgKiAgVGhpcyByZWFsbHkgYWRkcyBubyBmdW5jdGlvbmFsaXR5LCBpdCBpcyBqdXN0IGFuIGFsaWFzIGZvciBDb21tb25UcmVlCisgKiAgdGhhdCBpcyBtb3JlIG1lYW5pbmdmdWwgKHNwZWNpZmljKSBhbmQgaG9sZHMgYSBTdHJpbmcgdG8gZGlzcGxheSBmb3IgYSBub2RlLgorICovCisrIChBTlRMUlBhcnNlVHJlZSAqKW5ld0FOVExSUGFyc2VUcmVlOihpZDxBTlRMUlRva2VuPilsYWJlbDsKKy0gKGlkKWluaXRXaXRoTGFiZWw6KGlkPEFOVExSVG9rZW4+KWxhYmVsOworCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU7CistIChOU0ludGVnZXIpZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKXNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKWluZGV4OworLSAoTlNJbnRlZ2VyKWdldFRva2VuU3RvcEluZGV4OworLSAodm9pZClzZXRUb2tlblN0b3BJbmRleDooTlNJbnRlZ2VyKWluZGV4OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdXaXRoSGlkZGVuVG9rZW5zOworLSAoTlNTdHJpbmcgKil0b0lucHV0U3RyaW5nOworLSAodm9pZClfdG9TdHJpbmdMZWF2ZXM6KE5TTXV0YWJsZVN0cmluZyAqKWJ1ZjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGRhZjUwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUGFyc2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVJlY29nbml6ZXIuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgeworCWlkPEFOVExSVG9rZW5TdHJlYW0+IGlucHV0OworfQorKyAoQU5UTFJQYXJzZXIgKiluZXdBTlRMUlBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dDsKKysgKEFOVExSUGFyc2VyICopbmV3QU5UTFJQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQgU3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopYVN0YXRlOworCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OiAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGFuSW5wdXQ7CisKKy0gKHZvaWQpIHJlc2V0OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworLSAoQU5UTFJDb21tb25Ub2tlbiAqKWdldE1pc3NpbmdTeW1ib2w6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pZ2V0VG9rZW5TdHJlYW07CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KGludClydWxlSW5kZXg7CistICh2b2lkKSB0cmFjZU91dDooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKSBydWxlSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWVmM2RkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSA6IEFOVExSUnVsZVJldHVyblNjb3BlIHsKKwlpZDxBTlRMUlRva2VuPiBzdGFydFRva2VuOworCWlkPEFOVExSVG9rZW4+IHN0b3BUb2tlbjsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnQsIHNldHRlcj1zZXRTdGFydDopIGlkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgICBpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRTdGFydDsKKy0gKHZvaWQpIHNldFN0YXJ0OiAoaWQ8QU5UTFJUb2tlbj4pIGFTdGFydDsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CistICh2b2lkKSBzZXRTdG9wOiAoaWQ8QU5UTFJUb2tlbj4pIGFTdG9wOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKil0aGVab25lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJQdHJCdWZmZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlB0ckJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGY1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJQdHJCdWZmZXIuaApAQCAtMCwwICsxLDkxIEBACisvLworLy8gIEFOVExSUHRyQnVmZmVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBCVUZGU0laRSAgICAgICAgIDEwMQorCitAaW50ZXJmYWNlIEFOVExSUHRyQnVmZmVyIDogQU5UTFJMaW5rQmFzZSB7CisJLy9BTlRMUlB0ckJ1ZmZlciAqZk5leHQ7CisgICAgTlNJbnRlZ2VyIEJ1ZmZTaXplOworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKKyAgICBpZCAqcHRyQnVmZmVyOworICAgIE5TSW50ZWdlciBjb3VudDsKKyAgICBOU0ludGVnZXIgcHRyOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRCdWZmU2l6ZSwgc2V0dGVyPXNldEJ1ZmZTaXplOikgTlNJbnRlZ2VyIEJ1ZmZTaXplOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRCdWZmZXIsIHNldHRlcj1zZXRCdWZmZXI6KSBOU011dGFibGVEYXRhICpidWZmZXI7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFB0ckJ1ZmZlciwgc2V0dGVyPXNldFB0ckJ1ZmZlcjopIGlkICpwdHJCdWZmZXI7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDb3VudCwgc2V0dGVyPXNldENvdW50OikgTlNJbnRlZ2VyIGNvdW50OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UHRyLCBzZXR0ZXI9c2V0UHRyOikgTlNJbnRlZ2VyIHB0cjsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcjsKKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcldpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCistIChOU011dGFibGVEYXRhICopZ2V0QnVmZmVyOworLSAodm9pZClzZXRCdWZmZXI6KE5TTXV0YWJsZURhdGEgKilucDsKKy0gKE5TSW50ZWdlcilnZXRDb3VudDsKKy0gKHZvaWQpc2V0Q291bnQ6KE5TSW50ZWdlcilhQ291bnQ7CistIChpZCAqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihpZCAqKW5wOworLSAoTlNJbnRlZ2VyKWdldFB0cjsKKy0gKHZvaWQpc2V0UHRyOihOU0ludGVnZXIpbnA7CisKKy0gKHZvaWQpIHB1c2g6KGlkKSB2OworLSAoaWQpIHBvcDsKKy0gKGlkKSBwZWVrOworCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKSB2OworLSAodm9pZCkgYWRkT2JqZWN0c0Zyb21BcnJheTooQU5UTFJQdHJCdWZmZXIgKilhbkFycmF5OworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoaWQpICAgb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKHZvaWQpIHJlbW92ZUFsbE9iamVjdHM7CisKKy0gKHZvaWQpIGVuc3VyZUNhcGFjaXR5OihOU0ludGVnZXIpIGluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTNkYzBlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaApAQCAtMCwwICsxLDcyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiA6IEFOVExSUnVudGltZUV4Y2VwdGlvbiB7CisJaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworCU5TSW50ZWdlciBpbmRleDsKKwlpZDxBTlRMUlRva2VuPiB0b2tlbjsKKwlpZDxBTlRMUlRyZWU+IG5vZGU7CisJdW5pY2hhciBjOworCU5TSW50ZWdlciBsaW5lOworCU5TSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RyZWFtLCBzZXR0ZXI9c2V0U3RyZWFtOikgaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuOikgaWQ8QU5UTFJUb2tlbj50b2tlbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZDxBTlRMUlRyZWU+bm9kZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExpbmUsIHNldHRlcj1zZXRMaW5lOikgTlNJbnRlZ2VyIGxpbmU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDaGFyUG9zaXRpb25JbkxpbmUsIHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU0ludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworCisrIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIG5ld0FOVExSUmVjb2duaXRpb25FeGNlcHRpb247CisrIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgYW5JbnB1dFN0cmVhbTsgCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW07CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0U3RyZWFtIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoTlNJbnRlZ2VyKSB1bmV4cGVjdGVkVHlwZTsKKy0gKGlkPEFOVExSVG9rZW4+KWdldFVuZXhwZWN0ZWRUb2tlbjsKKworLSAoaWQ8QU5UTFJJbnRTdHJlYW0+KSBnZXRTdHJlYW07CistICh2b2lkKSBzZXRTdHJlYW06IChpZDxBTlRMUkludFN0cmVhbT4pIGFTdHJlYW07CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbjsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Tm9kZTsKKy0gKHZvaWQpIHNldE5vZGU6IChpZDxBTlRMUlRyZWU+KSBhTm9kZTsKKworLSAoTlNTdHJpbmcgKilnZXRNZXNzYWdlOworCistIChOU0ludGVnZXIpZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworLSAodm9pZClzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TSW50ZWdlcilhUG9zOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0MzBiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaApAQCAtMCwwICsxLDExNiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgOiBOU09iamVjdCB7CisJTlNNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsgICAgICAgICAgLy8gYSBzdGFjayBvZiBGT0xMT1cgYml0c2V0cyB1c2VkIGZvciBjb250ZXh0IHNlbnNpdGl2ZSBwcmVkaWN0aW9uIGFuZCByZWNvdmVyeQorICAgIE5TSW50ZWdlciBfZnNwOyAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvdyBzdGFjayBwb2ludGVyCisJQk9PTCBlcnJvclJlY292ZXJ5OyAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIHJlY292ZXJpbmc/CisJTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworCUJPT0wgZmFpbGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgc29tZSBtYXRjaCBmYWlsZWQKKyAgICBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworCU5TSW50ZWdlciBiYWNrdHJhY2tpbmc7ICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcKKwlBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CQkJLy8gc3RvcmUgcHJldmlvdXMgcmVzdWx0cyBvZiBtYXRjaGluZyBydWxlcyBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGFnYWluLiBIb29rIGluIGluY3JlbWVudGFsIHN0dWZmIGhlcmUsIHRvby4KKworCWlkPEFOVExSVG9rZW4+IHRva2VuOworCU5TSW50ZWdlciAgdG9rZW5TdGFydENoYXJJbmRleDsKKwlOU1VJbnRlZ2VyIHRva2VuU3RhcnRMaW5lOworCU5TVUludGVnZXIgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKwlOU1VJbnRlZ2VyIGNoYW5uZWw7CisJTlNVSW50ZWdlciB0eXBlOworCU5TU3RyaW5nICAgKnRleHQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Rm9sbG93aW5nLCBzZXR0ZXI9c2V0Rm9sbG93aW5nOikgTlNNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgX2ZzcDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIGVycm9yUmVjb3Zlcnk7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRGYWlsZWQsIHNldHRlcj1zZXRGYWlsZWQ6KSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRCYWNrdHJhY2tpbmcsIHNldHRlcj1zZXRCYWNrdHJhY2tpbmcpIE5TSW50ZWdlciBiYWNrdHJhY2tpbmc7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFJ1bGVNZW1vLCBzZXR0ZXI9c2V0UnVsZU1lbW86KSBBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CitAcHJvcGVydHkgKGNvcHksIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuKSBpZDxBTlRMUlRva2VuPiB0b2tlbjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFR5cGUsc2V0dGVyPXNldFR5cGU6KSBOU1VJbnRlZ2VyIHR5cGU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDaGFubmVsLHNldHRlcj1zZXRDaGFubmVsOikgTlNVSW50ZWdlciBjaGFubmVsOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5TdGFydExpbmUsc2V0dGVyPXNldFRva2VuU3RhcnRMaW5lOikgTlNVSW50ZWdlciB0b2tlblN0YXJ0TGluZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYXJQb3NpdGlvbkluTGluZSxzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNVSW50ZWdlciB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5TdGFydENoYXJJbmRleCxzZXR0ZXI9c2V0VG9rZW5TdGFydENoYXJJbmRleDopIE5TSW50ZWdlciB0b2tlblN0YXJ0Q2hhckluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dCkgTlNTdHJpbmcgKnRleHQ7CisKKysgKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlOworKyAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CisrIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOworLSAodm9pZCkgc2V0VG9rZW46KGlkPEFOVExSVG9rZW4+KSB0aGVUb2tlbjsKKworLSAoTlNVSW50ZWdlcikgZ2V0VHlwZTsKKy0gKHZvaWQpIHNldFR5cGU6KE5TVUludGVnZXIpIHRoZVRva2VuVHlwZTsKKworLSAoTlNVSW50ZWdlcikgZ2V0Q2hhbm5lbDsKKy0gKHZvaWQpIHNldENoYW5uZWw6KE5TVUludGVnZXIpIHRoZUNoYW5uZWw7CisKKy0gKE5TVUludGVnZXIpIGdldFRva2VuU3RhcnRMaW5lOworLSAodm9pZCkgc2V0VG9rZW5TdGFydExpbmU6KE5TVUludGVnZXIpIHRoZVRva2VuU3RhcnRMaW5lOworCistIChOU1VJbnRlZ2VyKSBnZXRDaGFyUG9zaXRpb25JbkxpbmU7CistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpIHRoZUNoYXJQb3NpdGlvbjsKKworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0Q2hhckluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdGFydENoYXJJbmRleDooTlNJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0Q2hhckluZGV4OworCistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworCistIChOU011dGFibGVBcnJheSAqKSBnZXRGb2xsb3dpbmc7CistICh2b2lkKXNldEZvbGxvd2luZzooTlNNdXRhYmxlQXJyYXkgKilhRm9sbG93OworLSAoQU5UTFJSdWxlU3RhY2sgKikgZ2V0UnVsZU1lbW87CistICh2b2lkKXNldFJ1bGVNZW1vOihBTlRMUlJ1bGVTdGFjayAqKWFSdWxlTWVtbzsKKy0gKEJPT0wpIGlzRXJyb3JSZWNvdmVyeTsKKy0gKHZvaWQpIHNldElzRXJyb3JSZWNvdmVyeTogKEJPT0wpIGZsYWc7CisKKy0gKEJPT0wpIGdldEZhaWxlZDsKKy0gKHZvaWQpIHNldEZhaWxlZDogKEJPT0wpIGZsYWc7CisKKy0gKE5TSW50ZWdlcikgIGdldEJhY2t0cmFja2luZzsKKy0gKHZvaWQpIHNldEJhY2t0cmFja2luZzooTlNJbnRlZ2VyKSB2YWx1ZTsKKy0gKHZvaWQpIGluY3JlYXNlQmFja3RyYWNraW5nOworLSAodm9pZCkgZGVjcmVhc2VCYWNrdHJhY2tpbmc7CistIChCT09MKSBpc0JhY2t0cmFja2luZzsKKworLSAoTlNJbnRlZ2VyKSBsYXN0RXJyb3JJbmRleDsKKy0gKHZvaWQpIHNldExhc3RFcnJvckluZGV4OihOU0ludGVnZXIpIHZhbHVlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzMmEwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaApAQCAtMCwwICsxLDg1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKwordHlwZWRlZiB1bmlvbiB7CisgICAgaWQgc2luZ2xlOworICAgIE5TTXV0YWJsZUFycmF5ICptdWx0aXBsZTsKK30gRWxlbWVudHM7CisKKy8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHNlcGFyYXRlZCBpbnRvIHN0cmVhbSBhbmQgZW51bWVyYXRvciBjbGFzc2VzCitAaW50ZXJmYWNlIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIDogTlNPYmplY3QgeworICAgIE5TSW50ZWdlciBjdXJzb3I7CisgICAgQk9PTCBkaXJ0eTsgICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgcmV0dXJuIGNvcGllcyBvZiBpdHMgZWxlbWVudHMsIHNldCB0byB0cnVlIGFmdGVyIGEgY2FsbCB0byAtcmVzZXQKKyAgICBCT09MIGlzU2luZ2xlRWxlbWVudDsKKyAgICBFbGVtZW50cyBlbGVtZW50czsKKyAgICAKKyAgICBOU1N0cmluZyAqZWxlbWVudERlc2NyaXB0aW9uOworICAgIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPUdldEN1cnNvciwgc2V0dGVyPVNldEN1cnNvcjopIE5TSW50ZWdlciBjdXJzb3I7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPUdldGRpcnR5LCBzZXR0ZXI9U2V0ZGlydHk6KSBCT09MIGRpcnR5OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1HZXRJc1NpbmdsZUVsZW1lbnQsIHNldHRlcj1TZXRJc1NpbmdsZUVsZW1lbnQ6KSBCT09MIGlzU2luZ2xlRWxlbWVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9R2V0RWxlbWVudCwgc2V0dGVyPVNldEVsZW1lbnQ6KSBFbGVtZW50cyBlbGVtZW50czsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9R2V0RWxlbWVudERlc2NyaXB0aW9uLCBzZXR0ZXI9U2V0RWxlbWVudERlc2NyaXB0aW9uOikgTlNTdHJpbmcgKmVsZW1lbnREZXNjcmlwdGlvbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9R2V0VHJlZUFkYXB0b3IsIHNldHRlcj1TZXRUcmVlQWRhcHRvcjopIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworCisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKysgKEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKikgbmV3QU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNBcnJheSAqKXRoZUVsZW1lbnRzOworCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbiBlbGVtZW50OihpZClhbkVsZW1lbnQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKHZvaWQpcmVzZXQ7CisKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3I7CisKKy0gKHZvaWQpIGFkZEVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsMCisgCistIChCT09MKSBoYXNOZXh0OworLSAoaWQ8QU5UTFJUcmVlPikgbmV4dFRyZWU7CistIChpZDxBTlRMUlRyZWU+KSBfbmV4dDsgICAgICAgLy8gaW50ZXJuYWw6IFRPRE86IHJlZGVzaWduIGlmIG5lY2Vzc2FyeS4gbWF5YmUgZGVsZWdhdGUKKworLSAoaWQpIGNvcHlFbGVtZW50OihpZCllbGVtZW50OworLSAoaWQpIHRvVHJlZTooaWQpZWxlbWVudDsKKworLSAoTlNTdHJpbmcgKikgZ2V0RGVzY3JpcHRpb247CistICh2b2lkKSBzZXREZXNjcmlwdGlvbjooTlNTdHJpbmcgKilkZXNjcmlwdGlvbjsKKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkMThiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaApAQCAtMCwwICsxLDUwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmgiDAwKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA6IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKworfQorCisrIChBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqKSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbjsKKysgKEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICopIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpYW5FbGVtZW50OworKyAoQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKKworLSAoaWQpIG5leHROb2RlOworLSAoaWQpIGR1cDooaWQpZWxlbWVudDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhNTE2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIgorCisKK0BpbnRlcmZhY2UgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIDogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworCit9CisKKysgKGlkKSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKillbGVtZW50RGVzY3JpcHRpb247CisvKiogQ3JlYXRlIGEgc3RyZWFtIHdpdGggb25lIGVsZW1lbnQgKi8KKysgKGlkKSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopZWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OihpZCkgb25lRWxlbWVudDsKKy8qKiBDcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0ICovCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNNdXRhYmxlQXJyYXkgKillbGVtZW50czsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhRGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYURlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpZWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KE5TTXV0YWJsZUFycmF5ICopZWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJlYW0gYW5kIG1ha2UgYSBub2RlIGZvciBpdCAqLworLSAoaWQpIG5leHROb2RlOworCistIChpZCkgbmV4dFRva2VuOworCisvKiogRG9uJ3QgY29udmVydCB0byBhIHRyZWUgdW5sZXNzIHRoZXkgZXhwbGljaXRseSBjYWxsIG5leHRUcmVlLgorICogIFRoaXMgd2F5IHdlIGNhbiBkbyBoZXRlcm8gdHJlZSBub2RlcyBpbiByZXdyaXRlLgorICovCistIChpZDxBTlRMUlRyZWU+KSB0b1RyZWU6KGlkPEFOVExSVG9rZW4+KWVsZW1lbnQ7CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdWxlTWFwRWxlbWVudC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVsZU1hcEVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQwYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVsZU1hcEVsZW1lbnQuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZU1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlTWFwRWxlbWVudC5oIgorCitAaW50ZXJmYWNlIEFOVExSUnVsZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBOU051bWJlciAqcnVsZU51bTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTnVtLCBzZXR0ZXI9c2V0UnVsZU51bTopIE5TTnVtYmVyICpydWxlTnVtOworCisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnQ7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooTlNOdW1iZXIgKilhbklkeDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TTnVtYmVyICopZ2V0UnVsZU51bTsKKy0gKHZvaWQpc2V0UnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJ1bGVNZW1vLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdWxlTWVtby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTVhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdWxlTWVtby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJSdWxlTWVtby5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE2LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkxpbmtCYXNlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSdWxlTWVtbyA6IEFOVExSTGlua0Jhc2UgeworICAgIE5TTnVtYmVyICpzdGFydEluZGV4OworICAgIE5TTnVtYmVyICpzdG9wSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnRJbmRleCwgc2V0dGVyPXNldFN0YXJ0SW5kZXgpIE5TTnVtYmVyICpzdGFydEluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTdG9wSW5kZXgsIHNldHRlcj1zZXRTdG9wSW5kZXgpIE5TTnVtYmVyICpzdG9wSW5kZXg7CisKKysgKEFOVExSUnVsZU1lbW8gKiluZXdBTlRMUlJ1bGVNZW1vOworKyAoQU5UTFJSdWxlTWVtbyAqKW5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDooTlNOdW1iZXIgKilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TTnVtYmVyICopYVN0b3BJbmRleDsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJSdWxlTWVtbyAqKWdldFJ1bGVXaXRoU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXg7CistIChOU051bWJlciAqKWdldFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OworLSAodm9pZClzZXRTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdG9wSW5kZXg7CistICh2b2lkKXNldFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTBjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZVJldHVyblNjb3BlLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlJ1bGVSZXR1cm5TY29wZSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+IHsKKworfQorCisvKiogUmV0dXJuIHRoZSBzdGFydCB0b2tlbiBvciB0cmVlICovCistIChpZDxBTlRMUlRva2VuPikgZ2V0U3RhcnQ7CisKKy8qKiBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gb3IgdHJlZSAqLworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9QVNUOyAqLworLSAoaWQpIGdldE5vZGU7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9dGVtcGxhdGU7IERvbid0IHVzZSBTdHJpbmdUZW1wbGF0ZQorICogIHR5cGUgYXMgaXQgdGhlbiBjYXVzZXMgYSBkZXBlbmRlbmN5IHdpdGggU1QgbGliLgorICovCistIChpZCkgZ2V0VGVtcGxhdGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNDUwYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJIYXNoUnVsZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSUnVsZVN0YWNrIDogQU5UTFJCYXNlU3RhY2sgeworfQorCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOworKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250OworLShpZClpbml0OworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0odm9pZClkZWFsbG9jOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy8qIGNsZWFyIC0tIHJlaW5pdGlhbGl6ZSB0aGUgbWFwbGlzdCBhcnJheSAqLworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJIYXNoUnVsZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJIYXNoUnVsZSAqKWFIYXNoUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoQU5UTFJIYXNoUnVsZSAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHg7CistICh2b2lkKXB1dEhhc2hSdWxlQXRSdWxlSW5kZXg6KE5TSW50ZWdlcilhUnVsZUluZGV4IFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TSW50ZWdlcilhU3RvcEluZGV4OworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdWxlU3RhY2subQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDkxOTJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLm0KQEAgLTAsMCArMSwxNDcgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2subQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSUnVsZVN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJ1bGVTdGFjaworCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrCit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRXaXRoTGVuOmNudF07Cit9CisKKy0gKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46Y250XSkgIT0gbmlsKSB7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgcmV0dXJuIFtzdXBlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkKKyAgICAgICAgICAgIGFDbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGFDbnQ7Cit9CisKKy0gKE5TSW50ZWdlcilzaXplCit7CisgICAgQU5UTFJSdWxlTWVtbyAqYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhU2l6ZSA9IDA7CisgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKworLSAoQU5UTFJIYXNoUnVsZSAqKXBvcAoreworICAgIHJldHVybiAoQU5UTFJIYXNoUnVsZSAqKVtzdXBlciBwb3BdOworfQorCistICh2b2lkKSBpbnNlcnRPYmplY3Q6KEFOVExSSGFzaFJ1bGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIE5TTG9nKCBAIkluIEFOVExSUnVsZVN0YWNrIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGFSdWxlIGF0IEluZGV4ICVkLCBidXQgQnVmZmVyIGlzIG9ubHkgJWQgbG9uZ1xuIiwgaWR4LCBCdWZmU2l6ZSApOworICAgICAgICBbc2VsZiBlbnN1cmVDYXBhY2l0eTppZHhdOworICAgIH0KKyAgICBpZiAoIGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICBpZiAocHRyQnVmZmVyW2lkeF0gIT0gbmlsKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChBTlRMUkhhc2hSdWxlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmIChpZHggPCBCdWZmU2l6ZSkgeworICAgICAgICByZXR1cm4gcHRyQnVmZmVyW2lkeF07CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpcHV0SGFzaFJ1bGVBdFJ1bGVJbmRleDooTlNJbnRlZ2VyKWFSdWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXgKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphSGFzaFJ1bGU7CisgICAgQU5UTFJSdWxlTWVtbyAqYVJ1bGVNZW1vOworCisgICAgaWYgKGFSdWxlSW5kZXggPj0gQnVmZlNpemUpIHsKKyAgICAgICAgTlNMb2coIEAicHV0SGFzaFJ1bGVBdFJ1bGVJbmRleCBhdHRlbXB0aW5nIHRvIGluc2VydCBhUnVsZSBhdCBJbmRleCAlZCwgYnV0IEJ1ZmZlciBpcyBvbmx5ICVkIGxvbmdcbiIsIGFSdWxlSW5kZXgsIEJ1ZmZTaXplICk7CisgICAgICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OmFSdWxlSW5kZXhdOworICAgIH0KKyAgICBpZiAoKGFIYXNoUnVsZSA9IHB0ckJ1ZmZlclthUnVsZUluZGV4XSkgPT0gbmlsKSB7CisgICAgICAgIGFIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBuZXdBTlRMUkhhc2hSdWxlV2l0aExlbjoxN10gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyW2FSdWxlSW5kZXhdID0gYUhhc2hSdWxlOworICAgIH0KKyAgICBpZiAoKCBhUnVsZU1lbW8gPSBbYUhhc2hSdWxlIG9iamVjdEF0SW5kZXg6YVN0YXJ0SW5kZXhdICkgPT0gbmlsICkgeworICAgICAgICBhUnVsZU1lbW8gPSBbW0FOVExSUnVsZU1lbW8gbmV3QU5UTFJSdWxlTWVtb10gcmV0YWluXTsKKyAgICAgICAgW2FIYXNoUnVsZSBpbnNlcnRPYmplY3Q6YVJ1bGVNZW1vIGF0SW5kZXg6YVN0YXJ0SW5kZXhdOworICAgIH0KKyAgICBbYVJ1bGVNZW1vIHNldFN0YXJ0SW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdGFydEluZGV4XV07CisgICAgW2FSdWxlTWVtbyBzZXRTdG9wSW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdG9wSW5kZXhdXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVudGltZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSUnVudGltZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjA5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw1NCBAQAorLy8KKy8vICBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi81LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgQU5UTFJSdW50aW1lRXhjZXB0aW9uIDogTlNFeGNlcHRpb24KK3sKK30KKworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3QU5UTFJSdW50aW1lRXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3QU5UTFJSdW50aW1lRXhjZXB0aW9uOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSUnVudGltZUV4Y2VwdGlvbjooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzphVXNlckluZm87CisKKy0gKGlkKSBpbml0OworLSAoaWQpaW5pdFdpdGhSdW50aW1lOihOU1N0cmluZyAqKWFSZWFzb247CistIChpZClpbml0V2l0aFJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm87CisKKy0gKE5TU3RyaW5nICopIERlc2NyaXB0aW9uOworCisvLyAgICAtICh2b2lkKXNldERlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisvLyAgICAtICh2b2lkKXNldFN0YXRlTnVtYmVyOihOU0ludGVnZXIpc3RhdGVOdW1iZXI7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMGY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaApAQCAtMCwwICsxLDQ1IEBACisvLworLy8gIEFOVExSU3RyZWFtRW51bWVydG9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI5LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJTdHJlYW1FbnVtZXJhdG9yIDogTlNFbnVtZXJhdG9yIAoreworCU5TSW50ZWdlciBpOworCWlkIGVvZjsKKwlOU011dGFibGVBcnJheSAqbm9kZXM7Cit9CisKKy0oaWQpIGluaXRXaXRoTm9kZXM6KE5TTXV0YWJsZUFycmF5ICopIG4gYW5kRU9GOihpZCkgbzsKKy0oQk9PTCkgaGFzTmV4dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSU3RyaW5nU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJTdHJpbmdTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjEzYzdkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSU3RyaW5nU3RyZWFtLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbVN0YXRlLmgiCisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorCitAaW50ZXJmYWNlIEFOVExSU3RyaW5nU3RyZWFtIDogTlNPYmplY3QgPCBBTlRMUkNoYXJTdHJlYW0gPiB7CisJTlNTdHJpbmcgKmRhdGE7CisJTlNJbnRlZ2VyIG47CisJTlNJbnRlZ2VyIHA7CisJTlNJbnRlZ2VyIGxpbmU7CisJTlNJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworCUFOVExSUHRyQnVmZmVyICptYXJrZXJzOworCU5TSW50ZWdlciBsYXN0TWFya2VyOworCU5TU3RyaW5nICpuYW1lOworICAgIEFOVExSQ2hhclN0cmVhbVN0YXRlICpjaGFyU3RhdGU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RGF0YSxzZXR0ZXI9c2V0RGF0YTopIE5TU3RyaW5nICpkYXRhOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UCxzZXR0ZXI9c2V0UDopIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TixzZXR0ZXI9c2V0TjopIE5TSW50ZWdlciBuOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGluZSxzZXR0ZXI9c2V0TGluZTopIE5TSW50ZWdlciBsaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0Q2hhclBvc2l0aW9uSW5MaW5lLHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU0ludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TWFya0RlcHRoLHNldHRlcj1zZXRNYXJrRGVwdGg6KSBOU0ludGVnZXIgbWFya0RlcHRoOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRNYXJrZXJzLCBzZXR0ZXI9c2V0TWFya2VyczopIEFOVExSUHRyQnVmZmVyICptYXJrZXJzOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdE1hcmtlcixzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTb3VyY2VOYW1lLCBzZXR0ZXI9c2V0U291cmNlTmFtZTopIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDaGFyU3RhdGUsIHNldHRlcj1zZXRDaGFyU3RhdGU6KSBBTlRMUkNoYXJTdHJlYW1TdGF0ZSAqY2hhclN0YXRlOworCisrIG5ld0FOVExSU3RyaW5nU3RyZWFtOworCisrIG5ld0FOVExSU3RyaW5nU3RyZWFtOihOU1N0cmluZyAqKWFTdHJpbmc7CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW06KGNoYXIgKilteURhdGEgQ291bnQ6KE5TSW50ZWdlciludW1CeXRlczsKKworLSAoaWQpIGluaXQ7CisKKy8vIHRoaXMgaW5pdGlhbGl6ZXIgY29waWVzIHRoZSBzdHJpbmcKKy0gKGlkKSBpbml0V2l0aFN0cmluZzooTlNTdHJpbmcgKikgdGhlU3RyaW5nOworCisvLyBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgY29uc3RydWN0b3IgYXMgbm8gZGF0YSBpcyBjb3BpZWQKKy0gKGlkKSBpbml0V2l0aFN0cmluZ05vQ29weTooTlNTdHJpbmcgKikgdGhlU3RyaW5nOworCistIChpZCkgaW5pdFdpdGhEYXRhOihjaGFyICopbXlEYXRhIENvdW50OihOU0ludGVnZXIpbnVtQnl0ZXM7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisvLyByZXNldCB0aGUgc3RyZWFtJ3Mgc3RhdGUsIGJ1dCBrZWVwIHRoZSBkYXRhIHRvIGZlZWQgb2ZmCistICh2b2lkKSByZXNldDsKKy8vIGNvbnN1bWUgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0KKy0gKHZvaWQpIGNvbnN1bWU7CisKKy8vIGxvb2sgYWhlYWQgaSBjaGFyYWN0ZXJzCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIExUOihOU0ludGVnZXIpIGk7CisKKy8vIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbAorLSAoTlNJbnRlZ2VyKSBnZXRJbmRleDsKKy8vIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorLSAoTlNJbnRlZ2VyKSBzaXplOworCisvLyBzZWVrIGFuZCByZXdpbmQgaW4gdGhlIHN0cmVhbQorLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKSBpbmRleDsKKworLy8gcHJvdmlkZSB0aGUgc3RyZWFtcyBkYXRhIChlLmcuIGZvciB0b2tlbnMgdXNpbmcgaW5kaWNlcykKKy0gKE5TU3RyaW5nICopIHN1YnN0cmluZzooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU1N0cmluZyAqKSBzdWJzdHJpbmdXaXRoUmFuZ2U6KE5TUmFuZ2UpIHRoZVJhbmdlOworCisvLyB1c2VkIGZvciB0cmFja2luZyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtCistIChOU0ludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOihOU0ludGVnZXIpIHRoZUxpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKSB0aGVQb3M7CisKKy0gKE5TSW50ZWdlcikgZ2V0TjsKKy0gKHZvaWQpIHNldE46KE5TSW50ZWdlciludW07CisKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6KE5TSW50ZWdlciludW07CisKKy0gKEFOVExSUHRyQnVmZmVyICopZ2V0TWFya2VyczsKKy0gKHZvaWQpIHNldE1hcmtlcnM6KEFOVExSUHRyQnVmZmVyICopYU1hcmtlckxpc3Q7CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworLy8gYWNjZXNzb3JzIHRvIHRoZSByYXcgZGF0YSBvZiB0aGlzIHN0cmVhbQorLSAoTlNTdHJpbmcgKikgZ2V0RGF0YTsKKy0gKHZvaWQpIHNldERhdGE6IChOU1N0cmluZyAqKSBhRGF0YTsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJTeW1ib2xTdGFjay5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlkZjlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2suaApAQCAtMCwwICsxLDc1IEBACisvLworLy8gIEFOVExSU3ltYm9sU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorLy8gI2ltcG9ydCAiQU5UTFJTeW1ib2xTY29wZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSU3ltYm9sc1Njb3BlIDogTlNPYmplY3QKK3sKKyAgICAKK30KKworKyAoQU5UTFJTeW1ib2xzU2NvcGUgKiluZXdBTlRMUlN5bWJvbHNTY29wZTsKKworLSAoaWQpaW5pdDsKK0BlbmQKKworCitAaW50ZXJmYWNlIEFOVExSU3ltYm9sU3RhY2sgOiBBTlRMUkJhc2VTdGFjayB7Cit9CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrKEFOVExSU3ltYm9sU3RhY2sgKiluZXdBTlRMUlN5bWJvbFN0YWNrOworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKilnZXRIYXNoTWFwRW50cnk6KE5TSW50ZWdlcilpZHg7CisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKiopZ2V0SGFzaE1hcDsKKworLShBTlRMUlN5bWJvbHNTY29wZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJTeW1ib2xzU2NvcGUgKilhU2NvcGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKEFOVExSU3ltYm9sc1Njb3BlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2subSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlN5bWJvbFN0YWNrLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkNjc3NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlN5bWJvbFN0YWNrLm0KQEAgLTAsMCArMSwxMjMgQEAKKy8vCisvLyAgQU5UTFJTeW1ib2xTdGFjay5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJTeW1ib2xTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSU3ltYm9sc1Njb3BlCisKKysgKEFOVExSU3ltYm9sc1Njb3BlICopbmV3QU5UTFJTeW1ib2xzU2NvcGUKK3sKKyAgICByZXR1cm4oIFtbQU5UTFJTeW1ib2xzU2NvcGUgYWxsb2NdIGluaXRdICk7Cit9CisKKy0gKGlkKWluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgIH0KKyAgICByZXR1cm4gKHNlbGYpOworfQorCitAZW5kCisKKy8qCisgKiBTdGFydCBvZiBBTlRMUlN5bWJvbFN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlN5bWJvbFN0YWNrCisKKysoQU5UTFJTeW1ib2xTdGFjayAqKW5ld0FOVExSU3ltYm9sU3RhY2sKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0XTsKK30KKworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0V2l0aExlbjpjbnRdOworfQorCistKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpjbnRdKSAhPSBuaWwpIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZQoreworICAgIHJldHVybiBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsKK30KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKWdldEhhc2hNYXBFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggKEFOVExSU3ltYm9sc1Njb3BlICopW3N1cGVyIG9iamVjdEF0SW5kZXg6aWR4XSApOworfQorCistKEFOVExSU3ltYm9sc1Njb3BlICoqKWdldEhhc2hNYXAKK3sKKwlyZXR1cm4oIChBTlRMUlN5bWJvbHNTY29wZSAqKilwdHJCdWZmZXIgKTsKK30KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKSBwb3AKK3sKKyAgICByZXR1cm4gKEFOVExSU3ltYm9sc1Njb3BlICopW3N1cGVyIHBvcF07Cit9CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJTeW1ib2xzU2NvcGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbaWR4XSAhPSBuaWwpIFtwdHJCdWZmZXJbaWR4XSByZWxlYXNlXTsKKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltpZHhdID0gYVJ1bGU7Cit9CisKKy0gKEFOVExSU3ltYm9sc1Njb3BlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIHJldHVybiAoQU5UTFJTeW1ib2xzU2NvcGUgKilbc3VwZXIgb2JqZWN0QXRJbmRleDppZHhdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1OWU3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaApAQCAtMCwwICsxLDQxIEBACisvLworLy8gIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEtheSBSw7Zwa2Ugb24gMDMuMTIuMjAwNi4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25Ub2tlbihEZWJ1Z2dlclN1cHBvcnQpCisKKy0gKE5TU3RyaW5nICopZGVidWdnZXJEZXNjcmlwdGlvbjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVG9rZW4uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRva2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ1MjRmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRva2VuLmgKQEAgLTAsMCArMSw3OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUlRva2VuVHlwZUVPRiA9IC0xLAorCUFOVExSVG9rZW5UeXBlSW52YWxpZCwKKwlBTlRMUlRva2VuVHlwZUVPUiwKKwlBTlRMUlRva2VuVHlwZURPV04sCisJQU5UTFJUb2tlblR5cGVVUCwKKwlBTlRMUlRva2VuVHlwZU1JTgorfSBBTlRMUlRva2VuVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgPSAwLAorICAgIEFOVExSVG9rZW5DaGFubmVsSGlkZGVuID0gOTkKK30gQU5UTFJUb2tlbkNoYW5uZWw7CisKKyNkZWZpbmUgSElEREVOIDk5CisKK0Bwcm90b2NvbCBBTlRMUlRva2VuIDwgTlNPYmplY3QsIE5TQ29weWluZyA+CisKKy8vIFRoZSBzaW5nbGV0b24gZW9mVG9rZW4gaW5zdGFuY2UuCisrIChpZDxBTlRMUlRva2VuPikgZW9mVG9rZW47CisvLyBUaGUgZGVmYXVsdCBjaGFubmVsIGZvciB0aGlzIGNsYXNzIG9mIFRva2VucworKyAoQU5UTFJUb2tlbkNoYW5uZWwpIGRlZmF1bHRDaGFubmVsOworCisvLyBwcm92aWRlIGhvb2tzIHRvIGV4cGxpY2l0ZWx5IHNldCB0aGUgdGV4dCBhcyBvcHBvc2VkIHRvIHVzZSB0aGUgaW5kaWNlcyBpbnRvIHRoZSBDaGFyU3RyZWFtCistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOworLSAodm9pZCkgc2V0VHlwZTogKE5TSW50ZWdlcikgYVR5cGU7CisKKy8vIEFOVExSIHYzIHByb3ZpZGVzIGF1dG9tYXRpYyBsaW5lIGFuZCBwb3NpdGlvbiB0cmFja2luZy4gU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0bworLy8gb3ZlcnJpZGUgdGhlc2UsIGlmIHRoZXkgZG8gbm90IHdhbnQgdG8gc3RvcmUgbGluZS9wb3MgdHJhY2tpbmcgaW5mb3JtYXRpb24KKy0gKE5TVUludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOiAoTlNVSW50ZWdlcikgYUxpbmU7CisKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTogKE5TVUludGVnZXIpIGFDaGFyUG9zaXRpb25JbkxpbmU7CisKKy8vIGV4cGxpY2l0ZWx5IGNoYW5nZSB0aGUgY2hhbm5lbCB0aGlzIFRva2VuIGlzIG9uLiBUaGUgZGVmYXVsdCBwYXJzZXIgaW1wbGVtZW50YXRpb24KKy8vIGp1c3Qgc2VlcyB0aGUgZGVmYXVsdENoYW5uZWwKKy8vIENvbW1vbiBpZGlvbSBpcyB0byBwdXQgd2hpdGVzcGFjZSB0b2tlbnMgb24gY2hhbm5lbCA5OS4KKy0gKE5TVUludGVnZXIpIGdldENoYW5uZWw7CistICh2b2lkKSBzZXRDaGFubmVsOiAoTlNVSW50ZWdlcikgYUNoYW5uZWw7CisKKy8vIHRoZSBpbmRleCBvZiB0aGlzIFRva2VuIGludG8gdGhlIFRva2VuU3RyZWFtCistIChOU1VJbnRlZ2VyKSBnZXRUb2tlbkluZGV4OworLSAodm9pZCkgc2V0VG9rZW5JbmRleDogKE5TVUludGVnZXIpIGFUb2tlbkluZGV4OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg2ODFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8vCisvLyAgQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisjaW1wb3J0ICJBTlRMUk1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKworLy8gRGVmaW5lIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBoaWVyYXJjaHkKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVPcGVyYXRpb24gOiBBTlRMUkNvbW1vblRva2VuU3RyZWFtCit7CisvKiogV2hhdCBpbmRleCBpbnRvIHJld3JpdGVzIExpc3QgYXJlIHdlPyAqLworTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CisvKiogVG9rZW4gYnVmZmVyIGluZGV4LiAqLworTlNJbnRlZ2VyIGluZGV4OworTlNTdHJpbmcgKnRleHQ7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldEluc3RydWN0aW9uSW5kZXgsIHNldHRlcj1zZXRJbnN0cnVjdGlvbkluZGV4OikgTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CitAcHJvcGVydHkgKGdldHRlcj1nZXRJbmRleCwgc2V0dGVyPXNldEluZGV4OikgTlNJbnRlZ2VyIGluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworCisrIChBTlRMUlJld3JpdGVPcGVyYXRpb24gKikgbmV3QU5UTFJSZXdyaXRlT3BlcmF0aW9uOihOU0ludGVnZXIpaW5kZXggVGV4dDooTlNTdHJpbmcgKil0ZXh0OworCistIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCisvKiogRXhlY3V0ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gYnkgcG9zc2libHkgYWRkaW5nIHRvIHRoZSBidWZmZXIuCisgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB0b2tlbiB0byBvcGVyYXRlIG9uLgorICovCistIChOU0ludGVnZXIpIGV4ZWN1dGU6KE5TU3RyaW5nICopYnVmOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNJbnRlZ2VyKSBpbmRleE9mOihjaGFyKWFDaGFyIGluU3RyaW5nOihOU1N0cmluZyAqKWFTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJJbnNlcnRCZWZvcmVPcCA6IEFOVExSUmV3cml0ZU9wZXJhdGlvbiB7Cit9CisKKysgKEFOVExSSW5zZXJ0QmVmb3JlT3AgKikgbmV3QU5UTFJJbnNlcnRCZWZvcmVPcDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAoaWQpIGluaXRXaXRoSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworQGVuZAorCisvKiogSSdtIGdvaW5nIHRvIHRyeSByZXBsYWNpbmcgcmFuZ2UgZnJvbSB4Li55IHdpdGggKHkteCkrMSBSZXBsYWNlT3AKKyAqICBpbnN0cnVjdGlvbnMuCisgKi8KK0BpbnRlcmZhY2UgQU5UTFJSZXBsYWNlT3AgOiBBTlRMUlJld3JpdGVPcGVyYXRpb24geworICAgIE5TSW50ZWdlciBsYXN0SW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RJbmRleCwgc2V0dGVyPXNldExhc3RJbmRleDopIE5TSW50ZWdlciBsYXN0SW5kZXg7CisKKysgKEFOVExSUmVwbGFjZU9wICopIG5ld0FOVExSUmVwbGFjZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcqKXRoZVRleHQ7CistIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBleGVjdXRlOihOU1N0cmluZyAqKWJ1ZjsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkRlbGV0ZU9wIDogQU5UTFJSZXBsYWNlT3AgeworfQorKyAoQU5UTFJEZWxldGVPcCAqKSBuZXdBTlRMUkRlbGV0ZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CisKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtIDogQU5UTFJDb21tb25Ub2tlblN0cmVhbSB7CisvKiogWW91IG1heSBoYXZlIG11bHRpcGxlLCBuYW1lZCBzdHJlYW1zIG9mIHJld3JpdGUgb3BlcmF0aW9ucy4KKyAqICBJJ20gY2FsbGluZyB0aGVzZSB0aGluZ3MgInByb2dyYW1zLiIKKyAqICBNYXBzIFN0cmluZyAobmFtZSkgLT4gcmV3cml0ZSAoTGlzdCkKKyAqLworQU5UTFJIYXNoTWFwICpwcm9ncmFtczsKKworLyoqIE1hcCBTdHJpbmcgKHByb2dyYW0gbmFtZSkgLT4gSW50ZWdlciBpbmRleCAqLworQU5UTFJIYXNoTWFwICpsYXN0UmV3cml0ZVRva2VuSW5kZXhlczsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQcm9ncmFtcywgc2V0dGVyPXNldFByb2dyYW1zOikgQU5UTFJIYXNoTWFwICpwcm9ncmFtczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TGFzdFJld3JpdGVUb2tlbkluZGV4ZXMsIHNldHRlcj1zZXRMYXN0UmV3cml0ZVRva2VuSW5kZXhlczopIEFOVExSSGFzaE1hcCAqbGFzdFJld3JpdGVUb2tlbkluZGV4ZXM7CisKKysgKEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtICopbmV3QU5UTFJUb2tlblJld3JpdGVTdHJlYW07CisrIChBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSAqKW5ld0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtOihpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlOworKyAoQU5UTFJUb2tlblJld3JpdGVTdHJlYW0gKiluZXdBTlRMUlRva2VuUmV3cml0ZVN0cmVhbTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZSBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKGlkKSBpbml0OworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlOworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbDsKKworLSAoQU5UTFJIYXNoTWFwICopZ2V0UHJvZ3JhbXM7CistICh2b2lkKXNldFByb2dyYW1zOihBTlRMUkhhc2hNYXAgKilhUHJvZ0xpc3Q7CisKKy0gKHZvaWQpIHJvbGxiYWNrOihOU0ludGVnZXIpaW5zdHJ1Y3Rpb25JbmRleDsKKy0gKHZvaWQpIHJvbGxiYWNrOihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnN0cnVjdGlvbkluZGV4OworLSAodm9pZCkgZGVsZXRlUHJvZ3JhbTsKKy0gKHZvaWQpIGRlbGV0ZVByb2dyYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWU7CistICh2b2lkKSBpbnNlcnRBZnRlclRva2VuOihpZDxBTlRMUlRva2VuPil0IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEFmdGVySW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEFmdGVyUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCisKKy0gKHZvaWQpIGluc2VydEJlZm9yZVRva2VuOihpZDxBTlRMUlRva2VuPil0IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEJlZm9yZUluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSBpbnNlcnRCZWZvcmVQcm9nTmFtZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilpbmRleFQgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZVByb2dOYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgZGVsZXRlOihOU0ludGVnZXIpYW5JbmRleDsKKy0gKHZvaWQpIGRlbGV0ZTooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvOworLSAodm9pZCkgZGVsZXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWluZGV4VDsKKy0gKHZvaWQpIGRlbGV0ZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0bzsKKy0gKHZvaWQpIGRlbGV0ZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWZyb20gVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdG87CistICh2b2lkKSBkZWxldGU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CistIChOU0ludGVnZXIpZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OworLSAoTlNJbnRlZ2VyKWdldExhc3RSZXdyaXRlVG9rZW5JbmRleDooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKHZvaWQpc2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnQ7CistIChBTlRMUkhhc2hNYXAgKikgZ2V0UHJvZ3JhbTooTlNTdHJpbmcgKiluYW1lOworLSAoQU5UTFJIYXNoTWFwICopIGluaXRpYWxpemVQcm9ncmFtOihOU1N0cmluZyAqKW5hbWU7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc6KE5TSW50ZWdlcilzdGFydCBFbmQ6KE5TSW50ZWdlcillbmQ7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNTdHJpbmcgKil0b1N0cmluZzooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydCBUb0VuZDooTlNJbnRlZ2VyKWVuZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnQgVG9FbmQ6KE5TSW50ZWdlcillbmQ7CistIChBTlRMUkhhc2hNYXAgKilyZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4OihBTlRMUkhhc2hNYXAgKilyZXdyaXRlczsKKy0gKEFOVExSSGFzaE1hcCAqKWdldEtpbmRPZk9wczooQU5UTFJIYXNoTWFwICopcmV3cml0ZXMgS2luZE9mQ2xhc3M6KENsYXNzKWtpbmQ7CistIChBTlRMUkhhc2hNYXAgKilnZXRLaW5kT2ZPcHM6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzIEtpbmRPZkNsYXNzOihDbGFzcylraW5kIEluZGV4OihOU0ludGVnZXIpYmVmb3JlOworLSAoTlNTdHJpbmcgKiljYXRPcFRleHQ6KGlkKWEgUHJldlRleHQ6KGlkKWI7CistIChOU011dGFibGVTdHJpbmcgKil0b0RlYnVnU3RyaW5nOworLSAoTlNNdXRhYmxlU3RyaW5nICopdG9EZWJ1Z1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0IFRvRW5kOihOU0ludGVnZXIpZW5kOworICAgICAgICAgICAgICAgICAgICAKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRva2VuU291cmNlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUb2tlblNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkNmI2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUb2tlblNvdXJjZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworLy8gQW55dGhpbmcgdGhhdCByZXNwb25kcyB0byAtbmV4dFRva2VuIGNhbiBiZSB0cmVhdGVkIGFzIGEgbGV4ZXIuCisvLyBGb3IgaW5zdGFuY2UgdGhpcyBjYW4gYmUgYSBmbGV4IGxleGVyIG9yIGEgaGFuZHdyaXR0ZW4gb25lIG9yIGV2ZW4KKy8vIGEgcHJveHkgZm9yIGEgcmVtb3RlbHkgcnVubmluZyB0b2tlbiBzb3VyY2UgKGRhdGFiYXNlLCBsZXhlciwgd2hhdGV2ZXIpLgorQHByb3RvY29sIEFOVExSVG9rZW5Tb3VyY2UgPE5TT2JqZWN0LCBOU0NvcHlpbmc+CisKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVG9rZW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTA0NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAcHJvdG9jb2wgQU5UTFJUb2tlblN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLy8gR2V0IFRva2VuIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgVG9rZW4uCisvLyBpPDAgaW5kaWNhdGVzIHRva2VucyBpbiB0aGUgcGFzdC4gIFNvIC0xIGlzIHByZXZpb3VzIHRva2VuIGFuZCAtMiBpcworLy8gdHdvIHRva2VucyBhZ28uIExUOjAgaXMgdW5kZWZpbmVkLiAgRm9yIGk+PW4sIHJldHVybiBUb2tlbi5FT0ZUb2tlbi4KKy8vIFJldHVybiBudWxsIGZvciBMVDowIGFuZCBhbnkgaW5kZXggdGhhdCByZXN1bHRzIGluIGFuIGFic29sdXRlIGFkZHJlc3MKKy8vIHRoYXQgaXMgbmVnYXRpdmUuCisKKy0gKGlkPEFOVExSVG9rZW4+KSBMVDooTlNJbnRlZ2VyKSBpOworCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TVUludGVnZXIpIGk7CisKKy0gKGlkKSBnZXRUb2tlblNvdXJjZTsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisvKiogUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgKiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSB0b2tlbnMgdGhlbiBpdCBjYW4ganVzdAorICogIHJldHVybiAiIiBvciBudWxsOyAgVXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgKiAgYW4gYWN0aW9uIG9mIGNvdXJzZSBpbiB0aGF0IGNhc2UuCisgKi8KKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydElkeCBUb0VuZDooTlNJbnRlZ2VyKXN0b3BJZHg7CisKKy8qKiBCZWNhdXNlIHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UgYSB0b2tlbiB3aXRoIGFuIGluZGV4IHN0b3JlZAorICogIGluIGl0LCB3ZSBtdXN0IHByb3ZpZGUgYSBtZWFucyBmb3IgdHdvIHRva2VuIG9iamVjdHMgdGhlbXNlbHZlcyB0bworICogIGluZGljYXRlIHRoZSBzdGFydC9lbmQgbG9jYXRpb24uICBNb3N0IG9mdGVuIHRoaXMgd2lsbCBqdXN0IGRlbGVnYXRlCisgKiAgdG8gdGhlIG90aGVyIHRvU3RyaW5nKGludCxpbnQpLiAgVGhpcyBpcyBhbHNvIHBhcmFsbGVsIHdpdGgKKyAqICB0aGUgVHJlZU5vZGVTdHJlYW0udG9TdHJpbmcoT2JqZWN0LE9iamVjdCkuCisgKi8KKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjI2OWIyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWUuaApAQCAtMCwwICsxLDEyMyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0Bwcm90b2NvbCBBTlRMUlRyZWUgPCBOU09iamVjdCwgTlNDb3B5aW5nID4KKworLy8rIChpZDxBTlRMUlRyZWU+KSBpbnZhbGlkTm9kZTsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaW5kZXg7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBUcmVlIHRyYWNrcyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IG5vdyA+IDMuMAorCistIChpZDxBTlRMUlRyZWU+KWdldFBhcmVudDsKKworLSAodm9pZCkgc2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CisKKy8qKiBJcyB0aGVyZSBpcyBhIG5vZGUgYWJvdmUgd2l0aCB0b2tlbiB0eXBlIHR0eXBlPyAqLworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKworLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CisKKy8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAqLworLSAoTlNNdXRhYmxlQXJyYXkgKikgZ2V0QW5jZXN0b3JzOworCisvKiogVGhpcyBub2RlIGlzIHdoYXQgY2hpbGQgaW5kZXg/IDAuLm4tMSAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworCistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCisvKiogU2V0IHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IHZhbHVlcyBmb3IgYWxsIGNoaWxkcmVuICovCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworCisvKiogQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisgKiAgaXMgbmlsLCBhZGQgYWxsIGNoaWxkcmVuIG9mIHQgdG8gdGhpcycgY2hpbGRyZW4uCisgKi8KKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUlRyZWU+KSB0OworCisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KE5TSW50ZWdlcilpIFdpdGg6KGlkPEFOVExSVHJlZT4pIHQ7CisKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNJbnRlZ2VyKSBpOworCisvKiogRGVsZXRlIGNoaWxkcmVuIGZyb20gc3RhcnQgdG8gc3RvcCBhbmQgcmVwbGFjZSB3aXRoIHQgZXZlbiBpZiB0IGlzCisgKiAgYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgKiAgY2hpbGRyZW4gdG8gc2V0IHRoZWlyIGNoaWxkaW5kZXg7IGNvdWxkIGJlIHNsb3cuCisgKi8KKy0gKHZvaWQpIHJlcGxhY2VDaGlsZHJlbkZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZCl0OwkKKworLSAoTlNBcnJheSAqKSBnZXRDaGlsZHJlbjsKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhIG5pbCBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworCisvKiogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CisKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKSBpbmRleDsKKworLyoqICBXaGF0IGlzIHRoZSBsYXJnZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCistIChpZDxBTlRMUlRyZWU+KSBkdXBOb2RlOworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKworI3ByYWdtYSBtYXJrIENvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOwkvLyB0aGUgY2hpbGRyZW4gdGhlbXNlbHZlcyBhcmUgbm90IGNvcGllZCBoZXJlIQorLSAoaWQpIGRlZXBDb3B5OwkJCQkJLy8gcGVyZm9ybXMgYSBkZWVwQ29weVdpdGhab25lOiB3aXRoIHRoZSBkZWZhdWx0IHpvbmUKKy0gKGlkKSBkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworI3ByYWdtYSBtYXJrIFRyZWUgUGFyc2VyIHN1cHBvcnQKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKXBvczsKKworI3ByYWdtYSBtYXJrIEluZm9ybWF0aW9uYWwKKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlQWRhcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2NTc5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlQWRhcHRvci5oCkBAIC0wLDAgKzEsMTU5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorCisjcHJhZ21hIHdhcm5pbmcgdHJlZS9ub2RlIGRpY3Rpb24gaXMgYnJva2VuLgorCitAcHJvdG9jb2wgQU5UTFJUcmVlQWRhcHRvciA8TlNPYmplY3QsIE5TQ29weWluZz4KKworI3ByYWdtYSBtYXJrIENvbnN0cnVjdGlvbgorCisrIChpZDxBTlRMUlRyZWU+KSBuZXdFbXB0eVRyZWU7CisKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVBZGFwdG9yIGltcGxlbWVudGF0aW9uCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU6KGlkPEFOVExSVHJlZT4pYU5vZGU7CS8vIGNvcGllcyBqdXN0IHRoZSBub2RlCistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CS8vIGNvcGllcyB0aGUgZW50aXJlIHN1YnRyZWUsIHJlY3Vyc2l2ZWx5CisKKy8qKiBSZXR1cm4gYSBuaWwgbm9kZSAoYW4gZW1wdHkgYnV0IG5vbi1udWxsIG5vZGUpIHRoYXQgY2FuIGhvbGQKKyAqICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICogIHVzZSAidD1hZGFwdG9yLm5pbCgpOyB0LmFkZENoaWxkKHgpOyB0LmFkZENoaWxkKHkpOyIKKyAqLworLSAoaWQpIGVtcHR5Tm9kZTsKKworLyoqIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAqICB0b2tlbnMgY29uc3VtZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5LiAgVGhlIHN0YXJ0IHRva2VuIGluZGljYXRlcyB0aGUKKyAqICBpbnB1dCBzeW1ib2wgYXQgd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gIFRoZSBzdG9wIHRva2VuIGluZGljYXRlcworICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGlucHV0IHN0cmVhbSBzbyB0aGF0IHRoZSBlcnJvbmVvdXMgdGV4dCBjYW4KKyAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgKiAgdG8gc29tZSBhcHBsaWNhdGlvbnM7IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3RvcmVzIHB0ciB0byBpdCBpbgorICogIHRoZSBDb21tb25FcnJvck5vZGUuCisgKgorICogIFRoaXMgb25seSBtYWtlcyBzZW5zZSBkdXJpbmcgdG9rZW4gcGFyc2luZywgbm90IHRyZWUgcGFyc2luZy4KKyAqICBUcmVlIHBhcnNpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gcGFyc2luZyBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24KKyAqICBzdWNjZWVkLgorICovCistIChpZCkgZXJyb3JOb2RlOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICBGcm9tOihpZDxBTlRMUlRva2VuPilhU3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pYVN0b3BUb2tlbgorICAgICAgIEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKikgZTsKKworLyoqIElzIHRyZWUgY29uc2lkZXJlZCBhIG5pbCBub2RlIHVzZWQgdG8gbWFrZSBsaXN0cyBvZiBjaGlsZCBub2Rlcz8gKi8KKy0gKEJPT0wpIGlzTmlsOihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisKKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUlRyZWU+KWNoaWxkIHRvVHJlZTooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLyoqIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAqCisgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAqCisgKiAgICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgKgorICogIFJldHVybiBuZXdSb290LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5ld1Jvb3QgaXMgbm90IGEKKyAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAqCisgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAqICBjb25zdHJ1Y3RpbmcgdGhlc2Ugbm9kZXMgc28gd2Ugc2hvdWxkIGhhdmUgdGhpcyBjb250cm9sIGZvcgorICogIGVmZmljaWVuY3kuCisgKi8KKy0gKGlkKSBiZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KW5ld1Jvb3Qgb2xkOihpZDxBTlRMUlRyZWU+KW9sZFJvb3Q7CisKKy0gKGlkKSBydWxlUG9zdFByb2Nlc3Npbmc6KGlkPEFOVExSVHJlZT4pcm9vdDsKKworI3ByYWdtYSBtYXJrIFJld3JpdGUgUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLSAoTlNVSW50ZWdlcikgZ2V0VW5pcXVlSUQ6KGlkPEFOVExSVHJlZT4pYU5vZGU7CisKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW47CistIChpZDxBTlRMUlRyZWU+KSBjcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIEZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0ZXh0OworCisjcHJhZ21hIG1hcmsgQ29udGVudAorCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU6KGlkPEFOVExSVHJlZT4pYU5vZGU7CistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CisKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKHZvaWQpIHNldFR5cGU6KGlkPEFOVExSVHJlZT4pYU5vZGUgVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKHZvaWQpIHNldFRleHQ6KGlkPEFOVExSVHJlZT4pYU5vZGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooaWQ8QU5UTFJUcmVlPil0OworCistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXM6KGlkPEFOVExSVHJlZT4pYVRyZWUgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg6KGlkPEFOVExSVHJlZT4pYVRyZWU7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisjcHJhZ21hIG1hcmsgTmF2aWdhdGlvbiAvIFRyZWUgUGFyc2luZworCisvKiogR2V0IGEgY2hpbGQgMC4ubi0xIG5vZGUgKi8KKy0gKGlkPEFOVExSVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUlRyZWU+KWFOb2RlIEF0OihOU0ludGVnZXIpIGk7CisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkPEFOVExSVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJUcmVlPiljaGlsZDsKKy8qKiBSZW1vdmUgaXRoIGNoaWxkIGFuZCBzaGlmdCBjaGlsZHJlbiBkb3duIGZyb20gcmlnaHQuICovCistIChpZDxBTlRMUlRyZWU+KSBkZWxldGVDaGlsZDooaWQ8QU5UTFJUcmVlPil0IEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy8qKiBIb3cgbWFueSBjaGlsZHJlbj8gIElmIDAsIHRoZW4gdGhpcyBpcyBhIGxlYWYgbm9kZSAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZENvdW50OihpZDxBTlRMUlRyZWU+KSBhVHJlZTsKKworLyoqIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdC4KKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoaWQ8QU5UTFJUcmVlPilnZXRQYXJlbnQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpIHNldFBhcmVudDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KGlkPEFOVExSVHJlZT4pcGFyZW50OworCisvKiogV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKSBzZXRDaGlsZEluZGV4OihpZDxBTlRMUlRyZWU+KXQgV2l0aDooTlNJbnRlZ2VyKWluZGV4OworCistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KGlkPEFOVExSVHJlZT4pcGFyZW50IEZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZDxBTlRMUlRyZWU+KXQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZWM1YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlRXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJaWQ8QU5UTFJUcmVlPiBvbGRSb290OworCWlkPEFOVExSVHJlZT4gbmV3Um9vdDsKK30KKworKyAoaWQpIGV4Y2VwdGlvbldpdGhPbGRSb290OihpZDxBTlRMUlRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CistIChpZCkgaW5pdFdpdGhPbGRSb290OihpZDxBTlRMUlRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CisKKy0gKHZvaWQpIHNldE9sZFJvb3Q6KGlkPEFOVExSVHJlZT4pYVRyZWU7CistICh2b2lkKSBzZXROZXdSb290OihpZDxBTlRMUlRyZWU+KWFUcmVlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlSXRlcmF0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDVlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlSXRlcmF0b3IuaApAQCAtMCwwICsxLDY3IEBACisvLworLy8gIEFOVExSVHJlZUl0ZXJhdG9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI2LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJGYXN0UXVldWUuaCIKKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVHJlZUl0ZXJhdG9yIDogTlNPYmplY3QgCit7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKwlpZDxBTlRMUlRyZWU+IHJvb3Q7CisJaWQ8QU5UTFJUcmVlPiB0cmVlOworCUJPT0wgZmlyc3RUaW1lOworCWlkPEFOVExSVHJlZT4gdXA7CisJaWQ8QU5UTFJUcmVlPiBkb3duOworCWlkPEFOVExSVHJlZT4gZW9mOworCQorCUFOVExSRmFzdFF1ZXVlICpub2RlczsKK30KKworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUlRyZWU+IHVwOworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUlRyZWU+IGRvd247CitAcHJvcGVydHkocmV0YWluLCByZWFkd3JpdGUpIGlkPEFOVExSVHJlZT4gZW9mOworCisrIG5ld0FOVFJMVHJlZUl0ZXJhdG9yOworKyAoQU5UTFJUcmVlSXRlcmF0b3IgKikgbmV3QU5UUkxUcmVlSXRlcmF0b3JXaXRoQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZFRyZWU6KGlkPEFOVExSVHJlZT4pdHJlZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVHJlZTooaWQ8QU5UTFJUcmVlPikgdDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPikgYSBhbmRUcmVlOihpZDxBTlRMUlRyZWU+KSB0OworCistICh2b2lkKSByZXNldDsKKy0gKEJPT0wpIGhhc05leHQ7CistIChpZCkgbmV4dE9iamVjdDsKKy0gKE5TQXJyYXkgKikgYWxsT2JqZWN0czsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZU5vZGVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmY2MzQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVOb2RlU3RyZWFtLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKworQHByb3RvY29sIEFOVExSVHJlZU5vZGVTdHJlYW0gPCBBTlRMUkludFN0cmVhbSA+IAorCistIChpZCkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KXRoZUFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIExUOihOU0ludGVnZXIpazsKKy0gKGlkKSBnZXRUcmVlU291cmNlOworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGdldFRva2VuU3RyZWFtOyAKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClmbGFnOworCistIChpZCkgZ2V0Tm9kZTooTlNJbnRlZ2VyKSBpZHg7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKXN0YXJ0Tm9kZSBUb05vZGU6KGlkKXN0b3BOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTJmMDFlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVQYXJzZXIuaApAQCAtMCwwICsxLDg5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVJlY29nbml6ZXIuaCIKKyNpbXBvcnQgIkFOVExSVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGFyc2VyIDogQU5UTFJCYXNlUmVjb2duaXplciB7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0SW5wdXQsIHNldHRlcj1zZXRJbnB1dDopIGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+IGlucHV0OworCisrIChpZCkgbmV3QU5UTFJUcmVlUGFyc2VyOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0FOVExSVHJlZVBhcnNlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVJbnB1dDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlSW5wdXQKKyAgICAgICAgICAgICAgICBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworCistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0OworCistICh2b2lkKSBzZXRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGFuSW5wdXQ7CistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgZ2V0VHJlZU5vZGVTdHJlYW07CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoaWQpIGdldEN1cnJlbnRJbnB1dFN5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0OworCistIChpZCkgZ2V0TWlzc2luZ1N5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KWlucHV0CisgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKSBlCisgICAgICAgICAgRXhwZWN0ZWRUb2tlbjooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICBCaXRTZXQ6KEFOVExSQml0U2V0ICopZm9sbG93OworCisvKiogTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKyAqICBlbnRpcmUgdHJlZSBpZiBub2RlIGhhcyBjaGlsZHJlbi4gIElmIGNoaWxkcmVuLCBzY2FuIHVudGlsCisgKiAgY29ycmVzcG9uZGluZyBVUCBub2RlLgorICovCistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWlnbm9yZTsKKworLyoqIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgorICogIHBsdXMgd2Ugd2FudCB0byBhbHRlciB0aGUgZXhjZXB0aW9uIHR5cGUuICBEb24ndCB0cnkgdG8gcmVjb3ZlcgorICogIGZyb20gdHJlZSBwYXJzZXIgZXJyb3JzIGlubGluZS4uLgorICovCistIChpZCkgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcil0dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLyoqIFByZWZpeCBlcnJvciBtZXNzYWdlIHdpdGggdGhlIGdyYW1tYXIgbmFtZSBiZWNhdXNlIG1lc3NhZ2UgaXMKKyAqICBhbHdheXMgaW50ZW5kZWQgZm9yIHRoZSBwcm9ncmFtbWVyIGJlY2F1c2UgdGhlIHBhcnNlciBidWlsdAorICogIHRoZSBpbnB1dCB0cmVlIG5vdCB0aGUgdXNlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CisKKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihOU0FycmF5ICopIHRva2VuTmFtZXM7CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKSB0cmFjZU91dDooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA1OWQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5MZXhlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vCisvLyAgQU5UTFJUcmVlUGF0dGVybkxleGVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUkxleGVyVG9rZW5UeXBlRU9GID0gLTEsCisJQU5UTFJMZXhlclRva2VuVHlwZUludmFsaWQsCisJQU5UTFJMZXhlclRva2VuVHlwZUJFR0lOLAorCUFOVExSTGV4ZXJUb2tlblR5cGVFTkQsCisJQU5UTFJMZXhlclRva2VuVHlwZUlELAorCUFOVExSTGV4ZXJUb2tlblR5cGVBUkcsCisJQU5UTFJMZXhlclRva2VuVHlwZVBFUkNFTlQsCisJQU5UTFJMZXhlclRva2VuVHlwZUNPTE9OLAorCUFOVExSTGV4ZXJUb2tlblR5cGVET1QsCit9IEFOVExSTGV4ZXJUb2tlblR5cGU7CisKKworQGludGVyZmFjZSBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgOiBOU09iamVjdCB7CisKKy8qKiBUaGUgdHJlZSBwYXR0ZXJuIHRvIGxleCBsaWtlICIoQSBCIEMpIiAqLworTlNTdHJpbmcgKnBhdHRlcm47CisgICAgCisvKiogSW5kZXggaW50byBpbnB1dCBzdHJpbmcgKi8KK05TSW50ZWdlciBwOworICAgIAorLyoqIEN1cnJlbnQgY2hhciAqLworTlNJbnRlZ2VyIGM7CisgICAgCisvKiogSG93IGxvbmcgaXMgdGhlIHBhdHRlcm4gaW4gY2hhcj8gKi8KK05TSW50ZWdlciBuOworICAgIAorLyoqIFNldCB3aGVuIHRva2VuIHR5cGUgaXMgSUQgb3IgQVJHIChuYW1lIG1pbWljcyBKYXZhJ3MgU3RyZWFtVG9rZW5pemVyKSAqLworTlNNdXRhYmxlRGF0YSAqc3ZhbDsKK2NoYXIgKmRhdGE7CisgICAgCitCT09MIGVycm9yOworCit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UGF0dGVybiwgc2V0dGVyPXNldFBhdHRlcm46KSBOU1N0cmluZyAqcGF0dGVybjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFAsIHNldHRlcj1zZXRQOikgTlNJbnRlZ2VyIHA7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDLCBzZXR0ZXI9c2V0QzopIE5TSW50ZWdlciBjOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0Tiwgc2V0dGVyPXNldE46KSBOU0ludGVnZXIgbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3ZhbCwgc2V0dGVyPXNldFN2YWw6KSBOU011dGFibGVEYXRhICpzdmFsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXREYXRhLCBzZXR0ZXI9c2V0RGF0YTopIGNoYXIgKmRhdGE7CitAcHJvcGVydHkgKGdldHRlcj1nZXRFcnJvciwgc2V0dGVyPXNldEVycm9yKSBCT09MIGVycm9yOworCisrIChBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuTGV4ZXI6KE5TU3RyaW5nICopYVBhdHRlcm47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFBhdHRlcm46KE5TU3RyaW5nICopYVBhdHRlcm47CistIChOU0ludGVnZXIpIG5leHRUb2tlbjsKKy0gKHZvaWQpIGNvbnN1bWU7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCistIChOU011dGFibGVEYXRhICopZ2V0U3ZhbDsKKy0gKHZvaWQpIHNldFN2YWw6KE5TTXV0YWJsZURhdGEgKilhU3ZhbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkNmRjNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKQEAgLTAsMCArMSw1NyBAQAorLy8KKy8vICBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZVBhdHRlcm5MZXhlci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlV2l6YXJkLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVyblBhcnNlciA6IE5TT2JqZWN0IHsKKworQU5UTFJUcmVlUGF0dGVybkxleGVyICp0b2tlbml6ZXI7CitOU0ludGVnZXIgdHR5cGU7CitBTlRMUlRyZWVXaXphcmQgKndpemFyZDsKK2lkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7CisgICAgCit9CisKKysgKEFOVExSVHJlZVBhdHRlcm5QYXJzZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyOihBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKilhVG9rZW5pemVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5pemVyOihBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKil0b2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICBBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3I7CistIChpZDxBTlRMUlRyZWU+KSBwYXR0ZXJuOworLSAoaWQ8QU5UTFJUcmVlPikgcGFyc2VUcmVlOworLSAoaWQ8QU5UTFJUcmVlPikgcGFyc2VOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlUmV3cml0ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVSZXdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTg3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlUmV3cml0ZXIuaApAQCAtMCwwICsxLDcyIEBACisvLworLy8gIEFOVExSVHJlZVJld3JpdGVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZVBhcnNlci5oIgorCitAaW50ZXJmYWNlIEFOVExSZnB0ciA6IE5TT2JqZWN0IHsKKyAgICBpZCAgYWN0b3I7CisgICAgU0VMIHJ1bGVTRUw7Cit9CisKKysgKEFOVExSZnB0ciAqKW5ld0FOVExSZnB0cldpdGhSdWxlOihTRUwpYVJ1bGVBY3Rpb24gd2l0aE9iamVjdDooaWQpYW5PYmplY3Q7CistaW5pdFdpdGhSdWxlOihTRUwpcnVsZUFjdGlvbiB3aXRoT2JqZWN0OihpZClhbk9iamVjdDsKKworLSAoaWQpcnVsZTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZVJld3JpdGVyIDogQU5UTFJUcmVlUGFyc2VyIHsKKyAgICBCT09MIHNob3dUcmFuc2Zvcm1hdGlvbnM7CisgICAgaWQ8QU5UTFJUb2tlblN0cmVhbT4gb3JpZ2luYWxUb2tlblN0cmVhbTsKKyAgICBpZDxBTlRMUlRyZWVBZGFwdG9yPiBvcmlnaW5hbEFkYXB0b3I7CisgICAgQU5UTFJmcHRyICpydWxlOworICAgIEFOVExSZnB0ciAqdG9wZG93bl9mcHRyOworICAgIEFOVExSZnB0ciAqYm90dG9tdXBfZnRwcjsKK30KKworKyAoQU5UTFJUcmVlUmV3cml0ZXIgKikgbmV3QU5UTFJUcmVlUmV3cml0ZXI6KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQ7CisrIChBTlRMUlRyZWVSZXdyaXRlciAqKSBuZXdBTlRMUlRyZWVSZXdyaXRlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CistIChpZClpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKWluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGFwcGx5T25jZTooaWQ8QU5UTFJUcmVlPil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGFwcGx5UmVwZWF0ZWRseTooaWQ8QU5UTFJUcmVlPil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGRvd251cDooaWQ8QU5UTFJUcmVlPil0OworLSAoQU5UTFJUcmVlUmV3cml0ZXIgKikgcHJlOihpZDxBTlRMUlRyZWU+KXQ7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBwb3N0OihpZDxBTlRMUlRyZWU+KXQ7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBkb3dudXA6KGlkPEFOVExSVHJlZT4pdCBYRm9ybTooQk9PTClhU2hvd1RyYW5zZm9ybWF0aW9uczsKKy0gKHZvaWQpcmVwb3J0VHJhbnNmb3JtYXRpb246KGlkPEFOVExSVHJlZT4pb2xkVHJlZSBUcmVlOihpZDxBTlRMUlRyZWU+KW5ld1RyZWU7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSB0b3Bkb3duX2ZwdHI7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBib3R0b211cF9mdHByOworLSAoQU5UTFJUcmVlUmV3cml0ZXIgKikgdG9wZG93bjsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGJvdHRvbXVwOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4YTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQ5IEBACisvLworLy8gIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE3LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJ1bGVSZXR1cm5TY29wZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlIDogQU5UTFJSdWxlUmV0dXJuU2NvcGUgeworICAgIEFOVExSQ29tbW9uVHJlZSAqc3RhcnROb2RlOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBBTlRMUkNvbW1vblRyZWUgKnN0YXJ0Tm9kZTsKKworLyoqIEZpcnN0IG5vZGUgb3Igcm9vdCBub2RlIG9mIHRyZWUgbWF0Y2hlZCBmb3IgdGhpcyBydWxlLiAqLworCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRTdGFydDsKKy0gKHZvaWQpc2V0U3RhcnQ6KEFOVExSQ29tbW9uVHJlZSAqKWFTdGFydE5vZGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVWaXNpdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTY3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vCisvLyAgQU5UTFJUcmVlVmlzaXRvci5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlVmlzaXRvciA6IE5TT2JqZWN0IHsKKyAgIGlkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7Cit9CisrIChBTlRMUlRyZWVWaXNpdG9yICopbmV3QU5UTFJUcmVlVmlzaXRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGFuQWRhcHRvcjsKKysgKEFOVExSVHJlZVZpc2l0b3IgKiluZXdBTlRMUlRyZWVWaXNpdG9yOworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworLSAoQU5UTFJUcmVlVmlzaXRvciAqKXZpc2l0OihpZDxBTlRMUlRyZWU+KXQgQWN0aW9uOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopYWN0aW9uOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMwODU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaApAQCAtMCwwICsxLDU2IEBACisvLworLy8gIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlVmlzaXRvckFjdGlvbiA6IE5TT2JqZWN0Cit7CisKK30KKworKyAoQU5UTFJUcmVlVmlzaXRvckFjdGlvbiAqKW5ld0FOVExSVHJlZVZpc2l0b3JBY3Rpb247CistIChpZCkgaW5pdDsKKworLyoqIEV4ZWN1dGUgYW4gYWN0aW9uIGJlZm9yZSB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuICBDaGlsZHJlbiBvZiByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlCisgKiAgdmlzaXRlZCBpZiB1c2luZyBUcmVlVmlzaXRvci52aXNpdCgpLgorICovCistIChBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopcHJlOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQ7CisKKy8qKiBFeGVjdXRlIGFuIGFjdGlvbiBhZnRlciB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilwb3N0OihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVXaXphcmQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlRyZWVXaXphcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTUyNTcyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVHJlZVdpemFyZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvLworLy8gIEFOVExSVHJlZVdpemFyZC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSTWFwRWxlbWVudC5oIgorI2ltcG9ydCAiQU5UTFJNYXAuaCIKKworQGNsYXNzIEFOVExSVmlzaXRvcjsKKworQHByb3RvY29sIEFOVExSQ29udGV4dFZpc2l0b3IgPE5TT2JqZWN0PgorLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgY2FsbGVkIHZpc2l0IG9yIHNvbWV0aGluZyBlbHNlPworLSAodm9pZCkgdmlzaXQ6KGlkPEFOVExSVHJlZT4pdCBQYXJlbnQ6KGlkPEFOVExSVHJlZT4pcGFyZW50IENoaWxkSW5kZXg6KE5TSW50ZWdlciljaGlsZEluZGV4IE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlZpc2l0b3IgOiBOU09iamVjdCA8QU5UTFJDb250ZXh0VmlzaXRvcj4geworICAgIE5TSW50ZWdlciBhY3Rpb247CisgICAgaWQgYWN0b3I7CisgICAgaWQgb2JqZWN0MTsKKyAgICBpZCBvYmplY3QyOworfQorKyAoQU5UTFJWaXNpdG9yICopbmV3QU5UTFJWaXNpdG9yOihOU0ludGVnZXIpYW5BY3Rpb24gQWN0b3I6KGlkKWFuQWN0b3IgT2JqZWN0OihpZClhbk9iamVjdDEgT2JqZWN0OihpZClhbk9iamVjdDI7CistIChpZCkgaW5pdFdpdGhBY3Rpb246KE5TSW50ZWdlcilhbkFjdGlvbiBBY3RvcjooaWQpYW5BY3RvciBPYmplY3Q6KGlkKWFuT2JqZWN0MSBPYmplY3Q6KGlkKWFuT2JqZWN0MjsKKworLSAodm9pZCkgdmlzaXQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpIHZpc2l0OihpZDxBTlRMUlRyZWU+KXQgUGFyZW50OihpZDxBTlRMUlRyZWU+KXBhcmVudCBDaGlsZEluZGV4OihOU0ludGVnZXIpY2hpbGRJbmRleCBNYXA6KEFOVExSTWFwICopbGFiZWxzOworCitAZW5kCisKKy8qKiBXaGVuIHVzaW5nICVsYWJlbDpUT0tFTk5BTUUgaW4gYSB0cmVlIGZvciBwYXJzZSgpLCB3ZSBtdXN0CisgKiAgdHJhY2sgdGhlIGxhYmVsLgorICovCitAaW50ZXJmYWNlIEFOVExSVHJlZVBhdHRlcm4gOiBBTlRMUkNvbW1vblRyZWUgeworICAgIE5TU3RyaW5nICpsYWJlbDsKKyAgICBCT09MICAgICAgaGFzVGV4dEFyZzsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TGFiZWwsIHNldHRlcj1zZXRMYWJlbDopIE5TU3RyaW5nICpsYWJlbDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0SGFzVGV4dEFyZywgc2V0dGVyPXNldEhhc1RleHRBcmc6KSBCT09MIGhhc1RleHRBcmc7CisKKysgKEFOVExSVHJlZVBhdHRlcm4gKiluZXdBTlRMUlRyZWVQYXR0ZXJuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworCistIChpZCkgaW5pdFdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJXaWxkY2FyZFRyZWVQYXR0ZXJuIDogQU5UTFJUcmVlUGF0dGVybiB7Cit9CisKKysgKEFOVExSV2lsZGNhcmRUcmVlUGF0dGVybiAqKW5ld0FOVExSV2lsZGNhcmRUcmVlUGF0dGVybjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKy0gKGlkKSBpbml0V2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworQGVuZAorCisvKiogVGhpcyBhZGFwdG9yIGNyZWF0ZXMgVHJlZVBhdHRlcm4gb2JqZWN0cyBmb3IgdXNlIGR1cmluZyBzY2FuKCkgKi8KK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yIDogQU5UTFJDb21tb25UcmVlQWRhcHRvciB7Cit9CisrIChBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IgKiluZXdUcmVlQWRhcHRvcjsKKyNpZmRlZiBET05UVVNFTk9NTworKyAoQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yICopbmV3VHJlZUFkYXB0b3I6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisjZW5kaWYKKy0gKGlkKSBpbml0OworI2lmZGVmIERPTlRVU0VOT01PCistIGluaXRXaXRoVG9rZW46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisjZW5kaWYKKy0gKGlkPEFOVExSVHJlZT4pY3JlYXRlVHJlZVBhdHRlcm46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVXaXphcmQgOiBOU09iamVjdCB7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKwlBTlRMUk1hcCAqdG9rZW5OYW1lVG9UeXBlTWFwOworfQorKyAoQU5UTFJUcmVlV2l6YXJkICopIG5ld0FOVExSVHJlZVdpemFyZDooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yIE1hcDooQU5UTFJNYXAgKilhVG9rZW5OYW1lVG9UeXBlTWFwOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yIFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkV2l0aFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yOworLSAoaWQpIGluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBNYXA6KEFOVExSTWFwICopdG9rZW5OYW1lVG9UeXBlTWFwOworLSAoaWQpIGluaXRXaXRoVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChpZCkgaW5pdFdpdGhUb2tlbk5hbWVzOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChBTlRMUk1hcCAqKWNvbXB1dGVUb2tlblR5cGVzOihOU0FycmF5ICopdGhlVG9rTmFtczsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblR5cGU6KE5TU3RyaW5nICopdG9rZW5OYW1lOworLSAoQU5UTFJNYXAgKilpbmRleDooaWQ8QU5UTFJUcmVlPil0OworLSAodm9pZCkgX2luZGV4OihpZDxBTlRMUlRyZWU+KXQgTWFwOihBTlRMUk1hcCAqKW07CistIChOU011dGFibGVBcnJheSAqKWZpbmQ6KGlkPEFOVExSVHJlZT4pIHQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuOworLSAoQU5UTFJUcmVlV2l6YXJkICopZmluZEZpcnN0OihpZDxBTlRMUlRyZWU+KSB0IFR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKEFOVExSVHJlZVdpemFyZCAqKWZpbmRGaXJzdDooaWQ8QU5UTFJUcmVlPikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistICh2b2lkKSB2aXNpdDooaWQ8QU5UTFJUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0dHlwZSBWaXNpdG9yOihBTlRMUlZpc2l0b3IgKil2aXNpdG9yOworLSAodm9pZCkgX3Zpc2l0OihpZDxBTlRMUlRyZWU+KXQKKyAgICAgICAgIFBhcmVudDooaWQ8QU5UTFJUcmVlPilwYXJlbnQKKyAgICAgQ2hpbGRJbmRleDooTlNJbnRlZ2VyKWNoaWxkSW5kZXgKKyAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKXR0eXBlCisgICAgICAgIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistICh2b2lkKXZpc2l0OihpZDxBTlRMUlRyZWU+KXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistIChCT09MKXBhcnNlOihpZDxBTlRMUlRyZWU+KXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChCT09MKSBwYXJzZTooaWQ8QU5UTFJUcmVlPikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKSBfcGFyc2U6KGlkPEFOVExSVHJlZT4pdDEgUGF0dGVybjooQU5UTFJUcmVlUGF0dGVybiAqKXRwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChpZDxBTlRMUlRyZWU+KSBjcmVhdGVUcmVlOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKWVxdWFsczooaWQpdDEgTzI6KGlkKXQyIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKEJPT0wpZXF1YWxzOihpZCl0MSBPMjooaWQpdDI7CistIChCT09MKSBfZXF1YWxzOihpZCl0MSBPMjooaWQpdDIgQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllNzlkODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUgOiBOU09iamVjdCB7CisJQU5UTFJDb21tb25UcmVlICpjdXJyZW50Tm9kZTsKKwlBTlRMUkNvbW1vblRyZWUgKnByZXZpb3VzTm9kZTsKKworCWludCBjdXJyZW50Q2hpbGRJbmRleDsKKwlpbnQgYWJzb2x1dGVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IG5vZGVTdGFja1NpemU7CisJdW5zaWduZWQgaW50IGluZGV4U3RhY2tTaXplOworCQorCU5TTXV0YWJsZUFycmF5ICpsb29rYWhlYWQ7Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBjdXJyZW50Tm9kZTsKKy0gKHZvaWQpIHNldEN1cnJlbnROb2RlOiAoQU5UTFJDb21tb25UcmVlICopIGFDdXJyZW50Tm9kZTsKKworLSAoQU5UTFJDb21tb25UcmVlICopIHByZXZpb3VzTm9kZTsKKy0gKHZvaWQpIHNldFByZXZpb3VzTm9kZTogKEFOVExSQ29tbW9uVHJlZSAqKSBhUHJldmlvdXNOb2RlOworCistIChOU0ludGVnZXIpIGN1cnJlbnRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q3VycmVudENoaWxkSW5kZXg6IChOU0ludGVnZXIpIGFDdXJyZW50Q2hpbGRJbmRleDsKKworLSAoTlNJbnRlZ2VyKSBhYnNvbHV0ZU5vZGVJbmRleDsKKy0gKHZvaWQpIHNldEFic29sdXRlTm9kZUluZGV4OiAoTlNJbnRlZ2VyKSBhbkFic29sdXRlTm9kZUluZGV4OworCistIChOU1VJbnRlZ2VyKSBub2RlU3RhY2tTaXplOworLSAodm9pZCkgc2V0Tm9kZVN0YWNrU2l6ZTogKE5TVUludGVnZXIpIGFOb2RlU3RhY2tTaXplOworCistIChOU1VJbnRlZ2VyKSBpbmRleFN0YWNrU2l6ZTsKKy0gKHZvaWQpIHNldEluZGV4U3RhY2tTaXplOiAoTlNVSW50ZWdlcikgYW5JbmRleFN0YWNrU2l6ZTsKKworLSAoTlNNdXRhYmxlQXJyYXkgKikgbG9va2FoZWFkOworLSAodm9pZCkgc2V0TG9va2FoZWFkOiAoTlNNdXRhYmxlQXJyYXkgKikgYUxvb2thaGVhZDsKKworLSAodm9pZCkgYWRkVG9Mb29rYWhlYWQ6IChpZClsb29rYWhlYWRPYmplY3Q7CistICh2b2lkKSByZW1vdmVGcm9tTG9va2FoZWFkOiAoaWQpbG9va2FoZWFkT2JqZWN0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Zjg2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLworLy8gIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvMTIvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJMb29rYWhlYWRTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbSA6IEFOVExSTG9va2FoZWFkU3RyZWFtIHsKKwlpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKKyAgICBOU0ludGVnZXIgdG9rZW5JbmRleDsgLy8gc2ltcGxlIGNvdW50ZXIgdG8gc2V0IHRva2VuIGluZGV4IGluIHRva2VucworICAgIE5TSW50ZWdlciBjaGFubmVsOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VuU291cmNlLCBzZXR0ZXI9c2V0VG9rZW5Tb3VyY2U6KSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFRva2VuSW5kZXgsIHNldHRlcj1zZXRUb2tlbkluZGV4KSBOU0ludGVnZXIgdG9rZW5JbmRleDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtICopbmV3QU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pbmV4dEVsZW1lbnQ7CistIChCT09MKWlzRU9GOihpZDxBTlRMUlRva2VuPikgYVRva2VuOworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pZ2V0VG9rZW5Tb3VyY2U7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhU3RhcnQgVG9FbmQ6KGlkPEFOVExSVG9rZW4+KWFTdG9wOworLSAoTlNJbnRlZ2VyKUxBOihOU0ludGVnZXIpYW5JZHg7CistIChpZDxBTlRMUlRva2VuPilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpYW5JZHg7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL0FOVExSVW5pcXVlSURNYXAuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlVuaXF1ZUlETWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNWJkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlVuaXF1ZUlETWFwLmgKQEAgLTAsMCArMSw2NCBAQAorLy8KKy8vICBBTlRMUlVuaXF1ZUlETWFwLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKyNpbXBvcnQgIkFOVExSTm9kZU1hcEVsZW1lbnQuaCIKKworI2RlZmluZSBTVUNDRVNTICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkFJTFVSRSAgICAgICAgICAgICAtMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSVW5pcXVlSURNYXAgOiBBTlRMUlB0ckJ1ZmZlciB7CisgICAgTlNJbnRlZ2VyIGxhc3RIYXNoOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoKSBOU0ludGVnZXIgbGFzdEhhc2g7CisKKysgKGlkKW5ld0FOVExSVW5pcXVlSURNYXA7CisrIChpZCluZXdBTlRMUlVuaXF1ZUlETWFwV2l0aExlbjooTlNJbnRlZ2VyKWFIYXNoU2l6ZTsKKworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSAodm9pZClkZWFsbG9jOworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisvKiBjbGVhciAtLSByZWluaXRpYWxpemUgdGhlIG1hcGxpc3QgYXJyYXkgKi8KKy0gKHZvaWQpIGNsZWFyOworCistICh2b2lkKWRlbGV0ZUFOVExSVW5pcXVlSURNYXA6KEFOVExSTm9kZU1hcEVsZW1lbnQgKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk5vZGVNYXBFbGVtZW50ICopbnA7CistIChpZClnZXROb2RlOihpZDxBTlRMUlRyZWU+KWFOb2RlOworLSAodm9pZClwdXRJRDooaWQpYW5JRCBOb2RlOihpZDxBTlRMUlRyZWU+KWFOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL0hlYWRlcnMvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0NWJmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaApAQCAtMCwwICsxLDQ3IEBACisvLworLy8gIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIDogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworCit9CisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb247CisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb246KE5TSW50ZWdlcilleHBlY3RlZCBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgQW5kOihOU0ludGVnZXIpZXhwZWN0ZWQ7CistIChpZDxBTlRMUlRva2VuPilnZXRVbmV4cGVjdGVkVG9rZW47CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgCisgICAgCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFiNzVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9BL1Jlc291cmNlcy9JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9SZXNvdXJjZXMvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQzNmEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9SZXNvdXJjZXMvSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5vcmcuYW50bHIuYW50bHJmcmFtZXdvcms8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkZNV0s8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvQU5UTFIgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0FOVExSCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3YzFkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0FOVExSCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjcxZTc4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJERkEuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuU291cmNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisKKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVFeGNlcHRpb24uaD4KKworI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPgorCisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKworI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZU1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkJhc2VNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMDBhYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkJhc2VNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1NCBAQAorLy8KKy8vICBBTlRMUkJhc2VNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTGlua0Jhc2UuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VNYXBFbGVtZW50IDogQU5UTFJMaW5rQmFzZSB7CisgICAgTlNOdW1iZXIgKmluZGV4OworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEluZGV4LCBzZXR0ZXI9c2V0SW5kZXg6KSBOU051bWJlciAqaW5kZXg7CisKKysgKGlkKSBuZXdBTlRMUkJhc2VNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSQmFzZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU051bWJlciAqKWdldEluZGV4OworLSAodm9pZClzZXRJbmRleDooTlNOdW1iZXIgKilhbklkeDsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkJhc2VSZWNvZ25pemVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCYXNlUmVjb2duaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhOTIyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCYXNlUmVjb2duaXplci5oCkBAIC0wLDAgKzEsMTgzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKy8vIFRoaXMgaXMgYW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgbGV4ZXJzIGFuZCBwYXJzZXJzLgorCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9GQUlMRUQgLTIKKyNkZWZpbmUgQU5UTFJfTUVNT19SVUxFX1VOS05PV04gLTEKKyNkZWZpbmUgQU5UTFJfSU5JVElBTF9GT0xMT1dfU1RBQ0tfU0laRSAxMDAKKworI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSQmFzZVJlY29nbml6ZXIgOiBOU09iamVjdCB7CisJQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOwkvLyB0aGUgc3RhdGUgb2YgdGhpcyByZWNvZ25pemVyLiBNaWdodCBiZSBzaGFyZWQgd2l0aCBvdGhlciByZWNvZ25pemVycywgZS5nLiBpbiBncmFtbWFyIGltcG9ydCBzY2VuYXJpb3MuCisJTlNTdHJpbmcgKmdyYW1tYXJGaWxlTmFtZTsJCQkvLyB3aGVyZSBkaWQgdGhlIGdyYW1tYXIgY29tZSBmcm9tLiBmaWxsZWQgaW4gYnkgY29kZWdlbmVyYXRpb24KKy8vICAgIEJPT0wgZmFpbGVkOworICAgIE5TU3RyaW5nICpzb3VyY2VOYW1lOworLy8gICAgTlNJbnRlZ2VyIG51bWJlck9mU3ludGF4RXJyb3JzOworICAgIE5TQXJyYXkgKnRva2VuTmFtZXM7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhdGUsIHNldHRlcj1zZXRTdGF0ZSkgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRHcmFtbWFyRmlsZU5hbWUsIHNldHRlcj1zZXRHcmFtbWFyRmlsZU5hbWUpIE5TU3RyaW5nICpncmFtbWFyRmlsZU5hbWU7CisvL0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0RmFpbGVkLCBzZXR0ZXI9c2V0RmFpbGVkKSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5OYW1lcywgc2V0dGVyPXNldFRva2VuTmFtZXMpIE5TQXJyYXkgKnRva2VuTmFtZXM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFNvdXJjZU5hbWUsIHNldHRlcj1zZXRTb3VyY2VOYW1lKSBOU1N0cmluZyAqc291cmNlTmFtZTsKKy8vQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXROdW1iZXJPZlN5bnRheEVycm9ycywgc2V0dGVyPXNldE51bWJlck9mU3ludGF4RXJyb3JzKSBOU0ludGVnZXIgbnVtYmVyT2ZTeW50YXhFcnJvcnM7CisKKysgKHZvaWQpIGluaXRpYWxpemU7CisKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcldpdGhSdWxlTGVuOihOU0ludGVnZXIpYUxlbjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKysgKE5TQXJyYXkgKilnZXRUb2tlbk5hbWVzOworKyAodm9pZClzZXRUb2tlbk5hbWVzOihOU0FycmF5ICopYVRva05hbUFycmF5OworKyAodm9pZClzZXRHcmFtbWFyRmlsZU5hbWU6KE5TU3RyaW5nICopYUZpbGVOYW1lOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy8vIHNpbXBsZSBhY2Nlc3NvcnMKKy0gKE5TSW50ZWdlcikgZ2V0QmFja3RyYWNraW5nTGV2ZWw7CistICh2b2lkKSBzZXRCYWNrdHJhY2tpbmdMZXZlbDooTlNJbnRlZ2VyKSBsZXZlbDsKKworLSAoQk9PTCkgZ2V0RmFpbGVkOworLSAodm9pZCkgc2V0RmFpbGVkOiAoQk9PTCkgZmxhZzsKKworLSAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgZ2V0U3RhdGU7CistICh2b2lkKSBzZXRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgdGhlU3RhdGU7CisKKy8vIHJlc2V0IHRoaXMgcmVjb2duaXplciAtIG1pZ2h0IGJlIGV4dGVuZGVkIGJ5IGNvZGVnZW5lcmF0aW9uL2dyYW1tYXIKKy0gKHZvaWQpIHJlc2V0OworCisvKiogTWF0Y2ggbmVlZHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCwgd2hpY2ggZ2V0cyBwdXQKKyAqICBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKyAqICBhbmQgdHJlZSBwYXJzZXJzIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBvYmplY3RzLiBSYXRoZXIgdGhhbiB0ZXN0CisgKiAgZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKyAqICBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorICogIGlucHV0IHN5bWJvbCBpcy4KKyAqIAorICogIFRoaXMgaXMgaWdub3JlZCBmb3IgbGV4ZXJzLgorICovCistIChpZCkgZ2V0SW5wdXQ7CisKKy0gKHZvaWQpc2tpcDsKKworLy8gZG8gYWN0dWFsIG1hdGNoaW5nIG9mIHRva2Vucy9jaGFyYWN0ZXJzCistIChpZCkgbWF0Y2g6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CistIChCT09MKSBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVG9rZW5UeXBlOihOU0ludGVnZXIpIHR0eXBlOworLSAoQk9PTCkgbWlzbWF0Y2hJc01pc3NpbmdUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLy8gZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeQorLSAodm9pZCkgcmVwb3J0RXJyb3I6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworLSAodm9pZCkgZGlzcGxheVJlY29nbml0aW9uRXJyb3I6KE5TQXJyYXkgKil0aGVUb2tOYW1zIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldEVycm9yTWVzc2FnZTooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUgVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChOU0ludGVnZXIpIGdldE51bWJlck9mU3ludGF4RXJyb3JzOworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldFRva2VuRXJyb3JEaXNwbGF5OihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgZW1pdEVycm9yTWVzc2FnZTooTlNTdHJpbmcgKiltc2c7CistICh2b2lkKSByZWNvdmVyOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworCisvLyBiZWdpbiBob29rcyBmb3IgZGVidWdnZXIKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLy8gZW5kIGhvb2tzIGZvciBkZWJ1Z2dlcgorCisvLyBjb21wdXRlIHRoZSBiaXRzZXRzIG5lY2Vzc2FyeSB0byBkbyBtYXRjaGluZyBhbmQgcmVjb3ZlcnkKKy0gKEFOVExSQml0U2V0ICopY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ7CistIChBTlRMUkJpdFNldCAqKWNvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVzsKKy0gKEFOVExSQml0U2V0ICopY29tYmluZUZvbGxvd3M6KEJPT0wpIGV4YWN0OworCistIChpZDxBTlRMUlRva2VuPikgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5UeXBlOihOU0ludGVnZXIpdHR5cGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistIChpZDxBTlRMUlRva2VuPilyZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBnZXRNaXNzaW5nU3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgIFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CisKKy8vIGhlbHBlciBtZXRob2RzIGZvciByZWNvdmVyeS4gdHJ5IHRvIHJlc3luYyBzb21ld2hlcmUKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbFRUeXBlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBUb2tlblR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbEZvbGxvdzooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWJpdFNldDsKKy0gKHZvaWQpIHB1c2hGb2xsb3c6KEFOVExSQml0U2V0ICopZnNldDsKKy0gKEFOVExSQml0U2V0ICopcG9wRm9sbG93OworCisvLyB0byBiZSB1c2VkIGJ5IHRoZSBkZWJ1Z2dlciB0byBkbyByZXBvcnRpbmcuIG1heWJlIGhvb2sgaW4gaW5jcmVtZW50YWwgc3R1ZmYgaGVyZSwgdG9vLgorLSAoTlNNdXRhYmxlQXJyYXkgKikgZ2V0UnVsZUludm9jYXRpb25TdGFjazsKKy0gKE5TTXV0YWJsZUFycmF5ICopIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2s6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKilleGNlcHRpb24KKwkJCQkJICAgICAgICAgICAgIFJlY29nbml6ZXI6KE5TU3RyaW5nICopcmVjb2duaXplckNsYXNzTmFtZTsKKworLSAoTlNBcnJheSAqKSBnZXRUb2tlbk5hbWVzOworLSAoTlNTdHJpbmcgKilnZXRHcmFtbWFyRmlsZU5hbWU7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CistIChOU011dGFibGVBcnJheSAqKSB0b1N0cmluZ3M6KE5TQXJyYXkgKil0b2tlbnM7CisvLyBzdXBwb3J0IGZvciBtZW1vaXphdGlvbgorLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb246KE5TSW50ZWdlcilydWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoQk9PTCkgYWxyZWFkeVBhcnNlZFJ1bGU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKy0gKHZvaWQpIG1lbW9pemU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisJICAgICBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKKwkgICAgU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb25DYWNoZVNpemU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKy0gKHZvaWQpdHJhY2VPdXQ6KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKworCisvLyBzdXBwb3J0IGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gdGhlc2UgYXJlIGNhbGxlZCBpbmRpcmVjdGx5IHRvIHN1cHBvcnQgZnVua3kgc3R1ZmYgaW4gZ3JhbW1hcnMsCisvLyBsaWtlIHN1cHBseWluZyBzZWxlY3RvcnMgaW5zdGVhZCBvZiB3cml0aW5nIGNvZGUgZGlyZWN0bHkgaW50byB0aGUgYWN0aW9ucyBvZiB0aGUgZ3JhbW1hci4KKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworLy8gc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZVN0YWNrLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCYXNlU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY5MDMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZVN0YWNrLmgKQEAgLTAsMCArMSw2NiBAQAorLy8KKy8vICBBTlRMUkJhc2VSZWNvZ25pemVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUHRyQnVmZmVyLmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorLy8jZGVmaW5lIExPQ0FMX1NDT1BFICAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJCYXNlU3RhY2sgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy9BTlRMUlJ1bGVTdGFjayAqZk5leHQ7CisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSUnVsZVN0YWNrICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2gpIE5TSW50ZWdlciBMYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKEFOVExSQmFzZVN0YWNrICopbmV3QU5UTFJCYXNlU3RhY2s7CisrIChBTlRMUkJhc2VTdGFjayAqKW5ld0FOVExSQmFzZVN0YWNrV2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKHZvaWQpZGVhbGxvYzsKKworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0gKE5TSW50ZWdlcilnZXRMYXN0SGFzaDsKKy0gKHZvaWQpc2V0TGFzdEhhc2g6KE5TSW50ZWdlcilhVmFsOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCYXNlVHJlZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZVRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NjUxM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZVRyZWUuaApAQCAtMCwwICsxLDE5OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAcHJvdG9jb2wgQU5UTFJCYXNlVHJlZSA8QU5UTFJUcmVlPgorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoaWxkcmVuLCBzZXR0ZXI9c2V0Q2hpbGRyZW4pIE5TTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKKworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSQmFzZVRyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJCYXNlVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGluaXQ7CistIChpZDxBTlRMUkJhc2VUcmVlPikgaW5pdFdpdGg6KGlkPEFOVExSVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldENoaWxkOihOU1VJbnRlZ2VyKWk7CistIChOU011dGFibGVBcnJheSAqKWdldENoaWxkcmVuOworLSAodm9pZCkgc2V0Q2hpbGRyZW46KE5TTXV0YWJsZUFycmF5ICopYW5BcnJheTsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWdldEZpcnN0Q2hpbGRXaXRoVHlwZTooTlNJbnRlZ2VyKXR5cGU7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBBZGQgdCBhcyBhIGNoaWxkIHRvIHRoaXMgbm9kZS4gIElmIHQgaXMgbnVsbCwgZG8gbm90aGluZy4gIElmIHQKKy8vICBpcyBuaWwsIGFkZCBhbGwgY2hpbGRyZW4gb2YgdCB0byB0aGlzJyBjaGlsZHJlbi4KKworLSAodm9pZCkgYWRkQ2hpbGQ6KGlkPEFOVExSVHJlZT4pIHRyZWU7CistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy0gKHZvaWQpIHNldENoaWxkOihOU0ludGVnZXIpIGkgV2l0aDooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQpIGRlbGV0ZUNoaWxkOihOU0ludGVnZXIpIGk7CistIChOU011dGFibGVBcnJheSAqKSBjcmVhdGVDaGlsZHJlbkxpc3Q7CistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW5Gcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpIHQ7CisvLyBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKy8vIHRoZSB0cmVlIGlzIGEgZmxhdCBsaXN0LgorCistIChCT09MKSBpc05pbDsKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5TdGFydEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdGFydEluZGV4OihOU0ludGVnZXIpIGluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczooTlNJbnRlZ2VyKSBvZmZzZXQ7CistICh2b2lkKSBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOihpZDxBTlRMUlRyZWU+KSBwYXJlbnQgQXQ6KE5TSW50ZWdlcikgaTsKKworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooTlNJbnRlZ2VyKWk7CisKKy0gKGlkPEFOVExSVHJlZT4pZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0QW5jZXN0b3JzOworCisjcHJhZ21hIG1hcmsgQ29weWluZworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CS8vIHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkIGhlcmUhCistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisjcHJhZ21hIG1hcmsgVHJlZSBQYXJzZXIgc3VwcG9ydAorLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dDsKKy8vIEluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhIHRva2VuIHBheWxvYWQsIHdoYXQgaXMgdGhlIGxpbmUgZm9yIGVycm9ycz8KKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TSW50ZWdlcikgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworCisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistIChOU1N0cmluZyAqKSB0cmVlRGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ1RyZWU7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlIDogTlNPYmplY3QgPEFOVExSVHJlZT4KK3sKKwlOU011dGFibGVBcnJheSAqY2hpbGRyZW47CisgICAgTlNFeGNlcHRpb24gKmFuRXhjZXB0aW9uOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoaWxkcmVuLCBzZXR0ZXI9c2V0Q2hpbGRyZW4pIE5TTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKKworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSQmFzZVRyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJCYXNlVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKyAgICAgICAgIAorLSAoaWQ8QU5UTFJUcmVlPikgaW5pdDsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBpbml0V2l0aDooaWQ8QU5UTFJUcmVlPilub2RlOworCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0Q2hpbGRyZW47CistICh2b2lkKSBzZXRDaGlsZHJlbjooTlNNdXRhYmxlQXJyYXkgKilhbkFycmF5OworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOihOU0ludGVnZXIpdHlwZTsKKy0gKE5TVUludGVnZXIpIGdldENoaWxkQ291bnQ7CisKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJUcmVlPikgdHJlZTsKKy0gKHZvaWQpIGFkZENoaWxkcmVuOihOU0FycmF5ICopIHRoZUNoaWxkcmVuOworCistICh2b2lkKSBzZXRDaGlsZDooTlNJbnRlZ2VyKSBpIFdpdGg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNJbnRlZ2VyKSBpOworLSAoTlNNdXRhYmxlQXJyYXkgKikgY3JlYXRlQ2hpbGRyZW5MaXN0OworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworLy8gSW5kaWNhdGVzIHRoZSBub2RlIGlzIGEgbmlsIG5vZGUgYnV0IG1heSBzdGlsbCBoYXZlIGNoaWxkcmVuLCBtZWFuaW5nCisJLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdG9wSW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CisKKy0gKHZvaWQpIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7CistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOihOU0ludGVnZXIpIG9mZnNldDsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6KGlkPEFOVExSVHJlZT4pIHBhcmVudCBBdDooTlNJbnRlZ2VyKSBpOworCistIChOU0ludGVnZXIpIGdldENoaWxkSW5kZXg7CistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpaTsKKworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CistIChpZDxBTlRMUlRyZWU+KWdldEFuY2VzdG9yOihOU0ludGVnZXIpdHR5cGU7CistIChOU011dGFibGVBcnJheSAqKWdldEFuY2VzdG9yczsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisJLy8gUmV0dXJuIGEgdG9rZW4gdHlwZTsgbmVlZGVkIGZvciB0cmVlIHBhcnNpbmcKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisKKwkvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKXBvczsKKworLSAoTlNTdHJpbmcgKikgdHJlZURlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nVHJlZTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlIDogQU5UTFJCYXNlVHJlZSB7Cit9CistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gOiBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSB7Cit9CisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gKikgZ2V0TmF2aWdhdGlvbk5vZGVEb3duOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZVVwIDogQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGUgeworfQorKyAoQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVVcCAqKSBnZXROYXZpZ2F0aW9uTm9kZVVwOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiA6IEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlIHsKK30KKysgKEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRU9GICopIGdldE5hdmlnYXRpb25Ob2RlRU9GOworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRG93biAqbmF2aWdhdGlvbk5vZGVEb3duOworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgKm5hdmlnYXRpb25Ob2RlVXA7CitleHRlcm4gQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVFT0YgKm5hdmlnYXRpb25Ob2RlRU9GOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZVRyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY4ZGFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQmFzZVRyZWVBZGFwdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25FcnJvck5vZGUuaCIKKyNpbXBvcnQgIkFOVExSVW5pcXVlSURNYXAuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlQWRhcHRvciA6IE5TT2JqZWN0IDxBTlRMUlRyZWVBZGFwdG9yLCBOU0NvcHlpbmc+IHsKKyAgICBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKKwlOU0ludGVnZXIgdW5pcXVlTm9kZUlEOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWVUb1VuaXF1ZUlETWFwLCBzZXR0ZXI9c2V0VHJlZVRvVW5pcXVlSURNYXA6KSBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFVuaXF1ZU5vZGVJRCwgc2V0dGVyPXNldFVuaXF1ZU5vZGVJRDopIE5TSW50ZWdlciB1bmlxdWVOb2RlSUQ7CisKKysgKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBuZXdFbXB0eVRyZWU7CisKKy0gKGlkKSBpbml0OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoaWQpIGVtcHR5Tm9kZTsKKworLSAoQU5UTFJVbmlxdWVJRE1hcCAqKWdldFRyZWVUb1VuaXF1ZUlETWFwOworLSAodm9pZCkgc2V0VHJlZVRvVW5pcXVlSURNYXA6KEFOVExSVW5pcXVlSURNYXAgKilhTWFwTm9kZTsKKworLSAoTlNJbnRlZ2VyKWdldFVuaXF1ZUlEOworLSAodm9pZCkgc2V0VW5pcXVlTm9kZUlEOihOU0ludGVnZXIpYVVuaXF1ZU5vZGVJRDsKKworLyoqIGNyZWF0ZSB0cmVlIG5vZGUgdGhhdCBob2xkcyB0aGUgc3RhcnQgYW5kIHN0b3AgdG9rZW5zIGFzc29jaWF0ZWQKKyAqICB3aXRoIGFuIGVycm9yLgorICoKKyAqICBJZiB5b3Ugc3BlY2lmeSB5b3VyIG93biBraW5kIG9mIHRyZWUgbm9kZXMsIHlvdSB3aWxsIGxpa2VseSBoYXZlIHRvCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIENvbW1vblRyZWUgcmV0dXJucyBUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUKKyAqICBpZiBubyB0b2tlbiBwYXlsb2FkIGJ1dCB5b3UgbWlnaHQgaGF2ZSB0byBzZXQgdG9rZW4gdHlwZSBmb3IgZGlmZgorICogIG5vZGUgdHlwZS4KKyAqCisgKiAgWW91IGRvbid0IGhhdmUgdG8gc3ViY2xhc3MgQ29tbW9uRXJyb3JOb2RlOyB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0bworICogIHN1YmNsYXNzIHlvdXIgb3duIHRyZWUgbm9kZSBjbGFzcyB0byBhdm9pZCBjbGFzcyBjYXN0IGV4Y2VwdGlvbi4KKyAqLworLSAoaWQpIGVycm9yTm9kZTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuCisgICAgICAgRXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKSBlOworCistIChCT09MKSBpc05pbDooaWQ8QU5UTFJUcmVlPikgYVRyZWU7CisKKy0gKGlkPEFOVExSVHJlZT4pZHVwVHJlZTooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKy8qKiBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAqICB0cmVlIChub3QganVzdCBUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgKiAgbm90IHRoZSB0cmVlIG5vZGUgcm91dGluZXMgdG8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIAorICovCistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWUgUGFyZW50OihpZDxBTlRMUlRyZWU+KXBhcmVudDsKKy0gKGlkPEFOVExSVHJlZT4pZHVwTm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy8qKiBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgKiAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAqICBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBoYXZlIHRoZSB1c2VyIHdpbGwgYnVpbGQKKyAqICBBU1RzLgorICovCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJUcmVlPilhQ2hpbGQgdG9UcmVlOihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisvKiogSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIGEgYiBjKQorICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBuZXdSb290IGlzIGEgbmlsLXJvb3RlZCBzaW5nbGUgY2hpbGQgdHJlZSwgdXNlIHRoZSBzaW5nbGUKKyAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgKgorICogIElmIG9sZFJvb3Qgd2FzIG51bGwsIGl0J3Mgb2ssIGp1c3QgcmV0dXJuIG5ld1Jvb3QgKGV2ZW4gaWYgaXNOaWwpLgorICoKKyAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICogICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKyAqCisgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICogIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorICoKKyAqICBCZSBhZHZpc2VkIHRoYXQgaXQncyBvayBmb3IgbmV3Um9vdCB0byBwb2ludCBhdCBvbGRSb290J3MKKyAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgKiAgZWZmaWNpZW5jeS4KKyAqLworLSAoaWQ8QU5UTFJUcmVlPiliZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KWFOZXdSb290IG9sZDooaWQ8QU5UTFJUcmVlPilvbGRSb290OworCisvKiogVHJhbnNmb3JtIF4obmlsIHgpIHRvIHggYW5kIG5pbCB0byBudWxsICovCistIChpZDxBTlRMUlRyZWU+KXJ1bGVQb3N0UHJvY2Vzc2luZzooaWQ8QU5UTFJUcmVlPilhUm9vdDsKKworLSAoaWQ8QU5UTFJUcmVlPiliZWNvbWVSb290ZnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhTmV3Um9vdCBvbGQ6KGlkPEFOVExSVHJlZT4pb2xkUm9vdDsKKworLSAoaWQ8QU5UTFJUcmVlPiljcmVhdGVUcmVlOihOU0ludGVnZXIpYVRUeXBlIFdpdGg6KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW47CisKKy0gKGlkPEFOVExSVHJlZT4pY3JlYXRlVHJlZTooTlNJbnRlZ2VyKWFUVHlwZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW4gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChpZDxBTlRMUlRyZWU+KWNyZWF0ZVRyZWU6KE5TSW50ZWdlcilhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChOU0ludGVnZXIpIGdldFR5cGU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CisKKy0gKHZvaWQpIHNldFR5cGU6KGlkPEFOVExSVHJlZT4pYVRyZWUgVHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLSAodm9pZCkgc2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhVHJlZSBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy0gKGlkPEFOVExSVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUlRyZWU+KWFUcmVlIEF0OihOU0ludGVnZXIpaTsKKworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkPEFOVExSVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJUcmVlPilhQ2hpbGQ7CisKKy0gKGlkPEFOVExSVHJlZT4pIGRlbGV0ZUNoaWxkOihpZDxBTlRMUlRyZWU+KWFUcmVlIEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRDb3VudDooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLSAoTlNJbnRlZ2VyKSBnZXRVbmlxdWVJRDooaWQ8QU5UTFJUcmVlPilub2RlOworCisvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAqCisgKiAgVGhpcyBpcyBhIHZhcmlhbnQgb2YgY3JlYXRlVG9rZW4gd2hlcmUgdGhlIG5ldyB0b2tlbiBpcyBkZXJpdmVkIGZyb20KKyAqICBhbiBhY3R1YWwgcmVhbCBpbnB1dCB0b2tlbi4gIFR5cGljYWxseSB0aGlzIGlzIGZvciBjb252ZXJ0aW5nICd7JworICogIHRva2VucyB0byBCTE9DSyBldGMuLi4gIFlvdSdsbCBzZWUKKyAqCisgKiAgICByIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGNdIElEKykgOworICoKKyAqICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgKi8KKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoaWQ8QU5UTFJUb2tlbj4pY3JlYXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWFGcm9tVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkJpdFNldC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQml0U2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTFiZTExNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkJpdFNldC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9Db3JlRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCisjZGVmaW5lIEJJVFMgKHNpemVvZihOU1VJbnRlZ2VyKSAqIDgpCisjZGVmaW5lIExPR19CSVRTICgoc2l6ZW9mKE5TVUludGVnZXIpPT04KT82OjUpCisKKy8vIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIENvcmVGb3VuZGF0aW9uIGJpdCB2ZWN0b3JzIHRvIHNoaWVsZCB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKy8vIGZyb20gdGhlIHNwZWNpZmljcyBvZiB0aGUgQml0VmVjdG9yIGluaXRpYWxpemF0aW9uIGFuZCBxdWVyeSBmdW5jdGlvbnMuCisvLyBUaGlzIGlzIGZhc3QsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVpbnZlbnQgdGhlIHdoZWVsIGp1c3QgeWV0LgorCitAaW50ZXJmYWNlIEFOVExSQml0U2V0IDogTlNPYmplY3QgPCBOU011dGFibGVDb3B5aW5nID4geworCUNGTXV0YWJsZUJpdFZlY3RvclJlZiBiaXRWZWN0b3I7Cit9CisKKyNwcmFnbWEgbWFyayBDbGFzcyBNZXRob2RzCisKKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0OworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoVHlwZTooQU5UTFJUb2tlblR5cGUpdHlwZTsKKy8qKiBDb25zdHJ1Y3QgYSBBTlRMUkJpdFNldCBnaXZlbiB0aGUgc2l6ZQorICogQHBhcmFtIG5iaXRzIFRoZSBzaXplIG9mIHRoZSBBTlRMUkJpdFNldCBpbiBiaXRzCisgKi8KKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0V2l0aE5CaXRzOihOU1VJbnRlZ2VyKW5iaXRzOworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoQXJyYXk6KE5TTXV0YWJsZUFycmF5ICopdHlwZXM7CisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKil0aGVCaXRzIENvdW50OihOU1VJbnRlZ2VyKWxvbmdDb3VudDsKKworKyAoQU5UTFJCaXRTZXQgKikgb2Y6KE5TVUludGVnZXIpZWw7CisrIChBTlRMUkJpdFNldCAqKSBvZjooTlNVSW50ZWdlcilhIEFuZDI6KE5TVUludGVnZXIpYjsKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYzsKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYyBBbmQ0OihOU1VJbnRlZ2VyKWQ7CisKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorCistIChBTlRMUkJpdFNldCAqKSBpbml0OworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSl0eXBlOworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhOQml0czooTlNVSW50ZWdlciluYml0czsKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoQml0VmVjdG9yOihDRk11dGFibGVCaXRWZWN0b3JSZWYpdGhlQml0VmVjdG9yOworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgY29uc3QqKXRoZUJpdHMgQ291bnQ6KE5TVUludGVnZXIpdGhlQ291bnQ7CistIChBTlRMUkJpdFNldCAqKSBpbml0V2l0aEFycmF5T2ZCaXRzOihOU0FycmF5ICopdGhlQXJyYXk7CisKKyNwcmFnbWEgbWFyayBPcGVyYXRpb25zCistIChBTlRMUkJpdFNldCAqKSBvcjooQU5UTFJCaXRTZXQgKikgYUJpdFNldDsKKy0gKHZvaWQpIG9ySW5QbGFjZTooQU5UTFJCaXRTZXQgKikgYUJpdFNldDsKKy0gKHZvaWQpIGFkZDooTlNVSW50ZWdlcikgYml0OworLSAodm9pZCkgcmVtb3ZlOihOU1VJbnRlZ2VyKSBiaXQ7CistICh2b2lkKSBzZXRBbGxCaXRzOihCT09MKSBhU3RhdGU7CisKKy0gKE5TSW50ZWdlcikgbnVtQml0czsKKy0gKE5TVUludGVnZXIpIHNpemU7CistICh2b2lkKSBzZXRTaXplOihOU1VJbnRlZ2VyKSBub09mV29yZHM7CisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistICh1bnNpZ25lZCBsb25nIGxvbmcpIGJpdE1hc2s6KE5TVUludGVnZXIpIGJpdE51bWJlcjsKKy0gKEJPT0wpIG1lbWJlcjooTlNVSW50ZWdlciliaXROdW1iZXI7CistIChCT09MKSBpc05pbDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CisKKyNwcmFnbWEgbWFyayBOU0NvcHlpbmcgc3VwcG9ydAorCistIChpZCkgbXV0YWJsZUNvcHlXaXRoWm9uZTooTlNab25lICopIHRoZVpvbmU7CisKKworLy9wcml2YXRlCistIChDRk11dGFibGVCaXRWZWN0b3JSZWYpIF9iaXRWZWN0b3I7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YTZmNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDk4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtIDogTlNPYmplY3QgPEFOVExSVG9rZW5TdHJlYW0+IAoreworaWQ8QU5UTFJUb2tlblNvdXJjZT4gdG9rZW5Tb3VyY2U7CisgICAgCisgICAgLyoqIFJlY29yZCBldmVyeSBzaW5nbGUgdG9rZW4gcHVsbGVkIGZyb20gdGhlIHNvdXJjZSBzbyB3ZSBjYW4gcmVwcm9kdWNlCisgICAgICogIGNodW5rcyBvZiBpdCBsYXRlci4gIFRoZSBidWZmZXIgaW4gTG9va2FoZWFkU3RyZWFtIG92ZXJsYXBzIHNvbWV0aW1lcworICAgICAqICBhcyBpdHMgbW92aW5nIHdpbmRvdyBtb3ZlcyB0aHJvdWdoIHRoZSBpbnB1dC4gIFRoaXMgbGlzdCBjYXB0dXJlcworICAgICAqICBldmVyeXRoaW5nIHNvIHdlIGNhbiBhY2Nlc3MgY29tcGxldGUgaW5wdXQgdGV4dC4KKyAgICAgKi8KK05TTXV0YWJsZUFycmF5ICp0b2tlbnM7CisgICAgCisgICAgLyoqIFRyYWNrIHRoZSBsYXN0IG1hcmsoKSBjYWxsIHJlc3VsdCB2YWx1ZSBmb3IgdXNlIGluIHJld2luZCgpLiAqLworTlNJbnRlZ2VyIGxhc3RNYXJrZXI7CisgICAgCisgICAgLyoqIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAqICB0byBjb25zdW1lKS4gIHRva2Vuc1twXSBzaG91bGQgYmUgTFQoMSkuICBwPS0xIGluZGljYXRlcyBuZWVkCisgICAgICogIHRvIGluaXRpYWxpemUgd2l0aCBmaXJzdCB0b2tlbi4gIFRoZSBjdG9yIGRvZXNuJ3QgZ2V0IGEgdG9rZW4uCisgICAgICogIEZpcnN0IGNhbGwgdG8gTFQoMSkgb3Igd2hhdGV2ZXIgZ2V0cyB0aGUgZmlyc3QgdG9rZW4gYW5kIHNldHMgcD0wOworICAgICAqLworTlNJbnRlZ2VyIHA7CisgICAgCitOU0ludGVnZXIgcmFuZ2U7IC8vIGhvdyBkZWVwIGhhdmUgd2UgZ29uZT8KKyAgICAKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5Tb3VyY2Usc2V0dGVyPXNldFRva2VuU291cmNlKSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5zLHNldHRlcj1zZXRUb2tlbnMpIE5TTXV0YWJsZUFycmF5ICp0b2tlbnM7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldExhc3RNYXJrZXIsc2V0dGVyPXNldExhc3RNYXJrZXIpIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJbmRleCxzZXR0ZXI9c2V0SW5kZXgpIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRSYW5nZSxzZXR0ZXI9c2V0UmFuZ2UpIE5TSW50ZWdlciByYW5nZTsKKworKyAoQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbTsKKysgKEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW1XaXRoOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGluaXRXaXRoU291cmNlOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgc2V0SW5kZXg6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgZ2V0UmFuZ2U7CistICh2b2lkKSBzZXRSYW5nZTooTlNJbnRlZ2VyKWFuSW50OworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVzZXQ7CistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworLSAoTlNJbnRlZ2VyKSBzaXplOworLSAodm9pZCkgY29uc3VtZTsKKy0gKHZvaWQpIHN5bmM6KE5TSW50ZWdlcikgaTsKKy0gKHZvaWQpIGZldGNoOihOU0ludGVnZXIpIG47CistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcikgaTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0RnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcikgc3RvcEluZGV4OworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRva2VuPikgTFQ6KE5TSW50ZWdlcikgazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKSBrOworLSAodm9pZCkgc2V0dXA7CistIChpZDxBTlRMUlRva2VuU291cmNlPikgZ2V0VG9rZW5Tb3VyY2U7CistICh2b2lkKSBzZXRUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zOworLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKy0gKE5TTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zRnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU011dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGg6KEFOVExSQml0U2V0ICopdHlwZXM7CistIChOU011dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGhMaXN0OihOU011dGFibGVBcnJheSAqKXR5cGVzOworLSAoTlNNdXRhYmxlQXJyYXkgKilnZXRUb2tlbnNGcm9tOihOU0ludGVnZXIpc3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BJbmRleCBXaXRoVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydEluZGV4IFRvRW5kOihOU0ludGVnZXIpc3RvcEluZGV4OworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0YXJ0SW5kZXggVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RvcEluZGV4OworLSAodm9pZCkgZmlsbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MThlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vCisvLyAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCisjZGVmaW5lIERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSAxMDAKKyNkZWZpbmUgSU5JVElBTF9DQUxMX1NUQUNLX1NJWkUgMTAKKworI2lmZGVmIERPTlRVU0VOT01PCitAaW50ZXJmYWNlIEFOVExSU3RyZWFtSXRlcmF0b3IgOiBBTlRMUlRyZWVJdGVyYXRvcgoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIGlucHV0OworICAgIE5TTXV0YWJsZUFycmF5ICpub2RlczsKK30KKworKyAoaWQpIG5ld0FOVExSU3RyZWFtSXRlcmF0b3I6KEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSB0aGVTdHJlYW07CisKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIHRoZVN0cmVhbTsKKworLSAoQk9PTCkgaGFzTmV4dDsKKy0gKGlkKSBuZXh0OworLSAodm9pZCkgcmVtb3ZlOworQGVuZAorI2VuZGlmCisKK0BpbnRlcmZhY2UgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIDogTlNPYmplY3QgPEFOVExSVHJlZU5vZGVTdHJlYW0+IAoreworCWlkPEFOVExSVHJlZT4gdXA7CisJaWQ8QU5UTFJUcmVlPiBkb3duOworCWlkPEFOVExSVHJlZT4gZW9mOworCQorCU5TTXV0YWJsZUFycmF5ICpub2RlczsKKwkKKwlpZDxBTlRMUlRyZWU+IHJvb3Q7IC8vIHJvb3QKKwkKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiB0b2tlbnM7CisJQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKwkKKwlCT09MIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKwlOU0ludGVnZXIgcDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlBTlRMUkludEFycmF5ICpjYWxsczsKKwkKKwlOU0VudW1lcmF0b3IgKmU7CisgICAgaWQgY3VycmVudFN5bWJvbDsKKwkKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRVcCwgc2V0dGVyPXNldFVwOikgaWQ8QU5UTFJUcmVlPiB1cDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RG93biwgc2V0dGVyPXNldERvd246KSBpZDxBTlRMUlRyZWU+IGRvd247CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEVvZiwgc2V0dGVyPXNldEVvZjopIGlkPEFOVExSVHJlZT4gZW9mOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXROb2Rlcywgc2V0dGVyPXNldE5vZGVzOikgTlNNdXRhYmxlQXJyYXkgKm5vZGVzOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlU291cmNlLCBzZXR0ZXI9c2V0VHJlZVNvdXJjZTopIGlkPEFOVExSVHJlZT4gcm9vdDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5TdHJlYW0sIHNldHRlcj1zZXRUb2tlblN0cmVhbTopIGlkPEFOVExSVG9rZW5TdHJlYW0+IHRva2VuczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QWRhcHRvciwgc2V0dGVyPXNldEFkYXB0b3I6KSBBTlRMUkNvbW1vblRyZWVBZGFwdG9yICphZGFwdG9yOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXMsIHNldHRlcj1zZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KSBCT09MIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0SW5kZXgsIHNldHRlcj1zZXRJbmRleDopIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMYXN0TWFya2VyLCBzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDYWxscywgc2V0dGVyPXNldENhbGxzOikgQU5UTFJJbnRBcnJheSAqY2FsbHM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEVudW0sIHNldHRlcj1zZXRFbnVtOikgTlNFbnVtZXJhdG9yICplOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDdXJyZW50U3ltYm9sLCBzZXR0ZXI9c2V0Q3VycmVudFN5bWJvbDopIGlkIGN1cnJlbnRTeW1ib2w7CisKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZT4pdHJlZTsKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooaWQ8QU5UTFJUcmVlPil0cmVlOworKyAoQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWUgd2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilpbml0aWFsQnVmZmVyU2l6ZTsKKworI3ByYWdtYSBtYXJrIENvbnN0cnVjdG9yCistIChpZCkgaW5pdFdpdGhUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihpZDxBTlRMUlRyZWU+KXRyZWUgV2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilidWZmZXJTaXplOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLy8gcHJvdGVjdGVkIG1ldGhvZHMuIERPIE5PVCBVU0UKKyNwcmFnbWEgbWFyayBQcm90ZWN0ZWQgTWV0aG9kcworLSAodm9pZCkgZmlsbEJ1ZmZlcjsKKy0gKHZvaWQpIGZpbGxCdWZmZXJXaXRoVHJlZTooaWQ8QU5UTFJUcmVlPikgdHJlZTsKKy0gKE5TSW50ZWdlcikgZ2V0Tm9kZUluZGV4OihpZDxBTlRMUlRyZWU+KSBub2RlOworLSAodm9pZCkgYWRkTmF2aWdhdGlvbk5vZGU6KE5TSW50ZWdlcikgdHlwZTsKKy0gKGlkKSBnZXROb2RlOihOU0ludGVnZXIpIGk7CistIChpZCkgTFQ6KE5TSW50ZWdlcikgazsKKy0gKGlkKSBnZXRDdXJyZW50U3ltYm9sOworLSAoaWQpIExCOihOU0ludGVnZXIpIGk7CisjcHJhZ21hIG1hcmsgR2VuZXJhbCBNZXRob2RzCistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgZ2V0VG9rZW5TdHJlYW07CistICh2b2lkKSBzZXRUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pIHRva2VuczsKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPikgYW5BZGFwdG9yOworCistIChCT09MKWdldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClhVmFsOworCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKSBpOworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgc2V0SW5kZXg6KE5TSW50ZWdlcikgaWR4OworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaWR4OworCistICh2b2lkKSBwdXNoOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIHBvcDsKKworLSAodm9pZCkgcmVzZXQ7CistIChOU1VJbnRlZ2VyKSBjb3VudDsKKy0gKE5TRW51bWVyYXRvciAqKSBvYmplY3RFbnVtZXJhdG9yOworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworCistIChOU1N0cmluZyAqKSB0b1Rva2VuVHlwZVN0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvVG9rZW5TdHJpbmc6KE5TSW50ZWdlcilhU3RhcnQgVG9FbmQ6KE5TSW50ZWdlcilhU3RvcDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKWFTdGFydCBUb05vZGU6KGlkKWFTdG9wOworCisvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCistIChOU011dGFibGVBcnJheSAqKSBnZXROb2RlczsKKy0gKGlkPEFOVExSVHJlZT4pIGdldEVvZjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ2hhclN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ2hhclN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3OTczNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJDaGFyU3RyZWFtLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKyNkZWZpbmUJQU5UTFJDaGFyU3RyZWFtRU9GIC0xCisKKworQHByb3RvY29sIEFOVExSQ2hhclN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLSAoTlNTdHJpbmcgKikgc3Vic3RyaW5nV2l0aFJhbmdlOihOU1JhbmdlKSB0aGVSYW5nZTsKKworLyoqIEdldCB0aGUgaXRoIGNoYXJhY3RlciBvZiBsb29rYWhlYWQuICBUaGlzIGlzIHRoZSBzYW1lIHVzdWFsbHkgYXMKKyAqICBMQShpKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZAorICogIGxleGVyIGNvZGUuICBJJ2QgcHJlZmVyIHRvIHJldHVybiBhIGNoYXIgaGVyZSB0eXBlLXdpc2UsIGJ1dCBpdCdzCisgKiAgcHJvYmFibHkgYmV0dGVyIHRvIGJlIDMyLWJpdCBjbGVhbiBhbmQgYmUgY29uc2lzdGVudCB3aXRoIExBLgorICovCistIChOU0ludGVnZXIpTFQ6KE5TSW50ZWdlcikgaTsKKworLy8gQU5UTFIgdHJhY2tzIHRoZSBsaW5lIGluZm9ybWF0aW9uIGF1dG9tYXRpY2FsbHkKKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKworLy8gQmVjYXVzZSB0aGlzIHN0cmVhbSBjYW4gcmV3aW5kLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhlIGxpbmUKKy0gKHZvaWQpIHNldExpbmU6KE5TSW50ZWdlcikgdGhlTGluZTsKKworLy8gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5uLTEKKy0gKE5TSW50ZWdlcikgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworCistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TSW50ZWdlcikgdGhlUG9zOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ2hhclN0cmVhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4N2M3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8vCisvLyAgQU5UTFJDaGFyU3RyZWFtU3RhdGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJDaGFyU3RyZWFtU3RhdGUgOiBOU09iamVjdAoreworTlNJbnRlZ2VyIHA7CitOU0ludGVnZXIgbGluZTsKK05TSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFAsc2V0dGVyPXNldFA6KSBOU0ludGVnZXIgcDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExpbmUsc2V0dGVyPXNldExpbmU6KSBOU0ludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYXJQb3NpdGlvbkluTGluZSxzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKworKyBuZXdBTlRMUkNoYXJTdHJlYW1TdGF0ZTsKKworLSAoaWQpIGluaXQ7CisKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6IChOU0ludGVnZXIpIGFuSW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0TGluZTsKKy0gKHZvaWQpIHNldExpbmU6IChOU0ludGVnZXIpIGFMaW5lOworCistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKWFDaGFyUG9zaXRpb25JbkxpbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNvbW1vbkVycm9yTm9kZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uRXJyb3JOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliYWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNvbW1vbkVycm9yTm9kZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJDb21tb25FcnJvck5vZGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJJbnRTdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJVbldhbnRlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25FcnJvck5vZGUgOiBBTlRMUkNvbW1vblRyZWUKK3sKK2lkPEFOVExSSW50U3RyZWFtPiBpbnB1dDsKK2lkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CitBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICp0cmFwcGVkRXhjZXB0aW9uOworfQorCisrIChpZCkgbmV3QU5UTFJDb21tb25FcnJvck5vZGU6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgIEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGU7CisKKy0gKGlkKSBpbml0V2l0aElucHV0OihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKikgZTsKKy0gKEJPT0wpIGlzTmlsOworCistIChOU0ludGVnZXIpIGdldFR5cGU7CisKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVG9rZW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NjYyMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVG9rZW4uaApAQCAtMCwwICsxLDEwNSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVG9rZW4gOiBOU09iamVjdCA8IEFOVExSVG9rZW4gPiB7CisJTlNTdHJpbmcgKnRleHQ7CisJTlNJbnRlZ2VyIHR5cGU7CisJLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRva2VuJ3MgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbQorCU5TVUludGVnZXIgbGluZTsKKwlOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU1VJbnRlZ2VyIGNoYW5uZWw7CisJLy8gdGhpcyB0b2tlbidzIHBvc2l0aW9uIGluIHRoZSBUb2tlblN0cmVhbQorCU5TVUludGVnZXIgaW5kZXg7CisJCisJLy8gaW5kaWNlcyBpbnRvIHRoZSBDaGFyU3RyZWFtIHRvIGF2b2lkIGNvcHlpbmcgdGhlIHRleHQKKwkvLyBjYW4gbWFudWFsbHkgb3ZlcnJpZGUgdGhlIHRleHQgYnkgdXNpbmcgLXNldFRleHQ6CisJTlNVSW50ZWdlciBzdGFydEluZGV4OworCU5TVUludGVnZXIgc3RvcEluZGV4OworCS8vIHRoZSBhY3R1YWwgaW5wdXQgc3RyZWFtIHRoaXMgdG9rZW4gd2FzIGZvdW5kIGluCisJaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUeXBlLCBzZXR0ZXI9c2V0VHlwZTopIE5TSW50ZWdlciB0eXBlOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMaW5lLCBzZXR0ZXI9c2V0TGluZTopIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hhclBvc2l0aW9uSW5MaW5lLCBzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNVSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldENoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNVSW50ZWdlciBjaGFubmVsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlbkluZGV4LCBzZXR0ZXI9c2V0VG9rZW5JbmRleDopIE5TVUludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBOU1VJbnRlZ2VyIHN0YXJ0SW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgTlNVSW50ZWdlciBzdG9wSW5kZXg7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldElucHV0LCBzZXR0ZXI9c2V0SW5wdXQ6KSBpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OworCisrICh2b2lkKSBpbml0aWFsaXplOworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdBTlRMUkNvbW1vblRva2VuOworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdBTlRMUkNvbW1vblRva2VuOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKWFUVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydDooTlNJbnRlZ2VyKWFTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpYVN0b3A7CisrIChBTlRMUkNvbW1vblRva2VuICopIG5ld0FOVExSQ29tbW9uVG9rZW46KEFOVExSVG9rZW5UeXBlKWFUeXBlOworKyAoaWQ8QU5UTFJUb2tlbj4pIG5ld0FOVExSQ29tbW9uVG9rZW46KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisrIChpZDxBTlRMUlRva2VuPikgbmV3QU5UTFJDb21tb25Ub2tlbldpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIGVvZlRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIHNraXBUb2tlbjsKKysgKGlkPEFOVExSVG9rZW4+KSBpbnZhbGlkVG9rZW47CisrIChBTlRMUlRva2VuQ2hhbm5lbCkgZGVmYXVsdENoYW5uZWw7CisKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIuIFRoaXMgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB3YXkgdG8gaW5pdGlhbGl6ZSBhIFRva2VuIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdDsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcilhVFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbDooTlNJbnRlZ2VyKWFDaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6KE5TSW50ZWdlcil0aGVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpdGhlU3RvcDsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVHlwZTsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisKKy0gKGlkPEFOVExSQ2hhclN0cmVhbT4pIGdldElucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUkNoYXJTdHJlYW0+KSBhbklucHV0OworCistIChOU1VJbnRlZ2VyKSBnZXRTdGFydDsKKy0gKHZvaWQpIHNldFN0YXJ0OiAoTlNVSW50ZWdlcikgYVN0YXJ0OworCistIChOU1VJbnRlZ2VyKSBnZXRTdG9wOworLSAodm9pZCkgc2V0U3RvcDogKE5TVUludGVnZXIpIGFTdG9wOworCisvLyB0aGUgaW5kZXggb2YgdGhpcyBUb2tlbiBpbnRvIHRoZSBUb2tlblN0cmVhbQorLSAoTlNVSW50ZWdlcikgZ2V0VG9rZW5JbmRleDsKKy0gKHZvaWQpIHNldFRva2VuSW5kZXg6IChOU1VJbnRlZ2VyKSBhVG9rZW5JbmRleDsKKworLy8gY29uZm9ybSB0byBOU0NvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ZjlkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gOiBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0gPCBBTlRMUlRva2VuU3RyZWFtID4KK3sKKwlOU011dGFibGVEaWN0aW9uYXJ5ICpjaGFubmVsT3ZlcnJpZGU7CisJTlNJbnRlZ2VyIGNoYW5uZWw7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Q2hhbm5lbE92ZXJyaWRlLHNldHRlcj1zZXRDaGFubmVsT3ZlcnJpZGUpIE5TTXV0YWJsZURpY3Rpb25hcnkgKmNoYW5uZWxPdmVycmlkZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hhbm5lbCxzZXR0ZXI9c2V0Q2hhbm5lbCkgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gKiluZXdBTlRMUkNvbW1vblRva2VuU3RyZWFtOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbDsKKworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGdldFRva2VuU291cmNlOworLSAodm9pZCkgc2V0VG9rZW5Tb3VyY2U6IChpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIExUOihOU0ludGVnZXIpazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKWs7CisKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnM6KE5TSW50ZWdlcikgaTsKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnNSZXZlcnNlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpc2V0dXA7CisKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2U7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIGluQml0U2V0OihBTlRMUkJpdFNldCAqKWFCaXRTZXQ7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGhUeXBlczooTlNBcnJheSAqKXRva2VuVHlwZXM7CistIChOU0FycmF5ICopIHRva2Vuc0luUmFuZ2U6KE5TUmFuZ2UpYVJhbmdlIHdpdGhUeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcilpOworCistIChOU0ludGVnZXIpIHNpemU7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpbWFya2VyOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKWluZGV4OworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnRJbmRleCBUb0VuZDooTlNJbnRlZ2VyKXN0b3BJbmRleDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlcilnZXRDaGFubmVsOworLSAodm9pZClzZXRDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKE5TTXV0YWJsZURpY3Rpb25hcnkgKilnZXRDaGFubmVsT3ZlcnJpZGU7CistICh2b2lkKXNldENoYW5uZWxPdmVycmlkZTooTlNNdXRhYmxlRGljdGlvbmFyeSAqKWFuT3ZlcnJpZGU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNvbW1vblRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkNvbW1vblRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOTY2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZS5oCkBAIC0wLDAgKzEsODggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZSA6IEFOVExSQmFzZVRyZWUgPEFOVExSVHJlZT4geworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuOworCU5TSW50ZWdlciBzdGFydEluZGV4OworCU5TSW50ZWdlciBzdG9wSW5kZXg7CisgICAgQU5UTFJDb21tb25UcmVlICpwYXJlbnQ7CisgICAgTlNJbnRlZ2VyIGNoaWxkSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QU5UTFJDb21tb25Ub2tlbiwgc2V0dGVyPXNldEFOVExSQ29tbW9uVG9rZW4pIEFOVExSQ29tbW9uVG9rZW4gKnRva2VuOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlblN0YXJ0SW5kZXgsIHNldHRlcj1zZXRUb2tlblN0YXJ0SW5kZXgpIE5TSW50ZWdlciBzdGFydEluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRUb2tlblN0b3BJbmRleCwgc2V0dGVyPXNldFRva2VuU3RvcEluZGV4KSBOU0ludGVnZXIgc3RvcEluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQYXJlbnQsIHNldHRlcj1zZXRQYXJlbnQ6KSBBTlRMUkNvbW1vblRyZWUgKnBhcmVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0Q2hpbGRJbmRleCwgc2V0dGVyPXNldENoaWxkSW5kZXgpIE5TSW50ZWdlciBjaGlsZEluZGV4OworCisrIChBTlRMUkNvbW1vblRyZWUgKikgaW52YWxpZE5vZGU7CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3QU5UTFJDb21tb25UcmVlOworKyAoQU5UTFJDb21tb25UcmVlICopIG5ld0FOVExSQ29tbW9uVHJlZVdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKyNpZmRlZiBET05UVVNFWUVUCisrIChpZDxBTlRMUlRyZWU+KSBuZXdBTlRMUkNvbW1vblRyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdG9rZW5UZXh0OworKyAoaWQ8QU5UTFJUcmVlPikgbmV3QU5UTFJDb21tb25UcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisjZW5kaWYKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlTm9kZTooQU5UTFJDb21tb25UcmVlICopYU5vZGU7CistIChpZCkgaW5pdFdpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGU7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoaWQ8QU5UTFJUcmVlPikgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoQk9PTCkgaXNOaWw7CisKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgZ2V0VG9rZW47CistICh2b2lkKSBzZXRUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKGlkPEFOVExSVHJlZT4pIGR1cE5vZGU7CistIChOU0ludGVnZXIpIGdldFR5cGU7CistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAoTlNVSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBnZXRQYXJlbnQ7CistICh2b2lkKSBzZXRQYXJlbnQ6KEFOVExSQ29tbW9uVHJlZSAqKSB0OworCisjaWZkZWYgRE9OVFVTRU5PTU8KKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKyNlbmRpZgorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistICh2b2lkKSBzZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6IChOU0ludGVnZXIpIGFTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OiAoTlNJbnRlZ2VyKSBhU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MzI4N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaApAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25UcmVlQWRhcHRvciA6IEFOVExSQmFzZVRyZWVBZGFwdG9yIHsKK30KKworKyAoaWQ8QU5UTFJUcmVlPikgbmV3RW1wdHlUcmVlOworKyAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKW5ld0FOVExSQ29tbW9uVHJlZUFkYXB0b3I7CistIChpZCkgaW5pdDsKKy0gKGlkPEFOVExSVHJlZT4pZHVwTm9kZTooaWQ8QU5UTFJUcmVlPil0OyAgICAKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWNyZWF0ZVRyZWU6KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CistIChBTlRMUkNvbW1vblRyZWUgKiljcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKHZvaWQpIHNldFRva2VuQm91bmRhcmllczooaWQ8QU5UTFJUcmVlPil0IEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4gVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0YXJ0SW5kZXg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0b3BJbmRleDooaWQ8QU5UTFJUcmVlPil0OworLSAoTlNTdHJpbmcgKilnZXRUZXh0OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKXNldFRleHQ6KGlkPEFOVExSVHJlZT4pdCBUZXh0OihOU1N0cmluZyAqKXRleHQ7CistIChOU0ludGVnZXIpZ2V0VHlwZTooaWQ8QU5UTFJUcmVlPil0OworLSAodm9pZCkgc2V0VHlwZTooaWQ8QU5UTFJUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGU7CistIChpZDxBTlRMUlRva2VuPilnZXRUb2tlbjooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQ8QU5UTFJUcmVlPilnZXRDaGlsZDooaWQ8QU5UTFJUcmVlPil0IEF0OihOU0ludGVnZXIpaTsKKy0gKHZvaWQpIHNldENoaWxkOihpZDxBTlRMUlRyZWU+KXQgQXQ6KE5TSW50ZWdlcilpIENoaWxkOihpZDxBTlRMUlRyZWU+KWNoaWxkOworLSAoTlNJbnRlZ2VyKWdldENoaWxkQ291bnQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKGlkPEFOVExSVHJlZT4pZ2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKXNldFBhcmVudDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KGlkPEFOVExSVHJlZT4pcGFyZW50OworLSAoTlNJbnRlZ2VyKWdldENoaWxkSW5kZXg6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpc2V0Q2hpbGRJbmRleDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KE5TSW50ZWdlcilpbmRleDsKKy0gKHZvaWQpcmVwbGFjZUNoaWxkcmVuOihpZDxBTlRMUlRyZWU+KXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQ8QU5UTFJUcmVlPil0OworLSAoaWQpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzY4ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDExNiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0gOiBBTlRMUkxvb2thaGVhZFN0cmVhbSA8QU5UTFJUcmVlTm9kZVN0cmVhbT4geworI2RlZmluZSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgMTAwCisjZGVmaW5lIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFIDEwCisgICAgCisvKiogUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/ICovCitpZCByb290OworICAgIAorLyoqIElmIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuICovCitpZCA8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworICAgIAorCS8qKiBXaGF0IHRyZWUgYWRhcHRvciB3YXMgdXNlZCB0byBidWlsZCB0aGVzZSB0cmVlcyAqLworQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKyAgICAKKy8qKiBUaGUgdHJlZSBpdGVyYXRvciB3ZSB1c2luZyAqLworQU5UTFJUcmVlSXRlcmF0b3IgKml0OworICAgIAorLyoqIFN0YWNrIG9mIGluZGV4ZXMgdXNlZCBmb3IgcHVzaC9wb3AgY2FsbHMgKi8KK0FOVExSSW50QXJyYXkgKmNhbGxzOyAgICAKKyAgICAKKy8qKiBUcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zICovCitCT09MIGhhc05pbFJvb3Q7CisgICAgCisvKiogVHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC4gKi8KK05TSW50ZWdlciBsZXZlbDsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Um9vdCwgc2V0dGVyPXNldFJvb3Q6KSBBTlRMUkNvbW1vblRyZWUgKnJvb3Q7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VucyxzZXR0ZXI9c2V0VG9rZW5zOikgaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlQWRhcHRvciwgc2V0dGVyPXNldFRyZWVBZGFwdG9yOikgQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKyAgICAKKy0gKHZvaWQpIHJlc2V0OworICAgIAorICAgIC8qKiBQdWxsIGVsZW1lbnRzIGZyb20gdHJlZSBpdGVyYXRvci4gIFRyYWNrIHRyZWUgbGV2ZWwgMC4ubWF4X2xldmVsLgorICAgICAqICBJZiBuaWwgcm9vdGVkIHRyZWUsIGRvbid0IGdpdmUgaW5pdGlhbCBuaWwgYW5kIERPV04gbm9yIGZpbmFsIFVQLgorICAgICAqLworLSAoaWQpIG5leHRFbGVtZW50OworICAgIAorLSAoQk9PTCkgaXNFT0Y6KGlkPEFOVExSVHJlZT4pIG87CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICAKKy0gKGlkKSBnZXRUcmVlU291cmNlOworICAgIAorLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKyAgICAKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRUb2tlblN0cmVhbTsKKyAgICAKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPikgdG9rZW5zOworICAgIAorLSAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKSBnZXRUcmVlQWRhcHRvcjsKKyAgICAKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopIGFkYXB0b3I7CisgICAgCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisgICAgCisgICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisgICAgICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXROb2RlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgaW5kZXg7CisgICAgCisgICAgLyoqIFNlZWsgYmFjayB0byBwcmV2aW91cyBpbmRleCBzYXZlZCBkdXJpbmcgbGFzdCBwdXNoKCkgY2FsbC4KKyAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgKi8KKy0gKE5TSW50ZWdlcikgcG9wOworICAgIAorLy8gVFJFRSBSRVdSSVRFIElOVEVSRkFDRQorICAgIAorLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworICAgIAorLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQ8QU5UTFJUcmVlPilzdGFydE5vZGUgVG9Ob2RlOihpZDxBTlRMUlRyZWU+KXN0b3BOb2RlOworCisvKiogRm9yIGRlYnVnZ2luZzsgZGVzdHJ1Y3RpdmU6IG1vdmVzIHRyZWUgaXRlcmF0b3IgdG8gZW5kLiAqLworLSAoTlNTdHJpbmcgKikgdG9Ub2tlblR5cGVTdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRGQS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSREZBLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTA5NGEzZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRGQS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJERkEgOiBOU09iamVjdCB7CisJLy8gdGhlIHRhYmxlcyBhcmUgc2V0IGJ5IHN1YmNsYXNzZXMgdG8gdGhlaXIgb3duIHN0YXRpYyB2ZXJzaW9ucy4KKwljb25zdCBpbnQgKmVvdDsKKwljb25zdCBpbnQgKmVvZjsKKwljb25zdCB1bmljaGFyICptaW47CisJY29uc3QgdW5pY2hhciAqbWF4OworCWNvbnN0IGludCAqYWNjZXB0OworCWNvbnN0IGludCAqc3BlY2lhbDsKKwljb25zdCBpbnQgKip0cmFuc2l0aW9uOworCQorCUFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CisJTlNJbnRlZ2VyIGRlY2lzaW9uTnVtYmVyOworICAgIE5TSW50ZWdlciBsZW47Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UmVjb2duaXplcixzZXR0ZXI9c2V0UmVjb2duaXplcjopIEFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldERlY2lzaW9uLHNldHRlcj1zZXREZWNpc2lvbjopIE5TSW50ZWdlciBkZWNpc2lvbk51bWJlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGVuLHNldHRlcj1zZXRMZW46KSBOU0ludGVnZXIgbGVuOworCistIChpZCkgaW5pdFdpdGhSZWNvZ25pemVyOihpZCkgdGhlUmVjb2duaXplcjsKKy8vIHNpbXVsYXRlIHRoZSBERkEgdXNpbmcgdGhlIHN0YXRpYyB0YWJsZXMgYW5kIHByZWRpY3QgYW4gYWx0ZXJuYXRpdmUKKy0gKE5TSW50ZWdlcikgcHJlZGljdDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0OworLSAodm9pZCkgbm9WaWFibGVBbHQ6KE5TSW50ZWdlcilzdGF0ZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCistIChOU0ludGVnZXIpIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb246KE5TSW50ZWdlcilzdGF0ZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworLy8gLSAoTlNJbnRlZ2VyKSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uOihOU0ludGVnZXIpIHN0YXRlOworLy8tICh1bmljaGFyKSBzcGVjaWFsVHJhbnNpdGlvbjoodW5pY2hhcikgc3RhdGUgc3ltYm9sOihOU0ludGVnZXIpIHN5bWJvbDsKKworLy8gaG9vayBmb3IgZGVidWdnZXIgc3VwcG9ydAorLSAodm9pZCkgZXJyb3I6KEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKiludmFlOworCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworCisrICh2b2lkKSBzZXRJc0VtaXR0aW5nRGVidWdJbmZvOihCT09MKSBzaG91bGRFbWl0RGVidWdJbmZvOworCistIChOU0ludGVnZXIpZ2V0RGVjaXNpb247CistICh2b2lkKXNldERlY2lzaW9uOihOU0ludGVnZXIpYURlY2lzb247CisKKy0gKEFOVExSQmFzZVJlY29nbml6ZXIgKilnZXRSZWNvZ25pemVyOworLSAodm9pZClzZXRSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopYVJlY29nbml6ZXI7CistIChOU0ludGVnZXIpbGVuZ3RoOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Zy5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NzM4M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWcuaApAQCAtMCwwICsxLDMzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudExpc3RlbmVyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1BhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZVBhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiZWU2YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oCkBAIC0wLDAgKzEsMjc1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0Bwcm90b2NvbCBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lciAKKworI2RlZmluZSBBTlRMUkRlYnVnUHJvdG9jb2xWZXJzaW9uIDEKKworLyoqIFRoZSBwYXJzZXIgaGFzIGp1c3QgZW50ZXJlZCBhIHJ1bGUuICBObyBkZWNpc2lvbiBoYXMgYmVlbiBtYWRlIGFib3V0CisqICB3aGljaCBhbHQgaXMgcHJlZGljdGVkLiAgVGhpcyBpcyBmaXJlZCBBRlRFUiBpbml0IGFjdGlvbnMgaGF2ZSBiZWVuCisqICBleGVjdXRlZC4gIEF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgYW5kIGF2YWlsYWJsZSBldGMuLi4KKyovCistICh2b2lkKSBlbnRlclJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CisKKy8qKiBCZWNhdXNlIHJ1bGVzIGNhbiBoYXZlIGxvdHMgb2YgYWx0ZXJuYXRpdmVzLCBpdCBpcyB2ZXJ5IHVzZWZ1bCB0bworKiAga25vdyB3aGljaCBhbHQgeW91IGFyZSBlbnRlcmluZy4gIFRoaXMgaXMgMS4ubiBmb3IgbiBhbHRzLgorKi8KKy0gKHZvaWQpIGVudGVyQWx0OihOU0ludGVnZXIpYWx0OworCisvKiogVGhpcyBpcyB0aGUgbGFzdCB0aGluZyBleGVjdXRlZCBiZWZvcmUgbGVhdmluZyBhIHJ1bGUuICBJdCBpcworKiAgZXhlY3V0ZWQgZXZlbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLiAgVGhpcyBpcyB0cmlnZ2VyZWQgYWZ0ZXIKKyogIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaGF2ZSBvY2N1cnJlZCAodW5sZXNzIHRoZSBleGNlcHRpb24gaXMKKwkJCQkJCQkJCQkJICAgKiAgbm90IGNhdWdodCBpbiB0aGlzIHJ1bGUpLiAgVGhpcyBpbXBsaWVzIGFuICJleGl0QWx0IiBldmVudC4KKyovCistICh2b2lkKSBleGl0UnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKworLyoqIFRyYWNrIGVudHJ5IGludG8gYW55ICguLi4pIHN1YnJ1bGUgb3RoZXIgRUJORiBjb25zdHJ1Y3QgKi8KKy0gKHZvaWQpIGVudGVyU3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCistICh2b2lkKSBleGl0U3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCisvKiogRXZlcnkgZGVjaXNpb24sIGZpeGVkIGsgb3IgYXJiaXRyYXJ5LCBoYXMgYW4gZW50ZXIvZXhpdCBldmVudAorKiAgc28gdGhhdCBhIEdVSSBjYW4gZWFzaWx5IHRyYWNrIHdoYXQgTFQvY29uc3VtZSBldmVudHMgYXJlCisqICBhc3NvY2lhdGVkIHdpdGggcHJlZGljdGlvbi4gIFlvdSB3aWxsIHNlZSBhIHNpbmdsZSBlbnRlci9leGl0CisqICBzdWJydWxlIGJ1dCBtdWx0aXBsZSBlbnRlci9leGl0IGRlY2lzaW9uIGV2ZW50cywgb25lIGZvciBlYWNoCisqICBsb29wIGl0ZXJhdGlvbi4KKyovCistICh2b2lkKSBlbnRlckRlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisKKy0gKHZvaWQpIGV4aXREZWNpc2lvbjooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworCisvKiogQW4gaW5wdXQgdG9rZW4gd2FzIGNvbnN1bWVkOyBtYXRjaGVkIGJ5IGFueSBraW5kIG9mIGVsZW1lbnQuCisqICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKworLyoqIEFuIG9mZi1jaGFubmVsIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZC4KKyogIFRyaWdnZXIgYWZ0ZXIgdGhlIHRva2VuIHdhcyBtYXRjaGVkIGJ5IHRoaW5ncyBsaWtlIG1hdGNoKCksIG1hdGNoQW55KCkuCisqICAodW5sZXNzIG9mIGNvdXJzZSB0aGUgaGlkZGVuIHRva2VuIGlzIGZpcnN0IHN0dWZmIGluIHRoZSBpbnB1dCBzdHJlYW0pLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVIaWRkZW5Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKworLyoqIFNvbWVib2R5IChhbnlib2R5KSBsb29rZWQgYWhlYWQuICBOb3RlIHRoYXQgdGhpcyBhY3R1YWxseSBnZXRzCisqICB0cmlnZ2VyZWQgYnkgYm90aCBMQSBhbmQgTFQgY2FsbHMuICBUaGUgZGVidWdnZXIgd2lsbCB3YW50IHRvIGtub3cKKyogIHdoaWNoIFRva2VuIG9iamVjdCB3YXMgZXhhbWluZWQuICBMaWtlIGNvbnN1bWVUb2tlbiwgdGhpcyBpbmRpY2F0ZXMKKyogIHdoYXQgdG9rZW4gd2FzIHNlZW4gYXQgdGhhdCBkZXB0aC4gIEEgcmVtb3RlIGRlYnVnZ2VyIGNhbm5vdCBsb29rCisqICBhaGVhZCBpbnRvIGEgZmlsZSBpdCBkb2Vzbid0IGhhdmUgc28gTFQgZXZlbnRzIG11c3QgcGFzcyB0aGUgdG9rZW4KKyogIGV2ZW4gaWYgdGhlIGluZm8gaXMgcmVkdW5kYW50LgorKi8KKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0OworCisvKiogVGhlIHBhcnNlciBpcyBnb2luZyB0byBsb29rIGFyYml0cmFyaWx5IGFoZWFkOyBtYXJrIHRoaXMgbG9jYXRpb24sCisqICB0aGUgdG9rZW4gc3RyZWFtJ3MgbWFya2VyIGlzIHNlbnQgaW4gY2FzZSB5b3UgbmVlZCBpdC4KKyovCistICh2b2lkKSBtYXJrOihOU0ludGVnZXIpbWFya2VyOworCisvKiogQWZ0ZXIgYW4gYXJiaXRyYWlybHkgbG9uZyBsb29rYWhlYWQgYXMgd2l0aCBhIGN5Y2xpYyBERkEgKG9yIHdpdGgKKyogIGFueSBiYWNrdHJhY2spLCB0aGlzIGluZm9ybXMgdGhlIGRlYnVnZ2VyIHRoYXQgc3RyZWFtIHNob3VsZCBiZQorKiAgcmV3b3VuZCB0byB0aGUgcG9zaXRpb24gYXNzb2NpYXRlZCB3aXRoIG1hcmtlci4KKyovCistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlciltYXJrZXI7CisKKy8qKiBSZXdpbmQgdG8gdGhlIGlucHV0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hcmtlci4KKyogIFVzZWQgY3VycmVudGx5IG9ubHkgYWZ0ZXIgYSBjeWNsaWMgREZBIGFuZCBqdXN0CisqICBiZWZvcmUgc3RhcnRpbmcgYSBzZW0vc3luIHByZWRpY2F0ZSB0byBnZXQgdGhlCisqICBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGVjaXNpb24uCisqICBEbyBub3QgInBvcCIgdGhlIG1hcmtlciBvZmYgdGhlIHN0YXRlLiAgbWFyayhpKQorKiAgYW5kIHJld2luZChpKSBzaG91bGQgYmFsYW5jZSBzdGlsbC4KKyovCistICh2b2lkKSByZXdpbmQ7CisKKy0gKHZvaWQpIGJlZ2luQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWw7CisKKy0gKHZvaWQpIGVuZEJhY2t0cmFjazooTlNJbnRlZ2VyKWxldmVsIHdhc1N1Y2Nlc3NmdWw6KEJPT0wpc3VjY2Vzc2Z1bDsKKworLyoqIFRvIHdhdGNoIGEgcGFyc2VyIG1vdmUgdGhyb3VnaCB0aGUgZ3JhbW1hciwgdGhlIHBhcnNlciBuZWVkcyB0bworKiAgaW5mb3JtIHRoZSBkZWJ1Z2dlciB3aGF0IGxpbmUvY2hhclBvcyBpdCBpcyBwYXNzaW5nIGluIHRoZSBncmFtbWFyLgorKiAgRm9yIG5vdywgdGhpcyBkb2VzIG5vdCBrbm93IGhvdyB0byBzd2l0Y2ggZnJvbSBvbmUgZ3JhbW1hciB0byB0aGUKKyogIG90aGVyIGFuZCBiYWNrIGZvciBpc2xhbmQgZ3JhbW1hcnMgZXRjLi4uCisqCisqICBUaGlzIHNob3VsZCBhbHNvIGFsbG93IGJyZWFrcG9pbnRzIGJlY2F1c2UgdGhlIGRlYnVnZ2VyIGNhbiBzdG9wCisqICB0aGUgcGFyc2VyIHdoZW5ldmVyIGl0IGhpdHMgdGhpcyBsaW5lL3Bvcy4KKyovCistICh2b2lkKSBsb2NhdGlvbkxpbmU6KE5TSW50ZWdlcilsaW5lIGNvbHVtbjooTlNJbnRlZ2VyKXBvczsKKworLyoqIEEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFeGNlcHRpb24uICBJIG1hZGUKKyogIHRoaXMgYSBnZW5lcmljIGV2ZW50IHNvIHRoYXQgSSBjYW4gYWx0ZXIgdGhlIGV4Y2VwdGlvbiBoaWVyYWNoeSBsYXRlcgorKiAgd2l0aG91dCBoYXZpbmcgdG8gYWx0ZXIgYWxsIHRoZSBkZWJ1ZyBvYmplY3RzLgorKgorKiAgVXBvbiBlcnJvciwgdGhlIHN0YWNrIG9mIGVudGVyIHJ1bGUvc3VicnVsZSBtdXN0IGJlIHByb3Blcmx5IHVud291bmQuCisqICBJZiBubyB2aWFibGUgYWx0IG9jY3VycyBpdCBpcyB3aXRoaW4gYW4gZW50ZXIvZXhpdCBkZWNpc2lvbiwgd2hpY2gKKyogIGFsc28gbXVzdCBiZSByZXdvdW5kLiAgRXZlbiB0aGUgcmV3aW5kIGZvciBlYWNoIG1hcmsgbXVzdCBiZSB1bndvdW50LgorKiAgSW4gdGhlIEphdmEgdGFyZ2V0IHRoaXMgaXMgcHJldHR5IGVhc3kgdXNpbmcgdHJ5L2ZpbmFsbHksIGlmIGEgYml0CisqICB1Z2x5IGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRoZSByZXdpbmQgaXMgZ2VuZXJhdGVkIGluIERGQS5wcmVkaWN0KCkKKyogIGFjdHVhbGx5IHNvIG5vIGNvZGUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGF0LiAgRm9yIGxhbmd1YWdlcworKiAgdy9vIHRoaXMgImZpbmFsbHkiIGZlYXR1cmUgKEMrKz8pLCB0aGUgdGFyZ2V0IGltcGxlbWVudG9yIHdpbGwgaGF2ZQorKiAgdG8gYnVpbGQgYW4gZXZlbnQgc3RhY2sgb3Igc29tZXRoaW5nLgorKgorKiAgQWNyb3NzIGEgc29ja2V0IGZvciByZW1vdGUgZGVidWdnaW5nLCBvbmx5IHRoZSBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorKiAgZGF0YSBmaWVsZHMgYXJlIHRyYW5zbWl0dGVkLiAgVGhlIHRva2VuIG9iamVjdCBvciB3aGF0ZXZlciB0aGF0CisqICBjYXVzZWQgdGhlIHByb2JsZW0gd2FzIHRoZSBsYXN0IG9iamVjdCByZWZlcmVuY2VkIGJ5IExULiAgVGhlCisqICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgTFQgZXZlbnQgc2hvdWxkIGhvbGQgdGhlIHVuZXhwZWN0ZWQgVG9rZW4gb3IKKyogIGNoYXIuCisqCisqICBIZXJlIGlzIGEgc2FtcGxlIGV2ZW50IHRyYWNlIGZvciBncmFtbWFyOgorKgorKiAgYiA6IEMgKHs7fUF8QikgLy8gezt9IGlzIHRoZXJlIHRvIHByZXZlbnQgQXxCIGJlY29taW5nIGEgc2V0CisqICAgIHwgRAorKiAgICA7CisqCisqICBUaGUgc2VxdWVuY2UgZm9yIHRoaXMgcnVsZSAod2l0aCBubyB2aWFibGUgYWx0IGluIHRoZSBzdWJydWxlKSBmb3IKKyogIGlucHV0ICdjIGMnICh0aGVyZSBhcmUgMyB0b2tlbnMpIGlzOgorKgorKgkJY29tbWVuY2UKKyoJCUxUKDEpCisqCQllbnRlclJ1bGUgYgorKgkJbG9jYXRpb24gNyAxCisqCQllbnRlciBkZWNpc2lvbiAzCisqCQlMVCgxKQorKgkJZXhpdCBkZWNpc2lvbiAzCisqCQllbnRlckFsdDEKKyoJCWxvY2F0aW9uIDcgNQorKgkJTFQoMSkKKyoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMTowXQorKgkJbG9jYXRpb24gNyA3CisqCQllbnRlclN1YlJ1bGUgMgorKgkJZW50ZXIgZGVjaXNpb24gMgorKgkJTFQoMSkKKyoJCUxUKDEpCisqCQlyZWNvZ25pdGlvbkV4Y2VwdGlvbiBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAyIDEgMgorKgkJZXhpdCBkZWNpc2lvbiAyCisqCQlleGl0U3ViUnVsZSAyCisqCQliZWdpblJlc3luYworKgkJTFQoMSkKKyoJCWNvbnN1bWVUb2tlbiBbYy88ND4sMToxXQorKgkJTFQoMSkKKyoJCWVuZFJlc3luYworKgkJTFQoLTEpCisqCQlleGl0UnVsZSBiCisqCQl0ZXJtaW5hdGUKKyovCistICh2b2lkKSByZWNvZ25pdGlvbkV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CisKKy8qKiBJbmRpY2F0ZXMgdGhlIHJlY29nbml6ZXIgaXMgYWJvdXQgdG8gY29uc3VtZSB0b2tlbnMgdG8gcmVzeW5jaHJvbml6ZQorKiAgdGhlIHBhcnNlci4gIEFueSBjb25zdW1lIGV2ZW50cyBmcm9tIGhlcmUgdW50aWwgdGhlIHJlY292ZXJlZCBldmVudAorKiAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXJzZS0tdGhleSBhcmUgZGVhZCB0b2tlbnMuCisqLworLSAodm9pZCkgYmVnaW5SZXN5bmM7CisKKy8qKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb2duaXplciBoYXMgZmluaXNoZWQgY29uc3VtaW5nIHRva2VucyBpbiBvcmRlcgorKiAgdG8gcmVzeWNocm9uaXplLiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIGJlZ2luUmVzeW5jL2VuZFJlc3luYyBwYWlycworKiAgYmVmb3JlIHRoZSByZWNvZ25pemVyIGNvbWVzIG91dCBvZiBlcnJvclJlY292ZXJ5IG1vZGUgKGluIHdoaWNoCisqICBtdWx0aXBsZSBlcnJvcnMgYXJlIHN1cHByZXNzZWQpLiAgVGhpcyB3aWxsIGJlIHVzZWZ1bAorKiAgaW4gYSBndWkgd2hlcmUgeW91IHdhbnQgdG8gcHJvYmFibHkgZ3JleSBvdXQgdG9rZW5zIHRoYXQgYXJlIGNvbnN1bWVkCisqICBidXQgbm90IG1hdGNoZWQgdG8gYW55dGhpbmcgaW4gZ3JhbW1hci4gIEFueXRoaW5nIGJldHdlZW4KKyogIGEgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXIgd2FzIHRvc3NlZCBvdXQgYnkgdGhlIHBhcnNlci4KKyovCistICh2b2lkKSBlbmRSZXN5bmM7CisKKy8qKiBBIHNlbWFudGljIHByZWRpY2F0ZSB3YXMgZXZhbHVhdGUgd2l0aCB0aGlzIHJlc3VsdCBhbmQgYWN0aW9uIHRleHQgKi8KKy0gKHZvaWQpIHNlbWFudGljUHJlZGljYXRlOihOU1N0cmluZyAqKXByZWRpY2F0ZSBtYXRjaGVkOihCT09MKXJlc3VsdDsKKworLyoqIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKyogIHNlbmRpbmcgZXZlbnRzIG92ZXIgYSBzb2NrZXQuICBBIEdVSSBmb3IgZXhhbXBsZSB3aWxsIGxhdW5jaCBhIHRocmVhZAorKiAgdG8gY29ubmVjdCBhbmQgY29tbXVuaWNhdGUgd2l0aCBhIHJlbW90ZSBwYXJzZXIuICBUaGUgdGhyZWFkIHdpbGwgd2FudAorKiAgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKyogIHRyaWdnZXIgdGhpcyB1cG9uIGVudHJ5IHRvIHRoZSBmaXJzdCBydWxlICh0aGUgcnVsZUxldmVsIGlzIHVzZWQgdG8KKyogIGZpZ3VyZSB0aGlzIG91dCkuCisqLworLSAodm9pZCkgY29tbWVuY2U7CisKKy8qKiBQYXJzaW5nIGlzIG92ZXI7IHN1Y2Nlc3NmdWxseSBvciBub3QuICBNb3N0bHkgdXNlZnVsIGZvciB0ZWxsaW5nCisqICByZW1vdGUgZGVidWdnaW5nIGxpc3RlbmVycyB0aGF0IGl0J3MgdGltZSB0byBxdWl0LiAgV2hlbiB0aGUgcnVsZQorKiAgaW52b2NhdGlvbiBsZXZlbCBnb2VzIHRvIHplcm8gYXQgdGhlIGVuZCBvZiBhIHJ1bGUsIHdlIGFyZSBkb25lCisqICBwYXJzaW5nLgorKi8KKy0gKHZvaWQpIHRlcm1pbmF0ZTsKKworCisvLyBUIHIgZSBlICBQIGEgciBzIGkgbiBnCisKKy8qKiBJbnB1dCBmb3IgYSB0cmVlIHBhcnNlciBpcyBhbiBBU1QsIGJ1dCB3ZSBrbm93IG5vdGhpbmcgZm9yIHN1cmUKKyogIGFib3V0IGEgbm9kZSBleGNlcHQgaXRzIHR5cGUgYW5kIHRleHQgKG9idGFpbmVkIGZyb20gdGhlIGFkYXB0b3IpLgorKiAgVGhpcyBpcyB0aGUgYW5hbG9nIG9mIHRoZSBjb25zdW1lVG9rZW4gbWV0aG9kLiAgQWdhaW4sIHRoZSBJRCBpcworKiAgdGhlIGhhc2hDb2RlIHVzdWFsbHkgb2YgdGhlIG5vZGUgc28gaXQgb25seSB3b3JrcyBpZiBoYXNoQ29kZSBpcworKiAgbm90IGltcGxlbWVudGVkLiAgSWYgdGhlIHR5cGUgaXMgVVAgb3IgRE9XTiwgdGhlbgorKiAgdGhlIElEIGlzIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCBhcyBpdCdzIGZpeGVkLS10aGVyZSBpcworKiAganVzdCBvbmUgVVAgbm9kZSBhbmQgb25lIERPV04gbmF2aWdhdGlvbiBub2RlLgorKi8KKy0gKHZvaWQpIGNvbnN1bWVOb2RlOihOU0ludGVnZXIpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKy8qKiBUaGUgdHJlZSBwYXJzZXIgbG9va2VkYWhlYWQuICBJZiB0aGUgdHlwZSBpcyBVUCBvciBET1dOLAorKiAgdGhlbiB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisqLworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKworLy8gQSBTIFQgIEUgdiBlIG4gdCBzCisKKy8qKiBBIG5pbCB3YXMgY3JlYXRlZCAoZXZlbiBuaWwgbm9kZXMgaGF2ZSBhIHVuaXF1ZSBJRC4uLgorKiAgdGhleSBhcmUgbm90ICJudWxsIiBwZXIgc2UpLiAgQXMgb2YgNC8yOC8yMDA2LCB0aGlzCisqICBzZWVtcyB0byBiZSB1bmlxdWVseSB0cmlnZ2VyZWQgd2hlbiBzdGFydGluZyBhIG5ldyBzdWJ0cmVlCisqICBzdWNoIGFzIHdoZW4gZW50ZXJpbmcgYSBzdWJydWxlIGluIGF1dG9tYXRpYyBtb2RlIGFuZCB3aGVuCisqICBidWlsZGluZyBhIHRyZWUgaW4gcmV3cml0ZSBtb2RlLgorKi8KKy0gKHZvaWQpIGNyZWF0ZU5pbE5vZGU6KHVuc2lnbmVkKWhhc2g7CisKKy8qKiBBbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gdGV4dCAqLworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCB0ZXh0OihOU1N0cmluZyAqKXRleHQgdHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy8qKiBBbm5vdW5jZSBhIG5ldyBub2RlIGJ1aWx0IGZyb20gYW4gZXhpc3RpbmcgdG9rZW4gKi8KKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggZnJvbVRva2VuQXRJbmRleDooTlNJbnRlZ2VyKXRva2VuSW5kZXg7CisKKy8qKiBNYWtlIGEgbm9kZSB0aGUgbmV3IHJvb3Qgb2YgYW4gZXhpc3Rpbmcgcm9vdC4gIFNlZQorKgorKiAgTm90ZTogdGhlIG5ld1Jvb3RJRCBwYXJhbWV0ZXIgaXMgcG9zc2libHkgZGlmZmVyZW50CisqICB0aGFuIHRoZSBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgbmV3Um9vdCBwYXJhbWV0ZXIuCisqICBJbiBvdXIgY2FzZSwgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisqICBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgYW5kIG5vdCByb290X24gb3Igd2hhdGV2ZXIuCisqCisqICBUaGUgbGlzdGVuZXIgc2hvdWxkIGFzc3VtZSB0aGF0IHRoaXMgZXZlbnQgb2NjdXJzCisqICBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgc3VicnVsZSAob3IgcnVsZSkgc3VidHJlZSBpcworKiAgYmVpbmcgcmVzZXQgdG8gbmV3Um9vdElELgorKgorKi8KKy0gKHZvaWQpIG1ha2VOb2RlOih1bnNpZ25lZCluZXdSb290SGFzaCBwYXJlbnRPZjoodW5zaWduZWQpb2xkUm9vdEhhc2g7CisKKy8qKiBNYWtlIGNoaWxkSUQgYSBjaGlsZCBvZiByb290SUQuCisqICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3IuYWRkQ2hpbGQoKQorKi8KKy0gKHZvaWQpIGFkZENoaWxkOih1bnNpZ25lZCljaGlsZEhhc2ggdG9UcmVlOih1bnNpZ25lZCl0cmVlSGFzaDsKKworLyoqIFNldCB0aGUgdG9rZW4gc3RhcnQvc3RvcCB0b2tlbiBpbmRleCBmb3IgYSBzdWJ0cmVlIHJvb3Qgb3Igbm9kZSAqLworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzRm9yVHJlZToodW5zaWduZWQpbm9kZUhhc2ggRnJvbTooTlNVSW50ZWdlcil0b2tlblN0YXJ0SW5kZXggVG86KE5TVUludGVnZXIpdG9rZW5TdG9wSW5kZXg7CisKKy0gKHZvaWQpIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb247CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRQcm94eS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWdFdmVudFByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTliZjY3YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnRXZlbnRQcm94eS5oCkBAIC0wLDAgKzEsMTEyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlBhcnNlci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKyNpbXBvcnQgPHN5cy9zb2NrZXQuaD4KKyNpbXBvcnQgPG5ldGluZXQvaW4uaD4KKyNpbXBvcnQgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKy8vIGRlZmF1bHQgcG9ydCBmb3IgQU5UTFJXb3JrcworI2RlZmluZSBERUZBVUxUX0RFQlVHR0VSX1BPUlQgMHhDMDAxCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z0V2ZW50UHJveHkgOiBOU09iamVjdCA8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IHsKKwlpbnQgc2VydmVyU29ja2V0OworCQorCXN0cnVjdCBzb2NrYWRkciBkZWJ1Z2dlcl9zb2NrYWRkcjsKKwlzb2NrbGVuX3QgZGVidWdnZXJfc29ja2xlbjsKKwlpbnQgZGVidWdnZXJTb2NrZXQ7CisJTlNGaWxlSGFuZGxlICpkZWJ1Z2dlckZIOworCQorCU5TU3RyaW5nICpncmFtbWFyTmFtZTsKKwlpbnQgZGVidWdnZXJQb3J0OworfQorCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEdyYW1tYXJOYW1lOihOU1N0cmluZyAqKWFHcmFtbWFyTmFtZSBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilhUG9ydDsKKy0gKHZvaWQpIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb247CistICh2b2lkKSB3YWl0Rm9yQWNrOworLSAodm9pZCkgc2VuZFRvRGVidWdnZXI6KE5TU3RyaW5nICopbWVzc2FnZTsKKy0gKHZvaWQpIHNlbmRUb0RlYnVnZ2VyOihOU1N0cmluZyAqKW1lc3NhZ2Ugd2FpdEZvclJlc3BvbnNlOihCT09MKXdhaXQ7CisKKy0gKE5TSW50ZWdlcikgc2VydmVyU29ja2V0OworLSAodm9pZCkgc2V0U2VydmVyU29ja2V0OiAoTlNJbnRlZ2VyKSBhU2VydmVyU29ja2V0OworCistIChOU0ludGVnZXIpIGRlYnVnZ2VyU29ja2V0OworLSAodm9pZCkgc2V0RGVidWdnZXJTb2NrZXQ6IChOU0ludGVnZXIpIGFEZWJ1Z2dlclNvY2tldDsKKworLSAoTlNTdHJpbmcgKikgZ3JhbW1hck5hbWU7CistICh2b2lkKSBzZXRHcmFtbWFyTmFtZTogKE5TU3RyaW5nICopIGFHcmFtbWFyTmFtZTsKKworLSAoTlNJbnRlZ2VyKSBkZWJ1Z2dlclBvcnQ7CistICh2b2lkKSBzZXREZWJ1Z2dlclBvcnQ6IChOU0ludGVnZXIpIGFEZWJ1Z2dlclBvcnQ7CisKKy0gKE5TU3RyaW5nICopIGVzY2FwZU5ld2xpbmVzOihOU1N0cmluZyAqKWFTdHJpbmc7CisKKyNwcmFnbWEgbWFyayAtCisKKyNwcmFnbWEgbWFyayBEZWJ1Z0V2ZW50TGlzdGVuZXIgUHJvdG9jb2wKKy0gKHZvaWQpIGVudGVyUnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKy0gKHZvaWQpIGVudGVyQWx0OihOU0ludGVnZXIpYWx0OworLSAodm9pZCkgZXhpdFJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CistICh2b2lkKSBlbnRlclN1YlJ1bGU6KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpIGV4aXRTdWJSdWxlOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBlbnRlckRlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBleGl0RGVjaXNpb246KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpIGNvbnN1bWVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIGNvbnN1bWVIaWRkZW5Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgbWFyazooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIGJlZ2luQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWw7CistICh2b2lkKSBlbmRCYWNrdHJhY2s6KE5TSW50ZWdlcilsZXZlbCB3YXNTdWNjZXNzZnVsOihCT09MKXN1Y2Nlc3NmdWw7CistICh2b2lkKSBsb2NhdGlvbkxpbmU6KE5TSW50ZWdlcilsaW5lIGNvbHVtbjooTlNJbnRlZ2VyKXBvczsKKy0gKHZvaWQpIHJlY29nbml0aW9uRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLSAodm9pZCkgc2VtYW50aWNQcmVkaWNhdGU6KE5TU3RyaW5nICopcHJlZGljYXRlIG1hdGNoZWQ6KEJPT0wpcmVzdWx0OworLSAodm9pZCkgY29tbWVuY2U7CistICh2b2lkKSB0ZXJtaW5hdGU7CisKKworI3ByYWdtYSBtYXJrIFRyZWUgUGFyc2luZworLSAodm9pZCkgY29uc3VtZU5vZGU6KHVuc2lnbmVkKW5vZGVIYXNoIG9mVHlwZTooTlNJbnRlZ2VyKXR5cGUgdGV4dDooTlNTdHJpbmcgKil0ZXh0OworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKworI3ByYWdtYSBtYXJrIEFTVCBFdmVudHMKKworLSAodm9pZCkgY3JlYXRlTmlsTm9kZToodW5zaWduZWQpaGFzaDsKKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggdGV4dDooTlNTdHJpbmcgKil0ZXh0IHR5cGU6KE5TSW50ZWdlcil0eXBlOworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCBmcm9tVG9rZW5BdEluZGV4OihOU0ludGVnZXIpdG9rZW5JbmRleDsKKy0gKHZvaWQpIG1ha2VOb2RlOih1bnNpZ25lZCluZXdSb290SGFzaCBwYXJlbnRPZjoodW5zaWduZWQpb2xkUm9vdEhhc2g7CistICh2b2lkKSBhZGRDaGlsZDoodW5zaWduZWQpY2hpbGRIYXNoIHRvVHJlZToodW5zaWduZWQpdHJlZUhhc2g7CistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXNGb3JUcmVlOih1bnNpZ25lZClub2RlSGFzaCBGcm9tOihOU0ludGVnZXIpdG9rZW5TdGFydEluZGV4IFRvOihOU0ludGVnZXIpdG9rZW5TdG9wSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyM2ZmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1BhcnNlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z1BhcnNlciA6IEFOVExSUGFyc2VyIHsKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbTsKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSAgZGVidWdnZXJQb3J0OihOU0ludGVnZXIpcG9ydE51bWJlcjsKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pdGhlRGVidWdMaXN0ZW5lcgorCQkJICBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWdUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWdUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzNWIwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVG9rZW5TdHJlYW0gOiBOU09iamVjdCA8QU5UTFJUb2tlblN0cmVhbT4KK3sKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiBpbnB1dDsKKwlCT09MIGluaXRpYWxTdHJlYW1TdGF0ZTsKKyAgICBOU0ludGVnZXIgbGFzdE1hcmtlcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pZGVidWdnZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgZ2V0SW5wdXQ7CistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVRva2VuU3RyZWFtOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihOU0ludGVnZXIpaW5kZXg7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBnZXRUb2tlblNvdXJjZTsKKy0gKE5TU3RyaW5nICopIGdldFNvdXJjZU5hbWU7CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUb1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTk2NWZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRGVidWdUcmVlQWRhcHRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVHJlZUFkYXB0b3IgOiBBTlRMUkJhc2VUcmVlQWRhcHRvciB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6IChpZDxBTlRMUlRyZWVBZGFwdG9yPikgYVRyZWVBZGFwdG9yOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBmOTkzOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDY3IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbSA6IE5TT2JqZWN0IDxBTlRMUlRyZWVOb2RlU3RyZWFtPiB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7CisJQk9PTCBpbml0aWFsU3RyZWFtU3RhdGU7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWRlYnVnZ2VyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGdldElucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgYVRyZWVOb2RlU3RyZWFtOworCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjogKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhVHJlZUFkYXB0b3I7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVOb2RlU3RyZWFtIGNvbmZvcm1hbmNlCisKKy0gKGlkKSBMVDooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpZmxhZzsKKworI3ByYWdtYSBtYXJrIEFOVExSSW50U3RyZWFtIGNvbmZvcm1hbmNlCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNVSW50ZWdlcikgaTsKKy0gKE5TVUludGVnZXIpIG1hcms7CistIChOU1VJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKHZvaWQpIHJld2luZDooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVsZWFzZTooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNVSW50ZWdlcikgaW5kZXg7CistIChOU1VJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkRlYnVnVHJlZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiZWFjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWVQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudFByb3h5LmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVHJlZVBhcnNlciA6IEFOVExSVHJlZVBhcnNlciB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW07CistIChpZCkgaW5pdFdpdGhUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlU3RyZWFtCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXI7CisJLy8gZGVzaWduYXRlZCBpbml0aWFsaXplcgorLSAoaWQpIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZVN0cmVhbQorCQkJCWRlYnVnTGlzdGVuZXI6KGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPil0aGVEZWJ1Z0xpc3RlbmVyCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE4OWJiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKK30KKworKyAoQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0U3RyZWFtIGRlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpIGFEZWNpc2lvbk51bWJlcjsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW0gZGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcikgYURlY2lzaW9uTnVtYmVyOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJFcnJvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjY1N2FmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRXJyb3IuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSRXJyb3IuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMzAvMDMvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisjZGVmaW5lIEFOVExSRXJyb3JEb21haW4gQCJBTlRMUkVycm9yIgorCisjZGVmaW5lIEFOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEAiQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iCisjZGVmaW5lIEFOVExSSWxsZWdhbFN0YXRlRXhjZXB0aW9uIEAiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIgorLy8jZGVmaW5lIEFOVExSUnVudGltZUV4Y2VwdGlvbiBAIlJ1bnRpbWVFeGNlcHRpb24iCisvLyNkZWZpbmUgQU5UTFJOb1N1Y2hNZXRob2RFeGNlcHRpb24gQCJOb1N1Y2hNZXRob2RFeGNlcHRpb24iCisvLyNkZWZpbmUgQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIEAiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiIKKy8vI2RlZmluZSBBTlRMUlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIEAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iCisKKworLyp0eXBlZGVmIGVudW0KK3sKKwlBTlRMUklsbGVnYWxTdGF0ZSA9IDEsCisJQU5UTFJJbGxlZ2FsQXJndW1lbnQgPSAyLAorCUFOVExSUmVjb2duaXRpb25FcnJvciA9IDMsCisJQU5UTFJNaXNzaW5nVG9rZW5FcnJvciA9IDQsCisJQU5UTFJVbndhbnRlZFRva2VuRXJyb3IgPSA1LAorCUFOVExSTWlzbWF0ZWNoZWRUb2tlbkVycm9yID0gNiwKKwlBTlRMUk5vVmlhYmxlQWx0RXJyb3IgPSA3CisJCit9IEFOVExSRXJyb3JDb2RlOyovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Nzg4Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKKworQGludGVyZmFjZSBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24KK3sKKwlOU1N0cmluZyAqcHJlZGljYXRlOworCU5TU3RyaW5nICpydWxlTmFtZTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQcmVkaWNhdGUsIHNldHRlcj1zZXRQcmVkaWNhdGU6KSBOU1N0cmluZyAqcHJlZGljYXRlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTmFtZSwgc2V0dGVyPXNldFJ1bGVOYW1lOikgTlNTdHJpbmcgKnJ1bGVOYW1lOworCisrIChBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoUnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWUgcHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CistIChBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiAqKSBpbml0V2l0aFJ1bGVOYW1lOihOU1N0cmluZyAqKXRoZVJ1bGVOYW1lIHByZWRpY2F0ZTooTlNTdHJpbmcgKil0aGVQcmVkaWNhdGUgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworCisjaWZkZWYgRE9OVFVTRVlFVAorLSAoTlNTdHJpbmcgKikgZ2V0UHJlZGljYXRlOworLSAodm9pZCkgc2V0UHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZTsKKy0gKE5TU3RyaW5nICopIGdldFJ1bGVOYW1lOworLSAodm9pZCkgc2V0UnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWU7CisjZW5kaWYKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRmFzdFF1ZXVlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJGYXN0UXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjgxODE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSRmFzdFF1ZXVlLmgKQEAgLTAsMCArMSw2OCBAQAorLy8KKy8vICBBTlRMUkZhc3RRdWV1ZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAyNi8wNC8yMDEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworCitAaW50ZXJmYWNlIEFOVExSRmFzdFF1ZXVlIDogTlNPYmplY3QgPE5TQ29weWluZz4KK3sKKwlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbDsKKwlOU011dGFibGVBcnJheSAqZGF0YTsKKwlOU0ludGVnZXIgcDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQb29sLCBzZXR0ZXI9c2V0UG9vbCkgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2w7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldERhdGEsIHNldHRlcj1zZXREYXRhKSBOU011dGFibGVBcnJheSAqZGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0UCwgc2V0dGVyPXNldFApIE5TSW50ZWdlciBwOworCisrIChpZCkgbmV3QU5UTFJGYXN0UXVldWU7CisKKy0gKGlkKSBpbml0OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAodm9pZCkgcmVzZXQ7CistIChpZCkgcmVtb3ZlOworLSAodm9pZCkgYWRkT2JqZWN0OihpZCkgbzsKKy0gKE5TSW50ZWdlcikgY291bnQ7CistIChOU0ludGVnZXIpIHNpemU7CistIChpZCkgaGVhZDsKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpIGk7CistICh2b2lkKSBjbGVhcjsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNBdXRvcmVsZWFzZVBvb2wgKilnZXRQb29sOworLSAodm9pZClzZXRQb29sOihOU0F1dG9yZWxlYXNlUG9vbCAqKWFQb29sOworLSAoTlNNdXRhYmxlQXJyYXkgKilnZXREYXRhOworLSAodm9pZClzZXREYXRhOihOU011dGFibGVBcnJheSAqKW15RGF0YTsKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6KE5TSW50ZWdlcilhbkludDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSSGFzaE1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSSGFzaE1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWNhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJIYXNoTWFwLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vCisvLyAgQU5UTFJIYXNoTWFwLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKyNkZWZpbmUgTE9DQUxfU0NPUEUgICAgICAgIDEKKyNkZWZpbmUgSEFTSFNJWkUgICAgICAgICAxMDEKKyNkZWZpbmUgSEJVRlNJWkUgICAgICAweDIwMDAKKworQGludGVyZmFjZSBBTlRMUkhhc2hNYXAgOiBBTlRMUkxpbmtCYXNlIHsKKwkvLwlBTlRMUkhhc2hNYXAgKmZOZXh0OworICAgIC8vICAgIFRTdHJpbmdQb29sICpmUG9vbDsKKyAgICBOU0ludGVnZXIgU2NvcGU7CisgICAgTlNJbnRlZ2VyIExhc3RIYXNoOworICAgIE5TSW50ZWdlciBCdWZmU2l6ZTsKKyAgICBBTlRMUk1hcEVsZW1lbnQgKnB0ckJ1ZmZlcltIQVNIU0laRV07CisgICAgTlNJbnRlZ2VyIG1vZGU7Cit9CisKKy8vQHByb3BlcnR5IChjb3B5KSBBTlRMUkhhc2hNYXAgKmZOZXh0OworLy9AcHJvcGVydHkgKGNvcHkpIFRTdHJpbmdQb29sICpmUG9vbDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFNjb3BlLCBzZXR0ZXI9c2V0U2NvcGU6KSBOU0ludGVnZXIgU2NvcGU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoOikgTlNJbnRlZ2VyIExhc3RIYXNoOworCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyAoaWQpbmV3QU5UTFJIYXNoTWFwOworKyAoaWQpbmV3QU5UTFJIYXNoTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKy0gKEFOVExSSGFzaE1hcCAqKVB1c2hTY29wZTooIEFOVExSSGFzaE1hcCAqKiltYXA7CistIChBTlRMUkhhc2hNYXAgKilQb3BTY29wZTooIEFOVExSSGFzaE1hcCAqKiltYXA7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCisvKiAgICBmb3JtIGhhc2ggdmFsdWUgZm9yIHN0cmluZyBzICovCistIChOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKEFOVExSSGFzaE1hcCAqKWZpbmRzY29wZTooaW50KWxldmVsOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzIFNjb3BlOihpbnQpc2NvcGU7CisvKiAgIGxvb2sgZm9yIHMgaW4gcHRyQnVmZmVyICAqLworLSAoaWQpaW5zdGFsbDooQU5UTFJNYXBFbGVtZW50ICopc3ltIFNjb3BlOihpbnQpc2NvcGU7CisvKiAgIGxvb2sgZm9yIHMgaW4gcHRyQnVmZmVyICAqLworLSAodm9pZClkZWxldGVBTlRMUkhhc2hNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoaW50KVJlbW92ZVN5bTooTlNTdHJpbmcgKilzOworLSAodm9pZClkZWxldGVfY2hhaW46KEFOVExSTWFwRWxlbWVudCAqKW5wOworI2lmZGVmIERPTlRVU0VZRVQKKy0gKGludClibGRfc3ltdGFiOihLV19UQUJMRSAqKXRva25hbXM7CisjZW5kaWYKKy0gKEFOVExSTWFwRWxlbWVudCAqKilnZXRwdHJCdWZmZXI7CistIChBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooaW50KWlkeDsKKy0gKHZvaWQpc2V0cHRyQnVmZmVyOihBTlRMUk1hcEVsZW1lbnQgKilucCBJbmRleDooaW50KWlkeDsKKy0gKE5TSW50ZWdlcilnZXRTY29wZTsKKy0gKHZvaWQpc2V0U2NvcGU6KE5TSW50ZWdlcilpOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNJbnRlZ2VyKWdldE1vZGU7CistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZTsKKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZCkgc2V0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZClhZGRPYmplY3Q6KGlkKWFuT2JqZWN0OworLSAoQU5UTFJNYXBFbGVtZW50ICopIGdldE5hbWU6KE5TU3RyaW5nICopYU5hbWU7CistICh2b2lkKSBwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGU7CisKKy0gKE5TRW51bWVyYXRvciAqKW9iamVjdEVudW1lcmF0b3I7CistIChCT09MKSBoYXNOZXh0OworLSAoQU5UTFJNYXBFbGVtZW50ICopbmV4dE9iamVjdDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkhhc2hNYXAubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkhhc2hNYXAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjM0MjZiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSSGFzaE1hcC5tCkBAIC0wLDAgKzEsNTIxIEBACisvLworLy8gIEFOVExSSGFzaE1hcC5tCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisKK3N0YXRpYyBOU0ludGVnZXIgaXRJbmRleDsKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaE1hcAorICovCitAaW1wbGVtZW50YXRpb24gQU5UTFJIYXNoTWFwCisKK0BzeW50aGVzaXplIFNjb3BlOworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwCit7CisgICAgQU5UTFJIYXNoTWFwICphTmV3QU5UTFJIYXNoTWFwOworICAgIAorICAgIGFOZXdBTlRMUkhhc2hNYXAgPSBbW0FOVExSSGFzaE1hcCBhbGxvY10gaW5pdF07CisJcmV0dXJuKCBhTmV3QU5UTFJIYXNoTWFwICk7Cit9CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZQoreworICAgIEFOVExSSGFzaE1hcCAqYU5ld0FOVExSSGFzaE1hcDsKKyAgICAKKyAgICBhTmV3QU5UTFJIYXNoTWFwID0gW1tBTlRMUkhhc2hNYXAgYWxsb2NdIGluaXRXaXRoTGVuOmFCdWZmU2l6ZV07CisJcmV0dXJuKCBhTmV3QU5UTFJIYXNoTWFwICk7Cit9CisKKy0oaWQpaW5pdAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJZk5leHQgPSBuaWw7CisgICAgICAgIEJ1ZmZTaXplID0gSEFTSFNJWkU7CisJCVNjb3BlID0gMDsKKwkJaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisJCQlTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworCQkJZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisJCQkJcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisJCQl9CisJCX0KKyAgICAgICAgbW9kZSA9IDA7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKyAgICAgICAgQnVmZlNpemUgPSBhQnVmZlNpemU7CisJCVNjb3BlID0gMDsKKwkJaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisJCQlTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworCQkJZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisJCQkJcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisJCQl9CisJCX0KKyAgICAgICAgbW9kZSA9IDA7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKHZvaWQpZGVhbGxvYworeworICAgIEFOVExSTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworCQorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCAmJiB0bXAgIT0gWygoQU5UTFJIYXNoTWFwICopZk5leHQpIGdldHB0ckJ1ZmZlckVudHJ5OmlkeF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICAvLyB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJNYXBFbGVtZW50ICopdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNJbnRlZ2VyKWNvdW50Cit7CisgICAgaWQgYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhQ250ID0gMDsKKyAgICAKKyAgICBmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgc2l6ZQoreworICAgIGlkIGFuRWxlbWVudDsKKyAgICBOU0ludGVnZXIgYVNpemUgPSAwOworICAgIAorICAgIGZvciAoTlNJbnRlZ2VyIGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0odm9pZClkZWxldGVBTlRMUkhhc2hNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXAsICpydG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICYmIHRtcCAhPSAoQU5UTFJMaW5rQmFzZSAqKVsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBnZXRwdHJCdWZmZXJFbnRyeTppZHhdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gW3RtcCBnZXRmTmV4dF07CisgICAgICAgICAgICAgICAgW3J0bXAgZGVhbGxvY107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy0oQU5UTFJIYXNoTWFwICopUHVzaFNjb3BlOihBTlRMUkhhc2hNYXAgKiopbWFwCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICBBTlRMUkhhc2hNYXAgKmh0bXA7CisgICAgCisgICAgaHRtcCA9IFtBTlRMUkhhc2hNYXAgbmV3QU5UTFJIYXNoTWFwXTsKKyAgICBpZiAoICptYXAgIT0gbmlsICkgeworICAgICAgICAoKEFOVExSSGFzaE1hcCAqKWh0bXApLT5mTmV4dCA9ICptYXA7CisgICAgICAgIFtodG1wIHNldFNjb3BlOlsoKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0KSBnZXRTY29wZV0rMV07CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gICAgZ1Njb3BlTGV2ZWwrKzsKKyAgICAqbWFwID0gaHRtcDsKKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworLShBTlRMUkhhc2hNYXAgKilQb3BTY29wZTooQU5UTFJIYXNoTWFwICoqKW1hcAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXA7CisJQU5UTFJIYXNoTWFwICpodG1wOworICAgIAorICAgIGh0bXAgPSAqbWFwOworICAgIGlmICggKCptYXApLT5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgaWYgKCBodG1wLT5wdHJCdWZmZXJbaWR4XSA9PSBuaWwgfHwKKyAgICAgICAgICAgICAgICBodG1wLT5wdHJCdWZmZXJbaWR4XSA9PSAoKm1hcCktPnB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wID0gaHRtcC0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogbXVzdCBkZWFsIHdpdGggcGFybXMsIGxvY2FscyBhbmQgbGFiZWxzIGF0IHNvbWUgcG9pbnQKKyAgICAgICAgICAgICAqIGNhbiBub3QgZm9yZ2V0IHRoZSBkZWJ1Z2dlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgIFsgdG1wIGRlYWxsb2NdOworICAgICAgICB9CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIC8vICAgICAgICBnU2NvcGVMZXZlbC0tOworICAgIH0KKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSEFTSCAgICAgICAgaGFzaCBlbnRyeSB0byBnZXQgaW5kZXggdG8gdGFibGUKKyAqICBOU0ludGVnZXIgaGFzaCggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgKnMgICAgICAgICAgICAgc3RyaW5nIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogTlNJbnRlZ2VyICAgICAgICAgICAgICAgICBoYXNoZWQgdmFsdWUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzICAgICAgIC8qICAgIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KK3sKKwlOU0ludGVnZXIgaGFzaHZhbDsKKwljb25zdCBjaGFyICp0bXA7CisgICAgCisJdG1wID0gW3MgY1N0cmluZ1VzaW5nRW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKwlmb3IoIGhhc2h2YWwgPSAwOyAqdG1wICE9ICdcMCc7ICkKKyAgICAgICAgaGFzaHZhbCArPSAqdG1wKys7CisJc2VsZi0+TGFzdEhhc2ggPSBoYXNodmFsICUgQnVmZlNpemU7CisJcmV0dXJuKCBzZWxmLT5MYXN0SGFzaCApOworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBGSU5EU0NPUEUgIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBBTlRMUkhhc2hNYXAgKmZpbmRzY29wZSggQU5UTFJIYXNoTWFwICpzZWxmLCBOU0ludGVnZXIgc2NvcGUgKTsKKyAqCisgKiAgICAgSW5wdXRzOiAgTlNJbnRlZ2VyICAgICAgIHNjb3BlIC0tIHNjb3BlIGxldmVsIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogQU5UTFJIYXNoTWFwICAgcG9pbnRlciB0byBwdHJCdWZmZXIgb2YgcHJvcGVyIHNjb3BlIGxldmVsCisgKgorICogIExhc3QgUmV2aXNpb24gOS8wMy85MAorICovCisjZW5kaWYKKy0oQU5UTFJIYXNoTWFwICopZmluZHNjb3BlOihOU0ludGVnZXIpc2NvcGUKK3sKKyAgICBpZiAoIHNlbGYtPlNjb3BlID09IHNjb3BlICkgeworICAgICAgICByZXR1cm4oIHNlbGYgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZOZXh0ICkgeworICAgICAgICByZXR1cm4oIFsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBmaW5kc2NvcGU6c2NvcGVdICk7CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIExPT0tVUCAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIEFOVExSTWFwRWxlbWVudCAqbG9va3VwKCBBTlRMUkhhc2hNYXAgKnNlbGYsIGNoYXIgKnMsIE5TSW50ZWdlciBzY29wZSApOworICoKKyAqICAgICBJbnB1dHM6ICBjaGFyICAgICAqcyAgICAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBBTlRMUk1hcEVsZW1lbnQgICogICAgICAgICAgIHBvaW50ZXIgdG8gZW50cnkKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShpZClsb29rdXA6KE5TU3RyaW5nICopcyBTY29wZTooTlNJbnRlZ2VyKXNjb3BlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIG5wID0gc2VsZi0+cHRyQnVmZmVyW1tzZWxmIGhhc2g6c11dOyBucCAhPSBuaWw7IG5wID0gW25wIGdldGZOZXh0XSApIHsKKyAgICAgICAgaWYgKCBbcyBpc0VxdWFsVG9TdHJpbmc6W25wIGdldE5hbWVdXSApIHsKKyAgICAgICAgICAgIHJldHVybiggbnAgKTsgICAgICAgIC8qICAgZm91bmQgaXQgICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBJTlNUQUxMIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBOU0ludGVnZXIgaW5zdGFsbCggQU5UTFJIYXNoTWFwICpzZWxmLCBBTlRMUk1hcEVsZW1lbnQgKnN5bSwgTlNJbnRlZ2VyIHNjb3BlICk7CisgKgorICogICAgIElucHV0czogIEFOVExSTWFwRWxlbWVudCAgICAqc3ltICAgLS0gc3ltYm9sIHB0ciB0byBpbnN0YWxsCisgKiAgICAgICAgICAgICAgTlNJbnRlZ2VyICAgICAgICAgc2NvcGUgLS0gbGV2ZWwgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBCb29sZWFuICAgICBUUlVFICAgaWYgaW5zdGFsbGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgIGlmIGFscmVhZHkgaW4gdGFibGUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShBTlRMUk1hcEVsZW1lbnQgKilpbnN0YWxsOihBTlRMUk1hcEVsZW1lbnQgKilzeW0gU2NvcGU6KE5TSW50ZWdlcilzY29wZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgCisgICAgbnAgPSBbc2VsZiBsb29rdXA6W3N5bSBnZXROYW1lXSBTY29wZTpzY29wZSBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBbc3ltIHJldGFpbl07CisgICAgICAgIFtzeW0gc2V0Rk5leHQ6c2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdXTsKKyAgICAgICAgc2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdID0gc3ltOworICAgICAgICByZXR1cm4oIHNlbGYtPnB0ckJ1ZmZlclsgc2VsZi0+TGFzdEhhc2ggXSApOworICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgUmVtb3ZlU3ltICBzZWFyY2ggaGFzaGVkIGxpc3QgZm9yIGVudHJ5CisgKiAgTlNJbnRlZ2VyIFJlbW92ZVN5bSggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgICAgICpzICAgICAgICAgIHN0cmluZyB0byBmaW5kCisgKgorICogICAgIFJldHVybnM6IE5TSW50ZWdlciAgICAgIGluZGljYXRvciBvZiBTVUNDRVNTIE9SIEZBSUxVUkUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpUmVtb3ZlU3ltOihOU1N0cmluZyAqKXMKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wLCAqdG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWR4ID0gW3NlbGYgaGFzaDpzXTsKKyAgICBmb3IgKCB0bXAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XSwgbnAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICB0bXAgPSBbbnAgZ2V0Zk5leHRdOyAgICAgICAgICAgICAvKiBnZXQgdGhlIG5leHQgbGluayAgKi8KKyAgICAgICAgICAgIFtucCBkZWFsbG9jXTsKKyAgICAgICAgICAgIHJldHVybiggU1VDQ0VTUyApOyAgICAgICAgICAgIC8qIHJlcG9ydCBTVUNDRVNTICAgICAqLworICAgICAgICB9CisgICAgICAgIHRtcCA9IFtucCBnZXRmTmV4dF07ICAgICAgICAgICAgICAvLyAgQkFEISEhISEhCisgICAgfQorICAgIHJldHVybiggRkFJTFVSRSApOyAgICAgICAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk1hcEVsZW1lbnQgKilucAoreworICAgIGlmICggW25wIGdldGZOZXh0XSAhPSBuaWwgKQorCQlbc2VsZiBkZWxldGVfY2hhaW46W25wIGdldGZOZXh0XV07CisJW25wIGRlYWxsb2NdOworfQorCisjaWZkZWYgRE9OVFVTRVlFVAorLShOU0ludGVnZXIpYmxkX3N5bXRhYjooS1dfVEFCTEUgKil0b2tuYW1zCit7CisgICAgTlNJbnRlZ2VyIGk7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyAqKHRva25hbXNbaV0ubmFtZSkgIT0gJ1wwJzsgaSsrICkgeworICAgICAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICAgICAgbnAgPSBbQU5UTFJNYXBFbGVtZW50IG5ld0FOVExSTWFwRWxlbWVudDpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiwgdG9rbmFtc1tpXS5uYW1lXV07CisgICAgICAgIC8vICAgICAgICBucC0+ZlR5cGUgPSB0b2tuYW1zW2ldLnRva251bTsKKyAgICAgICAgW3NlbGYgaW5zdGFsbDpucCBTY29wZTowXTsKKyAgICB9CisgICAgcmV0dXJuKCBTVUNDRVNTICk7Cit9CisjZW5kaWYKKworLShBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggcHRyQnVmZmVyW2lkeF0gKTsKK30KKworLShBTlRMUk1hcEVsZW1lbnQgKiopZ2V0cHRyQnVmZmVyCit7CisJcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldHB0ckJ1ZmZlcjooQU5UTFJNYXBFbGVtZW50ICopbnAgSW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKwlpZiAoIGlkeCA8IEJ1ZmZTaXplICkgeworICAgICAgICBbbnAgcmV0YWluXTsKKwkJcHRyQnVmZmVyW2lkeF0gPSBucDsKKyAgICB9Cit9CisKKy0oTlNJbnRlZ2VyKWdldFNjb3BlCit7CisJcmV0dXJuKCBTY29wZSApOworfQorCistKHZvaWQpc2V0U2NvcGVTY29wZTooTlNJbnRlZ2VyKWkKK3sKKwlTY29wZSA9IGk7Cit9CisKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldFRUeXBlOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07Cit9CisKKy8qCisgKiB3b3JrcyBvbmx5IGZvciBtYXBsaXN0IGluZGV4ZWQgbm90IGJ5IG5hbWUgYnV0IGJ5IFRva2VuTnVtYmVyCisgKi8KKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgTlNJbnRlZ2VyIGFUVHlwZTsKKworICAgIGFUVHlwZSA9IHR0eXBlICUgQnVmZlNpemU7CisgICAgZm9yKCBucCA9IHNlbGYtPnB0ckJ1ZmZlclt0dHlwZV07IG5wICE9IG5pbDsgbnAgPSBbbnAgZ2V0Zk5leHRdICkgeworICAgICAgICBpZiAoIFtucC5pbmRleCBpbnRlZ2VyVmFsdWVdID09IHR0eXBlICkgeworICAgICAgICAgICAgcmV0dXJuKCBucCApOyAgICAgICAgLyogICBmb3VuZCBpdCAgICAgICAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKy0gKEFOVExSTGlua0Jhc2UgKilnZXROYW1lOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07IC8qICBuaWwgaWYgbm90IGZvdW5kICAgICAgKi8gICAgCit9CisKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6W05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6bmFtZV0gVHlwZTp0dHlwZV07CisgICAgLy8gICAgICAgIG5wLT5mVHlwZSA9IHRva25hbXNbaV0udG9rbnVtOworICAgIFtzZWxmIGluc3RhbGw6bnAgU2NvcGU6MF07Cit9CisKKy0gKE5TSW50ZWdlcilnZXRNb2RlCit7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlCit7CisgICAgbW9kZSA9IGFNb2RlOworfQorCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKWFSdWxlCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKworICAgIGlkeCA9IFtzZWxmIGNvdW50XTsKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCisvKiB0aGlzIG1heSBoYXZlIHRvIGhhbmRsZSBsaW5raW5nIGludG8gdGhlIGNoYWluCisgKi8KKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmICggaWR4ID49IEJ1ZmZTaXplICkgeworICAgICAgICBpZHggJT0gQnVmZlNpemU7CisgICAgfQorICAgIGlmIChhUnVsZSAhPSBwdHJCdWZmZXJbaWR4XSkgeworICAgICAgICBpZiAocHRyQnVmZmVyW2lkeF0gIT0gbmlsKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChpZClvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIGlkeCAlPSBCdWZmU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHB0ckJ1ZmZlcltpZHhdOworfQorCisvKiB0aGlzIHdpbGwgbmV2ZXIgbGluayBpbnRvIHRoZSBjaGFpbgorICovCistICh2b2lkKSBzZXRPYmplY3Q6KGlkKWFSdWxlIGF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBpZiAoYVJ1bGUgIT0gcHRyQnVmZmVyW2lkeF0pIHsKKyAgICAgICAgaWYgKHB0ckJ1ZmZlcltpZHhdICE9IG5pbCkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBbYVJ1bGUgcmV0YWluXTsKKyAgICB9CisgICAgcHRyQnVmZmVyW2lkeF0gPSBhUnVsZTsKK30KKworLSAodm9pZClwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIAorICAgIG5wID0gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MCBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6bmFtZSBOb2RlOmFOb2RlXTsKKyAgICAgICAgaWYgKHB0ckJ1ZmZlcltMYXN0SGFzaF0gIT0gbmlsKQorICAgICAgICAgICAgW3B0ckJ1ZmZlcltMYXN0SGFzaF0gcmVsZWFzZV07CisgICAgICAgIFtucCByZXRhaW5dOworICAgICAgICBucC5mTmV4dCA9IHB0ckJ1ZmZlclsgTGFzdEhhc2ggXTsKKyAgICAgICAgcHRyQnVmZmVyWyBMYXN0SGFzaCBdID0gbnA7CisgICAgfQorICAgIHJldHVybjsgICAgCit9CisKKy0gKE5TRW51bWVyYXRvciAqKW9iamVjdEVudW1lcmF0b3IKK3sKKyAgICBOU0VudW1lcmF0b3IgKmFuRW51bWVyYXRvcjsKKworICAgIGl0SW5kZXggPSAwOworICAgIHJldHVybiBhbkVudW1lcmF0b3I7Cit9CisKKy0gKEJPT0wpaGFzTmV4dAoreworICAgIGlmIChzZWxmICYmIFtzZWxmIGNvdW50XSA8IEJ1ZmZTaXplLTEpIHsKKyAgICAgICAgcmV0dXJuIFlFUzsKKyAgICB9CisgICAgcmV0dXJuIE5POworfQorCistIChBTlRMUk1hcEVsZW1lbnQgKiluZXh0T2JqZWN0Cit7CisgICAgaWYgKHNlbGYgJiYgaXRJbmRleCA8IEJ1ZmZTaXplLTEpIHsKKyAgICAgICAgcmV0dXJuIHB0ckJ1ZmZlcltpdEluZGV4XTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSSGFzaFJ1bGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkhhc2hSdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NThlOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkhhc2hSdWxlLmgKQEAgLTAsMCArMSw3MiBAQAorLy8KKy8vICBBTlRMUkhhc2hSdWxlLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdWxlTWVtby5oIgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSSGFzaFJ1bGUgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy8JQU5UTFJIYXNoUnVsZSAqZk5leHQ7CisgICAgLy8gICAgVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKKyAgICBOU0ludGVnZXIgbW9kZTsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSSGFzaFJ1bGUgKmZOZXh0OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdEhhc2gsIHNldHRlcj1zZXRMYXN0SGFzaDopIE5TSW50ZWdlciBMYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKGlkKW5ld0FOVExSSGFzaFJ1bGU7CisrIChpZCluZXdBTlRMUkhhc2hSdWxlV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistICh2b2lkKWRlbGV0ZUFOVExSSGFzaFJ1bGU6KEFOVExSUnVsZU1lbW8gKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnA7CistIChBTlRMUlJ1bGVNZW1vICoqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihBTlRMUlJ1bGVNZW1vICoqKW5wOworLSAoTlNOdW1iZXIgKilnZXRSdWxlTWVtb1N0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAodm9pZClwdXRSdWxlTWVtb0F0U3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXg7CistIChOU0ludGVnZXIpZ2V0TW9kZTsKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlOworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKUluZGV4OworLSAoQU5UTFJSdWxlTWVtbyAqKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkhhc2hSdWxlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJIYXNoUnVsZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2UzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJIYXNoUnVsZS5tCkBAIC0wLDAgKzEsMjgxIEBACisvLworLy8gIEFOVExSSGFzaFJ1bGUubQorLy8gIEFOVExSCisvLworLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9VTktOT1dOIC0xCisKKyNpbXBvcnQgIkFOVExSSGFzaFJ1bGUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaFJ1bGUKKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSSGFzaFJ1bGUKKworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoUnVsZQoreworICAgIEFOVExSSGFzaFJ1bGUgKmFOZXdBTlRMUkhhc2hSdWxlOworICAgIAorICAgIGFOZXdBTlRMUkhhc2hSdWxlID0gW1tBTlRMUkhhc2hSdWxlIGFsbG9jXSBpbml0XTsKKwlyZXR1cm4oIGFOZXdBTlRMUkhhc2hSdWxlICk7Cit9CisKKysoaWQpbmV3QU5UTFJIYXNoUnVsZVdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphTmV3QU5UTFJIYXNoUnVsZTsKKyAgICAKKyAgICBhTmV3QU5UTFJIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBhbGxvY10gaW5pdFdpdGhMZW46YUJ1ZmZTaXplXTsKKwlyZXR1cm4oIGFOZXdBTlRMUkhhc2hSdWxlICk7Cit9CisKKy0oaWQpaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpIQVNIU0laRV0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0oaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46YUJ1ZmZTaXplXSkgIT0gbmlsKSB7CisJCWZOZXh0ID0gbmlsOworICAgICAgICBtb2RlID0gMDsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisgICAgQU5UTFJSdWxlTWVtbyAqdG1wLCAqcnRtcDsKKyAgICBpbnQgSW5kZXg7CisJCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBJbmRleCA9IDA7IEluZGV4IDwgQnVmZlNpemU7IEluZGV4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgJiYgdG1wICE9IHB0ckJ1ZmZlcltJbmRleF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICAvLyB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJSdWxlTWVtbyAqKXRtcC5mTmV4dDsKKyAgICAgICAgICAgICAgICBbcnRtcCBkZWFsbG9jXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TSW50ZWdlciljb3VudAoreworICAgIGlkIGFuRWxlbWVudDsKKyAgICBOU0ludGVnZXIgYUNudCA9IDA7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrKSB7CisgICAgICAgIGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXTsKKyAgICAgICAgaWYgKCBhbkVsZW1lbnQgIT0gbmlsICkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgbGVuZ3RoCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistIChOU0ludGVnZXIpIHNpemUKK3sKKyAgICBpZCBhbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFTaXplID0gMDsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkgeworICAgICAgICAgICAgYVNpemUgKz0gc2l6ZW9mKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYVNpemU7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistKHZvaWQpZGVsZXRlQU5UTFJIYXNoUnVsZTooQU5UTFJSdWxlTWVtbyAqKW5wCit7CisgICAgQU5UTFJSdWxlTWVtbyAqdG1wLCAqcnRtcDsKKyAgICBpbnQgSW5kZXg7CisgICAgCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBJbmRleCA9IDA7IEluZGV4IDwgQnVmZlNpemU7IEluZGV4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbSW5kZXhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgJiYgdG1wICE9IHB0ckJ1ZmZlcltJbmRleCBdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnAKK3sKKyAgICBpZiAoIG5wLmZOZXh0ICE9IG5pbCApCisJCVtzZWxmIGRlbGV0ZV9jaGFpbjpucC5mTmV4dF07CisJW25wIGRlYWxsb2NdOworfQorCistKEFOVExSUnVsZU1lbW8gKiopZ2V0UHRyQnVmZmVyCit7CisJcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldFB0ckJ1ZmZlcjooQU5UTFJSdWxlTWVtbyAqKilucAoreworCXB0ckJ1ZmZlciA9IG5wOworfQorCistIChOU051bWJlciAqKWdldFJ1bGVNZW1vU3RvcEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphUnVsZTsKKyAgICBOU051bWJlciAqc3RvcEluZGV4OworICAgIE5TSW50ZWdlciBhbkluZGV4OworICAgIAorICAgIGFuSW5kZXggPSAoIGFTdGFydEluZGV4ID49IEJ1ZmZTaXplICkgPyBhU3RhcnRJbmRleCAlPSBCdWZmU2l6ZSA6IGFTdGFydEluZGV4OworICAgIGlmICgoYVJ1bGUgPSBwdHJCdWZmZXJbYW5JbmRleF0pID09IG5pbCkgeworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBzdG9wSW5kZXggPSBbYVJ1bGUgZ2V0U3RvcEluZGV4OmFTdGFydEluZGV4XTsKKyAgICByZXR1cm4gc3RvcEluZGV4OworfQorCistICh2b2lkKXB1dFJ1bGVNZW1vOihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgQXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBOU0ludGVnZXIgYW5JbmRleDsKKyAgICAKKyAgICBhbkluZGV4ID0gKGFTdGFydEluZGV4ID49IEJ1ZmZTaXplKSA/IGFTdGFydEluZGV4ICU9IEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKCBwdHJCdWZmZXJbYW5JbmRleF0gPT0gbmlsICkgeworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoIFthUnVsZS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV0gPT0gYVN0YXJ0SW5kZXggKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHNldFN0YXJ0SW5kZXg6YVJ1bGUuc3RvcEluZGV4XTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZSA9IGFSdWxlLmZOZXh0OworICAgICAgICB9IHdoaWxlICggYVJ1bGUgIT0gbmlsICk7CisgICAgfQorfQorCistICh2b2lkKXB1dFJ1bGVNZW1vQXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXggU3RvcEluZGV4OihOU0ludGVnZXIpYVN0b3BJbmRleAoreworICAgIEFOVExSUnVsZU1lbW8gKmFSdWxlLCAqbmV3UnVsZTsKKyAgICBOU0ludGVnZXIgYW5JbmRleDsKKyAgICBOU0ludGVnZXIgYU1hdGNoSW5kZXg7CisKKyAgICBhbkluZGV4ID0gKGFTdGFydEluZGV4ID49IEJ1ZmZTaXplKSA/IGFTdGFydEluZGV4ICU9IEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKChhUnVsZSA9IHB0ckJ1ZmZlclthbkluZGV4XSkgPT0gbmlsICkgeworICAgICAgICBhUnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcEluZGV4OltOU051bWJlciBudW1iZXJXaXRoSW50ZWdlcjphU3RvcEluZGV4XV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFNYXRjaEluZGV4ID0gW2FSdWxlLnN0YXJ0SW5kZXggaW50ZWdlclZhbHVlXTsKKyAgICAgICAgaWYgKCBhU3RhcnRJbmRleCA+IGFNYXRjaEluZGV4ICkgeworICAgICAgICAgICAgaWYgKCBhUnVsZSAhPSBwdHJCdWZmZXJbYW5JbmRleF0gKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZS5mTmV4dCA9IHB0ckJ1ZmZlclthbkluZGV4XTsKKyAgICAgICAgICAgIHB0ckJ1ZmZlclthbkluZGV4XSA9IGFSdWxlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChhUnVsZS5mTmV4dCAhPSBuaWwpIHsKKyAgICAgICAgICAgIGFNYXRjaEluZGV4ID0gWygoQU5UTFJSdWxlTWVtbyAqKWFSdWxlLmZOZXh0KS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV07CisgICAgICAgICAgICBpZiAoIGFTdGFydEluZGV4ID4gYU1hdGNoSW5kZXggKSB7CisgICAgICAgICAgICAgICAgbmV3UnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0b3BJbmRleF1dOworICAgICAgICAgICAgICAgIFtuZXdSdWxlIHJldGFpbl07CisgICAgICAgICAgICAgICAgbmV3UnVsZS5mTmV4dCA9IGFSdWxlLmZOZXh0OworICAgICAgICAgICAgICAgIGFSdWxlLmZOZXh0ID0gbmV3UnVsZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFNYXRjaEluZGV4ID09IGFTdGFydEluZGV4ICkgeworICAgICAgICAgICAgICAgIFthUnVsZSBzZXRTdGFydEluZGV4OmFSdWxlLnN0b3BJbmRleF07CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYVJ1bGUgPSBhUnVsZS5mTmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworLSAoTlNJbnRlZ2VyKWdldExhc3RIYXNoCit7CisgICAgcmV0dXJuIExhc3RIYXNoOworfQorCistICh2b2lkKXNldExhc3RIYXNoOihOU0ludGVnZXIpYUhhc2gKK3sKKyAgICBMYXN0SGFzaCA9IGFIYXNoOworfQorCistIChOU0ludGVnZXIpZ2V0TW9kZQoreworICAgIHJldHVybiBtb2RlOworfQorCistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZQoreworICAgIG1vZGUgPSBhTW9kZTsKK30KKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKKyAgICBOU0ludGVnZXIgSW5kZXg7CisgICAgCisgICAgSW5kZXggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJT0gQnVmZlNpemUgOiBhbkluZGV4OworICAgIGlmIChhUnVsZSAhPSBwdHJCdWZmZXJbSW5kZXhdKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbSW5kZXhdICE9IG5pbCkgeworICAgICAgICAgICAgW3B0ckJ1ZmZlcltJbmRleF0gcmVsZWFzZV07CisgICAgICAgIH0KKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltJbmRleF0gPSBhUnVsZTsKK30KKworLSAoQU5UTFJSdWxlTWVtbyAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilhbkluZGV4Cit7CisgICAgTlNJbnRlZ2VyIGFuSWR4OworCisgICAgYW5JZHggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJT0gQnVmZlNpemUgOiBhbkluZGV4OworICAgIHJldHVybiBwdHJCdWZmZXJbYW5JZHhdOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkludEFycmF5LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJJbnRBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjliMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJJbnRBcnJheS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJJbnRBcnJheS5oCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBBTlRMUl9JTlRfQVJSQVlfSU5JVElBTF9TSVpFIDEwCisKK0BpbnRlcmZhY2UgQU5UTFJJbnRBcnJheSA6IEFOVExSUHRyQnVmZmVyIAoreworfQorCisrIChBTlRMUkludEFycmF5ICopbmV3QU5UTFJJbnRBcnJheTsKKysgKEFOVExSSW50QXJyYXkgKiluZXdBTlRMUkludEFycmF5V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoTGVuOihOU0ludGVnZXIpYUxlbjsKKworLSAodm9pZCkgZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKHZvaWQpIGFkZEludGVnZXI6KE5TSW50ZWdlcikgdjsKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgdjsKKy0gKE5TSW50ZWdlcikgcG9wOworLSAoTlNJbnRlZ2VyKSBpbnRlZ2VyQXRJbmRleDooTlNJbnRlZ2VyKSBpOworLSAodm9pZCkgaW5zZXJ0SW50ZWdlcjooTlNJbnRlZ2VyKWFuSW50ZWdlciBBdEluZGV4OihOU0ludGVnZXIpIGlkeDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKHZvaWQpIHJlc2V0OworCistIChOU0ludGVnZXIpIGNvdW50OworLSAoTlNJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJJbnRTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkludFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3OTBjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJJbnRTdHJlYW0uaApAQCAtMCwwICsxLDkzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworQHByb3RvY29sIEFOVExSSW50U3RyZWFtIDwgTlNPYmplY3QsIE5TQ29weWluZyA+CisKKy0gKHZvaWQpIGNvbnN1bWU7CisKKy8vIEdldCB1bmljaGFyIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgY2hhcmFjdGVyIGFzIGludCBmb3IgaW5jbHVkaW5nIEFOVExSQ2hhclN0cmVhbUVPRiAoLTEpIGluIHRoZSBkYXRhIHJhbmdlCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisKKy8vIFRlbGwgdGhlIHN0cmVhbSB0byBzdGFydCBidWZmZXJpbmcgaWYgaXQgaGFzbid0IGFscmVhZHkuICBSZXR1cm4KKy8vIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24sIGluZGV4KCksIG9yIHNvbWUgb3RoZXIgbWFya2VyIHNvIHRoYXQKKy8vIHdoZW4gcGFzc2VkIHRvIHJld2luZCgpIHlvdSBnZXQgYmFjayB0byB0aGUgc2FtZSBzcG90LgorLy8gcmV3aW5kKG1hcmsoKSkgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIGlucHV0IGN1cnNvci4KKy8vIFRPRE86IHByb2JsZW0gaW4gdGhhdCBsZXhlciBzdHJlYW0gcmV0dXJucyBub3QgaW5kZXggYnV0IHNvbWUgbWFya2VyIAorCistIChOU0ludGVnZXIpIG1hcms7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wgaW5kZXggMC4ubiB3aGVyZSBuIGluZGljYXRlcyB0aGUKKy8vIGxhc3Qgc3ltYm9sIGhhcyBiZWVuIHJlYWQuCisKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXg7CisKKy8vIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBuZXh0IGNhbGwgdG8gaW5kZXggd291bGQgcmV0dXJuIG1hcmtlci4KKy8vIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIC1pbmRleCBidXQgaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSXQncworLy8ganVzdCBhIG1hcmtlciB0byBpbmRpY2F0ZSB3aGF0IHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluLiAgVGhpcyBpcworLy8gZXNzZW50aWFsbHkgY2FsbGluZyAtcmVsZWFzZTogYW5kIC1zZWVrOi4gIElmIHRoZXJlIGFyZSBtYXJrZXJzCisvLyBjcmVhdGVkIGFmdGVyIHRoaXMgbWFya2VyIGFyZ3VtZW50LCB0aGlzIHJvdXRpbmUgbXVzdCB1bnJvbGwgdGhlbQorLy8gbGlrZSBhIHN0YWNrLiAgQXNzdW1lIHRoZSBzdGF0ZSB0aGUgc3RyZWFtIHdhcyBpbiB3aGVuIHRoaXMgbWFya2VyCisvLyB3YXMgY3JlYXRlZC4KKworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKworLy8gWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKy8vIHN0cmVhbSB0byBrZWVwIGJvb2trZWVwaW5nIG9iamVjdHMgYXJvdW5kIGZvciBhIG1hcmtlciB0aGF0IGlzCisvLyBubyBsb25nZXIgbmVjZXNzYXJ5LiAgVGhpcyB3aWxsIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgYXMKKy8vIHJld2luZCgpIGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dCB0aGUgYmFja3dhcmQgc2Vlay4KKworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CisKKy8vIFNldCB0aGUgaW5wdXQgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXguICBUaGlzIGlzCisvLyBub3JtYWxseSB1c2VkIHRvIHNlZWsgYWhlYWQgaW4gdGhlIGlucHV0IHN0cmVhbS4gIE5vIGJ1ZmZlcmluZyBpcworLy8gcmVxdWlyZWQgdG8gZG8gdGhpcyB1bmxlc3MgeW91IGtub3cgeW91ciBzdHJlYW0gd2lsbCB1c2Ugc2VlayB0bworLy8gbW92ZSBiYWNrd2FyZHMgc3VjaCBhcyB3aGVuIGJhY2t0cmFja2luZy4KKy8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gcmV3aW5kIGluIGl0cyBtdWx0aS1kaXJlY3Rpb25hbAorLy8gcmVxdWlyZW1lbnQgYW5kIGluIHRoYXQgaXRzIGFyZ3VtZW50IGlzIHN0cmljdGx5IGFuIGlucHV0IGN1cnNvciAoaW5kZXgpLgorLy8KKy8vIEZvciBjaGFyIHN0cmVhbXMsIHNlZWtpbmcgZm9yd2FyZCBtdXN0IHVwZGF0ZSB0aGUgc3RyZWFtIHN0YXRlIHN1Y2gKKy8vIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisvLyBiYWNrdHJhY2tpbmcgdXNpbmcgdGhlIG1hcmsvcmV3aW5kIG1lY2hhbmlzbSB0aGF0IHJlc3RvcmVzIHN0YXRlIGFuZAorLy8gc28gdGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byB1cGRhdGUgc3RhdGUgd2hlbiBzZWVraW5nIGJhY2t3YXJkcy4KKy8vCisvLyBDdXJyZW50bHksIHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCBmb3IgZWZmaWNpZW50IGJhY2t0cmFja2luZywgYnV0CisvLyBpbiB0aGUgZnV0dXJlIGl0IG1heSBiZSB1c2VkIGZvciBpbmNyZW1lbnRhbCBwYXJzaW5nLgorCistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworCisvKiogT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCBidXQKKyAqICBtaWdodCBiZSB1c2VmdWwgdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmVhbSBvciBmb3IgdGVzdGluZy4gIFRoaXMKKyAqICB2YWx1ZSBpbmNsdWRlcyBhIHNpbmdsZSBFT0YuCisgKi8KKy0gKE5TVUludGVnZXIpIHNpemU7CisvKiogV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICogIHBhc3MgdGhlIGJ1Y2sgYWxsIHRoZSB3YXkgdG8gdGhlIGxleGVyIHdobyBjYW4gYXNrIGl0cyBpbnB1dCBzdHJlYW0KKyAqICBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41Y2ZiMzZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTGV4ZXIuaApAQCAtMCwwICsxLDkwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJMZXhlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgPEFOVExSVG9rZW5Tb3VyY2U+IHsKKwlpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OyAgICAgIC8vLzwgVGhlIGNoYXJhY3RlciBzdHJlYW0gd2UgcHVsbCB0b2tlbnMgb3V0IG9mLgorCU5TVUludGVnZXIgcnVsZU5lc3RpbmdMZXZlbDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRJbnB1dCwgc2V0dGVyPXNldElucHV0OikgaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFJ1bGVOZXN0aW5nTGV2ZWwsIHNldHRlcj1zZXRSdWxlTmVzdGluZ0xldmVsKSBOU1VJbnRlZ2VyIHJ1bGVOZXN0aW5nTGV2ZWw7CisKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPikgYW5JbnB1dDsKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopem9uZTsKKworLSAodm9pZCkgcmVzZXQ7CisKKy8vIC0gKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIHN0YXRlOworCisjcHJhZ21hIG1hcmsgVG9rZW5zCistIChpZDxBTlRMUlRva2VuPilnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbjsKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistICh2b2lkKSBtVG9rZW5zOwkJLy8gYWJzdHJhY3QsIGRlZmluZWQgaW4gZ2VuZXJhdGVkIHNvdXJjZXMKKy0gKHZvaWQpIHNraXA7CistIChpZDxBTlRMUkNoYXJTdHJlYW0+KSBnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OihpZDxBTlRMUkNoYXJTdHJlYW0+KWFDaGFyU3RyZWFtOworCistICh2b2lkKSBlbWl0OworLSAodm9pZCkgZW1pdDooaWQ8QU5UTFJUb2tlbj4pYVRva2VuOworCisjcHJhZ21hIG1hcmsgTWF0Y2hpbmcKKy0gKHZvaWQpIG1hdGNoU3RyaW5nOihOU1N0cmluZyAqKWFTdHJpbmc7CistICh2b2lkKSBtYXRjaEFueTsKKy0gKHZvaWQpIG1hdGNoQ2hhcjoodW5pY2hhcikgYUNoYXI7CistICh2b2lkKSBtYXRjaFJhbmdlRnJvbUNoYXI6KHVuaWNoYXIpZnJvbUNoYXIgdG86KHVuaWNoYXIpdG9DaGFyOworCisjcHJhZ21hIG1hcmsgSW5mb3JtYXRpb25hbAorLSAoTlNVSW50ZWdlcikgZ2V0TGluZTsKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXg7CistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworLy8gZXJyb3IgaGFuZGxpbmcKKy0gKHZvaWQpIHJlcG9ydEVycm9yOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihOU011dGFibGVBcnJheSAqKXRva2VuTmFtZXM7CistIChOU1N0cmluZyAqKWdldENoYXJFcnJvckRpc3BsYXk6KE5TSW50ZWdlciljOworLSAodm9pZCkgcmVjb3ZlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKXRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOGFlMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworQGludGVyZmFjZSBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlIDogTlNPYmplY3QgeworCWludCBzdGFydFRva2VuOworCWludCBzdG9wVG9rZW47Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0U3RhcnQ7CistICh2b2lkKSBzZXRTdGFydDogKE5TSW50ZWdlcikgYVN0YXJ0OworCistIChOU0ludGVnZXIpIGdldFN0b3A7CistICh2b2lkKSBzZXRTdG9wOiAoTlNJbnRlZ2VyKSBhU3RvcDsKKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkxpbmtCYXNlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJMaW5rQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDE5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJMaW5rQmFzZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vCisvLyAgQU5UTFJMaW5rQmFzZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE0LzEwLgorLy8gIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0Bwcm90b2NvbCBBTlRMUkxpbmtMaXN0IDxOU09iamVjdD4KKworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTsKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U6KGlkPEFOVExSTGlua0xpc3Q+KW5wIFByZXY6KGlkPEFOVExSTGlua0xpc3Q+KXBwOworCistICh2b2lkKSBkZWFsbG9jOworCistIChpZDxBTlRMUkxpbmtMaXN0PikgYXBwZW5kOihpZDxBTlRMUkxpbmtMaXN0Pilub2RlOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pIGluc2VydDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pIGdldGZOZXh0OworLSAodm9pZCkgc2V0Rk5leHQ6KGlkPEFOVExSTGlua0xpc3Q+KW5wOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0ZlByZXY7CistICh2b2lkKSBzZXRGUHJldjooaWQ8QU5UTFJMaW5rTGlzdD4pcHA7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkxpbmtCYXNlIDogTlNPYmplY3QgPEFOVExSTGlua0xpc3Q+IHsKKwlpZDxBTlRMUkxpbmtMaXN0PiBmUHJldjsKKwlpZDxBTlRMUkxpbmtMaXN0PiBmTmV4dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRmUHJldiwgc2V0dGVyPXNldEZQcmV2OikgaWQ8QU5UTFJMaW5rTGlzdD4gZlByZXY7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldGZOZXh0LCBzZXR0ZXI9c2V0Rk5leHQ6KSBpZDxBTlRMUkxpbmtMaXN0PiBmTmV4dDsKKworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTsKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U6KGlkPEFOVExSTGlua0xpc3Q+KW5wIFByZXY6KGlkPEFOVExSTGlua0xpc3Q+KXBwOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4paW5pdDsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluaXRXaXRoUHRyOihpZClucCBQcmV2OihpZClwcDsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWFwcGVuZDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluc2VydDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZTsKKworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0Zk5leHQ7CistICh2b2lkKXNldEZOZXh0OihpZDxBTlRMUkxpbmtMaXN0PikgbnA7CistIChpZDxBTlRMUkxpbmtMaXN0PilnZXRmUHJldjsKKy0gKHZvaWQpc2V0RlByZXY6KGlkPEFOVExSTGlua0xpc3Q+KSBwcDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkxvb2thaGVhZFN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTG9va2FoZWFkU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0OGZmNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUkxvb2thaGVhZFN0cmVhbS5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vCisvLyAgQU5UTFJMb29rYWhlYWRTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vICBbVGhlICJCU0QgbGljZW5jZSJdCisvLyAgQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkZhc3RRdWV1ZS5oIgorCisjZGVmaW5lIFVOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYIE5TSW50ZWdlck1heAorCitAaW50ZXJmYWNlIEFOVExSTG9va2FoZWFkU3RyZWFtIDogQU5UTFJGYXN0UXVldWUKK3sKKwlpZCBlb2Y7CisJTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworfQorCitAcHJvcGVydHkgKHJlYWR3cml0ZSwgcmV0YWluLCBnZXR0ZXI9Z2V0RW9mLCBzZXR0ZXI9c2V0RW9mKSBpZCBlb2Y7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEVvZkVsZW1lbnRJbmRleCwgc2V0dGVyPXNldEVvZkVsZW1lbnRJbmRleCkgTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGFzdE1hcmtlciwgc2V0dGVyPXNldExhc3RNYXJrZXIpIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRNYXJrRGVwdGgsIHNldHRlcj1zZXRNYXJrRGVwdGgpIE5TSW50ZWdlciBtYXJrRGVwdGg7CisKKy0gKGlkKSBpbml0V2l0aEVPRjooaWQpIG87CistIChpZCkgbmV4dEVsZW1lbnQ7CistICh2b2lkKSBjb25zdW1lOworLSAodm9pZCkgc3luYzooTlNJbnRlZ2VyKSBuZWVkOworLSAodm9pZCkgZmlsbDooTlNJbnRlZ2VyKSBuOworLSAoaWQpIExUOihOU0ludGVnZXIpIGk7CistIChpZCkgTEI6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBjdXJyZW50U3ltYm9sOworLSAoTlNJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKE5TSW50ZWdlcikgbWFyazsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBnZXRFb2Y7CistICh2b2lkKSBzZXRFb2Y6KGlkKSBhbklEOworLSAoTlNJbnRlZ2VyKSBnZXRFb2ZFbGVtZW50SW5kZXg7CistICh2b2lkKSBzZXRFb2ZFbGVtZW50SW5kZXg6KE5TSW50ZWdlcikgYW5JbnQ7CistIChOU0ludGVnZXIpIGdldExhc3RNYXJrZXI7CistICh2b2lkKSBzZXRMYXN0TWFya2VyOihOU0ludGVnZXIpIGFuSW50OworLSAoTlNJbnRlZ2VyKSBnZXRNYXJrRGVwdGg7CistICh2b2lkKSBzZXRNYXJrRGVwdGg6KE5TSW50ZWdlcikgYW5JbnQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1hcC5oCkBAIC0wLDAgKzEsODIgQEAKKy8vCisvLyAgQU5UTFJNYXAuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAwCisvLyNkZWZpbmUgTE9DQUxfU0NPUEUgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSTWFwIDogQU5UTFJQdHJCdWZmZXIgeworCS8vQU5UTFJNYXAgKmZOZXh0OyAvLyBmb3VuZCBpbiBzdXBlcmNsYXNzCisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBsYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSTWFwICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2g6KSBOU0ludGVnZXIgbGFzdEhhc2g7CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrIChpZCluZXdBTlRMUk1hcDsKKysgKGlkKW5ld0FOVExSTWFwV2l0aExlbjooTlNJbnRlZ2VyKWFIYXNoU2l6ZTsKKworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSAodm9pZClkZWFsbG9jOworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKy8qIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KKy0oTlNJbnRlZ2VyKWhhc2g6KE5TU3RyaW5nICopczsKKy8qICAgbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzOworLyogbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistKGlkKWluc3RhbGw6KEFOVExSTWFwRWxlbWVudCAqKXN5bTsKKy8qCisgKiBkZWxldGUgZW50cnkgZnJvbSBsaXN0CisgKi8KKy0gKHZvaWQpZGVsZXRlQU5UTFJNYXA6KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoTlNJbnRlZ2VyKVJlbW92ZVN5bTooTlNTdHJpbmcgKilzOworLSAodm9pZClkZWxldGVfY2hhaW46KEFOVExSTWFwRWxlbWVudCAqKW5wOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TSW50ZWdlcilnZXROb2RlOihBTlRMUk1hcEVsZW1lbnQgKilhTm9kZTsKKy0gKHZvaWQpcHV0Tm9kZTooTlNJbnRlZ2VyKWFUVHlwZSBOb2RlOihpZClhTm9kZTsKKy0gKHZvaWQpcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIFRUeXBlOihOU0ludGVnZXIpdHR5cGU7CistICh2b2lkKXB1dE5hbWU6KE5TU3RyaW5nICopbmFtZSBOb2RlOihpZClhTm9kZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWFwRWxlbWVudC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWFwRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGQwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw2NSBAQAorLy8KKy8vICBBTlRMUk1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VNYXBFbGVtZW50LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNYXBFbGVtZW50IDogQU5UTFJCYXNlTWFwRWxlbWVudCB7CisgICAgTlNTdHJpbmcgKm5hbWU7CisgICAgaWQgICAgICAgIG5vZGU7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5hbWUsIHNldHRlcj1zZXROYW1lOikgTlNTdHJpbmcgKm5hbWU7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5vZGUsIHNldHRlcj1zZXROb2RlOikgaWQgbm9kZTsKKworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudDsKKysgKGlkKSBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBUeXBlOihOU0ludGVnZXIpYVRUeXBlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIE5vZGU6KGlkKWFOb2RlOworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhPYmoxOihpZClhbk9iajEgT2JqMjooaWQpYW5PYmoyOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIFR5cGU6KE5TSW50ZWdlcilhVFR5cGU7CistIChpZCkgaW5pdFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBOb2RlOihpZClhTm9kZTsKKy0gKGlkKSBpbml0V2l0aE9iajE6KGlkKWFuT2JqMSBPYmoyOihpZClhbk9iajI7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU0ludGVnZXIpIGNvdW50OworLSAoTlNJbnRlZ2VyKSBzaXplOworLSAoTlNTdHJpbmcgKilnZXROYW1lOworLSAodm9pZClzZXROYW1lOihOU1N0cmluZyAqKWFOYW1lOworLSAoaWQpZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQpYU5vZGU7CistICh2b2lkKXB1dE5vZGU6KGlkKWFOb2RlOworLSAodm9pZClwdXROb2RlOihpZClhTm9kZSBXaXRoOihOU0ludGVnZXIpdW5pcXVlSUQ7CisvLy0gKHZvaWQpc2V0T2JqZWN0OihpZClhTm9kZSBhdEluZGV4OmFuSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM5MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTMvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbgoreworICAgIEFOVExSQml0U2V0ICpleHBlY3Rpbmc7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZykgQU5UTFJCaXRTZXQgKmV4cGVjdGluZzsKKworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3QU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uOworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3QU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihBTlRMUkJpdFNldCAqKWV4cGVjdGluZzsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IEZvbGxvdzooQU5UTFJCaXRTZXQgKilleHBlY3Rpbmc7CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWJkYTNiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TUmFuZ2UgcmFuZ2U7Cit9CisKKysgKGlkKSBleGNlcHRpb25XaXRoUmFuZ2U6KE5TUmFuZ2UpIGFSYW5nZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlSW5wdXQ7CistIChpZCkgaW5pdFdpdGhSYW5nZTooTlNSYW5nZSkgYVJhbmdlIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSB0aGVJbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiZDQ1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU1NldCAqZXhwZWN0aW5nOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TU2V0ICpleHBlY3Rpbmc7CisKKysgKGlkKSBleGNlcHRpb25XaXRoU2V0OihOU1NldCAqKSB0aGVFeHBlY3RlZFNldCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoU2V0OihOU1NldCAqKSB0aGVFeHBlY3RlZFNldCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlU3RyZWFtOworCistIChOU1NldCAqKSBnZXRFeHBlY3Rpbmc7CistICh2b2lkKSBzZXRFeHBlY3Rpbmc6IChOU1NldCAqKSBhbkV4cGVjdGVkU2V0OworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWUxZDc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU0ludGVnZXIgZXhwZWN0aW5nOworCXVuaWNoYXIgZXhwZWN0aW5nQ2hhcjsKKwlCT09MIGlzVG9rZW5UeXBlOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TSW50ZWdlciBleHBlY3Rpbmc7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZ0NoYXIsIHNldHRlcj1zZXRFeHBlY3RpbmdDaGFyOikgdW5pY2hhciBleHBlY3RpbmdDaGFyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJc1Rva2VuVHlwZSwgc2V0dGVyPXNldElzVG9rZW5UeXBlOikgQk9PTCBpc1Rva2VuVHlwZTsKKworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKysgKGlkKSBuZXdBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbk1pc3Npbmc6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW46KGlkPEFOVExSVG9rZW4+KWluc2VydGVkOworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uQ2hhcjoodW5pY2hhcilleHBlY3RlZENoYXJhY3RlciBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworLShpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICBUb2tlbjooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWQ7CistIChpZCkgaW5pdFdpdGhDaGFyYWN0ZXI6KHVuaWNoYXIpZXhwZWN0ZWRDaGFyYWN0ZXIgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjFhYjUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0Bwcm90b2NvbCBBTlRMUkludFN0cmVhbTsKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TSW50ZWdlciBleHBlY3Rpbmc7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZykgTlNJbnRlZ2VyIGV4cGVjdGluZzsKKworKyAoaWQpIG5ld0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5OGUyNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uIDogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworICAgIGlkPEFOVExSVG9rZW4+IGluc2VydGVkOworfQorLyoqIFVzZWQgZm9yIHJlbW90ZSBkZWJ1Z2dlciBkZXNlcmlhbGl6YXRpb24gKi8KKysgKGlkKSBuZXdBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbjsKKysgKGlkKSBuZXdBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGg6KGlkPEFOVExSVG9rZW4+KWluc2VydGVkVG9rZW47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0OihOU0ludGVnZXIpZXhwZWN0ZWQgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBXaXRoOihpZDxBTlRMUlRva2VuPilpbnNlcnRlZFRva2VuOworCistIChOU0ludGVnZXIpIGdldE1pc3NpbmdUeXBlOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNzFiYWZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaApAQCAtMCwwICsxLDQzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKKwlpbnQgc3RhdGVOdW1iZXI7Cit9CisKKysgKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKikgbmV3QU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbjooTlNJbnRlZ2VyKXRoZURlY2lzaW9uTnVtYmVyIHN0YXRlOihOU0ludGVnZXIpdGhlU3RhdGVOdW1iZXIgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworLSAoQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqKSBpbml0V2l0aERlY2lzaW9uOihOU0ludGVnZXIpdGhlRGVjaXNpb25OdW1iZXIgc3RhdGU6KE5TSW50ZWdlcil0aGVTdGF0ZU51bWJlciBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CisKKy0gKHZvaWQpc2V0RGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKy0gKHZvaWQpc2V0U3RhdGVOdW1iZXI6KE5TSW50ZWdlcilzdGF0ZU51bWJlcjsKKworCitAZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSTm9kZU1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk5vZGVNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwYzkxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUk5vZGVNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1NiBAQAorLy8KKy8vICBBTlRMUlJ1bGVNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZU1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSTm9kZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBpZDxBTlRMUlRyZWU+IG5vZGU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZCBub2RlOworCisrICh2b2lkKWluaXRpYWxpemU7CisKKysgKGlkKSBuZXdBTlRMUk5vZGVNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSTm9kZU1hcEVsZW1lbnRXaXRoSW5kZXg6KGlkKWFuSW5kZXggTm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooaWQpYW5JbmRleCBOb2RlOihpZClhTm9kZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkPEFOVExSVHJlZT4pZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlBhcnNlVHJlZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUGFyc2VUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1NTRlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlBhcnNlVHJlZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJQYXJzZVRyZWUuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNy8xMi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSUGFyc2VUcmVlIDogQU5UTFJCYXNlVHJlZSB7CisJaWQ8QU5UTFJUb2tlbj4gcGF5bG9hZDsKKwlOU011dGFibGVBcnJheSAqaGlkZGVuVG9rZW5zOworfQorLyoqIEEgcmVjb3JkIG9mIHRoZSBydWxlcyB1c2VkIHRvIG1hdGNoIGEgdG9rZW4gc2VxdWVuY2UuICBUaGUgdG9rZW5zCisgKiAgZW5kIHVwIGFzIHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlIGFuZCBydWxlIG5vZGVzIGFyZSB0aGUgaW50ZXJpb3Igbm9kZXMuCisgKiAgVGhpcyByZWFsbHkgYWRkcyBubyBmdW5jdGlvbmFsaXR5LCBpdCBpcyBqdXN0IGFuIGFsaWFzIGZvciBDb21tb25UcmVlCisgKiAgdGhhdCBpcyBtb3JlIG1lYW5pbmdmdWwgKHNwZWNpZmljKSBhbmQgaG9sZHMgYSBTdHJpbmcgdG8gZGlzcGxheSBmb3IgYSBub2RlLgorICovCisrIChBTlRMUlBhcnNlVHJlZSAqKW5ld0FOVExSUGFyc2VUcmVlOihpZDxBTlRMUlRva2VuPilsYWJlbDsKKy0gKGlkKWluaXRXaXRoTGFiZWw6KGlkPEFOVExSVG9rZW4+KWxhYmVsOworCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU7CistIChOU0ludGVnZXIpZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKXNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKWluZGV4OworLSAoTlNJbnRlZ2VyKWdldFRva2VuU3RvcEluZGV4OworLSAodm9pZClzZXRUb2tlblN0b3BJbmRleDooTlNJbnRlZ2VyKWluZGV4OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdXaXRoSGlkZGVuVG9rZW5zOworLSAoTlNTdHJpbmcgKil0b0lucHV0U3RyaW5nOworLSAodm9pZClfdG9TdHJpbmdMZWF2ZXM6KE5TTXV0YWJsZVN0cmluZyAqKWJ1ZjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZGRhZjUwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUGFyc2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVJlY29nbml6ZXIuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgeworCWlkPEFOVExSVG9rZW5TdHJlYW0+IGlucHV0OworfQorKyAoQU5UTFJQYXJzZXIgKiluZXdBTlRMUlBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dDsKKysgKEFOVExSUGFyc2VyICopbmV3QU5UTFJQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQgU3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopYVN0YXRlOworCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OiAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGFuSW5wdXQ7CisKKy0gKHZvaWQpIHJlc2V0OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworLSAoQU5UTFJDb21tb25Ub2tlbiAqKWdldE1pc3NpbmdTeW1ib2w6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0U2V0OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pZ2V0VG9rZW5TdHJlYW07CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KGludClydWxlSW5kZXg7CistICh2b2lkKSB0cmFjZU91dDooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKSBydWxlSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWVmM2RkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSA6IEFOVExSUnVsZVJldHVyblNjb3BlIHsKKwlpZDxBTlRMUlRva2VuPiBzdGFydFRva2VuOworCWlkPEFOVExSVG9rZW4+IHN0b3BUb2tlbjsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnQsIHNldHRlcj1zZXRTdGFydDopIGlkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgICBpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRTdGFydDsKKy0gKHZvaWQpIHNldFN0YXJ0OiAoaWQ8QU5UTFJUb2tlbj4pIGFTdGFydDsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CistICh2b2lkKSBzZXRTdG9wOiAoaWQ8QU5UTFJUb2tlbj4pIGFTdG9wOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKil0aGVab25lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJQdHJCdWZmZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlB0ckJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGY1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJQdHJCdWZmZXIuaApAQCAtMCwwICsxLDkxIEBACisvLworLy8gIEFOVExSUHRyQnVmZmVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBCVUZGU0laRSAgICAgICAgIDEwMQorCitAaW50ZXJmYWNlIEFOVExSUHRyQnVmZmVyIDogQU5UTFJMaW5rQmFzZSB7CisJLy9BTlRMUlB0ckJ1ZmZlciAqZk5leHQ7CisgICAgTlNJbnRlZ2VyIEJ1ZmZTaXplOworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKKyAgICBpZCAqcHRyQnVmZmVyOworICAgIE5TSW50ZWdlciBjb3VudDsKKyAgICBOU0ludGVnZXIgcHRyOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRCdWZmU2l6ZSwgc2V0dGVyPXNldEJ1ZmZTaXplOikgTlNJbnRlZ2VyIEJ1ZmZTaXplOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRCdWZmZXIsIHNldHRlcj1zZXRCdWZmZXI6KSBOU011dGFibGVEYXRhICpidWZmZXI7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFB0ckJ1ZmZlciwgc2V0dGVyPXNldFB0ckJ1ZmZlcjopIGlkICpwdHJCdWZmZXI7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDb3VudCwgc2V0dGVyPXNldENvdW50OikgTlNJbnRlZ2VyIGNvdW50OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UHRyLCBzZXR0ZXI9c2V0UHRyOikgTlNJbnRlZ2VyIHB0cjsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcjsKKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcldpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCistIChOU011dGFibGVEYXRhICopZ2V0QnVmZmVyOworLSAodm9pZClzZXRCdWZmZXI6KE5TTXV0YWJsZURhdGEgKilucDsKKy0gKE5TSW50ZWdlcilnZXRDb3VudDsKKy0gKHZvaWQpc2V0Q291bnQ6KE5TSW50ZWdlcilhQ291bnQ7CistIChpZCAqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihpZCAqKW5wOworLSAoTlNJbnRlZ2VyKWdldFB0cjsKKy0gKHZvaWQpc2V0UHRyOihOU0ludGVnZXIpbnA7CisKKy0gKHZvaWQpIHB1c2g6KGlkKSB2OworLSAoaWQpIHBvcDsKKy0gKGlkKSBwZWVrOworCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKSB2OworLSAodm9pZCkgYWRkT2JqZWN0c0Zyb21BcnJheTooQU5UTFJQdHJCdWZmZXIgKilhbkFycmF5OworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoaWQpICAgb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKHZvaWQpIHJlbW92ZUFsbE9iamVjdHM7CisKKy0gKHZvaWQpIGVuc3VyZUNhcGFjaXR5OihOU0ludGVnZXIpIGluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTNkYzBlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaApAQCAtMCwwICsxLDcyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiA6IEFOVExSUnVudGltZUV4Y2VwdGlvbiB7CisJaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworCU5TSW50ZWdlciBpbmRleDsKKwlpZDxBTlRMUlRva2VuPiB0b2tlbjsKKwlpZDxBTlRMUlRyZWU+IG5vZGU7CisJdW5pY2hhciBjOworCU5TSW50ZWdlciBsaW5lOworCU5TSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RyZWFtLCBzZXR0ZXI9c2V0U3RyZWFtOikgaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuOikgaWQ8QU5UTFJUb2tlbj50b2tlbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZDxBTlRMUlRyZWU+bm9kZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExpbmUsIHNldHRlcj1zZXRMaW5lOikgTlNJbnRlZ2VyIGxpbmU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDaGFyUG9zaXRpb25JbkxpbmUsIHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU0ludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworCisrIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIG5ld0FOVExSUmVjb2duaXRpb25FeGNlcHRpb247CisrIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGV4Y2VwdGlvbldpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgYW5JbnB1dFN0cmVhbTsgCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW07CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0U3RyZWFtIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoTlNJbnRlZ2VyKSB1bmV4cGVjdGVkVHlwZTsKKy0gKGlkPEFOVExSVG9rZW4+KWdldFVuZXhwZWN0ZWRUb2tlbjsKKworLSAoaWQ8QU5UTFJJbnRTdHJlYW0+KSBnZXRTdHJlYW07CistICh2b2lkKSBzZXRTdHJlYW06IChpZDxBTlRMUkludFN0cmVhbT4pIGFTdHJlYW07CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbjsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Tm9kZTsKKy0gKHZvaWQpIHNldE5vZGU6IChpZDxBTlRMUlRyZWU+KSBhTm9kZTsKKworLSAoTlNTdHJpbmcgKilnZXRNZXNzYWdlOworCistIChOU0ludGVnZXIpZ2V0Q2hhclBvc2l0aW9uSW5MaW5lOworLSAodm9pZClzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TSW50ZWdlcilhUG9zOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0MzBiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaApAQCAtMCwwICsxLDExNiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgOiBOU09iamVjdCB7CisJTlNNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsgICAgICAgICAgLy8gYSBzdGFjayBvZiBGT0xMT1cgYml0c2V0cyB1c2VkIGZvciBjb250ZXh0IHNlbnNpdGl2ZSBwcmVkaWN0aW9uIGFuZCByZWNvdmVyeQorICAgIE5TSW50ZWdlciBfZnNwOyAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvdyBzdGFjayBwb2ludGVyCisJQk9PTCBlcnJvclJlY292ZXJ5OyAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIHJlY292ZXJpbmc/CisJTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworCUJPT0wgZmFpbGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgc29tZSBtYXRjaCBmYWlsZWQKKyAgICBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworCU5TSW50ZWdlciBiYWNrdHJhY2tpbmc7ICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcKKwlBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CQkJLy8gc3RvcmUgcHJldmlvdXMgcmVzdWx0cyBvZiBtYXRjaGluZyBydWxlcyBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGFnYWluLiBIb29rIGluIGluY3JlbWVudGFsIHN0dWZmIGhlcmUsIHRvby4KKworCWlkPEFOVExSVG9rZW4+IHRva2VuOworCU5TSW50ZWdlciAgdG9rZW5TdGFydENoYXJJbmRleDsKKwlOU1VJbnRlZ2VyIHRva2VuU3RhcnRMaW5lOworCU5TVUludGVnZXIgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKwlOU1VJbnRlZ2VyIGNoYW5uZWw7CisJTlNVSW50ZWdlciB0eXBlOworCU5TU3RyaW5nICAgKnRleHQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Rm9sbG93aW5nLCBzZXR0ZXI9c2V0Rm9sbG93aW5nOikgTlNNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgX2ZzcDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIGVycm9yUmVjb3Zlcnk7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRGYWlsZWQsIHNldHRlcj1zZXRGYWlsZWQ6KSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRCYWNrdHJhY2tpbmcsIHNldHRlcj1zZXRCYWNrdHJhY2tpbmcpIE5TSW50ZWdlciBiYWNrdHJhY2tpbmc7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFJ1bGVNZW1vLCBzZXR0ZXI9c2V0UnVsZU1lbW86KSBBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CitAcHJvcGVydHkgKGNvcHksIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuKSBpZDxBTlRMUlRva2VuPiB0b2tlbjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFR5cGUsc2V0dGVyPXNldFR5cGU6KSBOU1VJbnRlZ2VyIHR5cGU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDaGFubmVsLHNldHRlcj1zZXRDaGFubmVsOikgTlNVSW50ZWdlciBjaGFubmVsOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5TdGFydExpbmUsc2V0dGVyPXNldFRva2VuU3RhcnRMaW5lOikgTlNVSW50ZWdlciB0b2tlblN0YXJ0TGluZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYXJQb3NpdGlvbkluTGluZSxzZXR0ZXI9c2V0Q2hhclBvc2l0aW9uSW5MaW5lOikgTlNVSW50ZWdlciB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5TdGFydENoYXJJbmRleCxzZXR0ZXI9c2V0VG9rZW5TdGFydENoYXJJbmRleDopIE5TSW50ZWdlciB0b2tlblN0YXJ0Q2hhckluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dCkgTlNTdHJpbmcgKnRleHQ7CisKKysgKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlOworKyAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CisrIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOworLSAodm9pZCkgc2V0VG9rZW46KGlkPEFOVExSVG9rZW4+KSB0aGVUb2tlbjsKKworLSAoTlNVSW50ZWdlcikgZ2V0VHlwZTsKKy0gKHZvaWQpIHNldFR5cGU6KE5TVUludGVnZXIpIHRoZVRva2VuVHlwZTsKKworLSAoTlNVSW50ZWdlcikgZ2V0Q2hhbm5lbDsKKy0gKHZvaWQpIHNldENoYW5uZWw6KE5TVUludGVnZXIpIHRoZUNoYW5uZWw7CisKKy0gKE5TVUludGVnZXIpIGdldFRva2VuU3RhcnRMaW5lOworLSAodm9pZCkgc2V0VG9rZW5TdGFydExpbmU6KE5TVUludGVnZXIpIHRoZVRva2VuU3RhcnRMaW5lOworCistIChOU1VJbnRlZ2VyKSBnZXRDaGFyUG9zaXRpb25JbkxpbmU7CistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpIHRoZUNoYXJQb3NpdGlvbjsKKworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0Q2hhckluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdGFydENoYXJJbmRleDooTlNJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0Q2hhckluZGV4OworCistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworCistIChOU011dGFibGVBcnJheSAqKSBnZXRGb2xsb3dpbmc7CistICh2b2lkKXNldEZvbGxvd2luZzooTlNNdXRhYmxlQXJyYXkgKilhRm9sbG93OworLSAoQU5UTFJSdWxlU3RhY2sgKikgZ2V0UnVsZU1lbW87CistICh2b2lkKXNldFJ1bGVNZW1vOihBTlRMUlJ1bGVTdGFjayAqKWFSdWxlTWVtbzsKKy0gKEJPT0wpIGlzRXJyb3JSZWNvdmVyeTsKKy0gKHZvaWQpIHNldElzRXJyb3JSZWNvdmVyeTogKEJPT0wpIGZsYWc7CisKKy0gKEJPT0wpIGdldEZhaWxlZDsKKy0gKHZvaWQpIHNldEZhaWxlZDogKEJPT0wpIGZsYWc7CisKKy0gKE5TSW50ZWdlcikgIGdldEJhY2t0cmFja2luZzsKKy0gKHZvaWQpIHNldEJhY2t0cmFja2luZzooTlNJbnRlZ2VyKSB2YWx1ZTsKKy0gKHZvaWQpIGluY3JlYXNlQmFja3RyYWNraW5nOworLSAodm9pZCkgZGVjcmVhc2VCYWNrdHJhY2tpbmc7CistIChCT09MKSBpc0JhY2t0cmFja2luZzsKKworLSAoTlNJbnRlZ2VyKSBsYXN0RXJyb3JJbmRleDsKKy0gKHZvaWQpIHNldExhc3RFcnJvckluZGV4OihOU0ludGVnZXIpIHZhbHVlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzMmEwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaApAQCAtMCwwICsxLDg1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKwordHlwZWRlZiB1bmlvbiB7CisgICAgaWQgc2luZ2xlOworICAgIE5TTXV0YWJsZUFycmF5ICptdWx0aXBsZTsKK30gRWxlbWVudHM7CisKKy8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHNlcGFyYXRlZCBpbnRvIHN0cmVhbSBhbmQgZW51bWVyYXRvciBjbGFzc2VzCitAaW50ZXJmYWNlIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIDogTlNPYmplY3QgeworICAgIE5TSW50ZWdlciBjdXJzb3I7CisgICAgQk9PTCBkaXJ0eTsgICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgcmV0dXJuIGNvcGllcyBvZiBpdHMgZWxlbWVudHMsIHNldCB0byB0cnVlIGFmdGVyIGEgY2FsbCB0byAtcmVzZXQKKyAgICBCT09MIGlzU2luZ2xlRWxlbWVudDsKKyAgICBFbGVtZW50cyBlbGVtZW50czsKKyAgICAKKyAgICBOU1N0cmluZyAqZWxlbWVudERlc2NyaXB0aW9uOworICAgIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPUdldEN1cnNvciwgc2V0dGVyPVNldEN1cnNvcjopIE5TSW50ZWdlciBjdXJzb3I7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPUdldGRpcnR5LCBzZXR0ZXI9U2V0ZGlydHk6KSBCT09MIGRpcnR5OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1HZXRJc1NpbmdsZUVsZW1lbnQsIHNldHRlcj1TZXRJc1NpbmdsZUVsZW1lbnQ6KSBCT09MIGlzU2luZ2xlRWxlbWVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9R2V0RWxlbWVudCwgc2V0dGVyPVNldEVsZW1lbnQ6KSBFbGVtZW50cyBlbGVtZW50czsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9R2V0RWxlbWVudERlc2NyaXB0aW9uLCBzZXR0ZXI9U2V0RWxlbWVudERlc2NyaXB0aW9uOikgTlNTdHJpbmcgKmVsZW1lbnREZXNjcmlwdGlvbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9R2V0VHJlZUFkYXB0b3IsIHNldHRlcj1TZXRUcmVlQWRhcHRvcjopIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworCisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKysgKEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKikgbmV3QU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNBcnJheSAqKXRoZUVsZW1lbnRzOworCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbiBlbGVtZW50OihpZClhbkVsZW1lbnQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKHZvaWQpcmVzZXQ7CisKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3I7CisKKy0gKHZvaWQpIGFkZEVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsMCisgCistIChCT09MKSBoYXNOZXh0OworLSAoaWQ8QU5UTFJUcmVlPikgbmV4dFRyZWU7CistIChpZDxBTlRMUlRyZWU+KSBfbmV4dDsgICAgICAgLy8gaW50ZXJuYWw6IFRPRE86IHJlZGVzaWduIGlmIG5lY2Vzc2FyeS4gbWF5YmUgZGVsZWdhdGUKKworLSAoaWQpIGNvcHlFbGVtZW50OihpZCllbGVtZW50OworLSAoaWQpIHRvVHJlZTooaWQpZWxlbWVudDsKKworLSAoTlNTdHJpbmcgKikgZ2V0RGVzY3JpcHRpb247CistICh2b2lkKSBzZXREZXNjcmlwdGlvbjooTlNTdHJpbmcgKilkZXNjcmlwdGlvbjsKKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkMThiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaApAQCAtMCwwICsxLDUwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmgiDAwKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA6IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKworfQorCisrIChBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqKSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbjsKKysgKEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICopIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpYW5FbGVtZW50OworKyAoQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKKworLSAoaWQpIG5leHROb2RlOworLSAoaWQpIGR1cDooaWQpZWxlbWVudDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhNTE2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIgorCisKK0BpbnRlcmZhY2UgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIDogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0geworCit9CisKKysgKGlkKSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKillbGVtZW50RGVzY3JpcHRpb247CisvKiogQ3JlYXRlIGEgc3RyZWFtIHdpdGggb25lIGVsZW1lbnQgKi8KKysgKGlkKSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopZWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OihpZCkgb25lRWxlbWVudDsKKy8qKiBDcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0ICovCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNNdXRhYmxlQXJyYXkgKillbGVtZW50czsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhRGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYURlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpZWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KE5TTXV0YWJsZUFycmF5ICopZWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJlYW0gYW5kIG1ha2UgYSBub2RlIGZvciBpdCAqLworLSAoaWQpIG5leHROb2RlOworCistIChpZCkgbmV4dFRva2VuOworCisvKiogRG9uJ3QgY29udmVydCB0byBhIHRyZWUgdW5sZXNzIHRoZXkgZXhwbGljaXRseSBjYWxsIG5leHRUcmVlLgorICogIFRoaXMgd2F5IHdlIGNhbiBkbyBoZXRlcm8gdHJlZSBub2RlcyBpbiByZXdyaXRlLgorICovCistIChpZDxBTlRMUlRyZWU+KSB0b1RyZWU6KGlkPEFOVExSVG9rZW4+KWVsZW1lbnQ7CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdWxlTWFwRWxlbWVudC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVsZU1hcEVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQwYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVsZU1hcEVsZW1lbnQuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZU1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlTWFwRWxlbWVudC5oIgorCitAaW50ZXJmYWNlIEFOVExSUnVsZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBOU051bWJlciAqcnVsZU51bTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTnVtLCBzZXR0ZXI9c2V0UnVsZU51bTopIE5TTnVtYmVyICpydWxlTnVtOworCisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnQ7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooTlNOdW1iZXIgKilhbklkeDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TTnVtYmVyICopZ2V0UnVsZU51bTsKKy0gKHZvaWQpc2V0UnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJ1bGVNZW1vLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdWxlTWVtby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTVhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdWxlTWVtby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJSdWxlTWVtby5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE2LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkxpbmtCYXNlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSdWxlTWVtbyA6IEFOVExSTGlua0Jhc2UgeworICAgIE5TTnVtYmVyICpzdGFydEluZGV4OworICAgIE5TTnVtYmVyICpzdG9wSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnRJbmRleCwgc2V0dGVyPXNldFN0YXJ0SW5kZXgpIE5TTnVtYmVyICpzdGFydEluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTdG9wSW5kZXgsIHNldHRlcj1zZXRTdG9wSW5kZXgpIE5TTnVtYmVyICpzdG9wSW5kZXg7CisKKysgKEFOVExSUnVsZU1lbW8gKiluZXdBTlRMUlJ1bGVNZW1vOworKyAoQU5UTFJSdWxlTWVtbyAqKW5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDooTlNOdW1iZXIgKilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TTnVtYmVyICopYVN0b3BJbmRleDsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJSdWxlTWVtbyAqKWdldFJ1bGVXaXRoU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXg7CistIChOU051bWJlciAqKWdldFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OworLSAodm9pZClzZXRTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4OworLSAoTlNOdW1iZXIgKilnZXRTdG9wSW5kZXg7CistICh2b2lkKXNldFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTBjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZVJldHVyblNjb3BlLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlJ1bGVSZXR1cm5TY29wZSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+IHsKKworfQorCisvKiogUmV0dXJuIHRoZSBzdGFydCB0b2tlbiBvciB0cmVlICovCistIChpZDxBTlRMUlRva2VuPikgZ2V0U3RhcnQ7CisKKy8qKiBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gb3IgdHJlZSAqLworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9QVNUOyAqLworLSAoaWQpIGdldE5vZGU7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9dGVtcGxhdGU7IERvbid0IHVzZSBTdHJpbmdUZW1wbGF0ZQorICogIHR5cGUgYXMgaXQgdGhlbiBjYXVzZXMgYSBkZXBlbmRlbmN5IHdpdGggU1QgbGliLgorICovCistIChpZCkgZ2V0VGVtcGxhdGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNDUwYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlJ1bGVTdGFjay5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJIYXNoUnVsZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSUnVsZVN0YWNrIDogQU5UTFJCYXNlU3RhY2sgeworfQorCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOworKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250OworLShpZClpbml0OworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0odm9pZClkZWFsbG9jOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy8qIGNsZWFyIC0tIHJlaW5pdGlhbGl6ZSB0aGUgbWFwbGlzdCBhcnJheSAqLworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJIYXNoUnVsZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJIYXNoUnVsZSAqKWFIYXNoUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoQU5UTFJIYXNoUnVsZSAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHg7CistICh2b2lkKXB1dEhhc2hSdWxlQXRSdWxlSW5kZXg6KE5TSW50ZWdlcilhUnVsZUluZGV4IFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TSW50ZWdlcilhU3RvcEluZGV4OworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdWxlU3RhY2subQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDkxOTJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVsZVN0YWNrLm0KQEAgLTAsMCArMSwxNDcgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2subQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSUnVsZVN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJ1bGVTdGFjaworCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrCit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRXaXRoTGVuOmNudF07Cit9CisKKy0gKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46Y250XSkgIT0gbmlsKSB7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgcmV0dXJuIFtzdXBlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkKKyAgICAgICAgICAgIGFDbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGFDbnQ7Cit9CisKKy0gKE5TSW50ZWdlcilzaXplCit7CisgICAgQU5UTFJSdWxlTWVtbyAqYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhU2l6ZSA9IDA7CisgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKworLSAoQU5UTFJIYXNoUnVsZSAqKXBvcAoreworICAgIHJldHVybiAoQU5UTFJIYXNoUnVsZSAqKVtzdXBlciBwb3BdOworfQorCistICh2b2lkKSBpbnNlcnRPYmplY3Q6KEFOVExSSGFzaFJ1bGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIE5TTG9nKCBAIkluIEFOVExSUnVsZVN0YWNrIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGFSdWxlIGF0IEluZGV4ICVkLCBidXQgQnVmZmVyIGlzIG9ubHkgJWQgbG9uZ1xuIiwgaWR4LCBCdWZmU2l6ZSApOworICAgICAgICBbc2VsZiBlbnN1cmVDYXBhY2l0eTppZHhdOworICAgIH0KKyAgICBpZiAoIGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICBpZiAocHRyQnVmZmVyW2lkeF0gIT0gbmlsKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChBTlRMUkhhc2hSdWxlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmIChpZHggPCBCdWZmU2l6ZSkgeworICAgICAgICByZXR1cm4gcHRyQnVmZmVyW2lkeF07CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpcHV0SGFzaFJ1bGVBdFJ1bGVJbmRleDooTlNJbnRlZ2VyKWFSdWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXgKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphSGFzaFJ1bGU7CisgICAgQU5UTFJSdWxlTWVtbyAqYVJ1bGVNZW1vOworCisgICAgaWYgKGFSdWxlSW5kZXggPj0gQnVmZlNpemUpIHsKKyAgICAgICAgTlNMb2coIEAicHV0SGFzaFJ1bGVBdFJ1bGVJbmRleCBhdHRlbXB0aW5nIHRvIGluc2VydCBhUnVsZSBhdCBJbmRleCAlZCwgYnV0IEJ1ZmZlciBpcyBvbmx5ICVkIGxvbmdcbiIsIGFSdWxlSW5kZXgsIEJ1ZmZTaXplICk7CisgICAgICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OmFSdWxlSW5kZXhdOworICAgIH0KKyAgICBpZiAoKGFIYXNoUnVsZSA9IHB0ckJ1ZmZlclthUnVsZUluZGV4XSkgPT0gbmlsKSB7CisgICAgICAgIGFIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBuZXdBTlRMUkhhc2hSdWxlV2l0aExlbjoxN10gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyW2FSdWxlSW5kZXhdID0gYUhhc2hSdWxlOworICAgIH0KKyAgICBpZiAoKCBhUnVsZU1lbW8gPSBbYUhhc2hSdWxlIG9iamVjdEF0SW5kZXg6YVN0YXJ0SW5kZXhdICkgPT0gbmlsICkgeworICAgICAgICBhUnVsZU1lbW8gPSBbW0FOVExSUnVsZU1lbW8gbmV3QU5UTFJSdWxlTWVtb10gcmV0YWluXTsKKyAgICAgICAgW2FIYXNoUnVsZSBpbnNlcnRPYmplY3Q6YVJ1bGVNZW1vIGF0SW5kZXg6YVN0YXJ0SW5kZXhdOworICAgIH0KKyAgICBbYVJ1bGVNZW1vIHNldFN0YXJ0SW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdGFydEluZGV4XV07CisgICAgW2FSdWxlTWVtbyBzZXRTdG9wSW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdG9wSW5kZXhdXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVudGltZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSUnVudGltZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjA5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw1NCBAQAorLy8KKy8vICBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi81LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BpbnRlcmZhY2UgQU5UTFJSdW50aW1lRXhjZXB0aW9uIDogTlNFeGNlcHRpb24KK3sKK30KKworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3QU5UTFJSdW50aW1lRXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3QU5UTFJSdW50aW1lRXhjZXB0aW9uOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0FOVExSUnVudGltZUV4Y2VwdGlvbjooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzphVXNlckluZm87CisKKy0gKGlkKSBpbml0OworLSAoaWQpaW5pdFdpdGhSdW50aW1lOihOU1N0cmluZyAqKWFSZWFzb247CistIChpZClpbml0V2l0aFJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm87CisKKy0gKE5TU3RyaW5nICopIERlc2NyaXB0aW9uOworCisvLyAgICAtICh2b2lkKXNldERlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisvLyAgICAtICh2b2lkKXNldFN0YXRlTnVtYmVyOihOU0ludGVnZXIpc3RhdGVOdW1iZXI7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMGY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaApAQCAtMCwwICsxLDQ1IEBACisvLworLy8gIEFOVExSU3RyZWFtRW51bWVydG9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI5LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJTdHJlYW1FbnVtZXJhdG9yIDogTlNFbnVtZXJhdG9yIAoreworCU5TSW50ZWdlciBpOworCWlkIGVvZjsKKwlOU011dGFibGVBcnJheSAqbm9kZXM7Cit9CisKKy0oaWQpIGluaXRXaXRoTm9kZXM6KE5TTXV0YWJsZUFycmF5ICopIG4gYW5kRU9GOihpZCkgbzsKKy0oQk9PTCkgaGFzTmV4dDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSU3RyaW5nU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJTdHJpbmdTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjEzYzdkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSU3RyaW5nU3RyZWFtLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbVN0YXRlLmgiCisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorCitAaW50ZXJmYWNlIEFOVExSU3RyaW5nU3RyZWFtIDogTlNPYmplY3QgPCBBTlRMUkNoYXJTdHJlYW0gPiB7CisJTlNTdHJpbmcgKmRhdGE7CisJTlNJbnRlZ2VyIG47CisJTlNJbnRlZ2VyIHA7CisJTlNJbnRlZ2VyIGxpbmU7CisJTlNJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworCUFOVExSUHRyQnVmZmVyICptYXJrZXJzOworCU5TSW50ZWdlciBsYXN0TWFya2VyOworCU5TU3RyaW5nICpuYW1lOworICAgIEFOVExSQ2hhclN0cmVhbVN0YXRlICpjaGFyU3RhdGU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RGF0YSxzZXR0ZXI9c2V0RGF0YTopIE5TU3RyaW5nICpkYXRhOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UCxzZXR0ZXI9c2V0UDopIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TixzZXR0ZXI9c2V0TjopIE5TSW50ZWdlciBuOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGluZSxzZXR0ZXI9c2V0TGluZTopIE5TSW50ZWdlciBsaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0Q2hhclBvc2l0aW9uSW5MaW5lLHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU0ludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TWFya0RlcHRoLHNldHRlcj1zZXRNYXJrRGVwdGg6KSBOU0ludGVnZXIgbWFya0RlcHRoOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRNYXJrZXJzLCBzZXR0ZXI9c2V0TWFya2VyczopIEFOVExSUHRyQnVmZmVyICptYXJrZXJzOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdE1hcmtlcixzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTb3VyY2VOYW1lLCBzZXR0ZXI9c2V0U291cmNlTmFtZTopIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRDaGFyU3RhdGUsIHNldHRlcj1zZXRDaGFyU3RhdGU6KSBBTlRMUkNoYXJTdHJlYW1TdGF0ZSAqY2hhclN0YXRlOworCisrIG5ld0FOVExSU3RyaW5nU3RyZWFtOworCisrIG5ld0FOVExSU3RyaW5nU3RyZWFtOihOU1N0cmluZyAqKWFTdHJpbmc7CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW06KGNoYXIgKilteURhdGEgQ291bnQ6KE5TSW50ZWdlciludW1CeXRlczsKKworLSAoaWQpIGluaXQ7CisKKy8vIHRoaXMgaW5pdGlhbGl6ZXIgY29waWVzIHRoZSBzdHJpbmcKKy0gKGlkKSBpbml0V2l0aFN0cmluZzooTlNTdHJpbmcgKikgdGhlU3RyaW5nOworCisvLyBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgY29uc3RydWN0b3IgYXMgbm8gZGF0YSBpcyBjb3BpZWQKKy0gKGlkKSBpbml0V2l0aFN0cmluZ05vQ29weTooTlNTdHJpbmcgKikgdGhlU3RyaW5nOworCistIChpZCkgaW5pdFdpdGhEYXRhOihjaGFyICopbXlEYXRhIENvdW50OihOU0ludGVnZXIpbnVtQnl0ZXM7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisvLyByZXNldCB0aGUgc3RyZWFtJ3Mgc3RhdGUsIGJ1dCBrZWVwIHRoZSBkYXRhIHRvIGZlZWQgb2ZmCistICh2b2lkKSByZXNldDsKKy8vIGNvbnN1bWUgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0KKy0gKHZvaWQpIGNvbnN1bWU7CisKKy8vIGxvb2sgYWhlYWQgaSBjaGFyYWN0ZXJzCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIExUOihOU0ludGVnZXIpIGk7CisKKy8vIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbAorLSAoTlNJbnRlZ2VyKSBnZXRJbmRleDsKKy8vIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQorLSAoTlNJbnRlZ2VyKSBzaXplOworCisvLyBzZWVrIGFuZCByZXdpbmQgaW4gdGhlIHN0cmVhbQorLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKSBpbmRleDsKKworLy8gcHJvdmlkZSB0aGUgc3RyZWFtcyBkYXRhIChlLmcuIGZvciB0b2tlbnMgdXNpbmcgaW5kaWNlcykKKy0gKE5TU3RyaW5nICopIHN1YnN0cmluZzooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU1N0cmluZyAqKSBzdWJzdHJpbmdXaXRoUmFuZ2U6KE5TUmFuZ2UpIHRoZVJhbmdlOworCisvLyB1c2VkIGZvciB0cmFja2luZyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtCistIChOU0ludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOihOU0ludGVnZXIpIHRoZUxpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKSB0aGVQb3M7CisKKy0gKE5TSW50ZWdlcikgZ2V0TjsKKy0gKHZvaWQpIHNldE46KE5TSW50ZWdlciludW07CisKKy0gKE5TSW50ZWdlcikgZ2V0UDsKKy0gKHZvaWQpIHNldFA6KE5TSW50ZWdlciludW07CisKKy0gKEFOVExSUHRyQnVmZmVyICopZ2V0TWFya2VyczsKKy0gKHZvaWQpIHNldE1hcmtlcnM6KEFOVExSUHRyQnVmZmVyICopYU1hcmtlckxpc3Q7CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworLy8gYWNjZXNzb3JzIHRvIHRoZSByYXcgZGF0YSBvZiB0aGlzIHN0cmVhbQorLSAoTlNTdHJpbmcgKikgZ2V0RGF0YTsKKy0gKHZvaWQpIHNldERhdGE6IChOU1N0cmluZyAqKSBhRGF0YTsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJTeW1ib2xTdGFjay5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlkZjlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2suaApAQCAtMCwwICsxLDc1IEBACisvLworLy8gIEFOVExSU3ltYm9sU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorLy8gI2ltcG9ydCAiQU5UTFJTeW1ib2xTY29wZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSU3ltYm9sc1Njb3BlIDogTlNPYmplY3QKK3sKKyAgICAKK30KKworKyAoQU5UTFJTeW1ib2xzU2NvcGUgKiluZXdBTlRMUlN5bWJvbHNTY29wZTsKKworLSAoaWQpaW5pdDsKK0BlbmQKKworCitAaW50ZXJmYWNlIEFOVExSU3ltYm9sU3RhY2sgOiBBTlRMUkJhc2VTdGFjayB7Cit9CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrKEFOVExSU3ltYm9sU3RhY2sgKiluZXdBTlRMUlN5bWJvbFN0YWNrOworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKilnZXRIYXNoTWFwRW50cnk6KE5TSW50ZWdlcilpZHg7CisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKiopZ2V0SGFzaE1hcDsKKworLShBTlRMUlN5bWJvbHNTY29wZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJTeW1ib2xzU2NvcGUgKilhU2NvcGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKEFOVExSU3ltYm9sc1Njb3BlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSU3ltYm9sU3RhY2subSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlN5bWJvbFN0YWNrLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkNjc3NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlN5bWJvbFN0YWNrLm0KQEAgLTAsMCArMSwxMjMgQEAKKy8vCisvLyAgQU5UTFJTeW1ib2xTdGFjay5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJTeW1ib2xTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSU3ltYm9sc1Njb3BlCisKKysgKEFOVExSU3ltYm9sc1Njb3BlICopbmV3QU5UTFJTeW1ib2xzU2NvcGUKK3sKKyAgICByZXR1cm4oIFtbQU5UTFJTeW1ib2xzU2NvcGUgYWxsb2NdIGluaXRdICk7Cit9CisKKy0gKGlkKWluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgIH0KKyAgICByZXR1cm4gKHNlbGYpOworfQorCitAZW5kCisKKy8qCisgKiBTdGFydCBvZiBBTlRMUlN5bWJvbFN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlN5bWJvbFN0YWNrCisKKysoQU5UTFJTeW1ib2xTdGFjayAqKW5ld0FOVExSU3ltYm9sU3RhY2sKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0XTsKK30KKworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0V2l0aExlbjpjbnRdOworfQorCistKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpjbnRdKSAhPSBuaWwpIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZQoreworICAgIHJldHVybiBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsKK30KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKWdldEhhc2hNYXBFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggKEFOVExSU3ltYm9sc1Njb3BlICopW3N1cGVyIG9iamVjdEF0SW5kZXg6aWR4XSApOworfQorCistKEFOVExSU3ltYm9sc1Njb3BlICoqKWdldEhhc2hNYXAKK3sKKwlyZXR1cm4oIChBTlRMUlN5bWJvbHNTY29wZSAqKilwdHJCdWZmZXIgKTsKK30KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKSBwb3AKK3sKKyAgICByZXR1cm4gKEFOVExSU3ltYm9sc1Njb3BlICopW3N1cGVyIHBvcF07Cit9CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJTeW1ib2xzU2NvcGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbaWR4XSAhPSBuaWwpIFtwdHJCdWZmZXJbaWR4XSByZWxlYXNlXTsKKyAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltpZHhdID0gYVJ1bGU7Cit9CisKKy0gKEFOVExSU3ltYm9sc1Njb3BlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIHJldHVybiAoQU5UTFJTeW1ib2xzU2NvcGUgKilbc3VwZXIgb2JqZWN0QXRJbmRleDppZHhdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1OWU3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaApAQCAtMCwwICsxLDQxIEBACisvLworLy8gIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEtheSBSw7Zwa2Ugb24gMDMuMTIuMjAwNi4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25Ub2tlbihEZWJ1Z2dlclN1cHBvcnQpCisKKy0gKE5TU3RyaW5nICopZGVidWdnZXJEZXNjcmlwdGlvbjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVG9rZW4uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRva2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ1MjRmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRva2VuLmgKQEAgLTAsMCArMSw3OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUlRva2VuVHlwZUVPRiA9IC0xLAorCUFOVExSVG9rZW5UeXBlSW52YWxpZCwKKwlBTlRMUlRva2VuVHlwZUVPUiwKKwlBTlRMUlRva2VuVHlwZURPV04sCisJQU5UTFJUb2tlblR5cGVVUCwKKwlBTlRMUlRva2VuVHlwZU1JTgorfSBBTlRMUlRva2VuVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgPSAwLAorICAgIEFOVExSVG9rZW5DaGFubmVsSGlkZGVuID0gOTkKK30gQU5UTFJUb2tlbkNoYW5uZWw7CisKKyNkZWZpbmUgSElEREVOIDk5CisKK0Bwcm90b2NvbCBBTlRMUlRva2VuIDwgTlNPYmplY3QsIE5TQ29weWluZyA+CisKKy8vIFRoZSBzaW5nbGV0b24gZW9mVG9rZW4gaW5zdGFuY2UuCisrIChpZDxBTlRMUlRva2VuPikgZW9mVG9rZW47CisvLyBUaGUgZGVmYXVsdCBjaGFubmVsIGZvciB0aGlzIGNsYXNzIG9mIFRva2VucworKyAoQU5UTFJUb2tlbkNoYW5uZWwpIGRlZmF1bHRDaGFubmVsOworCisvLyBwcm92aWRlIGhvb2tzIHRvIGV4cGxpY2l0ZWx5IHNldCB0aGUgdGV4dCBhcyBvcHBvc2VkIHRvIHVzZSB0aGUgaW5kaWNlcyBpbnRvIHRoZSBDaGFyU3RyZWFtCistIChOU1N0cmluZyAqKSBnZXRUZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOworLSAodm9pZCkgc2V0VHlwZTogKE5TSW50ZWdlcikgYVR5cGU7CisKKy8vIEFOVExSIHYzIHByb3ZpZGVzIGF1dG9tYXRpYyBsaW5lIGFuZCBwb3NpdGlvbiB0cmFja2luZy4gU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0bworLy8gb3ZlcnJpZGUgdGhlc2UsIGlmIHRoZXkgZG8gbm90IHdhbnQgdG8gc3RvcmUgbGluZS9wb3MgdHJhY2tpbmcgaW5mb3JtYXRpb24KKy0gKE5TVUludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOiAoTlNVSW50ZWdlcikgYUxpbmU7CisKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTogKE5TVUludGVnZXIpIGFDaGFyUG9zaXRpb25JbkxpbmU7CisKKy8vIGV4cGxpY2l0ZWx5IGNoYW5nZSB0aGUgY2hhbm5lbCB0aGlzIFRva2VuIGlzIG9uLiBUaGUgZGVmYXVsdCBwYXJzZXIgaW1wbGVtZW50YXRpb24KKy8vIGp1c3Qgc2VlcyB0aGUgZGVmYXVsdENoYW5uZWwKKy8vIENvbW1vbiBpZGlvbSBpcyB0byBwdXQgd2hpdGVzcGFjZSB0b2tlbnMgb24gY2hhbm5lbCA5OS4KKy0gKE5TVUludGVnZXIpIGdldENoYW5uZWw7CistICh2b2lkKSBzZXRDaGFubmVsOiAoTlNVSW50ZWdlcikgYUNoYW5uZWw7CisKKy8vIHRoZSBpbmRleCBvZiB0aGlzIFRva2VuIGludG8gdGhlIFRva2VuU3RyZWFtCistIChOU1VJbnRlZ2VyKSBnZXRUb2tlbkluZGV4OworLSAodm9pZCkgc2V0VG9rZW5JbmRleDogKE5TVUludGVnZXIpIGFUb2tlbkluZGV4OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg2ODFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8vCisvLyAgQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisjaW1wb3J0ICJBTlRMUk1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKworLy8gRGVmaW5lIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBoaWVyYXJjaHkKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVPcGVyYXRpb24gOiBBTlRMUkNvbW1vblRva2VuU3RyZWFtCit7CisvKiogV2hhdCBpbmRleCBpbnRvIHJld3JpdGVzIExpc3QgYXJlIHdlPyAqLworTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CisvKiogVG9rZW4gYnVmZmVyIGluZGV4LiAqLworTlNJbnRlZ2VyIGluZGV4OworTlNTdHJpbmcgKnRleHQ7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldEluc3RydWN0aW9uSW5kZXgsIHNldHRlcj1zZXRJbnN0cnVjdGlvbkluZGV4OikgTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CitAcHJvcGVydHkgKGdldHRlcj1nZXRJbmRleCwgc2V0dGVyPXNldEluZGV4OikgTlNJbnRlZ2VyIGluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworCisrIChBTlRMUlJld3JpdGVPcGVyYXRpb24gKikgbmV3QU5UTFJSZXdyaXRlT3BlcmF0aW9uOihOU0ludGVnZXIpaW5kZXggVGV4dDooTlNTdHJpbmcgKil0ZXh0OworCistIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCisvKiogRXhlY3V0ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gYnkgcG9zc2libHkgYWRkaW5nIHRvIHRoZSBidWZmZXIuCisgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB0b2tlbiB0byBvcGVyYXRlIG9uLgorICovCistIChOU0ludGVnZXIpIGV4ZWN1dGU6KE5TU3RyaW5nICopYnVmOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNJbnRlZ2VyKSBpbmRleE9mOihjaGFyKWFDaGFyIGluU3RyaW5nOihOU1N0cmluZyAqKWFTdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJJbnNlcnRCZWZvcmVPcCA6IEFOVExSUmV3cml0ZU9wZXJhdGlvbiB7Cit9CisKKysgKEFOVExSSW5zZXJ0QmVmb3JlT3AgKikgbmV3QU5UTFJJbnNlcnRCZWZvcmVPcDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAoaWQpIGluaXRXaXRoSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworQGVuZAorCisvKiogSSdtIGdvaW5nIHRvIHRyeSByZXBsYWNpbmcgcmFuZ2UgZnJvbSB4Li55IHdpdGggKHkteCkrMSBSZXBsYWNlT3AKKyAqICBpbnN0cnVjdGlvbnMuCisgKi8KK0BpbnRlcmZhY2UgQU5UTFJSZXBsYWNlT3AgOiBBTlRMUlJld3JpdGVPcGVyYXRpb24geworICAgIE5TSW50ZWdlciBsYXN0SW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RJbmRleCwgc2V0dGVyPXNldExhc3RJbmRleDopIE5TSW50ZWdlciBsYXN0SW5kZXg7CisKKysgKEFOVExSUmVwbGFjZU9wICopIG5ld0FOVExSUmVwbGFjZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcqKXRoZVRleHQ7CistIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBleGVjdXRlOihOU1N0cmluZyAqKWJ1ZjsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUkRlbGV0ZU9wIDogQU5UTFJSZXBsYWNlT3AgeworfQorKyAoQU5UTFJEZWxldGVPcCAqKSBuZXdBTlRMUkRlbGV0ZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CisKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0BlbmQKKworCitAaW50ZXJmYWNlIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtIDogQU5UTFJDb21tb25Ub2tlblN0cmVhbSB7CisvKiogWW91IG1heSBoYXZlIG11bHRpcGxlLCBuYW1lZCBzdHJlYW1zIG9mIHJld3JpdGUgb3BlcmF0aW9ucy4KKyAqICBJJ20gY2FsbGluZyB0aGVzZSB0aGluZ3MgInByb2dyYW1zLiIKKyAqICBNYXBzIFN0cmluZyAobmFtZSkgLT4gcmV3cml0ZSAoTGlzdCkKKyAqLworQU5UTFJIYXNoTWFwICpwcm9ncmFtczsKKworLyoqIE1hcCBTdHJpbmcgKHByb2dyYW0gbmFtZSkgLT4gSW50ZWdlciBpbmRleCAqLworQU5UTFJIYXNoTWFwICpsYXN0UmV3cml0ZVRva2VuSW5kZXhlczsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQcm9ncmFtcywgc2V0dGVyPXNldFByb2dyYW1zOikgQU5UTFJIYXNoTWFwICpwcm9ncmFtczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TGFzdFJld3JpdGVUb2tlbkluZGV4ZXMsIHNldHRlcj1zZXRMYXN0UmV3cml0ZVRva2VuSW5kZXhlczopIEFOVExSSGFzaE1hcCAqbGFzdFJld3JpdGVUb2tlbkluZGV4ZXM7CisKKysgKEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtICopbmV3QU5UTFJUb2tlblJld3JpdGVTdHJlYW07CisrIChBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSAqKW5ld0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtOihpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlOworKyAoQU5UTFJUb2tlblJld3JpdGVTdHJlYW0gKiluZXdBTlRMUlRva2VuUmV3cml0ZVN0cmVhbTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZSBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKGlkKSBpbml0OworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlOworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbDsKKworLSAoQU5UTFJIYXNoTWFwICopZ2V0UHJvZ3JhbXM7CistICh2b2lkKXNldFByb2dyYW1zOihBTlRMUkhhc2hNYXAgKilhUHJvZ0xpc3Q7CisKKy0gKHZvaWQpIHJvbGxiYWNrOihOU0ludGVnZXIpaW5zdHJ1Y3Rpb25JbmRleDsKKy0gKHZvaWQpIHJvbGxiYWNrOihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnN0cnVjdGlvbkluZGV4OworLSAodm9pZCkgZGVsZXRlUHJvZ3JhbTsKKy0gKHZvaWQpIGRlbGV0ZVByb2dyYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWU7CistICh2b2lkKSBpbnNlcnRBZnRlclRva2VuOihpZDxBTlRMUlRva2VuPil0IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEFmdGVySW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEFmdGVyUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCisKKy0gKHZvaWQpIGluc2VydEJlZm9yZVRva2VuOihpZDxBTlRMUlRva2VuPil0IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIGluc2VydEJlZm9yZUluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSBpbnNlcnRCZWZvcmVQcm9nTmFtZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilpbmRleFQgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZVByb2dOYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgZGVsZXRlOihOU0ludGVnZXIpYW5JbmRleDsKKy0gKHZvaWQpIGRlbGV0ZTooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvOworLSAodm9pZCkgZGVsZXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWluZGV4VDsKKy0gKHZvaWQpIGRlbGV0ZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0bzsKKy0gKHZvaWQpIGRlbGV0ZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWZyb20gVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdG87CistICh2b2lkKSBkZWxldGU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CistIChOU0ludGVnZXIpZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OworLSAoTlNJbnRlZ2VyKWdldExhc3RSZXdyaXRlVG9rZW5JbmRleDooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKHZvaWQpc2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnQ7CistIChBTlRMUkhhc2hNYXAgKikgZ2V0UHJvZ3JhbTooTlNTdHJpbmcgKiluYW1lOworLSAoQU5UTFJIYXNoTWFwICopIGluaXRpYWxpemVQcm9ncmFtOihOU1N0cmluZyAqKW5hbWU7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc6KE5TSW50ZWdlcilzdGFydCBFbmQ6KE5TSW50ZWdlcillbmQ7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNTdHJpbmcgKil0b1N0cmluZzooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydCBUb0VuZDooTlNJbnRlZ2VyKWVuZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnQgVG9FbmQ6KE5TSW50ZWdlcillbmQ7CistIChBTlRMUkhhc2hNYXAgKilyZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4OihBTlRMUkhhc2hNYXAgKilyZXdyaXRlczsKKy0gKEFOVExSSGFzaE1hcCAqKWdldEtpbmRPZk9wczooQU5UTFJIYXNoTWFwICopcmV3cml0ZXMgS2luZE9mQ2xhc3M6KENsYXNzKWtpbmQ7CistIChBTlRMUkhhc2hNYXAgKilnZXRLaW5kT2ZPcHM6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzIEtpbmRPZkNsYXNzOihDbGFzcylraW5kIEluZGV4OihOU0ludGVnZXIpYmVmb3JlOworLSAoTlNTdHJpbmcgKiljYXRPcFRleHQ6KGlkKWEgUHJldlRleHQ6KGlkKWI7CistIChOU011dGFibGVTdHJpbmcgKil0b0RlYnVnU3RyaW5nOworLSAoTlNNdXRhYmxlU3RyaW5nICopdG9EZWJ1Z1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0IFRvRW5kOihOU0ludGVnZXIpZW5kOworICAgICAgICAgICAgICAgICAgICAKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRva2VuU291cmNlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUb2tlblNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkNmI2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUb2tlblNvdXJjZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworLy8gQW55dGhpbmcgdGhhdCByZXNwb25kcyB0byAtbmV4dFRva2VuIGNhbiBiZSB0cmVhdGVkIGFzIGEgbGV4ZXIuCisvLyBGb3IgaW5zdGFuY2UgdGhpcyBjYW4gYmUgYSBmbGV4IGxleGVyIG9yIGEgaGFuZHdyaXR0ZW4gb25lIG9yIGV2ZW4KKy8vIGEgcHJveHkgZm9yIGEgcmVtb3RlbHkgcnVubmluZyB0b2tlbiBzb3VyY2UgKGRhdGFiYXNlLCBsZXhlciwgd2hhdGV2ZXIpLgorQHByb3RvY29sIEFOVExSVG9rZW5Tb3VyY2UgPE5TT2JqZWN0LCBOU0NvcHlpbmc+CisKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVG9rZW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTA0NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAcHJvdG9jb2wgQU5UTFJUb2tlblN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLy8gR2V0IFRva2VuIGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgVG9rZW4uCisvLyBpPDAgaW5kaWNhdGVzIHRva2VucyBpbiB0aGUgcGFzdC4gIFNvIC0xIGlzIHByZXZpb3VzIHRva2VuIGFuZCAtMiBpcworLy8gdHdvIHRva2VucyBhZ28uIExUOjAgaXMgdW5kZWZpbmVkLiAgRm9yIGk+PW4sIHJldHVybiBUb2tlbi5FT0ZUb2tlbi4KKy8vIFJldHVybiBudWxsIGZvciBMVDowIGFuZCBhbnkgaW5kZXggdGhhdCByZXN1bHRzIGluIGFuIGFic29sdXRlIGFkZHJlc3MKKy8vIHRoYXQgaXMgbmVnYXRpdmUuCisKKy0gKGlkPEFOVExSVG9rZW4+KSBMVDooTlNJbnRlZ2VyKSBpOworCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TVUludGVnZXIpIGk7CisKKy0gKGlkKSBnZXRUb2tlblNvdXJjZTsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisvKiogUmV0dXJuIHRoZSB0ZXh0IG9mIGFsbCB0b2tlbnMgZnJvbSBzdGFydCB0byBzdG9wLCBpbmNsdXNpdmUuCisgKiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSB0b2tlbnMgdGhlbiBpdCBjYW4ganVzdAorICogIHJldHVybiAiIiBvciBudWxsOyAgVXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgKiAgYW4gYWN0aW9uIG9mIGNvdXJzZSBpbiB0aGF0IGNhc2UuCisgKi8KKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydElkeCBUb0VuZDooTlNJbnRlZ2VyKXN0b3BJZHg7CisKKy8qKiBCZWNhdXNlIHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UgYSB0b2tlbiB3aXRoIGFuIGluZGV4IHN0b3JlZAorICogIGluIGl0LCB3ZSBtdXN0IHByb3ZpZGUgYSBtZWFucyBmb3IgdHdvIHRva2VuIG9iamVjdHMgdGhlbXNlbHZlcyB0bworICogIGluZGljYXRlIHRoZSBzdGFydC9lbmQgbG9jYXRpb24uICBNb3N0IG9mdGVuIHRoaXMgd2lsbCBqdXN0IGRlbGVnYXRlCisgKiAgdG8gdGhlIG90aGVyIHRvU3RyaW5nKGludCxpbnQpLiAgVGhpcyBpcyBhbHNvIHBhcmFsbGVsIHdpdGgKKyAqICB0aGUgVHJlZU5vZGVTdHJlYW0udG9TdHJpbmcoT2JqZWN0LE9iamVjdCkuCisgKi8KKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbjsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjI2OWIyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWUuaApAQCAtMCwwICsxLDEyMyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0Bwcm90b2NvbCBBTlRMUlRyZWUgPCBOU09iamVjdCwgTlNDb3B5aW5nID4KKworLy8rIChpZDxBTlRMUlRyZWU+KSBpbnZhbGlkTm9kZTsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaW5kZXg7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBUcmVlIHRyYWNrcyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IG5vdyA+IDMuMAorCistIChpZDxBTlRMUlRyZWU+KWdldFBhcmVudDsKKworLSAodm9pZCkgc2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CisKKy8qKiBJcyB0aGVyZSBpcyBhIG5vZGUgYWJvdmUgd2l0aCB0b2tlbiB0eXBlIHR0eXBlPyAqLworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKworLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CisKKy8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAqLworLSAoTlNNdXRhYmxlQXJyYXkgKikgZ2V0QW5jZXN0b3JzOworCisvKiogVGhpcyBub2RlIGlzIHdoYXQgY2hpbGQgaW5kZXg/IDAuLm4tMSAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworCistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCisvKiogU2V0IHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IHZhbHVlcyBmb3IgYWxsIGNoaWxkcmVuICovCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOworCisvKiogQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisgKiAgaXMgbmlsLCBhZGQgYWxsIGNoaWxkcmVuIG9mIHQgdG8gdGhpcycgY2hpbGRyZW4uCisgKi8KKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUlRyZWU+KSB0OworCisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KE5TSW50ZWdlcilpIFdpdGg6KGlkPEFOVExSVHJlZT4pIHQ7CisKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNJbnRlZ2VyKSBpOworCisvKiogRGVsZXRlIGNoaWxkcmVuIGZyb20gc3RhcnQgdG8gc3RvcCBhbmQgcmVwbGFjZSB3aXRoIHQgZXZlbiBpZiB0IGlzCisgKiAgYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgKiAgY2hpbGRyZW4gdG8gc2V0IHRoZWlyIGNoaWxkaW5kZXg7IGNvdWxkIGJlIHNsb3cuCisgKi8KKy0gKHZvaWQpIHJlcGxhY2VDaGlsZHJlbkZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZCl0OwkKKworLSAoTlNBcnJheSAqKSBnZXRDaGlsZHJlbjsKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhIG5pbCBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworCisvKiogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CisKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKSBpbmRleDsKKworLyoqICBXaGF0IGlzIHRoZSBsYXJnZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCistIChpZDxBTlRMUlRyZWU+KSBkdXBOb2RlOworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKworI3ByYWdtYSBtYXJrIENvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOwkvLyB0aGUgY2hpbGRyZW4gdGhlbXNlbHZlcyBhcmUgbm90IGNvcGllZCBoZXJlIQorLSAoaWQpIGRlZXBDb3B5OwkJCQkJLy8gcGVyZm9ybXMgYSBkZWVwQ29weVdpdGhab25lOiB3aXRoIHRoZSBkZWZhdWx0IHpvbmUKKy0gKGlkKSBkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworI3ByYWdtYSBtYXJrIFRyZWUgUGFyc2VyIHN1cHBvcnQKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTsKKy0gKE5TU3RyaW5nICopIGdldFRleHQ7CisvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmU7CistIChOU0ludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNJbnRlZ2VyKXBvczsKKworI3ByYWdtYSBtYXJrIEluZm9ybWF0aW9uYWwKKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlQWRhcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2NTc5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlQWRhcHRvci5oCkBAIC0wLDAgKzEsMTU5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorCisjcHJhZ21hIHdhcm5pbmcgdHJlZS9ub2RlIGRpY3Rpb24gaXMgYnJva2VuLgorCitAcHJvdG9jb2wgQU5UTFJUcmVlQWRhcHRvciA8TlNPYmplY3QsIE5TQ29weWluZz4KKworI3ByYWdtYSBtYXJrIENvbnN0cnVjdGlvbgorCisrIChpZDxBTlRMUlRyZWU+KSBuZXdFbXB0eVRyZWU7CisKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVBZGFwdG9yIGltcGxlbWVudGF0aW9uCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU6KGlkPEFOVExSVHJlZT4pYU5vZGU7CS8vIGNvcGllcyBqdXN0IHRoZSBub2RlCistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CS8vIGNvcGllcyB0aGUgZW50aXJlIHN1YnRyZWUsIHJlY3Vyc2l2ZWx5CisKKy8qKiBSZXR1cm4gYSBuaWwgbm9kZSAoYW4gZW1wdHkgYnV0IG5vbi1udWxsIG5vZGUpIHRoYXQgY2FuIGhvbGQKKyAqICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICogIHVzZSAidD1hZGFwdG9yLm5pbCgpOyB0LmFkZENoaWxkKHgpOyB0LmFkZENoaWxkKHkpOyIKKyAqLworLSAoaWQpIGVtcHR5Tm9kZTsKKworLyoqIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAqICB0b2tlbnMgY29uc3VtZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5LiAgVGhlIHN0YXJ0IHRva2VuIGluZGljYXRlcyB0aGUKKyAqICBpbnB1dCBzeW1ib2wgYXQgd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gIFRoZSBzdG9wIHRva2VuIGluZGljYXRlcworICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGlucHV0IHN0cmVhbSBzbyB0aGF0IHRoZSBlcnJvbmVvdXMgdGV4dCBjYW4KKyAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgKiAgdG8gc29tZSBhcHBsaWNhdGlvbnM7IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3RvcmVzIHB0ciB0byBpdCBpbgorICogIHRoZSBDb21tb25FcnJvck5vZGUuCisgKgorICogIFRoaXMgb25seSBtYWtlcyBzZW5zZSBkdXJpbmcgdG9rZW4gcGFyc2luZywgbm90IHRyZWUgcGFyc2luZy4KKyAqICBUcmVlIHBhcnNpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gcGFyc2luZyBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24KKyAqICBzdWNjZWVkLgorICovCistIChpZCkgZXJyb3JOb2RlOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICBGcm9tOihpZDxBTlRMUlRva2VuPilhU3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pYVN0b3BUb2tlbgorICAgICAgIEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKikgZTsKKworLyoqIElzIHRyZWUgY29uc2lkZXJlZCBhIG5pbCBub2RlIHVzZWQgdG8gbWFrZSBsaXN0cyBvZiBjaGlsZCBub2Rlcz8gKi8KKy0gKEJPT0wpIGlzTmlsOihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisKKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUlRyZWU+KWNoaWxkIHRvVHJlZTooaWQ8QU5UTFJUcmVlPilhVHJlZTsKKworLyoqIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAqCisgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAqCisgKiAgICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgKgorICogIFJldHVybiBuZXdSb290LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5ld1Jvb3QgaXMgbm90IGEKKyAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAqCisgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAqICBjb25zdHJ1Y3RpbmcgdGhlc2Ugbm9kZXMgc28gd2Ugc2hvdWxkIGhhdmUgdGhpcyBjb250cm9sIGZvcgorICogIGVmZmljaWVuY3kuCisgKi8KKy0gKGlkKSBiZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KW5ld1Jvb3Qgb2xkOihpZDxBTlRMUlRyZWU+KW9sZFJvb3Q7CisKKy0gKGlkKSBydWxlUG9zdFByb2Nlc3Npbmc6KGlkPEFOVExSVHJlZT4pcm9vdDsKKworI3ByYWdtYSBtYXJrIFJld3JpdGUgUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLSAoTlNVSW50ZWdlcikgZ2V0VW5pcXVlSUQ6KGlkPEFOVExSVHJlZT4pYU5vZGU7CisKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW47CistIChpZDxBTlRMUlRyZWU+KSBjcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIEZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0ZXh0OworCisjcHJhZ21hIG1hcmsgQ29udGVudAorCistIChpZDxBTlRMUlRyZWU+KWR1cE5vZGU6KGlkPEFOVExSVHJlZT4pYU5vZGU7CistIChpZDxBTlRMUlRyZWU+KWR1cFRyZWU6KGlkPEFOVExSVHJlZT4pYVRyZWU7CisKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKHZvaWQpIHNldFR5cGU6KGlkPEFOVExSVHJlZT4pYU5vZGUgVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dDooaWQ8QU5UTFJUcmVlPilhTm9kZTsKKy0gKHZvaWQpIHNldFRleHQ6KGlkPEFOVExSVHJlZT4pYU5vZGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooaWQ8QU5UTFJUcmVlPil0OworCistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXM6KGlkPEFOVExSVHJlZT4pYVRyZWUgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg6KGlkPEFOVExSVHJlZT4pYVRyZWU7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OihpZDxBTlRMUlRyZWU+KWFUcmVlOworCisjcHJhZ21hIG1hcmsgTmF2aWdhdGlvbiAvIFRyZWUgUGFyc2luZworCisvKiogR2V0IGEgY2hpbGQgMC4ubi0xIG5vZGUgKi8KKy0gKGlkPEFOVExSVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUlRyZWU+KWFOb2RlIEF0OihOU0ludGVnZXIpIGk7CisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkPEFOVExSVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJUcmVlPiljaGlsZDsKKy8qKiBSZW1vdmUgaXRoIGNoaWxkIGFuZCBzaGlmdCBjaGlsZHJlbiBkb3duIGZyb20gcmlnaHQuICovCistIChpZDxBTlRMUlRyZWU+KSBkZWxldGVDaGlsZDooaWQ8QU5UTFJUcmVlPil0IEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy8qKiBIb3cgbWFueSBjaGlsZHJlbj8gIElmIDAsIHRoZW4gdGhpcyBpcyBhIGxlYWYgbm9kZSAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZENvdW50OihpZDxBTlRMUlRyZWU+KSBhVHJlZTsKKworLyoqIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdC4KKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoaWQ8QU5UTFJUcmVlPilnZXRQYXJlbnQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpIHNldFBhcmVudDooaWQ8QU5UTFJUcmVlPil0IFdpdGg6KGlkPEFOVExSVHJlZT4pcGFyZW50OworCisvKiogV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OihpZDxBTlRMUlRyZWU+KXQ7CistICh2b2lkKSBzZXRDaGlsZEluZGV4OihpZDxBTlRMUlRyZWU+KXQgV2l0aDooTlNJbnRlZ2VyKWluZGV4OworCistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KGlkPEFOVExSVHJlZT4pcGFyZW50IEZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZDxBTlRMUlRyZWU+KXQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZWM1YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlRXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJaWQ8QU5UTFJUcmVlPiBvbGRSb290OworCWlkPEFOVExSVHJlZT4gbmV3Um9vdDsKK30KKworKyAoaWQpIGV4Y2VwdGlvbldpdGhPbGRSb290OihpZDxBTlRMUlRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CistIChpZCkgaW5pdFdpdGhPbGRSb290OihpZDxBTlRMUlRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CisKKy0gKHZvaWQpIHNldE9sZFJvb3Q6KGlkPEFOVExSVHJlZT4pYVRyZWU7CistICh2b2lkKSBzZXROZXdSb290OihpZDxBTlRMUlRyZWU+KWFUcmVlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlSXRlcmF0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDVlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlSXRlcmF0b3IuaApAQCAtMCwwICsxLDY3IEBACisvLworLy8gIEFOVExSVHJlZUl0ZXJhdG9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI2LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJGYXN0UXVldWUuaCIKKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVHJlZUl0ZXJhdG9yIDogTlNPYmplY3QgCit7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKwlpZDxBTlRMUlRyZWU+IHJvb3Q7CisJaWQ8QU5UTFJUcmVlPiB0cmVlOworCUJPT0wgZmlyc3RUaW1lOworCWlkPEFOVExSVHJlZT4gdXA7CisJaWQ8QU5UTFJUcmVlPiBkb3duOworCWlkPEFOVExSVHJlZT4gZW9mOworCQorCUFOVExSRmFzdFF1ZXVlICpub2RlczsKK30KKworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUlRyZWU+IHVwOworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUlRyZWU+IGRvd247CitAcHJvcGVydHkocmV0YWluLCByZWFkd3JpdGUpIGlkPEFOVExSVHJlZT4gZW9mOworCisrIG5ld0FOVFJMVHJlZUl0ZXJhdG9yOworKyAoQU5UTFJUcmVlSXRlcmF0b3IgKikgbmV3QU5UUkxUcmVlSXRlcmF0b3JXaXRoQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZFRyZWU6KGlkPEFOVExSVHJlZT4pdHJlZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVHJlZTooaWQ8QU5UTFJUcmVlPikgdDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPikgYSBhbmRUcmVlOihpZDxBTlRMUlRyZWU+KSB0OworCistICh2b2lkKSByZXNldDsKKy0gKEJPT0wpIGhhc05leHQ7CistIChpZCkgbmV4dE9iamVjdDsKKy0gKE5TQXJyYXkgKikgYWxsT2JqZWN0czsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZU5vZGVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmY2MzQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVOb2RlU3RyZWFtLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkludFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKworQHByb3RvY29sIEFOVExSVHJlZU5vZGVTdHJlYW0gPCBBTlRMUkludFN0cmVhbSA+IAorCistIChpZCkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KXRoZUFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIExUOihOU0ludGVnZXIpazsKKy0gKGlkKSBnZXRUcmVlU291cmNlOworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGdldFRva2VuU3RyZWFtOyAKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClmbGFnOworCistIChpZCkgZ2V0Tm9kZTooTlNJbnRlZ2VyKSBpZHg7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKXN0YXJ0Tm9kZSBUb05vZGU6KGlkKXN0b3BOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTJmMDFlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVQYXJzZXIuaApAQCAtMCwwICsxLDg5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVJlY29nbml6ZXIuaCIKKyNpbXBvcnQgIkFOVExSVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGFyc2VyIDogQU5UTFJCYXNlUmVjb2duaXplciB7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0SW5wdXQsIHNldHRlcj1zZXRJbnB1dDopIGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+IGlucHV0OworCisrIChpZCkgbmV3QU5UTFJUcmVlUGFyc2VyOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0FOVExSVHJlZVBhcnNlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVJbnB1dDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlSW5wdXQKKyAgICAgICAgICAgICAgICBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworCistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilnZXRJbnB1dDsKKy0gKHZvaWQpIHNldElucHV0OihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0OworCistICh2b2lkKSBzZXRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGFuSW5wdXQ7CistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgZ2V0VHJlZU5vZGVTdHJlYW07CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoaWQpIGdldEN1cnJlbnRJbnB1dFN5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0OworCistIChpZCkgZ2V0TWlzc2luZ1N5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KWlucHV0CisgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKSBlCisgICAgICAgICAgRXhwZWN0ZWRUb2tlbjooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICBCaXRTZXQ6KEFOVExSQml0U2V0ICopZm9sbG93OworCisvKiogTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKyAqICBlbnRpcmUgdHJlZSBpZiBub2RlIGhhcyBjaGlsZHJlbi4gIElmIGNoaWxkcmVuLCBzY2FuIHVudGlsCisgKiAgY29ycmVzcG9uZGluZyBVUCBub2RlLgorICovCistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWlnbm9yZTsKKworLyoqIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgorICogIHBsdXMgd2Ugd2FudCB0byBhbHRlciB0aGUgZXhjZXB0aW9uIHR5cGUuICBEb24ndCB0cnkgdG8gcmVjb3ZlcgorICogIGZyb20gdHJlZSBwYXJzZXIgZXJyb3JzIGlubGluZS4uLgorICovCistIChpZCkgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcil0dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLyoqIFByZWZpeCBlcnJvciBtZXNzYWdlIHdpdGggdGhlIGdyYW1tYXIgbmFtZSBiZWNhdXNlIG1lc3NhZ2UgaXMKKyAqICBhbHdheXMgaW50ZW5kZWQgZm9yIHRoZSBwcm9ncmFtbWVyIGJlY2F1c2UgdGhlIHBhcnNlciBidWlsdAorICogIHRoZSBpbnB1dCB0cmVlIG5vdCB0aGUgdXNlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CisKKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihOU0FycmF5ICopIHRva2VuTmFtZXM7CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKSB0cmFjZU91dDooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA1OWQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5MZXhlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vCisvLyAgQU5UTFJUcmVlUGF0dGVybkxleGVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKwordHlwZWRlZiBlbnVtIHsKKwlBTlRMUkxleGVyVG9rZW5UeXBlRU9GID0gLTEsCisJQU5UTFJMZXhlclRva2VuVHlwZUludmFsaWQsCisJQU5UTFJMZXhlclRva2VuVHlwZUJFR0lOLAorCUFOVExSTGV4ZXJUb2tlblR5cGVFTkQsCisJQU5UTFJMZXhlclRva2VuVHlwZUlELAorCUFOVExSTGV4ZXJUb2tlblR5cGVBUkcsCisJQU5UTFJMZXhlclRva2VuVHlwZVBFUkNFTlQsCisJQU5UTFJMZXhlclRva2VuVHlwZUNPTE9OLAorCUFOVExSTGV4ZXJUb2tlblR5cGVET1QsCit9IEFOVExSTGV4ZXJUb2tlblR5cGU7CisKKworQGludGVyZmFjZSBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgOiBOU09iamVjdCB7CisKKy8qKiBUaGUgdHJlZSBwYXR0ZXJuIHRvIGxleCBsaWtlICIoQSBCIEMpIiAqLworTlNTdHJpbmcgKnBhdHRlcm47CisgICAgCisvKiogSW5kZXggaW50byBpbnB1dCBzdHJpbmcgKi8KK05TSW50ZWdlciBwOworICAgIAorLyoqIEN1cnJlbnQgY2hhciAqLworTlNJbnRlZ2VyIGM7CisgICAgCisvKiogSG93IGxvbmcgaXMgdGhlIHBhdHRlcm4gaW4gY2hhcj8gKi8KK05TSW50ZWdlciBuOworICAgIAorLyoqIFNldCB3aGVuIHRva2VuIHR5cGUgaXMgSUQgb3IgQVJHIChuYW1lIG1pbWljcyBKYXZhJ3MgU3RyZWFtVG9rZW5pemVyKSAqLworTlNNdXRhYmxlRGF0YSAqc3ZhbDsKK2NoYXIgKmRhdGE7CisgICAgCitCT09MIGVycm9yOworCit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UGF0dGVybiwgc2V0dGVyPXNldFBhdHRlcm46KSBOU1N0cmluZyAqcGF0dGVybjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFAsIHNldHRlcj1zZXRQOikgTlNJbnRlZ2VyIHA7CitAcHJvcGVydHkgKGdldHRlcj1nZXRDLCBzZXR0ZXI9c2V0QzopIE5TSW50ZWdlciBjOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0Tiwgc2V0dGVyPXNldE46KSBOU0ludGVnZXIgbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3ZhbCwgc2V0dGVyPXNldFN2YWw6KSBOU011dGFibGVEYXRhICpzdmFsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXREYXRhLCBzZXR0ZXI9c2V0RGF0YTopIGNoYXIgKmRhdGE7CitAcHJvcGVydHkgKGdldHRlcj1nZXRFcnJvciwgc2V0dGVyPXNldEVycm9yKSBCT09MIGVycm9yOworCisrIChBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuTGV4ZXI6KE5TU3RyaW5nICopYVBhdHRlcm47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFBhdHRlcm46KE5TU3RyaW5nICopYVBhdHRlcm47CistIChOU0ludGVnZXIpIG5leHRUb2tlbjsKKy0gKHZvaWQpIGNvbnN1bWU7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCistIChOU011dGFibGVEYXRhICopZ2V0U3ZhbDsKKy0gKHZvaWQpIHNldFN2YWw6KE5TTXV0YWJsZURhdGEgKilhU3ZhbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkNmRjNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKQEAgLTAsMCArMSw1NyBAQAorLy8KKy8vICBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZVBhdHRlcm5MZXhlci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlV2l6YXJkLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVyblBhcnNlciA6IE5TT2JqZWN0IHsKKworQU5UTFJUcmVlUGF0dGVybkxleGVyICp0b2tlbml6ZXI7CitOU0ludGVnZXIgdHR5cGU7CitBTlRMUlRyZWVXaXphcmQgKndpemFyZDsKK2lkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7CisgICAgCit9CisKKysgKEFOVExSVHJlZVBhdHRlcm5QYXJzZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyOihBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKilhVG9rZW5pemVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5pemVyOihBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKil0b2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICBBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3I7CistIChpZDxBTlRMUlRyZWU+KSBwYXR0ZXJuOworLSAoaWQ8QU5UTFJUcmVlPikgcGFyc2VUcmVlOworLSAoaWQ8QU5UTFJUcmVlPikgcGFyc2VOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlUmV3cml0ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVSZXdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTg3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlUmV3cml0ZXIuaApAQCAtMCwwICsxLDcyIEBACisvLworLy8gIEFOVExSVHJlZVJld3JpdGVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZVBhcnNlci5oIgorCitAaW50ZXJmYWNlIEFOVExSZnB0ciA6IE5TT2JqZWN0IHsKKyAgICBpZCAgYWN0b3I7CisgICAgU0VMIHJ1bGVTRUw7Cit9CisKKysgKEFOVExSZnB0ciAqKW5ld0FOVExSZnB0cldpdGhSdWxlOihTRUwpYVJ1bGVBY3Rpb24gd2l0aE9iamVjdDooaWQpYW5PYmplY3Q7CistaW5pdFdpdGhSdWxlOihTRUwpcnVsZUFjdGlvbiB3aXRoT2JqZWN0OihpZClhbk9iamVjdDsKKworLSAoaWQpcnVsZTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZVJld3JpdGVyIDogQU5UTFJUcmVlUGFyc2VyIHsKKyAgICBCT09MIHNob3dUcmFuc2Zvcm1hdGlvbnM7CisgICAgaWQ8QU5UTFJUb2tlblN0cmVhbT4gb3JpZ2luYWxUb2tlblN0cmVhbTsKKyAgICBpZDxBTlRMUlRyZWVBZGFwdG9yPiBvcmlnaW5hbEFkYXB0b3I7CisgICAgQU5UTFJmcHRyICpydWxlOworICAgIEFOVExSZnB0ciAqdG9wZG93bl9mcHRyOworICAgIEFOVExSZnB0ciAqYm90dG9tdXBfZnRwcjsKK30KKworKyAoQU5UTFJUcmVlUmV3cml0ZXIgKikgbmV3QU5UTFJUcmVlUmV3cml0ZXI6KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQ7CisrIChBTlRMUlRyZWVSZXdyaXRlciAqKSBuZXdBTlRMUlRyZWVSZXdyaXRlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CistIChpZClpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKWluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGFwcGx5T25jZTooaWQ8QU5UTFJUcmVlPil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGFwcGx5UmVwZWF0ZWRseTooaWQ8QU5UTFJUcmVlPil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZTsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGRvd251cDooaWQ8QU5UTFJUcmVlPil0OworLSAoQU5UTFJUcmVlUmV3cml0ZXIgKikgcHJlOihpZDxBTlRMUlRyZWU+KXQ7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBwb3N0OihpZDxBTlRMUlRyZWU+KXQ7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBkb3dudXA6KGlkPEFOVExSVHJlZT4pdCBYRm9ybTooQk9PTClhU2hvd1RyYW5zZm9ybWF0aW9uczsKKy0gKHZvaWQpcmVwb3J0VHJhbnNmb3JtYXRpb246KGlkPEFOVExSVHJlZT4pb2xkVHJlZSBUcmVlOihpZDxBTlRMUlRyZWU+KW5ld1RyZWU7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSB0b3Bkb3duX2ZwdHI7CistIChBTlRMUlRyZWVSZXdyaXRlciAqKSBib3R0b211cF9mdHByOworLSAoQU5UTFJUcmVlUmV3cml0ZXIgKikgdG9wZG93bjsKKy0gKEFOVExSVHJlZVJld3JpdGVyICopIGJvdHRvbXVwOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4YTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQ5IEBACisvLworLy8gIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE3LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJ1bGVSZXR1cm5TY29wZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlIDogQU5UTFJSdWxlUmV0dXJuU2NvcGUgeworICAgIEFOVExSQ29tbW9uVHJlZSAqc3RhcnROb2RlOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBBTlRMUkNvbW1vblRyZWUgKnN0YXJ0Tm9kZTsKKworLyoqIEZpcnN0IG5vZGUgb3Igcm9vdCBub2RlIG9mIHRyZWUgbWF0Y2hlZCBmb3IgdGhpcyBydWxlLiAqLworCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRTdGFydDsKKy0gKHZvaWQpc2V0U3RhcnQ6KEFOVExSQ29tbW9uVHJlZSAqKWFTdGFydE5vZGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVWaXNpdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTY3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vCisvLyAgQU5UTFJUcmVlVmlzaXRvci5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlVmlzaXRvciA6IE5TT2JqZWN0IHsKKyAgIGlkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7Cit9CisrIChBTlRMUlRyZWVWaXNpdG9yICopbmV3QU5UTFJUcmVlVmlzaXRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGFuQWRhcHRvcjsKKysgKEFOVExSVHJlZVZpc2l0b3IgKiluZXdBTlRMUlRyZWVWaXNpdG9yOworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworLSAoQU5UTFJUcmVlVmlzaXRvciAqKXZpc2l0OihpZDxBTlRMUlRyZWU+KXQgQWN0aW9uOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopYWN0aW9uOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMwODU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaApAQCAtMCwwICsxLDU2IEBACisvLworLy8gIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlVmlzaXRvckFjdGlvbiA6IE5TT2JqZWN0Cit7CisKK30KKworKyAoQU5UTFJUcmVlVmlzaXRvckFjdGlvbiAqKW5ld0FOVExSVHJlZVZpc2l0b3JBY3Rpb247CistIChpZCkgaW5pdDsKKworLyoqIEV4ZWN1dGUgYW4gYWN0aW9uIGJlZm9yZSB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuICBDaGlsZHJlbiBvZiByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlCisgKiAgdmlzaXRlZCBpZiB1c2luZyBUcmVlVmlzaXRvci52aXNpdCgpLgorICovCistIChBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopcHJlOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQ7CisKKy8qKiBFeGVjdXRlIGFuIGFjdGlvbiBhZnRlciB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilwb3N0OihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVXaXphcmQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlRyZWVXaXphcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTUyNTcyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVHJlZVdpemFyZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvLworLy8gIEFOVExSVHJlZVdpemFyZC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSTWFwRWxlbWVudC5oIgorI2ltcG9ydCAiQU5UTFJNYXAuaCIKKworQGNsYXNzIEFOVExSVmlzaXRvcjsKKworQHByb3RvY29sIEFOVExSQ29udGV4dFZpc2l0b3IgPE5TT2JqZWN0PgorLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgY2FsbGVkIHZpc2l0IG9yIHNvbWV0aGluZyBlbHNlPworLSAodm9pZCkgdmlzaXQ6KGlkPEFOVExSVHJlZT4pdCBQYXJlbnQ6KGlkPEFOVExSVHJlZT4pcGFyZW50IENoaWxkSW5kZXg6KE5TSW50ZWdlciljaGlsZEluZGV4IE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlZpc2l0b3IgOiBOU09iamVjdCA8QU5UTFJDb250ZXh0VmlzaXRvcj4geworICAgIE5TSW50ZWdlciBhY3Rpb247CisgICAgaWQgYWN0b3I7CisgICAgaWQgb2JqZWN0MTsKKyAgICBpZCBvYmplY3QyOworfQorKyAoQU5UTFJWaXNpdG9yICopbmV3QU5UTFJWaXNpdG9yOihOU0ludGVnZXIpYW5BY3Rpb24gQWN0b3I6KGlkKWFuQWN0b3IgT2JqZWN0OihpZClhbk9iamVjdDEgT2JqZWN0OihpZClhbk9iamVjdDI7CistIChpZCkgaW5pdFdpdGhBY3Rpb246KE5TSW50ZWdlcilhbkFjdGlvbiBBY3RvcjooaWQpYW5BY3RvciBPYmplY3Q6KGlkKWFuT2JqZWN0MSBPYmplY3Q6KGlkKWFuT2JqZWN0MjsKKworLSAodm9pZCkgdmlzaXQ6KGlkPEFOVExSVHJlZT4pdDsKKy0gKHZvaWQpIHZpc2l0OihpZDxBTlRMUlRyZWU+KXQgUGFyZW50OihpZDxBTlRMUlRyZWU+KXBhcmVudCBDaGlsZEluZGV4OihOU0ludGVnZXIpY2hpbGRJbmRleCBNYXA6KEFOVExSTWFwICopbGFiZWxzOworCitAZW5kCisKKy8qKiBXaGVuIHVzaW5nICVsYWJlbDpUT0tFTk5BTUUgaW4gYSB0cmVlIGZvciBwYXJzZSgpLCB3ZSBtdXN0CisgKiAgdHJhY2sgdGhlIGxhYmVsLgorICovCitAaW50ZXJmYWNlIEFOVExSVHJlZVBhdHRlcm4gOiBBTlRMUkNvbW1vblRyZWUgeworICAgIE5TU3RyaW5nICpsYWJlbDsKKyAgICBCT09MICAgICAgaGFzVGV4dEFyZzsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TGFiZWwsIHNldHRlcj1zZXRMYWJlbDopIE5TU3RyaW5nICpsYWJlbDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0SGFzVGV4dEFyZywgc2V0dGVyPXNldEhhc1RleHRBcmc6KSBCT09MIGhhc1RleHRBcmc7CisKKysgKEFOVExSVHJlZVBhdHRlcm4gKiluZXdBTlRMUlRyZWVQYXR0ZXJuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworCistIChpZCkgaW5pdFdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJXaWxkY2FyZFRyZWVQYXR0ZXJuIDogQU5UTFJUcmVlUGF0dGVybiB7Cit9CisKKysgKEFOVExSV2lsZGNhcmRUcmVlUGF0dGVybiAqKW5ld0FOVExSV2lsZGNhcmRUcmVlUGF0dGVybjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKy0gKGlkKSBpbml0V2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworQGVuZAorCisvKiogVGhpcyBhZGFwdG9yIGNyZWF0ZXMgVHJlZVBhdHRlcm4gb2JqZWN0cyBmb3IgdXNlIGR1cmluZyBzY2FuKCkgKi8KK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yIDogQU5UTFJDb21tb25UcmVlQWRhcHRvciB7Cit9CisrIChBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IgKiluZXdUcmVlQWRhcHRvcjsKKyNpZmRlZiBET05UVVNFTk9NTworKyAoQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yICopbmV3VHJlZUFkYXB0b3I6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisjZW5kaWYKKy0gKGlkKSBpbml0OworI2lmZGVmIERPTlRVU0VOT01PCistIGluaXRXaXRoVG9rZW46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisjZW5kaWYKKy0gKGlkPEFOVExSVHJlZT4pY3JlYXRlVHJlZVBhdHRlcm46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVXaXphcmQgOiBOU09iamVjdCB7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKwlBTlRMUk1hcCAqdG9rZW5OYW1lVG9UeXBlTWFwOworfQorKyAoQU5UTFJUcmVlV2l6YXJkICopIG5ld0FOVExSVHJlZVdpemFyZDooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yIE1hcDooQU5UTFJNYXAgKilhVG9rZW5OYW1lVG9UeXBlTWFwOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yIFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkV2l0aFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yOworLSAoaWQpIGluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBNYXA6KEFOVExSTWFwICopdG9rZW5OYW1lVG9UeXBlTWFwOworLSAoaWQpIGluaXRXaXRoVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChpZCkgaW5pdFdpdGhUb2tlbk5hbWVzOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXM7CistIChBTlRMUk1hcCAqKWNvbXB1dGVUb2tlblR5cGVzOihOU0FycmF5ICopdGhlVG9rTmFtczsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblR5cGU6KE5TU3RyaW5nICopdG9rZW5OYW1lOworLSAoQU5UTFJNYXAgKilpbmRleDooaWQ8QU5UTFJUcmVlPil0OworLSAodm9pZCkgX2luZGV4OihpZDxBTlRMUlRyZWU+KXQgTWFwOihBTlRMUk1hcCAqKW07CistIChOU011dGFibGVBcnJheSAqKWZpbmQ6KGlkPEFOVExSVHJlZT4pIHQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuOworLSAoQU5UTFJUcmVlV2l6YXJkICopZmluZEZpcnN0OihpZDxBTlRMUlRyZWU+KSB0IFR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKEFOVExSVHJlZVdpemFyZCAqKWZpbmRGaXJzdDooaWQ8QU5UTFJUcmVlPikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistICh2b2lkKSB2aXNpdDooaWQ8QU5UTFJUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0dHlwZSBWaXNpdG9yOihBTlRMUlZpc2l0b3IgKil2aXNpdG9yOworLSAodm9pZCkgX3Zpc2l0OihpZDxBTlRMUlRyZWU+KXQKKyAgICAgICAgIFBhcmVudDooaWQ8QU5UTFJUcmVlPilwYXJlbnQKKyAgICAgQ2hpbGRJbmRleDooTlNJbnRlZ2VyKWNoaWxkSW5kZXgKKyAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKXR0eXBlCisgICAgICAgIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistICh2b2lkKXZpc2l0OihpZDxBTlRMUlRyZWU+KXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistIChCT09MKXBhcnNlOihpZDxBTlRMUlRyZWU+KXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChCT09MKSBwYXJzZTooaWQ8QU5UTFJUcmVlPikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKSBfcGFyc2U6KGlkPEFOVExSVHJlZT4pdDEgUGF0dGVybjooQU5UTFJUcmVlUGF0dGVybiAqKXRwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChpZDxBTlRMUlRyZWU+KSBjcmVhdGVUcmVlOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKWVxdWFsczooaWQpdDEgTzI6KGlkKXQyIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKEJPT0wpZXF1YWxzOihpZCl0MSBPMjooaWQpdDI7CistIChCT09MKSBfZXF1YWxzOihpZCl0MSBPMjooaWQpdDIgQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllNzlkODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUgOiBOU09iamVjdCB7CisJQU5UTFJDb21tb25UcmVlICpjdXJyZW50Tm9kZTsKKwlBTlRMUkNvbW1vblRyZWUgKnByZXZpb3VzTm9kZTsKKworCWludCBjdXJyZW50Q2hpbGRJbmRleDsKKwlpbnQgYWJzb2x1dGVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IG5vZGVTdGFja1NpemU7CisJdW5zaWduZWQgaW50IGluZGV4U3RhY2tTaXplOworCQorCU5TTXV0YWJsZUFycmF5ICpsb29rYWhlYWQ7Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBjdXJyZW50Tm9kZTsKKy0gKHZvaWQpIHNldEN1cnJlbnROb2RlOiAoQU5UTFJDb21tb25UcmVlICopIGFDdXJyZW50Tm9kZTsKKworLSAoQU5UTFJDb21tb25UcmVlICopIHByZXZpb3VzTm9kZTsKKy0gKHZvaWQpIHNldFByZXZpb3VzTm9kZTogKEFOVExSQ29tbW9uVHJlZSAqKSBhUHJldmlvdXNOb2RlOworCistIChOU0ludGVnZXIpIGN1cnJlbnRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q3VycmVudENoaWxkSW5kZXg6IChOU0ludGVnZXIpIGFDdXJyZW50Q2hpbGRJbmRleDsKKworLSAoTlNJbnRlZ2VyKSBhYnNvbHV0ZU5vZGVJbmRleDsKKy0gKHZvaWQpIHNldEFic29sdXRlTm9kZUluZGV4OiAoTlNJbnRlZ2VyKSBhbkFic29sdXRlTm9kZUluZGV4OworCistIChOU1VJbnRlZ2VyKSBub2RlU3RhY2tTaXplOworLSAodm9pZCkgc2V0Tm9kZVN0YWNrU2l6ZTogKE5TVUludGVnZXIpIGFOb2RlU3RhY2tTaXplOworCistIChOU1VJbnRlZ2VyKSBpbmRleFN0YWNrU2l6ZTsKKy0gKHZvaWQpIHNldEluZGV4U3RhY2tTaXplOiAoTlNVSW50ZWdlcikgYW5JbmRleFN0YWNrU2l6ZTsKKworLSAoTlNNdXRhYmxlQXJyYXkgKikgbG9va2FoZWFkOworLSAodm9pZCkgc2V0TG9va2FoZWFkOiAoTlNNdXRhYmxlQXJyYXkgKikgYUxvb2thaGVhZDsKKworLSAodm9pZCkgYWRkVG9Mb29rYWhlYWQ6IChpZClsb29rYWhlYWRPYmplY3Q7CistICh2b2lkKSByZW1vdmVGcm9tTG9va2FoZWFkOiAoaWQpbG9va2FoZWFkT2JqZWN0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Zjg2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDYyIEBACisvLworLy8gIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvMTIvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJMb29rYWhlYWRTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbSA6IEFOVExSTG9va2FoZWFkU3RyZWFtIHsKKwlpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKKyAgICBOU0ludGVnZXIgdG9rZW5JbmRleDsgLy8gc2ltcGxlIGNvdW50ZXIgdG8gc2V0IHRva2VuIGluZGV4IGluIHRva2VucworICAgIE5TSW50ZWdlciBjaGFubmVsOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VuU291cmNlLCBzZXR0ZXI9c2V0VG9rZW5Tb3VyY2U6KSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFRva2VuSW5kZXgsIHNldHRlcj1zZXRUb2tlbkluZGV4KSBOU0ludGVnZXIgdG9rZW5JbmRleDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtICopbmV3QU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pbmV4dEVsZW1lbnQ7CistIChCT09MKWlzRU9GOihpZDxBTlRMUlRva2VuPikgYVRva2VuOworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pZ2V0VG9rZW5Tb3VyY2U7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhU3RhcnQgVG9FbmQ6KGlkPEFOVExSVG9rZW4+KWFTdG9wOworLSAoTlNJbnRlZ2VyKUxBOihOU0ludGVnZXIpYW5JZHg7CistIChpZDxBTlRMUlRva2VuPilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpYW5JZHg7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9IZWFkZXJzL0FOVExSVW5pcXVlSURNYXAuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlVuaXF1ZUlETWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwNWJkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlVuaXF1ZUlETWFwLmgKQEAgLTAsMCArMSw2NCBAQAorLy8KKy8vICBBTlRMUlVuaXF1ZUlETWFwLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKyNpbXBvcnQgIkFOVExSTm9kZU1hcEVsZW1lbnQuaCIKKworI2RlZmluZSBTVUNDRVNTICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkFJTFVSRSAgICAgICAgICAgICAtMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSVW5pcXVlSURNYXAgOiBBTlRMUlB0ckJ1ZmZlciB7CisgICAgTlNJbnRlZ2VyIGxhc3RIYXNoOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoKSBOU0ludGVnZXIgbGFzdEhhc2g7CisKKysgKGlkKW5ld0FOVExSVW5pcXVlSURNYXA7CisrIChpZCluZXdBTlRMUlVuaXF1ZUlETWFwV2l0aExlbjooTlNJbnRlZ2VyKWFIYXNoU2l6ZTsKKworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250OworLSAodm9pZClkZWFsbG9jOworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisvKiBjbGVhciAtLSByZWluaXRpYWxpemUgdGhlIG1hcGxpc3QgYXJyYXkgKi8KKy0gKHZvaWQpIGNsZWFyOworCistICh2b2lkKWRlbGV0ZUFOVExSVW5pcXVlSURNYXA6KEFOVExSTm9kZU1hcEVsZW1lbnQgKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk5vZGVNYXBFbGVtZW50ICopbnA7CistIChpZClnZXROb2RlOihpZDxBTlRMUlRyZWU+KWFOb2RlOworLSAodm9pZClwdXRJRDooaWQpYW5JRCBOb2RlOihpZDxBTlRMUlRyZWU+KWFOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0NWJmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvQU5UTFIuZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQvSGVhZGVycy9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaApAQCAtMCwwICsxLDQ3IEBACisvLworLy8gIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIDogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24geworCit9CisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb247CisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb246KE5TSW50ZWdlcilleHBlY3RlZCBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgQW5kOihOU0ludGVnZXIpZXhwZWN0ZWQ7CistIChpZDxBTlRMUlRva2VuPilnZXRVbmV4cGVjdGVkVG9rZW47CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgCisgICAgCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFiNzVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0FOVExSLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50L1Jlc291cmNlcy9JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQzNmEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9BTlRMUi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMvSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5vcmcuYW50bHIuYW50bHJmcmFtZXdvcms8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkZNV0s8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FDQlRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FDQlRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTE5NTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQUNCVHJlZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vCisvLyAgQUNCdHJlZS5oCisvLyAgU1Q0CisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNC8xOC8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuIENvbmRpdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKK3R5cGVkZWYgZW51bSB7CisgICAgQlROT0RFLAorICAgIExFQUYKK30gTm9kZVR5cGU7CisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCitAY2xhc3MgQU11dGFibGVEaWN0aW9uYXJ5OworCisjZGVmaW5lIEJUTk9ERVNJWkUgMTEKKyNkZWZpbmUgQlRITk9ERVNJWkUgKChCVE5PREVTSVpFLTEpLzIpCisjZGVmaW5lIEJUS2V5U2l6ZSAgMzgKKyNkZWZpbmUgRkFJTFVSRSAtMQorI2RlZmluZSBTVUNDRVNTIDAKKworQGludGVyZmFjZSBBQ0JLZXkgOiBOU09iamVjdCB7CisgICAgTlNJbnRlZ2VyIHJlY251bTsgICAgICAgICAgICAgICAvKiAgcmVjb3JkIG51bWJlciAgICAgICAgICAgICAgICAgICAqLworICAgIF9fc3Ryb25nIE5TU3RyaW5nICprZXk7ICAgICAgICAgLyogIGtleSBwb2ludGVyIGlkICAgICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyICAgICAga3N0cltCVEtleVNpemVdOyAgICAgIC8qICBrZXkgZW50cnkgICAgICAgICAgICAgICAgICAgICAgICovCit9CisKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgcmVjbnVtOworQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICprZXk7CisKKysgKEFDQktleSAqKW5ld0tleTsKKysgKEFDQktleSAqKW5ld0tleVdpdGhLU3RyOihOU1N0cmluZyAqKWFLZXk7CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aEtTdHI6KE5TU3RyaW5nICopYUtleTsKKworQGVuZAorCitAaW50ZXJmYWNlIEFDQlRyZWUgOiBOU09iamVjdCB7CisgICAgX19zdHJvbmcgQU11dGFibGVEaWN0aW9uYXJ5ICpkaWN0OyAgLyogVGhlIGRpY3Rpb25hcnkgdGhhdCB0aGlzIG5vZGUgYmVsb25ncyB0byAqLworICAgIF9fc3Ryb25nIEFDQlRyZWUgKmxub2RlOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbGVmdCBub2RlICAgICAgICAgICAgKi8KKyAgICBfX3N0cm9uZyBBQ0JUcmVlICpybm9kZTsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHJpZ2h0IG5vZGUgICAgICAgICAgICovCisgICAgX19zdHJvbmcgQUNCS2V5ICAqKmtleXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBrZXlzICAgICAgICAgICAgICAgICAqLworICAgIF9fc3Ryb25nIEFDQlRyZWUgKipidE5vZGVzOyAgICAgICAgIC8qIHBvaW50ZXJzIHRvIGJ0Tm9kZXMgICAgICAgICAgICAgKi8KKyAgICBfX3N0cm9uZyBBQ0JLZXkgICprZXlBcnJheVtCVE5PREVTSVpFXTsKKyAgICBfX3N0cm9uZyBBQ0JUcmVlICpidE5vZGVBcnJheVtCVE5PREVTSVpFXTsKKyAgICBOU0ludGVnZXIgbG5vZGVpZDsgICAgICAgICAgICAgICAgICAvKiBub2RlaWQgb2YgbGVmdCBub2RlICAgICAgICAgICAgICovCisgICAgTlNJbnRlZ2VyIHJub2RlaWQ7ICAgICAgICAgICAgICAgICAgLyogbm9kZWlkIG9mIHJpZ2h0IG5vZGUgICAgICAgICAgICAqLworICAgIE5TSW50ZWdlciBub2RlaWQ7ICAgICAgICAgICAgICAgICAgIC8qIG5vZGUgaWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBOU0ludGVnZXIgbm9kZVR5cGU7ICAgICAgICAgICAgICAgICAvKiAxID0gbm9kZSwgMiA9IGxlYWYsIC0xID0gdW51c2VkICovCisgICAgTlNJbnRlZ2VyIG51bWtleXM7ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGFjdGl2ZSBlbnRyaWVzICAgICAgICAqLworICAgIE5TSW50ZWdlciBudW1yZWNzOyAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWNvcmRzICAgICAgICAgICAgICAgKi8KKyAgICBOU0ludGVnZXIgdXBkdGQ7ICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCBzaW5jZSB1cGRhdGUgZmxhZyAgICAgICovCisgICAgTlNJbnRlZ2VyIGtleWxlbjsgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGtleSAgICAgICAgICAgICAgICAgICAqLworICAgIE5TSW50ZWdlciBraWR4OworfQorCitAcHJvcGVydHkgKHJldGFpbikgQU11dGFibGVEaWN0aW9uYXJ5ICpkaWN0OworQHByb3BlcnR5IChyZXRhaW4pIEFDQlRyZWUgICpsbm9kZTsKK0Bwcm9wZXJ0eSAocmV0YWluKSBBQ0JUcmVlICAqcm5vZGU7CitAcHJvcGVydHkgKGFzc2lnbikgQUNCS2V5ICAgKiprZXlzOworQHByb3BlcnR5IChhc3NpZ24pIEFDQlRyZWUgICoqYnROb2RlczsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgbG5vZGVpZDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgcm5vZGVpZDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgbm9kZWlkOworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBub2RlVHlwZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgbnVta2V5czsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgbnVtcmVjczsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgdXBkdGQ7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGtleWxlbjsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIga2lkeDsKKworKyAoQUNCVHJlZSAqKSBuZXdOb2RlV2l0aERpY3Rpb25hcnk6KEFNdXRhYmxlRGljdGlvbmFyeSAqKXRoZURpY3Q7CisKKy0gKGlkKWluaXRXaXRoRGljdGlvbmFyeTooQU11dGFibGVEaWN0aW9uYXJ5ICopdGhlRGljdDsKKworLSAoQUNCVHJlZSAqKWNyZWF0ZW5vZGU6KEFDQktleSAqKWtwMDsKKy0gKEFDQlRyZWUgKilkZWxldGVrZXk6KE5TU3RyaW5nICopZGtleTsKKy0gKEFDQlRyZWUgKilpbnNlcnRrZXk6KEFDQktleSAqKWlrcCB2YWx1ZTooaWQpdmFsdWU7CistIChBQ0JLZXkgKilpbnRlcm5hbGRlbGV0ZTooQUNCS2V5ICopZGtwOworLSAoQUNCVHJlZSAqKSBpbnRlcm5hbGluc2VydDooQUNCS2V5ICopa2V5IHZhbHVlOihpZCl2YWx1ZSBzcGxpdDooTlNJbnRlZ2VyICopaDsKKy0gKEFDQlRyZWUgKikgaW5zZXJ0OihBQ0JLZXkgKilrZXkgdmFsdWU6KGlkKXZhbHVlIGluZGV4OihOU0ludGVnZXIpaGkgc3BsaXQ6KE5TSW50ZWdlciAqKWg7CistIChOU0ludGVnZXIpZGVsZnJtbm9kZTooQUNCS2V5ICopaWtwOworLSAoTlNJbnRlZ2VyKWluc2lubm9kZTooQUNCS2V5ICopa2V5IHZhbHVlOihpZCl2YWx1ZTsKKy0gKHZvaWQpbWVyZ2Vub2RlOihOU0ludGVnZXIpaTsKKy0gKEFDQlRyZWUgKilzcGxpdG5vZGU6KE5TSW50ZWdlcilpZHg7CistIChBQ0JUcmVlICopc2VhcmNoOihpZClrZXk7CistIChOU0ludGVnZXIpc2VhcmNobm9kZTooaWQpa2V5IG1hdGNoOihCT09MKW1hdGNoOworLSAodm9pZClib3Jyb3dsZWZ0OihOU0ludGVnZXIpaTsKKy0gKHZvaWQpYm9ycm93cmlnaHQ6KE5TSW50ZWdlcilpOworLSAodm9pZClyb3RhdGVsZWZ0OihOU0ludGVnZXIpajsKKy0gKHZvaWQpcm90YXRlcmlnaHQ6KE5TSW50ZWdlcilqOworLSAoTlNJbnRlZ2VyKSBrZXlXYWxrTGVhdmVzOworLSAoTlNJbnRlZ2VyKSBvYmplY3RXYWxrTGVhdmVzOworLSAodm9pZClkZWFsbG9jOworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQUNCVHJlZS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQUNCVHJlZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzBjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BQ0JUcmVlLm0KQEAgLTAsMCArMSw3MjEgQEAKKy8vCisvLyAgQUNCVHJlZS5tCisvLyAgU1Q0CisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNC8xOC8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuIENvbmRpdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBQ0JUcmVlLmgiCisjaW1wb3J0ICJBTXV0YWJsZURpY3Rpb25hcnkuaCIKKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorCitAY2xhc3MgQU11dGFibGVEaWN0aW9uYXJ5OworCitAaW1wbGVtZW50YXRpb24gQUNCS2V5CisKK3N0YXRpYyBOU0ludGVnZXIgUkVDTlVNID0gMDsKKworQHN5bnRoZXNpemUgcmVjbnVtOworQHN5bnRoZXNpemUga2V5OworCisrIChBQ0JLZXkgKiluZXdLZXkKK3sKKyAgICByZXR1cm4gW1tBQ0JLZXkgYWxsb2NdIGluaXRdOworfQorCisrIChBQ0JLZXkgKiluZXdLZXlXaXRoS1N0cjooTlNTdHJpbmcgKilhS2V5Cit7CisgICAgcmV0dXJuIFtbQUNCS2V5IGFsbG9jXSBpbml0V2l0aEtTdHI6KE5TU3RyaW5nICopYUtleV07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9W3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIHJlY251bSA9IFJFQ05VTSsrOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoS1N0cjooTlNTdHJpbmcgKilhS2V5Cit7CisgICAgc2VsZiA9W3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIE5TSW50ZWdlciBsZW47CisgICAgICAgIHJlY251bSA9IFJFQ05VTSsrOworICAgICAgICBrZXkgPSBhS2V5OworICAgICAgICBsZW4gPSBbYUtleSBsZW5ndGhdOworICAgICAgICBpZiAoIGxlbiA+PSBCVEtleVNpemUgKSB7CisgICAgICAgICAgICBsZW4gPSBCVEtleVNpemUgLSAxOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoIGtzdHIsIFthS2V5IGNTdHJpbmdVc2luZ0VuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ10sIGxlbik7CisgICAgICAgIGtzdHJbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBBQ0JUcmVlCisKK0BzeW50aGVzaXplIGRpY3Q7CitAc3ludGhlc2l6ZSBsbm9kZTsKK0BzeW50aGVzaXplIHJub2RlOworQHN5bnRoZXNpemUga2V5czsKK0BzeW50aGVzaXplIGJ0Tm9kZXM7CitAc3ludGhlc2l6ZSBsbm9kZWlkOworQHN5bnRoZXNpemUgcm5vZGVpZDsKK0BzeW50aGVzaXplIG5vZGVpZDsKK0BzeW50aGVzaXplIG5vZGVUeXBlOworQHN5bnRoZXNpemUgbnVta2V5czsKK0BzeW50aGVzaXplIG51bXJlY3M7CitAc3ludGhlc2l6ZSB1cGR0ZDsKK0BzeW50aGVzaXplIGtleWxlbjsKK0BzeW50aGVzaXplIGtpZHg7CisKKysgKEFDQlRyZWUgKikgbmV3Tm9kZVdpdGhEaWN0aW9uYXJ5OihBTXV0YWJsZURpY3Rpb25hcnkgKil0aGVEaWN0Cit7CisgICAgcmV0dXJuIFtbQUNCVHJlZSBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OnRoZURpY3RdOworfQorCistIChpZClpbml0V2l0aERpY3Rpb25hcnk6KEFNdXRhYmxlRGljdGlvbmFyeSAqKXRoZURpY3QKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmIChzZWxmKSB7CisgICAgICAgIC8vIEluaXRpYWxpemF0aW9uIGNvZGUgaGVyZS4KKyAgICAgICAgZGljdCA9IHRoZURpY3Q7CisgICAgICAgIG5vZGVpZCA9IHRoZURpY3Qubnh0X25vZGVpZCsrOworICAgICAgICBrZXlzID0ga2V5QXJyYXk7CisgICAgICAgIGJ0Tm9kZXMgPSBidE5vZGVBcnJheTsKKyAgICAgICAgaWYgKCBub2RlaWQgPT0gMCApIHsKKyAgICAgICAgICAgIG51bWtleXMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBzZWxmOworfQorCistIChBQ0JUcmVlICopY3JlYXRlbm9kZTooQUNCS2V5ICopa3AKK3sKKyAgICBBQ0JUcmVlICp0bXA7CisgICAgCisgICAgdG1wID0gW0FDQlRyZWUgbmV3Tm9kZVdpdGhEaWN0aW9uYXJ5OmRpY3RdOworICAgIHRtcC5ub2RlVHlwZSA9IG5vZGVUeXBlOworICAgIHRtcC5sbm9kZSA9IHNlbGY7CisgICAgdG1wLnJub2RlID0gc2VsZi5ybm9kZTsKKyAgICBzZWxmLnJub2RlID0gdG1wOworICAgIC8vdG1wLmJ0Tm9kZXNbMF0gPSBzZWxmOworICAgIC8vdG1wLmtleXNbMF0gPSBrcDsKKyAgICB0bXAudXBkdGQgPSBZRVM7CisgICAgdG1wLm51bXJlY3MgPSAoKG5vZGVUeXBlID09IExFQUYpPzE6bnVtcmVjcyk7CisgICAgdXBkdGQgPSBZRVM7CisgICAgdG1wLm51bWtleXMgPSAxOworICAgIFt0bXAgcmV0YWluXTsKKyAgICByZXR1cm4odG1wKTsKK30KKworLSAoQUNCVHJlZSAqKWRlbGV0ZWtleTooTlNTdHJpbmcgKilka2V5Cit7CisgICAgQUNCS2V5IC8qICpkZWwsICovICpka3A7CisgICAgQUNCVHJlZSAqdG9sZCwgKnNOb2RlOworICAgIEJPT0wgbXVzdFJlbGVhc2UgPSBOTzsKKworICAgIGlmICggW2RrZXkgaXNLaW5kT2ZDbGFzczpbTlNTdHJpbmcgY2xhc3NdXSApIHsKKyAgICAgICAgZGtwID0gW0FDQktleSBuZXdLZXlXaXRoS1N0cjpka2V5XTsKKyAgICAgICAgbXVzdFJlbGVhc2UgPSBZRVM7CisgICAgfQorICAgIGVsc2UgaWYgKCBbZGtleSBpc0tpbmRPZkNsYXNzOltBQ0JLZXkgY2xhc3NdXSApCisgICAgICAgIGRrcCA9IChBQ0JLZXkgKilka2V5OworICAgIGVsc2UKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJEb24ndCB1bmRlcnN0YW5kIHRoaXMga2V5OlwiJUBcIiIsIGRrZXldXTsKKyAgICBzTm9kZSA9IFtzZWxmIHNlYXJjaDpka3Aua2V5XTsKKyAgICBpZiAoIHNOb2RlID09IG5pbCB8fCBbc05vZGUgc2VhcmNobm9kZTpka3Aua2V5IG1hdGNoOllFU10gPT0gRkFJTFVSRSApIHsKKyAgICAgICAgaWYgKCBtdXN0UmVsZWFzZSApIFtka3AgcmVsZWFzZV07CisgICAgICAgIHJldHVybihzZWxmKTsKKyAgICB9CisgICAgdG9sZCA9IGRpY3Qucm9vdDsKKyAgICAvKiBkZWwgPSAqL1tzZWxmIGludGVybmFsZGVsZXRlOmRrcF07CisgICAgCisgICAgLyogIGNoZWNrIGZvciBzaHJpbmsgYXQgdGhlIHJvb3QgICovCisgICAgaWYgKCBudW1rZXlzID09IDEgJiYgbm9kZVR5cGUgIT0gTEVBRiApIHsKKyAgICAgICAgdG9sZCA9IGJ0Tm9kZXNbMF07CisgICAgICAgIHRvbGQubm9kZWlkID0gMTsKKyAgICAgICAgdG9sZC51cGR0ZCA9IFlFUzsKKyAgICAgICAgZGljdC5yb290ID0gdG9sZDsKKyAgICB9CisjaWZkZWYgRE9OVFVTRU5PTU8KKyAgICBpZiAoZGVidWcgPT0gJ2QnKSBbc2VsZiBwcmludHRyZWVdOworI2VuZGlmCisgICAgaWYgKCBtdXN0UmVsZWFzZSApIFtka3AgcmVsZWFzZV07CisgICAgcmV0dXJuKHRvbGQpOworfQorCisvKiogaW5zZXJ0S2V5IGlzIHRoZSBpbnNlcnRpb24gZW50cnkgcG9pbnQKKyAqICBJdCBkZXRlcm1pbmVzIGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoZSB0cmVlIGFscmVhZHkKKyAqICBpdCBjYWxscyBpbnRlcm5hbEluc2VydCB0byBkZXRlcm1pbmUgaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdHJlZSwKKyAqICBhbmQgcmV0dXJucyB0aGUgbm9kZSB0byBiZSB1cGRhdGVkCisgKi8KKy0gKEFDQlRyZWUgKilpbnNlcnRrZXk6KEFDQktleSAqKWtwIHZhbHVlOihpZCl2YWx1ZQoreworICAgIEFDQlRyZWUgKnRuZXcsICpxOworICAgIE5TSW50ZWdlciBoLCBub2RlTnVtOworICAgIAorICAgIHRuZXcgPSBzZWxmOworICAgIHEgPSBbc2VsZiBpbnRlcm5hbGluc2VydDprcCB2YWx1ZTp2YWx1ZSBzcGxpdDomaF07CisgICAgLyogIGNoZWNrIGZvciBncm93dGggYXQgdGhlIHJvb3QgICovCisgICAgaWYgKCBxICE9IG5pbCApIHsKKyAgICAgICAgdG5ldyA9IFtbQUNCVHJlZSBuZXdOb2RlV2l0aERpY3Rpb25hcnk6ZGljdF0gcmV0YWluXTsKKyAgICAgICAgdG5ldy5ub2RlVHlwZSA9IEJUTk9ERTsKKyAgICAgICAgbm9kZU51bSA9IHRuZXcubm9kZWlkOworICAgICAgICB0bmV3Lm5vZGVpZCA9IDA7CisgICAgICAgIHNlbGYubm9kZWlkID0gbm9kZU51bTsKKyAgICAgICAgW3RuZXcgaW5zZXJ0OnNlbGYua2V5c1tudW1rZXlzLTFdIHZhbHVlOnNlbGYgaW5kZXg6MCBzcGxpdDomaF07CisgICAgICAgIFt0bmV3IGluc2VydDpxLmtleXNbcS5udW1rZXlzLTFdIHZhbHVlOnEgaW5kZXg6MSBzcGxpdDomaF07CisgICAgICAgIHRuZXcubnVtcmVjcyA9IHNlbGYubnVtcmVjcyArIHEubnVtcmVjczsKKyAgICAgICAgdG5ldy5sbm9kZWlkID0gc2VsZi5ub2RlaWQ7CisgICAgICAgIHRuZXcucm5vZGVpZCA9IHNlbGYucm5vZGVpZDsKKyAgICAgICAgc2VsZi5ybm9kZWlkID0gdG5ldy5ub2RlaWQ7CisgICAgICAgIHRuZXcubG5vZGUgPSBzZWxmOworICAgICAgICB0bmV3LnJub2RlID0gc2VsZi5ybm9kZTsKKyAgICAgICAgc2VsZi5ybm9kZSA9IHRuZXc7CisgICAgICAgIC8qIGFmZmVjdGVkIGJ5IG5vZGVpZCBzd2FwICovCisgICAgICAgIC8vIG5ld25vZGUubG5vZGVpZCA9IHRuZXcuYnROb2Rlc1swXS5ub2RlaWQ7CisgICAgfQorICAgIC8vZGljdC5yb290ID0gdDsKKyAgICAvL2wucmVjY250Kys7CisgICAgcmV0dXJuKHRuZXcpOworfQorCistIChBQ0JUcmVlICopc2VhcmNoOihOU1N0cmluZyAqKWtzdHIKK3sKKyAgICBOU0ludGVnZXIgaSwgcmV0OworICAgIE5TSW50ZWdlciBzcmNobHZsID0gMDsKKyAgICBBQ0JUcmVlICp0OworCisgICAgdCA9IHNlbGY7CisgICAgaWYgKCBzZWxmLm51bWtleXMgPT0gMCAmJiBzZWxmLm5vZGVUeXBlID09IExFQUYgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHdoaWxlICh0ICE9IG5pbCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdC5udW1rZXlzOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IFt0LmtleXNbaV0ua2V5IGNvbXBhcmU6a3N0cl07CisgICAgICAgICAgICBpZiAoIHJldCA+PSAwICkgeworICAgICAgICAgICAgICAgIGlmICggdC5ub2RlVHlwZSA9PSBMRUFGICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHJldCA9PSAwICkgcmV0dXJuICh0KTsgICAgLyogbm9kZSBjb250YWluaW5nIGtleWVudHJ5IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG5pbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmNobHZsKys7CisgICAgICAgIGlmICggdC5ub2RlVHlwZSA9PSBCVE5PREUgKSB0ID0gdC5idE5vZGVzW2ldOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHQgPSBuaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKG5pbCk7ICAgICAgICAgIC8qIGVudHJ5IG5vdCBmb3VuZCAqLworfQorCisvKiogU0VBUkNITk9ERQorICogIGNhbGxpbmcgcGFyYW1ldGVycyAtLQorICogICAgICBCS0VZIFBUUiBmb3Iga2V5IHRvIHNlYXJjaCBmb3IuCisgKiAgICAgIFRZUEUgZm9yIGV4YWN0IG1hdGNoKFlFUykgb3IgcG9zaXRpb24oTk8pCisgKiAgcmV0dXJucyAtLSBpCisgKiAgICAgIGkgPT0gRkFJTFVSRSB3aGVuIG1hdGNoIHJlcXVpcmVkIGJ1dCBkb2VzIG5vdCBleGlzdC4KKyAqICAgICAgaSA9PSB0Lm51bWtleXMgaWYgbm8gZXhpc3RpbmcgaW5zZXJ0aW9uIGJyYW5jaCBmb3VuZC4KKyAqICAgICAgb3RoZXJ3aXNlIGkgPT0gaW5zZXJ0aW9uIGJyYW5jaC4KKyAqLworLSAoTlNJbnRlZ2VyKXNlYXJjaG5vZGU6KE5TU3RyaW5nICopa3N0ciBtYXRjaDooQk9PTCltYXRjaAoreworICAgIE5TSW50ZWdlciBpLCByZXQ7CisgICAgZm9yICggaSA9IDA7IGkgPCBudW1rZXlzOyBpKysgKSB7CisgICAgICAgIHJldCA9IFtrZXlzW2ldLmtleSBjb21wYXJlOmtzdHJdOworICAgICAgICBpZiAoIHJldCA+PSAwICkgeyAgICAgICAgIC8qIGtleSBub2RlIGZvdW5kICovCisgICAgICAgICAgICBpZiAoIHJldCA9PSAwICYmIG1hdGNoID09IE5PICkgeworICAgICAgICAgICAgICAgIHJldHVybiBGQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHJldCA+IDAgJiYgIG1hdGNoID09IFlFUyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICggaSA9PSBudW1rZXlzICYmIG1hdGNoID09IFlFUyApIHsKKyAgICAgICAgaSA9IEZBSUxVUkU7CisgICAgfQorICAgIHJldHVybihpKTsKK30KKworLSAoQUNCS2V5ICopaW50ZXJuYWxkZWxldGU6KEFDQktleSAqKWRrcAoreworICAgIE5TSW50ZWdlciBpLCBua2V5OworICAgIF9fc3Ryb25nIEFDQktleSAqZGVsID0gbmlsOworICAgIEFDQlRyZWUgKnRzYjsKKyAgICBOU0ludGVnZXIgc3JjaGx2bCA9IDA7CisgICAgCisgICAgLyogZmluZCBkZWxldGlvbiBicmFuY2ggKi8KKyAgICBpZiAoIHNlbGYubm9kZVR5cGUgIT0gTEVBRiApIHsKKyAgICAgICAgc3JjaGx2bCsrOworICAgICAgICAvKiBzZWFyY2ggZm9yIGVuZCBvZiB0cmVlICovCisgICAgICAgIGkgPSBbc2VsZiBzZWFyY2hub2RlOmRrcC5rZXkgbWF0Y2g6Tk9dOworICAgICAgICBkZWwgPSBbYnROb2Rlc1tpXSBpbnRlcm5hbGRlbGV0ZTpka3BdOworICAgICAgICBzcmNobHZsLS07CisgICAgICAgIC8qIGlmIG5vdCBMRUFGIHByb3BhZ2F0ZSBiYWNrIGhpZ2gga2V5ICAgICovCisgICAgICAgIHRzYiA9IGJ0Tm9kZXNbaV07CisgICAgICAgIG5rZXkgPSB0c2IubnVta2V5cyAtIDE7CisgICAgfQorICAgIC8qKiogIHRoZSBib3R0b20gb2YgdGhlIHRyZWUgaGFzIGJlZW4gcmVhY2hlZCAgICAgICAqKiovCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgIC8qIHNldCB1cCBkZWxldGlvbiBwdHJzICAgICAgKi8KKyAgICAgICAgaWYgKCBbc2VsZiBkZWxmcm1ub2RlOmRrcF0gPT0gU1VDQ0VTUyApIHsKKyAgICAgICAgICAgIGlmICggbnVta2V5cyA8IEJUSE5PREVTSVpFKzEgKSB7CisgICAgICAgICAgICAgICAgZGVsID0gZGtwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsID0gbmlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGtwLnJlY251bSA9IG5vZGVpZDsKKyAgICAgICAgICAgIHJldHVybihkZWwpOworICAgICAgICB9CisgICAgfQorICAgIC8qKiogICAgICAgaW5kaWNhdGUgZGVsZXRpb24gdG8gYmUgZG9uZSAgICAgICAgICAgICoqKi8KKyAgICBpZiAoIGRlbCAhPSBuaWwgKSB7CisgICAgICAgIC8qKiogdGhlIGtleSBpbiAiZGVsIiBoYXMgdG8gYmUgZGVsZXRlZCBmcm9tIGluIHByZXNlbnQgbm9kZSAqKiovCisgICAgICAgIGlmICggYnROb2Rlc1tpXS5udW1rZXlzID49IEJUSE5PREVTSVpFKzEgKSB7CisgICAgICAgICAgICAvKiBub2RlIGRvZXMgbm90IG5lZWQgYmFsYW5jaW5nICovCisgICAgICAgICAgICBkZWwgPSBuaWw7CisgICAgICAgICAgICBzZWxmLmtleXNbaV0gPSB0c2Iua2V5c1tua2V5XTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9kZSByZXF1aXJlcyBiYWxhbmNpbmcgKi8KKyAgICAgICAgICAgIGlmICggaSA9PSAwICkgeworICAgICAgICAgICAgICAgIFtzZWxmIHJvdGF0ZXJpZ2h0OjBdOworICAgICAgICAgICAgICAgIHNlbGYuYnROb2Rlc1swXSA9IHRzYjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGkgPCBudW1rZXlzLTEgKSB7ICAgICAvKiBsb29rIHRvIHRoZSByaWdodCBmaXJzdCAqLworICAgICAgICAgICAgICAgIGlmICggc2VsZi5idE5vZGVzW2krMV0ubnVta2V5cyA+IEJUSE5PREVTSVpFKzEgKSB7ICAvKiBjYXJyeSBmcm9tIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGJvcnJvd3JpZ2h0OmldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgIC8qIG1lcmdlIHByZXNlbnQgbm9kZSB3aXRoIHJpZ2h0IG5vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWVyZ2Vub2RlOmldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBsb29rIHRvIHRoZSBsZWZ0ICovCisgICAgICAgICAgICAgICAgaWYgKCBpID4gMCApIHsgICAgICAgICAgLyogY2Fycnkgb3IgbWVyZ2Ugd2l0aCBsZWZ0IG5vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzZWxmLmJ0Tm9kZXNbaS0xXS5udW1rZXlzID4gQlRITk9ERVNJWkUrMSApIHsgLyogY2FycnkgZnJvbSBsZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBib3Jyb3dsZWZ0OmldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvKioqIG1lcmdlIHByZXNlbnQgbm9kZSB3aXRoIGxlZnQgbm9kZSAqKiovCisgICAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtZXJnZW5vZGU6aV07CisgICAgICAgICAgICAgICAgICAgICAgICB0c2IgPSBzZWxmLmJ0Tm9kZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIHNlbGYua2V5c1tpXSA9IHRzYi5rZXlzW25rZXldOworICAgICAgICB9CisgICAgfQorICAgIG51bXJlY3MtLTsKKyAgICB1cGR0ZCA9IFRSVUU7CisgICAgcmV0dXJuKGRlbCk7Cit9CisKKy8qKiBTZWFyY2gga2V5IGtwIG9uIEItdHJlZSB3aXRoIHJvb3QgdDsgaWYgZm91bmQgaW5jcmVtZW50IGNvdW50ZXIuCisgKiAgb3RoZXJ3aXNlIGluc2VydCBhbiBpdGVtIHdpdGgga2V5IGtwIGluIHRyZWUuICBJZiBhbiBBQ0JLZXkKKyAqICBlbWVyZ2VzIHRvIGJlIHBhc3NlZCB0byBhIGxvd2VyIGxldmVsLCB0aGVuIGFzc2lnbiBpdCB0byBrcDsKKyAqICBoID0gInRyZWUgdCBoYXMgYmVjb21lIGhpZ2hlciIKKyAqLworLSAoQUNCVHJlZSAqKSBpbnRlcm5hbGluc2VydDooQUNCS2V5ICopa3AgdmFsdWU6KGlkKXZhbHVlIHNwbGl0OihOU0ludGVnZXIgKiloCit7CisgICAgLyogc2VhcmNoIGtleSBpbnMgb24gbm9kZSB0XjsgaCA9IGZhbHNlICAqLworICAgIE5TSW50ZWdlciBpLCByZXQ7CisgICAgQUNCVHJlZSAqcSwgKnRtcDsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVta2V5czsgaSsrKSB7CisgICAgICAgIHJldCA9IFtrZXlzW2ldLmtleSBjb21wYXJlOmtwLmtleV07CisgICAgICAgIGlmICggcmV0ID49IDAgKSB7CisgICAgICAgICAgICBpZiAoIG5vZGVUeXBlID09IExFQUYgJiYgcmV0ID09IDAgKSByZXR1cm4gKHNlbGYpOyAgICAvKiBub2RlIGNvbnRhaW5pbmcga2V5ZW50cnkgZm91bmQgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICggbm9kZVR5cGUgPT0gTEVBRiApIHsgLyogIGtleSBnb2VzIGluIHRoaXMgbm9kZSAgKi8KKyAgICAgICAgcSA9IFtzZWxmIGluc2VydDprcCB2YWx1ZTp2YWx1ZSBpbmRleDppIHNwbGl0OmhdOworICAgIH0KKyAgICBlbHNlICB7IC8qIG5vZGVUeXBlID09IEJUTk9ERSAqLworICAgICAgICAvKiAga2V5IGlzIG5vdCBvbiB0aGlzIG5vZGUgICovCisgICAgICAgIHEgPSBbc2VsZi5idE5vZGVzW2ldIGludGVybmFsaW5zZXJ0OmtwIHZhbHVlOnZhbHVlIHNwbGl0OmhdOworICAgICAgICBpZiAoICpoICkgeworICAgICAgICAgICAgW3NlbGYgaW5zZXJ0OmtwIHZhbHVlOnEgaW5kZXg6aSBzcGxpdDpoXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYubnVtcmVjcysrOworICAgICAgICB9CisgICAgICAgIHRtcCA9IHNlbGYuYnROb2Rlc1tudW1rZXlzLTFdOworICAgICAgICBrZXlzW251bWtleXMtMV0gPSB0bXAua2V5c1t0bXAubnVta2V5cy0xXTsKKyAgICAgICAgaWYgKCBpICE9IG51bWtleXMtMSApIHsKKyAgICAgICAgICAgIHRtcCA9IHNlbGYuYnROb2Rlc1tpXTsKKyAgICAgICAgICAgIGtleXNbaV0gPSB0bXAua2V5c1t0bXAubnVta2V5cy0xXTsKKyAgICAgICAgfQorICAgICAgICB1cGR0ZCA9IFlFUzsKKyAgICB9IC8qIHNlYXJjaCAqLworICAgIHJldHVybiBxOworfQorCisvKiogRG8gdGhlIGFjdHVhbCBpbnNlcnRpb24gb3Igc3BsaXQgYW5kIGluc2VydAorICogIGluc2VydCBrZXkgdG8gdGhlIHJpZ2h0IG9mIHQua2V5c1toaV0gCisgKi8KKy0gKEFDQlRyZWUgKikgaW5zZXJ0OihBQ0JLZXkgKilrcCB2YWx1ZTooaWQpdmFsdWUgaW5kZXg6KE5TSW50ZWdlciloaSBzcGxpdDooTlNJbnRlZ2VyICopaAoreworICAgIEFDQlRyZWUgKmI7CisgICAgCisgICAgaWYgKCBudW1rZXlzIDwgQlROT0RFU0laRSApIHsKKyAgICAgICAgKmggPSBOTzsKKyAgICAgICAgW3NlbGYgcm90YXRlcmlnaHQ6aGldOworICAgICAgICBrZXlzW2hpXSA9IGtwOworICAgICAgICBidE5vZGVzW2hpXSA9IHZhbHVlOworICAgICAgICBudW1yZWNzKys7CisgICAgICAgIG51bWtleXMrKzsKKyAgICAgICAgdXBkdGQgPSBZRVM7CisgICAgICAgIC8vW2twIHJldGFpbl07CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIGVsc2UgeyAvKiAgbm9kZSB0IGlzIGZ1bGw7IHNwbGl0IGl0IGFuZCBhc3NpZ24gdGhlIGVtZXJnaW5nIEFDQktleSB0byBvbGRpdGVtICAqLworICAgICAgICBiID0gW3NlbGYgc3BsaXRub2RlOmhpXTsKKyAgICAgICAgaWYgKCBoaSA8PSBCVEhOT0RFU0laRSApIHsgICAgICAgICAgICAgIC8qIGluc2VydCBrZXkgaW4gbGVmdCBwYWdlICovCisgICAgICAgICAgICBbc2VsZiByb3RhdGVyaWdodDpoaV07CisgICAgICAgICAgICBrZXlzW2hpXSA9IGtwOworICAgICAgICAgICAgYnROb2Rlc1toaV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIG51bXJlY3MrKzsKKyAgICAgICAgICAgIG51bWtleXMrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5zZXJ0IGtleSBpbiByaWdodCBwYWdlICovCisgICAgICAgICAgICBoaSAtPSBCVEhOT0RFU0laRTsKKyAgICAgICAgICAgIGlmICggYi5ybm9kZSA9PSBuaWwgKSBoaS0tOworICAgICAgICAgICAgW2Igcm90YXRlcmlnaHQ6aGldOworICAgICAgICAgICAgYi5rZXlzW2hpXSA9IGtwOworICAgICAgICAgICAgYi5idE5vZGVzW2hpXSA9IHZhbHVlOworICAgICAgICAgICAgYi5udW1yZWNzKys7CisgICAgICAgICAgICBiLm51bWtleXMrKzsKKyAgICAgICAgfQorICAgICAgICBudW1rZXlzID0gYi5udW1rZXlzID0gQlRITk9ERVNJWkUrMTsKKyAgICAgICAgYi51cGR0ZCA9IHVwZHRkID0gWUVTOworICAgIH0KKyAgICByZXR1cm4gYjsKK30gLyogaW5zZXJ0ICovCisKKy0gKHZvaWQpYm9ycm93bGVmdDooTlNJbnRlZ2VyKWkKK3sKKyAgICBBQ0JUcmVlICp0MCwgKnQxOworICAgIE5TSW50ZWdlciBua2V5OworICAgIAorICAgIHQwID0gYnROb2Rlc1tpXTsKKyAgICB0MSA9IGJ0Tm9kZXNbaS0xXTsKKyAgICBua2V5ID0gdDEubnVta2V5cy0xOworICAgIFt0MCBpbnNpbm5vZGU6dDEua2V5c1tua2V5XSB2YWx1ZTp0MS5idE5vZGVzW25rZXldXTsKKyAgICBbdDEgZGVsZnJtbm9kZTp0MS5rZXlzW25rZXldXTsKKyAgICBua2V5LS07CisgICAga2V5c1tpLTFdID0gdDEua2V5c1tua2V5XTsKKyAgICBrZXlzW2ktMV0ucmVjbnVtID0gdDEubm9kZWlkOworfQorCistICh2b2lkKWJvcnJvd3JpZ2h0OihOU0ludGVnZXIpaQoreworICAgIEFDQlRyZWUgKnQwLCAqdDE7CisgICAgTlNJbnRlZ2VyIG5rZXk7CisgICAgCisgICAgdDAgPSBidE5vZGVzW2ldOworICAgIHQxID0gYnROb2Rlc1tpKzFdOworICAgIFt0MCBpbnNpbm5vZGU6dDEua2V5c1swXSB2YWx1ZTp0MS5idE5vZGVzWzBdXTsKKyAgICBbdDEgZGVsZnJtbm9kZTp0MS5rZXlzWzBdXTsKKyAgICBua2V5ID0gdDAubnVta2V5cyAtIDE7CisgICAga2V5c1tpXSA9IHQwLmtleXNbbmtleV07CisgICAga2V5c1tpXS5yZWNudW0gPSB0MC5ub2RlaWQ7Cit9CisKKy0gKE5TSW50ZWdlcilkZWxmcm1ub2RlOihBQ0JLZXkgKilpa3AKK3sKKyAgICBOU0ludGVnZXIgajsKKyAgICAKKyAgICBqID0gW3NlbGYgc2VhcmNobm9kZTppa3Aua2V5IG1hdGNoOllFU107CisgICAgaWYgKGogPT0gRkFJTFVSRSkgeworICAgICAgICByZXR1cm4oRkFJTFVSRSk7CisgICAgfQorICAgIEFDQktleSAqazAgPSBuaWw7CisgICAgQUNCVHJlZSAqbjAgPSBuaWw7CisgICAgaWYgKCBzZWxmLm5vZGVUeXBlID09IExFQUYgKSB7CisgICAgICAgIGswID0gc2VsZi5rZXlzW2pdOworICAgICAgICBuMCA9IHNlbGYuYnROb2Rlc1tqXTsKKyAgICB9CisgICAgW3NlbGYgcm90YXRlbGVmdDpqXTsKKyAgICBzZWxmLm51bWtleXMtLTsKKyAgICBudW1yZWNzIC09ICgoc2VsZi5ub2RlVHlwZSA9PSBMRUFGKT8xOmJ0Tm9kZXNbal0ubnVtcmVjcyk7CisgICAgaWYgKCBrMCApIFtrMCByZWxlYXNlXTsKKyAgICBpZiAoIG4wICkgW24wIHJlbGVhc2VdOworICAgIHVwZHRkID0gVFJVRTsKKyAgICByZXR1cm4oU1VDQ0VTUyk7Cit9CisKKy0gKE5TSW50ZWdlcilpbnNpbm5vZGU6KEFDQktleSAqKWlrcCB2YWx1ZTooaWQpdmFsdWUKK3sKKyAgICBOU0ludGVnZXIgajsKKyAgICAKKyAgICBqID0gW3NlbGYgc2VhcmNobm9kZTppa3Aua2V5IG1hdGNoOk5PXTsKKyAgICBbc2VsZiByb3RhdGVyaWdodDpqXTsKKyAgICBrZXlzW2pdID0gaWtwOworICAgIGJ0Tm9kZXNbal0gPSB2YWx1ZTsKKyAgICBudW1rZXlzKys7CisgICAgaWYgKCBub2RlVHlwZSA9PSBMRUFGICkgeworICAgICAgICBudW1yZWNzKys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudW1yZWNzICs9IGJ0Tm9kZXNbal0ubnVtcmVjczsKKyAgICB9CisgICAgdXBkdGQgPSBUUlVFOworICAgIHJldHVybihqKTsKK30KKworLSAodm9pZCltZXJnZW5vZGU6KE5TSW50ZWdlcilpCit7CisgICAgQUNCVHJlZSAqdDAsICp0MSwgKnRyOworICAgIE5TSW50ZWdlciBqLCBrLCBua2V5czsKKyAgICAKKyAgICB0MCA9IGJ0Tm9kZXNbaV07CisgICAgdDEgPSBidE5vZGVzW2krMV07CisgICAgLyoqKiBtb3ZlIGtleXMgYW5kIHBvaW50ZXJzIGZyb20KKyAgICAgdDEgbm9kZSB0byB0MCBub2RlICAgICAgICAgICAqKiovCisgICAgZm9yIChqPXQwLm51bWtleXMsIGs9MDsgaiA8IEJUTk9ERVNJWkUgJiYgayA8IHQxLm51bWtleXM7IGorKywgaysrKSB7CisgICAgICAgIHQwLmtleXNbal0gPSB0MS5rZXlzW2tdOworICAgICAgICB0MC5idE5vZGVzW2pdID0gdDEuYnROb2Rlc1trXTsKKyAgICAgICAgdDAubnVta2V5cysrOworICAgIH0KKyAgICB0MC5udW1yZWNzICs9IHQxLm51bXJlY3M7CisgICAgdDAucm5vZGUgPSB0MS5ybm9kZTsKKyAgICB0MC5ybm9kZWlkID0gdDEucm5vZGVpZDsKKyAgICB0MC51cGR0ZCA9IFlFUzsKKyAgICBua2V5cyA9IHQwLm51bWtleXMgLSAxOworICAgIGtleXNbaV0gPSB0MC5rZXlzW25rZXlzXTsgLyogdXBkYXRlIGtleSB0byBwb2ludCB0byBuZXcgaGlnaCBrZXkgKi8KKyAgICBbc2VsZiByb3RhdGVsZWZ0OmkrMV07IC8qIGNvcHkgb3ZlciB0aGUga2V5cyBhbmQgbm9kZXMgKi8KKyAgICAKKyAgICB0MS5ub2RlVHlwZSA9IC0xOworICAgIGlmICh0MS5ybm9kZWlkICE9IDB4ZmZmZiAmJiBpIDwgbnVta2V5cyAtIDIpIHsKKyAgICAgICAgdHIgPSBidE5vZGVzW2krMV07CisgICAgICAgIHRyLmxub2RlaWQgPSB0MC5ub2RlaWQ7CisgICAgICAgIHRyLmxub2RlID0gdDA7CisgICAgICAgIHRyLnVwZHRkID0gWUVTOworICAgIH0KKyAgICBzZWxmLm51bWtleXMtLTsKKyAgICB1cGR0ZCA9IFlFUzsKK30KKworLSAoQUNCVHJlZSAqKXNwbGl0bm9kZTooTlNJbnRlZ2VyKWlkeAoreworICAgIEFDQlRyZWUgKnQxOworICAgIE5TSW50ZWdlciBqLCBrOworICAgIAorICAgIGsgPSAoaWR4IDw9IEJUSE5PREVTSVpFKSA/IEJUSE5PREVTSVpFIDogQlRITk9ERVNJWkUrMTsKKyAgICAvKioqIGNyZWF0ZSBuZXcgbm9kZSAqKiovCisgICAgLy8gY2hlY2tub2RlKGwsIHQsIGspOworICAgIHQxID0gW0FDQlRyZWUgbmV3Tm9kZVdpdGhEaWN0aW9uYXJ5OmRpY3RdOworICAgIHQxLm5vZGVUeXBlID0gbm9kZVR5cGU7CisgICAgdDEucm5vZGUgPSBzZWxmLnJub2RlOworICAgIHNlbGYucm5vZGUgPSB0MTsKKyAgICB0MS5sbm9kZSA9IHNlbGY7CisgICAgc2VsZi51cGR0ZCA9IHQxLnVwZHRkID0gWUVTOworICAgIC8qKiogbW92ZSBrZXlzIGFuZCBwb2ludGVycyAqKiovCisgICAgTlNJbnRlZ2VyIGkgPSAwOworICAgIGZvciAoaiA9IGs7IGogPCBCVE5PREVTSVpFOyBqKyssIGkrKyApIHsKKyAgICAgICAgdDEua2V5c1tpXSA9IGtleXNbal07CisgICAgICAgIHQxLmJ0Tm9kZXNbaV0gPSBidE5vZGVzW2pdOworICAgICAgICB0MS5udW1yZWNzICs9ICgobm9kZVR5cGUgPT0gTEVBRikgPyAxIDogYnROb2Rlc1tqXS5udW1yZWNzKTsKKyAgICAgICAgbnVtcmVjcyAgICAgLT0gKChub2RlVHlwZSA9PSBMRUFGKSA/IDEgOiBidE5vZGVzW2pdLm51bXJlY3MpOworICAgICAgICBrZXlzW2pdID0gbmlsOworICAgICAgICBidE5vZGVzW2pdID0gbmlsOworICAgIH0KKyAgICB0MS5udW1rZXlzICA9IEJUTk9ERVNJWkUtazsKKyAgICBzZWxmLm51bWtleXMgPSBrOworICAgIHJldHVybih0MSk7Cit9CisKKyNpZmRlZiBET05UVVNFTk9NTworZnJlZXRyZWUobCwgdCkKK0ZJREIgKmw7CitBQ0JUcmVlICp0OworeworICAgIEFDQlRyZWUgKnRtcDsKKyAgICBOU0ludGVnZXIgaTsKKyAgICAKKyAgICBpZiAoZGljdC5yb290ID09IG5pbCkgcmV0dXJuKFNVQ0NFU1MpOworICAgIGlmICh0Lm5vZGVpZCA9PSAxKSB7CisgICAgICAgIHNyY2hsdmwgPSAwOworICAgIH0KKyAgICBlbHNlIHNyY2hsdmwrKzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdC5udW1rZXlzOyBpKyspIHsKKyAgICAgICAgdG1wID0gdC5idE5vZGVzW2ldOworICAgICAgICBpZiAodG1wICE9IG5pbCkgeworICAgICAgICAgICAgaWYgKHRtcC5ub2RlVHlwZSA9PSBMRUFGKSB7CisgICAgICAgICAgICAgICAgZnJlZSh0bXApOyAgICAvKiBmcmVlIHRoZSBsZWFmICovCisgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBsLnJybm9kZSkgeworICAgICAgICAgICAgICAgICAgICBsLnJybm9kZSA9IG5pbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdC5idE5vZGVzW2ldID0gbmlsOworICAgICAgICAgICAgICAgIGwuY2hrbm9kZS5ub2RzX2ludXNlLS07CisgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIHB1dHBhZ2UobCwgbC5jaGtub2RlLCAwKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZyZWV0cmVlKGwsIHRtcCk7IC8qIGNvbnRpbnVlIHVwIHRoZSB0cmVlICovCisgICAgICAgICAgICAgICAgc3JjaGx2bC0tOyAgICAgICAgLyogZGVjcmVtZW50IHRoZSBzcmNobHZsIG9uIHJldHVybiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZyZWUodCk7IC8qIGZyZWUgdGhlIG5vZGUgZW50ZXJlZCB3aXRoICovCisgICAgaWYgKHQgPT0gbC5ycm5vZGUpIHsKKyAgICAgICAgbC5ycm5vZGUgPSBuaWw7CisgICAgfQorICAgIGwuY2hrbm9kZS5ub2RzX2ludXNlLS07CisgICAgLyogICAgIHB1dHBhZ2UobCwgbC5jaGtub2RlLCAwKTsKKyAgICAgKi8KKyAgICB0ID0gbmlsOworfQorCistICh2b2lkKSBub3Rmb3VuZDooQUNCS2V5ICopa3AKK3sKKyAgICAvKiBlcnJvciByb3V0aW5lIHRvIHBlcmZvcm0gaWYgZW50cnkgd2FzIGV4cGVjdGVkIGFuZCBub3QgZm91bmQgKi8KK30KKworLSAodm9pZClwcmludHRyZWU6KEFDQlRyZWUgKil0Cit7CisgICAgQllURSAqc3RyOworICAgIE5TSW50ZWdlciBpLCBqOworICAgIE5TVUludGVnZXIgKnBkYXRlLCAqcHRpbWU7CisgICAgCisgICAgc3lzbHN0ID0gc3RkcHJuOworICAgIGlmICggdC5ub2RlaWQgPT0gMSApIHsKKyAgICAgICAgc3JjaGx2bCA9IDA7CisgICAgfQorICAgIGVsc2Ugc3JjaGx2bCsrOworICAgIGZvciAoaiA9IDA7IGogPCB0Lm51bWtleXM7IGorKykgeworICAgICAgICBjaGVja25vZGUobCwgdCwgaik7CisgICAgICAgIGlmICggdC5idE5vZGVzW2pdICE9IG5pbCApIFtzZWxmIHByaW50dHJlZTp0LmJ0Tm9kZXNbal1dOworICAgIH0KKyAgICBOU0xvZyhAIk5vZGVpZCA9ICVkLCBub2RlVHlwZSA9ICVzLCBudW1rZXlzID0gJWQsIG51bXJlY3MgPSAlZFxuIiwKKyAgICAgICAgICB0Lm5vZGVpZCwgKHQubm9kZVR5cGUgPT0gQlROT0RFKT9AIk5PREUiOkAiTEVBRiIsIHQubnVta2V5cywgdC5udW1yZWNzKTsKKyAgICBOU0xvZyhAIkxlZnQgbm9kZWlkID0gJWQsIFJpZ2h0IG5vZGVpZCA9ICVkXG4iLCB0Lmxub2RlaWQsIHQucm5vZGVpZCk7CisgICAgZm9yIChpID0gMDsgaSA8IHQubnVta2V5czsgaSsrKSB7CisgICAgICAgIE5TTG9nKEAiICAgICB0LmtleXNbJWRdIHJlY251bSA9ICVkLCBrZXl2YWwgPSAlQCIsCisgICAgICAgICAgICAgIGksIHQua2V5c1tpXS5yZWNudW0sIHQua2V5c1tpXSk7CisgICAgICAgIHN0ciA9IHQua2V5c1tpXS5rc3RyOworICAgICAgICBwZGF0ZSA9IChOU1VJbnRlZ2VyICopIChzdHIgKyA2KTsKKyAgICAgICAgcHRpbWUgPSAoTlNVSW50ZWdlciAqKSAoc3RyICsgOCk7CisgICAgICAgIE5TTG9nKEAiIGRhdGUgPSAlMDQuNHgsICB0aW1lID0gJTA0LjR4XG4iLAorICAgICAgICAgICAgICAqcGRhdGUsICpwdGltZSk7CisgICAgfQorfQorCistIChCT09MKXB1dHRyZWU6KEFDQlRyZWUgKil0Cit7CisgICAgTlNJbnRlZ2VyIGk7CisgICAgaWYgKHQubm9kZVR5cGUgIT0gTEVBRikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdC5udW1rZXlzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICggdC5idE5vZGVzW2ldICE9IG5pbCApIHB1dHRyZWUobCwgdC5idE5vZGVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHQudXBkdGQgKSB7CisgICAgICAgIHB1dG5vZGUobCwgdCwgdC5ub2RlaWQpOworICAgICAgICByZXR1cm4oWUVTKTsKKyAgICB9CisgICAgcmV0dXJuKE5PKTsKK30KKworI2VuZGlmCisKKy8qKiBST1RBVEVMRUZUIC0tIHJvdGF0ZSBrZXlzIGZyb20gcmlnaHQgdG8gdGhlIGxlZnQKKyAqICBzdGFydGluZyBhdCBwb3NpdGlvbiBqCisgKi8KKy0gKHZvaWQpcm90YXRlbGVmdDooTlNJbnRlZ2VyKWoKK3sKKyAgICB3aGlsZSAoIGorMSA8IG51bWtleXMgKSB7CisgICAgICAgIGtleXNbal0gPSBrZXlzW2orMV07CisgICAgICAgIGJ0Tm9kZXNbal0gPSBidE5vZGVzW2orMV07CisgICAgICAgIGorKzsKKyAgICB9Cit9CisKKy8qKiBST1RBVEVSSUdIVCAtLSByb3RhdGUga2V5cyB0byB0aGUgcmlnaHQgYnkgMSBwb3NpdGlvbgorICogIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGtleSBkb3duIHRvIHBvc2l0aW9uIGouCisgKi8KKy0gKHZvaWQpcm90YXRlcmlnaHQ6KE5TSW50ZWdlcilqCit7CisgICAgTlNJbnRlZ2VyIGs7CisgICAgCisgICAgZm9yICggayA9IG51bWtleXM7IGsgPiBqOyBrLS0gKSB7CisgICAgICAgIGtleXNba10gPSBrZXlzW2stMV07CisgICAgICAgIGJ0Tm9kZXNba10gPSBidE5vZGVzW2stMV07CisgICAgfQorICAgIGtleXNbal0gPSBuaWw7CisgICAgYnROb2Rlc1tqXSA9IG5pbDsKK30KKworLSAoTlNJbnRlZ2VyKSBrZXlXYWxrTGVhdmVzCit7CisgICAgTlNJbnRlZ2VyIGksIGlkeCA9IDA7CisgICAgTlNJbnRlZ2VyIGtleWNudDsKKyAgICBBQ0JUcmVlICp0OworCisgICAgaWYgKCBzZWxmICE9IGRpY3Qucm9vdCApIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIG1heWJlIEkgbmVlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaGVyZQorICAgIH0KKyAgICB0ID0gc2VsZjsKKyAgICBzZWxmLmRpY3QuZGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDoobnVta2V5cyAqIHNpemVvZihpZCkpXSByZXRhaW5dOworICAgIHNlbGYuZGljdC5wdHJCdWZmZXIgPSBbc2VsZi5kaWN0LmRhdGEgbXV0YWJsZUJ5dGVzXTsKKyAgICB3aGlsZSAoIHQgIT0gbmlsICYmIHQubm9kZVR5cGUgIT0gTEVBRiApIHsKKyAgICAgICAgdCA9IHQuYnROb2Rlc1swXTsKKyAgICB9CisgICAgZG8geworICAgICAgICBrZXljbnQgPSB0Lm51bWtleXM7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwga2V5Y250OyBpKysgKSB7CisgICAgICAgICAgICBpZiAoIHQuYnROb2Rlc1tpXSAhPSBuaWwgKSB7CisgICAgICAgICAgICAgICAgZGljdC5wdHJCdWZmZXJbaWR4KytdID0gKGlkKSB0LmtleXNbaV0ua2V5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHQgPSB0LnJub2RlOworICAgIH0gd2hpbGUgKCB0ICE9IG5pbCApOworICAgIHJldHVybiggaWR4ICk7Cit9CisKKy0gKE5TSW50ZWdlcikgb2JqZWN0V2Fsa0xlYXZlcworeworICAgIE5TSW50ZWdlciBpLCBpZHggPSAwOworICAgIE5TSW50ZWdlciBrZXljbnQ7CisgICAgQUNCVHJlZSAqdDsKKyAgICAKKyAgICBpZiAoIHNlbGYgIT0gZGljdC5yb290ICkgeworICAgICAgICByZXR1cm4gMDsgLy8gbWF5YmUgSSBuZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlCisgICAgfQorICAgIHQgPSBzZWxmOworICAgIHNlbGYuZGljdC5kYXRhID0gW1tOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOihudW1yZWNzICogc2l6ZW9mKGlkKSldIHJldGFpbl07CisgICAgc2VsZi5kaWN0LnB0ckJ1ZmZlciA9IFtzZWxmLmRpY3QuZGF0YSBtdXRhYmxlQnl0ZXNdOworICAgIHdoaWxlICggdCAhPSBuaWwgJiYgdC5ub2RlVHlwZSAhPSBMRUFGICkgeworICAgICAgICB0ID0gdC5idE5vZGVzWzBdOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGtleWNudCA9IHQubnVta2V5czsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBrZXljbnQ7IGkrKyApIHsKKyAgICAgICAgICAgIGlmICggdC5idE5vZGVzW2ldICE9IG5pbCApIHsKKyAgICAgICAgICAgICAgICBkaWN0LnB0ckJ1ZmZlcltpZHgrK10gPSAoaWQpIHQuYnROb2Rlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0ID0gdC5ybm9kZTsKKyAgICB9IHdoaWxlICggdCAhPSBuaWwgKTsKKyAgICByZXR1cm4oIGlkeCApOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQUNCVHJlZSIgKTsKKyNlbmRpZgorICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU11dGFibGVBcnJheS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU11dGFibGVBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDA3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTXV0YWJsZUFycmF5LmgKQEAgLTAsMCArMSw1MCBAQAorLy8KKy8vICBBTXV0YWJsZUFycmF5LmgKKy8vICBhX1NUNAorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDMvMTIvMTEuCisvLyAgQ29weXJpZ2h0IDIwMTEgQWxhbidzIE1hY2hpbmVXb3Jrcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBcnJheUl0ZXJhdG9yLmgiCisKK0BjbGFzcyBBcnJheUl0ZXJhdG9yOworCitAaW50ZXJmYWNlIEFNdXRhYmxlQXJyYXkgOiBOU011dGFibGVBcnJheSB7CisgICAgTlNJbnRlZ2VyIEJ1ZmZTaXplOworICAgIE5TSW50ZWdlciBjb3VudDsKKyAgICBfX3N0cm9uZyBOU011dGFibGVEYXRhICpidWZmZXI7CisgICAgX19zdHJvbmcgaWQgKnB0ckJ1ZmZlcjsKK30KKworKyAoaWQpIG5ld0FycmF5OworKyAoaWQpIGFycmF5V2l0aENhcGFjaXR5OihOU0ludGVnZXIpc2l6ZTsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhDYXBhY2l0eTooTlNJbnRlZ2VyKXNpemU7CistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAodm9pZCkgYWRkT2JqZWN0OihpZClhbk9iamVjdDsKKy0gKHZvaWQpIGFkZE9iamVjdHNGcm9tQXJyYXk6KE5TQXJyYXkgKilhbkFycmF5OworLSAoaWQpIG9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilhbklkeDsKKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYW5PYmplY3QgYXRJbmRleDooTlNJbnRlZ2VyKWFuSWR4OworLSAodm9pZCkgcmVtb3ZlQWxsT2JqZWN0czsKKy0gKHZvaWQpIHJlbW92ZUxhc3RPYmplY3Q7CistICh2b2lkKSByZW1vdmVPYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAodm9pZCkgcmVwbGFjZU9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHggd2l0aE9iamVjdDooaWQpb2JqOworLSAoTlNJbnRlZ2VyKSBjb3VudDsKKy0gKHZvaWQpc2V0Q291bnQ6KE5TSW50ZWdlciljbnQ7CisvLy0gKE5TVUludGVnZXIpY291bnRCeUVudW1lcmF0aW5nV2l0aFN0YXRlOihOU0Zhc3RFbnVtZXJhdGlvblN0YXRlICopc3RhdGUgb2JqZWN0czooaWQgKilzdGFja2J1ZiBjb3VudDooTlNVSW50ZWdlcilsZW47CistIChOU0FycmF5ICopIGFsbE9iamVjdHM7CistIChBcnJheUl0ZXJhdG9yICopIG9iamVjdEVudW1lcmF0b3I7CistICh2b2lkKSBlbnN1cmVDYXBhY2l0eTooTlNJbnRlZ2VyKSBpbmRleDsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgQnVmZlNpemU7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWNvdW50LCBzZXR0ZXI9c2V0Q291bnQ6KSBOU0ludGVnZXIgY291bnQ7CitAcHJvcGVydHkgKHJldGFpbikgTlNNdXRhYmxlRGF0YSAqYnVmZmVyOworQHByb3BlcnR5IChhc3NpZ24pIGlkICpwdHJCdWZmZXI7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FNdXRhYmxlQXJyYXkubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FNdXRhYmxlQXJyYXkubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQxZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU11dGFibGVBcnJheS5tCkBAIC0wLDAgKzEsMjk2IEBACisvLworLy8gIEFNdXRhYmxlQXJyYXkubQorLy8gIGFfU1Q0CisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gMy8xMi8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuJ3MgTWFjaGluZVdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKyNpbXBvcnQgIkFNdXRhYmxlQXJyYXkuaCIKKyNpbXBvcnQgIkFycmF5SXRlcmF0b3IuaCIKKworI2RlZmluZSBCVUZGU0laRSAyNQorCitAaW1wbGVtZW50YXRpb24gQU11dGFibGVBcnJheQorCitAc3ludGhlc2l6ZSBCdWZmU2l6ZTsKK0BzeW50aGVzaXplIGJ1ZmZlcjsKK0BzeW50aGVzaXplIHB0ckJ1ZmZlcjsKKy8vQHN5bnRoZXNpemUgY291bnQ7CisKKworKyAoaWQpIG5ld0FycmF5Cit7CisgICAgcmV0dXJuIFtbQU11dGFibGVBcnJheSBhbGxvY10gaW5pdF07Cit9CisKKysgKGlkKSBhcnJheVdpdGhDYXBhY2l0eTooTlNJbnRlZ2VyKXNpemUKK3sKKyAgICByZXR1cm4gW1tBTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OnNpemVdOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGY9W3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIEJ1ZmZTaXplID0gQlVGRlNJWkU7CisgICAgICAgIGJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDooQnVmZlNpemUgKiBzaXplb2YoaWQpKV0gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyID0gKGlkICopW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgICAgICBmb3IoIGludCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICBwdHJCdWZmZXJbaWR4XSA9IG5pbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoQ2FwYWNpdHk6KE5TSW50ZWdlcilsZW4KK3sKKyAgICBzZWxmPVtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBCdWZmU2l6ZSA9IChsZW4gPj0gQlVGRlNJWkUpID8gbGVuIDogQlVGRlNJWkU7CisgICAgICAgIGJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDooQnVmZlNpemUgKiBzaXplb2YoaWQpKV0gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyID0gKGlkICopW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgICAgICBmb3IoIGludCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICBwdHJCdWZmZXJbaWR4XSA9IG5pbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTXV0YWJsZUFycmF5IiApOworI2VuZGlmCisgICAgaWYgKCBjb3VudCApIFtzZWxmIHJlbW92ZUFsbE9iamVjdHNdOworICAgIGlmICggYnVmZmVyICkgW2J1ZmZlciByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU11dGFibGVBcnJheSAqY29weTsKKyAgICAKKyAgICBjb3B5ID0gW1tbc2VsZiBjbGFzc10gYWxsb2NXaXRoWm9uZTphWm9uZV0gaW5pdF07CisgICAgaWYgKCBidWZmZXIgKSB7CisgICAgICAgIGNvcHkuYnVmZmVyID0gW2J1ZmZlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIH0KKyAgICBjb3B5LnB0ckJ1ZmZlciA9IFtjb3B5LmJ1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgIGNvcHkuY291bnQgPSBjb3VudDsKKyAgICBjb3B5LkJ1ZmZTaXplID0gQnVmZlNpemU7CisgICAgcmV0dXJuIGNvcHk7Cit9CisKKy0gKHZvaWQpIGFkZE9iamVjdDooaWQpYW5PYmplY3QKK3sKKyAgICBpZiAoIGFuT2JqZWN0ID09IG5pbCApIGFuT2JqZWN0ID0gW05TTnVsbCBudWxsXTsKKyAgICBbYW5PYmplY3QgcmV0YWluXTsKKwlbc2VsZiBlbnN1cmVDYXBhY2l0eTpjb3VudF07CisJcHRyQnVmZmVyW2NvdW50KytdID0gYW5PYmplY3Q7Cit9CisKKy0gKHZvaWQpIGFkZE9iamVjdHNGcm9tQXJyYXk6KE5TQXJyYXkgKilvdGhlckFycmF5Cit7CisgICAgTlNJbnRlZ2VyIGNudCwgaTsKKyAgICBjbnQgPSBbb3RoZXJBcnJheSBjb3VudF07CisgICAgW3NlbGYgZW5zdXJlQ2FwYWNpdHk6Y291bnQrY250XTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgW3NlbGYgYWRkT2JqZWN0OltvdGhlckFycmF5IG9iamVjdEF0SW5kZXg6aV1dOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy0gKGlkKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpYW5JZHgKK3sKKyAgICBpZCBvYmo7CisgICAgaWYgKCBhbklkeCA8IDAgfHwgYW5JZHggPj0gY291bnQgKSB7CisgICAgICAgIEB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6TlNSYW5nZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiQXR0ZW1wdCB0byByZXRyaWV2ZSBvYmplY3RBdEluZGV4ICVkIHBhc3QgZW5kIiwgYW5JZHhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisgICAgcHRyQnVmZmVyID0gW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgIG9iaiA9IHB0ckJ1ZmZlclthbklkeF07CisgICAgaWYgKCBvYmogPT0gW05TTnVsbCBudWxsXSApIHsKKyAgICAgICAgb2JqID0gbmlsOworICAgIH0KKyAgICByZXR1cm4gb2JqOworfQorCistICh2b2lkKSBpbnNlcnRPYmplY3Q6KGlkKWFuT2JqZWN0IGF0SW5kZXg6KE5TSW50ZWdlcilhbklkeAoreworICAgIGlmICggYW5PYmplY3QgPT0gbmlsICkgYW5PYmplY3QgPSBbTlNOdWxsIG51bGxdOworICAgIGlmICggYW5PYmplY3QgPT0gbmlsICkgeworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIHJlYXNvbjpAIkF0dGVtcHQgdG8gaW5zZXJ0IG5pbCBvYmplY3RBdEluZGV4IiB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICBpZiAoIGFuSWR4IDwgMCB8fCBhbklkeCA+IGNvdW50ICkgeworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TUmFuZ2VFeGNlcHRpb24gcmVhc29uOkAiQXR0ZW1wdCB0byBpbnNlcnRPYmplY3RBdEluZGV4IHBhc3QgZW5kIiB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICBpZiAoIGNvdW50ID09IEJ1ZmZTaXplICkgeworICAgICAgICBbc2VsZiBlbnN1cmVDYXBhY2l0eTpjb3VudF07CisgICAgfQorICAgIGlmICggYW5JZHggPCBjb3VudCApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50OyBpID4gYW5JZHg7IGktLSkgeworICAgICAgICAgICAgcHRyQnVmZmVyW2ldID0gcHRyQnVmZmVyW2ktMV07CisgICAgICAgIH0KKyAgICB9CisgICAgcHRyQnVmZmVyW2FuSWR4XSA9IFthbk9iamVjdCByZXRhaW5dOworICAgIGNvdW50Kys7Cit9CisKKy0gKHZvaWQpIHJlbW92ZU9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHg7Cit7CisgICAgaWQgdG1wOworICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBjb3VudCkgeworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TUmFuZ2VFeGNlcHRpb24gcmVhc29uOkAiQXR0ZW1wdCB0byBpbnNlcnQgcmVtb3ZlT2JqZWN0QXRJbmRleCBwYXN0IGVuZCIgdXNlckluZm86bmlsXTsKKyAgICB9CisgICAgZWxzZSBpZiAoY291bnQpIHsKKyAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgIGlmICggdG1wICkgW3RtcCByZWxlYXNlXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGlkeDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHB0ckJ1ZmZlcltpXSA9IHB0ckJ1ZmZlcltpKzFdOworICAgICAgICB9CisgICAgICAgIGNvdW50LS07CisgICAgfQorfQorCistICh2b2lkKSByZW1vdmVMYXN0T2JqZWN0Cit7CisgICAgaWQgdG1wOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIEB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6TlNSYW5nZUV4Y2VwdGlvbiByZWFzb246QCJBdHRlbXB0IHRvIHJlbW92ZUxhc3RPYmplY3QgZnJvbSAwIiB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICBjb3VudC0tOworICAgIHRtcCA9IHB0ckJ1ZmZlcltjb3VudF07CisgICAgaWYgKCB0bXAgKSBbdG1wIHJlbGVhc2VdOworICAgIHB0ckJ1ZmZlcltjb3VudF0gPSBuaWw7Cit9CisKKy0gKHZvaWQpcmVtb3ZlQWxsT2JqZWN0cworeworICAgIGlkIHRtcDsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TUmFuZ2VFeGNlcHRpb24gcmVhc29uOkAiQXR0ZW1wdCB0byByZW1vdmVBbGxPYmplY3RzIGZyb20gMCIgdXNlckluZm86bmlsXTsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoaSA8IGNvdW50KSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaV07CisgICAgICAgICAgICBpZiAoIHRtcCApIFt0bXAgcmVsZWFzZV07CisgICAgICAgIH0KKyAgICAgICAgcHRyQnVmZmVyW2ldID0gbmlsOworICAgIH0KKyAgICBjb3VudCA9IDA7Cit9CisKKy0gKHZvaWQpIHJlcGxhY2VPYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4IHdpdGhPYmplY3Q6KGlkKW9iagoreworICAgIGlkIHRtcDsKKyAgICBpZiAoIG9iaiA9PSBuaWwgKSB7CisgICAgICAgIG9iaiA9IFtOU051bGwgbnVsbF07CisgICAgfQorICAgIGlmICggaWR4IDwgMCB8fCBpZHggPj0gY291bnQgKSB7CisgICAgICAgIEB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6TlNSYW5nZUV4Y2VwdGlvbiByZWFzb246QCJBdHRlbXB0IHRvIHJlcGxhY2Ugb2JqZWN0IHBhc3QgZW5kIiB1c2VySW5mbzpuaWxdOworICAgfQorICAgIGlmICggY291bnQgKSB7CisgICAgICAgIFtvYmogcmV0YWluXTsKKyAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgIGlmICggdG1wICkgW3RtcCByZWxlYXNlXTsKKyAgICAgICAgcHRyQnVmZmVyW2lkeF0gPSBvYmo7CisgICAgfQorfQorCistIChOU0ludGVnZXIpIGNvdW50Cit7CisgICAgcmV0dXJuIGNvdW50OworfQorCistICh2b2lkKSBzZXRDb3VudDooTlNJbnRlZ2VyKWNudAoreworICAgIGNvdW50ID0gY250OworfQorCistIChOU0FycmF5ICopIGFsbE9iamVjdHMKK3sKKyAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0czpwdHJCdWZmZXIgY291bnQ6Y291bnRdOworfQorCistIChBcnJheUl0ZXJhdG9yICopIG9iamVjdEVudW1lcmF0b3IKK3sKKyAgICByZXR1cm4gW0FycmF5SXRlcmF0b3IgbmV3SXRlcmF0b3I6W3NlbGYgYWxsT2JqZWN0c11dOworfQorCisvLyBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgbWFnaWMgaGFwcGVucy4KKy8vIFlvdSBoYXZlIHR3byBjaG9pY2VzIHdoZW4gaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kOgorLy8gMSkgVXNlIHRoZSBzdGFjayBiYXNlZCBhcnJheSBwcm92aWRlZCBieSBzdGFja2J1Zi4gSWYgeW91IGRvIHRoaXMsIHRoZW4geW91IG11c3QgcmVzcGVjdCB0aGUgdmFsdWUgb2YgJ2xlbicuCisvLyAyKSBSZXR1cm4geW91ciBvd24gYXJyYXkgb2Ygb2JqZWN0cy4gSWYgeW91IGRvIHRoaXMsIHJldHVybiB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIGFycmF5IHJldHVybmVkIHVudGlsIHlvdSBydW4gb3V0IG9mIG9iamVjdHMsIHRoZW4gcmV0dXJuIDAuIEZvciBleGFtcGxlLCBhIGxpbmtlZC1hcnJheSBpbXBsZW1lbnRhdGlvbiBtYXkgcmV0dXJuIGVhY2ggYXJyYXkgaW4gb3JkZXIgdW50aWwgeW91IGl0ZXJhdGUgdGhyb3VnaCBhbGwgYXJyYXlzLgorLy8gSW4gZWl0aGVyIGNhc2UsIHN0YXRlLT5pdGVtc1B0ciBNVVNUIGJlIGEgdmFsaWQgYXJyYXkgKG5vbi1uaWwpLiBUaGlzIHNhbXBsZSB0YWtlcyBhcHByb2FjaCAjMSwgdXNpbmcgc3RhY2tidWYgdG8gc3RvcmUgcmVzdWx0cy4KKy0gKE5TVUludGVnZXIpY291bnRCeUVudW1lcmF0aW5nV2l0aFN0YXRlOihOU0Zhc3RFbnVtZXJhdGlvblN0YXRlICopc3RhdGUgb2JqZWN0czooaWQgKilzdGFja2J1ZiBjb3VudDooTlNVSW50ZWdlcilsZW4KK3sKKyAgICBOU1VJbnRlZ2VyIGNudCA9IDA7CisgICAgLy8gVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gY29uZGl0aW9uLCBzbyB3ZSdsbCBkbyBvbmUtdGltZSBzZXR1cCBoZXJlLgorICAgIC8vIEVuc3VyZSB0aGF0IHlvdSBuZXZlciBzZXQgc3RhdGUtPnN0YXRlIGJhY2sgdG8gMCwgb3IgdXNlIGFub3RoZXIgbWV0aG9kIHRvIGRldGVjdCBpbml0aWFsaXphdGlvbgorICAgIC8vIChzdWNoIGFzIHVzaW5nIG9uZSBvZiB0aGUgdmFsdWVzIG9mIHN0YXRlLT5leHRyYSkuCisgICAgaWYgKHN0YXRlLT5zdGF0ZSA9PSAwKSB7CisgICAgICAgIC8vIFdlIGFyZSBub3QgdHJhY2tpbmcgbXV0YXRpb25zLCBzbyB3ZSdsbCBzZXQgc3RhdGUtPm11dGF0aW9uc1B0ciB0byBwb2ludCBpbnRvIG9uZSBvZiBvdXIgZXh0cmEgdmFsdWVzLAorICAgICAgICAvLyBzaW5jZSB0aGVzZSB2YWx1ZXMgYXJlIG5vdCBvdGhlcndpc2UgdXNlZCBieSB0aGUgcHJvdG9jb2wuCisgICAgICAgIC8vIElmIHlvdXIgY2xhc3Mgd2FzIG11dGFibGUsIHlvdSBtYXkgY2hvb3NlIHRvIHVzZSBhbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgY2xhc3MgaXMgbXV0YXRlZC4KKyAgICAgICAgLy8gc3RhdGUtPm11dGF0aW9uc1B0ciBNVVNUIE5PVCBiZSBOVUxMLgorICAgICAgICBzdGF0ZS0+bXV0YXRpb25zUHRyID0gJnN0YXRlLT5leHRyYVswXTsKKyAgICB9CisgICAgLy8gTm93IHdlIHByb3ZpZGUgaXRlbXMsIHdoaWNoIHdlIHRyYWNrIHdpdGggc3RhdGUtPnN0YXRlLCBhbmQgZGV0ZXJtaW5lIGlmIHdlIGhhdmUgZmluaXNoZWQgaXRlcmF0aW5nLgorICAgIGlmIChzdGF0ZS0+c3RhdGUgPCBzZWxmLmNvdW50KSB7CisgICAgICAgIC8vIFNldCBzdGF0ZS0+aXRlbXNQdHIgdG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KKyAgICAgICAgLy8gQWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBtYXkgc2V0IHN0YXRlLT5pdGVtc1B0ciB0byBhbiBpbnRlcm5hbCBDIGFycmF5IG9mIG9iamVjdHMuCisgICAgICAgIC8vIHN0YXRlLT5pdGVtc1B0ciBNVVNUIE5PVCBiZSBOVUxMLgorICAgICAgICBzdGF0ZS0+aXRlbXNQdHIgPSBzdGFja2J1ZjsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgc3RhY2sgYXJyYXksIGVpdGhlciB1bnRpbCB3ZSd2ZSBwcm92aWRlZCBhbGwgaXRlbXMgZnJvbSB0aGUgbGlzdAorICAgICAgICAvLyBvciB1bnRpbCB3ZSd2ZSBwcm92aWRlZCBhcyBtYW55IGl0ZW1zIGFzIHRoZSBzdGFjayBiYXNlZCBidWZmZXIgd2lsbCBob2xkLgorICAgICAgICB3aGlsZSgoc3RhdGUtPnN0YXRlIDwgc2VsZi5jb3VudCkgJiYgKGNudCA8IGxlbikpIHsKKyAgICAgICAgICAgIC8vIEZvciB0aGlzIHNhbXBsZSwgd2UgZ2VuZXJhdGUgdGhlIGNvbnRlbnRzIG9uIHRoZSBmbHkuCisgICAgICAgICAgICAvLyBBIHJlYWwgaW1wbGVtZW50YXRpb24gd291bGQgbGlrZWx5IGp1c3QgYmUgY29weWluZyBvYmplY3RzIGZyb20gaW50ZXJuYWwgc3RvcmFnZS4KKyAgICAgICAgICAgIHN0YWNrYnVmW2NudCsrXSA9IHB0ckJ1ZmZlcltzdGF0ZS0+c3RhdGUrK107CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RhdGUtPnN0YXRlID0gKChjbnQgPCBsZW4pPyBjbnQgOiBsZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHByb3ZpZGVkIGFsbCBvdXIgaXRlbXMsIHNvIHdlIHNpZ25hbCB3ZSBhcmUgZG9uZSBieSByZXR1cm5pbmcgMC4KKyAgICAgICAgY250ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGNudDsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKyAgICBOU011dGFibGVTdHJpbmcgKnN0cjsKKyAgICBOU0ludGVnZXIgaWR4LCBjbnQ7CisgICAgY250ID0gW3NlbGYgY291bnRdOworICAgIHN0ciA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjMwXTsKKyAgICBbc3RyIGFwcGVuZFN0cmluZzpAIlsiXTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNudDsgaWR4KysgKSB7CisgICAgICAgIFtzdHIgYXBwZW5kU3RyaW5nOltbc2VsZiBvYmplY3RBdEluZGV4OmlkeF0gdG9TdHJpbmddXTsKKyAgICB9CisgICAgW3N0ciBhcHBlbmRTdHJpbmc6QCJdIl07CisgICAgcmV0dXJuIHN0cjsKK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmcKK3sKKyAgICByZXR1cm4gW3NlbGYgZGVzY3JpcHRpb25dOworfQorCistICh2b2lkKSBlbnN1cmVDYXBhY2l0eTooTlNJbnRlZ2VyKSBpbmRleAoreworCWlmICgoaW5kZXggKiBzaXplb2YoaWQpKSA+PSBbYnVmZmVyIGxlbmd0aF0pCisJeworCQlOU0ludGVnZXIgbmV3U2l6ZSA9IChbYnVmZmVyIGxlbmd0aF0gLyBzaXplb2YoaWQpKSAqIDI7CisJCWlmIChpbmRleCA+IG5ld1NpemUpIHsKKwkJCW5ld1NpemUgPSBpbmRleCArIDE7CisJCX0KKyAgICAgICAgQnVmZlNpemUgPSBuZXdTaXplOworCQlbYnVmZmVyIHNldExlbmd0aDooQnVmZlNpemUgKiBzaXplb2YoaWQpKV07CisgICAgICAgIHB0ckJ1ZmZlciA9IFtidWZmZXIgbXV0YWJsZUJ5dGVzXTsKKwl9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FNdXRhYmxlRGljdGlvbmFyeS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU11dGFibGVEaWN0aW9uYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3MjA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FNdXRhYmxlRGljdGlvbmFyeS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU11dGFibGVEaWN0aW9uYXJ5LmgKKy8vICBTVDQKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA0LzE4LzExLgorLy8gIENvcHlyaWdodCAyMDExIEFsYW4gQ29uZGl0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJBQ0JUcmVlLmgiCisjaW1wb3J0ICJBcnJheUl0ZXJhdG9yLmgiCisKK0BjbGFzcyBBQ0JUcmVlOworQGNsYXNzIEFycmF5SXRlcmF0b3I7CisKK0BpbnRlcmZhY2UgQU11dGFibGVEaWN0aW9uYXJ5IDogTlNNdXRhYmxlRGljdGlvbmFyeSB7CisKKyAgICBfX3N0cm9uZyBBQ0JUcmVlICAqcm9vdDsKKyAgICBOU0ludGVnZXIgbm9kZXNfYXY7CisgICAgTlNJbnRlZ2VyIG5vZGVzX2ludXNlOworICAgIE5TSW50ZWdlciBueHRfbm9kZWlkOworICAgIE5TVUludGVnZXIgY291bnQ7CisgICAgX19zdHJvbmcgTlNNdXRhYmxlRGF0YSAqZGF0YTsKKyAgICBfX3N0cm9uZyBpZCAgICAgICAqcHRyQnVmZmVyOworfQorCitAcHJvcGVydHkgKHJldGFpbikgQUNCVHJlZSAgKnJvb3Q7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIG5vZGVzX2F2OworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBub2Rlc19pbnVzZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgbnh0X25vZGVpZDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCByZWFkb25seSwgZ2V0dGVyPWNvdW50KSBOU1VJbnRlZ2VyIGNvdW50OworQHByb3BlcnR5IChhc3NpZ24pIE5TTXV0YWJsZURhdGEgKmRhdGE7CitAcHJvcGVydHkgKGFzc2lnbikgaWQgICAgICAgKnB0ckJ1ZmZlcjsKKworKyAoQU11dGFibGVEaWN0aW9uYXJ5ICopIG5ld0RpY3Rpb25hcnk7CisrIChBTXV0YWJsZURpY3Rpb25hcnkgKikgZGljdGlvbmFyeVdpdGhDYXBhY2l0eTsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy0gKEJPT0wpIGlzRXF1YWw6KGlkKW9iamVjdDsKKy0gKGlkKSBvYmplY3RGb3JLZXk6KGlkKWFLZXk7CistICh2b2lkKSBzZXRPYmplY3Q6KGlkKW9iaiBmb3JLZXk6KGlkKWFLZXk7CistICh2b2lkKSByZW1vdmVPYmplY3RGb3JLZXk6KGlkKWFLZXk7CisKKy0gKE5TVUludGVnZXIpIGNvdW50OworCistIChOU0FycmF5ICopIGFsbEtleXM7CistIChOU0FycmF5ICopIGFsbFZhbHVlczsKKy0gKEFycmF5SXRlcmF0b3IgKikga2V5RW51bWVyYXRvcjsKKy0gKEFycmF5SXRlcmF0b3IgKikgb2JqZWN0RW51bWVyYXRvcjsKKworLSAodm9pZCkgY2xlYXI7CistICh2b2lkKSByZW1vdmVBbGxPYmplY3RzOworLSAoTlNJbnRlZ2VyKSBuZXh0Tm9kZUlkOworLSAoTlNBcnJheSAqKSB0b0tleUFycmF5OworLSAoTlNBcnJheSAqKSB0b1ZhbHVlQXJyYXk7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FNdXRhYmxlRGljdGlvbmFyeS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU11dGFibGVEaWN0aW9uYXJ5Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiODVhOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FNdXRhYmxlRGljdGlvbmFyeS5tCkBAIC0wLDAgKzEsMjY0IEBACisvLworLy8gIEFNdXRhYmxlRGljdGlvbmFyeS5tCisvLyAgU1Q0CisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNC8xOC8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuIENvbmRpdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTXV0YWJsZURpY3Rpb25hcnkuaCIKKyNpbXBvcnQgIkFDQlRyZWUuaCIKKworQGltcGxlbWVudGF0aW9uIEFNdXRhYmxlRGljdGlvbmFyeQorCitAc3ludGhlc2l6ZSByb290OworQHN5bnRoZXNpemUgbm9kZXNfYXY7CitAc3ludGhlc2l6ZSBub2Rlc19pbnVzZTsKK0BzeW50aGVzaXplIG54dF9ub2RlaWQ7CisvL0BzeW50aGVzaXplIGNvdW50OworQHN5bnRoZXNpemUgZGF0YTsKK0BzeW50aGVzaXplIHB0ckJ1ZmZlcjsKKworKyAoQU11dGFibGVEaWN0aW9uYXJ5ICopIG5ld0RpY3Rpb25hcnkKK3sKKyAgICByZXR1cm4gW1tBTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOworfQorCisvKiogZGljdGlvbmFyeVdpdGhDYXBhY2l0eQorICogIGNhcGFjaXR5IGlzIG1lYW5pbmdsZXNzIHRvIEFDQlRyZWUgYmVjYXVzZQorICogIGNhcGFjaXR5IGlzIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2VkCisgKi8KKysgKEFNdXRhYmxlRGljdGlvbmFyeSAqKSBkaWN0aW9uYXJ5V2l0aENhcGFjaXR5Cit7CisgICAgcmV0dXJuIFtbQU11dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKK30KKworLSAoaWQpaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24gY29kZSBoZXJlLgorICAgICAgICBueHRfbm9kZWlkID0gMDsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICByb290ID0gW0FDQlRyZWUgbmV3Tm9kZVdpdGhEaWN0aW9uYXJ5OnNlbGZdOworICAgICAgICByb290Lm5vZGVUeXBlID0gTEVBRjsKKyAgICAgICAgcm9vdC5udW1yZWNzID0gMDsKKyAgICAgICAgcm9vdC51cGR0ZCA9IE5POworICAgICAgICByb290Lmxub2RlaWQgPSAxOworICAgICAgICByb290Lmxub2RlID0gbmlsOworICAgICAgICByb290LnJub2RlaWQgPSAweGZmZmY7CisgICAgICAgIHJvb3Qucm5vZGUgPSBuaWw7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCisvKiogaW5pdFdpdGhDYXBhY2l0eQorICogIGNhcGFjaXR5IGlzIG1lYW5pbmdsZXNzIHRvIEFDQlRyZWUgYmVjYXVzZQorICogIGNhcGFjaXR5IGlzIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2VkCisgKi8KKy0gKGlkKSBpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoc2VsZikgeworICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBjb2RlIGhlcmUuCisgICAgICAgIG54dF9ub2RlaWQgPSAwOworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHJvb3QgPSBbQUNCVHJlZSBuZXdOb2RlV2l0aERpY3Rpb25hcnk6c2VsZl07CisgICAgICAgIHJvb3Qubm9kZVR5cGUgPSBMRUFGOworICAgICAgICByb290Lm51bXJlY3MgPSAwOworICAgICAgICByb290LnVwZHRkID0gTk87CisgICAgICAgIHJvb3QubG5vZGVpZCA9IDE7CisgICAgICAgIHJvb3QubG5vZGUgPSBuaWw7CisgICAgICAgIHJvb3Qucm5vZGVpZCA9IDB4ZmZmZjsKKyAgICAgICAgcm9vdC5ybm9kZSA9IG5pbDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU11dGFibGVEaWN0aW9uYXJ5IiApOworI2VuZGlmCisgICAgaWYgKCBkYXRhICkgW2RhdGEgcmVsZWFzZV07CisgICAgaWYgKCByb290ICkgW3Jvb3QgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZCkgb2JqZWN0Rm9yS2V5OihpZClhS2V5Cit7CisgICAgaWQgb2JqID0gbmlsOworICAgIEFDQlRyZWUgKm5vZGU7CisgICAgQUNCS2V5ICprcDsKKyAgICBOU0ludGVnZXIgcmV0OworICAgIEJPT0wgbXVzdFJlbGVhc2UgPSBOTzsKKworICAgIGlmICggW2FLZXkgaXNLaW5kT2ZDbGFzczpbTlNTdHJpbmcgY2xhc3NdXSApIHsKKyAgICAgICAga3AgPSBbQUNCS2V5IG5ld0tleVdpdGhLU3RyOmFLZXldOworICAgICAgICBtdXN0UmVsZWFzZSA9IFlFUzsKKyAgICB9CisgICAgZWxzZSBpZiAoIFthS2V5IGlzS2luZE9mQ2xhc3M6W0FDQktleSBjbGFzc11dICkgeworICAgICAgICBrcCA9IGFLZXk7CisgICAgICAgIC8vQUNCS2V5ICpha2V5ID0gW0FDQktleSBuZXdLZXk6YUtleV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJXaGF0IGtpbmQgb2Yga2V5IGlzIHRoaXM/ICVAIiwgYUtleV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgICAgICByZXR1cm4gbmlsOyAvLyBub3QgYSBrZXkgdGhhdCBJIGtub3cgaG93IHRvIGRlYWwgd2l0aAorICAgIH0KKyAgICBub2RlID0gW3Jvb3Qgc2VhcmNoOmtwLmtleV07CisgICAgaWYgKCBub2RlICE9IG5pbCApIHsKKyAgICAgICAgcmV0ID0gW25vZGUgc2VhcmNobm9kZTprcC5rZXkgbWF0Y2g6WUVTXTsKKyAgICAgICAgaWYgKCByZXQgPj0gMCAmJiByZXQgPCBub2RlLm51bWtleXMgKSB7CisgICAgICAgICAgICBvYmogPSBub2RlLmJ0Tm9kZXNbcmV0XTsKKyAgICAgICAgICAgIGlmICggb2JqID09IFtOU051bGwgbnVsbF0gKSB7CisgICAgICAgICAgICAgICAgb2JqID0gbmlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggbXVzdFJlbGVhc2UgKSBba3AgcmVsZWFzZV07CisgICAgcmV0dXJuIG9iajsKK30KKworLSAodm9pZCkgc2V0T2JqZWN0OihpZClvYmogZm9yS2V5OihpZClhS2V5Cit7CisgICAgQUNCS2V5ICprcDsKKyAgICBCT09MIG11c3RSZWxlYXNlID0gTk87CisgICAgaWYgKCBbYUtleSBpc0tpbmRPZkNsYXNzOltOU1N0cmluZyBjbGFzc11dICkgeworICAgICAgICBrcCA9IFtBQ0JLZXkgbmV3S2V5V2l0aEtTdHI6YUtleV07CisgICAgICAgIG11c3RSZWxlYXNlID0gWUVTOworICAgIH0KKyAgICBlbHNlIGlmICggW2FLZXkgaXNLaW5kT2ZDbGFzczpbQUNCS2V5IGNsYXNzXV0gKSB7CisgICAgICAgIGtwID0gKEFDQktleSAqKWFLZXk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJXaGF0IGtpbmQgb2Yga2V5IGlzIHRoaXM/ICVAIiwgYUtleV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICBpZiAoIFtyb290IHNlYXJjaDprcC5rZXldID09IG5pbCApIHsKKyAgICAgICAgaWYgKCBvYmogPT0gbmlsICkgeworICAgICAgICAgICAgb2JqID0gW05TTnVsbCBudWxsXTsKKyAgICAgICAgfQorICAgICAgICByb290ID0gW3Jvb3QgaW5zZXJ0a2V5OmtwIHZhbHVlOm9ial07CisgICAgICAgIFtrcCByZXRhaW5dOworICAgICAgICBbb2JqIHJldGFpbl07CisgICAgICAgIGtwLnJlY251bSA9IGNvdW50Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIG11c3RSZWxlYXNlICkgW2twIHJlbGVhc2VdOworICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIHJlYXNvbjpAImtleSBhbHJlYWR5RXhpc3RzIiB1c2VySW5mbzpuaWxdOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy0gKEJPT0wpIGlzRXF1YWw6KGlkKW9iamVjdAoreworICAgIHJldHVybiBbc3VwZXIgaXNFcXVhbDpvYmplY3RdOworfQorCistICh2b2lkKSByZW1vdmVPYmplY3RGb3JLZXk6KGlkKWFLZXkKK3sKKyAgICBpZiAoIFtyb290IGRlbGV0ZWtleTphS2V5XSA9PSBTVUNDRVNTICkKKyAgICAgICAgY291bnQtLTsKK30KKworLSAoTlNVSW50ZWdlcikgY291bnQKK3sKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy0gKE5TQXJyYXkgKikgYWxsS2V5cworeworICAgIE5TVUludGVnZXIgY250ID0gW3Jvb3Qga2V5V2Fsa0xlYXZlc107CisgICAgcmV0dXJuIFtOU0FycmF5IGFycmF5V2l0aE9iamVjdHM6cHRyQnVmZmVyIGNvdW50OmNudF07Cit9CisKKy0gKE5TQXJyYXkgKikgYWxsVmFsdWVzCit7CisgICAgTlNVSW50ZWdlciBjbnQgPSBbcm9vdCBvYmplY3RXYWxrTGVhdmVzXTsKKyAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0czpwdHJCdWZmZXIgY291bnQ6Y250XTsKK30KKworLSAoQXJyYXlJdGVyYXRvciAqKSBrZXlFbnVtZXJhdG9yCit7CisgICAgcmV0dXJuIFtBcnJheUl0ZXJhdG9yIG5ld0l0ZXJhdG9yOltzZWxmIGFsbEtleXNdXTsKK30KKworLSAoQXJyYXlJdGVyYXRvciAqKSBvYmplY3RFbnVtZXJhdG9yCit7CisgICAgcmV0dXJuIFtBcnJheUl0ZXJhdG9yIG5ld0l0ZXJhdG9yOltzZWxmIGFsbFZhbHVlc11dOworfQorCisvLyBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgbWFnaWMgaGFwcGVucy4KKy8vIFlvdSBoYXZlIHR3byBjaG9pY2VzIHdoZW4gaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kOgorLy8gMSkgVXNlIHRoZSBzdGFjayBiYXNlZCBhcnJheSBwcm92aWRlZCBieSBzdGFja2J1Zi4gSWYgeW91IGRvIHRoaXMsIHRoZW4geW91IG11c3QgcmVzcGVjdCB0aGUgdmFsdWUgb2YgJ2xlbicuCisvLyAyKSBSZXR1cm4geW91ciBvd24gYXJyYXkgb2Ygb2JqZWN0cy4gSWYgeW91IGRvIHRoaXMsIHJldHVybiB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIGFycmF5IHJldHVybmVkIHVudGlsIHlvdSBydW4gb3V0IG9mIG9iamVjdHMsIHRoZW4gcmV0dXJuIDAuIEZvciBleGFtcGxlLCBhIGxpbmtlZC1hcnJheSBpbXBsZW1lbnRhdGlvbiBtYXkgcmV0dXJuIGVhY2ggYXJyYXkgaW4gb3JkZXIgdW50aWwgeW91IGl0ZXJhdGUgdGhyb3VnaCBhbGwgYXJyYXlzLgorLy8gSW4gZWl0aGVyIGNhc2UsIHN0YXRlLT5pdGVtc1B0ciBNVVNUIGJlIGEgdmFsaWQgYXJyYXkgKG5vbi1uaWwpLiBUaGlzIHNhbXBsZSB0YWtlcyBhcHByb2FjaCAjMSwgdXNpbmcgc3RhY2tidWYgdG8gc3RvcmUgcmVzdWx0cy4KKy0gKE5TVUludGVnZXIpY291bnRCeUVudW1lcmF0aW5nV2l0aFN0YXRlOihOU0Zhc3RFbnVtZXJhdGlvblN0YXRlICopc3RhdGUgb2JqZWN0czooaWQgKilzdGFja2J1ZiBjb3VudDooTlNVSW50ZWdlcilsZW4KK3sKKyAgICBOU1VJbnRlZ2VyIGNudCA9IDA7CisgICAgLy8gVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gY29uZGl0aW9uLCBzbyB3ZSdsbCBkbyBvbmUtdGltZSBzZXR1cCBoZXJlLgorICAgIC8vIEVuc3VyZSB0aGF0IHlvdSBuZXZlciBzZXQgc3RhdGUtPnN0YXRlIGJhY2sgdG8gMCwgb3IgdXNlIGFub3RoZXIgbWV0aG9kIHRvIGRldGVjdCBpbml0aWFsaXphdGlvbgorICAgIC8vIChzdWNoIGFzIHVzaW5nIG9uZSBvZiB0aGUgdmFsdWVzIG9mIHN0YXRlLT5leHRyYSkuCisgICAgaWYgKHN0YXRlLT5zdGF0ZSA9PSAwKSB7CisgICAgICAgIC8vIFdlIGFyZSBub3QgdHJhY2tpbmcgbXV0YXRpb25zLCBzbyB3ZSdsbCBzZXQgc3RhdGUtPm11dGF0aW9uc1B0ciB0byBwb2ludCBpbnRvIG9uZSBvZiBvdXIgZXh0cmEgdmFsdWVzLAorICAgICAgICAvLyBzaW5jZSB0aGVzZSB2YWx1ZXMgYXJlIG5vdCBvdGhlcndpc2UgdXNlZCBieSB0aGUgcHJvdG9jb2wuCisgICAgICAgIC8vIElmIHlvdXIgY2xhc3Mgd2FzIG11dGFibGUsIHlvdSBtYXkgY2hvb3NlIHRvIHVzZSBhbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IGlzIHVwZGF0ZWQgd2hlbiB0aGUgY2xhc3MgaXMgbXV0YXRlZC4KKyAgICAgICAgLy8gc3RhdGUtPm11dGF0aW9uc1B0ciBNVVNUIE5PVCBiZSBOVUxMLgorICAgICAgICBzdGF0ZS0+bXV0YXRpb25zUHRyID0gJnN0YXRlLT5leHRyYVswXTsKKyAgICAgICAgW3NlbGYucm9vdCBvYmplY3RXYWxrTGVhdmVzXTsKKyAgICB9CisgICAgLy8gTm93IHdlIHByb3ZpZGUgaXRlbXMsIHdoaWNoIHdlIHRyYWNrIHdpdGggc3RhdGUtPnN0YXRlLCBhbmQgZGV0ZXJtaW5lIGlmIHdlIGhhdmUgZmluaXNoZWQgaXRlcmF0aW5nLgorICAgIGlmIChzdGF0ZS0+c3RhdGUgPCBzZWxmLmNvdW50KSB7CisgICAgICAgIC8vIFNldCBzdGF0ZS0+aXRlbXNQdHIgdG8gdGhlIHByb3ZpZGVkIGJ1ZmZlci4KKyAgICAgICAgLy8gQWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBtYXkgc2V0IHN0YXRlLT5pdGVtc1B0ciB0byBhbiBpbnRlcm5hbCBDIGFycmF5IG9mIG9iamVjdHMuCisgICAgICAgIC8vIHN0YXRlLT5pdGVtc1B0ciBNVVNUIE5PVCBiZSBOVUxMLgorICAgICAgICBzdGF0ZS0+aXRlbXNQdHIgPSBzdGFja2J1ZjsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgc3RhY2sgYXJyYXksIGVpdGhlciB1bnRpbCB3ZSd2ZSBwcm92aWRlZCBhbGwgaXRlbXMgZnJvbSB0aGUgbGlzdAorICAgICAgICAvLyBvciB1bnRpbCB3ZSd2ZSBwcm92aWRlZCBhcyBtYW55IGl0ZW1zIGFzIHRoZSBzdGFjayBiYXNlZCBidWZmZXIgd2lsbCBob2xkLgorICAgICAgICB3aGlsZSgoc3RhdGUtPnN0YXRlIDwgc2VsZi5jb3VudCkgJiYgKGNudCA8IGxlbikpIHsKKyAgICAgICAgICAgIC8vIEZvciB0aGlzIHNhbXBsZSwgd2UgZ2VuZXJhdGUgdGhlIGNvbnRlbnRzIG9uIHRoZSBmbHkuCisgICAgICAgICAgICAvLyBBIHJlYWwgaW1wbGVtZW50YXRpb24gd291bGQgbGlrZWx5IGp1c3QgYmUgY29weWluZyBvYmplY3RzIGZyb20gaW50ZXJuYWwgc3RvcmFnZS4KKyAgICAgICAgICAgIHN0YWNrYnVmW2NudCsrXSA9IHB0ckJ1ZmZlcltzdGF0ZS0+c3RhdGUrK107CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RhdGUtPnN0YXRlID0gKChjbnQgPCBsZW4pPyBjbnQgOiBsZW4pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHByb3ZpZGVkIGFsbCBvdXIgaXRlbXMsIHNvIHdlIHNpZ25hbCB3ZSBhcmUgZG9uZSBieSByZXR1cm5pbmcgMC4KKyAgICAgICAgY250ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGNudDsKK30KKworLSAodm9pZCkgY2xlYXIKK3sKKyAgICBpZiAoIGNvdW50ICkgW3NlbGYgcmVtb3ZlQWxsT2JqZWN0c107Cit9CisKKy0gKHZvaWQpIHJlbW92ZUFsbE9iamVjdHMKK3sKKyAgICByb290ID0gW0FDQlRyZWUgbmV3Tm9kZVdpdGhEaWN0aW9uYXJ5OnNlbGZdOworICAgIHJvb3Qubm9kZWlkID0gMDsKKyAgICBueHRfbm9kZWlkID0gMTsKK30KKworLSAoTlNJbnRlZ2VyKSBuZXh0Tm9kZUlkCit7CisgICAgcmV0dXJuIG54dF9ub2RlaWQrKzsKK30KKworLSAoTlNBcnJheSAqKSB0b0tleUFycmF5Cit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLSAoTlNBcnJheSAqKSB0b1ZhbHVlQXJyYXkKK3sKKyAgICByZXR1cm4gbmlsOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgxZmMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIuaApAQCAtMCwwICsxLDExNCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAoYykgMjAxMSBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxBTlRMUi9BQ0JUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTXV0YWJsZUFycmF5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTXV0YWJsZURpY3Rpb25hcnkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZU1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVJlY29nbml6ZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCaXRTZXQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNoYXJTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbVN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vbkVycm9yTm9kZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25Ub2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRGQS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Zy5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEb3VibGVLZXlNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVycm9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYXN0UXVldWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmlsZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJIYXNoTWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hSdWxlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUklucHV0U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkludEFycmF5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkludFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMaW5rQmFzZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMb29rYWhlYWRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJOb2RlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlB0ckJ1ZmZlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZWFkZXJTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZU1lbW8uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN5bWJvbFN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5Tb3VyY2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVJdGVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5pcXVlSURNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQXJyYXlJdGVyYXRvci5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIueGNvZGVwcm9qL2Fjb25kaXQubW9kZTF2MyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLnhjb2RlcHJvai9hY29uZGl0Lm1vZGUxdjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxOGM1MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLnhjb2RlcHJvai9hY29uZGl0Lm1vZGUxdjMKQEAgLTAsMCArMSwxNDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+QWN0aXZlUGVyc3BlY3RpdmVOYW1lPC9rZXk+CisJPHN0cmluZz5Qcm9qZWN0PC9zdHJpbmc+CisJPGtleT5BbGxvd2VkTW9kdWxlczwva2V5PgorCTxhcnJheT4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYU21hcnRHcm91cFRyZWVNb2R1bGU8L3N0cmluZz4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5Hcm91cHMgYW5kIEZpbGVzIE91dGxpbmUgVmlldzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5CdW5kbGVMb2FkUGF0aDwva2V5PgorCQkJPHN0cmluZz48L3N0cmluZz4KKwkJCTxrZXk+TWF4SW5zdGFuY2VzPC9rZXk+CisJCQk8c3RyaW5nPm48L3N0cmluZz4KKwkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQk8c3RyaW5nPlBCWE5hdmlnYXRvckdyb3VwPC9zdHJpbmc+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+RWRpdG9yPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+WENUYXNrTGlzdE1vZHVsZTwvc3RyaW5nPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPlRhc2sgTGlzdDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5CdW5kbGVMb2FkUGF0aDwva2V5PgorCQkJPHN0cmluZz48L3N0cmluZz4KKwkJCTxrZXk+TWF4SW5zdGFuY2VzPC9rZXk+CisJCQk8c3RyaW5nPm48L3N0cmluZz4KKwkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQk8c3RyaW5nPlhDRGV0YWlsTW9kdWxlPC9zdHJpbmc+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+RmlsZSBhbmQgU21hcnQgR3JvdXAgRGV0YWlsIFZpZXdlcjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5CdW5kbGVMb2FkUGF0aDwva2V5PgorCQkJPHN0cmluZz48L3N0cmluZz4KKwkJCTxrZXk+TWF4SW5zdGFuY2VzPC9rZXk+CisJCQk8c3RyaW5nPjE8L3N0cmluZz4KKwkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQk8c3RyaW5nPlBCWEJ1aWxkUmVzdWx0c01vZHVsZTwvc3RyaW5nPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPkRldGFpbGVkIEJ1aWxkIFJlc3VsdHMgVmlld2VyPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+MTwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYUHJvamVjdEZpbmRNb2R1bGU8L3N0cmluZz4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5Qcm9qZWN0IEJhdGNoIEZpbmQgVG9vbDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5CdW5kbGVMb2FkUGF0aDwva2V5PgorCQkJPHN0cmluZz48L3N0cmluZz4KKwkJCTxrZXk+TWF4SW5zdGFuY2VzPC9rZXk+CisJCQk8c3RyaW5nPm48L3N0cmluZz4KKwkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQk8c3RyaW5nPlhDUHJvamVjdEZvcm1hdENvbmZsaWN0c01vZHVsZTwvc3RyaW5nPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPlByb2plY3QgRm9ybWF0IENvbmZsaWN0cyBMaXN0PC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYQm9va21hcmtzTW9kdWxlPC9zdHJpbmc+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+Qm9va21hcmtzIFRvb2w8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+QnVuZGxlTG9hZFBhdGg8L2tleT4KKwkJCTxzdHJpbmc+PC9zdHJpbmc+CisJCQk8a2V5Pk1heEluc3RhbmNlczwva2V5PgorCQkJPHN0cmluZz5uPC9zdHJpbmc+CisJCQk8a2V5Pk1vZHVsZTwva2V5PgorCQkJPHN0cmluZz5QQlhDbGFzc0Jyb3dzZXJNb2R1bGU8L3N0cmluZz4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5DbGFzcyBCcm93c2VyPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYQ1ZTTW9kdWxlPC9zdHJpbmc+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+U291cmNlIENvZGUgQ29udHJvbCBUb29sPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYRGVidWdCcmVha3BvaW50c01vZHVsZTwvc3RyaW5nPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPkRlYnVnIEJyZWFrcG9pbnRzIFRvb2w8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+QnVuZGxlTG9hZFBhdGg8L2tleT4KKwkJCTxzdHJpbmc+PC9zdHJpbmc+CisJCQk8a2V5Pk1heEluc3RhbmNlczwva2V5PgorCQkJPHN0cmluZz5uPC9zdHJpbmc+CisJCQk8a2V5Pk1vZHVsZTwva2V5PgorCQkJPHN0cmluZz5YQ0RvY2thYmxlSW5zcGVjdG9yPC9zdHJpbmc+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+SW5zcGVjdG9yPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYT3BlblF1aWNrbHlNb2R1bGU8L3N0cmluZz4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5PcGVuIFF1aWNrbHkgVG9vbDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5CdW5kbGVMb2FkUGF0aDwva2V5PgorCQkJPHN0cmluZz48L3N0cmluZz4KKwkJCTxrZXk+TWF4SW5zdGFuY2VzPC9rZXk+CisJCQk8c3RyaW5nPjE8L3N0cmluZz4KKwkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQk8c3RyaW5nPlBCWERlYnVnU2Vzc2lvbk1vZHVsZTwvc3RyaW5nPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPkRlYnVnZ2VyPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+MTwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+UEJYRGVidWdDTElNb2R1bGU8L3N0cmluZz4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5EZWJ1ZyBDb25zb2xlPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkJ1bmRsZUxvYWRQYXRoPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5NYXhJbnN0YW5jZXM8L2tleT4KKwkJCTxzdHJpbmc+bjwvc3RyaW5nPgorCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCTxzdHJpbmc+WENTbmFwc2hvdE1vZHVsZTwvc3RyaW5nPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPlNuYXBzaG90cyBUb29sPC9zdHJpbmc+CisJCTwvZGljdD4KKwk8L2FycmF5PgorCTxrZXk+QnVuZGxlUGF0aDwva2V5PgorCTxzdHJpbmc+L0RldmVsb3Blci9MaWJyYXJ5L1ByaXZhdGVGcmFtZXdvcmtzL0RldlRvb2xzSW50ZXJmYWNlLmZyYW1ld29yay9SZXNvdXJjZXM8L3N0cmluZz4KKwk8a2V5PkRlc2NyaXB0aW9uPC9rZXk+CisJPHN0cmluZz5EZWZhdWx0RGVzY3JpcHRpb25LZXk8L3N0cmluZz4KKwk8a2V5PkRvY2tpbmdTeXN0ZW1WaXNpYmxlPC9rZXk+CisJPGZhbHNlLz4KKwk8a2V5PkV4dGVuc2lvbjwva2V5PgorCTxzdHJpbmc+bW9kZTF2Mzwvc3RyaW5nPgorCTxrZXk+RmF2QmFyQ29uZmlnPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJPHN0cmluZz4xQUZGNDI5MzExQjA3MTMwMDA2MzlDMjI8L3N0cmluZz4KKwkJPGtleT5YQ0Jhck1vZHVsZUl0ZW1OYW1lczwva2V5PgorCQk8ZGljdC8+CisJCTxrZXk+WENCYXJNb2R1bGVJdGVtczwva2V5PgorCQk8YXJyYXkvPgorCTwvZGljdD4KKwk8a2V5PkZpcnN0VGltZVdpbmRvd0Rpc3BsYXllZDwva2V5PgorCTxmYWxzZS8+CisJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20uYXBwbGUucGVyc3BlY3RpdmVzLnByb2plY3QubW9kZTF2Mzwvc3RyaW5nPgorCTxrZXk+TWFqb3JWZXJzaW9uPC9rZXk+CisJPGludGVnZXI+MzM8L2ludGVnZXI+CisJPGtleT5NaW5vclZlcnNpb248L2tleT4KKwk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCTxrZXk+TmFtZTwva2V5PgorCTxzdHJpbmc+RGVmYXVsdDwvc3RyaW5nPgorCTxrZXk+Tm90aWZpY2F0aW9uczwva2V5PgorCTxhcnJheT4KKwkJPGRpY3Q+CisJCQk8a2V5PlhDT2JzZXJ2ZXJBdXRvRGlzY29ubmVjdEtleTwva2V5PgorCQkJPHRydWUvPgorCQkJPGtleT5YQ09ic2VydmVyRGVmaW50aW9uS2V5PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PlBCWFN0YXR1c0Vycm9yc0tleTwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PlhDT2JzZXJ2ZXJGYWN0b3J5S2V5PC9rZXk+CisJCQk8c3RyaW5nPlhDUGVyc3BlY3RpdmVzU3BlY2lmaWNhdGlvbklkZW50aWZpZXI8L3N0cmluZz4KKwkJCTxrZXk+WENPYnNlcnZlckdVSURLZXk8L2tleT4KKwkJCTxzdHJpbmc+WENPYnNlcnZlclByb2plY3RJZGVudGlmaWVyPC9zdHJpbmc+CisJCQk8a2V5PlhDT2JzZXJ2ZXJOb3RpZmljYXRpb25LZXk8L2tleT4KKwkJCTxzdHJpbmc+UEJYU3RhdHVzQnVpbGRTdGF0ZU1lc3NhZ2VOb3RpZmljYXRpb248L3N0cmluZz4KKwkJCTxrZXk+WENPYnNlcnZlclRhcmdldEtleTwva2V5PgorCQkJPHN0cmluZz5YQ01haW5CdWlsZFJlc3VsdHNNb2R1bGVHVUlEPC9zdHJpbmc+CisJCQk8a2V5PlhDT2JzZXJ2ZXJUcmlnZ2VyS2V5PC9rZXk+CisJCQk8c3RyaW5nPmF3YWtlbk1vZHVsZVdpdGhPYnNlcnZlcjo8L3N0cmluZz4KKwkJCTxrZXk+WENPYnNlcnZlclZhbGlkYXRpb25LZXk8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+UEJYU3RhdHVzRXJyb3JzS2V5PC9rZXk+CisJCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCTwvYXJyYXk+CisJPGtleT5PcGVuRWRpdG9yczwva2V5PgorCTxhcnJheS8+CisJPGtleT5QZXJzcGVjdGl2ZVdpZHRoczwva2V5PgorCTxhcnJheT4KKwkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCTwvYXJyYXk+CisJPGtleT5QZXJzcGVjdGl2ZXM8L2tleT4KKwk8YXJyYXk+CisJCTxkaWN0PgorCQkJPGtleT5DaG9zZW5Ub29sYmFySXRlbXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPmFjdGlvbjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+YWN0aXZlLWJ1aWxkc3R5bGUtcG9wdXA8L3N0cmluZz4KKwkJCQk8c3RyaW5nPmNsZWFuLXRhcmdldDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+Z288L3N0cmluZz4KKwkJCQk8c3RyaW5nPnNlcnZpY2VzTW9kdWxlZGVidWc8L3N0cmluZz4KKwkJCQk8c3RyaW5nPmRlYnVnZ2VyLWVuYWJsZS1icmVha3BvaW50czwvc3RyaW5nPgorCQkJCTxzdHJpbmc+YnVpbGQ8L3N0cmluZz4KKwkJCQk8c3RyaW5nPmJ1aWxkLWFuZC1nbzwvc3RyaW5nPgorCQkJCTxzdHJpbmc+Y29tLmFwcGxlLmlkZS5QQlhUb29sYmFyU3RvcEJ1dHRvbjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+Z2V0LWluZm88L3N0cmluZz4KKwkJCQk8c3RyaW5nPnRvZ2dsZS1lZGl0b3I8L3N0cmluZz4KKwkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wYngudG9vbGJhci5zZWFyY2hmaWVsZDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+Q29udHJvbGxlckNsYXNzQmFzZU5hbWU8L2tleT4KKwkJCTxzdHJpbmc+PC9zdHJpbmc+CisJCQk8a2V5Pkljb25OYW1lPC9rZXk+CisJCQk8c3RyaW5nPldpbmRvd09mUHJvamVjdFdpdGhFZGl0b3I8L3N0cmluZz4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz5wZXJzcGVjdGl2ZS5wcm9qZWN0PC9zdHJpbmc+CisJCQk8a2V5PklzVmVydGljYWw8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PkxheW91dDwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkJlY29tZUFjdGl2ZTwva2V5PgorCQkJCQk8dHJ1ZS8+CisJCQkJCTxrZXk+Q29udGVudENvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJPGRpY3Q+CisJCQkJCQk8a2V5PlBCWEJvdHRvbVNtYXJ0R3JvdXBHSURzPC9rZXk+CisJCQkJCQk8YXJyYXk+CisJCQkJCQkJPHN0cmluZz4xQzM3RkJBQzA0NTA5Q0QwMDAwMDAxMDI8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPjFDMzdGQUFDMDQ1MDlDRDAwMDAwMDEwMjwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+MUMzN0ZBQkMwNTUwOUNEMDAwMDAwMTAyPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz4xQzM3RkFCQzA1NTM5Q0QxMTIxMTAxMDI8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPkUyNjQ0QjM1MDUzQjY5QjIwMDIxMTI1Njwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+MUMzN0ZBQkMwNDUwOUNEMDAwMTAwMTA0PC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz4xQ0MwRUE0MDA0MzUwRUY5MDA0NDQxMEI8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPjFDQzBFQTQwMDQzNTBFRjkwMDQxMTEwQjwvc3RyaW5nPgorCQkJCQkJPC9hcnJheT4KKwkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCTxzdHJpbmc+MUNFMEIxRkUwNjQ3MURFRDAwOTdBNUY0PC9zdHJpbmc+CisJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVMYWJlbDwva2V5PgorCQkJCQkJPHN0cmluZz5GaWxlczwvc3RyaW5nPgorCQkJCQkJPGtleT5QQlhQcm9qZWN0U3RydWN0dXJlUHJvdmlkZWQ8L2tleT4KKwkJCQkJCTxzdHJpbmc+eWVzPC9zdHJpbmc+CisJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlQ29sdW1uRGF0YTwva2V5PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZUNvbHVtbldpZHRoc0tleTwva2V5PgorCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJPHJlYWw+MzgxPC9yZWFsPgorCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZUNvbHVtbnNLZXlfdjQ8L2tleT4KKwkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCTxzdHJpbmc+TWFpbkNvbHVtbjwvc3RyaW5nPgorCQkJCQkJCTwvYXJyYXk+CisJCQkJCQk8L2RpY3Q+CisJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlT3V0bGluZVN0YXRlS2V5X3Y3PC9rZXk+CisJCQkJCQk8ZGljdD4KKwkJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlT3V0bGluZVN0YXRlRXhwYW5zaW9uS2V5PC9rZXk+CisJCQkJCQkJPGFycmF5PgorCQkJCQkJCQk8c3RyaW5nPjA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNzwvc3RyaW5nPgorCQkJCQkJCQk8c3RyaW5nPkY3MDM3RUJCMEEwNUIwNkIwMDcwNDM1RDwvc3RyaW5nPgorCQkJCQkJCQk8c3RyaW5nPjFBMEYzNDJDMTJFQTQxMUYwMDQ5NkJCODwvc3RyaW5nPgorCQkJCQkJCQk8c3RyaW5nPjFDMzdGQkFDMDQ1MDlDRDAwMDAwMDEwMjwvc3RyaW5nPgorCQkJCQkJCQk8c3RyaW5nPjFBMDFCREI2MTJFQjYzQTUwMDQyODc5Mjwvc3RyaW5nPgorCQkJCQkJCQk8c3RyaW5nPjFBMDFCREI3MTJFQjYzQTUwMDQyODc5Mjwvc3RyaW5nPgorCQkJCQkJCQk8c3RyaW5nPjFDMzdGQUFDMDQ1MDlDRDAwMDAwMDEwMjwvc3RyaW5nPgorCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZU91dGxpbmVTdGF0ZVNlbGVjdGlvbktleTwva2V5PgorCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQkJCQkJPC9hcnJheT4KKwkJCQkJCQk8L2FycmF5PgorCQkJCQkJCTxrZXk+UEJYU21hcnRHcm91cFRyZWVNb2R1bGVPdXRsaW5lU3RhdGVWaXNpYmxlUmVjdEtleTwva2V5PgorCQkJCQkJCTxzdHJpbmc+e3swLCA4NTN9LCB7MzgxLCA3Mzh9fTwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQkJPGtleT5QQlhUb3BTbWFydEdyb3VwR0lEczwva2V5PgorCQkJCQkJPGFycmF5Lz4KKwkJCQkJCTxrZXk+WENJbmNsdWRlUGVyc3BlY3RpdmVzU3dpdGNoPC9rZXk+CisJCQkJCQk8dHJ1ZS8+CisJCQkJCQk8a2V5PlhDU2hhcmluZ1Rva2VuPC9rZXk+CisJCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5YY29kZS5HRlNoYXJpbmdUb2tlbjwvc3RyaW5nPgorCQkJCQk8L2RpY3Q+CisJCQkJCTxrZXk+R2VvbWV0cnlDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCTxkaWN0PgorCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJPHN0cmluZz57ezAsIDB9LCB7Mzk4LCA3NTZ9fTwvc3RyaW5nPgorCQkJCQkJPGtleT5Hcm91cFRyZWVUYWJsZUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCTxhcnJheT4KKwkJCQkJCQk8c3RyaW5nPk1haW5Db2x1bW48L3N0cmluZz4KKwkJCQkJCQk8cmVhbD4zODE8L3JlYWw+CisJCQkJCQk8L2FycmF5PgorCQkJCQkJPGtleT5SdWJiZXJXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJPHN0cmluZz4zNzcgMTg4IDEyNzcgNzk3IDAgMCAxNjgwIDEwMjggPC9zdHJpbmc+CisJCQkJCTwvZGljdD4KKwkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJPHN0cmluZz5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZTwvc3RyaW5nPgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz4zOThwdDwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5Eb2NrPC9rZXk+CisJCQkJCTxhcnJheT4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+Q29udGVudENvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlR1VJRDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPjFDRTBCMjAzMDY0NzFFMDYwMDk3QTVGNDwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVMYWJlbDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPlNpbXBsaWZpZXIuZzwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFNwbGl0TW9kdWxlSW5OYXZpZ2F0b3JLZXk8L2tleT4KKwkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQk8a2V5PlNwbGl0MDwva2V5PgorCQkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlR1VJRDwva2V5PgorCQkJCQkJCQkJCTxzdHJpbmc+MUNFMEIyMDQwNjQ3MUUwNjAwOTdBNUY0PC9zdHJpbmc+CisJCQkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJCQk8c3RyaW5nPlNpbXBsaWZpZXIuZzwvc3RyaW5nPgorCQkJCQkJCQkJCTxrZXk+X2hpc3RvcnlDYXBhY2l0eTwva2V5PgorCQkJCQkJCQkJCTxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgorCQkJCQkJCQkJCTxrZXk+Ym9va21hcms8L2tleT4KKwkJCQkJCQkJCQk8c3RyaW5nPjFBMDFCRTAzMTJFQjczN0IwMDQyODc5Mjwvc3RyaW5nPgorCQkJCQkJCQkJCTxrZXk+aGlzdG9yeTwva2V5PgorCQkJCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQUE4NkZGNzEyRUE3ODUyMDBFMTdBNEM8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQUE4NzEwMzEyRUE5Njc3MDBFMTdBNEM8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQUE4NzEwRTEyRUFBMUZFMDBFMTdBNEM8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQUE4NzExMTEyRUFBMUZFMDBFMTdBNEM8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0NDEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0NzEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0QTEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0QjEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0QzEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0RDEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ0RjEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1MDEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1MTEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1MjEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1MzEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1NDEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1NTEyRUI1NjIyMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1RDEyRUI1N0ZDMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ1RTEyRUI1N0ZDMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkQ2MDEyRUI1N0ZDMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCODEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCOTEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCQTEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCQjEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCQzEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCRTEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRCRjEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRDMDEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRDMTEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRDMzEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRDNDEyRUI2M0E1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRFNDEyRUI2QkVEMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRGNDEyRUI3MDI1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQkJPHN0cmluZz4xQTAxQkRGNTEyRUI3MDI1MDA0Mjg3OTI8L3N0cmluZz4KKwkJCQkJCQkJCQk8L2FycmF5PgorCQkJCQkJCQkJPC9kaWN0PgorCQkJCQkJCQkJPGtleT5TcGxpdENvdW50PC9rZXk+CisJCQkJCQkJCQk8c3RyaW5nPjE8L3N0cmluZz4KKwkJCQkJCQkJPC9kaWN0PgorCQkJCQkJCQk8a2V5PlN0YXR1c0JhclZpc2liaWxpdHk8L2tleT4KKwkJCQkJCQkJPHRydWUvPgorCQkJCQkJCTwvZGljdD4KKwkJCQkJCQk8a2V5Pkdlb21ldHJ5Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PkZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+e3swLCAwfSwgezg3NCwgNDE2fX08L3N0cmluZz4KKwkJCQkJCQkJPGtleT5SdWJiZXJXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPjM3NyAxODggMTI3NyA3OTcgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWE5hdmlnYXRvckdyb3VwPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz40MTZwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5Db250ZW50Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVHVUlEPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+MUNFMEIyMDUwNjQ3MUUwNjAwOTdBNUY0PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUxhYmVsPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+RGV0YWlsPC9zdHJpbmc+CisJCQkJCQkJPC9kaWN0PgorCQkJCQkJCTxrZXk+R2VvbWV0cnlDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz57ezAsIDQyMX0sIHs4NzQsIDMzNX19PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4zNzcgMTg4IDEyNzcgNzk3IDAgMCAxNjgwIDEwMjggPC9zdHJpbmc+CisJCQkJCQkJPC9kaWN0PgorCQkJCQkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQkJCQkJPHN0cmluZz5YQ0RldGFpbE1vZHVsZTwvc3RyaW5nPgorCQkJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQkJCTxzdHJpbmc+MzM1cHQ8L3N0cmluZz4KKwkJCQkJCTwvZGljdD4KKwkJCQkJPC9hcnJheT4KKwkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCTxzdHJpbmc+ODc0cHQ8L3N0cmluZz4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPlByb2plY3Q8L3N0cmluZz4KKwkJCTxrZXk+U2VydmljZUNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPlhDTW9kdWxlRG9jazwvc3RyaW5nPgorCQkJCTxzdHJpbmc+UEJYU21hcnRHcm91cFRyZWVNb2R1bGU8L3N0cmluZz4KKwkJCQk8c3RyaW5nPlhDTW9kdWxlRG9jazwvc3RyaW5nPgorCQkJCTxzdHJpbmc+UEJYTmF2aWdhdG9yR3JvdXA8L3N0cmluZz4KKwkJCQk8c3RyaW5nPlhDRGV0YWlsTW9kdWxlPC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT5UYWJsZU9mQ29udGVudHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPjFBMDFCRDBBMTJFQjJEM0MwMDQyODc5Mjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUNFMEIxRkUwNjQ3MURFRDAwOTdBNUY0PC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQTAxQkQwQjEyRUIyRDNDMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFDRTBCMjAzMDY0NzFFMDYwMDk3QTVGNDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUNFMEIyMDUwNjQ3MUUwNjAwOTdBNUY0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT5Ub29sYmFyQ29uZmlnVXNlckRlZmF1bHRzTWlub3JWZXJzaW9uPC9rZXk+CisJCQk8c3RyaW5nPjI8L3N0cmluZz4KKwkJCTxrZXk+VG9vbGJhckNvbmZpZ3VyYXRpb248L2tleT4KKwkJCTxzdHJpbmc+eGNvZGUudG9vbGJhci5jb25maWcuZGVmYXVsdFYzPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkNvbnRyb2xsZXJDbGFzc0Jhc2VOYW1lPC9rZXk+CisJCQk8c3RyaW5nPjwvc3RyaW5nPgorCQkJPGtleT5JY29uTmFtZTwva2V5PgorCQkJPHN0cmluZz5XaW5kb3dPZlByb2plY3Q8L3N0cmluZz4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz5wZXJzcGVjdGl2ZS5tb3JwaDwvc3RyaW5nPgorCQkJPGtleT5Jc1ZlcnRpY2FsPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5MYXlvdXQ8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5CZWNvbWVBY3RpdmU8L2tleT4KKwkJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCQkJPGtleT5Db250ZW50Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQk8ZGljdD4KKwkJCQkJCTxrZXk+UEJYQm90dG9tU21hcnRHcm91cEdJRHM8L2tleT4KKwkJCQkJCTxhcnJheT4KKwkJCQkJCQk8c3RyaW5nPjFDMzdGQkFDMDQ1MDlDRDAwMDAwMDEwMjwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+MUMzN0ZBQUMwNDUwOUNEMDAwMDAwMTAyPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz4xQzA4RTc3QzA0NTQ5NjEwMDBDOTE0QkQ8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPjFDMzdGQUJDMDU1MDlDRDAwMDAwMDEwMjwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+MUMzN0ZBQkMwNTUzOUNEMTEyMTEwMTAyPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz5FMjY0NEIzNTA1M0I2OUIyMDAyMTEyNTY8L3N0cmluZz4KKwkJCQkJCQk8c3RyaW5nPjFDMzdGQUJDMDQ1MDlDRDAwMDEwMDEwNDwvc3RyaW5nPgorCQkJCQkJCTxzdHJpbmc+MUNDMEVBNDAwNDM1MEVGOTAwNDQ0MTBCPC9zdHJpbmc+CisJCQkJCQkJPHN0cmluZz4xQ0MwRUE0MDA0MzUwRUY5MDA0MTExMEI8L3N0cmluZz4KKwkJCQkJCTwvYXJyYXk+CisJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVHVUlEPC9rZXk+CisJCQkJCQk8c3RyaW5nPjExRTBCMUZFMDY0NzFERUQwMDk3QTVGNDwvc3RyaW5nPgorCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCTxzdHJpbmc+RmlsZXM8L3N0cmluZz4KKwkJCQkJCTxrZXk+UEJYUHJvamVjdFN0cnVjdHVyZVByb3ZpZGVkPC9rZXk+CisJCQkJCQk8c3RyaW5nPnllczwvc3RyaW5nPgorCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZUNvbHVtbkRhdGE8L2tleT4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+UEJYU21hcnRHcm91cFRyZWVNb2R1bGVDb2x1bW5XaWR0aHNLZXk8L2tleT4KKwkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCTxyZWFsPjE4NjwvcmVhbD4KKwkJCQkJCQk8L2FycmF5PgorCQkJCQkJCTxrZXk+UEJYU21hcnRHcm91cFRyZWVNb2R1bGVDb2x1bW5zS2V5X3Y0PC9rZXk+CisJCQkJCQkJPGFycmF5PgorCQkJCQkJCQk8c3RyaW5nPk1haW5Db2x1bW48L3N0cmluZz4KKwkJCQkJCQk8L2FycmF5PgorCQkJCQkJPC9kaWN0PgorCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZU91dGxpbmVTdGF0ZUtleV92Nzwva2V5PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZU91dGxpbmVTdGF0ZUV4cGFuc2lvbktleTwva2V5PgorCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJPHN0cmluZz4yOUI5NzMxNEZEQ0ZBMzk0MTFDQTJDRUE8L3N0cmluZz4KKwkJCQkJCQkJPHN0cmluZz4xQzM3RkFCQzA1NTA5Q0QwMDAwMDAxMDI8L3N0cmluZz4KKwkJCQkJCQk8L2FycmF5PgorCQkJCQkJCTxrZXk+UEJYU21hcnRHcm91cFRyZWVNb2R1bGVPdXRsaW5lU3RhdGVTZWxlY3Rpb25LZXk8L2tleT4KKwkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJPC9hcnJheT4KKwkJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlT3V0bGluZVN0YXRlVmlzaWJsZVJlY3RLZXk8L2tleT4KKwkJCQkJCQk8c3RyaW5nPnt7MCwgMH0sIHsxODYsIDMzN319PC9zdHJpbmc+CisJCQkJCQk8L2RpY3Q+CisJCQkJCQk8a2V5PlBCWFRvcFNtYXJ0R3JvdXBHSURzPC9rZXk+CisJCQkJCQk8YXJyYXkvPgorCQkJCQkJPGtleT5YQ0luY2x1ZGVQZXJzcGVjdGl2ZXNTd2l0Y2g8L2tleT4KKwkJCQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQkJCQk8a2V5PlhDU2hhcmluZ1Rva2VuPC9rZXk+CisJCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5YY29kZS5HRlNoYXJpbmdUb2tlbjwvc3RyaW5nPgorCQkJCQk8L2RpY3Q+CisJCQkJCTxrZXk+R2VvbWV0cnlDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCTxkaWN0PgorCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJPHN0cmluZz57ezAsIDB9LCB7MjAzLCAzNTV9fTwvc3RyaW5nPgorCQkJCQkJPGtleT5Hcm91cFRyZWVUYWJsZUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCTxhcnJheT4KKwkJCQkJCQk8c3RyaW5nPk1haW5Db2x1bW48L3N0cmluZz4KKwkJCQkJCQk8cmVhbD4xODY8L3JlYWw+CisJCQkJCQk8L2FycmF5PgorCQkJCQkJPGtleT5SdWJiZXJXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJPHN0cmluZz4zNzMgMjY5IDY5MCAzOTcgMCAwIDE0NDAgODc4IDwvc3RyaW5nPgorCQkJCQk8L2RpY3Q+CisJCQkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQkJCTxzdHJpbmc+UEJYU21hcnRHcm91cFRyZWVNb2R1bGU8L3N0cmluZz4KKwkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCTxzdHJpbmc+MTAwJTwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+TW9ycGg8L3N0cmluZz4KKwkJCTxrZXk+UHJlZmVycmVkV2lkdGg8L2tleT4KKwkJCTxpbnRlZ2VyPjMwMDwvaW50ZWdlcj4KKwkJCTxrZXk+U2VydmljZUNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPlhDTW9kdWxlRG9jazwvc3RyaW5nPgorCQkJCTxzdHJpbmc+UEJYU21hcnRHcm91cFRyZWVNb2R1bGU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlRhYmxlT2ZDb250ZW50czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+MTFFMEIxRkUwNjQ3MURFRDAwOTdBNUY0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT5Ub29sYmFyQ29uZmlndXJhdGlvbjwva2V5PgorCQkJPHN0cmluZz54Y29kZS50b29sYmFyLmNvbmZpZy5kZWZhdWx0LnNob3J0VjM8L3N0cmluZz4KKwkJPC9kaWN0PgorCTwvYXJyYXk+CisJPGtleT5QZXJzcGVjdGl2ZXNCYXJWaXNpYmxlPC9rZXk+CisJPGZhbHNlLz4KKwk8a2V5PlNoZWxmSXNWaXNpYmxlPC9rZXk+CisJPGZhbHNlLz4KKwk8a2V5PlNvdXJjZURlc2NyaXB0aW9uPC9rZXk+CisJPHN0cmluZz5maWxlIGF0ICcvRGV2ZWxvcGVyL0xpYnJhcnkvUHJpdmF0ZUZyYW1ld29ya3MvRGV2VG9vbHNJbnRlcmZhY2UuZnJhbWV3b3JrL1Jlc291cmNlcy9YQ1BlcnNwZWN0aXZlc1NwZWNpZmljYXRpb25Nb2RlMS54Y3BlcnNwZWMnPC9zdHJpbmc+CisJPGtleT5TdGF0dXNiYXJJc1Zpc2libGU8L2tleT4KKwk8dHJ1ZS8+CisJPGtleT5UaW1lU3RhbXA8L2tleT4KKwk8cmVhbD4zMTc0MjA0MTEuNDMyNTI3MDE8L3JlYWw+CisJPGtleT5Ub29sYmFyQ29uZmlnVXNlckRlZmF1bHRzTWlub3JWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4yPC9zdHJpbmc+CisJPGtleT5Ub29sYmFyRGlzcGxheU1vZGU8L2tleT4KKwk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCTxrZXk+VG9vbGJhcklzVmlzaWJsZTwva2V5PgorCTx0cnVlLz4KKwk8a2V5PlRvb2xiYXJTaXplTW9kZTwva2V5PgorCTxpbnRlZ2VyPjI8L2ludGVnZXI+CisJPGtleT5UeXBlPC9rZXk+CisJPHN0cmluZz5QZXJzcGVjdGl2ZXM8L3N0cmluZz4KKwk8a2V5PlVwZGF0ZU1lc3NhZ2U8L2tleT4KKwk8c3RyaW5nPlRoZSBEZWZhdWx0IFdvcmtzcGFjZSBpbiB0aGlzIHZlcnNpb24gb2YgWGNvZGUgbm93IGluY2x1ZGVzIHN1cHBvcnQgdG8gaGlkZSBhbmQgc2hvdyB0aGUgZGV0YWlsIHZpZXcgKHdoYXQgaGFzIGJlZW4gcmVmZXJyZWQgdG8gYXMgdGhlICJNZXRyby1Nb3JwaCIgZmVhdHVyZSkuICBZb3UgbXVzdCBkaXNjYXJkIHlvdXIgY3VycmVudCBEZWZhdWx0IFdvcmtzcGFjZSBzZXR0aW5ncyBhbmQgdXBkYXRlIHRvIHRoZSBsYXRlc3QgRGVmYXVsdCBXb3Jrc3BhY2UgaW4gb3JkZXIgdG8gZ2FpbiB0aGlzIGZlYXR1cmUuICBEbyB5b3Ugd2lzaCB0byB1cGRhdGUgdG8gdGhlIGxhdGVzdCBXb3Jrc3BhY2UgZGVmYXVsdHMgZm9yIHByb2plY3QgJyVAJz88L3N0cmluZz4KKwk8a2V5PldpbmRvd0p1c3RpZmljYXRpb248L2tleT4KKwk8aW50ZWdlcj41PC9pbnRlZ2VyPgorCTxrZXk+V2luZG93T3JkZXJMaXN0PC9rZXk+CisJPGFycmF5PgorCQk8c3RyaW5nPjFBMDFCRDYzMTJFQjU3RkMwMDQyODc5Mjwvc3RyaW5nPgorCQk8c3RyaW5nPjFBMDFCRDY0MTJFQjU3RkMwMDQyODc5Mjwvc3RyaW5nPgorCQk8c3RyaW5nPjFDNTMwRDU3MDY5RjFDRTEwMDBDRkNFRTwvc3RyaW5nPgorCQk8c3RyaW5nPjFBRkY0MjgxMTFCMDcwRDAwMDYzOUMyMjwvc3RyaW5nPgorCQk8c3RyaW5nPjFDRDEwQTk5MDY5RUY4QkEwMEIwNjcyMDwvc3RyaW5nPgorCQk8c3RyaW5nPjFDNzhFQUFEMDY1RDQ5MjYwMEIwNzA5NTwvc3RyaW5nPgorCQk8c3RyaW5nPi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIueGNvZGVwcm9qPC9zdHJpbmc+CisJPC9hcnJheT4KKwk8a2V5PldpbmRvd1N0cmluZzwva2V5PgorCTxzdHJpbmc+Mzc3IDE4OCAxMjc3IDc5NyAwIDAgMTY4MCAxMDI4IDwvc3RyaW5nPgorCTxrZXk+V2luZG93VG9vbHNWMzwva2V5PgorCTxhcnJheT4KKwkJPGRpY3Q+CisJCQk8a2V5PkZpcnN0VGltZVdpbmRvd0Rpc3BsYXllZDwva2V5PgorCQkJPGZhbHNlLz4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz53aW5kb3dUb29sLmJ1aWxkPC9zdHJpbmc+CisJCQk8a2V5PklzVmVydGljYWw8L2tleT4KKwkJCTx0cnVlLz4KKwkJCTxrZXk+TGF5b3V0PC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+RG9jazwva2V5PgorCQkJCQk8YXJyYXk+CisJCQkJCQk8ZGljdD4KKwkJCQkJCQk8a2V5PkNvbnRlbnRDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4xQ0QwNTI4RjA2MjM3MDcyMDAxNjY2NzU8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJPHN0cmluZz5TaW1wbGlmaWVyLm08L3N0cmluZz4KKwkJCQkJCQkJPGtleT5TdGF0dXNCYXJWaXNpYmlsaXR5PC9rZXk+CisJCQkJCQkJCTx0cnVlLz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5HZW9tZXRyeUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MCwgMH0sIHsxNTUzLCAzOTN9fTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlJ1YmJlcldpbmRvd0ZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+MTMgMjEwIDE1NTMgNzc1IDAgMCAxNjgwIDEwMjggPC9zdHJpbmc+CisJCQkJCQkJPC9kaWN0PgorCQkJCQkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQkJCQkJPHN0cmluZz5QQlhOYXZpZ2F0b3JHcm91cDwvc3RyaW5nPgorCQkJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQkJCTxzdHJpbmc+MzkzcHQ8L3N0cmluZz4KKwkJCQkJCTwvZGljdD4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+QmVjb21lQWN0aXZlPC9rZXk+CisJCQkJCQkJPHRydWUvPgorCQkJCQkJCTxrZXk+Q29udGVudENvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlR1VJRDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPlhDTWFpbkJ1aWxkUmVzdWx0c01vZHVsZUdVSUQ8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJPHN0cmluZz5CdWlsZCBSZXN1bHRzPC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+WENCdWlsZFJlc3VsdHNUcmlnZ2VyX0NvbGxhcHNlPC9rZXk+CisJCQkJCQkJCTxpbnRlZ2VyPjEwMjE8L2ludGVnZXI+CisJCQkJCQkJCTxrZXk+WENCdWlsZFJlc3VsdHNUcmlnZ2VyX09wZW48L2tleT4KKwkJCQkJCQkJPGludGVnZXI+MTAxMjwvaW50ZWdlcj4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5HZW9tZXRyeUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MCwgMzk4fSwgezE1NTMsIDMzNn19PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4xMyAyMTAgMTU1MyA3NzUgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWEJ1aWxkUmVzdWx0c01vZHVsZTwvc3RyaW5nPgorCQkJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQkJCTxzdHJpbmc+MzM2cHQ8L3N0cmluZz4KKwkJCQkJCTwvZGljdD4KKwkJCQkJPC9hcnJheT4KKwkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCTxzdHJpbmc+NzM0cHQ8L3N0cmluZz4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPkJ1aWxkIFJlc3VsdHM8L3N0cmluZz4KKwkJCTxrZXk+U2VydmljZUNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPlBCWEJ1aWxkUmVzdWx0c01vZHVsZTwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+U3RhdHVzYmFySXNWaXNpYmxlPC9rZXk+CisJCQk8dHJ1ZS8+CisJCQk8a2V5PlRhYmxlT2ZDb250ZW50czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+MUFGRjQyODExMUIwNzBEMDAwNjM5QzIyPC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQTAxQkQwQzEyRUIyRDNDMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFDRDA1MjhGMDYyMzcwNzIwMDE2NjY3NTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+WENNYWluQnVpbGRSZXN1bHRzTW9kdWxlR1VJRDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+VG9vbGJhckNvbmZpZ3VyYXRpb248L2tleT4KKwkJCTxzdHJpbmc+eGNvZGUudG9vbGJhci5jb25maWcuYnVpbGRWMzwvc3RyaW5nPgorCQkJPGtleT5XaW5kb3dDb250ZW50TWluU2l6ZTwva2V5PgorCQkJPHN0cmluZz40ODYgMzAwPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1N0cmluZzwva2V5PgorCQkJPHN0cmluZz4xMyAyMTAgMTU1MyA3NzUgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93VG9vbEdVSUQ8L2tleT4KKwkJCTxzdHJpbmc+MUFGRjQyODExMUIwNzBEMDAwNjM5QzIyPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xJc1Zpc2libGU8L2tleT4KKwkJCTxmYWxzZS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkZpcnN0VGltZVdpbmRvd0Rpc3BsYXllZDwva2V5PgorCQkJPGZhbHNlLz4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz53aW5kb3dUb29sLmRlYnVnZ2VyPC9zdHJpbmc+CisJCQk8a2V5PklzVmVydGljYWw8L2tleT4KKwkJCTx0cnVlLz4KKwkJCTxrZXk+TGF5b3V0PC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+RG9jazwva2V5PgorCQkJCQk8YXJyYXk+CisJCQkJCQk8ZGljdD4KKwkJCQkJCQk8a2V5PkNvbnRlbnRDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+RGVidWdnZXI8L2tleT4KKwkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQk8a2V5Pkhvcml6b250YWxTcGxpdFZpZXc8L2tleT4KKwkJCQkJCQkJCTxkaWN0PgorCQkJCQkJCQkJCTxrZXk+X2NvbGxhcHNpbmdGcmFtZURpbWVuc2lvbjwva2V5PgorCQkJCQkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KKwkJCQkJCQkJCQk8a2V5Pl9pbmRleE9mQ29sbGFwc2VkVmlldzwva2V5PgorCQkJCQkJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQkJCQkJCQkJPGtleT5fcGVyY2VudGFnZU9mQ29sbGFwc2VkVmlldzwva2V5PgorCQkJCQkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KKwkJCQkJCQkJCQk8a2V5PmlzQ29sbGFwc2VkPC9rZXk+CisJCQkJCQkJCQkJPHN0cmluZz55ZXM8L3N0cmluZz4KKwkJCQkJCQkJCQk8a2V5PnNpemVzPC9rZXk+CisJCQkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJCQk8c3RyaW5nPnt7MCwgMH0sIHs0NDYsIDI4OH19PC9zdHJpbmc+CisJCQkJCQkJCQkJCTxzdHJpbmc+e3swLCAyODh9LCB7NDQ2LCAzMTJ9fTwvc3RyaW5nPgorCQkJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJCQk8a2V5PlZlcnRpY2FsU3BsaXRWaWV3PC9rZXk+CisJCQkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJCQk8a2V5Pl9jb2xsYXBzaW5nRnJhbWVEaW1lbnNpb248L2tleT4KKwkJCQkJCQkJCQk8cmVhbD4wLjA8L3JlYWw+CisJCQkJCQkJCQkJPGtleT5faW5kZXhPZkNvbGxhcHNlZFZpZXc8L2tleT4KKwkJCQkJCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJCQkJCQkJCTxrZXk+X3BlcmNlbnRhZ2VPZkNvbGxhcHNlZFZpZXc8L2tleT4KKwkJCQkJCQkJCQk8cmVhbD4wLjA8L3JlYWw+CisJCQkJCQkJCQkJPGtleT5pc0NvbGxhcHNlZDwva2V5PgorCQkJCQkJCQkJCTxzdHJpbmc+eWVzPC9zdHJpbmc+CisJCQkJCQkJCQkJPGtleT5zaXplczwva2V5PgorCQkJCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJCQkJPHN0cmluZz57ezAsIDB9LCB7NDQ2LCA2MDB9fTwvc3RyaW5nPgorCQkJCQkJCQkJCQk8c3RyaW5nPnt7NDQ2LCAwfSwgezg2NiwgNjAwfX08L3N0cmluZz4KKwkJCQkJCQkJCQk8L2FycmF5PgorCQkJCQkJCQkJPC9kaWN0PgorCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJCTxrZXk+TGF1bmNoZXJDb25maWdWZXJzaW9uPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+ODwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVHVUlEPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+MUMxNjI5ODQwNjRDMTBENDAwQjk1QTcyPC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUxhYmVsPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+RGVidWcgLSBHTFVURXhhbXBsZXMgKFVuZGVyd2F0ZXIpPC9zdHJpbmc+CisJCQkJCQkJPC9kaWN0PgorCQkJCQkJCTxrZXk+R2VvbWV0cnlDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+RGVidWdDb25zb2xlVmlzaWJsZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPk5vbmU8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5EZWJ1Z0NvbnNvbGVXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MjAwLCAyMDB9LCB7NTAwLCAzMDB9fTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PkRlYnVnU1RESU9XaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MjAwLCAyMDB9LCB7NTAwLCAzMDB9fTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PkZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+e3swLCAwfSwgezEzMTIsIDYwMH19PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UEJYRGVidWdTZXNzaW9uU3RhY2tGcmFtZVZpZXdLZXk8L2tleT4KKwkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQk8a2V5PkRlYnVnVmFyaWFibGVzVGFibGVDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCQkJPHN0cmluZz5OYW1lPC9zdHJpbmc+CisJCQkJCQkJCQkJPHJlYWw+MTkxPC9yZWFsPgorCQkJCQkJCQkJCTxzdHJpbmc+VmFsdWU8L3N0cmluZz4KKwkJCQkJCQkJCQk8cmVhbD44NTwvcmVhbD4KKwkJCQkJCQkJCQk8c3RyaW5nPlN1bW1hcnk8L3N0cmluZz4KKwkJCQkJCQkJCQk8cmVhbD4xNDU8L3JlYWw+CisJCQkJCQkJCQk8L2FycmF5PgorCQkJCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJCQkJPHN0cmluZz57ezAsIDI4OH0sIHs0NDYsIDMxMn19PC9zdHJpbmc+CisJCQkJCQkJCQk8a2V5PlJ1YmJlcldpbmRvd0ZyYW1lPC9rZXk+CisJCQkJCQkJCQk8c3RyaW5nPjMxMyAzNTkgMTMxMiA2NDEgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQkJPC9kaWN0PgorCQkJCQkJCQk8a2V5PlJ1YmJlcldpbmRvd0ZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+MzEzIDM1OSAxMzEyIDY0MSAwIDAgMTY4MCAxMDI4IDwvc3RyaW5nPgorCQkJCQkJCTwvZGljdD4KKwkJCQkJCQk8a2V5Pk1vZHVsZTwva2V5PgorCQkJCQkJCTxzdHJpbmc+UEJYRGVidWdTZXNzaW9uTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz42MDBwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz42MDBwdDwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+RGVidWdnZXI8L3N0cmluZz4KKwkJCTxrZXk+U2VydmljZUNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPlBCWERlYnVnU2Vzc2lvbk1vZHVsZTwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+U3RhdHVzYmFySXNWaXNpYmxlPC9rZXk+CisJCQk8dHJ1ZS8+CisJCQk8a2V5PlRhYmxlT2ZDb250ZW50czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+MUNEMTBBOTkwNjlFRjhCQTAwQjA2NzIwPC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQTAxQkQxMDEyRUIzNzVEMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFDMTYyOTg0MDY0QzEwRDQwMEI5NUE3Mjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUEwMUJEMTExMkVCMzc1RDAwNDI4NzkyPC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQTAxQkQxMjEyRUIzNzVEMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFBMDFCRDEzMTJFQjM3NUQwMDQyODc5Mjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUEwMUJEMTQxMkVCMzc1RDAwNDI4NzkyPC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQTAxQkQxNTEyRUIzNzVEMDA0Mjg3OTI8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlRvb2xiYXJDb25maWd1cmF0aW9uPC9rZXk+CisJCQk8c3RyaW5nPnhjb2RlLnRvb2xiYXIuY29uZmlnLmRlYnVnVjM8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93U3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPjMxMyAzNTkgMTMxMiA2NDEgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93VG9vbEdVSUQ8L2tleT4KKwkJCTxzdHJpbmc+MUNEMTBBOTkwNjlFRjhCQTAwQjA2NzIwPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xJc1Zpc2libGU8L2tleT4KKwkJCTx0cnVlLz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+Rmlyc3RUaW1lV2luZG93RGlzcGxheWVkPC9rZXk+CisJCQk8ZmFsc2UvPgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8c3RyaW5nPndpbmRvd1Rvb2wuZmluZDwvc3RyaW5nPgorCQkJPGtleT5Jc1ZlcnRpY2FsPC9rZXk+CisJCQk8dHJ1ZS8+CisJCQk8a2V5PkxheW91dDwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkRvY2s8L2tleT4KKwkJCQkJPGFycmF5PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5Eb2NrPC9rZXk+CisJCQkJCQkJPGFycmF5PgorCQkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJCTxrZXk+Q29udGVudENvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQkJCTxkaWN0PgorCQkJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCQkJCQk8c3RyaW5nPjFDREQ1MjhDMDYyMjIwNzIwMDEzNDY3NTwvc3RyaW5nPgorCQkJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUxhYmVsPC9rZXk+CisJCQkJCQkJCQkJPHN0cmluZz48L3N0cmluZz4KKwkJCQkJCQkJCQk8a2V5PlN0YXR1c0JhclZpc2liaWxpdHk8L2tleT4KKwkJCQkJCQkJCQk8dHJ1ZS8+CisJCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJCQk8a2V5Pkdlb21ldHJ5Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJCQkJCTxzdHJpbmc+e3swLCAwfSwgezExNzUsIDMyM319PC9zdHJpbmc+CisJCQkJCQkJCQkJPGtleT5SdWJiZXJXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJCQkJCTxzdHJpbmc+NDk1IDM1IDExNzUgOTc3IDAgMCAxNjgwIDEwMjggPC9zdHJpbmc+CisJCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJCQk8a2V5Pk1vZHVsZTwva2V5PgorCQkJCQkJCQkJPHN0cmluZz5QQlhOYXZpZ2F0b3JHcm91cDwvc3RyaW5nPgorCQkJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJCQk8c3RyaW5nPjExNzVwdDwvc3RyaW5nPgorCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPC9hcnJheT4KKwkJCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJCQk8c3RyaW5nPjMyM3B0PC9zdHJpbmc+CisJCQkJCQk8L2RpY3Q+CisJCQkJCQk8ZGljdD4KKwkJCQkJCQk8a2V5PkJlY29tZUFjdGl2ZTwva2V5PgorCQkJCQkJCTx0cnVlLz4KKwkJCQkJCQk8a2V5PkNvbnRlbnRDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4xQ0QwNTI4RTA2MjM3MDcyMDAxNjY2NzU8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJPHN0cmluZz5Qcm9qZWN0IEZpbmQ8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5HZW9tZXRyeUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MCwgMzI4fSwgezExNzUsIDYwOH19PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz40OTUgMzUgMTE3NSA5NzcgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWFByb2plY3RGaW5kTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz42MDhwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz45MzZwdDwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+UHJvamVjdCBGaW5kPC9zdHJpbmc+CisJCQk8a2V5PlNlcnZpY2VDbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5QQlhQcm9qZWN0RmluZE1vZHVsZTwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+U3RhdHVzYmFySXNWaXNpYmxlPC9rZXk+CisJCQk8dHJ1ZS8+CisJCQk8a2V5PlRhYmxlT2ZDb250ZW50czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+MUM1MzBENTcwNjlGMUNFMTAwMENGQ0VFPC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQTAxQkQxNzEyRUIzNzVEMDA0Mjg3OTI8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFBMDFCRDE4MTJFQjM3NUQwMDQyODc5Mjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUNERDUyOEMwNjIyMjA3MjAwMTM0Njc1PC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQ0QwNTI4RTA2MjM3MDcyMDAxNjY2NzU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PldpbmRvd1N0cmluZzwva2V5PgorCQkJPHN0cmluZz40OTUgMzUgMTE3NSA5NzcgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93VG9vbEdVSUQ8L2tleT4KKwkJCTxzdHJpbmc+MUM1MzBENTcwNjlGMUNFMTAwMENGQ0VFPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xJc1Zpc2libGU8L2tleT4KKwkJCTxmYWxzZS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxzdHJpbmc+TUVOVVNFUEFSQVRPUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5GaXJzdFRpbWVXaW5kb3dEaXNwbGF5ZWQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxzdHJpbmc+d2luZG93VG9vbC5kZWJ1Z2dlckNvbnNvbGU8L3N0cmluZz4KKwkJCTxrZXk+SXNWZXJ0aWNhbDwva2V5PgorCQkJPHRydWUvPgorCQkJPGtleT5MYXlvdXQ8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5Eb2NrPC9rZXk+CisJCQkJCTxhcnJheT4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+QmVjb21lQWN0aXZlPC9rZXk+CisJCQkJCQkJPHRydWUvPgorCQkJCQkJCTxrZXk+Q29udGVudENvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlR1VJRDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPjFDNzhFQUFDMDY1RDQ5MjYwMEIwNzA5NTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVMYWJlbDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPkRlYnVnZ2VyIENvbnNvbGU8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5HZW9tZXRyeUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5GcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MCwgMH0sIHsxMTExLCA0MTd9fTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlJ1YmJlcldpbmRvd0ZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+MjIgNjUgMTExMSA0NTggMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWERlYnVnQ0xJTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz40MTdwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz40MTdwdDwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+RGVidWdnZXIgQ29uc29sZTwvc3RyaW5nPgorCQkJPGtleT5TZXJ2aWNlQ2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+UEJYRGVidWdDTElNb2R1bGU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlN0YXR1c2JhcklzVmlzaWJsZTwva2V5PgorCQkJPHRydWUvPgorCQkJPGtleT5UYWJsZU9mQ29udGVudHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPjFDNzhFQUFEMDY1RDQ5MjYwMEIwNzA5NTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUEwMUJENDMxMkVCNTYxRjAwNDI4NzkyPC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQzc4RUFBQzA2NUQ0OTI2MDBCMDcwOTU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlRvb2xiYXJDb25maWd1cmF0aW9uPC9rZXk+CisJCQk8c3RyaW5nPnhjb2RlLnRvb2xiYXIuY29uZmlnLmNvbnNvbGVWMzwvc3RyaW5nPgorCQkJPGtleT5XaW5kb3dTdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+MjIgNjUgMTExMSA0NTggMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93VG9vbEdVSUQ8L2tleT4KKwkJCTxzdHJpbmc+MUM3OEVBQUQwNjVENDkyNjAwQjA3MDk1PC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xJc1Zpc2libGU8L2tleT4KKwkJCTx0cnVlLz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz53aW5kb3dUb29sLnNuYXBzaG90czwvc3RyaW5nPgorCQkJPGtleT5MYXlvdXQ8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5Eb2NrPC9rZXk+CisJCQkJCTxhcnJheT4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQkJCQkJPHN0cmluZz5YQ1NuYXBzaG90TW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz4xMDAlPC9zdHJpbmc+CisJCQkJCQk8L2RpY3Q+CisJCQkJCTwvYXJyYXk+CisJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQk8c3RyaW5nPjEwMCU8L3N0cmluZz4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPlNuYXBzaG90czwvc3RyaW5nPgorCQkJPGtleT5TZXJ2aWNlQ2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+WENTbmFwc2hvdE1vZHVsZTwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+U3RhdHVzYmFySXNWaXNpYmxlPC9rZXk+CisJCQk8c3RyaW5nPlllczwvc3RyaW5nPgorCQkJPGtleT5Ub29sYmFyQ29uZmlndXJhdGlvbjwva2V5PgorCQkJPHN0cmluZz54Y29kZS50b29sYmFyLmNvbmZpZy5zbmFwc2hvdHM8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93U3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPjMxNSA4MjQgMzAwIDU1MCAwIDAgMTQ0MCA4NzggPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xJc1Zpc2libGU8L2tleT4KKwkJCTxzdHJpbmc+WWVzPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxzdHJpbmc+d2luZG93VG9vbC5zY208L3N0cmluZz4KKwkJCTxrZXk+TGF5b3V0PC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+RG9jazwva2V5PgorCQkJCQk8YXJyYXk+CisJCQkJCQk8ZGljdD4KKwkJCQkJCQk8a2V5PkNvbnRlbnRDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4xQzc4RUFCMjA2NUQ0OTI2MDBCMDcwOTU8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4mbHQ7Tm8gRWRpdG9yJmd0Ozwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFNwbGl0TW9kdWxlSW5OYXZpZ2F0b3JLZXk8L2tleT4KKwkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQk8a2V5PlNwbGl0MDwva2V5PgorCQkJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlR1VJRDwva2V5PgorCQkJCQkJCQkJCTxzdHJpbmc+MUM3OEVBQjMwNjVENDkyNjAwQjA3MDk1PC9zdHJpbmc+CisJCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJCQk8a2V5PlNwbGl0Q291bnQ8L2tleT4KKwkJCQkJCQkJCTxzdHJpbmc+MTwvc3RyaW5nPgorCQkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJCTxrZXk+U3RhdHVzQmFyVmlzaWJpbGl0eTwva2V5PgorCQkJCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJCQkJCTwvZGljdD4KKwkJCQkJCQk8a2V5Pkdlb21ldHJ5Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PkZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+e3swLCAwfSwgezQ1MiwgMH19PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz43NDMgMzc5IDQ1MiAzMDggMCAwIDEyODAgMTAwMiA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWE5hdmlnYXRvckdyb3VwPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz4wcHQ8L3N0cmluZz4KKwkJCQkJCTwvZGljdD4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+QmVjb21lQWN0aXZlPC9rZXk+CisJCQkJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCQkJCQk8a2V5PkNvbnRlbnRDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4xQ0QwNTI5MjA2MjM3MDcyMDAxNjY2NzU8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJPHN0cmluZz5TQ008L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5HZW9tZXRyeUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5Db25zb2xlRnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz57ezAsIDI1OX0sIHs0NTIsIDB9fTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PkZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+e3swLCA3fSwgezQ1MiwgMjU5fX08L3N0cmluZz4KKwkJCQkJCQkJPGtleT5SdWJiZXJXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPjc0MyAzNzkgNDUyIDMwOCAwIDAgMTI4MCAxMDAyIDwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlRhYmxlQ29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCQk8c3RyaW5nPlN0YXR1czwvc3RyaW5nPgorCQkJCQkJCQkJPHJlYWw+MzA8L3JlYWw+CisJCQkJCQkJCQk8c3RyaW5nPkZpbGVOYW1lPC9zdHJpbmc+CisJCQkJCQkJCQk8cmVhbD4xOTk8L3JlYWw+CisJCQkJCQkJCQk8c3RyaW5nPlBhdGg8L3N0cmluZz4KKwkJCQkJCQkJCTxyZWFsPjE5Ny4wOTUwMDEyMjA3MDMxPC9yZWFsPgorCQkJCQkJCQk8L2FycmF5PgorCQkJCQkJCQk8a2V5PlRhYmxlRnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz57ezAsIDB9LCB7NDUyLCAyNTB9fTwvc3RyaW5nPgorCQkJCQkJCTwvZGljdD4KKwkJCQkJCQk8a2V5Pk1vZHVsZTwva2V5PgorCQkJCQkJCTxzdHJpbmc+UEJYQ1ZTTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz4yNjJwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz4yNjZwdDwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+U0NNPC9zdHJpbmc+CisJCQk8a2V5PlNlcnZpY2VDbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5QQlhDVlNNb2R1bGU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlN0YXR1c2JhcklzVmlzaWJsZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+VGFibGVPZkNvbnRlbnRzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz4xQzc4RUFCNDA2NUQ0OTI2MDBCMDcwOTU8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFDNzhFQUI1MDY1RDQ5MjYwMEIwNzA5NTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUM3OEVBQjIwNjVENDkyNjAwQjA3MDk1PC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQ0QwNTI5MjA2MjM3MDcyMDAxNjY2NzU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlRvb2xiYXJDb25maWd1cmF0aW9uPC9rZXk+CisJCQk8c3RyaW5nPnhjb2RlLnRvb2xiYXIuY29uZmlnLnNjbTwvc3RyaW5nPgorCQkJPGtleT5XaW5kb3dTdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+NzQzIDM3OSA0NTIgMzA4IDAgMCAxMjgwIDEwMDIgPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PkZpcnN0VGltZVdpbmRvd0Rpc3BsYXllZDwva2V5PgorCQkJPGZhbHNlLz4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz53aW5kb3dUb29sLmJyZWFrcG9pbnRzPC9zdHJpbmc+CisJCQk8a2V5PklzVmVydGljYWw8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PkxheW91dDwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkRvY2s8L2tleT4KKwkJCQkJPGFycmF5PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5Db250ZW50Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PlBCWEJvdHRvbVNtYXJ0R3JvdXBHSURzPC9rZXk+CisJCQkJCQkJCTxhcnJheT4KKwkJCQkJCQkJCTxzdHJpbmc+MUM3N0ZBQkMwNDUwOUNEMDAwMDAwMTAyPC9zdHJpbmc+CisJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUdVSUQ8L2tleT4KKwkJCQkJCQkJPHN0cmluZz4xQ0UwQjFGRTA2NDcxREVEMDA5N0E1RjQ8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlTGFiZWw8L2tleT4KKwkJCQkJCQkJPHN0cmluZz5GaWxlczwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RTdHJ1Y3R1cmVQcm92aWRlZDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPm5vPC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UEJYU21hcnRHcm91cFRyZWVNb2R1bGVDb2x1bW5EYXRhPC9rZXk+CisJCQkJCQkJCTxkaWN0PgorCQkJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZUNvbHVtbldpZHRoc0tleTwva2V5PgorCQkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJCTxyZWFsPjI2ODwvcmVhbD4KKwkJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlQ29sdW1uc0tleV92NDwva2V5PgorCQkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJCTxzdHJpbmc+TWFpbkNvbHVtbjwvc3RyaW5nPgorCQkJCQkJCQkJPC9hcnJheT4KKwkJCQkJCQkJPC9kaWN0PgorCQkJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlT3V0bGluZVN0YXRlS2V5X3Y3PC9rZXk+CisJCQkJCQkJCTxkaWN0PgorCQkJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZU91dGxpbmVTdGF0ZUV4cGFuc2lvbktleTwva2V5PgorCQkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJCTxzdHJpbmc+MUM3N0ZBQkMwNDUwOUNEMDAwMDAwMTAyPC9zdHJpbmc+CisJCQkJCQkJCQkJPHN0cmluZz4xQzNFMERDQTA4MDcyNUVBMDBBNTUxNzc8L3N0cmluZz4KKwkJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCQk8a2V5PlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlT3V0bGluZVN0YXRlU2VsZWN0aW9uS2V5PC9rZXk+CisJCQkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCQk8L2FycmF5PgorCQkJCQkJCQkJPGtleT5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZU91dGxpbmVTdGF0ZVZpc2libGVSZWN0S2V5PC9rZXk+CisJCQkJCQkJCQk8c3RyaW5nPnt7MCwgMH0sIHsyNjgsIDM1MH19PC9zdHJpbmc+CisJCQkJCQkJCTwvZGljdD4KKwkJCQkJCQkJPGtleT5QQlhUb3BTbWFydEdyb3VwR0lEczwva2V5PgorCQkJCQkJCQk8YXJyYXkvPgorCQkJCQkJCQk8a2V5PlhDSW5jbHVkZVBlcnNwZWN0aXZlc1N3aXRjaDwva2V5PgorCQkJCQkJCQk8ZmFsc2UvPgorCQkJCQkJCTwvZGljdD4KKwkJCQkJCQk8a2V5Pkdlb21ldHJ5Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PkZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+e3swLCAwfSwgezI4NSwgMzY4fX08L3N0cmluZz4KKwkJCQkJCQkJPGtleT5Hcm91cFRyZWVUYWJsZUNvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQkJPGFycmF5PgorCQkJCQkJCQkJPHN0cmluZz5NYWluQ29sdW1uPC9zdHJpbmc+CisJCQkJCQkJCQk8cmVhbD4yNjg8L3JlYWw+CisJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz40NjEgNTQwIDc0NCA0MDkgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWFNtYXJ0R3JvdXBUcmVlTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz4yODVwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5CZWNvbWVBY3RpdmU8L2tleT4KKwkJCQkJCQk8dHJ1ZS8+CisJCQkJCQkJPGtleT5Db250ZW50Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVHVUlEPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+MUNBMUFFRDcwNjM5OEVCRDAwNTg5MTQ3PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UEJYUHJvamVjdE1vZHVsZUxhYmVsPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+RGV0YWlsPC9zdHJpbmc+CisJCQkJCQkJPC9kaWN0PgorCQkJCQkJCTxrZXk+R2VvbWV0cnlDb25maWd1cmF0aW9uPC9rZXk+CisJCQkJCQkJPGRpY3Q+CisJCQkJCQkJCTxrZXk+RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz57ezI5MCwgMH0sIHs0NTQsIDM2OH19PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz40NjEgNTQwIDc0NCA0MDkgMCAwIDE2ODAgMTAyOCA8L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlhDRGV0YWlsTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz40NTRwdDwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz4zNjhwdDwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk1ham9yVmVyc2lvbjwva2V5PgorCQkJPGludGVnZXI+MzwvaW50ZWdlcj4KKwkJCTxrZXk+TWlub3JWZXJzaW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPkJyZWFrcG9pbnRzPC9zdHJpbmc+CisJCQk8a2V5PlNlcnZpY2VDbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5QQlhTbWFydEdyb3VwVHJlZU1vZHVsZTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+WENEZXRhaWxNb2R1bGU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlN0YXR1c2JhcklzVmlzaWJsZTwva2V5PgorCQkJPHRydWUvPgorCQkJPGtleT5UYWJsZU9mQ29udGVudHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPjFBOEM1NDU5MTIyNDQxNzMwMDhBMUQ0NDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUE4QzU0NUExMjI0NDE3MzAwOEExRDQ0PC9zdHJpbmc+CisJCQkJPHN0cmluZz4xQ0UwQjFGRTA2NDcxREVEMDA5N0E1RjQ8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFDQTFBRUQ3MDYzOThFQkQwMDU4OTE0Nzwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+VG9vbGJhckNvbmZpZ3VyYXRpb248L2tleT4KKwkJCTxzdHJpbmc+eGNvZGUudG9vbGJhci5jb25maWcuYnJlYWtwb2ludHNWMzwvc3RyaW5nPgorCQkJPGtleT5XaW5kb3dTdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+NDYxIDU0MCA3NDQgNDA5IDAgMCAxNjgwIDEwMjggPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xHVUlEPC9rZXk+CisJCQk8c3RyaW5nPjFBOEM1NDU5MTIyNDQxNzMwMDhBMUQ0NDwvc3RyaW5nPgorCQkJPGtleT5XaW5kb3dUb29sSXNWaXNpYmxlPC9rZXk+CisJCQk8ZmFsc2UvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8c3RyaW5nPndpbmRvd1Rvb2wuZGVidWdBbmltYXRvcjwvc3RyaW5nPgorCQkJPGtleT5MYXlvdXQ8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5Eb2NrPC9rZXk+CisJCQkJCTxhcnJheT4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQkJCQkJPHN0cmluZz5QQlhOYXZpZ2F0b3JHcm91cDwvc3RyaW5nPgorCQkJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQkJCTxzdHJpbmc+MTAwJTwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz4xMDAlPC9zdHJpbmc+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5EZWJ1ZyBWaXN1YWxpemVyPC9zdHJpbmc+CisJCQk8a2V5PlNlcnZpY2VDbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5QQlhOYXZpZ2F0b3JHcm91cDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+U3RhdHVzYmFySXNWaXNpYmxlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5Ub29sYmFyQ29uZmlndXJhdGlvbjwva2V5PgorCQkJPHN0cmluZz54Y29kZS50b29sYmFyLmNvbmZpZy5kZWJ1Z0FuaW1hdG9yVjM8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93U3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPjEwMCAxMDAgNzAwIDUwMCAwIDAgMTI4MCAxMDAyIDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8c3RyaW5nPndpbmRvd1Rvb2wuYm9va21hcmtzPC9zdHJpbmc+CisJCQk8a2V5PkxheW91dDwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkRvY2s8L2tleT4KKwkJCQkJPGFycmF5PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlBCWEJvb2ttYXJrc01vZHVsZTwvc3RyaW5nPgorCQkJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQkJCTxzdHJpbmc+MTAwJTwvc3RyaW5nPgorCQkJCQkJPC9kaWN0PgorCQkJCQk8L2FycmF5PgorCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJPHN0cmluZz4xMDAlPC9zdHJpbmc+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5Cb29rbWFya3M8L3N0cmluZz4KKwkJCTxrZXk+U2VydmljZUNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPlBCWEJvb2ttYXJrc01vZHVsZTwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+U3RhdHVzYmFySXNWaXNpYmxlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5XaW5kb3dTdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+NTM4IDQyIDQwMSAxODcgMCAwIDEyODAgMTAwMiA8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPHN0cmluZz53aW5kb3dUb29sLnByb2plY3RGb3JtYXRDb25mbGljdHM8L3N0cmluZz4KKwkJCTxrZXk+TGF5b3V0PC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+RG9jazwva2V5PgorCQkJCQk8YXJyYXk+CisJCQkJCQk8ZGljdD4KKwkJCQkJCQk8a2V5Pk1vZHVsZTwva2V5PgorCQkJCQkJCTxzdHJpbmc+WENQcm9qZWN0Rm9ybWF0Q29uZmxpY3RzTW9kdWxlPC9zdHJpbmc+CisJCQkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCQkJPHN0cmluZz4xMDAlPC9zdHJpbmc+CisJCQkJCQk8L2RpY3Q+CisJCQkJCTwvYXJyYXk+CisJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQk8c3RyaW5nPjEwMCU8L3N0cmluZz4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OYW1lPC9rZXk+CisJCQk8c3RyaW5nPlByb2plY3QgRm9ybWF0IENvbmZsaWN0czwvc3RyaW5nPgorCQkJPGtleT5TZXJ2aWNlQ2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+WENQcm9qZWN0Rm9ybWF0Q29uZmxpY3RzTW9kdWxlPC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT5TdGF0dXNiYXJJc1Zpc2libGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PldpbmRvd0NvbnRlbnRNaW5TaXplPC9rZXk+CisJCQk8c3RyaW5nPjQ1MCAzMDA8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93U3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPjUwIDg1MCA0NzIgMzA3IDAgMCAxNDQwIDg3Nzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8c3RyaW5nPndpbmRvd1Rvb2wuY2xhc3NCcm93c2VyPC9zdHJpbmc+CisJCQk8a2V5PkxheW91dDwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkRvY2s8L2tleT4KKwkJCQkJPGFycmF5PgorCQkJCQkJPGRpY3Q+CisJCQkJCQkJPGtleT5CZWNvbWVBY3RpdmU8L2tleT4KKwkJCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJCQkJCTxrZXk+Q29udGVudENvbmZpZ3VyYXRpb248L2tleT4KKwkJCQkJCQk8ZGljdD4KKwkJCQkJCQkJPGtleT5PcHRpb25zU2V0TmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPkhpZXJhcmNoeSwgYWxsIGNsYXNzZXM8L3N0cmluZz4KKwkJCQkJCQkJPGtleT5QQlhQcm9qZWN0TW9kdWxlR1VJRDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPjFDQTY0NTZFMDYzQjQ1QjQwMDEzNzlEODwvc3RyaW5nPgorCQkJCQkJCQk8a2V5PlBCWFByb2plY3RNb2R1bGVMYWJlbDwva2V5PgorCQkJCQkJCQk8c3RyaW5nPkNsYXNzIEJyb3dzZXIgLSBOU09iamVjdDwvc3RyaW5nPgorCQkJCQkJCTwvZGljdD4KKwkJCQkJCQk8a2V5Pkdlb21ldHJ5Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PkNsYXNzZXNGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MCwgMH0sIHszNzQsIDk2fX08L3N0cmluZz4KKwkJCQkJCQkJPGtleT5DbGFzc2VzVHJlZVRhYmxlQ29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCQk8c3RyaW5nPlBCWENsYXNzTmFtZUNvbHVtbklkZW50aWZpZXI8L3N0cmluZz4KKwkJCQkJCQkJCTxyZWFsPjIwODwvcmVhbD4KKwkJCQkJCQkJCTxzdHJpbmc+UEJYQ2xhc3NCb29rQ29sdW1uSWRlbnRpZmllcjwvc3RyaW5nPgorCQkJCQkJCQkJPHJlYWw+MjI8L3JlYWw+CisJCQkJCQkJCTwvYXJyYXk+CisJCQkJCQkJCTxrZXk+RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz57ezAsIDB9LCB7NjMwLCAzMzF9fTwvc3RyaW5nPgorCQkJCQkJCQk8a2V5Pk1lbWJlcnNGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPnt7MCwgMTA1fSwgezM3NCwgMzk1fX08L3N0cmluZz4KKwkJCQkJCQkJPGtleT5NZW1iZXJzVHJlZVRhYmxlQ29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCQk8YXJyYXk+CisJCQkJCQkJCQk8c3RyaW5nPlBCWE1lbWJlclR5cGVJY29uQ29sdW1uSWRlbnRpZmllcjwvc3RyaW5nPgorCQkJCQkJCQkJPHJlYWw+MjI8L3JlYWw+CisJCQkJCQkJCQk8c3RyaW5nPlBCWE1lbWJlck5hbWVDb2x1bW5JZGVudGlmaWVyPC9zdHJpbmc+CisJCQkJCQkJCQk8cmVhbD4yMTY8L3JlYWw+CisJCQkJCQkJCQk8c3RyaW5nPlBCWE1lbWJlclR5cGVDb2x1bW5JZGVudGlmaWVyPC9zdHJpbmc+CisJCQkJCQkJCQk8cmVhbD45NzwvcmVhbD4KKwkJCQkJCQkJCTxzdHJpbmc+UEJYTWVtYmVyQm9va0NvbHVtbklkZW50aWZpZXI8L3N0cmluZz4KKwkJCQkJCQkJCTxyZWFsPjIyPC9yZWFsPgorCQkJCQkJCQk8L2FycmF5PgorCQkJCQkJCQk8a2V5PlBCWE1vZHVsZVdpbmRvd1N0YXR1c0JhckhpZGRlbjI8L2tleT4KKwkJCQkJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCQkJCQkJPGtleT5SdWJiZXJXaW5kb3dGcmFtZTwva2V5PgorCQkJCQkJCQk8c3RyaW5nPjM4NSAxNzkgNjMwIDM1MiAwIDAgMTQ0MCA4NzggPC9zdHJpbmc+CisJCQkJCQkJPC9kaWN0PgorCQkJCQkJCTxrZXk+TW9kdWxlPC9rZXk+CisJCQkJCQkJPHN0cmluZz5QQlhDbGFzc0Jyb3dzZXJNb2R1bGU8L3N0cmluZz4KKwkJCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJCQk8c3RyaW5nPjMzMnB0PC9zdHJpbmc+CisJCQkJCQk8L2RpY3Q+CisJCQkJCTwvYXJyYXk+CisJCQkJCTxrZXk+UHJvcG9ydGlvbjwva2V5PgorCQkJCQk8c3RyaW5nPjMzMnB0PC9zdHJpbmc+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TmFtZTwva2V5PgorCQkJPHN0cmluZz5DbGFzcyBCcm93c2VyPC9zdHJpbmc+CisJCQk8a2V5PlNlcnZpY2VDbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5QQlhDbGFzc0Jyb3dzZXJNb2R1bGU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PlN0YXR1c2JhcklzVmlzaWJsZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+VGFibGVPZkNvbnRlbnRzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz4xQzBBRDJBRjA2OUYxRTlCMDBGQUJDRTY8L3N0cmluZz4KKwkJCQk8c3RyaW5nPjFDMEFEMkIwMDY5RjFFOUIwMEZBQkNFNjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+MUNBNjQ1NkUwNjNCNDVCNDAwMTM3OUQ4PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT5Ub29sYmFyQ29uZmlndXJhdGlvbjwva2V5PgorCQkJPHN0cmluZz54Y29kZS50b29sYmFyLmNvbmZpZy5jbGFzc2Jyb3dzZXI8L3N0cmluZz4KKwkJCTxrZXk+V2luZG93U3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPjM4NSAxNzkgNjMwIDM1MiAwIDAgMTQ0MCA4NzggPC9zdHJpbmc+CisJCQk8a2V5PldpbmRvd1Rvb2xHVUlEPC9rZXk+CisJCQk8c3RyaW5nPjFDMEFEMkFGMDY5RjFFOUIwMEZBQkNFNjwvc3RyaW5nPgorCQkJPGtleT5XaW5kb3dUb29sSXNWaXNpYmxlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8c3RyaW5nPndpbmRvd1Rvb2wucmVmYWN0b3Jpbmc8L3N0cmluZz4KKwkJCTxrZXk+SW5jbHVkZUluVG9vbHNNZW51PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5MYXlvdXQ8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5Eb2NrPC9rZXk+CisJCQkJCTxhcnJheT4KKwkJCQkJCTxkaWN0PgorCQkJCQkJCTxrZXk+QmVjb21lQWN0aXZlPC9rZXk+CisJCQkJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCQkJCQk8a2V5Pkdlb21ldHJ5Q29uZmlndXJhdGlvbjwva2V5PgorCQkJCQkJCTxkaWN0PgorCQkJCQkJCQk8a2V5PkZyYW1lPC9rZXk+CisJCQkJCQkJCTxzdHJpbmc+ezAsIDB9LCB7NTAwLCAzMzV9PC9zdHJpbmc+CisJCQkJCQkJCTxrZXk+UnViYmVyV2luZG93RnJhbWU8L2tleT4KKwkJCQkJCQkJPHN0cmluZz57MCwgMH0sIHs1MDAsIDMzNX08L3N0cmluZz4KKwkJCQkJCQk8L2RpY3Q+CisJCQkJCQkJPGtleT5Nb2R1bGU8L2tleT4KKwkJCQkJCQk8c3RyaW5nPlhDUmVmYWN0b3JpbmdNb2R1bGU8L3N0cmluZz4KKwkJCQkJCQk8a2V5PlByb3BvcnRpb248L2tleT4KKwkJCQkJCQk8c3RyaW5nPjEwMCU8L3N0cmluZz4KKwkJCQkJCTwvZGljdD4KKwkJCQkJPC9hcnJheT4KKwkJCQkJPGtleT5Qcm9wb3J0aW9uPC9rZXk+CisJCQkJCTxzdHJpbmc+MTAwJTwvc3RyaW5nPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5hbWU8L2tleT4KKwkJCTxzdHJpbmc+UmVmYWN0b3Jpbmc8L3N0cmluZz4KKwkJCTxrZXk+U2VydmljZUNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPlhDUmVmYWN0b3JpbmdNb2R1bGU8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PldpbmRvd1N0cmluZzwva2V5PgorCQkJPHN0cmluZz4yMDAgMjAwIDUwMCAzNTYgMCAwIDE5MjAgMTIwMCA8L3N0cmluZz4KKwkJPC9kaWN0PgorCTwvYXJyYXk+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIueGNvZGVwcm9qL2Fjb25kaXQucGJ4dXNlciBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLnhjb2RlcHJvai9hY29uZGl0LnBieHVzZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1MjI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLnhjb2RlcHJvai9hY29uZGl0LnBieHVzZXIKQEAgLTAsMCArMSwzNDQ3IEBACisvLyAhJCpVVEY4KiQhCit7CisJMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovID0geworCQlhY3RpdmVCdWlsZENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCWFjdGl2ZUV4ZWN1dGFibGUgPSAxQTBGMzQ2NzEyRUE0MkQ4MDA0OTZCQjggLyogcG9seWRpZmYgKi87CisJCWFjdGl2ZVRhcmdldCA9IDFBMEYzNDU3MTJFQTQyRDgwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLzsKKwkJYWRkVG9UYXJnZXRzID0gKAorCQkJOERDMkVGNEYwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSICovLAorCQkJRjc2Mjg3M0YwQjcxNTE5QjAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgYWxsIGV4YW1wbGVzICovLAorCQkJMUEwRjM0NTcxMkVBNDJEODAwNDk2QkI4IC8qIHBvbHlkaWZmICovLAorCQkpOworCQlicmVha3BvaW50cyA9ICgKKwkJCTFBOEM1NDRCMTIyNDQxMDAwMDhBMUQ0NCAvKiBtYWluLm06NTUgKi8sCisJCQkxQThDNTQ5RTEyMjQ0RjI0MDA4QTFENDQgLyogbWFpbi5tOjY5ICovLAorCQkJMUE4QzU0QkExMjI0NjA2MjAwOEExRDQ0IC8qIFNpbXBsZUNXYWxrZXIubTozMTIgKi8sCisJCQkxQThDNTRCRTEyMjQ2MEMxMDA4QTFENDQgLyogU2ltcGxlQ1dhbGtlci5tOjMyMiAqLywKKwkJCTFBOEM1NEMwMTIyNDYwQ0QwMDhBMUQ0NCAvKiBTaW1wbGVDV2Fsa2VyLm06MzMxICovLAorCQkJMUE4QzU0QzMxMjI0NjI4QTAwOEExRDQ0IC8qIFNpbXBsZUNXYWxrZXIubTo2NzQgKi8sCisJCQkxQThDNTRDNTEyMjQ2MzU3MDA4QTFENDQgLyogU2ltcGxlQ1dhbGtlci5tOjg0NiAqLywKKwkJCTFBREUyMjQ0MTJFNTEwRjgwMEU4QTk1QyAvKiBTaW1wbGVDUGFyc2VyLm06MzY2ICovLAorCQkJMUFCQ0VGQkIxMkU2MTlENzAwODY2RjMxIC8qIFN5bWJvbFRhYmxlUGFyc2VyLm06NTQ0ICovLAorCQkJMUE5OEJBQjYxMkU2NDEzNzAwMUZENkVDIC8qIFN5bWJvbFRhYmxlUGFyc2VyLm06MjU1ICovLAorCQkJMUE5Q0Y2RDUxMkU2NUNGMDAwN0E2QTEzIC8qIG1haW4ubToxOCAqLywKKwkJCTFBOUNGNkQ5MTJFNjVEMDgwMDdBNkExMyAvKiBtYWluLm06OSAqLywKKwkJCTFBREI2Njk2MTJFNzNEQjEwMDdDMTY2MSAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tOjcxICovLAorCQkJMUFEQjY2OTgxMkU3M0RCODAwN0MxNjYxIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm06MzYgKi8sCisJCQkxQURCNjY5QTEyRTczREJBMDA3QzE2NjEgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTo1MSAqLywKKwkJCTFBREI2NkQ0MTJFNzQwMzIwMDdDMTY2MSAvKiBtYWluLm06MjIgKi8sCisJCQkxQURCNjdBQzEyRTc0QkIxMDA3QzE2NjEgLyogRnV6enlMZXhlci5tOjEzNDAgKi8sCisJCQkxQTg2Rjc5MDEyRTdFMjAxMDA4OTRFQkUgLyogbWFpbi5tOjQzICovLAorCQkJMUE4NkY3OUMxMkU3RTVDOTAwODk0RUJFIC8qIG1haW4ubTo0OSAqLywKKwkJCTFBODZGN0JCMTJFN0U4QzQwMDg5NEVCRSAvKiBMYW5nRHVtcERlY2wubToxNjQgKi8sCisJCQkxQTg2RjdDNDEyRTdFOUU0MDA4OTRFQkUgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5tOjI5MSAqLywKKwkJKTsKKwkJY29kZVNlbnNlTWFuYWdlciA9IDFBRkY0MjZBMTFCMDZEODEwMDYzOUMyMiAvKiBDb2RlIHNlbnNlICovOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBRkY0MjU0MTFCMDZENTAwMDYzOUMyMiAvKiBjb21iaW5lZCAqLywKKwkJCTFBRkY0MjUzMTFCMDZENTAwMDYzOUMyMiAvKiBmdXp6eSAqLywKKwkJCTFBRkY0MjU2MTFCMDZENTAwMDYzOUMyMiAvKiBob2lzdGVkUHJlZGljYXRlcyAqLywKKwkJCTFBRkY0MjUyMTFCMDZENTAwMDYzOUMyMiAvKiBsZXhlcnRlc3Qtc2ltcGxlICovLAorCQkJMUFGRjQyNTUxMUIwNkQ1MDAwNjM5QzIyIC8qIExMLXN0YXIgKi8sCisJCQkxQTBGMzQ2NzEyRUE0MkQ4MDA0OTZCQjggLyogcG9seWRpZmYgKi8sCisJCQkxQUZGNDI1NzExQjA2RDUwMDA2MzlDMjIgLyogc2NvcGVzICovLAorCQkJMUFGRjQyNTgxMUIwNkQ1MDAwNjM5QzIyIC8qIHNpbXBsZWN0cmVlICovLAorCQkJMUFDNUFDQTgxMkU3QkVGRTAwREYwQzU4IC8qIHRyZWVwYXJzZXIgKi8sCisJCQkxQUZGNDI1OTExQjA2RDUwMDA2MzlDMjIgLyogdHJlZXJld3JpdGUgKi8sCisJCSk7CisJCXBlclVzZXJEaWN0aW9uYXJ5ID0geworCQkJIlBCWENvbmZpZ3VyYXRpb24uUEJYQnJlYWtwb2ludHNEYXRhU291cmNlLnYxOjFDQTFBRUQ3MDYzOThFQkQwMDU4OTE0NyIgPSB7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtblNvcnRpbmdEaXJlY3Rpb25LZXkgPSAiLTEiOworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5Tb3J0aW5nS2V5ID0gUEJYQnJlYWtwb2ludHNEYXRhU291cmNlX0JyZWFrcG9pbnRJRDsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uV2lkdGhzS2V5ID0gKAorCQkJCQkyMCwKKwkJCQkJMjAsCisJCQkJCTE3MSwKKwkJCQkJMjAsCisJCQkJCTcyLAorCQkJCQk3MiwKKwkJCQkJMTAsCisJCQkJCTIwLAorCQkJCSk7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtbnNLZXkgPSAoCisJCQkJCVBCWEJyZWFrcG9pbnRzRGF0YVNvdXJjZV9BY3Rpb25JRCwKKwkJCQkJUEJYQnJlYWtwb2ludHNEYXRhU291cmNlX1R5cGVJRCwKKwkJCQkJUEJYQnJlYWtwb2ludHNEYXRhU291cmNlX0JyZWFrcG9pbnRJRCwKKwkJCQkJUEJYQnJlYWtwb2ludHNEYXRhU291cmNlX1VzZUlELAorCQkJCQlQQlhCcmVha3BvaW50c0RhdGFTb3VyY2VfTG9jYXRpb25JRCwKKwkJCQkJUEJYQnJlYWtwb2ludHNEYXRhU291cmNlX0NvbmRpdGlvbklELAorCQkJCQlQQlhCcmVha3BvaW50c0RhdGFTb3VyY2VfSWdub3JlQ291bnRJRCwKKwkJCQkJUEJYQnJlYWtwb2ludHNEYXRhU291cmNlX0NvbnRpbnVlSUQsCisJCQkJKTsKKwkJCX07CisJCQlQQlhDb25maWd1cmF0aW9uLlBCWEZpbGVUYWJsZURhdGFTb3VyY2UzLlBCWEV4ZWN1dGFibGVzRGF0YVNvdXJjZSA9IHsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uU29ydGluZ0RpcmVjdGlvbktleSA9ICItMSI7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtblNvcnRpbmdLZXkgPSBQQlhFeGVjdXRhYmxlc0RhdGFTb3VyY2VfTmFtZUlEOworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5XaWR0aHNLZXkgPSAoCisJCQkJCTIyLAorCQkJCQkzMDAsCisJCQkJCTUyMywKKwkJCQkpOworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5zS2V5ID0gKAorCQkJCQlQQlhFeGVjdXRhYmxlc0RhdGFTb3VyY2VfQWN0aXZlRmxhZ0lELAorCQkJCQlQQlhFeGVjdXRhYmxlc0RhdGFTb3VyY2VfTmFtZUlELAorCQkJCQlQQlhFeGVjdXRhYmxlc0RhdGFTb3VyY2VfQ29tbWVudHNJRCwKKwkJCQkpOworCQkJfTsKKwkJCVBCWENvbmZpZ3VyYXRpb24uUEJYRmlsZVRhYmxlRGF0YVNvdXJjZTMuUEJYRmlsZVRhYmxlRGF0YVNvdXJjZSA9IHsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uU29ydGluZ0RpcmVjdGlvbktleSA9ICItMSI7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtblNvcnRpbmdLZXkgPSBQQlhGaWxlRGF0YVNvdXJjZV9GaWxlbmFtZV9Db2x1bW5JRDsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uV2lkdGhzS2V5ID0gKAorCQkJCQkyMCwKKwkJCQkJNjM1LAorCQkJCQkyMCwKKwkJCQkJNDgsCisJCQkJCTQzLAorCQkJCQk0MywKKwkJCQkJMjAsCisJCQkJKTsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uc0tleSA9ICgKKwkJCQkJUEJYRmlsZURhdGFTb3VyY2VfRmlsZXR5cGVJRCwKKwkJCQkJUEJYRmlsZURhdGFTb3VyY2VfRmlsZW5hbWVfQ29sdW1uSUQsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX0J1aWx0X0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9PYmplY3RTaXplX0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9FcnJvcnNfQ29sdW1uSUQsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX1dhcm5pbmdzX0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9UYXJnZXRfQ29sdW1uSUQsCisJCQkJKTsKKwkJCX07CisJCQlQQlhDb25maWd1cmF0aW9uLlBCWEZpbGVUYWJsZURhdGFTb3VyY2UzLlBCWEZpbmREYXRhU291cmNlID0geworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5Tb3J0aW5nRGlyZWN0aW9uS2V5ID0gIi0xIjsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uU29ydGluZ0tleSA9IFBCWEZpbmREYXRhU291cmNlX0xvY2F0aW9uSUQ7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtbldpZHRoc0tleSA9ICgKKwkJCQkJMjAwLAorCQkJCQk0NzQsCisJCQkJKTsKKwkJCQlQQlhGaWxlVGFibGVEYXRhU291cmNlQ29sdW1uc0tleSA9ICgKKwkJCQkJUEJYRmluZERhdGFTb3VyY2VfTWVzc2FnZUlELAorCQkJCQlQQlhGaW5kRGF0YVNvdXJjZV9Mb2NhdGlvbklELAorCQkJCSk7CisJCQl9OworCQkJUEJYQ29uZmlndXJhdGlvbi5QQlhGaWxlVGFibGVEYXRhU291cmNlMy5YQ1NDTURhdGFTb3VyY2UgPSB7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtblNvcnRpbmdEaXJlY3Rpb25LZXkgPSAiLTEiOworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5Tb3J0aW5nS2V5ID0gUEJYRmlsZURhdGFTb3VyY2VfRmlsZW5hbWVfQ29sdW1uSUQ7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtbldpZHRoc0tleSA9ICgKKwkJCQkJMjAsCisJCQkJCTIwLAorCQkJCQk2MTEsCisJCQkJCTIwLAorCQkJCQk0OC4xNjI1OTc2NTYyNSwKKwkJCQkJNDMsCisJCQkJCTQzLAorCQkJCQkyMCwKKwkJCQkpOworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5zS2V5ID0gKAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9TQ01fQ29sdW1uSUQsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX0ZpbGV0eXBlSUQsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX0ZpbGVuYW1lX0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9CdWlsdF9Db2x1bW5JRCwKKwkJCQkJUEJYRmlsZURhdGFTb3VyY2VfT2JqZWN0U2l6ZV9Db2x1bW5JRCwKKwkJCQkJUEJYRmlsZURhdGFTb3VyY2VfRXJyb3JzX0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9XYXJuaW5nc19Db2x1bW5JRCwKKwkJCQkJUEJYRmlsZURhdGFTb3VyY2VfVGFyZ2V0X0NvbHVtbklELAorCQkJCSk7CisJCQl9OworCQkJUEJYQ29uZmlndXJhdGlvbi5QQlhUYXJnZXREYXRhU291cmNlLlBCWFRhcmdldERhdGFTb3VyY2UgPSB7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtblNvcnRpbmdEaXJlY3Rpb25LZXkgPSAxOworCQkJCVBCWEZpbGVUYWJsZURhdGFTb3VyY2VDb2x1bW5Tb3J0aW5nS2V5ID0gUEJYRmlsZURhdGFTb3VyY2VfRmlsZW5hbWVfQ29sdW1uSUQ7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtbldpZHRoc0tleSA9ICgKKwkJCQkJMjAsCisJCQkJCTU5NSwKKwkJCQkJNjAsCisJCQkJCTIwLAorCQkJCQk0OCwKKwkJCQkJNDMsCisJCQkJCTQzLAorCQkJCSk7CisJCQkJUEJYRmlsZVRhYmxlRGF0YVNvdXJjZUNvbHVtbnNLZXkgPSAoCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX0ZpbGV0eXBlSUQsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX0ZpbGVuYW1lX0NvbHVtbklELAorCQkJCQlQQlhUYXJnZXREYXRhU291cmNlX1ByaW1hcnlBdHRyaWJ1dGUsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX0J1aWx0X0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9PYmplY3RTaXplX0NvbHVtbklELAorCQkJCQlQQlhGaWxlRGF0YVNvdXJjZV9FcnJvcnNfQ29sdW1uSUQsCisJCQkJCVBCWEZpbGVEYXRhU291cmNlX1dhcm5pbmdzX0NvbHVtbklELAorCQkJCSk7CisJCQl9OworCQkJUEJYUGVyUHJvamVjdFRlbXBsYXRlU3RhdGVTYXZlRGF0ZSA9IDMxNzQwMjQyMTsKKwkJCVBCWFdvcmtzcGFjZVN0YXRlU2F2ZURhdGUgPSAzMTc0MDI0MjE7CisJCX07CisJCXBlclVzZXJQcm9qZWN0SXRlbXMgPSB7CisJCQkxQTAxQkQ0NDEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJENDQxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCRDQ3MTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkQ0NzEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJENEExMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCRDRBMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkQ0QjEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJENEIxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCRDRDMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkQ0QzEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJENEQxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCRDREMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkQ0RjEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJENEYxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCRDUwMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkQ1MDEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJENTExMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCRDUxMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkQ1MjEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJENTIxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCRDUzMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkQ1MzEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJENTQxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCRDU0MTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkQ1NTEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJENTUxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCRDVEMTJFQjU3RkMwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkQ1RDEyRUI1N0ZDMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJENUUxMkVCNTdGQzAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCRDVFMTJFQjU3RkMwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkQ2MDEyRUI1N0ZDMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJENjAxMkVCNTdGQzAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCREI4MTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkRCODEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJEQjkxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCREI5MTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkRCQTEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJEQkExMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCREJCMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkRCQjEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJEQkMxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCREJDMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkRCRTEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJEQkUxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCREJGMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkRCRjEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJEQzAxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCREMwMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkRDMTEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJEQzExMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCREMzMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkRDMzEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJEQzQxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCREM0MTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkRFNDEyRUI2QkVEMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJERTQxMkVCNkJFRDAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBMDFCREY0MTJFQjcwMjUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQTAxQkRGNDEyRUI3MDI1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUEwMUJERjUxMkVCNzAyNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBMDFCREY1MTJFQjcwMjUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQTAxQkUwMzEyRUI3MzdCMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUEwMUJFMDMxMkVCNzM3QjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBQTg2RkY3MTJFQTc4NTIwMEUxN0E0QyAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQUE4NkZGNzEyRUE3ODUyMDBFMTdBNEMgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQkJMUFBODcxMDMxMkVBOTY3NzAwRTE3QTRDIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IDFBQTg3MTAzMTJFQTk2NzcwMEUxN0E0QyAvKiBQQlhUZXh0Qm9va21hcmsgKi87CisJCQkxQUE4NzEwRTEyRUFBMUZFMDBFMTdBNEMgLyogUEJYVGV4dEJvb2ttYXJrICovID0gMUFBODcxMEUxMkVBQTFGRTAwRTE3QTRDIC8qIFBCWFRleHRCb29rbWFyayAqLzsKKwkJCTFBQTg3MTExMTJFQUExRkUwMEUxN0E0QyAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSAxQUE4NzExMTEyRUFBMUZFMDBFMTdBNEMgLyogUEJYVGV4dEJvb2ttYXJrICovOworCQl9OworCQlzb3VyY2VDb250cm9sTWFuYWdlciA9IDFBRkY0MjY5MTFCMDZEODEwMDYzOUMyMiAvKiBTb3VyY2UgQ29udHJvbCAqLzsKKwkJdXNlckJ1aWxkU2V0dGluZ3MgPSB7CisJCX07CisJfTsKKwkxQTAxQkQ0NDEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSAxQTBGMzQzMTEyRUE0MTFGMDA0OTZCQjggLyogb3V0cHV0ICovOworCQluYW1lID0gIm91dHB1dDogMSI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMDsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDIyNzsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJENDcxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gMUEwRjM0N0QxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlQYXJzZXIubSAqLzsKKwkJbmFtZSA9ICJQb2x5UGFyc2VyLm06IDY5NiI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMjQ0NDE7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSAxMzE0OworCQl2ckxvYyA9IDE3ODAxOworCX07CisJMUEwMUJENEExMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gRjc5RDU2QzAwQTBFMjg3NTAwRUEzQ0VFIC8qIG1haW4ubSAqLzsKKwkJbmFtZSA9ICJtYWluLm06IDEzIjsKKwkJckxlbiA9IDE1OworCQlyTG9jID0gNTU2OworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gODQ4OworCQl2ckxvYyA9IDA7CisJfTsKKwkxQTAxQkQ0QjEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSBGN0REMDVFNzBBN0IxNTcyMDA2QTAwNkMgLyogbWFpbi5tICovOworCQluYW1lID0gIm1haW4ubTogMzAiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDk2ODsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDk2ODsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJENEMxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gRjdFOTgzOTQwQTBENkE1RjAwRjE2MDkzIC8qIG1haW4ubSAqLzsKKwkJbmFtZSA9ICJtYWluLm06IDIxIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSA1OTg7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSA2MzE7CisJCXZyTG9jID0gMDsKKwl9OworCTFBMDFCRDREMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3MDBFQ0U3MEE1RkUyNUQwMDVEMDc1NyAvKiBtYWluLm0gKi87CisJCW5hbWUgPSAibWFpbi5tOiAzMCI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gOTI4OworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gOTI4OworCQl2ckxvYyA9IDA7CisJfTsKKwkxQTAxQkQ0RjEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSBGN0REMDc4MDBBN0I2N0E3MDA2QTAwNkMgLyogbWFpbi5tICovOworCQluYW1lID0gIm1haW4ubTogMTQiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDQ4MjsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDk0MTsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJENTAxMkVCNTYyMjAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gRjcyQzVFNTYwQUI3RTQxMDAwMjgyNTc0IC8qIG1haW4ubSAqLzsKKwkJbmFtZSA9ICJtYWluLm06IDYyIjsKKwkJckxlbiA9IDE4OworCQlyTG9jID0gMjkxNjsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDE3MDE7CisJCXZyTG9jID0gMTY0NzsKKwl9OworCTFBMDFCRDUxMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBQzVBQzgxMTJFN0JDOTEwMERGMEM1OCAvKiBtYWluLm0gKi87CisJCW5hbWUgPSAibWFpbi5tOiA0NiI7CisJCXJMZW4gPSAxODsKKwkJckxvYyA9IDE2Mjc7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSAxMTQ0OworCQl2ckxvYyA9IDY4NDsKKwl9OworCTFBMDFCRDUyMTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3Q0Q0NUZDMEM2NEJBNEIwMEZGOTMzQSAvKiBtYWluLm0gKi87CisJCW5hbWUgPSAibWFpbi5tOiA5IjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAxNTg7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSAxMTU3OworCQl2ckxvYyA9IDA7CisJfTsKKwkxQTAxQkQ1MzEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSBGNzM4RDM1RjBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRQYXJzZXIuaCAqLzsKKwkJbmFtZSA9ICJDb21iaW5lZFBhcnNlci5oOiAxNCI7CisJCXJMZW4gPSAxMjsKKwkJckxvYyA9IDQwNzsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDU1MjsKKwkJdnJMb2MgPSA0ODM7CisJfTsKKwkxQTAxQkQ1NDEyRUI1NjIyMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSBGNzAwRThGOTBBNUZBRDIxMDA1RDA3NTcgLyogQU5UTFJQYXJzZXIuaCAqLzsKKwkJbmFtZSA9ICJBTlRMUlBhcnNlci5oOiA1NyI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMjY0OTsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDEyMTE7CisJCXZyTG9jID0gMTUwNjsKKwl9OworCTFBMDFCRDU1MTJFQjU2MjIwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3QTQwOThCMDk2NTlCRjMwMDJDQzc4MSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLmggKi87CisJCW5hbWUgPSAiQU5UTFJCYXNlUmVjb2duaXplci5oOiAxNzAiOworCQlyTGVuID0gMTI1OworCQlyTG9jID0gNzM4MTsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDE0NTE7CisJCXZyTG9jID0gMjI0MTsKKwl9OworCTFBMDFCRDVEMTJFQjU3RkMwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3QTQwOTkyMDk2NTlCRkIwMDJDQzc4MSAvKiBBTlRMUkxleGVyLm0gKi87CisJCW5hbWUgPSAiQU5UTFJMZXhlci5tOiA3MSI7CisJCXJMZW4gPSAxMzsKKwkJckxvYyA9IDI0Nzg7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSA5NDg7CisJCXZyTG9jID0gMTIxNTsKKwl9OworCTFBMDFCRDVFMTJFQjU3RkMwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3MzhEMzVEMEIwN0MxMDUwMDE4MTNDNCAvKiBDb21iaW5lZExleGVyLmggKi87CisJCW5hbWUgPSAiQ29tYmluZWRMZXhlci5oOiAxOCI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gNTEwOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gNjU1OworCQl2ckxvYyA9IDI1MTsKKwl9OworCTFBMDFCRDYwMTJFQjU3RkMwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3QTQwOTkxMDk2NTlCRkIwMDJDQzc4MSAvKiBBTlRMUkxleGVyLmggKi87CisJCW5hbWUgPSAiQU5UTFJMZXhlci5oOiAyIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSA3NzsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDEwMjM7CisJCXZyTG9jID0gMTYzMDsKKwl9OworCTFBMDFCREI4MTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3MzhEMzVFMEIwN0MxMDUwMDE4MTNDNCAvKiBDb21iaW5lZExleGVyLm0gKi87CisJCW5hbWUgPSAiQ29tYmluZWRMZXhlci5tOiAxIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAwOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gMTE5MTsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJEQjkxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gRjdBNDA5OEMwOTY1OUJGMzAwMkNDNzgxIC8qIEFOVExSQmFzZVJlY29nbml6ZXIubSAqLzsKKwkJbmFtZSA9ICJBTlRMUkJhc2VSZWNvZ25pemVyLm06IDExMDEiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDQwMTAwOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gNzE1OworCQl2ckxvYyA9IDE4MDE7CisJfTsKKwkxQTAxQkRCQTEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSBGNzM4RDM2MDBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRQYXJzZXIubSAqLzsKKwkJbmFtZSA9ICJDb21iaW5lZFBhcnNlci5tOiAyMDkiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDYxNzU7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSAxMDkyOworCQl2ckxvYyA9IDI3NDk7CisJfTsKKwkxQTAxQkRCQjEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSBGNzAwRTg2QTBBNUZBMzREMDA1RDA3NTcgLyogbWFpbi5tICovOworCQluYW1lID0gIm1haW4ubTogMTMiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDQyNzsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDc0ODsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJEQkMxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gMUEwRjM0NzkxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5tICovOworCQluYW1lID0gIlBvbHlEaWZmZXJlbnRpYXRvci5tOiAxIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAwOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gMDsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJEQkUxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gMUEwRjM0MzAxMkVBNDExRjAwNDk2QkI4IC8qIE1haW4ubSAqLzsKKwkJbmFtZSA9ICJNYWluLm06IDIzIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSA4MTQ7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSAxMjk3OworCQl2ckxvYyA9IDUwNjsKKwl9OworCTFBMDFCREJGMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBMEYzNDdFMTJFQTQ0NDUwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLmggKi87CisJCW5hbWUgPSAiU2ltcGxpZmllci5oOiAxIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAwOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gMTEwMzsKKwkJdnJMb2MgPSA4NzI7CisJfTsKKwkxQTAxQkRDMDEyRUI2M0E1MDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSAxQTBGMzQzMzEyRUE0MTFGMDA0OTZCQjggLyogUG9seURpZmZlcmVudGlhdG9yLmcgKi87CisJCW5hbWUgPSAiUG9seURpZmZlcmVudGlhdG9yLmc6IDEwIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAyMTY7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSA3MzU7CisJCXZyTG9jID0gMDsKKwl9OworCTFBMDFCREMxMTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBMEYzNDM0MTJFQTQxMUYwMDQ5NkJCOCAvKiBQb2x5UHJpbnRlci5nICovOworCQluYW1lID0gIlBvbHlQcmludGVyLmc6IDkiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDE1NTsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDQyMzsKKwkJdnJMb2MgPSAwOworCX07CisJMUEwMUJEQzMxMkVCNjNBNTAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gMUEwRjM0N0ExMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlMZXhlci5oICovOworCQluYW1lID0gIlBvbHlMZXhlci5oOiAzNiI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gODgyOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gNTk2OworCQl2ckxvYyA9IDM3OTsKKwl9OworCTFBMDFCREM0MTJFQjYzQTUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBMEYzNDdCMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5TGV4ZXIubSAqLzsKKwkJbmFtZSA9ICJQb2x5TGV4ZXIubTogMSI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMDsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDc0MDsKKwkJdnJMb2MgPSAyMDM4OworCX07CisJMUEwMUJERTQxMkVCNkJFRDAwNDI4NzkyIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gMUEwRjM0MzIxMkVBNDExRjAwNDk2QkI4IC8qIFBvbHkuZyAqLzsKKwkJbmFtZSA9ICJQb2x5Lmc6IDEyIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAxOTY7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSA0MjE7CisJCXZyTG9jID0gMDsKKwl9OworCTFBMDFCREY0MTJFQjcwMjUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBMEYzNDdGMTJFQTQ0NDUwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLm0gKi87CisJCW5hbWUgPSAiU2ltcGxpZmllci5tOiA3NjAiOworCQlyTGVuID0gNjsKKwkJckxvYyA9IDM2MDg1OworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gMTc1NDsKKwkJdnJMb2MgPSAzNDg4MjsKKwl9OworCTFBMDFCREY1MTJFQjcwMjUwMDQyODc5MiAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBMEYzNDM1MTJFQTQxMUYwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLmcgKi87CisJCW5hbWUgPSAiU2ltcGxpZmllci5nOiAzMiI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMTA0NTsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDk1ODsKKwkJdnJMb2MgPSAxMzM7CisJfTsKKwkxQTAxQkUwMzEyRUI3MzdCMDA0Mjg3OTIgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSAxQTBGMzQzNTEyRUE0MTFGMDA0OTZCQjggLyogU2ltcGxpZmllci5nICovOworCQluYW1lID0gIlNpbXBsaWZpZXIuZzogMjUiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDg1NTsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDk1ODsKKwkJdnJMb2MgPSAxMzM7CisJfTsKKwkxQTBGMzQyRTEyRUE0MTFGMDA0OTZCQjggLyogaW5wdXQgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzcwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAzNX0iOworCQl9OworCX07CisJMUEwRjM0MzAxMkVBNDExRjAwNDk2QkI4IC8qIE1haW4ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTY0LCA2NjN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7ODE0LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NTA2LCAxMjk3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezQyLCAxN30sIHs5MzEsIDk4NX19IjsKKwkJfTsKKwl9OworCTFBMEYzNDMxMTJFQTQxMUYwMDQ5NkJCOCAvKiBvdXRwdXQgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzg0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAyMjd9IjsKKwkJfTsKKwl9OworCTFBMEYzNDMyMTJFQTQxMUYwMDQ5NkJCOCAvKiBQb2x5LmcgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzg0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE5NiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDQyMX0iOworCQl9OworCX07CisJMUEwRjM0MzMxMkVBNDExRjAwNDk2QkI4IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5nICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDM4NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyMTYsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA3MzV9IjsKKwkJfTsKKwl9OworCTFBMEYzNDM0MTJFQTQxMUYwMDQ5NkJCOCAvKiBQb2x5UHJpbnRlci5nICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDM4NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTUsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA0MjN9IjsKKwkJfTsKKwl9OworCTFBMEYzNDM1MTJFQTQxMUYwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLmcgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNDk0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezg1NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezEzMywgOTU4fSI7CisJCX07CisJfTsKKwkxQTBGMzQzQjEyRUE0MjU3MDA0OTZCQjggLyogUmVnZW5lcmF0ZSBwb2x5ZGlmZiAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwkxQTBGMzQ1NzEyRUE0MkQ4MDA0OTZCQjggLyogcG9seWRpZmYgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBMEYzNDY3MTJFQTQyRDgwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLywKKwkJKTsKKwl9OworCTFBMEYzNDY3MTJFQTQyRDgwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLyA9IHsKKwkJaXNhID0gUEJYRXhlY3V0YWJsZTsKKwkJYWN0aXZlQXJnSW5kaWNlcyA9ICgKKwkJKTsKKwkJYXJndW1lbnRTdHJpbmdzID0gKAorCQkpOworCQlhdXRvQXR0YWNoT25DcmFzaCA9IDE7CisJCWJyZWFrcG9pbnRzRW5hYmxlZCA9IDA7CisJCWNvbmZpZ1N0YXRlRGljdCA9IHsKKwkJfTsKKwkJY3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcEN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBTaG93VHlwZUNvbHVtbiA9IDE7CisJCWRhdGFUaXBTb3J0VHlwZSA9IDA7CisJCWRlYnVnZ2VyUGx1Z2luID0gR0RCRGVidWdnaW5nOworCQlkaXNhc3NlbWJseURpc3BsYXlTdGF0ZSA9IDA7CisJCWR5bGliVmFyaWFudFN1ZmZpeCA9ICIiOworCQllbmFibGVEZWJ1Z1N0ciA9IDE7CisJCWVudmlyb25tZW50RW50cmllcyA9ICgKKwkJKTsKKwkJZXhlY3V0YWJsZVN5c3RlbVN5bWJvbExldmVsID0gMDsKKwkJZXhlY3V0YWJsZVVzZXJTeW1ib2xMZXZlbCA9IDA7CisJCWxpYmdtYWxsb2NFbmFibGVkID0gMDsKKwkJbmFtZSA9IHBvbHlkaWZmOworCQlzYXZlZEdsb2JhbHMgPSB7CisJCX07CisJCXNob3dUeXBlQ29sdW1uID0gMDsKKwkJc291cmNlRGlyZWN0b3JpZXMgPSAoCisJCSk7CisJfTsKKwkxQTBGMzQ3OTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seURpZmZlcmVudGlhdG9yLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzg0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAwfSI7CisJCX07CisJfTsKKwkxQTBGMzQ3QTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNTQ2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezg4MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezM3OSwgNTk2fSI7CisJCX07CisJfTsKKwkxQTBGMzQ3QjEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezk5OSwgNTQ0N319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjAzOCwgNzQwfSI7CisJCX07CisJfTsKKwkxQTBGMzQ3QzEyRUE0NDQ1MDA0OTZCQjggLyogUG9seVBhcnNlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE0OTV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezczOCwgMTM4Nn0iOworCQl9OworCX07CisJMUEwRjM0N0QxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlQYXJzZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODgwLCA4OTA1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI0NDQxLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTc4MDEsIDEzMTR9IjsKKwkJfTsKKwl9OworCTFBMEYzNDdFMTJFQTQ0NDUwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMjEwNn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7ODcyLCAxMTAzfSI7CisJCX07CisJfTsKKwkxQTBGMzQ3RjEyRUE0NDQ1MDA0OTZCQjggLyogU2ltcGxpZmllci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxNDkyLCAxNzQ1OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns2MTA2OSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezU0ODU4LCA5OTJ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDM4fSwgezkzMSwgOTg1fX0iOworCQl9OworCX07CisJMUExMDBBQjkxMUU2MDRGRTAwNkFCRjk0IC8qIEFOVExSSGFzaFJ1bGUuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA5MjN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTQ5NiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezcwLCAxNDI2fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezQ4LCAxMn0sIHs3NzIsIDk4OX19IjsKKwkJfTsKKwl9OworCTFBMTAwQUJBMTFFNjA0RkUwMDZBQkY5NCAvKiBBTlRMUkhhc2hSdWxlLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzM4MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNDk3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTU3MywgNDM1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgzMywgMTV9LCB7ODIzLCA5ODJ9fSI7CisJCX07CisJfTsKKwkxQTEyMTBGQTExRDNBNUQ5MDBGMjdCMzggLyogQU5UTFJDb21tb25Ub2tlblRlc3QgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCX07CisJMUExMjEwRkMxMUQzQTVEQTAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0LUluZm8ucGxpc3QgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJMUExMjExRDAxMUQzQkY0NjAwRjI3QjM4IC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdCAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwkxQTEyMTIyMzExRDNDOTI0MDBGMjdCMzggLyogQU5UTFJGYXN0UXVldWVUZXN0ICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwl9OworCTFBMTIxMkRCMTFEM0Y1MzYwMEYyN0IzOCAvKiBBTlRMUkludEFycmF5VGVzdCAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwkxQTEyMTMwQjExRDNGN0NEMDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdCAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwkxQTEyMTMwRDExRDNGN0NEMDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdC1JbmZvLnBsaXN0ICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAwfSwgezg4MCwgMTAyM319IjsKKwkJfTsKKwl9OworCTFBMTZCMTNBMTFDNjY0OTIwMDI4NjBDNyAvKiBBTlRMUkxpbmtCYXNlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgOTc1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc1LCAxNDg2fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTc1MCwgOTkxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezczMSwgMTB9LCB7OTQxLCAxMDAyfX0iOworCQl9OworCX07CisJMUExNkIxM0IxMUM2NjQ5MjAwMjg2MEM3IC8qIEFOVExSTGlua0Jhc2UubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMzI2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NjEsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNTYyLCA1MjB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NzE5LCAxfSwgezk0MSwgMTAwMn19IjsKKwkJfTsKKwl9OworCTFBMTcwMkZDMTFDMDVENDgwMEY2OTc4QSAvKiBBTlRMUkhhc2hNYXAuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMzUyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezUyLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTkyMCwgMTA3Nn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szNywgNX0sIHs4MjMsIDk3Nn19IjsKKwkJfTsKKwl9OworCTFBMTcwMkZEMTFDMDVENDgwMEY2OTc4QSAvKiBBTlRMUkhhc2hNYXAubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA2NTc4fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezM1LCAxNDYwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTA1MywgODgyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezcyNCwgOH0sIHs5NDIsIDk4N319IjsKKwkJfTsKKwl9OworCTFBMThFRjU1MTFCODAyOEQwMDA2MTg2QSAvKiBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgMTM1Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MzkzLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzQ0NCwgMTA4OH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3syMywgNDN9LCB7ODI2LCA5ODF9fSI7CisJCX07CisJfTsKKwkxQTE4RUY1NjExQjgwMjhEMDAwNjE4NkEgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgwNSwgNDUxMX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns4NjQ5LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7ODA0OCwgMTM1Nn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4NDksIDE0fSwgezgxNCwgOTg4fX0iOworCQl9OworCX07CisJMUExQkNEQjkxMUNCMDFFNjAwNTFBMUVDIC8qIEFOVExSUnVsZVJldHVyblNjb3BlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNzI4fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NjUsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns2NzYsIDExOTV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NjQzLCAxMH0sIHsxMDI0LCA5NDd9fSI7CisJCX07CisJfTsKKwkxQTFCQ0RCQTExQ0IwMUU2MDA1MUExRUMgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgOTM2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezIyMTQsIDEzfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTgzMywgNDM2fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezYyNSwgNTJ9LCB7MTAyNCwgOTQ3fX0iOworCQl9OworCX07CisJMUExQkNEQ0QxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDY1MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNzE3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTcwLCAxODA3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezYsIDM1fSwgezEwMjQsIDk0N319IjsKKwkJfTsKKwl9OworCTFBMUJDRENFMTFDQjBCM0QwMDUxQTFFQyAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA3NTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTcwNiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezgzMiwgMTAzMX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s1ODgsIDI5fSwgezEwMjQsIDk0N319IjsKKwkJfTsKKwl9OworCTFBMUJDRTI4MTFDQjFBM0UwMDUxQTFFQyAvKiBBTlRMUlRyZWVSZXdyaXRlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4NTksIDk2Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTYzLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTM0NiwgOTk4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezM0LCAxNn0sIHsxMDI0LCA5NDd9fSI7CisJCX07CisJfTsKKwkxQTFCQ0UyOTExQ0IxQTNFMDA1MUExRUMgLyogQU5UTFJUcmVlUmV3cml0ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgMjgwOH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MzcwLCAxOH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezM5NDAsIDEwNDB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NjA1LCAzM30sIHsxMDI0LCA5NDd9fSI7CisJCX07CisJfTsKKwkxQTFDQ0M5MDExQjZGRDM5MDAyRTVGNTMgLyogQU5UTFJGYXN0UXVldWUuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA5MTB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTkzOSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE0MzQsIDcwNn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s5LCAwfSwgezgwOCwgOTY1fX0iOworCQl9OworCX07CisJMUExQ0NDOTExMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSRmFzdFF1ZXVlLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMTgsIDI0MTh9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDIwOSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezM5NzMsIDI0MX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2OTQsIDQwfSwgezkwNywgOTU3fX0iOworCQl9OworCX07CisJMUExQ0NDOTIxMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSSW50QXJyYXkuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA3OTN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzYsIDE0Nzd9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNjA3LCA1MzN9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NCwgMzh9LCB7ODA4LCA5NjV9fSI7CisJCX07CisJfTsKKwkxQTFDQ0M5MzExQjZGRDM5MDAyRTVGNTMgLyogQU5UTFJJbnRBcnJheS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE1MjF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU1NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezI1MTAsIDMyOH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4NTIsIDE0fSwgezgwOCwgOTY1fX0iOworCQl9OworCX07CisJMUExQ0NDQTkxMUI3MjRCMjAwMkU1RjUzIC8qIEFOVExSTG9va2FoZWFkU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTA3OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyOTUwLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjQ1MCwgNjE4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezYyMywgMzF9LCB7ODA4LCA5NjV9fSI7CisJCX07CisJfTsKKwkxQTFDQ0NBQTExQjcyNEIyMDAyRTVGNTMgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExMywgMzAyOX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0Nzc3LCA1fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTIxOX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4MzIsIDQ5fSwgezgwOCwgOTY1fX0iOworCQl9OworCX07CisJMUExQ0NDQzcxMUI3MjdCNTAwMkU1RjUzIC8qIEFOVExSRXJyb3IuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgNzE1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezIwMTQsIDEyfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTExNSwgOTY1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAwfSwgezg4MCwgMTAyM319IjsKKwkJfTsKKwl9OworCTFBMUQ0NjU5MTFCRTczQjIwMDE1NzVGMyAvKiBBTlRMUkJhc2VUcmVlQWRhcHRvci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDIxNzF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzA3MCwgN30iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezQ2MjAsIDEwNTl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTkyLCAyNn0sIHs4MDcsIDk5MX19IjsKKwkJfTsKKwl9OworCTFBMUQ0NjVBMTFCRTczQjIwMDE1NzVGMyAvKiBBTlRMUkJhc2VUcmVlQWRhcHRvci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMjAyLCA0NDIwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezgzMTcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns4ODc5LCA4Njl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NzU1LCAxMX0sIHs4MTYsIDk5MH19IjsKKwkJfTsKKwl9OworCTFBMUQ0NjZFMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA3ODB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTE2LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NDQ5LCAxNzY3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE0LCA0NH0sIHs4MDMsIDk3MX19IjsKKwkJfTsKKwl9OworCTFBMUQ0NjZGMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAyMjYyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc2LCAxNDg0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTA0OSwgMTA2OH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3syNiwgMzd9LCB7OTM5LCA5ODl9fSI7CisJCX07CisJfTsKKwkxQTFENDY3QTExQkU4RTVBMDAxNTc1RjMgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7NzQ0LCA4NTV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7ODMsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAyNDA0fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezEyMiwgMH0sIHs4MDMsIDk4M319IjsKKwkJfTsKKwl9OworCTFBMUQ0NjdCMTFCRThFNUEwMDE1NzVGMyAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE4MzN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzYzMywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezIzMzEsIDk2NX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4NDcsIDIyfSwgezgwMywgOTgzfX0iOworCQl9OworCX07CisJMUExRkZDNTkxMUNEMTJBNDAwRkJCNDUyIC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezkwOCwgMjA4MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns2ODQ5LCA4fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NTA3NywgMjMwN30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szMSwgMzZ9LCB7MTAyNCwgOTQ3fX0iOworCQl9OworCX07CisJMUExRkZDNUExMUNEMTJBNDAwRkJCNDUyIC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExODEsIDgzNDZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTQwNTcsIDh9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyMzE1MywgMTI3NX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2MjgsIDcyfSwgezEwMjQsIDk0N319IjsKKwkJfTsKKwl9OworCTFBMjYzMjkzMTFDNTM1NzgwMDBEQ0RENCAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA2NzZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7OTIsIDE0ODN9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNzYsIDE1ODd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDU4LCA3fSwgezc3OSwgMTAwOH19IjsKKwkJfTsKKwl9OworCTFBMjYzMjk0MTFDNTM1NzgwMDBEQ0RENCAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA4MTl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU3NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1MDZ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NjUwLCAwfSwgezkxNiwgMTAxOX19IjsKKwkJfTsKKwl9OworCTFBMjcwQkY3MTFDMTQ1MTIwMERDQzhGMyAvKiBBTlRMUlRyZWVJdGVyYXRvci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs3NjQsIDg4NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxOTE4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjcsIDI0NzF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NjUsIDV9LCB7ODIzLCA5NzZ9fSI7CisJCX07CisJfTsKKwkxQTI3MEJGODExQzE0NTEyMDBEQ0M4RjMgLyogQU5UTFJUcmVlSXRlcmF0b3IubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAyMTQ1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI0NTMsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInszNjY2LCA3NzV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODQyLCAzfSwgezgyMywgOTc2fX0iOworCQl9OworCX07CisJMUEyQjA5NjMxMkU3OTdERTAwQTc1MTMzIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMjU3NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTYyN30iOworCQl9OworCX07CisJMUEyQjA5NjYxMkU3OTdGNjAwQTc1MTMzIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNTg1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNjI4fSI7CisJCX07CisJfTsKKwkxQTJEMjE3MzExRTRGNTdDMDBERkUzMjggLyogQU5UTFJVbmlxdWVJRE1hcC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDgzMn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTYxLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7ODIzLCAxMjYzfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAzNH0sIHs3NzIsIDk4OX19IjsKKwkJfTsKKwl9OworCTFBMkQyMTc0MTFFNEY1N0MwMERGRTMyOCAvKiBBTlRMUlVuaXF1ZUlETWFwLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMjAxNX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTYxLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7OTc1LCAxMTE0fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezg3MywgMTB9LCB7NzcyLCA5ODl9fSI7CisJCX07CisJfTsKKwkxQTJEMjE4NDExRTUwMkRFMDBERkUzMjggLyogQU5UTFJOb2RlTWFwRWxlbWVudC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDcyOH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY0LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7OTc5LCAxMDY4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezM2LCAwfSwgezc3MiwgOTg5fX0iOworCQl9OworCX07CisJMUEyRDIxODUxMUU1MDJERTAwREZFMzI4IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMjYxfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NjQsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxMTIyLCA5NTl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODU1LCAyOH0sIHs3NzIsIDk4OX19IjsKKwkJfTsKKwl9OworCTFBMzQ4QjE4MTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkZhc3RRdWV1ZVRlc3QubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgMTQwNH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MzQsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyMDQsIDc4Mn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s0MiwgOH0sIHsxMTU2LCA5OTV9fSI7CisJCX07CisJfTsKKwkxQTM0OEIxQTExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJJbnRBcnJheVRlc3QubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExMywgNjI0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezM3NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezUzMCwgNzYxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezMwLCAxNH0sIHsxMTU2LCA5OTV9fSI7CisJCX07CisJfTsKKwkxQTM0OEIxQzExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJCaXRTZXRUZXN0LmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezYzOCwgMzM4fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDIyNn0iOworCQl9OworCX07CisJMUEzNDhCMUQxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs5NDMsIDE0MTd9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7Mjg0MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezIzNzEsIDg3Nn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2MjQsIDI5fSwgezg2MSwgOTg4fX0iOworCQl9OworCX07CisJMUEzNDhCMUYxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDM0NX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNDMsIDM5fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgNDMzfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCA0fSwgezg1MCwgMTAxOX19IjsKKwkJfTsKKwl9OworCTFBMzQ4QjIwMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTA4LCAxNDE3fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE3MTYsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyMzE4LCA4NTB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDI4fSwgezExNTYsIDk5NX19IjsKKwkJfTsKKwl9OworCTFBMzQ4QjIzMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMDk3LCAxMjM1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezQxMDIsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns2OTUsIDM2MDN9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NTAzLCA1fSwgezExNTYsIDk5NX19IjsKKwkJfTsKKwl9OworCTFBMzQ4QjI1MTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkNvbW1vblRyZWVUZXN0LmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgyMSwgODk1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezMzMiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDExMjl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MjYsIDV9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJMUEzNDhCMjYxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgNzA4NX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyMTEwMiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezIwMzMwLCA5MjF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NzM1LCAyMX0sIHs5MjcsIDEwMDB9fSI7CisJCX07CisJfTsKKwkxQTM0OEI0RDExRDJCRUU4MDAwQzcyRkMgLyogVGVzdCAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwkxQTM0OEJFQjExRDJEMEExMDAwQzcyRkMgLyogQU5UTFJCaXRzZXRUZXN0ICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwl9OworCTFBM0EwOEU0MTFFMjEzQzUwMEQ1RUUyNiAvKiBBTlRMUkJhc2VTdGFjay5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDc5M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY0LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTM0OH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szNCwgMTB9LCB7NzA5LCAxMDE4fX0iOworCQl9OworCX07CisJMUEzQTA4RTUxMUUyMTNDNTAwRDVFRTI2IC8qIEFOVExSQmFzZVN0YWNrLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTM5MX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY1LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NjAwLCAxMTQ1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezg4NywgMzB9LCB7NzAzLCA5OTd9fSI7CisJCX07CisJfTsKKwkxQTNBMDhFODExRTIxM0UxMDBENUVFMjYgLyogQU5UTFJTeW1ib2xTdGFjay5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDk3NX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxODE2LCA1OH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE4MDgsIDU0MH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3syMywgNH0sIHs3MDksIDEwMTh9fSI7CisJCX07CisJfTsKKwkxQTNBMDhFOTExRTIxM0UxMDBENUVFMjYgLyogQU5UTFJTeW1ib2xTdGFjay5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE1MzR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MjAzOSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE4NzQsIDQ1NH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s5MjEsIDB9LCB7NzA5LCAxMDE4fX0iOworCQl9OworCX07CisJMUEzQTA5QkQxMUUyMzVCRDAwRDVFRTI2IC8qIGFudGxyMy5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEzMjZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTg5OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezEzNTksIDk2NH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMzR9LCB7NzcyLCA5ODl9fSI7CisJCX07CisJfTsKKwkxQTQ1NjU3NTExQzkyMkJFMDA4MkY0MjEgLyogQU5UTFJSdWxlTWVtby5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDc2N319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTU4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzgwLCAxNzM4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezUsIDI5fSwgezgyMywgOTgyfX0iOworCQl9OworCX07CisJMUE0NTY1NzYxMUM5MjJCRTAwODJGNDIxIC8qIEFOVExSUnVsZU1lbW8ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxODA3fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NTgsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxMDQ4LCAxMDI1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgzNSwgMzF9LCB7ODAzLCA5NzF9fSI7CisJCX07CisJfTsKKwkxQTQ1NjU4NzExQzkyNzBEMDA4MkY0MjEgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDY2M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNjEsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA5Nzl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7OCwgMjV9LCB7ODAzLCA5NzF9fSI7CisJCX07CisJfTsKKwkxQTQ1NjU4ODExQzkyNzBEMDA4MkY0MjEgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEyMzV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU2NCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezIwMTcsIDQ3Mn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4NzMsIDJ9LCB7ODAzLCA5NzF9fSI7CisJCX07CisJfTsKKwkxQTRBODUxMDExQ0JDRTNFMDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDU5OH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTYyLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NjcyLCAxMzMzfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezI5LCAxOH0sIHsxMDI0LCA5NDd9fSI7CisJCX07CisJfTsKKwkxQTRBODUxMTExQ0JDRTNFMDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTE0LCAxMjIyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE5OTIsIDE0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTgwMiwgMzgzfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezY0MCwgNDh9LCB7MTAyNCwgOTQ3fX0iOworCQl9OworCX07CisJMUE0QTg1MTYxMUNCQ0U1NTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3NDF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU2OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezk4MiwgMTE2NX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4OCwgMTN9LCB7MTAyNCwgOTQ3fX0iOworCQl9OworCX07CisJMUE0QTg1MTcxMUNCQ0U1NTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA5MTB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU2OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE2NDQsIDc2M30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2MTksIDI1fSwgezEwMjQsIDk0N319IjsKKwkJfTsKKwl9OworCTFBNEE4NTFDMTFDQkNGMzcwMEU0QkYxQiAvKiBBTlRMUlRyZWVXaXphcmQuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgMTg5OH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInszMzc4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7Mjc4NiwgNjk4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCA3Nn0sIHsxMDI0LCA5NDd9fSI7CisJCX07CisJfTsKKwkxQTRBODUxRDExQ0JDRjM3MDBFNEJGMUIgLyogQU5UTFJUcmVlV2l6YXJkLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMTQsIDg2NzF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU5MzksIDE0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTUyNzEsIDEwNzF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODI1LCAzNH0sIHs3NzIsIDk4OX19IjsKKwkJfTsKKwl9OworCTFBNEQ1QUQ0MTFCNTVBNDUwMDFDOTQ4MiAvKiBBTlRMUkJhc2VUcmVlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMjQxOH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNjgwLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTY1MH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s0NywgMH0sIHsxMTQyLCA5OTB9fSI7CisJCX07CisJfTsKKwkxQTRENUFENTExQjU1QTQ1MDAxQzk0ODIgLyogQU5UTFJCYXNlVHJlZS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTE0LCA3MDQ2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezIyOTcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNzIzLCA2Njh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7Nzg1LCAyMn0sIHs4ODUsIDk3MH19IjsKKwkJfTsKKwl9OworCTFBNUVBNTA5MTFDRkU3Q0UwMEU4OTMyRiAvKiBBTlRMUk1hcC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEwOTJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTA5LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTY5MywgODQwfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezY0NywgMTV9LCB7ODcwLCAxMDAwfX0iOworCQl9OworCX07CisJMUE1RUE1MEExMUNGRTdDRTAwRTg5MzJGIC8qIEFOVExSTWFwLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMTMsIDQ0NDZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NzcwNCwgMn0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezczNTYsIDYxN30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3MzcsIDI4fSwgezg3MCwgMTAwMH19IjsKKwkJfTsKKwl9OworCTFBNjVCN0Q2MTFCOTUzMkEwMEZEODc1NCAvKiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTE2MCwgMTkxMX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns1MzA3LCAyMn0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezUwNDEsIDY4OX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxMiwgMTB9LCB7ODU5LCAxMDA2fX0iOworCQl9OworCX07CisJMUE2NUI3RDcxMUI5NTMyQTAwRkQ4NzU0IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTEzLCA2NTI2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE2NjAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns5NjUsIDEwNTh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODAyLCAxMn0sIHs4MTEsIDEwMTB9fSI7CisJCX07CisJfTsKKwkxQTZDNDUxNDExQkY0RUUwMDAzOTc4OEEgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA2NzZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU3MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezYwNiwgMTU1MH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szOSwgMjZ9LCB7ODUxLCA5ODh9fSI7CisJCX07CisJfTsKKwkxQTZDNDUxNTExQkY0RUUwMDAzOTc4OEEgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCAxMDc5fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NzAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns4MzMsIDEyNDV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODQ3LCAyM30sIHs4MDMsIDk4M319IjsKKwkJfTsKKwl9OworCTFBNkM0NTI2MTFCRjUwQTQwMDM5Nzg4QSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODQ1LCA2MjR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU3MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezY4MiwgMTM5Nn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4MzIsIDQ5fSwgezgwOCwgOTY1fX0iOworCQl9OworCX07CisJMUE2QzQ1MjcxMUJGNTBBNDAwMzk3ODhBIC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MzgsIDEwNDB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU3MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezQ3LCAxNDU1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezY2OCwgMH0sIHs5OTksIDk3NX19IjsKKwkJfTsKKwl9OworCTFBNzdFRTg4MTJFNkE1NTIwMDdGMzIzQSAvKiBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwkxQTg2QjkxOTExRUI5RjYzMDBDNjdBMDMgLyogQU5UTFJQYXJzZVRyZWUuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3OTN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU1OSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezU5NSwgMTUxNH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3syMCwgNjB9LCB7ODA1LCA5NjV9fSI7CisJCX07CisJfTsKKwkxQTg2QjkxQTExRUI5RjYzMDBDNjdBMDMgLyogQU5UTFJQYXJzZVRyZWUubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxNDgyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NTksIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNjU4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgyNiwgNjB9LCB7Nzk5LCA5Njd9fSI7CisJCX07CisJfTsKKwkxQTg2QkFDRDExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3OTN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU3MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezgzNCwgMTQyNH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxMCwgMjF9LCB7Nzk5LCA5Njd9fSI7CisJCX07CisJfTsKKwkxQTg2QkFDRTExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODk0LCAxNDE3fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI2MTcsIDczfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjU0MiwgNjE1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgyOSwgMzR9LCB7Nzk5LCA5Njd9fSI7CisJCX07CisJfTsKKwkxQTg2Rjc5MDEyRTdFMjAxMDA4OTRFQkUgLyogbWFpbi5tOjQzICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IDFBQzVBQzgxMTJFN0JDOTEwMERGMEM1OCAvKiBtYWluLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICJtYWluKCkiOworCQloaXRDb3VudCA9IDE7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDQzOworCQlsb2NhdGlvbiA9IHRyZWVyZXdyaXRlOworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDA4LjIwODU1ODsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMTsKKwl9OworCTFBODZGNzlDMTJFN0U1QzkwMDg5NEVCRSAvKiBtYWluLm06NDkgKi8gPSB7CisJCWlzYSA9IFBCWEZpbGVCcmVha3BvaW50OworCQlhY3Rpb25zID0gKAorCQkpOworCQlicmVha3BvaW50U3R5bGUgPSAwOworCQljb250aW51ZUFmdGVyQWN0aW9ucyA9IDA7CisJCWNvdW50VHlwZSA9IDA7CisJCWRlbGF5QmVmb3JlQ29udGludWUgPSAwOworCQlmaWxlUmVmZXJlbmNlID0gMUFDNUFDODExMkU3QkM5MTAwREYwQzU4IC8qIG1haW4ubSAqLzsKKwkJZnVuY3Rpb25OYW1lID0gIm1haW4oKSI7CisJCWhpdENvdW50ID0gMTsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gNDk7CisJCWxvY2F0aW9uID0gdHJlZXJld3JpdGU7CisJCW1vZGlmaWNhdGlvblRpbWUgPSAzMTcyNTYwMTEuNDQyMzkxOworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAxOworCX07CisJMUE4NkY3QkIxMkU3RThDNDAwODk0RUJFIC8qIExhbmdEdW1wRGVjbC5tOjE2NCAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSAxQUM1QUNDNjEyRTdDMDNDMDBERjBDNTggLyogTGFuZ0R1bXBEZWNsLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItZGVjbCI7CisJCWhpdENvdW50ID0gMTsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gMTY0OworCQlsb2NhdGlvbiA9IHRyZWVyZXdyaXRlOworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDE1LjM5NDkyNzsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMTsKKwl9OworCTFBODZGN0M0MTJFN0U5RTQwMDg5NEVCRSAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLm06MjkxICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3MDBFRDk1MEE1RkYyQTUwMDVEMDc1NyAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItdG9TdHJpbmdGcm9tU3RhcnQ6VG9FbmQ6IjsKKwkJaGl0Q291bnQgPSAwOworCQlpZ25vcmVDb3VudCA9IDA7CisJCWxpbmVOdW1iZXIgPSAyOTE7CisJCWxvY2F0aW9uID0gQU5UTFI7CisJCW1vZGlmaWNhdGlvblRpbWUgPSAzMTcyNTYwMDEuOTkzNjU0OworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAwOworCX07CisJMUE4QUJGQzUxMUJBOUI5NjAwMzhEQkIwIC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgNjYzfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezgzLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTAxLCAxNDI3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezY1LCA2fSwgezgzOSwgOTc1fX0iOworCQl9OworCX07CisJMUE4QUMwMEExMUJBRUM3MTAwMzhEQkIwIC8qIEFOVExSUnVudGltZUV4Y2VwdGlvbi5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MzEsIDcxNX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY1LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NjAxLCAxNTUyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE4LCAyMX0sIHs5NDEsIDEwMDJ9fSI7CisJCX07CisJfTsKKwkxQThBQzAwQjExQkFFQzcxMDAzOERCQjAgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezkzNiwgMTI3NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY1LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzA2LCAyNjc1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgwMiwgMjF9LCB7ODUxLCA5ODh9fSI7CisJCX07CisJfTsKKwkxQThDNTQ0QjEyMjQ0MTAwMDA4QTFENDQgLyogbWFpbi5tOjU1ICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3MkM1RTU2MEFCN0U0MTAwMDI4MjU3NCAvKiBtYWluLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICJtYWluKCkiOworCQloaXRDb3VudCA9IDA7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDU1OworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzAwMTE7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDA7CisJfTsKKwkxQThDNTQ5RTEyMjQ0RjI0MDA4QTFENDQgLyogbWFpbi5tOjY5ICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3MkM1RTU2MEFCN0U0MTAwMDI4MjU3NCAvKiBtYWluLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICJtYWluKCkiOworCQloaXRDb3VudCA9IDA7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDY5OworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzA0MzsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMDsKKwl9OworCTFBOEM1NEJBMTIyNDYwNjIwMDhBMUQ0NCAvKiBTaW1wbGVDV2Fsa2VyLm06MzEyICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3NDFEMDY1MEIzODEyRDQwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItcHJvZ3JhbSI7CisJCWhpdENvdW50ID0gMDsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gMzEyOworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzA2NTsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMDsKKwl9OworCTFBOEM1NEJFMTIyNDYwQzEwMDhBMUQ0NCAvKiBTaW1wbGVDV2Fsa2VyLm06MzIyICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3NDFEMDY1MEIzODEyRDQwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItcHJvZ3JhbSI7CisJCWhpdENvdW50ID0gMDsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gMzIyOworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzA4NjsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMDsKKwl9OworCTFBOEM1NEMwMTIyNDYwQ0QwMDhBMUQ0NCAvKiBTaW1wbGVDV2Fsa2VyLm06MzMxICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3NDFEMDY1MEIzODEyRDQwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItcHJvZ3JhbSI7CisJCWhpdENvdW50ID0gMDsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gMzMxOworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzEwNDE7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDA7CisJfTsKKwkxQThDNTRDMzEyMjQ2MjhBMDA4QTFENDQgLyogU2ltcGxlQ1dhbGtlci5tOjY3NCAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSBGNzQxRDA2NTBCMzgxMkQ0MDAyNERGM0YgLyogU2ltcGxlQ1dhbGtlci5tICovOworCQlmdW5jdGlvbk5hbWUgPSAiLWJsb2NrIjsKKwkJaGl0Q291bnQgPSAwOworCQlpZ25vcmVDb3VudCA9IDA7CisJCWxpbmVOdW1iZXIgPSA2NzQ7CisJCW1vZGlmaWNhdGlvblRpbWUgPSAzMTcyNTYwMDEuOTgzMTI0OworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAwOworCX07CisJMUE4QzU0QzUxMjI0NjM1NzAwOEExRDQ0IC8qIFNpbXBsZUNXYWxrZXIubTo4NDYgKi8gPSB7CisJCWlzYSA9IFBCWEZpbGVCcmVha3BvaW50OworCQlhY3Rpb25zID0gKAorCQkpOworCQlicmVha3BvaW50U3R5bGUgPSAwOworCQljb250aW51ZUFmdGVyQWN0aW9ucyA9IDA7CisJCWNvdW50VHlwZSA9IDA7CisJCWRlbGF5QmVmb3JlQ29udGludWUgPSAwOworCQlmaWxlUmVmZXJlbmNlID0gRjc0MUQwNjUwQjM4MTJENDAwMjRERjNGIC8qIFNpbXBsZUNXYWxrZXIubSAqLzsKKwkJZnVuY3Rpb25OYW1lID0gIi1mb3JTdGF0IjsKKwkJaGl0Q291bnQgPSAwOworCQlpZ25vcmVDb3VudCA9IDA7CisJCWxpbmVOdW1iZXIgPSA4NDY7CisJCW1vZGlmaWNhdGlvblRpbWUgPSAzMTcyNTYwMDEuOTgzMTQ0OworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAwOworCX07CisJMUE5OEJBQjYxMkU2NDEzNzAwMUZENkVDIC8qIFN5bWJvbFRhYmxlUGFyc2VyLm06MjU1ICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3MzhEMjAxMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tICovOworCQlmdW5jdGlvbk5hbWUgPSAiLXByb2ciOworCQloaXRDb3VudCA9IDA7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDI1NTsKKwkJbW9kaWZpY2F0aW9uVGltZSA9IDMxNzI1NjAwMS45ODMyMjY7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDA7CisJfTsKKwkxQTlDQkQyNDExQzk5Nzk2MDBEQThGRUYgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgMTU2MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MTIzLCA4fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzY4MywgNzc3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezcsIDZ9LCB7ODQ4LCA5OTd9fSI7CisJCX07CisJfTsKKwkxQTlDQkQyNTExQzk5Nzk2MDBEQThGRUYgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTA1NSwgNTM4Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyNDMwLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjA4MiwgODk3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezk2OSwgOH0sIHs2ODQsIDk5OH19IjsKKwkJfTsKKwl9OworCTFBOUNCRDI2MTFDOTk3OTYwMERBOEZFRiAvKiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezYyNSwgODcxfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMjU4M30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4MTgsIDI3fSwgezY4NCwgOTk4fX0iOworCQl9OworCX07CisJMUE5Q0JEMjcxMUM5OTc5NjAwREE4RkVGIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxNzk0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjU4MiwgNTU5fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezQyLCA0fSwgezY4NCwgOTk4fX0iOworCQl9OworCX07CisJMUE5Q0Y2RDUxMkU2NUNGMDAwN0E2QTEzIC8qIG1haW4ubToxOCAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSBGNzlENTZDMDBBMEUyODc1MDBFQTNDRUUgLyogbWFpbi5tICovOworCQlmdW5jdGlvbk5hbWUgPSAibWFpbigpIjsKKwkJaGl0Q291bnQgPSAxOworCQlpZ25vcmVDb3VudCA9IDA7CisJCWxpbmVOdW1iZXIgPSAxODsKKwkJbG9jYXRpb24gPSB0cmVlcmV3cml0ZTsKKwkJbW9kaWZpY2F0aW9uVGltZSA9IDMxNzI1NjAwNC43Njg3NDU7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDE7CisJfTsKKwkxQTlDRjZEOTEyRTY1RDA4MDA3QTZBMTMgLyogbWFpbi5tOjkgKi8gPSB7CisJCWlzYSA9IFBCWEZpbGVCcmVha3BvaW50OworCQlhY3Rpb25zID0gKAorCQkpOworCQlicmVha3BvaW50U3R5bGUgPSAwOworCQljb250aW51ZUFmdGVyQWN0aW9ucyA9IDA7CisJCWNvdW50VHlwZSA9IDA7CisJCWRlbGF5QmVmb3JlQ29udGludWUgPSAwOworCQlmaWxlUmVmZXJlbmNlID0gRjc5RDU2QzAwQTBFMjg3NTAwRUEzQ0VFIC8qIG1haW4ubSAqLzsKKwkJZnVuY3Rpb25OYW1lID0gIm1haW4oKSI7CisJCWhpdENvdW50ID0gMDsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gOTsKKwkJbG9jYXRpb24gPSB0cmVlcmV3cml0ZTsKKwkJbW9kaWZpY2F0aW9uVGltZSA9IDMxNzI1NjAwMS45ODMyNjQ7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDE7CisJfTsKKwkxQUE4NkZGNzEyRUE3ODUyMDBFMTdBNEMgLyogUEJYVGV4dEJvb2ttYXJrICovID0geworCQlpc2EgPSBQQlhUZXh0Qm9va21hcms7CisJCWZSZWYgPSAxQTBGMzQyRTEyRUE0MTFGMDA0OTZCQjggLyogaW5wdXQgKi87CisJCW5hbWUgPSAiaW5wdXQ6IDEiOworCQlyTGVuID0gMDsKKwkJckxvYyA9IDA7CisJCXJUeXBlID0gMDsKKwkJdnJMZW4gPSAzNTsKKwkJdnJMb2MgPSAwOworCX07CisJMUFBODcxMDMxMkVBOTY3NzAwRTE3QTRDIC8qIFBCWFRleHRCb29rbWFyayAqLyA9IHsKKwkJaXNhID0gUEJYVGV4dEJvb2ttYXJrOworCQlmUmVmID0gRjcyQzU4RTgwQUIzOTExRDAwMjgyNTc0IC8qIEFOVExSQ29tbW9uVHJlZS5oICovOworCQluYW1lID0gIkFOVExSQ29tbW9uVHJlZS5oOiA0NiI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMjI4OTsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDE1Mzg7CisJCXZyTG9jID0gMTU4NTsKKwl9OworCTFBQTg3MTBFMTJFQUExRkUwMEUxN0E0QyAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IEY3MkM1OUE2MEFCNEYyMEEwMDI4MjU3NCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLm0gKi87CisJCW5hbWUgPSAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5tOiA5MSI7CisJCXJMZW4gPSAwOworCQlyTG9jID0gMzQyNDsKKwkJclR5cGUgPSAwOworCQl2ckxlbiA9IDExNDk7CisJCXZyTG9jID0gMjc5OTsKKwl9OworCTFBQTg3MTExMTJFQUExRkUwMEUxN0E0QyAvKiBQQlhUZXh0Qm9va21hcmsgKi8gPSB7CisJCWlzYSA9IFBCWFRleHRCb29rbWFyazsKKwkJZlJlZiA9IDFBMEYzNDdDMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5UGFyc2VyLmggKi87CisJCW5hbWUgPSAiUG9seVBhcnNlci5oOiAxIjsKKwkJckxlbiA9IDA7CisJCXJMb2MgPSAwOworCQlyVHlwZSA9IDA7CisJCXZyTGVuID0gMTM4NjsKKwkJdnJMb2MgPSA3Mzg7CisJfTsKKwkxQUFDMjAyQTExQ0M2MjFBMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgMTE0NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7OTgxLCAxMDA5fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezc1LCAxM30sIHsxMDI0LCA5NDd9fSI7CisJCX07CisJfTsKKwkxQUFDMjAyQjExQ0M2MjFBMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMjIyM319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTY3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NDQxMiwgMzM4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezYwMSwgNDF9LCB7MTAyNCwgOTQ3fX0iOworCQl9OworCX07CisJMUFBQzIwQTMxMUNDNzkwMzAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3NTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU2OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezgzMCwgMTI3NH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szOCwgMTZ9LCB7MTAyNCwgOTQ3fX0iOworCQl9OworCX07CisJMUFBQzIwQTQxMUNDNzkwMzAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExMywgMjMwMX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns1MTYyLCAyNH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezQ4NjIsIDYzNH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2MDYsIDI3fSwgezEwMjQsIDk0N319IjsKKwkJfTsKKwl9OworCTFBQjRBNThGMTFCOUEwREEwMDc2RTkxQSAvKiBBTlRMUlN0cmVhbUVudW1lcmF0b3IuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA1ODV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7ODUsIDE1MDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInszMjYsIDEzODZ9IjsKKwkJfTsKKwl9OworCTFBQjRBNTkwMTFCOUEwREEwMDc2RTkxQSAvKiBBTlRMUlN0cmVhbUVudW1lcmF0b3IubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA5MTB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU4NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezExNDMsIDc1MH0iOworCQl9OworCX07CisJMUFCNUY0NzUxMUUzODY5RDAwRTA2NUIwIC8qIEFOVExSUnVsZU1hcEVsZW1lbnQuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3Mjh9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU2NCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezYwMCwgMTQ2OX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMn0sIHs4MjAsIDEwMjF9fSI7CisJCX07CisJfTsKKwkxQUI1RjQ3NjExRTM4NjlEMDBFMDY1QjAgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs3OTMsIDE0Njl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTkxNywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDIzOTR9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODI4LCAzfSwgezg1MiwgMTAxOH19IjsKKwkJfTsKKwl9OworCTFBQjVGNTFDMTFFM0JFMkUwMEUwNjVCMCAvKiBBTlRMUlB0ckJ1ZmZlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEyMDl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzE1NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezI0MDMsIDYxOH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxNCwgMTZ9LCB7ODQzLCAxMDEyfX0iOworCQl9OworCX07CisJMUFCNUY1MUQxMUUzQkUyRTAwRTA2NUIwIC8qIEFOVExSUHRyQnVmZmVyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNDI1MX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0NTUyLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NDI0MywgMzk0fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezkxOSwgMH0sIHs3MzQsIDEwMDd9fSI7CisJCX07CisJfTsKKwkxQUJDRUZCQjEyRTYxOUQ3MDA4NjZGMzEgLyogU3ltYm9sVGFibGVQYXJzZXIubTo1NDQgKi8gPSB7CisJCWlzYSA9IFBCWEZpbGVCcmVha3BvaW50OworCQlhY3Rpb25zID0gKAorCQkpOworCQlicmVha3BvaW50U3R5bGUgPSAwOworCQljb250aW51ZUFmdGVyQWN0aW9ucyA9IDA7CisJCWNvdW50VHlwZSA9IDA7CisJCWRlbGF5QmVmb3JlQ29udGludWUgPSAwOworCQlmaWxlUmVmZXJlbmNlID0gRjczOEQyMDEwQjA3QjFDRTAwMTgxM0M0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItZGVjbCI7CisJCWhpdENvdW50ID0gMDsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gNTQ0OworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzIwNDsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMDsKKwl9OworCTFBQzVBQzczMTJFN0JCQjYwMERGMEM1OCAvKiBpbnB1dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzOTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgNn0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDd9IjsKKwkJfTsKKwl9OworCTFBQzVBQzc0MTJFN0JCQjYwMERGMEM1OCAvKiBMYW5nLmcgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzk0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezU1LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMzk5fSI7CisJCX07CisJfTsKKwkxQUM1QUM3NTEyRTdCQkI2MDBERjBDNTggLyogTGFuZ0R1bXBEZWNsLmcgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzk0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI0MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDI5NH0iOworCQl9OworCX07CisJMUFDNUFDNzcxMkU3QkJCNjAwREYwQzU4IC8qIG91dHB1dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzOTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDI1fSI7CisJCX07CisJfTsKKwkxQUM1QUM3ODEyRTdCQkI2MDBERjBDNTggLyogUkVBRE1FLnR4dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzOTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDI0MH0iOworCQl9OworCX07CisJMUFDNUFDODExMkU3QkM5MTAwREYwQzU4IC8qIG1haW4ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA2ODl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTYyNywgMTh9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns2ODQsIDExNDR9IjsKKwkJfTsKKwl9OworCTFBQzVBQzkzMTJFN0JFMDQwMERGMEM1OCAvKiBSZWdlbmVyYXRlIHRyZWVwYXJzZXIgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCX07CisJMUFDNUFDOTgxMkU3QkVGRTAwREYwQzU4IC8qIHRyZWVwYXJzZXIgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBQzVBQ0E4MTJFN0JFRkUwMERGMEM1OCAvKiB0cmVlcGFyc2VyICovLAorCQkpOworCX07CisJMUFDNUFDQTgxMkU3QkVGRTAwREYwQzU4IC8qIHRyZWVwYXJzZXIgKi8gPSB7CisJCWlzYSA9IFBCWEV4ZWN1dGFibGU7CisJCWFjdGl2ZUFyZ0luZGljZXMgPSAoCisJCSk7CisJCWFyZ3VtZW50U3RyaW5ncyA9ICgKKwkJKTsKKwkJYXV0b0F0dGFjaE9uQ3Jhc2ggPSAxOworCQlicmVha3BvaW50c0VuYWJsZWQgPSAwOworCQljb25maWdTdGF0ZURpY3QgPSB7CisJCX07CisJCWN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBDdXN0b21EYXRhRm9ybWF0dGVyc0VuYWJsZWQgPSAxOworCQlkYXRhVGlwU2hvd1R5cGVDb2x1bW4gPSAxOworCQlkYXRhVGlwU29ydFR5cGUgPSAwOworCQlkZWJ1Z2dlclBsdWdpbiA9IEdEQkRlYnVnZ2luZzsKKwkJZGlzYXNzZW1ibHlEaXNwbGF5U3RhdGUgPSAwOworCQlkeWxpYlZhcmlhbnRTdWZmaXggPSAiIjsKKwkJZW5hYmxlRGVidWdTdHIgPSAxOworCQllbnZpcm9ubWVudEVudHJpZXMgPSAoCisJCSk7CisJCWV4ZWN1dGFibGVTeXN0ZW1TeW1ib2xMZXZlbCA9IDA7CisJCWV4ZWN1dGFibGVVc2VyU3ltYm9sTGV2ZWwgPSAwOworCQlsaWJnbWFsbG9jRW5hYmxlZCA9IDA7CisJCW5hbWUgPSB0cmVlcGFyc2VyOworCQlzYXZlZEdsb2JhbHMgPSB7CisJCX07CisJCXNob3dUeXBlQ29sdW1uID0gMDsKKwkJc291cmNlRGlyZWN0b3JpZXMgPSAoCisJCSk7CisJCXZhcmlhYmxlRm9ybWF0RGljdGlvbmFyeSA9IHsKKwkJfTsKKwl9OworCTFBQzVBQ0M1MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nRHVtcERlY2wuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA5NzV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTQ2NCwgMzl9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxMDQxLCA2NzR9IjsKKwkJfTsKKwl9OworCTFBQzVBQ0M2MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nRHVtcERlY2wubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTEzOSwgMzIxMX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns1OTY5LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzM5LCAxNTk0fSI7CisJCX07CisJfTsKKwkxQUM1QUNDODEyRTdDMDNDMDBERjBDNTggLyogTGFuZ0xleGVyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNzAyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA4NDB9IjsKKwkJfTsKKwl9OworCTFBQzVBQ0M5MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nTGV4ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA1NzcyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezEyMzg4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjI0NCwgMTQ3N30iOworCQl9OworCX07CisJMUFDNUFDQ0ExMkU3QzAzQzAwREYwQzU4IC8qIExhbmdQYXJzZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxNDk1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezMzOTMsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyNzQzLCA3NTV9IjsKKwkJfTsKKwl9OworCTFBQzVBQ0NCMTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nUGFyc2VyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezEwNjksIDYzMDV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTQ4MTgsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns1MDg4LCAxNDg2fSI7CisJCX07CisJfTsKKwkxQURCNjY5NjEyRTczREIxMDA3QzE2NjEgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTo3MSAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSAxQTJCMDk2MzEyRTc5N0RFMDBBNzUxMzMgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubSAqLzsKKwkJZnVuY3Rpb25OYW1lID0gIi10ZXN0MDJSZXdyaXRlU3RyZWFtQ291bnQiOworCQloaXRDb3VudCA9IDA7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDcxOworCQltb2RpZmljYXRpb25UaW1lID0gMzE3MjU2MDAxLjk4MzI4NDsKKwkJb3JpZ2luYWxOdW1iZXJPZk11bHRpcGxlTWF0Y2hlcyA9IDE7CisJCXN0YXRlID0gMDsKKwl9OworCTFBREI2Njk4MTJFNzNEQjgwMDdDMTY2MSAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tOjM2ICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IDFBMkIwOTYzMTJFNzk3REUwMEE3NTEzMyAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovOworCQlmdW5jdGlvbk5hbWUgPSAiLXNldFVwIjsKKwkJaGl0Q291bnQgPSAwOworCQlpZ25vcmVDb3VudCA9IDA7CisJCWxpbmVOdW1iZXIgPSAzNjsKKwkJbW9kaWZpY2F0aW9uVGltZSA9IDMxNzI1NjAwMS45ODMzMDQ7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDA7CisJfTsKKwkxQURCNjY5QTEyRTczREJBMDA3QzE2NjEgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTo1MSAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSAxQTJCMDk2MzEyRTc5N0RFMDBBNzUxMzMgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubSAqLzsKKwkJZnVuY3Rpb25OYW1lID0gIi10ZWFyRG93biI7CisJCWhpdENvdW50ID0gMDsKKwkJaWdub3JlQ291bnQgPSAwOworCQlsaW5lTnVtYmVyID0gNTE7CisJCW1vZGlmaWNhdGlvblRpbWUgPSAzMTcyNTYwMDEuOTgzMzIxOworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAwOworCX07CisJMUFEQjY2RDQxMkU3NDAzMjAwN0MxNjYxIC8qIG1haW4ubToyMiAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSBGN0NENDVGQzBDNjRCQTRCMDBGRjkzM0EgLyogbWFpbi5tICovOworCQlmdW5jdGlvbk5hbWUgPSAibWFpbigpIjsKKwkJaGl0Q291bnQgPSAwOworCQlpZ25vcmVDb3VudCA9IDA7CisJCWxpbmVOdW1iZXIgPSAyMjsKKwkJbG9jYXRpb24gPSB0cmVlcmV3cml0ZTsKKwkJbW9kaWZpY2F0aW9uVGltZSA9IDMxNzI1NjAwMS45OTMyNTY5OworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAxOworCX07CisJMUFEQjY3QUMxMkU3NEJCMTAwN0MxNjYxIC8qIEZ1enp5TGV4ZXIubToxMzQwICovID0geworCQlpc2EgPSBQQlhGaWxlQnJlYWtwb2ludDsKKwkJYWN0aW9ucyA9ICgKKwkJKTsKKwkJYnJlYWtwb2ludFN0eWxlID0gMDsKKwkJY29udGludWVBZnRlckFjdGlvbnMgPSAwOworCQljb3VudFR5cGUgPSAwOworCQlkZWxheUJlZm9yZUNvbnRpbnVlID0gMDsKKwkJZmlsZVJlZmVyZW5jZSA9IEY3MkI4RDBCMEFEMDFEQ0IwMDEzRjFFMiAvKiBGdXp6eUxleGVyLm0gKi87CisJCWZ1bmN0aW9uTmFtZSA9ICItbUNPTU1FTlQiOworCQloaXRDb3VudCA9IDA7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDEzNDA7CisJCW1vZGlmaWNhdGlvblRpbWUgPSAzMTcyNTYwMDEuOTkzNTY0OworCQlvcmlnaW5hbE51bWJlck9mTXVsdGlwbGVNYXRjaGVzID0gMTsKKwkJc3RhdGUgPSAwOworCX07CisJMUFERTIxRjAxMkU1MDVENzAwRThBOTVDIC8qIFNpbXBsZUMuZyAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMTk2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc0MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezU4NCwgNTU5fSI7CisJCX07CisJfTsKKwkxQURFMjI0NDEyRTUxMEY4MDBFOEE5NUMgLyogU2ltcGxlQ1BhcnNlci5tOjM2NiAqLyA9IHsKKwkJaXNhID0gUEJYRmlsZUJyZWFrcG9pbnQ7CisJCWFjdGlvbnMgPSAoCisJCSk7CisJCWJyZWFrcG9pbnRTdHlsZSA9IDA7CisJCWNvbnRpbnVlQWZ0ZXJBY3Rpb25zID0gMDsKKwkJY291bnRUeXBlID0gMDsKKwkJZGVsYXlCZWZvcmVDb250aW51ZSA9IDA7CisJCWZpbGVSZWZlcmVuY2UgPSBGNzM4RDI1MTBCMDdCODQyMDAxODEzQzQgLyogU2ltcGxlQ1BhcnNlci5tICovOworCQlmdW5jdGlvbk5hbWUgPSAiLXByb2dyYW0iOworCQloaXRDb3VudCA9IDA7CisJCWlnbm9yZUNvdW50ID0gMDsKKwkJbGluZU51bWJlciA9IDM2NjsKKwkJbW9kaWZpY2F0aW9uVGltZSA9IDMxNzI1NjAwMS45ODMxNzU7CisJCW9yaWdpbmFsTnVtYmVyT2ZNdWx0aXBsZU1hdGNoZXMgPSAxOworCQlzdGF0ZSA9IDA7CisJfTsKKwkxQUU4QTk2QTExRDkyMjdBMDBEMzZGRDYgLyogQU5UTFJSdWxlU3RhY2suaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODQ1LCA4MzJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU1OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE2OTksIDcwM30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szMiwgNX0sIHs4MDMsIDEwMTh9fSI7CisJCX07CisJfTsKKwkxQUU4QTk2QjExRDkyMjdBMDBEMzZGRDYgLyogQU5UTFJSdWxlU3RhY2subSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxODk4fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NTksIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNDg5LCA0Nzd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NzU3LCAxMX0sIHs4NzMsIDEwMDJ9fSI7CisJCX07CisJfTsKKwkxQUZGNDI1MjExQjA2RDUwMDA2MzlDMjIgLyogbGV4ZXJ0ZXN0LXNpbXBsZSAqLyA9IHsKKwkJaXNhID0gUEJYRXhlY3V0YWJsZTsKKwkJYWN0aXZlQXJnSW5kaWNlcyA9ICgKKwkJKTsKKwkJYXJndW1lbnRTdHJpbmdzID0gKAorCQkpOworCQlhdXRvQXR0YWNoT25DcmFzaCA9IDE7CisJCWJyZWFrcG9pbnRzRW5hYmxlZCA9IDA7CisJCWNvbmZpZ1N0YXRlRGljdCA9IHsKKwkJfTsKKwkJY3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcEN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBTaG93VHlwZUNvbHVtbiA9IDE7CisJCWRhdGFUaXBTb3J0VHlwZSA9IDA7CisJCWRlYnVnZ2VyUGx1Z2luID0gR0RCRGVidWdnaW5nOworCQlkaXNhc3NlbWJseURpc3BsYXlTdGF0ZSA9IDA7CisJCWR5bGliVmFyaWFudFN1ZmZpeCA9ICIiOworCQllbmFibGVEZWJ1Z1N0ciA9IDE7CisJCWVudmlyb25tZW50RW50cmllcyA9ICgKKwkJKTsKKwkJZXhlY3V0YWJsZVN5c3RlbVN5bWJvbExldmVsID0gMDsKKwkJZXhlY3V0YWJsZVVzZXJTeW1ib2xMZXZlbCA9IDA7CisJCWxpYmdtYWxsb2NFbmFibGVkID0gMDsKKwkJbmFtZSA9ICJsZXhlcnRlc3Qtc2ltcGxlIjsKKwkJc2F2ZWRHbG9iYWxzID0geworCQl9OworCQlzaG93VHlwZUNvbHVtbiA9IDA7CisJCXNvdXJjZURpcmVjdG9yaWVzID0gKAorCQkpOworCQl2YXJpYWJsZUZvcm1hdERpY3Rpb25hcnkgPSB7CisJCX07CisJfTsKKwkxQUZGNDI1MzExQjA2RDUwMDA2MzlDMjIgLyogZnV6enkgKi8gPSB7CisJCWlzYSA9IFBCWEV4ZWN1dGFibGU7CisJCWFjdGl2ZUFyZ0luZGljZXMgPSAoCisJCQlOTywKKwkJKTsKKwkJYXJndW1lbnRTdHJpbmdzID0gKAorCQkJLi4vLi4vZXhhbXBsZXMvZnV6enkvaW5wdXQsCisJCSk7CisJCWF1dG9BdHRhY2hPbkNyYXNoID0gMTsKKwkJYnJlYWtwb2ludHNFbmFibGVkID0gMTsKKwkJY29uZmlnU3RhdGVEaWN0ID0geworCQl9OworCQljdXN0b21EYXRhRm9ybWF0dGVyc0VuYWJsZWQgPSAxOworCQlkYXRhVGlwQ3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcFNob3dUeXBlQ29sdW1uID0gMTsKKwkJZGF0YVRpcFNvcnRUeXBlID0gMDsKKwkJZGVidWdnZXJQbHVnaW4gPSBHREJEZWJ1Z2dpbmc7CisJCWRpc2Fzc2VtYmx5RGlzcGxheVN0YXRlID0gMDsKKwkJZHlsaWJWYXJpYW50U3VmZml4ID0gIiI7CisJCWVuYWJsZURlYnVnU3RyID0gMTsKKwkJZW52aXJvbm1lbnRFbnRyaWVzID0gKAorCQkpOworCQlleGVjdXRhYmxlU3lzdGVtU3ltYm9sTGV2ZWwgPSAwOworCQlleGVjdXRhYmxlVXNlclN5bWJvbExldmVsID0gMDsKKwkJbGliZ21hbGxvY0VuYWJsZWQgPSAwOworCQluYW1lID0gZnV6enk7CisJCXNhdmVkR2xvYmFscyA9IHsKKwkJfTsKKwkJc2hvd1R5cGVDb2x1bW4gPSAwOworCQlzb3VyY2VEaXJlY3RvcmllcyA9ICgKKwkJKTsKKwkJdmFyaWFibGVGb3JtYXREaWN0aW9uYXJ5ID0geworCQl9OworCX07CisJMUFGRjQyNTQxMUIwNkQ1MDAwNjM5QzIyIC8qIGNvbWJpbmVkICovID0geworCQlpc2EgPSBQQlhFeGVjdXRhYmxlOworCQlhY3RpdmVBcmdJbmRpY2VzID0gKAorCQkpOworCQlhcmd1bWVudFN0cmluZ3MgPSAoCisJCSk7CisJCWF1dG9BdHRhY2hPbkNyYXNoID0gMTsKKwkJYnJlYWtwb2ludHNFbmFibGVkID0gMDsKKwkJY29uZmlnU3RhdGVEaWN0ID0geworCQl9OworCQljdXN0b21EYXRhRm9ybWF0dGVyc0VuYWJsZWQgPSAxOworCQlkYXRhVGlwQ3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcFNob3dUeXBlQ29sdW1uID0gMTsKKwkJZGF0YVRpcFNvcnRUeXBlID0gMDsKKwkJZGVidWdnZXJQbHVnaW4gPSBHREJEZWJ1Z2dpbmc7CisJCWRpc2Fzc2VtYmx5RGlzcGxheVN0YXRlID0gMDsKKwkJZHlsaWJWYXJpYW50U3VmZml4ID0gIiI7CisJCWVuYWJsZURlYnVnU3RyID0gMTsKKwkJZW52aXJvbm1lbnRFbnRyaWVzID0gKAorCQkpOworCQlleGVjdXRhYmxlU3lzdGVtU3ltYm9sTGV2ZWwgPSAwOworCQlleGVjdXRhYmxlVXNlclN5bWJvbExldmVsID0gMDsKKwkJbGliZ21hbGxvY0VuYWJsZWQgPSAwOworCQluYW1lID0gY29tYmluZWQ7CisJCXNhdmVkR2xvYmFscyA9IHsKKwkJfTsKKwkJc2hvd1R5cGVDb2x1bW4gPSAwOworCQlzb3VyY2VEaXJlY3RvcmllcyA9ICgKKwkJKTsKKwkJdmFyaWFibGVGb3JtYXREaWN0aW9uYXJ5ID0geworCQl9OworCX07CisJMUFGRjQyNTUxMUIwNkQ1MDAwNjM5QzIyIC8qIExMLXN0YXIgKi8gPSB7CisJCWlzYSA9IFBCWEV4ZWN1dGFibGU7CisJCWFjdGl2ZUFyZ0luZGljZXMgPSAoCisJCSk7CisJCWFyZ3VtZW50U3RyaW5ncyA9ICgKKwkJKTsKKwkJYXV0b0F0dGFjaE9uQ3Jhc2ggPSAxOworCQlicmVha3BvaW50c0VuYWJsZWQgPSAwOworCQljb25maWdTdGF0ZURpY3QgPSB7CisJCX07CisJCWN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBDdXN0b21EYXRhRm9ybWF0dGVyc0VuYWJsZWQgPSAxOworCQlkYXRhVGlwU2hvd1R5cGVDb2x1bW4gPSAxOworCQlkYXRhVGlwU29ydFR5cGUgPSAwOworCQlkZWJ1Z2dlclBsdWdpbiA9IEdEQkRlYnVnZ2luZzsKKwkJZGlzYXNzZW1ibHlEaXNwbGF5U3RhdGUgPSAwOworCQlkeWxpYlZhcmlhbnRTdWZmaXggPSAiIjsKKwkJZW5hYmxlRGVidWdTdHIgPSAxOworCQllbnZpcm9ubWVudEVudHJpZXMgPSAoCisJCSk7CisJCWV4ZWN1dGFibGVTeXN0ZW1TeW1ib2xMZXZlbCA9IDA7CisJCWV4ZWN1dGFibGVVc2VyU3ltYm9sTGV2ZWwgPSAwOworCQlsaWJnbWFsbG9jRW5hYmxlZCA9IDA7CisJCW5hbWUgPSAiTEwtc3RhciI7CisJCXNhdmVkR2xvYmFscyA9IHsKKwkJfTsKKwkJc2hvd1R5cGVDb2x1bW4gPSAwOworCQlzb3VyY2VEaXJlY3RvcmllcyA9ICgKKwkJKTsKKwkJdmFyaWFibGVGb3JtYXREaWN0aW9uYXJ5ID0geworCQl9OworCX07CisJMUFGRjQyNTYxMUIwNkQ1MDAwNjM5QzIyIC8qIGhvaXN0ZWRQcmVkaWNhdGVzICovID0geworCQlpc2EgPSBQQlhFeGVjdXRhYmxlOworCQlhY3RpdmVBcmdJbmRpY2VzID0gKAorCQkpOworCQlhcmd1bWVudFN0cmluZ3MgPSAoCisJCSk7CisJCWF1dG9BdHRhY2hPbkNyYXNoID0gMTsKKwkJYnJlYWtwb2ludHNFbmFibGVkID0gMDsKKwkJY29uZmlnU3RhdGVEaWN0ID0geworCQl9OworCQljdXN0b21EYXRhRm9ybWF0dGVyc0VuYWJsZWQgPSAxOworCQlkYXRhVGlwQ3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcFNob3dUeXBlQ29sdW1uID0gMTsKKwkJZGF0YVRpcFNvcnRUeXBlID0gMDsKKwkJZGVidWdnZXJQbHVnaW4gPSBHREJEZWJ1Z2dpbmc7CisJCWRpc2Fzc2VtYmx5RGlzcGxheVN0YXRlID0gMDsKKwkJZHlsaWJWYXJpYW50U3VmZml4ID0gIiI7CisJCWVuYWJsZURlYnVnU3RyID0gMTsKKwkJZW52aXJvbm1lbnRFbnRyaWVzID0gKAorCQkpOworCQlleGVjdXRhYmxlU3lzdGVtU3ltYm9sTGV2ZWwgPSAwOworCQlleGVjdXRhYmxlVXNlclN5bWJvbExldmVsID0gMDsKKwkJbGliZ21hbGxvY0VuYWJsZWQgPSAwOworCQluYW1lID0gaG9pc3RlZFByZWRpY2F0ZXM7CisJCXNhdmVkR2xvYmFscyA9IHsKKwkJfTsKKwkJc2hvd1R5cGVDb2x1bW4gPSAwOworCQlzb3VyY2VEaXJlY3RvcmllcyA9ICgKKwkJKTsKKwl9OworCTFBRkY0MjU3MTFCMDZENTAwMDYzOUMyMiAvKiBzY29wZXMgKi8gPSB7CisJCWlzYSA9IFBCWEV4ZWN1dGFibGU7CisJCWFjdGl2ZUFyZ0luZGljZXMgPSAoCisJCSk7CisJCWFyZ3VtZW50U3RyaW5ncyA9ICgKKwkJKTsKKwkJYXV0b0F0dGFjaE9uQ3Jhc2ggPSAxOworCQlicmVha3BvaW50c0VuYWJsZWQgPSAxOworCQljb25maWdTdGF0ZURpY3QgPSB7CisJCX07CisJCWN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBDdXN0b21EYXRhRm9ybWF0dGVyc0VuYWJsZWQgPSAxOworCQlkYXRhVGlwU2hvd1R5cGVDb2x1bW4gPSAxOworCQlkYXRhVGlwU29ydFR5cGUgPSAwOworCQlkZWJ1Z2dlclBsdWdpbiA9IEdEQkRlYnVnZ2luZzsKKwkJZGlzYXNzZW1ibHlEaXNwbGF5U3RhdGUgPSAwOworCQlkeWxpYlZhcmlhbnRTdWZmaXggPSAiIjsKKwkJZW5hYmxlRGVidWdTdHIgPSAxOworCQllbnZpcm9ubWVudEVudHJpZXMgPSAoCisJCSk7CisJCWV4ZWN1dGFibGVTeXN0ZW1TeW1ib2xMZXZlbCA9IDA7CisJCWV4ZWN1dGFibGVVc2VyU3ltYm9sTGV2ZWwgPSAwOworCQlsaWJnbWFsbG9jRW5hYmxlZCA9IDA7CisJCW5hbWUgPSBzY29wZXM7CisJCXNhdmVkR2xvYmFscyA9IHsKKwkJfTsKKwkJc2hvd1R5cGVDb2x1bW4gPSAwOworCQlzb3VyY2VEaXJlY3RvcmllcyA9ICgKKwkJKTsKKwkJdmFyaWFibGVGb3JtYXREaWN0aW9uYXJ5ID0geworCQl9OworCX07CisJMUFGRjQyNTgxMUIwNkQ1MDAwNjM5QzIyIC8qIHNpbXBsZWN0cmVlICovID0geworCQlpc2EgPSBQQlhFeGVjdXRhYmxlOworCQlhY3RpdmVBcmdJbmRpY2VzID0gKAorCQkJWUVTLAorCQkpOworCQlhcmd1bWVudFN0cmluZ3MgPSAoCisJCQkuLi8uLi9leGFtcGxlL3NpbXBsZWN0cmVlL2lucHV0LAorCQkpOworCQlhdXRvQXR0YWNoT25DcmFzaCA9IDE7CisJCWJyZWFrcG9pbnRzRW5hYmxlZCA9IDA7CisJCWNvbmZpZ1N0YXRlRGljdCA9IHsKKwkJfTsKKwkJY3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcEN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBTaG93VHlwZUNvbHVtbiA9IDE7CisJCWRhdGFUaXBTb3J0VHlwZSA9IDA7CisJCWRlYnVnZ2VyUGx1Z2luID0gR0RCRGVidWdnaW5nOworCQlkaXNhc3NlbWJseURpc3BsYXlTdGF0ZSA9IDA7CisJCWR5bGliVmFyaWFudFN1ZmZpeCA9ICIiOworCQllbmFibGVEZWJ1Z1N0ciA9IDE7CisJCWVudmlyb25tZW50RW50cmllcyA9ICgKKwkJKTsKKwkJZXhlY3V0YWJsZVN5c3RlbVN5bWJvbExldmVsID0gMDsKKwkJZXhlY3V0YWJsZVVzZXJTeW1ib2xMZXZlbCA9IDA7CisJCWxpYmdtYWxsb2NFbmFibGVkID0gMDsKKwkJbmFtZSA9IHNpbXBsZWN0cmVlOworCQlzYXZlZEdsb2JhbHMgPSB7CisJCX07CisJCXNob3dUeXBlQ29sdW1uID0gMDsKKwkJc291cmNlRGlyZWN0b3JpZXMgPSAoCisJCSk7CisJCXZhcmlhYmxlRm9ybWF0RGljdGlvbmFyeSA9IHsKKwkJfTsKKwl9OworCTFBRkY0MjU5MTFCMDZENTAwMDYzOUMyMiAvKiB0cmVlcmV3cml0ZSAqLyA9IHsKKwkJaXNhID0gUEJYRXhlY3V0YWJsZTsKKwkJYWN0aXZlQXJnSW5kaWNlcyA9ICgKKwkJKTsKKwkJYXJndW1lbnRTdHJpbmdzID0gKAorCQkpOworCQlhdXRvQXR0YWNoT25DcmFzaCA9IDE7CisJCWJyZWFrcG9pbnRzRW5hYmxlZCA9IDA7CisJCWNvbmZpZ1N0YXRlRGljdCA9IHsKKwkJfTsKKwkJY3VzdG9tRGF0YUZvcm1hdHRlcnNFbmFibGVkID0gMTsKKwkJZGF0YVRpcEN1c3RvbURhdGFGb3JtYXR0ZXJzRW5hYmxlZCA9IDE7CisJCWRhdGFUaXBTaG93VHlwZUNvbHVtbiA9IDE7CisJCWRhdGFUaXBTb3J0VHlwZSA9IDA7CisJCWRlYnVnZ2VyUGx1Z2luID0gR0RCRGVidWdnaW5nOworCQlkaXNhc3NlbWJseURpc3BsYXlTdGF0ZSA9IDA7CisJCWR5bGliVmFyaWFudFN1ZmZpeCA9ICIiOworCQllbmFibGVEZWJ1Z1N0ciA9IDE7CisJCWVudmlyb25tZW50RW50cmllcyA9ICgKKwkJKTsKKwkJZXhlY3V0YWJsZVN5c3RlbVN5bWJvbExldmVsID0gMDsKKwkJZXhlY3V0YWJsZVVzZXJTeW1ib2xMZXZlbCA9IDA7CisJCWxpYmdtYWxsb2NFbmFibGVkID0gMDsKKwkJbmFtZSA9IHRyZWVyZXdyaXRlOworCQlzYXZlZEdsb2JhbHMgPSB7CisJCX07CisJCXNob3dUeXBlQ29sdW1uID0gMDsKKwkJc291cmNlRGlyZWN0b3JpZXMgPSAoCisJCSk7CisJCXZhcmlhYmxlRm9ybWF0RGljdGlvbmFyeSA9IHsKKwkJfTsKKwl9OworCTFBRkY0MjY5MTFCMDZEODEwMDYzOUMyMiAvKiBTb3VyY2UgQ29udHJvbCAqLyA9IHsKKwkJaXNhID0gUEJYU291cmNlQ29udHJvbE1hbmFnZXI7CisJCWZhbGxiYWNrSXNhID0gWENTb3VyY2VDb250cm9sTWFuYWdlcjsKKwkJaXNTQ01FbmFibGVkID0gMDsKKwkJc2NtQ29uZmlndXJhdGlvbiA9IHsKKwkJCXJlcG9zaXRvcnlOYW1lc0ZvclJvb3RzID0geworCQkJCSIiID0gIiI7CisJCQl9OworCQl9OworCX07CisJMUFGRjQyNkExMUIwNkQ4MTAwNjM5QzIyIC8qIENvZGUgc2Vuc2UgKi8gPSB7CisJCWlzYSA9IFBCWENvZGVTZW5zZU1hbmFnZXI7CisJCWluZGV4VGVtcGxhdGVQYXRoID0gIiI7CisJfTsKKwkzMkRCQ0Y1RTAzNzBBREVFMDBDOTE3ODMgLyogQU5UTFJfUHJlZml4LnBjaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODIxLCA4OTV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1Mzl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJOERDMkVGNEYwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwl9OworCUY3MDA5QUQ5MEExQkU0QUUwMDJFREQ1RCAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNDU1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTUwNX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2NSwgMTB9LCB7ODAzLCA5NzF9fSI7CisJCX07CisJfTsKKwlGNzAwOUFEQTBBMUJFNEFFMDAyRURENUQgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDc5M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE1MDUsIDU5MX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4MjQsIDl9LCB7ODU2LCA5NzJ9fSI7CisJCX07CisJfTsKKwlGNzAwRTYxOTBBNUY2NkVDMDA1RDA3NTcgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTA4LCA0OTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NjAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNTUxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezY1LCAxM30sIHs3ODAsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3MDBFNjFBMEE1RjY2RUMwMDVEMDc1NyAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs5MDEsIDY4OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNzc5LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTUyNn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szMDQsIDIyfSwgezgyOSwgMTAwNH19IjsKKwkJfTsKKwl9OworCUY3MDBFODVFMEE1RkEyREUwMDVEMDc1NyAvKiBDb21iaW5lZC5nICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDQwMn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyOTUsIDZ9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAzMTV9IjsKKwkJfTsKKwl9OworCUY3MDBFODYzMEE1RkEzMUQwMDVEMDc1NyAvKiBjb21iaW5lZCAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJCWV4ZWN1dGFibGVzID0gKAorCQkJMUFGRjQyNTQxMUIwNkQ1MDAwNjM5QzIyIC8qIGNvbWJpbmVkICovLAorCQkpOworCX07CisJRjcwMEU4NkEwQTVGQTM0RDAwNUQwNzU3IC8qIG1haW4ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExMywgMzQ5fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezQzOSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDc0OH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMn0sIHs5NDcsIDEwMjF9fSI7CisJCX07CisJfTsKKwlGNzAwRThGOTBBNUZBRDIxMDA1RDA3NTcgLyogQU5UTFJQYXJzZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA3ODB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MjY0OSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE1MDYsIDEyMTF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDIsIDUyfSwgezc3MSwgOTUwfX0iOworCQl9OworCX07CisJRjcwMEU4RkEwQTVGQUQyMTAwNUQwNzU3IC8qIEFOVExSUGFyc2VyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezk2NCwgMTg0Nn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezM3MjYsIDY4Nn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s1MTAsIDQ4fSwgezExMzgsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3MDBFQ0NGMEE1RkUxNzYwMDVEMDc1NyAvKiBpbnB1dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzNDV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTE4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTE4fSI7CisJCX07CisJfTsKKwlGNzAwRUNEMDBBNUZFMTc2MDA1RDA3NTcgLyogb3V0cHV0ICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDMyM319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgNDF9IjsKKwkJfTsKKwl9OworCUY3MDBFQ0Q2MEE1RkUxODYwMDVEMDc1NyAvKiBMTC1zdGFyICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwkJZXhlY3V0YWJsZXMgPSAoCisJCQkxQUZGNDI1NTExQjA2RDUwMDA2MzlDMjIgLyogTEwtc3RhciAqLywKKwkJKTsKKwl9OworCUY3MDBFQ0U3MEE1RkUyNUQwMDVEMDc1NyAvKiBtYWluLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzkwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezkyOCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDkyOH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMn0sIHs5NDcsIDEwMjF9fSI7CisJCX07CisJfTsKKwlGNzAwRUQ3RTBBNUZGMTdDMDA1RDA3NTcgLyogQU5UTFJUb2tlblNvdXJjZS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDQ5NH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1MzB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MzAwLCA0Mn0sIHsxMTM4LCA5Njh9fSI7CisJCX07CisJfTsKKwlGNzAwRUQ5NDBBNUZGMkE1MDA1RDA3NTcgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDExODN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzQ1NSwgOH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE1MDUsIDExMDJ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MjUsIDExfSwgezg2MywgOTkzfX0iOworCQl9OworCX07CisJRjcwMEVEOTUwQTVGRjJBNTAwNUQwNzU3IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA0OTQwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezczNDcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns3MTg1LCA3MDV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODQ3LCAzN30sIHs4MjYsIDk4MX19IjsKKwkJfTsKKwl9OworCUY3MDM3Q0VFMEEwNTgyRkMwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDUwN319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1Njh9IjsKKwkJfTsKKwl9OworCUY3MDM3Q0VGMEEwNTgyRkMwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTE0LCA3MDJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTg1MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezEyODgsIDY1MX0iOworCQl9OworCX07CisJRjcwMzdFOUYwQTA1QUZCNjAwNzA0MzVEIC8qIGxleGVydGVzdC1zaW1wbGUgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBRkY0MjUyMTFCMDZENTAwMDYzOUMyMiAvKiBsZXhlcnRlc3Qtc2ltcGxlICovLAorCQkpOworCX07CisJRjcwMzdFQkQwQTA1QjA2QjAwNzA0MzVEIC8qIFRlc3RMZXhlci5nICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDI4Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTcyfSI7CisJCX07CisJfTsKKwlGNzAzODBCQTBBMDdGQTBEMDA3MDQzNUQgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgNTMzfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTU2OH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s0MiwgMzR9LCB7NzgwLCA5Njh9fSI7CisJCX07CisJfTsKKwlGNzAzODBCQjBBMDdGQTBEMDA3MDQzNUQgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMTQsIDkzNn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxODg4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTU0NywgNTE3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezg4MCwgMjR9LCB7NzgwLCA5Njh9fSI7CisJCX07CisJfTsKKwlGNzA0OEZGNTBCMDdEMDU0MDBEMkYzMjYgLyogVGVzdC50b2tlbnMgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMjgyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAzMX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMX0sIHsxMzAwLCAxMDIyfX0iOworCQl9OworCX07CisJRjcwNDhGRjYwQjA3RDA1NDAwRDJGMzI2IC8qIFRlc3RMZXhlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs5MzYsIDMzOH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns2MTQsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA2NjV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDI4fSwgezExNTYsIDk5NX19IjsKKwkJfTsKKwl9OworCUY3MDQ4RkY3MEIwN0QwNTQwMEQyRjMyNiAvKiBUZXN0TGV4ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAyNTM1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNjMzLCA4MjF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDk3LCAyfSwgezExNjEsIDk3OX19IjsKKwkJfTsKKwl9OworCUY3MDZBNTVCMEEwRUMzMDcwMDg5OTlBQiAvKiBpbnB1dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzMTJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzAwLCA4fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMzU2fSI7CisJCX07CisJfTsKKwlGNzBBQTdBNTA5QUEyQTY5MDBDM0ZENUUgLyogQU5UTFIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA3OTN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MjQ2NCwgNTR9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxMzQyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAxOH0sIHs5MzgsIDEwMDV9fSI7CisJCX07CisJfTsKKwlGNzBBQTdBRDA5QUEyQUMwMDBDM0ZENUUgLyogQU5UTFJJbnRTdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTkyLCAxMTcwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTUwNCwgOTgxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezg2NiwgMjl9LCB7ODAzLCA5ODN9fSI7CisJCX07CisJfTsKKwlGNzBBQTdCNTA5QUEyQjg4MDBDM0ZENUUgLyogQU5UTFJDaGFyU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezEwNzksIDg0MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAxNTA0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMjMyMn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2NSwgMTN9LCB7MTEzOCwgOTY4fX0iOworCQl9OworCX07CisJRjcwQUE3QzUwOUFBMzM5OTAwQzNGRDVFIC8qIEFOVExSU3RyaW5nU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTUzNH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE4NDUsIDEyNTl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MjUsIDM1fSwgezc3MCwgOTc3fX0iOworCQl9OworCX07CisJRjcwQUE3QzYwOUFBMzM5OTAwQzNGRDVFIC8qIEFOVExSU3RyaW5nU3RyZWFtLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMTQsIDUzNjl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDU1MywgMTN9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns0MjU0LCA1Mjd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODM1LCA0NH0sIHs4MjMsIDk3Nn19IjsKKwkJfTsKKwl9OworCUY3MEFBN0NFMDlBQTM3OTMwMEMzRkQ1RSAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEyMDl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyMDIwLCA2MzZ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NTQxLCA0Nn0sIHsxMTM4LCA5Njh9fSI7CisJCX07CisJfTsKKwlGNzBCMTFCQjBDNEMyQjY0MDBDM0VDRTAgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTIzNywgNjI0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NjkxLCAxODg3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezQsIDI4fSwgezkzOSwgOTg5fX0iOworCQl9OworCX07CisJRjcwQjExQkMwQzRDMkI2NDAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezEyMzAsIDExOTZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTQ0LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7Mjg0OSwgNzkyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezcwOCwgMX0sIHs5MzksIDk4OX19IjsKKwkJfTsKKwl9OworCUY3MEIxMUMxMEM0QzJCNzkwMEMzRUNFMCAvKiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7NzQzLCA4NjZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMTUwNH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDI5OTN9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDUsIDI4fSwgezgwMiwgOTk0fX0iOworCQl9OworCX07CisJRjcwQjExQzIwQzRDMkI3OTAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs3OTgsIDE2Nzd9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU5MSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE2NSwgMzA2OX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szNywgMjR9LCB7ODU3LCA5OTN9fSI7CisJCX07CisJfTsKKwlGNzEzMjU4NjBDNEEwNjA5MDBCOTlGMkQgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTI3MiwgMTA2Nn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezkxOSwgMjk4MX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3syMiwgMzl9LCB7ODczLCA5Njl9fSI7CisJCX07CisJfTsKKwlGNzEzMjU4NzBDNEEwNjA5MDBCOTlGMkQgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTI3OSwgMzE3Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjY1MCwgNzgzfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezczNywgMTB9LCB7OTM5LCA5ODl9fSI7CisJCX07CisJfTsKKwlGNzJCOENGQTBBRDAxRDM4MDAxM0YxRTIgLyogRnV6enkuZyAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMTMxfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE2ODcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNDA5LCAyNzh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDJ9LCB7OTQ3LCAxMDIxfX0iOworCQl9OworCX07CisJRjcyQjhEMDkwQUQwMURDQjAwMTNGMUUyIC8qIEZ1enp5LnRva2VucyAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzMTJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1M30iOworCQl9OworCX07CisJRjcyQjhEMEIwQUQwMURDQjAwMTNGMUUyIC8qIEZ1enp5TGV4ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTQwNSwgMjg4MjF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MjM2MzUsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns0MTcxNiwgOTE2fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAxfSwgezEzMDAsIDEwMjJ9fSI7CisJCX07CisJfTsKKwlGNzJDNThFODBBQjM5MTFEMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezg0NSwgMTA5Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyMjg5LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTU4NSwgMTUzOH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s1NywgMzN9LCB7MTE1NiwgOTk1fX0iOworCQl9OworCX07CisJRjcyQzU4RTkwQUIzOTExRDAwMjgyNTc0IC8qIEFOVExSQ29tbW9uVHJlZS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTE0LCA0MDU2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezQ4NDAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns0NjQzLCAzMzh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NzIzLCA4fSwgezg5MiwgOTgzfX0iOworCQl9OworCX07CisJRjcyQzU5QTUwQUI0RjIwQTAwMjgyNTc0IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA4MzJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTc2NSwgMTR9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns4NDIsIDE0NzJ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MjYsIDV9LCB7Nzg5LCA5ODR9fSI7CisJCX07CisJfTsKKwlGNzJDNTlBNjBBQjRGMjBBMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDI3OTV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzQyNCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezI3OTksIDExNDl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NTIsIDQzfSwgezkzMSwgOTg1fX0iOworCQl9OworCX07CisJRjcyQzVCODIwQUI1MkFEMzAwMjgyNTc0IC8qIEFOVExSVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgNjYzfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezIxMTUsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNDg5LCA2NDd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTEsIDI1fSwgezExMzgsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3MkM1RDU0MEFCNjNDMUQwMDI4MjU3NCAvKiBBTlRMUlRyZWVQYXJzZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMTA1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7ODQyLCAxMzc4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezc1NCwgMH0sIHs3MzYsIDk5OX19IjsKKwkJfTsKKwl9OworCUY3MkM1RDU1MEFCNjNDMUQwMDI4MjU3NCAvKiBBTlRMUlRyZWVQYXJzZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTcxLCAyMzQwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezIwNDcsIDE0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NTUwMywgMTI2NH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3NzgsIDB9LCB7ODY2LCAxMDI3fX0iOworCQl9OworCX07CisJRjcyQzVENjAwQUI2M0UwQjAwMjgyNTc0IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgNTU5fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezYwLCAxN30iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1Njh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MjIsIDM4fSwgezk5OSwgOTc1fX0iOworCQl9OworCX07CisJRjcyQzVENjEwQUI2M0UwQjAwMjgyNTc0IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgNzE1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTU1Mn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3MjksIDF9LCB7ODY2LCAxMDI3fX0iOworCQl9OworCX07CisJRjcyQzVFMkYwQUI3NTI5QzAwMjgyNTc0IC8qIGlucHV0ICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDI5OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTE4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAzMH0sIHs4NjMsIDk5M319IjsKKwkJfTsKKwl9OworCUY3MkM1RTMxMEFCNzUyOUMwMDI4MjU3NCAvKiBvdXRwdXQgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezE2MzYsIDMyM319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMjMzfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezQyLCAxNn0sIHsxNDE1LCA5ODZ9fSI7CisJCX07CisJfTsKKwlGNzJDNUU1NjBBQjdFNDEwMDAyODI1NzQgLyogbWFpbi5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTk1LCAxMDkyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI5MTYsIDE4fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTY0NywgMTcwMX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3NSwgMH0sIHs4ODAsIDEwMjN9fSI7CisJCX07CisJfTsKKwlGNzJDNUU1QTBBQjdFNEM5MDAyODI1NzQgLyogc2ltcGxlY3RyZWUgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBRkY0MjU4MTFCMDZENTAwMDYzOUMyMiAvKiBzaW1wbGVjdHJlZSAqLywKKwkJKTsKKwl9OworCUY3MkM1RUNDMEFCN0U1QTUwMDI4MjU3NCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs3NDQsIDg0M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTk3LCAyNn0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDIwNTh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDIsIDMxfSwgezgwMywgOTcxfX0iOworCQl9OworCX07CisJRjcyQzVFQ0QwQUI3RTVBNTAwMjgyNTc0IC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezc0NCwgMTA1M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezg0MiwgMTYxOX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4NDgsIDI0fSwgezgwMywgOTcxfX0iOworCQl9OworCX07CisJRjczOEQxNzMwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezEwOTAsIDY2M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1Njh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDU1fSwgezc4MCwgOTY4fX0iOworCQl9OworCX07CisJRjczOEQxNzQwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezEwODMsIDExODN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NzgsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNTUwfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezQyLCAzNH0sIHs3ODAsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3MzhEMTc1MEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUlRyZWVFeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA1MzN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMTUwNX0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1ODl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDIsIDE2fSwgezc3MiwgOTg2fX0iOworCQl9OworCX07CisJRjczOEQxNzYwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSVHJlZUV4Y2VwdGlvbi5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTE4LCAxMDc5fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1ODYsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxMTQzLCAxMDk5fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAxN30sIHs4NTksIDEwMDZ9fSI7CisJCX07CisJfTsKKwlGNzM4RDFGRTBCMDdCMUNFMDAxODEzQzQgLyogU3ltYm9sVGFibGVMZXhlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4ODgsIDg5M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTI5MX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMn0sIHs5NDcsIDEwMjF9fSI7CisJCX07CisJfTsKKwlGNzM4RDFGRjBCMDdCMUNFMDAxODEzQzQgLyogU3ltYm9sVGFibGVMZXhlci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDg4Nzl9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDY5LCAxMX0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezIyNCwgMTM0MX0iOworCQl9OworCX07CisJRjczOEQyMDAwQjA3QjFDRTAwMTgxM0M0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTE3MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MTAsIDEyfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NjYxLCA2MDl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NjgxLCAwfSwgezk0NywgMTAyMX19IjsKKwkJfTsKKwl9OworCUY3MzhEMjAxMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4OTQsIDc4MjZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTg1NjAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxMDgwMywgNTc3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezcwOSwgMH0sIHs5NDcsIDEwMjF9fSI7CisJCX07CisJfTsKKwlGNzM4RDIyMzBCMDdCM0JDMDAxODEzQzQgLyogVFBhcnNlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTE0LCA4NTh9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTExMywgODB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns4NjYsIDU3N30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMX0sIHsxMzAwLCAxMDIyfX0iOworCQl9OworCX07CisJRjczOEQyMjQwQjA3QjNCQzAwMTgxM0M0IC8qIFRQYXJzZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTIyLCA0NDIwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns3MDE5LCA0OTZ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDF9LCB7MTMwMCwgMTAyMn19IjsKKwkJfTsKKwl9OworCUY3MzhEMjUxMEIwN0I4NDIwMDE4MTNDNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezg4MCwgMTcxMzR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDU1NjAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyODM4MSwgOTIxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAwfSwgezg4MCwgMTAyM319IjsKKwkJfTsKKwl9OworCUY3MzhEMjgxMEIwN0I5QjYwMDE4MTNDNCAvKiBTaW1wbGVDTGV4ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTEzMiwgMTIxNDJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDExNzV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjczOEQyODIwQjA3QjlCNjAwMTgxM0M0IC8qIFNpbXBsZUNQYXJzZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAxMTk2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE5MDAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns3ODYsIDcwMn0iOworCQl9OworCX07CisJRjczOEQzNUQwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkTGV4ZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA0ODF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NTEwLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjUxLCA2NTV9IjsKKwkJfTsKKwl9OworCUY3MzhEMzVFMEIwN0MxMDUwMDE4MTNDNCAvKiBDb21iaW5lZExleGVyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezk5OSwgNDc5N319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTE5MX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMjN9LCB7OTI3LCAxMDAwfX0iOworCQl9OworCX07CisJRjczOEQzNUYwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkUGFyc2VyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNzgwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezQwNywgMTJ9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns0ODMsIDU1Mn0iOworCQl9OworCX07CisJRjczOEQzNjAwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkUGFyc2VyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMzksIDI2NjV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NjE3NSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezI3NDksIDEwOTJ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDIsIDE3fSwgezkzMSwgOTg1fX0iOworCQl9OworCX07CisJRjczRTJCNzIwQTlDRkU2QTAwNUQ2MjY3IC8qIEFOVExSVHJlZS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE1MDh9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NzcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNzEwfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5NSwgMTF9LCB7Nzk0LCA5ODR9fSI7CisJCX07CisJfTsKKwlGNzNFMkI3QTBBOUQwQUZDMDA1RDYyNjcgLyogQU5UTFJUcmVlQWRhcHRvci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs5MjIsIDIwNDF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NzcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gIns1MDUyLCAxMzQwfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezg0OCwgMTh9LCB7ODAzLCA5ODN9fSI7CisJCX07CisJfTsKKwlGNzQxRDA2NDBCMzgxMkQ0MDAyNERGM0YgLyogU2ltcGxlQ1dhbGtlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE1ODZ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDExLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgNzEyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezY2OSwgMH0sIHs4ODAsIDEwMjN9fSI7CisJCX07CisJfTsKKwlGNzQxRDA2NTBCMzgxMkQ0MDAyNERGM0YgLyogU2ltcGxlQ1dhbGtlci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDE1MDI4fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI5NDI5LCA0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7Mjg4NzcsIDgyMH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3MzMsIDV9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjc2Mjg3M0YwQjcxNTE5QjAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgYWxsIGV4YW1wbGVzICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwl9OworCUY3NjI4NzQ1MEI3MTUxRTMwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIGZ1enp5ICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwl9OworCUY3NjI4Nzc4MEI3MTU1N0UwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIGxleGVydGVzdC1zaW1wbGUgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCX07CisJRjc2Mjg3N0UwQjcxNTU5QzAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgY29tYmluZWQgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCX07CisJRjc2Mjg3ODIwQjcxNTU5RjAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgTEwtc3RhciAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwlGNzYyODc4NjBCNzE1NUEyMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBob2lzdGVkUHJlZGljYXRlcyAqLyA9IHsKKwkJYWN0aXZlRXhlYyA9IDA7CisJfTsKKwlGNzYyODc4QTBCNzE1NUFCMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBzY29wZXMgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCX07CisJRjc2Mjg3OEUwQjcxNTVBRjAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgc2ltcGxlY3RyZWUgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCX07CisJRjc2Mjg3OUMwQjcxNTc4RDAwNkFBN0VGIC8qIFJFQURNRS5ydGYgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMzQsIDQ4Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxMDYsIDR9IjsKKwkJCXNlcE5hdlZpc1JlY3QgPSAie3swLCAwfSwgezExMzQsIDQ4Mn19IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDU1fSwgezExMzgsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3NkFBOThFMENFQTUxNUEwMEFGMDQ0QyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTQxN319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyMjU0LCA1fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjMsIDE2Njd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTkxLCAzOH0sIHs4NzMsIDk2OX19IjsKKwkJfTsKKwl9OworCUY3NkFBOThGMENFQTUxNUEwMEFGMDQ0QyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezg4NywgMjgzNH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0NDgzLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7NDMxMSwgNDExfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezcyMiwgOH0sIHs4OTIsIDk4M319IjsKKwkJfTsKKwl9OworCUY3NzE1RDFBMEFDOURDRTQwMEVEOTg0RCAvKiBTaW1wbGVDLmcgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTU2MH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNzQxLCAxMX0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDQzNX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMH0sIHs4ODAsIDEwMjN9fSI7CisJCX07CisJfTsKKwlGNzcxNUQxQjBBQzlEQ0U1MDBFRDk4NEQgLyogU2ltcGxlQ1dhbGtlci5nICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDkzNn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns2NCwgMTh9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA0MDd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjc3MTVEMUMwQUM5REREODAwRUQ5ODREIC8qIFNpbXBsZUMudG9rZW5zICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDMxMn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns2MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDIzOH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMH0sIHs3NzUsIDEwMjN9fSI7CisJCX07CisJfTsKKwlGNzcxNUQxRDBBQzlEREQ4MDBFRDk4NEQgLyogU2ltcGxlQ1dhbGtlci50b2tlbnMgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzk0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezIzMSwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDIzOH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3OTQsIDV9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjc3MTVEMkUwQUM5REU5RTAwRUQ5ODREIC8qIFNpbXBsZUNMZXhlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDk0OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns4NzksIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA5NDV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjc3MTVEMkYwQUM5REU5RTAwRUQ5ODREIC8qIFNpbXBsZUNMZXhlci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEyMzM3fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI0MDUyLCAxMX0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezEwMzQsIDEzMzB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7Nzk4LCA1fSwgezg4MCwgMTAyM319IjsKKwkJfTsKKwl9OworCUY3NzE1RDMwMEFDOURFOUUwMEVEOTg0RCAvKiBTaW1wbGVDUGFyc2VyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNDIyNX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MDYsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA1MDl9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjc3MTVEMzEwQUM5REU5RTAwRUQ5ODREIC8qIFNpbXBsZUNQYXJzZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTE1MywgMzY1MDR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzQyNTAsIDE0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzQxMzEsIDQ3OX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szMCwgMzB9LCB7ODYxLCA5ODh9fSI7CisJCX07CisJfTsKKwlGNzc1NEUzRDBBNUMwQTA1MDBEMDg3M0EgLyogQU5UTFJERkEuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA5ODh9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzA4NCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezIyMDEsIDg4NH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szNywgOH0sIHs4MzEsIDk5N319IjsKKwkJfTsKKwl9OworCUY3NzU0RTNFMEE1QzBBMDUwMEQwODczQSAvKiBBTlRMUkRGQS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs5NzEsIDMxODV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MjgyMywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE5MTAsIDEwNTF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODIyLCAwfSwgezg1NywgMTAxOX19IjsKKwkJfTsKKwl9OworCUY3Nzc0NDAzMEIyMzRBMzQwMEQxRjg5QiAvKiBBTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDU0Nn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTc2LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7Mzk4LCAxMzQ2fSI7CisJCX07CisJfTsKKwlGNzc3NDQwNDBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3NTR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU3NiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezYxMiwgMTQ2N30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s2NSwgMTN9LCB7MTEzOCwgOTY4fX0iOworCQl9OworCX07CisJRjc3NzQ3NTUwQjIzQTcwNjAwRDFGODlCIC8qIEFOVExSRGVidWcuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA0NDJ9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MTU5NSwgMjF9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxMzQyfSI7CisJCX07CisJfTsKKwlGNzc3NjVDQTA5REM1ODMwMDA1MTcxODEgLyogQU5UTFJUb2tlbi5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDEwNTN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7Mjk3MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE4OTUsIDEwNzR9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NTI1LCAzMX0sIHsxMTM4LCA5Njh9fSI7CisJCX07CisJfTsKKwlGNzc3NjYwMzA5REM1Q0Y0MDA1MTcxODEgLyogQU5UTFJDb21tb25Ub2tlbi5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4NjksIDE2OTB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzQwOSwgMTh9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAzMjA2fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezIxLCA0fSwgezkyOCwgOTcwfX0iOworCQl9OworCX07CisJRjc3NzY2MDQwOURDNUNGNDAwNTE3MTgxIC8qIEFOVExSQ29tbW9uVG9rZW4ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTI1OCwgNDY5M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns1MTYwLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjcwMywgODcxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezc2MiwgMzR9LCB7OTAwLCA5ODB9fSI7CisJCX07CisJfTsKKwlGNzc3NjY4MDA5REM3MTlDMDA1MTcxODEgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODE0LCA3OTN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NzcsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNTY4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezIzNCwgMzd9LCB7ODM5LCA5NzV9fSI7CisJCX07CisJfTsKKwlGNzc3NjY4MTA5REM3MTlDMDA1MTcxODEgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTIyLCAxMjA5fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI3NTUsIDE0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjIyNCwgOTIyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezYzOCwgMjJ9LCB7OTk5LCA5NzV9fSI7CisJCX07CisJfTsKKwlGNzc3NjY5MTA5REM3MkQ2MDA1MTcxODEgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDk0OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1NjR9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDAsIDU1fSwgezc0OCwgOTczfX0iOworCQl9OworCX07CisJRjc3NzY2OTIwOURDNzJENjAwNTE3MTgxIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgMjI4OH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInszNDcyLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzEyOCwgNTYyfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezg4NCwgMTV9LCB7NzcyLCA5ODZ9fSI7CisJCX07CisJfTsKKwlGNzc3NjZBRTA5REQ1M0U4MDA1MTcxODEgLyogQU5UTFJUb2tlblN0cmVhbS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDgxOX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyMzY3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTM1OSwgOTMwfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezMwLCA0N30sIHsxMTM4LCA5Njh9fSI7CisJCX07CisJfTsKKwlGNzlENTY1RjBBMEUyM0E0MDBFQTNDRUUgLyogZnV6enkgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBRkY0MjUzMTFCMDZENTAwMDYzOUMyMiAvKiBmdXp6eSAqLywKKwkJKTsKKwl9OworCUY3OUQ1NkMwMEEwRTI4NzUwMEVBM0NFRSAvKiBtYWluLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezk0MywgMzg0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezU1NiwgMTV9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA4NDh9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjc5RDU5ODkwQTBFNTFBQjAwRUEzQ0VFIC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTEyNSwgNTU5fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezc3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTU5NH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3szNywgMjF9LCB7MTI2MCwgMTAwN319IjsKKwkJfTsKKwl9OworCUY3OUQ1OThBMEEwRTUxQUIwMEVBM0NFRSAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezExMTgsIDk0OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyMDA2LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTU5MCwgODA3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAxNn0sIHsxMjYwLCAxMDA3fX0iOworCQl9OworCX07CisJRjdBNDA5OEIwOTY1OUJGMzAwMkNDNzgxIC8qIEFOVExSQmFzZVJlY29nbml6ZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTAzNCwgMjM3OX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3MzgxLCAxMjV9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyMjQxLCAxNDUxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezM5LCA0OH0sIHs4NzQsIDk4MH19IjsKKwkJfTsKKwl9OworCUY3QTQwOThDMDk2NTlCRjMwMDJDQzc4MSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezk2NCwgMTQ0MzB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDAxMDAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxODAxLCA3MTV9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NzU3LCA1fSwgezkyMSwgMTAyMH19IjsKKwkJfTsKKwl9OworCUY3QTQwOTkxMDk2NTlCRkIwMDJDQzc4MSAvKiBBTlRMUkxleGVyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTEzMX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NywgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezE2MzAsIDEwMjN9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MzMsIDI5fSwgezc2MiwgOTk5fX0iOworCQl9OworCX07CisJRjdBNDA5OTIwOTY1OUJGQjAwMkNDNzgxIC8qIEFOVExSTGV4ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA1NDczfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI0NzgsIDEzfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTIxNSwgOTQ4fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgxMCwgMzJ9LCB7ODQzLCA5ODF9fSI7CisJCX07CisJfTsKKwlGN0IxRTVBQzBDRDdDRjE5MDBDRTEzNkUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTA4MywgMTMyNn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1NzF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDQsIDI4fSwgezgzNSwgOTczfX0iOworCQl9OworCX07CisJRjdCMUU1QUQwQ0Q3Q0YxOTAwQ0UxMzZFIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgMzQwNn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3MiwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE1OTZ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7ODI2LCAzNH0sIHs4MzksIDk5NH19IjsKKwkJfTsKKwl9OworCUY3Q0Q0NUZDMEM2NEJBNEIwMEZGOTMzQSAvKiBtYWluLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgNDgxfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDExNTd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDIsIDE0fSwgezg2MSwgOTg4fX0iOworCQl9OworCX07CisJRjdDRDQ1RkQwQzY0QkE0QjAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlLmcgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzEyfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezg3LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTk1fSI7CisJCX07CisJfTsKKwlGN0NENDYzNDBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGUudG9rZW5zICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs2MzgsIDE3Mn19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInswLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDM1fSwgezg2MSwgOTg4fX0iOworCQl9OworCX07CisJRjdDRDQ2MzUwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlTGV4ZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA0MDN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MzA5LCA0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgNzU5fSI7CisJCX07CisJfTsKKwlGN0NENDYzNjBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGVMZXhlci5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDI1NjF9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDE0MjF9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDB9LCB7ODgwLCAxMDIzfX0iOworCQl9OworCX07CisJRjdDRDQ2MzcwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlUGFyc2VyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMTAwMX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxOTU4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTQ5NiwgNzM1fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAyM30sIHs4NzAsIDEwMDB9fSI7CisJCX07CisJfTsKKwlGN0NENDYzODBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGVQYXJzZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTA5NywgNDg3NX19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns1NTM3LCAxNH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezUxNTYsIDYzMX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgNTJ9LCB7ODAzLCA5NzF9fSI7CisJCX07CisJfTsKKwlGN0NENDc1QzBDNjREMjI4MDBGRjkzM0EgLyogdHJlZXJld3JpdGUgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBRkY0MjU5MTFCMDZENTAwMDYzOUMyMiAvKiB0cmVlcmV3cml0ZSAqLywKKwkJKTsKKwl9OworCUY3Q0Q0NzYxMEM2NEQyMzgwMEZGOTMzQSAvKiBSZWdlbmVyYXRlIHRyZWVyZXdyaXRlICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwl9OworCUY3Q0VDRDdEMEIxRTVDMzcwMDU0Q0MzQiAvKiBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MzEsIDM0NTh9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7OTk5NiwgMTB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNTgsIDE0MTV9IjsKKwkJfTsKKwl9OworCUY3REQwNUUyMEE3QjE0QkUwMDZBMDA2QyAvKiBpbnB1dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzNDV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDV9IjsKKwkJfTsKKwl9OworCUY3REQwNUUzMEE3QjE0QkUwMDZBMDA2QyAvKiBvdXRwdXQgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzQ1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxNH0iOworCQl9OworCX07CisJRjdERDA1RTQwQTdCMTRCRTAwNkEwMDZDIC8qIFQuZyAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCA2NTB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDYxOX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMX0sIHsxMzAwLCAxMDIyfX0iOworCQl9OworCX07CisJRjdERDA1RTcwQTdCMTU3MjAwNkEwMDZDIC8qIG1haW4ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTAyNywgMzkwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezk2OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDk2OH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgNH0sIHs3NzYsIDEwMTl9fSI7CisJCX07CisJfTsKKwlGN0REMDVFRDBBN0IxNUUxMDA2QTAwNkMgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8gPSB7CisJCWFjdGl2ZUV4ZWMgPSAwOworCQlleGVjdXRhYmxlcyA9ICgKKwkJCTFBRkY0MjU2MTFCMDZENTAwMDYzOUMyMiAvKiBob2lzdGVkUHJlZGljYXRlcyAqLywKKwkJKTsKKwl9OworCUY3REQwNkU3MEE3QjE3MDAwMDZBMDA2QyAvKiBUTGV4ZXIuaCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTI0MSwgODk0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA3NzB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDF9LCB7MTMwMCwgMTAyMn19IjsKKwkJfTsKKwl9OworCUY3REQwNkU4MEE3QjE3MDAwMDZBMDA2QyAvKiBUTGV4ZXIubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7OTk5LCA2MjY2fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI4MjAsIDh9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsyNDkzLCA1MzJ9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDF9LCB7MTMwMCwgMTAyMn19IjsKKwkJfTsKKwl9OworCUY3REQwNzNDMEE3QjY2MEEwMDZBMDA2QyAvKiBpbnB1dCAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzMjN9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7MCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDk3fSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAyfSwgezk0NywgMTAyMX19IjsKKwkJfTsKKwl9OworCUY3REQwNzNEMEE3QjY2MEEwMDZBMDA2QyAvKiBvdXRwdXQgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzQ1fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAxOTJ9IjsKKwkJfTsKKwl9OworCUY3REQwNzNFMEE3QjY2MEEwMDZBMDA2QyAvKiBTeW1ib2xUYWJsZS5nICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDk4OH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns3NzEsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNzAsIDMzNH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMn0sIHs5NDcsIDEwMjF9fSI7CisJCX07CisJfTsKKwlGN0REMDc0MzBBN0I2NjE4MDA2QTAwNkMgLyogc2NvcGVzICovID0geworCQlhY3RpdmVFeGVjID0gMDsKKwkJZXhlY3V0YWJsZXMgPSAoCisJCQkxQUZGNDI1NzExQjA2RDUwMDA2MzlDMjIgLyogc2NvcGVzICovLAorCQkpOworCX07CisJRjdERDA3ODAwQTdCNjdBNzAwNkEwMDZDIC8qIG1haW4ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7ODEzLCAzOTB9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDgyLCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgOTQxfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCAwfSwgezg4MCwgMTAyM319IjsKKwkJfTsKKwl9OworCUY3RTI2MTE0MEIxRTQ0MzIwMDEzRjY0MCAvKiBBTlRMUkRlYnVnUGFyc2VyLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNCwgNjExfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezE1NjksIDM0fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MTU4LCAxNDExfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezE5LCA1MX0sIHs4NTYsIDk3Mn19IjsKKwkJfTsKKwl9OworCUY3RTI2MTE1MEIxRTQ0MzIwMDEzRjY0MCAvKiBBTlRMUkRlYnVnUGFyc2VyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgzMSwgMTcwM319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInszMjI1LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MjMsIDE1Mjl9IjsKKwkJfTsKKwl9OworCUY3RTI2MTE4MEIxRTQ0M0MwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZVBhcnNlci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTQsIDYzN319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTczLCA5fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTU3M30iOworCQl9OworCX07CisJRjdFMjYxMTkwQjFFNDQzQzAwMTNGNjQwIC8qIEFOVExSRGVidWdUcmVlUGFyc2VyLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgzMSwgMTY3N319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInszMjA2LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7Mjc2MCwgNTk3fSI7CisJCX07CisJfTsKKwlGN0UyNjExRTBCMUU0NEU4MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezkwNSwgODkzfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezI1MTAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCAyNjMwfSI7CisJCQlzZXBOYXZXaW5kb3dGcmFtZSA9ICJ7ezgsIDd9LCB7OTY0LCAxMDIxfX0iOworCQl9OworCX07CisJRjdFMjYxMUYwQjFFNDRFODAwMTNGNjQwIC8qIEFOVExSRGVidWdUb2tlblN0cmVhbS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDI1NzR9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NDc1MCwgOH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezMyMDUsIDY5N30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s4NDgsIDIwfSwgezc3MCwgOTc3fX0iOworCQl9OworCX07CisJRjdFMjYxMjIwQjFFNDRGQTAwMTNGNjQwIC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MzEsIDc5M319IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNjA4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTU3N30iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s0OTUsIDUxfSwgezExMzgsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3RTI2MTIzMEIxRTQ0RkEwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0ubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTA3OSwgMjI4OH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0NDg4LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MzQ2NSwgMTEzMX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s0MiwgMzR9LCB7MTEzOCwgOTY4fX0iOworCQl9OworCX07CisJRjdFMjYxMjYwQjFFNDUwNzAwMTNGNjQwIC8qIEFOVExSRGVidWdUcmVlQWRhcHRvci5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4NTIsIDU5OH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsxNTU0LCAwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTU2OX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s0MiwgMTl9LCB7ODAzLCA5ODN9fSI7CisJCX07CisJfTsKKwlGN0UyNjEyNzBCMUU0NTA3MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezg0NSwgMjkzOH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gInsyNTI3LCA2fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTUyNH0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgNTV9LCB7MTEzOCwgOTY4fX0iOworCQl9OworCX07CisJRjdFMjYxMzcwQjFFNDU1ODAwMTNGNjQwIC8qIEFOVExSRGVidWdFdmVudFByb3h5LmggKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxNywgMTQwNH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns0MDcwLCA4fSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7ODgsIDE1MDd9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7MTksIDIzfSwgezcxNSwgMTAwMH19IjsKKwkJfTsKKwl9OworCUY3RTI2MTM4MEIxRTQ1NTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnRXZlbnRQcm94eS5tICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHsxMTgxLCA0NjU0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezUxNjMsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInsxNTgsIDE0MjJ9IjsKKwkJfTsKKwl9OworCUY3RTk4Mzk0MEEwRDZBNUYwMEYxNjA5MyAvKiBtYWluLm0gKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzg0fX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezU5OCwgMH0iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezAsIDYzMX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3sxOSwgMzV9LCB7ODYxLCA5ODh9fSI7CisJCX07CisJfTsKKwlGN0VGRkM4QjBEMTY0RTJDMDA4RUU1N0UgLyogQ0hBTkdFUy50eHQgKi8gPSB7CisJCXVpQ3R4dCA9IHsKKwkJCXNlcE5hdkludEJvdW5kc1JlY3QgPSAie3swLCAwfSwgezgxMywgMzEwfX0iOworCQkJc2VwTmF2U2VsUmFuZ2UgPSAiezAsIDB9IjsKKwkJCXNlcE5hdlZpc1JhbmdlID0gInswLCA0MTB9IjsKKwkJCXNlcE5hdldpbmRvd0ZyYW1lID0gInt7NDIsIDM0fSwgezExMzgsIDk2OH19IjsKKwkJfTsKKwl9OworCUY3RjIxOEVFMDk3QUZCMUEwMDA0NzJFOSAvKiBBTlRMUkJpdFNldC5oICovID0geworCQl1aUN0eHQgPSB7CisJCQlzZXBOYXZJbnRCb3VuZHNSZWN0ID0gInt7MCwgMH0sIHs4MTMsIDExMDV9fSI7CisJCQlzZXBOYXZTZWxSYW5nZSA9ICJ7NTAsIDEwfSI7CisJCQlzZXBOYXZWaXNSYW5nZSA9ICJ7MCwgMTY4Mn0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s1MCwgMjR9LCB7ODYxLCA5ODh9fSI7CisJCX07CisJfTsKKwlGN0YyMThFRjA5N0FGQjFBMDAwNDcyRTkgLyogQU5UTFJCaXRTZXQubSAqLyA9IHsKKwkJdWlDdHh0ID0geworCQkJc2VwTmF2SW50Qm91bmRzUmVjdCA9ICJ7ezAsIDB9LCB7MTExNCwgNDEzNH19IjsKKwkJCXNlcE5hdlNlbFJhbmdlID0gIns4ODU2LCAxM30iOworCQkJc2VwTmF2VmlzUmFuZ2UgPSAiezU4OTUsIDg4NX0iOworCQkJc2VwTmF2V2luZG93RnJhbWUgPSAie3s3MTEsIDE1fSwgezkyOCwgOTcwfX0iOworCQl9OworCX07Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVmZDlhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDYyODggQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0NjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhBZ2dyZWdhdGVUYXJnZXQgc2VjdGlvbiAqLworCQlGNzYyODczRjBCNzE1MTlCMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBhbGwgZXhhbXBsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhBZ2dyZWdhdGVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gRjc2Mjg3NDAwQjcxNTFCOTAwNkFBN0VGIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYQWdncmVnYXRlVGFyZ2V0ICJSZWdlbmVyYXRlIGFsbCBleGFtcGxlcyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJRjc2Mjg3QTcwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJRjc2Mjg3NEMwQjcxNTQxNzAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJRjc2Mjg3QUIwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJRjc5RUZCMTQwQzU4NDVBMzAwQUJBQjNEIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJRjc2Mjg3QTkwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUEwRjM0NzExMkVBNDNCQTAwNDk2QkI4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJRjc2Mjg3QUQwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJRjc2Mjg3QUYwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUEwRjM0NzMxMkVBNDNCQTAwNDk2QkI4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUEwRjM0NzUxMkVBNDNCQTAwNDk2QkI4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJSZWdlbmVyYXRlIGFsbCBleGFtcGxlcyI7CisJCQlwcm9kdWN0TmFtZSA9IFVudGl0bGVkOworCQl9OworLyogRW5kIFBCWEFnZ3JlZ2F0ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEJ1aWxkRmlsZSBzZWN0aW9uICovCisJCTFBMDFCRDkzMTJFQjVBNjAwMDQyODc5MiAvKiBTaW1wbGlmaWVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTBGMzQ3RjEyRUE0NDQ1MDA0OTZCQjggLyogU2ltcGxpZmllci5tICovOyB9OworCQkxQTBGMzQ1RTEyRUE0MkQ4MDA0OTZCQjggLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUEwRjM0NUYxMkVBNDJEODAwNDk2QkI4IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg2N0Q2OUJGRTg0MDI4RkMwMkFBQzA3IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkxQTBGMzQ2MDEyRUE0MkQ4MDA0OTZCQjggLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcxRjZCOEYwOUE4MUU2RjAwMzIyMUY0IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJMUEwRjM0NkQxMkVBNDM0RjAwNDk2QkI4IC8qIE1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMEYzNDMwMTJFQTQxMUYwMDQ5NkJCOCAvKiBNYWluLm0gKi87IH07CisJCTFBMEYzNDgyMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5TGV4ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMEYzNDdBMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5TGV4ZXIuaCAqLzsgfTsKKwkJMUEwRjM0ODQxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlQYXJzZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMEYzNDdDMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5UGFyc2VyLmggKi87IH07CisJCTFBMEYzNDg2MTJFQTQ0NDUwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTBGMzQ3RTEyRUE0NDQ1MDA0OTZCQjggLyogU2ltcGxpZmllci5oICovOyB9OworCQkxQTBGMzQ4OTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTBGMzQ3QjEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLm0gKi87IH07CisJCTFBMEYzNDhBMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5UGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTBGMzQ3RDEyRUE0NDQ1MDA0OTZCQjggLyogUG9seVBhcnNlci5tICovOyB9OworCQkxQTEwMDUwNjExQjg3OTZEMDAyMkI0MzQgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTE4RUY1NTExQjgwMjhEMDAwNjE4NkEgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTEwMDUwNzExQjg3OTZFMDAyMkI0MzQgLyogQU5UTFJCaXRTZXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3RjIxOEVFMDk3QUZCMUEwMDA0NzJFOSAvKiBBTlRMUkJpdFNldC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExMDA1MDgxMUI4NzlBNDAwMjJCNDM0IC8qIEFOVExSRmFzdFF1ZXVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFDQ0M5MDExQjZGRDM5MDAyRTVGNTMgLyogQU5UTFJGYXN0UXVldWUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMTAwNTA5MTFCODc5QTgwMDIyQjQzNCAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjczOEQxNzMwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTEwMDUwQjExQjg3OUI4MDAyMkI0MzQgLyogQU5UTFJJbnRBcnJheS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExQ0NDOTIxMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSSW50QXJyYXkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMTAwQUJCMTFFNjA0RkUwMDZBQkY5NCAvKiBBTlRMUkhhc2hSdWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTEwMEFCOTExRTYwNEZFMDA2QUJGOTQgLyogQU5UTFJIYXNoUnVsZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExMDBBQkMxMUU2MDRGRTAwNkFCRjk0IC8qIEFOVExSSGFzaFJ1bGUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMTAwQUJBMTFFNjA0RkUwMDZBQkY5NCAvKiBBTlRMUkhhc2hSdWxlLm0gKi87IH07CisJCTFBMTIxMTAzMTFEM0E2MkIwMEYyN0IzOCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMjMxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0Lm0gKi87IH07CisJCTFBMTIxMTc5MTFEM0I0NUMwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQkxQTEyMTE3QTExRDNCNDcwMDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCQjUxMUQyQzcxMTAwMEM3MkZDIC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMUExMjExN0IxMUQzQjQ3MDAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QkI3MTFEMkM3MTEwMDBDNzJGQyAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCTFBMTIxMUQ3MTFEM0JGNjgwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQkxQTEyMTFEODExRDNCRjY4MDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCQjUxMUQyQzcxMTAwMEM3MkZDIC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMUExMjExRDkxMUQzQkY2ODAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QkI3MTFEMkM3MTEwMDBDNzJGQyAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCTFBMTIxMURFMTFEM0JGQzkwMEYyN0IzOCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QjIwMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QubSAqLzsgfTsKKwkJMUExMjEyMkIxMUQzQzkzNTAwRjI3QjM4IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMTIxMjJBMTFEM0M5MzUwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBMTIxMjJDMTFEM0M5MzUwMEYyN0IzOCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEJCNTExRDJDNzExMDAwQzcyRkMgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTEyMTIyRDExRDNDOTM1MDBGMjdCMzggLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCQjcxMUQyQzcxMTAwMEM3MkZDIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJMUExMjEyNjIxMUQzQ0EwMTAwRjI3QjM4IC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMTgxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tICovOyB9OworCQkxQTEyMTJFMjExRDNGNTU1MDBGMjdCMzggLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUExMjEyRTMxMUQzRjU1NTAwRjI3QjM4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QkI1MTFEMkM3MTEwMDBDNzJGQyAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTFBMTIxMkU0MTFEM0Y1NTUwMEYyN0IzOCAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEJCNzExRDJDNzExMDAwQzcyRkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkxQTEyMTJFNzExRDNGNTkzMDBGMjdCMzggLyogQU5UTFJJbnRBcnJheVRlc3QubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QjFBMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkludEFycmF5VGVzdC5tICovOyB9OworCQkxQTEyMTMxMjExRDNGN0RDMDBGMjdCMzggLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUExMjEzMTMxMUQzRjdEQzAwRjI3QjM4IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QkI1MTFEMkM3MTEwMDBDNzJGQyAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTFBMTIxMzE0MTFEM0Y3REMwMEYyN0IzOCAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEJCNzExRDJDNzExMDAwQzcyRkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkxQTEyMTMxNzExRDNGODA1MDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMjYxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QubSAqLzsgfTsKKwkJMUExMkM5NTkxMUI4OUY2MjAwOEM5QkVEIC8qIEFOVExSQml0U2V0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGN0YyMThFRjA5N0FGQjFBMDAwNDcyRTkgLyogQU5UTFJCaXRTZXQubSAqLzsgfTsKKwkJMUExMkM5NUExMUI4OUY2NDAwOEM5QkVEIC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExOEVGNTYxMUI4MDI4RDAwMDYxODZBIC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tICovOyB9OworCQkxQTEyQzk1QjExQjg5RjY1MDA4QzlCRUQgLyogQU5UTFJDb21tb25Ub2tlbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NzY2MDQwOURDNUNGNDAwNTE3MTgxIC8qIEFOVExSQ29tbW9uVG9rZW4ubSAqLzsgfTsKKwkJMUExMkM5NUMxMUI4OUY2NzAwOEM5QkVEIC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDBFRDk1MEE1RkYyQTUwMDVEMDc1NyAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLm0gKi87IH07CisJCTFBMTJDOTVEMTFCODlGNjgwMDhDOUJFRCAvKiBBTlRMUkNvbW1vblRyZWUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MkM1OEU5MEFCMzkxMUQwMDI4MjU3NCAvKiBBTlRMUkNvbW1vblRyZWUubSAqLzsgfTsKKwkJMUExMkM5NUUxMUI4OUY2OTAwOEM5QkVEIC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MkM1OUE2MEFCNEYyMEEwMDI4MjU3NCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLm0gKi87IH07CisJCTFBMTJDOTVGMTFCODlGNkEwMDhDOUJFRCAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzZBQTk4RjBDRUE1MTVBMDBBRjA0NEMgLyogQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5tICovOyB9OworCQkxQTEyQzk2MDExQjg5RjZCMDA4QzlCRUQgLyogQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3Q0VDRDdEMEIxRTVDMzcwMDU0Q0MzQiAvKiBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExMkM5NjExMUI4OUY2RjAwOEM5QkVEIC8qIEFOVExSTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3QTQwOTkyMDk2NTlCRkIwMDJDQzc4MSAvKiBBTlRMUkxleGVyLm0gKi87IH07CisJCTFBMTJDOTYyMTFCODlGNzAwMDhDOUJFRCAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzAwOUFEQTBBMUJFNEFFMDAyRURENUQgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5tICovOyB9OworCQkxQTEyQzk2MzExQjg5Rjc2MDA4QzlCRUQgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUNDQ0FBMTFCNzI0QjIwMDJFNUY1MyAvKiBBTlRMUkxvb2thaGVhZFN0cmVhbS5tICovOyB9OworCQkxQTEyQzk2NDExQjg5Rjc2MDA4QzlCRUQgLyogQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDM3Q0VGMEEwNTgyRkMwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tICovOyB9OworCQkxQTEyQzk2NTExQjg5Rjc3MDA4QzlCRUQgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzAzODBCQjBBMDdGQTBEMDA3MDQzNUQgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0gKi87IH07CisJCTFBMTJDOTY2MTFCODlGNzgwMDhDOUJFRCAvKiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NzY2ODEwOURDNzE5QzAwNTE3MTgxIC8qIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm0gKi87IH07CisJCTFBMTJDOTY3MTFCODlGN0EwMDhDOUJFRCAvKiBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcyQzVENjEwQUI2M0UwQjAwMjgyNTc0IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm0gKi87IH07CisJCTFBMTJDOTY4MTFCODlGN0IwMDhDOUJFRCAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzlENTk4QTBBMEU1MUFCMDBFQTNDRUUgLyogQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5tICovOyB9OworCQkxQTEyQzk2OTExQjg5RjdFMDA4QzlCRUQgLyogQU5UTFJQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDBFOEZBMEE1RkFEMjEwMDVEMDc1NyAvKiBBTlRMUlBhcnNlci5tICovOyB9OworCQkxQTEyQzk2QTExQjg5RjdGMDA4QzlCRUQgLyogQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MkM1RUNEMEFCN0U1QTUwMDI4MjU3NCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tICovOyB9OworCQkxQTEyQzk2QjExQjg5RjgwMDA4QzlCRUQgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NzY2OTIwOURDNzJENjAwNTE3MTgxIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubSAqLzsgfTsKKwkJMUExMkM5NkMxMUI4OUY4MjAwOEM5QkVEIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGN0IxRTVBRDBDRDdDRjE5MDBDRTEzNkUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubSAqLzsgfTsKKwkJMUExMkM5NkQxMUI4OUY4MzAwOEM5QkVEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzEzMjU4NzBDNEEwNjA5MDBCOTlGMkQgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ubSAqLzsgfTsKKwkJMUExMkM5NkUxMUI4OUY4NDAwOEM5QkVEIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzBCMTFCQzBDNEMyQjY0MDBDM0VDRTAgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubSAqLzsgfTsKKwkJMUExMkM5NkYxMUI4OUY4NTAwOEM5QkVEIC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcwQjExQzIwQzRDMkI3OTAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovOyB9OworCQkxQTEyQzk3MDExQjg5Rjg3MDA4QzlCRUQgLyogQU5UTFJTdHJpbmdTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MEFBN0M2MDlBQTMzOTkwMEMzRkQ1RSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5tICovOyB9OworCQkxQTEyQzk3MTExQjg5RjhCMDA4QzlCRUQgLyogQU5UTFJDaGFyU3RyZWFtU3RhdGUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MEFBN0NFMDlBQTM3OTMwMEMzRkQ1RSAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tICovOyB9OworCQkxQTEyQzk3MjExQjg5RjhDMDA4QzlCRUQgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3Nzc0NDA0MEIyMzRBMzQwMEQxRjg5QiAvKiBBTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5tICovOyB9OworCQkxQTEyQzk3MzExQjg5RjhFMDA4QzlCRUQgLyogQU5UTFJUcmVlRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzM4RDE3NjBCMDdBRUFBMDAxODEzQzQgLyogQU5UTFJUcmVlRXhjZXB0aW9uLm0gKi87IH07CisJCTFBMTJDOTc0MTFCODlGOTAwMDhDOUJFRCAvKiBBTlRMUlRyZWVQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MkM1RDU1MEFCNjNDMUQwMDI4MjU3NCAvKiBBTlRMUlRyZWVQYXJzZXIubSAqLzsgfTsKKwkJMUExNkIxM0MxMUM2NjQ5MjAwMjg2MEM3IC8qIEFOVExSTGlua0Jhc2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMTZCMTNBMTFDNjY0OTIwMDI4NjBDNyAvKiBBTlRMUkxpbmtCYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTE2QjEzRDExQzY2NDkyMDAyODYwQzcgLyogQU5UTFJMaW5rQmFzZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExNkIxM0IxMUM2NjQ5MjAwMjg2MEM3IC8qIEFOVExSTGlua0Jhc2UubSAqLzsgfTsKKwkJMUExNzAyRkUxMUMwNUQ0ODAwRjY5NzhBIC8qIEFOVExSSGFzaE1hcC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExNzAyRkMxMUMwNUQ0ODAwRjY5NzhBIC8qIEFOVExSSGFzaE1hcC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExNzAyRkYxMUMwNUQ0ODAwRjY5NzhBIC8qIEFOVExSSGFzaE1hcC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExNzAyRkQxMUMwNUQ0ODAwRjY5NzhBIC8qIEFOVExSSGFzaE1hcC5tICovOyB9OworCQkxQTFCQ0RCQjExQ0IwMUU2MDA1MUExRUMgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUJDREI5MTFDQjAxRTYwMDUxQTFFQyAvKiBBTlRMUlJ1bGVSZXR1cm5TY29wZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExQkNEQkMxMUNCMDFFNjAwNTFBMUVDIC8qIEFOVExSUnVsZVJldHVyblNjb3BlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFCQ0RCQTExQ0IwMUU2MDA1MUExRUMgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUubSAqLzsgfTsKKwkJMUExQkNEQ0YxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExQkNEQ0QxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExQkNERDAxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExQkNEQ0UxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tICovOyB9OworCQkxQTFCQ0UyQTExQ0IxQTNFMDA1MUExRUMgLyogQU5UTFJUcmVlUmV3cml0ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUJDRTI4MTFDQjFBM0UwMDUxQTFFQyAvKiBBTlRMUlRyZWVSZXdyaXRlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExQkNFMkIxMUNCMUEzRTAwNTFBMUVDIC8qIEFOVExSVHJlZVJld3JpdGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFCQ0UyOTExQ0IxQTNFMDA1MUExRUMgLyogQU5UTFJUcmVlUmV3cml0ZXIubSAqLzsgfTsKKwkJMUExQ0NDQUIxMUI3MjRCMjAwMkU1RjUzIC8qIEFOVExSTG9va2FoZWFkU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFDQ0NBOTExQjcyNEIyMDAyRTVGNTMgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMUNDQ0M4MTFCNzI3QjUwMDJFNUY1MyAvKiBBTlRMUkVycm9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFDQ0NDNzExQjcyN0I1MDAyRTVGNTMgLyogQU5UTFJFcnJvci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUExRDQ2NUIxMUJFNzNCMjAwMTU3NUYzIC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFENDY1OTExQkU3M0IyMDAxNTc1RjMgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMUQ0NjVDMTFCRTczQjIwMDE1NzVGMyAvKiBBTlRMUkJhc2VUcmVlQWRhcHRvci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExRDQ2NUExMUJFNzNCMjAwMTU3NUYzIC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLm0gKi87IH07CisJCTFBMUQ0NjcwMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUQ0NjZFMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMUQ0NjcxMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUQ0NjZGMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQubSAqLzsgfTsKKwkJMUExRDQ2N0MxMUJFOEU1QTAwMTU3NUYzIC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFENDY3QTExQkU4RTVBMDAxNTc1RjMgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMUQ0NjdEMTFCRThFNUEwMDE1NzVGMyAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExRDQ2N0IxMUJFOEU1QTAwMTU3NUYzIC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLm0gKi87IH07CisJCTFBMjBDNTY1MTJENjI2NzUwMEMyMDcyQSAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzAwRTg2QTBBNUZBMzREMDA1RDA3NTcgLyogbWFpbi5tICovOyB9OworCQkxQTI2MzI5NTExQzUzNTc4MDAwRENERDQgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTI2MzI5MzExQzUzNTc4MDAwRENERDQgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTI2MzI5NjExQzUzNTc4MDAwRENERDQgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTI2MzI5NDExQzUzNTc4MDAwRENERDQgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm0gKi87IH07CisJCTFBMjcwQkY5MTFDMTQ1MTIwMERDQzhGMyAvKiBBTlRMUlRyZWVJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEyNzBCRjcxMUMxNDUxMjAwRENDOEYzIC8qIEFOVExSVHJlZUl0ZXJhdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTI3MEJGQTExQzE0NTEyMDBEQ0M4RjMgLyogQU5UTFJUcmVlSXRlcmF0b3IubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMjcwQkY4MTFDMTQ1MTIwMERDQzhGMyAvKiBBTlRMUlRyZWVJdGVyYXRvci5tICovOyB9OworCQkxQTJEMjE3NTExRTRGNTdDMDBERkUzMjggLyogQU5UTFJVbmlxdWVJRE1hcC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEyRDIxNzMxMUU0RjU3QzAwREZFMzI4IC8qIEFOVExSVW5pcXVlSURNYXAuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMkQyMTc2MTFFNEY1N0MwMERGRTMyOCAvKiBBTlRMUlVuaXF1ZUlETWFwLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTJEMjE3NDExRTRGNTdDMDBERkUzMjggLyogQU5UTFJVbmlxdWVJRE1hcC5tICovOyB9OworCQkxQTJEMjE4NjExRTUwMkRFMDBERkUzMjggLyogQU5UTFJOb2RlTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEyRDIxODQxMUU1MDJERTAwREZFMzI4IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMkQyMTg3MTFFNTAyREUwMERGRTMyOCAvKiBBTlRMUk5vZGVNYXBFbGVtZW50Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTJEMjE4NTExRTUwMkRFMDBERkUzMjggLyogQU5UTFJOb2RlTWFwRWxlbWVudC5tICovOyB9OworCQkxQTM0OEI1ODExRDJCRjFDMDAwQzcyRkMgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUEzNDhCQTUxMUQyQzZBMDAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMUQxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5tICovOyB9OworCQkxQTM0OEJBODExRDJDNkFEMDAwQzcyRkMgLyogQU5UTFJDb21tb25Ub2tlblRlc3QubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QjIzMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5tICovOyB9OworCQkxQTM0OEJBQjExRDJDNkI4MDAwQzcyRkMgLyogQU5UTFJDb21tb25UcmVlVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMjYxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QubSAqLzsgfTsKKwkJMUEzNDhCQUUxMUQyQzZDNjAwMEM3MkZDIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMTgxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tICovOyB9OworCQkxQTM0OEJBRjExRDJDNkQzMDAwQzcyRkMgLyogQU5UTFJJbnRBcnJheVRlc3QubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QjFBMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkludEFycmF5VGVzdC5tICovOyB9OworCQkxQTM0OEJCMjExRDJDNkUzMDAwQzcyRkMgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEIyMDExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gKi87IH07CisJCTFBMzQ4QkI2MTFEMkM3MTEwMDBDNzJGQyAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEJCNTExRDJDNzExMDAwQzcyRkMgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTM0OEJCODExRDJDNzExMDAwQzcyRkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCQjcxMUQyQzcxMTAwMEM3MkZDIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJMUEzNDhCRjIxMUQyRDBFMDAwMEM3MkZDIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QkI1MTFEMkM3MTEwMDBDNzJGQyAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTFBMzQ4QkYzMTFEMkQwRTAwMDBDNzJGQyAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEJCNzExRDJDNzExMDAwQzcyRkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkxQTM0OEJGNDExRDJEMEU3MDAwQzcyRkMgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUEzNDhDMDYxMUQyRDIyQjAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCMUQxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5tICovOyB9OworCQkxQTNBMDhFNjExRTIxM0M1MDBENUVFMjYgLyogQU5UTFJCYXNlU3RhY2suaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBM0EwOEU0MTFFMjEzQzUwMEQ1RUUyNiAvKiBBTlRMUkJhc2VTdGFjay5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEzQTA4RTcxMUUyMTNDNTAwRDVFRTI2IC8qIEFOVExSQmFzZVN0YWNrLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTNBMDhFNTExRTIxM0M1MDBENUVFMjYgLyogQU5UTFJCYXNlU3RhY2subSAqLzsgfTsKKwkJMUEzQTA4RUExMUUyMTNFMTAwRDVFRTI2IC8qIEFOVExSU3ltYm9sU3RhY2suaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBM0EwOEU4MTFFMjEzRTEwMEQ1RUUyNiAvKiBBTlRMUlN5bWJvbFN0YWNrLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTNBMDhFQjExRTIxM0UxMDBENUVFMjYgLyogQU5UTFJTeW1ib2xTdGFjay5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzQTA4RTkxMUUyMTNFMTAwRDVFRTI2IC8qIEFOVExSU3ltYm9sU3RhY2subSAqLzsgfTsKKwkJMUEzQTA5QkUxMUUyMzVCRDAwRDVFRTI2IC8qIGFudGxyMy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzQTA5QkQxMUUyMzVCRDAwRDVFRTI2IC8qIGFudGxyMy5oICovOyB9OworCQkxQTQwNkI1NjEyRThGMkVEMDA1RUYwMzcgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcyQzVFNTYwQUI3RTQxMDAwMjgyNTc0IC8qIG1haW4ubSAqLzsgfTsKKwkJMUE0NTY1NzcxMUM5MjJCRTAwODJGNDIxIC8qIEFOVExSUnVsZU1lbW8uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNDU2NTc1MTFDOTIyQkUwMDgyRjQyMSAvKiBBTlRMUlJ1bGVNZW1vLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTQ1NjU3ODExQzkyMkJFMDA4MkY0MjEgLyogQU5UTFJSdWxlTWVtby5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0NTY1NzYxMUM5MjJCRTAwODJGNDIxIC8qIEFOVExSUnVsZU1lbW8ubSAqLzsgfTsKKwkJMUE0NTY1ODkxMUM5MjcwRDAwODJGNDIxIC8qIEFOVExSQmFzZU1hcEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNDU2NTg3MTFDOTI3MEQwMDgyRjQyMSAvKiBBTlRMUkJhc2VNYXBFbGVtZW50LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTQ1NjU4QTExQzkyNzBEMDA4MkY0MjEgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0NTY1ODgxMUM5MjcwRDAwODJGNDIxIC8qIEFOVExSQmFzZU1hcEVsZW1lbnQubSAqLzsgfTsKKwkJMUE0QTg1MTIxMUNCQ0UzRTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNEE4NTEwMTFDQkNFM0UwMEU0QkYxQiAvKiBBTlRMUlRyZWVWaXNpdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTRBODUxMzExQ0JDRTNFMDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0QTg1MTExMUNCQ0UzRTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3IubSAqLzsgfTsKKwkJMUE0QTg1MTgxMUNCQ0U1NTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNEE4NTE2MTFDQkNFNTUwMEU0QkYxQiAvKiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTRBODUxOTExQ0JDRTU1MDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0QTg1MTcxMUNCQ0U1NTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24ubSAqLzsgfTsKKwkJMUE0QTg1MUUxMUNCQ0YzNzAwRTRCRjFCIC8qIEFOVExSVHJlZVdpemFyZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0QTg1MUMxMUNCQ0YzNzAwRTRCRjFCIC8qIEFOVExSVHJlZVdpemFyZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE0QTg1MUYxMUNCQ0YzNzAwRTRCRjFCIC8qIEFOVExSVHJlZVdpemFyZC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0QTg1MUQxMUNCQ0YzNzAwRTRCRjFCIC8qIEFOVExSVHJlZVdpemFyZC5tICovOyB9OworCQkxQTRENUFENjExQjU1QTQ1MDAxQzk0ODIgLyogQU5UTFJCYXNlVHJlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE0RDVBRDQxMUI1NUE0NTAwMUM5NDgyIC8qIEFOVExSQmFzZVRyZWUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNUVBNTBCMTFDRkU3Q0UwMEU4OTMyRiAvKiBBTlRMUk1hcC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE1RUE1MDkxMUNGRTdDRTAwRTg5MzJGIC8qIEFOVExSTWFwLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTVFQTUwQzExQ0ZFN0NFMDBFODkzMkYgLyogQU5UTFJNYXAubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNUVBNTBBMTFDRkU3Q0UwMEU4OTMyRiAvKiBBTlRMUk1hcC5tICovOyB9OworCQkxQTY1QjdEODExQjk1MzJBMDBGRDg3NTQgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTY1QjdENjExQjk1MzJBMDBGRDg3NTQgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTY1QjdEOTExQjk1MzJBMDBGRDg3NTQgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTY1QjdENzExQjk1MzJBMDBGRDg3NTQgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0gKi87IH07CisJCTFBNjc4ODUyMTFCODdBQkEwMEExMUVFQyAvKiBBTlRMUkJhc2VUcmVlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTRENUFENTExQjU1QTQ1MDAxQzk0ODIgLyogQU5UTFJCYXNlVHJlZS5tICovOyB9OworCQkxQTY3ODg1MzExQjg3QUM0MDBBMTFFRUMgLyogQU5UTFJDaGFyU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzBBQTdCNTA5QUEyQjg4MDBDM0ZENUUgLyogQU5UTFJDaGFyU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTY3ODg1NDExQjg3QUVBMDBBMTFFRUMgLyogQU5UTFJGYXN0UXVldWUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUNDQzkxMTFCNkZEMzkwMDJFNUY1MyAvKiBBTlRMUkZhc3RRdWV1ZS5tICovOyB9OworCQkxQTY3ODg1NTExQjg3QUVGMDBBMTFFRUMgLyogQU5UTFJJbnRBcnJheS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUExQ0NDOTMxMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSSW50QXJyYXkubSAqLzsgfTsKKwkJMUE2Nzg4RkMxMUI4OTNFMTAwQTExRUVDIC8qIEFOVExSQmFzZVJlY29nbml6ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3QTQwOThDMDk2NTlCRjMwMDJDQzc4MSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLm0gKi87IH07CisJCTFBNkM0NTE3MTFCRjRFRTAwMDM5Nzg4QSAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QzQ1MTUxMUJGNEVFMDAwMzk3ODhBIC8qIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm0gKi87IH07CisJCTFBNkM0NTI4MTFCRjUwQTQwMDM5Nzg4QSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkM0NTI2MTFCRjUwQTQwMDM5Nzg4QSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkM0NTI5MTFCRjUwQTQwMDM5Nzg4QSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkM0NTI3MTFCRjUwQTQwMDM5Nzg4QSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubSAqLzsgfTsKKwkJMUE3NUJGNTkxMUQ2QjNGRDAwOTZDNkY1IC8qIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZDNDUxNDExQkY0RUUwMDAzOTc4OEEgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNzVCRkJBMTFENkMyQjEwMDk2QzZGNSAvKiBBTlRMUkRGQS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NTRFM0UwQTVDMEEwNTAwRDA4NzNBIC8qIEFOVExSREZBLm0gKi87IH07CisJCTFBNzdFRTkzMTJFNkE1N0MwMDdGMzIzQSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTM0OEJCNTExRDJDNzExMDAwQzcyRkMgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTc3RUU5NDEyRTZBNTdDMDA3RjMyM0EgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEzNDhCQjcxMUQyQzcxMTAwMEM3MkZDIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJMUE3N0VFOTcxMkU2QTU5NDAwN0YzMjNBIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDhEQzJFRjVCMDQ4NkE2OTQwMDk4QjIxNiAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBODZCOTFCMTFFQjlGNjMwMEM2N0EwMyAvKiBBTlRMUlBhcnNlVHJlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE4NkI5MTkxMUVCOUY2MzAwQzY3QTAzIC8qIEFOVExSUGFyc2VUcmVlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTg2QjkxQzExRUI5RjYzMDBDNjdBMDMgLyogQU5UTFJQYXJzZVRyZWUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBODZCOTFBMTFFQjlGNjMwMEM2N0EwMyAvKiBBTlRMUlBhcnNlVHJlZS5tICovOyB9OworCQkxQTg2QkFDRjExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBODZCQUNEMTFFQzFDRDAwMEM2N0EwMyAvKiBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE4NkJBRDAxMUVDMUNEMDAwQzY3QTAzIC8qIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTg2QkFDRTExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSAqLzsgfTsKKwkJMUE4QUJGQzYxMUJBOUI5NjAwMzhEQkIwIC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQThBQkZDNTExQkE5Qjk2MDAzOERCQjAgLyogQU5UTFJDaGFyU3RyZWFtU3RhdGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBOEFDMDBDMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBOEFDMDBBMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBOEFDMDBEMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBOEFDMDBCMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSAqLzsgfTsKKwkJMUFBQzIwMkMxMUNDNjIxQTAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBQzIwMkExMUNDNjIxQTAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUFBQzIwMkQxMUNDNjIxQTAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBQzIwMkIxMUNDNjIxQTAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5tICovOyB9OworCQkxQUFDMjBBNTExQ0M3OTAzMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBQzIwQTMxMUNDNzkwMzAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBQUMyMEE2MTFDQzc5MDMwMENGNTZEMSAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUFDMjBBNDExQ0M3OTAzMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5tICovOyB9OworCQkxQUI0QTU0MjExQjk5NTI5MDA3NkU5MUEgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDBFNjFBMEE1RjY2RUMwMDVEMDc1NyAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tICovOyB9OworCQkxQUI0QTU0MzExQjk5NTJBMDA3NkU5MUEgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MzhEMTc0MEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5tICovOyB9OworCQkxQUI0QTU5MTExQjlBMERBMDA3NkU5MUEgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUI0QTU4RjExQjlBMERBMDA3NkU5MUEgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQUI0QTU5MjExQjlBMERBMDA3NkU5MUEgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUI0QTU5MDExQjlBMERBMDA3NkU5MUEgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm0gKi87IH07CisJCTFBQjVGNDc3MTFFMzg2OUQwMEUwNjVCMCAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUI1RjQ3NTExRTM4NjlEMDBFMDY1QjAgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUFCNUY0NzgxMUUzODY5RDAwRTA2NUIwIC8qIEFOVExSUnVsZU1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBQjVGNDc2MTFFMzg2OUQwMEUwNjVCMCAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50Lm0gKi87IH07CisJCTFBQjVGNTFFMTFFM0JFMkUwMEUwNjVCMCAvKiBBTlRMUlB0ckJ1ZmZlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFCNUY1MUMxMUUzQkUyRTAwRTA2NUIwIC8qIEFOVExSUHRyQnVmZmVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQUI1RjUxRjExRTNCRTJFMDBFMDY1QjAgLyogQU5UTFJQdHJCdWZmZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBQjVGNTFEMTFFM0JFMkUwMEUwNjVCMCAvKiBBTlRMUlB0ckJ1ZmZlci5tICovOyB9OworCQkxQUM1QUM5RTEyRTdCRUZFMDBERjBDNTggLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUFDNUFDOUYxMkU3QkVGRTAwREYwQzU4IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg2N0Q2OUJGRTg0MDI4RkMwMkFBQzA3IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQkxQUM1QUNBMTEyRTdCRUZFMDBERjBDNTggLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcxRjZCOEYwOUE4MUU2RjAwMzIyMUY0IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJMUFDNUFDQUQxMkU3QkY0RTAwREYwQzU4IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBQzVBQzgxMTJFN0JDOTEwMERGMEM1OCAvKiBtYWluLm0gKi87IH07CisJCTFBQzVBQ0Q2MTJFN0MwNTgwMERGMEM1OCAvKiBMYW5nTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBQzVBQ0M5MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nTGV4ZXIubSAqLzsgfTsKKwkJMUFDNUFDRTYxMkU3Q0U0NzAwREYwQzU4IC8qIExhbmdQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBQzVBQ0NCMTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nUGFyc2VyLm0gKi87IH07CisJCTFBQzVBQ0U3MTJFN0NFNEMwMERGMEM1OCAvKiBMYW5nTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBQzVBQ0M5MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nTGV4ZXIubSAqLzsgfTsKKwkJMUFDNUFDRTgxMkU3Q0U1MTAwREYwQzU4IC8qIExhbmdEdW1wRGVjbC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFDNUFDQzYxMkU3QzAzQzAwREYwQzU4IC8qIExhbmdEdW1wRGVjbC5tICovOyB9OworCQkxQURCNjZGMTEyRTc0MzQxMDA3QzE2NjEgLyogRnV6enlMZXhlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFEQjY2RjAxMkU3NDM0MTAwN0MxNjYxIC8qIEZ1enp5TGV4ZXIuaCAqLzsgfTsKKwkJMUFEQjY3QkExMkU3NEU4MjAwN0MxNjYxIC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMzQ4QkI1MTFEMkM3MTEwMDBDNzJGQyAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTFBRThBOTZDMTFEOTIyN0EwMEQzNkZENiAvKiBBTlRMUlJ1bGVTdGFjay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFOEE5NkExMUQ5MjI3QTAwRDM2RkQ2IC8qIEFOVExSUnVsZVN0YWNrLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQUU4QTk2RDExRDkyMjdBMDBEMzZGRDYgLyogQU5UTFJSdWxlU3RhY2subSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRThBOTZCMTFEOTIyN0EwMEQzNkZENiAvKiBBTlRMUlJ1bGVTdGFjay5tICovOyB9OworCQkxQUVFQ0UxNTExRTdFQjNDMDA1NTRBQUYgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMUZGQzU5MTFDRDEyQTQwMEZCQjQ1MiAvKiBBTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUFFRUNFMTYxMUU3RUIzRDAwNTU0QUFGIC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTFGRkM1QTExQ0QxMkE0MDBGQkI0NTIgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSAqLzsgfTsKKwkJRjcwMDlBREIwQTFCRTRBRTAwMkVERDVEIC8qIEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDA5QUQ5MEExQkU0QUUwMDJFREQ1RCAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzAwRTYxQjBBNUY2NkVDMDA1RDA3NTcgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDBFNjE5MEE1RjY2RUMwMDVEMDc1NyAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjcwMEU4RkIwQTVGQUQyMTAwNUQwNzU3IC8qIEFOVExSUGFyc2VyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzAwRThGOTBBNUZBRDIxMDA1RDA3NTcgLyogQU5UTFJQYXJzZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MDBFQzY3MEE1RkRGMEQwMDVEMDc1NyAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQlGNzAwRUNBNDBBNUZERjFBMDA1RDA3NTcgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcxRjZCOEYwOUE4MUU2RjAwMzIyMUY0IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJRjcwMEVDQTUwQTVGREYxQTAwNUQwNzU3IC8qIEZ1enp5TGV4ZXIuaCBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDEwNThDN0IxRkVBNTU4NUUxMUNBMkNCQiAvKiBGdXp6eUxleGVyLmggKi87IH07CisJCUY3MDBFQ0Q5MEE1RkUxOUEwMDVEMDc1NyAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzFGNkI4RjA5QTgxRTZGMDAzMjIxRjQgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQlGNzAwRUNEQTBBNUZFMTlBMDA1RDA3NTcgLyogRnV6enlMZXhlci5oIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTA1OEM3QjFGRUE1NTg1RTExQ0EyQ0JCIC8qIEZ1enp5TGV4ZXIuaCAqLzsgfTsKKwkJRjcwMEVEN0YwQTVGRjE3QzAwNUQwNzU3IC8qIEFOVExSVG9rZW5Tb3VyY2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MDBFRDdFMEE1RkYxN0MwMDVEMDc1NyAvKiBBTlRMUlRva2VuU291cmNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzAwRUQ5NjBBNUZGMkE1MDA1RDA3NTcgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcwMEVEOTQwQTVGRjJBNTAwNUQwNzU3IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MDM3Q0YwMEEwNTgyRkMwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcwMzdDRUUwQTA1ODJGQzAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzAzN0VBNjBBMDVBRkQ3MDA3MDQzNUQgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJRjcwMzgwQkMwQTA3RkEwRDAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcwMzgwQkEwQTA3RkEwRDAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjcwNDhGRjgwQjA3RDA1NDAwRDJGMzI2IC8qIFRlc3RMZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcwNDhGRjcwQjA3RDA1NDAwRDJGMzI2IC8qIFRlc3RMZXhlci5tICovOyB9OworCQlGNzA0OEZGOTBCMDdEMDU4MDBEMkYzMjYgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjdFOTgzOTQwQTBENkE1RjAwRjE2MDkzIC8qIG1haW4ubSAqLzsgfTsKKwkJRjcwQUE3QTYwOUFBMkE2OTAwQzNGRDVFIC8qIEFOVExSLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzBBQTdBNTA5QUEyQTY5MDBDM0ZENUUgLyogQU5UTFIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MEFBN0FGMDlBQTJBQzAwMEMzRkQ1RSAvKiBBTlRMUkludFN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcwQUE3QUQwOUFBMkFDMDAwQzNGRDVFIC8qIEFOVExSSW50U3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzBBQTdDNzA5QUEzMzk5MDBDM0ZENUUgLyogQU5UTFJTdHJpbmdTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MEFBN0M1MDlBQTMzOTkwMEMzRkQ1RSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjcwQjExQkQwQzRDMkI2NDAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzBCMTFCQjBDNEMyQjY0MDBDM0VDRTAgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MEIxMUMzMEM0QzJCNzkwMEMzRUNFMCAvKiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MEIxMUMxMEM0QzJCNzkwMEMzRUNFMCAvKiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MTMyNTg4MEM0QTA2MDkwMEI5OUYyRCAvKiBBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcxMzI1ODYwQzRBMDYwOTAwQjk5RjJEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzJDNThFQTBBQjM5MTFEMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzJDNThFODBBQjM5MTFEMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzJDNTlBNzBBQjRGMjBBMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcyQzU5QTUwQUI0RjIwQTAwMjgyNTc0IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MkM1Qjg0MEFCNTJBRDMwMDI4MjU3NCAvKiBBTlRMUlRyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzJDNUI4MjBBQjUyQUQzMDAyODI1NzQgLyogQU5UTFJUcmVlTm9kZVN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjcyQzVENTYwQUI2M0MxRDAwMjgyNTc0IC8qIEFOVExSVHJlZVBhcnNlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcyQzVENTQwQUI2M0MxRDAwMjgyNTc0IC8qIEFOVExSVHJlZVBhcnNlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjcyQzVENjIwQUI2M0UwQjAwMjgyNTc0IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzJDNUQ2MDBBQjYzRTBCMDAyODI1NzQgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3MkM1RTYyMEFCN0U0QzkwMDI4MjU3NCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQlGNzJDNUU2MzBBQjdFNEM5MDAyODI1NzQgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCUY3MkM1RTY1MEFCN0U0QzkwMDI4MjU3NCAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzFGNkI4RjA5QTgxRTZGMDAzMjIxRjQgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQlGNzJDNUVDRTBBQjdFNUE1MDAyODI1NzQgLyogQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MkM1RUNDMEFCN0U1QTUwMDI4MjU3NCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjczOEQxNzkwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSVHJlZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjczOEQxNzUwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSVHJlZUV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjczOEQxRkMwQjA3QjFCRDAwMTgxM0M0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3REQwNzgwMEE3QjY3QTcwMDZBMDA2QyAvKiBtYWluLm0gKi87IH07CisJCUY3MzhEMjBEMEIwN0IyNjUwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjczOEQyMDEwQjA3QjFDRTAwMTgxM0M0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLm0gKi87IH07CisJCUY3MzhEMjBFMEIwN0IyNjYwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZUxleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzM4RDFGRjBCMDdCMUNFMDAxODEzQzQgLyogU3ltYm9sVGFibGVMZXhlci5tICovOyB9OworCQlGNzM4RDIxMjBCMDdCMzJEMDAxODEzQzQgLyogVC5nIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjdERDA1RTQwQTdCMTRCRTAwNkEwMDZDIC8qIFQuZyAqLzsgfTsKKwkJRjczOEQyMjIwQjA3QjM5RjAwMTgxM0M0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3REQwNUU3MEE3QjE1NzIwMDZBMDA2QyAvKiBtYWluLm0gKi87IH07CisJCUY3MzhEMzE5MEIwN0JEQjcwMDE4MTNDNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzAwRUNFNzBBNUZFMjVEMDA1RDA3NTcgLyogbWFpbi5tICovOyB9OworCQlGNzM4RDM2MTBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRMZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjczOEQzNUUwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkTGV4ZXIubSAqLzsgfTsKKwkJRjczOEQzNjIwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzM4RDM2MDBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRQYXJzZXIubSAqLzsgfTsKKwkJRjczOEQzN0UwQjA3QzNCRDAwMTgxM0M0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3OUQ1NkMwMEEwRTI4NzUwMEVBM0NFRSAvKiBtYWluLm0gKi87IH07CisJCUY3M0UyQjc0MEE5Q0ZFNkEwMDVENjI2NyAvKiBBTlRMUlRyZWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3M0UyQjcyMEE5Q0ZFNkEwMDVENjI2NyAvKiBBTlRMUlRyZWUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3M0UyQjdDMEE5RDBBRkMwMDVENjI2NyAvKiBBTlRMUlRyZWVBZGFwdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzNFMkI3QTBBOUQwQUZDMDA1RDYyNjcgLyogQU5UTFJUcmVlQWRhcHRvci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjc0MUQwODMwQjM4MUU3MjAwMjRERjNGIC8qIFNpbXBsZUNXYWxrZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3NDFEMDY1MEIzODEyRDQwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLm0gKi87IH07CisJCUY3NDFEMDg0MEIzODFFNzMwMDI0REYzRiAvKiBTaW1wbGVDUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzcxNUQzMTBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ1BhcnNlci5tICovOyB9OworCQlGNzQxRDA4RTBCMzgxRUE5MDAyNERGM0YgLyogU2ltcGxlQ0xleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzcxNUQyRjBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ0xleGVyLm0gKi87IH07CisJCUY3NDkyRjVEMDlDMDE2QTIwMEIyNUUzMCAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGN0E0MDk4QjA5NjU5QkYzMDAyQ0M3ODEgLyogQU5UTFJCYXNlUmVjb2duaXplci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjc2Mjg3MTMwQjcxNEU3NzAwNkFBN0VGIC8qIFRMZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjdERDA2RTgwQTdCMTcwMDAwNkEwMDZDIC8qIFRMZXhlci5tICovOyB9OworCQlGNzYyODcxNDBCNzE0RTc4MDA2QUE3RUYgLyogVFBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjczOEQyMjQwQjA3QjNCQzAwMTgxM0M0IC8qIFRQYXJzZXIubSAqLzsgfTsKKwkJRjc2Mjg3MTUwQjcxNEU4MjAwNkFBN0VGIC8qIFNpbXBsZUNQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MzhEMjUxMEIwN0I4NDIwMDE4MTNDNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi87IH07CisJCUY3NjI4NzE2MEI3MTRFODMwMDZBQTdFRiAvKiBTaW1wbGVDTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MzhEMjgxMEIwN0I5QjYwMDE4MTNDNCAvKiBTaW1wbGVDTGV4ZXIubSAqLzsgfTsKKwkJRjc2Mjg3MTcwQjcxNEVBOTAwNkFBN0VGIC8qIEZ1enp5TGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MkI4RDBCMEFEMDFEQ0IwMDEzRjFFMiAvKiBGdXp6eUxleGVyLm0gKi87IH07CisJCUY3NjNENDQ5MEE2NjZEM0QwMDYxQ0QzNSAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQlGNzYzRDUxRTBBNjY3NjVCMDA2MUNEMzUgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcxRjZCOEYwOUE4MUU2RjAwMzIyMUY0IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJRjc2QUE5OTAwQ0VBNTE1QTAwQUYwNDRDIC8qIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3NkFBOThFMENFQTUxNUEwMEFGMDQ0QyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzc1NEUzRjBBNUMwQTA1MDBEMDg3M0EgLyogQU5UTFJERkEuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3NzU0RTNEMEE1QzBBMDUwMEQwODczQSAvKiBBTlRMUkRGQS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjc3NzQ0MDUwQjIzNEEzNDAwRDFGODlCIC8qIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzc3NDQwMzBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3Nzc0NzU2MEIyM0E3MDYwMEQxRjg5QiAvKiBBTlRMUkRlYnVnLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzc3NDc1NTBCMjNBNzA2MDBEMUY4OUIgLyogQU5UTFJEZWJ1Zy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjc3NzY1Q0MwOURDNTgzMDAwNTE3MTgxIC8qIEFOVExSVG9rZW4uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3Nzc2NUNBMDlEQzU4MzAwMDUxNzE4MSAvKiBBTlRMUlRva2VuLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzc3NjYwNTA5REM1Q0Y0MDA1MTcxODEgLyogQU5UTFJDb21tb25Ub2tlbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NzY2MDMwOURDNUNGNDAwNTE3MTgxIC8qIEFOVExSQ29tbW9uVG9rZW4uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3Nzc2NjgyMDlEQzcxOUMwMDUxNzE4MSAvKiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NzY2ODAwOURDNzE5QzAwNTE3MTgxIC8qIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzc3NjY5MzA5REM3MkQ2MDA1MTcxODEgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc3NzY2OTEwOURDNzJENjAwNTE3MTgxIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3Nzc2NkFGMDlERDUzRTgwMDUxNzE4MSAvKiBBTlRMUlRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzc3NjZBRTA5REQ1M0U4MDA1MTcxODEgLyogQU5UTFJUb2tlblN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjc3NzY3OEUwOURENjE4MDAwNTE3MTgxIC8qIEFOVExSTGV4ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3QTQwOTkxMDk2NTlCRkIwMDJDQzc4MSAvKiBBTlRMUkxleGVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGNzlENTk4QjBBMEU1MUFCMDBFQTNDRUUgLyogQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjc5RDU5ODkwQTBFNTFBQjAwRUEzQ0VFIC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3OUQ1QUY2MEEwRTYzNDkwMEVBM0NFRSAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQlGNzlENUFGNzBBMEU2MzRBMDBFQTNDRUUgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCUY3OUQ1QUY4MEEwRTYzNEEwMEVBM0NFRSAvKiBGdXp6eUxleGVyLmggaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdCMUZFQTU1ODVFMTFDQTJDQkIgLyogRnV6enlMZXhlci5oICovOyB9OworCQlGN0IxRTVCMDBDRDdDRjE5MDBDRTEzNkUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3QjFFNUFDMENEN0NGMTkwMENFMTM2RSAvKiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjdDRDQ3NjUwQzY0RDI0QzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3Q0Q0NjM2MEM2NEJCNzMwMEZGOTMzQSAvKiBUcmVlUmV3cml0ZUxleGVyLm0gKi87IH07CisJCUY3Q0Q0NzY2MEM2NEQyNEQwMEZGOTMzQSAvKiBUcmVlUmV3cml0ZVBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjdDRDQ2MzgwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlUGFyc2VyLm0gKi87IH07CisJCUY3Q0Q0NzY3MEM2NEQyNEQwMEZGOTMzQSAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGN0NENDVGQzBDNjRCQTRCMDBGRjkzM0EgLyogbWFpbi5tICovOyB9OworCQlGN0NENDg2NzBDNjREODg4MDBGRjkzM0EgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJRjdDRDQ4NjgwQzY0RDg4ODAwRkY5MzNBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg2N0Q2OUJGRTg0MDI4RkMwMkFBQzA3IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQlGN0NENDg2QTBDNjREODg4MDBGRjkzM0EgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjcxRjZCOEYwOUE4MUU2RjAwMzIyMUY0IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJRjdERDA2MDQwQTdCMTY2MzAwNkEwMDZDIC8qIEZ1enp5TGV4ZXIuaCBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDEwNThDN0IxRkVBNTU4NUUxMUNBMkNCQiAvKiBGdXp6eUxleGVyLmggKi87IH07CisJCUY3REQwNjA3MEE3QjE2NjQwMDZBMDA2QyAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNzFGNkI4RjA5QTgxRTZGMDAzMjIxRjQgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQlGN0REMDYzMDBBN0IxNjY1MDA2QTAwNkMgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCUY3REQwNkM1MEE3QjE2OTEwMDZBMDA2QyAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQlGN0REMDc0QzBBN0I2NjU2MDA2QTAwNkMgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJRjdERDA3NEQwQTdCNjY1QzAwNkEwMDZDIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg2N0Q2OUJGRTg0MDI4RkMwMkFBQzA3IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovOyB9OworCQlGN0REMDc0RTBBN0I2NjVEMDA2QTAwNkMgLyogRnV6enlMZXhlci5oIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTA1OEM3QjFGRUE1NTg1RTExQ0EyQ0JCIC8qIEZ1enp5TGV4ZXIuaCAqLzsgfTsKKwkJRjdERDA3NEYwQTdCNjY1RDAwNkEwMDZDIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3MUY2QjhGMDlBODFFNkYwMDMyMjFGNCAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCUY3RTI2MTE2MEIxRTQ0MzIwMDEzRjY0MCAvKiBBTlRMUkRlYnVnUGFyc2VyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGN0UyNjExNDBCMUU0NDMyMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1BhcnNlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJRjdFMjYxMUEwQjFFNDQzRDAwMTNGNjQwIC8qIEFOVExSRGVidWdUcmVlUGFyc2VyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGN0UyNjExODBCMUU0NDNDMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3RTI2MTIwMEIxRTQ0RTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3RTI2MTFFMEIxRTQ0RTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3RTI2MTI0MEIxRTQ0RkEwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3RTI2MTIyMEIxRTQ0RkEwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3RTI2MTI4MEIxRTQ1MDcwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY3RTI2MTI2MEIxRTQ1MDcwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCUY3RTI2MTM5MEIxRTQ1NTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnRXZlbnRQcm94eS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjdFMjYxMzcwQjFFNDU1ODAwMTNGNjQwIC8qIEFOVExSRGVidWdFdmVudFByb3h5LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQlGN0U5ODU1ODBBMEQ4NjVFMDBGMTYwOTMgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCUY3RTk4NTU5MEEwRDg2NjAwMEYxNjA5MyAvKiBGdXp6eUxleGVyLmggaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxMDU4QzdCMUZFQTU1ODVFMTFDQTJDQkIgLyogRnV6enlMZXhlci5oICovOyB9OworCQlGN0Y0RTlCQTBBNkU4QjExMDA5MkQwODcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQnVpbGRSdWxlIHNlY3Rpb24gKi8KKwkJMUEwRjM0NjExMkVBNDJEODAwNDk2QkI4IC8qIFBCWEJ1aWxkUnVsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEJ1aWxkUnVsZTsKKwkJCWNvbXBpbGVyU3BlYyA9IGNvbS5hcHBsZS5jb21waWxlcnMucHJveHkuc2NyaXB0OworCQkJZmlsZVBhdHRlcm5zID0gLmcubTsKKwkJCWZpbGVUeXBlID0gcGF0dGVybi5wcm94eTsKKwkJCWlzRWRpdGFibGUgPSAxOworCQkJb3V0cHV0RmlsZXMgPSAoCisJCQkJJDEubSwKKwkJCQkkMS5oLAorCQkJKTsKKwkJCXNjcmlwdCA9ICIvdXNyL2Jpbi9qYXZhIC1qYXIgL0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciAkMS5nIjsKKwkJfTsKKwkJMUE5OTRDRjIxMkE4NEZEMzAwMTg1M0ZGIC8qIFBCWEJ1aWxkUnVsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEJ1aWxkUnVsZTsKKwkJCWNvbXBpbGVyU3BlYyA9IGNvbS5hcHBsZS5jb21waWxlcnMucHJveHkuc2NyaXB0OworCQkJZmlsZVBhdHRlcm5zID0gLmcubTsKKwkJCWZpbGVUeXBlID0gcGF0dGVybi5wcm94eTsKKwkJCWlzRWRpdGFibGUgPSAxOworCQkJb3V0cHV0RmlsZXMgPSAoCisJCQkJJDEuaCwKKwkJCQkkMS5tLAorCQkJKTsKKwkJCXNjcmlwdCA9ICIvdXNyL2Jpbi9qYXZhIC1qYXIgYW50bHItMy4zLjEuamFyICQxLmckMiI7CisJCX07CisJCTFBOTk0RDNFMTJBODU4RTEwMDE4NTNGRiAvKiBQQlhCdWlsZFJ1bGUgKi8gPSB7CisJCQlpc2EgPSBQQlhCdWlsZFJ1bGU7CisJCQljb21waWxlclNwZWMgPSBjb20uYXBwbGUuY29tcGlsZXJzLnByb3h5LnNjcmlwdDsKKwkJCWZpbGVQYXR0ZXJucyA9IC5nLm07CisJCQlmaWxlVHlwZSA9IHBhdHRlcm4ucHJveHk7CisJCQlpc0VkaXRhYmxlID0gMTsKKwkJCW91dHB1dEZpbGVzID0gKAorCQkJCSQxLm0sCisJCQkJJDEuaCwKKwkJCSk7CisJCQlzY3JpcHQgPSAiL3Vzci9iaW4vamF2YSAtamFyIC9MaWJyYXJ5L0phdmEvRXh0ZW5zaW9ucy9hbnRsci0zLjMuMS5qYXIgJDEuZyI7CisJCX07CisJCTFBOTk0RDRGMTJBODU5ODcwMDE4NTNGRiAvKiBQQlhCdWlsZFJ1bGUgKi8gPSB7CisJCQlpc2EgPSBQQlhCdWlsZFJ1bGU7CisJCQljb21waWxlclNwZWMgPSBjb20uYXBwbGUuY29tcGlsZXJzLnByb3h5LnNjcmlwdDsKKwkJCWZpbGVQYXR0ZXJucyA9IC5nLm07CisJCQlmaWxlVHlwZSA9IHBhdHRlcm4ucHJveHk7CisJCQlpc0VkaXRhYmxlID0gMTsKKwkJCW91dHB1dEZpbGVzID0gKAorCQkJCSQxLmgsCisJCQkJJDEubSwKKwkJCSk7CisJCQlzY3JpcHQgPSAiL3Vzci9iaW4vamF2YSAtamFyIC9MaWJyYXJ5L0phdmEvRXh0ZW5zaW9ucy9hbnRsci0zLjMuMS5qYXIgJDEuZyI7CisJCX07CisJCTFBOTk0RDg1MTJBODVBQkUwMDE4NTNGRiAvKiBQQlhCdWlsZFJ1bGUgKi8gPSB7CisJCQlpc2EgPSBQQlhCdWlsZFJ1bGU7CisJCQljb21waWxlclNwZWMgPSBjb20uYXBwbGUuY29tcGlsZXJzLnByb3h5LnNjcmlwdDsKKwkJCWZpbGVQYXR0ZXJucyA9IC5nLm07CisJCQlmaWxlVHlwZSA9IHBhdHRlcm4ucHJveHk7CisJCQlpc0VkaXRhYmxlID0gMTsKKwkJCW91dHB1dEZpbGVzID0gKAorCQkJCSQxLmgsCisJCQkJJDEubSwKKwkJCSk7CisJCQlzY3JpcHQgPSAiL3Vzci9iaW4vamF2YSAtamFyIC9MaWJyYXJ5L0phdmEvRXh0ZW5zaW9ucy9hbnRsci0zLjMuMS5qYXIgJDEiOworCQl9OworCQkxQTk5NERDNjEyQTg1QkZDMDAxODUzRkYgLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlUGF0dGVybnMgPSAuZy5tOworCQkJZmlsZVR5cGUgPSBwYXR0ZXJuLnByb3h5OworCQkJaXNFZGl0YWJsZSA9IDE7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQkkMS5oLAorCQkJCSQxLm0sCisJCQkpOworCQkJc2NyaXB0ID0gIi91c3IvYmluL2phdmEgLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICQxLmciOworCQl9OworCQkxQTk5NERDNzEyQTg1QkZDMDAxODUzRkYgLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlUGF0dGVybnMgPSAuZy5tOworCQkJZmlsZVR5cGUgPSBwYXR0ZXJuLnByb3h5OworCQkJaXNFZGl0YWJsZSA9IDE7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQkkMS5oLAorCQkJCSQxLm0sCisJCQkpOworCQkJc2NyaXB0ID0gIi91c3IvYmluL2phdmEgLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICQxLmciOworCQl9OworCQkxQTk5NERDODEyQTg1QkZDMDAxODUzRkYgLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlUGF0dGVybnMgPSAuZy5tOworCQkJZmlsZVR5cGUgPSBwYXR0ZXJuLnByb3h5OworCQkJaXNFZGl0YWJsZSA9IDE7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQkkMS5oLAorCQkJCSQxLm0sCisJCQkpOworCQkJc2NyaXB0ID0gIi91c3IvYmluL2phdmEgLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICQxLmciOworCQl9OworCQkxQTk5NERDOTEyQTg1QkZDMDAxODUzRkYgLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlUGF0dGVybnMgPSAuZy5tOworCQkJZmlsZVR5cGUgPSBwYXR0ZXJuLnByb3h5OworCQkJaXNFZGl0YWJsZSA9IDE7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQkkMS5oLAorCQkJCSQxLm0sCisJCQkpOworCQkJc2NyaXB0ID0gIi91c3IvYmluL2phdmEgLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICQxLmciOworCQl9OworCQkxQUM1QUNBMjEyRTdCRUZFMDBERjBDNTggLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlUGF0dGVybnMgPSAuZy5tOworCQkJZmlsZVR5cGUgPSBwYXR0ZXJuLnByb3h5OworCQkJaXNFZGl0YWJsZSA9IDE7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQkkMS5tLAorCQkJCSQxLmgsCisJCQkpOworCQkJc2NyaXB0ID0gIi91c3IvYmluL2phdmEgLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICQxLmciOworCQl9OworLyogRW5kIFBCWEJ1aWxkUnVsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTFBMEYzNDcwMTJFQTQzQkEwMDQ5NkJCOCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQTBGMzQzQjEyRUE0MjU3MDA0OTZCQjg7CisJCQlyZW1vdGVJbmZvID0gIlJlZ2VuZXJhdGUgcG9seWRpZmYiOworCQl9OworCQkxQTBGMzQ3MjEyRUE0M0JBMDA0OTZCQjggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gMUFDNUFDOTMxMkU3QkUwNDAwREYwQzU4OworCQkJcmVtb3RlSW5mbyA9ICJSZWdlbmVyYXRlIHRyZWVwYXJzZXIiOworCQl9OworCQkxQTBGMzQ3NDEyRUE0M0JBMDA0OTZCQjggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gRjdDRDQ3NjEwQzY0RDIzODAwRkY5MzNBOworCQkJcmVtb3RlSW5mbyA9ICJSZWdlbmVyYXRlIHRyZWVyZXdyaXRlIjsKKwkJfTsKKwkJMUExMjEzNDQxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDFBMzQ4QkVCMTFEMkQwQTEwMDBDNzJGQzsKKwkJCXJlbW90ZUluZm8gPSBBTlRMUkJpdHNldFRlc3Q7CisJCX07CisJCTFBMTIxMzQ2MTFEM0ZEQTUwMEYyN0IzOCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQTEyMTBGQTExRDNBNUQ5MDBGMjdCMzg7CisJCQlyZW1vdGVJbmZvID0gQU5UTFJDb21tb25Ub2tlblRlc3Q7CisJCX07CisJCTFBMTIxMzQ4MTFEM0ZEQTUwMEYyN0IzOCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQTEyMTMwQjExRDNGN0NEMDBGMjdCMzg7CisJCQlyZW1vdGVJbmZvID0gQU5UTFJDb21tb25UcmVlVGVzdDsKKwkJfTsKKwkJMUExMjEzNEExMUQzRkRBNTAwRjI3QjM4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IDFBMTIxMjIzMTFEM0M5MjQwMEYyN0IzODsKKwkJCXJlbW90ZUluZm8gPSBBTlRMUkZhc3RRdWV1ZVRlc3Q7CisJCX07CisJCTFBMTIxMzRDMTFEM0ZEQTUwMEYyN0IzOCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQTEyMTJEQjExRDNGNTM2MDBGMjdCMzg7CisJCQlyZW1vdGVJbmZvID0gQU5UTFJJbnRBcnJheVRlc3Q7CisJCX07CisJCTFBMTIxMzRFMTFEM0ZEQTUwMEYyN0IzOCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQTEyMTFEMDExRDNCRjQ2MDBGMjdCMzg7CisJCQlyZW1vdGVJbmZvID0gQU5UTFJTdHJpbmdTdHJlYW1UZXN0OworCQl9OworCQlGNzYyODc0QjBCNzE1NDE3MDA2QUE3RUYgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gRjc2Mjg3NDUwQjcxNTFFMzAwNkFBN0VGOworCQkJcmVtb3RlSW5mbyA9ICJSZWdlbmVyYXRlIGZ1enp5IjsKKwkJfTsKKwkJRjc2Mjg3QTYwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEY3NjI4NzdFMEI3MTU1OUMwMDZBQTdFRjsKKwkJCXJlbW90ZUluZm8gPSAiUmVnZW5lcmF0ZSBjb21iaW5lZCI7CisJCX07CisJCUY3NjI4N0E4MEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBGNzYyODc4MjBCNzE1NTlGMDA2QUE3RUY7CisJCQlyZW1vdGVJbmZvID0gIlJlZ2VuZXJhdGUgTEwtc3RhciI7CisJCX07CisJCUY3NjI4N0FBMEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBGNzYyODc4NjBCNzE1NUEyMDA2QUE3RUY7CisJCQlyZW1vdGVJbmZvID0gIlJlZ2VuZXJhdGUgaG9pc3RlZFByZWRpY2F0ZXMiOworCQl9OworCQlGNzYyODdBQzBCNzE1N0MyMDA2QUE3RUYgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovID0geworCQkJaXNhID0gUEJYQ29udGFpbmVySXRlbVByb3h5OworCQkJY29udGFpbmVyUG9ydGFsID0gMDg2N0Q2OTBGRTg0MDI4RkMwMkFBQzA3IC8qIFByb2plY3Qgb2JqZWN0ICovOworCQkJcHJveHlUeXBlID0gMTsKKwkJCXJlbW90ZUdsb2JhbElEU3RyaW5nID0gRjc2Mjg3OEEwQjcxNTVBQjAwNkFBN0VGOworCQkJcmVtb3RlSW5mbyA9ICJSZWdlbmVyYXRlIHNjb3BlcyI7CisJCX07CisJCUY3NjI4N0FFMEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSBGNzYyODc4RTBCNzE1NUFGMDA2QUE3RUY7CisJCQlyZW1vdGVJbmZvID0gIlJlZ2VuZXJhdGUgc2ltcGxlYyB0cmVlIjsKKwkJfTsKKwkJRjc5RUZCMTMwQzU4NDVBMzAwQUJBQjNEIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLyA9IHsKKwkJCWlzYSA9IFBCWENvbnRhaW5lckl0ZW1Qcm94eTsKKwkJCWNvbnRhaW5lclBvcnRhbCA9IDA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQcm9qZWN0IG9iamVjdCAqLzsKKwkJCXByb3h5VHlwZSA9IDE7CisJCQlyZW1vdGVHbG9iYWxJRFN0cmluZyA9IEY3NjI4Nzc4MEI3MTU1N0UwMDZBQTdFRjsKKwkJCXJlbW90ZUluZm8gPSAiUmVnZW5lcmF0ZSBsZXhlcnRlc3Qtc2ltcGxlIjsKKwkJfTsKKy8qIEVuZCBQQlhDb250YWluZXJJdGVtUHJveHkgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJRjcwNkE1NzEwQTBFQzM1NzAwODk5OUFCIC8qIENvcHlGaWxlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9ICIiOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDE2OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLworCQkwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEZvdW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTA4OUMxNjY3RkU4NDExNThDMDJBQUMwNyAvKiBFbmdsaXNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDEwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Quc3RyaW5nczsgbmFtZSA9IEVuZ2xpc2g7IHBhdGggPSBFbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxMDU4QzdCMUZFQTU1ODVFMTFDQTJDQkIgLyogRnV6enlMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBGdXp6eUxleGVyLmg7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCTFBMEYzNDJEMTJFQTQxMUYwMDQ5NkJCOCAvKiBmaWxlcyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBmaWxlczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwRjM0MkUxMkVBNDExRjAwNDk2QkI4IC8qIGlucHV0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IGlucHV0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQzMDEyRUE0MTFGMDA0OTZCQjggLyogTWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBNYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMEYzNDMxMTJFQTQxMUYwMDQ5NkJCOCAvKiBvdXRwdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gb3V0cHV0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQzMjEyRUE0MTFGMDA0OTZCQjggLyogUG9seS5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFBvbHkuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwRjM0MzMxMkVBNDExRjAwNDk2QkI4IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFBvbHlEaWZmZXJlbnRpYXRvci5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQzNDEyRUE0MTFGMDA0OTZCQjggLyogUG9seVByaW50ZXIuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBQb2x5UHJpbnRlci5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQzNTEyRUE0MTFGMDA0OTZCQjggLyogU2ltcGxpZmllci5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsaWZpZXIuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwRjM0NjYxMkVBNDJEODAwNDk2QkI4IC8qIHBvbHlkaWZmICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBwb2x5ZGlmZjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUEwRjM0NzgxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHkudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFBvbHkudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQ3OTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seURpZmZlcmVudGlhdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFBvbHlEaWZmZXJlbnRpYXRvci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQ3QTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBvbHlMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQ3QjEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFBvbHlMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQ3QzEyRUE0NDQ1MDA0OTZCQjggLyogUG9seVBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQb2x5UGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMEYzNDdEMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5UGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFBvbHlQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwRjM0N0UxMkVBNDQ0NTAwNDk2QkI4IC8qIFNpbXBsaWZpZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2ltcGxpZmllci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTBGMzQ3RjEyRUE0NDQ1MDA0OTZCQjggLyogU2ltcGxpZmllci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTaW1wbGlmaWVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMEYzNDgwMTJFQTQ0NDUwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBTaW1wbGlmaWVyLnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExMDBBQjkxMUU2MDRGRTAwNkFCRjk0IC8qIEFOVExSSGFzaFJ1bGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJIYXNoUnVsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTEwMEFCQTExRTYwNEZFMDA2QUJGOTQgLyogQU5UTFJIYXNoUnVsZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkhhc2hSdWxlLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMTIxMEZCMTFEM0E1RDkwMEYyN0IzOCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5vY3Rlc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuY2ZidW5kbGU7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IEFOVExSQ29tbW9uVG9rZW5UZXN0Lm9jdGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUExMjEwRkMxMUQzQTVEQTAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0LUluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9ICJBTlRMUkNvbW1vblRva2VuVGVzdC1JbmZvLnBsaXN0Ijsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExMjExRDExMUQzQkY0NzAwRjI3QjM4IC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5vY3Rlc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuY2ZidW5kbGU7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IEFOVExSU3RyaW5nU3RyZWFtVGVzdC5vY3Rlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBMTIxMUQyMTFEM0JGNDcwMEYyN0IzOCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QtSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3QueG1sOyBwYXRoID0gIkFOVExSU3RyaW5nU3RyZWFtVGVzdC1JbmZvLnBsaXN0Ijsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExMjEyMjQxMUQzQzkyNDAwRjI3QjM4IC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5vY3Rlc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuY2ZidW5kbGU7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IEFOVExSRmFzdFF1ZXVlVGVzdC5vY3Rlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBMTIxMjI1MTFEM0M5MjQwMEYyN0IzOCAvKiBBTlRMUkZhc3RRdWV1ZVRlc3QtSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3QueG1sOyBwYXRoID0gIkFOVExSRmFzdFF1ZXVlVGVzdC1JbmZvLnBsaXN0Ijsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExMjEyMkExMUQzQzkzNTAwRjI3QjM4IC8qIEFOVExSLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQU5UTFIuZnJhbWV3b3JrOyBwYXRoID0gTGlicmFyeS9GcmFtZXdvcmtzL0FOVExSLmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNES1JPT1Q7IH07CisJCTFBMTIxMkRDMTFEM0Y1MzYwMEYyN0IzOCAvKiBBTlRMUkludEFycmF5VGVzdC5vY3Rlc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuY2ZidW5kbGU7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IEFOVExSSW50QXJyYXlUZXN0Lm9jdGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUExMjEyREQxMUQzRjUzNjAwRjI3QjM4IC8qIEFOVExSSW50QXJyYXlUZXN0LUluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9ICJBTlRMUkludEFycmF5VGVzdC1JbmZvLnBsaXN0Ijsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExMjEzMEMxMUQzRjdDRDAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVHJlZVRlc3Qub2N0ZXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmNmYnVuZGxlOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBBTlRMUkNvbW1vblRyZWVUZXN0Lm9jdGVzdDsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUExMjEzMEQxMUQzRjdDRDAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVHJlZVRlc3QtSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3QueG1sOyBwYXRoID0gIkFOVExSQ29tbW9uVHJlZVRlc3QtSW5mby5wbGlzdCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMTZCMTNBMTFDNjY0OTIwMDI4NjBDNyAvKiBBTlRMUkxpbmtCYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSTGlua0Jhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExNkIxM0IxMUM2NjQ5MjAwMjg2MEM3IC8qIEFOVExSTGlua0Jhc2UubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJMaW5rQmFzZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTE3MDJGQzExQzA1RDQ4MDBGNjk3OEEgLyogQU5UTFJIYXNoTWFwLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSSGFzaE1hcC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTE3MDJGRDExQzA1RDQ4MDBGNjk3OEEgLyogQU5UTFJIYXNoTWFwLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSSGFzaE1hcC5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTE4RUY1NTExQjgwMjhEMDAwNjE4NkEgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTE4RUY1NjExQjgwMjhEMDAwNjE4NkEgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTFCQ0RCOTExQ0IwMUU2MDA1MUExRUMgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSdWxlUmV0dXJuU2NvcGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExQkNEQkExMUNCMDFFNjAwNTFBMUVDIC8qIEFOVExSUnVsZVJldHVyblNjb3BlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSUnVsZVJldHVyblNjb3BlLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUJDRENEMTFDQjBCM0QwMDUxQTFFQyAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUJDRENFMTFDQjBCM0QwMDUxQTFFQyAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUJDRTI4MTFDQjFBM0UwMDUxQTFFQyAvKiBBTlRMUlRyZWVSZXdyaXRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlRyZWVSZXdyaXRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTFCQ0UyOTExQ0IxQTNFMDA1MUExRUMgLyogQU5UTFJUcmVlUmV3cml0ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJUcmVlUmV3cml0ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExQ0NDOTAxMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSRmFzdFF1ZXVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRmFzdFF1ZXVlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUNDQzkxMTFCNkZEMzkwMDJFNUY1MyAvKiBBTlRMUkZhc3RRdWV1ZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkZhc3RRdWV1ZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTFDQ0M5MjExQjZGRDM5MDAyRTVGNTMgLyogQU5UTFJJbnRBcnJheS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkludEFycmF5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUNDQzkzMTFCNkZEMzkwMDJFNUY1MyAvKiBBTlRMUkludEFycmF5Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSSW50QXJyYXkubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExQ0NDQTkxMUI3MjRCMjAwMkU1RjUzIC8qIEFOVExSTG9va2FoZWFkU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSTG9va2FoZWFkU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUNDQ0FBMTFCNzI0QjIwMDJFNUY1MyAvKiBBTlRMUkxvb2thaGVhZFN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkxvb2thaGVhZFN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTFDQ0NDNzExQjcyN0I1MDAyRTVGNTMgLyogQU5UTFJFcnJvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkVycm9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUQ0NjU5MTFCRTczQjIwMDE1NzVGMyAvKiBBTlRMUkJhc2VUcmVlQWRhcHRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkJhc2VUcmVlQWRhcHRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTFENDY1QTExQkU3M0IyMDAxNTc1RjMgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJCYXNlVHJlZUFkYXB0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExRDQ2NkUxMUJFNzVDMDAwMTU3NUYzIC8qIEFOVExSTWFwRWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUk1hcEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExRDQ2NkYxMUJFNzVDMDAwMTU3NUYzIC8qIEFOVExSTWFwRWxlbWVudC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUk1hcEVsZW1lbnQubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExRDQ2N0ExMUJFOEU1QTAwMTU3NUYzIC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQ29tbW9uRXJyb3JOb2RlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMUQ0NjdCMTFCRThFNUEwMDE1NzVGMyAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkNvbW1vbkVycm9yTm9kZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTFGRkM1OTExQ0QxMkE0MDBGQkI0NTIgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUExRkZDNUExMUNEMTJBNDAwRkJCNDUyIC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMjYzMjkzMTFDNTM1NzgwMDBEQ0RENCAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMjYzMjk0MTFDNTM1NzgwMDBEQ0RENCAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMjcwQkY3MTFDMTQ1MTIwMERDQzhGMyAvKiBBTlRMUlRyZWVJdGVyYXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlRyZWVJdGVyYXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTI3MEJGODExQzE0NTEyMDBEQ0M4RjMgLyogQU5UTFJUcmVlSXRlcmF0b3IubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJUcmVlSXRlcmF0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEyQjA5NjMxMkU3OTdERTAwQTc1MTMzIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm07IHBhdGggPSB0ZXN0L3J1bnRpbWUvVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0vVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEyQjA5NjYxMkU3OTdGNjAwQTc1MTMzIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmg7IHBhdGggPSB0ZXN0L3J1bnRpbWUvVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0vVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEyRDIxNzMxMUU0RjU3QzAwREZFMzI4IC8qIEFOVExSVW5pcXVlSURNYXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJVbmlxdWVJRE1hcC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTJEMjE3NDExRTRGNTdDMDBERkUzMjggLyogQU5UTFJVbmlxdWVJRE1hcC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlVuaXF1ZUlETWFwLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMkQyMTg0MTFFNTAyREUwMERGRTMyOCAvKiBBTlRMUk5vZGVNYXBFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSTm9kZU1hcEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEyRDIxODUxMUU1MDJERTAwREZFMzI4IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJOb2RlTWFwRWxlbWVudC5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTM0OEIxNzExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJGYXN0UXVldWVUZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRmFzdFF1ZXVlVGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTM0OEIxODExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJGYXN0UXVldWVUZXN0Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRmFzdFF1ZXVlVGVzdC5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTM0OEIxOTExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJJbnRBcnJheVRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJJbnRBcnJheVRlc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEzNDhCMUExMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSSW50QXJyYXlUZXN0Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSSW50QXJyYXlUZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMzQ4QjFDMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkJpdFNldFRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJCaXRTZXRUZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMzQ4QjFEMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkJpdFNldFRlc3QubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJCaXRTZXRUZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMzQ4QjFGMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMzQ4QjIwMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMzQ4QjIyMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkNvbW1vblRva2VuVGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTM0OEIyMzExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJDb21tb25Ub2tlblRlc3QubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJDb21tb25Ub2tlblRlc3QubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEzNDhCMjUxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJDb21tb25UcmVlVGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTM0OEIyNjExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJDb21tb25UcmVlVGVzdC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkNvbW1vblRyZWVUZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMzQ4QjRFMTFEMkJFRTgwMDBDNzJGQyAvKiBUZXN0Lm9jdGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5jZmJ1bmRsZTsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gVGVzdC5vY3Rlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBMzQ4QjRGMTFEMkJFRTgwMDBDNzJGQyAvKiBUZXN0LUluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9ICJUZXN0LUluZm8ucGxpc3QiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTM0OEJCNTExRDJDNzExMDAwQzcyRkMgLyogQ29jb2EuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb2NvYS5mcmFtZXdvcms7IHBhdGggPSBTeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNES1JPT1Q7IH07CisJCTFBMzQ4QkI3MTFEMkM3MTEwMDBDNzJGQyAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvcmVGb3VuZGF0aW9uLmZyYW1ld29yazsgcGF0aCA9IFN5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJMUEzNDhCRUMxMUQyRDBBMTAwMEM3MkZDIC8qIEFOVExSQml0c2V0VGVzdC5vY3Rlc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuY2ZidW5kbGU7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IEFOVExSQml0c2V0VGVzdC5vY3Rlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBMzQ4QkVEMTFEMkQwQTEwMDBDNzJGQyAvKiBBTlRMUkJpdHNldFRlc3QtSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3QueG1sOyBwYXRoID0gIkFOVExSQml0c2V0VGVzdC1JbmZvLnBsaXN0Ijsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEzQTA4RTQxMUUyMTNDNTAwRDVFRTI2IC8qIEFOVExSQmFzZVN0YWNrLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQmFzZVN0YWNrLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBM0EwOEU1MTFFMjEzQzUwMEQ1RUUyNiAvKiBBTlRMUkJhc2VTdGFjay5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkJhc2VTdGFjay5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTNBMDhFODExRTIxM0UxMDBENUVFMjYgLyogQU5UTFJTeW1ib2xTdGFjay5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlN5bWJvbFN0YWNrLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBM0EwOEU5MTFFMjEzRTEwMEQ1RUUyNiAvKiBBTlRMUlN5bWJvbFN0YWNrLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSU3ltYm9sU3RhY2subTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEzQTA5QkQxMUUyMzVCRDAwRDVFRTI2IC8qIGFudGxyMy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBhbnRscjMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE0NTY1NzUxMUM5MjJCRTAwODJGNDIxIC8qIEFOVExSUnVsZU1lbW8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSdWxlTWVtby5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTQ1NjU3NjExQzkyMkJFMDA4MkY0MjEgLyogQU5UTFJSdWxlTWVtby5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlJ1bGVNZW1vLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNDU2NTg3MTFDOTI3MEQwMDgyRjQyMSAvKiBBTlRMUkJhc2VNYXBFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQmFzZU1hcEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE0NTY1ODgxMUM5MjcwRDAwODJGNDIxIC8qIEFOVExSQmFzZU1hcEVsZW1lbnQubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJCYXNlTWFwRWxlbWVudC5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTRBODUxMDExQ0JDRTNFMDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlRyZWVWaXNpdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNEE4NTExMTFDQkNFM0UwMEU0QkYxQiAvKiBBTlRMUlRyZWVWaXNpdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSVHJlZVZpc2l0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE0QTg1MTYxMUNCQ0U1NTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTRBODUxNzExQ0JDRTU1MDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNEE4NTFDMTFDQkNGMzcwMEU0QkYxQiAvKiBBTlRMUlRyZWVXaXphcmQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUcmVlV2l6YXJkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNEE4NTFEMTFDQkNGMzcwMEU0QkYxQiAvKiBBTlRMUlRyZWVXaXphcmQubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJUcmVlV2l6YXJkLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNEQ1QUQ0MTFCNTVBNDUwMDFDOTQ4MiAvKiBBTlRMUkJhc2VUcmVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQmFzZVRyZWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE0RDVBRDUxMUI1NUE0NTAwMUM5NDgyIC8qIEFOVExSQmFzZVRyZWUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJCYXNlVHJlZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTVFQTUwOTExQ0ZFN0NFMDBFODkzMkYgLyogQU5UTFJNYXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJNYXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE1RUE1MEExMUNGRTdDRTAwRTg5MzJGIC8qIEFOVExSTWFwLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSTWFwLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjVCN0Q2MTFCOTUzMkEwMEZEODc1NCAvKiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjVCN0Q3MTFCOTUzMkEwMEZEODc1NCAvKiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkM0NTE0MTFCRjRFRTAwMDM5Nzg4QSAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZDNDUxNTExQkY0RUUwMDAzOTc4OEEgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QzQ1MjYxMUJGNTBBNDAwMzk3ODhBIC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QzQ1MjcxMUJGNTBBNDAwMzk3ODhBIC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE3N0VFODkxMkU2QTU1MjAwN0YzMjNBIC8qIFRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm9jdGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5jZmJ1bmRsZTsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gVHJlZVJld3JpdGVSdWxlVG9rZW5TdHJlYW0ub2N0ZXN0OyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkxQTc3RUU4QTEyRTZBNTUyMDA3RjMyM0EgLyogVHJlZVJld3JpdGVSdWxlVG9rZW5TdHJlYW0tSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3QueG1sOyBwYXRoID0gIlRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtLUluZm8ucGxpc3QiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTg2QjkxOTExRUI5RjYzMDBDNjdBMDMgLyogQU5UTFJQYXJzZVRyZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJQYXJzZVRyZWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE4NkI5MUExMUVCOUY2MzAwQzY3QTAzIC8qIEFOVExSUGFyc2VUcmVlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSUGFyc2VUcmVlLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBODZCQUNEMTFFQzFDRDAwMEM2N0EwMyAvKiBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTg2QkFDRTExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE4QUJGQzUxMUJBOUI5NjAwMzhEQkIwIC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQ2hhclN0cmVhbVN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBOEFDMDBBMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBOEFDMDBCMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJSdW50aW1lRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBOTk0Q0U0MTJBODRGM0UwMDE4NTNGRiAvKiBTaW1wbGVDX18uZ2wgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQ19fLmdsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTlDQkQyNDExQzk5Nzk2MDBEQThGRUYgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE5Q0JEMjUxMUM5OTc5NjAwREE4RkVGIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBOUNCRDI2MTFDOTk3OTYwMERBOEZFRiAvKiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE5Q0JEMjcxMUM5OTc5NjAwREE4RkVGIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUFDMjAyQTExQ0M2MjFBMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSVHJlZVBhdHRlcm5MZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUFDMjAyQjExQ0M2MjFBMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSVHJlZVBhdHRlcm5MZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUFDMjBBMzExQ0M3OTAzMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBQUMyMEE0MTFDQzc5MDMwMENGNTZEMSAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSVHJlZVBhdHRlcm5QYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFCNEE1OEYxMUI5QTBEQTAwNzZFOTFBIC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlN0cmVhbUVudW1lcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFCNEE1OTAxMUI5QTBEQTAwNzZFOTFBIC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlN0cmVhbUVudW1lcmF0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFCNUY0NzUxMUUzODY5RDAwRTA2NUIwIC8qIEFOVExSUnVsZU1hcEVsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSdWxlTWFwRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUI1RjQ3NjExRTM4NjlEMDBFMDY1QjAgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlJ1bGVNYXBFbGVtZW50Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBQjVGNTFDMTFFM0JFMkUwMEUwNjVCMCAvKiBBTlRMUlB0ckJ1ZmZlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlB0ckJ1ZmZlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUI1RjUxRDExRTNCRTJFMDBFMDY1QjAgLyogQU5UTFJQdHJCdWZmZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJQdHJCdWZmZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDNzIxMkU3QkJCNjAwREYwQzU4IC8qIGZpbGVzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IGZpbGVzOyBwYXRoID0gdHJlZXBhcnNlci9maWxlczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDNzMxMkU3QkJCNjAwREYwQzU4IC8qIGlucHV0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IGlucHV0OyBwYXRoID0gdHJlZXBhcnNlci9pbnB1dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDNzQxMkU3QkJCNjAwREYwQzU4IC8qIExhbmcuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBMYW5nLmc7IHBhdGggPSB0cmVlcGFyc2VyL0xhbmcuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDNzUxMkU3QkJCNjAwREYwQzU4IC8qIExhbmdEdW1wRGVjbC5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IExhbmdEdW1wRGVjbC5nOyBwYXRoID0gdHJlZXBhcnNlci9MYW5nRHVtcERlY2wuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDNzcxMkU3QkJCNjAwREYwQzU4IC8qIG91dHB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBvdXRwdXQ7IHBhdGggPSB0cmVlcGFyc2VyL291dHB1dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDNzgxMkU3QkJCNjAwREYwQzU4IC8qIFJFQURNRS50eHQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gUkVBRE1FLnR4dDsgcGF0aCA9IHRyZWVwYXJzZXIvUkVBRE1FLnR4dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDODExMkU3QkM5MTAwREYwQzU4IC8qIG1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gbWFpbi5tOyBwYXRoID0gdHJlZXBhcnNlci9tYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBQzVBQ0E3MTJFN0JFRkUwMERGMEM1OCAvKiB0cmVlcGFyc2VyICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSB0cmVlcGFyc2VyOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQkxQUM1QUNDNDEyRTdDMDNDMDBERjBDNTggLyogTGFuZy50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gTGFuZy50b2tlbnM7IHBhdGggPSB0cmVlcGFyc2VyL0xhbmcudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUM1QUNDNTEyRTdDMDNDMDBERjBDNTggLyogTGFuZ0R1bXBEZWNsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IExhbmdEdW1wRGVjbC5oOyBwYXRoID0gdHJlZXBhcnNlci9MYW5nRHVtcERlY2wuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDQzYxMkU3QzAzQzAwREYwQzU4IC8qIExhbmdEdW1wRGVjbC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBMYW5nRHVtcERlY2wubTsgcGF0aCA9IHRyZWVwYXJzZXIvTGFuZ0R1bXBEZWNsLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBQzVBQ0M3MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nRHVtcERlY2wudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IExhbmdEdW1wRGVjbC50b2tlbnM7IHBhdGggPSB0cmVlcGFyc2VyL0xhbmdEdW1wRGVjbC50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBQzVBQ0M4MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nTGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gTGFuZ0xleGVyLmg7IHBhdGggPSB0cmVlcGFyc2VyL0xhbmdMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUM1QUNDOTEyRTdDMDNDMDBERjBDNTggLyogTGFuZ0xleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IExhbmdMZXhlci5tOyBwYXRoID0gdHJlZXBhcnNlci9MYW5nTGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFDNUFDQ0ExMkU3QzAzQzAwREYwQzU4IC8qIExhbmdQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gTGFuZ1BhcnNlci5oOyBwYXRoID0gdHJlZXBhcnNlci9MYW5nUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBQzVBQ0NCMTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IExhbmdQYXJzZXIubTsgcGF0aCA9IHRyZWVwYXJzZXIvTGFuZ1BhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQURCNjZGMDEyRTc0MzQxMDA3QzE2NjEgLyogRnV6enlMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBGdXp6eUxleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBREUyMUYwMTJFNTA1RDcwMEU4QTk1QyAvKiBTaW1wbGVDLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUU4QTk2QTExRDkyMjdBMDBEMzZGRDYgLyogQU5UTFJSdWxlU3RhY2suaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSdWxlU3RhY2suaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFFOEE5NkIxMUQ5MjI3QTAwRDM2RkQ2IC8qIEFOVExSUnVsZVN0YWNrLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSUnVsZVN0YWNrLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTMyREJDRjVFMDM3MEFERUUwMEM5MTc4MyAvKiBBTlRMUl9QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUl9QcmVmaXgucGNoOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4REMyRUY1QTA0ODZBNjk0MDA5OEIyMTYgLyogSW5mby5wbGlzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Q7IHBhdGggPSBJbmZvLnBsaXN0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk4REMyRUY1QjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gQU5UTFIuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlGNzAwOUFEOTBBMUJFNEFFMDAyRURENUQgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDA5QURBMEExQkU0QUUwMDJFREQ1RCAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwMEU2MTkwQTVGNjZFQzAwNUQwNzU3IC8qIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDBFNjFBMEE1RjY2RUMwMDVEMDc1NyAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAwRTg1RTBBNUZBMkRFMDA1RDA3NTcgLyogQ29tYmluZWQuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gQ29tYmluZWQuZzsgcGF0aCA9IGNvbWJpbmVkL0NvbWJpbmVkLmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDBFODY0MEE1RkEzMUQwMDVEMDc1NyAvKiBjb21iaW5lZCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gY29tYmluZWQ7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUY3MDBFODZBMEE1RkEzNEQwMDVEMDc1NyAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IG1haW4ubTsgcGF0aCA9IGNvbWJpbmVkL21haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwMEU4RjkwQTVGQUQyMTAwNUQwNzU3IC8qIEFOVExSUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDBFOEZBMEE1RkFEMjEwMDVEMDc1NyAvKiBBTlRMUlBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAwRUNDRjBBNUZFMTc2MDA1RDA3NTcgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IGlucHV0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAwRUNEMDBBNUZFMTc2MDA1RDA3NTcgLyogb3V0cHV0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDBFQ0Q3MEE1RkUxODYwMDVEMDc1NyAvKiBMTC1zdGFyICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAiTEwtc3RhciI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUY3MDBFQ0U3MEE1RkUyNUQwMDVEMDc1NyAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwMEVEN0UwQTVGRjE3QzAwNUQwNzU3IC8qIEFOVExSVG9rZW5Tb3VyY2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUb2tlblNvdXJjZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAwRUQ5NDBBNUZGMkE1MDA1RDA3NTcgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkNvbW1vblRva2VuU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDBFRDk1MEE1RkYyQTUwMDVEMDc1NyAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwMzdDRUUwQTA1ODJGQzAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDM3Q0VGMEEwNTgyRkMwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAzN0VBMDBBMDVBRkI2MDA3MDQzNUQgLyogbGV4ZXJ0ZXN0LXNpbXBsZSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gImxleGVydGVzdC1zaW1wbGUiOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlGNzAzN0VCRDBBMDVCMDZCMDA3MDQzNUQgLyogVGVzdExleGVyLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFRlc3RMZXhlci5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAzODBCQTBBMDdGQTBEMDA3MDQzNUQgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzAzODBCQjBBMDdGQTBEMDA3MDQzNUQgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzA0OEZGNTBCMDdEMDU0MDBEMkYzMjYgLyogVGVzdC50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gVGVzdC50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDQ4RkY2MEIwN0QwNTQwMEQyRjMyNiAvKiBUZXN0TGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVGVzdExleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDQ4RkY3MEIwN0QwNTQwMEQyRjMyNiAvKiBUZXN0TGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVGVzdExleGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MDZBNTVCMEEwRUMzMDcwMDg5OTlBQiAvKiBpbnB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MEFBN0E1MDlBQTJBNjkwMEMzRkQ1RSAvKiBBTlRMUi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzBBQTdBRDA5QUEyQUMwMDBDM0ZENUUgLyogQU5UTFJJbnRTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJJbnRTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwQUE3QjUwOUFBMkI4ODAwQzNGRDVFIC8qIEFOVExSQ2hhclN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkNoYXJTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwQUE3QzUwOUFBMzM5OTAwQzNGRDVFIC8qIEFOVExSU3RyaW5nU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSU3RyaW5nU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MEFBN0M2MDlBQTMzOTkwMEMzRkQ1RSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlN0cmluZ1N0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzBBQTdDRTA5QUEzNzkzMDBDM0ZENUUgLyogQU5UTFJDaGFyU3RyZWFtU3RhdGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJDaGFyU3RyZWFtU3RhdGUubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcwQjExQkIwQzRDMkI2NDAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MEIxMUJDMEM0QzJCNjQwMEMzRUNFMCAvKiBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzBCMTFDMTBDNEMyQjc5MDBDM0VDRTAgLyogQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzBCMTFDMjBDNEMyQjc5MDBDM0VDRTAgLyogQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzBCQjM5MDA5OEU1QkI4MDA1NEZFRjggLyogU2VuVGVzdGluZ0tpdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IFNlblRlc3RpbmdLaXQuZnJhbWV3b3JrOyBwYXRoID0gTGlicmFyeS9GcmFtZXdvcmtzL1NlblRlc3RpbmdLaXQuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gREVWRUxPUEVSX0RJUjsgfTsKKwkJRjcxMzI1ODYwQzRBMDYwOTAwQjk5RjJEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MTMyNTg3MEM0QTA2MDkwMEI5OUYyRCAvKiBBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzFGNkI4RjA5QTgxRTZGMDAzMjIxRjQgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcms7IHBhdGggPSAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db3JlRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CisJCUY3MkI4Q0ZBMEFEMDFEMzgwMDEzRjFFMiAvKiBGdXp6eS5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBGdXp6eS5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJCOEQwOTBBRDAxRENCMDAxM0YxRTIgLyogRnV6enkudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IEZ1enp5LnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcyQjhEMEIwQUQwMURDQjAwMTNGMUUyIC8qIEZ1enp5TGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gRnV6enlMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJDNThFODBBQjM5MTFEMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQ29tbW9uVHJlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJDNThFOTBBQjM5MTFEMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSQ29tbW9uVHJlZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJDNTlBNTBBQjRGMjBBMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MkM1OUE2MEFCNEYyMEEwMDI4MjU3NCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSQ29tbW9uVHJlZUFkYXB0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcyQzVCODIwQUI1MkFEMzAwMjgyNTc0IC8qIEFOVExSVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUcmVlTm9kZVN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJDNUQ1NDBBQjYzQzFEMDAyODI1NzQgLyogQU5UTFJUcmVlUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSVHJlZVBhcnNlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJDNUQ1NTBBQjYzQzFEMDAyODI1NzQgLyogQU5UTFJUcmVlUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSVHJlZVBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzJDNUQ2MDBBQjYzRTBCMDAyODI1NzQgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcyQzVENjEwQUI2M0UwQjAwMjgyNTc0IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MkM1RTJGMEFCNzUyOUMwMDI4MjU3NCAvKiBpbnB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBpbnB1dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcyQzVFMzEwQUI3NTI5QzAwMjgyNTc0IC8qIG91dHB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MkM1RTU2MEFCN0U0MTAwMDI4MjU3NCAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjcyQzVFNjkwQUI3RTRDOTAwMjgyNTc0IC8qIHNpbXBsZWN0cmVlICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBzaW1wbGVjdHJlZTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJRjcyQzVFQ0MwQUI3RTVBNTAwMjgyNTc0IC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MkM1RUNEMEFCN0U1QTUwMDI4MjU3NCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzM4RDE3MzBCMDdBRUFBMDAxODEzQzQgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczOEQxNzQwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMTc1MEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUlRyZWVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUcmVlRXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMTc2MEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJUcmVlRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMUZEMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZS50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU3ltYm9sVGFibGUudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzM4RDFGRTBCMDdCMUNFMDAxODEzQzQgLyogU3ltYm9sVGFibGVMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTeW1ib2xUYWJsZUxleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMUZGMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZUxleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFN5bWJvbFRhYmxlTGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczOEQyMDAwQjA3QjFDRTAwMTgxM0M0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN5bWJvbFRhYmxlUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMjAxMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTeW1ib2xUYWJsZVBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzM4RDIyMzBCMDdCM0JDMDAxODEzQzQgLyogVFBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMjI0MEIwN0IzQkMwMDE4MTNDNCAvKiBUUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFRQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczOEQyNTEwQjA3Qjg0MjAwMTgxM0M0IC8qIFNpbXBsZUNQYXJzZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU2ltcGxlQ1BhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzM4RDI3RjBCMDdCOUI2MDAxODEzQzQgLyogU2ltcGxlQy50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMjgwMEIwN0I5QjYwMDE4MTNDNCAvKiBTaW1wbGVDTGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2ltcGxlQ0xleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMjgxMEIwN0I5QjYwMDE4MTNDNCAvKiBTaW1wbGVDTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU2ltcGxlQ0xleGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMjgyMEIwN0I5QjYwMDE4MTNDNCAvKiBTaW1wbGVDUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNpbXBsZUNQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczOEQzNUMwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBDb21iaW5lZC50b2tlbnM7IHBhdGggPSBjb21iaW5lZC9Db21iaW5lZC50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMzVEMEIwN0MxMDUwMDE4MTNDNCAvKiBDb21iaW5lZExleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IENvbWJpbmVkTGV4ZXIuaDsgcGF0aCA9IGNvbWJpbmVkL0NvbWJpbmVkTGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczOEQzNUUwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQ29tYmluZWRMZXhlci5tOyBwYXRoID0gY29tYmluZWQvQ29tYmluZWRMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzM4RDM1RjBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQ29tYmluZWRQYXJzZXIuaDsgcGF0aCA9IGNvbWJpbmVkL0NvbWJpbmVkUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3MzhEMzYwMEIwN0MxMDUwMDE4MTNDNCAvKiBDb21iaW5lZFBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBDb21iaW5lZFBhcnNlci5tOyBwYXRoID0gY29tYmluZWQvQ29tYmluZWRQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczRTJCNzIwQTlDRkU2QTAwNUQ2MjY3IC8qIEFOVExSVHJlZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlRyZWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjczRTJCN0EwQTlEMEFGQzAwNUQ2MjY3IC8qIEFOVExSVHJlZUFkYXB0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUcmVlQWRhcHRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzQxRDA2NDBCMzgxMkQ0MDAyNERGM0YgLyogU2ltcGxlQ1dhbGtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDV2Fsa2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3NDFEMDY1MEIzODEyRDQwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNXYWxrZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc2Mjg3OUMwQjcxNTc4RDAwNkFBN0VGIC8qIFJFQURNRS5ydGYgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnJ0ZjsgcGF0aCA9IFJFQURNRS5ydGY7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3NkFBOThFMENFQTUxNUEwMEFGMDQ0QyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc2QUE5OEYwQ0VBNTE1QTAwQUYwNDRDIC8qIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzcxNUQxQTBBQzlEQ0U0MDBFRDk4NEQgLyogU2ltcGxlQy5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsZUMuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc3MTVEMUIwQUM5RENFNTAwRUQ5ODREIC8qIFNpbXBsZUNXYWxrZXIuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBTaW1wbGVDV2Fsa2VyLmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3NzE1RDFDMEFDOURERDgwMEVEOTg0RCAvKiBTaW1wbGVDLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBTaW1wbGVDLnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc3MTVEMUQwQUM5REREODAwRUQ5ODREIC8qIFNpbXBsZUNXYWxrZXIudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsZUNXYWxrZXIudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzcxNUQyRTBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ0xleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNpbXBsZUNMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzcxNUQyRjBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ0xleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzcxNUQzMDBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ1BhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3NzE1RDMxMEFDOURFOUUwMEVEOTg0RCAvKiBTaW1wbGVDUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc3NTRFM0QwQTVDMEEwNTAwRDA4NzNBIC8qIEFOVExSREZBLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSREZBLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3NzU0RTNFMEE1QzBBMDUwMEQwODczQSAvKiBBTlRMUkRGQS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkRGQS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzc3NDQwMzBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gIkFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmgiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzc3NDQwNDBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gIkFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm0iOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzc3NDc1NTBCMjNBNzA2MDBEMUY4OUIgLyogQU5UTFJEZWJ1Zy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkRlYnVnLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3Nzc2NUNBMDlEQzU4MzAwMDUxNzE4MSAvKiBBTlRMUlRva2VuLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSVG9rZW4uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc3NzY2MDMwOURDNUNGNDAwNTE3MTgxIC8qIEFOVExSQ29tbW9uVG9rZW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJDb21tb25Ub2tlbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzc3NjYwNDA5REM1Q0Y0MDA1MTcxODEgLyogQU5UTFJDb21tb25Ub2tlbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkNvbW1vblRva2VuLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3Nzc2NjgwMDlEQzcxOUMwMDUxNzE4MSAvKiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzc3NjY4MTA5REM3MTlDMDA1MTcxODEgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc3NzY2OTEwOURDNzJENjAwNTE3MTgxIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzc3NjY5MjA5REM3MkQ2MDA1MTcxODEgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3Nzc2NkFFMDlERDUzRTgwMDUxNzE4MSAvKiBBTlRMUlRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSVG9rZW5TdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjc5RDU2NjAwQTBFMjNBNDAwRUEzQ0VFIC8qIGZ1enp5ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBmdXp6eTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJRjc5RDU2QzAwQTBFMjg3NTAwRUEzQ0VFIC8qIG1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gbWFpbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGNzlENTk4OTBBMEU1MUFCMDBFQTNDRUUgLyogQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3OUQ1OThBMEEwRTUxQUIwMEVBM0NFRSAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdBNDA5OEIwOTY1OUJGMzAwMkNDNzgxIC8qIEFOVExSQmFzZVJlY29nbml6ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJCYXNlUmVjb2duaXplci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0E0MDk4QzA5NjU5QkYzMDAyQ0M3ODEgLyogQU5UTFJCYXNlUmVjb2duaXplci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkJhc2VSZWNvZ25pemVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3QTQwOTkxMDk2NTlCRkIwMDJDQzc4MSAvKiBBTlRMUkxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSTGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdBNDA5OTIwOTY1OUJGQjAwMkNDNzgxIC8qIEFOVExSTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0IxRTVBQzBDRDdDRjE5MDBDRTEzNkUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdCMUU1QUQwQ0Q3Q0YxOTAwQ0UxMzZFIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3Q0Q0NUZDMEM2NEJBNEIwMEZGOTMzQSAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdDRDQ1RkQwQzY0QkE0QjAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gVHJlZVJld3JpdGUuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdDRDQ2MzQwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBUcmVlUmV3cml0ZS50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3Q0Q0NjM1MEM2NEJCNzMwMEZGOTMzQSAvKiBUcmVlUmV3cml0ZUxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRyZWVSZXdyaXRlTGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdDRDQ2MzYwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVHJlZVJld3JpdGVMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0NENDYzNzBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGVQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJlZVJld3JpdGVQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdDRDQ2MzgwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFRyZWVSZXdyaXRlUGFyc2VyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3Q0Q0NzVEMEM2NEQyMjgwMEZGOTMzQSAvKiB0cmVlcmV3cml0ZSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdHJlZXJld3JpdGU7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCUY3Q0VDRDdEMEIxRTVDMzcwMDU0Q0MzQiAvKiBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0REMDVFMjBBN0IxNEJFMDA2QTAwNkMgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IGlucHV0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0REMDVFMzBBN0IxNEJFMDA2QTAwNkMgLyogb3V0cHV0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3REQwNUU0MEE3QjE0QkUwMDZBMDA2QyAvKiBULmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFQuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdERDA1RTcwQTdCMTU3MjAwNkEwMDZDIC8qIG1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gbWFpbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0REMDVFRTBBN0IxNUUxMDA2QTAwNkMgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IGhvaXN0ZWRQcmVkaWNhdGVzOyBzb3VyY2VUcmVlID0gQlVJTFRfUFJPRFVDVFNfRElSOyB9OworCQlGN0REMDZFNzBBN0IxNzAwMDA2QTAwNkMgLyogVExleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUTGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdERDA2RTgwQTdCMTcwMDAwNkEwMDZDIC8qIFRMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVExleGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3REQwNzNDMEE3QjY2MEEwMDZBMDA2QyAvKiBpbnB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3REQwNzNEMEE3QjY2MEEwMDZBMDA2QyAvKiBvdXRwdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IG91dHB1dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdERDA3M0UwQTdCNjYwQTAwNkEwMDZDIC8qIFN5bWJvbFRhYmxlLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFN5bWJvbFRhYmxlLmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3REQwNzQ0MEE3QjY2MTgwMDZBMDA2QyAvKiBzY29wZXMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHNjb3Blczsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJRjdERDA3ODAwQTdCNjdBNzAwNkEwMDZDIC8qIG1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gbWFpbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjExNDBCMUU0NDMyMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1BhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkRlYnVnUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3RTI2MTE1MEIxRTQ0MzIwMDEzRjY0MCAvKiBBTlRMUkRlYnVnUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRGVidWdQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdFMjYxMTgwQjFFNDQzQzAwMTNGNjQwIC8qIEFOVExSRGVidWdUcmVlUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRGVidWdUcmVlUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3RTI2MTE5MEIxRTQ0M0MwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkRlYnVnVHJlZVBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjExRTBCMUU0NEU4MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRGVidWdUb2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjExRjBCMUU0NEU4MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRGVidWdUb2tlblN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjEyMjBCMUU0NEZBMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjEyMzBCMUU0NEZBMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjEyNjBCMUU0NTA3MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSRGVidWdUcmVlQWRhcHRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjEyNzBCMUU0NTA3MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRGVidWdUcmVlQWRhcHRvci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0UyNjEzNzBCMUU0NTU4MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdFMjYxMzgwQjFFNDU1ODAwMTNGNjQwIC8qIEFOVExSRGVidWdFdmVudFByb3h5Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSRGVidWdFdmVudFByb3h5Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUY3RTk4Mzk0MEEwRDZBNUYwMEYxNjA5MyAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdFRkZDOEIwRDE2NEUyQzAwOEVFNTdFIC8qIENIQU5HRVMudHh0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IENIQU5HRVMudHh0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGN0YyMThFRTA5N0FGQjFBMDAwNDcyRTkgLyogQU5UTFJCaXRTZXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJCaXRTZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRjdGMjE4RUYwOTdBRkIxQTAwMDQ3MkU5IC8qIEFOVExSQml0U2V0Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSQml0U2V0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUEwRjM0NUQxMkVBNDJEODAwNDk2QkI4IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTBGMzQ1RTEyRUE0MkQ4MDA0OTZCQjggLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUEwRjM0NUYxMkVBNDJEODAwNDk2QkI4IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUEwRjM0NjAxMkVBNDJEODAwNDk2QkI4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTBGODExRDNBNUQ5MDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMTIxMTc5MTFEM0I0NUMwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTE3QTExRDNCNDcwMDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUExMjExN0IxMUQzQjQ3MDAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTFDRTExRDNCRjQ2MDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMTIxMUQ3MTFEM0JGNjgwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTFEODExRDNCRjY4MDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUExMjExRDkxMUQzQkY2ODAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTIyMTExRDNDOTI0MDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMTIxMjJCMTFEM0M5MzUwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTIyQzExRDNDOTM1MDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUExMjEyMkQxMUQzQzkzNTAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTJEOTExRDNGNTM2MDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMTIxMkUyMTFEM0Y1NTUwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTJFMzExRDNGNTU1MDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUExMjEyRTQxMUQzRjU1NTAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTMwOTExRDNGN0NEMDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMTIxMzEyMTFEM0Y3REMwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTMxMzExRDNGN0RDMDBGMjdCMzggLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUExMjEzMTQxMUQzRjdEQzAwRjI3QjM4IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTM0OEI0QjExRDJCRUU4MDAwQzcyRkMgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMzQ4QjU4MTFEMkJGMUMwMDBDNzJGQyAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTM0OEJCNjExRDJDNzExMDAwQzcyRkMgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUEzNDhCQjgxMUQyQzcxMTAwMEM3MkZDIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTM0OEJFOTExRDJEMEExMDAwQzcyRkMgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMzQ4QkYyMTFEMkQwRTAwMDBDNzJGQyAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTM0OEJGMzExRDJEMEUwMDAwQzcyRkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUEzNDhCRjQxMUQyRDBFNzAwMEM3MkZDIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTc3RUU4NjEyRTZBNTUyMDA3RjMyM0EgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNzdFRTkzMTJFNkE1N0MwMDdGMzIzQSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTc3RUU5NDEyRTZBNTdDMDA3RjMyM0EgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUE3N0VFOTcxMkU2QTU5NDAwN0YzMjNBIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQUM1QUM5RDEyRTdCRUZFMDBERjBDNTggLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBQzVBQzlFMTJFN0JFRkUwMERGMEM1OCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQUM1QUM5RjEyRTdCRUZFMDBERjBDNTggLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQUM1QUNBMTEyRTdCRUZFMDBERjBDNTggLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCThEQzJFRjU2MDQ4NkE2OTQwMDk4QjIxNiAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjc2M0Q1MUUwQTY2NzY1QjAwNjFDRDM1IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTFBREI2N0JBMTJFNzRFODIwMDdDMTY2MSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjcwMEU4NjIwQTVGQTMxRDAwNUQwNzU3IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGNzAwRUNBNDBBNUZERjFBMDA1RDA3NTcgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjcwMEVDQTUwQTVGREYxQTAwNUQwNzU3IC8qIEZ1enp5TGV4ZXIuaCBpbiBGcmFtZXdvcmtzICovLAorCQkJCUY3MDBFQzY3MEE1RkRGMEQwMDVEMDc1NyAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjcwMEVDRDUwQTVGRTE4NjAwNUQwNzU3IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGN0Y0RTlCQTBBNkU4QjExMDA5MkQwODcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQlGNzYzRDQ0OTBBNjY2RDNEMDA2MUNEMzUgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjcwMEVDRDkwQTVGRTE5QTAwNUQwNzU3IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCUY3MDBFQ0RBMEE1RkUxOUEwMDVEMDc1NyAvKiBGdXp6eUxleGVyLmggaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjcwMzdFOUUwQTA1QUZCNjAwNzA0MzVEIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGNzAzN0VBNjBBMDVBRkQ3MDA3MDQzNUQgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdFOTg1NTgwQTBEODY1RTAwRjE2MDkzIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdFOTg1NTkwQTBEODY2MDAwRjE2MDkzIC8qIEZ1enp5TGV4ZXIuaCBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlGNzJDNUU2MTBBQjdFNEM5MDAyODI1NzQgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUY3MkM1RTYyMEFCN0U0QzkwMDI4MjU3NCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQlGNzJDNUU2MzBBQjdFNEM5MDAyODI1NzQgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQlGNzJDNUU2NTBBQjdFNEM5MDAyODI1NzQgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY3OUQ1NjVFMEEwRTIzQTQwMEVBM0NFRSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjc5RDVBRjYwQTBFNjM0OTAwRUEzQ0VFIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCUY3OUQ1QUY3MEEwRTYzNEEwMEVBM0NFRSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCUY3OUQ1QUY4MEEwRTYzNEEwMEVBM0NFRSAvKiBGdXp6eUxleGVyLmggaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjdDRDQ3NUIwQzY0RDIyODAwRkY5MzNBIC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGN0NENDg2NzBDNjREODg4MDBGRjkzM0EgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdDRDQ4NjgwQzY0RDg4ODAwRkY5MzNBIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdDRDQ4NkEwQzY0RDg4ODAwRkY5MzNBIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlGN0REMDVFQzBBN0IxNUUxMDA2QTAwNkMgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUY3REQwNjA0MEE3QjE2NjMwMDZBMDA2QyAvKiBGdXp6eUxleGVyLmggaW4gRnJhbWV3b3JrcyAqLywKKwkJCQlGN0REMDYwNzBBN0IxNjY0MDA2QTAwNkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdERDA2MzAwQTdCMTY2NTAwNkEwMDZDIC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdERDA2QzUwQTdCMTY5MTAwNkEwMDZDIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQlGN0REMDc0MjBBN0I2NjE4MDA2QTAwNkMgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCUY3REQwNzRDMEE3QjY2NTYwMDZBMDA2QyAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQlGN0REMDc0RDBBN0I2NjVDMDA2QTAwNkMgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQlGN0REMDc0RTBBN0I2NjVEMDA2QTAwNkMgLyogRnV6enlMZXhlci5oIGluIEZyYW1ld29ya3MgKi8sCisJCQkJRjdERDA3NEYwQTdCNjY1RDAwNkEwMDZDIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYR3JvdXAgc2VjdGlvbiAqLworCQkwMzQ3NjhERkZGMzhBNTA0MTFEQjlDOEIgLyogUHJvZHVjdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEQzJFRjVCMDQ4NkE2OTQwMDk4QjIxNiAvKiBBTlRMUi5mcmFtZXdvcmsgKi8sCisJCQkJRjcwMzdFQTAwQTA1QUZCNjAwNzA0MzVEIC8qIGxleGVydGVzdC1zaW1wbGUgKi8sCisJCQkJRjc5RDU2NjAwQTBFMjNBNDAwRUEzQ0VFIC8qIGZ1enp5ICovLAorCQkJCUY3MDBFODY0MEE1RkEzMUQwMDVEMDc1NyAvKiBjb21iaW5lZCAqLywKKwkJCQlGNzAwRUNENzBBNUZFMTg2MDA1RDA3NTcgLyogTEwtc3RhciAqLywKKwkJCQlGN0REMDVFRTBBN0IxNUUxMDA2QTAwNkMgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8sCisJCQkJRjdERDA3NDQwQTdCNjYxODAwNkEwMDZDIC8qIHNjb3BlcyAqLywKKwkJCQlGNzJDNUU2OTBBQjdFNEM5MDAyODI1NzQgLyogc2ltcGxlY3RyZWUgKi8sCisJCQkJRjdDRDQ3NUQwQzY0RDIyODAwRkY5MzNBIC8qIHRyZWVyZXdyaXRlICovLAorCQkJCTFBMzQ4QjRFMTFEMkJFRTgwMDBDNzJGQyAvKiBUZXN0Lm9jdGVzdCAqLywKKwkJCQkxQTM0OEJFQzExRDJEMEExMDAwQzcyRkMgLyogQU5UTFJCaXRzZXRUZXN0Lm9jdGVzdCAqLywKKwkJCQkxQTEyMTBGQjExRDNBNUQ5MDBGMjdCMzggLyogQU5UTFJDb21tb25Ub2tlblRlc3Qub2N0ZXN0ICovLAorCQkJCTFBMTIxMUQxMTFEM0JGNDcwMEYyN0IzOCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3Qub2N0ZXN0ICovLAorCQkJCTFBMTIxMjI0MTFEM0M5MjQwMEYyN0IzOCAvKiBBTlRMUkZhc3RRdWV1ZVRlc3Qub2N0ZXN0ICovLAorCQkJCTFBMTIxMkRDMTFEM0Y1MzYwMEYyN0IzOCAvKiBBTlRMUkludEFycmF5VGVzdC5vY3Rlc3QgKi8sCisJCQkJMUExMjEzMEMxMUQzRjdDRDAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVHJlZVRlc3Qub2N0ZXN0ICovLAorCQkJCTFBNzdFRTg5MTJFNkE1NTIwMDdGMzIzQSAvKiBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5vY3Rlc3QgKi8sCisJCQkJMUFDNUFDQTcxMkU3QkVGRTAwREYwQzU4IC8qIHRyZWVwYXJzZXIgKi8sCisJCQkJMUEwRjM0NjYxMkVBNDJEODAwNDk2QkI4IC8qIHBvbHlkaWZmICovLAorCQkJKTsKKwkJCW5hbWUgPSBQcm9kdWN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4NjdENjkxRkU4NDAyOEZDMDJBQUMwNyAvKiBBTlRMUiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJRjc2Mjg3OUMwQjcxNTc4RDAwNkFBN0VGIC8qIFJFQURNRS5ydGYgKi8sCisJCQkJRjdFRkZDOEIwRDE2NEUyQzAwOEVFNTdFIC8qIENIQU5HRVMudHh0ICovLAorCQkJCTA4RkI3N0FFRkU4NDE3MkVDMDJBQUMwNyAvKiBDbGFzc2VzICovLAorCQkJCUY3MDM3RUJCMEEwNUIwNkIwMDcwNDM1RCAvKiBleGFtcGxlcyAqLywKKwkJCQkzMkM4OERGRjAzNzFDMjQyMDBDOTE3ODMgLyogT3RoZXIgU291cmNlcyAqLywKKwkJCQkwODlDMTY2NUZFODQxMTU4QzAyQUFDMDcgLyogUmVzb3VyY2VzICovLAorCQkJCTA4NjdENjlBRkU4NDAyOEZDMDJBQUMwNyAvKiBFeHRlcm5hbCBGcmFtZXdvcmtzIGFuZCBMaWJyYXJpZXMgKi8sCisJCQkJMDM0NzY4REZGRjM4QTUwNDExREI5QzhCIC8qIFByb2R1Y3RzICovLAorCQkJCTFBMzQ4QjE0MTFEMkJFNEYwMDBDNzJGQyAvKiB0ZXN0ICovLAorCQkJCTFBMzQ4QjRGMTFEMkJFRTgwMDBDNzJGQyAvKiBUZXN0LUluZm8ucGxpc3QgKi8sCisJCQkJMUEzNDhCQjUxMUQyQzcxMTAwMEM3MkZDIC8qIENvY29hLmZyYW1ld29yayAqLywKKwkJCQkxQTM0OEJCNzExRDJDNzExMDAwQzcyRkMgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJCTFBMzQ4QkVEMTFEMkQwQTEwMDBDNzJGQyAvKiBBTlRMUkJpdHNldFRlc3QtSW5mby5wbGlzdCAqLywKKwkJCQkxQTEyMTBGQzExRDNBNURBMDBGMjdCMzggLyogQU5UTFJDb21tb25Ub2tlblRlc3QtSW5mby5wbGlzdCAqLywKKwkJCQkxQTEyMTFEMjExRDNCRjQ3MDBGMjdCMzggLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0LUluZm8ucGxpc3QgKi8sCisJCQkJMUExMjEyMjUxMUQzQzkyNDAwRjI3QjM4IC8qIEFOVExSRmFzdFF1ZXVlVGVzdC1JbmZvLnBsaXN0ICovLAorCQkJCTFBMTIxMjJBMTFEM0M5MzUwMEYyN0IzOCAvKiBBTlRMUi5mcmFtZXdvcmsgKi8sCisJCQkJMUExMjEyREQxMUQzRjUzNjAwRjI3QjM4IC8qIEFOVExSSW50QXJyYXlUZXN0LUluZm8ucGxpc3QgKi8sCisJCQkJMUExMjEzMEQxMUQzRjdDRDAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVHJlZVRlc3QtSW5mby5wbGlzdCAqLywKKwkJCQkxQTc3RUU4QTEyRTZBNTUyMDA3RjMyM0EgLyogVHJlZVJld3JpdGVSdWxlVG9rZW5TdHJlYW0tSW5mby5wbGlzdCAqLywKKwkJCSk7CisJCQluYW1lID0gQU5UTFI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkwODY3RDY5QUZFODQwMjhGQzAyQUFDMDcgLyogRXh0ZXJuYWwgRnJhbWV3b3JrcyBhbmQgTGlicmFyaWVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGNzBCQjM5MDA5OEU1QkI4MDA1NEZFRjggLyogU2VuVGVzdGluZ0tpdC5mcmFtZXdvcmsgKi8sCisJCQkJMTA1OEM3QjBGRUE1NTg1RTExQ0EyQ0JCIC8qIExpbmtlZCBGcmFtZXdvcmtzICovLAorCQkJCTEwNThDN0IyRkVBNTU4NUUxMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCW5hbWUgPSAiRXh0ZXJuYWwgRnJhbWV3b3JrcyBhbmQgTGlicmFyaWVzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTA4OUMxNjY1RkU4NDExNThDMDJBQUMwNyAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCThEQzJFRjVBMDQ4NkE2OTQwMDk4QjIxNiAvKiBJbmZvLnBsaXN0ICovLAorCQkJCTA4OUMxNjY2RkU4NDExNThDMDJBQUMwNyAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLywKKwkJCSk7CisJCQluYW1lID0gUmVzb3VyY2VzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMDhGQjc3QUVGRTg0MTcyRUMwMkFBQzA3IC8qIENsYXNzZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3RTI2MTBGMEIxRTQzRTYwMDEzRjY0MCAvKiBEZWJ1Z2dpbmcgKi8sCisJCQkJRjdBNDA5NTEwOTY1OTdEMjAwMkNDNzgxIC8qIERGQSAqLywKKwkJCQlGN0E0MDk0QzA5NjU5N0M0MDAyQ0M3ODEgLyogRXhjZXB0aW9ucyAqLywKKwkJCQlGN0YyMThFQjA5N0FGQjBDMDAwNDcyRTkgLyogTWlzYyAqLywKKwkJCQlGN0E0MDk4ODA5NjU5QkU1MDAyQ0M3ODEgLyogUmVjb2duaXplciAqLywKKwkJCQkxQTFCQ0RDMDExQ0IwNEQyMDA1MUExRUMgLyogUnVsZXMgKi8sCisJCQkJRjcwQUE3QUEwOUFBMkFBQjAwQzNGRDVFIC8qIFN0cmVhbXMgKi8sCisJCQkJRjc0OTJGOEQwOUMwMTcxOTAwQjI1RTMwIC8qIFRva2VucyAqLywKKwkJCQlGNzNFMkI1OTBBOUNGODNBMDA1RDYyNjcgLyogVHJlZXMgKi8sCisJCQkpOworCQkJbmFtZSA9IENsYXNzZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxMDU4QzdCMEZFQTU1ODVFMTFDQTJDQkIgLyogTGlua2VkIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3MUY2QjhGMDlBODFFNkYwMDMyMjFGNCAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkJMTA1OEM3QjFGRUE1NTg1RTExQ0EyQ0JCIC8qIEZ1enp5TGV4ZXIuaCAqLywKKwkJCSk7CisJCQluYW1lID0gIkxpbmtlZCBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTEwNThDN0IyRkVBNTU4NUUxMUNBMkNCQiAvKiBPdGhlciBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODY3RDY5QkZFODQwMjhGQzAyQUFDMDcgLyogRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBMEYzNDJDMTJFQTQxMUYwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUEwRjM0NzgxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHkudG9rZW5zICovLAorCQkJCTFBMEYzNDc5MTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5RGlmZmVyZW50aWF0b3IubSAqLywKKwkJCQkxQTBGMzQ3QTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLmggKi8sCisJCQkJMUEwRjM0N0IxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlMZXhlci5tICovLAorCQkJCTFBMEYzNDdDMTJFQTQ0NDUwMDQ5NkJCOCAvKiBQb2x5UGFyc2VyLmggKi8sCisJCQkJMUEwRjM0N0QxMkVBNDQ0NTAwNDk2QkI4IC8qIFBvbHlQYXJzZXIubSAqLywKKwkJCQkxQTBGMzQ3RTEyRUE0NDQ1MDA0OTZCQjggLyogU2ltcGxpZmllci5oICovLAorCQkJCTFBMEYzNDdGMTJFQTQ0NDUwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLm0gKi8sCisJCQkJMUEwRjM0ODAxMkVBNDQ0NTAwNDk2QkI4IC8qIFNpbXBsaWZpZXIudG9rZW5zICovLAorCQkJCTFBMEYzNDJEMTJFQTQxMUYwMDQ5NkJCOCAvKiBmaWxlcyAqLywKKwkJCQkxQTBGMzQyRTEyRUE0MTFGMDA0OTZCQjggLyogaW5wdXQgKi8sCisJCQkJMUEwRjM0MzAxMkVBNDExRjAwNDk2QkI4IC8qIE1haW4ubSAqLywKKwkJCQkxQTBGMzQzMTEyRUE0MTFGMDA0OTZCQjggLyogb3V0cHV0ICovLAorCQkJCTFBMEYzNDMyMTJFQTQxMUYwMDQ5NkJCOCAvKiBQb2x5LmcgKi8sCisJCQkJMUEwRjM0MzMxMkVBNDExRjAwNDk2QkI4IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5nICovLAorCQkJCTFBMEYzNDM0MTJFQTQxMUYwMDQ5NkJCOCAvKiBQb2x5UHJpbnRlci5nICovLAorCQkJCTFBMEYzNDM1MTJFQTQxMUYwMDQ5NkJCOCAvKiBTaW1wbGlmaWVyLmcgKi8sCisJCQkpOworCQkJcGF0aCA9IHBvbHlkaWZmOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUExQkNEQzAxMUNCMDREMjAwNTFBMUVDIC8qIFJ1bGVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQUI1RjQ3NTExRTM4NjlEMDBFMDY1QjAgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5oICovLAorCQkJCTFBQjVGNDc2MTFFMzg2OUQwMEUwNjVCMCAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50Lm0gKi8sCisJCQkJRjcyQzVFQ0MwQUI3RTVBNTAwMjgyNTc0IC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmggKi8sCisJCQkJRjcyQzVFQ0QwQUI3RTVBNTAwMjgyNTc0IC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm0gKi8sCisJCQkJMUExQkNEQjkxMUNCMDFFNjAwNTFBMUVDIC8qIEFOVExSUnVsZVJldHVyblNjb3BlLmggKi8sCisJCQkJMUExQkNEQkExMUNCMDFFNjAwNTFBMUVDIC8qIEFOVExSUnVsZVJldHVyblNjb3BlLm0gKi8sCisJCQkJMUExQkNEQ0QxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oICovLAorCQkJCTFBMUJDRENFMTFDQjBCM0QwMDUxQTFFQyAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubSAqLywKKwkJCSk7CisJCQluYW1lID0gUnVsZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTM0OEIxNDExRDJCRTRGMDAwQzcyRkMgLyogdGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUEzNDhCMTUxMUQyQkU0RjAwMEM3MkZDIC8qIHJ1bnRpbWUgKi8sCisJCQkpOworCQkJcGF0aCA9IHRlc3Q7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTM0OEIxNTExRDJCRTRGMDAwQzcyRkMgLyogcnVudGltZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUEzNDhCMTYxMUQyQkU0RjAwMEM3MkZDIC8qIG1pc2MgKi8sCisJCQkJMUEzNDhCMUIxMUQyQkU0RjAwMEM3MkZDIC8qIHNldHMgKi8sCisJCQkJMUEzNDhCMUUxMUQyQkU0RjAwMEM3MkZDIC8qIHN0cmVhbSAqLywKKwkJCQkxQTM0OEIyMTExRDJCRTRGMDAwQzcyRkMgLyogdG9rZW4gKi8sCisJCQkJMUEzNDhCMjQxMUQyQkU0RjAwMEM3MkZDIC8qIHRyZWUgKi8sCisJCQkJMUE3N0VFMTkxMkU2QTAzQjAwN0YzMjNBIC8qIFJld3JpdGVSdWxlICovLAorCQkJKTsKKwkJCXBhdGggPSBydW50aW1lOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUEzNDhCMTYxMUQyQkU0RjAwMEM3MkZDIC8qIG1pc2MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBMzQ4QjE3MTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkZhc3RRdWV1ZVRlc3QuaCAqLywKKwkJCQkxQTM0OEIxODExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJGYXN0UXVldWVUZXN0Lm0gKi8sCisJCQkJMUEzNDhCMTkxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSSW50QXJyYXlUZXN0LmggKi8sCisJCQkJMUEzNDhCMUExMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSSW50QXJyYXlUZXN0Lm0gKi8sCisJCQkpOworCQkJcGF0aCA9IG1pc2M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTM0OEIxQjExRDJCRTRGMDAwQzcyRkMgLyogc2V0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUEzNDhCMUMxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5oICovLAorCQkJCTFBMzQ4QjFEMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkJpdFNldFRlc3QubSAqLywKKwkJCSk7CisJCQlwYXRoID0gc2V0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBMzQ4QjFFMTFEMkJFNEYwMDBDNzJGQyAvKiBzdHJlYW0gKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBMzQ4QjFGMTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaCAqLywKKwkJCQkxQTM0OEIyMDExRDJCRTRGMDAwQzcyRkMgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gKi8sCisJCQkpOworCQkJcGF0aCA9IHN0cmVhbTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBMzQ4QjIxMTFEMkJFNEYwMDBDNzJGQyAvKiB0b2tlbiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUEzNDhCMjIxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0LmggKi8sCisJCQkJMUEzNDhCMjMxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0Lm0gKi8sCisJCQkpOworCQkJcGF0aCA9IHRva2VuOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUEzNDhCMjQxMUQyQkU0RjAwMEM3MkZDIC8qIHRyZWUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBMzQ4QjI1MTFEMkJFNEYwMDBDNzJGQyAvKiBBTlRMUkNvbW1vblRyZWVUZXN0LmggKi8sCisJCQkJMUEzNDhCMjYxMUQyQkU0RjAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QubSAqLywKKwkJCSk7CisJCQlwYXRoID0gdHJlZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNzdFRTE5MTJFNkEwM0IwMDdGMzIzQSAvKiBSZXdyaXRlUnVsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUEyQjA5NjMxMkU3OTdERTAwQTc1MTMzIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0gKi8sCisJCQkJMUEyQjA5NjYxMkU3OTdGNjAwQTc1MTMzIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8sCisJCQkpOworCQkJbmFtZSA9IFJld3JpdGVSdWxlOworCQkJcGF0aCA9IC4uLy4uOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUFDNUFDNkQxMkU3QkI3NjAwREYwQzU4IC8qIHRyZWVwYXJzZXIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBQzVBQ0M0MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nLnRva2VucyAqLywKKwkJCQkxQUM1QUNDNTEyRTdDMDNDMDBERjBDNTggLyogTGFuZ0R1bXBEZWNsLmggKi8sCisJCQkJMUFDNUFDQzYxMkU3QzAzQzAwREYwQzU4IC8qIExhbmdEdW1wRGVjbC5tICovLAorCQkJCTFBQzVBQ0M3MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nRHVtcERlY2wudG9rZW5zICovLAorCQkJCTFBQzVBQ0M4MTJFN0MwM0MwMERGMEM1OCAvKiBMYW5nTGV4ZXIuaCAqLywKKwkJCQkxQUM1QUNDOTEyRTdDMDNDMDBERjBDNTggLyogTGFuZ0xleGVyLm0gKi8sCisJCQkJMUFDNUFDQ0ExMkU3QzAzQzAwREYwQzU4IC8qIExhbmdQYXJzZXIuaCAqLywKKwkJCQkxQUM1QUNDQjEyRTdDMDNDMDBERjBDNTggLyogTGFuZ1BhcnNlci5tICovLAorCQkJCTFBQzVBQzcyMTJFN0JCQjYwMERGMEM1OCAvKiBmaWxlcyAqLywKKwkJCQkxQUM1QUM3MzEyRTdCQkI2MDBERjBDNTggLyogaW5wdXQgKi8sCisJCQkJMUFDNUFDNzQxMkU3QkJCNjAwREYwQzU4IC8qIExhbmcuZyAqLywKKwkJCQkxQUM1QUM3NTEyRTdCQkI2MDBERjBDNTggLyogTGFuZ0R1bXBEZWNsLmcgKi8sCisJCQkJMUFDNUFDNzcxMkU3QkJCNjAwREYwQzU4IC8qIG91dHB1dCAqLywKKwkJCQkxQUM1QUM3ODEyRTdCQkI2MDBERjBDNTggLyogUkVBRE1FLnR4dCAqLywKKwkJCQkxQUM1QUM4MTEyRTdCQzkxMDBERjBDNTggLyogbWFpbi5tICovLAorCQkJKTsKKwkJCW5hbWUgPSB0cmVlcGFyc2VyOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMzJDODhERkYwMzcxQzI0MjAwQzkxNzgzIC8qIE90aGVyIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBM0EwOUJEMTFFMjM1QkQwMEQ1RUUyNiAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTFDQ0NDNzExQjcyN0I1MDAyRTVGNTMgLyogQU5UTFJFcnJvci5oICovLAorCQkJCTMyREJDRjVFMDM3MEFERUUwMEM5MTc4MyAvKiBBTlRMUl9QcmVmaXgucGNoICovLAorCQkJCUY3MEFBN0E1MDlBQTJBNjkwMEMzRkQ1RSAvKiBBTlRMUi5oICovLAorCQkJCUY3Nzc0NzU1MEIyM0E3MDYwMEQxRjg5QiAvKiBBTlRMUkRlYnVnLmggKi8sCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBTb3VyY2VzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3MDBFODVEMEE1RkEyQzAwMDVEMDc1NyAvKiBjb21iaW5lZCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJRjczOEQzNUMwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkLnRva2VucyAqLywKKwkJCQlGNzM4RDM1RDBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRMZXhlci5oICovLAorCQkJCUY3MzhEMzVFMEIwN0MxMDUwMDE4MTNDNCAvKiBDb21iaW5lZExleGVyLm0gKi8sCisJCQkJRjczOEQzNUYwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkUGFyc2VyLmggKi8sCisJCQkJRjczOEQzNjAwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkUGFyc2VyLm0gKi8sCisJCQkJRjcwMEU4NUUwQTVGQTJERTAwNUQwNzU3IC8qIENvbWJpbmVkLmcgKi8sCisJCQkJRjcwMEU4NkEwQTVGQTM0RDAwNUQwNzU3IC8qIG1haW4ubSAqLywKKwkJCSk7CisJCQluYW1lID0gY29tYmluZWQ7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNzAwRUNDRTBBNUZFMTc2MDA1RDA3NTcgLyogTEwtc3RhciAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUFERTIxRjAxMkU1MDVENzAwRThBOTVDIC8qIFNpbXBsZUMuZyAqLywKKwkJCQlGNzM4RDI3RjBCMDdCOUI2MDAxODEzQzQgLyogU2ltcGxlQy50b2tlbnMgKi8sCisJCQkJRjczOEQyODAwQjA3QjlCNjAwMTgxM0M0IC8qIFNpbXBsZUNMZXhlci5oICovLAorCQkJCUY3MzhEMjgxMEIwN0I5QjYwMDE4MTNDNCAvKiBTaW1wbGVDTGV4ZXIubSAqLywKKwkJCQlGNzM4RDI4MjBCMDdCOUI2MDAxODEzQzQgLyogU2ltcGxlQ1BhcnNlci5oICovLAorCQkJCUY3MzhEMjUxMEIwN0I4NDIwMDE4MTNDNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi8sCisJCQkJRjcwMEVDQ0YwQTVGRTE3NjAwNUQwNzU3IC8qIGlucHV0ICovLAorCQkJCUY3MDBFQ0QwMEE1RkUxNzYwMDVEMDc1NyAvKiBvdXRwdXQgKi8sCisJCQkJMUE5OTRDRTQxMkE4NEYzRTAwMTg1M0ZGIC8qIFNpbXBsZUNfXy5nbCAqLywKKwkJCQlGNzAwRUNFNzBBNUZFMjVEMDA1RDA3NTcgLyogbWFpbi5tICovLAorCQkJKTsKKwkJCXBhdGggPSAiTEwtc3RhciI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNzAzN0VCQjBBMDVCMDZCMDA3MDQzNUQgLyogZXhhbXBsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3MDBFODVEMEE1RkEyQzAwMDVEMDc1NyAvKiBjb21iaW5lZCAqLywKKwkJCQlGNzlENTY1OTBBMEUyMzgxMDBFQTNDRUUgLyogZnV6enkgKi8sCisJCQkJRjdERDA1RTEwQTdCMTRCRTAwNkEwMDZDIC8qIGhvaXN0ZWRQcmVkaWNhdGVzICovLAorCQkJCUY3MDM3RUJDMEEwNUIwNkIwMDcwNDM1RCAvKiBsZXhlcnRlc3Qtc2ltcGxlICovLAorCQkJCUY3MDBFQ0NFMEE1RkUxNzYwMDVEMDc1NyAvKiBMTC1zdGFyICovLAorCQkJCTFBMEYzNDJDMTJFQTQxMUYwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLywKKwkJCQlGN0REMDczQjBBN0I2NjBBMDA2QTAwNkMgLyogc2NvcGVzICovLAorCQkJCUY3MkM1RTJEMEFCNzUyOUMwMDI4MjU3NCAvKiBzaW1wbGVjVHJlZVBhcnNlciAqLywKKwkJCQkxQUM1QUM2RDEyRTdCQjc2MDBERjBDNTggLyogdHJlZXBhcnNlciAqLywKKwkJCQlGN0NENDVGQjBDNjRCQTRCMDBGRjkzM0EgLyogdHJlZXJld3JpdGUgKi8sCisJCQkpOworCQkJcGF0aCA9IGV4YW1wbGVzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJRjcwMzdFQkMwQTA1QjA2QjAwNzA0MzVEIC8qIGxleGVydGVzdC1zaW1wbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3MDQ4RkY1MEIwN0QwNTQwMEQyRjMyNiAvKiBUZXN0LnRva2VucyAqLywKKwkJCQlGNzA0OEZGNjBCMDdEMDU0MDBEMkYzMjYgLyogVGVzdExleGVyLmggKi8sCisJCQkJRjcwNDhGRjcwQjA3RDA1NDAwRDJGMzI2IC8qIFRlc3RMZXhlci5tICovLAorCQkJCUY3MDM3RUJEMEEwNUIwNkIwMDcwNDM1RCAvKiBUZXN0TGV4ZXIuZyAqLywKKwkJCQlGN0U5ODM5NDBBMEQ2QTVGMDBGMTYwOTMgLyogbWFpbi5tICovLAorCQkJKTsKKwkJCXBhdGggPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNzBBQTdBQTA5QUEyQUFCMDBDM0ZENUUgLyogU3RyZWFtcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJRjcxMzI1ODUwQzRBMDVEQzAwQjk5RjJEIC8qIFRyZWVzICovLAorCQkJCUY3MEFBN0I1MDlBQTJCODgwMEMzRkQ1RSAvKiBBTlRMUkNoYXJTdHJlYW0uaCAqLywKKwkJCQkxQTE4RUY1NTExQjgwMjhEMDAwNjE4NkEgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggKi8sCisJCQkJMUExOEVGNTYxMUI4MDI4RDAwMDYxODZBIC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tICovLAorCQkJCUY3MDBFRDk0MEE1RkYyQTUwMDVEMDc1NyAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLmggKi8sCisJCQkJRjcwMEVEOTUwQTVGRjJBNTAwNUQwNzU3IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubSAqLywKKwkJCQlGNzBBQTdBRDA5QUEyQUMwMDBDM0ZENUUgLyogQU5UTFJJbnRTdHJlYW0uaCAqLywKKwkJCQkxQTFDQ0NBOTExQjcyNEIyMDAyRTVGNTMgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0uaCAqLywKKwkJCQkxQTFDQ0NBQTExQjcyNEIyMDAyRTVGNTMgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSAqLywKKwkJCQkxQUI0QTU4RjExQjlBMERBMDA3NkU5MUEgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggKi8sCisJCQkJMUFCNEE1OTAxMUI5QTBEQTAwNzZFOTFBIC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5tICovLAorCQkJCUY3MEFBN0M1MDlBQTMzOTkwMEMzRkQ1RSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5oICovLAorCQkJCUY3MEFBN0M2MDlBQTMzOTkwMEMzRkQ1RSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5tICovLAorCQkJCUY3MDBFRDdFMEE1RkYxN0MwMDVEMDc1NyAvKiBBTlRMUlRva2VuU291cmNlLmggKi8sCisJCQkJRjc3NzY2QUUwOURENTNFODAwNTE3MTgxIC8qIEFOVExSVG9rZW5TdHJlYW0uaCAqLywKKwkJCQkxQTFGRkM1OTExQ0QxMkE0MDBGQkI0NTIgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaCAqLywKKwkJCQkxQTFGRkM1QTExQ0QxMkE0MDBGQkI0NTIgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSAqLywKKwkJCQkxQTg2QkFDRDExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCAqLywKKwkJCQkxQTg2QkFDRTExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSAqLywKKwkJCSk7CisJCQluYW1lID0gU3RyZWFtczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3MTMyNTg1MEM0QTA1REMwMEI5OUYyRCAvKiBUcmVlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE5Q0JEMjQxMUM5OTc5NjAwREE4RkVGIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmggKi8sCisJCQkJMUE5Q0JEMjUxMUM5OTc5NjAwREE4RkVGIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi8sCisJCQkJMUE5Q0JEMjYxMUM5OTc5NjAwREE4RkVGIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaCAqLywKKwkJCQkxQTlDQkQyNzExQzk5Nzk2MDBEQThGRUYgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5tICovLAorCQkJCUY3MkM1QjgyMEFCNTJBRDMwMDI4MjU3NCAvKiBBTlRMUlRyZWVOb2RlU3RyZWFtLmggKi8sCisJCQkJMUE2NUI3RDYxMUI5NTMyQTAwRkQ4NzU0IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oICovLAorCQkJCTFBNjVCN0Q3MTFCOTUzMkEwMEZEODc1NCAvKiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubSAqLywKKwkJCQlGNzZBQTk4RTBDRUE1MTVBMDBBRjA0NEMgLyogQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oICovLAorCQkJCUY3NkFBOThGMENFQTUxNUEwMEFGMDQ0QyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi8sCisJCQkJRjcxMzI1ODYwQzRBMDYwOTAwQjk5RjJEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggKi8sCisJCQkJRjcxMzI1ODcwQzRBMDYwOTAwQjk5RjJEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0gKi8sCisJCQkJRjcwQjExQkIwQzRDMkI2NDAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggKi8sCisJCQkJRjcwQjExQkMwQzRDMkI2NDAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm0gKi8sCisJCQkJRjcwQjExQzEwQzRDMkI3OTAwQzNFQ0UwIC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oICovLAorCQkJCUY3MEIxMUMyMEM0QzJCNzkwMEMzRUNFMCAvKiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubSAqLywKKwkJCSk7CisJCQluYW1lID0gVHJlZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNzJDNUUyRDBBQjc1MjlDMDAyODI1NzQgLyogc2ltcGxlY1RyZWVQYXJzZXIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3NzE1RDJFMEFDOURFOUUwMEVEOTg0RCAvKiBTaW1wbGVDTGV4ZXIuaCAqLywKKwkJCQlGNzcxNUQyRjBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ0xleGVyLm0gKi8sCisJCQkJRjc3MTVEMzAwQUM5REU5RTAwRUQ5ODREIC8qIFNpbXBsZUNQYXJzZXIuaCAqLywKKwkJCQlGNzcxNUQzMTBBQzlERTlFMDBFRDk4NEQgLyogU2ltcGxlQ1BhcnNlci5tICovLAorCQkJCUY3NDFEMDY0MEIzODEyRDQwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLmggKi8sCisJCQkJRjc0MUQwNjUwQjM4MTJENDAwMjRERjNGIC8qIFNpbXBsZUNXYWxrZXIubSAqLywKKwkJCQlGNzJDNUUyRjBBQjc1MjlDMDAyODI1NzQgLyogaW5wdXQgKi8sCisJCQkJRjcyQzVFMzEwQUI3NTI5QzAwMjgyNTc0IC8qIG91dHB1dCAqLywKKwkJCQlGNzcxNUQxQzBBQzlEREQ4MDBFRDk4NEQgLyogU2ltcGxlQy50b2tlbnMgKi8sCisJCQkJRjc3MTVEMUQwQUM5REREODAwRUQ5ODREIC8qIFNpbXBsZUNXYWxrZXIudG9rZW5zICovLAorCQkJCUY3NzE1RDFBMEFDOURDRTQwMEVEOTg0RCAvKiBTaW1wbGVDLmcgKi8sCisJCQkJRjc3MTVEMUIwQUM5RENFNTAwRUQ5ODREIC8qIFNpbXBsZUNXYWxrZXIuZyAqLywKKwkJCQlGNzJDNUU1NjBBQjdFNDEwMDAyODI1NzQgLyogbWFpbi5tICovLAorCQkJKTsKKwkJCXBhdGggPSBzaW1wbGVjVHJlZVBhcnNlcjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3M0UyQjU5MEE5Q0Y4M0EwMDVENjI2NyAvKiBUcmVlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUExRDQ2NTkxMUJFNzNCMjAwMTU3NUYzIC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLmggKi8sCisJCQkJMUExRDQ2NUExMUJFNzNCMjAwMTU3NUYzIC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLm0gKi8sCisJCQkJMUE0RDVBRDQxMUI1NUE0NTAwMUM5NDgyIC8qIEFOVExSQmFzZVRyZWUuaCAqLywKKwkJCQkxQTRENUFENTExQjU1QTQ1MDAxQzk0ODIgLyogQU5UTFJCYXNlVHJlZS5tICovLAorCQkJCTFBOEFCRkM1MTFCQTlCOTYwMDM4REJCMCAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5oICovLAorCQkJCUY3MEFBN0NFMDlBQTM3OTMwMEMzRkQ1RSAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tICovLAorCQkJCUY3MkM1OEU4MEFCMzkxMUQwMDI4MjU3NCAvKiBBTlRMUkNvbW1vblRyZWUuaCAqLywKKwkJCQlGNzJDNThFOTBBQjM5MTFEMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlLm0gKi8sCisJCQkJRjcyQzU5QTUwQUI0RjIwQTAwMjgyNTc0IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCAqLywKKwkJCQlGNzJDNTlBNjBBQjRGMjBBMDAyODI1NzQgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvci5tICovLAorCQkJCUY3M0UyQjcyMEE5Q0ZFNkEwMDVENjI2NyAvKiBBTlRMUlRyZWUuaCAqLywKKwkJCQlGNzNFMkI3QTBBOUQwQUZDMDA1RDYyNjcgLyogQU5UTFJUcmVlQWRhcHRvci5oICovLAorCQkJCTFBMjcwQkY3MTFDMTQ1MTIwMERDQzhGMyAvKiBBTlRMUlRyZWVJdGVyYXRvci5oICovLAorCQkJCTFBMjcwQkY4MTFDMTQ1MTIwMERDQzhGMyAvKiBBTlRMUlRyZWVJdGVyYXRvci5tICovLAorCQkJCTFBQUMyMDJBMTFDQzYyMUEwMENGNTZEMSAvKiBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaCAqLywKKwkJCQkxQUFDMjAyQjExQ0M2MjFBMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLm0gKi8sCisJCQkJMUFBQzIwQTMxMUNDNzkwMzAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCAqLywKKwkJCQkxQUFDMjBBNDExQ0M3OTAzMDBDRjU2RDEgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5tICovLAorCQkJCTFBMUJDRTI4MTFDQjFBM0UwMDUxQTFFQyAvKiBBTlRMUlRyZWVSZXdyaXRlci5oICovLAorCQkJCTFBMUJDRTI5MTFDQjFBM0UwMDUxQTFFQyAvKiBBTlRMUlRyZWVSZXdyaXRlci5tICovLAorCQkJCTFBNEE4NTEwMTFDQkNFM0UwMEU0QkYxQiAvKiBBTlRMUlRyZWVWaXNpdG9yLmggKi8sCisJCQkJMUE0QTg1MTExMUNCQ0UzRTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3IubSAqLywKKwkJCQkxQTRBODUxNjExQ0JDRTU1MDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oICovLAorCQkJCTFBNEE4NTE3MTFDQkNFNTUwMEU0QkYxQiAvKiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLm0gKi8sCisJCQkJMUE0QTg1MUMxMUNCQ0YzNzAwRTRCRjFCIC8qIEFOVExSVHJlZVdpemFyZC5oICovLAorCQkJCTFBNEE4NTFEMTFDQkNGMzcwMEU0QkYxQiAvKiBBTlRMUlRyZWVXaXphcmQubSAqLywKKwkJCSk7CisJCQluYW1lID0gVHJlZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQlGNzQ5MkY4RDA5QzAxNzE5MDBCMjVFMzAgLyogVG9rZW5zICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGNzc3NjVDQTA5REM1ODMwMDA1MTcxODEgLyogQU5UTFJUb2tlbi5oICovLAorCQkJCUY3Nzc2NjAzMDlEQzVDRjQwMDUxNzE4MSAvKiBBTlRMUkNvbW1vblRva2VuLmggKi8sCisJCQkJRjc3NzY2MDQwOURDNUNGNDAwNTE3MTgxIC8qIEFOVExSQ29tbW9uVG9rZW4ubSAqLywKKwkJCSk7CisJCQluYW1lID0gVG9rZW5zOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJRjc3NzQ0MDcwQjIzNEEzQjAwRDFGODlCIC8qIERlYnVnZ2luZyBDYXRlZ29yaWVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGNzc3NDQwMzBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCAqLywKKwkJCQlGNzc3NDQwNDBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSAqLywKKwkJCSk7CisJCQluYW1lID0gIkRlYnVnZ2luZyBDYXRlZ29yaWVzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3OUQ1NjU5MEEwRTIzODEwMEVBM0NFRSAvKiBmdXp6eSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUFEQjY2RjAxMkU3NDM0MTAwN0MxNjYxIC8qIEZ1enp5TGV4ZXIuaCAqLywKKwkJCQlGNzJCOEQwOTBBRDAxRENCMDAxM0YxRTIgLyogRnV6enkudG9rZW5zICovLAorCQkJCUY3MkI4Q0ZBMEFEMDFEMzgwMDEzRjFFMiAvKiBGdXp6eS5nICovLAorCQkJCUY3MkI4RDBCMEFEMDFEQ0IwMDEzRjFFMiAvKiBGdXp6eUxleGVyLm0gKi8sCisJCQkJRjcwNkE1NUIwQTBFQzMwNzAwODk5OUFCIC8qIGlucHV0ICovLAorCQkJCUY3OUQ1NkMwMEEwRTI4NzUwMEVBM0NFRSAvKiBtYWluLm0gKi8sCisJCQkpOworCQkJcGF0aCA9IGZ1enp5OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJRjdBNDA5NEMwOTY1OTdDNDAwMkNDNzgxIC8qIEV4Y2VwdGlvbnMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3MzhEMTczMEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oICovLAorCQkJCUY3MzhEMTc0MEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5tICovLAorCQkJCTFBMjYzMjkzMTFDNTM1NzgwMDBEQ0RENCAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaCAqLywKKwkJCQkxQTI2MzI5NDExQzUzNTc4MDAwRENERDQgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm0gKi8sCisJCQkJRjcwMzdDRUUwQTA1ODJGQzAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmggKi8sCisJCQkJRjcwMzdDRUYwQTA1ODJGQzAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm0gKi8sCisJCQkJRjcwMzgwQkEwQTA3RkEwRDAwNzA0MzVEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oICovLAorCQkJCUY3MDM4MEJCMEEwN0ZBMEQwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24ubSAqLywKKwkJCQlGNzc3NjY4MDA5REM3MTlDMDA1MTcxODEgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCAqLywKKwkJCQlGNzc3NjY4MTA5REM3MTlDMDA1MTcxODEgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubSAqLywKKwkJCQlGNzJDNUQ2MDBBQjYzRTBCMDAyODI1NzQgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCAqLywKKwkJCQlGNzJDNUQ2MTBBQjYzRTBCMDAyODI1NzQgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24ubSAqLywKKwkJCQkxQTZDNDUxNDExQkY0RUUwMDAzOTc4OEEgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaCAqLywKKwkJCQkxQTZDNDUxNTExQkY0RUUwMDAzOTc4OEEgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubSAqLywKKwkJCQkxQThBQzAwQTExQkFFQzcxMDAzOERCQjAgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLmggKi8sCisJCQkJMUE4QUMwMEIxMUJBRUM3MTAwMzhEQkIwIC8qIEFOVExSUnVudGltZUV4Y2VwdGlvbi5tICovLAorCQkJCUY3OUQ1OTg5MEEwRTUxQUIwMEVBM0NFRSAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmggKi8sCisJCQkJRjc5RDU5OEEwQTBFNTFBQjAwRUEzQ0VFIC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubSAqLywKKwkJCQlGNzc3NjY5MTA5REM3MkQ2MDA1MTcxODEgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oICovLAorCQkJCUY3Nzc2NjkyMDlEQzcyRDYwMDUxNzE4MSAvKiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm0gKi8sCisJCQkJRjcwMEU2MTkwQTVGNjZFQzAwNUQwNzU3IC8qIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLmggKi8sCisJCQkJRjcwMEU2MUEwQTVGNjZFQzAwNUQwNzU3IC8qIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLm0gKi8sCisJCQkJRjczOEQxNzUwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSVHJlZUV4Y2VwdGlvbi5oICovLAorCQkJCUY3MzhEMTc2MEIwN0FFQUEwMDE4MTNDNCAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSAqLywKKwkJCQkxQTZDNDUyNjExQkY1MEE0MDAzOTc4OEEgLyogQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmggKi8sCisJCQkJMUE2QzQ1MjcxMUJGNTBBNDAwMzk3ODhBIC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tICovLAorCQkJKTsKKwkJCW5hbWUgPSBFeGNlcHRpb25zOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJRjdBNDA5NTEwOTY1OTdEMjAwMkNDNzgxIC8qIERGQSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJRjc3NTRFM0QwQTVDMEEwNTAwRDA4NzNBIC8qIEFOVExSREZBLmggKi8sCisJCQkJRjc3NTRFM0UwQTVDMEEwNTAwRDA4NzNBIC8qIEFOVExSREZBLm0gKi8sCisJCQkpOworCQkJbmFtZSA9IERGQTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3QTQwOTg4MDk2NTlCRTUwMDJDQzc4MSAvKiBSZWNvZ25pemVyICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGN0E0MDk4QjA5NjU5QkYzMDAyQ0M3ODEgLyogQU5UTFJCYXNlUmVjb2duaXplci5oICovLAorCQkJCUY3QTQwOThDMDk2NTlCRjMwMDJDQzc4MSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLm0gKi8sCisJCQkJRjdCMUU1QUMwQ0Q3Q0YxOTAwQ0UxMzZFIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmggKi8sCisJCQkJRjdCMUU1QUQwQ0Q3Q0YxOTAwQ0UxMzZFIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0gKi8sCisJCQkJRjdBNDA5OTEwOTY1OUJGQjAwMkNDNzgxIC8qIEFOVExSTGV4ZXIuaCAqLywKKwkJCQlGN0E0MDk5MjA5NjU5QkZCMDAyQ0M3ODEgLyogQU5UTFJMZXhlci5tICovLAorCQkJCUY3MDA5QUQ5MEExQkU0QUUwMDJFREQ1RCAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmggKi8sCisJCQkJRjcwMDlBREEwQTFCRTRBRTAwMkVERDVEIC8qIEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubSAqLywKKwkJCQlGNzAwRThGOTBBNUZBRDIxMDA1RDA3NTcgLyogQU5UTFJQYXJzZXIuaCAqLywKKwkJCQlGNzAwRThGQTBBNUZBRDIxMDA1RDA3NTcgLyogQU5UTFJQYXJzZXIubSAqLywKKwkJCQlGNzJDNUQ1NDBBQjYzQzFEMDAyODI1NzQgLyogQU5UTFJUcmVlUGFyc2VyLmggKi8sCisJCQkJRjcyQzVENTUwQUI2M0MxRDAwMjgyNTc0IC8qIEFOVExSVHJlZVBhcnNlci5tICovLAorCQkJCTFBODZCOTE5MTFFQjlGNjMwMEM2N0EwMyAvKiBBTlRMUlBhcnNlVHJlZS5oICovLAorCQkJCTFBODZCOTFBMTFFQjlGNjMwMEM2N0EwMyAvKiBBTlRMUlBhcnNlVHJlZS5tICovLAorCQkJKTsKKwkJCW5hbWUgPSBSZWNvZ25pemVyOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJRjdDRDQ1RkIwQzY0QkE0QjAwRkY5MzNBIC8qIHRyZWVyZXdyaXRlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGN0NENDYzNDBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGUudG9rZW5zICovLAorCQkJCUY3Q0Q0NjM1MEM2NEJCNzMwMEZGOTMzQSAvKiBUcmVlUmV3cml0ZUxleGVyLmggKi8sCisJCQkJRjdDRDQ2MzYwQzY0QkI3MzAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlTGV4ZXIubSAqLywKKwkJCQlGN0NENDYzNzBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGVQYXJzZXIuaCAqLywKKwkJCQlGN0NENDYzODBDNjRCQjczMDBGRjkzM0EgLyogVHJlZVJld3JpdGVQYXJzZXIubSAqLywKKwkJCQlGN0NENDVGQzBDNjRCQTRCMDBGRjkzM0EgLyogbWFpbi5tICovLAorCQkJCUY3Q0Q0NUZEMEM2NEJBNEIwMEZGOTMzQSAvKiBUcmVlUmV3cml0ZS5nICovLAorCQkJKTsKKwkJCXBhdGggPSB0cmVlcmV3cml0ZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3REQwNUUxMEE3QjE0QkUwMDZBMDA2QyAvKiBob2lzdGVkUHJlZGljYXRlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJRjczOEQyMjMwQjA3QjNCQzAwMTgxM0M0IC8qIFRQYXJzZXIuaCAqLywKKwkJCQlGNzM4RDIyNDBCMDdCM0JDMDAxODEzQzQgLyogVFBhcnNlci5tICovLAorCQkJCUY3REQwNkU3MEE3QjE3MDAwMDZBMDA2QyAvKiBUTGV4ZXIuaCAqLywKKwkJCQlGN0REMDZFODBBN0IxNzAwMDA2QTAwNkMgLyogVExleGVyLm0gKi8sCisJCQkJRjdERDA1RTIwQTdCMTRCRTAwNkEwMDZDIC8qIGlucHV0ICovLAorCQkJCUY3REQwNUUzMEE3QjE0QkUwMDZBMDA2QyAvKiBvdXRwdXQgKi8sCisJCQkJRjdERDA1RTQwQTdCMTRCRTAwNkEwMDZDIC8qIFQuZyAqLywKKwkJCQlGN0REMDVFNzBBN0IxNTcyMDA2QTAwNkMgLyogbWFpbi5tICovLAorCQkJKTsKKwkJCXBhdGggPSBob2lzdGVkUHJlZGljYXRlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3REQwNzNCMEE3QjY2MEEwMDZBMDA2QyAvKiBzY29wZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3MzhEMUZEMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZS50b2tlbnMgKi8sCisJCQkJRjczOEQxRkUwQjA3QjFDRTAwMTgxM0M0IC8qIFN5bWJvbFRhYmxlTGV4ZXIuaCAqLywKKwkJCQlGNzM4RDFGRjBCMDdCMUNFMDAxODEzQzQgLyogU3ltYm9sVGFibGVMZXhlci5tICovLAorCQkJCUY3MzhEMjAwMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5oICovLAorCQkJCUY3MzhEMjAxMEIwN0IxQ0UwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tICovLAorCQkJCUY3REQwNzNDMEE3QjY2MEEwMDZBMDA2QyAvKiBpbnB1dCAqLywKKwkJCQlGN0REMDczRDBBN0I2NjBBMDA2QTAwNkMgLyogb3V0cHV0ICovLAorCQkJCUY3REQwNzNFMEE3QjY2MEEwMDZBMDA2QyAvKiBTeW1ib2xUYWJsZS5nICovLAorCQkJCUY3REQwNzgwMEE3QjY3QTcwMDZBMDA2QyAvKiBtYWluLm0gKi8sCisJCQkpOworCQkJcGF0aCA9IHNjb3BlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3RTI2MTBGMEIxRTQzRTYwMDEzRjY0MCAvKiBEZWJ1Z2dpbmcgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUY3Nzc0NDA3MEIyMzRBM0IwMEQxRjg5QiAvKiBEZWJ1Z2dpbmcgQ2F0ZWdvcmllcyAqLywKKwkJCQlGN0NFQ0Q3RDBCMUU1QzM3MDA1NENDM0IgLyogQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCAqLywKKwkJCQlGN0UyNjEzNzBCMUU0NTU4MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaCAqLywKKwkJCQlGN0UyNjEzODBCMUU0NTU4MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkubSAqLywKKwkJCQlGN0UyNjExNDBCMUU0NDMyMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1BhcnNlci5oICovLAorCQkJCUY3RTI2MTE1MEIxRTQ0MzIwMDEzRjY0MCAvKiBBTlRMUkRlYnVnUGFyc2VyLm0gKi8sCisJCQkJRjdFMjYxMUUwQjFFNDRFODAwMTNGNjQwIC8qIEFOVExSRGVidWdUb2tlblN0cmVhbS5oICovLAorCQkJCUY3RTI2MTFGMEIxRTQ0RTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0ubSAqLywKKwkJCQlGN0UyNjExODBCMUU0NDNDMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCAqLywKKwkJCQlGN0UyNjExOTBCMUU0NDNDMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIubSAqLywKKwkJCQlGN0UyNjEyMjBCMUU0NEZBMDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmggKi8sCisJCQkJRjdFMjYxMjMwQjFFNDRGQTAwMTNGNjQwIC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tICovLAorCQkJCUY3RTI2MTI2MEIxRTQ1MDcwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCAqLywKKwkJCQlGN0UyNjEyNzBCMUU0NTA3MDAxM0Y2NDAgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0gKi8sCisJCQkpOworCQkJbmFtZSA9IERlYnVnZ2luZzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCUY3RjIxOEVCMDk3QUZCMEMwMDA0NzJFOSAvKiBNaXNjICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTEwMEFCOTExRTYwNEZFMDA2QUJGOTQgLyogQU5UTFJIYXNoUnVsZS5oICovLAorCQkJCTFBMTAwQUJBMTFFNjA0RkUwMDZBQkY5NCAvKiBBTlRMUkhhc2hSdWxlLm0gKi8sCisJCQkJMUEyRDIxODQxMUU1MDJERTAwREZFMzI4IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQuaCAqLywKKwkJCQkxQTJEMjE4NTExRTUwMkRFMDBERkUzMjggLyogQU5UTFJOb2RlTWFwRWxlbWVudC5tICovLAorCQkJCTFBQjVGNTFDMTFFM0JFMkUwMEUwNjVCMCAvKiBBTlRMUlB0ckJ1ZmZlci5oICovLAorCQkJCTFBQjVGNTFEMTFFM0JFMkUwMEUwNjVCMCAvKiBBTlRMUlB0ckJ1ZmZlci5tICovLAorCQkJCTFBM0EwOEU4MTFFMjEzRTEwMEQ1RUUyNiAvKiBBTlRMUlN5bWJvbFN0YWNrLmggKi8sCisJCQkJMUEzQTA4RTkxMUUyMTNFMTAwRDVFRTI2IC8qIEFOVExSU3ltYm9sU3RhY2subSAqLywKKwkJCQkxQTNBMDhFNDExRTIxM0M1MDBENUVFMjYgLyogQU5UTFJCYXNlU3RhY2suaCAqLywKKwkJCQkxQTNBMDhFNTExRTIxM0M1MDBENUVFMjYgLyogQU5UTFJCYXNlU3RhY2subSAqLywKKwkJCQkxQTQ1NjU4NzExQzkyNzBEMDA4MkY0MjEgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5oICovLAorCQkJCTFBNDU2NTg4MTFDOTI3MEQwMDgyRjQyMSAvKiBBTlRMUkJhc2VNYXBFbGVtZW50Lm0gKi8sCisJCQkJRjdGMjE4RUUwOTdBRkIxQTAwMDQ3MkU5IC8qIEFOVExSQml0U2V0LmggKi8sCisJCQkJRjdGMjE4RUYwOTdBRkIxQTAwMDQ3MkU5IC8qIEFOVExSQml0U2V0Lm0gKi8sCisJCQkJMUExRDQ2N0ExMUJFOEU1QTAwMTU3NUYzIC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLmggKi8sCisJCQkJMUExRDQ2N0IxMUJFOEU1QTAwMTU3NUYzIC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLm0gKi8sCisJCQkJMUExQ0NDOTAxMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSRmFzdFF1ZXVlLmggKi8sCisJCQkJMUExQ0NDOTExMUI2RkQzOTAwMkU1RjUzIC8qIEFOVExSRmFzdFF1ZXVlLm0gKi8sCisJCQkJMUExNzAyRkMxMUMwNUQ0ODAwRjY5NzhBIC8qIEFOVExSSGFzaE1hcC5oICovLAorCQkJCTFBMTcwMkZEMTFDMDVENDgwMEY2OTc4QSAvKiBBTlRMUkhhc2hNYXAubSAqLywKKwkJCQkxQTFDQ0M5MjExQjZGRDM5MDAyRTVGNTMgLyogQU5UTFJJbnRBcnJheS5oICovLAorCQkJCTFBMUNDQzkzMTFCNkZEMzkwMDJFNUY1MyAvKiBBTlRMUkludEFycmF5Lm0gKi8sCisJCQkJMUExNkIxM0ExMUM2NjQ5MjAwMjg2MEM3IC8qIEFOVExSTGlua0Jhc2UuaCAqLywKKwkJCQkxQTE2QjEzQjExQzY2NDkyMDAyODYwQzcgLyogQU5UTFJMaW5rQmFzZS5tICovLAorCQkJCTFBMUQ0NjZFMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQuaCAqLywKKwkJCQkxQTFENDY2RjExQkU3NUMwMDAxNTc1RjMgLyogQU5UTFJNYXBFbGVtZW50Lm0gKi8sCisJCQkJMUE1RUE1MDkxMUNGRTdDRTAwRTg5MzJGIC8qIEFOVExSTWFwLmggKi8sCisJCQkJMUE1RUE1MEExMUNGRTdDRTAwRTg5MzJGIC8qIEFOVExSTWFwLm0gKi8sCisJCQkJMUE0NTY1NzUxMUM5MjJCRTAwODJGNDIxIC8qIEFOVExSUnVsZU1lbW8uaCAqLywKKwkJCQkxQTQ1NjU3NjExQzkyMkJFMDA4MkY0MjEgLyogQU5UTFJSdWxlTWVtby5tICovLAorCQkJCTFBRThBOTZBMTFEOTIyN0EwMEQzNkZENiAvKiBBTlRMUlJ1bGVTdGFjay5oICovLAorCQkJCTFBRThBOTZCMTFEOTIyN0EwMEQzNkZENiAvKiBBTlRMUlJ1bGVTdGFjay5tICovLAorCQkJCTFBMkQyMTczMTFFNEY1N0MwMERGRTMyOCAvKiBBTlRMUlVuaXF1ZUlETWFwLmggKi8sCisJCQkJMUEyRDIxNzQxMUU0RjU3QzAwREZFMzI4IC8qIEFOVExSVW5pcXVlSURNYXAubSAqLywKKwkJCSk7CisJCQluYW1lID0gTWlzYzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCThEQzJFRjUwMDQ4NkE2OTQwMDk4QjIxNiAvKiBIZWFkZXJzICovID0geworCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjcwQUE3QTYwOUFBMkE2OTAwQzNGRDVFIC8qIEFOVExSLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTQ1NjU4OTExQzkyNzBEMDA4MkY0MjEgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjc0OTJGNUQwOUMwMTZBMjAwQjI1RTMwIC8qIEFOVExSQmFzZVJlY29nbml6ZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNEQ1QUQ2MTFCNTVBNDUwMDFDOTQ4MiAvKiBBTlRMUkJhc2VUcmVlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTFENDY1QjExQkU3M0IyMDAxNTc1RjMgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMTAwNTA3MTFCODc5NkUwMDIyQjQzNCAvKiBBTlRMUkJpdFNldC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUExMDA1MDYxMUI4Nzk2RDAwMjJCNDM0IC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2NUI3RDgxMUI5NTMyQTAwRkQ4NzU0IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2Nzg4NTMxMUI4N0FDNDAwQTExRUVDIC8qIEFOVExSQ2hhclN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE4QUJGQzYxMUJBOUI5NjAwMzhEQkIwIC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTFENDY3QzExQkU4RTVBMDAxNTc1RjMgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3Nzc2NjA1MDlEQzVDRjQwMDUxNzE4MSAvKiBBTlRMUkNvbW1vblRva2VuLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzAwRUQ5NjBBNUZGMkE1MDA1RDA3NTcgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjcyQzU4RUEwQUIzOTExRDAwMjgyNTc0IC8qIEFOVExSQ29tbW9uVHJlZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjc2QUE5OTAwQ0VBNTE1QTAwQUYwNDRDIC8qIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3MkM1OUE3MEFCNEYyMEEwMDI4MjU3NCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTEyQzk2MDExQjg5RjZCMDA4QzlCRUQgLyogQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3RTI2MTM5MEIxRTQ1NTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnRXZlbnRQcm94eS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjdFMjYxMTYwQjFFNDQzMjAwMTNGNjQwIC8qIEFOVExSRGVidWdQYXJzZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3RTI2MTIwMEIxRTQ0RTgwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3RTI2MTI0MEIxRTQ0RkEwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3RTI2MTI4MEIxRTQ1MDcwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3RTI2MTFBMEIxRTQ0M0QwMDEzRjY0MCAvKiBBTlRMUkRlYnVnVHJlZVBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjc3NzQ3NTYwQjIzQTcwNjAwRDFGODlCIC8qIEFOVExSRGVidWcuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3NzU0RTNGMEE1QzBBMDUwMEQwODczQSAvKiBBTlRMUkRGQS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjcwMEU2MUIwQTVGNjZFQzAwNUQwNzU3IC8qIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTFDQ0NDODExQjcyN0I1MDAyRTVGNTMgLyogQU5UTFJFcnJvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUExMDA1MDkxMUI4NzlBODAwMjJCNDM0IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTEwMDUwODExQjg3OUE0MDAyMkI0MzQgLyogQU5UTFJGYXN0UXVldWUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMTcwMkZFMTFDMDVENDgwMEY2OTc4QSAvKiBBTlRMUkhhc2hNYXAuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMTAwNTBCMTFCODc5QjgwMDIyQjQzNCAvKiBBTlRMUkludEFycmF5LmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzBBQTdBRjA5QUEyQUMwMDBDM0ZENUUgLyogQU5UTFJJbnRTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3Nzc2NzhFMDlERDYxODAwMDUxNzE4MSAvKiBBTlRMUkxleGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzAwOUFEQjBBMUJFNEFFMDAyRURENUQgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUExNkIxM0MxMUM2NjQ5MjAwMjg2MEM3IC8qIEFOVExSTGlua0Jhc2UuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMUNDQ0FCMTFCNzI0QjIwMDJFNUY1MyAvKiBBTlRMUkxvb2thaGVhZFN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUExRDQ2NzAxMUJFNzVDMDAwMTU3NUYzIC8qIEFOVExSTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE1RUE1MEIxMUNGRTdDRTAwRTg5MzJGIC8qIEFOVExSTWFwLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTI2MzI5NTExQzUzNTc4MDAwRENERDQgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzAzN0NGMDBBMDU4MkZDMDA3MDQzNUQgLyogQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3MDM4MEJDMEEwN0ZBMEQwMDcwNDM1RCAvKiBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3Nzc2NjgyMDlEQzcxOUMwMDUxNzE4MSAvKiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjcyQzVENjIwQUI2M0UwQjAwMjgyNTc0IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTc1QkY1OTExRDZCM0ZEMDA5NkM2RjUgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3OUQ1OThCMEEwRTUxQUIwMEVBM0NFRSAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzAwRThGQjBBNUZBRDIxMDA1RDA3NTcgLyogQU5UTFJQYXJzZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3MkM1RUNFMEFCN0U1QTUwMDI4MjU3NCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjc3NzY2OTMwOURDNzJENjAwNTE3MTgxIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3QjFFNUIwMENEN0NGMTkwMENFMTM2RSAvKiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjcxMzI1ODgwQzRBMDYwOTAwQjk5RjJEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzBCMTFCRDBDNEMyQjY0MDBDM0VDRTAgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3MEIxMUMzMEM0QzJCNzkwMEMzRUNFMCAvKiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNDU2NTc3MTFDOTIyQkUwMDgyRjQyMSAvKiBBTlRMUlJ1bGVNZW1vLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTFCQ0RCQjExQ0IwMUU2MDA1MUExRUMgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBOEFDMDBDMTFCQUVDNzEwMDM4REJCMCAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBQjRBNTkxMTFCOUEwREEwMDc2RTkxQSAvKiBBTlRMUlN0cmVhbUVudW1lcmF0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3MEFBN0M3MDlBQTMzOTkwMEMzRkQ1RSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjc3NzY1Q0MwOURDNTgzMDAwNTE3MTgxIC8qIEFOVExSVG9rZW4uaCBpbiBIZWFkZXJzICovLAorCQkJCUY3Nzc2NkFGMDlERDUzRTgwMDUxNzE4MSAvKiBBTlRMUlRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzc3NDQwNTBCMjM0QTM0MDBEMUY4OUIgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUY3MDBFRDdGMEE1RkYxN0MwMDVEMDc1NyAvKiBBTlRMUlRva2VuU291cmNlLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzNFMkI3NDBBOUNGRTZBMDA1RDYyNjcgLyogQU5UTFJUcmVlLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzNFMkI3QzBBOUQwQUZDMDA1RDYyNjcgLyogQU5UTFJUcmVlQWRhcHRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjczOEQxNzkwQjA3QUVBQTAwMTgxM0M0IC8qIEFOVExSVHJlZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEyNzBCRjkxMUMxNDUxMjAwRENDOEYzIC8qIEFOVExSVHJlZUl0ZXJhdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQlGNzJDNUI4NDBBQjUyQUQzMDAyODI1NzQgLyogQU5UTFJUcmVlTm9kZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRjcyQzVENTYwQUI2M0MxRDAwMjgyNTc0IC8qIEFOVExSVHJlZVBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUFBQzIwMkMxMUNDNjIxQTAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUFBQzIwQTUxMUNDNzkwMzAwQ0Y1NkQxIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMUJDRENGMTFDQjBCM0QwMDUxQTFFQyAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMUJDRTJBMTFDQjFBM0UwMDUxQTFFQyAvKiBBTlRMUlRyZWVSZXdyaXRlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE0QTg1MTIxMUNCQ0UzRTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNEE4NTE4MTFDQkNFNTUwMEU0QkYxQiAvKiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTRBODUxRTExQ0JDRjM3MDBFNEJGMUIgLyogQU5UTFJUcmVlV2l6YXJkLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZDNDUyODExQkY1MEE0MDAzOTc4OEEgLyogQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQUU4QTk2QzExRDkyMjdBMDBEMzZGRDYgLyogQU5UTFJSdWxlU3RhY2suaCBpbiBIZWFkZXJzICovLAorCQkJCTFBM0EwOEU2MTFFMjEzQzUwMEQ1RUUyNiAvKiBBTlRMUkJhc2VTdGFjay5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEzQTA4RUExMUUyMTNFMTAwRDVFRTI2IC8qIEFOVExSU3ltYm9sU3RhY2suaCBpbiBIZWFkZXJzICovLAorCQkJCTFBM0EwOUJFMTFFMjM1QkQwMEQ1RUUyNiAvKiBhbnRscjMuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBQjVGNDc3MTFFMzg2OUQwMEUwNjVCMCAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50LmggaW4gSGVhZGVycyAqLywKKwkJCQkxQUI1RjUxRTExRTNCRTJFMDBFMDY1QjAgLyogQU5UTFJQdHJCdWZmZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMkQyMTc1MTFFNEY1N0MwMERGRTMyOCAvKiBBTlRMUlVuaXF1ZUlETWFwLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTJEMjE4NjExRTUwMkRFMDBERkUzMjggLyogQU5UTFJOb2RlTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUExMDBBQkIxMUU2MDRGRTAwNkFCRjk0IC8qIEFOVExSSGFzaFJ1bGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBRUVDRTE1MTFFN0VCM0MwMDU1NEFBRiAvKiBBTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE4NkI5MUIxMUVCOUY2MzAwQzY3QTAzIC8qIEFOVExSUGFyc2VUcmVlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTg2QkFDRjExRUMxQ0QwMDBDNjdBMDMgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBREI2NkYxMTJFNzQzNDEwMDdDMTY2MSAvKiBGdXp6eUxleGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTBGMzQ4MjEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTBGMzQ4NDEyRUE0NDQ1MDA0OTZCQjggLyogUG9seVBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwRjM0ODYxMkVBNDQ0NTAwNDk2QkI4IC8qIFNpbXBsaWZpZXIuaCBpbiBIZWFkZXJzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYTGVnYWN5VGFyZ2V0IHNlY3Rpb24gKi8KKwkJMUEwRjM0M0IxMkVBNDI1NzAwNDk2QkI4IC8qIFJlZ2VuZXJhdGUgcG9seWRpZmYgKi8gPSB7CisJCQlpc2EgPSBQQlhMZWdhY3lUYXJnZXQ7CisJCQlidWlsZEFyZ3VtZW50c1N0cmluZyA9ICItamFyIC9MaWJyYXJ5L0phdmEvRXh0ZW5zaW9ucy9hbnRsci0zLjMuMS5qYXIgUG9seS5nIFBvbHlEaWZmZXJlbnRpYXRvci5nIFNpbXBsaWZpZXIuZyBQb2x5UHJpbnRlci5nIjsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTBGMzQzQzEyRUE0MjU3MDA0OTZCQjggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgcG9seWRpZmYiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJYnVpbGRUb29sUGF0aCA9IC91c3IvYmluL2phdmE7CisJCQlidWlsZFdvcmtpbmdEaXJlY3RvcnkgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvcG9seWRpZmYiOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiUmVnZW5lcmF0ZSBwb2x5ZGlmZiI7CisJCQlwYXNzQnVpbGRTZXR0aW5nc0luRW52aXJvbm1lbnQgPSAxOworCQkJcHJvZHVjdE5hbWUgPSBVbnRpdGxlZDsKKwkJfTsKKwkJMUFDNUFDOTMxMkU3QkUwNDAwREYwQzU4IC8qIFJlZ2VuZXJhdGUgdHJlZXBhcnNlciAqLyA9IHsKKwkJCWlzYSA9IFBCWExlZ2FjeVRhcmdldDsKKwkJCWJ1aWxkQXJndW1lbnRzU3RyaW5nID0gIi1qYXIgL0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciBMYW5nLmcgTGFuZ0R1bXBEZWNsLmciOworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBQzVBQzk0MTJFN0JFMDQwMERGMEM1OCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSB0cmVlcGFyc2VyIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJKTsKKwkJCWJ1aWxkVG9vbFBhdGggPSAvdXNyL2Jpbi9qYXZhOworCQkJYnVpbGRXb3JraW5nRGlyZWN0b3J5ID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3RyZWVwYXJzZXIiOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiUmVnZW5lcmF0ZSB0cmVlcGFyc2VyIjsKKwkJCXBhc3NCdWlsZFNldHRpbmdzSW5FbnZpcm9ubWVudCA9IDE7CisJCQlwcm9kdWN0TmFtZSA9IFVudGl0bGVkOworCQl9OworCQlGNzYyODc0NTBCNzE1MUUzMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBmdXp6eSAqLyA9IHsKKwkJCWlzYSA9IFBCWExlZ2FjeVRhcmdldDsKKwkJCWJ1aWxkQXJndW1lbnRzU3RyaW5nID0gIi1qYXIgL0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciBGdXp6eS5nIjsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBGNzYyODc0NjBCNzE1MjAxMDA2QUE3RUYgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgZnV6enkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJYnVpbGRUb29sUGF0aCA9IC91c3IvYmluL2phdmE7CisJCQlidWlsZFdvcmtpbmdEaXJlY3RvcnkgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvZnV6enkiOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiUmVnZW5lcmF0ZSBmdXp6eSI7CisJCQlwYXNzQnVpbGRTZXR0aW5nc0luRW52aXJvbm1lbnQgPSAxOworCQkJcHJvZHVjdE5hbWUgPSBVbnRpdGxlZDsKKwkJfTsKKwkJRjc2Mjg3NzgwQjcxNTU3RTAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgbGV4ZXJ0ZXN0LXNpbXBsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWExlZ2FjeVRhcmdldDsKKwkJCWJ1aWxkQXJndW1lbnRzU3RyaW5nID0gIi1qYXIgL0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciBUZXN0TGV4ZXIuZyI7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gRjc2Mjg3NzkwQjcxNTU3RTAwNkFBN0VGIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTGVnYWN5VGFyZ2V0ICJSZWdlbmVyYXRlIGxleGVydGVzdC1zaW1wbGUiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJYnVpbGRUb29sUGF0aCA9IC91c3IvYmluL2phdmE7CisJCQlidWlsZFdvcmtpbmdEaXJlY3RvcnkgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJSZWdlbmVyYXRlIGxleGVydGVzdC1zaW1wbGUiOworCQkJcGFzc0J1aWxkU2V0dGluZ3NJbkVudmlyb25tZW50ID0gMTsKKwkJCXByb2R1Y3ROYW1lID0gVW50aXRsZWQ7CisJCX07CisJCUY3NjI4NzdFMEI3MTU1OUMwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIGNvbWJpbmVkICovID0geworCQkJaXNhID0gUEJYTGVnYWN5VGFyZ2V0OworCQkJYnVpbGRBcmd1bWVudHNTdHJpbmcgPSAiLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyIENvbWJpbmVkLmciOworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3NjI4NzdGMEI3MTU1OUMwMDZBQTdFRiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSBjb21iaW5lZCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCSk7CisJCQlidWlsZFRvb2xQYXRoID0gL3Vzci9iaW4vamF2YTsKKwkJCWJ1aWxkV29ya2luZ0RpcmVjdG9yeSA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9jb21iaW5lZCI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJSZWdlbmVyYXRlIGNvbWJpbmVkIjsKKwkJCXBhc3NCdWlsZFNldHRpbmdzSW5FbnZpcm9ubWVudCA9IDE7CisJCQlwcm9kdWN0TmFtZSA9IFVudGl0bGVkOworCQl9OworCQlGNzYyODc4MjBCNzE1NTlGMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBMTC1zdGFyICovID0geworCQkJaXNhID0gUEJYTGVnYWN5VGFyZ2V0OworCQkJYnVpbGRBcmd1bWVudHNTdHJpbmcgPSAiLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICBTaW1wbGVDLmciOworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3NjI4NzgzMEI3MTU1OUYwMDZBQTdFRiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSBMTC1zdGFyIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJKTsKKwkJCWJ1aWxkVG9vbFBhdGggPSAvdXNyL2Jpbi9qYXZhOworCQkJYnVpbGRXb3JraW5nRGlyZWN0b3J5ID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL0xMLXN0YXIiOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiUmVnZW5lcmF0ZSBMTC1zdGFyIjsKKwkJCXBhc3NCdWlsZFNldHRpbmdzSW5FbnZpcm9ubWVudCA9IDE7CisJCQlwcm9kdWN0TmFtZSA9IFVudGl0bGVkOworCQl9OworCQlGNzYyODc4NjBCNzE1NUEyMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBob2lzdGVkUHJlZGljYXRlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWExlZ2FjeVRhcmdldDsKKwkJCWJ1aWxkQXJndW1lbnRzU3RyaW5nID0gIi1qYXIgL0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciAgVC5nIjsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBGNzYyODc4NzBCNzE1NUEyMDA2QUE3RUYgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgaG9pc3RlZFByZWRpY2F0ZXMiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkpOworCQkJYnVpbGRUb29sUGF0aCA9IC91c3IvYmluL2phdmE7CisJCQlidWlsZFdvcmtpbmdEaXJlY3RvcnkgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMiOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiUmVnZW5lcmF0ZSBob2lzdGVkUHJlZGljYXRlcyI7CisJCQlwYXNzQnVpbGRTZXR0aW5nc0luRW52aXJvbm1lbnQgPSAxOworCQkJcHJvZHVjdE5hbWUgPSBVbnRpdGxlZDsKKwkJfTsKKwkJRjc2Mjg3OEEwQjcxNTVBQjAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgc2NvcGVzICovID0geworCQkJaXNhID0gUEJYTGVnYWN5VGFyZ2V0OworCQkJYnVpbGRBcmd1bWVudHNTdHJpbmcgPSAiLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICBTeW1ib2xUYWJsZS5nIjsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBGNzYyODc4QjBCNzE1NUFCMDA2QUE3RUYgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgc2NvcGVzIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJKTsKKwkJCWJ1aWxkVG9vbFBhdGggPSAvdXNyL2Jpbi9qYXZhOworCQkJYnVpbGRXb3JraW5nRGlyZWN0b3J5ID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3Njb3BlcyI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJSZWdlbmVyYXRlIHNjb3BlcyI7CisJCQlwYXNzQnVpbGRTZXR0aW5nc0luRW52aXJvbm1lbnQgPSAxOworCQkJcHJvZHVjdE5hbWUgPSBVbnRpdGxlZDsKKwkJfTsKKwkJRjc2Mjg3OEUwQjcxNTVBRjAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgc2ltcGxlY3RyZWUgKi8gPSB7CisJCQlpc2EgPSBQQlhMZWdhY3lUYXJnZXQ7CisJCQlidWlsZEFyZ3VtZW50c1N0cmluZyA9ICItamFyIC9MaWJyYXJ5L0phdmEvRXh0ZW5zaW9ucy9hbnRsci0zLjMuMS5qYXIgU2ltcGxlQy5nIFNpbXBsZUNXYWxrZXIuZyI7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gRjc2Mjg3OEYwQjcxNTVBRjAwNkFBN0VGIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTGVnYWN5VGFyZ2V0ICJSZWdlbmVyYXRlIHNpbXBsZWN0cmVlIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJKTsKKwkJCWJ1aWxkVG9vbFBhdGggPSAvdXNyL2Jpbi9qYXZhOworCQkJYnVpbGRXb3JraW5nRGlyZWN0b3J5ID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyIjsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gIlJlZ2VuZXJhdGUgc2ltcGxlY3RyZWUiOworCQkJcGFzc0J1aWxkU2V0dGluZ3NJbkVudmlyb25tZW50ID0gMTsKKwkJCXByb2R1Y3ROYW1lID0gVW50aXRsZWQ7CisJCX07CisJCUY3Q0Q0NzYxMEM2NEQyMzgwMEZGOTMzQSAvKiBSZWdlbmVyYXRlIHRyZWVyZXdyaXRlICovID0geworCQkJaXNhID0gUEJYTGVnYWN5VGFyZ2V0OworCQkJYnVpbGRBcmd1bWVudHNTdHJpbmcgPSAiLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyIFRyZWVSZXdyaXRlLmciOworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3Q0Q0NzYyMEM2NEQyMzgwMEZGOTMzQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSB0cmVlcmV3cml0ZSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCSk7CisJCQlidWlsZFRvb2xQYXRoID0gL3Vzci9iaW4vamF2YTsKKwkJCWJ1aWxkV29ya2luZ0RpcmVjdG9yeSA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy90cmVlcmV3cml0ZSI7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9ICJSZWdlbmVyYXRlIHRyZWVyZXdyaXRlIjsKKwkJCXBhc3NCdWlsZFNldHRpbmdzSW5FbnZpcm9ubWVudCA9IDE7CisJCQlwcm9kdWN0TmFtZSA9IFVudGl0bGVkOworCQl9OworLyogRW5kIFBCWExlZ2FjeVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCTFBMEYzNDU3MTJFQTQyRDgwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTBGMzQ2MjEyRUE0MkQ4MDA0OTZCQjggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInBvbHlkaWZmIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBMEYzNDU4MTJFQTQyRDgwMDQ5NkJCOCAvKiBTb3VyY2VzICovLAorCQkJCTFBMEYzNDVEMTJFQTQyRDgwMDQ5NkJCOCAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkJMUEwRjM0NjExMkVBNDJEODAwNDk2QkI4IC8qIFBCWEJ1aWxkUnVsZSAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IHBvbHlkaWZmOworCQkJcHJvZHVjdE5hbWUgPSB0cmVlcmV3cml0ZTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTBGMzQ2NjEyRUE0MkQ4MDA0OTZCQjggLyogcG9seWRpZmYgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQkxQTEyMTBGQTExRDNBNUQ5MDBGMjdCMzggLyogQU5UTFJDb21tb25Ub2tlblRlc3QgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMUExMjExMDAxMUQzQTVEQjAwRjI3QjM4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUkNvbW1vblRva2VuVGVzdCIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkxQTEyMTBGNjExRDNBNUQ5MDBGMjdCMzggLyogUmVzb3VyY2VzICovLAorCQkJCTFBMTIxMEY3MTFEM0E1RDkwMEYyN0IzOCAvKiBTb3VyY2VzICovLAorCQkJCTFBMTIxMEY4MTFEM0E1RDkwMEYyN0IzOCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBMTIxMEY5MTFEM0E1RDkwMEYyN0IzOCAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gQU5UTFJDb21tb25Ub2tlblRlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IEFOVExSQ29tbW9uVG9rZW5UZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBMTIxMEZCMTFEM0E1RDkwMEYyN0IzOCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5vY3Rlc3QgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmJ1bmRsZSI7CisJCX07CisJCTFBMTIxMUQwMTFEM0JGNDYwMEYyN0IzOCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMUExMjExRDYxMUQzQkY0ODAwRjI3QjM4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUlN0cmluZ1N0cmVhbVRlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUExMjExQ0MxMUQzQkY0NjAwRjI3QjM4IC8qIFJlc291cmNlcyAqLywKKwkJCQkxQTEyMTFDRDExRDNCRjQ2MDBGMjdCMzggLyogU291cmNlcyAqLywKKwkJCQkxQTEyMTFDRTExRDNCRjQ2MDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTFDRjExRDNCRjQ2MDBGMjdCMzggLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IEFOVExSU3RyaW5nU3RyZWFtVGVzdDsKKwkJCXByb2R1Y3ROYW1lID0gQU5UTFJTdHJpbmdTdHJlYW1UZXN0OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBMTIxMUQxMTFEM0JGNDcwMEYyN0IzOCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3Qub2N0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5idW5kbGUiOworCQl9OworCQkxQTEyMTIyMzExRDNDOTI0MDBGMjdCMzggLyogQU5UTFJGYXN0UXVldWVUZXN0ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBMTIxMjI5MTFEM0M5MjUwMEYyN0IzOCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFJGYXN0UXVldWVUZXN0IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBMTIxMjFGMTFEM0M5MjQwMEYyN0IzOCAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMUExMjEyMjAxMUQzQzkyNDAwRjI3QjM4IC8qIFNvdXJjZXMgKi8sCisJCQkJMUExMjEyMjExMUQzQzkyNDAwRjI3QjM4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMUExMjEyMjIxMUQzQzkyNDAwRjI3QjM4IC8qIFNoZWxsU2NyaXB0ICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSBBTlRMUkZhc3RRdWV1ZVRlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IEFOVExSRmFzdFF1ZXVlVGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTEyMTIyNDExRDNDOTI0MDBGMjdCMzggLyogQU5UTFJGYXN0UXVldWVUZXN0Lm9jdGVzdCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYnVuZGxlIjsKKwkJfTsKKwkJMUExMjEyREIxMUQzRjUzNjAwRjI3QjM4IC8qIEFOVExSSW50QXJyYXlUZXN0ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBMTIxMkUxMTFEM0Y1MzcwMEYyN0IzOCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFJJbnRBcnJheVRlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUExMjEyRDcxMUQzRjUzNjAwRjI3QjM4IC8qIFJlc291cmNlcyAqLywKKwkJCQkxQTEyMTJEODExRDNGNTM2MDBGMjdCMzggLyogU291cmNlcyAqLywKKwkJCQkxQTEyMTJEOTExRDNGNTM2MDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTJEQTExRDNGNTM2MDBGMjdCMzggLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IEFOVExSSW50QXJyYXlUZXN0OworCQkJcHJvZHVjdE5hbWUgPSBBTlRMUkludEFycmF5VGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTEyMTJEQzExRDNGNTM2MDBGMjdCMzggLyogQU5UTFJJbnRBcnJheVRlc3Qub2N0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5idW5kbGUiOworCQl9OworCQkxQTEyMTMwQjExRDNGN0NEMDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTEyMTMxMTExRDNGN0NFMDBGMjdCMzggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkFOVExSQ29tbW9uVHJlZVRlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUExMjEzMDcxMUQzRjdDRDAwRjI3QjM4IC8qIFJlc291cmNlcyAqLywKKwkJCQkxQTEyMTMwODExRDNGN0NEMDBGMjdCMzggLyogU291cmNlcyAqLywKKwkJCQkxQTEyMTMwOTExRDNGN0NEMDBGMjdCMzggLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTEyMTMwQTExRDNGN0NEMDBGMjdCMzggLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IEFOVExSQ29tbW9uVHJlZVRlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IEFOVExSQ29tbW9uVHJlZVRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMUExMjEzMEMxMUQzRjdDRDAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVHJlZVRlc3Qub2N0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5idW5kbGUiOworCQl9OworCQkxQTM0OEI0RDExRDJCRUU4MDAwQzcyRkMgLyogVGVzdCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTM0OEI1MzExRDJCRUU5MDAwQzcyRkMgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIlRlc3QiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUEzNDhCNDkxMUQyQkVFODAwMEM3MkZDIC8qIFJlc291cmNlcyAqLywKKwkJCQkxQTM0OEI0QTExRDJCRUU4MDAwQzcyRkMgLyogU291cmNlcyAqLywKKwkJCQkxQTM0OEI0QjExRDJCRUU4MDAwQzcyRkMgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTM0OEI0QzExRDJCRUU4MDAwQzcyRkMgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMUExMjEzNDUxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUExMjEzNDcxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUExMjEzNDkxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUExMjEzNEIxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUExMjEzNEQxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkJMUExMjEzNEYxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IFRlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IFRlc3Q7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMUEzNDhCNEUxMUQyQkVFODAwMEM3MkZDIC8qIFRlc3Qub2N0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5idW5kbGUiOworCQl9OworCQkxQTM0OEJFQjExRDJEMEExMDAwQzcyRkMgLyogQU5UTFJCaXRzZXRUZXN0ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBMzQ4QkYxMTFEMkQwQTIwMDBDNzJGQyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFJCaXRzZXRUZXN0IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBMzQ4QkU3MTFEMkQwQTEwMDBDNzJGQyAvKiBSZXNvdXJjZXMgKi8sCisJCQkJMUEzNDhCRTgxMUQyRDBBMTAwMEM3MkZDIC8qIFNvdXJjZXMgKi8sCisJCQkJMUEzNDhCRTkxMUQyRDBBMTAwMEM3MkZDIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMUEzNDhCRUExMUQyRDBBMTAwMEM3MkZDIC8qIFNoZWxsU2NyaXB0ICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSBBTlRMUkJpdHNldFRlc3Q7CisJCQlwcm9kdWN0TmFtZSA9IEFOVExSQml0c2V0VGVzdDsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTM0OEJFQzExRDJEMEExMDAwQzcyRkMgLyogQU5UTFJCaXRzZXRUZXN0Lm9jdGVzdCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuYnVuZGxlIjsKKwkJfTsKKwkJMUE3N0VFODgxMkU2QTU1MjAwN0YzMjNBIC8qIFRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBNzdFRThFMTJFNkE1NTMwMDdGMzIzQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiVHJlZVJld3JpdGVSdWxlVG9rZW5TdHJlYW0iICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUE3N0VFODQxMkU2QTU1MjAwN0YzMjNBIC8qIFJlc291cmNlcyAqLywKKwkJCQkxQTc3RUU4NTEyRTZBNTUyMDA3RjMyM0EgLyogU291cmNlcyAqLywKKwkJCQkxQTc3RUU4NjEyRTZBNTUyMDA3RjMyM0EgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTc3RUU4NzEyRTZBNTUyMDA3RjMyM0EgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IFRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtOworCQkJcHJvZHVjdE5hbWUgPSBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTc3RUU4OTEyRTZBNTUyMDA3RjMyM0EgLyogVHJlZVJld3JpdGVSdWxlVG9rZW5TdHJlYW0ub2N0ZXN0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS5idW5kbGUiOworCQl9OworCQkxQUM1QUM5ODEyRTdCRUZFMDBERjBDNTggLyogdHJlZXBhcnNlciAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQUM1QUNBMzEyRTdCRUZFMDBERjBDNTggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRyZWVwYXJzZXIiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUFDNUFDOTkxMkU3QkVGRTAwREYwQzU4IC8qIFNvdXJjZXMgKi8sCisJCQkJMUFDNUFDOUQxMkU3QkVGRTAwREYwQzU4IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCQkxQUM1QUNBMjEyRTdCRUZFMDBERjBDNTggLyogUEJYQnVpbGRSdWxlICovLAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gdHJlZXBhcnNlcjsKKwkJCXByb2R1Y3ROYW1lID0gdHJlZXJld3JpdGU7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMUFDNUFDQTcxMkU3QkVGRTAwREYwQzU4IC8qIHRyZWVwYXJzZXIgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQk4REMyRUY0RjA0ODZBNjk0MDA5OEIyMTYgLyogQU5UTFIgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMURFQjkxQUQwODczM0RBNTAwMTBFOUNEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUiIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQk4REMyRUY1MDA0ODZBNjk0MDA5OEIyMTYgLyogSGVhZGVycyAqLywKKwkJCQk4REMyRUY1NDA0ODZBNjk0MDA5OEIyMTYgLyogU291cmNlcyAqLywKKwkJCQk4REMyRUY1NjA0ODZBNjk0MDA5OEIyMTYgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTk5NENDNDEyQTg0QTQ2MDAxODUzRkYgLyogU2hlbGxTY3JpcHQgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IEFOVExSOworCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gIiQoSE9NRSkvTGlicmFyeS9GcmFtZXdvcmtzIjsKKwkJCXByb2R1Y3ROYW1lID0gQU5UTFI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gOERDMkVGNUIwNDg2QTY5NDAwOThCMjE2IC8qIEFOVExSLmZyYW1ld29yayAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUuZnJhbWV3b3JrIjsKKwkJfTsKKwkJRjcwMEU4NjMwQTVGQTMxRDAwNUQwNzU3IC8qIGNvbWJpbmVkICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3MDBFODZDMEE1RkEzNEQwMDVEMDc1NyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiY29tYmluZWQiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJRjcwMEU4NjEwQTVGQTMxRDAwNUQwNzU3IC8qIFNvdXJjZXMgKi8sCisJCQkJRjcwMEU4NjIwQTVGQTMxRDAwNUQwNzU3IC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCQkxQTk5NERDNjEyQTg1QkZDMDAxODUzRkYgLyogUEJYQnVpbGRSdWxlICovLAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gY29tYmluZWQ7CisJCQlwcm9kdWN0TmFtZSA9IGNvbWJpbmVkOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEY3MDBFODY0MEE1RkEzMUQwMDVEMDc1NyAvKiBjb21iaW5lZCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCUY3MDBFQ0Q2MEE1RkUxODYwMDVEMDc1NyAvKiBMTC1zdGFyICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3MDBFQ0RDMEE1RkUxQkYwMDVEMDc1NyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiTEwtc3RhciIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlGNzAwRUNENDBBNUZFMTg2MDA1RDA3NTcgLyogU291cmNlcyAqLywKKwkJCQlGNzAwRUNENTBBNUZFMTg2MDA1RDA3NTcgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJCTFBOTk0Q0YyMTJBODRGRDMwMDE4NTNGRiAvKiBQQlhCdWlsZFJ1bGUgKi8sCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiTEwtc3RhciI7CisJCQlwcm9kdWN0TmFtZSA9ICJMTC1zdGFyIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBGNzAwRUNENzBBNUZFMTg2MDA1RDA3NTcgLyogTEwtc3RhciAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCUY3MDM3RTlGMEEwNUFGQjYwMDcwNDM1RCAvKiBsZXhlcnRlc3Qtc2ltcGxlICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3MDM3RUI4MEEwNUFGRUYwMDcwNDM1RCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGV4ZXJ0ZXN0LXNpbXBsZSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQlGNzAzN0U5RDBBMDVBRkI2MDA3MDQzNUQgLyogU291cmNlcyAqLywKKwkJCQlGNzAzN0U5RTBBMDVBRkI2MDA3MDQzNUQgLyogRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJCTFBOTk0REM5MTJBODVCRkMwMDE4NTNGRiAvKiBQQlhCdWlsZFJ1bGUgKi8sCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQlwcm9kdWN0TmFtZSA9ICJsZXhlcnRlc3Qtc2ltcGxlIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBGNzAzN0VBMDBBMDVBRkI2MDA3MDQzNUQgLyogbGV4ZXJ0ZXN0LXNpbXBsZSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCUY3MkM1RTVBMEFCN0U0QzkwMDI4MjU3NCAvKiBzaW1wbGVjdHJlZSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBGNzJDNUU2NjBBQjdFNEM5MDAyODI1NzQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNpbXBsZWN0cmVlIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUY3MkM1RTVEMEFCN0U0QzkwMDI4MjU3NCAvKiBTb3VyY2VzICovLAorCQkJCUY3MkM1RTYxMEFCN0U0QzkwMDI4MjU3NCAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkJMUE5OTRENEYxMkE4NTk4NzAwMTg1M0ZGIC8qIFBCWEJ1aWxkUnVsZSAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IHNpbXBsZWN0cmVlOworCQkJcHJvZHVjdE5hbWUgPSBzY29wZXM7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gRjcyQzVFNjkwQUI3RTRDOTAwMjgyNTc0IC8qIHNpbXBsZWN0cmVlICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJRjc5RDU2NUYwQTBFMjNBNDAwRUEzQ0VFIC8qIGZ1enp5ICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3OUQ1NjZGMEEwRTIzRDYwMEVBM0NFRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZnV6enkiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJRjc5RDU2NUQwQTBFMjNBNDAwRUEzQ0VFIC8qIFNvdXJjZXMgKi8sCisJCQkJRjc5RDU2NUUwQTBFMjNBNDAwRUEzQ0VFIC8qIEZyYW1ld29ya3MgKi8sCisJCQkJRjcwNkE1NzEwQTBFQzM1NzAwODk5OUFCIC8qIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJCTFBOTk0REM3MTJBODVCRkMwMDE4NTNGRiAvKiBQQlhCdWlsZFJ1bGUgKi8sCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSBmdXp6eTsKKwkJCXByb2R1Y3ROYW1lID0gZnV6enk7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gRjc5RDU2NjAwQTBFMjNBNDAwRUEzQ0VFIC8qIGZ1enp5ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJRjdDRDQ3NUMwQzY0RDIyODAwRkY5MzNBIC8qIHRyZWVyZXdyaXRlICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3Q0Q0NzdDMEM2NEQyNzAwMEZGOTMzQSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAidHJlZXJld3JpdGUiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJRjdDRDQ3NUEwQzY0RDIyODAwRkY5MzNBIC8qIFNvdXJjZXMgKi8sCisJCQkJRjdDRDQ3NUIwQzY0RDIyODAwRkY5MzNBIC8qIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCQkxQTk5NEQzRTEyQTg1OEUxMDAxODUzRkYgLyogUEJYQnVpbGRSdWxlICovLAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gdHJlZXJld3JpdGU7CisJCQlwcm9kdWN0TmFtZSA9IHRyZWVyZXdyaXRlOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEY3Q0Q0NzVEMEM2NEQyMjgwMEZGOTMzQSAvKiB0cmVlcmV3cml0ZSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCUY3REQwNUVEMEE3QjE1RTEwMDZBMDA2QyAvKiBob2lzdGVkUHJlZGljYXRlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSBGN0REMDVGMDBBN0IxNjQwMDA2QTAwNkMgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImhvaXN0ZWRQcmVkaWNhdGVzIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUY3REQwNUVCMEE3QjE1RTEwMDZBMDA2QyAvKiBTb3VyY2VzICovLAorCQkJCUY3REQwNUVDMEE3QjE1RTEwMDZBMDA2QyAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkJMUE5OTREQzgxMkE4NUJGQzAwMTg1M0ZGIC8qIFBCWEJ1aWxkUnVsZSAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IGhvaXN0ZWRQcmVkaWNhdGVzOworCQkJcHJvZHVjdE5hbWUgPSBob2lzdGVkUHJlZGljYXRlczsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSBGN0REMDVFRTBBN0IxNUUxMDA2QTAwNkMgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQlGN0REMDc0MzBBN0I2NjE4MDA2QTAwNkMgLyogc2NvcGVzICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IEY3REQwNzc5MEE3QjY2ODIwMDZBMDA2QyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2NvcGVzIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCUY3REQwNzQxMEE3QjY2MTgwMDZBMDA2QyAvKiBTb3VyY2VzICovLAorCQkJCUY3REQwNzQyMEE3QjY2MTgwMDZBMDA2QyAvKiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkJMUE5OTREODUxMkE4NUFCRTAwMTg1M0ZGIC8qIFBCWEJ1aWxkUnVsZSAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkpOworCQkJbmFtZSA9IHNjb3BlczsKKwkJCXByb2R1Y3ROYW1lID0gc2NvcGVzOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IEY3REQwNzQ0MEE3QjY2MTgwMDZBMDA2QyAvKiBzY29wZXMgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworLyogRW5kIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCQkwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi8gPSB7CisJCQlpc2EgPSBQQlhQcm9qZWN0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFERUI5MUIxMDg3MzNEQTUwMDEwRTlDRCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIkFOVExSIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQlkZXZlbG9wbWVudFJlZ2lvbiA9IEVuZ2xpc2g7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMTsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQlFbmdsaXNoLAorCQkJCUphcGFuZXNlLAorCQkJCUZyZW5jaCwKKwkJCQlHZXJtYW4sCisJCQkpOworCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIEFOVExSICovOworCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4REZGRjM4QTUwNDExREI5QzhCIC8qIFByb2R1Y3RzICovOworCQkJcHJvamVjdERpclBhdGggPSAiIjsKKwkJCXByb2plY3RSb290ID0gIiI7CisJCQl0YXJnZXRzID0gKAorCQkJCThEQzJFRjRGMDQ4NkE2OTQwMDk4QjIxNiAvKiBBTlRMUiAqLywKKwkJCQkxQTM0OEI0RDExRDJCRUU4MDAwQzcyRkMgLyogVGVzdCAqLywKKwkJCQkxQTM0OEJFQjExRDJEMEExMDAwQzcyRkMgLyogQU5UTFJCaXRzZXRUZXN0ICovLAorCQkJCTFBMTIxMEZBMTFEM0E1RDkwMEYyN0IzOCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdCAqLywKKwkJCQkxQTEyMTMwQjExRDNGN0NEMDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdCAqLywKKwkJCQkxQTEyMTIyMzExRDNDOTI0MDBGMjdCMzggLyogQU5UTFJGYXN0UXVldWVUZXN0ICovLAorCQkJCTFBMTIxMkRCMTFEM0Y1MzYwMEYyN0IzOCAvKiBBTlRMUkludEFycmF5VGVzdCAqLywKKwkJCQkxQTEyMTFEMDExRDNCRjQ2MDBGMjdCMzggLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0ICovLAorCQkJCTFBNzdFRTg4MTJFNkE1NTIwMDdGMzIzQSAvKiBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqLywKKwkJCQlGNzYyODczRjBCNzE1MTlCMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBhbGwgZXhhbXBsZXMgKi8sCisJCQkJRjc2Mjg3N0UwQjcxNTU5QzAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgY29tYmluZWQgKi8sCisJCQkJRjcwMEU4NjMwQTVGQTMxRDAwNUQwNzU3IC8qIGNvbWJpbmVkICovLAorCQkJCUY3NjI4NzQ1MEI3MTUxRTMwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIGZ1enp5ICovLAorCQkJCUY3OUQ1NjVGMEEwRTIzQTQwMEVBM0NFRSAvKiBmdXp6eSAqLywKKwkJCQlGNzYyODc4NjBCNzE1NUEyMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBob2lzdGVkUHJlZGljYXRlcyAqLywKKwkJCQlGN0REMDVFRDBBN0IxNUUxMDA2QTAwNkMgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8sCisJCQkJRjc2Mjg3NzgwQjcxNTU3RTAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgbGV4ZXJ0ZXN0LXNpbXBsZSAqLywKKwkJCQlGNzAzN0U5RjBBMDVBRkI2MDA3MDQzNUQgLyogbGV4ZXJ0ZXN0LXNpbXBsZSAqLywKKwkJCQlGNzYyODc4MjBCNzE1NTlGMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBMTC1zdGFyICovLAorCQkJCUY3MDBFQ0Q2MEE1RkUxODYwMDVEMDc1NyAvKiBMTC1zdGFyICovLAorCQkJCTFBMEYzNDNCMTJFQTQyNTcwMDQ5NkJCOCAvKiBSZWdlbmVyYXRlIHBvbHlkaWZmICovLAorCQkJCTFBMEYzNDU3MTJFQTQyRDgwMDQ5NkJCOCAvKiBwb2x5ZGlmZiAqLywKKwkJCQlGNzYyODc4QTBCNzE1NUFCMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBzY29wZXMgKi8sCisJCQkJRjdERDA3NDMwQTdCNjYxODAwNkEwMDZDIC8qIHNjb3BlcyAqLywKKwkJCQlGNzYyODc4RTBCNzE1NUFGMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBzaW1wbGVjdHJlZSAqLywKKwkJCQlGNzJDNUU1QTBBQjdFNEM5MDAyODI1NzQgLyogc2ltcGxlY3RyZWUgKi8sCisJCQkJMUFDNUFDOTMxMkU3QkUwNDAwREYwQzU4IC8qIFJlZ2VuZXJhdGUgdHJlZXBhcnNlciAqLywKKwkJCQkxQUM1QUM5ODEyRTdCRUZFMDBERjBDNTggLyogdHJlZXBhcnNlciAqLywKKwkJCQlGN0NENDc2MTBDNjREMjM4MDBGRjkzM0EgLyogUmVnZW5lcmF0ZSB0cmVlcmV3cml0ZSAqLywKKwkJCQlGN0NENDc1QzBDNjREMjI4MDBGRjkzM0EgLyogdHJlZXJld3JpdGUgKi8sCisJCQkpOworCQl9OworLyogRW5kIFBCWFByb2plY3Qgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUExMjEwRjYxMUQzQTVEOTAwRjI3QjM4IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBMTIxMUNDMTFEM0JGNDYwMEYyN0IzOCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTIxRjExRDNDOTI0MDBGMjdCMzggLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUExMjEyRDcxMUQzRjUzNjAwRjI3QjM4IC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBMTIxMzA3MTFEM0Y3Q0QwMEYyN0IzOCAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTM0OEI0OTExRDJCRUU4MDAwQzcyRkMgLyogUmVzb3VyY2VzICovID0geworCQkJaXNhID0gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUEzNDhCRTcxMUQyRDBBMTAwMEM3MkZDIC8qIFJlc291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFJlc291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNzdFRTg0MTJFNkE1NTIwMDdGMzIzQSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFJlc291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkxQTEyMTBGOTExRDNBNUQ5MDBGMjdCMzggLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIjIFJ1biB0aGUgdW5pdCB0ZXN0cyBpbiB0aGlzIHRlc3QgYnVuZGxlLlxuXCIke1NZU1RFTV9ERVZFTE9QRVJfRElSfS9Ub29scy9SdW5Vbml0VGVzdHNcIlxuIjsKKwkJfTsKKwkJMUExMjExQ0YxMUQzQkY0NjAwRjI3QjM4IC8qIFNoZWxsU2NyaXB0ICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSdW4gdGhlIHVuaXQgdGVzdHMgaW4gdGhpcyB0ZXN0IGJ1bmRsZS5cblwiJHtTWVNURU1fREVWRUxPUEVSX0RJUn0vVG9vbHMvUnVuVW5pdFRlc3RzXCJcbiI7CisJCX07CisJCTFBMTIxMjIyMTFEM0M5MjQwMEYyN0IzOCAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgUnVuIHRoZSB1bml0IHRlc3RzIGluIHRoaXMgdGVzdCBidW5kbGUuXG5cIiR7U1lTVEVNX0RFVkVMT1BFUl9ESVJ9L1Rvb2xzL1J1blVuaXRUZXN0c1wiXG4iOworCQl9OworCQkxQTEyMTJEQTExRDNGNTM2MDBGMjdCMzggLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIjIFJ1biB0aGUgdW5pdCB0ZXN0cyBpbiB0aGlzIHRlc3QgYnVuZGxlLlxuXCIke1NZU1RFTV9ERVZFTE9QRVJfRElSfS9Ub29scy9SdW5Vbml0VGVzdHNcIlxuIjsKKwkJfTsKKwkJMUExMjEzMEExMUQzRjdDRDAwRjI3QjM4IC8qIFNoZWxsU2NyaXB0ICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSdW4gdGhlIHVuaXQgdGVzdHMgaW4gdGhpcyB0ZXN0IGJ1bmRsZS5cblwiJHtTWVNURU1fREVWRUxPUEVSX0RJUn0vVG9vbHMvUnVuVW5pdFRlc3RzXCJcbiI7CisJCX07CisJCTFBMzQ4QjRDMTFEMkJFRTgwMDBDNzJGQyAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgUnVuIHRoZSB1bml0IHRlc3RzIGluIHRoaXMgdGVzdCBidW5kbGUuXG5cIiR7U1lTVEVNX0RFVkVMT1BFUl9ESVJ9L1Rvb2xzL1J1blVuaXRUZXN0c1wiXG4iOworCQl9OworCQkxQTM0OEJFQTExRDJEMEExMDAwQzcyRkMgLyogU2hlbGxTY3JpcHQgKi8gPSB7CisJCQlpc2EgPSBQQlhTaGVsbFNjcmlwdEJ1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJaW5wdXRQYXRocyA9ICgKKwkJCSk7CisJCQlvdXRwdXRQYXRocyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJCXNoZWxsUGF0aCA9IC9iaW4vc2g7CisJCQlzaGVsbFNjcmlwdCA9ICIjIFJ1biB0aGUgdW5pdCB0ZXN0cyBpbiB0aGlzIHRlc3QgYnVuZGxlLlxuXCIke1NZU1RFTV9ERVZFTE9QRVJfRElSfS9Ub29scy9SdW5Vbml0VGVzdHNcIlxuIjsKKwkJfTsKKwkJMUE3N0VFODcxMkU2QTU1MjAwN0YzMjNBIC8qIFNoZWxsU2NyaXB0ICovID0geworCQkJaXNhID0gUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCWlucHV0UGF0aHMgPSAoCisJCQkpOworCQkJb3V0cHV0UGF0aHMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCQlzaGVsbFBhdGggPSAvYmluL3NoOworCQkJc2hlbGxTY3JpcHQgPSAiIyBSdW4gdGhlIHVuaXQgdGVzdHMgaW4gdGhpcyB0ZXN0IGJ1bmRsZS5cblwiJHtTWVNURU1fREVWRUxPUEVSX0RJUn0vVG9vbHMvUnVuVW5pdFRlc3RzXCJcbiI7CisJCX07CisJCTFBOTk0Q0M0MTJBODRBNDYwMDE4NTNGRiAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiI7CisJCX07CisvKiBFbmQgUEJYU2hlbGxTY3JpcHRCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkxQTBGMzQ1ODEyRUE0MkQ4MDA0OTZCQjggLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMEYzNDZEMTJFQTQzNEYwMDQ5NkJCOCAvKiBNYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTBGMzQ4OTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seUxleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTBGMzQ4QTEyRUE0NDQ1MDA0OTZCQjggLyogUG9seVBhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUEwMUJEOTMxMkVCNUE2MDAwNDI4NzkyIC8qIFNpbXBsaWZpZXIubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTEyMTBGNzExRDNBNUQ5MDBGMjdCMzggLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBMTIxMTAzMTFEM0E2MkIwMEYyN0IzOCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBMTIxMUNEMTFEM0JGNDYwMEYyN0IzOCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUExMjExREUxMUQzQkZDOTAwRjI3QjM4IC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBMTIxMjIwMTFEM0M5MjQwMEYyN0IzOCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUExMjEyNjIxMUQzQ0EwMTAwRjI3QjM4IC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBMTIxMkQ4MTFEM0Y1MzYwMEYyN0IzOCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUExMjEyRTcxMUQzRjU5MzAwRjI3QjM4IC8qIEFOVExSSW50QXJyYXlUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUExMjEzMDgxMUQzRjdDRDAwRjI3QjM4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTEyMTMxNzExRDNGODA1MDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBMzQ4QjRBMTFEMkJFRTgwMDBDNzJGQyAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUEzNDhCQTUxMUQyQzZBMDAwMEM3MkZDIC8qIEFOVExSQml0U2V0VGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUEzNDhCQTgxMUQyQzZBRDAwMEM3MkZDIC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTM0OEJBQjExRDJDNkI4MDAwQzcyRkMgLyogQU5UTFJDb21tb25UcmVlVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUEzNDhCQUUxMUQyQzZDNjAwMEM3MkZDIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUEzNDhCQUYxMUQyQzZEMzAwMEM3MkZDIC8qIEFOVExSSW50QXJyYXlUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTM0OEJCMjExRDJDNkUzMDAwQzcyRkMgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUEzNDhCRTgxMUQyRDBBMTAwMEM3MkZDIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTM0OEMwNjExRDJEMjJCMDAwQzcyRkMgLyogQU5UTFJCaXRTZXRUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE3N0VFODUxMkU2QTU1MjAwN0YzMjNBIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUFDNUFDOTkxMkU3QkVGRTAwREYwQzU4IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQUM1QUNBRDEyRTdCRjRFMDBERjBDNTggLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFDNUFDRTYxMkU3Q0U0NzAwREYwQzU4IC8qIExhbmdQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBQzVBQ0U3MTJFN0NFNEMwMERGMEM1OCAvKiBMYW5nTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBQzVBQ0U4MTJFN0NFNTEwMERGMEM1OCAvKiBMYW5nRHVtcERlY2wubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQk4REMyRUY1NDA0ODZBNjk0MDA5OEIyMTYgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNjc4ODUyMTFCODdBQkEwMEExMUVFQyAvKiBBTlRMUkJhc2VUcmVlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTY3ODg1NDExQjg3QUVBMDBBMTFFRUMgLyogQU5UTFJGYXN0UXVldWUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjc4ODU1MTFCODdBRUYwMEExMUVFQyAvKiBBTlRMUkludEFycmF5Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTY3ODhGQzExQjg5M0UxMDBBMTFFRUMgLyogQU5UTFJCYXNlUmVjb2duaXplci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NTkxMUI4OUY2MjAwOEM5QkVEIC8qIEFOVExSQml0U2V0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk1QTExQjg5RjY0MDA4QzlCRUQgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk1QjExQjg5RjY1MDA4QzlCRUQgLyogQU5UTFJDb21tb25Ub2tlbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NUMxMUI4OUY2NzAwOEM5QkVEIC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTVEMTFCODlGNjgwMDhDOUJFRCAvKiBBTlRMUkNvbW1vblRyZWUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTVFMTFCODlGNjkwMDhDOUJFRCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk1RjExQjg5RjZBMDA4QzlCRUQgLyogQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NjExMUI4OUY2RjAwOEM5QkVEIC8qIEFOVExSTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTYyMTFCODlGNzAwMDhDOUJFRCAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk2MzExQjg5Rjc2MDA4QzlCRUQgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTY0MTFCODlGNzYwMDhDOUJFRCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NjUxMUI4OUY3NzAwOEM5QkVEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NjYxMUI4OUY3ODAwOEM5QkVEIC8qIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk2NzExQjg5RjdBMDA4QzlCRUQgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTY4MTFCODlGN0IwMDhDOUJFRCAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk2OTExQjg5RjdFMDA4QzlCRUQgLyogQU5UTFJQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTZBMTFCODlGN0YwMDhDOUJFRCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NkIxMUI4OUY4MDAwOEM5QkVEIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTZDMTFCODlGODIwMDhDOUJFRCAvKiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NkQxMUI4OUY4MzAwOEM5QkVEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk2RTExQjg5Rjg0MDA4QzlCRUQgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTZGMTFCODlGODUwMDhDOUJFRCAvKiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTcwMTFCODlGODcwMDhDOUJFRCAvKiBBTlRMUlN0cmluZ1N0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExMkM5NzExMUI4OUY4QjAwOEM5QkVEIC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTEyQzk3MjExQjg5RjhDMDA4QzlCRUQgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTczMTFCODlGOEUwMDhDOUJFRCAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTJDOTc0MTFCODlGOTAwMDhDOUJFRCAvKiBBTlRMUlRyZWVQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjVCN0Q5MTFCOTUzMkEwMEZEODc1NCAvKiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBQjRBNTQyMTFCOTk1MjkwMDc2RTkxQSAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFCNEE1NDMxMUI5OTUyQTAwNzZFOTFBIC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUI0QTU5MjExQjlBMERBMDA3NkU5MUEgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQThBQzAwRDExQkFFQzcxMDAzOERCQjAgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTFENDY1QzExQkU3M0IyMDAxNTc1RjMgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMUQ0NjcxMTFCRTc1QzAwMDE1NzVGMyAvKiBBTlRMUk1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMUQ0NjdEMTFCRThFNUEwMDE1NzVGMyAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2QzQ1MTcxMUJGNEVFMDAwMzk3ODhBIC8qIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZDNDUyOTExQkY1MEE0MDAzOTc4OEEgLyogQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTE3MDJGRjExQzA1RDQ4MDBGNjk3OEEgLyogQU5UTFJIYXNoTWFwLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTI3MEJGQTExQzE0NTEyMDBEQ0M4RjMgLyogQU5UTFJUcmVlSXRlcmF0b3IubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMjYzMjk2MTFDNTM1NzgwMDBEQ0RENCAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTZCMTNEMTFDNjY0OTIwMDI4NjBDNyAvKiBBTlRMUkxpbmtCYXNlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTQ1NjU3ODExQzkyMkJFMDA4MkY0MjEgLyogQU5UTFJSdWxlTWVtby5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE0NTY1OEExMUM5MjcwRDAwODJGNDIxIC8qIEFOVExSQmFzZU1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMUJDREJDMTFDQjAxRTYwMDUxQTFFQyAvKiBBTlRMUlJ1bGVSZXR1cm5TY29wZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExQkNERDAxMUNCMEIzRDAwNTFBMUVDIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUExQkNFMkIxMUNCMUEzRTAwNTFBMUVDIC8qIEFOVExSVHJlZVJld3JpdGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTRBODUxMzExQ0JDRTNFMDBFNEJGMUIgLyogQU5UTFJUcmVlVmlzaXRvci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE0QTg1MTkxMUNCQ0U1NTAwRTRCRjFCIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNEE4NTFGMTFDQkNGMzcwMEU0QkYxQiAvKiBBTlRMUlRyZWVXaXphcmQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBQUMyMDJEMTFDQzYyMUEwMENGNTZEMSAvKiBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBQUMyMEE2MTFDQzc5MDMwMENGNTZEMSAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTVFQTUwQzExQ0ZFN0NFMDBFODkzMkYgLyogQU5UTFJNYXAubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNzVCRkJBMTFENkMyQjEwMDk2QzZGNSAvKiBBTlRMUkRGQS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFOEE5NkQxMUQ5MjI3QTAwRDM2RkQ2IC8qIEFOVExSUnVsZVN0YWNrLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTNBMDhFNzExRTIxM0M1MDBENUVFMjYgLyogQU5UTFJCYXNlU3RhY2subSBpbiBTb3VyY2VzICovLAorCQkJCTFBM0EwOEVCMTFFMjEzRTEwMEQ1RUUyNiAvKiBBTlRMUlN5bWJvbFN0YWNrLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUI1RjQ3ODExRTM4NjlEMDBFMDY1QjAgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFCNUY1MUYxMUUzQkUyRTAwRTA2NUIwIC8qIEFOVExSUHRyQnVmZmVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTJEMjE3NjExRTRGNTdDMDBERkUzMjggLyogQU5UTFJVbmlxdWVJRE1hcC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUEyRDIxODcxMUU1MDJERTAwREZFMzI4IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBMTAwQUJDMTFFNjA0RkUwMDZBQkY5NCAvKiBBTlRMUkhhc2hSdWxlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUVFQ0UxNjExRTdFQjNEMDA1NTRBQUYgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBODZCOTFDMTFFQjlGNjMwMEM2N0EwMyAvKiBBTlRMUlBhcnNlVHJlZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE4NkJBRDAxMUVDMUNEMDAwQzY3QTAzIC8qIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjcwMEU4NjEwQTVGQTMxRDAwNUQwNzU3IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGNzM4RDM2MTBCMDdDMTA1MDAxODEzQzQgLyogQ29tYmluZWRMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJRjczOEQzNjIwQjA3QzEwNTAwMTgxM0M0IC8qIENvbWJpbmVkUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTIwQzU2NTEyRDYyNjc1MDBDMjA3MkEgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY3MDBFQ0Q0MEE1RkUxODYwMDVEMDc1NyAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjczOEQzMTkwQjA3QkRCNzAwMTgxM0M0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCUY3NjI4NzE1MEI3MTRFODIwMDZBQTdFRiAvKiBTaW1wbGVDUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQlGNzYyODcxNjBCNzE0RTgzMDA2QUE3RUYgLyogU2ltcGxlQ0xleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjcwMzdFOUQwQTA1QUZCNjAwNzA0MzVEIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGNzA0OEZGODBCMDdEMDU0MDBEMkYzMjYgLyogVGVzdExleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQlGNzA0OEZGOTBCMDdEMDU4MDBEMkYzMjYgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY3MkM1RTVEMEFCN0U0QzkwMDI4MjU3NCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE0MDZCNTYxMkU4RjJFRDAwNUVGMDM3IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCUY3NDFEMDgzMEIzODFFNzIwMDI0REYzRiAvKiBTaW1wbGVDV2Fsa2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQlGNzQxRDA4NDBCMzgxRTczMDAyNERGM0YgLyogU2ltcGxlQ1BhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJRjc0MUQwOEUwQjM4MUVBOTAwMjRERjNGIC8qIFNpbXBsZUNMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFDNUFDRDYxMkU3QzA1ODAwREYwQzU4IC8qIExhbmdMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY3OUQ1NjVEMEEwRTIzQTQwMEVBM0NFRSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjczOEQzN0UwQjA3QzNCRDAwMTgxM0M0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCUY3NjI4NzE3MEI3MTRFQTkwMDZBQTdFRiAvKiBGdXp6eUxleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJRjdDRDQ3NUEwQzY0RDIyODAwRkY5MzNBIC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQlGN0NENDc2NTBDNjREMjRDMDBGRjkzM0EgLyogVHJlZVJld3JpdGVMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJRjdDRDQ3NjYwQzY0RDI0RDAwRkY5MzNBIC8qIFRyZWVSZXdyaXRlUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQlGN0NENDc2NzBDNjREMjREMDBGRjkzM0EgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY3REQwNUVCMEE3QjE1RTEwMDZBMDA2QyAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjczOEQyMTIwQjA3QjMyRDAwMTgxM0M0IC8qIFQuZyBpbiBTb3VyY2VzICovLAorCQkJCUY3MzhEMjIyMEIwN0IzOUYwMDE4MTNDNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQlGNzYyODcxMzBCNzE0RTc3MDA2QUE3RUYgLyogVExleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQlGNzYyODcxNDBCNzE0RTc4MDA2QUE3RUYgLyogVFBhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCUY3REQwNzQxMEE3QjY2MTgwMDZBMDA2QyAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJRjczOEQxRkMwQjA3QjFCRDAwMTgxM0M0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCUY3MzhEMjBEMEIwN0IyNjUwMDE4MTNDNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJRjczOEQyMEUwQjA3QjI2NjAwMTgxM0M0IC8qIFN5bWJvbFRhYmxlTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworLyogRW5kIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCisJCTFBMEYzNDcxMTJFQTQzQkEwMDQ5NkJCOCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDFBMEYzNDNCMTJFQTQyNTcwMDQ5NkJCOCAvKiBSZWdlbmVyYXRlIHBvbHlkaWZmICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTBGMzQ3MDEyRUE0M0JBMDA0OTZCQjggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTBGMzQ3MzEyRUE0M0JBMDA0OTZCQjggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQUM1QUM5MzEyRTdCRTA0MDBERjBDNTggLyogUmVnZW5lcmF0ZSB0cmVlcGFyc2VyICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTBGMzQ3MjEyRUE0M0JBMDA0OTZCQjggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTBGMzQ3NTEyRUE0M0JBMDA0OTZCQjggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBGN0NENDc2MTBDNjREMjM4MDBGRjkzM0EgLyogUmVnZW5lcmF0ZSB0cmVlcmV3cml0ZSAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUEwRjM0NzQxMkVBNDNCQTAwNDk2QkI4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUExMjEzNDUxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUEzNDhCRUIxMUQyRDBBMTAwMEM3MkZDIC8qIEFOVExSQml0c2V0VGVzdCAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUExMjEzNDQxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUExMjEzNDcxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUExMjEwRkExMUQzQTVEOTAwRjI3QjM4IC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0ICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTEyMTM0NjExRDNGREE1MDBGMjdCMzggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTEyMTM0OTExRDNGREE1MDBGMjdCMzggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQTEyMTMwQjExRDNGN0NEMDBGMjdCMzggLyogQU5UTFJDb21tb25UcmVlVGVzdCAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUExMjEzNDgxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUExMjEzNEIxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUExMjEyMjMxMUQzQzkyNDAwRjI3QjM4IC8qIEFOVExSRmFzdFF1ZXVlVGVzdCAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUExMjEzNEExMUQzRkRBNTAwRjI3QjM4IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUExMjEzNEQxMUQzRkRBNTAwRjI3QjM4IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUExMjEyREIxMUQzRjUzNjAwRjI3QjM4IC8qIEFOVExSSW50QXJyYXlUZXN0ICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTEyMTM0QzExRDNGREE1MDBGMjdCMzggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTEyMTM0RjExRDNGREE1MDBGMjdCMzggLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQTEyMTFEMDExRDNCRjQ2MDBGMjdCMzggLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0ICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTEyMTM0RTExRDNGREE1MDBGMjdCMzggLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlGNzYyODc0QzBCNzE1NDE3MDA2QUE3RUYgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBGNzYyODc0NTBCNzE1MUUzMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBmdXp6eSAqLzsKKwkJCXRhcmdldFByb3h5ID0gRjc2Mjg3NEIwQjcxNTQxNzAwNkFBN0VGIC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJRjc2Mjg3QTcwQjcxNTdDMjAwNkFBN0VGIC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gRjc2Mjg3N0UwQjcxNTU5QzAwNkFBN0VGIC8qIFJlZ2VuZXJhdGUgY29tYmluZWQgKi87CisJCQl0YXJnZXRQcm94eSA9IEY3NjI4N0E2MEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUY3NjI4N0E5MEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEY3NjI4NzgyMEI3MTU1OUYwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIExMLXN0YXIgKi87CisJCQl0YXJnZXRQcm94eSA9IEY3NjI4N0E4MEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUY3NjI4N0FCMEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEY3NjI4Nzg2MEI3MTU1QTIwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIGhvaXN0ZWRQcmVkaWNhdGVzICovOworCQkJdGFyZ2V0UHJveHkgPSBGNzYyODdBQTBCNzE1N0MyMDA2QUE3RUYgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlGNzYyODdBRDBCNzE1N0MyMDA2QUE3RUYgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBGNzYyODc4QTBCNzE1NUFCMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBzY29wZXMgKi87CisJCQl0YXJnZXRQcm94eSA9IEY3NjI4N0FDMEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCUY3NjI4N0FGMEI3MTU3QzIwMDZBQTdFRiAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IEY3NjI4NzhFMEI3MTU1QUYwMDZBQTdFRiAvKiBSZWdlbmVyYXRlIHNpbXBsZWN0cmVlICovOworCQkJdGFyZ2V0UHJveHkgPSBGNzYyODdBRTBCNzE1N0MyMDA2QUE3RUYgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQlGNzlFRkIxNDBDNTg0NUEzMDBBQkFCM0QgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSBGNzYyODc3ODBCNzE1NTdFMDA2QUE3RUYgLyogUmVnZW5lcmF0ZSBsZXhlcnRlc3Qtc2ltcGxlICovOworCQkJdGFyZ2V0UHJveHkgPSBGNzlFRkIxMzBDNTg0NUEzMDBBQkFCM0QgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworLyogRW5kIFBCWFRhcmdldERlcGVuZGVuY3kgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCQkwODlDMTY2NkZFODQxMTU4QzAyQUFDMDcgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkwODlDMTY2N0ZFODQxMTU4QzAyQUFDMDcgLyogRW5nbGlzaCAqLywKKwkJCSk7CisJCQluYW1lID0gSW5mb1BsaXN0LnN0cmluZ3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKwkJMUEwRjM0M0QxMkVBNDI1NzAwNDk2QkI4IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IHBvbHlkaWZmOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUEwRjM0M0UxMkVBNDI1NzAwNDk2QkI4IC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gdHJlZXJld3JpdGU7CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJMUEwRjM0M0YxMkVBNDI1NzAwNDk2QkI4IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gdHJlZXJld3JpdGU7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBMEYzNDYzMTJFQTQyRDgwMDQ5NkJCOCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFRFUk5BVEVfR1JPVVAgPSAiJChJTlNUQUxMX0dST1VQKSI7CisJCQkJQUxURVJOQVRFX01PREUgPSAiJChJTlNUQUxMX01PREVfRkxBRykiOworCQkJCUFMVEVSTkFURV9PV05FUiA9ICIkKElOU1RBTExfT1dORVIpIjsKKwkJCQlBTFRFUk5BVEVfUEVSTUlTU0lPTlNfRklMRVMgPSAiIjsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQU5UTFJfREVCVUcgPSBZRVM7CisJCQkJQU5UTFJfRVhUUkFfSkFWQV9BUkdTID0gIi91c3Ivc2hhcmUvamF2YS9hbnRsci0yLjcuNy5qYXI6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9zdHJpbmd0ZW1wbGF0ZSI7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9wb2x5ZGlmZiI7CisJCQkJQU5UTFJfTElCX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9wb2x5ZGlmZiI7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSCkiOworCQkJCUJVSUxEX1ZBUklBTlRTID0gbm9ybWFsOworCQkJCUJVTkRMRV9MT0FERVIgPSAiIjsKKwkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09ORklHVVJBVElPTl9URU1QX0RJUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpLyQoQ09ORklHVVJBVElPTikiOworCQkJCUNPUFlJTkdfUFJFU0VSVkVTX0hGU19EQVRBID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUNVUlJFTlRfUFJPSkVDVF9WRVJTSU9OID0gIiI7CisJCQkJREVBRF9DT0RFX1NUUklQUElORyA9IE5POworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IGR3YXJmOworCQkJCURFUExPWU1FTlRfTE9DQVRJT04gPSBOTzsKKwkJCQlERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk87CisJCQkJRFNUUk9PVCA9ICIvdG1wLyQoUFJPSkVDVF9OQU1FKS5kc3QiOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9ICIiOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9ICIiOworCQkJCUVYRUNVVEFCTEVfRVhURU5TSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9QUkVGSVggPSAiIjsKKwkJCQlFWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUdDQ19BTFRJVkVDX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfQVVUT19WRUNUT1JJWkFUSU9OID0gTk87CisJCQkJR0NDX0NIQVJfSVNfVU5TSUdORURfQ0hBUiA9IE5POworCQkJCUdDQ19DV19BU01fU1lOVEFYID0gWUVTOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZnVsbDsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0FTTV9LRVlXT1JEID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfUlRUSSA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSBzdXBwb3J0ZWQ7CisJCQkJR0NDX0VOQUJMRV9QQVNDQUxfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NTRTNfRVhURU5TSU9OUyA9IE5POworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX1RSSUdSQVBIUyA9IE5POworCQkJCUdDQ19GQVNUX01BVEggPSBOTzsKKwkJCQlHQ0NfRkFTVF9PQkpDX0RJU1BBVENIID0gTk87CisJCQkJR0NDX0ZFRURCQUNLX0RJUkVDVEVEX09QVElNSVpBVElPTiA9IE9mZjsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX0dFTkVSQVRFX1RFU1RfQ09WRVJBR0VfRklMRVMgPSBOTzsKKwkJCQlHQ0NfSU5DUkVBU0VfUFJFQ09NUElMRURfSEVBREVSX1NIQVJJTkcgPSBOTzsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX0lOUFVUX0ZJTEVUWVBFID0gYXV0b21hdGljOworCQkJCUdDQ19JTlNUUlVNRU5UX1BST0dSQU1fRkxPV19BUkNTID0gTk87CisJCQkJR0NDX01PREVMX1BQQzY0ID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19OT19DT01NT05fQkxPQ0tTID0gTk87CisJCQkJR0NDX09CSkNfQ0FMTF9DWFhfQ0RUT1JTID0gTk87CisJCQkJR0NDX09ORV9CWVRFX0JPT0wgPSBOTzsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUEZFX0ZJTEVfQ19ESUFMRUNUUyA9ICJjIG9iamVjdGl2ZS1jIGMrKyBvYmplY3RpdmUtYysrIjsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfTk9UX1VTRURfSU5fUFJFQ09NUFMgPSAiIjsKKwkJCQlHQ0NfUkVVU0VfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfU0hPUlRfRU5VTVMgPSBOTzsKKwkJCQlHQ0NfU1RSSUNUX0FMSUFTSU5HID0gTk87CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1RIUkVBRFNBRkVfU1RBVElDUyA9IFlFUzsKKwkJCQlHQ0NfVFJFQVRfTk9OQ09ORk9STUFOVF9DT0RFX0VSUk9SU19BU19XQVJOSU5HUyA9IE5POworCQkJCUdDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMgPSBOTzsKKwkJCQlHQ0NfVU5ST0xMX0xPT1BTID0gTk87CisJCQkJR0NDX1VTRV9HQ0MzX1BGRV9TVVBQT1JUID0gIiQoVVNFX0dDQzNfUEZFX1NVUFBPUlQpIjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9ERVBSRUNBVEVEX0ZVTkNUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9JTlZBTElEX09GRlNFVE9GX01BQ1JPID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX01JU1NJTkdfTkVXTElORSA9IE5POworCQkJCUdDQ19XQVJOX0FCT1VUX01JU1NJTkdfUFJPVE9UWVBFUyA9IE5POworCQkJCUdDQ19XQVJOX0FCT1VUX1BPSU5URVJfU0lHTkVETkVTUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BTExPV19JTkNPTVBMRVRFX1BST1RPQ09MID0gWUVTOworCQkJCUdDQ19XQVJOX0NIRUNLX1NXSVRDSF9TVEFURU1FTlRTID0gWUVTOworCQkJCUdDQ19XQVJOX0VGRkVDVElWRV9DUExVU1BMVVNfVklPTEFUSU9OUyA9IE5POworCQkJCUdDQ19XQVJOX0ZPVVJfQ0hBUkFDVEVSX0NPTlNUQU5UUyA9IE5POworCQkJCUdDQ19XQVJOX0hJRERFTl9WSVJUVUFMX0ZVTkNUSU9OUyA9IE5POworCQkJCUdDQ19XQVJOX0lOSElCSVRfQUxMX1dBUk5JTkdTID0gTk87CisJCQkJR0NDX1dBUk5fSU5JVElBTElaRVJfTk9UX0ZVTExZX0JSQUNLRVRFRCA9IE5POworCQkJCUdDQ19XQVJOX01JU1NJTkdfUEFSRU5USEVTRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9OT05fVklSVFVBTF9ERVNUUlVDVE9SID0gTk87CisJCQkJR0NDX1dBUk5fUEVEQU5USUMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9TSEFET1cgPSBOTzsKKwkJCQlHQ0NfV0FSTl9TSUdOX0NPTVBBUkUgPSBOTzsKKwkJCQlHQ0NfV0FSTl9UWVBFQ0hFQ0tfQ0FMTFNfVE9fUFJJTlRGID0gTk87CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IE5POworCQkJCUdDQ19XQVJOX1VOS05PV05fUFJBR01BUyA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9GVU5DVElPTiA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9MQUJFTCA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9QQVJBTUVURVIgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFMVUUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUdFTkVSQVRFX01BU1RFUl9PQkpFQ1RfRklMRSA9IE5POworCQkJCUdFTkVSQVRFX1BLR0lORk9fRklMRSA9IE5POworCQkJCUdFTkVSQVRFX1BST0ZJTElOR19DT0RFID0gTk87CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUlORk9QTElTVF9FWFBBTkRfQlVJTERfU0VUVElOR1MgPSBZRVM7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiIjsKKwkJCQlJTkZPUExJU1RfT1RIRVJfUFJFUFJPQ0VTU09SX0ZMQUdTID0gIiI7CisJCQkJSU5GT1BMSVNUX1BSRUZJWF9IRUFERVIgPSAiIjsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTUyA9IE5POworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAiIjsKKwkJCQlJTklUX1JPVVRJTkUgPSAiIjsKKwkJCQlJTlNUQUxMX0dST1VQID0gIiQoR1JPVVApIjsKKwkJCQlJTlNUQUxMX01PREVfRkxBRyA9ICJhLXcsYStyWCI7CisJCQkJSU5TVEFMTF9PV05FUiA9ICIkKFVTRVIpIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCUtFRVBfUFJJVkFURV9FWFRFUk5TID0gTk87CisJCQkJTElCUkFSWV9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlMSU5LRVJfRElTUExBWVNfRklMRVNfRk9SX1VOREVGSU5FRF9TWU1CT0xTID0gWUVTOworCQkJCUxJTktFUl9ESVNQTEFZU19NQU5HTEVEX05BTUVTID0gTk87CisJCQkJTElOS19XSVRIX1NUQU5EQVJEX0xJQlJBUklFUyA9IFlFUzsKKwkJCQlNQUNIX09fVFlQRSA9ICIiOworCQkJCU1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCA9ICIkKGluaGVyaXRlZCkiOworCQkJCU9CSlJPT1QgPSBCdWlsZC9JbnRlcm1lZGlhdGVzOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJT05MWV9MSU5LX0VTU0VOVElBTF9TWU1CT0xTID0gTk87CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfQ1BMVVNQTFVTRkxBR1MgPSAiJChPVEhFUl9DRkxBR1MpIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBSRUNPTVBTX0lOQ0xVREVfSEVBREVSU19GUk9NX0JVSUxUX1BST0RVQ1RTX0RJUiA9IFlFUzsKKwkJCQlQUkVMSU5LX0ZMQUdTID0gIiI7CisJCQkJUFJFTElOS19MSUJTID0gIiI7CisJCQkJUFJFU0VSVkVfREVBRF9DT0RFX0lOSVRTX0FORF9URVJNUyA9IE5POworCQkJCVBSSVZBVEVfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVBST0RVQ1RfTkFNRSA9IHBvbHlkaWZmOworCQkJCVBVQkxJQ19IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUkVaX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVNDQU5fQUxMX1NPVVJDRV9GSUxFU19GT1JfSU5DTFVERVMgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNjsKKwkJCQlTRUNUT1JERVJfRkxBR1MgPSAiIjsKKwkJCQlTRVBBUkFURV9TVFJJUCA9IE5POworCQkJCVNFUEFSQVRFX1NZTUJPTF9FRElUID0gTk87CisJCQkJU0hBUkVEX1BSRUNPTVBTX0RJUiA9ICIkKENBQ0hFX1JPT1QpL1NoYXJlZFByZWNvbXBpbGVkSGVhZGVycyI7CisJCQkJU0tJUF9JTlNUQUxMID0gTk87CisJCQkJU1RBTkRBUkRfQ19QTFVTX1BMVVNfTElCUkFSWV9UWVBFID0gZHluYW1pYzsKKwkJCQlTVFJJUEZMQUdTID0gIiI7CisJCQkJU1RSSVBfSU5TVEFMTEVEX1BST0RVQ1QgPSAiIjsKKwkJCQlTVFJJUF9TVFlMRSA9IGFsbDsKKwkJCQlTWU1ST09UID0gQnVpbGQ7CisJCQkJVEVTVF9IT1NUID0gIiI7CisJCQkJVEVTVF9SSUcgPSAiIjsKKwkJCQlVTkVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiIjsKKwkJCQlXQVJOSU5HX0xERkxBR1MgPSAiIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9ICIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUEwRjM0NjQxMkVBNDJEODAwNDk2QkI4IC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxURVJOQVRFX0dST1VQID0gIiQoSU5TVEFMTF9HUk9VUCkiOworCQkJCUFMVEVSTkFURV9NT0RFID0gIiQoSU5TVEFMTF9NT0RFX0ZMQUcpIjsKKwkJCQlBTFRFUk5BVEVfT1dORVIgPSAiJChJTlNUQUxMX09XTkVSKSI7CisJCQkJQUxURVJOQVRFX1BFUk1JU1NJT05TX0ZJTEVTID0gIiI7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFOVExSX0RFQlVHID0gWUVTOworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIvVXNlcnMvYWNvbmRpdC9Qcm9qZWN0cy9pZGVhL2FudGxyMy9jbGFzc2VzOi9Vc2Vycy9hY29uZGl0L1Byb2plY3RzL2lkZWEvc3RyaW5ndGVtcGxhdGUvY2xhc3NlczovTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyIjsKKwkJCQlBTlRMUl9GT1JDRV9PVVRfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3RyZWVyZXdyaXRlIjsKKwkJCQlBTlRMUl9MSUJfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3RyZWVyZXdyaXRlIjsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIKSI7CisJCQkJQlVJTERfVkFSSUFOVFMgPSBub3JtYWw7CisJCQkJQlVORExFX0xPQURFUiA9ICIiOworCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09QWUlOR19QUkVTRVJWRVNfSEZTX0RBVEEgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJQ1VSUkVOVF9QUk9KRUNUX1ZFUlNJT04gPSAiIjsKKwkJCQlERUFEX0NPREVfU1RSSVBQSU5HID0gTk87CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gZHdhcmY7CisJCQkJREVQTE9ZTUVOVF9MT0NBVElPTiA9IE5POworCQkJCURFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBOTzsKKwkJCQlEU1RST09UID0gIi90bXAvJChQUk9KRUNUX05BTUUpLmRzdCI7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gIiI7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9FWFRFTlNJT04gPSAiIjsKKwkJCQlFWEVDVVRBQkxFX1BSRUZJWCA9ICIiOworCQkJCUVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0FMVElWRUNfRVhURU5TSU9OUyA9IE5POworCQkJCUdDQ19BVVRPX1ZFQ1RPUklaQVRJT04gPSBOTzsKKwkJCQlHQ0NfQ0hBUl9JU19VTlNJR05FRF9DSEFSID0gTk87CisJCQkJR0NDX0NXX0FTTV9TWU5UQVggPSBZRVM7CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfREVCVUdHSU5HX1NZTUJPTFMgPSBmdWxsOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfQVNNX0tFWVdPUkQgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0NQUF9SVFRJID0gWUVTOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfUEFTQ0FMX1NUUklOR1MgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9TU0UzX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0VOQUJMRV9UUklHUkFQSFMgPSBOTzsKKwkJCQlHQ0NfRkFTVF9NQVRIID0gTk87CisJCQkJR0NDX0ZBU1RfT0JKQ19ESVNQQVRDSCA9IE5POworCQkJCUdDQ19GRUVEQkFDS19ESVJFQ1RFRF9PUFRJTUlaQVRJT04gPSBPZmY7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19HRU5FUkFURV9URVNUX0NPVkVSQUdFX0ZJTEVTID0gTk87CisJCQkJR0NDX0lOQ1JFQVNFX1BSRUNPTVBJTEVEX0hFQURFUl9TSEFSSU5HID0gTk87CisJCQkJR0NDX0lOTElORVNfQVJFX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19JTlBVVF9GSUxFVFlQRSA9IGF1dG9tYXRpYzsKKwkJCQlHQ0NfSU5TVFJVTUVOVF9QUk9HUkFNX0ZMT1dfQVJDUyA9IE5POworCQkJCUdDQ19NT0RFTF9QUEM2NCA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfTk9fQ09NTU9OX0JMT0NLUyA9IE5POworCQkJCUdDQ19PQkpDX0NBTExfQ1hYX0NEVE9SUyA9IE5POworCQkJCUdDQ19PTkVfQllURV9CT09MID0gTk87CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BGRV9GSUxFX0NfRElBTEVDVFMgPSAiYyBvYmplY3RpdmUtYyBjKysgb2JqZWN0aXZlLWMrKyI7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAiIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX05PVF9VU0VEX0lOX1BSRUNPTVBTID0gIiI7CisJCQkJR0NDX1JFVVNFX1NUUklOR1MgPSBZRVM7CisJCQkJR0NDX1NIT1JUX0VOVU1TID0gTk87CisJCQkJR0NDX1NUUklDVF9BTElBU0lORyA9IE5POworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19USFJFQURTQUZFX1NUQVRJQ1MgPSBZRVM7CisJCQkJR0NDX1RSRUFUX05PTkNPTkZPUk1BTlRfQ09ERV9FUlJPUlNfQVNfV0FSTklOR1MgPSBOTzsKKwkJCQlHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTID0gTk87CisJCQkJR0NDX1VOUk9MTF9MT09QUyA9IE5POworCQkJCUdDQ19VU0VfR0NDM19QRkVfU1VQUE9SVCA9ICIkKFVTRV9HQ0MzX1BGRV9TVVBQT1JUKSI7CisJCQkJR0NDX1dBUk5fQUJPVVRfREVQUkVDQVRFRF9GVU5DVElPTlMgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfSU5WQUxJRF9PRkZTRVRPRl9NQUNSTyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX05FV0xJTkUgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX1BST1RPVFlQRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9QT0lOVEVSX1NJR05FRE5FU1MgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUxMT1dfSU5DT01QTEVURV9QUk9UT0NPTCA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9DSEVDS19TV0lUQ0hfU1RBVEVNRU5UUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9FRkZFQ1RJVkVfQ1BMVVNQTFVTX1ZJT0xBVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9GT1VSX0NIQVJBQ1RFUl9DT05TVEFOVFMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9ISURERU5fVklSVFVBTF9GVU5DVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTkhJQklUX0FMTF9XQVJOSU5HUyA9IE5POworCQkJCUdDQ19XQVJOX0lOSVRJQUxJWkVSX05PVF9GVUxMWV9CUkFDS0VURUQgPSBOTzsKKwkJCQlHQ0NfV0FSTl9NSVNTSU5HX1BBUkVOVEhFU0VTID0gTk87CisJCQkJR0NDX1dBUk5fTk9OX1ZJUlRVQUxfREVTVFJVQ1RPUiA9IE5POworCQkJCUdDQ19XQVJOX1BFREFOVElDID0gTk87CisJCQkJR0NDX1dBUk5fU0hBRE9XID0gTk87CisJCQkJR0NDX1dBUk5fU0lHTl9DT01QQVJFID0gTk87CisJCQkJR0NDX1dBUk5fVFlQRUNIRUNLX0NBTExTX1RPX1BSSU5URiA9IE5POworCQkJCUdDQ19XQVJOX1VOSU5JVElBTElaRURfQVVUT1MgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTktOT1dOX1BSQUdNQVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfRlVOQ1RJT04gPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfTEFCRUwgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfUEFSQU1FVEVSID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBTFVFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlHRU5FUkFURV9NQVNURVJfT0JKRUNUX0ZJTEUgPSBOTzsKKwkJCQlHRU5FUkFURV9QS0dJTkZPX0ZJTEUgPSBOTzsKKwkJCQlHRU5FUkFURV9QUk9GSUxJTkdfQ09ERSA9IE5POworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlJTkZPUExJU1RfRVhQQU5EX0JVSUxEX1NFVFRJTkdTID0gWUVTOworCQkJCUlORk9QTElTVF9GSUxFID0gIiI7CisJCQkJSU5GT1BMSVNUX09USEVSX1BSRVBST0NFU1NPUl9GTEFHUyA9ICIiOworCQkJCUlORk9QTElTVF9QUkVGSVhfSEVBREVSID0gIiI7CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1MgPSBOTzsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJSU5JVF9ST1VUSU5FID0gIiI7CisJCQkJSU5TVEFMTF9HUk9VUCA9ICIkKEdST1VQKSI7CisJCQkJSU5TVEFMTF9NT0RFX0ZMQUcgPSAiYS13LGErclgiOworCQkJCUlOU1RBTExfT1dORVIgPSAiJChVU0VSKSI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlLRUVQX1BSSVZBVEVfRVhURVJOUyA9IE5POworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJTElOS0VSX0RJU1BMQVlTX0ZJTEVTX0ZPUl9VTkRFRklORURfU1lNQk9MUyA9IFlFUzsKKwkJCQlMSU5LRVJfRElTUExBWVNfTUFOR0xFRF9OQU1FUyA9IE5POworCQkJCUxJTktfV0lUSF9TVEFOREFSRF9MSUJSQVJJRVMgPSBZRVM7CisJCQkJTUFDSF9PX1RZUEUgPSAiIjsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAiJChpbmhlcml0ZWQpIjsKKwkJCQlPQkpST09UID0gL1VzZXJzL2Fjb25kaXQvUHJvamVjdHMvSW50ZXJtZWRpYXRlczsKKwkJCQlPTkxZX0xJTktfRVNTRU5USUFMX1NZTUJPTFMgPSBOTzsKKwkJCQlPVEhFUl9DRkxBR1MgPSAiIjsKKwkJCQlPVEhFUl9DUExVU1BMVVNGTEFHUyA9ICIkKE9USEVSX0NGTEFHUykiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJFQ09NUFNfSU5DTFVERV9IRUFERVJTX0ZST01fQlVJTFRfUFJPRFVDVFNfRElSID0gWUVTOworCQkJCVBSRUxJTktfRkxBR1MgPSAiIjsKKwkJCQlQUkVMSU5LX0xJQlMgPSAiIjsKKwkJCQlQUkVTRVJWRV9ERUFEX0NPREVfSU5JVFNfQU5EX1RFUk1TID0gTk87CisJCQkJUFJJVkFURV9IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gdHJlZXJld3JpdGU7CisJCQkJUFVCTElDX0hFQURFUlNfRk9MREVSX1BBVEggPSAiIjsKKwkJCQlSRVpfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJU0NBTl9BTExfU09VUkNFX0ZJTEVTX0ZPUl9JTkNMVURFUyA9IE5POworCQkJCVNES1JPT1QgPSBtYWNvc3gxMC40OworCQkJCVNFQ1RPUkRFUl9GTEFHUyA9ICIiOworCQkJCVNFUEFSQVRFX1NUUklQID0gTk87CisJCQkJU0VQQVJBVEVfU1lNQk9MX0VESVQgPSBOTzsKKwkJCQlTSEFSRURfUFJFQ09NUFNfRElSID0gIiQoQ0FDSEVfUk9PVCkvU2hhcmVkUHJlY29tcGlsZWRIZWFkZXJzIjsKKwkJCQlTS0lQX0lOU1RBTEwgPSBOTzsKKwkJCQlTVEFOREFSRF9DX1BMVVNfUExVU19MSUJSQVJZX1RZUEUgPSBkeW5hbWljOworCQkJCVNUUklQRkxBR1MgPSAiIjsKKwkJCQlTVFJJUF9JTlNUQUxMRURfUFJPRFVDVCA9ICIiOworCQkJCVNUUklQX1NUWUxFID0gYWxsOworCQkJCVNZTVJPT1QgPSAvVXNlcnMvYWNvbmRpdC9Qcm9qZWN0cy9BbnRsci9CdWlsZDsKKwkJCQlURVNUX0hPU1QgPSAiIjsKKwkJCQlURVNUX1JJRyA9ICIiOworCQkJCVVORVhQT1JURURfU1lNQk9MU19GSUxFID0gIiI7CisJCQkJVVNFUl9IRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiIjsKKwkJCQlXQVJOSU5HX0NGTEFHUyA9ICIiOworCQkJCVdBUk5JTkdfTERGTEFHUyA9ICIiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gIiI7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJMUEwRjM0NjUxMkVBNDJEODAwNDk2QkI4IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxURVJOQVRFX0dST1VQID0gIiQoSU5TVEFMTF9HUk9VUCkiOworCQkJCUFMVEVSTkFURV9NT0RFID0gIiQoSU5TVEFMTF9NT0RFX0ZMQUcpIjsKKwkJCQlBTFRFUk5BVEVfT1dORVIgPSAiJChJTlNUQUxMX09XTkVSKSI7CisJCQkJQUxURVJOQVRFX1BFUk1JU1NJT05TX0ZJTEVTID0gIiI7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFSQ0hTID0gKAorCQkJCQlwcGMsCisJCQkJCWkzODYsCisJCQkJKTsKKwkJCQlCVUlMRF9WQVJJQU5UUyA9IG5vcm1hbDsKKwkJCQlCVU5ETEVfTE9BREVSID0gIiI7CisJCQkJQ09ORklHVVJBVElPTl9CVUlMRF9ESVIgPSAiJChCVUlMRF9ESVIpLyQoQ09ORklHVVJBVElPTikiOworCQkJCUNPTkZJR1VSQVRJT05fVEVNUF9ESVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlDT1BZSU5HX1BSRVNFUlZFU19IRlNfREFUQSA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJQ1VSUkVOVF9QUk9KRUNUX1ZFUlNJT04gPSAiIjsKKwkJCQlERUFEX0NPREVfU1RSSVBQSU5HID0gTk87CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gc3RhYnM7CisJCQkJREVQTE9ZTUVOVF9MT0NBVElPTiA9IE5POworCQkJCURFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBOTzsKKwkJCQlEU1RST09UID0gIi90bXAvJChQUk9KRUNUX05BTUUpLmRzdCI7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gIiI7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9FWFRFTlNJT04gPSAiIjsKKwkJCQlFWEVDVVRBQkxFX1BSRUZJWCA9ICIiOworCQkJCUVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0FMVElWRUNfRVhURU5TSU9OUyA9IE5POworCQkJCUdDQ19BVVRPX1ZFQ1RPUklaQVRJT04gPSBOTzsKKwkJCQlHQ0NfQ0hBUl9JU19VTlNJR05FRF9DSEFSID0gTk87CisJCQkJR0NDX0NXX0FTTV9TWU5UQVggPSBZRVM7CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfREVCVUdHSU5HX1NZTUJPTFMgPSBkZWZhdWx0OworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0FTTV9LRVlXT1JEID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfUlRUSSA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1BBU0NBTF9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1NFM19FWFRFTlNJT05TID0gTk87CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1RSSUdSQVBIUyA9IE5POworCQkJCUdDQ19GQVNUX01BVEggPSBOTzsKKwkJCQlHQ0NfRkFTVF9PQkpDX0RJU1BBVENIID0gTk87CisJCQkJR0NDX0ZFRURCQUNLX0RJUkVDVEVEX09QVElNSVpBVElPTiA9IE9mZjsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfVEVTVF9DT1ZFUkFHRV9GSUxFUyA9IE5POworCQkJCUdDQ19JTkNSRUFTRV9QUkVDT01QSUxFRF9IRUFERVJfU0hBUklORyA9IE5POworCQkJCUdDQ19JTkxJTkVTX0FSRV9QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfSU5QVVRfRklMRVRZUEUgPSBhdXRvbWF0aWM7CisJCQkJR0NDX0lOU1RSVU1FTlRfUFJPR1JBTV9GTE9XX0FSQ1MgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfUFBDNjQgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX05PX0NPTU1PTl9CTE9DS1MgPSBOTzsKKwkJCQlHQ0NfT0JKQ19DQUxMX0NYWF9DRFRPUlMgPSBOTzsKKwkJCQlHQ0NfT05FX0JZVEVfQk9PTCA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSBzOworCQkJCUdDQ19QRkVfRklMRV9DX0RJQUxFQ1RTID0gImMgb2JqZWN0aXZlLWMgYysrIG9iamVjdGl2ZS1jKysiOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19OT1RfVVNFRF9JTl9QUkVDT01QUyA9ICIiOworCQkJCUdDQ19SRVVTRV9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19TSE9SVF9FTlVNUyA9IE5POworCQkJCUdDQ19TVFJJQ1RfQUxJQVNJTkcgPSBOTzsKKwkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfVEhSRUFEU0FGRV9TVEFUSUNTID0gWUVTOworCQkJCUdDQ19UUkVBVF9OT05DT05GT1JNQU5UX0NPREVfRVJST1JTX0FTX1dBUk5JTkdTID0gTk87CisJCQkJR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyA9IE5POworCQkJCUdDQ19VTlJPTExfTE9PUFMgPSBOTzsKKwkJCQlHQ0NfVVNFX0dDQzNfUEZFX1NVUFBPUlQgPSAiJChVU0VfR0NDM19QRkVfU1VQUE9SVCkiOworCQkJCUdDQ19XQVJOX0FCT1VUX0RFUFJFQ0FURURfRlVOQ1RJT05TID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX0lOVkFMSURfT0ZGU0VUT0ZfTUFDUk8gPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19ORVdMSU5FID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX01JU1NJTkdfUFJPVE9UWVBFUyA9IE5POworCQkJCUdDQ19XQVJOX0FCT1VUX1BPSU5URVJfU0lHTkVETkVTUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BTExPV19JTkNPTVBMRVRFX1BST1RPQ09MID0gWUVTOworCQkJCUdDQ19XQVJOX0NIRUNLX1NXSVRDSF9TVEFURU1FTlRTID0gWUVTOworCQkJCUdDQ19XQVJOX0VGRkVDVElWRV9DUExVU1BMVVNfVklPTEFUSU9OUyA9IE5POworCQkJCUdDQ19XQVJOX0ZPVVJfQ0hBUkFDVEVSX0NPTlNUQU5UUyA9IE5POworCQkJCUdDQ19XQVJOX0hJRERFTl9WSVJUVUFMX0ZVTkNUSU9OUyA9IE5POworCQkJCUdDQ19XQVJOX0lOSElCSVRfQUxMX1dBUk5JTkdTID0gTk87CisJCQkJR0NDX1dBUk5fSU5JVElBTElaRVJfTk9UX0ZVTExZX0JSQUNLRVRFRCA9IE5POworCQkJCUdDQ19XQVJOX01JU1NJTkdfUEFSRU5USEVTRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9OT05fVklSVFVBTF9ERVNUUlVDVE9SID0gTk87CisJCQkJR0NDX1dBUk5fUEVEQU5USUMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9TSEFET1cgPSBZRVM7CisJCQkJR0NDX1dBUk5fU0lHTl9DT01QQVJFID0gWUVTOworCQkJCUdDQ19XQVJOX1RZUEVDSEVDS19DQUxMU19UT19QUklOVEYgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gWUVTOworCQkJCUdDQ19XQVJOX1VOS05PV05fUFJBR01BUyA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9GVU5DVElPTiA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9MQUJFTCA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9QQVJBTUVURVIgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBTFVFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlHRU5FUkFURV9NQVNURVJfT0JKRUNUX0ZJTEUgPSBOTzsKKwkJCQlHRU5FUkFURV9QS0dJTkZPX0ZJTEUgPSBOTzsKKwkJCQlHRU5FUkFURV9QUk9GSUxJTkdfQ09ERSA9IE5POworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlJTkZPUExJU1RfRVhQQU5EX0JVSUxEX1NFVFRJTkdTID0gWUVTOworCQkJCUlORk9QTElTVF9GSUxFID0gIiI7CisJCQkJSU5GT1BMSVNUX09USEVSX1BSRVBST0NFU1NPUl9GTEFHUyA9ICIiOworCQkJCUlORk9QTElTVF9QUkVGSVhfSEVBREVSID0gIiI7CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1MgPSBOTzsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJSU5JVF9ST1VUSU5FID0gIiI7CisJCQkJSU5TVEFMTF9HUk9VUCA9ICIkKEdST1VQKSI7CisJCQkJSU5TVEFMTF9NT0RFX0ZMQUcgPSAiYS13LGErclgiOworCQkJCUlOU1RBTExfT1dORVIgPSAiJChVU0VSKSI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlLRUVQX1BSSVZBVEVfRVhURVJOUyA9IE5POworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJTElOS0VSX0RJU1BMQVlTX0ZJTEVTX0ZPUl9VTkRFRklORURfU1lNQk9MUyA9IFlFUzsKKwkJCQlMSU5LRVJfRElTUExBWVNfTUFOR0xFRF9OQU1FUyA9IE5POworCQkJCUxJTktfV0lUSF9TVEFOREFSRF9MSUJSQVJJRVMgPSBZRVM7CisJCQkJTUFDSF9PX1RZUEUgPSAiIjsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAiJChpbmhlcml0ZWQpIjsKKwkJCQlPQkpST09UID0gL1VzZXJzL2tyb2Vwa2UvUHJvamVjdHMvSW50ZXJtZWRpYXRlczsKKwkJCQlPTkxZX0xJTktfRVNTRU5USUFMX1NZTUJPTFMgPSBOTzsKKwkJCQlPVEhFUl9DRkxBR1MgPSAiIjsKKwkJCQlPVEhFUl9DUExVU1BMVVNGTEFHUyA9ICIkKE9USEVSX0NGTEFHUykiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJFQ09NUFNfSU5DTFVERV9IRUFERVJTX0ZST01fQlVJTFRfUFJPRFVDVFNfRElSID0gWUVTOworCQkJCVBSRUxJTktfRkxBR1MgPSAiIjsKKwkJCQlQUkVMSU5LX0xJQlMgPSAiIjsKKwkJCQlQUkVTRVJWRV9ERUFEX0NPREVfSU5JVFNfQU5EX1RFUk1TID0gTk87CisJCQkJUFJJVkFURV9IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gdHJlZXJld3JpdGU7CisJCQkJUFVCTElDX0hFQURFUlNfRk9MREVSX1BBVEggPSAiIjsKKwkJCQlSRVpfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJU0NBTl9BTExfU09VUkNFX0ZJTEVTX0ZPUl9JTkNMVURFUyA9IE5POworCQkJCVNES1JPT1QgPSBtYWNvc3gxMC40OworCQkJCVNFQ1RPUkRFUl9GTEFHUyA9ICIiOworCQkJCVNFUEFSQVRFX1NUUklQID0gTk87CisJCQkJU0VQQVJBVEVfU1lNQk9MX0VESVQgPSBOTzsKKwkJCQlTSEFSRURfUFJFQ09NUFNfRElSID0gIiQoQ0FDSEVfUk9PVCkvU2hhcmVkUHJlY29tcGlsZWRIZWFkZXJzIjsKKwkJCQlTS0lQX0lOU1RBTEwgPSBOTzsKKwkJCQlTVEFOREFSRF9DX1BMVVNfUExVU19MSUJSQVJZX1RZUEUgPSBkeW5hbWljOworCQkJCVNUUklQRkxBR1MgPSAiIjsKKwkJCQlTVFJJUF9JTlNUQUxMRURfUFJPRFVDVCA9ICIiOworCQkJCVNUUklQX1NUWUxFID0gYWxsOworCQkJCVNZTVJPT1QgPSAvVXNlcnMva3JvZXBrZS9Qcm9qZWN0cy9CdWlsZDsKKwkJCQlURVNUX0hPU1QgPSAiIjsKKwkJCQlURVNUX1JJRyA9ICIiOworCQkJCVVORVhQT1JURURfU1lNQk9MU19GSUxFID0gIiI7CisJCQkJVVNFUl9IRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiIjsKKwkJCQlXQVJOSU5HX0NGTEFHUyA9ICIiOworCQkJCVdBUk5JTkdfTERGTEFHUyA9ICIiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gIiI7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBMTIxMEZEMTFEM0E1REIwMEYyN0IzOCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAxOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJDb21tb25Ub2tlblRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSQ29tbW9uVG9rZW5UZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUExMjEwRkUxMUQzQTVEQjAwRjI3QjM4IC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJDb21tb25Ub2tlblRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSQ29tbW9uVG9rZW5UZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCTFBMTIxMEZGMTFEM0E1REIwMEYyN0IzOCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJDb21tb25Ub2tlblRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSQ29tbW9uVG9rZW5UZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTEyMTFEMzExRDNCRjQ3MDBGMjdCMzggLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIkFOVExSU3RyaW5nU3RyZWFtVGVzdC1JbmZvLnBsaXN0IjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChVU0VSX0xJQlJBUllfRElSKS9CdW5kbGVzIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUNvY29hLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCVNlblRlc3RpbmdLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gQU5UTFJTdHJpbmdTdHJlYW1UZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUExMjExRDQxMUQzQkY0NzAwRjI3QjM4IC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJTdHJpbmdTdHJlYW1UZXN0LUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBBTlRMUlN0cmluZ1N0cmVhbVRlc3Q7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBvY3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJMUExMjExRDUxMUQzQkY0NzAwRjI3QjM4IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiQoREVWRUxPUEVSX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzIjsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcmsvSGVhZGVycy9Db2NvYS5oIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJBTlRMUlN0cmluZ1N0cmVhbVRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSU3RyaW5nU3RyZWFtVGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUExMjEyMjYxMUQzQzkyNTAwRjI3QjM4IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiQoREVWRUxPUEVSX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzIjsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDE7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcmsvSGVhZGVycy9Db2NvYS5oIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJBTlRMUkZhc3RRdWV1ZVRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSRmFzdFF1ZXVlVGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBMTIxMjI3MTFEM0M5MjUwMEYyN0IzOCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIkFOVExSRmFzdFF1ZXVlVGVzdC1JbmZvLnBsaXN0IjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChVU0VSX0xJQlJBUllfRElSKS9CdW5kbGVzIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUNvY29hLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCVNlblRlc3RpbmdLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gQU5UTFJGYXN0UXVldWVUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCTFBMTIxMjI4MTFEM0M5MjUwMEYyN0IzOCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJGYXN0UXVldWVUZXN0LUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBBTlRMUkZhc3RRdWV1ZVRlc3Q7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBvY3Rlc3Q7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBMTIxMkRFMTFEM0Y1MzcwMEYyN0IzOCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAxOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJJbnRBcnJheVRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSSW50QXJyYXlUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUExMjEyREYxMUQzRjUzNzAwRjI3QjM4IC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJJbnRBcnJheVRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSSW50QXJyYXlUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCTFBMTIxMkUwMTFEM0Y1MzcwMEYyN0IzOCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJJbnRBcnJheVRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSSW50QXJyYXlUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTEyMTMwRTExRDNGN0NFMDBGMjdCMzggLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIkFOVExSQ29tbW9uVHJlZVRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSQ29tbW9uVHJlZVRlc3Q7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBvY3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTEyMTMwRjExRDNGN0NFMDBGMjdCMzggLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiQoREVWRUxPUEVSX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzIjsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcmsvSGVhZGVycy9Db2NvYS5oIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJBTlRMUkNvbW1vblRyZWVUZXN0LUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBBTlRMUkNvbW1vblRyZWVUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCTFBMTIxMzEwMTFEM0Y3Q0UwMEYyN0IzOCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJDb21tb25UcmVlVGVzdC1JbmZvLnBsaXN0IjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChVU0VSX0xJQlJBUllfRElSKS9CdW5kbGVzIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUNvY29hLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCVNlblRlc3RpbmdLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gQU5UTFJDb21tb25UcmVlVGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUEzNDhCNTAxMUQyQkVFODAwMEM3MkZDIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiQoREVWRUxPUEVSX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzIjsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDE7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcmsvSGVhZGVycy9Db2NvYS5oIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJUZXN0LUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUEzNDhCNTExMUQyQkVFODAwMEM3MkZDIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiVGVzdC1JbmZvLnBsaXN0IjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChVU0VSX0xJQlJBUllfRElSKS9CdW5kbGVzIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUNvY29hLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCVNlblRlc3RpbmdLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gVGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCX07CisJCQluYW1lID0gIkRlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWciOworCQl9OworCQkxQTM0OEI1MjExRDJCRUU4MDAwQzcyRkMgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIlRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IFRlc3Q7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBvY3Rlc3Q7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBMzQ4QkVFMTFEMkQwQTIwMDBDNzJGQyAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAxOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrL0hlYWRlcnMvQ29jb2EuaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJCaXRzZXRUZXN0LUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBBTlRMUkJpdHNldFRlc3Q7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBvY3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTM0OEJFRjExRDJEMEEyMDAwQzcyRkMgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiQoREVWRUxPUEVSX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzIjsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9Db2NvYS5mcmFtZXdvcmsvSGVhZGVycy9Db2NvYS5oIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJBTlRMUkJpdHNldFRlc3QtSW5mby5wbGlzdCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoVVNFUl9MSUJSQVJZX0RJUikvQnVuZGxlcyI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlDb2NvYSwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlTZW5UZXN0aW5nS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSQml0c2V0VGVzdDsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCX07CisJCQluYW1lID0gIkRlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWciOworCQl9OworCQkxQTM0OEJGMDExRDJEMEEyMDAwQzcyRkMgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIkFOVExSQml0c2V0VGVzdC1JbmZvLnBsaXN0IjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChVU0VSX0xJQlJBUllfRElSKS9CdW5kbGVzIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUNvY29hLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCVNlblRlc3RpbmdLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gQU5UTFJCaXRzZXRUZXN0OworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTc3RUU4QjEyRTZBNTUyMDA3RjMyM0EgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIlRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtLUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBNzdFRThDMTJFNkE1NTIwMDdGMzIzQSAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIlRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtLUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCX07CisJCQluYW1lID0gIkRlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWciOworCQl9OworCQkxQTc3RUU4RDEyRTZBNTUyMDA3RjMyM0EgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0NvY29hLmZyYW1ld29yay9IZWFkZXJzL0NvY29hLmgiOworCQkJCUlORk9QTElTVF9GSUxFID0gIlRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtLUluZm8ucGxpc3QiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKFVTRVJfTElCUkFSWV9ESVIpL0J1bmRsZXMiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQ29jb2EsCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBUcmVlUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IG9jdGVzdDsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUFDNUFDOTUxMkU3QkUwNDAwREYwQzU4IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVwYXJzZXI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQUM1QUM5NjEyRTdCRTA0MDBERjBDNTggLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSB0cmVlcmV3cml0ZTsKKwkJCX07CisJCQluYW1lID0gIkRlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWciOworCQl9OworCQkxQUM1QUM5NzEyRTdCRTA0MDBERjBDNTggLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSB0cmVlcmV3cml0ZTsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUFDNUFDQTQxMkU3QkVGRTAwREYwQzU4IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMVEVSTkFURV9HUk9VUCA9ICIkKElOU1RBTExfR1JPVVApIjsKKwkJCQlBTFRFUk5BVEVfTU9ERSA9ICIkKElOU1RBTExfTU9ERV9GTEFHKSI7CisJCQkJQUxURVJOQVRFX09XTkVSID0gIiQoSU5TVEFMTF9PV05FUikiOworCQkJCUFMVEVSTkFURV9QRVJNSVNTSU9OU19GSUxFUyA9ICIiOworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBTlRMUl9ERUJVRyA9IFlFUzsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiL3Vzci9zaGFyZS9qYXZhL2FudGxyLTIuNy43LmphcjovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL2FudGxyMzovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL3N0cmluZ3RlbXBsYXRlIjsKKwkJCQlBTlRMUl9GT1JDRV9PVVRfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3RyZWVyZXdyaXRlIjsKKwkJCQlBTlRMUl9MSUJfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL3RyZWVyZXdyaXRlIjsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIKSI7CisJCQkJQlVJTERfVkFSSUFOVFMgPSBub3JtYWw7CisJCQkJQlVORExFX0xPQURFUiA9ICIiOworCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09QWUlOR19QUkVTRVJWRVNfSEZTX0RBVEEgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJQ1VSUkVOVF9QUk9KRUNUX1ZFUlNJT04gPSAiIjsKKwkJCQlERUFEX0NPREVfU1RSSVBQSU5HID0gTk87CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gZHdhcmY7CisJCQkJREVQTE9ZTUVOVF9MT0NBVElPTiA9IE5POworCQkJCURFUExPWU1FTlRfUE9TVFBST0NFU1NJTkcgPSBOTzsKKwkJCQlEU1RST09UID0gIi90bXAvJChQUk9KRUNUX05BTUUpLmRzdCI7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gIiI7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9FWFRFTlNJT04gPSAiIjsKKwkJCQlFWEVDVVRBQkxFX1BSRUZJWCA9ICIiOworCQkJCUVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0FMVElWRUNfRVhURU5TSU9OUyA9IE5POworCQkJCUdDQ19BVVRPX1ZFQ1RPUklaQVRJT04gPSBOTzsKKwkJCQlHQ0NfQ0hBUl9JU19VTlNJR05FRF9DSEFSID0gTk87CisJCQkJR0NDX0NXX0FTTV9TWU5UQVggPSBZRVM7CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfREVCVUdHSU5HX1NZTUJPTFMgPSBmdWxsOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfQVNNX0tFWVdPUkQgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0NQUF9SVFRJID0gWUVTOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHN1cHBvcnRlZDsKKwkJCQlHQ0NfRU5BQkxFX1BBU0NBTF9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1NFM19FWFRFTlNJT05TID0gTk87CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19FTkFCTEVfVFJJR1JBUEhTID0gTk87CisJCQkJR0NDX0ZBU1RfTUFUSCA9IE5POworCQkJCUdDQ19GQVNUX09CSkNfRElTUEFUQ0ggPSBOTzsKKwkJCQlHQ0NfRkVFREJBQ0tfRElSRUNURURfT1BUSU1JWkFUSU9OID0gT2ZmOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfR0VORVJBVEVfVEVTVF9DT1ZFUkFHRV9GSUxFUyA9IE5POworCQkJCUdDQ19JTkNSRUFTRV9QUkVDT01QSUxFRF9IRUFERVJfU0hBUklORyA9IE5POworCQkJCUdDQ19JTkxJTkVTX0FSRV9QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfSU5QVVRfRklMRVRZUEUgPSBhdXRvbWF0aWM7CisJCQkJR0NDX0lOU1RSVU1FTlRfUFJPR1JBTV9GTE9XX0FSQ1MgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfUFBDNjQgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX05PX0NPTU1PTl9CTE9DS1MgPSBOTzsKKwkJCQlHQ0NfT0JKQ19DQUxMX0NYWF9DRFRPUlMgPSBOTzsKKwkJCQlHQ0NfT05FX0JZVEVfQk9PTCA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QRkVfRklMRV9DX0RJQUxFQ1RTID0gImMgb2JqZWN0aXZlLWMgYysrIG9iamVjdGl2ZS1jKysiOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19OT1RfVVNFRF9JTl9QUkVDT01QUyA9ICIiOworCQkJCUdDQ19SRVVTRV9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19TSE9SVF9FTlVNUyA9IE5POworCQkJCUdDQ19TVFJJQ1RfQUxJQVNJTkcgPSBOTzsKKwkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfVEhSRUFEU0FGRV9TVEFUSUNTID0gWUVTOworCQkJCUdDQ19UUkVBVF9OT05DT05GT1JNQU5UX0NPREVfRVJST1JTX0FTX1dBUk5JTkdTID0gTk87CisJCQkJR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyA9IE5POworCQkJCUdDQ19VTlJPTExfTE9PUFMgPSBOTzsKKwkJCQlHQ0NfVVNFX0dDQzNfUEZFX1NVUFBPUlQgPSAiJChVU0VfR0NDM19QRkVfU1VQUE9SVCkiOworCQkJCUdDQ19XQVJOX0FCT1VUX0RFUFJFQ0FURURfRlVOQ1RJT05TID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX0lOVkFMSURfT0ZGU0VUT0ZfTUFDUk8gPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19ORVdMSU5FID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19QUk9UT1RZUEVTID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfUE9JTlRFUl9TSUdORURORVNTID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX0FMTE9XX0lOQ09NUExFVEVfUFJPVE9DT0wgPSBZRVM7CisJCQkJR0NDX1dBUk5fQ0hFQ0tfU1dJVENIX1NUQVRFTUVOVFMgPSBZRVM7CisJCQkJR0NDX1dBUk5fRUZGRUNUSVZFX0NQTFVTUExVU19WSU9MQVRJT05TID0gTk87CisJCQkJR0NDX1dBUk5fRk9VUl9DSEFSQUNURVJfQ09OU1RBTlRTID0gTk87CisJCQkJR0NDX1dBUk5fSElEREVOX1ZJUlRVQUxfRlVOQ1RJT05TID0gTk87CisJCQkJR0NDX1dBUk5fSU5ISUJJVF9BTExfV0FSTklOR1MgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTklUSUFMSVpFUl9OT1RfRlVMTFlfQlJBQ0tFVEVEID0gTk87CisJCQkJR0NDX1dBUk5fTUlTU0lOR19QQVJFTlRIRVNFUyA9IE5POworCQkJCUdDQ19XQVJOX05PTl9WSVJUVUFMX0RFU1RSVUNUT1IgPSBOTzsKKwkJCQlHQ0NfV0FSTl9QRURBTlRJQyA9IE5POworCQkJCUdDQ19XQVJOX1NIQURPVyA9IE5POworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IE5POworCQkJCUdDQ19XQVJOX1RZUEVDSEVDS19DQUxMU19UT19QUklOVEYgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gTk87CisJCQkJR0NDX1dBUk5fVU5LTk9XTl9QUkFHTUFTID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX0ZVTkNUSU9OID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX0xBQkVMID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX1BBUkFNRVRFUiA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQUxVRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJR0VORVJBVEVfTUFTVEVSX09CSkVDVF9GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUEtHSU5GT19GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUFJPRklMSU5HX0NPREUgPSBOTzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJSU5GT1BMSVNUX0VYUEFORF9CVUlMRF9TRVRUSU5HUyA9IFlFUzsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICIiOworCQkJCUlORk9QTElTVF9PVEhFUl9QUkVQUk9DRVNTT1JfRkxBR1MgPSAiIjsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gTk87CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUlOSVRfUk9VVElORSA9ICIiOworCQkJCUlOU1RBTExfR1JPVVAgPSAiJChHUk9VUCkiOworCQkJCUlOU1RBTExfTU9ERV9GTEFHID0gImEtdyxhK3JYIjsKKwkJCQlJTlNUQUxMX09XTkVSID0gIiQoVVNFUikiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJS0VFUF9QUklWQVRFX0VYVEVSTlMgPSBOTzsKKwkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUxJTktFUl9ESVNQTEFZU19GSUxFU19GT1JfVU5ERUZJTkVEX1NZTUJPTFMgPSBZRVM7CisJCQkJTElOS0VSX0RJU1BMQVlTX01BTkdMRURfTkFNRVMgPSBOTzsKKwkJCQlMSU5LX1dJVEhfU1RBTkRBUkRfTElCUkFSSUVTID0gWUVTOworCQkJCU1BQ0hfT19UWVBFID0gIiI7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gIiQoaW5oZXJpdGVkKSI7CisJCQkJT0JKUk9PVCA9IEJ1aWxkL0ludGVybWVkaWF0ZXM7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlPTkxZX0xJTktfRVNTRU5USUFMX1NZTUJPTFMgPSBOTzsKKwkJCQlPVEhFUl9DRkxBR1MgPSAiIjsKKwkJCQlPVEhFUl9DUExVU1BMVVNGTEFHUyA9ICIkKE9USEVSX0NGTEFHUykiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJFQ09NUFNfSU5DTFVERV9IRUFERVJTX0ZST01fQlVJTFRfUFJPRFVDVFNfRElSID0gWUVTOworCQkJCVBSRUxJTktfRkxBR1MgPSAiIjsKKwkJCQlQUkVMSU5LX0xJQlMgPSAiIjsKKwkJCQlQUkVTRVJWRV9ERUFEX0NPREVfSU5JVFNfQU5EX1RFUk1TID0gTk87CisJCQkJUFJJVkFURV9IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUFJPRFVDVF9OQU1FID0gdHJlZXBhcnNlcjsKKwkJCQlQVUJMSUNfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVJFWl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlTQ0FOX0FMTF9TT1VSQ0VfRklMRVNfRk9SX0lOQ0xVREVTID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDEwLjY7CisJCQkJU0VDVE9SREVSX0ZMQUdTID0gIiI7CisJCQkJU0VQQVJBVEVfU1RSSVAgPSBOTzsKKwkJCQlTRVBBUkFURV9TWU1CT0xfRURJVCA9IE5POworCQkJCVNIQVJFRF9QUkVDT01QU19ESVIgPSAiJChDQUNIRV9ST09UKS9TaGFyZWRQcmVjb21waWxlZEhlYWRlcnMiOworCQkJCVNLSVBfSU5TVEFMTCA9IE5POworCQkJCVNUQU5EQVJEX0NfUExVU19QTFVTX0xJQlJBUllfVFlQRSA9IGR5bmFtaWM7CisJCQkJU1RSSVBGTEFHUyA9ICIiOworCQkJCVNUUklQX0lOU1RBTExFRF9QUk9EVUNUID0gIiI7CisJCQkJU1RSSVBfU1RZTEUgPSBhbGw7CisJCQkJU1lNUk9PVCA9IEJ1aWxkOworCQkJCVRFU1RfSE9TVCA9ICIiOworCQkJCVRFU1RfUklHID0gIiI7CisJCQkJVU5FWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlVU0VSX0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlWRVJTSU9OSU5HX1NZU1RFTSA9ICIiOworCQkJCVdBUk5JTkdfQ0ZMQUdTID0gIiI7CisJCQkJV0FSTklOR19MREZMQUdTID0gIiI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSAiIjsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBQzVBQ0E1MTJFN0JFRkUwMERGMEM1OCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMVEVSTkFURV9HUk9VUCA9ICIkKElOU1RBTExfR1JPVVApIjsKKwkJCQlBTFRFUk5BVEVfTU9ERSA9ICIkKElOU1RBTExfTU9ERV9GTEFHKSI7CisJCQkJQUxURVJOQVRFX09XTkVSID0gIiQoSU5TVEFMTF9PV05FUikiOworCQkJCUFMVEVSTkFURV9QRVJNSVNTSU9OU19GSUxFUyA9ICIiOworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBTlRMUl9ERUJVRyA9IFlFUzsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiL1VzZXJzL2Fjb25kaXQvUHJvamVjdHMvaWRlYS9hbnRscjMvY2xhc3NlczovVXNlcnMvYWNvbmRpdC9Qcm9qZWN0cy9pZGVhL3N0cmluZ3RlbXBsYXRlL2NsYXNzZXM6L0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciI7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy90cmVlcmV3cml0ZSI7CisJCQkJQU5UTFJfTElCX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy90cmVlcmV3cml0ZSI7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSCkiOworCQkJCUJVSUxEX1ZBUklBTlRTID0gbm9ybWFsOworCQkJCUJVTkRMRV9MT0FERVIgPSAiIjsKKwkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09ORklHVVJBVElPTl9URU1QX0RJUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpLyQoQ09ORklHVVJBVElPTikiOworCQkJCUNPUFlJTkdfUFJFU0VSVkVTX0hGU19EQVRBID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUNVUlJFTlRfUFJPSkVDVF9WRVJTSU9OID0gIiI7CisJCQkJREVBRF9DT0RFX1NUUklQUElORyA9IE5POworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IGR3YXJmOworCQkJCURFUExPWU1FTlRfTE9DQVRJT04gPSBOTzsKKwkJCQlERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk87CisJCQkJRFNUUk9PVCA9ICIvdG1wLyQoUFJPSkVDVF9OQU1FKS5kc3QiOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9ICIiOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9ICIiOworCQkJCUVYRUNVVEFCTEVfRVhURU5TSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9QUkVGSVggPSAiIjsKKwkJCQlFWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUdDQ19BTFRJVkVDX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfQVVUT19WRUNUT1JJWkFUSU9OID0gTk87CisJCQkJR0NDX0NIQVJfSVNfVU5TSUdORURfQ0hBUiA9IE5POworCQkJCUdDQ19DV19BU01fU1lOVEFYID0gWUVTOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZnVsbDsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0FTTV9LRVlXT1JEID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfUlRUSSA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1BBU0NBTF9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1NFM19FWFRFTlNJT05TID0gTk87CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19FTkFCTEVfVFJJR1JBUEhTID0gTk87CisJCQkJR0NDX0ZBU1RfTUFUSCA9IE5POworCQkJCUdDQ19GQVNUX09CSkNfRElTUEFUQ0ggPSBOTzsKKwkJCQlHQ0NfRkVFREJBQ0tfRElSRUNURURfT1BUSU1JWkFUSU9OID0gT2ZmOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfR0VORVJBVEVfVEVTVF9DT1ZFUkFHRV9GSUxFUyA9IE5POworCQkJCUdDQ19JTkNSRUFTRV9QUkVDT01QSUxFRF9IRUFERVJfU0hBUklORyA9IE5POworCQkJCUdDQ19JTkxJTkVTX0FSRV9QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfSU5QVVRfRklMRVRZUEUgPSBhdXRvbWF0aWM7CisJCQkJR0NDX0lOU1RSVU1FTlRfUFJPR1JBTV9GTE9XX0FSQ1MgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfUFBDNjQgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX05PX0NPTU1PTl9CTE9DS1MgPSBOTzsKKwkJCQlHQ0NfT0JKQ19DQUxMX0NYWF9DRFRPUlMgPSBOTzsKKwkJCQlHQ0NfT05FX0JZVEVfQk9PTCA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QRkVfRklMRV9DX0RJQUxFQ1RTID0gImMgb2JqZWN0aXZlLWMgYysrIG9iamVjdGl2ZS1jKysiOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19OT1RfVVNFRF9JTl9QUkVDT01QUyA9ICIiOworCQkJCUdDQ19SRVVTRV9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19TSE9SVF9FTlVNUyA9IE5POworCQkJCUdDQ19TVFJJQ1RfQUxJQVNJTkcgPSBOTzsKKwkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfVEhSRUFEU0FGRV9TVEFUSUNTID0gWUVTOworCQkJCUdDQ19UUkVBVF9OT05DT05GT1JNQU5UX0NPREVfRVJST1JTX0FTX1dBUk5JTkdTID0gTk87CisJCQkJR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyA9IE5POworCQkJCUdDQ19VTlJPTExfTE9PUFMgPSBOTzsKKwkJCQlHQ0NfVVNFX0dDQzNfUEZFX1NVUFBPUlQgPSAiJChVU0VfR0NDM19QRkVfU1VQUE9SVCkiOworCQkJCUdDQ19XQVJOX0FCT1VUX0RFUFJFQ0FURURfRlVOQ1RJT05TID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX0lOVkFMSURfT0ZGU0VUT0ZfTUFDUk8gPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19ORVdMSU5FID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19QUk9UT1RZUEVTID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfUE9JTlRFUl9TSUdORURORVNTID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX0FMTE9XX0lOQ09NUExFVEVfUFJPVE9DT0wgPSBZRVM7CisJCQkJR0NDX1dBUk5fQ0hFQ0tfU1dJVENIX1NUQVRFTUVOVFMgPSBZRVM7CisJCQkJR0NDX1dBUk5fRUZGRUNUSVZFX0NQTFVTUExVU19WSU9MQVRJT05TID0gTk87CisJCQkJR0NDX1dBUk5fRk9VUl9DSEFSQUNURVJfQ09OU1RBTlRTID0gTk87CisJCQkJR0NDX1dBUk5fSElEREVOX1ZJUlRVQUxfRlVOQ1RJT05TID0gTk87CisJCQkJR0NDX1dBUk5fSU5ISUJJVF9BTExfV0FSTklOR1MgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTklUSUFMSVpFUl9OT1RfRlVMTFlfQlJBQ0tFVEVEID0gTk87CisJCQkJR0NDX1dBUk5fTUlTU0lOR19QQVJFTlRIRVNFUyA9IE5POworCQkJCUdDQ19XQVJOX05PTl9WSVJUVUFMX0RFU1RSVUNUT1IgPSBOTzsKKwkJCQlHQ0NfV0FSTl9QRURBTlRJQyA9IE5POworCQkJCUdDQ19XQVJOX1NIQURPVyA9IE5POworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IE5POworCQkJCUdDQ19XQVJOX1RZUEVDSEVDS19DQUxMU19UT19QUklOVEYgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gTk87CisJCQkJR0NDX1dBUk5fVU5LTk9XTl9QUkFHTUFTID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX0ZVTkNUSU9OID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX0xBQkVMID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX1BBUkFNRVRFUiA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQUxVRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJR0VORVJBVEVfTUFTVEVSX09CSkVDVF9GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUEtHSU5GT19GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUFJPRklMSU5HX0NPREUgPSBOTzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJSU5GT1BMSVNUX0VYUEFORF9CVUlMRF9TRVRUSU5HUyA9IFlFUzsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICIiOworCQkJCUlORk9QTElTVF9PVEhFUl9QUkVQUk9DRVNTT1JfRkxBR1MgPSAiIjsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gTk87CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUlOSVRfUk9VVElORSA9ICIiOworCQkJCUlOU1RBTExfR1JPVVAgPSAiJChHUk9VUCkiOworCQkJCUlOU1RBTExfTU9ERV9GTEFHID0gImEtdyxhK3JYIjsKKwkJCQlJTlNUQUxMX09XTkVSID0gIiQoVVNFUikiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJS0VFUF9QUklWQVRFX0VYVEVSTlMgPSBOTzsKKwkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUxJTktFUl9ESVNQTEFZU19GSUxFU19GT1JfVU5ERUZJTkVEX1NZTUJPTFMgPSBZRVM7CisJCQkJTElOS0VSX0RJU1BMQVlTX01BTkdMRURfTkFNRVMgPSBOTzsKKwkJCQlMSU5LX1dJVEhfU1RBTkRBUkRfTElCUkFSSUVTID0gWUVTOworCQkJCU1BQ0hfT19UWVBFID0gIiI7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gIiQoaW5oZXJpdGVkKSI7CisJCQkJT0JKUk9PVCA9IC9Vc2Vycy9hY29uZGl0L1Byb2plY3RzL0ludGVybWVkaWF0ZXM7CisJCQkJT05MWV9MSU5LX0VTU0VOVElBTF9TWU1CT0xTID0gTk87CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfQ1BMVVNQTFVTRkxBR1MgPSAiJChPVEhFUl9DRkxBR1MpIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBSRUNPTVBTX0lOQ0xVREVfSEVBREVSU19GUk9NX0JVSUxUX1BST0RVQ1RTX0RJUiA9IFlFUzsKKwkJCQlQUkVMSU5LX0ZMQUdTID0gIiI7CisJCQkJUFJFTElOS19MSUJTID0gIiI7CisJCQkJUFJFU0VSVkVfREVBRF9DT0RFX0lOSVRTX0FORF9URVJNUyA9IE5POworCQkJCVBSSVZBVEVfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVyZXdyaXRlOworCQkJCVBVQkxJQ19IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUkVaX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVNDQU5fQUxMX1NPVVJDRV9GSUxFU19GT1JfSU5DTFVERVMgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNDsKKwkJCQlTRUNUT1JERVJfRkxBR1MgPSAiIjsKKwkJCQlTRVBBUkFURV9TVFJJUCA9IE5POworCQkJCVNFUEFSQVRFX1NZTUJPTF9FRElUID0gTk87CisJCQkJU0hBUkVEX1BSRUNPTVBTX0RJUiA9ICIkKENBQ0hFX1JPT1QpL1NoYXJlZFByZWNvbXBpbGVkSGVhZGVycyI7CisJCQkJU0tJUF9JTlNUQUxMID0gTk87CisJCQkJU1RBTkRBUkRfQ19QTFVTX1BMVVNfTElCUkFSWV9UWVBFID0gZHluYW1pYzsKKwkJCQlTVFJJUEZMQUdTID0gIiI7CisJCQkJU1RSSVBfSU5TVEFMTEVEX1BST0RVQ1QgPSAiIjsKKwkJCQlTVFJJUF9TVFlMRSA9IGFsbDsKKwkJCQlTWU1ST09UID0gL1VzZXJzL2Fjb25kaXQvUHJvamVjdHMvQW50bHIvQnVpbGQ7CisJCQkJVEVTVF9IT1NUID0gIiI7CisJCQkJVEVTVF9SSUcgPSAiIjsKKwkJCQlVTkVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiIjsKKwkJCQlXQVJOSU5HX0xERkxBR1MgPSAiIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9ICIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCTFBQzVBQ0E2MTJFN0JFRkUwMERGMEM1OCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMVEVSTkFURV9HUk9VUCA9ICIkKElOU1RBTExfR1JPVVApIjsKKwkJCQlBTFRFUk5BVEVfTU9ERSA9ICIkKElOU1RBTExfTU9ERV9GTEFHKSI7CisJCQkJQUxURVJOQVRFX09XTkVSID0gIiQoSU5TVEFMTF9PV05FUikiOworCQkJCUFMVEVSTkFURV9QRVJNSVNTSU9OU19GSUxFUyA9ICIiOworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICgKKwkJCQkJcHBjLAorCQkJCQlpMzg2LAorCQkJCSk7CisJCQkJQlVJTERfVkFSSUFOVFMgPSBub3JtYWw7CisJCQkJQlVORExFX0xPQURFUiA9ICIiOworCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09QWUlOR19QUkVTRVJWRVNfSEZTX0RBVEEgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCUNVUlJFTlRfUFJPSkVDVF9WRVJTSU9OID0gIiI7CisJCQkJREVBRF9DT0RFX1NUUklQUElORyA9IE5POworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IHN0YWJzOworCQkJCURFUExPWU1FTlRfTE9DQVRJT04gPSBOTzsKKwkJCQlERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk87CisJCQkJRFNUUk9PVCA9ICIvdG1wLyQoUFJPSkVDVF9OQU1FKS5kc3QiOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9ICIiOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9ICIiOworCQkJCUVYRUNVVEFCTEVfRVhURU5TSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9QUkVGSVggPSAiIjsKKwkJCQlFWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUdDQ19BTFRJVkVDX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfQVVUT19WRUNUT1JJWkFUSU9OID0gTk87CisJCQkJR0NDX0NIQVJfSVNfVU5TSUdORURfQ0hBUiA9IE5POworCQkJCUdDQ19DV19BU01fU1lOVEFYID0gWUVTOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZGVmYXVsdDsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9BU01fS0VZV09SRCA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0NQUF9FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX1JUVEkgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9QQVNDQUxfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NTRTNfRVhURU5TSU9OUyA9IE5POworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9UUklHUkFQSFMgPSBOTzsKKwkJCQlHQ0NfRkFTVF9NQVRIID0gTk87CisJCQkJR0NDX0ZBU1RfT0JKQ19ESVNQQVRDSCA9IE5POworCQkJCUdDQ19GRUVEQkFDS19ESVJFQ1RFRF9PUFRJTUlaQVRJT04gPSBPZmY7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX1RFU1RfQ09WRVJBR0VfRklMRVMgPSBOTzsKKwkJCQlHQ0NfSU5DUkVBU0VfUFJFQ09NUElMRURfSEVBREVSX1NIQVJJTkcgPSBOTzsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX0lOUFVUX0ZJTEVUWVBFID0gYXV0b21hdGljOworCQkJCUdDQ19JTlNUUlVNRU5UX1BST0dSQU1fRkxPV19BUkNTID0gTk87CisJCQkJR0NDX01PREVMX1BQQzY0ID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19OT19DT01NT05fQkxPQ0tTID0gTk87CisJCQkJR0NDX09CSkNfQ0FMTF9DWFhfQ0RUT1JTID0gTk87CisJCQkJR0NDX09ORV9CWVRFX0JPT0wgPSBOTzsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gczsKKwkJCQlHQ0NfUEZFX0ZJTEVfQ19ESUFMRUNUUyA9ICJjIG9iamVjdGl2ZS1jIGMrKyBvYmplY3RpdmUtYysrIjsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfTk9UX1VTRURfSU5fUFJFQ09NUFMgPSAiIjsKKwkJCQlHQ0NfUkVVU0VfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfU0hPUlRfRU5VTVMgPSBOTzsKKwkJCQlHQ0NfU1RSSUNUX0FMSUFTSU5HID0gTk87CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1RIUkVBRFNBRkVfU1RBVElDUyA9IFlFUzsKKwkJCQlHQ0NfVFJFQVRfTk9OQ09ORk9STUFOVF9DT0RFX0VSUk9SU19BU19XQVJOSU5HUyA9IE5POworCQkJCUdDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMgPSBOTzsKKwkJCQlHQ0NfVU5ST0xMX0xPT1BTID0gTk87CisJCQkJR0NDX1VTRV9HQ0MzX1BGRV9TVVBQT1JUID0gIiQoVVNFX0dDQzNfUEZFX1NVUFBPUlQpIjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9ERVBSRUNBVEVEX0ZVTkNUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9JTlZBTElEX09GRlNFVE9GX01BQ1JPID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX01JU1NJTkdfTkVXTElORSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX1BST1RPVFlQRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9QT0lOVEVSX1NJR05FRE5FU1MgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUxMT1dfSU5DT01QTEVURV9QUk9UT0NPTCA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9DSEVDS19TV0lUQ0hfU1RBVEVNRU5UUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9FRkZFQ1RJVkVfQ1BMVVNQTFVTX1ZJT0xBVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9GT1VSX0NIQVJBQ1RFUl9DT05TVEFOVFMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9ISURERU5fVklSVFVBTF9GVU5DVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTkhJQklUX0FMTF9XQVJOSU5HUyA9IE5POworCQkJCUdDQ19XQVJOX0lOSVRJQUxJWkVSX05PVF9GVUxMWV9CUkFDS0VURUQgPSBOTzsKKwkJCQlHQ0NfV0FSTl9NSVNTSU5HX1BBUkVOVEhFU0VTID0gTk87CisJCQkJR0NDX1dBUk5fTk9OX1ZJUlRVQUxfREVTVFJVQ1RPUiA9IE5POworCQkJCUdDQ19XQVJOX1BFREFOVElDID0gTk87CisJCQkJR0NDX1dBUk5fU0hBRE9XID0gWUVTOworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9UWVBFQ0hFQ0tfQ0FMTFNfVE9fUFJJTlRGID0gTk87CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTktOT1dOX1BSQUdNQVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfRlVOQ1RJT04gPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfTEFCRUwgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfUEFSQU1FVEVSID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQUxVRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJR0VORVJBVEVfTUFTVEVSX09CSkVDVF9GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUEtHSU5GT19GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUFJPRklMSU5HX0NPREUgPSBOTzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJSU5GT1BMSVNUX0VYUEFORF9CVUlMRF9TRVRUSU5HUyA9IFlFUzsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICIiOworCQkJCUlORk9QTElTVF9PVEhFUl9QUkVQUk9DRVNTT1JfRkxBR1MgPSAiIjsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gTk87CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUlOSVRfUk9VVElORSA9ICIiOworCQkJCUlOU1RBTExfR1JPVVAgPSAiJChHUk9VUCkiOworCQkJCUlOU1RBTExfTU9ERV9GTEFHID0gImEtdyxhK3JYIjsKKwkJCQlJTlNUQUxMX09XTkVSID0gIiQoVVNFUikiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJS0VFUF9QUklWQVRFX0VYVEVSTlMgPSBOTzsKKwkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUxJTktFUl9ESVNQTEFZU19GSUxFU19GT1JfVU5ERUZJTkVEX1NZTUJPTFMgPSBZRVM7CisJCQkJTElOS0VSX0RJU1BMQVlTX01BTkdMRURfTkFNRVMgPSBOTzsKKwkJCQlMSU5LX1dJVEhfU1RBTkRBUkRfTElCUkFSSUVTID0gWUVTOworCQkJCU1BQ0hfT19UWVBFID0gIiI7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gIiQoaW5oZXJpdGVkKSI7CisJCQkJT0JKUk9PVCA9IC9Vc2Vycy9rcm9lcGtlL1Byb2plY3RzL0ludGVybWVkaWF0ZXM7CisJCQkJT05MWV9MSU5LX0VTU0VOVElBTF9TWU1CT0xTID0gTk87CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfQ1BMVVNQTFVTRkxBR1MgPSAiJChPVEhFUl9DRkxBR1MpIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBSRUNPTVBTX0lOQ0xVREVfSEVBREVSU19GUk9NX0JVSUxUX1BST0RVQ1RTX0RJUiA9IFlFUzsKKwkJCQlQUkVMSU5LX0ZMQUdTID0gIiI7CisJCQkJUFJFTElOS19MSUJTID0gIiI7CisJCQkJUFJFU0VSVkVfREVBRF9DT0RFX0lOSVRTX0FORF9URVJNUyA9IE5POworCQkJCVBSSVZBVEVfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVyZXdyaXRlOworCQkJCVBVQkxJQ19IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUkVaX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVNDQU5fQUxMX1NPVVJDRV9GSUxFU19GT1JfSU5DTFVERVMgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNDsKKwkJCQlTRUNUT1JERVJfRkxBR1MgPSAiIjsKKwkJCQlTRVBBUkFURV9TVFJJUCA9IE5POworCQkJCVNFUEFSQVRFX1NZTUJPTF9FRElUID0gTk87CisJCQkJU0hBUkVEX1BSRUNPTVBTX0RJUiA9ICIkKENBQ0hFX1JPT1QpL1NoYXJlZFByZWNvbXBpbGVkSGVhZGVycyI7CisJCQkJU0tJUF9JTlNUQUxMID0gTk87CisJCQkJU1RBTkRBUkRfQ19QTFVTX1BMVVNfTElCUkFSWV9UWVBFID0gZHluYW1pYzsKKwkJCQlTVFJJUEZMQUdTID0gIiI7CisJCQkJU1RSSVBfSU5TVEFMTEVEX1BST0RVQ1QgPSAiIjsKKwkJCQlTVFJJUF9TVFlMRSA9IGFsbDsKKwkJCQlTWU1ST09UID0gL1VzZXJzL2tyb2Vwa2UvUHJvamVjdHMvQnVpbGQ7CisJCQkJVEVTVF9IT1NUID0gIiI7CisJCQkJVEVTVF9SSUcgPSAiIjsKKwkJCQlVTkVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiIjsKKwkJCQlXQVJOSU5HX0xERkxBR1MgPSAiIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9ICIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxREVCOTFBRTA4NzMzREE1MDAxMEU5Q0QgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfSkFWQV9BUkdTID0gIi9MaWJyYXJ5L0phdmEvRXh0ZW5zaW9ucy9hbnRsci0yLjcuNy5qYXI6L1VzZXJzL2Fjb25kaXQvSWRlYVByb2plY3RzL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L1VzZXJzL2Fjb25kaXQvSWRlYVByb2plY3RzL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9zdHJpbmd0ZW1wbGF0ZSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUNVUlJFTlRfUFJPSkVDVF9WRVJTSU9OID0gMTsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSBkd2FyZjsKKwkJCQlERVBMT1lNRU5UX0xPQ0FUSU9OID0gTk87CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OworCQkJCUdDQ19ERUJVR0dJTkdfU1lNQk9MUyA9IGZ1bGw7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNDsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gQU5UTFJfUHJlZml4LnBjaDsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gTk87CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSBJbmZvLnBsaXN0OworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL0xpYnJhcnkvRnJhbWV3b3JrcyI7CisJCQkJUFJPRFVDVF9OQU1FID0gQU5UTFI7CisJCQkJVkVSU0lPTklOR19TWVNURU0gPSAiYXBwbGUtZ2VuZXJpYyI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBmcmFtZXdvcms7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxREVCOTFBRjA4NzMzREE1MDAxMEU5Q0QgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICgKKwkJCQkJcHBjLAorCQkJCQlpMzg2LAorCQkJCSk7CisJCQkJQlVJTERfVkFSSUFOVFMgPSAoCisJCQkJCW5vcm1hbCwKKwkJCQkJZGVidWcsCisJCQkJKTsKKwkJCQlDVVJSRU5UX1BST0pFQ1RfVkVSU0lPTiA9IDE7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gZHdhcmY7CisJCQkJRFlMSUJfQ09NUEFUSUJJTElUWV9WRVJTSU9OID0gMTsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAxOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSBBTlRMUl9QcmVmaXgucGNoOworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiOworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gImFwcGxlLWdlbmVyaWMiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gZnJhbWV3b3JrOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxREVCOTFCMjA4NzMzREE1MDAxMEU5Q0QgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfQVJHUyA9ICIiOworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIiOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IGR3YXJmOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZnVsbDsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSBzdXBwb3J0ZWQ7CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAxOworCQkJCUdDQ19XQVJOX0FCT1VUX01JU1NJTkdfTkVXTElORSA9IE5POworCQkJCUdDQ19XQVJOX0FCT1VUX1BPSU5URVJfU0lHTkVETkVTUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9DSEVDS19TV0lUQ0hfU1RBVEVNRU5UUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9TSEFET1cgPSBOTzsKKwkJCQlHQ0NfV0FSTl9TSUdOX0NPTVBBUkUgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9QQVJBTUVURVIgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFMVUUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNjsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFERUI5MUIzMDg3MzNEQTUwMDEwRTlDRCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0VYVFJBX0FSR1MgPSAiIjsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiIjsKKwkJCQlBUkNIUyA9ICgKKwkJCQkJcHBjLAorCQkJCQlpMzg2LAorCQkJCSk7CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX05FV0xJTkUgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fQ0hFQ0tfU1dJVENIX1NUQVRFTUVOVFMgPSBZRVM7CisJCQkJR0NDX1dBUk5fU0hBRE9XID0gWUVTOworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9QQVJBTUVURVIgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBTFVFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDEwLjY7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY3MDBFODZEMEE1RkEzNEQwMDVEMDc1NyAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiL3Vzci9zaGFyZS9qYXZhL2FudGxyLTIuNy43LmphcjovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL2FudGxyMzovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL3N0cmluZ3RlbXBsYXRlIjsKKwkJCQlBTlRMUl9GT1JDRV9PVVRfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2NvbWJpbmVkIjsKKwkJCQlBTlRMUl9MSUJfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2NvbWJpbmVkIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDE7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IGNvbWJpbmVkOworCQkJCVpFUk9fTElOSyA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUY3MDBFODZFMEE1RkEzNEQwMDVEMDc1NyAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gY29tYmluZWQ7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY3MDBFQ0REMEE1RkUxQkYwMDVEMDc1NyAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTlRMUl9ERUJVRyA9IFlFUzsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiL3Vzci9zaGFyZS9qYXZhL2FudGxyLTIuNy43LmphcjovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL2FudGxyMzovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL3N0cmluZ3RlbXBsYXRlIjsKKwkJCQlBTlRMUl9GT1JDRV9PVVRfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL0xMLXN0YXIiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvTEwtc3RhciI7CisJCQkJQU5UTFJfWF9ERUJVR19TVCA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSBkd2FyZjsKKwkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc0OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gIkxMLXN0YXIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjcwMEVDREUwQTVGRTFCRjAwNUQwNzU3IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSBzdGFiczsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gIkxMLXN0YXIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGNzAzN0VCOTBBMDVBRkVGMDA3MDQzNUQgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfSkFWQV9BUkdTID0gIi91c3Ivc2hhcmUvamF2YS9hbnRsci0yLjcuNy5qYXI6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9zdHJpbmd0ZW1wbGF0ZSI7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlIjsKKwkJCQlBTlRMUl9MSUJfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9QQVNDQUxfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJSU5TVEFMTF9QQVRIID0gQnVpbGQ7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlGNzAzN0VCQTBBMDVBRkVGMDA3MDQzNUQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9ICJsZXhlcnRlc3Qtc2ltcGxlIjsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJRjcyQzVFNjcwQUI3RTRDOTAwMjgyNTc0IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0RFQlVHID0gWUVTOworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIvdXNyL3NoYXJlL2phdmEvYW50bHItMi43LjcuamFyOi91c3Ivc2hhcmUvamF2YS9hbnRscjMvb3V0L3Byb2R1Y3Rpb24vYW50bHIzOi91c3Ivc2hhcmUvamF2YS9hbnRscjMvb3V0L3Byb2R1Y3Rpb24vc3RyaW5ndGVtcGxhdGUiOworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvc2ltcGxlQ1RyZWVQYXJzZXIiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvc2ltcGxlQ1RyZWVQYXJzZXIiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gTk87CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IHNpbXBsZWN0cmVlOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjcyQzVFNjgwQUI3RTRDOTAwMjgyNTc0IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBzaW1wbGVjdHJlZTsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJRjc2Mjg3NDEwQjcxNTFCOTAwNkFBN0VGIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIvdXNyL3NoYXJlL2phdmEvYW50bHItMi43LjcuamFyOi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscl9zcmMvY29kZS9hbnRsci9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyX3NyYy9jb2RlL2FudGxyL291dC9wcm9kdWN0aW9uL3N0cmluZ3RlbXBsYXRlIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCVBST0RVQ1RfTkFNRSA9IFVudGl0bGVkOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3NDIwQjcxNTFCOTAwNkFBN0VGIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfSkFWQV9BUkdTID0gIkFOVExSX0VYVFJBX0pBVkFfQVJHUyA9IC91c3Ivc2hhcmUvamF2YS9hbnRsci0yLjcuNy5qYXI6L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyX3NyYy9jb2RlL2FudGxyL291dC9wcm9kdWN0aW9uL2FudGxyMzovVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHJfc3JjL2NvZGUvYW50bHIvb3V0L3Byb2R1Y3Rpb24vc3RyaW5ndGVtcGxhdGVcbiI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBVbnRpdGxlZDsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJRjc2Mjg3NDcwQjcxNTIwMTAwNkFBN0VGIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IGZ1enp5OworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3NDgwQjcxNTIwMTAwNkFBN0VGIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gZnV6enk7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY3NjI4NzdBMEI3MTU1N0UwMDZBQTdFRiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlGNzYyODc3QjBCNzE1NTdFMDA2QUE3RUYgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBmdXp6eTsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJRjc2Mjg3ODAwQjcxNTU5QzAwNkFBN0VGIC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IGNvbWJpbmVkOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3ODEwQjcxNTU5QzAwNkFBN0VGIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gY29tYmluZWQ7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY3NjI4Nzg0MEI3MTU1OUYwMDZBQTdFRiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAiTEwtc3RhciI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlGNzYyODc4NTBCNzE1NTlGMDA2QUE3RUYgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSAiTEwtc3RhciI7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY3NjI4Nzg4MEI3MTU1QTIwMDZBQTdFRiAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSBob2lzdGVkUHJlZGljYXRlczsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUY3NjI4Nzg5MEI3MTU1QTIwMDZBQTdFRiAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IGhvaXN0ZWRQcmVkaWNhdGVzOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGNzYyODc4QzBCNzE1NUFCMDA2QUE3RUYgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gc2NvcGVzOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3OEQwQjcxNTVBQjAwNkFBN0VGIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gc2NvcGVzOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGNzYyODc5MDBCNzE1NUFGMDA2QUE3RUYgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQlVJTERfU0VUVElORyA9IE5POworCQkJCUdSQU1NQVJfU0VUVElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IHNpbXBsZWN0cmVlOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3OTEwQjcxNTVBRjAwNkFBN0VGIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gInNpbXBsZWMgdHJlZSI7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCUY3OUQ1NjcwMEEwRTIzRDYwMEVBM0NFRSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiL3Vzci9zaGFyZS9qYXZhL2FudGxyLTIuNy43LmphcjovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL2FudGxyMzovdXNyL3NoYXJlL2phdmEvYW50bHIzL291dC9wcm9kdWN0aW9uL3N0cmluZ3RlbXBsYXRlIjsKKwkJCQlBTlRMUl9GT1JDRV9PVVRfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2Z1enp5IjsKKwkJCQlBTlRMUl9MSUJfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2Z1enp5IjsKKwkJCQlBTlRMUl9UUkFDRSA9IE5POworCQkJCUFOVExSX1hfREVCVUdfU1QgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNDsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IGZ1enp5OworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc5RDU2NzEwQTBFMjNENjAwRUEzQ0VFIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBmdXp6eTsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJRjdDNTYyMzAwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfQVJHUyA9ICIiOworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIiOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IGR3YXJmOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZnVsbDsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19ORVdMSU5FID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfUE9JTlRFUl9TSUdORURORVNTID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX0NIRUNLX1NXSVRDSF9TVEFURU1FTlRTID0gWUVTOworCQkJCUdDQ19XQVJOX1NIQURPVyA9IE5POworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IE5POworCQkJCUdDQ19XQVJOX1VOSU5JVElBTElaRURfQVVUT1MgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1BBUkFNRVRFUiA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQUxVRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVNES1JPT1QgPSBtYWNvc3gxMC42OworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjMxMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlDVVJSRU5UX1BST0pFQ1RfVkVSU0lPTiA9IDE7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gZHdhcmY7CisJCQkJREVQTE9ZTUVOVF9MT0NBVElPTiA9IE5POworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0NfTEFOR1VBR0VfU1RBTkRBUkQgPSBnbnU5OTsKKwkJCQlHQ0NfREVCVUdHSU5HX1NZTUJPTFMgPSBmdWxsOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzQ7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9IEFOVExSX1ByZWZpeC5wY2g7CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IE5POworCQkJCUlORk9QTElTVF9GSUxFID0gSW5mby5wbGlzdDsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9MaWJyYXJ5L0ZyYW1ld29ya3MiOworCQkJCVBST0RVQ1RfTkFNRSA9IEFOVExSOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gImFwcGxlLWdlbmVyaWMiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gZnJhbWV3b3JrOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjMzMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIvdXNyL3NoYXJlL2phdmEvYW50bHItMi43LjcuamFyOi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscl9zcmMvY29kZS9hbnRsci9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyX3NyYy9jb2RlL2FudGxyL291dC9wcm9kdWN0aW9uL3N0cmluZ3RlbXBsYXRlIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCVBST0RVQ1RfTkFNRSA9IFVudGl0bGVkOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjM0MENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQkJQU5UTFJfTElCX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfUEFTQ0FMX1NUUklOR1MgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyMzUwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gImxleGVydGVzdC1zaW1wbGUiOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjM2MENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvZnV6enkiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvZnV6enkiOworCQkJCUFOVExSX1RSQUNFID0gTk87CisJCQkJQU5UTFJfWF9ERUJVR19TVCA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc0OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gZnV6enk7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyMzcwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gZnV6enk7CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyMzgwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9jb21iaW5lZCI7CisJCQkJQU5UTFJfTElCX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9jb21iaW5lZCI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gY29tYmluZWQ7CisJCQkJWkVST19MSU5LID0gWUVTOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjM5MENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IGNvbWJpbmVkOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjNBMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0RFQlVHID0gWUVTOworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvTEwtc3RhciI7CisJCQkJQU5UTFJfTElCX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9MTC1zdGFyIjsKKwkJCQlBTlRMUl9YX0RFQlVHX1NUID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IGR3YXJmOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzQ7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiTEwtc3RhciI7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyM0IwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gIkxMLXN0YXIiOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjNDMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMiOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0gpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlJTlNUQUxMX1BBVEggPSAiJChIT01FKS9iaW4iOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJRm91bmRhdGlvbiwKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlBcHBLaXQsCisJCQkJKTsKKwkJCQlQUkVCSU5ESU5HID0gTk87CisJCQkJUFJPRFVDVF9OQU1FID0gaG9pc3RlZFByZWRpY2F0ZXM7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyM0QwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gaG9pc3RlZFByZWRpY2F0ZXM7CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyM0UwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9zY29wZXMiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvc2NvcGVzIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBzY29wZXM7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9ICJEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnIjsKKwkJfTsKKwkJRjdDNTYyM0YwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJUFJPRFVDVF9OQU1FID0gc2NvcGVzOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjQwMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFOVExSX0RFQlVHID0gWUVTOworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvc2ltcGxlQ1RyZWVQYXJzZXIiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvc2ltcGxlQ1RyZWVQYXJzZXIiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFMgPSBZRVM7CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gTk87CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IHNpbXBsZWN0cmVlOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjQxMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9ICJzaW1wbGVjIHRyZWUiOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjQyMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMVEVSTkFURV9HUk9VUCA9ICIkKElOU1RBTExfR1JPVVApIjsKKwkJCQlBTFRFUk5BVEVfTU9ERSA9ICIkKElOU1RBTExfTU9ERV9GTEFHKSI7CisJCQkJQUxURVJOQVRFX09XTkVSID0gIiQoSU5TVEFMTF9PV05FUikiOworCQkJCUFMVEVSTkFURV9QRVJNSVNTSU9OU19GSUxFUyA9ICIiOworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBTlRMUl9ERUJVRyA9IFlFUzsKKwkJCQlBTlRMUl9FWFRSQV9KQVZBX0FSR1MgPSAiL1VzZXJzL2Fjb25kaXQvUHJvamVjdHMvaWRlYS9hbnRscjMvY2xhc3NlczovVXNlcnMvYWNvbmRpdC9Qcm9qZWN0cy9pZGVhL3N0cmluZ3RlbXBsYXRlL2NsYXNzZXM6L0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciI7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy90cmVlcmV3cml0ZSI7CisJCQkJQU5UTFJfTElCX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy90cmVlcmV3cml0ZSI7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSCkiOworCQkJCUJVSUxEX1ZBUklBTlRTID0gbm9ybWFsOworCQkJCUJVTkRMRV9MT0FERVIgPSAiIjsKKwkJCQlDT05GSUdVUkFUSU9OX0JVSUxEX0RJUiA9ICIkKEJVSUxEX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09ORklHVVJBVElPTl9URU1QX0RJUiA9ICIkKFBST0pFQ1RfVEVNUF9ESVIpLyQoQ09ORklHVVJBVElPTikiOworCQkJCUNPUFlJTkdfUFJFU0VSVkVTX0hGU19EQVRBID0gTk87CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUNVUlJFTlRfUFJPSkVDVF9WRVJTSU9OID0gIiI7CisJCQkJREVBRF9DT0RFX1NUUklQUElORyA9IE5POworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IGR3YXJmOworCQkJCURFUExPWU1FTlRfTE9DQVRJT04gPSBOTzsKKwkJCQlERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk87CisJCQkJRFNUUk9PVCA9ICIvdG1wLyQoUFJPSkVDVF9OQU1FKS5kc3QiOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9ICIiOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9ICIiOworCQkJCUVYRUNVVEFCTEVfRVhURU5TSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9QUkVGSVggPSAiIjsKKwkJCQlFWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUdDQ19BTFRJVkVDX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfQVVUT19WRUNUT1JJWkFUSU9OID0gTk87CisJCQkJR0NDX0NIQVJfSVNfVU5TSUdORURfQ0hBUiA9IE5POworCQkJCUdDQ19DV19BU01fU1lOVEFYID0gWUVTOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZnVsbDsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX0FTTV9LRVlXT1JEID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9DUFBfUlRUSSA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0ZJWF9BTkRfQ09OVElOVUUgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1BBU0NBTF9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19FTkFCTEVfU1NFM19FWFRFTlNJT05TID0gTk87CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19FTkFCTEVfVFJJR1JBUEhTID0gTk87CisJCQkJR0NDX0ZBU1RfTUFUSCA9IE5POworCQkJCUdDQ19GQVNUX09CSkNfRElTUEFUQ0ggPSBOTzsKKwkJCQlHQ0NfRkVFREJBQ0tfRElSRUNURURfT1BUSU1JWkFUSU9OID0gT2ZmOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfR0VORVJBVEVfVEVTVF9DT1ZFUkFHRV9GSUxFUyA9IE5POworCQkJCUdDQ19JTkNSRUFTRV9QUkVDT01QSUxFRF9IRUFERVJfU0hBUklORyA9IE5POworCQkJCUdDQ19JTkxJTkVTX0FSRV9QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfSU5QVVRfRklMRVRZUEUgPSBhdXRvbWF0aWM7CisJCQkJR0NDX0lOU1RSVU1FTlRfUFJPR1JBTV9GTE9XX0FSQ1MgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfUFBDNjQgPSBOTzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX05PX0NPTU1PTl9CTE9DS1MgPSBOTzsKKwkJCQlHQ0NfT0JKQ19DQUxMX0NYWF9DRFRPUlMgPSBOTzsKKwkJCQlHQ0NfT05FX0JZVEVfQk9PTCA9IE5POworCQkJCUdDQ19PUFRJTUlaQVRJT05fTEVWRUwgPSAwOworCQkJCUdDQ19QRkVfRklMRV9DX0RJQUxFQ1RTID0gImMgb2JqZWN0aXZlLWMgYysrIG9iamVjdGl2ZS1jKysiOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiJChTWVNURU1fTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yay9IZWFkZXJzL0FwcEtpdC5oIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19OT1RfVVNFRF9JTl9QUkVDT01QUyA9ICIiOworCQkJCUdDQ19SRVVTRV9TVFJJTkdTID0gWUVTOworCQkJCUdDQ19TSE9SVF9FTlVNUyA9IE5POworCQkJCUdDQ19TVFJJQ1RfQUxJQVNJTkcgPSBOTzsKKwkJCQlHQ0NfU1lNQk9MU19QUklWQVRFX0VYVEVSTiA9IFlFUzsKKwkJCQlHQ0NfVEhSRUFEU0FGRV9TVEFUSUNTID0gWUVTOworCQkJCUdDQ19UUkVBVF9OT05DT05GT1JNQU5UX0NPREVfRVJST1JTX0FTX1dBUk5JTkdTID0gTk87CisJCQkJR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyA9IE5POworCQkJCUdDQ19VTlJPTExfTE9PUFMgPSBOTzsKKwkJCQlHQ0NfVVNFX0dDQzNfUEZFX1NVUFBPUlQgPSAiJChVU0VfR0NDM19QRkVfU1VQUE9SVCkiOworCQkJCUdDQ19XQVJOX0FCT1VUX0RFUFJFQ0FURURfRlVOQ1RJT05TID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX0lOVkFMSURfT0ZGU0VUT0ZfTUFDUk8gPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19ORVdMSU5FID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfTUlTU0lOR19QUk9UT1RZUEVTID0gTk87CisJCQkJR0NDX1dBUk5fQUJPVVRfUE9JTlRFUl9TSUdORURORVNTID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFID0gWUVTOworCQkJCUdDQ19XQVJOX0FMTE9XX0lOQ09NUExFVEVfUFJPVE9DT0wgPSBZRVM7CisJCQkJR0NDX1dBUk5fQ0hFQ0tfU1dJVENIX1NUQVRFTUVOVFMgPSBZRVM7CisJCQkJR0NDX1dBUk5fRUZGRUNUSVZFX0NQTFVTUExVU19WSU9MQVRJT05TID0gTk87CisJCQkJR0NDX1dBUk5fRk9VUl9DSEFSQUNURVJfQ09OU1RBTlRTID0gTk87CisJCQkJR0NDX1dBUk5fSElEREVOX1ZJUlRVQUxfRlVOQ1RJT05TID0gTk87CisJCQkJR0NDX1dBUk5fSU5ISUJJVF9BTExfV0FSTklOR1MgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTklUSUFMSVpFUl9OT1RfRlVMTFlfQlJBQ0tFVEVEID0gTk87CisJCQkJR0NDX1dBUk5fTUlTU0lOR19QQVJFTlRIRVNFUyA9IE5POworCQkJCUdDQ19XQVJOX05PTl9WSVJUVUFMX0RFU1RSVUNUT1IgPSBOTzsKKwkJCQlHQ0NfV0FSTl9QRURBTlRJQyA9IE5POworCQkJCUdDQ19XQVJOX1NIQURPVyA9IE5POworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IE5POworCQkJCUdDQ19XQVJOX1RZUEVDSEVDS19DQUxMU19UT19QUklOVEYgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTklOSVRJQUxJWkVEX0FVVE9TID0gTk87CisJCQkJR0NDX1dBUk5fVU5LTk9XTl9QUkFHTUFTID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX0ZVTkNUSU9OID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX0xBQkVMID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX1BBUkFNRVRFUiA9IE5POworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQUxVRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJR0VORVJBVEVfTUFTVEVSX09CSkVDVF9GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUEtHSU5GT19GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUFJPRklMSU5HX0NPREUgPSBOTzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJSU5GT1BMSVNUX0VYUEFORF9CVUlMRF9TRVRUSU5HUyA9IFlFUzsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICIiOworCQkJCUlORk9QTElTVF9PVEhFUl9QUkVQUk9DRVNTT1JfRkxBR1MgPSAiIjsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gTk87CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUlOSVRfUk9VVElORSA9ICIiOworCQkJCUlOU1RBTExfR1JPVVAgPSAiJChHUk9VUCkiOworCQkJCUlOU1RBTExfTU9ERV9GTEFHID0gImEtdyxhK3JYIjsKKwkJCQlJTlNUQUxMX09XTkVSID0gIiQoVVNFUikiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJS0VFUF9QUklWQVRFX0VYVEVSTlMgPSBOTzsKKwkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUxJTktFUl9ESVNQTEFZU19GSUxFU19GT1JfVU5ERUZJTkVEX1NZTUJPTFMgPSBZRVM7CisJCQkJTElOS0VSX0RJU1BMQVlTX01BTkdMRURfTkFNRVMgPSBOTzsKKwkJCQlMSU5LX1dJVEhfU1RBTkRBUkRfTElCUkFSSUVTID0gWUVTOworCQkJCU1BQ0hfT19UWVBFID0gIiI7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gIiQoaW5oZXJpdGVkKSI7CisJCQkJT0JKUk9PVCA9IC9Vc2Vycy9hY29uZGl0L1Byb2plY3RzL0ludGVybWVkaWF0ZXM7CisJCQkJT05MWV9MSU5LX0VTU0VOVElBTF9TWU1CT0xTID0gTk87CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfQ1BMVVNQTFVTRkxBR1MgPSAiJChPVEhFUl9DRkxBR1MpIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBSRUNPTVBTX0lOQ0xVREVfSEVBREVSU19GUk9NX0JVSUxUX1BST0RVQ1RTX0RJUiA9IFlFUzsKKwkJCQlQUkVMSU5LX0ZMQUdTID0gIiI7CisJCQkJUFJFTElOS19MSUJTID0gIiI7CisJCQkJUFJFU0VSVkVfREVBRF9DT0RFX0lOSVRTX0FORF9URVJNUyA9IE5POworCQkJCVBSSVZBVEVfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVyZXdyaXRlOworCQkJCVBVQkxJQ19IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUkVaX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVNDQU5fQUxMX1NPVVJDRV9GSUxFU19GT1JfSU5DTFVERVMgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNDsKKwkJCQlTRUNUT1JERVJfRkxBR1MgPSAiIjsKKwkJCQlTRVBBUkFURV9TVFJJUCA9IE5POworCQkJCVNFUEFSQVRFX1NZTUJPTF9FRElUID0gTk87CisJCQkJU0hBUkVEX1BSRUNPTVBTX0RJUiA9ICIkKENBQ0hFX1JPT1QpL1NoYXJlZFByZWNvbXBpbGVkSGVhZGVycyI7CisJCQkJU0tJUF9JTlNUQUxMID0gTk87CisJCQkJU1RBTkRBUkRfQ19QTFVTX1BMVVNfTElCUkFSWV9UWVBFID0gZHluYW1pYzsKKwkJCQlTVFJJUEZMQUdTID0gIiI7CisJCQkJU1RSSVBfSU5TVEFMTEVEX1BST0RVQ1QgPSAiIjsKKwkJCQlTVFJJUF9TVFlMRSA9IGFsbDsKKwkJCQlTWU1ST09UID0gL1VzZXJzL2Fjb25kaXQvUHJvamVjdHMvQW50bHIvQnVpbGQ7CisJCQkJVEVTVF9IT1NUID0gIiI7CisJCQkJVEVTVF9SSUcgPSAiIjsKKwkJCQlVTkVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiIjsKKwkJCQlXQVJOSU5HX0xERkxBR1MgPSAiIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9ICIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3QzU2MjQzMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVyZXdyaXRlOworCQkJfTsKKwkJCW5hbWUgPSAiRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyI7CisJCX07CisJCUY3Q0Q0NzYzMEM2NEQyMzgwMEZGOTMzQSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlQUk9EVUNUX05BTUUgPSB0cmVlcmV3cml0ZTsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUY3Q0Q0NzY0MEM2NEQyMzgwMEZGOTMzQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVyZXdyaXRlOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGN0NENDc3RDBDNjREMjcwMDBGRjkzM0EgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxURVJOQVRFX0dST1VQID0gIiQoSU5TVEFMTF9HUk9VUCkiOworCQkJCUFMVEVSTkFURV9NT0RFID0gIiQoSU5TVEFMTF9NT0RFX0ZMQUcpIjsKKwkJCQlBTFRFUk5BVEVfT1dORVIgPSAiJChJTlNUQUxMX09XTkVSKSI7CisJCQkJQUxURVJOQVRFX1BFUk1JU1NJT05TX0ZJTEVTID0gIiI7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFOVExSX0RFQlVHID0gWUVTOworCQkJCUFOVExSX0VYVFJBX0pBVkFfQVJHUyA9ICIvdXNyL3NoYXJlL2phdmEvYW50bHItMi43LjcuamFyOi91c3Ivc2hhcmUvamF2YS9hbnRscjMvb3V0L3Byb2R1Y3Rpb24vYW50bHIzOi91c3Ivc2hhcmUvamF2YS9hbnRscjMvb3V0L3Byb2R1Y3Rpb24vc3RyaW5ndGVtcGxhdGUiOworCQkJCUFOVExSX0ZPUkNFX09VVF9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvdHJlZXJld3JpdGUiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvdHJlZXJld3JpdGUiOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0gpIjsKKwkJCQlCVUlMRF9WQVJJQU5UUyA9IG5vcm1hbDsKKwkJCQlCVU5ETEVfTE9BREVSID0gIiI7CisJCQkJQ09ORklHVVJBVElPTl9CVUlMRF9ESVIgPSAiJChCVUlMRF9ESVIpLyQoQ09ORklHVVJBVElPTikiOworCQkJCUNPTkZJR1VSQVRJT05fVEVNUF9ESVIgPSAiJChQUk9KRUNUX1RFTVBfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlDT1BZSU5HX1BSRVNFUlZFU19IRlNfREFUQSA9IE5POworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlDVVJSRU5UX1BST0pFQ1RfVkVSU0lPTiA9ICIiOworCQkJCURFQURfQ09ERV9TVFJJUFBJTkcgPSBOTzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSBkd2FyZjsKKwkJCQlERVBMT1lNRU5UX0xPQ0FUSU9OID0gTk87CisJCQkJREVQTE9ZTUVOVF9QT1NUUFJPQ0VTU0lORyA9IE5POworCQkJCURTVFJPT1QgPSAiL3RtcC8kKFBST0pFQ1RfTkFNRSkuZHN0IjsKKwkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAiIjsKKwkJCQlEWUxJQl9DVVJSRU5UX1ZFUlNJT04gPSAiIjsKKwkJCQlFWEVDVVRBQkxFX0VYVEVOU0lPTiA9ICIiOworCQkJCUVYRUNVVEFCTEVfUFJFRklYID0gIiI7CisJCQkJRVhQT1JURURfU1lNQk9MU19GSUxFID0gIiI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUZSQU1FV09SS19WRVJTSU9OID0gQTsKKwkJCQlHQ0NfQUxUSVZFQ19FWFRFTlNJT05TID0gTk87CisJCQkJR0NDX0FVVE9fVkVDVE9SSVpBVElPTiA9IE5POworCQkJCUdDQ19DSEFSX0lTX1VOU0lHTkVEX0NIQVIgPSBOTzsKKwkJCQlHQ0NfQ1dfQVNNX1NZTlRBWCA9IFlFUzsKKwkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OworCQkJCUdDQ19ERUJVR0dJTkdfU1lNQk9MUyA9IGZ1bGw7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9BU01fS0VZV09SRCA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0NQUF9FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX1JUVEkgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gc3VwcG9ydGVkOworCQkJCUdDQ19FTkFCTEVfUEFTQ0FMX1NUUklOR1MgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9TU0UzX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0VOQUJMRV9UUklHUkFQSFMgPSBOTzsKKwkJCQlHQ0NfRkFTVF9NQVRIID0gTk87CisJCQkJR0NDX0ZBU1RfT0JKQ19ESVNQQVRDSCA9IE5POworCQkJCUdDQ19GRUVEQkFDS19ESVJFQ1RFRF9PUFRJTUlaQVRJT04gPSBPZmY7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19HRU5FUkFURV9URVNUX0NPVkVSQUdFX0ZJTEVTID0gTk87CisJCQkJR0NDX0lOQ1JFQVNFX1BSRUNPTVBJTEVEX0hFQURFUl9TSEFSSU5HID0gTk87CisJCQkJR0NDX0lOTElORVNfQVJFX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19JTlBVVF9GSUxFVFlQRSA9IGF1dG9tYXRpYzsKKwkJCQlHQ0NfSU5TVFJVTUVOVF9QUk9HUkFNX0ZMT1dfQVJDUyA9IE5POworCQkJCUdDQ19NT0RFTF9QUEM2NCA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfTk9fQ09NTU9OX0JMT0NLUyA9IE5POworCQkJCUdDQ19PQkpDX0NBTExfQ1hYX0NEVE9SUyA9IE5POworCQkJCUdDQ19PTkVfQllURV9CT09MID0gTk87CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BGRV9GSUxFX0NfRElBTEVDVFMgPSAiYyBvYmplY3RpdmUtYyBjKysgb2JqZWN0aXZlLWMrKyI7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlMgPSAiIjsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TX05PVF9VU0VEX0lOX1BSRUNPTVBTID0gIiI7CisJCQkJR0NDX1JFVVNFX1NUUklOR1MgPSBZRVM7CisJCQkJR0NDX1NIT1JUX0VOVU1TID0gTk87CisJCQkJR0NDX1NUUklDVF9BTElBU0lORyA9IE5POworCQkJCUdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOID0gWUVTOworCQkJCUdDQ19USFJFQURTQUZFX1NUQVRJQ1MgPSBZRVM7CisJCQkJR0NDX1RSRUFUX05PTkNPTkZPUk1BTlRfQ09ERV9FUlJPUlNfQVNfV0FSTklOR1MgPSBOTzsKKwkJCQlHQ0NfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTID0gTk87CisJCQkJR0NDX1VOUk9MTF9MT09QUyA9IE5POworCQkJCUdDQ19VU0VfR0NDM19QRkVfU1VQUE9SVCA9ICIkKFVTRV9HQ0MzX1BGRV9TVVBQT1JUKSI7CisJCQkJR0NDX1dBUk5fQUJPVVRfREVQUkVDQVRFRF9GVU5DVElPTlMgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfSU5WQUxJRF9PRkZTRVRPRl9NQUNSTyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX05FV0xJTkUgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX1BST1RPVFlQRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9QT0lOVEVSX1NJR05FRE5FU1MgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUxMT1dfSU5DT01QTEVURV9QUk9UT0NPTCA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9DSEVDS19TV0lUQ0hfU1RBVEVNRU5UUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9FRkZFQ1RJVkVfQ1BMVVNQTFVTX1ZJT0xBVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9GT1VSX0NIQVJBQ1RFUl9DT05TVEFOVFMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9ISURERU5fVklSVFVBTF9GVU5DVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTkhJQklUX0FMTF9XQVJOSU5HUyA9IE5POworCQkJCUdDQ19XQVJOX0lOSVRJQUxJWkVSX05PVF9GVUxMWV9CUkFDS0VURUQgPSBOTzsKKwkJCQlHQ0NfV0FSTl9NSVNTSU5HX1BBUkVOVEhFU0VTID0gTk87CisJCQkJR0NDX1dBUk5fTk9OX1ZJUlRVQUxfREVTVFJVQ1RPUiA9IE5POworCQkJCUdDQ19XQVJOX1BFREFOVElDID0gTk87CisJCQkJR0NDX1dBUk5fU0hBRE9XID0gTk87CisJCQkJR0NDX1dBUk5fU0lHTl9DT01QQVJFID0gTk87CisJCQkJR0NDX1dBUk5fVFlQRUNIRUNLX0NBTExTX1RPX1BSSU5URiA9IE5POworCQkJCUdDQ19XQVJOX1VOSU5JVElBTElaRURfQVVUT1MgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTktOT1dOX1BSQUdNQVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfRlVOQ1RJT04gPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfTEFCRUwgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfUEFSQU1FVEVSID0gTk87CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBTFVFID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQVJJQUJMRSA9IFlFUzsKKwkJCQlHRU5FUkFURV9NQVNURVJfT0JKRUNUX0ZJTEUgPSBOTzsKKwkJCQlHRU5FUkFURV9QS0dJTkZPX0ZJTEUgPSBOTzsKKwkJCQlHRU5FUkFURV9QUk9GSUxJTkdfQ09ERSA9IE5POworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlJTkZPUExJU1RfRVhQQU5EX0JVSUxEX1NFVFRJTkdTID0gWUVTOworCQkJCUlORk9QTElTVF9GSUxFID0gIiI7CisJCQkJSU5GT1BMSVNUX09USEVSX1BSRVBST0NFU1NPUl9GTEFHUyA9ICIiOworCQkJCUlORk9QTElTVF9QUkVGSVhfSEVBREVSID0gIiI7CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1MgPSBOTzsKKwkJCQlJTkZPUExJU1RfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gIiI7CisJCQkJSU5JVF9ST1VUSU5FID0gIiI7CisJCQkJSU5TVEFMTF9HUk9VUCA9ICIkKEdST1VQKSI7CisJCQkJSU5TVEFMTF9NT0RFX0ZMQUcgPSAiYS13LGErclgiOworCQkJCUlOU1RBTExfT1dORVIgPSAiJChVU0VSKSI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlLRUVQX1BSSVZBVEVfRVhURVJOUyA9IE5POworCQkJCUxJQlJBUllfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJTElOS0VSX0RJU1BMQVlTX0ZJTEVTX0ZPUl9VTkRFRklORURfU1lNQk9MUyA9IFlFUzsKKwkJCQlMSU5LRVJfRElTUExBWVNfTUFOR0xFRF9OQU1FUyA9IE5POworCQkJCUxJTktfV0lUSF9TVEFOREFSRF9MSUJSQVJJRVMgPSBZRVM7CisJCQkJTUFDSF9PX1RZUEUgPSAiIjsKKwkJCQlNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgPSAiJChpbmhlcml0ZWQpIjsKKwkJCQlPQkpST09UID0gQnVpbGQvSW50ZXJtZWRpYXRlczsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCU9OTFlfTElOS19FU1NFTlRJQUxfU1lNQk9MUyA9IE5POworCQkJCU9USEVSX0NGTEFHUyA9ICIiOworCQkJCU9USEVSX0NQTFVTUExVU0ZMQUdTID0gIiQoT1RIRVJfQ0ZMQUdTKSI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUkVDT01QU19JTkNMVURFX0hFQURFUlNfRlJPTV9CVUlMVF9QUk9EVUNUU19ESVIgPSBZRVM7CisJCQkJUFJFTElOS19GTEFHUyA9ICIiOworCQkJCVBSRUxJTktfTElCUyA9ICIiOworCQkJCVBSRVNFUlZFX0RFQURfQ09ERV9JTklUU19BTkRfVEVSTVMgPSBOTzsKKwkJCQlQUklWQVRFX0hFQURFUlNfRk9MREVSX1BBVEggPSAiIjsKKwkJCQlQUk9EVUNUX05BTUUgPSB0cmVlcmV3cml0ZTsKKwkJCQlQVUJMSUNfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVJFWl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlTQ0FOX0FMTF9TT1VSQ0VfRklMRVNfRk9SX0lOQ0xVREVTID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDEwLjY7CisJCQkJU0VDVE9SREVSX0ZMQUdTID0gIiI7CisJCQkJU0VQQVJBVEVfU1RSSVAgPSBOTzsKKwkJCQlTRVBBUkFURV9TWU1CT0xfRURJVCA9IE5POworCQkJCVNIQVJFRF9QUkVDT01QU19ESVIgPSAiJChDQUNIRV9ST09UKS9TaGFyZWRQcmVjb21waWxlZEhlYWRlcnMiOworCQkJCVNLSVBfSU5TVEFMTCA9IE5POworCQkJCVNUQU5EQVJEX0NfUExVU19QTFVTX0xJQlJBUllfVFlQRSA9IGR5bmFtaWM7CisJCQkJU1RSSVBGTEFHUyA9ICIiOworCQkJCVNUUklQX0lOU1RBTExFRF9QUk9EVUNUID0gIiI7CisJCQkJU1RSSVBfU1RZTEUgPSBhbGw7CisJCQkJU1lNUk9PVCA9IEJ1aWxkOworCQkJCVRFU1RfSE9TVCA9ICIiOworCQkJCVRFU1RfUklHID0gIiI7CisJCQkJVU5FWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlVU0VSX0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKKwkJCQlWRVJTSU9OSU5HX1NZU1RFTSA9ICIiOworCQkJCVdBUk5JTkdfQ0ZMQUdTID0gIiI7CisJCQkJV0FSTklOR19MREZMQUdTID0gIiI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSAiIjsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCUY3Q0Q0NzdFMEM2NEQyNzAwMEZGOTMzQSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMVEVSTkFURV9HUk9VUCA9ICIkKElOU1RBTExfR1JPVVApIjsKKwkJCQlBTFRFUk5BVEVfTU9ERSA9ICIkKElOU1RBTExfTU9ERV9GTEFHKSI7CisJCQkJQUxURVJOQVRFX09XTkVSID0gIiQoSU5TVEFMTF9PV05FUikiOworCQkJCUFMVEVSTkFURV9QRVJNSVNTSU9OU19GSUxFUyA9ICIiOworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICgKKwkJCQkJcHBjLAorCQkJCQlpMzg2LAorCQkJCSk7CisJCQkJQlVJTERfVkFSSUFOVFMgPSBub3JtYWw7CisJCQkJQlVORExFX0xPQURFUiA9ICIiOworCQkJCUNPTkZJR1VSQVRJT05fQlVJTERfRElSID0gIiQoQlVJTERfRElSKS8kKENPTkZJR1VSQVRJT04pIjsKKwkJCQlDT05GSUdVUkFUSU9OX1RFTVBfRElSID0gIiQoUFJPSkVDVF9URU1QX0RJUikvJChDT05GSUdVUkFUSU9OKSI7CisJCQkJQ09QWUlOR19QUkVTRVJWRVNfSEZTX0RBVEEgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCUNVUlJFTlRfUFJPSkVDVF9WRVJTSU9OID0gIiI7CisJCQkJREVBRF9DT0RFX1NUUklQUElORyA9IE5POworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9IHN0YWJzOworCQkJCURFUExPWU1FTlRfTE9DQVRJT04gPSBOTzsKKwkJCQlERVBMT1lNRU5UX1BPU1RQUk9DRVNTSU5HID0gTk87CisJCQkJRFNUUk9PVCA9ICIvdG1wLyQoUFJPSkVDVF9OQU1FKS5kc3QiOworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9ICIiOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9ICIiOworCQkJCUVYRUNVVEFCTEVfRVhURU5TSU9OID0gIiI7CisJCQkJRVhFQ1VUQUJMRV9QUkVGSVggPSAiIjsKKwkJCQlFWFBPUlRFRF9TWU1CT0xTX0ZJTEUgPSAiIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUdDQ19BTFRJVkVDX0VYVEVOU0lPTlMgPSBOTzsKKwkJCQlHQ0NfQVVUT19WRUNUT1JJWkFUSU9OID0gTk87CisJCQkJR0NDX0NIQVJfSVNfVU5TSUdORURfQ0hBUiA9IE5POworCQkJCUdDQ19DV19BU01fU1lOVEFYID0gWUVTOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0RFQlVHR0lOR19TWU1CT0xTID0gZGVmYXVsdDsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9BU01fS0VZV09SRCA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX0NQUF9FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfQ1BQX1JUVEkgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9QQVNDQUxfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NTRTNfRVhURU5TSU9OUyA9IE5POworCQkJCUdDQ19FTkFCTEVfU1lNQk9MX1NFUEFSQVRJT04gPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9UUklHUkFQSFMgPSBOTzsKKwkJCQlHQ0NfRkFTVF9NQVRIID0gTk87CisJCQkJR0NDX0ZBU1RfT0JKQ19ESVNQQVRDSCA9IE5POworCQkJCUdDQ19GRUVEQkFDS19ESVJFQ1RFRF9PUFRJTUlaQVRJT04gPSBPZmY7CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX1RFU1RfQ09WRVJBR0VfRklMRVMgPSBOTzsKKwkJCQlHQ0NfSU5DUkVBU0VfUFJFQ09NUElMRURfSEVBREVSX1NIQVJJTkcgPSBOTzsKKwkJCQlHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX0lOUFVUX0ZJTEVUWVBFID0gYXV0b21hdGljOworCQkJCUdDQ19JTlNUUlVNRU5UX1BST0dSQU1fRkxPV19BUkNTID0gTk87CisJCQkJR0NDX01PREVMX1BQQzY0ID0gTk87CisJCQkJR0NDX01PREVMX1RVTklORyA9IEc1OworCQkJCUdDQ19OT19DT01NT05fQkxPQ0tTID0gTk87CisJCQkJR0NDX09CSkNfQ0FMTF9DWFhfQ0RUT1JTID0gTk87CisJCQkJR0NDX09ORV9CWVRFX0JPT0wgPSBOTzsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gczsKKwkJCQlHQ0NfUEZFX0ZJTEVfQ19ESUFMRUNUUyA9ICJjIG9iamVjdGl2ZS1jIGMrKyBvYmplY3RpdmUtYysrIjsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJR0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUdDQ19QUkVQUk9DRVNTT1JfREVGSU5JVElPTlNfTk9UX1VTRURfSU5fUFJFQ09NUFMgPSAiIjsKKwkJCQlHQ0NfUkVVU0VfU1RSSU5HUyA9IFlFUzsKKwkJCQlHQ0NfU0hPUlRfRU5VTVMgPSBOTzsKKwkJCQlHQ0NfU1RSSUNUX0FMSUFTSU5HID0gTk87CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBZRVM7CisJCQkJR0NDX1RIUkVBRFNBRkVfU1RBVElDUyA9IFlFUzsKKwkJCQlHQ0NfVFJFQVRfTk9OQ09ORk9STUFOVF9DT0RFX0VSUk9SU19BU19XQVJOSU5HUyA9IE5POworCQkJCUdDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMgPSBOTzsKKwkJCQlHQ0NfVU5ST0xMX0xPT1BTID0gTk87CisJCQkJR0NDX1VTRV9HQ0MzX1BGRV9TVVBQT1JUID0gIiQoVVNFX0dDQzNfUEZFX1NVUFBPUlQpIjsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9ERVBSRUNBVEVEX0ZVTkNUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9JTlZBTElEX09GRlNFVE9GX01BQ1JPID0gWUVTOworCQkJCUdDQ19XQVJOX0FCT1VUX01JU1NJTkdfTkVXTElORSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9NSVNTSU5HX1BST1RPVFlQRVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9QT0lOVEVSX1NJR05FRE5FU1MgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fQUxMT1dfSU5DT01QTEVURV9QUk9UT0NPTCA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9DSEVDS19TV0lUQ0hfU1RBVEVNRU5UUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9FRkZFQ1RJVkVfQ1BMVVNQTFVTX1ZJT0xBVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9GT1VSX0NIQVJBQ1RFUl9DT05TVEFOVFMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9ISURERU5fVklSVFVBTF9GVU5DVElPTlMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9JTkhJQklUX0FMTF9XQVJOSU5HUyA9IE5POworCQkJCUdDQ19XQVJOX0lOSVRJQUxJWkVSX05PVF9GVUxMWV9CUkFDS0VURUQgPSBOTzsKKwkJCQlHQ0NfV0FSTl9NSVNTSU5HX1BBUkVOVEhFU0VTID0gTk87CisJCQkJR0NDX1dBUk5fTk9OX1ZJUlRVQUxfREVTVFJVQ1RPUiA9IE5POworCQkJCUdDQ19XQVJOX1BFREFOVElDID0gTk87CisJCQkJR0NDX1dBUk5fU0hBRE9XID0gWUVTOworCQkJCUdDQ19XQVJOX1NJR05fQ09NUEFSRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9UWVBFQ0hFQ0tfQ0FMTFNfVE9fUFJJTlRGID0gTk87CisJCQkJR0NDX1dBUk5fVU5JTklUSUFMSVpFRF9BVVRPUyA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTktOT1dOX1BSQUdNQVMgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfRlVOQ1RJT04gPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfTEFCRUwgPSBOTzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfUEFSQU1FVEVSID0gWUVTOworCQkJCUdDQ19XQVJOX1VOVVNFRF9WQUxVRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJR0VORVJBVEVfTUFTVEVSX09CSkVDVF9GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUEtHSU5GT19GSUxFID0gTk87CisJCQkJR0VORVJBVEVfUFJPRklMSU5HX0NPREUgPSBOTzsKKwkJCQlIRUFERVJfU0VBUkNIX1BBVEhTID0gIiI7CisJCQkJSU5GT1BMSVNUX0VYUEFORF9CVUlMRF9TRVRUSU5HUyA9IFlFUzsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICIiOworCQkJCUlORk9QTElTVF9PVEhFUl9QUkVQUk9DRVNTT1JfRkxBR1MgPSAiIjsKKwkJCQlJTkZPUExJU1RfUFJFRklYX0hFQURFUiA9ICIiOworCQkJCUlORk9QTElTVF9QUkVQUk9DRVNTID0gTk87CisJCQkJSU5GT1BMSVNUX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OUyA9ICIiOworCQkJCUlOSVRfUk9VVElORSA9ICIiOworCQkJCUlOU1RBTExfR1JPVVAgPSAiJChHUk9VUCkiOworCQkJCUlOU1RBTExfTU9ERV9GTEFHID0gImEtdyxhK3JYIjsKKwkJCQlJTlNUQUxMX09XTkVSID0gIiQoVVNFUikiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJS0VFUF9QUklWQVRFX0VYVEVSTlMgPSBOTzsKKwkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCUxJTktFUl9ESVNQTEFZU19GSUxFU19GT1JfVU5ERUZJTkVEX1NZTUJPTFMgPSBZRVM7CisJCQkJTElOS0VSX0RJU1BMQVlTX01BTkdMRURfTkFNRVMgPSBOTzsKKwkJCQlMSU5LX1dJVEhfU1RBTkRBUkRfTElCUkFSSUVTID0gWUVTOworCQkJCU1BQ0hfT19UWVBFID0gIiI7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gIiQoaW5oZXJpdGVkKSI7CisJCQkJT0JKUk9PVCA9IC9Vc2Vycy9rcm9lcGtlL1Byb2plY3RzL0ludGVybWVkaWF0ZXM7CisJCQkJT05MWV9MSU5LX0VTU0VOVElBTF9TWU1CT0xTID0gTk87CisJCQkJT1RIRVJfQ0ZMQUdTID0gIiI7CisJCQkJT1RIRVJfQ1BMVVNQTFVTRkxBR1MgPSAiJChPVEhFUl9DRkxBR1MpIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBSRUNPTVBTX0lOQ0xVREVfSEVBREVSU19GUk9NX0JVSUxUX1BST0RVQ1RTX0RJUiA9IFlFUzsKKwkJCQlQUkVMSU5LX0ZMQUdTID0gIiI7CisJCQkJUFJFTElOS19MSUJTID0gIiI7CisJCQkJUFJFU0VSVkVfREVBRF9DT0RFX0lOSVRTX0FORF9URVJNUyA9IE5POworCQkJCVBSSVZBVEVfSEVBREVSU19GT0xERVJfUEFUSCA9ICIiOworCQkJCVBST0RVQ1RfTkFNRSA9IHRyZWVyZXdyaXRlOworCQkJCVBVQkxJQ19IRUFERVJTX0ZPTERFUl9QQVRIID0gIiI7CisJCQkJUkVaX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVNDQU5fQUxMX1NPVVJDRV9GSUxFU19GT1JfSU5DTFVERVMgPSBOTzsKKwkJCQlTREtST09UID0gbWFjb3N4MTAuNDsKKwkJCQlTRUNUT1JERVJfRkxBR1MgPSAiIjsKKwkJCQlTRVBBUkFURV9TVFJJUCA9IE5POworCQkJCVNFUEFSQVRFX1NZTUJPTF9FRElUID0gTk87CisJCQkJU0hBUkVEX1BSRUNPTVBTX0RJUiA9ICIkKENBQ0hFX1JPT1QpL1NoYXJlZFByZWNvbXBpbGVkSGVhZGVycyI7CisJCQkJU0tJUF9JTlNUQUxMID0gTk87CisJCQkJU1RBTkRBUkRfQ19QTFVTX1BMVVNfTElCUkFSWV9UWVBFID0gZHluYW1pYzsKKwkJCQlTVFJJUEZMQUdTID0gIiI7CisJCQkJU1RSSVBfSU5TVEFMTEVEX1BST0RVQ1QgPSAiIjsKKwkJCQlTVFJJUF9TVFlMRSA9IGFsbDsKKwkJCQlTWU1ST09UID0gL1VzZXJzL2tyb2Vwa2UvUHJvamVjdHMvQnVpbGQ7CisJCQkJVEVTVF9IT1NUID0gIiI7CisJCQkJVEVTVF9SSUcgPSAiIjsKKwkJCQlVTkVYUE9SVEVEX1NZTUJPTFNfRklMRSA9ICIiOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9ICIiOworCQkJCVZFUlNJT05JTkdfU1lTVEVNID0gIiI7CisJCQkJV0FSTklOR19DRkxBR1MgPSAiIjsKKwkJCQlXQVJOSU5HX0xERkxBR1MgPSAiIjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9ICIiOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGN0REMDVGMTBBN0IxNjQwMDA2QTAwNkMgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfSkFWQV9BUkdTID0gIi91c3Ivc2hhcmUvamF2YS9hbnRsci0yLjcuNy5qYXI6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9zdHJpbmd0ZW1wbGF0ZVxuIjsKKwkJCQlBTlRMUl9GT1JDRV9PVVRfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzIjsKKwkJCQlBTlRMUl9MSUJfRElSID0gIiQoUFJPSkVDVF9ESVIpL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzIjsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX1NZTUJPTF9TRVBBUkFUSU9OID0gTk87CisJCQkJR0NDX0dFTkVSQVRFX0RFQlVHR0lOR19TWU1CT0xTID0gWUVTOworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IGhvaXN0ZWRQcmVkaWNhdGVzOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjdERDA1RjIwQTdCMTY0MDAwNkEwMDZDIC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gTk87CisJCQkJR0NDX0VOQUJMRV9TWU1CT0xfU0VQQVJBVElPTiA9IE5POworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IGhvaXN0ZWRQcmVkaWNhdGVzOworCQkJCVpFUk9fTElOSyA9IE5POworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQlGN0REMDc3QTBBN0I2NjgyMDA2QTAwNkMgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQU5UTFJfRVhUUkFfSkFWQV9BUkdTID0gIi91c3Ivc2hhcmUvamF2YS9hbnRsci0yLjcuNy5qYXI6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9hbnRscjM6L3Vzci9zaGFyZS9qYXZhL2FudGxyMy9vdXQvcHJvZHVjdGlvbi9zdHJpbmd0ZW1wbGF0ZSI7CisJCQkJQU5UTFJfRk9SQ0VfT1VUX0RJUiA9ICIkKFBST0pFQ1RfRElSKS9leGFtcGxlcy9zY29wZXMiOworCQkJCUFOVExSX0xJQl9ESVIgPSAiJChQUk9KRUNUX0RJUikvZXhhbXBsZXMvc2NvcGVzIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9GSVhfQU5EX0NPTlRJTlVFID0gWUVTOworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IFlFUzsKKwkJCQlHQ0NfTU9ERUxfVFVOSU5HID0gRzU7CisJCQkJR0NDX09QVElNSVpBVElPTl9MRVZFTCA9IDA7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICIkKFNZU1RFTV9MSUJSQVJZX0RJUikvRnJhbWV3b3Jrcy9BcHBLaXQuZnJhbWV3b3JrL0hlYWRlcnMvQXBwS2l0LmgiOworCQkJCUlOU1RBTExfUEFUSCA9ICIkKEhPTUUpL2JpbiI7CisJCQkJT1RIRVJfTERGTEFHUyA9ICgKKwkJCQkJIi1mcmFtZXdvcmsiLAorCQkJCQlGb3VuZGF0aW9uLAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUFwcEtpdCwKKwkJCQkpOworCQkJCVBSRUJJTkRJTkcgPSBOTzsKKwkJCQlQUk9EVUNUX05BTUUgPSBzY29wZXM7CisJCQkJWkVST19MSU5LID0gTk87CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQlGN0REMDc3QjBBN0I2NjgyMDA2QTAwNkMgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCUdDQ19FTkFCTEVfRklYX0FORF9DT05USU5VRSA9IE5POworCQkJCUdDQ19HRU5FUkFURV9ERUJVR0dJTkdfU1lNQk9MUyA9IE5POworCQkJCUdDQ19NT0RFTF9UVU5JTkcgPSBHNTsKKwkJCQlHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSID0gWUVTOworCQkJCUdDQ19QUkVGSVhfSEVBREVSID0gIiQoU1lTVEVNX0xJQlJBUllfRElSKS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcmsvSGVhZGVycy9BcHBLaXQuaCI7CisJCQkJSU5TVEFMTF9QQVRIID0gIiQoSE9NRSkvYmluIjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCUZvdW5kYXRpb24sCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJQXBwS2l0LAorCQkJCSk7CisJCQkJUFJFQklORElORyA9IE5POworCQkJCVBST0RVQ1RfTkFNRSA9IHNjb3BlczsKKwkJCQlaRVJPX0xJTksgPSBOTzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisKKy8qIEJlZ2luIFhDQ29uZmlndXJhdGlvbkxpc3Qgc2VjdGlvbiAqLworCQkxQTBGMzQzQzEyRUE0MjU3MDA0OTZCQjggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgcG9seWRpZmYiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUEwRjM0M0QxMkVBNDI1NzAwNDk2QkI4IC8qIERlYnVnICovLAorCQkJCTFBMEYzNDNFMTJFQTQyNTcwMDQ5NkJCOCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCTFBMEYzNDNGMTJFQTQyNTcwMDQ5NkJCOCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkxQTBGMzQ2MjEyRUE0MkQ4MDA0OTZCQjggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInBvbHlkaWZmIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBMEYzNDYzMTJFQTQyRDgwMDQ5NkJCOCAvKiBEZWJ1ZyAqLywKKwkJCQkxQTBGMzQ2NDEyRUE0MkQ4MDA0OTZCQjggLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxQTBGMzQ2NTEyRUE0MkQ4MDA0OTZCQjggLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUExMjExMDAxMUQzQTVEQjAwRjI3QjM4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUkNvbW1vblRva2VuVGVzdCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTEyMTBGRDExRDNBNURCMDBGMjdCMzggLyogRGVidWcgKi8sCisJCQkJMUExMjEwRkUxMUQzQTVEQjAwRjI3QjM4IC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJMUExMjEwRkYxMUQzQTVEQjAwRjI3QjM4IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCTFBMTIxMUQ2MTFEM0JGNDgwMEYyN0IzOCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFJTdHJpbmdTdHJlYW1UZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBMTIxMUQzMTFEM0JGNDcwMEYyN0IzOCAvKiBEZWJ1ZyAqLywKKwkJCQkxQTEyMTFENDExRDNCRjQ3MDBGMjdCMzggLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxQTEyMTFENTExRDNCRjQ3MDBGMjdCMzggLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUExMjEyMjkxMUQzQzkyNTAwRjI3QjM4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUkZhc3RRdWV1ZVRlc3QiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUExMjEyMjYxMUQzQzkyNTAwRjI3QjM4IC8qIERlYnVnICovLAorCQkJCTFBMTIxMjI3MTFEM0M5MjUwMEYyN0IzOCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCTFBMTIxMjI4MTFEM0M5MjUwMEYyN0IzOCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkxQTEyMTJFMTExRDNGNTM3MDBGMjdCMzggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkFOVExSSW50QXJyYXlUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBMTIxMkRFMTFEM0Y1MzcwMEYyN0IzOCAvKiBEZWJ1ZyAqLywKKwkJCQkxQTEyMTJERjExRDNGNTM3MDBGMjdCMzggLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxQTEyMTJFMDExRDNGNTM3MDBGMjdCMzggLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUExMjEzMTExMUQzRjdDRTAwRjI3QjM4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUkNvbW1vblRyZWVUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBMTIxMzBFMTFEM0Y3Q0UwMEYyN0IzOCAvKiBEZWJ1ZyAqLywKKwkJCQkxQTEyMTMwRjExRDNGN0NFMDBGMjdCMzggLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxQTEyMTMxMDExRDNGN0NFMDBGMjdCMzggLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUEzNDhCNTMxMUQyQkVFOTAwMEM3MkZDIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJUZXN0IiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBMzQ4QjUwMTFEMkJFRTgwMDBDNzJGQyAvKiBEZWJ1ZyAqLywKKwkJCQkxQTM0OEI1MTExRDJCRUU4MDAwQzcyRkMgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxQTM0OEI1MjExRDJCRUU4MDAwQzcyRkMgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUEzNDhCRjExMUQyRDBBMjAwMEM3MkZDIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJBTlRMUkJpdHNldFRlc3QiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUEzNDhCRUUxMUQyRDBBMjAwMEM3MkZDIC8qIERlYnVnICovLAorCQkJCTFBMzQ4QkVGMTFEMkQwQTIwMDBDNzJGQyAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCTFBMzQ4QkYwMTFEMkQwQTIwMDBDNzJGQyAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkxQTc3RUU4RTEyRTZBNTUzMDA3RjMyM0EgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIlRyZWVSZXdyaXRlUnVsZVRva2VuU3RyZWFtIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBNzdFRThCMTJFNkE1NTIwMDdGMzIzQSAvKiBEZWJ1ZyAqLywKKwkJCQkxQTc3RUU4QzEyRTZBNTUyMDA3RjMyM0EgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxQTc3RUU4RDEyRTZBNTUyMDA3RjMyM0EgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUFDNUFDOTQxMkU3QkUwNDAwREYwQzU4IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTGVnYWN5VGFyZ2V0ICJSZWdlbmVyYXRlIHRyZWVwYXJzZXIiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUFDNUFDOTUxMkU3QkUwNDAwREYwQzU4IC8qIERlYnVnICovLAorCQkJCTFBQzVBQzk2MTJFN0JFMDQwMERGMEM1OCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCTFBQzVBQzk3MTJFN0JFMDQwMERGMEM1OCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkxQUM1QUNBMzEyRTdCRUZFMDBERjBDNTggLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRyZWVwYXJzZXIiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUFDNUFDQTQxMkU3QkVGRTAwREYwQzU4IC8qIERlYnVnICovLAorCQkJCTFBQzVBQ0E1MTJFN0JFRkUwMERGMEM1OCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCTFBQzVBQ0E2MTJFN0JFRkUwMERGMEM1OCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQkxREVCOTFBRDA4NzMzREE1MDAxMEU5Q0QgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkFOVExSIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFERUI5MUFFMDg3MzNEQTUwMDEwRTlDRCAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzMTBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQkxREVCOTFBRjA4NzMzREE1MDAxMEU5Q0QgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMURFQjkxQjEwODczM0RBNTAwMTBFOUNEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiQU5UTFIiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMURFQjkxQjIwODczM0RBNTAwMTBFOUNEIC8qIERlYnVnICovLAorCQkJCUY3QzU2MjMwMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCTFERUI5MUIzMDg3MzNEQTUwMDEwRTlDRCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQlGNzAwRTg2QzBBNUZBMzREMDA1RDA3NTcgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImNvbWJpbmVkIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3MDBFODZEMEE1RkEzNEQwMDVEMDc1NyAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzODBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGNzAwRTg2RTBBNUZBMzREMDA1RDA3NTcgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjcwMEVDREMwQTVGRTFCRjAwNUQwNzU3IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJMTC1zdGFyIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3MDBFQ0REMEE1RkUxQkYwMDVEMDc1NyAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzQTBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGNzAwRUNERTBBNUZFMUJGMDA1RDA3NTcgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjcwMzdFQjgwQTA1QUZFRjAwNzA0MzVEIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJsZXhlcnRlc3Qtc2ltcGxlIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3MDM3RUI5MEEwNUFGRUYwMDcwNDM1RCAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzNDBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGNzAzN0VCQTBBMDVBRkVGMDA3MDQzNUQgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjcyQzVFNjYwQUI3RTRDOTAwMjgyNTc0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzaW1wbGVjdHJlZSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGNzJDNUU2NzBBQjdFNEM5MDAyODI1NzQgLyogRGVidWcgKi8sCisJCQkJRjdDNTYyNDAwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJRjcyQzVFNjgwQUI3RTRDOTAwMjgyNTc0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCUY3NjI4NzQwMEI3MTUxQjkwMDZBQTdFRiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWEFnZ3JlZ2F0ZVRhcmdldCAiUmVnZW5lcmF0ZSBhbGwgZXhhbXBsZXMiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJRjc2Mjg3NDEwQjcxNTFCOTAwNkFBN0VGIC8qIERlYnVnICovLAorCQkJCUY3QzU2MjMzMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCUY3NjI4NzQyMEI3MTUxQjkwMDZBQTdFRiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQlGNzYyODc0NjBCNzE1MjAxMDA2QUE3RUYgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgZnV6enkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJRjc2Mjg3NDcwQjcxNTIwMTAwNkFBN0VGIC8qIERlYnVnICovLAorCQkJCUY3QzU2MjM3MENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCUY3NjI4NzQ4MEI3MTUyMDEwMDZBQTdFRiAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQlGNzYyODc3OTBCNzE1NTdFMDA2QUE3RUYgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgbGV4ZXJ0ZXN0LXNpbXBsZSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGNzYyODc3QTBCNzE1NTdFMDA2QUE3RUYgLyogRGVidWcgKi8sCisJCQkJRjdDNTYyMzUwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJRjc2Mjg3N0IwQjcxNTU3RTAwNkFBN0VGIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCUY3NjI4NzdGMEI3MTU1OUMwMDZBQTdFRiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSBjb21iaW5lZCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGNzYyODc4MDBCNzE1NTlDMDA2QUE3RUYgLyogRGVidWcgKi8sCisJCQkJRjdDNTYyMzkwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJRjc2Mjg3ODEwQjcxNTU5QzAwNkFBN0VGIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCUY3NjI4NzgzMEI3MTU1OUYwMDZBQTdFRiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSBMTC1zdGFyIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3NjI4Nzg0MEI3MTU1OUYwMDZBQTdFRiAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzQjBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGNzYyODc4NTBCNzE1NTlGMDA2QUE3RUYgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3ODcwQjcxNTVBMjAwNkFBN0VGIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTGVnYWN5VGFyZ2V0ICJSZWdlbmVyYXRlIGhvaXN0ZWRQcmVkaWNhdGVzIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3NjI4Nzg4MEI3MTU1QTIwMDZBQTdFRiAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzRDBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGNzYyODc4OTBCNzE1NUEyMDA2QUE3RUYgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjc2Mjg3OEIwQjcxNTVBQjAwNkFBN0VGIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTGVnYWN5VGFyZ2V0ICJSZWdlbmVyYXRlIHNjb3BlcyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGNzYyODc4QzBCNzE1NUFCMDA2QUE3RUYgLyogRGVidWcgKi8sCisJCQkJRjdDNTYyM0YwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJRjc2Mjg3OEQwQjcxNTVBQjAwNkFBN0VGIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCUY3NjI4NzhGMEI3MTU1QUYwMDZBQTdFRiAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWExlZ2FjeVRhcmdldCAiUmVnZW5lcmF0ZSBzaW1wbGVjdHJlZSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGNzYyODc5MDBCNzE1NUFGMDA2QUE3RUYgLyogRGVidWcgKi8sCisJCQkJRjdDNTYyNDEwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJRjc2Mjg3OTEwQjcxNTVBRjAwNkFBN0VGIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCUY3OUQ1NjZGMEEwRTIzRDYwMEVBM0NFRSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiZnV6enkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJRjc5RDU2NzAwQTBFMjNENjAwRUEzQ0VFIC8qIERlYnVnICovLAorCQkJCUY3QzU2MjM2MENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCUY3OUQ1NjcxMEEwRTIzRDYwMEVBM0NFRSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQlGN0NENDc2MjBDNjREMjM4MDBGRjkzM0EgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhMZWdhY3lUYXJnZXQgIlJlZ2VuZXJhdGUgdHJlZXJld3JpdGUiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJRjdDRDQ3NjMwQzY0RDIzODAwRkY5MzNBIC8qIERlYnVnICovLAorCQkJCUY3QzU2MjQzMENENTEzRDQwMDcyN0RCMCAvKiBEZWJ1ZyB3aXRoIFN0cmluZ1RlbXBsYXRlIERlYnVnICovLAorCQkJCUY3Q0Q0NzY0MEM2NEQyMzgwMEZGOTMzQSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IERlYnVnOworCQl9OworCQlGN0NENDc3QzBDNjREMjcwMDBGRjkzM0EgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRyZWVyZXdyaXRlIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3Q0Q0NzdEMEM2NEQyNzAwMEZGOTMzQSAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjI0MjBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGN0NENDc3RTBDNjREMjcwMDBGRjkzM0EgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJRjdERDA1RjAwQTdCMTY0MDAwNkEwMDZDIC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJob2lzdGVkUHJlZGljYXRlcyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQlGN0REMDVGMTBBN0IxNjQwMDA2QTAwNkMgLyogRGVidWcgKi8sCisJCQkJRjdDNTYyM0MwQ0Q1MTNENDAwNzI3REIwIC8qIERlYnVnIHdpdGggU3RyaW5nVGVtcGxhdGUgRGVidWcgKi8sCisJCQkJRjdERDA1RjIwQTdCMTY0MDAwNkEwMDZDIC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gRGVidWc7CisJCX07CisJCUY3REQwNzc5MEE3QjY2ODIwMDZBMDA2QyAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2NvcGVzIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCUY3REQwNzdBMEE3QjY2ODIwMDZBMDA2QyAvKiBEZWJ1ZyAqLywKKwkJCQlGN0M1NjIzRTBDRDUxM0Q0MDA3MjdEQjAgLyogRGVidWcgd2l0aCBTdHJpbmdUZW1wbGF0ZSBEZWJ1ZyAqLywKKwkJCQlGN0REMDc3QjBBN0I2NjgyMDA2QTAwNkMgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBEZWJ1ZzsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAwODY3RDY5MEZFODQwMjhGQzAyQUFDMDcgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uRFNfU3RvcmUgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uRFNfU3RvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwOGRkZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy5EU19TdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk2NDYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMCwwICsxLDMwNDggQEAKKy8vICEkKlVURjgqJCEKK3sKKwlhcmNoaXZlVmVyc2lvbiA9IDE7CisJY2xhc3NlcyA9IHsKKwl9OworCW9iamVjdFZlcnNpb24gPSA0NjsKKwlvYmplY3RzID0geworCisvKiBCZWdpbiBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCQkxQTA0OEQyMTEzNEU4QzExMDAwMDVGNTcgLyogYW50bHIzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwMTEzNEU4QzEwMDAwMDVGNTcgLyogYW50bHIzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQyMjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMDIxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQmFzZU1hcEVsZW1lbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDIzMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwMzEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlUmVjb2duaXplci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMjQxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQmFzZVN0YWNrLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwNDEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlU3RhY2suaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDI1MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkJhc2VUcmVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwNTEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlVHJlZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMjYxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwNjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDI3MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkJpdFNldC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMDcxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQml0U2V0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQyODEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwODEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQyOTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwOTEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQyQTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDaGFyU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwQTEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDaGFyU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQyQjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDaGFyU3RyZWFtU3RhdGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMDQ4RDBCMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMkMxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwQzEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDJEMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRva2VuLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwRDEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25Ub2tlbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMkUxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMDQ4RDBFMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQyRjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQwRjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQzMDEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMTAxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDMxMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxMTEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMzMxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMDQ4RDEzMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQzNDEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMDQ4RDE0MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMzUxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdFdmVudFByb3h5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxNTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDM2MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnUGFyc2VyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxNjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1BhcnNlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMzcxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUb2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMTcxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUb2tlblN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMzgxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlQWRhcHRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMTgxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlQWRhcHRvci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEMzkxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMTkxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEM0ExMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlUGFyc2VyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxQTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDNCMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRGQS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMUIxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSREZBLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTA0OEQzQzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEb3VibGVLZXlNYXAuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBMDQ4RDFDMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRvdWJsZUtleU1hcC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEM0QxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxRDEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDNFMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkVycm9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxRTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJFcnJvci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUEwNDhEM0YxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTA0OEQxRjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBMDQ4RDQwMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkZhc3RRdWV1ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUEwNDhEMjAxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRmFzdFF1ZXVlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTYzQkM2RTEzNEY1REU1MDAyRURGQjQgLyogRnV6enlMZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDNkIxMzRGNURFNDAwMkVERkI0IC8qIEZ1enp5TGV4ZXIubSAqLzsgfTsKKwkJMUE2M0JDNkYxMzRGNURFNTAwMkVERkI0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQzZDMTM0RjVERTUwMDJFREZCNCAvKiBtYWluLm0gKi87IH07CisJCTFBNjNCQzcwMTM0RjVFNDMwMDJFREZCNCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxODEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkQ4OTEzNEY1RkYzMDAyRURGQjQgLyogQ29tYmluZWRMZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDN0UxMzRGNUVCMTAwMkVERkI0IC8qIENvbWJpbmVkTGV4ZXIubSAqLzsgfTsKKwkJMUE2M0JEOEExMzRGNUZGMzAwMkVERkI0IC8qIENvbWJpbmVkUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkM4MDEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWRQYXJzZXIubSAqLzsgfTsKKwkJMUE2M0JEOEIxMzRGNUZGMzAwMkVERkI0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQzgxMTM0RjVFQjEwMDJFREZCNCAvKiBtYWluLm0gKi87IH07CisJCTFBNjNCRDk0MTM0RjYwNkEwMDJFREZCNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkM5RTEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovOyB9OworCQkxQTYzQkQ5NTEzNEY2MDZBMDAyRURGQjQgLyogVGVzdExleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkNBOTEzNEY1RUIyMDAyRURGQjQgLyogVGVzdExleGVyLm0gKi87IH07CisJCTFBNjNCREFGMTM0RjYxNEQwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxQjEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkRCNDEzNEY2MTU0MDAyRURGQjQgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMUIxMzRFODYwQjAwMUMzRjM1IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMUE2M0JEQjkxMzRGNjE1QTAwMkVERkI0IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzFCMTM0RTg2MEIwMDFDM0YzNSAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTFBNjNCREJFMTM0RjYxNjAwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxQjEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkRDMzEzNEY2MTY3MDAyRURGQjQgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMUIxMzRFODYwQjAwMUMzRjM1IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMUE2M0JEQzcxMzRGNjFFNDAwMkVERkI0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQ0IwMTM0RjVFQjIwMDJFREZCNCAvKiBtYWluLm0gKi87IH07CisJCTFBNjNCREM4MTM0RjYxRTgwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQ0I2MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIubSAqLzsgfTsKKwkJMUE2M0JEQzkxMzRGNjFFQzAwMkVERkI0IC8qIFNpbXBsZUNQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQ0I4MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi87IH07CisJCTFBNjNCRENBMTM0RjYyMTgwMDJFREZCNCAvKiBNYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkNCQzEzNEY1RUIyMDAyRURGQjQgLyogTWFpbi5tICovOyB9OworCQkxQTYzQkRDQjEzNEY2MjE4MDAyRURGQjQgLyogUG9seURpZmZlcmVudGlhdG9yLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkNDQjEzNEY1RUIyMDAyRURGQjQgLyogUG9seURpZmZlcmVudGlhdG9yLm0gKi87IH07CisJCTFBNjNCRENDMTM0RjYyMTgwMDJFREZCNCAvKiBQb2x5TGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQ0NEMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5TGV4ZXIubSAqLzsgfTsKKwkJMUE2M0JEQ0QxMzRGNjIxODAwMkVERkI0IC8qIFBvbHlQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQ0NGMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5UGFyc2VyLm0gKi87IH07CisJCTFBNjNCRENFMTM0RjYyMTgwMDJFREZCNCAvKiBQb2x5UHJpbnRlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDRDIxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQcmludGVyLm0gKi87IH07CisJCTFBNjNCRENGMTM0RjYyMTgwMDJFREZCNCAvKiBTaW1wbGlmaWVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkNENjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxpZmllci5tICovOyB9OworCQkxQTYzQkRERDEzNEY2MjU4MDAyRURGQjQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDREIxMzRGNUVCMjAwMkVERkI0IC8qIG1haW4ubSAqLzsgfTsKKwkJMUE2M0JEREUxMzRGNjI1ODAwMkVERkI0IC8qIFN5bWJvbFRhYmxlTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCQ0U3MTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZUxleGVyLm0gKi87IH07CisJCTFBNjNCRERGMTM0RjYyNTgwMDJFREZCNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDRTkxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLm0gKi87IH07CisJCTFBNjNCREUxMTM0RjYyNkEwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxQjEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkRFNzEzNEY2MkNCMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQwMDEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLm0gKi87IH07CisJCTFBNjNCREU4MTM0RjYyRDAwMDJFREZCNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkNFRDEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovOyB9OworCQkxQTYzQkRFQTEzNEY2MkQwMDAyRURGQjQgLyogU2ltcGxlQ1RQLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQwNzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1RQLm0gKi87IH07CisJCTFBNjNCREVCMTM0RjYyRDAwMDJFREZCNCAvKiBTaW1wbGVDV2Fsa2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQwQjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1dhbGtlci5tICovOyB9OworCQkxQTYzQkRFRTEzNEY5MzJFMDAyRURGQjQgLyogQU5UTFJJbnRTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzY4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkludFN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2M0JERUYxMzRGOTNBNTAwMkVERkI0IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBNjNCREYwMTM0RjkzQUMwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxQjEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkRGMTEzNEZBQjRCMDAyRURGQjQgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMUIxMzRFODYwQjAwMUMzRjM1IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMUE2M0JERjIxMzRGQUI2MDAwMkVERkI0IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBNjNCREYzMTM0RkFCNjMwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxQjEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkRGNDEzNEZBRjU4MDAyRURGQjQgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMTgxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUE2M0JERjUxMzRGQjU1QjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCRDJCMTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZUxleGVyLm0gKi87IH07CisJCTFBNjNCREY2MTM0RkI1NUYwMDJFREZCNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQyMTEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovOyB9OworCQkxQTYzQkRGNzEzNEZCNTY0MDAyRURGQjQgLyogVHJlZVJld3JpdGVQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNjNCRDJEMTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZVBhcnNlci5tICovOyB9OworCQkxQTYzQkUwNTEzNEZCODA3MDAyRURGQjQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDOTQxMzRGNUVCMjAwMkVERkI0IC8qIG1haW4ubSAqLzsgfTsKKwkJMUE2M0JFMDYxMzRGQjgwQjAwMkVERkI0IC8qIFRMZXhlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDOTkxMzRGNUVCMjAwMkVERkI0IC8qIFRMZXhlci5tICovOyB9OworCQkxQTYzQkUwNzEzNEZCODBFMDAyRURGQjQgLyogVFBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2M0JDOUIxMzRGNUVCMjAwMkVERkI0IC8qIFRQYXJzZXIubSAqLzsgfTsKKwkJMUE2M0JFMDgxMzRGQjgxNDAwMkVERkI0IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBNjNCRTA5MTM0RkI4MTgwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxQjEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrICovOyB9OworCQkxQTYzQkUwQzEzNEZCODU1MDAyRURGQjQgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMTgxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUE2QjFDRDcxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSRmlsZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDOTcxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSRmlsZVN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRDgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSGFzaE1hcC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDOTgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSGFzaE1hcC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRDkxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSGFzaFJ1bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQzk5MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkhhc2hSdWxlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNEQTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJJbnB1dFN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDOUExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSW5wdXRTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0RCMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkludEFycmF5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUM5QjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJJbnRBcnJheS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDREMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTGV4ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQzlDMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxleGVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNERDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDOUQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0RFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxleGVyU3RhdGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQzlFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxleGVyU3RhdGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0RGMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxpbmtCYXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUM5RjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMaW5rQmFzZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRTAxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTG9va2FoZWFkU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNBMDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0UxMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1hcC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQTExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWFwLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFMjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNYXBFbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNBMjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNYXBFbGVtZW50LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFMzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNBMzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFNDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0E0MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRTUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQTUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRTYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNBNjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0U3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQTcxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFODEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0E4MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRTkxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTm9kZU1hcEVsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0E5MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk5vZGVNYXBFbGVtZW50LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFQTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQUExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0VCMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlBhcnNlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQUIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUGFyc2VyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFQzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0FDMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRUQxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUGFyc2VUcmVlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNBRDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQYXJzZVRyZWUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0VFMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlB0ckJ1ZmZlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQUUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUHRyQnVmZmVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNFRjEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJQdHJTdGFjay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQUYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUHRyU3RhY2suaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0YwMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJlYWRlclN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQjAxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmVhZGVyU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGMTEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQjExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0YyMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQjIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGMzEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0IzMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRjQxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNCNDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0Y1MTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQjUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGNjEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNCNjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGNzEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQjcxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUnVsZU1hcEVsZW1lbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0Y4MTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVNZW1vLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNCODEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdWxlTWVtby5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRjkxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUnVsZVJldHVyblNjb3BlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNCOTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxQ0ZBMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVTdGFjay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQkExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUnVsZVN0YWNrLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGQjEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNCQjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGQzEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNCQzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGRDEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJTdHJpbmdTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0JEMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFDRkUxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtU3RhdGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0JFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbVN0YXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUNGRjEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJTeW1ib2xTdGFjay5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQkYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSU3ltYm9sU3RhY2suaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDAwMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlRva2VuLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDMDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUb2tlbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMDExMzRFOENGODAwMTZBNDdEIC8qIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDMTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDAyMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQzIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwMzEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJUb2tlblNvdXJjZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQzMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVG9rZW5Tb3VyY2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDA0MTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDNDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUb2tlblN0cmVhbS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMDUxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSVHJlZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQzUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMDYxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSVHJlZUFkYXB0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0M2MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVBZGFwdG9yLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwNzEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJUcmVlRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDNzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlRXhjZXB0aW9uLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwODEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlSXRlcmF0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0M4MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVJdGVyYXRvci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMDkxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxQ0M5MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVOb2RlU3RyZWFtLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwQTEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlUGFyc2VyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDQTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlUGFyc2VyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwQjEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDQjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwQzEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQ0MxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDBEMTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlRyZWVSZXdyaXRlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQ0QxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVJld3JpdGVyLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwRTEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNDRTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQTZCMUQwRjEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlVmlzaXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDQ0YxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVZpc2l0b3IuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDEwMTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNEMDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMTExMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZVdpemFyZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDRDExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVdpemFyZC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMTIxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNEMjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDEzMTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNEMzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMTQxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNENDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQdWJsaWMsICk7IH07IH07CisJCTFBNkIxRDE1MTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlVuaXF1ZUlETWFwLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUNENTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmlxdWVJRE1hcC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFEMTYxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFDRDYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFB1YmxpYywgKTsgfTsgfTsKKwkJMUE2QjFENjQxMzRFOERFQjAwMTZBNDdEIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5oIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFENEExMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5oICovOyB9OworCQkxQTZCMUQ2NTEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJGYXN0UXVldWVUZXN0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ0QjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJGYXN0UXVldWVUZXN0Lm0gKi87IH07CisJCTFBNkIxRDY2MTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkludEFycmF5VGVzdC5oIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFENEMxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSSW50QXJyYXlUZXN0LmggKi87IH07CisJCTFBNkIxRDY3MTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkludEFycmF5VGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFENEQxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSSW50QXJyYXlUZXN0Lm0gKi87IH07CisJCTFBNkIxRDY4MTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml6ZXJUZXN0LmggaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ0RjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJSZWNvZ25pemVyVGVzdC5oICovOyB9OworCQkxQTZCMUQ2OTEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJSZWNvZ25pemVyVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFENTAxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXplclRlc3QubSAqLzsgfTsKKwkJMUE2QjFENkExMzRFOERFQjAwMTZBNDdEIC8qIEFOVExSQml0U2V0VGVzdC5oIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFENTIxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQml0U2V0VGVzdC5oICovOyB9OworCQkxQTZCMUQ2QjEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJCaXRTZXRUZXN0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ1MzEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJCaXRTZXRUZXN0Lm0gKi87IH07CisJCTFBNkIxRDZDMTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDU1MTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaCAqLzsgfTsKKwkJMUE2QjFENkQxMzRFOERFQjAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE2QjFENTYxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5tICovOyB9OworCQkxQTZCMUQ2RTEzNEU4REVCMDAxNkE0N0QgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDU4MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oICovOyB9OworCQkxQTZCMUQ2RjEzNEU4REVCMDAxNkE0N0QgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDU5MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovOyB9OworCQkxQTZCMUQ3MDEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJDb21tb25Ub2tlblRlc3QuaCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDVCMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5oICovOyB9OworCQkxQTZCMUQ3MTEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJDb21tb25Ub2tlblRlc3QubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDVDMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5tICovOyB9OworCQkxQTZCMUQ3MjEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJDb21tb25FcnJvck5vZGVUZXN0LmggaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ1RTEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25FcnJvck5vZGVUZXN0LmggKi87IH07CisJCTFBNkIxRDczMTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDVGMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QubSAqLzsgfTsKKwkJMUE2QjFENzQxMzRFOERFQjAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0LmggaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ2MDEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QuaCAqLzsgfTsKKwkJMUE2QjFENzUxMzRFOERFQzAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ2MTEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QubSAqLzsgfTsKKwkJMUE2QjFENzYxMzRFOERFQzAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QuaCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBNkIxRDYyMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRyZWVUZXN0LmggKi87IH07CisJCTFBNkIxRDc3MTM0RThERUMwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRyZWVUZXN0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ2MzEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlVGVzdC5tICovOyB9OworCQkxQTZCMUQ3OTEzNEVBMDk3MDAxNkE0N0QgLyogU2VuVGVzdGluZ0tpdC5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTZCMUQ3ODEzNEVBMDk3MDAxNkE0N0QgLyogU2VuVGVzdGluZ0tpdC5mcmFtZXdvcmsgKi87IH07CisJCTFBNzZBMDJGMTM0RkQ0MTYwMDQxNjM0RiAvKiBtYWluLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQxQjEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovOyB9OworCQkxQTc2QTAzMDEzNEZENEEwMDA0MTYzNEYgLyogTGFuZ0xleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQxNzEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0xleGVyLm0gKi87IH07CisJCTFBNzZBMDMxMTM0RkQ0QTQwMDQxNjM0RiAvKiBMYW5nUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQxOTEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ1BhcnNlci5tICovOyB9OworCQkxQTc2QTAzMjEzNEZENEI5MDA0MTYzNEYgLyogTGFuZ0R1bXBEZWNsLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQTYzQkQxNDEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0R1bXBEZWNsLm0gKi87IH07CisJCTFBQUMxQzNEMTM0RkQ2QTUwMEIyREM2OCAvKiBBTlRMUi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBQzFDM0MxMzRGRDZBNTAwQjJEQzY4IC8qIEFOVExSLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHVibGljLCApOyB9OyB9OworCQkxQUI3RkUxNTEzNEZCRjkwMDA1OTQ3NEIgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMTgxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUFCN0ZFMTYxMzRGQkY5RjAwNTk0NzRCIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBQjdGRTE3MTM0RkJGQjIwMDU5NDc0QiAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMxODEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFIuZnJhbWV3b3JrICovOyB9OworCQkxQUI3RkUxODEzNEZDMDgwMDA1OTQ3NEIgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMTgxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSLmZyYW1ld29yayAqLzsgfTsKKwkJMUFFNzIzMUMxMzRFODYwQjAwMUMzRjM1IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzFCMTM0RTg2MEIwMDFDM0YzNSAvKiBDb2NvYS5mcmFtZXdvcmsgKi87IH07CisJCTFBRTcyMzI2MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMjQxMzRFODYwQjAwMUMzRjM1IC8qIEluZm9QbGlzdC5zdHJpbmdzICovOyB9OworCQkxQUU3MjMyRTEzNEU4NjBCMDAxQzNGMzUgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMUIxMzRFODYwQjAwMUMzRjM1IC8qIENvY29hLmZyYW1ld29yayAqLzsgfTsKKwkJMUFFNzIzMzExMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi87IH07CisJCTFBRTcyMzM3MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzMzUxMzRFODYwQjAwMUMzRjM1IC8qIEluZm9QbGlzdC5zdHJpbmdzICovOyB9OworCQkxQUU3MjMzQTEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy5oIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjMzOTEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy5oICovOyB9OworCQkxQUU3MjMzQzEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzM0IxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSVGVzdHMubSAqLzsgfTsKKwkJMUFFNzIzNDcxMzRFODlCRjAwMUMzRjM1IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzQ1MTM0RTg5QkYwMDFDM0YzNSAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CisJCTFBRTcyMzQ4MTM0RTg5QkYwMDFDM0YzNSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzQ2MTM0RTg5QkYwMDFDM0YzNSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLzsgfTsKKwkJMUFFNzIzOUYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZU1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzQ5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VNYXBFbGVtZW50Lm0gKi87IH07CisJCTFBRTcyM0EwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM0QTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlUmVjb2duaXplci5tICovOyB9OworCQkxQUU3MjNBMTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlU3RhY2subSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzRCMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VTdGFjay5tICovOyB9OworCQkxQUU3MjNBMjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlVHJlZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNEMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZVRyZWUubSAqLzsgfTsKKwkJMUFFNzIzQTMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM0RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IubSAqLzsgfTsKKwkJMUFFNzIzQTQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQml0U2V0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM0RTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCaXRTZXQubSAqLzsgfTsKKwkJMUFFNzIzQTUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNEYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tICovOyB9OworCQkxQUU3MjNBNjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM1MDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0gKi87IH07CisJCTFBRTcyM0E3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNTExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLm0gKi87IH07CisJCTFBRTcyM0E4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNTIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlLm0gKi87IH07CisJCTFBRTcyM0E5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRva2VuLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM1MzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25Ub2tlbi5tICovOyB9OworCQkxQUU3MjNBQTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNTQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubSAqLzsgfTsKKwkJMUFFNzIzQUIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNTUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZS5tICovOyB9OworCQkxQUU3MjNBQzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNTYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IubSAqLzsgfTsKKwkJMUFFNzIzQUQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzU3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi87IH07CisJCTFBRTcyM0FFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnRXZlbnRQcm94eS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNTgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdFdmVudFByb3h5Lm0gKi87IH07CisJCTFBRTcyM0FGMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM1OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1BhcnNlci5tICovOyB9OworCQkxQUU3MjNCMDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM1QTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLm0gKi87IH07CisJCTFBRTcyM0IxMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzVCMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IubSAqLzsgfTsKKwkJMUFFNzIzQjIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNUMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tICovOyB9OworCQkxQUU3MjNCMzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzVEMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnVHJlZVBhcnNlci5tICovOyB9OworCQkxQUU3MjNCNDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJERkEubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzVFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRGQS5tICovOyB9OworCQkxQUU3MjNCNTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEb3VibGVLZXlNYXAubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzVGMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRvdWJsZUtleU1hcC5tICovOyB9OworCQkxQUU3MjNCNjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzYwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tICovOyB9OworCQkxQUU3MjNCNzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzYxMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5tICovOyB9OworCQkxQUU3MjNCODEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJGYXN0UXVldWUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzYyMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkZhc3RRdWV1ZS5tICovOyB9OworCQkxQUU3MjNCOTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJGaWxlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM2MzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJGaWxlU3RyZWFtLm0gKi87IH07CisJCTFBRTcyM0JBMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUkhhc2hNYXAubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzY0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkhhc2hNYXAubSAqLzsgfTsKKwkJMUFFNzIzQkIxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSSGFzaFJ1bGUubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzY1MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkhhc2hSdWxlLm0gKi87IH07CisJCTFBRTcyM0JDMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUklucHV0U3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM2NjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJJbnB1dFN0cmVhbS5tICovOyB9OworCQkxQUU3MjNCRDEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJJbnRBcnJheS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNjcxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSSW50QXJyYXkubSAqLzsgfTsKKwkJMUFFNzIzQkYxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTGV4ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzY5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkxleGVyLm0gKi87IH07CisJCTFBRTcyM0MwMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM2QTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5tICovOyB9OworCQkxQUU3MjNDMTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJMZXhlclN0YXRlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM2QjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJMZXhlclN0YXRlLm0gKi87IH07CisJCTFBRTcyM0MyMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUkxpbmtCYXNlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM2QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJMaW5rQmFzZS5tICovOyB9OworCQkxQUU3MjNDMzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzZEMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkxvb2thaGVhZFN0cmVhbS5tICovOyB9OworCQkxQUU3MjNDNDEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNYXAubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzZFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1hcC5tICovOyB9OworCQkxQUU3MjNDNTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNYXBFbGVtZW50Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM2RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJNYXBFbGVtZW50Lm0gKi87IH07CisJCTFBRTcyM0M2MTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzcwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSAqLzsgfTsKKwkJMUFFNzIzQzcxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM3MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24ubSAqLzsgfTsKKwkJMUFFNzIzQzgxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNzIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5tICovOyB9OworCQkxQUU3MjNDOTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzczMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5tICovOyB9OworCQkxQUU3MjNDQTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzc0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5tICovOyB9OworCQkxQUU3MjNDQjEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzc1MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5tICovOyB9OworCQkxQUU3MjNDQzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJOb2RlTWFwRWxlbWVudC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNzYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQubSAqLzsgfTsKKwkJMUFFNzIzQ0QxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzc3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm0gKi87IH07CisJCTFBRTcyM0NFMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNzgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUGFyc2VyLm0gKi87IH07CisJCTFBRTcyM0NGMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzNzkxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm0gKi87IH07CisJCTFBRTcyM0QwMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlBhcnNlVHJlZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzN0ExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUGFyc2VUcmVlLm0gKi87IH07CisJCTFBRTcyM0QxMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlB0ckJ1ZmZlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzN0IxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUHRyQnVmZmVyLm0gKi87IH07CisJCTFBRTcyM0QyMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlB0clN0YWNrLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM3QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJQdHJTdGFjay5tICovOyB9OworCQkxQUU3MjNEMzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJSZWFkZXJTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzdEMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJlYWRlclN0cmVhbS5tICovOyB9OworCQkxQUU3MjNENDEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzN0UxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubSAqLzsgfTsKKwkJMUFFNzIzRDUxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM3RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubSAqLzsgfTsKKwkJMUFFNzIzRDYxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM4MDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ubSAqLzsgfTsKKwkJMUFFNzIzRDcxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM4MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubSAqLzsgfTsKKwkJMUFFNzIzRDgxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM4MjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubSAqLzsgfTsKKwkJMUFFNzIzRDkxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzODMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovOyB9OworCQkxQUU3MjNEQTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJSdWxlTWFwRWxlbWVudC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzODQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUnVsZU1hcEVsZW1lbnQubSAqLzsgfTsKKwkJMUFFNzIzREIxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUnVsZU1lbW8ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzg1MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bGVNZW1vLm0gKi87IH07CisJCTFBRTcyM0RDMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJ1bGVSZXR1cm5TY29wZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzODYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUnVsZVJldHVyblNjb3BlLm0gKi87IH07CisJCTFBRTcyM0REMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJ1bGVTdGFjay5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzODcxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUnVsZVN0YWNrLm0gKi87IH07CisJCTFBRTcyM0RFMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzg4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSAqLzsgfTsKKwkJMUFFNzIzREYxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzODkxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5tICovOyB9OworCQkxQUU3MjNFMDEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJTdHJpbmdTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzhBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5tICovOyB9OworCQkxQUU3MjNFMTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJTeW1ib2xTdGFjay5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzOEIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSU3ltYm9sU3RhY2subSAqLzsgfTsKKwkJMUFFNzIzRTIxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM4QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSAqLzsgfTsKKwkJMUFFNzIzRTMxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM4RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSAqLzsgfTsKKwkJMUFFNzIzRTUxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVHJlZUFkYXB0b3IubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzhGMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVBZGFwdG9yLm0gKi87IH07CisJCTFBRTcyM0U2MTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzkwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSAqLzsgfTsKKwkJMUFFNzIzRTcxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVHJlZUl0ZXJhdG9yLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM5MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlSXRlcmF0b3IubSAqLzsgfTsKKwkJMUFFNzIzRTgxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVHJlZVBhcnNlci5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzOTIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVBhcnNlci5tICovOyB9OworCQkxQUU3MjNFOTEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM5MzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlUGF0dGVybkxleGVyLm0gKi87IH07CisJCTFBRTcyM0VBMTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM5NDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5tICovOyB9OworCQkxQUU3MjNFQjEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlUmV3cml0ZXIubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzk1MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVSZXdyaXRlci5tICovOyB9OworCQkxQUU3MjNFQzEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM5NjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm0gKi87IH07CisJCTFBRTcyM0VEMTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVWaXNpdG9yLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM5NzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlVmlzaXRvci5tICovOyB9OworCQkxQUU3MjNFRTEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzOTgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24ubSAqLzsgfTsKKwkJMUFFNzIzRUYxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVHJlZVdpemFyZC5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzOTkxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVdpemFyZC5tICovOyB9OworCQkxQUU3MjNGMDEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzlBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5tICovOyB9OworCQkxQUU3MjNGMTEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFFNzIzOUIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubSAqLzsgfTsKKwkJMUFFNzIzRjIxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUU3MjM5QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSAqLzsgfTsKKwkJMUFFNzIzRjMxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVW5pcXVlSURNYXAubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzlEMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlVuaXF1ZUlETWFwLm0gKi87IH07CisJCTFBRTcyM0Y0MTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFBRTcyMzlFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubSAqLzsgfTsKKy8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhCdWlsZFJ1bGUgc2VjdGlvbiAqLworCQkxQTYzQkRFQzEzNEY2NDlGMDAyRURGQjQgLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlVHlwZSA9IHBhdHRlcm4ucHJveHk7CisJCQlpc0VkaXRhYmxlID0gMTsKKwkJCW5hbWUgPSAuZy5tOworCQkJb3V0cHV0RmlsZXMgPSAoCisJCQkJJDFMZXhlci5oLAorCQkJCSQxTGV4ZXIubSwKKwkJCQkkMVBhcnNlci5oLAorCQkJCSQxUGFyc2VyLm0sCisJCQkpOworCQkJc2NyaXB0ID0gIi1qYXIgL0xpYnJhcnkvSmF2YS9FeHRlbnNpb25zL2FudGxyLTMuMy4xLmphciAkMS5nIjsKKwkJfTsKKwkJMUE2M0JERUQxMzRGNjgxMDAwMkVERkI0IC8qIFBCWEJ1aWxkUnVsZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEJ1aWxkUnVsZTsKKwkJCWNvbXBpbGVyU3BlYyA9IGNvbS5hcHBsZS5jb21waWxlcnMucHJveHkuc2NyaXB0OworCQkJZmlsZVR5cGUgPSBwYXR0ZXJuLnByb3h5OworCQkJaXNFZGl0YWJsZSA9IDE7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQkkMUxleGVyLmgsCisJCQkJJDFMZXhlci5tLAorCQkJCSQxUGFyc2VyLmgsCisJCQkJJDFQYXJzZXIubSwKKwkJCSk7CisJCQlzY3JpcHQgPSAiLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyICQxLmciOworCQl9OworCQkxQTc2QTAyQzEzNEZDNzU0MDA0MTYzNEYgLyogUEJYQnVpbGRSdWxlICovID0geworCQkJaXNhID0gUEJYQnVpbGRSdWxlOworCQkJY29tcGlsZXJTcGVjID0gY29tLmFwcGxlLmNvbXBpbGVycy5wcm94eS5zY3JpcHQ7CisJCQlmaWxlVHlwZSA9IHBhdHRlcm4ucHJveHk7CisJCQlpc0VkaXRhYmxlID0gMTsKKwkJCW5hbWUgPSAiRmlsZXMgJy5nLm0nIHVzaW5nIFNjcmlwdCI7CisJCQlvdXRwdXRGaWxlcyA9ICgKKwkJCQl0cmVlUmV3cml0ZUxleGVyLmgsCisJCQkJdHJlZVJld3JpdGVMZXhlci5tLAorCQkJCXRyZWVSZXdyaXRlUGFyc2VyLmgsCisJCQkJdHJlZVJld3JpdGVQYXJzZXIubSwKKwkJCSk7CisJCQlzY3JpcHQgPSAiLWphciAvTGlicmFyeS9KYXZhL0V4dGVuc2lvbnMvYW50bHItMy4zLjEuamFyIHRyZWVSZXdyaXRlLmciOworCQl9OworLyogRW5kIFBCWEJ1aWxkUnVsZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWENvbnRhaW5lckl0ZW1Qcm94eSBzZWN0aW9uICovCisJCTFBNjNCRDlFMTM0RjYwOTMwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREEwMTM0RjYwOUIwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREEyMTM0RjYwQTcwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREE0MTM0RjYwQjAwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREE2MTM0RjYwQkMwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREE4MTM0RjYwQzMwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREFBMTM0RjYwQ0MwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREFDMTM0RjYwRDIwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCREU1MTM0RjYyOUIwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBNjNCRTBBMTM0RkI4MjQwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisJCTFBRTcyMzJGMTM0RTg2MEIwMDFDM0YzNSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi8gPSB7CisJCQlpc2EgPSBQQlhDb250YWluZXJJdGVtUHJveHk7CisJCQljb250YWluZXJQb3J0YWwgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87CisJCQlwcm94eVR5cGUgPSAxOworCQkJcmVtb3RlR2xvYmFsSURTdHJpbmcgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU7CisJCQlyZW1vdGVJbmZvID0gQU5UTFI7CisJCX07CisvKiBFbmQgUEJYQ29udGFpbmVySXRlbVByb3h5IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYQ29weUZpbGVzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTFBNjNCQzVGMTM0RjVEQUIwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDMwMTM0RjVGMUUwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDNEMTM0RjVGMzYwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDRBMTM0RjVGNDMwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDU3MTM0RjVGNEQwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDY0MTM0RjVGNUUwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDcxMTM0RjVGNjcwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWRzdFBhdGggPSAvdXNyL3NoYXJlL21hbi9tYW4xLzsKKwkJCWRzdFN1YmZvbGRlclNwZWMgPSAwOworCQkJZmlsZXMgPSAoCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDE7CisJCX07CisJCTFBNjNCRDdFMTM0RjVGNzEwMDJFREZCNCAvKiBDb3B5IEZpbGVzICovID0geworCQkJaXNhID0gUEJYQ29weUZpbGVzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlkc3RQYXRoID0gL3Vzci9zaGFyZS9tYW4vbWFuMS87CisJCQlkc3RTdWJmb2xkZXJTcGVjID0gMDsKKwkJCWZpbGVzID0gKAorCQkJKTsKKwkJCW5hbWUgPSAiQ29weSBGaWxlcyI7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMTsKKwkJfTsKKwkJMUE2M0JERDIxMzRGNjIzMzAwMkVERkI0IC8qIENvcHlGaWxlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9IC91c3Ivc2hhcmUvbWFuL21hbjEvOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDA7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMTsKKwkJfTsKKwkJMUE2M0JERkExMzRGQjc1RTAwMkVERkI0IC8qIENvcHlGaWxlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWENvcHlGaWxlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZHN0UGF0aCA9IC91c3Ivc2hhcmUvbWFuL21hbjEvOworCQkJZHN0U3ViZm9sZGVyU3BlYyA9IDA7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMTsKKwkJfTsKKy8qIEVuZCBQQlhDb3B5RmlsZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisJCTFBMDQ4RDAxMTM0RThDMTAwMDAwNUY1NyAvKiBhbnRscjMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gYW50bHIzLmg7IHBhdGggPSAuLi9hbnRscjMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMDIxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQmFzZU1hcEVsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJCYXNlTWFwRWxlbWVudC5oOyBwYXRoID0gLi4vQU5UTFJCYXNlTWFwRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQwMzEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlUmVjb2duaXplci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkJhc2VSZWNvZ25pemVyLmg7IHBhdGggPSAuLi9BTlRMUkJhc2VSZWNvZ25pemVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDA0MTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkJhc2VTdGFjay5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkJhc2VTdGFjay5oOyBwYXRoID0gLi4vQU5UTFJCYXNlU3RhY2suaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMDUxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQmFzZVRyZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJCYXNlVHJlZS5oOyBwYXRoID0gLi4vQU5UTFJCYXNlVHJlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQwNjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDsgcGF0aCA9IC4uL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDA3MTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkJpdFNldC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkJpdFNldC5oOyBwYXRoID0gLi4vQU5UTFJCaXRTZXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMDgxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaDsgcGF0aCA9IC4uL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQwOTEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDBBMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNoYXJTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJDaGFyU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUkNoYXJTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMEIxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSQ2hhclN0cmVhbVN0YXRlLmg7IHBhdGggPSAuLi9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQwQzEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJDb21tb25FcnJvck5vZGUuaDsgcGF0aCA9IC4uL0FOVExSQ29tbW9uRXJyb3JOb2RlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDBEMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRva2VuLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSQ29tbW9uVG9rZW4uaDsgcGF0aCA9IC4uL0FOVExSQ29tbW9uVG9rZW4uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMEUxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQwRjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSQ29tbW9uVHJlZS5oOyBwYXRoID0gLi4vQU5UTFJDb21tb25UcmVlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDEwMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaDsgcGF0aCA9IC4uL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMTExMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQxMjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlVGVzdC1JbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IG5hbWUgPSAiQU5UTFJDb21tb25UcmVlVGVzdC1JbmZvLnBsaXN0IjsgcGF0aCA9ICIuLi9BTlRMUkNvbW1vblRyZWVUZXN0LUluZm8ucGxpc3QiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQxMzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Zy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkRlYnVnLmg7IHBhdGggPSAuLi9BTlRMUkRlYnVnLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDE0MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oOyBwYXRoID0gLi4vQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMTUxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdFdmVudFByb3h5LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSRGVidWdFdmVudFByb3h5Lmg7IHBhdGggPSAuLi9BTlRMUkRlYnVnRXZlbnRQcm94eS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQxNjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1BhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkRlYnVnUGFyc2VyLmg7IHBhdGggPSAuLi9BTlRMUkRlYnVnUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDE3MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUkRlYnVnVG9rZW5TdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMTgxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlQWRhcHRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkRlYnVnVHJlZUFkYXB0b3IuaDsgcGF0aCA9IC4uL0FOVExSRGVidWdUcmVlQWRhcHRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQxOTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDFBMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnVHJlZVBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkRlYnVnVHJlZVBhcnNlci5oOyBwYXRoID0gLi4vQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMUIxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSREZBLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSREZBLmg7IHBhdGggPSAuLi9BTlRMUkRGQS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQxQzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEb3VibGVLZXlNYXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJEb3VibGVLZXlNYXAuaDsgcGF0aCA9IC4uL0FOVExSRG91YmxlS2V5TWFwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDFEMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oOyBwYXRoID0gLi4vQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUEwNDhEMUUxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRXJyb3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJFcnJvci5oOyBwYXRoID0gLi4vQU5UTFJFcnJvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTA0OEQxRjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaDsgcGF0aCA9IC4uL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBMDQ4RDIwMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkZhc3RRdWV1ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkZhc3RRdWV1ZS5oOyBwYXRoID0gLi4vQU5UTFJGYXN0UXVldWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDNjExMzRGNURBQjAwMkVERkI0IC8qIEZ1enp5ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBGdXp6eTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUE2M0JDNkIxMzRGNURFNDAwMkVERkI0IC8qIEZ1enp5TGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gRnV6enlMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM2QzEzNEY1REU1MDAyRURGQjQgLyogbWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBtYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzc5MTM0RjVFQjEwMDJFREZCNCAvKiBhbnRscjMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gYW50bHIzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzdBMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZC5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IENvbWJpbmVkLmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzdCMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZC50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ29tYmluZWQudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM3QzEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWRfXy5nbCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBDb21iaW5lZF9fLmdsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM3RDEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWRMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDb21iaW5lZExleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzdFMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZExleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IENvbWJpbmVkTGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDN0YxMzRGNUVCMTAwMkVERkI0IC8qIENvbWJpbmVkUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbWJpbmVkUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzgwMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZFBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBDb21iaW5lZFBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM4MTEzNEY1RUIxMDAyRURGQjQgLyogbWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBtYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzgzMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZC50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ29tYmluZWQudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM4NTEzNEY1RUIxMDAyRURGQjQgLyogYW50bHIzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGFudGxyMy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM4NjEzNEY1RUIxMDAyRURGQjQgLyogRnV6enkuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBGdXp6eS5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM4ODEzNEY1RUIyMDAyRURGQjQgLyogRnV6enkudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IEZ1enp5LnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDODkxMzRGNUVCMjAwMkVERkI0IC8qIEZ1enp5TGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRnV6enlMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM4QjEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzhFMTM0RjVFQjIwMDJFREZCNCAvKiBGdXp6eS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBGdXp6eS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM4RjEzNEY1RUIyMDAyRURGQjQgLyogRnV6enkudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IEZ1enp5LnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDOTAxMzRGNUVCMjAwMkVERkI0IC8qIEZ1enp5TGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRnV6enlMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM5MjEzNEY1RUIyMDAyRURGQjQgLyogYW50bHIzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGFudGxyMy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM5MzEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzk0MTM0RjVFQjIwMDJFREZCNCAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDOTUxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzk2MTM0RjVFQjIwMDJFREZCNCAvKiBULmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gVC5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM5NzEzNEY1RUIyMDAyRURGQjQgLyogVC50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gVC50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzk4MTM0RjVFQjIwMDJFREZCNCAvKiBUTGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVExleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzk5MTM0RjVFQjIwMDJFREZCNCAvKiBUTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVExleGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQzlBMTM0RjVFQjIwMDJFREZCNCAvKiBUUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDOUIxMzRGNUVCMjAwMkVERkI0IC8qIFRQYXJzZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVFBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM5RDEzNEY1RUIyMDAyRURGQjQgLyogYW50bHIzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGFudGxyMy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkM5RTEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBtYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0EwMTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0LnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBUZXN0LnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQTExMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUZXN0TGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQTIxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RsZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBUZXN0bGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQTMxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gVGVzdExleGVyLnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQTQxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlckxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRlc3RMZXhlckxleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0E1MTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0LnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBUZXN0LnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQTYxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFRlc3RMZXhlci5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNBNzEzNEY1RUIyMDAyRURGQjQgLyogVGVzdExleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRlc3RMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNBODEzNEY1RUIyMDAyRURGQjQgLyogVGVzdExleGVyLmgub2xkICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFRlc3RMZXhlci5oLm9sZDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQTkxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBUZXN0TGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQUExMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5tLm9sZCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBUZXN0TGV4ZXIubS5vbGQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0FCMTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0TGV4ZXIudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFRlc3RMZXhlci50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0FDMTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0TGV4ZXJMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUZXN0TGV4ZXJMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNBRTEzNEY1RUIyMDAyRURGQjQgLyogYW50bHIzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGFudGxyMy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNBRjEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0IwMTM0RjVFQjIwMDJFREZCNCAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQjExMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0IyMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNCMzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQy50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0I0MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDX18uZ2wgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQ19fLmdsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNCNTEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNpbXBsZUNMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNCNjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNCNzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0I4MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQkExMzRGNUVCMjAwMkVERkI0IC8qIGZpbGVzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IGZpbGVzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNCQjEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0JDMTM0RjVFQjIwMDJFREZCNCAvKiBNYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IE1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQkQxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0JGMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5LnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBQb2x5LnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQzAxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBQb2x5RGlmZmVyZW50aWF0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQzExMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQb2x5TGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQzIxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBQb2x5TGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQzMxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUG9seVBhcnNlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNDNDEzNEY1RUIyMDAyRURGQjQgLyogUG9seVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBQb2x5UGFyc2VyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0M1MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGlmaWVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNpbXBsaWZpZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQzYxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsaWZpZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU2ltcGxpZmllci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNDNzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxpZmllci50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxpZmllci50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0M4MTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5LmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gUG9seS5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNDOTEzNEY1RUIyMDAyRURGQjQgLyogUG9seS50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gUG9seS50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0NBMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5RGlmZmVyZW50aWF0b3IuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBQb2x5RGlmZmVyZW50aWF0b3IuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQ0IxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBQb2x5RGlmZmVyZW50aWF0b3IubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQ0MxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQb2x5TGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQ0QxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBQb2x5TGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDQ0UxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUG9seVBhcnNlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNDRjEzNEY1RUIyMDAyRURGQjQgLyogUG9seVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBQb2x5UGFyc2VyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0QwMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5UHJpbnRlci5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFBvbHlQcmludGVyLmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0QxMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5UHJpbnRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQb2x5UHJpbnRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNEMjEzNEY1RUIyMDAyRURGQjQgLyogUG9seVByaW50ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gUG9seVByaW50ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRDMxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQcmludGVyLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBQb2x5UHJpbnRlci50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0Q0MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGlmaWVyLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxpZmllci5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNENTEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxpZmllci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGlmaWVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0Q2MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGlmaWVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsaWZpZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRDcxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsaWZpZXIudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsaWZpZXIudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNEOTEzNEY1RUIyMDAyRURGQjQgLyogYW50bHIzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IGFudGxyMy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNEQTEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gaW5wdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0RCMTM0RjVFQjIwMDJFREZCNCAvKiBtYWluLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IG1haW4ubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDREMxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBvdXRwdXQ7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0RFMTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZS50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU3ltYm9sVGFibGUudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNERjEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGVMZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTeW1ib2xUYWJsZUxleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0UwMTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZUxleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFN5bWJvbFRhYmxlTGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRTExMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFN5bWJvbFRhYmxlUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0UyMTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTeW1ib2xUYWJsZVBhcnNlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNFMzEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGUuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBTeW1ib2xUYWJsZS5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNFNDEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGUudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFN5bWJvbFRhYmxlLnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRTUxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlX18uZ2wgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU3ltYm9sVGFibGVfXy5nbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRTYxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlTGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU3ltYm9sVGFibGVMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNFNzEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGVMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTeW1ib2xUYWJsZUxleGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0U4MTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTeW1ib2xUYWJsZVBhcnNlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNFOTEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGVQYXJzZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU3ltYm9sVGFibGVQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRUIxMzRGNUVCMjAwMkVERkI0IC8qIGFudGxyMy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBhbnRscjMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRUMxMzRGNUVCMjAwMkVERkI0IC8qIGlucHV0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IGlucHV0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNFRDEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBtYWluLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0VFMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gb3V0cHV0OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNGMDEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQy50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0YxMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2ltcGxlQ0xleGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0YyMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIuamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFNpbXBsZUNMZXhlci5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNGMzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNGNDEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0Y1MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBTaW1wbGVDUGFyc2VyLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0Y2MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRjcxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDVFAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JDRjgxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gU2ltcGxlQ1RQLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0Y5MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU2ltcGxlQ1RQLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0ZBMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsZUNUUC50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0ZCMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNGQzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQy50b2tlbnMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQy50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCQ0ZEMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDX18uZ2wgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQ19fLmdsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNGRTEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNpbXBsZUNMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkNGRjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBTaW1wbGVDTGV4ZXIuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMDAxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTaW1wbGVDTGV4ZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMDExMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2ltcGxlQ1BhcnNlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQwMjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gU2ltcGxlQ1BhcnNlci5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQwMzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBTaW1wbGVDUGFyc2VyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDA0MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBTaW1wbGVDVFAuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMDUxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDVFAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMDYxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gU2ltcGxlQ1RQLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDA3MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gU2ltcGxlQ1RQLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDA4MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsZUNUUC50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDA5MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDV2Fsa2VyLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gU2ltcGxlQ1dhbGtlci5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQwQTEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1dhbGtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTaW1wbGVDV2Fsa2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDBCMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDV2Fsa2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFNpbXBsZUNXYWxrZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMEMxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNXYWxrZXIudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFNpbXBsZUNXYWxrZXIudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQwRTEzNEY1RUIyMDAyRURGQjQgLyogZmlsZXMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gZmlsZXM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDBGMTM0RjVFQjIwMDJFREZCNCAvKiBpbnB1dCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBpbnB1dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMTAxMzRGNUVCMjAwMkVERkI0IC8qIExhbmcuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBMYW5nLmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDExMTM0RjVFQjIwMDJFREZCNCAvKiBMYW5nLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBMYW5nLnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMTIxMzRGNUVCMjAwMkVERkI0IC8qIExhbmdEdW1wRGVjbC5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IExhbmdEdW1wRGVjbC5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxMzEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0R1bXBEZWNsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExhbmdEdW1wRGVjbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxNDEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0R1bXBEZWNsLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IExhbmdEdW1wRGVjbC5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxNTEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0R1bXBEZWNsLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBMYW5nRHVtcERlY2wudG9rZW5zOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxNjEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0xleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExhbmdMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxNzEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0xleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IExhbmdMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxODEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ1BhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMYW5nUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDE5MTM0RjVFQjIwMDJFREZCNCAvKiBMYW5nUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IExhbmdQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMUExMzRGNUVCMjAwMkVERkI0IC8qIE1haW4uamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IE1haW4uamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMUIxMzRGNUVCMjAwMkVERkI0IC8qIG1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gbWFpbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQxQzEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IG91dHB1dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMUUxMzRGNUVCMjAwMkVERkI0IC8qIFJFQURNRS50eHQgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gUkVBRE1FLnR4dDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMjAxMzRGNUVCMjAwMkVERkI0IC8qIGFudGxyMy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBhbnRscjMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMjExMzRGNUVCMjAwMkVERkI0IC8qIG1haW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gbWFpbi5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQyMzEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGUudG9rZW5zICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFRyZWVSZXdyaXRlLnRva2Vuczsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMjQxMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlTGV4ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJlZVJld3JpdGVMZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQyNTEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGVMZXhlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBUcmVlUmV3cml0ZUxleGVyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDI2MTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZVBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUcmVlUmV3cml0ZVBhcnNlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQyNzEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGVQYXJzZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVHJlZVJld3JpdGVQYXJzZXIubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMjgxMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlLmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gVHJlZVJld3JpdGUuZzsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMjkxMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlLnRva2VucyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBUcmVlUmV3cml0ZS50b2tlbnM7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDJBMTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZUxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRyZWVSZXdyaXRlTGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMkIxMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gVHJlZVJld3JpdGVMZXhlci5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTYzQkQyQzEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGVQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJlZVJld3JpdGVQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2M0JEMkQxMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlUGFyc2VyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IFRyZWVSZXdyaXRlUGFyc2VyLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNjNCRDMyMTM0RjVGMUUwMDJFREZCNCAvKiBjb21iaW5lZCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gY29tYmluZWQ7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBNjNCRDNGMTM0RjVGMzYwMDJFREZCNCAvKiBsZXhlcnRlc3Qtc2ltcGxlICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBNjNCRDRDMTM0RjVGNDMwMDJFREZCNCAvKiBMTC1zdGFydCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gIkxMLXN0YXJ0Ijsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUE2M0JENTkxMzRGNUY0RDAwMkVERkI0IC8qIHBvbHlkaWZmICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBwb2x5ZGlmZjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUE2M0JENjYxMzRGNUY1RTAwMkVERkI0IC8qIHNpbXBsZWNUcmVlUGFyc2VyICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBzaW1wbGVjVHJlZVBhcnNlcjsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUE2M0JENzMxMzRGNUY2NzAwMkVERkI0IC8qIHRyZWVwYXJzZXIgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHRyZWVwYXJzZXI7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBNjNCRDgwMTM0RjVGNzEwMDJFREZCNCAvKiB0cmVlcmV3cml0ZSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gdHJlZXJld3JpdGU7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBNjNCREQ0MTM0RjYyMzMwMDJFREZCNCAvKiBzY29wZXMgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9ICJjb21waWxlZC5tYWNoLW8uZXhlY3V0YWJsZSI7IGluY2x1ZGVJbkluZGV4ID0gMDsgcGF0aCA9IHNjb3Blczsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUE2M0JERkMxMzRGQjc1RTAwMkVERkI0IC8qIGhvaXN0ZWRQcmVkaWNhdGVzICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGV4cGxpY2l0RmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmV4ZWN1dGFibGUiOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBob2lzdGVkUHJlZGljYXRlczsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsgfTsKKwkJMUE2QjFDOTcxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSRmlsZVN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkZpbGVTdHJlYW0uaDsgcGF0aCA9IC4uL0FOVExSRmlsZVN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUM5ODEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJIYXNoTWFwLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSSGFzaE1hcC5oOyBwYXRoID0gLi4vQU5UTFJIYXNoTWFwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQzk5MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkhhc2hSdWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSSGFzaFJ1bGUuaDsgcGF0aCA9IC4uL0FOVExSSGFzaFJ1bGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDOUExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSW5wdXRTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJJbnB1dFN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJJbnB1dFN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUM5QjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJJbnRBcnJheS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUkludEFycmF5Lmg7IHBhdGggPSAuLi9BTlRMUkludEFycmF5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQzlDMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxleGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSTGV4ZXIuaDsgcGF0aCA9IC4uL0FOVExSTGV4ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDOUQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oOyBwYXRoID0gLi4vQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUM5RTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMZXhlclN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSTGV4ZXJTdGF0ZS5oOyBwYXRoID0gLi4vQU5UTFJMZXhlclN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQzlGMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxpbmtCYXNlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSTGlua0Jhc2UuaDsgcGF0aCA9IC4uL0FOVExSTGlua0Jhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQTAxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTG9va2FoZWFkU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSTG9va2FoZWFkU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUkxvb2thaGVhZFN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNBMTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNYXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJNYXAuaDsgcGF0aCA9IC4uL0FOVExSTWFwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0EyMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1hcEVsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJNYXBFbGVtZW50Lmg7IHBhdGggPSAuLi9BTlRMUk1hcEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQTMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaDsgcGF0aCA9IC4uL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNBNDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaDsgcGF0aCA9IC4uL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0E1MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmg7IHBhdGggPSAuLi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQTYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg7IHBhdGggPSAuLi9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNBNzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaDsgcGF0aCA9IC4uL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0E4MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oOyBwYXRoID0gLi4vQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQTkxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTm9kZU1hcEVsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJOb2RlTWFwRWxlbWVudC5oOyBwYXRoID0gLi4vQU5UTFJOb2RlTWFwRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNBQTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg7IHBhdGggPSAuLi9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0FCMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlBhcnNlci5oOyBwYXRoID0gLi4vQU5UTFJQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQUMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmg7IHBhdGggPSAuLi9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNBRDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQYXJzZVRyZWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJQYXJzZVRyZWUuaDsgcGF0aCA9IC4uL0FOVExSUGFyc2VUcmVlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0FFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlB0ckJ1ZmZlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlB0ckJ1ZmZlci5oOyBwYXRoID0gLi4vQU5UTFJQdHJCdWZmZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQUYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUHRyU3RhY2suaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJQdHJTdGFjay5oOyBwYXRoID0gLi4vQU5UTFJQdHJTdGFjay5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNCMDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSZWFkZXJTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJSZWFkZXJTdHJlYW0uaDsgcGF0aCA9IC4uL0FOVExSUmVhZGVyU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0IxMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaDsgcGF0aCA9IC4uL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQjIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmg7IHBhdGggPSAuLi9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNCMzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaDsgcGF0aCA9IC4uL0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0I0MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQjUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNCNjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0I3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSUnVsZU1hcEVsZW1lbnQuaDsgcGF0aCA9IC4uL0FOVExSUnVsZU1hcEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQjgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUnVsZU1lbW8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJSdWxlTWVtby5oOyBwYXRoID0gLi4vQU5UTFJSdWxlTWVtby5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNCOTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJSdWxlUmV0dXJuU2NvcGUuaDsgcGF0aCA9IC4uL0FOVExSUnVsZVJldHVyblNjb3BlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0JBMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVTdGFjay5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlJ1bGVTdGFjay5oOyBwYXRoID0gLi4vQU5UTFJSdWxlU3RhY2suaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQkIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUnVudGltZUV4Y2VwdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaDsgcGF0aCA9IC4uL0FOVExSUnVudGltZUV4Y2VwdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNCQzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSU3RyZWFtRW51bWVyYXRvci5oOyBwYXRoID0gLi4vQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0JEMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlN0cmluZ1N0cmVhbS5oOyBwYXRoID0gLi4vQU5UTFJTdHJpbmdTdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQkUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtU3RhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJTdHJpbmdTdHJlYW1TdGF0ZS5oOyBwYXRoID0gLi4vQU5UTFJTdHJpbmdTdHJlYW1TdGF0ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNCRjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJTeW1ib2xTdGFjay5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlN5bWJvbFN0YWNrLmg7IHBhdGggPSAuLi9BTlRMUlN5bWJvbFN0YWNrLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0MwMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRva2VuLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVG9rZW4uaDsgcGF0aCA9IC4uL0FOVExSVG9rZW4uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQzExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9ICJBTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oIjsgcGF0aCA9ICIuLi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQzIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNDMzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUb2tlblNvdXJjZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRva2VuU291cmNlLmg7IHBhdGggPSAuLi9BTlRMUlRva2VuU291cmNlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0M0MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVG9rZW5TdHJlYW0uaDsgcGF0aCA9IC4uL0FOVExSVG9rZW5TdHJlYW0uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQzUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWUuaDsgcGF0aCA9IC4uL0FOVExSVHJlZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNDNjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlQWRhcHRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVBZGFwdG9yLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVBZGFwdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0M3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVFeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJUcmVlRXhjZXB0aW9uLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVFeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQzgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZUl0ZXJhdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVHJlZUl0ZXJhdG9yLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVJdGVyYXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNDOTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlTm9kZVN0cmVhbS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVOb2RlU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVOb2RlU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0NBMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVQYXJzZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJUcmVlUGFyc2VyLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVQYXJzZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQ0IxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaDsgcGF0aCA9IC4uL0FOVExSVHJlZVBhdHRlcm5MZXhlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNDQzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0NEMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVSZXdyaXRlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVSZXdyaXRlci5oOyBwYXRoID0gLi4vQU5UTFJUcmVlUmV3cml0ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDQ0UxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaDsgcGF0aCA9IC4uL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNDRjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlVmlzaXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVWaXNpdG9yLmg7IHBhdGggPSAuLi9BTlRMUlRyZWVWaXNpdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0QwMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaDsgcGF0aCA9IC4uL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDRDExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVdpemFyZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlRyZWVXaXphcmQuaDsgcGF0aCA9IC4uL0FOVExSVHJlZVdpemFyZC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNEMjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaDsgcGF0aCA9IC4uL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0QzMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaDsgcGF0aCA9IC4uL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFDRDQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUNENTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmlxdWVJRE1hcC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBTlRMUlVuaXF1ZUlETWFwLmg7IHBhdGggPSAuLi9BTlRMUlVuaXF1ZUlETWFwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxQ0Q2MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmg7IHBhdGggPSAuLi9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMUYxMzRFOERBMTAwMTZBNDdEIC8qIEJhc2VUZXN0LmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBCYXNlVGVzdC5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQyMDEzNEU4REExMDAxNkE0N0QgLyogRGVidWdUZXN0QXV0b0FTVC5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gRGVidWdUZXN0QXV0b0FTVC5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQyMTEzNEU4REExMDAxNkE0N0QgLyogRGVidWdUZXN0Q29tcG9zaXRlR3JhbW1hcnMuamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IERlYnVnVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDIyMTM0RThEQTEwMDE2QTQ3RCAvKiBEZWJ1Z1Rlc3RSZXdyaXRlQVNULmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBEZWJ1Z1Rlc3RSZXdyaXRlQVNULmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDIzMTM0RThEQTEwMDE2QTQ3RCAvKiBFcnJvclF1ZXVlLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBFcnJvclF1ZXVlLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDI0MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0QVNUQ29uc3RydWN0aW9uLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0QVNUQ29uc3RydWN0aW9uLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDI1MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0QXR0cmlidXRlcy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdEF0dHJpYnV0ZXMuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMjYxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RBdXRvQVNULmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0QXV0b0FTVC5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQyNzEzNEU4REExMDAxNkE0N0QgLyogVGVzdEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDI4MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0Q2hhckRGQUNvbnZlcnNpb24uamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RDaGFyREZBQ29udmVyc2lvbi5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQyOTEzNEU4REExMDAxNkE0N0QgLyogVGVzdENvbW1vblRva2VuU3RyZWFtLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0Q29tbW9uVG9rZW5TdHJlYW0uamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMkExMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RDb21wb3NpdGVHcmFtbWFycy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDJCMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0REZBQ29udmVyc2lvbi5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdERGQUNvbnZlcnNpb24uamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMkMxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RERkFNYXRjaGluZy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdERGQU1hdGNoaW5nLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDJEMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0RmFzdFF1ZXVlLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0RmFzdFF1ZXVlLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDJFMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0SGV0ZXJvQVNULmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0SGV0ZXJvQVNULmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDJGMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0SW50ZXJwcmV0ZWRMZXhpbmcuamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RJbnRlcnByZXRlZExleGluZy5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzMDEzNEU4REExMDAxNkE0N0QgLyogVGVzdEludGVycHJldGVkUGFyc2luZy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdEludGVycHJldGVkUGFyc2luZy5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzMTEzNEU4REExMDAxNkE0N0QgLyogVGVzdEludGVydmFsU2V0LmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0SW50ZXJ2YWxTZXQuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMzIxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RKYXZhQ29kZUdlbmVyYXRpb24uamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RKYXZhQ29kZUdlbmVyYXRpb24uamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMzMxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RMZWZ0UmVjdXJzaW9uLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0TGVmdFJlY3Vyc2lvbi5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzNDEzNEU4REExMDAxNkE0N0QgLyogVGVzdExleGVyLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0TGV4ZXIuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMzUxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RNZXNzYWdlcy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdE1lc3NhZ2VzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDM2MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0TkZBQ29uc3RydWN0aW9uLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0TkZBQ29uc3RydWN0aW9uLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDM3MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZUFTVC5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdFJld3JpdGVBU1QuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFEMzgxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RSZXdyaXRlVGVtcGxhdGVzLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0UmV3cml0ZVRlbXBsYXRlcy5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzOTEzNEU4REExMDAxNkE0N0QgLyogVGVzdFNlbWFudGljUHJlZGljYXRlRXZhbHVhdGlvbi5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdFNlbWFudGljUHJlZGljYXRlRXZhbHVhdGlvbi5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzQTEzNEU4REExMDAxNkE0N0QgLyogVGVzdFNlbWFudGljUHJlZGljYXRlcy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdFNlbWFudGljUHJlZGljYXRlcy5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzQjEzNEU4REExMDAxNkE0N0QgLyogVGVzdFNldHMuamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RTZXRzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDNDMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0U3ltYm9sRGVmaW5pdGlvbnMuamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RTeW1ib2xEZWZpbml0aW9ucy5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQzRDEzNEU4REExMDAxNkE0N0QgLyogVGVzdFN5bnRhY3RpY1ByZWRpY2F0ZUV2YWx1YXRpb24uamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RTeW50YWN0aWNQcmVkaWNhdGVFdmFsdWF0aW9uLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDNFMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0U3ludGF4RXJyb3JzLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0U3ludGF4RXJyb3JzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDNGMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VGVtcGxhdGVzLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0VGVtcGxhdGVzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDQwMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VG9rZW5SZXdyaXRlU3RyZWFtLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0VG9rZW5SZXdyaXRlU3RyZWFtLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDQxMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VG9wb2xvZ2ljYWxTb3J0LmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0VG9wb2xvZ2ljYWxTb3J0LmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDQyMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VHJlZUdyYW1tYXJSZXdyaXRlQVNULmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0VHJlZUdyYW1tYXJSZXdyaXRlQVNULmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDQzMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VHJlZUl0ZXJhdG9yLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0VHJlZUl0ZXJhdG9yLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDQ0MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VHJlZU5vZGVTdHJlYW0uamF2YSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuamF2YTsgcGF0aCA9IFRlc3RUcmVlTm9kZVN0cmVhbS5qYXZhOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQ0NTEzNEU4REExMDAxNkE0N0QgLyogVGVzdFRyZWVQYXJzaW5nLmphdmEgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmphdmE7IHBhdGggPSBUZXN0VHJlZVBhcnNpbmcuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENDYxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RUcmVlcy5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdFRyZWVzLmphdmE7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDQ3MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VHJlZVdpemFyZC5qYXZhICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5qYXZhOyBwYXRoID0gVGVzdFRyZWVXaXphcmQuamF2YTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENEExMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkZhc3RRdWV1ZVRlc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENEIxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkZhc3RRdWV1ZVRlc3QubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENEMxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSSW50QXJyYXlUZXN0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFOVExSSW50QXJyYXlUZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDREMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkludEFycmF5VGVzdC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkludEFycmF5VGVzdC5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQ0RjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJSZWNvZ25pemVyVGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlJlY29nbml6ZXJUZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDUwMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml6ZXJUZXN0Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSUmVjb2duaXplclRlc3QubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENTIxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQml0U2V0VGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkJpdFNldFRlc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENTMxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQml0U2V0VGVzdC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkJpdFNldFRlc3QubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENTUxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENTYxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlN0cmluZ1N0cmVhbVRlc3QubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENTgxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDU5MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQ1QjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25Ub2tlblRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJDb21tb25Ub2tlblRlc3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENUMxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgcGF0aCA9IEFOVExSQ29tbW9uVG9rZW5UZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDVFMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJDb21tb25FcnJvck5vZGVUZXN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDVGMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJDb21tb25FcnJvck5vZGVUZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDYwMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yVGVzdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBBTlRMUkNvbW1vblRyZWVBZGFwdG9yVGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQ2MTEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBwYXRoID0gQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QubTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUE2QjFENjIxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJDb21tb25UcmVlVGVzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQTZCMUQ2MzEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlVGVzdC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUkNvbW1vblRyZWVUZXN0Lm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBNkIxRDc4MTM0RUEwOTcwMDE2QTQ3RCAvKiBTZW5UZXN0aW5nS2l0LmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gU2VuVGVzdGluZ0tpdC5mcmFtZXdvcms7IHBhdGggPSBMaWJyYXJ5L0ZyYW1ld29ya3MvU2VuVGVzdGluZ0tpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBERVZFTE9QRVJfRElSOyB9OworCQkxQUFDMUMzQzEzNEZENkE1MDBCMkRDNjggLyogQU5UTFIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQU5UTFIuaDsgcGF0aCA9IC4uL0FOVExSLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZXhwbGljaXRGaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBpbmNsdWRlSW5JbmRleCA9IDA7IHBhdGggPSBBTlRMUi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBRTcyMzFCMTM0RTg2MEIwMDFDM0YzNSAvKiBDb2NvYS5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvY29hLmZyYW1ld29yazsgcGF0aCA9IFN5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJMUFFNzIzMUUxMzRFODYwQjAwMUMzRjM1IC8qIEFwcEtpdC5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IEFwcEtpdC5mcmFtZXdvcms7IHBhdGggPSBTeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0FwcEtpdC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OworCQkxQUU3MjMxRjEzNEU4NjBCMDAxQzNGMzUgLyogQ29yZURhdGEuZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBDb3JlRGF0YS5mcmFtZXdvcms7IHBhdGggPSBTeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0NvcmVEYXRhLmZyYW1ld29yazsgc291cmNlVHJlZSA9IFNES1JPT1Q7IH07CisJCTFBRTcyMzIzMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi1JbmZvLnBsaXN0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dC5wbGlzdC54bWw7IHBhdGggPSAiQU5UTFItSW5mby5wbGlzdCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBRTcyMzI1MTM0RTg2MEIwMDFDM0YzNSAvKiBlbiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQucGxpc3Quc3RyaW5nczsgbmFtZSA9IGVuOyBwYXRoID0gZW4ubHByb2ovSW5mb1BsaXN0LnN0cmluZ3M7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBRTcyMzI3MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi1QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiQU5UTFItUHJlZml4LnBjaCI7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBRTcyMzJEMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUlRlc3RzLm9jdGVzdCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBsaWNpdEZpbGVUeXBlID0gd3JhcHBlci5jZmJ1bmRsZTsgaW5jbHVkZUluSW5kZXggPSAwOyBwYXRoID0gQU5UTFJUZXN0cy5vY3Rlc3Q7IHNvdXJjZVRyZWUgPSBCVUlMVF9QUk9EVUNUU19ESVI7IH07CisJCTFBRTcyMzM0MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUlRlc3RzLUluZm8ucGxpc3QgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnhtbDsgcGF0aCA9ICJBTlRMUlRlc3RzLUluZm8ucGxpc3QiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUU3MjMzNjEzNEU4NjBCMDAxQzNGMzUgLyogZW4gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0LnBsaXN0LnN0cmluZ3M7IG5hbWUgPSBlbjsgcGF0aCA9IGVuLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUU3MjMzODEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy1QcmVmaXgucGNoICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSAiQU5UTFJUZXN0cy1QcmVmaXgucGNoIjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFFNzIzMzkxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSVGVzdHMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQU5UTFJUZXN0cy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkxQUU3MjMzQjEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IHBhdGggPSBBTlRMUlRlc3RzLm07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTFBRTcyMzQ1MTM0RTg5QkYwMDFDM0YzNSAvKiBDb3JlRm91bmRhdGlvbi5mcmFtZXdvcmsgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSB3cmFwcGVyLmZyYW1ld29yazsgbmFtZSA9IENvcmVGb3VuZGF0aW9uLmZyYW1ld29yazsgcGF0aCA9IFN5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gU0RLUk9PVDsgfTsKKwkJMUFFNzIzNDYxMzRFODlCRjAwMUMzRjM1IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gd3JhcHBlci5mcmFtZXdvcms7IG5hbWUgPSBGb3VuZGF0aW9uLmZyYW1ld29yazsgcGF0aCA9IFN5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSBTREtST09UOyB9OworCQkxQUU3MjM0OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkJhc2VNYXBFbGVtZW50Lm07IHBhdGggPSAuLi9BTlRMUkJhc2VNYXBFbGVtZW50Lm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNEExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZVJlY29nbml6ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJCYXNlUmVjb2duaXplci5tOyBwYXRoID0gLi4vQU5UTFJCYXNlUmVjb2duaXplci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzRCMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VTdGFjay5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkJhc2VTdGFjay5tOyBwYXRoID0gLi4vQU5UTFJCYXNlU3RhY2subTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM0QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlVHJlZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkJhc2VUcmVlLm07IHBhdGggPSAuLi9BTlRMUkJhc2VUcmVlLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNEQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZVRyZWVBZGFwdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSQmFzZVRyZWVBZGFwdG9yLm07IHBhdGggPSAuLi9BTlRMUkJhc2VUcmVlQWRhcHRvci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzRFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJpdFNldC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkJpdFNldC5tOyBwYXRoID0gLi4vQU5UTFJCaXRTZXQubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM0RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tOyBwYXRoID0gLi4vQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNTAxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzUxMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tOyBwYXRoID0gLi4vQU5UTFJDaGFyU3RyZWFtU3RhdGUubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM1MjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25FcnJvck5vZGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJDb21tb25FcnJvck5vZGUubTsgcGF0aCA9IC4uL0FOVExSQ29tbW9uRXJyb3JOb2RlLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNTMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVG9rZW4ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJDb21tb25Ub2tlbi5tOyBwYXRoID0gLi4vQU5UTFJDb21tb25Ub2tlbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzU0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM1NTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25UcmVlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSQ29tbW9uVHJlZS5tOyBwYXRoID0gLi4vQU5UTFJDb21tb25UcmVlLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNTYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJDb21tb25UcmVlQWRhcHRvci5tOyBwYXRoID0gLi4vQU5UTFJDb21tb25UcmVlQWRhcHRvci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzU3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM1ODEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJEZWJ1Z0V2ZW50UHJveHkubTsgcGF0aCA9IC4uL0FOVExSRGVidWdFdmVudFByb3h5Lm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNTkxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdQYXJzZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJEZWJ1Z1BhcnNlci5tOyBwYXRoID0gLi4vQU5UTFJEZWJ1Z1BhcnNlci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzVBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLm07IHBhdGggPSAuLi9BTlRMUkRlYnVnVG9rZW5TdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM1QjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSRGVidWdUcmVlQWRhcHRvci5tOyBwYXRoID0gLi4vQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNUMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzVEMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnVHJlZVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkRlYnVnVHJlZVBhcnNlci5tOyBwYXRoID0gLi4vQU5UTFJEZWJ1Z1RyZWVQYXJzZXIubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM1RTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJERkEubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJERkEubTsgcGF0aCA9IC4uL0FOVExSREZBLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNUYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRG91YmxlS2V5TWFwLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSRG91YmxlS2V5TWFwLm07IHBhdGggPSAuLi9BTlRMUkRvdWJsZUtleU1hcC5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzYwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tOyBwYXRoID0gLi4vQU5UTFJFYXJseUV4aXRFeGNlcHRpb24ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM2MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24ubTsgcGF0aCA9IC4uL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNjIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRmFzdFF1ZXVlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSRmFzdFF1ZXVlLm07IHBhdGggPSAuLi9BTlRMUkZhc3RRdWV1ZS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzYzMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkZpbGVTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJGaWxlU3RyZWFtLm07IHBhdGggPSAuLi9BTlRMUkZpbGVTdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM2NDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJIYXNoTWFwLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSSGFzaE1hcC5tOyBwYXRoID0gLi4vQU5UTFJIYXNoTWFwLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNjUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSSGFzaFJ1bGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJIYXNoUnVsZS5tOyBwYXRoID0gLi4vQU5UTFJIYXNoUnVsZS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzY2MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUklucHV0U3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSSW5wdXRTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSSW5wdXRTdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM2NzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJJbnRBcnJheS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkludEFycmF5Lm07IHBhdGggPSAuLi9BTlRMUkludEFycmF5Lm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNjgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSSW50U3RyZWFtLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFOVExSSW50U3RyZWFtLmg7IHBhdGggPSAuLi9BTlRMUkludFN0cmVhbS5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzY5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkxleGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSTGV4ZXIubTsgcGF0aCA9IC4uL0FOVExSTGV4ZXIubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM2QTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm07IHBhdGggPSAuLi9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNkIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTGV4ZXJTdGF0ZS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUkxleGVyU3RhdGUubTsgcGF0aCA9IC4uL0FOVExSTGV4ZXJTdGF0ZS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzZDMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkxpbmtCYXNlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSTGlua0Jhc2UubTsgcGF0aCA9IC4uL0FOVExSTGlua0Jhc2UubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM2RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJMb29rYWhlYWRTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSTG9va2FoZWFkU3RyZWFtLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNkUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWFwLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSTWFwLm07IHBhdGggPSAuLi9BTlRMUk1hcC5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzZGMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1hcEVsZW1lbnQubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJNYXBFbGVtZW50Lm07IHBhdGggPSAuLi9BTlRMUk1hcEVsZW1lbnQubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM3MDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5tOyBwYXRoID0gLi4vQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNzExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm07IHBhdGggPSAuLi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzcyMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm07IHBhdGggPSAuLi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM3MzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubTsgcGF0aCA9IC4uL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNzQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm07IHBhdGggPSAuLi9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzc1MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5tOyBwYXRoID0gLi4vQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM3NjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJOb2RlTWFwRWxlbWVudC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUk5vZGVNYXBFbGVtZW50Lm07IHBhdGggPSAuLi9BTlRMUk5vZGVNYXBFbGVtZW50Lm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzNzcxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5tOyBwYXRoID0gLi4vQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzc4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlBhcnNlci5tOyBwYXRoID0gLi4vQU5UTFJQYXJzZXIubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM3OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUubTsgcGF0aCA9IC4uL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzN0ExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUGFyc2VUcmVlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUGFyc2VUcmVlLm07IHBhdGggPSAuLi9BTlRMUlBhcnNlVHJlZS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzdCMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlB0ckJ1ZmZlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlB0ckJ1ZmZlci5tOyBwYXRoID0gLi4vQU5UTFJQdHJCdWZmZXIubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM3QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJQdHJTdGFjay5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlB0clN0YWNrLm07IHBhdGggPSAuLi9BTlRMUlB0clN0YWNrLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzN0QxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmVhZGVyU3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUmVhZGVyU3RyZWFtLm07IHBhdGggPSAuLi9BTlRMUlJlYWRlclN0cmVhbS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzdFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubTsgcGF0aCA9IC4uL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM3RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubTsgcGF0aCA9IC4uL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzODAxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm07IHBhdGggPSAuLi9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzgxMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5tOyBwYXRoID0gLi4vQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM4MjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzODMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzg0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUnVsZU1hcEVsZW1lbnQubTsgcGF0aCA9IC4uL0FOVExSUnVsZU1hcEVsZW1lbnQubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM4NTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSdWxlTWVtby5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlJ1bGVNZW1vLm07IHBhdGggPSAuLi9BTlRMUlJ1bGVNZW1vLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzODYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUnVsZVJldHVyblNjb3BlLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUnVsZVJldHVyblNjb3BlLm07IHBhdGggPSAuLi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzg3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bGVTdGFjay5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlJ1bGVTdGFjay5tOyBwYXRoID0gLi4vQU5UTFJSdWxlU3RhY2subTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM4ODEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSUnVudGltZUV4Y2VwdGlvbi5tOyBwYXRoID0gLi4vQU5UTFJSdW50aW1lRXhjZXB0aW9uLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzODkxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlN0cmVhbUVudW1lcmF0b3IubTsgcGF0aCA9IC4uL0FOVExSU3RyZWFtRW51bWVyYXRvci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzhBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlN0cmluZ1N0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlN0cmluZ1N0cmVhbS5tOyBwYXRoID0gLi4vQU5UTFJTdHJpbmdTdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM4QjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJTeW1ib2xTdGFjay5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlN5bWJvbFN0YWNrLm07IHBhdGggPSAuLi9BTlRMUlN5bWJvbFN0YWNrLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOEMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9ICJBTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5tIjsgcGF0aCA9ICIuLi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5tIjsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM4RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOEYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZUFkYXB0b3IubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlQWRhcHRvci5tOyBwYXRoID0gLi4vQU5UTFJUcmVlQWRhcHRvci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzkwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlRXhjZXB0aW9uLm07IHBhdGggPSAuLi9BTlRMUlRyZWVFeGNlcHRpb24ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM5MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlSXRlcmF0b3IubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlSXRlcmF0b3IubTsgcGF0aCA9IC4uL0FOVExSVHJlZUl0ZXJhdG9yLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOTIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlRyZWVQYXJzZXIubTsgcGF0aCA9IC4uL0FOVExSVHJlZVBhcnNlci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzkzMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlUGF0dGVybkxleGVyLm07IHBhdGggPSAuLi9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM5NDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlUGF0dGVyblBhcnNlci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm07IHBhdGggPSAuLi9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOTUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVJld3JpdGVyLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMub2JqYzsgbmFtZSA9IEFOVExSVHJlZVJld3JpdGVyLm07IHBhdGggPSAuLi9BTlRMUlRyZWVSZXdyaXRlci5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzk2MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm07IHBhdGggPSAuLi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM5NzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlVmlzaXRvci5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlRyZWVWaXNpdG9yLm07IHBhdGggPSAuLi9BTlRMUlRyZWVWaXNpdG9yLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOTgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tOyBwYXRoID0gLi4vQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzk5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVXaXphcmQubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJUcmVlV2l6YXJkLm07IHBhdGggPSAuLi9BTlRMUlRyZWVXaXphcmQubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM5QTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0ubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0ubTsgcGF0aCA9IC4uL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOUIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5vYmpjOyBuYW1lID0gQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5tOyBwYXRoID0gLi4vQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJCTFBRTcyMzlDMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5tOyBwYXRoID0gLi4vQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubTsgc291cmNlVHJlZSA9IFNPVVJDRV9ST09UOyB9OworCQkxQUU3MjM5RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJVbmlxdWVJRE1hcC5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlVuaXF1ZUlETWFwLm07IHBhdGggPSAuLi9BTlRMUlVuaXF1ZUlETWFwLm07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJMUFFNzIzOUUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLm9iamM7IG5hbWUgPSBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubTsgcGF0aCA9IC4uL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisvKiBFbmQgUEJYRmlsZVJlZmVyZW5jZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUE2M0JDNUUxMzRGNURBQjAwMkVERkI0IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTYzQkM3MDEzNEY1RTQzMDAyRURGQjQgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUE2M0JERjExMzRGQUI0QjAwMkVERkI0IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTYzQkQyRjEzNEY1RjFFMDAyRURGQjQgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNjNCREVGMTM0RjkzQTUwMDJFREZCNCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTYzQkRGMDEzNEY5M0FDMDAyRURGQjQgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNjNCRDNDMTM0RjVGMzYwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE2M0JERjIxMzRGQUI2MDAwMkVERkI0IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCREYzMTM0RkFCNjMwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE2M0JENDkxMzRGNUY0MzAwMkVERkI0IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQUI3RkUxODEzNEZDMDgwMDA1OTQ3NEIgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUE2M0JEQUYxMzRGNjE0RDAwMkVERkI0IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTYzQkQ1NjEzNEY1RjREMDAyRURGQjQgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNjNCRTBDMTM0RkI4NTUwMDJFREZCNCAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTYzQkRCNDEzNEY2MTU0MDAyRURGQjQgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNjNCRDYzMTM0RjVGNUUwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUFCN0ZFMTcxMzRGQkZCMjAwNTk0NzRCIC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCREI5MTM0RjYxNUEwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE2M0JENzAxMzRGNUY2NzAwMkVERkI0IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQUI3RkUxNTEzNEZCRjkwMDA1OTQ3NEIgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUE2M0JEQkUxMzRGNjE2MDAwMkVERkI0IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTYzQkQ3RDEzNEY1RjcxMDAyRURGQjQgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBQjdGRTE2MTM0RkJGOUYwMDU5NDc0QiAvKiBBTlRMUi5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQTYzQkRDMzEzNEY2MTY3MDAyRURGQjQgLyogQ29jb2EuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNjNCREQxMTM0RjYyMzMwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE2M0JERjQxMzRGQUY1ODAwMkVERkI0IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCREUxMTM0RjYyNkEwMDJFREZCNCAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE2M0JERjkxMzRGQjc1RTAwMkVERkI0IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTYzQkUwODEzNEZCODE0MDAyRURGQjQgLyogQU5UTFIuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUE2M0JFMDkxMzRGQjgxODAwMkVERkI0IC8qIENvY29hLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQUU3MjMxNDEzNEU4NjBCMDAxQzNGMzUgLyogRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBRTcyMzFDMTM0RTg2MEIwMDFDM0YzNSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCQkxQUU3MjM0NzEzNEU4OUJGMDAxQzNGMzUgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUFFNzIzNDgxMzRFODlCRjAwMUMzRjM1IC8qIEZvdW5kYXRpb24uZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBRTcyMzI5MTM0RTg2MEIwMDFDM0YzNSAvKiBGcmFtZXdvcmtzICovID0geworCQkJaXNhID0gUEJYRnJhbWV3b3Jrc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE2QjFENzkxMzRFQTA5NzAwMTZBNDdEIC8qIFNlblRlc3RpbmdLaXQuZnJhbWV3b3JrIGluIEZyYW1ld29ya3MgKi8sCisJCQkJMUFFNzIzMzExMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovLAorCQkJCTFBRTcyMzJFMTM0RTg2MEIwMDFDM0YzNSAvKiBDb2NvYS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhGcmFtZXdvcmtzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWEdyb3VwIHNlY3Rpb24gKi8KKwkJMUEwNDhDRkYxMzRFOEI5MTAwMDA1RjU3IC8qIENsYXNzZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBQUMxQzNDMTM0RkQ2QTUwMEIyREM2OCAvKiBBTlRMUi5oICovLAorCQkJCTFBMDQ4RDAxMTM0RThDMTAwMDAwNUY1NyAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTA0OEQwMjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5oICovLAorCQkJCTFBMDQ4RDAzMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLmggKi8sCisJCQkJMUEwNDhEMDQxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQmFzZVN0YWNrLmggKi8sCisJCQkJMUEwNDhEMDUxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQmFzZVRyZWUuaCAqLywKKwkJCQkxQTA0OEQwNjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCAqLywKKwkJCQkxQTA0OEQwNzEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCaXRTZXQuaCAqLywKKwkJCQkxQTA0OEQwODEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggKi8sCisJCQkJMUEwNDhEMDkxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oICovLAorCQkJCTFBMDQ4RDBBMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNoYXJTdHJlYW0uaCAqLywKKwkJCQkxQTA0OEQwQjEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDaGFyU3RyZWFtU3RhdGUuaCAqLywKKwkJCQkxQTA0OEQwQzEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCAqLywKKwkJCQkxQTA0OEQwRDEzNEU4QzEwMDAwMDVGNTcgLyogQU5UTFJDb21tb25Ub2tlbi5oICovLAorCQkJCTFBMDQ4RDBFMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRva2VuU3RyZWFtLmggKi8sCisJCQkJMUEwNDhEMEYxMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVHJlZS5oICovLAorCQkJCTFBMDQ4RDEwMTM0RThDMTAwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmggKi8sCisJCQkJMUEwNDhEMTExMzRFOEMxMDAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCAqLywKKwkJCQkxQTA0OEQxMjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDb21tb25UcmVlVGVzdC1JbmZvLnBsaXN0ICovLAorCQkJCTFBMDQ4RDEzMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnLmggKi8sCisJCQkJMUEwNDhEMTQxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdFdmVudExpc3RlbmVyLmggKi8sCisJCQkJMUEwNDhEMTUxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdFdmVudFByb3h5LmggKi8sCisJCQkJMUEwNDhEMTYxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdQYXJzZXIuaCAqLywKKwkJCQkxQTA0OEQxNzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmggKi8sCisJCQkJMUEwNDhEMTgxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdUcmVlQWRhcHRvci5oICovLAorCQkJCTFBMDQ4RDE5MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCAqLywKKwkJCQkxQTA0OEQxQTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCAqLywKKwkJCQkxQTA0OEQxQjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJERkEuaCAqLywKKwkJCQkxQTA0OEQxQzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEb3VibGVLZXlNYXAuaCAqLywKKwkJCQkxQTA0OEQxRDEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCAqLywKKwkJCQkxQTA0OEQxRTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJFcnJvci5oICovLAorCQkJCTFBMDQ4RDFGMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oICovLAorCQkJCTFBMDQ4RDIwMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkZhc3RRdWV1ZS5oICovLAorCQkJCTFBNkIxQzk3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkZpbGVTdHJlYW0uaCAqLywKKwkJCQkxQTZCMUM5ODEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJIYXNoTWFwLmggKi8sCisJCQkJMUE2QjFDOTkxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSGFzaFJ1bGUuaCAqLywKKwkJCQkxQTZCMUM5QTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJJbnB1dFN0cmVhbS5oICovLAorCQkJCTFBNkIxQzlCMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkludEFycmF5LmggKi8sCisJCQkJMUFFNzIzNjgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSSW50U3RyZWFtLmggKi8sCisJCQkJMUE2QjFDOUMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTGV4ZXIuaCAqLywKKwkJCQkxQTZCMUM5RDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oICovLAorCQkJCTFBNkIxQzlFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxleGVyU3RhdGUuaCAqLywKKwkJCQkxQTZCMUM5RjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMaW5rQmFzZS5oICovLAorCQkJCTFBNkIxQ0EwMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxvb2thaGVhZFN0cmVhbS5oICovLAorCQkJCTFBNkIxQ0ExMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1hcC5oICovLAorCQkJCTFBNkIxQ0EyMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1hcEVsZW1lbnQuaCAqLywKKwkJCQkxQTZCMUNBMzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmggKi8sCisJCQkJMUE2QjFDQTQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmggKi8sCisJCQkJMUE2QjFDQTUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oICovLAorCQkJCTFBNkIxQ0E2MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oICovLAorCQkJCTFBNkIxQ0E3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oICovLAorCQkJCTFBNkIxQ0E4MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oICovLAorCQkJCTFBNkIxQ0E5MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk5vZGVNYXBFbGVtZW50LmggKi8sCisJCQkJMUE2QjFDQUExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCAqLywKKwkJCQkxQTZCMUNBQjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQYXJzZXIuaCAqLywKKwkJCQkxQTZCMUNBQzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaCAqLywKKwkJCQkxQTZCMUNBRDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQYXJzZVRyZWUuaCAqLywKKwkJCQkxQTZCMUNBRTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQdHJCdWZmZXIuaCAqLywKKwkJCQkxQTZCMUNBRjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJQdHJTdGFjay5oICovLAorCQkJCTFBNkIxQ0IwMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJlYWRlclN0cmVhbS5oICovLAorCQkJCTFBNkIxQ0IxMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmggKi8sCisJCQkJMUE2QjFDQjIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmggKi8sCisJCQkJMUE2QjFDQjMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggKi8sCisJCQkJMUE2QjFDQjQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmggKi8sCisJCQkJMUE2QjFDQjUxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmggKi8sCisJCQkJMUE2QjFDQjYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oICovLAorCQkJCTFBNkIxQ0I3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVNYXBFbGVtZW50LmggKi8sCisJCQkJMUE2QjFDQjgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUnVsZU1lbW8uaCAqLywKKwkJCQkxQTZCMUNCOTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCAqLywKKwkJCQkxQTZCMUNCQTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdWxlU3RhY2suaCAqLywKKwkJCQkxQTZCMUNCQjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJSdW50aW1lRXhjZXB0aW9uLmggKi8sCisJCQkJMUE2QjFDQkMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5oICovLAorCQkJCTFBNkIxQ0JEMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbS5oICovLAorCQkJCTFBNkIxQ0JFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbVN0YXRlLmggKi8sCisJCQkJMUE2QjFDQkYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSU3ltYm9sU3RhY2suaCAqLywKKwkJCQkxQTZCMUNDMDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUb2tlbi5oICovLAorCQkJCTFBNkIxQ0MxMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oICovLAorCQkJCTFBNkIxQ0MyMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oICovLAorCQkJCTFBNkIxQ0MzMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRva2VuU291cmNlLmggKi8sCisJCQkJMUE2QjFDQzQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVG9rZW5TdHJlYW0uaCAqLywKKwkJCQkxQTZCMUNDNTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlLmggKi8sCisJCQkJMUE2QjFDQzYxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZUFkYXB0b3IuaCAqLywKKwkJCQkxQTZCMUNDNzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlRXhjZXB0aW9uLmggKi8sCisJCQkJMUE2QjFDQzgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZUl0ZXJhdG9yLmggKi8sCisJCQkJMUE2QjFDQzkxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZU5vZGVTdHJlYW0uaCAqLywKKwkJCQkxQTZCMUNDQTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlUGFyc2VyLmggKi8sCisJCQkJMUE2QjFDQ0IxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5oICovLAorCQkJCTFBNkIxQ0NDMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmggKi8sCisJCQkJMUE2QjFDQ0QxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVJld3JpdGVyLmggKi8sCisJCQkJMUE2QjFDQ0UxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oICovLAorCQkJCTFBNkIxQ0NGMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlRyZWVWaXNpdG9yLmggKi8sCisJCQkJMUE2QjFDRDAxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24uaCAqLywKKwkJCQkxQTZCMUNEMTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJUcmVlV2l6YXJkLmggKi8sCisJCQkJMUE2QjFDRDIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmggKi8sCisJCQkJMUE2QjFDRDMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaCAqLywKKwkJCQkxQTZCMUNENDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCAqLywKKwkJCQkxQTZCMUNENTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJVbmlxdWVJRE1hcC5oICovLAorCQkJCTFBNkIxQ0Q2MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaCAqLywKKwkJCQkxQUU3MjM0OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlTWFwRWxlbWVudC5tICovLAorCQkJCTFBRTcyMzRBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLm0gKi8sCisJCQkJMUFFNzIzNEIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZVN0YWNrLm0gKi8sCisJCQkJMUFFNzIzNEMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZVRyZWUubSAqLywKKwkJCQkxQUU3MjM0RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IubSAqLywKKwkJCQkxQUU3MjM0RTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCaXRTZXQubSAqLywKKwkJCQkxQUU3MjM0RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzNTAxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tICovLAorCQkJCTFBRTcyMzUxMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5tICovLAorCQkJCTFBRTcyMzUyMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZS5tICovLAorCQkJCTFBRTcyMzUzMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRva2VuLm0gKi8sCisJCQkJMUFFNzIzNTQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0ubSAqLywKKwkJCQkxQUU3MjM1NTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25UcmVlLm0gKi8sCisJCQkJMUFFNzIzNTYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IubSAqLywKKwkJCQkxQUU3MjM1NzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5tICovLAorCQkJCTFBRTcyMzU4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnRXZlbnRQcm94eS5tICovLAorCQkJCTFBRTcyMzU5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnUGFyc2VyLm0gKi8sCisJCQkJMUFFNzIzNUExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdUb2tlblN0cmVhbS5tICovLAorCQkJCTFBRTcyMzVCMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IubSAqLywKKwkJCQkxQUU3MjM1QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzNUQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRGVidWdUcmVlUGFyc2VyLm0gKi8sCisJCQkJMUFFNzIzNUUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSREZBLm0gKi8sCisJCQkJMUFFNzIzNUYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRG91YmxlS2V5TWFwLm0gKi8sCisJCQkJMUFFNzIzNjAxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uLm0gKi8sCisJCQkJMUFFNzIzNjExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm0gKi8sCisJCQkJMUFFNzIzNjIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRmFzdFF1ZXVlLm0gKi8sCisJCQkJMUFFNzIzNjMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRmlsZVN0cmVhbS5tICovLAorCQkJCTFBRTcyMzY0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkhhc2hNYXAubSAqLywKKwkJCQkxQUU3MjM2NTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJIYXNoUnVsZS5tICovLAorCQkJCTFBRTcyMzY2MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUklucHV0U3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzNjcxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSSW50QXJyYXkubSAqLywKKwkJCQkxQUU3MjM2OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJMZXhlci5tICovLAorCQkJCTFBRTcyMzZBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0gKi8sCisJCQkJMUFFNzIzNkIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTGV4ZXJTdGF0ZS5tICovLAorCQkJCTFBRTcyMzZDMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkxpbmtCYXNlLm0gKi8sCisJCQkJMUFFNzIzNkQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTG9va2FoZWFkU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzNkUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWFwLm0gKi8sCisJCQkJMUFFNzIzNkYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWFwRWxlbWVudC5tICovLAorCQkJCTFBRTcyMzcwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSAqLywKKwkJCQkxQUU3MjM3MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24ubSAqLywKKwkJCQkxQUU3MjM3MjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0gKi8sCisJCQkJMUFFNzIzNzMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm0gKi8sCisJCQkJMUFFNzIzNzQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm0gKi8sCisJCQkJMUFFNzIzNzUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm0gKi8sCisJCQkJMUFFNzIzNzYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSTm9kZU1hcEVsZW1lbnQubSAqLywKKwkJCQkxQUU3MjM3NzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5tICovLAorCQkJCTFBRTcyMzc4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlBhcnNlci5tICovLAorCQkJCTFBRTcyMzc5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tICovLAorCQkJCTFBRTcyMzdBMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlBhcnNlVHJlZS5tICovLAorCQkJCTFBRTcyMzdCMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlB0ckJ1ZmZlci5tICovLAorCQkJCTFBRTcyMzdDMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlB0clN0YWNrLm0gKi8sCisJCQkJMUFFNzIzN0QxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmVhZGVyU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzN0UxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubSAqLywKKwkJCQkxQUU3MjM3RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubSAqLywKKwkJCQkxQUU3MjM4MDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ubSAqLywKKwkJCQkxQUU3MjM4MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubSAqLywKKwkJCQkxQUU3MjM4MjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubSAqLywKKwkJCQkxQUU3MjM4MzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzODQxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSUnVsZU1hcEVsZW1lbnQubSAqLywKKwkJCQkxQUU3MjM4NTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJSdWxlTWVtby5tICovLAorCQkJCTFBRTcyMzg2MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bGVSZXR1cm5TY29wZS5tICovLAorCQkJCTFBRTcyMzg3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bGVTdGFjay5tICovLAorCQkJCTFBRTcyMzg4MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSAqLywKKwkJCQkxQUU3MjM4OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm0gKi8sCisJCQkJMUFFNzIzOEExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSU3RyaW5nU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzOEIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSU3ltYm9sU3RhY2subSAqLywKKwkJCQkxQUU3MjM4QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubSAqLywKKwkJCQkxQUU3MjM4RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSAqLywKKwkJCQkxQUU3MjM4RjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlQWRhcHRvci5tICovLAorCQkJCTFBRTcyMzkwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVFeGNlcHRpb24ubSAqLywKKwkJCQkxQUU3MjM5MTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlSXRlcmF0b3IubSAqLywKKwkJCQkxQUU3MjM5MjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlUGFyc2VyLm0gKi8sCisJCQkJMUFFNzIzOTMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5tICovLAorCQkJCTFBRTcyMzk0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0gKi8sCisJCQkJMUFFNzIzOTUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVJld3JpdGVyLm0gKi8sCisJCQkJMUFFNzIzOTYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tICovLAorCQkJCTFBRTcyMzk3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlRyZWVWaXNpdG9yLm0gKi8sCisJCQkJMUFFNzIzOTgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24ubSAqLywKKwkJCQkxQUU3MjM5OTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJUcmVlV2l6YXJkLm0gKi8sCisJCQkJMUFFNzIzOUExMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm0gKi8sCisJCQkJMUFFNzIzOUIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubSAqLywKKwkJCQkxQUU3MjM5QzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSAqLywKKwkJCQkxQUU3MjM5RDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJVbmlxdWVJRE1hcC5tICovLAorCQkJCTFBRTcyMzlFMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubSAqLywKKwkJCSk7CisJCQluYW1lID0gQ2xhc3NlczsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCQzc3MTM0RjVFQjEwMDJFREZCNCAvKiBleGFtcGxlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2M0JDNzgxMzRGNUVCMTAwMkVERkI0IC8qIGNvbWJpbmVkICovLAorCQkJCTFBNjNCQzg0MTM0RjVFQjEwMDJFREZCNCAvKiBmdXp6eSAqLywKKwkJCQkxQTYzQkM5MTEzNEY1RUIyMDAyRURGQjQgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8sCisJCQkJMUE2M0JDOUMxMzRGNUVCMjAwMkVERkI0IC8qIGxleGVydGVzdC1zaW1wbGUgKi8sCisJCQkJMUE2M0JDQUQxMzRGNUVCMjAwMkVERkI0IC8qIExMLXN0YXIgKi8sCisJCQkJMUE2M0JDQjkxMzRGNUVCMjAwMkVERkI0IC8qIHBvbHlkaWZmICovLAorCQkJCTFBNjNCQ0Q4MTM0RjVFQjIwMDJFREZCNCAvKiBzY29wZXMgKi8sCisJCQkJMUE2M0JDRUExMzRGNUVCMjAwMkVERkI0IC8qIHNpbXBsZWNUcmVlUGFyc2VyICovLAorCQkJCTFBNjNCRDBEMTM0RjVFQjIwMDJFREZCNCAvKiB0cmVlcGFyc2VyICovLAorCQkJCTFBNjNCRDFGMTM0RjVFQjIwMDJFREZCNCAvKiB0cmVlcmV3cml0ZSAqLywKKwkJCSk7CisJCQluYW1lID0gZXhhbXBsZXM7CisJCQlwYXRoID0gLi4vZXhhbXBsZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkM3ODEzNEY1RUIxMDAyRURGQjQgLyogY29tYmluZWQgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQzc5MTM0RjVFQjEwMDJFREZCNCAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTYzQkM3QTEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWQuZyAqLywKKwkJCQkxQTYzQkM3QjEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWQudG9rZW5zICovLAorCQkJCTFBNjNCQzdDMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZF9fLmdsICovLAorCQkJCTFBNjNCQzdEMTM0RjVFQjEwMDJFREZCNCAvKiBDb21iaW5lZExleGVyLmggKi8sCisJCQkJMUE2M0JDN0UxMzRGNUVCMTAwMkVERkI0IC8qIENvbWJpbmVkTGV4ZXIubSAqLywKKwkJCQkxQTYzQkM3RjEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWRQYXJzZXIuaCAqLywKKwkJCQkxQTYzQkM4MDEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWRQYXJzZXIubSAqLywKKwkJCQkxQTYzQkM4MTEzNEY1RUIxMDAyRURGQjQgLyogbWFpbi5tICovLAorCQkJCTFBNjNCQzgyMTM0RjVFQjEwMDJFREZCNCAvKiBvdXRwdXQxICovLAorCQkJKTsKKwkJCXBhdGggPSBjb21iaW5lZDsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCQzgyMTM0RjVFQjEwMDJFREZCNCAvKiBvdXRwdXQxICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTYzQkM4MzEzNEY1RUIxMDAyRURGQjQgLyogQ29tYmluZWQudG9rZW5zICovLAorCQkJKTsKKwkJCXBhdGggPSBvdXRwdXQxOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2M0JDODQxMzRGNUVCMTAwMkVERkI0IC8qIGZ1enp5ICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTYzQkM4NTEzNEY1RUIxMDAyRURGQjQgLyogYW50bHIzLmggKi8sCisJCQkJMUE2M0JDODYxMzRGNUVCMTAwMkVERkI0IC8qIEZ1enp5LmcgKi8sCisJCQkJMUE2M0JDODgxMzRGNUVCMjAwMkVERkI0IC8qIEZ1enp5LnRva2VucyAqLywKKwkJCQkxQTYzQkM4OTEzNEY1RUIyMDAyRURGQjQgLyogRnV6enlMZXhlci5oICovLAorCQkJCTFBNjNCQzZCMTM0RjVERTQwMDJFREZCNCAvKiBGdXp6eUxleGVyLm0gKi8sCisJCQkJMUE2M0JDOEIxMzRGNUVCMjAwMkVERkI0IC8qIGlucHV0ICovLAorCQkJCTFBNjNCQzZDMTM0RjVERTUwMDJFREZCNCAvKiBtYWluLm0gKi8sCisJCQkJMUE2M0JDOEQxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dDEgKi8sCisJCQkpOworCQkJcGF0aCA9IGZ1enp5OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2M0JDOEQxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dDEgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQzhFMTM0RjVFQjIwMDJFREZCNCAvKiBGdXp6eS5tICovLAorCQkJCTFBNjNCQzhGMTM0RjVFQjIwMDJFREZCNCAvKiBGdXp6eS50b2tlbnMgKi8sCisJCQkJMUE2M0JDOTAxMzRGNUVCMjAwMkVERkI0IC8qIEZ1enp5TGV4ZXIuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gb3V0cHV0MTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCQzkxMTM0RjVFQjIwMDJFREZCNCAvKiBob2lzdGVkUHJlZGljYXRlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2M0JDOTIxMzRGNUVCMjAwMkVERkI0IC8qIGFudGxyMy5oICovLAorCQkJCTFBNjNCQzkzMTM0RjVFQjIwMDJFREZCNCAvKiBpbnB1dCAqLywKKwkJCQkxQTYzQkM5NDEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovLAorCQkJCTFBNjNCQzk1MTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQgKi8sCisJCQkJMUE2M0JDOTYxMzRGNUVCMjAwMkVERkI0IC8qIFQuZyAqLywKKwkJCQkxQTYzQkM5NzEzNEY1RUIyMDAyRURGQjQgLyogVC50b2tlbnMgKi8sCisJCQkJMUE2M0JDOTgxMzRGNUVCMjAwMkVERkI0IC8qIFRMZXhlci5oICovLAorCQkJCTFBNjNCQzk5MTM0RjVFQjIwMDJFREZCNCAvKiBUTGV4ZXIubSAqLywKKwkJCQkxQTYzQkM5QTEzNEY1RUIyMDAyRURGQjQgLyogVFBhcnNlci5oICovLAorCQkJCTFBNjNCQzlCMTM0RjVFQjIwMDJFREZCNCAvKiBUUGFyc2VyLm0gKi8sCisJCQkpOworCQkJcGF0aCA9IGhvaXN0ZWRQcmVkaWNhdGVzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2M0JDOUMxMzRGNUVCMjAwMkVERkI0IC8qIGxleGVydGVzdC1zaW1wbGUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQzlEMTM0RjVFQjIwMDJFREZCNCAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTYzQkM5RTEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovLAorCQkJCTFBNjNCQzlGMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovLAorCQkJCTFBNjNCQ0E1MTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0LnRva2VucyAqLywKKwkJCQkxQTYzQkNBNjEzNEY1RUIyMDAyRURGQjQgLyogVGVzdExleGVyLmcgKi8sCisJCQkJMUE2M0JDQTcxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5oICovLAorCQkJCTFBNjNCQ0E4MTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0TGV4ZXIuaC5vbGQgKi8sCisJCQkJMUE2M0JDQTkxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5tICovLAorCQkJCTFBNjNCQ0FBMTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0TGV4ZXIubS5vbGQgKi8sCisJCQkJMUE2M0JDQUIxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci50b2tlbnMgKi8sCisJCQkJMUE2M0JDQUMxMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlckxleGVyLmggKi8sCisJCQkpOworCQkJcGF0aCA9ICJsZXhlcnRlc3Qtc2ltcGxlIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCQzlGMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTYzQkNBMDEzNEY1RUIyMDAyRURGQjQgLyogVGVzdC50b2tlbnMgKi8sCisJCQkJMUE2M0JDQTExMzRGNUVCMjAwMkVERkI0IC8qIFRlc3RMZXhlci5oICovLAorCQkJCTFBNjNCQ0EyMTM0RjVFQjIwMDJFREZCNCAvKiBUZXN0bGV4ZXIubSAqLywKKwkJCQkxQTYzQkNBMzEzNEY1RUIyMDAyRURGQjQgLyogVGVzdExleGVyLnRva2VucyAqLywKKwkJCQkxQTYzQkNBNDEzNEY1RUIyMDAyRURGQjQgLyogVGVzdExleGVyTGV4ZXIuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gb3V0cHV0MTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCQ0FEMTM0RjVFQjIwMDJFREZCNCAvKiBMTC1zdGFyICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTYzQkNBRTEzNEY1RUIyMDAyRURGQjQgLyogYW50bHIzLmggKi8sCisJCQkJMUE2M0JDQUYxMzRGNUVCMjAwMkVERkI0IC8qIGlucHV0ICovLAorCQkJCTFBNjNCQ0IwMTM0RjVFQjIwMDJFREZCNCAvKiBtYWluLm0gKi8sCisJCQkJMUE2M0JDQjExMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dCAqLywKKwkJCQkxQTYzQkNCMjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQy5nICovLAorCQkJCTFBNjNCQ0IzMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDLnRva2VucyAqLywKKwkJCQkxQTYzQkNCNDEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ19fLmdsICovLAorCQkJCTFBNjNCQ0I1MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIuaCAqLywKKwkJCQkxQTYzQkNCNjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLm0gKi8sCisJCQkJMUE2M0JDQjcxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNQYXJzZXIuaCAqLywKKwkJCQkxQTYzQkNCODEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5tICovLAorCQkJKTsKKwkJCXBhdGggPSAiTEwtc3RhciI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkNCOTEzNEY1RUIyMDAyRURGQjQgLyogcG9seWRpZmYgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQ0JBMTM0RjVFQjIwMDJFREZCNCAvKiBmaWxlcyAqLywKKwkJCQkxQTYzQkNCQjEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8sCisJCQkJMUE2M0JDQkMxMzRGNUVCMjAwMkVERkI0IC8qIE1haW4ubSAqLywKKwkJCQkxQTYzQkNCRDEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0ICovLAorCQkJCTFBNjNCQ0JFMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovLAorCQkJCTFBNjNCQ0M4MTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5LmcgKi8sCisJCQkJMUE2M0JDQzkxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHkudG9rZW5zICovLAorCQkJCTFBNjNCQ0NBMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5RGlmZmVyZW50aWF0b3IuZyAqLywKKwkJCQkxQTYzQkNDQjEzNEY1RUIyMDAyRURGQjQgLyogUG9seURpZmZlcmVudGlhdG9yLm0gKi8sCisJCQkJMUE2M0JDQ0MxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlMZXhlci5oICovLAorCQkJCTFBNjNCQ0NEMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5TGV4ZXIubSAqLywKKwkJCQkxQTYzQkNDRTEzNEY1RUIyMDAyRURGQjQgLyogUG9seVBhcnNlci5oICovLAorCQkJCTFBNjNCQ0NGMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5UGFyc2VyLm0gKi8sCisJCQkJMUE2M0JDRDAxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQcmludGVyLmcgKi8sCisJCQkJMUE2M0JDRDExMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQcmludGVyLmggKi8sCisJCQkJMUE2M0JDRDIxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQcmludGVyLm0gKi8sCisJCQkJMUE2M0JDRDMxMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlQcmludGVyLnRva2VucyAqLywKKwkJCQkxQTYzQkNENDEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxpZmllci5nICovLAorCQkJCTFBNjNCQ0Q1MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGlmaWVyLmggKi8sCisJCQkJMUE2M0JDRDYxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsaWZpZXIubSAqLywKKwkJCQkxQTYzQkNENzEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxpZmllci50b2tlbnMgKi8sCisJCQkpOworCQkJcGF0aCA9IHBvbHlkaWZmOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2M0JDQkUxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dDEgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQ0JGMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5LnRva2VucyAqLywKKwkJCQkxQTYzQkNDMDEzNEY1RUIyMDAyRURGQjQgLyogUG9seURpZmZlcmVudGlhdG9yLm0gKi8sCisJCQkJMUE2M0JDQzExMzRGNUVCMjAwMkVERkI0IC8qIFBvbHlMZXhlci5oICovLAorCQkJCTFBNjNCQ0MyMTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5TGV4ZXIubSAqLywKKwkJCQkxQTYzQkNDMzEzNEY1RUIyMDAyRURGQjQgLyogUG9seVBhcnNlci5oICovLAorCQkJCTFBNjNCQ0M0MTM0RjVFQjIwMDJFREZCNCAvKiBQb2x5UGFyc2VyLm0gKi8sCisJCQkJMUE2M0JDQzUxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsaWZpZXIuaCAqLywKKwkJCQkxQTYzQkNDNjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxpZmllci5tICovLAorCQkJCTFBNjNCQ0M3MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGlmaWVyLnRva2VucyAqLywKKwkJCSk7CisJCQlwYXRoID0gb3V0cHV0MTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCQ0Q4MTM0RjVFQjIwMDJFREZCNCAvKiBzY29wZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQ0Q5MTM0RjVFQjIwMDJFREZCNCAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTYzQkNEQTEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8sCisJCQkJMUE2M0JDREIxMzRGNUVCMjAwMkVERkI0IC8qIG1haW4ubSAqLywKKwkJCQkxQTYzQkNEQzEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0ICovLAorCQkJCTFBNjNCQ0REMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovLAorCQkJCTFBNjNCQ0UzMTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZS5nICovLAorCQkJCTFBNjNCQ0U0MTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZS50b2tlbnMgKi8sCisJCQkJMUE2M0JDRTUxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlX18uZ2wgKi8sCisJCQkJMUE2M0JDRTYxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlTGV4ZXIuaCAqLywKKwkJCQkxQTYzQkNFNzEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGVMZXhlci5tICovLAorCQkJCTFBNjNCQ0U4MTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5oICovLAorCQkJCTFBNjNCQ0U5MTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZVBhcnNlci5tICovLAorCQkJKTsKKwkJCXBhdGggPSBzY29wZXM7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkNERDEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0MSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2M0JDREUxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlLnRva2VucyAqLywKKwkJCQkxQTYzQkNERjEzNEY1RUIyMDAyRURGQjQgLyogU3ltYm9sVGFibGVMZXhlci5oICovLAorCQkJCTFBNjNCQ0UwMTM0RjVFQjIwMDJFREZCNCAvKiBTeW1ib2xUYWJsZUxleGVyLm0gKi8sCisJCQkJMUE2M0JDRTExMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLmggKi8sCisJCQkJMUE2M0JDRTIxMzRGNUVCMjAwMkVERkI0IC8qIFN5bWJvbFRhYmxlUGFyc2VyLm0gKi8sCisJCQkpOworCQkJcGF0aCA9IG91dHB1dDE7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkNFQTEzNEY1RUIyMDAyRURGQjQgLyogc2ltcGxlY1RyZWVQYXJzZXIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCQ0VCMTM0RjVFQjIwMDJFREZCNCAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTYzQkNFQzEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8sCisJCQkJMUE2M0JDRUQxMzRGNUVCMjAwMkVERkI0IC8qIG1haW4ubSAqLywKKwkJCQkxQTYzQkNFRTEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0ICovLAorCQkJCTFBNjNCQ0VGMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovLAorCQkJCTFBNjNCQ0ZCMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDLmcgKi8sCisJCQkJMUE2M0JDRkMxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUMudG9rZW5zICovLAorCQkJCTFBNjNCQ0ZEMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDX18uZ2wgKi8sCisJCQkJMUE2M0JDRkUxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNMZXhlci5oICovLAorCQkJCTFBNjNCQ0ZGMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIuamF2YSAqLywKKwkJCQkxQTYzQkQwMDEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLm0gKi8sCisJCQkJMUE2M0JEMDExMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNQYXJzZXIuaCAqLywKKwkJCQkxQTYzQkQwMjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5qYXZhICovLAorCQkJCTFBNjNCRDAzMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLm0gKi8sCisJCQkJMUE2M0JEMDQxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5nICovLAorCQkJCTFBNjNCRDA1MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAuaCAqLywKKwkJCQkxQTYzQkQwNjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1RQLmphdmEgKi8sCisJCQkJMUE2M0JEMDcxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5tICovLAorCQkJCTFBNjNCRDA4MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAudG9rZW5zICovLAorCQkJCTFBNjNCRDA5MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDV2Fsa2VyLmcgKi8sCisJCQkJMUE2M0JEMEExMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNXYWxrZXIuaCAqLywKKwkJCQkxQTYzQkQwQjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1dhbGtlci5tICovLAorCQkJCTFBNjNCRDBDMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDV2Fsa2VyLnRva2VucyAqLywKKwkJCSk7CisJCQlwYXRoID0gc2ltcGxlY1RyZWVQYXJzZXI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkNFRjEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0MSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2M0JDRjAxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUMudG9rZW5zICovLAorCQkJCTFBNjNCQ0YxMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIuaCAqLywKKwkJCQkxQTYzQkNGMjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ0xleGVyLmphdmEgKi8sCisJCQkJMUE2M0JDRjMxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNMZXhlci5tICovLAorCQkJCTFBNjNCQ0Y0MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLmggKi8sCisJCQkJMUE2M0JDRjUxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNQYXJzZXIuamF2YSAqLywKKwkJCQkxQTYzQkNGNjEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1BhcnNlci5tICovLAorCQkJCTFBNjNCQ0Y3MTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAuaCAqLywKKwkJCQkxQTYzQkNGODEzNEY1RUIyMDAyRURGQjQgLyogU2ltcGxlQ1RQLmphdmEgKi8sCisJCQkJMUE2M0JDRjkxMzRGNUVCMjAwMkVERkI0IC8qIFNpbXBsZUNUUC5tICovLAorCQkJCTFBNjNCQ0ZBMTM0RjVFQjIwMDJFREZCNCAvKiBTaW1wbGVDVFAudG9rZW5zICovLAorCQkJKTsKKwkJCXBhdGggPSBvdXRwdXQxOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2M0JEMEQxMzRGNUVCMjAwMkVERkI0IC8qIHRyZWVwYXJzZXIgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCRDBFMTM0RjVFQjIwMDJFREZCNCAvKiBmaWxlcyAqLywKKwkJCQkxQTYzQkQwRjEzNEY1RUIyMDAyRURGQjQgLyogaW5wdXQgKi8sCisJCQkJMUE2M0JEMTAxMzRGNUVCMjAwMkVERkI0IC8qIExhbmcuZyAqLywKKwkJCQkxQTYzQkQxMTEzNEY1RUIyMDAyRURGQjQgLyogTGFuZy50b2tlbnMgKi8sCisJCQkJMUE2M0JEMTIxMzRGNUVCMjAwMkVERkI0IC8qIExhbmdEdW1wRGVjbC5nICovLAorCQkJCTFBNjNCRDEzMTM0RjVFQjIwMDJFREZCNCAvKiBMYW5nRHVtcERlY2wuaCAqLywKKwkJCQkxQTYzQkQxNDEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ0R1bXBEZWNsLm0gKi8sCisJCQkJMUE2M0JEMTUxMzRGNUVCMjAwMkVERkI0IC8qIExhbmdEdW1wRGVjbC50b2tlbnMgKi8sCisJCQkJMUE2M0JEMTYxMzRGNUVCMjAwMkVERkI0IC8qIExhbmdMZXhlci5oICovLAorCQkJCTFBNjNCRDE3MTM0RjVFQjIwMDJFREZCNCAvKiBMYW5nTGV4ZXIubSAqLywKKwkJCQkxQTYzQkQxODEzNEY1RUIyMDAyRURGQjQgLyogTGFuZ1BhcnNlci5oICovLAorCQkJCTFBNjNCRDE5MTM0RjVFQjIwMDJFREZCNCAvKiBMYW5nUGFyc2VyLm0gKi8sCisJCQkJMUE2M0JEMUExMzRGNUVCMjAwMkVERkI0IC8qIE1haW4uamF2YSAqLywKKwkJCQkxQTYzQkQxQjEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovLAorCQkJCTFBNjNCRDFDMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQgKi8sCisJCQkJMUE2M0JEMUQxMzRGNUVCMjAwMkVERkI0IC8qIG91dHB1dDEgKi8sCisJCQkJMUE2M0JEMUUxMzRGNUVCMjAwMkVERkI0IC8qIFJFQURNRS50eHQgKi8sCisJCQkpOworCQkJcGF0aCA9IHRyZWVwYXJzZXI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkQxRDEzNEY1RUIyMDAyRURGQjQgLyogb3V0cHV0MSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkpOworCQkJcGF0aCA9IG91dHB1dDE7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTYzQkQxRjEzNEY1RUIyMDAyRURGQjQgLyogdHJlZXJld3JpdGUgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNjNCRDIwMTM0RjVFQjIwMDJFREZCNCAvKiBhbnRscjMuaCAqLywKKwkJCQkxQTYzQkQyMTEzNEY1RUIyMDAyRURGQjQgLyogbWFpbi5tICovLAorCQkJCTFBNjNCRDIyMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovLAorCQkJCTFBNjNCRDI4MTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZS5nICovLAorCQkJCTFBNjNCRDI5MTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZS50b2tlbnMgKi8sCisJCQkJMUE2M0JEMkExMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlTGV4ZXIuaCAqLywKKwkJCQkxQTYzQkQyQjEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGVMZXhlci5tICovLAorCQkJCTFBNjNCRDJDMTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZVBhcnNlci5oICovLAorCQkJCTFBNjNCRDJEMTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZVBhcnNlci5tICovLAorCQkJKTsKKwkJCXBhdGggPSB0cmVlcmV3cml0ZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNjNCRDIyMTM0RjVFQjIwMDJFREZCNCAvKiBvdXRwdXQxICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTYzQkQyMzEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGUudG9rZW5zICovLAorCQkJCTFBNjNCRDI0MTM0RjVFQjIwMDJFREZCNCAvKiBUcmVlUmV3cml0ZUxleGVyLmggKi8sCisJCQkJMUE2M0JEMjUxMzRGNUVCMjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlTGV4ZXIubSAqLywKKwkJCQkxQTYzQkQyNjEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGVQYXJzZXIuaCAqLywKKwkJCQkxQTYzQkQyNzEzNEY1RUIyMDAyRURGQjQgLyogVHJlZVJld3JpdGVQYXJzZXIubSAqLywKKwkJCSk7CisJCQlwYXRoID0gb3V0cHV0MTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNkIxRDFEMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUlRlc3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTZCMUQxRTEzNEU4REExMDAxNkE0N0QgLyogamF2YSAqLywKKwkJCQkxQTZCMUQ0ODEzNEU4REExMDAxNkE0N0QgLyogcnVudGltZSAqLywKKwkJCSk7CisJCQluYW1lID0gQU5UTFJUZXN0czsKKwkJCXBhdGggPSAuLi90ZXN0OworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2QjFEMUUxMzRFOERBMTAwMTZBNDdEIC8qIGphdmEgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNkIxRDFGMTM0RThEQTEwMDE2QTQ3RCAvKiBCYXNlVGVzdC5qYXZhICovLAorCQkJCTFBNkIxRDIwMTM0RThEQTEwMDE2QTQ3RCAvKiBEZWJ1Z1Rlc3RBdXRvQVNULmphdmEgKi8sCisJCQkJMUE2QjFEMjExMzRFOERBMTAwMTZBNDdEIC8qIERlYnVnVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmEgKi8sCisJCQkJMUE2QjFEMjIxMzRFOERBMTAwMTZBNDdEIC8qIERlYnVnVGVzdFJld3JpdGVBU1QuamF2YSAqLywKKwkJCQkxQTZCMUQyMzEzNEU4REExMDAxNkE0N0QgLyogRXJyb3JRdWV1ZS5qYXZhICovLAorCQkJCTFBNkIxRDI0MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0QVNUQ29uc3RydWN0aW9uLmphdmEgKi8sCisJCQkJMUE2QjFEMjUxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RBdHRyaWJ1dGVzLmphdmEgKi8sCisJCQkJMUE2QjFEMjYxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RBdXRvQVNULmphdmEgKi8sCisJCQkJMUE2QjFEMjcxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmEgKi8sCisJCQkJMUE2QjFEMjgxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RDaGFyREZBQ29udmVyc2lvbi5qYXZhICovLAorCQkJCTFBNkIxRDI5MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0Q29tbW9uVG9rZW5TdHJlYW0uamF2YSAqLywKKwkJCQkxQTZCMUQyQTEzNEU4REExMDAxNkE0N0QgLyogVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmEgKi8sCisJCQkJMUE2QjFEMkIxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RERkFDb252ZXJzaW9uLmphdmEgKi8sCisJCQkJMUE2QjFEMkMxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RERkFNYXRjaGluZy5qYXZhICovLAorCQkJCTFBNkIxRDJEMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0RmFzdFF1ZXVlLmphdmEgKi8sCisJCQkJMUE2QjFEMkUxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RIZXRlcm9BU1QuamF2YSAqLywKKwkJCQkxQTZCMUQyRjEzNEU4REExMDAxNkE0N0QgLyogVGVzdEludGVycHJldGVkTGV4aW5nLmphdmEgKi8sCisJCQkJMUE2QjFEMzAxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RJbnRlcnByZXRlZFBhcnNpbmcuamF2YSAqLywKKwkJCQkxQTZCMUQzMTEzNEU4REExMDAxNkE0N0QgLyogVGVzdEludGVydmFsU2V0LmphdmEgKi8sCisJCQkJMUE2QjFEMzIxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RKYXZhQ29kZUdlbmVyYXRpb24uamF2YSAqLywKKwkJCQkxQTZCMUQzMzEzNEU4REExMDAxNkE0N0QgLyogVGVzdExlZnRSZWN1cnNpb24uamF2YSAqLywKKwkJCQkxQTZCMUQzNDEzNEU4REExMDAxNkE0N0QgLyogVGVzdExleGVyLmphdmEgKi8sCisJCQkJMUE2QjFEMzUxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RNZXNzYWdlcy5qYXZhICovLAorCQkJCTFBNkIxRDM2MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0TkZBQ29uc3RydWN0aW9uLmphdmEgKi8sCisJCQkJMUE2QjFEMzcxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RSZXdyaXRlQVNULmphdmEgKi8sCisJCQkJMUE2QjFEMzgxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RSZXdyaXRlVGVtcGxhdGVzLmphdmEgKi8sCisJCQkJMUE2QjFEMzkxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RTZW1hbnRpY1ByZWRpY2F0ZUV2YWx1YXRpb24uamF2YSAqLywKKwkJCQkxQTZCMUQzQTEzNEU4REExMDAxNkE0N0QgLyogVGVzdFNlbWFudGljUHJlZGljYXRlcy5qYXZhICovLAorCQkJCTFBNkIxRDNCMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0U2V0cy5qYXZhICovLAorCQkJCTFBNkIxRDNDMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0U3ltYm9sRGVmaW5pdGlvbnMuamF2YSAqLywKKwkJCQkxQTZCMUQzRDEzNEU4REExMDAxNkE0N0QgLyogVGVzdFN5bnRhY3RpY1ByZWRpY2F0ZUV2YWx1YXRpb24uamF2YSAqLywKKwkJCQkxQTZCMUQzRTEzNEU4REExMDAxNkE0N0QgLyogVGVzdFN5bnRheEVycm9ycy5qYXZhICovLAorCQkJCTFBNkIxRDNGMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VGVtcGxhdGVzLmphdmEgKi8sCisJCQkJMUE2QjFENDAxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RUb2tlblJld3JpdGVTdHJlYW0uamF2YSAqLywKKwkJCQkxQTZCMUQ0MTEzNEU4REExMDAxNkE0N0QgLyogVGVzdFRvcG9sb2dpY2FsU29ydC5qYXZhICovLAorCQkJCTFBNkIxRDQyMTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VHJlZUdyYW1tYXJSZXdyaXRlQVNULmphdmEgKi8sCisJCQkJMUE2QjFENDMxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RUcmVlSXRlcmF0b3IuamF2YSAqLywKKwkJCQkxQTZCMUQ0NDEzNEU4REExMDAxNkE0N0QgLyogVGVzdFRyZWVOb2RlU3RyZWFtLmphdmEgKi8sCisJCQkJMUE2QjFENDUxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RUcmVlUGFyc2luZy5qYXZhICovLAorCQkJCTFBNkIxRDQ2MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0VHJlZXMuamF2YSAqLywKKwkJCQkxQTZCMUQ0NzEzNEU4REExMDAxNkE0N0QgLyogVGVzdFRyZWVXaXphcmQuamF2YSAqLywKKwkJCSk7CisJCQlwYXRoID0gamF2YTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNkIxRDQ4MTM0RThEQTEwMDE2QTQ3RCAvKiBydW50aW1lICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTZCMUQ0OTEzNEU4REExMDAxNkE0N0QgLyogbWlzYyAqLywKKwkJCQkxQTZCMUQ0RTEzNEU4REExMDAxNkE0N0QgLyogcmVjb2duaXplciAqLywKKwkJCQkxQTZCMUQ1MTEzNEU4REExMDAxNkE0N0QgLyogc2V0cyAqLywKKwkJCQkxQTZCMUQ1NDEzNEU4REExMDAxNkE0N0QgLyogc3RyZWFtICovLAorCQkJCTFBNkIxRDU3MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqLywKKwkJCQkxQTZCMUQ1QTEzNEU4REExMDAxNkE0N0QgLyogdG9rZW4gKi8sCisJCQkJMUE2QjFENUQxMzRFOERBMTAwMTZBNDdEIC8qIHRyZWUgKi8sCisJCQkpOworCQkJcGF0aCA9IHJ1bnRpbWU7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTZCMUQ0OTEzNEU4REExMDAxNkE0N0QgLyogbWlzYyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2QjFENEExMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSRmFzdFF1ZXVlVGVzdC5oICovLAorCQkJCTFBNkIxRDRCMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkZhc3RRdWV1ZVRlc3QubSAqLywKKwkJCQkxQTZCMUQ0QzEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJJbnRBcnJheVRlc3QuaCAqLywKKwkJCQkxQTZCMUQ0RDEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJJbnRBcnJheVRlc3QubSAqLywKKwkJCSk7CisJCQlwYXRoID0gbWlzYzsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNkIxRDRFMTM0RThEQTEwMDE2QTQ3RCAvKiByZWNvZ25pemVyICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTZCMUQ0RjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJSZWNvZ25pemVyVGVzdC5oICovLAorCQkJCTFBNkIxRDUwMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml6ZXJUZXN0Lm0gKi8sCisJCQkpOworCQkJcGF0aCA9IHJlY29nbml6ZXI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTZCMUQ1MTEzNEU4REExMDAxNkE0N0QgLyogc2V0cyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2QjFENTIxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQml0U2V0VGVzdC5oICovLAorCQkJCTFBNkIxRDUzMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkJpdFNldFRlc3QubSAqLywKKwkJCSk7CisJCQlwYXRoID0gc2V0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNkIxRDU0MTM0RThEQTEwMDE2QTQ3RCAvKiBzdHJlYW0gKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBNkIxRDU1MTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaCAqLywKKwkJCQkxQTZCMUQ1NjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gKi8sCisJCQkpOworCQkJcGF0aCA9IHN0cmVhbTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBNkIxRDU3MTM0RThEQTEwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2QjFENTgxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmggKi8sCisJCQkJMUE2QjFENTkxMzRFOERBMTAwMTZBNDdEIC8qIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0gKi8sCisJCQkpOworCQkJcGF0aCA9IFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUE2QjFENUExMzRFOERBMTAwMTZBNDdEIC8qIHRva2VuICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQTZCMUQ1QjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25Ub2tlblRlc3QuaCAqLywKKwkJCQkxQTZCMUQ1QzEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25Ub2tlblRlc3QubSAqLywKKwkJCSk7CisJCQlwYXRoID0gdG9rZW47CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQTZCMUQ1RDEzNEU4REExMDAxNkE0N0QgLyogdHJlZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUE2QjFENUUxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSQ29tbW9uRXJyb3JOb2RlVGVzdC5oICovLAorCQkJCTFBNkIxRDVGMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QubSAqLywKKwkJCQkxQTZCMUQ2MDEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QuaCAqLywKKwkJCQkxQTZCMUQ2MTEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QubSAqLywKKwkJCQkxQTZCMUQ2MjEzNEU4REExMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlVGVzdC5oICovLAorCQkJCTFBNkIxRDYzMTM0RThEQTEwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRyZWVUZXN0Lm0gKi8sCisJCQkpOworCQkJcGF0aCA9IHRyZWU7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQUU3MjMwQzEzNEU4NjBBMDAxQzNGMzUgPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi8sCisJCQkJMUEwNDhDRkYxMzRFOEI5MTAwMDA1RjU3IC8qIENsYXNzZXMgKi8sCisJCQkJMUE2QjFEMUQxMzRFOERBMTAwMTZBNDdEIC8qIEFOVExSVGVzdHMgKi8sCisJCQkJMUE2M0JDNzcxMzRGNUVCMTAwMkVERkI0IC8qIGV4YW1wbGVzICovLAorCQkJCTFBRTcyMzIxMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUiAqLywKKwkJCQkxQUU3MjMzMjEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cyAqLywKKwkJCQkxQUU3MjMxQTEzNEU4NjBCMDAxQzNGMzUgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQUU3MjMxOTEzNEU4NjBCMDAxQzNGMzUgLyogUHJvZHVjdHMgKi8sCisJCQkpOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUFFNzIzMTkxMzRFODYwQjAwMUMzRjM1IC8qIFByb2R1Y3RzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQUU3MjMyRDEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy5vY3Rlc3QgKi8sCisJCQkJMUE2M0JDNjExMzRGNURBQjAwMkVERkI0IC8qIEZ1enp5ICovLAorCQkJCTFBNjNCRDMyMTM0RjVGMUUwMDJFREZCNCAvKiBjb21iaW5lZCAqLywKKwkJCQkxQTYzQkQzRjEzNEY1RjM2MDAyRURGQjQgLyogbGV4ZXJ0ZXN0LXNpbXBsZSAqLywKKwkJCQkxQTYzQkQ0QzEzNEY1RjQzMDAyRURGQjQgLyogTEwtc3RhcnQgKi8sCisJCQkJMUE2M0JENTkxMzRGNUY0RDAwMkVERkI0IC8qIHBvbHlkaWZmICovLAorCQkJCTFBNjNCRDY2MTM0RjVGNUUwMDJFREZCNCAvKiBzaW1wbGVjVHJlZVBhcnNlciAqLywKKwkJCQkxQTYzQkQ3MzEzNEY1RjY3MDAyRURGQjQgLyogdHJlZXBhcnNlciAqLywKKwkJCQkxQTYzQkQ4MDEzNEY1RjcxMDAyRURGQjQgLyogdHJlZXJld3JpdGUgKi8sCisJCQkJMUE2M0JERDQxMzRGNjIzMzAwMkVERkI0IC8qIHNjb3BlcyAqLywKKwkJCQkxQTYzQkRGQzEzNEZCNzVFMDAyRURGQjQgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8sCisJCQkpOworCQkJbmFtZSA9IFByb2R1Y3RzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUFFNzIzMUExMzRFODYwQjAwMUMzRjM1IC8qIEZyYW1ld29ya3MgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBRTcyMzFFMTM0RTg2MEIwMDFDM0YzNSAvKiBBcHBLaXQuZnJhbWV3b3JrICovLAorCQkJCTFBRTcyMzFCMTM0RTg2MEIwMDFDM0YzNSAvKiBDb2NvYS5mcmFtZXdvcmsgKi8sCisJCQkJMUFFNzIzMUYxMzRFODYwQjAwMUMzRjM1IC8qIENvcmVEYXRhLmZyYW1ld29yayAqLywKKwkJCQkxQUU3MjM0NTEzNEU4OUJGMDAxQzNGMzUgLyogQ29yZUZvdW5kYXRpb24uZnJhbWV3b3JrICovLAorCQkJCTFBRTcyMzQ2MTM0RTg5QkYwMDFDM0YzNSAvKiBGb3VuZGF0aW9uLmZyYW1ld29yayAqLywKKwkJCQkxQTZCMUQ3ODEzNEVBMDk3MDAxNkE0N0QgLyogU2VuVGVzdGluZ0tpdC5mcmFtZXdvcmsgKi8sCisJCQkJMUFFNzIzMUQxMzRFODYwQjAwMUMzRjM1IC8qIE90aGVyIEZyYW1ld29ya3MgKi8sCisJCQkpOworCQkJbmFtZSA9IEZyYW1ld29ya3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQUU3MjMxRDEzNEU4NjBCMDAxQzNGMzUgLyogT3RoZXIgRnJhbWV3b3JrcyAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkpOworCQkJbmFtZSA9ICJPdGhlciBGcmFtZXdvcmtzIjsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBRTcyMzIxMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUiAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMUFFNzIzMjIxMzRFODYwQjAwMUMzRjM1IC8qIFN1cHBvcnRpbmcgRmlsZXMgKi8sCisJCQkpOworCQkJcGF0aCA9IEFOVExSOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUFFNzIzMjIxMzRFODYwQjAwMUMzRjM1IC8qIFN1cHBvcnRpbmcgRmlsZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBRTcyMzIzMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi1JbmZvLnBsaXN0ICovLAorCQkJCTFBRTcyMzI0MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLywKKwkJCQkxQUU3MjMyNzEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFItUHJlZml4LnBjaCAqLywKKwkJCSk7CisJCQluYW1lID0gIlN1cHBvcnRpbmcgRmlsZXMiOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKwkJMUFFNzIzMzIxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSVGVzdHMgKi8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBRTcyMzM5MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUlRlc3RzLmggKi8sCisJCQkJMUFFNzIzM0IxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSVGVzdHMubSAqLywKKwkJCQkxQUU3MjMzMzEzNEU4NjBCMDAxQzNGMzUgLyogU3VwcG9ydGluZyBGaWxlcyAqLywKKwkJCSk7CisJCQlwYXRoID0gQU5UTFJUZXN0czsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CisJCTFBRTcyMzMzMTM0RTg2MEIwMDFDM0YzNSAvKiBTdXBwb3J0aW5nIEZpbGVzICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQUU3MjMzNDEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy1JbmZvLnBsaXN0ICovLAorCQkJCTFBRTcyMzM1MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLywKKwkJCQkxQUU3MjMzODEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy1QcmVmaXgucGNoICovLAorCQkJKTsKKwkJCW5hbWUgPSAiU3VwcG9ydGluZyBGaWxlcyI7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCQkxQUU3MjMxNTEzNEU4NjBCMDAxQzNGMzUgLyogSGVhZGVycyAqLyA9IHsKKwkJCWlzYSA9IFBCWEhlYWRlcnNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBQUMxQzNEMTM0RkQ2QTUwMEIyREM2OCAvKiBBTlRMUi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMjExMzRFOEMxMTAwMDA1RjU3IC8qIGFudGxyMy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMjIxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQmFzZU1hcEVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDIzMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQyNDEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJCYXNlU3RhY2suaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDI1MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkJhc2VUcmVlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQyNjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDI3MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkJpdFNldC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMjgxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMjkxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMkExMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQ2hhclN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMkIxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQyQzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDb21tb25FcnJvck5vZGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDJEMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRva2VuLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQyRTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMkYxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVHJlZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMzAxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDMxMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzMzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Zy5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEMzQxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRGVidWdFdmVudExpc3RlbmVyLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzNTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDM2MTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRlYnVnUGFyc2VyLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzNzEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzODEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzOTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzQTEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDNCMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkRGQS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUEwNDhEM0MxMzRFOEMxMTAwMDA1RjU3IC8qIEFOVExSRG91YmxlS2V5TWFwLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzRDEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDNFMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkVycm9yLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTA0OEQzRjEzNEU4QzExMDAwMDVGNTcgLyogQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBMDQ4RDQwMTM0RThDMTEwMDAwNUY1NyAvKiBBTlRMUkZhc3RRdWV1ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRDcxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSRmlsZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRDgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSGFzaE1hcC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRDkxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSSGFzaFJ1bGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0RBMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUklucHV0U3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNEQjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJJbnRBcnJheS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2M0JERUUxMzRGOTMyRTAwMkVERkI0IC8qIEFOVExSSW50U3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNEQzEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMZXhlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDREQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0RFMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxleGVyU3RhdGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0RGMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUkxpbmtCYXNlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNFMDEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0UxMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1hcC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRTIxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRTMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRTQxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNFNTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNFNjEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0U3MTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRTgxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNFOTEzNEU4Q0Y3MDAxNkE0N0QgLyogQU5UTFJOb2RlTWFwRWxlbWVudC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRUExMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0VCMTM0RThDRjcwMDE2QTQ3RCAvKiBBTlRMUlBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRUMxMzRFOENGNzAwMTZBNDdEIC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNFRDEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJQYXJzZVRyZWUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0VFMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlB0ckJ1ZmZlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRUYxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUHRyU3RhY2suaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0YwMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJlYWRlclN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRjExMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0YyMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRjMxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNGNDEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0Y1MTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRjYxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRjcxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUnVsZU1hcEVsZW1lbnQuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0Y4MTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVNZW1vLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNGOTEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxQ0ZBMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlJ1bGVTdGFjay5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRkIxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSUnVudGltZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRkMxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRkQxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSU3RyaW5nU3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUNGRTEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJTdHJpbmdTdHJlYW1TdGF0ZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFDRkYxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSU3ltYm9sU3RhY2suaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDAwMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlRva2VuLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQwMTEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDAyMTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMDMxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSVG9rZW5Tb3VyY2UuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDA0MTM0RThDRjgwMDE2QTQ3RCAvKiBBTlRMUlRva2VuU3RyZWFtLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQwNTEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJUcmVlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQwNjEzNEU4Q0Y4MDAxNkE0N0QgLyogQU5UTFJUcmVlQWRhcHRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMDcxMzRFOENGODAwMTZBNDdEIC8qIEFOVExSVHJlZUV4Y2VwdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMDgxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZUl0ZXJhdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQwOTEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlTm9kZVN0cmVhbS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMEExMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZVBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMEIxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZVBhdHRlcm5MZXhlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMEMxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDBEMTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlRyZWVSZXdyaXRlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMEUxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJMUE2QjFEMEYxMzRFOENGOTAwMTZBNDdEIC8qIEFOVExSVHJlZVZpc2l0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDEwMTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQxMTEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJUcmVlV2l6YXJkLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQxMjEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDEzMTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQxNDEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaCBpbiBIZWFkZXJzICovLAorCQkJCTFBNkIxRDE1MTM0RThDRjkwMDE2QTQ3RCAvKiBBTlRMUlVuaXF1ZUlETWFwLmggaW4gSGVhZGVycyAqLywKKwkJCQkxQTZCMUQxNjEzNEU4Q0Y5MDAxNkE0N0QgLyogQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKy8qIEVuZCBQQlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWE5hdGl2ZVRhcmdldCBzZWN0aW9uICovCisJCTFBNjNCQzYwMTM0RjVEQUIwMDJFREZCNCAvKiBGdXp6eSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTYzQkM2NzEzNEY1REFDMDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkZ1enp5IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBNjNCQzVEMTM0RjVEQUIwMDJFREZCNCAvKiBTb3VyY2VzICovLAorCQkJCTFBNjNCQzVFMTM0RjVEQUIwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCQzVGMTM0RjVEQUIwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCQkxQTYzQkRFRDEzNEY2ODEwMDAyRURGQjQgLyogUEJYQnVpbGRSdWxlICovLAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkxQTYzQkRBMzEzNEY2MEE3MDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gRnV6enk7CisJCQlwcm9kdWN0TmFtZSA9IEZ1enp5OworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBNjNCQzYxMTM0RjVEQUIwMDJFREZCNCAvKiBGdXp6eSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTFBNjNCRDMxMTM0RjVGMUUwMDJFREZCNCAvKiBjb21iaW5lZCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTYzQkQzODEzNEY1RjFFMDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgImNvbWJpbmVkIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBNjNCRDJFMTM0RjVGMUUwMDJFREZCNCAvKiBTb3VyY2VzICovLAorCQkJCTFBNjNCRDJGMTM0RjVGMUUwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCRDMwMTM0RjVGMUUwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCQkxQTYzQkRFQzEzNEY2NDlGMDAyRURGQjQgLyogUEJYQnVpbGRSdWxlICovLAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkxQTYzQkRBMTEzNEY2MDlCMDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gY29tYmluZWQ7CisJCQlwcm9kdWN0TmFtZSA9IGNvbWJpbmVkOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBNjNCRDMyMTM0RjVGMUUwMDJFREZCNCAvKiBjb21iaW5lZCAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTFBNjNCRDNFMTM0RjVGMzYwMDJFREZCNCAvKiBsZXhlcnRlc3Qtc2ltcGxlICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBNjNCRDQ1MTM0RjVGMzYwMDJFREZCNCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGV4ZXJ0ZXN0LXNpbXBsZSIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkxQTYzQkQzQjEzNEY1RjM2MDAyRURGQjQgLyogU291cmNlcyAqLywKKwkJCQkxQTYzQkQzQzEzNEY1RjM2MDAyRURGQjQgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTYzQkQzRDEzNEY1RjM2MDAyRURGQjQgLyogQ29weUZpbGVzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTFBNjNCRDlGMTM0RjYwOTMwMDJFREZCNCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSI7CisJCQlwcm9kdWN0TmFtZSA9ICJsZXhlcnRlc3Qtc2ltcGxlIjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTYzQkQzRjEzNEY1RjM2MDAyRURGQjQgLyogbGV4ZXJ0ZXN0LXNpbXBsZSAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTFBNjNCRDRCMTM0RjVGNDMwMDJFREZCNCAvKiBMTC1zdGFydCAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTYzQkQ1MjEzNEY1RjQzMDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgIkxMLXN0YXJ0IiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBNjNCRDQ4MTM0RjVGNDMwMDJFREZCNCAvKiBTb3VyY2VzICovLAorCQkJCTFBNjNCRDQ5MTM0RjVGNDMwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCRDRBMTM0RjVGNDMwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMUE2M0JEQTUxMzRGNjBCMDAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9ICJMTC1zdGFydCI7CisJCQlwcm9kdWN0TmFtZSA9ICJMTC1zdGFydCI7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMUE2M0JENEMxMzRGNUY0MzAwMkVERkI0IC8qIExMLXN0YXJ0ICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJMUE2M0JENTgxMzRGNUY0RDAwMkVERkI0IC8qIHBvbHlkaWZmICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBNjNCRDVGMTM0RjVGNEQwMDJFREZCNCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAicG9seWRpZmYiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUE2M0JENTUxMzRGNUY0RDAwMkVERkI0IC8qIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JENTYxMzRGNUY0RDAwMkVERkI0IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMUE2M0JENTcxMzRGNUY0RDAwMkVERkI0IC8qIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkxQTYzQkRBNzEzNEY2MEJDMDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gcG9seWRpZmY7CisJCQlwcm9kdWN0TmFtZSA9IHBvbHlkaWZmOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBNjNCRDU5MTM0RjVGNEQwMDJFREZCNCAvKiBwb2x5ZGlmZiAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTFBNjNCRDY1MTM0RjVGNUUwMDJFREZCNCAvKiBzaW1wbGVjVHJlZVBhcnNlciAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTYzQkQ2QzEzNEY1RjVFMDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNpbXBsZWNUcmVlUGFyc2VyIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBNjNCRDYyMTM0RjVGNUUwMDJFREZCNCAvKiBTb3VyY2VzICovLAorCQkJCTFBNjNCRDYzMTM0RjVGNUUwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCRDY0MTM0RjVGNUUwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMUE2M0JEQTkxMzRGNjBDMzAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHNpbXBsZWNUcmVlUGFyc2VyOworCQkJcHJvZHVjdE5hbWUgPSBzaW1wbGVjVHJlZVBhcnNlcjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTYzQkQ2NjEzNEY1RjVFMDAyRURGQjQgLyogc2ltcGxlY1RyZWVQYXJzZXIgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQkxQTYzQkQ3MjEzNEY1RjY3MDAyRURGQjQgLyogdHJlZXBhcnNlciAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTYzQkQ3OTEzNEY1RjY4MDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRyZWVwYXJzZXIiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUE2M0JENkYxMzRGNUY2NzAwMkVERkI0IC8qIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JENzAxMzRGNUY2NzAwMkVERkI0IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMUE2M0JENzExMzRGNUY2NzAwMkVERkI0IC8qIENvcHlGaWxlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkxQTYzQkRBQjEzNEY2MENDMDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gdHJlZXBhcnNlcjsKKwkJCXByb2R1Y3ROYW1lID0gdHJlZXBhcnNlcjsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTYzQkQ3MzEzNEY1RjY3MDAyRURGQjQgLyogdHJlZXBhcnNlciAqLzsKKwkJCXByb2R1Y3RUeXBlID0gImNvbS5hcHBsZS5wcm9kdWN0LXR5cGUudG9vbCI7CisJCX07CisJCTFBNjNCRDdGMTM0RjVGNzEwMDJFREZCNCAvKiB0cmVlcmV3cml0ZSAqLyA9IHsKKwkJCWlzYSA9IFBCWE5hdGl2ZVRhcmdldDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbkxpc3QgPSAxQTYzQkQ4NjEzNEY1RjcyMDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRyZWVyZXdyaXRlIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBNjNCRDdDMTM0RjVGNzEwMDJFREZCNCAvKiBTb3VyY2VzICovLAorCQkJCTFBNjNCRDdEMTM0RjVGNzEwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCRDdFMTM0RjVGNzEwMDJFREZCNCAvKiBDb3B5IEZpbGVzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkJMUE3NkEwMkMxMzRGQzc1NDAwNDE2MzRGIC8qIFBCWEJ1aWxkUnVsZSAqLywKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMUE2M0JEQUQxMzRGNjBEMjAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHRyZWVyZXdyaXRlOworCQkJcHJvZHVjdE5hbWUgPSB0cmVlcmV3cml0ZTsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQTYzQkQ4MDEzNEY1RjcxMDAyRURGQjQgLyogdHJlZXJld3JpdGUgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQkxQTYzQkREMzEzNEY2MjMzMDAyRURGQjQgLyogc2NvcGVzICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBNjNCRERBMTM0RjYyMzQwMDJFREZCNCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAic2NvcGVzIiAqLzsKKwkJCWJ1aWxkUGhhc2VzID0gKAorCQkJCTFBNjNCREQwMTM0RjYyMzMwMDJFREZCNCAvKiBTb3VyY2VzICovLAorCQkJCTFBNjNCREQxMTM0RjYyMzMwMDJFREZCNCAvKiBGcmFtZXdvcmtzICovLAorCQkJCTFBNjNCREQyMTM0RjYyMzMwMDJFREZCNCAvKiBDb3B5RmlsZXMgKi8sCisJCQkpOworCQkJYnVpbGRSdWxlcyA9ICgKKwkJCSk7CisJCQlkZXBlbmRlbmNpZXMgPSAoCisJCQkJMUE2M0JERTYxMzRGNjI5QjAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8sCisJCQkpOworCQkJbmFtZSA9IHNjb3BlczsKKwkJCXByb2R1Y3ROYW1lID0gc2NvcGVzOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBNjNCREQ0MTM0RjYyMzMwMDJFREZCNCAvKiBzY29wZXMgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLnRvb2wiOworCQl9OworCQkxQTYzQkRGQjEzNEZCNzVFMDAyRURGQjQgLyogaG9pc3RlZFByZWRpY2F0ZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhOYXRpdmVUYXJnZXQ7CisJCQlidWlsZENvbmZpZ3VyYXRpb25MaXN0ID0gMUE2M0JFMDIxMzRGQjc1RjAwMkVERkI0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJob2lzdGVkUHJlZGljYXRlcyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkxQTYzQkRGODEzNEZCNzVFMDAyRURGQjQgLyogU291cmNlcyAqLywKKwkJCQkxQTYzQkRGOTEzNEZCNzVFMDAyRURGQjQgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQTYzQkRGQTEzNEZCNzVFMDAyRURGQjQgLyogQ29weUZpbGVzICovLAorCQkJKTsKKwkJCWJ1aWxkUnVsZXMgPSAoCisJCQkpOworCQkJZGVwZW5kZW5jaWVzID0gKAorCQkJCTFBNjNCRTBCMTM0RkI4MjQwMDJFREZCNCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovLAorCQkJKTsKKwkJCW5hbWUgPSBob2lzdGVkUHJlZGljYXRlczsKKwkJCXByb2R1Y3ROYW1lID0gaG9pc3RlZFByZWRpY2F0ZXM7CisJCQlwcm9kdWN0UmVmZXJlbmNlID0gMUE2M0JERkMxMzRGQjc1RTAwMkVERkI0IC8qIGhvaXN0ZWRQcmVkaWNhdGVzICovOworCQkJcHJvZHVjdFR5cGUgPSAiY29tLmFwcGxlLnByb2R1Y3QtdHlwZS50b29sIjsKKwkJfTsKKwkJMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBRTcyMzNGMTM0RTg2MEIwMDFDM0YzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFIiICovOworCQkJYnVpbGRQaGFzZXMgPSAoCisJCQkJMUFFNzIzMTMxMzRFODYwQjAwMUMzRjM1IC8qIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzMTQxMzRFODYwQjAwMUMzRjM1IC8qIEZyYW1ld29ya3MgKi8sCisJCQkJMUFFNzIzMTUxMzRFODYwQjAwMUMzRjM1IC8qIEhlYWRlcnMgKi8sCisJCQkJMUFFNzIzMTYxMzRFODYwQjAwMUMzRjM1IC8qIFJlc291cmNlcyAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCSk7CisJCQluYW1lID0gQU5UTFI7CisJCQlwcm9kdWN0TmFtZSA9IEFOVExSOworCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDFBRTcyMzE4MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUi5mcmFtZXdvcmsgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmZyYW1ld29yayI7CisJCX07CisJCTFBRTcyMzJDMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUlRlc3RzICovID0geworCQkJaXNhID0gUEJYTmF0aXZlVGFyZ2V0OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBRTcyMzQyMTM0RTg2MEIwMDFDM0YzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFJUZXN0cyIgKi87CisJCQlidWlsZFBoYXNlcyA9ICgKKwkJCQkxQUU3MjMyODEzNEU4NjBCMDAxQzNGMzUgLyogU291cmNlcyAqLywKKwkJCQkxQUU3MjMyOTEzNEU4NjBCMDAxQzNGMzUgLyogRnJhbWV3b3JrcyAqLywKKwkJCQkxQUU3MjMyQTEzNEU4NjBCMDAxQzNGMzUgLyogUmVzb3VyY2VzICovLAorCQkJCTFBRTcyMzJCMTM0RTg2MEIwMDFDM0YzNSAvKiBTaGVsbFNjcmlwdCAqLywKKwkJCSk7CisJCQlidWlsZFJ1bGVzID0gKAorCQkJKTsKKwkJCWRlcGVuZGVuY2llcyA9ICgKKwkJCQkxQUU3MjMzMDEzNEU4NjBCMDAxQzNGMzUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLywKKwkJCSk7CisJCQluYW1lID0gQU5UTFJUZXN0czsKKwkJCXByb2R1Y3ROYW1lID0gQU5UTFJUZXN0czsKKwkJCXByb2R1Y3RSZWZlcmVuY2UgPSAxQUU3MjMyRDEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFJUZXN0cy5vY3Rlc3QgKi87CisJCQlwcm9kdWN0VHlwZSA9ICJjb20uYXBwbGUucHJvZHVjdC10eXBlLmJ1bmRsZSI7CisJCX07CisvKiBFbmQgUEJYTmF0aXZlVGFyZ2V0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUHJvamVjdCBzZWN0aW9uICovCisJCTFBRTcyMzBFMTM0RTg2MEEwMDFDM0YzNSAvKiBQcm9qZWN0IG9iamVjdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFByb2plY3Q7CisJCQlhdHRyaWJ1dGVzID0geworCQkJCU9SR0FOSVpBVElPTk5BTUUgPSAiQWxhbidzIE1hY2hpbmVXb3JrcyI7CisJCQl9OworCQkJYnVpbGRDb25maWd1cmF0aW9uTGlzdCA9IDFBRTcyMzExMTM0RTg2MEEwMDFDM0YzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWFByb2plY3QgIkFOVExSIiAqLzsKKwkJCWNvbXBhdGliaWxpdHlWZXJzaW9uID0gIlhjb2RlIDMuMiI7CisJCQlkZXZlbG9wbWVudFJlZ2lvbiA9IEVuZ2xpc2g7CisJCQloYXNTY2FubmVkRm9yRW5jb2RpbmdzID0gMDsKKwkJCWtub3duUmVnaW9ucyA9ICgKKwkJCQllbiwKKwkJCSk7CisJCQltYWluR3JvdXAgPSAxQUU3MjMwQzEzNEU4NjBBMDAxQzNGMzU7CisJCQlwcm9kdWN0UmVmR3JvdXAgPSAxQUU3MjMxOTEzNEU4NjBCMDAxQzNGMzUgLyogUHJvZHVjdHMgKi87CisJCQlwcm9qZWN0RGlyUGF0aCA9ICIiOworCQkJcHJvamVjdFJvb3QgPSAiIjsKKwkJCXRhcmdldHMgPSAoCisJCQkJMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSICovLAorCQkJCTFBRTcyMzJDMTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUlRlc3RzICovLAorCQkJCTFBNjNCRDMxMTM0RjVGMUUwMDJFREZCNCAvKiBjb21iaW5lZCAqLywKKwkJCQkxQTYzQkM2MDEzNEY1REFCMDAyRURGQjQgLyogRnV6enkgKi8sCisJCQkJMUE2M0JERkIxMzRGQjc1RTAwMkVERkI0IC8qIGhvaXN0ZWRQcmVkaWNhdGVzICovLAorCQkJCTFBNjNCRDNFMTM0RjVGMzYwMDJFREZCNCAvKiBsZXhlcnRlc3Qtc2ltcGxlICovLAorCQkJCTFBNjNCRDRCMTM0RjVGNDMwMDJFREZCNCAvKiBMTC1zdGFydCAqLywKKwkJCQkxQTYzQkQ1ODEzNEY1RjREMDAyRURGQjQgLyogcG9seWRpZmYgKi8sCisJCQkJMUE2M0JERDMxMzRGNjIzMzAwMkVERkI0IC8qIHNjb3BlcyAqLywKKwkJCQkxQTYzQkQ2NTEzNEY1RjVFMDAyRURGQjQgLyogc2ltcGxlY1RyZWVQYXJzZXIgKi8sCisJCQkJMUE2M0JENzIxMzRGNUY2NzAwMkVERkI0IC8qIHRyZWVwYXJzZXIgKi8sCisJCQkJMUE2M0JEN0YxMzRGNUY3MTAwMkVERkI0IC8qIHRyZWVyZXdyaXRlICovLAorCQkJKTsKKwkJfTsKKy8qIEVuZCBQQlhQcm9qZWN0IHNlY3Rpb24gKi8KKworLyogQmVnaW4gUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTFBRTcyMzE2MTM0RTg2MEIwMDFDM0YzNSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBRTcyMzI2MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBRTcyMzJBMTM0RTg2MEIwMDFDM0YzNSAvKiBSZXNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBRTcyMzM3MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyBpbiBSZXNvdXJjZXMgKi8sCisJCQkJMUFFNzIzM0ExMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSVGVzdHMuaCBpbiBSZXNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYUmVzb3VyY2VzQnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisJCTFBRTcyMzJCMTM0RTg2MEIwMDFDM0YzNSAvKiBTaGVsbFNjcmlwdCAqLyA9IHsKKwkJCWlzYSA9IFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCSk7CisJCQlpbnB1dFBhdGhzID0gKAorCQkJKTsKKwkJCW91dHB1dFBhdGhzID0gKAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQkJc2hlbGxQYXRoID0gL2Jpbi9zaDsKKwkJCXNoZWxsU2NyaXB0ID0gIiMgUnVuIHRoZSB1bml0IHRlc3RzIGluIHRoaXMgdGVzdCBidW5kbGUuXG5cIiR7U1lTVEVNX0RFVkVMT1BFUl9ESVJ9L1Rvb2xzL1J1blVuaXRUZXN0c1wiXG4iOworCQl9OworLyogRW5kIFBCWFNoZWxsU2NyaXB0QnVpbGRQaGFzZSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFNvdXJjZXNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KKwkJMUE2M0JDNUQxMzRGNURBQjAwMkVERkI0IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTYzQkM2RjEzNEY1REU1MDAyRURGQjQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JDNkUxMzRGNURFNTAwMkVERkI0IC8qIEZ1enp5TGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTYzQkQyRTEzNEY1RjFFMDAyRURGQjQgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNjNCRDhCMTM0RjVGRjMwMDJFREZCNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTYzQkQ4OTEzNEY1RkYzMDAyRURGQjQgLyogQ29tYmluZWRMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JEOEExMzRGNUZGMzAwMkVERkI0IC8qIENvbWJpbmVkUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE2M0JEM0IxMzRGNUYzNjAwMkVERkI0IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTYzQkQ5NDEzNEY2MDZBMDAyRURGQjQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JEOTUxMzRGNjA2QTAwMkVERkI0IC8qIFRlc3RMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNjNCRDQ4MTM0RjVGNDMwMDJFREZCNCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE2M0JEQzcxMzRGNjFFNDAwMkVERkI0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjNCREM4MTM0RjYxRTgwMDJFREZCNCAvKiBTaW1wbGVDTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjNCREM5MTM0RjYxRUMwMDJFREZCNCAvKiBTaW1wbGVDUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE2M0JENTUxMzRGNUY0RDAwMkVERkI0IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTYzQkRDQTEzNEY2MjE4MDAyRURGQjQgLyogTWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JEQ0IxMzRGNjIxODAwMkVERkI0IC8qIFBvbHlEaWZmZXJlbnRpYXRvci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JEQ0MxMzRGNjIxODAwMkVERkI0IC8qIFBvbHlMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JEQ0QxMzRGNjIxODAwMkVERkI0IC8qIFBvbHlQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjNCRENFMTM0RjYyMTgwMDJFREZCNCAvKiBQb2x5UHJpbnRlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JEQ0YxMzRGNjIxODAwMkVERkI0IC8qIFNpbXBsaWZpZXIubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTYzQkQ2MjEzNEY1RjVFMDAyRURGQjQgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNjNCREU4MTM0RjYyRDAwMDJFREZCNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTYzQkRFQTEzNEY2MkQwMDAyRURGQjQgLyogU2ltcGxlQ1RQLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTYzQkRFQjEzNEY2MkQwMDAyRURGQjQgLyogU2ltcGxlQ1dhbGtlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JERTcxMzRGNjJDQjAwMkVERkI0IC8qIFNpbXBsZUNMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNjNCRDZGMTM0RjVGNjcwMDJFREZCNCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE3NkEwMkYxMzRGRDQxNjAwNDE2MzRGIC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNzZBMDMyMTM0RkQ0QjkwMDQxNjM0RiAvKiBMYW5nRHVtcERlY2wubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNzZBMDMwMTM0RkQ0QTAwMDQxNjM0RiAvKiBMYW5nTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNzZBMDMxMTM0RkQ0QTQwMDQxNjM0RiAvKiBMYW5nUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCSk7CisJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKKwkJfTsKKwkJMUE2M0JEN0MxMzRGNUY3MTAwMkVERkI0IC8qIFNvdXJjZXMgKi8gPSB7CisJCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKKwkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7CisJCQlmaWxlcyA9ICgKKwkJCQkxQTYzQkRGNjEzNEZCNTVGMDAyRURGQjQgLyogbWFpbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2M0JERjUxMzRGQjU1QjAwMkVERkI0IC8qIFRyZWVSZXdyaXRlTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjNCREY3MTM0RkI1NjQwMDJFREZCNCAvKiBUcmVlUmV3cml0ZVBhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBNjNCREQwMTM0RjYyMzMwMDJFREZCNCAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUE2M0JEREQxMzRGNjI1ODAwMkVERkI0IC8qIG1haW4ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNjNCRERFMTM0RjYyNTgwMDJFREZCNCAvKiBTeW1ib2xUYWJsZUxleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTYzQkRERjEzNEY2MjU4MDAyRURGQjQgLyogU3ltYm9sVGFibGVQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJKTsKKwkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOworCQl9OworCQkxQTYzQkRGODEzNEZCNzVFMDAyRURGQjQgLyogU291cmNlcyAqLyA9IHsKKwkJCWlzYSA9IFBCWFNvdXJjZXNCdWlsZFBoYXNlOworCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKKwkJCWZpbGVzID0gKAorCQkJCTFBNjNCRTA1MTM0RkI4MDcwMDJFREZCNCAvKiBtYWluLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTYzQkUwNjEzNEZCODBCMDAyRURGQjQgLyogVExleGVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTYzQkUwNzEzNEZCODBFMDAyRURGQjQgLyogVFBhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBRTcyMzEzMTM0RTg2MEIwMDFDM0YzNSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUFFNzIzOUYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQmFzZU1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0EwMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VSZWNvZ25pemVyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNBMTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlU3RhY2subSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0EyMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJhc2VUcmVlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNBMzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJCYXNlVHJlZUFkYXB0b3IubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0E0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkJpdFNldC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQTUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQTYxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQTcxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ2hhclN0cmVhbVN0YXRlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNBODEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25FcnJvck5vZGUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0E5MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRva2VuLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNBQTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJDb21tb25Ub2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQUIxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQUMxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0FEMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNBRTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z0V2ZW50UHJveHkubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0FGMTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRlYnVnUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCMDEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCMTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCMjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCMzEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJEZWJ1Z1RyZWVQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0I0MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkRGQS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQjUxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRG91YmxlS2V5TWFwLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCNjEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJFYXJseUV4aXRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0I3MTM0RThBQjQwMDFDM0YzNSAvKiBBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQjgxMzRFOEFCNDAwMUMzRjM1IC8qIEFOVExSRmFzdFF1ZXVlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCOTEzNEU4QUI0MDAxQzNGMzUgLyogQU5UTFJGaWxlU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCQTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJIYXNoTWFwLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCQjEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJIYXNoUnVsZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQkMxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSSW5wdXRTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0JEMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUkludEFycmF5Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNCRjEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJMZXhlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQzAxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0MxMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUkxleGVyU3RhdGUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0MyMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUkxpbmtCYXNlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNDMzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJMb29rYWhlYWRTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0M0MTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUk1hcC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQzUxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTWFwRWxlbWVudC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQzYxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQzcxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNDODEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNDOTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0NBMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQ0IxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNDQzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJOb2RlTWFwRWxlbWVudC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQ0QxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0NFMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlBhcnNlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzQ0YxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNEMDEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJQYXJzZVRyZWUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0QxMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlB0ckJ1ZmZlci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRDIxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUHRyU3RhY2subSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0QzMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJlYWRlclN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRDQxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0Q1MTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRDYxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNENzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0Q4MTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRDkxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzREExMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUnVsZU1hcEVsZW1lbnQubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0RCMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJ1bGVNZW1vLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNEQzEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJSdWxlUmV0dXJuU2NvcGUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0REMTM0RThBQjUwMDFDM0YzNSAvKiBBTlRMUlJ1bGVTdGFjay5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzREUxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSUnVudGltZUV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzREYxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSU3RyZWFtRW51bWVyYXRvci5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRTAxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSU3RyaW5nU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNFMTEzNEU4QUI1MDAxQzNGMzUgLyogQU5UTFJTeW1ib2xTdGFjay5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRTIxMzRFOEFCNTAwMUMzRjM1IC8qIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNFMzEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUb2tlblJld3JpdGVTdHJlYW0ubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0U1MTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVBZGFwdG9yLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNFNjEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlRXhjZXB0aW9uLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNFNzEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlSXRlcmF0b3IubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0U4MTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVQYXJzZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0U5MTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0VBMTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNFQjEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlUmV3cml0ZXIubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0VDMTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubSBpbiBTb3VyY2VzICovLAorCQkJCTFBRTcyM0VEMTM0RThBQjYwMDFDM0YzNSAvKiBBTlRMUlRyZWVWaXNpdG9yLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNFRTEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRUYxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVHJlZVdpemFyZC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRjAxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNGMTEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRjIxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm0gaW4gU291cmNlcyAqLywKKwkJCQkxQUU3MjNGMzEzNEU4QUI2MDAxQzNGMzUgLyogQU5UTFJVbmlxdWVJRE1hcC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUFFNzIzRjQxMzRFOEFCNjAwMUMzRjM1IC8qIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisJCTFBRTcyMzI4MTM0RTg2MEIwMDFDM0YzNSAvKiBTb3VyY2VzICovID0geworCQkJaXNhID0gUEJYU291cmNlc0J1aWxkUGhhc2U7CisJCQlidWlsZEFjdGlvbk1hc2sgPSAyMTQ3NDgzNjQ3OworCQkJZmlsZXMgPSAoCisJCQkJMUFFNzIzM0MxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSVGVzdHMubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDZBMTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkJpdFNldFRlc3QuaCBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDZCMTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkJpdFNldFRlc3QubSBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDcwMTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRva2VuVGVzdC5oIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2QjFENzExMzRFOERFQjAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVG9rZW5UZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ3MjEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJDb21tb25FcnJvck5vZGVUZXN0LmggaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ3MzEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJDb21tb25FcnJvck5vZGVUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ3NDEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QuaCBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDc1MTM0RThERUMwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yVGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2QjFENzYxMzRFOERFQzAwMTZBNDdEIC8qIEFOVExSQ29tbW9uVHJlZVRlc3QuaCBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDc3MTM0RThERUMwMDE2QTQ3RCAvKiBBTlRMUkNvbW1vblRyZWVUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ2NDEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJGYXN0UXVldWVUZXN0LmggaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ2NTEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJGYXN0UXVldWVUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ2NjEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJJbnRBcnJheVRlc3QuaCBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDY3MTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUkludEFycmF5VGVzdC5tIGluIFNvdXJjZXMgKi8sCisJCQkJMUE2QjFENjgxMzRFOERFQjAwMTZBNDdEIC8qIEFOVExSUmVjb2duaXplclRlc3QuaCBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDY5MTM0RThERUIwMDE2QTQ3RCAvKiBBTlRMUlJlY29nbml6ZXJUZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ2QzEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0LmggaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ2RDEzNEU4REVCMDAxNkE0N0QgLyogQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gaW4gU291cmNlcyAqLywKKwkJCQkxQTZCMUQ2RTEzNEU4REVCMDAxNkE0N0QgLyogVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCBpbiBTb3VyY2VzICovLAorCQkJCTFBNkIxRDZGMTM0RThERUIwMDE2QTQ3RCAvKiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tIGluIFNvdXJjZXMgKi8sCisJCQkpOworCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CisJCX07CisvKiBFbmQgUEJYU291cmNlc0J1aWxkUGhhc2Ugc2VjdGlvbiAqLworCisvKiBCZWdpbiBQQlhUYXJnZXREZXBlbmRlbmN5IHNlY3Rpb24gKi8KKwkJMUE2M0JEOUYxMzRGNjA5MzAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTYzQkQ5RTEzNEY2MDkzMDAyRURGQjQgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTYzQkRBMTEzNEY2MDlCMDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFIgKi87CisJCQl0YXJnZXRQcm94eSA9IDFBNjNCREEwMTM0RjYwOUIwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTFBNjNCREEzMTM0RjYwQTcwMDJFREZCNCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDFBRTcyMzE3MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUiAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUE2M0JEQTIxMzRGNjBBNzAwMkVERkI0IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUE2M0JEQTUxMzRGNjBCMDAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTYzQkRBNDEzNEY2MEIwMDAyRURGQjQgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTYzQkRBNzEzNEY2MEJDMDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFIgKi87CisJCQl0YXJnZXRQcm94eSA9IDFBNjNCREE2MTM0RjYwQkMwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTFBNjNCREE5MTM0RjYwQzMwMDJFREZCNCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDFBRTcyMzE3MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUiAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUE2M0JEQTgxMzRGNjBDMzAwMkVERkI0IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUE2M0JEQUIxMzRGNjBDQzAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTYzQkRBQTEzNEY2MENDMDAyRURGQjQgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQTYzQkRBRDEzNEY2MEQyMDAyRURGQjQgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFIgKi87CisJCQl0YXJnZXRQcm94eSA9IDFBNjNCREFDMTM0RjYwRDIwMDJFREZCNCAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisJCTFBNjNCREU2MTM0RjYyOUIwMDJFREZCNCAvKiBQQlhUYXJnZXREZXBlbmRlbmN5ICovID0geworCQkJaXNhID0gUEJYVGFyZ2V0RGVwZW5kZW5jeTsKKwkJCXRhcmdldCA9IDFBRTcyMzE3MTM0RTg2MEIwMDFDM0YzNSAvKiBBTlRMUiAqLzsKKwkJCXRhcmdldFByb3h5ID0gMUE2M0JERTUxMzRGNjI5QjAwMkVERkI0IC8qIFBCWENvbnRhaW5lckl0ZW1Qcm94eSAqLzsKKwkJfTsKKwkJMUE2M0JFMEIxMzRGQjgyNDAwMkVERkI0IC8qIFBCWFRhcmdldERlcGVuZGVuY3kgKi8gPSB7CisJCQlpc2EgPSBQQlhUYXJnZXREZXBlbmRlbmN5OworCQkJdGFyZ2V0ID0gMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IC8qIEFOVExSICovOworCQkJdGFyZ2V0UHJveHkgPSAxQTYzQkUwQTEzNEZCODI0MDAyRURGQjQgLyogUEJYQ29udGFpbmVySXRlbVByb3h5ICovOworCQl9OworCQkxQUU3MjMzMDEzNEU4NjBCMDAxQzNGMzUgLyogUEJYVGFyZ2V0RGVwZW5kZW5jeSAqLyA9IHsKKwkJCWlzYSA9IFBCWFRhcmdldERlcGVuZGVuY3k7CisJCQl0YXJnZXQgPSAxQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzUgLyogQU5UTFIgKi87CisJCQl0YXJnZXRQcm94eSA9IDFBRTcyMzJGMTM0RTg2MEIwMDFDM0YzNSAvKiBQQlhDb250YWluZXJJdGVtUHJveHkgKi87CisJCX07CisvKiBFbmQgUEJYVGFyZ2V0RGVwZW5kZW5jeSBzZWN0aW9uICovCisKKy8qIEJlZ2luIFBCWFZhcmlhbnRHcm91cCBzZWN0aW9uICovCisJCTFBRTcyMzI0MTM0RTg2MEIwMDFDM0YzNSAvKiBJbmZvUGxpc3Quc3RyaW5ncyAqLyA9IHsKKwkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCTFBRTcyMzI1MTM0RTg2MEIwMDFDM0YzNSAvKiBlbiAqLywKKwkJCSk7CisJCQluYW1lID0gSW5mb1BsaXN0LnN0cmluZ3M7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OworCQkxQUU3MjMzNTEzNEU4NjBCMDAxQzNGMzUgLyogSW5mb1BsaXN0LnN0cmluZ3MgKi8gPSB7CisJCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQkxQUU3MjMzNjEzNEU4NjBCMDAxQzNGMzUgLyogZW4gKi8sCisJCQkpOworCQkJbmFtZSA9IEluZm9QbGlzdC5zdHJpbmdzOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKKy8qIEVuZCBQQlhWYXJpYW50R3JvdXAgc2VjdGlvbiAqLworCisvKiBCZWdpbiBYQ0J1aWxkQ29uZmlndXJhdGlvbiBzZWN0aW9uICovCisJCTFBNjNCQzY4MTM0RjVEQUMwMDJFREZCNCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJIkZSQU1FV09SS19TRUFSQ0hfUEFUSFNbYXJjaD0qXSIgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlURVNUX0FGVEVSX0JVSUxEID0gWUVTOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUE2M0JDNjkxMzRGNURBQzAwMkVERkI0IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0hfQUNUVUFMKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQkJVEVTVF9BRlRFUl9CVUlMRCA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JEMzkxMzRGNUYxRTAwMkVERkI0IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQkJVEVTVF9BRlRFUl9CVUlMRCA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBNjNCRDNBMTM0RjVGMUUwMDJFREZCNCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVRFU1RfQUZURVJfQlVJTEQgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBNjNCRDQ2MTM0RjVGMzYwMDJFREZCNCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVRFU1RfQUZURVJfQlVJTEQgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTYzQkQ0NzEzNEY1RjM2MDAyRURGQjQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlURVNUX0FGVEVSX0JVSUxEID0gWUVTOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTYzQkQ1MzEzNEY1RjQzMDAyRURGQjQgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0hfQUNUVUFMKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBNjNCRDU0MTM0RjVGNDMwMDJFREZCNCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTYzQkQ2MDEzNEY1RjREMDAyRURGQjQgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0hfQUNUVUFMKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlVU0VSX0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJfTsKKwkJCW5hbWUgPSBEZWJ1ZzsKKwkJfTsKKwkJMUE2M0JENjExMzRGNUY0RDAwMkVERkI0IC8qIFJlbGVhc2UgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0hfQUNUVUFMKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQkJVVNFUl9IRUFERVJfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JENkQxMzRGNUY1RTAwMkVERkI0IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTYzQkQ2RTEzNEY1RjVFMDAyRURGQjQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JEN0ExMzRGNUY2ODAwMkVERkI0IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQkJVEVTVF9BRlRFUl9CVUlMRCA9IFlFUzsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBNjNCRDdCMTM0RjVGNjgwMDJFREZCNCAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IFlFUzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVRFU1RfQUZURVJfQlVJTEQgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBNjNCRDg3MTM0RjVGNzIwMDJFREZCNCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVRFU1RfQUZURVJfQlVJTEQgPSBZRVM7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTYzQkQ4ODEzNEY1RjcyMDAyRURGQjQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlURVNUX0FGVEVSX0JVSUxEID0gWUVTOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTYzQkREQjEzNEY2MjM0MDAyRURGQjQgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQUxXQVlTX1NFQVJDSF9VU0VSX1BBVEhTID0gWUVTOworCQkJCUFSQ0hTID0gIiQoTkFUSVZFX0FSQ0hfQUNUVUFMKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19EWU5BTUlDX05PX1BJQyA9IE5POworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlURVNUX0FGVEVSX0JVSUxEID0gWUVTOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTYzQkREQzEzNEY2MjM0MDAyRURGQjQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBZRVM7CisJCQkJQVJDSFMgPSAiJChOQVRJVkVfQVJDSF9BQ1RVQUwpIjsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCU9OTFlfQUNUSVZFX0FSQ0ggPSBZRVM7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlURVNUX0FGVEVSX0JVSUxEID0gWUVTOworCQkJCVVTRVJfSEVBREVSX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBNjNCRTAzMTM0RkI3NUYwMDJFREZCNCAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBOTzsKKwkJCQlGUkFNRVdPUktfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlHQ0NfRFlOQU1JQ19OT19QSUMgPSBOTzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfRVhDRVBUSU9OUyA9IFlFUzsKKwkJCQlHQ0NfRU5BQkxFX09CSkNfR0MgPSByZXF1aXJlZDsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gWUVTOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQTYzQkUwNDEzNEZCNzVGMDAyRURGQjQgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlBUkNIUyA9ICIkKE5BVElWRV9BUkNIX0FDVFVBTCkiOworCQkJCUNPUFlfUEhBU0VfU1RSSVAgPSBZRVM7CisJCQkJREVCVUdfSU5GT1JNQVRJT05fRk9STUFUID0gImR3YXJmLXdpdGgtZHN5bSI7CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IFlFUzsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQUU3MjMzRDEzNEU4NjBCMDAxQzNGMzUgLyogRGVidWcgKi8gPSB7CisJCQlpc2EgPSBYQ0J1aWxkQ29uZmlndXJhdGlvbjsKKwkJCWJ1aWxkU2V0dGluZ3MgPSB7CisJCQkJQVJDSFMgPSAiJChBUkNIU19TVEFOREFSRF8zMl9CSVQpIjsKKwkJCQlHQ0NfQ19MQU5HVUFHRV9TVEFOREFSRCA9IGdudTk5OworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHN1cHBvcnRlZDsKKwkJCQlHQ0NfT1BUSU1JWkFUSU9OX0xFVkVMID0gMDsKKwkJCQlHQ0NfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TID0gREVCVUc7CisJCQkJR0NDX1NZTUJPTFNfUFJJVkFURV9FWFRFUk4gPSBOTzsKKwkJCQlHQ0NfVkVSU0lPTiA9IGNvbS5hcHBsZS5jb21waWxlcnMubGx2bS5jbGFuZy4xXzA7CisJCQkJR0NDX1dBUk5fNjRfVE9fMzJfQklUX0NPTlZFUlNJT04gPSBZRVM7CisJCQkJR0NDX1dBUk5fQUJPVVRfUkVUVVJOX1RZUEUgPSBZRVM7CisJCQkJR0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFID0gWUVTOworCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCU1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCA9IDEwLjY7CisJCQkJT05MWV9BQ1RJVkVfQVJDSCA9IE5POworCQkJCVNES1JPT1QgPSBtYWNvc3g7CisJCQkJVVNFUl9IRUFERVJfU0VBUkNIX1BBVEhTID0gL0xpYnJhcnkvRnJhbWV3b3JrczsKKwkJCQlWQUxJRF9BUkNIUyA9IGkzODY7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQUU3MjMzRTEzNEU4NjBCMDAxQzNGMzUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBUkNIUyA9ICIkKEFSQ0hTX1NUQU5EQVJEXzMyX0JJVCkiOworCQkJCUdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEID0gZ251OTk7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gc3VwcG9ydGVkOworCQkJCUdDQ19WRVJTSU9OID0gY29tLmFwcGxlLmNvbXBpbGVycy5sbHZtLmNsYW5nLjFfMDsKKwkJCQlHQ0NfV0FSTl82NF9UT18zMl9CSVRfQ09OVkVSU0lPTiA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9BQk9VVF9SRVRVUk5fVFlQRSA9IFlFUzsKKwkJCQlHQ0NfV0FSTl9VTlVTRURfVkFSSUFCTEUgPSBZRVM7CisJCQkJSEVBREVSX1NFQVJDSF9QQVRIUyA9IC9MaWJyYXJ5L0ZyYW1ld29ya3M7CisJCQkJTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUID0gMTAuNjsKKwkJCQlPTkxZX0FDVElWRV9BUkNIID0gTk87CisJCQkJU0RLUk9PVCA9IG1hY29zeDsKKwkJCQlVU0VSX0hFQURFUl9TRUFSQ0hfUEFUSFMgPSAvTGlicmFyeS9GcmFtZXdvcmtzOworCQkJCVZBTElEX0FSQ0hTID0gaTM4NjsKKwkJCX07CisJCQluYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUFFNzIzNDAxMzRFODYwQjAwMUMzRjM1IC8qIERlYnVnICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfQklUKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POworCQkJCURZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7CisJCQkJRFlMSUJfQ1VSUkVOVF9WRVJTSU9OID0gMTsKKwkJCQlGUkFNRVdPUktfVkVSU0lPTiA9IEE7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX0VOQUJMRV9PQkpDX0dDID0gcmVxdWlyZWQ7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJBTlRMUi9BTlRMUi1QcmVmaXgucGNoIjsKKwkJCQlJTkZPUExJU1RfRklMRSA9ICJBTlRMUi9BTlRMUi1JbmZvLnBsaXN0IjsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVZBTElEX0FSQ0hTID0gaTM4NjsKKwkJCQlXUkFQUEVSX0VYVEVOU0lPTiA9IGZyYW1ld29yazsKKwkJCX07CisJCQluYW1lID0gRGVidWc7CisJCX07CisJCTFBRTcyMzQxMTM0RTg2MEIwMDFDM0YzNSAvKiBSZWxlYXNlICovID0geworCQkJaXNhID0gWENCdWlsZENvbmZpZ3VyYXRpb247CisJCQlidWlsZFNldHRpbmdzID0geworCQkJCUFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUyA9IE5POworCQkJCUFSQ0hTID0gIiQoQVJDSFNfU1RBTkRBUkRfMzJfQklUKSI7CisJCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKKwkJCQlERUJVR19JTkZPUk1BVElPTl9GT1JNQVQgPSAiZHdhcmYtd2l0aC1kc3ltIjsKKwkJCQlEWUxJQl9DT01QQVRJQklMSVRZX1ZFUlNJT04gPSAxOworCQkJCURZTElCX0NVUlJFTlRfVkVSU0lPTiA9IDE7CisJCQkJRlJBTUVXT1JLX1ZFUlNJT04gPSBBOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19FTkFCTEVfT0JKQ19HQyA9IHJlcXVpcmVkOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiQU5UTFIvQU5UTFItUHJlZml4LnBjaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFIvQU5UTFItSW5mby5wbGlzdCI7CisJCQkJUFJPRFVDVF9OQU1FID0gIiQoVEFSR0VUX05BTUUpIjsKKwkJCQlWQUxJRF9BUkNIUyA9IGkzODY7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBmcmFtZXdvcms7CisJCQl9OworCQkJbmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBRTcyMzQzMTM0RTg2MEIwMDFDM0YzNSAvKiBEZWJ1ZyAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gTk87CisJCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIkKERFVkVMT1BFUl9MSUJSQVJZX0RJUikvRnJhbWV3b3JrcyI7CisJCQkJR0NDX0RZTkFNSUNfTk9fUElDID0gTk87CisJCQkJR0NDX0VOQUJMRV9PQkpDX0VYQ0VQVElPTlMgPSBZRVM7CisJCQkJR0NDX1BSRUNPTVBJTEVfUFJFRklYX0hFQURFUiA9IFlFUzsKKwkJCQlHQ0NfUFJFRklYX0hFQURFUiA9ICJBTlRMUlRlc3RzL0FOVExSVGVzdHMtUHJlZml4LnBjaCI7CisJCQkJSU5GT1BMSVNUX0ZJTEUgPSAiQU5UTFJUZXN0cy9BTlRMUlRlc3RzLUluZm8ucGxpc3QiOworCQkJCU9USEVSX0xERkxBR1MgPSAoCisJCQkJCSItZnJhbWV3b3JrIiwKKwkJCQkJU2VuVGVzdGluZ0tpdCwKKwkJCQkpOworCQkJCVBST0RVQ1RfTkFNRSA9ICIkKFRBUkdFVF9OQU1FKSI7CisJCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBvY3Rlc3Q7CisJCQl9OworCQkJbmFtZSA9IERlYnVnOworCQl9OworCQkxQUU3MjM0NDEzNEU4NjBCMDAxQzNGMzUgLyogUmVsZWFzZSAqLyA9IHsKKwkJCWlzYSA9IFhDQnVpbGRDb25maWd1cmF0aW9uOworCQkJYnVpbGRTZXR0aW5ncyA9IHsKKwkJCQlBTFdBWVNfU0VBUkNIX1VTRVJfUEFUSFMgPSBOTzsKKwkJCQlDT1BZX1BIQVNFX1NUUklQID0gWUVTOworCQkJCURFQlVHX0lORk9STUFUSU9OX0ZPUk1BVCA9ICJkd2FyZi13aXRoLWRzeW0iOworCQkJCUZSQU1FV09SS19TRUFSQ0hfUEFUSFMgPSAiJChERVZFTE9QRVJfTElCUkFSWV9ESVIpL0ZyYW1ld29ya3MiOworCQkJCUdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TID0gWUVTOworCQkJCUdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVIgPSBZRVM7CisJCQkJR0NDX1BSRUZJWF9IRUFERVIgPSAiQU5UTFJUZXN0cy9BTlRMUlRlc3RzLVByZWZpeC5wY2giOworCQkJCUlORk9QTElTVF9GSUxFID0gIkFOVExSVGVzdHMvQU5UTFJUZXN0cy1JbmZvLnBsaXN0IjsKKwkJCQlPVEhFUl9MREZMQUdTID0gKAorCQkJCQkiLWZyYW1ld29yayIsCisJCQkJCVNlblRlc3RpbmdLaXQsCisJCQkJKTsKKwkJCQlQUk9EVUNUX05BTUUgPSAiJChUQVJHRVRfTkFNRSkiOworCQkJCVdSQVBQRVJfRVhURU5TSU9OID0gb2N0ZXN0OworCQkJfTsKKwkJCW5hbWUgPSBSZWxlYXNlOworCQl9OworLyogRW5kIFhDQnVpbGRDb25maWd1cmF0aW9uIHNlY3Rpb24gKi8KKworLyogQmVnaW4gWENDb25maWd1cmF0aW9uTGlzdCBzZWN0aW9uICovCisJCTFBNjNCQzY3MTM0RjVEQUMwMDJFREZCNCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiRnV6enkiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUE2M0JDNjgxMzRGNURBQzAwMkVERkI0IC8qIERlYnVnICovLAorCQkJCTFBNjNCQzY5MTM0RjVEQUMwMDJFREZCNCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBNjNCRDM4MTM0RjVGMUUwMDJFREZCNCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiY29tYmluZWQiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUE2M0JEMzkxMzRGNUYxRTAwMkVERkI0IC8qIERlYnVnICovLAorCQkJCTFBNjNCRDNBMTM0RjVGMUUwMDJFREZCNCAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBNjNCRDQ1MTM0RjVGMzYwMDJFREZCNCAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAibGV4ZXJ0ZXN0LXNpbXBsZSIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTYzQkQ0NjEzNEY1RjM2MDAyRURGQjQgLyogRGVidWcgKi8sCisJCQkJMUE2M0JENDcxMzRGNUYzNjAwMkVERkI0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JENTIxMzRGNUY0MzAwMkVERkI0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJMTC1zdGFydCIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTYzQkQ1MzEzNEY1RjQzMDAyRURGQjQgLyogRGVidWcgKi8sCisJCQkJMUE2M0JENTQxMzRGNUY0MzAwMkVERkI0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JENUYxMzRGNUY0RDAwMkVERkI0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJwb2x5ZGlmZiIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTYzQkQ2MDEzNEY1RjREMDAyRURGQjQgLyogRGVidWcgKi8sCisJCQkJMUE2M0JENjExMzRGNUY0RDAwMkVERkI0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JENkMxMzRGNUY1RTAwMkVERkI0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJzaW1wbGVjVHJlZVBhcnNlciIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTYzQkQ2RDEzNEY1RjVFMDAyRURGQjQgLyogRGVidWcgKi8sCisJCQkJMUE2M0JENkUxMzRGNUY1RTAwMkVERkI0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JENzkxMzRGNUY2ODAwMkVERkI0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJ0cmVlcGFyc2VyIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBNjNCRDdBMTM0RjVGNjgwMDJFREZCNCAvKiBEZWJ1ZyAqLywKKwkJCQkxQTYzQkQ3QjEzNEY1RjY4MDAyRURGQjQgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTYzQkQ4NjEzNEY1RjcyMDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInRyZWVyZXdyaXRlIiAqLyA9IHsKKwkJCWlzYSA9IFhDQ29uZmlndXJhdGlvbkxpc3Q7CisJCQlidWlsZENvbmZpZ3VyYXRpb25zID0gKAorCQkJCTFBNjNCRDg3MTM0RjVGNzIwMDJFREZCNCAvKiBEZWJ1ZyAqLywKKwkJCQkxQTYzQkQ4ODEzNEY1RjcyMDAyRURGQjQgLyogUmVsZWFzZSAqLywKKwkJCSk7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbklzVmlzaWJsZSA9IDA7CisJCQlkZWZhdWx0Q29uZmlndXJhdGlvbk5hbWUgPSBSZWxlYXNlOworCQl9OworCQkxQTYzQkREQTEzNEY2MjM0MDAyRURGQjQgLyogQnVpbGQgY29uZmlndXJhdGlvbiBsaXN0IGZvciBQQlhOYXRpdmVUYXJnZXQgInNjb3BlcyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTYzQkREQjEzNEY2MjM0MDAyRURGQjQgLyogRGVidWcgKi8sCisJCQkJMUE2M0JEREMxMzRGNjIzNDAwMkVERkI0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUE2M0JFMDIxMzRGQjc1RjAwMkVERkI0IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYTmF0aXZlVGFyZ2V0ICJob2lzdGVkUHJlZGljYXRlcyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQTYzQkUwMzEzNEZCNzVGMDAyRURGQjQgLyogRGVidWcgKi8sCisJCQkJMUE2M0JFMDQxMzRGQjc1RjAwMkVERkI0IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKwkJMUFFNzIzMTExMzRFODYwQTAwMUMzRjM1IC8qIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiQU5UTFIiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUFFNzIzM0QxMzRFODYwQjAwMUMzRjM1IC8qIERlYnVnICovLAorCQkJCTFBRTcyMzNFMTM0RTg2MEIwMDFDM0YzNSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBRTcyMzNGMTM0RTg2MEIwMDFDM0YzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFIiICovID0geworCQkJaXNhID0gWENDb25maWd1cmF0aW9uTGlzdDsKKwkJCWJ1aWxkQ29uZmlndXJhdGlvbnMgPSAoCisJCQkJMUFFNzIzNDAxMzRFODYwQjAwMUMzRjM1IC8qIERlYnVnICovLAorCQkJCTFBRTcyMzQxMTM0RTg2MEIwMDFDM0YzNSAvKiBSZWxlYXNlICovLAorCQkJKTsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uSXNWaXNpYmxlID0gMDsKKwkJCWRlZmF1bHRDb25maWd1cmF0aW9uTmFtZSA9IFJlbGVhc2U7CisJCX07CisJCTFBRTcyMzQyMTM0RTg2MEIwMDFDM0YzNSAvKiBCdWlsZCBjb25maWd1cmF0aW9uIGxpc3QgZm9yIFBCWE5hdGl2ZVRhcmdldCAiQU5UTFJUZXN0cyIgKi8gPSB7CisJCQlpc2EgPSBYQ0NvbmZpZ3VyYXRpb25MaXN0OworCQkJYnVpbGRDb25maWd1cmF0aW9ucyA9ICgKKwkJCQkxQUU3MjM0MzEzNEU4NjBCMDAxQzNGMzUgLyogRGVidWcgKi8sCisJCQkJMUFFNzIzNDQxMzRFODYwQjAwMUMzRjM1IC8qIFJlbGVhc2UgKi8sCisJCQkpOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Jc1Zpc2libGUgPSAwOworCQkJZGVmYXVsdENvbmZpZ3VyYXRpb25OYW1lID0gUmVsZWFzZTsKKwkJfTsKKy8qIEVuZCBYQ0NvbmZpZ3VyYXRpb25MaXN0IHNlY3Rpb24gKi8KKwl9OworCXJvb3RPYmplY3QgPSAxQUU3MjMwRTEzNEU4NjBBMDAxQzNGMzUgLyogUHJvamVjdCBvYmplY3QgKi87Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2ovcHJvamVjdC54Y3dvcmtzcGFjZS9jb250ZW50cy54Y3dvcmtzcGFjZWRhdGEgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2ovcHJvamVjdC54Y3dvcmtzcGFjZS9jb250ZW50cy54Y3dvcmtzcGFjZWRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MzgxNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai9wcm9qZWN0Lnhjd29ya3NwYWNlL2NvbnRlbnRzLnhjd29ya3NwYWNlZGF0YQpAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8V29ya3NwYWNlCisgICB2ZXJzaW9uID0gIjEuMCI+CisgICA8RmlsZVJlZgorICAgICAgbG9jYXRpb24gPSAic2VsZjpBTlRMUi54Y29kZXByb2oiPgorICAgPC9GaWxlUmVmPgorPC9Xb3Jrc3BhY2U+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2ovcHJvamVjdC54Y3dvcmtzcGFjZS94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQvVXNlckludGVyZmFjZVN0YXRlLnhjdXNlcnN0YXRlIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL1VzZXJJbnRlcmZhY2VTdGF0ZS54Y3VzZXJzdGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RhMTNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL1VzZXJJbnRlcmZhY2VTdGF0ZS54Y3VzZXJzdGF0ZQpAQCAtMCwwICsxLDk5MDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+JGFyY2hpdmVyPC9rZXk+CisJPHN0cmluZz5OU0tleWVkQXJjaGl2ZXI8L3N0cmluZz4KKwk8a2V5PiRvYmplY3RzPC9rZXk+CisJPGFycmF5PgorCQk8c3RyaW5nPiRudWxsPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPjhCOEREQzZCLURERTItNDI0Ny04RjBELUEwNkUwRDRCMkRCRDwvc3RyaW5nPgorCQk8c3RyaW5nPjNFODgwMjU2LTM3QTctNDVFRS05NzExLTZBN0I1QjhFNzA5RTwvc3RyaW5nPgorCQk8c3RyaW5nPjJBMDY4N0NBLTlFMDktNDNEQS1BQUI0LTY2QUIwRUY5QUIwRDwvc3RyaW5nPgorCQk8c3RyaW5nPjI2N0RFMkIzLThBOTctNDNEQi1CMjU4LTg2NTk5NUMzMjkxRTwvc3RyaW5nPgorCQk8c3RyaW5nPjk4NjlEMzY3LUY0RkYtNDdFMS05RjBCLUVDMjEyOUYzQzI1MDwvc3RyaW5nPgorCQk8c3RyaW5nPkM1QjhGNzNDLUM3MTktNDM5Mi1CNzNBLTJFOUJDMjNBMjY1RTwvc3RyaW5nPgorCQk8c3RyaW5nPjIwNjBBNDM0LUEyNzYtNDFFMi05QURCLTI4QkIxQjhDNjVCMzwvc3RyaW5nPgorCQk8c3RyaW5nPjUxOTEyQ0QxLTg2QzAtNEU0My1CRjgzLUE0NkI2QUVFOUJCOTwvc3RyaW5nPgorCQk8c3RyaW5nPjMzQjNFQTkwLTlEMTItNEY4OC1BMzRCLUUyQjMyQTcwN0Q0MDwvc3RyaW5nPgorCQk8c3RyaW5nPjk4NDA2MkQzLUQ5MTctNDU1Mi05MkE5LUU1N0Y0QTNCQTk1NTwvc3RyaW5nPgorCQk8c3RyaW5nPkY3Q0E3RTc3LTVFMUUtNEQ1MS1CMzQ5LTk1RTAyNjAzMjFERTwvc3RyaW5nPgorCQk8c3RyaW5nPjZFQzk5NDhFLTBGOTItNDU5Qy1BRjlELTc4MkRBOUQ4MDgyOTwvc3RyaW5nPgorCQk8c3RyaW5nPkREQkVBRkJELThFNUEtNEMzNC04M0JELTJDNDYzNzAyNTUzOTwvc3RyaW5nPgorCQk8c3RyaW5nPkREQzBDNDZELTk2RkEtNDZGMC04NEMwLThFNzEyREUxRUI2QTwvc3RyaW5nPgorCQk8c3RyaW5nPkI5Mzk3MTY4LUM2RTQtNEIzMy05QjA3LUU0RTdDNzhCQjFGNTwvc3RyaW5nPgorCQk8c3RyaW5nPjJERTNEMkQwLUVFNjYtNEI1Ri04RUFELTMyRDg1ODVCOTYwNzwvc3RyaW5nPgorCQk8c3RyaW5nPkMzNDVFQkI5LUZFOEEtNDdFQi1BQTI2LTg0MkE2QTg3MjZBMzwvc3RyaW5nPgorCQk8c3RyaW5nPkJEOUYzQzQ5LTA4NjQtNEJGNi04NjI0LUUzRkUwNTlFQzRCMzwvc3RyaW5nPgorCQk8c3RyaW5nPjg5MTY1NjZBLTRGMTMtNDZDRC1CNzlDLTNDOTIxRUVFN0Q0OTwvc3RyaW5nPgorCQk8c3RyaW5nPjFGNjgwMDdBLUJDMUEtNEE0NS1CM0VCLTdDNTg1QTc0QzBDODwvc3RyaW5nPgorCQk8c3RyaW5nPkFFRDNFQ0I5LTZGNzItNDdCNS04M0VCLUQ5RUQzODFBQ0FENzwvc3RyaW5nPgorCQk8c3RyaW5nPjY1RjRDNkRELTk0REQtNDRBRC04RDhGLTIyQTU3OTdDRTNBRTwvc3RyaW5nPgorCQk8c3RyaW5nPklERVdvcmtzcGFjZURvY3VtZW50PC9zdHJpbmc+CisJCTxzdHJpbmc+OTQ1MjdERjQtOEE0QS00QjQ0LUE4NkYtOUUxNzc3NjQwMjBGPC9zdHJpbmc+CisJCTxzdHJpbmc+Nzg3NDk5REMtMTdDMy00QkI4LTk0RUQtRjVGNEEwRDkxMzQ1PC9zdHJpbmc+CisJCTxzdHJpbmc+MzZFMjBFOTktQzRCNS00NDA4LTk0NjktQUQzREJCMzE5QkUwPC9zdHJpbmc+CisJCTxzdHJpbmc+OTdDNEY2MjgtODhDMS00MUIxLTlBQzktREY3MjA0NUE2MTVCPC9zdHJpbmc+CisJCTxzdHJpbmc+MjI4Qjk4MzUtRUIwQy00N0M0LUFGMEMtNTYyQUU4MkIwMEREPC9zdHJpbmc+CisJCTxzdHJpbmc+MzhFOUMyODYtMkU3OC00OEY0LUJFNTUtN0YwODkxRkRCQjZBPC9zdHJpbmc+CisJCTxzdHJpbmc+NkFCQjNBRkQtRDU0OC00QkM3LTgxNTMtODEzNUQ0OTYyQUE2PC9zdHJpbmc+CisJCTxzdHJpbmc+NzNBMUQwMkYtNEVENi00Qzg5LTgyQTEtQUQzRENCNjg4QzAwPC9zdHJpbmc+CisJCTxzdHJpbmc+RkU3QjJGQ0YtRUYyRi00REVCLThERTItMzZBODY1QTI4MDNDPC9zdHJpbmc+CisJCTxzdHJpbmc+MUEyRTJBRTktN0I2My00MDdBLThBOEYtQjUxNDkwNTdDREQ3PC9zdHJpbmc+CisJCTxzdHJpbmc+RjQ3RTI2RTEtREUyOC00NTVGLTk4RUYtRUEzMzkzMjBBRDM2PC9zdHJpbmc+CisJCTxzdHJpbmc+OUI5M0I4QzgtMkM4My00OTlBLUFBNTctRTlBQjIxMEY1NEY1PC9zdHJpbmc+CisJCTxzdHJpbmc+ODI3QzhBNjktQTU2Ny00MTJCLUEyRjEtMUZDMTM1RUQ0MjMxPC9zdHJpbmc+CisJCTxzdHJpbmc+OTUyNUQ3MzQtQkIwMy00QjAyLUJGMEItMkI4MDdFQzNERjNCPC9zdHJpbmc+CisJCTxzdHJpbmc+RDAwNUM5NDktMDBCRC00ODNELThFRkMtRTI1MUZFOTdGQTJCPC9zdHJpbmc+CisJCTxzdHJpbmc+QzI1ODQwQjAtRUIwNS00MkE1LTg0QUMtODExQ0ZCOEM5NUZDPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXaW5kb3dUb29sYmFySXNWaXNpYmxlPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQWN0aXZlV29ya3NwYWNlVGFiQ29udHJvbGxlcjwvc3RyaW5nPgorCQk8c3RyaW5nPklERVdpbmRvd0ZyYW1lPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlV2luZG93Q29udHJvbGxlclVuaXF1ZUlkZW50aWZpZXI8L3N0cmluZz4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyX0NDN0FCQTlBLURFMkUtNEEzNS1CRTI1LTlGRkJFRkI1MUI5Njwvc3RyaW5nPgorCQk8c3RyaW5nPklERU9yZGVyZWRXb3Jrc3BhY2VUYWJDb250cm9sbGVyczwvc3RyaW5nPgorCQk8ZmFsc2UvPgorCQk8c3RyaW5nPnt7MTQyLCAzMzd9LCB7NjAwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVUYWJMYWJlbDwvc3RyaW5nPgorCQk8c3RyaW5nPkFzc2lzdGFudEVkaXRvcnNMYXlvdXQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVTaG93TmF2aWdhdG9yPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFU2hvd1V0aWxpdGllczwvc3RyaW5nPgorCQk8c3RyaW5nPklERUVkaXRvckFyZWE8L3N0cmluZz4KKwkJPHN0cmluZz5JREVOYXZpZ2F0b3JBcmVhPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlclV0aWxpdHlBcmVhU3BsaXRWaWV3PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlckRlc2lnbkFyZWFTcGxpdFZpZXc8L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5EZWZhdWx0UGVyc2lzdGVudFJlcHJlc2VudGF0aW9uczwvc3RyaW5nPgorCQk8c3RyaW5nPklERUVEaXRvckFyZWFfRGVidWdBcmVhPC9zdHJpbmc+CisJCTxzdHJpbmc+bGF5b3V0VHJlZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUVkaXRvck1vZGVfU3RhbmRhcmQ8L3N0cmluZz4KKwkJPHN0cmluZz5TaG93RGVidWdnZXJBcmVhPC9zdHJpbmc+CisJCTxzdHJpbmc+RWRpdG9yTW9kZTwvc3RyaW5nPgorCQk8c3RyaW5nPkRlYnVnZ2VyU3BsaXRWaWV3PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFU2hvd0VkaXRvcjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+TlNNdXRhYmxlRGljdGlvbmFyeTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNEaWN0aW9uYXJ5PC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU09iamVjdDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+JGNsYXNzbmFtZTwva2V5PgorCQkJPHN0cmluZz5OU011dGFibGVEaWN0aW9uYXJ5PC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVEZWJ1Z0FyZWFfU3BsaXRWaWV3PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFRGVidWdnZXJBcmVhU3BsaXRWaWV3PC9zdHJpbmc+CisJCTxzdHJpbmc+TGF5b3V0TW9kZTwvc3RyaW5nPgorCQk8c3RyaW5nPkxheW91dEZvY3VzTW9kZTwvc3RyaW5nPgorCQk8c3RyaW5nPnZhcmlhYmxlczwvc3RyaW5nPgorCQk8c3RyaW5nPmNvbnNvbGU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5EVlRTcGxpdFZpZXdJdGVtczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5EVlRJZGVudGlmaWVyPC9zdHJpbmc+CisJCTxzdHJpbmc+RFZUVmlld01hZ25pdHVkZTwvc3RyaW5nPgorCQk8c3RyaW5nPlZhcmlhYmxlc1ZpZXc8L3N0cmluZz4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPk5TRGljdGlvbmFyeTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+TlNEaWN0aW9uYXJ5PC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+Q29uc29sZUFyZWE8L3N0cmluZz4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPk5TTXV0YWJsZUFycmF5PC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU0FycmF5PC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU09iamVjdDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+JGNsYXNzbmFtZTwva2V5PgorCQkJPHN0cmluZz5OU011dGFibGVBcnJheTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5EQkdWYXJpYWJsZXNWaWV3RmlsdGVyTW9kZTwvc3RyaW5nPgorCQk8aW50ZWdlcj4yPC9pbnRlZ2VyPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5Db25zb2xlRmlsdGVyTW9kZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+WGNvZGUuSURFTmF2aWdhYmxlSXRlbURvbWFpbi5Xb3Jrc3BhY2VTdHJ1Y3R1cmU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5JREVBcmNoaXZhYmxlU3RyaW5nSW5kZXhQYWlyPC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU09iamVjdDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+JGNsYXNzbmFtZTwva2V5PgorCQkJPHN0cmluZz5JREVBcmNoaXZhYmxlU3RyaW5nSW5kZXhQYWlyPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+Q2xhc3Nlczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPk5TQXJyYXk8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPk5TQXJyYXk8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPk5TTXV0YWJsZVN0cmluZzwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNTdHJpbmc8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPk5TTXV0YWJsZVN0cmluZzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+RFZURG9jdW1lbnRMb2NhdGlvbjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+RFZURG9jdW1lbnRMb2NhdGlvbjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+SURFTmF2aWdhYmxlSXRlbUFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+SURFTmF2aWdhYmxlSXRlbUFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyTGF5b3V0VHJlZU5vZGU8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJMYXlvdXRUcmVlTm9kZTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlckxheW91dFRyZWU8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJMYXlvdXRUcmVlPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkVkaXRvckxheW91dF9QZXJzaXN0ZW50UmVwcmVzZW50YXRpb248L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1haW48L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RWRpdG9yTGF5b3V0X1N0YXRlU2F2aW5nU3RhdGVEaWN0aW9uYXJpZXM8L3N0cmluZz4KKwkJPHN0cmluZz5FZGl0b3JMYXlvdXRfU2VsZWN0ZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5FZGl0b3JMYXlvdXRfR2VvbWV0cnk8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RG9jdW1lbnRFeHRlbnNpb25JZGVudGlmaWVyPC9zdHJpbmc+CisJCTxzdHJpbmc+TmF2aWdhYmxlSXRlbU5hbWU8L3N0cmluZz4KKwkJPHN0cmluZz5FZGl0b3JTdGF0ZTwvc3RyaW5nPgorCQk8c3RyaW5nPkRvY3VtZW50TmF2aWdhYmxlSXRlbU5hbWU8L3N0cmluZz4KKwkJPHN0cmluZz5GaWxlRGF0YVR5cGU8L3N0cmluZz4KKwkJPHN0cmluZz5Eb2N1bWVudFVSTDwvc3RyaW5nPgorCQk8c3RyaW5nPkFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlLklERUtpdC5FZGl0b3JEb2N1bWVudC5Tb3VyY2VDb2RlPC9zdHJpbmc+CisJCTxzdHJpbmc+QGltcGxlbWVudGF0aW9uIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkhpZGVBbGxJc3N1ZXM8L3N0cmluZz4KKwkJPHN0cmluZz5QcmltYXJ5RG9jdW1lbnRUaW1lc3RhbXA8L3N0cmluZz4KKwkJPHN0cmluZz5QcmltYXJ5RG9jdW1lbnRWaXNpYmxlQ2hhcmFjdGVyUmFuZ2U8L3N0cmluZz4KKwkJPHN0cmluZz5QcmltYXJ5RG9jdW1lbnRTZWxlY3RlZENoYXJhY3RlclJhbmdlPC9zdHJpbmc+CisJCTxyZWFsPjMyNDQxNzY5OC4yMzQ2OTE5ODwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTk5Mn08L3N0cmluZz4KKwkJPHN0cmluZz57MTY5NywgMH08L3N0cmluZz4KKwkJPHN0cmluZz5wdWJsaWMub2JqZWN0aXZlLWMtc291cmNlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5OU1VSTDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+TlNVUkw8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHs2MDAsIDYwMH19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFRWRpdG9yPC9zdHJpbmc+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVEZWJ1Z2dlckFyZWE8L3N0cmluZz4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8dHJ1ZS8+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuTmF2aWdhdG9yLlN0cnVjdHVyZTwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlLklERUtpdC5OYXZpZ2F0b3IuSXNzdWVzPC9zdHJpbmc+CisJCTxzdHJpbmc+U2VsZWN0ZWROYXZpZ2F0b3I8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVNlbGVjdGVkT2JqZWN0czwvc3RyaW5nPgorCQk8c3RyaW5nPklERVVuc2F2ZWREb2N1bWVudEZpbHRlcmluZ0VuYWJsZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVTQ01TdGF0dXNGaWx0ZXJpbmdFbmFibGVkPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFUmVjZW50RG9jdW1lbnRGaWx0ZXJpbmdFbmFibGVkPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFVmlzaWJsZVJlY3Q8L3N0cmluZz4KKwkJPHN0cmluZz5JREVOYXZpZ2F0b3JFeHBhbmRlZEl0ZW1zQmVmb3JlRmlsdGVyaW5nU2V0PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFRXhwYW5kZWRJdGVtc1NldDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHsyNTksIDgzMn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+TlNTZXQ8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPk5TU2V0PC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFRXJyb3JGaWx0ZXJpbmdFbmFibGVkPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQ29sbGFwc2VkR3JvdXBzPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFRXhwYW5kZWRJc3N1ZXM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVDb2xsYXBzZWRGaWxlczwvc3RyaW5nPgorCQk8c3RyaW5nPklERVJlY2VudEZpbHRlcmluZ0VuYWJsZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVTaG93c0J5VHlwZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUNvbGxhcHNlZFR5cGVzPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFU2VsZWN0ZWROYXZpZ2FibGVzPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFU2NoZW1lRmlsdGVyaW5nRW5hYmxlZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPk5TTXV0YWJsZVNldDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNTZXQ8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPk5TTXV0YWJsZVNldDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezAsIDB9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+PC9zdHJpbmc+CisJCTxyZWFsPjM3NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjIzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjU4NjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45ODc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFVXRpbGl0aWVzQXJlYTwvc3RyaW5nPgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzFGMjRGOUUwLTk1MDgtNDdGQS05MTNGLTJEMzhFQzRCNDJGOTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MjA1LCAzNTl9LCB7NjAwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlNpbXBsZUNUUC5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIyNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5zaW1wbGVjVHJlZVBhcnNlcjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5leGFtcGxlczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RU9GPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTAwODEuNzE2MDgyOTk8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDEwMjN9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezU3NCwgMH08L3N0cmluZz4KKwkJPHN0cmluZz5wdWJsaWMuYy1oZWFkZXI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjczPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIyNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlhjb2RlLklERUtpdC5OYXZpZ2F0b3IuTG9nczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERUxvZ05hdmlnYXRvclZpc2libGVSZWN0U3RhdGVLZXk8L3N0cmluZz4KKwkJPHN0cmluZz5JREVMb2dOYXZpZ2F0b3JTZWxlY3RlZE9iamVjdHNTdGF0ZUtleTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUxvZ05hdmlnYXRvckV4cGFuZGVkSXRlbXNTdGF0ZUtleTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUxvZ05hdmlnYXRvclJlY2VudEZpbHRlclN0YXRlS2V5PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNzc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIyMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD40NTc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTExNjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfNjZENDVCRTYtQzBCNC00MUMzLUI3RjMtRDU0RDUyQ0JEQzQ4PC9zdHJpbmc+CisJCTxzdHJpbmc+e3sxNjMsIDMxNn0sIHs2MDAsIDY2OH19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+bWFpbi5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM0MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzQwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz50cmVlcGFyc2VyPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL21haW4ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNDM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5Mzk2Ny40MDcxNDE5ODwvcmVhbD4KKwkJPHN0cmluZz57MjE3LCAxNjEyfTwvc3RyaW5nPgorCQk8c3RyaW5nPnswLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL21haW4ubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnRyZWVyZXdyaXRlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5GcmFtZXdvcmtzPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM5OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjIzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjQ1NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTE2PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl83ODlGRTdGRi1DMzdCLTREQUUtODg2OS0zOUJGQjA3ODcyNzM8L3N0cmluZz4KKwkJPHN0cmluZz57ezIyNiwgMzM2fSwgezYwMCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5CdWlsZCBMTC1zdGFydDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40Mjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDI3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVOYXZpZ2FibGVJdGVtLldvcmtzcGFjZUxvZ3NEb21haW48L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QnVpbGQgTEwtc3RhcnQgOiAyOjIxOjQ5IFBNPC9zdHJpbmc+CisJCTxpbnRlZ2VyPjIxNDc0ODM2NDc8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly9DRjMzQUI3NC1BOUE4LTQzNDYtODk3OS0xM0U4OUU3MTU0QjU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuRWRpdG9yRG9jdW1lbnQuTG9nRG9jdW1lbnQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlNlbGVjdGVkRG9jdW1lbnRMb2NhdGlvbnM8L3N0cmluZz4KKwkJPHN0cmluZz5jb20uYXBwbGUuZHQuSURFLkJ1aWxkTG9nQ29udGVudFR5cGU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDI2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxpbnRlZ2VyPjIxNDc0ODM2NDc8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNzc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIyMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD40NTc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTExNjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV2luZG93VG9vbGJhcklzVmlzaWJsZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUFjdGl2ZVdvcmtzcGFjZVRhYkNvbnRyb2xsZXI8L3N0cmluZz4KKwkJPHN0cmluZz5JREVXaW5kb3dGcmFtZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVdpbmRvd0NvbnRyb2xsZXJVbmlxdWVJZGVudGlmaWVyPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl85NzZGOTkyQy02M0VCLTQ2MDMtODNFNC05OEQyOTQxRERCOUY8L3N0cmluZz4KKwkJPHN0cmluZz5JREVPcmRlcmVkV29ya3NwYWNlVGFiQ29udHJvbGxlcnM8L3N0cmluZz4KKwkJPHN0cmluZz57ezIwNSwgMjQyfSwgezExMjcsIDc2M319PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVUYWJMYWJlbDwvc3RyaW5nPgorCQk8c3RyaW5nPkFzc2lzdGFudEVkaXRvcnNMYXlvdXQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVTaG93TmF2aWdhdG9yPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFU2hvd1V0aWxpdGllczwvc3RyaW5nPgorCQk8c3RyaW5nPklERUVkaXRvckFyZWE8L3N0cmluZz4KKwkJPHN0cmluZz5JREVOYXZpZ2F0b3JBcmVhPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlclV0aWxpdHlBcmVhU3BsaXRWaWV3PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlckRlc2lnbkFyZWFTcGxpdFZpZXc8L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUlRyZWVSZXdyaXRlci5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RGVmYXVsdFBlcnNpc3RlbnRSZXByZXNlbnRhdGlvbnM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVFRGl0b3JBcmVhX0RlYnVnQXJlYTwvc3RyaW5nPgorCQk8c3RyaW5nPmxheW91dFRyZWU8L3N0cmluZz4KKwkJPHN0cmluZz5JREVFZGl0b3JNb2RlX1N0YW5kYXJkPC9zdHJpbmc+CisJCTxzdHJpbmc+U2hvd0RlYnVnZ2VyQXJlYTwvc3RyaW5nPgorCQk8c3RyaW5nPkVkaXRvck1vZGU8L3N0cmluZz4KKwkJPHN0cmluZz5EZWJ1Z2dlclNwbGl0Vmlldzwvc3RyaW5nPgorCQk8c3RyaW5nPklERVNob3dFZGl0b3I8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERURlYnVnQXJlYV9TcGxpdFZpZXc8L3N0cmluZz4KKwkJPHN0cmluZz5JREVEZWJ1Z2dlckFyZWFTcGxpdFZpZXc8L3N0cmluZz4KKwkJPHN0cmluZz5MYXlvdXRNb2RlPC9zdHJpbmc+CisJCTxzdHJpbmc+TGF5b3V0Rm9jdXNNb2RlPC9zdHJpbmc+CisJCTxzdHJpbmc+dmFyaWFibGVzPC9zdHJpbmc+CisJCTxzdHJpbmc+Y29uc29sZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RFZUU3BsaXRWaWV3SXRlbXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RFZUSWRlbnRpZmllcjwvc3RyaW5nPgorCQk8c3RyaW5nPkRWVFZpZXdNYWduaXR1ZGU8L3N0cmluZz4KKwkJPHN0cmluZz5WYXJpYWJsZXNWaWV3PC9zdHJpbmc+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkNvbnNvbGVBcmVhPC9zdHJpbmc+CisJCTxyZWFsPjgyODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjgyODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkRCR1ZhcmlhYmxlc1ZpZXdGaWx0ZXJNb2RlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkNvbnNvbGVGaWx0ZXJNb2RlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTI4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTQwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTI5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjU0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41Mzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVOYXZpZ2FibGVJdGVtRG9tYWluLldvcmtzcGFjZVN0cnVjdHVyZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUlRyZWVSZXdyaXRlci5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkNsYXNzZXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTM3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUmV3cml0ZXIubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41NDE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkVkaXRvckxheW91dF9QZXJzaXN0ZW50UmVwcmVzZW50YXRpb248L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1haW48L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RWRpdG9yTGF5b3V0X1N0YXRlU2F2aW5nU3RhdGVEaWN0aW9uYXJpZXM8L3N0cmluZz4KKwkJPHN0cmluZz5FZGl0b3JMYXlvdXRfU2VsZWN0ZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5FZGl0b3JMYXlvdXRfR2VvbWV0cnk8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk5hdmlnYWJsZUl0ZW1OYW1lPC9zdHJpbmc+CisJCTxzdHJpbmc+QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9zdHJpbmc+CisJCTxzdHJpbmc+RWRpdG9yU3RhdGU8L3N0cmluZz4KKwkJPHN0cmluZz5Eb2N1bWVudE5hdmlnYWJsZUl0ZW1OYW1lPC9zdHJpbmc+CisJCTxzdHJpbmc+RmlsZURhdGFUeXBlPC9zdHJpbmc+CisJCTxzdHJpbmc+RG9jdW1lbnRVUkw8L3N0cmluZz4KKwkJPHN0cmluZz5Eb2N1bWVudEV4dGVuc2lvbklkZW50aWZpZXI8L3N0cmluZz4KKwkJPHN0cmluZz4tYXBwbHlPbmNlOlJ1bGU6PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjU2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTM1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjU2NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlByaW1hcnlEb2N1bWVudFRpbWVzdGFtcDwvc3RyaW5nPgorCQk8c3RyaW5nPkhpZGVBbGxJc3N1ZXM8L3N0cmluZz4KKwkJPHN0cmluZz5QcmltYXJ5RG9jdW1lbnRWaXNpYmxlQ2hhcmFjdGVyUmFuZ2U8L3N0cmluZz4KKwkJPHN0cmluZz5QcmltYXJ5RG9jdW1lbnRTZWxlY3RlZENoYXJhY3RlclJhbmdlPC9zdHJpbmc+CisJCTxyZWFsPjMyNDQ0MTA1Ny41OTQ4OTY5NzwvcmVhbD4KKwkJPHN0cmluZz57MzQzMiwgMjAxMn08L3N0cmluZz4KKwkJPHN0cmluZz57NDg2MCwgMH08L3N0cmluZz4KKwkJPHN0cmluZz5wdWJsaWMub2JqZWN0aXZlLWMtc291cmNlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjU3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSZXdyaXRlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUuSURFS2l0LkVkaXRvckRvY3VtZW50LlNvdXJjZUNvZGU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7MTEyNywgNzE3fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVFZGl0b3I8L3N0cmluZz4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFRGVidWdnZXJBcmVhPC9zdHJpbmc+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlhjb2RlLklERUtpdC5OYXZpZ2F0b3IuU3RydWN0dXJlPC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUuSURFS2l0Lk5hdmlnYXRvci5Jc3N1ZXM8L3N0cmluZz4KKwkJPHN0cmluZz5TZWxlY3RlZE5hdmlnYXRvcjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFU2VsZWN0ZWRPYmplY3RzPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFVW5zYXZlZERvY3VtZW50RmlsdGVyaW5nRW5hYmxlZDwvc3RyaW5nPgorCQk8c3RyaW5nPklERVNDTVN0YXR1c0ZpbHRlcmluZ0VuYWJsZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVSZWNlbnREb2N1bWVudEZpbHRlcmluZ0VuYWJsZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVWaXNpYmxlUmVjdDwvc3RyaW5nPgorCQk8c3RyaW5nPklERU5hdmlnYXRvckV4cGFuZGVkSXRlbXNCZWZvcmVGaWx0ZXJpbmdTZXQ8L3N0cmluZz4KKwkJPHN0cmluZz5JREVFeHBhbmRlZEl0ZW1zU2V0PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezI1OSwgODMyfX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFRXJyb3JGaWx0ZXJpbmdFbmFibGVkPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQ29sbGFwc2VkR3JvdXBzPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFRXhwYW5kZWRJc3N1ZXM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVDb2xsYXBzZWRGaWxlczwvc3RyaW5nPgorCQk8c3RyaW5nPklERVZpc2libGVSZWN0PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFUmVjZW50RmlsdGVyaW5nRW5hYmxlZDwvc3RyaW5nPgorCQk8c3RyaW5nPklERVNob3dzQnlUeXBlPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQ29sbGFwc2VkVHlwZXM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVTZWxlY3RlZE5hdmlnYWJsZXM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVTY2hlbWVGaWx0ZXJpbmdFbmFibGVkPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezAsIDB9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+PC9zdHJpbmc+CisJCTxyZWFsPjUwNjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI2MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45ODI8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVVdGlsaXRpZXNBcmVhPC9zdHJpbmc+CisJCTxyZWFsPjM0MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9ERDkyMkY2My01OEU1LTQ0MjQtOTQ5My01RTgwNjg1NzBGMTM8L3N0cmluZz4KKwkJPHN0cmluZz57ezExOCwgLTE3OX0sIHsxNDAwLCA5NzR9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFJUcmVlLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFRWRpdG9yTW9kZV9HZW5pdXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMzMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD41NDk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzMwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjU0OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY3MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY2MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY2ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42Njg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjY2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjYyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42Njc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjY5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY2ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjI8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY3MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42NzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjgxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+bmF2aWdhYmxlSXRlbV9uYW1lPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFJUcmVlLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmlkZW50aWZpZXI8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuR2VuaXVzQ2F0ZWdvcnkuQ291bnRlcnBhcnRzPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42ODI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjY2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Njg5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5MTkxMjcuNDE0MTcxOTk8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDI2Njh9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE1MDUsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY5ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezg4MCwgODc2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlNwbGl0UG9zaXRpb248L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFsdGVybmF0ZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkBwcm90b2NvbCBBTlRMUlRyZWU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjY2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjY0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5MTkxMzAuMDc4OTA0OTk8L3JlYWw+CisJCTxzdHJpbmc+ezM4MiwgMTk1NX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Njk4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjgxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzkxOTEzMC4wNzkxNTY5OTwvcmVhbD4KKwkJPHN0cmluZz57ODI1LCAxNDIzfTwvc3RyaW5nPgorCQk8c3RyaW5nPnszMzMwLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWUubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezQzOSwgODc2fX08L3N0cmluZz4KKwkJPHJlYWw+MC41PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHsyNDQsIDgxMH19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjY1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjYwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjg4MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjYwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfRjVEMzI2QzAtMDRDNC00N0Y2LTg3NDEtMjBBNTY1ODk3Q0M4PC9zdHJpbmc+CisJCTxzdHJpbmc+e3sxNDAsIDM0OX0sIHsyNDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43ODY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjc4NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Nzg4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM4OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjY2MTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45MjE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzkzMkRDRDc2LTU3QkMtNEYzMi1CQjZGLTJDNUYyMDcyNEUwQTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODQ1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NDY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zODk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIxMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yNzc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+ODEwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxzdHJpbmc+e3sxNCwgMzU5fSwgezI0MCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9FMTcxMzE2MS1BMzkzLTQ1NDQtODg0NS00MDNBMjA0NUIyMzk8L3N0cmluZz4KKwkJPHN0cmluZz57ezE4LCAzODJ9LCB7NjAwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlNpbXBsZUNUUC5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTA5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg4ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz4tYXRvbTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjkyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTkxMjQ5LjkyOTc2NDk5PC9yZWFsPgorCQk8c3RyaW5nPnsyMTIxOSwgMTMyN308L3N0cmluZz4KKwkJPHN0cmluZz57NDA3MzEsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkzMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44ODg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjUxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7NjAwLCA1Nzh9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMjM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDU3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExMTY8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl85RTQ1RUE1Qy04MjExLTRDNjAtQjc2OS1FNTVEOTc0OTZCRjU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjk4NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjk5NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjk4NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45OTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTkyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTkzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL21haW4ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45OTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTkyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTAwMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzEzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5Mzg3NS4zMjQ4NTU5ODwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTUwNn08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTAxMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL21haW4ubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM3NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIyMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjQ1NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTExNjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyX0YzMzA4MERBLTYzNkUtNEJGNi1CNUMxLTI0QjQ5QjE3RTMzRDwvc3RyaW5nPgorCQk8c3RyaW5nPnt7MjY4LCAzODJ9LCB7MjQwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDY2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA2NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA2NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA2ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTA5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD44MTA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl8yMzU2RjVBQS0yRkQ4LTRFREUtQjc1NC1DQzIxOTRCQjEwMzg8L3N0cmluZz4KKwkJPHN0cmluZz57ezUwMCwgMjEwfSwgezExNDUsIDc2M319PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTExODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTExMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD41Njk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTExNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMxNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjU2OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTM3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEyODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTM3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTEzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEzNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTM2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTM4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTM1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0NDEwNTguNjQ2NTA3MDI8L3JlYWw+CisJCTxzdHJpbmc+ezQ3LCAyMDE3fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9hbnRscjMtbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHs4ODUsIDcxN319PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+WGNvZGUuSURFS2l0Lk5hdmlnYXRvci5CYXRjaEZpbmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVCYXRjaEZpbmROYXZpZ2F0b3JDb2xsYXBzZWRHcm91cHM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVCYXRjaEZpbmROYXZpZ2F0b3JGaW5kTW9kZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvclNlbGVjdGVkUm93SW5kZXhlczwvc3RyaW5nPgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvclJlcGxhY2VTdHJpbmc8L3N0cmluZz4KKwkJPHN0cmluZz5JREVCYXRjaEZpbmROYXZpZ2F0b3JTY3JvbGxQb3NpdGlvbjwvc3RyaW5nPgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvckZpbmRTdHJpbmc8L3N0cmluZz4KKwkJPHN0cmluZz5JREVCYXRjaEZpbmROYXZpZ2F0b3JTaG93c09wdGlvbnM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5OU011dGFibGVJbmRleFNldDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNJbmRleFNldDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+TlNNdXRhYmxlSW5kZXhTZXQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TTGVuZ3RoPC9rZXk+CisJCQk8aW50ZWdlcj4zPC9pbnRlZ2VyPgorCQkJPGtleT5OU0xvY2F0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4yMzwvaW50ZWdlcj4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+TlNJbmRleFNldDwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+TlNJbmRleFNldDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxpbnRlZ2VyPjI5NDwvaW50ZWdlcj4KKwkJPHN0cmluZz5BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHsxNjgsIDY1MX19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezI1OSwgODMyfX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjUwNjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI2MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+ODg1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfRjZENDczOTYtQjVBMS00M0RBLTg0NTktRkE2MUQ0Q0QxQ0E5PC9zdHJpbmc+CisJCTxzdHJpbmc+e3s5OCwgMzU5fSwgezI0MCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIyNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMjg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTIzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM4OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIxMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjY2MTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTIxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyX0NEQUQ5MDZBLUIzRkQtNERFOS05QjMyLUJBMEU2QTJEOTJEMjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI4NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI4NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI4NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjYxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45MjE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxzdHJpbmc+e3s3NywgMzgyfSwgezI0MCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfMEZFOTZCQjItOTRENi00NEY0LUIyRUItMTMyNDJERUQ3OTlDPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUlRlc3RzLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMzU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTM0NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMzU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEzNTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEzMjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTM1MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSVGVzdHM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMzU0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSVGVzdHMvQU5UTFJUZXN0cy5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEzNTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk3MDgwNC4zMjgwMzc5ODwvcmVhbD4KKwkJPHN0cmluZz57MCwgMzQ0fTwvc3RyaW5nPgorCQk8c3RyaW5nPnszNDQsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEzNjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL0FOVExSVGVzdHMubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMzUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTM2OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMzI3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEzNTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM3NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIyMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI2MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTMxMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl85RDZGMjIxNS1GNEZBLTQ2QjAtOTBDNC1DMDY3MURFMDk3NzA8L3N0cmluZz4KKwkJPHN0cmluZz57ezI0NywgMzM4fSwgezI0MCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTQyNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE0MjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE0MjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM4OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIxMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI3NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+ODEwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyX0RENEE3RDlGLTYzRTQtNDY3RS1BMEZELUM5NUE4NTkxRUFDNjwvc3RyaW5nPgorCQk8c3RyaW5nPnt7MjQ1LCAzMzh9LCB7MjQwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNDg1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTQ4NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTQ4NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTQ4NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuTmF2aWdhdG9yLkJhdGNoRmluZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvckNvbGxhcHNlZEdyb3Vwczwvc3RyaW5nPgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvckZpbmRNb2RlPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQmF0Y2hGaW5kTmF2aWdhdG9yU2VsZWN0ZWRSb3dJbmRleGVzPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQmF0Y2hGaW5kTmF2aWdhdG9yUmVwbGFjZVN0cmluZzwvc3RyaW5nPgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvclNjcm9sbFBvc2l0aW9uPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQmF0Y2hGaW5kTmF2aWdhdG9yRmluZFN0cmluZzwvc3RyaW5nPgorCQk8c3RyaW5nPklERUJhdGNoRmluZE5hdmlnYXRvclNob3dzT3B0aW9uczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmlkJmx0O0FOVExSQmFzZVRyZWUmZ3Q7PC9zdHJpbmc+CisJCTxzdHJpbmc+Y3JlYXRlVHJlZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjI5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45NTM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfQ0JBOTk0NjEtREFGNC00NTk0LTg0MzgtNEZCQ0ZDNkQyOUU3PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTUyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTUyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjI5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45NTM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxzdHJpbmc+e3s0NSwgMzM2fSwgezI0MCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9GNUI1MzFBOC1BNUY0LTQzNjAtOTM1MS0yNTlFMzc0NDg3QTI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTYwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE2MDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE2MDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE2MTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zODk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42MzA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjk1MjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPHN0cmluZz57ezE4MiwgMzU5fSwgezI0MCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTU4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl8wNjA2MjIzOC1BMzVGLTQzOTctQTJFQi0xMkJGMjEwODA4OTQ8L3N0cmluZz4KKwkJPHN0cmluZz57ezM1LCAzMzZ9LCB7MjQwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNjY2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTY2NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTY2NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTY2ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD44MTA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9BODYwNTEyNC1ERjY5LTQ2MjEtQjdFQi01MkIxMzdEQUI2RUQ8L3N0cmluZz4KKwkJPHN0cmluZz57ezIyNiwgMTQ5fSwgezE0NDMsIDgzM319PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD43MTc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjcyNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjcxNzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NzI1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3Mjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNzM3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTcyODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNzM3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3MzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNzI5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3MzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTM1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3MzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTczNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3Mzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz4tZ2V0U3RhcnQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTczNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3NDY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTczMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTc1MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0NDEwNTUuNjU3OTI2OTg8L3JlYWw+CisJCTxzdHJpbmc+ezc4LCAyMDE4fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxNzU5LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNzU2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9hbnRscjMtbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7MTQ0MywgNzg3fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7MjU5LCA4MzJ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NTc2PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjYwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45ODI8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM0MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9FODkxNzRDNy0yNTJCLTQ3NUQtOUEwMi1GNzE0Mjc5MTg0Mzk8L3N0cmluZz4KKwkJPHN0cmluZz57ezE4NCwgMzgyfSwgezYwMCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk5TT2JqZWN0Lmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODIyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODIyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlhjb2RlLklERU5hdmlnYWJsZUl0ZW1Eb21haW4uRnJhbWV3b3JrRmlsZVBhdGg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkZvdW5kYXRpb24uZnJhbWV3b3JrPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM3OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWFjT1NYMTAuNjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgyMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L0RldmVsb3Blci9TREtzL01hY09TWDEwLjYuc2RrL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcmsvVmVyc2lvbnMvQy9IZWFkZXJzL05TT2JqZWN0Lmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MTc4MzguMzg5NDkxOTg8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDkzNX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgzMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNi5zZGsvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yay9WZXJzaW9ucy9DL0hlYWRlcnMvTlNPYmplY3QuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODQwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNzk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgyMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjIzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NTg2PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45ODc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TGFzdENvbXBsZXRlZFBlcnNpc3RlbnRTY2hlbWVCYXNlZEFjdGl2aXR5UmVwb3J0PC9zdHJpbmc+CisJCTxzdHJpbmc+RG9jdW1lbnRXaW5kb3dzPC9zdHJpbmc+CisJCTxzdHJpbmc+RGVidWdnaW5nV2luZG93QmVoYXZpb3I8L3N0cmluZz4KKwkJPHN0cmluZz5BY3RpdmVSdW5EZXN0aW5hdGlvbjwvc3RyaW5nPgorCQk8c3RyaW5nPk1pbmlEZWJ1Z2dpbmdDb25zb2xlPC9zdHJpbmc+CisJCTxzdHJpbmc+RGVmYXVsdEVkaXRvckZyYW1lU2l6ZUZvclVSTHM8L3N0cmluZz4KKwkJPHN0cmluZz5SZWNlbnRFZGl0b3JEb2N1bWVudFVSTHM8L3N0cmluZz4KKwkJPHN0cmluZz5EZWZhdWx0RWRpdG9yU3RhdGVzRm9yVVJMczwvc3RyaW5nPgorCQk8c3RyaW5nPkFwcEZvY3VzSW5NaW5pRGVidWdnaW5nPC9zdHJpbmc+CisJCTxzdHJpbmc+QnJlYWtwb2ludHNBY3RpdmF0ZWQ8L3N0cmluZz4KKwkJPHN0cmluZz5BY3RpdmVTY2hlbWU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERUFjdGl2aXR5UmVwb3J0VGl0bGU8L3N0cmluZz4KKwkJPHN0cmluZz5JREVBY3Rpdml0eVJlcG9ydENvbXBsZXRpb25TdW1tYXJ5U3RyaW5nU2VnbWVudHM8L3N0cmluZz4KKwkJPHN0cmluZz5JREVBY3Rpdml0eVJlcG9ydE9wdGlvbnM8L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFQWN0aXZpdHlSZXBvcnRTdHJpbmdTZWdtZW50QmFja1NlcGFyYXRvcjwvc3RyaW5nPgorCQk8c3RyaW5nPklERUFjdGl2aXR5UmVwb3J0U3RyaW5nU2VnbWVudFByaW9yaXR5PC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQWN0aXZpdHlSZXBvcnRTdHJpbmdTZWdtZW50U3RyaW5nVmFsdWU8L3N0cmluZz4KKwkJPHN0cmluZz4gPC9zdHJpbmc+CisJCTxyZWFsPjI8L3JlYWw+CisJCTxzdHJpbmc+QnVpbGQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPjogPC9zdHJpbmc+CisJCTxyZWFsPjQ8L3JlYWw+CisJCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPiDilIIgPC9zdHJpbmc+CisJCTxyZWFsPjE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTkwNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuZGF0YTwva2V5PgorCQkJPGRhdGE+CisJCQlZbkJzYVhOME1ERFVBUUlEQkFVSVBUNVVKSFJ2Y0Zna2IySnFaV04wYzFna2RtVnljMmx2CisJCQlibGtrWVhKamFHbDJaWExSQmdkVWNtOXZkSUFCclFrS0VSSWNIUjRtSnkwek5qbFZKRzUxCisJCQliR3pUQ3d3TkRnOFFYRTVUUVhSMGNtbGlkWFJsYzFZa1kyeGhjM05ZVGxOVGRISnBibWVBCisJCQlBNEFNZ0FKWlUzVmpZMlZsWkdWazB4TVVEQlVZRzFwT1V5NXZZbXBsWTNSelYwNVRMbXRsCisJCQllWE9pRmhlQUJvQUpvaGthZ0FTQUJZQUxWazVUUm05dWRGZE9VME52Ykc5eTFCOGdEQ0VpCisJCQlJeVFsVms1VFUybDZaVlpPVTA1aGJXVllUbE5tUm14aFozTWpRQ1lBQUFBQUFBQ0FCNEFJCisJCQlFUTBRWHhBUlRIVmphV1JoUjNKaGJtUmxMVUp2YkdUU0tDa3FLMWdrWTJ4aGMzTmxjMW9rCisJCQlZMnhoYzNOdVlXMWxvaXNzVms1VFJtOXVkRmhPVTA5aWFtVmpkTk11THd3d01USlhUbE5YCisJCQlhR2wwWlZ4T1UwTnZiRzl5VTNCaFkyVkNNQUFRQTRBSzBpZ3BORFdpTlN4WFRsTkRiMnh2CisJCQljdElvS1RjNG9qZ3NYRTVUUkdsamRHbHZibUZ5ZWRJb0tUbzhvanNzWHhBU1RsTkJkSFJ5CisJCQlhV0oxZEdWa1UzUnlhVzVuWHhBU1RsTkJkSFJ5YVdKMWRHVmtVM1J5YVc1bkVnQUJocUJmCisJCQlFQTlPVTB0bGVXVmtRWEpqYUdsMlpYSUFDQUFSQUJZQUh3QW9BRElBTlFBNkFEd0FTZ0JRCisJCQlBRmNBWkFCckFIUUFkZ0I0QUhvQWhBQ0xBSllBbmdDaEFLTUFwUUNvQUtvQXJBQ3VBTFVBCisJCQl2UURHQU0wQTFBRGRBT1lBNkFEcUFPMEJBUUVHQVE4QkdnRWRBU1FCTFFFMEFUd0JTUUZNCisJCQlBVTRCVUFGVkFWZ0JZQUZsQVdnQmRRRjZBWDBCa2dHbkFhd0FBQUFBQUFBQ0FRQUFBQUFBCisJCQlBQUEvQUFBQUFBQUFBQUFBQUFBQUFBQUJ2Zz09CisJCQk8L2RhdGE+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzc2VzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5OU011dGFibGVEYXRhPC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU0RhdGE8L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPk5TTXV0YWJsZURhdGE8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFQWN0aXZpdHlSZXBvcnRTdHJpbmdTZWdtZW50RGF0ZVN0eWxlPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFQWN0aXZpdHlSZXBvcnRTdHJpbmdTZWdtZW50VHlwZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUFjdGl2aXR5UmVwb3J0U3RyaW5nU2VnbWVudFRpbWVTdHlsZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUFjdGl2aXR5UmVwb3J0U3RyaW5nU2VnbWVudERhdGU8L3N0cmluZz4KKwkJPHN0cmluZz5Ub2RheSBhdCA3OjI3IFBNPC9zdHJpbmc+CisJCTxyZWFsPjM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTkxMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMudGltZTwva2V5PgorCQkJPHJlYWw+MzI0NDQwODYzLjQ3MTQ0MDAyPC9yZWFsPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+TlNEYXRlPC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU09iamVjdDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+JGNsYXNzbmFtZTwva2V5PgorCQkJPHN0cmluZz5OU0RhdGU8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8aW50ZWdlcj4xMDY8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERURldmljZUxvY2F0aW9uPC9zdHJpbmc+CisJCTxzdHJpbmc+SURFRGV2aWNlQXJjaGl0ZWN0dXJlPC9zdHJpbmc+CisJCTxzdHJpbmc+ZHZ0ZGV2aWNlLWxvY2FsLWNvbXB1dGVyOmxvY2FsaG9zdDwvc3RyaW5nPgorCQk8c3RyaW5nPmkzODY8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTkyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vMENCQjlBQTktRTQyRi00MDBFLTlGMzQtMDUzMDIzQTRERDlBPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODMzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTI4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvU2ltcGxpZmllci5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTM2NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDExPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM2MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTkzNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNzM2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5Mzk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eUxleGVyLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWUuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41Mzk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5NDU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPndpZHRoPC9zdHJpbmc+CisJCTxzdHJpbmc+aGVpZ2h0PC9zdHJpbmc+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPHJlYWw+NTc4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz53aWR0aDwvc3RyaW5nPgorCQk8c3RyaW5nPmhlaWdodDwvc3RyaW5nPgorCQk8cmVhbD4xMDk1PC9yZWFsPgorCQk8cmVhbD43MjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTQ0MzwvcmVhbD4KKwkJPHJlYWw+Nzg3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxyZWFsPjYwMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExMjc8L3JlYWw+CisJCTxyZWFsPjcxNzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjAwPC9yZWFsPgorCQk8cmVhbD42MDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjg5OTwvcmVhbD4KKwkJPHJlYWw+ODU5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMDAzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly8xMjhEM0FDNS1GNEM2LTQ1MDgtOEJFQS1FMjZDRjczNzc2MTk8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAwNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAwOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vREY4NzFDNEYtMkE5MS00NzcwLUIxNjQtMTJGMkIyMkU3N0NCPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUmV3cml0ZXIubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMDEzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9hbnRscjMtbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMDE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9hbnRscjMtbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMTc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAxOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vQ0QwMzc2NkYtOEI1Ri00MTRELTg0QjQtQkVDQzU5RjE5MEY1PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFUXVpY2tMb29rRWRpdG9yLkVkaXRvcjwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlLlhjb2RlM1Byb2plY3RTdXBwb3J0LkVkaXRvckRvY3VtZW50Llhjb2RlM1Byb2plY3Q8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuRWRpdG9yRG9jdW1lbnQuRGVidWdnZXJMb2dEb2N1bWVudDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAyODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9MaWJyYXJ5L0RldmVsb3Blci9YY29kZS9EZXJpdmVkRGF0YS9BTlRMUi1hd2Z2cWZveWJqaWh1aWFveGxsbXdjZ3hxeG5tL0J1aWxkL1Byb2R1Y3RzL0RlYnVnL0Z1enp5PC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAzNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SURFUXVpY2tMb29rUGFnZU51bWJlcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAzMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvTGlicmFyeS9EZXZlbG9wZXIvWGNvZGUvRGVyaXZlZERhdGEvQU5UTFItYXdmdnFmb3liamlodWlhb3hsbG13Y2d4cXhubS9CdWlsZC9Qcm9kdWN0cy9EZWJ1Zy9GdXp6eTwvc3RyaW5nPgorCQk8cmVhbD4zMjM5OTY1ODUuMjkxNDcxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPklERVF1aWNrTG9va0RvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJCQk8c3RyaW5nPkRWVERvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPklERVF1aWNrTG9va0RvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjAzNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai88L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+WGNvZGUzUHJvamVjdEVkaXRvcl9YY29kZTNCdWlsZFBoYXNlc0VkaXRvcjwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlM1Byb2plY3RFZGl0b3JfWGNvZGUzSW5mb0VkaXRvcjwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlM1Byb2plY3RFZGl0b3JfWGNvZGUzUHJvamVjdEluZm9FZGl0b3I8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZTNQcm9qZWN0RWRpdG9yX1hjb2RlM0J1aWxkU2V0dGluZ3NFZGl0b3I8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZTNQcm9qZWN0RWRpdG9yX1hjb2RlM0J1aWxkUnVsZXNFZGl0b3I8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZTNQcm9qZWN0RWRpdG9yUHJldmlvdXNQcm9qZWN0RWRpdG9yQ2xhc3M8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZTNQcm9qZWN0RWRpdG9yLnNvdXJjZUxpc3Quc3BsaXR2aWV3PC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUzUHJvamVjdEVkaXRvclNlbGVjdGVkRG9jdW1lbnRMb2NhdGlvbnM8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZTNQcm9qZWN0RWRpdG9yUHJldmlvdXNUYXJnZXRFZGl0b3JDbGFzczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+MUFFNzIzMkMxMzRFODYwQjAwMUMzRjM1PC9zdHJpbmc+CisJCTxzdHJpbmc+a1hjb2RlM0J1aWxkUGhhc2VzRWRpdG9yU2Nyb2xsUG9pbnRLZXk8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMxNTEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMyODEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMyQjEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz5YY29kZTNCdWlsZFBoYXNlc0VkaXRvckRpc2Nsb3NlZE5hbWVzS2V5PC9zdHJpbmc+CisJCTxzdHJpbmc+MUFFNzIzMTMxMzRFODYwQjAwMUMzRjM1PC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUzQnVpbGRQaGFzZXNFZGl0b3JGaWx0ZXJLZXk8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMxNDEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMxNjEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMyQTEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPHN0cmluZz4xQUU3MjMyOTEzNEU4NjBCMDAxQzNGMzU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZTNIZWFkZXJzQnVpbGRQaGFzZURpc2Nsb3NlZEluZGV4ZXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0xlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+TlNMb2NhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TGluayBCaW5hcnkgV2l0aCBMaWJyYXJpZXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZTNQcm9qZWN0SW5mb0VkaXRvcjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzcxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMDg5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5zZWxlY3Rpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjA5MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwOTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2ovPC9zdHJpbmc+CisJCTxyZWFsPjMyNDM2NDIyNy44OTYxODU5OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RWRpdG9yPC9zdHJpbmc+CisJCTxzdHJpbmc+VGFyZ2V0PC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUzQnVpbGRTZXR0aW5nc0VkaXRvckxvY2F0aW9uczwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlM0J1aWxkU2V0dGluZ3NFZGl0b3I8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+WGNvZGUzQnVpbGRQcm9wZXJ0eU5hbWVEaXNwbGF5TW9kZTwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlM0J1aWxkUHJvcGVydHlWYWx1ZURpc3BsYXlNb2RlPC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUzQnVpbGRTZXR0aW5nc0VkaXRvckRpc3BsYXlNb2RlPC9zdHJpbmc+CisJCTxzdHJpbmc+U2VsZWN0ZWQgQnVpbGQgUHJvcGVydGllczwvc3RyaW5nPgorCQk8c3RyaW5nPkNvbGxhcHNlZCBCdWlsZCBQcm9wZXJ0eSBDYXRlZ29yaWVzPC9zdHJpbmc+CisJCTxzdHJpbmc+WGNvZGUzQnVpbGRTZXR0aW5nc0VkaXRvck1vZGU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjExMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjExNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjIzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFBcmNoaXRlY3R1cmVzfHxBRERJVElPTkFMX1NES1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFBcmNoaXRlY3R1cmVzfHxBUkNIUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUFyY2hpdGVjdHVyZXN8fE9OTFlfQUNUSVZFX0FSQ0g8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFBcmNoaXRlY3R1cmVzfHxTREtST09UPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQXJjaGl0ZWN0dXJlc3x8U1VQUE9SVEVEX1BMQVRGT1JNUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUFyY2hpdGVjdHVyZXN8fFZBTElEX0FSQ0hTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQnVpbGQgTG9jYXRpb25zfHxPQkpST09UPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQnVpbGQgTG9jYXRpb25zfHxTSEFSRURfUFJFQ09NUFNfRElSPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQnVpbGQgTG9jYXRpb25zfHxTWU1ST09UPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQnVpbGQgT3B0aW9uc3x8QlVJTERfVkFSSUFOVFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFCdWlsZCBPcHRpb25zfHxFTkFCTEVfT1BFTk1QX1NVUFBPUlQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFCdWlsZCBPcHRpb25zfHxHRU5FUkFURV9QUk9GSUxJTkdfQ09ERTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUJ1aWxkIE9wdGlvbnN8fFBSRUNPTVBTX0lOQ0xVREVfSEVBREVSU19GUk9NX0JVSUxUX1BST0RVQ1RTX0RJUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUJ1aWxkIE9wdGlvbnN8fFJVTl9DTEFOR19TVEFUSUNfQU5BTFlaRVI8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFCdWlsZCBPcHRpb25zfHxTQ0FOX0FMTF9TT1VSQ0VfRklMRVNfRk9SX0lOQ0xVREVTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQnVpbGQgT3B0aW9uc3x8VkFMSURBVEVfUFJPRFVDVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUNvZGUgU2lnbmluZ3x8Q09ERV9TSUdOX0VOVElUTEVNRU5UUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUNvZGUgU2lnbmluZ3x8Q09ERV9TSUdOX0lERU5USVRZPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQ29kZSBTaWduaW5nfHxDT0RFX1NJR05fUkVTT1VSQ0VfUlVMRVNfUEFUSDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUNvZGUgU2lnbmluZ3x8T1RIRVJfQ09ERV9TSUdOX0ZMQUdTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BQ29tcGlsZXIgVmVyc2lvbnx8R0NDX1ZFUlNJT048L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFEZXBsb3ltZW50fHxBTFRFUk5BVEVfR1JPVVA8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFEZXBsb3ltZW50fHxBTFRFUk5BVEVfTU9ERTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fEFMVEVSTkFURV9PV05FUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fEFMVEVSTkFURV9QRVJNSVNTSU9OU19GSUxFUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fENPTUJJTkVfSElEUElfSU1BR0VTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BRGVwbG95bWVudHx8REVQTE9ZTUVOVF9MT0NBVElPTjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fERFUExPWU1FTlRfUE9TVFBST0NFU1NJTkc8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFEZXBsb3ltZW50fHxEU1RST09UPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BRGVwbG95bWVudHx8SU5TVEFMTF9HUk9VUDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fElOU1RBTExfTU9ERV9GTEFHPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BRGVwbG95bWVudHx8SU5TVEFMTF9PV05FUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fElOU1RBTExfUEFUSDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fFNFUEFSQVRFX1NUUklQPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BRGVwbG95bWVudHx8U0tJUF9JTlNUQUxMPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BRGVwbG95bWVudHx8U1RSSVBGTEFHUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AURlcGxveW1lbnR8fFNUUklQX0lOU1RBTExFRF9QUk9EVUNUPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BRGVwbG95bWVudHx8U1RSSVBfU1RZTEU8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFLZXJuZWwgTW9kdWxlfHxNT0RVTEVfTkFNRTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUtlcm5lbCBNb2R1bGV8fE1PRFVMRV9TVEFSVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUtlcm5lbCBNb2R1bGV8fE1PRFVMRV9TVE9QPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BS2VybmVsIE1vZHVsZXx8TU9EVUxFX1ZFUlNJT048L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFMaW5raW5nfHxCVU5ETEVfTE9BREVSPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8REVBRF9DT0RFX1NUUklQUElORzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fERZTElCX0NPTVBBVElCSUxJVFlfVkVSU0lPTjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fERZTElCX0NVUlJFTlRfVkVSU0lPTjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fEVYUE9SVEVEX1NZTUJPTFNfRklMRTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fEdFTkVSQVRFX01BU1RFUl9PQkpFQ1RfRklMRTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fElOSVRfUk9VVElORTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fEtFRVBfUFJJVkFURV9FWFRFUk5TPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8TERfRFlMSUJfSU5TVEFMTF9OQU1FPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8TERfR0VORVJBVEVfTUFQX0ZJTEU8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFMaW5raW5nfHxMRF9PUEVOTVBfRkxBR1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFMaW5raW5nfHxMRF9SVU5QQVRIX1NFQVJDSF9QQVRIUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fExJTktFUl9ESVNQTEFZU19NQU5HTEVEX05BTUVTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8TElOS19XSVRIX1NUQU5EQVJEX0xJQlJBUklFUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fE1BQ0hfT19UWVBFPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8T1JERVJfRklMRTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fE9USEVSX0xERkxBR1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFMaW5raW5nfHxQUkVMSU5LX0ZMQUdTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8UFJFTElOS19MSUJTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8UFJFU0VSVkVfREVBRF9DT0RFX0lOSVRTX0FORF9URVJNUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fFNFQ1RPUkRFUl9GTEFHUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AUxpbmtpbmd8fFNFUEFSQVRFX1NZTUJPTF9FRElUPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8U1RBTkRBUkRfQ19QTFVTX1BMVVNfTElCUkFSWV9UWVBFPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BTGlua2luZ3x8VU5FWFBPUlRFRF9TWU1CT0xTX0ZJTEU8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFMaW5raW5nfHxXQVJOSU5HX0xERkxBR1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fEFQUExZX1JVTEVTX0lOX0NPUFlfRklMRVM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fENPUFlJTkdfUFJFU0VSVkVTX0hGU19EQVRBPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxFWEVDVVRBQkxFX0VYVEVOU0lPTjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVBhY2thZ2luZ3x8RVhFQ1VUQUJMRV9QUkVGSVg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fEZSQU1FV09SS19WRVJTSU9OPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxHRU5FUkFURV9QS0dJTkZPX0ZJTEU8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fElORk9QTElTVF9FWFBBTkRfQlVJTERfU0VUVElOR1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fElORk9QTElTVF9GSUxFPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxJTkZPUExJU1RfT1RIRVJfUFJFUFJPQ0VTU09SX0ZMQUdTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxJTkZPUExJU1RfT1VUUFVUX0ZPUk1BVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVBhY2thZ2luZ3x8SU5GT1BMSVNUX1BSRUZJWF9IRUFERVI8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fElORk9QTElTVF9QUkVQUk9DRVNTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxJTkZPUExJU1RfUFJFUFJPQ0VTU09SX0RFRklOSVRJT05TPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxQTElTVF9GSUxFX09VVFBVVF9GT1JNQVQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFQYWNrYWdpbmd8fFBSSVZBVEVfSEVBREVSU19GT0xERVJfUEFUSDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVBhY2thZ2luZ3x8UFJPRFVDVF9OQU1FPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BUGFja2FnaW5nfHxQVUJMSUNfSEVBREVSU19GT0xERVJfUEFUSDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVBhY2thZ2luZ3x8U1RSSU5HU19GSUxFX09VVFBVVF9FTkNPRElORzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVBhY2thZ2luZ3x8V1JBUFBFUl9FWFRFTlNJT048L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFTZWFyY2ggUGF0aHN8fEFMV0FZU19TRUFSQ0hfVVNFUl9QQVRIUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVNlYXJjaCBQYXRoc3x8RVhDTFVERURfUkVDVVJTSVZFX1NFQVJDSF9QQVRIX1NVQkRJUkVDVE9SSUVTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BU2VhcmNoIFBhdGhzfHxGUkFNRVdPUktfU0VBUkNIX1BBVEhTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BU2VhcmNoIFBhdGhzfHxIRUFERVJfU0VBUkNIX1BBVEhTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BU2VhcmNoIFBhdGhzfHxJTkNMVURFRF9SRUNVUlNJVkVfU0VBUkNIX1BBVEhfU1VCRElSRUNUT1JJRVM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFTZWFyY2ggUGF0aHN8fExJQlJBUllfU0VBUkNIX1BBVEhTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BU2VhcmNoIFBhdGhzfHxSRVpfU0VBUkNIX1BBVEhTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BU2VhcmNoIFBhdGhzfHxVU0VSX0hFQURFUl9TRUFSQ0hfUEFUSFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFVbml0IFRlc3Rpbmd8fE9USEVSX1RFU1RfRkxBR1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFVbml0IFRlc3Rpbmd8fFRFU1RfQUZURVJfQlVJTEQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFVbml0IFRlc3Rpbmd8fFRFU1RfSE9TVDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVVuaXQgVGVzdGluZ3x8VEVTVF9SSUc8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFWZXJzaW9uaW5nfHxDVVJSRU5UX1BST0pFQ1RfVkVSU0lPTjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVZlcnNpb25pbmd8fFZFUlNJT05JTkdfU1lTVEVNPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz4BVmVyc2lvbmluZ3x8VkVSU0lPTl9JTkZPX0JVSUxERVI8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFWZXJzaW9uaW5nfHxWRVJTSU9OX0lORk9fRVhQT1JUX0RFQ0w8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFWZXJzaW9uaW5nfHxWRVJTSU9OX0lORk9fRklMRTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+AVZlcnNpb25pbmd8fFZFUlNJT05fSU5GT19QUkVGSVg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPgFWZXJzaW9uaW5nfHxWRVJTSU9OX0lORk9fU1VGRklYPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIENvZGUgR2VuZXJhdGlvbnx8R0NDX0RZTkFNSUNfTk9fUElDPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIENvZGUgR2VuZXJhdGlvbnx8R0NDX0VOQUJMRV9LRVJORUxfREVWRUxPUE1FTlQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gQ29kZSBHZW5lcmF0aW9ufHxHQ0NfRU5BQkxFX09CSkNfR0M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gQ29kZSBHZW5lcmF0aW9ufHxHQ0NfRU5BQkxFX1NTRTNfRVhURU5TSU9OUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19FTkFCTEVfU1NFNDFfRVhURU5TSU9OUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19FTkFCTEVfU1NFNDJfRVhURU5TSU9OUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19FTkFCTEVfU1VQUExFTUVOVEFMX1NTRTNfSU5TVFJVQ1RJT05TPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIENvZGUgR2VuZXJhdGlvbnx8R0NDX0ZBU1RfTUFUSDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19GQVNUX09CSkNfRElTUEFUQ0g8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gQ29kZSBHZW5lcmF0aW9ufHxHQ0NfR0VORVJBVEVfREVCVUdHSU5HX1NZTUJPTFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gQ29kZSBHZW5lcmF0aW9ufHxHQ0NfSU5MSU5FU19BUkVfUFJJVkFURV9FWFRFUk48L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gQ29kZSBHZW5lcmF0aW9ufHxHQ0NfTk9fQ09NTU9OX0JMT0NLUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19SRVVTRV9TVFJJTkdTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIENvZGUgR2VuZXJhdGlvbnx8R0NDX1NUUklDVF9BTElBU0lORzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19TWU1CT0xTX1BSSVZBVEVfRVhURVJOPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIENvZGUgR2VuZXJhdGlvbnx8R0NDX1RIUkVBRFNBRkVfU1RBVElDUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBDb2RlIEdlbmVyYXRpb258fEdDQ19VTlJPTExfTE9PUFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gQ29kZSBHZW5lcmF0aW9ufHxMTFZNX0xUTzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBMYW5ndWFnZXx8R0NDX0NIQVJfSVNfVU5TSUdORURfQ0hBUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBMYW5ndWFnZXx8R0NDX0NXX0FTTV9TWU5UQVg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19DX0xBTkdVQUdFX1NUQU5EQVJEPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX0FTTV9LRVlXT1JEPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX0JVSUxUSU5fRlVOQ1RJT05TPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX0NQUF9FWENFUFRJT05TPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX0NQUF9SVFRJPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX0ZMT0FUSU5HX1BPSU5UX0xJQlJBUllfQ0FMTFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19FTkFCTEVfT0JKQ19FWENFUFRJT05TPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX1BBU0NBTF9TVFJJTkdTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfRU5BQkxFX1RSSUdSQVBIUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBMYW5ndWFnZXx8R0NDX0ZPUkNFX0NQVV9TVUJUWVBFX0FMTDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBMYW5ndWFnZXx8R0NDX0lOQ1JFQVNFX1BSRUNPTVBJTEVEX0hFQURFUl9TSEFSSU5HPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfSU5QVVRfRklMRVRZUEU8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19MSU5LX1dJVEhfRFlOQU1JQ19MSUJSQVJJRVM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19QUkVDT01QSUxFX1BSRUZJWF9IRUFERVI8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19QUkVGSVhfSEVBREVSPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIExhbmd1YWdlfHxHQ0NfU0hPUlRfRU5VTVM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19VU0VfSU5ESVJFQ1RfRlVOQ1RJT05fQ0FMTFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19VU0VfUkVHSVNURVJfRlVOQ1RJT05fQ0FMTFM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fEdDQ19VU0VfU1RBTkRBUkRfSU5DTFVERV9TRUFSQ0hJTkc8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gTGFuZ3VhZ2V8fE9USEVSX0NGTEFHUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBMYW5ndWFnZXx8T1RIRVJfQ1BMVVNQTFVTRkxBR1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gUHJlcHJvY2Vzc2luZ3x8R0NDX1BSRVBST0NFU1NPUl9ERUZJTklUSU9OU19OT1RfVVNFRF9JTl9QUkVDT01QUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1RSRUFUX0lNUExJQ0lUX0ZVTkNUSU9OX0RFQ0xBUkFUSU9OU19BU19FUlJPUlM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOXzY0X1RPXzMyX0JJVF9DT05WRVJTSU9OPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9BQk9VVF9ERVBSRUNBVEVEX0ZVTkNUSU9OUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fQUJPVVRfSU5WQUxJRF9PRkZTRVRPRl9NQUNSTzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fQUJPVVRfTUlTU0lOR19GSUVMRF9JTklUSUFMSVpFUlM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX0FCT1VUX01JU1NJTkdfTkVXTElORTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fQUJPVVRfTUlTU0lOR19QUk9UT1RZUEVTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9BQk9VVF9QT0lOVEVSX1NJR05FRE5FU1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX0FCT1VUX1JFVFVSTl9UWVBFPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9BTExPV19JTkNPTVBMRVRFX1BST1RPQ09MPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9DSEVDS19TV0lUQ0hfU1RBVEVNRU5UUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fRk9VUl9DSEFSQUNURVJfQ09OU1RBTlRTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9ISURERU5fVklSVFVBTF9GVU5DVElPTlM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX0lOSElCSVRfQUxMX1dBUk5JTkdTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9JTklUSUFMSVpFUl9OT1RfRlVMTFlfQlJBQ0tFVEVEPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9NSVNTSU5HX1BBUkVOVEhFU0VTPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9NVUxUSVBMRV9ERUZJTklUSU9OX1RZUEVTX0ZPUl9TRUxFQ1RPUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fTk9OX1ZJUlRVQUxfREVTVFJVQ1RPUjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fUEVEQU5USUM8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1NIQURPVzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fU0lHTl9DT01QQVJFPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9TVFJJQ1RfU0VMRUNUT1JfTUFUQ0g8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1RZUEVDSEVDS19DQUxMU19UT19QUklOVEY8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1VOREVDTEFSRURfU0VMRUNUT1I8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1VOSU5JVElBTElaRURfQVVUT1M8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1VOS05PV05fUFJBR01BUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fVU5VU0VEX0ZVTkNUSU9OPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxHQ0NfV0FSTl9VTlVTRURfTEFCRUw8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1VOVVNFRF9QQVJBTUVURVI8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPkxMVk0gY29tcGlsZXIgMi4wIC0gV2FybmluZ3N8fEdDQ19XQVJOX1VOVVNFRF9WQUxVRTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+TExWTSBjb21waWxlciAyLjAgLSBXYXJuaW5nc3x8R0NDX1dBUk5fVU5VU0VEX1ZBUklBQkxFPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5MTFZNIGNvbXBpbGVyIDIuMCAtIFdhcm5pbmdzfHxXQVJOSU5HX0NGTEFHUzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+WGNvZGUzUHJvamVjdERvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJCQk8c3RyaW5nPkRWVERvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPlhjb2RlM1Byb2plY3REb2N1bWVudExvY2F0aW9uPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMjk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIyOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjMzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMzk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjM5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIzOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI0OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNDk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjQ5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjczNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMjkwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9NYWluLmphdmE8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMjkyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC42LnNkay9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0ZvdW5kYXRpb24uZnJhbWV3b3JrL1ZlcnNpb25zL0MvSGVhZGVycy9OU0FwcGxlU2NyaXB0Lmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMjk0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvU2ltcGxpZmllci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjI5NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMjk4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvUG9seUxleGVyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzAwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nTGV4ZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjMwNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUl0ZXJhdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzA2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlbi5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjMwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VUcmVlLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvUG9seVBhcnNlci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjMxMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWUuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWUubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZUxleGVyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZUxleGVyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC92YXIvZm9sZGVycy9nNy9nNy1tQmFxajJSYUpVVStGNzFEMFNVKysrVEkvLVRtcC0vb2JqY19tc2dTZW5kX2Rpc2Fzc2VtYmx5XzB4OTg4MWRlZGIubmFzbTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyU3RhdGUuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9pbnB1dDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMjg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL2lucHV0PC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjMzMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9pbnB1dDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzMzI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzM0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlbi5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjMzNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzM4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvU2ltcGxpZmllci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM0MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmFzdFF1ZXVlLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzQyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9tYWluLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzQ0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvbWFpbi5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM0NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL21haW4ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzNDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxvb2thaGVhZFN0cmVhbS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM1MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvbWFpbi5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM1MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL21haW4ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzNTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eUxleGVyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzU2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL21haW4ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzNTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9tYWluLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvbWFpbi5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM2MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvbWFpbi5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM2NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM2NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZU1hcEVsZW1lbnQubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzNjg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzcwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzNzI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyQnVmZmVyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlTGV4ZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzNzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRvdWJsZUtleU1hcC5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM4MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZU5vZGVTdHJlYW0uaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzODI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzg0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGVQYXJzZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzODY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM4ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM5MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIzOTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzk0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMzk2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnB1dFN0cmVhbS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjM5ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MDA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWUuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlB0clN0YWNrLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDA0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MDY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdG9rZW4vQU5UTFJDb21tb25Ub2tlblRlc3QubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bnRpbWVFeGNlcHRpb24uaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlVHJlZS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQxNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuaXF1ZUlETWFwLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVZpc2l0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVdpemFyZC5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQyNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNXYWxrZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0Mjg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVQYXJzZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9MTC1zdGFyL1NpbXBsZUNQYXJzZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0MzI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDM0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVFBhcnNlci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQzNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNi5zZGsvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Gb3VuZGF0aW9uLmZyYW1ld29yay9WZXJzaW9ucy9DL0hlYWRlcnMvTlNPYmplY3QuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0Mzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWUuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NDA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvc2V0cy9BTlRMUkJpdFNldFRlc3QubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bnRpbWVFeGNlcHRpb24ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDQ2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ0ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTm9kZU1hcEVsZW1lbnQuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VSZWNvZ25pemVyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDUyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nUGFyc2VyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDU0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC42LnNkay9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0ZvdW5kYXRpb24uZnJhbWV3b3JrL1ZlcnNpb25zL0MvSGVhZGVycy9OU1N0cmluZy5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ1NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJld3JpdGVyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDU4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJTdGFjay5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ2MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ2MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDY0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDY4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMb29rYWhlYWRTdHJlYW0uaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0NzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRGQS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ3MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVdpemFyZC5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0R1bXBEZWNsLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9hbnRscjMtbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0Nzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0ODA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0ODI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1hcC5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ4NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ4NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyQnVmZmVyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDg4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nUGFyc2VyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDkwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUmV3cml0ZXIuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ5MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0R1bXBEZWNsLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNDk1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjQ5NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI0OTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9MTC1zdGFyL1NpbXBsZUNMZXhlci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjUwMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNMZXhlci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MjUwMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTA1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMZXhlclN0YXRlLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVExleGVyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTA5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlU3RhY2suaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTQxOTYuNDcxNjg0OTk8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDY5NH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQwOTg2Ni45MjgxMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjUyM308L3N0cmluZz4KKwkJPHN0cmluZz57MTkwNCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MjI2NS43MDM0Mjc5NzwvcmVhbD4KKwkJPHN0cmluZz57MTU2NDMsIDcyNX08L3N0cmluZz4KKwkJPHN0cmluZz57MTYzNjQsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MzE2ODguNTA1ODI5OTk8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDI5MjN9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE2NjEsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5MjAuMzM2MDI1PC9yZWFsPgorCQk8c3RyaW5nPnswLCA5NTF9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezI0NywgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5ODk3Ny4zOTQ0MDEwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTM5M308L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDAwNDcyLjA3MjI2NTAzPC9yZWFsPgorCQk8c3RyaW5nPnswLCAzMTg5fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE2NjQwLjQyNTQwMDAyPC9yZWFsPgorCQk8c3RyaW5nPnszMjcyLCAxNTgxfTwvc3RyaW5nPgorCQk8c3RyaW5nPns0NjYyLCAyMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQyOTczMi42NjY2MDMwMzwvcmVhbD4KKwkJPHN0cmluZz57MzI2NywgMjE4OH08L3N0cmluZz4KKwkJPHN0cmluZz57MzI1OCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQyNjY2Ny45NDc1NzU5OTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjYzOH08L3N0cmluZz4KKwkJPHN0cmluZz57MjA4NCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MTkyNS42NjQzNjIwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgNzM3fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMyNzczLjkyMzI0Njk4PC9yZWFsPgorCQk8c3RyaW5nPnsyODcxLCAxOTM3fTwvc3RyaW5nPgorCQk8c3RyaW5nPnszNzMzLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE4Nzc1LjIxMzg4Nzk5PC9yZWFsPgorCQk8c3RyaW5nPns4MjUsIDE2NjR9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezMzNjQsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5NTguOTM0Mzg3MDM8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDk0N308L3N0cmluZz4KKwkJPHN0cmluZz57MjQzLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTU0MzUuMjY5ODI3MDE8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDkwNH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTYzODY4LjIzNzAxOTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTQ0NX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxNDE3Ni4yNzM5MjM5OTwvcmVhbD4KKwkJPHN0cmluZz57MTEyOTEsIDE1NDV9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezEyODAyLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDAxNTQ0Ljg2MTI3MTAyPC9yZWFsPgorCQk8c3RyaW5nPnswLCAyMjU5fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxODgzLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTM4MDQuNTYwODQ5MDE8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDExOH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTk0MjU1LjgxOTc5Mjk5PC9yZWFsPgorCQk8c3RyaW5nPnswLCA3fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTU4MDkuNDg5NjQ3OTg8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDk3fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDM3Nzk4LjIxNjczPC9yZWFsPgorCQk8c3RyaW5nPnszNTUzLCAyMjY4fTwvc3RyaW5nPgorCQk8c3RyaW5nPnszODY4LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMyOTM4LjY5NzU3NDk3PC9yZWFsPgorCQk8c3RyaW5nPnszOTQsIDIxOTF9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezkyOTIsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0NDA0NTYuOTgwMzg3OTk8L3JlYWw+CisJCTxzdHJpbmc+ezI4NjksIDE2Nzl9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezM3MTYsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MzYyOTcuNTc4OTQ1OTk8L3JlYWw+CisJCTxzdHJpbmc+ezQwOTQsIDI1ODF9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezQ5NTcsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5MzUuOTM0ODAwMDM8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDkwMn08L3N0cmluZz4KKwkJPHN0cmluZz57MjUzLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDEyNzY1LjY4NDE3Nzk5PC9yZWFsPgorCQk8c3RyaW5nPnsyNTU1LCAxMjYwfTwvc3RyaW5nPgorCQk8c3RyaW5nPnszMjkwLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTk3NzczLjIyOTU1MTAyPC9yZWFsPgorCQk8c3RyaW5nPnswLCAxMDk4fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxOTAsIDIzOX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5NzYzMy41ODAxNjc8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDEwNzR9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezIwMCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5ODA5OC44MDE2MjUwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTY5MX08L3N0cmluZz4KKwkJPHN0cmluZz57MzkwLCAyNDl9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MTMxMjguNjU0NTYyPC9yZWFsPgorCQk8c3RyaW5nPnszLCAyMjc4fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxODg3LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTk4MjI5LjQxNzY1NjwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjAwMn08L3N0cmluZz4KKwkJPHN0cmluZz57OTYwLCAyNDJ9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5ODI3Mi4yOTUwOTE5OTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTI4OX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MzQ0NC44NTcyNTI8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDEwMzZ9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTc4NzkuNjc1NjA2MDE8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDExMDl9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE5NywgMjM4fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTY1OTcuNzMzNjg1OTc8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDc0OH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5NzU2NC4wODkyNTA5ODwvcmVhbD4KKwkJPHN0cmluZz57MCwgOTU1fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyMTEsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5Nzc0MC40MTMyODAwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgNjMxfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5NTYuNTE4ODkwOTg8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDgyMX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE0Nzc2LjE0MzM3MjwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjIyMX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQzMTUxMS40MjQ5Nzg5NzwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjQ1NH08L3N0cmluZz4KKwkJPHN0cmluZz57MjI0NiwgMTF9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MDA2MDcuMjU0ODQzPC9yZWFsPgorCQk8c3RyaW5nPnsxMjgzLCAyMTgyfTwvc3RyaW5nPgorCQk8c3RyaW5nPns2MjYxLCAxfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDM2Mjc0LjI2MTY5OTAyPC9yZWFsPgorCQk8c3RyaW5nPns3MjM4LCAyMDM4fTwvc3RyaW5nPgorCQk8c3RyaW5nPns4NDMxLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE3NzM2Ljc4OTc2NTwvcmVhbD4KKwkJPHN0cmluZz57NTcwOCwgMTU0Nn08L3N0cmluZz4KKwkJPHN0cmluZz57NjMyMSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjU2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5NTc4MS41MjAxMzgwMzwvcmVhbD4KKwkJPHN0cmluZz57MCwgOTA5fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE3NjQ1LjI0MTQ0NTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTI4OH08L3N0cmluZz4KKwkJPHN0cmluZz57MTI3LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMxNjU4Ljg5NjI1Mjk5PC9yZWFsPgorCQk8c3RyaW5nPnswLCAyMTc0fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxODE3LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTk4NzE3LjAwOTcxNjk5PC9yZWFsPgorCQk8c3RyaW5nPns0NjQ5MSwgMjgxMn08L3N0cmluZz4KKwkJPHN0cmluZz57MjQwNjQsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5NjAuOTIyMzEyOTc8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDg0OX08L3N0cmluZz4KKwkJPHN0cmluZz57MjU0LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjY5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTU0NDcuMDI3NTg4MDE8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDE5NX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMyMDA5LjgzOTEyMjwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjQxOX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQyMjYzNi44MTQ4MDE5OTwvcmVhbD4KKwkJPHN0cmluZz57NDU3OCwgMTc0OH08L3N0cmluZz4KKwkJPHN0cmluZz57NTg1OCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTkzNzk4LjQ5MzEyMTk4PC9yZWFsPgorCQk8c3RyaW5nPnswLCAyMzN9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQzNjcyOC42NDQ0NjgwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTY4MX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzkxNzY5My4yNzM1ODI5OTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTgzN308L3N0cmluZz4KKwkJPHN0cmluZz57MTgzNiwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDIyNDA3LjA1MTAxOTAxPC9yZWFsPgorCQk8c3RyaW5nPnswLCAyNTYzfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDI2MTU1LjM4MDMyMTk4PC9yZWFsPgorCQk8c3RyaW5nPnsyMzc2LCAyMDI2fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxNTgyLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE3MTAyLjMwMjcyNjk4PC9yZWFsPgorCQk8c3RyaW5nPnswLCAxMTU4fTwvc3RyaW5nPgorCQk8c3RyaW5nPns1NDMsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjcyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzkxNjIyOC4yMjA2MDI5OTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMzQ2OX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjczMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk2Mzg1OS44MjY0NDg5ODwvcmVhbD4KKwkJPHN0cmluZz57MjgzNCwgMTQwMX08L3N0cmluZz4KKwkJPHN0cmluZz57Mzc1OCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjczNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQwOTk0OC43NjczMDUwMjwvcmVhbD4KKwkJPHN0cmluZz57MTE4MSwgMTQ1NH08L3N0cmluZz4KKwkJPHN0cmluZz57MjMyNSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE2NTUxLjM4ODM1NTAyPC9yZWFsPgorCQk8c3RyaW5nPnswLCAyNzMwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDI2NDE4LjY4NjIyMjk3PC9yZWFsPgorCQk8c3RyaW5nPnswLCAyMzQzfTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxOTMxLCAxM308L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxMjczNS4zMTE2ODAwMjwvcmVhbD4KKwkJPHN0cmluZz57MTM1OSwgMTgyOH08L3N0cmluZz4KKwkJPHN0cmluZz57Mjg1MiwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxNDE4NS45OTc2NjcwMTwvcmVhbD4KKwkJPHN0cmluZz57MjYxNiwgMTMxMX08L3N0cmluZz4KKwkJPHN0cmluZz57MzY1NiwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQ0MDM3MC42MzkxODQ8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDIwMjN9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE3NTIsIDgzfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDM3Nzk4LjIxOTUxMzwvcmVhbD4KKwkJPHN0cmluZz57OTA1OSwgMjg3Mn08L3N0cmluZz4KKwkJPHN0cmluZz57OTE2NCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQzMTc2NS45MDc0ODM5OTwvcmVhbD4KKwkJPHN0cmluZz57MTQ5MiwgMjAwOH08L3N0cmluZz4KKwkJPHN0cmluZz57Mjg3NSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5NjUzNS43NTg3OTM8L3JlYWw+CisJCTxzdHJpbmc+ezM4MCwgMjA0M308L3N0cmluZz4KKwkJPHN0cmluZz57MjM2NywgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQzNjg2NC45MjcxNTE5ODwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTY4NH08L3N0cmluZz4KKwkJPHN0cmluZz57NDkzNiwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MTg4My4wOTE4MDU5OTwvcmVhbD4KKwkJPHN0cmluZz57MCwgNzc1fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyNTYsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5NDcuODQxNTM0MDI8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDc1NX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MTk0MC44NTk3ODkwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgODk1fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyNTAsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTE5NDkuNzQ1ODM1MDE8L3JlYWw+CisJCTxzdHJpbmc+ezIzOSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MzQ0Mi44Njg0NjUwMTwvcmVhbD4KKwkJPHN0cmluZz57NTg0LCAxNjY2fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyMzMsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxNzg3My41NjgyNDE8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDEyNTV9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MjU0MTMuNDM3MDIyOTg8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDMyODN9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE3MzksIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjc5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk2ODAwNi42OTg1ODQwMjwvcmVhbD4KKwkJPHN0cmluZz57MCwgOTIzfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMxODI5Ljc0OTY1PC9yZWFsPgorCQk8c3RyaW5nPns1NTQwLCAxMzk2fTwvc3RyaW5nPgorCQk8c3RyaW5nPns2NjYyLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDM3NDAxLjc0MTI5MDk5PC9yZWFsPgorCQk8c3RyaW5nPnswLCAzMzQ2fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxNzk3LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDIxNDM1LjAyNDA3MzwvcmVhbD4KKwkJPHN0cmluZz57MTAyLCAyODYxfTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxOTMsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MjYzOTQuOTY4NzQ4OTk8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDIxNDZ9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE2MzksIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MzY2MDYuOTMwMDkxOTg8L3JlYWw+CisJCTxzdHJpbmc+ezM2ODcsIDE4NzR9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezQ3MjIsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTkwNzEuNTY0MjIxOTg8L3JlYWw+CisJCTxzdHJpbmc+ezEyOTMyLCAxMTcxfTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxMzk4MSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5NTg0OC44NDk0NTEwMTwvcmVhbD4KKwkJPHN0cmluZz57MjE5NjUsIDE3NTd9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezIyODk2LCA5NX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxNTU5My43Mzc1MDkwMTwvcmVhbD4KKwkJPHN0cmluZz57NTQzOSwgMTg3NH08L3N0cmluZz4KKwkJPHN0cmluZz57NzA2NCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE3MTE3LjI0MjMyMjAzPC9yZWFsPgorCQk8c3RyaW5nPnsyNDA5LCAxMjU5fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjgzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDEwMDA2LjI5NTU4ODAyPC9yZWFsPgorCQk8c3RyaW5nPnsxOTQwLCAyMTgyfTwvc3RyaW5nPgorCQk8c3RyaW5nPnszMDgwLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDQwODkwLjM0MzA1Mjk4PC9yZWFsPgorCQk8c3RyaW5nPnszNDMyLCAyMDEyfTwvc3RyaW5nPgorCQk8c3RyaW5nPns0ODYwLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDQwODkwLjM0MzE5MTk4PC9yZWFsPgorCQk8c3RyaW5nPns3OCwgMjAxOH08L3N0cmluZz4KKwkJPHN0cmluZz57MTc1OSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzkxNzgzMC4xNDE3MzU5NzwvcmVhbD4KKwkJPHN0cmluZz57NjI0MCwgMjUxMn08L3N0cmluZz4KKwkJPHN0cmluZz57NzI5NywgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMxNjk0LjM2OTc2MzAyPC9yZWFsPgorCQk8c3RyaW5nPnswLCAyNjc4fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDMxOTk1LjAwOTU3NTAxPC9yZWFsPgorCQk8c3RyaW5nPnszOTc5LCAxOTMxfTwvc3RyaW5nPgorCQk8c3RyaW5nPns0MTQ3LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDEzMDkyLjkwNzY3MTk5PC9yZWFsPgorCQk8c3RyaW5nPnszNDEsIDI2ODB9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezIzMDUsIDM0fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0Mzk5MjkzLjgzMDMzODwvcmVhbD4KKwkJPHN0cmluZz57NjQ4MywgMTg5NH08L3N0cmluZz4KKwkJPHN0cmluZz57NzYyMSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQyMjk0MC4yMjU2MzMwMzwvcmVhbD4KKwkJPHN0cmluZz57MzAzOCwgMjgzMH08L3N0cmluZz4KKwkJPHN0cmluZz57NTQ5NCwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5ODk3Mi44NDk0MTM5OTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTcxNn08L3N0cmluZz4KKwkJPHN0cmluZz57MjM2LCAxOX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQ0MDgzOC4zNDk4OTEwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTg0MH08L3N0cmluZz4KKwkJPHN0cmluZz57MTYwMSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE2NzQyLjkxMzg5NjAyPC9yZWFsPgorCQk8c3RyaW5nPnswLCAzMDcxfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTU3OTguNjg4ODY8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDU4N308L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQyNjM2Ny4wNjIwNjY5NzwvcmVhbD4KKwkJPHN0cmluZz57NzM5LCAxNzQ0fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsxNjM0LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE5NjY1LjYxODcxMjAxPC9yZWFsPgorCQk8c3RyaW5nPnsyMjUzLCAxNzc3fTwvc3RyaW5nPgorCQk8c3RyaW5nPnszMDY2LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTE3NzQ2LjAzNjUyMTAyPC9yZWFsPgorCQk8c3RyaW5nPnsxMjY5LCAxOTgxfTwvc3RyaW5nPgorCQk8c3RyaW5nPnszMTMzLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTk5MDI3LjA3MTAwNjwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTExM308L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxNTYzOC4zOTMzNjk5NzwvcmVhbD4KKwkJPHN0cmluZz57NTI0LCAyODE0fTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyOTg4LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0NDEwNTguNjQyOTgzMDI8L3JlYWw+CisJCTxzdHJpbmc+ezQ3LCAyMDE3fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTk5MzM1LjM1MjM5MjAyPC9yZWFsPgorCQk8c3RyaW5nPnsyMDE3LCAyMDU4fTwvc3RyaW5nPgorCQk8c3RyaW5nPnszNDgyLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDM3ODMyLjI1MDc0MjAyPC9yZWFsPgorCQk8c3RyaW5nPnsxOTUxLCAyNTExfTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyMTAwLCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDIxNjAzLjU4MDM5NDAzPC9yZWFsPgorCQk8c3RyaW5nPnsyNDEzLCAyMTI2fTwvc3RyaW5nPgorCQk8c3RyaW5nPnszMDc1LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTkxOTM4Ljc0MjU2NzwvcmVhbD4KKwkJPHN0cmluZz57MCwgOTA1fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTkxOTUxLjQ2Nzc5NTAxPC9yZWFsPgorCQk8c3RyaW5nPnswLCA5MjB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MDI4NTQuMjEwNTAyOTg8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDIyMjJ9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezU1OSwgMH08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQwMDY3My4yOTI1OTE5OTwvcmVhbD4KKwkJPHN0cmluZz57MTgxMywgOTQxfTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyMDk5LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNzg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzIzOTkxOTYyLjg0Mjc5MTk3PC9yZWFsPgorCQk8c3RyaW5nPnswLCA5MjR9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQwMDQ2MS44OTEwNTgwMzwvcmVhbD4KKwkJPHN0cmluZz57MCwgMjM4Mn08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45MjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTEyMDIuNTI3ODE4OTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MjIwMTguNzM3MTE5MDI8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDI4OTN9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezE2MzIsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTQ1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly9ENzdFQjY0Ri1EOTZFLTRFRTEtOUFENS1DMkU4Q0M2MDc4RDE8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk0NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vRjVFRjJDRUEtM0E2RS00Q0UwLTg4RjEtQ0QzNjk1OEExQThFPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovLzRDM0M3RjIzLUY3NjMtNEVEMi1BOUQxLTJENTBFQUIyODlGNDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTUxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly8yQ0NBM0ExQS0wOTRBLTRDMkQtOEMwNC1CREIwMjdGQ0I2REE8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+REJHQ29uc29sZUxvZ0VkaXRvclNjcm9sbFJhbmdlPC9zdHJpbmc+CisJCTxzdHJpbmc+ezc5MTMsIDQ1OTl9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnswLCAyMjI3fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57NzQ1LCAyMTU2fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57MTE0MzYsIDEzNTF9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovL0NGNUZGNDcwLTRGNEEtNDE4NC05NkIzLTVCMkY4QjREQURGRjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovL0YxMjg4M0M2LTFGOTAtNEE2OC1BN0IyLUE4NEE5N0E0NDRGRjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTY4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly9DNTZENjAwNi04RDA0LTRFMDUtODA1Ni1FMUIwRUFFMzcwRUM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk3MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vMzVGQjgyRkEtNzYxMC00OEY1LUFBOEYtNDQ0RUI0OUMwMzJFPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NzI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovLzg2ODExOTI2LTM5NzEtNDZENC1BMERELTJBNjc5OEM4Qjg1Rjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly9GMDYyQzAxMS1GMTgwLTREMjgtODkzNi03Njk4MDFFQTI3MzA8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vMEM0NTM4QjgtQzVCQy00RDMyLUFFQzctQkM3MDNFQTA4NTY4PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5Nzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovLzRCMTczMkUwLTRCOTYtNDAxNS05NEY5LUMxNjdCQkFBRTg5RDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTgwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+eC14Y29kZS1sb2c6Ly85MzVBRjFBQS02OTgyLTQ3QUItQjY3OS0xM0E5RDRGOTNDRTY8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+U2VsZWN0ZWREb2N1bWVudExvY2F0aW9uczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMDE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5leHBhbmRUcmFuc2NyaXB0PC9rZXk+CisJCQk8ZmFsc2UvPgorCQkJPGtleT5pbmRleFBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk4ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTkwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0luZGV4UGF0aERhdGE8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk4OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNJbmRleFBhdGhMZW5ndGg8L2tleT4KKwkJCTxpbnRlZ2VyPjM8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTA0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5kYXRhPC9rZXk+CisJCQk8ZGF0YT4KKwkJCUFGRUcKKwkJCTwvZGF0YT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzZXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPk5TSW5kZXhQYXRoPC9zdHJpbmc+CisJCQkJPHN0cmluZz5OU09iamVjdDwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+JGNsYXNzbmFtZTwva2V5PgorCQkJPHN0cmluZz5OU0luZGV4UGF0aDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+SURFTG9nRG9jdW1lbnRMb2NhdGlvbjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+RFZURG9jdW1lbnRMb2NhdGlvbjwvc3RyaW5nPgorCQkJCTxzdHJpbmc+TlNPYmplY3Q8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PiRjbGFzc25hbWU8L2tleT4KKwkJCTxzdHJpbmc+SURFTG9nRG9jdW1lbnRMb2NhdGlvbjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmV4cGFuZFRyYW5zY3JpcHQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PmluZGV4UGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTk2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TSW5kZXhQYXRoRGF0YTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTk3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0luZGV4UGF0aExlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmRhdGE8L2tleT4KKwkJCTxkYXRhPgorCQkJQVFFPQorCQkJPC9kYXRhPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5Njg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmV4cGFuZFRyYW5zY3JpcHQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PmluZGV4UGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDAxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TSW5kZXhQYXRoRGF0YTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDAyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0luZGV4UGF0aExlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmRhdGE8L2tleT4KKwkJCTxkYXRhPgorCQkJQUFJPQorCQkJPC9kYXRhPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk5MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk3MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZXhwYW5kVHJhbnNjcmlwdDwva2V5PgorCQkJPGZhbHNlLz4KKwkJCTxrZXk+aW5kZXhQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mjk5MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNJbmRleFBhdGhEYXRhPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwMDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TSW5kZXhQYXRoTGVuZ3RoPC9rZXk+CisJCQk8aW50ZWdlcj4yPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTkwNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuZGF0YTwva2V5PgorCQkJPGRhdGE+CisJCQlBTDhCCisJCQk8L2RhdGE+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmV4cGFuZFRyYW5zY3JpcHQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PmluZGV4UGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TSW5kZXhQYXRoRGF0YTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDEzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0luZGV4UGF0aExlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MzwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmRhdGE8L2tleT4KKwkJCTxkYXRhPgorCQkJQUN3QQorCQkJPC9kYXRhPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmV4cGFuZFRyYW5zY3JpcHQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PmluZGV4UGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDE3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TSW5kZXhQYXRoRGF0YTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0luZGV4UGF0aExlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmRhdGE8L2tleT4KKwkJCTxkYXRhPgorCQkJQUFBPQorCQkJPC9kYXRhPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5NzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmV4cGFuZFRyYW5zY3JpcHQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PmluZGV4UGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDIyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TSW5kZXhQYXRoRGF0YTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0luZGV4UGF0aExlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MzwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmRhdGE8L2tleT4KKwkJCTxkYXRhPgorCQkJQVFNQQorCQkJPC9kYXRhPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI5Nzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmV4cGFuZFRyYW5zY3JpcHQ8L2tleT4KKwkJCTxmYWxzZS8+CisJCQk8a2V5PmluZGV4UGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yOTk2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERU5hbWVTdHJpbmc8L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9GMThBRkNBQS0wQjA2LTRBNEEtQjNBMy0xNzJCQjZGRTNGRjA8L3N0cmluZz4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzBFMzAwMDE1LUY1NUMtNDBCQS05RDc0LTZGMDk2QjNCODAxNjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzA5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD40NTk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwOTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDU5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzA1NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwNjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwNjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzA2MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwNTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzAzNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDYzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwNjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDcwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwMzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDM2NjA1LjMzNjg2Njk3PC9yZWFsPgorCQk8c3RyaW5nPns2NTgxLCAxMzYwfTwvc3RyaW5nPgorCQk8c3RyaW5nPnszOTA1LCAwfTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuYmFzZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5yZWxhdGl2ZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMDc5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+LWNvcHlOb2RlOjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7NzY5LCA5MjV9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjcwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzAzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz4tbmV3VHJlZVdpdGhUb2tlblR5cGU6PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MTIwMDguMDUxNTE4OTg8L3JlYWw+CisJCTxzdHJpbmc+ezE2MDgsIDE0Mzd9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezIxNDYsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwNzk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzA5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMwOTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzAzNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTAwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHsxMjM5LCA4OTF9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzExMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz4tY3JlYXRlVHJlZTo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzExMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxMjAwOC4wNTE4MzcwMzwvcmVhbD4KKwkJPHN0cmluZz57Mjg3MiwgMjQ0OH08L3N0cmluZz4KKwkJPHN0cmluZz57MTc3MCwgMTR9PC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFJUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxMTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzEyMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzExODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTExPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPm1hbnVhbERvbWFpbklkZW50aWZpZXI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuR2VuaXVzQ2F0ZWdvcnkuTWFudWFsPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezcyNywgODkxfX08L3N0cmluZz4KKwkJPHJlYWw+MC40MTI0MjkzOTIzMzc3OTkwNzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5EZWJ1Z2dlcktpdC5UaHJlYWRzU3RhY2tzTmF2aWdhdG9yPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7NDU2LCA4NDd9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+c2NvcGVzPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+aW52YWxpZE5vZGU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+aG9pc3RlZFByZWRpY2F0ZXM8L3N0cmluZz4KKwkJPHN0cmluZz5MTC1zdGFydDwvc3RyaW5nPgorCQk8c3RyaW5nPmxleGVydGVzdC1zaW1wbGU8L3N0cmluZz4KKwkJPHN0cmluZz5GdXp6eTwvc3RyaW5nPgorCQk8c3RyaW5nPnBvbHlkaWZmPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+dHlwZTwvc3RyaW5nPgorCQk8c3RyaW5nPnN1Ymlzc3Vlczwvc3RyaW5nPgorCQk8c3RyaW5nPnNob3J0TWVzc2FnZTwvc3RyaW5nPgorCQk8c3RyaW5nPmZ1bGxNZXNzYWdlPC9zdHJpbmc+CisJCTxzdHJpbmc+ZG9jdW1lbnRMb2NhdGlvbnM8L3N0cmluZz4KKwkJPHN0cmluZz5TZW1hbnRpYyBJc3N1ZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlVuY2F0ZWdvcml6ZWQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg6Mjg6PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3Nlczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+RFZUVGV4dERvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJCQk8c3RyaW5nPkRWVERvY3VtZW50TG9jYXRpb248L3N0cmluZz4KKwkJCQk8c3RyaW5nPk5TT2JqZWN0PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT4kY2xhc3NuYW1lPC9rZXk+CisJCQk8c3RyaW5nPkRWVFRleHREb2N1bWVudExvY2F0aW9uPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQmFzZVRyZWVBZGFwdG9yLm06Mjc6PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxODA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVjbGFyZWQgaGVyZSBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTg2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlY2xhcmVkIGhlcmU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5SZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdBTlRMUlRyZWVBZGFwdG9yJzwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTk0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgaW4gcHJvdG9jb2wgbm90IGltcGxlbWVudGVkPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxOTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0ubToyODo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNzwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyMDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRva2VuU3RyZWFtLm08L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+UHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjE2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oPC9zdHJpbmc+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPHN0cmluZz5QcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIyMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxzdHJpbmc+Q29uZmxpY3RpbmcgcGFyYW1ldGVyIHR5cGVzIGluIGltcGxlbWVudGF0aW9uIG9mICdpbml0V2l0aFRva2VuU291cmNlOkNoYW5uZWw6JzogJ05TVUludGVnZXInPC9zdHJpbmc+CisJCTxzdHJpbmc+Q29uZmxpY3RpbmcgcGFyYW1ldGVyIHR5cGVzIGluIGltcGxlbWVudGF0aW9uIG9mICdpbml0V2l0aFRva2VuU291cmNlOkNoYW5uZWw6JzogJ05TVUludGVnZXInIChha2EgJ3Vuc2lnbmVkIGludCcpIHZzICdOU0ludGVnZXInIChha2EgJ2ludCcpPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjA4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43MjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjcyPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIyNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj44MjwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NzI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43MjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyMjk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjA4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIzODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIxNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyNDM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIxNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyNDY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjQ4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyMDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjcyPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NzI8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzIwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NzI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43MjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5MZXhpY2FsIG9yIFByZXByb2Nlc3NvciBJc3N1ZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNQYXJzZXIubTo0Njo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzI2MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+J0FOVExSL0FOVExSLmgnIGZpbGUgbm90IGZvdW5kIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1BhcnNlci5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyNjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+ODwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjg8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPidBTlRMUi9BTlRMUi5oJyBmaWxlIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjc3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyODI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzI4NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zODwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mzg8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzI5MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyOTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyOTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQmFzZVRyZWUubToyODo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNzwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLm08L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+UHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5NDE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzMTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMxODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxzdHJpbmc+Q29uZmxpY3RpbmcgcGFyYW1ldGVyIHR5cGVzIGluIGltcGxlbWVudGF0aW9uIG9mICdkZWxldGVDaGlsZDonOiAnTlNVSW50ZWdlcic8L3N0cmluZz4KKwkJPHN0cmluZz5Db25mbGljdGluZyBwYXJhbWV0ZXIgdHlwZXMgaW4gaW1wbGVtZW50YXRpb24gb2YgJ2RlbGV0ZUNoaWxkOic6ICdOU1VJbnRlZ2VyJyAoYWthICd1bnNpZ25lZCBpbnQnKSB2cyAnTlNJbnRlZ2VyJyAoYWthICdpbnQnKTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yOTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMyNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzMzNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNzwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzM5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mzg8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluY29tcGxldGUgaW1wbGVtZW50YXRpb248L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzI5NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnaW5pdCcgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mzg8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdjb3B5V2l0aFpvbmU6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj40MDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZW1wdHlOb2RlJyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZXJyb3JOb2RlOkZyb206VG86RXhjZXB0aW9uOicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2lzTmlsOicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2R1cFRyZWU6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZHVwVHJlZTpQYXJlbnQ6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZHVwTm9kZTonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzOTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdhZGRDaGlsZDp0b1RyZWU6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnYmVjb21lUm9vdDpvbGQ6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA1PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA1PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdydWxlUG9zdFByb2Nlc3Npbmc6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA4PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA4PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdiZWNvbWVSb290ZnJvbVRva2VuOm9sZDonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2NyZWF0ZVRyZWU6RnJvbVRva2VuOicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjExMjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjExMjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnY3JlYXRlVHJlZTpGcm9tVG9rZW46VGV4dDonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2NyZWF0ZVRyZWU6VGV4dDonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2dldFR5cGU6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdzZXRUeXBlOlR5cGU6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdnZXRUZXh0Oicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyMjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyMjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnc2V0VGV4dDpUZXh0Oicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0Q2hpbGQ6QXQ6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdzZXRDaGlsZDpBdDpDaGlsZDonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2RlbGV0ZUNoaWxkOkluZGV4Oicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0Q2hpbGRDb3VudDonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2dldFVuaXF1ZUlEOicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEzNDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEzNDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0VW5pcXVlSUQnIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNDQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNDQ8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2NyZWF0ZVRva2VuOlRleHQ6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzM2MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTYwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTYwPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdjcmVhdGVUb2tlbjonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMzYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ25ld0VtcHR5VHJlZScgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMzNjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjM2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMyOTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JbiBmaWxlIGluY2x1ZGVkIGZyb20gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9BTlRMUkxleGVyU3RhdGUubToyNzo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyU3RhdGUubTwvc3RyaW5nPgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2dldFRva2VuVHlwZScgbm90IGZvdW5kIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMZXhlclN0YXRlLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUxNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zODwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mzg8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTE2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMZXhlclN0YXRlLmg8L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0VG9rZW5UeXBlJyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUxNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zODwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mzg8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1Mjc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdnZXRDaGFubmVsJyBub3QgZm91bmQgaW4gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyU3RhdGUuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQxPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj40MTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MzM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0Q2hhbm5lbCcgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUzNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTQ0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0VG9rZW5TdGFydExpbmUnIG5vdCBmb3VuZCBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJTdGF0ZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzU1MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdnZXRUb2tlblN0YXJ0TGluZScgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzU1NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTYxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0VG9rZW5DaGFyUG9zaXRpb25JbkxpbmUnIG5vdCBmb3VuZCBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJTdGF0ZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzU2NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdnZXRUb2tlbkNoYXJQb3NpdGlvbkluTGluZScgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzU3MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTc4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0VG9rZW5TdGFydENoYXJJbmRleCcgbm90IGZvdW5kIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMZXhlclN0YXRlLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUxNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTg0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2dldFRva2VuU3RhcnRDaGFySW5kZXgnIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1ODg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNTA4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzU5NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5NZXRob2QgZGVmaW5pdGlvbiBmb3IgJ2dldFRleHQnIG5vdCBmb3VuZCBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJTdGF0ZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM1MTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzYwMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdnZXRUZXh0JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUxNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjA1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzUwODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjk8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yOTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzYxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnZ2V0VW5pcXVlSUQnIG5vdCBmb3VuZCBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzYyMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNDQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjE0NDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM2MjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JbiBmaWxlIGluY2x1ZGVkIGZyb20gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9leGFtcGxlcy9jb21iaW5lZC9hbnRscjMuaDo1OTo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzY0ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM2NDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9hbnRscjMuaDwvc3RyaW5nPgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JbiBmaWxlIGluY2x1ZGVkIGZyb20gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZExleGVyLmg6Nzo8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzY1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjU2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWRMZXhlci5oPC9zdHJpbmc+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL2V4YW1wbGVzL2NvbWJpbmVkL21haW4ubToyOjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjYyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM2NjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9tYWluLm08L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RHVwbGljYXRlIHByb3RvY29sIGRlZmluaXRpb24gb2YgJ0FOVExSSW50U3RyZWFtJyBpcyBpZ25vcmVkIGluIC9Vc2Vycy9hY29uZGl0L0xpYnJhcnkvRGV2ZWxvcGVyL1hjb2RlL0Rlcml2ZWREYXRhL0FOVExSLWF3ZnZxZm95YmppaHVpYW94bGxtd2NneHF4bm0vQnVpbGQvUHJvZHVjdHMvRGVidWcvQU5UTFIuZnJhbWV3b3JrL0hlYWRlcnMvQU5UTFJJbnRTdHJlYW0uaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjY5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzY3MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSSW50U3RyZWFtLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzY3NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnRTdHJlYW0uaDwvc3RyaW5nPgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxzdHJpbmc+RHVwbGljYXRlIHByb3RvY29sIGRlZmluaXRpb24gb2YgJ0FOVExSSW50U3RyZWFtJyBpcyBpZ25vcmVkPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM2Njk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNjgwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2OTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzczMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzY5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzcyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzczMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzczNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzQ5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjk2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzIxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tOjMxOjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNzUwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZSBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM3NTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNzU5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkNvbmZsaWN0aW5nIHBhcmFtZXRlciB0eXBlcyBpbiBpbXBsZW1lbnRhdGlvbiBvZiAnZ2V0Tm9kZTonOiAnTlNJbnRlZ2VyJyAoYWthICdpbnQnKSB2cyAnTlNVSW50ZWdlcicgKGFrYSAndW5zaWduZWQgaW50Jyk8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM3NjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM3NjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM3NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzc3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNzgxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM3OTc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjk2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM4MTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+UGFzc2luZyBhcmd1bWVudCB0byBwYXJhbWV0ZXIgJ25vZGUnIGhlcmU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA2PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlNlbmRpbmcgJ2lkJmx0O0FOVExSVHJlZSZndDsnIHRvIHBhcmFtZXRlciBvZiBpbmNvbXBhdGlibGUgdHlwZSAnaWQmbHQ7QU5UTFJCYXNlVHJlZSZndDsnPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yMDIxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzgzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzI5NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JbiBmaWxlIGluY2x1ZGVkIGZyb20gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5tOjI4Ojwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zODQ5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAndG9TdHJpbmdGcm9tTm9kZTp0b05vZGU6JyBub3QgZm91bmQgaW4gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM4NTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+OTI8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjkyPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzg1NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg8L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAndG9TdHJpbmdGcm9tTm9kZTp0b05vZGU6JyBub3QgZm91bmQ8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzg1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj45MjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+OTI8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zODYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxyZWFsPjAuMDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMzPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SW4gZmlsZSBpbmNsdWRlZCBmcm9tIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvLi4vQU5UTFJSdW50aW1lRXhjZXB0aW9uLm06MzI6PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM4Nzg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zODc5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdW50aW1lRXhjZXB0aW9uLm08L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdpbml0V2l0aE5hbWU6cmVhc29uOnVzZXJJbmZvOicgbm90IGZvdW5kIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzg4NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj45NzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+OTc8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zODg2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg8L3N0cmluZz4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnaW5pdFdpdGhOYW1lOnJlYXNvbjp1c2VySW5mbzonIG5vdCBmb3VuZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zODg1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjk3PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj45NzwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM4OTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHJlYWw+MC4wPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zODc4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjIzMjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjMyPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzg5MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8cmVhbD4wLjA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5QcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM5MDE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+OTM8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjkzPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIG1ldGhvZCAnY3JlYXRlVHJlZTp0ZXh0Oic8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzkwNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSVGVzdHMvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uVHJlZVRlc3QubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oPC9zdHJpbmc+CisJCTxzdHJpbmc+cG9seWRpZmYvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3BvbHlkaWZmL1BvbHlQcmludGVyLm08L3N0cmluZz4KKwkJPHN0cmluZz5zaW1wbGVjVHJlZVBhcnNlci9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ0xleGVyLm08L3N0cmluZz4KKwkJPHN0cmluZz5wb2x5ZGlmZi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvU2ltcGxpZmllci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFJUZXN0cy9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3Rva2VuL0FOVExSQ29tbW9uVG9rZW5UZXN0Lm08L3N0cmluZz4KKwkJPHN0cmluZz5wb2x5ZGlmZi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvUG9seUxleGVyLm08L3N0cmluZz4KKwkJPHN0cmluZz5GdXp6eS9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvbWFpbi5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJld3JpdGVyLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8c3RyaW5nPmxleGVydGVzdC1zaW1wbGUvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmg8L3N0cmluZz4KKwkJPHN0cmluZz5zaW1wbGVjVHJlZVBhcnNlci9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmg8L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaDwvc3RyaW5nPgorCQk8c3RyaW5nPnRyZWVwYXJzZXIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ1BhcnNlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+dHJlZXJld3JpdGUvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlUGFyc2VyLm08L3N0cmluZz4KKwkJPHN0cmluZz5zaW1wbGVjVHJlZVBhcnNlci9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1dhbGtlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtLm08L3N0cmluZz4KKwkJPHN0cmluZz5wb2x5ZGlmZi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvUG9seVByaW50ZXIuaDwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlB0ckJ1ZmZlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+RnV6enkvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5TGV4ZXIubTwvc3RyaW5nPgorCQk8c3RyaW5nPkxMLXN0YXJ0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9MTC1zdGFyL1NpbXBsZUNQYXJzZXIubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWUubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnRXZlbnRQcm94eS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+c2ltcGxlY1RyZWVQYXJzZXIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNQYXJzZXIubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUb2tlblN0cmVhbS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm08L3N0cmluZz4KKwkJPHN0cmluZz5ob2lzdGVkUHJlZGljYXRlcy9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVFBhcnNlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+dHJlZXBhcnNlci9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nRHVtcERlY2wubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnUGFyc2VyLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZS5oPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFJUZXN0cy9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFJUZXN0cy9BTlRMUlRlc3RzLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlLm08L3N0cmluZz4KKwkJPHN0cmluZz5wb2x5ZGlmZi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvUG9seVBhcnNlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+RnV6enkvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5TGV4ZXIuaDwvc3RyaW5nPgorCQk8c3RyaW5nPnNjb3Blcy9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlUGFyc2VyLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWFkZXJTdHJlYW0ubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZVBhcnNlci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+e3swLCAwfSwgezMxNywgODU5fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVN0YWNrQ29tcHJlc3Npb25WYWx1ZTwvc3RyaW5nPgorCQk8c3RyaW5nPklERVRocmVhZHNPclF1ZXVlc01vZGU8L3N0cmluZz4KKwkJPHN0cmluZz5JREVIaWRlQW5jZXN0b3JGb3JOb25JbnRlcmVzdGluZ0ZyYW1lczwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7MjU5LCA4NDd9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjY4NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIzODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMxODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NzY5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8c3RyaW5nPnt7NTEsIDd9LCB7MTU4MiwgMTAxNH19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUkNvbW1vblRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Njk0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42Mjc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42OTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYyNzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zOTk1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDAwMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjM5OTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDAwMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MDAxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzk5NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zOTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQwMDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQwMDQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDAwMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQwMTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzk3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0Mzc4MzIuMjU1MTY4MDI8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjIwMjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3swLCAwfSwgezk1MywgOTE2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjUxNDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDAyPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0xlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+TlNMb2NhdGlvbjwva2V5PgorCQkJPGludGVnZXI+Mzc8L2ludGVnZXI+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNDk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzMyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMyOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzYzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM2NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzg0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM4NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JbiBmaWxlIGluY2x1ZGVkIGZyb20gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9BTlRMUlRyZWVBZGFwdG9yLmg6Mjg6PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQwNDA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+Mjc8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MDQ1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNzwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQwNTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5Qcm9wZXJ0eSBoYXMgYSBwcmV2aW91cyBkZWNsYXJhdGlvbiBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWUuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MDU2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZS5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDAzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlByb3BlcnR5IGRlY2xhcmVkIGhlcmUgaW4gL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDA3MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzE8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLmg8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlByb3BlcnR5IGRlY2xhcmVkIGhlcmU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+UHJvcGVydHkgaGFzIGEgcHJldmlvdXMgZGVjbGFyYXRpb248L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzM1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDA5NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjY8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDA5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwOTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPk1ldGhvZCBkZWZpbml0aW9uIGZvciAnY3JlYXRlVHJlZTonIG5vdCBmb3VuZCBpbiAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDEwMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zNjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzY8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+TWV0aG9kIGRlZmluaXRpb24gZm9yICdjcmVhdGVUcmVlOicgbm90IGZvdW5kPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMjk2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlBhcnNlIElzc3VlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDExMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDExMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkluIGZpbGUgaW5jbHVkZWQgZnJvbSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oOjMzOjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM3NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkV4cGVjdGVkICc7JyBhZnRlciBtZXRob2QgcHJvdG90eXBlIGluIC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQxMjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQxPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NDE8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPHN0cmluZz5FeHBlY3RlZCAnOycgYWZ0ZXIgbWV0aG9kIHByb3RvdHlwZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+VGhlIE9iamVjdGl2ZS1DIGNsYXNzICdBTlRMUkNvbW1vblRyZWUnLCB3aGljaCBpcyBkZXJpdmVkIGZyb20gY2xhc3MgJ0FOVExSQmFzZVRyZWUnLCBkZWZpbmVzIHRoZSBpbnN0YW5jZSBtZXRob2QgJ2dldExpbmUnIHdob3NlIHJldHVybiB0eXBlIGlzICdOU1VJbnRlZ2VyJy4gIEEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSAoc2FtZSBzZWxlY3RvcikgaXMgYWxzbyBkZWZpbmVkIGluIGNsYXNzICdBTlRMUkJhc2VUcmVlJyBhbmQgaGFzIGEgcmV0dXJuIHR5cGUgb2YgJ05TSW50ZWdlcicuICBUaGVzZSB0d28gdHlwZXMgYXJlIGluY29tcGF0aWJsZSwgYW5kIG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGZvciBjbGllbnRzIG9mIHRoZXNlIGNsYXNzZXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQxMzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjAzPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yMDM8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvLi4vQU5UTFJDb21tb25UcmVlLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDEzOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4yMDM8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjIwMzwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9BTlRMUkNvbW1vblRyZWUubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+RGVhZCBzdG9yZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+VmFsdWUgc3RvcmVkIHRvICdtc2cnIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24gaXMgbmV2ZXIgcmVhZDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDE0ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI5PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI5PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQmFzZVJlY29nbml6ZXIubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDE1MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zNDwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI5PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MjA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MzI5PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSQmFzZVJlY29nbml6ZXIubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjk8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xNDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4zMjk8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvLi4vQU5UTFJCYXNlUmVjb2duaXplci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5Mb2dpYyBlcnJvcjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlZhcmlhYmxlICd0cGF0dGVybicgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsIHZhbHVlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTYyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQ8L2ludGVnZXI+CisJCQk8a2V5PmVuZGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwMDwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjQ8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTAwPC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSVHJlZVdpemFyZC5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxlbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMb2M8L2tleT4KKwkJCTxpbnRlZ2VyPi0xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MTY0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5lbmRpbmdDb2x1bW5OdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj40PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwMDwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9BTlRMUlRyZWVXaXphcmQubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz5SZWNlaXZlciBpbiBtZXNzYWdlIGV4cHJlc3Npb24gaXMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDE3MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj45PC9pbnRlZ2VyPgorCQkJPGtleT5lbmRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDk8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj45PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0xpbmVOdW1iZXI8L2tleT4KKwkJCTxpbnRlZ2VyPjUwOTwvaW50ZWdlcj4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnN0cmluZzwva2V5PgorCQkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi8uLi9BTlRMUlRyZWVXaXphcmQubTwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hhcmFjdGVyUmFuZ2VMZW48L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTG9jPC9rZXk+CisJCQk8aW50ZWdlcj4tMTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDE3MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZW5kaW5nQ29sdW1uTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj4xODwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA5PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+MTA8L2ludGVnZXI+CisJCQk8a2V5PnN0YXJ0aW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA5PC9pbnRlZ2VyPgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSLy4uL0FOVExSVHJlZVdpemFyZC5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjMxNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoYXJhY3RlclJhbmdlTGVuPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5jaGFyYWN0ZXJSYW5nZUxvYzwva2V5PgorCQkJPGludGVnZXI+LTE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQxNzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmVuZGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+OTwvaW50ZWdlcj4KKwkJCTxrZXk+ZW5kaW5nTGluZU51bWJlcjwva2V5PgorCQkJPGludGVnZXI+NTA5PC9pbnRlZ2VyPgorCQkJPGtleT5zdGFydGluZ0NvbHVtbk51bWJlcjwva2V5PgorCQkJPGludGVnZXI+OTwvaW50ZWdlcj4KKwkJCTxrZXk+c3RhcnRpbmdMaW5lTnVtYmVyPC9rZXk+CisJCQk8aW50ZWdlcj41MDk8L2ludGVnZXI+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvLi4vQU5UTFJUcmVlV2l6YXJkLm08L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bnRpbWVFeGNlcHRpb24ubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlVmlzaXRvci5tPC9zdHJpbmc+CisJCTxzdHJpbmc+e3swLCA0NjR9LCB7NjEzLCA4NTB9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkRlYnVnIHRyZWVyZXdyaXRlIDogUmVjb3JkaW5nPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjY3ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjM4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQxOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYyOTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTUzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QnVpbGQgQU5UTFI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42ODM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjY4MzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIzMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIzMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjMwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyMjU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyMjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIyOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPlhjb2RlLklERU5hdmlnYWJsZUl0ZW0uV29ya3NwYWNlTG9nc0RvbWFpbjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIyODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkJ1aWxkIEFOVExSIDogNzoyNzo0MyBQTTwvc3RyaW5nPgorCQk8aW50ZWdlcj4yMTQ3NDgzNjQ3PC9pbnRlZ2VyPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIzMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovLzEyOEQzQUM1LUY0QzYtNDUwOC04QkVBLUUyNkNGNzM3NzYxOTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIzMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDIzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QnVpbGQgQU5UTFIgOiA3OjI3OjQzIFBNPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyNDU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIyNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDI0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjQ0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjQzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QnVpbGQgQU5UTFIgOiA3OjI3OjQzIFBNPC9zdHJpbmc+CisJCTxpbnRlZ2VyPjIxNDc0ODM2NDc8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjQ2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPngteGNvZGUtbG9nOi8vMTI4RDNBQzUtRjRDNi00NTA4LThCRUEtRTI2Q0Y3Mzc3NjE5PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjk4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+Y29tLmFwcGxlLmR0LklERS5CdWlsZExvZ0NvbnRlbnRUeXBlPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQyNTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz54LXhjb2RlLWxvZzovLzEyOEQzQUM1LUY0QzYtNDUwOC04QkVBLUUyNkNGNzM3NzYxOTwvc3RyaW5nPgorCQk8c3RyaW5nPlhjb2RlLklERUtpdC5FZGl0b3JEb2N1bWVudC5Mb2dEb2N1bWVudDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7OTgyLCA5MTZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzEzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5YY29kZS5JREVLaXQuTmF2aWdhdG9yLkxvZ3M8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU0xlbmd0aDwva2V5PgorCQkJPGludGVnZXI+MjwvaW50ZWdlcj4KKwkJCTxrZXk+TlNMb2NhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MjA8L2ludGVnZXI+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mjg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzE1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mzk0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzkzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTG9va2FoZWFkU3RyZWFtLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJGYXN0UXVldWUubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyU3RhdGUubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRGQS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyU3RhY2suaDwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZpbGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VSZWNvZ25pemVyLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm08L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5tPC9zdHJpbmc+CisJCTxzdHJpbmc+QU5UTFIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTG9va2FoZWFkU3RyZWFtLmg8L3N0cmluZz4KKwkJPHN0cmluZz5BTlRMUi9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubTwvc3RyaW5nPgorCQk8c3RyaW5nPkFOVExSL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1hcC5tPC9zdHJpbmc+CisJCTxzdHJpbmc+e3swLCA0MTkxfSwgezI0NCwgODUwfX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUjwvc3RyaW5nPgorCQk8c3RyaW5nPnt7MCwgMTc2Mn0sIHsyNDQsIDg3Mn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mjk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyOTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+ZXhhbXBsZXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+UHJvZHVjdHM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnRyZWVwYXJzZXI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVMb2dOYXZpZ2F0b3JTZWxlY3RlZE9iamVjdHNTdGF0ZUtleTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUxvZ05hdmlnYXRvckV4cGFuZGVkSXRlbXNTdGF0ZUtleTwvc3RyaW5nPgorCQk8c3RyaW5nPklERUxvZ05hdmlnYXRvclJlY2VudEZpbHRlclN0YXRlS2V5PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QnVpbGQgQU5UTFIgOiA3OjI3OjQzIFBNPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjY5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjE4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI2MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTgyPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMwMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMDMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzMwMkQxNUNELUYyRTQtNDU5MS1CQkVBLTg3MTU2QkUzRkM0Mzwvc3RyaW5nPgorCQk8c3RyaW5nPnt7MjQsIDM1OX0sIHsyNDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDMzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQzNDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MzQ4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MzQ4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MzQ5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjI5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45NTM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfQkYxRDgxODgtNjFBMC00ODkxLTlFNUItNzQ0NjY3RkQ4NEI0PC9zdHJpbmc+CisJCTxzdHJpbmc+e3syNDcsIDMzOH0sIHs2MDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5CdWlsZCBzY29wZXM8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Mzk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MDU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MDk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5CdWlsZCBzY29wZXMgOiAyOjIyOjUxIFBNPC9zdHJpbmc+CisJCTxpbnRlZ2VyPjIxNDc0ODM2NDc8L2ludGVnZXI+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQxMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQyNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40MjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0MjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDIzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQwOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8aW50ZWdlcj4yMTQ3NDgzNjQ3PC9pbnRlZ2VyPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTkyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Mjg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNzc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMjM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD40NTc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExMTY8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl82NDNDOUM2Ny1BRjczLTRBNDMtODk5Qy05Rjg2RUUwQkE4NjU8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ2MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQ3NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0ODM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0ODM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQ4MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0Nzc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDQ1NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDgyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDg0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb2N1bWVudExvY2F0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0ODE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvbWFpbklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NDkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0NTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0MzY2MTYuMDEyODUzMDM8L3JlYWw+CisJCTxzdHJpbmc+ezAsIDIwNjR9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ0OTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL21haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmg8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTIwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD44MTA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfNzM5RkI5NTUtMzI5Ni00NjEyLUFDMjAtMUNERjk3REU3QTMzPC9zdHJpbmc+CisJCTxzdHJpbmc+e3sxMTksIDMzNn0sIHsyNDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ1NTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NTUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NTUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NTU0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU2MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zODk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42NjE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjkyMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDUzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl84MTRDMzdCQi0wNTk0LTQ2RUItOUI5MC1COTExNjc1NkY4MDQ8L3N0cmluZz4KKwkJPHN0cmluZz57ezE2MywgMzQ5fSwgezYwMCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDYxMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ2MjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjEzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ2MjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDYxOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xODEyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyUGF0aDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JbmRleE9mRG9jdW1lbnRJZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNzkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+Mzc5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjIxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQxNzgwNy45MDA3MTQ5OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgzMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjM2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE4MTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ2MzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2MzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDYzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE3OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zNzk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgxOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+ZG9jdW1lbnRVUkw8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTgyMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+dGltZXN0YW1wPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjIzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NTg2PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45ODc8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfMzNFRDhGNDAtNTg1My00QjVFLTgyRDEtRUQ0NDQ5NTQ1OEE2PC9zdHJpbmc+CisJCTxzdHJpbmc+e3syNjYsIDM4Mn0sIHsyNDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2Nzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NjgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ2ODk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjkwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjkwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Njk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDY5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjI5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45NTM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ2Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9GMkI1N0I5OC05NDFELTQyMzgtOTM3OS03NDczQjM0MzBBN0U8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSQmFzZVRyZWUuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3MzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3Mzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDc0NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ3NTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NzQ3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ3NTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDc1MjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ3NDg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDcyNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5kb2N1bWVudFVSTDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NzUzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT50aW1lc3RhbXA8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMuc3RyaW5nPC9rZXk+CisJCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWUuaDwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NzU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+LWFkZENoaWxkOjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzI0NDIxODgxLjg2ODQ0NDAzPC9yZWFsPgorCQk8c3RyaW5nPnsxNTI3LCAxNTMxfTwvc3RyaW5nPgorCQk8c3RyaW5nPnsyMjE4LCAxN308L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NzUyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDc2ODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40NzI3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPHN0cmluZz5pZCZsdDtBTlRMUlRyZWVBZGFwdG9yJmd0Ozwvc3RyaW5nPgorCQk8c3RyaW5nPmlkJmx0O0FOVExSVHJlZSZndDs8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3ODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3ODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM3NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIyMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjU4NjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTg3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40Nzk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzVBNTU2MkQzLTI0NTctNDRFRC04N0VDLUVFMjVBN0EzMjIxRDwvc3RyaW5nPgorCQk8c3RyaW5nPnt7NTYsIDM0OX0sIHsyNDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODIxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4MjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40ODI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40ODI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40ODI1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Mjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Mjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Mjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Mzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zODk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD42NjE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjkyMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+SURFV29ya3NwYWNlVGFiQ29udHJvbGxlcl9FQjA5RDE3Ny01MTFFLTQ4RTYtOTdEMC1BNTM2ODA4NEExRkY8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+e3s0OSwgMzA5fSwgezYwMCwgNjQ2fX08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkZ1enp5TGV4ZXIuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTk8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDg4NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4OTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40ODg2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4OTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDg5MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg4ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4NjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDg5MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZ1enp5PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4OTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enlMZXhlci5oPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4OTY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDg5MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ5MDM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ4NjY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NDg5MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjYzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjI1MzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjM5OTM0NDUuMzkxNjgyOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5Mzk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzc3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjIzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5MzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjYwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5Mzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMzEzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfRDdDMTE3Q0YtMkRDRS00Q0JBLUI3MDUtMTk1MzVCMDg3NDJEPC9zdHJpbmc+CisJCTxzdHJpbmc+e3sxNjEsIDM4Mn0sIHsyNDAsIDY0Nn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5ODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTUzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mjk4PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMDE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk1NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyNDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Z2VuaXVzRWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cHJpbWFyeUVkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjQ5NjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnJvb3RMYXlvdXRUcmVlTm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40OTYzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40OTYzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj40OTY0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEyODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTc2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTE1PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTc4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5ODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTE0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNzY8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TUmFuZ2VDb3VudDwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5ODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+Mzg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NjMwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD45NTI8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjIxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNTQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5NDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfMkFDQzI2QjAtRjVDMC00MUQ4LTgzMkUtQUQ0QTc0RUExRjA3PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ5OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MjY4LCAzNjB9LCB7NjAwLCA2Njh9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA2ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+U2ltcGxpZmllci5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAyMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MDIxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTAzMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUwMjI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTAzMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MDI4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTAyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAyNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTAwMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4zMTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjI1MzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUwMjk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5zdHJpbmc8L2tleT4KKwkJCTxzdHJpbmc+ZmlsZTovL2xvY2FsaG9zdC9Vc2Vycy9hY29uZGl0L3NvdXJjZS9hbnRscjMvYWNvbmRpdF9sb2NhbGhvc3QvY29kZS9hbnRsci9tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvcG9seWRpZmYvU2ltcGxpZmllci5tPC9zdHJpbmc+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUwMzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDM4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjUyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyMzk5MjI3Ny40Mzc1NTg8L3JlYWw+CisJCTxzdHJpbmc+ezE1NjQzLCA3MjF9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5Mjg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTAyODwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMDc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUwNDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUwMDI8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MzE1NTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4yNTM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDQ5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yMDM8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA1NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDU3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA2MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNjE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM5OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIyMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjQ1NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MTExNjwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjE5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM1NDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzdCREM3MDc0LTdDREItNEY5RC1CQTdELTc4QzlDMUVERTc0Qjwvc3RyaW5nPgorCQk8c3RyaW5nPnt7MjAzLCAzMzZ9LCB7MjQwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA5MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwOTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MDk4PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTA5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTA5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTEwMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM4OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIxMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEzMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYyOTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTI5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTUzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5JREVXb3Jrc3BhY2VUYWJDb250cm9sbGVyXzJCMjE1MkYxLUIwN0YtNDIyNS1CNjY0LTI0RjY1RDBBOTI0Mzwvc3RyaW5nPgorCQk8c3RyaW5nPnt7MjI0LCAzNDl9LCB7MjQwLCA2NDZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEzNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTM5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj43NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+Nzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE0NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTUyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTQyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI5ODwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTQ1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzAxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4yOTg8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMwMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjEwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTE1NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTE1NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTE1NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTU5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTYzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE2MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheS8+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE2NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIwMzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjExNTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjE1MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTUxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTc2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OU1JhbmdlQ291bnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE3ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM4OTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MjA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjIxMTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxODI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjYyOTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj44MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTUzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4yMTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTg4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MzU0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTM0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDczPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDcyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE5MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4zOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfN0M5Q0E3REMtQzFCRC00RTNDLTg3QTQtODA4QjFENDU5RkNBPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDgzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxOTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI1ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIyMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5Lz4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+OTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIwMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIwMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjQ0NzwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDUxPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMDQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjA2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDQ3PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD40NTE8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTI0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5nZW5pdXNFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5wcmltYXJ5RWRpdG9yQ29udGV4dE5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTIxMjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+cm9vdExheW91dFRyZWVOb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUyMjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjM8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNoaWxkcmVuPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmNvbnRlbnRUeXBlPC9rZXk+CisJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgorCQkJPGtleT5kb2N1bWVudEFyY2hpdmFibGVSZXByZXNlbnRhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MjEzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5vcmllbnRhdGlvbjwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+cGFyZW50PC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUyMjE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTIyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUyMTQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTIxNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MjE5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5NDU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MjIyPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMjU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjI3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjI4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIyOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjE2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Nzc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnN0YXJ0Tm9kZTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MjIwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTIzMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIzMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MjE2PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MjM0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Njk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjM2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTIzODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjMyNDQ0MDM5OC4yNDc3MTYwMTwvcmVhbD4KKwkJPHN0cmluZz57MCwgMTk4OH08L3N0cmluZz4KKwkJPHN0cmluZz57MTk1MiwgMH08L3N0cmluZz4KKwkJPHN0cmluZz5wdWJsaWMuYy1oZWFkZXI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xNTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmJhc2U8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMucmVsYXRpdmU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTI0MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPmZpbGU6Ly9sb2NhbGhvc3QvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaDwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7ODk5LCA4NTl9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTk0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTk1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTk2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTk3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTk5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI1MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xODY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5Lz4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHsyNTksIDgzMn19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE2OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjExNzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMTcxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTE3MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3NDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE3NjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlNSYW5nZUNvdW50PC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFJUcmVlUnVsZVJldHVybjwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjYyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjYxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NDg5PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNzA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI2NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI2NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjYwPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD44ODU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjMzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI3MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjM0MDwvcmVhbD4KKwkJPHN0cmluZz57ezE2MywgOTB9LCB7ODk5LCA5MDV9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40NzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Mjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDc3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Mjc1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI3NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzNTk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPklERVdvcmtzcGFjZVRhYkNvbnRyb2xsZXJfQTM3Q0MwODItRkNFNS00NDY1LThEOTItNUI4MkQ1QUZCNUIwPC9zdHJpbmc+CisJCTxzdHJpbmc+e3sxODQsIDI2Mn0sIHsxMDk1LCA3NjZ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Mjc5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMzNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzNDU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzUxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHN0cmluZz5BTlRMUlRyZWVBZGFwdG9yLm08L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40OTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjgwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI4MTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyOTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzA4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMjg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xNzE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXkvPgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTAzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI4MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyODg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj45ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjk4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyOTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Mjg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41Mjg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+NTQ0PC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyODc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD41NTA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTA3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI4OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI5MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyOTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyOTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD41NDQ8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTE1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTI5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjU1MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MjQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj4xMDE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjQ8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pmdlbml1c0VkaXRvckNvbnRleHROb2RlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnByaW1hcnlFZGl0b3JDb250ZXh0Tm9kZTwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41Mjk3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5yb290TGF5b3V0VHJlZU5vZGU8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y2hpbGRyZW48L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+Y29udGVudFR5cGU8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCQk8a2V5PmRvY3VtZW50QXJjaGl2YWJsZVJlcHJlc2VudGF0aW9uPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUyOTg8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pm9yaWVudGF0aW9uPC9rZXk+CisJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPGtleT5wYXJlbnQ8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwNjwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5Eb21haW5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllclBhdGg8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTI5OTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SW5kZXhPZkRvY3VtZW50SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzAwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMwMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMDM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzAxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFJUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTEwPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5JZGVudGlmaWVyPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA0PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QU5UTFI8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PmRvY3VtZW50VVJMPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjE5MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PnRpbWVzdGFtcDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTIzPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jaGlsZHJlbjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5jb250ZW50VHlwZTwva2V5PgorCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTxrZXk+ZG9jdW1lbnRBcmNoaXZhYmxlUmVwcmVzZW50YXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+b3JpZW50YXRpb248L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8a2V5PnBhcmVudDwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyOTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMDk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMjY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzEyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41NTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzEzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMxNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMjA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzAxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTc0PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMyNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU3NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxzdHJpbmc+QGltcGxlbWVudGF0aW9uIEFOVExSVHJlZUFkYXB0b3I8L3N0cmluZz4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkRvY3VtZW50TG9jYXRpb248L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwNTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+RG9tYWluSWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXJQYXRoPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PkluZGV4T2ZEb2N1bWVudElkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMxNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMTc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzE4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMwMTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjExMDwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+SWRlbnRpZmllcjwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj41MzU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5PklkZW50aWZpZXI8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NTMxOTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPkFOVExSPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTY5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTcwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMyMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMyMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMjM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zMjQ0NDA1OTYuODg2MTcwOTg8L3JlYWw+CisJCTxzdHJpbmc+ezIxNjksIDE2OTZ9PC9zdHJpbmc+CisJCTxzdHJpbmc+ezM0ODgsIDB9PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTU1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5iYXNlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLnJlbGF0aXZlPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjUzMjU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCTwvZGljdD4KKwkJPHN0cmluZz5maWxlOi8vbG9jYWxob3N0L1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5tPC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMjc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8c3RyaW5nPnt7MCwgMH0sIHsxMDk1LCA3MjB9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMjk8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMzA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzMyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41ODM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzMxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjAzPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU4NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMzM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4xMTU8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+NzE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTg5PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTkxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMzNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMzg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41OTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5MzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjU5OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzMzY8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzM3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+MTg2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xMTU8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7MjU5LCA4MzJ9fTwvc3RyaW5nPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYwOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYxMjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTMzOTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzNDA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzQxPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM0MjwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzQzPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM0NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj4xOTk8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPHN0cmluZz57ezAsIDB9LCB7MCwgMH19PC9zdHJpbmc+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTk5PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXkvPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+OTE8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheS8+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj43MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MDc8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzQ2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj45MTwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzQ3PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM0OTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NjIyPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM0ODwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjUwOTwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj42MjI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzUwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+MjExPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjcxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUwNzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzNTI8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzNTM8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzU1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM1NzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+ODc8L2ludGVnZXI+CisJCQk8L2RpY3Q+CisJCQk8a2V5Pk5TLmtleXM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTEwPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTExPC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCQk8a2V5Pk5TLm9iamVjdHM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NDg1PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCQk8ZGljdD4KKwkJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQkJPGludGVnZXI+NTM1NDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQk8L2RpY3Q+CisJCTxyZWFsPjI2MDwvcmVhbD4KKwkJPGRpY3Q+CisJCQk8a2V5PiRjbGFzczwva2V5PgorCQkJPGRpY3Q+CisJCQkJPGtleT5DRiRVSUQ8L2tleT4KKwkJCQk8aW50ZWdlcj44NzwvaW50ZWdlcj4KKwkJCTwvZGljdD4KKwkJCTxrZXk+TlMua2V5czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTA8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MTE8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJCTxrZXk+TlMub2JqZWN0czwva2V5PgorCQkJPGFycmF5PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj40ODQ8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJCTxkaWN0PgorCQkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCQk8aW50ZWdlcj41MzU2PC9pbnRlZ2VyPgorCQkJCTwvZGljdD4KKwkJCTwvYXJyYXk+CisJCTwvZGljdD4KKwkJPHJlYWw+OTgyPC9yZWFsPgorCQk8ZGljdD4KKwkJCTxrZXk+JGNsYXNzPC9rZXk+CisJCQk8ZGljdD4KKwkJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJCTxpbnRlZ2VyPjg3PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5rZXlzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMDwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUxMTwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQk8L2FycmF5PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjYzMzwvaW50ZWdlcj4KKwkJCQk8L2RpY3Q+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUzNTg8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCQk8cmVhbD4zNDA8L3JlYWw+CisJCTxkaWN0PgorCQkJPGtleT4kY2xhc3M8L2tleT4KKwkJCTxkaWN0PgorCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJPGludGVnZXI+MTE1PC9pbnRlZ2VyPgorCQkJPC9kaWN0PgorCQkJPGtleT5OUy5vYmplY3RzPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPGRpY3Q+CisJCQkJCTxrZXk+Q0YkVUlEPC9rZXk+CisJCQkJCTxpbnRlZ2VyPjUyNzU8L2ludGVnZXI+CisJCQkJPC9kaWN0PgorCQkJPC9hcnJheT4KKwkJPC9kaWN0PgorCTwvYXJyYXk+CisJPGtleT4kdG9wPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+U3RhdGU8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PkNGJFVJRDwva2V5PgorCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCTwvZGljdD4KKwk8a2V5PiR2ZXJzaW9uPC9rZXk+CisJPGludGVnZXI+MTAwMDAwPC9pbnRlZ2VyPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai9wcm9qZWN0Lnhjd29ya3NwYWNlL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC9Xb3Jrc3BhY2VTZXR0aW5ncy54Y3NldHRpbmdzIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL1dvcmtzcGFjZVNldHRpbmdzLnhjc2V0dGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwOWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai9wcm9qZWN0Lnhjd29ya3NwYWNlL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC9Xb3Jrc3BhY2VTZXR0aW5ncy54Y3NldHRpbmdzCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5JREVXb3Jrc3BhY2VVc2VyU2V0dGluZ3NfQnVpbGRMb2NhdGlvblN0eWxlPC9rZXk+CisJPGludGVnZXI+MDwvaW50ZWdlcj4KKwk8a2V5PklERVdvcmtzcGFjZVVzZXJTZXR0aW5nc19CdWlsZFN1YmZvbGRlck5hbWVTdHlsZTwva2V5PgorCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJPGtleT5JREVXb3Jrc3BhY2VVc2VyU2V0dGluZ3NfRGVyaXZlZERhdGFMb2NhdGlvblN0eWxlPC9rZXk+CisJPGludGVnZXI+MDwvaW50ZWdlcj4KKwk8a2V5PklERVdvcmtzcGFjZVVzZXJTZXR0aW5nc19IYXNBc2tlZFRvVGFrZUF1dG9tYXRpY1NuYXBzaG90QmVmb3JlU2lnbmlmaWNhbnRDaGFuZ2VzPC9rZXk+CisJPHRydWUvPgorCTxrZXk+SURFV29ya3NwYWNlVXNlclNldHRpbmdzX0xpdmVTb3VyY2VJc3N1ZXNFbmFibGVkPC9rZXk+CisJPHRydWUvPgorCTxrZXk+SURFV29ya3NwYWNlVXNlclNldHRpbmdzX1NuYXBzaG90QXV0b21hdGljYWxseUJlZm9yZVNpZ25pZmljYW50Q2hhbmdlczwva2V5PgorCTx0cnVlLz4KKwk8a2V5PklERVdvcmtzcGFjZVVzZXJTZXR0aW5nc19TbmFwc2hvdExvY2F0aW9uU3R5bGU8L2tleT4KKwk8aW50ZWdlcj4wPC9pbnRlZ2VyPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai9wcm9qZWN0Lnhjd29ya3NwYWNlL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y2RlYnVnZ2VyL0V4cHJlc3Npb25zLnhjZXhwbGlzdCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai9wcm9qZWN0Lnhjd29ya3NwYWNlL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y2RlYnVnZ2VyL0V4cHJlc3Npb25zLnhjZXhwbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ1ODVkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3Byb2plY3QueGN3b3Jrc3BhY2UveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjZGVidWdnZXIvRXhwcmVzc2lvbnMueGNleHBsaXN0CkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8VmFyaWFibGVzU3RhY2tTdGF0ZQorICAgdmVyc2lvbiA9ICIxLjAiPgorICAgPFN0YWNrU3RhdGVzPgorICAgICAgPFN0YWNrU3RhdGUKKyAgICAgICAgIHN0YWNrRnJhbWVEZXNjcmlwdGlvbiA9ICItW0FDQlRyZWUgaW5zZXJ0a2V5OnZhbHVlOl06QUNCVHJlZS5tIj4KKyAgICAgICAgIDxleHByZXNzaW9ucz4KKyAgICAgICAgIDwvZXhwcmVzc2lvbnM+CisgICAgICA8L1N0YWNrU3RhdGU+CisgICAgICA8U3RhY2tTdGF0ZQorICAgICAgICAgc3RhY2tGcmFtZURlc2NyaXB0aW9uID0gIi1bQUNCVHJlZSBpbnRlcm5hbGluc2VydDp2YWx1ZTpzcGxpdDpdOkFDQlRyZWUubSI+CisgICAgICAgICA8ZXhwcmVzc2lvbnM+CisgICAgICAgICA8L2V4cHJlc3Npb25zPgorICAgICAgPC9TdGFja1N0YXRlPgorICAgICAgPFN0YWNrU3RhdGUKKyAgICAgICAgIHN0YWNrRnJhbWVEZXNjcmlwdGlvbiA9ICItW0FDQlRyZWUgaW5zZXJ0OnZhbHVlOmluZGV4OnNwbGl0Ol06QUNCVHJlZS5tIj4KKyAgICAgICAgIDxleHByZXNzaW9ucz4KKyAgICAgICAgICAgIDxleHByZXNzaW9uCisgICAgICAgICAgICAgICB2YWx1ZSA9ICJOU1N0cmluZyI+CisgICAgICAgICAgICA8L2V4cHJlc3Npb24+CisgICAgICAgICA8L2V4cHJlc3Npb25zPgorICAgICAgPC9TdGFja1N0YXRlPgorICAgICAgPFN0YWNrU3RhdGUKKyAgICAgICAgIHN0YWNrRnJhbWVEZXNjcmlwdGlvbiA9ICItW1Rlc3REaWN0aW9uYXJ5IHRlc3QwNHJlbW92ZV06VGVzdERpY3Rpb25hcnkubSI+CisgICAgICAgICA8ZXhwcmVzc2lvbnM+CisgICAgICAgICA8L2V4cHJlc3Npb25zPgorICAgICAgPC9TdGFja1N0YXRlPgorICAgPC9TdGFja1N0YXRlcz4KKzwvVmFyaWFibGVzU3RhY2tTdGF0ZT4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNkZWJ1Z2dlci9CcmVha3BvaW50cy54Y2JrcHRsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y2RlYnVnZ2VyL0JyZWFrcG9pbnRzLnhjYmtwdGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzMDFiYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNkZWJ1Z2dlci9CcmVha3BvaW50cy54Y2JrcHRsaXN0CkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxCdWNrZXQKKyAgIHR5cGUgPSAiMSIKKyAgIHZlcnNpb24gPSAiMS4wIj4KKzwvQnVja2V0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvQU5UTFIueGNzY2hlbWUgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9BTlRMUi54Y3NjaGVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc2YTYyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvQU5UTFIueGNzY2hlbWUKQEAgLTAsMCArMSw4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTY2hlbWUKKyAgIHZlcnNpb24gPSAiMS4zIj4KKyAgIDxCdWlsZEFjdGlvbgorICAgICAgcGFyYWxsZWxpemVCdWlsZGFibGVzID0gIllFUyIKKyAgICAgIGJ1aWxkSW1wbGljaXREZXBlbmRlbmNpZXMgPSAiTk8iPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiTk8iCisgICAgICAgICAgICBidWlsZEZvclJ1bm5pbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JQcm9maWxpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JBcmNoaXZpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JBbmFseXppbmcgPSAiWUVTIj4KKyAgICAgICAgICAgIDxCdWlsZGFibGVSZWZlcmVuY2UKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZUlkZW50aWZpZXIgPSAicHJpbWFyeSIKKyAgICAgICAgICAgICAgIEJsdWVwcmludElkZW50aWZpZXIgPSAiMUFFNzIzMTcxMzRFODYwQjAwMUMzRjM1IgorICAgICAgICAgICAgICAgQnVpbGRhYmxlTmFtZSA9ICJBTlRMUi5mcmFtZXdvcmsiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkFOVExSIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgICAgPEJ1aWxkQWN0aW9uRW50cnkKKyAgICAgICAgICAgIGJ1aWxkRm9yVGVzdGluZyA9ICJZRVMiCisgICAgICAgICAgICBidWlsZEZvclJ1bm5pbmcgPSAiTk8iCisgICAgICAgICAgICBidWlsZEZvclByb2ZpbGluZyA9ICJOTyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIk5PIgorICAgICAgICAgICAgYnVpbGRGb3JBbmFseXppbmcgPSAiTk8iPgorICAgICAgICAgICAgPEJ1aWxkYWJsZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgQnVpbGRhYmxlSWRlbnRpZmllciA9ICJwcmltYXJ5IgorICAgICAgICAgICAgICAgQmx1ZXByaW50SWRlbnRpZmllciA9ICIxQUU3MjMyQzEzNEU4NjBCMDAxQzNGMzUiCisgICAgICAgICAgICAgICBCdWlsZGFibGVOYW1lID0gIkFOVExSVGVzdHMub2N0ZXN0IgorICAgICAgICAgICAgICAgQmx1ZXByaW50TmFtZSA9ICJBTlRMUlRlc3RzIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgICAgIDxUZXN0YWJsZVJlZmVyZW5jZQorICAgICAgICAgICAgc2tpcHBlZCA9ICJOTyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBRTcyMzJDMTM0RTg2MEIwMDFDM0YzNSIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiQU5UTFJUZXN0cy5vY3Rlc3QiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkFOVExSVGVzdHMiCisgICAgICAgICAgICAgICBSZWZlcmVuY2VkQ29udGFpbmVyID0gImNvbnRhaW5lcjpBTlRMUi54Y29kZXByb2oiPgorICAgICAgICAgICAgPC9CdWlsZGFibGVSZWZlcmVuY2U+CisgICAgICAgICA8L1Rlc3RhYmxlUmVmZXJlbmNlPgorICAgICAgPC9UZXN0YWJsZXM+CisgICA8L1Rlc3RBY3Rpb24+CisgICA8TGF1bmNoQWN0aW9uCisgICAgICBzZWxlY3RlZERlYnVnZ2VySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uRGVidWdnZXIuR0RCIgorICAgICAgc2VsZWN0ZWRMYXVuY2hlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkxhdW5jaGVyLkdEQiIKKyAgICAgIGRpc3BsYXlTY2FsZUlzRW5hYmxlZCA9ICJOTyIKKyAgICAgIGRpc3BsYXlTY2FsZSA9ICIxLjAwIgorICAgICAgbGF1bmNoU3R5bGUgPSAiMCIKKyAgICAgIHVzZUN1c3RvbVdvcmtpbmdEaXJlY3RvcnkgPSAiTk8iCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPgorICAgICAgPC9BZGRpdGlvbmFsT3B0aW9ucz4KKyAgIDwvTGF1bmNoQWN0aW9uPgorICAgPFByb2ZpbGVBY3Rpb24KKyAgICAgIGRpc3BsYXlTY2FsZUlzRW5hYmxlZCA9ICJOTyIKKyAgICAgIGRpc3BsYXlTY2FsZSA9ICIxLjAwIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBzYXZlZFRvb2xJZGVudGlmaWVyID0gIiIKKyAgICAgIHVzZUN1c3RvbVdvcmtpbmdEaXJlY3RvcnkgPSAiTk8iCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSI+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9BTlRMUlRlc3RzLnhjc2NoZW1lIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvQU5UTFJUZXN0cy54Y3NjaGVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRlZjNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvQU5UTFJUZXN0cy54Y3NjaGVtZQpAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgPC9CdWlsZEFjdGlvbj4KKyAgIDxUZXN0QWN0aW9uCisgICAgICBzZWxlY3RlZERlYnVnZ2VySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uRGVidWdnZXIuR0RCIgorICAgICAgc2VsZWN0ZWRMYXVuY2hlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkxhdW5jaGVyLkdEQiIKKyAgICAgIHNob3VsZFVzZUxhdW5jaFNjaGVtZUFyZ3NFbnYgPSAiWUVTIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxUZXN0YWJsZXM+CisgICAgICAgICA8VGVzdGFibGVSZWZlcmVuY2UKKyAgICAgICAgICAgIHNraXBwZWQgPSAiTk8iPgorICAgICAgICAgICAgPEJ1aWxkYWJsZVJlZmVyZW5jZQorICAgICAgICAgICAgICAgQnVpbGRhYmxlSWRlbnRpZmllciA9ICJwcmltYXJ5IgorICAgICAgICAgICAgICAgQmx1ZXByaW50SWRlbnRpZmllciA9ICIxQUU3MjMyQzEzNEU4NjBCMDAxQzNGMzUiCisgICAgICAgICAgICAgICBCdWlsZGFibGVOYW1lID0gIkFOVExSVGVzdHMub2N0ZXN0IgorICAgICAgICAgICAgICAgQmx1ZXByaW50TmFtZSA9ICJBTlRMUlRlc3RzIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9UZXN0YWJsZVJlZmVyZW5jZT4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxDb21tYW5kTGluZUFyZ3VtZW50cz4KKyAgICAgICAgIDxDb21tYW5kTGluZUFyZ3VtZW50CisgICAgICAgICAgICBhcmd1bWVudCA9ICItU2VuVGVzdCBTZWxmIgorICAgICAgICAgICAgaXNFbmFibGVkID0gIllFUyI+CisgICAgICAgICA8L0NvbW1hbmRMaW5lQXJndW1lbnQ+CisgICAgICAgICA8Q29tbWFuZExpbmVBcmd1bWVudAorICAgICAgICAgICAgYXJndW1lbnQgPSAiJChCVUlMVF9QUk9EVUNUU19ESVIpL0FOVExSVGVzdHMub2N0ZXN0IgorICAgICAgICAgICAgaXNFbmFibGVkID0gIllFUyI+CisgICAgICAgICA8L0NvbW1hbmRMaW5lQXJndW1lbnQ+CisgICAgICA8L0NvbW1hbmRMaW5lQXJndW1lbnRzPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGVzPgorICAgICAgICAgPEVudmlyb25tZW50VmFyaWFibGUKKyAgICAgICAgICAgIGtleSA9ICJEWUxEX0ZSQU1FV09SS19QQVRIIgorICAgICAgICAgICAgdmFsdWUgPSAiJChCVUlMVF9QUk9EVUNUU19ESVIpIgorICAgICAgICAgICAgaXNFbmFibGVkID0gIllFUyI+CisgICAgICAgICA8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZQorICAgICAgICAgICAga2V5ID0gIkRZTERfTElCUkFSWV9QQVRIIgorICAgICAgICAgICAgdmFsdWUgPSAiJChCVUlMVF9QUk9EVUNUU19ESVIpIgorICAgICAgICAgICAgaXNFbmFibGVkID0gIllFUyI+CisgICAgICAgICA8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgICA8L0Vudmlyb25tZW50VmFyaWFibGVzPgorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPgorICAgICAgPC9BZGRpdGlvbmFsT3B0aW9ucz4KKyAgIDwvTGF1bmNoQWN0aW9uPgorICAgPFByb2ZpbGVBY3Rpb24KKyAgICAgIGRpc3BsYXlTY2FsZUlzRW5hYmxlZCA9ICJOTyIKKyAgICAgIGRpc3BsYXlTY2FsZSA9ICIxLjAwIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBzYXZlZFRvb2xJZGVudGlmaWVyID0gIiIKKyAgICAgIHVzZUN1c3RvbVdvcmtpbmdEaXJlY3RvcnkgPSAiTk8iCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSI+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9GdXp6eS54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL0Z1enp5Lnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTY1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9GdXp6eS54Y3NjaGVtZQpAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCQzYwMTM0RjVEQUIwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiRnV6enkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkZ1enp5IgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCQzYwMTM0RjVEQUIwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiRnV6enkiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkZ1enp5IgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZXM+CisgICAgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZQorICAgICAgICAgICAgdmFsdWUgPSAiIgorICAgICAgICAgICAgaXNFbmFibGVkID0gIk5PIj4KKyAgICAgICAgIDwvRW52aXJvbm1lbnRWYXJpYWJsZT4KKyAgICAgIDwvRW52aXJvbm1lbnRWYXJpYWJsZXM+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCQzYwMTM0RjVEQUIwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiRnV6enkiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkZ1enp5IgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9MTC1zdGFydC54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL0xMLXN0YXJ0Lnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjE4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9MTC1zdGFydC54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDRCMTM0RjVGNDMwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiTEwtc3RhcnQiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkxMLXN0YXJ0IgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDRCMTM0RjVGNDMwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiTEwtc3RhcnQiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkxMLXN0YXJ0IgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDRCMTM0RjVGNDMwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiTEwtc3RhcnQiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gIkxMLXN0YXJ0IgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9jb21iaW5lZC54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL2NvbWJpbmVkLnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwM2Y3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9jb21iaW5lZC54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDMxMTM0RjVGMUUwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiY29tYmluZWQiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImNvbWJpbmVkIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDMxMTM0RjVGMUUwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiY29tYmluZWQiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImNvbWJpbmVkIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDMxMTM0RjVGMUUwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiY29tYmluZWQiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImNvbWJpbmVkIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9ob2lzdGVkUHJlZGljYXRlcy54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL2hvaXN0ZWRQcmVkaWNhdGVzLnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNTA3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9ob2lzdGVkUHJlZGljYXRlcy54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCREZCMTM0RkI3NUUwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiaG9pc3RlZFByZWRpY2F0ZXMiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImhvaXN0ZWRQcmVkaWNhdGVzIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCREZCMTM0RkI3NUUwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiaG9pc3RlZFByZWRpY2F0ZXMiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImhvaXN0ZWRQcmVkaWNhdGVzIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCREZCMTM0RkI3NUUwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAiaG9pc3RlZFByZWRpY2F0ZXMiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImhvaXN0ZWRQcmVkaWNhdGVzIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9sZXhlcnRlc3Qtc2ltcGxlLnhjc2NoZW1lIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvbGV4ZXJ0ZXN0LXNpbXBsZS54Y3NjaGVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQyZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvbGV4ZXJ0ZXN0LXNpbXBsZS54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDNFMTM0RjVGMzYwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSIKKyAgICAgICAgICAgICAgIEJsdWVwcmludE5hbWUgPSAibGV4ZXJ0ZXN0LXNpbXBsZSIKKyAgICAgICAgICAgICAgIFJlZmVyZW5jZWRDb250YWluZXIgPSAiY29udGFpbmVyOkFOVExSLnhjb2RlcHJvaiI+CisgICAgICAgICAgICA8L0J1aWxkYWJsZVJlZmVyZW5jZT4KKyAgICAgICAgIDwvQnVpbGRBY3Rpb25FbnRyeT4KKyAgICAgIDwvQnVpbGRBY3Rpb25FbnRyaWVzPgorICAgPC9CdWlsZEFjdGlvbj4KKyAgIDxUZXN0QWN0aW9uCisgICAgICBzZWxlY3RlZERlYnVnZ2VySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uRGVidWdnZXIuR0RCIgorICAgICAgc2VsZWN0ZWRMYXVuY2hlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkxhdW5jaGVyLkdEQiIKKyAgICAgIHNob3VsZFVzZUxhdW5jaFNjaGVtZUFyZ3NFbnYgPSAiWUVTIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxUZXN0YWJsZXM+CisgICAgICA8L1Rlc3RhYmxlcz4KKyAgIDwvVGVzdEFjdGlvbj4KKyAgIDxMYXVuY2hBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBsYXVuY2hTdHlsZSA9ICIwIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJEZWJ1ZyI+CisgICAgICA8QnVpbGRhYmxlUHJvZHVjdFJ1bm5hYmxlPgorICAgICAgICAgPEJ1aWxkYWJsZVJlZmVyZW5jZQorICAgICAgICAgICAgQnVpbGRhYmxlSWRlbnRpZmllciA9ICJwcmltYXJ5IgorICAgICAgICAgICAgQmx1ZXByaW50SWRlbnRpZmllciA9ICIxQTYzQkQzRTEzNEY1RjM2MDAyRURGQjQiCisgICAgICAgICAgICBCdWlsZGFibGVOYW1lID0gImxleGVydGVzdC1zaW1wbGUiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gImxleGVydGVzdC1zaW1wbGUiCisgICAgICAgICAgICBSZWZlcmVuY2VkQ29udGFpbmVyID0gImNvbnRhaW5lcjpBTlRMUi54Y29kZXByb2oiPgorICAgICAgICAgPC9CdWlsZGFibGVSZWZlcmVuY2U+CisgICAgICA8L0J1aWxkYWJsZVByb2R1Y3RSdW5uYWJsZT4KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4KKyAgICAgIDwvQWRkaXRpb25hbE9wdGlvbnM+CisgICA8L0xhdW5jaEFjdGlvbj4KKyAgIDxQcm9maWxlQWN0aW9uCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIHNob3VsZFVzZUxhdW5jaFNjaGVtZUFyZ3NFbnYgPSAiWUVTIgorICAgICAgc2F2ZWRUb29sSWRlbnRpZmllciA9ICIiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIlJlbGVhc2UiPgorICAgICAgPEJ1aWxkYWJsZVByb2R1Y3RSdW5uYWJsZT4KKyAgICAgICAgIDxCdWlsZGFibGVSZWZlcmVuY2UKKyAgICAgICAgICAgIEJ1aWxkYWJsZUlkZW50aWZpZXIgPSAicHJpbWFyeSIKKyAgICAgICAgICAgIEJsdWVwcmludElkZW50aWZpZXIgPSAiMUE2M0JEM0UxMzRGNUYzNjAwMkVERkI0IgorICAgICAgICAgICAgQnVpbGRhYmxlTmFtZSA9ICJsZXhlcnRlc3Qtc2ltcGxlIgorICAgICAgICAgICAgQmx1ZXByaW50TmFtZSA9ICJsZXhlcnRlc3Qtc2ltcGxlIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9wb2x5ZGlmZi54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL3BvbHlkaWZmLnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODNkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9wb2x5ZGlmZi54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDU4MTM0RjVGNEQwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAicG9seWRpZmYiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInBvbHlkaWZmIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDU4MTM0RjVGNEQwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAicG9seWRpZmYiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInBvbHlkaWZmIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDU4MTM0RjVGNEQwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAicG9seWRpZmYiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInBvbHlkaWZmIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9zY29wZXMueGNzY2hlbWUgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9zY29wZXMueGNzY2hlbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0ZGVjMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL3Njb3Blcy54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCREQzMTM0RjYyMzMwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAic2NvcGVzIgorICAgICAgICAgICAgICAgQmx1ZXByaW50TmFtZSA9ICJzY29wZXMiCisgICAgICAgICAgICAgICBSZWZlcmVuY2VkQ29udGFpbmVyID0gImNvbnRhaW5lcjpBTlRMUi54Y29kZXByb2oiPgorICAgICAgICAgICAgPC9CdWlsZGFibGVSZWZlcmVuY2U+CisgICAgICAgICA8L0J1aWxkQWN0aW9uRW50cnk+CisgICAgICA8L0J1aWxkQWN0aW9uRW50cmllcz4KKyAgIDwvQnVpbGRBY3Rpb24+CisgICA8VGVzdEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJEZWJ1ZyI+CisgICAgICA8VGVzdGFibGVzPgorICAgICAgPC9UZXN0YWJsZXM+CisgICA8L1Rlc3RBY3Rpb24+CisgICA8TGF1bmNoQWN0aW9uCisgICAgICBzZWxlY3RlZERlYnVnZ2VySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uRGVidWdnZXIuR0RCIgorICAgICAgc2VsZWN0ZWRMYXVuY2hlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkxhdW5jaGVyLkdEQiIKKyAgICAgIGRpc3BsYXlTY2FsZUlzRW5hYmxlZCA9ICJOTyIKKyAgICAgIGRpc3BsYXlTY2FsZSA9ICIxLjAwIgorICAgICAgbGF1bmNoU3R5bGUgPSAiMCIKKyAgICAgIHVzZUN1c3RvbVdvcmtpbmdEaXJlY3RvcnkgPSAiTk8iCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPEJ1aWxkYWJsZVByb2R1Y3RSdW5uYWJsZT4KKyAgICAgICAgIDxCdWlsZGFibGVSZWZlcmVuY2UKKyAgICAgICAgICAgIEJ1aWxkYWJsZUlkZW50aWZpZXIgPSAicHJpbWFyeSIKKyAgICAgICAgICAgIEJsdWVwcmludElkZW50aWZpZXIgPSAiMUE2M0JERDMxMzRGNjIzMzAwMkVERkI0IgorICAgICAgICAgICAgQnVpbGRhYmxlTmFtZSA9ICJzY29wZXMiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInNjb3BlcyIKKyAgICAgICAgICAgIFJlZmVyZW5jZWRDb250YWluZXIgPSAiY29udGFpbmVyOkFOVExSLnhjb2RlcHJvaiI+CisgICAgICAgICA8L0J1aWxkYWJsZVJlZmVyZW5jZT4KKyAgICAgIDwvQnVpbGRhYmxlUHJvZHVjdFJ1bm5hYmxlPgorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPgorICAgICAgPC9BZGRpdGlvbmFsT3B0aW9ucz4KKyAgIDwvTGF1bmNoQWN0aW9uPgorICAgPFByb2ZpbGVBY3Rpb24KKyAgICAgIGRpc3BsYXlTY2FsZUlzRW5hYmxlZCA9ICJOTyIKKyAgICAgIGRpc3BsYXlTY2FsZSA9ICIxLjAwIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBzYXZlZFRvb2xJZGVudGlmaWVyID0gIiIKKyAgICAgIHVzZUN1c3RvbVdvcmtpbmdEaXJlY3RvcnkgPSAiTk8iCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSI+CisgICAgICA8QnVpbGRhYmxlUHJvZHVjdFJ1bm5hYmxlPgorICAgICAgICAgPEJ1aWxkYWJsZVJlZmVyZW5jZQorICAgICAgICAgICAgQnVpbGRhYmxlSWRlbnRpZmllciA9ICJwcmltYXJ5IgorICAgICAgICAgICAgQmx1ZXByaW50SWRlbnRpZmllciA9ICIxQTYzQkREMzEzNEY2MjMzMDAyRURGQjQiCisgICAgICAgICAgICBCdWlsZGFibGVOYW1lID0gInNjb3BlcyIKKyAgICAgICAgICAgIEJsdWVwcmludE5hbWUgPSAic2NvcGVzIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9zaW1wbGVjVHJlZVBhcnNlci54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL3NpbXBsZWNUcmVlUGFyc2VyLnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZGZmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy9zaW1wbGVjVHJlZVBhcnNlci54Y3NjaGVtZQpAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDY1MTM0RjVGNUUwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAic2ltcGxlY1RyZWVQYXJzZXIiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInNpbXBsZWNUcmVlUGFyc2VyIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDY1MTM0RjVGNUUwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAic2ltcGxlY1RyZWVQYXJzZXIiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInNpbXBsZWNUcmVlUGFyc2VyIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8Q29tbWFuZExpbmVBcmd1bWVudHM+CisgICAgICAgICA8Q29tbWFuZExpbmVBcmd1bWVudAorICAgICAgICAgICAgYXJndW1lbnQgPSAiaW5wdXQiCisgICAgICAgICAgICBpc0VuYWJsZWQgPSAiWUVTIj4KKyAgICAgICAgIDwvQ29tbWFuZExpbmVBcmd1bWVudD4KKyAgICAgIDwvQ29tbWFuZExpbmVBcmd1bWVudHM+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDY1MTM0RjVGNUUwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAic2ltcGxlY1RyZWVQYXJzZXIiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInNpbXBsZWNUcmVlUGFyc2VyIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy90cmVlcGFyc2VyLnhjc2NoZW1lIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvdHJlZXBhcnNlci54Y3NjaGVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRmZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIueGNvZGVwcm9qL3hjdXNlcmRhdGEvYWNvbmRpdC54Y3VzZXJkYXRhZC94Y3NjaGVtZXMvdHJlZXBhcnNlci54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDcyMTM0RjVGNjcwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAidHJlZXBhcnNlciIKKyAgICAgICAgICAgICAgIEJsdWVwcmludE5hbWUgPSAidHJlZXBhcnNlciIKKyAgICAgICAgICAgICAgIFJlZmVyZW5jZWRDb250YWluZXIgPSAiY29udGFpbmVyOkFOVExSLnhjb2RlcHJvaiI+CisgICAgICAgICAgICA8L0J1aWxkYWJsZVJlZmVyZW5jZT4KKyAgICAgICAgIDwvQnVpbGRBY3Rpb25FbnRyeT4KKyAgICAgIDwvQnVpbGRBY3Rpb25FbnRyaWVzPgorICAgPC9CdWlsZEFjdGlvbj4KKyAgIDxUZXN0QWN0aW9uCisgICAgICBzZWxlY3RlZERlYnVnZ2VySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uRGVidWdnZXIuR0RCIgorICAgICAgc2VsZWN0ZWRMYXVuY2hlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkxhdW5jaGVyLkdEQiIKKyAgICAgIHNob3VsZFVzZUxhdW5jaFNjaGVtZUFyZ3NFbnYgPSAiWUVTIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxUZXN0YWJsZXM+CisgICAgICA8L1Rlc3RhYmxlcz4KKyAgIDwvVGVzdEFjdGlvbj4KKyAgIDxMYXVuY2hBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBsYXVuY2hTdHlsZSA9ICIwIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJEZWJ1ZyI+CisgICAgICA8QnVpbGRhYmxlUHJvZHVjdFJ1bm5hYmxlPgorICAgICAgICAgPEJ1aWxkYWJsZVJlZmVyZW5jZQorICAgICAgICAgICAgQnVpbGRhYmxlSWRlbnRpZmllciA9ICJwcmltYXJ5IgorICAgICAgICAgICAgQmx1ZXByaW50SWRlbnRpZmllciA9ICIxQTYzQkQ3MjEzNEY1RjY3MDAyRURGQjQiCisgICAgICAgICAgICBCdWlsZGFibGVOYW1lID0gInRyZWVwYXJzZXIiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInRyZWVwYXJzZXIiCisgICAgICAgICAgICBSZWZlcmVuY2VkQ29udGFpbmVyID0gImNvbnRhaW5lcjpBTlRMUi54Y29kZXByb2oiPgorICAgICAgICAgPC9CdWlsZGFibGVSZWZlcmVuY2U+CisgICAgICA8L0J1aWxkYWJsZVByb2R1Y3RSdW5uYWJsZT4KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4KKyAgICAgIDwvQWRkaXRpb25hbE9wdGlvbnM+CisgICA8L0xhdW5jaEFjdGlvbj4KKyAgIDxQcm9maWxlQWN0aW9uCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIHNob3VsZFVzZUxhdW5jaFNjaGVtZUFyZ3NFbnYgPSAiWUVTIgorICAgICAgc2F2ZWRUb29sSWRlbnRpZmllciA9ICIiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIlJlbGVhc2UiPgorICAgICAgPEJ1aWxkYWJsZVByb2R1Y3RSdW5uYWJsZT4KKyAgICAgICAgIDxCdWlsZGFibGVSZWZlcmVuY2UKKyAgICAgICAgICAgIEJ1aWxkYWJsZUlkZW50aWZpZXIgPSAicHJpbWFyeSIKKyAgICAgICAgICAgIEJsdWVwcmludElkZW50aWZpZXIgPSAiMUE2M0JENzIxMzRGNUY2NzAwMkVERkI0IgorICAgICAgICAgICAgQnVpbGRhYmxlTmFtZSA9ICJ0cmVlcGFyc2VyIgorICAgICAgICAgICAgQmx1ZXByaW50TmFtZSA9ICJ0cmVlcGFyc2VyIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy90cmVlcmV3cml0ZS54Y3NjaGVtZSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL3RyZWVyZXdyaXRlLnhjc2NoZW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Yzg0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy90cmVlcmV3cml0ZS54Y3NjaGVtZQpAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNjaGVtZQorICAgdmVyc2lvbiA9ICIxLjMiPgorICAgPEJ1aWxkQWN0aW9uCisgICAgICBwYXJhbGxlbGl6ZUJ1aWxkYWJsZXMgPSAiWUVTIgorICAgICAgYnVpbGRJbXBsaWNpdERlcGVuZGVuY2llcyA9ICJZRVMiPgorICAgICAgPEJ1aWxkQWN0aW9uRW50cmllcz4KKyAgICAgICAgIDxCdWlsZEFjdGlvbkVudHJ5CisgICAgICAgICAgICBidWlsZEZvclRlc3RpbmcgPSAiWUVTIgorICAgICAgICAgICAgYnVpbGRGb3JSdW5uaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yUHJvZmlsaW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQXJjaGl2aW5nID0gIllFUyIKKyAgICAgICAgICAgIGJ1aWxkRm9yQW5hbHl6aW5nID0gIllFUyI+CisgICAgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDdGMTM0RjVGNzEwMDJFREZCNCIKKyAgICAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAidHJlZXJld3JpdGUiCisgICAgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInRyZWVyZXdyaXRlIgorICAgICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgICAgPC9CdWlsZEFjdGlvbkVudHJ5PgorICAgICAgPC9CdWlsZEFjdGlvbkVudHJpZXM+CisgICA8L0J1aWxkQWN0aW9uPgorICAgPFRlc3RBY3Rpb24KKyAgICAgIHNlbGVjdGVkRGVidWdnZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5EZWJ1Z2dlci5HREIiCisgICAgICBzZWxlY3RlZExhdW5jaGVySWRlbnRpZmllciA9ICJYY29kZS5EZWJ1Z2dlckZvdW5kYXRpb24uTGF1bmNoZXIuR0RCIgorICAgICAgc2hvdWxkVXNlTGF1bmNoU2NoZW1lQXJnc0VudiA9ICJZRVMiCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiRGVidWciPgorICAgICAgPFRlc3RhYmxlcz4KKyAgICAgIDwvVGVzdGFibGVzPgorICAgPC9UZXN0QWN0aW9uPgorICAgPExhdW5jaEFjdGlvbgorICAgICAgc2VsZWN0ZWREZWJ1Z2dlcklkZW50aWZpZXIgPSAiWGNvZGUuRGVidWdnZXJGb3VuZGF0aW9uLkRlYnVnZ2VyLkdEQiIKKyAgICAgIHNlbGVjdGVkTGF1bmNoZXJJZGVudGlmaWVyID0gIlhjb2RlLkRlYnVnZ2VyRm91bmRhdGlvbi5MYXVuY2hlci5HREIiCisgICAgICBkaXNwbGF5U2NhbGVJc0VuYWJsZWQgPSAiTk8iCisgICAgICBkaXNwbGF5U2NhbGUgPSAiMS4wMCIKKyAgICAgIGxhdW5jaFN0eWxlID0gIjAiCisgICAgICB1c2VDdXN0b21Xb3JraW5nRGlyZWN0b3J5ID0gIk5PIgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDdGMTM0RjVGNzEwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAidHJlZXJld3JpdGUiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInRyZWVyZXdyaXRlIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+CisgICAgICA8L0FkZGl0aW9uYWxPcHRpb25zPgorICAgPC9MYXVuY2hBY3Rpb24+CisgICA8UHJvZmlsZUFjdGlvbgorICAgICAgZGlzcGxheVNjYWxlSXNFbmFibGVkID0gIk5PIgorICAgICAgZGlzcGxheVNjYWxlID0gIjEuMDAiCisgICAgICBzaG91bGRVc2VMYXVuY2hTY2hlbWVBcmdzRW52ID0gIllFUyIKKyAgICAgIHNhdmVkVG9vbElkZW50aWZpZXIgPSAiIgorICAgICAgdXNlQ3VzdG9tV29ya2luZ0RpcmVjdG9yeSA9ICJOTyIKKyAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbiA9ICJSZWxlYXNlIj4KKyAgICAgIDxCdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICAgICAgICA8QnVpbGRhYmxlUmVmZXJlbmNlCisgICAgICAgICAgICBCdWlsZGFibGVJZGVudGlmaWVyID0gInByaW1hcnkiCisgICAgICAgICAgICBCbHVlcHJpbnRJZGVudGlmaWVyID0gIjFBNjNCRDdGMTM0RjVGNzEwMDJFREZCNCIKKyAgICAgICAgICAgIEJ1aWxkYWJsZU5hbWUgPSAidHJlZXJld3JpdGUiCisgICAgICAgICAgICBCbHVlcHJpbnROYW1lID0gInRyZWVyZXdyaXRlIgorICAgICAgICAgICAgUmVmZXJlbmNlZENvbnRhaW5lciA9ICJjb250YWluZXI6QU5UTFIueGNvZGVwcm9qIj4KKyAgICAgICAgIDwvQnVpbGRhYmxlUmVmZXJlbmNlPgorICAgICAgPC9CdWlsZGFibGVQcm9kdWN0UnVubmFibGU+CisgICA8L1Byb2ZpbGVBY3Rpb24+CisgICA8QW5hbHl6ZUFjdGlvbgorICAgICAgYnVpbGRDb25maWd1cmF0aW9uID0gIkRlYnVnIj4KKyAgIDwvQW5hbHl6ZUFjdGlvbj4KKyAgIDxBcmNoaXZlQWN0aW9uCisgICAgICBidWlsZENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKyAgICAgIHJldmVhbEFyY2hpdmVJbk9yZ2FuaXplciA9ICJZRVMiPgorICAgPC9BcmNoaXZlQWN0aW9uPgorPC9TY2hlbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy94Y3NjaGVtZW1hbmFnZW1lbnQucGxpc3QgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi54Y29kZXByb2oveGN1c2VyZGF0YS9hY29uZGl0LnhjdXNlcmRhdGFkL3hjc2NoZW1lcy94Y3NjaGVtZW1hbmFnZW1lbnQucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4ZDdhYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSLnhjb2RlcHJvai94Y3VzZXJkYXRhL2Fjb25kaXQueGN1c2VyZGF0YWQveGNzY2hlbWVzL3hjc2NoZW1lbWFuYWdlbWVudC5wbGlzdApAQCAtMCwwICsxLDEzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PlNjaGVtZVVzZXJTdGF0ZTwva2V5PgorCTxkaWN0PgorCQk8a2V5PkFOVExSLnhjc2NoZW1lPC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5vcmRlckhpbnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGtleT5BTlRMUlRlc3RzLnhjc2NoZW1lPC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5vcmRlckhpbnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGtleT5GdXp6eS54Y3NjaGVtZTwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+b3JkZXJIaW50PC9rZXk+CisJCQk8aW50ZWdlcj4zPC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxrZXk+TEwtc3RhcnQueGNzY2hlbWU8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5Pm9yZGVySGludDwva2V5PgorCQkJPGludGVnZXI+NjwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8a2V5PmNvbWJpbmVkLnhjc2NoZW1lPC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5vcmRlckhpbnQ8L2tleT4KKwkJCTxpbnRlZ2VyPjI8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGtleT5ob2lzdGVkUHJlZGljYXRlcy54Y3NjaGVtZTwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+b3JkZXJIaW50PC9rZXk+CisJCQk8aW50ZWdlcj40PC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxrZXk+bGV4ZXJ0ZXN0LXNpbXBsZS54Y3NjaGVtZTwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+b3JkZXJIaW50PC9rZXk+CisJCQk8aW50ZWdlcj41PC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxrZXk+cG9seWRpZmYueGNzY2hlbWU8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5Pm9yZGVySGludDwva2V5PgorCQkJPGludGVnZXI+NzwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8a2V5PnNjb3Blcy54Y3NjaGVtZTwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+b3JkZXJIaW50PC9rZXk+CisJCQk8aW50ZWdlcj44PC9pbnRlZ2VyPgorCQk8L2RpY3Q+CisJCTxrZXk+c2ltcGxlY1RyZWVQYXJzZXIueGNzY2hlbWU8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5Pm9yZGVySGludDwva2V5PgorCQkJPGludGVnZXI+OTwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCQk8a2V5PnRyZWVwYXJzZXIueGNzY2hlbWU8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5Pm9yZGVySGludDwva2V5PgorCQkJPGludGVnZXI+MTA8L2ludGVnZXI+CisJCTwvZGljdD4KKwkJPGtleT50cmVlcmV3cml0ZS54Y3NjaGVtZTwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+b3JkZXJIaW50PC9rZXk+CisJCQk8aW50ZWdlcj4xMTwvaW50ZWdlcj4KKwkJPC9kaWN0PgorCTwvZGljdD4KKwk8a2V5PlN1cHByZXNzQnVpbGRhYmxlQXV0b2NyZWF0aW9uPC9rZXk+CisJPGRpY3Q+CisJCTxrZXk+MUE2M0JDNjAxMzRGNURBQjAwMkVERkI0PC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5wcmltYXJ5PC9rZXk+CisJCQk8dHJ1ZS8+CisJCTwvZGljdD4KKwkJPGtleT4xQTYzQkQzMTEzNEY1RjFFMDAyRURGQjQ8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PnByaW1hcnk8L2tleT4KKwkJCTx0cnVlLz4KKwkJPC9kaWN0PgorCQk8a2V5PjFBNjNCRDNFMTM0RjVGMzYwMDJFREZCNDwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+cHJpbWFyeTwva2V5PgorCQkJPHRydWUvPgorCQk8L2RpY3Q+CisJCTxrZXk+MUE2M0JENEIxMzRGNUY0MzAwMkVERkI0PC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5wcmltYXJ5PC9rZXk+CisJCQk8dHJ1ZS8+CisJCTwvZGljdD4KKwkJPGtleT4xQTYzQkQ1ODEzNEY1RjREMDAyRURGQjQ8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PnByaW1hcnk8L2tleT4KKwkJCTx0cnVlLz4KKwkJPC9kaWN0PgorCQk8a2V5PjFBNjNCRDY1MTM0RjVGNUUwMDJFREZCNDwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+cHJpbWFyeTwva2V5PgorCQkJPHRydWUvPgorCQk8L2RpY3Q+CisJCTxrZXk+MUE2M0JENzIxMzRGNUY2NzAwMkVERkI0PC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5wcmltYXJ5PC9rZXk+CisJCQk8dHJ1ZS8+CisJCTwvZGljdD4KKwkJPGtleT4xQTYzQkQ3RjEzNEY1RjcxMDAyRURGQjQ8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PnByaW1hcnk8L2tleT4KKwkJCTx0cnVlLz4KKwkJPC9kaWN0PgorCQk8a2V5PjFBNjNCREQzMTM0RjYyMzMwMDJFREZCNDwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+cHJpbWFyeTwva2V5PgorCQkJPHRydWUvPgorCQk8L2RpY3Q+CisJCTxrZXk+MUE2M0JERkIxMzRGQjc1RTAwMkVERkI0PC9rZXk+CisJCTxkaWN0PgorCQkJPGtleT5wcmltYXJ5PC9rZXk+CisJCQk8dHJ1ZS8+CisJCTwvZGljdD4KKwkJPGtleT4xQUU3MjMxNzEzNEU4NjBCMDAxQzNGMzU8L2tleT4KKwkJPGRpY3Q+CisJCQk8a2V5PnByaW1hcnk8L2tleT4KKwkJCTx0cnVlLz4KKwkJPC9kaWN0PgorCQk8a2V5PjFBRTcyMzJDMTM0RTg2MEIwMDFDM0YzNTwva2V5PgorCQk8ZGljdD4KKwkJCTxrZXk+cHJpbWFyeTwva2V5PgorCQkJPHRydWUvPgorCQk8L2RpY3Q+CisJPC9kaWN0PgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSL0FOVExSLUluZm8ucGxpc3QgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi9BTlRMUi1JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGVkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi9BTlRMUi1JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPkFNS1MuJHtQUk9EVUNUX05BTUU6cmZjMTAzNGlkZW50aWZpZXJ9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Rk1XSzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MTwvc3RyaW5nPgorCTxrZXk+TlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0PC9rZXk+CisJPHN0cmluZz5Db3B5cmlnaHQgwqkgMjAxMSBBbGFuJ3MgTWFjaGluZVdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvc3RyaW5nPgorCTxrZXk+TlNQcmluY2lwYWxDbGFzczwva2V5PgorCTxzdHJpbmc+PC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIvQU5UTFItUHJlZml4LnBjaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSL0FOVExSLVByZWZpeC5wY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNjc4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSL0FOVExSLVByZWZpeC5wY2gKQEAgLTAsMCArMSw3IEBACisvLworLy8gUHJlZml4IGhlYWRlciBmb3IgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgJ0FOVExSJyB0YXJnZXQgaW4gdGhlICdBTlRMUicgcHJvamVjdAorLy8KKworI2lmZGVmIF9fT0JKQ19fCisgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIvZW4ubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUi9lbi5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzdiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFIvZW4ubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKQEAgLTAsMCArMSwyIEBACisvKiBMb2NhbGl6ZWQgdmVyc2lvbnMgb2YgSW5mby5wbGlzdCBrZXlzICovCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSVGVzdHMvQU5UTFJUZXN0cy1JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFJUZXN0cy9BTlRMUlRlc3RzLUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNGI2MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSVGVzdHMvQU5UTFJUZXN0cy1JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5lbjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+QU1LUy4ke1BST0RVQ1RfTkFNRTpyZmMxMDM0aWRlbnRpZmllcn08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkJOREw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjE8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL0FOVExSVGVzdHMtUHJlZml4LnBjaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSVGVzdHMvQU5UTFJUZXN0cy1QcmVmaXgucGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDVjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL0FOVExSVGVzdHMtUHJlZml4LnBjaApAQCAtMCwwICsxLDcgQEAKKy8vCisvLyBQcmVmaXggaGVhZGVyIGZvciBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSAnQU5UTFJUZXN0cycgdGFyZ2V0IGluIHRoZSAnQU5UTFJUZXN0cycgcHJvamVjdAorLy8KKworI2lmZGVmIF9fT0JKQ19fCisgICAgI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFJUZXN0cy9BTlRMUlRlc3RzLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL0FOVExSVGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI0NDU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFJUZXN0cy9BTlRMUlRlc3RzLmgKQEAgLTAsMCArMSwxNyBAQAorLy8KKy8vICBBTlRMUlRlc3RzLmgKKy8vICBBTlRMUlRlc3RzCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNC83LzExLgorLy8gIENvcHlyaWdodCAyMDExIEFsYW4ncyBNYWNoaW5lV29ya3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0IDxTZW5UZXN0aW5nS2l0L1NlblRlc3RpbmdLaXQuaD4KKworCitAaW50ZXJmYWNlIEFOVExSVGVzdHMgOiBTZW5UZXN0Q2FzZSB7CitAcHJpdmF0ZQorICAgIAorfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL0FOVExSVGVzdHMubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSL0FOVExSVGVzdHMvQU5UTFJUZXN0cy5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzg2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL0FOVExSVGVzdHMubQpAQCAtMCwwICsxLDI4IEBACisvLworLy8gIEFOVExSVGVzdHMubQorLy8gIEFOVExSVGVzdHMKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA0LzcvMTEuCisvLyAgQ29weXJpZ2h0IDIwMTEgQWxhbidzIE1hY2hpbmVXb3Jrcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgIkFOVExSVGVzdHMuaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJUZXN0cworCistICh2b2lkKXNldFVwCit7CisgICAgW3N1cGVyIHNldFVwXTsKKyAgICAKKyAgICAvLyBTZXQtdXAgY29kZSBoZXJlLgorfQorCistICh2b2lkKXRlYXJEb3duCit7CisgICAgLy8gVGVhci1kb3duIGNvZGUgaGVyZS4KKyAgICAKKyAgICBbc3VwZXIgdGVhckRvd25dOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUi9BTlRMUlRlc3RzL2VuLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFJUZXN0cy9lbi5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzdiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFIvQU5UTFJUZXN0cy9lbi5scHJvai9JbmZvUGxpc3Quc3RyaW5ncwpAQCAtMCwwICsxLDIgQEAKKy8qIExvY2FsaXplZCB2ZXJzaW9ucyBvZiBJbmZvLnBsaXN0IGtleXMgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlTWFwRWxlbWVudC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlTWFwRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTUxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VNYXBFbGVtZW50LmgKQEAgLTAsMCArMSw1MSBAQAorLy8KKy8vICBBTlRMUkJhc2VNYXBFbGVtZW50LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTGlua0Jhc2UuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VNYXBFbGVtZW50IDogQU5UTFJMaW5rQmFzZSB7CisgICAgTlNOdW1iZXIgKmluZGV4OworfQorCitAcHJvcGVydHkgKHJldGFpbikgTlNOdW1iZXIgKmluZGV4OworCisrIChpZCkgbmV3QU5UTFJCYXNlTWFwRWxlbWVudDsKKysgKGlkKSBuZXdBTlRMUkJhc2VNYXBFbGVtZW50V2l0aEluZGV4OihOU051bWJlciAqKWFuSWR4OworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhBbkluZGV4OihOU051bWJlciAqKWFuSWR4OworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZU1hcEVsZW1lbnQubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZU1hcEVsZW1lbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTk3Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlTWFwRWxlbWVudC5tCkBAIC0wLDAgKzEsOTUgQEAKKy8vCisvLyAgQU5UTFJCYXNlTWFwRWxlbWVudC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE2LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSQmFzZU1hcEVsZW1lbnQuaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJCYXNlTWFwRWxlbWVudAorCitAc3ludGhlc2l6ZSBpbmRleDsKKworKyAoQU5UTFJCYXNlTWFwRWxlbWVudCAqKW5ld0FOVExSQmFzZU1hcEVsZW1lbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUkJhc2VNYXBFbGVtZW50IGFsbG9jXSBpbml0XTsKK30KKworKyAoQU5UTFJCYXNlTWFwRWxlbWVudCAqKW5ld0FOVExSQmFzZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYU51bWJlcgoreworICAgIHJldHVybiBbW0FOVExSQmFzZU1hcEVsZW1lbnQgYWxsb2NdIGluaXRXaXRoQW5JbmRleDooTlNOdW1iZXIgKilhTnVtYmVyXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCApIHsKKyAgICAgICAgaW5kZXggPSBuaWw7CisgICAgfQorICAgIHJldHVybiAoc2VsZik7Cit9CisKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYU51bWJlcgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsICkgeworICAgICAgICBpbmRleCA9IGFOdW1iZXI7CisgICAgICAgIGlmICggaW5kZXggKSBbaW5kZXggcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIChzZWxmKTsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUkJhc2VNYXBFbGVtZW50IiApOworI2VuZGlmCisgICAgaWYgKCBpbmRleCApIFtpbmRleCByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJCYXNlTWFwRWxlbWVudCAqY29weTsKKyAgICAKKyAgICBjb3B5ID0gW3N1cGVyIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS5pbmRleCA9IGluZGV4OworICAgIHJldHVybiggY29weSApOworfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICByZXR1cm4gMTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorLSAoTlNJbnRlZ2VyKXNpemUKK3sKKyAgICByZXR1cm4oICBzaXplb2YoaW5kZXgpICk7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVJlY29nbml6ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVJlY29nbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZhODU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlUmVjb2duaXplci5oCkBAIC0wLDAgKzEsMTgwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisKKy8vIFRoaXMgaXMgYW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgbGV4ZXJzIGFuZCBwYXJzZXJzLgorCisjZGVmaW5lIEFOVExSX01FTU9fUlVMRV9GQUlMRUQgLTIKKyNkZWZpbmUgQU5UTFJfTUVNT19SVUxFX1VOS05PV04gLTEKKyNkZWZpbmUgQU5UTFJfSU5JVElBTF9GT0xMT1dfU1RBQ0tfU0laRSAxMDAKKworI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSQmFzZVJlY29nbml6ZXIgOiBOU09iamVjdCB7CisgICAgX19zdHJvbmcgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKnN0YXRlOyAgLy8gdGhlIHN0YXRlIG9mIHRoaXMgcmVjb2duaXplci4gTWlnaHQgYmUgc2hhcmVkIHdpdGggb3RoZXIgcmVjb2duaXplcnMsIGUuZy4gaW4gZ3JhbW1hciBpbXBvcnQgc2NlbmFyaW9zLgorICAgIF9fc3Ryb25nIE5TU3RyaW5nICpncmFtbWFyRmlsZU5hbWU7ICAgICAgICAgIC8vIHdoZXJlIGRpZCB0aGUgZ3JhbW1hciBjb21lIGZyb20uIGZpbGxlZCBpbiBieSBjb2RlZ2VuZXJhdGlvbgorICAgIF9fc3Ryb25nIE5TU3RyaW5nICpzb3VyY2VOYW1lOworICAgIF9fc3Ryb25nIEFNdXRhYmxlQXJyYXkgKnRva2VuTmFtZXM7Cit9CisKKysgKHZvaWQpIGluaXRpYWxpemU7CisKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcldpdGhSdWxlTGVuOihOU0ludGVnZXIpYUxlbjsKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcjooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKysgKEFNdXRhYmxlQXJyYXkgKilnZXRUb2tlbk5hbWVzOworKyAodm9pZClzZXRUb2tlbk5hbWVzOihOU0FycmF5ICopYVRva05hbUFycmF5OworKyAodm9pZClzZXRHcmFtbWFyRmlsZU5hbWU6KE5TU3RyaW5nICopYUZpbGVOYW1lOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy8vIHNpbXBsZSBhY2Nlc3NvcnMKKy0gKE5TSW50ZWdlcikgZ2V0QmFja3RyYWNraW5nTGV2ZWw7CistICh2b2lkKSBzZXRCYWNrdHJhY2tpbmdMZXZlbDooTlNJbnRlZ2VyKSBsZXZlbDsKKworLSAoQk9PTCkgZ2V0RmFpbGVkOworLSAodm9pZCkgc2V0RmFpbGVkOiAoQk9PTCkgZmxhZzsKKworLSAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgZ2V0U3RhdGU7CistICh2b2lkKSBzZXRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgdGhlU3RhdGU7CisKKy8vIHJlc2V0IHRoaXMgcmVjb2duaXplciAtIG1pZ2h0IGJlIGV4dGVuZGVkIGJ5IGNvZGVnZW5lcmF0aW9uL2dyYW1tYXIKKy0gKHZvaWQpIHJlc2V0OworCisvKiogTWF0Y2ggbmVlZHMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCwgd2hpY2ggZ2V0cyBwdXQKKyAqICBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKyAqICBhbmQgdHJlZSBwYXJzZXJzIG5lZWQgdG8gcmV0dXJuIGRpZmZlcmVudCBvYmplY3RzLiBSYXRoZXIgdGhhbiB0ZXN0CisgKiAgZm9yIGlucHV0IHN0cmVhbSB0eXBlIG9yIGNoYW5nZSB0aGUgSW50U3RyZWFtIGludGVyZmFjZSwgSSB1c2UKKyAqICBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorICogIGlucHV0IHN5bWJvbCBpcy4KKyAqIAorICogIFRoaXMgaXMgaWdub3JlZCBmb3IgbGV4ZXJzLgorICovCistIChpZCkgaW5wdXQ7CisKKy0gKHZvaWQpc2tpcDsKKworLy8gZG8gYWN0dWFsIG1hdGNoaW5nIG9mIHRva2Vucy9jaGFyYWN0ZXJzCistIChpZCkgbWF0Y2g6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CistICh2b2lkKSBtYXRjaEFueTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CistIChCT09MKSBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVG9rZW5UeXBlOihOU0ludGVnZXIpIHR0eXBlOworLSAoQk9PTCkgbWlzbWF0Y2hJc01pc3NpbmdUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdzsKKworLy8gZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeQorLSAodm9pZCkgcmVwb3J0RXJyb3I6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworLSAodm9pZCkgZGlzcGxheVJlY29nbml0aW9uRXJyb3I6KEFNdXRhYmxlQXJyYXkgKil0aGVUb2tOYW1zIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldEVycm9yTWVzc2FnZTooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUgVG9rZW5OYW1lczooQU11dGFibGVBcnJheSAqKXRoZVRva05hbXM7CistIChOU0ludGVnZXIpIGdldE51bWJlck9mU3ludGF4RXJyb3JzOworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldFRva2VuRXJyb3JEaXNwbGF5OihpZDxBTlRMUlRva2VuPil0OworLSAodm9pZCkgZW1pdEVycm9yTWVzc2FnZTooTlNTdHJpbmcgKiltc2c7CistICh2b2lkKSByZWNvdmVyOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillOworCisvLyBiZWdpbiBob29rcyBmb3IgZGVidWdnZXIKKy0gKHZvaWQpIGJlZ2luUmVzeW5jOworLSAodm9pZCkgZW5kUmVzeW5jOworLy8gZW5kIGhvb2tzIGZvciBkZWJ1Z2dlcgorCisvLyBjb21wdXRlIHRoZSBiaXRzZXRzIG5lY2Vzc2FyeSB0byBkbyBtYXRjaGluZyBhbmQgcmVjb3ZlcnkKKy0gKEFOVExSQml0U2V0ICopY29tcHV0ZUVycm9yUmVjb3ZlcnlTZXQ7CistIChBTlRMUkJpdFNldCAqKWNvbXB1dGVDb250ZXh0U2Vuc2l0aXZlUnVsZUZPTExPVzsKKy0gKEFOVExSQml0U2V0ICopY29tYmluZUZvbGxvd3M6KEJPT0wpIGV4YWN0OworCistIChpZDxBTlRMUlRva2VuPikgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW5UeXBlOihOU0ludGVnZXIpdHR5cGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistIChpZDxBTlRMUlRva2VuPilyZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKSBnZXRNaXNzaW5nU3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgIFRva2VuVHlwZTooTlNJbnRlZ2VyKSBleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CisKKy8vIGhlbHBlciBtZXRob2RzIGZvciByZWNvdmVyeS4gdHJ5IHRvIHJlc3luYyBzb21ld2hlcmUKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbFRUeXBlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBUb2tlblR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpIGNvbnN1bWVVbnRpbEZvbGxvdzooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKWJpdFNldDsKKy0gKHZvaWQpIHB1c2hGb2xsb3c6KEFOVExSQml0U2V0ICopZnNldDsKKy0gKEFOVExSQml0U2V0ICopcG9wRm9sbG93OworCisvLyB0byBiZSB1c2VkIGJ5IHRoZSBkZWJ1Z2dlciB0byBkbyByZXBvcnRpbmcuIG1heWJlIGhvb2sgaW4gaW5jcmVtZW50YWwgc3R1ZmYgaGVyZSwgdG9vLgorLSAoQU11dGFibGVBcnJheSAqKSBnZXRSdWxlSW52b2NhdGlvblN0YWNrOworLSAoQU11dGFibGVBcnJheSAqKSBnZXRSdWxlSW52b2NhdGlvblN0YWNrOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pemVyOihOU1N0cmluZyAqKXJlY29nbml6ZXJDbGFzc05hbWU7CisKKy0gKEFNdXRhYmxlQXJyYXkgKikgZ2V0VG9rZW5OYW1lczsKKy0gKE5TU3RyaW5nICopZ2V0R3JhbW1hckZpbGVOYW1lOworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lOworLSAoQU11dGFibGVBcnJheSAqKSB0b1N0cmluZ3M6KE5TQXJyYXkgKil0b2tlbnM7CisvLyBzdXBwb3J0IGZvciBtZW1vaXphdGlvbgorLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb246KE5TSW50ZWdlcilydWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoQk9PTCkgYWxyZWFkeVBhcnNlZFJ1bGU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKy0gKHZvaWQpIG1lbW9pemU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKKyAgICAgICAgU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRSdWxlTWVtb2l6YXRpb25DYWNoZVNpemU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKy0gKHZvaWQpdHJhY2VPdXQ6KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbDsKKworCisvLyBzdXBwb3J0IGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gdGhlc2UgYXJlIGNhbGxlZCBpbmRpcmVjdGx5IHRvIHN1cHBvcnQgZnVua3kgc3R1ZmYgaW4gZ3JhbW1hcnMsCisvLyBsaWtlIHN1cHBseWluZyBzZWxlY3RvcnMgaW5zdGVhZCBvZiB3cml0aW5nIGNvZGUgZGlyZWN0bHkgaW50byB0aGUgYWN0aW9ucyBvZiB0aGUgZ3JhbW1hci4KKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50OworLy8gc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworQHByb3BlcnR5IChyZXRhaW4pIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICpzdGF0ZTsKK0Bwcm9wZXJ0eSAocmV0YWluKSBOU1N0cmluZyAqZ3JhbW1hckZpbGVOYW1lOworQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICpzb3VyY2VOYW1lOworQHByb3BlcnR5IChyZXRhaW4pIEFNdXRhYmxlQXJyYXkgKnRva2VuTmFtZXM7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVJlY29nbml6ZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVJlY29nbml6ZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzNlMGRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlUmVjb2duaXplci5tCkBAIC0wLDAgKzEsMTEyOSBAQAorLy8KKy8vICBBTlRMUkJhc2VSZWNvZ25pemVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJIYXNoUnVsZS5oIgorI2ltcG9ydCAiQU5UTFJSdWxlTWVtby5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJNYXAuaCIKKworZXh0ZXJuIE5TSW50ZWdlciBkZWJ1ZzsKKworQGltcGxlbWVudGF0aW9uIEFOVExSQmFzZVJlY29nbml6ZXIKKworc3RhdGljIEFNdXRhYmxlQXJyYXkgKl90b2tlbk5hbWVzOworc3RhdGljIE5TU3RyaW5nICpfZ3JhbW1hckZpbGVOYW1lOworc3RhdGljIE5TU3RyaW5nICpORVhUX1RPS0VOX1JVTEVfTkFNRTsKKworQHN5bnRoZXNpemUgc3RhdGU7CitAc3ludGhlc2l6ZSBncmFtbWFyRmlsZU5hbWU7CisvL0BzeW50aGVzaXplIGZhaWxlZDsKK0BzeW50aGVzaXplIHNvdXJjZU5hbWU7CisvL0BzeW50aGVzaXplIG51bWJlck9mU3ludGF4RXJyb3JzOworQHN5bnRoZXNpemUgdG9rZW5OYW1lczsKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIE5FWFRfVE9LRU5fUlVMRV9OQU1FID0gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6QCJuZXh0VG9rZW4iXTsKKyAgICBbTkVYVF9UT0tFTl9SVUxFX05BTUUgcmV0YWluXTsKK30KKworKyAoQU5UTFJCYXNlUmVjb2duaXplciAqKSBuZXdBTlRMUkJhc2VSZWNvZ25pemVyCit7CisgICAgcmV0dXJuIFtbQU5UTFJCYXNlUmVjb2duaXplciBhbGxvY10gaW5pdF07Cit9CisKKysgKEFOVExSQmFzZVJlY29nbml6ZXIgKikgbmV3QU5UTFJCYXNlUmVjb2duaXplcldpdGhSdWxlTGVuOihOU0ludGVnZXIpYUxlbgoreworICAgIHJldHVybiBbW0FOVExSQmFzZVJlY29nbml6ZXIgYWxsb2NdIGluaXRXaXRoTGVuOmFMZW5dOworfQorCisrIChBTlRMUkJhc2VSZWNvZ25pemVyICopIG5ld0FOVExSQmFzZVJlY29nbml6ZXI6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopYVN0YXRlCit7CisJcmV0dXJuIFtbQU5UTFJCYXNlUmVjb2duaXplciBhbGxvY10gaW5pdFdpdGhTdGF0ZTphU3RhdGVdOworfQorCisrIChBTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5OYW1lcworeworICAgIHJldHVybiBfdG9rZW5OYW1lczsKK30KKworKyAodm9pZClzZXRUb2tlbk5hbWVzOihBTXV0YWJsZUFycmF5ICopdGhlVG9rTmFtcworeworICAgIGlmICggX3Rva2VuTmFtZXMgIT0gdGhlVG9rTmFtcyApIHsKKyAgICAgICAgaWYgKCBfdG9rZW5OYW1lcyApIFtfdG9rZW5OYW1lcyByZWxlYXNlXTsKKyAgICAgICAgW3RoZVRva05hbXMgcmV0YWluXTsKKyAgICB9CisgICAgX3Rva2VuTmFtZXMgPSB0aGVUb2tOYW1zOworfQorCisrICh2b2lkKXNldEdyYW1tYXJGaWxlTmFtZTooTlNTdHJpbmcgKilhRmlsZU5hbWUKK3sKKyAgICBpZiAoIF9ncmFtbWFyRmlsZU5hbWUgIT0gYUZpbGVOYW1lICkgeworICAgICAgICBpZiAoIF9ncmFtbWFyRmlsZU5hbWUgKSBbX2dyYW1tYXJGaWxlTmFtZSByZWxlYXNlXTsKKyAgICAgICAgW2FGaWxlTmFtZSByZXRhaW5dOworICAgIH0KKyAgICBbX2dyYW1tYXJGaWxlTmFtZSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBuaWwpIHsKKyAgICAgICAgICAgIHN0YXRlID0gW1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZV0gcmV0YWluXTsKKyAgICAgICAgfQorICAgICAgICB0b2tlbk5hbWVzID0gX3Rva2VuTmFtZXM7CisgICAgICAgIGlmICggdG9rZW5OYW1lcyApIFt0b2tlbk5hbWVzIHJldGFpbl07CisgICAgICAgIGdyYW1tYXJGaWxlTmFtZSA9IF9ncmFtbWFyRmlsZU5hbWU7CisgICAgICAgIGlmICggZ3JhbW1hckZpbGVOYW1lICkgW2dyYW1tYXJGaWxlTmFtZSByZXRhaW5dOworICAgICAgICBzdGF0ZS5fZnNwID0gLTE7CisgICAgICAgIHN0YXRlLmVycm9yUmVjb3ZlcnkgPSBOTzsJCS8vIGFyZSB3ZSByZWNvdmVyaW5nPworICAgICAgICBzdGF0ZS5sYXN0RXJyb3JJbmRleCA9IC0xOworICAgICAgICBzdGF0ZS5mYWlsZWQgPSBOTzsJCQkJLy8gaW5kaWNhdGUgdGhhdCBzb21lIG1hdGNoIGZhaWxlZAorICAgICAgICBzdGF0ZS5zeW50YXhFcnJvcnMgPSAwOworICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcgPSAwOwkJCS8vIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IC0xOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoTGVuOihOU0ludGVnZXIpYUxlbgoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBuaWwpIHsKKyAgICAgICAgICAgIHN0YXRlID0gW1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOmFMZW5dIHJldGFpbl07CisgICAgICAgIH0KKyAgICAgICAgdG9rZW5OYW1lcyA9IF90b2tlbk5hbWVzOworICAgICAgICBpZiAoIHRva2VuTmFtZXMgKSBbdG9rZW5OYW1lcyByZXRhaW5dOworICAgICAgICBncmFtbWFyRmlsZU5hbWUgPSBfZ3JhbW1hckZpbGVOYW1lOworICAgICAgICBpZiAoIGdyYW1tYXJGaWxlTmFtZSApIFtncmFtbWFyRmlsZU5hbWUgcmV0YWluXTsKKyAgICAgICAgc3RhdGUuX2ZzcCA9IC0xOworICAgICAgICBzdGF0ZS5lcnJvclJlY292ZXJ5ID0gTk87CQkvLyBhcmUgd2UgcmVjb3ZlcmluZz8KKyAgICAgICAgc3RhdGUubGFzdEVycm9ySW5kZXggPSAtMTsKKyAgICAgICAgc3RhdGUuZmFpbGVkID0gTk87CQkJCS8vIGluZGljYXRlIHRoYXQgc29tZSBtYXRjaCBmYWlsZWQKKyAgICAgICAgc3RhdGUuc3ludGF4RXJyb3JzID0gMDsKKyAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nID0gMDsJCQkvLyB0aGUgbGV2ZWwgb2YgYmFja3RyYWNraW5nCisgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZQoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisJCXN0YXRlID0gYVN0YXRlOworICAgICAgICBpZiAoc3RhdGUgPT0gbmlsKSB7CisgICAgICAgICAgICBzdGF0ZSA9IFtBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZV07CisgICAgICAgIH0KKyAgICAgICAgW3N0YXRlIHJldGFpbl07CisgICAgICAgIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsKKyAgICAgICAgaWYgKCB0b2tlbk5hbWVzICkgW3Rva2VuTmFtZXMgcmV0YWluXTsKKyAgICAgICAgZ3JhbW1hckZpbGVOYW1lID0gX2dyYW1tYXJGaWxlTmFtZTsKKyAgICAgICAgaWYgKCBncmFtbWFyRmlsZU5hbWUgKSBbZ3JhbW1hckZpbGVOYW1lIHJldGFpbl07CisgICAgICAgIHN0YXRlLl9mc3AgPSAtMTsKKyAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IE5POwkJLy8gYXJlIHdlIHJlY292ZXJpbmc/CisgICAgICAgIHN0YXRlLmxhc3RFcnJvckluZGV4ID0gLTE7CisgICAgICAgIHN0YXRlLmZhaWxlZCA9IE5POwkJCQkvLyBpbmRpY2F0ZSB0aGF0IHNvbWUgbWF0Y2ggZmFpbGVkCisgICAgICAgIHN0YXRlLnN5bnRheEVycm9ycyA9IDA7CisgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZyA9IDA7CQkJLy8gdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZworICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisJfQorCXJldHVybiBzZWxmOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJCYXNlUmVjb2duaXplciIgKTsKKyNlbmRpZgorCWlmICggZ3JhbW1hckZpbGVOYW1lICkgW2dyYW1tYXJGaWxlTmFtZSByZWxlYXNlXTsKKwlpZiAoIHRva2VuTmFtZXMgKSBbdG9rZW5OYW1lcyByZWxlYXNlXTsKKwlpZiAoIHN0YXRlICkgW3N0YXRlIHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLy8gcmVzZXQgdGhlIHJlY29nbml6ZXIgdG8gdGhlIGluaXRpYWwgc3RhdGUuIGRvZXMgbm90IHRvdWNoIHRoZSB0b2tlbiBzb3VyY2UhCisvLyB0aGlzIGNhbiBiZSBleHRlbmRlZCBieSB0aGUgZ3JhbW1hciB3cml0ZXIgdG8gcmVzZXQgY3VzdG9tIGl2YXJzCistICh2b2lkKSByZXNldAoreworICAgIGlmICggc3RhdGUgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuOyAKKyAgICBpZiAoIHN0YXRlLmZvbGxvd2luZyAhPSBuaWwgKSB7CisgICAgICAgIGlmICggW3N0YXRlLmZvbGxvd2luZyBjb3VudF0gKQorICAgICAgICAgICAgW3N0YXRlLmZvbGxvd2luZyByZW1vdmVBbGxPYmplY3RzXTsKKyAgICB9CisgICAgc3RhdGUuX2ZzcCA9IC0xOworICAgIHN0YXRlLmVycm9yUmVjb3ZlcnkgPSBOTzsJCS8vIGFyZSB3ZSByZWNvdmVyaW5nPworICAgIHN0YXRlLmxhc3RFcnJvckluZGV4ID0gLTE7CisgICAgc3RhdGUuZmFpbGVkID0gTk87CQkJCS8vIGluZGljYXRlIHRoYXQgc29tZSBtYXRjaCBmYWlsZWQKKyAgICBzdGF0ZS5zeW50YXhFcnJvcnMgPSAwOworICAgIHN0YXRlLmJhY2t0cmFja2luZyA9IDA7CQkJLy8gdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZworICAgIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSAtMTsKKyAgICBpZiAoIHN0YXRlLnJ1bGVNZW1vICE9IG5pbCApIHsKKyAgICAgICAgaWYgKCBbc3RhdGUucnVsZU1lbW8gY291bnRdICkKKyAgICAgICAgICAgIFtzdGF0ZS5ydWxlTWVtbyByZW1vdmVBbGxPYmplY3RzXTsKKyAgICB9Cit9CisKKy0gKEJPT0wpIGdldEZhaWxlZAoreworCXJldHVybiBbc3RhdGUgZ2V0RmFpbGVkXTsKK30KKworLSAodm9pZCkgc2V0RmFpbGVkOihCT09MKWZsYWcKK3sKKwlbc3RhdGUgc2V0RmFpbGVkOmZsYWddOworfQorCistIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBnZXRTdGF0ZQoreworCXJldHVybiBzdGF0ZTsKK30KKworLSAodm9pZCkgc2V0U3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIHRoZVN0YXRlCit7CisJaWYgKHN0YXRlICE9IHRoZVN0YXRlKSB7CisJCWlmICggc3RhdGUgKSBbc3RhdGUgcmVsZWFzZV07CisJCXN0YXRlID0gdGhlU3RhdGU7CisJCVtzdGF0ZSByZXRhaW5dOworCX0KK30KKworLSAoaWQpaW5wdXQKK3sKKyAgICByZXR1cm4gbmlsOyAvLyBNdXN0IGJlIG92ZXJyaWRlbiBpbiBpbmhlcml0aW5nIGNsYXNzCit9CisKKy0gKHZvaWQpc2tpcCAvLyBvdmVycmlkZSBpbiBpbmhlcml0aW5nIGNsYXNzCit7CisgICAgcmV0dXJuOworfQorCistKGlkKSBtYXRjaDooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVG9rZW5UeXBlOihOU0ludGVnZXIpdHR5cGUgRm9sbG93OihBTlRMUkJpdFNldCAqKWZvbGxvdworeworCWlkIG1hdGNoZWRTeW1ib2wgPSBbc2VsZiBnZXRDdXJyZW50SW5wdXRTeW1ib2w6YW5JbnB1dF07CisJaWYgKFthbklucHV0IExBOjFdID09IHR0eXBlKSB7CisJCVthbklucHV0IGNvbnN1bWVdOworCQlzdGF0ZS5lcnJvclJlY292ZXJ5ID0gTk87CisJCXN0YXRlLmZhaWxlZCA9IE5POworCQlyZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKwl9CisJaWYgKHN0YXRlLmJhY2t0cmFja2luZyA+IDApIHsKKwkJc3RhdGUuZmFpbGVkID0gWUVTOworCQlyZXR1cm4gbWF0Y2hlZFN5bWJvbDsKKwl9CisJbWF0Y2hlZFN5bWJvbCA9IFtzZWxmIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuOmFuSW5wdXQgVG9rZW5UeXBlOnR0eXBlIEZvbGxvdzpmb2xsb3ddOworCXJldHVybiBtYXRjaGVkU3ltYm9sOworfQorCistKHZvaWQpIG1hdGNoQW55OihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworICAgIHN0YXRlLmVycm9yUmVjb3ZlcnkgPSBOTzsKKyAgICBzdGF0ZS5mYWlsZWQgPSBOTzsKKyAgICBbYW5JbnB1dCBjb25zdW1lXTsKK30KKworLShCT09MKSBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVG9rZW5UeXBlOihOU0ludGVnZXIpdHR5cGUKK3sKKyAgICByZXR1cm4gW2FuSW5wdXQgTEE6Ml0gPT0gdHR5cGU7Cit9CisKKy0oQk9PTCkgbWlzbWF0Y2hJc01pc3NpbmdUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgRm9sbG93OihBTlRMUkJpdFNldCAqKSBmb2xsb3cKK3sKKyAgICBpZiAoIGZvbGxvdyA9PSBuaWwgKSB7CisgICAgICAgIC8vIHdlIGhhdmUgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvbGxvdzsgd2UgY2FuIG9ubHkgY29uc3VtZQorICAgICAgICAvLyBhIHNpbmdsZSB0b2tlbiBhbmQgaG9wZSBmb3IgdGhlIGJlc3QKKyAgICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICAvLyBjb21wdXRlIHdoYXQgY2FuIGZvbGxvdyB0aGlzIGdyYW1tYXIgZWxlbWVudCByZWZlcmVuY2UKKyAgICBpZiAoIFtmb2xsb3cgbWVtYmVyOkFOVExSVG9rZW5UeXBlRU9SXSApIHsKKyAgICAgICAgQU5UTFJCaXRTZXQgKnZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlID0gW3NlbGYgY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XXTsKKyAgICAgICAgZm9sbG93ID0gW2ZvbGxvdyBvcjp2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZV07CisgICAgICAgIGlmICggc3RhdGUuX2ZzcCA+PSAwICkgeyAvLyByZW1vdmUgRU9SIGlmIHdlJ3JlIG5vdCB0aGUgc3RhcnQgc3ltYm9sCisgICAgICAgICAgICBbZm9sbG93IHJlbW92ZTooQU5UTFJUb2tlblR5cGVFT1IpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBpZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIgc2V0CisgICAgLy8gdGhlbiB3ZSBrbm93IHdlJ3JlIG1pc3NpbmcgYSB0b2tlbjsgZXJyb3IgcmVjb3ZlcnkgaXMgZnJlZSB0bworICAgIC8vICJpbnNlcnQiIHRoZSBtaXNzaW5nIHRva2VuCisgICAgCisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInZpYWJsZSB0b2tlbnM9Iitmb2xsb3cudG9TdHJpbmcoZ2V0VG9rZW5OYW1lcygpKSk7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxUKDEpPSIrKChUb2tlblN0cmVhbSlpbnB1dCkuTFQoMSkpOworICAgIAorICAgIC8vIEJpdFNldCBjYW5ub3QgaGFuZGxlIG5lZ2F0aXZlIG51bWJlcnMgbGlrZSAtMSAoRU9GKSBzbyBJIGxlYXZlIEVPUgorICAgIC8vIGluIGZvbGxvdyBzZXQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmFsbCBvZiB0aGUgc3RhcnQgc3ltYm9sIGlzCisgICAgLy8gaW4gdGhlIHNldCAoRU9GIGNhbiBmb2xsb3cpLgorICAgIGlmICggW2ZvbGxvdyBtZW1iZXI6W2FuSW5wdXQgTEE6MV1dIHx8IFtmb2xsb3cgbWVtYmVyOkFOVExSVG9rZW5UeXBlRU9SXSApIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxUKDEpPT0iKygoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpKyIgaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgZm9sbG93czsgaW5zZXJ0aW5nLi4uIik7CisgICAgICAgIHJldHVybiBZRVM7CisgICAgfQorICAgIHJldHVybiBOTzsKK30KKworLyoqIFJlcG9ydCBhIHJlY29nbml0aW9uIHByb2JsZW0uCisgKgorICogIFRoaXMgbWV0aG9kIHNldHMgZXJyb3JSZWNvdmVyeSB0byBpbmRpY2F0ZSB0aGUgcGFyc2VyIGlzIHJlY292ZXJpbmcKKyAqICBub3QgcGFyc2luZy4gIE9uY2UgaW4gcmVjb3ZlcnkgbW9kZSwgbm8gZXJyb3JzIGFyZSBnZW5lcmF0ZWQuCisgKiAgVG8gZ2V0IG91dCBvZiByZWNvdmVyeSBtb2RlLCB0aGUgcGFyc2VyIG11c3Qgc3VjY2Vzc2Z1bGx5IG1hdGNoCisgKiAgYSB0b2tlbiAoYWZ0ZXIgYSByZXN5bmMpLiAgU28gaXQgd2lsbCBnbzoKKyAqCisgKiAJCTEuIGVycm9yIG9jY3VycworICogCQkyLiBlbnRlciByZWNvdmVyeSBtb2RlLCByZXBvcnQgZXJyb3IKKyAqIAkJMy4gY29uc3VtZSB1bnRpbCB0b2tlbiBmb3VuZCBpbiByZXN5bmNoIHNldAorICogCQk0LiB0cnkgdG8gcmVzdW1lIHBhcnNpbmcKKyAqIAkJNS4gbmV4dCBtYXRjaCgpIHdpbGwgcmVzZXQgZXJyb3JSZWNvdmVyeSBtb2RlCisgKgorICogIElmIHlvdSBvdmVycmlkZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSBzeW50YXhFcnJvcnMgaWYgeW91IGNhcmUgYWJvdXQgdGhhdC4KKyAqLworLSh2b2lkKSByZXBvcnRFcnJvcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKSBlCit7CisgICAgLy8gaWYgd2UndmUgYWxyZWFkeSByZXBvcnRlZCBhbiBlcnJvciBhbmQgaGF2ZSBub3QgbWF0Y2hlZCBhIHRva2VuCisgICAgLy8geWV0IHN1Y2Nlc3NmdWxseSwgZG9uJ3QgcmVwb3J0IGFueSBlcnJvcnMuCisgICAgaWYgKCBzdGF0ZS5lcnJvclJlY292ZXJ5ICkgeworICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnQoIltTUFVSSU9VU10gIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUuc3ludGF4RXJyb3JzKys7IC8vIGRvbid0IGNvdW50IHNwdXJpb3VzCisgICAgc3RhdGUuZXJyb3JSZWNvdmVyeSA9IFlFUzsKKyAgICAKKyAgICBbc2VsZiBkaXNwbGF5UmVjb2duaXRpb25FcnJvcjpbc2VsZiBnZXRUb2tlbk5hbWVzXSBFeGNlcHRpb246ZV07Cit9CisKKy0odm9pZCkgZGlzcGxheVJlY29nbml0aW9uRXJyb3I6KEFNdXRhYmxlQXJyYXkgKil0aGVUb2tOYW1zIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKK3sKKyAgICBOU1N0cmluZyAqaGRyID0gW3NlbGYgZ2V0RXJyb3JIZWFkZXI6ZV07CisgICAgTlNTdHJpbmcgKm1zZyA9IFtzZWxmIGdldEVycm9yTWVzc2FnZTplIFRva2VuTmFtZXM6dGhlVG9rTmFtc107CisgICAgW3NlbGYgZW1pdEVycm9yTWVzc2FnZTpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiAlQCAlQCIsIGhkciwgbXNnXV07Cit9CisKKy8qKiBXaGF0IGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIHZhcmlvdXMKKyAqICBleGNlcHRpb24gdHlwZXM/CisgKgorICogIE5vdCB2ZXJ5IG9iamVjdC1vcmllbnRlZCBjb2RlLCBidXQgSSBsaWtlIGhhdmluZyBhbGwgZXJyb3IgbWVzc2FnZQorICogIGdlbmVyYXRpb24gd2l0aGluIG9uZSBtZXRob2QgcmF0aGVyIHRoYW4gc3ByZWFkIGFtb25nIGFsbCBvZiB0aGUKKyAqICBleGNlcHRpb24gY2xhc3Nlcy4gVGhpcyBhbHNvIG1ha2VzIGl0IG11Y2ggZWFzaWVyIGZvciB0aGUgZXhjZXB0aW9uCisgKiAgaGFuZGxpbmcgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgZG8gbm90IGhhdmUgdG8gaGF2ZSBwb2ludGVycyBiYWNrCisgKiAgdG8gdGhpcyBvYmplY3QgdG8gYWNjZXNzIHV0aWxpdHkgcm91dGluZXMgYW5kIHNvIG9uLiBBbHNvLCBjaGFuZ2luZworICogIHRoZSBtZXNzYWdlIGZvciBhbiBleGNlcHRpb24gdHlwZSB3b3VsZCBiZSBkaWZmaWN1bHQgYmVjYXVzZSB5b3UKKyAqICB3b3VsZCBoYXZlIHRvIHN1YmNsYXNzaW5nIGV4Y2VwdGlvbiwgYnV0IHRoZW4gc29tZWhvdyBnZXQgQU5UTFIKKyAqICB0byBtYWtlIHRob3NlIGtpbmRzIG9mIGV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuCisgKiAgVGhpcyBsb29rcyB3ZWlyZCwgYnV0IHRydXN0IG1lLS1pdCBtYWtlcyB0aGUgbW9zdCBzZW5zZSBpbiB0ZXJtcworICogIG9mIGZsZXhpYmlsaXR5LgorICoKKyAqICBGb3IgZ3JhbW1hciBkZWJ1Z2dpbmcsIHlvdSB3aWxsIHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyB0byBhZGQKKyAqICBtb3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YWNrIGZyYW1lIHdpdGgKKyAqICBnZXRSdWxlSW52b2NhdGlvblN0YWNrKGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIGFuZCwKKyAqICBmb3Igbm8gdmlhYmxlIGFsdHMsIHRoZSBkZWNpc2lvbiBkZXNjcmlwdGlvbiBhbmQgc3RhdGUgZXRjLi4uCisgKgorICogIE92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBtZXNzYWdlIGdlbmVyYXRlZCBmb3Igb25lIG9yIG1vcmUKKyAqICBleGNlcHRpb24gdHlwZXMuCisgKi8KKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSBUb2tlbk5hbWVzOihBTXV0YWJsZUFycmF5ICopdGhlVG9rTmFtcworeworICAgIC8vIE5TU3RyaW5nICptc2cgPSBbZSBnZXRNZXNzYWdlXTsKKyAgICBOU1N0cmluZyAqbXNnOworICAgIGlmICggW2UgaXNLaW5kT2ZDbGFzczpbQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIGNsYXNzXV0gKSB7CisgICAgICAgIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiAqdXRlID0gKEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiAqKWU7CisgICAgICAgIE5TU3RyaW5nICp0b2tlbk5hbWU9QCI8dW5rbm93bj4iOworICAgICAgICBpZiAoIHV0ZS5leHBlY3RpbmcgPT0gQU5UTFJUb2tlblR5cGVFT0YgKSB7CisgICAgICAgICAgICB0b2tlbk5hbWUgPSBAIkVPRiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0b2tlbk5hbWUgPSAoTlNTdHJpbmcgKilbdGhlVG9rTmFtcyBvYmplY3RBdEluZGV4OnV0ZS5leHBlY3RpbmddOworICAgICAgICB9CisgICAgICAgIG1zZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiZXh0cmFuZW91cyBpbnB1dCAlQCBleHBlY3RpbmcgJUAiLCBbc2VsZiBnZXRUb2tlbkVycm9yRGlzcGxheTpbdXRlIGdldFVuZXhwZWN0ZWRUb2tlbl1dLAorICAgICAgICAgICAgICAgdG9rZW5OYW1lXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtlIGlzS2luZE9mQ2xhc3M6W0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uIGNsYXNzXSBdICkgeworICAgICAgICBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbiAqbXRlID0gKEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uICopZTsKKyAgICAgICAgTlNTdHJpbmcgKnRva2VuTmFtZT1AIjx1bmtub3duPiI7CisgICAgICAgIGlmICggbXRlLmV4cGVjdGluZz09IEFOVExSVG9rZW5UeXBlRU9GICkgeworICAgICAgICAgICAgdG9rZW5OYW1lID0gQCJFT0YiOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdG9rZW5OYW1lID0gW3RoZVRva05hbXMgb2JqZWN0QXRJbmRleDptdGUuZXhwZWN0aW5nXTsKKyAgICAgICAgfQorICAgICAgICBtc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIm1pc3NpbmcgJUAgYXQgJUAiLCB0b2tlbk5hbWUsIFtzZWxmIGdldFRva2VuRXJyb3JEaXNwbGF5OihlLnRva2VuKV0gXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtlIGlzS2luZE9mQ2xhc3M6W0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIGNsYXNzXV0gKSB7CisgICAgICAgIEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICptdGUgPSAoQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKillOworICAgICAgICBOU1N0cmluZyAqdG9rZW5OYW1lPUAiPHVua25vd24+IjsKKyAgICAgICAgaWYgKCBtdGUuZXhwZWN0aW5nPT0gQU5UTFJUb2tlblR5cGVFT0YgKSB7CisgICAgICAgICAgICB0b2tlbk5hbWUgPSBAIkVPRiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0b2tlbk5hbWUgPSBbdGhlVG9rTmFtcyBvYmplY3RBdEluZGV4Om10ZS5leHBlY3RpbmddOworICAgICAgICB9CisgICAgICAgIG1zZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibWlzbWF0Y2hlZCBpbnB1dCAlQCBleHBlY3RpbmcgJUAiLFtzZWxmIGdldFRva2VuRXJyb3JEaXNwbGF5OihlLnRva2VuKV0sIHRva2VuTmFtZV07CisgICAgfQorICAgIGVsc2UgaWYgKCBbZSBpc0tpbmRPZkNsYXNzOltBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiAqbXRuZSA9IChBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbiAqKWU7CisgICAgICAgIE5TU3RyaW5nICp0b2tlbk5hbWU9QCI8dW5rbm93bj4iOworICAgICAgICBpZiAoIG10bmUuZXhwZWN0aW5nPT1BTlRMUlRva2VuVHlwZUVPRiApIHsKKyAgICAgICAgICAgIHRva2VuTmFtZSA9IEAiRU9GIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRva2VuTmFtZSA9IFt0aGVUb2tOYW1zIG9iamVjdEF0SW5kZXg6bXRuZS5leHBlY3RpbmddOworICAgICAgICB9CisgICAgICAgIG1zZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibWlzbWF0Y2hlZCB0cmVlIG5vZGU6ICVAIGV4cGVjdGluZyAlQCIsIG10bmUubm9kZSwgdG9rZW5OYW1lXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtlIGlzS2luZE9mQ2xhc3M6W0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gY2xhc3NdXSApIHsKKyAgICAgICAgLy9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IChOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqKWU7CisgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiZGVjaXNpb249PDwiK252YWUuZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24rIj4+IgorICAgICAgICAvLyBhbmQgIihkZWNpc2lvbj0iK252YWUuZGVjaXNpb25OdW1iZXIrIikgYW5kCisgICAgICAgIC8vICJzdGF0ZSAiK252YWUuc3RhdGVOdW1iZXIKKyAgICAgICAgbXNnID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgJUAiLCBbc2VsZiBnZXRUb2tlbkVycm9yRGlzcGxheTplLnRva2VuXV07CisgICAgfQorICAgIGVsc2UgaWYgKCBbZSBpc0tpbmRPZkNsYXNzOltBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICAvL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSAoQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKillOworICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQsIGNhbiBhZGQgIihkZWNpc2lvbj0iK2VlZS5kZWNpc2lvbk51bWJlcisiKSIKKyAgICAgICAgbXNnID1bTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGlucHV0ICIsIFtzZWxmIGdldFRva2VuRXJyb3JEaXNwbGF5OmUudG9rZW5dXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtlIGlzS2luZE9mQ2xhc3M6W0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IChBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKillOworICAgICAgICBtc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIm1pc21hdGNoZWQgaW5wdXQgJUAgZXhwZWN0aW5nIHNldCAlQCIsCisgICAgICAgICAgICAgICBbc2VsZiBnZXRUb2tlbkVycm9yRGlzcGxheTooZS50b2tlbildLAorICAgICAgICAgICAgICAgbXNlLmV4cGVjdGluZ107CisgICAgfQorI3ByYWdtYSB3YXJuaW5nIE5vdFNldCBub3QgeWV0IGltcGxlbWVudGVkLgorICAgIGVsc2UgaWYgKCBbZSBpc0tpbmRPZkNsYXNzOltBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gY2xhc3NdIF0gKSB7CisgICAgICAgIEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiAqbXNlID0gKEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiAqKWU7CisgICAgICAgIG1zZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibWlzbWF0Y2hlZCBpbnB1dCAlQCBleHBlY3Rpbmcgc2V0ICVAIiwKKyAgICAgICAgICAgICAgIFtzZWxmIGdldFRva2VuRXJyb3JEaXNwbGF5OihlLnRva2VuKV0sCisgICAgICAgICAgICAgICBtc2UuZXhwZWN0aW5nXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtlIGlzS2luZE9mQ2xhc3M6W0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIGNsYXNzXV0gKSB7CisgICAgICAgIEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uICpmcGUgPSAoQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gKillOworICAgICAgICBtc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInJ1bGUgJUAgZmFpbGVkIHByZWRpY2F0ZTogeyAlQCB9PyIsIGZwZS5ydWxlTmFtZSwgZnBlLnByZWRpY2F0ZV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIkV4Y2VwdGlvbj0gJUBcbiIsIGUubmFtZV07CisgICAgfQorICAgIHJldHVybiBtc2c7Cit9CisKKy8qKiBHZXQgbnVtYmVyIG9mIHJlY29nbml0aW9uIGVycm9ycyAobGV4ZXIsIHBhcnNlciwgdHJlZSBwYXJzZXIpLiAgRWFjaAorICogIHJlY29nbml6ZXIgdHJhY2tzIGl0cyBvd24gbnVtYmVyLiAgU28gcGFyc2VyIGFuZCBsZXhlciBlYWNoIGhhdmUKKyAqICBzZXBhcmF0ZSBjb3VudC4gIERvZXMgbm90IGNvdW50IHRoZSBzcHVyaW91cyBlcnJvcnMgZm91bmQgYmV0d2VlbgorICogIGFuIGVycm9yIGFuZCBuZXh0IHZhbGlkIHRva2VuIG1hdGNoCisgKgorICogIFNlZSBhbHNvIHJlcG9ydEVycm9yKCkKKyAqLworLSAoTlNJbnRlZ2VyKSBnZXROdW1iZXJPZlN5bnRheEVycm9ycworeworICAgIHJldHVybiBzdGF0ZS5zeW50YXhFcnJvcnM7Cit9CisKKy8qKiBXaGF0IGlzIHRoZSBlcnJvciBoZWFkZXIsIG5vcm1hbGx5IGxpbmUvY2hhcmFjdGVyIHBvc2l0aW9uIGluZm9ybWF0aW9uPyAqLworLSAoTlNTdHJpbmcgKilnZXRFcnJvckhlYWRlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKK3sKKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJsaW5lICVkOiVkIiwgZS5saW5lLCBlLmNoYXJQb3NpdGlvbkluTGluZV07Cit9CisKKy8qKiBIb3cgc2hvdWxkIGEgdG9rZW4gYmUgZGlzcGxheWVkIGluIGFuIGVycm9yIG1lc3NhZ2U/IFRoZSBkZWZhdWx0CisgKiAgaXMgdG8gZGlzcGxheSBqdXN0IHRoZSB0ZXh0LCBidXQgZHVyaW5nIGRldmVsb3BtZW50IHlvdSBtaWdodAorICogIHdhbnQgdG8gaGF2ZSBhIGxvdCBvZiBpbmZvcm1hdGlvbiBzcGl0IG91dC4gIE92ZXJyaWRlIGluIHRoYXQgY2FzZQorICogIHRvIHVzZSB0LnRvU3RyaW5nKCkgKHdoaWNoLCBmb3IgQ29tbW9uVG9rZW4sIGR1bXBzIGV2ZXJ5dGhpbmcgYWJvdXQKKyAqICB0aGUgdG9rZW4pLiBUaGlzIGlzIGJldHRlciB0aGFuIGZvcmNpbmcgeW91IHRvIG92ZXJyaWRlIGEgbWV0aG9kIGluCisgKiAgeW91ciB0b2tlbiBvYmplY3RzIGJlY2F1c2UgeW91IGRvbid0IGhhdmUgdG8gZ28gbW9kaWZ5IHlvdXIgbGV4ZXIKKyAqICBzbyB0aGF0IGl0IGNyZWF0ZXMgYSBuZXcgSmF2YSB0eXBlLgorICovCistIChOU1N0cmluZyAqKWdldFRva2VuRXJyb3JEaXNwbGF5OihpZDxBTlRMUlRva2VuPil0Cit7CisgICAgTlNTdHJpbmcgKnMgPSB0LnRleHQ7CisgICAgaWYgKCBzID09IG5pbCApIHsKKyAgICAgICAgaWYgKCB0LnR5cGUgPT0gQU5UTFJUb2tlblR5cGVFT0YgKSB7CisgICAgICAgICAgICBzID0gQCI8RU9GPiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUA+IiwgdC50eXBlXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzID0gW3Mgc3RyaW5nQnlSZXBsYWNpbmdPY2N1cnJlbmNlc09mU3RyaW5nOkAiXG4iIHdpdGhTdHJpbmc6QCJcXFxcbiJdOworICAgIHMgPSBbcyBzdHJpbmdCeVJlcGxhY2luZ09jY3VycmVuY2VzT2ZTdHJpbmc6QCJcciIgd2l0aFN0cmluZzpAIlxcXFxyIl07CisgICAgcyA9IFtzIHN0cmluZ0J5UmVwbGFjaW5nT2NjdXJyZW5jZXNPZlN0cmluZzpAIlx0IiB3aXRoU3RyaW5nOkAiXFxcXHQiXTsKKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJcJyVAXCciLCBzXTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2Ugd2hlcmUgZXJyb3IgbWVzc2FnZXMgZ28gKi8KKy0gKHZvaWQpIGVtaXRFcnJvck1lc3NhZ2U6KE5TU3RyaW5nICopIG1zZworeworLy8gICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgTlNMb2coQCIlQCIsIG1zZyk7Cit9CisKKy8qKiBSZWNvdmVyIGZyb20gYW4gZXJyb3IgZm91bmQgb24gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgaXMKKyAqICBmb3IgTm9WaWFibGVBbHQgYW5kIG1pc21hdGNoZWQgc3ltYm9sIGV4Y2VwdGlvbnMuICBJZiB5b3UgZW5hYmxlCisgKiAgc2luZ2xlIHRva2VuIGluc2VydGlvbiBhbmQgZGVsZXRpb24sIHRoaXMgd2lsbCB1c3VhbGx5IG5vdAorICogIGhhbmRsZSBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zIGJ1dCB0aGVyZSBjb3VsZCBiZSBhIG1pc21hdGNoZWQKKyAqICB0b2tlbiB0aGF0IHRoZSBtYXRjaCgpIHJvdXRpbmUgY291bGQgbm90IHJlY292ZXIgZnJvbS4KKyAqLworLSAodm9pZClyZWNvdmVyOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKilyZQoreworICAgIGlmICggc3RhdGUubGFzdEVycm9ySW5kZXggPT0gYW5JbnB1dC5pbmRleCApIHsKKyAgICAgICAgLy8gdWggb2gsIGFub3RoZXIgZXJyb3IgYXQgc2FtZSB0b2tlbiBpbmRleDsgbXVzdCBiZSBhIGNhc2UKKyAgICAgICAgLy8gd2hlcmUgTFQoMSkgaXMgaW4gdGhlIHJlY292ZXJ5IHRva2VuIHNldCBzbyBub3RoaW5nIGlzCisgICAgICAgIC8vIGNvbnN1bWVkOyBjb25zdW1lIGEgc2luZ2xlIHRva2VuIHNvIGF0IGxlYXN0IHRvIHByZXZlbnQKKyAgICAgICAgLy8gYW4gaW5maW5pdGUgbG9vcDsgdGhpcyBpcyBhIGZhaWxzYWZlLgorICAgICAgICBbYW5JbnB1dCBjb25zdW1lXTsKKyAgICB9CisgICAgc3RhdGUubGFzdEVycm9ySW5kZXggPSBhbklucHV0LmluZGV4OworICAgIEFOVExSQml0U2V0ICpmb2xsb3dTZXQgPSBbc2VsZiBjb21wdXRlRXJyb3JSZWNvdmVyeVNldF07CisgICAgW3NlbGYgYmVnaW5SZXN5bmNdOworICAgIFtzZWxmIGNvbnN1bWVVbnRpbEZvbGxvdzphbklucHV0IEZvbGxvdzpmb2xsb3dTZXRdOworICAgIFtzZWxmIGVuZFJlc3luY107Cit9CisKKy0gKHZvaWQpIGJlZ2luUmVzeW5jCit7CisgICAgCit9CisKKy0gKHZvaWQpIGVuZFJlc3luYworeworICAgIAorfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLyogIENvbXB1dGUgdGhlIGVycm9yIHJlY292ZXJ5IHNldCBmb3IgdGhlIGN1cnJlbnQgcnVsZS4gIER1cmluZworICogIHJ1bGUgaW52b2NhdGlvbiwgdGhlIHBhcnNlciBwdXNoZXMgdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4KKyAqICBmb2xsb3cgdGhhdCBydWxlIHJlZmVyZW5jZSBvbiB0aGUgc3RhY2s7IHRoaXMgYW1vdW50cyB0bworICogIGNvbXB1dGluZyBGSVJTVCBvZiB3aGF0IGZvbGxvd3MgdGhlIHJ1bGUgcmVmZXJlbmNlIGluIHRoZQorICogIGVuY2xvc2luZyBydWxlLiBUaGlzIGxvY2FsIGZvbGxvdyBzZXQgb25seSBpbmNsdWRlcyB0b2tlbnMKKyAqICBmcm9tIHdpdGhpbiB0aGUgcnVsZTsgaS5lLiwgdGhlIEZJUlNUIGNvbXB1dGF0aW9uIGRvbmUgYnkKKyAqICBBTlRMUiBzdG9wcyBhdCB0aGUgZW5kIG9mIGEgcnVsZS4KKyAqCisgKiAgRVhBTVBMRQorICoKKyAqICBXaGVuIHlvdSBmaW5kIGEgIm5vIHZpYWJsZSBhbHQgZXhjZXB0aW9uIiwgdGhlIGlucHV0IGlzIG5vdAorICogIGNvbnNpc3RlbnQgd2l0aCBhbnkgb2YgdGhlIGFsdGVybmF0aXZlcyBmb3IgcnVsZSByLiAgVGhlIGJlc3QKKyAqICB0aGluZyB0byBkbyBpcyB0byBjb25zdW1lIHRva2VucyB1bnRpbCB5b3Ugc2VlIHNvbWV0aGluZyB0aGF0CisgKiAgY2FuIGxlZ2FsbHkgZm9sbG93IGEgY2FsbCB0byByICpvciogYW55IHJ1bGUgdGhhdCBjYWxsZWQgci4KKyAqICBZb3UgZG9uJ3Qgd2FudCB0aGUgZXhhY3Qgc2V0IG9mIHZpYWJsZSBuZXh0IHRva2VucyBiZWNhdXNlIHRoZQorICogIGlucHV0IG1pZ2h0IGp1c3QgYmUgbWlzc2luZyBhIHRva2VuLS15b3UgbWlnaHQgY29uc3VtZSB0aGUKKyAqICByZXN0IG9mIHRoZSBpbnB1dCBsb29raW5nIGZvciBvbmUgb2YgdGhlIG1pc3NpbmcgdG9rZW5zLgorICoKKyAqICBDb25zaWRlciBncmFtbWFyOgorICoKKyAqICBhIDogJ1snIGIgJ10nCisgKiAgICB8ICcoJyBiICcpJworICogICAgOworICogIGIgOiBjICdeJyBJTlQgOworICogIGMgOiBJRAorICogICAgfCBJTlQKKyAqICAgIDsKKyAqCisgKiAgQXQgZWFjaCBydWxlIGludm9jYXRpb24sIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY291bGQgZm9sbG93CisgKiAgdGhhdCBydWxlIGlzIHB1c2hlZCBvbiBhIHN0YWNrLiAgSGVyZSBhcmUgdGhlIHZhcmlvdXMgImxvY2FsIgorICogIGZvbGxvdyBzZXRzOgorICoKKyAqICBGT0xMT1coYjFfaW5fYSkgPSBGSVJTVCgnXScpID0gJ10nCisgKiAgRk9MTE9XKGIyX2luX2EpID0gRklSU1QoJyknKSA9ICcpJworICogIEZPTExPVyhjX2luX2IpID0gRklSU1QoJ14nKSA9ICdeJworICoKKyAqICBVcG9uIGVycm9uZW91cyBpbnB1dCAiW10iLCB0aGUgY2FsbCBjaGFpbiBpcworICoKKyAqICBhIC0+IGIgLT4gYworICoKKyAqICBhbmQsIGhlbmNlLCB0aGUgZm9sbG93IGNvbnRleHQgc3RhY2sgaXM6CisgKgorICogIGRlcHRoICBsb2NhbCBmb2xsb3cgc2V0ICAgICBhZnRlciBjYWxsIHRvIHJ1bGUKKyAqICAgIDAgICAgICAgICA8RU9GPiAgICAgICAgICAgICAgICAgICAgYSAoZnJvbSBtYWluKCkpCisgKiAgICAxICAgICAgICAgICddJyAgICAgICAgICAgICAgICAgICAgIGIKKyAqICAgIDMgICAgICAgICAgJ14nICAgICAgICAgICAgICAgICAgICAgYworICoKKyAqICBOb3RpY2UgdGhhdCAnKScgaXMgbm90IGluY2x1ZGVkLCBiZWNhdXNlIGIgd291bGQgaGF2ZSB0byBoYXZlCisgKiAgYmVlbiBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBjb250ZXh0IGluIHJ1bGUgYSBmb3IgJyknIHRvIGJlCisgKiAgaW5jbHVkZWQuCisgKgorICogIEZvciBlcnJvciByZWNvdmVyeSwgd2UgY2Fubm90IGNvbnNpZGVyIEZPTExPVyhjKQorICogIChjb250ZXh0LXNlbnNpdGl2ZSBvciBvdGhlcndpc2UpLiAgV2UgbmVlZCB0aGUgY29tYmluZWQgc2V0IG9mCisgKiAgYWxsIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXRzLS10aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdAorICogIGNvdWxkIGZvbGxvdyBhbnkgcmVmZXJlbmNlIGluIHRoZSBjYWxsIGNoYWluLiAgV2UgbmVlZCB0bworICogIHJlc3luYyB0byBvbmUgb2YgdGhvc2UgdG9rZW5zLiAgTm90ZSB0aGF0IEZPTExPVyhjKT0nXicgYW5kIGlmCisgKiAgd2UgcmVzeW5jJ2QgdG8gdGhhdCB0b2tlbiwgd2UnZCBjb25zdW1lIHVudGlsIEVPRi4gIFdlIG5lZWQgdG8KKyAqICBzeW5jIHRvIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPV3MgZm9yIGEsIGIsIGFuZCBjOiB7J10nLCdeJ30uCisgKiAgSW4gdGhpcyBjYXNlLCBmb3IgaW5wdXQgIltdIiwgTEEoMSkgaXMgaW4gdGhpcyBzZXQgc28gd2Ugd291bGQKKyAqICBub3QgY29uc3VtZSBhbnl0aGluZyBhbmQgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgcnVsZSBjIHdvdWxkCisgKiAgcmV0dXJuIG5vcm1hbGx5LiAgSXQgd291bGQgbm90IGZpbmQgdGhlIHJlcXVpcmVkICdeJyB0aG91Z2guCisgKiAgQXQgdGhpcyBwb2ludCwgaXQgZ2V0cyBhIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IgYW5kIHRocm93cyBhbgorICogIGV4Y2VwdGlvbiAoc2luY2UgTEEoMSkgaXMgbm90IGluIHRoZSB2aWFibGUgZm9sbG93aW5nIHRva2VuCisgKiAgc2V0KS4gIFRoZSBydWxlIGV4Y2VwdGlvbiBoYW5kbGVyIHRyaWVzIHRvIHJlY292ZXIsIGJ1dCBmaW5kcworICogIHRoZSBzYW1lIHJlY292ZXJ5IHNldCBhbmQgZG9lc24ndCBjb25zdW1lIGFueXRoaW5nLiAgUnVsZSBiCisgKiAgZXhpdHMgbm9ybWFsbHkgcmV0dXJuaW5nIHRvIHJ1bGUgYS4gIE5vdyBpdCBmaW5kcyB0aGUgJ10nIChhbmQKKyAqICB3aXRoIHRoZSBzdWNjZXNzZnVsIG1hdGNoIGV4aXRzIGVycm9yUmVjb3ZlcnkgbW9kZSkuCisgKgorICogIFNvLCB5b3UgY25hIHNlZSB0aGF0IHRoZSBwYXJzZXIgd2Fsa3MgdXAgY2FsbCBjaGFpbiBsb29raW5nCisgKiAgZm9yIHRoZSB0b2tlbiB0aGF0IHdhcyBhIG1lbWJlciBvZiB0aGUgcmVjb3Zlcnkgc2V0LgorICoKKyAqICBFcnJvcnMgYXJlIG5vdCBnZW5lcmF0ZWQgaW4gZXJyb3JSZWNvdmVyeSBtb2RlLgorICoKKyAqICBBTlRMUidzIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBpcyBiYXNlZCB1cG9uIG9yaWdpbmFsIGlkZWFzOgorICoKKyAqICAiQWxnb3JpdGhtcyArIERhdGEgU3RydWN0dXJlcyA9IFByb2dyYW1zIiBieSBOaWtsYXVzIFdpcnRoCisgKgorICogIGFuZAorICoKKyAqICAiQSBub3RlIG9uIGVycm9yIHJlY292ZXJ5IGluIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlcnMiOgorICogIGh0dHA6Ly9wb3J0YWwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9OTQ3OTAyLjk0NzkwNQorICoKKyAqICBMYXRlciwgSm9zZWYgR3Jvc2NoIGhhZCBzb21lIGdvb2QgaWRlYXM6CisgKgorICogICJFZmZpY2llbnQgYW5kIENvbWZvcnRhYmxlIEVycm9yIFJlY292ZXJ5IGluIFJlY3Vyc2l2ZSBEZXNjZW50CisgKiAgUGFyc2VycyI6CisgKiAgZnRwOi8vd3d3LmNvY29sYWIuY29tL3Byb2R1Y3RzL2NvY2t0YWlsL2RvY2E0LnBzL2VsbC5wcy56aXAKKyAqCisgKiAgTGlrZSBHcm9zY2ggSSBpbXBsZW1lbnRlZCBsb2NhbCBGT0xMT1cgc2V0cyB0aGF0IGFyZSBjb21iaW5lZAorICogIGF0IHJ1bi10aW1lIHVwb24gZXJyb3IgdG8gYXZvaWQgb3ZlcmhlYWQgZHVyaW5nIHBhcnNpbmcuCisgKi8KKy0gKEFOVExSQml0U2V0ICopIGNvbXB1dGVFcnJvclJlY292ZXJ5U2V0Cit7CisgICAgcmV0dXJuIFtzZWxmIGNvbWJpbmVGb2xsb3dzOk5PXTsKK30KKworLyoqIENvbXB1dGUgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXQgZm9yIGN1cnJlbnQgcnVsZS4KKyAqICBUaGlzIGlzIHNldCBvZiB0b2tlbiB0eXBlcyB0aGF0IGNhbiBmb2xsb3cgYSBzcGVjaWZpYyBydWxlCisgKiAgcmVmZXJlbmNlIGdpdmVuIGEgc3BlY2lmaWMgY2FsbCBjaGFpbi4gIFlvdSBnZXQgdGhlIHNldCBvZgorICogIHZpYWJsZSB0b2tlbnMgdGhhdCBjYW4gcG9zc2libHkgY29tZSBuZXh0IChsb29rYWhlYWQgZGVwdGggMSkKKyAqICBnaXZlbiB0aGUgY3VycmVudCBjYWxsIGNoYWluLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorICogIGRlZmluaXRpb24gb2YgcGxhaW4gRk9MTE9XIGZvciBydWxlIHI6CisgKgorICogICBGT0xMT1cocik9e3ggfCBTPT4qYWxwaGEgciBiZXRhIGluIEcgYW5kIHggaW4gRklSU1QoYmV0YSl9CisgKgorICogIHdoZXJlIHggaW4gVCogYW5kIGFscGhhLCBiZXRhIGluIFYqOyBUIGlzIHNldCBvZiB0ZXJtaW5hbHMgYW5kCisgKiAgViBpcyB0aGUgc2V0IG9mIHRlcm1pbmFscyBhbmQgbm9udGVybWluYWxzLiAgSW4gb3RoZXIgd29yZHMsCisgKiAgRk9MTE9XKHIpIGlzIHRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBmb2xsb3cKKyAqICByZWZlcmVuY2VzIHRvIHIgaW4gKmFueSogc2VudGVudGlhbCBmb3JtIChjb250ZXh0KS4gIEF0CisgKiAgcnVudGltZSwgaG93ZXZlciwgd2Uga25vdyBwcmVjaXNlbHkgd2hpY2ggY29udGV4dCBhcHBsaWVzIGFzCisgKiAgd2UgaGF2ZSB0aGUgY2FsbCBjaGFpbi4gIFdlIG1heSBjb21wdXRlIHRoZSBleGFjdCAocmF0aGVyCisgKiAgdGhhbiBjb3ZlcmluZyBzdXBlcnNldCkgc2V0IG9mIGZvbGxvd2luZyB0b2tlbnMuCisgKgorICogIEZvciBleGFtcGxlLCBjb25zaWRlciBncmFtbWFyOgorICoKKyAqICBzdGF0IDogSUQgJz0nIGV4cHIgJzsnICAgICAgLy8gRk9MTE9XKHN0YXQpPT17RU9GfQorICogICAgICAgfCAicmV0dXJuIiBleHByICcuJworICogICAgICAgOworICogIGV4cHIgOiBhdG9tICgnKycgYXRvbSkqIDsgICAvLyBGT0xMT1coZXhwcik9PXsnOycsJy4nLCcpJ30KKyAqICBhdG9tIDogSU5UICAgICAgICAgICAgICAgICAgLy8gRk9MTE9XKGF0b20pPT17JysnLCcpJywnOycsJy4nfQorICogICAgICAgfCAnKCcgZXhwciAnKScKKyAqICAgICAgIDsKKyAqCisgKiAgVGhlIEZPTExPVyBzZXRzIGFyZSBhbGwgaW5jbHVzaXZlIHdoZXJlYXMgY29udGV4dC1zZW5zaXRpdmUKKyAqICBGT0xMT1cgc2V0cyBhcmUgcHJlY2lzZWx5IHdoYXQgY291bGQgZm9sbG93IGEgcnVsZSByZWZlcmVuY2UuCisgKiAgRm9yIGlucHV0IGlucHV0ICJpPSgzKTsiLCBoZXJlIGlzIHRoZSBkZXJpdmF0aW9uOgorICoKKyAqICBzdGF0ID0+IElEICc9JyBleHByICc7JworICogICAgICAgPT4gSUQgJz0nIGF0b20gKCcrJyBhdG9tKSogJzsnCisgKiAgICAgICA9PiBJRCAnPScgJygnIGV4cHIgJyknICgnKycgYXRvbSkqICc7JworICogICAgICAgPT4gSUQgJz0nICcoJyBhdG9tICcpJyAoJysnIGF0b20pKiAnOycKKyAqICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAoJysnIGF0b20pKiAnOycKKyAqICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAnOycKKyAqCisgKiAgQXQgdGhlICIzIiB0b2tlbiwgeW91J2QgaGF2ZSBhIGNhbGwgY2hhaW4gb2YKKyAqCisgKiAgICBzdGF0IC0+IGV4cHIgLT4gYXRvbSAtPiBleHByIC0+IGF0b20KKyAqCisgKiAgV2hhdCBjYW4gZm9sbG93IHRoYXQgc3BlY2lmaWMgbmVzdGVkIHJlZiB0byBhdG9tPyAgRXhhY3RseSAnKScKKyAqICBhcyB5b3UgY2FuIHNlZSBieSBsb29raW5nIGF0IHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgc3BlY2lmaWMKKyAqICBpbnB1dC4gIENvbnRyYXN0IHRoaXMgd2l0aCB0aGUgRk9MTE9XKGF0b20pPXsnKycsJyknLCc7JywnLid9LgorICoKKyAqICBZb3Ugd2FudCB0aGUgZXhhY3QgdmlhYmxlIHRva2VuIHNldCB3aGVuIHJlY292ZXJpbmcgZnJvbSBhCisgKiAgdG9rZW4gbWlzbWF0Y2guICBVcG9uIHRva2VuIG1pc21hdGNoLCBpZiBMQSgxKSBpcyBtZW1iZXIgb2YKKyAqICB0aGUgdmlhYmxlIG5leHQgdG9rZW4gc2V0LCB0aGVuIHlvdSBrbm93IHRoZXJlIGlzIG1vc3QgbGlrZWx5CisgKiAgYSBtaXNzaW5nIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uICAiSW5zZXJ0IiBvbmUgYnkganVzdCBub3QKKyAqICB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgKi8KKy0gKEFOVExSQml0U2V0ICopY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XCit7CisgICAgcmV0dXJuIFtzZWxmIGNvbWJpbmVGb2xsb3dzOllFU107Cit9CisKKy8vIHdoYXQgaXMgZXhhY3Q/IGl0IHNlZW1zIHRvIG9ubHkgYWRkIHNldHMgZnJvbSBhYm92ZSBvbiBzdGFjaworLy8gaWYgRU9SIGlzIGluIHNldCBpLiAgV2hlbiBpdCBzZWVzIGEgc2V0IHcvbyBFT1IsIGl0IHN0b3BzIGFkZGluZy4KKy8vIFdoeSB3b3VsZCB3ZSBldmVyIHdhbnQgdGhlbSBhbGw/ICBNYXliZSBubyB2aWFibGUgYWx0IGluc3RlYWQgb2YKKy8vIG1pc21hdGNoZWQgdG9rZW4/CistIChBTlRMUkJpdFNldCAqKWNvbWJpbmVGb2xsb3dzOihCT09MKSBleGFjdAoreworICAgIE5TSW50ZWdlciB0b3AgPSBzdGF0ZS5fZnNwOworICAgIEFOVExSQml0U2V0ICpmb2xsb3dTZXQgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0XSByZXRhaW5dOworICAgIGZvciAoaW50IGkgPSB0b3A7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIEFOVExSQml0U2V0ICpsb2NhbEZvbGxvd1NldCA9IChBTlRMUkJpdFNldCAqKVtzdGF0ZS5mb2xsb3dpbmcgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgLyoKKyAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYWwgZm9sbG93IGRlcHRoICIraSsiPSIrCisgICAgICAgICBsb2NhbEZvbGxvd1NldC50b1N0cmluZyhnZXRUb2tlbk5hbWVzKCkpKyIpIik7CisgICAgICAgICAqLworICAgICAgICBbZm9sbG93U2V0IG9ySW5QbGFjZTpsb2NhbEZvbGxvd1NldF07CisgICAgICAgIGlmICggZXhhY3QgKSB7CisgICAgICAgICAgICAvLyBjYW4gd2Ugc2VlIGVuZCBvZiBydWxlPworICAgICAgICAgICAgaWYgKCBbbG9jYWxGb2xsb3dTZXQgbWVtYmVyOkFOVExSVG9rZW5UeXBlRU9SXSApIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IGxlYXZlIEVPUiBpbiBzZXQgaWYgYXQgdG9wIChzdGFydCBydWxlKTsgdGhpcyBsZXRzCisgICAgICAgICAgICAgICAgLy8gdXMga25vdyBpZiBoYXZlIHRvIGluY2x1ZGUgZm9sbG93KHN0YXJ0IHJ1bGUpOyBpLmUuLCBFT0YKKyAgICAgICAgICAgICAgICBpZiAoIGkgPiAwICkgeworICAgICAgICAgICAgICAgICAgICBbZm9sbG93U2V0IHJlbW92ZTpBTlRMUlRva2VuVHlwZUVPUl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8vIGNhbid0IHNlZSBlbmQgb2YgcnVsZSwgcXVpdAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb2xsb3dTZXQ7Cit9CisKKy8qKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhIHNpbmdsZSBtaXNzaW5nIG9yIGV4dHJhIHRva2VuLgorICoKKyAqICBFWFRSQSBUT0tFTgorICoKKyAqICBMQSgxKSBpcyBub3Qgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IuICBJZiBMQSgyKSBoYXMgdGhlIHJpZ2h0IHRva2VuLAorICogIGhvd2V2ZXIsIHRoZW4gYXNzdW1lIExBKDEpIGlzIHNvbWUgZXh0cmEgc3B1cmlvdXMgdG9rZW4uICBEZWxldGUgaXQKKyAqICBhbmQgTEEoMikgYXMgaWYgd2Ugd2VyZSBkb2luZyBhIG5vcm1hbCBtYXRjaCgpLCB3aGljaCBhZHZhbmNlcyB0aGUKKyAqICBpbnB1dC4KKyAqCisgKiAgTUlTU0lORyBUT0tFTgorICoKKyAqICBJZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIKKyAqICB0dHlwZSB0aGVuIGl0IGlzIG9rIHRvICJpbnNlcnQiIHRoZSBtaXNzaW5nIHRva2VuLCBlbHNlIHRocm93CisgKiAgZXhjZXB0aW9uIEZvciBleGFtcGxlLCBJbnB1dCAiaT0oMzsiIGlzIGNsZWFybHkgbWlzc2luZyB0aGUKKyAqICAnKScuICBXaGVuIHRoZSBwYXJzZXIgcmV0dXJucyBmcm9tIHRoZSBuZXN0ZWQgY2FsbCB0byBleHByLCBpdAorICogIHdpbGwgaGF2ZSBjYWxsIGNoYWluOgorICoKKyAqICAgIHN0YXQgLT4gZXhwciAtPiBhdG9tCisgKgorICogIGFuZCBpdCB3aWxsIGJlIHRyeWluZyB0byBtYXRjaCB0aGUgJyknIGF0IHRoaXMgcG9pbnQgaW4gdGhlCisgKiAgZGVyaXZhdGlvbjoKKyAqCisgKiAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgKCcrJyBhdG9tKSogJzsnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICogIG1hdGNoKCkgd2lsbCBzZWUgdGhhdCAnOycgZG9lc24ndCBtYXRjaCAnKScgYW5kIHJlcG9ydCBhCisgKiAgbWlzbWF0Y2hlZCB0b2tlbiBlcnJvci4gIFRvIHJlY292ZXIsIGl0IHNlZXMgdGhhdCBMQSgxKT09JzsnCisgKiAgaXMgaW4gdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZSAnKScgdG9rZW4KKyAqICByZWZlcmVuY2UgaW4gcnVsZSBhdG9tLiAgSXQgY2FuIGFzc3VtZSB0aGF0IHlvdSBmb3Jnb3QgdGhlICcpJy4KKyAqLworLSAoaWQ8QU5UTFJUb2tlbj4pcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3cKK3sKKyAgICBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICplID0gbmlsOworICAgIC8vIGlmIG5leHQgdG9rZW4gaXMgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgdGhlbiAiZGVsZXRlIiB0aGlzIHRva2VuCisgICAgaWYgKCBbc2VsZiBtaXNtYXRjaElzVW53YW50ZWRUb2tlbjphbklucHV0IFRva2VuVHlwZTp0dHlwZV0gKSB7CisgICAgICAgIGUgPSBbQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjp0dHlwZSBTdHJlYW06YW5JbnB1dF07CisgICAgICAgIC8qCisgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuIGRlbGV0aW5nICIrCisgICAgICAgICAoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgxKSsKKyAgICAgICAgICIgc2luY2UgIisoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgyKSsiIGlzIHdoYXQgd2Ugd2FudCIpOworICAgICAgICAgKi8KKyAgICAgICAgW3NlbGYgYmVnaW5SZXN5bmNdOworICAgICAgICBbYW5JbnB1dCBjb25zdW1lXTsgLy8gc2ltcGx5IGRlbGV0ZSBleHRyYSB0b2tlbgorICAgICAgICBbc2VsZiBlbmRSZXN5bmNdOworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjplXTsgIC8vIHJlcG9ydCBhZnRlciBjb25zdW1pbmcgc28gQVcgc2VlcyB0aGUgdG9rZW4gaW4gdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSB0b2tlbiB3ZSdyZSBhY3R1YWxseSBtYXRjaGluZworICAgICAgICBpZCBtYXRjaGVkU3ltYm9sID0gW3NlbGYgZ2V0Q3VycmVudElucHV0U3ltYm9sOmFuSW5wdXRdOworICAgICAgICBbYW5JbnB1dCBjb25zdW1lXTsgLy8gbW92ZSBwYXN0IHR0eXBlIHRva2VuIGFzIGlmIGFsbCB3ZXJlIG9rCisgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sOworICAgIH0KKyAgICAvLyBjYW4ndCByZWNvdmVyIHdpdGggc2luZ2xlIHRva2VuIGRlbGV0aW9uLCB0cnkgaW5zZXJ0aW9uCisgICAgaWYgKCBbc2VsZiBtaXNtYXRjaElzTWlzc2luZ1Rva2VuOmFuSW5wdXQgRm9sbG93OmZvbGxvd10gKSB7CisgICAgICAgIGlkPEFOVExSVG9rZW4+IGluc2VydGVkID0gW3NlbGYgZ2V0TWlzc2luZ1N5bWJvbDphbklucHV0IEV4Y2VwdGlvbjplIFRva2VuVHlwZTp0dHlwZSBGb2xsb3c6Zm9sbG93XTsKKyAgICAgICAgZSA9IFtBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbiBuZXdFeGNlcHRpb246dHR5cGUgU3RyZWFtOmFuSW5wdXQgV2l0aDppbnNlcnRlZF07CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOmVdOyAgLy8gcmVwb3J0IGFmdGVyIGluc2VydGluZyBzbyBBVyBzZWVzIHRoZSB0b2tlbiBpbiB0aGUgZXhjZXB0aW9uCisgICAgICAgIHJldHVybiBpbnNlcnRlZDsKKyAgICB9CisgICAgLy8gZXZlbiB0aGF0IGRpZG4ndCB3b3JrOyBtdXN0IHRocm93IHRoZSBleGNlcHRpb24KKyAgICBlID0gW0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjp0dHlwZSBTdHJlYW06YW5JbnB1dF07CisgICAgQHRocm93IGU7Cit9CisKKy8qKiBOb3QgY3VycmVudGx5IHVzZWQgKi8KKy0oaWQpIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldDooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvbGxvdzooQU5UTFJCaXRTZXQgKikgZm9sbG93Cit7CisgICAgaWYgKCBbc2VsZiBtaXNtYXRjaElzTWlzc2luZ1Rva2VuOmFuSW5wdXQgRm9sbG93OmZvbGxvd10gKSB7CisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigibWlzc2luZyB0b2tlbiIpOworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjplXTsKKyAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgdG8gY29uanVyZSB1cCBhIHRva2VuIGZvciBzZXRzIHlldAorICAgICAgICByZXR1cm4gW3NlbGYgZ2V0TWlzc2luZ1N5bWJvbDphbklucHV0IEV4Y2VwdGlvbjplIFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZUludmFsaWQgRm9sbG93OmZvbGxvd107CisgICAgfQorICAgIC8vIFRPRE8gZG8gc2luZ2xlIHRva2VuIGRlbGV0aW9uIGxpa2UgYWJvdmUgZm9yIFRva2VuIG1pc21hdGNoCisgICAgQHRocm93IGU7Cit9CisKKy8qKiBNYXRjaCBuZWVkcyB0byByZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sLCB3aGljaCBnZXRzIHB1dAorICogIGludG8gdGhlIGxhYmVsIGZvciB0aGUgYXNzb2NpYXRlZCB0b2tlbiByZWY7IGUuZy4sIHg9SUQuICBUb2tlbgorICogIGFuZCB0cmVlIHBhcnNlcnMgbmVlZCB0byByZXR1cm4gZGlmZmVyZW50IG9iamVjdHMuIFJhdGhlciB0aGFuIHRlc3QKKyAqICBmb3IgaW5wdXQgc3RyZWFtIHR5cGUgb3IgY2hhbmdlIHRoZSBJbnRTdHJlYW0gaW50ZXJmYWNlLCBJIHVzZQorICogIGEgc2ltcGxlIG1ldGhvZCB0byBhc2sgdGhlIHJlY29nbml6ZXIgdG8gdGVsbCBtZSB3aGF0IHRoZSBjdXJyZW50CisgKiAgaW5wdXQgc3ltYm9sIGlzLgorICogCisgKiAgVGhpcyBpcyBpZ25vcmVkIGZvciBsZXhlcnMuCisgKi8KKy0gKGlkKSBnZXRDdXJyZW50SW5wdXRTeW1ib2w6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLyoqIENvbmp1cmUgdXAgYSBtaXNzaW5nIHRva2VuIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAqCisgKiAgVGhlIHJlY29nbml6ZXIgYXR0ZW1wdHMgdG8gcmVjb3ZlciBmcm9tIHNpbmdsZSBtaXNzaW5nCisgKiAgc3ltYm9scy4gQnV0LCBhY3Rpb25zIG1pZ2h0IHJlZmVyIHRvIHRoYXQgbWlzc2luZyBzeW1ib2wuCisgKiAgRm9yIGV4YW1wbGUsIHg9SUQge2YoJHgpO30uIFRoZSBhY3Rpb24gY2xlYXJseSBhc3N1bWVzCisgKiAgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBpZGVudGlmaWVyIG1hdGNoZWQgcHJldmlvdXNseSBhbmQgdGhhdAorICogICR4IHBvaW50cyBhdCB0aGF0IHRva2VuLiBJZiB0aGF0IHRva2VuIGlzIG1pc3NpbmcsIGJ1dAorICogIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gaXMgd2hhdCB3ZSB3YW50IHdlIGFzc3VtZSB0aGF0CisgKiAgdGhpcyB0b2tlbiBpcyBtaXNzaW5nIGFuZCB3ZSBrZWVwIGdvaW5nLiBCZWNhdXNlIHdlCisgKiAgaGF2ZSB0byByZXR1cm4gc29tZSB0b2tlbiB0byByZXBsYWNlIHRoZSBtaXNzaW5nIHRva2VuLAorICogIHdlIGhhdmUgdG8gY29uanVyZSBvbmUgdXAuIFRoaXMgbWV0aG9kIGdpdmVzIHRoZSB1c2VyIGNvbnRyb2wKKyAqICBvdmVyIHRoZSB0b2tlbnMgcmV0dXJuZWQgZm9yIG1pc3NpbmcgdG9rZW5zLiBNb3N0bHksCisgKiAgeW91IHdpbGwgd2FudCB0byBjcmVhdGUgc29tZXRoaW5nIHNwZWNpYWwgZm9yIGlkZW50aWZpZXIKKyAqICB0b2tlbnMuIEZvciBsaXRlcmFscyBzdWNoIGFzICd7JyBhbmQgJywnLCB0aGUgZGVmYXVsdAorICogIGFjdGlvbiBpbiB0aGUgcGFyc2VyIG9yIHRyZWUgcGFyc2VyIHdvcmtzLiBJdCBzaW1wbHkgY3JlYXRlcworICogIGEgQ29tbW9uVG9rZW4gb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuIFRoZSB0ZXh0IHdpbGwgYmUgdGhlIHRva2VuLgorICogIElmIHlvdSBjaGFuZ2Ugd2hhdCB0b2tlbnMgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBsZXhlciwKKyAqICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHRva2Vucy4KKyAqLworLSAoaWQpZ2V0TWlzc2luZ1N5bWJvbDooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgVG9rZW5UeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUKKyAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93Cit7CisgICAgcmV0dXJuIG5pbDsKK30KKworCistKHZvaWQpIGNvbnN1bWVVbnRpbFRUeXBlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBUb2tlblR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGUKK3sKKyAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uc3VtZVVudGlsICIrdG9rZW5UeXBlKTsKKyAgICBpbnQgdHR5cGUgPSBbYW5JbnB1dCBMQToxXTsKKyAgICB3aGlsZSAodHR5cGUgIT0gQU5UTFJUb2tlblR5cGVFT0YgJiYgdHR5cGUgIT0gdG9rZW5UeXBlKSB7CisgICAgICAgIFthbklucHV0IGNvbnN1bWVdOworICAgICAgICB0dHlwZSA9IFthbklucHV0IExBOjFdOworICAgIH0KK30KKworLyoqIENvbnN1bWUgdG9rZW5zIHVudGlsIG9uZSBtYXRjaGVzIHRoZSBnaXZlbiB0b2tlbiBzZXQgKi8KKy0odm9pZCkgY29uc3VtZVVudGlsRm9sbG93OihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBGb2xsb3c6KEFOVExSQml0U2V0ICopc2V0Cit7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbnN1bWVVbnRpbCgiK3NldC50b1N0cmluZyhnZXRUb2tlbk5hbWVzKCkpKyIpIik7CisgICAgaW50IHR0eXBlID0gW2FuSW5wdXQgTEE6MV07CisgICAgd2hpbGUgKHR0eXBlICE9IEFOVExSVG9rZW5UeXBlRU9GICYmICFbc2V0IG1lbWJlcjp0dHlwZV0gKSB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjb25zdW1lIGR1cmluZyByZWNvdmVyIExBKDEpPSIrZ2V0VG9rZW5OYW1lcygpW2lucHV0LkxBKDEpXSk7CisgICAgICAgIFthbklucHV0IGNvbnN1bWVdOworICAgICAgICB0dHlwZSA9IFthbklucHV0IExBOjFdOworICAgIH0KK30KKworLyoqIFB1c2ggYSBydWxlJ3MgZm9sbG93IHNldCB1c2luZyBvdXIgb3duIGhhcmRjb2RlZCBzdGFjayAqLworLSAodm9pZClwdXNoRm9sbG93OihBTlRMUkJpdFNldCAqKWZzZXQKK3sKKyAgICBpZiAoIChzdGF0ZS5fZnNwICsxKSA+PSBbc3RhdGUuZm9sbG93aW5nIGNvdW50XSApIHsKKyAgICAgICAgLy8gICAgICAgIEFNdXRhYmxlQXJyYXkgKmYgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTpbW3N0YXRlLmZvbGxvd2luZ10gY291bnRdKjJdOworICAgICAgICAvLyAgICAgICAgU3lzdGVtLmFycmF5Y29weShzdGF0ZS5mb2xsb3dpbmcsIDAsIGYsIDAsIHN0YXRlLmZvbGxvd2luZy5sZW5ndGgpOworICAgICAgICAvLyAgICAgICAgc3RhdGUuZm9sbG93aW5nID0gZjsKKyAgICAgICAgW3N0YXRlLmZvbGxvd2luZyBhZGRPYmplY3Q6ZnNldF07CisgICAgICAgIFtmc2V0IHJldGFpbl07CisgICAgICAgIHN0YXRlLl9mc3ArKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFtzdGF0ZS5mb2xsb3dpbmcgcmVwbGFjZU9iamVjdEF0SW5kZXg6KytzdGF0ZS5fZnNwIHdpdGhPYmplY3Q6ZnNldF07CisgICAgfQorfQorCistIChBTlRMUkJpdFNldCAqKXBvcEZvbGxvdworeworICAgIEFOVExSQml0U2V0ICpmc2V0OworCisgICAgaWYgKCBzdGF0ZS5fZnNwID49IDAgJiYgW3N0YXRlLmZvbGxvd2luZyBjb3VudF0gPiAwICkgeworICAgICAgICBmc2V0ID0gW3N0YXRlLmZvbGxvd2luZyBvYmplY3RBdEluZGV4OnN0YXRlLl9mc3AtLV07CisgICAgICAgIFtzdGF0ZS5mb2xsb3dpbmcgcmVtb3ZlTGFzdE9iamVjdF07CisgICAgICAgIHJldHVybiBmc2V0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTlNMb2coIEAiQXR0ZW1wdGVkIHRvIHBvcCBhIGZvbGxvdyB3aGVuIG5vbmUgZXhpc3RzIG9uIHRoZSBzdGFja1xuIiApOworICAgIH0KKyAgICByZXR1cm4gbmlsOworfQorCisvKiogUmV0dXJuIExpc3Q8U3RyaW5nPiBvZiB0aGUgcnVsZXMgaW4geW91ciBwYXJzZXIgaW5zdGFuY2UKKyAqICBsZWFkaW5nIHVwIHRvIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4gIFlvdSBjb3VsZCBvdmVycmlkZSBpZgorICogIHlvdSB3YW50IG1vcmUgZGV0YWlscyBzdWNoIGFzIHRoZSBmaWxlL2xpbmUgaW5mbyBvZiB3aGVyZQorICogIGluIHRoZSBwYXJzZXIgamF2YSBjb2RlIGEgcnVsZSBpcyBpbnZva2VkLgorICoKKyAqICBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvciBlcnJvciBtZXNzYWdlcyBhbmQgZm9yIGNvbnRleHQtc2Vuc2l0aXZlCisgKiAgZXJyb3IgcmVjb3ZlcnkuCisgKi8KKy0gKEFNdXRhYmxlQXJyYXkgKilnZXRSdWxlSW52b2NhdGlvblN0YWNrCit7CisgICAgTlNTdHJpbmcgKnBhcnNlckNsYXNzTmFtZSA9IFtbc2VsZiBjbGFzc05hbWVdIHJldGFpbl07CisgICAgcmV0dXJuIFtzZWxmIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2s6W0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24gbmV3RXhjZXB0aW9uXSBSZWNvZ25pemVyOnBhcnNlckNsYXNzTmFtZV07Cit9CisKKy8qKiBBIG1vcmUgZ2VuZXJhbCB2ZXJzaW9uIG9mIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2sgd2hlcmUgeW91IGNhbgorICogIHBhc3MgaW4sIGZvciBleGFtcGxlLCBhIFJlY29nbml0aW9uRXhjZXB0aW9uIHRvIGdldCBpdCdzIHJ1bGUKKyAqICBzdGFjayB0cmFjZS4gIFRoaXMgcm91dGluZSBpcyBzaGFyZWQgd2l0aCBhbGwgcmVjb2duaXplcnMsIGhlbmNlLAorICogIHN0YXRpYy4KKyAqCisgKiAgVE9ETzogbW92ZSB0byBhIHV0aWxpdHkgY2xhc3Mgb3Igc29tZXRoaW5nOyB3ZWlyZCBoYXZpbmcgbGV4ZXIgY2FsbCB0aGlzCisgKi8KKy0gKEFNdXRhYmxlQXJyYXkgKilnZXRSdWxlSW52b2NhdGlvblN0YWNrOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvZ25pemVyOihOU1N0cmluZyAqKXJlY29nbml6ZXJDbGFzc05hbWUKK3sKKyAgICAvLyBjaGFyICpuYW1lOworICAgIEFNdXRhYmxlQXJyYXkgKnJ1bGVzID0gW1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjIwXSByZXRhaW5dOworICAgIE5TQXJyYXkgKnN0YWNrID0gW2UgY2FsbFN0YWNrU3ltYm9sc107CisgICAgaW50IGkgPSAwOworICAgIGZvciAoaSA9IFtzdGFjayBjb3VudF0tMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgTlNTdHJpbmcgKnQgPSBbc3RhY2sgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgLy8gTlNMb2coQCJzdGFjayAlZCA9ICVAXG4iLCBpLCB0KTsKKyAgICAgICAgaWYgKCBbdCBjb21tb25QcmVmaXhXaXRoU3RyaW5nOkAib3JnLmFudGxyLnJ1bnRpbWUuIiBvcHRpb25zOk5TTGl0ZXJhbFNlYXJjaF0gKSB7CisgICAgICAgICAgICAvLyBpZCBhQ2xhc3MgPSBvYmpjX2dldENsYXNzKCBbdCBVVEY4U3RyaW5nXSApOworICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgc3VwcG9ydCBjb2RlIHN1Y2ggYXMgdGhpcyBtZXRob2QKKyAgICAgICAgfQorICAgICAgICBpZiAoIFt0IGlzRXF1YWxUbzpORVhUX1RPS0VOX1JVTEVfTkFNRV0gKSB7CisgICAgICAgICAgICAvLyBuYW1lID0gc2VsX2dldE5hbWUobWV0aG9kX2dldE5hbWUobWV0aG9kKSk7CisgICAgICAgICAgICAvLyBOU1N0cmluZyAqYU1ldGhvZCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXMiLCBuYW1lXTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggIVt0IGlzRXF1YWxUbzpyZWNvZ25pemVyQ2xhc3NOYW1lXSApIHsKKyAgICAgICAgICAgIC8vIG5hbWUgPSBjbGFzc19nZXROYW1lKCBbdCBVVEY4U3RyaW5nXSApOworICAgICAgICAgICAgY29udGludWU7IC8vIG11c3Qgbm90IGJlIHBhcnQgb2YgdGhpcyBwYXJzZXIKKyAgICAgICAgfQorICAgICAgICBbcnVsZXMgYWRkT2JqZWN0OnRdOworICAgIH0KKyNpZmRlZiBET05UVVNFWUVUCisgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFjayA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGk9c3RhY2subGVuZ3RoLTE7IGk+PTA7IGktLSkgeworICAgICAgICBTdGFja1RyYWNlRWxlbWVudCB0ID0gc3RhY2tbaV07CisgICAgICAgIGlmICggW3QgZ2V0Q2xhc3NOYW1lKCkuc3RhcnRzV2l0aCgib3JnLmFudGxyLnJ1bnRpbWUuIikgKSB7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBzdXBwb3J0IGNvZGUgc3VjaCBhcyB0aGlzIG1ldGhvZAorICAgICAgICB9CisgICAgICAgICAgICAgIGlmICggW1t0IGdldE1ldGhvZE5hbWVdIGVxdWFsczpORVhUX1RPS0VOX1JVTEVfTkFNRV0gKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoICFbW3QgZ2V0Q2xhc3NOYW1lXSBlcXVhbHM6cmVjb2duaXplckNsYXNzTmFtZV0gKSB7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gbXVzdCBub3QgYmUgcGFydCBvZiB0aGlzIHBhcnNlcgorICAgICAgICB9CisgICAgICAgICAgICAgIFtydWxlcyBhZGRPYmplY3Q6W3QgZ2V0TWV0aG9kTmFtZV1dOworICAgIH0KKyNlbmRpZgorICAgIFtzdGFjayByZWxlYXNlXTsKKyAgICByZXR1cm4gcnVsZXM7Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0QmFja3RyYWNraW5nTGV2ZWwKK3sKKyAgICByZXR1cm4gW3N0YXRlIGdldEJhY2t0cmFja2luZ107Cit9CisgICAgICAKKy0gKHZvaWQpIHNldEJhY2t0cmFja2luZ0xldmVsOihOU0ludGVnZXIpbGV2ZWwKK3sKKyAgICBbc3RhdGUgc2V0QmFja3RyYWNraW5nOmxldmVsXTsKK30KKyAgICAgIAorICAgICAgICAvKiogVXNlZCB0byBwcmludCBvdXQgdG9rZW4gbmFtZXMgbGlrZSBJRCBkdXJpbmcgZGVidWdnaW5nIGFuZAorICogIGVycm9yIHJlcG9ydGluZy4gIFRoZSBnZW5lcmF0ZWQgcGFyc2VycyBpbXBsZW1lbnQgYSBtZXRob2QKKyAqICB0aGF0IG92ZXJyaWRlcyB0aGlzIHRvIHBvaW50IHRvIHRoZWlyIFN0cmluZ1tdIHRva2VuTmFtZXMuCisgKi8KKy0gKE5TQXJyYXkgKilnZXRUb2tlbk5hbWVzCit7CisgICAgcmV0dXJuIHRva2VuTmFtZXM7Cit9CisKKy8qKiBGb3IgZGVidWdnaW5nIGFuZCBvdGhlciBwdXJwb3NlcywgbWlnaHQgd2FudCB0aGUgZ3JhbW1hciBuYW1lLgorICogIEhhdmUgQU5UTFIgZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgbWV0aG9kLgorICovCistIChOU1N0cmluZyAqKWdldEdyYW1tYXJGaWxlTmFtZQoreworICAgIHJldHVybiBncmFtbWFyRmlsZU5hbWU7Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZQoreworICAgIHJldHVybiBuaWw7Cit9CisKKy8qKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgdXNlIG1vc3Qgb2Z0ZW4gd2l0aCB0ZW1wbGF0ZSByZXdyaXRlcy4KKyAqICBDb252ZXJ0IGEgTGlzdDxUb2tlbj4gdG8gTGlzdDxTdHJpbmc+CisgKi8KKy0gKEFNdXRhYmxlQXJyYXkgKil0b1N0cmluZ3M6KEFNdXRhYmxlQXJyYXkgKil0b2tlbnMKK3sKKyAgICBpZiAoIHRva2VucyA9PSBuaWwgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIEFNdXRhYmxlQXJyYXkgKnN0cmluZ3MgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTpbdG9rZW5zIGNvdW50XV07CisgICAgaWQgb2JqZWN0OworICAgIE5TSW50ZWdlciBpID0gMDsKKyAgICBmb3IgKG9iamVjdCBpbiB0b2tlbnMpIHsKKyAgICAgICAgW3N0cmluZ3MgYWRkT2JqZWN0OltvYmplY3QgdGV4dF1dOworICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBzdHJpbmdzOworfQorCisvKiogR2l2ZW4gYSBydWxlIG51bWJlciBhbmQgYSBzdGFydCB0b2tlbiBpbmRleCBudW1iZXIsIHJldHVybgorICogIEFOVExSX01FTU9fUlVMRV9VTktOT1dOIGlmIHRoZSBydWxlIGhhcyBub3QgcGFyc2VkIGlucHV0IHN0YXJ0aW5nIGZyb20KKyAqICBzdGFydCBpbmRleC4gIElmIHRoaXMgcnVsZSBoYXMgcGFyc2VkIGlucHV0IHN0YXJ0aW5nIGZyb20gdGhlCisgKiAgc3RhcnQgaW5kZXggYmVmb3JlLCB0aGVuIHJldHVybiB3aGVyZSB0aGUgcnVsZSBzdG9wcGVkIHBhcnNpbmcuCisgKiAgSXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdG9rZW4gbWF0Y2hlZCBieSB0aGUgcnVsZS4KKyAqCisgKiAgRm9yIG5vdyB3ZSB1c2UgYSBoYXNodGFibGUgYW5kIGp1c3QgdGhlIHNsb3cgT2JqZWN0LWJhc2VkIG9uZS4KKyAqICBMYXRlciwgd2UgY2FuIG1ha2UgYSBzcGVjaWFsIG9uZSBmb3IgaW50cyBhbmQgYWxzbyBvbmUgdGhhdAorICogIHRvc3NlcyBvdXQgZGF0YSBhZnRlciB3ZSBjb21taXQgcGFzdCBpbnB1dCBwb3NpdGlvbiBpLgorICovCistIChOU0ludGVnZXIpZ2V0UnVsZU1lbW9pemF0aW9uOihOU0ludGVnZXIpcnVsZUluZGV4IFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilydWxlU3RhcnRJbmRleAoreworICAgIE5TTnVtYmVyICpzdG9wSW5kZXhJOworICAgIEFOVExSSGFzaFJ1bGUgKmFIYXNoUnVsZTsKKyAgICBpZiAoIChhSGFzaFJ1bGUgPSBbc3RhdGUucnVsZU1lbW8gb2JqZWN0QXRJbmRleDpydWxlSW5kZXhdKSA9PSBuaWwgKSB7CisgICAgICAgIGFIYXNoUnVsZSA9IFtBTlRMUkhhc2hSdWxlIG5ld0FOVExSSGFzaFJ1bGVXaXRoTGVuOjE3XTsKKyAgICAgICAgW3N0YXRlLnJ1bGVNZW1vIGluc2VydE9iamVjdDphSGFzaFJ1bGUgYXRJbmRleDpydWxlSW5kZXhdOworICAgIH0KKyAgICBzdG9wSW5kZXhJID0gW2FIYXNoUnVsZSBnZXRSdWxlTWVtb1N0b3BJbmRleDpydWxlU3RhcnRJbmRleF07CisgICAgaWYgKCBzdG9wSW5kZXhJID09IG5pbCApIHsKKyAgICAgICAgcmV0dXJuIEFOVExSX01FTU9fUlVMRV9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gW3N0b3BJbmRleEkgaW50ZWdlclZhbHVlXTsKK30KKworLyoqIEhhcyB0aGlzIHJ1bGUgYWxyZWFkeSBwYXJzZWQgaW5wdXQgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlCisgKiAgaW5wdXQgc3RyZWFtPyAgUmV0dXJuIHRoZSBzdG9wIHRva2VuIGluZGV4IG9yIE1FTU9fUlVMRV9VTktOT1dOLgorICogIElmIHdlIGF0dGVtcHRlZCBidXQgZmFpbGVkIHRvIHBhcnNlIHByb3Blcmx5IGJlZm9yZSwgcmV0dXJuCisgKiAgTUVNT19SVUxFX0ZBSUxFRC4KKyAqCisgKiAgVGhpcyBtZXRob2QgaGFzIGEgc2lkZS1lZmZlY3Q6IGlmIHdlIGhhdmUgc2VlbiB0aGlzIGlucHV0IGZvcgorICogIHRoaXMgcnVsZSBhbmQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBiZWZvcmUsIHRoZW4gc2VlayBhaGVhZCB0bworICogIDEgcGFzdCB0aGUgc3RvcCB0b2tlbiBtYXRjaGVkIGZvciB0aGlzIHJ1bGUgbGFzdCB0aW1lLgorICovCistIChCT09MKWFscmVhZHlQYXJzZWRSdWxlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKK3sKKyAgICBOU0ludGVnZXIgYVN0b3BJbmRleCA9IFtzZWxmIGdldFJ1bGVNZW1vaXphdGlvbjpydWxlSW5kZXggU3RhcnRJbmRleDphbklucHV0LmluZGV4XTsKKyAgICBpZiAoIGFTdG9wSW5kZXggPT0gQU5UTFJfTUVNT19SVUxFX1VOS05PV04gKSB7CisgICAgICAgIC8vIE5TTG9nKEAicnVsZSAlZCBub3QgeWV0IGVuY291bnRlcmVkXG4iLCBydWxlSW5kZXgpOworICAgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICggYVN0b3BJbmRleCA9PSBBTlRMUl9NRU1PX1JVTEVfRkFJTEVEICkgeworICAgICAgICBpZiAoZGVidWcpIE5TTG9nKEAicnVsZSAlZCB3aWxsIG5ldmVyIHN1Y2NlZWRcbiIsIHJ1bGVJbmRleCk7CisgICAgICAgIHN0YXRlLmZhaWxlZCA9IFlFUzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChkZWJ1ZykgTlNMb2coQCJzZWVuIHJ1bGUgJWQgYmVmb3JlOyBza2lwcGluZyBhaGVhZCB0byAlZCBmYWlsZWQgPSAlQFxuIiwgcnVsZUluZGV4LCBhU3RvcEluZGV4KzEsIHN0YXRlLmZhaWxlZD9AIllFUyI6QCJOTyIpOworICAgICAgICBbYW5JbnB1dCBzZWVrOihhU3RvcEluZGV4KzEpXTsgLy8ganVtcCB0byBvbmUgcGFzdCBzdG9wIHRva2VuCisgICAgfQorICAgIHJldHVybiBZRVM7Cit9CisgICAgICAKKy8qKiBSZWNvcmQgd2hldGhlciBvciBub3QgdGhpcyBydWxlIHBhcnNlZCB0aGUgaW5wdXQgYXQgdGhpcyBwb3NpdGlvbgorICogIHN1Y2Nlc3NmdWxseS4gIFVzZSBhIHN0YW5kYXJkIGphdmEgaGFzaHRhYmxlIGZvciBub3cuCisgKi8KKy0gKHZvaWQpbWVtb2l6ZTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgIFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleAorICAgICBTdGFydEluZGV4OihOU0ludGVnZXIpcnVsZVN0YXJ0SW5kZXgKK3sKKyAgICBBTlRMUlJ1bGVTdGFjayAqYVJ1bGVTdGFjazsKKyAgICBOU0ludGVnZXIgc3RvcFRva2VuSW5kZXg7CisKKyAgICBhUnVsZVN0YWNrID0gc3RhdGUucnVsZU1lbW87CisgICAgc3RvcFRva2VuSW5kZXggPSAoc3RhdGUuZmFpbGVkID8gQU5UTFJfTUVNT19SVUxFX0ZBSUxFRCA6IChhbklucHV0LmluZGV4LTEpKTsKKyAgICBpZiAoIGFSdWxlU3RhY2sgPT0gbmlsICkgeworICAgICAgICBpZiAoZGVidWcpIE5TTG9nKEAiISEhISEhISEhIG1lbW8gYXJyYXkgaXMgbmlsIGZvciAlQCIsIFtzZWxmIGdldEdyYW1tYXJGaWxlTmFtZV0pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICggcnVsZUluZGV4ID49IFthUnVsZVN0YWNrIGxlbmd0aF0gKSB7CisgICAgICAgIGlmIChkZWJ1ZykgTlNMb2coQCIhISEhISEhISEgbWVtbyBzaXplIGlzICVkLCBidXQgcnVsZSBpbmRleCBpcyAlZCIsIFtzdGF0ZS5ydWxlTWVtbyBsZW5ndGhdLCBydWxlSW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICggW2FSdWxlU3RhY2sgb2JqZWN0QXRJbmRleDpydWxlSW5kZXhdICE9IG5pbCApIHsKKyAgICAgICAgW2FSdWxlU3RhY2sgcHV0SGFzaFJ1bGVBdFJ1bGVJbmRleDpydWxlSW5kZXggU3RhcnRJbmRleDpydWxlU3RhcnRJbmRleCBTdG9wSW5kZXg6c3RvcFRva2VuSW5kZXhdOworICAgIH0KKyAgICByZXR1cm47Cit9CisgICAKKy8qKiByZXR1cm4gaG93IG1hbnkgcnVsZS9pbnB1dC1pbmRleCBwYWlycyB0aGVyZSBhcmUgaW4gdG90YWwuCisgKiAgVE9ETzogdGhpcyBpbmNsdWRlcyBzeW5wcmVkcy4gOigKKyAqLworLSAoTlNJbnRlZ2VyKWdldFJ1bGVNZW1vaXphdGlvbkNhY2hlU2l6ZQoreworICAgIEFOVExSUnVsZVN0YWNrICphUnVsZVN0YWNrOworICAgIEFOVExSSGFzaFJ1bGUgKmFIYXNoUnVsZTsKKworICAgIGludCBhQ250ID0gMDsKKyAgICBhUnVsZVN0YWNrID0gc3RhdGUucnVsZU1lbW87CisgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBhUnVsZVN0YWNrICE9IG5pbCAmJiBpIDwgW2FSdWxlU3RhY2sgbGVuZ3RoXTsgaSsrKSB7CisgICAgICAgIGFIYXNoUnVsZSA9IFthUnVsZVN0YWNrIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggYUhhc2hSdWxlICE9IG5pbCApIHsKKyAgICAgICAgICAgIGFDbnQgKz0gW2FIYXNoUnVsZSBjb3VudF07IC8vIGhvdyBtYW55IGlucHV0IGluZGV4ZXMgYXJlIHJlY29yZGVkPworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorCisjcHJhZ21hIHdhcm5pbmcgSGF2ZSB0byBmaXggdHJhY2VJbiBhbmQgdHJhY2VPdXQuCistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbAoreworICAgIE5TTG9nKEAiZW50ZXIgJUAgJUAiLCBydWxlTmFtZSwgaW5wdXRTeW1ib2wpOworICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsKKyAgICAgICAgTlNMb2coQCIgYmFja3RyYWNraW5nPSVzIiwgKChzdGF0ZS5iYWNrdHJhY2tpbmc9PVlFUyk/IllFUyI6Ik5PIikpOworICAgIH0KKyAgICBOU0xvZyhAIlxuIik7Cit9CisKKy0gKHZvaWQpdHJhY2VPdXQ6KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXggT2JqZWN0OihpZClpbnB1dFN5bWJvbAoreworICAgIE5TTG9nKEAiZXhpdCAlQCAtLSAlQCIsIHJ1bGVOYW1lLCBpbnB1dFN5bWJvbCk7CisgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeworICAgICAgICBOU0xvZyhAIiBiYWNrdHJhY2tpbmc9JXMgJXMiLCBzdGF0ZS5iYWNrdHJhY2tpbmc/IllFUyI6Ik5PIiwgc3RhdGUuZmFpbGVkID8gImZhaWxlZCI6InN1Y2NlZWRlZCIpOworICAgIH0KKyAgICBOU0xvZyhAIlxuIik7Cit9CisKKworLy8gY2FsbCBhIHN5bnRhY3RpYyBwcmVkaWNhdGUgbWV0aG9kcyB1c2luZyBpdHMgc2VsZWN0b3IuIHRoaXMgd2F5IHdlIGNhbiBzdXBwb3J0IGFyYml0cmFyeSBzeW5wcmVkcy4KKy0gKEJPT0wpIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOihTRUwpc3lucHJlZEZyYWdtZW50IC8vIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWlucHV0Cit7CisgICAgaWQ8QU5UTFJJbnRTdHJlYW0+IGlucHV0OworCisgICAgc3RhdGUuYmFja3RyYWNraW5nKys7CisgICAgLy8gaW5wdXQgPSBzdGF0ZS50b2tlbi5pbnB1dDsKKyAgICBpbnB1dCA9IHNlbGYuaW5wdXQ7CisgICAgaW50IHN0YXJ0ID0gW2lucHV0IG1hcmtdOworICAgIEB0cnkgeworICAgICAgICBbc2VsZiBwZXJmb3JtU2VsZWN0b3I6c3lucHJlZEZyYWdtZW50XTsKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBOU0xvZyhAImltcG9zc2libGUgc3lucHJlZDogJUAiLCByZS5uYW1lKTsKKyAgICB9CisgICAgQk9PTCBzdWNjZXNzID0gKHN0YXRlLmZhaWxlZCA9PSBOTyk7CisgICAgW2lucHV0IHJld2luZDpzdGFydF07CisgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgc3RhdGUuZmFpbGVkID0gTk87CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisgICAgICAgICAgICAgIAorQGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlU3RhY2suaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1NjE3OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVN0YWNrLmgKQEAgLTAsMCArMSw2NiBAQAorLy8KKy8vICBBTlRMUkJhc2VSZWNvZ25pemVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUHRyQnVmZmVyLmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorLy8jZGVmaW5lIExPQ0FMX1NDT1BFICAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJCYXNlU3RhY2sgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy9BTlRMUlJ1bGVTdGFjayAqZk5leHQ7CisgICAgLy8gVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKK30KKworLy9AcHJvcGVydHkgKGNvcHkpIEFOVExSUnVsZVN0YWNrICpmTmV4dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2g6KSBOU0ludGVnZXIgTGFzdEhhc2g7CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrIChBTlRMUkJhc2VTdGFjayAqKW5ld0FOVExSQmFzZVN0YWNrOworKyAoQU5UTFJCYXNlU3RhY2sgKiluZXdBTlRMUkJhc2VTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQ7CistIChpZClpbml0OworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQ7CistICh2b2lkKWRlYWxsb2M7CisKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChOU1VJbnRlZ2VyKWNvdW50OworLSAoTlNVSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCisKKy0gKE5TSW50ZWdlcilnZXRMYXN0SGFzaDsKKy0gKHZvaWQpc2V0TGFzdEhhc2g6KE5TSW50ZWdlcilhVmFsOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VTdGFjay5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlU3RhY2subQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQyMjgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlU3RhY2subQpAQCAtMCwwICsxLDEzMSBAQAorLy8KKy8vICBBTlRMUkJhc2VSZWNvZ25pemVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJCYXNlU3RhY2suaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCisvKgorICogU3RhcnQgb2YgQU5UTFJCYXNlU3RhY2sKKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSQmFzZVN0YWNrCisKK0BzeW50aGVzaXplIExhc3RIYXNoOworCisrKEFOVExSQmFzZVN0YWNrICopbmV3QU5UTFJCYXNlU3RhY2sKK3sKKyAgICByZXR1cm4gW1tBTlRMUkJhc2VTdGFjayBhbGxvY10gaW5pdF07Cit9CisKKysoQU5UTFJCYXNlU3RhY2sgKiluZXdBTlRMUkJhc2VTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUkJhc2VTdGFjayBhbGxvY10gaW5pdFdpdGhMZW46Y250XTsKK30KKworLShpZClpbml0Cit7CisJc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpIQVNIU0laRV07CisJaWYgKCBzZWxmICE9IG5pbCApIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0oaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRXaXRoTGVuOmNudF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUkJhc2VTdGFjayIgKTsKKyNlbmRpZgorCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICBBTlRMUkJhc2VTdGFjayAqY29weTsKKyAgICAKKyAgICBjb3B5ID0gW3N1cGVyIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgcmV0dXJuIGNvcHk7Cit9CisKKy0gKE5TVUludGVnZXIpY291bnQKK3sKKyAgICBOU1VJbnRlZ2VyIGFDbnQgPSAwOworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAocHRyQnVmZmVyW2ldICE9IG5pbCkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorCistIChOU1VJbnRlZ2VyKSBzaXplCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistKHZvaWQpZGVsZXRlQU5UTFJCYXNlU3RhY2s6KEFOVExSQmFzZVN0YWNrICopbnAKK3sKKyAgICBpZCB0bXAsIHJ0bXA7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKyAgICBpZiAoIHNlbGYuZk5leHQgIT0gbmlsICkgeworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgIHRtcCA9IChBTlRMUkxpbmtCYXNlICopcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCApIHsKKyAgICAgICAgICAgICAgICBydG1wID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IFt0bXAgZ2V0Zk5leHRdOworICAgICAgICAgICAgICAgIFtydG1wIHJlbGVhc2VdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCistIChOU0ludGVnZXIpZ2V0TGFzdEhhc2gKK3sKKyAgICByZXR1cm4gTGFzdEhhc2g7Cit9CisKKy0gKHZvaWQpc2V0TGFzdEhhc2g6KE5TSW50ZWdlcilhVmFsCit7CisgICAgTGFzdEhhc2ggPSBhVmFsOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTEzOWNkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWUuaApAQCAtMCwwICsxLDIxMCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU11dGFibGVBcnJheS5oIgorCitAcHJvdG9jb2wgQU5UTFJCYXNlVHJlZSA8QU5UTFJUcmVlPgorCisrIChpZDxBTlRMUkJhc2VUcmVlPikgSU5WQUxJRF9OT0RFOworCisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3VHJlZTsKKysgKGlkPEFOVExSQmFzZVRyZWU+KSBuZXdUcmVlOihpZDxBTlRMUkJhc2VUcmVlPilub2RlOworCistIChpZDxBTlRMUkJhc2VUcmVlPikgaW5pdDsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBpbml0V2l0aDooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldENoaWxkOihOU1VJbnRlZ2VyKWk7CistIChBTXV0YWJsZUFycmF5ICopY2hpbGRyZW47CistICh2b2lkKSBzZXRDaGlsZHJlbjooQU11dGFibGVBcnJheSAqKWFuQXJyYXk7CistIChpZDxBTlRMUkJhc2VUcmVlPilnZXRGaXJzdENoaWxkV2l0aFR5cGU6KE5TSW50ZWdlcil0eXBlOworLSAoTlNVSW50ZWdlcikgZ2V0Q2hpbGRDb3VudDsKKworLy8gQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisvLyAgaXMgbmlsLCBhZGQgYWxsIGNoaWxkcmVuIG9mIHQgdG8gdGhpcycgY2hpbGRyZW4uCisKKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUkJhc2VUcmVlPikgdHJlZTsKKy0gKHZvaWQpIGFkZENoaWxkcmVuOihOU0FycmF5ICopIHRoZUNoaWxkcmVuOworLy8tICh2b2lkKSByZW1vdmVBbGxDaGlsZHJlbjsKKworLSAodm9pZCkgc2V0Q2hpbGQ6KE5TSW50ZWdlcikgaSBXaXRoOihpZDxBTlRMUkJhc2VUcmVlPil0OworLSAoaWQpIGRlbGV0ZUNoaWxkOihOU0ludGVnZXIpIGk7CistIChBTXV0YWJsZUFycmF5ICopIGNyZWF0ZUNoaWxkcmVuTGlzdDsKKy0gKHZvaWQpIHJlcGxhY2VDaGlsZHJlbkZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZCkgdDsKKy8vIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhIG5pbCBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworLy8gdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisKKy0gKEJPT0wpIGlzTmlsOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdG9wSW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CisKKy0gKHZvaWQpIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7CistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOihOU0ludGVnZXIpIG9mZnNldDsKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzOworLSAodm9pZCkgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6KGlkPEFOVExSQmFzZVRyZWU+KSBwYXJlbnQgQXQ6KE5TSW50ZWdlcikgaTsKKworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooTlNJbnRlZ2VyKWk7CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWdldEFuY2VzdG9yOihOU0ludGVnZXIpdHR5cGU7CistIChBTXV0YWJsZUFycmF5ICopZ2V0QW5jZXN0b3JzOworCisjcHJhZ21hIG1hcmsgQ29weWluZworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CS8vIHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkIGhlcmUhCistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisjcHJhZ21hIG1hcmsgVHJlZSBQYXJzZXIgc3VwcG9ydAorLSAoTlNJbnRlZ2VyKXR5cGU7CistIChOU1N0cmluZyAqKXRleHQ7CisvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU1VJbnRlZ2VyKWxpbmU7CistIChOU1VJbnRlZ2VyKWNoYXJQb3NpdGlvbkluTGluZTsKKworCisjcHJhZ21hIG1hcmsgSW5mb3JtYXRpb25hbAorLSAoTlNTdHJpbmcgKikgdHJlZURlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdUcmVlOworCitAcHJvcGVydHkgKHJldGFpbikgQU11dGFibGVBcnJheSAqY2hpbGRyZW47CitAcHJvcGVydHkgKHJldGFpbikgTlNFeGNlcHRpb24gKmFuRXhjZXB0aW9uOworCitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJCYXNlVHJlZSA6IE5TT2JqZWN0IDxBTlRMUlRyZWU+Cit7CisJX19zdHJvbmcgQU11dGFibGVBcnJheSAqY2hpbGRyZW47CisgICAgX19zdHJvbmcgTlNFeGNlcHRpb24gKmFuRXhjZXB0aW9uOworfQorCisrIChpZDxBTlRMUkJhc2VUcmVlPikgSU5WQUxJRF9OT0RFOworKyAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld1RyZWU7CisrIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3VHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKyAgICAgICAgIAorLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGluaXQ7CistIChpZDxBTlRMUkJhc2VUcmVlPikgaW5pdFdpdGg6KGlkPEFOVExSQmFzZVRyZWU+KW5vZGU7CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBnZXRDaGlsZDooTlNVSW50ZWdlcilpOworLSAoQU11dGFibGVBcnJheSAqKWNoaWxkcmVuOworLSAodm9pZCkgc2V0Q2hpbGRyZW46KEFNdXRhYmxlQXJyYXkgKilhbkFycmF5OworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOihOU0ludGVnZXIpdHlwZTsKKy0gKE5TVUludGVnZXIpIGdldENoaWxkQ291bnQ7CisKKy8vLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW47CisKKy8vIEFkZCB0IGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdCBpcyBudWxsLCBkbyBub3RoaW5nLiAgSWYgdAorLy8gIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJCYXNlVHJlZT4pIHRyZWU7CistICh2b2lkKSBhZGRDaGlsZHJlbjooTlNBcnJheSAqKSB0aGVDaGlsZHJlbjsKKworLSAodm9pZCkgc2V0Q2hpbGQ6KE5TVUludGVnZXIpIGkgV2l0aDooaWQ8QU5UTFJCYXNlVHJlZT4pdDsKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNVSW50ZWdlcikgaWR4OworLSAoQU11dGFibGVBcnJheSAqKSBjcmVhdGVDaGlsZHJlbkxpc3Q7CistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW5Gcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpIHQ7CisvLyBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKwkvLyB0aGUgdHJlZSBpcyBhIGZsYXQgbGlzdC4KKworLSAoQk9PTCkgaXNOaWw7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RhcnRJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKSBpbmRleDsKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5TdG9wSW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0b3BJbmRleDooTlNJbnRlZ2VyKSBpbmRleDsKKworLSAodm9pZCkgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczsKKy0gKHZvaWQpIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM6KE5TSW50ZWdlcikgb2Zmc2V0OworLSAodm9pZCkgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM7CistICh2b2lkKSBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczooaWQ8QU5UTFJCYXNlVHJlZT4pcGFyZW50IEF0OihOU0ludGVnZXIpIGk7CisKKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRJbmRleDsKKy0gKHZvaWQpIHNldENoaWxkSW5kZXg6KE5TSW50ZWdlcilpOworCistIChCT09MKSBoYXNBbmNlc3RvcjooTlNJbnRlZ2VyKSB0dHlwZTsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWdldEFuY2VzdG9yOihOU0ludGVnZXIpdHR5cGU7CistIChBTXV0YWJsZUFycmF5ICopZ2V0QW5jZXN0b3JzOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy0gKGlkKSBkZWVwQ29weTsJCQkJCS8vIHBlcmZvcm1zIGEgZGVlcENvcHlXaXRoWm9uZTogd2l0aCB0aGUgZGVmYXVsdCB6b25lCistIChpZCkgZGVlcENvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKwkvLyBSZXR1cm4gYSB0b2tlbiB0eXBlOyBuZWVkZWQgZm9yIHRyZWUgcGFyc2luZworLSAoTlNJbnRlZ2VyKXR5cGU7CistIChOU1N0cmluZyAqKXRleHQ7CisKKwkvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU1VJbnRlZ2VyKWxpbmU7CistIChOU1VJbnRlZ2VyKWNoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNVSW50ZWdlcilwb3M7CisKKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ1RyZWU7CisKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTXV0YWJsZUFycmF5ICpjaGlsZHJlbjsKK0Bwcm9wZXJ0eSAocmV0YWluKSBOU0V4Y2VwdGlvbiAqYW5FeGNlcHRpb247CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSA6IEFOVExSQmFzZVRyZWUgeworfQorLSAoaWQpIGluaXQ7CistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gOiBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSB7Cit9CisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gKikgZ2V0TmF2aWdhdGlvbk5vZGVEb3duOworLSAoaWQpIGluaXQ7CistIChOU0ludGVnZXIpIHRva2VuVHlwZTsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgOiBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSB7Cit9CisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZVVwICopIGdldE5hdmlnYXRpb25Ob2RlVXA7CistIChpZCkgaW5pdDsKKy0gKE5TSW50ZWdlcikgdG9rZW5UeXBlOworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVFT0YgOiBBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSB7Cit9CisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiAqKSBnZXROYXZpZ2F0aW9uTm9kZUVPRjsKKy0gKGlkKSBpbml0OworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGU7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKK0BlbmQKKworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRG93biAqbmF2aWdhdGlvbk5vZGVEb3duOworZXh0ZXJuIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgKm5hdmlnYXRpb25Ob2RlVXA7CitleHRlcm4gQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVFT0YgKm5hdmlnYXRpb25Ob2RlRU9GOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZS5tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViYTRlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJhc2VUcmVlLm0KQEAgLTAsMCArMSw2MTYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorLy8gVE9ETzogdGhpcyBzaG91bGRuJ3QgYmUgaGVyZS4uLmJ1dCBuZWVkZWQgZm9yIGludmFsaWROb2RlCisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJFcnJvci5oIgorCisjcHJhZ21hIG1hcmsgLSBOYXZpZ2F0aW9uIE5vZGVzCitBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gKm5hdmlnYXRpb25Ob2RlRG93biA9IG5pbDsKK0FOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgKm5hdmlnYXRpb25Ob2RlVXAgPSBuaWw7CitBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiAqbmF2aWdhdGlvbk5vZGVFT0YgPSBuaWw7CisKKworQGltcGxlbWVudGF0aW9uIEFOVExSQmFzZVRyZWUKKworc3RhdGljIGlkPEFOVExSQmFzZVRyZWU+IGludmFsaWROb2RlID0gbmlsOworCisjcHJhZ21hIG1hcmsgQU5UTFJUcmVlIHByb3RvY29sIGNvbmZvcm1hbmNlCisKKysgKGlkPEFOVExSQmFzZVRyZWU+KSBJTlZBTElEX05PREUKK3sKKwlpZiAoIGludmFsaWROb2RlID09IG5pbCApIHsKKwkJaW52YWxpZE5vZGUgPSBbW0FOVExSQ29tbW9uVHJlZSBhbGxvY10gaW5pdFdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkXTsKKwl9CisJcmV0dXJuIGludmFsaWROb2RlOworfQorCisrIChpZDxBTlRMUkJhc2VUcmVlPikgaW52YWxpZE5vZGUKK3sKKwlpZiAoIGludmFsaWROb2RlID09IG5pbCApIHsKKwkJaW52YWxpZE5vZGUgPSBbW0FOVExSQ29tbW9uVHJlZSBhbGxvY10gaW5pdFdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkXTsKKwl9CisJcmV0dXJuIGludmFsaWROb2RlOworfQorCisrIG5ld1RyZWUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkJhc2VUcmVlIGFsbG9jXSBpbml0XTsKK30KKworLyoqIENyZWF0ZSBhIG5ldyBub2RlIGZyb20gYW4gZXhpc3Rpbmcgbm9kZSBkb2VzIG5vdGhpbmcgZm9yIEFOVExSQmFzZVRyZWUKKyAqICBhcyB0aGVyZSBhcmUgbm8gZmllbGRzIG90aGVyIHRoYW4gdGhlIGNoaWxkcmVuIGxpc3QsIHdoaWNoIGNhbm5vdAorICogIGJlIGNvcGllZCBhcyB0aGUgY2hpbGRyZW4gYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhpcyBub2RlLiAKKyAqLworKyBuZXdUcmVlOihpZDxBTlRMUkJhc2VUcmVlPikgbm9kZQoreworICAgIHJldHVybiBbW0FOVExSQmFzZVRyZWUgYWxsb2NdIGluaXRXaXRoOihpZDxBTlRMUkJhc2VUcmVlPikgbm9kZV07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBjaGlsZHJlbiA9IG5pbDsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKGlkKSBpbml0V2l0aDooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgLy8gY2hpbGRyZW4gPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6NV0gcmV0YWluXTsKKyAgICAgICAgLy8gW2NoaWxkcmVuIGFkZE9iamVjdDpub2RlXTsKKyAgICAgICAgW3NlbGYgYWRkQ2hpbGQ6bm9kZV07CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICByZXR1cm4gbmlsOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSQmFzZVRyZWUiICk7CisjZW5kaWYKKwlpZiAoIGNoaWxkcmVuICkgW2NoaWxkcmVuIHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldENoaWxkOihOU1VJbnRlZ2VyKWkKK3sKKyAgICBpZiAoIGNoaWxkcmVuID09IG5pbCB8fCBpID49IFtjaGlsZHJlbiBjb3VudF0gKSB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIHJldHVybiAoaWQ8QU5UTFJCYXNlVHJlZT4pW2NoaWxkcmVuIG9iamVjdEF0SW5kZXg6aV07Cit9CisKKy8qKiBHZXQgdGhlIGNoaWxkcmVuIGludGVybmFsIExpc3Q7IG5vdGUgdGhhdCBpZiB5b3UgZGlyZWN0bHkgbWVzcyB3aXRoCisgKiAgdGhlIGxpc3QsIGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKi8KKy0gKEFNdXRhYmxlQXJyYXkgKikgY2hpbGRyZW4KK3sKKyAgICByZXR1cm4gY2hpbGRyZW47Cit9CisKKy0gKHZvaWQpIHNldENoaWxkcmVuOihBTXV0YWJsZUFycmF5ICopYW5BcnJheQoreworICAgIGlmICggY2hpbGRyZW4gIT0gYW5BcnJheSApIHsKKyAgICAgICAgaWYgKCBjaGlsZHJlbiApIFtjaGlsZHJlbiByZWxlYXNlXTsKKyAgICAgICAgaWYgKCBhbkFycmF5ICkgW2FuQXJyYXkgcmV0YWluXTsKKyAgICB9CisgICAgY2hpbGRyZW4gPSBhbkFycmF5OworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOihOU0ludGVnZXIpIGFUeXBlCit7CisgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBjaGlsZHJlbiAhPSBuaWwgJiYgaSA8IFtjaGlsZHJlbiBjb3VudF07IGkrKykgeworICAgICAgICBpZDxBTlRMUkJhc2VUcmVlPiB0ID0gKGlkPEFOVExSQmFzZVRyZWU+KSBbY2hpbGRyZW4gb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgaWYgKCB0LnR5cGUgPT0gYVR5cGUgKSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0JCisgICAgcmV0dXJuIG5pbDsKK30KKworLSAoTlNVSW50ZWdlcikgZ2V0Q2hpbGRDb3VudAoreworICAgIGlmICggY2hpbGRyZW4gPT0gbmlsICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIFtjaGlsZHJlbiBjb3VudF07Cit9CisKKy8qKiBBZGQgdCBhcyBjaGlsZCBvZiB0aGlzIG5vZGUuCisgKgorICogIFdhcm5pbmc6IGlmIHQgaGFzIG5vIGNoaWxkcmVuLCBidXQgY2hpbGQgZG9lcworICogIGFuZCBjaGlsZCBpc05pbCB0aGVuIHRoaXMgcm91dGluZSBtb3ZlcyBjaGlsZHJlbiB0byB0IHZpYQorICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4KKyAqLworLSAodm9pZCkgYWRkQ2hpbGQ6KGlkPEFOVExSQmFzZVRyZWU+KSB0Cit7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFkZCBjaGlsZCAiK3QudG9TdHJpbmdUcmVlKCkrIiAiK3NlbGYudG9TdHJpbmdUcmVlKCkpOworICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJleGlzdGluZyBjaGlsZHJlbjogIitjaGlsZHJlbik7CisgICAgaWYgKCB0ID09IG5pbCApIHsKKyAgICAgICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nIHVwb24gYWRkQ2hpbGQobmlsKQorICAgIH0KKyAgICBpZiAoIHNlbGYgPT0gKEFOVExSQmFzZVRyZWUgKil0ICkKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJBTlRMUkJhc2VUcmVlIENhbid0IGFkZCBzZWxmIHRvIHNlbGYgYXMgY2hpbGQiXTsgICAgICAgIAorICAgIGlkPEFOVExSQmFzZVRyZWU+IGNoaWxkVHJlZSA9IChpZDxBTlRMUkJhc2VUcmVlPikgdDsKKyAgICBpZiAoIFtjaGlsZFRyZWUgaXNOaWxdICkgeyAvLyB0IGlzIGFuIGVtcHR5IG5vZGUgcG9zc2libHkgd2l0aCBjaGlsZHJlbgorICAgICAgICBpZiAoIGNoaWxkcmVuICE9IG5pbCAmJiBjaGlsZHJlbiA9PSBjaGlsZFRyZWUuY2hpbGRyZW4gKSB7CisgICAgICAgICAgICBAdGhyb3cgW0FOVExSUnVudGltZUV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJBTlRMUkJhc2VUcmVlIGFkZCBjaGlsZCBsaXN0IHRvIGl0c2VsZiJdOworICAgICAgICB9CisgICAgICAgIC8vIGp1c3QgYWRkIGFsbCBvZiBjaGlsZFRyZWUncyBjaGlsZHJlbiB0byB0aGlzCisgICAgICAgIGlmICggY2hpbGRUcmVlLmNoaWxkcmVuICE9IG5pbCApIHsKKyAgICAgICAgICAgIGlmICggY2hpbGRyZW4gIT0gbmlsICkgeyAvLyBtdXN0IGNvcHksIHRoaXMgaGFzIGNoaWxkcmVuIGFscmVhZHkKKyAgICAgICAgICAgICAgICBpbnQgbiA9IFtjaGlsZFRyZWUuY2hpbGRyZW4gY291bnRdOworICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZDxBTlRMUkJhc2VUcmVlPiBjID0gKGlkPEFOVExSQmFzZVRyZWU+KVtjaGlsZFRyZWUuY2hpbGRyZW4gb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgICAgICAgICAgICAgW2NoaWxkcmVuIGFkZE9iamVjdDpjXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGRvdWJsZS1saW5rIHN0dWZmIGZvciBlYWNoIGNoaWxkIG9mIG5pbCByb290CisgICAgICAgICAgICAgICAgICAgIFtjIHNldFBhcmVudDooaWQ8QU5UTFJCYXNlVHJlZT4pc2VsZl07CisgICAgICAgICAgICAgICAgICAgIFtjIHNldENoaWxkSW5kZXg6W2NoaWxkcmVuIGNvdW50XS0xXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBubyBjaGlsZHJlbiBmb3IgdGhpcyBidXQgdCBoYXMgY2hpbGRyZW47IGp1c3Qgc2V0IHBvaW50ZXIKKyAgICAgICAgICAgICAgICAvLyBjYWxsIGdlbmVyYWwgZnJlc2hlbmVyIHJvdXRpbmUKKyAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkVHJlZS5jaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBbc2VsZiBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgLy8gY2hpbGQgaXMgbm90IG5pbCAoZG9uJ3QgY2FyZSBhYm91dCBjaGlsZHJlbikKKyAgICAgICAgaWYgKCBjaGlsZHJlbiA9PSBuaWwgKSB7CisgICAgICAgICAgICBjaGlsZHJlbiA9IFtbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTo1XSByZXRhaW5dOyAvLyBjcmVhdGUgY2hpbGRyZW4gbGlzdCBvbiBkZW1hbmQKKyAgICAgICAgfQorICAgICAgICBbY2hpbGRyZW4gYWRkT2JqZWN0OnRdOworICAgICAgICBbY2hpbGRUcmVlIHNldFBhcmVudDooaWQ8QU5UTFJCYXNlVHJlZT4pc2VsZl07CisgICAgICAgIFtjaGlsZFRyZWUgc2V0Q2hpbGRJbmRleDpbY2hpbGRyZW4gY291bnRdLTFdOworICAgIH0KKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vdyBjaGlsZHJlbiBhcmU6ICIrY2hpbGRyZW4pOworfQorCisvKiogQWRkIGFsbCBlbGVtZW50cyBvZiBraWRzIGxpc3QgYXMgY2hpbGRyZW4gb2YgdGhpcyBub2RlICovCistICh2b2lkKSBhZGRDaGlsZHJlbjooQU11dGFibGVBcnJheSAqKSBraWRzCit7CisgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgW2tpZHMgY291bnRdOyBpKyspIHsKKyAgICAgICAgaWQ8QU5UTFJCYXNlVHJlZT4gdCA9IChpZDxBTlRMUkJhc2VUcmVlPikgW2tpZHMgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgW3NlbGYgYWRkQ2hpbGQ6dF07CisgICAgfQorfQorCistICh2b2lkKSBzZXRDaGlsZDooTlNVSW50ZWdlcikgaSBXaXRoOihpZDxBTlRMUkJhc2VUcmVlPil0Cit7CisgICAgaWYgKCB0ID09IG5pbCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIFt0IGlzTmlsXSApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJBTlRMUkJhc2VUcmVlIENhbid0IHNldCBzaW5nbGUgY2hpbGQgdG8gYSBsaXN0Il07ICAgICAgICAKKyAgICB9CisgICAgaWYgKCBjaGlsZHJlbiA9PSBuaWwgKSB7CisgICAgICAgIGNoaWxkcmVuID0gW1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdIHJldGFpbl07CisgICAgfQorICAgIGlmIChbY2hpbGRyZW4gY291bnRdID4gaSApIHsKKyAgICAgICAgW2NoaWxkcmVuIHJlcGxhY2VPYmplY3RBdEluZGV4Omkgd2l0aE9iamVjdDp0XTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFtjaGlsZHJlbiBpbnNlcnRPYmplY3Q6dCBhdEluZGV4OmldOworICAgIH0KKyAgICBbdCBzZXRQYXJlbnQ6KGlkPEFOVExSQmFzZVRyZWU+KXNlbGZdOworICAgIFt0IHNldENoaWxkSW5kZXg6aV07Cit9CisKKy0gKGlkKSBkZWxldGVDaGlsZDooTlNVSW50ZWdlcikgaWR4Cit7CisgICAgaWYgKCBjaGlsZHJlbiA9PSBuaWwgKSB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIGlkPEFOVExSQmFzZVRyZWU+IGtpbGxlZCA9IChpZDxBTlRMUkJhc2VUcmVlPilbY2hpbGRyZW4gb2JqZWN0QXRJbmRleDppZHhdOworICAgIFtjaGlsZHJlbiByZW1vdmVPYmplY3RBdEluZGV4OmlkeF07CisgICAgLy8gd2FsayByZXN0IGFuZCBkZWNyZW1lbnQgdGhlaXIgY2hpbGQgaW5kZXhlcworICAgIFtzZWxmIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM6aWR4XTsKKyAgICByZXR1cm4ga2lsbGVkOworfQorCisvKiogRGVsZXRlIGNoaWxkcmVuIGZyb20gc3RhcnQgdG8gc3RvcCBhbmQgcmVwbGFjZSB3aXRoIHQgZXZlbiBpZiB0IGlzCisgKiAgYSBsaXN0IChuaWwtcm9vdCBBTlRMUlRyZWUpLiAgbnVtIG9mIGNoaWxkcmVuIGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZS4KKyAqICBGb3IgaHVnZSBjaGlsZCBsaXN0cywgaW5zZXJ0aW5nIGNoaWxkcmVuIGNhbiBmb3JjZSB3YWxraW5nIHJlc3Qgb2YKKyAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAqLworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0Cit7CisgICAgLyoKKyAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXBsYWNlQ2hpbGRyZW4gIitzdGFydENoaWxkSW5kZXgrIiwgIitzdG9wQ2hpbGRJbmRleCsKKyAgICAgIiB3aXRoICIrKChBTlRMUkJhc2VUcmVlKXQpLnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbj0iK3RvU3RyaW5nVHJlZSgpKTsKKyAgICAgKi8KKyAgICBpZiAoIGNoaWxkcmVuID09IG5pbCApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJBTlRMUkJhc2VUcmVlIEludmFsaWQgSW5kZXhlczsgbm8gY2hpbGRyZW4gaW4gbGlzdCJdOyAgICAgICAgCisgICAgfQorICAgIGludCByZXBsYWNpbmdIb3dNYW55ID0gc3RvcENoaWxkSW5kZXggLSBzdGFydENoaWxkSW5kZXggKyAxOworICAgIGludCByZXBsYWNpbmdXaXRoSG93TWFueTsKKyAgICBpZDxBTlRMUkJhc2VUcmVlPiBuZXdUcmVlID0gKGlkPEFOVExSQmFzZVRyZWU+KSB0OworICAgIEFNdXRhYmxlQXJyYXkgKm5ld0NoaWxkcmVuID0gbmlsOworICAgIC8vIG5vcm1hbGl6ZSB0byBhIGxpc3Qgb2YgY2hpbGRyZW4gdG8gYWRkOiBuZXdDaGlsZHJlbgorICAgIGlmICggW25ld1RyZWUgaXNOaWxdICkgeworICAgICAgICBuZXdDaGlsZHJlbiA9IG5ld1RyZWUuY2hpbGRyZW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdDaGlsZHJlbiA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdOworICAgICAgICBbbmV3Q2hpbGRyZW4gYWRkT2JqZWN0Om5ld1RyZWVdOworICAgIH0KKyAgICByZXBsYWNpbmdXaXRoSG93TWFueSA9IFtuZXdDaGlsZHJlbiBjb3VudF07CisgICAgaW50IG51bU5ld0NoaWxkcmVuID0gW25ld0NoaWxkcmVuIGNvdW50XTsKKyAgICBpbnQgZGVsdGEgPSByZXBsYWNpbmdIb3dNYW55IC0gcmVwbGFjaW5nV2l0aEhvd01hbnk7CisgICAgLy8gaWYgc2FtZSBudW1iZXIgb2Ygbm9kZXMsIGRvIGRpcmVjdCByZXBsYWNlCisgICAgaWYgKCBkZWx0YSA9PSAwICkgeworICAgICAgICBpbnQgaiA9IDA7IC8vIGluZGV4IGludG8gbmV3IGNoaWxkcmVuCisgICAgICAgIGZvciAoaW50IGk9c3RhcnRDaGlsZEluZGV4OyBpIDw9IHN0b3BDaGlsZEluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIGlkPEFOVExSQmFzZVRyZWU+IGNoaWxkID0gKGlkPEFOVExSQmFzZVRyZWU+KVtuZXdDaGlsZHJlbiBvYmplY3RBdEluZGV4OmpdOworICAgICAgICAgICAgW2NoaWxkcmVuIHJlcGxhY2VPYmplY3RBdEluZGV4Omkgd2l0aE9iamVjdDooaWQpY2hpbGRdOworICAgICAgICAgICAgW2NoaWxkIHNldFBhcmVudDooaWQ8QU5UTFJCYXNlVHJlZT4pc2VsZl07CisgICAgICAgICAgICBbY2hpbGQgc2V0Q2hpbGRJbmRleDppXTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggZGVsdGEgPiAwICkgeyAvLyBmZXdlciBuZXcgbm9kZXMgdGhhbiB0aGVyZSB3ZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNoaWxkcmVuIGFuZCB0aGVuIGRlbGV0ZSBleHRyYQorICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bU5ld0NoaWxkcmVuOyBqKyspIHsKKyAgICAgICAgICAgIFtjaGlsZHJlbiByZXBsYWNlT2JqZWN0QXRJbmRleDpzdGFydENoaWxkSW5kZXgraiB3aXRoT2JqZWN0OltuZXdDaGlsZHJlbiBvYmplY3RBdEluZGV4OmpdXTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXhUb0RlbGV0ZSA9IHN0YXJ0Q2hpbGRJbmRleCtudW1OZXdDaGlsZHJlbjsKKyAgICAgICAgZm9yIChpbnQgYz1pbmRleFRvRGVsZXRlOyBjPD1zdG9wQ2hpbGRJbmRleDsgYysrKSB7CisgICAgICAgICAgICAvLyBkZWxldGUgc2FtZSBpbmRleCwgc2hpZnRpbmcgZXZlcnlib2R5IGRvd24gZWFjaCB0aW1lCisgICAgICAgICAgICBbY2hpbGRyZW4gcmVtb3ZlT2JqZWN0QXRJbmRleDppbmRleFRvRGVsZXRlXTsKKyAgICAgICAgfQorICAgICAgICBbc2VsZiBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzOnN0YXJ0Q2hpbGRJbmRleF07CisgICAgfQorICAgIGVsc2UgeyAvLyBtb3JlIG5ldyBub2RlcyB0aGFuIHdlcmUgdGhlcmUgYmVmb3JlCisgICAgICAgICAgIC8vIGZpbGwgaW4gYXMgbWFueSBjaGlsZHJlbiBhcyB3ZSBjYW4gKHJlcGxhY2luZ0hvd01hbnkpIHcvbyBtb3ZpbmcgZGF0YQorICAgICAgICBmb3IgKGludCBqPTA7IGo8cmVwbGFjaW5nSG93TWFueTsgaisrKSB7CisgICAgICAgICAgICBbY2hpbGRyZW4gcmVwbGFjZU9iamVjdEF0SW5kZXg6c3RhcnRDaGlsZEluZGV4K2ogd2l0aE9iamVjdDpbbmV3Q2hpbGRyZW4gb2JqZWN0QXRJbmRleDpqXV07CisgICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIGludCBudW1Ub0luc2VydCA9IHJlcGxhY2luZ1dpdGhIb3dNYW55LXJlcGxhY2luZ0hvd01hbnk7CisgICAgICAgIGZvciAoaW50IGo9cmVwbGFjaW5nSG93TWFueTsgajxyZXBsYWNpbmdXaXRoSG93TWFueTsgaisrKSB7CisgICAgICAgICAgICBbY2hpbGRyZW4gaW5zZXJ0T2JqZWN0OltuZXdDaGlsZHJlbiBvYmplY3RBdEluZGV4OmpdIGF0SW5kZXg6c3RhcnRDaGlsZEluZGV4K2pdOworICAgICAgICB9CisgICAgICAgIFtzZWxmIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM6c3RhcnRDaGlsZEluZGV4XTsKKyAgICB9CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm91dD0iK3RvU3RyaW5nVHJlZSgpKTsKK30KKworLyoqIE92ZXJyaWRlIGluIGEgc3ViY2xhc3MgdG8gY2hhbmdlIHRoZSBpbXBsIG9mIGNoaWxkcmVuIGxpc3QgKi8KKy0gKEFNdXRhYmxlQXJyYXkgKikgY3JlYXRlQ2hpbGRyZW5MaXN0Cit7CisgICAgcmV0dXJuIFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdOworfQorCistIChCT09MKSBpc05pbAoreworICAgIHJldHVybiBOTzsKK30KKworLyoqIFNldCB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbmRleCB2YWx1ZXMgZm9yIGFsbCBjaGlsZCBvZiB0ICovCistICh2b2lkKSBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzCit7CisgICAgW3NlbGYgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczowXTsKK30KKyAgICAgICAgICAgICAgIAorLSAodm9pZCkgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlczooTlNJbnRlZ2VyKSBvZmZzZXQKK3sKKyAgICBpbnQgbiA9IFtzZWxmIGdldENoaWxkQ291bnRdOworICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWQ8QU5UTFJCYXNlVHJlZT4gY2hpbGQgPSAoaWQ8QU5UTFJCYXNlVHJlZT4pW3NlbGYgZ2V0Q2hpbGQ6aV07CisgICAgICAgIFtjaGlsZCBzZXRDaGlsZEluZGV4OmldOworICAgICAgICBbY2hpbGQgc2V0UGFyZW50OihpZDxBTlRMUkJhc2VUcmVlPilzZWxmXTsKKyAgICB9Cit9CisgICAgICAgICAgICAgICAKKy0gKHZvaWQpIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzCit7CisgICAgW3NlbGYgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6bmlsIEF0Oi0xXTsKK30KKyAgICAgICAgICAgICAgIAorLSAodm9pZCkgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6KGlkPEFOVExSQmFzZVRyZWU+KWFQYXJlbnQgQXQ6KE5TSW50ZWdlcikgaQoreworICAgIGlmICggYVBhcmVudCAhPSBbc2VsZiBnZXRQYXJlbnRdICkgeworICAgICAgICBAdGhyb3cgW0FOVExSSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInBhcmVudHMgZG9uJ3QgbWF0Y2g7IGV4cGVjdGVkICVzIGZvdW5kICVzIiwgYVBhcmVudCwgW3NlbGYgZ2V0UGFyZW50XV1dOworICAgIH0KKyAgICBpZiAoIGkgIT0gW3NlbGYgZ2V0Q2hpbGRJbmRleF0gKSB7CisgICAgICAgIEB0aHJvdyBbQU5UTFJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiY2hpbGQgaW5kZXhlcyBkb24ndCBtYXRjaDsgZXhwZWN0ZWQgJWQgZm91bmQgJWQiLCBpLCBbc2VsZiBnZXRDaGlsZEluZGV4XV1dOworICAgIH0KKyAgICBpbnQgbiA9IFtzZWxmIGdldENoaWxkQ291bnRdOworICAgIGZvciAoaW50IGMgPSAwOyBjIDwgbjsgYysrKSB7CisgICAgICAgIGlkPEFOVExSQmFzZVRyZWU+IGNoaWxkID0gKGlkPEFOVExSQmFzZVRyZWU+KVtzZWxmIGdldENoaWxkOmNdOworICAgICAgICBbY2hpbGQgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXM6KGlkPEFOVExSQmFzZVRyZWU+KXNlbGYgQXQ6Y107CisgICAgfQorfQorICAgICAgICAgICAgICAgCisvKiogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXgKK3sKKyAgICByZXR1cm4gMDsKK30KKworLSAodm9pZCkgc2V0VG9rZW5TdGFydEluZGV4OihOU0ludGVnZXIpIGFuSW5kZXgKK3sKK30KKworLyoqICBXaGF0IGlzIHRoZSBsYXJnZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAqICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleAoreworICAgIHJldHVybiAwOworfQorCistICh2b2lkKSBzZXRUb2tlblN0b3BJbmRleDooTlNJbnRlZ2VyKSBhbkluZGV4Cit7Cit9CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBkdXBOb2RlCit7CisgICAgcmV0dXJuIG5pbDsKK30KKworCisvKiogQU5UTFJCYXNlVHJlZSBkb2Vzbid0IHRyYWNrIGNoaWxkIGluZGV4ZXMuICovCistIChOU0ludGVnZXIpIGdldENoaWxkSW5kZXgKK3sKKyAgICByZXR1cm4gMDsKK30KKworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooTlNJbnRlZ2VyKSBhbkluZGV4Cit7Cit9CisKKy8qKiBBTlRMUkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgcGFyZW50IHBvaW50ZXJzLiAqLworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldFBhcmVudAoreworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpIHNldFBhcmVudDooaWQ8QU5UTFJCYXNlVHJlZT4pIHQKK3sKK30KKworLyoqIFdhbGsgdXB3YXJkcyBsb29raW5nIGZvciBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS4gKi8KKy0gKEJPT0wpIGhhc0FuY2VzdG9yOihOU0ludGVnZXIpIHR0eXBlCit7CisgICAgcmV0dXJuKFtzZWxmIGdldEFuY2VzdG9yOnR0eXBlXSAhPSBuaWwpOworfQorCisvKiogV2FsayB1cHdhcmRzIGFuZCBnZXQgZmlyc3QgYW5jZXN0b3Igd2l0aCB0aGlzIHRva2VuIHR5cGUuICovCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGUKK3sKKyAgICBpZDxBTlRMUkJhc2VUcmVlPiB0ID0gKGlkPEFOVExSQmFzZVRyZWU+KXNlbGY7CisgICAgdCA9IChpZDxBTlRMUkJhc2VUcmVlPilbdCBnZXRQYXJlbnRdOworICAgIHdoaWxlICggdCAhPSBuaWwgKSB7CisgICAgICAgIGlmICggdC50eXBlID09IHR0eXBlICkKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB0ID0gKGlkPEFOVExSQmFzZVRyZWU+KVt0IGdldFBhcmVudF07CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAqLworLSAoQU11dGFibGVBcnJheSAqKWdldEFuY2VzdG9ycworeworICAgIGlmICggW3NlbGYgZ2V0UGFyZW50XSA9PSBuaWwgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIEFNdXRhYmxlQXJyYXkgKmFuY2VzdG9ycyA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdOworICAgIGlkPEFOVExSQmFzZVRyZWU+IHQgPSAoaWQ8QU5UTFJCYXNlVHJlZT4pc2VsZjsKKyAgICB0ID0gKGlkPEFOVExSQmFzZVRyZWU+KVt0IGdldFBhcmVudF07CisgICAgd2hpbGUgKCB0ICE9IG5pbCApIHsKKyAgICAgICAgW2FuY2VzdG9ycyBpbnNlcnRPYmplY3Q6dCBhdEluZGV4OjBdOyAvLyBpbnNlcnQgYXQgc3RhcnQKKyAgICAgICAgdCA9IChpZDxBTlRMUkJhc2VUcmVlPilbdCBnZXRQYXJlbnRdOworICAgIH0KKyAgICByZXR1cm4gYW5jZXN0b3JzOworfQorCistIChOU0ludGVnZXIpdHlwZQoreworICAgIHJldHVybiBBTlRMUlRva2VuVHlwZUludmFsaWQ7Cit9CisKKy0gKE5TU3RyaW5nICopdGV4dAoreworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKE5TVUludGVnZXIpbGluZQoreworICAgIHJldHVybiAwOworfQorCistIChOU1VJbnRlZ2VyKWNoYXJQb3NpdGlvbkluTGluZQoreworICAgIHJldHVybiAwOworfQorCistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpIHBvcworeworfQorCisjcHJhZ21hIG1hcmsgQ29weWluZworICAgICAKKyAgICAgLy8gdGhlIGNoaWxkcmVuIHRoZW1zZWx2ZXMgYXJlIG5vdCBjb3BpZWQgaGVyZSEKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgaWQ8QU5UTFJCYXNlVHJlZT4gdGhlQ29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworICAgIFt0aGVDb3B5IGFkZENoaWxkcmVuOnNlbGYuY2hpbGRyZW5dOworICAgIHJldHVybiB0aGVDb3B5OworfQorICAgICAKKy0gKGlkKSBkZWVwQ29weSAJCQkJCS8vIHBlcmZvcm1zIGEgZGVlcENvcHlXaXRoWm9uZTogd2l0aCB0aGUgZGVmYXVsdCB6b25lCit7CisgICAgcmV0dXJuIFtzZWxmIGRlZXBDb3B5V2l0aFpvbmU6TlVMTF07Cit9CisgICAgIAorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgaWQ8QU5UTFJCYXNlVHJlZT4gdGhlQ29weSA9IFtzZWxmIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgICAgIAorICAgIGlmICggW3RoZUNvcHkuY2hpbGRyZW4gY291bnRdICkKKyAgICAgICAgW3RoZUNvcHkuY2hpbGRyZW4gcmVtb3ZlQWxsT2JqZWN0c107CisgICAgQU11dGFibGVBcnJheSAqY2hpbGRyZW5Db3B5ID0gdGhlQ29weS5jaGlsZHJlbjsKKyAgICBmb3IgKGlkIGxvb3BJdGVtIGluIGNoaWxkcmVuKSB7CisgICAgICAgIGlkPEFOVExSQmFzZVRyZWU+IGNoaWxkQ29weSA9IFtsb29wSXRlbSBkZWVwQ29weVdpdGhab25lOmFab25lXTsKKyAgICAgICAgW3RoZUNvcHkgYWRkQ2hpbGQ6Y2hpbGRDb3B5XTsKKyAgICB9CisgICAgaWYgKCBjaGlsZHJlbkNvcHkgKSBbY2hpbGRyZW5Db3B5IHJlbGVhc2VdOworICAgIHJldHVybiB0aGVDb3B5OworfQorICAgICAKKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbgoreworICAgIGlmICggY2hpbGRyZW4gPT0gbmlsIHx8IFtjaGlsZHJlbiBjb3VudF0gPT0gMCApIHsKKyAgICAgICAgcmV0dXJuIFtzZWxmIGRlc2NyaXB0aW9uXTsKKyAgICB9CisgICAgTlNNdXRhYmxlU3RyaW5nICpidWYgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhDYXBhY2l0eTpbY2hpbGRyZW4gY291bnRdXTsKKyAgICBpZiAoICFbc2VsZiBpc05pbF0gKSB7CisgICAgICAgIFtidWYgYXBwZW5kU3RyaW5nOkAiKCJdOworICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpbc2VsZiB0b1N0cmluZ11dOworICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpAIiAiXTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGNoaWxkcmVuICE9IG5pbCAmJiBpIDwgW2NoaWxkcmVuIGNvdW50XTsgaSsrKSB7CisgICAgICAgIGlkPEFOVExSQmFzZVRyZWU+IHQgPSAoaWQ8QU5UTFJCYXNlVHJlZT4pW2NoaWxkcmVuIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggaSA+IDAgKSB7CisgICAgICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpAIiAiXTsKKyAgICAgICAgfQorICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpbKGlkPEFOVExSQmFzZVRyZWU+KXQgdG9TdHJpbmdUcmVlXV07CisgICAgfQorICAgIGlmICggIVtzZWxmIGlzTmlsXSApIHsKKyAgICAgICAgW2J1ZiBhcHBlbmRTdHJpbmc6QCIpIl07CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKKy8qKiBQcmludCBvdXQgYSB3aG9sZSB0cmVlIG5vdCBqdXN0IGEgbm9kZSAqLworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdUcmVlCit7CisgICAgcmV0dXJuIFtzZWxmIHRyZWVEZXNjcmlwdGlvbl07Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLyoqIE92ZXJyaWRlIHRvIHNheSBob3cgYSBub2RlIChub3QgYSB0cmVlKSBzaG91bGQgbG9vayBhcyB0ZXh0ICovCistIChOU1N0cmluZyAqKSB0b1N0cmluZworeworICAgIHJldHVybiBuaWw7Cit9CisKK0BzeW50aGVzaXplIGNoaWxkcmVuOworQHN5bnRoZXNpemUgYW5FeGNlcHRpb247CisKK0BlbmQKKworI3ByYWdtYSBtYXJrIC0KKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlCistIChpZClpbml0Cit7CisgICAgc2VsZiA9IChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZSAqKVtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKwlyZXR1cm4gbmlsOworfQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVEb3duCisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gKikgZ2V0TmF2aWdhdGlvbk5vZGVEb3duCit7CisgICAgaWYgKCBuYXZpZ2F0aW9uTm9kZURvd24gPT0gbmlsICkKKyAgICAgICAgbmF2aWdhdGlvbk5vZGVEb3duID0gW1tBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZURvd24gYWxsb2NdIGluaXRdOworICAgIHJldHVybiBuYXZpZ2F0aW9uTm9kZURvd247Cit9CisKKy0gKGlkKWluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCistIChOU0ludGVnZXIpIHRva2VuVHlwZSB7IHJldHVybiBBTlRMUlRva2VuVHlwZURPV047IH0KKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uIHsgcmV0dXJuIEAiRE9XTiI7IH0KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAKKysgKEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlVXAgKikgZ2V0TmF2aWdhdGlvbk5vZGVVcAoreworICAgIGlmICggbmF2aWdhdGlvbk5vZGVVcCA9PSBuaWwgKQorICAgICAgICBuYXZpZ2F0aW9uTm9kZVVwID0gW1tBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZVVwIGFsbG9jXSBpbml0XTsKKyAgICByZXR1cm4gbmF2aWdhdGlvbk5vZGVVcDsKK30KKworCistIChpZClpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGUgeyByZXR1cm4gQU5UTFJUb2tlblR5cGVVUDsgfQorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24geyByZXR1cm4gQCJVUCI7IH0KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZU5hdmlnYXRpb25Ob2RlRU9GCisrIChBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiAqKSBnZXROYXZpZ2F0aW9uTm9kZUVPRgoreworICAgIGlmICggbmF2aWdhdGlvbk5vZGVFT0YgPT0gbmlsICkKKyAgICAgICAgbmF2aWdhdGlvbk5vZGVFT0YgPSBbW0FOVExSVHJlZU5hdmlnYXRpb25Ob2RlRU9GIGFsbG9jXSBpbml0XTsKKyAgICByZXR1cm4gbmF2aWdhdGlvbk5vZGVFT0Y7Cit9CisKKy0gKGlkKWluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCistIChOU0ludGVnZXIpIHRva2VuVHlwZSB7IHJldHVybiBBTlRMUlRva2VuVHlwZUVPRjsgfQorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24geyByZXR1cm4gQCJFT0YiOyB9CisKK0BlbmQKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlZDBkMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLmgKQEAgLTAsMCArMSwxODIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25FcnJvck5vZGUuaCIKKyNpbXBvcnQgIkFOVExSVW5pcXVlSURNYXAuaCIKKworQGludGVyZmFjZSBBTlRMUkJhc2VUcmVlQWRhcHRvciA6IE5TT2JqZWN0IDxBTlRMUlRyZWVBZGFwdG9yLCBOU0NvcHlpbmc+IHsKKyAgICBBTlRMUlVuaXF1ZUlETWFwICp0cmVlVG9VbmlxdWVJRE1hcDsKKwlOU0ludGVnZXIgdW5pcXVlTm9kZUlEOworfQorCistIChpZCkgaW5pdDsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKGlkKSBlbXB0eU5vZGU7CisKKy0gKGlkKSBjcmVhdGVOaWw7CisKKy8qKiBjcmVhdGUgdHJlZSBub2RlIHRoYXQgaG9sZHMgdGhlIHN0YXJ0IGFuZCBzdG9wIHRva2VucyBhc3NvY2lhdGVkCisgKiAgd2l0aCBhbiBlcnJvci4KKyAqCisgKiAgSWYgeW91IHNwZWNpZnkgeW91ciBvd24ga2luZCBvZiB0cmVlIG5vZGVzLCB5b3Ugd2lsbCBsaWtlbHkgaGF2ZSB0bworICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBDb21tb25UcmVlIHJldHVybnMgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFCisgKiAgaWYgbm8gdG9rZW4gcGF5bG9hZCBidXQgeW91IG1pZ2h0IGhhdmUgdG8gc2V0IHRva2VuIHR5cGUgZm9yIGRpZmYKKyAqICBub2RlIHR5cGUuCisgKgorICogIFlvdSBkb24ndCBoYXZlIHRvIHN1YmNsYXNzIENvbW1vbkVycm9yTm9kZTsgeW91IHdpbGwgbGlrZWx5IG5lZWQgdG8KKyAqICBzdWJjbGFzcyB5b3VyIG93biB0cmVlIG5vZGUgY2xhc3MgdG8gYXZvaWQgY2xhc3MgY2FzdCBleGNlcHRpb24uCisgKi8KKy0gKGlkKSBlcnJvck5vZGU6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgIEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgIEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKikgZTsKKworLSAoQk9PTCkgaXNOaWw6KGlkPEFOVExSQmFzZVRyZWU+KSBhVHJlZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZHVwVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWU7CisKKy8qKiBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAqICB0cmVlIChub3QganVzdCBUcmVlIGludGVyZmFjZSkuICBJdCBpbnZva2VzIHRoZSBhZGFwdG9yIHJvdXRpbmVzCisgKiAgbm90IHRoZSB0cmVlIG5vZGUgcm91dGluZXMgdG8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIAorICovCistIChpZDxBTlRMUkJhc2VUcmVlPilkdXBUcmVlOihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZSBQYXJlbnQ6KGlkPEFOVExSQmFzZVRyZWU+KXBhcmVudDsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWR1cE5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlOworLyoqIEFkZCBhIGNoaWxkIHRvIHRoZSB0cmVlIHQuICBJZiBjaGlsZCBpcyBhIGZsYXQgdHJlZSAoYSBsaXN0KSwgbWFrZSBhbGwKKyAqICBpbiBsaXN0IGNoaWxkcmVuIG9mIHQuICBXYXJuaW5nOiBpZiB0IGhhcyBubyBjaGlsZHJlbiwgYnV0IGNoaWxkIGRvZXMKKyAqICBhbmQgY2hpbGQgaXNOaWwgdGhlbiB5b3UgY2FuIGRlY2lkZSBpdCBpcyBvayB0byBtb3ZlIGNoaWxkcmVuIHRvIHQgdmlhCisgKiAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LiAgSnVzdAorICogIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhhdmUgdGhlIHVzZXIgd2lsbCBidWlsZAorICogIEFTVHMuCisgKi8KKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUkJhc2VUcmVlPilhQ2hpbGQgdG9UcmVlOihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZTsKKworLyoqIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAqCisgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAqCisgKiAgICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgKgorICogIFJldHVybiBuZXdSb290LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5ld1Jvb3QgaXMgbm90IGEKKyAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAqCisgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAqICBjb25zdHJ1Y3RpbmcgdGhlc2Ugbm9kZXMgc28gd2Ugc2hvdWxkIGhhdmUgdGhpcyBjb250cm9sIGZvcgorICogIGVmZmljaWVuY3kuCisgKi8KKy0gKGlkPEFOVExSQmFzZVRyZWU+KWJlY29tZVJvb3Q6KGlkPEFOVExSQmFzZVRyZWU+KWFOZXdSb290IG9sZDooaWQ8QU5UTFJCYXNlVHJlZT4pb2xkUm9vdDsKKworLyoqIFRyYW5zZm9ybSBeKG5pbCB4KSB0byB4IGFuZCBuaWwgdG8gbnVsbCAqLworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pcnVsZVBvc3RQcm9jZXNzaW5nOihpZDxBTlRMUkJhc2VUcmVlPilhUm9vdDsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pYmVjb21lUm9vdGZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pYU5ld1Jvb3Qgb2xkOihpZDxBTlRMUkJhc2VUcmVlPilvbGRSb290OworCistIChpZDxBTlRMUkJhc2VUcmVlPikgY3JlYXRlOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcilhVFR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhRnJvbVRva2VuOworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcilhVFR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhRnJvbVRva2VuIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBjcmVhdGVUcmVlOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZTsKKworLSAodm9pZCkgc2V0VHlwZTooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUgVHlwZTooTlNJbnRlZ2VyKXR5cGU7CisKKy0gKGlkPEFOVExSVG9rZW4+KWdldFRva2VuOihBTlRMUkNvbW1vblRyZWUgKil0OworCistIChOU1N0cmluZyAqKWdldFRleHQ6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworCistICh2b2lkKSBzZXRUZXh0OihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZSBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBnZXRDaGlsZDooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpOworCistICh2b2lkKSBzZXRDaGlsZDooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUgQXQ6KE5TSW50ZWdlcilpbmRleCBDaGlsZDooaWQ8QU5UTFJCYXNlVHJlZT4pYUNoaWxkOworCistIChpZDxBTlRMUkJhc2VUcmVlPikgZGVsZXRlQ2hpbGQ6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlIEluZGV4OihOU0ludGVnZXIpaW5kZXg7CisKKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRDb3VudDooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWU7CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBnZXRQYXJlbnQ6KGlkPEFOVExSQmFzZVRyZWU+KSB0OworCistICh2b2lkKSBzZXRQYXJlbnQ6KGlkPEFOVExSQmFzZVRyZWU+KXQgV2l0aDooaWQ8QU5UTFJCYXNlVHJlZT4pIHBhcmVudDsKKworLyoqIFdoYXQgaW5kZXggaXMgdGhpcyBub2RlIGluIHRoZSBjaGlsZCBsaXN0PyBSYW5nZTogMC4ubi0xCisgKiAgSWYgeW91ciBub2RlIHR5cGUgZG9lc24ndCBoYW5kbGUgdGhpcywgaXQncyBvayBidXQgdGhlIHRyZWUgcmV3cml0ZXMKKyAqICBpbiB0cmVlIHBhcnNlcnMgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgKi8KKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRJbmRleDooaWQpdDsKKy0gKHZvaWQpIHNldENoaWxkSW5kZXg6KGlkKXQgV2l0aDooTlNJbnRlZ2VyKWluZGV4OworCistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KGlkKXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpdDsKKworLSAoTlNJbnRlZ2VyKSBnZXRVbmlxdWVJRDooaWQ8QU5UTFJCYXNlVHJlZT4pbm9kZTsKKworI2lmZGVmIERPTlRVU0VOT01PCistIChOU0ludGVnZXIpIGdldFVuaXF1ZUlEOworCistICh2b2lkKSBzZXRVbmlxdWVOb2RlSUQ6KE5TSW50ZWdlcilhVW5pcXVlTm9kZUlEOworCistIChBTlRMUlVuaXF1ZUlETWFwICopZ2V0VHJlZVRvVW5pcXVlSURNYXA7CisKKy0gKHZvaWQpIHNldFRyZWVUb1VuaXF1ZUlETWFwOihBTlRMUlVuaXF1ZUlETWFwICopYU1hcE5vZGU7CisjZW5kaWYKKworLyoqIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgKgorICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgKiAgYW4gYWN0dWFsIHJlYWwgaW5wdXQgdG9rZW4uICBUeXBpY2FsbHkgdGhpcyBpcyBmb3IgY29udmVydGluZyAneycKKyAqICB0b2tlbnMgdG8gQkxPQ0sgZXRjLi4uICBZb3UnbGwgc2VlCisgKgorICogICAgciA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjXSBJRCspIDsKKyAqCisgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICovCistIChpZDxBTlRMUlRva2VuPiljcmVhdGVUb2tlbjooTlNJbnRlZ2VyKWFUVHlwZSBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihpZDxBTlRMUlRva2VuPilhRnJvbVRva2VuOworCitAcHJvcGVydHkgKHJldGFpbikgQU5UTFJVbmlxdWVJRE1hcCAqdHJlZVRvVW5pcXVlSURNYXA7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIHVuaXF1ZU5vZGVJRDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCYXNlVHJlZUFkYXB0b3IubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMTgxZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQmFzZVRyZWVBZGFwdG9yLm0KQEAgLTAsMCArMSw0MjkgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUlVuaXF1ZUlETWFwLmgiCisjaW1wb3J0ICJBTlRMUk1hcEVsZW1lbnQuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZS5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJCYXNlVHJlZUFkYXB0b3IKKworQHN5bnRoZXNpemUgdHJlZVRvVW5pcXVlSURNYXA7CitAc3ludGhlc2l6ZSB1bmlxdWVOb2RlSUQ7CisKKysgKGlkPEFOVExSVHJlZT4pIG5ld0VtcHR5VHJlZQoreworICAgIHJldHVybiBbW0FOVExSQ29tbW9uVHJlZSBhbGxvY10gaW5pdF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICBBTlRMUkJhc2VUcmVlQWRhcHRvciAqY29weTsKKyAgICAKKyAgICBjb3B5ID0gW1tbc2VsZiBjbGFzc10gYWxsb2NdIGluaXRdOworICAgIGlmICh0cmVlVG9VbmlxdWVJRE1hcCkKKyAgICAgICAgY29weS50cmVlVG9VbmlxdWVJRE1hcCA9IFt0cmVlVG9VbmlxdWVJRE1hcCBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIGNvcHkudW5pcXVlTm9kZUlEID0gdW5pcXVlTm9kZUlEOworICAgIHJldHVybiBjb3B5OworfQorICAgIAorCistIChpZCkgY3JlYXRlTmlsCit7CisgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjpuaWxdOworfQorCistIChpZCkgZW1wdHlOb2RlCit7CisgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjpuaWxdOworfQorCisvKiogY3JlYXRlIHRyZWUgbm9kZSB0aGF0IGhvbGRzIHRoZSBzdGFydCBhbmQgc3RvcCB0b2tlbnMgYXNzb2NpYXRlZAorICogIHdpdGggYW4gZXJyb3IuCisgKgorICogIElmIHlvdSBzcGVjaWZ5IHlvdXIgb3duIGtpbmQgb2YgdHJlZSBub2RlcywgeW91IHdpbGwgbGlrZWx5IGhhdmUgdG8KKyAqICBvdmVycmlkZSB0aGlzIG1ldGhvZC4gQ29tbW9uVHJlZSByZXR1cm5zIFRva2VuLklOVkFMSURfVE9LRU5fVFlQRQorICogIGlmIG5vIHRva2VuIHBheWxvYWQgYnV0IHlvdSBtaWdodCBoYXZlIHRvIHNldCB0b2tlbiB0eXBlIGZvciBkaWZmCisgKiAgbm9kZSB0eXBlLgorICoKKyAqICBZb3UgZG9uJ3QgaGF2ZSB0byBzdWJjbGFzcyBDb21tb25FcnJvck5vZGU7IHlvdSB3aWxsIGxpa2VseSBuZWVkIHRvCisgKiAgc3ViY2xhc3MgeW91ciBvd24gdHJlZSBub2RlIGNsYXNzIHRvIGF2b2lkIGNsYXNzIGNhc3QgZXhjZXB0aW9uLgorICovCistIChpZCkgZXJyb3JOb2RlOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICBGcm9tOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuCisgICAgICAgICAgICAgIFRvOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW4KKyAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKikgZTsKK3sKKyAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuaW5nIGVycm9yIG5vZGUgJyIrdCsiJyBAaW5kZXg9IithbklucHV0LmluZGV4KCkpOworICAgIHJldHVybiBbQU5UTFJDb21tb25FcnJvck5vZGUgbmV3QU5UTFJDb21tb25FcnJvck5vZGU6YW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb206c3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG86c3RvcFRva2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbjplXTsKK30KKworLSAoQk9PTCkgaXNOaWw6KGlkKSB0cmVlCit7CisgICAgcmV0dXJuIFsoaWQpdHJlZSBpc05pbF07Cit9CisKKy0gKGlkKWR1cFRyZWU6KGlkKXRyZWUKK3sKKyAgICByZXR1cm4gW3NlbGYgZHVwVHJlZTooaWQpdHJlZSBQYXJlbnQ6bmlsXTsKK30KKworLyoqIFRoaXMgaXMgZ2VuZXJpYyBpbiB0aGUgc2Vuc2UgdGhhdCBpdCB3aWxsIHdvcmsgd2l0aCBhbnkga2luZCBvZgorICogIHRyZWUgKG5vdCBqdXN0IFRyZWUgaW50ZXJmYWNlKS4gIEl0IGludm9rZXMgdGhlIGFkYXB0b3Igcm91dGluZXMKKyAqICBub3QgdGhlIHRyZWUgbm9kZSByb3V0aW5lcyB0byBkbyB0aGUgY29uc3RydWN0aW9uLiAgCisgKi8KKy0gKGlkKWR1cFRyZWU6KGlkKXQgUGFyZW50OihpZClwYXJlbnQKK3sKKyAgICBpZiAoIHQ9PW5pbCApIHsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisgICAgaWQgbmV3VHJlZSA9IFtzZWxmIGR1cE5vZGU6dF07CisgICAgLy8gZW5zdXJlIG5ldyBzdWJ0cmVlIHJvb3QgaGFzIHBhcmVudC9jaGlsZCBpbmRleCBzZXQKKyAgICBbc2VsZiBzZXRDaGlsZEluZGV4Om5ld1RyZWUgV2l0aDpbc2VsZiBnZXRDaGlsZEluZGV4OnRdXTsgLy8gc2FtZSBpbmRleCBpbiBuZXcgdHJlZQorICAgIFtzZWxmIHNldFBhcmVudDpuZXdUcmVlIFdpdGg6cGFyZW50XTsKKyAgICBOU0ludGVnZXIgbiA9IFtzZWxmIGdldENoaWxkQ291bnQ6dF07CisgICAgZm9yIChOU0ludGVnZXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWQgY2hpbGQgPSBbc2VsZiBnZXRDaGlsZDp0IEF0OmldOworICAgICAgICBpZCBuZXdTdWJUcmVlID0gW3NlbGYgZHVwVHJlZTpjaGlsZCBQYXJlbnQ6dF07CisgICAgICAgIFtzZWxmIGFkZENoaWxkOm5ld1N1YlRyZWUgdG9UcmVlOm5ld1RyZWVdOworICAgIH0KKyAgICByZXR1cm4gbmV3VHJlZTsKK30KKworLSAoaWQpZHVwTm9kZTooaWQpYU5vZGUKK3sKKyAgICByZXR1cm4gYU5vZGU7IC8vIG92ZXJyaWRlIGZvciBiZXR0ZXIgcmVzdWx0cyA6PikKK30KKy8qKiBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgKiAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgKiAgYW5kIGNoaWxkIGlzTmlsIHRoZW4geW91IGNhbiBkZWNpZGUgaXQgaXMgb2sgdG8gbW92ZSBjaGlsZHJlbiB0byB0IHZpYQorICogIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAqICBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBoYXZlIHRoZSB1c2VyIHdpbGwgYnVpbGQKKyAqICBBU1RzLgorICovCistICh2b2lkKSBhZGRDaGlsZDooaWQpY2hpbGQgdG9UcmVlOihpZCl0Cit7CisgICAgaWYgKCB0ICE9IG5pbCAmJiBjaGlsZCAhPSBuaWwgKSB7CisgICAgICAgIFsoaWQpdCBhZGRDaGlsZDpjaGlsZF07CisgICAgfQorfQorCisvKiogSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAqICBJZiBub3QgYSBuaWwgcm9vdCwgbWFrZSBvbGRSb290IGEgY2hpbGQgb2YgbmV3Um9vdC4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIGEgYiBjKQorICogICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBuZXdSb290IGlzIGEgbmlsLXJvb3RlZCBzaW5nbGUgY2hpbGQgdHJlZSwgdXNlIHRoZSBzaW5nbGUKKyAqICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKyAqCisgKiAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgXihhIGIgYykpCisgKgorICogIElmIG9sZFJvb3Qgd2FzIG51bGwsIGl0J3Mgb2ssIGp1c3QgcmV0dXJuIG5ld1Jvb3QgKGV2ZW4gaWYgaXNOaWwpLgorICoKKyAqICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICogICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKyAqCisgKiAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICogIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAqICBub2RlLiAgSWYgbmV3Um9vdCBpcyBeKG5pbCB4KSByZXR1cm4geCBhcyBuZXdSb290LgorICoKKyAqICBCZSBhZHZpc2VkIHRoYXQgaXQncyBvayBmb3IgbmV3Um9vdCB0byBwb2ludCBhdCBvbGRSb290J3MKKyAqICBjaGlsZHJlbjsgaS5lLiwgeW91IGRvbid0IGhhdmUgdG8gY29weSB0aGUgbGlzdC4gIFdlIGFyZQorICogIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgKiAgZWZmaWNpZW5jeS4KKyAqLworLSAoaWQpYmVjb21lUm9vdDooaWQpbmV3Um9vdCBvbGQ6KGlkKW9sZFJvb3QKK3sKKyAgICBpZiAoIG9sZFJvb3QgPT0gbmlsICkgeworICAgICAgICByZXR1cm4gbmV3Um9vdDsKKyAgICB9CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImJlY29tZXJvb3QgbmV3ICIrbmV3Um9vdC50b1N0cmluZygpKyIgb2xkICIrb2xkUm9vdCk7CisgICAgaWQgbmV3Um9vdFRyZWUgPSAoaWQpbmV3Um9vdDsKKyAgICBpZCBvbGRSb290VHJlZSA9IChpZClvbGRSb290OworICAgIC8vIGhhbmRsZSBeKG5pbCByZWFsLW5vZGUpCisgICAgaWYgKCBbbmV3Um9vdFRyZWUgaXNOaWxdICkgeworICAgICAgICBOU0ludGVnZXIgbmMgPSBbbmV3Um9vdFRyZWUgZ2V0Q2hpbGRDb3VudF07CisgICAgICAgIGlmICggbmMgPT0gMSApIG5ld1Jvb3RUcmVlID0gWyhpZCluZXdSb290VHJlZSBnZXRDaGlsZDowXTsKKyAgICAgICAgZWxzZSBpZiAoIG5jID4gMSApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdHJlZSBydW4gdGltZSBleGNlcHRpb25zIGhpZXJhcmNoeQorICAgICAgICAgICAgQHRocm93IFtBTlRMUlJ1bnRpbWVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOk5TU3RyaW5nRnJvbUNsYXNzKFtzZWxmIGNsYXNzXSkgcmVhc29uOkAibW9yZSB0aGFuIG9uZSBub2RlIGFzIHJvb3QgKFRPRE86IG1ha2UgZXhjZXB0aW9uIGhpZXJhcmNoeSkiXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBhZGQgb2xkUm9vdCB0byBuZXdSb290OyBhZGRDaGlsZCB0YWtlcyBjYXJlIG9mIGNhc2Ugd2hlcmUgb2xkUm9vdAorICAgIC8vIGlzIGEgZmxhdCBsaXN0IChpLmUuLCBuaWwtcm9vdGVkIHRyZWUpLiAgQWxsIGNoaWxkcmVuIG9mIG9sZFJvb3QKKyAgICAvLyBhcmUgYWRkZWQgdG8gbmV3Um9vdC4KKyAgICBbbmV3Um9vdFRyZWUgYWRkQ2hpbGQ6b2xkUm9vdFRyZWVdOworICAgIHJldHVybiBuZXdSb290VHJlZTsKK30KKworLyoqIFRyYW5zZm9ybSBeKG5pbCB4KSB0byB4IGFuZCBuaWwgdG8gbnVsbCAqLworLSAoaWQpcnVsZVBvc3RQcm9jZXNzaW5nOihpZClyb290Cit7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGVQb3N0UHJvY2Vzc2luZzogIisoKFRyZWUpcm9vdCkudG9TdHJpbmdUcmVlKCkpOworICAgIGlkIHIgPSAoaWQpcm9vdDsKKyAgICBpZiAoIHIgIT0gbmlsICYmIFtyIGlzTmlsXSApIHsKKyAgICAgICAgaWYgKCBbciBnZXRDaGlsZENvdW50XSA9PSAwICkgeworICAgICAgICAgICAgciA9IG5pbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggW3IgZ2V0Q2hpbGRDb3VudF0gPT0gMSApIHsKKyAgICAgICAgICAgIHIgPSAoaWQpW3IgZ2V0Q2hpbGQ6MF07CisgICAgICAgICAgICAvLyB3aG9ldmVyIGludm9rZXMgcnVsZSB3aWxsIHNldCBwYXJlbnQgYW5kIGNoaWxkIGluZGV4CisgICAgICAgICAgICBbciBzZXRQYXJlbnQ6bmlsXTsKKyAgICAgICAgICAgIFtyIHNldENoaWxkSW5kZXg6LTFdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworfQorCistIChpZCliZWNvbWVSb290ZnJvbVRva2VuOihpZDxBTlRMUlRva2VuPiluZXdSb290IG9sZDooaWQpb2xkUm9vdAoreworICAgIHJldHVybiBbc2VsZiBiZWNvbWVSb290OihpZClbc2VsZiBjcmVhdGU6bmV3Um9vdF0gb2xkOm9sZFJvb3RdOworfQorCistIChpZCkgY3JlYXRlOihpZDxBTlRMUlRva2VuPilhVG9rZW4KK3sKKyAgICByZXR1cm4gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuOmFUb2tlbl07Cit9CisKKy0gKGlkKWNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4KK3sKKyAgICBmcm9tVG9rZW4gPSBbc2VsZiBjcmVhdGVUb2tlbjpmcm9tVG9rZW5dOworICAgIC8vKChDbGFzc2ljVG9rZW4pZnJvbVRva2VuKS5zZXRUeXBlKHRva2VuVHlwZSk7CisgICAgW2Zyb21Ub2tlbiBzZXRUeXBlOnRva2VuVHlwZV07CisgICAgaWQgdCA9IFtzZWxmIGNyZWF0ZTpmcm9tVG9rZW5dOworICAgIHJldHVybiB0OworfQorCistIChpZCljcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIEZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuIFRleHQ6KE5TU3RyaW5nICopdGV4dAoreworICAgIGlmIChmcm9tVG9rZW4gPT0gbmlsKQorICAgICAgICByZXR1cm4gW3NlbGYgY3JlYXRlVHJlZTp0b2tlblR5cGUgVGV4dDp0ZXh0XTsKKyAgICBmcm9tVG9rZW4gPSBbc2VsZiBjcmVhdGVUb2tlbjpmcm9tVG9rZW5dOworICAgIFtmcm9tVG9rZW4gc2V0VHlwZTp0b2tlblR5cGVdOworICAgIFtmcm9tVG9rZW4gc2V0VGV4dDp0ZXh0XTsKKyAgICBpZCB0ID0gW3NlbGYgY3JlYXRlOmZyb21Ub2tlbl07CisgICAgcmV0dXJuIHQ7Cit9CisKKy0gKGlkKWNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0ZXh0Cit7CisgICAgaWQ8QU5UTFJUb2tlbj4gZnJvbVRva2VuID0gW3NlbGYgY3JlYXRlVG9rZW46dG9rZW5UeXBlIFRleHQ6dGV4dF07CisgICAgaWQgdCA9IChpZClbc2VsZiBjcmVhdGU6ZnJvbVRva2VuXTsKKyAgICByZXR1cm4gdDsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRUeXBlOihBTlRMUkNvbW1vblRyZWUgKikgdAoreworICAgIHJldHVybiBbdCB0eXBlXTsKK30KKworLSAodm9pZCkgc2V0VHlwZTooaWQpdCBUeXBlOihOU0ludGVnZXIpdHlwZQoreworICAgIEB0aHJvdyBbQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpAImRvbid0IGtub3cgZW5vdWdoIGFib3V0IFRyZWUgbm9kZSJdOworfQorCisvKiogV2hhdCBpcyB0aGUgVG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZT8gIElmCisgKiAgeW91IGFyZSBub3QgdXNpbmcgQU5UTFJDb21tb25UcmVlLCB0aGVuIHlvdSBtdXN0CisgKiAgb3ZlcnJpZGUgdGhpcyBpbiB5b3VyIG93biBhZGFwdG9yLgorICovCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KEFOVExSQ29tbW9uVHJlZSAqKSB0Cit7CisgICAgaWYgKCBbdCBpc0tpbmRPZkNsYXNzOltBTlRMUkNvbW1vblRyZWUgY2xhc3NdXSApIHsKKyAgICAgICAgcmV0dXJuIFt0IGdldFRva2VuXTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsgLy8gbm8gaWRlYSB3aGF0IHRvIGRvCit9CisKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDooQU5UTFJDb21tb25UcmVlICopdAoreworICAgIHJldHVybiBbdCB0ZXh0XTsKK30KKworLSAodm9pZCkgc2V0VGV4dDooaWQpdCBUZXh0OihOU1N0cmluZyAqKXRleHQKK3sKKyAgICBAdGhyb3cgW0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJkb24ndCBrbm93IGVub3VnaCBhYm91dCBUcmVlIG5vZGUiXTsKK30KKworLSAoaWQpIGdldENoaWxkOihpZCl0IEF0OihOU0ludGVnZXIpaW5kZXgKK3sKKyAgICByZXR1cm4gWyhpZCl0IGdldENoaWxkOmluZGV4IF07Cit9CisKKy0gKHZvaWQpIHNldENoaWxkOihpZCl0IEF0OihOU0ludGVnZXIpaW5kZXggQ2hpbGQ6KGlkKWNoaWxkCit7CisgICAgWyhpZCl0IHNldENoaWxkOmluZGV4IFdpdGg6KGlkKWNoaWxkXTsKK30KKworLSAoaWQpIGRlbGV0ZUNoaWxkOihpZCl0IEluZGV4OihOU0ludGVnZXIpaW5kZXgKK3sKKyAgICByZXR1cm4gWyhpZCl0IGRlbGV0ZUNoaWxkOmluZGV4XTsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZENvdW50OihpZCl0Cit7CisgICAgcmV0dXJuIFsoaWQpdCBnZXRDaGlsZENvdW50XTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldFBhcmVudDooaWQ8QU5UTFJCYXNlVHJlZT4pIHQKK3sKKyAgICBpZiAoIHQgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICByZXR1cm4gKGlkPEFOVExSQmFzZVRyZWU+KVt0IGdldFBhcmVudF07Cit9CisKKy0gKHZvaWQpIHNldFBhcmVudDooaWQ8QU5UTFJCYXNlVHJlZT4pdCBXaXRoOihpZDxBTlRMUkJhc2VUcmVlPikgcGFyZW50Cit7CisgICAgaWYgKCB0ICE9IG5pbCApCisgICAgICAgIFsoaWQ8QU5UTFJCYXNlVHJlZT4pIHQgc2V0UGFyZW50OihpZDxBTlRMUkJhc2VUcmVlPilwYXJlbnRdOworfQorCisvKiogV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OihpZCl0Cit7CisgICAgcmV0dXJuICgoQU5UTFJDb21tb25UcmVlICopdCkuY2hpbGRJbmRleDsKK30KKworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooaWQpdCBXaXRoOihOU0ludGVnZXIpaW5kZXgKK3sKKyAgICAoKEFOVExSQ29tbW9uVHJlZSAqKXQpLmNoaWxkSW5kZXggPSBpbmRleDsKK30KKworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKXQKK3sKKyAgICByZXR1cm47Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0VW5pcXVlSUQ6KGlkKW5vZGUKK3sKKyAgICBpZiAoIHRyZWVUb1VuaXF1ZUlETWFwID09IG5pbCApIHsKKyAgICAgICAgdHJlZVRvVW5pcXVlSURNYXAgPSBbQU5UTFJVbmlxdWVJRE1hcCBuZXdBTlRMUlVuaXF1ZUlETWFwXTsKKyAgICB9CisgICAgTlNOdW1iZXIgKnByZXZJRCA9IFt0cmVlVG9VbmlxdWVJRE1hcCBnZXROb2RlOm5vZGVdOworICAgIGlmICggcHJldklEICE9IG5pbCApIHsKKyAgICAgICAgcmV0dXJuIFtwcmV2SUQgaW50ZWdlclZhbHVlXTsKKyAgICB9CisgICAgTlNJbnRlZ2VyIGFuSUQgPSB1bmlxdWVOb2RlSUQ7CisgICAgLy8gQU5UTFJNYXBFbGVtZW50ICphTWFwTm9kZSA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE9iajE6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFuSURdIE9iajI6bm9kZV07CisgICAgW3RyZWVUb1VuaXF1ZUlETWFwIHB1dElEOltOU051bWJlciBudW1iZXJXaXRoSW50ZWdlcjphbklEXSBOb2RlOm5vZGVdOworICAgIHVuaXF1ZU5vZGVJRCsrOworICAgIHJldHVybiBhbklEOworICAgIC8vIEdDQyBtYWtlcyB0aGVzZSBub251bmlxdWU6CisgICAgLy8gcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG5vZGUpOworfQorCisvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAqCisgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICovCistIChpZDxBTlRMUlRva2VuPikgY3JlYXRlVG9rZW46KE5TSW50ZWdlcilhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0ZXh0Cit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLyoqIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgKgorICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgKiAgYW4gYWN0dWFsIHJlYWwgaW5wdXQgdG9rZW4uICBUeXBpY2FsbHkgdGhpcyBpcyBmb3IgY29udmVydGluZyAneycKKyAqICB0b2tlbnMgdG8gQkxPQ0sgZXRjLi4uICBZb3UnbGwgc2VlCisgKgorICogICAgciA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjXSBJRCspIDsKKyAqCisgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICovCistIChpZDxBTlRMUlRva2VuPikgY3JlYXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KSBmcm9tVG9rZW4KK3sKKyAgICByZXR1cm4gbmlsOworfQorCisvKiogVHJhY2sgc3RhcnQvc3RvcCB0b2tlbiBmb3Igc3VidHJlZSByb290IGNyZWF0ZWQgZm9yIGEgcnVsZS4KKyAqICBPbmx5IHdvcmtzIHdpdGggVHJlZSBub2Rlcy4gIEZvciBydWxlcyB0aGF0IG1hdGNoIG5vdGhpbmcsCisgKiAgc2VlbXMgbGlrZSB0aGlzIHdpbGwgeWllbGQgc3RhcnQ9aSBhbmQgc3RvcD1pLTEgaW4gYSBuaWwgbm9kZS4KKyAqICBNaWdodCBiZSB1c2VmdWwgaW5mbyBzbyBJJ2xsIG5vdCBmb3JjZSB0byBiZSBpLi5pLgorICovCistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXM6KGlkKWFUcmVlIEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4gVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgoreworICAgIHJldHVybjsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg6KGlkKWFUcmVlCit7CisgICAgcmV0dXJuIC0xOworfQorCistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OihpZClhVHJlZQoreworICAgIHJldHVybiAtMTsKK30KKworI2lmZGVmIERPTlRVU0VOT01PCistIChOU0ludGVnZXIpZ2V0VW5pcXVlSUQKK3sKKyAgICByZXR1cm4gdW5pcXVlTm9kZUlEOworfQorCistICh2b2lkKSBzZXRVbmlxdWVOb2RlSUQ6KE5TSW50ZWdlcilhVW5pcXVlTm9kZUlECit7CisgICAgdW5pcXVlTm9kZUlEID0gYVVuaXF1ZU5vZGVJRDsKK30KKworLSAoQU5UTFJVbmlxdWVJRE1hcCAqKWdldFRyZWVUb1VuaXF1ZUlETWFwCit7CisgICAgcmV0dXJuIHRyZWVUb1VuaXF1ZUlETWFwOworfQorCistICh2b2lkKSBzZXRUcmVlVG9VbmlxdWVJRE1hcDooQU5UTFJVbmlxdWVJRE1hcCAqKWFNYXBMaXN0Tm9kZQoreworICAgIHRyZWVUb1VuaXF1ZUlETWFwID0gYU1hcExpc3ROb2RlOworfQorCisjZW5kaWYKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCaXRTZXQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQml0U2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkNzViMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQml0U2V0LmgKQEAgLTAsMCArMSw5NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisKKyNkZWZpbmUgQklUUyAoc2l6ZW9mKE5TVUludGVnZXIpICogOCkKKyNkZWZpbmUgTE9HX0JJVFMgKChzaXplb2YoTlNVSW50ZWdlcik9PTgpPzY6NSkKKworLy8gQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgQ29yZUZvdW5kYXRpb24gYml0IHZlY3RvcnMgdG8gc2hpZWxkIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorLy8gZnJvbSB0aGUgc3BlY2lmaWNzIG9mIHRoZSBCaXRWZWN0b3IgaW5pdGlhbGl6YXRpb24gYW5kIHF1ZXJ5IGZ1bmN0aW9ucy4KKy8vIFRoaXMgaXMgZmFzdCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byByZWludmVudCB0aGUgd2hlZWwganVzdCB5ZXQuCisKK0BpbnRlcmZhY2UgQU5UTFJCaXRTZXQgOiBOU09iamVjdCA8IE5TTXV0YWJsZUNvcHlpbmcgPiB7CisJX19zdHJvbmcgQ0ZNdXRhYmxlQml0VmVjdG9yUmVmIGJpdFZlY3RvcjsKK30KKworI3ByYWdtYSBtYXJrIENsYXNzIE1ldGhvZHMKKworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXQ7CisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSl0eXBlOworLyoqIENvbnN0cnVjdCBhIEFOVExSQml0U2V0IGdpdmVuIHRoZSBzaXplCisgKiBAcGFyYW0gbmJpdHMgVGhlIHNpemUgb2YgdGhlIEFOVExSQml0U2V0IGluIGJpdHMKKyAqLworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoTkJpdHM6KE5TVUludGVnZXIpbmJpdHM7CisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhBcnJheTooQU11dGFibGVBcnJheSAqKXR5cGVzOworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopdGhlQml0cyBDb3VudDooTlNVSW50ZWdlcilsb25nQ291bnQ7CisKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWVsOworKyAoQU5UTFJCaXRTZXQgKikgb2Y6KE5TVUludGVnZXIpYSBBbmQyOihOU1VJbnRlZ2VyKWI7CisrIChBTlRMUkJpdFNldCAqKSBvZjooTlNVSW50ZWdlcilhIEFuZDI6KE5TVUludGVnZXIpYiBBbmQzOihOU1VJbnRlZ2VyKWM7CisrIChBTlRMUkJpdFNldCAqKSBvZjooTlNVSW50ZWdlcilhIEFuZDI6KE5TVUludGVnZXIpYiBBbmQzOihOU1VJbnRlZ2VyKWMgQW5kNDooTlNVSW50ZWdlcilkOworCisjcHJhZ21hIG1hcmsgSW5pdGlhbGl6ZXIKKworLSAoQU5UTFJCaXRTZXQgKikgaW5pdDsKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoVHlwZTooQU5UTFJUb2tlblR5cGUpdHlwZTsKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoTkJpdHM6KE5TVUludGVnZXIpbmJpdHM7CistIChBTlRMUkJpdFNldCAqKSBpbml0V2l0aEJpdFZlY3RvcjooQ0ZNdXRhYmxlQml0VmVjdG9yUmVmKXRoZUJpdFZlY3RvcjsKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGNvbnN0Kil0aGVCaXRzIENvdW50OihOU1VJbnRlZ2VyKXRoZUNvdW50OworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhBcnJheU9mQml0czooTlNBcnJheSAqKXRoZUFycmF5OworCisjcHJhZ21hIG1hcmsgT3BlcmF0aW9ucworLSAoQU5UTFJCaXRTZXQgKikgb3I6KEFOVExSQml0U2V0ICopIGFCaXRTZXQ7CistICh2b2lkKSBvckluUGxhY2U6KEFOVExSQml0U2V0ICopIGFCaXRTZXQ7CistICh2b2lkKSBhZGQ6KE5TVUludGVnZXIpIGJpdDsKKy0gKHZvaWQpIHJlbW92ZTooTlNVSW50ZWdlcikgYml0OworLSAodm9pZCkgc2V0QWxsQml0czooQk9PTCkgYVN0YXRlOworCistIChOU0ludGVnZXIpIG51bUJpdHM7CistIChOU1VJbnRlZ2VyKSBzaXplOworLSAodm9pZCkgc2V0U2l6ZTooTlNVSW50ZWdlcikgbm9PZldvcmRzOworCisjcHJhZ21hIG1hcmsgSW5mb3JtYXRpb25hbAorLSAodW5zaWduZWQgbG9uZyBsb25nKSBiaXRNYXNrOihOU1VJbnRlZ2VyKSBiaXROdW1iZXI7CistIChCT09MKSBtZW1iZXI6KE5TVUludGVnZXIpYml0TnVtYmVyOworLSAoQk9PTCkgaXNOaWw7CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworCisjcHJhZ21hIG1hcmsgTlNDb3B5aW5nIHN1cHBvcnQKKworLSAoaWQpIG11dGFibGVDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKSB0aGVab25lOworCisKKy8vcHJpdmF0ZQorLSAoQ0ZNdXRhYmxlQml0VmVjdG9yUmVmKSBfYml0VmVjdG9yOworQHByb3BlcnR5IChnZXR0ZXI9X2JpdFZlY3RvcikgQ0ZNdXRhYmxlQml0VmVjdG9yUmVmIGJpdFZlY3RvcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQml0U2V0Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJpdFNldC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzdlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJpdFNldC5tCkBAIC0wLDAgKzEsMzIyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSQml0U2V0CisjcHJhZ21hIG1hcmsgQ2xhc3MgTWV0aG9kcworCisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldAoreworICAgIHJldHVybiBbW0FOVExSQml0U2V0IGFsbG9jXSBpbml0XTsKK30KKworKyAoQU5UTFJCaXRTZXQgKikgbmV3QU5UTFJCaXRTZXRXaXRoVHlwZTooQU5UTFJUb2tlblR5cGUpdHlwZQoreworICAgIHJldHVybiBbW0FOVExSQml0U2V0IGFsbG9jXSBpbml0V2l0aFR5cGU6dHlwZV07Cit9CisKKy8qKiBDb25zdHJ1Y3QgYSBBTlRMUkJpdFNldCBnaXZlbiB0aGUgc2l6ZQorICogQHBhcmFtIG5iaXRzIFRoZSBzaXplIG9mIHRoZSBBTlRMUkJpdFNldCBpbiBiaXRzCisgKi8KKysgKEFOVExSQml0U2V0ICopIG5ld0FOVExSQml0U2V0V2l0aE5CaXRzOihOU1VJbnRlZ2VyKW5iaXRzCit7CisgICAgcmV0dXJuIFtbQU5UTFJCaXRTZXQgYWxsb2NdIGluaXRXaXRoTkJpdHM6bmJpdHNdOworfQorCisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhBcnJheTooQU11dGFibGVBcnJheSAqKXR5cGVzCit7CisgICAgcmV0dXJuIFtbQU5UTFJCaXRTZXQgYWxsb2NdIGluaXRXaXRoQXJyYXlPZkJpdHM6dHlwZXNdOworfQorCisrIChBTlRMUkJpdFNldCAqKSBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKil0aGVCaXRzIENvdW50OihOU1VJbnRlZ2VyKWxvbmdDb3VudAoreworICAgIHJldHVybiBbW0FOVExSQml0U2V0IGFsbG9jXSBpbml0V2l0aEJpdHM6dGhlQml0cyBDb3VudDpsb25nQ291bnRdOworfQorCisKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKSBlbAoreworICAgIEFOVExSQml0U2V0ICpzID0gW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aE5CaXRzOihlbCArIDEpXTsKKyAgICBbcyBhZGQ6ZWxdOworICAgIHJldHVybiBzOworfQorCisrIChBTlRMUkJpdFNldCAqKSBvZjooTlNVSW50ZWdlcikgYSBBbmQyOihOU1VJbnRlZ2VyKSBiCit7CisgICAgTlNJbnRlZ2VyIGMgPSAoKChhPmIpP2E6YikrMSk7CisgICAgQU5UTFJCaXRTZXQgKnMgPSBbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoTkJpdHM6Y107CisgICAgW3MgYWRkOmFdOworICAgIFtzIGFkZDpiXTsKKyAgICByZXR1cm4gczsKK30KKworKyAoQU5UTFJCaXRTZXQgKikgb2Y6KE5TVUludGVnZXIpYSBBbmQyOihOU1VJbnRlZ2VyKWIgQW5kMzooTlNVSW50ZWdlciljCit7CisgICAgTlNVSW50ZWdlciBkID0gKChhPmIpP2E6Yik7CisgICAgZCA9ICgoYz5kKT9jOmQpKzE7CisgICAgQU5UTFJCaXRTZXQgKnMgPSBbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoTkJpdHM6ZF07CisgICAgW3MgYWRkOmFdOworICAgIFtzIGFkZDpiXTsKKyAgICBbcyBhZGQ6Y107CisgICAgcmV0dXJuIHM7Cit9CisKKysgKEFOVExSQml0U2V0ICopIG9mOihOU1VJbnRlZ2VyKWEgQW5kMjooTlNVSW50ZWdlciliIEFuZDM6KE5TVUludGVnZXIpYyBBbmQ0OihOU1VJbnRlZ2VyKWQKK3sKKyAgICBOU1VJbnRlZ2VyIGUgPSAoKGE+Yik/YTpiKTsKKyAgICBOU1VJbnRlZ2VyIGYgPSAoKGM+ZCk/YzpkKTsKKyAgICBlID0gKChlPmYpP2U6ZikrMTsKKyAgICBBTlRMUkJpdFNldCAqcyA9IFtBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhOQml0czplXTsKKyAgICBbcyBhZGQ6YV07CisgICAgW3MgYWRkOmJdOworICAgIFtzIGFkZDpjXTsKKyAgICBbcyBhZGQ6ZF07CisgICAgcmV0dXJuIHM7Cit9CisKKy8vIGluaXRpYWxpemVyCisjcHJhZ21hIG1hcmsgSW5pdGlhbGl6ZXIKKworLSAoQU5UTFJCaXRTZXQgKikgaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisJCWJpdFZlY3RvciA9IENGQml0VmVjdG9yQ3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LDApOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSl0eXBlCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJYml0VmVjdG9yID0gQ0ZCaXRWZWN0b3JDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsMCk7CisgICAgICAgIGlmICgoQ0ZJbmRleCl0eXBlID49IENGQml0VmVjdG9yR2V0Q291bnQoYml0VmVjdG9yKSkKKyAgICAgICAgICAgIENGQml0VmVjdG9yU2V0Q291bnQoYml0VmVjdG9yLCB0eXBlKzEpOworICAgICAgICBDRkJpdFZlY3RvclNldEJpdEF0SW5kZXgoYml0VmVjdG9yLCB0eXBlLCAxKTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKEFOVExSQml0U2V0ICopIGluaXRXaXRoTkJpdHM6KE5TVUludGVnZXIpbmJpdHMKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBiaXRWZWN0b3IgPSBDRkJpdFZlY3RvckNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwwKTsKKyAgICAgICAgQ0ZCaXRWZWN0b3JTZXRDb3VudCggYml0VmVjdG9yLCBuYml0cyApOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhCaXRWZWN0b3I6KENGTXV0YWJsZUJpdFZlY3RvclJlZil0aGVCaXRWZWN0b3IKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQliaXRWZWN0b3IgPSB0aGVCaXRWZWN0b3I7CisJfQorCXJldHVybiBzZWxmOworfQorCisvLyBJbml0aWFsaXplIHRoZSBiaXQgdmVjdG9yIHdpdGggYSBjb25zdGFudCBhcnJheSBvZiB1bG9uZ2xvbmdzIGxpa2UgQU5UTFIgZ2VuZXJhdGVzLgorLy8gQ29udmVydHMgdG8gYmlnIGVuZGlhbiwgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBDRkJpdFZlY3RvciB3b3JrcyBsaWtlIHRoYXQuCistIChBTlRMUkJpdFNldCAqKSBpbml0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKXRoZUJpdHMgQ291bnQ6KE5TVUludGVnZXIpbG9uZ0NvdW50Cit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJdW5zaWduZWQgaW50IGxvbmdObzsKKwkJQ0ZJbmRleCBiaXRJZHg7CisgICAgICAgIGJpdFZlY3RvciA9IENGQml0VmVjdG9yQ3JlYXRlTXV0YWJsZSAoIGtDRkFsbG9jYXRvckRlZmF1bHQsIDAgKTsKKwkJQ0ZCaXRWZWN0b3JTZXRDb3VudCggYml0VmVjdG9yLCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSo4KmxvbmdDb3VudCApOworCisJCWZvciAobG9uZ05vID0gMDsgbG9uZ05vIDwgbG9uZ0NvdW50OyBsb25nTm8rKykgeworCQkJZm9yIChiaXRJZHggPSAwOyBiaXRJZHggPCAoQ0ZJbmRleClzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSo4OyBiaXRJZHgrKykgeworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzd2FwcGVkQml0cyA9IENGU3dhcEludDY0SG9zdFRvQmlnKHRoZUJpdHNbbG9uZ05vXSk7CisJCQkJaWYgKHN3YXBwZWRCaXRzICYgKDFMTCA8PCBiaXRJZHgpKSB7CisJCQkJCUNGQml0VmVjdG9yU2V0Qml0QXRJbmRleChiaXRWZWN0b3IsIGJpdElkeCsobG9uZ05vKihzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSo4KSksIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLy8gSW5pdGlhbGl6ZSBiaXQgdmVjdG9yIHdpdGggYW4gYXJyYXkgb2YgYW55dGhpbmcuIEp1c3QgdGVzdCB0aGUgYm9vbFZhbHVlIGFuZCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgYml0LgorLy8gTm90ZTogVGhpcyBpcyBiaWctZW5kaWFuIQorLSAoQU5UTFJCaXRTZXQgKikgaW5pdFdpdGhBcnJheU9mQml0czooTlNBcnJheSAqKXRoZUFycmF5Cit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgYml0VmVjdG9yID0gQ0ZCaXRWZWN0b3JDcmVhdGVNdXRhYmxlICgga0NGQWxsb2NhdG9yRGVmYXVsdCwgMCApOworCQlpZCB2YWx1ZTsKKwkJaW50IGJpdCA9IDA7CisJCWZvciAodmFsdWUgaW4gdGhlQXJyYXkpIHsKKwkJCWlmIChbdmFsdWUgYm9vbFZhbHVlXSA9PSBZRVMpIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBhZGQ6Yml0XTsKKwkJCQkvL0NGQml0VmVjdG9yU2V0Qml0QXRJbmRleChiaXRWZWN0b3IsIGJpdCwgMSk7CisJCQl9CisJCQliaXQrKzsKKwkJfQorCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSQml0U2V0IiApOworI2VuZGlmCisJQ0ZSZWxlYXNlKGJpdFZlY3Rvcik7CisJW3N1cGVyIGRlYWxsb2NdOworfQorCisJLy8gb3BlcmF0aW9ucworI3ByYWdtYSBtYXJrIE9wZXJhdGlvbnMKKy8vIHJldHVybiBhIGNvcHkgb2YgKHNlbGZ8YUJpdFNldCkKKy0gKEFOVExSQml0U2V0ICopIG9yOihBTlRMUkJpdFNldCAqKSBhQml0U2V0Cit7CisJQU5UTFJCaXRTZXQgKmJpdHNldENvcHkgPSBbc2VsZiBtdXRhYmxlQ29weVdpdGhab25lOm5pbF07CisJW2JpdHNldENvcHkgb3JJblBsYWNlOmFCaXRTZXRdOworCXJldHVybiBiaXRzZXRDb3B5OworfQorCisvLyBwZXJmb3JtIGEgYml0d2lzZSBPUiBvcGVyYXRpb24gaW4gcGxhY2UgYnkgY2hhbmdpbmcgdW5kZXJseWluZyBiaXQgdmVjdG9yLCBncm93aW5nIGl0IGlmIG5lY2Vzc2FyeQorLSAodm9pZCkgb3JJblBsYWNlOihBTlRMUkJpdFNldCAqKSBhQml0U2V0Cit7CisJQ0ZJbmRleCBzZWxmQ250ID0gQ0ZCaXRWZWN0b3JHZXRDb3VudChiaXRWZWN0b3IpOworCUNGTXV0YWJsZUJpdFZlY3RvclJlZiBvdGhlckJpdFZlY3RvciA9IFthQml0U2V0IF9iaXRWZWN0b3JdOworCUNGSW5kZXggb3RoZXJDbnQgPSBDRkJpdFZlY3RvckdldENvdW50KG90aGVyQml0VmVjdG9yKTsKKwlDRkluZGV4IG1heEJpdENudCA9IHNlbGZDbnQgPiBvdGhlckNudCA/IHNlbGZDbnQgOiBvdGhlckNudDsKKwlDRkJpdFZlY3RvclNldENvdW50KGJpdFZlY3RvcixtYXhCaXRDbnQpOwkJLy8gYmUgc3VyZSB0byBncm93IHRoZSBDRkJpdFZlY3RvciBtYW51YWxseSEKKwkKKwlDRkluZGV4IGN1cnJJZHg7CisJZm9yIChjdXJySWR4ID0gMDsgY3VycklkeCA8IG1heEJpdENudDsgY3VycklkeCsrKSB7CisJCWlmIChDRkJpdFZlY3RvckdldEJpdEF0SW5kZXgoYml0VmVjdG9yLCBjdXJySWR4KSB8IENGQml0VmVjdG9yR2V0Qml0QXRJbmRleChvdGhlckJpdFZlY3RvciwgY3VycklkeCkpIHsKKwkJCUNGQml0VmVjdG9yU2V0Qml0QXRJbmRleChiaXRWZWN0b3IsIGN1cnJJZHgsIDEpOworCQl9CisJfQorfQorCisvLyBzZXQgYSBiaXQsIGdyb3cgdGhlIGJpdCB2ZWN0b3IgaWYgbmVjZXNzYXJ5CistICh2b2lkKSBhZGQ6KE5TVUludGVnZXIpIGJpdAoreworCWlmICgoQ0ZJbmRleCliaXQgPj0gQ0ZCaXRWZWN0b3JHZXRDb3VudChiaXRWZWN0b3IpKQorCQlDRkJpdFZlY3RvclNldENvdW50KGJpdFZlY3RvciwgYml0KzEpOworCUNGQml0VmVjdG9yU2V0Qml0QXRJbmRleChiaXRWZWN0b3IsIGJpdCwgMSk7Cit9CisKKy8vIHVuc2V0IGEgYml0CistICh2b2lkKSByZW1vdmU6KE5TVUludGVnZXIpIGJpdAoreworCUNGQml0VmVjdG9yU2V0Qml0QXRJbmRleChiaXRWZWN0b3IsIGJpdCwgMCk7Cit9CisKKy0gKHZvaWQpIHNldEFsbEJpdHM6KEJPT0wpIGFTdGF0ZQoreworICAgIGZvciggTlNJbnRlZ2VyIGJpdD0wOyBiaXQgPCBDRkJpdFZlY3RvckdldENvdW50KGJpdFZlY3Rvcik7IGJpdCsrICkgeworICAgICAgICBDRkJpdFZlY3RvclNldEJpdEF0SW5kZXgoYml0VmVjdG9yLCBiaXQsIGFTdGF0ZSk7CisgICAgfQorfQorCisvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYml0IHZlY3Rvci4KKy0gKE5TSW50ZWdlcikgbnVtQml0cworeworICAgIC8vIHJldHVybiBDRkJpdFZlY3RvckdldENvdW50KGJpdFZlY3Rvcik7CisgICAgcmV0dXJuIENGQml0VmVjdG9yR2V0Q291bnRPZkJpdChiaXRWZWN0b3IsIENGUmFuZ2VNYWtlKDAsIENGQml0VmVjdG9yR2V0Q291bnQoYml0VmVjdG9yKSksIDEpOworfQorCisvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYml0IHZlY3Rvci4KKy0gKE5TVUludGVnZXIpIHNpemUKK3sKKyAgICByZXR1cm4gQ0ZCaXRWZWN0b3JHZXRDb3VudChiaXRWZWN0b3IpOworfQorCistICh2b2lkKSBzZXRTaXplOihOU1VJbnRlZ2VyKSBuQml0cworeworICAgIENGQml0VmVjdG9yU2V0Q291bnQoIGJpdFZlY3RvciwgbkJpdHMgKTsKK30KKworI3ByYWdtYSBtYXJrIEluZm9ybWF0aW9uYWwKKy8vIHJldHVybiBhIGJpdG1hc2sgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiaXR2ZWN0b3IgZm9yIGVhc3kgb3BlcmF0aW9ucworLSAodW5zaWduZWQgbG9uZyBsb25nKSBiaXRNYXNrOihOU1VJbnRlZ2VyKSBiaXROdW1iZXIKK3sKKwlyZXR1cm4gMUxMIDw8IGJpdE51bWJlcjsKK30KKworLy8gdGVzdCBhIGJpdCAobm8gcHVuIGludGVuZGVkKQorLSAoQk9PTCkgbWVtYmVyOihOU1VJbnRlZ2VyKSBiaXROdW1iZXIKK3sKKwlyZXR1cm4gQ0ZCaXRWZWN0b3JHZXRCaXRBdEluZGV4KGJpdFZlY3RvcixiaXROdW1iZXIpID8gWUVTIDogTk87Cit9CisKKy8vIGFyZSBhbGwgYml0cyBvZmY/CistIChCT09MKSBpc05pbAoreworCXJldHVybiAoKENGQml0VmVjdG9yR2V0Q291bnRPZkJpdChiaXRWZWN0b3IsIENGUmFuZ2VNYWtlKDAsQ0ZCaXRWZWN0b3JHZXRDb3VudChiaXRWZWN0b3IpKSwgMSkgPT0gMCkgPyBZRVMgOiBOTyk7Cit9CisKKy8vIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYml0IHZlY3RvciwgaW5kaWNhdGluZyBieSB0aGVpciBiaXRudW1iZXIgd2hpY2ggYml0cyBhcmUgc2V0CistIChOU1N0cmluZyAqKSB0b1N0cmluZworeworCUNGSW5kZXggbGVuZ3RoID0gQ0ZCaXRWZWN0b3JHZXRDb3VudChiaXRWZWN0b3IpOworCUNGSW5kZXggY3VyckJpdDsKKwlOU011dGFibGVTdHJpbmcgKmRlc2NTdHJpbmcgPSBbTlNNdXRhYmxlU3RyaW5nICBzdHJpbmdXaXRoU3RyaW5nOkAieyJdOworCUJPT0wgaGF2ZUluc2VydGVkQml0ID0gTk87CisJZm9yIChjdXJyQml0ID0gMDsgY3VyckJpdCA8IGxlbmd0aDsgY3VyckJpdCsrKSB7CisJCWlmICggQ0ZCaXRWZWN0b3JHZXRCaXRBdEluZGV4KGJpdFZlY3RvciwgY3VyckJpdCkgKSB7CisJCQlpZiAoaGF2ZUluc2VydGVkQml0KSB7CisJCQkJW2Rlc2NTdHJpbmcgYXBwZW5kU3RyaW5nOkAiLCJdOworCQkJfQorCQkJW2Rlc2NTdHJpbmcgYXBwZW5kRm9ybWF0OkAiJWQiLCBjdXJyQml0XTsKKwkJCWhhdmVJbnNlcnRlZEJpdCA9IFlFUzsKKwkJfQorCX0KKwlbZGVzY1N0cmluZyBhcHBlbmRTdHJpbmc6QCJ9Il07CisJcmV0dXJuIGRlc2NTdHJpbmc7Cit9CisKKy8vIGRlYnVnZ2luZyBhaWQuIEdEQiBpbnZva2VzIHRoaXMgYXV0b21hZ2ljYWxseQorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKwlyZXR1cm4gW3NlbGYgdG9TdHJpbmddOworfQorCisJLy8gTlNDb3B5aW5nCisjcHJhZ21hIG1hcmsgTlNDb3B5aW5nIHN1cHBvcnQKKworLSAoaWQpIG11dGFibGVDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKSB0aGVab25lCit7CisJQU5UTFJCaXRTZXQgKm5ld0JpdFNldCA9IFtbQU5UTFJCaXRTZXQgYWxsb2NXaXRoWm9uZTp0aGVab25lXSBpbml0V2l0aEJpdFZlY3RvcjpDRkJpdFZlY3RvckNyZWF0ZU11dGFibGVDb3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsMCxiaXRWZWN0b3IpXTsKKwlyZXR1cm4gbmV3Qml0U2V0OworfQorCistIChDRk11dGFibGVCaXRWZWN0b3JSZWYpIF9iaXRWZWN0b3IKK3sKKwlyZXR1cm4gYml0VmVjdG9yOworfQorCitAc3ludGhlc2l6ZSBiaXRWZWN0b3I7CitAZW5kCisKK05TSW50ZWdlciBtYXgoTlNJbnRlZ2VyIGEsIE5TSW50ZWdlciBiKQoreworICAgIHJldHVybiAoYT5iKT9hOmI7Cit9CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQml0c2V0VGVzdC1JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCaXRzZXRUZXN0LUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NWE0NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQml0c2V0VGVzdC1JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ueW91cmNvbXBhbnkuJHtQUk9EVUNUX05BTUU6cmZjMTAzNGlkZW50aWZpZXJ9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5CTkRMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZzwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQxNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKyNpbXBvcnQgIkFNdXRhYmxlQXJyYXkuaCIKKworQGludGVyZmFjZSBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0gOiBOU09iamVjdCA8QU5UTFJUb2tlblN0cmVhbT4gCit7CitfX3N0cm9uZyBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKKyAgICAKKyAgICAvKiogUmVjb3JkIGV2ZXJ5IHNpbmdsZSB0b2tlbiBwdWxsZWQgZnJvbSB0aGUgc291cmNlIHNvIHdlIGNhbiByZXByb2R1Y2UKKyAgICAgKiAgY2h1bmtzIG9mIGl0IGxhdGVyLiAgVGhlIGJ1ZmZlciBpbiBMb29rYWhlYWRTdHJlYW0gb3ZlcmxhcHMgc29tZXRpbWVzCisgICAgICogIGFzIGl0cyBtb3Zpbmcgd2luZG93IG1vdmVzIHRocm91Z2ggdGhlIGlucHV0LiAgVGhpcyBsaXN0IGNhcHR1cmVzCisgICAgICogIGV2ZXJ5dGhpbmcgc28gd2UgY2FuIGFjY2VzcyBjb21wbGV0ZSBpbnB1dCB0ZXh0LgorICAgICAqLworX19zdHJvbmcgQU11dGFibGVBcnJheSAqdG9rZW5zOworICAgIAorICAgIC8qKiBUcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS4gKi8KK05TSW50ZWdlciBsYXN0TWFya2VyOworICAgIAorICAgIC8qKiBUaGUgaW5kZXggaW50byB0aGUgdG9rZW5zIGxpc3Qgb2YgdGhlIGN1cnJlbnQgdG9rZW4gKG5leHQgdG9rZW4KKyAgICAgKiAgdG8gY29uc3VtZSkuICB0b2tlbnNbaW5kZXhdIHNob3VsZCBiZSBMVCgxKS4gIGluZGV4PS0xIGluZGljYXRlcyBuZWVkCisgICAgICogIHRvIGluaXRpYWxpemUgd2l0aCBmaXJzdCB0b2tlbi4gIFRoZSBjdG9yIGRvZXNuJ3QgZ2V0IGEgdG9rZW4uCisgICAgICogIEZpcnN0IGNhbGwgdG8gTFQoMSkgb3Igd2hhdGV2ZXIgZ2V0cyB0aGUgZmlyc3QgdG9rZW4gYW5kIHNldHMgaW5kZXg9MDsKKyAgICAgKi8KK05TSW50ZWdlciBpbmRleDsKKyAgICAKK05TSW50ZWdlciByYW5nZTsgLy8gaG93IGRlZXAgaGF2ZSB3ZSBnb25lPworICAgIAorfQorQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUb2tlblNvdXJjZSxzZXR0ZXI9c2V0VG9rZW5Tb3VyY2U6KSBpZDxBTlRMUlRva2VuU291cmNlPiB0b2tlblNvdXJjZTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5zLHNldHRlcj1zZXRUb2tlbnM6KSBBTXV0YWJsZUFycmF5ICp0b2tlbnM7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldExhc3RNYXJrZXIsc2V0dGVyPXNldExhc3RNYXJrZXI6KSBOU0ludGVnZXIgbGFzdE1hcmtlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFJhbmdlLHNldHRlcj1zZXRSYW5nZTopIE5TSW50ZWdlciByYW5nZTsKKworKyAoQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbTsKKysgKEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW1XaXRoOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlOworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFTb3VyY2U7CistICh2b2lkKWRlYWxsb2M7CistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy0gKE5TVUludGVnZXIpY2hhclBvc2l0aW9uSW5MaW5lOworLSAoTlNVSW50ZWdlcilsaW5lOworLSAoTlNJbnRlZ2VyKSBnZXRSYW5nZTsKKy0gKHZvaWQpIHNldFJhbmdlOihOU0ludGVnZXIpYW5JbnQ7CistIChOU0ludGVnZXIpIG1hcms7CistICh2b2lkKSByZWxlYXNlOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKSBtYXJrZXI7CistICh2b2lkKSByZXdpbmQ7CistICh2b2lkKSByZXNldDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgYW5JbmRleDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKHZvaWQpIGNvbnN1bWU7CistICh2b2lkKSBzeW5jOihOU0ludGVnZXIpIGk7CistICh2b2lkKSBmZXRjaDooTlNJbnRlZ2VyKSBuOworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihOU0ludGVnZXIpIGk7CistIChBTXV0YWJsZUFycmF5ICopZ2V0RnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcikgc3RvcEluZGV4OworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKWk7CistIChpZDxBTlRMUlRva2VuPikgTEI6KE5TSW50ZWdlcikgazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMVDooTlNJbnRlZ2VyKSBrOworLSAodm9pZCkgc2V0dXA7CistIChpZDxBTlRMUlRva2VuU291cmNlPikgZ2V0VG9rZW5Tb3VyY2U7CistICh2b2lkKSBzZXRUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZTsKKy0gKEFNdXRhYmxlQXJyYXkgKilnZXRUb2tlbnM7CistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lOworLSAoQU11dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4OworLSAoQU11dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGg6KEFOVExSQml0U2V0ICopdHlwZXM7CistIChBTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zRnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXggV2l0aExpc3Q6KEFNdXRhYmxlQXJyYXkgKil0eXBlczsKKy0gKEFNdXRhYmxlQXJyYXkgKilnZXRUb2tlbnNGcm9tOihOU0ludGVnZXIpc3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BJbmRleCBXaXRoVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG9FbmQ6KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRJbmRleCBUb1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wSW5kZXg7CistICh2b2lkKSBmaWxsOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ODAyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0ubQpAQCAtMCwwICsxLDM5MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisKK2V4dGVybiBOU0ludGVnZXIgZGVidWc7CisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0KKworQHN5bnRoZXNpemUgdG9rZW5Tb3VyY2U7CitAc3ludGhlc2l6ZSB0b2tlbnM7CitAc3ludGhlc2l6ZSBsYXN0TWFya2VyOworQHN5bnRoZXNpemUgaW5kZXg7CitAc3ludGhlc2l6ZSByYW5nZTsKKworKyAoQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbQoreworICAgIHJldHVybiBbW0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbSBhbGxvY10gaW5pdF07Cit9CisKKysgKEFOVExSQnVmZmVyZWRUb2tlblN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW1XaXRoOihpZDxBTlRMUlRva2VuU291cmNlPilhU291cmNlCit7CisgICAgcmV0dXJuIFtbQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRva2VuU291cmNlOmFTb3VyY2VdOworfQorCistIChBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0gKikgaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKQorCXsKKyAgICAgICAgdG9rZW5Tb3VyY2UgPSBuaWw7CisgICAgICAgIHRva2VucyA9IFtbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxMDAwXSByZXRhaW5dOworICAgICAgICBpbmRleCA9IC0xOworICAgICAgICByYW5nZSA9IC0xOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLShpZCkgaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVNvdXJjZQoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKQorCXsKKyAgICAgICAgdG9rZW5Tb3VyY2UgPSBbYVNvdXJjZSByZXRhaW5dOworICAgICAgICB0b2tlbnMgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6MTAwMF0gcmV0YWluXTsKKyAgICAgICAgaW5kZXggPSAtMTsKKyAgICAgICAgcmFuZ2UgPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtICpjb3B5OworICAgIAorICAgIGNvcHkgPSBbW1tzZWxmIGNsYXNzXSBhbGxvY1dpdGhab25lOmFab25lXSBpbml0XTsKKyAgICBjb3B5LnRva2VuU291cmNlID0gc2VsZi50b2tlblNvdXJjZTsKKyAgICBpZiAoIHNlbGYudG9rZW5zICkKKyAgICAgICAgY29weS50b2tlbnMgPSBbdG9rZW5zIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS5sYXN0TWFya2VyID0gc2VsZi5sYXN0TWFya2VyOworICAgIGNvcHkuaW5kZXggPSBzZWxmLmluZGV4OworICAgIGNvcHkucmFuZ2UgPSBzZWxmLnJhbmdlOworICAgIHJldHVybiBjb3B5OworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtIiApOworI2VuZGlmCisgICAgaWYgKCB0b2tlbnMgKSBbdG9rZW5zIHJlbGVhc2VdOworICAgIGlmICggdG9rZW5Tb3VyY2UgKSBbdG9rZW5Tb3VyY2UgcmVsZWFzZV07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChOU1VJbnRlZ2VyKWxpbmUKK3sKKyAgICByZXR1cm4gKChBTlRMUkNvbW1vblRva2VuICopW3Rva2VucyBvYmplY3RBdEluZGV4OmluZGV4XSkubGluZTsKK30KKworLSAoTlNVSW50ZWdlciljaGFyUG9zaXRpb25JbkxpbmUKK3sKKyAgICByZXR1cm4gKChBTlRMUkNvbW1vblRva2VuICopW3Rva2VucyBvYmplY3RBdEluZGV4OmluZGV4XSkuY2hhclBvc2l0aW9uSW5MaW5lOworfQorCistIChpZDxBTlRMUlRva2VuU291cmNlPikgZ2V0VG9rZW5Tb3VyY2UKK3sKKyAgICByZXR1cm4gdG9rZW5Tb3VyY2U7Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0UmFuZ2UKK3sKKyAgICByZXR1cm4gcmFuZ2U7Cit9CisKKy0gKHZvaWQpIHNldFJhbmdlOihOU0ludGVnZXIpYW5JbnQKK3sKKyAgICByYW5nZSA9IGFuSW50OworfQorCistIChOU0ludGVnZXIpIG1hcmsKK3sKKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisvLyAgICAgICAgW3NlbGYgZmlsbF07CisgICAgfQorICAgIGxhc3RNYXJrZXIgPSBzZWxmLmluZGV4OworICAgIHJldHVybiBsYXN0TWFya2VyOworfQorCistICh2b2lkKSByZWxlYXNlOihOU0ludGVnZXIpIG1hcmtlcgoreworICAgIC8vIG5vIHJlc291cmNlcyB0byByZWxlYXNlCit9CisKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKSBtYXJrZXIKK3sKKyAgICBbc2VsZiBzZWVrOm1hcmtlcl07Cit9CisKKy0gKHZvaWQpIHJld2luZAoreworICAgIFtzZWxmIHNlZWs6bGFzdE1hcmtlcl07Cit9CisKKy0gKHZvaWQpIHJlc2V0Cit7CisgICAgaW5kZXggPSAwOworICAgIGxhc3RNYXJrZXIgPSAwOworfQorCistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGFuSW5kZXgKK3sKKyAgICBpbmRleCA9IGFuSW5kZXg7Cit9CisKKy0gKE5TSW50ZWdlcikgc2l6ZQoreworICAgIHJldHVybiBbdG9rZW5zIGNvdW50XTsKK30KKworLyoqIE1vdmUgdGhlIGlucHV0IHBvaW50ZXIgdG8gdGhlIG5leHQgaW5jb21pbmcgdG9rZW4uICBUaGUgc3RyZWFtCisgKiAgbXVzdCBiZWNvbWUgYWN0aXZlIHdpdGggTFQoMSkgYXZhaWxhYmxlLiAgY29uc3VtZSgpIHNpbXBseQorICogIG1vdmVzIHRoZSBpbnB1dCBwb2ludGVyIHNvIHRoYXQgTFQoMSkgcG9pbnRzIGF0IHRoZSBuZXh0CisgKiAgaW5wdXQgc3ltYm9sLiBDb25zdW1lIGF0IGxlYXN0IG9uZSB0b2tlbi4KKyAqCisgKiAgV2FsayBwYXN0IGFueSB0b2tlbiBub3Qgb24gdGhlIGNoYW5uZWwgdGhlIHBhcnNlciBpcyBsaXN0ZW5pbmcgdG8uCisgKi8KKy0gKHZvaWQpIGNvbnN1bWUKK3sKKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisvLyAgICAgICAgW3NlbGYgZmlsbF07CisgICAgfQorICAgIGluZGV4Kys7CisgICAgW3NlbGYgc3luYzppbmRleF07Cit9CisKKy8qKiBNYWtlIHN1cmUgaW5kZXggaSBpbiB0b2tlbnMgaGFzIGEgdG9rZW4uICovCistICh2b2lkKSBzeW5jOihOU0ludGVnZXIpIGkKK3sKKyAgICAvLyBob3cgbWFueSBtb3JlIGVsZW1lbnRzIHdlIG5lZWQ/CisgICAgTlNJbnRlZ2VyIG4gPSAoaSAtIFt0b2tlbnMgY291bnRdKSArIDE7CisgICAgaWYgKGRlYnVnID4gMSkgTlNMb2coQCJbc2VsZiBzeW5jOiVkXSBuZWVkcyAlZFxuIiwgaSwgbik7CisgICAgaWYgKCBuID4gMCApCisgICAgICAgIFtzZWxmIGZldGNoOm5dOworfQorCisvKiogYWRkIG4gZWxlbWVudHMgdG8gYnVmZmVyICovCistICh2b2lkKSBmZXRjaDooTlNJbnRlZ2VyKW4KK3sKKyAgICBmb3IgKE5TSW50ZWdlciBpPTE7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgIGlkPEFOVExSVG9rZW4+IHQgPSBbdG9rZW5Tb3VyY2UgbmV4dFRva2VuXTsKKyAgICAgICAgW3Qgc2V0VG9rZW5JbmRleDpbdG9rZW5zIGNvdW50XV07CisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKEAiYWRkaW5nICVAIGF0IGluZGV4ICVkXG4iLCBbdCB0ZXh0XSwgW3Rva2VucyBjb3VudF0pOworICAgICAgICBbdG9rZW5zIGFkZE9iamVjdDp0XTsKKyAgICAgICAgaWYgKCB0LnR5cGUgPT0gQU5UTFJUb2tlblR5cGVFT0YgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW46KE5TSW50ZWdlcikgaQoreworICAgIGlmICggaSA8IDAgfHwgaSA+PSBbdG9rZW5zIGNvdW50XSApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAidG9rZW4gaW5kZXggJWQgb3V0IG9mIHJhbmdlIDAuLiVkIiwgaSwgW3Rva2VucyBjb3VudF0tMV1dOworICAgIH0KKyAgICByZXR1cm4gW3Rva2VucyBvYmplY3RBdEluZGV4OmldOworfQorCisvKiogR2V0IGFsbCB0b2tlbnMgZnJvbSBzdGFydC4uc3RvcCBpbmNsdXNpdmVseSAqLworLSAoQU11dGFibGVBcnJheSAqKWdldEZyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4Cit7CisgICAgaWYgKCBzdGFydEluZGV4IDwgMCB8fCBzdG9wSW5kZXggPCAwICkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisvLyAgICAgICAgW3NlbGYgZmlsbF07CisgICAgfQorICAgIEFNdXRhYmxlQXJyYXkgKnN1YnNldCA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdOworICAgIGlmICggc3RvcEluZGV4ID49IFt0b2tlbnMgY291bnRdICkKKyAgICAgICAgc3RvcEluZGV4ID0gW3Rva2VucyBjb3VudF0tMTsKKyAgICBmb3IgKE5TSW50ZWdlciBpID0gc3RhcnRJbmRleDsgaSA8PSBzdG9wSW5kZXg7IGkrKykgeworICAgICAgICBpZDxBTlRMUlRva2VuPnQgPSBbdG9rZW5zIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggdC50eXBlID09IEFOVExSVG9rZW5UeXBlRU9GICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBbc3Vic2V0IGFkZE9iamVjdDp0XTsKKyAgICB9CisgICAgcmV0dXJuIHN1YnNldDsKK30KKworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKWkKK3sKKyAgICByZXR1cm4gW1tzZWxmIExUOmldIHR5cGVdOworfQorCistIChpZDxBTlRMUlRva2VuPikgTEI6KE5TSW50ZWdlcilrCit7CisgICAgaWYgKCAoaW5kZXggLSBrKSA8IDAgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJldHVybiBbdG9rZW5zIG9iamVjdEF0SW5kZXg6KGluZGV4LWspXTsKK30KKworLSAoaWQ8QU5UTFJUb2tlbj4pIExUOihOU0ludGVnZXIpaworeworICAgIGlmICggaW5kZXggPT0gLTEgKSB7CisgICAgICAgIFtzZWxmIHNldHVwXTsKKy8vICAgICAgICBbc2VsZiBmaWxsXTsKKyAgICB9CisgICAgaWYgKCBrID09IDAgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIGlmICggayA8IDAgKQorICAgICAgICByZXR1cm4gW3NlbGYgTEI6LWtdOworICAgIAorICAgIE5TSW50ZWdlciBpID0gaW5kZXggKyBrIC0gMTsKKyAgICBbc2VsZiBzeW5jOmldOworICAgIGlmICggaSA+PSBbdG9rZW5zIGNvdW50XSApIHsgLy8gcmV0dXJuIEVPRiB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFT0YgbXVzdCBiZSBsYXN0IHRva2VuCisgICAgICAgIHJldHVybiBbdG9rZW5zIG9iamVjdEF0SW5kZXg6KFt0b2tlbnMgY291bnRdLTEpXTsKKyAgICB9CisgICAgaWYgKCBpID4gcmFuZ2UgKQorICAgICAgICByYW5nZSA9IGk7IAkJCisgICAgcmV0dXJuIFt0b2tlbnMgb2JqZWN0QXRJbmRleDppXTsKK30KKworLSAodm9pZCkgc2V0dXAKK3sKKyAgICBbc2VsZiBzeW5jOjBdOworICAgIGluZGV4ID0gMDsKK30KKworLyoqIFJlc2V0IHRoaXMgdG9rZW4gc3RyZWFtIGJ5IHNldHRpbmcgaXRzIHRva2VuIHNvdXJjZS4gKi8KKy0gKHZvaWQpIHNldFRva2VuU291cmNlOihpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlCit7CisgICAgdG9rZW5Tb3VyY2UgPSBhVG9rZW5Tb3VyY2U7CisgICAgaWYgKCBbdG9rZW5zIGNvdW50XSApCisgICAgICAgIFt0b2tlbnMgcmVtb3ZlQWxsT2JqZWN0c107CisgICAgaW5kZXggPSAtMTsKK30KKworLSAoQU11dGFibGVBcnJheSAqKWdldFRva2VucworeworICAgIHJldHVybiB0b2tlbnM7Cit9CisKKy0gKEFNdXRhYmxlQXJyYXkgKilnZXRUb2tlbnNGcm9tOihOU0ludGVnZXIpIHN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcikgc3RvcEluZGV4Cit7CisgICAgcmV0dXJuIFtzZWxmIGdldFRva2Vuc0Zyb206c3RhcnRJbmRleCBUbzpzdG9wSW5kZXggV2l0aDooQU5UTFJCaXRTZXQgKiluaWxdOworfQorCisvKiogR2l2ZW4gYSBzdGFydCBhbmQgc3RvcCBpbmRleCwgcmV0dXJuIGEgTGlzdCBvZiBhbGwgdG9rZW5zIGluCisgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgKiAgbWV0aG9kIGxvb2tzIGF0IGJvdGggb24gYW5kIG9mZiBjaGFubmVsIHRva2Vucy4KKyAqLworLSAoQU11dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGg6KEFOVExSQml0U2V0ICopdHlwZXMKK3sKKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisvLyAgICAgICAgW3NlbGYgZmlsbF07CisgICAgfQorICAgIGlmICggc3RvcEluZGV4ID49IFt0b2tlbnMgY291bnRdICkKKyAgICAgICAgc3RvcEluZGV4ID0gW3Rva2VucyBjb3VudF0tMTsKKyAgICBpZiAoIHN0YXJ0SW5kZXggPCAwICkKKyAgICAgICAgc3RhcnRJbmRleCA9IDA7CisgICAgaWYgKCBzdGFydEluZGV4ID4gc3RvcEluZGV4ICkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAKKyAgICAvLyBsaXN0ID0gdG9rZW5zW3N0YXJ0OnN0b3BdOntUb2tlbiB0LCB0LmdldFR5cGUoKSBpbiB0eXBlc30KKyAgICBBTXV0YWJsZUFycmF5ICpmaWx0ZXJlZFRva2VucyA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdOworICAgIGZvciAoTlNJbnRlZ2VyIGkgPSBzdGFydEluZGV4OyBpIDw9IHN0b3BJbmRleDsgaSsrKSB7CisgICAgICAgIGlkPEFOVExSVG9rZW4+dCA9IFt0b2tlbnMgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgaWYgKCB0eXBlcyA9PSBuaWwgfHwgW3R5cGVzIG1lbWJlcjp0LnR5cGVdICkgeworICAgICAgICAgICAgW2ZpbHRlcmVkVG9rZW5zIGFkZE9iamVjdDp0XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIFtmaWx0ZXJlZFRva2VucyBjb3VudF0gPT0gMCApIHsKKyAgICAgICAgZmlsdGVyZWRUb2tlbnMgPSBuaWw7CisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZFRva2VuczsKK30KKworLSAoQU11dGFibGVBcnJheSAqKWdldFRva2Vuc0Zyb206KE5TSW50ZWdlcilzdGFydEluZGV4IFRvOihOU0ludGVnZXIpc3RvcEluZGV4IFdpdGhUeXBlOihOU0ludGVnZXIpdHR5cGUKK3sKKyAgICByZXR1cm4gW3NlbGYgZ2V0VG9rZW5zRnJvbTpzdGFydEluZGV4IFRvOnN0b3BJbmRleCBXaXRoOltBTlRMUkJpdFNldCBvZjp0dHlwZV1dOworfQorCistIChBTXV0YWJsZUFycmF5ICopZ2V0VG9rZW5zRnJvbTooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXggV2l0aExpc3Q6KEFNdXRhYmxlQXJyYXkgKil0eXBlcworeworICAgIHJldHVybiBbc2VsZiBnZXRUb2tlbnNGcm9tOnN0YXJ0SW5kZXggVG86c3RvcEluZGV4IFdpdGg6W0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEFycmF5OnR5cGVzXV07Cit9CisgICAgICAgICAgICAKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZQoreworICAgIHJldHVybiBbdG9rZW5Tb3VyY2UgZ2V0U291cmNlTmFtZV07Cit9CisKKy8qKiBHcmFiICphbGwqIHRva2VucyBmcm9tIHN0cmVhbSBhbmQgcmV0dXJuIHN0cmluZyAqLworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmcKK3sKKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisgICAgfQorICAgIFtzZWxmIGZpbGxdOworICAgIHJldHVybiBbc2VsZiB0b1N0cmluZ0Zyb21TdGFydDowIFRvRW5kOlt0b2tlbnMgY291bnRdLTFdOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0SWR4IFRvRW5kOihOU0ludGVnZXIpc3RvcElkeAoreworICAgIGlmICggc3RhcnRJZHggPCAwIHx8IHN0b3BJZHggPCAwICkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisgICAgfQorICAgIGlmICggc3RvcElkeCA+PSBbdG9rZW5zIGNvdW50XSApCisgICAgICAgIHN0b3BJZHggPSBbdG9rZW5zIGNvdW50XS0xOworICAgIE5TTXV0YWJsZVN0cmluZyAqYnVmID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoQ2FwYWNpdHk6NV07CisgICAgZm9yIChOU0ludGVnZXIgaSA9IHN0YXJ0SWR4OyBpIDw9IHN0b3BJZHg7IGkrKykgeworICAgICAgICBpZDxBTlRMUlRva2VuPnQgPSBbdG9rZW5zIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggdC50eXBlID09IEFOVExSVG9rZW5UeXBlRU9GICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpbdCB0ZXh0XV07CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgoreworICAgIGlmICggc3RhcnRUb2tlbiAhPSBuaWwgJiYgc3RvcFRva2VuICE9IG5pbCApIHsKKyAgICAgICAgcmV0dXJuIFtzZWxmIHRvU3RyaW5nRnJvbVN0YXJ0OltzdGFydFRva2VuIGdldFRva2VuSW5kZXhdIFRvRW5kOltzdG9wVG9rZW4gZ2V0VG9rZW5JbmRleF1dOworICAgIH0KKyAgICByZXR1cm4gbmlsOworfQorCisvKiogR2V0IGFsbCB0b2tlbnMgZnJvbSBsZXhlciB1bnRpbCBFT0YgKi8KKy0gKHZvaWQpIGZpbGwKK3sKKyAgICBpZiAoIGluZGV4ID09IC0xICkgW3NlbGYgc2V0dXBdOworICAgIGlmICggWygoQU5UTFJDb21tb25Ub2tlbiAqKVt0b2tlbnMgb2JqZWN0QXRJbmRleDppbmRleF0pIHR5cGVdID09IEFOVExSVG9rZW5UeXBlRU9GICkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIE5TSW50ZWdlciBpID0gaW5kZXgrMTsKKyAgICBbc2VsZiBzeW5jOmldOworICAgIHdoaWxlICggWygoQU5UTFJDb21tb25Ub2tlbiAqKVt0b2tlbnMgb2JqZWN0QXRJbmRleDppXSkgdHlwZV0gIT0gQU5UTFJUb2tlblR5cGVFT0YgKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgW3NlbGYgc3luYzppXTsKKyAgICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1NTVhNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTU3IEBACisvLworLy8gIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oCisvLyAgQU5UTFIKKy8vCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkxvb2thaGVhZFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUcmVlSXRlcmF0b3IuaCIKKyNpbXBvcnQgIkFOVExSSW50QXJyYXkuaCIKKyNpbXBvcnQgIkFNdXRhYmxlQXJyYXkuaCIKKworI2RlZmluZSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgMTAwCisjZGVmaW5lIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFIDEwCisKKyNpZmRlZiBET05UVVNFTk9NTworQGludGVyZmFjZSBBTlRMUlN0cmVhbUl0ZXJhdG9yIDogQU5UTFJUcmVlSXRlcmF0b3IKK3sKKyAgICBOU0ludGVnZXIgaWR4OworICAgIF9fc3Ryb25nIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqaW5wdXQ7CisgICAgX19zdHJvbmcgQU11dGFibGVBcnJheSAqbm9kZXM7Cit9CisKKysgKGlkKSBuZXdBTlRMUlN0cmVhbUl0ZXJhdG9yOihBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKikgdGhlU3RyZWFtOworCistIChpZCkgaW5pdFdpdGhTdHJlYW06KEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSB0aGVTdHJlYW07CisKKy0gKEJPT0wpIGhhc05leHQ7CistIChpZCkgbmV4dDsKKy0gKHZvaWQpIHJlbW92ZTsKK0BlbmQKKyNlbmRpZgorCitAaW50ZXJmYWNlIEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSA6IE5TT2JqZWN0IDxBTlRMUlRyZWVOb2RlU3RyZWFtPiAKK3sKKwlpZCB1cDsKKwlpZCBkb3duOworCWlkIGVvZjsKKwkKKwlBTXV0YWJsZUFycmF5ICpub2RlczsKKwkKKwlpZCByb290OyAvLyByb290CisJCisJaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworCUFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKmFkYXB0b3I7CisJCisJQk9PTCB1bmlxdWVOYXZpZ2F0aW9uTm9kZXM7CisJTlNJbnRlZ2VyIGluZGV4OworCU5TSW50ZWdlciBsYXN0TWFya2VyOworCUFOVExSSW50QXJyYXkgKmNhbGxzOworCQorCU5TRW51bWVyYXRvciAqZTsKKyAgICBpZCBjdXJyZW50U3ltYm9sOworCQorfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFVwLCBzZXR0ZXI9c2V0VXA6KSBpZCB1cDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RG93biwgc2V0dGVyPXNldERvd246KSBpZCBkb3duOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1lb2YsIHNldHRlcj1zZXRFb2Y6KSBpZCBlb2Y7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5vZGVzLCBzZXR0ZXI9c2V0Tm9kZXM6KSBBTXV0YWJsZUFycmF5ICpub2RlczsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZVNvdXJjZSwgc2V0dGVyPXNldFRyZWVTb3VyY2U6KSBpZCByb290OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUb2tlblN0cmVhbSwgc2V0dGVyPXNldFRva2VuU3RyZWFtOikgaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRBZGFwdG9yLCBzZXR0ZXI9c2V0QWRhcHRvcjopIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKmFkYXB0b3I7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFVuaXF1ZU5hdmlnYXRpb25Ob2Rlcywgc2V0dGVyPXNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczopIEJPT0wgdW5pcXVlTmF2aWdhdGlvbk5vZGVzOworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBpbmRleDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGFzdE1hcmtlciwgc2V0dGVyPXNldExhc3RNYXJrZXI6KSBOU0ludGVnZXIgbGFzdE1hcmtlcjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Q2FsbHMsIHNldHRlcj1zZXRDYWxsczopIEFOVExSSW50QXJyYXkgKmNhbGxzOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRFbnVtLCBzZXR0ZXI9c2V0RW51bTopIE5TRW51bWVyYXRvciAqZTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Q3VycmVudFN5bWJvbCwgc2V0dGVyPXNldEN1cnJlbnRTeW1ib2w6KSBpZCBjdXJyZW50U3ltYm9sOworCisrIChBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKikgbmV3QU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtOihBTlRMUkNvbW1vblRyZWUgKil0cmVlOworKyAoQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0cmVlOworKyAoQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIG5ld0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0cmVlIHdpdGhCdWZmZXJTaXplOihOU0ludGVnZXIpaW5pdGlhbEJ1ZmZlclNpemU7CisKKyNwcmFnbWEgbWFyayBDb25zdHJ1Y3RvcgorLSAoaWQpIGluaXRXaXRoVHJlZTooQU5UTFJDb21tb25UcmVlICopdHJlZTsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopYW5BZGFwdG9yIFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKXRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0cmVlIFdpdGhCdWZmZXJTaXplOihOU0ludGVnZXIpYnVmZmVyU2l6ZTsKKworLSAodm9pZClkZWFsbG9jOworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy8vIHByb3RlY3RlZCBtZXRob2RzLiBETyBOT1QgVVNFCisjcHJhZ21hIG1hcmsgUHJvdGVjdGVkIE1ldGhvZHMKKy0gKHZvaWQpIGZpbGxCdWZmZXI7CistICh2b2lkKSBmaWxsQnVmZmVyV2l0aFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKSB0cmVlOworLSAoTlNJbnRlZ2VyKSBnZXROb2RlSW5kZXg6KEFOVExSQ29tbW9uVHJlZSAqKSBub2RlOworLSAodm9pZCkgYWRkTmF2aWdhdGlvbk5vZGU6KE5TSW50ZWdlcikgdHlwZTsKKy0gKGlkKSBnZXROb2RlOihOU1VJbnRlZ2VyKSBpOworLSAoaWQpIExUOihOU0ludGVnZXIpIGs7CistIChpZCkgZ2V0Q3VycmVudFN5bWJvbDsKKy0gKGlkKSBMQjooTlNJbnRlZ2VyKSBpOworI3ByYWdtYSBtYXJrIEdlbmVyYWwgTWV0aG9kcworLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGdldFRva2VuU3RyZWFtOworLSAodm9pZCkgc2V0VG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KSB0b2tlbnM7CistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGFuQWRhcHRvcjsKKworLSAoQk9PTClnZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM7CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpYVZhbDsKKworLSAodm9pZCkgY29uc3VtZTsKKy0gKE5TSW50ZWdlcikgTEE6KE5TSW50ZWdlcikgaTsKKy0gKE5TSW50ZWdlcikgbWFyazsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgaWR4OworCistICh2b2lkKSBwdXNoOihOU0ludGVnZXIpIGk7CistIChOU0ludGVnZXIpIHBvcDsKKworLSAodm9pZCkgcmVzZXQ7CistIChOU1VJbnRlZ2VyKSBjb3VudDsKKy0gKE5TRW51bWVyYXRvciAqKSBvYmplY3RFbnVtZXJhdG9yOworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworCistIChOU1N0cmluZyAqKSB0b1Rva2VuVHlwZVN0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvVG9rZW5TdHJpbmc6KE5TSW50ZWdlcilhU3RhcnQgVG9FbmQ6KE5TSW50ZWdlcilhU3RvcDsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKWFTdGFydCBUb05vZGU6KGlkKWFTdG9wOworCisvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCistIChBTXV0YWJsZUFycmF5ICopIGdldE5vZGVzOworLSAoaWQpIGVvZjsKKy0gKHZvaWQpc2V0RW9mOihpZClhbkVPRjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY3M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0KQEAgLTAsMCArMSw1NTYgQEAKKy8vCisvLyAgQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm0KKy8vICBBTlRMUgorLy8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisKK2V4dGVybiBOU0ludGVnZXIgZGVidWc7CisKKyNpZmRlZiBET05UVVNFTk9NTworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZVN0cmVhbUl0ZXJhdG9yCisrIG5ld0FOVExSVHJlZVN0cmVhbUl0ZXJhdG9yV2l0aE5vZGVzOihBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKil0aGVTdHJlYW0KK3sKKyAgICByZXR1cm5bW0FOVExSVHJlZVN0cmVhbUl0ZXJhdG9yIGFsbG9jXSBpbml0V2l0aFN0cmVhbTp0aGVTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhTdHJlYW06KEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKXRoZVN0cmVhbQoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGlkeCA9IDA7CisgICAgICAgIGlucHV0ID0gdGhlU3RyZWFtOworICAgICAgICBub2RlcyA9IFt0aGVTdHJlYW0gZ2V0Tm9kZXNdOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoQk9PTCkgaGFzTmV4dAoreworICAgIHJldHVybiBpZHggPCBbbm9kZXMgY291bnRdOworfQorCistIChpZCkgbmV4dAoreworICAgIE5TSW50ZWdlciBjdXJyZW50ID0gaWR4OworICAgIGlkeCsrOworICAgIGlmIChjdXJyZW50IDwgW25vZGVzIGNvdW50XSkgeworICAgIH0KKyAgICByZXR1cm4gW25vZGVzIGdldEVvZl07Cit9CisKKy0gKHZvaWQpIHJlbW92ZQoreworCUB0aHJvdyBbQU5UTFJSdW50aW1lRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpAImNhbm5vdCByZW1vdmUgbm9kZXMgZnJvbSBzdHJlYW0iXTsKK30KKworQGVuZAorI2VuZGlmCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0KKworQHN5bnRoZXNpemUgdXA7CitAc3ludGhlc2l6ZSBkb3duOworQHN5bnRoZXNpemUgZW9mOworQHN5bnRoZXNpemUgbm9kZXM7CitAc3ludGhlc2l6ZSByb290OworQHN5bnRoZXNpemUgdG9rZW5zOworQHN5bnRoZXNpemUgYWRhcHRvcjsKK0BzeW50aGVzaXplIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKK0BzeW50aGVzaXplIGluZGV4OworQHN5bnRoZXNpemUgbGFzdE1hcmtlcjsKK0BzeW50aGVzaXplIGNhbGxzOworQHN5bnRoZXNpemUgZTsKK0BzeW50aGVzaXplIGN1cnJlbnRTeW1ib2w7CisKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KEFOVExSQ29tbW9uVHJlZSAqKSBhVHJlZQoreworICAgIHJldHVybiBbKChBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKilbQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtIGFsbG9jXSkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZV07Cit9CisKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gYWxsb2NdIGluaXRXaXRoVHJlZUFkYXB0b3I6YWRhcHRvciBUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZV07Cit9CisKKysgKEFOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUgd2l0aEJ1ZmZlclNpemU6KE5TSW50ZWdlcilpbml0aWFsQnVmZmVyU2l6ZQoreworICAgIHJldHVybiBbW0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphZGFwdG9yIFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlIFdpdGhCdWZmZXJTaXplOmluaXRpYWxCdWZmZXJTaXplXTsKK30KKworLShBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKikgaW5pdAoreworCXNlbGYgPSBbc3VwZXIgaW5pdF07CisJaWYgKHNlbGYpIHsKKwkJaW5kZXggPSAtMTsKKwkJdW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gTk87CisgICAgICAgIHJvb3QgPSBbW0FOVExSQ29tbW9uVHJlZSBhbGxvY10gaW5pdF07CisgICAgICAgIC8vCQl0b2tlbnMgPSB0cmVlOworICAgICAgICBhZGFwdG9yID0gW1tbQU5UTFJDb21tb25UcmVlQWRhcHRvciBhbGxvY10gaW5pdF0gcmV0YWluXTsKKyAgICAgICAgbm9kZXMgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6REVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFXSByZXRhaW5dOworICAgICAgICBkb3duID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVET1dOIFRleHQ6QCJET1dOIl0gcmV0YWluXTsKKyAgICAgICAgdXAgPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZVVQIFRleHQ6QCJVUCJdIHJldGFpbl07CisgICAgICAgIGVvZiA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXSByZXRhaW5dOworICAgIH0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKikgYVRyZWUKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRdOworCWlmIChzZWxmKSB7CisJCWluZGV4ID0gLTE7CisJCXVuaXF1ZU5hdmlnYXRpb25Ob2RlcyA9IE5POworICAgICAgICByb290ID0gYVRyZWU7CisgICAgICAgIC8vCQl0b2tlbnMgPSBhVHJlZTsKKyAgICAgICAgYWRhcHRvciA9IFtbW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgYWxsb2NdIGluaXRdIHJldGFpbl07CisgICAgICAgIG5vZGVzID0gW1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OkRFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRV0gcmV0YWluXTsKKyAgICAgICAgZG93biA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRE9XTiBUZXh0OkAiRE9XTiJdIHJldGFpbl07CisgICAgICAgIHVwID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVVUCBUZXh0OkAiVVAiXSByZXRhaW5dOworICAgICAgICBlb2YgPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZUVPRiBUZXh0OkAiRU9GIl0gcmV0YWluXTsKKyAgICB9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0oQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtICopIGluaXRXaXRoVHJlZUFkYXB0b3I6KEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKilhbkFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRdOworCWlmIChzZWxmKSB7CisJCWluZGV4ID0gLTE7CisJCXVuaXF1ZU5hdmlnYXRpb25Ob2RlcyA9IE5POworICAgICAgICByb290ID0gYVRyZWU7CisgICAgICAgIC8vCQl0b2tlbnMgPSBhVHJlZTsKKyAgICAgICAgYWRhcHRvciA9IFthbkFkYXB0b3IgcmV0YWluXTsKKyAgICAgICAgbm9kZXMgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6REVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFXSByZXRhaW5dOworICAgICAgICBkb3duID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVET1dOIFRleHQ6QCJET1dOIl0gcmV0YWluXTsKKyAgICAgICAgdXAgPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZVVQIFRleHQ6QCJVUCJdIHJldGFpbl07CisgICAgICAgIGVvZiA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXSByZXRhaW5dOworICAgIH0KKwlyZXR1cm4gc2VsZjsKK30KKworLShBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKikgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFuQWRhcHRvciBUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZSBXaXRoQnVmZmVyU2l6ZTooTlNJbnRlZ2VyKWJ1ZmZlclNpemUKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRdOworCWlmIChzZWxmKSB7CisgICAgICAgIC8vCQlkb3duID0gW2FkYXB0b3IgY3JlYXRlVG9rZW46QU5UTFJUb2tlblR5cGVET1dOIHdpdGhUZXh0OkAiRE9XTiJdOworICAgICAgICAvLwkJdXAgPSBbYWRhcHRvciBjcmVhdGVUb2tlbjpBTlRMUlRva2VuVHlwZURPV04gd2l0aFRleHQ6QCJVUCJdOworICAgICAgICAvLwkJZW9mID0gW2FkYXB0b3IgY3JlYXRlVG9rZW46QU5UTFJUb2tlblR5cGVET1dOIHdpdGhUZXh0OkAiRU9GIl07CisJCWluZGV4ID0gLTE7CisJCXVuaXF1ZU5hdmlnYXRpb25Ob2RlcyA9IE5POworICAgICAgICByb290ID0gYVRyZWU7CisgICAgICAgIC8vCQl0b2tlbnMgPSBhVHJlZTsKKyAgICAgICAgYWRhcHRvciA9IFthbkFkYXB0b3IgcmV0YWluXTsKKyAgICAgICAgbm9kZXMgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6YnVmZmVyU2l6ZV0gcmV0YWluXTsKKyAgICAgICAgZG93biA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRE9XTiBUZXh0OkAiRE9XTiJdIHJldGFpbl07CisgICAgICAgIHVwID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVVUCBUZXh0OkAiVVAiXSByZXRhaW5dOworICAgICAgICBlb2YgPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZUVPRiBUZXh0OkAiRU9GIl0gcmV0YWluXTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0iICk7CisjZW5kaWYKKyAgICBpZiAoIGFkYXB0b3IgKSBbYWRhcHRvciByZWxlYXNlXTsKKyAgICBpZiAoIG5vZGVzICkgW25vZGVzIHJlbGVhc2VdOworICAgIGlmICggcm9vdCApIFtyb290IHJlbGVhc2VdOworICAgIGlmICggZG93biApIFtkb3duIHJlbGVhc2VdOworICAgIGlmICggdXAgKSBbdXAgcmVsZWFzZV07CisgICAgaWYgKCBlb2YgKSBbZW9mIHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICBBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gKmNvcHk7CisgICAgCisgICAgY29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworICAgIGlmICggdXAgKQorICAgICAgICBjb3B5LnVwID0gW3VwIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgaWYgKCBkb3duICkKKyAgICAgICAgY29weS5kb3duID0gW2Rvd24gY29weVdpdGhab25lOmFab25lXTsKKyAgICBpZiAoIGVvZiApCisgICAgICAgIGNvcHkuZW9mID0gW2VvZiBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIGlmICggbm9kZXMgKQorICAgICAgICBjb3B5Lm5vZGVzID0gW25vZGVzIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgaWYgKCByb290ICkKKyAgICAgICAgY29weS5yb290ID0gW3Jvb3QgY29weVdpdGhab25lOmFab25lXTsKKyAgICBpZiAoIHRva2VucyApCisgICAgICAgIGNvcHkudG9rZW5zID0gW3Rva2VucyBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIGlmICggYWRhcHRvciApCisgICAgICAgIGNvcHkuYWRhcHRvciA9IFthZGFwdG9yIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS51bmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSBzZWxmLnVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICBjb3B5LmluZGV4ID0gc2VsZi5pbmRleDsKKyAgICBjb3B5Lmxhc3RNYXJrZXIgPSBzZWxmLmxhc3RNYXJrZXI7CisgICAgaWYgKCBjYWxscyApCisgICAgICAgIGNvcHkuY2FsbHMgPSBbY2FsbHMgY29weVdpdGhab25lOmFab25lXTsKKyAgICByZXR1cm4gY29weTsKK30KKworLy8gcHJvdGVjdGVkIG1ldGhvZHMuIERPIE5PVCBVU0UKKyNwcmFnbWEgbWFyayBQcm90ZWN0ZWQgTWV0aG9kcworLSh2b2lkKSBmaWxsQnVmZmVyCit7CisJW3NlbGYgZmlsbEJ1ZmZlcldpdGhUcmVlOnJvb3RdOworCS8vIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKCJyZXZJbmRleD0lQCIsIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCk7CisJaW5kZXggPSAwOyAvLyBidWZmZXIgb2Ygbm9kZXMgaW50aWFsaXplZCBub3cKK30KKworLSh2b2lkKSBmaWxsQnVmZmVyV2l0aFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKSBhVHJlZQoreworCUJPT0wgZW1wdHkgPSBbYWRhcHRvciBpc05pbDphVHJlZV07CisJaWYgKCFlbXB0eSkgeworCQlbbm9kZXMgYWRkT2JqZWN0OmFUcmVlXTsKKwl9CisJTlNJbnRlZ2VyIG4gPSBbYWRhcHRvciBnZXRDaGlsZENvdW50OmFUcmVlXTsKKwlpZiAoIWVtcHR5ICYmIG4gPiAwKSB7CisJCVtzZWxmIGFkZE5hdmlnYXRpb25Ob2RlOkFOVExSVG9rZW5UeXBlRE9XTl07CisJfQorCWZvciAoTlNJbnRlZ2VyIGMgPSAwOyBjIDwgbjsgYysrKSB7CisJCWlkIGNoaWxkID0gW2FkYXB0b3IgZ2V0Q2hpbGQ6YVRyZWUgQXQ6Y107CisJCVtzZWxmIGZpbGxCdWZmZXJXaXRoVHJlZTpjaGlsZF07CisJfQorCWlmICghZW1wdHkgJiYgbiA+IDApIHsKKwkJW3NlbGYgYWRkTmF2aWdhdGlvbk5vZGU6QU5UTFJUb2tlblR5cGVVUF07CisJfQorfQorCistKE5TSW50ZWdlcikgZ2V0Tm9kZUluZGV4OihBTlRMUkNvbW1vblRyZWUgKikgbm9kZQoreworCWlmIChpbmRleCA9PSAtMSkgeworCQlbc2VsZiBmaWxsQnVmZmVyXTsKKwl9CisJZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgW25vZGVzIGNvdW50XTsgaSsrKSB7CisJCWlkIHQgPSBbbm9kZXMgb2JqZWN0QXRJbmRleDppXTsKKwkJaWYgKHQgPT0gbm9kZSkgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCistKHZvaWQpIGFkZE5hdmlnYXRpb25Ob2RlOihOU0ludGVnZXIpIHR5cGUKK3sKKwlpZCBuYXZOb2RlID0gbmlsOworCWlmICh0eXBlID09IEFOVExSVG9rZW5UeXBlRE9XTikgeworCQlpZiAoc2VsZi51bmlxdWVOYXZpZ2F0aW9uTm9kZXMpIHsKKwkJCW5hdk5vZGUgPSBbYWRhcHRvciBjcmVhdGVUb2tlbjpBTlRMUlRva2VuVHlwZURPV04gVGV4dDpAIkRPV04iXTsKKwkJfQorCQllbHNlIHsKKwkJCW5hdk5vZGUgPSBkb3duOworCQl9CisKKwl9CisJZWxzZSB7CisJCWlmIChzZWxmLnVuaXF1ZU5hdmlnYXRpb25Ob2RlcykgeworCQkJbmF2Tm9kZSA9IFthZGFwdG9yIGNyZWF0ZVRva2VuOkFOVExSVG9rZW5UeXBlVVAgVGV4dDpAIlVQIl07CisJCX0KKwkJZWxzZSB7CisJCQluYXZOb2RlID0gdXA7CisJCX0KKwl9CisJW25vZGVzIGFkZE9iamVjdDpuYXZOb2RlXTsKK30KKworLShpZCkgZ2V0Tm9kZTooTlNVSW50ZWdlcikgaQoreworCWlmIChpbmRleCA9PSAtMSkgeworCQlbc2VsZiBmaWxsQnVmZmVyXTsKKwl9CisJcmV0dXJuIFtub2RlcyBvYmplY3RBdEluZGV4OmldOworfQorCistKGlkKSBMVDooTlNJbnRlZ2VyKSBrCit7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCVtzZWxmIGZpbGxCdWZmZXJdOworCX0KKwlpZiAoayA9PSAwKSB7CisJCXJldHVybiBuaWw7CisJfQorCWlmIChrIDwgMCkgeworCQlyZXR1cm4gW3NlbGYgTEI6LWtdOworCX0KKwlpZiAoKGluZGV4ICsgayAtIDEpID49IFtub2RlcyBjb3VudF0pIHsKKwkJcmV0dXJuIGVvZjsKKwl9CisJcmV0dXJuIFtub2RlcyBvYmplY3RBdEluZGV4OihpbmRleCArIGsgLSAxKV07Cit9CisKKy0oaWQpIGdldEN1cnJlbnRTeW1ib2wKK3sKKwlyZXR1cm4gW3NlbGYgTFQ6MV07Cit9CisKKy0oaWQpIExCOihOU0ludGVnZXIpIGsKK3sKKwlpZiAoayA9PSAwKSB7CisJCXJldHVybiBuaWw7CisJfQorCWlmICgoaW5kZXggLSBrKSA8IDApIHsKKwkJcmV0dXJuIG5pbDsKKwl9CisJcmV0dXJuIFtub2RlcyBvYmplY3RBdEluZGV4OihpbmRleCAtIGspXTsKK30KKworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZVNvdXJjZQoreworICAgIHJldHVybiByb290OworfQorCistKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZQoreworCXJldHVybiBbW3NlbGYgZ2V0VG9rZW5TdHJlYW1dIGdldFNvdXJjZU5hbWVdOworfQorCistIChpZDxBTlRMUlRva2VuU3RyZWFtPilnZXRUb2tlblN0cmVhbQoreworICAgIHJldHVybiB0b2tlbnM7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPiluZXd0b2tlbnMKK3sKKyAgICB0b2tlbnMgPSBuZXd0b2tlbnM7Cit9CisKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KWdldFRyZWVBZGFwdG9yCit7CisgICAgcmV0dXJuIGFkYXB0b3I7Cit9CisKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKK3sKKyAgICBhZGFwdG9yID0gYW5BZGFwdG9yOworfQorCistIChCT09MKWdldFVuaXF1ZU5hdmlnYXRpb25Ob2RlcworeworICAgIHJldHVybiB1bmlxdWVOYXZpZ2F0aW9uTm9kZXM7Cit9CisKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClhVmFsCit7CisgICAgdW5pcXVlTmF2aWdhdGlvbk5vZGVzID0gYVZhbDsKK30KKworLSh2b2lkKSBjb25zdW1lCit7CisJaWYgKGluZGV4ID09IC0xKSB7CisJCVtzZWxmIGZpbGxCdWZmZXJdOworCX0KKwlpbmRleCsrOworfQorCistKE5TSW50ZWdlcikgTEE6KE5TSW50ZWdlcikgaQoreworCXJldHVybiBbYWRhcHRvciBnZXRUeXBlOltzZWxmIExUOmldXTsKK30KKworLShOU0ludGVnZXIpIG1hcmsKK3sKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJW3NlbGYgZmlsbEJ1ZmZlcl07CisJfQorCWxhc3RNYXJrZXIgPSBzZWxmLmluZGV4OworCXJldHVybiBsYXN0TWFya2VyOworfQorCistKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyCit7CisJLy8gZG8gbm90aGluZworfQorCistKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKSBtYXJrZXIKK3sKKwlbc2VsZiBzZWVrOm1hcmtlcl07Cit9CisKKy0odm9pZCkgcmV3aW5kCit7CisJW3NlbGYgc2VlazpsYXN0TWFya2VyXTsKK30KKworLSh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGkKK3sKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJW3NlbGYgZmlsbEJ1ZmZlcl07CisJfQorCWluZGV4ID0gaTsKK30KKworLSh2b2lkKSBwdXNoOihOU0ludGVnZXIpIGkKK3sKKwlpZiAoY2FsbHMgPT0gbmlsKSB7CisJCWNhbGxzID0gW0FOVExSSW50QXJyYXkgbmV3QXJyYXlXaXRoTGVuOklOSVRJQUxfQ0FMTF9TVEFDS19TSVpFXTsKKwl9CisJW2NhbGxzIHB1c2g6aW5kZXhdOworCVtzZWxmIHNlZWs6aV07Cit9CisKKy0oTlNJbnRlZ2VyKSBwb3AKK3sKKwlOU0ludGVnZXIgcmV0ID0gW2NhbGxzIHBvcF07CisJW3NlbGYgc2VlazpyZXRdOworCXJldHVybiByZXQ7Cit9CisKKy0odm9pZCkgcmVzZXQKK3sKKwlpbmRleCA9IDA7CisJbGFzdE1hcmtlciA9IDA7CisJaWYgKGNhbGxzICE9IG5pbCkgeworCQlbY2FsbHMgcmVzZXRdOworCX0KK30KKworLShOU1VJbnRlZ2VyKSBjb3VudAoreworCWlmIChpbmRleCA9PSAtMSkgeworCQlbc2VsZiBmaWxsQnVmZmVyXTsKKwl9CisJcmV0dXJuIFtub2RlcyBjb3VudF07Cit9CisKKy0oTlNVSW50ZWdlcikgc2l6ZQoreworCXJldHVybiBbc2VsZiBjb3VudF07Cit9CisKKy0oTlNFbnVtZXJhdG9yICopIG9iamVjdEVudW1lcmF0b3IKK3sKKwlpZiAoZSA9PSBuaWwpIHsKKwkJZSA9IFtbQU5UTFJTdHJlYW1FbnVtZXJhdG9yIGFsbG9jXSBpbml0V2l0aE5vZGVzOm5vZGVzIGFuZEVPRjplb2ZdOworCX0KKwlyZXR1cm4gZTsKK30KKworLSh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KEFOVExSQ29tbW9uVHJlZSAqKSBwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0SWR4IFRvOihOU0ludGVnZXIpc3RvcElkeCBXaXRoOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworCWlmIChwYXJlbnQgIT0gbmlsKSB7CisJCVthZGFwdG9yIHJlcGxhY2VDaGlsZHJlbjpwYXJlbnQgRnJvbTpzdGFydElkeCBUbzpzdG9wSWR4IFdpdGg6YVRyZWVdOworCX0KK30KKworLShOU1N0cmluZyAqKSB0b1Rva2VuVHlwZVN0cmluZworeworCWlmIChpbmRleCA9PSAtMSkKKwl7CisJCVtzZWxmIGZpbGxCdWZmZXJdOworCX0KKwlOU011dGFibGVTdHJpbmcgKmJ1ZiA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjEwXTsKKwlmb3IgKE5TVUludGVnZXIgaT0gMDsgaSA8IFtub2RlcyBjb3VudF07IGkrKykgeworCQlBTlRMUkNvbW1vblRyZWUgKiBhVHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbc2VsZiBnZXROb2RlOmldOworCQlbYnVmIGFwcGVuZEZvcm1hdDpAIiAlZCIsIFthZGFwdG9yIGdldFR5cGU6YVRyZWVdXTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworLShOU1N0cmluZyAqKSB0b1Rva2VuU3RyaW5nOihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3AKK3sKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJW3NlbGYgZmlsbEJ1ZmZlcl07CisJfQorCU5TTXV0YWJsZVN0cmluZyAqYnVmID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoQ2FwYWNpdHk6MTBdOworCWZvciAoTlNVSW50ZWdlciBpID0gYVN0YXJ0OyBpIDwgW25vZGVzIGNvdW50XSAmJiBpIDw9IGFTdG9wOyBpKyspIHsKKwkJQU5UTFJDb21tb25UcmVlICogdCA9IChBTlRMUkNvbW1vblRyZWUgKilbc2VsZiBnZXROb2RlOmldOworCQlbYnVmIGFwcGVuZEZvcm1hdDpAIiAlZCIsIFthZGFwdG9yIGdldFR5cGU6dF1dOworCX0KKwlyZXR1cm4gYnVmOworfQorCistKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKWFTdGFydCBUb05vZGU6KGlkKWFTdG9wCit7CisJaWYgKGFTdGFydCA9PSBuaWwgfHwgYVN0b3AgPT0gbmlsKSB7CisJCXJldHVybiBuaWw7CisJfQorCWlmIChpbmRleCA9PSAtMSkgeworCQlbc2VsZiBmaWxsQnVmZmVyXTsKKwl9CisJCisJLy8gaWYgd2UgaGF2ZSBhIHRva2VuIHN0cmVhbSwgdXNlIHRoYXQgdG8gZHVtcCB0ZXh0IGluIG9yZGVyCisJaWYgKFtzZWxmIGdldFRva2VuU3RyZWFtXSAhPSBuaWwpIHsKKwkJTlNJbnRlZ2VyIGJlZ2luVG9rZW5JbmRleCA9IFthZGFwdG9yIGdldFRva2VuU3RhcnRJbmRleDphU3RhcnRdOworCQlOU0ludGVnZXIgZW5kVG9rZW5JbmRleCA9IFthZGFwdG9yIGdldFRva2VuU3RvcEluZGV4OmFTdG9wXTsKKwkJCisJCWlmIChbYWRhcHRvciBnZXRUeXBlOmFTdG9wXSA9PSBBTlRMUlRva2VuVHlwZVVQKSB7CisJCQllbmRUb2tlbkluZGV4ID0gW2FkYXB0b3IgZ2V0VG9rZW5TdG9wSW5kZXg6YVN0YXJ0XTsKKwkJfQorCQllbHNlIGlmIChbYWRhcHRvciBnZXRUeXBlOmFTdG9wXSA9PSBBTlRMUlRva2VuVHlwZUVPRikgeworCQkJZW5kVG9rZW5JbmRleCA9IFtzZWxmIGNvdW50XSAtIDI7IC8vZG9uJ3QgdXNlIEVPRgorCQl9CisgICAgICAgIFt0b2tlbnMgdG9TdHJpbmdGcm9tU3RhcnQ6YmVnaW5Ub2tlbkluZGV4IFRvRW5kOmVuZFRva2VuSW5kZXhdOworCX0KKwkvLyB3YWxrIG5vZGVzIGxvb2tpbmcgZm9yIGFTdGFydAorCUFOVExSQ29tbW9uVHJlZSAqIGFUcmVlID0gbmlsOworCU5TVUludGVnZXIgaSA9IDA7CisJZm9yICg7IGkgPCBbbm9kZXMgY291bnRdOyBpKyspIHsKKwkJYVRyZWUgPSBbbm9kZXMgb2JqZWN0QXRJbmRleDppXTsKKwkJaWYgKGFUcmVlID09IGFTdGFydCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJTlNNdXRhYmxlU3RyaW5nICpidWYgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhDYXBhY2l0eToxMF07CisJYVRyZWUgPSBbbm9kZXMgb2JqZWN0QXRJbmRleDppXTsgLy8gd2h5PworCXdoaWxlIChhVHJlZSAhPSBhU3RvcCkgeworCQlOU1N0cmluZyAqdGV4dCA9IFthZGFwdG9yIGdldFRleHQ6YVRyZWVdOworCQlpZiAodGV4dCA9PSBuaWwpIHsKKwkJCXRleHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiAlZCIsIFthZGFwdG9yIGdldFR5cGU6YVRyZWVdXTsKKwkJfQorCQlbYnVmIGFwcGVuZFN0cmluZzp0ZXh0XTsKKwkJaSsrOworCQlhVHJlZSA9IFtub2RlcyBvYmplY3RBdEluZGV4OmldOworCX0KKwlOU1N0cmluZyAqdGV4dCA9IFthZGFwdG9yIGdldFRleHQ6YVN0b3BdOworCWlmICh0ZXh0ID09IG5pbCkgeworCQl0ZXh0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIgJWQiLCBbYWRhcHRvciBnZXRUeXBlOmFTdG9wXV07CisJfQorCVtidWYgYXBwZW5kU3RyaW5nOnRleHRdOworCXJldHVybiBidWY7Cit9CisKKy8vIGdldHRlcnMgYW5kIHNldHRlcnMKKy0gKEFNdXRhYmxlQXJyYXkgKikgZ2V0Tm9kZXMKK3sKKyAgICByZXR1cm4gbm9kZXM7Cit9CisKKy0gKGlkKSBlb2YKK3sKKyAgICByZXR1cm4gZW9mOworfQorCistICh2b2lkKSBzZXRFb2Y6KGlkKXRoZUVPRgoreworICAgIGVvZiA9IHRoZUVPRjsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDaGFyU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNoYXJTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2JlOTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDaGFyU3RyZWFtLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKKyNkZWZpbmUJQU5UTFJDaGFyU3RyZWFtRU9GIC0xCisKKworQHByb3RvY29sIEFOVExSQ2hhclN0cmVhbSA8IEFOVExSSW50U3RyZWFtID4KKworLSAoTlNTdHJpbmcgKikgc3Vic3RyaW5nV2l0aFJhbmdlOihOU1JhbmdlKSB0aGVSYW5nZTsKKworLyoqIEdldCB0aGUgaXRoIGNoYXJhY3RlciBvZiBsb29rYWhlYWQuICBUaGlzIGlzIHRoZSBzYW1lIHVzdWFsbHkgYXMKKyAqICBMQShpKS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBsYWJlbHMgaW4gdGhlIGdlbmVyYXRlZAorICogIGxleGVyIGNvZGUuICBJJ2QgcHJlZmVyIHRvIHJldHVybiBhIGNoYXIgaGVyZSB0eXBlLXdpc2UsIGJ1dCBpdCdzCisgKiAgcHJvYmFibHkgYmV0dGVyIHRvIGJlIDMyLWJpdCBjbGVhbiBhbmQgYmUgY29uc2lzdGVudCB3aXRoIExBLgorICovCistIChOU0ludGVnZXIpTFQ6KE5TSW50ZWdlcikgaTsKKworLy8gQU5UTFIgdHJhY2tzIHRoZSBsaW5lIGluZm9ybWF0aW9uIGF1dG9tYXRpY2FsbHkKKworLy8gQmVjYXVzZSB0aGlzIHN0cmVhbSBjYW4gcmV3aW5kLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVzZXQgdGhlIGxpbmUKKworLy8gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAwLi5uLTEKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ2hhclN0cmVhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmODcyZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ2hhclN0cmVhbVN0YXRlLmgKQEAgLTAsMCArMSw0OSBAQAorLy8KKy8vICBBTlRMUkNoYXJTdHJlYW1TdGF0ZS5oCisvLyAgQU5UTFIKKy8vCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpICAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKKworQGludGVyZmFjZSBBTlRMUkNoYXJTdHJlYW1TdGF0ZSA6IE5TT2JqZWN0Cit7CitOU0ludGVnZXIgaW5kZXg7CitOU1VJbnRlZ2VyIGxpbmU7CitOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKK30KKworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBpbmRleDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGxpbmU7CitAcHJvcGVydHkgKGFzc2lnbikgTlNVSW50ZWdlciBjaGFyUG9zaXRpb25JbkxpbmU7CisKKysgbmV3QU5UTFJDaGFyU3RyZWFtU3RhdGU7CisKKy0gKGlkKSBpbml0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDaGFyU3RyZWFtU3RhdGUubQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMmE3ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDaGFyU3RyZWFtU3RhdGUubQpAQCAtMCwwICsxLDUyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW1TdGF0ZS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkNoYXJTdHJlYW1TdGF0ZQorCitAc3ludGhlc2l6ZSBpbmRleDsKK0BzeW50aGVzaXplIGxpbmU7CitAc3ludGhlc2l6ZSBjaGFyUG9zaXRpb25JbkxpbmU7CisKKysgbmV3QU5UTFJDaGFyU3RyZWFtU3RhdGUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkNoYXJTdHJlYW1TdGF0ZSBhbGxvY10gaW5pdF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBsaW5lID0gMTsKKyAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uRXJyb3JOb2RlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vbkVycm9yTm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWFmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vbkVycm9yTm9kZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vCisvLyAgQU5UTFJDb21tb25FcnJvck5vZGUuaAorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJJbnRTdHJlYW0uaCIKKy8vI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJVbldhbnRlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25FcnJvck5vZGUgOiBBTlRMUkNvbW1vblRyZWUKK3sKK2lkPEFOVExSSW50U3RyZWFtPiBpbnB1dDsKK2lkPEFOVExSVG9rZW4+IHN0YXJ0VG9rZW47CitpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47CitBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICp0cmFwcGVkRXhjZXB0aW9uOworfQorCisrIChpZCkgbmV3QU5UTFJDb21tb25FcnJvck5vZGU6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgIEZyb206KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGU7CisKKy0gKGlkKSBpbml0V2l0aElucHV0OihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgorICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKikgZTsKKworLSAodm9pZClkZWFsbG9jOworLSAoQk9PTCkgaXNOaWw7CisKKy0gKE5TSW50ZWdlcil0eXBlOworLSAoTlNTdHJpbmcgKil0ZXh0OworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworQHByb3BlcnR5IChyZXRhaW4pIGlkPEFOVExSSW50U3RyZWFtPiBpbnB1dDsKK0Bwcm9wZXJ0eSAocmV0YWluKSBpZDxBTlRMUlRva2VuPiBzdGFydFRva2VuOworQHByb3BlcnR5IChyZXRhaW4pIGlkPEFOVExSVG9rZW4+IHN0b3BUb2tlbjsKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICp0cmFwcGVkRXhjZXB0aW9uOworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25FcnJvck5vZGUubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uRXJyb3JOb2RlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmZWMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uRXJyb3JOb2RlLm0KQEAgLTAsMCArMSwxNTkgQEAKKy8vCisvLyAgQU5UTFJDb21tb25FcnJvck5vZGUubQorLy8gIEFOVExSCisvLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSQ29tbW9uRXJyb3JOb2RlLmgiCisjaW1wb3J0ICJBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkNvbW1vbkVycm9yTm9kZQorCisrIChpZCkgbmV3QU5UTFJDb21tb25FcnJvck5vZGU6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbTooaWQ8QU5UTFJUb2tlbj4pYVN0YXJ0VG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pYVN0b3BUb2tlbgorICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkNvbW1vbkVycm9yTm9kZSBhbGxvY10gaW5pdFdpdGhJbnB1dDphbklucHV0IEZyb206YVN0YXJ0VG9rZW4gVG86YVN0b3BUb2tlbiBFeGNlcHRpb246ZV07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoSW5wdXQ6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICBGcm9tOihpZDxBTlRMUlRva2VuPilhU3RhcnRUb2tlbgorICAgICAgICAgICAgICAgICAgVG86KGlkPEFOVExSVG9rZW4+KWFTdG9wVG9rZW4KKyAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGUKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhU3RhcnRUb2tlbjogIithU3RhcnRUb2tlbisiLCBhU3RvcFRva2VuOiAiK2FTdG9wVG9rZW4pOworICAgICAgICBpZiAoIGFTdG9wVG9rZW4gPT0gbmlsIHx8CisgICAgICAgICAgICAoW2FTdG9wVG9rZW4gZ2V0VG9rZW5JbmRleF0gPCBbYVN0YXJ0VG9rZW4gZ2V0VG9rZW5JbmRleF0gJiYKKyAgICAgICAgICAgICBhU3RvcFRva2VuLnR5cGUgIT0gQU5UTFJUb2tlblR5cGVFT0YpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc29tZXRpbWVzIHJlc3luYyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gKHdoZW4gTFQoMSkgaXMKKyAgICAgICAgICAgIC8vIGluIGZvbGxvdyBzZXQuICBTbywgYVN0b3BUb2tlbiB3aWxsIGJlIDEgdG8gbGVmdCB0byBhU3RhcnRUb2tlbi4gYWRqdXN0LgorICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgY2FzZSB3aGVyZSBhU3RhcnRUb2tlbiBpcyB0aGUgZmlyc3QgdG9rZW4gYW5kIG5vIHRva2VuCisgICAgICAgICAgICAvLyBpcyBjb25zdW1lZCBkdXJpbmcgcmVjb3Zlcnk7IExUKC0xKSB3aWxsIHJldHVybiBudWxsLgorICAgICAgICAgICAgYVN0b3BUb2tlbiA9IGFTdGFydFRva2VuOworICAgICAgICB9CisgICAgICAgIGlucHV0ID0gYW5JbnB1dDsKKyAgICAgICAgaWYgKCBpbnB1dCApIFtpbnB1dCByZXRhaW5dOworICAgICAgICBzdGFydFRva2VuID0gYVN0YXJ0VG9rZW47CisgICAgICAgIGlmICggc3RhcnRUb2tlbiApIFtzdGFydFRva2VuIHJldGFpbl07CisgICAgICAgIHN0b3BUb2tlbiA9IGFTdG9wVG9rZW47CisgICAgICAgIGlmICggc3RvcFRva2VuICkgW3N0b3BUb2tlbiByZXRhaW5dOworICAgICAgICB0cmFwcGVkRXhjZXB0aW9uID0gZTsKKyAgICAgICAgaWYgKCB0cmFwcGVkRXhjZXB0aW9uICkgW3RyYXBwZWRFeGNlcHRpb24gcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUkNvbW1vbkVycm9yTm9kZSIgKTsKKyNlbmRpZgorICAgIGlmICggaW5wdXQgKSBbaW5wdXQgcmVsZWFzZV07CisgICAgaWYgKCBzdGFydFRva2VuICkgW3N0YXJ0VG9rZW4gcmVsZWFzZV07CisgICAgaWYgKCBzdG9wVG9rZW4gKSBbc3RvcFRva2VuIHJlbGVhc2VdOworICAgIGlmICggdHJhcHBlZEV4Y2VwdGlvbiApIFt0cmFwcGVkRXhjZXB0aW9uIHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoQk9PTCkgaXNOaWwKK3sKKyAgICByZXR1cm4gTk87Cit9CisKKy0gKE5TSW50ZWdlcil0eXBlCit7CisgICAgcmV0dXJuIEFOVExSVG9rZW5UeXBlSW52YWxpZDsKK30KKworLSAoTlNTdHJpbmcgKil0ZXh0Cit7CisgICAgTlNTdHJpbmcgKmJhZFRleHQgPSBuaWw7CisgICAgaWYgKCBbc3RhcnRUb2tlbiBpc0tpbmRPZkNsYXNzOltzZWxmIGNsYXNzXV0gKSB7CisgICAgICAgIGludCBpID0gWyhpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIGdldFRva2VuSW5kZXhdOworICAgICAgICBpbnQgaiA9IFsoaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuIGdldFRva2VuSW5kZXhdOworICAgICAgICBpZiAoIHN0b3BUb2tlbi50eXBlID09IEFOVExSVG9rZW5UeXBlRU9GICkgeworICAgICAgICAgICAgaiA9IFsoaWQ8QU5UTFJUb2tlblN0cmVhbT4paW5wdXQgc2l6ZV07CisgICAgICAgIH0KKyAgICAgICAgYmFkVGV4dCA9IFsoaWQ8QU5UTFJUb2tlblN0cmVhbT4paW5wdXQgdG9TdHJpbmdGcm9tU3RhcnQ6aSBUb0VuZDpqXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtzdGFydFRva2VuIGlzS2luZE9mQ2xhc3M6W3NlbGYgY2xhc3NdXSApIHsKKyAgICAgICAgYmFkVGV4dCA9IFsoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4paW5wdXQgdG9TdHJpbmdGcm9tTm9kZTpzdGFydFRva2VuIFRvTm9kZTpzdG9wVG9rZW5dOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gcGVvcGxlIHNob3VsZCBzdWJjbGFzcyBpZiB0aGV5IGFsdGVyIHRoZSB0cmVlIHR5cGUgc28gdGhpcworICAgICAgICAvLyBuZXh0IG9uZSBpcyBmb3Igc3VyZSBjb3JyZWN0LgorICAgICAgICBiYWRUZXh0ID0gQCI8dW5rbm93bj4iOworICAgIH0KKyAgICByZXR1cm4gYmFkVGV4dDsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIE5TU3RyaW5nICphU3RyaW5nOworICAgIGlmICggW3RyYXBwZWRFeGNlcHRpb24gaXNLaW5kT2ZDbGFzczpbQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24gY2xhc3NdXSApIHsKKyAgICAgICAgYVN0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPG1pc3NpbmcgdHlwZTogJUAgPiIsCisgICAgICAgIFsoQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24gKil0cmFwcGVkRXhjZXB0aW9uIGdldE1pc3NpbmdUeXBlXV07CisgICAgICAgIHJldHVybiBhU3RyaW5nOworICAgIH0KKyAgICBlbHNlIGlmICggW3RyYXBwZWRFeGNlcHRpb24gaXNLaW5kT2ZDbGFzczpbQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIGNsYXNzXV0gKSB7CisgICAgICAgIGFTdHJpbmcgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjxleHRyYW5lb3VzOiAlQCwgcmVzeW5jPSVAPiIsCisgICAgICAgIFt0cmFwcGVkRXhjZXB0aW9uIGdldFVuZXhwZWN0ZWRUb2tlbl0sCisgICAgICAgIFtzZWxmIHRleHRdXTsKKyAgICAgICAgcmV0dXJuIGFTdHJpbmc7CisgICAgfQorICAgIGVsc2UgaWYgKCBbdHJhcHBlZEV4Y2VwdGlvbiBpc0tpbmRPZkNsYXNzOltBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBhU3RyaW5nID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8bWlzbWF0Y2hlZCB0b2tlbjogJUAsIHJlc3luYz0lQD4iLCB0cmFwcGVkRXhjZXB0aW9uLnRva2VuLCBbc2VsZiB0ZXh0XV07CisgICAgICAgIHJldHVybiBhU3RyaW5nOworICAgIH0KKyAgICBlbHNlIGlmICggW3RyYXBwZWRFeGNlcHRpb24gaXNLaW5kT2ZDbGFzczpbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBhU3RyaW5nID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8dW5leHBlY3RlZDogICVALCByZXN5bmM9JUA+IiwgdHJhcHBlZEV4Y2VwdGlvbi50b2tlbiwgW3NlbGYgdGV4dF1dOworICAgICAgICByZXR1cm4gYVN0cmluZzsKKyAgICB9CisgICAgYVN0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPGVycm9yOiAlQD4iLFtzZWxmIHRleHRdXTsKKyAgICByZXR1cm4gYVN0cmluZzsKK30KKworQHN5bnRoZXNpemUgaW5wdXQ7CitAc3ludGhlc2l6ZSBzdGFydFRva2VuOworQHN5bnRoZXNpemUgc3RvcFRva2VuOworQHN5bnRoZXNpemUgdHJhcHBlZEV4Y2VwdGlvbjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW4uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhlMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlbi5oCkBAIC0wLDAgKzEsMTI5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25Ub2tlbiA6IE5TT2JqZWN0IDwgQU5UTFJUb2tlbiA+IHsKKwlfX3N0cm9uZyBOU1N0cmluZyAqdGV4dDsKKwlOU0ludGVnZXIgdHlwZTsKKwkvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVG9rZW4ncyBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtCisJTlNVSW50ZWdlciBsaW5lOworCU5TVUludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworCU5TVUludGVnZXIgY2hhbm5lbDsKKwkvLyB0aGlzIHRva2VuJ3MgcG9zaXRpb24gaW4gdGhlIFRva2VuU3RyZWFtCisJTlNJbnRlZ2VyIGluZGV4OworCQorCS8vIGluZGljZXMgaW50byB0aGUgQ2hhclN0cmVhbSB0byBhdm9pZCBjb3B5aW5nIHRoZSB0ZXh0CisJLy8gY2FuIG1hbnVhbGx5IG92ZXJyaWRlIHRoZSB0ZXh0IGJ5IHVzaW5nIC1zZXRUZXh0OgorCU5TSW50ZWdlciBzdGFydEluZGV4OworCU5TSW50ZWdlciBzdG9wSW5kZXg7CisJLy8gdGhlIGFjdHVhbCBpbnB1dCBzdHJlYW0gdGhpcyB0b2tlbiB3YXMgZm91bmQgaW4KKwlfX3N0cm9uZyBpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OworfQorCisrICh2b2lkKSBpbml0aWFsaXplOworKyAoTlNJbnRlZ2VyKSBERUZBVUxUX0NIQU5ORUw7CisrIChpZDxBTlRMUlRva2VuPilJTlZBTElEX1RPS0VOOworKyAoTlNJbnRlZ2VyKSBJTlZBTElEX1RPS0VOX1RZUEU7CisrIChpZDxBTlRMUlRva2VuPikgbmV3VG9rZW47CisrIChpZDxBTlRMUlRva2VuPikgbmV3VG9rZW46KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICBUeXBlOihOU0ludGVnZXIpYVRUeXBlCisgICAgICAgICAgICAgICAgICAgIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgIFN0b3A6KE5TSW50ZWdlcilhU3RvcDsKKysgKGlkPEFOVExSVG9rZW4+KSBuZXdUb2tlbjooQU5UTFJUb2tlblR5cGUpYVR5cGU7CisrIChpZDxBTlRMUlRva2VuPikgbmV3VG9rZW46KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQ7CisrIChpZDxBTlRMUlRva2VuPikgbmV3VG9rZW5XaXRoVG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKilmcm9tVG9rZW47CisrIChpZDxBTlRMUlRva2VuPikgZW9mVG9rZW47CisrIChpZDxBTlRMUlRva2VuPikgc2tpcFRva2VuOworKyAoaWQ8QU5UTFJUb2tlbj4pIGludmFsaWRUb2tlbjsKKysgKEFOVExSVG9rZW5DaGFubmVsKSBkZWZhdWx0Q2hhbm5lbDsKKworLy8gZGVzaWduYXRlZCBpbml0aWFsaXplci4gVGhpcyBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHdheSB0byBpbml0aWFsaXplIGEgVG9rZW4gaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgorLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcilhVFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbDooTlNJbnRlZ2VyKWFDaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQ6KE5TSW50ZWdlcil0aGVTdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOihOU0ludGVnZXIpdGhlU3RvcDsKKy0gKGlkKSBpbml0V2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilhVG9rZW47CistIChpZCkgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVHlwZTsKKy0gKGlkKSBpbml0V2l0aFR5cGU6KEFOVExSVG9rZW5UeXBlKWFUVHlwZSBUZXh0OihOU1N0cmluZyAqKXRva2VuVGV4dDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLy8gIHRleHQgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChOU1N0cmluZyAqKXRleHQ7CistICh2b2lkKSBzZXRUZXh0OihOU1N0cmluZyAqKWFUZXh0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgdHlwZSAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TSW50ZWdlcil0eXBlOworLSAodm9pZCkgc2V0VHlwZTooTlNJbnRlZ2VyKWFUeXBlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgY2hhbm5lbCAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TVUludGVnZXIpY2hhbm5lbDsKKy0gKHZvaWQpIHNldENoYW5uZWw6KE5TVUludGVnZXIpYUNoYW5uZWw7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBpbnB1dCAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKGlkPEFOVExSQ2hhclN0cmVhbT4paW5wdXQ7CistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0OworCistIChOU0ludGVnZXIpZ2V0U3RhcnQ7CistICh2b2lkKSBzZXRTdGFydDogKE5TSW50ZWdlcilhU3RhcnQ7CisKKy0gKE5TSW50ZWdlcilnZXRTdG9wOworLSAodm9pZCkgc2V0U3RvcDogKE5TSW50ZWdlcikgYVN0b3A7CisKKy8vIHRoZSBpbmRleCBvZiB0aGlzIFRva2VuIGludG8gdGhlIFRva2VuU3RyZWFtCistIChOU0ludGVnZXIpZ2V0VG9rZW5JbmRleDsKKy0gKHZvaWQpIHNldFRva2VuSW5kZXg6KE5TSW50ZWdlcilhVG9rZW5JbmRleDsKKworLy8gY29uZm9ybSB0byBOU0NvcHlpbmcKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXIgPSB0ZXh0LCBzZXR0ZXIgPSBzZXRUZXh0OikgTlNTdHJpbmcgKnRleHQ7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIHR5cGU7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyID0gbGluZSwgc2V0dGVyID0gc2V0TGluZTopIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Y2hhclBvc2l0aW9uSW5MaW5lLCBzZXR0ZXIgPSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGNoYW5uZWw7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRTdGFydCwgc2V0dGVyPXNldFN0YXJ0OikgTlNJbnRlZ2VyIHN0YXJ0SW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFN0b3AsIHNldHRlcj1zZXRTdG9wOikgTlNJbnRlZ2VyIHN0b3BJbmRleDsKK0Bwcm9wZXJ0eSAocmV0YWluKSBpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRva2VuLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRva2VuLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwZTAxOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW4ubQpAQCAtMCwwICsxLDM5NyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorCitzdGF0aWMgQU5UTFJDb21tb25Ub2tlbiAqU0tJUF9UT0tFTjsKK3N0YXRpYyBBTlRMUkNvbW1vblRva2VuICpFT0ZfVE9LRU47CitzdGF0aWMgQU5UTFJDb21tb25Ub2tlbiAqSU5WQUxJRF9UT0tFTjsKKworQGltcGxlbWVudGF0aW9uIEFOVExSQ29tbW9uVG9rZW4KKworICAgIHN0YXRpYyBOU0ludGVnZXIgREVGQVVMVF9DSEFOTkVMID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgIHN0YXRpYyBOU0ludGVnZXIgSU5WQUxJRF9UT0tFTl9UWVBFID0gQU5UTFJUb2tlblR5cGVJbnZhbGlkOworCisKK0BzeW50aGVzaXplIHRleHQ7CitAc3ludGhlc2l6ZSB0eXBlOworQHN5bnRoZXNpemUgbGluZTsKK0BzeW50aGVzaXplIGNoYXJQb3NpdGlvbkluTGluZTsKK0BzeW50aGVzaXplIGNoYW5uZWw7CitAc3ludGhlc2l6ZSBpbmRleDsKK0BzeW50aGVzaXplIHN0YXJ0SW5kZXg7CitAc3ludGhlc2l6ZSBzdG9wSW5kZXg7CitAc3ludGhlc2l6ZSBpbnB1dDsKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIEVPRl9UT0tFTiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXTsKKyAgICBTS0lQX1RPS0VOID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46QU5UTFJUb2tlblR5cGVJbnZhbGlkIFRleHQ6QCJTa2lwIl07CisgICAgSU5WQUxJRF9UT0tFTiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOkFOVExSVG9rZW5UeXBlSW52YWxpZCBUZXh0OkAiSW52YWxpZCJdOworICAgIFtFT0ZfVE9LRU4gcmV0YWluXTsKKyAgICBbU0tJUF9UT0tFTiByZXRhaW5dOworICAgIFtJTlZBTElEX1RPS0VOIHJldGFpbl07Cit9CisKKysgKEFOVExSQ29tbW9uVG9rZW4gKilJTlZBTElEX1RPS0VOCit7CisgICAgcmV0dXJuIElOVkFMSURfVE9LRU47Cit9CisKKysgKE5TSW50ZWdlcikgREVGQVVMVF9DSEFOTkVMCit7CisgICAgcmV0dXJuIERFRkFVTFRfQ0hBTk5FTDsKK30KKworKyAoTlNJbnRlZ2VyKSBJTlZBTElEX1RPS0VOX1RZUEUKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9UT0tFTl9UWVBFOworfQorCisrIChBTlRMUkNvbW1vblRva2VuICopIG5ld1Rva2VuCit7CisgICAgcmV0dXJuIFtbQU5UTFJDb21tb25Ub2tlbiBhbGxvY10gaW5pdF07Cit9CisKKysgKEFOVExSQ29tbW9uVG9rZW4gKikgbmV3VG9rZW46KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dCBUeXBlOihOU0ludGVnZXIpYVRUeXBlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbCBTdGFydDooTlNJbnRlZ2VyKWFTdGFydCBTdG9wOihOU0ludGVnZXIpYVN0b3AKK3sKKyAgICByZXR1cm4gW1tBTlRMUkNvbW1vblRva2VuIGFsbG9jXSBpbml0V2l0aElucHV0OihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQgVHlwZTooTlNJbnRlZ2VyKWFUVHlwZSBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWwgU3RhcnQ6KE5TSW50ZWdlcilhU3RhcnQgU3RvcDooTlNJbnRlZ2VyKWFTdG9wXTsKK30KKworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdUb2tlbjooQU5UTFJUb2tlblR5cGUpdG9rZW5UeXBlCit7CisgICAgcmV0dXJuKCBbW0FOVExSQ29tbW9uVG9rZW4gYWxsb2NdIGluaXRXaXRoVHlwZTp0b2tlblR5cGVdICk7Cit9CisKKysgKEFOVExSQ29tbW9uVG9rZW4gKikgbmV3VG9rZW46KE5TSW50ZWdlcil0b2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQKK3sKKyAgICByZXR1cm4oIFtbQU5UTFJDb21tb25Ub2tlbiBhbGxvY10gaW5pdFdpdGhUeXBlOnRva2VuVHlwZSBUZXh0OnRva2VuVGV4dF0gKTsKK30KKworKyAoQU5UTFJDb21tb25Ub2tlbiAqKSBuZXdUb2tlbldpdGhUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWZyb21Ub2tlbgoreworICAgIHJldHVybiggW1tBTlRMUkNvbW1vblRva2VuIGFsbG9jXSBpbml0V2l0aFRva2VuOmZyb21Ub2tlbl0gKTsKK30KKworLy8gcmV0dXJuIHRoZSBzaW5nbGV0b24gRU9GIFRva2VuIAorKyAoaWQ8QU5UTFJUb2tlbj4pIGVvZlRva2VuCit7CisgICAgaWYgKEVPRl9UT0tFTiA9PSBuaWwpIHsKKyAgICAgICAgRU9GX1RPS0VOID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXSByZXRhaW5dOworICAgIH0KKyAgICByZXR1cm4gRU9GX1RPS0VOOworfQorCisvLyByZXR1cm4gdGhlIHNpbmdsZXRvbiBza2lwIFRva2VuIAorKyAoaWQ8QU5UTFJUb2tlbj4pIHNraXBUb2tlbgoreworICAgIGlmIChTS0lQX1RPS0VOID09IG5pbCkgeworICAgICAgICBTS0lQX1RPS0VOID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOkFOVExSVG9rZW5UeXBlSW52YWxpZCBUZXh0OkAiU2tpcCJdIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBTS0lQX1RPS0VOOworfQorCisvLyByZXR1cm4gdGhlIHNpbmdsZXRvbiBza2lwIFRva2VuIAorKyAoaWQ8QU5UTFJUb2tlbj4pIGludmFsaWRUb2tlbgoreworICAgIGlmIChJTlZBTElEX1RPS0VOID09IG5pbCkgeworICAgICAgICBJTlZBTElEX1RPS0VOID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOkFOVExSVG9rZW5UeXBlSW52YWxpZCBUZXh0OkAiSW52YWxpZCJdIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBTS0lQX1RPS0VOOworfQorCisvLyB0aGUgZGVmYXVsdCBjaGFubmVsIGZvciB0aGlzIGNsYXNzIG9mIFRva2VucworKyAoQU5UTFJUb2tlbkNoYW5uZWwpIGRlZmF1bHRDaGFubmVsCit7CisgICAgcmV0dXJuIEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBpbnB1dCA9IG5pbDsKKyAgICAgICAgdHlwZSA9IEFOVExSVG9rZW5UeXBlSW52YWxpZDsKKyAgICAgICAgY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgc3RhcnRJbmRleCA9IDA7CisgICAgICAgIHN0b3BJbmRleCA9IDA7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCisvLyBkZXNpZ25hdGVkIGluaXRpYWxpemVyCistIChpZCkgaW5pdFdpdGhJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOihOU0ludGVnZXIpYVRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3A6KE5TSW50ZWdlcilhU3RvcAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGlucHV0ID0gYW5JbnB1dDsKKyAgICAgICAgaWYgKCBpbnB1dCApIFtpbnB1dCByZXRhaW5dOworICAgICAgICB0eXBlID0gYVRUeXBlOworICAgICAgICBjaGFubmVsID0gYUNoYW5uZWw7CisgICAgICAgIHN0YXJ0SW5kZXggPSBhU3RhcnQ7CisgICAgICAgIHN0b3BJbmRleCA9IGFTdG9wOworICAgICAgICBpZiAodHlwZSA9PSBBTlRMUlRva2VuVHlwZUVPRikKKyAgICAgICAgICAgIHRleHQgPSBAIkVPRiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRleHQgPSBbaW5wdXQgc3Vic3RyaW5nV2l0aFJhbmdlOk5TTWFrZVJhbmdlKHN0YXJ0SW5kZXgsIChzdG9wSW5kZXgtc3RhcnRJbmRleCkrMSldOworICAgICAgICBpZiAoIHRleHQgKSBbdGV4dCByZXRhaW5dOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKilvbGRUb2tlbgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIHRleHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzpvbGRUb2tlbi50ZXh0XTsKKyAgICAgICAgaWYgKCB0ZXh0ICkgW3RleHQgcmV0YWluXTsKKyAgICAgICAgdHlwZSA9IG9sZFRva2VuLnR5cGU7CisgICAgICAgIGxpbmUgPSBvbGRUb2tlbi5saW5lOworICAgICAgICBpbmRleCA9IG9sZFRva2VuLmluZGV4OworICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSBvbGRUb2tlbi5jaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIGNoYW5uZWwgPSBvbGRUb2tlbi5jaGFubmVsOworICAgICAgICBpbnB1dCA9IG9sZFRva2VuLmlucHV0OworICAgICAgICBpZiAoIGlucHV0ICkgW2lucHV0IHJldGFpbl07CisgICAgICAgIGlmICggW29sZFRva2VuIGlzS2luZE9mQ2xhc3M6W0FOVExSQ29tbW9uVG9rZW4gY2xhc3NdXSApIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBvbGRUb2tlbi5zdGFydEluZGV4OworICAgICAgICAgICAgc3RvcEluZGV4ID0gb2xkVG9rZW4uc3RvcEluZGV4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVFR5cGUKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBzZWxmLnR5cGUgPSBhVFR5cGU7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUeXBlOihBTlRMUlRva2VuVHlwZSlhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBzZWxmLnR5cGUgPSBhVFR5cGU7CisgICAgICAgIHNlbGYudGV4dCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoU3RyaW5nOnRva2VuVGV4dF07CisgICAgICAgIGlmICggdGV4dCApIFt0ZXh0IHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJDb21tb25Ub2tlbiIgKTsKKyNlbmRpZgorICAgIGlmICggaW5wdXQgKSBbaW5wdXQgcmVsZWFzZV07CisgICAgaWYgKCB0ZXh0ICkgW3RleHQgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvLyBjcmVhdGUgYSBjb3B5LCBpbmNsdWRpbmcgdGhlIHRleHQgaWYgYXZhaWxhYmxlCisvLyB0aGUgaW5wdXQgc3RyZWFtIGlzICpub3QqIGNvcGllZCEKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmUKK3sKKyAgICBBTlRMUkNvbW1vblRva2VuICpjb3B5ID0gW1tbc2VsZiBjbGFzc10gYWxsb2NXaXRoWm9uZTp0aGVab25lXSBpbml0XTsKKyAgICAKKyAgICBpZiAodGV4dCkKKyAgICAgICAgY29weS50ZXh0ID0gW3RleHQgY29weVdpdGhab25lOm5pbF07CisgICAgY29weS50eXBlID0gdHlwZTsKKyAgICBjb3B5LmxpbmUgPSBsaW5lOworICAgIGNvcHkuY2hhclBvc2l0aW9uSW5MaW5lID0gY2hhclBvc2l0aW9uSW5MaW5lOworICAgIGNvcHkuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgY29weS5pbmRleCA9IGluZGV4OworICAgIGNvcHkuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7CisgICAgY29weS5zdG9wSW5kZXggPSBzdG9wSW5kZXg7CisgICAgY29weS5pbnB1dCA9IGlucHV0OworICAgIHJldHVybiBjb3B5OworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBjaGFyUG9zaXRpb25JbkxpbmUgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChOU1VJbnRlZ2VyKSBjaGFyUG9zaXRpb25JbkxpbmUKK3sKKyAgICByZXR1cm4gY2hhclBvc2l0aW9uSW5MaW5lOworfQorCistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpYUNoYXJQb3NpdGlvbkluTGluZQoreworICAgIGNoYXJQb3NpdGlvbkluTGluZSA9IGFDaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBsaW5lIAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLSAoTlNVSW50ZWdlcikgbGluZQoreworICAgIHJldHVybiBsaW5lOworfQorCistICh2b2lkKSBzZXRMaW5lOihOU1VJbnRlZ2VyKWFMaW5lCit7CisgICAgbGluZSA9IGFMaW5lOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgdGV4dCAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TU3RyaW5nICopIHRleHQKK3sKKyAgICBpZiAodGV4dCAhPSBuaWwpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorICAgIGlmIChpbnB1dCA9PSBuaWwpIHsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisgICAgcmV0dXJuIFtpbnB1dCBzdWJzdHJpbmdXaXRoUmFuZ2U6TlNNYWtlUmFuZ2Uoc3RhcnRJbmRleCwgKHN0b3BJbmRleC1zdGFydEluZGV4KSsxKV07Cit9CisKKy0gKHZvaWQpIHNldFRleHQ6KE5TU3RyaW5nICopYVRleHQKK3sKKyAgICBpZiAodGV4dCAhPSBhVGV4dCkgeworICAgICAgICBpZiAoIHRleHQgKSBbdGV4dCByZWxlYXNlXTsKKyAgICAgICAgdGV4dCA9IGFUZXh0OworICAgICAgICBbdGV4dCByZXRhaW5dOworICAgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgdHlwZSAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TSW50ZWdlcil0eXBlCit7CisgICAgcmV0dXJuIHR5cGU7Cit9CisKKy0gKHZvaWQpIHNldFR5cGU6KE5TSW50ZWdlcilhVHlwZQoreworICAgIHR5cGUgPSBhVHlwZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLy8gIGNoYW5uZWwgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChOU1VJbnRlZ2VyKWNoYW5uZWwKK3sKKyAgICByZXR1cm4gY2hhbm5lbDsKK30KKworLSAodm9pZCkgc2V0Q2hhbm5lbDooTlNVSW50ZWdlcilhQ2hhbm5lbAoreworICAgIGNoYW5uZWwgPSBhQ2hhbm5lbDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgaW5wdXQgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChpZDxBTlRMUkNoYXJTdHJlYW0+KSBpbnB1dAoreworICAgIHJldHVybiBpbnB1dDsgCit9CisKKy0gKHZvaWQpIHNldElucHV0OiAoaWQ8QU5UTFJDaGFyU3RyZWFtPikgYW5JbnB1dAoreworICAgIGlmIChpbnB1dCAhPSBhbklucHV0KSB7CisgICAgICAgIGlmICggaW5wdXQgKSBbaW5wdXQgcmVsZWFzZV07CisgICAgICAgIFthbklucHV0IHJldGFpbl07CisgICAgfQorICAgIGlucHV0ID0gYW5JbnB1dDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgc3RhcnQgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChOU0ludGVnZXIpIGdldFN0YXJ0Cit7CisgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Cit9CisKKy0gKHZvaWQpIHNldFN0YXJ0OiAoTlNJbnRlZ2VyKSBhU3RhcnQKK3sKKyAgICBzdGFydEluZGV4ID0gYVN0YXJ0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgc3RvcCAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TSW50ZWdlcikgZ2V0U3RvcAoreworICAgIHJldHVybiBzdG9wSW5kZXg7Cit9CisKKy0gKHZvaWQpIHNldFN0b3A6IChOU0ludGVnZXIpIGFTdG9wCit7CisgICAgc3RvcEluZGV4ID0gYVN0b3A7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBpbmRleCAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5JbmRleDsKK3sKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuSW5kZXg6IChOU0ludGVnZXIpIGFUb2tlbkluZGV4OworeworICAgIGluZGV4ID0gYVRva2VuSW5kZXg7Cit9CisKKworLy8gcHJvdmlkZSBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gZm9yIGRlYnVnZ2luZworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKyAgICBOU1N0cmluZyAqY2hhbm5lbFN0cjsKKyAgICBOU011dGFibGVTdHJpbmcgKnR4dFN0cmluZzsKKworICAgIGNoYW5uZWxTdHIgPSBAIiI7CisgICAgaWYgKCBjaGFubmVsID4gMCApIHsKKyAgICAgICAgY2hhbm5lbFN0ciA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiLGNoYW5uZWw9JWRcbiIsIGNoYW5uZWxdOworICAgIH0KKyAgICBpZiAoW3NlbGYgdGV4dF0gIT0gbmlsKSB7CisgICAgICAgIHR4dFN0cmluZyA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzpbc2VsZiB0ZXh0XV07CisgICAgICAgIFt0eHRTdHJpbmcgcmVwbGFjZU9jY3VycmVuY2VzT2ZTdHJpbmc6QCJcbiIgd2l0aFN0cmluZzpAIlxcXFxuIiBvcHRpb25zOk5TQW5jaG9yZWRTZWFyY2ggcmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3R4dFN0cmluZyBsZW5ndGhdKV07CisgICAgICAgIFt0eHRTdHJpbmcgcmVwbGFjZU9jY3VycmVuY2VzT2ZTdHJpbmc6QCJcciIgd2l0aFN0cmluZzpAIlxcXFxyIiBvcHRpb25zOk5TQW5jaG9yZWRTZWFyY2ggcmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3R4dFN0cmluZyBsZW5ndGhdKV07CisgICAgICAgIFt0eHRTdHJpbmcgcmVwbGFjZU9jY3VycmVuY2VzT2ZTdHJpbmc6QCJcdCIgd2l0aFN0cmluZzpAIlxcXFx0IiBvcHRpb25zOk5TQW5jaG9yZWRTZWFyY2ggcmFuZ2U6TlNNYWtlUmFuZ2UoMCwgW3R4dFN0cmluZyBsZW5ndGhdKV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHh0U3RyaW5nID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOkAiPG5vIHRleHQ+Il07CisgICAgfQorICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIltAJWQsICVkOiVkPSclQCcsPCVkPiVALCVkOiVkXSIsIGluZGV4LCBzdGFydEluZGV4LCBzdG9wSW5kZXgsIHR4dFN0cmluZywgdHlwZSwgY2hhbm5lbFN0ciwgbGluZSwgY2hhclBvc2l0aW9uSW5MaW5lXTsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgcmV0dXJuIFtzZWxmIGRlc2NyaXB0aW9uXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjEzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU291cmNlLmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorI2ltcG9ydCAiQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTXV0YWJsZURpY3Rpb25hcnkuaCIKKworQGludGVyZmFjZSBBTlRMUkNvbW1vblRva2VuU3RyZWFtIDogQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtIDwgQU5UTFJUb2tlblN0cmVhbSA+Cit7CisJX19zdHJvbmcgQU11dGFibGVEaWN0aW9uYXJ5ICpjaGFubmVsT3ZlcnJpZGU7CisJTlNVSW50ZWdlciBjaGFubmVsOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldENoYW5uZWxPdmVycmlkZSxzZXR0ZXI9c2V0Q2hhbm5lbE92ZXJyaWRlOikgQU11dGFibGVEaWN0aW9uYXJ5ICpjaGFubmVsT3ZlcnJpZGU7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWNoYW5uZWwsc2V0dGVyPXNldENoYW5uZWw6KSBOU1VJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSQ29tbW9uVG9rZW5TdHJlYW0gKiluZXdBTlRMUkNvbW1vblRva2VuU3RyZWFtOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlOworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOihOU1VJbnRlZ2VyKWFDaGFubmVsOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFRva2VuU291cmNlOihpZDxBTlRMUlRva2VuU291cmNlPil0aGVUb2tlblNvdXJjZTsKKy0gKGlkKSBpbml0V2l0aFRva2VuU291cmNlOihpZDxBTlRMUlRva2VuU291cmNlPil0aGVUb2tlblNvdXJjZSBDaGFubmVsOihOU1VJbnRlZ2VyKWFDaGFubmVsOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIExCOihOU0ludGVnZXIpazsKKy0gKGlkPEFOVExSVG9rZW4+KSBMVDooTlNJbnRlZ2VyKWs7CisKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnM6KE5TSW50ZWdlcikgaTsKKy0gKE5TSW50ZWdlcikgc2tpcE9mZkNoYW5uZWxUb2tlbnNSZXZlcnNlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpc2V0dXA7CisKKy0gKE5TSW50ZWdlcikgZ2V0TnVtYmVyT2ZPbkNoYW5uZWxUb2tlbnM7CisKKy8vIC0gKGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBnZXRUb2tlblNvdXJjZTsKKy0gKHZvaWQpIHNldFRva2VuU291cmNlOiAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZTsKKworLSAoTlNVSW50ZWdlciljaGFubmVsOworLSAodm9pZClzZXRDaGFubmVsOihOU1VJbnRlZ2VyKWFDaGFubmVsOworCistIChBTXV0YWJsZURpY3Rpb25hcnkgKiljaGFubmVsT3ZlcnJpZGU7CistICh2b2lkKXNldENoYW5uZWxPdmVycmlkZTooQU11dGFibGVEaWN0aW9uYXJ5ICopYW5PdmVycmlkZTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKyNpZmRlZiBET05UVVNFTk9NTworLSAoTlNBcnJheSAqKSB0b2tlbnNJblJhbmdlOihOU1JhbmdlKWFSYW5nZTsKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2UgaW5CaXRTZXQ6KEFOVExSQml0U2V0ICopYUJpdFNldDsKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aFR5cGVzOihOU0FycmF5ICopdG9rZW5UeXBlczsKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aFR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGU7CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooTlNJbnRlZ2VyKWk7CisKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcilpbmRleDsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG9FbmQ6KE5TSW50ZWdlcilzdG9wSW5kZXg7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUb1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW47CisKKyNlbmRpZgorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRva2VuU3RyZWFtLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRva2VuU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViYzMyNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0ubQpAQCAtMCwwICsxLDM1MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW5TdHJlYW0uaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJDb21tb25Ub2tlblN0cmVhbQorCitAc3ludGhlc2l6ZSBjaGFubmVsT3ZlcnJpZGU7CitAc3ludGhlc2l6ZSBjaGFubmVsOworCisjcHJhZ21hIG1hcmsgSW5pdGlhbGl6YXRpb24KKworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW0KK3sKKyAgICByZXR1cm4gW1tBTlRMUkNvbW1vblRva2VuU3RyZWFtIGFsbG9jXSBpbml0XTsKK30KKworKyAoQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqKW5ld0FOVExSQ29tbW9uVG9rZW5TdHJlYW1XaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlCit7CisgICAgcmV0dXJuIFtbQU5UTFJDb21tb25Ub2tlblN0cmVhbSBhbGxvY10gaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pdGhlVG9rZW5Tb3VyY2VdOworfQorCisrIChBTlRMUkNvbW1vblRva2VuU3RyZWFtICopbmV3QU5UTFJDb21tb25Ub2tlblN0cmVhbVdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pdGhlVG9rZW5Tb3VyY2UgQ2hhbm5lbDooTlNVSW50ZWdlcilhQ2hhbm5lbAoreworICAgIHJldHVybiBbW0FOVExSQ29tbW9uVG9rZW5TdHJlYW0gYWxsb2NdIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlIENoYW5uZWw6YUNoYW5uZWxdOworfQorCistIChpZCkgaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisJCWNoYW5uZWxPdmVycmlkZSA9IFtbQU11dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6MTAwXSByZXRhaW5dOworCQljaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KXRoZVRva2VuU291cmNlCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoVG9rZW5Tb3VyY2U6dGhlVG9rZW5Tb3VyY2VdKSAhPSBuaWwpIHsKKwkJY2hhbm5lbE92ZXJyaWRlID0gW1tBTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhDYXBhY2l0eToxMDBdIHJldGFpbl07CisJCWNoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pdGhlVG9rZW5Tb3VyY2UgQ2hhbm5lbDooTlNVSW50ZWdlcilhQ2hhbm5lbAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFRva2VuU291cmNlOnRoZVRva2VuU291cmNlXSkgIT0gbmlsKSB7CisJCWNoYW5uZWxPdmVycmlkZSA9IFtbQU11dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6MTAwXSByZXRhaW5dOworCQljaGFubmVsID0gYUNoYW5uZWw7CisJfQorCXJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSQ29tbW9uVG9rZW5TdHJlYW0iICk7CisjZW5kaWYKKwlpZiAoIGNoYW5uZWxPdmVycmlkZSApIFtjaGFubmVsT3ZlcnJpZGUgcmVsZWFzZV07CisJaWYgKCB0b2tlbnMgKSBbdG9rZW5zIHJlbGVhc2VdOworCVtzZWxmIHNldFRva2VuU291cmNlOm5pbF07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiogQWx3YXlzIGxlYXZlIGluZGV4IG9uIGFuIG9uLWNoYW5uZWwgdG9rZW4uICovCistICh2b2lkKSBjb25zdW1lCit7CisgICAgaWYgKGluZGV4ID09IC0xKSBbc2VsZiBzZXR1cF07CisgICAgaW5kZXgrKzsKKyAgICBbc2VsZiBzeW5jOmluZGV4XTsKKyAgICB3aGlsZSAoICgoQU5UTFJDb21tb25Ub2tlbiAqKVt0b2tlbnMgb2JqZWN0QXRJbmRleDppbmRleF0pLmNoYW5uZWwgIT0gY2hhbm5lbCApIHsKKwkJaW5kZXgrKzsKKwkJW3NlbGYgc3luYzppbmRleF07CisJfQorfQorCisjcHJhZ21hIG1hcmsgTG9va2FoZWFkCisKKy0gKGlkPEFOVExSVG9rZW4+KSBMQjooTlNJbnRlZ2VyKWsKK3sKKwlpZiAoIGsgPT0gMCB8fCAoaW5kZXgtaykgPCAwICkgeworCQlyZXR1cm4gbmlsOworCX0KKwlpbnQgaSA9IGluZGV4OworCWludCBuID0gMTsKKyAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKKwl3aGlsZSAoIG4gPD0gayApIHsKKwkJaSA9IFtzZWxmIHNraXBPZmZDaGFubmVsVG9rZW5zUmV2ZXJzZTppLTFdOworCQluKys7CisJfQorCWlmICggaSA8IDAgKSB7CisJCXJldHVybiBuaWw7CisJfQorCXJldHVybiBbdG9rZW5zIG9iamVjdEF0SW5kZXg6aV07Cit9CisKKy0gKGlkPEFOVExSVG9rZW4+KSBMVDooTlNJbnRlZ2VyKWsKK3sKKwlpZiAoIGluZGV4ID09IC0xICkgW3NlbGYgc2V0dXBdOworCWlmICggayA9PSAwICkgcmV0dXJuIG5pbDsKKwlpZiAoIGsgPCAwICkgcmV0dXJuIFtzZWxmIExCOi1rXTsKKwlpbnQgaSA9IGluZGV4OworCWludCBuID0gMTsKKwl3aGlsZSAoIG4gPCBrICkgeworCQlpID0gW3NlbGYgc2tpcE9mZkNoYW5uZWxUb2tlbnM6aSsxXTsKKwkJbisrOworCX0KKy8vCWlmICggaSA+PSAoTlNJbnRlZ2VyKVt0b2tlbnMgY291bnRdICkgeworLy8JCXJldHVybiBbQU5UTFJDb21tb25Ub2tlbiBlb2ZUb2tlbl07CisvLwl9CisgICAgaWYgKCBpID4gcmFuZ2UgKSByYW5nZSA9IGk7CisJcmV0dXJuIFt0b2tlbnMgb2JqZWN0QXRJbmRleDppXTsKK30KKworI3ByYWdtYSBtYXJrIENoYW5uZWxzICYgU2tpcHBpbmcKKworLSAoTlNJbnRlZ2VyKSBza2lwT2ZmQ2hhbm5lbFRva2VuczooTlNJbnRlZ2VyKSBpZHgKK3sKKyAgICBbc2VsZiBzeW5jOmlkeF07CisJd2hpbGUgKCAoKEFOVExSQ29tbW9uVG9rZW4gKilbdG9rZW5zIG9iamVjdEF0SW5kZXg6aWR4XSkuY2hhbm5lbCAhPSBjaGFubmVsICkgeworCQlpZHgrKzsKKyAgICAgICAgW3NlbGYgc3luYzppZHhdOworCX0KKwlyZXR1cm4gaWR4OworfQorCistIChOU0ludGVnZXIpIHNraXBPZmZDaGFubmVsVG9rZW5zUmV2ZXJzZTooTlNJbnRlZ2VyKSBpCit7CisJd2hpbGUgKCBpID49IDAgJiYgKChBTlRMUkNvbW1vblRva2VuICopW3Rva2VucyBvYmplY3RBdEluZGV4OmldKS5jaGFubmVsICE9IGNoYW5uZWwgKSB7CisJCWktLTsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy0gKHZvaWQpIHNldHVwCit7CisgICAgaW5kZXggPSAwOworICAgIFtzZWxmIHN5bmM6MF07CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlICggKChBTlRMUkNvbW1vblRva2VuICopW3Rva2VucyBvYmplY3RBdEluZGV4OmldKS5jaGFubmVsICE9IGNoYW5uZWwgKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgW3NlbGYgc3luYzppXTsKKyAgICB9CisJLy8gbGVhdmUgaW5kZXggcG9pbnRpbmcgYXQgZmlyc3QgdG9rZW4gb24gY2hhbm5lbAorICAgIGluZGV4ID0gaTsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXROdW1iZXJPZk9uQ2hhbm5lbFRva2VucworeworICAgIE5TSW50ZWdlciBuID0gMDsKKyAgICBbc2VsZiBmaWxsXTsKKyAgICBmb3IoIGludCBpID0gMDsgaSA8IFt0b2tlbnMgY291bnRdOyBpKysgKSB7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKnQgPSBbdG9rZW5zIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggdC5jaGFubmVsID09IGNoYW5uZWwgKQorICAgICAgICAgICAgbisrOworICAgICAgICBpZiAoIHQudHlwZSA9PSBBTlRMUlRva2VuVHlwZUVPRiApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG47Cit9CisKKy8qKiBSZXNldCB0aGlzIHRva2VuIHN0cmVhbSBieSBzZXR0aW5nIGl0cyB0b2tlbiBzb3VyY2UuICovCistICh2b2lkKSBzZXRUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlCit7CisgICAgW3N1cGVyIHNldFRva2VuU291cmNlOmFUb2tlblNvdXJjZV07CisgICAgY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKK30KKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICBBTlRMUkNvbW1vblRva2VuU3RyZWFtICpjb3B5OworCQorICAgIC8vICAgIGNvcHkgPSBbW1tzZWxmIGNsYXNzXSBhbGxvY1dpdGhab25lOmFab25lXSBpbml0XTsKKyAgICBjb3B5ID0gW3N1cGVyIGNvcHlXaXRoWm9uZTphWm9uZV07IC8vIGFsbG9jYXRpb24gb2NjdXJzIGluIEFOVExSQmFzZVRyZWUKKyAgICBpZiAoIHNlbGYuY2hhbm5lbE92ZXJyaWRlICkKKyAgICAgICAgY29weS5jaGFubmVsT3ZlcnJpZGUgPSBbY2hhbm5lbE92ZXJyaWRlIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS5jaGFubmVsID0gY2hhbm5lbDsKKyAgICByZXR1cm4gY29weTsKK30KKworLSAoTlNVSW50ZWdlciljaGFubmVsCit7CisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKKy0gKHZvaWQpc2V0Q2hhbm5lbDooTlNVSW50ZWdlcilhQ2hhbm5lbAoreworICAgIGNoYW5uZWwgPSBhQ2hhbm5lbDsKK30KKworLSAoQU11dGFibGVEaWN0aW9uYXJ5ICopY2hhbm5lbE92ZXJyaWRlCit7CisgICAgcmV0dXJuIGNoYW5uZWxPdmVycmlkZTsKK30KKworLSAodm9pZClzZXRDaGFubmVsT3ZlcnJpZGU6KEFNdXRhYmxlRGljdGlvbmFyeSAqKWFuT3ZlcnJpZGUKK3sKKyAgICBjaGFubmVsT3ZlcnJpZGUgPSBhbk92ZXJyaWRlOworfQorCisjaWZkZWYgRE9OVFVTRU5PTU8KKyNwcmFnbWEgbWFyayBUb2tlbiBhY2Nlc3MKKworLSAoTlNBcnJheSAqKSB0b2tlbnNJblJhbmdlOihOU1JhbmdlKWFSYW5nZQoreworCXJldHVybiBbdG9rZW5zIHN1YmFycmF5V2l0aFJhbmdlOmFSYW5nZV07Cit9CisKKyNwcmFnbWEgbWFyayBBY2Nlc3NvcnMKKworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGdldFRva2VuU291cmNlCit7CisgICAgcmV0dXJuIHRva2VuU291cmNlOyAKK30KKworLSAoTlNBcnJheSAqKSB0b2tlbnNJblJhbmdlOihOU1JhbmdlKWFSYW5nZSBpbkJpdFNldDooQU5UTFJCaXRTZXQgKilhQml0U2V0Cit7CisJdW5zaWduZWQgaW50IHN0YXJ0SW5kZXggPSBhUmFuZ2UubG9jYXRpb247CisJdW5zaWduZWQgaW50IHN0b3BJbmRleCA9IGFSYW5nZS5sb2NhdGlvbithUmFuZ2UubGVuZ3RoOworCWlmICggaW5kZXggPT0gLTEgKSB7CisJCVtzZWxmIHNldHVwXTsKKwl9CisJaWYgKHN0b3BJbmRleCA+PSBbdG9rZW5zIGNvdW50XSkgeworCQlzdG9wSW5kZXggPSBbdG9rZW5zIGNvdW50XSAtIDE7CisJfQorCUFNdXRhYmxlQXJyYXkgKmZpbHRlcmVkVG9rZW5zID0gW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6MTAwXTsKKwl1bnNpZ25lZCBpbnQgaT0wOworCWZvciAoaSA9IHN0YXJ0SW5kZXg7IGk8PXN0b3BJbmRleDsgaSsrKSB7CisJCWlkPEFOVExSVG9rZW4+IHRva2VuID0gW3Rva2VucyBvYmplY3RBdEluZGV4OmldOworCQlpZiAoYUJpdFNldCA9PSBuaWwgfHwgW2FCaXRTZXQgbWVtYmVyOnRva2VuLnR5cGVdKSB7CisJCQlbZmlsdGVyZWRUb2tlbnMgYWRkT2JqZWN0OnRva2VuXTsKKwkJfQorCX0KKwlpZiAoW2ZpbHRlcmVkVG9rZW5zIGNvdW50XSkgeworCQlyZXR1cm4gZmlsdGVyZWRUb2tlbnM7CisJfSBlbHNlIHsKKwkJW2ZpbHRlcmVkVG9rZW5zIHJlbGVhc2VdOworCQlyZXR1cm4gbmlsOworCX0KK30KKworLSAoTlNBcnJheSAqKSB0b2tlbnNJblJhbmdlOihOU1JhbmdlKWFSYW5nZSB3aXRoVHlwZXM6KE5TQXJyYXkgKil0b2tlblR5cGVzCit7CisJQU5UTFJCaXRTZXQgKmJpdHMgPSBbW0FOVExSQml0U2V0IGFsbG9jXSBpbml0V2l0aEFycmF5T2ZCaXRzOnRva2VuVHlwZXNdOworCU5TQXJyYXkgKnJldHVyblRva2VucyA9IFtbc2VsZiB0b2tlbnNJblJhbmdlOmFSYW5nZSBpbkJpdFNldDpiaXRzXSByZXRhaW5dOworCVtiaXRzIHJlbGVhc2VdOworCXJldHVybiByZXR1cm5Ub2tlbnM7Cit9CisKKy0gKE5TQXJyYXkgKikgdG9rZW5zSW5SYW5nZTooTlNSYW5nZSlhUmFuZ2Ugd2l0aFR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGUKK3sKKwlBTlRMUkJpdFNldCAqYml0cyA9IFtbQU5UTFJCaXRTZXQgYWxsb2NdIGluaXRdOworCVtiaXRzIGFkZDp0b2tlblR5cGVdOworCU5TQXJyYXkgKnJldHVyblRva2VucyA9IFtbc2VsZiB0b2tlbnNJblJhbmdlOmFSYW5nZSBpbkJpdFNldDpiaXRzXSByZXRhaW5dOworCVtiaXRzIHJlbGVhc2VdOworCXJldHVybiByZXR1cm5Ub2tlbnM7Cit9CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooTlNJbnRlZ2VyKWkKK3sKKwlyZXR1cm4gW3Rva2VucyBvYmplY3RBdEluZGV4OmldOworfQorCistIChOU0ludGVnZXIpIHNpemUKK3sKKwlyZXR1cm4gW3Rva2VucyBjb3VudF07Cit9CisKKy0gKHZvaWQpIHJld2luZAoreworCVtzZWxmIHNlZWs6bGFzdE1hcmtlcl07Cit9CisKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcgoreworCVtzZWxmIHNlZWs6bWFya2VyXTsKK30KKworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKKwlpbmRleCA9IGFuSW5kZXg7Cit9CisjcHJhZ21hIG1hcmsgdG9TdHJpbmcgcm91dGluZXMKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmcKK3sKKwlpZiAoIGluZGV4ID09IC0xICkgeworCQlbc2VsZiBzZXR1cF07CisJfQorCXJldHVybiBbc2VsZiB0b1N0cmluZ0Zyb21TdGFydDowIFRvRW5kOlt0b2tlbnMgY291bnRdXTsKK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydElkeCBUb0VuZDooTlNJbnRlZ2VyKSBzdG9wSWR4Cit7CisgICAgTlNNdXRhYmxlU3RyaW5nICpzdHJpbmdCdWZmZXI7CisgICAgaWQ8QU5UTFJUb2tlbj4gdDsKKworICAgIGlmICggc3RhcnRJZHggPCAwIHx8IHN0b3BJZHggPCAwICkgeworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBpZiAoIGluZGV4ID09IC0xICkgeworICAgICAgICBbc2VsZiBzZXR1cF07CisgICAgfQorICAgIGlmICggc3RvcElkeCA+PSBbdG9rZW5zIGNvdW50XSApIHsKKyAgICAgICAgc3RvcElkeCA9IFt0b2tlbnMgY291bnRdLTE7CisgICAgfQorICAgIHN0cmluZ0J1ZmZlciA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjMwXTsKKyAgICBmb3IgKGludCBpID0gc3RhcnRJZHg7IGkgPD0gc3RvcElkeDsgaSsrKSB7CisgICAgICAgIHQgPSAoaWQ8QU5UTFJUb2tlbj4pW3Rva2VucyBvYmplY3RBdEluZGV4OmldOworICAgICAgICBbc3RyaW5nQnVmZmVyIGFwcGVuZFN0cmluZzpbdCB0ZXh0XV07CisgICAgfQorICAgIHJldHVybiBzdHJpbmdCdWZmZXI7Cit9CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BUb2tlbgoreworCWlmIChzdGFydFRva2VuICYmIHN0b3BUb2tlbikgeworCQlpbnQgc3RhcnRJZHggPSBbc3RhcnRUb2tlbiBnZXRUb2tlbkluZGV4XTsKKwkJaW50IHN0b3BJZHggPSBbc3RvcFRva2VuIGdldFRva2VuSW5kZXhdOworCQlyZXR1cm4gW3NlbGYgdG9TdHJpbmdGcm9tU3RhcnQ6c3RhcnRJZHggVG9FbmQ6c3RvcElkeF07CisJfQorCXJldHVybiBuaWw7Cit9CisjZW5kaWYKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25Ub2tlblRlc3QtSW5mby5wbGlzdCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW5UZXN0LUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NWE0NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVG9rZW5UZXN0LUluZm8ucGxpc3QKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS55b3VyY29tcGFueS4ke1BST0RVQ1RfTkFNRTpyZmMxMDM0aWRlbnRpZmllcn08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkJOREw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjE8L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWNiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWUuaApAQCAtMCwwICsxLDkyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWUuaCIKKworQGludGVyZmFjZSBBTlRMUkNvbW1vblRyZWUgOiBBTlRMUkJhc2VUcmVlIDxBTlRMUlRyZWU+IHsKKwlfX3N0cm9uZyBBTlRMUkNvbW1vblRva2VuICp0b2tlbjsKKwlOU0ludGVnZXIgc3RhcnRJbmRleDsKKwlOU0ludGVnZXIgc3RvcEluZGV4OworICAgIF9fc3Ryb25nIEFOVExSQ29tbW9uVHJlZSAqcGFyZW50OworICAgIE5TSW50ZWdlciBjaGlsZEluZGV4OworfQorCisrIChBTlRMUkNvbW1vblRyZWUgKikgaW52YWxpZE5vZGU7CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3VHJlZTsKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdUcmVlV2l0aFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworKyAoQU5UTFJDb21tb25UcmVlICopIG5ld1RyZWVXaXRoVG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKilhVG9rZW47CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3VHJlZVdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGU7CisrIChBTlRMUkNvbW1vblRyZWUgKikgbmV3VHJlZVdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilhVFR5cGUgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlOihBTlRMUkNvbW1vblRyZWUgKilhTm9kZTsKKy0gKGlkKSBpbml0V2l0aFRva2VuOihBTlRMUkNvbW1vblRva2VuICopYVRva2VuOworLSAoaWQpIGluaXRXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRva2VuVHlwZTsKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChpZDxBTlRMUkJhc2VUcmVlPikgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoQk9PTCkgaXNOaWw7CisKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgZ2V0VG9rZW47CistICh2b2lkKSBzZXRUb2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy0gKEFOVExSQ29tbW9uVG9rZW4gKikgZHVwTm9kZTsKKy0gKE5TSW50ZWdlcil0eXBlOworLSAoTlNTdHJpbmcgKil0ZXh0OworLSAoTlNVSW50ZWdlcilsaW5lOworLSAodm9pZCkgc2V0TGluZTooTlNVSW50ZWdlcilhTGluZTsKKy0gKE5TVUludGVnZXIpY2hhclBvc2l0aW9uSW5MaW5lOworLSAodm9pZCkgc2V0Q2hhclBvc2l0aW9uSW5MaW5lOihOU1VJbnRlZ2VyKXBvczsKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBnZXRQYXJlbnQ7CistICh2b2lkKSBzZXRQYXJlbnQ6KEFOVExSQ29tbW9uVHJlZSAqKSB0OworCisjaWZkZWYgRE9OVFVTRU5PTU8KKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbjsKKyNlbmRpZgorLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb247CistICh2b2lkKSBzZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzOworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0SW5kZXg6IChOU0ludGVnZXIpIGFTdGFydEluZGV4OworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RvcEluZGV4OiAoTlNJbnRlZ2VyKSBhU3RvcEluZGV4OworCisvKgorIEBwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0QU5UTFJDb21tb25Ub2tlbiwgc2V0dGVyPXNldEFOVExSQ29tbW9uVG9rZW46KSBBTlRMUkNvbW1vblRva2VuICp0b2tlbjsKKyBAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFRva2VuU3RhcnRJbmRleCwgc2V0dGVyPXNldFRva2VuU3RhcnRJbmRleDopIE5TSW50ZWdlciBzdGFydEluZGV4OworIEBwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0VG9rZW5TdG9wSW5kZXgsIHNldHRlcj1zZXRUb2tlblN0b3BJbmRleDopIE5TSW50ZWdlciBzdG9wSW5kZXg7CisgQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRQYXJlbnQsIHNldHRlcj1zZXRQYXJlbnQ6KSBpZDxBTlRMUkJhc2VUcmVlPiBwYXJlbnRwYXJlbnQ7CisgQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRDaGlsZEluZGV4LCBzZXR0ZXI9c2V0Q2hpbGRJbmRleDopIE5TSW50ZWdlciBjaGlsZEluZGV4OworICovCisKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTlRMUkNvbW1vblRva2VuICp0b2tlbjsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgc3RhcnRJbmRleDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgc3RvcEluZGV4OworQHByb3BlcnR5IChyZXRhaW4pIEFOVExSQ29tbW9uVHJlZSAqcGFyZW50OworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBjaGlsZEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWUubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YzFmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWUubQpAQCAtMCwwICsxLDM0NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkNvbW1vblRyZWUKKworKyAoQU5UTFJDb21tb25UcmVlICopSU5WQUxJRF9OT0RFCit7CisJcmV0dXJuIFtbQU5UTFJDb21tb25UcmVlIGFsbG9jXSBpbml0V2l0aFRva2VuOltBTlRMUkNvbW1vblRva2VuIGludmFsaWRUb2tlbl1dOworfQorCisrIChBTlRMUkNvbW1vblRyZWUgKilpbnZhbGlkTm9kZQoreworICAgIC8vIEhhZCB0byBjYXN0IHRvIEFOVExSQ29tbW9uVHJlZSAqIGhlcmUsIGJlY2F1c2UgR0NDIGlzIGR1bWIuCisJcmV0dXJuIFtbQU5UTFJDb21tb25UcmVlIGFsbG9jXSBpbml0V2l0aFRva2VuOkFOVExSQ29tbW9uVG9rZW4uSU5WQUxJRF9UT0tFTl07Cit9CisKKysgKEFOVExSQ29tbW9uVHJlZSAqKW5ld1RyZWUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkNvbW1vblRyZWUgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUkNvbW1vblRyZWUgKiluZXdUcmVlV2l0aFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgcmV0dXJuIFtbQU5UTFJDb21tb25UcmVlIGFsbG9jXSBpbml0V2l0aFRyZWVOb2RlOmFUcmVlXTsKK30KKworKyAoQU5UTFJDb21tb25UcmVlICopbmV3VHJlZVdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pYVRva2VuCit7CisJcmV0dXJuIFtbQU5UTFJDb21tb25UcmVlIGFsbG9jXSBpbml0V2l0aFRva2VuOmFUb2tlbl07Cit9CisKKysgKEFOVExSQ29tbW9uVHJlZSAqKW5ld1RyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRUeXBlCit7CisJcmV0dXJuIFtbQU5UTFJDb21tb25UcmVlIGFsbG9jXSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWFUVHlwZV07Cit9CisKKysgKEFOVExSQ29tbW9uVHJlZSAqKW5ld1RyZWVXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRUeXBlIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworCXJldHVybiBbW0FOVExSQ29tbW9uVHJlZSBhbGxvY10gaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcilhVFR5cGUgVGV4dDp0aGVUZXh0XTsKK30KKworLSAoaWQpaW5pdAoreworCXNlbGYgPSAoQU5UTFJDb21tb25UcmVlICopW3N1cGVyIGluaXRdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIHRva2VuID0gbmlsOworCQlzdGFydEluZGV4ID0gLTE7CisJCXN0b3BJbmRleCA9IC0xOworICAgICAgICBwYXJlbnQgPSBuaWw7CisgICAgICAgIGNoaWxkSW5kZXggPSAtMTsKKwl9CisJcmV0dXJuIChBTlRMUkNvbW1vblRyZWUgKilzZWxmOworfQorCistIChpZClpbml0V2l0aFRyZWVOb2RlOihBTlRMUkNvbW1vblRyZWUgKilhTm9kZQoreworCXNlbGYgPSAoQU5UTFJDb21tb25UcmVlICopW3N1cGVyIGluaXRdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJCXRva2VuID0gYU5vZGUudG9rZW47CisgICAgICAgIGlmICggdG9rZW4gKSBbdG9rZW4gcmV0YWluXTsKKwkJc3RhcnRJbmRleCA9IGFOb2RlLnN0YXJ0SW5kZXg7CisJCXN0b3BJbmRleCA9IGFOb2RlLnN0b3BJbmRleDsKKyAgICAgICAgcGFyZW50ID0gbmlsOworICAgICAgICBjaGlsZEluZGV4ID0gLTE7CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZClpbml0V2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilhVG9rZW4KK3sKKwlzZWxmID0gKEFOVExSQ29tbW9uVHJlZSAqKVtzdXBlciBpbml0XTsKKwlpZiAoIHNlbGYgIT0gbmlsICkgeworCQl0b2tlbiA9IGFUb2tlbjsKKyAgICAgICAgaWYgKCB0b2tlbiApIFt0b2tlbiByZXRhaW5dOworCQlzdGFydEluZGV4ID0gLTE7CisJCXN0b3BJbmRleCA9IC0xOworICAgICAgICBwYXJlbnQgPSBuaWw7CisgICAgICAgIGNoaWxkSW5kZXggPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKWluaXRXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpYVRva2VuVHlwZQoreworCXNlbGYgPSAoQU5UTFJDb21tb25UcmVlICopW3N1cGVyIGluaXRdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJCXRva2VuID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOmFUb2tlblR5cGVdIHJldGFpbl07CisvLwkJc3RhcnRJbmRleCA9IHRva2VuLnN0YXJ0SW5kZXg7CisJCXN0YXJ0SW5kZXggPSAtMTsKKy8vCQlzdG9wSW5kZXggPSB0b2tlbi5zdG9wSW5kZXg7CisJCXN0b3BJbmRleCA9IC0xOworICAgICAgICBwYXJlbnQgPSBuaWw7CisgICAgICAgIGNoaWxkSW5kZXggPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0Cit7CisJc2VsZiA9IChBTlRMUkNvbW1vblRyZWUgKilbc3VwZXIgaW5pdF07CisJaWYgKCBzZWxmICE9IG5pbCApIHsKKwkJdG9rZW4gPSBbW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46YVRva2VuVHlwZSBUZXh0OnRoZVRleHRdIHJldGFpbl07CisvLwkJc3RhcnRJbmRleCA9IHRva2VuLnN0YXJ0SW5kZXg7CisJCXN0YXJ0SW5kZXggPSAtMTsKKy8vCQlzdG9wSW5kZXggPSB0b2tlbi5zdG9wSW5kZXg7CisJCXN0b3BJbmRleCA9IC0xOworICAgICAgICBwYXJlbnQgPSBuaWw7CisgICAgICAgIGNoaWxkSW5kZXggPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBpZiAoIHRva2VuICkgeworICAgICAgICBbdG9rZW4gcmVsZWFzZV07CisgICAgICAgIHRva2VuID0gbmlsOworICAgIH0KKyAgICBpZiAoIHBhcmVudCApIHsKKyAgICAgICAgW3BhcmVudCByZWxlYXNlXTsKKyAgICAgICAgcGFyZW50ID0gbmlsOworICAgIH0KKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJDb21tb25UcmVlICpjb3B5OworCQorICAgIC8vICAgIGNvcHkgPSBbW1tzZWxmIGNsYXNzXSBhbGxvY1dpdGhab25lOmFab25lXSBpbml0XTsKKyAgICBjb3B5ID0gW3N1cGVyIGNvcHlXaXRoWm9uZTphWm9uZV07IC8vIGFsbG9jYXRpb24gb2NjdXJzIGluIEFOVExSQmFzZVRyZWUKKyAgICBpZiAoIHNlbGYudG9rZW4gKQorICAgICAgICBjb3B5LnRva2VuID0gW3NlbGYudG9rZW4gY29weVdpdGhab25lOmFab25lXTsKKyAgICBjb3B5LnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OworICAgIGNvcHkuc3RvcEluZGV4ID0gc3RvcEluZGV4OworICAgIGNvcHkucGFyZW50ID0gKEFOVExSQ29tbW9uVHJlZSAqKVtzZWxmLnBhcmVudCBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIGNvcHkuY2hpbGRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgcmV0dXJuIGNvcHk7Cit9CisKKy0gKEJPT0wpIGlzTmlsCit7CisJcmV0dXJuIHRva2VuID09IG5pbDsKK30KKworLSAoQU5UTFJDb21tb25Ub2tlbiAqKSBnZXRUb2tlbgoreworCXJldHVybiB0b2tlbjsKK30KKworLSAodm9pZCkgc2V0VG9rZW46KEFOVExSQ29tbW9uVG9rZW4gKikgYVRva2VuCit7CisJaWYgKCB0b2tlbiAhPSBhVG9rZW4gKSB7CisJCWlmICggdG9rZW4gKSBbdG9rZW4gcmVsZWFzZV07CisJCVthVG9rZW4gcmV0YWluXTsKKwkJdG9rZW4gPSBhVG9rZW47CisJfQorfQorCistIChBTlRMUkNvbW1vblRyZWUgKikgZHVwTm9kZQoreworICAgIHJldHVybiBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVHJlZTpzZWxmIF07Cit9CisKKy0gKE5TSW50ZWdlcil0eXBlCit7CisJaWYgKHRva2VuKQorCQlyZXR1cm4gdG9rZW4udHlwZTsKKwlyZXR1cm4gQU5UTFJUb2tlblR5cGVJbnZhbGlkOworfQorCistIChOU1N0cmluZyAqKXRleHQKK3sKKwlpZiAodG9rZW4pCisJCXJldHVybiB0b2tlbi50ZXh0OworCXJldHVybiBuaWw7Cit9CisKKy0gKE5TVUludGVnZXIpbGluZQoreworCWlmICh0b2tlbikKKwkJcmV0dXJuIHRva2VuLmxpbmU7CisJcmV0dXJuIDA7Cit9CisKKy0gKHZvaWQpIHNldExpbmU6KE5TVUludGVnZXIpYUxpbmUKK3sKKyAgICBpZiAodG9rZW4pCisgICAgICAgIHRva2VuLmxpbmUgPSBhTGluZTsKK30KKworLSAoTlNVSW50ZWdlciljaGFyUG9zaXRpb25JbkxpbmUKK3sKKwlpZiAodG9rZW4pCisJCXJldHVybiB0b2tlbi5jaGFyUG9zaXRpb25JbkxpbmU7CisJcmV0dXJuIDA7Cit9CisKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNVSW50ZWdlcilwb3MKK3sKKyAgICBpZiAodG9rZW4pCisgICAgICAgIHRva2VuLmNoYXJQb3NpdGlvbkluTGluZSA9IHBvczsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0SW5kZXgKK3sKKwlpZiAoIHN0YXJ0SW5kZXggPT0gLTEgJiYgdG9rZW4gIT0gbmlsICkgeworCQlyZXR1cm4gW3Rva2VuIGdldFRva2VuSW5kZXhdOworCX0KKyAgICByZXR1cm4gc3RhcnRJbmRleDsKK30KKworLSAodm9pZCkgc2V0VG9rZW5TdGFydEluZGV4OiAoTlNJbnRlZ2VyKSBhU3RhcnRJbmRleAoreworICAgIHN0YXJ0SW5kZXggPSBhU3RhcnRJbmRleDsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRUb2tlblN0b3BJbmRleAoreworCWlmICggc3RvcEluZGV4ID09IC0xICYmIHRva2VuICE9IG5pbCApIHsKKwkJcmV0dXJuIFt0b2tlbiBnZXRUb2tlbkluZGV4XTsKKwl9CisgICAgcmV0dXJuIHN0b3BJbmRleDsKK30KKworLSAodm9pZCkgc2V0VG9rZW5TdG9wSW5kZXg6IChOU0ludGVnZXIpIGFTdG9wSW5kZXgKK3sKKyAgICBzdG9wSW5kZXggPSBhU3RvcEluZGV4OworfQorCisjaWZkZWYgRE9OVFVTRU5PTU8KKy0gKE5TU3RyaW5nICopIHRyZWVEZXNjcmlwdGlvbgoreworCWlmIChjaGlsZHJlbikgeworCQlOU011dGFibGVTdHJpbmcgKmRlc2MgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6QCIoXiJdOworCQlbZGVzYyBhcHBlbmRTdHJpbmc6W3NlbGYgZGVzY3JpcHRpb25dXTsKKwkJdW5zaWduZWQgaW50IGNoaWxkSWR4OworCQlmb3IgKGNoaWxkSWR4ID0gMDsgY2hpbGRJZHggPCBbY2hpbGRyZW4gY291bnRdOyBjaGlsZElkeCsrKSB7CisJCQlbZGVzYyBhcHBlbmRGb3JtYXQ6QCIlQCIsIFtbY2hpbGRyZW4gb2JqZWN0QXRJbmRleDpjaGlsZElkeF0gdHJlZURlc2NyaXB0aW9uXV07CisJCX0KKwkJW2Rlc2MgYXBwZW5kU3RyaW5nOkAiKSJdOworCQlyZXR1cm4gZGVzYzsKKwl9IGVsc2UgeworCQlyZXR1cm4gW3NlbGYgZGVzY3JpcHRpb25dOworCX0KK30KKyNlbmRpZgorCisvKiogRm9yIGV2ZXJ5IG5vZGUgaW4gdGhpcyBzdWJ0cmVlLCBtYWtlIHN1cmUgaXQncyBzdGFydC9zdG9wIHRva2VuJ3MKKyAqICBhcmUgc2V0LiAgV2FsayBkZXB0aCBmaXJzdCwgdmlzaXQgYm90dG9tIHVwLiAgT25seSB1cGRhdGVzIG5vZGVzCisgKiAgd2l0aCBhdCBsZWFzdCBvbmUgdG9rZW4gaW5kZXggPCAwLgorICovCistICh2b2lkKSBzZXRVbmtub3duVG9rZW5Cb3VuZGFyaWVzCit7CisgICAgaWYgKCBjaGlsZHJlbiA9PSBuaWwgKSB7CisgICAgICAgIGlmICggc3RhcnRJbmRleDwwIHx8IHN0b3BJbmRleDwwICkgeworICAgICAgICAgICAgc3RhcnRJbmRleCA9IHN0b3BJbmRleCA9IFt0b2tlbiBnZXRUb2tlbkluZGV4XTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoTlNVSW50ZWdlciBpPTA7IGkgPCBbY2hpbGRyZW4gY291bnRdOyBpKyspIHsKKyAgICAgICAgW1tjaGlsZHJlbiBvYmplY3RBdEluZGV4OmldIHNldFVua25vd25Ub2tlbkJvdW5kYXJpZXNdOworICAgIH0KKyAgICBpZiAoIHN0YXJ0SW5kZXggPj0gMCAmJiBzdG9wSW5kZXggPj0gMCApCisgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgc2V0CisgICAgaWYgKCBbY2hpbGRyZW4gY291bnRdID4gMCApIHsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpmaXJzdENoaWxkID0gKEFOVExSQ29tbW9uVHJlZSAqKVtjaGlsZHJlbiBvYmplY3RBdEluZGV4OjBdOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKmxhc3RDaGlsZCA9IChBTlRMUkNvbW1vblRyZWUgKilbY2hpbGRyZW4gb2JqZWN0QXRJbmRleDpbY2hpbGRyZW4gY291bnRdLTFdOworICAgICAgICBzdGFydEluZGV4ID0gW2ZpcnN0Q2hpbGQgZ2V0VG9rZW5TdGFydEluZGV4XTsKKyAgICAgICAgc3RvcEluZGV4ID0gW2xhc3RDaGlsZCBnZXRUb2tlblN0b3BJbmRleF07CisgICAgfQorfQorCistIChOU0ludGVnZXIpIGdldENoaWxkSW5kZXgKK3sKKyAgICByZXR1cm4gY2hpbGRJbmRleDsKK30KKworLSAoQU5UTFJDb21tb25UcmVlICopIGdldFBhcmVudAoreworICAgIHJldHVybiBwYXJlbnQ7Cit9CisKKy0gKHZvaWQpIHNldFBhcmVudDooQU5UTFJDb21tb25UcmVlICopIHQKK3sKKyAgICBwYXJlbnQgPSB0OworfQorCistICh2b2lkKSBzZXRDaGlsZEluZGV4OihOU0ludGVnZXIpIGFuSW5kZXgKK3sKKyAgICBjaGlsZEluZGV4ID0gYW5JbmRleDsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKyAgICByZXR1cm4gW3NlbGYgdG9TdHJpbmddOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZworeworICAgIGlmICggW3NlbGYgaXNOaWxdICkgeworICAgICAgICByZXR1cm4gQCJuaWwiOworICAgIH0KKyAgICBpZiAoIFtzZWxmIHR5cGVdID09IEFOVExSVG9rZW5UeXBlSW52YWxpZCApIHsKKyAgICAgICAgcmV0dXJuIEAiPGVycm9ybm9kZT4iOworICAgIH0KKyAgICBpZiAoIHRva2VuPT1uaWwgKSB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIHJldHVybiB0b2tlbi50ZXh0OworfQorCitAc3ludGhlc2l6ZSB0b2tlbjsKK0BzeW50aGVzaXplIHN0YXJ0SW5kZXg7CitAc3ludGhlc2l6ZSBzdG9wSW5kZXg7CitAc3ludGhlc2l6ZSBwYXJlbnQ7CitAc3ludGhlc2l6ZSBjaGlsZEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5ZjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaApAQCAtMCwwICsxLDY1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25UcmVlQWRhcHRvciA6IEFOVExSQmFzZVRyZWVBZGFwdG9yIHsKK30KKworKyAoQU5UTFJDb21tb25UcmVlICopIG5ld0VtcHR5VHJlZTsKKysgKEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKiluZXdUcmVlQWRhcHRvcjsKKy0gKGlkKSBpbml0OworLSAoQU5UTFJDb21tb25UcmVlICopZHVwTm9kZTooQU5UTFJDb21tb25UcmVlICopdDsgICAKKworLSAoQU5UTFJDb21tb25UcmVlICopIGNyZWF0ZTooaWQ8QU5UTFJUb2tlbj4pIHBheWxvYWQ7CisvLy0gKEFOVExSQ29tbW9uVHJlZSAqKSBjcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIGZyb21Ub2tlbjooQU5UTFJDb21tb25Ub2tlbiAqKWFUb2tlbjsKKy8vLSAoQU5UTFJDb21tb25UcmVlICopIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgZnJvbVRva2VuOihBTlRMUkNvbW1vblRva2VuICopYVRva2VuIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKGlkPEFOVExSVG9rZW4+KWNyZWF0ZVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW47CistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXM6KEFOVExSQ29tbW9uVHJlZSAqKXQgRnJvbTooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUbzooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuOworLSAoTlNJbnRlZ2VyKWdldFRva2VuU3RhcnRJbmRleDooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0b3BJbmRleDooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKHZvaWQpc2V0VGV4dDooQU5UTFJDb21tb25UcmVlICopdCBUZXh0OihOU1N0cmluZyAqKXRleHQ7CistIChOU0ludGVnZXIpZ2V0VHlwZTooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKHZvaWQpIHNldFR5cGU6KEFOVExSQ29tbW9uVHJlZSAqKXQgVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZTsKKy0gKGlkPEFOVExSVG9rZW4+KWdldFRva2VuOihBTlRMUkNvbW1vblRyZWUgKil0OworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0Q2hpbGQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgQXQ6KE5TSW50ZWdlcilpOworLSAodm9pZCkgc2V0Q2hpbGQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgQXQ6KE5TSW50ZWdlcilpIENoaWxkOihBTlRMUkNvbW1vblRyZWUgKiljaGlsZDsKKy0gKE5TSW50ZWdlcilnZXRDaGlsZENvdW50OihBTlRMUkNvbW1vblRyZWUgKil0OworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0UGFyZW50OihBTlRMUkNvbW1vblRyZWUgKil0OworLSAodm9pZClzZXRQYXJlbnQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgV2l0aDooQU5UTFJDb21tb25UcmVlICopcGFyZW50OworLSAoTlNJbnRlZ2VyKWdldENoaWxkSW5kZXg6KEFOVExSQ29tbW9uVHJlZSAqKXQ7CistICh2b2lkKXNldENoaWxkSW5kZXg6KEFOVExSQ29tbW9uVHJlZSAqKXQgV2l0aDooTlNJbnRlZ2VyKWluZGV4OworLSAodm9pZClyZXBsYWNlQ2hpbGRyZW46KEFOVExSQ29tbW9uVHJlZSAqKXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKGlkKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlQWRhcHRvci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJDb21tb25UcmVlQWRhcHRvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDk2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLm0KQEAgLTAsMCArMSwyNDAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkNvbW1vblRyZWVBZGFwdG9yCisKKysgKEFOVExSQ29tbW9uVHJlZSAqKSBuZXdFbXB0eVRyZWU7Cit7CisgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07Cit9CisKKysgKEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKiluZXdUcmVlQWRhcHRvcgoreworICAgIHJldHVybltbQU5UTFJDb21tb25UcmVlQWRhcHRvciBhbGxvY10gaW5pdF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoc2VsZikgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoqIER1cGxpY2F0ZSBhIG5vZGUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIGZhY3Rvcnk7CisgKglvdmVycmlkZSBpZiB5b3Ugd2FudCBhbm90aGVyIGtpbmQgb2Ygbm9kZSB0byBiZSBidWlsdC4KKyAqCisgKiAgSSBjb3VsZCB1c2UgcmVmbGVjdGlvbiB0byBwcmV2ZW50IGhhdmluZyB0byBvdmVycmlkZSB0aGlzCisgKiAgYnV0IHJlZmxlY3Rpb24gaXMgc2xvdy4KKyAqLworLSAoaWQpIGR1cE5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KXQKK3sKKyAgICBpZiAoIHQ9PW5pbCApCisgICAgICAgIHJldHVybiBuaWw7CisgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZTp0XTsKK30KKworLyoqIFRlbGwgbWUgaG93IHRvIGNyZWF0ZSBhIHRva2VuIGZvciB1c2Ugd2l0aCBpbWFnaW5hcnkgdG9rZW4gbm9kZXMuCisgKiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgKiAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgKiAgdGhlIERFQ0wgbm9kZSBhcyBpbiBeKERFQ0wgdHlwZSBJRCkuCisgKgorICogIFRoaXMgaXMgYSB2YXJpYW50IG9mIGNyZWF0ZVRva2VuIHdoZXJlIHRoZSBuZXcgdG9rZW4gaXMgZGVyaXZlZCBmcm9tCisgKiAgYW4gYWN0dWFsIHJlYWwgaW5wdXQgdG9rZW4uICBUeXBpY2FsbHkgdGhpcyBpcyBmb3IgY29udmVydGluZyAneycKKyAqICB0b2tlbnMgdG8gQkxPQ0sgZXRjLi4uICBZb3UnbGwgc2VlCisgKgorICogICAgciA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjXSBJRCspIDsKKyAqCisgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICovCistIChBTlRMUkNvbW1vblRyZWUgKikgY3JlYXRlOihBTlRMUkNvbW1vblRva2VuICopYVRva2VuCit7CisgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjphVG9rZW5dOworfQorCisvKiogVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAqICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAqICB0b2tlbiBERUNMLCBidXQgeW91IG5lZWQgdG8gY3JlYXRlIGl0IGFzIGEgcGF5bG9hZCBvciB3aGF0ZXZlciBmb3IKKyAqICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKyAqCisgKiAgSWYgeW91IGNhcmUgd2hhdCB0aGUgdG9rZW4gcGF5bG9hZCBvYmplY3RzJyB0eXBlIGlzLCB5b3Ugc2hvdWxkCisgKiAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICovCistIChBTlRMUkNvbW1vblRyZWUgKiljcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIFRleHQ6KE5TU3RyaW5nICopdGV4dAoreworICAgIHJldHVybiBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW5UeXBlOnRva2VuVHlwZSBUZXh0OnRleHRdOworfQorCistIChpZDxBTlRMUlRva2VuPiljcmVhdGVUb2tlbjooTlNJbnRlZ2VyKXRva2VuVHlwZSBUZXh0OihOU1N0cmluZyAqKXRleHQKK3sKKyAgICBpZDxBTlRMUlRva2VuPiBmcm9tVG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjp0b2tlblR5cGUgVGV4dDp0ZXh0XTsKKyAgICByZXR1cm4gZnJvbVRva2VuOworfQorCistIChpZDxBTlRMUlRva2VuPiljcmVhdGVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuCit7CisgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuV2l0aFRva2VuOihBTlRMUkNvbW1vblRva2VuICopZnJvbVRva2VuXTsKK30KKworLyoqIFRyYWNrIHN0YXJ0L3N0b3AgdG9rZW4gZm9yIHN1YnRyZWUgcm9vdCBjcmVhdGVkIGZvciBhIHJ1bGUuCisgKiAgT25seSB3b3JrcyB3aXRoIFRyZWUgbm9kZXMuICBGb3IgcnVsZXMgdGhhdCBtYXRjaCBub3RoaW5nLAorICogIHNlZW1zIGxpa2UgdGhpcyB3aWxsIHlpZWxkIHN0YXJ0PWkgYW5kIHN0b3A9aS0xIGluIGEgbmlsIG5vZGUuCisgKiAgTWlnaHQgYmUgdXNlZnVsIGluZm8gc28gSSdsbCBub3QgZm9yY2UgdG8gYmUgaS4uaS4KKyAqLworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzOihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZSBGcm9tOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW4KK3sKKyAgICBpZiAoIGFUcmVlID09IG5pbCApCisgICAgICAgIHJldHVybjsKKyAgICBpbnQgc3RhcnRUb2tJZHggPSAwOworICAgIGludCBzdG9wVG9rSWR4ID0gMDsKKyAgICBpZiAoIHN0YXJ0VG9rZW4gIT0gbmlsICkKKyAgICAgICAgc3RhcnRUb2tJZHggPSBbc3RhcnRUb2tlbiBnZXRUb2tlbkluZGV4XTsKKyAgICBpZiAoIHN0b3BUb2tlbiAhPSBuaWwgKQorICAgICAgICBzdG9wVG9rSWR4ID0gW3N0b3BUb2tlbiBnZXRUb2tlbkluZGV4XTsKKyAgICBbKGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlIHNldFRva2VuU3RhcnRJbmRleDpzdGFydFRva0lkeF07CisgICAgWyhpZDxBTlRMUkJhc2VUcmVlPilhVHJlZSBzZXRUb2tlblN0b3BJbmRleDpzdG9wVG9rSWR4XTsKK30KKworLSAoTlNJbnRlZ2VyKWdldFRva2VuU3RhcnRJbmRleDooaWQ8QU5UTFJCYXNlVHJlZT4pIHQKK3sKKyAgICBpZiAoIHQgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBbKGlkPEFOVExSQmFzZVRyZWU+KXQgZ2V0VG9rZW5TdGFydEluZGV4XTsKK30KKworLSAoTlNJbnRlZ2VyKWdldFRva2VuU3RvcEluZGV4OihpZDxBTlRMUkJhc2VUcmVlPikgdAoreworICAgIGlmICggdCA9PSBuaWwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIFsoaWQ8QU5UTFJCYXNlVHJlZT4pdCBnZXRUb2tlblN0b3BJbmRleF07Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0VGV4dDooQU5UTFJDb21tb25UcmVlICopdAoreworICAgIGlmICggdCA9PSBuaWwgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJldHVybiB0LnRva2VuLnRleHQ7Cit9CisKKy0gKHZvaWQpc2V0VGV4dDooaWQ8QU5UTFJCYXNlVHJlZT4pdCBUZXh0OihOU1N0cmluZyAqKXRleHQKK3sKKyAgICBpZiAoIHQgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuOworfQorCistIChOU0ludGVnZXIpZ2V0VHlwZTooQU5UTFJDb21tb25UcmVlICopdAoreworICAgIGlmICggdD09bmlsICkKKyAgICAgICAgcmV0dXJuIEFOVExSVG9rZW5UeXBlSW52YWxpZDsKKyAgICByZXR1cm4gdC50b2tlbi50eXBlOworfQorCistICh2b2lkKSBzZXRUeXBlOihpZDxBTlRMUkJhc2VUcmVlPil0IFR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGUKK3sKKyAgICBpZiAoIHQ9PW5pbCApCisgICAgICAgIHJldHVybjsKK30KKworLyoqIFdoYXQgaXMgdGhlIFRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGU/ICBJZgorICogIHlvdSBhcmUgbm90IHVzaW5nIEFOVExSQ29tbW9uVHJlZSwgdGhlbiB5b3UgbXVzdAorICogIG92ZXJyaWRlIHRoaXMgaW4geW91ciBvd24gYWRhcHRvci4KKyAqLworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihBTlRMUkNvbW1vblRyZWUgKikgdAoreworICAgIGlmICggW3QgaXNLaW5kT2ZDbGFzczpbQU5UTFJDb21tb25UcmVlIGNsYXNzXV0gKSB7CisgICAgICAgIHJldHVybiB0LnRva2VuOworICAgIH0KKyAgICByZXR1cm4gbmlsOyAvLyBubyBpZGVhIHdoYXQgdG8gZG8KK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGdldENoaWxkOihpZDxBTlRMUkJhc2VUcmVlPil0IEF0OihOU0ludGVnZXIpaQoreworICAgIGlmICggdCA9PSBuaWwgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJldHVybiBbKGlkPEFOVExSQmFzZVRyZWU+KXQgZ2V0Q2hpbGQ6aV07Cit9CisKKy0gKHZvaWQpIHNldENoaWxkOihpZDxBTlRMUkJhc2VUcmVlPil0IEF0OihOU0ludGVnZXIpaSBDaGlsZDooaWQ8QU5UTFJCYXNlVHJlZT4pY2hpbGQKK3sKKyAgICBpZiAoIHQgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuOworICAgIFsoaWQ8QU5UTFJCYXNlVHJlZT4pdCBzZXRDaGlsZDppIFdpdGg6Y2hpbGRdOworfQorCistIChpZCkgZGVsZXRlQ2hpbGQ6KGlkPEFOVExSQmFzZVRyZWU+KXQgSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4Cit7CisgICAgcmV0dXJuIFt0IGRlbGV0ZUNoaWxkOmFuSW5kZXhdOworfQorCistIChOU0ludGVnZXIpIGdldENoaWxkQ291bnQ6KGlkPEFOVExSQmFzZVRyZWU+KSB0Cit7CisgICAgaWYgKCB0ID09IG5pbCApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBbKGlkPEFOVExSQmFzZVRyZWU+KSB0IGdldENoaWxkQ291bnRdOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0UGFyZW50OihpZDxBTlRMUkJhc2VUcmVlPikgdAoreworICAgIGlmICggdCA9PSBuaWwgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJldHVybiAoaWQ8QU5UTFJCYXNlVHJlZT4pW3QgZ2V0UGFyZW50XTsKK30KKworLSAodm9pZCkgc2V0UGFyZW50OihpZDxBTlRMUkJhc2VUcmVlPil0IFdpdGg6KGlkPEFOVExSQmFzZVRyZWU+KSBwYXJlbnQKK3sKKyAgICBpZiAoIHQgIT0gbmlsICkKKyAgICAgICAgWyhpZDxBTlRMUkJhc2VUcmVlPikgdCBzZXRQYXJlbnQ6KGlkPEFOVExSQmFzZVRyZWU+KXBhcmVudF07Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRJbmRleDooaWQ8QU5UTFJCYXNlVHJlZT4pIHQKK3sKKyAgICBpZiAoIHQgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFsoaWQ8QU5UTFJCYXNlVHJlZT4pIHQgZ2V0Q2hpbGRJbmRleF07Cit9CisKKy0gKHZvaWQpIHNldENoaWxkSW5kZXg6KGlkPEFOVExSQmFzZVRyZWU+KXQgV2l0aDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKKyAgICBpZiAoIHQhPW5pbCApCisgICAgICAgIFsoaWQ8QU5UTFJCYXNlVHJlZT4pdCBzZXRDaGlsZEluZGV4OmFuSW5kZXhdOworfQorCistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KGlkPEFOVExSQmFzZVRyZWU+KXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQ8QU5UTFJCYXNlVHJlZT4pdAoreworICAgIGlmICggcGFyZW50ICE9IG5pbCApIHsKKyAgICAgICAgWyhpZDxBTlRMUkJhc2VUcmVlPilwYXJlbnQgcmVwbGFjZUNoaWxkcmVuRnJvbTpzdGFydENoaWxkSW5kZXggVG86c3RvcENoaWxkSW5kZXggV2l0aDp0XTsKKyAgICB9Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgcmV0dXJuIFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZmMwZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDEyMCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVOb2RlU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0gOiBBTlRMUkxvb2thaGVhZFN0cmVhbSA8QU5UTFJUcmVlTm9kZVN0cmVhbT4geworI2RlZmluZSBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgMTAwCisjZGVmaW5lIElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFIDEwCisgICAgCisvKiogUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/ICovCitfX3N0cm9uZyBpZCByb290OworICAgIAorLyoqIElmIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuICovCitfX3N0cm9uZyBpZCA8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworICAgIAorCS8qKiBXaGF0IHRyZWUgYWRhcHRvciB3YXMgdXNlZCB0byBidWlsZCB0aGVzZSB0cmVlcyAqLworX19zdHJvbmcgQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKKyAgICAKKy8qKiBUaGUgdHJlZSBpdGVyYXRvciB3ZSB1c2luZyAqLworX19zdHJvbmcgQU5UTFJUcmVlSXRlcmF0b3IgKml0OworICAgIAorLyoqIFN0YWNrIG9mIGluZGV4ZXMgdXNlZCBmb3IgcHVzaC9wb3AgY2FsbHMgKi8KK19fc3Ryb25nIEFOVExSSW50QXJyYXkgKmNhbGxzOyAgICAKKyAgICAKKy8qKiBUcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zICovCitCT09MIGhhc05pbFJvb3Q7CisgICAgCisvKiogVHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC4gKi8KK05TSW50ZWdlciBsZXZlbDsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Um9vdCwgc2V0dGVyPXNldFJvb3Q6KSBBTlRMUkNvbW1vblRyZWUgKnJvb3Q7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VucyxzZXR0ZXI9c2V0VG9rZW5zOikgaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5zOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlQWRhcHRvciwgc2V0dGVyPXNldFRyZWVBZGFwdG9yOikgQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvcjsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0TGV2ZWwsIHNldHRlcj1zZXRMZXZlbDopIE5TSW50ZWdlciBsZXZlbDsKKworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlOworKyAoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKyAgICAKKy0gKHZvaWQpIHJlc2V0OworICAgIAorICAgIC8qKiBQdWxsIGVsZW1lbnRzIGZyb20gdHJlZSBpdGVyYXRvci4gIFRyYWNrIHRyZWUgbGV2ZWwgMC4ubWF4X2xldmVsLgorICAgICAqICBJZiBuaWwgcm9vdGVkIHRyZWUsIGRvbid0IGdpdmUgaW5pdGlhbCBuaWwgYW5kIERPV04gbm9yIGZpbmFsIFVQLgorICAgICAqLworLSAoaWQpIG5leHRFbGVtZW50OworICAgIAorLSAoQk9PTCkgaXNFT0Y6KGlkPEFOVExSQmFzZVRyZWU+KSBvYmo7CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpIHVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKyAgICAKKy0gKGlkKSBnZXRUcmVlU291cmNlOworICAgIAorLSAoTlNTdHJpbmcgKikgZ2V0U291cmNlTmFtZTsKKyAgICAKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRUb2tlblN0cmVhbTsKKyAgICAKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPikgdG9rZW5zOworICAgIAorLSAoQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKSBnZXRUcmVlQWRhcHRvcjsKKyAgICAKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopIGFkYXB0b3I7CisgICAgCistIChOU0ludGVnZXIpIExBOihOU0ludGVnZXIpIGk7CisgICAgCisgICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCisgICAgICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXROb2RlOihOU0ludGVnZXIpIGk7CisKKy0gKHZvaWQpIHB1c2g6KE5TSW50ZWdlcikgaW5kZXg7CisgICAgCisgICAgLyoqIFNlZWsgYmFjayB0byBwcmV2aW91cyBpbmRleCBzYXZlZCBkdXJpbmcgbGFzdCBwdXNoKCkgY2FsbC4KKyAgICAgKiAgUmV0dXJuIHRvcCBvZiBzdGFjayAocmV0dXJuIGluZGV4KS4KKyAgICAgKi8KKy0gKE5TSW50ZWdlcikgcG9wOworICAgIAorLy8gVFJFRSBSRVdSSVRFIElOVEVSRkFDRQorICAgIAorLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuOihpZClwYXJlbnQgRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKSB0OworICAgIAorLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pc3RhcnROb2RlIFRvTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pc3RvcE5vZGU7CisKKy8qKiBGb3IgZGVidWdnaW5nOyBkZXN0cnVjdGl2ZTogbW92ZXMgdHJlZSBpdGVyYXRvciB0byBlbmQuICovCistIChOU1N0cmluZyAqKSB0b1Rva2VuVHlwZVN0cmluZzsKKworQHByb3BlcnR5IChyZXRhaW4pIEFOVExSVHJlZUl0ZXJhdG9yICppdDsKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTlRMUkludEFycmF5ICpjYWxsczsKK0Bwcm9wZXJ0eSBCT09MIGhhc05pbFJvb3Q7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZGRlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubQpAQCAtMCwwICsxLDI0OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKyNpbXBvcnQgIkFNdXRhYmxlQXJyYXkuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKworI2lmbmRlZiBERUJVR19ERUFMTE9DCisjZGVmaW5lIERFQlVHX0RFQUxMT0MKKyNlbmRpZgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbQorCitAc3ludGhlc2l6ZSByb290OworQHN5bnRoZXNpemUgdG9rZW5zOworQHN5bnRoZXNpemUgYWRhcHRvcjsKK0BzeW50aGVzaXplIGxldmVsOworCisrIChBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtICopIG5ld0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW06KEFOVExSQ29tbW9uVHJlZSAqKXRoZVRyZWUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRyZWU6dGhlVHJlZV07Cit9CisKKysgKEFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0gKikgbmV3QU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yIFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKXRoZVRyZWUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRyZWVBZGFwdG9yOmFuQWRhcHRvciBUcmVlOnRoZVRyZWVdOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwgKSB7CisgICAgICAgIGFkYXB0b3IgPSBbW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdIHJldGFpbl07CisgICAgICAgIHJvb3QgPSBbdGhlVHJlZSByZXRhaW5dOworICAgICAgICBuYXZpZ2F0aW9uTm9kZUVPRiA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXSByZXRhaW5dOyAvLyBzZXQgRU9GCisgICAgICAgIGl0ID0gW1tBTlRMUlRyZWVJdGVyYXRvciBuZXdBTlRSTFRyZWVJdGVyYXRvcldpdGhBZGFwdG9yOmFkYXB0b3IgYW5kVHJlZTpyb290XSByZXRhaW5dOworICAgICAgICBjYWxscyA9IFtbQU5UTFJJbnRBcnJheSBuZXdBcnJheVdpdGhMZW46SU5JVElBTF9DQUxMX1NUQUNLX1NJWkVdIHJldGFpbl07CisgICAgICAgIC8qKiBUcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zICovCisgICAgICAgIGhhc05pbFJvb3QgPSBOTzsKKyAgICAgICAgbGV2ZWwgPSAwOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvciBUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwgKSB7CisgICAgICAgIGFkYXB0b3IgPSBbYW5BZGFwdG9yIHJldGFpbl07CisgICAgICAgIHJvb3QgPSBbdGhlVHJlZSByZXRhaW5dOworICAgICAgICBuYXZpZ2F0aW9uTm9kZUVPRiA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXSByZXRhaW5dOyAvLyBzZXQgRU9GCisgICAgICAgIC8vICAgIGl0ID0gW3Jvb3Qgb2JqZWN0RW51bWVyYXRvcl07CisgICAgICAgIGl0ID0gW1tBTlRMUlRyZWVJdGVyYXRvciBuZXdBTlRSTFRyZWVJdGVyYXRvcldpdGhBZGFwdG9yOmFkYXB0b3IgYW5kVHJlZTpyb290XSByZXRhaW5dOworICAgICAgICBjYWxscyA9IFtbQU5UTFJJbnRBcnJheSBuZXdBcnJheVdpdGhMZW46SU5JVElBTF9DQUxMX1NUQUNLX1NJWkVdIHJldGFpbl07CisgICAgICAgIC8qKiBUcmVlIChuaWwgQSBCIEMpIHRyZWVzIGxpa2UgZmxhdCBBIEIgQyBzdHJlYW1zICovCisgICAgICAgIGhhc05pbFJvb3QgPSBOTzsKKyAgICAgICAgbGV2ZWwgPSAwOworICAgIH0KKyAgICAvLyAgICBlb2YgPSBbc2VsZiBpc0VPRl07IC8vIG1ha2Ugc3VyZSB0cmVlIGl0ZXJhdG9yIHJldHVybnMgdGhlIEVPRiB3ZSB3YW50CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIiApOworI2VuZGlmCisgICAgaWYgKCByb290ICkgW3Jvb3QgcmVsZWFzZV07CisgICAgaWYgKCB0b2tlbnMgKSBbdG9rZW5zIHJlbGVhc2VdOworICAgIGlmICggYWRhcHRvciApIFthZGFwdG9yIHJlbGVhc2VdOworICAgIGlmICggaXQgKSBbaXQgcmVsZWFzZV07CisgICAgaWYgKCBjYWxscyApIFtjYWxscyByZWxlYXNlXTsgICAgCisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistICh2b2lkKSByZXNldAoreworICAgIFtzdXBlciByZXNldF07CisgICAgW2l0IHJlc2V0XTsKKyAgICBoYXNOaWxSb290ID0gZmFsc2U7CisgICAgbGV2ZWwgPSAwOworICAgIGlmICggY2FsbHMgIT0gbmlsICkKKyAgICAgICAgW2NhbGxzIHJlc2V0XTsgIC8vIFtjYWxscyBjbGVhcl07IC8vIGluIEphdmEKK30KKworLyoqIFB1bGwgZWxlbWVudHMgZnJvbSB0cmVlIGl0ZXJhdG9yLiAgVHJhY2sgdHJlZSBsZXZlbCAwLi5tYXhfbGV2ZWwuCisgKiAgSWYgbmlsIHJvb3RlZCB0cmVlLCBkb24ndCBnaXZlIGluaXRpYWwgbmlsIGFuZCBET1dOIG5vciBmaW5hbCBVUC4KKyAqLworLSAoaWQpIG5leHRFbGVtZW50Cit7CisgICAgaWQgdCA9IFtpdCBuZXh0T2JqZWN0XTsKKyAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicHVsbGVkICIrYWRhcHRvci5nZXRUeXBlKHQpKTsKKyAgICBpZiAoIHQgPT0gW2l0IHVwXSApIHsKKyAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgaWYgKCBsZXZlbD09MCAmJiBoYXNOaWxSb290ICkgcmV0dXJuIFtpdCBuZXh0T2JqZWN0XTsgLy8gZG9uJ3QgZ2l2ZSBsYXN0IFVQOyBnZXQgRU9GCisgICAgfQorICAgIGVsc2UgaWYgKCB0ID09IFtpdCBkb3duXSApCisgICAgICAgIGxldmVsKys7CisgICAgaWYgKCBsZXZlbCA9PSAwICYmIFthZGFwdG9yIGlzTmlsOnRdICkgeyAvLyBpZiBuaWwgcm9vdCwgc2NhcmYgbmlsLCBET1dOCisgICAgICAgIGhhc05pbFJvb3QgPSB0cnVlOworICAgICAgICB0ID0gW2l0IG5leHRPYmplY3RdOyAvLyB0IGlzIG5vdyBET1dOLCBzbyBnZXQgZmlyc3QgcmVhbCBub2RlIG5leHQKKyAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgdCA9IFtpdCBuZXh0T2JqZWN0XTsKKyAgICB9CisgICAgcmV0dXJuIHQ7Cit9CisKKy0gKEJPT0wpIGlzRU9GOihpZDxBTlRMUkJhc2VUcmVlPikgYVRyZWUKK3sKKyAgICByZXR1cm4gW2FkYXB0b3IgZ2V0VHlwZTooQU5UTFJDb21tb25UcmVlICopYVRyZWVdID09IEFOVExSVG9rZW5UeXBlRU9GOworfQorCistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpIHVuaXF1ZU5hdmlnYXRpb25Ob2RlcworeworfQorCistIChpZCkgZ2V0VHJlZVNvdXJjZQoreworICAgIHJldHVybiByb290OworfQorCistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlblN0cmVhbV0gZ2V0U291cmNlTmFtZV07Cit9CisKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRUb2tlblN0cmVhbQoreworICAgIHJldHVybiB0b2tlbnM7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVUb2tlbnMKK3sKKyAgICBpZiAoIHRva2VucyAhPSB0aGVUb2tlbnMgKSB7CisgICAgICAgIGlmICggdG9rZW5zICkgW3Rva2VucyByZWxlYXNlXTsKKyAgICAgICAgW3RoZVRva2VucyByZXRhaW5dOworICAgIH0KKyAgICB0b2tlbnMgPSB0aGVUb2tlbnM7Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKikgZ2V0VHJlZUFkYXB0b3IKK3sKKyAgICByZXR1cm4gYWRhcHRvcjsKK30KKworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKikgYW5BZGFwdG9yCit7CisgICAgaWYgKCBhZGFwdG9yICE9IGFuQWRhcHRvciApIHsKKyAgICAgICAgaWYgKCBhZGFwdG9yICkgW2FkYXB0b3IgcmVsZWFzZV07CisgICAgICAgIFthbkFkYXB0b3IgcmV0YWluXTsKKyAgICB9CisgICAgYWRhcHRvciA9IGFuQWRhcHRvcjsKK30KKworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0Tm9kZTooTlNJbnRlZ2VyKSBpCit7CisgICAgQHRocm93IFtBTlRMUlJ1bnRpbWVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAiQWJzb2x1dGUgbm9kZSBpbmRleGVzIGFyZSBtZWFuaW5nbGVzcyBpbiBhbiB1bmJ1ZmZlcmVkIHN0cmVhbSJdOworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKE5TSW50ZWdlcikgTEE6KE5TSW50ZWdlcikgaQoreworICAgIHJldHVybiBbYWRhcHRvciBnZXRUeXBlOltzZWxmIExUOmldXTsKK30KKworLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCisgKiAgU3dpdGNoIGJhY2sgd2l0aCBwb3AoKS4KKyAqLworLSAodm9pZCkgcHVzaDooTlNJbnRlZ2VyKSBhbkluZGV4Cit7CisgICAgaWYgKCBjYWxscyA9PSBuaWwgKSB7CisgICAgICAgIGNhbGxzID0gW1tBTlRMUkludEFycmF5IG5ld0FycmF5V2l0aExlbjpJTklUSUFMX0NBTExfU1RBQ0tfU0laRV0gcmV0YWluXTsKKyAgICB9CisgICAgW2NhbGxzIHB1c2g6cF07IC8vIHNhdmUgY3VycmVudCBhbkluZGV4CisgICAgW3NlbGYgc2VlazphbkluZGV4XTsKK30KKworLyoqIFNlZWsgYmFjayB0byBwcmV2aW91cyBhbkluZGV4IHNhdmVkIGR1cmluZyBsYXN0IHB1c2goKSBjYWxsLgorICogIFJldHVybiB0b3Agb2Ygc3RhY2sgKHJldHVybiBhbkluZGV4KS4KKyAqLworLSAoTlNJbnRlZ2VyKSBwb3AKK3sKKyAgICBpbnQgcmV0ID0gW2NhbGxzIHBvcF07CisgICAgW3NlbGYgc2VlazpyZXRdOworICAgIHJldHVybiByZXQ7Cit9ICAgIAorCisvLyBUUkVFIFJFV1JJVEUgSU5URVJGQUNFCisKKy0gKHZvaWQpIHJlcGxhY2VDaGlsZHJlbjooaWQpIHBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpIGFUcmVlCit7CisgICAgaWYgKCBwYXJlbnQgIT0gbmlsICkgeworICAgICAgICBbYWRhcHRvciByZXBsYWNlQ2hpbGRyZW46cGFyZW50IEZyb206c3RhcnRDaGlsZEluZGV4IFRvOnN0b3BDaGlsZEluZGV4IFdpdGg6YVRyZWVdOworICAgIH0KK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pc3RhcnROb2RlIFRvTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pc3RvcE5vZGUKK3sKKyAgICAvLyB3ZSdsbCBoYXZlIHRvIHdhbGsgZnJvbSBzdGFydCB0byBzdG9wIGluIHRyZWU7IHdlJ3JlIG5vdCBrZWVwaW5nCisgICAgLy8gYSBjb21wbGV0ZSBub2RlIHN0cmVhbSBidWZmZXIKKyAgICByZXR1cm4gQCJuL2EiOworfQorCisvKiogRm9yIGRlYnVnZ2luZzsgZGVzdHJ1Y3RpdmU6IG1vdmVzIHRyZWUgaXRlcmF0b3IgdG8gZW5kLiAqLworLSAoTlNTdHJpbmcgKikgdG9Ub2tlblR5cGVTdHJpbmcKK3sKKyAgICBbc2VsZiByZXNldF07CisgICAgTlNNdXRhYmxlU3RyaW5nICpidWYgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhDYXBhY2l0eTo1XTsKKyAgICBpZCBvYmogPSBbc2VsZiBMVDoxXTsKKyAgICBOU0ludGVnZXIgdHlwZSA9IFthZGFwdG9yIGdldFR5cGU6b2JqXTsKKyAgICB3aGlsZSAoIHR5cGUgIT0gQU5UTFJUb2tlblR5cGVFT0YgKSB7CisgICAgICAgIFtidWYgYXBwZW5kU3RyaW5nOkAiICJdOworICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVkIiwgdHlwZV1dOworICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgb2JqID0gW3NlbGYgTFQ6MV07CisgICAgICAgIHR5cGUgPSBbYWRhcHRvciBnZXRUeXBlOm9ial07CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKK0BzeW50aGVzaXplIGl0OworQHN5bnRoZXNpemUgY2FsbHM7CitAc3ludGhlc2l6ZSBoYXNOaWxSb290OworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVUZXN0LUluZm8ucGxpc3QgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkNvbW1vblRyZWVUZXN0LUluZm8ucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4NWE0NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSQ29tbW9uVHJlZVRlc3QtSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55LiR7UFJPRFVDVF9OQU1FOnJmYzEwMzRpZGVudGlmaWVyfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Qk5ETDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MTwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSREZBLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRGQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZGVkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRGQS5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJDaGFyU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJERkEgOiBOU09iamVjdCB7CisJLy8gdGhlIHRhYmxlcyBhcmUgc2V0IGJ5IHN1YmNsYXNzZXMgdG8gdGhlaXIgb3duIHN0YXRpYyB2ZXJzaW9ucy4KKwljb25zdCBpbnQgKmVvdDsKKwljb25zdCBpbnQgKmVvZjsKKwljb25zdCB1bmljaGFyICptaW47CisJY29uc3QgdW5pY2hhciAqbWF4OworCWNvbnN0IGludCAqYWNjZXB0OworCWNvbnN0IGludCAqc3BlY2lhbDsKKwljb25zdCBpbnQgKip0cmFuc2l0aW9uOworCQorCV9fc3Ryb25nIEFOVExSQmFzZVJlY29nbml6ZXIgKnJlY29nbml6ZXI7CisJTlNJbnRlZ2VyIGRlY2lzaW9uTnVtYmVyOworICAgIE5TSW50ZWdlciBsZW47Cit9CisKKy0gKGlkKSBpbml0V2l0aFJlY29nbml6ZXI6KGlkKSB0aGVSZWNvZ25pemVyOworLy8gc2ltdWxhdGUgdGhlIERGQSB1c2luZyB0aGUgc3RhdGljIHRhYmxlcyBhbmQgcHJlZGljdCBhbiBhbHRlcm5hdGl2ZQorLSAoTlNJbnRlZ2VyKSBwcmVkaWN0OihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQ7CistICh2b2lkKSBub1ZpYWJsZUFsdDooTlNJbnRlZ2VyKXN0YXRlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CisKKy0gKE5TSW50ZWdlcikgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbjooTlNJbnRlZ2VyKXN0YXRlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CisvLyAtIChOU0ludGVnZXIpIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb246KE5TSW50ZWdlcikgc3RhdGU7CisvLy0gKHVuaWNoYXIpIHNwZWNpYWxUcmFuc2l0aW9uOih1bmljaGFyKSBzdGF0ZSBzeW1ib2w6KE5TSW50ZWdlcikgc3ltYm9sOworCisvLyBob29rIGZvciBkZWJ1Z2dlciBzdXBwb3J0CistICh2b2lkKSBlcnJvcjooQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqKW52YWU7CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworLSAoQk9PTCkgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6KFNFTClzeW5wcmVkRnJhZ21lbnQ7CisKKysgKHZvaWQpIHNldElzRW1pdHRpbmdEZWJ1Z0luZm86KEJPT0wpIHNob3VsZEVtaXREZWJ1Z0luZm87CisKKy0gKE5TSW50ZWdlcilnZXREZWNpc2lvbjsKKy0gKHZvaWQpc2V0RGVjaXNpb246KE5TSW50ZWdlcilhRGVjaXNvbjsKKworLSAoQU5UTFJCYXNlUmVjb2duaXplciAqKWdldFJlY29nbml6ZXI7CistICh2b2lkKXNldFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilhUmVjb2duaXplcjsKKy0gKE5TSW50ZWdlcilsZW5ndGg7CisKK0Bwcm9wZXJ0eSBjb25zdCBpbnQgKmVvdDsKK0Bwcm9wZXJ0eSBjb25zdCBpbnQgKmVvZjsKK0Bwcm9wZXJ0eSBjb25zdCB1bmljaGFyICptaW47CitAcHJvcGVydHkgY29uc3QgdW5pY2hhciAqbWF4OworQHByb3BlcnR5IGNvbnN0IGludCAqYWNjZXB0OworQHByb3BlcnR5IGNvbnN0IGludCAqc3BlY2lhbDsKK0Bwcm9wZXJ0eSBjb25zdCBpbnQgKip0cmFuc2l0aW9uOworCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFJlY29nbml6ZXIsc2V0dGVyPXNldFJlY29nbml6ZXI6KSBBTlRMUkJhc2VSZWNvZ25pemVyICpyZWNvZ25pemVyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXREZWNpc2lvbixzZXR0ZXI9c2V0RGVjaXNpb246KSBOU0ludGVnZXIgZGVjaXNpb25OdW1iZXI7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldExlbixzZXR0ZXI9c2V0TGVuOikgTlNJbnRlZ2VyIGxlbjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSREZBLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRGQS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRGQS5tCkBAIC0wLDAgKzEsMjYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJERkEuaCIKKyNpbXBvcnQgPEFOVExSVG9rZW4uaD4KKyNpbXBvcnQgPEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKworTlNJbnRlZ2VyIGRlYnVnID0gMDsKKworQGltcGxlbWVudGF0aW9uIEFOVExSREZBCitAc3ludGhlc2l6ZSByZWNvZ25pemVyOworQHN5bnRoZXNpemUgZGVjaXNpb25OdW1iZXI7CitAc3ludGhlc2l6ZSBsZW47CisKKy0gKGlkKSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKikgdGhlUmVjb2duaXplcgoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisJCXJlY29nbml6ZXIgPSB0aGVSZWNvZ25pemVyOworICAgICAgICBbcmVjb2duaXplciByZXRhaW5dOworICAgICAgICBkZWJ1ZyA9IDA7CisJfQorCXJldHVybiBzZWxmOworfQorCisvLyB1c2luZyB0aGUgdGFibGVzIEFOVExSIGdlbmVyYXRlcyBmb3IgdGhlIERGQSBiYXNlZCBwcmVkaWN0aW9uIHRoaXMgbWV0aG9kIHNpbXVsYXRlcyB0aGUgREZBCisvLyBhbmQgcmV0dXJucyB0aGUgcHJlZGljdGlvbiBvZiB0aGUgYWx0ZXJuYXRpdmUgdG8gYmUgdXNlZC4KKy0gKE5TSW50ZWdlcikgcHJlZGljdDooaWQ8QU5UTFJJbnRTdHJlYW0+KWlucHV0Cit7CisgICAgaWYgKCBkZWJ1ZyA+IDIgKSB7CisgICAgICAgIE5TTG9nKEAiRW50ZXIgREZBLnByZWRpY3QgZm9yIGRlY2lzaW9uICVkIiwgZGVjaXNpb25OdW1iZXIpOworICAgIH0KKwlpbnQgYU1hcmsgPSBbaW5wdXQgbWFya107CisJaW50IHMgPSAwOworCUB0cnkgeworCQl3aGlsZSAoWUVTKSB7CisJCQlpZiAoIGRlYnVnID4gMiApCisgICAgICAgICAgICAgICAgTlNMb2coQCJERkEgJWQgc3RhdGUgJWQgTEEoMSk9JyVjJygleCkiLCBkZWNpc2lvbk51bWJlciwgcywgKHVuaWNoYXIpW2lucHV0IExBOjFdLCBbaW5wdXQgTEE6MV0pOworCQkJTlNJbnRlZ2VyIHNwZWNpYWxTdGF0ZSA9IHNwZWNpYWxbc107CisJCQlpZiAoc3BlY2lhbFN0YXRlID49IDApIHsKKwkJCQkvLyB0aGlzIHN0YXRlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBoYXMgc29tZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4gd2UgY2Fubm90IGRvIHRoaXMgaW4gYSBwdXJlIERGQSBzbworCQkJCS8vIHdlIHNpZ25hbCB0aGUgY2FsbGVyIGFjY29yZGluZ2x5LgorCQkJCWlmICggZGVidWcgPiAyICkgeworICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkRGQSAlZCBzdGF0ZSAlZCBpcyBzcGVjaWFsIHN0YXRlICVkIiwgZGVjaXNpb25OdW1iZXIsIHMsIHNwZWNpYWxTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorCQkJCXMgPSBbc2VsZiBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uOnNwZWNpYWxTdGF0ZSBTdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgIGlmICggZGVidWcgPiAyICkgeworICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkRGQSAlZCByZXR1cm5zIGZyb20gc3BlY2lhbCBzdGF0ZSAlZCB0byAlZCIsIGRlY2lzaW9uTnVtYmVyLCBzcGVjaWFsU3RhdGUsIHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocyA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbm9WaWFibGVBbHQ6cyBTdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisJCQkJW2lucHV0IGNvbnN1bWVdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGFjY2VwdFtzXSA+PSAxKSB7ICAvLyBpZiB0aGlzIGlzIGFuIGFjY2VwdGluZyBzdGF0ZSByZXR1cm4gdGhlIHByZWRpY3Rpb24KKwkJCQlpZiAoIGRlYnVnID4gMiApIE5TTG9nKEAiYWNjZXB0OyBwcmVkaWN0ICVkIGZyb20gc3RhdGUgJWQiLCBhY2NlcHRbc10sIHMpOworCQkJCXJldHVybiBhY2NlcHRbc107CisJCQl9CisJCQkvLyBiYXNlZCBvbiB0aGUgbG9va2FoZWFkIGxvb2t1cCB0aGUgbmV4dCB0cmFuc2l0aW9uLCBjb25zdW1lIGFuZCBkbyB0cmFuc2l0aW9uCisJCQkvLyBvciBzaWduYWwgdGhhdCB3ZSBoYXZlIG5vIHZpYWJsZSBhbHRlcm5hdGl2ZQorCQkJaW50IGMgPSBbaW5wdXQgTEE6MV07CisJCQlpZiAoICh1bmljaGFyKWMgPj0gbWluW3NdICYmICh1bmljaGFyKWMgPD0gbWF4W3NdKSB7CisJCQkJaW50IHNuZXh0ID0gdHJhbnNpdGlvbltzXVtjLW1pbltzXV07CisJCQkJaWYgKHNuZXh0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3YXMgaW4gcmFuZ2UgYnV0IG5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgY2hlY2sgRU9ULCB3aGljaCBpcyBsaWtlIHRoZSBlbHNlIGNsYXVzZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gZW90W3NdPj0wIGluZGljYXRlcyB0aGF0IGFuIEVPVCBlZGdlIGdvZXMgdG8gYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZS4KKwkJCQkJaWYgKGVvdFtzXSA+PSAwKSB7CisJCQkJCQlpZiAoIGRlYnVnID4gMiApIE5TTG9nKEAiRU9UIHRyYW5zaXRpb24iKTsKKwkJCQkJCXMgPSBlb3Rbc107CisJCQkJCQlbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBJIGhhZCB0aGlzIGFzIHJldHVybiBhY2NlcHRbZW90W3NdXQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYXNzdW1lZCBoZXJlIHRoYXQgdGhlIEVPVCBlZGdlIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VudCB0byBhbiBhY2NlcHQuLi5mYXN0ZXIgdG8gZG8gdGhpcywgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGFib3V0IHByZWRpY2F0ZWQgZWRnZXMgY29taW5nIGZyb20gRU9UCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQ/CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlbc2VsZiBub1ZpYWJsZUFsdDpzIFN0cmVhbTppbnB1dF07CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlzID0gc25leHQ7CisJCQkJW2lucHV0IGNvbnN1bWVdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisJCQlpZiAoZW90W3NdID49IDApIHsvLyBFT1QgdHJhbnNpdGlvbj8gd2UgbWF5IHN0aWxsIGFjY2VwdCB0aGUgaW5wdXQgaW4gdGhlIG5leHQgc3RhdGUKKwkJCQlpZiAoIGRlYnVnID4gMiApIE5TTG9nKEAiRU9UIHRyYW5zaXRpb24iKTsKKwkJCQlzID0gZW90W3NdOworCQkJCVtpbnB1dCBjb25zdW1lXTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICggYyA9PSBBTlRMUlRva2VuVHlwZUVPRiAmJiBlb2Zbc10gPj0gMCkgeyAgLy8gd2UgYXJlIGF0IEVPRiBhbmQgbWF5IGV2ZW4gYWNjZXB0IHRoZSBpbnB1dC4KKwkJCQlpZiAoIGRlYnVnID4gMiApIE5TTG9nKEAiYWNjZXB0IHZpYSBFT0Y7IHByZWRpY3QgJWQgZnJvbSAlZCIsIGFjY2VwdFtlb2Zbc11dLCBlb2Zbc10pOworCQkJCXJldHVybiBhY2NlcHRbZW9mW3NdXTsKKwkJCX0KKwkJCWlmICggZGVidWcgPiAyICkgeworICAgICAgICAgICAgICAgIE5TTG9nKEAibm8gdmlhYmxlIGFsdCFcbiIpOworICAgICAgICAgICAgICAgIE5TTG9nKEAibWluWyVkXSA9ICVkXG4iLCBzLCBtaW5bc10pOworICAgICAgICAgICAgICAgIE5TTG9nKEAibWF4WyVkXSA9ICVkXG4iLCBzLCBtaW5bc10pOworICAgICAgICAgICAgICAgIE5TTG9nKEAiZW90WyVkXSA9ICVkXG4iLCBzLCBtaW5bc10pOworICAgICAgICAgICAgICAgIE5TTG9nKEAiZW9mWyVkXSA9ICVkXG4iLCBzLCBtaW5bc10pOworICAgICAgICAgICAgICAgIGZvciAoTlNJbnRlZ2VyIHAgPSAwOyBwIDwgc2VsZi5sZW47IHArKykgeworICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIiVkICIsIHRyYW5zaXRpb25bc11bcF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBOU0xvZyhAIlxuIik7CisgICAgICAgICAgICB9CisJCQlbc2VsZiBub1ZpYWJsZUFsdDpzIFN0cmVhbTppbnB1dF07CisgICAgICAgICAgICByZXR1cm4gMDsKKwkJfQorCX0KKwlAZmluYWxseSB7CisJCVtpbnB1dCByZXdpbmQ6YU1hcmtdOworCX0KKwlyZXR1cm4gMDsgLy8gc2lsZW5jZSB3YXJuaW5nCit9CisKKy0gKHZvaWQpIG5vVmlhYmxlQWx0OihOU0ludGVnZXIpc3RhdGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworCWlmIChbcmVjb2duaXplci5zdGF0ZSBpc0JhY2t0cmFja2luZ10pIHsKKwkJW3JlY29nbml6ZXIuc3RhdGUgc2V0RmFpbGVkOllFU107CisJCXJldHVybjsKKwl9CisJQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpkZWNpc2lvbk51bWJlciBzdGF0ZTpzdGF0ZSBzdHJlYW06YW5JbnB1dF07CisJW3NlbGYgZXJyb3I6bnZhZV07CisJQHRocm93IG52YWU7Cit9CisKKy0gKE5TSW50ZWdlcikgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbjooTlNJbnRlZ2VyKXN0YXRlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICBAdGhyb3cgW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOi0xIHN0YXRlOnN0YXRlIHN0cmVhbTphbklucHV0XTsKKwlyZXR1cm4gLTE7Cit9CisKKy0gKHZvaWQpIGVycm9yOihBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICopbnZhZQoreworCS8vIGVtcHR5LCBob29rIGZvciBkZWJ1Z2dlciBzdXBwb3J0Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisJcmV0dXJuIEAic3ViY2xhc3MgcmVzcG9uc2liaWxpdHkiOworfQorCistIChCT09MKSBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTooU0VMKXN5bnByZWRGcmFnbWVudAoreworCXJldHVybiBbcmVjb2duaXplciBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpzeW5wcmVkRnJhZ21lbnRdOworfQorCisrICh2b2lkKSBzZXRJc0VtaXR0aW5nRGVidWdJbmZvOihCT09MKSBzaG91bGRFbWl0RGVidWdJbmZvCit7CisJZGVidWcgPSBzaG91bGRFbWl0RGVidWdJbmZvOworfQorCisvKiogR2l2ZW4gYSBTdHJpbmcgdGhhdCBoYXMgYSBydW4tbGVuZ3RoLWVuY29kaW5nIG9mIHNvbWUgdW5zaWduZWQgc2hvcnRzCisgKiAgbGlrZSAiXDFcMlwzXDkiLCBjb252ZXJ0IHRvIHNob3J0W10gezIsOSw5LDl9LiAgV2UgZG8gdGhpcyB0byBhdm9pZAorICogIHN0YXRpYyBzaG9ydFtdIHdoaWNoIGdlbmVyYXRlcyBzbyBtdWNoIGluaXQgY29kZSB0aGF0IHRoZSBjbGFzcyB3b24ndAorICogIGNvbXBpbGUuIDooCisgKi8KKy0gKHNob3J0ICopIHVucGFja0VuY29kZWRTdHJpbmc6KE5TU3RyaW5nICopZW5jb2RlZFN0cmluZworeworICAgIC8vIHdhbGsgZmlyc3QgdG8gZmluZCBob3cgYmlnIGl0IGlzLgorICAgIGludCBzaXplID0gMDsKKyAgICBmb3IgKGludCBpPTA7IGkgPCBbZW5jb2RlZFN0cmluZyBsZW5ndGhdOyBpKz0yKSB7CisgICAgICAgIHNpemUgKz0gW2VuY29kZWRTdHJpbmcgY2hhcmFjdGVyQXRJbmRleDppXTsKKyAgICB9CisgICAgX19zdHJvbmcgc2hvcnQgKmRhdGEgPSAoc2hvcnQgKiljYWxsb2Moc2l6ZSwgc2l6ZW9mKHNob3J0KSk7CisgICAgaW50IGRpID0gMDsKKyAgICBmb3IgKGludCBpPTA7IGkgPCBbZW5jb2RlZFN0cmluZyBsZW5ndGhdOyBpKz0yKSB7CisgICAgICAgIGNoYXIgbiA9IFtlbmNvZGVkU3RyaW5nIGNoYXJhY3RlckF0SW5kZXg6aV07CisgICAgICAgIGNoYXIgdiA9IFtlbmNvZGVkU3RyaW5nIGNoYXJhY3RlckF0SW5kZXg6aSsxXTsKKyAgICAgICAgLy8gYWRkIHYgbiB0aW1lcyB0byBkYXRhCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICBkYXRhW2RpKytdID0gdjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YTsKK30KKworLyoqIEhpZGVvdXMgZHVwbGljYXRpb24gb2YgY29kZSwgYnV0IEkgbmVlZCBkaWZmZXJlbnQgdHlwZWQgYXJyYXlzIG91dCA6KCAqLworLSAoY2hhciAqKSB1bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzOihOU1N0cmluZyAqKWVuY29kZWRTdHJpbmcKK3sKKyAgICAvLyB3YWxrIGZpcnN0IHRvIGZpbmQgaG93IGJpZyBpdCBpcy4KKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaT0wOyBpIDwgW2VuY29kZWRTdHJpbmcgbGVuZ3RoXTsgaSs9MikgeworICAgICAgICBzaXplICs9IFtlbmNvZGVkU3RyaW5nIGNoYXJhY3RlckF0SW5kZXg6aV07CisgICAgfQorICAgIF9fc3Ryb25nIHNob3J0ICpkYXRhID0gKHNob3J0ICopY2FsbG9jKHNpemUsIHNpemVvZihzaG9ydCkpOworICAgIGludCBkaSA9IDA7CisgICAgZm9yIChpbnQgaT0wOyBpIDwgW2VuY29kZWRTdHJpbmcgbGVuZ3RoXTsgaSs9MikgeworICAgICAgICBjaGFyIG4gPSBbZW5jb2RlZFN0cmluZyBjaGFyYWN0ZXJBdEluZGV4OmldOworICAgICAgICBjaGFyIHYgPSBbZW5jb2RlZFN0cmluZyBjaGFyYWN0ZXJBdEluZGV4OmkrMV07CisgICAgICAgIC8vIGFkZCB2IG4gdGltZXMgdG8gZGF0YQorICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgeworICAgICAgICAgICAgZGF0YVtkaSsrXSA9IHY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChjaGFyICopZGF0YTsKK30KKworLSAoTlNJbnRlZ2VyKWdldERlY2lzaW9uCit7CisgICAgcmV0dXJuIGRlY2lzaW9uTnVtYmVyOworfQorCistICh2b2lkKXNldERlY2lzaW9uOihOU0ludGVnZXIpYURlY2lzb24KK3sKKyAgICBkZWNpc2lvbk51bWJlciA9IGFEZWNpc29uOworfQorCistIChBTlRMUkJhc2VSZWNvZ25pemVyICopZ2V0UmVjb2duaXplcgoreworICAgIHJldHVybiByZWNvZ25pemVyOworfQorCistICh2b2lkKXNldFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilhUmVjb2duaXplcgoreworICAgIGlmICggcmVjb2duaXplciAhPSBhUmVjb2duaXplciApIHsKKyAgICAgICAgaWYgKCByZWNvZ25pemVyICkgW3JlY29nbml6ZXIgcmVsZWFzZV07CisgICAgICAgIFthUmVjb2duaXplciByZXRhaW5dOworICAgIH0KKyAgICByZWNvZ25pemVyID0gYVJlY29nbml6ZXI7Cit9CisKKy0gKE5TSW50ZWdlcilsZW5ndGgKK3sKKyAgICByZXR1cm4gbGVuOworfQorCitAc3ludGhlc2l6ZSBlb3Q7CitAc3ludGhlc2l6ZSBlb2Y7CitAc3ludGhlc2l6ZSBtaW47CitAc3ludGhlc2l6ZSBtYXg7CitAc3ludGhlc2l6ZSBhY2NlcHQ7CitAc3ludGhlc2l6ZSBzcGVjaWFsOworQHN5bnRoZXNpemUgdHJhbnNpdGlvbjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWcuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM4M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Zy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudFByb3h5LmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSRGVidWdUcmVlUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSRGVidWdUcmVlQWRhcHRvci5oIgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiZWU2YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQHByb3RvY29sIEFOVExSRGVidWdFdmVudExpc3RlbmVyIAorCisjZGVmaW5lIEFOVExSRGVidWdQcm90b2NvbFZlcnNpb24gMQorCisvKiogVGhlIHBhcnNlciBoYXMganVzdCBlbnRlcmVkIGEgcnVsZS4gIE5vIGRlY2lzaW9uIGhhcyBiZWVuIG1hZGUgYWJvdXQKKyogIHdoaWNoIGFsdCBpcyBwcmVkaWN0ZWQuICBUaGlzIGlzIGZpcmVkIEFGVEVSIGluaXQgYWN0aW9ucyBoYXZlIGJlZW4KKyogIGV4ZWN1dGVkLiAgQXR0cmlidXRlcyBhcmUgZGVmaW5lZCBhbmQgYXZhaWxhYmxlIGV0Yy4uLgorKi8KKy0gKHZvaWQpIGVudGVyUnVsZTooTlNTdHJpbmcgKilydWxlTmFtZTsKKworLyoqIEJlY2F1c2UgcnVsZXMgY2FuIGhhdmUgbG90cyBvZiBhbHRlcm5hdGl2ZXMsIGl0IGlzIHZlcnkgdXNlZnVsIHRvCisqICBrbm93IHdoaWNoIGFsdCB5b3UgYXJlIGVudGVyaW5nLiAgVGhpcyBpcyAxLi5uIGZvciBuIGFsdHMuCisqLworLSAodm9pZCkgZW50ZXJBbHQ6KE5TSW50ZWdlcilhbHQ7CisKKy8qKiBUaGlzIGlzIHRoZSBsYXN0IHRoaW5nIGV4ZWN1dGVkIGJlZm9yZSBsZWF2aW5nIGEgcnVsZS4gIEl0IGlzCisqICBleGVjdXRlZCBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBUaGlzIGlzIHRyaWdnZXJlZCBhZnRlcgorKiAgZXJyb3IgcmVwb3J0aW5nIGFuZCByZWNvdmVyeSBoYXZlIG9jY3VycmVkICh1bmxlc3MgdGhlIGV4Y2VwdGlvbiBpcworCQkJCQkJCQkJCQkgICAqICBub3QgY2F1Z2h0IGluIHRoaXMgcnVsZSkuICBUaGlzIGltcGxpZXMgYW4gImV4aXRBbHQiIGV2ZW50LgorKi8KKy0gKHZvaWQpIGV4aXRSdWxlOihOU1N0cmluZyAqKXJ1bGVOYW1lOworCisvKiogVHJhY2sgZW50cnkgaW50byBhbnkgKC4uLikgc3VicnVsZSBvdGhlciBFQk5GIGNvbnN0cnVjdCAqLworLSAodm9pZCkgZW50ZXJTdWJSdWxlOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisKKy0gKHZvaWQpIGV4aXRTdWJSdWxlOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisKKy8qKiBFdmVyeSBkZWNpc2lvbiwgZml4ZWQgayBvciBhcmJpdHJhcnksIGhhcyBhbiBlbnRlci9leGl0IGV2ZW50CisqICBzbyB0aGF0IGEgR1VJIGNhbiBlYXNpbHkgdHJhY2sgd2hhdCBMVC9jb25zdW1lIGV2ZW50cyBhcmUKKyogIGFzc29jaWF0ZWQgd2l0aCBwcmVkaWN0aW9uLiAgWW91IHdpbGwgc2VlIGEgc2luZ2xlIGVudGVyL2V4aXQKKyogIHN1YnJ1bGUgYnV0IG11bHRpcGxlIGVudGVyL2V4aXQgZGVjaXNpb24gZXZlbnRzLCBvbmUgZm9yIGVhY2gKKyogIGxvb3AgaXRlcmF0aW9uLgorKi8KKy0gKHZvaWQpIGVudGVyRGVjaXNpb246KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcjsKKworLSAodm9pZCkgZXhpdERlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CisKKy8qKiBBbiBpbnB1dCB0b2tlbiB3YXMgY29uc3VtZWQ7IG1hdGNoZWQgYnkgYW55IGtpbmQgb2YgZWxlbWVudC4KKyogIFRyaWdnZXIgYWZ0ZXIgdGhlIHRva2VuIHdhcyBtYXRjaGVkIGJ5IHRoaW5ncyBsaWtlIG1hdGNoKCksIG1hdGNoQW55KCkuCisqLworLSAodm9pZCkgY29uc3VtZVRva2VuOihpZDxBTlRMUlRva2VuPil0OworCisvKiogQW4gb2ZmLWNoYW5uZWwgaW5wdXQgdG9rZW4gd2FzIGNvbnN1bWVkLgorKiAgVHJpZ2dlciBhZnRlciB0aGUgdG9rZW4gd2FzIG1hdGNoZWQgYnkgdGhpbmdzIGxpa2UgbWF0Y2goKSwgbWF0Y2hBbnkoKS4KKyogICh1bmxlc3Mgb2YgY291cnNlIHRoZSBoaWRkZW4gdG9rZW4gaXMgZmlyc3Qgc3R1ZmYgaW4gdGhlIGlucHV0IHN0cmVhbSkuCisqLworLSAodm9pZCkgY29uc3VtZUhpZGRlblRva2VuOihpZDxBTlRMUlRva2VuPil0OworCisvKiogU29tZWJvZHkgKGFueWJvZHkpIGxvb2tlZCBhaGVhZC4gIE5vdGUgdGhhdCB0aGlzIGFjdHVhbGx5IGdldHMKKyogIHRyaWdnZXJlZCBieSBib3RoIExBIGFuZCBMVCBjYWxscy4gIFRoZSBkZWJ1Z2dlciB3aWxsIHdhbnQgdG8ga25vdworKiAgd2hpY2ggVG9rZW4gb2JqZWN0IHdhcyBleGFtaW5lZC4gIExpa2UgY29uc3VtZVRva2VuLCB0aGlzIGluZGljYXRlcworKiAgd2hhdCB0b2tlbiB3YXMgc2VlbiBhdCB0aGF0IGRlcHRoLiAgQSByZW1vdGUgZGVidWdnZXIgY2Fubm90IGxvb2sKKyogIGFoZWFkIGludG8gYSBmaWxlIGl0IGRvZXNuJ3QgaGF2ZSBzbyBMVCBldmVudHMgbXVzdCBwYXNzIHRoZSB0b2tlbgorKiAgZXZlbiBpZiB0aGUgaW5mbyBpcyByZWR1bmRhbnQuCisqLworLSAodm9pZCkgTFQ6KE5TSW50ZWdlcilpIGZvdW5kVG9rZW46KGlkPEFOVExSVG9rZW4+KXQ7CisKKy8qKiBUaGUgcGFyc2VyIGlzIGdvaW5nIHRvIGxvb2sgYXJiaXRyYXJpbHkgYWhlYWQ7IG1hcmsgdGhpcyBsb2NhdGlvbiwKKyogIHRoZSB0b2tlbiBzdHJlYW0ncyBtYXJrZXIgaXMgc2VudCBpbiBjYXNlIHlvdSBuZWVkIGl0LgorKi8KKy0gKHZvaWQpIG1hcms6KE5TSW50ZWdlciltYXJrZXI7CisKKy8qKiBBZnRlciBhbiBhcmJpdHJhaXJseSBsb25nIGxvb2thaGVhZCBhcyB3aXRoIGEgY3ljbGljIERGQSAob3Igd2l0aAorKiAgYW55IGJhY2t0cmFjayksIHRoaXMgaW5mb3JtcyB0aGUgZGVidWdnZXIgdGhhdCBzdHJlYW0gc2hvdWxkIGJlCisqICByZXdvdW5kIHRvIHRoZSBwb3NpdGlvbiBhc3NvY2lhdGVkIHdpdGggbWFya2VyLgorKi8KKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcjsKKworLyoqIFJld2luZCB0byB0aGUgaW5wdXQgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWFya2VyLgorKiAgVXNlZCBjdXJyZW50bHkgb25seSBhZnRlciBhIGN5Y2xpYyBERkEgYW5kIGp1c3QKKyogIGJlZm9yZSBzdGFydGluZyBhIHNlbS9zeW4gcHJlZGljYXRlIHRvIGdldCB0aGUKKyogIGlucHV0IHBvc2l0aW9uIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkZWNpc2lvbi4KKyogIERvIG5vdCAicG9wIiB0aGUgbWFya2VyIG9mZiB0aGUgc3RhdGUuICBtYXJrKGkpCisqICBhbmQgcmV3aW5kKGkpIHNob3VsZCBiYWxhbmNlIHN0aWxsLgorKi8KKy0gKHZvaWQpIHJld2luZDsKKworLSAodm9pZCkgYmVnaW5CYWNrdHJhY2s6KE5TSW50ZWdlcilsZXZlbDsKKworLSAodm9pZCkgZW5kQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWwgd2FzU3VjY2Vzc2Z1bDooQk9PTClzdWNjZXNzZnVsOworCisvKiogVG8gd2F0Y2ggYSBwYXJzZXIgbW92ZSB0aHJvdWdoIHRoZSBncmFtbWFyLCB0aGUgcGFyc2VyIG5lZWRzIHRvCisqICBpbmZvcm0gdGhlIGRlYnVnZ2VyIHdoYXQgbGluZS9jaGFyUG9zIGl0IGlzIHBhc3NpbmcgaW4gdGhlIGdyYW1tYXIuCisqICBGb3Igbm93LCB0aGlzIGRvZXMgbm90IGtub3cgaG93IHRvIHN3aXRjaCBmcm9tIG9uZSBncmFtbWFyIHRvIHRoZQorKiAgb3RoZXIgYW5kIGJhY2sgZm9yIGlzbGFuZCBncmFtbWFycyBldGMuLi4KKyoKKyogIFRoaXMgc2hvdWxkIGFsc28gYWxsb3cgYnJlYWtwb2ludHMgYmVjYXVzZSB0aGUgZGVidWdnZXIgY2FuIHN0b3AKKyogIHRoZSBwYXJzZXIgd2hlbmV2ZXIgaXQgaGl0cyB0aGlzIGxpbmUvcG9zLgorKi8KKy0gKHZvaWQpIGxvY2F0aW9uTGluZTooTlNJbnRlZ2VyKWxpbmUgY29sdW1uOihOU0ludGVnZXIpcG9zOworCisvKiogQSByZWNvZ25pdGlvbiBleGNlcHRpb24gb2NjdXJyZWQgc3VjaCBhcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbi4gIEkgbWFkZQorKiAgdGhpcyBhIGdlbmVyaWMgZXZlbnQgc28gdGhhdCBJIGNhbiBhbHRlciB0aGUgZXhjZXB0aW9uIGhpZXJhY2h5IGxhdGVyCisqICB3aXRob3V0IGhhdmluZyB0byBhbHRlciBhbGwgdGhlIGRlYnVnIG9iamVjdHMuCisqCisqICBVcG9uIGVycm9yLCB0aGUgc3RhY2sgb2YgZW50ZXIgcnVsZS9zdWJydWxlIG11c3QgYmUgcHJvcGVybHkgdW53b3VuZC4KKyogIElmIG5vIHZpYWJsZSBhbHQgb2NjdXJzIGl0IGlzIHdpdGhpbiBhbiBlbnRlci9leGl0IGRlY2lzaW9uLCB3aGljaAorKiAgYWxzbyBtdXN0IGJlIHJld291bmQuICBFdmVuIHRoZSByZXdpbmQgZm9yIGVhY2ggbWFyayBtdXN0IGJlIHVud291bnQuCisqICBJbiB0aGUgSmF2YSB0YXJnZXQgdGhpcyBpcyBwcmV0dHkgZWFzeSB1c2luZyB0cnkvZmluYWxseSwgaWYgYSBiaXQKKyogIHVnbHkgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVGhlIHJld2luZCBpcyBnZW5lcmF0ZWQgaW4gREZBLnByZWRpY3QoKQorKiAgYWN0dWFsbHkgc28gbm8gY29kZSBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgZm9yIHRoYXQuICBGb3IgbGFuZ3VhZ2VzCisqICB3L28gdGhpcyAiZmluYWxseSIgZmVhdHVyZSAoQysrPyksIHRoZSB0YXJnZXQgaW1wbGVtZW50b3Igd2lsbCBoYXZlCisqICB0byBidWlsZCBhbiBldmVudCBzdGFjayBvciBzb21ldGhpbmcuCisqCisqICBBY3Jvc3MgYSBzb2NrZXQgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcsIG9ubHkgdGhlIFJlY29nbml0aW9uRXhjZXB0aW9uCisqICBkYXRhIGZpZWxkcyBhcmUgdHJhbnNtaXR0ZWQuICBUaGUgdG9rZW4gb2JqZWN0IG9yIHdoYXRldmVyIHRoYXQKKyogIGNhdXNlZCB0aGUgcHJvYmxlbSB3YXMgdGhlIGxhc3Qgb2JqZWN0IHJlZmVyZW5jZWQgYnkgTFQuICBUaGUKKyogIGltbWVkaWF0ZWx5IHByZWNlZGluZyBMVCBldmVudCBzaG91bGQgaG9sZCB0aGUgdW5leHBlY3RlZCBUb2tlbiBvcgorKiAgY2hhci4KKyoKKyogIEhlcmUgaXMgYSBzYW1wbGUgZXZlbnQgdHJhY2UgZm9yIGdyYW1tYXI6CisqCisqICBiIDogQyAoezt9QXxCKSAvLyB7O30gaXMgdGhlcmUgdG8gcHJldmVudCBBfEIgYmVjb21pbmcgYSBzZXQKKyogICAgfCBECisqICAgIDsKKyoKKyogIFRoZSBzZXF1ZW5jZSBmb3IgdGhpcyBydWxlICh3aXRoIG5vIHZpYWJsZSBhbHQgaW4gdGhlIHN1YnJ1bGUpIGZvcgorKiAgaW5wdXQgJ2MgYycgKHRoZXJlIGFyZSAzIHRva2VucykgaXM6CisqCisqCQljb21tZW5jZQorKgkJTFQoMSkKKyoJCWVudGVyUnVsZSBiCisqCQlsb2NhdGlvbiA3IDEKKyoJCWVudGVyIGRlY2lzaW9uIDMKKyoJCUxUKDEpCisqCQlleGl0IGRlY2lzaW9uIDMKKyoJCWVudGVyQWx0MQorKgkJbG9jYXRpb24gNyA1CisqCQlMVCgxKQorKgkJY29uc3VtZVRva2VuIFtjLzw0PiwxOjBdCisqCQlsb2NhdGlvbiA3IDcKKyoJCWVudGVyU3ViUnVsZSAyCisqCQllbnRlciBkZWNpc2lvbiAyCisqCQlMVCgxKQorKgkJTFQoMSkKKyoJCXJlY29nbml0aW9uRXhjZXB0aW9uIE5vVmlhYmxlQWx0RXhjZXB0aW9uIDIgMSAyCisqCQlleGl0IGRlY2lzaW9uIDIKKyoJCWV4aXRTdWJSdWxlIDIKKyoJCWJlZ2luUmVzeW5jCisqCQlMVCgxKQorKgkJY29uc3VtZVRva2VuIFtjLzw0PiwxOjFdCisqCQlMVCgxKQorKgkJZW5kUmVzeW5jCisqCQlMVCgtMSkKKyoJCWV4aXRSdWxlIGIKKyoJCXRlcm1pbmF0ZQorKi8KKy0gKHZvaWQpIHJlY29nbml0aW9uRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKworLyoqIEluZGljYXRlcyB0aGUgcmVjb2duaXplciBpcyBhYm91dCB0byBjb25zdW1lIHRva2VucyB0byByZXN5bmNocm9uaXplCisqICB0aGUgcGFyc2VyLiAgQW55IGNvbnN1bWUgZXZlbnRzIGZyb20gaGVyZSB1bnRpbCB0aGUgcmVjb3ZlcmVkIGV2ZW50CisqICBhcmUgbm90IHBhcnQgb2YgdGhlIHBhcnNlLS10aGV5IGFyZSBkZWFkIHRva2Vucy4KKyovCistICh2b2lkKSBiZWdpblJlc3luYzsKKworLyoqIEluZGljYXRlcyB0aGF0IHRoZSByZWNvZ25pemVyIGhhcyBmaW5pc2hlZCBjb25zdW1pbmcgdG9rZW5zIGluIG9yZGVyCisqICB0byByZXN5Y2hyb25pemUuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXJzCisqICBiZWZvcmUgdGhlIHJlY29nbml6ZXIgY29tZXMgb3V0IG9mIGVycm9yUmVjb3ZlcnkgbW9kZSAoaW4gd2hpY2gKKyogIG11bHRpcGxlIGVycm9ycyBhcmUgc3VwcHJlc3NlZCkuICBUaGlzIHdpbGwgYmUgdXNlZnVsCisqICBpbiBhIGd1aSB3aGVyZSB5b3Ugd2FudCB0byBwcm9iYWJseSBncmV5IG91dCB0b2tlbnMgdGhhdCBhcmUgY29uc3VtZWQKKyogIGJ1dCBub3QgbWF0Y2hlZCB0byBhbnl0aGluZyBpbiBncmFtbWFyLiAgQW55dGhpbmcgYmV0d2VlbgorKiAgYSBiZWdpblJlc3luYy9lbmRSZXN5bmMgcGFpciB3YXMgdG9zc2VkIG91dCBieSB0aGUgcGFyc2VyLgorKi8KKy0gKHZvaWQpIGVuZFJlc3luYzsKKworLyoqIEEgc2VtYW50aWMgcHJlZGljYXRlIHdhcyBldmFsdWF0ZSB3aXRoIHRoaXMgcmVzdWx0IGFuZCBhY3Rpb24gdGV4dCAqLworLSAodm9pZCkgc2VtYW50aWNQcmVkaWNhdGU6KE5TU3RyaW5nICopcHJlZGljYXRlIG1hdGNoZWQ6KEJPT0wpcmVzdWx0OworCisvKiogQW5ub3VuY2UgdGhhdCBwYXJzaW5nIGhhcyBiZWd1bi4gIE5vdCB0ZWNobmljYWxseSB1c2VmdWwgZXhjZXB0IGZvcgorKiAgc2VuZGluZyBldmVudHMgb3ZlciBhIHNvY2tldC4gIEEgR1VJIGZvciBleGFtcGxlIHdpbGwgbGF1bmNoIGEgdGhyZWFkCisqICB0byBjb25uZWN0IGFuZCBjb21tdW5pY2F0ZSB3aXRoIGEgcmVtb3RlIHBhcnNlci4gIFRoZSB0aHJlYWQgd2lsbCB3YW50CisqICB0byBub3RpZnkgdGhlIEdVSSB3aGVuIGEgY29ubmVjdGlvbiBpcyBtYWRlLiAgQU5UTFIgcGFyc2VycworKiAgdHJpZ2dlciB0aGlzIHVwb24gZW50cnkgdG8gdGhlIGZpcnN0IHJ1bGUgKHRoZSBydWxlTGV2ZWwgaXMgdXNlZCB0bworKiAgZmlndXJlIHRoaXMgb3V0KS4KKyovCistICh2b2lkKSBjb21tZW5jZTsKKworLyoqIFBhcnNpbmcgaXMgb3Zlcjsgc3VjY2Vzc2Z1bGx5IG9yIG5vdC4gIE1vc3RseSB1c2VmdWwgZm9yIHRlbGxpbmcKKyogIHJlbW90ZSBkZWJ1Z2dpbmcgbGlzdGVuZXJzIHRoYXQgaXQncyB0aW1lIHRvIHF1aXQuICBXaGVuIHRoZSBydWxlCisqICBpbnZvY2F0aW9uIGxldmVsIGdvZXMgdG8gemVybyBhdCB0aGUgZW5kIG9mIGEgcnVsZSwgd2UgYXJlIGRvbmUKKyogIHBhcnNpbmcuCisqLworLSAodm9pZCkgdGVybWluYXRlOworCisKKy8vIFQgciBlIGUgIFAgYSByIHMgaSBuIGcKKworLyoqIElucHV0IGZvciBhIHRyZWUgcGFyc2VyIGlzIGFuIEFTVCwgYnV0IHdlIGtub3cgbm90aGluZyBmb3Igc3VyZQorKiAgYWJvdXQgYSBub2RlIGV4Y2VwdCBpdHMgdHlwZSBhbmQgdGV4dCAob2J0YWluZWQgZnJvbSB0aGUgYWRhcHRvcikuCisqICBUaGlzIGlzIHRoZSBhbmFsb2cgb2YgdGhlIGNvbnN1bWVUb2tlbiBtZXRob2QuICBBZ2FpbiwgdGhlIElEIGlzCisqICB0aGUgaGFzaENvZGUgdXN1YWxseSBvZiB0aGUgbm9kZSBzbyBpdCBvbmx5IHdvcmtzIGlmIGhhc2hDb2RlIGlzCisqICBub3QgaW1wbGVtZW50ZWQuICBJZiB0aGUgdHlwZSBpcyBVUCBvciBET1dOLCB0aGVuCisqICB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisqICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisqLworLSAodm9pZCkgY29uc3VtZU5vZGU6KE5TSW50ZWdlcilub2RlSGFzaCBvZlR5cGU6KE5TSW50ZWdlcil0eXBlIHRleHQ6KE5TU3RyaW5nICopdGV4dDsKKworLyoqIFRoZSB0cmVlIHBhcnNlciBsb29rZWRhaGVhZC4gIElmIHRoZSB0eXBlIGlzIFVQIG9yIERPV04sCisqICB0aGVuIHRoZSBJRCBpcyBub3QgcmVhbGx5IG1lYW5pbmdmdWwgYXMgaXQncyBmaXhlZC0tdGhlcmUgaXMKKyogIGp1c3Qgb25lIFVQIG5vZGUgYW5kIG9uZSBET1dOIG5hdmlnYXRpb24gbm9kZS4KKyovCistICh2b2lkKSBMVDooTlNJbnRlZ2VyKWkgZm91bmROb2RlOih1bnNpZ25lZClub2RlSGFzaCBvZlR5cGU6KE5TSW50ZWdlcil0eXBlIHRleHQ6KE5TU3RyaW5nICopdGV4dDsKKworCisvLyBBIFMgVCAgRSB2IGUgbiB0IHMKKworLyoqIEEgbmlsIHdhcyBjcmVhdGVkIChldmVuIG5pbCBub2RlcyBoYXZlIGEgdW5pcXVlIElELi4uCisqICB0aGV5IGFyZSBub3QgIm51bGwiIHBlciBzZSkuICBBcyBvZiA0LzI4LzIwMDYsIHRoaXMKKyogIHNlZW1zIHRvIGJlIHVuaXF1ZWx5IHRyaWdnZXJlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IHN1YnRyZWUKKyogIHN1Y2ggYXMgd2hlbiBlbnRlcmluZyBhIHN1YnJ1bGUgaW4gYXV0b21hdGljIG1vZGUgYW5kIHdoZW4KKyogIGJ1aWxkaW5nIGEgdHJlZSBpbiByZXdyaXRlIG1vZGUuCisqLworLSAodm9pZCkgY3JlYXRlTmlsTm9kZToodW5zaWduZWQpaGFzaDsKKworLyoqIEFubm91bmNlIGEgbmV3IG5vZGUgYnVpbHQgZnJvbSB0ZXh0ICovCistICh2b2lkKSBjcmVhdGVOb2RlOih1bnNpZ25lZCloYXNoIHRleHQ6KE5TU3RyaW5nICopdGV4dCB0eXBlOihOU0ludGVnZXIpdHlwZTsKKworLyoqIEFubm91bmNlIGEgbmV3IG5vZGUgYnVpbHQgZnJvbSBhbiBleGlzdGluZyB0b2tlbiAqLworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCBmcm9tVG9rZW5BdEluZGV4OihOU0ludGVnZXIpdG9rZW5JbmRleDsKKworLyoqIE1ha2UgYSBub2RlIHRoZSBuZXcgcm9vdCBvZiBhbiBleGlzdGluZyByb290LiAgU2VlCisqCisqICBOb3RlOiB0aGUgbmV3Um9vdElEIHBhcmFtZXRlciBpcyBwb3NzaWJseSBkaWZmZXJlbnQKKyogIHRoYW4gdGhlIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBuZXdSb290IHBhcmFtZXRlci4KKyogIEluIG91ciBjYXNlLCBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKKyogIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBhbmQgbm90IHJvb3RfbiBvciB3aGF0ZXZlci4KKyoKKyogIFRoZSBsaXN0ZW5lciBzaG91bGQgYXNzdW1lIHRoYXQgdGhpcyBldmVudCBvY2N1cnMKKyogIG9ubHkgd2hlbiB0aGUgY3VycmVudCBzdWJydWxlIChvciBydWxlKSBzdWJ0cmVlIGlzCisqICBiZWluZyByZXNldCB0byBuZXdSb290SUQuCisqCisqLworLSAodm9pZCkgbWFrZU5vZGU6KHVuc2lnbmVkKW5ld1Jvb3RIYXNoIHBhcmVudE9mOih1bnNpZ25lZClvbGRSb290SGFzaDsKKworLyoqIE1ha2UgY2hpbGRJRCBhIGNoaWxkIG9mIHJvb3RJRC4KKyogIEBzZWUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvci5hZGRDaGlsZCgpCisqLworLSAodm9pZCkgYWRkQ2hpbGQ6KHVuc2lnbmVkKWNoaWxkSGFzaCB0b1RyZWU6KHVuc2lnbmVkKXRyZWVIYXNoOworCisvKiogU2V0IHRoZSB0b2tlbiBzdGFydC9zdG9wIHRva2VuIGluZGV4IGZvciBhIHN1YnRyZWUgcm9vdCBvciBub2RlICovCistICh2b2lkKSBzZXRUb2tlbkJvdW5kYXJpZXNGb3JUcmVlOih1bnNpZ25lZClub2RlSGFzaCBGcm9tOihOU1VJbnRlZ2VyKXRva2VuU3RhcnRJbmRleCBUbzooTlNVSW50ZWdlcil0b2tlblN0b3BJbmRleDsKKworLSAodm9pZCkgd2FpdEZvckRlYnVnZ2VyQ29ubmVjdGlvbjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdFdmVudFByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4Y2QzMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdFdmVudFByb3h5LmgKQEAgLTAsMCArMSwxMTIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIgorI2ltcG9ydCA8c3lzL3NvY2tldC5oPgorI2ltcG9ydCA8bmV0aW5ldC9pbi5oPgorI2ltcG9ydCA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworLy8gZGVmYXVsdCBwb3J0IGZvciBBTlRMUldvcmtzCisjZGVmaW5lIERFRkFVTFRfREVCVUdHRVJfUE9SVCA0OTAwMQorCitAaW50ZXJmYWNlIEFOVExSRGVidWdFdmVudFByb3h5IDogTlNPYmplY3QgPEFOVExSRGVidWdFdmVudExpc3RlbmVyPiB7CisJaW50IHNlcnZlclNvY2tldDsKKwkKKwlzdHJ1Y3Qgc29ja2FkZHIgZGVidWdnZXJfc29ja2FkZHI7CisJc29ja2xlbl90IGRlYnVnZ2VyX3NvY2tsZW47CisJaW50IGRlYnVnZ2VyU29ja2V0OworCU5TRmlsZUhhbmRsZSAqZGVidWdnZXJGSDsKKwkKKwlOU1N0cmluZyAqZ3JhbW1hck5hbWU7CisJaW50IGRlYnVnZ2VyUG9ydDsKK30KKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhHcmFtbWFyTmFtZTooTlNTdHJpbmcgKilhR3JhbW1hck5hbWUgZGVidWdnZXJQb3J0OihOU0ludGVnZXIpYVBvcnQ7CistICh2b2lkKSB3YWl0Rm9yRGVidWdnZXJDb25uZWN0aW9uOworLSAodm9pZCkgd2FpdEZvckFjazsKKy0gKHZvaWQpIHNlbmRUb0RlYnVnZ2VyOihOU1N0cmluZyAqKW1lc3NhZ2U7CistICh2b2lkKSBzZW5kVG9EZWJ1Z2dlcjooTlNTdHJpbmcgKiltZXNzYWdlIHdhaXRGb3JSZXNwb25zZTooQk9PTCl3YWl0OworCistIChOU0ludGVnZXIpIHNlcnZlclNvY2tldDsKKy0gKHZvaWQpIHNldFNlcnZlclNvY2tldDogKE5TSW50ZWdlcikgYVNlcnZlclNvY2tldDsKKworLSAoTlNJbnRlZ2VyKSBkZWJ1Z2dlclNvY2tldDsKKy0gKHZvaWQpIHNldERlYnVnZ2VyU29ja2V0OiAoTlNJbnRlZ2VyKSBhRGVidWdnZXJTb2NrZXQ7CisKKy0gKE5TU3RyaW5nICopIGdyYW1tYXJOYW1lOworLSAodm9pZCkgc2V0R3JhbW1hck5hbWU6IChOU1N0cmluZyAqKSBhR3JhbW1hck5hbWU7CisKKy0gKE5TSW50ZWdlcikgZGVidWdnZXJQb3J0OworLSAodm9pZCkgc2V0RGVidWdnZXJQb3J0OiAoTlNJbnRlZ2VyKSBhRGVidWdnZXJQb3J0OworCistIChOU1N0cmluZyAqKSBlc2NhcGVOZXdsaW5lczooTlNTdHJpbmcgKilhU3RyaW5nOworCisjcHJhZ21hIG1hcmsgLQorCisjcHJhZ21hIG1hcmsgRGVidWdFdmVudExpc3RlbmVyIFByb3RvY29sCistICh2b2lkKSBlbnRlclJ1bGU6KE5TU3RyaW5nICopcnVsZU5hbWU7CistICh2b2lkKSBlbnRlckFsdDooTlNJbnRlZ2VyKWFsdDsKKy0gKHZvaWQpIGV4aXRSdWxlOihOU1N0cmluZyAqKXJ1bGVOYW1lOworLSAodm9pZCkgZW50ZXJTdWJSdWxlOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBleGl0U3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworLSAodm9pZCkgZW50ZXJEZWNpc2lvbjooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworLSAodm9pZCkgZXhpdERlY2lzaW9uOihOU0ludGVnZXIpZGVjaXNpb25OdW1iZXI7CistICh2b2lkKSBjb25zdW1lVG9rZW46KGlkPEFOVExSVG9rZW4+KXQ7CistICh2b2lkKSBjb25zdW1lSGlkZGVuVG9rZW46KGlkPEFOVExSVG9rZW4+KXQ7CistICh2b2lkKSBMVDooTlNJbnRlZ2VyKWkgZm91bmRUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdDsKKy0gKHZvaWQpIG1hcms6KE5TSW50ZWdlciltYXJrZXI7CistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlciltYXJrZXI7CistICh2b2lkKSByZXdpbmQ7CistICh2b2lkKSBiZWdpbkJhY2t0cmFjazooTlNJbnRlZ2VyKWxldmVsOworLSAodm9pZCkgZW5kQmFja3RyYWNrOihOU0ludGVnZXIpbGV2ZWwgd2FzU3VjY2Vzc2Z1bDooQk9PTClzdWNjZXNzZnVsOworLSAodm9pZCkgbG9jYXRpb25MaW5lOihOU0ludGVnZXIpbGluZSBjb2x1bW46KE5TSW50ZWdlcilwb3M7CistICh2b2lkKSByZWNvZ25pdGlvbkV4Y2VwdGlvbjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistICh2b2lkKSBiZWdpblJlc3luYzsKKy0gKHZvaWQpIGVuZFJlc3luYzsKKy0gKHZvaWQpIHNlbWFudGljUHJlZGljYXRlOihOU1N0cmluZyAqKXByZWRpY2F0ZSBtYXRjaGVkOihCT09MKXJlc3VsdDsKKy0gKHZvaWQpIGNvbW1lbmNlOworLSAodm9pZCkgdGVybWluYXRlOworCisKKyNwcmFnbWEgbWFyayBUcmVlIFBhcnNpbmcKKy0gKHZvaWQpIGNvbnN1bWVOb2RlOih1bnNpZ25lZClub2RlSGFzaCBvZlR5cGU6KE5TSW50ZWdlcil0eXBlIHRleHQ6KE5TU3RyaW5nICopdGV4dDsKKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZE5vZGU6KHVuc2lnbmVkKW5vZGVIYXNoIG9mVHlwZTooTlNJbnRlZ2VyKXR5cGUgdGV4dDooTlNTdHJpbmcgKil0ZXh0OworCisKKyNwcmFnbWEgbWFyayBBU1QgRXZlbnRzCisKKy0gKHZvaWQpIGNyZWF0ZU5pbE5vZGU6KHVuc2lnbmVkKWhhc2g7CistICh2b2lkKSBjcmVhdGVOb2RlOih1bnNpZ25lZCloYXNoIHRleHQ6KE5TU3RyaW5nICopdGV4dCB0eXBlOihOU0ludGVnZXIpdHlwZTsKKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggZnJvbVRva2VuQXRJbmRleDooTlNJbnRlZ2VyKXRva2VuSW5kZXg7CistICh2b2lkKSBtYWtlTm9kZToodW5zaWduZWQpbmV3Um9vdEhhc2ggcGFyZW50T2Y6KHVuc2lnbmVkKW9sZFJvb3RIYXNoOworLSAodm9pZCkgYWRkQ2hpbGQ6KHVuc2lnbmVkKWNoaWxkSGFzaCB0b1RyZWU6KHVuc2lnbmVkKXRyZWVIYXNoOworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzRm9yVHJlZToodW5zaWduZWQpbm9kZUhhc2ggRnJvbTooTlNJbnRlZ2VyKXRva2VuU3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXRva2VuU3RvcEluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnRXZlbnRQcm94eS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z0V2ZW50UHJveHkubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgwNTlhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z0V2ZW50UHJveHkubQpAQCAtMCwwICsxLDM3MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIE5TRGF0YSAqbmV3bGluZURhdGEgPSBuaWw7CitzdGF0aWMgdW5zaWduZWQgbGVuZ3RoT2ZVVEY4QWNrID0gMDsKKworQGltcGxlbWVudGF0aW9uIEFOVExSRGVidWdFdmVudFByb3h5CisKKysgKHZvaWQpIGluaXRpYWxpemUKK3sKKwlpZiAoIW5ld2xpbmVEYXRhKSBuZXdsaW5lRGF0YSA9IFtAIlxuIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisJaWYgKCFsZW5ndGhPZlVURjhBY2spIGxlbmd0aE9mVVRGOEFjayA9IFtbQCJhY2tcbiIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddIGxlbmd0aF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisJcmV0dXJuIFtzZWxmIGluaXRXaXRoR3JhbW1hck5hbWU6bmlsIGRlYnVnZ2VyUG9ydDpERUZBVUxUX0RFQlVHR0VSX1BPUlRdOworfQorCistIChpZCkgaW5pdFdpdGhHcmFtbWFyTmFtZTooTlNTdHJpbmcgKilhR3JhbW1hck5hbWUgZGVidWdnZXJQb3J0OihOU0ludGVnZXIpYVBvcnQKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRdOworCWlmIChzZWxmKSB7CisJCXNlcnZlclNvY2tldCA9IC0xOworCQlbc2VsZiBzZXRHcmFtbWFyTmFtZTphR3JhbW1hck5hbWVdOworCQlpZiAoYVBvcnQgPT0gLTEpIGFQb3J0ID0gREVGQVVMVF9ERUJVR0dFUl9QT1JUOworCQlbc2VsZiBzZXREZWJ1Z2dlclBvcnQ6YVBvcnRdOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworCWlmIChzZXJ2ZXJTb2NrZXQgIT0gLTEpIAorCQlzaHV0ZG93bihzZXJ2ZXJTb2NrZXQsU0hVVF9SRFdSKTsKKwlzZXJ2ZXJTb2NrZXQgPSAtMTsKKwlbZGVidWdnZXJGSCByZWxlYXNlXTsKKyAgICBbc2VsZiBzZXRHcmFtbWFyTmFtZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAodm9pZCkgd2FpdEZvckRlYnVnZ2VyQ29ubmVjdGlvbgoreworCWlmIChzZXJ2ZXJTb2NrZXQgPT0gLTEpIHsKKwkJc2VydmVyU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJCQorCQlOU0Fzc2VydDEoc2VydmVyU29ja2V0ICE9IC0xLCBAIkZhaWxlZCB0byBjcmVhdGUgZGVidWdnZXIgc29ja2V0LiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQorCQlpbnQgeWVzID0gMTsKKwkJc2V0c29ja29wdChzZXJ2ZXJTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRXxTT19SRVVTRVBPUlR8U09fUkVVU0VBRERSfFRDUF9OT0RFTEFZLCAodm9pZCAqKSZ5ZXMsIHNpemVvZihOU0ludGVnZXIpKTsKKworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7CisJCWJ6ZXJvKCZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQlzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhbc2VsZiBkZWJ1Z2dlclBvcnRdKTsKKwkJc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisJCU5TQXNzZXJ0MSggYmluZChzZXJ2ZXJTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyX2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSAhPSAtMSwgQCJiaW5kKDIpIGZhaWxlZC4gJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJCU5TQXNzZXJ0MShsaXN0ZW4oc2VydmVyU29ja2V0LDUwKSA9PSAwLCBAImxpc3RlbigyKSBmYWlsZWQuICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCisJCU5TTG9nKEAiQU5UTFIgd2FpdGluZyBmb3IgZGVidWdnZXIgYXR0YWNoIChncmFtbWFyICVAKSIsIFtzZWxmIGdyYW1tYXJOYW1lXSk7CisJCQorCQlkZWJ1Z2dlclNvY2tldCA9IGFjY2VwdChzZXJ2ZXJTb2NrZXQsICZkZWJ1Z2dlcl9zb2NrYWRkciwgJmRlYnVnZ2VyX3NvY2tsZW4pOworCQlOU0Fzc2VydDEoIGRlYnVnZ2VyU29ja2V0ICE9IC0xLCBAImFjY2VwdCgyKSBmYWlsZWQuICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCisJCWRlYnVnZ2VyRkggPSBbW05TRmlsZUhhbmRsZSBhbGxvY10gaW5pdFdpdGhGaWxlRGVzY3JpcHRvcjpkZWJ1Z2dlclNvY2tldF07CisJCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiQU5UTFIgJWQiLCBBTlRMUkRlYnVnUHJvdG9jb2xWZXJzaW9uXSB3YWl0Rm9yUmVzcG9uc2U6Tk9dOworCQlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImdyYW1tYXIgXCIlQCIsIFtzZWxmIGdyYW1tYXJOYW1lXV0gd2FpdEZvclJlc3BvbnNlOk5PXTsKKwl9Cit9CisKKy0gKHZvaWQpIHdhaXRGb3JBY2sKK3sKKwlOU1N0cmluZyAqcmVzcG9uc2U7CisJQHRyeSB7CisJCU5TRGF0YSAqbmV3TGluZSA9IFtkZWJ1Z2dlckZIIHJlYWREYXRhT2ZMZW5ndGg6bGVuZ3RoT2ZVVEY4QWNrXTsKKwkJcmVzcG9uc2UgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6bmV3TGluZSBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisJCWlmICghW3Jlc3BvbnNlIGlzRXF1YWxUb1N0cmluZzpAImFja1xuIl0pIEB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6QCJBTlRMUkRlYnVnRXZlbnRQcm94eSIgcmVhc29uOkAiaWxsZWdhbCByZXNwb25zZSBmcm9tIGRlYnVnZ2VyIiB1c2VySW5mbzpuaWxdOworCX0KKwlAY2F0Y2ggKE5TRXhjZXB0aW9uICplKSB7CisJCU5TTG9nKEAic29ja2V0IGRpZWQgb3IgZGVidWdnZXIgbWlzYmVoYXZlZDogJUAgcmVhZCA8JUA+IiwgZSwgcmVzcG9uc2UpOworCX0KKwlAZmluYWxseSB7CisJCVtyZXNwb25zZSByZWxlYXNlXTsKKwl9Cit9CisKKy0gKHZvaWQpIHNlbmRUb0RlYnVnZ2VyOihOU1N0cmluZyAqKW1lc3NhZ2UKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjptZXNzYWdlIHdhaXRGb3JSZXNwb25zZTpZRVNdOworfQorCistICh2b2lkKSBzZW5kVG9EZWJ1Z2dlcjooTlNTdHJpbmcgKiltZXNzYWdlIHdhaXRGb3JSZXNwb25zZTooQk9PTCl3YWl0Cit7CisJaWYgKCEgZGVidWdnZXJGSCApIHJldHVybjsKKwlbZGVidWdnZXJGSCB3cml0ZURhdGE6W21lc3NhZ2UgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddXTsKKwlbZGVidWdnZXJGSCB3cml0ZURhdGE6bmV3bGluZURhdGFdOworCWlmICh3YWl0KSBbc2VsZiB3YWl0Rm9yQWNrXTsKK30KKworLSAoTlNJbnRlZ2VyKSBzZXJ2ZXJTb2NrZXQKK3sKKyAgICByZXR1cm4gc2VydmVyU29ja2V0OworfQorCistICh2b2lkKSBzZXRTZXJ2ZXJTb2NrZXQ6IChOU0ludGVnZXIpIGFTZXJ2ZXJTb2NrZXQKK3sKKyAgICBzZXJ2ZXJTb2NrZXQgPSBhU2VydmVyU29ja2V0OworfQorCistIChOU0ludGVnZXIpIGRlYnVnZ2VyU29ja2V0Cit7CisgICAgcmV0dXJuIGRlYnVnZ2VyU29ja2V0OworfQorCistICh2b2lkKSBzZXREZWJ1Z2dlclNvY2tldDogKE5TSW50ZWdlcikgYURlYnVnZ2VyU29ja2V0Cit7CisgICAgZGVidWdnZXJTb2NrZXQgPSBhRGVidWdnZXJTb2NrZXQ7Cit9CisKKy0gKE5TU3RyaW5nICopIGdyYW1tYXJOYW1lCit7CisgICAgcmV0dXJuIGdyYW1tYXJOYW1lOyAKK30KKworLSAodm9pZCkgc2V0R3JhbW1hck5hbWU6IChOU1N0cmluZyAqKSBhR3JhbW1hck5hbWUKK3sKKyAgICBpZiAoZ3JhbW1hck5hbWUgIT0gYUdyYW1tYXJOYW1lKSB7CisgICAgICAgIFthR3JhbW1hck5hbWUgcmV0YWluXTsKKyAgICAgICAgW2dyYW1tYXJOYW1lIHJlbGVhc2VdOworICAgICAgICBncmFtbWFyTmFtZSA9IGFHcmFtbWFyTmFtZTsKKyAgICB9Cit9CisKKy0gKE5TSW50ZWdlcikgZGVidWdnZXJQb3J0Cit7CisgICAgcmV0dXJuIGRlYnVnZ2VyUG9ydDsKK30KKworLSAodm9pZCkgc2V0RGVidWdnZXJQb3J0OiAoTlNJbnRlZ2VyKSBhRGVidWdnZXJQb3J0Cit7CisgICAgZGVidWdnZXJQb3J0ID0gYURlYnVnZ2VyUG9ydDsKK30KKworLSAoTlNTdHJpbmcgKikgZXNjYXBlTmV3bGluZXM6KE5TU3RyaW5nICopYVN0cmluZworeworCU5TTXV0YWJsZVN0cmluZyAqZXNjYXBlZFRleHQ7CisJaWYgKGFTdHJpbmcpIHsKKwkJZXNjYXBlZFRleHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6YVN0cmluZ107CisJCU5TUmFuZ2Ugd2hvbGVTdHJpbmcgPSBOU01ha2VSYW5nZSgwLFtlc2NhcGVkVGV4dCBsZW5ndGhdKTsKKwkJW2VzY2FwZWRUZXh0IHJlcGxhY2VPY2N1cnJlbmNlc09mU3RyaW5nOkAiJSIgd2l0aFN0cmluZzpAIiUyNSIgb3B0aW9uczowIHJhbmdlOndob2xlU3RyaW5nXTsKKwkJW2VzY2FwZWRUZXh0IHJlcGxhY2VPY2N1cnJlbmNlc09mU3RyaW5nOkAiXG4iIHdpdGhTdHJpbmc6QCIlMEEiIG9wdGlvbnM6MCByYW5nZTp3aG9sZVN0cmluZ107CisJCVtlc2NhcGVkVGV4dCByZXBsYWNlT2NjdXJyZW5jZXNPZlN0cmluZzpAIlxyIiB3aXRoU3RyaW5nOkAiJTBEIiBvcHRpb25zOjAgcmFuZ2U6d2hvbGVTdHJpbmddOworCX0gZWxzZSB7CisJCWVzY2FwZWRUZXh0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoU3RyaW5nOkAiIl07CisJfQorCXJldHVybiBlc2NhcGVkVGV4dDsKK30KKworI3ByYWdtYSBtYXJrIC0KKworI3ByYWdtYSBtYXJrIERlYnVnRXZlbnRMaXN0ZW5lciBQcm90b2NvbAorLSAodm9pZCkgZW50ZXJSdWxlOihOU1N0cmluZyAqKXJ1bGVOYW1lCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJlbnRlclJ1bGUgJUAiLCBydWxlTmFtZV1dOworfQorCistICh2b2lkKSBlbnRlckFsdDooTlNJbnRlZ2VyKWFsdAoreworCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiZW50ZXJBbHQgJWQiLCBhbHRdXTsgCit9CisKKy0gKHZvaWQpIGV4aXRSdWxlOihOU1N0cmluZyAqKXJ1bGVOYW1lCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJleGl0UnVsZSAlQCIsIHJ1bGVOYW1lXV07Cit9CisKKy0gKHZvaWQpIGVudGVyU3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJlbnRlclN1YlJ1bGUgJWQiLCBkZWNpc2lvbk51bWJlcl1dOworfQorCistICh2b2lkKSBleGl0U3ViUnVsZTooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJleGl0U3ViUnVsZSAlZCIsIGRlY2lzaW9uTnVtYmVyXV07Cit9CisKKy0gKHZvaWQpIGVudGVyRGVjaXNpb246KE5TSW50ZWdlcilkZWNpc2lvbk51bWJlcgoreworCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiZW50ZXJEZWNpc2lvbiAlZCIsIGRlY2lzaW9uTnVtYmVyXV07Cit9CisKKy0gKHZvaWQpIGV4aXREZWNpc2lvbjooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJleGl0RGVjaXNpb24gJWQiLCBkZWNpc2lvbk51bWJlcl1dOworfQorCistICh2b2lkKSBjb25zdW1lVG9rZW46KGlkPEFOVExSVG9rZW4+KXQKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImNvbnN1bWVUb2tlbiAlQCIsIFtzZWxmIGVzY2FwZU5ld2xpbmVzOlt0IGRlc2NyaXB0aW9uXV1dXTsKK30KKworLSAodm9pZCkgY29uc3VtZUhpZGRlblRva2VuOihpZDxBTlRMUlRva2VuPil0Cit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJjb25zdW1lSGlkZGVuVG9rZW4gJUAiLCBbc2VsZiBlc2NhcGVOZXdsaW5lczpbdCBkZXNjcmlwdGlvbl1dXV07Cit9CisKKy0gKHZvaWQpIExUOihOU0ludGVnZXIpaSBmb3VuZFRva2VuOihpZDxBTlRMUlRva2VuPil0Cit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJMVCAlZCAlQCIsIGksIFtzZWxmIGVzY2FwZU5ld2xpbmVzOlt0IGRlc2NyaXB0aW9uXV1dXTsKK30KKworLSAodm9pZCkgbWFyazooTlNJbnRlZ2VyKW1hcmtlcgoreworCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibWFyayAlZCIsIG1hcmtlcl1dOworfQorLSAodm9pZCkgcmV3aW5kOihOU0ludGVnZXIpbWFya2VyCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJyZXdpbmQgJWQiLCBtYXJrZXJdXTsKK30KKworLSAodm9pZCkgcmV3aW5kCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6QCJyZXdpbmQiXTsKK30KKworLSAodm9pZCkgYmVnaW5CYWNrdHJhY2s6KE5TSW50ZWdlcilsZXZlbAoreworCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiYmVnaW5CYWNrdHJhY2sgJWQiLCBsZXZlbF1dOworfQorCistICh2b2lkKSBlbmRCYWNrdHJhY2s6KE5TSW50ZWdlcilsZXZlbCB3YXNTdWNjZXNzZnVsOihCT09MKXN1Y2Nlc3NmdWwKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImVuZEJhY2t0cmFjayAlZCAlZCIsIGxldmVsLCBzdWNjZXNzZnVsID8gMSA6IDBdXTsKK30KKworLSAodm9pZCkgbG9jYXRpb25MaW5lOihOU0ludGVnZXIpbGluZSBjb2x1bW46KE5TSW50ZWdlcilwb3MKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImxvY2F0aW9uICVkICVkIiwgbGluZSwgcG9zXV07Cit9CisKKy0gKHZvaWQpIHJlY29nbml0aW9uRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZQoreworI3dhcm5pbmcgVE9ETzogcmVjb2duaXRpb24gZXhjZXB0aW9ucworCS8vIHRoZXNlIG11c3QgdXNlIHRoZSBuYW1lcyBvZiB0aGUgY29ycmVzcG9uZGluZyBKYXZhIGV4Y2VwdGlvbiBjbGFzc2VzLCBiZWNhdXNlIEFOVExSV29ya3MgcmVjcmVhdGVzIHRoZSBleGNlcHRpb24KKwkvLyBvYmplY3RzIG9uIHRoZSBKYXZhIHNpZGUuCisJLy8gV3JpdGUgY2F0ZWdvcmllcyBmb3IgT2JqZWN0aXZlLUMgZXhjZXB0aW9ucyB0byBwcm92aWRlIHRob3NlIG5hbWVzCit9CisKKy0gKHZvaWQpIGJlZ2luUmVzeW5jCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6QCJiZWdpblJlc3luYyJdOworfQorCQorLSAodm9pZCkgZW5kUmVzeW5jCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6QCJlbmRSZXN5bmMiXTsKK30KKworLSAodm9pZCkgc2VtYW50aWNQcmVkaWNhdGU6KE5TU3RyaW5nICopcHJlZGljYXRlIG1hdGNoZWQ6KEJPT0wpcmVzdWx0Cit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJzZW1hbnRpY1ByZWRpY2F0ZSAlZCAlQCIsIHJlc3VsdD8xOjAsIFtzZWxmIGVzY2FwZU5ld2xpbmVzOnByZWRpY2F0ZV1dXTsKK30KKworLSAodm9pZCkgY29tbWVuY2UKK3sKKwkvLyBubyBuZWVkIHRvIHNlbmQgZXZlbnQKK30KKworLSAodm9pZCkgdGVybWluYXRlCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6QCJ0ZXJtaW5hdGUiXTsKKwlAdHJ5IHsKKwkJW2RlYnVnZ2VyRkggY2xvc2VGaWxlXTsKKwl9CisJQGZpbmFsbHkgeworI3dhcm5pbmcgVE9ETzogbWFrZSBzb2NrZXQgaGFuZGxpbmcgcm9idXN0LiB0b28gbGF6eSBub3cuLi4KKwkJc2h1dGRvd24oc2VydmVyU29ja2V0LFNIVVRfUkRXUik7CisJCXNlcnZlclNvY2tldCA9IC0xOworCX0KK30KKworCisjcHJhZ21hIG1hcmsgVHJlZSBQYXJzaW5nCistICh2b2lkKSBjb25zdW1lTm9kZToodW5zaWduZWQpbm9kZUhhc2ggb2ZUeXBlOihOU0ludGVnZXIpdHlwZSB0ZXh0OihOU1N0cmluZyAqKXRleHQKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImNvbnN1bWVOb2RlICV1ICVkICVAIiwKKwkJbm9kZUhhc2gsCisJCXR5cGUsCisJCVtzZWxmIGVzY2FwZU5ld2xpbmVzOnRleHRdCisJCV1dOworfQorCistICh2b2lkKSBMVDooTlNJbnRlZ2VyKWkgZm91bmROb2RlOih1bnNpZ25lZClub2RlSGFzaCBvZlR5cGU6KE5TSW50ZWdlcil0eXBlIHRleHQ6KE5TU3RyaW5nICopdGV4dAoreworCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiTE4gJWQgJXUgJWQgJUAiLAorCQlpLAorCQlub2RlSGFzaCwKKwkJdHlwZSwKKwkJW3NlbGYgZXNjYXBlTmV3bGluZXM6dGV4dF0KKwkJXV07Cit9CisKKworI3ByYWdtYSBtYXJrIEFTVCBFdmVudHMKKworLSAodm9pZCkgY3JlYXRlTmlsTm9kZToodW5zaWduZWQpaGFzaAoreworCVtzZWxmIHNlbmRUb0RlYnVnZ2VyOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibmlsTm9kZSAldSIsIGhhc2hdXTsKK30KKworLSAodm9pZCkgY3JlYXRlTm9kZToodW5zaWduZWQpaGFzaCB0ZXh0OihOU1N0cmluZyAqKXRleHQgdHlwZTooTlNJbnRlZ2VyKXR5cGUKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImNyZWF0ZU5vZGVGcm9tVG9rZW4gJXUgJWQgJUAiLCAKKwkJaGFzaCwKKwkJdHlwZSwKKwkJW3NlbGYgZXNjYXBlTmV3bGluZXM6dGV4dF0KKwkJXV07Cit9CisKKy0gKHZvaWQpIGNyZWF0ZU5vZGU6KHVuc2lnbmVkKWhhc2ggZnJvbVRva2VuQXRJbmRleDooTlNJbnRlZ2VyKXRva2VuSW5kZXgKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImNyZWF0ZU5vZGUgJXUgJWQiLCBoYXNoLCB0b2tlbkluZGV4XV07Cit9CisKKy0gKHZvaWQpIGJlY29tZVJvb3Q6KHVuc2lnbmVkKW5ld1Jvb3RIYXNoIG9sZDoodW5zaWduZWQpb2xkUm9vdEhhc2gKK3sKKwlbc2VsZiBzZW5kVG9EZWJ1Z2dlcjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImJlY29tZVJvb3QgJXUgJXUiLCBuZXdSb290SGFzaCwgb2xkUm9vdEhhc2hdXTsKK30KKworLSAodm9pZCkgYWRkQ2hpbGQ6KHVuc2lnbmVkKWNoaWxkSGFzaCB0b1RyZWU6KHVuc2lnbmVkKXRyZWVIYXNoCit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJhZGRDaGlsZCAldSAldSIsIHRyZWVIYXNoLCBjaGlsZEhhc2hdXTsKK30KKworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzRm9yVHJlZToodW5zaWduZWQpbm9kZUhhc2ggRnJvbTooTlNJbnRlZ2VyKXRva2VuU3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXRva2VuU3RvcEluZGV4Cit7CisJW3NlbGYgc2VuZFRvRGVidWdnZXI6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJzZXRUb2tlbkJvdW5kYXJpZXMgJXUgJWQgJWQiLCBub2RlSGFzaCwgdG9rZW5TdGFydEluZGV4LCB0b2tlblN0b3BJbmRleF1dOworfQorCisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1BhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDAzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnUGFyc2VyLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudFByb3h5LmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnVG9rZW5TdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnUGFyc2VyIDogQU5UTFJQYXJzZXIgeworCWlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPiBkZWJ1Z0xpc3RlbmVyOworfQorCisrIChpZCkgbmV3RGVidWdQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbQorICAgICAgICBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pZGVidWdMaXN0ZW5lcjsKKworKyAoaWQpIG5ld0RlYnVnUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKyAgICAgICAgICAgICAgICBzdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworKyAoaWQpIG5ld0RlYnVnUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKyAgICAgICAgZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWRlYnVnTGlzdGVuZXIKKyAgICAgICAgICAgICAgICBzdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbTsKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSAgZGVidWdnZXJQb3J0OihOU0ludGVnZXIpcG9ydE51bWJlcjsKKy8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KKwkJCSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pdGhlRGVidWdMaXN0ZW5lcgorCQkJICBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1BhcnNlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1BhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NmE4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnUGFyc2VyLm0KQEAgLTAsMCArMSwxMTMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJEZWJ1Z1BhcnNlci5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkRlYnVnUGFyc2VyCisKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW0KK3sKKwlyZXR1cm4gW3NlbGYgaW5pdFdpdGhUb2tlblN0cmVhbTp0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjpuaWwgZGVidWdnZXJQb3J0Oi0xXTsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbQorCQkJICBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyCit7CisJcmV0dXJuIFtzZWxmIGluaXRXaXRoVG9rZW5TdHJlYW06dGhlU3RyZWFtIGRlYnVnTGlzdGVuZXI6bmlsIGRlYnVnZ2VyUG9ydDpwb3J0TnVtYmVyXTsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbQorCQkJIGRlYnVnTGlzdGVuZXI6KGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPil0aGVEZWJ1Z0xpc3RlbmVyCisJCQkgIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXIKK3sKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4gZGVidWdnZXIgPSBuaWw7CisJaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5TdHJlYW0gPSBuaWw7CisJaWYgKHRoZURlYnVnTGlzdGVuZXIpIHsKKwkJZGVidWdnZXIgPSBbKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyLE5TT2JqZWN0Pil0aGVEZWJ1Z0xpc3RlbmVyIHJldGFpbl07CisJCWRlYnVnZ2VyID0gdGhlRGVidWdMaXN0ZW5lcjsKKwl9IGVsc2UgeworCQlkZWJ1Z2dlciA9IFtbQU5UTFJEZWJ1Z0V2ZW50UHJveHkgYWxsb2NdIGluaXRXaXRoR3JhbW1hck5hbWU6W3NlbGYgZ3JhbW1hckZpbGVOYW1lXSBkZWJ1Z2dlclBvcnQ6cG9ydE51bWJlcl07CisJfQorCWlmICh0aGVTdHJlYW0gJiYgIVt0aGVTdHJlYW0gaXNLaW5kT2ZDbGFzczpbQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtIGNsYXNzXV0pIHsKKwkJdG9rZW5TdHJlYW0gPSBbW0FOVExSRGVidWdUb2tlblN0cmVhbSBhbGxvY10gaW5pdFdpdGhUb2tlblN0cmVhbTp0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjpkZWJ1Z2dlcl07CisJfSBlbHNlIHsKKwkJdG9rZW5TdHJlYW0gPSBbdGhlU3RyZWFtIHJldGFpbl07CisJCXRva2VuU3RyZWFtID0gdGhlU3RyZWFtOworCX0KKwlzZWxmID0gW3N1cGVyIGluaXRXaXRoVG9rZW5TdHJlYW06dG9rZW5TdHJlYW1dOworCWlmIChzZWxmKSB7CisJCVtzZWxmIHNldERlYnVnTGlzdGVuZXI6ZGVidWdnZXJdOworCQlbZGVidWdnZXIgcmVsZWFzZV07CisJCVt0b2tlblN0cmVhbSByZWxlYXNlXTsKKwkJW2RlYnVnTGlzdGVuZXIgd2FpdEZvckRlYnVnZ2VyQ29ubmVjdGlvbl07CisJfQorCXJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0RGVidWdMaXN0ZW5lcjogbmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcgoreworICAgIHJldHVybiBkZWJ1Z0xpc3RlbmVyOyAKK30KKworLSAodm9pZCkgc2V0RGVidWdMaXN0ZW5lcjogKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgYURlYnVnTGlzdGVuZXIKK3sKKyAgICBpZiAoZGVidWdMaXN0ZW5lciAhPSBhRGVidWdMaXN0ZW5lcikgeworICAgICAgICBbKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyLE5TT2JqZWN0PilhRGVidWdMaXN0ZW5lciByZXRhaW5dOworICAgICAgICBbKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyLE5TT2JqZWN0PilkZWJ1Z0xpc3RlbmVyIHJlbGVhc2VdOworICAgICAgICBkZWJ1Z0xpc3RlbmVyID0gYURlYnVnTGlzdGVuZXI7CisgICAgfQorfQorCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIE92ZXJyaWRlcworCistICh2b2lkKSBiZWdpblJlc3luYworeworCVtkZWJ1Z0xpc3RlbmVyIGJlZ2luUmVzeW5jXTsKK30KKworLSAodm9pZCkgZW5kUmVzeW5jCit7CisJW2RlYnVnTGlzdGVuZXIgZW5kUmVzeW5jXTsKK30KKy0gKHZvaWQpYmVnaW5CYWNrdHJhY2tpbmc6KE5TSW50ZWdlcilsZXZlbAoreworCVtkZWJ1Z0xpc3RlbmVyIGJlZ2luQmFja3RyYWNrOmxldmVsXTsKK30KKworLSAodm9pZCllbmRCYWNrdHJhY2tpbmc6KE5TSW50ZWdlcilsZXZlbCB3YXNTdWNjZXNzZnVsOihCT09MKXN1Y2Nlc3NmdWwKK3sKKwlbZGVidWdMaXN0ZW5lciBlbmRCYWNrdHJhY2s6bGV2ZWwgd2FzU3VjY2Vzc2Z1bDpzdWNjZXNzZnVsXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVG9rZW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZjNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5Tb3VyY2UuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaCIKKworQGludGVyZmFjZSBBTlRMUkRlYnVnVG9rZW5TdHJlYW0gOiBOU09iamVjdCA8QU5UTFJUb2tlblN0cmVhbT4KK3sKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4gZGVidWdMaXN0ZW5lcjsKKwlpZDxBTlRMUlRva2VuU3RyZWFtPiBpbnB1dDsKKwlCT09MIGluaXRpYWxTdHJlYW1TdGF0ZTsKKyAgICBOU0ludGVnZXIgbGFzdE1hcmtlcjsKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KXRoZVN0cmVhbSBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pZGVidWdnZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPikgZGVidWdMaXN0ZW5lcjsKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyOworCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgaW5wdXQ7CistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVRva2VuU3RyZWFtOworCistICh2b2lkKSBjb25zdW1lOworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihOU0ludGVnZXIpaW5kZXg7CistIChOU0ludGVnZXIpIGdldEluZGV4OworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKW1hcmtlcjsKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcikgc2l6ZTsKKy0gKGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBnZXRUb2tlblNvdXJjZTsKKy0gKE5TU3RyaW5nICopIGdldFNvdXJjZU5hbWU7CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiBUb1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW47CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUb2tlblN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyOTRjOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUb2tlblN0cmVhbS5tCkBAIC0wLDAgKzEsMjA0IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRGVidWdUb2tlblN0cmVhbS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkRlYnVnVG9rZW5TdHJlYW0KKworCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtIGRlYnVnTGlzdGVuZXI6KGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPilkZWJ1Z2dlcgoreworCXNlbGYgPSBbc3VwZXIgaW5pdF07CisJaWYgKHNlbGYpIHsKKwkJW3NlbGYgc2V0RGVidWdMaXN0ZW5lcjpkZWJ1Z2dlcl07CisJCVtzZWxmIHNldElucHV0OnRoZVN0cmVhbV07CisJCVtzZWxmLmlucHV0IExUOjFdOwkvLyBmb3JjZSByZWFkaW5nIGZpcnN0IG9uLWNoYW5uZWwgdG9rZW4KKwkJaW5pdGlhbFN0cmVhbVN0YXRlID0gWUVTOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldERlYnVnTGlzdGVuZXI6bmlsXTsKKyAgICBzZWxmLmlucHV0ID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXIKK3sKKyAgICByZXR1cm4gZGVidWdMaXN0ZW5lcjsgCit9CisKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyCit7CisgICAgaWYgKGRlYnVnTGlzdGVuZXIgIT0gYURlYnVnTGlzdGVuZXIpIHsKKyAgICAgICAgWyhpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4pYURlYnVnTGlzdGVuZXIgcmV0YWluXTsKKyAgICAgICAgWyhpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4pZGVidWdMaXN0ZW5lciByZWxlYXNlXTsKKyAgICAgICAgZGVidWdMaXN0ZW5lciA9IGFEZWJ1Z0xpc3RlbmVyOworICAgIH0KK30KKworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGlucHV0Cit7CisgICAgcmV0dXJuIGlucHV0OyAKK30KKworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUlRva2VuU3RyZWFtPikgYVRva2VuU3RyZWFtCit7CisgICAgaWYgKGlucHV0ICE9IGFUb2tlblN0cmVhbSkgeworICAgICAgICBpZiAoIGlucHV0ICkgW2lucHV0IHJlbGVhc2VdOworICAgICAgICBpbnB1dCA9IGFUb2tlblN0cmVhbTsKKyAgICAgICAgW2lucHV0IHJldGFpbl07CisgICAgfQorfQorCistICh2b2lkKSBjb25zdW1lSW5pdGlhbEhpZGRlblRva2VucworeworCWludCBmaXJzdElkeCA9IGlucHV0LmluZGV4OworCWZvciAoaW50IGkgPSAwOyBpPGZpcnN0SWR4OyBpKyspCisJCVtkZWJ1Z0xpc3RlbmVyIGNvbnN1bWVIaWRkZW5Ub2tlbjpbaW5wdXQgZ2V0VG9rZW46aV1dOworCWluaXRpYWxTdHJlYW1TdGF0ZSA9IE5POworfQorCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIFByb3h5IGltcGxlbWVudGF0aW9uCisKKy8vIGFueXRoaW5nIGVsc2UgdGhhdCBoYXNuJ3Qgc29tZSBkZWJ1Z2dlciBldmVudCBhc3NpY2lvYXRlZCB3aXRoIGl0LCBpcyBzaW1wbHkKKy8vIGZvcndhcmRlZCB0byB0aGUgYWN0dWFsIHRva2VuIHN0cmVhbQorLSAodm9pZCkgZm9yd2FyZEludm9jYXRpb246KE5TSW52b2NhdGlvbiAqKWFuSW52b2NhdGlvbgoreworCVthbkludm9jYXRpb24gaW52b2tlV2l0aFRhcmdldDpzZWxmLmlucHV0XTsKK30KKworLSAodm9pZCkgY29uc3VtZQoreworCWlmICggaW5pdGlhbFN0cmVhbVN0YXRlICkKKwkJW3NlbGYgY29uc3VtZUluaXRpYWxIaWRkZW5Ub2tlbnNdOworCWludCBhID0gaW5wdXQuaW5kZXg7CisJaWQ8QU5UTFJUb2tlbj4gdG9rZW4gPSBbaW5wdXQgTFQ6MV07CisJW2lucHV0IGNvbnN1bWVdOworCWludCBiID0gaW5wdXQuaW5kZXg7CisJW2RlYnVnTGlzdGVuZXIgY29uc3VtZVRva2VuOnRva2VuXTsKKwlpZiAoYiA+IGErMSkgLy8gbXVzdCBoYXZlIGNvbnN1bWVkIGhpZGRlbiB0b2tlbnMKKwkJZm9yIChpbnQgaSA9IGErMTsgaSA8IGI7IGkrKykKKwkJCVtkZWJ1Z0xpc3RlbmVyIGNvbnN1bWVIaWRkZW5Ub2tlbjpbaW5wdXQgZ2V0VG9rZW46aV1dOworfQorCistIChOU0ludGVnZXIpIG1hcmsKK3sKKwlsYXN0TWFya2VyID0gW2lucHV0IG1hcmtdOworCVtkZWJ1Z0xpc3RlbmVyIG1hcms6bGFzdE1hcmtlcl07CisJcmV0dXJuIGxhc3RNYXJrZXI7Cit9CisKKy0gKHZvaWQpIHJld2luZAoreworCVtkZWJ1Z0xpc3RlbmVyIHJld2luZF07CisJW2lucHV0IHJld2luZF07Cit9CisKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKW1hcmtlcgoreworCVtkZWJ1Z0xpc3RlbmVyIHJld2luZDptYXJrZXJdOworCVtpbnB1dCByZXdpbmQ6bWFya2VyXTsKK30KKworLSAoaWQ8QU5UTFJUb2tlbj4pIExUOihOU0ludGVnZXIpaworeworCWlmICggaW5pdGlhbFN0cmVhbVN0YXRlICkKKwkJW3NlbGYgY29uc3VtZUluaXRpYWxIaWRkZW5Ub2tlbnNdOworCVtkZWJ1Z0xpc3RlbmVyIExUOmsgZm91bmRUb2tlbjpbaW5wdXQgTFQ6a11dOworCXJldHVybiBbaW5wdXQgTFQ6a107Cit9CisKKy0gKE5TSW50ZWdlcikgTEE6KE5TSW50ZWdlcilrCit7CisJaWYgKCBpbml0aWFsU3RyZWFtU3RhdGUgKQorCQlbc2VsZiBjb25zdW1lSW5pdGlhbEhpZGRlblRva2Vuc107CisJW2RlYnVnTGlzdGVuZXIgTFQ6ayBmb3VuZFRva2VuOltpbnB1dCBMVDprXV07CisJcmV0dXJuIFtpbnB1dCBMQTprXTsKK30KKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOihOU0ludGVnZXIpaQoreworICAgIHJldHVybiBbaW5wdXQgZ2V0VG9rZW46aV07Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0SW5kZXgKK3sKKyAgICByZXR1cm4gaW5wdXQuaW5kZXg7Cit9CisKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyCit7Cit9CisKKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcilpbmRleAoreworICAgIC8vIFRPRE86IGltcGxlbWVudCBzZWVrIGluIGRiZyBpbnRlcmZhY2UKKyAgICAvLyBkYi5zZWVrKGluZGV4KTsKKyAgICBbaW5wdXQgc2VlazppbmRleF07Cit9CisKKy0gKE5TSW50ZWdlcikgc2l6ZQoreworICAgIHJldHVybiBbaW5wdXQgc2l6ZV07Cit9CisKKy0gKGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBnZXRUb2tlblNvdXJjZQoreworICAgIHJldHVybiBbaW5wdXQgZ2V0VG9rZW5Tb3VyY2VdOworfQorCistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lCit7CisgICAgcmV0dXJuIFtbaW5wdXQgZ2V0VG9rZW5Tb3VyY2VdIGdldFNvdXJjZU5hbWVdOworfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworICAgIHJldHVybiBbaW5wdXQgdG9TdHJpbmddOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZworeworICAgIHJldHVybiBbaW5wdXQgdG9TdHJpbmddOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG9FbmQ6KE5TSW50ZWdlcilzdG9wSW5kZXgKK3sKKyAgICByZXR1cm4gW2lucHV0IHRvU3RyaW5nRnJvbVN0YXJ0OnN0YXJ0SW5kZXggVG9FbmQ6c3RvcEluZGV4XTsKK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4gVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuCit7CisgICAgcmV0dXJuIFtpbnB1dCB0b1N0cmluZ0Zyb21TdGFydDpbc3RhcnRUb2tlbiBnZXRTdGFydF0gVG9FbmQ6W3N0b3BUb2tlbiBnZXRTdG9wVG9rZW5dXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRkMDdlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSRGVidWdFdmVudExpc3RlbmVyLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yIDogQU5UTFJCYXNlVHJlZUFkYXB0b3IgeworCWlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPiBkZWJ1Z0xpc3RlbmVyOworCUFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKnRyZWVBZGFwdG9yOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFUcmVlQWRhcHRvciBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pYURlYnVnTGlzdGVuZXI7CisKKy0gKGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPilkZWJ1Z0xpc3RlbmVyOworLSAodm9pZCkgc2V0RGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWFEZWJ1Z0xpc3RlbmVyOworCistIChBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopIGdldFRyZWVBZGFwdG9yOworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKilhVHJlZUFkYXB0b3I7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlQWRhcHRvci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjNGM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlQWRhcHRvci5tCkBAIC0wLDAgKzEsMjI5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRGVidWdUcmVlQWRhcHRvci5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkRlYnVnVHJlZUFkYXB0b3IKKworCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFUcmVlQWRhcHRvciBkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pYURlYnVnTGlzdGVuZXIKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRdOworCWlmIChzZWxmKSB7CisJCVtzZWxmIHNldERlYnVnTGlzdGVuZXI6YURlYnVnTGlzdGVuZXJdOworCQlbc2VsZiBzZXRUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3JdOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldERlYnVnTGlzdGVuZXI6IG5pbF07CisgICAgW3NlbGYgc2V0VHJlZUFkYXB0b3I6IG5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXIKK3sKKyAgICByZXR1cm4gZGVidWdMaXN0ZW5lcjsgCit9CisKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyCit7CisgICAgaWYgKGRlYnVnTGlzdGVuZXIgIT0gYURlYnVnTGlzdGVuZXIpIHsKKyAgICAgICAgWyhpZDxBTlRMUlRyZWVBZGFwdG9yLE5TT2JqZWN0PilhRGVidWdMaXN0ZW5lciByZXRhaW5dOworICAgICAgICBbKGlkPEFOVExSVHJlZUFkYXB0b3IsTlNPYmplY3Q+KWRlYnVnTGlzdGVuZXIgcmVsZWFzZV07CisgICAgICAgIGRlYnVnTGlzdGVuZXIgPSBhRGVidWdMaXN0ZW5lcjsKKyAgICB9Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKikgZ2V0VHJlZUFkYXB0b3IKK3sKKyAgICByZXR1cm4gdHJlZUFkYXB0b3I7IAorfQorCistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjogKEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKikgYVRyZWVBZGFwdG9yCit7CisgICAgaWYgKHRyZWVBZGFwdG9yICE9IGFUcmVlQWRhcHRvcikgeworICAgICAgICBbYVRyZWVBZGFwdG9yIHJldGFpbl07CisgICAgICAgIFt0cmVlQWRhcHRvciByZWxlYXNlXTsKKyAgICAgICAgdHJlZUFkYXB0b3IgPSBhVHJlZUFkYXB0b3I7CisgICAgfQorfQorCisjcHJhZ21hIG1hcmsgLQorI3ByYWdtYSBtYXJrIFByb3h5IGltcGxlbWVudGF0aW9uCisKKy8vIGFueXRoaW5nIGVsc2UgdGhhdCBoYXNuJ3Qgc29tZSBkZWJ1Z2dlciBldmVudCBhc3NpY2lvYXRlZCB3aXRoIGl0LCBpcyBzaW1wbHkKKy8vIGZvcndhcmRlZCB0byB0aGUgYWN0dWFsIHRva2VuIHN0cmVhbQorLSAodm9pZCkgZm9yd2FyZEludm9jYXRpb246KE5TSW52b2NhdGlvbiAqKWFuSW52b2NhdGlvbgoreworCVthbkludm9jYXRpb24gaW52b2tlV2l0aFRhcmdldDpbc2VsZiBnZXRUcmVlQWRhcHRvcl1dOworfQorCisjcHJhZ21hIG1hcmsgLQorCisjcHJhZ21hIG1hcmsgQ29uc3RydWN0aW9uCisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBuZXdBTlRMUlRyZWVXaXRoVG9rZW46KGlkPEFOVExSVG9rZW4+KSBwYXlsb2FkCit7CisJaWQ8QU5UTFJCYXNlVHJlZT4gbmV3VHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjpwYXlsb2FkXTsKKwlbZGVidWdMaXN0ZW5lciBjcmVhdGVOb2RlOlt0cmVlQWRhcHRvciB1bmlxdWVJZEZvclRyZWU6bmV3VHJlZV0gZnJvbVRva2VuQXRJbmRleDpbcGF5bG9hZCBnZXRUb2tlbkluZGV4XV07CisJcmV0dXJuIG5ld1RyZWU7Cit9CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBlbXB0eVRyZWUKK3sKKwlpZDxBTlRMUkJhc2VUcmVlPiBuZXdUcmVlID0gW3RyZWVBZGFwdG9yIG5ld0VtcHR5VHJlZV07CisJW2RlYnVnTGlzdGVuZXIgY3JlYXRlTmlsTm9kZTpbdHJlZUFkYXB0b3IgdW5pcXVlSWRGb3JUcmVlOm5ld1RyZWVdXTsKKwlyZXR1cm4gbmV3VHJlZTsKK30KKworLyoJV2UgZG9uJ3QgaGF2ZSBkZWJ1ZyBldmVudHMgZm9yIHRob3NlOgorIC0gKGlkKSBjb3B5Tm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKK30KKy0gKGlkKSBjb3B5VHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUKK3sKK30KKyovCisKKy0gKHZvaWQpIGFkZENoaWxkOihpZDxBTlRMUkJhc2VUcmVlPiljaGlsZCB0b1RyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlCit7CisJW3RyZWVBZGFwdG9yIGFkZENoaWxkOmNoaWxkIHRvVHJlZTphVHJlZV07CisJW2RlYnVnTGlzdGVuZXIgYWRkQ2hpbGQ6W3RyZWVBZGFwdG9yIHVuaXF1ZUlkRm9yVHJlZTpjaGlsZF0gdG9UcmVlOltzZWxmIHVuaXF1ZUlkRm9yVHJlZTphVHJlZV1dOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgYmVjb21lUm9vdDooaWQ8QU5UTFJCYXNlVHJlZT4pbmV3Um9vdCBvbGQ6KGlkPEFOVExSQmFzZVRyZWU+KW9sZFJvb3QKK3sKKwlpZDxBTlRMUkJhc2VUcmVlPiBuZXdUcmVlID0gW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6bmV3Um9vdCBvbGQ6b2xkUm9vdF07CisJW2RlYnVnTGlzdGVuZXIgYmVjb21lUm9vdDpbdHJlZUFkYXB0b3IgdW5pcXVlSWRGb3JUcmVlOm5ld1RyZWVdIG9sZDpbc2VsZiB1bmlxdWVJZEZvclRyZWU6b2xkUm9vdF1dOworCXJldHVybiBuZXdUcmVlOworfQorCisvKiBoYW5kbGUgYnkgZm9yd2FyZEludm9jYXRpb246IAorLSAoTlNVSW50ZWdlcikgdW5pcXVlSWRGb3JUcmVlOihpZDxBTlRMUkJhc2VUcmVlPilhTm9kZQoreworfQorKi8KKworI3ByYWdtYSBtYXJrIFJld3JpdGUgUnVsZXMKKworIC0gKHZvaWQpIGFkZFRva2VuQXNDaGlsZDooaWQ8QU5UTFJUb2tlbj4pY2hpbGQgdG9UcmVlOihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZQoreworCWlkPEFOVExSQmFzZVRyZWU+IG5ld0NoaWxkID0gW3NlbGYgbmV3QU5UTFJUcmVlV2l0aFRva2VuOmNoaWxkXTsKKwlbc2VsZiBhZGRDaGlsZDpuZXdDaGlsZCB0b1RyZWU6YVRyZWVdOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgbWFrZVRva2VuOihpZDxBTlRMUlRva2VuPiluZXdSb290IHBhcmVudE9mOihpZDxBTlRMUkJhc2VUcmVlPilvbGRSb290Cit7CisJaWQ8QU5UTFJCYXNlVHJlZT4gbmV3Tm9kZSA9IFtzZWxmIG5ld0FOVExSVHJlZVdpdGhUb2tlbjpuZXdSb290XTsKKwlyZXR1cm4gW3NlbGYgYmVjb21lUm9vdDpuZXdOb2RlIG9sZDpvbGRSb290XTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSVHJlZVdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcil0b2tlblR5cGUKK3sKKwlpZDxBTlRMUkJhc2VUcmVlPiBuZXdUcmVlID0gW3RyZWVBZGFwdG9yIG5ld0FOVExSVHJlZVdpdGhUb2tlblR5cGU6dG9rZW5UeXBlXTsKKwlbZGVidWdMaXN0ZW5lciBjcmVhdGVOb2RlOlt0cmVlQWRhcHRvciB1bmlxdWVJZEZvclRyZWU6bmV3VHJlZV0gdGV4dDpuaWwgdHlwZTp0b2tlblR5cGVdOworCXJldHVybiBuZXdUcmVlOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJUcmVlV2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZSB0ZXh0OihOU1N0cmluZyAqKXRva2VuVGV4dAoreworCWlkPEFOVExSQmFzZVRyZWU+IG5ld1RyZWUgPSBbdHJlZUFkYXB0b3IgbmV3QU5UTFJUcmVlV2l0aFRva2VuVHlwZTp0b2tlblR5cGUgdGV4dDp0b2tlblRleHRdOworCVtkZWJ1Z0xpc3RlbmVyIGNyZWF0ZU5vZGU6W3RyZWVBZGFwdG9yIHVuaXF1ZUlkRm9yVHJlZTpuZXdUcmVlXSB0ZXh0OnRva2VuVGV4dCB0eXBlOnRva2VuVHlwZV07CisJcmV0dXJuIG5ld1RyZWU7Cit9CistIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJUcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gdG9rZW5UeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlCit7CisJaWQ8QU5UTFJCYXNlVHJlZT4gbmV3VHJlZSA9IFt0cmVlQWRhcHRvciBuZXdBTlRMUlRyZWVXaXRoVG9rZW46ZnJvbVRva2VuIHRva2VuVHlwZTp0b2tlblR5cGVdOworCVtkZWJ1Z0xpc3RlbmVyIGNyZWF0ZU5vZGU6W3RyZWVBZGFwdG9yIHVuaXF1ZUlkRm9yVHJlZTpuZXdUcmVlXSB0ZXh0OmZyb21Ub2tlbi50ZXh0IHR5cGU6dG9rZW5UeXBlXTsKKwlyZXR1cm4gbmV3VHJlZTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5ld0FOVExSVHJlZVdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuIHRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZSB0ZXh0OihOU1N0cmluZyAqKXRva2VuVGV4dAoreworCWlkPEFOVExSQmFzZVRyZWU+IG5ld1RyZWUgPSBbdHJlZUFkYXB0b3IgbmV3QU5UTFJUcmVlV2l0aFRva2VuOmZyb21Ub2tlbiB0b2tlblR5cGU6dG9rZW5UeXBlIHRleHQ6dG9rZW5UZXh0XTsKKwlbZGVidWdMaXN0ZW5lciBjcmVhdGVOb2RlOlt0cmVlQWRhcHRvciB1bmlxdWVJZEZvclRyZWU6bmV3VHJlZV0gdGV4dDp0b2tlblRleHQgdHlwZTp0b2tlblR5cGVdOworCXJldHVybiBuZXdUcmVlOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgbmV3QU5UTFJUcmVlV2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW4gdGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQKK3sKKwlpZDxBTlRMUkJhc2VUcmVlPiBuZXdUcmVlID0gW3RyZWVBZGFwdG9yIG5ld0FOVExSVHJlZVdpdGhUb2tlbjpmcm9tVG9rZW4gdGV4dDp0b2tlblRleHRdOworCVtkZWJ1Z0xpc3RlbmVyIGNyZWF0ZU5vZGU6W3RyZWVBZGFwdG9yIHVuaXF1ZUlkRm9yVHJlZTpuZXdUcmVlXSB0ZXh0OnRva2VuVGV4dCB0eXBlOmZyb21Ub2tlbi50eXBlXTsKKwlyZXR1cm4gbmV3VHJlZTsKK30KKworI3ByYWdtYSBtYXJrIENvbnRlbnQKKworLyogaGFuZGxlZCBieSBmb3J3YXJkSW52b2NhdGlvbjoKKy0gKE5TSW50ZWdlcikgdG9rZW5UeXBlRm9yTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKK30KKyAKKy0gKHZvaWQpIHNldFRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZSBmb3JOb2RlOihpZClhTm9kZQoreworfQorCistIChOU1N0cmluZyAqKSB0ZXh0Rm9yTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKK30KKyAKKy0gKHZvaWQpIHNldFRleHQ6KE5TU3RyaW5nICopdG9rZW5UZXh0IGZvck5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlCit7Cit9CisqLworLSAodm9pZCkgc2V0Qm91bmRhcmllc0ZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlIGZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiB0b1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW4KK3sKKwlbdHJlZUFkYXB0b3Igc2V0Qm91bmRhcmllc0ZvclRyZWU6YVRyZWUgZnJvbVRva2VuOnN0YXJ0VG9rZW4gdG9Ub2tlbjpzdG9wVG9rZW5dOworCWlmIChhVHJlZSAmJiBzdGFydFRva2VuICYmIHN0b3BUb2tlbikgeworCQlbZGVidWdMaXN0ZW5lciBzZXRUb2tlbkJvdW5kYXJpZXNGb3JUcmVlOlthVHJlZSBoYXNoXSBGcm9tOltzdGFydFRva2VuIGdldFRva2VuSW5kZXhdIFRvOltzdG9wVG9rZW4gZ2V0VG9rZW5JbmRleF1dOworCX0KK30KKy8qIGhhbmRsZWQgYnkgZm9yd2FyZEludm9jYXRpb246CistIChOU0ludGVnZXIpIHRva2VuU3RhcnRJbmRleEZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlCit7Cit9CisgCistIChOU0ludGVnZXIpIHRva2VuU3RvcEluZGV4Rm9yVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUKK3sKK30KKyovCisKKyNwcmFnbWEgbWFyayBOYXZpZ2F0aW9uIC8gVHJlZSBQYXJzaW5nCisvKiBoYW5kbGVkIGJ5IGZvcndhcmRJbnZvY2F0aW9uOgorLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGNoaWxkRm9yTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pIGFOb2RlIGF0SW5kZXg6KE5TSW50ZWdlcikgaQoreworfQorIAorLSAoTlNJbnRlZ2VyKSBjaGlsZENvdW50Rm9yVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pIGFUcmVlCit7Cit9CisqLworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2Y2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDY3IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSRGVidWdUcmVlTm9kZVN0cmVhbSA6IE5TT2JqZWN0IDxBTlRMUlRyZWVOb2RlU3RyZWFtPiB7CisJaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+IGRlYnVnTGlzdGVuZXI7CisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7CisJQk9PTCBpbml0aWFsU3RyZWFtU3RhdGU7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWRlYnVnZ2VyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGlucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgYVRyZWVOb2RlU3RyZWFtOworCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjogKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhVHJlZUFkYXB0b3I7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVOb2RlU3RyZWFtIGNvbmZvcm1hbmNlCisKKy0gKGlkKSBMVDooTlNJbnRlZ2VyKWs7CistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXM6KEJPT0wpZmxhZzsKKworI3ByYWdtYSBtYXJrIEFOVExSSW50U3RyZWFtIGNvbmZvcm1hbmNlCistICh2b2lkKSBjb25zdW1lOworLSAoTlNJbnRlZ2VyKSBMQTooTlNVSW50ZWdlcikgaTsKKy0gKE5TVUludGVnZXIpIG1hcms7CistIChOU1VJbnRlZ2VyKSBnZXRJbmRleDsKKy0gKHZvaWQpIHJld2luZDooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVsZWFzZTooTlNVSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgc2VlazooTlNVSW50ZWdlcikgaW5kZXg7CistIChOU1VJbnRlZ2VyKSBzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjU1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0ubQpAQCAtMCwwICsxLDE3NSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtCisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjooaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KWRlYnVnZ2VyCit7CisJc2VsZiA9IFtzdXBlciBpbml0XTsKKwlpZiAoc2VsZikgeworCQlbc2VsZiBzZXREZWJ1Z0xpc3RlbmVyOmRlYnVnZ2VyXTsKKwkJW3NlbGYgc2V0VHJlZUFkYXB0b3I6W3RoZVN0cmVhbSB0cmVlQWRhcHRvcl1dOworCQlbc2VsZiBzZXRJbnB1dDp0aGVTdHJlYW1dOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldERlYnVnTGlzdGVuZXI6IG5pbF07CisgICAgW3NlbGYgc2V0VHJlZUFkYXB0b3I6IG5pbF07CisgICAgaW5wdXQgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXIKK3sKKyAgICByZXR1cm4gZGVidWdMaXN0ZW5lcjsgCit9CisKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyCit7CisgICAgaWYgKGRlYnVnTGlzdGVuZXIgIT0gYURlYnVnTGlzdGVuZXIpIHsKKyAgICAgICAgWyhpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4pYURlYnVnTGlzdGVuZXIgcmV0YWluXTsKKyAgICAgICAgWyhpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4pZGVidWdMaXN0ZW5lciByZWxlYXNlXTsKKyAgICAgICAgZGVidWdMaXN0ZW5lciA9IGFEZWJ1Z0xpc3RlbmVyOworICAgIH0KK30KKworCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3IKK3sKKyAgICByZXR1cm4gdHJlZUFkYXB0b3I7IAorfQorCistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjogKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhVHJlZUFkYXB0b3IKK3sKKyAgICBpZiAodHJlZUFkYXB0b3IgIT0gYVRyZWVBZGFwdG9yKSB7CisgICAgICAgIFsoaWQ8QU5UTFJUcmVlQWRhcHRvcixOU09iamVjdD4pYVRyZWVBZGFwdG9yIHJldGFpbl07CisgICAgICAgIFsoaWQ8QU5UTFJUcmVlQWRhcHRvcixOU09iamVjdD4pdHJlZUFkYXB0b3IgcmVsZWFzZV07CisgICAgICAgIHRyZWVBZGFwdG9yID0gYVRyZWVBZGFwdG9yOworICAgIH0KK30KKworCistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgaW5wdXQKK3sKKyAgICByZXR1cm4gaW5wdXQ7IAorfQorCistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pIGFUcmVlTm9kZVN0cmVhbQoreworICAgIGlmIChpbnB1dCAhPSBhVHJlZU5vZGVTdHJlYW0pIHsKKyAgICAgICAgW2lucHV0IHJlbGVhc2VdOworICAgICAgICBbKGlkPEFOVExSVHJlZU5vZGVTdHJlYW0sTlNPYmplY3Q+KWFUcmVlTm9kZVN0cmVhbSByZXRhaW5dOworICAgIH0KKyAgICBpbnB1dCA9IGFUcmVlTm9kZVN0cmVhbTsKK30KKworCisjcHJhZ21hIG1hcmsgQU5UTFJUcmVlTm9kZVN0cmVhbSBjb25mb3JtYW5jZQorCistIChpZCkgTFQ6KE5TSW50ZWdlcilrCit7CisJaWQgbm9kZSA9IFtpbnB1dCBMVDprXTsKKwl1bnNpZ25lZCBoYXNoID0gW3RyZWVBZGFwdG9yIHVuaXF1ZUlkRm9yVHJlZTpub2RlXTsKKwlOU1N0cmluZyAqdGV4dCA9IFt0cmVlQWRhcHRvciB0ZXh0Rm9yTm9kZTpub2RlXTsKKwlpbnQgdHlwZSA9IFt0cmVlQWRhcHRvciB0b2tlblR5cGVGb3JOb2RlOm5vZGVdOworCVtkZWJ1Z0xpc3RlbmVyIExUOmsgZm91bmROb2RlOmhhc2ggb2ZUeXBlOnR5cGUgdGV4dDp0ZXh0XTsKKwlyZXR1cm4gbm9kZTsKK30KKworLSAodm9pZCkgc2V0VW5pcXVlTmF2aWdhdGlvbk5vZGVzOihCT09MKWZsYWcKK3sKKwlbaW5wdXQgc2V0VW5pcXVlTmF2aWdhdGlvbk5vZGVzOmZsYWddOworfQorCisjcHJhZ21hIG1hcmsgQU5UTFJJbnRTdHJlYW0gY29uZm9ybWFuY2UKKy0gKHZvaWQpIGNvbnN1bWUKK3sKKwlpZCBub2RlID0gW2lucHV0IExUOjFdOworCVtpbnB1dCBjb25zdW1lXTsKKwl1bnNpZ25lZCBoYXNoID0gW3RyZWVBZGFwdG9yIHVuaXF1ZUlkRm9yVHJlZTpub2RlXTsKKwlOU1N0cmluZyAqdGhlVGV4dCA9IFt0cmVlQWRhcHRvciB0ZXh0Rm9yTm9kZTpub2RlXTsKKwlpbnQgYVR5cGUgPSBbdHJlZUFkYXB0b3IgdG9rZW5UeXBlRm9yTm9kZTpub2RlXTsKKwlbZGVidWdMaXN0ZW5lciBjb25zdW1lTm9kZTpoYXNoIG9mVHlwZTphVHlwZSB0ZXh0OnRoZVRleHRdOworfQorCistIChOU0ludGVnZXIpIExBOihOU1VJbnRlZ2VyKSBpCit7CisJaWQ8QU5UTFJCYXNlVHJlZT4gbm9kZSA9IFtzZWxmIExUOjFdOworCXJldHVybiBub2RlLnR5cGU7Cit9CisKKy0gKE5TVUludGVnZXIpIG1hcmsKK3sKKwl1bnNpZ25lZCBsYXN0TWFya2VyID0gW2lucHV0IG1hcmtdOworCVtkZWJ1Z0xpc3RlbmVyIG1hcms6bGFzdE1hcmtlcl07CisJcmV0dXJuIGxhc3RNYXJrZXI7Cit9CisKKy0gKE5TVUludGVnZXIpIGdldEluZGV4Cit7CisJcmV0dXJuIGlucHV0LmluZGV4OworfQorCistICh2b2lkKSByZXdpbmQ6KE5TVUludGVnZXIpIG1hcmtlcgoreworCVtpbnB1dCByZXdpbmQ6bWFya2VyXTsKKwlbZGVidWdMaXN0ZW5lciByZXdpbmQ6bWFya2VyXTsKK30KKworLSAodm9pZCkgcmV3aW5kCit7CisJW2lucHV0IHJld2luZF07CisJW2RlYnVnTGlzdGVuZXIgcmV3aW5kXTsKK30KKworLSAodm9pZCkgcmVsZWFzZTooTlNVSW50ZWdlcikgbWFya2VyCit7CisJW2lucHV0IHJlbGVhc2U6bWFya2VyXTsKK30KKworLSAodm9pZCkgc2VlazooTlNVSW50ZWdlcikgaW5kZXgKK3sKKwlbaW5wdXQgc2VlazppbmRleF07CisJLy8gdG9kbzogc2VlayBtaXNzaW5nIGluIGRlYnVnIHByb3RvY29sCit9CisKKy0gKE5TVUludGVnZXIpIHNpemUKK3sKKwlyZXR1cm4gW2lucHV0IHNpemVdOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZ0Zyb21Ub2tlbjooaWQpc3RhcnROb2RlIFRvVG9rZW46KGlkKXN0b3BOb2RlCit7CisgICAgcmV0dXJuIFtpbnB1dCB0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnROb2RlIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0b3BOb2RlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxYzFlNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlUGFyc2VyLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUkRlYnVnRXZlbnRQcm94eS5oIgorI2ltcG9ydCAiQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJEZWJ1Z1RyZWVQYXJzZXIgOiBBTlRMUlRyZWVQYXJzZXIgeworCWlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPiBkZWJ1Z0xpc3RlbmVyOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlU3RyZWFtOworLSAoaWQpIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZVN0cmVhbQorCQkJCSBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyOworCS8vIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0KKwkJCQlkZWJ1Z0xpc3RlbmVyOihpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pdGhlRGVidWdMaXN0ZW5lcgorCQkJCSBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyOworCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXI7CistICh2b2lkKSBzZXREZWJ1Z0xpc3RlbmVyOiAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KSBhRGVidWdMaXN0ZW5lcjsKKworLSAodm9pZCkgcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW46KGlkPEFOVExSSW50U3RyZWFtPilpbnB1dFN0cmVhbSAKKwkJCQkJCSAgZXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKWUgCisJCQkJCQkgIHRva2VuVHlwZTooQU5UTFJUb2tlblR5cGUpdHR5cGUgCisJCQkJCQkJIGZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3c7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRGVidWdUcmVlUGFyc2VyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZVBhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTI5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRlYnVnVHJlZVBhcnNlci5tCkBAIC0wLDAgKzEsMTI4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRGVidWdUcmVlUGFyc2VyLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSRGVidWdUcmVlUGFyc2VyCisKKy0gKGlkKSBpbml0V2l0aFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVTdHJlYW0KK3sKKwlyZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmVlTm9kZVN0cmVhbTp0aGVTdHJlYW0gZGVidWdMaXN0ZW5lcjpuaWwgZGVidWdnZXJQb3J0Oi0xXTsKK30KKworLSAoaWQpIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZVN0cmVhbQorCQkJCSBkZWJ1Z2dlclBvcnQ6KE5TSW50ZWdlcilwb3J0TnVtYmVyCit7CisJcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06dGhlU3RyZWFtIGRlYnVnTGlzdGVuZXI6bmlsIGRlYnVnZ2VyUG9ydDpwb3J0TnVtYmVyXTsKK30KKworLSAoaWQpIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZVN0cmVhbQorCQkJCWRlYnVnTGlzdGVuZXI6KGlkPEFOVExSRGVidWdFdmVudExpc3RlbmVyPil0aGVEZWJ1Z0xpc3RlbmVyCisJCQkJIGRlYnVnZ2VyUG9ydDooTlNJbnRlZ2VyKXBvcnROdW1iZXIKK3sKKwlpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4gZGVidWdnZXIgPSBuaWw7CisJaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gdHJlZU5vZGVTdHJlYW0gPSBuaWw7CisJaWYgKHRoZURlYnVnTGlzdGVuZXIpIHsKKwkJZGVidWdnZXIgPSAoaWQ8QU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXI+KXRoZURlYnVnTGlzdGVuZXI7CisJfSBlbHNlIHsKKwkJZGVidWdnZXIgPSBbW0FOVExSRGVidWdFdmVudFByb3h5IGFsbG9jXSBpbml0V2l0aEdyYW1tYXJOYW1lOltzZWxmIGdyYW1tYXJGaWxlTmFtZV0gZGVidWdnZXJQb3J0OnBvcnROdW1iZXJdOworCX0KKwlpZiAodGhlU3RyZWFtICYmICFbdGhlU3RyZWFtIGlzS2luZE9mQ2xhc3M6W0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbSBjbGFzc11dKSB7CisJCXRyZWVOb2RlU3RyZWFtID0gW1tBTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0gYWxsb2NdIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06dGhlU3RyZWFtIGRlYnVnTGlzdGVuZXI6ZGVidWdnZXJdOworCX0gZWxzZSB7CisJCXRyZWVOb2RlU3RyZWFtID0gdGhlU3RyZWFtOworCX0KKwlzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RyZWFtOnRyZWVOb2RlU3RyZWFtXTsKKwlpZiAoIHNlbGYgKSB7CisJCVtzZWxmIHNldERlYnVnTGlzdGVuZXI6ZGVidWdnZXJdOworCQkvL1tkZWJ1Z2dlciByZWxlYXNlXTsKKwkJLy9bdHJlZU5vZGVTdHJlYW0gcmVsZWFzZV07CisJCVtkZWJ1Z0xpc3RlbmVyIHdhaXRGb3JEZWJ1Z2dlckNvbm5lY3Rpb25dOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldERlYnVnTGlzdGVuZXI6IG5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGRlYnVnTGlzdGVuZXIKK3sKKyAgICByZXR1cm4gZGVidWdMaXN0ZW5lcjsgCit9CisKKy0gKHZvaWQpIHNldERlYnVnTGlzdGVuZXI6IChpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcj4pIGFEZWJ1Z0xpc3RlbmVyCit7CisgICAgaWYgKGRlYnVnTGlzdGVuZXIgIT0gYURlYnVnTGlzdGVuZXIpIHsKKyAgICAgICAgWyhpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4pYURlYnVnTGlzdGVuZXIgcmV0YWluXTsKKyAgICAgICAgWyhpZDxBTlRMUkRlYnVnRXZlbnRMaXN0ZW5lcixOU09iamVjdD4pZGVidWdMaXN0ZW5lciByZWxlYXNlXTsKKyAgICAgICAgZGVidWdMaXN0ZW5lciA9IGFEZWJ1Z0xpc3RlbmVyOworICAgIH0KK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBPdmVycmlkZXMKKworLSAodm9pZCkgYmVnaW5SZXN5bmMKK3sKKwlbZGVidWdMaXN0ZW5lciBiZWdpblJlc3luY107Cit9CisKKy0gKHZvaWQpIGVuZFJlc3luYworeworCVtkZWJ1Z0xpc3RlbmVyIGVuZFJlc3luY107Cit9CistICh2b2lkKWJlZ2luQmFja3RyYWNraW5nOihOU0ludGVnZXIpbGV2ZWwKK3sKKwlbZGVidWdMaXN0ZW5lciBiZWdpbkJhY2t0cmFjazpsZXZlbF07Cit9CisKKy0gKHZvaWQpZW5kQmFja3RyYWNraW5nOihOU0ludGVnZXIpbGV2ZWwgd2FzU3VjY2Vzc2Z1bDooQk9PTClzdWNjZXNzZnVsCit7CisJW2RlYnVnTGlzdGVuZXIgZW5kQmFja3RyYWNrOmxldmVsIHdhc1N1Y2Nlc3NmdWw6c3VjY2Vzc2Z1bF07Cit9CisKKy0gKHZvaWQpIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuOihpZDxBTlRMUkludFN0cmVhbT4paW5wdXRTdHJlYW0gCisJCQkJCQkgIGV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKillIAorCQkJCQkJICB0b2tlblR5cGU6KEFOVExSVG9rZW5UeXBlKXR0eXBlIAorCQkJCQkJCSBmb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93Cit7Cisjd2FybmluZyBUT0RPOiByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbiBpbiBkZWJ1Z2dlcgorCVtzZWxmIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuOmlucHV0U3RyZWFtIGV4Y2VwdGlvbjplIGZvbGxvdzpmb2xsb3ddOworfQorCistICh2b2lkKSByZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ6KGlkPEFOVExSSW50U3RyZWFtPilpbnB1dFN0cmVhbQorCQkJCQkJZXhjZXB0aW9uOihOU0V4Y2VwdGlvbiAqKWUKKwkJCQkJCSAgIGZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3cKK3sKKyN3YXJuaW5nIFRPRE86IHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldCBpbiBkZWJ1Z2dlcgorCVtzdXBlciByZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQ6aW5wdXRTdHJlYW1dOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRvdWJsZUtleU1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEb3VibGVLZXlNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg1ODc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEb3VibGVLZXlNYXAuaApAQCAtMCwwICsxLDI4IEBACisKKyNpbXBvcnQgIkFNdXRhYmxlQXJyYXkuaCIKKyNpbXBvcnQgIkFNdXRhYmxlRGljdGlvbmFyeS5oIgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorLyoqCisgKiBTb21ldGltZXMgd2UgbmVlZCB0byBtYXAgYSBrZXkgdG8gYSB2YWx1ZSBidXQga2V5IGlzIHR3byBwaWVjZXMgb2YgZGF0YS4KKyAqIFRoaXMgbmVzdGVkIGhhc2ggdGFibGUgc2F2ZXMgY3JlYXRpbmcgYSBzaW5nbGUga2V5IGVhY2ggdGltZSB3ZSBhY2Nlc3MKKyAqIG1hcDsgYXZvaWRzIG1lbSBjcmVhdGlvbi4KKyAqLworCitAY2xhc3MgQU11dGFibGVBcnJheTsKKworQGludGVyZmFjZSBBTlRMUkRvdWJsZUtleU1hcCA6IEFOVExSTGlua0Jhc2UgeworICAgIEFNdXRhYmxlRGljdGlvbmFyeSAqZGF0YTsKK30KKworLSAoaWQpIGluaXQ7CistIChpZCkgc2V0T2JqZWN0OihpZCl2IGZvcktleTE6KGlkKWsxIGZvcktleTI6KE5TU3RyaW5nICopazI7CistIChpZCkgb2JqZWN0Rm9yS2V5MTooaWQpazEgZm9yS2V5MjooaWQpazI7CistIChBTXV0YWJsZURpY3Rpb25hcnkgKikgb2JqZWN0Rm9yS2V5OihpZClrMTsKKy0gKE5TQXJyYXkgKikgdmFsdWVzRm9yS2V5OihpZClrMTsKKy0gKE5TQXJyYXkgKikgYWxsS2V5czE7CistIChBTXV0YWJsZUFycmF5ICopIGFsbEtleXMyOihpZClrMTsKKy0gKE5TQXJyYXkgKikgdmFsdWVzOworCitAcHJvcGVydHkgKHJldGFpbikgQU11dGFibGVEaWN0aW9uYXJ5ICpkYXRhOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkRvdWJsZUtleU1hcC5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEb3VibGVLZXlNYXAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQyZWYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJEb3VibGVLZXlNYXAubQpAQCAtMCwwICsxLDEwMSBAQAorI2ltcG9ydCAiQU5UTFJEb3VibGVLZXlNYXAuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSRG91YmxlS2V5TWFwCisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgICE9IG5pbCApIHsKKyAgICAgICAgZGF0YSA9IFtbQU11dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6MzBdIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgc2V0T2JqZWN0OihpZCl2IGZvcktleTE6KGlkKWsxIGZvcktleTI6KGlkKWsyCit7CisgICAgQU11dGFibGVEaWN0aW9uYXJ5ICpkYXRhMiA9IFtkYXRhIG9iamVjdEZvcktleTprMV07CisgICAgaWQgcHJldiA9IG5pbDsKKyAgICBpZiAoIGRhdGEyID09IG5pbCApIHsKKyAgICAgICAgZGF0YTIgPSBbQU11dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6MzBdOworICAgICAgICBbZGF0YSBzZXRPYmplY3Q6ZGF0YTIgZm9yS2V5OmsxXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByZXYgPSBbZGF0YTIgb2JqZWN0Rm9yS2V5OmsyXTsKKyAgICB9CisgICAgW2RhdGEyIHNldE9iamVjdDp2IGZvcktleTprMl07CisgICAgcmV0dXJuIHByZXY7Cit9CisKKy0gKGlkKSBvYmplY3RGb3JLZXkxOihpZClrMSBmb3JLZXkyOihpZClrMgoreworICAgIEFNdXRhYmxlRGljdGlvbmFyeSAqZGF0YTIgPSBbZGF0YSBvYmplY3RGb3JLZXk6azFdOworICAgIGlmICggZGF0YTIgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICByZXR1cm4gW2RhdGEyIG9iamVjdEZvcktleTprMl07Cit9CisKKy0gKEFNdXRhYmxlRGljdGlvbmFyeSAqKSBvYmplY3RGb3JLZXk6KGlkKWsxCit7CisgICAgcmV0dXJuIFtkYXRhIG9iamVjdEZvcktleTprMV07Cit9CisKKworLyoqCisgKiBHZXQgYWxsIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggcHJpbWFyeSBrZXkKKyAqLworLSAoTlNBcnJheSAqKSB2YWx1ZXNGb3JLZXk6KGlkKWsxCit7CisgICAgQU11dGFibGVEaWN0aW9uYXJ5ICpkYXRhMiA9IFtkYXRhIG9iamVjdEZvcktleTprMV07CisgICAgaWYgKCBkYXRhMiA9PSBuaWwgKQorICAgICAgICByZXR1cm4gbmlsOworICAgIHJldHVybiBbZGF0YTIgYWxsVmFsdWVzXTsKK30KKworCisvKioKKyAqIGdldCBhbGwgcHJpbWFyeSBrZXlzCisgKi8KKy0gKE5TQXJyYXkgKikgYWxsS2V5czEKK3sKKyAgICByZXR1cm4gW2RhdGEgYWxsS2V5c107Cit9CisKKworLyoqCisgKiBnZXQgYWxsIHNlY29uZGFyeSBrZXlzIGFzc29jaWF0ZWQgd2l0aCBhIHByaW1hcnkga2V5CisgKi8KKy0gKE5TQXJyYXkgKikgYWxsS2V5czI6KGlkKWsxCit7CisgICAgQU11dGFibGVEaWN0aW9uYXJ5ICogZGF0YTIgPSBbZGF0YSBvYmplY3RGb3JLZXk6azFdOworICAgIGlmICggZGF0YTIgPT0gbmlsICkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICByZXR1cm4gW2RhdGEyIGFsbEtleXNdOworfQorCistIChBTXV0YWJsZUFycmF5ICopIHZhbHVlcworeworLy8gICAgQU5UTFJIYXNoTWFwICpzID0gW1tBTlRMUkhhc2hNYXAgbmV3QU5UTFJIYXNoTWFwV2l0aExlbjozMF07CisgICAgQU11dGFibGVBcnJheSAqcyA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjMwXTsKKyAgICAKKyAgICBmb3IgKEFNdXRhYmxlRGljdGlvbmFyeSAqazIgaW4gW2RhdGEgYWxsVmFsdWVzXSkgeworICAgICAgICAKKyAgICAgICAgZm9yICggTlNTdHJpbmcgKnYgaW4gW2syIGFsbFZhbHVlc10pIHsKKyAgICAgICAgICAgIFtzIGFkZE9iamVjdDp2XTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHM7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJDb21tb25Ub2tlbiIgKTsKKyNlbmRpZgorICAgIFtkYXRhIHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworQHN5bnRoZXNpemUgZGF0YTsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTg0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKK30KKworKyAoQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKikgbmV3RXhjZXB0aW9uOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dFN0cmVhbSBkZWNpc2lvbk51bWJlcjooTlNJbnRlZ2VyKWFEZWNpc2lvbk51bWJlcjsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW0gZGVjaXNpb25OdW1iZXI6KE5TSW50ZWdlcikgYURlY2lzaW9uTnVtYmVyOworCitAcHJvcGVydHkgaW50IGRlY2lzaW9uTnVtYmVyOworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJFYXJseUV4aXRFeGNlcHRpb24ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZmYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJFYXJseUV4aXRFeGNlcHRpb24ubQpAQCAtMCwwICsxLDU0IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRWFybHlFeGl0RXhjZXB0aW9uLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uCisKKysgKEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICopIG5ld0V4Y2VwdGlvbjooaWQ8QU5UTFJJbnRTdHJlYW0+KSBhbklucHV0U3RyZWFtIGRlY2lzaW9uTnVtYmVyOihOU0ludGVnZXIpIGFEZWNpc2lvbk51bWJlcgoreworCXJldHVybiBbW3NlbGYgYWxsb2NdIGluaXRXaXRoU3RyZWFtOmFuSW5wdXRTdHJlYW0gZGVjaXNpb25OdW1iZXI6YURlY2lzaW9uTnVtYmVyXTsKK30KKworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dFN0cmVhbSBkZWNpc2lvbk51bWJlcjooTlNJbnRlZ2VyKSBhRGVjaXNpb25OdW1iZXIKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06YW5JbnB1dFN0cmVhbV0pICE9IG5pbCkgeworCQlkZWNpc2lvbk51bWJlciA9IGFEZWNpc2lvbk51bWJlcjsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisJTlNNdXRhYmxlU3RyaW5nICpkZXNjID0gKE5TTXV0YWJsZVN0cmluZyAqKVtzdXBlciBkZXNjcmlwdGlvbl07CisJW2Rlc2MgYXBwZW5kRm9ybWF0OkAiIGRlY2lzaW9uOiVkIiwgZGVjaXNpb25OdW1iZXJdOworCXJldHVybiBkZXNjOworfQorCitAc3ludGhlc2l6ZSBkZWNpc2lvbk51bWJlcjsKK0BlbmQKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJFcnJvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTU3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkVycm9yLmgKQEAgLTAsMCArMSwzNSBAQAorLy8KKy8vICBBTlRMUkVycm9yLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDMwLzAzLzIwMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgSWFuIE1pY2hlbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworI2RlZmluZSBBTlRMUkVycm9yRG9tYWluIEAiQU5UTFJFcnJvciIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmI2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCisKK0BpbnRlcmZhY2UgQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uCit7CisJTlNTdHJpbmcgKnByZWRpY2F0ZTsKKwlOU1N0cmluZyAqcnVsZU5hbWU7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluKSBOU1N0cmluZyAqcHJlZGljYXRlOworQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICpydWxlTmFtZTsKKworKyAoQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gKikgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKXRoZVJ1bGVOYW1lIHByZWRpY2F0ZTooTlNTdHJpbmcgKil0aGVQcmVkaWNhdGUgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtOworLSAoQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gKikgaW5pdFdpdGhSdWxlTmFtZTooTlNTdHJpbmcgKil0aGVSdWxlTmFtZSBwcmVkaWNhdGU6KE5TU3RyaW5nICopdGhlUHJlZGljYXRlIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KXRoZVN0cmVhbTsKKworI2lmZGVmIERPTlRVU0VZRVQKKy0gKE5TU3RyaW5nICopIGdldFByZWRpY2F0ZTsKKy0gKHZvaWQpIHNldFByZWRpY2F0ZTooTlNTdHJpbmcgKil0aGVQcmVkaWNhdGU7CistIChOU1N0cmluZyAqKSBnZXRSdWxlTmFtZTsKKy0gKHZvaWQpIHNldFJ1bGVOYW1lOihOU1N0cmluZyAqKXRoZVJ1bGVOYW1lOworI2VuZGlmCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjc3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5tCkBAIC0wLDAgKzEsOTYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24KKworQHN5bnRoZXNpemUgcHJlZGljYXRlOworQHN5bnRoZXNpemUgcnVsZU5hbWU7CisKKysgKEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uICopIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKil0aGVSdWxlTmFtZSBwcmVkaWNhdGU6KE5TU3RyaW5nICopdGhlUHJlZGljYXRlIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KXRoZVN0cmVhbQoreworCXJldHVybiBbW0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFJ1bGVOYW1lOnRoZVJ1bGVOYW1lIHByZWRpY2F0ZTp0aGVQcmVkaWNhdGUgc3RyZWFtOnRoZVN0cmVhbV07Cit9CisKKy0gKEFOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uICopIGluaXRXaXRoUnVsZU5hbWU6KE5TU3RyaW5nICopdGhlUnVsZU5hbWUgcHJlZGljYXRlOihOU1N0cmluZyAqKXRoZVByZWRpY2F0ZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW0KK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06dGhlU3RyZWFtXSkpIHsKKwkJW3NlbGYgc2V0UHJlZGljYXRlOnRoZVByZWRpY2F0ZV07CisJCVtzZWxmIHNldFJ1bGVOYW1lOnRoZVJ1bGVOYW1lXTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24iICk7CisjZW5kaWYKKwlbc2VsZiBzZXRQcmVkaWNhdGU6bmlsXTsKKwlbc2VsZiBzZXRSdWxlTmFtZTpuaWxdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKwlOU011dGFibGVTdHJpbmcgKmRlc2MgPSAoTlNNdXRhYmxlU3RyaW5nICopW3N1cGVyIGRlc2NyaXB0aW9uXTsKKwlbZGVzYyBhcHBlbmRGb3JtYXQ6QCIgcnVsZTogJUAgcHJlZGljYXRlIGZhaWxlZDogJUAiLCBydWxlTmFtZSwgcHJlZGljYXRlXTsKKwlyZXR1cm4gZGVzYzsKK30KKworI2lmZGVmIERPTlRVU0VZRVQKKy0gKE5TU3RyaW5nICopIGdldFByZWRpY2F0ZQoreworCXJldHVybiBwcmVkaWNhdGU7Cit9CisKKy0gKHZvaWQpIHNldFByZWRpY2F0ZTooTlNTdHJpbmcgKil0aGVQcmVkaWNhdGUKK3sKKwlpZiAodGhlUHJlZGljYXRlICE9IHByZWRpY2F0ZSkgeworCQlbdGhlUHJlZGljYXRlIHJldGFpbl07CisJCWlmICggcHJlZGljYXRlICkgW3ByZWRpY2F0ZSByZWxlYXNlXTsKKwkJcHJlZGljYXRlID0gdGhlUHJlZGljYXRlOworCX0KK30KKworLSAoTlNTdHJpbmcgKikgZ2V0UnVsZU5hbWUKK3sKKwlyZXR1cm4gcnVsZU5hbWU7Cit9CisKKy0gKHZvaWQpIHNldFJ1bGVOYW1lOihOU1N0cmluZyAqKXRoZVJ1bGVOYW1lCit7CisJaWYgKHRoZVJ1bGVOYW1lICE9IHJ1bGVOYW1lKSB7CisJCVt0aGVSdWxlTmFtZSByZXRhaW5dOworCQlpZiAoIHJ1bGVOYW1lICkgW3J1bGVOYW1lIHJlbGVhc2VdOworCQlydWxlTmFtZSA9IHRoZVJ1bGVOYW1lOworCX0KK30KKyNlbmRpZgorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhc3RRdWV1ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJGYXN0UXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWJhNTgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJGYXN0UXVldWUuaApAQCAtMCwwICsxLDY0IEBACisvLworLy8gIEFOVExSRmFzdFF1ZXVlLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI2LzA0LzIwMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU11dGFibGVBcnJheS5oIgorCitAaW50ZXJmYWNlIEFOVExSRmFzdFF1ZXVlIDogTlNPYmplY3QgPE5TQ29weWluZz4KK3sKKyAgICBfX3N0cm9uZyBBTXV0YWJsZUFycmF5ICpkYXRhOworICAgIE5TVUludGVnZXIgcDsKKyAgICBOU1VJbnRlZ2VyIHJhbmdlOworfQorCitAcHJvcGVydHkgKHJldGFpbikgQU11dGFibGVBcnJheSAqZGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIHA7CitAcHJvcGVydHkgKGFzc2lnbikgTlNVSW50ZWdlciByYW5nZTsKKworKyAoaWQpIG5ld0FOVExSRmFzdFF1ZXVlOworCistIChpZCkgaW5pdDsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKHZvaWQpIHJlc2V0OworLSAoaWQpIHJlbW92ZTsKKy0gKHZvaWQpIGFkZE9iamVjdDooaWQpIG9iajsKKy0gKE5TVUludGVnZXIpIGNvdW50OworLSAoTlNVSW50ZWdlcikgc2l6ZTsKKy0gKE5TVUludGVnZXIpIHJhbmdlOworLSAoaWQpIGhlYWQ7CistIChpZCkgb2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcikgaTsKKy0gKHZvaWQpIGNsZWFyOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJGYXN0UXVldWUubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmFzdFF1ZXVlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0NGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmFzdFF1ZXVlLm0KQEAgLTAsMCArMSwxNzQgQEAKKy8vCisvLyAgQU5UTFJGYXN0UXVldWUubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSRmFzdFF1ZXVlLmgiCisjaW1wb3J0ICJBTlRMUkVycm9yLmgiCisjaW1wb3J0ICJBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSRmFzdFF1ZXVlCisKKy8vQHN5bnRoZXNpemUgcG9vbDsKK0BzeW50aGVzaXplIGRhdGE7CitAc3ludGhlc2l6ZSBwOworQHN5bnRoZXNpemUgcmFuZ2U7CisKKysgKGlkKSBuZXdBTlRMUkZhc3RRdWV1ZQoreworICAgIHJldHVybiBbW0FOVExSRmFzdFF1ZXVlIGFsbG9jXSBpbml0XTsKK30KKworLSAoaWQpIGluaXQKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJCWRhdGEgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6MTAwXSByZXRhaW5dOworCQlwID0gMDsKKwkJcmFuZ2UgPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJGYXN0UXVldWUiICk7CisjZW5kaWYKKwlpZiAoIGRhdGEgKSBbZGF0YSByZWxlYXNlXTsKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJGYXN0UXVldWUgKmNvcHk7CisgICAgCisgICAgY29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworICAgIGNvcHkuZGF0YSA9IFtkYXRhIGNvcHlXaXRoWm9uZTpuaWxdOworICAgIGNvcHkucCA9IHA7CisgICAgY29weS5yYW5nZSA9IHJhbmdlOworICAgIHJldHVybiBjb3B5OworfQorCisvLyBGSVhNRTogSmF2YSBjb2RlIGhhcyB0aGlzLCBpdCBkb2Vzbid0IHNlZW0gbGlrZSBpdCBuZWVkcyB0byBiZSB0aGVyZS4uLiBUaGVuIGFnYWluIGEgbG90IG9mIHRoZSBjb2RlIGluIHRoZSBqYXZhIHJ1bnRpbWUgaXMgbm90IGdyZWF0Li4uCistICh2b2lkKSByZXNldAoreworCVtzZWxmIGNsZWFyXTsKK30KKworLSAodm9pZCkgY2xlYXIKK3sKKwlwID0gMDsKKyAgICBpZiAoIFtkYXRhIGNvdW50XSApCisgICAgICAgIFtkYXRhIHJlbW92ZUFsbE9iamVjdHNdOworfQorCistIChpZCkgcmVtb3ZlCit7CisJaWQgb2JqID0gW3NlbGYgb2JqZWN0QXRJbmRleDowXTsKKwlwKys7CisJLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorCWlmICggcCA9PSBbZGF0YSBjb3VudF0gKSB7CisJCS8vIGlmIHdlIGhhdmUsIHRoZW4gd2UgbmVlZCB0byBjbGVhciBpdCBvdXQKKwkJW3NlbGYgY2xlYXJdOworCX0KKwlyZXR1cm4gb2JqOworfQorCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKSBvYmoKK3sKKyAgICBbZGF0YSBhZGRPYmplY3Q6b2JqXTsKK30KKworLSAoTlNVSW50ZWdlcikgY291bnQKK3sKKwlyZXR1cm4gW2RhdGEgY291bnRdOworfQorCistIChOU1VJbnRlZ2VyKSBzaXplCit7CisJcmV0dXJuIFtkYXRhIGNvdW50XSAtIHA7Cit9CisKKy0gKE5TVUludGVnZXIpIHJhbmdlCit7CisgICAgcmV0dXJuIHJhbmdlOworfQorCistIChpZCkgaGVhZAoreworCXJldHVybiBbc2VsZiBvYmplY3RBdEluZGV4OjBdOworfQorCistIChpZCkgb2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcikgaQoreworICAgIE5TVUludGVnZXIgYWJzSW5kZXg7CisKKyAgICBhYnNJbmRleCA9IHAgKyBpOworCWlmICggYWJzSW5kZXggPj0gW2RhdGEgY291bnRdICkgeworCQlAdGhyb3cgW0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJxdWV1ZSBpbmRleCAlZCA+IGxhc3QgaW5kZXggJWQiLCBhYnNJbmRleCwgW2RhdGEgY291bnRdLTFdXTsKKwl9CisJaWYgKCBhYnNJbmRleCA8IDAgKSB7CisJICAgIEB0aHJvdyBbQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInF1ZXVlIGluZGV4ICVkIDwgMCIsIGFic0luZGV4XV07CisJfQorCWlmICggYWJzSW5kZXggPiByYW5nZSApIHJhbmdlID0gYWJzSW5kZXg7CisJcmV0dXJuIFtkYXRhIG9iamVjdEF0SW5kZXg6YWJzSW5kZXhdOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZworeworICAgIHJldHVybiBbc2VsZiBkZXNjcmlwdGlvbl07Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisJTlNNdXRhYmxlU3RyaW5nICpidWYgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhDYXBhY2l0eTozMF07CisJTlNJbnRlZ2VyIG4gPSBbc2VsZiBzaXplXTsKKwlmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IG47IGkrKykgeworCQlbYnVmIGFwcGVuZFN0cmluZzpbW3NlbGYgb2JqZWN0QXRJbmRleDppXSBkZXNjcmlwdGlvbl1dOworCQlpZiAoKGkgKyAxKSA8IG4pIHsKKwkJCVtidWYgYXBwZW5kU3RyaW5nOkAiICJdOworCQl9CisJfQorCXJldHVybiBidWY7Cit9CisKKyNpZmRlZiBET05UVVNFTk9NTworLSAoTlNBdXRvcmVsZWFzZVBvb2wgKilnZXRQb29sCit7CisgICAgcmV0dXJuIHBvb2w7Cit9CisKKy0gKHZvaWQpc2V0UG9vbDooTlNBdXRvcmVsZWFzZVBvb2wgKilhUG9vbAoreworICAgIHBvb2wgPSBhUG9vbDsKK30KKyNlbmRpZgorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhc3RRdWV1ZVRlc3QtSW5mby5wbGlzdCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmFzdFF1ZXVlVGVzdC1JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODVhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkZhc3RRdWV1ZVRlc3QtSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55LiR7UFJPRFVDVF9OQU1FOnJmYzEwMzRpZGVudGlmaWVyfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Qk5ETDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MTwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmlsZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJGaWxlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5YTg4MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmlsZVN0cmVhbS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW1wb3J0ICJBTlRMUlN0cmluZ1N0cmVhbS5oIgorCisvKiogVGhpcyBpcyBhIGNoYXIgYnVmZmVyIHN0cmVhbSB0aGF0IGlzIGxvYWRlZCBmcm9tIGEgZmlsZQorICogIGFsbCBhdCBvbmNlIHdoZW4geW91IGNvbnN0cnVjdCB0aGUgb2JqZWN0LiAgVGhpcyBsb29rcyB2ZXJ5CisgKiAgbXVjaCBsaWtlIGFuIEFOVExSZWFkZXIgb3IgQU5UTFJJbnB1dFN0cmVhbSwgYnV0IGl0J3MgYSBzcGVjaWFsIGNhc2UKKyAqICBzaW5jZSB3ZSBrbm93IHRoZSBleGFjdCBzaXplIG9mIHRoZSBvYmplY3QgdG8gbG9hZC4gIFdlIGNhbiBhdm9pZCBsb3RzCisgKiAgb2YgZGF0YSBjb3B5aW5nLiAKKyAqLworQGludGVyZmFjZSBBTlRMUkZpbGVTdHJlYW0gOiBBTlRMUlN0cmluZ1N0cmVhbSB7CisJX19zdHJvbmcgTlNTdHJpbmcgKmZpbGVOYW1lOworfQorCisKKysgKGlkKSBuZXdBTlRMUkZpbGVTdHJlYW06KE5TU3RyaW5nKikgZmlsZU5hbWU7CisrIChpZCkgbmV3QU5UTFJGaWxlU3RyZWFtOihOU1N0cmluZyAqKWFGaWxlTmFtZSBlbmNvZGluZzooTlNTdHJpbmdFbmNvZGluZyllbmNvZGluZzsKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKSBhRmlsZU5hbWU7CistIChpZCkgaW5pdDooTlNTdHJpbmcgKikgYUZpbGVOYW1lIGVuY29kaW5nOihOU1N0cmluZ0VuY29kaW5nKWVuY29kaW5nOworLSAodm9pZCkgbG9hZDooTlNTdHJpbmcgKilmaWxlTmFtZSBlbmNvZGluZzooTlNTdHJpbmdFbmNvZGluZyllbmNvZGluZzsKKy0gKE5TU3RyaW5nICopIGdldFNvdXJjZU5hbWU7CisKK0Bwcm9wZXJ0eSAocmV0YWluKSBOU1N0cmluZyAqZmlsZU5hbWU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmlsZVN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJGaWxlU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlNTQxNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSRmlsZVN0cmVhbS5tCkBAIC0wLDAgKzEsMTA5IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIAorIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoqIFRoaXMgaXMgYSBjaGFyIGJ1ZmZlciBzdHJlYW0gdGhhdCBpcyBsb2FkZWQgZnJvbSBhIGZpbGUKKyAqICBhbGwgYXQgb25jZSB3aGVuIHlvdSBjb25zdHJ1Y3QgdGhlIG9iamVjdC4gIFRoaXMgbG9va3MgdmVyeQorICogIG11Y2ggbGlrZSBhbiBBTlRMUmVhZGVyIG9yIEFOVExSSW5wdXRTdHJlYW0sIGJ1dCBpdCdzIGEgc3BlY2lhbCBjYXNlCisgKiAgc2luY2Ugd2Uga25vdyB0aGUgZXhhY3Qgc2l6ZSBvZiB0aGUgb2JqZWN0IHRvIGxvYWQuICBXZSBjYW4gYXZvaWQgbG90cworICogIG9mIGRhdGEgY29weWluZy4gCisgKi8KKworI2ltcG9ydCAiQU5UTFJGaWxlU3RyZWFtLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkZpbGVTdHJlYW0KKworQHN5bnRoZXNpemUgZmlsZU5hbWU7CisKKysgKGlkKSBuZXdBTlRMUkZpbGVTdHJlYW06KE5TU3RyaW5nKilmaWxlTmFtZQoreworICAgIHJldHVybiBbW0FOVExSRmlsZVN0cmVhbSBhbGxvY10gaW5pdDpmaWxlTmFtZV07Cit9CisKKysgKGlkKSBuZXdBTlRMUkZpbGVTdHJlYW06KE5TU3RyaW5nICopYUZpbGVOYW1lIGVuY29kaW5nOihOU1N0cmluZ0VuY29kaW5nKWVuY29kaW5nCit7CisgICAgcmV0dXJuIFtbQU5UTFJGaWxlU3RyZWFtIGFsbG9jXSBpbml0OmFGaWxlTmFtZSBlbmNvZGluZzplbmNvZGluZ107Cit9CisKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFGaWxlTmFtZQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgZmlsZU5hbWUgPSBhRmlsZU5hbWU7CisgICAgICAgIFtzZWxmIGxvYWQ6YUZpbGVOYW1lIGVuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKSBhRmlsZU5hbWUgZW5jb2Rpbmc6KE5TU3RyaW5nRW5jb2RpbmcpZW5jb2RpbmcKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIGZpbGVOYW1lID0gYUZpbGVOYW1lOworICAgICAgICBbc2VsZiBsb2FkOmFGaWxlTmFtZSBlbmNvZGluZzplbmNvZGluZ107CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChOU1N0cmluZyAqKSBnZXRTb3VyY2VOYW1lCit7CisgICAgcmV0dXJuIGZpbGVOYW1lOworfQorCistICh2b2lkKSBsb2FkOihOU1N0cmluZyAqKWFGaWxlTmFtZSBlbmNvZGluZzooTlNTdHJpbmdFbmNvZGluZyllbmNvZGluZworeworICAgIGlmICggYUZpbGVOYW1lPT1uaWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTlNFcnJvciAqZXJyb3I7CisgICAgTlNEYXRhICpyZXREYXRhID0gbmlsOworICAgIE5TRmlsZUhhbmRsZSAqZmg7CisgICAgQHRyeSB7CisgICAgICAgIE5TU3RyaW5nICpmbiA9IFthRmlsZU5hbWUgc3RyaW5nQnlTdGFuZGFyZGl6aW5nUGF0aF07CisgICAgICAgIE5TVVJMICpmID0gW05TVVJMIGZpbGVVUkxXaXRoUGF0aDpmbl07CisgICAgICAgIGZoID0gW05TRmlsZUhhbmRsZSBmaWxlSGFuZGxlRm9yUmVhZGluZ0Zyb21VUkw6ZiBlcnJvcjomZXJyb3JdOworICAgICAgICBpZiAoIGZoPT1uaWwgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IG51bVJlYWQ9MDsKKyAgICAgICAgaW50IHAxID0gMDsKKyAgICAgICAgcmV0RGF0YSA9IFtmaCByZWFkRGF0YVRvRW5kT2ZGaWxlXTsKKyAgICAgICAgbnVtUmVhZCA9IFtyZXREYXRhIGxlbmd0aF07CisjcHJhZ21hIG1hcmsgZml4IHRoZXNlIE5TTG9nIGNhbGxzCisgICAgICAgIE5TTG9nKCBAInJlYWQgJWQgY2hhcnM7IHAgd2FzICVkIGlzIG5vdyAlZCIsIG4sIHAxLCAocDErbnVtUmVhZCkgKTsKKyAgICAgICAgcDEgKz0gbnVtUmVhZDsKKyAgICAgICAgbiA9IHAxOworICAgICAgICBkYXRhID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOnJldERhdGEgZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKyNwcmFnbWEgbWFyayBmaXggdGhlc2UgTlNMb2cgY2FsbHMKKyAgICAgICAgTlNMb2coIEAibj0lZCIsIG4gKTsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICBbZmggY2xvc2VGaWxlXTsKKyAgICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSGFzaE1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJIYXNoTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzY2I2NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSGFzaE1hcC5oCkBAIC0wLDAgKzEsMTEwIEBACisvLworLy8gIEFOVExSSGFzaE1hcC5oCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSTGlua0Jhc2UuaCIKKyNpbXBvcnQgIkFOVExSTWFwRWxlbWVudC5oIgorCisjZGVmaW5lIEdMT0JBTF9TQ09QRSAgICAgICAwCisjZGVmaW5lIExPQ0FMX1NDT1BFICAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJIYXNoTWFwIDogQU5UTFJMaW5rQmFzZSB7CisgICAgLy8gICAgVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBTY29wZTsKKyAgICBOU0ludGVnZXIgTGFzdEhhc2g7CisgICAgTlNJbnRlZ2VyIEJ1ZmZTaXplOworICAgIE5TVUludGVnZXIgY291bnQ7CisgICAgTlNVSW50ZWdlciBwdHI7CisgICAgX19zdHJvbmcgTlNNdXRhYmxlRGF0YSAqYnVmZmVyOworICAgIF9fc3Ryb25nIEFOVExSTWFwRWxlbWVudCAqKnB0ckJ1ZmZlcjsKKyAgICBOU0ludGVnZXIgbW9kZTsKK30KKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKGlkKW5ld0FOVExSSGFzaE1hcDsKKysgKGlkKW5ld0FOVExSSGFzaE1hcFdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemU7CistIChpZClpbml0OworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemU7CistICh2b2lkKWRlYWxsb2M7CistIChBTlRMUkhhc2hNYXAgKilQdXNoU2NvcGU6KCBBTlRMUkhhc2hNYXAgKiopbWFwOworLSAoQU5UTFJIYXNoTWFwICopUG9wU2NvcGU6KCBBTlRMUkhhc2hNYXAgKiopbWFwOworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLy8gSW5zdGFuY2UgTWV0aG9kcworLyogICAgZm9ybSBoYXNoIHZhbHVlIGZvciBzdHJpbmcgcyAqLworLSAoTlNJbnRlZ2VyKWhhc2g6KE5TU3RyaW5nICopczsKKy8qICAgbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistIChBTlRMUkhhc2hNYXAgKilmaW5kc2NvcGU6KGludClsZXZlbDsKKy8qICAgbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistIChpZClsb29rdXA6KE5TU3RyaW5nICopcyBTY29wZTooaW50KXNjb3BlOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKGlkKWluc3RhbGw6KEFOVExSTWFwRWxlbWVudCAqKXN5bSBTY29wZTooaW50KXNjb3BlOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKHZvaWQpZGVsZXRlQU5UTFJIYXNoTWFwOihBTlRMUk1hcEVsZW1lbnQgKilucDsKKy0gKGludClSZW1vdmVTeW06KE5TU3RyaW5nICopczsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk1hcEVsZW1lbnQgKilucDsKKyNpZmRlZiBET05UVVNFWUVUCistIChpbnQpYmxkX3N5bXRhYjooS1dfVEFCTEUgKil0b2tuYW1zOworI2VuZGlmCistIChBTlRMUk1hcEVsZW1lbnQgKiopZ2V0cHRyQnVmZmVyOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0cHRyQnVmZmVyRW50cnk6KGludClpZHg7CistICh2b2lkKXNldHB0ckJ1ZmZlcjooQU5UTFJNYXBFbGVtZW50ICopbnAgSW5kZXg6KGludClpZHg7CistIChOU0ludGVnZXIpZ2V0U2NvcGU7CistICh2b2lkKXNldFNjb3BlOihOU0ludGVnZXIpaTsKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldFRUeXBlOihOU1N0cmluZyAqKW5hbWU7CistIChBTlRMUk1hcEVsZW1lbnQgKilnZXROYW1lSW5MaXN0OihOU0ludGVnZXIpdHR5cGU7CistICh2b2lkKXB1dE5vZGU6KE5TU3RyaW5nICopbmFtZSBUb2tlblR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKE5TSW50ZWdlcilnZXRNb2RlOworLSAodm9pZClzZXRNb2RlOihOU0ludGVnZXIpYU1vZGU7CistICh2b2lkKSBpbnNlcnRPYmplY3Q6KGlkKWFSdWxlIGF0SW5kZXg6KE5TSW50ZWdlcilpZHg7CistIChpZCkgb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKHZvaWQpIHNldE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeDsKKy0gKHZvaWQpYWRkT2JqZWN0OihpZClhbk9iamVjdDsKKy0gKEFOVExSTWFwRWxlbWVudCAqKSBnZXROYW1lOihOU1N0cmluZyAqKWFOYW1lOworLSAodm9pZCkgcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIE5vZGU6KGlkKWFOb2RlOworCistIChOU0VudW1lcmF0b3IgKilvYmplY3RFbnVtZXJhdG9yOworLSAoQk9PTCkgaGFzTmV4dDsKKy0gKEFOVExSTWFwRWxlbWVudCAqKW5leHRPYmplY3Q7CisKKy8vQHByb3BlcnR5IChjb3B5KSBUU3RyaW5nUG9vbCAqZlBvb2w7CitAcHJvcGVydHkgKGdldHRlcj1nZXRTY29wZSwgc2V0dGVyPXNldFNjb3BlOikgTlNJbnRlZ2VyIFNjb3BlOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdEhhc2gsIHNldHRlcj1zZXRMYXN0SGFzaDopIE5TSW50ZWdlciBMYXN0SGFzaDsKKworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TW9kZSxzZXR0ZXI9c2V0TW9kZTopIE5TSW50ZWdlciBtb2RlOworQHByb3BlcnR5IE5TSW50ZWdlciBCdWZmU2l6ZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENvdW50LCBzZXR0ZXI9c2V0Q291bnQ6KSBOU1VJbnRlZ2VyIGNvdW50OworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgcHRyOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRCdWZmZXIsIHNldHRlcj1zZXRCdWZmZXI6KSBOU011dGFibGVEYXRhICpidWZmZXI7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldFB0ckJ1ZmZlciwgc2V0dGVyPXNldFB0ckJ1ZmZlcjopIEFOVExSTWFwRWxlbWVudCAqKnB0ckJ1ZmZlcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSGFzaE1hcC5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJIYXNoTWFwLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMjVhOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSGFzaE1hcC5tCkBAIC0wLDAgKzEsNTI5IEBACisvLworLy8gIEFOVExSSGFzaE1hcC5tCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJIYXNoTWFwLmgiCisKK3N0YXRpYyBOU0ludGVnZXIgaXRJbmRleDsKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSSGFzaE1hcAorICovCitAaW1wbGVtZW50YXRpb24gQU5UTFJIYXNoTWFwCisKK0BzeW50aGVzaXplIFNjb3BlOworQHN5bnRoZXNpemUgTGFzdEhhc2g7CisKKysoaWQpbmV3QU5UTFJIYXNoTWFwCit7CisgICAgcmV0dXJuIFtbQU5UTFJIYXNoTWFwIGFsbG9jXSBpbml0XTsKK30KKworKyhpZCluZXdBTlRMUkhhc2hNYXBXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgcmV0dXJuIFtbQU5UTFJIYXNoTWFwIGFsbG9jXSBpbml0V2l0aExlbjphQnVmZlNpemVdOworfQorCistKGlkKWluaXQKK3sKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGZOZXh0ID0gbmlsOworICAgICAgICBTY29wZSA9IDA7CisgICAgICAgIHB0ciA9IDA7CisgICAgICAgIEJ1ZmZTaXplID0gSEFTSFNJWkU7CisgICAgICAgIGJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDooTlNVSW50ZWdlcilCdWZmU2l6ZSAqIHNpemVvZihpZCldIHJldGFpbl07CisgICAgICAgIHB0ckJ1ZmZlciA9IChBTlRMUk1hcEVsZW1lbnQgKiopIFtidWZmZXIgbXV0YWJsZUJ5dGVzXTsKKyAgICAgICAgaWYgKCBmTmV4dCAhPSBuaWwgKSB7CisgICAgICAgICAgICBTY29wZSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5TY29wZSsxOworICAgICAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICAgICAgcHRyQnVmZmVyW2lkeF0gPSAoKEFOVExSSGFzaE1hcCAqKWZOZXh0KS0+cHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbW9kZSA9IDA7CisgICAgfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBmTmV4dCA9IG5pbDsKKyAgICAgICAgQnVmZlNpemUgPSBhQnVmZlNpemU7CisgICAgICAgIFNjb3BlID0gMDsKKyAgICAgICAgcHRyID0gMDsKKyAgICAgICAgYnVmZmVyID0gW1tOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOihOU1VJbnRlZ2VyKUJ1ZmZTaXplICogc2l6ZW9mKGlkKV0gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyID0gKEFOVExSTWFwRWxlbWVudCAqKikgW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgICAgICBpZiAoIGZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgICAgIFNjb3BlID0gKChBTlRMUkhhc2hNYXAgKilmTmV4dCktPlNjb3BlKzE7CisgICAgICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgICAgICBwdHJCdWZmZXJbaWR4XSA9ICgoQU5UTFJIYXNoTWFwICopZk5leHQpLT5wdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtb2RlID0gMDsKKyAgICB9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSSGFzaE1hcCIgKTsKKyNlbmRpZgorICAgIEFOVExSTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICYmIHRtcCAhPSBbKChBTlRMUkhhc2hNYXAgKilmTmV4dCkgZ2V0cHRyQnVmZmVyRW50cnk6aWR4XSApIHsKKyAgICAgICAgICAgICAgICBydG1wID0gdG1wOworICAgICAgICAgICAgICAgIC8vIHRtcCA9IFt0bXAgZ2V0Zk5leHRdOworICAgICAgICAgICAgICAgIHRtcCA9IChBTlRMUk1hcEVsZW1lbnQgKil0bXAuZk5leHQ7CisgICAgICAgICAgICAgICAgW3J0bXAgcmVsZWFzZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBidWZmZXIgKSBbYnVmZmVyIHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNJbnRlZ2VyKWNvdW50Cit7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIAorICAgIGZvciAoTlNJbnRlZ2VyIGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAoIHB0ckJ1ZmZlcltpXSAhPSBuaWwgKSB7CisgICAgICAgICAgICBhQ250Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFDbnQ7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorLSAoTlNJbnRlZ2VyKSBzaXplCit7CisgICAgTlNJbnRlZ2VyIGFTaXplID0gMDsKKyAgICAKKyAgICBmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKCBwdHJCdWZmZXJbaV0gIT0gbmlsICkgeworICAgICAgICAgICAgYVNpemUgKz0gc2l6ZW9mKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYVNpemU7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistKHZvaWQpZGVsZXRlQU5UTFJIYXNoTWFwOihBTlRMUk1hcEVsZW1lbnQgKilucAoreworICAgIEFOVExSTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCAmJiB0bXAgIT0gKEFOVExSTGlua0Jhc2UgKilbKChBTlRMUkhhc2hNYXAgKilmTmV4dCkgZ2V0cHRyQnVmZmVyRW50cnk6aWR4XSApIHsKKyAgICAgICAgICAgICAgICBydG1wID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IFt0bXAgZ2V0Zk5leHRdOworICAgICAgICAgICAgICAgIFtydG1wIHJlbGVhc2VdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCistKEFOVExSSGFzaE1hcCAqKVB1c2hTY29wZTooQU5UTFJIYXNoTWFwICoqKW1hcAoreworICAgIE5TSW50ZWdlciBpZHg7CisgICAgQU5UTFJIYXNoTWFwICpodG1wOworICAgIAorICAgIGh0bXAgPSBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcF07CisgICAgaWYgKCAqbWFwICE9IG5pbCApIHsKKyAgICAgICAgKChBTlRMUkhhc2hNYXAgKilodG1wKS0+Zk5leHQgPSAqbWFwOworICAgICAgICBbaHRtcCBzZXRTY29wZTpbKChBTlRMUkhhc2hNYXAgKilodG1wLT5mTmV4dCkgZ2V0U2NvcGVdKzFdOworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgIGh0bXAtPnB0ckJ1ZmZlcltpZHhdID0gKChBTlRMUkhhc2hNYXAgKilodG1wLT5mTmV4dCktPnB0ckJ1ZmZlcltpZHhdOworICAgICAgICB9CisgICAgfQorICAgIC8vICAgIGdTY29wZUxldmVsKys7CisgICAgKm1hcCA9IGh0bXA7CisgICAgcmV0dXJuKCBodG1wICk7Cit9CisKKy0oQU5UTFJIYXNoTWFwICopUG9wU2NvcGU6KEFOVExSSGFzaE1hcCAqKiltYXAKK3sKKyAgICBOU0ludGVnZXIgaWR4OworICAgIEFOVExSTWFwRWxlbWVudCAqdG1wOworICAgIEFOVExSSGFzaE1hcCAqaHRtcDsKKyAgICAKKyAgICBodG1wID0gKm1hcDsKKyAgICBpZiAoICgqbWFwKS0+Zk5leHQgIT0gbmlsICkgeworICAgICAgICAqbWFwID0gKEFOVExSSGFzaE1hcCAqKWh0bXAtPmZOZXh0OworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgIGlmICggaHRtcC0+cHRyQnVmZmVyW2lkeF0gPT0gbmlsIHx8CisgICAgICAgICAgICAgICAgaHRtcC0+cHRyQnVmZmVyW2lkeF0gPT0gKCptYXApLT5wdHJCdWZmZXJbaWR4XSApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IGh0bXAtPnB0ckJ1ZmZlcltpZHhdOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG11c3QgZGVhbCB3aXRoIHBhcm1zLCBsb2NhbHMgYW5kIGxhYmVscyBhdCBzb21lIHBvaW50CisgICAgICAgICAgICAgKiBjYW4gbm90IGZvcmdldCB0aGUgZGVidWdnZXJzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGh0bXAtPnB0ckJ1ZmZlcltpZHhdID0gW3RtcCBnZXRmTmV4dF07CisgICAgICAgICAgICBbdG1wIHJlbGVhc2VdOworICAgICAgICB9CisgICAgICAgICptYXAgPSAoQU5UTFJIYXNoTWFwICopaHRtcC0+Zk5leHQ7CisgICAgICAgIC8vICAgICAgICBnU2NvcGVMZXZlbC0tOworICAgIH0KKyAgICByZXR1cm4oIGh0bXAgKTsKK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSEFTSCAgICAgICAgaGFzaCBlbnRyeSB0byBnZXQgaW5kZXggdG8gdGFibGUKKyAqICBOU0ludGVnZXIgaGFzaCggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgKnMgICAgICAgICAgICAgc3RyaW5nIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogTlNJbnRlZ2VyICAgICAgICAgICAgICAgICBoYXNoZWQgdmFsdWUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzICAgICAgIC8qICAgIGZvcm0gaGFzaCB2YWx1ZSBmb3Igc3RyaW5nIHMgKi8KK3sKKyAgICBOU0ludGVnZXIgaGFzaHZhbDsKKyAgICBjb25zdCBjaGFyICp0bXA7CisgICAgCisgICAgdG1wID0gW3MgY1N0cmluZ1VzaW5nRW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKyAgICBmb3IoIGhhc2h2YWwgPSAwOyAqdG1wICE9ICdcMCc7ICkKKyAgICAgICAgaGFzaHZhbCArPSAqdG1wKys7CisgICAgc2VsZi0+TGFzdEhhc2ggPSBoYXNodmFsICUgQnVmZlNpemU7CisgICAgcmV0dXJuKCBzZWxmLT5MYXN0SGFzaCApOworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBGSU5EU0NPUEUgIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBBTlRMUkhhc2hNYXAgKmZpbmRzY29wZSggQU5UTFJIYXNoTWFwICpzZWxmLCBOU0ludGVnZXIgc2NvcGUgKTsKKyAqCisgKiAgICAgSW5wdXRzOiAgTlNJbnRlZ2VyICAgICAgIHNjb3BlIC0tIHNjb3BlIGxldmVsIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogQU5UTFJIYXNoTWFwICAgcG9pbnRlciB0byBwdHJCdWZmZXIgb2YgcHJvcGVyIHNjb3BlIGxldmVsCisgKgorICogIExhc3QgUmV2aXNpb24gOS8wMy85MAorICovCisjZW5kaWYKKy0oQU5UTFJIYXNoTWFwICopZmluZHNjb3BlOihOU0ludGVnZXIpc2NvcGUKK3sKKyAgICBpZiAoIHNlbGYtPlNjb3BlID09IHNjb3BlICkgeworICAgICAgICByZXR1cm4oIHNlbGYgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZOZXh0ICkgeworICAgICAgICByZXR1cm4oIFsoKEFOVExSSGFzaE1hcCAqKWZOZXh0KSBmaW5kc2NvcGU6c2NvcGVdICk7CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIExPT0tVUCAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIEFOVExSTWFwRWxlbWVudCAqbG9va3VwKCBBTlRMUkhhc2hNYXAgKnNlbGYsIGNoYXIgKnMsIE5TSW50ZWdlciBzY29wZSApOworICoKKyAqICAgICBJbnB1dHM6ICBjaGFyICAgICAqcyAgICAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBBTlRMUk1hcEVsZW1lbnQgICogICAgICAgICAgIHBvaW50ZXIgdG8gZW50cnkKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShpZClsb29rdXA6KE5TU3RyaW5nICopcyBTY29wZTooTlNJbnRlZ2VyKXNjb3BlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIG5wID0gc2VsZi0+cHRyQnVmZmVyW1tzZWxmIGhhc2g6c11dOyBucCAhPSBuaWw7IG5wID0gW25wIGdldGZOZXh0XSApIHsKKyAgICAgICAgaWYgKCBbcyBpc0VxdWFsVG9TdHJpbmc6W25wIGdldE5hbWVdXSApIHsKKyAgICAgICAgICAgIHJldHVybiggbnAgKTsgICAgICAgIC8qICAgZm91bmQgaXQgICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCisjaWZkZWYgVVNFUkRPQworLyoKKyAqICBJTlNUQUxMIHNlYXJjaCBoYXNoZWQgbGlzdCBmb3IgZW50cnkKKyAqICBOU0ludGVnZXIgaW5zdGFsbCggQU5UTFJIYXNoTWFwICpzZWxmLCBBTlRMUk1hcEVsZW1lbnQgKnN5bSwgTlNJbnRlZ2VyIHNjb3BlICk7CisgKgorICogICAgIElucHV0czogIEFOVExSTWFwRWxlbWVudCAgICAqc3ltICAgLS0gc3ltYm9sIHB0ciB0byBpbnN0YWxsCisgKiAgICAgICAgICAgICAgTlNJbnRlZ2VyICAgICAgICAgc2NvcGUgLS0gbGV2ZWwgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBCb29sZWFuICAgICBUUlVFICAgaWYgaW5zdGFsbGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgIGlmIGFscmVhZHkgaW4gdGFibGUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShBTlRMUk1hcEVsZW1lbnQgKilpbnN0YWxsOihBTlRMUk1hcEVsZW1lbnQgKilzeW0gU2NvcGU6KE5TSW50ZWdlcilzY29wZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgCisgICAgbnAgPSBbc2VsZiBsb29rdXA6W3N5bSBnZXROYW1lXSBTY29wZTpzY29wZSBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBbc3ltIHJldGFpbl07CisgICAgICAgIFtzeW0gc2V0Rk5leHQ6c2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdXTsKKyAgICAgICAgc2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5MYXN0SGFzaCBdID0gc3ltOworICAgICAgICByZXR1cm4oIHNlbGYtPnB0ckJ1ZmZlclsgc2VsZi0+TGFzdEhhc2ggXSApOworICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgUmVtb3ZlU3ltICBzZWFyY2ggaGFzaGVkIGxpc3QgZm9yIGVudHJ5CisgKiAgTlNJbnRlZ2VyIFJlbW92ZVN5bSggQU5UTFJIYXNoTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgICAgICpzICAgICAgICAgIHN0cmluZyB0byBmaW5kCisgKgorICogICAgIFJldHVybnM6IE5TSW50ZWdlciAgICAgIGluZGljYXRvciBvZiBTVUNDRVNTIE9SIEZBSUxVUkUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpUmVtb3ZlU3ltOihOU1N0cmluZyAqKXMKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wLCAqdG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWR4ID0gW3NlbGYgaGFzaDpzXTsKKyAgICBmb3IgKCB0bXAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XSwgbnAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICB0bXAgPSBbbnAgZ2V0Zk5leHRdOyAgICAgICAgICAgICAvKiBnZXQgdGhlIG5leHQgbGluayAgKi8KKyAgICAgICAgICAgIFtucCByZWxlYXNlXTsKKyAgICAgICAgICAgIHJldHVybiggU1VDQ0VTUyApOyAgICAgICAgICAgIC8qIHJlcG9ydCBTVUNDRVNTICAgICAqLworICAgICAgICB9CisgICAgICAgIHRtcCA9IFtucCBnZXRmTmV4dF07ICAgICAgICAgICAgICAvLyAgQkFEISEhISEhCisgICAgfQorICAgIHJldHVybiggRkFJTFVSRSApOyAgICAgICAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk1hcEVsZW1lbnQgKilucAoreworICAgIGlmICggW25wIGdldGZOZXh0XSAhPSBuaWwgKQorICAgICAgICBbc2VsZiBkZWxldGVfY2hhaW46W25wIGdldGZOZXh0XV07CisgICAgW25wIGRlYWxsb2NdOworfQorCisjaWZkZWYgRE9OVFVTRVlFVAorLShOU0ludGVnZXIpYmxkX3N5bXRhYjooS1dfVEFCTEUgKil0b2tuYW1zCit7CisgICAgTlNJbnRlZ2VyIGk7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyAqKHRva25hbXNbaV0ubmFtZSkgIT0gJ1wwJzsgaSsrICkgeworICAgICAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICAgICAgbnAgPSBbQU5UTFJNYXBFbGVtZW50IG5ld0FOVExSTWFwRWxlbWVudDpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiwgdG9rbmFtc1tpXS5uYW1lXV07CisgICAgICAgIC8vICAgICAgICBucC0+ZlR5cGUgPSB0b2tuYW1zW2ldLnRva251bTsKKyAgICAgICAgW3NlbGYgaW5zdGFsbDpucCBTY29wZTowXTsKKyAgICB9CisgICAgcmV0dXJuKCBTVUNDRVNTICk7Cit9CisjZW5kaWYKKworLShBTlRMUk1hcEVsZW1lbnQgKilnZXRwdHJCdWZmZXJFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworICAgIHJldHVybiggcHRyQnVmZmVyW2lkeF0gKTsKK30KKworLShBTlRMUk1hcEVsZW1lbnQgKiopZ2V0cHRyQnVmZmVyCit7CisgICAgcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldHB0ckJ1ZmZlcjooQU5UTFJNYXBFbGVtZW50ICopbnAgSW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGlkeCA8IEJ1ZmZTaXplICkgeworICAgICAgICBbbnAgcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyW2lkeF0gPSBucDsKKyAgICB9Cit9CisKKy0oTlNJbnRlZ2VyKWdldFNjb3BlCit7CisgICAgcmV0dXJuKCBTY29wZSApOworfQorCistKHZvaWQpc2V0U2NvcGVTY29wZTooTlNJbnRlZ2VyKWkKK3sKKyAgICBTY29wZSA9IGk7Cit9CisKKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldFRUeXBlOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07Cit9CisKKy8qCisgKiB3b3JrcyBvbmx5IGZvciBtYXBsaXN0IGluZGV4ZWQgbm90IGJ5IG5hbWUgYnV0IGJ5IFRva2VuTnVtYmVyCisgKi8KKy0gKEFOVExSTWFwRWxlbWVudCAqKWdldE5hbWVJbkxpc3Q6KE5TSW50ZWdlcil0dHlwZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgTlNJbnRlZ2VyIGFUVHlwZTsKKworICAgIGFUVHlwZSA9IHR0eXBlICUgQnVmZlNpemU7CisgICAgZm9yKCBucCA9IHNlbGYtPnB0ckJ1ZmZlclthVFR5cGVdOyBucCAhPSBuaWw7IG5wID0gW25wIGdldGZOZXh0XSApIHsKKyAgICAgICAgaWYgKCBbKE5TTnVtYmVyICopbnAubm9kZSBpbnRlZ2VyVmFsdWVdID09IHR0eXBlICkgeworICAgICAgICAgICAgcmV0dXJuKCBucCApOyAgICAgICAgLyogICBmb3VuZCBpdCAgICAgICAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiggbmlsICk7ICAgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKy0gKEFOVExSTGlua0Jhc2UgKilnZXROYW1lOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICByZXR1cm4gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MF07IC8qICBuaWwgaWYgbm90IGZvdW5kICAgICAgKi8gICAgCit9CisKKy0gKHZvaWQpcHV0Tm9kZTooTlNTdHJpbmcgKiluYW1lIFRva2VuVHlwZTooTlNJbnRlZ2VyKXR0eXBlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6W05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6bmFtZV0gVHlwZTp0dHlwZV07CisgICAgLy8gICAgICAgIG5wLT5mVHlwZSA9IHRva25hbXNbaV0udG9rbnVtOworICAgIFtzZWxmIGluc3RhbGw6bnAgU2NvcGU6MF07Cit9CisKKy0gKE5TSW50ZWdlcilnZXRNb2RlCit7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlCit7CisgICAgbW9kZSA9IGFNb2RlOworfQorCistICh2b2lkKSBhZGRPYmplY3Q6KGlkKWFSdWxlCit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKworICAgIGlkeCA9IFtzZWxmIGNvdW50XTsKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCisvKiB0aGlzIG1heSBoYXZlIHRvIGhhbmRsZSBsaW5raW5nIGludG8gdGhlIGNoYWluCisgKi8KKy0gKHZvaWQpIGluc2VydE9iamVjdDooaWQpYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmICggaWR4ID49IEJ1ZmZTaXplICkgeworICAgICAgICBpZHggJT0gQnVmZlNpemU7CisgICAgfQorICAgIGlmICggYVJ1bGUgIT0gcHRyQnVmZmVyW2lkeF0gKSB7CisgICAgICAgIGlmICggcHRyQnVmZmVyW2lkeF0gKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChpZClvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIGlkeCAlPSBCdWZmU2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHB0ckJ1ZmZlcltpZHhdOworfQorCisvKiB0aGlzIHdpbGwgbmV2ZXIgbGluayBpbnRvIHRoZSBjaGFpbgorICovCistICh2b2lkKSBzZXRPYmplY3Q6KGlkKWFSdWxlIGF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGlkeCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgaWR4ICU9IEJ1ZmZTaXplOworICAgIH0KKyAgICBpZiAoIGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICBpZiAoIHB0ckJ1ZmZlcltpZHhdICkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBbYVJ1bGUgcmV0YWluXTsKKyAgICB9CisgICAgcHRyQnVmZmVyW2lkeF0gPSBhUnVsZTsKK30KKworLSAodm9pZClwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgTm9kZTooaWQpYU5vZGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIAorICAgIG5wID0gW3NlbGYgbG9va3VwOm5hbWUgU2NvcGU6MCBdOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBucCA9IFtBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6bmFtZSBOb2RlOmFOb2RlXTsKKyAgICAgICAgaWYgKCBwdHJCdWZmZXJbTGFzdEhhc2hdICkKKyAgICAgICAgICAgIFtwdHJCdWZmZXJbTGFzdEhhc2hdIHJlbGVhc2VdOworICAgICAgICBbbnAgcmV0YWluXTsKKyAgICAgICAgbnAuZk5leHQgPSBwdHJCdWZmZXJbIExhc3RIYXNoIF07CisgICAgICAgIHB0ckJ1ZmZlclsgTGFzdEhhc2ggXSA9IG5wOworICAgIH0KKyAgICByZXR1cm47ICAgIAorfQorCistIChOU0VudW1lcmF0b3IgKilvYmplY3RFbnVtZXJhdG9yCit7CisjcHJhZ21hIG1hcmsgZml4IHRoaXMgaXRzIGJyb2tlbgorICAgIE5TRW51bWVyYXRvciAqYW5FbnVtZXJhdG9yOworCisgICAgaXRJbmRleCA9IDA7CisgICAgcmV0dXJuIGFuRW51bWVyYXRvcjsKK30KKworLSAoQk9PTCloYXNOZXh0Cit7CisgICAgaWYgKHNlbGYgJiYgW3NlbGYgY291bnRdIDwgQnVmZlNpemUtMSkgeworICAgICAgICByZXR1cm4gWUVTOworICAgIH0KKyAgICByZXR1cm4gTk87Cit9CisKKy0gKEFOVExSTWFwRWxlbWVudCAqKW5leHRPYmplY3QKK3sKKyAgICBpZiAoc2VsZiAmJiBpdEluZGV4IDwgQnVmZlNpemUtMSkgeworICAgICAgICByZXR1cm4gcHRyQnVmZmVyW2l0SW5kZXhdOworICAgIH0KKyAgICByZXR1cm4gbmlsOworfQorCitAc3ludGhlc2l6ZSBCdWZmU2l6ZTsKK0BzeW50aGVzaXplIGNvdW50OworQHN5bnRoZXNpemUgcHRyOworQHN5bnRoZXNpemUgcHRyQnVmZmVyOworQHN5bnRoZXNpemUgYnVmZmVyOworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJIYXNoUnVsZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJIYXNoUnVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWY1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkhhc2hSdWxlLmgKQEAgLTAsMCArMSw3MCBAQAorLy8KKy8vICBBTlRMUkhhc2hSdWxlLmgKKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdWxlTWVtby5oIgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKworI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSSGFzaFJ1bGUgOiBBTlRMUlB0ckJ1ZmZlciB7CisgICAgLy8gICAgVFN0cmluZ1Bvb2wgKmZQb29sOworICAgIE5TSW50ZWdlciBMYXN0SGFzaDsKKyAgICBOU0ludGVnZXIgbW9kZTsKK30KKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKGlkKW5ld0FOVExSSGFzaFJ1bGU7CisrIChpZCluZXdBTlRMUkhhc2hSdWxlV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZTsKKy0gKHZvaWQpZGVhbGxvYzsKKworLSAoTlNJbnRlZ2VyKWNvdW50OworLSAoTlNJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TSW50ZWdlcilzaXplOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistICh2b2lkKWRlbGV0ZUFOVExSSGFzaFJ1bGU6KEFOVExSUnVsZU1lbW8gKilucDsKKy0gKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnA7CistIChBTlRMUlJ1bGVNZW1vICoqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihBTlRMUlJ1bGVNZW1vICoqKW5wOworLSAoTlNOdW1iZXIgKilnZXRSdWxlTWVtb1N0b3BJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4OworLSAodm9pZClwdXRSdWxlTWVtb0F0U3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXg7CistIChOU0ludGVnZXIpZ2V0TW9kZTsKKy0gKHZvaWQpc2V0TW9kZTooTlNJbnRlZ2VyKWFNb2RlOworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKUluZGV4OworLSAoQU5UTFJSdWxlTWVtbyAqKSBvYmplY3RBdEluZGV4OihOU0ludGVnZXIpSW5kZXg7CisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldExhc3RIYXNoLCBzZXR0ZXI9c2V0TGFzdEhhc2g6KSBOU0ludGVnZXIgTGFzdEhhc2g7CitAcHJvcGVydHkgKGdldHRlcj1nZXRNb2RlLHNldHRlcj1zZXRNb2RlOikgTlNJbnRlZ2VyIG1vZGU7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkhhc2hSdWxlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkhhc2hSdWxlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjYTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSGFzaFJ1bGUubQpAQCAtMCwwICsxLDI3OSBAQAorLy8KKy8vICBBTlRMUkhhc2hSdWxlLm0KKy8vICBBTlRMUgorLy8KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjZGVmaW5lIFNVQ0NFU1MgKDApCisjZGVmaW5lIEZBSUxVUkUgKC0xKQorI2RlZmluZSBBTlRMUl9NRU1PX1JVTEVfVU5LTk9XTiAtMQorCisjaW1wb3J0ICJBTlRMUkhhc2hSdWxlLmgiCisKKy8qCisgKiBTdGFydCBvZiBBTlRMUkhhc2hSdWxlCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkhhc2hSdWxlCisKK0BzeW50aGVzaXplIExhc3RIYXNoOworCisrKGlkKW5ld0FOVExSSGFzaFJ1bGUKK3sKKyAgICByZXR1cm4gW1tBTlRMUkhhc2hSdWxlIGFsbG9jXSBpbml0XTsKK30KKworKyhpZCluZXdBTlRMUkhhc2hSdWxlV2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZQoreworICAgIHJldHVybiBbW0FOVExSSGFzaFJ1bGUgYWxsb2NdIGluaXRXaXRoTGVuOmFCdWZmU2l6ZV07Cit9CisKKy0oaWQpaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46SEFTSFNJWkVdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjphQnVmZlNpemVdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIG1vZGUgPSAwOworICAgIH0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLSh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJIYXNoUnVsZSIgKTsKKyNlbmRpZgorICAgIEFOVExSUnVsZU1lbW8gKnRtcCwgKnJ0bXA7CisgICAgaW50IEluZGV4OworICAgIAorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggSW5kZXggPSAwOyBJbmRleCA8IEJ1ZmZTaXplOyBJbmRleCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW0luZGV4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICYmIHRtcCAhPSBwdHJCdWZmZXJbSW5kZXhdICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgaWYgKFt0bXAgaXNLaW5kT2ZDbGFzczpbQU5UTFJMaW5rQmFzZSBjbGFzc11dKQorICAgICAgICAgICAgICAgICAgICB0bXAgPSAoQU5UTFJSdWxlTWVtbyAqKXRtcC5mTmV4dDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5pbDsKKyAgICAgICAgICAgICAgICBbcnRtcCBkZWFsbG9jXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TSW50ZWdlciljb3VudAoreworICAgIE5TSW50ZWdlciBhQ250ID0gMDsKKyAgICAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKCBwdHJCdWZmZXJbaV0gIT0gbmlsICkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0gKE5TSW50ZWdlcikgbGVuZ3RoCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistIChOU0ludGVnZXIpIHNpemUKK3sKKyAgICBOU0ludGVnZXIgYVNpemUgPSAwOworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAoIHB0ckJ1ZmZlcltpXSAhPSBuaWwgKSB7CisgICAgICAgICAgICBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0odm9pZClkZWxldGVBTlRMUkhhc2hSdWxlOihBTlRMUlJ1bGVNZW1vICopbnAKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICp0bXAsICpydG1wOworICAgIGludCBJbmRleDsKKyAgICAKKyAgICBpZiAoIHNlbGYuZk5leHQgIT0gbmlsICkgeworICAgICAgICBmb3IoIEluZGV4ID0gMDsgSW5kZXggPCBCdWZmU2l6ZTsgSW5kZXgrKyApIHsKKyAgICAgICAgICAgIHRtcCA9IHB0ckJ1ZmZlcltJbmRleF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCAmJiB0bXAgIT0gcHRyQnVmZmVyW0luZGV4IF0gKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoW3RtcCBpc0tpbmRPZkNsYXNzOltBTlRMUkxpbmtCYXNlIGNsYXNzXV0pCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IChBTlRMUlJ1bGVNZW1vICopdG1wLmZOZXh0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbmlsOworICAgICAgICAgICAgICAgIFtydG1wIHJlbGVhc2VdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUlJ1bGVNZW1vICopbnAKK3sKKyAgICBpZiAoIG5wLmZOZXh0ICE9IG5pbCApCisgICAgICAgIFtzZWxmIGRlbGV0ZV9jaGFpbjpucC5mTmV4dF07CisgICAgW25wIGRlYWxsb2NdOworfQorCistKEFOVExSUnVsZU1lbW8gKiopZ2V0UHRyQnVmZmVyCit7CisgICAgcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSh2b2lkKXNldFB0ckJ1ZmZlcjooQU5UTFJSdWxlTWVtbyAqKilucAoreworICAgIHB0ckJ1ZmZlciA9IG5wOworfQorCistIChOU051bWJlciAqKWdldFJ1bGVNZW1vU3RvcEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphUnVsZTsKKyAgICBOU051bWJlciAqc3RvcEluZGV4OworICAgIE5TSW50ZWdlciBhbkluZGV4OworICAgIAorICAgIGFuSW5kZXggPSAoIGFTdGFydEluZGV4ID49IEJ1ZmZTaXplICkgPyBhU3RhcnRJbmRleCAlIEJ1ZmZTaXplIDogYVN0YXJ0SW5kZXg7CisgICAgaWYgKChhUnVsZSA9IHB0ckJ1ZmZlclthbkluZGV4XSkgPT0gbmlsKSB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIHN0b3BJbmRleCA9IFthUnVsZSBnZXRTdG9wSW5kZXg6YVN0YXJ0SW5kZXhdOworICAgIHJldHVybiBzdG9wSW5kZXg7Cit9CisKKy0gKHZvaWQpcHV0UnVsZU1lbW86KEFOVExSUnVsZU1lbW8gKilhUnVsZSBBdFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleAoreworICAgIE5TSW50ZWdlciBhbkluZGV4OworICAgIAorICAgIGFuSW5kZXggPSAoYVN0YXJ0SW5kZXggPj0gQnVmZlNpemUpID8gYVN0YXJ0SW5kZXggJT0gQnVmZlNpemUgOiBhU3RhcnRJbmRleDsKKyAgICBpZiAoIHB0ckJ1ZmZlclthbkluZGV4XSA9PSBuaWwgKSB7CisgICAgICAgIHB0ckJ1ZmZlclthbkluZGV4XSA9IGFSdWxlOworICAgICAgICBbYVJ1bGUgcmV0YWluXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICggW2FSdWxlLnN0YXJ0SW5kZXggaW50ZWdlclZhbHVlXSA9PSBhU3RhcnRJbmRleCApIHsKKyAgICAgICAgICAgICAgICBbYVJ1bGUgc2V0U3RhcnRJbmRleDphUnVsZS5zdG9wSW5kZXhdOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFSdWxlID0gYVJ1bGUuZk5leHQ7CisgICAgICAgIH0gd2hpbGUgKCBhUnVsZSAhPSBuaWwgKTsKKyAgICB9Cit9CisKKy0gKHZvaWQpcHV0UnVsZU1lbW9BdFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TSW50ZWdlcilhU3RvcEluZGV4Cit7CisgICAgQU5UTFJSdWxlTWVtbyAqYVJ1bGUsICpuZXdSdWxlOworICAgIE5TSW50ZWdlciBhbkluZGV4OworICAgIE5TSW50ZWdlciBhTWF0Y2hJbmRleDsKKworICAgIGFuSW5kZXggPSAoYVN0YXJ0SW5kZXggPj0gQnVmZlNpemUpID8gYVN0YXJ0SW5kZXggJSBCdWZmU2l6ZSA6IGFTdGFydEluZGV4OworICAgIGFSdWxlID0gcHRyQnVmZmVyW2FuSW5kZXhdOworICAgIGlmICggYVJ1bGUgPT0gbmlsICkgeworICAgICAgICBhUnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcEluZGV4OltOU051bWJlciBudW1iZXJXaXRoSW50ZWdlcjphU3RvcEluZGV4XV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgICAgICBwdHJCdWZmZXJbYW5JbmRleF0gPSBhUnVsZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFNYXRjaEluZGV4ID0gW2FSdWxlLnN0YXJ0SW5kZXggaW50ZWdlclZhbHVlXTsKKyAgICAgICAgaWYgKCBhU3RhcnRJbmRleCA+IGFNYXRjaEluZGV4ICkgeworICAgICAgICAgICAgaWYgKCBhUnVsZSAhPSBwdHJCdWZmZXJbYW5JbmRleF0gKSB7CisgICAgICAgICAgICAgICAgW2FSdWxlIHJldGFpbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhUnVsZS5mTmV4dCA9IHB0ckJ1ZmZlclthbkluZGV4XTsKKyAgICAgICAgICAgIHB0ckJ1ZmZlclthbkluZGV4XSA9IGFSdWxlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChhUnVsZS5mTmV4dCAhPSBuaWwpIHsKKyAgICAgICAgICAgIGFNYXRjaEluZGV4ID0gWygoQU5UTFJSdWxlTWVtbyAqKWFSdWxlLmZOZXh0KS5zdGFydEluZGV4IGludGVnZXJWYWx1ZV07CisgICAgICAgICAgICBpZiAoIGFTdGFydEluZGV4ID4gYU1hdGNoSW5kZXggKSB7CisgICAgICAgICAgICAgICAgbmV3UnVsZSA9IFtBTlRMUlJ1bGVNZW1vIG5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3BJbmRleDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVN0b3BJbmRleF1dOworICAgICAgICAgICAgICAgIFtuZXdSdWxlIHJldGFpbl07CisgICAgICAgICAgICAgICAgbmV3UnVsZS5mTmV4dCA9IGFSdWxlLmZOZXh0OworICAgICAgICAgICAgICAgIGFSdWxlLmZOZXh0ID0gbmV3UnVsZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFNYXRjaEluZGV4ID09IGFTdGFydEluZGV4ICkgeworICAgICAgICAgICAgICAgIFthUnVsZSBzZXRTdGFydEluZGV4OmFSdWxlLnN0b3BJbmRleF07CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYVJ1bGUgPSBhUnVsZS5mTmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworLSAoTlNJbnRlZ2VyKWdldExhc3RIYXNoCit7CisgICAgcmV0dXJuIExhc3RIYXNoOworfQorCistICh2b2lkKXNldExhc3RIYXNoOihOU0ludGVnZXIpYUhhc2gKK3sKKyAgICBMYXN0SGFzaCA9IGFIYXNoOworfQorCistIChOU0ludGVnZXIpZ2V0TW9kZQoreworICAgIHJldHVybiBtb2RlOworfQorCistICh2b2lkKXNldE1vZGU6KE5TSW50ZWdlcilhTW9kZQoreworICAgIG1vZGUgPSBhTW9kZTsKK30KKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlJ1bGVNZW1vICopYVJ1bGUgYXRJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKKyAgICBOU0ludGVnZXIgSW5kZXg7CisgICAgCisgICAgSW5kZXggPSAoIGFuSW5kZXggPj0gQnVmZlNpemUgKSA/IGFuSW5kZXggJSBCdWZmU2l6ZSA6IGFuSW5kZXg7CisgICAgaWYgKGFSdWxlICE9IHB0ckJ1ZmZlcltJbmRleF0pIHsKKyAgICAgICAgaWYgKCBwdHJCdWZmZXJbSW5kZXhdICkgW3B0ckJ1ZmZlcltJbmRleF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbSW5kZXhdID0gYVJ1bGU7Cit9CisKKy0gKEFOVExSUnVsZU1lbW8gKilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpYW5JbmRleAoreworICAgIE5TSW50ZWdlciBhbklkeDsKKworICAgIGFuSWR4ID0gKCBhbkluZGV4ID49IEJ1ZmZTaXplICkgPyBhbkluZGV4ICUgQnVmZlNpemUgOiBhbkluZGV4OworICAgIHJldHVybiBwdHJCdWZmZXJbYW5JZHhdOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSW5wdXRTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSW5wdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmJkZDZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnB1dFN0cmVhbS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vCisvLyAgQU5UTFJJbnB1dFN0cmVhbS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiAyLzIxLzExLgorLy8gIENvcHlyaWdodCAyMDExIEFsYW4ncyBNYWNoaW5lV29ya3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQW50bHJSZWFkZXJTdHJlYW0uaCIKKworQGludGVyZmFjZSBBTlRMUklucHV0U3RyZWFtIDogQU5UTFJSZWFkZXJTdHJlYW0geworICAgIE5TU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Cit9CisKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1N0cmluZ0VuY29kaW5nIGVuY29kaW5nOworCisrIChpZCkgbmV3QU5UTFJJbnB1dFN0cmVhbTsKKysgKGlkKSBuZXdBTlRMUklucHV0U3RyZWFtOihOU0ZpbGVIYW5kbGUgKilhbklucHV0OworKyAoaWQpIG5ld0FOVExSSW5wdXRTdHJlYW06KE5TRmlsZUhhbmRsZSAqKWFuSW5wdXQgc2l6ZTooTlNJbnRlZ2VyKXRoZVNpemU7CisrIChpZCkgbmV3QU5UTFJJbnB1dFN0cmVhbTooTlNGaWxlSGFuZGxlICopYW5JbnB1dCBlbmNvZGluZzooTlNTdHJpbmdFbmNvZGluZyl0aGVFbmNvZGluZzsKKysgKGlkKSBuZXdBTlRMUklucHV0U3RyZWFtOihOU0ZpbGVIYW5kbGUgKilhbklucHV0CisgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooTlNJbnRlZ2VyKXRoZVNpemUKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTaXplOihOU0ludGVnZXIpdGhlUkJTaXplCisgICAgICAgICAgICAgICAgICBlbmNvZGluZzooTlNTdHJpbmdFbmNvZGluZyl0aGVFbmNvZGluZzsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoSW5wdXQ6KE5TRmlsZUhhbmRsZSAqKWFuSW5wdXQKKyAgICAgICAgICAgICAgICBzaXplOihOU0ludGVnZXIpdGhlU2l6ZQorICAgICAgcmVhZEJ1ZmZlclNpemU6KE5TSW50ZWdlcil0aGVSQlNpemUKKyAgICAgICAgICAgIGVuY29kaW5nOihOU1N0cmluZ0VuY29kaW5nKXRoZUVuY29kaW5nOworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnB1dFN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnB1dFN0cmVhbS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDQxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUklucHV0U3RyZWFtLm0KQEAgLTAsMCArMSw2MyBAQAorLy8KKy8vICBBTlRMUklucHV0U3RyZWFtLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDIvMjEvMTEuCisvLyAgQ29weXJpZ2h0IDIwMTEgQWxhbidzIE1hY2hpbmVXb3Jrcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUklucHV0U3RyZWFtLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSSW5wdXRTdHJlYW0KKworQHN5bnRoZXNpemUgZW5jb2Rpbmc7CisKKysgKGlkKSBuZXdBTlRMUklucHV0U3RyZWFtCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbnB1dFN0cmVhbSBhbGxvY10gaW5pdF07Cit9CisKKysgKGlkKSBuZXdBTlRMUklucHV0U3RyZWFtOihOU0ZpbGVIYW5kbGUgKilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbQU5UTFJJbnB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhJbnB1dDphbklucHV0IHNpemU6QU5UTFJSZWFkZXJTdHJlYW0uSU5JVElBTF9CVUZGRVJfU0laRSByZWFkQnVmZmVyU2l6ZTpBTlRMUlJlYWRlclN0cmVhbS5SRUFEX0JVRkZFUl9TSVpFIGVuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ107Cit9CisKKysgKGlkKSBuZXdBTlRMUklucHV0U3RyZWFtOihOU0ZpbGVIYW5kbGUgKilhbklucHV0IHNpemU6KE5TSW50ZWdlcil0aGVTaXplCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbnB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhJbnB1dDphbklucHV0IHNpemU6dGhlU2l6ZSByZWFkQnVmZmVyU2l6ZTpBTlRMUlJlYWRlclN0cmVhbS5SRUFEX0JVRkZFUl9TSVpFIGVuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ107Cit9CisKKysgKGlkKSBuZXdBTlRMUklucHV0U3RyZWFtOihOU0ZpbGVIYW5kbGUgKilhbklucHV0IGVuY29kaW5nOihOU1N0cmluZ0VuY29kaW5nKXRoZUVuY29kaW5nCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbnB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhJbnB1dDphbklucHV0IHNpemU6QU5UTFJSZWFkZXJTdHJlYW0uSU5JVElBTF9CVUZGRVJfU0laRSByZWFkQnVmZmVyU2l6ZTpBTlRMUlJlYWRlclN0cmVhbS5SRUFEX0JVRkZFUl9TSVpFIGVuY29kaW5nOnRoZUVuY29kaW5nXTsKK30KKworKyAoaWQpIG5ld0FOVExSSW5wdXRTdHJlYW06KE5TRmlsZUhhbmRsZSAqKWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICBzaXplOihOU0ludGVnZXIpdGhlU2l6ZQorICAgICAgICAgICAgcmVhZEJ1ZmZlclNpemU6KE5TSW50ZWdlcil0aGVSQlNpemUKKyAgICAgICAgICAgICAgICAgIGVuY29kaW5nOihOU1N0cmluZ0VuY29kaW5nKXRoZUVuY29kaW5nCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbnB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhJbnB1dDphbklucHV0IHNpemU6dGhlU2l6ZSByZWFkQnVmZmVyU2l6ZTp0aGVSQlNpemUgZW5jb2Rpbmc6dGhlRW5jb2RpbmddOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aElucHV0OihOU0ZpbGVIYW5kbGUgKilhbklucHV0CisgICAgICAgICAgICAgICAgc2l6ZTooTlNJbnRlZ2VyKXRoZVNpemUKKyAgICAgIHJlYWRCdWZmZXJTaXplOihOU0ludGVnZXIpdGhlUkJTaXplCisgICAgICAgICAgICBlbmNvZGluZzooTlNTdHJpbmdFbmNvZGluZyl0aGVFbmNvZGluZworeworICAgIDtzZWxmID0gW3N1cGVyIGluaXRXaXRoUmVhZGVyOmFuSW5wdXQgc2l6ZTp0aGVTaXplIHJlYWRCdWZmZXJTaXplOnRoZVJCU2l6ZV07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgLy9bc2VsZiBsb2FkOnRoZVNpemUgcmVhZEJ1ZmZlclNpemU6dGhlUkJTaXplXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSW50QXJyYXkuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSW50QXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTgyMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnRBcnJheS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vCisvLyAgQU5UTFJJbnRBcnJheS5oCisvLyAgQU5UTFIKKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgSWFuIE1pY2hlbGwgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisjZGVmaW5lIEFOVExSX0lOVF9BUlJBWV9JTklUSUFMX1NJWkUgMTAKKworQGludGVyZmFjZSBBTlRMUkludEFycmF5IDogTlNPYmplY3QgCit7CisgICAgTlNVSW50ZWdlciBCdWZmU2l6ZTsKKyAgICBOU1VJbnRlZ2VyIGNvdW50OworICAgIE5TSW50ZWdlciBpZHg7CisgICAgTlNNdXRhYmxlRGF0YSAqYnVmZmVyOworICAgIF9fc3Ryb25nIE5TSW50ZWdlciAqaW50QnVmZmVyOworICAgIEJPT0wgU1BBUlNFOworfQorCisrIChBTlRMUkludEFycmF5ICopbmV3QXJyYXk7CisrIChBTlRMUkludEFycmF5ICopbmV3QXJyYXlXaXRoTGVuOihOU1VJbnRlZ2VyKWFMZW47CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoTGVuOihOU1VJbnRlZ2VyKWFMZW47CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistICh2b2lkKSBhZGRJbnRlZ2VyOihOU0ludGVnZXIpIHZhbHVlOworLSAoTlNJbnRlZ2VyKSBwb3A7CistICh2b2lkKSBwdXNoOihOU0ludGVnZXIpIHZhbHVlOworLSAoTlNJbnRlZ2VyKSBpbnRlZ2VyQXRJbmRleDooTlNVSW50ZWdlcikgaW5kZXg7CistICh2b2lkKSBpbnNlcnRJbnRlZ2VyOihOU0ludGVnZXIpYW5JbnRlZ2VyIEF0SW5kZXg6KE5TVUludGVnZXIpIGFuSW5kZXg7CistIChOU0ludGVnZXIpcmVtb3ZlSW50ZWdlckF0SW5kZXg6KE5TVUludGVnZXIpIGFuSW5kZXg7CistICh2b2lkKXJlcGxhY2VJbnRlZ2VyOihOU0ludGVnZXIpYVZhbHVlIEF0SW5kZXg6KE5TVUludGVnZXIpYW5JbmRleDsKKy0gKHZvaWQpIHJlc2V0OworCistIChOU1VJbnRlZ2VyKSBjb3VudDsKKy0gKE5TVUludGVnZXIpIHNpemU7CistICh2b2lkKSBlbnN1cmVDYXBhY2l0eTooTlNVSW50ZWdlcikgYW5JbmRleDsKKworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgQnVmZlNpemU7CitAcHJvcGVydHkgKGFzc2lnbikgTlNVSW50ZWdlciBjb3VudDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgaWR4OworQHByb3BlcnR5IChyZXRhaW4pIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgKmludEJ1ZmZlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIFNQQVJTRTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnRBcnJheS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnRBcnJheS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTUzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkludEFycmF5Lm0KQEAgLTAsMCArMSwxOTkgQEAKKy8vCisvLyAgQU5UTFJJbnRBcnJheS5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAyNy8wNC8yMDEwLgorLy8gQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJJbnRBcnJheS5oIgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkludEFycmF5CisKK0BzeW50aGVzaXplIEJ1ZmZTaXplOworQHN5bnRoZXNpemUgY291bnQ7CitAc3ludGhlc2l6ZSBpZHg7CitAc3ludGhlc2l6ZSBidWZmZXI7CitAc3ludGhlc2l6ZSBpbnRCdWZmZXI7CitAc3ludGhlc2l6ZSBTUEFSU0U7CisKKysgKEFOVExSSW50QXJyYXkgKiluZXdBcnJheQoreworICAgIHJldHVybiBbW0FOVExSSW50QXJyYXkgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUkludEFycmF5ICopbmV3QXJyYXlXaXRoTGVuOihOU1VJbnRlZ2VyKWFMZW4KK3sKKyAgICByZXR1cm4gW1tBTlRMUkludEFycmF5IGFsbG9jXSBpbml0V2l0aExlbjphTGVuXTsKK30KKworLSAoaWQpaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgQnVmZlNpemUgID0gKEFOVExSX0lOVF9BUlJBWV9JTklUSUFMX1NJWkUgKiAoc2l6ZW9mKE5TSW50ZWdlcikvc2l6ZW9mKGlkKSkpOworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIGlkeCA9IC0xOworICAgICAgICBidWZmZXIgPSBbW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6KE5TVUludGVnZXIpQnVmZlNpemUgKiBzaXplb2YoaWQpXSByZXRhaW5dOworICAgICAgICBpbnRCdWZmZXIgPSAoTlNJbnRlZ2VyICopW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgICAgICBTUEFSU0UgPSBOTzsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKWluaXRXaXRoTGVuOihOU1VJbnRlZ2VyKWFMZW4KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIEJ1ZmZTaXplICA9IChBTlRMUl9JTlRfQVJSQVlfSU5JVElBTF9TSVpFICogKHNpemVvZihOU0ludGVnZXIpL3NpemVvZihpZCkpKTsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICBpZHggPSAtMTsKKyAgICAgICAgYnVmZmVyID0gW1tOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOihOU1VJbnRlZ2VyKUJ1ZmZTaXplICogc2l6ZW9mKGlkKV0gcmV0YWluXTsKKyAgICAgICAgaW50QnVmZmVyID0gKE5TSW50ZWdlciAqKVtidWZmZXIgbXV0YWJsZUJ5dGVzXTsKKyAgICAgICAgU1BBUlNFID0gTk87CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJJbnRBcnJheSIgKTsKKyNlbmRpZgorICAgIGlmICggYnVmZmVyICkgW2J1ZmZlciByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKWNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICBBTlRMUkludEFycmF5ICpjb3B5OworICAgIAorICAgIGNvcHkgPSBbW1tzZWxmIGNsYXNzXSBhbGxvY10gaW5pdFdpdGhMZW46QnVmZlNpemVdOworICAgIGNvcHkuaWR4ID0gc2VsZi5pZHg7CisgICAgTlNJbnRlZ2VyIGFuSW5kZXg7CisgICAgZm9yICggYW5JbmRleCA9IDA7IGFuSW5kZXggPCBCdWZmU2l6ZTsgYW5JbmRleCsrICkgeworICAgICAgICBbY29weSBhZGRJbnRlZ2VyOmludEJ1ZmZlclthbkluZGV4XV07CisgICAgfQorICAgIHJldHVybiBjb3B5OworfQorCistIChOU1VJbnRlZ2VyKWNvdW50Cit7CisgICAgcmV0dXJuIGNvdW50OworfQorCisvLyBGSVhNRTogSmF2YSBydW50aW1lIHJldHVybnMgcCwgSSdtIG5vdCBzbyBzdXJlIGl0J3MgcmlnaHQgc28gaGF2ZSBhZGRlZCBwICsgMSB0byBzaG93IHRydWUgc2l6ZSEKKy0gKE5TVUludGVnZXIpc2l6ZQoreworICAgIGlmICggY291bnQgPiAwICkKKyAgICAgICAgcmV0dXJuICggY291bnQgKiBzaXplb2YoTlNJbnRlZ2VyKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy0gKHZvaWQpYWRkSW50ZWdlcjooTlNJbnRlZ2VyKSB2YWx1ZQoreworICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OmlkeCsxXTsKKyAgICBpbnRCdWZmZXJbKytpZHhdID0gKE5TSW50ZWdlcikgdmFsdWU7CisgICAgY291bnQrKzsKK30KKworLSAoTlNJbnRlZ2VyKXBvcAoreworICAgIGlmICggaWR4IDwgMCApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJOb3RoaW5nIHRvIHBvcCwgY291bnQgPSAlZCIsIGNvdW50XV07CisgICAgfQorICAgIE5TSW50ZWdlciB2YWx1ZSA9IChOU0ludGVnZXIpIGludEJ1ZmZlcltpZHgtLV07CisgICAgY291bnQtLTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy0gKHZvaWQpcHVzaDooTlNJbnRlZ2VyKWFWYWx1ZQoreworICAgIFtzZWxmIGFkZEludGVnZXI6YVZhbHVlXTsKK30KKworLSAoTlNJbnRlZ2VyKWludGVnZXJBdEluZGV4OihOU1VJbnRlZ2VyKSBhbkluZGV4Cit7CisgICAgaWYgKCBTUEFSU0U9PU5PICAmJiBhbkluZGV4ID4gaWR4ICkgeworICAgICAgICBAdGhyb3cgW0FOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIkluZGV4ICVkIG11c3QgYmUgbGVzcyB0aGFuIGNvdW50ICVkIiwgYW5JbmRleCwgY291bnRdXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFNQQVJTRSA9PSBZRVMgJiYgYW5JbmRleCA+PSBCdWZmU2l6ZSApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJJbmRleCAlZCBtdXN0IGJlIGxlc3MgdGhhbiBCdWZmU2l6ZSAlZCIsIGFuSW5kZXgsIEJ1ZmZTaXplXV07CisgICAgfQorICAgIHJldHVybiBpbnRCdWZmZXJbYW5JbmRleF07Cit9CisKKy0gKHZvaWQpaW5zZXJ0SW50ZWdlcjooTlNJbnRlZ2VyKWFWYWx1ZSBBdEluZGV4OihOU1VJbnRlZ2VyKWFuSW5kZXgKK3sKKyAgICBbc2VsZiByZXBsYWNlSW50ZWdlcjphVmFsdWUgQXRJbmRleDphbkluZGV4XTsKKyAgICBjb3VudCsrOworfQorCistIChOU0ludGVnZXIpcmVtb3ZlSW50ZWdlckF0SW5kZXg6KE5TVUludGVnZXIpIGFuSW5kZXgKK3sKKyAgICBpZiAoIFNQQVJTRT09Tk8gJiYgYW5JbmRleCA+IGlkeCApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJJbmRleCAlZCBtdXN0IGJlIGxlc3MgdGhhbiBjb3VudCAlZCIsIGFuSW5kZXgsIGNvdW50XV07CisgICAgICAgIHJldHVybiAoTlNJbnRlZ2VyKS0xOworICAgIH0gZWxzZSBpZiAoIFNQQVJTRT09WUVTICYmIGFuSW5kZXggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIEB0aHJvdyBbQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiSW5kZXggJWQgbXVzdCBiZSBsZXNzIHRoYW4gQnVmZlNpemUgJWQiLCBhbkluZGV4LCBCdWZmU2l6ZV1dOworICAgIH0KKyAgICBjb3VudC0tOworICAgIHJldHVybiBpbnRCdWZmZXJbYW5JbmRleF07Cit9CisKKy0gKHZvaWQpcmVwbGFjZUludGVnZXI6KE5TSW50ZWdlcilhVmFsdWUgQXRJbmRleDooTlNVSW50ZWdlcilhbkluZGV4Cit7CisgICAgaWYgKCBTUEFSU0UgPT0gTk8gJiYgYW5JbmRleCA+IGlkeCApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJJbmRleCAlZCBtdXN0IGJlIGxlc3MgdGhhbiBjb3VudCAlZCIsIGFuSW5kZXgsIGNvdW50XV07CisgICAgfQorICAgIGVsc2UgaWYgKCBTUEFSU0UgPT0gWUVTICYmIGFuSW5kZXggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIEB0aHJvdyBbQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiSW5kZXggJWQgbXVzdCBiZSBsZXNzIHRoYW4gQnVmZlNpemUgJWQiLCBhbkluZGV4LCBCdWZmU2l6ZV1dOworICAgIH0KKyAgICBpbnRCdWZmZXJbYW5JbmRleF0gPSBhVmFsdWU7Cit9CisKKy0odm9pZCkgcmVzZXQKK3sKKyAgICBjb3VudCA9IDA7CisgICAgaWR4ID0gLTE7Cit9CisKKy0gKHZvaWQpIGVuc3VyZUNhcGFjaXR5OihOU1VJbnRlZ2VyKSBhbkluZGV4Cit7CisgICAgaWYgKCAoYW5JbmRleCAqIHNpemVvZihOU1VJbnRlZ2VyKSkgPj0gW2J1ZmZlciBsZW5ndGhdICkKKyAgICB7CisgICAgICAgIE5TVUludGVnZXIgbmV3U2l6ZSA9IChbYnVmZmVyIGxlbmd0aF0gLyBzaXplb2YoTlNJbnRlZ2VyKSkgKiAyOworICAgICAgICBpZiAoYW5JbmRleCA+IG5ld1NpemUpIHsKKyAgICAgICAgICAgIG5ld1NpemUgPSBhbkluZGV4ICsgMTsKKyAgICAgICAgfQorICAgICAgICBCdWZmU2l6ZSA9IG5ld1NpemU7CisgICAgICAgIFtidWZmZXIgc2V0TGVuZ3RoOihCdWZmU2l6ZSAqIHNpemVvZihOU1VJbnRlZ2VyKSldOworICAgICAgICBpbnRCdWZmZXIgPSAoTlNJbnRlZ2VyICopW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgIH0KK30KKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkludEFycmF5VGVzdC1JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnRBcnJheVRlc3QtSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg1YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJJbnRBcnJheVRlc3QtSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55LiR7UFJPRFVDVF9OQU1FOnJmYzEwMzRpZGVudGlmaWVyfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Qk5ETDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MTwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSSW50U3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkludFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2Y5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkludFN0cmVhbS5oCkBAIC0wLDAgKzEsMTA2IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBERUJVR19ERUFMTE9DCisjZGVmaW5lIERFQlVHX0RFQUxMT0MKKyNlbmRpZgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW0gPCBOU09iamVjdCwgTlNDb3B5aW5nID4KKworLSAodm9pZCkgY29uc3VtZTsKKworLy8gR2V0IHVuaWNoYXIgYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBjaGFyYWN0ZXIgYXMgaW50IGZvciBpbmNsdWRpbmcgQU5UTFJDaGFyU3RyZWFtRU9GICgtMSkgaW4gdGhlIGRhdGEgcmFuZ2UKKy0gKE5TSW50ZWdlcikgTEE6KE5TSW50ZWdlcikgaTsKKworLy8gVGVsbCB0aGUgc3RyZWFtIHRvIHN0YXJ0IGJ1ZmZlcmluZyBpZiBpdCBoYXNuJ3QgYWxyZWFkeS4gIFJldHVybgorLy8gY3VycmVudCBpbnB1dCBwb3NpdGlvbiwgaW5kZXgoKSwgb3Igc29tZSBvdGhlciBtYXJrZXIgc28gdGhhdAorLy8gd2hlbiBwYXNzZWQgdG8gcmV3aW5kKCkgeW91IGdldCBiYWNrIHRvIHRoZSBzYW1lIHNwb3QuCisvLyByZXdpbmQobWFyaygpKSBzaG91bGQgbm90IGFmZmVjdCB0aGUgaW5wdXQgY3Vyc29yLgorLy8gVE9ETzogcHJvYmxlbSBpbiB0aGF0IGxleGVyIHN0cmVhbSByZXR1cm5zIG5vdCBpbmRleCBidXQgc29tZSBtYXJrZXIgCisKKy0gKE5TSW50ZWdlcikgbWFyazsKKworLy8gUmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCBpbmRleCAwLi5uIHdoZXJlIG4gaW5kaWNhdGVzIHRoZQorLy8gbGFzdCBzeW1ib2wgaGFzIGJlZW4gcmVhZC4KKworLSAoTlNJbnRlZ2VyKSBpbmRleDsKKworLSAoTlNVSW50ZWdlcikgbGluZTsKKworLSAoTlNVSW50ZWdlcikgY2hhclBvc2l0aW9uSW5MaW5lOworCisvLyBSZXNldCB0aGUgc3RyZWFtIHNvIHRoYXQgbmV4dCBjYWxsIHRvIGluZGV4IHdvdWxkIHJldHVybiBtYXJrZXIuCisvLyBUaGUgbWFya2VyIHdpbGwgdXN1YWxseSBiZSAtaW5kZXggYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS4gIEl0J3MKKy8vIGp1c3QgYSBtYXJrZXIgdG8gaW5kaWNhdGUgd2hhdCBzdGF0ZSB0aGUgc3RyZWFtIHdhcyBpbi4gIFRoaXMgaXMKKy8vIGVzc2VudGlhbGx5IGNhbGxpbmcgLXJlbGVhc2U6IGFuZCAtc2VlazouICBJZiB0aGVyZSBhcmUgbWFya2VycworLy8gY3JlYXRlZCBhZnRlciB0aGlzIG1hcmtlciBhcmd1bWVudCwgdGhpcyByb3V0aW5lIG11c3QgdW5yb2xsIHRoZW0KKy8vIGxpa2UgYSBzdGFjay4gIEFzc3VtZSB0aGUgc3RhdGUgdGhlIHN0cmVhbSB3YXMgaW4gd2hlbiB0aGlzIG1hcmtlcgorLy8gd2FzIGNyZWF0ZWQuCisKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKSBtYXJrZXI7CisKKy8vIFlvdSBtYXkgd2FudCB0byBjb21taXQgdG8gYSBiYWNrdHJhY2sgYnV0IGRvbid0IHdhbnQgdG8gZm9yY2UgdGhlCisvLyBzdHJlYW0gdG8ga2VlcCBib29ra2VlcGluZyBvYmplY3RzIGFyb3VuZCBmb3IgYSBtYXJrZXIgdGhhdCBpcworLy8gbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gIFRoaXMgd2lsbCBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yIGFzCisvLyByZXdpbmQoKSBleGNlcHQgaXQgcmVsZWFzZXMgcmVzb3VyY2VzIHdpdGhvdXQgdGhlIGJhY2t3YXJkIHNlZWsuCisKKy0gKHZvaWQpIHJlbGVhc2U6KE5TSW50ZWdlcikgbWFya2VyOworCisvLyBTZXQgdGhlIGlucHV0IGN1cnNvciB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IGluZGV4LiAgVGhpcyBpcworLy8gbm9ybWFsbHkgdXNlZCB0byBzZWVrIGFoZWFkIGluIHRoZSBpbnB1dCBzdHJlYW0uICBObyBidWZmZXJpbmcgaXMKKy8vIHJlcXVpcmVkIHRvIGRvIHRoaXMgdW5sZXNzIHlvdSBrbm93IHlvdXIgc3RyZWFtIHdpbGwgdXNlIHNlZWsgdG8KKy8vIG1vdmUgYmFja3dhcmRzIHN1Y2ggYXMgd2hlbiBiYWNrdHJhY2tpbmcuCisvLyBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHJld2luZCBpbiBpdHMgbXVsdGktZGlyZWN0aW9uYWwKKy8vIHJlcXVpcmVtZW50IGFuZCBpbiB0aGF0IGl0cyBhcmd1bWVudCBpcyBzdHJpY3RseSBhbiBpbnB1dCBjdXJzb3IgKGluZGV4KS4KKy8vCisvLyBGb3IgY2hhciBzdHJlYW1zLCBzZWVraW5nIGZvcndhcmQgbXVzdCB1cGRhdGUgdGhlIHN0cmVhbSBzdGF0ZSBzdWNoCisvLyBhcyBsaW5lIG51bWJlci4gIEZvciBzZWVraW5nIGJhY2t3YXJkcywgeW91IHdpbGwgYmUgcHJlc3VtYWJseQorLy8gYmFja3RyYWNraW5nIHVzaW5nIHRoZSBtYXJrL3Jld2luZCBtZWNoYW5pc20gdGhhdCByZXN0b3JlcyBzdGF0ZSBhbmQKKy8vIHNvIHRoaXMgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gdXBkYXRlIHN0YXRlIHdoZW4gc2Vla2luZyBiYWNrd2FyZHMuCisvLworLy8gQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZm9yIGVmZmljaWVudCBiYWNrdHJhY2tpbmcsIGJ1dAorLy8gaW4gdGhlIGZ1dHVyZSBpdCBtYXkgYmUgdXNlZCBmb3IgaW5jcmVtZW50YWwgcGFyc2luZy4KKworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKSBhbkluZGV4OworCisvKiogT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCBidXQKKyAqICBtaWdodCBiZSB1c2VmdWwgdG8gZGlzcGxheSB0aGUgZW50aXJlIHN0cmVhbSBvciBmb3IgdGVzdGluZy4gIFRoaXMKKyAqICB2YWx1ZSBpbmNsdWRlcyBhIHNpbmdsZSBFT0YuCisgKi8KKy0gKE5TVUludGVnZXIpIHNpemU7CisvKiogV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICogIHBhc3MgdGhlIGJ1Y2sgYWxsIHRoZSB3YXkgdG8gdGhlIGxleGVyIHdobyBjYW4gYXNrIGl0cyBpbnB1dCBzdHJlYW0KKyAqICBmb3IgdGhlIGZpbGUgbmFtZSBvciB3aGF0ZXZlci4KKyAqLworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lOworCisvL0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgaW5kZXg7CisvL0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGxpbmU7CisvL0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ODVjYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXIuaApAQCAtMCwwICsxLDkwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlblNvdXJjZS5oIgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJMZXhlciA6IEFOVExSQmFzZVJlY29nbml6ZXIgPEFOVExSVG9rZW5Tb3VyY2U+IHsKKwlpZDxBTlRMUkNoYXJTdHJlYW0+IGlucHV0OyAgICAgIC8vLzwgVGhlIGNoYXJhY3RlciBzdHJlYW0gd2UgcHVsbCB0b2tlbnMgb3V0IG9mLgorCU5TVUludGVnZXIgcnVsZU5lc3RpbmdMZXZlbDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1pbnB1dCwgc2V0dGVyPXNldElucHV0OikgaWQ8QU5UTFJDaGFyU3RyZWFtPiBpbnB1dDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFJ1bGVOZXN0aW5nTGV2ZWwsIHNldHRlcj1zZXRSdWxlTmVzdGluZ0xldmVsOikgTlNVSW50ZWdlciBydWxlTmVzdGluZ0xldmVsOworCisjcHJhZ21hIG1hcmsgSW5pdGlhbGl6ZXIKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pIGFuSW5wdXQ7CistIChpZCkgaW5pdFdpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQgU3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopc3RhdGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmU7CisKKy0gKHZvaWQpIHJlc2V0OworCisvLyAtIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBzdGF0ZTsKKworI3ByYWdtYSBtYXJrIFRva2VucworLSAoaWQ8QU5UTFJUb2tlbj4pZ2V0VG9rZW47CistICh2b2lkKSBzZXRUb2tlbjogKGlkPEFOVExSVG9rZW4+KSBhVG9rZW47CistIChpZDxBTlRMUlRva2VuPikgbmV4dFRva2VuOworLSAodm9pZCkgbVRva2VuczsJCS8vIGFic3RyYWN0LCBkZWZpbmVkIGluIGdlbmVyYXRlZCBzb3VyY2VzCistICh2b2lkKSBza2lwOworLSAoaWQ8QU5UTFJDaGFyU3RyZWFtPikgaW5wdXQ7CistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPilhQ2hhclN0cmVhbTsKKworLSAodm9pZCkgZW1pdDsKKy0gKHZvaWQpIGVtaXQ6KGlkPEFOVExSVG9rZW4+KWFUb2tlbjsKKworI3ByYWdtYSBtYXJrIE1hdGNoaW5nCistICh2b2lkKSBtYXRjaFN0cmluZzooTlNTdHJpbmcgKilhU3RyaW5nOworLSAodm9pZCkgbWF0Y2hBbnk7CistICh2b2lkKSBtYXRjaENoYXI6KHVuaWNoYXIpIGFDaGFyOworLSAodm9pZCkgbWF0Y2hSYW5nZUZyb21DaGFyOih1bmljaGFyKWZyb21DaGFyIHRvOih1bmljaGFyKXRvQ2hhcjsKKworI3ByYWdtYSBtYXJrIEluZm9ybWF0aW9uYWwKKy0gKE5TVUludGVnZXIpIGxpbmU7CistIChOU1VJbnRlZ2VyKSBjaGFyUG9zaXRpb25JbkxpbmU7CistIChOU0ludGVnZXIpIGluZGV4OworLSAoTlNTdHJpbmcgKikgdGV4dDsKKy0gKHZvaWQpIHNldFRleHQ6KE5TU3RyaW5nICopIHRoZVRleHQ7CisKKy8vIGVycm9yIGhhbmRsaW5nCistICh2b2lkKSByZXBvcnRFcnJvcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistIChOU1N0cmluZyAqKWdldEVycm9yTWVzc2FnZTooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUgVG9rZW5OYW1lczooQU11dGFibGVBcnJheSAqKXRva2VuTmFtZXM7CistIChOU1N0cmluZyAqKWdldENoYXJFcnJvckRpc3BsYXk6KE5TSW50ZWdlciljOworLSAodm9pZCkgcmVjb3ZlcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWU7CistICh2b2lkKXRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXg7CistICh2b2lkKXRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYTBhMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXIubQpAQCAtMCwwICsxLDQyOCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPEFOVExSL2FudGxyLmg+CisjaW1wb3J0ICJBTlRMUkxleGVyLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkxleGVyCisKK0BzeW50aGVzaXplIGlucHV0OworQHN5bnRoZXNpemUgcnVsZU5lc3RpbmdMZXZlbDsKKyNwcmFnbWEgbWFyayBJbml0aWFsaXplcgorCistIChpZCkgaW5pdFdpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBhbGxvY10gaW5pdF1dOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIGlucHV0ID0gW2FuSW5wdXQgcmV0YWluXTsKKyAgICAgICAgaWYgKHN0YXRlLnRva2VuICE9IG5pbCkKKyAgICAgICAgICAgIFsoKEFOVExSQ29tbW9uVG9rZW4gKilzdGF0ZS50b2tlbikgc2V0SW5wdXQ6YW5JbnB1dF07CisJCXJ1bGVOZXN0aW5nTGV2ZWwgPSAwOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZQoreworCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdGF0ZTphU3RhdGVdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIGlucHV0ID0gW2FuSW5wdXQgcmV0YWluXTsKKyAgICAgICAgaWYgKHN0YXRlLnRva2VuICE9IG5pbCkKKyAgICAgICAgICAgIFsoKEFOVExSQ29tbW9uVG9rZW4gKilzdGF0ZS50b2tlbikgc2V0SW5wdXQ6YW5JbnB1dF07CisJCXJ1bGVOZXN0aW5nTGV2ZWwgPSAwOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIGlmICggaW5wdXQgKSBbaW5wdXQgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZQoreworICAgIEFOVExSTGV4ZXIgKmNvcHk7CisJCisgICAgY29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworICAgIC8vICAgIGNvcHkgPSBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsgLy8gYWxsb2NhdGlvbiBvY2N1cnMgaGVyZQorICAgIGlmICggaW5wdXQgIT0gbmlsICkKKyAgICAgICAgY29weS5pbnB1dCA9IGlucHV0OworICAgIGNvcHkucnVsZU5lc3RpbmdMZXZlbCA9IHJ1bGVOZXN0aW5nTGV2ZWw7CisgICAgcmV0dXJuIGNvcHk7Cit9CisKKy0gKHZvaWQpIHJlc2V0Cit7CisgICAgW3N1cGVyIHJlc2V0XTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgICAgICAgICAgICAgICAgLy8gd2FjayBMZXhlciBzdGF0ZSB2YXJpYWJsZXMKKyAgICBpZiAoIGlucHV0ICE9IG5pbCApIHsKKyAgICAgICAgW2lucHV0IHNlZWs6MF07IC8vIHJld2luZCB0aGUgaW5wdXQKKyAgICB9CisgICAgaWYgKCBzdGF0ZSA9PSBuaWwgKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gc2hhcmVkIHN0YXRlIHdvcmsgdG8gZG8KKyAgICB9CisgICAgc3RhdGUudG9rZW4gPSBuaWw7CisgICAgc3RhdGUudHlwZSA9IEFOVExSQ29tbW9uVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFOworICAgIHN0YXRlLmNoYW5uZWwgPSBBTlRMUkNvbW1vblRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisgICAgc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IC0xOworICAgIHN0YXRlLnRva2VuU3RhcnRMaW5lID0gLTE7CisgICAgc3RhdGUudGV4dCA9IG5pbDsKK30KKworLy8gdG9rZW4gc3R1ZmYKKyNwcmFnbWEgbWFyayBUb2tlbnMKKworLSAoaWQ8QU5UTFJUb2tlbj4pZ2V0VG9rZW4KK3sKKyAgICByZXR1cm4gW3N0YXRlIGdldFRva2VuXTsgCit9CisKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbgoreworICAgIGlmIChzdGF0ZS50b2tlbiAhPSBhVG9rZW4pIHsKKyAgICAgICAgW2FUb2tlbiByZXRhaW5dOworICAgICAgICBzdGF0ZS50b2tlbiA9IGFUb2tlbjsKKyAgICB9Cit9CisKKworLy8gdGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIGdlbmVyYXRlZCBsZXhlciBpZiB3ZSBnZW5lcmF0ZSBhIGZpbHRlcmluZyBsZXhlci4KKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW4KK3sKKwl3aGlsZSAoWUVTKSB7CisgICAgICAgIFtzZWxmIHNldFRva2VuOm5pbF07CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBBTlRMUkNvbW1vblRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LmluZGV4OworICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gaW5wdXQuY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICBzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LmxpbmU7CisgICAgICAgIHN0YXRlLnRleHQgPSBuaWw7CisgICAgICAgIAorICAgICAgICAvLyBbc2VsZiBzZXRUZXh0OltzZWxmIHRleHRdXTsKKwkJaWYgKFtpbnB1dCBMQToxXSA9PSBBTlRMUkNoYXJTdHJlYW1FT0YpIHsKKyAgICAgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmVvZiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOmlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTpBTlRMUlRva2VuVHlwZUVPRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWw6QU5UTFJDb21tb25Ub2tlbi5ERUZBVUxUX0NIQU5ORUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0OmlucHV0LmluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcDppbnB1dC5pbmRleF07CisgICAgICAgICAgICBbZW9mIHNldExpbmU6aW5wdXQubGluZV07CisgICAgICAgICAgICBbZW9mIHNldENoYXJQb3NpdGlvbkluTGluZTppbnB1dC5jaGFyUG9zaXRpb25JbkxpbmVdOworCQkJcmV0dXJuIGVvZjsKKwkJfQorCQlAdHJ5IHsKKwkJCVtzZWxmIG1Ub2tlbnNdOworICAgICAgICAgICAgLy8gU0VMIGFNZXRob2QgPSBAc2VsZWN0b3IobVRva2Vucyk7CisgICAgICAgICAgICAvLyBbW3NlbGYgY2xhc3NdIGluc3RhbmNlc1Jlc3BvbmRUb1NlbGVjdG9yOmFNZXRob2RdOworICAgICAgICAgICAgaWYgKCBzdGF0ZS50b2tlbiA9PSBuaWwpCisgICAgICAgICAgICAgICAgW3NlbGYgZW1pdF07CisgICAgICAgICAgICBlbHNlIGlmICggc3RhdGUudG9rZW4gPT0gW0FOVExSQ29tbW9uVG9rZW4gc2tpcFRva2VuXSApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwkJCXJldHVybiBzdGF0ZS50b2tlbjsKKwkJfQorCQlAY2F0Y2ggKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YSkgeworCQkJW3NlbGYgcmVwb3J0RXJyb3I6bnZhXTsKKwkJCVtzZWxmIHJlY292ZXI6bnZhXTsKKwkJfQorCQlAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKmUpIHsKKwkJCVtzZWxmIHJlcG9ydEVycm9yOmVdOworCQl9CisJfQorfQorCistICh2b2lkKSBtVG9rZW5zCit7ICAgLy8gYWJzdHJhY3QsIGRlZmluZWQgaW4gZ2VuZXJhdGVkIHNvdXJjZSBhcyBhIHN0YXJ0aW5nIHBvaW50IGZvciBtYXRjaGluZworICAgIFtzZWxmIGRvZXNOb3RSZWNvZ25pemVTZWxlY3RvcjpfY21kXTsKK30KKworLSAodm9pZCkgc2tpcAoreworICAgIHN0YXRlLnRva2VuID0gW0FOVExSQ29tbW9uVG9rZW4gc2tpcFRva2VuXTsKK30KKworLSAoaWQ8QU5UTFJDaGFyU3RyZWFtPikgaW5wdXQKK3sKKyAgICByZXR1cm4gaW5wdXQ7IAorfQorCistICh2b2lkKSBzZXRJbnB1dDooaWQ8QU5UTFJDaGFyU3RyZWFtPikgYW5JbnB1dAoreworICAgIGlmICggYW5JbnB1dCAhPSBpbnB1dCApIHsKKyAgICAgICAgaWYgKCBpbnB1dCApIFtpbnB1dCByZWxlYXNlXTsKKyAgICB9CisgICAgaW5wdXQgPSBuaWw7CisgICAgW3NlbGYgcmVzZXRdOworICAgIGlucHV0ID0gYW5JbnB1dDsKKyAgICBbaW5wdXQgcmV0YWluXTsKK30KKworLyoqIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGVtaXRzIHBlciBuZXh0VG9rZW4gaW52b2NhdGlvbgorICogIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuICBTdWJjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kCisgKiAgbmV4dFRva2VuICh0byBwdXNoIHRva2VucyBpbnRvIGEgbGlzdCBhbmQgcHVsbCBmcm9tIHRoYXQgbGlzdCByYXRoZXIKKyAqICB0aGFuIGEgc2luZ2xlIHZhcmlhYmxlIGFzIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcykuCisgKi8KKy0gKHZvaWQpIGVtaXQ6KGlkPEFOVExSVG9rZW4+KWFUb2tlbgoreworCXN0YXRlLnRva2VuID0gYVRva2VuOworfQorCisvKiogVGhlIHN0YW5kYXJkIG1ldGhvZCBjYWxsZWQgdG8gYXV0b21hdGljYWxseSBlbWl0IGEgdG9rZW4gYXQgdGhlCisgKiAgb3V0ZXJtb3N0IGxleGljYWwgcnVsZS4gIFRoZSB0b2tlbiBvYmplY3Qgc2hvdWxkIHBvaW50IGludG8gdGhlCisgKiAgY2hhciBidWZmZXIgc3RhcnQuLnN0b3AuICBJZiB0aGVyZSBpcyBhIHRleHQgb3ZlcnJpZGUgaW4gJ3RleHQnLAorICogIHVzZSB0aGF0IHRvIHNldCB0aGUgdG9rZW4ncyB0ZXh0LiAgT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZW1pdAorICogIGN1c3RvbSBUb2tlbiBvYmplY3RzLgorICoKKyAqICBJZiB5b3UgYXJlIGJ1aWxkaW5nIHRyZWVzLCB0aGVuIHlvdSBzaG91bGQgYWxzbyBvdmVycmlkZQorICogIFBhcnNlciBvciBUcmVlUGFyc2VyLmdldE1pc3NpbmdTeW1ib2woKS4KKyAqLworLSAodm9pZCkgZW1pdAoreworCWlkPEFOVExSVG9rZW4+IGFUb2tlbiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOmlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6c3RhdGUudHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsOnN0YXRlLmNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydDpzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3A6aW5wdXQuaW5kZXgtMV07CisJW2FUb2tlbiBzZXRMaW5lOnN0YXRlLnRva2VuU3RhcnRMaW5lXTsKKyAgICBhVG9rZW4udGV4dCA9IFtzZWxmIHRleHRdOworCVthVG9rZW4gc2V0Q2hhclBvc2l0aW9uSW5MaW5lOnN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmVdOworICAgIFthVG9rZW4gcmV0YWluXTsKKwlbc2VsZiBlbWl0OmFUb2tlbl07CisJLy8gW2FUb2tlbiByZWxlYXNlXTsKK30KKworLy8gbWF0Y2hpbmcKKyNwcmFnbWEgbWFyayBNYXRjaGluZworLSAodm9pZCkgbWF0Y2hTdHJpbmc6KE5TU3RyaW5nICopYVN0cmluZworeworICAgIHVuaWNoYXIgYzsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJdW5zaWduZWQgaW50IHN0cmluZ0xlbmd0aCA9IFthU3RyaW5nIGxlbmd0aF07CisJd2hpbGUgKCBpIDwgc3RyaW5nTGVuZ3RoICkgeworCQljID0gW2lucHV0IExBOjFdOworICAgICAgICBpZiAoIGMgIT0gW2FTdHJpbmcgY2hhcmFjdGVyQXRJbmRleDppXSApIHsKKwkJCWlmIChbc3RhdGUgZ2V0QmFja3RyYWNraW5nXSA+IDApIHsKKwkJCQlzdGF0ZS5mYWlsZWQgPSBZRVM7CisJCQkJcmV0dXJuOworCQkJfQorCQkJQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKm10ZSA9IFtBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBuZXdFeGNlcHRpb25DaGFyOlthU3RyaW5nIGNoYXJhY3RlckF0SW5kZXg6aV0gU3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIG10ZS5jID0gYzsKKwkJCVtzZWxmIHJlY292ZXI6bXRlXTsKKwkJCUB0aHJvdyBtdGU7CisJCX0KKwkJaSsrOworCQlbaW5wdXQgY29uc3VtZV07CisJCXN0YXRlLmZhaWxlZCA9IE5POworCX0KK30KKworLSAodm9pZCkgbWF0Y2hBbnkKK3sKKwlbaW5wdXQgY29uc3VtZV07Cit9CisKKy0gKHZvaWQpIG1hdGNoQ2hhcjoodW5pY2hhcikgYUNoYXIKK3sKKwkvLyBUT0RPOiAtTEE6IGlzIHJldHVybmluZyBhbiBpbnQgYmVjYXVzZSBpdCBzb21ldGltZXMgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlciB0byBjb21wYXJlIGxvb2thaGVhZCB3aXRoIGEgdG9rZW50eXBlLgorCS8vCQkgdHJ5IHRvIGNoYW5nZSBhbGwgdGhvc2Ugb2NjdXJyZW5jZXMgdG8gLUxUOiBpZiBwb3NzaWJsZSAoaS5lLiBpZiBBTlRMUiBjYW4gYmUgbWFkZSB0byBnZW5lcmF0ZSBMQSBvbmx5IGZvciBsZXhlciBjb2RlKQorICAgIHVuaWNoYXIgY2hhckxBOworCWNoYXJMQSA9IFtpbnB1dCBMQToxXTsKKwlpZiAoIGNoYXJMQSAhPSBhQ2hhcikgeworCQlpZiAoW3N0YXRlIGdldEJhY2t0cmFja2luZ10gPiAwKSB7CisJCQlzdGF0ZS5mYWlsZWQgPSBZRVM7CisJCQlyZXR1cm47CisJCX0KKwkJQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gICptdGUgPSBbQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbmV3RXhjZXB0aW9uQ2hhcjphQ2hhciBTdHJlYW06aW5wdXRdOworICAgICAgICBtdGUuYyA9IGNoYXJMQTsKKwkJW3NlbGYgcmVjb3ZlcjptdGVdOworCQlAdGhyb3cgbXRlOworCX0KKwlbaW5wdXQgY29uc3VtZV07CisJc3RhdGUuZmFpbGVkID0gTk87Cit9CisKKy0gKHZvaWQpIG1hdGNoUmFuZ2VGcm9tQ2hhcjoodW5pY2hhcilmcm9tQ2hhciB0bzoodW5pY2hhcil0b0NoYXIKK3sKKwl1bmljaGFyIGNoYXJMQSA9ICh1bmljaGFyKVtpbnB1dCBMQToxXTsKKwlpZiAoIGNoYXJMQSA8IGZyb21DaGFyIHx8IGNoYXJMQSA+IHRvQ2hhciApIHsKKwkJaWYgKFtzdGF0ZSBnZXRCYWNrdHJhY2tpbmddID4gMCkgeworCQkJc3RhdGUuZmFpbGVkID0gWUVTOworCQkJcmV0dXJuOworCQl9CisJCUFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uICAqbXJlID0gW0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uCisJCQkJCW5ld0V4Y2VwdGlvbjpOU01ha2VSYW5nZSgoTlNVSW50ZWdlcilmcm9tQ2hhciwoTlNVSW50ZWdlcil0b0NoYXIpCisJCQkJCQkJICAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgbXJlLmMgPSBjaGFyTEE7CisJCVtzZWxmIHJlY292ZXI6bXJlXTsKKwkJQHRocm93IG1yZTsKKwl9CQkKKwlbaW5wdXQgY29uc3VtZV07CisJc3RhdGUuZmFpbGVkID0gTk87Cit9CisKKwkvLyBpbmZvCisjcHJhZ21hIG1hcmsgSW5mb3JtYXRpb25hbAorCistIChOU1VJbnRlZ2VyKSBsaW5lCit7CisJcmV0dXJuIGlucHV0LmxpbmU7Cit9CisKKy0gKE5TVUludGVnZXIpIGNoYXJQb3NpdGlvbkluTGluZQoreworCXJldHVybiBpbnB1dC5jaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKKy0gKE5TSW50ZWdlcikgaW5kZXgKK3sKKyAgICByZXR1cm4gMDsKK30KKworLSAoTlNTdHJpbmcgKikgdGV4dAoreworICAgIGlmIChzdGF0ZS50ZXh0ICE9IG5pbCkgeworICAgICAgICByZXR1cm4gc3RhdGUudGV4dDsKKyAgICB9CisJcmV0dXJuIFtpbnB1dCBzdWJzdHJpbmdXaXRoUmFuZ2U6TlNNYWtlUmFuZ2Uoc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCwgaW5wdXQuaW5kZXgtc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCldOworfQorCistICh2b2lkKSBzZXRUZXh0OihOU1N0cmluZyAqKSB0aGVUZXh0Cit7CisgICAgc3RhdGUudGV4dCA9IHRoZVRleHQ7Cit9CisKKwkvLyBlcnJvciBoYW5kbGluZworLSAodm9pZCkgcmVwb3J0RXJyb3I6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCit7CisgICAgLyoqIFRPRE86IG5vdCB0aG91Z2h0IGFib3V0IHJlY292ZXJ5IGluIGxleGVyIHlldC4KKyAgICAgKgorICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yIGFuZCBoYXZlIG5vdCBtYXRjaGVkIGEgdG9rZW4KKyAgICAgLy8geWV0IHN1Y2Nlc3NmdWxseSwgZG9uJ3QgcmVwb3J0IGFueSBlcnJvcnMuCisgICAgIGlmICggZXJyb3JSZWNvdmVyeSApIHsKKyAgICAgLy9TeXN0ZW0uZXJyLnByaW50KCJbU1BVUklPVVNdICIpOworICAgICByZXR1cm47CisgICAgIH0KKyAgICAgZXJyb3JSZWNvdmVyeSA9IHRydWU7CisgICAgICovCisgICAgCisgICAgW3NlbGYgZGlzcGxheVJlY29nbml0aW9uRXJyb3I6W3NlbGYgZ2V0VG9rZW5OYW1lc10gRXhjZXB0aW9uOmVdOworfQorCistIChOU1N0cmluZyAqKWdldEVycm9yTWVzc2FnZTooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUgVG9rZW5OYW1lczooQU11dGFibGVBcnJheSAqKXRva2VuTmFtZXMKK3sKKy8qICAgIE5TU3RyaW5nICptc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIkdvdHRhIGZpeCBnZXRFcnJvck1lc3NhZ2UgaW4gQU5UTFJMZXhlci5tLS0lQFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGUubmFtZV07CisgKi8KKyAgICBOU1N0cmluZyAqbXNnID0gbmlsOworICAgIGlmICggW2UgaXNLaW5kT2ZDbGFzczpbQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gY2xhc3NdXSApIHsKKyAgICAgICAgQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gKm10ZSA9IChBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiAqKWU7CisgICAgICAgIG1zZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgXCIlQFwiIGV4cGVjdGluZyBcIiVAXCIiLAorICAgICAgICAgICAgICAgW3NlbGYgZ2V0Q2hhckVycm9yRGlzcGxheTptdGUuY10sIFtzZWxmIGdldENoYXJFcnJvckRpc3BsYXk6bXRlLmV4cGVjdGluZ11dOworICAgIH0KKyAgICBlbHNlIGlmICggW2UgaXNLaW5kT2ZDbGFzczpbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKillOworICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQsIGNhbiBhZGQgImRlY2lzaW9uPTw8IitudmFlLmdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uKyI+PiIKKyAgICAgICAgLy8gYW5kICIoZGVjaXNpb249IitudmFlLmRlY2lzaW9uTnVtYmVyKyIpIGFuZAorICAgICAgICAvLyAic3RhdGUgIitudmFlLnN0YXRlTnVtYmVyCisgICAgICAgIG1zZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGNoYXJhY3RlciBcIiVAXCIiLAorICAgICAgICAgICAgICAgW3NlbGYgZ2V0Q2hhckVycm9yRGlzcGxheToobnZhZS5jKV1dOworICAgIH0KKyAgICBlbHNlIGlmICggW2UgaXNLaW5kT2ZDbGFzczpbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gY2xhc3NdXSApIHsKKyAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9IChBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqKWU7CisgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiKGRlY2lzaW9uPSIrZWVlLmRlY2lzaW9uTnVtYmVyKyIpIgorICAgICAgICBtc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgY2hhcmFjdGVyIFwiJUBcIiIsCisgICAgICAgICAgICAgICBbc2VsZiBnZXRDaGFyRXJyb3JEaXNwbGF5OihlZWUuYyldXTsKKyAgICB9CisgICAgZWxzZSBpZiAoIFtlIGlzS2luZE9mQ2xhc3M6W0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gKm1zZSA9IChBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gKillOworICAgICAgICBtc2cgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIm1pc21hdGNoZWQgY2hhcmFjdGVyIFwiJUBcIiAgZXhwZWN0aW5nIHNldCBcIiVAXCIiLAorICAgICAgICAgICAgICAgW3NlbGYgZ2V0Q2hhckVycm9yRGlzcGxheToobXNlLmMpXSwgbXNlLmV4cGVjdGluZ107CisgICAgfQorICAgIGVsc2UgaWYgKCBbZSBpc0tpbmRPZkNsYXNzOltBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gY2xhc3NdXSApIHsKKyAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSAoQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICopZTsKKyAgICAgICAgbXNnID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJtaXNtYXRjaGVkIGNoYXJhY3RlciBcIiVAXCIgZXhwZWN0aW5nIHNldCBcIiVAXCIiLAorICAgICAgICAgICAgICAgW3NlbGYgZ2V0Q2hhckVycm9yRGlzcGxheToobXNlLmMpXSwgbXNlLmV4cGVjdGluZ107CisgICAgfQorICAgIGVsc2UgaWYgKCBbZSBpc0tpbmRPZkNsYXNzOltBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiBjbGFzc11dICkgeworICAgICAgICBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiAqbXJlID0gKEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uICopZTsKKyAgICAgICAgbXNnID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJtaXNtYXRjaGVkIGNoYXJhY3RlciBcIiVAXCIgXCIlQC4uJUBcIiIsCisgICAgICAgICAgICAgICBbc2VsZiBnZXRDaGFyRXJyb3JEaXNwbGF5OihtcmUuYyldLCBbc2VsZiBnZXRDaGFyRXJyb3JEaXNwbGF5OihtcmUucmFuZ2UubG9jYXRpb24pXSwKKyAgICAgICAgICAgICAgIFtzZWxmIGdldENoYXJFcnJvckRpc3BsYXk6KG1yZS5yYW5nZS5sb2NhdGlvbittcmUucmFuZ2UubGVuZ3RoLTEpXV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtc2cgPSBbc3VwZXIgZ2V0RXJyb3JNZXNzYWdlOmUgVG9rZW5OYW1lczpbc2VsZiBnZXRUb2tlbk5hbWVzXV07CisgICAgfQorICAgIHJldHVybiBtc2c7Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0Q2hhckVycm9yRGlzcGxheTooTlNJbnRlZ2VyKWMKK3sKKyAgICBOU1N0cmluZyAqczsKKyAgICBzd2l0Y2ggKCBjICkgeworICAgICAgICBjYXNlIEFOVExSVG9rZW5UeXBlRU9GIDoKKyAgICAgICAgICAgIHMgPSBAIjxFT0Y+IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcbicgOgorICAgICAgICAgICAgcyA9IEAiXFxuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCcgOgorICAgICAgICAgICAgcyA9IEAiXFx0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdccicgOgorICAgICAgICAgICAgcyA9IEAiXFxyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWMiLCAoY2hhciljXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyoqIExleGVycyBjYW4gbm9ybWFsbHkgbWF0Y2ggYW55IGNoYXIgaW4gaXQncyB2b2NhYnVsYXJ5IGFmdGVyIG1hdGNoaW5nCisgKiAgYSB0b2tlbiwgc28gZG8gdGhlIGVhc3kgdGhpbmcgYW5kIGp1c3Qga2lsbCBhIGNoYXJhY3RlciBhbmQgaG9wZQorICogIGl0IGFsbCB3b3JrcyBvdXQuICBZb3UgY2FuIGluc3RlYWQgdXNlIHRoZSBydWxlIGludm9jYXRpb24gc3RhY2sKKyAqICB0byBkbyBzb3BoaXN0aWNhdGVkIGVycm9yIHJlY292ZXJ5IGlmIHlvdSBhcmUgaW4gYSBmcmFnbWVudCBydWxlLgorICovCistICh2b2lkKXJlY292ZXI6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKilyZQoreworICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjb25zdW1pbmcgY2hhciAiKyhjaGFyKWlucHV0LkxBKDEpKyIgZHVyaW5nIHJlY292ZXJ5Iik7CisgICAgLy9yZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICBbaW5wdXQgY29uc3VtZV07Cit9CisKKy0gKHZvaWQpdHJhY2VJbjooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleAoreworICAgIE5TU3RyaW5nICppbnB1dFN5bWJvbCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWMgbGluZT0lZDolZFxuIiwgW2lucHV0IExUOjFdLCBpbnB1dC5saW5lLCBpbnB1dC5jaGFyUG9zaXRpb25JbkxpbmVdOworICAgIFtzdXBlciB0cmFjZUluOnJ1bGVOYW1lIEluZGV4OnJ1bGVJbmRleCBPYmplY3Q6aW5wdXRTeW1ib2xdOworfQorCistICh2b2lkKXRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4Cit7CisgICAgTlNTdHJpbmcgKmlucHV0U3ltYm9sID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlYyBsaW5lPSVkOiVkXG4iLCBbaW5wdXQgTFQ6MV0sIGlucHV0LmxpbmUsIGlucHV0LmNoYXJQb3NpdGlvbkluTGluZV07CisgICAgW3N1cGVyIHRyYWNlT3V0OnJ1bGVOYW1lIEluZGV4OnJ1bGVJbmRleCBPYmplY3Q6aW5wdXRTeW1ib2xdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiOGFiYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDQzIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKworQGludGVyZmFjZSBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlIDogTlNPYmplY3QgeworCU5TSW50ZWdlciBzdGFydDsKKwlOU0ludGVnZXIgc3RvcFRva2VuOworfQorCistIChOU0ludGVnZXIpIGdldFN0YXJ0OworLSAodm9pZCkgc2V0U3RhcnQ6IChOU0ludGVnZXIpIGFTdGFydDsKKworLSAoTlNJbnRlZ2VyKSBnZXRTdG9wOworLSAodm9pZCkgc2V0U3RvcDogKE5TSW50ZWdlcikgYVN0b3A7CisKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0U3RhcnQsIHNldHRlcj1zZXRTdGFydDopIE5TSW50ZWdlciBzdGFydDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldFN0b3Asc2V0dGVyPXNldFN0b3A6KSBOU0ludGVnZXIgc3RvcFRva2VuOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2OTM4MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubQpAQCAtMCwwICsxLDYyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlCisKK0BzeW50aGVzaXplIHN0YXJ0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgc3RhcnQgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChOU0ludGVnZXIpIGdldFN0YXJ0Cit7CisgICAgcmV0dXJuIHN0YXJ0OworfQorCistICh2b2lkKSBzZXRTdGFydDogKE5TSW50ZWdlcikgYVN0YXJ0Cit7CisgICAgc3RhcnQgPSBhU3RhcnQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBzdG9wIAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLSAoTlNJbnRlZ2VyKSBnZXRTdG9wCit7CisgICAgcmV0dXJuIHN0b3BUb2tlbjsKK30KKworLSAodm9pZCkgc2V0U3RvcDogKE5TSW50ZWdlcikgYVN0b3AKK3sKKyAgICBzdG9wVG9rZW4gPSBhU3RvcDsKK30KKworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJTdGF0ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMZXhlclN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMmE0OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJTdGF0ZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oIgorCitAaW50ZXJmYWNlIEFOVExSTGV4ZXJTdGF0ZSA6IEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIHsKK30KKworLSAodm9pZCkgcmVzZXQ7CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjsKKy0gKHZvaWQpIHNldFRva2VuOihpZDxBTlRMUlRva2VuPikgdGhlVG9rZW47CisKKy0gKE5TVUludGVnZXIpIGdldFRva2VuVHlwZTsKKy0gKHZvaWQpIHNldFRva2VuVHlwZToodW5zaWduZWQgaW50KSB0aGVUb2tlblR5cGU7CisKKy0gKE5TVUludGVnZXIpIGNoYW5uZWw7CistICh2b2lkKSBzZXRDaGFubmVsOih1bnNpZ25lZCBpbnQpIHRoZUNoYW5uZWw7CisKKy0gKE5TVUludGVnZXIpIGdldFRva2VuU3RhcnRMaW5lOworLSAodm9pZCkgc2V0VG9rZW5TdGFydExpbmU6KHVuc2lnbmVkIGludCkgdGhlVG9rZW5TdGFydExpbmU7CisKKy0gKE5TVUludGVnZXIpIGdldFRva2VuQ2hhclBvc2l0aW9uSW5MaW5lOworLSAodm9pZCkgc2V0VG9rZW5DaGFyUG9zaXRpb25JbkxpbmU6KHVuc2lnbmVkIGludCkgdGhlQ2hhclBvc2l0aW9uOworCistIChOU0ludGVnZXIpIGdldFRva2VuU3RhcnRDaGFySW5kZXg7CistICh2b2lkKSBzZXRUb2tlblN0YXJ0Q2hhckluZGV4OihpbnQpIHRoZVRva2VuU3RhcnRDaGFySW5kZXg7CisKKy0gKE5TU3RyaW5nICopIHRleHQ7CistICh2b2lkKSBzZXRUZXh0OihOU1N0cmluZyAqKSB0aGVUZXh0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyU3RhdGUubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGV4ZXJTdGF0ZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Mjg0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxleGVyU3RhdGUubQpAQCAtMCwwICsxLDEzOSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJMZXhlclN0YXRlLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSTGV4ZXJTdGF0ZQorCistIChpZCkgaW5pdAoreworCXNlbGYgPSBbc3VwZXIgaW5pdF07CisJaWYgKHNlbGYpIHsKKwkJW3NlbGYgcmVzZXRdOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgcmVzZXQKK3sKKwlbc2VsZiBzZXRUb2tlbjpuaWxdOworCXR5cGUgPSAwOwkJCQkKKwljaGFubmVsID0gMDsJCQkJCisJdG9rZW5TdGFydExpbmUgPSAwOwkJCisJdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IDA7CisJdG9rZW5TdGFydENoYXJJbmRleCA9IC0xOyAgICAKKwlbc2VsZiBzZXRUZXh0Om5pbF07Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJMZXhlclN0YXRlIiApOworI2VuZGlmCisJW3NlbGYgc2V0VGV4dDpuaWxdOworCVtzZWxmIHNldFRva2VuOm5pbF07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZDxBTlRMUlRva2VuPikgZ2V0VG9rZW4KK3sKKwlyZXR1cm4gdG9rZW47Cit9CisKKy0gKHZvaWQpIHNldFRva2VuOihpZDxBTlRMUlRva2VuPikgdGhlVG9rZW4KK3sKKwlpZiAodGhlVG9rZW4gIT0gdG9rZW4pIHsKKwkJaWYgKCB0b2tlbiApIFt0b2tlbiByZWxlYXNlXTsKKwkJdG9rZW4gPSBbdGhlVG9rZW4gcmV0YWluXTsKKwl9Cit9CisKKworLSAoTlNVSW50ZWdlcikgZ2V0VG9rZW5UeXBlCit7CisJcmV0dXJuIHR5cGU7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuVHlwZTooTlNVSW50ZWdlcikgdGhlVG9rZW5UeXBlCit7CisJdHlwZSA9IHRoZVRva2VuVHlwZTsKK30KKworLSAoTlNVSW50ZWdlciljaGFubmVsCit7CisJcmV0dXJuIGNoYW5uZWw7Cit9CisKKy0gKHZvaWQpIHNldENoYW5uZWw6KE5TVUludGVnZXIpIHRoZUNoYW5uZWwKK3sKKwljaGFubmVsID0gdGhlQ2hhbm5lbDsKK30KKworLSAoTlNVSW50ZWdlcikgZ2V0VG9rZW5TdGFydExpbmUKK3sKKwlyZXR1cm4gdG9rZW5TdGFydExpbmU7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRMaW5lOihOU1VJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0TGluZQoreworCXRva2VuU3RhcnRMaW5lID0gdGhlVG9rZW5TdGFydExpbmU7Cit9CisKKy0gKHVuc2lnbmVkIGludCkgZ2V0VG9rZW5DaGFyUG9zaXRpb25JbkxpbmUKK3sKKwlyZXR1cm4gdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKK30KKworLSAodm9pZCkgc2V0VG9rZW5DaGFyUG9zaXRpb25JbkxpbmU6KHVuc2lnbmVkIGludCkgdGhlQ2hhclBvc2l0aW9uCit7CisJdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IHRoZUNoYXJQb3NpdGlvbjsKK30KKworLSAoaW50KSBnZXRUb2tlblN0YXJ0Q2hhckluZGV4Cit7CisJcmV0dXJuIHRva2VuU3RhcnRDaGFySW5kZXg7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRDaGFySW5kZXg6KGludCkgdGhlVG9rZW5TdGFydENoYXJJbmRleAoreworCXRva2VuU3RhcnRDaGFySW5kZXggPSB0aGVUb2tlblN0YXJ0Q2hhckluZGV4OworfQorCistIChOU1N0cmluZyAqKSB0ZXh0Cit7CisJcmV0dXJuIHRleHQ7Cit9CisKKy0gKHZvaWQpIHNldFRleHQ6KE5TU3RyaW5nICopIHRoZVRleHQKK3sKKwlpZiAodGV4dCAhPSB0aGVUZXh0KSB7CisJCWlmICggdGV4dCApIFt0ZXh0IHJlbGVhc2VdOworCQl0ZXh0ID0gW3RoZVRleHQgcmV0YWluXTsKKwl9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGlua0Jhc2UuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGlua0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGMzMzdlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMaW5rQmFzZS5oCkBAIC0wLDAgKzEsODAgQEAKKy8vCisvLyAgQU5UTFJMaW5rQmFzZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE0LzEwLgorLy8gIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vICBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKKyNpZm5kZWYgREVCVUdfREVBTExPQworI2RlZmluZSBERUJVR19ERUFMTE9DCisjZW5kaWYKKworQHByb3RvY29sIEFOVExSTGlua0xpc3QgPE5TT2JqZWN0PgorCisrIChpZDxBTlRMUkxpbmtMaXN0PiluZXdBTlRMUkxpbmtCYXNlOworKyAoaWQ8QU5UTFJMaW5rTGlzdD4pbmV3QU5UTFJMaW5rQmFzZTooaWQ8QU5UTFJMaW5rTGlzdD4pbnAgUHJldjooaWQ8QU5UTFJMaW5rTGlzdD4pcHA7CisKKy0gKHZvaWQpIGRlYWxsb2M7CisKKy0gKGlkPEFOVExSTGlua0xpc3Q+KSBhcHBlbmQ6KGlkPEFOVExSTGlua0xpc3Q+KW5vZGU7CistIChpZDxBTlRMUkxpbmtMaXN0PikgaW5zZXJ0OihpZDxBTlRMUkxpbmtMaXN0Pilub2RlOworCistIChpZDxBTlRMUkxpbmtMaXN0PikgZ2V0Zk5leHQ7CistICh2b2lkKSBzZXRGTmV4dDooaWQ8QU5UTFJMaW5rTGlzdD4pbnA7CistIChpZDxBTlRMUkxpbmtMaXN0PilnZXRmUHJldjsKKy0gKHZvaWQpIHNldEZQcmV2OihpZDxBTlRMUkxpbmtMaXN0PilwcDsKKworQHByb3BlcnR5IChyZXRhaW4pIGlkPEFOVExSTGlua0xpc3Q+IGZQcmV2OworQHByb3BlcnR5IChyZXRhaW4pIGlkPEFOVExSTGlua0xpc3Q+IGZOZXh0OworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSTGlua0Jhc2UgOiBOU09iamVjdCA8QU5UTFJMaW5rTGlzdD4geworCWlkPEFOVExSTGlua0xpc3Q+IGZQcmV2OworCWlkPEFOVExSTGlua0xpc3Q+IGZOZXh0OworfQorCitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJMaW5rTGlzdD4gZlByZXY7CitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJMaW5rTGlzdD4gZk5leHQ7CisKKysgKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2U7CisrIChpZDxBTlRMUkxpbmtMaXN0PiluZXdBTlRMUkxpbmtCYXNlOihpZDxBTlRMUkxpbmtMaXN0PilucCBQcmV2OihpZDxBTlRMUkxpbmtMaXN0PilwcDsKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWluaXQ7CistIChpZDxBTlRMUkxpbmtMaXN0Pilpbml0V2l0aFB0cjooaWQpbnAgUHJldjooaWQpcHA7CistICh2b2lkKWRlYWxsb2M7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCistIChpZDxBTlRMUkxpbmtMaXN0PilhcHBlbmQ6KGlkPEFOVExSTGlua0xpc3Q+KW5vZGU7CistIChpZDxBTlRMUkxpbmtMaXN0PilpbnNlcnQ6KGlkPEFOVExSTGlua0xpc3Q+KW5vZGU7CisKKy0gKGlkPEFOVExSTGlua0xpc3Q+KWdldGZOZXh0OworLSAodm9pZClzZXRmTmV4dDooaWQ8QU5UTFJMaW5rTGlzdD4pIG5wOworLSAoaWQ8QU5UTFJMaW5rTGlzdD4pZ2V0ZlByZXY7CistICh2b2lkKXNldGZQcmV2OihpZDxBTlRMUkxpbmtMaXN0PikgcHA7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxpbmtCYXNlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxpbmtCYXNlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1Mjk5MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTGlua0Jhc2UubQpAQCAtMCwwICsxLDEyNyBAQAorLy8KKy8vICBBTlRMUkxpbmtCYXNlLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTQvMTAuCisvLyAgW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJMaW5rQmFzZQorCitAc3ludGhlc2l6ZSBmUHJldjsKK0BzeW50aGVzaXplIGZOZXh0OworCisrKGlkPEFOVExSTGlua0xpc3Q+KW5ld0FOVExSTGlua0Jhc2UKK3sKKwlyZXR1cm4gW1tBTlRMUkxpbmtCYXNlIGFsbG9jXSBpbml0XTsKK30KKworKyhpZDxBTlRMUkxpbmtMaXN0PiluZXdBTlRMUkxpbmtCYXNlOihpZDxBTlRMUkxpbmtMaXN0PilucCBQcmV2OihpZDxBTlRMUkxpbmtMaXN0PilwcAoreworCXJldHVybiBbW0FOVExSTGlua0Jhc2UgYWxsb2NdIGluaXRXaXRoUHRyOm5wIFByZXY6cHBdOworfQorCistKGlkPEFOVExSTGlua0xpc3Q+KWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKwkJZlByZXYgPSBuaWw7CisJfQorCXJldHVybihzZWxmKTsKK30KKworLShpZDxBTlRMUkxpbmtMaXN0Pilpbml0V2l0aFB0cjooaWQ8QU5UTFJMaW5rTGlzdD4pbnAgUHJldjooaWQ8QU5UTFJMaW5rTGlzdD4pcHAKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5wOworCQlmUHJldiA9IHBwOworCX0KKwlyZXR1cm4oc2VsZik7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSTGlua0Jhc2UiICk7CisjZW5kaWYKKwlpZiAoZk5leHQpIFtmTmV4dCBkZWFsbG9jXTsKKwlpZiAoZlByZXYpIFtmUHJldiBkZWFsbG9jXTsKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJMaW5rQmFzZSAqY29weTsKKyAgICAKKyAgICBjb3B5ID0gW1tzZWxmIGNsYXNzXSBhbGxvY1dpdGhab25lOmFab25lXTsKKyAgICBjb3B5LmZQcmV2ID0gZlByZXY7CisgICAgY29weS5mTmV4dCA9IGZOZXh0OworICAgIHJldHVybiggY29weSApOworfQorCistKGlkPEFOVExSTGlua0xpc3Q+KWFwcGVuZDooaWQ8QU5UTFJMaW5rTGlzdD4pbm9kZQoreworCW5vZGUuZlByZXYgPSAoaWQ8QU5UTFJMaW5rTGlzdD4pc2VsZjsKKwlub2RlLmZOZXh0ID0gKGlkPEFOVExSTGlua0xpc3Q+KXNlbGYuZk5leHQ7CisJaWYgKG5vZGUuZk5leHQgIT0gbmlsKQorICAgICAgICBub2RlLmZOZXh0LmZQcmV2ID0gbm9kZTsKKyAgICBzZWxmLmZOZXh0ID0gbm9kZTsKKyAgICByZXR1cm4oIG5vZGUgKTsKK30KKworLShpZDxBTlRMUkxpbmtMaXN0PilpbnNlcnQ6KGlkPEFOVExSTGlua0xpc3Q+KW5vZGUKK3sKKwlub2RlLmZOZXh0ID0gc2VsZjsKKwlub2RlLmZQcmV2ID0gc2VsZi5mUHJldjsKKyAgICBpZiAobm9kZS5mUHJldiAhPSBuaWwpIAorICAgICAgICBub2RlLmZQcmV2LmZOZXh0ID0gbm9kZTsKKwlzZWxmLmZQcmV2ID0gbm9kZTsKKwlyZXR1cm4oIG5vZGUgKTsKK30KKworLShpZDxBTlRMUkxpbmtMaXN0PilnZXRmTmV4dAoreworCXJldHVybihmTmV4dCk7Cit9CisKKy0odm9pZClzZXRmTmV4dDooaWQ8QU5UTFJMaW5rTGlzdD4pbnAKK3sKKwlmTmV4dCA9IG5wOworfQorCistKGlkPEFOVExSTGlua0xpc3Q+KWdldGZQcmV2Cit7CisJcmV0dXJuKGZQcmV2KTsKK30KKworLSh2b2lkKXNldGZQcmV2OihpZDxBTlRMUkxpbmtMaXN0PilwcAoreworCWZQcmV2ID0gcHA7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTG9va2FoZWFkU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxvb2thaGVhZFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzEyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUkxvb2thaGVhZFN0cmVhbS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vCisvLyAgQU5UTFJMb29rYWhlYWRTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vICBbVGhlICJCU0QgbGljZW5jZSJdCisvLyAgQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkZhc3RRdWV1ZS5oIgorCisjZGVmaW5lIFVOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYIE5TSW50ZWdlck1heAorCitAaW50ZXJmYWNlIEFOVExSTG9va2FoZWFkU3RyZWFtIDogQU5UTFJGYXN0UXVldWUKK3sKKyAgICBOU0ludGVnZXIgaW5kZXg7CisJTlNJbnRlZ2VyIGVvZkVsZW1lbnRJbmRleDsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworCWlkIHByZXZFbGVtZW50OworCWlkIGVvZjsKK30KKworQHByb3BlcnR5IChyZWFkd3JpdGUsIHJldGFpbiwgZ2V0dGVyPWdldEVvZiwgc2V0dGVyPXNldEVvZjopIGlkIGVvZjsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEVvZkVsZW1lbnRJbmRleCwgc2V0dGVyPXNldEVvZkVsZW1lbnRJbmRleDopIE5TSW50ZWdlciBlb2ZFbGVtZW50SW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldExhc3RNYXJrZXIsIHNldHRlcj1zZXRMYXN0TWFya2VyOikgTlNJbnRlZ2VyIGxhc3RNYXJrZXI7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldE1hcmtEZXB0aCwgc2V0dGVyPXNldE1hcmtEZXB0aDopIE5TSW50ZWdlciBtYXJrRGVwdGg7CitAcHJvcGVydHkgKHJldGFpbikgaWQgcHJldkVsZW1lbnQ7CisKKy0gKGlkKSBpbml0V2l0aEVPRjooaWQpIG9iajsKKy0gKGlkKSBuZXh0RWxlbWVudDsKKy0gKGlkKSByZW1vdmU7CistICh2b2lkKSBjb25zdW1lOworLSAodm9pZCkgc3luYzooTlNJbnRlZ2VyKSBuZWVkOworLSAodm9pZCkgZmlsbDooTlNJbnRlZ2VyKSBuOworLSAoaWQpIExUOihOU0ludGVnZXIpIGk7CistIChpZCkgTEI6KE5TSW50ZWdlcikgaTsKKy0gKGlkKSBnZXRDdXJyZW50U3ltYm9sOworLSAoTlNJbnRlZ2VyKSBtYXJrOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgc2VlazooTlNJbnRlZ2VyKSBpOworLSAoaWQpIGdldEVvZjsKKy0gKHZvaWQpIHNldEVvZjooaWQpIGFuSUQ7CistIChOU0ludGVnZXIpIGdldEVvZkVsZW1lbnRJbmRleDsKKy0gKHZvaWQpIHNldEVvZkVsZW1lbnRJbmRleDooTlNJbnRlZ2VyKSBhbkludDsKKy0gKE5TSW50ZWdlcikgZ2V0TGFzdE1hcmtlcjsKKy0gKHZvaWQpIHNldExhc3RNYXJrZXI6KE5TSW50ZWdlcikgYW5JbnQ7CistIChOU0ludGVnZXIpIGdldE1hcmtEZXB0aDsKKy0gKHZvaWQpIHNldE1hcmtEZXB0aDooTlNJbnRlZ2VyKSBhbkludDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJMb29rYWhlYWRTdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTG9va2FoZWFkU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlNDg5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTG9va2FoZWFkU3RyZWFtLm0KQEAgLTAsMCArMSwyMjkgQEAKKy8vCisvLyAgQU5UTFJMb29rYWhlYWRTdHJlYW0ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSTG9va2FoZWFkU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkVycm9yLmgiCisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSTG9va2FoZWFkU3RyZWFtCisKK0BzeW50aGVzaXplIGVvZjsKK0BzeW50aGVzaXplIGluZGV4OworQHN5bnRoZXNpemUgZW9mRWxlbWVudEluZGV4OworQHN5bnRoZXNpemUgbGFzdE1hcmtlcjsKK0BzeW50aGVzaXplIG1hcmtEZXB0aDsKK0BzeW50aGVzaXplIHByZXZFbGVtZW50OworCistKGlkKSBpbml0Cit7CisJc2VsZiA9IFtzdXBlciBpbml0XTsKKwlpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBlb2YgPSBbW0FOVExSQ29tbW9uVG9rZW4gZW9mVG9rZW5dIHJldGFpbl07CisJCWVvZkVsZW1lbnRJbmRleCA9IFVOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYOworCQltYXJrRGVwdGggPSAwOworICAgICAgICBpbmRleCA9IDA7CisJfQorCXJldHVybiBzZWxmOworfQorCistKGlkKSBpbml0V2l0aEVPRjooaWQpb2JqCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJc2VsZi5lb2YgPSBvYmo7CisgICAgICAgIGlmICggc2VsZi5lb2YgKSBbc2VsZi5lb2YgcmV0YWluXTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIHJlc2V0Cit7CisJW3N1cGVyIHJlc2V0XTsKKyAgICBpbmRleCA9IDA7CisgICAgcCA9IDA7CisgICAgcHJldkVsZW1lbnQgPSBuaWw7CisJZW9mRWxlbWVudEluZGV4ID0gVU5JVElBTElaRURfRU9GX0VMRU1FTlRfSU5ERVg7Cit9CisKKy0oaWQpIG5leHRFbGVtZW50Cit7CisvLwlbc2VsZiBkb2VzTm90UmVjb2duaXplU2VsZWN0b3I6X2NtZF07CisJcmV0dXJuIG5pbDsKK30KKworLSAoaWQpIHJlbW92ZQoreworICAgIGlkIG9iaiA9IFtzZWxmIG9iamVjdEF0SW5kZXg6MF07CisgICAgcCsrOworICAgIC8vIGhhdmUgd2UgaGl0IGVuZCBvZiBidWZmZXIgYW5kIG5vdCBiYWNrdHJhY2tpbmc/CisgICAgaWYgKCBwID09IFtkYXRhIGNvdW50XSAmJiBtYXJrRGVwdGg9PTAgKSB7CisgICAgICAgIC8vIGlmIHNvLCBpdCdzIGFuIG9wcG9ydHVuaXR5IHRvIHN0YXJ0IGZpbGxpbmcgYXQgaW5kZXggMCBhZ2FpbgorICAgICAgICBbc2VsZiBjbGVhcl07IC8vIHNpemUgZ29lcyB0byAwLCBidXQgcmV0YWlucyBtZW1vcnkKKyAgICB9CisgICAgW29iaiByZWxlYXNlXTsKKyAgICByZXR1cm4gb2JqOworfQorCistKHZvaWQpIGNvbnN1bWUKK3sKKwlbc2VsZiBzeW5jOjFdOworCXByZXZFbGVtZW50ID0gW3NlbGYgcmVtb3ZlXTsKKyAgICBpbmRleCsrOworfQorCistKHZvaWQpIHN5bmM6KE5TSW50ZWdlcikgbmVlZAoreworCU5TSW50ZWdlciBuID0gKHAgKyBuZWVkIC0gMSkgLSBbZGF0YSBjb3VudF0gKyAxOworCWlmICggbiA+IDAgKSB7CisJCVtzZWxmIGZpbGw6bl07CisJfQorfQorCistKHZvaWQpIGZpbGw6KE5TSW50ZWdlcikgbgoreworICAgIGlkIG9iajsKKwlmb3IgKE5TSW50ZWdlciBpID0gMTsgaSA8PSBuOyBpKyspIHsKKwkJb2JqID0gW3NlbGYgbmV4dEVsZW1lbnRdOworCQlpZiAoIG9iaiA9PSBlb2YgKSB7CisJCQlbZGF0YSBhZGRPYmplY3Q6c2VsZi5lb2ZdOworCQkJZW9mRWxlbWVudEluZGV4ID0gW2RhdGEgY291bnRdIC0gMTsKKwkJfQorCQllbHNlIHsKKwkJCVtkYXRhIGFkZE9iamVjdDpvYmpdOworCQl9CisJfQorfQorCistKE5TVUludGVnZXIpIGNvdW50Cit7CisJQHRocm93IFtOU0V4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTpAIkFOVExSVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iIHJlYXNvbjpAIlN0cmVhbXMgaGF2ZSBubyBkZWZpbmVkIHNpemUiIHVzZXJJbmZvOm5pbF07Cit9CisKKy0oaWQpIExUOihOU0ludGVnZXIpIGsKK3sKKwlpZiAoayA9PSAwKSB7CisJCXJldHVybiBuaWw7CisJfQorCWlmIChrIDwgMCkgeworCQlyZXR1cm4gW3NlbGYgTEI6LWtdOworCX0KKwlpZiAoKHAgKyBrIC0gMSkgPj0gZW9mRWxlbWVudEluZGV4KSB7CisJCXJldHVybiBzZWxmLmVvZjsKKwl9CisJW3NlbGYgc3luYzprXTsKKwlyZXR1cm4gW3NlbGYgb2JqZWN0QXRJbmRleDooayAtIDEpXTsKK30KKworLShpZCkgTEI6KE5TSW50ZWdlcikgaworeworCWlmIChrID09IDEpIHsKKwkJcmV0dXJuIHByZXZFbGVtZW50OworCX0KKwlAdGhyb3cgW0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJjYW4ndCBsb29rIGJhY2t3YXJkcyBtb3JlIHRoYW4gb25lIHRva2VuIGluIHRoaXMgc3RyZWFtIl07Cit9CisKKy0oaWQpIGdldEN1cnJlbnRTeW1ib2wKK3sKKwlyZXR1cm4gW3NlbGYgTFQ6MV07Cit9CisKKy0oTlNJbnRlZ2VyKSBtYXJrCit7CisJbWFya0RlcHRoKys7CisJbGFzdE1hcmtlciA9IHA7CisJcmV0dXJuIGxhc3RNYXJrZXI7Cit9CisKKy0odm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXIKK3sKKwkvLyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorfQorCistKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKSBtYXJrZXIKK3sKKwltYXJrRGVwdGgtLTsKKwlbc2VsZiBzZWVrOm1hcmtlcl07CisvLyAgICBpZiAobWFya2VyID09IDApIFtzZWxmIHJlc2V0XTsKK30KKworLSh2b2lkKSByZXdpbmQKK3sKKwlbc2VsZiBzZWVrOmxhc3RNYXJrZXJdOworLy8gICAgaWYgKGxhc3RNYXJrZXIgPT0gMCkgW3NlbGYgcmVzZXRdOworfQorCistKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgYW5JbmRleAoreworCXAgPSBhbkluZGV4OworfQorCistIChpZCkgZ2V0RW9mCit7CisgICAgcmV0dXJuIGVvZjsKK30KKworLSAodm9pZCkgc2V0RW9mOihpZCkgYW5JRAoreworICAgIGVvZiA9IGFuSUQ7Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0RW9mRWxlbWVudEluZGV4Cit7CisgICAgcmV0dXJuIGVvZkVsZW1lbnRJbmRleDsKK30KKworLSAodm9pZCkgc2V0RW9mRWxlbWVudEluZGV4OihOU0ludGVnZXIpIGFuSW50Cit7CisgICAgZW9mRWxlbWVudEluZGV4ID0gYW5JbnQ7Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0TGFzdE1hcmtlcgoreworICAgIHJldHVybiBsYXN0TWFya2VyOworfQorCistICh2b2lkKSBzZXRMYXN0TWFya2VyOihOU0ludGVnZXIpIGFuSW50Cit7CisgICAgbGFzdE1hcmtlciA9IGFuSW50OworfQorCistIChOU0ludGVnZXIpIGdldE1hcmtEZXB0aGxhc3RNYXJrZXIKK3sKKyAgICByZXR1cm4gbWFya0RlcHRoOworfQorCistICh2b2lkKSBzZXRNYXJrRGVwdGg6KE5TSW50ZWdlcikgYW5JbnQKK3sKKyAgICBtYXJrRGVwdGggPSBhbkludDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNYXAuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWFwLmgKQEAgLTAsMCArMSw4MiBAQAorLy8KKy8vICBBTlRMUk1hcC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUHRyQnVmZmVyLmgiCisjaW1wb3J0ICJBTlRMUk1hcEVsZW1lbnQuaCIKKworLy8jZGVmaW5lIEdMT0JBTF9TQ09QRSAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJNYXAgOiBBTlRMUlB0ckJ1ZmZlciB7CisJLy9BTlRMUk1hcCAqZk5leHQ7IC8vIGZvdW5kIGluIHN1cGVyY2xhc3MKKyAgICAvLyBUU3RyaW5nUG9vbCAqZlBvb2w7CisgICAgTlNJbnRlZ2VyIGxhc3RIYXNoOworfQorCisvL0Bwcm9wZXJ0eSAoY29weSkgQU5UTFJNYXAgKmZOZXh0OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0TGFzdEhhc2gsIHNldHRlcj1zZXRMYXN0SGFzaDopIE5TSW50ZWdlciBsYXN0SGFzaDsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysgKGlkKW5ld0FOVExSTWFwOworKyAoaWQpbmV3QU5UTFJNYXBXaXRoTGVuOihOU0ludGVnZXIpYUhhc2hTaXplOworCistIChpZClpbml0OworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQ7CistICh2b2lkKWRlYWxsb2M7CisvLyBJbnN0YW5jZSBNZXRob2RzCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpbGVuZ3RoOworLSAoTlNJbnRlZ2VyKXNpemU7CisvKiBjbGVhciAtLSByZWluaXRpYWxpemUgdGhlIG1hcGxpc3QgYXJyYXkgKi8KKy0gKHZvaWQpIGNsZWFyOworLyogZm9ybSBoYXNoIHZhbHVlIGZvciBzdHJpbmcgcyAqLworLShOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0oaWQpbG9va3VwOihOU1N0cmluZyAqKXM7CisvKiBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0oaWQpaW5zdGFsbDooQU5UTFJNYXBFbGVtZW50ICopc3ltOworLyoKKyAqIGRlbGV0ZSBlbnRyeSBmcm9tIGxpc3QKKyAqLworLSAodm9pZClkZWxldGVBTlRMUk1hcDooQU5UTFJNYXBFbGVtZW50ICopbnA7CistIChOU0ludGVnZXIpUmVtb3ZlU3ltOihOU1N0cmluZyAqKXM7CistICh2b2lkKWRlbGV0ZV9jaGFpbjooQU5UTFJNYXBFbGVtZW50ICopbnA7CistIChBTlRMUk1hcEVsZW1lbnQgKilnZXRUVHlwZTooTlNTdHJpbmcgKiluYW1lOworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0TmFtZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoTlNJbnRlZ2VyKWdldE5vZGU6KEFOVExSTWFwRWxlbWVudCAqKWFOb2RlOworLSAodm9pZClwdXROb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlOworLSAodm9pZClwdXROYW1lOihOU1N0cmluZyAqKW5hbWUgVFR5cGU6KE5TSW50ZWdlcil0dHlwZTsKKy0gKHZvaWQpcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIE5vZGU6KGlkKWFOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1hcC5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNYXAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmZiMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNYXAubQpAQCAtMCwwICsxLDM2MiBAQAorLy8KKy8vICBBTlRMUk1hcC5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJNYXAuaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSTWFwCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUk1hcAorCitAc3ludGhlc2l6ZSBsYXN0SGFzaDsKKworKyhpZCluZXdBTlRMUk1hcAoreworICAgIHJldHVybiBbW0FOVExSTWFwIGFsbG9jXSBpbml0XTsKK30KKworKyhpZCluZXdBTlRMUk1hcFdpdGhMZW46KE5TSW50ZWdlcilhQnVmZlNpemUKK3sKKyAgICByZXR1cm4gW1tBTlRMUk1hcCBhbGxvY10gaW5pdFdpdGhMZW46YUJ1ZmZTaXplXTsKK30KKworLShpZClpbml0Cit7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKwlzZWxmID0gW3N1cGVyIGluaXRXaXRoTGVuOkhBU0hTSVpFXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworCQlmTmV4dCA9IG5pbDsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBIQVNIU0laRTsgaWR4KysgKSB7CisgICAgICAgICAgICBwdHJCdWZmZXJbaWR4XSA9IG5pbDsKKyAgICAgICAgfQorCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZQoreworCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46YUJ1ZmZTaXplXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLSh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJNTWFwIiApOworI2VuZGlmCisgICAgQU5UTFJNYXBFbGVtZW50ICp0bXAsICpydG1wOworICAgIE5TSW50ZWdlciBpZHg7CisJCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKEFOVExSTWFwRWxlbWVudCAqKXRtcC5mTmV4dDsKKyAgICAgICAgICAgICAgICBbcnRtcCByZWxlYXNlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0odm9pZClkZWxldGVBTlRMUk1hcDooQU5UTFJNYXBFbGVtZW50ICopbnAKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKnRtcCwgKnJ0bXA7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKyAgICBpZiAoIHNlbGYuZk5leHQgIT0gbmlsICkgeworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgIHRtcCA9IHB0ckJ1ZmZlcltpZHhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgICAgICBbcnRtcCByZWxlYXNlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLSAodm9pZCljbGVhcgoreworICAgIEFOVExSTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworCisgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgIHRtcCA9IHB0ckJ1ZmZlcltpZHhdOworICAgICAgICB3aGlsZSAoIHRtcCApIHsKKyAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICB0bXAgPSBbdG1wIGdldGZOZXh0XTsKKyAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICB9CisgICAgICAgIHB0ckJ1ZmZlcltpZHhdID0gbmlsOworICAgIH0KK30KKworLSAoTlNJbnRlZ2VyKWNvdW50Cit7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAocHRyQnVmZmVyW2ldICE9IG5pbCkgeworICAgICAgICAgICAgYUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhQ250OworfQorCistIChOU0ludGVnZXIpbGVuZ3RoCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistIChOU0ludGVnZXIpc2l6ZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhU2l6ZSA9IDA7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICgoYW5FbGVtZW50ID0gcHRyQnVmZmVyW2ldKSAhPSBuaWwpIHsKKyAgICAgICAgICAgIGFTaXplICs9IChOU0ludGVnZXIpW2FuRWxlbWVudCBzaXplXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYVNpemU7Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSEFTSCAgICAgICAgaGFzaCBlbnRyeSB0byBnZXQgaW5kZXggdG8gdGFibGUKKyAqICBOU0ludGVnZXIgaGFzaCggQU5UTFJNYXAgKnNlbGYsIGNoYXIgKnMgKTsKKyAqCisgKiAgICAgSW5wdXRzOiAgTlNTdHJpbmcgKnMgICAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBOU0ludGVnZXIgICAgICAgICAgICAgICAgIGhhc2hlZCB2YWx1ZQorICoKKyAqICBMYXN0IFJldmlzaW9uIDkvMDMvOTAKKyAqLworI2VuZGlmCistKE5TSW50ZWdlciloYXNoOihOU1N0cmluZyAqKXMgICAgICAgLyogICAgZm9ybSBoYXNoIHZhbHVlIGZvciBzdHJpbmcgcyAqLworeworCU5TSW50ZWdlciBoYXNodmFsOworCWNvbnN0IGNoYXIgKnRtcDsKKyAgICAKKwl0bXAgPSBbcyBjU3RyaW5nVXNpbmdFbmNvZGluZzpOU0FTQ0lJU3RyaW5nRW5jb2RpbmddOworCWZvciggaGFzaHZhbCA9IDA7ICp0bXAgIT0gJ1wwJzsgKQorICAgICAgICBoYXNodmFsICs9ICp0bXArKzsKKwlzZWxmLT5sYXN0SGFzaCA9IGhhc2h2YWwgJSBIQVNIU0laRTsKKwlyZXR1cm4oIHNlbGYtPmxhc3RIYXNoICk7Cit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIExPT0tVUCAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIEFOVExSTWFwRWxlbWVudCAqbG9va3VwOihOU1N0cmluZyAqKXM7CisgKgorICogICAgIElucHV0czogIE5TU3RyaW5nICAqcyAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBBTlRMUk1hcEVsZW1lbnQgICogICAgICAgIHBvaW50ZXIgdG8gZW50cnkKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShpZClsb29rdXA6KE5TU3RyaW5nICopcworeworICAgIEFOVExSTWFwRWxlbWVudCAqbnA7CisgICAgCisgICAgZm9yKCBucCA9IHNlbGYtPnB0ckJ1ZmZlcltbc2VsZiBoYXNoOnNdXTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICByZXR1cm4oIG5wICk7ICAgICAgICAvKiAgIGZvdW5kIGl0ICAgICAgICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKCBuaWwgKTsgICAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSU5TVEFMTCBzZWFyY2ggaGFzaGVkIGxpc3QgZm9yIGVudHJ5CisgKiAgTlNJbnRlZ2VyIGluc3RhbGwoIEFOVExSTWFwICpzZWxmLCBBTlRMUk1hcEVsZW1lbnQgKnN5bSApOworICoKKyAqICAgICBJbnB1dHM6ICBBTlRMUk1hcEVsZW1lbnQgICAgKnN5bSAgIC0tIHN5bWJvbCBwdHIgdG8gaW5zdGFsbAorICogICAgICAgICAgICAgIE5TSW50ZWdlciAgICAgICAgIHNjb3BlIC0tIGxldmVsIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogQm9vbGVhbiAgICAgVFJVRSAgIGlmIGluc3RhbGxlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICBpZiBhbHJlYWR5IGluIHRhYmxlCisgKgorICogIExhc3QgUmV2aXNpb24gOS8wMy85MAorICovCisjZW5kaWYKKy0oQU5UTFJNYXBFbGVtZW50ICopaW5zdGFsbDooQU5UTFJNYXBFbGVtZW50ICopc3ltCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBucCA9IFtzZWxmIGxvb2t1cDpbc3ltIGdldE5hbWVdXTsKKyAgICBpZiAoIG5wID09IG5pbCApIHsKKyAgICAgICAgW3N5bSBzZXRGTmV4dDpwdHJCdWZmZXJbIGxhc3RIYXNoIF1dOworICAgICAgICBwdHJCdWZmZXJbIGxhc3RIYXNoIF0gPSBzeW07CisgICAgICAgIFtzeW0gcmV0YWluXTsKKyAgICAgICAgcmV0dXJuKCBwdHJCdWZmZXJbIGxhc3RIYXNoIF0gKTsKKyAgICB9CisgICAgcmV0dXJuKCBuaWwgKTsgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIFJlbW92ZVN5bSAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIE5TSW50ZWdlciBSZW1vdmVTeW0oIEFOVExSTWFwICpzZWxmLCBjaGFyICpzICk7CisgKgorICogICAgIElucHV0czogIGNoYXIgICAgICpzICAgICAgICAgIHN0cmluZyB0byBmaW5kCisgKgorICogICAgIFJldHVybnM6IE5TSW50ZWdlciAgICAgIGluZGljYXRvciBvZiBTVUNDRVNTIE9SIEZBSUxVUkUKKyAqCisgKiAgTGFzdCBSZXZpc2lvbiA5LzAzLzkwCisgKi8KKyNlbmRpZgorLShOU0ludGVnZXIpUmVtb3ZlU3ltOihOU1N0cmluZyAqKXMKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wLCAqdG1wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWR4ID0gW3NlbGYgaGFzaDpzXTsKKyAgICBmb3IgKCB0bXAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XSwgbnAgPSBzZWxmLT5wdHJCdWZmZXJbaWR4XTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICB0bXAgPSBbbnAgZ2V0Zk5leHRdOyAgICAgICAgICAgICAvKiBnZXQgdGhlIG5leHQgbGluayAgKi8KKyAgICAgICAgICAgIFtucCByZWxlYXNlXTsKKyAgICAgICAgICAgIHJldHVybiggU1VDQ0VTUyApOyAgICAgICAgICAgIC8qIHJlcG9ydCBTVUNDRVNTICAgICAqLworICAgICAgICB9CisgICAgICAgIHRtcCA9IFtucCBnZXRmTmV4dF07ICAgICAgICAgICAgICAvLyAgQkFEISEhISEhCisgICAgfQorICAgIHJldHVybiggRkFJTFVSRSApOyAgICAgICAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk1hcEVsZW1lbnQgKilucAoreworICAgIGlmICggW25wIGdldGZOZXh0XSAhPSBuaWwgKQorCQlbc2VsZiBkZWxldGVfY2hhaW46W25wIGdldGZOZXh0XV07CisJW25wIHJlbGVhc2VdOworfQorCisjaWZkZWYgRE9OVFVTRVlFVAorLShOU0ludGVnZXIpYmxkX3N5bXRhYjooS1dfVEFCTEUgKil0b2tuYW1zCit7CisgICAgTlNJbnRlZ2VyIGk7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyAqKHRva25hbXNbaV0ubmFtZSkgIT0gJ1wwJzsgaSsrICkgeworICAgICAgICAvLyBpbnN0YWxsIHN5bWJvbCBpbiBwdHJCdWZmZXIKKyAgICAgICAgbnAgPSBbQU5UTFJNYXBFbGVtZW50IG5ld0FOVExSTWFwRWxlbWVudDpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiwgdG9rbmFtc1tpXS5uYW1lXV07CisgICAgICAgIC8vICAgICAgICBucC0+ZlR5cGUgPSB0b2tuYW1zW2ldLnRva251bTsKKyAgICAgICAgW3NlbGYgaW5zdGFsbDpucCBTY29wZTowXTsKKyAgICB9CisgICAgcmV0dXJuKCBTVUNDRVNTICk7Cit9CisjZW5kaWYKKworLyoKKyAqIHdvcmtzIG9ubHkgZm9yIG1hcGxpc3QgaW5kZXhlZCBub3QgYnkgbmFtZSBidXQgYnkgVG9rZW5OdW1iZXIKKyAqLworLSAoQU5UTFJNYXBFbGVtZW50ICopZ2V0TmFtZTooTlNJbnRlZ2VyKXR0eXBlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucDsKKyAgICBOU0ludGVnZXIgYVRUeXBlOworCisgICAgYVRUeXBlID0gdHR5cGUgJSBIQVNIU0laRTsKKyAgICBmb3IoIG5wID0gc2VsZi0+cHRyQnVmZmVyW3R0eXBlXTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggWyhOU051bWJlciAqKW5wLm5vZGUgaW50ZWdlclZhbHVlXSA9PSB0dHlwZSApIHsKKyAgICAgICAgICAgIHJldHVybiggbnAgKTsgICAgICAgIC8qICAgZm91bmQgaXQgICAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oIG5pbCApOyAgICAgICAgICAgICAgLyogICBub3QgZm91bmQgICAgICAqLworfQorCistIChOU0ludGVnZXIpZ2V0Tm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIE5TSW50ZWdlciBpZHg7CisKKyAgICBpZHggPSBbKGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlIHR5cGVdOworICAgIGlkeCAlPSBIQVNIU0laRTsKKyAgICBucCA9IHB0ckJ1ZmZlcltpZHhdOworICAgIHJldHVybiggWyhOU051bWJlciAqKW5wLm5vZGUgaW50ZWdlclZhbHVlXSApOworfQorCistIChBTlRMUk1hcEVsZW1lbnQgKilnZXRUVHlwZTooTlNTdHJpbmcgKiluYW1lCit7CisgICAgcmV0dXJuIFtzZWxmIGxvb2t1cDpuYW1lXTsKK30KKworLy8gY3JlYXRlIG5vZGUgYW5kIGluc3RhbGwgbm9kZSBpbiBwdHJCdWZmZXIKKy0gKHZvaWQpcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIFRUeXBlOihOU0ludGVnZXIpdHR5cGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIAorICAgIG5wID0gW0FOVExSTWFwRWxlbWVudCBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTpbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzpuYW1lXSBUeXBlOnR0eXBlXTsKKyAgICBbc2VsZiBpbnN0YWxsOm5wXTsKK30KKworLy8gY3JlYXRlIG5vZGUgYW5kIGluc3RhbGwgbm9kZSBpbiBwdHJCdWZmZXIKKy0gKHZvaWQpcHV0TmFtZTooTlNTdHJpbmcgKiluYW1lIE5vZGU6KGlkKWFOb2RlCit7CisgICAgQU5UTFJNYXBFbGVtZW50ICpucCwgKm5wMTsKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorICAgIGlkeCA9IFtzZWxmIGhhc2g6bmFtZV07CisgICAgbnAxID0gW0FOVExSTWFwRWxlbWVudCBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTpbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzpuYW1lXSBUeXBlOmlkeF07CisgICAgbnAgPSBbc2VsZiBsb29rdXA6bmFtZV07CisgICAgaWYgKCBucCA9PSBuaWwgKSB7CisgICAgICAgIFtucDEgc2V0Rk5leHQ6c2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5sYXN0SGFzaCBdXTsKKyAgICAgICAgc2VsZi0+cHRyQnVmZmVyWyBzZWxmLT5sYXN0SGFzaCBdID0gbnAxOworICAgICAgICBbbnAxIHJldGFpbl07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBwdHJCdWZmZXJbaWR4XSA9IG5wOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8vIGNyZWF0ZSBub2RlIGFuZCBpbnN0YWxsIG5vZGUgaW4gcHRyQnVmZmVyCistICh2b2lkKXB1dE5vZGU6KE5TSW50ZWdlcilhVFR5cGUgTm9kZTooaWQpYU5vZGUKK3sKKyAgICBBTlRMUk1hcEVsZW1lbnQgKm5wOworICAgIE5TSW50ZWdlciB0dHlwZTsKKyAgICAKKyAgICB0dHlwZSA9IGFUVHlwZSAlIEhBU0hTSVpFOworICAgIG5wID0gW0FOVExSTWFwRWxlbWVudCBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTm9kZTp0dHlwZSBOb2RlOihpZClhTm9kZV07CisgICAgcHRyQnVmZmVyW3R0eXBlXSA9IG5wOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1hcEVsZW1lbnQuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWFwRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGQwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1hcEVsZW1lbnQuaApAQCAtMCwwICsxLDY1IEBACisvLworLy8gIEFOVExSTWFwRWxlbWVudC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZU1hcEVsZW1lbnQuaCIKKworQGludGVyZmFjZSBBTlRMUk1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBOU1N0cmluZyAqbmFtZTsKKyAgICBpZCAgICAgICAgbm9kZTsKK30KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0TmFtZSwgc2V0dGVyPXNldE5hbWU6KSBOU1N0cmluZyAqbmFtZTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZCBub2RlOworCisrIChpZCkgbmV3QU5UTFJNYXBFbGVtZW50OworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIFR5cGU6KE5TSW50ZWdlcilhVFR5cGU7CisrIChpZCkgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5vZGU6KE5TSW50ZWdlcilhVFR5cGUgTm9kZTooaWQpYU5vZGU7CisrIChpZCkgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6KE5TU3RyaW5nICopYU5hbWUgTm9kZTooaWQpYU5vZGU7CisrIChpZCkgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE9iajE6KGlkKWFuT2JqMSBPYmoyOihpZClhbk9iajI7CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopYU5hbWUgVHlwZTooTlNJbnRlZ2VyKWFUVHlwZTsKKy0gKGlkKSBpbml0V2l0aE5vZGU6KE5TSW50ZWdlcilhVFR5cGUgTm9kZTooaWQpYU5vZGU7CistIChpZCkgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIE5vZGU6KGlkKWFOb2RlOworLSAoaWQpIGluaXRXaXRoT2JqMTooaWQpYW5PYmoxIE9iajI6KGlkKWFuT2JqMjsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TSW50ZWdlcikgY291bnQ7CistIChOU0ludGVnZXIpIHNpemU7CistIChOU1N0cmluZyAqKWdldE5hbWU7CistICh2b2lkKXNldE5hbWU6KE5TU3RyaW5nICopYU5hbWU7CistIChpZClnZXROb2RlOworLSAodm9pZClzZXROb2RlOihpZClhTm9kZTsKKy0gKHZvaWQpcHV0Tm9kZTooaWQpYU5vZGU7CistICh2b2lkKXB1dE5vZGU6KGlkKWFOb2RlIFdpdGg6KE5TSW50ZWdlcil1bmlxdWVJRDsKKy8vLSAodm9pZClzZXRPYmplY3Q6KGlkKWFOb2RlIGF0SW5kZXg6YW5JbmRleDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNYXBFbGVtZW50Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1hcEVsZW1lbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UxYzlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNYXBFbGVtZW50Lm0KQEAgLTAsMCArMSwyMDcgQEAKKy8vCisvLyAgQU5UTFJNYXBFbGVtZW50Lm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSTWFwRWxlbWVudAorCitAc3ludGhlc2l6ZSBuYW1lOworQHN5bnRoZXNpemUgbm9kZTsKKworKyAoaWQpIG5ld0FOVExSTWFwRWxlbWVudAoreworICAgIHJldHVybiBbW0FOVExSTWFwRWxlbWVudCBhbGxvY10gaW5pdF07Cit9CisKKysgKGlkKSBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBUeXBlOihOU0ludGVnZXIpYVRUeXBlCit7CisgICAgcmV0dXJuIFtbQU5UTFJNYXBFbGVtZW50IGFsbG9jXSBpbml0V2l0aE5hbWU6YU5hbWUgVHlwZTphVFR5cGVdOworfQorCisrIChpZCkgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5vZGU6KE5TSW50ZWdlcilhVFR5cGUgTm9kZTooaWQpYU5vZGUKK3sKKyAgICByZXR1cm4gW1tBTlRMUk1hcEVsZW1lbnQgYWxsb2NdIGluaXRXaXRoTm9kZTphVFR5cGUgTm9kZTphTm9kZV07Cit9CisKKysgKGlkKSBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBOb2RlOihpZClhTm9kZQoreworICAgIHJldHVybiBbW0FOVExSTWFwRWxlbWVudCBhbGxvY10gaW5pdFdpdGhOYW1lOmFOYW1lIE5vZGU6YU5vZGVdOworfQorCisrIChpZCkgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE9iajE6KGlkKWFuT2JqMSBPYmoyOihpZClhbk9iajIKK3sKKyAgICByZXR1cm4gW1tBTlRMUk1hcEVsZW1lbnQgYWxsb2NdIGluaXRXaXRoT2JqMTphbk9iajEgT2JqMjphbk9iajJdOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgaW5kZXggPSBuaWw7CisgICAgICAgIG5hbWUgID0gbmlsOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSBUeXBlOihOU0ludGVnZXIpYVRUeXBlCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBpbmRleCA9IFtbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6IGFUVHlwZV0gcmV0YWluXTsKKyAgICAgICAgbmFtZSAgPSBbW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6YU5hbWVdIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhOb2RlOihOU0ludGVnZXIpYVRUeXBlIE5vZGU6KGlkKWFOb2RlCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aEFuSW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFUVHlwZV1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIG5vZGUgID0gYU5vZGU7CisgICAgICAgIGlmICggbm9kZSApIFtub2RlIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIE5vZGU6KGlkKWFOb2RlCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBuYW1lICA9IFtbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzphTmFtZV0gcmV0YWluXTsKKyAgICAgICAgbm9kZSA9IGFOb2RlOworICAgICAgICBpZiAoIG5vZGUgKSBbbm9kZSByZXRhaW5dOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoT2JqMTooaWQpYW5JbmRleCBPYmoyOihpZClhTm9kZQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhBbkluZGV4OmFuSW5kZXhdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIG5vZGUgPSBhTm9kZTsKKyAgICAgICAgaWYgKCBub2RlICkgW25vZGUgcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJNYXBFbGVtZW50IiApOworI2VuZGlmCisgICAgaWYgKCBuYW1lICkgW25hbWUgcmVsZWFzZV07CisgICAgaWYgKCBub2RlICkgW25vZGUgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZQoreworICAgIEFOVExSTWFwRWxlbWVudCAqY29weTsKKworICAgIGNvcHkgPSBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsKKyAgICBpZiAobmFtZSkgY29weS5uYW1lID0gbmFtZTsKKyAgICBpZiAobm9kZSkgY29weS5ub2RlID0gbm9kZTsKKyAgICByZXR1cm4oIGNvcHkgKTsKK30KKworLSAoTlNJbnRlZ2VyKSBjb3VudAoreworICAgIE5TSW50ZWdlciBhQ250ID0gMDsKKyAgICBpZiAobmFtZSAhPSBuaWwpIGFDbnQrKzs7CisgICAgaWYgKG5vZGUgIT0gbmlsKSBhQ250Kys7OworICAgIHJldHVybiBhQ250OworfQorCistIChOU0ludGVnZXIpc2l6ZQoreworICAgIE5TSW50ZWdlciBhU2l6ZSA9IDA7CisgICAgaWYgKCBuYW1lICkgYVNpemUgKz0gc2l6ZW9mKGlkKTsKKyAgICBpZiAoIG5vZGUgKSBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgIHJldHVybiBhU2l6ZTsKK30KKworCistIChOU1N0cmluZyAqKWdldE5hbWUKK3sKKyAgICByZXR1cm4gbmFtZTsKK30KKworLSAodm9pZClzZXROYW1lOihOU1N0cmluZyAqKWFOYW1lCit7CisgICAgaWYgKCBhTmFtZSAhPSBuYW1lICkgeworICAgICAgICBpZiAoIG5hbWUgKSBbbmFtZSByZWxlYXNlXTsKKyAgICAgICAgW2FOYW1lIHJldGFpbl07CisgICAgfQorICAgIG5hbWUgPSBhTmFtZTsKK30KKworLSAoaWQpZ2V0Tm9kZQoreworICAgIHJldHVybiBub2RlOworfQorCistICh2b2lkKXNldE5vZGU6KGlkKWFOb2RlCit7ICAgaWYgKCBhTm9kZSAhPSBub2RlICkgeworICAgICAgICBpZiAoIG5vZGUgKSBbbm9kZSByZWxlYXNlXTsKKyAgICAgICAgW2FOb2RlIHJldGFpbl07CisgICAgfQorICAgIG5vZGUgPSBhTm9kZTsKK30KKworLSAodm9pZClwdXROb2RlOihpZClhTm9kZQoreworICAgIGluZGV4ID0gKChBTlRMUk1hcEVsZW1lbnQgKilhTm9kZSkuaW5kZXg7CisgICAgaWYgKCgoQU5UTFJNYXBFbGVtZW50ICopYU5vZGUpLm5hbWUpIHsKKyAgICAgICAgbmFtZSA9IFsoKEFOVExSTWFwRWxlbWVudCAqKWFOb2RlKS5uYW1lIHJldGFpbl07CisgICAgICAgIG5vZGUgPSBuaWw7CisgICAgfQorICAgIGlmICgoKEFOVExSTWFwRWxlbWVudCAqKWFOb2RlKS5ub2RlKSB7CisgICAgICAgIG5hbWUgPSBuaWw7CisgICAgICAgIG5vZGUgPSBbKChBTlRMUk1hcEVsZW1lbnQgKilhTm9kZSkubm9kZSByZXRhaW5dOworICAgIH0KK30KKworLSAodm9pZClwdXROb2RlOihpZClhTm9kZSBXaXRoOihOU0ludGVnZXIpdW5pcXVlSUQKK3sKKyAgICBpbmRleCA9ICgoQU5UTFJNYXBFbGVtZW50ICopYU5vZGUpLmluZGV4OworICAgIGlmICgoKEFOVExSTWFwRWxlbWVudCAqKWFOb2RlKS5uYW1lKSB7CisgICAgICAgIG5hbWUgPSBbKChBTlRMUk1hcEVsZW1lbnQgKilhTm9kZSkubmFtZSByZXRhaW5dOworICAgICAgICBub2RlID0gbmlsOworICAgIH0KKyAgICBpZiAoKChBTlRMUk1hcEVsZW1lbnQgKilhTm9kZSkubm9kZSkgeworICAgICAgICBuYW1lID0gbmlsOworICAgICAgICBub2RlID0gWygoQU5UTFJNYXBFbGVtZW50ICopYU5vZGUpLm5vZGUgcmV0YWluXTsKKyAgICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkMTkxZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTMvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSQml0U2V0LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbgoreworICAgIE5TU3RyaW5nICpleHBlY3Rpbmc7Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TU3RyaW5nICpleHBlY3Rpbmc7CisKKy0gKEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiAqKW5ld0V4Y2VwdGlvbjsKKy0gKEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiAqKW5ld0V4Y2VwdGlvbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGxvdzooTlNTdHJpbmcgKilleHBlY3Rpbmc7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBGb2xsb3c6KE5TU3RyaW5nICopZXhwZWN0aW5nOworCistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2UxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubQpAQCAtMCwwICsxLDY5IEBACisvLworLy8gIEFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzEzLzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uCisKK0BzeW50aGVzaXplIGV4cGVjdGluZzsKKworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3RXhjZXB0aW9uCit7CisgICAgcmV0dXJuIFtbQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIGFsbG9jXSBpbml0XTsKK30KKworLSAoQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uICopbmV3RXhjZXB0aW9uOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93OihOU1N0cmluZyAqKWV4cGVjdGVkCit7CisgICAgcmV0dXJuIFtbQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFN0cmVhbTphbklucHV0IEZvbGxvdzooTlNTdHJpbmcgKilleHBlY3RlZF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybihzZWxmKTsKK30KKworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBGb2xsb3c6KE5TU3RyaW5nICopZXhwZWN0ZWQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06YW5JbnB1dF0pICE9IG5pbCApIHsKKyAgICAgICAgZXhwZWN0aW5nID0gZXhwZWN0ZWQ7CisgICAgfQorICAgIHJldHVybihzZWxmKTsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24oICVkICE9ICVAICkiLCBbc2VsZiB1bmV4cGVjdGVkVHlwZV0sIGV4cGVjdGluZ107Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGFmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKKworQGludGVyZmFjZSBBTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TUmFuZ2UgcmFuZ2U7Cit9CisKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1JhbmdlIHJhbmdlOworCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1JhbmdlKSBhUmFuZ2Ugc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pIHRoZUlucHV0OworLSAoaWQpIGluaXRXaXRoUmFuZ2U6KE5TUmFuZ2UpIGFSYW5nZSBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPikgdGhlSW5wdXQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NDcyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5tCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uCisKK0BzeW50aGVzaXplIHJhbmdlOworCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1JhbmdlKSBhUmFuZ2Ugc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pIHRoZUlucHV0Cit7CisJcmV0dXJuIFtbQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoUmFuZ2U6YVJhbmdlIHN0cmVhbTp0aGVJbnB1dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aFJhbmdlOihOU1JhbmdlKSBhUmFuZ2Ugc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pIHRoZUlucHV0Cit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RyZWFtOnRoZUlucHV0XSkgIT0gbmlsKSB7CisJCXJhbmdlID0gYVJhbmdlOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKwlOU011dGFibGVTdHJpbmcgKmRlc2MgPSAoTlNNdXRhYmxlU3RyaW5nICopW3N1cGVyIGRlc2NyaXB0aW9uXTsKKwlbZGVzYyBhcHBlbmRGb3JtYXQ6QCIgcmFuZ2U6JUAiLCBOU1N0cmluZ0Zyb21SYW5nZShyYW5nZSldOworCXJldHVybiBkZXNjOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTA5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaApAQCAtMCwwICsxLDQ0IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCU5TU3RyaW5nICpleHBlY3Rpbmc7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0RXhwZWN0aW5nLCBzZXR0ZXI9c2V0RXhwZWN0aW5nOikgTlNTdHJpbmcgKmV4cGVjdGluZzsKKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKikgdGhlRXhwZWN0ZWRTZXQgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pIHRoZVN0cmVhbTsKKy0gKGlkKSBpbml0V2l0aFNldDooTlNTdHJpbmcgKikgdGhlRXhwZWN0ZWRTZXQgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pIHRoZVN0cmVhbTsKKworLSAoTlNTdHJpbmcgKikgZ2V0RXhwZWN0aW5nOworLSAodm9pZCkgc2V0RXhwZWN0aW5nOiAoTlNTdHJpbmcgKikgYW5FeHBlY3RlZFNldDsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjQ4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24ubQpAQCAtMCwwICsxLDc5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbgorCitAc3ludGhlc2l6ZSBleHBlY3Rpbmc7CisKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopIHRoZUV4cGVjdGVkU2V0IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSB0aGVTdHJlYW0KK3sKKwlyZXR1cm4gW1tBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoU2V0OnRoZUV4cGVjdGVkU2V0IHN0cmVhbTp0aGVTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhTZXQ6KE5TU3RyaW5nICopIHRoZUV4cGVjdGVkU2V0IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KSB0aGVTdHJlYW0KK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06dGhlU3RyZWFtXSkgIT0gbmlsKSB7CisJCVtzZWxmIHNldEV4cGVjdGluZzp0aGVFeHBlY3RlZFNldF07CisJfQorCXJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisJW3NlbGYgc2V0RXhwZWN0aW5nOm5pbF07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworCU5TTXV0YWJsZVN0cmluZyAqZGVzYyA9KE5TTXV0YWJsZVN0cmluZyAqKVtzdXBlciBkZXNjcmlwdGlvbl07CisJW2Rlc2MgYXBwZW5kRm9ybWF0OkAiIHNldDolQCIsIGV4cGVjdGluZ107CisJcmV0dXJuIGRlc2M7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLy8gIGV4cGVjdGVkU2V0IAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLSAoTlNTdHJpbmcgKikgZ2V0RXhwZWN0aW5nCit7CisgICAgcmV0dXJuIGV4cGVjdGluZzsgCit9CisKKy0gKHZvaWQpIHNldEV4cGVjdGluZzogKE5TU3RyaW5nICopIGFuRXhwZWN0ZWRTZXQKK3sKKyAgICBpZiAoIGV4cGVjdGluZyAhPSBhbkV4cGVjdGVkU2V0ICkgeworICAgICAgICBpZiAoIGV4cGVjdGluZyApIFtleHBlY3RpbmcgcmVsZWFzZV07CisgICAgICAgIFthbkV4cGVjdGVkU2V0IHJldGFpbl07CisgICAgICAgIGV4cGVjdGluZyA9IGFuRXhwZWN0ZWRTZXQ7CisgICAgfQorfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjhkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUkJpdFNldC5oIgorCitAcHJvdG9jb2wgQU5UTFJJbnRTdHJlYW07CisKK0BpbnRlcmZhY2UgQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gOiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwlOU0ludGVnZXIgZXhwZWN0aW5nOworCXVuaWNoYXIgZXhwZWN0aW5nQ2hhcjsKKwlCT09MIGlzVG9rZW5UeXBlOworfQorCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZywgc2V0dGVyPXNldEV4cGVjdGluZzopIE5TSW50ZWdlciBleHBlY3Rpbmc7CitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldEV4cGVjdGluZ0NoYXIsIHNldHRlcj1zZXRFeHBlY3RpbmdDaGFyOikgdW5pY2hhciBleHBlY3RpbmdDaGFyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRJc1Rva2VuVHlwZSwgc2V0dGVyPXNldElzVG9rZW5UeXBlOikgQk9PTCBpc1Rva2VuVHlwZTsKKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CisrIChpZCkgbmV3RXhjZXB0aW9uTWlzc2luZzooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbjooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWQ7CisrIChpZCkgbmV3RXhjZXB0aW9uQ2hhcjoodW5pY2hhcilleHBlY3RlZENoYXJhY3RlciBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0OworKyAoaWQpIG5ld0V4Y2VwdGlvblN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKillCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworLSAoaWQpIGluaXRXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKy0oaWQpIGluaXRXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUKKyAgICAgICAgICAgICAgICAgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgVG9rZW46KGlkPEFOVExSVG9rZW4+KWluc2VydGVkOworLSAoaWQpIGluaXRXaXRoQ2hhcmFjdGVyOih1bmljaGFyKWV4cGVjdGVkQ2hhcmFjdGVyIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODA3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5tCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbgorCitAc3ludGhlc2l6ZSBleHBlY3Rpbmc7CitAc3ludGhlc2l6ZSBleHBlY3RpbmdDaGFyOworQHN5bnRoZXNpemUgaXNUb2tlblR5cGU7CisKKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKK3sKKwlyZXR1cm4gW1tBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhUb2tlblR5cGU6ZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOmFuSW5wdXRdOworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uTWlzc2luZzooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbjooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWQKK3sKKwlyZXR1cm4gW1tBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhUb2tlblR5cGU6ZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOmFuSW5wdXQgVG9rZW46aW5zZXJ0ZWRdOworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uQ2hhcjoodW5pY2hhcikgZXhwZWN0ZWRDaGFyYWN0ZXIgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworCXJldHVybiBbW0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcjpleHBlY3RlZENoYXJhY3RlciBTdHJlYW06YW5JbnB1dF07Cit9CisKKysgKGlkKSBuZXdFeGNlcHRpb25TdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKillIEZvbGxvdzooQU5UTFJCaXRTZXQgKikgZm9sbG93Cit7CisJcmV0dXJuIFtbQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoU3RyZWFtOmFuSW5wdXRdOworfQorCistKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06YW5JbnB1dF0pICE9IG5pbCkgeworCQlleHBlY3RpbmcgPSBleHBlY3RlZFRva2VuVHlwZTsKKwkJaXNUb2tlblR5cGUgPSBZRVM7CisJfQorCXJldHVybiBzZWxmOworfQorCistKGlkKSBpbml0V2l0aFRva2VuVHlwZTooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlCisgICAgICAgICAgICAgICAgIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgIFRva2VuOihpZDxBTlRMUlRva2VuPilpbnNlcnRlZAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphbklucHV0XSkgIT0gbmlsKSB7CisJCWV4cGVjdGluZyA9IGV4cGVjdGVkVG9rZW5UeXBlOworCQlpc1Rva2VuVHlwZSA9IFlFUzsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aENoYXJhY3RlcjoodW5pY2hhcikgZXhwZWN0ZWRDaGFyYWN0ZXIgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphbklucHV0XSkgIT0gbmlsKSB7CisJCWV4cGVjdGluZ0NoYXIgPSBleHBlY3RlZENoYXJhY3RlcjsKKwkJaXNUb2tlblR5cGUgPSBOTzsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisJTlNNdXRhYmxlU3RyaW5nICpkZXNjID0gKE5TTXV0YWJsZVN0cmluZyAqKVtzdXBlciBkZXNjcmlwdGlvbl07CisJaWYgKGlzVG9rZW5UeXBlKSB7CisJCVtkZXNjIGFwcGVuZEZvcm1hdDpAIiBleHBlY3RlZDolZCBnb3Q6JWQiLCBleHBlY3RpbmcsIFtzZWxmIHVuZXhwZWN0ZWRUeXBlXV07CisJfSBlbHNlIHsKKwkJW2Rlc2MgYXBwZW5kRm9ybWF0OkAiIGV4cGVjdGVkOiVjIGdvdDolYyIsIGV4cGVjdGluZ0NoYXIsICh1bmljaGFyKVtzZWxmIHVuZXhwZWN0ZWRUeXBlXV07CisJfQorCXJldHVybiBkZXNjOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI4Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaApAQCAtMCwwICsxLDQyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKworQHByb3RvY29sIEFOVExSSW50U3RyZWFtOworCitAaW50ZXJmYWNlIEFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIDogQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJTlNJbnRlZ2VyIGV4cGVjdGluZzsKK30KKworQHByb3BlcnR5IChnZXR0ZXI9Z2V0RXhwZWN0aW5nLCBzZXR0ZXI9c2V0RXhwZWN0aW5nOikgTlNJbnRlZ2VyIGV4cGVjdGluZzsKKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CistIChpZCkgaW5pdFdpdGhUb2tlblR5cGU6KE5TSW50ZWdlcikgZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dDsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ1MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24ubQpAQCAtMCwwICsxLDU0IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24KKworQHN5bnRoZXNpemUgZXhwZWN0aW5nOworCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworCXJldHVybiBbW0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFRva2VuVHlwZTpleHBlY3RlZFRva2VuVHlwZSBTdHJlYW06YW5JbnB1dF07Cit9CisKKy0oaWQpIGluaXRXaXRoVG9rZW5UeXBlOihOU0ludGVnZXIpZXhwZWN0ZWRUb2tlblR5cGUgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphbklucHV0XSkgIT0gbmlsKSB7CisJCWV4cGVjdGluZyA9IGV4cGVjdGVkVG9rZW5UeXBlOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKwlOU011dGFibGVTdHJpbmcgKmRlc2MgPSAoTlNNdXRhYmxlU3RyaW5nICopW3N1cGVyIGRlc2NyaXB0aW9uXTsKKwlbZGVzYyBhcHBlbmRGb3JtYXQ6QCIgZXhwZWN0ZWQ6JWQgZ290OiVkIiwgZXhwZWN0aW5nLCBbc2VsZiB1bmV4cGVjdGVkVHlwZV1dOworCXJldHVybiBkZXNjOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU4MTAzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaApAQCAtMCwwICsxLDUyIEBACisvLworLy8gIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbiA6IEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIHsKKyAgICBpZDxBTlRMUlRva2VuPiBpbnNlcnRlZDsKK30KKy8qKiBVc2VkIGZvciByZW1vdGUgZGVidWdnZXIgZGVzZXJpYWxpemF0aW9uICovCisrIChpZCkgbmV3RXhjZXB0aW9uOworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkCisgICAgICAgICAgICAgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgV2l0aDooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWRUb2tlbjsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXQ6KE5TSW50ZWdlcilleHBlY3RlZCBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFdpdGg6KGlkPEFOVExSVG9rZW4+KWluc2VydGVkVG9rZW47CisKKy0gKE5TSW50ZWdlcikgZ2V0TWlzc2luZ1R5cGU7CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisKK0Bwcm9wZXJ0eSAocmV0YWluKSBpZDxBTlRMUlRva2VuPiBpbnNlcnRlZDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmQxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5tCkBAIC0wLDAgKzEsODMgQEAKKy8vCisvLyAgQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi84LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uCisvKiogVXNlZCBmb3IgcmVtb3RlIGRlYnVnZ2VyIGRlc2VyaWFsaXphdGlvbiAqLworKyAoaWQpIG5ld0V4Y2VwdGlvbgoreworICAgIHJldHVybiBbW0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uIGFsbG9jXSBpbml0XTsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkCisgICAgICAgICAgICAgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgV2l0aDooaWQ8QU5UTFJUb2tlbj4paW5zZXJ0ZWRUb2tlbgoreworICAgIHJldHVybiBbW0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uIGFsbG9jXSBpbml0OmV4cGVjdGVkIFN0cmVhbTphbklucHV0IFdpdGg6aW5zZXJ0ZWRUb2tlbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0OihOU0ludGVnZXIpZXhwZWN0ZWQgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBXaXRoOihpZDxBTlRMUlRva2VuPilpbnNlcnRlZFRva2VuCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RyZWFtOmFuSW5wdXRdKSAhPSBuaWwpIHsKKyAgICAgICAgZXhwZWN0aW5nID0gZXhwZWN0ZWQ7CisgICAgICAgIGlucHV0ID0gYW5JbnB1dDsKKyAgICAgICAgaW5zZXJ0ZWQgPSBpbnNlcnRlZFRva2VuOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRNaXNzaW5nVHlwZQoreworICAgIHJldHVybiBleHBlY3Rpbmc7Cit9CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmcKK3sKKyAgICBpZiAoIGluc2VydGVkICE9IG5pbCAmJiB0b2tlbiAhPSBuaWwgKSB7CisgICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIk1pc3NpbmdUb2tlbkV4Y2VwdGlvbihpbnNlcnRlZCAlQCBhdCAlQCkiLCBpbnNlcnRlZCwgdG9rZW4udGV4dF07CisgICAgfQorICAgIGlmICggdG9rZW4hPW5pbCApIHsKKyAgICAgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGF0ICVAKSIsIHRva2VuLnRleHQgXTsKKyAgICB9CisgICAgcmV0dXJuIEAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uIjsKK30KKworQHN5bnRoZXNpemUgaW5zZXJ0ZWQ7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyZTUyMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaApAQCAtMCwwICsxLDQ1IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWludCBkZWNpc2lvbk51bWJlcjsKKwlpbnQgc3RhdGVOdW1iZXI7Cit9CisKKysgKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKikgbmV3RXhjZXB0aW9uOihOU0ludGVnZXIpdGhlRGVjaXNpb25OdW1iZXIgc3RhdGU6KE5TSW50ZWdlcil0aGVTdGF0ZU51bWJlciBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW07CistIChBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICopIGluaXRXaXRoRGVjaXNpb246KE5TSW50ZWdlcil0aGVEZWNpc2lvbk51bWJlciBzdGF0ZTooTlNJbnRlZ2VyKXRoZVN0YXRlTnVtYmVyIHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KXRoZVN0cmVhbTsKKworLSAodm9pZClzZXREZWNpc2lvbk51bWJlcjooTlNJbnRlZ2VyKWRlY2lzaW9uTnVtYmVyOworLSAodm9pZClzZXRTdGF0ZU51bWJlcjooTlNJbnRlZ2VyKXN0YXRlTnVtYmVyOworCisKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWRlY2lzaW9uTnVtYmVyLHNldHRlcj1zZXREZWNpc2lvbk51bWJlcjopIE5TSW50ZWdlciBkZWNpc2lvbk51bWJlcjsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPXN0YXRlTnVtYmVyLHNldHRlcj1zZXRTdGF0ZU51bWJlcjopIE5TSW50ZWdlciBzdGF0ZU51bWJlcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTE5NTgxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5tCkBAIC0wLDAgKzEsODMgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbgorCisKKysgKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKikgbmV3RXhjZXB0aW9uOihOU0ludGVnZXIpdGhlRGVjaXNpb25OdW1iZXIgc3RhdGU6KE5TSW50ZWdlcil0aGVTdGF0ZU51bWJlciBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPil0aGVTdHJlYW0KK3sKKwlyZXR1cm4gW1tzZWxmIGFsbG9jXSBpbml0V2l0aERlY2lzaW9uOnRoZURlY2lzaW9uTnVtYmVyIHN0YXRlOnRoZVN0YXRlTnVtYmVyIHN0cmVhbTp0aGVTdHJlYW1dOworfQorCisKKy0gKEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKikgaW5pdFdpdGhEZWNpc2lvbjooTlNJbnRlZ2VyKXRoZURlY2lzaW9uTnVtYmVyIHN0YXRlOihOU0ludGVnZXIpdGhlU3RhdGVOdW1iZXIgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pdGhlU3RyZWFtCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RyZWFtOnRoZVN0cmVhbV0pICE9IG5pbCkgeworCQlkZWNpc2lvbk51bWJlciA9IHRoZURlY2lzaW9uTnVtYmVyOworCQlzdGF0ZU51bWJlciA9IHRoZVN0YXRlTnVtYmVyOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKwlOU011dGFibGVTdHJpbmcgKmRlc2MgPSAoTlNNdXRhYmxlU3RyaW5nICopW3N1cGVyIGRlc2NyaXB0aW9uXTsKKwlbZGVzYyBhcHBlbmRGb3JtYXQ6QCIgZGVjaXNpb246JWQgc3RhdGU6JWQiLCBkZWNpc2lvbk51bWJlciwgc3RhdGVOdW1iZXJdOworCXJldHVybiBkZXNjOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgZGVjaXNpb25OdW1iZXIgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChOU0ludGVnZXIpIGRlY2lzaW9uTnVtYmVyCit7CisgICAgcmV0dXJuIGRlY2lzaW9uTnVtYmVyOworfQorCistICh2b2lkKSBzZXREZWNpc2lvbk51bWJlcjogKE5TSW50ZWdlcikgYURlY2lzaW9uTnVtYmVyCit7CisgICAgZGVjaXNpb25OdW1iZXIgPSBhRGVjaXNpb25OdW1iZXI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBzdGF0ZU51bWJlciAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKE5TSW50ZWdlcikgc3RhdGVOdW1iZXIKK3sKKyAgICByZXR1cm4gc3RhdGVOdW1iZXI7Cit9CisKKy0gKHZvaWQpIHNldFN0YXRlTnVtYmVyOiAoTlNJbnRlZ2VyKSBhU3RhdGVOdW1iZXIKK3sKKyAgICBzdGF0ZU51bWJlciA9IGFTdGF0ZU51bWJlcjsKK30KKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk5vZGVNYXBFbGVtZW50LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk5vZGVNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiZjdiNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTm9kZU1hcEVsZW1lbnQuaApAQCAtMCwwICsxLDU2IEBACisvLworLy8gIEFOVExSUnVsZU1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlTWFwRWxlbWVudC5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSTm9kZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBpZDxBTlRMUkJhc2VUcmVlPiBub2RlOworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldE5vZGUsIHNldHRlcj1zZXROb2RlOikgaWQ8QU5UTFJCYXNlVHJlZT4gbm9kZTsKKworKyAodm9pZClpbml0aWFsaXplOworCisrIChpZCkgbmV3QU5UTFJOb2RlTWFwRWxlbWVudDsKKysgKGlkKSBuZXdBTlRMUk5vZGVNYXBFbGVtZW50V2l0aEluZGV4OihpZClhbkluZGV4IE5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhBbkluZGV4OihpZClhbkluZGV4IE5vZGU6KGlkKWFOb2RlOworCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZ2V0Tm9kZTsKKy0gKHZvaWQpc2V0Tm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGU7CisKKy0gKE5TSW50ZWdlcilzaXplOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk5vZGVNYXBFbGVtZW50Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUk5vZGVNYXBFbGVtZW50Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmMzVjYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSTm9kZU1hcEVsZW1lbnQubQpAQCAtMCwwICsxLDEwOCBAQAorLy8KKy8vICBBTlRMUk5vZGVNYXBFbGVtZW50Lm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTYvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJOb2RlTWFwRWxlbWVudC5oIgorCitzdGF0aWMgTlNJbnRlZ2VyIF9hVW5pcXVlSUQ7CisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUk5vZGVNYXBFbGVtZW50CisKK0BzeW50aGVzaXplIG5vZGU7CisKKysgKHZvaWQpaW5pdGlhbGl6ZQoreworICAgIF9hVW5pcXVlSUQgPSAwOworfQorCisrIChBTlRMUk5vZGVNYXBFbGVtZW50ICopbmV3QU5UTFJOb2RlTWFwRWxlbWVudAoreworICAgIHJldHVybiBbW0FOVExSTm9kZU1hcEVsZW1lbnQgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUk5vZGVNYXBFbGVtZW50ICopbmV3QU5UTFJOb2RlTWFwRWxlbWVudFdpdGhJbmRleDooaWQpYW5JbmRleCBOb2RlOihpZDxBTlRMUkJhc2VUcmVlPilhTm9kZQoreworICAgIHJldHVybiBbW0FOVExSTm9kZU1hcEVsZW1lbnQgYWxsb2NdIGluaXRXaXRoQW5JbmRleDphbkluZGV4IE5vZGU6YU5vZGVdOworfQorCistIChpZCkgaW5pdAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsICkgeworICAgICAgICBpbmRleCA9IG5pbDsKKyAgICAgICAgbm9kZSA9IG5pbDsKKyAgICB9CisgICAgcmV0dXJuIChzZWxmKTsKK30KKworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooaWQpYW5JbmRleCBOb2RlOihpZClhTm9kZQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhBbkluZGV4OmFuSW5kZXhdOworICAgIGlmICggc2VsZiApIHsKKyAgICAgICAgaWYgKCBhTm9kZSAhPSBub2RlICkgeworICAgICAgICAgICAgaWYgKCBub2RlICkgW25vZGUgcmVsZWFzZV07CisgICAgICAgICAgICBbYU5vZGUgcmV0YWluXTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gYU5vZGU7CisgICAgfQorICAgIHJldHVybiAoc2VsZik7Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJOb2RlTWFwRWxlbWVudCAqY29weTsKKyAgICAKKyAgICBjb3B5ID0gW3N1cGVyIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS5ub2RlID0gbm9kZTsKKyAgICByZXR1cm4oIGNvcHkgKTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pZ2V0Tm9kZQoreworICAgIHJldHVybiBub2RlOworfQorCistICh2b2lkKXNldE5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlCit7CisgICAgaWYgKCBhTm9kZSAhPSBub2RlICkgeworICAgICAgICBpZiAoIG5vZGUgKSBbbm9kZSByZWxlYXNlXTsKKyAgICAgICAgW2FOb2RlIHJldGFpbl07CisgICAgfQorICAgIG5vZGUgPSBhTm9kZTsKK30KKworLSAoTlNJbnRlZ2VyKXNpemUKK3sKKyAgICBOU0ludGVnZXIgYVNpemUgPSAwOworICAgIGlmIChub2RlICE9IG5pbCkgYVNpemUgKz0gc2l6ZW9mKGlkKTsKKyAgICBpZiAoaW5kZXggIT0gbmlsKSBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgIHJldHVybiggYVNpemUgKTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQYXJzZVRyZWUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMTAwNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VUcmVlLmgKQEAgLTAsMCArMSw2NCBAQAorLy8KKy8vICBBTlRMUlBhcnNlVHJlZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA3LzEyLzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJQYXJzZVRyZWUgOiBBTlRMUkJhc2VUcmVlIDxBTlRMUkJhc2VUcmVlPiB7CisJX19zdHJvbmcgaWQ8QU5UTFJUb2tlbj4gcGF5bG9hZDsKKwlfX3N0cm9uZyBBTXV0YWJsZUFycmF5ICpoaWRkZW5Ub2tlbnM7Cit9CisvKiogQSByZWNvcmQgb2YgdGhlIHJ1bGVzIHVzZWQgdG8gbWF0Y2ggYSB0b2tlbiBzZXF1ZW5jZS4gIFRoZSB0b2tlbnMKKyAqICBlbmQgdXAgYXMgdGhlIGxlYXZlcyBvZiB0aGlzIHRyZWUgYW5kIHJ1bGUgbm9kZXMgYXJlIHRoZSBpbnRlcmlvciBub2Rlcy4KKyAqICBUaGlzIHJlYWxseSBhZGRzIG5vIGZ1bmN0aW9uYWxpdHksIGl0IGlzIGp1c3QgYW4gYWxpYXMgZm9yIENvbW1vblRyZWUKKyAqICB0aGF0IGlzIG1vcmUgbWVhbmluZ2Z1bCAoc3BlY2lmaWMpIGFuZCBob2xkcyBhIFN0cmluZyB0byBkaXNwbGF5IGZvciBhIG5vZGUuCisgKi8KKysgKGlkPEFOVExSQmFzZVRyZWU+KW5ld0FOVExSUGFyc2VUcmVlOihpZDxBTlRMUlRva2VuPilsYWJlbDsKKy0gKGlkKWluaXRXaXRoTGFiZWw6KGlkPEFOVExSVG9rZW4+KWxhYmVsOworCistIChpZDxBTlRMUkJhc2VUcmVlPilkdXBOb2RlOworLSAoTlNJbnRlZ2VyKXR5cGU7CistIChOU1N0cmluZyAqKXRleHQ7CistIChOU0ludGVnZXIpZ2V0VG9rZW5TdGFydEluZGV4OworLSAodm9pZClzZXRUb2tlblN0YXJ0SW5kZXg6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0b3BJbmRleDsKKy0gKHZvaWQpc2V0VG9rZW5TdG9wSW5kZXg6KE5TSW50ZWdlcilpbmRleDsKKy0gKE5TU3RyaW5nICopZGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNTdHJpbmcgKil0b1N0cmluZ1dpdGhIaWRkZW5Ub2tlbnM7CistIChOU1N0cmluZyAqKXRvSW5wdXRTdHJpbmc7CistICh2b2lkKV90b1N0cmluZ0xlYXZlczooTlNNdXRhYmxlU3RyaW5nICopYnVmOworCitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJUb2tlbj4gcGF5bG9hZDsKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTXV0YWJsZUFycmF5ICpoaWRkZW5Ub2tlbnM7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlVHJlZS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQYXJzZVRyZWUubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM5NjQwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQYXJzZVRyZWUubQpAQCAtMCwwICsxLDE0OSBAQAorLy8KKy8vICBBTlRMUlBhcnNlVHJlZS5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA3LzEyLzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSUGFyc2VUcmVlLmgiCisKKy8qKiBBIHJlY29yZCBvZiB0aGUgcnVsZXMgdXNlZCB0byBtYXRjaCBhIHRva2VuIHNlcXVlbmNlLiAgVGhlIHRva2VucworICogIGVuZCB1cCBhcyB0aGUgbGVhdmVzIG9mIHRoaXMgdHJlZSBhbmQgcnVsZSBub2RlcyBhcmUgdGhlIGludGVyaW9yIG5vZGVzLgorICogIFRoaXMgcmVhbGx5IGFkZHMgbm8gZnVuY3Rpb25hbGl0eSwgaXQgaXMganVzdCBhbiBhbGlhcyBmb3IgQ29tbW9uVHJlZQorICogIHRoYXQgaXMgbW9yZSBtZWFuaW5nZnVsIChzcGVjaWZpYykgYW5kIGhvbGRzIGEgU3RyaW5nIHRvIGRpc3BsYXkgZm9yIGEgbm9kZS4KKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSUGFyc2VUcmVlCisrIChBTlRMUlBhcnNlVHJlZSAqKW5ld0FOVExSUGFyc2VUcmVlOihpZDxBTlRMUlRva2VuPilsYWJlbAoreworICAgIHJldHVybiBbW0FOVExSUGFyc2VUcmVlIGFsbG9jXSBpbml0V2l0aExhYmVsOmxhYmVsXTsKK30KKyAgICAKKy0gKGlkKWluaXRXaXRoTGFiZWw6KGlkPEFOVExSVG9rZW4+KWxhYmVsCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsKSB7CisgICAgICAgIHBheWxvYWQgPSBbbGFiZWwgcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KWR1cE5vZGUKK3sKKyAgICByZXR1cm4gbmlsOworfQorICAgIAorLSAoTlNJbnRlZ2VyKXR5cGUKK3sKKyAgICByZXR1cm4gMDsKK30KKyAgICAKKy0gKE5TU3RyaW5nICopdGV4dAoreworICAgIHJldHVybiBbc2VsZiB0b1N0cmluZ107Cit9CisgICAgCistIChOU0ludGVnZXIpZ2V0VG9rZW5TdGFydEluZGV4Cit7CisgICAgcmV0dXJuIDA7Cit9CisgICAgCistICh2b2lkKXNldFRva2VuU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKK30KKyAgICAKKy0gKE5TSW50ZWdlcilnZXRUb2tlblN0b3BJbmRleAoreworICAgIHJldHVybiAwOworfQorICAgIAorLSAodm9pZClzZXRUb2tlblN0b3BJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXgKK3sKK30KKworLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbgoreworICAgIGlmICggW3BheWxvYWQgaXNLaW5kT2ZDbGFzczpbQU5UTFJDb21tb25Ub2tlbiBjbGFzc11dICkgeworICAgICAgICBpZDxBTlRMUlRva2VuPiB0ID0gKGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CisgICAgICAgIGlmICggdC50eXBlID09IEFOVExSVG9rZW5UeXBlRU9GICkgeworICAgICAgICAgICAgcmV0dXJuIEAiPEVPRj4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBbdCB0ZXh0XTsKKyAgICB9CisgICAgcmV0dXJuIFtwYXlsb2FkIGRlc2NyaXB0aW9uXTsKK30KKyAgICAKKy0gKE5TU3RyaW5nICopdG9TdHJpbmcKK3sKKyAgICByZXR1cm4gW3NlbGYgZGVzY3JpcHRpb25dOworfQorICAgIAorLyoqIEVtaXQgYSB0b2tlbiBhbmQgYWxsIGhpZGRlbiBub2RlcyBiZWZvcmUuICBFT0Ygbm9kZSBob2xkcyBhbGwKKyAqICBoaWRkZW4gdG9rZW5zIGFmdGVyIGxhc3QgcmVhbCB0b2tlbi4KKyAqLworLSAoTlNTdHJpbmcgKil0b1N0cmluZ1dpdGhIaWRkZW5Ub2tlbnMKK3sKKyAgICBOU011dGFibGVTdHJpbmcgKmJ1ZiA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjI1XTsKKyAgICBpZiAoIGhpZGRlblRva2VucyE9bmlsICkgeworICAgICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBbaGlkZGVuVG9rZW5zIGNvdW50XTsgaSsrKSB7CisgICAgICAgICAgICBpZDxBTlRMUlRva2VuPiAgaGlkZGVuID0gKGlkPEFOVExSVG9rZW4+ICkgW2hpZGRlblRva2VucyBvYmplY3RBdEluZGV4OmldOworICAgICAgICAgICAgW2J1ZiBhcHBlbmRTdHJpbmc6W2hpZGRlbiB0ZXh0XV07CisgICAgICAgIH0KKyAgICB9CisgICAgTlNTdHJpbmcgKm5vZGVUZXh0ID0gW3NlbGYgdG9TdHJpbmddOworICAgIGlmICggIVtub2RlVGV4dCBpc0VxdWFsVG86QCI8RU9GPiJdICkKKyAgICAgICAgW2J1ZiBhcHBlbmRTdHJpbmc6bm9kZVRleHRdOworICAgIHJldHVybiBidWY7Cit9CisgICAgCisvKiogUHJpbnQgb3V0IHRoZSBsZWF2ZXMgb2YgdGhpcyB0cmVlLCB3aGljaCBtZWFucyBwcmludGluZyBvcmlnaW5hbAorICogIGlucHV0IGJhY2sgb3V0LgorICovCistIChOU1N0cmluZyAqKXRvSW5wdXRTdHJpbmcKK3sKKyAgICBOU011dGFibGVTdHJpbmcgKmJ1ZiA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjI1XTsKKyAgICBbc2VsZiBfdG9TdHJpbmdMZWF2ZXM6YnVmXTsKKyAgICByZXR1cm4gYnVmOworfQorICAgIAorLSAodm9pZClfdG9TdHJpbmdMZWF2ZXM6KE5TTXV0YWJsZVN0cmluZyAqKWJ1ZgoreworICAgIGlmICggW3BheWxvYWQgaXNLaW5kT2ZDbGFzczpbQU5UTFJDb21tb25Ub2tlbiBjbGFzc11dICkgeyAvLyBsZWFmIG5vZGUgdG9rZW4/CisgICAgICAgIFtidWYgYXBwZW5kU3RyaW5nOltzZWxmIHRvU3RyaW5nV2l0aEhpZGRlblRva2Vuc11dOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBjaGlsZHJlbiE9bmlsICYmIGkgPCBbY2hpbGRyZW4gY291bnRdOyBpKyspIHsKKyAgICAgICAgQU5UTFJQYXJzZVRyZWUgKnQgPSAoQU5UTFJQYXJzZVRyZWUgKikgW2NoaWxkcmVuIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIFt0IF90b1N0cmluZ0xlYXZlczpidWZdOworICAgIH0KK30KKyAgICAKK0BzeW50aGVzaXplIHBheWxvYWQ7CitAc3ludGhlc2l6ZSBoaWRkZW5Ub2tlbnM7CitAc3ludGhlc2l6ZSBjaGlsZHJlbjsKK0BzeW50aGVzaXplIGFuRXhjZXB0aW9uOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdiMzEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQYXJzZXIuaApAQCAtMCwwICsxLDU5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorCitAaW50ZXJmYWNlIEFOVExSUGFyc2VyIDogQU5UTFJCYXNlUmVjb2duaXplciB7CisJaWQ8QU5UTFJUb2tlblN0cmVhbT4gaW5wdXQ7Cit9CisrIChBTlRMUlBhcnNlciAqKW5ld0FOVExSUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0OworKyAoQU5UTFJQYXJzZXIgKiluZXdBTlRMUlBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPil0aGVTdHJlYW07CistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtIFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZTsKKworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGlucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6IChpZDxBTlRMUlRva2VuU3RyZWFtPikgYW5JbnB1dDsKKworLSAodm9pZCkgcmVzZXQ7CisKKy0gKGlkKSBnZXRDdXJyZW50SW5wdXRTeW1ib2w6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQ7CistIChBTlRMUkNvbW1vblRva2VuICopZ2V0TWlzc2luZ1N5bWJvbDooaWQ8QU5UTFJUb2tlblN0cmVhbT4paW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6KE5TSW50ZWdlcilleHBlY3RlZFRva2VuVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQ6KEFOVExSQml0U2V0ICopZm9sbG93OworLSAodm9pZCkgc2V0VG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQ7CistIChpZDxBTlRMUlRva2VuU3RyZWFtPilnZXRUb2tlblN0cmVhbTsKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAodm9pZCkgdHJhY2VJbjooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooaW50KXJ1bGVJbmRleDsKKy0gKHZvaWQpIHRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpIHJ1bGVJbmRleDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1NTliMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VyLm0KQEAgLTAsMCArMSwxNDcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlBhcnNlci5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlBhcnNlcgorCisrIChBTlRMUlBhcnNlciAqKW5ld0FOVExSUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbQU5UTFJQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YW5JbnB1dF07Cit9CisKKysgKEFOVExSUGFyc2VyICopbmV3QU5UTFJQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFuSW5wdXQgU3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopYVN0YXRlCit7CisgICAgcmV0dXJuIFtbQU5UTFJQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YW5JbnB1dCBTdGF0ZTphU3RhdGVdOworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJaW5wdXQgPSB0aGVTdHJlYW07CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pdGhlU3RyZWFtIFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZQoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0YXRlOmFTdGF0ZV0pICE9IG5pbCkgeworICAgICAgICBpbnB1dCA9IHRoZVN0cmVhbTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIHJlc2V0Cit7CisgICAgW3N1cGVyIHJlc2V0XTsgLy8gcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgaWYgKCBpbnB1dCE9bmlsICkgeworICAgICAgICBbaW5wdXQgc2VlazowXTsgLy8gcmV3aW5kIHRoZSBpbnB1dAorICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlBhcnNlciIgKTsKKyNlbmRpZgorCVtzZWxmIHNldElucHV0Om5pbF07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgaW5wdXQgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChpZDxBTlRMUlRva2VuU3RyZWFtPikgaW5wdXQKK3sKKyAgICByZXR1cm4gaW5wdXQ7IAorfQorCistICh2b2lkKSBzZXRJbnB1dDogKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBhbklucHV0Cit7CisgICAgaWYgKGlucHV0ICE9IGFuSW5wdXQpIHsKKyAgICAgICAgaWYgKCBpbnB1dCApIFtpbnB1dCByZWxlYXNlXTsKKyAgICAgICAgW2FuSW5wdXQgcmV0YWluXTsKKyAgICB9CisgICAgaW5wdXQgPSBhbklucHV0OworfQorCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0Cit7CisgICAgc3RhdGUudG9rZW4gPSBbaW5wdXQgTFQ6MV07CisgICAgcmV0dXJuIHN0YXRlLnRva2VuOworfQorCistIChBTlRMUkNvbW1vblRva2VuICopZ2V0TWlzc2luZ1N5bWJvbDooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFNldDooQU5UTFJCaXRTZXQgKilmb2xsb3cKK3sKKyAgICBOU1N0cmluZyAqdG9rZW5UZXh0ID0gbmlsOworICAgIGlmICggZXhwZWN0ZWRUb2tlblR5cGUgPT0gQU5UTFJUb2tlblR5cGVFT0YgKQorICAgICAgICB0b2tlblRleHQgPSBAIjxtaXNzaW5nIEVPRj4iOworICAgIGVsc2UKKyAgICAgICAgdG9rZW5UZXh0ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8bWlzc2luZyAlQD5cbiIsW1tBTlRMUkJhc2VSZWNvZ25pemVyIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6ZXhwZWN0ZWRUb2tlblR5cGVdXTsKKyAgICBBTlRMUkNvbW1vblRva2VuICp0ID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOmV4cGVjdGVkVG9rZW5UeXBlIFRleHQ6dG9rZW5UZXh0XSByZXRhaW5dOworICAgIEFOVExSQ29tbW9uVG9rZW4gKmN1cnJlbnQgPSBbYW5JbnB1dCBMVDoxXTsKKyAgICBpZiAoIGN1cnJlbnQudHlwZSA9PSBBTlRMUlRva2VuVHlwZUVPRiApIHsKKyAgICAgICAgY3VycmVudCA9IFthbklucHV0IExUOi0xXTsKKyAgICB9CisgICAgdC5saW5lID0gY3VycmVudC5saW5lOworICAgIHQuY2hhclBvc2l0aW9uSW5MaW5lID0gY3VycmVudC5jaGFyUG9zaXRpb25JbkxpbmU7CisgICAgdC5jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgIHJldHVybiB0OworfQorCisvKiogU2V0IHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJlc2V0IHRoZSBwYXJzZXIgKi8KKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0Cit7CisgICAgaW5wdXQgPSBuaWw7CisgICAgW3NlbGYgcmVzZXRdOworICAgIGlucHV0ID0gYW5JbnB1dDsKK30KKworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pZ2V0VG9rZW5TdHJlYW0KK3sKKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZQoreworICAgIHJldHVybiBbaW5wdXQgZ2V0U291cmNlTmFtZV07Cit9CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KGludClydWxlSW5kZXgKK3sKKyAgICBbc3VwZXIgdHJhY2VJbjpydWxlTmFtZSBJbmRleDpydWxlSW5kZXggT2JqZWN0OltpbnB1dCBMVDoxXV07Cit9CisKKy0gKHZvaWQpIHRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpIHJ1bGVJbmRleAoreworICAgIFtzdXBlciB0cmFjZU91dDpydWxlTmFtZSBJbmRleDpydWxlSW5kZXggT2JqZWN0OltpbnB1dCBMVDoxXV07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODhjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJSdWxlUmV0dXJuU2NvcGUuaCIKKworQGludGVyZmFjZSBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSA6IEFOVExSUnVsZVJldHVyblNjb3BlIHsKKwlpZDxBTlRMUlRva2VuPiBzdGFydDsKKwlpZDxBTlRMUlRva2VuPiBzdG9wVG9rZW47Cit9CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFN0YXJ0LCBzZXR0ZXI9c2V0U3RhcnQ6KSBpZDxBTlRMUlRva2VuPiBzdGFydDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RvcCwgc2V0dGVyPXNldFN0b3A6KSAgIGlkPEFOVExSVG9rZW4+IHN0b3BUb2tlbjsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0YXJ0OworLSAodm9pZCkgc2V0U3RhcnQ6IChpZDxBTlRMUlRva2VuPikgYVN0YXJ0OworCistIChpZDxBTlRMUlRva2VuPikgZ2V0U3RvcDsKKy0gKHZvaWQpIHNldFN0b3A6IChpZDxBTlRMUlRva2VuPikgYVN0b3A7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzIzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tCkBAIC0wLDAgKzEsODAgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZQorCitAc3ludGhlc2l6ZSBzdGFydDsKK0BzeW50aGVzaXplIHN0b3BUb2tlbjsKKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFN0YXJ0Om5pbF07CisgICAgW3NlbGYgc2V0U3RvcDpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0YXJ0Cit7CisgICAgcmV0dXJuIHN0YXJ0OyAKK30KKworLSAodm9pZCkgc2V0U3RhcnQ6IChpZDxBTlRMUlRva2VuPikgYVN0YXJ0Cit7CisgICAgaWYgKHN0YXJ0ICE9IGFTdGFydCkgeworICAgICAgICBbYVN0YXJ0IHJldGFpbl07CisgICAgICAgIGlmICggc3RhcnQgKSBbc3RhcnQgcmVsZWFzZV07CisgICAgICAgIHN0YXJ0ID0gYVN0YXJ0OworICAgIH0KK30KKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3AKK3sKKyAgICByZXR1cm4gc3RvcFRva2VuOyAKK30KKworLSAodm9pZCkgc2V0U3RvcDogKGlkPEFOVExSVG9rZW4+KSBhU3RvcAoreworICAgIGlmIChzdG9wVG9rZW4gIT0gYVN0b3ApIHsKKyAgICAgICAgW2FTdG9wIHJldGFpbl07CisgICAgICAgIGlmICggc3RvcFRva2VuICkgW3N0b3BUb2tlbiByZWxlYXNlXTsKKyAgICAgICAgc3RvcFRva2VuID0gYVN0b3A7CisgICAgfQorfQorCisvLyBjcmVhdGUgYSBjb3B5LCBpbmNsdWRpbmcgdGhlIHRleHQgaWYgYXZhaWxhYmxlCisvLyB0aGUgaW5wdXQgc3RyZWFtIGlzICpub3QqIGNvcGllZCEKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmUKK3sKKyAgICBBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSAqY29weSA9IFtzdXBlciBjb3B5V2l0aFpvbmU6dGhlWm9uZV07CisgICAgY29weS5zdGFydCA9IHN0YXJ0OworICAgIGNvcHkuc3RvcFRva2VuID0gc3RvcFRva2VuOworICAgIHJldHVybiBjb3B5OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlB0ckJ1ZmZlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY5MjliCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJCdWZmZXIuaApAQCAtMCwwICsxLDkzIEBACisvLworLy8gIEFOVExSUHRyQnVmZmVyLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJMaW5rQmFzZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBCVUZGU0laRSAgICAgICAgIDEwMQorCitAaW50ZXJmYWNlIEFOVExSUHRyQnVmZmVyIDogQU5UTFJMaW5rQmFzZSB7CisgICAgTlNVSW50ZWdlciBCdWZmU2l6ZTsKKyAgICBOU1VJbnRlZ2VyIGNvdW50OworICAgIE5TVUludGVnZXIgcHRyOworICAgIF9fc3Ryb25nIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKKyAgICBfX3N0cm9uZyBpZCAqcHRyQnVmZmVyOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRCdWZmU2l6ZSwgc2V0dGVyPXNldEJ1ZmZTaXplOikgTlNVSW50ZWdlciBCdWZmU2l6ZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWdldENvdW50LCBzZXR0ZXI9c2V0Q291bnQ6KSBOU1VJbnRlZ2VyIGNvdW50OworQHByb3BlcnR5IChnZXR0ZXI9Z2V0UHRyLCBzZXR0ZXI9c2V0UHRyOikgTlNVSW50ZWdlciBwdHI7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEJ1ZmZlciwgc2V0dGVyPXNldEJ1ZmZlcjopIE5TTXV0YWJsZURhdGEgKmJ1ZmZlcjsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0UHRyQnVmZmVyLCBzZXR0ZXI9c2V0UHRyQnVmZmVyOikgaWQgKnB0ckJ1ZmZlcjsKKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcjsKKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcldpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKGlkKWluaXQ7CistKGlkKWluaXRXaXRoTGVuOihOU1VJbnRlZ2VyKWNudDsKKy0odm9pZClkZWFsbG9jOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy8qIGNsZWFyIC0tIHJlaW5pdGlhbGl6ZSB0aGUgbWFwbGlzdCBhcnJheSAqLworLSAodm9pZCkgY2xlYXI7CisKKy0gKE5TVUludGVnZXIpY291bnQ7CistIChOU1VJbnRlZ2VyKWxlbmd0aDsKKy0gKE5TVUludGVnZXIpc2l6ZTsKKworLSAoTlNNdXRhYmxlRGF0YSAqKWdldEJ1ZmZlcjsKKy0gKHZvaWQpc2V0QnVmZmVyOihOU011dGFibGVEYXRhICopbnA7CistIChOU1VJbnRlZ2VyKWdldENvdW50OworLSAodm9pZClzZXRDb3VudDooTlNVSW50ZWdlcilhQ291bnQ7CistIChpZCAqKWdldFB0ckJ1ZmZlcjsKKy0gKHZvaWQpc2V0UHRyQnVmZmVyOihpZCAqKW5wOworLSAoTlNVSW50ZWdlcilnZXRQdHI7CistICh2b2lkKXNldFB0cjooTlNVSW50ZWdlcilucDsKKworLSAodm9pZCkgcHVzaDooaWQpIHY7CistIChpZCkgcG9wOworLSAoaWQpIHBlZWs7CisKKy0gKHZvaWQpIGFkZE9iamVjdDooaWQpIHY7CistICh2b2lkKSBhZGRPYmplY3RzRnJvbUFycmF5OihBTlRMUlB0ckJ1ZmZlciAqKWFuQXJyYXk7CistICh2b2lkKSBpbnNlcnRPYmplY3Q6KGlkKWFSdWxlIGF0SW5kZXg6KE5TVUludGVnZXIpaWR4OworLSAoaWQpICAgb2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcilpZHg7CistICh2b2lkKSByZW1vdmVBbGxPYmplY3RzOworLSAodm9pZClyZW1vdmVPYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4OworCistICh2b2lkKSBlbnN1cmVDYXBhY2l0eTooTlNVSW50ZWdlcikgaW5kZXg7CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlB0ckJ1ZmZlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJCdWZmZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTJhN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJCdWZmZXIubQpAQCAtMCwwICsxLDM1MyBAQAorLy8KKy8vICBBTlRMUlB0ckJ1ZmZlci5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorCisvKgorICogU3RhcnQgb2YgQU5UTFJQdHJCdWZmZXIKKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSUHRyQnVmZmVyCisKK0BzeW50aGVzaXplIEJ1ZmZTaXplOworQHN5bnRoZXNpemUgYnVmZmVyOworQHN5bnRoZXNpemUgcHRyQnVmZmVyOworQHN5bnRoZXNpemUgY291bnQ7CitAc3ludGhlc2l6ZSBwdHI7CisKKysoQU5UTFJQdHJCdWZmZXIgKiluZXdBTlRMUlB0ckJ1ZmZlcgoreworICAgIHJldHVybiBbW0FOVExSUHRyQnVmZmVyIGFsbG9jXSBpbml0XTsKK30KKworKyhBTlRMUlB0ckJ1ZmZlciAqKW5ld0FOVExSUHRyQnVmZmVyV2l0aExlbjooTlNJbnRlZ2VyKWNudAoreworICAgIHJldHVybiBbW0FOVExSUHRyQnVmZmVyIGFsbG9jXSBpbml0V2l0aExlbjpjbnRdOworfQorCistKGlkKWluaXQKK3sKKyAgICBOU1VJbnRlZ2VyIGlkeDsKKyAgICAKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIEJ1ZmZTaXplICA9IEJVRkZTSVpFOworICAgICAgICBwdHIgPSAwOworICAgICAgICBidWZmZXIgPSBbW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6KE5TVUludGVnZXIpQnVmZlNpemUgKiBzaXplb2YoaWQpXSByZXRhaW5dOworICAgICAgICBwdHJCdWZmZXIgPSAoaWQgKikgW2J1ZmZlciBtdXRhYmxlQnl0ZXNdOworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgIHB0ckJ1ZmZlcltpZHhdID0gbmlsOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsKKyAgICB9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0oaWQpaW5pdFdpdGhMZW46KE5TVUludGVnZXIpY250Cit7CisgICAgTlNVSW50ZWdlciBpZHg7CisgICAgCisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBCdWZmU2l6ZSAgPSBjbnQ7CisgICAgICAgIHB0ciA9IDA7CisgICAgICAgIGJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDooTlNVSW50ZWdlcilCdWZmU2l6ZSAqIHNpemVvZihpZCldIHJldGFpbl07CisgICAgICAgIHB0ckJ1ZmZlciA9IChpZCAqKVtidWZmZXIgbXV0YWJsZUJ5dGVzXTsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBCdWZmU2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICBwdHJCdWZmZXJbaWR4XSA9IG5pbDsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IDA7CisgICAgfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlB0ckJ1ZmZlciIgKTsKKyNlbmRpZgorICAgIEFOVExSTGlua0Jhc2UgKnRtcCwgKnJ0bXA7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKyAgICBpZiAoIHNlbGYuZk5leHQgIT0gbmlsICkgeworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgICAgIHRtcCA9IHB0ckJ1ZmZlcltpZHhdOworICAgICAgICAgICAgd2hpbGUgKCB0bXAgKSB7CisgICAgICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgICAgICBpZiAoW3RtcCBpc0tpbmRPZkNsYXNzOltBTlRMUkxpbmtCYXNlIGNsYXNzXV0pCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IChpZCl0bXAuZk5leHQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0bXAgPSBuaWw7CisgICAgICAgICAgICAgICAgW3J0bXAgcmVsZWFzZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgW2J1ZmZlciByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJQdHJCdWZmZXIgKmNvcHk7CisgICAgCisgICAgY29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworICAgIGlmICggYnVmZmVyICkKKyAgICAgICAgY29weS5idWZmZXIgPSBbYnVmZmVyIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS5wdHJCdWZmZXIgPSBwdHJCdWZmZXI7CisgICAgY29weS5wdHIgPSBwdHI7CisgICAgcmV0dXJuIGNvcHk7Cit9CisKKy0gKHZvaWQpY2xlYXIKK3sKKyAgICBBTlRMUkxpbmtCYXNlICp0bXAsICpydG1wOworICAgIE5TSW50ZWdlciBpZHg7CisKKyAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEJ1ZmZTaXplOyBpZHgrKyApIHsKKyAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgIHdoaWxlICggdG1wICkgeworICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgIGlmIChbdG1wIGlzS2luZE9mQ2xhc3M6W0FOVExSTGlua0Jhc2UgY2xhc3NdXSkKKyAgICAgICAgICAgICAgICB0bXAgPSAoaWQpdG1wLmZOZXh0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRtcCA9IG5pbDsKKyAgICAgICAgICAgIFtydG1wIGRlYWxsb2NdOworICAgICAgICB9CisgICAgICAgIHB0ckJ1ZmZlcltpZHhdID0gbmlsOworICAgIH0KKyAgICBjb3VudCA9IDA7Cit9CisKKy0gKE5TTXV0YWJsZURhdGEgKilnZXRCdWZmZXIKK3sKKyAgICByZXR1cm4oIGJ1ZmZlciApOworfQorCistICh2b2lkKXNldEJ1ZmZlcjooTlNNdXRhYmxlRGF0YSAqKW5wCit7CisgICAgYnVmZmVyID0gbnA7Cit9CisKKy0gKE5TVUludGVnZXIpZ2V0Q291bnQKK3sKKyAgICByZXR1cm4oIGNvdW50ICk7Cit9CisKKy0gKHZvaWQpc2V0Q291bnQ6KE5TVUludGVnZXIpYUNvdW50Cit7CisgICAgY291bnQgPSBhQ291bnQ7Cit9CisKKy0gKGlkICopZ2V0UHRyQnVmZmVyCit7CisgICAgcmV0dXJuKCBwdHJCdWZmZXIgKTsKK30KKworLSAodm9pZClzZXRQdHJCdWZmZXI6KGlkICopbnAKK3sKKyAgICBwdHJCdWZmZXIgPSBucDsKK30KKworLSAoTlNVSW50ZWdlcilnZXRQdHIKK3sKKyAgICByZXR1cm4oIHB0ciApOworfQorCistICh2b2lkKXNldFB0cjooTlNVSW50ZWdlcilhUHRyCit7CisgICAgcHRyID0gYVB0cjsKK30KKworLSAodm9pZCkgYWRkT2JqZWN0OihpZCkgdgoreworICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OnB0cl07CisgICAgaWYgKCB2ICkgW3YgcmV0YWluXTsKKyAgICBwdHJCdWZmZXJbcHRyKytdID0gdjsKKyAgICBjb3VudCsrOworfQorCistICh2b2lkKSBwdXNoOihpZCkgdgoreworICAgIGlmICggcHRyID49IEJ1ZmZTaXplIC0gMSApIHsKKyAgICAgICAgW3NlbGYgZW5zdXJlQ2FwYWNpdHk6cHRyXTsKKyAgICB9CisgICAgaWYgKCB2ICkgW3YgcmV0YWluXTsKKyAgICBwdHJCdWZmZXJbcHRyKytdID0gdjsKKyAgICBjb3VudCsrOworfQorCistIChpZCkgcG9wCit7CisgICAgaWQgdiA9IG5pbDsKKyAgICBpZiAoIHB0ciA+IDAgKSB7CisgICAgICAgIHYgPSBwdHJCdWZmZXJbLS1wdHJdOworICAgICAgICBwdHJCdWZmZXJbcHRyXSA9IG5pbDsKKyAgICB9CisgICAgY291bnQtLTsKKyAgICBpZiAoIHYgKSBbdiByZWxlYXNlXTsKKyAgICByZXR1cm4gdjsKK30KKworLSAoaWQpIHBlZWsKK3sKKyAgICBpZCB2ID0gbmlsOworICAgIGlmICggcHRyID4gMCApIHsKKyAgICAgICAgdiA9IHB0ckJ1ZmZlcltwdHItMV07CisgICAgfQorICAgIHJldHVybiB2OworfQorCistIChOU1VJbnRlZ2VyKWNvdW50Cit7CisjaWZkZWYgRE9OVFVTRU5PTU8KKyAgICBpbnQgY250ID0gMDsKKyAgICAKKyAgICBmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKysgKSB7CisgICAgICAgIGlmICggcHRyQnVmZmVyW2ldICE9IG5pbCApIHsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICggY250ICE9IGNvdW50ICkgY291bnQgPSBjbnQ7CisjZW5kaWYKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy0gKE5TVUludGVnZXIpbGVuZ3RoCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistIChOU1VJbnRlZ2VyKXNpemUKK3sKKyAgICBOU1VJbnRlZ2VyIGFTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZTaXplOyBpKysgKSB7CisgICAgICAgIGlmIChwdHJCdWZmZXJbaV0gIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSArPSBzaXplb2YoaWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihpZClhUnVsZSBhdEluZGV4OihOU1VJbnRlZ2VyKWlkeAoreworICAgIGlmICggaWR4ID49IEJ1ZmZTaXplICkgeworICAgICAgICBbc2VsZiBlbnN1cmVDYXBhY2l0eTppZHhdOworICAgIH0KKyAgICBpZiAoIGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICBpZiAoIHB0ckJ1ZmZlcltpZHhdICkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBpZiAoIGFSdWxlICkgW2FSdWxlIHJldGFpbl07CisgICAgfQorICAgIHB0ckJ1ZmZlcltpZHhdID0gYVJ1bGU7CisgICAgY291bnQrKzsKK30KKworLSAoaWQpb2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGlkeCA8IEJ1ZmZTaXplICkgeworICAgICAgICByZXR1cm4gcHRyQnVmZmVyW2lkeF07CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpYWRkT2JqZWN0c0Zyb21BcnJheTooQU5UTFJQdHJCdWZmZXIgKilhbkFycmF5Cit7CisgICAgTlNJbnRlZ2VyIGNudCwgaTsKKyAgICBjbnQgPSBbYW5BcnJheSBjb3VudF07CisgICAgZm9yKCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGlkIHRtcCA9IFthbkFycmF5IG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggdG1wICkgW3RtcCByZXRhaW5dOworICAgICAgICBbc2VsZiBpbnNlcnRPYmplY3Q6dG1wIGF0SW5kZXg6aV07CisgICAgfQorICAgIGNvdW50ICs9IGNudDsKKyAgICByZXR1cm47Cit9CisKKy0gKHZvaWQpcmVtb3ZlQWxsT2JqZWN0cworeworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKCBwdHJCdWZmZXJbaV0gKSBbcHRyQnVmZmVyW2ldIHJlbGVhc2VdOworICAgICAgICBwdHJCdWZmZXJbaV0gPSBuaWw7CisgICAgfQorICAgIGNvdW50ID0gMDsKKyAgICBwdHIgPSAwOworfQorCistICh2b2lkKXJlbW92ZU9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoIGlkeCA+PSAwICYmIGlkeCA8IGNvdW50ICkgeworICAgICAgICBpZiAoIHB0ckJ1ZmZlcltpZHhdICkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBmb3IgKCBpID0gaWR4OyBpIDwgY291bnQtMTsgaSsrICkgeworICAgICAgICAgICAgcHRyQnVmZmVyW2ldID0gcHRyQnVmZmVyW2krMV07CisgICAgICAgIH0KKyAgICAgICAgcHRyQnVmZmVyW2ldID0gbmlsOworICAgICAgICBjb3VudC0tOworICAgIH0KK30KKworLSAodm9pZCkgZW5zdXJlQ2FwYWNpdHk6KE5TVUludGVnZXIpIGFuSW5kZXgKK3sKKyAgICBpZiAoKGFuSW5kZXggKiBzaXplb2YoaWQpKSA+PSBbYnVmZmVyIGxlbmd0aF0pCisgICAgeworICAgICAgICBOU0ludGVnZXIgbmV3U2l6ZSA9IChbYnVmZmVyIGxlbmd0aF0gLyBzaXplb2YoaWQpKSAqIDI7CisgICAgICAgIGlmIChhbkluZGV4ID4gbmV3U2l6ZSkgeworICAgICAgICAgICAgbmV3U2l6ZSA9IGFuSW5kZXggKyAxOworICAgICAgICB9CisgICAgICAgIEJ1ZmZTaXplID0gbmV3U2l6ZTsKKyAgICAgICAgW2J1ZmZlciBzZXRMZW5ndGg6KEJ1ZmZTaXplICogc2l6ZW9mKGlkKSldOworICAgICAgICBwdHJCdWZmZXIgPSBbYnVmZmVyIG11dGFibGVCeXRlc107CisgICAgfQorfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworICAgIE5TTXV0YWJsZVN0cmluZyAqc3RyOworICAgIE5TSW50ZWdlciBpZHgsIGNudDsKKyAgICBjbnQgPSBbc2VsZiBjb3VudF07CisgICAgc3RyID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoQ2FwYWNpdHk6MzBdOworICAgIFtzdHIgYXBwZW5kU3RyaW5nOkAiWyJdOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY250OyBpZHgrKyApIHsKKyAgICAgICAgW3N0ciBhcHBlbmRTdHJpbmc6W1tzZWxmIG9iamVjdEF0SW5kZXg6aWR4XSBkZXNjcmlwdGlvbl1dOworICAgIH0KKyAgICBbc3RyIGFwcGVuZFN0cmluZzpAIl0iXTsKKyAgICByZXR1cm4gc3RyOworfQorCistIChOU1N0cmluZyAqKSB0b1N0cmluZworeworICAgIHJldHVybiBbc2VsZiBkZXNjcmlwdGlvbl07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyU3RhY2suaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWE2NWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJTdGFjay5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vCisvLyAgQU5UTFJQdHJTdGFjay5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgQWxhbidzIE1hY2hpbmVXb3Jrcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vcHRyQnVmZmVyCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJSdWxlTWVtby5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSUHRyU3RhY2sgOiBBTlRMUkJhc2VTdGFjayB7CisJLy9BTlRMUlB0clN0YWNrICpmTmV4dDsKKyAgICAvLyBUU3RyaW5nUG9vbCAqZlBvb2w7Cit9CisKKy8vQHByb3BlcnR5IChjb3B5KSBBTlRMUlB0clN0YWNrICpmTmV4dDsKKy8vQHByb3BlcnR5IChjb3B5KSBUU3RyaW5nUG9vbCAqZlBvb2w7CisKKy8vIENvbnRydWN0aW9uL0Rlc3RydWN0aW9uCisrIChBTlRMUlB0clN0YWNrICopbmV3QU5UTFJQdHJTdGFjazsKKysgKEFOVExSUHRyU3RhY2sgKiluZXdBTlRMUlB0clN0YWNrOihOU0ludGVnZXIpY250OworLSAoaWQpaW5pdDsKKy0gKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpYUxlbjsKKy0gKHZvaWQpZGVhbGxvYzsKKworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisvKiBjbGVhciAtLSByZWluaXRpYWxpemUgdGhlIG1hcGxpc3QgYXJyYXkgKi8KKworI2lmZGVmIERPTlRVU0VOT01PCisvKiBmb3JtIGhhc2ggdmFsdWUgZm9yIHN0cmluZyBzICovCistIChOU0ludGVnZXIpaGFzaDooTlNTdHJpbmcgKilzOworLyogICBsb29rIGZvciBzIGluIHB0ckJ1ZmZlciAgKi8KKy0gKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzOworLyogbG9vayBmb3IgcyBpbiBwdHJCdWZmZXIgICovCistIChpZClpbnN0YWxsOihpZClzeW07CisjZW5kaWYKKworI2lmZGVmIERPTlRVU0VOT01PCistIChpZClnZXRUVHlwZTooTlNTdHJpbmcgKiluYW1lOworLSAoaWQpZ2V0TmFtZTooTlNJbnRlZ2VyKXR0eXBlOworI2VuZGlmCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyU3RhY2subSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUHRyU3RhY2subQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjE4MGYyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJQdHJTdGFjay5tCkBAIC0wLDAgKzEsMTkxIEBACisvLworLy8gIEFOVExSUHRyU3RhY2subQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gIENvcHlyaWdodCAyMDEwIEFsYW4ncyBNYWNoaW5lV29ya3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworI2RlZmluZSBTVUNDRVNTICgwKQorI2RlZmluZSBGQUlMVVJFICgtMSkKKworI2ltcG9ydCAiQU5UTFJQdHJTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJUcmVlLmgiCisKKy8qCisgKiBTdGFydCBvZiBBTlRMUlB0clN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlB0clN0YWNrCisKKysoQU5UTFJQdHJTdGFjayAqKW5ld0FOVExSUHRyU3RhY2sKK3sKKyAgICByZXR1cm4gW1tBTlRMUlB0clN0YWNrIGFsbG9jXSBpbml0XTsKK30KKworKyhBTlRMUlB0clN0YWNrICopbmV3QU5UTFJQdHJTdGFjazooTlNJbnRlZ2VyKWNudAoreworICAgIHJldHVybiBbW0FOVExSUHRyU3RhY2sgYWxsb2NdIGluaXRXaXRoTGVuOmNudF07Cit9CisKKy0oaWQpaW5pdAoreworCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46SEFTSFNJWkVdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKGlkKWluaXRXaXRoTGVuOihOU0ludGVnZXIpY250Cit7CisJc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpjbnRdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlB0clN0YWNrIiApOworI2VuZGlmCisJW3N1cGVyIGRlYWxsb2NdOworfQorCistKHZvaWQpZGVsZXRlQU5UTFJQdHJTdGFjazooQU5UTFJQdHJTdGFjayAqKW5wCit7CisgICAgQU5UTFJMaW5rQmFzZSAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgQnVmZlNpemU7IGlkeCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCApIHsKKyAgICAgICAgICAgICAgICBydG1wID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IFt0bXAgZ2V0Zk5leHRdOworICAgICAgICAgICAgICAgIFtydG1wIHJlbGVhc2VdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjaWZkZWYgRE9OVFVTRU5PTU8KKyNpZmRlZiBVU0VSRE9DCisvKgorICogIEhBU0ggICAgICAgIGhhc2ggZW50cnkgdG8gZ2V0IGluZGV4IHRvIHRhYmxlCisgKiAgTlNJbnRlZ2VyIGhhc2goIEFOVExSUHRyU3RhY2sgKnNlbGYsIGNoYXIgKnMgKTsKKyAqCisgKiAgICAgSW5wdXRzOiAgTlNTdHJpbmcgKnMgICAgICAgICBzdHJpbmcgdG8gZmluZAorICoKKyAqICAgICBSZXR1cm5zOiBOU0ludGVnZXIgICAgICAgICAgICAgICAgIGhhc2hlZCB2YWx1ZQorICoKKyAqICBMYXN0IFJldmlzaW9uIDkvMDMvOTAKKyAqLworI2VuZGlmCistKE5TSW50ZWdlciloYXNoOihOU1N0cmluZyAqKXMgICAgICAgLyogICAgZm9ybSBoYXNoIHZhbHVlIGZvciBzdHJpbmcgcyAqLworeworCU5TSW50ZWdlciBoYXNodmFsOworCWNvbnN0IGNoYXIgKnRtcDsKKyAgICAKKwl0bXAgPSBbcyBjU3RyaW5nVXNpbmdFbmNvZGluZzpOU0FTQ0lJU3RyaW5nRW5jb2RpbmddOworCWZvciggaGFzaHZhbCA9IDA7ICp0bXAgIT0gJ1wwJzsgKQorICAgICAgICBoYXNodmFsICs9ICp0bXArKzsKKwlMYXN0SGFzaCA9IGhhc2h2YWwgJSBIYXNoU2l6ZTsKKwlyZXR1cm4oIExhc3RIYXNoICk7Cit9CisKKyNpZmRlZiBVU0VSRE9DCisvKgorICogIExPT0tVUCAgc2VhcmNoIGhhc2hlZCBsaXN0IGZvciBlbnRyeQorICogIGlkIGxvb2t1cDooTlNTdHJpbmcgKilzOworICoKKyAqICAgICBJbnB1dHM6ICBOU1N0cmluZyAgKnMgICAgICAgc3RyaW5nIHRvIGZpbmQKKyAqCisgKiAgICAgUmV0dXJuczogQU5UTFJSdWxlTWVtbyAgKiAgICAgICAgcG9pbnRlciB0byBlbnRyeQorICoKKyAqICBMYXN0IFJldmlzaW9uIDkvMDMvOTAKKyAqLworI2VuZGlmCistKGlkKWxvb2t1cDooTlNTdHJpbmcgKilzCit7CisgICAgQU5UTFJMaW5rQmFzZSAqbnA7CisgICAgCisgICAgZm9yKCBucCA9IHB0ckJ1ZmZlcltbc2VsZiBoYXNoOnNdXTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggW3MgaXNFcXVhbFRvU3RyaW5nOltucCBnZXROYW1lXV0gKSB7CisgICAgICAgICAgICByZXR1cm4oIG5wICk7ICAgICAgICAvKiAgIGZvdW5kIGl0ICAgICAgICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKCBuaWwgKTsgICAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworI2lmZGVmIFVTRVJET0MKKy8qCisgKiAgSU5TVEFMTCBzZWFyY2ggaGFzaGVkIGxpc3QgZm9yIGVudHJ5CisgKiAgTlNJbnRlZ2VyIGluc3RhbGwoIEFOVExSUHRyU3RhY2sgKnNlbGYsIGlkIHN5bSApOworICoKKyAqICAgICBJbnB1dHM6ICBBTlRMUlJ1bGVNZW1vICAgICpzeW0gICAtLSBzeW1ib2wgcHRyIHRvIGluc3RhbGwKKyAqICAgICAgICAgICAgICBOU0ludGVnZXIgICAgICAgICBzY29wZSAtLSBsZXZlbCB0byBmaW5kCisgKgorICogICAgIFJldHVybnM6IEJvb2xlYW4gICAgIFRSVUUgICBpZiBpbnN0YWxsZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSAgaWYgYWxyZWFkeSBpbiB0YWJsZQorICoKKyAqICBMYXN0IFJldmlzaW9uIDkvMDMvOTAKKyAqLworI2VuZGlmCistKGlkKWluc3RhbGw6KGlkKXN5bQoreworICAgIEFOVExSTGlua0Jhc2UgKm5wOworICAgIAorICAgIG5wID0gW3NlbGYgbG9va3VwOltzeW0gZ2V0TmFtZV1dOworICAgIGlmICggbnAgPT0gbmlsICkgeworICAgICAgICBbc3ltIHNldEZOZXh0OnB0ckJ1ZmZlclsgTGFzdEhhc2ggXV07CisgICAgICAgIHB0ckJ1ZmZlclsgTGFzdEhhc2ggXSA9IFtzeW0gcmV0YWluXTsKKyAgICAgICAgcmV0dXJuKCBwdHJCdWZmZXJbIExhc3RIYXNoIF0gKTsKKyAgICB9CisgICAgcmV0dXJuKCBuaWwgKTsgICAgICAgICAgICAvKiAgIG5vdCBmb3VuZCAgICAgICovCit9CisjZW5kaWYKKworLShpZClnZXRwdHJCdWZmZXJFbnRyeTooTlNJbnRlZ2VyKWlkeAoreworCXJldHVybiggcHRyQnVmZmVyW2lkeF0gKTsKK30KKworLShpZCAqKWdldHB0ckJ1ZmZlcgoreworCXJldHVybiggcHRyQnVmZmVyICk7Cit9CisKKy0odm9pZClzZXRwdHJCdWZmZXI6KGlkICopbnAKK3sKKyAgICBwdHJCdWZmZXIgPSBucDsKK30KKworI2lmZGVmIERPTlRVU0VOT01PCisvKgorICogd29ya3Mgb25seSBmb3IgbWFwbGlzdCBpbmRleGVkIG5vdCBieSBuYW1lIGJ1dCBieSBUb2tlbk51bWJlcgorICovCistIChpZClnZXROYW1lOihOU0ludGVnZXIpdHR5cGUKK3sKKyAgICBpZCBucDsKKyAgICBOU0ludGVnZXIgYVRUeXBlOworCisgICAgYVRUeXBlID0gdHR5cGUgJSBIYXNoU2l6ZTsKKyAgICBmb3IoIG5wID0gcHRyQnVmZmVyW3R0eXBlXTsgbnAgIT0gbmlsOyBucCA9IFtucCBnZXRmTmV4dF0gKSB7CisgICAgICAgIGlmICggbnAuaW5kZXggPT0gdHR5cGUgKSB7CisgICAgICAgICAgICByZXR1cm4oIG5wICk7ICAgICAgICAvKiAgIGZvdW5kIGl0ICAgICAgICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuKCBuaWwgKTsgICAgICAgICAgICAgIC8qICAgbm90IGZvdW5kICAgICAgKi8KK30KKworLSAoaWQpZ2V0VFR5cGU6KE5TU3RyaW5nICopbmFtZQoreworICAgIHJldHVybiBbc2VsZiBsb29rdXA6bmFtZV07Cit9CisjZW5kaWYKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICByZXR1cm4gW3N1cGVyIGNvcHlXaXRoWm9uZTphWm9uZV07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmVhZGVyU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlYWRlclN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDE5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlYWRlclN0cmVhbS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vCisvLyAgQW50bHJSZWFkZXJTdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gMi8yMS8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuJ3MgTWFjaGluZVdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSU3RyaW5nU3RyZWFtLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWFkZXJTdHJlYW0gOiBBTlRMUlN0cmluZ1N0cmVhbSB7CisgICAgTlNGaWxlSGFuZGxlICpmaDsKKyAgICBOU0ludGVnZXIgc2l6ZTsKKyAgICBOU0ludGVnZXIgcmJTaXplOworICAgIC8vTlNEYXRhICpkYXRhOyAvKiBBTlRMUlN0cmluZ1N0cmVhbSBoYXMgTlNTdHJpbmcgKmRhdGEgKi8KK30KKworQHByb3BlcnR5IChyZXRhaW4pIE5TRmlsZUhhbmRsZSAqZmg7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIHNpemU7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIHJiU2l6ZTsKKy8vQHByb3BlcnR5IChyZXRhaW4pIE5TRGF0YSAqZGF0YTsKKworKyAoTlNJbnRlZ2VyKSBSRUFEX0JVRkZFUl9TSVpFOworKyAoTlNJbnRlZ2VyKSBJTklUSUFMX0JVRkZFUl9TSVpFOworCisrIChpZCkgbmV3QU5UTFJSZWFkZXJTdHJlYW07CisrIChpZCkgbmV3QU5UTFJSZWFkZXJTdHJlYW06KE5TRmlsZUhhbmRsZSAqKXI7CisrIChpZCkgbmV3QU5UTFJSZWFkZXJTdHJlYW06KE5TRmlsZUhhbmRsZSAqKXIgc2l6ZTooTlNJbnRlZ2VyKWFTaXplOworKyAoaWQpIG5ld0FOVExSUmVhZGVyU3RyZWFtOihOU0ZpbGVIYW5kbGUgKilyIHNpemU6KE5TSW50ZWdlcilhU2l6ZSByZWFkQnVmZmVyU2l6ZTooTlNJbnRlZ2VyKWFSZWFkQ2h1bmtTaXplOworLSAoaWQpIGluaXRXaXRoUmVhZGVyOihOU0ZpbGVIYW5kbGUgKilyIHNpemU6KE5TSW50ZWdlcilhU2l6ZSByZWFkQnVmZmVyU2l6ZTooTlNJbnRlZ2VyKWFSZWFkQ2h1bmtTaXplOworLSAodm9pZCkgbG9hZDooTlNJbnRlZ2VyKWFTaXplIHJlYWRCdWZmZXJTaXplOihOU0ludGVnZXIpYVJlYWRDaHVua1NpemU7CistICh2b2lkKSBjbG9zZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWFkZXJTdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmVhZGVyU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxYjgyNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmVhZGVyU3RyZWFtLm0KQEAgLTAsMCArMSwxNTMgQEAKKy8vCisvLyAgQU5UTFJSZWFkZXJTdHJlYW0ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gMi8yMS8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuJ3MgTWFjaGluZVdvcmtzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiQU5UTFJSZWFkZXJTdHJlYW0uaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJSZWFkZXJTdHJlYW0KKworQHN5bnRoZXNpemUgZmg7CitAc3ludGhlc2l6ZSBzaXplOworQHN5bnRoZXNpemUgcmJTaXplOworCitzdGF0aWMgTlNJbnRlZ2VyIFJFQURfQlVGRkVSX1NJWkUgPSAxMDI0Oworc3RhdGljIE5TSW50ZWdlciBJTklUSUFMX0JVRkZFUl9TSVpFID0gMTAyNDsKKworKyAoTlNJbnRlZ2VyKSBSRUFEX0JVRkZFUl9TSVpFCit7CisgICAgcmV0dXJuIFJFQURfQlVGRkVSX1NJWkU7Cit9CisKKysgKE5TSW50ZWdlcikgSU5JVElBTF9CVUZGRVJfU0laRQoreworICAgIHJldHVybiBJTklUSUFMX0JVRkZFUl9TSVpFOworfQorCisrIChpZCkgbmV3QU5UTFJSZWFkZXJTdHJlYW0KK3sKKyAgICByZXR1cm4gW1tBTlRMUlJlYWRlclN0cmVhbSBhbGxvY10gaW5pdF07Cit9CisKKysgKGlkKSBuZXdBTlRMUlJlYWRlclN0cmVhbTooTlNGaWxlSGFuZGxlICopcgoreworICAgIHJldHVybiBbW0FOVExSUmVhZGVyU3RyZWFtIGFsbG9jXSBpbml0V2l0aFJlYWRlcjpyIHNpemU6SU5JVElBTF9CVUZGRVJfU0laRSByZWFkQnVmZmVyU2l6ZTpSRUFEX0JVRkZFUl9TSVpFXTsKK30KKworKyAoaWQpIG5ld0FOVExSUmVhZGVyU3RyZWFtOihOU0ZpbGVIYW5kbGUgKilyIHNpemU6KE5TSW50ZWdlcilhU2l6ZQoreworICAgIHJldHVybiBbW0FOVExSUmVhZGVyU3RyZWFtIGFsbG9jXSBpbml0V2l0aFJlYWRlcjpyIHNpemU6YVNpemUgcmVhZEJ1ZmZlclNpemU6UkVBRF9CVUZGRVJfU0laRV07Cit9CisKKysgKGlkKSBuZXdBTlRMUlJlYWRlclN0cmVhbTooTlNGaWxlSGFuZGxlICopciBzaXplOihOU0ludGVnZXIpYVNpemUgcmVhZEJ1ZmZlclNpemU6KE5TSW50ZWdlcilhUmVhZENodW5rU2l6ZQoreworLy8gICAgbG9hZChyLCBhU2l6ZSwgYVJlYWRDaHVua1NpemUpOworICAgIHJldHVybiBbW0FOVExSUmVhZGVyU3RyZWFtIGFsbG9jXSBpbml0V2l0aFJlYWRlcjpyIHNpemU6YVNpemUgcmVhZEJ1ZmZlclNpemU6YVJlYWRDaHVua1NpemVdOworfQorCistIChpZCkgaW5pdAoreworCXNlbGYgPSBbc3VwZXIgaW5pdF07CisJaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgZmggPSBuaWw7CisgICAgICAgIHJiU2l6ZSA9IFJFQURfQlVGRkVSX1NJWkU7CisgICAgICAgIHNpemUgPSBJTklUSUFMX0JVRkZFUl9TSVpFOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoUmVhZGVyOihOU0ZpbGVIYW5kbGUgKilyIHNpemU6KE5TSW50ZWdlcilhU2l6ZSByZWFkQnVmZmVyU2l6ZTooTlNJbnRlZ2VyKWFSZWFkQ2h1bmtTaXplCit7CisJc2VsZiA9IFtzdXBlciBpbml0XTsKKwlpZiAoIHNlbGYgIT0gbmlsICkgeworICAgICAgICBmaCA9IHI7CisgICAgICAgIHJiU2l6ZSA9IGFTaXplOworICAgICAgICBzaXplID0gYVJlYWRDaHVua1NpemU7CisgICAgICAgIFtzZWxmIGxvYWQ6YVNpemUgcmVhZEJ1ZmZlclNpemU6YVJlYWRDaHVua1NpemVdOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgbG9hZDooTlNJbnRlZ2VyKWFTaXplIHJlYWRCdWZmZXJTaXplOihOU0ludGVnZXIpYVJlYWRDaHVua1NpemUKK3sKKyAgICBOU0RhdGEgKnJldERhdGEgPSBuaWw7CisgICAgaWYgKCBmaD09bmlsICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICggYVNpemU8PTAgKSB7CisgICAgICAgIGFTaXplID0gSU5JVElBTF9CVUZGRVJfU0laRTsKKyAgICB9CisgICAgaWYgKCBhUmVhZENodW5rU2l6ZTw9MCApIHsKKyAgICAgICAgYVJlYWRDaHVua1NpemUgPSBSRUFEX0JVRkZFUl9TSVpFOworICAgIH0KKyNwcmFnbWEgbWFyayBmaXggdGhlc2UgTlNMb2cgY2FsbHMKKyAgICBAdHJ5IHsKKyAgICAgICAgaW50IG51bVJlYWQ9MDsKKyAgICAgICAgaW50IHAxID0gMDsKKyAgICAgICAgcmV0RGF0YSA9IFtmaCByZWFkRGF0YVRvRW5kT2ZGaWxlXTsKKyAgICAgICAgbnVtUmVhZCA9IFtyZXREYXRhIGxlbmd0aF07CisgICAgICAgIE5TTG9nKCBAInJlYWQgJWQgY2hhcnM7IHAgd2FzICVkIGlzIG5vdyAlZCIsIG4sIHAxLCAocDErbnVtUmVhZCkgKTsKKyAgICAgICAgcDEgKz0gbnVtUmVhZDsKKyAgICAgICAgbiA9IHAxOworICAgICAgICBkYXRhID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOnJldERhdGEgZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKyAgICAgICAgTlNMb2coIEAibj0lZCIsIG4gKTsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICBbZmggY2xvc2VGaWxlXTsKKyAgICB9Cit9CisKKy0gKHZvaWQpc2V0VXBTdHJlYW1Gb3JGaWxlOihOU1N0cmluZyAqKXBhdGggeworICAgIC8vIGlTdHJlYW0gaXMgTlNJbnB1dFN0cmVhbSBpbnN0YW5jZSB2YXJpYWJsZQorICAgIE5TSW5wdXRTdHJlYW0gKmlTdHJlYW0gPSBbW05TSW5wdXRTdHJlYW0gYWxsb2NdIGluaXRXaXRoRmlsZUF0UGF0aDpwYXRoXTsKKy8vICAgIFtpU3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOworICAgIFtpU3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdCisgICAgICAgICAgICAgICAgICAgICAgIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpU3RyZWFtIG9wZW5dOworfQorCistICh2b2lkKXN0cmVhbTooTlNTdHJlYW0gKilzdHJlYW0gaGFuZGxlRXZlbnQ6KE5TU3RyZWFtRXZlbnQpZXZlbnRDb2RlCit7CisgICAgTlNNdXRhYmxlRGF0YSAqbXlEYXRhID0gbmlsOworICAgIE5TTnVtYmVyICpieXRlc1JlYWQgPSBbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6MF07CisgICAgc3dpdGNoKGV2ZW50Q29kZSkgeworICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIW15RGF0YSkgeworICAgICAgICAgICAgICAgIG15RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhXSByZXRhaW5dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBidWZbMTAyNF07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgIGxlbiA9IFsoTlNJbnB1dFN0cmVhbSAqKXN0cmVhbSByZWFkOmJ1ZiBtYXhMZW5ndGg6MTAyNF07CisgICAgICAgICAgICBpZihsZW4pIHsKKyAgICAgICAgICAgICAgICBbbXlEYXRhIGFwcGVuZEJ5dGVzOihjb25zdCB2b2lkICopYnVmIGxlbmd0aDpsZW5dOworICAgICAgICAgICAgICAgIC8vIGJ5dGVzUmVhZCBpcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0eXBlIE5TTnVtYmVyLgorICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IFtOU051bWJlciBudW1iZXJXaXRoSW50ZWdlcjpbYnl0ZXNSZWFkIGludFZhbHVlXStsZW5dOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOU0xvZyhAIm5vIGJ1ZmZlciEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTlNTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgICAgICB7CisgICAgICAgICAgICBbc3RyZWFtIGNsb3NlXTsKKyAgICAgICAgICAgIFtzdHJlYW0gcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgICAgICAgICAgW3N0cmVhbSByZWxlYXNlXTsKKyAgICAgICAgICAgIHN0cmVhbSA9IG5pbDsgLy8gc3RyZWFtIGlzIGl2YXIsIHNvIHJlaW5pdCBpdAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNvbnRpbnVlZAorICAgIH0KK30KKworLSAodm9pZCkgY2xvc2UKK3sKKyAgICBbZmggY2xvc2VGaWxlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDc5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmgKQEAgLTAsMCArMSw3NCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJJbnRTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWUuaCIKKworQGludGVyZmFjZSBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIDogQU5UTFJSdW50aW1lRXhjZXB0aW9uIHsKKwlpZDxBTlRMUkludFN0cmVhbT4gaW5wdXQ7CisJTlNJbnRlZ2VyIGluZGV4OworCWlkPEFOVExSVG9rZW4+IHRva2VuOworCWlkPEFOVExSQmFzZVRyZWU+IG5vZGU7CisJdW5pY2hhciBjOworCU5TVUludGVnZXIgbGluZTsKKwlOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTdHJlYW0sIHNldHRlcj1zZXRTdHJlYW06KSBpZDxBTlRMUkludFN0cmVhbT4gaW5wdXQ7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUb2tlbiwgc2V0dGVyPXNldFRva2VuOikgaWQ8QU5UTFJUb2tlbj50b2tlbjsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZSwgc2V0dGVyPXNldE5vZGU6KSBpZDxBTlRMUkJhc2VUcmVlPm5vZGU7CitAcHJvcGVydHkgKGFzc2lnbikgdW5pY2hhciBjOworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKworKyAoaWQpIG5ld0V4Y2VwdGlvbjsKKysgKGlkKSBuZXdFeGNlcHRpb246KGlkPEFOVExSSW50U3RyZWFtPikgYW5JbnB1dFN0cmVhbTsgCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXRTdHJlYW07CistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0U3RyZWFtIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCistIChOU0ludGVnZXIpIHVuZXhwZWN0ZWRUeXBlOworLSAoaWQ8QU5UTFJUb2tlbj4pZ2V0VW5leHBlY3RlZFRva2VuOworCistIChpZDxBTlRMUkludFN0cmVhbT4pIGdldFN0cmVhbTsKKy0gKHZvaWQpIHNldFN0cmVhbTogKGlkPEFOVExSSW50U3RyZWFtPikgYVN0cmVhbTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOworLSAodm9pZCkgc2V0VG9rZW46IChpZDxBTlRMUlRva2VuPikgYVRva2VuOworCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0Tm9kZTsKKy0gKHZvaWQpIHNldE5vZGU6IChpZDxBTlRMUkJhc2VUcmVlPikgYU5vZGU7CisKKy0gKE5TU3RyaW5nICopZ2V0TWVzc2FnZTsKKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwZTExZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubQpAQCAtMCwwICsxLDIxNSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVHJlZU5vZGVTdHJlYW0uaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24KKworQHN5bnRoZXNpemUgaW5wdXQ7CitAc3ludGhlc2l6ZSB0b2tlbjsKK0BzeW50aGVzaXplIG5vZGU7CitAc3ludGhlc2l6ZSBsaW5lOworQHN5bnRoZXNpemUgY2hhclBvc2l0aW9uSW5MaW5lOworCisrIChpZCkgbmV3RXhjZXB0aW9uCit7CisJcmV0dXJuIFtbQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiBhbGxvY10gaW5pdF07Cit9CisKKysgKGlkKSBuZXdFeGNlcHRpb246KGlkPEFOVExSSW50U3RyZWFtPikgYW5JbnB1dFN0cmVhbQoreworCXJldHVybiBbW0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoU3RyZWFtOmFuSW5wdXRTdHJlYW1dOworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uOihpZDxBTlRMUkludFN0cmVhbT4pIGFuSW5wdXRTdHJlYW0gcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24KK3sKKwlyZXR1cm4gW1tBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFN0cmVhbTphbklucHV0U3RyZWFtIHJlYXNvbjphUmVhc29uXTsKK30KKworLSAoaWQpIGluaXQKK3sKKwlzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTpAIlJlY29nbml0aW9uIEV4Y2VwdGlvbiIgcmVhc29uOkAiUmVjb2duaXRpb24gRXhjZXB0aW9uIiB1c2VySW5mbzpuaWxdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0U3RyZWFtIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uCit7CisJc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6TlNTdHJpbmdGcm9tQ2xhc3MoW3NlbGYgY2xhc3NdKSByZWFzb246YVJlYXNvbiB1c2VySW5mbzpuaWxdOworCWlmICggc2VsZiAhPSBuaWwgKSB7CisJCVtzZWxmIHNldFN0cmVhbTphbklucHV0U3RyZWFtXTsKKwkJaW5kZXggPSBpbnB1dC5pbmRleDsKKwkJCisJCUNsYXNzIGlucHV0Q2xhc3MgPSBbaW5wdXQgY2xhc3NdOworCQlpZiAoW2lucHV0Q2xhc3MgY29uZm9ybXNUb1Byb3RvY29sOkBwcm90b2NvbChBTlRMUlRva2VuU3RyZWFtKV0pIHsKKwkJCVtzZWxmIHNldFRva2VuOlsoaWQ8QU5UTFJUb2tlblN0cmVhbT4paW5wdXQgTFQ6MV1dOworCQkJbGluZSA9IHRva2VuLmxpbmU7CisJCQljaGFyUG9zaXRpb25JbkxpbmUgPSB0b2tlbi5jaGFyUG9zaXRpb25JbkxpbmU7CisJCX0gZWxzZSBpZiAoW2lucHV0Q2xhc3MgY29uZm9ybXNUb1Byb3RvY29sOkBwcm90b2NvbChBTlRMUkNoYXJTdHJlYW0pXSkgeworCQkJYyA9ICh1bmljaGFyKVtpbnB1dCBMQToxXTsKKwkJCWxpbmUgPSAoKGlkPEFOVExSQ2hhclN0cmVhbT4paW5wdXQpLmxpbmU7CisJCQljaGFyUG9zaXRpb25JbkxpbmUgPSAoKGlkPEFOVExSQ2hhclN0cmVhbT4paW5wdXQpLmNoYXJQb3NpdGlvbkluTGluZTsKKwkJfSBlbHNlIGlmIChbaW5wdXRDbGFzcyBjb25mb3Jtc1RvUHJvdG9jb2w6QHByb3RvY29sKEFOVExSVHJlZU5vZGVTdHJlYW0pXSkgeworCQkJW3NlbGYgc2V0Tm9kZTpbKGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWlucHV0IExUOjFdXTsKKwkJCWxpbmUgPSBbbm9kZSBsaW5lXTsKKwkJCWNoYXJQb3NpdGlvbkluTGluZSA9IFtub2RlIGNoYXJQb3NpdGlvbkluTGluZV07CisJCX0gZWxzZSB7CisJCQljID0gKHVuaWNoYXIpW2lucHV0IExBOjFdOworCQl9CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0U3RyZWFtCit7CisJc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6TlNTdHJpbmdGcm9tQ2xhc3MoW3NlbGYgY2xhc3NdKSByZWFzb246QCJSdW50aW1lIEV4Y2VwdGlvbiIgdXNlckluZm86bmlsXTsKKwlpZiAoIHNlbGYgIT0gbmlsICkgeworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvCit7CisJc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6YU5hbWUgcmVhc29uOmFSZWFzb24gdXNlckluZm86YVVzZXJJbmZvXTsKKwlpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uIiApOworI2VuZGlmCisJaWYgKCBpbnB1dCApIFtpbnB1dCByZWxlYXNlXTsKKwlpZiAoIHRva2VuICkgW3Rva2VuIHJlbGVhc2VdOworCWlmICggbm9kZSApIFtub2RlIHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNJbnRlZ2VyKSB1bmV4cGVjdGVkVHlwZQoreworCWlmICh0b2tlbikgeworCQlyZXR1cm4gdG9rZW4udHlwZTsKKyAgICB9IGVsc2UgaWYgKG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIFtub2RlIHR5cGVdOworCX0gZWxzZSB7CisJCXJldHVybiBjOworCX0KK30KKworLSAoaWQ8QU5UTFJUb2tlbj4pZ2V0VW5leHBlY3RlZFRva2VuCit7CisgICAgcmV0dXJuIHRva2VuOworfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworCS8vTlNNdXRhYmxlU3RyaW5nICpkZXNjID0gW1tOU011dGFibGVTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOk5TU3RyaW5nRnJvbUNsYXNzKFtzZWxmIGNsYXNzXSldOworCU5TTXV0YWJsZVN0cmluZyAqZGVzYyA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzpbc2VsZiBjbGFzc05hbWVdXTsKKwlpZiAodG9rZW4pIHsKKwkJW2Rlc2MgYXBwZW5kRm9ybWF0OkAiIHRva2VuOiVAIiwgdG9rZW5dOworCX0gZWxzZSBpZiAobm9kZSkgeworCQlbZGVzYyBhcHBlbmRGb3JtYXQ6QCIgbm9kZTolQCIsIG5vZGVdOworCX0gZWxzZSB7CisJCVtkZXNjIGFwcGVuZEZvcm1hdDpAIiBjaGFyOiVjIiwgY107CisJfQorCVtkZXNjIGFwcGVuZEZvcm1hdDpAIiBsaW5lOiVkIHBvc2l0aW9uOiVkIiwgbGluZSwgY2hhclBvc2l0aW9uSW5MaW5lXTsKKwlyZXR1cm4gZGVzYzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLy8gIGlucHV0IAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLSAoaWQ8QU5UTFJJbnRTdHJlYW0+KSBnZXRTdHJlYW0KK3sKKyAgICByZXR1cm4gaW5wdXQ7IAorfQorCistICh2b2lkKSBzZXRTdHJlYW06IChpZDxBTlRMUkludFN0cmVhbT4pIGFTdHJlYW0KK3sKKyAgICBpZiAoIGlucHV0ICE9IGFTdHJlYW0gKSB7CisgICAgICAgIGlmICggaW5wdXQgKSBbaW5wdXQgcmVsZWFzZV07CisgICAgICAgIGlmICggYVN0cmVhbSApIFthU3RyZWFtIHJldGFpbl07CisgICAgICAgIGlucHV0ID0gYVN0cmVhbTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICB0b2tlbiAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbgoreworICAgIHJldHVybiB0b2tlbjsgCit9CisKKy0gKHZvaWQpIHNldFRva2VuOiAoaWQ8QU5UTFJUb2tlbj4pIGFUb2tlbgoreworICAgIGlmICh0b2tlbiAhPSBhVG9rZW4pIHsKKyAgICAgICAgaWYgKCB0b2tlbiApIFt0b2tlbiByZWxlYXNlXTsKKyAgICAgICAgaWYgKCBhVG9rZW4gKSBbYVRva2VuIHJldGFpbl07CisgICAgICAgIHRva2VuID0gYVRva2VuOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLy8gIG5vZGUgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCistIChpZDxBTlRMUkJhc2VUcmVlPikgZ2V0Tm9kZQoreworICAgIHJldHVybiBub2RlOyAKK30KKworLSAodm9pZCkgc2V0Tm9kZTogKGlkPEFOVExSQmFzZVRyZWU+KSBhTm9kZQoreworICAgIGlmIChub2RlICE9IGFOb2RlKSB7CisgICAgICAgIGlmICggbm9kZSApIFtub2RlIHJlbGVhc2VdOworICAgICAgICBpZiAoIGFOb2RlICkgW2FOb2RlIHJldGFpbl07CisgICAgICAgIG5vZGUgPSBhTm9kZTsKKyAgICB9Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0TWVzc2FnZQoreworICAgIHJldHVybiBAIkZpeCBnZXRNZXNzYWdlIGluIEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24iOworfQorCistIChOU1VJbnRlZ2VyKWNoYXJQb3NpdGlvbkluTGluZQoreworICAgIHJldHVybiBjaGFyUG9zaXRpb25JbkxpbmU7Cit9CisKKy0gKHZvaWQpc2V0Q2hhclBvc2l0aW9uSW5MaW5lOihOU1VJbnRlZ2VyKWFQb3MKK3sKKyAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSBhUG9zOworfQorCitAc3ludGhlc2l6ZSBpbmRleDsKK0BzeW50aGVzaXplIGM7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wODc4ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaApAQCAtMCwwICsxLDExNyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgOiBOU09iamVjdCB7CisJX19zdHJvbmcgQU11dGFibGVBcnJheSAqZm9sbG93aW5nOyAgLy8gYSBzdGFjayBvZiBGT0xMT1cgYml0c2V0cyB1c2VkIGZvciBjb250ZXh0IHNlbnNpdGl2ZSBwcmVkaWN0aW9uIGFuZCByZWNvdmVyeQorICAgIE5TSW50ZWdlciBfZnNwOyAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvdyBzdGFjayBwb2ludGVyCisJQk9PTCBlcnJvclJlY292ZXJ5OyAgICAgICAgICAgICAgICAgLy8gYXJlIHdlIHJlY292ZXJpbmc/CisJTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworCUJPT0wgZmFpbGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgc29tZSBtYXRjaCBmYWlsZWQKKyAgICBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworCU5TSW50ZWdlciBiYWNrdHJhY2tpbmc7ICAgICAgICAgICAgIC8vIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcKKwlfX3N0cm9uZyBBTlRMUlJ1bGVTdGFjayAqcnVsZU1lbW87CS8vIHN0b3JlIHByZXZpb3VzIHJlc3VsdHMgb2YgbWF0Y2hpbmcgcnVsZXMgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhZ2Fpbi4gSG9vayBpbiBpbmNyZW1lbnRhbCBzdHVmZiBoZXJlLCB0b28uCisKKwlfX3N0cm9uZyBpZDxBTlRMUlRva2VuPiB0b2tlbjsKKwlOU0ludGVnZXIgIHRva2VuU3RhcnRDaGFySW5kZXg7CisJTlNVSW50ZWdlciB0b2tlblN0YXJ0TGluZTsKKwlOU1VJbnRlZ2VyIHRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisJTlNVSW50ZWdlciBjaGFubmVsOworCU5TVUludGVnZXIgdHlwZTsKKwlOU1N0cmluZyAgICp0ZXh0OworfQorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldEZvbGxvd2luZywgc2V0dGVyPXNldEZvbGxvd2luZzopIEFNdXRhYmxlQXJyYXkgKmZvbGxvd2luZzsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgX2ZzcDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIGVycm9yUmVjb3Zlcnk7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGxhc3RFcnJvckluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRGYWlsZWQsIHNldHRlcj1zZXRGYWlsZWQ6KSBCT09MIGZhaWxlZDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgc3ludGF4RXJyb3JzOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRCYWNrdHJhY2tpbmcsIHNldHRlcj1zZXRCYWNrdHJhY2tpbmc6KSBOU0ludGVnZXIgYmFja3RyYWNraW5nOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTWVtbywgc2V0dGVyPXNldFJ1bGVNZW1vOikgQU5UTFJSdWxlU3RhY2sgKnJ1bGVNZW1vOworQHByb3BlcnR5IChjb3B5LCBnZXR0ZXI9Z2V0VG9rZW4sIHNldHRlcj1zZXRUb2tlbjopIGlkPEFOVExSVG9rZW4+IHRva2VuOworQHByb3BlcnR5IChnZXR0ZXI9dHlwZSxzZXR0ZXI9c2V0VHlwZTopIE5TVUludGVnZXIgdHlwZTsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWNoYW5uZWwsc2V0dGVyPXNldENoYW5uZWw6KSBOU1VJbnRlZ2VyIGNoYW5uZWw7CitAcHJvcGVydHkgKGdldHRlcj1nZXRUb2tlblN0YXJ0TGluZSxzZXR0ZXI9c2V0VG9rZW5TdGFydExpbmU6KSBOU1VJbnRlZ2VyIHRva2VuU3RhcnRMaW5lOworQHByb3BlcnR5IChnZXR0ZXI9Y2hhclBvc2l0aW9uSW5MaW5lLHNldHRlcj1zZXRDaGFyUG9zaXRpb25JbkxpbmU6KSBOU1VJbnRlZ2VyIHRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CitAcHJvcGVydHkgKGdldHRlcj1nZXRUb2tlblN0YXJ0Q2hhckluZGV4LHNldHRlcj1zZXRUb2tlblN0YXJ0Q2hhckluZGV4OikgTlNJbnRlZ2VyIHRva2VuU3RhcnRDaGFySW5kZXg7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPXRleHQsIHNldHRlcj1zZXRUZXh0OikgTlNTdHJpbmcgKnRleHQ7CisKKysgKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlOworKyAoQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKikgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CisrIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW47CistIChpZCkgaW5pdFdpdGhTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilzdGF0ZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFRva2VuOworLSAodm9pZCkgc2V0VG9rZW46KGlkPEFOVExSVG9rZW4+KSB0aGVUb2tlbjsKKworLSAoTlNVSW50ZWdlcil0eXBlOworLSAodm9pZCkgc2V0VHlwZTooTlNVSW50ZWdlcikgdGhlVG9rZW5UeXBlOworCistIChOU1VJbnRlZ2VyKWNoYW5uZWw7CistICh2b2lkKSBzZXRDaGFubmVsOihOU1VJbnRlZ2VyKSB0aGVDaGFubmVsOworCistIChOU1VJbnRlZ2VyKSBnZXRUb2tlblN0YXJ0TGluZTsKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRMaW5lOihOU1VJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0TGluZTsKKworLSAoTlNVSW50ZWdlcikgY2hhclBvc2l0aW9uSW5MaW5lOworLSAodm9pZCkgc2V0Q2hhclBvc2l0aW9uSW5MaW5lOihOU1VJbnRlZ2VyKSB0aGVDaGFyUG9zaXRpb247CisKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5TdGFydENoYXJJbmRleDsKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRDaGFySW5kZXg6KE5TSW50ZWdlcikgdGhlVG9rZW5TdGFydENoYXJJbmRleDsKKworLSAoTlNTdHJpbmcgKil0ZXh0OworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKikgdGhlVGV4dDsKKworCistIChBTXV0YWJsZUFycmF5ICopIGdldEZvbGxvd2luZzsKKy0gKHZvaWQpc2V0Rm9sbG93aW5nOihBTXV0YWJsZUFycmF5ICopYUZvbGxvdzsKKy0gKEFOVExSUnVsZVN0YWNrICopIGdldFJ1bGVNZW1vOworLSAodm9pZClzZXRSdWxlTWVtbzooQU5UTFJSdWxlU3RhY2sgKilhUnVsZU1lbW87CistIChCT09MKSBpc0Vycm9yUmVjb3Zlcnk7CistICh2b2lkKSBzZXRJc0Vycm9yUmVjb3Zlcnk6IChCT09MKSBmbGFnOworCistIChCT09MKSBnZXRGYWlsZWQ7CistICh2b2lkKSBzZXRGYWlsZWQ6IChCT09MKSBmbGFnOworCistIChOU0ludGVnZXIpICBnZXRCYWNrdHJhY2tpbmc7CistICh2b2lkKSBzZXRCYWNrdHJhY2tpbmc6KE5TSW50ZWdlcikgdmFsdWU7CistICh2b2lkKSBpbmNyZWFzZUJhY2t0cmFja2luZzsKKy0gKHZvaWQpIGRlY3JlYXNlQmFja3RyYWNraW5nOworLSAoQk9PTCkgaXNCYWNrdHJhY2tpbmc7CisKKy0gKE5TSW50ZWdlcikgbGFzdEVycm9ySW5kZXg7CistICh2b2lkKSBzZXRMYXN0RXJyb3JJbmRleDooTlNJbnRlZ2VyKSB2YWx1ZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzlkZGEyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm0KQEAgLTAsMCArMSwzMzEgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZQorCitAc3ludGhlc2l6ZSBmb2xsb3dpbmc7CitAc3ludGhlc2l6ZSBfZnNwOworQHN5bnRoZXNpemUgZXJyb3JSZWNvdmVyeTsKK0BzeW50aGVzaXplIGxhc3RFcnJvckluZGV4OworQHN5bnRoZXNpemUgZmFpbGVkOworQHN5bnRoZXNpemUgc3ludGF4RXJyb3JzOworQHN5bnRoZXNpemUgYmFja3RyYWNraW5nOworQHN5bnRoZXNpemUgcnVsZU1lbW87CitAc3ludGhlc2l6ZSB0b2tlbjsKK0BzeW50aGVzaXplIHR5cGU7CitAc3ludGhlc2l6ZSBjaGFubmVsOworQHN5bnRoZXNpemUgdG9rZW5TdGFydExpbmU7CitAc3ludGhlc2l6ZSB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworQHN5bnRoZXNpemUgdG9rZW5TdGFydENoYXJJbmRleDsKK0BzeW50aGVzaXplIHRleHQ7CisKKysgKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlCit7CisgICAgcmV0dXJuIFtbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisrIChBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOihOU0ludGVnZXIpYUxlbgoreworICAgIHJldHVybiBbW1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBhbGxvY10gaW5pdFdpdGhSdWxlTGVuOmFMZW5dIHJldGFpbl07Cit9CisKKysgKEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZQoreworICAgIHJldHVybiBbW1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBhbGxvY10gaW5pdFdpdGhTdGF0ZTphU3RhdGVdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgQU5UTFJIYXNoUnVsZSAqYUhhc2hSdWxlOworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsICkgeworICAgICAgICBmb2xsb3dpbmcgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6MTBdIHJldGFpbl07CisgICAgICAgIF9mc3AgPSAtMTsKKyAgICAgICAgZXJyb3JSZWNvdmVyeSA9IE5POwkJCS8vIGFyZSB3ZSByZWNvdmVyaW5nPworICAgICAgICBsYXN0RXJyb3JJbmRleCA9IC0xOworICAgICAgICBmYWlsZWQgPSBOTzsJCQkJLy8gaW5kaWNhdGUgdGhhdCBzb21lIG1hdGNoIGZhaWxlZAorICAgICAgICBzeW50YXhFcnJvcnMgPSAwOworICAgICAgICBiYWNrdHJhY2tpbmcgPSAwOwkJCS8vIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcKKyAgICAgICAgdG9rZW5TdGFydENoYXJJbmRleCA9IC0xOworICAgICAgICB0b2tlblN0YXJ0TGluZSA9IDA7CisgICAgICAgIGludCBjbnQgPSAyMDA7CisJCXJ1bGVNZW1vID0gW1tBTlRMUlJ1bGVTdGFjayBuZXdBTlRMUlJ1bGVTdGFjazpjbnRdIHJldGFpbl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKysgKSB7CisgICAgICAgICAgICBhSGFzaFJ1bGUgPSBbW0FOVExSSGFzaFJ1bGUgbmV3QU5UTFJIYXNoUnVsZVdpdGhMZW46MTddIHJldGFpbl07CisgICAgICAgICAgICBbcnVsZU1lbW8gYWRkT2JqZWN0OmFIYXNoUnVsZV07CisgICAgICAgIH0KKyNpZmRlZiBET05UVVNFWUVUCisgICAgICAgIHRva2VuID0gc3RhdGUudG9rZW47CisgICAgICAgIHRva2VuU3RhcnRDaGFySW5kZXggPSBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4OworICAgICAgICB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgY2hhbm5lbCA9IHN0YXRlLmNoYW5uZWw7CisgICAgICAgIHR5cGUgPSBzdGF0ZS50eXBlOworICAgICAgICB0ZXh0ID0gc3RhdGUudGV4dDsKKyNlbmRpZgorCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoUnVsZUxlbjooTlNJbnRlZ2VyKWFMZW4KK3sKKyAgICBBTlRMUkhhc2hSdWxlICphSGFzaFJ1bGU7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwgKSB7CisgICAgICAgIGZvbGxvd2luZyA9IFtbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxMF0gcmV0YWluXTsKKyAgICAgICAgX2ZzcCA9IC0xOworICAgICAgICBlcnJvclJlY292ZXJ5ID0gTk87CQkJLy8gYXJlIHdlIHJlY292ZXJpbmc/CisgICAgICAgIGxhc3RFcnJvckluZGV4ID0gLTE7CisgICAgICAgIGZhaWxlZCA9IE5POwkJCQkvLyBpbmRpY2F0ZSB0aGF0IHNvbWUgbWF0Y2ggZmFpbGVkCisgICAgICAgIHN5bnRheEVycm9ycyA9IDA7CisgICAgICAgIGJhY2t0cmFja2luZyA9IDA7CQkJLy8gdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZworICAgICAgICB0b2tlblN0YXJ0Q2hhckluZGV4ID0gLTE7CisgICAgICAgIHRva2VuU3RhcnRMaW5lID0gMDsKKwkJcnVsZU1lbW8gPSBbW0FOVExSUnVsZVN0YWNrIG5ld0FOVExSUnVsZVN0YWNrOmFMZW5dIHJldGFpbl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYUxlbjsgaSsrICkgeworICAgICAgICAgICAgYUhhc2hSdWxlID0gW1tBTlRMUkhhc2hSdWxlIG5ld0FOVExSSGFzaFJ1bGVXaXRoTGVuOjE3XSByZXRhaW5dOworICAgICAgICAgICAgW3J1bGVNZW1vIGFkZE9iamVjdDphSGFzaFJ1bGVdOworICAgICAgICB9CisjaWZkZWYgRE9OVFVTRVlFVAorICAgICAgICB0b2tlbiA9IHN0YXRlLnRva2VuOworICAgICAgICB0b2tlblN0YXJ0Q2hhckluZGV4ID0gc3RhdGUudG9rZW5TdGFydENoYXJJbmRleDsKKyAgICAgICAgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIGNoYW5uZWwgPSBzdGF0ZS5jaGFubmVsOworICAgICAgICB0eXBlID0gc3RhdGUudHlwZTsKKyAgICAgICAgdGV4dCA9IHN0YXRlLnRleHQ7CisjZW5kaWYKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZQoreworICAgIEFOVExSSGFzaFJ1bGUgKmFIYXNoUnVsZTsKKyAgICBpZiAoIFtmb2xsb3dpbmcgY291bnRdIDwgW2FTdGF0ZS5mb2xsb3dpbmcgY291bnRdICkgeworICAgICAgICAvLyAgICAgICAgZm9sbG93aW5nID0gbmV3IEJpdFNldFtzdGF0ZS5mb2xsb3dpbmcuc2l6ZV07CisgICAgfQorICAgIFtmb2xsb3dpbmcgc2V0QXJyYXk6YVN0YXRlLmZvbGxvd2luZ107CisgICAgX2ZzcCA9IGFTdGF0ZS5fZnNwOworICAgIGVycm9yUmVjb3ZlcnkgPSBhU3RhdGUuZXJyb3JSZWNvdmVyeTsKKyAgICBsYXN0RXJyb3JJbmRleCA9IGFTdGF0ZS5sYXN0RXJyb3JJbmRleDsKKyAgICBmYWlsZWQgPSBhU3RhdGUuZmFpbGVkOworICAgIHN5bnRheEVycm9ycyA9IGFTdGF0ZS5zeW50YXhFcnJvcnM7CisgICAgYmFja3RyYWNraW5nID0gYVN0YXRlLmJhY2t0cmFja2luZzsKKyAgICBpZiAoIGFTdGF0ZS5ydWxlTWVtbyA9PSBuaWwgKSB7CisgICAgICAgIGludCBjbnQgPSAyMDA7CisgICAgICAgIHJ1bGVNZW1vID0gW1tBTlRMUlJ1bGVTdGFjayBuZXdBTlRMUlJ1bGVTdGFjazpjbnRdIHJldGFpbl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKysgKSB7CisgICAgICAgICAgICBhSGFzaFJ1bGUgPSBbW0FOVExSSGFzaFJ1bGUgbmV3QU5UTFJIYXNoUnVsZVdpdGhMZW46MTddIHJldGFpbl07CisgICAgICAgICAgICBbcnVsZU1lbW8gYWRkT2JqZWN0OmFIYXNoUnVsZV07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJ1bGVNZW1vID0gYVN0YXRlLnJ1bGVNZW1vOworICAgICAgICBpZiAoIFtydWxlTWVtbyBjb3VudF0gPT0gMCApIHsKKyAgICAgICAgICAgIGludCBjbnQgPSBbcnVsZU1lbW8gbGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKysgKSB7CisgICAgICAgICAgICAgICAgW3J1bGVNZW1vIGFkZE9iamVjdDpbW0FOVExSSGFzaFJ1bGUgbmV3QU5UTFJIYXNoUnVsZVdpdGhMZW46MTddIHJldGFpbl1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgW3J1bGVNZW1vIGFkZE9iamVjdHNGcm9tQXJyYXk6YVN0YXRlLnJ1bGVNZW1vXTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0b2tlbiA9IGFTdGF0ZS50b2tlbjsKKyAgICB0b2tlblN0YXJ0Q2hhckluZGV4ID0gYVN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXg7CisgICAgdG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGFTdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworICAgIHRva2VuU3RhcnRMaW5lID0gYVN0YXRlLnRva2VuU3RhcnRMaW5lOworICAgIGNoYW5uZWwgPSBhU3RhdGUuY2hhbm5lbDsKKyAgICB0eXBlID0gYVN0YXRlLnR5cGU7CisgICAgdGV4dCA9IGFTdGF0ZS50ZXh0OworICAgIHJldHVybiggc2VsZiApOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIiApOworI2VuZGlmCisgICAgaWYgKCB0b2tlbiApIFt0b2tlbiByZWxlYXNlXTsKKwlpZiAoIGZvbGxvd2luZyApIFtmb2xsb3dpbmcgcmVsZWFzZV07CisJaWYgKCBydWxlTWVtbyApIFtydWxlTWVtbyByZWxlYXNlXTsKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy8vIHRva2VuIHN0dWZmCisjcHJhZ21hIG1hcmsgVG9rZW5zCisKKy0gKGlkPEFOVExSVG9rZW4+KWdldFRva2VuCit7CisgICAgcmV0dXJuIHRva2VuOyAKK30KKworLSAodm9pZCkgc2V0VG9rZW46IChpZDxBTlRMUlRva2VuPikgYVRva2VuCit7CisgICAgaWYgKHRva2VuICE9IGFUb2tlbikgeworICAgICAgICBbYVRva2VuIHJldGFpbl07CisgICAgICAgIGlmICggdG9rZW4gKSBbdG9rZW4gcmVsZWFzZV07CisgICAgICAgIHRva2VuID0gYVRva2VuOworICAgIH0KK30KKworLSAoTlNVSW50ZWdlciljaGFubmVsCit7CisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKKy0gKHZvaWQpIHNldENoYW5uZWw6KE5TVUludGVnZXIpIHRoZUNoYW5uZWwKK3sKKyAgICBjaGFubmVsID0gdGhlQ2hhbm5lbDsKK30KKworLSAoTlNVSW50ZWdlcikgZ2V0VG9rZW5TdGFydExpbmUKK3sKKyAgICByZXR1cm4gdG9rZW5TdGFydExpbmU7Cit9CisKKy0gKHZvaWQpIHNldFRva2VuU3RhcnRMaW5lOihOU1VJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0TGluZQoreworICAgIHRva2VuU3RhcnRMaW5lID0gdGhlVG9rZW5TdGFydExpbmU7Cit9CisKKy0gKE5TVUludGVnZXIpIGNoYXJQb3NpdGlvbkluTGluZQoreworICAgIHJldHVybiB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lOworfQorCistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpIHRoZUNoYXJQb3NpdGlvbgoreworICAgIHRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSB0aGVDaGFyUG9zaXRpb247Cit9CisKKy0gKE5TSW50ZWdlcikgZ2V0VG9rZW5TdGFydENoYXJJbmRleDsKK3sKKyAgICByZXR1cm4gdG9rZW5TdGFydENoYXJJbmRleDsKK30KKworLSAodm9pZCkgc2V0VG9rZW5TdGFydENoYXJJbmRleDooTlNJbnRlZ2VyKSB0aGVUb2tlblN0YXJ0Q2hhckluZGV4Cit7CisgICAgdG9rZW5TdGFydENoYXJJbmRleCA9IHRoZVRva2VuU3RhcnRDaGFySW5kZXg7Cit9CisKKy8vIGVycm9yIGhhbmRsaW5nCistICh2b2lkKSByZXBvcnRFcnJvcjooQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqKWUKK3sKKwlOU0xvZyhAIiVAIiwgZS5uYW1lKTsKK30KKworLSAoQU11dGFibGVBcnJheSAqKSBnZXRGb2xsb3dpbmcKK3sKKwlyZXR1cm4gZm9sbG93aW5nOworfQorCistICh2b2lkKXNldEZvbGxvd2luZzooQU11dGFibGVBcnJheSAqKWFGb2xsb3cKK3sKKyAgICBpZiAoIGZvbGxvd2luZyAhPSBhRm9sbG93ICkgeworICAgICAgICBpZiAoIGZvbGxvd2luZyApIFtmb2xsb3dpbmcgcmVsZWFzZV07CisgICAgICAgIFthRm9sbG93IHJldGFpbl07CisgICAgfQorICAgIGZvbGxvd2luZyA9IGFGb2xsb3c7Cit9CisKKy0gKEFOVExSUnVsZVN0YWNrICopIGdldFJ1bGVNZW1vCit7CisJcmV0dXJuIHJ1bGVNZW1vOworfQorCistICh2b2lkKXNldFJ1bGVNZW1vOihBTlRMUlJ1bGVTdGFjayAqKWFSdWxlTWVtbworeworICAgIGlmICggcnVsZU1lbW8gIT0gYVJ1bGVNZW1vICkgeworICAgICAgICBpZiAoIHJ1bGVNZW1vICkgW3J1bGVNZW1vIHJlbGVhc2VdOworICAgICAgICBbYVJ1bGVNZW1vIHJldGFpbl07CisgICAgfQorICAgIHJ1bGVNZW1vID0gYVJ1bGVNZW1vOworfQorCistIChCT09MKSBpc0Vycm9yUmVjb3ZlcnkKK3sKKwlyZXR1cm4gZXJyb3JSZWNvdmVyeTsKK30KKworLSAodm9pZCkgc2V0SXNFcnJvclJlY292ZXJ5OiAoQk9PTCkgZmxhZworeworCWVycm9yUmVjb3ZlcnkgPSBmbGFnOworfQorCisKKy0gKEJPT0wpIGdldEZhaWxlZAoreworCXJldHVybiBmYWlsZWQ7Cit9CisKKy0gKHZvaWQpIHNldEZhaWxlZDooQk9PTClmbGFnCit7CisJZmFpbGVkID0gZmxhZzsKK30KKworCistIChOU0ludGVnZXIpIGJhY2t0cmFja2luZworeworCXJldHVybiBiYWNrdHJhY2tpbmc7Cit9CisKKy0gKHZvaWQpIHNldEJhY2t0cmFja2luZzooTlNJbnRlZ2VyKSB2YWx1ZQoreworCWJhY2t0cmFja2luZyA9IHZhbHVlOworfQorCistICh2b2lkKSBpbmNyZWFzZUJhY2t0cmFja2luZworeworCWJhY2t0cmFja2luZysrOworfQorCistICh2b2lkKSBkZWNyZWFzZUJhY2t0cmFja2luZworeworCWJhY2t0cmFja2luZy0tOworfQorCistIChCT09MKSBpc0JhY2t0cmFja2luZworeworCXJldHVybiBiYWNrdHJhY2tpbmcgPiAwOworfQorCisKKy0gKE5TSW50ZWdlcikgbGFzdEVycm9ySW5kZXgKK3sKKyAgICByZXR1cm4gbGFzdEVycm9ySW5kZXg7Cit9CisKKy0gKHZvaWQpIHNldExhc3RFcnJvckluZGV4OihOU0ludGVnZXIpIHZhbHVlCit7CisJbGFzdEVycm9ySW5kZXggPSB2YWx1ZTsKK30KKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUwMTkwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaApAQCAtMCwwICsxLDgyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKworLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgc2VwYXJhdGVkIGludG8gc3RyZWFtIGFuZCBlbnVtZXJhdG9yIGNsYXNzZXMKK0BpbnRlcmZhY2UgQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0gOiBOU09iamVjdCB7CisgICAgTlNJbnRlZ2VyIGN1cnNvcjsKKyAgICBCT09MIGRpcnR5OyAgICAgICAgLy8vPCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIHNob3VsZCByZXR1cm4gY29waWVzIG9mIGl0cyBlbGVtZW50cywgc2V0IHRvIHRydWUgYWZ0ZXIgYSBjYWxsIHRvIC1yZXNldAorICAgIEJPT0wgaXNTaW5nbGVFbGVtZW50OworICAgIGlkIHNpbmdsZUVsZW1lbnQ7CisgICAgX19zdHJvbmcgQU11dGFibGVBcnJheSAqZWxlbWVudHM7CisgICAgCisgICAgX19zdHJvbmcgTlNTdHJpbmcgKmVsZW1lbnREZXNjcmlwdGlvbjsKKyAgICBfX3N0cm9uZyBpZDxBTlRMUlRyZWVBZGFwdG9yPiB0cmVlQWRhcHRvcjsKK30KKworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBjdXJzb3I7CitAcHJvcGVydHkgKGFzc2lnbikgQk9PTCBkaXJ0eTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIGlzU2luZ2xlRWxlbWVudDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBpZCBzaW5nbGVFbGVtZW50OworQHByb3BlcnR5IChhc3NpZ24pIEFNdXRhYmxlQXJyYXkgKmVsZW1lbnRzOworQHByb3BlcnR5IChhc3NpZ24pIE5TU3RyaW5nICplbGVtZW50RGVzY3JpcHRpb247CitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CisKKysgKEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKikgbmV3QU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbjsKKysgKEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKikgbmV3QU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpYW5FbGVtZW50OworKyAoQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0qKSBuZXdBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKKworLSAodm9pZClyZXNldDsKKworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yOworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcjsKKworLSAodm9pZCkgYWRkRWxlbWVudDooaWQpYW5FbGVtZW50OworLSAoTlNJbnRlZ2VyKSBzaXplOwwKKyAKKy0gKEJPT0wpIGhhc05leHQ7CistIChpZDxBTlRMUkJhc2VUcmVlPikgbmV4dFRyZWU7CistIChpZDxBTlRMUkJhc2VUcmVlPikgX25leHQ7ICAgICAgIC8vIGludGVybmFsOiBUT0RPOiByZWRlc2lnbiBpZiBuZWNlc3NhcnkuIG1heWJlIGRlbGVnYXRlCisKKy0gKGlkKSBjb3B5RWxlbWVudDooaWQpZWxlbWVudDsKKy0gKGlkKSB0b1RyZWU6KGlkKWVsZW1lbnQ7CisKKy0gKE5TU3RyaW5nICopIGdldERlc2NyaXB0aW9uOworLSAodm9pZCkgc2V0RGVzY3JpcHRpb246KE5TU3RyaW5nICopZGVzY3JpcHRpb247CisKK0BlbmQKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4MTYzYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm0KQEAgLTAsMCArMSwyNTggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0KKworQHN5bnRoZXNpemUgY3Vyc29yOworQHN5bnRoZXNpemUgZGlydHk7CitAc3ludGhlc2l6ZSBpc1NpbmdsZUVsZW1lbnQ7CitAc3ludGhlc2l6ZSBzaW5nbGVFbGVtZW50OworQHN5bnRoZXNpemUgZWxlbWVudHM7CitAc3ludGhlc2l6ZSBlbGVtZW50RGVzY3JpcHRpb247CitAc3ludGhlc2l6ZSB0cmVlQWRhcHRvcjsKKworKyAoQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjphbkVsZW1lbnREZXNjcmlwdGlvbl07Cit9CisKKysgKEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtICopIG5ld0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpYW5FbGVtZW50Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0gYWxsb2NdIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246YW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDphbkVsZW1lbnRdOworfQorCisrIChBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSAqKSBuZXdBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjphbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOnRoZUVsZW1lbnRzXTsKK30KKworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGN1cnNvciA9IDA7CisgICAgICAgIGRpcnR5ID0gTk87CisgICAgICAgIFtzZWxmIHNldERlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uXTsKKyAgICAgICAgW3NlbGYgc2V0VHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yXTsKKyAgICAgICAgZGlydHkgPSBOTzsKKyAgICAgICAgaXNTaW5nbGVFbGVtZW50ID0gWUVTOworICAgICAgICBzaW5nbGVFbGVtZW50ID0gbmlsOworICAgICAgICBlbGVtZW50cyA9IG5pbDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudDooaWQpYW5FbGVtZW50Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICAgICAgZGlydHkgPSBOTzsKKyAgICAgICAgW3NlbGYgc2V0RGVzY3JpcHRpb246YW5FbGVtZW50RGVzY3JpcHRpb25dOworICAgICAgICBbc2VsZiBzZXRUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3JdOworICAgICAgICBkaXJ0eSA9IE5POworICAgICAgICBpc1NpbmdsZUVsZW1lbnQgPSBZRVM7CisgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBuaWw7CisgICAgICAgIGVsZW1lbnRzID0gbmlsOworICAgICAgICBbc2VsZiBhZGRFbGVtZW50OmFuRWxlbWVudF07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHMKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmIChzZWxmKSB7CisgICAgICAgIGN1cnNvciA9IDA7CisgICAgICAgIGRpcnR5ID0gTk87CisgICAgICAgIFtzZWxmIHNldERlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uXTsKKyAgICAgICAgW3NlbGYgc2V0VHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yXTsKKyAgICAgICAgZGlydHkgPSBOTzsKKyAgICAgICAgc2luZ2xlRWxlbWVudCA9IG5pbDsKKyAgICAgICAgaXNTaW5nbGVFbGVtZW50ID0gTk87CisgICAgICAgIGVsZW1lbnRzID0gW1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aEFycmF5OnRoZUVsZW1lbnRzXSByZXRhaW5dOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSIgKTsKKyNlbmRpZgorICAgIGlmICggc2luZ2xlRWxlbWVudCAmJiBpc1NpbmdsZUVsZW1lbnQgKSBbc2luZ2xlRWxlbWVudCByZWxlYXNlXTsKKyAgICBlbHNlIGlmICggZWxlbWVudHMgJiYgIWlzU2luZ2xlRWxlbWVudCApIFtlbGVtZW50cyByZWxlYXNlXTsKKyAgICBbc2VsZiBzZXREZXNjcmlwdGlvbjpuaWxdOworICAgIFtzZWxmIHNldFRyZWVBZGFwdG9yOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistICh2b2lkKXJlc2V0Cit7CisgICAgY3Vyc29yID0gMDsKKyAgICBkaXJ0eSA9IFlFUzsKK30KKworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yCit7CisgICAgcmV0dXJuIHRyZWVBZGFwdG9yOworfQorCistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCit7CisgICAgaWYgKHRyZWVBZGFwdG9yICE9IGFUcmVlQWRhcHRvcikgeworICAgICAgICBpZiAoIHRyZWVBZGFwdG9yICkgW3RyZWVBZGFwdG9yIHJlbGVhc2VdOworICAgICAgICB0cmVlQWRhcHRvciA9IGFUcmVlQWRhcHRvcjsKKyAgICAgICAgW3RyZWVBZGFwdG9yIHJldGFpbl07CisgICAgfQorfQorCistICh2b2lkKSBhZGRFbGVtZW50OiAoaWQpYW5FbGVtZW50Cit7CisgICAgaWYgKGFuRWxlbWVudCA9PSBuaWwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoZWxlbWVudHMgIT0gbmlsKSB7CisgICAgICAgIFtlbGVtZW50cyBhZGRPYmplY3Q6YW5FbGVtZW50XTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT0gbmlsKSB7CisgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBhbkVsZW1lbnQ7CisgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBbYW5FbGVtZW50IHJldGFpbl07CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXNTaW5nbGVFbGVtZW50ID0gTk87CisgICAgZWxlbWVudHMgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6NV0gcmV0YWluXTsKKyAgICBbZWxlbWVudHMgYWRkT2JqZWN0OnNpbmdsZUVsZW1lbnRdOworICAgIHNpbmdsZUVsZW1lbnQgPSBuaWw7ICAvLyBiYWxhbmNlIHByZXZpb3VzIHJldGFpbiBpbiBpbml0aWFsaXplci9hZGRFbGVtZW50CisgICAgW2VsZW1lbnRzIGFkZE9iamVjdDphbkVsZW1lbnRdOworfQorCistICh2b2lkKSBzZXRFbGVtZW50OiAoaWQpYW5FbGVtZW50Cit7CisgICAgaWYgKGFuRWxlbWVudCA9PSBuaWwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoZWxlbWVudHMgIT0gbmlsKSB7CisgICAgICAgIFtlbGVtZW50cyBhZGRPYmplY3Q6YW5FbGVtZW50XTsKKyAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT0gbmlsKSB7CisgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBhbkVsZW1lbnQ7CisgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBbYW5FbGVtZW50IHJldGFpbl07CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXNTaW5nbGVFbGVtZW50ID0gTk87CisgICAgZWxlbWVudHMgPSBbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6NV0gcmV0YWluXTsKKyAgICBbZWxlbWVudHMgYWRkT2JqZWN0OnNpbmdsZUVsZW1lbnRdOworICAgIHNpbmdsZUVsZW1lbnQgPSBuaWw7ICAvLyBiYWxhbmNlIHByZXZpb3VzIHJldGFpbiBpbiBpbml0aWFsaXplci9hZGRFbGVtZW50CisgICAgW2VsZW1lbnRzIGFkZE9iamVjdDphbkVsZW1lbnRdOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgbmV4dFRyZWUKK3sKKyAgICBOU0ludGVnZXIgbiA9IFtzZWxmIHNpemVdOworICAgIGlmICggZGlydHkgJiYgKGN1cnNvciA+PSAwICYmIG4gPT0gMSkpIHsKKyAgICAgICAgLy8gaWYgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIGlzIDEsIGR1cAorICAgICAgICBpZCBlbGVtZW50ID0gW3NlbGYgX25leHRdOworICAgICAgICByZXR1cm4gW3NlbGYgY29weUVsZW1lbnQ6ZWxlbWVudF07CisgICAgfQorICAgIC8vIHRlc3Qgc2l6ZSBhYm92ZSB0aGVuIGZldGNoCisgICAgaWQgZWxlbWVudCA9IFtzZWxmIF9uZXh0XTsKKyAgICByZXR1cm4gZWxlbWVudDsKK30KKworLSAoaWQpIF9uZXh0ICAgICAgIC8vIGludGVybmFsOiBUT0RPOiByZWRlc2lnbiBpZiBuZWNlc3NhcnkuIG1heWJlIGRlbGVnYXRlCit7CisgICAgTlNJbnRlZ2VyIG4gPSBbc2VsZiBzaXplXTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIEB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6QCJSZXdyaXRlRW1wdHlTdHJlYW1FeGNlcHRpb24iIHJlYXNvbjpuaWwgdXNlckluZm86bmlsXTsvLyBUT0RPOiBmaWxsIGluIHJlYWwgZXhjZXB0aW9uCisgICAgfQorICAgIGlmICggY3Vyc29yID49IG4gKSB7CisgICAgICAgIGlmICggbiA9PSAxICkgeworICAgICAgICAgICAgcmV0dXJuIFtzZWxmIHRvVHJlZTpzaW5nbGVFbGVtZW50XTsgLy8gd2lsbCBiZSBkdXAnZWQgaW4gLW5leHQKKyAgICAgICAgfQorICAgICAgICBAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOkAiUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uIiByZWFzb246bmlsIHVzZXJJbmZvOm5pbF07Ly8gVE9ETzogZmlsbCBpbiByZWFsIGV4Y2VwdGlvbgorICAgIH0KKyAgICBpZiAoc2luZ2xlRWxlbWVudCAhPSBuaWwpIHsKKyAgICAgICAgY3Vyc29yKys7CisgICAgICAgIHJldHVybiBbc2VsZiB0b1RyZWU6c2luZ2xlRWxlbWVudF07CisgICAgfQorICAgIGlkIGVsID0gW2VsZW1lbnRzIG9iamVjdEF0SW5kZXg6Y3Vyc29yXTsKKyAgICBjdXJzb3IrKzsKKyAgICByZXR1cm4gW3NlbGYgdG9UcmVlOmVsXTsKK30KKworLSAoQk9PTCkgaGFzTmV4dAoreworICAgIHJldHVybiAoc2luZ2xlRWxlbWVudCAhPSBuaWwgJiYgY3Vyc29yIDwgMSkgfHwKKyAgICAgICAgICAgIChlbGVtZW50cyAhPSBuaWwgJiYgY3Vyc29yIDwgW2VsZW1lbnRzIGNvdW50XSk7Cit9CisKKy0gKE5TSW50ZWdlcikgc2l6ZQoreworICAgIE5TSW50ZWdlciBuID0gMDsKKyAgICBpZiAoc2luZ2xlRWxlbWVudCAhPSBuaWwpCisgICAgICAgIG4gPSAxOworICAgIGlmIChlbGVtZW50cyAhPSBuaWwpCisgICAgICAgIHJldHVybiBbZWxlbWVudHMgY291bnRdOworICAgIHJldHVybiBuOworfQorCistIChpZCkgY29weUVsZW1lbnQ6KGlkKWVsZW1lbnQKK3sKKyAgICBbc2VsZiBkb2VzTm90UmVjb2duaXplU2VsZWN0b3I6X2NtZF07ICAgLy8gc3ViY2xhc3MgcmVzcG9uc2liaWxpdHkKKyAgICByZXR1cm4gbmlsOworfQorCistIChpZDxBTlRMUkJhc2VUcmVlPikgdG9UcmVlOihpZCllbGVtZW50Cit7CisgICAgcmV0dXJuIGVsZW1lbnQ7Cit9CisKKy0gKE5TU3RyaW5nICopIGdldERlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIGVsZW1lbnREZXNjcmlwdGlvbjsKK30KKworLSAodm9pZCkgc2V0RGVzY3JpcHRpb246KE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisgICAgaWYgKCBkZXNjcmlwdGlvbiAhPSBuaWwgJiYgZGVzY3JpcHRpb24gIT0gZWxlbWVudERlc2NyaXB0aW9uICkgeworICAgICAgICBpZiAoZWxlbWVudERlc2NyaXB0aW9uICE9IG5pbCkgW2VsZW1lbnREZXNjcmlwdGlvbiByZWxlYXNlXTsKKyAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6ZGVzY3JpcHRpb25dOworICAgICAgICBbZWxlbWVudERlc2NyaXB0aW9uIHJldGFpbl07CisgICAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzg5ZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaApAQCAtMCwwICsxLDQ2IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oIgwMCisKK0BpbnRlcmZhY2UgQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gOiBBTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSB7CisKK30KKworKyAoQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbjsKKysgKEFOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtICopIG5ld0FOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudDooaWQpYW5FbGVtZW50OworKyAoQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZU5vZGU6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbiBlbGVtZW50czooTlNBcnJheSAqKXRoZUVsZW1lbnRzOworCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uOworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvciBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbiBlbGVtZW50OihpZClhbkVsZW1lbnQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKGlkKSBuZXh0Tm9kZTsKKy0gKGlkKSB0b1RyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWVsZW1lbnQ7CistIChpZCkgZHVwOihpZCllbGVtZW50OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZGZlZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0ubQpAQCAtMCwwICsxLDc0IEBACisvLworLy8gIEFOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEtheSBSw7Zwa2Ugb24gNy8xNi8wNy4KKy8vICBDb3B5cmlnaHQgMjAwNyBjbGFzc0R1bXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbQorCisrIChBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0gYWxsb2NdIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uXTsKK30KKworKyAoQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0qKSBuZXdBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246YW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudDphbkVsZW1lbnRdOworfQorCisrIChBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVOb2RlOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVSdWxlTm9kZVN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246YW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6dGhlRWxlbWVudHNdOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uXSkgIT0gbmlsKSB7CisgICAgICAgIGRpcnR5ID0gTk87CisgICAgICAgIGlzU2luZ2xlRWxlbWVudCA9IFlFUzsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudDooaWQpYW5FbGVtZW50Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6YW5FbGVtZW50XSkgIT0gbmlsKSB7CisgICAgICAgIGRpcnR5ID0gTk87CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHMKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBkaXJ0eSA9IE5POworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworCistIChpZCkgbmV4dE5vZGUKK3sKKyAgICBpZiAoZGlydHkgfHwgKGN1cnNvciA+PSBbc2VsZiBzaXplXSAmJiBbc2VsZiBzaXplXSA9PSAxKSkKKyAgICAgICAgcmV0dXJuIFt0cmVlQWRhcHRvciBkdXBOb2RlOltzZWxmIF9uZXh0XV07CisgICAgZWxzZSAKKyAgICAgICAgcmV0dXJuIFtzZWxmIF9uZXh0XTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIHRvVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pZWxlbWVudAoreworICAgIHJldHVybiBbdHJlZUFkYXB0b3IgZHVwTm9kZTplbGVtZW50XTsKK30KKworLSAoaWQpIGR1cDooaWQpZWxlbWVudAoreworICAgIHJldHVybiBbdHJlZUFkYXB0b3IgZHVwVHJlZTplbGVtZW50XTsKKyAgICBAdGhyb3cgW0FOVExSUnVudGltZUV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJBTlRMUlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIiByZWFzb246QCJkdXAgY2FuJ3QgYmUgY2FsbGVkIGZvciBhIG5vZGUgc3RyZWFtLiJdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE4YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaApAQCAtMCwwICsxLDUwIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmgiDAwKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA6IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKworfQorCisrIChBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqKSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbjsKKysgKEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICopIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpYW5FbGVtZW50OworKyAoQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKikgbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHM7CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6KE5TQXJyYXkgKil0aGVFbGVtZW50czsKKworLSAoaWQpIG5leHROb2RlOworLSAoaWQpIGR1cDooaWQpZWxlbWVudDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm0KQEAgLTAsMCArMSwxMDEgQEAKKy8vCisvLyAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgS2F5IFLDtnBrZSBvbiA3LzE2LzA3LgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSw7Zwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbQorCisrIChBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb247Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gYWxsb2NdIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246YW5FbGVtZW50RGVzY3JpcHRpb25dOworfQorCisrIChBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSopIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6KGlkKWFuRWxlbWVudDsKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjphbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OmFuRWxlbWVudF07Cit9CisKKysgKEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKikgbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhbkVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooTlNBcnJheSAqKXRoZUVsZW1lbnRzOworeworICAgIHJldHVybiBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRyZWVBZGFwdG9yOmFUcmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6dGhlRWxlbWVudHNdOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uXSkgIT0gbmlsKSB7CisgICAgICAgIGRpcnR5ID0gTk87CisgICAgICAgIGlzU2luZ2xlRWxlbWVudCA9IFlFUzsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudDooaWQpYW5FbGVtZW50Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoVHJlZUFkYXB0b3I6YVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOmFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnQ6YW5FbGVtZW50XSkgIT0gbmlsKSB7CisgICAgICAgIGRpcnR5ID0gTk87CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFuRWxlbWVudERlc2NyaXB0aW9uIGVsZW1lbnRzOihOU0FycmF5ICopdGhlRWxlbWVudHMKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUcmVlQWRhcHRvcjphVHJlZUFkYXB0b3IgZGVzY3JpcHRpb246YW5FbGVtZW50RGVzY3JpcHRpb24gZWxlbWVudHM6dGhlRWxlbWVudHNdKSAhPSBuaWwpIHsKKyAgICAgICAgZGlydHkgPSBOTzsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKworLSAoaWQpIG5leHROb2RlCit7CisgICAgaWYgKGRpcnR5IHx8IChjdXJzb3IgPj0gW3NlbGYgc2l6ZV0gJiYgW3NlbGYgc2l6ZV0gPT0gMSkpCisgICAgICAgIHJldHVybiBbdHJlZUFkYXB0b3IgZHVwTm9kZTpbc2VsZiBfbmV4dF1dOworICAgIGVsc2UgCisgICAgICAgIHJldHVybiBbc2VsZiBfbmV4dF07Cit9CisKKy0gKGlkKSBkdXA6KGlkKWVsZW1lbnQKK3sKKyAgICByZXR1cm4gW3RyZWVBZGFwdG9yIGR1cFRyZWU6ZWxlbWVudF07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwYTBiZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaCIKKworCitAaW50ZXJmYWNlIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSA6IEFOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtIHsKKworfQorCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopZWxlbWVudERlc2NyaXB0aW9uOworLyoqIENyZWF0ZSBhIHN0cmVhbSB3aXRoIG9uZSBlbGVtZW50ICovCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpIG9uZUVsZW1lbnQ7CisvKiogQ3JlYXRlIGEgc3RyZWFtLCBidXQgZmVlZCBvZmYgYW4gZXhpc3RpbmcgbGlzdCAqLworKyAoaWQpIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKillbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KEFNdXRhYmxlQXJyYXkgKillbGVtZW50czsKKworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjooTlNTdHJpbmcgKilhRGVzY3JpcHRpb247CistIChpZCkgaW5pdFdpdGhUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yIAorICAgICAgICAgICAgICAgZGVzY3JpcHRpb246KE5TU3RyaW5nICopYURlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpZWxlbWVudDsKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KEFNdXRhYmxlQXJyYXkgKillbGVtZW50czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBHZXQgbmV4dCB0b2tlbiBmcm9tIHN0cmVhbSBhbmQgbWFrZSBhIG5vZGUgZm9yIGl0ICovCistIChpZCkgbmV4dE5vZGU7CisKKy0gKGlkKSBuZXh0VG9rZW47CisKKy8qKiBEb24ndCBjb252ZXJ0IHRvIGEgdHJlZSB1bmxlc3MgdGhleSBleHBsaWNpdGx5IGNhbGwgbmV4dFRyZWUuCisgKiAgVGhpcyB3YXkgd2UgY2FuIGRvIGhldGVybyB0cmVlIG5vZGVzIGluIHJld3JpdGUuCisgKi8KKy0gKGlkPEFOVExSQmFzZVRyZWU+KSB0b1RyZWU6KGlkPEFOVExSVG9rZW4+KWVsZW1lbnQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlYTNmOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tCkBAIC0wLDAgKzEsMTI4IEBACisvLworLy8gIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBLYXkgUsO2cGtlIG9uIDcvMTYvMDcuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCIKKyNpbXBvcnQgIkFOVExSSGFzaE1hcC5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0KKworKyAoaWQpIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgoreworICAgIHJldHVybiBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBhbGxvY10gaW5pdFdpdGhUcmVlQWRhcHRvcjphbkFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ZWxlbWVudERlc2NyaXB0aW9uXTsKK30KKworLyoqIENyZWF0ZSBhIHN0cmVhbSB3aXRoIG9uZSBlbGVtZW50ICovCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDooaWQpIG9uZUVsZW1lbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gYWxsb2NdIGluaXRXaXRoVHJlZUFkYXB0b3I6YWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjplbGVtZW50RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6b25lRWxlbWVudF07Cit9CisKKy8qKiBDcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0ICovCisrIChpZCkgbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWVsZW1lbnREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czooQU11dGFibGVBcnJheSAqKWVsZW1lbnRzCit7CisgICAgcmV0dXJuIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRyZWVBZGFwdG9yOmFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ZWxlbWVudERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOmVsZW1lbnRzXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCApIHsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFRyZWVBZGFwdG9yOmFuQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOmFEZXNjcmlwdGlvbl0pICE9IG5pbCApIHsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6KGlkKWFuRWxlbWVudAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFRyZWVBZGFwdG9yOmFuQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOmFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OmFuRWxlbWVudF0pICE9IG5pbCApIHsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOihOU1N0cmluZyAqKWFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgZWxlbWVudHM6KEFNdXRhYmxlQXJyYXkgKillbGVtZW50TGlzdAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFRyZWVBZGFwdG9yOmFuQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOmFEZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOmVsZW1lbnRMaXN0XSkgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIG5leHROb2RlCit7CisgICAgaWQ8QU5UTFJUb2tlbj4gdCA9IFtzZWxmIF9uZXh0XTsKKyAgICByZXR1cm4gW3RyZWVBZGFwdG9yIGNyZWF0ZTp0XTsKK30KKworLSAoaWQpIG5leHRUb2tlbgoreworICAgIHJldHVybiBbc2VsZiBfbmV4dF07Cit9CisKKy8qKiBEb24ndCBjb252ZXJ0IHRvIGEgdHJlZSB1bmxlc3MgdGhleSBleHBsaWNpdGx5IGNhbGwgbmV4dFRyZWUuCisgKiAgVGhpcyB3YXkgd2UgY2FuIGRvIGhldGVybyB0cmVlIG5vZGVzIGluIHJld3JpdGUuCisgKi8KKy0gKGlkPEFOVExSQmFzZVRyZWU+KSB0b1RyZWU6KGlkPEFOVExSVG9rZW4+KWVsZW1lbnQKK3sKKyAgICByZXR1cm4gZWxlbWVudDsKK30KKworLSAoaWQpIGNvcHlFbGVtZW50OihpZCllbGVtZW50Cit7CisgICAgQHRocm93IFtBTlRMUlJ1bnRpbWVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAiY29weSBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgdG9rZW4gc3RyZWFtLiJdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVNYXBFbGVtZW50LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVNYXBFbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0MGIxOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1hcEVsZW1lbnQuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZU1hcEVsZW1lbnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlTWFwRWxlbWVudC5oIgorCitAaW50ZXJmYWNlIEFOVExSUnVsZU1hcEVsZW1lbnQgOiBBTlRMUkJhc2VNYXBFbGVtZW50IHsKKyAgICBOU051bWJlciAqcnVsZU51bTsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSdWxlTnVtLCBzZXR0ZXI9c2V0UnVsZU51bTopIE5TTnVtYmVyICpydWxlTnVtOworCisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnQ7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHg7CisrIChBTlRMUlJ1bGVNYXBFbGVtZW50ICopIG5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQW5JbmRleDooTlNOdW1iZXIgKilhbklkeDsKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYW5JZHggUnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy0gKE5TTnVtYmVyICopZ2V0UnVsZU51bTsKKy0gKHZvaWQpc2V0UnVsZU51bTooTlNOdW1iZXIgKilhUnVsZU51bTsKKworLSAoTlNJbnRlZ2VyKXNpemU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1hcEVsZW1lbnQubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1hcEVsZW1lbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZThjNDYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdWxlTWFwRWxlbWVudC5tCkBAIC0wLDAgKzEsMTExIEBACisvLworLy8gIEFOVExSUnVsZU1hcEVsZW1lbnQubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlJ1bGVNYXBFbGVtZW50LmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSUnVsZU1hcEVsZW1lbnQKKworQHN5bnRoZXNpemUgcnVsZU51bTsKKworKyAoQU5UTFJSdWxlTWFwRWxlbWVudCAqKW5ld0FOVExSUnVsZU1hcEVsZW1lbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJ1bGVNYXBFbGVtZW50IGFsbG9jXSBpbml0XTsKK30KKworKyAoQU5UTFJSdWxlTWFwRWxlbWVudCAqKW5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYU51bWJlcgoreworICAgIHJldHVybiBbW0FOVExSUnVsZU1hcEVsZW1lbnQgYWxsb2NdIGluaXRXaXRoQW5JbmRleDooTlNOdW1iZXIgKilhTnVtYmVyXTsKK30KKworKyAoQU5UTFJSdWxlTWFwRWxlbWVudCAqKW5ld0FOVExSUnVsZU1hcEVsZW1lbnRXaXRoSW5kZXg6KE5TTnVtYmVyICopYU51bWJlciBSdWxlTnVtOihOU051bWJlciAqKWFSdWxlTnVtCit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlTWFwRWxlbWVudCBhbGxvY10gaW5pdFdpdGhBbkluZGV4OmFOdW1iZXIgUnVsZU51bTphUnVsZU51bV07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwgKSB7CisgICAgICAgIGluZGV4ID0gbmlsOworICAgICAgICBydWxlTnVtID0gbmlsOworICAgIH0KKyAgICByZXR1cm4gKHNlbGYpOworfQorCistIChpZCkgaW5pdFdpdGhBbkluZGV4OihOU051bWJlciAqKWFOdW1iZXIKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhBbkluZGV4OmFOdW1iZXJdKSAhPSBuaWwgKSB7CisgICAgICAgIHJ1bGVOdW0gPSBuaWw7CisgICAgfQorICAgIHJldHVybiAoc2VsZik7Cit9CisKKy0gKGlkKSBpbml0V2l0aEFuSW5kZXg6KE5TTnVtYmVyICopYU51bWJlciBSdWxlTnVtOihOU051bWJlciAqKWFSdWxlTnVtCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoQW5JbmRleDphTnVtYmVyXSkgIT0gbmlsICkgeworICAgICAgICBbYVJ1bGVOdW0gcmV0YWluXTsKKyAgICAgICAgcnVsZU51bSA9IGFSdWxlTnVtOworICAgIH0KKyAgICByZXR1cm4gKHNlbGYpOworfQorCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZQoreworICAgIEFOVExSUnVsZU1hcEVsZW1lbnQgKmNvcHk7CisgICAgCisgICAgY29weSA9IFtzdXBlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIGNvcHkucnVsZU51bSA9IHJ1bGVOdW07CisgICAgcmV0dXJuKCBjb3B5ICk7Cit9CisKKy0gKGlkKWdldFJ1bGVOdW0KK3sKKyAgICByZXR1cm4gcnVsZU51bTsKK30KKworLSAodm9pZClzZXRSdWxlTnVtOihpZClhUnVsZU51bQoreworICAgIGlmICggYVJ1bGVOdW0gIT0gcnVsZU51bSApIHsKKyAgICAgICAgaWYgKCBydWxlTnVtICkgW3J1bGVOdW0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZU51bSByZXRhaW5dOworICAgIH0KKyAgICBydWxlTnVtID0gYVJ1bGVOdW07Cit9CisKKy0gKE5TSW50ZWdlcilzaXplCit7CisgICAgTlNJbnRlZ2VyIGFTaXplID0gMDsKKyAgICBpZiAocnVsZU51bSAhPSBuaWwpIGFTaXplKys7CisgICAgaWYgKGluZGV4ICE9IG5pbCkgYVNpemUrKzsKKyAgICByZXR1cm4oIGFTaXplICk7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1lbW8uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1lbW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDk1YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdWxlTWVtby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vCisvLyAgQU5UTFJSdWxlTWVtby5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE2LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkxpbmtCYXNlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJSdWxlTWVtbyA6IEFOVExSTGlua0Jhc2UgeworICAgIE5TTnVtYmVyICpzdGFydEluZGV4OworICAgIE5TTnVtYmVyICpzdG9wSW5kZXg7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnRJbmRleCwgc2V0dGVyPXNldFN0YXJ0SW5kZXg6KSBOU051bWJlciAqc3RhcnRJbmRleDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RvcEluZGV4LCBzZXR0ZXI9c2V0U3RvcEluZGV4OikgTlNOdW1iZXIgKnN0b3BJbmRleDsKKworKyAoQU5UTFJSdWxlTWVtbyAqKW5ld0FOVExSUnVsZU1lbW87CisrIChBTlRMUlJ1bGVNZW1vICopbmV3QU5UTFJSdWxlTWVtb1dpdGhTdGFydEluZGV4OihOU051bWJlciAqKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4OworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFN0YXJ0SW5kZXg6KE5TTnVtYmVyICopYVN0YXJ0SW5kZXggU3RvcEluZGV4OihOU051bWJlciAqKWFTdG9wSW5kZXg7CisKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworCistIChBTlRMUlJ1bGVNZW1vICopZ2V0UnVsZVdpdGhTdGFydEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXg7CistIChOU051bWJlciAqKWdldFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleDsKKy0gKE5TTnVtYmVyICopZ2V0U3RvcEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXg7CistIChOU051bWJlciAqKWdldFN0YXJ0SW5kZXg7CistICh2b2lkKXNldFN0YXJ0SW5kZXg6KE5TTnVtYmVyICopYVN0YXJ0SW5kZXg7CistIChOU051bWJlciAqKWdldFN0b3BJbmRleDsKKy0gKHZvaWQpc2V0U3RvcEluZGV4OihOU051bWJlciAqKWFTdG9wSW5kZXg7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1lbW8ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZU1lbW8ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZkMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdWxlTWVtby5tCkBAIC0wLDAgKzEsMTU4IEBACisvLworLy8gIEFOVExSUnVsZU1lbW8ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlJ1bGVNZW1vLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSUnVsZU1lbW8KKworQHN5bnRoZXNpemUgc3RhcnRJbmRleDsKK0BzeW50aGVzaXplIHN0b3BJbmRleDsKKworKyAoQU5UTFJSdWxlTWVtbyAqKW5ld0FOVExSUnVsZU1lbW8KK3sKKyAgICByZXR1cm4gW1tBTlRMUlJ1bGVNZW1vIGFsbG9jXSBpbml0XTsKK30KKworKyAoQU5UTFJSdWxlTWVtbyAqKW5ld0FOVExSUnVsZU1lbW9XaXRoU3RhcnRJbmRleDooTlNOdW1iZXIgKilhbkluZGV4IFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlTWVtbyBhbGxvY10gaW5pdFdpdGhTdGFydEluZGV4OmFuSW5kZXggU3RvcEluZGV4OmFTdG9wSW5kZXhdOworfQorCistIChpZCkgaW5pdAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsICkgeworICAgICAgICBzdGFydEluZGV4ID0gbmlsOworICAgICAgICBzdG9wSW5kZXggPSBuaWw7CisgICAgfQorICAgIHJldHVybiAoc2VsZik7Cit9CisKKy0gKGlkKSBpbml0V2l0aFN0YXJ0SW5kZXg6KE5TTnVtYmVyICopYVN0YXJ0SW5kZXggU3RvcEluZGV4OihOU051bWJlciAqKWFTdG9wSW5kZXgKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCApIHsKKyAgICAgICAgW2FTdGFydEluZGV4IHJldGFpbl07CisgICAgICAgIHN0YXJ0SW5kZXggPSBhU3RhcnRJbmRleDsKKyAgICAgICAgW2FTdG9wSW5kZXggcmV0YWluXTsKKyAgICAgICAgc3RvcEluZGV4ID0gYVN0b3BJbmRleDsKKyAgICB9CisgICAgcmV0dXJuIChzZWxmKTsKK30KKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmUKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICpjb3B5OworICAgIAorICAgIGNvcHkgPSBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsKKyAgICBjb3B5LnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OworICAgIGNvcHkuc3RvcEluZGV4ID0gc3RvcEluZGV4OworICAgIHJldHVybiggY29weSApOworfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICBOU0ludGVnZXIgYUNudCA9IDA7CisgICAgCisgICAgaWYgKHN0YXJ0SW5kZXggIT0gbmlsKSBhQ250Kys7CisgICAgaWYgKHN0b3BJbmRleCAhPSBuaWwpIGFDbnQrKzsKKyAgICByZXR1cm4gYUNudDsKK30KKworLSAoTlNJbnRlZ2VyKSBzaXplCit7CisgICAgcmV0dXJuICgyICogc2l6ZW9mKGlkKSk7Cit9CisKKy0gKEFOVExSUnVsZU1lbW8gKilnZXRSdWxlV2l0aFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleAoreworICAgIEFOVExSUnVsZU1lbW8gKmFNYXRjaE1lbW8gPSBzZWxmOworICAgIGRvIHsKKyAgICAgICAgaWYgKGFTdGFydEluZGV4ID09IFthTWF0Y2hNZW1vLnN0YXJ0SW5kZXggaW50ZWdlclZhbHVlXSApIHsKKyAgICAgICAgICAgIHJldHVybiBhTWF0Y2hNZW1vOworICAgICAgICB9CisgICAgICAgIGFNYXRjaE1lbW8gPSBhTWF0Y2hNZW1vLmZOZXh0OworICAgIH0gd2hpbGUgKCBhTWF0Y2hNZW1vICE9IG5pbCApOworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKE5TTnVtYmVyICopZ2V0U3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4Cit7CisgICAgQU5UTFJSdWxlTWVtbyAqYU1hdGNoTWVtbyA9IHNlbGY7CisgICAgZG8geworICAgICAgICBpZiAoYVN0YXJ0SW5kZXggPT0gW2FNYXRjaE1lbW8uc3RhcnRJbmRleCBpbnRlZ2VyVmFsdWVdICkgeworICAgICAgICAgICAgcmV0dXJuIGFNYXRjaE1lbW8uc3RvcEluZGV4OworICAgICAgICB9CisgICAgICAgIGFNYXRjaE1lbW8gPSBhTWF0Y2hNZW1vLmZOZXh0OworICAgIH0gd2hpbGUgKCBhTWF0Y2hNZW1vICE9IG5pbCApOworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKE5TTnVtYmVyICopZ2V0U3RvcEluZGV4OihOU0ludGVnZXIpYVN0YXJ0SW5kZXgKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphTWF0Y2hNZW1vID0gc2VsZjsKKyAgICBkbyB7CisgICAgICAgIGlmIChhU3RhcnRJbmRleCA9PSBbYU1hdGNoTWVtby5zdGFydEluZGV4IGludGVnZXJWYWx1ZV0gKSB7CisgICAgICAgICAgICByZXR1cm4gYU1hdGNoTWVtby5zdG9wSW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgYU1hdGNoTWVtbyA9IGFNYXRjaE1lbW8uZk5leHQ7CisgICAgfSB3aGlsZSAoIGFNYXRjaE1lbW8gIT0gbmlsICk7CisgICAgcmV0dXJuIG5pbDsKK30KKworLSAoTlNOdW1iZXIgKilnZXRTdGFydEluZGV4OworeworICAgIHJldHVybiBzdGFydEluZGV4OworfQorCistICh2b2lkKXNldFN0YXJ0SW5kZXg6KE5TTnVtYmVyICopYVN0YXJ0SW5kZXgKK3sKKyAgICBpZiAoIGFTdGFydEluZGV4ICE9IHN0YXJ0SW5kZXggKSB7CisgICAgICAgIGlmICggc3RhcnRJbmRleCApIFtzdGFydEluZGV4IHJlbGVhc2VdOworICAgICAgICBbYVN0YXJ0SW5kZXggcmV0YWluXTsKKyAgICB9CisgICAgc3RhcnRJbmRleCA9IGFTdGFydEluZGV4OworfQorCistIChOU051bWJlciAqKWdldFN0b3BJbmRleDsKK3sKKyAgICByZXR1cm4gc3RvcEluZGV4OworfQorCistICh2b2lkKXNldFN0b3BJbmRleDooTlNOdW1iZXIgKilhU3RvcEluZGV4Cit7CisgICAgaWYgKCBhU3RvcEluZGV4ICE9IHN0b3BJbmRleCApIHsKKyAgICAgICAgaWYgKCBzdG9wSW5kZXggKSBbc3RvcEluZGV4IHJlbGVhc2VdOworICAgICAgICBbYVN0b3BJbmRleCByZXRhaW5dOworICAgIH0KKyAgICBzdG9wSW5kZXggPSBhU3RvcEluZGV4OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTMxM2VkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDU1IEBACisvLworLy8gIEFOVExSUnVsZVJldHVyblNjb3BlLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUlJ1bGVSZXR1cm5TY29wZSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+IHsKKworfQorCisvKiogUmV0dXJuIHRoZSBzdGFydCB0b2tlbiBvciB0cmVlICovCistIChpZDxBTlRMUlRva2VuPikgZ2V0U3RhcnQ7CisKKy8qKiBSZXR1cm4gdGhlIHN0b3AgdG9rZW4gb3IgdHJlZSAqLworLSAoaWQ8QU5UTFJUb2tlbj4pIGdldFN0b3A7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9QVNUOyAqLworLSAoaWQpIGdldFRyZWU7CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9dGVtcGxhdGU7IERvbid0IHVzZSBTdHJpbmdUZW1wbGF0ZQorICogIHR5cGUgYXMgaXQgdGhlbiBjYXVzZXMgYSBkZXBlbmRlbmN5IHdpdGggU1QgbGliLgorICovCistIChpZCkgZ2V0VGVtcGxhdGU7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZVJldHVyblNjb3BlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVSZXR1cm5TY29wZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODc4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVSZXR1cm5TY29wZS5tCkBAIC0wLDAgKzEsNzEgQEAKKy8vCisvLyAgQU5UTFJSdWxlUmV0dXJuU2NvcGUubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlJ1bGVSZXR1cm5TY29wZS5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJ1bGVSZXR1cm5TY29wZQorCisvKiogUmV0dXJuIHRoZSBzdGFydCB0b2tlbiBvciB0cmVlICovCistIChpZCkgZ2V0U3RhcnQKK3sKKyAgICByZXR1cm4gbmlsOworfQorCisvKiogUmV0dXJuIHRoZSBzdG9wIHRva2VuIG9yIHRyZWUgKi8KKy0gKGlkKSBnZXRTdG9wCit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLyoqIEhhcyBhIHZhbHVlIHBvdGVudGlhbGx5IGlmIG91dHB1dD1BU1Q7ICovCistIChpZCkgZ2V0VHJlZQoreworICAgIHJldHVybiBuaWw7Cit9CisKKy8qKiBIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9dGVtcGxhdGU7IERvbid0IHVzZSBTdHJpbmdUZW1wbGF0ZQorICogIHR5cGUgYXMgaXQgdGhlbiBjYXVzZXMgYSBkZXBlbmRlbmN5IHdpdGggU1QgbGliLgorICovCistIChpZCkgZ2V0VGVtcGxhdGUKK3sKKyAgICByZXR1cm4gbmlsOworfQorCisvLyBjcmVhdGUgYSBjb3B5LCBpbmNsdWRpbmcgdGhlIHRleHQgaWYgYXZhaWxhYmxlCisvLyB0aGUgaW5wdXQgc3RyZWFtIGlzICpub3QqIGNvcGllZCEKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmUKK3sKKyAgICBBTlRMUlJ1bGVSZXR1cm5TY29wZSAqY29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6dGhlWm9uZV0gaW5pdF07CisgICAgcmV0dXJuIGNvcHk7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZVN0YWNrLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVTdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDQ1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bGVTdGFjay5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2suaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkJhc2VTdGFjay5oIgorI2ltcG9ydCAiQU5UTFJIYXNoUnVsZS5oIgorCisvLyNkZWZpbmUgR0xPQkFMX1NDT1BFICAgICAgIDAKKy8vI2RlZmluZSBMT0NBTF9TQ09QRSAgICAgICAgMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSUnVsZVN0YWNrIDogQU5UTFJCYXNlU3RhY2sgeworfQorCisvLyBDb250cnVjdGlvbi9EZXN0cnVjdGlvbgorKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOworKyhBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250OworLShpZClpbml0OworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0odm9pZClkZWFsbG9jOworCisvLyBJbnN0YW5jZSBNZXRob2RzCistIChpZCkgY29weVdpdGhab25lOihOU1pvbmUgKilhWm9uZTsKKy8qIGNsZWFyIC0tIHJlaW5pdGlhbGl6ZSB0aGUgbWFwbGlzdCBhcnJheSAqLworCistIChOU0ludGVnZXIpY291bnQ7CistIChOU0ludGVnZXIpc2l6ZTsKKworLSAoQU5UTFJIYXNoUnVsZSAqKSBwb3A7CisKKy0gKHZvaWQpIGluc2VydE9iamVjdDooQU5UTFJIYXNoUnVsZSAqKWFIYXNoUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoQU5UTFJIYXNoUnVsZSAqKW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHg7CistICh2b2lkKXB1dEhhc2hSdWxlQXRSdWxlSW5kZXg6KE5TSW50ZWdlcilhUnVsZUluZGV4IFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilhU3RhcnRJbmRleCBTdG9wSW5kZXg6KE5TSW50ZWdlcilhU3RvcEluZGV4OworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdWxlU3RhY2subSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZVN0YWNrLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllOTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVsZVN0YWNrLm0KQEAgLTAsMCArMSwxNTIgQEAKKy8vCisvLyAgQU5UTFJSdWxlU3RhY2subQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi85LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNkZWZpbmUgU1VDQ0VTUyAoMCkKKyNkZWZpbmUgRkFJTFVSRSAoLTEpCisKK2V4dGVybiBOU0ludGVnZXIgZGVidWc7CisKKyNpbXBvcnQgIkFOVExSUnVsZVN0YWNrLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSUnVsZVN0YWNrCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJ1bGVTdGFjaworCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrCit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUlJ1bGVTdGFjayAqKW5ld0FOVExSUnVsZVN0YWNrOihOU0ludGVnZXIpY250Cit7CisgICAgcmV0dXJuIFtbQU5UTFJSdWxlU3RhY2sgYWxsb2NdIGluaXRXaXRoTGVuOmNudF07Cit9CisKKy0gKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLSAoaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46Y250XSkgIT0gbmlsKSB7CisJfQorICAgIHJldHVybiggc2VsZiApOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJSdWxlU3RhY2siICk7CisjZW5kaWYKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgcmV0dXJuIFtzdXBlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICBBTlRMUlJ1bGVNZW1vICphbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKChhbkVsZW1lbnQgPSBwdHJCdWZmZXJbaV0pICE9IG5pbCkKKyAgICAgICAgICAgIGFDbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGFDbnQ7Cit9CisKKy0gKE5TSW50ZWdlcilzaXplCit7CisgICAgQU5UTFJSdWxlTWVtbyAqYW5FbGVtZW50OworICAgIE5TSW50ZWdlciBhU2l6ZSA9IDA7CisgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBCdWZmU2l6ZTsgaSsrICkgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhU2l6ZSsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhU2l6ZTsKK30KKworLSAoQU5UTFJIYXNoUnVsZSAqKXBvcAoreworICAgIHJldHVybiAoQU5UTFJIYXNoUnVsZSAqKVtzdXBlciBwb3BdOworfQorCistICh2b2lkKSBpbnNlcnRPYmplY3Q6KEFOVExSSGFzaFJ1bGUgKilhUnVsZSBhdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgaWYgKCBpZHggPj0gQnVmZlNpemUgKSB7CisgICAgICAgIGlmICggZGVidWcgPiAyICkgTlNMb2coIEAiSW4gQU5UTFJSdWxlU3RhY2sgYXR0ZW1wdGluZyB0byBpbnNlcnQgYVJ1bGUgYXQgSW5kZXggJWQsIGJ1dCBCdWZmZXIgaXMgb25seSAlZCBsb25nXG4iLCBpZHgsIEJ1ZmZTaXplICk7CisgICAgICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OmlkeF07CisgICAgfQorICAgIGlmICggYVJ1bGUgIT0gcHRyQnVmZmVyW2lkeF0gKSB7CisgICAgICAgIGlmICggcHRyQnVmZmVyW2lkeF0gKSBbcHRyQnVmZmVyW2lkeF0gcmVsZWFzZV07CisgICAgICAgIFthUnVsZSByZXRhaW5dOworICAgIH0KKyAgICBwdHJCdWZmZXJbaWR4XSA9IGFSdWxlOworfQorCistIChBTlRMUkhhc2hSdWxlICopb2JqZWN0QXRJbmRleDooTlNJbnRlZ2VyKWlkeAoreworICAgIGlmIChpZHggPCBCdWZmU2l6ZSkgeworICAgICAgICByZXR1cm4gcHRyQnVmZmVyW2lkeF07CisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpcHV0SGFzaFJ1bGVBdFJ1bGVJbmRleDooTlNJbnRlZ2VyKWFSdWxlSW5kZXggU3RhcnRJbmRleDooTlNJbnRlZ2VyKWFTdGFydEluZGV4IFN0b3BJbmRleDooTlNJbnRlZ2VyKWFTdG9wSW5kZXgKK3sKKyAgICBBTlRMUkhhc2hSdWxlICphSGFzaFJ1bGU7CisgICAgQU5UTFJSdWxlTWVtbyAqYVJ1bGVNZW1vOworCisgICAgaWYgKGFSdWxlSW5kZXggPj0gQnVmZlNpemUpIHsKKyAgICAgICAgaWYgKCBkZWJ1ZykgTlNMb2coIEAicHV0SGFzaFJ1bGVBdFJ1bGVJbmRleCBhdHRlbXB0aW5nIHRvIGluc2VydCBhUnVsZSBhdCBJbmRleCAlZCwgYnV0IEJ1ZmZlciBpcyBvbmx5ICVkIGxvbmdcbiIsIGFSdWxlSW5kZXgsIEJ1ZmZTaXplICk7CisgICAgICAgIFtzZWxmIGVuc3VyZUNhcGFjaXR5OmFSdWxlSW5kZXhdOworICAgIH0KKyAgICBpZiAoKGFIYXNoUnVsZSA9IHB0ckJ1ZmZlclthUnVsZUluZGV4XSkgPT0gbmlsKSB7CisgICAgICAgIGFIYXNoUnVsZSA9IFtbQU5UTFJIYXNoUnVsZSBuZXdBTlRMUkhhc2hSdWxlV2l0aExlbjoxN10gcmV0YWluXTsKKyAgICAgICAgcHRyQnVmZmVyW2FSdWxlSW5kZXhdID0gYUhhc2hSdWxlOworICAgIH0KKyAgICBpZiAoKCBhUnVsZU1lbW8gPSBbYUhhc2hSdWxlIG9iamVjdEF0SW5kZXg6YVN0YXJ0SW5kZXhdICkgPT0gbmlsICkgeworICAgICAgICBhUnVsZU1lbW8gPSBbW0FOVExSUnVsZU1lbW8gbmV3QU5UTFJSdWxlTWVtb10gcmV0YWluXTsKKyAgICAgICAgW2FIYXNoUnVsZSBpbnNlcnRPYmplY3Q6YVJ1bGVNZW1vIGF0SW5kZXg6YVN0YXJ0SW5kZXhdOworICAgIH0KKyAgICBbYVJ1bGVNZW1vIHNldFN0YXJ0SW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdGFydEluZGV4XV07CisgICAgW2FSdWxlTWVtbyBzZXRTdG9wSW5kZXg6W05TTnVtYmVyIG51bWJlcldpdGhJbnRlZ2VyOmFTdG9wSW5kZXhdXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bnRpbWVFeGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgzNGQyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vCisvLyAgQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvNS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCitAaW50ZXJmYWNlIEFOVExSUnVudGltZUV4Y2VwdGlvbiA6IE5TRXhjZXB0aW9uIHsKK30KKworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0V4Y2VwdGlvbjsKKysgKEFOVExSUnVudGltZUV4Y2VwdGlvbiAqKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbjsKKysgKEFOVExSUnVudGltZUV4Y2VwdGlvbiAqKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCisrIChBTlRMUlJ1bnRpbWVFeGNlcHRpb24gKikgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworKyAoQU5UTFJSdW50aW1lRXhjZXB0aW9uICopIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFSZWFzb247CistIChpZCkgaW5pdDooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm87CistIChpZCkgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCistIChOU1N0cmluZyAqKSBEZXNjcmlwdGlvbjsKKy0gKGlkKSBzdGFja1RyYWNlOihOU0V4Y2VwdGlvbiAqKWU7CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA6IEFOVExSUnVudGltZUV4Y2VwdGlvbiB7Cit9CisKKysgKGlkKSBuZXdFeGNlcHRpb247CisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb247CisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbzsKKworLSAoaWQpIGluaXQ7CistIChpZClpbml0OihOU1N0cmluZyAqKWFSZWFzb247CistIChpZClpbml0OihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbzsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSSWxsZWdhbFN0YXRlRXhjZXB0aW9uIDogQU5UTFJSdW50aW1lRXhjZXB0aW9uIHsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjsKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbjsKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCistIChpZCkgaW5pdDsKKy0gKGlkKWluaXQ6KE5TU3RyaW5nICopYVJlYXNvbjsKKy0gKGlkKWluaXQ6KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIDogQU5UTFJSdW50aW1lRXhjZXB0aW9uIHsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjsKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbjsKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFSZWFzb247CistIChpZCkgaW5pdDooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm87CisKK0BlbmQKKworQGludGVyZmFjZSBBTlRMUlJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24gOiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24geworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uOworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworCitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiA6IEFOVExSUnVudGltZUV4Y2VwdGlvbiB7Cit9CisKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbjsKKworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbjsKKy0gKGlkKSBpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopYU1zZyByZWFzb246KE5TU3RyaW5nICopYUNhdXNlIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKil1c2VySW5mbzsKKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bnRpbWVFeGNlcHRpb24ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSUnVudGltZUV4Y2VwdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyN2ZjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlJ1bnRpbWVFeGNlcHRpb24ubQpAQCAtMCwwICsxLDI3OSBAQAorLy8KKy8vICBBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi81LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJ1bnRpbWVFeGNlcHRpb24KKworKyAoaWQpIG5ld0V4Y2VwdGlvbgoreworICAgIHJldHVybiBbW0FOVExSUnVudGltZUV4Y2VwdGlvbiBhbGxvY10gaW5pdF07Cit9CisKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbgoreworICAgIHJldHVybiBbW0FOVExSUnVudGltZUV4Y2VwdGlvbiBhbGxvY10gaW5pdDphUmVhc29uXTsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm8KK3sKKyAgICByZXR1cm4gW1tBTlRMUlJ1bnRpbWVFeGNlcHRpb24gYWxsb2NdIGluaXQ6YVJlYXNvbiB1c2VySW5mbzphVXNlckluZm9dOworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uOworeworICAgIHJldHVybiBbW0FOVExSUnVudGltZUV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhOYW1lOmFOYW1lIHJlYXNvbjphUmVhc29uXTsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvOworeworICAgIHJldHVybiBbW0FOVExSUnVudGltZUV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhOYW1lOmFOYW1lIHJlYXNvbjphUmVhc29uIHVzZXJJbmZvOmFVc2VySW5mb107Cit9CisKKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTpAIkFOVExSUnVudGltZUV4Y2VwdGlvbiIgcmVhc29uOkAiVW5rbm93bkV4Y2VwdGlvbiIgdXNlckluZm86bmlsXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFSZWFzb24KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilAIkFOVExSUnVudGltZUV4Y2VwdGlvbiIgcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKW5pbF07CisgICAgcmV0dXJuKHNlbGYpOworfQorCistIChpZCkgaW5pdDooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm8KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTpAIkFOVExSUnVudGltZUV4Y2VwdGlvbiIgcmVhc29uOmFSZWFzb24gdXNlckluZm86YVVzZXJJbmZvXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKKy0gKGlkKSBpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopYU5hbWUgcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopbmlsXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKKy0gKGlkKSBpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopYU5hbWUgcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbworeworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOihOU1N0cmluZyAqKWFOYW1lIHJlYXNvbjooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm9dOworICAgIHJldHVybihzZWxmKTsKK30KKworLSAoTlNTdHJpbmcgKikgRGVzY3JpcHRpb24KK3sKKyAgICByZXR1cm4gW3N1cGVyIHJlYXNvbl07Cit9CisKKy0gKGlkKSBzdGFja1RyYWNlOihOU0V4Y2VwdGlvbiAqKWUKK3sKKyAgICBOU0FycmF5ICphZGRycyA9IFtlIGNhbGxTdGFja1JldHVybkFkZHJlc3Nlc107CisgICAgTlNBcnJheSAqdHJhY2UgPSBbZSBjYWxsU3RhY2tTeW1ib2xzXTsKKyAgICAKKyAgICBmb3IgKE5TU3RyaW5nICp0cmFjZVN0ciBpbiB0cmFjZSkgeworICAgICAgICBOU0xvZyggQCIlQCIsIHRyYWNlU3RyKTsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHNwZWNpYWwgYWZ0ZXIgdGVzdGluZworICAgICAgICBpZiAoW3RyYWNlU3RyIGhhc1ByZWZpeDpAIm1haW4oIl0gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHRyYWNlU3RyOworICAgICAgICBpZiAoIVt0cmFjZVN0ciBoYXNQcmVmaXg6QCJvcmcuc3RyaW5ndGVtcGxhdGUiXSkKKyAgICAgICAgICAgIHJldHVybiB0cmFjZVN0cjsKKyAgICB9CisgICAgcmV0dXJuIHRyYWNlOyAgICAKK30KKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKworKyAoaWQpIG5ld0V4Y2VwdGlvbgoreworICAgIHJldHVybiBbW0FOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGFsbG9jXSBpbml0XTsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYWxsb2NdIGluaXQ6YVJlYXNvbl07Cit9CisKKysgKGlkKSBuZXdFeGNlcHRpb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYWxsb2NdIGluaXQ6YVJlYXNvbiB1c2VySW5mbzphVXNlckluZm9dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOkAiQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iIHJlYXNvbjpAIlVua25vd25FeGNlcHRpb24iIHVzZXJJbmZvOm5pbF07CisgICAgcmV0dXJuKHNlbGYpOworfQorCistIChpZCkgaW5pdDooTlNTdHJpbmcgKilhUmVhc29uCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6QCJBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIgcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86bmlsXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbworeworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOkAiQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iIHJlYXNvbjphUmVhc29uIHVzZXJJbmZvOmFVc2VySW5mb107CisgICAgcmV0dXJuKHNlbGYpOworfQorCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorCisrIChpZCkgbmV3RXhjZXB0aW9uCit7CisgICAgcmV0dXJuIFtbQU5UTFJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gYWxsb2NdIGluaXRdOworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb24KK3sKKyAgICByZXR1cm4gW1tBTlRMUklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBhbGxvY10gaW5pdDphUmVhc29uXTsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm8KK3sKKyAgICByZXR1cm4gW1tBTlRMUklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBhbGxvY10gaW5pdDphUmVhc29uIHVzZXJJbmZvOmFVc2VySW5mb107Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6QCJBTlRMUklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIgcmVhc29uOkAiVW5rbm93bkV4Y2VwdGlvbiIgdXNlckluZm86bmlsXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFSZWFzb24KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoTmFtZTpAIkFOVExSSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzpuaWxdOworICAgIHJldHVybihzZWxmKTsKK30KKworLSAoaWQpIGluaXQ6KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6QCJBTlRMUklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIgcmVhc29uOmFSZWFzb24gdXNlckluZm86YVVzZXJJbmZvXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorCisrIChpZCkgbmV3RXhjZXB0aW9uCit7CisgICAgcmV0dXJuIFtbQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGFsbG9jXSBpbml0XTsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooTlNTdHJpbmcgKilhUmVhc29uCit7CisgICAgcmV0dXJuIFtbQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGFsbG9jXSBpbml0OmFSZWFzb25dOworfQorCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbworeworICAgIHJldHVybiBbW0FOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBhbGxvY10gaW5pdDphUmVhc29uIHVzZXJJbmZvOihOU0RpY3Rpb25hcnkgKilhVXNlckluZm9dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOkAiQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIiByZWFzb246QCJVbmtub3duRXhjZXB0aW9uIiB1c2VySW5mbzpuaWxdOworICAgIHJldHVybihzZWxmKTsKK30KKworLSAoaWQpIGluaXQ6KE5TU3RyaW5nICopYVJlYXNvbgoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOkAiQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIiByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopbmlsXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKKy0gKGlkKSBpbml0OihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbworeworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOkAiQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIiByZWFzb246YVJlYXNvbiB1c2VySW5mbzphVXNlckluZm9dOworICAgIHJldHVybihzZWxmKTsKK30KKworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopYVVzZXJJbmZvCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6YU5hbWUgcmVhc29uOmFSZWFzb24gdXNlckluZm86YVVzZXJJbmZvXTsKKyAgICByZXR1cm4oc2VsZik7Cit9CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbgorCisrIChpZCkgbmV3RXhjZXB0aW9uCit7CisJcmV0dXJuIFtbc2VsZiBhbGxvY10gaW5pdF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisJc2VsZiA9IFtzdXBlciBpbml0V2l0aE5hbWU6QCJSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uIiByZWFzb246bmlsIHVzZXJJbmZvOm5pbF07CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopYU5hbWUgcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24gdXNlckluZm86KE5TRGljdGlvbmFyeSAqKWFVc2VySW5mbworeworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOmFOYW1lIHJlYXNvbjphUmVhc29uIHVzZXJJbmZvOmFVc2VySW5mb107CisgICAgcmV0dXJuKHNlbGYpOworfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworCXJldHVybiBbc2VsZiBuYW1lXTsKK30KKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gQU5UTFJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorCisrIChpZCkgbmV3RXhjZXB0aW9uOihOU1N0cmluZyAqKWFSZWFzb24KK3sKKyAgICByZXR1cm4gW1tBTlRMUlJ1bnRpbWVFeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoTmFtZTpAIlVuc3VwcG9ydGVkIE9wZXJhdGlvbiBFeGNlcHRpb24iIHJlYXNvbjphUmVhc29uIHVzZXJJbmZvOm5pbF07Cit9CisKKy0gKGlkKSBpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopYU5hbWUgcmVhc29uOihOU1N0cmluZyAqKWFSZWFzb24KK3sKKyAgICBzZWxmPVtzdXBlciBpbml0V2l0aE5hbWU6YU5hbWUgcmVhc29uOmFSZWFzb24gdXNlckluZm86bmlsXTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoTmFtZTooTlNTdHJpbmcgKilhTmFtZSByZWFzb246KE5TU3RyaW5nICopYVJlYXNvbiB1c2VySW5mbzooTlNEaWN0aW9uYXJ5ICopdXNlckluZm8KK3sKKyAgICBzZWxmPVtzdXBlciBpbml0V2l0aE5hbWU6YU5hbWUgcmVhc29uOmFSZWFzb24gdXNlckluZm86dXNlckluZm9dOworICAgIHJldHVybiBzZWxmOworfQorCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyZWFtRW51bWVyYXRvci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxMDJmMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyZWFtRW51bWVyYXRvci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vCisvLyAgQU5UTFJTdHJlYW1FbnVtZXJ0b3IuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjkvMDQvMjAxMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisKK0BpbnRlcmZhY2UgQU5UTFJTdHJlYW1FbnVtZXJhdG9yIDogTlNFbnVtZXJhdG9yIAoreworCU5TSW50ZWdlciBpOworCWlkIGVvZjsKKwlBTXV0YWJsZUFycmF5ICpub2RlczsKK30KKworLShpZCkgaW5pdFdpdGhOb2RlczooQU11dGFibGVBcnJheSAqKSBuIGFuZEVPRjooaWQpIG9iajsKKy0oQk9PTCkgaGFzTmV4dDsKKworQHByb3BlcnR5IE5TSW50ZWdlciBpOworQHByb3BlcnR5IChyZXRhaW4pIGlkIGVvZjsKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTXV0YWJsZUFycmF5ICpub2RlczsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyZWFtRW51bWVyYXRvci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzNjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyZWFtRW51bWVyYXRvci5tCkBAIC0wLDAgKzEsNzcgQEAKKy8vCisvLyAgQU5UTFJTdHJlYW1FbnVtZXJ0b3IubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjkvMDQvMjAxMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSU3RyZWFtRW51bWVyYXRvci5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlN0cmVhbUVudW1lcmF0b3IKKworLShpZCkgaW5pdAoreworCXNlbGYgPSBbc3VwZXIgaW5pdF07CisJaWYgKHNlbGYpCisJeworCQlpID0gMDsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQpIGluaXRXaXRoTm9kZXM6KEFNdXRhYmxlQXJyYXkgKikgbiBhbmRFT0Y6KGlkKSBvYmoKK3sKKwlzZWxmID0gW3NlbGYgaW5pdF07CisJaWYgKHNlbGYpCisJeworCQlub2RlcyA9IG47CisJCWVvZiA9IG9iajsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgaGFzTmV4dAoreworCXJldHVybiBpIDwgW25vZGVzIGNvdW50XTsKK30KKworLShpZCkgbmV4dE9iamVjdAoreworCU5TVUludGVnZXIgY3VycmVudCA9IGk7CisJaSsrOworCWlmIChjdXJyZW50IDwgW25vZGVzIGNvdW50XSkKKwl7CisJCXJldHVybiBbbm9kZXMgb2JqZWN0QXRJbmRleDpjdXJyZW50XTsKKwl9CisJcmV0dXJuIGVvZjsKK30KKworQHN5bnRoZXNpemUgaTsKK0BzeW50aGVzaXplIGVvZjsKK0BzeW50aGVzaXplIG5vZGVzOworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJTdHJpbmdTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwNGExNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbVN0YXRlLmgiCisjaW1wb3J0ICJBTlRMUlB0ckJ1ZmZlci5oIgorCitAaW50ZXJmYWNlIEFOVExSU3RyaW5nU3RyZWFtIDogTlNPYmplY3QgPCBBTlRMUkNoYXJTdHJlYW0gPiB7CisJTlNTdHJpbmcgKmRhdGE7CisJTlNJbnRlZ2VyIG47CisJTlNJbnRlZ2VyIGluZGV4OworCU5TVUludGVnZXIgbGluZTsKKwlOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKwlOU0ludGVnZXIgbWFya0RlcHRoOworCUFOVExSUHRyQnVmZmVyICptYXJrZXJzOworCU5TSW50ZWdlciBsYXN0TWFya2VyOworCU5TU3RyaW5nICpuYW1lOworICAgIEFOVExSQ2hhclN0cmVhbVN0YXRlICpjaGFyU3RhdGU7Cit9CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW07CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW06KE5TU3RyaW5nICopYVN0cmluZzsKKworKyBuZXdBTlRMUlN0cmluZ1N0cmVhbTooY2hhciAqKW15RGF0YSBDb3VudDooTlNJbnRlZ2VyKW51bUJ5dGVzOworCistIChpZCkgaW5pdDsKKworLy8gdGhpcyBpbml0aWFsaXplciBjb3BpZXMgdGhlIHN0cmluZworLSAoaWQpIGluaXRXaXRoU3RyaW5nOihOU1N0cmluZyAqKSB0aGVTdHJpbmc7CisKKy8vIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBjb25zdHJ1Y3RvciBhcyBubyBkYXRhIGlzIGNvcGllZAorLSAoaWQpIGluaXRXaXRoU3RyaW5nTm9Db3B5OihOU1N0cmluZyAqKSB0aGVTdHJpbmc7CisKKy0gKGlkKSBpbml0V2l0aERhdGE6KGNoYXIgKilteURhdGEgQ291bnQ6KE5TSW50ZWdlciludW1CeXRlczsKKworLSAodm9pZCkgZGVhbGxvYzsKKworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisKKy8vIHJlc2V0IHRoZSBzdHJlYW0ncyBzdGF0ZSwgYnV0IGtlZXAgdGhlIGRhdGEgdG8gZmVlZCBvZmYKKy0gKHZvaWQpIHJlc2V0OworLy8gY29uc3VtZSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHN0cmVhbQorLSAodm9pZCkgY29uc3VtZTsKKworLy8gbG9vayBhaGVhZCBpIGNoYXJhY3RlcnMKKy0gKE5TSW50ZWdlcikgTEE6KE5TSW50ZWdlcikgaTsKKy0gKE5TSW50ZWdlcikgTFQ6KE5TSW50ZWdlcikgaTsKKworLy8gdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCistIChOU0ludGVnZXIpIHNpemU7CisKKy8vIHNlZWsgYW5kIHJld2luZCBpbiB0aGUgc3RyZWFtCistIChOU0ludGVnZXIpIG1hcms7CistICh2b2lkKSByZXdpbmQ6KE5TSW50ZWdlcikgbWFya2VyOworLSAodm9pZCkgcmV3aW5kOworLSAodm9pZCkgcmVsZWFzZTooTlNJbnRlZ2VyKSBtYXJrZXI7CistICh2b2lkKSBzZWVrOihOU0ludGVnZXIpIGluZGV4OworCisvLyBwcm92aWRlIHRoZSBzdHJlYW1zIGRhdGEgKGUuZy4gZm9yIHRva2VucyB1c2luZyBpbmRpY2VzKQorLSAoTlNTdHJpbmcgKikgc3Vic3RyaW5nOihOU0ludGVnZXIpc3RhcnRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BJbmRleDsKKy0gKE5TU3RyaW5nICopIHN1YnN0cmluZ1dpdGhSYW5nZTooTlNSYW5nZSkgdGhlUmFuZ2U7CisKKy0gKEFOVExSUHRyQnVmZmVyICopZ2V0TWFya2VyczsKKy0gKHZvaWQpIHNldE1hcmtlcnM6KEFOVExSUHRyQnVmZmVyICopYU1hcmtlckxpc3Q7CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZTsKKworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworLy8gYWNjZXNzb3JzIHRvIHRoZSByYXcgZGF0YSBvZiB0aGlzIHN0cmVhbQorCitAcHJvcGVydHkgKHJldGFpbikgTlNTdHJpbmcgKmRhdGE7CitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGluZGV4OworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBuOworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgbWFya0RlcHRoOworQHByb3BlcnR5IChyZXRhaW4pIEFOVExSUHRyQnVmZmVyICptYXJrZXJzOworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZXRhaW4pIEFOVExSQ2hhclN0cmVhbVN0YXRlICpjaGFyU3RhdGU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN0cmluZ1N0cmVhbS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN0cmluZ1N0cmVhbS5tCkBAIC0wLDAgKzEsMzg3IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0ICJBTlRMUlN0cmluZ1N0cmVhbS5oIgorCitleHRlcm4gTlNJbnRlZ2VyIGRlYnVnOworCitAaW1wbGVtZW50YXRpb24gQU5UTFJTdHJpbmdTdHJlYW0KKworQHN5bnRoZXNpemUgZGF0YTsKK0BzeW50aGVzaXplIG47CitAc3ludGhlc2l6ZSBpbmRleDsKK0BzeW50aGVzaXplIGxpbmU7CitAc3ludGhlc2l6ZSBjaGFyUG9zaXRpb25JbkxpbmU7CitAc3ludGhlc2l6ZSBtYXJrRGVwdGg7CitAc3ludGhlc2l6ZSBtYXJrZXJzOworQHN5bnRoZXNpemUgbGFzdE1hcmtlcjsKK0BzeW50aGVzaXplIG5hbWU7CitAc3ludGhlc2l6ZSBjaGFyU3RhdGU7CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW0KK3sKKyAgICByZXR1cm4gW1tBTlRMUlN0cmluZ1N0cmVhbSBhbGxvY10gaW5pdF07Cit9CisKKysgbmV3QU5UTFJTdHJpbmdTdHJlYW06KE5TU3RyaW5nICopYVN0cmluZzsKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN0cmluZ1N0cmVhbSBhbGxvY10gaW5pdFdpdGhTdHJpbmc6YVN0cmluZ107Cit9CisKKworKyBuZXdBTlRMUlN0cmluZ1N0cmVhbTooY2hhciAqKW15RGF0YSBDb3VudDooTlNJbnRlZ2VyKW51bUJ5dGVzOworeworICAgIHJldHVybiBbW0FOVExSU3RyaW5nU3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6bXlEYXRhIENvdW50Om51bUJ5dGVzXTsKK30KKworCistIChpZCkgaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIG4gPSAwOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIGxpbmUgPSAxOworICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSAwOworICAgICAgICBtYXJrRGVwdGggPSAwOworCQltYXJrZXJzID0gW0FOVExSUHRyQnVmZmVyIG5ld0FOVExSUHRyQnVmZmVyV2l0aExlbjoxMF07CisgICAgICAgIFttYXJrZXJzIHJldGFpbl07CisgICAgICAgIFttYXJrZXJzIGFkZE9iamVjdDpbTlNOdWxsIG51bGxdXTsgLy8gQU5UTFIgZ2VuZXJhdGVzIGNvZGUgdGhhdCBhc3N1bWVzIG1hcmtlcnMgdG8gYmUgMS1iYXNlZCwKKyAgICAgICAgY2hhclN0YXRlID0gW1tBTlRMUkNoYXJTdHJlYW1TdGF0ZSBuZXdBTlRMUkNoYXJTdHJlYW1TdGF0ZV0gcmV0YWluXTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFN0cmluZzooTlNTdHJpbmcgKikgdGhlU3RyaW5nCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJLy9bc2VsZiBzZXREYXRhOltOU1N0cmluZyBzdHJpbmdXaXRoU3RyaW5nOnRoZVN0cmluZ11dOworICAgICAgICBkYXRhID0gW3RoZVN0cmluZyByZXRhaW5dOworICAgICAgICBuID0gW2RhdGEgbGVuZ3RoXTsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBsaW5lID0gMTsKKyAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKyAgICAgICAgbWFya0RlcHRoID0gMDsKKwkJbWFya2VycyA9IFtbQU5UTFJQdHJCdWZmZXIgbmV3QU5UTFJQdHJCdWZmZXJXaXRoTGVuOjEwXSByZXRhaW5dOworICAgICAgICBbbWFya2VycyBhZGRPYmplY3Q6W05TTnVsbCBudWxsXV07IC8vIEFOVExSIGdlbmVyYXRlcyBjb2RlIHRoYXQgYXNzdW1lcyBtYXJrZXJzIHRvIGJlIDEtYmFzZWQsCisgICAgICAgIGNoYXJTdGF0ZSA9IFtbQU5UTFJDaGFyU3RyZWFtU3RhdGUgbmV3QU5UTFJDaGFyU3RyZWFtU3RhdGVdIHJldGFpbl07CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhTdHJpbmdOb0NvcHk6KE5TU3RyaW5nICopIHRoZVN0cmluZworeworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisJCS8vW3NlbGYgc2V0RGF0YTp0aGVTdHJpbmddOworICAgICAgICBkYXRhID0gW3RoZVN0cmluZyByZXRhaW5dOworICAgICAgICBuID0gW2RhdGEgbGVuZ3RoXTsKKyAgICAgICAgaW5kZXggPSAwOworICAgICAgICBsaW5lID0gMTsKKyAgICAgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKyAgICAgICAgbWFya0RlcHRoID0gMDsKKwkJbWFya2VycyA9IFtBTlRMUlB0ckJ1ZmZlciBuZXdBTlRMUlB0ckJ1ZmZlcldpdGhMZW46MTAwXTsKKyAgICAgICAgW21hcmtlcnMgcmV0YWluXTsKKyAgICAgICAgW21hcmtlcnMgYWRkT2JqZWN0OltOU051bGwgbnVsbF1dOyAvLyBBTlRMUiBnZW5lcmF0ZXMgY29kZSB0aGF0IGFzc3VtZXMgbWFya2VycyB0byBiZSAxLWJhc2VkLAorICAgICAgICBjaGFyU3RhdGUgPSBbW0FOVExSQ2hhclN0cmVhbVN0YXRlIG5ld0FOVExSQ2hhclN0cmVhbVN0YXRlXSByZXRhaW5dOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoRGF0YTooY2hhciAqKW15RGF0YSBDb3VudDooTlNJbnRlZ2VyKW51bUJ5dGVzCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgZGF0YSA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ1N0cmluZzpteURhdGEgZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nXTsKKyAgICAgICAgbiA9IG51bUJ5dGVzOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIGxpbmUgPSAxOworICAgICAgICBjaGFyUG9zaXRpb25JbkxpbmUgPSAwOworICAgICAgICBtYXJrRGVwdGggPSAwOworCQltYXJrZXJzID0gW0FOVExSUHRyQnVmZmVyIG5ld0FOVExSUHRyQnVmZmVyV2l0aExlbjoxMDBdOworICAgICAgICBbbWFya2VycyByZXRhaW5dOworICAgICAgICBbbWFya2VycyBhZGRPYmplY3Q6W05TTnVsbCBudWxsXV07IC8vIEFOVExSIGdlbmVyYXRlcyBjb2RlIHRoYXQgYXNzdW1lcyBtYXJrZXJzIHRvIGJlIDEtYmFzZWQsCisgICAgICAgIGNoYXJTdGF0ZSA9IFtbQU5UTFJDaGFyU3RyZWFtU3RhdGUgbmV3QU5UTFJDaGFyU3RyZWFtU3RhdGVdIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiggc2VsZiApOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSU3RyaW5nU3RyZWFtIiApOworI2VuZGlmCisgICAgaWYgKCBtYXJrZXJzICYmIFttYXJrZXJzIGNvdW50XSApIHsKKyAgICAgICAgW21hcmtlcnMgcmVtb3ZlQWxsT2JqZWN0c107CisgICAgICAgIFttYXJrZXJzIHJlbGVhc2VdOworICAgICAgICBtYXJrZXJzID0gbmlsOworICAgIH0KKyAgICBpZiAoIGRhdGEgKSB7CisgICAgICAgIFtkYXRhIHJlbGVhc2VdOworICAgICAgICBkYXRhID0gbmlsOworICAgIH0KKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgQU5UTFJTdHJpbmdTdHJlYW0gKmNvcHk7CisJCisgICAgY29weSA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6YVpvbmVdIGluaXRdOworICAgIC8vICAgIGNvcHkgPSBbc3VwZXIgY29weVdpdGhab25lOmFab25lXTsgLy8gYWxsb2NhdGlvbiBvY2N1cnMgaGVyZQorICAgIGlmICggZGF0YSAhPSBuaWwgKQorICAgICAgICBjb3B5LmRhdGEgPSBbc2VsZi5kYXRhIGNvcHlXaXRoWm9uZTphWm9uZV07CisgICAgY29weS5uID0gbjsKKyAgICBjb3B5LmluZGV4ID0gaW5kZXg7CisgICAgY29weS5saW5lID0gbGluZTsKKyAgICBjb3B5LmNoYXJQb3NpdGlvbkluTGluZSA9IGNoYXJQb3NpdGlvbkluTGluZTsKKyAgICBjb3B5Lm1hcmtEZXB0aCA9IG1hcmtEZXB0aDsKKyAgICBpZiAoIG1hcmtlcnMgIT0gbmlsICkKKyAgICAgICAgY29weS5tYXJrZXJzID0gW21hcmtlcnMgY29weVdpdGhab25lOm5pbF07CisgICAgY29weS5sYXN0TWFya2VyID0gbGFzdE1hcmtlcjsKKyAgICBpZiAoIG5hbWUgIT0gbmlsICkKKyAgICAgICAgY29weS5uYW1lID0gW3NlbGYubmFtZSBjb3B5V2l0aFpvbmU6YVpvbmVdOworICAgIHJldHVybiBjb3B5OworfQorCisvLyByZXNldCB0aGUgc3RyZWFtcyBjaGFyU3RhdGUKKy8vIHRoZSBzdHJlYW1zIGNvbnRlbnQgaXMgbm90IHJlc2V0IQorLSAodm9pZCkgcmVzZXQKK3sKKwlpbmRleCA9IDA7CisJbGluZSA9IDE7CisJY2hhclBvc2l0aW9uSW5MaW5lID0gMDsKKwltYXJrRGVwdGggPSAwOworICAgIGlmICggbWFya2VycyAmJiBbbWFya2VycyBjb3VudF0gKQorICAgICAgICBbbWFya2VycyByZW1vdmVBbGxPYmplY3RzXTsKKyAgICBbbWFya2VycyBhZGRPYmplY3Q6W05TTnVsbCBudWxsXV07ICAvLyBBTlRMUiBnZW5lcmF0ZXMgY29kZSB0aGF0IGFzc3VtZXMgbWFya2VycyB0byBiZSAxLWJhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRodXMgdGhlIGluaXRpYWwgbnVsbCBpbiB0aGUgYXJyYXkhCit9CisKKy8vIHJlYWQgb25lIGNoYXJhY3RlciBvZmYgdGhlIHN0cmVhbSwgdHJhY2tpbmcgbGluZSBudW1iZXJzIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb25zCisvLyBhdXRvbWF0aWNhbGx5LgorLy8gT3ZlcnJpZGUgdGhpcyBpbiBzdWJjbGFzc2VzIGlmIHlvdSB3YW50IHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBhdXRvbWF0aWMgbGluZS9wb3MKKy8vIGhhbmRsaW5nLiBEbyBub3QgY2FsbCBzdXBlciBpbiB0aGF0IGNhc2UuCistICh2b2lkKSBjb25zdW1lIAoreworCWlmICggaW5kZXggPCBuICkgeworCQljaGFyUG9zaXRpb25JbkxpbmUrKzsKKwkJaWYgKCBbZGF0YSBjaGFyYWN0ZXJBdEluZGV4OmluZGV4XSA9PSAnXG4nICkgeworCQkJbGluZSsrOworCQkJY2hhclBvc2l0aW9uSW5MaW5lPTA7CisJCX0KKwkJaW5kZXgrKzsKKwl9Cit9CisKKy8vIGltcGxlbWVudCB0aGUgbG9va2FoZWFkIG1ldGhvZCB1c2VkIGluIGxleGVycworLSAoTlNJbnRlZ2VyKSBMQTooTlNJbnRlZ2VyKSBpIAoreworICAgIE5TSW50ZWdlciBjOworICAgIGlmICggaSA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7IC8vIHVuZGVmaW5lZAorICAgIGlmICggaSA8IDAgKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKCBpbmRleCtpLTEgPCAwICkgeworCQkgICAgcmV0dXJuIEFOVExSQ2hhclN0cmVhbUVPRjsKKwkJfQorCX0KKyAgICBpZiAoIChpbmRleCtpLTEpID49IG4gKSB7CisJCXJldHVybiBBTlRMUkNoYXJTdHJlYW1FT0Y7CisJfQorICAgIGMgPSBbZGF0YSBjaGFyYWN0ZXJBdEluZGV4OmluZGV4K2ktMV07CisJcmV0dXJuIChOU0ludGVnZXIpYzsKK30KKworLSAoTlNJbnRlZ2VyKSBMVDooTlNJbnRlZ2VyKWkKK3sKKyAgICByZXR1cm4gW3NlbGYgTEE6aV07Cit9CisKKy0gKE5TSW50ZWdlcikgc2l6ZSAKK3sKKwlyZXR1cm4gbjsKK30KKworLy8gcHVzaCB0aGUgY3VycmVudCBjaGFyU3RhdGUgb2YgdGhlIHN0cmVhbSBvbnRvIGEgc3RhY2sKKy8vIHJldHVybnMgdGhlIGRlcHRoIG9mIHRoZSBzdGFjaywgdG8gYmUgdXNlZCBhcyBhIG1hcmtlciB0byByZXdpbmQgdGhlIHN0cmVhbS4KKy8vIE5vdGU6IG1hcmtlcnMgYXJlIDEtYmFzZWQhCistIChOU0ludGVnZXIpIG1hcmsgCit7CisgICAgaWYgKGRlYnVnID4gMSkgTlNMb2coQCJtYXJrIGVudHJ5IC0tIG1hcmtlcnM9JXgsIG1hcmtEZXB0aD0lZFxuIiwgKGludCltYXJrZXJzLCBtYXJrRGVwdGgpOworICAgIGlmICggbWFya2VycyA9PSBuaWwgKSB7CisgICAgICAgIG1hcmtlcnMgPSBbQU5UTFJQdHJCdWZmZXIgbmV3QU5UTFJQdHJCdWZmZXJXaXRoTGVuOjEwMF07CisJCVttYXJrZXJzIGFkZE9iamVjdDpbTlNOdWxsIG51bGxdXTsgLy8gQU5UTFIgZ2VuZXJhdGVzIGNvZGUgdGhhdCBhc3N1bWVzIG1hcmtlcnMgdG8gYmUgMS1iYXNlZCwKKyAgICAgICAgbWFya0RlcHRoID0gbWFya2Vycy5wdHI7CisgICAgfQorICAgIG1hcmtEZXB0aCsrOworCUFOVExSQ2hhclN0cmVhbVN0YXRlICpTdGF0ZSA9IG5pbDsKKwlpZiAoIChtYXJrRGVwdGgpID49IFttYXJrZXJzIGNvdW50XSApIHsKKyAgICAgICAgaWYgKCBtYXJrRGVwdGggPiAxICkgeworICAgICAgICAgICAgU3RhdGUgPSBbQU5UTFJDaGFyU3RyZWFtU3RhdGUgbmV3QU5UTFJDaGFyU3RyZWFtU3RhdGVdOworICAgICAgICAgICAgW1N0YXRlIHJldGFpbl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBtYXJrRGVwdGggPT0gMSApCisgICAgICAgICAgICBTdGF0ZSA9IGNoYXJTdGF0ZTsKKwkJW21hcmtlcnMgaW5zZXJ0T2JqZWN0OlN0YXRlIGF0SW5kZXg6bWFya0RlcHRoXTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgTlNMb2coQCJtYXJrIHNhdmUgU3RhdGUgJXggYXQgJWQsIGluZGV4PSVkLCBsaW5lPSVkLCBjaGFyUG9zaXRpb25JbkxpbmU9JWRcbiIsIChOU1VJbnRlZ2VyKVN0YXRlLCBtYXJrRGVwdGgsIFN0YXRlLmluZGV4LCBTdGF0ZS5saW5lLCBTdGF0ZS5jaGFyUG9zaXRpb25JbkxpbmUpOworCX0KKwllbHNlIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgTlNMb2coQCJtYXJrIHJldHJpZXZlIG1hcmtlcnM9JXggbWFya0RlcHRoPSVkXG4iLCAoTlNVSW50ZWdlciltYXJrZXJzLCBtYXJrRGVwdGgpOworICAgICAgICBTdGF0ZSA9IFttYXJrZXJzIG9iamVjdEF0SW5kZXg6bWFya0RlcHRoXTsKKyAgICAgICAgW1N0YXRlIHJldGFpbl07CisgICAgICAgIFN0YXRlID0gKEFOVExSQ2hhclN0cmVhbVN0YXRlICopW21hcmtlcnMgb2JqZWN0QXRJbmRleDptYXJrRGVwdGhdOworICAgICAgICBpZiAoZGVidWcgPiAxKSBOU0xvZyhAIm1hcmsgcmV0cmlldmUgY2hhclN0YXRlICV4IGZyb20gJWQsIGluZGV4PSVkLCBsaW5lPSVkLCBjaGFyUG9zaXRpb25JbkxpbmU9JWRcbiIsIChOU1VJbnRlZ2VyKVN0YXRlLCBtYXJrRGVwdGgsIFN0YXRlLmluZGV4LCBTdGF0ZS5saW5lLCBTdGF0ZS5jaGFyUG9zaXRpb25JbkxpbmUpOworCX0KKyAgICBTdGF0ZS5pbmRleCA9IGluZGV4OworCVN0YXRlLmxpbmUgPSBsaW5lOworCVN0YXRlLmNoYXJQb3NpdGlvbkluTGluZSA9IGNoYXJQb3NpdGlvbkluTGluZTsKKwlsYXN0TWFya2VyID0gbWFya0RlcHRoOworICAgIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKEAibWFyayBleGl0IC0tIG1hcmtlcnM9JXgsIGNoYXJTdGF0ZT0leCwgaW5kZXg9JWQsIGxpbmU9JWQsIGNoYXJQb3NpdGlvbkluTGluZT0lZFxuIiwgKE5TVUludGVnZXIpbWFya2VycywgKE5TVUludGVnZXIpU3RhdGUsIFN0YXRlLmluZGV4LCBTdGF0ZS5saW5lLCBTdGF0ZS5jaGFyUG9zaXRpb25JbkxpbmUpOworCXJldHVybiBtYXJrRGVwdGg7Cit9CisKKy0gKHZvaWQpIHJld2luZDooTlNJbnRlZ2VyKSBtYXJrZXIgCit7CisgICAgQU5UTFJDaGFyU3RyZWFtU3RhdGUgKlN0YXRlOworICAgIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKEAicmV3aW5kIGVudHJ5IC0tIG1hcmtlcnM9JXggbWFya2VyPSVkXG4iLCAoTlNVSW50ZWdlciltYXJrZXJzLCBtYXJrZXIpOworICAgIGlmICggbWFya2VyID09IDEgKQorICAgICAgICBTdGF0ZSA9IGNoYXJTdGF0ZTsKKyAgICBlbHNlCisgICAgICAgIFN0YXRlID0gKEFOVExSQ2hhclN0cmVhbVN0YXRlICopW21hcmtlcnMgb2JqZWN0QXRJbmRleDptYXJrZXJdOworICAgIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKEAicmV3aW5kIGVudHJ5IC0tIG1hcmtlcj0lZCBjaGFyU3RhdGU9JXgsIGluZGV4PSVkLCBsaW5lPSVkLCBjaGFyUG9zaXRpb25JbkxpbmU9JWRcbiIsIG1hcmtlciwgKE5TVUludGVnZXIpY2hhclN0YXRlLCBjaGFyU3RhdGUuaW5kZXgsIGNoYXJTdGF0ZS5saW5lLCBjaGFyU3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lKTsKKwkvLyByZXN0b3JlIHN0cmVhbSBjaGFyU3RhdGUKKwlbc2VsZiBzZWVrOlN0YXRlLmluZGV4XTsKKwlsaW5lID0gU3RhdGUubGluZTsKKwljaGFyUG9zaXRpb25JbkxpbmUgPSBjaGFyU3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lOworCVtzZWxmIHJlbGVhc2U6bWFya2VyXTsKKyAgICBpZiAoZGVidWcgPiAxKSBOU0xvZyhAInJld2luZCBleGl0IC0tIG1hcmtlcj0lZCBjaGFyU3RhdGU9JXgsIGluZGV4PSVkLCBsaW5lPSVkLCBjaGFyUG9zaXRpb25JbkxpbmU9JWRcbiIsIG1hcmtlciwgKE5TVUludGVnZXIpY2hhclN0YXRlLCBjaGFyU3RhdGUuaW5kZXgsIGNoYXJTdGF0ZS5saW5lLCBjaGFyU3RhdGUuY2hhclBvc2l0aW9uSW5MaW5lKTsKK30KKworLSAodm9pZCkgcmV3aW5kCit7CisJW3NlbGYgcmV3aW5kOmxhc3RNYXJrZXJdOworfQorCisvLyByZW1vdmUgc3RyZWFtIHN0YXRlcyBvbiB0b3Agb2YgJ21hcmtlcicgZnJvbSB0aGUgbWFya2VyIHN0YWNrCisvLyByZXR1cm5zIHRoZSBuZXcgbWFya0RlcHRoIG9mIHRoZSBzdGFjay4KKy8vIE5vdGU6IHVuZm9ydHVuYXRlIG5hbWluZyBmb3IgT2JqZWN0aXZlLUMsIGJ1dCB0byBrZWVwIGNsb3NlIHRvIHRoZSBKYXZhIHRhcmdldCB0aGlzIGlzIG5hbWVkIHJlbGVhc2U6CistICh2b2lkKSByZWxlYXNlOihOU0ludGVnZXIpIG1hcmtlciAKK3sKKwkvLyB1bndpbmQgYW55IG90aGVyIG1hcmtlcnMgbWFkZSBhZnRlciBtYXJrZXIgYW5kIHJlbGVhc2UgbWFya2VyCisJbWFya0RlcHRoID0gbWFya2VyOworCW1hcmtEZXB0aC0tOworICAgIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKEAicmVsZWFzZTptYXJrZXI9ICVkLCBtYXJrRGVwdGggPSAlZFxuIiwgbWFya2VyLCBtYXJrRGVwdGgpOworfQorCisvLyB3aGVuIHNlZWtpbmcgZm9yd2FyZCB3ZSBtdXN0IGhhbmRsZSBjaGFyYWN0ZXIgcG9zaXRpb24gYW5kIGxpbmUgbnVtYmVycy4KKy8vIHNlZWtpbmcgYmFja3dhcmQgYWxyZWFkeSBoYXMgdGhlIGNvcnJlY3QgbGluZSBpbmZvcm1hdGlvbiBvbiB0aGUgbWFya2VycyBzdGFjaywgCisvLyBzbyB3ZSBqdXN0IHRha2UgaXQgZnJvbSB0aGVyZS4KKy0gKHZvaWQpIHNlZWs6KE5TSW50ZWdlcikgYW5JbmRleCAKK3sKKyAgICBpZiAoZGVidWcgPiAxKSBOU0xvZyhAInNlZWsgZW50cnkgLS0gc2Vla0luZGV4PSVkIGluZGV4PSVkXG4iLCBhbkluZGV4LCBpbmRleCk7CisJaWYgKCBhbkluZGV4IDw9IGluZGV4ICkgeworCQlpbmRleCA9IGFuSW5kZXg7IC8vIGp1c3QganVtcDsgZG9uJ3QgdXBkYXRlIHN0cmVhbSBjaGFyU3RhdGUgKGxpbmUsIC4uLikKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgTlNMb2coQCJzZWVrIGV4aXQgcmV0dXJuIC0tIGluZGV4PSVkIGluZGV4PSVkXG4iLCBhbkluZGV4LCBpbmRleCk7CisJCXJldHVybjsKKwl9CisJLy8gc2VlayBmb3J3YXJkLCBjb25zdW1lIHVudGlsIGluZGV4IGhpdHMgYW5JbmRleAorCXdoaWxlICggaW5kZXggPCBhbkluZGV4ICkgeworCQlbc2VsZiBjb25zdW1lXTsKKwl9CisgICAgaWYgKGRlYnVnID4gMSkgTlNMb2coQCJzZWVrIGV4aXQgZW5kIC0tIGluZGV4PSVkIGluZGV4PSVkXG4iLCBhbkluZGV4LCBpbmRleCk7Cit9CisKKy8vIGdldCBhIHN1YnN0cmluZyBmcm9tIG91ciByYXcgZGF0YS4KKy0gKE5TU3RyaW5nICopIHN1YnN0cmluZzooTlNJbnRlZ2VyKXN0YXJ0SW5kZXggVG86KE5TSW50ZWdlcilzdG9wSW5kZXggCit7CisgICAgTlNSYW5nZSB0aGVSYW5nZSA9IE5TTWFrZVJhbmdlKHN0YXJ0SW5kZXgsIHN0b3BJbmRleC1zdGFydEluZGV4KTsKKwlyZXR1cm4gW2RhdGEgc3Vic3RyaW5nV2l0aFJhbmdlOnRoZVJhbmdlXTsKK30KKworLy8gZ2V0IGEgc3Vic3RyaW5nIGZyb20gb3VyIHJhdyBkYXRhLgorLSAoTlNTdHJpbmcgKikgc3Vic3RyaW5nV2l0aFJhbmdlOihOU1JhbmdlKSB0aGVSYW5nZSAKK3sKKwlyZXR1cm4gW2RhdGEgc3Vic3RyaW5nV2l0aFJhbmdlOnRoZVJhbmdlXTsKK30KKworCistIChBTlRMUlB0ckJ1ZmZlciAqKWdldE1hcmtlcnMKK3sKKyAgICByZXR1cm4gbWFya2VyczsKK30KKworLSAodm9pZCkgc2V0TWFya2VyczooQU5UTFJQdHJCdWZmZXIgKilhTWFya2VyTGlzdAoreworICAgIG1hcmtlcnMgPSBhTWFya2VyTGlzdDsKK30KKworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lCit7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy0gKHZvaWQpIHNldFNvdXJjZU5hbWU6KE5TU3RyaW5nICopYU5hbWUKK3sKKyAgICBpZiAoIG5hbWUgIT0gYU5hbWUgKSB7CisgICAgICAgIGlmICggbmFtZSApIFtuYW1lIHJlbGVhc2VdOworICAgICAgICBpZiAoIGFOYW1lICkgW2FOYW1lIHJldGFpbl07CisgICAgICAgIG5hbWUgPSBhTmFtZTsKKyAgICB9Cit9CisKKworLSAoQU5UTFJDaGFyU3RyZWFtU3RhdGUgKilnZXRDaGFyU3RhdGUKK3sKKyAgICByZXR1cm4gY2hhclN0YXRlOworfQorCistICh2b2lkKSBzZXRDaGFyU3RhdGU6KEFOVExSQ2hhclN0cmVhbVN0YXRlICopYUNoYXJTdGF0ZQoreworICAgIGNoYXJTdGF0ZSA9IGFDaGFyU3RhdGU7Cit9CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmcKK3sKKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6ZGF0YV07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8vICBkYXRhIAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLSAoTlNTdHJpbmcgKikgZ2V0RGF0YQoreworICAgIHJldHVybiBkYXRhOyAKK30KKworLSAodm9pZCkgc2V0RGF0YTogKE5TU3RyaW5nICopIGFEYXRhCit7CisgICAgaWYgKGRhdGEgIT0gYURhdGEpIHsKKyAgICAgICAgaWYgKCBkYXRhICkgW2RhdGEgcmVsZWFzZV07CisgICAgICAgIGRhdGEgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzphRGF0YV07CisgICAgICAgIFtkYXRhIHJldGFpbl07CisgICAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN0cmluZ1N0cmVhbVN0YXRlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN0cmluZ1N0cmVhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNDgzYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtU3RhdGUuaApAQCAtMCwwICsxLDU4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKworLy8gZW5jYXBzdWxhdGVzIGEgc3RyZWFtJ3Mgc3RhdGUsIHNvIHdlIGNhbiBwdXQgaXQgaW50byBhbiBOU0FycmF5LgorLy8gTm8gbWFnaWMgaXMgaGFwcGVuaW5nIGhlcmUuCisKK0BpbnRlcmZhY2UgQU5UTFJDaGFyU3RyZWFtU3RhdGUgOiBOU09iamVjdCA8QU5UTFJDaGFyU3RyZWFtPgoreworCU5TVUludGVnZXIgaW5kZXg7CisJTlNVSW50ZWdlciBsaW5lOworCU5TVUludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworfQorCisrIG5ld0FOVExSQ2hhclN0cmVhbVN0YXRlOworCistIChpZCkgaW5pdDsKKworLSAoTlNVSW50ZWdlcikgZ2V0SW5kZXg7CistICh2b2lkKSBzZXRJbmRleDogKE5TVUludGVnZXIpIGFuSW5kZXg7CisKKy0gKE5TVUludGVnZXIpIGdldExpbmU7CistICh2b2lkKSBzZXRMaW5lOiAoTlNVSW50ZWdlcikgYUxpbmU7CisKKy0gKE5TVUludGVnZXIpIGdldENoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTogKE5TVUludGVnZXIpIGFDaGFyUG9zaXRpb25JbkxpbmU7CisKKworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKGFzc2lnbikgTlNVSW50ZWdlciBsaW5lOworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgY2hhclBvc2l0aW9uSW5MaW5lOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN0cmluZ1N0cmVhbVRlc3QtSW5mby5wbGlzdCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3RyaW5nU3RyZWFtVGVzdC1JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODVhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN0cmluZ1N0cmVhbVRlc3QtSW5mby5wbGlzdApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+Y29tLnlvdXJjb21wYW55LiR7UFJPRFVDVF9OQU1FOnJmYzEwMzRpZGVudGlmaWVyfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Qk5ETDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MTwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3ltYm9sU3RhY2suaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3ltYm9sU3RhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlkZjlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJTeW1ib2xTdGFjay5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vCisvLyAgQU5UTFJTeW1ib2xTdGFjay5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQmFzZVN0YWNrLmgiCisvLyAjaW1wb3J0ICJBTlRMUlN5bWJvbFNjb3BlLmgiCisKKy8vI2RlZmluZSBHTE9CQUxfU0NPUEUgICAgICAgMAorLy8jZGVmaW5lIExPQ0FMX1NDT1BFICAgICAgICAxCisjZGVmaW5lIEhBU0hTSVpFICAgICAgICAgMTAxCisjZGVmaW5lIEhCVUZTSVpFICAgICAgMHgyMDAwCisKK0BpbnRlcmZhY2UgQU5UTFJTeW1ib2xzU2NvcGUgOiBOU09iamVjdAoreworICAgIAorfQorCisrIChBTlRMUlN5bWJvbHNTY29wZSAqKW5ld0FOVExSU3ltYm9sc1Njb3BlOworCistIChpZClpbml0OworQGVuZAorCisKK0BpbnRlcmZhY2UgQU5UTFJTeW1ib2xTdGFjayA6IEFOVExSQmFzZVN0YWNrIHsKK30KKworLy8gQ29udHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKysoQU5UTFJTeW1ib2xTdGFjayAqKW5ld0FOVExSU3ltYm9sU3RhY2s7CisrKEFOVExSU3ltYm9sU3RhY2sgKiluZXdBTlRMUlN5bWJvbFN0YWNrV2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0oaWQpaW5pdDsKKy0oaWQpaW5pdFdpdGhMZW46KE5TSW50ZWdlciljbnQ7CistKHZvaWQpZGVhbGxvYzsKKworLy8gSW5zdGFuY2UgTWV0aG9kcworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CisvKiBjbGVhciAtLSByZWluaXRpYWxpemUgdGhlIG1hcGxpc3QgYXJyYXkgKi8KKworLShBTlRMUlN5bWJvbHNTY29wZSAqKWdldEhhc2hNYXBFbnRyeTooTlNJbnRlZ2VyKWlkeDsKKworLShBTlRMUlN5bWJvbHNTY29wZSAqKilnZXRIYXNoTWFwOworCistKEFOVExSU3ltYm9sc1Njb3BlICopIHBvcDsKKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlN5bWJvbHNTY29wZSAqKWFTY29wZSBhdEluZGV4OihOU0ludGVnZXIpaWR4OworLSAoQU5UTFJTeW1ib2xzU2NvcGUgKilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN5bWJvbFN0YWNrLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlN5bWJvbFN0YWNrLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0M2ViYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSU3ltYm9sU3RhY2subQpAQCAtMCwwICsxLDEyNiBAQAorLy8KKy8vICBBTlRMUlN5bWJvbFN0YWNrLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOS8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjZGVmaW5lIFNVQ0NFU1MgKDApCisjZGVmaW5lIEZBSUxVUkUgKC0xKQorCisjaW1wb3J0ICJBTlRMUlN5bWJvbFN0YWNrLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJTeW1ib2xzU2NvcGUKKworKyAoQU5UTFJTeW1ib2xzU2NvcGUgKiluZXdBTlRMUlN5bWJvbHNTY29wZQoreworICAgIHJldHVybiggW1tBTlRMUlN5bWJvbHNTY29wZSBhbGxvY10gaW5pdF0gKTsKK30KKworLSAoaWQpaW5pdAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgfQorICAgIHJldHVybiAoc2VsZik7Cit9CisKK0BlbmQKKworLyoKKyAqIFN0YXJ0IG9mIEFOVExSU3ltYm9sU3RhY2sKKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSU3ltYm9sU3RhY2sKKworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFjaworeworICAgIHJldHVybiBbW0FOVExSU3ltYm9sU3RhY2sgYWxsb2NdIGluaXRXaXRoTGVuOjMwXTsKK30KKworKyhBTlRMUlN5bWJvbFN0YWNrICopbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46KE5TSW50ZWdlciljbnQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlN5bWJvbFN0YWNrIGFsbG9jXSBpbml0V2l0aExlbjpjbnRdOworfQorCistKGlkKWluaXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpjbnRdKSAhPSBuaWwpIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSU3ltYm9sU3RhY2siICk7CisjZW5kaWYKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lCit7CisgICAgcmV0dXJuIFtzdXBlciBjb3B5V2l0aFpvbmU6YVpvbmVdOworfQorCistKEFOVExSU3ltYm9sc1Njb3BlICopZ2V0SGFzaE1hcEVudHJ5OihOU0ludGVnZXIpaWR4Cit7CisJcmV0dXJuKCAoQU5UTFJTeW1ib2xzU2NvcGUgKilbc3VwZXIgb2JqZWN0QXRJbmRleDppZHhdICk7Cit9CisKKy0oQU5UTFJTeW1ib2xzU2NvcGUgKiopZ2V0SGFzaE1hcAoreworCXJldHVybiggKEFOVExSU3ltYm9sc1Njb3BlICoqKXB0ckJ1ZmZlciApOworfQorCistKEFOVExSU3ltYm9sc1Njb3BlICopIHBvcAoreworICAgIHJldHVybiAoQU5UTFJTeW1ib2xzU2NvcGUgKilbc3VwZXIgcG9wXTsKK30KKworLSAodm9pZCkgaW5zZXJ0T2JqZWN0OihBTlRMUlN5bWJvbHNTY29wZSAqKWFSdWxlIGF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBpZiAoIGFSdWxlICE9IHB0ckJ1ZmZlcltpZHhdICkgeworICAgICAgICBpZiAoIHB0ckJ1ZmZlcltpZHhdICkgW3B0ckJ1ZmZlcltpZHhdIHJlbGVhc2VdOworICAgICAgICBbYVJ1bGUgcmV0YWluXTsKKyAgICB9CisgICAgcHRyQnVmZmVyW2lkeF0gPSBhUnVsZTsKK30KKworLSAoQU5UTFJTeW1ib2xzU2NvcGUgKilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpaWR4Cit7CisgICAgcmV0dXJuIChBTlRMUlN5bWJvbHNTY29wZSAqKVtzdXBlciBvYmplY3RBdEluZGV4OmlkeF07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWU3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vCisvLyAgQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgS2F5IFLDtnBrZSBvbiAwMy4xMi4yMDA2LgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorLy8KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKworQGludGVyZmFjZSBBTlRMUkNvbW1vblRva2VuKERlYnVnZ2VyU3VwcG9ydCkKKworLSAoTlNTdHJpbmcgKilkZWJ1Z2dlckRlc2NyaXB0aW9uOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRiMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQubQpAQCAtMCwwICsxLDYxIEBACisvLworLy8gIEFOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEtheSBSw7Zwa2Ugb24gMDMuMTIuMjAwNi4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJDb21tb25Ub2tlbihEZWJ1Z2dlclN1cHBvcnQpCisKKy0gKE5TU3RyaW5nICopZGVidWdnZXJEZXNjcmlwdGlvbgoreworCU5TU3RyaW5nICpfdGV4dCA9IHNlbGYudGV4dDsKKwlOU011dGFibGVTdHJpbmcgKmVzY2FwZWRUZXh0OworCWlmIChfdGV4dCkgeworCQllc2NhcGVkVGV4dCA9IFtfdGV4dCBjb3B5V2l0aFpvbmU6bmlsXTsKKwkJTlNSYW5nZSB3aG9sZVN0cmluZyA9IE5TTWFrZVJhbmdlKDAsW2VzY2FwZWRUZXh0IGxlbmd0aF0pOworCQlbZXNjYXBlZFRleHQgcmVwbGFjZU9jY3VycmVuY2VzT2ZTdHJpbmc6QCIlIiB3aXRoU3RyaW5nOkAiJTI1IiBvcHRpb25zOjAgcmFuZ2U6d2hvbGVTdHJpbmddOworCQlbZXNjYXBlZFRleHQgcmVwbGFjZU9jY3VycmVuY2VzT2ZTdHJpbmc6QCJcbiIgd2l0aFN0cmluZzpAIiUwQSIgb3B0aW9uczowIHJhbmdlOndob2xlU3RyaW5nXTsKKwkJW2VzY2FwZWRUZXh0IHJlcGxhY2VPY2N1cnJlbmNlc09mU3RyaW5nOkAiXHIiIHdpdGhTdHJpbmc6QCIlMEQiIG9wdGlvbnM6MCByYW5nZTp3aG9sZVN0cmluZ107CisJfSBlbHNlIHsKKwkJZXNjYXBlZFRleHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6QCIiXTsKKwl9CisJLy8gZm9ybWF0IGlzIHRva2VuSW5kZXgsIHR5cGUsIGNoYW5uZWwsIGxpbmUsIGNvbCwgKGVzY2FwZWQpdGV4dAorCXJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1ICVkICV1ICV1ICV1IFwiJUAiLCAKKwkJW3NlbGYgZ2V0VG9rZW5JbmRleF0sCisJCXNlbGYudHlwZSwKKwkJc2VsZi5jaGFubmVsLAorCQlzZWxmLmxpbmUsCisJCXNlbGYuY2hhclBvc2l0aW9uSW5MaW5lLAorCQllc2NhcGVkVGV4dAorCQldOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3MjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW4uaApAQCAtMCwwICsxLDg5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCisjaWZuZGVmIERFQlVHX0RFQUxMT0MKKyNkZWZpbmUgREVCVUdfREVBTExPQworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5UTFJUb2tlblR5cGVFT0YgPSAtMSwKKyAgICBBTlRMUlRva2VuVHlwZUludmFsaWQsCisgICAgQU5UTFJUb2tlblR5cGVFT1IsCisgICAgQU5UTFJUb2tlblR5cGVET1dOLAorICAgIEFOVExSVG9rZW5UeXBlVVAsCisgICAgQU5UTFJUb2tlblR5cGVNSU4KK30gQU5UTFJUb2tlblR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0ID0gMCwKKyAgICBBTlRMUlRva2VuQ2hhbm5lbEhpZGRlbiA9IDk5Cit9IEFOVExSVG9rZW5DaGFubmVsOworCisjZGVmaW5lIEhJRERFTiA5OQorCitAcHJvdG9jb2wgQU5UTFJUb2tlbiA8IE5TT2JqZWN0LCBOU0NvcHlpbmcgPgorCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyID0gdGV4dCwgc2V0dGVyID0gc2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciB0eXBlOworQHByb3BlcnR5IChhc3NpZ24pIE5TVUludGVnZXIgbGluZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU1VJbnRlZ2VyIGNoYXJQb3NpdGlvbkluTGluZTsKKworLy8gVGhlIHNpbmdsZXRvbiBlb2ZUb2tlbiBpbnN0YW5jZS4KKysgKGlkPEFOVExSVG9rZW4+KSBlb2ZUb2tlbjsKKy8vIFRoZSBkZWZhdWx0IGNoYW5uZWwgZm9yIHRoaXMgY2xhc3Mgb2YgVG9rZW5zCisrIChBTlRMUlRva2VuQ2hhbm5lbCkgZGVmYXVsdENoYW5uZWw7CisKKy8vIHByb3ZpZGUgaG9va3MgdG8gZXhwbGljaXRlbHkgc2V0IHRoZSB0ZXh0IGFzIG9wcG9zZWQgdG8gdXNlIHRoZSBpbmRpY2VzIGludG8gdGhlIENoYXJTdHJlYW0KKy0gKE5TU3RyaW5nICopIHRleHQ7CistICh2b2lkKSBzZXRUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy0gKE5TSW50ZWdlcil0eXBlOworLSAodm9pZCkgc2V0VHlwZTogKE5TSW50ZWdlcikgYVR5cGU7CisKKy8vIEFOVExSIHYzIHByb3ZpZGVzIGF1dG9tYXRpYyBsaW5lIGFuZCBwb3NpdGlvbiB0cmFja2luZy4gU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0bworLy8gb3ZlcnJpZGUgdGhlc2UsIGlmIHRoZXkgZG8gbm90IHdhbnQgdG8gc3RvcmUgbGluZS9wb3MgdHJhY2tpbmcgaW5mb3JtYXRpb24KKy0gKE5TVUludGVnZXIpbGluZTsKKy0gKHZvaWQpIHNldExpbmU6IChOU1VJbnRlZ2VyKSBhTGluZTsKKworLSAoTlNVSW50ZWdlciljaGFyUG9zaXRpb25JbkxpbmU7CistICh2b2lkKSBzZXRDaGFyUG9zaXRpb25JbkxpbmU6KE5TVUludGVnZXIpYUNoYXJQb3NpdGlvbkluTGluZTsKKworLy8gZXhwbGljaXRlbHkgY2hhbmdlIHRoZSBjaGFubmVsIHRoaXMgVG9rZW4gaXMgb24uIFRoZSBkZWZhdWx0IHBhcnNlciBpbXBsZW1lbnRhdGlvbgorLy8ganVzdCBzZWVzIHRoZSBkZWZhdWx0Q2hhbm5lbAorLy8gQ29tbW9uIGlkaW9tIGlzIHRvIHB1dCB3aGl0ZXNwYWNlIHRva2VucyBvbiBjaGFubmVsIDk5LgorLSAoTlNVSW50ZWdlciljaGFubmVsOworLSAodm9pZCkgc2V0Q2hhbm5lbDogKE5TVUludGVnZXIpIGFDaGFubmVsOworCisvLyB0aGUgaW5kZXggb2YgdGhpcyBUb2tlbiBpbnRvIHRoZSBUb2tlblN0cmVhbQorLSAoTlNJbnRlZ2VyKSBnZXRUb2tlbkluZGV4OworLSAodm9pZCkgc2V0VG9rZW5JbmRleDogKE5TSW50ZWdlcikgYVRva2VuSW5kZXg7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTcxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTcwIEBACisvLworLy8gIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW5TdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSTGlua0Jhc2UuaCIKKyNpbXBvcnQgIkFOVExSSGFzaE1hcC5oIgorI2ltcG9ydCAiQU5UTFJNYXBFbGVtZW50LmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU291cmNlLmgiCisKKy8vIERlZmluZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gaGllcmFyY2h5CisKK0BpbnRlcmZhY2UgQU5UTFJSZXdyaXRlT3BlcmF0aW9uIDogQU5UTFJDb21tb25Ub2tlblN0cmVhbQoreworLyoqIFdoYXQgcndJbmRleCBpbnRvIHJld3JpdGVzIExpc3QgYXJlIHdlPyAqLworTlNJbnRlZ2VyIGluc3RydWN0aW9uSW5kZXg7CisvKiogVG9rZW4gYnVmZmVyIHJ3SW5kZXguICovCitOU0ludGVnZXIgcndJbmRleDsKK05TU3RyaW5nICp0ZXh0OworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRJbnN0cnVjdGlvbkluZGV4LCBzZXR0ZXI9c2V0SW5zdHJ1Y3Rpb25JbmRleDopIE5TSW50ZWdlciBpbnN0cnVjdGlvbkluZGV4OworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciByd0luZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj10ZXh0LCBzZXR0ZXI9c2V0VGV4dDopIE5TU3RyaW5nICp0ZXh0OworCisrIChBTlRMUlJld3JpdGVPcGVyYXRpb24gKikgbmV3QU5UTFJSZXdyaXRlT3BlcmF0aW9uOihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKKy8qKiBFeGVjdXRlIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBieSBwb3NzaWJseSBhZGRpbmcgdG8gdGhlIGJ1ZmZlci4KKyAqICBSZXR1cm4gdGhlIHJ3SW5kZXggb2YgdGhlIG5leHQgdG9rZW4gdG8gb3BlcmF0ZSBvbi4KKyAqLworLSAoTlNJbnRlZ2VyKSBleGVjdXRlOihOU1N0cmluZyAqKWJ1ZjsKKworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKy0gKE5TSW50ZWdlcikgaW5kZXhPZjooY2hhcilhQ2hhciBpblN0cmluZzooTlNTdHJpbmcgKilhU3RyaW5nOworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSSW5zZXJ0QmVmb3JlT3AgOiBBTlRMUlJld3JpdGVPcGVyYXRpb24geworfQorCisrIChBTlRMUkluc2VydEJlZm9yZU9wICopIG5ld0FOVExSSW5zZXJ0QmVmb3JlT3A6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CisKK0BlbmQKKworLyoqIEknbSBnb2luZyB0byB0cnkgcmVwbGFjaW5nIHJhbmdlIGZyb20geC4ueSB3aXRoICh5LXgpKzEgUmVwbGFjZU9wCisgKiAgaW5zdHJ1Y3Rpb25zLgorICovCitAaW50ZXJmYWNlIEFOVExSUmVwbGFjZU9wIDogQU5UTFJSZXdyaXRlT3BlcmF0aW9uIHsKKyAgICBOU0ludGVnZXIgbGFzdEluZGV4OworfQorCitAcHJvcGVydHkgKGFzc2lnbikgTlNJbnRlZ2VyIGxhc3RJbmRleDsKKworKyAoQU5UTFJSZXBsYWNlT3AgKikgbmV3QU5UTFJSZXBsYWNlT3A6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyopdGhlVGV4dDsKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworCistIChOU0ludGVnZXIpIGV4ZWN1dGU6KE5TU3RyaW5nICopYnVmOworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSRGVsZXRlT3AgOiBBTlRMUlJlcGxhY2VPcCB7Cit9CisrIChBTlRMUkRlbGV0ZU9wICopIG5ld0FOVExSRGVsZXRlT3A6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0bzsKKworLSAoaWQpIGluaXRXaXRoSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0bzsKKworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgQU5UTFJUb2tlblJld3JpdGVTdHJlYW0gOiBBTlRMUkNvbW1vblRva2VuU3RyZWFtIHsKKy8qKiBZb3UgbWF5IGhhdmUgbXVsdGlwbGUsIG5hbWVkIHN0cmVhbXMgb2YgcmV3cml0ZSBvcGVyYXRpb25zLgorICogIEknbSBjYWxsaW5nIHRoZXNlIHRoaW5ncyAicHJvZ3JhbXMuIgorICogIE1hcHMgU3RyaW5nIChuYW1lKSAtPiByZXdyaXRlIChMaXN0KQorICovCitBTlRMUkhhc2hNYXAgKnByb2dyYW1zOworCisvKiogTWFwIFN0cmluZyAocHJvZ3JhbSBuYW1lKSAtPiBJbnRlZ2VyIHJ3SW5kZXggKi8KK0FOVExSSGFzaE1hcCAqbGFzdFJld3JpdGVUb2tlbkluZGV4ZXM7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0UHJvZ3JhbXMsIHNldHRlcj1zZXRQcm9ncmFtczopIEFOVExSSGFzaE1hcCAqcHJvZ3JhbXM7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldExhc3RSZXdyaXRlVG9rZW5JbmRleGVzLCBzZXR0ZXI9c2V0TGFzdFJld3JpdGVUb2tlbkluZGV4ZXM6KSBBTlRMUkhhc2hNYXAgKmxhc3RSZXdyaXRlVG9rZW5JbmRleGVzOworCisrIChBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSAqKW5ld0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtOworKyAoQU5UTFJUb2tlblJld3JpdGVTdHJlYW0gKiluZXdBTlRMUlRva2VuUmV3cml0ZVN0cmVhbTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pIGFUb2tlblNvdXJjZTsKKysgKEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtICopbmV3QU5UTFJUb2tlblJld3JpdGVTdHJlYW06KGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBhVG9rZW5Tb3VyY2UgQ2hhbm5lbDooTlNJbnRlZ2VyKWFDaGFubmVsOworCistIChpZCkgaW5pdDsKKy0gKGlkKWluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKy0gKGlkKWluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZSBDaGFubmVsOihOU0ludGVnZXIpYUNoYW5uZWw7CisKKy0gKEFOVExSSGFzaE1hcCAqKWdldFByb2dyYW1zOworLSAodm9pZClzZXRQcm9ncmFtczooQU5UTFJIYXNoTWFwICopYVByb2dMaXN0OworCistICh2b2lkKSByb2xsYmFjazooTlNJbnRlZ2VyKWluc3RydWN0aW9uSW5kZXg7CistICh2b2lkKSByb2xsYmFjazooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWFuSW5zdHJ1Y3Rpb25JbmRleDsKKy0gKHZvaWQpIGRlbGV0ZVByb2dyYW07CistICh2b2lkKSBkZWxldGVQcm9ncmFtOihOU1N0cmluZyAqKXByb2dyYW1OYW1lOworLSAodm9pZCkgaW5zZXJ0QWZ0ZXJUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSBpbnNlcnRBZnRlckluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSBpbnNlcnRBZnRlclByb2dOYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKworCistICh2b2lkKSBpbnNlcnRCZWZvcmVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSBpbnNlcnRCZWZvcmVJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgaW5zZXJ0QmVmb3JlUHJvZ05hbWU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dDsKKy0gKHZvaWQpIHJlcGxhY2VGcm9tSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilpbmRleFQgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQ7CistICh2b2lkKSByZXBsYWNlUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgcmVwbGFjZVByb2dOYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0OworLSAodm9pZCkgZGVsZXRlOihOU0ludGVnZXIpYW5JbmRleDsKKy0gKHZvaWQpIGRlbGV0ZTooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvOworLSAodm9pZCkgZGVsZXRlVG9rZW46KGlkPEFOVExSVG9rZW4+KWluZGV4VDsKKy0gKHZvaWQpIGRlbGV0ZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0bzsKKy0gKHZvaWQpIGRlbGV0ZTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWZyb20gVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pdG87CistICh2b2lkKSBkZWxldGU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbUluZGV4OihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG87CistIChOU0ludGVnZXIpZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OworLSAoTlNJbnRlZ2VyKWdldExhc3RSZXdyaXRlVG9rZW5JbmRleDooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKHZvaWQpc2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEluZGV4OihOU0ludGVnZXIpYW5JbnQ7CistIChBTlRMUkhhc2hNYXAgKikgZ2V0UHJvZ3JhbTooTlNTdHJpbmcgKiluYW1lOworLSAoQU5UTFJIYXNoTWFwICopIGluaXRpYWxpemVQcm9ncmFtOihOU1N0cmluZyAqKW5hbWU7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc7CistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc6KE5TSW50ZWdlcilzdGFydCBFbmQ6KE5TSW50ZWdlcillbmQ7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworLSAoTlNTdHJpbmcgKil0b1N0cmluZzooTlNTdHJpbmcgKilwcm9ncmFtTmFtZTsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmdGcm9tU3RhcnQ6KE5TSW50ZWdlcilzdGFydCBUb0VuZDooTlNJbnRlZ2VyKWVuZDsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnQgVG9FbmQ6KE5TSW50ZWdlcillbmQ7CistIChBTlRMUkhhc2hNYXAgKilyZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4OihBTlRMUkhhc2hNYXAgKilyZXdyaXRlczsKKy0gKEFOVExSSGFzaE1hcCAqKWdldEtpbmRPZk9wczooQU5UTFJIYXNoTWFwICopcmV3cml0ZXMgS2luZE9mQ2xhc3M6KENsYXNzKWtpbmQ7CistIChBTlRMUkhhc2hNYXAgKilnZXRLaW5kT2ZPcHM6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzIEtpbmRPZkNsYXNzOihDbGFzcylraW5kIEluZGV4OihOU0ludGVnZXIpYmVmb3JlOworLSAoTlNTdHJpbmcgKiljYXRPcFRleHQ6KGlkKWEgUHJldlRleHQ6KGlkKWI7CistIChOU011dGFibGVTdHJpbmcgKil0b0RlYnVnU3RyaW5nOworLSAoTlNNdXRhYmxlU3RyaW5nICopdG9EZWJ1Z1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0IFRvRW5kOihOU0ludGVnZXIpZW5kOworICAgICAgICAgICAgICAgICAgICAKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NGY4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5tCkBAIC0wLDAgKzEsNjkyIEBACisvLworLy8gIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTkvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSUnVudGltZUV4Y2VwdGlvbi5oIgorCitzdGF0aWMgTlNTdHJpbmcgKkRFRkFVTFRfUFJPR1JBTV9OQU1FID0gQCJkZWZhdWx0IjsKK3N0YXRpYyBOU0ludGVnZXIgUFJPR1JBTV9JTklUX1NJWkUgPSAxMDA7CitzdGF0aWMgTlNJbnRlZ2VyIE1JTl9UT0tFTl9JTkRFWCA9IDA7CisKK2V4dGVybiBOU0ludGVnZXIgZGVidWc7CisKKy8vIERlZmluZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gaGllcmFyY2h5CisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJld3JpdGVPcGVyYXRpb24KKworQHN5bnRoZXNpemUgaW5zdHJ1Y3Rpb25JbmRleDsKK0BzeW50aGVzaXplIHJ3SW5kZXg7CitAc3ludGhlc2l6ZSB0ZXh0OworCisrIChBTlRMUlJld3JpdGVPcGVyYXRpb24gKikgbmV3QU5UTFJSZXdyaXRlT3BlcmF0aW9uOihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJld3JpdGVPcGVyYXRpb24gYWxsb2NdIGluaXRXaXRoSW5kZXg6YW5JbmRleCBUZXh0OnRoZVRleHRdOworfQorICAgIAorLSAoaWQpIGluaXRXaXRoSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIHJ3SW5kZXggPSBhbkluZGV4OworICAgICAgICB0ZXh0ID0gdGhlVGV4dDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qKiBFeGVjdXRlIHRoZSByZXdyaXRlIG9wZXJhdGlvbiBieSBwb3NzaWJseSBhZGRpbmcgdG8gdGhlIGJ1ZmZlci4KKyAqICBSZXR1cm4gdGhlIHJ3SW5kZXggb2YgdGhlIG5leHQgdG9rZW4gdG8gb3BlcmF0ZSBvbi4KKyAqLworLSAoTlNJbnRlZ2VyKSBleGVjdXRlOihOU1N0cmluZyAqKWJ1ZgoreworICAgIHJldHVybiByd0luZGV4OworfQorICAgIAorLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIE5TU3RyaW5nICpvcE5hbWUgPSBbc2VsZiBjbGFzc05hbWVdOworICAgIGludCAkaW5kZXggPSBbc2VsZiBpbmRleE9mOickJyBpblN0cmluZzpvcE5hbWVdOworICAgIG9wTmFtZSA9IFtvcE5hbWUgc3Vic3RyaW5nV2l0aFJhbmdlOk5TTWFrZVJhbmdlKCRpbmRleCsxLCBbb3BOYW1lIGxlbmd0aF0pXTsKKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAlZDpcIiVAXCI+Iiwgb3BOYW1lLCByd0luZGV4LCBvcE5hbWVdOwkJCQorfQorCistIChOU0ludGVnZXIpIGluZGV4T2Y6KGNoYXIpYUNoYXIgaW5TdHJpbmc6KE5TU3RyaW5nICopYVN0cmluZworeworICAgIGNoYXIgaW5kZXhlZENoYXI7CisKKyAgICBmb3IoIGludCBpID0gMDsgaSA8IFthU3RyaW5nIGxlbmd0aF07IGkrKyApIHsKKyAgICAgICAgaW5kZXhlZENoYXIgPSBbYVN0cmluZyBjaGFyYWN0ZXJBdEluZGV4OmldOworICAgICAgICBpZiAoaW5kZXhlZENoYXIgPT0gYUNoYXIpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSSW5zZXJ0QmVmb3JlT3AKKworKyAoQU5UTFJJbnNlcnRCZWZvcmVPcCAqKSBuZXdBTlRMUkluc2VydEJlZm9yZU9wOihOU0ludGVnZXIpIGFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0Cit7CisgICAgcmV0dXJuIFtbQU5UTFJJbnNlcnRCZWZvcmVPcCBhbGxvY10gaW5pdFdpdGhJbmRleDphbkluZGV4IFRleHQ6dGhlVGV4dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aEluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbmRleDphbkluZGV4IFRleHQ6dGhlVGV4dF0pICE9IG5pbCkgeworICAgICAgICByd0luZGV4ID0gYW5JbmRleDsKKyAgICAgICAgdGV4dCA9IHRoZVRleHQ7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCisKKy0gKE5TSW50ZWdlcikgZXhlY3V0ZTooTlNNdXRhYmxlU3RyaW5nICopYnVmCit7CisgICAgW2J1ZiBhcHBlbmRTdHJpbmc6dGV4dF07CisgICAgaWYgKCAoKEFOVExSQ29tbW9uVG9rZW4gKilbdG9rZW5zIG9iamVjdEF0SW5kZXg6cndJbmRleF0pLnR5cGUgIT0gQU5UTFJUb2tlblR5cGVFT0YgKSB7CisgICAgICAgIFtidWYgYXBwZW5kU3RyaW5nOltbdG9rZW5zIG9iamVjdEF0SW5kZXg6cndJbmRleF0gdGV4dF1dOworICAgIH0KKyAgICByZXR1cm4gcndJbmRleCsxOworfQorCitAZW5kCisgICAgIAorLyoqIEknbSBnb2luZyB0byB0cnkgcmVwbGFjaW5nIHJhbmdlIGZyb20geC4ueSB3aXRoICh5LXgpKzEgQU5UTFJSZXBsYWNlT3AKKyAqICBpbnN0cnVjdGlvbnMuCisgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlJlcGxhY2VPcAorCitAc3ludGhlc2l6ZSBsYXN0SW5kZXg7CisKKysgKEFOVExSUmVwbGFjZU9wICopIG5ld0FOVExSUmVwbGFjZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8gVGV4dDooTlNTdHJpbmcqKXRoZVRleHQKK3sKKyAgICByZXR1cm4gW1tBTlRMUlJlcGxhY2VPcCBhbGxvY10gaW5pdFdpdGhJbmRleDpmcm9tIFRvSW5kZXg6dG8gVGV4dDp0aGVUZXh0XTsKK30KKworLSAoaWQpIGluaXRXaXRoSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbmRleDpmcm9tIFRleHQ6dGhlVGV4dF0pICE9IG5pbCkgeworICAgICAgICBsYXN0SW5kZXggPSB0bzsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisgCisgCistIChOU0ludGVnZXIpIGV4ZWN1dGU6KE5TTXV0YWJsZVN0cmluZyAqKWJ1ZgoreworICAgIGlmICggdGV4dCE9bmlsICkgeworICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzp0ZXh0XTsKKyAgICB9CisgICAgICAgIHJldHVybiBsYXN0SW5kZXgrMTsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjxBTlRMUlJlcGxhY2VPcEAgJWQuLiVkIDo+JUBcbiIsIHJ3SW5kZXgsIGxhc3RJbmRleCwgdGV4dF07Cit9CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSRGVsZXRlT3AKKworKyAoQU5UTFJEZWxldGVPcCAqKSBuZXdBTlRMUkRlbGV0ZU9wOihOU0ludGVnZXIpZnJvbSBUb0luZGV4OihOU0ludGVnZXIpdG8KK3sKKyAgICAvLyBzdXBlcihmcm9tIFRvOnRvLCBudWxsKTsKKyAgICByZXR1cm4gW1tBTlRMUkRlbGV0ZU9wIGFsbG9jXSBpbml0V2l0aEluZGV4OmZyb20gVG9JbmRleDp0b107Cit9CisKKyAtIChpZCkgaW5pdFdpdGhJbmRleDooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoSW5kZXg6ZnJvbSBUb0luZGV4OnRvIFRleHQ6bmlsXSkgIT0gbmlsKSB7CisgICAgICAgIGxhc3RJbmRleCA9IHRvOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKyAgICAgCistIChOU1N0cmluZyAqKXRvU3RyaW5nCit7CisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPERlbGV0ZU9wQCAlZC4uJWRcbiIsICByd0luZGV4LCBsYXN0SW5kZXhdOworfQorCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtCisKK0BzeW50aGVzaXplIHByb2dyYW1zOworQHN5bnRoZXNpemUgbGFzdFJld3JpdGVUb2tlbkluZGV4ZXM7CisKKysgKEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtICopbmV3QU5UTFJUb2tlblJld3JpdGVTdHJlYW0KK3sKKyAgICByZXR1cm4gW1tBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSBhbGxvY10gaW5pdF07Cit9CisKKysgKEFOVExSVG9rZW5SZXdyaXRlU3RyZWFtICopbmV3QU5UTFJUb2tlblJld3JpdGVTdHJlYW06KGlkPEFOVExSVG9rZW5Tb3VyY2U+KSBhVG9rZW5Tb3VyY2UKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSBhbGxvY10gaW5pdFdpdGhUb2tlblNvdXJjZTphVG9rZW5Tb3VyY2VdOworfQorCisrIChBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSAqKW5ld0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtOihpZDxBTlRMUlRva2VuU291cmNlPikgYVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbAoreworICAgIHJldHVybiBbW0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRva2VuU291cmNlOmFUb2tlblNvdXJjZSBDaGFubmVsOmFDaGFubmVsXTsKK30KKyAKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgcHJvZ3JhbXMgPSBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcF07CisgICAgICAgIFtwcm9ncmFtcyBhZGRPYmplY3Q6W0FOVExSTWFwRWxlbWVudCBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTpERUZBVUxUX1BST0dSQU1fTkFNRSBOb2RlOltBTlRMUkhhc2hNYXAgbmV3QU5UTFJIYXNoTWFwV2l0aExlbjpQUk9HUkFNX0lOSVRfU0laRV1dXTsKKyAgICAgICAgbGFzdFJld3JpdGVUb2tlbkluZGV4ZXMgPSBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcF07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorIAorLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgcHJvZ3JhbXMgPSBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcF07CisgICAgICAgIFtwcm9ncmFtcyBhZGRPYmplY3Q6W0FOVExSTWFwRWxlbWVudCBuZXdBTlRMUk1hcEVsZW1lbnRXaXRoTmFtZTpERUZBVUxUX1BST0dSQU1fTkFNRSBOb2RlOltBTlRMUkhhc2hNYXAgbmV3QU5UTFJIYXNoTWFwV2l0aExlbjpQUk9HUkFNX0lOSVRfU0laRV1dXTsKKyAgICAgICAgbGFzdFJld3JpdGVUb2tlbkluZGV4ZXMgPSBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcF07CisgICAgICAgIHRva2VuU291cmNlID0gYVRva2VuU291cmNlOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlIENoYW5uZWw6KE5TSW50ZWdlcilhQ2hhbm5lbAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIHByb2dyYW1zID0gW0FOVExSSGFzaE1hcCBuZXdBTlRMUkhhc2hNYXBdOworICAgICAgICBbcHJvZ3JhbXMgYWRkT2JqZWN0OltBTlRMUk1hcEVsZW1lbnQgbmV3QU5UTFJNYXBFbGVtZW50V2l0aE5hbWU6REVGQVVMVF9QUk9HUkFNX05BTUUgTm9kZTpbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcFdpdGhMZW46UFJPR1JBTV9JTklUX1NJWkVdXV07CisgICAgICAgIGxhc3RSZXdyaXRlVG9rZW5JbmRleGVzID0gW0FOVExSSGFzaE1hcCBuZXdBTlRMUkhhc2hNYXBdOworICAgICAgICB0b2tlblNvdXJjZSA9IGFUb2tlblNvdXJjZTsKKyAgICAgICAgY2hhbm5lbCA9IGFDaGFubmVsOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKyAKKy0gKEFOVExSSGFzaE1hcCAqKWdldFByb2dyYW1zCit7CisgICAgcmV0dXJuIHByb2dyYW1zOworfQorIAorLSAodm9pZClzZXRQcm9ncmFtczooQU5UTFJIYXNoTWFwICopYVByb2dMaXN0Cit7CisgICAgcHJvZ3JhbXMgPSBhUHJvZ0xpc3Q7Cit9CisKKy0gKHZvaWQpIHJvbGxiYWNrOihOU0ludGVnZXIpaW5zdHJ1Y3Rpb25JbmRleAoreworICAgIFtzZWxmIHJvbGxiYWNrOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEluZGV4Omluc3RydWN0aW9uSW5kZXhdOworfQorCisvKiogUm9sbGJhY2sgdGhlIGluc3RydWN0aW9uIHN0cmVhbSBmb3IgYSBwcm9ncmFtIHNvIHRoYXQKKyAqICB0aGUgaW5kaWNhdGVkIGluc3RydWN0aW9uICh2aWEgaW5zdHJ1Y3Rpb25JbmRleCkgaXMgbm8KKyAqICBsb25nZXIgaW4gdGhlIHN0cmVhbS4gIFVOVEVTVEVEIQorICovCistICh2b2lkKSByb2xsYmFjazooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWFuSW5zdHJ1Y3Rpb25JbmRleAoreworICAgIGlkIG9iamVjdDsKKyAgICBBTlRMUkhhc2hNYXAgKmlzOworCisgICAgLy8gICAgQU11dGFibGVBcnJheSAqaXMgPSBbcHJvZ3JhbXMgZ2V0KHByb2dyYW1OYW1lKV07CisgICAgaXMgPSBbc2VsZiBnZXRQcm9ncmFtc107CisgICAgb2JqZWN0ID0gW2lzIGdldE5hbWU6cHJvZ3JhbU5hbWVdOworICAgIGlmICggaXMgIT0gbmlsICkgeworI3ByYWdtYSB3YXJuaW5nIHRoaXMgaGFzIHRvIGJlIGZpeGVkCisgICAgICAgIFtwcm9ncmFtcyBpbnNlcnRPYmplY3Q6cHJvZ3JhbU5hbWUgIGF0SW5kZXg6YW5JbnN0cnVjdGlvbkluZGV4XTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlbGV0ZVByb2dyYW0KK3sKKyAgICBbc2VsZiBkZWxldGVQcm9ncmFtOkRFRkFVTFRfUFJPR1JBTV9OQU1FXTsKK30KKworLyoqIFJlc2V0IHRoZSBwcm9ncmFtIHNvIHRoYXQgbm8gaW5zdHJ1Y3Rpb25zIGV4aXN0ICovCistICh2b2lkKSBkZWxldGVQcm9ncmFtOihOU1N0cmluZyAqKXByb2dyYW1OYW1lCit7CisgICAgW3NlbGYgcm9sbGJhY2s6cHJvZ3JhbU5hbWUgSW5kZXg6TUlOX1RPS0VOX0lOREVYXTsKK30KKworLSAodm9pZCkgaW5zZXJ0QWZ0ZXJUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQKK3sKKyAgICBbc2VsZiBpbnNlcnRBZnRlclByb2dOYW06REVGQVVMVF9QUk9HUkFNX05BTUUgSW5kZXg6W3QgZ2V0VG9rZW5JbmRleF0gVGV4dDp0aGVUZXh0XTsKK30KKworLSAodm9pZCkgaW5zZXJ0QWZ0ZXJJbmRleDooTlNJbnRlZ2VyKWFuSW5kZXggVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0Cit7CisgICAgW3NlbGYgaW5zZXJ0QWZ0ZXJQcm9nTmFtOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHRdOworfQorCistICh2b2lkKSBpbnNlcnRBZnRlclByb2dOYW06KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworICAgIC8vIHRvIGluc2VydCBhZnRlciwganVzdCBpbnNlcnQgYmVmb3JlIG5leHQgcndJbmRleCAoZXZlbiBpZiBwYXN0IGVuZCkKKyAgICBbc2VsZiBpbnNlcnRCZWZvcmVQcm9nTmFtZTpwcm9ncmFtTmFtZSBJbmRleDphbkluZGV4KzEgVGV4dDp0aGVUZXh0XTsKKyAgICAvL2FkZFRvU29ydGVkUmV3cml0ZUxpc3QocHJvZ3JhbU5hbWUsIG5ldyBJbnNlcnRBZnRlck9wKHJ3SW5kZXgsdGV4dCkpOworfQorCisKKworCisKKworCisKKworLSAodm9pZCkgaW5zZXJ0QmVmb3JlVG9rZW46KGlkPEFOVExSVG9rZW4+KXQgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0Cit7CisgICAgW3NlbGYgaW5zZXJ0QmVmb3JlUHJvZ05hbWU6REVGQVVMVF9QUk9HUkFNX05BTUUgSW5kZXg6W3QgZ2V0VG9rZW5JbmRleF0gVGV4dDp0aGVUZXh0XTsKK30KKworLSAodm9pZCkgaW5zZXJ0QmVmb3JlSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworICAgIFtzZWxmIGluc2VydEJlZm9yZVByb2dOYW1lOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEluZGV4OmFuSW5kZXggVGV4dDp0aGVUZXh0XTsKK30KKworLSAodm9pZCkgaW5zZXJ0QmVmb3JlUHJvZ05hbWU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgSW5kZXg6KE5TSW50ZWdlcilyd0luZGV4IFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworICAgIC8vYWRkVG9Tb3J0ZWRSZXdyaXRlTGlzdChwcm9ncmFtTmFtZSwgbmV3IEFOVExSSW5zZXJ0QmVmb3JlT3AocndJbmRleCx0ZXh0KSk7CisgICAgQU5UTFJSZXdyaXRlT3BlcmF0aW9uICpvcCA9IFtBTlRMUkluc2VydEJlZm9yZU9wIG5ld0FOVExSSW5zZXJ0QmVmb3JlT3A6cndJbmRleCBUZXh0OnRoZVRleHRdOworICAgIEFOVExSSGFzaE1hcCAqcmV3cml0ZXMgPSBbc2VsZiBnZXRQcm9ncmFtOnByb2dyYW1OYW1lXTsKKyAgICBvcC5pbnN0cnVjdGlvbkluZGV4ID0gW3Jld3JpdGVzIGNvdW50XTsKKyAgICBbcmV3cml0ZXMgYWRkT2JqZWN0Om9wXTsJCQorfQorCistICh2b2lkKSByZXBsYWNlRnJvbUluZGV4OihOU0ludGVnZXIpYW5JbmRleCBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQKK3sKKyAgICBbc2VsZiByZXBsYWNlUHJvZ05hbTpERUZBVUxUX1BST0dSQU1fTkFNRSBGcm9tSW5kZXg6YW5JbmRleCBUb0luZGV4OmFuSW5kZXggVGV4dDp0aGVUZXh0XTsKK30KKworLSAodm9pZCkgcmVwbGFjZUZyb21JbmRleDooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworICAgIFtzZWxmIHJlcGxhY2VQcm9nTmFtOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEZyb21JbmRleDpmcm9tIFRvSW5kZXg6dG8gVGV4dDp0aGVUZXh0XTsKK30KKworLSAodm9pZCkgcmVwbGFjZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pYW5JbmRleFQgVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0Cit7CisgICAgW3NlbGYgcmVwbGFjZVByb2dOYW06REVGQVVMVF9QUk9HUkFNX05BTUUgRnJvbUluZGV4OlthbkluZGV4VCBnZXRUb2tlbkluZGV4XSBUb0luZGV4OlthbkluZGV4VCBnZXRUb2tlbkluZGV4XSBUZXh0OnRoZVRleHRdOworfQorCistICh2b2lkKSByZXBsYWNlRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXRvIFRleHQ6KE5TU3RyaW5nICopdGhlVGV4dAoreworICAgIFtzZWxmIHJlcGxhY2VQcm9nTmFtOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEZyb21JbmRleDpbZnJvbSBnZXRUb2tlbkluZGV4XSBUb0luZGV4Olt0byBnZXRUb2tlbkluZGV4XSBUZXh0OnRoZVRleHRdOworfQorCistICh2b2lkKSByZXBsYWNlUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb2tlbjooaWQ8QU5UTFJUb2tlbj4pdG8gVGV4dDooTlNTdHJpbmcgKil0aGVUZXh0Cit7CisgICAgW3NlbGYgcmVwbGFjZVByb2dOYW06cHJvZ3JhbU5hbWUgRnJvbUluZGV4Oltmcm9tIGdldFRva2VuSW5kZXhdIFRvSW5kZXg6W3RvIGdldFRva2VuSW5kZXhdIFRleHQ6dGhlVGV4dF07Cit9CisgICAgICAgICAgICAgICAgICAgICAgICAgCistICh2b2lkKSByZXBsYWNlUHJvZ05hbTooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBGcm9tSW5kZXg6KE5TSW50ZWdlcilmcm9tIFRvSW5kZXg6KE5TSW50ZWdlcil0byBUZXh0OihOU1N0cmluZyAqKXRoZVRleHQKK3sKKyAgICBpZiAoIGZyb20gPiB0byB8fCBmcm9tIDwgMCB8fCB0byA8IDAgfHwgdG8gPj0gW3Rva2VucyBjb3VudF0gKSB7CisgICAgICAgIEB0aHJvdyBbQU5UTFJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOltOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAicmVwbGFjZTogcmFuZ2UgaW52YWxpZDogJWQuLiVkIHNpemU9JWRcbiIsIGZyb20sIHRvLCBbdG9rZW5zIGNvdW50XV1dOworICAgIH0KKyAgICBBTlRMUlJld3JpdGVPcGVyYXRpb24gKm9wID0gW0FOVExSUmVwbGFjZU9wIG5ld0FOVExSUmVwbGFjZU9wOmZyb20gVG9JbmRleDp0byBUZXh0OnRoZVRleHRdOworICAgIEFOVExSSGFzaE1hcCAqcmV3cml0ZXMgPSAoQU5UTFJIYXNoTWFwICopW2xhc3RSZXdyaXRlVG9rZW5JbmRleGVzIGdldE5hbWU6cHJvZ3JhbU5hbWVdOworICAgIG9wLmluc3RydWN0aW9uSW5kZXggPSBbcmV3cml0ZXMgY291bnRdOworICAgIFtyZXdyaXRlcyBhZGRPYmplY3Q6b3BdOworfQorCistICh2b2lkKSBkZWxldGU6KE5TSW50ZWdlcilhbkluZGV4Cit7CisgICAgW3NlbGYgZGVsZXRlOkRFRkFVTFRfUFJPR1JBTV9OQU1FICBGcm9tSW5kZXg6KE5TSW50ZWdlcilhbkluZGV4ICBUb0luZGV4OihOU0ludGVnZXIpYW5JbmRleF07Cit9CisKKy0gKHZvaWQpIGRlbGV0ZTooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvCit7CisgICAgW3NlbGYgZGVsZXRlOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEZyb21JbmRleDpmcm9tIFRvSW5kZXg6dG9dOworfQorCistICh2b2lkKSBkZWxldGVUb2tlbjooaWQ8QU5UTFJUb2tlbj4pYW5JbmRleFQKK3sKKyAgICBbc2VsZiBkZWxldGU6REVGQVVMVF9QUk9HUkFNX05BTUUgRnJvbUluZGV4OlthbkluZGV4VCBnZXRUb2tlbkluZGV4XSBUb0luZGV4OlthbkluZGV4VCBnZXRUb2tlbkluZGV4XV07Cit9CisKKy0gKHZvaWQpIGRlbGV0ZUZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbSBUb1Rva2VuOihpZDxBTlRMUlRva2VuPil0bworeworICAgIFtzZWxmIGRlbGV0ZTpERUZBVUxUX1BST0dSQU1fTkFNRSBGcm9tSW5kZXg6W2Zyb20gZ2V0VG9rZW5JbmRleF0gVG9JbmRleDpbdG8gZ2V0VG9rZW5JbmRleF1dOworfQorCistICh2b2lkKSBkZWxldGU6KE5TU3RyaW5nICopcHJvZ3JhbU5hbWUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tIFRvVG9rZW46KGlkPEFOVExSVG9rZW4+KXRvCit7CisgICAgW3NlbGYgcmVwbGFjZVByb2dOYW06cHJvZ3JhbU5hbWUgRnJvbUluZGV4Oltmcm9tIGdldFRva2VuSW5kZXhdIFRvSW5kZXg6W3RvIGdldFRva2VuSW5kZXhdIFRleHQ6bmlsXTsKK30KKworLSAodm9pZCkgZGVsZXRlOihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEZyb21JbmRleDooTlNJbnRlZ2VyKWZyb20gVG9JbmRleDooTlNJbnRlZ2VyKXRvCit7CisgICAgW3NlbGYgcmVwbGFjZVByb2dOYW06cHJvZ3JhbU5hbWUgRnJvbUluZGV4OmZyb20gVG9JbmRleDp0byBUZXh0Om5pbF07Cit9CisKKy0gKE5TSW50ZWdlcilnZXRMYXN0UmV3cml0ZVRva2VuSW5kZXgKK3sKKyAgICByZXR1cm4gW3NlbGYgZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4OkRFRkFVTFRfUFJPR1JBTV9OQU1FXTsKK30KKworLSAoTlNJbnRlZ2VyKWdldExhc3RSZXdyaXRlVG9rZW5JbmRleDooTlNTdHJpbmcgKilwcm9ncmFtTmFtZQoreworI3ByYWdtYSB3YXJuaW5nIGZpeCB0aGlzIHRvIGxvb2sgdXAgdGhlIGhhc2hlZCBuYW1lCisgICAgTlNJbnRlZ2VyIGFuSW50ID0gLTE7CisgICAgQU5UTFJNYXBFbGVtZW50ICpub2RlID0gW2xhc3RSZXdyaXRlVG9rZW5JbmRleGVzIGxvb2t1cDpwcm9ncmFtTmFtZSBTY29wZTowXTsKKyAgICBpZiAoIG5vZGUgIT0gbmlsICkgeworICAgICAgICBhbkludCA9IFtsYXN0UmV3cml0ZVRva2VuSW5kZXhlcyBoYXNoOnByb2dyYW1OYW1lXTsKKyAgICB9CisgICAgcmV0dXJuIGFuSW50OworfQorCistICh2b2lkKXNldExhc3RSZXdyaXRlVG9rZW5JbmRleDooTlNTdHJpbmcgKilwcm9ncmFtTmFtZSBJbmRleDooTlNJbnRlZ2VyKWFuSW50Cit7CisgICAgW2xhc3RSZXdyaXRlVG9rZW5JbmRleGVzIGluc2VydE9iamVjdDpwcm9ncmFtTmFtZSBhdEluZGV4OmFuSW50XTsKK30KKworLShBTlRMUkhhc2hNYXAgKikgZ2V0UHJvZ3JhbTooTlNTdHJpbmcgKiluYW1lCit7CisgICBBTlRMUkhhc2hNYXAgKmlzID0gKEFOVExSSGFzaE1hcCAqKVtwcm9ncmFtcyBnZXROYW1lOm5hbWVdOworICAgIGlmICggaXMgPT0gbmlsICkgeworICAgICAgICBpcyA9IFtzZWxmIGluaXRpYWxpemVQcm9ncmFtOm5hbWVdOworICAgIH0KKyAgICByZXR1cm4gaXM7Cit9CisKKy0oQU5UTFJIYXNoTWFwICopIGluaXRpYWxpemVQcm9ncmFtOihOU1N0cmluZyAqKW5hbWUKK3sKKyAgICBBTlRMUkhhc2hNYXAgKmlzID0gW0FOVExSSGFzaE1hcCBuZXdBTlRMUkhhc2hNYXBXaXRoTGVuOlBST0dSQU1fSU5JVF9TSVpFXTsKKyAgICBbaXMgcHV0TmFtZTpuYW1lIE5vZGU6bmlsXTsKKyAgICByZXR1cm4gaXM7Cit9CisKKy0gKE5TU3RyaW5nICopdG9PcmlnaW5hbFN0cmluZworeworICAgIFtzdXBlciBmaWxsXTsKKyAgICByZXR1cm4gW3NlbGYgdG9PcmlnaW5hbFN0cmluZzpNSU5fVE9LRU5fSU5ERVggRW5kOlt0b2tlbnMgY291bnRdLTFdOworfQorCistIChOU1N0cmluZyAqKXRvT3JpZ2luYWxTdHJpbmc6KE5TSW50ZWdlcilzdGFydCBFbmQ6KE5TSW50ZWdlcillbmQKK3sKKyAgICBOU011dGFibGVTdHJpbmcgKmJ1ZiA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjEwMF07CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IE1JTl9UT0tFTl9JTkRFWCAmJiBpIDw9IGVuZCAmJiBpPCBbdG9rZW5zIGNvdW50XTsgaSsrKSB7CisgICAgICAgIGlmICggW1tsYXN0UmV3cml0ZVRva2VuSW5kZXhlcyBvYmplY3RBdEluZGV4OmldIHR5cGVdICE9IEFOVExSVG9rZW5UeXBlRU9GICkKKyAgICAgICAgICAgIFtidWYgYXBwZW5kU3RyaW5nOltbdG9rZW5zIG9iamVjdEF0SW5kZXg6aV0gdGV4dF1dOworICAgIH0KKyAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6YnVmXTsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIFtzdXBlciBmaWxsXTsKKyAgICByZXR1cm4gW3NlbGYgdG9TdHJpbmdGcm9tU3RhcnQ6TUlOX1RPS0VOX0lOREVYIFRvRW5kOlt0b2tlbnMgY291bnRdLTFdOworfQorCistIChOU1N0cmluZyAqKXRvU3RyaW5nOihOU1N0cmluZyAqKXByb2dyYW1OYW1lCit7CisgICAgW3N1cGVyIGZpbGxdOworICAgIHJldHVybiBbc2VsZiB0b1N0cmluZzpwcm9ncmFtTmFtZSBGcm9tU3RhcnQ6TUlOX1RPS0VOX0lOREVYIFRvRW5kOltbcHJvZ3JhbXMgb2JqZWN0QXRJbmRleDpNSU5fVE9LRU5fSU5ERVhdIGNvdW50XS0xXTsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0IFRvRW5kOihOU0ludGVnZXIpZW5kCit7CisgICAgcmV0dXJuIFtzZWxmIHRvU3RyaW5nOkRFRkFVTFRfUFJPR1JBTV9OQU1FIEZyb21TdGFydDpzdGFydCBUb0VuZDplbmRdOworfQorCistIChOU1N0cmluZyAqKXRvU3RyaW5nOihOU1N0cmluZyAqKXByb2dyYW1OYW1lIEZyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0IFRvRW5kOihOU0ludGVnZXIpZW5kCit7CisgICAgQU5UTFJIYXNoTWFwICpyZXdyaXRlcyA9IChBTlRMUkhhc2hNYXAgKilbcHJvZ3JhbXMgZ2V0TmFtZTpwcm9ncmFtTmFtZV07CisgICAgCisgICAgLy8gZW5zdXJlIHN0YXJ0L2VuZCBhcmUgaW4gcmFuZ2UKKyAgICBpZiAoIGVuZCA+IFt0b2tlbnMgY291bnRdLTEgKSBlbmQgPSBbdG9rZW5zIGNvdW50XS0xOworICAgIGlmICggc3RhcnQgPCAwICkKKyAgICAgICAgc3RhcnQgPSAwOworICAgIAorICAgIGlmICggcmV3cml0ZXMgPT0gbmlsIHx8IFtyZXdyaXRlcyBjb3VudF0gPT0gMCApIHsKKyAgICAgICAgcmV0dXJuIFtzZWxmIHRvT3JpZ2luYWxTdHJpbmc6c3RhcnQgRW5kOmVuZF07IC8vIG5vIGluc3RydWN0aW9ucyB0byBleGVjdXRlCisgICAgfQorICAgIE5TTXV0YWJsZVN0cmluZyAqYnVmID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoQ2FwYWNpdHk6MTAwXTsKKyAgICAKKyAgICAvLyBGaXJzdCwgb3B0aW1pemUgaW5zdHJ1Y3Rpb24gc3RyZWFtCisgICAgQU5UTFJIYXNoTWFwICppbmRleFRvT3AgPSBbc2VsZiByZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4OnJld3JpdGVzXTsKKyAgICAKKyAgICAvLyBXYWxrIGJ1ZmZlciwgZXhlY3V0aW5nIGluc3RydWN0aW9ucyBhbmQgZW1pdHRpbmcgdG9rZW5zCisgICAgaW50IGkgPSBzdGFydDsKKyAgICB3aGlsZSAoIGkgPD0gZW5kICYmIGkgPCBbdG9rZW5zIGNvdW50XSApIHsKKyAgICAgICAgQU5UTFJSZXdyaXRlT3BlcmF0aW9uICpvcCA9IChBTlRMUlJld3JpdGVPcGVyYXRpb24gKilbaW5kZXhUb09wIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIFtpbmRleFRvT3Agc2V0T2JqZWN0Om5pbCBhdEluZGV4OmldOyAvLyByZW1vdmUgc28gYW55IGxlZnQgaGF2ZSByd0luZGV4IHNpemUtMQorICAgICAgICBpZDxBTlRMUlRva2VuPnQgPSAoaWQ8QU5UTFJUb2tlbj4pIFt0b2tlbnMgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgaWYgKCBvcCA9PSBuaWwgKSB7CisgICAgICAgICAgICAvLyBubyBvcGVyYXRpb24gYXQgdGhhdCByd0luZGV4LCBqdXN0IGR1bXAgdG9rZW4KKyAgICAgICAgICAgIGlmICggdC50eXBlICE9IEFOVExSVG9rZW5UeXBlRU9GICkKKyAgICAgICAgICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzp0LnRleHRdOworICAgICAgICAgICAgaSsrOyAvLyBtb3ZlIHRvIG5leHQgdG9rZW4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGkgPSBbb3AgZXhlY3V0ZTpidWZdOyAvLyBleGVjdXRlIG9wZXJhdGlvbiBhbmQgc2tpcAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIGluY2x1ZGUgc3R1ZmYgYWZ0ZXIgZW5kIGlmIGl0J3MgbGFzdCByd0luZGV4IGluIGJ1ZmZlcgorICAgIC8vIFNvLCBpZiB0aGV5IGRpZCBhbiBpbnNlcnRBZnRlcihsYXN0VmFsaWRJbmRleCwgImZvbyIpLCBpbmNsdWRlCisgICAgLy8gZm9vIGlmIGVuZD09bGFzdFZhbGlkSW5kZXguCisgICAgLy9pZiAoIGVuZCA9PSBbdG9rZW5zIHNpemVdLTEgKSB7CisgICAgaWYgKCBlbmQgPT0gW3Rva2VucyBjb3VudF0tMSApIHsKKyAgICAgICAgLy8gU2NhbiBhbnkgcmVtYWluaW5nIG9wZXJhdGlvbnMgYWZ0ZXIgbGFzdCB0b2tlbgorICAgICAgICAvLyBzaG91bGQgYmUgaW5jbHVkZWQgKHRoZXkgd2lsbCBiZSBpbnNlcnRzKS4KKyAgICAgICAgaW50IGkyID0gMDsKKyAgICAgICAgd2hpbGUgKCBpMiA8IFtpbmRleFRvT3AgY291bnRdIC0gMSApIHsKKyAgICAgICAgICAgIEFOVExSUmV3cml0ZU9wZXJhdGlvbiAqb3AgPSBbaW5kZXhUb09wIG9iamVjdEF0SW5kZXg6aTJdOworICAgICAgICAgICAgaWYgKCBvcC5yd0luZGV4ID49IFt0b2tlbnMgY291bnRdLTEgKSB7CisgICAgICAgICAgICAgICAgW2J1ZiBhcHBlbmRTdHJpbmc6b3AudGV4dF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoU3RyaW5nOmJ1Zl07Cit9CisKKy8qKiBXZSBuZWVkIHRvIGNvbWJpbmUgb3BlcmF0aW9ucyBhbmQgcmVwb3J0IGludmFsaWQgb3BlcmF0aW9ucyAobGlrZQorICogIG92ZXJsYXBwaW5nIHJlcGxhY2VzIHRoYXQgYXJlIG5vdCBjb21wbGV0ZWQgbmVzdGVkKS4gIEluc2VydHMgdG8KKyAqICBzYW1lIHJ3SW5kZXggbmVlZCB0byBiZSBjb21iaW5lZCBldGMuLi4gICBIZXJlIGFyZSB0aGUgY2FzZXM6CisgKgorICogIEkuaS51IEkuai52CQkJCQkJCQlsZWF2ZSBhbG9uZSwgbm9ub3ZlcmxhcHBpbmcKKyAqICBJLmkudSBJLmkudgkJCQkJCQkJY29tYmluZTogSWl2dQorICoKKyAqICBSLmktai51IFIueC15LnYJfCBpLWogaW4geC15CQkJZGVsZXRlIGZpcnN0IFIKKyAqICBSLmktai51IFIuaS1qLnYJCQkJCQkJZGVsZXRlIGZpcnN0IFIKKyAqICBSLmktai51IFIueC15LnYJfCB4LXkgaW4gaS1qCQkJRVJST1IKKyAqICBSLmktai51IFIueC15LnYJfCBib3VuZGFyaWVzIG92ZXJsYXAJRVJST1IKKyAqCisgKiAgSS5pLnUgUi54LXkudiB8IGkgaW4geC15CQkJCWRlbGV0ZSBJCisgKiAgSS5pLnUgUi54LXkudiB8IGkgbm90IGluIHgteQkJCWxlYXZlIGFsb25lLCBub25vdmVybGFwcGluZworICogIFIueC15LnYgSS5pLnUgfCBpIGluIHgteQkJCQlFUlJPUgorICogIFIueC15LnYgSS54LnUgCQkJCQkJCVIueC15LnV2IChjb21iaW5lLCBkZWxldGUgSSkKKyAqICBSLngteS52IEkuaS51IHwgaSBub3QgaW4geC15CQkJbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisgKgorICogIEkuaS51ID0gaW5zZXJ0IHUgYmVmb3JlIG9wIEAgcndJbmRleCBpCisgKiAgUi54LXkudSA9IHJlcGxhY2UgeC15IGluZGV4ZWQgdG9rZW5zIHdpdGggdQorICoKKyAqICBGaXJzdCB3ZSBuZWVkIHRvIGV4YW1pbmUgcmVwbGFjZXMuICBGb3IgYW55IHJlcGxhY2Ugb3A6CisgKgorICogCQkxLiB3aXBlIG91dCBhbnkgaW5zZXJ0aW9ucyBiZWZvcmUgb3Agd2l0aGluIHRoYXQgcmFuZ2UuCisgKgkJMi4gRHJvcCBhbnkgcmVwbGFjZSBvcCBiZWZvcmUgdGhhdCBpcyBjb250YWluZWQgY29tcGxldGVseSB3aXRoaW4KKyAqICAgICAgICAgdGhhdCByYW5nZS4KKyAqCQkzLiBUaHJvdyBleGNlcHRpb24gdXBvbiBib3VuZGFyeSBvdmVybGFwIHdpdGggYW55IHByZXZpb3VzIHJlcGxhY2UuCisgKgorICogIFRoZW4gd2UgY2FuIGRlYWwgd2l0aCBpbnNlcnRzOgorICoKKyAqIAkJMS4gZm9yIGFueSBpbnNlcnRzIHRvIHNhbWUgcndJbmRleCwgY29tYmluZSBldmVuIGlmIG5vdCBhZGphY2VudC4KKyAqIAkJMi4gZm9yIGFueSBwcmlvciByZXBsYWNlIHdpdGggc2FtZSBsZWZ0IGJvdW5kYXJ5LCBjb21iaW5lIHRoaXMKKyAqICAgICAgICAgaW5zZXJ0IHdpdGggcmVwbGFjZSBhbmQgZGVsZXRlIHRoaXMgcmVwbGFjZS4KKyAqIAkJMy4gdGhyb3cgZXhjZXB0aW9uIGlmIHJ3SW5kZXggaW4gc2FtZSByYW5nZSBhcyBwcmV2aW91cyByZXBsYWNlCisgKgorICogIERvbid0IGFjdHVhbGx5IGRlbGV0ZTsgbWFrZSBvcCBudWxsIGluIGxpc3QuIEVhc2llciB0byB3YWxrIGxpc3QuCisgKiAgTGF0ZXIgd2UgY2FuIHRocm93IGFzIHdlIGFkZCB0byByd0luZGV4IC0+IG9wIG1hcC4KKyAqCisgKiAgTm90ZSB0aGF0IEkuMiBSLjItMiB3aWxsIHdpcGUgb3V0IEkuMiBldmVuIHRob3VnaCwgdGVjaG5pY2FsbHksIHRoZQorICogIGluc2VydGVkIHN0dWZmIHdvdWxkIGJlIGJlZm9yZSB0aGUgcmVwbGFjZSByYW5nZS4gIEJ1dCwgaWYgeW91CisgKiAgYWRkIHRva2VucyBpbiBmcm9udCBvZiBhIG1ldGhvZCBib2R5ICd7JyBhbmQgdGhlbiBkZWxldGUgdGhlIG1ldGhvZAorICogIGJvZHksIEkgdGhpbmsgdGhlIHN0dWZmIGJlZm9yZSB0aGUgJ3snIHlvdSBhZGRlZCBzaG91bGQgZGlzYXBwZWFyIHRvby4KKyAqCisgKiAgUmV0dXJuIGEgbWFwIGZyb20gdG9rZW4gcndJbmRleCB0byBvcGVyYXRpb24uCisgKi8KKy0gKEFOVExSSGFzaE1hcCAqKXJlZHVjZVRvU2luZ2xlT3BlcmF0aW9uUGVySW5kZXg6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzCit7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJld3JpdGVzPSIrcmV3cml0ZXMpOworICAgIGlmIChkZWJ1ZyA+IDEpIE5TTG9nKEAicmV3cml0ZXM9JUBcbiIsIFtyZXdyaXRlcyBnZXROYW1lOkRFRkFVTFRfUFJPR1JBTV9OQU1FXSk7CisgICAgLy8gV0FMSyBSRVBMQUNFUworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgW3Jld3JpdGVzIGNvdW50XTsgaSsrKSB7CisgICAgICAgIEFOVExSUmV3cml0ZU9wZXJhdGlvbiAqb3AgPSAoQU5UTFJSZXdyaXRlT3BlcmF0aW9uICopW3Jld3JpdGVzIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggb3A9PW5pbCApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCAhKFtbb3AgY2xhc3NdIGlzS2luZE9mQ2xhc3M6W0FOVExSUmVwbGFjZU9wIGNsYXNzXV0pICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBBTlRMUlJlcGxhY2VPcCAqcm9wID0gKEFOVExSUmVwbGFjZU9wICopW3Jld3JpdGVzIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIC8vIFdpcGUgcHJpb3IgaW5zZXJ0cyB3aXRoaW4gcmFuZ2UKKyAgICAgICAgLy9MaXN0IGluc2VydHMgPSBnZXRLaW5kT2ZPcHMocmV3cml0ZXMsIEFOVExSSW5zZXJ0QmVmb3JlT3AuY2xhc3MsIGkpOworICAgICAgICBBTlRMUkhhc2hNYXAgKmluc2VydHMgPSBbc2VsZiBnZXRLaW5kT2ZPcHM6cmV3cml0ZXMgS2luZE9mQ2xhc3M6W0FOVExSSW5zZXJ0QmVmb3JlT3AgY2xhc3NdIEluZGV4OmldOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFtpbnNlcnRzIHNpemVdOyBqKyspIHsKKyAgICAgICAgICAgIEFOVExSSW5zZXJ0QmVmb3JlT3AgKmlvcCA9IChBTlRMUkluc2VydEJlZm9yZU9wICopW2luc2VydHMgb2JqZWN0QXRJbmRleDpqXTsKKyAgICAgICAgICAgIGlmICggaW9wLnJ3SW5kZXggPj0gcm9wLnJ3SW5kZXggJiYgaW9wLnJ3SW5kZXggPD0gcm9wLmxhc3RJbmRleCApIHsKKyAgICAgICAgICAgICAgICAvLyBkZWxldGUgaW5zZXJ0IGFzIGl0J3MgYSBuby1vcC4KKyAgICAgICAgICAgICAgICBbcmV3cml0ZXMgaW5zZXJ0T2JqZWN0Om5pbCBhdEluZGV4OmlvcC5pbnN0cnVjdGlvbkluZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBEcm9wIGFueSBwcmlvciByZXBsYWNlcyBjb250YWluZWQgd2l0aGluCisgICAgICAgIEFOVExSSGFzaE1hcCAqcHJldlJlcGxhY2VzID0gW3NlbGYgZ2V0S2luZE9mT3BzOnJld3JpdGVzIEtpbmRPZkNsYXNzOltBTlRMUlJlcGxhY2VPcCBjbGFzc10gSW5kZXg6aV07CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgW3ByZXZSZXBsYWNlcyBjb3VudF07IGorKykgeworICAgICAgICAgICAgQU5UTFJSZXBsYWNlT3AgKnByZXZSb3AgPSAoQU5UTFJSZXBsYWNlT3AgKikgW3ByZXZSZXBsYWNlcyBvYmplY3RBdEluZGV4OmpdOworICAgICAgICAgICAgaWYgKCBwcmV2Um9wLnJ3SW5kZXg+PXJvcC5yd0luZGV4ICYmIHByZXZSb3AubGFzdEluZGV4IDw9IHJvcC5sYXN0SW5kZXggKSB7CisgICAgICAgICAgICAgICAgLy8gZGVsZXRlIHJlcGxhY2UgYXMgaXQncyBhIG5vLW9wLgorICAgICAgICAgICAgICAgIFtyZXdyaXRlcyBzZXRPYmplY3Q6bmlsIGF0SW5kZXg6cHJldlJvcC5pbnN0cnVjdGlvbkluZGV4XTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRocm93IGV4Y2VwdGlvbiB1bmxlc3MgZGlzam9pbnQgb3IgaWRlbnRpY2FsCisgICAgICAgICAgICBCT09MIGRpc2pvaW50ID0gcHJldlJvcC5sYXN0SW5kZXg8cm9wLnJ3SW5kZXggfHwgcHJldlJvcC5yd0luZGV4ID4gcm9wLmxhc3RJbmRleDsKKyAgICAgICAgICAgIEJPT0wgc2FtZSA9IHByZXZSb3AucndJbmRleD09cm9wLnJ3SW5kZXggJiYgcHJldlJvcC5sYXN0SW5kZXg9PXJvcC5sYXN0SW5kZXg7CisgICAgICAgICAgICBpZiAoICFkaXNqb2ludCAmJiAhc2FtZSApIHsKKyAgICAgICAgICAgICAgICBAdGhyb3cgW0FOVExSSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAicmVwbGFjZSBvcCBib3VuZGFyaWVzIG9mICVALCBvdmVybGFwIHdpdGggcHJldmlvdXMgJUBcbiIsIHJvcCwgcHJldlJvcF1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIFdBTEsgSU5TRVJUUworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgW3Jld3JpdGVzIGNvdW50XTsgaSsrKSB7CisgICAgICAgIEFOVExSUmV3cml0ZU9wZXJhdGlvbiAqb3AgPSAoQU5UTFJSZXdyaXRlT3BlcmF0aW9uICopW3Jld3JpdGVzIG9iamVjdEF0SW5kZXg6aV07CisgICAgICAgIGlmICggb3AgPT0gbmlsICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoICEoW1tvcCBjbGFzc10gaXNLaW5kT2ZDbGFzczpbQU5UTFJJbnNlcnRCZWZvcmVPcCBjbGFzc11dKSApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgQU5UTFJJbnNlcnRCZWZvcmVPcCAqaW9wID0gKEFOVExSSW5zZXJ0QmVmb3JlT3AgKilbcmV3cml0ZXMgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgLy8gY29tYmluZSBjdXJyZW50IGluc2VydCB3aXRoIHByaW9yIGlmIGFueSBhdCBzYW1lIHJ3SW5kZXgKKyAgICAgICAgQU5UTFJIYXNoTWFwICpwcmV2SW5zZXJ0cyA9IChBTlRMUkhhc2hNYXAgKilbc2VsZiBnZXRLaW5kT2ZPcHM6cmV3cml0ZXMgS2luZE9mQ2xhc3M6W0FOVExSSW5zZXJ0QmVmb3JlT3AgY2xhc3NdIEluZGV4OmldOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IFtwcmV2SW5zZXJ0cyBjb3VudF07IGorKykgeworICAgICAgICAgICAgQU5UTFJJbnNlcnRCZWZvcmVPcCAqcHJldklvcCA9IChBTlRMUkluc2VydEJlZm9yZU9wICopIFtwcmV2SW5zZXJ0cyBvYmplY3RBdEluZGV4OmpdOworICAgICAgICAgICAgaWYgKCBwcmV2SW9wLnJ3SW5kZXggPT0gaW9wLnJ3SW5kZXggKSB7IC8vIGNvbWJpbmUgb2JqZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBzdHJpbmdzLi4ud2UncmUgaW4gcHJvY2VzcyBvZiB0b1N0cmluZydpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob2xlIHRva2VuIGJ1ZmZlciBzbyBubyBsYXp5IGV2YWwgaXNzdWUgd2l0aCBhbnkgdGVtcGxhdGVzCisgICAgICAgICAgICAgICAgaW9wLnRleHQgPSBbc2VsZiBjYXRPcFRleHQ6aW9wLnRleHQgUHJldlRleHQ6cHJldklvcC50ZXh0XTsKKyAgICAgICAgICAgICAgICAvLyBkZWxldGUgcmVkdW5kYW50IHByaW9yIGluc2VydAorICAgICAgICAgICAgICAgIFtyZXdyaXRlcyBzZXRPYmplY3Q6bmlsIGF0SW5kZXg6cHJldklvcC5pbnN0cnVjdGlvbkluZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBsb29rIGZvciByZXBsYWNlcyB3aGVyZSBpb3AucndJbmRleCBpcyBpbiByYW5nZTsgZXJyb3IKKyAgICAgICAgQU5UTFJIYXNoTWFwICpwcmV2UmVwbGFjZXMgPSAoQU5UTFJIYXNoTWFwICopW3NlbGYgZ2V0S2luZE9mT3BzOnJld3JpdGVzIEtpbmRPZkNsYXNzOltBTlRMUlJlcGxhY2VPcCBjbGFzc10gSW5kZXg6aV07CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgW3ByZXZSZXBsYWNlcyBjb3VudF07IGorKykgeworICAgICAgICAgICAgQU5UTFJSZXBsYWNlT3AgKnJvcCA9IChBTlRMUlJlcGxhY2VPcCAqKSBbcHJldlJlcGxhY2VzIG9iamVjdEF0SW5kZXg6al07CisgICAgICAgICAgICBpZiAoIGlvcC5yd0luZGV4ID09IHJvcC5yd0luZGV4ICkgeworICAgICAgICAgICAgICAgIHJvcC50ZXh0ID0gW3NlbGYgY2F0T3BUZXh0OmlvcC50ZXh0IFByZXZUZXh0OnJvcC50ZXh0XTsKKyAgICAgICAgICAgICAgICBbcmV3cml0ZXMgc2V0T2JqZWN0Om5pbCBhdEluZGV4OmldOyAgLy8gZGVsZXRlIGN1cnJlbnQgaW5zZXJ0CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGlvcC5yd0luZGV4ID49IHJvcC5yd0luZGV4ICYmIGlvcC5yd0luZGV4IDw9IHJvcC5sYXN0SW5kZXggKSB7CisgICAgICAgICAgICAgICAgQHRocm93IFtBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJpbnNlcnQgb3AgJWQgd2l0aGluIGJvdW5kYXJpZXMgb2YgcHJldmlvdXMgJWQiLCBpb3AsIHJvcF1dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmV3cml0ZXMgYWZ0ZXI9IityZXdyaXRlcyk7CisgICAgQU5UTFJIYXNoTWFwICptID0gW0FOVExSSGFzaE1hcCBuZXdBTlRMUkhhc2hNYXBXaXRoTGVuOjE1XTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFtyZXdyaXRlcyBjb3VudF07IGkrKykgeworICAgICAgICBBTlRMUlJld3JpdGVPcGVyYXRpb24gKm9wID0gKEFOVExSUmV3cml0ZU9wZXJhdGlvbiAqKVtyZXdyaXRlcyBvYmplY3RBdEluZGV4OmldOworICAgICAgICBpZiAoIG9wID09IG5pbCApCisgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGRlbGV0ZWQgb3BzCisgICAgICAgIGlmICggW20gb2JqZWN0QXRJbmRleDpvcC5yd0luZGV4XSAhPSBuaWwgKSB7CisgICAgICAgICAgICBAdGhyb3cgW0FOVExSUnVudGltZUV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJzaG91bGQgb25seSBiZSBvbmUgb3AgcGVyIHJ3SW5kZXhcbiJdOworICAgICAgICB9CisgICAgICAgIC8vW20gcHV0KG5ldyBJbnRlZ2VyKG9wLnJ3SW5kZXgpLCBvcCk7CisgICAgICAgIFttIHNldE9iamVjdDpvcCBhdEluZGV4Om9wLnJ3SW5kZXhdOworICAgIH0KKyAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicndJbmRleCB0byBvcDogIittKTsKKyAgICBpZiAoZGVidWcgPiAxKSBOU0xvZyhAInJ3SW5kZXggdG8gIG9wICVkXG4iLCAoTlNJbnRlZ2VyKW0pOworICAgIHJldHVybiBtOworfQorCistIChOU1N0cmluZyAqKWNhdE9wVGV4dDooaWQpYSBQcmV2VGV4dDooaWQpYgoreworICAgIE5TU3RyaW5nICp4ID0gQCIiOworICAgIE5TU3RyaW5nICp5ID0gQCIiOworICAgIGlmICggYSAhPSBuaWwgKQorICAgICAgICB4ID0gW2EgdG9TdHJpbmddOworICAgIGlmICggYiAhPSBuaWwgKQorICAgICAgICB5ID0gW2IgdG9TdHJpbmddOworICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVAJUAiLHgsIHldOworfQorCistIChBTlRMUkhhc2hNYXAgKilnZXRLaW5kT2ZPcHM6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzIEtpbmRPZkNsYXNzOihDbGFzcylraW5kCit7CisgICAgcmV0dXJuIFtzZWxmIGdldEtpbmRPZk9wczpyZXdyaXRlcyBLaW5kT2ZDbGFzczpraW5kIEluZGV4OltyZXdyaXRlcyBjb3VudF1dOworfQorCisvKiogR2V0IGFsbCBvcGVyYXRpb25zIGJlZm9yZSBhbiByd0luZGV4IG9mIGEgcGFydGljdWxhciBraW5kICovCistIChBTlRMUkhhc2hNYXAgKilnZXRLaW5kT2ZPcHM6KEFOVExSSGFzaE1hcCAqKXJld3JpdGVzIEtpbmRPZkNsYXNzOihDbGFzcylraW5kIEluZGV4OihOU0ludGVnZXIpYmVmb3JlCit7CisgICAgQU5UTFJIYXNoTWFwICpvcHMgPSBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcFdpdGhMZW46MTVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmVmb3JlICYmIGkgPCBbcmV3cml0ZXMgY291bnRdOyBpKyspIHsKKyAgICAgICAgQU5UTFJSZXdyaXRlT3BlcmF0aW9uICpvcCA9IChBTlRMUlJld3JpdGVPcGVyYXRpb24gKilbcmV3cml0ZXMgb2JqZWN0QXRJbmRleDppXTsKKyAgICAgICAgaWYgKCBvcCA9PSBuaWwgKQorICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSBkZWxldGVkCisgICAgICAgIGlmICggW29wIGlzS2luZE9mQ2xhc3M6KENsYXNzKWtpbmRdICkKKyAgICAgICAgICAgIFtvcHMgYWRkT2JqZWN0Om9wXTsKKyAgICB9CQkKKyAgICByZXR1cm4gb3BzOworfQorCistIChOU011dGFibGVTdHJpbmcgKil0b0RlYnVnU3RyaW5nCit7CisgICAgcmV0dXJuIFtzZWxmIHRvRGVidWdTdHJpbmdGcm9tU3RhcnQ6TUlOX1RPS0VOX0lOREVYIFRvRW5kOlt0b2tlbnMgY291bnRdLTFdOworfQorCistIChOU011dGFibGVTdHJpbmcgKil0b0RlYnVnU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpc3RhcnQgVG9FbmQ6KE5TSW50ZWdlcillbmQKK3sKKyAgICBOU011dGFibGVTdHJpbmcgKmJ1ZiA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aENhcGFjaXR5OjEwMF07CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpID49IE1JTl9UT0tFTl9JTkRFWCAmJiBpIDw9IGVuZCAmJiBpIDwgW3Rva2VucyBjb3VudF07IGkrKykgeworICAgICAgICBbYnVmIGFwcGVuZFN0cmluZzpbW3Rva2VucyBvYmplY3RBdEluZGV4OmldIHRleHRdXTsKKyAgICB9CisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoU3RyaW5nOmJ1Zl07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5Tb3VyY2UuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5Tb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTFmYTJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUb2tlblNvdXJjZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKworLy8gQW55dGhpbmcgdGhhdCByZXNwb25kcyB0byAtbmV4dFRva2VuIGNhbiBiZSB0cmVhdGVkIGFzIGEgbGV4ZXIuCisvLyBGb3IgaW5zdGFuY2UgdGhpcyBjYW4gYmUgYSBmbGV4IGxleGVyIG9yIGEgaGFuZHdyaXR0ZW4gb25lIG9yIGV2ZW4KKy8vIGEgcHJveHkgZm9yIGEgcmVtb3RlbHkgcnVubmluZyB0b2tlbiBzb3VyY2UgKGRhdGFiYXNlLCBsZXhlciwgd2hhdGV2ZXIpLgorQHByb3RvY29sIEFOVExSVG9rZW5Tb3VyY2UgPE5TT2JqZWN0LCBOU0NvcHlpbmc+CisKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW47CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVG9rZW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA0NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUb2tlblN0cmVhbS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisKKyNpbXBvcnQgIkFOVExSSW50U3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuLmgiCisKK0Bwcm90b2NvbCBBTlRMUlRva2VuU3RyZWFtIDwgQU5UTFJJbnRTdHJlYW0gPgorCisvLyBHZXQgVG9rZW4gYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBUb2tlbi4KKy8vIGk8MCBpbmRpY2F0ZXMgdG9rZW5zIGluIHRoZSBwYXN0LiAgU28gLTEgaXMgcHJldmlvdXMgdG9rZW4gYW5kIC0yIGlzCisvLyB0d28gdG9rZW5zIGFnby4gTFQ6MCBpcyB1bmRlZmluZWQuICBGb3IgaT49biwgcmV0dXJuIFRva2VuLkVPRlRva2VuLgorLy8gUmV0dXJuIG51bGwgZm9yIExUOjAgYW5kIGFueSBpbmRleCB0aGF0IHJlc3VsdHMgaW4gYW4gYWJzb2x1dGUgYWRkcmVzcworLy8gdGhhdCBpcyBuZWdhdGl2ZS4KKworLSAoaWQ8QU5UTFJUb2tlbj4pIExUOihOU0ludGVnZXIpIGk7CisKKy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooTlNVSW50ZWdlcikgaTsKKworLSAoaWQpIGdldFRva2VuU291cmNlOworCistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy8qKiBSZXR1cm4gdGhlIHRleHQgb2YgYWxsIHRva2VucyBmcm9tIHN0YXJ0IHRvIHN0b3AsIGluY2x1c2l2ZS4KKyAqICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIHRva2VucyB0aGVuIGl0IGNhbiBqdXN0CisgKiAgcmV0dXJuICIiIG9yIG51bGw7ICBVc2VycyBzaG91bGQgbm90IGFjY2VzcyAkcnVsZUxhYmVsLnRleHQgaW4KKyAqICBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKyAqLworLSAoTlNTdHJpbmcgKil0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKXN0YXJ0SWR4IFRvRW5kOihOU0ludGVnZXIpc3RvcElkeDsKKworLyoqIEJlY2F1c2UgdGhlIHVzZXIgaXMgbm90IHJlcXVpcmVkIHRvIHVzZSBhIHRva2VuIHdpdGggYW4gaW5kZXggc3RvcmVkCisgKiAgaW4gaXQsIHdlIG11c3QgcHJvdmlkZSBhIG1lYW5zIGZvciB0d28gdG9rZW4gb2JqZWN0cyB0aGVtc2VsdmVzIHRvCisgKiAgaW5kaWNhdGUgdGhlIHN0YXJ0L2VuZCBsb2NhdGlvbi4gIE1vc3Qgb2Z0ZW4gdGhpcyB3aWxsIGp1c3QgZGVsZWdhdGUKKyAqICB0byB0aGUgb3RoZXIgdG9TdHJpbmcoaW50LGludCkuICBUaGlzIGlzIGFsc28gcGFyYWxsZWwgd2l0aAorICogIHRoZSBUcmVlTm9kZVN0cmVhbS50b1N0cmluZyhPYmplY3QsT2JqZWN0KS4KKyAqLworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KXN0YXJ0VG9rZW4gVG9Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RvcFRva2VuOworCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmNjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2lmbmRlZiBERUJVR19ERUFMTE9DCisjZGVmaW5lIERFQlVHX0RFQUxMT0MKKyNlbmRpZgorCisjaW1wb3J0ICJBTXV0YWJsZUFycmF5LmgiCisKK0Bwcm90b2NvbCBBTlRMUlRyZWUgPCBOU09iamVjdCwgTlNDb3B5aW5nID4KKworLy8rIChpZDxBTlRMUlRyZWU+KSBpbnZhbGlkTm9kZTsKKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpaW5kZXg7CistIChOU1VJbnRlZ2VyKSBnZXRDaGlsZENvdW50OworCisvLyBUcmVlIHRyYWNrcyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IG5vdyA+IDMuMAorCistIChpZDxBTlRMUlRyZWU+KWdldFBhcmVudDsKKworLSAodm9pZCkgc2V0UGFyZW50OihpZDxBTlRMUlRyZWU+KXQ7CisKKy8qKiBJcyB0aGVyZSBpcyBhIG5vZGUgYWJvdmUgd2l0aCB0b2tlbiB0eXBlIHR0eXBlPyAqLworLSAoQk9PTCkgaGFzQW5jZXN0b3I6KE5TSW50ZWdlcil0dHlwZTsKKworLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0QW5jZXN0b3I6KE5TSW50ZWdlcikgdHR5cGU7CisKKy8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAqICBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KKyAqLworLSAoQU11dGFibGVBcnJheSAqKSBnZXRBbmNlc3RvcnM7CisKKy8qKiBUaGlzIG5vZGUgaXMgd2hhdCBjaGlsZCBpbmRleD8gMC4ubi0xICovCistIChOU0ludGVnZXIpIGdldENoaWxkSW5kZXg7CisKKy0gKHZvaWQpIHNldENoaWxkSW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CisKKy8qKiBTZXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggdmFsdWVzIGZvciBhbGwgY2hpbGRyZW4gKi8KKy0gKHZvaWQpIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXM7CisKKy8qKiBBZGQgdCBhcyBhIGNoaWxkIHRvIHRoaXMgbm9kZS4gIElmIHQgaXMgbnVsbCwgZG8gbm90aGluZy4gIElmIHQKKyAqICBpcyBuaWwsIGFkZCBhbGwgY2hpbGRyZW4gb2YgdCB0byB0aGlzJyBjaGlsZHJlbi4KKyAqLworLSAodm9pZCkgYWRkQ2hpbGQ6KGlkPEFOVExSVHJlZT4pIHQ7CisKKy8qKiBTZXQgaXRoIGNoaWxkICgwLi5uLTEpIHRvIHQ7IHQgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLW5pbCBub2RlICovCistICh2b2lkKSBzZXRDaGlsZDooTlNJbnRlZ2VyKWkgV2l0aDooaWQ8QU5UTFJUcmVlPikgdDsKKworLSAoaWQpIGRlbGV0ZUNoaWxkOihOU0ludGVnZXIpIGk7CisKKy8qKiBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKyAqICBhIGxpc3QgKG5pbC1yb290IHRyZWUpLiAgbnVtIG9mIGNoaWxkcmVuIGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZS4KKyAqICBGb3IgaHVnZSBjaGlsZCBsaXN0cywgaW5zZXJ0aW5nIGNoaWxkcmVuIGNhbiBmb3JjZSB3YWxraW5nIHJlc3Qgb2YKKyAqICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAqLworLSAodm9pZCkgcmVwbGFjZUNoaWxkcmVuRnJvbTooTlNJbnRlZ2VyKXN0YXJ0Q2hpbGRJbmRleCBUbzooTlNJbnRlZ2VyKXN0b3BDaGlsZEluZGV4IFdpdGg6KGlkKXQ7CQorCistIChOU0FycmF5ICopIGNoaWxkcmVuOworLy8gQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisvLyAgaXMgbmlsLCBhZGQgYWxsIGNoaWxkcmVuIG9mIHQgdG8gdGhpcycgY2hpbGRyZW4uCisKKy0gKHZvaWQpIGFkZENoaWxkcmVuOihOU0FycmF5ICopIHRoZUNoaWxkcmVuOworLy8tICh2b2lkKSByZW1vdmVBbGxDaGlsZHJlbjsKKworLy8gSW5kaWNhdGVzIHRoZSBub2RlIGlzIGEgbmlsIG5vZGUgYnV0IG1heSBzdGlsbCBoYXZlIGNoaWxkcmVuLCBtZWFuaW5nCisvLyB0aGUgdHJlZSBpcyBhIGZsYXQgbGlzdC4KKworLSAoQk9PTCkgaXNOaWw7CisKKy8qKiAgV2hhdCBpcyB0aGUgc21hbGxlc3QgdG9rZW4gaW5kZXggKGluZGV4aW5nIGZyb20gMCkgZm9yIHRoaXMgbm9kZQorICogICBhbmQgaXRzIGNoaWxkcmVuPworICovCistIChOU0ludGVnZXIpIGdldFRva2VuU3RhcnRJbmRleDsKKworLSAodm9pZCkgc2V0VG9rZW5TdGFydEluZGV4OihOU0ludGVnZXIpIGluZGV4OworCisvKiogIFdoYXQgaXMgdGhlIGxhcmdlc3QgdG9rZW4gaW5kZXggKGluZGV4aW5nIGZyb20gMCkgZm9yIHRoaXMgbm9kZQorICogICBhbmQgaXRzIGNoaWxkcmVuPworICovCistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OworLSAodm9pZCkgc2V0VG9rZW5TdG9wSW5kZXg6KE5TSW50ZWdlcikgaW5kZXg7CisKKy0gKGlkPEFOVExSVHJlZT4pIGR1cE5vZGU7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nOworCisjcHJhZ21hIG1hcmsgQ29weWluZworLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopYVpvbmU7CS8vIHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzIGFyZSBub3QgY29waWVkIGhlcmUhCistIChpZCkgZGVlcENvcHk7CQkJCQkvLyBwZXJmb3JtcyBhIGRlZXBDb3B5V2l0aFpvbmU6IHdpdGggdGhlIGRlZmF1bHQgem9uZQorLSAoaWQpIGRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKWFab25lOworCisjcHJhZ21hIG1hcmsgVHJlZSBQYXJzZXIgc3VwcG9ydAorLSAoTlNJbnRlZ2VyKXR5cGU7CistIChOU1N0cmluZyAqKXRleHQ7CisvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU1VJbnRlZ2VyKWxpbmU7CistIChOU1VJbnRlZ2VyKWNoYXJQb3NpdGlvbkluTGluZTsKKy0gKHZvaWQpIHNldENoYXJQb3NpdGlvbkluTGluZTooTlNVSW50ZWdlcilwb3M7CisKKyNwcmFnbWEgbWFyayBJbmZvcm1hdGlvbmFsCistIChOU1N0cmluZyAqKSB0cmVlRGVzY3JpcHRpb247CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbjsKKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWUubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOWVkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWUubQpAQCAtMCwwICsxLDE0OSBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKy8vIFRPRE86IHRoaXMgc2hvdWxkbid0IGJlIGhlcmUuLi5idXQgbmVlZGVkIGZvciBpbnZhbGlkTm9kZQorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlRyZWUKKworQHN5bnRoZXNpemUgaXNFbXB0eTsKK0BzeW50aGVzaXplIGlzRW1wdHlOb2RlOworQHN5bnRoZXNpemUgaW52YWxpZE5vZGU7CitAc3ludGhlc2l6ZSBjaGlsZHJlbjsKKworI3ByYWdtYSBtYXJrIEFOVExSVHJlZSBwcm90b2NvbCBjb25mb3JtYW5jZQorCisrIChpZDxBTlRMUlRyZWU+KSBpbnZhbGlkTm9kZQoreworCXN0YXRpYyBpZDxBTlRMUlRyZWU+IGludmFsaWROb2RlID0gbmlsOworCWlmICghaW52YWxpZE5vZGUpIHsKKwkJaW52YWxpZE5vZGUgPSBbW0FOVExSQ29tbW9uVHJlZSBhbGxvY10gaW5pdFdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkXTsKKwl9CisJcmV0dXJuIGludmFsaWROb2RlOworfQorCistIChpZDxBTlRMUlRyZWU+KSBpbml0Cit7CisJc2VsZiA9IFtzdXBlciBpbml0XTsKKwlpZiAoIHNlbGYgIT0gbmlsICkgeworCQlpc0VtcHR5Tm9kZSA9IE5POworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoaWQ8QU5UTFJUcmVlPikgZ2V0Q2hpbGQ6KE5TVUludGVnZXIpIGluZGV4Cit7CisJcmV0dXJuIG5pbDsKK30KKworLSAoTlNVSW50ZWdlcikgZ2V0Q2hpbGRDb3VudAoreworCXJldHVybiAwOworfQorCistIChOU0FycmF5ICopIGdldENoaWxkcmVuCit7CisJcmV0dXJuIG5pbDsKK30KKworCS8vIEFkZCB0cmVlIGFzIGEgY2hpbGQgdG8gdGhpcyBub2RlLiAgSWYgdHJlZSBpcyBuaWwsIGRvIG5vdGhpbmcuICBJZiB0cmVlCisJLy8gaXMgYW4gZW1wdHkgbm9kZSwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0cmVlIHRvIG91ciBjaGlsZHJlbi4KKworLSAodm9pZCkgYWRkQ2hpbGQ6KGlkPEFOVExSVHJlZT4pIHRyZWUKK3sKK30KKworLSAodm9pZCkgYWRkQ2hpbGRyZW46KE5TQXJyYXkgKikgdGhlQ2hpbGRyZW4KK3sKK30KKworLSAodm9pZCkgcmVtb3ZlQWxsQ2hpbGRyZW4KK3sKK30KKworCS8vIEluZGljYXRlcyB0aGUgbm9kZSBpcyBhbiBlbXB0eSBub2RlIGJ1dCBtYXkgc3RpbGwgaGF2ZSBjaGlsZHJlbiwgbWVhbmluZworCS8vIHRoZSB0cmVlIGlzIGEgZmxhdCBsaXN0LgorCistIChCT09MKSBpc0VtcHR5Cit7CisJcmV0dXJuIGlzRW1wdHlOb2RlOworfQorCistICh2b2lkKSBzZXRJc0VtcHR5OihCT09MKWVtcHR5RmxhZworeworCWlzRW1wdHlOb2RlID0gZW1wdHlGbGFnOworfQorCisjcHJhZ21hIG1hcmsgQU5UTFJUcmVlIGFic3RyYWN0IGJhc2UgY2xhc3MKKworCS8vIFJldHVybiBhIHRva2VuIHR5cGU7IG5lZWRlZCBmb3IgdHJlZSBwYXJzaW5nCistIChOU0ludGVnZXIpIGdldFR5cGUKK3sKKwlyZXR1cm4gMDsKK30KKworLSAoTlNTdHJpbmcgKikgZ2V0VGV4dAoreworCXJldHVybiBbc2VsZiBkZXNjcmlwdGlvbl07Cit9CisKKwkvLyBJbiBjYXNlIHdlIGRvbid0IGhhdmUgYSB0b2tlbiBwYXlsb2FkLCB3aGF0IGlzIHRoZSBsaW5lIGZvciBlcnJvcnM/CistIChOU0ludGVnZXIpIGdldExpbmUKK3sKKwlyZXR1cm4gMDsKK30KKworLSAoTlNJbnRlZ2VyKSBnZXRDaGFyUG9zaXRpb25JbkxpbmUKK3sKKwlyZXR1cm4gMDsKK30KKworLSAoTlNTdHJpbmcgKikgdHJlZURlc2NyaXB0aW9uCit7CisJcmV0dXJuIEAiIjsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKwlyZXR1cm4gQCIiOworfQorCistICh2b2lkKSBfY3JlYXRlQ2hpbGRyZW5MaXN0Cit7CisJaWYgKCBjaGlsZHJlbiA9PSBuaWwgKQorCQljaGlsZHJlbiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworfQorCitAZW5kCisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVBZGFwdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVBZGFwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkOTRlMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IuaApAQCAtMCwwICsxLDE1NyBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSQmFzZVRyZWUuaCIKKyNpbXBvcnQgIkFOVExSVG9rZW5TdHJlYW0uaCIKKworI3ByYWdtYSB3YXJuaW5nIHRyZWUvbm9kZSBkaWN0aW9uIGlzIGJyb2tlbi4KKworQHByb3RvY29sIEFOVExSVHJlZUFkYXB0b3IgPE5TT2JqZWN0LCBOU0NvcHlpbmc+CisKKyNwcmFnbWEgbWFyayBDb25zdHJ1Y3Rpb24KKworI3ByYWdtYSBtYXJrIEFOVExSVHJlZUFkYXB0b3IgaW1wbGVtZW50YXRpb24KKy0gKGlkKWR1cE5vZGU6KGlkKWFOb2RlOwkvLyBjb3BpZXMganVzdCB0aGUgbm9kZQorLSAoaWQpZHVwVHJlZTooaWQpYVRyZWU7CS8vIGNvcGllcyB0aGUgZW50aXJlIHN1YnRyZWUsIHJlY3Vyc2l2ZWx5CisKKy8qKiBSZXR1cm4gYSBuaWwgbm9kZSAoYW4gZW1wdHkgYnV0IG5vbi1udWxsIG5vZGUpIHRoYXQgY2FuIGhvbGQKKyAqICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICogIHVzZSAidD1hZGFwdG9yLm5pbCgpOyB0LmFkZENoaWxkKHgpOyB0LmFkZENoaWxkKHkpOyIKKyAqLworLSAoaWQpIGVtcHR5Tm9kZTsKKworLyoqIFJldHVybiBhIHRyZWUgbm9kZSByZXByZXNlbnRpbmcgYW4gZXJyb3IuICBUaGlzIG5vZGUgcmVjb3JkcyB0aGUKKyAqICB0b2tlbnMgY29uc3VtZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5LiAgVGhlIHN0YXJ0IHRva2VuIGluZGljYXRlcyB0aGUKKyAqICBpbnB1dCBzeW1ib2wgYXQgd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gIFRoZSBzdG9wIHRva2VuIGluZGljYXRlcworICogIHRoZSBsYXN0IHN5bWJvbCBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGlucHV0IHN0cmVhbSBzbyB0aGF0IHRoZSBlcnJvbmVvdXMgdGV4dCBjYW4KKyAqICBiZSBwYWNrYWdlZCB1cCBpbiB0aGUgZXJyb3Igbm9kZS4gIFRoZSBleGNlcHRpb24gY291bGQgYmUgdXNlZnVsCisgKiAgdG8gc29tZSBhcHBsaWNhdGlvbnM7IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc3RvcmVzIHB0ciB0byBpdCBpbgorICogIHRoZSBDb21tb25FcnJvck5vZGUuCisgKgorICogIFRoaXMgb25seSBtYWtlcyBzZW5zZSBkdXJpbmcgdG9rZW4gcGFyc2luZywgbm90IHRyZWUgcGFyc2luZy4KKyAqICBUcmVlIHBhcnNpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gcGFyc2luZyBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24KKyAqICBzdWNjZWVkLgorICovCistIChpZCkgZXJyb3JOb2RlOihpZDxBTlRMUlRva2VuU3RyZWFtPilhbklucHV0CisgICAgICAgICAgICBGcm9tOihpZDxBTlRMUlRva2VuPilhU3RhcnRUb2tlbgorICAgICAgICAgICAgICBUbzooaWQ8QU5UTFJUb2tlbj4pYVN0b3BUb2tlbgorICAgICAgIEV4Y2VwdGlvbjooTlNFeGNlcHRpb24gKikgZTsKKworLyoqIElzIHRyZWUgY29uc2lkZXJlZCBhIG5pbCBub2RlIHVzZWQgdG8gbWFrZSBsaXN0cyBvZiBjaGlsZCBub2Rlcz8gKi8KKy0gKEJPT0wpIGlzTmlsOihpZClhVHJlZTsKKworCistICh2b2lkKSBhZGRDaGlsZDooaWQpY2hpbGQgdG9UcmVlOihpZClhVHJlZTsKKworLyoqIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgKiAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAqICAgIG9sZD1eKGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBeKGEgYiBjKSkKKyAqCisgKiAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgKiAgY2hpbGQgYXMgdGhlIG5ldyByb290IG5vZGUuCisgKgorICogICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgKiAgICBvbGQ9XihhIGIgYyksIG5ldz1eKG5pbCByKSB5aWVsZHMgXihyIF4oYSBiIGMpKQorICoKKyAqICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKyAqCisgKiAgICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAqICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisgKgorICogIFJldHVybiBuZXdSb290LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIG5ld1Jvb3QgaXMgbm90IGEKKyAqICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgKiAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKyAqCisgKiAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgKiAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAqICBjb25zdHJ1Y3RpbmcgdGhlc2Ugbm9kZXMgc28gd2Ugc2hvdWxkIGhhdmUgdGhpcyBjb250cm9sIGZvcgorICogIGVmZmljaWVuY3kuCisgKi8KKy0gKGlkKSBiZWNvbWVSb290OihpZCluZXdSb290IG9sZDooaWQpb2xkUm9vdDsKKworLSAoaWQpIHJ1bGVQb3N0UHJvY2Vzc2luZzooaWQpcm9vdDsKKworI3ByYWdtYSBtYXJrIFJld3JpdGUgUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLSAoTlNVSW50ZWdlcikgZ2V0VW5pcXVlSUQ6KGlkKWFOb2RlOworCistIChpZCkgY3JlYXRlOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworLSAoaWQpIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilmcm9tVG9rZW47CistIChpZCkgY3JlYXRlVHJlZTooTlNJbnRlZ2VyKXRva2VuVHlwZSBGcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWZyb21Ub2tlbiBUZXh0OihOU1N0cmluZyAqKXRleHQ7CistIChpZCkgY3JlYXRlVHJlZTooTlNJbnRlZ2VyKXRva2VuVHlwZSBUZXh0OihOU1N0cmluZyAqKXRleHQ7CisKKyNwcmFnbWEgbWFyayBDb250ZW50CisKKy0gKGlkKWR1cE5vZGU6KGlkKWFOb2RlOworLSAoaWQpZHVwVHJlZTooaWQpYVRyZWU7CisKKy0gKE5TSW50ZWdlcikgZ2V0VHlwZTooaWQpYU5vZGU7CistICh2b2lkKSBzZXRUeXBlOihpZClhTm9kZSBUeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworCistIChOU1N0cmluZyAqKSBnZXRUZXh0OihpZClhTm9kZTsKKy0gKHZvaWQpIHNldFRleHQ6KGlkKWFOb2RlIFRleHQ6KE5TU3RyaW5nICopdG9rZW5UZXh0OworCisvLy0gKGlkPEFOVExSVG9rZW4+KSBnZXRUb2tlbjooaWQpdDsKKworLSAodm9pZCkgc2V0VG9rZW5Cb3VuZGFyaWVzOihpZClhVHJlZSBGcm9tOihpZDxBTlRMUlRva2VuPilzdGFydFRva2VuIFRvOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW47CistIChOU0ludGVnZXIpIGdldFRva2VuU3RhcnRJbmRleDooaWQpYVRyZWU7CistIChOU0ludGVnZXIpIGdldFRva2VuU3RvcEluZGV4OihpZClhVHJlZTsKKworI3ByYWdtYSBtYXJrIE5hdmlnYXRpb24gLyBUcmVlIFBhcnNpbmcKKworLyoqIEdldCBhIGNoaWxkIDAuLm4tMSBub2RlICovCistIChpZCkgZ2V0Q2hpbGQ6KGlkKWFOb2RlIEF0OihOU0ludGVnZXIpIGk7CisvKiogU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSAqLworLSAodm9pZCkgc2V0Q2hpbGQ6KGlkKWFUcmVlIEF0OihOU0ludGVnZXIpaW5kZXggQ2hpbGQ6KGlkKWNoaWxkOworLyoqIFJlbW92ZSBpdGggY2hpbGQgYW5kIHNoaWZ0IGNoaWxkcmVuIGRvd24gZnJvbSByaWdodC4gKi8KKy0gKGlkKSBkZWxldGVDaGlsZDooaWQpdCBJbmRleDooTlNJbnRlZ2VyKWluZGV4OworCisvKiogSG93IG1hbnkgY2hpbGRyZW4/ICBJZiAwLCB0aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUgKi8KKy0gKE5TSW50ZWdlcikgZ2V0Q2hpbGRDb3VudDooaWQpIGFUcmVlOworCisvKiogV2hvIGlzIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGlzIG5vZGU7IGlmIG51bGwsIGltcGxpZXMgbm9kZSBpcyByb290LgorICogIElmIHlvdXIgbm9kZSB0eXBlIGRvZXNuJ3QgaGFuZGxlIHRoaXMsIGl0J3Mgb2sgYnV0IHRoZSB0cmVlIHJld3JpdGVzCisgKiAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICovCistIChpZClnZXRQYXJlbnQ6KGlkKXQ7CistICh2b2lkKSBzZXRQYXJlbnQ6KGlkKXQgV2l0aDooaWQpcGFyZW50OworCisvKiogV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAqICBJZiB5b3VyIG5vZGUgdHlwZSBkb2Vzbid0IGhhbmRsZSB0aGlzLCBpdCdzIG9rIGJ1dCB0aGUgdHJlZSByZXdyaXRlcworICogIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAqLworLSAoTlNJbnRlZ2VyKSBnZXRDaGlsZEluZGV4OihpZCl0OworLSAodm9pZCkgc2V0Q2hpbGRJbmRleDooaWQpdCBXaXRoOihOU0ludGVnZXIpaW5kZXg7CisKKy0gKHZvaWQpIHJlcGxhY2VDaGlsZHJlbjooaWQpcGFyZW50IEZyb206KE5TSW50ZWdlcilzdGFydENoaWxkSW5kZXggVG86KE5TSW50ZWdlcilzdG9wQ2hpbGRJbmRleCBXaXRoOihpZCl0OworCitAZW5kCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUFkYXB0b3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY0YjEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlQWRhcHRvci5tCkBAIC0wLDAgKzEsMjM4IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSVHJlZUV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJUcmVlQWRhcHRvcgorCisKKysgKGlkPEFOVExSQmFzZVRyZWU+KSBuZXdFbXB0eVRyZWUKK3sKKwlyZXR1cm4gW0FOVExSVHJlZUFkYXB0b3IgbmV3VHJlZVdpdGhUb2tlbjpuaWxdOworfQorCisrIChpZCkgbmV3QWRhcHRvcgoreworICAgIHJldHVybiBbW0FOVExSVHJlZUFkYXB0b3IgYWxsb2NdIGluaXRdOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFBheWxvYWQ6KGlkPEFOVExSVG9rZW4+KXBheWxvYWQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisjcHJhZ21hIG1hcmsgUmV3cml0ZSBSdWxlcworCisvKiogQ3JlYXRlIGEgdHJlZSBub2RlIGZyb20gVG9rZW4gb2JqZWN0OyBmb3IgQ29tbW9uVHJlZSB0eXBlIHRyZWVzLAorICogIHRoZW4gdGhlIHRva2VuIGp1c3QgYmVjb21lcyB0aGUgcGF5bG9hZC4gIFRoaXMgaXMgdGhlIG1vc3QKKyAqICBjb21tb24gY3JlYXRlIGNhbGwuCisgKgorICogIE92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LgorICovCistIChpZDxBTlRMUkJhc2VUcmVlPikgY3JlYXRlOihpZDxBTlRMUlRva2VuPikgcGF5bG9hZAoreworICAgIHJldHVybiBuaWw7Cit9CisKKy8qKiBDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorICogIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAqICByZXdyaXRlIHJ1bGUgYXMgSU1BR1skdG9rZW5MYWJlbF0uCisgKgorICogIFRoaXMgc2hvdWxkIGludm9rZSBjcmVhdGVUb2tlbihUb2tlbikuCisgKi8KKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBjcmVhdGVUcmVlOihOU0ludGVnZXIpdG9rZW5UeXBlIGZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pZnJvbVRva2VuCit7CisJaWQ8QU5UTFJUb2tlbj4gbmV3VG9rZW4gPSBbc2VsZiBjcmVhdGVUb2tlbjpmcm9tVG9rZW5dOworCVtuZXdUb2tlbiBzZXRUeXBlOnRva2VuVHlwZV07CisgICAgCisJaWQ8QU5UTFJCYXNlVHJlZT4gbmV3VHJlZSA9IFtzZWxmIGNyZWF0ZTpuZXdUb2tlbl07CisJW25ld1Rva2VuIHJlbGVhc2VdOworCXJldHVybiBuZXdUcmVlOworfQorCisvKiogQ3JlYXRlIGEgbmV3IG5vZGUgZGVyaXZlZCBmcm9tIGEgdG9rZW4sIHdpdGggYSBuZXcgdG9rZW4gdHlwZS4KKyAqICBUaGlzIGlzIGludm9rZWQgZnJvbSBhbiBpbWFnaW5hcnkgbm9kZSByZWYgb24gcmlnaHQgc2lkZSBvZiBhCisgKiAgcmV3cml0ZSBydWxlIGFzIElNQUdbJHRva2VuTGFiZWxdLgorICoKKyAqICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICovCistIChpZDxBTlRMUkJhc2VUcmVlPikgY3JlYXRlVHJlZTooTlNJbnRlZ2VyKXRva2VuVHlwZSBmcm9tVG9rZW46KGlkPEFOVExSVG9rZW4+KWZyb21Ub2tlbiB0ZXh0OihOU1N0cmluZyAqKXRva2VuVGV4dAoreworCWlkPEFOVExSVG9rZW4+IG5ld1Rva2VuID0gW3NlbGYgY3JlYXRlVG9rZW46ZnJvbVRva2VuXTsKKwlbbmV3VG9rZW4gc2V0VGV4dDp0b2tlblRleHRdOworCQorCWlkPEFOVExSQmFzZVRyZWU+IG5ld1RyZWUgPSBbc2VsZiBjcmVhdGU6bmV3VG9rZW5dOworCVtuZXdUb2tlbiByZWxlYXNlXTsKKwlyZXR1cm4gbmV3VHJlZTsKK30KKworLyoqIENyZWF0ZSBhIG5ldyBub2RlIGRlcml2ZWQgZnJvbSBhIHRva2VuLCB3aXRoIGEgbmV3IHRva2VuIHR5cGUuCisgKiAgVGhpcyBpcyBpbnZva2VkIGZyb20gYW4gaW1hZ2luYXJ5IG5vZGUgcmVmIG9uIHJpZ2h0IHNpZGUgb2YgYQorICogIHJld3JpdGUgcnVsZSBhcyBJTUFHWyJJTUFHIl0uCisgKgorICogIFRoaXMgc2hvdWxkIGludm9rZSBjcmVhdGVUb2tlbihpbnQsU3RyaW5nKS4KKyAqLworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcil0b2tlblR5cGUgdGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQKK3sKKwlpZDxBTlRMUlRva2VuPiBuZXdUb2tlbiA9IFtzZWxmIGNyZWF0ZVRva2VuOnRva2VuVHlwZSB0ZXh0OnRva2VuVGV4dF07CisJCisJaWQ8QU5UTFJCYXNlVHJlZT4gbmV3VHJlZSA9IFtzZWxmIGNyZWF0ZTpuZXdUb2tlbl07CisJW25ld1Rva2VuIHJlbGVhc2VdOworCXJldHVybiBuZXdUcmVlOworfQorCistIChpZCkgY29weU5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlCit7CisJcmV0dXJuIFthTm9kZSBjb3B5V2l0aFpvbmU6bmlsXTsJLy8gbm90IC1jb3B5OiB0byBzaWxlbmNlIHdhcm5pbmdzCit9CisKKy0gKGlkKSBjb3B5VHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUKK3sKKwlyZXR1cm4gW2FUcmVlIGRlZXBDb3B5XTsKK30KKworCistICh2b2lkKSBhZGRDaGlsZDooaWQ8QU5UTFJCYXNlVHJlZT4pY2hpbGQgdG9UcmVlOihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZQoreworCVthVHJlZSBhZGRDaGlsZDpjaGlsZF07Cit9CisKKy0gKGlkKSBtYWtlTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pbmV3Um9vdCBwYXJlbnRPZjooaWQ8QU5UTFJCYXNlVHJlZT4pb2xkUm9vdAoreworCWlkPEFOVExSQmFzZVRyZWU+IG5ld1Jvb3ROb2RlID0gbmV3Um9vdDsKKworCWlmIChvbGRSb290ID09IG5pbCkKKwkJcmV0dXJuIG5ld1Jvb3ROb2RlOworICAgIC8vIGhhbmRsZXMgXihuaWwgcmVhbC1ub2RlKSBjYXNlCisJaWYgKFtuZXdSb290Tm9kZSBpc05pbF0pIHsKKwkJaWYgKFtuZXdSb290Tm9kZSBnZXRDaGlsZENvdW50XSA+IDEpIHsKKyN3YXJuaW5nIFRPRE86IEZpbmQgYSB3YXkgdG8gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtIGhlcmUhCisJCQlAdGhyb3cgW0FOVExSVHJlZUV4Y2VwdGlvbiBleGNlcHRpb25XaXRoT2xkUm9vdDpvbGRSb290IG5ld1Jvb3Q6bmV3Um9vdE5vZGUgc3RyZWFtOm5pbF07CisJCX0KKyN3YXJuaW5nIFRPRE86IGRvdWJsZSBjaGVjayBtZW1vcnkgbWFuYWdlbWVudCB3aXRoIHJlc3BlY3QgdG8gY29kZSBnZW5lcmF0aW9uCisJCS8vIHJlbW92ZSB0aGUgZW1wdHkgbm9kZSwgcGxhY2luZyBpdHMgc29sZSBjaGlsZCBpbiBpdHMgcm9sZS4KKwkJaWQ8QU5UTFJCYXNlVHJlZT4gdG1wUm9vdE5vZGUgPSBbW25ld1Jvb3ROb2RlIGNoaWxkQXRJbmRleDowXSByZXRhaW5dOworCQlbbmV3Um9vdE5vZGUgcmVsZWFzZV07CisJCW5ld1Jvb3ROb2RlID0gdG1wUm9vdE5vZGU7CQkKKwl9CisJLy8gdGhlIGhhbmRsaW5nIG9mIGFuIGVtcHR5IG5vZGUgYXQgdGhlIHJvb3Qgb2Ygb2xkUm9vdCBoYXBwZW5zIGluIGFkZENoaWxkOgorCVtuZXdSb290Tm9kZSBhZGRDaGlsZDpvbGRSb290XTsKKyAgICAvLyB0aGlzIHJlbGVhc2UgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIEFOVExSIGNvZGUgZ2VuZXJhdG9yIGFsd2F5cyBhc3NpZ25zIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QKKyAgICAvLyB0byB0aGUgdmFyaWFibGUgb3JpZ2luYWxseSBob2xkaW5nIG9sZFJvb3QuIElmIHdlIGRvbid0IHJlbGVhc2Ugd2UgbGVhayB0aGUgcmVmZXJlbmNlLgorICAgIC8vIEZJWE1FOiB0aGlzIGlzIHRvdGFsbHkgbm9uLW9idmlvdXMuIG1heWJlIGRvIGl0IGluIGNhbGxpbmcgY29kZSBieSBjb21wYXJpbmcgcG9pbnRlcnMgYW5kIGNvbmRpdGlvbmFsbHkgcmVsZWFzaW5nCisgICAgLy8gdGhlIG9sZCBvYmplY3QKKyAgICBbb2xkUm9vdCByZWxlYXNlXTsKKyAgICAKKyAgICAvLyB3aGF0IGhhcHBlbnMgdG8gbmV3Um9vdE5vZGUncyByZXRhaW4gY291bnQ/IFNob3VsZCB3ZSBiZSBhdXRvcmVsZWFzaW5nIHRoaXMgb25lPyBQcm9iYWJseS4KKwlyZXR1cm4gW25ld1Jvb3ROb2RlIHJldGFpbl07Cit9CisKKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIHBvc3RQcm9jZXNzVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUKK3sKKwlpZDxBTlRMUkJhc2VUcmVlPiBwcm9jZXNzZWROb2RlID0gYVRyZWU7CisJaWYgKGFUcmVlICE9IG5pbCAmJiBbYVRyZWUgaXNOaWxdICE9IE5PICYmIFthVHJlZSBnZXRDaGlsZENvdW50XSA9PSAxKSB7CisJCXByb2Nlc3NlZE5vZGUgPSBbYVRyZWUgY2hpbGRBdEluZGV4OjBdOworCX0KKwlyZXR1cm4gcHJvY2Vzc2VkTm9kZTsKK30KKworCistIChOU1VJbnRlZ2VyKSB1bmlxdWVJZEZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlCit7CisJLy8gVE9ETzogaXMgaGFzaCBhcHByb3ByaWF0ZSBoZXJlPworCXJldHVybiBbYU5vZGUgaGFzaF07Cit9CisKKworI3ByYWdtYSBtYXJrIENvbnRlbnQKKworLSAoTlNJbnRlZ2VyKSB0b2tlblR5cGVGb3JOb2RlOihpZDxBTlRMUkJhc2VUcmVlPilhTm9kZQoreworCXJldHVybiBbYU5vZGUgZ2V0VHlwZV07Cit9CisKKy0gKHZvaWQpIHNldFRva2VuVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZSBmb3JOb2RlOihpZClhTm9kZQoreworCS8vIGN1cnJlbnRseSB1bmltcGxlbWVudGVkCit9CisKKworLSAoTlNTdHJpbmcgKikgdGV4dEZvck5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlCit7CisJcmV0dXJuIFthTm9kZSBnZXRUZXh0XTsKK30KKworLSAodm9pZCkgc2V0VGV4dDooTlNTdHJpbmcgKil0b2tlblRleHQgZm9yTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKKwkvLyBjdXJyZW50bHkgdW5pbXBsZW1lbnRlZAorfQorCisKKyNwcmFnbWEgbWFyayBOYXZpZ2F0aW9uIC8gVHJlZSBQYXJzaW5nCisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBjaGlsZEZvck5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KSBhTm9kZSBhdEluZGV4OihOU0ludGVnZXIpIGkKK3sKKwkvLyBjdXJyZW50bHkgdW5pbXBsZW1lbnRlZAorCXJldHVybiBuaWw7Cit9CisKKy0gKE5TSW50ZWdlcikgY2hpbGRDb3VudEZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KSBhVHJlZQoreworCS8vIGN1cnJlbnRseSB1bmltcGxlbWVudGVkCisJcmV0dXJuIDA7Cit9CisKKyNwcmFnbWEgbWFyayBTdWJjbGFzcyBSZXNwb25zaWJpbHRpZXMKKworLSAodm9pZCkgc2V0Qm91bmRhcmllc0ZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlIGZyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pc3RhcnRUb2tlbiB0b1Rva2VuOihpZDxBTlRMUlRva2VuPilzdG9wVG9rZW4KK3sKKwkvLyBzdWJjbGFzcyByZXNwb25zaWJpbGl0eQorfQorCistIChOU0ludGVnZXIpIHRva2VuU3RhcnRJbmRleEZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlCit7CisJLy8gc3ViY2xhc3MgcmVzcG9uc2liaWxpdHkKKwlyZXR1cm4gMDsKK30KKworLSAoTlNJbnRlZ2VyKSB0b2tlblN0b3BJbmRleEZvclRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlCit7CisJLy8gc3ViY2xhc3MgcmVzcG9uc2liaWxpdHkKKwlyZXR1cm4gMDsKK30KKworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVFeGNlcHRpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUV4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzMwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVFeGNlcHRpb24uaApAQCAtMCwwICsxLDQyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSVHJlZUV4Y2VwdGlvbiA6IEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24geworCWlkPEFOVExSQmFzZVRyZWU+IG9sZFJvb3Q7CisJaWQ8QU5UTFJCYXNlVHJlZT4gbmV3Um9vdDsKK30KKworKyAoaWQpIG5ld0V4Y2VwdGlvbjooaWQ8QU5UTFJCYXNlVHJlZT4pdGhlT2xkUm9vdCBuZXdSb290OihpZDxBTlRMUkJhc2VUcmVlPil0aGVOZXdSb290IHN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFTdHJlYW07CistIChpZCkgaW5pdFdpdGhPbGRSb290OihpZDxBTlRMUkJhc2VUcmVlPil0aGVPbGRSb290IG5ld1Jvb3Q6KGlkPEFOVExSQmFzZVRyZWU+KXRoZU5ld1Jvb3Qgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYVN0cmVhbTsKKworLSAodm9pZCkgc2V0T2xkUm9vdDooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWU7CistICh2b2lkKSBzZXROZXdSb290OihpZDxBTlRMUkJhc2VUcmVlPilhVHJlZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlRXhjZXB0aW9uLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVFeGNlcHRpb24ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFkMjljCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlRXhjZXB0aW9uLm0KQEAgLTAsMCArMSw4NSBAQAorLy8KKy8vICBBTlRMUlRyZWVFeGNlcHRpb24ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgS2F5IFLDtnBrZSBvbiAyNC4xMC4yMDA2LgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCAiQU5UTFJUcmVlRXhjZXB0aW9uLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZUV4Y2VwdGlvbgorCisrIChpZCkgbmV3RXhjZXB0aW9uOihpZDxBTlRMUkJhc2VUcmVlPil0aGVPbGRSb290IG5ld1Jvb3Q6KGlkPEFOVExSQmFzZVRyZWU+KXRoZU5ld1Jvb3Qgc3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYVN0cmVhbTsKK3sKKwlyZXR1cm4gW1tBTlRMUlRyZWVFeGNlcHRpb24gYWxsb2NdIGluaXRXaXRoT2xkUm9vdDp0aGVPbGRSb290IG5ld1Jvb3Q6dGhlTmV3Um9vdCBzdHJlYW06YVN0cmVhbV07Cit9CisKKy0gKGlkKSBpbml0V2l0aE9sZFJvb3Q6KGlkPEFOVExSQmFzZVRyZWU+KXRoZU9sZFJvb3QgbmV3Um9vdDooaWQ8QU5UTFJCYXNlVHJlZT4pdGhlTmV3Um9vdCBzdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhU3RyZWFtOworeworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphU3RyZWFtIHJlYXNvbjpAIlRoZSBuZXcgcm9vdCBoYXMgbW9yZSB0aGFuIG9uZSBjaGlsZC4gQ2Fubm90IG1ha2UgaXQgdGhlIHJvb3Qgbm9kZS4iXSkgIT0gbmlsICkgeworCQlbc2VsZiBzZXRPbGRSb290OnRoZU9sZFJvb3RdOworCQlbc2VsZiBzZXROZXdSb290OnRoZU5ld1Jvb3RdOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlRyZWVFeGNlcHRpb24iICk7CisjZW5kaWYKKwlbc2VsZiBzZXRPbGRSb290Om5pbF07CisJW3NlbGYgc2V0TmV3Um9vdDpuaWxdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAodm9pZCkgc2V0TmV3Um9vdDooaWQ8QU5UTFJCYXNlVHJlZT4pYVRyZWUKK3sKKwlpZiAobmV3Um9vdCAhPSBhVHJlZSkgeworCQlbYVRyZWUgcmV0YWluXTsKKwkJaWYgKCBuZXdSb290ICkgW25ld1Jvb3QgcmVsZWFzZV07CisJCW5ld1Jvb3QgPSBhVHJlZTsKKwl9Cit9CisKKy0gKHZvaWQpIHNldE9sZFJvb3Q6KGlkPEFOVExSQmFzZVRyZWU+KWFUcmVlCit7CisJaWYgKG9sZFJvb3QgIT0gYVRyZWUpIHsKKwkJW2FUcmVlIHJldGFpbl07CisJCWlmICggb2xkUm9vdCApIFtvbGRSb290IHJlbGVhc2VdOworCQlvbGRSb290ID0gYVRyZWU7CisJfQorfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworCSByZXR1cm4gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJUAgb2xkIHJvb3Q6IDwlQD4gbmV3IHJvb3Q6IDwlQD4iLCBbc3VwZXIgZGVzY3JpcHRpb25dLCBbb2xkUm9vdCB0cmVlRGVzY3JpcHRpb25dLCBbbmV3Um9vdCB0cmVlRGVzY3JpcHRpb25dXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlSXRlcmF0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjZjhjMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUl0ZXJhdG9yLmgKQEAgLTAsMCArMSw3MiBAQAorLy8KKy8vICBBTlRMUlRyZWVJdGVyYXRvci5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAyNi8wNC8yMDEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIElhbiBNaWNoZWxsIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSRmFzdFF1ZXVlLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworQGludGVyZmFjZSBBTlRMUlRyZWVJdGVyYXRvciA6IE5TT2JqZWN0IAoreworCUJPT0wgZmlyc3RUaW1lOworCV9fc3Ryb25nIGlkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7CisJX19zdHJvbmcgaWQ8QU5UTFJCYXNlVHJlZT4gcm9vdDsKKwlfX3N0cm9uZyBpZDxBTlRMUkJhc2VUcmVlPiB0cmVlOworCQorCV9fc3Ryb25nIEFOVExSRmFzdFF1ZXVlICpub2RlczsKKwlfX3N0cm9uZyBpZDxBTlRMUkJhc2VUcmVlPiB1cDsKKwlfX3N0cm9uZyBpZDxBTlRMUkJhc2VUcmVlPiBkb3duOworCV9fc3Ryb25nIGlkPEFOVExSQmFzZVRyZWU+IGVvZjsKK30KKworQHByb3BlcnR5IEJPT0wgZmlyc3RUaW1lOworQHByb3BlcnR5KHJldGFpbikgaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKK0Bwcm9wZXJ0eShyZXRhaW4pIGlkPEFOVExSQmFzZVRyZWU+IHJvb3Q7CitAcHJvcGVydHkocmV0YWluKSBpZDxBTlRMUkJhc2VUcmVlPiB0cmVlOworQHByb3BlcnR5KHJldGFpbikgQU5UTFJGYXN0UXVldWUgKm5vZGVzOworQHByb3BlcnR5KHJldGFpbiwgcmVhZHdyaXRlKSBpZDxBTlRMUkJhc2VUcmVlPiB1cDsKK0Bwcm9wZXJ0eShyZXRhaW4sIHJlYWR3cml0ZSkgaWQ8QU5UTFJCYXNlVHJlZT4gZG93bjsKK0Bwcm9wZXJ0eShyZXRhaW4sIHJlYWR3cml0ZSkgaWQ8QU5UTFJCYXNlVHJlZT4gZW9mOworCisrIG5ld0FOVFJMVHJlZUl0ZXJhdG9yOworKyAoQU5UTFJUcmVlSXRlcmF0b3IgKikgbmV3QU5UUkxUcmVlSXRlcmF0b3JXaXRoQWRhcHRvcjooQU5UTFJDb21tb25UcmVlQWRhcHRvciAqKWFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZFRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KXRyZWU7CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KSB0OworLSAoaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhIGFuZFRyZWU6KGlkPEFOVExSQmFzZVRyZWU+KSB0OworCistICh2b2lkKSByZXNldDsKKy0gKEJPT0wpIGhhc05leHQ7CistIChpZCkgbmV4dE9iamVjdDsKKy0gKE5TQXJyYXkgKikgYWxsT2JqZWN0czsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlSXRlcmF0b3IubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUl0ZXJhdG9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZUl0ZXJhdG9yLm0KQEAgLTAsMCArMSwyMDIgQEAKKy8vCisvLyAgQU5UTFJUcmVlSXRlcmF0b3IubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjYvMDQvMjAxMC4KKy8vIENvcHlyaWdodCAoYykgMjAxMCBJYW4gTWljaGVsbCAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworI2ltcG9ydCAiQU5UTFJUcmVlSXRlcmF0b3IuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZUl0ZXJhdG9yCisKKysgKEFOVExSVHJlZUl0ZXJhdG9yICopIG5ld0FOVFJMVHJlZUl0ZXJhdG9yCit7CisgICAgcmV0dXJuIFtbQU5UTFJUcmVlSXRlcmF0b3IgYWxsb2NdIGluaXRdOworfQorCisrIChBTlRMUlRyZWVJdGVyYXRvciAqKSBuZXdBTlRSTFRyZWVJdGVyYXRvcldpdGhBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopYWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pdHJlZQoreworICAgIHJldHVybiBbW0FOVExSVHJlZUl0ZXJhdG9yIGFsbG9jXSBpbml0V2l0aFRyZWVBZGFwdG9yOmFkYXB0b3IgYW5kVHJlZTp0cmVlXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIGZpcnN0VGltZSA9IFlFUzsKKyAgICAgICAgbm9kZXMgPSBbW0FOVExSRmFzdFF1ZXVlIG5ld0FOVExSRmFzdFF1ZXVlXSByZXRhaW5dOworICAgICAgICBkb3duID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVET1dOIFRleHQ6QCJET1dOIl0gcmV0YWluXTsKKyAgICAgICAgdXAgPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZVVQIFRleHQ6QCJVUCJdIHJldGFpbl07CisgICAgICAgIGVvZiA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRU9GIFRleHQ6QCJFT0YiXSByZXRhaW5dOworICAgICAgICB0cmVlID0gZW9mOworICAgICAgICByb290ID0gZW9mOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLShpZCkgaW5pdFdpdGhUcmVlOihpZDxBTlRMUkJhc2VUcmVlPikgdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgZmlyc3RUaW1lID0gWUVTOworICAgICAgICBhZGFwdG9yID0gW1tBTlRMUkNvbW1vblRyZWVBZGFwdG9yIG5ld1RyZWVBZGFwdG9yXSByZXRhaW5dOworICAgICAgICB0cmVlID0gW3QgcmV0YWluXTsKKyAgICAgICAgcm9vdCA9IHQ7CisgICAgICAgIG5vZGVzID0gW1tBTlRMUkZhc3RRdWV1ZSBuZXdBTlRMUkZhc3RRdWV1ZV0gcmV0YWluXTsKKyAgICAgICAgZG93biA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlRE9XTiBUZXh0OkAiRE9XTiJdIHJldGFpbl07CisgICAgICAgIHVwID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVVUCBUZXh0OkAiVVAiXSByZXRhaW5dOworICAgICAgICBlb2YgPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZUVPRiBUZXh0OkAiRU9GIl0gcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQpIGluaXRXaXRoVHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWEgYW5kVHJlZTooaWQ8QU5UTFJCYXNlVHJlZT4pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgZmlyc3RUaW1lID0gWUVTOworICAgICAgICBhZGFwdG9yID0gW2EgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IFt0IHJldGFpbl07CisgICAgICAgIHJvb3QgPSB0OworICAgICAgICBub2RlcyA9IFtbQU5UTFJGYXN0UXVldWUgbmV3QU5UTFJGYXN0UXVldWVdIHJldGFpbl07CisgICAgICAgIGRvd24gPSBbW2FkYXB0b3IgY3JlYXRlVHJlZTpBTlRMUlRva2VuVHlwZURPV04gVGV4dDpAIkRPV04iXSByZXRhaW5dOworICAgICAgICB1cCA9IFtbYWRhcHRvciBjcmVhdGVUcmVlOkFOVExSVG9rZW5UeXBlVVAgVGV4dDpAIlVQIl0gcmV0YWluXTsKKyAgICAgICAgZW9mID0gW1thZGFwdG9yIGNyZWF0ZVRyZWU6QU5UTFJUb2tlblR5cGVFT0YgVGV4dDpAIkVPRiJdIHJldGFpbl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJUcmVlSXRlcmF0b3IiICk7CisjZW5kaWYKKyAgICBpZiAoIGFkYXB0b3IgKSBbYWRhcHRvciByZWxlYXNlXTsKKyAgICBpZiAoIG5vZGVzICkgW25vZGVzIHJlbGVhc2VdOworICAgIGlmICggdHJlZSAmJiB0cmVlICE9IGVvZiApIFt0cmVlIHJlbGVhc2VdOworICAgIGlmICggcm9vdCAmJiByb290ICE9IGVvZiAmJiByb290ICE9IHRyZWUgKSBbcm9vdCByZWxlYXNlXTsKKyAgICBpZiAoIGRvd24gKSBbZG93biByZWxlYXNlXTsgICAgCisgICAgaWYgKCB1cCApIFt1cCByZWxlYXNlXTsgICAgCisgICAgaWYgKCBlb2YgKSBbZW9mIHJlbGVhc2VdOyAgICAKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKHZvaWQpcmVzZXQKK3sKKyAgICBmaXJzdFRpbWUgPSBZRVM7CisgICAgdHJlZSA9IHJvb3Q7CisgICAgW25vZGVzIGNsZWFyXTsKK30KKworLShCT09MKSBoYXNOZXh0Cit7CisgICAgaWYgKCBmaXJzdFRpbWUgKSB7CisgICAgICAgIHJldHVybiByb290ICE9IG5pbDsKKyAgICB9CisgICAgaWYgKCBub2RlcyAmJiBbbm9kZXMgc2l6ZV0gPiAwKSB7CisgICAgICAgIHJldHVybiBZRVM7CisgICAgfQorICAgIGlmICggdHJlZSA9PSBuaWwgKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCBbYWRhcHRvciBnZXRDaGlsZENvdW50OnRyZWVdID4gMCApIHsKKyAgICAgICAgcmV0dXJuIFlFUzsKKyAgICB9CisgICAgcmV0dXJuIFthZGFwdG9yIGdldFBhcmVudDp0cmVlXSAhPSBuaWw7Cit9CisKKy0oaWQpIG5leHRPYmplY3QKK3sKKyAgICAvLyBpcyB0aGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSB1c2luZyB0aGlzIG1ldGhvZD8KKyAgICBpZiAoIGZpcnN0VGltZSApIHsKKyAgICAgICAgZmlyc3RUaW1lID0gTk87CisgICAgICAgIGlmICggW2FkYXB0b3IgZ2V0Q2hpbGRDb3VudDp0cmVlXSA9PSAwICkgeworICAgICAgICAgICAgW25vZGVzIGFkZE9iamVjdDplb2ZdOworICAgICAgICAgICAgcmV0dXJuIHRyZWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyZWU7CisgICAgfQorICAgIC8vIGRvIHdlIGhhdmUgYW55IG9iamVjdHMgcXVldWVkIHVwPworICAgIGlmICggbm9kZXMgJiYgW25vZGVzIHNpemVdID4gMCApIHsKKyAgICAgICAgcmV0dXJuIFtub2RlcyByZW1vdmVdOworICAgIH0KKyAgICAvLyBubyBub2RlcyBsZWZ0PworICAgIGlmICggdHJlZSA9PSBuaWwgKSB7CisgICAgICAgIHJldHVybiBlb2Y7CisgICAgfQorICAgIGlmICggW2FkYXB0b3IgZ2V0Q2hpbGRDb3VudDp0cmVlXSA+IDAgKSB7CisgICAgICAgIHRyZWUgPSBbYWRhcHRvciBnZXRDaGlsZDp0cmVlIEF0OjBdOworICAgICAgICBbbm9kZXMgYWRkT2JqZWN0OnRyZWVdOyAvLyByZWFsIG5vZGUgaXMgbmV4dCBhZnRlciBkb3duCisgICAgICAgIHJldHVybiBzZWxmLmRvd247CisgICAgfQorICAgIC8vIGlmIG5vIGNoaWxkcmVuLCBsb29rIGZvciBuZXh0IHNpYmxpbmcgb2YgYW5jZXN0b3IKKyAgICBpZDxBTlRMUkJhc2VUcmVlPiBwYXJlbnQgPSBbYWRhcHRvciBnZXRQYXJlbnQ6dHJlZV07CisgICAgd2hpbGUgKHBhcmVudCAhPSBuaWwgJiYgKFthZGFwdG9yIGdldENoaWxkSW5kZXg6dHJlZV0gKyAxKSA+PSBbYWRhcHRvciBnZXRDaGlsZENvdW50OnBhcmVudF0pIHsKKyAgICAgICAgW25vZGVzIGFkZE9iamVjdDp1cF07CisgICAgICAgIHRyZWUgPSBwYXJlbnQ7CisgICAgICAgIHBhcmVudCA9IFthZGFwdG9yIGdldFBhcmVudDp0cmVlXTsKKyAgICB9CisgICAgaWYgKCBwYXJlbnQgPT0gbmlsICkgeworICAgICAgICB0cmVlID0gbmlsOworICAgICAgICBbbm9kZXMgYWRkT2JqZWN0OnNlbGYuZW9mXTsKKyAgICAgICAgcmV0dXJuIFtub2RlcyByZW1vdmVdOworICAgIH0KKyAgICAvLyBtdXN0IGhhdmUgZm91bmQgYSBub2RlIHdpdGggYW4gdW52aXNpdGVkIHNpYmxpbmcKKyAgICAvLyBtb3ZlIHRvIGl0IGFuZCByZXR1cm4gaXQKKyAgICBOU0ludGVnZXIgbmV4dFNpYmxpbmdJbmRleCA9IFthZGFwdG9yIGdldENoaWxkSW5kZXg6dHJlZV0gKyAxOworICAgIHRyZWUgPSBbYWRhcHRvciBnZXRDaGlsZDpwYXJlbnQgQXQ6bmV4dFNpYmxpbmdJbmRleF07CisgICAgW25vZGVzIGFkZE9iamVjdDp0cmVlXTsKKyAgICByZXR1cm4gW25vZGVzIHJlbW92ZV07Cit9CisKKy0oTlNBcnJheSAqKSBhbGxPYmplY3RzCit7CisgICAgQU11dGFibGVBcnJheSAqYXJyYXkgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxMF07CisgICAgd2hpbGUgKCBbc2VsZiBoYXNOZXh0XSApIHsKKyAgICAgICAgW2FycmF5IGFkZE9iamVjdDpbc2VsZiBuZXh0T2JqZWN0XV07CisgICAgfQorICAgIHJldHVybiBhcnJheTsKK30KKworLSAodm9pZClyZW1vdmUKK3sKKyAgICBAdGhyb3cgW0FOVExSUnVudGltZUV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJBTlRMUlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIl07Cit9CisKK0BzeW50aGVzaXplIGZpcnN0VGltZTsKK0BzeW50aGVzaXplIGFkYXB0b3I7CitAc3ludGhlc2l6ZSByb290OworQHN5bnRoZXNpemUgdHJlZTsKK0BzeW50aGVzaXplIG5vZGVzOworCitAc3ludGhlc2l6ZSB1cDsKK0BzeW50aGVzaXplIGRvd247CitAc3ludGhlc2l6ZSBlb2Y7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZU5vZGVTdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZU5vZGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEwYWFhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlTm9kZVN0cmVhbS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJJbnRTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSQ2hhclN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisKK0Bwcm90b2NvbCBBTlRMUlRyZWVOb2RlU3RyZWFtIDwgQU5UTFJJbnRTdHJlYW0gPiAKKworLSAoaWQpIGluaXRXaXRoVHJlZTooQU5UTFJDb21tb25UcmVlICopdGhlVHJlZTsKKworLSAoaWQpIGdldFRyZWU6KE5TSW50ZWdlcikgaWR4OworLSAoaWQpIExUOihOU0ludGVnZXIpazsKKy0gKGlkKSBnZXRUcmVlU291cmNlOworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGdldFRva2VuU3RyZWFtOyAKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClmbGFnOworLSAodm9pZCkgcmVzZXQ7CisKKy0gKE5TU3RyaW5nICopIHRvU3RyaW5nRnJvbU5vZGU6KGlkKXN0YXJ0Tm9kZSBUb05vZGU6KGlkKXN0b3BOb2RlOworCistICh2b2lkKSByZXBsYWNlQ2hpbGRyZW46KGlkKXBhcmVudCBGcm9tOihOU0ludGVnZXIpc3RhcnRDaGlsZEluZGV4IFRvOihOU0ludGVnZXIpc3RvcENoaWxkSW5kZXggV2l0aDooaWQpIHQ7CisgICAgCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyZDVjNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhcnNlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJCYXNlUmVjb2duaXplci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUlRyZWVQYXJzZXIgOiBBTlRMUkJhc2VSZWNvZ25pemVyIHsKKwlpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPiBpbnB1dDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1pbnB1dCwgc2V0dGVyPXNldElucHV0OikgaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4gaW5wdXQ7CisKKysgKGlkKSBuZXdBTlRMUlRyZWVQYXJzZXI6KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQ7CisrIChpZCkgbmV3QU5UTFJUcmVlUGFyc2VyOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKXN0YXRlOworCistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZUlucHV0OworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPil0aGVJbnB1dAorICAgICAgICAgICAgICAgIFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKXN0YXRlOworCisKKy0gKGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWlucHV0OworLSAodm9pZCkgc2V0SW5wdXQ6KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQ7CisKKy0gKHZvaWQpIHNldFRyZWVOb2RlU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgYW5JbnB1dDsKKy0gKGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KSBnZXRUcmVlTm9kZVN0cmVhbTsKKworLSAoTlNTdHJpbmcgKilnZXRTb3VyY2VOYW1lOworCistIChpZCkgZ2V0Q3VycmVudElucHV0U3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pIGFuSW5wdXQ7CisKKy0gKGlkKSBnZXRNaXNzaW5nU3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4paW5wdXQKKyAgICAgICAgICAgICAgRXhjZXB0aW9uOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopIGUKKyAgICAgICAgICBFeHBlY3RlZFRva2VuOihOU0ludGVnZXIpIGV4cGVjdGVkVG9rZW5UeXBlCisgICAgICAgICAgICAgICAgIEJpdFNldDooQU5UTFJCaXRTZXQgKilmb2xsb3c7CisKKy8qKiBNYXRjaCAnLicgaW4gdHJlZSBwYXJzZXIgaGFzIHNwZWNpYWwgbWVhbmluZy4gIFNraXAgbm9kZSBvcgorICogIGVudGlyZSB0cmVlIGlmIG5vZGUgaGFzIGNoaWxkcmVuLiAgSWYgY2hpbGRyZW4sIHNjYW4gdW50aWwKKyAqICBjb3JyZXNwb25kaW5nIFVQIG5vZGUuCisgKi8KKy0gKHZvaWQpIG1hdGNoQW55OihpZDxBTlRMUkludFN0cmVhbT4paWdub3JlOworCisvKiogV2UgaGF2ZSBET1dOL1VQIG5vZGVzIGluIHRoZSBzdHJlYW0gdGhhdCBoYXZlIG5vIGxpbmUgaW5mbzsgb3ZlcnJpZGUuCisgKiAgcGx1cyB3ZSB3YW50IHRvIGFsdGVyIHRoZSBleGNlcHRpb24gdHlwZS4gIERvbid0IHRyeSB0byByZWNvdmVyCisgKiAgZnJvbSB0cmVlIHBhcnNlciBlcnJvcnMgaW5saW5lLi4uCisgKi8KKy0gKGlkKSByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKXR0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xsb3c6KEFOVExSQml0U2V0ICopZm9sbG93OworCisvKiogUHJlZml4IGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgZ3JhbW1hciBuYW1lIGJlY2F1c2UgbWVzc2FnZSBpcworICogIGFsd2F5cyBpbnRlbmRlZCBmb3IgdGhlIHByb2dyYW1tZXIgYmVjYXVzZSB0aGUgcGFyc2VyIGJ1aWx0CisgKiAgdGhlIGlucHV0IHRyZWUgbm90IHRoZSB1c2VyLgorICovCistIChOU1N0cmluZyAqKWdldEVycm9ySGVhZGVyOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZTsKKworLSAoTlNTdHJpbmcgKilnZXRFcnJvck1lc3NhZ2U6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillIFRva2VuTmFtZXM6KEFNdXRhYmxlQXJyYXkgKikgdG9rZW5OYW1lczsKKworLSAodm9pZCkgdHJhY2VJbjooTlNTdHJpbmcgKilydWxlTmFtZSBJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleDsKKy0gKHZvaWQpIHRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWVjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXJzZXIubQpAQCAtMCwwICsxLDE5MiBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVHJlZVBhcnNlci5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJUcmVlUGFyc2VyCisKK0BzeW50aGVzaXplIGlucHV0OworCisrIChpZCkgbmV3QU5UTFJUcmVlUGFyc2VyOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbQU5UTFJUcmVlUGFyc2VyIGFsbG9jXSBpbml0V2l0aFN0cmVhbTphbklucHV0XTsKK30KKworKyAoaWQpIG5ld0FOVExSVHJlZVBhcnNlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKil0aGVTdGF0ZQoreworICAgIHJldHVybiBbW0FOVExSVHJlZVBhcnNlciBhbGxvY10gaW5pdFdpdGhTdHJlYW06YW5JbnB1dCBTdGF0ZTp0aGVTdGF0ZV07Cit9CisKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pdGhlSW5wdXQKK3sKKwlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworCQlbc2VsZiBzZXRJbnB1dDp0aGVJbnB1dF07CisJfQorCXJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KXRoZUlucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKXRoZVN0YXRlCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJW3NlbGYgc2V0SW5wdXQ6dGhlSW5wdXRdOworICAgICAgICBzdGF0ZSA9IHRoZVN0YXRlOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlRyZWVQYXJzZXIiICk7CisjZW5kaWYKKwlpZiAoIGlucHV0ICkgW2lucHV0IHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAodm9pZCkgcmVzZXQKK3sKKyAgICBbc3VwZXIgcmVzZXRdOyAvLyByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKKyAgICBpZiAoIGlucHV0ICE9IG5pbCApIHsKKyAgICAgICAgW2lucHV0IHNlZWs6MF07IC8vIHJld2luZCB0aGUgaW5wdXQKKyAgICB9Cit9CisKKy0gKHZvaWQpIG1pc21hdGNoOihpZDxBTlRMUkludFN0cmVhbT4pYVN0cmVhbSB0b2tlblR5cGU6KEFOVExSVG9rZW5UeXBlKWFUVHlwZSBmb2xsb3c6KEFOVExSQml0U2V0ICopYUJpdHNldAoreworCUFOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uICptdGUgPSBbQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOmFUVHlwZSBTdHJlYW06YVN0cmVhbV07CisgICAgW210ZSBzZXROb2RlOlsoKGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFTdHJlYW0pIExUOjFdXTsKKwlbc2VsZiByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbjphU3RyZWFtIFR5cGU6YVRUeXBlIEZvbGxvdzphQml0c2V0XTsKK30KKworLSAodm9pZCkgc2V0VHJlZU5vZGVTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KSBhbklucHV0Cit7CisgICAgaW5wdXQgPSBhbklucHV0OworfQorCistIChpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPikgZ2V0VHJlZU5vZGVTdHJlYW0KK3sKKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZQoreworICAgIHJldHVybiBbaW5wdXQgZ2V0U291cmNlTmFtZV07Cit9CisKKy0gKGlkKSBnZXRDdXJyZW50SW5wdXRTeW1ib2w6KGlkPEFOVExSSW50U3RyZWFtPikgYW5JbnB1dAoreworICAgIHJldHVybiBbKGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQgTFQ6MV07Cit9CisKKy0gKGlkKSBnZXRNaXNzaW5nU3ltYm9sOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAorICAgICAgICAgICAgICBFeGNlcHRpb246KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCisgICAgICAgICAgRXhwZWN0ZWRUb2tlbjooTlNJbnRlZ2VyKWV4cGVjdGVkVG9rZW5UeXBlCisgICAgICAgICAgICAgICAgIEJpdFNldDooQU5UTFJCaXRTZXQgKilmb2xsb3cKK3sKKyAgICBOU1N0cmluZyAqdG9rZW5UZXh0ID1bTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjxtaXNzaW5nICVAICVkPiIsIFtzZWxmIGdldFRva2VuTmFtZXNdLCBleHBlY3RlZFRva2VuVHlwZV07CisgICAgLy9pZDxBTlRMUlRyZWVBZGFwdG9yPiBhbkFkYXB0b3IgPSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pWygoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pZS5pbnB1dCkgZ2V0VHJlZUFkYXB0b3JdOworICAgIC8vcmV0dXJuIFthbkFkYXB0b3IgY3JlYXRlVG9rZW46ZXhwZWN0ZWRUb2tlblR5cGUgVGV4dDp0b2tlblRleHRdOworICAgIHJldHVybiBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpleHBlY3RlZFRva2VuVHlwZSBUZXh0OnRva2VuVGV4dF07Cit9CisKKy8qKiBNYXRjaCAnLicgaW4gdHJlZSBwYXJzZXIgaGFzIHNwZWNpYWwgbWVhbmluZy4gIFNraXAgbm9kZSBvcgorICogIGVudGlyZSB0cmVlIGlmIG5vZGUgaGFzIGNoaWxkcmVuLiAgSWYgY2hpbGRyZW4sIHNjYW4gdW50aWwKKyAqICBjb3JyZXNwb25kaW5nIFVQIG5vZGUuCisgKi8KKy0gKHZvaWQpIG1hdGNoQW55OihpZDxBTlRMUkludFN0cmVhbT4paWdub3JlCit7IC8vIGlnbm9yZSBzdHJlYW0sIGNvcHkgb2YgaW5wdXQKKyAgICBzdGF0ZS5lcnJvclJlY292ZXJ5ID0gTk87CisgICAgc3RhdGUuZmFpbGVkID0gTk87CisgICAgaWQgbG9vayA9IFtpbnB1dCBMVDoxXTsKKyAgICBpZiAoIFsoKEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKilbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdKSBnZXRDaGlsZENvdW50Omxvb2tdID09IDApIHsKKyAgICAgICAgW2lucHV0IGNvbnN1bWVdOyAvLyBub3Qgc3VidHJlZSwgY29uc3VtZSAxIG5vZGUgYW5kIHJldHVybgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGN1cnJlbnQgbm9kZSBpcyBhIHN1YnRyZWUsIHNraXAgdG8gY29ycmVzcG9uZGluZyBVUC4KKyAgICAvLyBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCisgICAgaW50IGxldmVsPTA7CisgICAgaW50IHRva2VuVHlwZSA9IFsoKGlkPEFOVExSVHJlZUFkYXB0b3I+KVtpbnB1dCBnZXRUcmVlQWRhcHRvcl0pIGdldFR5cGU6bG9va107CisgICAgd2hpbGUgKCB0b2tlblR5cGUgIT0gQU5UTFJUb2tlblR5cGVFT0YgJiYgISggdG9rZW5UeXBlID09IEFOVExSVG9rZW5UeXBlVVAgJiYgbGV2ZWwgPT0gMCkgKSB7CisgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgbG9vayA9IFtpbnB1dCBMVDoxXTsKKyAgICAgICAgdG9rZW5UeXBlID0gWygoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pW2lucHV0IGdldFRyZWVBZGFwdG9yXSkgZ2V0VHlwZTpsb29rXTsKKyAgICAgICAgaWYgKCB0b2tlblR5cGUgPT0gQU5UTFJUb2tlblR5cGVET1dOICkgeworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggdG9rZW5UeXBlID09IEFOVExSVG9rZW5UeXBlVVAgKSB7CisgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICB9CisgICAgfQorICAgIFtpbnB1dCBjb25zdW1lXTsgLy8gY29uc3VtZSBVUAorfQorCisvKiogV2UgaGF2ZSBET1dOL1VQIG5vZGVzIGluIHRoZSBzdHJlYW0gdGhhdCBoYXZlIG5vIGxpbmUgaW5mbzsgb3ZlcnJpZGUuCisgKiAgcGx1cyB3ZSB3YW50IHRvIGFsdGVyIHRoZSBleGNlcHRpb24gdHlwZS4gIERvbid0IHRyeSB0byByZWNvdmVyCisgKiAgZnJvbSB0cmVlIHBhcnNlciBlcnJvcnMgaW5saW5lLi4uCisgKi8KKy0gKGlkKSByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbjooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQgVHlwZTooTlNJbnRlZ2VyKXR0eXBlIEZvbGxvdzooQU5UTFJCaXRTZXQgKilmb2xsb3cKK3sKKyAgICBAdGhyb3cgW0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjp0dHlwZSBTdHJlYW06YW5JbnB1dF07Cit9CisKKy8qKiBQcmVmaXggZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBncmFtbWFyIG5hbWUgYmVjYXVzZSBtZXNzYWdlIGlzCisgKiAgYWx3YXlzIGludGVuZGVkIGZvciB0aGUgcHJvZ3JhbW1lciBiZWNhdXNlIHRoZSBwYXJzZXIgYnVpbHQKKyAqICB0aGUgaW5wdXQgdHJlZSBub3QgdGhlIHVzZXIuCisgKi8KKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JIZWFkZXI6KEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKillCit7CisgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVAOiBub2RlIGFmdGVyIGxpbmUgJUA6JUAiLAorICAgICAgICAgICAgW3NlbGYgZ2V0R3JhbW1hckZpbGVOYW1lXSwgZS5saW5lLCBlLmNoYXJQb3NpdGlvbkluTGluZV07Cit9CisKKy8qKiBUcmVlIHBhcnNlcnMgcGFyc2Ugbm9kZXMgdGhleSB1c3VhbGx5IGhhdmUgYSB0b2tlbiBvYmplY3QgYXMKKyAqICBwYXlsb2FkLiBTZXQgdGhlIGV4Y2VwdGlvbiB0b2tlbiBhbmQgZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisgKi8KKy0gKE5TU3RyaW5nICopZ2V0RXJyb3JNZXNzYWdlOihBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICopZSAgVG9rZW5OYW1lczooQU11dGFibGVBcnJheSAqKSB0aGVUb2tOYW1zCit7CisgICAgaWYgKCBbc2VsZiBpc0tpbmRPZkNsYXNzOltBTlRMUlRyZWVQYXJzZXIgY2xhc3NdXSApIHsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcHRvciA9IChBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopWygoaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pZS5pbnB1dCkgZ2V0VHJlZUFkYXB0b3JdOworICAgICAgICBlLnRva2VuID0gW2FkYXB0b3IgZ2V0VG9rZW46KChpZDxBTlRMUkJhc2VUcmVlPillLm5vZGUpXTsKKyAgICAgICAgaWYgKCBlLnRva2VuID09IG5pbCApIHsgLy8gY291bGQgYmUgYW4gVVAvRE9XTiBub2RlCisgICAgICAgICAgICBlLnRva2VuID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46W2FkYXB0b3IgZ2V0VHlwZTplLm5vZGVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQ6W2FkYXB0b3IgZ2V0VGV4dDplLm5vZGVdXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gW3N1cGVyIGdldEVycm9yTWVzc2FnZTplIFRva2VuTmFtZXM6dGhlVG9rTmFtc107Cit9CisKKy0gKHZvaWQpIHRyYWNlSW46KE5TU3RyaW5nICopcnVsZU5hbWUgSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKK3sKKyAgICBbc3VwZXIgdHJhY2VJbjpydWxlTmFtZSBJbmRleDpydWxlSW5kZXggT2JqZWN0OltpbnB1dCBMVDoxXV07Cit9CisKKy0gKHZvaWQpIHRyYWNlT3V0OihOU1N0cmluZyAqKXJ1bGVOYW1lIEluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4Cit7CisgICAgW3N1cGVyIHRyYWNlT3V0OnJ1bGVOYW1lIEluZGV4OnJ1bGVJbmRleCAgT2JqZWN0OltpbnB1dCBMVDoxXV07Cit9CisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUGF0dGVybkxleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzBiYzgzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUGF0dGVybkxleGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLy8KKy8vICBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCit0eXBlZGVmIGVudW0geworCUFOVExSTGV4ZXJUb2tlblR5cGVFT0YgPSAtMSwKKwlBTlRMUkxleGVyVG9rZW5UeXBlSW52YWxpZCwKKwlBTlRMUkxleGVyVG9rZW5UeXBlQkVHSU4sCisJQU5UTFJMZXhlclRva2VuVHlwZUVORCwKKwlBTlRMUkxleGVyVG9rZW5UeXBlSUQsCisJQU5UTFJMZXhlclRva2VuVHlwZUFSRywKKwlBTlRMUkxleGVyVG9rZW5UeXBlUEVSQ0VOVCwKKwlBTlRMUkxleGVyVG9rZW5UeXBlQ09MT04sCisJQU5UTFJMZXhlclRva2VuVHlwZURPVCwKK30gQU5UTFJMZXhlclRva2VuVHlwZTsKKworCitAaW50ZXJmYWNlIEFOVExSVHJlZVBhdHRlcm5MZXhlciA6IE5TT2JqZWN0IHsKKworLyoqIFRoZSB0cmVlIHBhdHRlcm4gdG8gbGV4IGxpa2UgIihBIEIgQykiICovCitOU1N0cmluZyAqcGF0dGVybjsKKyAgICAKKy8qKiBJbmRleCBpbnRvIGlucHV0IHN0cmluZyAqLworTlNJbnRlZ2VyIHA7CisgICAgCisvKiogQ3VycmVudCBjaGFyICovCitOU0ludGVnZXIgYzsKKyAgICAKKy8qKiBIb3cgbG9uZyBpcyB0aGUgcGF0dGVybiBpbiBjaGFyPyAqLworTlNJbnRlZ2VyIG47CisgICAgCisvKiogU2V0IHdoZW4gdG9rZW4gdHlwZSBpcyBJRCBvciBBUkcgKG5hbWUgbWltaWNzIEphdmEncyBTdHJlYW1Ub2tlbml6ZXIpICovCitOU011dGFibGVEYXRhICpzdmFsOworX19zdHJvbmcgY2hhciAqZGF0YTsKKyAgICAKK0JPT0wgZXJyb3I7CisKK30KKworQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICpwYXR0ZXJuOworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBwOworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBjOworQHByb3BlcnR5IChhc3NpZ24pIE5TSW50ZWdlciBuOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRTdmFsLCBzZXR0ZXI9c2V0U3ZhbDopIE5TTXV0YWJsZURhdGEgKnN2YWw7CitAcHJvcGVydHkgKGFzc2lnbikgY2hhciAqZGF0YTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBCT09MIGVycm9yOworCisrIChBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKiluZXdBTlRMUlRyZWVQYXR0ZXJuTGV4ZXI6KE5TU3RyaW5nICopYVBhdHRlcm47CistIChpZCkgaW5pdDsKKy0gKGlkKSBpbml0V2l0aFBhdHRlcm46KE5TU3RyaW5nICopYVBhdHRlcm47CisKKy0gKHZvaWQpIGRlYWxsb2M7CistIChOU0ludGVnZXIpIG5leHRUb2tlbjsKKy0gKHZvaWQpIGNvbnN1bWU7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworCistIChOU011dGFibGVEYXRhICopZ2V0U3ZhbDsKKy0gKHZvaWQpIHNldFN2YWw6KE5TTXV0YWJsZURhdGEgKilhU3ZhbDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUGF0dGVybkxleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY5NjlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUGF0dGVybkxleGVyLm0KQEAgLTAsMCArMSwxOTEgQEAKKy8vCisvLyAgQU5UTFJUcmVlUGF0dGVybkxleGVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUcmVlUGF0dGVybkxleGVyLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIKKworQHN5bnRoZXNpemUgcGF0dGVybjsKK0BzeW50aGVzaXplIHA7CitAc3ludGhlc2l6ZSBjOworQHN5bnRoZXNpemUgbjsKK0BzeW50aGVzaXplIHN2YWw7CitAc3ludGhlc2l6ZSBkYXRhOworQHN5bnRoZXNpemUgZXJyb3I7CisKKysgKEFOVExSVHJlZVBhdHRlcm5MZXhlciAqKW5ld0FOVExSVHJlZVBhdHRlcm5MZXhlcjooTlNTdHJpbmcgKilhUGF0dGVybgoreworICAgIHJldHVybiBbW0FOVExSVHJlZVBhdHRlcm5MZXhlciBhbGxvY10gaW5pdFdpdGhQYXR0ZXJuOmFQYXR0ZXJuXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCApIHsKKyAgICAgICAgcCA9IC0xOworICAgICAgICBuID0gMDsKKyAgICAgICAgZXJyb3IgPSBOTzsKKyAgICAgICAgc3ZhbCA9IFtbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDoxMDAwXSByZXRhaW5dOworICAgICAgICBkYXRhID0gW3N2YWwgbXV0YWJsZUJ5dGVzXTsKKyAgICAgICAgcGF0dGVybiA9IEAiIjsKKyAgICAgICAgbiA9IFtwYXR0ZXJuIGxlbmd0aF07CisgICAgICAgIGlmICggcGF0dGVybiApIFtwYXR0ZXJuIHJldGFpbl07CisgICAgICAgIFtzZWxmIGNvbnN1bWVdOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoUGF0dGVybjooTlNTdHJpbmcgKilhUGF0dGVybgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsICkgeworICAgICAgICBwID0gLTE7CisgICAgICAgIG4gPSAwOworICAgICAgICBlcnJvciA9IE5POworICAgICAgICBzdmFsID0gW1tOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOjEwMDBdIHJldGFpbl07CisgICAgICAgIGRhdGEgPSBbc3ZhbCBtdXRhYmxlQnl0ZXNdOworICAgICAgICBwYXR0ZXJuID0gW2FQYXR0ZXJuIHJldGFpbl07CisgICAgICAgIG4gPSBbcGF0dGVybiBsZW5ndGhdOworICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJUcmVlUGF0dGVybkxleGVyIiApOworI2VuZGlmCisJaWYgKCBwYXR0ZXJuICkgW3BhdHRlcm4gcmVsZWFzZV07CisJaWYgKCBzdmFsICkgW3N2YWwgcmVsZWFzZV07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChOU0ludGVnZXIpIG5leHRUb2tlbgoreworICAgIG4gPSAwOyAvLyByZXNldCwgYnV0IHJldXNlIGJ1ZmZlcgorICAgIHdoaWxlICggYyAhPSBBTlRMUkxleGVyVG9rZW5UeXBlRU9GICkgeworICAgICAgICBpZiAoIGM9PScgJyB8fCBjPT0nXG4nIHx8IGM9PSdccicgfHwgYz09J1x0JyApIHsKKyAgICAgICAgICAgIFtzZWxmIGNvbnN1bWVdOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYz49J2EnICYmIGM8PSd6JykgfHwgKGM+PSdBJyAmJiBjPD0nWicpIHx8IGM9PSdfJyApIHsKKyAgICAgICAgICAgIGRhdGFbbisrXSA9IChjaGFyKWM7CisgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgIHdoaWxlICggKGM+PSdhJyAmJiBjPD0neicpIHx8IChjPj0nQScgJiYgYzw9J1onKSB8fAorICAgICAgICAgICAgICAgICAgIChjPj0nMCcgJiYgYzw9JzknKSB8fCBjPT0nXycgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGFbbisrXSA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgW3NlbGYgY29uc3VtZV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQU5UTFJMZXhlclRva2VuVHlwZUlEOworICAgICAgICB9CisgICAgICAgIGlmICggYyA9PSAnKCcgKSB7CisgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgIHJldHVybiBBTlRMUkxleGVyVG9rZW5UeXBlQkVHSU47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjPT0nKScgKSB7CisgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgIHJldHVybiBBTlRMUkxleGVyVG9rZW5UeXBlRU5EOworICAgICAgICB9CisgICAgICAgIGlmICggYz09JyUnICkgeworICAgICAgICAgICAgW3NlbGYgY29uc3VtZV07CisgICAgICAgICAgICByZXR1cm4gQU5UTFJMZXhlclRva2VuVHlwZVBFUkNFTlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjPT0nOicgKSB7CisgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgIHJldHVybiBBTlRMUkxleGVyVG9rZW5UeXBlQ09MT047CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBjPT0nLicgKSB7CisgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgIHJldHVybiBBTlRMUkxleGVyVG9rZW5UeXBlRE9UOworICAgICAgICB9CisgICAgICAgIGlmICggYz09J1snICkgeyAvLyBncmFiIFt4XSBhcyBhIHN0cmluZywgcmV0dXJuaW5nIHgKKyAgICAgICAgICAgIFtzZWxmIGNvbnN1bWVdOworICAgICAgICAgICAgd2hpbGUgKCBjIT0nXScgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjPT0nXFwnICkgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjIT0nXScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW24rK10gPSAoY2hhciknXFwnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRhdGFbbisrXSA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkYXRhW24rK10gPSAoY2hhciljOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBbc2VsZiBjb25zdW1lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFtzZWxmIGNvbnN1bWVdOworICAgICAgICAgICAgcmV0dXJuIEFOVExSTGV4ZXJUb2tlblR5cGVBUkc7CisgICAgICAgIH0KKyAgICAgICAgW3NlbGYgY29uc3VtZV07CisgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEFOVExSTGV4ZXJUb2tlblR5cGVFT0Y7CisgICAgfQorICAgIHJldHVybiBBTlRMUkxleGVyVG9rZW5UeXBlRU9GOworfQorCistICh2b2lkKSBjb25zdW1lCit7CisgICAgcCsrOworICAgIGlmICggcCA+PSBuICkgeworICAgICAgICBjID0gQU5UTFJMZXhlclRva2VuVHlwZUVPRjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGMgPSBbcGF0dGVybiBjaGFyYWN0ZXJBdEluZGV4OnBdOworICAgIH0KK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIGNoYXIgYnVmWzEwMF07CisKKyAgICBOU0ludGVnZXIgaWR4ID0gMDsKKyAgICBmb3IoIE5TSW50ZWdlciBpID0gcDsgaSA8IG47IGkrKyApeworICAgICAgICBidWZbaWR4KytdID0gZGF0YVtpXTsKKyAgICB9CisgICAgYnVmW2lkeF0gPSAnXDAnOworICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzIiwgYnVmXTsKK30KKworLSAoTlNNdXRhYmxlRGF0YSAqKWdldFN2YWwKK3sKKyAgICByZXR1cm4gc3ZhbDsKK30KKworLSAodm9pZClzZXRTdmFsOihOU011dGFibGVEYXRhICopYVN2YWwKK3sKKyAgICBpZiAoIHN2YWwgIT0gYVN2YWwgKSB7CisgICAgICAgIGlmICggc3ZhbCApIFtzdmFsIHJlbGVhc2VdOworICAgICAgICBbYVN2YWwgcmV0YWluXTsKKyAgICB9CisgICAgc3ZhbCA9IGFTdmFsOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1MWI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIuaApAQCAtMCwwICsxLDYzIEBACisvLworLy8gIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlUGF0dGVybkxleGVyLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVXaXphcmQuaCIKKyNpbXBvcnQgIkFOVExSVHJlZUFkYXB0b3IuaCIKKworQGludGVyZmFjZSBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyIDogTlNPYmplY3QgeworCitBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKnRva2VuaXplcjsKK05TSW50ZWdlciB0dHlwZTsKK0FOVExSVHJlZVdpemFyZCAqd2l6YXJkOworaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKKyAgICAKK30KKworKyAoQU5UTFJUcmVlUGF0dGVyblBhcnNlciAqKW5ld0FOVExSVHJlZVBhdHRlcm5QYXJzZXI6KEFOVExSVHJlZVBhdHRlcm5MZXhlciAqKWFUb2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l6YXJkOihBTlRMUlRyZWVXaXphcmQgKilhV2l6YXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yOworLSAoaWQpIGluaXQ7CistIChpZCkgaW5pdFdpdGhUb2tlbml6ZXI6KEFOVExSVHJlZVBhdHRlcm5MZXhlciAqKXRva2VuaXplcgorICAgICAgICAgICAgICAgICAgV2l6YXJkOihBTlRMUlRyZWVXaXphcmQgKilhV2l6YXJkCisgICAgICAgICAgICAgICAgIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKworLSAodm9pZCkgZGVhbGxvYzsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBwYXR0ZXJuOworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIHBhcnNlVHJlZTsKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBwYXJzZU5vZGU7CisKK0Bwcm9wZXJ0eSAocmV0YWluKSBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKnRva2VuaXplcjsKK0Bwcm9wZXJ0eSBOU0ludGVnZXIgdHR5cGU7CitAcHJvcGVydHkgKHJldGFpbikgQU5UTFJUcmVlV2l6YXJkICp3aXphcmQ7CitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVBhdHRlcm5QYXJzZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTVkOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUGF0dGVyblBhcnNlci5tCkBAIC0wLDAgKzEsMTk3IEBACisvLworLy8gIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIKKworKyAoQU5UTFJUcmVlUGF0dGVyblBhcnNlciAqKW5ld0FOVExSVHJlZVBhdHRlcm5QYXJzZXI6KEFOVExSVHJlZVBhdHRlcm5MZXhlciAqKWFUb2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l6YXJkOihBTlRMUlRyZWVXaXphcmQgKilhV2l6YXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCit7CisgICAgcmV0dXJuIFtbQU5UTFJUcmVlUGF0dGVyblBhcnNlciBhbGxvY10gaW5pdFdpdGhUb2tlbml6ZXI6YVRva2VuaXplciBXaXphcmQ6YVdpemFyZCBBZGFwdG9yOmFuQWRhcHRvcl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgLy90b2tlbml6ZXIgPSBhVG9rZW5pemVyOworICAgICAgICAvL3dpemFyZCA9IGFXaXphcmQ7CisgICAgICAgIC8vYWRhcHRvciA9IGFuQWRhcHRvcjsKKyAgICAgICAgLy90dHlwZSA9IFt0b2tlbml6ZXIgbmV4dFRva2VuXTsgLy8ga2lja3N0YXJ0CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUb2tlbml6ZXI6KEFOVExSVHJlZVBhdHRlcm5MZXhlciAqKWFUb2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgIFdpemFyZDooQU5UTFJUcmVlV2l6YXJkICopYVdpemFyZAorICAgICAgICAgICAgICAgICBBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICBhZGFwdG9yID0gYW5BZGFwdG9yOworICAgICAgICBpZiAoIGFkYXB0b3IgKSBbYWRhcHRvciByZXRhaW5dOworICAgICAgICB0b2tlbml6ZXIgPSBhVG9rZW5pemVyOworICAgICAgICBpZiAoIHRva2VuaXplciApIFt0b2tlbml6ZXIgcmV0YWluXTsKKyAgICAgICAgd2l6YXJkID0gYVdpemFyZDsKKyAgICAgICAgaWYgKCB3aXphcmQgKSBbd2l6YXJkIHJldGFpbl07CisgICAgICAgIHR0eXBlID0gW2FUb2tlbml6ZXIgbmV4dFRva2VuXTsgLy8ga2lja3N0YXJ0CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIiICk7CisjZW5kaWYKKwlpZiAoIGFkYXB0b3IgKSBbYWRhcHRvciByZWxlYXNlXTsKKwlpZiAoIHRva2VuaXplciApIFt0b2tlbml6ZXIgcmVsZWFzZV07CisJaWYgKCB3aXphcmQgKSBbd2l6YXJkIHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pcGF0dGVybgoreworICAgIGlmICggdHR5cGU9PUFOVExSTGV4ZXJUb2tlblR5cGVCRUdJTiApIHsKKyAgICAgICAgcmV0dXJuIFtzZWxmIHBhcnNlVHJlZV07CisgICAgfQorICAgIGVsc2UgaWYgKCB0dHlwZT09QU5UTFJMZXhlclRva2VuVHlwZUlEICkgeworICAgICAgICBpZDxBTlRMUkJhc2VUcmVlPiBub2RlID0gW3NlbGYgcGFyc2VOb2RlXTsKKyAgICAgICAgaWYgKCB0dHlwZT09QU5UTFJMZXhlclRva2VuVHlwZUVPRiApIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuaWw7IC8vIGV4dHJhIGp1bmsgb24gZW5kCisgICAgfQorICAgIHJldHVybiBuaWw7Cit9CisKKy0gKGlkPEFOVExSQmFzZVRyZWU+KSBwYXJzZVRyZWUKK3sKKyAgICBpZiAoIHR0eXBlICE9IEFOVExSTGV4ZXJUb2tlblR5cGVCRUdJTiApIHsKKyAgICAgICAgQHRocm93IFtBTlRMUlJ1bnRpbWVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAibm8gQkVHSU4iXTsKKyAgICB9CisgICAgdHR5cGUgPSBbdG9rZW5pemVyIG5leHRUb2tlbl07CisgICAgaWQ8QU5UTFJCYXNlVHJlZT4gcm9vdCA9IFtzZWxmIHBhcnNlTm9kZV07CisgICAgaWYgKCByb290PT1uaWwgKSB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIHdoaWxlICggdHR5cGU9PUFOVExSTGV4ZXJUb2tlblR5cGVCRUdJTiAgfHwKKyAgICAgICAgICAgdHR5cGU9PUFOVExSTGV4ZXJUb2tlblR5cGVJRCAgICAgIHx8CisgICAgICAgICAgIHR0eXBlPT1BTlRMUkxleGVyVG9rZW5UeXBlUEVSQ0VOVCB8fAorICAgICAgICAgICB0dHlwZT09QU5UTFJMZXhlclRva2VuVHlwZURPVCApCisgICAgeworICAgICAgICBpZiAoIHR0eXBlPT1BTlRMUkxleGVyVG9rZW5UeXBlQkVHSU4gKSB7CisgICAgICAgICAgICBpZDxBTlRMUkJhc2VUcmVlPiBzdWJ0cmVlID0gW3NlbGYgcGFyc2VUcmVlXTsKKyAgICAgICAgICAgIFthZGFwdG9yIGFkZENoaWxkOnN1YnRyZWUgdG9UcmVlOnJvb3RdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWQ8QU5UTFJCYXNlVHJlZT4gY2hpbGQgPSBbc2VsZiBwYXJzZU5vZGVdOworICAgICAgICAgICAgaWYgKCBjaGlsZCA9PSBuaWwgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFthZGFwdG9yIGFkZENoaWxkOmNoaWxkIHRvVHJlZTpyb290XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHR0eXBlICE9IEFOVExSTGV4ZXJUb2tlblR5cGVFTkQgKSB7CisgICAgICAgIEB0aHJvdyBbQU5UTFJSdW50aW1lRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpAIm5vIEVORCJdOworICAgIH0KKyAgICB0dHlwZSA9IFt0b2tlbml6ZXIgbmV4dFRva2VuXTsKKyAgICByZXR1cm4gcm9vdDsKK30KKworLSAoaWQ8QU5UTFJCYXNlVHJlZT4pIHBhcnNlTm9kZQoreworICAgIC8vICIlbGFiZWw6IiBwcmVmaXgKKyAgICBOU1N0cmluZyAqbGFiZWwgPSBuaWw7CisgICAgQU5UTFJUcmVlUGF0dGVybiAqbm9kZTsKKyAgICBpZiAoIHR0eXBlID09IEFOVExSTGV4ZXJUb2tlblR5cGVQRVJDRU5UICkgeworICAgICAgICB0dHlwZSA9IFt0b2tlbml6ZXIgbmV4dFRva2VuXTsKKyAgICAgICAgaWYgKCB0dHlwZSAhPSBBTlRMUkxleGVyVG9rZW5UeXBlSUQgKSB7CisgICAgICAgICAgICByZXR1cm4gbmlsOworICAgICAgICB9CisgICAgICAgIGxhYmVsID0gW3Rva2VuaXplciB0b1N0cmluZ107CisgICAgICAgIHR0eXBlID0gW3Rva2VuaXplciBuZXh0VG9rZW5dOworICAgICAgICBpZiAoIHR0eXBlICE9IEFOVExSTGV4ZXJUb2tlblR5cGVDT0xPTiApIHsKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIH0KKyAgICAgICAgdHR5cGUgPSBbdG9rZW5pemVyIG5leHRUb2tlbl07IC8vIG1vdmUgdG8gSUQgZm9sbG93aW5nIGNvbG9uCisgICAgfQorICAgIAorICAgIC8vIFdpbGRjYXJkPworICAgIGlmICggdHR5cGUgPT0gQU5UTFJMZXhlclRva2VuVHlwZURPVCApIHsKKyAgICAgICAgdHR5cGUgPSBbdG9rZW5pemVyIG5leHRUb2tlbl07CisgICAgICAgIGlkPEFOVExSVG9rZW4+IHdpbGRjYXJkUGF5bG9hZCA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOjAgVGV4dDpAIi4iXTsKKyAgICAgICAgbm9kZSA9IFtBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gbmV3QU5UTFJXaWxkY2FyZFRyZWVQYXR0ZXJuOndpbGRjYXJkUGF5bG9hZF07CisgICAgICAgIGlmICggbGFiZWwgIT0gbmlsICkgeworICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGxhYmVsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICAvLyAiSUQiIG9yICJJRFthcmddIgorICAgIGlmICggdHR5cGUgIT0gQU5UTFJMZXhlclRva2VuVHlwZUlEICkgeworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBOU1N0cmluZyAqdG9rZW5OYW1lID0gW3Rva2VuaXplciB0b1N0cmluZ107CisgICAgdHR5cGUgPSBbdG9rZW5pemVyIG5leHRUb2tlbl07CisgICAgaWYgKCBbdG9rZW5OYW1lIGlzRXF1YWxUb1N0cmluZzpAIm5pbCJdICkgeworICAgICAgICByZXR1cm4gW2FkYXB0b3IgZW1wdHlOb2RlXTsKKyAgICB9CisgICAgTlNTdHJpbmcgKnRleHQgPSB0b2tlbk5hbWU7CisgICAgLy8gY2hlY2sgZm9yIGFyZworICAgIE5TU3RyaW5nICphcmcgPSBuaWw7CisgICAgaWYgKCB0dHlwZSA9PSBBTlRMUkxleGVyVG9rZW5UeXBlQVJHICkgeworICAgICAgICBhcmcgPSBbdG9rZW5pemVyIHRvU3RyaW5nXTsKKyAgICAgICAgdGV4dCA9IGFyZzsKKyAgICAgICAgdHR5cGUgPSBbdG9rZW5pemVyIG5leHRUb2tlbl07CisgICAgfQorICAgIAorICAgIC8vIGNyZWF0ZSBub2RlCisgICAgaW50IHRyZWVOb2RlVHlwZSA9IFt3aXphcmQgZ2V0VG9rZW5UeXBlOnRva2VuTmFtZV07CisgICAgaWYgKCB0cmVlTm9kZVR5cGU9PUFOVExSVG9rZW5UeXBlSW52YWxpZCApIHsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisgICAgbm9kZSA9IFthZGFwdG9yIGNyZWF0ZVRyZWU6dHJlZU5vZGVUeXBlIFRleHQ6dGV4dF07CisgICAgaWYgKCBsYWJlbCE9bmlsICYmIFtub2RlIGNsYXNzXSA9PSBbQU5UTFJUcmVlUGF0dGVybiBjbGFzc10gKSB7CisgICAgICAgICgoQU5UTFJUcmVlUGF0dGVybiAqKW5vZGUpLmxhYmVsID0gbGFiZWw7CisgICAgfQorICAgIGlmICggYXJnIT1uaWwgJiYgW25vZGUgY2xhc3NdID09IFtBTlRMUlRyZWVQYXR0ZXJuIGNsYXNzXSApIHsKKyAgICAgICAgKChBTlRMUlRyZWVQYXR0ZXJuICopbm9kZSkuaGFzVGV4dEFyZyA9IFlFUzsKKyAgICB9CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK0BzeW50aGVzaXplIHRva2VuaXplcjsKK0BzeW50aGVzaXplIHR0eXBlOworQHN5bnRoZXNpemUgd2l6YXJkOworQHN5bnRoZXNpemUgYWRhcHRvcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJld3JpdGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSZXdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjU3MDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSZXdyaXRlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8vCisvLyAgQU5UTFJUcmVlUmV3cml0ZXIuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlUGFyc2VyLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJmcHRyIDogTlNPYmplY3QgeworICAgIGlkICBhY3RvcjsKKyAgICBTRUwgcnVsZVNFTDsKK30KKworKyAoQU5UTFJmcHRyICopbmV3QU5UTFJmcHRyV2l0aFJ1bGU6KFNFTClhUnVsZUFjdGlvbiB3aXRoT2JqZWN0OihpZClhbk9iamVjdDsKKy1pbml0V2l0aFJ1bGU6KFNFTClydWxlQWN0aW9uIHdpdGhPYmplY3Q6KGlkKWFuT2JqZWN0OworCistIChpZClydWxlOworCitAcHJvcGVydHkgKHJldGFpbikgaWQgIGFjdG9yOworQHByb3BlcnR5IFNFTCBydWxlU0VMOworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVHJlZVJld3JpdGVyIDogQU5UTFJUcmVlUGFyc2VyIHsKKyAgICBCT09MIHNob3dUcmFuc2Zvcm1hdGlvbnM7CisgICAgaWQ8QU5UTFJUb2tlblN0cmVhbT4gb3JpZ2luYWxUb2tlblN0cmVhbTsKKyAgICBpZDxBTlRMUlRyZWVBZGFwdG9yPiBvcmlnaW5hbEFkYXB0b3I7CisgICAgQU5UTFJmcHRyICpydWxlOworICAgIEFOVExSZnB0ciAqdG9wZG93bl9mcHRyOworICAgIEFOVExSZnB0ciAqYm90dG9tdXBfZnRwcjsKK30KKworKyAoQU5UTFJUcmVlUmV3cml0ZXIgKikgbmV3QU5UTFJUcmVlUmV3cml0ZXI6KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQ7CisrIChBTlRMUlRyZWVSZXdyaXRlciAqKSBuZXdBTlRMUlRyZWVSZXdyaXRlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGU7CistIChpZClpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dDsKKy0gKGlkKWluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhbklucHV0IFN0YXRlOihBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSAqKWFTdGF0ZTsKKy0gKGlkKSBhcHBseU9uY2U6KEFOVExSQ29tbW9uVHJlZSAqKXQgUnVsZTooQU5UTFJmcHRyICopd2hpY2hSdWxlOworLSAoaWQpIGFwcGx5UmVwZWF0ZWRseTooQU5UTFJDb21tb25UcmVlICopdCBSdWxlOihBTlRMUmZwdHIgKil3aGljaFJ1bGU7CistIChpZCkgZG93bnVwOihBTlRMUkNvbW1vblRyZWUgKil0OworLSAoaWQpIHByZTooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKGlkKSBwb3N0OihBTlRMUkNvbW1vblRyZWUgKil0OworLSAoaWQpIGRvd251cDooQU5UTFJDb21tb25UcmVlICopdCBYRm9ybTooQk9PTClhU2hvd1RyYW5zZm9ybWF0aW9uczsKKy0gKHZvaWQpcmVwb3J0VHJhbnNmb3JtYXRpb246KEFOVExSQ29tbW9uVHJlZSAqKW9sZFRyZWUgVHJlZTooQU5UTFJDb21tb25UcmVlICopbmV3VHJlZTsKKy0gKGlkKSB0b3Bkb3duX2ZwdHI7CistIChpZCkgYm90dG9tdXBfZnRwcjsKKy0gKGlkKSB0b3Bkb3duOworLSAoaWQpIGJvdHRvbXVwOworCitAcHJvcGVydHkgQk9PTCBzaG93VHJhbnNmb3JtYXRpb25zOworQHByb3BlcnR5IChyZXRhaW4pIGlkPEFOVExSVG9rZW5TdHJlYW0+IG9yaWdpbmFsVG9rZW5TdHJlYW07CitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJUcmVlQWRhcHRvcj4gb3JpZ2luYWxBZGFwdG9yOworQHByb3BlcnR5IChyZXRhaW4pIEFOVExSZnB0ciAqcnVsZTsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJld3JpdGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSZXdyaXRlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTU0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSZXdyaXRlci5tCkBAIC0wLDAgKzEsMjUwIEBACisvLworLy8gIEFOVExSVHJlZVJld3JpdGVyLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUcmVlUmV3cml0ZXIuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlVmlzaXRvci5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJmcHRyCisKKysgKEFOVExSZnB0ciAqKW5ld0FOVExSZnB0cldpdGhSdWxlOihTRUwpYVJ1bGVBY3Rpb24gd2l0aE9iamVjdDooaWQpYW5PYmplY3QKK3sKKyAgICByZXR1cm4gW1tBTlRMUmZwdHIgYWxsb2NdIGluaXRXaXRoUnVsZTphUnVsZUFjdGlvbiB3aXRoT2JqZWN0OihpZClhbk9iamVjdF07Cit9CisKKy1pbml0V2l0aFJ1bGU6KFNFTClhUnVsZUFjdGlvbiB3aXRoT2JqZWN0OihpZClhbk9iamVjdAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGFjdG9yID0gYW5PYmplY3Q7CisgICAgICAgIHJ1bGVTRUwgPSBhUnVsZUFjdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKXJ1bGUKK3sKKwlpZiAoIFthY3RvciByZXNwb25kc1RvU2VsZWN0b3I6cnVsZVNFTF0gKQorCQlyZXR1cm4gW2FjdG9yIHBlcmZvcm1TZWxlY3RvcjpydWxlU0VMXTsKKyAgICBlbHNlCisgICAgICAgIEB0aHJvdyBbQU5UTFJSdW50aW1lRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpAIlVua25vd24gUmV3cml0ZSBleGNlcHRpb24iXTsKKyAgICByZXR1cm4gbmlsOworfQorCitAc3ludGhlc2l6ZSBhY3RvcjsKK0BzeW50aGVzaXplIHJ1bGVTRUw7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlRyZWVSZXdyaXRlcgorCisrIChBTlRMUlRyZWVSZXdyaXRlciAqKSBuZXdBTlRMUlRyZWVSZXdyaXRlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dAoreworICAgIHJldHVybiBbW0FOVExSVHJlZVJld3JpdGVyIGFsbG9jXSBpbml0V2l0aFN0cmVhbTphbklucHV0IFN0YXRlOltBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZV1dOworfQorCisrIChBTlRMUlRyZWVSZXdyaXRlciAqKSBuZXdBTlRMUlRyZWVSZXdyaXRlcjooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dCBTdGF0ZTooQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgKilhU3RhdGUKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRyZWVSZXdyaXRlciBhbGxvY10gaW5pdFdpdGhTdHJlYW06YW5JbnB1dCBTdGF0ZTphU3RhdGVdOworfQorCistIChpZClpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYW5JbnB1dAoreworICAgIFNFTCBhUnVsZVNlbDsKKworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphbklucHV0XSkgIT0gbmlsKSB7CisgICAgICAgIHNob3dUcmFuc2Zvcm1hdGlvbnMgPSBOTzsKKyAgICAgICAgc3RhdGUgPSBbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlXSByZXRhaW5dOworICAgICAgICBvcmlnaW5hbEFkYXB0b3IgPSBbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdOworICAgICAgICBpZiAoIG9yaWdpbmFsQWRhcHRvciApIFtvcmlnaW5hbEFkYXB0b3IgcmV0YWluXTsKKyAgICAgICAgb3JpZ2luYWxUb2tlblN0cmVhbSA9IFtpbnB1dCBnZXRUb2tlblN0cmVhbV07ICAgICAgICAKKyAgICAgICAgaWYgKCBvcmlnaW5hbFRva2VuU3RyZWFtICkgW29yaWdpbmFsVG9rZW5TdHJlYW0gcmV0YWluXTsKKyAgICAgICAgYVJ1bGVTZWwgPSBAc2VsZWN0b3IodG9wZG93bik7CisgICAgICAgIHRvcGRvd25fZnB0ciA9IFtBTlRMUmZwdHIgbmV3QU5UTFJmcHRyV2l0aFJ1bGU6KFNFTClhUnVsZVNlbCB3aXRoT2JqZWN0OnNlbGZdOworICAgICAgICBhUnVsZVNlbCA9IEBzZWxlY3Rvcihib3R0b211cCk7CisgICAgICAgIGJvdHRvbXVwX2Z0cHIgPSBbQU5UTFJmcHRyIG5ld0FOVExSZnB0cldpdGhSdWxlOihTRUwpYVJ1bGVTZWwgd2l0aE9iamVjdDpzZWxmXTsgICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFuSW5wdXQgU3RhdGU6KEFOVExSUmVjb2duaXplclNoYXJlZFN0YXRlICopYVN0YXRlCit7CisgICAgU0VMIGFSdWxlU2VsOworICAgIAorICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphbklucHV0XSkgIT0gbmlsKSB7CisgICAgICAgIHNob3dUcmFuc2Zvcm1hdGlvbnMgPSBOTzsKKyAgICAgICAgc3RhdGUgPSBhU3RhdGU7CisgICAgICAgIGlmICggc3RhdGUgKSBbc3RhdGUgcmV0YWluXTsKKyAgICAgICAgb3JpZ2luYWxBZGFwdG9yID0gW2lucHV0IGdldFRyZWVBZGFwdG9yXTsKKyAgICAgICAgaWYgKCBvcmlnaW5hbEFkYXB0b3IgKSBbb3JpZ2luYWxBZGFwdG9yIHJldGFpbl07CisgICAgICAgIG9yaWdpbmFsVG9rZW5TdHJlYW0gPSBbaW5wdXQgZ2V0VG9rZW5TdHJlYW1dOyAgICAgICAgCisgICAgICAgIGlmICggb3JpZ2luYWxUb2tlblN0cmVhbSApIFtvcmlnaW5hbFRva2VuU3RyZWFtIHJldGFpbl07CisgICAgICAgIGFSdWxlU2VsID0gQHNlbGVjdG9yKHRvcGRvd24pOworICAgICAgICB0b3Bkb3duX2ZwdHIgPSBbQU5UTFJmcHRyIG5ld0FOVExSZnB0cldpdGhSdWxlOihTRUwpYVJ1bGVTZWwgd2l0aE9iamVjdDpzZWxmXTsKKyAgICAgICAgYVJ1bGVTZWwgPSBAc2VsZWN0b3IoYm90dG9tdXApOworICAgICAgICBib3R0b211cF9mdHByID0gW0FOVExSZnB0ciBuZXdBTlRMUmZwdHJXaXRoUnVsZTooU0VMKWFSdWxlU2VsIHdpdGhPYmplY3Q6c2VsZl07ICAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJUcmVlUmV3cml0ZXIiICk7CisjZW5kaWYKKwlpZiAoIHN0YXRlICkgW3N0YXRlIHJlbGVhc2VdOworCWlmICggb3JpZ2luYWxBZGFwdG9yICkgW29yaWdpbmFsQWRhcHRvciByZWxlYXNlXTsKKwlpZiAoIG9yaWdpbmFsVG9rZW5TdHJlYW0gKSBbb3JpZ2luYWxUb2tlblN0cmVhbSByZWxlYXNlXTsKKwlbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkKSBhcHBseU9uY2U6KEFOVExSQ29tbW9uVHJlZSAqKXQgUnVsZTooQU5UTFJmcHRyICopd2hpY2hSdWxlCit7CisgICAgaWYgKCB0ID09IG5pbCApIHJldHVybiBuaWw7CisgICAgQHRyeSB7CisgICAgICAgIC8vIHNoYXJlIFRyZWVQYXJzZXIgb2JqZWN0IGJ1dCBub3QgcGFyc2luZy1yZWxhdGVkIHN0YXRlCisgICAgICAgIHN0YXRlID0gW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlXTsKKyAgICAgICAgaW5wdXQgPSBbQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSBuZXdBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopb3JpZ2luYWxBZGFwdG9yIFRyZWU6dF07CisgICAgICAgIFsoQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqKWlucHV0IHNldFRva2VuU3RyZWFtOm9yaWdpbmFsVG9rZW5TdHJlYW1dOworICAgICAgICBbc2VsZiBzZXRCYWNrdHJhY2tpbmdMZXZlbDoxXTsKKyAgICAgICAgQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlICpyID0gWyhBTlRMUmZwdHIgKil3aGljaFJ1bGUgcnVsZV07CisgICAgICAgIFtzZWxmIHNldEJhY2t0cmFja2luZ0xldmVsOjBdOworICAgICAgICBpZiAoIFtzZWxmIGdldEZhaWxlZF0gKQorICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGlmICggc2hvd1RyYW5zZm9ybWF0aW9ucyAmJgorICAgICAgICAgICAgciAhPSBuaWwgJiYgISh0ID09IHIuc3RhcnQpICYmIHIuc3RhcnQgIT0gbmlsICkgeworICAgICAgICAgICAgW3NlbGYgcmVwb3J0VHJhbnNmb3JtYXRpb246dCBUcmVlOnIuc3RhcnRdOworICAgICAgICB9CisgICAgICAgIGlmICggciAhPSBuaWwgJiYgci5zdGFydCAhPSBuaWwgKQorICAgICAgICAgICAgcmV0dXJuIHIuc3RhcnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0OworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKmUpIHsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorICAgIHJldHVybiB0OworfQorCistIChpZCkgYXBwbHlSZXBlYXRlZGx5OihBTlRMUkNvbW1vblRyZWUgKil0IFJ1bGU6KEFOVExSZnB0ciAqKXdoaWNoUnVsZQoreworICAgIEJPT0wgdHJlZUNoYW5nZWQgPSB0cnVlOworICAgIHdoaWxlICggdHJlZUNoYW5nZWQgKSB7CisgICAgICAgIEFOVExSVHJlZVJld3JpdGVyICp1ID0gW3NlbGYgYXBwbHlPbmNlOnQgUnVsZTp3aGljaFJ1bGVdOworICAgICAgICB0cmVlQ2hhbmdlZCA9ICEodCA9PSB1KTsKKyAgICAgICAgdCA9IHU7CisgICAgfQorICAgIHJldHVybiB0OworfQorCistIChpZCkgZG93bnVwOihBTlRMUkNvbW1vblRyZWUgKil0Cit7CisgICAgcmV0dXJuIFtzZWxmIGRvd251cDp0IFhGb3JtOk5PXTsKK30KKworLSAoaWQpIHByZTooQU5UTFJDb21tb25UcmVlICopdAoreworICAgIHJldHVybiBbc2VsZiBhcHBseU9uY2U6dCBSdWxlOnRvcGRvd25fZnB0cl07Cit9CisKKy0gKGlkKXBvc3Q6KEFOVExSQ29tbW9uVHJlZSAqKXQKK3sKKyAgICByZXR1cm4gW3NlbGYgYXBwbHlSZXBlYXRlZGx5OnQgUnVsZTpib3R0b211cF9mdHByXTsKK30KKworI2lmZGVmIERPTlRVU0VOT01PCitwdWJsaWMgT2JqZWN0IGRvd251cChPYmplY3QgdCwgYm9vbGVhbiBzaG93VHJhbnNmb3JtYXRpb25zKSB7CisgICAgdGhpcy5zaG93VHJhbnNmb3JtYXRpb25zID0gc2hvd1RyYW5zZm9ybWF0aW9uczsKKyAgICBUcmVlVmlzaXRvciB2ID0gbmV3IFRyZWVWaXNpdG9yKG5ldyBDb21tb25UcmVlQWRhcHRvcigpKTsKKyAgICBUcmVlVmlzaXRvckFjdGlvbiBhY3Rpb25zID0gbmV3IFRyZWVWaXNpdG9yQWN0aW9uKCkgeworICAgICAgICBwdWJsaWMgT2JqZWN0IHByZShPYmplY3QgdCkgIHsgcmV0dXJuIGFwcGx5T25jZSh0LCB0b3Bkb3duX2ZwdHIpOyB9CisgICAgICAgIHB1YmxpYyBPYmplY3QgcG9zdChPYmplY3QgdCkgeyByZXR1cm4gYXBwbHlSZXBlYXRlZGx5KHQsIGJvdHRvbXVwX2Z0cHIpOyB9CisgICAgfTsKKyAgICB0ID0gdi52aXNpdCh0LCBhY3Rpb25zKTsKKyAgICByZXR1cm4gdDsKK30KKyNlbmRpZgorCistIChpZCkgZG93bnVwOihBTlRMUkNvbW1vblRyZWUgKil0IFhGb3JtOihCT09MKWFTaG93VHJhbnNmb3JtYXRpb25zCit7CisgICAgc2hvd1RyYW5zZm9ybWF0aW9ucyA9IGFTaG93VHJhbnNmb3JtYXRpb25zOworICAgIEFOVExSVHJlZVZpc2l0b3IgKnYgPSBbQU5UTFJUcmVlVmlzaXRvciBuZXdBTlRMUlRyZWVWaXNpdG9yOltbb3JpZ2luYWxBZGFwdG9yIGNsYXNzXSBuZXdUcmVlQWRhcHRvcl1dOworICAgIEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKmFjdGlvbnMgPSBbQU5UTFJUcmVlVmlzaXRvckFjdGlvbiBuZXdBTlRMUlRyZWVWaXNpdG9yQWN0aW9uXTsKKyAgICB7CisgICAgICAgIC8vcHVibGljIE9iamVjdCBwcmUoT2JqZWN0IHQpICB7IHJldHVybiBhcHBseU9uY2UodCwgdG9wZG93bl9mcHRyKTsgfQorICAgICAgICBbc2VsZiBwcmU6dF07CisgICAgICAgIC8vcHVibGljIE9iamVjdCBwb3N0KE9iamVjdCB0KSB7IHJldHVybiBhcHBseVJlcGVhdGVkbHkodCwgYm90dG9tdXBfZnRwcik7IH0KKyAgICAgICAgW3NlbGYgcG9zdDp0XTsKKyAgICB9OworICAgIHQgPSBbdiB2aXNpdDp0IEFjdGlvbjphY3Rpb25zXTsKKyAgICByZXR1cm4gdDsKK30KKworLyoqIE92ZXJyaWRlIHRoaXMgaWYgeW91IG5lZWQgdHJhbnNmb3JtYXRpb24gdHJhY2luZyB0byBnbyBzb21ld2hlcmUKKyAqICBvdGhlciB0aGFuIHN0ZG91dCBvciBpZiB5b3UncmUgbm90IHVzaW5nIFRyZWUtZGVyaXZlZCB0cmVlcy4KKyAqLworLSAodm9pZClyZXBvcnRUcmFuc2Zvcm1hdGlvbjooQU5UTFJDb21tb25UcmVlICopb2xkVHJlZSBUcmVlOihBTlRMUkNvbW1vblRyZWUgKiluZXdUcmVlCit7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oKChUcmVlKW9sZFRyZWUpLnRvU3RyaW5nVHJlZSgpKyIgLT4gIisgKChUcmVlKW5ld1RyZWUpLnRvU3RyaW5nVHJlZSgpKTsKK30KKworLSAoaWQpdG9wZG93bl9mcHRyCit7CisgICAgcmV0dXJuIFtzZWxmIHRvcGRvd25dOworfQorCistIChpZClib3R0b211cF9mdHByCit7CisgICAgcmV0dXJuIFtzZWxmIGJvdHRvbXVwXTsKK30KKworLy8gbWV0aG9kcyB0aGUgZG93bnVwIHN0cmF0ZWd5IHVzZXMgdG8gZG8gdGhlIHVwIGFuZCBkb3duIHJ1bGVzLgorLy8gdG8gb3ZlcnJpZGUsIGp1c3QgZGVmaW5lIHRyZWUgZ3JhbW1hciBydWxlIHRvcGRvd24gYW5kIHR1cm4gb24KKy8vIGZpbHRlcj10cnVlLgorLSAoaWQpIHRvcGRvd24KKy8vIEB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KK3sKKyAgICBAdGhyb3cgW0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAiVG9wRG93biBleGNlcHRpb24iXTsKKyAgICByZXR1cm4gbmlsOworfQorCistIChpZCkgYm90dG9tdXAKKy8vQHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgoreworICAgIEB0aHJvdyBbQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJCb3R0b21VcCBleGNlcHRpb24iXTsKKyAgICByZXR1cm4gbmlsOworfQorCitAc3ludGhlc2l6ZSBzaG93VHJhbnNmb3JtYXRpb25zOworQHN5bnRoZXNpemUgb3JpZ2luYWxUb2tlblN0cmVhbTsKK0BzeW50aGVzaXplIG9yaWdpbmFsQWRhcHRvcjsKK0BzeW50aGVzaXplIHJ1bGU7CitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzcwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaApAQCAtMCwwICsxLDUyIEBACisvLworLy8gIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE3LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUlJ1bGVSZXR1cm5TY29wZS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlIDogQU5UTFJSdWxlUmV0dXJuU2NvcGUgeworICAgIEFOVExSQ29tbW9uVHJlZSAqc3RhcnQ7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U3RhcnQsIHNldHRlcj1zZXRTdGFydDopIEFOVExSQ29tbW9uVHJlZSAqc3RhcnQ7CisKKy8qKiBGaXJzdCBub2RlIG9yIHJvb3Qgbm9kZSBvZiB0cmVlIG1hdGNoZWQgZm9yIHRoaXMgcnVsZS4gKi8KKworKyAoaWQpIG5ld1JldHVyblNjb3BlOworLSAoaWQpIGluaXQ7CistICh2b2lkKSBkZWFsbG9jOworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0U3RhcnQ7CistICh2b2lkKXNldFN0YXJ0OihBTlRMUkNvbW1vblRyZWUgKilhU3RhcnQ7CisKKy0gKGlkKSBjb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXRoZVpvbmU7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MzMxNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tCkBAIC0wLDAgKzEsODEgQEAKKy8vCisvLyAgQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTcvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZQorQHN5bnRoZXNpemUgc3RhcnQ7CisKKysgKGlkKSBuZXdSZXR1cm5TY29wZQoreworICAgIHJldHVybiBbW0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZSBhbGxvY10gaW5pdF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUiICk7CisjZW5kaWYKKwlpZiAoIHN0YXJ0ICkgW3N0YXJ0IHJlbGVhc2VdOworCVtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0U3RhcnQKK3sKKyAgICByZXR1cm4gc3RhcnQ7Cit9CQorCistICh2b2lkKXNldFN0YXJ0OihBTlRMUkNvbW1vblRyZWUgKilhU3RhcnQKK3sKKyAgICBpZiAoIHN0YXJ0ICE9IGFTdGFydCApIHsKKyAgICAgICAgaWYgKCBzdGFydCApIFtzdGFydCByZWxlYXNlXTsKKyAgICAgICAgW2FTdGFydCByZXRhaW5dOworICAgIH0KKyAgICBzdGFydCA9IGFTdGFydDsKK30JCisKKy8vIGNyZWF0ZSBhIGNvcHksIGluY2x1ZGluZyB0aGUgdGV4dCBpZiBhdmFpbGFibGUKKy8vIHRoZSBpbnB1dCBzdHJlYW0gaXMgKm5vdCogY29waWVkIQorLSAoaWQpIGNvcHlXaXRoWm9uZTooTlNab25lICopdGhlWm9uZQoreworICAgIEFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZSAqY29weSA9IFtzdXBlciBjb3B5V2l0aFpvbmU6dGhlWm9uZV07CisgICAgY29weS5zdGFydCA9IHN0YXJ0OworICAgIHJldHVybiBjb3B5OworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVWaXNpdG9yLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVWaXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhZjBkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVZpc2l0b3IuaApAQCAtMCwwICsxLDQ3IEBACisvLworLy8gIEFOVExSVHJlZVZpc2l0b3IuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlQWRhcHRvci5oIgorI2ltcG9ydCAiQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oIgorCitAaW50ZXJmYWNlIEFOVExSVHJlZVZpc2l0b3IgOiBOU09iamVjdCB7CisgICBpZDxBTlRMUlRyZWVBZGFwdG9yPiBhZGFwdG9yOworfQorKyAoQU5UTFJUcmVlVmlzaXRvciAqKW5ld0FOVExSVHJlZVZpc2l0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KSBhbkFkYXB0b3I7CisrIChBTlRMUlRyZWVWaXNpdG9yICopbmV3QU5UTFJUcmVlVmlzaXRvcjsKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKy0gKHZvaWQpIGRlYWxsb2M7CistIChBTlRMUlRyZWVWaXNpdG9yICopdmlzaXQ6KGlkPEFOVExSQmFzZVRyZWU+KXQgQWN0aW9uOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopYWN0aW9uOworCitAcHJvcGVydHkgKHJldGFpbikgaWQ8QU5UTFJUcmVlQWRhcHRvcj4gYWRhcHRvcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVZpc2l0b3IubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVZpc2l0b3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTAwZDZkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlVmlzaXRvci5tCkBAIC0wLDAgKzEsMTAzIEBACisvLworLy8gIEFOVExSVHJlZVZpc2l0b3IubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNi8xOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlRyZWVWaXNpdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlRyZWVWaXNpdG9yCisKKysgKEFOVExSVHJlZVZpc2l0b3IgKiluZXdBTlRMUlRyZWVWaXNpdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRyZWVWaXNpdG9yIGFsbG9jXSBpbml0V2l0aEFkYXB0b3I6YW5BZGFwdG9yXTsKK30KKworKyAoQU5UTFJUcmVlVmlzaXRvciAqKW5ld0FOVExSVHJlZVZpc2l0b3IKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRyZWVWaXNpdG9yIGFsbG9jXSBpbml0XTsKK30KKworCistIChpZClpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgYWRhcHRvciA9IFtbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl0gcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKWluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgYWRhcHRvciA9IFthbkFkYXB0b3IgcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJUcmVlVmlzaXRvciIgKTsKKyNlbmRpZgorICAgIGlmICggYWRhcHRvciApIFthZGFwdG9yIHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyoqIFZpc2l0IGV2ZXJ5IG5vZGUgaW4gdHJlZSB0IGFuZCB0cmlnZ2VyIGFuIGFjdGlvbiBmb3IgZWFjaCBub2RlCisgKiAgYmVmb3JlL2FmdGVyIGhhdmluZyB2aXNpdGVkIGFsbCBvZiBpdHMgY2hpbGRyZW4uCisgKiAgRXhlY3V0ZSBib3RoIGFjdGlvbnMgZXZlbiBpZiB0IGhhcyBubyBjaGlsZHJlbi4KKyAqICBJZiBhIGNoaWxkIHZpc2l0IHlpZWxkcyBhIG5ldyBjaGlsZCwgaXQgY2FuIHVwZGF0ZSBpdHMKKyAqICBwYXJlbnQncyBjaGlsZCBsaXN0IG9yIGp1c3QgcmV0dXJuIHRoZSBuZXcgY2hpbGQuICBUaGUKKyAqICBjaGlsZCB1cGRhdGUgY29kZSB3b3JrcyBldmVuIGlmIHRoZSBjaGlsZCB2aXNpdCBhbHRlcnMgaXRzIHBhcmVudAorICogIGFuZCByZXR1cm5zIHRoZSBuZXcgdHJlZS4KKyAqCisgKiAgUmV0dXJuIHJlc3VsdCBvZiBhcHBseWluZyBwb3N0IGFjdGlvbiB0byB0aGlzIG5vZGUuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3IgKil2aXNpdDooQU5UTFJDb21tb25UcmVlICopdCBBY3Rpb246KEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilhY3Rpb24KK3sKKyAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInZpc2l0ICIrKChUcmVlKXQpLnRvU3RyaW5nVHJlZSgpKTsKKyAgICBCT09MIGlzTmlsID0gW2FkYXB0b3IgaXNOaWw6dF07CisgICAgaWYgKCBhY3Rpb24gIT0gbmlsICYmICFpc05pbCApIHsKKyAgICAgICAgdCA9IFthY3Rpb24gcHJlOihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopdF07IC8vIGlmIHJld3JpdHRlbiwgd2FsayBjaGlsZHJlbiBvZiBuZXcgdAorICAgIH0KKyAgICBmb3IgKGludCBpPTA7IGkgPCBbYWRhcHRvciBnZXRDaGlsZENvdW50OnRdOyBpKyspIHsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGlsZCA9IFthZGFwdG9yIGdldENoaWxkOnQgQXQ6aV07CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqdmlzaXRSZXN1bHQgPSBbc2VsZiB2aXNpdDpjaGlsZCBBY3Rpb246YWN0aW9uXTsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGlsZEFmdGVyVmlzaXQgPSBbYWRhcHRvciBnZXRDaGlsZDp0IEF0OmldOworICAgICAgICBpZiAoIHZpc2l0UmVzdWx0ICE9ICBjaGlsZEFmdGVyVmlzaXQgKSB7IC8vIHJlc3VsdCAmIGNoaWxkIGRpZmZlcj8KKyAgICAgICAgICAgIFthZGFwdG9yIHNldENoaWxkOnQgQXQ6aSBDaGlsZDp2aXNpdFJlc3VsdF07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBhY3Rpb24gIT0gbmlsICYmICFpc05pbCApIHQgPSBbYWN0aW9uIHBvc3Q6KEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKil0XTsKKyAgICByZXR1cm4gdDsKK30KKworQHN5bnRoZXNpemUgYWRhcHRvcjsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVZpc2l0b3JBY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMwODU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vCisvLyAgQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKKworQGludGVyZmFjZSBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uIDogTlNPYmplY3QKK3sKKworfQorCisrIChBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopbmV3QU5UTFJUcmVlVmlzaXRvckFjdGlvbjsKKy0gKGlkKSBpbml0OworCisvKiogRXhlY3V0ZSBhbiBhY3Rpb24gYmVmb3JlIHZpc2l0aW5nIGNoaWxkcmVuIG9mIHQuICBSZXR1cm4gdCBvcgorICogIGEgcmV3cml0dGVuIHQuICBJdCBpcyB1cCB0byB0aGUgdmlzaXRvciB0byBkZWNpZGUgd2hhdCB0byBkbworICogIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gIENoaWxkcmVuIG9mIHJldHVybmVkIHZhbHVlIHdpbGwgYmUKKyAqICB2aXNpdGVkIGlmIHVzaW5nIFRyZWVWaXNpdG9yLnZpc2l0KCkuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilwcmU6KEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKikgdDsKKworLyoqIEV4ZWN1dGUgYW4gYWN0aW9uIGFmdGVyIHZpc2l0aW5nIGNoaWxkcmVuIG9mIHQuICBSZXR1cm4gdCBvcgorICogIGEgcmV3cml0dGVuIHQuICBJdCBpcyB1cCB0byB0aGUgdmlzaXRvciB0byBkZWNpZGUgd2hhdCB0byBkbworICogIHdpdGggdGhlIHJldHVybiB2YWx1ZS4KKyAqLworLSAoQU5UTFJUcmVlVmlzaXRvckFjdGlvbiAqKXBvc3Q6KEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKikgdDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTU5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVWaXNpdG9yQWN0aW9uLm0KQEAgLTAsMCArMSw2OSBAQAorLy8KKy8vICBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5oIgorCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlRyZWVWaXNpdG9yQWN0aW9uCisKKysgKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKiluZXdBTlRMUlRyZWVWaXNpdG9yQWN0aW9uCit7CisgICAgcmV0dXJuIFtbQU5UTFJUcmVlVmlzaXRvckFjdGlvbiBhbGxvY10gaW5pdF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCisvKiogRXhlY3V0ZSBhbiBhY3Rpb24gYmVmb3JlIHZpc2l0aW5nIGNoaWxkcmVuIG9mIHQuICBSZXR1cm4gdCBvcgorICogIGEgcmV3cml0dGVuIHQuICBJdCBpcyB1cCB0byB0aGUgdmlzaXRvciB0byBkZWNpZGUgd2hhdCB0byBkbworICogIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gIENoaWxkcmVuIG9mIHJldHVybmVkIHZhbHVlIHdpbGwgYmUKKyAqICB2aXNpdGVkIGlmIHVzaW5nIFRyZWVWaXNpdG9yLnZpc2l0KCkuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilwcmU6KEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKikgdAoreworICAgIHJldHVybiBuaWw7Cit9CisKKy8qKiBFeGVjdXRlIGFuIGFjdGlvbiBhZnRlciB2aXNpdGluZyBjaGlsZHJlbiBvZiB0LiAgUmV0dXJuIHQgb3IKKyAqICBhIHJld3JpdHRlbiB0LiAgSXQgaXMgdXAgdG8gdGhlIHZpc2l0b3IgdG8gZGVjaWRlIHdoYXQgdG8gZG8KKyAqICB3aXRoIHRoZSByZXR1cm4gdmFsdWUuCisgKi8KKy0gKEFOVExSVHJlZVZpc2l0b3JBY3Rpb24gKilwb3N0OihBTlRMUlRyZWVWaXNpdG9yQWN0aW9uICopIHQKK3sKKyAgICByZXR1cm4gbmlsOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVdpemFyZC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlV2l6YXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1N2MxZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVHJlZVdpemFyZC5oCkBAIC0wLDAgKzEsMTM2IEBACisvLworLy8gIEFOVExSVHJlZVdpemFyZC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA2LzE4LzEwLgorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWUuaCIKKyNpbXBvcnQgIkFOVExSTWFwRWxlbWVudC5oIgorI2ltcG9ydCAiQU5UTFJNYXAuaCIKKyNpbXBvcnQgIkFNdXRhYmxlQXJyYXkuaCIKKworQGNsYXNzIEFOVExSVmlzaXRvcjsKKworQHByb3RvY29sIEFOVExSQ29udGV4dFZpc2l0b3IgPE5TT2JqZWN0PgorLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgY2FsbGVkIHZpc2l0IG9yIHNvbWV0aGluZyBlbHNlPworLSAodm9pZCkgdmlzaXQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgUGFyZW50OihBTlRMUkNvbW1vblRyZWUgKilwYXJlbnQgQ2hpbGRJbmRleDooTlNJbnRlZ2VyKWNoaWxkSW5kZXggTWFwOihBTlRMUk1hcCAqKWxhYmVsczsKKworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSVmlzaXRvciA6IE5TT2JqZWN0IDxBTlRMUkNvbnRleHRWaXNpdG9yPiB7CisgICAgTlNJbnRlZ2VyIGFjdGlvbjsKKyAgICBpZCBhY3RvcjsKKyAgICBpZCBvYmplY3QxOworICAgIGlkIG9iamVjdDI7Cit9CisrIChBTlRMUlZpc2l0b3IgKiluZXdBTlRMUlZpc2l0b3I6KE5TSW50ZWdlcilhbkFjdGlvbiBBY3RvcjooaWQpYW5BY3RvciBPYmplY3Q6KGlkKWFuT2JqZWN0MSBPYmplY3Q6KGlkKWFuT2JqZWN0MjsKKy0gKGlkKSBpbml0V2l0aEFjdGlvbjooTlNJbnRlZ2VyKWFuQWN0aW9uIEFjdG9yOihpZClhbkFjdG9yIE9iamVjdDooaWQpYW5PYmplY3QxIE9iamVjdDooaWQpYW5PYmplY3QyOworCistICh2b2lkKSB2aXNpdDooQU5UTFJDb21tb25UcmVlICopdDsKKy0gKHZvaWQpIHZpc2l0OihBTlRMUkNvbW1vblRyZWUgKil0IFBhcmVudDooQU5UTFJDb21tb25UcmVlICopcGFyZW50IENoaWxkSW5kZXg6KE5TSW50ZWdlciljaGlsZEluZGV4IE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CisKK0Bwcm9wZXJ0eSBOU0ludGVnZXIgYWN0aW9uOworQHByb3BlcnR5IChyZXRhaW4pIGlkIGFjdG9yOworQHByb3BlcnR5IChyZXRhaW4pIGlkIG9iamVjdDE7CitAcHJvcGVydHkgKHJldGFpbikgaWQgb2JqZWN0MjsKK0BlbmQKKworLyoqIFdoZW4gdXNpbmcgJWxhYmVsOlRPS0VOTkFNRSBpbiBhIHRyZWUgZm9yIHBhcnNlKCksIHdlIG11c3QKKyAqICB0cmFjayB0aGUgbGFiZWwuCisgKi8KK0BpbnRlcmZhY2UgQU5UTFJUcmVlUGF0dGVybiA6IEFOVExSQ29tbW9uVHJlZSB7CisgICAgTlNTdHJpbmcgKmxhYmVsOworICAgIEJPT0wgICAgICBoYXNUZXh0QXJnOworfQorQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRMYWJlbCwgc2V0dGVyPXNldExhYmVsOikgTlNTdHJpbmcgKmxhYmVsOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRIYXNUZXh0QXJnLCBzZXR0ZXI9c2V0SGFzVGV4dEFyZzopIEJPT0wgaGFzVGV4dEFyZzsKKworKyAoQU5UTFJDb21tb25UcmVlICopbmV3QU5UTFJUcmVlUGF0dGVybjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKKworLSAoaWQpIGluaXRXaXRoVG9rZW46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CistIChOU1N0cmluZyAqKXRvU3RyaW5nOworQGVuZAorCitAaW50ZXJmYWNlIEFOVExSV2lsZGNhcmRUcmVlUGF0dGVybiA6IEFOVExSVHJlZVBhdHRlcm4geworfQorCisrIChBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gKiluZXdBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQ7CistIChpZCkgaW5pdFdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZDsKK0BlbmQKKworLyoqIFRoaXMgYWRhcHRvciBjcmVhdGVzIFRyZWVQYXR0ZXJuIG9iamVjdHMgZm9yIHVzZSBkdXJpbmcgc2NhbigpICovCitAaW50ZXJmYWNlIEFOVExSVHJlZVBhdHRlcm5UcmVlQWRhcHRvciA6IEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgeworfQorKyAoQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yICopbmV3VHJlZUFkYXB0b3I7CistIChpZCkgaW5pdDsKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWNyZWF0ZVRyZWVQYXR0ZXJuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkOworCitAZW5kCisKK0BpbnRlcmZhY2UgQU5UTFJUcmVlV2l6YXJkIDogTlNPYmplY3QgeworCWlkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7CisJQU5UTFJNYXAgKnRva2VuTmFtZVRvVHlwZU1hcDsKK30KKysgKEFOVExSVHJlZVdpemFyZCAqKSBuZXdBTlRMUlRyZWVXaXphcmQ6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKysgKEFOVExSVHJlZVdpemFyZCAqKW5ld0FOVExSVHJlZVdpemFyZDooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBNYXA6KEFOVExSTWFwICopYVRva2VuTmFtZVRvVHlwZU1hcDsKKysgKEFOVExSVHJlZVdpemFyZCAqKW5ld0FOVExSVHJlZVdpemFyZDooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvciBUb2tlbk5hbWVzOihOU0FycmF5ICopdGhlVG9rTmFtczsKKysgKEFOVExSVHJlZVdpemFyZCAqKW5ld0FOVExSVHJlZVdpemFyZFdpdGhUb2tlbk5hbWVzOihOU0FycmF5ICopdGhlVG9rTmFtczsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYWRhcHRvcjsKKy0gKGlkKSBpbml0V2l0aEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFkYXB0b3IgTWFwOihBTlRMUk1hcCAqKXRva2VuTmFtZVRvVHlwZU1hcDsKKy0gKGlkKSBpbml0V2l0aFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworLSAoaWQpIGluaXRXaXRoVG9rZW5OYW1lczooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yIFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworLSAodm9pZCkgZGVhbGxvYzsKKy0gKEFOVExSTWFwICopY29tcHV0ZVRva2VuVHlwZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zOworLSAoTlNJbnRlZ2VyKWdldFRva2VuVHlwZTooTlNTdHJpbmcgKil0b2tlbk5hbWU7CistIChBTlRMUk1hcCAqKWluZGV4OihBTlRMUkNvbW1vblRyZWUgKil0OworLSAodm9pZCkgX2luZGV4OihBTlRMUkNvbW1vblRyZWUgKil0IE1hcDooQU5UTFJNYXAgKiltOworLSAoQU11dGFibGVBcnJheSAqKWZpbmQ6KEFOVExSQ29tbW9uVHJlZSAqKSB0IFBhdHRlcm46KE5TU3RyaW5nICopcGF0dGVybjsKKy0gKEFOVExSVHJlZVdpemFyZCAqKWZpbmRGaXJzdDooQU5UTFJDb21tb25UcmVlICopIHQgVHlwZTooTlNJbnRlZ2VyKXR0eXBlOworLSAoQU5UTFJUcmVlV2l6YXJkICopZmluZEZpcnN0OihBTlRMUkNvbW1vblRyZWUgKikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistICh2b2lkKSB2aXNpdDooQU5UTFJDb21tb25UcmVlICopdCBUeXBlOihOU0ludGVnZXIpdHR5cGUgVmlzaXRvcjooQU5UTFJWaXNpdG9yICopdmlzaXRvcjsKKy0gKHZvaWQpIF92aXNpdDooQU5UTFJDb21tb25UcmVlICopdAorICAgICAgICAgUGFyZW50OihBTlRMUkNvbW1vblRyZWUgKilwYXJlbnQKKyAgICAgQ2hpbGRJbmRleDooTlNJbnRlZ2VyKWNoaWxkSW5kZXgKKyAgICAgICAgICAgVHlwZTooTlNJbnRlZ2VyKXR0eXBlCisgICAgICAgIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3I7CistICh2b2lkKXZpc2l0OihBTlRMUkNvbW1vblRyZWUgKil0IFBhdHRlcm46KE5TU3RyaW5nICopcGF0dGVybiBWaXNpdG9yOihBTlRMUlZpc2l0b3IgKil2aXNpdG9yOworLSAoQk9PTClwYXJzZTooQU5UTFJDb21tb25UcmVlICopdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm4gTWFwOihBTlRMUk1hcCAqKWxhYmVsczsKKy0gKEJPT0wpIHBhcnNlOihBTlRMUkNvbW1vblRyZWUgKikgdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm47CistIChCT09MKSBfcGFyc2U6KEFOVExSQ29tbW9uVHJlZSAqKXQxIFBhdHRlcm46KEFOVExSQ29tbW9uVHJlZSAqKXRwYXR0ZXJuIE1hcDooQU5UTFJNYXAgKilsYWJlbHM7CistIChBTlRMUkNvbW1vblRyZWUgKikgY3JlYXRlVHJlZTooTlNTdHJpbmcgKilwYXR0ZXJuOworLSAoQk9PTCllcXVhbHM6KGlkKXQxIE8yOihpZCl0MiBBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3I7CistIChCT09MKWVxdWFsczooaWQpdDEgTzI6KGlkKXQyOworLSAoQk9PTCkgX2VxdWFsczooaWQpdDEgTzI6KGlkKXQyIEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcjsKKworQHByb3BlcnR5IChyZXRhaW4pIGlkPEFOVExSVHJlZUFkYXB0b3I+IGFkYXB0b3I7CitAcHJvcGVydHkgKHJldGFpbikgQU5UTFJNYXAgKnRva2VuTmFtZVRvVHlwZU1hcDsKK0BlbmQKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlV2l6YXJkLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlRyZWVXaXphcmQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODEzMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJUcmVlV2l6YXJkLm0KQEAgLTAsMCArMSw3MzUgQEAKKy8vCisvLyAgQU5UTFJUcmVlV2l6YXJkLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvMTgvMTAuCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCAiQU5UTFJUcmVlV2l6YXJkLmgiCisjaW1wb3J0ICJBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIuaCIKKyNpbXBvcnQgIkFOVExSVHJlZVBhdHRlcm5QYXJzZXIuaCIKKyNpbXBvcnQgIkFOVExSSW50QXJyYXkuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSVmlzaXRvcgorCisrIChBTlRMUlZpc2l0b3IgKiluZXdBTlRMUlZpc2l0b3I6KE5TSW50ZWdlcilhbkFjdGlvbiBBY3RvcjooaWQpYW5BY3RvciBPYmplY3Q6KGlkKWFuT2JqZWN0MSBPYmplY3Q6KGlkKWFuT2JqZWN0MgoreworICAgIHJldHVybiBbW0FOVExSVmlzaXRvciBhbGxvY10gaW5pdFdpdGhBY3Rpb246YW5BY3Rpb24gQWN0b3I6KGlkKWFuQWN0b3IgT2JqZWN0OihpZClhbk9iamVjdDEgT2JqZWN0OihpZClhbk9iamVjdDJdOworfQorCistIChpZCkgaW5pdFdpdGhBY3Rpb246KE5TSW50ZWdlcilhbkFjdGlvbiBBY3RvcjooaWQpYW5BY3RvciBPYmplY3Q6KGlkKWFuT2JqZWN0MSBPYmplY3Q6KGlkKWFuT2JqZWN0MgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGFjdGlvbiA9IGFuQWN0aW9uOworICAgICAgICBhY3RvciA9IGFuQWN0b3I7CisgICAgICAgIGlmICggYWN0b3IgKSBbYWN0b3IgcmV0YWluXTsKKyAgICAgICAgb2JqZWN0MSA9IGFuT2JqZWN0MTsKKyAgICAgICAgaWYgKCBvYmplY3QxICkgW29iamVjdDEgcmV0YWluXTsKKyAgICAgICAgb2JqZWN0MiA9IGFuT2JqZWN0MjsKKyAgICAgICAgaWYgKCBvYmplY3QyICkgW29iamVjdDIgcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyNpZmRlZiBERUJVR19ERUFMTE9DCisgICAgTlNMb2coIEAiY2FsbGVkIGRlYWxsb2MgaW4gQU5UTFJWaXNpdG9yIiApOworI2VuZGlmCisgICAgaWYgKCBhY3RvciApIFthY3RvciByZWxlYXNlXTsKKyAgICBpZiAoIG9iamVjdDEgKSBbb2JqZWN0MSByZWxlYXNlXTsKKyAgICBpZiAoIG9iamVjdDIgKSBbb2JqZWN0MiByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKHZvaWQpIHZpc2l0OihBTlRMUkNvbW1vblRyZWUgKil0IFBhcmVudDooQU5UTFJDb21tb25UcmVlICopcGFyZW50IENoaWxkSW5kZXg6KE5TSW50ZWdlciljaGlsZEluZGV4IE1hcDooQU5UTFJNYXAgKilsYWJlbHMKK3sKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBbKEFOVExSTWFwICopb2JqZWN0MiAvKiBsYWJlbHMgKi8gY2xlYXJdOworICAgICAgICAgICAgaWYgKCBbKEFOVExSVHJlZVdpemFyZCAqKWFjdG9yIF9wYXJzZTp0IFBhdHRlcm46b2JqZWN0MS8qIHRwYXR0ZXJuICovIE1hcDpvYmplY3QyIC8qIGxhYmVscyAqL10gKSB7CisgICAgICAgICAgICAgICAgW3NlbGYgdmlzaXQ6dCBQYXJlbnQ6cGFyZW50IENoaWxkSW5kZXg6Y2hpbGRJbmRleCBNYXA6b2JqZWN0MiAvKiBsYWJlbHMgKi9dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmICggWyhBTlRMUlRyZWVXaXphcmQgKilhY3RvciBfcGFyc2U6dCBQYXR0ZXJuOm9iamVjdDEvKiB0cGF0dGVybiAqLyBNYXA6bmlsXSApIHsKKyAgICAgICAgICAgICAgICBbKEFNdXRhYmxlQXJyYXkgKilvYmplY3QyLyogc3VidHJlZXMgKi8gYWRkT2JqZWN0OnRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIFtzZWxmIHZpc2l0OnRdOworICAgIHJldHVybjsKK30KKworLSAodm9pZCkgdmlzaXQ6KEFOVExSQ29tbW9uVHJlZSAqKXQKK3sKKyAgICBbb2JqZWN0MSBhZGRPYmplY3Q6dF07CisgICAgcmV0dXJuOworfQorCitAc3ludGhlc2l6ZSBhY3Rpb247CitAc3ludGhlc2l6ZSBhY3RvcjsKK0BzeW50aGVzaXplIG9iamVjdDE7CitAc3ludGhlc2l6ZSBvYmplY3QyOworQGVuZAorCisvKiogV2hlbiB1c2luZyAlbGFiZWw6VE9LRU5OQU1FIGluIGEgdHJlZSBmb3IgcGFyc2UoKSwgd2UgbXVzdAorICogIHRyYWNrIHRoZSBsYWJlbC4KKyAqLworQGltcGxlbWVudGF0aW9uIEFOVExSVHJlZVBhdHRlcm4KKworQHN5bnRoZXNpemUgbGFiZWw7CitAc3ludGhlc2l6ZSBoYXNUZXh0QXJnOworCisrIChBTlRMUkNvbW1vblRyZWUgKiluZXdBTlRMUlRyZWVQYXR0ZXJuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkCit7CisgICAgcmV0dXJuIChBTlRMUkNvbW1vblRyZWUgKilbW0FOVExSVHJlZVBhdHRlcm4gYWxsb2NdIGluaXRXaXRoVG9rZW46cGF5bG9hZF07Cit9CisKKy0gKGlkKSBpbml0V2l0aFRva2VuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aFRva2VuOnBheWxvYWRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybiAoQU5UTFJDb21tb25UcmVlICopc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlRyZWVQYXR0ZXJuIiApOworI2VuZGlmCisgICAgaWYgKCBsYWJlbCApIFtsYWJlbCByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TU3RyaW5nICopdG9TdHJpbmcKK3sKKyAgICBpZiAoIGxhYmVsICE9IG5pbCApIHsKKyAgICAgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiXCUgJUAgOiAlQCIsIGxhYmVsLCBbc3VwZXIgdG9TdHJpbmddXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBbc3VwZXIgdG9TdHJpbmddOwkJCQkKKyAgICB9Cit9CisKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFOVExSV2lsZGNhcmRUcmVlUGF0dGVybgorCisrIChBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gKiluZXdBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm46KGlkPEFOVExSVG9rZW4+KXBheWxvYWQKK3sKKyAgICByZXR1cm4oQU5UTFJXaWxkY2FyZFRyZWVQYXR0ZXJuICopW1tBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gYWxsb2NdIGluaXRXaXRoVG9rZW46KGlkPEFOVExSVG9rZW4+KXBheWxvYWRdOworfQorCistIChpZCkgaW5pdFdpdGhUb2tlbjooaWQ8QU5UTFJUb2tlbj4pcGF5bG9hZAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlbjpwYXlsb2FkXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworQGVuZAorCisvKiogVGhpcyBhZGFwdG9yIGNyZWF0ZXMgVHJlZVBhdHRlcm4gb2JqZWN0cyBmb3IgdXNlIGR1cmluZyBzY2FuKCkgKi8KK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IKKworKyAoQU5UTFJUcmVlUGF0dGVyblRyZWVBZGFwdG9yICopbmV3VHJlZUFkYXB0b3IKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IgYWxsb2NdIGluaXRdOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWNyZWF0ZVRyZWVQYXR0ZXJuOihpZDxBTlRMUlRva2VuPilwYXlsb2FkCit7CisgICAgcmV0dXJuIChBTlRMUkNvbW1vblRyZWUgKilbc3VwZXIgY3JlYXRlOnBheWxvYWRdOworfQorICAgICAgICAgIAorQGVuZAorCitAaW1wbGVtZW50YXRpb24gQU5UTFJUcmVlV2l6YXJkCisKKy8vIFRPRE86IGJ1aWxkIGluZGV4ZXMgZm9yIHRoZSB3aXphcmQKKworLyoqIER1cmluZyBmaWxsQnVmZmVyKCksIHdlIGNhbiBtYWtlIGEgcmV2ZXJzZSBpbmRleCBmcm9tIGEgc2V0CisgKiAgb2YgdG9rZW4gdHlwZXMgb2YgaW50ZXJlc3QgdG8gdGhlIGxpc3Qgb2YgaW5kZXhlcyBpbnRvIHRoZQorICogIG5vZGUgc3RyZWFtLiAgVGhpcyBsZXRzIHVzIGNvbnZlcnQgYSBub2RlIHBvaW50ZXIgdG8gYQorICogIHN0cmVhbSBpbmRleCBzZW1pLWVmZmljaWVudGx5IGZvciBhIGxpc3Qgb2YgaW50ZXJlc3RpbmcKKyAqICBub2RlcyBzdWNoIGFzIGZ1bmN0aW9uIGRlZmluaXRpb24gbm9kZXMgKHlvdSdsbCB3YW50IHRvIHNlZWsKKyAqICB0byB0aGVpciBib2RpZXMgZm9yIGFuIGludGVycHJldGVyKS4gIEFsc28gdXNlZnVsIGZvciBkb2luZworICogIGR5bmFtaWMgc2VhcmNoZXM7IGkuZS4sIGdvIGZpbmQgbWUgYWxsIFBMVVMgbm9kZXMuCisgcHJvdGVjdGVkIE1hcCB0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXA7CisgCisgKiogSWYgdG9rZW5UeXBlc1RvUmV2ZXJzZUluZGV4IHNldCB0byBJTkRFWF9BTEwgdGhlbiBpbmRleGluZworICogIG9jY3VycyBmb3IgYWxsIHRva2VuIHR5cGVzLgorIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IElOREVYX0FMTCA9IG5ldyBIYXNoU2V0KCk7CisgCisgKiogQSBzZXQgb2YgdG9rZW4gdHlwZXMgdXNlciB3b3VsZCBsaWtlIHRvIGluZGV4IGZvciBmYXN0ZXIgbG9va3VwLgorICogIElmIHRoaXMgaXMgSU5ERVhfQUxMLCB0aGVuIGFsbCB0b2tlbiB0eXBlcyBhcmUgdHJhY2tlZC4gIElmIG5pbCwKKyAqICB0aGVuIG5vbmUgYXJlIGluZGV4ZWQuCisgcHJvdGVjdGVkIFNldCB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggPSBuaWw7CisgKi8KKworKyAoQU5UTFJUcmVlV2l6YXJkICopIG5ld0FOVExSVHJlZVdpemFyZDooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCit7CisgICAgcmV0dXJuIFtbQU5UTFJUcmVlV2l6YXJkIGFsbG9jXSBpbml0V2l0aEFkYXB0b3I6YW5BZGFwdG9yXTsKK30KKworKyAoQU5UTFJUcmVlV2l6YXJkICopbmV3QU5UTFJUcmVlV2l6YXJkOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IgTWFwOihBTlRMUk1hcCAqKWFUb2tlbk5hbWVUb1R5cGVNYXAKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRyZWVXaXphcmQgYWxsb2NdIGluaXRXaXRoQWRhcHRvcjphbkFkYXB0b3IgTWFwOmFUb2tlbk5hbWVUb1R5cGVNYXBdOworfQorCisrIChBTlRMUlRyZWVXaXphcmQgKiluZXdBTlRMUlRyZWVXaXphcmQ6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvciBUb2tlbk5hbWVzOihOU0FycmF5ICopdGhlVG9rTmFtcworeworICAgIHJldHVybiBbW0FOVExSVHJlZVdpemFyZCBhbGxvY10gaW5pdFdpdGhUb2tlbk5hbWVzOmFuQWRhcHRvciBUb2tlbk5hbWVzOnRoZVRva05hbXNdOworfQorCisrIChBTlRMUlRyZWVXaXphcmQgKiluZXdBTlRMUlRyZWVXaXphcmRXaXRoVG9rZW5OYW1lczooTlNBcnJheSAqKXRoZVRva05hbXMKK3sKKyAgICByZXR1cm4gW1tBTlRMUlRyZWVXaXphcmQgYWxsb2NdIGluaXRXaXRoVG9rZW5OYW1lczp0aGVUb2tOYW1zXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgYWRhcHRvciA9IGFuQWRhcHRvcjsKKyAgICAgICAgaWYgKCBhZGFwdG9yICkgW2FkYXB0b3IgcmV0YWluXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisgICAgICAgICAgICAKKy0gKGlkKSBpbml0V2l0aEFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvciBNYXA6KEFOVExSTWFwICopYVRva2VuTmFtZVRvVHlwZU1hcAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGFkYXB0b3IgPSBhbkFkYXB0b3I7CisgICAgICAgIGlmICggYWRhcHRvciApIFthZGFwdG9yIHJldGFpbl07CisgICAgICAgIHRva2VuTmFtZVRvVHlwZU1hcCA9IGFUb2tlbk5hbWVUb1R5cGVNYXA7CisgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFRva2VuTmFtZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyNwcmFnbWEgd2FybmluZyBGaXggaW5pdFdpdGhUb2tlbk5hbWVzLgorICAgICAgICAvLyBhZGFwdG9yID0gYW5BZGFwdG9yOworICAgICAgICAvL3Rva2VuTmFtZVRvVHlwZU1hcCA9IGFUb2tlbk5hbWVUb1R5cGVNYXA7CisgICAgICAgIHRva2VuTmFtZVRvVHlwZU1hcCA9IFtbc2VsZiBjb21wdXRlVG9rZW5UeXBlczp0aGVUb2tOYW1zXSByZXRhaW5dOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKyAgICAgICAgICAgICAKKy0gKGlkKSBpbml0V2l0aFRva2VuTmFtZXM6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvciBUb2tlbk5hbWVzOihOU0FycmF5ICopdGhlVG9rTmFtcworeworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisgICAgICAgIGFkYXB0b3IgPSBhbkFkYXB0b3I7CisgICAgICAgIGlmICggYWRhcHRvciApIFthZGFwdG9yIHJldGFpbl07CisgICAgICAgIC8vIHRva2VuTmFtZVRvVHlwZU1hcCA9IGFUb2tlbk5hbWVUb1R5cGVNYXA7CisgICAgICAgIHRva2VuTmFtZVRvVHlwZU1hcCA9IFtbc2VsZiBjb21wdXRlVG9rZW5UeXBlczp0aGVUb2tOYW1zXSByZXRhaW5dOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKyAgICAgICAgICAgIAorLSAodm9pZCkgZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IiICk7CisjZW5kaWYKKyAgICBpZiAoIGFkYXB0b3IgKSBbYWRhcHRvciByZWxlYXNlXTsKKyAgICBpZiAoIHRva2VuTmFtZVRvVHlwZU1hcCApIFt0b2tlbk5hbWVUb1R5cGVNYXAgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiogQ29tcHV0ZSBhIE1hcDxTdHJpbmcsIEludGVnZXI+IHRoYXQgaXMgYW4gaW52ZXJ0ZWQgaW5kZXggb2YKKyAqICB0b2tlbk5hbWVzICh3aGljaCBtYXBzIGludCB0b2tlbiB0eXBlcyB0byBuYW1lcykuCisgKi8KKy0gKEFOVExSTWFwICopY29tcHV0ZVRva2VuVHlwZXM6KE5TQXJyYXkgKil0aGVUb2tOYW1zCit7CisgICAgQU5UTFJNYXAgKm0gPSBbQU5UTFJNYXAgbmV3QU5UTFJNYXBdOworICAgIGlmICggdGhlVG9rTmFtcyA9PSBuaWwgKSB7CisgICAgICAgIHJldHVybiBtOworICAgIH0KKyAgICBmb3IgKGludCB0dHlwZSA9IEFOVExSVG9rZW5UeXBlTUlOOyB0dHlwZSA8IFt0aGVUb2tOYW1zIGNvdW50XTsgdHR5cGUrKykgeworICAgICAgICBOU1N0cmluZyAqbmFtZSA9IChOU1N0cmluZyAqKSBbdGhlVG9rTmFtcyBvYmplY3RBdEluZGV4OnR0eXBlXTsKKyAgICAgICAgW20gcHV0TmFtZTpuYW1lIFRUeXBlOnR0eXBlXTsKKyAgICB9CisgICAgcmV0dXJuIG07Cit9CisKKy8qKiBVc2luZyB0aGUgbWFwIG9mIHRva2VuIG5hbWVzIHRvIHRva2VuIHR5cGVzLCByZXR1cm4gdGhlIHR5cGUuICovCistIChOU0ludGVnZXIpZ2V0VG9rZW5UeXBlOihOU1N0cmluZyAqKXRva2VuTmFtZQoreworICAgIGlmICggdG9rZW5OYW1lVG9UeXBlTWFwID09IG5pbCApIHsKKyAgICAgICAgcmV0dXJuIEFOVExSVG9rZW5UeXBlSW52YWxpZDsKKyAgICB9CisgICAgTlNJbnRlZ2VyIGFUVHlwZSA9IChOU0ludGVnZXIpW3Rva2VuTmFtZVRvVHlwZU1hcCBnZXRUVHlwZTp0b2tlbk5hbWVdOworICAgIGlmICggYVRUeXBlICE9IC0xICkgeworICAgICAgICByZXR1cm4gYVRUeXBlOworICAgIH0KKyAgICByZXR1cm4gQU5UTFJUb2tlblR5cGVJbnZhbGlkOworfQorCisvKiogV2FsayB0aGUgZW50aXJlIHRyZWUgYW5kIG1ha2UgYSBub2RlIG5hbWUgdG8gbm9kZXMgbWFwcGluZy4KKyAqICBGb3Igbm93LCB1c2UgcmVjdXJzaW9uIGJ1dCBsYXRlciBub25yZWN1cnNpdmUgdmVyc2lvbiBtYXkgYmUKKyAqICBtb3JlIGVmZmljaWVudC4gIFJldHVybnMgTWFwPEludGVnZXIsIExpc3Q+IHdoZXJlIHRoZSBMaXN0IGlzCisgKiAgb2YgeW91ciBBU1Qgbm9kZSB0eXBlLiAgVGhlIEludGVnZXIgaXMgdGhlIHRva2VuIHR5cGUgb2YgdGhlIG5vZGUuCisgKgorICogIFRPRE86IHNhdmUgdGhpcyBpbmRleCBzbyB0aGF0IGZpbmQgYW5kIHZpc2l0IGFyZSBmYXN0ZXIKKyAqLworLSAoQU5UTFJNYXAgKilpbmRleDooQU5UTFJDb21tb25UcmVlICopdAoreworICAgIEFOVExSTWFwICptID0gW0FOVExSTWFwIG5ld0FOVExSTWFwXTsKKyAgICBbc2VsZiBfaW5kZXg6dCBNYXA6bV07CisgICAgcmV0dXJuIG07Cit9CisKKy8qKiBEbyB0aGUgd29yayBmb3IgaW5kZXggKi8KKy0gKHZvaWQpIF9pbmRleDooQU5UTFJDb21tb25UcmVlICopdCBNYXA6KEFOVExSTWFwICopbQoreworICAgIGlmICggdD09bmlsICkgeworICAgICAgICByZXR1cm47CisgICAgfQorI3ByYWdtYSB3YXJuaW5nIEZpeCBfaW5kZXggdXNlIG9mIEFOVExSTWFwLgorICAgIE5TSW50ZWdlciB0dHlwZSA9IFthZGFwdG9yIGdldFR5cGU6dF07CisgICAgQU5UTFJNYXAgKmVsZW1lbnRzID0gKEFOVExSTWFwICopW20gZ2V0TmFtZTp0dHlwZV07CisgICAgaWYgKCBlbGVtZW50cyA9PSBuaWwgKSB7CisgICAgICAgIGVsZW1lbnRzID0gW0FOVExSTWFwIG5ld0FOVExSTWFwV2l0aExlbjoxMDBdOworICAgICAgICBbbSBwdXROb2RlOnR0eXBlIE5vZGU6ZWxlbWVudHNdOworICAgIH0KKyAgICBbZWxlbWVudHMgYWRkT2JqZWN0OnRdOworICAgIGludCBuID0gW2FkYXB0b3IgZ2V0Q2hpbGRDb3VudDp0XTsKKyAgICBmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqIGNoaWxkID0gW2FkYXB0b3IgZ2V0Q2hpbGQ6dCBBdDppXTsKKyAgICAgICAgW3NlbGYgX2luZGV4OmNoaWxkIE1hcDptXTsKKyAgICB9Cit9CisKKy8qKiBSZXR1cm4gYSBMaXN0IG9mIHRyZWUgbm9kZXMgd2l0aCB0b2tlbiB0eXBlIHR0eXBlICovCistIChBTXV0YWJsZUFycmF5ICopZmluZDooQU5UTFJDb21tb25UcmVlICopdCBUeXBlOihOU0ludGVnZXIpdHR5cGUKK3sKKyNpZmRlZiBET05UVVNFTk9NTworICAgIGZpbmFsIExpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgdmlzaXQodCwgdHR5cGUsIG5ldyBUcmVlV2l6YXJkLlZpc2l0b3IoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisgICAgICAgICAgICBbbm9kZXMgYWRkT2JqZWN0IHRdOworICAgICAgICB9CisgICAgfSApOworI2VuZGlmCisgICAgQU11dGFibGVBcnJheSAqbm9kZXMgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxMDBdOworICAgIEFOVExSVmlzaXRvciAqY29udGV4dFZpc2l0b3IgPSBbQU5UTFJWaXNpdG9yIG5ld0FOVExSVmlzaXRvcjozIEFjdG9yOnNlbGYgT2JqZWN0OihpZClub2RlcyBPYmplY3Q6bmlsXTsKKyAgICBbc2VsZiB2aXNpdDp0IFR5cGU6dHR5cGUgVmlzaXRvcjpjb250ZXh0VmlzaXRvcl07CisgICAgcmV0dXJuIG5vZGVzOworfQorCisvKiogUmV0dXJuIGEgTGlzdCBvZiBzdWJ0cmVlcyBtYXRjaGluZyBwYXR0ZXJuLiAqLworLSAoQU11dGFibGVBcnJheSAqKWZpbmQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuCit7CisgICAgQU11dGFibGVBcnJheSAqc3VidHJlZXMgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxMDBdOworICAgIC8vIENyZWF0ZSBhIFRyZWVQYXR0ZXJuIGZyb20gdGhlIHBhdHRlcm4KKyAgICBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKnRva2VuaXplciA9IFtBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgbmV3QU5UTFJUcmVlUGF0dGVybkxleGVyOnBhdHRlcm5dOworICAgIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIgKnBhcnNlciA9IFtBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyIG5ld0FOVExSVHJlZVBhdHRlcm5QYXJzZXI6dG9rZW5pemVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l6YXJkOnNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0b3I6W0FOVExSVHJlZVBhdHRlcm5UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl1dOworICAgIEFOVExSQ29tbW9uVHJlZSAqdHBhdHRlcm4gPSAoQU5UTFJDb21tb25UcmVlICopW3BhcnNlciBwYXR0ZXJuXTsKKyAgICAvLyBkb24ndCBhbGxvdyBpbnZhbGlkIHBhdHRlcm5zCisgICAgaWYgKCB0cGF0dGVybiA9PSBuaWwgfHwKKyAgICAgICAgW3RwYXR0ZXJuIGlzTmlsXSB8fAorICAgICAgICBbdHBhdHRlcm4gY2xhc3NdID09IFtBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gY2xhc3NdICkKKyAgICB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIGludCByb290VG9rZW5UeXBlID0gW3RwYXR0ZXJuIHR5cGVdOworI2lmZGVmIERPTlRVU0VOT01PCisgICAgdmlzaXQodCwgcm9vdFRva2VuVHlwZSwgbmV3IFRyZWVXaXphcmQuQ29udGV4dFZpc2l0b3IoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0LCBPYmplY3QgcGFyZW50LCBpbnQgY2hpbGRJbmRleCwgTWFwIGxhYmVscykgeworICAgICAgICAgICAgaWYgKCBfcGFyc2UodCwgdHBhdHRlcm4sIG51bGwpICkgeworICAgICAgICAgICAgICAgIHN1YnRyZWVzLmFkZCh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gKTsKKyNlbmRpZgorICAgIEFOVExSVmlzaXRvciAqY29udGV4dFZpc2l0b3IgPSBbQU5UTFJWaXNpdG9yIG5ld0FOVExSVmlzaXRvcjoxIEFjdG9yOnNlbGYgT2JqZWN0OnRwYXR0ZXJuIE9iamVjdDpzdWJ0cmVlc107CisgICAgW3NlbGYgdmlzaXQ6dCBUeXBlOnJvb3RUb2tlblR5cGUgVmlzaXRvcjpjb250ZXh0VmlzaXRvcl07CisgICAgcmV0dXJuIHN1YnRyZWVzOworfQorCistIChBTlRMUlRyZWVXaXphcmQgKilmaW5kRmlyc3Q6KEFOVExSQ29tbW9uVHJlZSAqKSB0IFR5cGU6KE5TSW50ZWdlcil0dHlwZQoreworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKEFOVExSVHJlZVdpemFyZCAqKWZpbmRGaXJzdDooQU5UTFJDb21tb25UcmVlICopIHQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuCit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLyoqIFZpc2l0IGV2ZXJ5IHR0eXBlIG5vZGUgaW4gdCwgaW52b2tpbmcgdGhlIHZpc2l0b3IuICBUaGlzIGlzIGEgcXVpY2tlcgorICogIHZlcnNpb24gb2YgdGhlIGdlbmVyYWwgdmlzaXQodCwgcGF0dGVybikgbWV0aG9kLiAgVGhlIGxhYmVscyBhcmcKKyAqICBvZiB0aGUgdmlzaXRvciBhY3Rpb24gbWV0aG9kIGlzIG5ldmVyIHNldCAoaXQncyBuaWwpIHNpbmNlIHVzaW5nCisgKiAgYSB0b2tlbiB0eXBlIHJhdGhlciB0aGFuIGEgcGF0dGVybiBkb2Vzbid0IGxldCB1cyBzZXQgYSBsYWJlbC4KKyAqLworLSAodm9pZCkgdmlzaXQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgVHlwZTooTlNJbnRlZ2VyKXR0eXBlIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3IKK3sKKyAgICBbc2VsZiBfdmlzaXQ6dCBQYXJlbnQ6bmlsIENoaWxkSW5kZXg6MCBUeXBlOnR0eXBlIFZpc2l0b3I6dmlzaXRvcl07Cit9CisKKy8qKiBEbyB0aGUgcmVjdXJzaXZlIHdvcmsgZm9yIHZpc2l0ICovCistICh2b2lkKSBfdmlzaXQ6KEFOVExSQ29tbW9uVHJlZSAqKXQKKyAgICAgICAgIFBhcmVudDooQU5UTFJDb21tb25UcmVlICopcGFyZW50CisgICAgIENoaWxkSW5kZXg6KE5TSW50ZWdlciljaGlsZEluZGV4CisgICAgICAgICAgIFR5cGU6KE5TSW50ZWdlcil0dHlwZQorICAgICAgICBWaXNpdG9yOihBTlRMUlZpc2l0b3IgKil2aXNpdG9yCit7CisgICAgaWYgKCB0ID09IG5pbCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIFthZGFwdG9yIGdldFR5cGU6dF0gPT0gdHR5cGUgKSB7CisgICAgICAgIFt2aXNpdG9yIHZpc2l0OnQgUGFyZW50OnBhcmVudCBDaGlsZEluZGV4OmNoaWxkSW5kZXggTWFwOm5pbF07CisgICAgfQorICAgIGludCBuID0gW2FkYXB0b3IgZ2V0Q2hpbGRDb3VudDp0XTsKKyAgICBmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqIGNoaWxkID0gW2FkYXB0b3IgZ2V0Q2hpbGQ6dCBBdDppXTsKKyAgICAgICAgW3NlbGYgX3Zpc2l0OmNoaWxkIFBhcmVudDp0IENoaWxkSW5kZXg6aSBUeXBlOnR0eXBlIFZpc2l0b3I6dmlzaXRvcl07CisgICAgfQorfQorCisvKiogRm9yIGFsbCBzdWJ0cmVlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLCBleGVjdXRlIHRoZSB2aXNpdCBhY3Rpb24uCisgKiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGF0dGVybiBpbiBjb21iaW5hdGlvbgorICogIHdpdGggdmlzaXQodCwgdHR5cGUsIHZpc2l0b3IpIHNvIG5pbC1yb290ZWQgcGF0dGVybnMgYXJlIG5vdCBhbGxvd2VkLgorICogIFBhdHRlcm5zIHdpdGggd2lsZGNhcmQgcm9vdHMgYXJlIGFsc28gbm90IGFsbG93ZWQuCisgKi8KKy0gKHZvaWQpdmlzaXQ6KEFOVExSQ29tbW9uVHJlZSAqKXQgUGF0dGVybjooTlNTdHJpbmcgKilwYXR0ZXJuIFZpc2l0b3I6KEFOVExSVmlzaXRvciAqKXZpc2l0b3IKK3sKKyAgICAvLyBDcmVhdGUgYSBUcmVlUGF0dGVybiBmcm9tIHRoZSBwYXR0ZXJuCisgICAgQU5UTFJUcmVlUGF0dGVybkxleGVyICp0b2tlbml6ZXIgPSBbQU5UTFJUcmVlUGF0dGVybkxleGVyIG5ld0FOVExSVHJlZVBhdHRlcm5MZXhlcjpwYXR0ZXJuXTsKKyAgICBBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyICpwYXJzZXIgPQorICAgIFtBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyIG5ld0FOVExSVHJlZVBhdHRlcm5QYXJzZXI6dG9rZW5pemVyIFdpemFyZDpzZWxmIEFkYXB0b3I6W0FOVExSVHJlZVBhdHRlcm5UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl1dOworICAgIEFOVExSQ29tbW9uVHJlZSAqdHBhdHRlcm4gPSBbcGFyc2VyIHBhdHRlcm5dOworICAgIC8vIGRvbid0IGFsbG93IGludmFsaWQgcGF0dGVybnMKKyAgICBpZiAoIHRwYXR0ZXJuID09IG5pbCB8fAorICAgICAgICBbdHBhdHRlcm4gaXNOaWxdIHx8CisgICAgICAgIFt0cGF0dGVybiBjbGFzc10gPT0gW0FOVExSV2lsZGNhcmRUcmVlUGF0dGVybiBjbGFzc10gKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTlRMUk1hcEVsZW1lbnQgKmxhYmVscyA9IFtBTlRMUk1hcCBuZXdBTlRMUk1hcF07IC8vIHJldXNlZCBmb3IgZWFjaCBfcGFyc2UKKyAgICBpbnQgcm9vdFRva2VuVHlwZSA9IFt0cGF0dGVybiB0eXBlXTsKKyNwcmFnbWEgd2FybmluZyBUaGlzIGlzIGFub3RoZXIgb25lIG9mIHRob3NlIHNjcmV3eSBuZXN0ZWQgY29uc3RydWN0cyB0aGF0IEkgaGF2ZSB0byBmaWd1cmUgb3V0CisjaWZkZWYgRE9OVFVTRU5PTU8KKyAgICB2aXNpdCh0LCByb290VG9rZW5UeXBlLCBuZXcgVHJlZVdpemFyZC5Db250ZXh0VmlzaXRvcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQsIE9iamVjdCBwYXJlbnQsIGludCBjaGlsZEluZGV4LCBNYXAgdW51c2VkbGFiZWxzKSB7CisgICAgICAgICAgICAvLyB0aGUgdW51c2VkbGFiZWxzIGFyZyBpcyBudWxsIGFzIHZpc2l0IG9uIHRva2VuIHR5cGUgZG9lc24ndCBzZXQuCisgICAgICAgICAgICBsYWJlbHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmICggX3BhcnNlKHQsIHRwYXR0ZXJuLCBsYWJlbHMpICkgeworICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQodCwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7CisjZW5kaWYKKyAgICBBTlRMUlZpc2l0b3IgKmNvbnRleHRWaXNpdG9yID0gW0FOVExSVmlzaXRvciBuZXdBTlRMUlZpc2l0b3I6MCBBY3RvcjpzZWxmIE9iamVjdDp0cGF0dGVybiBPYmplY3Q6bGFiZWxzXTsKKyAgICBbc2VsZiB2aXNpdDp0IFR5cGU6cm9vdFRva2VuVHlwZSBWaXNpdG9yOmNvbnRleHRWaXNpdG9yXTsKK30KKworLyoqIEdpdmVuIGEgcGF0dGVybiBsaWtlIChBU1NJR04gJWxoczpJRCAlcmhzOi4pIHdpdGggb3B0aW9uYWwgbGFiZWxzCisgKiAgb24gdGhlIHZhcmlvdXMgbm9kZXMgYW5kICcuJyAoZG90KSBhcyB0aGUgbm9kZS9zdWJ0cmVlIHdpbGRjYXJkLAorICogIHJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgYW5kIGZpbGwgdGhlIGxhYmVscyBNYXAgd2l0aAorICogIHRoZSBsYWJlbHMgcG9pbnRpbmcgYXQgdGhlIGFwcHJvcHJpYXRlIG5vZGVzLiAgUmV0dXJuIGZhbHNlIGlmCisgKiAgdGhlIHBhdHRlcm4gaXMgbWFsZm9ybWVkIG9yIHRoZSB0cmVlIGRvZXMgbm90IG1hdGNoLgorICoKKyAqICBJZiBhIG5vZGUgc3BlY2lmaWVzIGEgdGV4dCBhcmcgaW4gcGF0dGVybiwgdGhlbiB0aGF0IG11c3QgbWF0Y2gKKyAqICBmb3IgdGhhdCBub2RlIGluIHQuCisgKgorICogIFRPRE86IHdoYXQncyBhIGJldHRlciB3YXkgdG8gaW5kaWNhdGUgYmFkIHBhdHRlcm4/IEV4Y2VwdGlvbnMgYXJlIGEgaGFzc2xlIAorICovCistIChCT09MKXBhcnNlOihBTlRMUkNvbW1vblRyZWUgKil0IFBhdHRlcm46KE5TU3RyaW5nICopcGF0dGVybiBNYXA6KEFOVExSTWFwICopbGFiZWxzCit7CisjaWZkZWYgRE9OVFVTRU5PTU8KKyAgICBUcmVlUGF0dGVybkxleGVyIHRva2VuaXplciA9IG5ldyBUcmVlUGF0dGVybkxleGVyKHBhdHRlcm4pOworICAgIFRyZWVQYXR0ZXJuUGFyc2VyIHBhcnNlciA9CisgICAgbmV3IFRyZWVQYXR0ZXJuUGFyc2VyKHRva2VuaXplciwgdGhpcywgbmV3IFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoKSk7CisgICAgVHJlZVBhdHRlcm4gdHBhdHRlcm4gPSAoVHJlZVBhdHRlcm4pcGFyc2VyLnBhdHRlcm4oKTsKKyAgICAvKgorICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInQ9IisoKFRyZWUpdCkudG9TdHJpbmdUcmVlKCkpOworICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW50PSIrdHBhdHRlcm4udG9TdHJpbmdUcmVlKCkpOworICAgICAqLworICAgIGJvb2xlYW4gbWF0Y2hlZCA9IF9wYXJzZSh0LCB0cGF0dGVybiwgbGFiZWxzKTsKKyAgICByZXR1cm4gbWF0Y2hlZDsKKyNlbmRpZgorICAgIEFOVExSVHJlZVBhdHRlcm5MZXhlciAqdG9rZW5pemVyID0gW0FOVExSVHJlZVBhdHRlcm5MZXhlciBuZXdBTlRMUlRyZWVQYXR0ZXJuTGV4ZXI6cGF0dGVybl07CisgICAgQU5UTFJUcmVlUGF0dGVyblBhcnNlciAqcGFyc2VyID0gW0FOVExSVHJlZVBhdHRlcm5QYXJzZXIgbmV3QU5UTFJUcmVlUGF0dGVyblBhcnNlcjp0b2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l6YXJkOnNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdG9yOltBTlRMUlRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdXTsKKyAgICBBTlRMUkNvbW1vblRyZWUgKnRwYXR0ZXJuID0gW3BhcnNlciBwYXR0ZXJuXTsKKyAgICAvKgorICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInQ9IisoKFRyZWUpdCkudG9TdHJpbmdUcmVlKCkpOworICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW50PSIrdHBhdHRlcm4udG9TdHJpbmdUcmVlKCkpOworICAgICAqLworICAgIC8vQk9PTCBtYXRjaGVkID0gW3NlbGYgX3BhcnNlOnQgUGF0dGVybjp0cGF0dGVybiBNYXA6bGFiZWxzXTsKKyAgICAvL3JldHVybiBtYXRjaGVkOworICAgIHJldHVybiBbc2VsZiBfcGFyc2U6dCBQYXR0ZXJuOnRwYXR0ZXJuIE1hcDpsYWJlbHNdOworfQorCistIChCT09MKSBwYXJzZTooQU5UTFJDb21tb25UcmVlICopdCBQYXR0ZXJuOihOU1N0cmluZyAqKXBhdHRlcm4KK3sKKyAgICByZXR1cm4gW3NlbGYgcGFyc2U6dCBQYXR0ZXJuOnBhdHRlcm4gTWFwOm5pbF07Cit9CisKKy8qKiBEbyB0aGUgd29yayBmb3IgcGFyc2UuIENoZWNrIHRvIHNlZSBpZiB0aGUgdDIgcGF0dGVybiBmaXRzIHRoZQorICogIHN0cnVjdHVyZSBhbmQgdG9rZW4gdHlwZXMgaW4gdDEuICBDaGVjayB0ZXh0IGlmIHRoZSBwYXR0ZXJuIGhhcworICogIHRleHQgYXJndW1lbnRzIG9uIG5vZGVzLiAgRmlsbCBsYWJlbHMgbWFwIHdpdGggcG9pbnRlcnMgdG8gbm9kZXMKKyAqICBpbiB0cmVlIG1hdGNoZWQgYWdhaW5zdCBub2RlcyBpbiBwYXR0ZXJuIHdpdGggbGFiZWxzLgorICovCistIChCT09MKSBfcGFyc2U6KEFOVExSQ29tbW9uVHJlZSAqKXQxIFBhdHRlcm46KEFOVExSQ29tbW9uVHJlZSAqKWFUUGF0dGVybiBNYXA6KEFOVExSTWFwICopbGFiZWxzCit7CisgICAgQU5UTFJUcmVlUGF0dGVybiAqdHBhdHRlcm47CisgICAgLy8gbWFrZSBzdXJlIGJvdGggYXJlIG5vbi1uaWwKKyAgICBpZiAoIHQxID09IG5pbCB8fCBhVFBhdHRlcm4gPT0gbmlsICkgeworICAgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICggW2FUUGF0dGVybiBpc0tpbmRPZkNsYXNzOltBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gY2xhc3NdXSApIHsKKyAgICAgICAgdHBhdHRlcm4gPSAoQU5UTFJUcmVlUGF0dGVybiAqKWFUUGF0dGVybjsKKyAgICB9CisgICAgLy8gY2hlY2sgcm9vdHMgKHdpbGRjYXJkIG1hdGNoZXMgYW55dGhpbmcpCisgICAgaWYgKCBbdHBhdHRlcm4gY2xhc3NdICE9IFtBTlRMUldpbGRjYXJkVHJlZVBhdHRlcm4gY2xhc3NdICkgeworICAgICAgICBpZiAoIFthZGFwdG9yIGdldFR5cGU6dDFdICE9IFt0cGF0dGVybiB0eXBlXSApCisgICAgICAgICAgICByZXR1cm4gTk87CisgICAgICAgIC8vIGlmIHBhdHRlcm4gaGFzIHRleHQsIGNoZWNrIG5vZGUgdGV4dAorICAgICAgICBpZiAoIHRwYXR0ZXJuLmhhc1RleHRBcmcgJiYgIVtbYWRhcHRvciBnZXRUZXh0OnQxXSBpc0VxdWFsVG9TdHJpbmc6W3RwYXR0ZXJuIHRleHRdXSApIHsKKyAgICAgICAgICAgIHJldHVybiBOTzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHRwYXR0ZXJuLmxhYmVsICE9IG5pbCAmJiBsYWJlbHMhPW5pbCApIHsKKyAgICAgICAgLy8gbWFwIGxhYmVsIGluIHBhdHRlcm4gdG8gbm9kZSBpbiB0MQorICAgICAgICBbbGFiZWxzIHB1dE5hbWU6dHBhdHRlcm4ubGFiZWwgTm9kZTp0MV07CisgICAgfQorICAgIC8vIGNoZWNrIGNoaWxkcmVuCisgICAgaW50IG4xID0gW2FkYXB0b3IgZ2V0Q2hpbGRDb3VudDp0MV07CisgICAgaW50IG4yID0gW3RwYXR0ZXJuIGdldENoaWxkQ291bnRdOworICAgIGlmICggbjEgIT0gbjIgKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgZm9yIChpbnQgaT0wOyBpPG4xOyBpKyspIHsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICogY2hpbGQxID0gW2FkYXB0b3IgZ2V0Q2hpbGQ6dDEgQXQ6aV07CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqY2hpbGQyID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cGF0dGVybiBnZXRDaGlsZDppXTsKKyAgICAgICAgaWYgKCAhW3NlbGYgX3BhcnNlOmNoaWxkMSBQYXR0ZXJuOmNoaWxkMiBNYXA6bGFiZWxzXSApIHsKKyAgICAgICAgICAgIHJldHVybiBOTzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWUVTOworfQorCisvKiogQ3JlYXRlIGEgdHJlZSBvciBub2RlIGZyb20gdGhlIGluZGljYXRlZCB0cmVlIHBhdHRlcm4gdGhhdCBjbG9zZWx5CisgKiAgZm9sbG93cyBBTlRMUiB0cmVlIGdyYW1tYXIgdHJlZSBlbGVtZW50IHN5bnRheDoKKyAqCisgKiAJCShyb290IGNoaWxkMSAuLi4gY2hpbGQyKS4KKyAqCisgKiAgWW91IGNhbiBhbHNvIGp1c3QgcGFzcyBpbiBhIG5vZGU6IElECisgKiAKKyAqICBBbnkgbm9kZSBjYW4gaGF2ZSBhIHRleHQgYXJndW1lbnQ6IElEW2Zvb10KKyAqICAobm90aWNlIHRoZXJlIGFyZSBubyBxdW90ZXMgYXJvdW5kIGZvby0taXQncyBjbGVhciBpdCdzIGEgc3RyaW5nKS4KKyAqCisgKiAgbmlsIGlzIGEgc3BlY2lhbCBuYW1lIG1lYW5pbmcgImdpdmUgbWUgYSBuaWwgbm9kZSIuICBVc2VmdWwgZm9yCisgKiAgbWFraW5nIGxpc3RzOiAobmlsIEEgQiBDKSBpcyBhIGxpc3Qgb2YgQSBCIEMuCisgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBjcmVhdGVUcmVlOihOU1N0cmluZyAqKXBhdHRlcm4KK3sKKyAgICBBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgKnRva2VuaXplciA9IFtBTlRMUlRyZWVQYXR0ZXJuTGV4ZXIgbmV3QU5UTFJUcmVlUGF0dGVybkxleGVyOnBhdHRlcm5dOworICAgIEFOVExSVHJlZVBhdHRlcm5QYXJzZXIgKnBhcnNlciA9IFtBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyIG5ld0FOVExSVHJlZVBhdHRlcm5QYXJzZXI6dG9rZW5pemVyIFdpemFyZDpzZWxmIEFkYXB0b3I6YWRhcHRvcl07CisgICAgQU5UTFJDb21tb25UcmVlICogdCA9IFtwYXJzZXIgcGF0dGVybl07CisgICAgcmV0dXJuIHQ7Cit9CisKKy8qKiBDb21wYXJlIHQxIGFuZCB0MjsgcmV0dXJuIHRydWUgaWYgdG9rZW4gdHlwZXMvdGV4dCwgc3RydWN0dXJlIG1hdGNoIGV4YWN0bHkuCisgKiAgVGhlIHRyZWVzIGFyZSBleGFtaW5lZCBpbiB0aGVpciBlbnRpcmV0eSBzbyB0aGF0IChBIEIpIGRvZXMgbm90IG1hdGNoCisgKiAgKEEgQiBDKSBub3IgKEEgKEIgQykpLiAKKyAvLyBUT0RPOiBhbGxvdyB0aGVtIHRvIHBhc3MgaW4gYSBjb21wYXJhdG9yCisgKiAgVE9ETzogaGF2ZSBhIHZlcnNpb24gdGhhdCBpcyBub25zdGF0aWMgc28gaXQgY2FuIHVzZSBpbnN0YW5jZSBhZGFwdG9yCisgKgorICogIEkgY2Fubm90IHJlbHkgb24gdGhlIHRyZWUgbm9kZSdzIGVxdWFscygpIGltcGxlbWVudGF0aW9uIGFzIEkgbWFrZQorICogIG5vIGNvbnN0cmFpbnRzIGF0IGFsbCBvbiB0aGUgbm9kZSB0eXBlcyBub3IgaW50ZXJmYWNlIGV0Yy4uLiAKKyAqLworLSAoQk9PTCllcXVhbHM6KGlkKXQxIE8yOihpZCl0MiBBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhbkFkYXB0b3IKK3sKKyAgICByZXR1cm4gW3NlbGYgX2VxdWFsczp0MSBPMjp0MiBBZGFwdG9yOmFuQWRhcHRvcl07Cit9CisKKy8qKiBDb21wYXJlIHR5cGUsIHN0cnVjdHVyZSwgYW5kIHRleHQgb2YgdHdvIHRyZWVzLCBhc3N1bWluZyBhZGFwdG9yIGluCisgKiAgdGhpcyBpbnN0YW5jZSBvZiBhIFRyZWVXaXphcmQuCisgKi8KKy0gKEJPT0wpZXF1YWxzOihpZCl0MSBPMjooaWQpdDIKK3sKKyAgICByZXR1cm4gW3NlbGYgX2VxdWFsczp0MSBPMjp0MiBBZGFwdG9yOmFkYXB0b3JdOworfQorCistIChCT09MKSBfZXF1YWxzOihpZCl0MSBPMjooaWQpdDIgQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYW5BZGFwdG9yCit7CisgICAgLy8gbWFrZSBzdXJlIGJvdGggYXJlIG5vbi1uaWwKKyAgICBpZiAoIHQxPT1uaWwgfHwgdDI9PW5pbCApIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICAvLyBjaGVjayByb290cworICAgIGlmICggW2FuQWRhcHRvciBnZXRUeXBlOnQxXSAhPSBbYW5BZGFwdG9yIGdldFR5cGU6dDJdICkgeworICAgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICggIVtbYW5BZGFwdG9yIGdldFRleHQ6dDFdIGlzRXF1YWxUbzpbYW5BZGFwdG9yIGdldFRleHQ6dDJdXSApIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICAvLyBjaGVjayBjaGlsZHJlbgorICAgIE5TSW50ZWdlciBuMSA9IFthbkFkYXB0b3IgZ2V0Q2hpbGRDb3VudDp0MV07CisgICAgTlNJbnRlZ2VyIG4yID0gW2FuQWRhcHRvciBnZXRDaGlsZENvdW50OnQyXTsKKyAgICBpZiAoIG4xICE9IG4yICkgeworICAgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGZvciAoaW50IGk9MDsgaTxuMTsgaSsrKSB7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqIGNoaWxkMSA9IFthbkFkYXB0b3IgZ2V0Q2hpbGQ6dDEgQXQ6aV07CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqIGNoaWxkMiA9IFthbkFkYXB0b3IgZ2V0Q2hpbGQ6dDIgQXQ6aV07CisgICAgICAgIGlmICggIVtzZWxmIF9lcXVhbHM6Y2hpbGQxIE8yOmNoaWxkMiBBZGFwdG9yOmFuQWRhcHRvcl0gKSB7CisgICAgICAgICAgICByZXR1cm4gTk87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFlFUzsKK30KKworLy8gVE9ETzogbmV4dCBzdHVmZiB0YWtlbiBmcm9tIENvbW1vblRyZWVOb2RlU3RyZWFtCisKKy8qKiBHaXZlbiBhIG5vZGUsIGFkZCB0aGlzIHRvIHRoZSByZXZlcnNlIGluZGV4IHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcC4KKyAqICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFsdGVyIGhvdyBpbmRleGluZyBvY2N1cnMuICBUaGUKKyAqICBkZWZhdWx0IGlzIHRvIGNyZWF0ZSBhCisgKgorICogICAgTWFwPEludGVnZXIgdG9rZW4gdHlwZSxBcnJheUxpc3Q8SW50ZWdlciBzdHJlYW0gaW5kZXg+PgorICoKKyAqICBUaGlzIGRhdGEgc3RydWN0dXJlIGFsbG93cyB5b3UgdG8gZmluZCBhbGwgbm9kZXMgd2l0aCB0eXBlIElOVCBpbiBvcmRlci4KKyAqCisgKiAgSWYgeW91IHJlYWxseSBuZWVkIHRvIGZpbmQgYSBub2RlIG9mIHR5cGUsIHNheSwgRlVOQyBxdWlja2x5IHRoZW4gcGVyaGFwcworICoKKyAqICAgIE1hcDxJbnRlZ2VydG9rZW4gdHlwZSwgTWFwPE9iamVjdCB0cmVlIG5vZGUsIEludGVnZXIgc3RyZWFtIGluZGV4Pj4KKyAqCisgKiAgd291bGQgYmUgYmV0dGVyIGZvciB5b3UuICBUaGUgaW50ZXJpb3IgbWFwcyBtYXAgYSB0cmVlIG5vZGUgdG8KKyAqICB0aGUgaW5kZXggc28geW91IGRvbid0IGhhdmUgdG8gc2VhcmNoIGxpbmVhcmx5IGZvciBhIHNwZWNpZmljIG5vZGUuCisgKgorICogIElmIHlvdSBjaGFuZ2UgdGhpcyBtZXRob2QsIHlvdSB3aWxsIGxpa2VseSBuZWVkIHRvIGNoYW5nZQorICogIGdldE5vZGVJbmRleCgpLCB3aGljaCBleHRyYWN0cyBpbmZvcm1hdGlvbi4KKy0gKHZvaWQpZmlsbFJldmVyc2VJbmRleDooQU5UTFJDb21tb25UcmVlICopbm9kZSBJbmRleDooTlNJbnRlZ2VyKXN0cmVhbUluZGV4Cit7CisgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJldkluZGV4ICIrbm9kZSsiQCIrc3RyZWFtSW5kZXgpOworICAgIGlmICggdG9rZW5UeXBlc1RvUmV2ZXJzZUluZGV4ID09IG5pbCApIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBpbmRleGluZyBpZiB0aGlzIGlzIGVtcHR5IChub3RoaW5nIG9mIGludGVyZXN0KQorICAgIH0KKyAgICBpZiAoIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCA9PSBuaWwgKSB7CisgICAgICAgIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcCA9IFtBTlRMUk1hcCBuZXdBTlRMUk1hcF07IC8vIGZpcnN0IGluZGV4aW5nIG9wCisgICAgfQorICAgIGludCB0b2tlblR5cGUgPSBbYWRhcHRvciBnZXRUeXBlOm5vZGVdOworICAgIEludGVnZXIgdG9rZW5UeXBlSSA9IG5ldyBJbnRlZ2VyKHRva2VuVHlwZSk7CisgICAgaWYgKCAhKHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBJTkRFWF9BTEwgfHwKKyAgICAgICAgICAgIFt0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggY29udGFpbnM6dG9rZW5UeXBlSV0pICkgeworICAgICAgICByZXR1cm47IC8vIHRva2VuVHlwZSBub3Qgb2YgaW50ZXJlc3QKKyAgICB9CisgICAgTlNJbnRlZ2VyIHN0cmVhbUluZGV4SSA9IHN0cmVhbUluZGV4OworICAgIEFNdXRhYmxlQXJyYXkgKmluZGV4ZXMgPSAoQU11dGFibGVBcnJheSAqKVt0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAgb2JqZWN0QXRJbmRleDp0b2tlblR5cGVJXTsKKyAgICBpZiAoIGluZGV4ZXM9PW5pbCApIHsKKyAgICAgICAgaW5kZXhlcyA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjEwMF07IC8vIG5vIGxpc3QgeWV0IGZvciB0aGlzIHRva2VuIHR5cGUKKyAgICAgICAgaW5kZXhlcy5hZGQoc3RyZWFtSW5kZXhJKTsgLy8gbm90IHRoZXJlIHlldCwgYWRkCisgICAgICAgIFt0b2tlblR5cGVUb1N0cmVhbUluZGV4ZXNNYXAgcHV0OnRva2VuVHlwZUkgSWRleGVzOmluZGV4ZXNdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCAhW2luZGV4ZXMgY29udGFpbnM6c3RyZWFtSW5kZXhJXSApIHsKKyAgICAgICAgICAgIFtpbmRleGVzIGFkZDpzdHJlYW1JbmRleEldOyAvLyBub3QgdGhlcmUgeWV0LCBhZGQKKyAgICAgICAgfQorICAgIH0KK30KKyAKKyAqKiBUcmFjayB0aGUgaW5kaWNhdGVkIHRva2VuIHR5cGUgaW4gdGhlIHJldmVyc2UgaW5kZXguICBDYWxsIHRoaXMKKyAqICByZXBlYXRlZGx5IGZvciBlYWNoIHR5cGUgb3IgdXNlIHZhcmlhbnQgd2l0aCBTZXQgYXJndW1lbnQgdG8KKyAqICBzZXQgYWxsIGF0IG9uY2UuCisgKiBAcGFyYW0gdG9rZW5UeXBlCitwdWJsaWMgdm9pZCByZXZlcnNlSW5kZXg6KE5TSW50ZWdlcil0b2tlblR5cGUKK3sKKyAgICBpZiAoIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9PSBuaWwgKSB7CisgICAgICAgIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleCA9IFtBTlRMUk1hcCBuZXdBTlRMUk1hcF07CisgICAgfQorICAgIGVsc2UgaWYgKCB0b2tlblR5cGVzVG9SZXZlcnNlSW5kZXggPT0gSU5ERVhfQUxMICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRva2VuVHlwZXNUb1JldmVyc2VJbmRleC5hZGQobmV3IEludGVnZXIodG9rZW5UeXBlKSk7Cit9CisgCisqKiBUcmFjayB0aGUgaW5kaWNhdGVkIHRva2VuIHR5cGVzIGluIHRoZSByZXZlcnNlIGluZGV4LiBTZXQKKyAqICB0byBJTkRFWF9BTEwgdG8gdHJhY2sgYWxsIHRva2VuIHR5cGVzLgorcHVibGljIHZvaWQgcmV2ZXJzZUluZGV4KFNldCB0b2tlblR5cGVzKSB7CisgICAgdG9rZW5UeXBlc1RvUmV2ZXJzZUluZGV4ID0gdG9rZW5UeXBlczsKK30KKyAKKyAqKiBHaXZlbiBhIG5vZGUgcG9pbnRlciwgcmV0dXJuIGl0cyBpbmRleCBpbnRvIHRoZSBub2RlIHN0cmVhbS4KKyAqICBUaGlzIGlzIG5vdCBpdHMgVG9rZW4gc3RyZWFtIGluZGV4LiAgSWYgdGhlcmUgaXMgbm8gcmV2ZXJzZSBtYXAKKyAqICBmcm9tIG5vZGUgdG8gc3RyZWFtIGluZGV4IG9yIHRoZSBtYXAgZG9lcyBub3QgY29udGFpbiBlbnRyaWVzCisgKiAgZm9yIG5vZGUncyB0b2tlbiB0eXBlLCBhIGxpbmVhciBzZWFyY2ggb2YgZW50aXJlIHN0cmVhbSBpcyB1c2VkLgorICoKKyAqICBSZXR1cm4gLTEgaWYgZXhhY3Qgbm9kZSBwb2ludGVyIG5vdCBpbiBzdHJlYW0uCitwdWJsaWMgaW50IGdldE5vZGVJbmRleChPYmplY3Qgbm9kZSkgeworICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXQgIitub2RlKTsKKyAgICBpZiAoIHRva2VuVHlwZVRvU3RyZWFtSW5kZXhlc01hcD09bmlsICkgeworICAgICAgICByZXR1cm4gZ2V0Tm9kZUluZGV4TGluZWFybHkobm9kZSk7CisgICAgfQorICAgIGludCB0b2tlblR5cGUgPSBhZGFwdG9yLmdldFR5cGUobm9kZSk7CisgICAgSW50ZWdlciB0b2tlblR5cGVJID0gbmV3IEludGVnZXIodG9rZW5UeXBlKTsKKyAgICBBcnJheUxpc3QgaW5kZXhlcyA9IChBcnJheUxpc3QpdG9rZW5UeXBlVG9TdHJlYW1JbmRleGVzTWFwLmdldCh0b2tlblR5cGVJKTsKKyAgICBpZiAoIGluZGV4ZXM9PW5pbCApIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGxpbmVhcmx5OyBzdHJlYW0gaW5kZXggPSAiK2dldE5vZGVJbmRleExpbmVhcmx5KG5vZGUpKTsKKyAgICAgICAgcmV0dXJuIGdldE5vZGVJbmRleExpbmVhcmx5KG5vZGUpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgSW50ZWdlciBzdHJlYW1JbmRleEkgPSAoSW50ZWdlcilpbmRleGVzLmdldChpKTsKKyAgICAgICAgT2JqZWN0IG4gPSBnZXQoc3RyZWFtSW5kZXhJLmludFZhbHVlKCkpOworICAgICAgICBpZiAoIG49PW5vZGUgKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgaW4gaW5kZXg7IHN0cmVhbSBpbmRleCA9ICIrc3RyZWFtSW5kZXhJKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmRleEkuaW50VmFsdWUoKTsgLy8gZm91bmQgaXQhCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorIAorKi8KKworQHN5bnRoZXNpemUgYWRhcHRvcjsKK0BzeW50aGVzaXplIHRva2VuTmFtZVRvVHlwZU1hcDsKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWY5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTIyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJUcmVlTm9kZVN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisKK0BpbnRlcmZhY2UgQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0gOiBOU09iamVjdCA8IEFOVExSVHJlZU5vZGVTdHJlYW0gPiB7CisKKwlCT09MIHNob3VsZFVzZVVuaXF1ZU5hdmlnYXRpb25Ob2RlczsKKworCUFOVExSQ29tbW9uVHJlZSAqcm9vdDsKKwlBTlRMUkNvbW1vblRyZWUgKmN1cnJlbnROb2RlOworCUFOVExSQ29tbW9uVHJlZSAqcHJldmlvdXNOb2RlOworCisJaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CisJCisJaWQ8QU5UTFJUb2tlblN0cmVhbT4gdG9rZW5TdHJlYW07CisJCisJTlNNdXRhYmxlQXJyYXkgKm5vZGVTdGFjazsKKwlOU011dGFibGVBcnJheSAqaW5kZXhTdGFjazsKKwlBTlRMUlB0ckJ1ZmZlciAqbWFya2VyczsKKwlOU0ludGVnZXIgbGFzdE1hcmtlcjsKKwkKKwlOU0ludGVnZXIgY3VycmVudENoaWxkSW5kZXg7CisJTlNJbnRlZ2VyIGFic29sdXRlTm9kZUluZGV4OworCQorCU5TTXV0YWJsZUFycmF5ICpsb29rYWhlYWQ7CisJTlNVSW50ZWdlciBoZWFkOworCU5TVUludGVnZXIgdGFpbDsKK30KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRSb290LCBzZXR0ZXI9c2V0Um9vdDopIEFOVExSQ29tbW9uVHJlZSAqcm9vdDsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Q3VycmVudE5vZGUsIHNldHRlcj1zZXRDdXJyZW50Tm9kZTopIEFOVExSQ29tbW9uVHJlZSAqY3VycmVudE5vZGU7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFByZXZpb3VzTm9kZSwgc2V0dGVyPXNldFByZXZpb3VzTm9kZTopIEFOVExSQ29tbW9uVHJlZSAqcHJldmlvdXNOb2RlOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlQWRhcHRvciwgc2V0dGVyPXNldFRyZWVBZGFwdG9yOikgaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7CitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRva2VuU3RyZWFtLCBzZXR0ZXI9c2V0VG9rZW5TdHJlYW06KSBpZDxBTlRMUlRva2VuU3RyZWFtPiB0b2tlblN0cmVhbTsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0Tm9kZVN0YWNrLCBzZXR0ZXI9c2V0Tm9kZVN0YWNrOikgTlNNdXRhYmxlQXJyYXkgKm5vZGVTdGFjazsKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0SW5kZXhTdGFjaywgc2V0dGVyPXNldEluZGV4U3RhY2tTdGFjazopIE5TTXV0YWJsZUFycmF5ICppbmRleFN0YWNrOworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRNYXJrZXJzLCBzZXR0ZXI9c2V0TWFya2VyczopIEFOVExSUHRyQnVmZmVyICptYXJrZXJzOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRMYXN0TWFya2VyLCBzZXR0ZXI9c2V0TGFzdE1hcmtlcjopIE5TSW50ZWdlciBsYXN0TWFya2VyOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRDdXJyZW50Q2hpbGRJbmRleCwgc2V0dGVyPXNldEN1cnJlbnRDaGlsZEluZGV4OikgTlNJbnRlZ2VyIGN1cnJlbnRDaGlsZEluZGV4OworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRBYnNvbHV0ZU5vZGVJbmRleCwgc2V0dGVyPXNldEFic29sdXRlTm9kZUluZGV4OikgTlNJbnRlZ2VyIGFic29sdXRlTm9kZUluZGV4OworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRMb29rYWhlYWQsIHNldHRlcj1zZXRMb29rYWhlYWQ6KSBOU011dGFibGVBcnJheSAqbG9va2FoZWFkOworQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1nZXRIZWFkLCBzZXR0ZXI9c2V0SGVhZDopIE5TVUludGVnZXIgaGVhZDsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0VGFpbCwgc2V0dGVyPXNldFRhaWw6KSBOU1VJbnRlZ2VyIHRhaWw7CisKKy0gKGlkKSBpbml0V2l0aFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKXRoZVRyZWU7CistIChpZCkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlIHRyZWVBZGFwdG9yOihBTlRMUkNvbW1vblRyZWVBZGFwdG9yICopdGhlQWRhcHRvcjsKKworLSAodm9pZCkgcmVzZXQ7CisKKyNwcmFnbWEgbWFyayBBTlRMUlRyZWVOb2RlU3RyZWFtIGNvbmZvcm1hbmNlCisKKy0gKGlkKSBMVDooTlNJbnRlZ2VyKWs7CistIChpZCkgdHJlZVNvdXJjZTsKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpc2V0VHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcjsKKy0gKGlkPEFOVExSVG9rZW5TdHJlYW0+KSBnZXRUb2tlblN0cmVhbTsKKy0gKHZvaWQpIHNldFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPilhVG9rZW5TdHJlYW07CS8vLzwgQWRkZWQgYnkgc3ViY2xhc3MsIG5vdCBpbiBwcm90b2NvbAorLSAodm9pZCkgc2V0VXNlc1VuaXF1ZU5hdmlnYXRpb25Ob2RlczooQk9PTClmbGFnOworCistIChpZCkgbm9kZUF0SW5kZXg6KE5TVUludGVnZXIpIGlkeDsKKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmc7CistIChOU1N0cmluZyAqKSB0b1N0cmluZ1dpdGhSYW5nZTooTlNSYW5nZSkgYVJhbmdlOworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQpc3RhcnROb2RlIHRvTm9kZTooaWQpc3RvcE5vZGU7CisKKyNwcmFnbWEgbWFyayBBTlRMUkludFN0cmVhbSBjb25mb3JtYW5jZQorLSAodm9pZCkgY29uc3VtZTsKKy0gKE5TSW50ZWdlcikgTEE6KE5TVUludGVnZXIpIGk7CistIChOU1VJbnRlZ2VyKSBtYXJrOworLSAoTlNVSW50ZWdlcikgZ2V0SW5kZXg7CistICh2b2lkKSByZXdpbmQ6KE5TVUludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHJld2luZDsKKy0gKHZvaWQpIHJlbGVhc2U6KE5TVUludGVnZXIpIG1hcmtlcjsKKy0gKHZvaWQpIHNlZWs6KE5TVUludGVnZXIpIGluZGV4OworLSAoTlNVSW50ZWdlcikgc2l6ZTsKKworI3ByYWdtYSBtYXJrIExvb2thaGVhZCBIYW5kbGluZworLSAodm9pZCkgYWRkTG9va2FoZWFkOihpZDxBTlRMUkJhc2VUcmVlPilhTm9kZTsKKy0gKE5TVUludGVnZXIpIGxvb2thaGVhZFNpemU7CistICh2b2lkKSBmaWxsQnVmZmVyV2l0aExvb2thaGVhZDooTlNJbnRlZ2VyKWs7CistIChpZCkgbmV4dE9iamVjdDsKKworI3ByYWdtYSBtYXJrIE5vZGUgdmlzaXRpbmcKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBoYW5kbGVSb290Tm9kZTsKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSB2aXNpdENoaWxkOihOU0ludGVnZXIpY2hpbGROdW1iZXI7CistICh2b2lkKSB3YWxrQmFja1RvTW9zdFJlY2VudE5vZGVXaXRoVW52aXNpdGVkQ2hpbGRyZW47CistICh2b2lkKSBhZGROYXZpZ2F0aW9uTm9kZVdpdGhUeXBlOihOU0ludGVnZXIpdG9rZW5UeXBlOworCisjcHJhZ21hIG1hcmsgQWNjZXNzb3JzCistIChBTlRMUkNvbW1vblRyZWUgKikgcm9vdDsKKy0gKHZvaWQpIHNldFJvb3Q6IChBTlRMUkNvbW1vblRyZWUgKikgYVJvb3Q7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTFlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5tCkBAIC0wLDAgKzEsNDMyIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisjaW1wb3J0ICJBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oIgorI2ltcG9ydCAiQU5UTFJCYXNlVHJlZS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCisjZGVmaW5lIElOSVRJQUxfTE9PS0FIRUFEX0JVRkZFUl9TSVpFIDUKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbQorCitAc3ludGhlc2l6ZSByb290OworQHN5bnRoZXNpemUgY3VycmVudE5vZGU7CitAc3ludGhlc2l6ZSBwcmV2aW91c05vZGU7CitAc3ludGhlc2l6ZSB0cmVlQWRhcHRvcjsKK0BzeW50aGVzaXplIHRva2VuU3RyZWFtOworQHN5bnRoZXNpemUgbm9kZVN0YWNrOworQHN5bnRoZXNpemUgaW5kZXhTdGFjazsKK0BzeW50aGVzaXplIG1hcmtlcnM7CitAc3ludGhlc2l6ZSBsYXN0TWFya2VyOworQHN5bnRoZXNpemUgY3VycmVudENoaWxkSW5kZXg7CitAc3ludGhlc2l6ZSBhYnNvbHV0ZU5vZGVJbmRleDsKK0BzeW50aGVzaXplIGxvb2thaGVhZDsKK0BzeW50aGVzaXplIGhlYWQ7CitAc3ludGhlc2l6ZSB0YWlsOworCistIChpZCkgaW5pdFdpdGhUcmVlOihBTlRMUkNvbW1vblRyZWUgKil0aGVUcmVlCit7CisJcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJlZTp0aGVUcmVlIHRyZWVBZGFwdG9yOm5pbF07Cit9CisKKy0gKGlkKSBpbml0V2l0aFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKXRoZVRyZWUgdHJlZUFkYXB0b3I6KEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKil0aGVBZGFwdG9yCit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJW3NlbGYgc2V0Um9vdDp0aGVUcmVlXTsKKwkJaWYgKCB0aGVBZGFwdG9yID09IG5pbCApIAorCQkJW3NlbGYgc2V0VHJlZUFkYXB0b3I6W0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdXTsKKwkJZWxzZQorCQkJW3NlbGYgc2V0VHJlZUFkYXB0b3I6dGhlQWRhcHRvcl07CisJCW5vZGVTdGFjayA9IFtbTlNNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6NV0gcmV0YWluXTsKKwkJaW5kZXhTdGFjayA9IFtbTlNNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6NV0gcmV0YWluXTsKKwkJbWFya2VycyA9IFtbQU5UTFJQdHJCdWZmZXIgbmV3QU5UTFJQdHJCdWZmZXJXaXRoTGVuOjEwMF0gcmV0YWluXTsKKyAgICAgICAgLy8gW21hcmtlcnMgaW5zZXJ0T2JqZWN0OltOU051bGwgbnVsbF0gYXRJbmRleDowXTsJLy8gbWFya2VycyBpcyBvbmUgYmFzZWQgLSBtYXliZSBmaXggdGhpcyBsYXRlcgorCQlsb29rYWhlYWQgPSBbTlNNdXRhYmxlQXJyYXkgYXJyYXlXaXRoQ2FwYWNpdHk6SU5JVElBTF9MT09LQUhFQURfQlVGRkVSX1NJWkVdOwkvLyBsb29rYWhlYWQgaXMgZmlsbGVkIHdpdGggW05TTnVsbCBudWxsXSBpbiAtcmVzZXQKKyAgICAgICAgW2xvb2thaGVhZCByZXRhaW5dOworCQlbc2VsZiByZXNldF07CisJfQorCXJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisJW3NlbGYgc2V0Um9vdDpuaWxdOworCVtzZWxmIHNldFRyZWVBZGFwdG9yOm5pbF07CisJCisJW25vZGVTdGFjayByZWxlYXNlXTsJbm9kZVN0YWNrID0gbmlsOworCVtpbmRleFN0YWNrIHJlbGVhc2VdOwlpbmRleFN0YWNrID0gbmlsOworCVttYXJrZXJzIHJlbGVhc2VdOwkJbWFya2VycyA9IG5pbDsKKwlbbG9va2FoZWFkIHJlbGVhc2VdOwlsb29rYWhlYWQgPSBuaWw7CisJCisJW3N1cGVyIGRlYWxsb2NdOworfQorCistICh2b2lkKSByZXNldAoreworCWN1cnJlbnROb2RlID0gcm9vdDsKKwlwcmV2aW91c05vZGUgPSBuaWw7CisJY3VycmVudENoaWxkSW5kZXggPSAtMTsKKwlhYnNvbHV0ZU5vZGVJbmRleCA9IC0xOworCWhlYWQgPSB0YWlsID0gMDsKKwlbbm9kZVN0YWNrIHJlbW92ZUFsbE9iamVjdHNdOworCVtpbmRleFN0YWNrIHJlbW92ZUFsbE9iamVjdHNdOworCVttYXJrZXJzIHJlbW92ZUFsbE9iamVjdHNdOworICAgIC8vIFttYXJrZXJzIGluc2VydE9iamVjdDpbTlNOdWxsIG51bGxdIGF0SW5kZXg6MF07CS8vIG1hcmtlcnMgaXMgb25lIGJhc2VkIC0gbWF5YmUgZml4IHRoaXMgbGF0ZXIKKwlbbG9va2FoZWFkIHJlbW92ZUFsbE9iamVjdHNdOworCS8vIFRPRE86IHRoaXMgaXMgbm90IGlkZWFsLCBidXQgd29ya3MgZm9yIG5vdy4gb3B0aW1pemUgbGF0ZXIKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5JVElBTF9MT09LQUhFQURfQlVGRkVSX1NJWkU7IGkrKykKKwkJW2xvb2thaGVhZCBhZGRPYmplY3Q6W05TTnVsbCBudWxsXV07Cit9CisKKworI3ByYWdtYSBtYXJrIEFOVExSVHJlZU5vZGVTdHJlYW0gY29uZm9ybWFuY2UKKworLSAoaWQpIExUOihOU0ludGVnZXIpaworeworCWlmIChrID09IC0xKQorCQlyZXR1cm4gcHJldmlvdXNOb2RlOworCWlmIChrIDwgMCkKKwkJQHRocm93IFtOU0V4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTpAIkFOVExSVHJlZUV4Y2VwdGlvbiIgcmVhc29uOkAiLUxUOiBsb29raW5nIGJhY2sgbW9yZSB0aGFuIG9uZSBub2RlIHVuc3VwcG9ydGVkIGZvciB1bmJ1ZmZlcmVkIHN0cmVhbXMiIHVzZXJJbmZvOm5pbF07CisJaWYgKGsgPT0gMCkKKwkJcmV0dXJuIEFOVExSQmFzZVRyZWUuSU5WQUxJRF9OT0RFOworCVtzZWxmIGZpbGxCdWZmZXJXaXRoTG9va2FoZWFkOmtdOworCXJldHVybiBbbG9va2FoZWFkIG9iamVjdEF0SW5kZXg6KGhlYWQray0xKSAlIFtsb29rYWhlYWQgY291bnRdXTsKK30KKworLSAoaWQpIHRyZWVTb3VyY2UKK3sKKwlyZXR1cm4gW3NlbGYgcm9vdF07Cit9CisKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKK3sKKwlyZXR1cm4gdHJlZUFkYXB0b3I7Cit9CisKKy0gKHZvaWQpc2V0VHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgoreworICAgIGlmICh0cmVlQWRhcHRvciAhPSBhVHJlZUFkYXB0b3IpIHsKKyAgICAgICAgW2FUcmVlQWRhcHRvciByZXRhaW5dOworICAgICAgICBbdHJlZUFkYXB0b3IgcmVsZWFzZV07CisgICAgICAgIHRyZWVBZGFwdG9yID0gYVRyZWVBZGFwdG9yOworICAgIH0KK30KKworLSAoaWQ8QU5UTFJUb2tlblN0cmVhbT4pIGdldFRva2VuU3RyZWFtCit7CisJcmV0dXJuIHRva2VuU3RyZWFtOworfQorCistICh2b2lkKSBzZXRUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVRva2VuU3RyZWFtCit7CisJaWYgKHRva2VuU3RyZWFtICE9IGFUb2tlblN0cmVhbSkgeworCQlbdG9rZW5TdHJlYW0gcmVsZWFzZV07CisJCVthVG9rZW5TdHJlYW0gcmV0YWluXTsKKwkJdG9rZW5TdHJlYW0gPSBhVG9rZW5TdHJlYW07CisJfQorfQorCistICh2b2lkKSBzZXRVc2VzVW5pcXVlTmF2aWdhdGlvbk5vZGVzOihCT09MKWZsYWcKK3sKKwlzaG91bGRVc2VVbmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSBmbGFnOworfQorCistIChpZCkgbm9kZUF0SW5kZXg6KE5TVUludGVnZXIpIGlkeAoreworCUB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6QCJBTlRMUlRyZWVFeGNlcHRpb24iIHJlYXNvbjpAIi1ub2RlQXRJbmRleDogdW5zdXBwb3J0ZWQgZm9yIHVuYnVmZmVyZWQgc3RyZWFtcyIgdXNlckluZm86bmlsXTsKK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmcKK3sKKwlAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOkAiQU5UTFJUcmVlRXhjZXB0aW9uIiByZWFzb246QCItdG9TdHJpbmcgdW5zdXBwb3J0ZWQgZm9yIHVuYnVmZmVyZWQgc3RyZWFtcyIgdXNlckluZm86bmlsXTsKK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdXaXRoUmFuZ2U6KE5TUmFuZ2UpIGFSYW5nZQoreworCUB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6QCJBTlRMUlRyZWVFeGNlcHRpb24iIHJlYXNvbjpAIi10b1N0cmluZzogdW5zdXBwb3J0ZWQgZm9yIHVuYnVmZmVyZWQgc3RyZWFtcyIgdXNlckluZm86bmlsXTsKK30KKworLSAoTlNTdHJpbmcgKikgdG9TdHJpbmdGcm9tTm9kZTooaWQpc3RhcnROb2RlIFRvTm9kZTooaWQpc3RvcE5vZGUKK3sKKwlAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOkAiQU5UTFJUcmVlRXhjZXB0aW9uIiByZWFzb246QCItdG9TdHJpbmdGcm9tTm9kZTp0b05vZGU6IHVuc3VwcG9ydGVkIGZvciB1bmJ1ZmZlcmVkIHN0cmVhbXMiIHVzZXJJbmZvOm5pbF07Cit9CisKKyNwcmFnbWEgbWFyayBBTlRMUkludFN0cmVhbSBjb25mb3JtYW5jZQorCistICh2b2lkKSBjb25zdW1lCit7CisJW3NlbGYgZmlsbEJ1ZmZlcldpdGhMb29rYWhlYWQ6MV07CisJYWJzb2x1dGVOb2RlSW5kZXgrKzsKKwlwcmV2aW91c05vZGUgPSBbbG9va2FoZWFkIG9iamVjdEF0SW5kZXg6aGVhZF07CisJaGVhZCA9IChoZWFkKzEpICUgW2xvb2thaGVhZCBjb3VudF07Cit9CisKKy0gKE5TSW50ZWdlcikgTEE6KE5TVUludGVnZXIpIGkKK3sKKwlBTlRMUkNvbW1vblRyZWUgKm5vZGUgPSBbc2VsZiBMVDppXTsKKwlpZiAoIW5vZGUpIAorCQlyZXR1cm4gQU5UTFJUb2tlblR5cGVJbnZhbGlkOworCWludCB0dHlwZSA9IFtub2RlIGdldFR5cGVdOworCXJldHVybiB0dHlwZTsKK30KKworLSAoTlNVSW50ZWdlcikgbWFyaworeworCUFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUgKnN0YXRlID0gW1tbQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZSBhbGxvY10gaW5pdF0gcmV0YWluXTsKKwlbc3RhdGUgc2V0Q3VycmVudE5vZGU6Y3VycmVudE5vZGVdOworCVtzdGF0ZSBzZXRQcmV2aW91c05vZGU6cHJldmlvdXNOb2RlXTsKKwlbc3RhdGUgc2V0SW5kZXhTdGFja1NpemU6W2luZGV4U3RhY2sgY291bnRdXTsKKwlbc3RhdGUgc2V0Tm9kZVN0YWNrU2l6ZTpbbm9kZVN0YWNrIGNvdW50XV07CisJW3N0YXRlIHNldEN1cnJlbnRDaGlsZEluZGV4OmN1cnJlbnRDaGlsZEluZGV4XTsKKwlbc3RhdGUgc2V0QWJzb2x1dGVOb2RlSW5kZXg6YWJzb2x1dGVOb2RlSW5kZXhdOworCXVuc2lnbmVkIGludCBsb29rYWhlYWRTaXplID0gW3NlbGYgbG9va2FoZWFkU2l6ZV07CisJdW5zaWduZWQgaW50IGs7CisJZm9yICggayA9IDA7IGsgPCBsb29rYWhlYWRTaXplOyBrKyspIHsKKwkJW3N0YXRlIGFkZFRvTG9va2FoZWFkOltzZWxmIExUOmsrMV1dOworCX0KKwlbbWFya2VycyBhZGRPYmplY3Q6c3RhdGVdOworCS8vW3N0YXRlIHJlbGVhc2VdOworCXJldHVybiBbbWFya2VycyBjb3VudF07Cit9CisKKy0gKE5TVUludGVnZXIpIGdldEluZGV4Cit7CisJcmV0dXJuIGFic29sdXRlTm9kZUluZGV4ICsgMTsKK30KKworLSAodm9pZCkgcmV3aW5kOihOU1VJbnRlZ2VyKSBtYXJrZXIKK3sKKwlpZiAoIFttYXJrZXJzIGNvdW50XSA8IG1hcmtlciApIHsKKwkJcmV0dXJuOworCX0KKwlBTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlICpzdGF0ZSA9IFttYXJrZXJzIG9iamVjdEF0SW5kZXg6bWFya2VyXTsKKwlbbWFya2VycyByZW1vdmVPYmplY3RBdEluZGV4Om1hcmtlcl07CisKKwlhYnNvbHV0ZU5vZGVJbmRleCA9IFtzdGF0ZSBhYnNvbHV0ZU5vZGVJbmRleF07CisJY3VycmVudENoaWxkSW5kZXggPSBbc3RhdGUgY3VycmVudENoaWxkSW5kZXhdOworCWN1cnJlbnROb2RlID0gW3N0YXRlIGN1cnJlbnROb2RlXTsKKwlwcmV2aW91c05vZGUgPSBbc3RhdGUgcHJldmlvdXNOb2RlXTsKKwkvLyBkcm9wIG5vZGUgYW5kIGluZGV4IHN0YWNrcyBiYWNrIHRvIG9sZCBzaXplCisJW25vZGVTdGFjayByZW1vdmVPYmplY3RzSW5SYW5nZTpOU01ha2VSYW5nZShbc3RhdGUgbm9kZVN0YWNrU2l6ZV0sIFtub2RlU3RhY2sgY291bnRdLVtzdGF0ZSBub2RlU3RhY2tTaXplXSldOworCVtpbmRleFN0YWNrIHJlbW92ZU9iamVjdHNJblJhbmdlOk5TTWFrZVJhbmdlKFtzdGF0ZSBpbmRleFN0YWNrU2l6ZV0sIFtpbmRleFN0YWNrIGNvdW50XS1bc3RhdGUgaW5kZXhTdGFja1NpemVdKV07CisJCisJaGVhZCA9IHRhaWwgPSAwOyAvLyB3YWNrIGxvb2thaGVhZCBidWZmZXIgYW5kIHRoZW4gcmVmaWxsCisJW2xvb2thaGVhZCByZWxlYXNlXTsKKwlsb29rYWhlYWQgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aEFycmF5OltzdGF0ZSBsb29rYWhlYWRdXTsKKwl0YWlsID0gW2xvb2thaGVhZCBjb3VudF07CisJLy8gbWFrZSBzb21lIHJvb20gYWZ0ZXIgdGhlIHJlc3RvcmVkIGxvb2thaGVhZCwgc28gdGhhdCB0aGUgYWJvdmUgbGluZSBpcyBub3QgYSBidWcgOykKKwkvLyB0aGlzIGFsc28gZW5zdXJlcyB0aGF0IGEgc3Vic2VxdWVudCAtYWRkTG9va2FoZWFkOiB3aWxsIG5vdCBpbW1lZGlhdGVseSBuZWVkIHRvIHJlc2l6ZSB0aGUgYnVmZmVyCisJW2xvb2thaGVhZCBhZGRPYmplY3RzRnJvbUFycmF5OltOU0FycmF5IGFycmF5V2l0aE9iamVjdHM6W05TTnVsbCBudWxsXSwgW05TTnVsbCBudWxsXSwgW05TTnVsbCBudWxsXSwgW05TTnVsbCBudWxsXSwgW05TTnVsbCBudWxsXSwgbmlsXV07Cit9CisKKy0gKHZvaWQpIHJld2luZAoreworCVtzZWxmIHJld2luZDpbbWFya2VycyBjb3VudF1dOworfQorCistICh2b2lkKSByZWxlYXNlOihOU1VJbnRlZ2VyKSBtYXJrZXIKK3sKKwlAdGhyb3cgW05TRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOkAiQU5UTFJUcmVlRXhjZXB0aW9uIiByZWFzb246QCItcmVsZWFzZTogdW5zdXBwb3J0ZWQgZm9yIHVuYnVmZmVyZWQgc3RyZWFtcyIgdXNlckluZm86bmlsXTsKK30KKworLSAodm9pZCkgc2VlazooTlNVSW50ZWdlcikgYW5JbmRleAoreworCWlmICggYW5JbmRleCA8IChOU1VJbnRlZ2VyKSBpbmRleCApCisJCUB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6QCJBTlRMUlRyZWVFeGNlcHRpb24iIHJlYXNvbjpAIi1zZWVrOiBiYWNrd2FyZHMgdW5zdXBwb3J0ZWQgZm9yIHVuYnVmZmVyZWQgc3RyZWFtcyIgdXNlckluZm86bmlsXTsKKwl3aGlsZSAoIChOU1VJbnRlZ2VyKSBpbmRleCA8IGFuSW5kZXggKSB7CisJCVtzZWxmIGNvbnN1bWVdOworCX0KK30KKworLSAoTlNVSW50ZWdlcikgc2l6ZTsKK3sKKwlyZXR1cm4gYWJzb2x1dGVOb2RlSW5kZXggKyAxOwkvLyBub3QgZW50aXJlbHkgY29ycmVjdCwgYnV0IGNoZWFwLgorfQorCisKKyNwcmFnbWEgbWFyayBMb29rYWhlYWQgSGFuZGxpbmcKKy0gKHZvaWQpIGFkZExvb2thaGVhZDooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKKwlbbG9va2FoZWFkIHJlcGxhY2VPYmplY3RBdEluZGV4OnRhaWwgd2l0aE9iamVjdDphTm9kZV07CisJdGFpbCA9ICh0YWlsKzEpICUgW2xvb2thaGVhZCBjb3VudF07CisJCisJaWYgKCB0YWlsID09IGhlYWQgKSB7CisJCU5TTXV0YWJsZUFycmF5ICpuZXdMb29rYWhlYWQgPSBbW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpbbG9va2FoZWFkIGNvdW50XSoyXSByZXRhaW5dOworCQkKKwkJTlNSYW5nZSBoZWFkUmFuZ2UgPSBOU01ha2VSYW5nZShoZWFkLCBbbG9va2FoZWFkIGNvdW50XS1oZWFkKTsKKwkJTlNSYW5nZSB0YWlsUmFuZ2UgPSBOU01ha2VSYW5nZSgwLCB0YWlsKTsKKwkJCisJCVtuZXdMb29rYWhlYWQgYWRkT2JqZWN0c0Zyb21BcnJheTpbbG9va2FoZWFkIG9iamVjdHNBdEluZGV4ZXM6W05TSW5kZXhTZXQgaW5kZXhTZXRXaXRoSW5kZXhlc0luUmFuZ2U6aGVhZFJhbmdlXV1dOworCQlbbmV3TG9va2FoZWFkIGFkZE9iamVjdHNGcm9tQXJyYXk6W2xvb2thaGVhZCBvYmplY3RzQXRJbmRleGVzOltOU0luZGV4U2V0IGluZGV4U2V0V2l0aEluZGV4ZXNJblJhbmdlOnRhaWxSYW5nZV1dXTsKKwkJCisJCXVuc2lnbmVkIGludCBpOworCQl1bnNpZ25lZCBpbnQgbG9va2FoZWFkQ291bnQgPSBbbmV3TG9va2FoZWFkIGNvdW50XTsKKwkJZm9yIChpID0gMDsgaSA8IGxvb2thaGVhZENvdW50OyBpKyspCisJCQlbbmV3TG9va2FoZWFkIGFkZE9iamVjdDpbTlNOdWxsIG51bGxdXTsKKwkJW2xvb2thaGVhZCByZWxlYXNlXTsKKwkJbG9va2FoZWFkID0gbmV3TG9va2FoZWFkOworCQkKKwkJaGVhZCA9IDA7CisJCXRhaWwgPSBsb29rYWhlYWRDb3VudDsJLy8gdGFpbCBpcyB0aGUgbG9jYXRpb24gdGhlIF9uZXh0XyBsb29rYWhlYWQgbm9kZSB3aWxsIGVuZCB1cCBpbiwgbm90IHRoZSBsYXN0IGVsZW1lbnQncyBpZHggaXRzZWxmIQorCX0KKwkKK30KKworLSAoTlNVSW50ZWdlcikgbG9va2FoZWFkU2l6ZQoreworCXJldHVybiB0YWlsIDwgaGVhZAorCQk/IChbbG9va2FoZWFkIGNvdW50XSAtIGhlYWQgKyB0YWlsKSAKKwkJOiAodGFpbCAtIGhlYWQpOworfQorCistICh2b2lkKSBmaWxsQnVmZmVyV2l0aExvb2thaGVhZDooTlNJbnRlZ2VyKWsKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IFtzZWxmIGxvb2thaGVhZFNpemVdOworCXVuc2lnbmVkIGludCBpOworCWlkIGxvb2thaGVhZE9iamVjdCA9IHNlbGY7IC8vIGFueSB2YWxpZCBvYmplY3Qgd291bGQgZG8uCisJZm9yIChpPTE7IGkgPD0gay1uICYmIGxvb2thaGVhZE9iamVjdCAhPSBuaWw7IGkrKykgeworCQlsb29rYWhlYWRPYmplY3QgPSBbc2VsZiBuZXh0T2JqZWN0XTsKKwl9Cit9CisKKy0gKGlkKSBuZXh0T2JqZWN0Cit7CisJLy8gTk9URTogdGhpcyBjb3VsZC9zaG91bGQgZ28gaW50byBhbiBOU0VudW1lcmF0b3Igc3ViY2xhc3MgZm9yIHRyZWVub2RlIHN0cmVhbXMuCisJaWYgKGN1cnJlbnROb2RlID09IG5pbCkgeworICAgICAgICBpZiAoIG5hdmlnYXRpb25Ob2RlRU9GID09IG5pbCApIHsKKyAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlRU9GID0gW1tBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZUVPRiBhbGxvY10gaW5pdF07CisgICAgICAgIH0KKwkJW3NlbGYgYWRkTG9va2FoZWFkOm5hdmlnYXRpb25Ob2RlRU9GXTsKKwkJcmV0dXJuIG5pbDsKKwl9CisJaWYgKGN1cnJlbnRDaGlsZEluZGV4ID09IC0xKSB7CisJCXJldHVybiBbc2VsZiBoYW5kbGVSb290Tm9kZV07CisJfQorCWlmIChjdXJyZW50Q2hpbGRJbmRleCA8IChOU0ludGVnZXIpW2N1cnJlbnROb2RlIGdldENoaWxkQ291bnRdKSB7CisJCXJldHVybiBbc2VsZiB2aXNpdENoaWxkOmN1cnJlbnRDaGlsZEluZGV4XTsKKwl9CisJW3NlbGYgd2Fsa0JhY2tUb01vc3RSZWNlbnROb2RlV2l0aFVudmlzaXRlZENoaWxkcmVuXTsKKwlpZiAoY3VycmVudE5vZGUgIT0gbmlsKSB7CisJCXJldHVybiBbc2VsZiB2aXNpdENoaWxkOmN1cnJlbnRDaGlsZEluZGV4XTsKKwl9CisJCisJcmV0dXJuIG5pbDsKK30JCisKKyNwcmFnbWEgbWFyayBOb2RlIHZpc2l0aW5nCistIChBTlRMUkNvbW1vblRyZWUgKikgaGFuZGxlUm9vdE5vZGUKK3sKKwlBTlRMUkNvbW1vblRyZWUgKm5vZGUgPSBjdXJyZW50Tm9kZTsKKwljdXJyZW50Q2hpbGRJbmRleCA9IDA7CisJaWYgKFtub2RlIGlzTmlsXSkgeworCQlub2RlID0gW3NlbGYgdmlzaXRDaGlsZDpjdXJyZW50Q2hpbGRJbmRleF07CisJfSBlbHNlIHsKKwkJW3NlbGYgYWRkTG9va2FoZWFkOm5vZGVdOworCQlpZiAoW2N1cnJlbnROb2RlIGdldENoaWxkQ291bnRdID09IDApIHsKKwkJCWN1cnJlbnROb2RlID0gbmlsOworCQl9CisJfQorCXJldHVybiBub2RlOworfQorCistIChBTlRMUkNvbW1vblRyZWUgKikgdmlzaXRDaGlsZDooTlNJbnRlZ2VyKWNoaWxkTnVtYmVyCit7CisJQU5UTFJDb21tb25UcmVlICpub2RlID0gbmlsOworCQorCVtub2RlU3RhY2sgYWRkT2JqZWN0OmN1cnJlbnROb2RlXTsKKwlbaW5kZXhTdGFjayBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhJbnQ6Y2hpbGROdW1iZXJdXTsKKwlpZiAoY2hpbGROdW1iZXIgPT0gMCAmJiAhW2N1cnJlbnROb2RlIGlzTmlsXSkKKwkJW3NlbGYgYWRkTmF2aWdhdGlvbk5vZGVXaXRoVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCisJY3VycmVudE5vZGUgPSBbY3VycmVudE5vZGUgZ2V0Q2hpbGQ6Y2hpbGROdW1iZXJdOworCWN1cnJlbnRDaGlsZEluZGV4ID0gMDsKKwlub2RlID0gY3VycmVudE5vZGU7ICAvLyByZWNvcmQgbm9kZSB0byByZXR1cm4KKwlbc2VsZiBhZGRMb29rYWhlYWQ6bm9kZV07CisJW3NlbGYgd2Fsa0JhY2tUb01vc3RSZWNlbnROb2RlV2l0aFVudmlzaXRlZENoaWxkcmVuXTsKKwlyZXR1cm4gbm9kZTsKK30KKworLSAodm9pZCkgd2Fsa0JhY2tUb01vc3RSZWNlbnROb2RlV2l0aFVudmlzaXRlZENoaWxkcmVuCit7CisJd2hpbGUgKGN1cnJlbnROb2RlICE9IG5pbCAmJiBjdXJyZW50Q2hpbGRJbmRleCA+PSAoTlNJbnRlZ2VyKVtjdXJyZW50Tm9kZSBnZXRDaGlsZENvdW50XSkKKwl7CisJCWN1cnJlbnROb2RlID0gKEFOVExSQ29tbW9uVHJlZSAqKVtub2RlU3RhY2sgbGFzdE9iamVjdF07CisJCVtub2RlU3RhY2sgcmVtb3ZlTGFzdE9iamVjdF07CisJCWN1cnJlbnRDaGlsZEluZGV4ID0gWyhOU051bWJlciAqKVtpbmRleFN0YWNrIGxhc3RPYmplY3RdIGludFZhbHVlXTsKKwkJW2luZGV4U3RhY2sgcmVtb3ZlTGFzdE9iamVjdF07CisJCWN1cnJlbnRDaGlsZEluZGV4Kys7IC8vIG1vdmUgdG8gbmV4dCBjaGlsZAorCQlpZiAoY3VycmVudENoaWxkSW5kZXggPj0gKE5TSW50ZWdlcilbY3VycmVudE5vZGUgZ2V0Q2hpbGRDb3VudF0pIHsKKwkJCWlmICghW2N1cnJlbnROb2RlIGlzTmlsXSkgeworCQkJCVtzZWxmIGFkZE5hdmlnYXRpb25Ob2RlV2l0aFR5cGU6QU5UTFJUb2tlblR5cGVVUF07CisJCQl9CisJCQlpZiAoY3VycmVudE5vZGUgPT0gcm9vdCkgeyAvLyB3ZSBkb25lIHlldD8KKwkJCQljdXJyZW50Tm9kZSA9IG5pbDsKKwkJCX0KKwkJfQorCX0KKwkKK30KKworLSAodm9pZCkgYWRkTmF2aWdhdGlvbk5vZGVXaXRoVHlwZTooTlNJbnRlZ2VyKXRva2VuVHlwZQoreworCS8vIFRPRE86IHRoaXMgY3VycmVudGx5IGlnbm9yZXMgc2hvdWxkVXNlVW5pcXVlTmF2aWdhdGlvbk5vZGVzLgorCXN3aXRjaCAodG9rZW5UeXBlKSB7CisJCWNhc2UgQU5UTFJUb2tlblR5cGVET1dOOiB7CisgICAgICAgICAgICBpZiAobmF2aWdhdGlvbk5vZGVEb3duID09IG5pbCkgeworICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlRG93biA9IFtbQU5UTFJUcmVlTmF2aWdhdGlvbk5vZGVEb3duIGFsbG9jXSBpbml0XTsKKyAgICAgICAgICAgIH0KKwkJCVtzZWxmIGFkZExvb2thaGVhZDpuYXZpZ2F0aW9uTm9kZURvd25dOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBBTlRMUlRva2VuVHlwZVVQOiB7CisgICAgICAgICAgICBpZiAobmF2aWdhdGlvbk5vZGVVcCA9PSBuaWwpIHsKKyAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZVVwID0gW1tBTlRMUlRyZWVOYXZpZ2F0aW9uTm9kZVVwIGFsbG9jXSBpbml0XTsKKyAgICAgICAgICAgIH0KKwkJCVtzZWxmIGFkZExvb2thaGVhZDpuYXZpZ2F0aW9uTm9kZVVwXTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisjcHJhZ21hIG1hcmsgQWNjZXNzb3JzCistIChBTlRMUkNvbW1vblRyZWUgKikgcm9vdAoreworICAgIHJldHVybiByb290OyAKK30KKworLSAodm9pZCkgc2V0Um9vdDogKEFOVExSQ29tbW9uVHJlZSAqKSBhUm9vdAoreworICAgIGlmIChyb290ICE9IGFSb290KSB7CisgICAgICAgIFthUm9vdCByZXRhaW5dOworICAgICAgICBbcm9vdCByZWxlYXNlXTsKKyAgICAgICAgcm9vdCA9IGFSb290OworICAgIH0KK30KKworQGVuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyODk1MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaApAQCAtMCwwICsxLDY2IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZS5oIgorCitAaW50ZXJmYWNlIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUgOiBOU09iamVjdCB7CisJQU5UTFJDb21tb25UcmVlICpjdXJyZW50Tm9kZTsKKwlBTlRMUkNvbW1vblRyZWUgKnByZXZpb3VzTm9kZTsKKworCWludCBjdXJyZW50Q2hpbGRJbmRleDsKKwlpbnQgYWJzb2x1dGVOb2RlSW5kZXg7CisJdW5zaWduZWQgaW50IG5vZGVTdGFja1NpemU7CisJdW5zaWduZWQgaW50IGluZGV4U3RhY2tTaXplOworCQorCU5TTXV0YWJsZUFycmF5ICpsb29rYWhlYWQ7Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBjdXJyZW50Tm9kZTsKKy0gKHZvaWQpIHNldEN1cnJlbnROb2RlOiAoQU5UTFJDb21tb25UcmVlICopIGFDdXJyZW50Tm9kZTsKKworLSAoQU5UTFJDb21tb25UcmVlICopIHByZXZpb3VzTm9kZTsKKy0gKHZvaWQpIHNldFByZXZpb3VzTm9kZTogKEFOVExSQ29tbW9uVHJlZSAqKSBhUHJldmlvdXNOb2RlOworCistIChOU0ludGVnZXIpIGN1cnJlbnRDaGlsZEluZGV4OworLSAodm9pZCkgc2V0Q3VycmVudENoaWxkSW5kZXg6IChOU0ludGVnZXIpIGFDdXJyZW50Q2hpbGRJbmRleDsKKworLSAoTlNJbnRlZ2VyKSBhYnNvbHV0ZU5vZGVJbmRleDsKKy0gKHZvaWQpIHNldEFic29sdXRlTm9kZUluZGV4OiAoTlNJbnRlZ2VyKSBhbkFic29sdXRlTm9kZUluZGV4OworCistIChOU1VJbnRlZ2VyKSBub2RlU3RhY2tTaXplOworLSAodm9pZCkgc2V0Tm9kZVN0YWNrU2l6ZTogKE5TVUludGVnZXIpIGFOb2RlU3RhY2tTaXplOworCistIChOU1VJbnRlZ2VyKSBpbmRleFN0YWNrU2l6ZTsKKy0gKHZvaWQpIHNldEluZGV4U3RhY2tTaXplOiAoTlNVSW50ZWdlcikgYW5JbmRleFN0YWNrU2l6ZTsKKworLSAoTlNNdXRhYmxlQXJyYXkgKikgbG9va2FoZWFkOworLSAodm9pZCkgc2V0TG9va2FoZWFkOiAoTlNNdXRhYmxlQXJyYXkgKikgYUxvb2thaGVhZDsKKworLSAodm9pZCkgYWRkVG9Mb29rYWhlYWQ6IChpZClsb29rYWhlYWRPYmplY3Q7CistICh2b2lkKSByZW1vdmVGcm9tTG9va2FoZWFkOiAoaWQpbG9va2FoZWFkT2JqZWN0OworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2ZDI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubQpAQCAtMCwwICsxLDE0MCBAQAorLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpbXBvcnQgIkFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZQorCistIChpZCkgaW5pdAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkgIT0gbmlsKSB7CisJCWxvb2thaGVhZCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworCVtzZWxmIHNldExvb2thaGVhZDpuaWxdOworCVtzZWxmIHNldEN1cnJlbnROb2RlOm5pbF07CisJW3NlbGYgc2V0UHJldmlvdXNOb2RlOm5pbF07CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistIChBTlRMUkNvbW1vblRyZWUgKikgY3VycmVudE5vZGUKK3sKKyAgICByZXR1cm4gY3VycmVudE5vZGU7IAorfQorCistICh2b2lkKSBzZXRDdXJyZW50Tm9kZTogKEFOVExSQ29tbW9uVHJlZSAqKSBhQ3VycmVudE5vZGUKK3sKKyAgICBpZiAoY3VycmVudE5vZGUgIT0gYUN1cnJlbnROb2RlKSB7CisgICAgICAgIFthQ3VycmVudE5vZGUgcmV0YWluXTsKKyAgICAgICAgW2N1cnJlbnROb2RlIHJlbGVhc2VdOworICAgICAgICBjdXJyZW50Tm9kZSA9IGFDdXJyZW50Tm9kZTsKKyAgICB9Cit9CisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKSBwcmV2aW91c05vZGUKK3sKKyAgICByZXR1cm4gcHJldmlvdXNOb2RlOyAKK30KKworLSAodm9pZCkgc2V0UHJldmlvdXNOb2RlOiAoQU5UTFJDb21tb25UcmVlICopIGFQcmV2aW91c05vZGUKK3sKKyAgICBpZiAocHJldmlvdXNOb2RlICE9IGFQcmV2aW91c05vZGUpIHsKKyAgICAgICAgW2FQcmV2aW91c05vZGUgcmV0YWluXTsKKyAgICAgICAgW3ByZXZpb3VzTm9kZSByZWxlYXNlXTsKKyAgICAgICAgcHJldmlvdXNOb2RlID0gYVByZXZpb3VzTm9kZTsKKyAgICB9Cit9CisKKy0gKE5TSW50ZWdlcikgY3VycmVudENoaWxkSW5kZXgKK3sKKyAgICByZXR1cm4gY3VycmVudENoaWxkSW5kZXg7Cit9CisKKy0gKHZvaWQpIHNldEN1cnJlbnRDaGlsZEluZGV4OiAoTlNJbnRlZ2VyKSBhQ3VycmVudENoaWxkSW5kZXgKK3sKKyAgICBjdXJyZW50Q2hpbGRJbmRleCA9IGFDdXJyZW50Q2hpbGRJbmRleDsKK30KKworLSAoTlNJbnRlZ2VyKSBhYnNvbHV0ZU5vZGVJbmRleAoreworICAgIHJldHVybiBhYnNvbHV0ZU5vZGVJbmRleDsKK30KKworLSAodm9pZCkgc2V0QWJzb2x1dGVOb2RlSW5kZXg6IChOU0ludGVnZXIpIGFuQWJzb2x1dGVOb2RlSW5kZXgKK3sKKyAgICBhYnNvbHV0ZU5vZGVJbmRleCA9IGFuQWJzb2x1dGVOb2RlSW5kZXg7Cit9CisKKy0gKE5TVUludGVnZXIpIG5vZGVTdGFja1NpemUKK3sKKyAgICByZXR1cm4gbm9kZVN0YWNrU2l6ZTsKK30KKworLSAodm9pZCkgc2V0Tm9kZVN0YWNrU2l6ZTogKE5TVUludGVnZXIpIGFOb2RlU3RhY2tTaXplCit7CisgICAgbm9kZVN0YWNrU2l6ZSA9IGFOb2RlU3RhY2tTaXplOworfQorCistIChOU1VJbnRlZ2VyKSBpbmRleFN0YWNrU2l6ZQoreworICAgIHJldHVybiBpbmRleFN0YWNrU2l6ZTsKK30KKworLSAodm9pZCkgc2V0SW5kZXhTdGFja1NpemU6IChOU1VJbnRlZ2VyKSBhbkluZGV4U3RhY2tTaXplCit7CisgICAgaW5kZXhTdGFja1NpemUgPSBhbkluZGV4U3RhY2tTaXplOworfQorCistIChOU011dGFibGVBcnJheSAqKSBsb29rYWhlYWQKK3sKKyAgICByZXR1cm4gbG9va2FoZWFkOyAKK30KKworLSAodm9pZCkgc2V0TG9va2FoZWFkOiAoTlNNdXRhYmxlQXJyYXkgKikgYUxvb2thaGVhZAoreworICAgIGlmIChsb29rYWhlYWQgIT0gYUxvb2thaGVhZCkgeworICAgICAgICBbYUxvb2thaGVhZCByZXRhaW5dOworICAgICAgICBbbG9va2FoZWFkIHJlbGVhc2VdOworICAgICAgICBsb29rYWhlYWQgPSBhTG9va2FoZWFkOworICAgIH0KK30KKworLSAodm9pZCkgYWRkVG9Mb29rYWhlYWQ6IChpZClsb29rYWhlYWRPYmplY3QKK3sKKyAgICBbW3NlbGYgbG9va2FoZWFkXSBhZGRPYmplY3Q6IGxvb2thaGVhZE9iamVjdF07Cit9CistICh2b2lkKSByZW1vdmVGcm9tTG9va2FoZWFkOiAoaWQpbG9va2FoZWFkT2JqZWN0Cit7CisgICAgW1tzZWxmIGxvb2thaGVhZF0gcmVtb3ZlT2JqZWN0OiBsb29rYWhlYWRPYmplY3RdOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDhmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vCisvLyAgQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNy8xMi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJBTlRMUlRva2VuU291cmNlLmgiCisjaW1wb3J0ICJBTlRMUkxvb2thaGVhZFN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJUb2tlbi5oIgorCitAaW50ZXJmYWNlIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtIDogQU5UTFJMb29rYWhlYWRTdHJlYW0geworCWlkPEFOVExSVG9rZW5Tb3VyY2U+IHRva2VuU291cmNlOworICAgIE5TSW50ZWdlciB0b2tlbkluZGV4OyAvLyBzaW1wbGUgY291bnRlciB0byBzZXQgdG9rZW4gaW5kZXggaW4gdG9rZW5zCisgICAgTlNJbnRlZ2VyIGNoYW5uZWw7Cit9CisKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VG9rZW5Tb3VyY2UsIHNldHRlcj1zZXRUb2tlblNvdXJjZTopIGlkPEFOVExSVG9rZW5Tb3VyY2U+IHRva2VuU291cmNlOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0VG9rZW5JbmRleCwgc2V0dGVyPXNldFRva2VuSW5kZXg6KSBOU0ludGVnZXIgdG9rZW5JbmRleDsKK0Bwcm9wZXJ0eSAoZ2V0dGVyPWNoYW5uZWwsIHNldHRlcj1zZXRDaGFubmVsOikgTlNJbnRlZ2VyIGNoYW5uZWw7CisKKysgKEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtICopbmV3QU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoVG9rZW5Tb3VyY2U6KGlkPEFOVExSVG9rZW5Tb3VyY2U+KWFUb2tlblNvdXJjZTsKKworLSAoaWQ8QU5UTFJUb2tlbj4pbmV4dEVsZW1lbnQ7CistIChCT09MKWlzRU9GOihpZDxBTlRMUlRva2VuPikgYVRva2VuOworLSAoaWQ8QU5UTFJUb2tlblNvdXJjZT4pZ2V0VG9rZW5Tb3VyY2U7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVN0YXJ0OihOU0ludGVnZXIpYVN0YXJ0IFRvRW5kOihOU0ludGVnZXIpYVN0b3A7CistIChOU1N0cmluZyAqKXRvU3RyaW5nRnJvbVRva2VuOihpZDxBTlRMUlRva2VuPilhU3RhcnQgVG9FbmQ6KGlkPEFOVExSVG9rZW4+KWFTdG9wOworLSAoTlNJbnRlZ2VyKUxBOihOU0ludGVnZXIpYW5JZHg7CistIChpZDxBTlRMUlRva2VuPilvYmplY3RBdEluZGV4OihOU0ludGVnZXIpYW5JZHg7CistIChOU1N0cmluZyAqKWdldFNvdXJjZU5hbWU7CisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3NGU5MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm0KQEAgLTAsMCArMSwxMTggQEAKKy8vCisvLyAgQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0ubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNy8xMi8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oIgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0KKworQHN5bnRoZXNpemUgdG9rZW5Tb3VyY2U7CitAc3ludGhlc2l6ZSB0b2tlbkluZGV4OworQHN5bnRoZXNpemUgY2hhbm5lbDsKKworKyAoQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0gKiluZXdBTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlCit7CisgICAgcmV0dXJuIFtbQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0gYWxsb2NdIGluaXRXaXRoVG9rZW5Tb3VyY2U6YVRva2VuU291cmNlXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pICE9IG5pbCkgeworICAgICAgICB0b2tlblNvdXJjZSA9IG5pbDsKKyAgICAgICAgdG9rZW5JbmRleCA9IDA7CisgICAgICAgIGNoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblNvdXJjZTooaWQ8QU5UTFJUb2tlblNvdXJjZT4pYVRva2VuU291cmNlCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKyAgICAgICAgdG9rZW5Tb3VyY2UgPSBhVG9rZW5Tb3VyY2U7CisgICAgICAgIGlmICggdG9rZW5Tb3VyY2UgKSBbdG9rZW5Tb3VyY2UgcmV0YWluXTsKKyAgICAgICAgdG9rZW5JbmRleCA9IDA7CisgICAgICAgIGNoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtIiApOworI2VuZGlmCisgICAgaWYgKCB0b2tlblNvdXJjZSApIFt0b2tlblNvdXJjZSByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKGlkPEFOVExSVG9rZW4+KW5leHRFbGVtZW50Cit7CisgICAgaWQ8QU5UTFJUb2tlbj4gdCA9IFt0b2tlblNvdXJjZSBuZXh0VG9rZW5dOworICAgIFt0IHNldFRva2VuSW5kZXg6dG9rZW5JbmRleCsrXTsKKyAgICByZXR1cm4gdDsKK30KKworLSAoQk9PTClpc0VPRjooaWQ8QU5UTFJUb2tlbj4pYVRva2VuCit7CisgICAgcmV0dXJuIChhVG9rZW4udHlwZSA9PSBBTlRMUlRva2VuVHlwZUVPRik7Cit9ICAgIAorCistIChpZDxBTlRMUlRva2VuU291cmNlPilnZXRUb2tlblNvdXJjZQoreworICAgIHJldHVybiB0b2tlblNvdXJjZTsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZ0Zyb21TdGFydDooTlNJbnRlZ2VyKWFTdGFydCBUb0VuZDooTlNJbnRlZ2VyKWFTdG9wCit7CisgICAgcmV0dXJuIEAibi9hIjsKK30KKworLSAoTlNTdHJpbmcgKil0b1N0cmluZ0Zyb21Ub2tlbjooaWQ8QU5UTFJUb2tlbj4pYVN0YXJ0IFRvRW5kOihpZDxBTlRMUlRva2VuPilhU3RvcAoreworICAgIHJldHVybiBAIm4vYSI7Cit9CisKKy0gKE5TSW50ZWdlcilMQTooTlNJbnRlZ2VyKWFuSWR4Cit7CisgICAgcmV0dXJuIFtbc2VsZiBMVDphbklkeF0gdHlwZV07Cit9CisKKy0gKGlkPEFOVExSVG9rZW4+KW9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilhbklkeAoreworICAgIEB0aHJvdyBbQU5UTFJSdW50aW1lRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpAIkFic29sdXRlIHRva2VuIGluZGV4ZXMgYXJlIG1lYW5pbmdsZXNzIGluIGFuIHVuYnVmZmVyZWQgc3RyZWFtIl07Cit9CisKKy0gKE5TU3RyaW5nICopZ2V0U291cmNlTmFtZQoreworICAgIHJldHVybiBbdG9rZW5Tb3VyY2UgZ2V0U291cmNlTmFtZV07Cit9CisKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbmlxdWVJRE1hcC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbmlxdWVJRE1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzkyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuaXF1ZUlETWFwLmgKQEAgLTAsMCArMSw2NCBAQAorLy8KKy8vICBBTlRMUlVuaXF1ZUlETWFwLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJQdHJCdWZmZXIuaCIKKyNpbXBvcnQgIkFOVExSTm9kZU1hcEVsZW1lbnQuaCIKKworI2RlZmluZSBTVUNDRVNTICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkFJTFVSRSAgICAgICAgICAgICAtMQorI2RlZmluZSBIQVNIU0laRSAgICAgICAgICAgIDEwMQorI2RlZmluZSBIQlVGU0laRSAgICAgICAgICAgIDB4MjAwMAorCitAaW50ZXJmYWNlIEFOVExSVW5pcXVlSURNYXAgOiBBTlRMUlB0ckJ1ZmZlciB7CisgICAgTlNJbnRlZ2VyIGxhc3RIYXNoOworfQorCitAcHJvcGVydHkgKGdldHRlcj1nZXRMYXN0SGFzaCwgc2V0dGVyPXNldExhc3RIYXNoOikgTlNJbnRlZ2VyIGxhc3RIYXNoOworCisrIChpZCluZXdBTlRMUlVuaXF1ZUlETWFwOworKyAoaWQpbmV3QU5UTFJVbmlxdWVJRE1hcFdpdGhMZW46KE5TSW50ZWdlcilhSGFzaFNpemU7CisKKy0gKGlkKWluaXQ7CistIChpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWNudDsKKy0gKHZvaWQpZGVhbGxvYzsKKy8vIEluc3RhbmNlIE1ldGhvZHMKKy0gKE5TSW50ZWdlciljb3VudDsKKy0gKE5TSW50ZWdlcilzaXplOworLyogY2xlYXIgLS0gcmVpbml0aWFsaXplIHRoZSBtYXBsaXN0IGFycmF5ICovCistICh2b2lkKSBjbGVhcjsKKworLSAodm9pZClkZWxldGVBTlRMUlVuaXF1ZUlETWFwOihBTlRMUk5vZGVNYXBFbGVtZW50ICopbnA7CistICh2b2lkKWRlbGV0ZV9jaGFpbjooQU5UTFJOb2RlTWFwRWxlbWVudCAqKW5wOworLSAoaWQpZ2V0Tm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGU7CistICh2b2lkKXB1dElEOihpZClhbklEIE5vZGU6KGlkPEFOVExSQmFzZVRyZWU+KWFOb2RlOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuaXF1ZUlETWFwLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUlVuaXF1ZUlETWFwLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1MjA5MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW5pcXVlSURNYXAubQpAQCAtMCwwICsxLDE4NCBAQAorLy8KKy8vICBBTlRMUlVuaXF1ZUlETWFwLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDcvNy8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlVuaXF1ZUlETWFwLmgiCisjaW1wb3J0ICJBTlRMUlRyZWUuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSVW5pcXVlSURNYXAKK0BzeW50aGVzaXplIGxhc3RIYXNoOworCisrKGlkKW5ld0FOVExSVW5pcXVlSURNYXAKK3sKKyAgICBBTlRMUlVuaXF1ZUlETWFwICphTmV3QU5UTFJVbmlxdWVJRE1hcDsKKyAgICAKKyAgICBhTmV3QU5UTFJVbmlxdWVJRE1hcCA9IFtbQU5UTFJVbmlxdWVJRE1hcCBhbGxvY10gaW5pdF07CisJcmV0dXJuKCBhTmV3QU5UTFJVbmlxdWVJRE1hcCApOworfQorCisrKGlkKW5ld0FOVExSVW5pcXVlSURNYXBXaXRoTGVuOihOU0ludGVnZXIpYUJ1ZmZTaXplCit7CisgICAgQU5UTFJVbmlxdWVJRE1hcCAqYU5ld0FOVExSVW5pcXVlSURNYXA7CisgICAgCisgICAgYU5ld0FOVExSVW5pcXVlSURNYXAgPSBbW0FOVExSVW5pcXVlSURNYXAgYWxsb2NdIGluaXRXaXRoTGVuOmFCdWZmU2l6ZV07CisJcmV0dXJuKCBhTmV3QU5UTFJVbmlxdWVJRE1hcCApOworfQorCistKGlkKWluaXQKK3sKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjpIQVNIU0laRV0pICE9IG5pbCkgeworCQlmTmV4dCA9IG5pbDsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBIQVNIU0laRTsgaWR4KysgKSB7CisgICAgICAgICAgICBwdHJCdWZmZXJbaWR4XSA9IG5pbDsKKyAgICAgICAgfQorCX0KKyAgICByZXR1cm4oIHNlbGYgKTsKK30KKworLShpZClpbml0V2l0aExlbjooTlNJbnRlZ2VyKWFCdWZmU2l6ZQoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aExlbjphQnVmZlNpemVdKSAhPSBuaWwpIHsKKwl9CisgICAgcmV0dXJuKCBzZWxmICk7Cit9CisKKy0odm9pZClkZWFsbG9jCit7CisjaWZkZWYgREVCVUdfREVBTExPQworICAgIE5TTG9nKCBAImNhbGxlZCBkZWFsbG9jIGluIEFOVExSVW5pcXVlSURNYXAiICk7CisjZW5kaWYKKyAgICBBTlRMUk5vZGVNYXBFbGVtZW50ICp0bXAsICpydG1wOworICAgIE5TSW50ZWdlciBpZHg7CisJCisgICAgaWYgKCBzZWxmLmZOZXh0ICE9IG5pbCApIHsKKyAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBIQVNIU0laRTsgaWR4KysgKSB7CisgICAgICAgICAgICB0bXAgPSBwdHJCdWZmZXJbaWR4XTsKKyAgICAgICAgICAgIHdoaWxlICggdG1wICkgeworICAgICAgICAgICAgICAgIHJ0bXAgPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKEFOVExSTm9kZU1hcEVsZW1lbnQgKil0bXAuZk5leHQ7CisgICAgICAgICAgICAgICAgW3J0bXAgcmVsZWFzZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJW3N1cGVyIGRlYWxsb2NdOworfQorCistKHZvaWQpZGVsZXRlQU5UTFJVbmlxdWVJRE1hcDooQU5UTFJOb2RlTWFwRWxlbWVudCAqKW5wCit7CisgICAgQU5UTFJOb2RlTWFwRWxlbWVudCAqdG1wLCAqcnRtcDsKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorICAgIGlmICggc2VsZi5mTmV4dCAhPSBuaWwgKSB7CisgICAgICAgIGZvciggaWR4ID0gMDsgaWR4IDwgSEFTSFNJWkU7IGlkeCsrICkgeworICAgICAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgICAgICB3aGlsZSAoIHRtcCApIHsKKyAgICAgICAgICAgICAgICBydG1wID0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IHRtcC5mTmV4dDsKKyAgICAgICAgICAgICAgICBbcnRtcCByZWxlYXNlXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLSAodm9pZCljbGVhcgoreworICAgIEFOVExSTm9kZU1hcEVsZW1lbnQgKnRtcCwgKnJ0bXA7CisgICAgTlNJbnRlZ2VyIGlkeDsKKyAgICAKKyAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IEhBU0hTSVpFOyBpZHgrKyApIHsKKyAgICAgICAgdG1wID0gcHRyQnVmZmVyW2lkeF07CisgICAgICAgIHdoaWxlICggdG1wICkgeworICAgICAgICAgICAgcnRtcCA9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IFt0bXAgZ2V0Zk5leHRdOworICAgICAgICAgICAgW3J0bXAgcmVsZWFzZV07CisgICAgICAgIH0KKyAgICAgICAgcHRyQnVmZmVyW2lkeF0gPSBuaWw7CisgICAgfQorfQorCistIChOU0ludGVnZXIpY291bnQKK3sKKyAgICBpZCBhbkVsZW1lbnQ7CisgICAgTlNJbnRlZ2VyIGFDbnQgPSAwOworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZlNpemU7IGkrKykgeworICAgICAgICBpZiAoKGFuRWxlbWVudCA9IHB0ckJ1ZmZlcltpXSkgIT0gbmlsKSB7CisgICAgICAgICAgICBhQ250ICs9IChOU0ludGVnZXIpW2FuRWxlbWVudCBjb3VudF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFDbnQ7Cit9CisKKy0gKE5TSW50ZWdlcilzaXplCit7CisgICAgcmV0dXJuIEJ1ZmZTaXplOworfQorCistKHZvaWQpZGVsZXRlX2NoYWluOihBTlRMUk5vZGVNYXBFbGVtZW50ICopbnAKK3sKKyAgICBpZiAoIG5wLmZOZXh0ICE9IG5pbCApCisJCVtzZWxmIGRlbGV0ZV9jaGFpbjpucC5mTmV4dF07CisJW25wIHJlbGVhc2VdOworfQorCistIChpZClnZXROb2RlOihpZDxBTlRMUkJhc2VUcmVlPilhTm9kZQoreworICAgIEFOVExSTm9kZU1hcEVsZW1lbnQgKm5wOworICAgIE5TSW50ZWdlciBpZHg7CisgICAgCisgICAgaWR4ID0gWyhpZDxBTlRMUkJhc2VUcmVlPilhTm9kZSB0eXBlXTsKKyAgICBucCA9IHB0ckJ1ZmZlcltpZHhdOworICAgIHdoaWxlICggbnAgIT0gbmlsICkgeworICAgICAgICBpZiAobnAubm9kZSA9PSBhTm9kZSkgeworICAgICAgICAgICAgcmV0dXJuKCBucC5pbmRleCApOworICAgICAgICB9CisgICAgICAgIG5wID0gbnAuZk5leHQ7CisgICAgfQorICAgIHJldHVybiggbmlsICk7Cit9CisKKy0gKHZvaWQpcHV0SUQ6KGlkKWFuSUQgTm9kZTooaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUKK3sKKyAgICBBTlRMUk5vZGVNYXBFbGVtZW50ICpucCwgKm5wMTsKKyAgICBOU0ludGVnZXIgaWR4OworICAgIAorICAgIGlkeCA9IFsoaWQ8QU5UTFJCYXNlVHJlZT4pYU5vZGUgdHlwZV07CisgICAgaWR4ICU9IEhBU0hTSVpFOworICAgIG5wID0gW1tBTlRMUk5vZGVNYXBFbGVtZW50IG5ld0FOVExSTm9kZU1hcEVsZW1lbnRXaXRoSW5kZXg6YW5JRCBOb2RlOmFOb2RlXSByZXRhaW5dOworICAgIG5wMSA9IHB0ckJ1ZmZlcltpZHhdOworICAgIG5wLmZOZXh0ID0gbnAxOworICAgIHB0ckJ1ZmZlcltpZHhdID0gbnA7CisgICAgcmV0dXJuOworfQorCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiNjBlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vCisvLyAgQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaCIKKworQGludGVyZmFjZSBBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gOiBBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiB7CisKK30KKysgKEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiAqKW5ld0V4Y2VwdGlvbjsKKysgKEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiAqKW5ld0V4Y2VwdGlvbjooTlNJbnRlZ2VyKWV4cGVjdGVkIFN0cmVhbTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQ7CisKKy0gKGlkKSBpbml0OworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBBbmQ6KE5TSW50ZWdlcilleHBlY3RlZDsKKy0gKGlkPEFOVExSVG9rZW4+KWdldFVuZXhwZWN0ZWRUb2tlbjsKKy0gKE5TU3RyaW5nICopdG9TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAKKyAgICAKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiMjRmMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5tCkBAIC0wLDAgKzEsODAgQEAKKy8vCisvLyAgQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IEFsYW4gQ29uZGl0IG9uIDYvOC8xMC4KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiA6IEFOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uCisJLyoqIFVzZWQgZm9yIHJlbW90ZSBkZWJ1Z2dlciBkZXNlcmlhbGl6YXRpb24gKi8KKysgKEFOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiAqKW5ld0V4Y2VwdGlvbgoreworICAgIHJldHVybiBbW0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiBhbGxvY10gaW5pdF07Cit9CisgICAgCisrIChBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24gKiluZXdFeGNlcHRpb246KE5TSW50ZWdlcilleHBlY3RlZCBTdHJlYW06KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uIGFsbG9jXSBpbml0V2l0aFN0cmVhbTphbklucHV0IEFuZDpleHBlY3RlZF07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTppbnB1dF07CisgICAgaWYgKHNlbGYpIHsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisgICAgIAorLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBBbmQ6KE5TSW50ZWdlcilleHBlY3RlZAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06YW5JbnB1dF07CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgZXhwZWN0aW5nID0gZXhwZWN0ZWQ7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorICAgIAorLSAoaWQ8QU5UTFJUb2tlbj4pZ2V0VW5leHBlY3RlZFRva2VuCit7CisgICAgcmV0dXJuIHRva2VuOworfQorICAgIAorLSAoTlNTdHJpbmcgKil0b1N0cmluZworeworICAgIE5TU3RyaW5nICpleHAxID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIsIGV4cGVjdGVkICVkIiwgZXhwZWN0aW5nXTsKKyAgICBpZiAoIGV4cGVjdGluZyA9PSBBTlRMUlRva2VuVHlwZUludmFsaWQgKSB7CisgICAgICAgIGV4cDEgPSBAIiI7CisgICAgfQorICAgIGlmICggdG9rZW49PW5pbCApIHsKKyAgICAgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0lQCkiLCBleHAxXTsKKyAgICB9CisgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0lQCAlQCIsIHRva2VuLnRleHQsIGV4cDFdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BTlRMUl9QcmVmaXgucGNoIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJfUHJlZml4LnBjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ExMjJjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQU5UTFJfUHJlZml4LnBjaApAQCAtMCwwICsxLDI5IEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBLYXkgUm9lcGtlCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyNpZmRlZiBfX09CSkNfXworICAgICNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FycmF5SXRlcmF0b3IuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0FycmF5SXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODBmMDNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQXJyYXlJdGVyYXRvci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFyciBhbmQgQWxhbiBDb25kaXQKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisvKioKKyAqIEl0ZXJhdG9yIGZvciBhbiBhcnJheSBzbyBJIGRvbid0IGhhdmUgdG8gY29weSB0aGUgYXJyYXkgdG8gYSBMaXN0CisgKiBqdXN0IHRvIG1ha2UgaXQgaXRlcmF0YWJsZS4KKyAqLworCisvKgorICogdGhpcyBpcyB0aGUgc3RhdGUgc3RydWN0dXJlIGZvciBGYXN0RW51bWVyYXRpb24KKyB0eXBlZGVmIHN0cnVjdCB7CisgdW5zaWduZWQgbG9uZyBzdGF0ZTsKKyBpZCAqaXRlbXNQdHI7CisgdW5zaWduZWQgbG9uZyAqbXV0YXRpb25zUHRyOworIHVuc2lnbmVkIGxvbmcgZXh0cmFbNV07CisgfSBOU0Zhc3RFbnVtZXJhdGlvblN0YXRlOworICovCisKK0BpbnRlcmZhY2UgQXJyYXlJdGVyYXRvciA6IE5TT2JqZWN0IHsKKyAgICAKKyAgICBfX3N0cm9uZyBpZCBwZWVrT2JqOworICAgIC8qKgorICAgICAqIE5TQXJyYXlzIGFyZSBmaXhlZCBzaXplOyBwcmVjb21wdXRlIGNvdW50LgorICAgICAqLworICAgIE5TSW50ZWdlciBjb3VudDsKKyAgICBOU0ludGVnZXIgaW5kZXg7CisgICAgX19zdHJvbmcgTlNBcnJheSAqYW5BcnJheTsKKyAgICAKK30KKworKyAoQXJyYXlJdGVyYXRvciAqKSBuZXdJdGVyYXRvcjooTlNBcnJheSAqKWFycmF5OworKyAoQXJyYXlJdGVyYXRvciAqKSBuZXdJdGVyYXRvckZvckRpY3RLZXk6KE5TRGljdGlvbmFyeSAqKWRpY3Q7CisrIChBcnJheUl0ZXJhdG9yICopIG5ld0l0ZXJhdG9yRm9yRGljdE9iajooTlNEaWN0aW9uYXJ5ICopZGljdDsKKworLSAoaWQpIGluaXRXaXRoQXJyYXk6KE5TQXJyYXkgKilhcnJheTsKKy0gKGlkKSBpbml0V2l0aERpY3RLZXk6KE5TRGljdGlvbmFyeSAqKWRpY3Q7CistIChpZCkgaW5pdFdpdGhEaWN0T2JqOihOU0RpY3Rpb25hcnkgKilkaWN0OworCistIChCT09MKSBoYXNOZXh0OworLSAoaWQpIG5leHRPYmplY3Q7CistIChOU0FycmF5ICopYWxsT2JqZWN0czsKKy0gKHZvaWQpIHJlbW92ZU9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHg7CistIChOU0ludGVnZXIpIGNvdW50OworLSAodm9pZCkgc2V0Q291bnQ6KE5TSW50ZWdlciljbnQ7CistICh2b2lkKSBkZWFsbG9jOworCitAcHJvcGVydHkgKHJldGFpbikgaWQgcGVla09iajsKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Y291bnQsIHNldHRlcj1zZXRDb3VudDopIE5TSW50ZWdlciBjb3VudDsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBOU0ludGVnZXIgaW5kZXg7CitAcHJvcGVydHkgKHJldGFpbikgTlNBcnJheSAqYW5BcnJheTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQXJyYXlJdGVyYXRvci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQXJyYXlJdGVyYXRvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDFlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9BcnJheUl0ZXJhdG9yLm0KQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFyciBhbmQgQWxhbiBDb25kaXQKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2ltcG9ydCAiQU11dGFibGVBcnJheS5oIgorI2ltcG9ydCAiQXJyYXlJdGVyYXRvci5oIgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisKK0BjbGFzcyBBTXV0YWJsZUFycmF5OworCitAaW1wbGVtZW50YXRpb24gQXJyYXlJdGVyYXRvcgorCitAc3ludGhlc2l6ZSBwZWVrT2JqOworLy9Ac3ludGhlc2l6ZSBjb3VudDsKK0BzeW50aGVzaXplIGluZGV4OworQHN5bnRoZXNpemUgYW5BcnJheTsKKworCisrIChBcnJheUl0ZXJhdG9yICopIG5ld0l0ZXJhdG9yOihOU0FycmF5ICopYXJyYXkKK3sKKyAgICByZXR1cm4gW1tBcnJheUl0ZXJhdG9yIGFsbG9jXSBpbml0V2l0aEFycmF5OmFycmF5XTsKK30KKworKyAoQXJyYXlJdGVyYXRvciAqKSBuZXdJdGVyYXRvckZvckRpY3RLZXk6KE5TRGljdGlvbmFyeSAqKWRpY3QKK3sKKyAgICByZXR1cm4gW1tBcnJheUl0ZXJhdG9yIGFsbG9jXSBpbml0V2l0aERpY3RLZXk6ZGljdF07Cit9CisKKysgKEFycmF5SXRlcmF0b3IgKikgbmV3SXRlcmF0b3JGb3JEaWN0T2JqOihOU0RpY3Rpb25hcnkgKilkaWN0Cit7CisgICAgcmV0dXJuIFtbQXJyYXlJdGVyYXRvciBhbGxvY10gaW5pdFdpdGhEaWN0T2JqOmRpY3RdOworfQorCistIChpZCkgaW5pdFdpdGhBcnJheTooTlNBcnJheSAqKWFycmF5Cit7CisgICAgc2VsZj1bc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgaWYgKCFbYXJyYXkgaXNLaW5kT2ZDbGFzczpbTlNBcnJheSBjbGFzc11dKSB7CisgICAgICAgICAgICAgICAgQHRocm93IFtOU0V4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJBcnJheUl0ZXJhdG9yIGV4cGVjdGluZyBOU0FycmF5IGNsYXNzIGJ1dCBnb3QgJUAiLCBbYXJyYXkgY2xhc3NOYW1lXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICAgIH0KKyAgICAgICAgYW5BcnJheSA9IFthcnJheSByZXRhaW5dOworI2lmZGVmIERPTlRVU0VOT01PCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgW2FycmF5IGNvdW50XTsgaSsrKSB7CisgICAgICAgICAgICBbYW5BcnJheSBhZGRPYmplY3Q6W2FycmF5IG9iamVjdEF0SW5kZXg6aV1dOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBlZWtPYmogPSBuaWw7CisgICAgICAgIGNvdW50ID0gW2FuQXJyYXkgY291bnRdOworICAgICAgICBpbmRleCA9IDA7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChpZCkgaW5pdFdpdGhEaWN0S2V5OihOU0RpY3Rpb25hcnkgKilkaWN0Cit7CisgICAgc2VsZj1bc3VwZXIgaW5pdF07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgaWYgKCFbZGljdCBpc0tpbmRPZkNsYXNzOltOU0RpY3Rpb25hcnkgY2xhc3NdXSkgeworICAgICAgICAgICAgQHRocm93IFtOU0V4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjpbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIkFycmF5SXRlcmF0b3IgZXhwZWN0aW5nIE5TRGljdGlvbmFyeSBjbGFzcyBidXQgZ290ICVAIiwgW2RpY3QgY2xhc3NOYW1lXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICAgICAgfQorICAgICAgICBhbkFycmF5ID0gW1tbZGljdCBrZXlFbnVtZXJhdG9yXSBhbGxPYmplY3RzXSByZXRhaW5dOworICAgICAgICBwZWVrT2JqID0gbmlsOworICAgICAgICBjb3VudCA9IFthbkFycmF5IGNvdW50XTsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAoaWQpIGluaXRXaXRoRGljdE9iajooTlNEaWN0aW9uYXJ5ICopZGljdAoreworICAgIHNlbGY9W3N1cGVyIGluaXRdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIGlmICghW2RpY3QgaXNLaW5kT2ZDbGFzczpbTlNEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKKyAgICAgICAgICAgIEB0aHJvdyBbTlNFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJBcnJheUl0ZXJhdG9yIGV4cGVjdGluZyBOU0RpY3Rpb25hcnkgY2xhc3MgYnV0IGdvdCAlQCIsIFtkaWN0IGNsYXNzTmFtZV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICAgIH0KKyAgICAgICAgYW5BcnJheSA9IFtbW2RpY3Qgb2JqZWN0RW51bWVyYXRvcl0gYWxsT2JqZWN0c10gcmV0YWluXTsKKyAgICAgICAgcGVla09iaiA9IG5pbDsKKyAgICAgICAgY291bnQgPSBbYW5BcnJheSBjb3VudF07CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworeworI2lmZGVmIERFQlVHX0RFQUxMT0MKKyAgICBOU0xvZyggQCJjYWxsZWQgZGVhbGxvYyBpbiBBcnJheUl0ZXJhdG9yIiApOworI2VuZGlmCisgICAgaWYgKCBhbkFycmF5ICkgW2FuQXJyYXkgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChCT09MKSBoYXNOZXh0Cit7CisgICAgaWYgKCBwZWVrT2JqID09IG5pbCApIHsKKyAgICAgICAgcGVla09iaiA9IFtzZWxmIG5leHRPYmplY3RdOworICAgIH0KKyAgICByZXR1cm4gKChwZWVrT2JqKSA/IFlFUyA6IE5PKTsKK30KKworLSAoTlNPYmplY3QgKikgbmV4dE9iamVjdAoreworICAgIGlkIG9iaiA9IG5pbDsKKyAgICBpZiAoIHBlZWtPYmogKSB7CisgICAgICAgIG9iaiA9IHBlZWtPYmo7CisgICAgICAgIHBlZWtPYmogPSBuaWw7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGlmICggaW5kZXggPj0gY291bnQgKSB7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIGlmICggYW5BcnJheSApIHsKKyAgICAgICAgb2JqID0gW2FuQXJyYXkgb2JqZWN0QXRJbmRleDppbmRleCsrXTsKKyAgICAgICAgaWYgKCBpbmRleCA+PSBjb3VudCApIHsKKyAgICAgICAgICAgIFthbkFycmF5IHJlbGVhc2VdOworICAgICAgICAgICAgYW5BcnJheSA9IG5pbDsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2JqOworfQorCistIChOU0FycmF5ICopIGFsbE9iamVjdHMKK3sKKyAgICBpZiAoIChjb3VudCA8PSAwIHx8IGluZGV4ID49IGNvdW50KSAmJiBwZWVrT2JqID09IG5pbCApIHJldHVybiBuaWw7CisgICAgQU11dGFibGVBcnJheSAqdGhlQXJyYXkgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTpjb3VudF07CisgICAgaWYgKHBlZWtPYmopIHsKKyAgICAgICAgW3RoZUFycmF5IGFkZE9iamVjdDpwZWVrT2JqXTsKKyAgICAgICAgcGVla09iaiA9IG5pbDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBbdGhlQXJyYXkgYWRkT2JqZWN0OlthbkFycmF5IG9iamVjdEF0SW5kZXg6aV1dOworICAgIH0KKyAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlXaXRoQXJyYXk6KE5TQXJyYXkgKil0aGVBcnJheV07Cit9CisKKy0gKHZvaWQpIHJlbW92ZU9iamVjdEF0SW5kZXg6KE5TSW50ZWdlcilpZHgKK3sKKyAgICBAdGhyb3cgW0FOVExSVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAiQ2FudCByZW1vdmUgb2JqZWN0IGZyb20gQXJyYXlJdGVyYXRvciJdOworfQorCistIChOU0ludGVnZXIpIGNvdW50Cit7CisgICAgcmV0dXJuIChpbmRleCAtIGNvdW50KTsKK30KKworLSAodm9pZCkgc2V0Q291bnQ6KE5TSW50ZWdlciljbnQKK3sKKyAgICBjb3VudCA9IGNudDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQ0hBTkdFUy50eHQgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9DSEFOR0VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI3M2FhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvQ0hBTkdFUy50eHQKQEAgLTAsMCArMSwxNSBAQAorQU5UTFJ2MyBPYmplY3RpdmUgQyBGcmFtZXdvcmsKKworS2F5IFJvZXBrZSA8a3JvZXBrZUBjbGFzc2R1bXAub3JnPgorCitDSEFOR0VTCisKK0RlY2VtYmVyIDE2LCAyMDA3CisKKyogVGV4dCBvZiBpbWFnaW5hcnkgbm9kZXMgaW4gdHJlZSByZXdyaXRlIG1vZGUgd2VyZW4ndCB1c2luZyBOU1N0cmluZ3MgY2F1c2luZyBhIHJ1bnRpbWUgZXhjZXB0aW9uCisKKyogQWRkIGN1cnJlbnRseSBlbXB0eSBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIGNsYXNzLCB3aGljaCB3aWxsIGJlIGJ1ZmZlcmluZyB0cmVlIG5vZGVzCisKKyogQWRkIEFOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaCB0byBBTlRMUi5oIHVtYnJlbGxhIGluY2x1ZGUgZmlsZQorCisqIE1ldGEgY2hhbmdlOiB0aGVyZSBub3cgaXMgYSBDSEFOR0VTLnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0Zhc3RRdWV1ZS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvRmFzdFF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmMzRkNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0Zhc3RRdWV1ZS5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKzIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCitkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCitkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUubWlzYzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKiBBIHF1ZXVlIHRoYXQgY2FuIGRlcXVldWUgYW5kIGdldChpKSBpbiBPKDEpIGFuZCBncm93IGFyYml0cmFyaWx5IGxhcmdlLgorICogIEEgbGlua2VkIGxpc3QgaXMgZmFzdCBhdCBkZXF1ZXVlIGJ1dCBzbG93IGF0IGdldChpKS4gIEFuIGFycmF5IGlzCisgKiAgdGhlIHJldmVyc2UuICBUaGlzIGlzIE8oMSkgZm9yIGJvdGggb3BlcmF0aW9ucy4KKyAqCisgKiAgTGlzdCBncm93cyB1bnRpbCB5b3UgZGVxdWV1ZSBsYXN0IGVsZW1lbnQgYXQgZW5kIG9mIGJ1ZmZlci4gVGhlbgorICogIGl0IHJlc2V0cyB0byBzdGFydCBmaWxsaW5nIGF0IDAgYWdhaW4uICBJZiBhZGRzL3JlbW92ZXMgYXJlIGJhbGFuY2VkLCB0aGUKKyAqICBidWZmZXIgd2lsbCBub3QgZ3JvdyB0b28gbGFyZ2UuCisgKgorICogIE5vIGl0ZXJhdG9yIHN0dWZmIGFzIHRoYXQncyBub3QgaG93IHdlJ2xsIHVzZSBpdC4KKyAqLworcHVibGljIGNsYXNzIEZhc3RRdWV1ZTxUPiB7CisgICAgLyoqIGR5bmFtaWNhbGx5LXNpemVkIGJ1ZmZlciBvZiBlbGVtZW50cyAqLworICAgIHByb3RlY3RlZCBMaXN0PFQ+IGRhdGEgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisgICAgLyoqIGluZGV4IG9mIG5leHQgZWxlbWVudCB0byBmaWxsICovCisgICAgcHJvdGVjdGVkIGludCBwID0gMDsKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeyBwID0gMDsgZGF0YS5jbGVhcigpOyB9CisKKyAgICAvKiogR2V0IGFuZCByZW1vdmUgZmlyc3QgZWxlbWVudCBpbiBxdWV1ZSAqLworICAgIHB1YmxpYyBUIHJlbW92ZSgpIHsKKyAgICAgICAgVCBvID0gZ2V0KDApOworICAgICAgICBwKys7CisgICAgICAgIC8vIGhhdmUgd2UgaGl0IGVuZCBvZiBidWZmZXI/CisgICAgICAgIGlmICggcCA9PSBkYXRhLnNpemUoKSApIHsKKyAgICAgICAgICAgIC8vIGlmIHNvLCBpdCdzIGFuIG9wcG9ydHVuaXR5IHRvIHN0YXJ0IGZpbGxpbmcgYXQgaW5kZXggMCBhZ2FpbgorICAgICAgICAgICAgY2xlYXIoKTsgLy8gc2l6ZSBnb2VzIHRvIDAsIGJ1dCByZXRhaW5zIG1lbW9yeQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChUIG8pIHsgZGF0YS5hZGQobyk7IH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsgcmV0dXJuIGRhdGEuc2l6ZSgpIC0gcDsgfQorCisgICAgcHVibGljIFQgaGVhZCgpIHsgcmV0dXJuIGdldCgwKTsgfQorCisgICAgLyoqIFJldHVybiBlbGVtZW50IGkgZWxlbWVudHMgYWhlYWQgb2YgY3VycmVudCBlbGVtZW50LiAgaT09MCBnZXRzCisgICAgICogIGN1cnJlbnQgZWxlbWVudC4gIFRoaXMgaXMgbm90IGFuIGFic29sdXRlIGluZGV4IGludG8gdGhlIGRhdGEgbGlzdAorICAgICAqICBzaW5jZSBwIGRlZmluZXMgdGhlIHN0YXJ0IG9mIHRoZSByZWFsIGxpc3QuCisgICAgICovCisgICAgcHVibGljIFQgZ2V0KGludCBpKSB7CisgICAgICAgIGlmICggcCtpID49IGRhdGEuc2l6ZSgpICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oInF1ZXVlIGluZGV4ICIrKHAraSkrIiA+IHNpemUgIitkYXRhLnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGEuZ2V0KHAraSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7IHAgPSAwOyBkYXRhLmNsZWFyKCk7IH0KKworICAgIC8qKiBSZXR1cm4gc3RyaW5nIG9mIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzOyBub24tZGVzdHJ1Y3RpdmUgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgbiA9IHNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG47IGkrKykgeworICAgICAgICAgICAgYnVmLmFwcGVuZChnZXQoaSkpOworICAgICAgICAgICAgaWYgKCAoaSsxKTxuICkgYnVmLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvRmFzdFF1ZXVlLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9GYXN0UXVldWUubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWYzNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvRmFzdFF1ZXVlLm0KQEAgLTAsMCArMSw5MyBAQAorLyoKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKK2RvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiszLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKK2Rlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS5taXNjOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqIEEgcXVldWUgdGhhdCBjYW4gZGVxdWV1ZSBhbmQgZ2V0KGkpIGluIE8oMSkgYW5kIGdyb3cgYXJiaXRyYXJpbHkgbGFyZ2UuCisgKiAgQSBsaW5rZWQgbGlzdCBpcyBmYXN0IGF0IGRlcXVldWUgYnV0IHNsb3cgYXQgZ2V0KGkpLiAgQW4gYXJyYXkgaXMKKyAqICB0aGUgcmV2ZXJzZS4gIFRoaXMgaXMgTygxKSBmb3IgYm90aCBvcGVyYXRpb25zLgorICoKKyAqICBMaXN0IGdyb3dzIHVudGlsIHlvdSBkZXF1ZXVlIGxhc3QgZWxlbWVudCBhdCBlbmQgb2YgYnVmZmVyLiBUaGVuCisgKiAgaXQgcmVzZXRzIHRvIHN0YXJ0IGZpbGxpbmcgYXQgMCBhZ2Fpbi4gIElmIGFkZHMvcmVtb3ZlcyBhcmUgYmFsYW5jZWQsIHRoZQorICogIGJ1ZmZlciB3aWxsIG5vdCBncm93IHRvbyBsYXJnZS4KKyAqCisgKiAgTm8gaXRlcmF0b3Igc3R1ZmYgYXMgdGhhdCdzIG5vdCBob3cgd2UnbGwgdXNlIGl0LgorICovCitwdWJsaWMgY2xhc3MgRmFzdFF1ZXVlPFQ+IHsKKyAgICAvKiogZHluYW1pY2FsbHktc2l6ZWQgYnVmZmVyIG9mIGVsZW1lbnRzICovCisgICAgcHJvdGVjdGVkIExpc3Q8VD4gZGF0YSA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKKyAgICAvKiogaW5kZXggb2YgbmV4dCBlbGVtZW50IHRvIGZpbGwgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHAgPSAwOworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7IHAgPSAwOyBkYXRhLmNsZWFyKCk7IH0KKworICAgIC8qKiBHZXQgYW5kIHJlbW92ZSBmaXJzdCBlbGVtZW50IGluIHF1ZXVlICovCisgICAgcHVibGljIFQgcmVtb3ZlKCkgeworICAgICAgICBUIG8gPSBnZXQoMCk7CisgICAgICAgIHArKzsKKyAgICAgICAgLy8gaGF2ZSB3ZSBoaXQgZW5kIG9mIGJ1ZmZlcj8KKyAgICAgICAgaWYgKCBwID09IGRhdGEuc2l6ZSgpICkgeworICAgICAgICAgICAgLy8gaWYgc28sIGl0J3MgYW4gb3Bwb3J0dW5pdHkgdG8gc3RhcnQgZmlsbGluZyBhdCBpbmRleCAwIGFnYWluCisgICAgICAgICAgICBjbGVhcigpOyAvLyBzaXplIGdvZXMgdG8gMCwgYnV0IHJldGFpbnMgbWVtb3J5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKFQgbykgeyBkYXRhLmFkZChvKTsgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeyByZXR1cm4gZGF0YS5zaXplKCkgLSBwOyB9CisKKyAgICBwdWJsaWMgVCBoZWFkKCkgeyByZXR1cm4gZ2V0KDApOyB9CisKKyAgICAvKiogUmV0dXJuIGVsZW1lbnQgaSBlbGVtZW50cyBhaGVhZCBvZiBjdXJyZW50IGVsZW1lbnQuICBpPT0wIGdldHMKKyAgICAgKiAgY3VycmVudCBlbGVtZW50LiAgVGhpcyBpcyBub3QgYW4gYWJzb2x1dGUgaW5kZXggaW50byB0aGUgZGF0YSBsaXN0CisgICAgICogIHNpbmNlIHAgZGVmaW5lcyB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVCBnZXQoaW50IGkpIHsKKyAgICAgICAgaWYgKCBwK2kgPj0gZGF0YS5zaXplKCkgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigicXVldWUgaW5kZXggIisocCtpKSsiID4gc2l6ZSAiK2RhdGEuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YS5nZXQocCtpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsgcCA9IDA7IGRhdGEuY2xlYXIoKTsgfQorCisgICAgLyoqIFJldHVybiBzdHJpbmcgb2YgY3VycmVudCBidWZmZXIgY29udGVudHM7IG5vbi1kZXN0cnVjdGl2ZSAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGludCBuID0gc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGdldChpKSk7CisgICAgICAgICAgICBpZiAoIChpKzEpPG4gKSBidWYuYXBwZW5kKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFkN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvSW5mby5wbGlzdApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgorCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+CisJPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5vcmcuYW50bHIuYW50bHJmcmFtZXdvcms8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgorCTxzdHJpbmc+JHtQUk9EVUNUX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+CisJPHN0cmluZz5GTVdLPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgorCTxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPjwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0ludEFycmF5LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9JbnRBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzU3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9JbnRBcnJheS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS5taXNjOworCisvKiogQSBkeW5hbWljIGFycmF5IHRoYXQgdXNlcyBpbnQgbm90IEludGVnZXIgb2JqZWN0cy4gSW4gcHJpbmNpcGxlIHRoaXMKKyAqICBpcyBtb3JlIGVmZmljaWVudCBpbiB0aW1lLCBidXQgY2VydGFpbmx5IGluIHNwYWNlLgorICoKKyAqICBUaGlzIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgZGF0YSBhcnJheSBkaXJlY3RseSwKKyAqICBidXQgbWFrZSBzdXJlIHRoYXQgeW91IGFwcGVuZCBlbGVtZW50cyBvbmx5IHdpdGggYWRkKCkgc28gdGhhdCB5b3UKKyAqICBnZXQgZHluYW1pYyBzaXppbmcuICBNYWtlIHN1cmUgdG8gY2FsbCBlbnN1cmVDYXBhY2l0eSgpIHdoZW4geW91IGFyZQorICogIG1hbnVhbGx5IGFkZGluZyBuZXcgZWxlbWVudHMuCisgKgorICogIERvZXNuJ3QgaW1wbCBMaXN0IGJlY2F1c2UgaXQgZG9lc24ndCByZXR1cm4gb2JqZWN0cyBhbmQgSSBtZWFuIHRoaXMKKyAqICByZWFsbHkgYXMganVzdCBhbiBhcnJheSBub3QgYSBMaXN0IHBlciBzZS4gIE1hbmlwdWxhdGUgdGhlIGVsZW1lbnRzCisgKiAgYXQgd2lsbC4gIFRoaXMgaGFzIHN0YWNrIG1ldGhvZHMgdG9vLgorICoKKyAqICBXaGVuIHJ1bnRpbWUgY2FuIGJlIDEuNSwgSSdsbCBtYWtlIHRoaXMgZ2VuZXJpYy4KKyAqLworcHVibGljIGNsYXNzIEludEFycmF5IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1NJWkUgPSAxMDsKKwlwdWJsaWMgaW50W10gZGF0YTsKKwlwcm90ZWN0ZWQgaW50IHAgPSAtMTsKKworCXB1YmxpYyB2b2lkIGFkZChpbnQgdikgeworCQllbnN1cmVDYXBhY2l0eShwKzEpOworCQlkYXRhWysrcF0gPSB2OworCX0KKworCXB1YmxpYyB2b2lkIHB1c2goaW50IHYpIHsKKwkJYWRkKHYpOworCX0KKworCXB1YmxpYyBpbnQgcG9wKCkgeworCQlpbnQgdiA9IGRhdGFbcF07CisJCXAtLTsKKwkJcmV0dXJuIHY7CisJfQorCisJLyoqIFRoaXMgb25seSB0cmFja3MgZWxlbWVudHMgYWRkZWQgdmlhIHB1c2gvYWRkLiAqLworCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJcmV0dXJuIHA7CisJfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHAgPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgaW5kZXgpIHsKKwkJaWYgKCBkYXRhPT1udWxsICkgeworCQkJZGF0YSA9IG5ldyBpbnRbSU5JVElBTF9TSVpFXTsKKwkJfQorCQllbHNlIGlmICggKGluZGV4KzEpPj1kYXRhLmxlbmd0aCApIHsKKwkJCWludCBuZXdTaXplID0gZGF0YS5sZW5ndGgqMjsKKwkJCWlmICggaW5kZXg+bmV3U2l6ZSApIHsKKwkJCQluZXdTaXplID0gaW5kZXgrMTsKKwkJCX0KKwkJCWludFtdIG5ld0RhdGEgPSBuZXcgaW50W25ld1NpemVdOworCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlkYXRhID0gbmV3RGF0YTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0ludEFycmF5Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9JbnRBcnJheS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzU3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9JbnRBcnJheS5tCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2VuY2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworcGFja2FnZSBvcmcuYW50bHIucnVudGltZS5taXNjOworCisvKiogQSBkeW5hbWljIGFycmF5IHRoYXQgdXNlcyBpbnQgbm90IEludGVnZXIgb2JqZWN0cy4gSW4gcHJpbmNpcGxlIHRoaXMKKyAqICBpcyBtb3JlIGVmZmljaWVudCBpbiB0aW1lLCBidXQgY2VydGFpbmx5IGluIHNwYWNlLgorICoKKyAqICBUaGlzIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgZGF0YSBhcnJheSBkaXJlY3RseSwKKyAqICBidXQgbWFrZSBzdXJlIHRoYXQgeW91IGFwcGVuZCBlbGVtZW50cyBvbmx5IHdpdGggYWRkKCkgc28gdGhhdCB5b3UKKyAqICBnZXQgZHluYW1pYyBzaXppbmcuICBNYWtlIHN1cmUgdG8gY2FsbCBlbnN1cmVDYXBhY2l0eSgpIHdoZW4geW91IGFyZQorICogIG1hbnVhbGx5IGFkZGluZyBuZXcgZWxlbWVudHMuCisgKgorICogIERvZXNuJ3QgaW1wbCBMaXN0IGJlY2F1c2UgaXQgZG9lc24ndCByZXR1cm4gb2JqZWN0cyBhbmQgSSBtZWFuIHRoaXMKKyAqICByZWFsbHkgYXMganVzdCBhbiBhcnJheSBub3QgYSBMaXN0IHBlciBzZS4gIE1hbmlwdWxhdGUgdGhlIGVsZW1lbnRzCisgKiAgYXQgd2lsbC4gIFRoaXMgaGFzIHN0YWNrIG1ldGhvZHMgdG9vLgorICoKKyAqICBXaGVuIHJ1bnRpbWUgY2FuIGJlIDEuNSwgSSdsbCBtYWtlIHRoaXMgZ2VuZXJpYy4KKyAqLworcHVibGljIGNsYXNzIEludEFycmF5IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1NJWkUgPSAxMDsKKwlwdWJsaWMgaW50W10gZGF0YTsKKwlwcm90ZWN0ZWQgaW50IHAgPSAtMTsKKworCXB1YmxpYyB2b2lkIGFkZChpbnQgdikgeworCQllbnN1cmVDYXBhY2l0eShwKzEpOworCQlkYXRhWysrcF0gPSB2OworCX0KKworCXB1YmxpYyB2b2lkIHB1c2goaW50IHYpIHsKKwkJYWRkKHYpOworCX0KKworCXB1YmxpYyBpbnQgcG9wKCkgeworCQlpbnQgdiA9IGRhdGFbcF07CisJCXAtLTsKKwkJcmV0dXJuIHY7CisJfQorCisJLyoqIFRoaXMgb25seSB0cmFja3MgZWxlbWVudHMgYWRkZWQgdmlhIHB1c2gvYWRkLiAqLworCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJcmV0dXJuIHA7CisJfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHAgPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgaW5kZXgpIHsKKwkJaWYgKCBkYXRhPT1udWxsICkgeworCQkJZGF0YSA9IG5ldyBpbnRbSU5JVElBTF9TSVpFXTsKKwkJfQorCQllbHNlIGlmICggKGluZGV4KzEpPj1kYXRhLmxlbmd0aCApIHsKKwkJCWludCBuZXdTaXplID0gZGF0YS5sZW5ndGgqMjsKKwkJCWlmICggaW5kZXg+bmV3U2l6ZSApIHsKKwkJCQluZXdTaXplID0gaW5kZXgrMTsKKwkJCX0KKwkJCWludFtdIG5ld0RhdGEgPSBuZXcgaW50W25ld1NpemVdOworCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlkYXRhID0gbmV3RGF0YTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0xvb2thaGVhZFN0cmVhbS5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvTG9va2FoZWFkU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3ZDdhOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0xvb2thaGVhZFN0cmVhbS5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLm1pc2M7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKiogQSBsb29rYWhlYWQgcXVldWUgdGhhdCBrbm93cyBob3cgdG8gbWFyay9yZWxlYXNlIGxvY2F0aW9ucworICogIGluIHRoZSBidWZmZXIgZm9yIGJhY2t0cmFja2luZyBwdXJwb3Nlcy4gQW55IG1hcmtlcnMgZm9yY2UgdGhlIEZhc3RRdWV1ZQorICogIHN1cGVyY2xhc3MgdG8ga2VlcCBhbGwgdG9rZW5zIHVudGlsIG5vIG1vcmUgbWFya2VyczsgdGhlbiBjYW4gcmVzZXQKKyAqICB0byBhdm9pZCBncm93aW5nIGEgaHVnZSBidWZmZXIuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rYWhlYWRTdHJlYW08VD4gZXh0ZW5kcyBGYXN0UXVldWU8VD4geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRURfRU9GX0VMRU1FTlRfSU5ERVggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIC8qKiBTZXQgdG8gYnVmZmVyIGluZGV4IG9mIGVvZiB3aGVuIG5leHRFbGVtZW50IHJldHVybnMgZW9mICovCisgICAgcHJvdGVjdGVkIGludCBlb2ZFbGVtZW50SW5kZXggPSBVTklOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYOworCisgICAgLyoqIFJldHVybmVkIGJ5IG5leHRFbGVtZW50IHVwb24gZW5kIG9mIHN0cmVhbTsgd2UgYWRkIHRvIGJ1ZmZlciBhbHNvICovCisgICAgcHVibGljIFQgZW9mID0gbnVsbDsKKworICAgIC8qKiBUcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxhc3RNYXJrZXI7CisKKyAgICAvKiogdHJhY2tzIGhvdyBkZWVwIG1hcmsoKSBjYWxscyBhcmUgbmVzdGVkICovCisgICAgcHJvdGVjdGVkIGludCBtYXJrRGVwdGggPSAwOyAgICAKKworICAgIHB1YmxpYyBMb29rYWhlYWRTdHJlYW0oVCBlb2YpIHsKKyAgICAgICAgdGhpcy5lb2YgPSBlb2Y7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGVvZkVsZW1lbnRJbmRleCA9IFVOSU5JVElBTElaRURfRU9GX0VMRU1FTlRfSU5ERVg7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgfQorICAgIAorICAgIC8qKiBJbXBsZW1lbnQgbmV4dEVsZW1lbnQgdG8gc3VwcGx5IGEgc3RyZWFtIG9mIGVsZW1lbnRzIHRvIHRoaXMKKyAgICAgKiAgbG9va2FoZWFkIGJ1ZmZlci4gIFJldHVybiBlb2YgdXBvbiBlbmQgb2YgdGhlIHN0cmVhbSB3ZSdyZSBwdWxsaW5nIGZyb20uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFQgbmV4dEVsZW1lbnQoKTsKKworICAgIC8qKiBHZXQgYW5kIHJlbW92ZSBmaXJzdCBlbGVtZW50IGluIHF1ZXVlOyBvdmVycmlkZSBGYXN0UXVldWUucmVtb3ZlKCkgKi8KKyAgICBwdWJsaWMgVCByZW1vdmUoKSB7CisgICAgICAgIFQgbyA9IGdldCgwKTsKKyAgICAgICAgcCsrOworICAgICAgICAvLyBoYXZlIHdlIGhpdCBlbmQgb2YgYnVmZmVyIGFuZCBub3QgYmFja3RyYWNraW5nPworICAgICAgICBpZiAoIHAgPT0gZGF0YS5zaXplKCkgJiYgbWFya0RlcHRoPT0wICkgeworICAgICAgICAgICAgLy8gaWYgc28sIGl0J3MgYW4gb3Bwb3J0dW5pdHkgdG8gc3RhcnQgZmlsbGluZyBhdCBpbmRleCAwIGFnYWluCisgICAgICAgICAgICBjbGVhcigpOyAvLyBzaXplIGdvZXMgdG8gMCwgYnV0IHJldGFpbnMgbWVtb3J5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgLyoqIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRvIHJlbW92ZSwgZXZlbiBpZiBFT0YgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25zdW1lKCkgeyBzeW5jKDEpOyByZW1vdmUoKTsgfQorCisgICAgLyoqIE1ha2Ugc3VyZSB3ZSBoYXZlICduZWVkJyBlbGVtZW50cyBmcm9tIGN1cnJlbnQgcG9zaXRpb24gcC4gTGFzdCB2YWxpZAorICAgICAqICBwIGluZGV4IGlzIGRhdGEuc2l6ZSgpLTEuICBwK25lZWQtMSBpcyB0aGUgZGF0YSBpbmRleCAnbmVlZCcgZWxlbWVudHMKKyAgICAgKiAgYWhlYWQuICBJZiB3ZSBuZWVkIDEgZWxlbWVudCwgKHArMS0xKT09cCBtdXN0IGJlIDwgZGF0YS5zaXplKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luYyhpbnQgbmVlZCkgeworICAgICAgICBpbnQgbiA9IChwK25lZWQtMSkgLSBkYXRhLnNpemUoKSArIDE7IC8vIGhvdyBtYW55IG1vcmUgZWxlbWVudHMgd2UgbmVlZD8KKyAgICAgICAgaWYgKCBuID4gMCApIGZpbGwobik7ICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgZWxlbWVudHM/CisgICAgfQorCisgICAgLyoqIGFkZCBuIGVsZW1lbnRzIHRvIGJ1ZmZlciAqLworICAgIHB1YmxpYyB2b2lkIGZpbGwoaW50IG4pIHsKKyAgICAgICAgZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspIHsKKyAgICAgICAgICAgIFQgbyA9IG5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoIG89PWVvZiApIHsKKyAgICAgICAgICAgICAgICBkYXRhLmFkZChlb2YpOworICAgICAgICAgICAgICAgIGVvZkVsZW1lbnRJbmRleCA9IGRhdGEuc2l6ZSgpLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGRhdGEuYWRkKG8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy9wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeyByZXR1cm4gZW9mRWxlbWVudEluZGV4IT1VTklOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYOyB9CisgICAgCisgICAgLyoqIFNpemUgb2YgZW50aXJlIHN0cmVhbSBpcyB1bmtub3duOyB3ZSBvbmx5IGtub3cgYnVmZmVyIHNpemUgZnJvbSBGYXN0UXVldWUgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic3RyZWFtcyBhcmUgb2YgdW5rbm93biBzaXplIik7IH0KKworICAgIHB1YmxpYyBPYmplY3QgTFQoaW50IGspIHsKKwkJaWYgKCBrPT0wICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKCBrPDAgKSB7CisJCQlyZXR1cm4gTEIoLWspOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludCgiTFQocD0iK3ArIiwiK2srIik9Iik7CisJCWlmICggKHAray0xKSA+PSBlb2ZFbGVtZW50SW5kZXggKSB7IC8vIG1vdmUgdG8gc3VwZXIuTFQKKwkJCXJldHVybiBlb2Y7CisJCX0KKyAgICAgICAgc3luYyhrKTsKKyAgICAgICAgcmV0dXJuIGdldChrLTEpOworCX0KKworCS8qKiBMb29rIGJhY2t3YXJkcyBrIG5vZGVzICovCisJcHJvdGVjdGVkIE9iamVjdCBMQihpbnQgaykgeworCQlpZiAoIGs9PTAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIChwLWspPDAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZ2V0KC1rKTsKKwl9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnRTeW1ib2woKSB7IHJldHVybiBMVCgxKTsgfQorCisgICAgcHVibGljIGludCBpbmRleCgpIHsgcmV0dXJuIHA7IH0KKworCXB1YmxpYyBpbnQgbWFyaygpIHsKKyAgICAgICAgbWFya0RlcHRoKys7CisgICAgICAgIGxhc3RNYXJrZXIgPSBpbmRleCgpOworICAgICAgICByZXR1cm4gbGFzdE1hcmtlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWxlYXNlKGludCBtYXJrZXIpIHsKKwkJLy8gbm8gcmVzb3VyY2VzIHRvIHJlbGVhc2UKKwl9CisKKwlwdWJsaWMgdm9pZCByZXdpbmQoaW50IG1hcmtlcikgeworICAgICAgICBtYXJrRGVwdGgtLTsKKyAgICAgICAgc2VlayhtYXJrZXIpOyAvLyBhc3N1bWUgbWFya2VyIGlzIHRvcAorICAgICAgICAvLyByZWxlYXNlKG1hcmtlcik7IC8vIHdhc3RlIG9mIGNhbGw7IGl0IGRvZXMgbm90aGluZyBpbiB0aGlzIGNsYXNzCisgICAgfQorCisJcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICBzZWVrKGxhc3RNYXJrZXIpOyAvLyByZXdpbmQgYnV0IGRvIG5vdCByZWxlYXNlIG1hcmtlcgorICAgIH0KKworICAgIC8qKiBTZWVrIHRvIGEgMC1pbmRleGVkIHBvc2l0aW9uIHdpdGhpbiBkYXRhIGJ1ZmZlci4gIENhbid0IGhhbmRsZQorICAgICAqICBjYXNlIHdoZXJlIHlvdSBzZWVrIGJleW9uZCBlbmQgb2YgZXhpc3RpbmcgYnVmZmVyLiAgTm9ybWFsbHkgdXNlZAorICAgICAqICB0byBzZWVrIGJhY2t3YXJkcyBpbiB0aGUgYnVmZmVyLiBEb2VzIG5vdCBmb3JjZSBsb2FkaW5nIG9mIG5vZGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlZWsoaW50IGluZGV4KSB7IHAgPSBpbmRleDsgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0xvb2thaGVhZFN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvTG9va2FoZWFkU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3ZDdhOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL0xvb2thaGVhZFN0cmVhbS5tCkBAIC0wLDAgKzEsMTYzIEBACisvKgorW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitwYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lLm1pc2M7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKiogQSBsb29rYWhlYWQgcXVldWUgdGhhdCBrbm93cyBob3cgdG8gbWFyay9yZWxlYXNlIGxvY2F0aW9ucworICogIGluIHRoZSBidWZmZXIgZm9yIGJhY2t0cmFja2luZyBwdXJwb3Nlcy4gQW55IG1hcmtlcnMgZm9yY2UgdGhlIEZhc3RRdWV1ZQorICogIHN1cGVyY2xhc3MgdG8ga2VlcCBhbGwgdG9rZW5zIHVudGlsIG5vIG1vcmUgbWFya2VyczsgdGhlbiBjYW4gcmVzZXQKKyAqICB0byBhdm9pZCBncm93aW5nIGEgaHVnZSBidWZmZXIuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rYWhlYWRTdHJlYW08VD4gZXh0ZW5kcyBGYXN0UXVldWU8VD4geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRURfRU9GX0VMRU1FTlRfSU5ERVggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIC8qKiBTZXQgdG8gYnVmZmVyIGluZGV4IG9mIGVvZiB3aGVuIG5leHRFbGVtZW50IHJldHVybnMgZW9mICovCisgICAgcHJvdGVjdGVkIGludCBlb2ZFbGVtZW50SW5kZXggPSBVTklOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYOworCisgICAgLyoqIFJldHVybmVkIGJ5IG5leHRFbGVtZW50IHVwb24gZW5kIG9mIHN0cmVhbTsgd2UgYWRkIHRvIGJ1ZmZlciBhbHNvICovCisgICAgcHVibGljIFQgZW9mID0gbnVsbDsKKworICAgIC8qKiBUcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxhc3RNYXJrZXI7CisKKyAgICAvKiogdHJhY2tzIGhvdyBkZWVwIG1hcmsoKSBjYWxscyBhcmUgbmVzdGVkICovCisgICAgcHJvdGVjdGVkIGludCBtYXJrRGVwdGggPSAwOyAgICAKKworICAgIHB1YmxpYyBMb29rYWhlYWRTdHJlYW0oVCBlb2YpIHsKKyAgICAgICAgdGhpcy5lb2YgPSBlb2Y7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGVvZkVsZW1lbnRJbmRleCA9IFVOSU5JVElBTElaRURfRU9GX0VMRU1FTlRfSU5ERVg7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgfQorICAgIAorICAgIC8qKiBJbXBsZW1lbnQgbmV4dEVsZW1lbnQgdG8gc3VwcGx5IGEgc3RyZWFtIG9mIGVsZW1lbnRzIHRvIHRoaXMKKyAgICAgKiAgbG9va2FoZWFkIGJ1ZmZlci4gIFJldHVybiBlb2YgdXBvbiBlbmQgb2YgdGhlIHN0cmVhbSB3ZSdyZSBwdWxsaW5nIGZyb20uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFQgbmV4dEVsZW1lbnQoKTsKKworICAgIC8qKiBHZXQgYW5kIHJlbW92ZSBmaXJzdCBlbGVtZW50IGluIHF1ZXVlOyBvdmVycmlkZSBGYXN0UXVldWUucmVtb3ZlKCkgKi8KKyAgICBwdWJsaWMgVCByZW1vdmUoKSB7CisgICAgICAgIFQgbyA9IGdldCgwKTsKKyAgICAgICAgcCsrOworICAgICAgICAvLyBoYXZlIHdlIGhpdCBlbmQgb2YgYnVmZmVyIGFuZCBub3QgYmFja3RyYWNraW5nPworICAgICAgICBpZiAoIHAgPT0gZGF0YS5zaXplKCkgJiYgbWFya0RlcHRoPT0wICkgeworICAgICAgICAgICAgLy8gaWYgc28sIGl0J3MgYW4gb3Bwb3J0dW5pdHkgdG8gc3RhcnQgZmlsbGluZyBhdCBpbmRleCAwIGFnYWluCisgICAgICAgICAgICBjbGVhcigpOyAvLyBzaXplIGdvZXMgdG8gMCwgYnV0IHJldGFpbnMgbWVtb3J5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgLyoqIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRvIHJlbW92ZSwgZXZlbiBpZiBFT0YgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25zdW1lKCkgeyBzeW5jKDEpOyByZW1vdmUoKTsgfQorCisgICAgLyoqIE1ha2Ugc3VyZSB3ZSBoYXZlICduZWVkJyBlbGVtZW50cyBmcm9tIGN1cnJlbnQgcG9zaXRpb24gcC4gTGFzdCB2YWxpZAorICAgICAqICBwIGluZGV4IGlzIGRhdGEuc2l6ZSgpLTEuICBwK25lZWQtMSBpcyB0aGUgZGF0YSBpbmRleCAnbmVlZCcgZWxlbWVudHMKKyAgICAgKiAgYWhlYWQuICBJZiB3ZSBuZWVkIDEgZWxlbWVudCwgKHArMS0xKT09cCBtdXN0IGJlIDwgZGF0YS5zaXplKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luYyhpbnQgbmVlZCkgeworICAgICAgICBpbnQgbiA9IChwK25lZWQtMSkgLSBkYXRhLnNpemUoKSArIDE7IC8vIGhvdyBtYW55IG1vcmUgZWxlbWVudHMgd2UgbmVlZD8KKyAgICAgICAgaWYgKCBuID4gMCApIGZpbGwobik7ICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgZWxlbWVudHM/CisgICAgfQorCisgICAgLyoqIGFkZCBuIGVsZW1lbnRzIHRvIGJ1ZmZlciAqLworICAgIHB1YmxpYyB2b2lkIGZpbGwoaW50IG4pIHsKKyAgICAgICAgZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspIHsKKyAgICAgICAgICAgIFQgbyA9IG5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoIG89PWVvZiApIHsKKyAgICAgICAgICAgICAgICBkYXRhLmFkZChlb2YpOworICAgICAgICAgICAgICAgIGVvZkVsZW1lbnRJbmRleCA9IGRhdGEuc2l6ZSgpLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGRhdGEuYWRkKG8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy9wdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeyByZXR1cm4gZW9mRWxlbWVudEluZGV4IT1VTklOSVRJQUxJWkVEX0VPRl9FTEVNRU5UX0lOREVYOyB9CisgICAgCisgICAgLyoqIFNpemUgb2YgZW50aXJlIHN0cmVhbSBpcyB1bmtub3duOyB3ZSBvbmx5IGtub3cgYnVmZmVyIHNpemUgZnJvbSBGYXN0UXVldWUgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigic3RyZWFtcyBhcmUgb2YgdW5rbm93biBzaXplIik7IH0KKworICAgIHB1YmxpYyBPYmplY3QgTFQoaW50IGspIHsKKwkJaWYgKCBrPT0wICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKCBrPDAgKSB7CisJCQlyZXR1cm4gTEIoLWspOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludCgiTFQocD0iK3ArIiwiK2srIik9Iik7CisJCWlmICggKHAray0xKSA+PSBlb2ZFbGVtZW50SW5kZXggKSB7IC8vIG1vdmUgdG8gc3VwZXIuTFQKKwkJCXJldHVybiBlb2Y7CisJCX0KKyAgICAgICAgc3luYyhrKTsKKyAgICAgICAgcmV0dXJuIGdldChrLTEpOworCX0KKworCS8qKiBMb29rIGJhY2t3YXJkcyBrIG5vZGVzICovCisJcHJvdGVjdGVkIE9iamVjdCBMQihpbnQgaykgeworCQlpZiAoIGs9PTAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIChwLWspPDAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZ2V0KC1rKTsKKwl9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnRTeW1ib2woKSB7IHJldHVybiBMVCgxKTsgfQorCisgICAgcHVibGljIGludCBpbmRleCgpIHsgcmV0dXJuIHA7IH0KKworCXB1YmxpYyBpbnQgbWFyaygpIHsKKyAgICAgICAgbWFya0RlcHRoKys7CisgICAgICAgIGxhc3RNYXJrZXIgPSBpbmRleCgpOworICAgICAgICByZXR1cm4gbGFzdE1hcmtlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCByZWxlYXNlKGludCBtYXJrZXIpIHsKKwkJLy8gbm8gcmVzb3VyY2VzIHRvIHJlbGVhc2UKKwl9CisKKwlwdWJsaWMgdm9pZCByZXdpbmQoaW50IG1hcmtlcikgeworICAgICAgICBtYXJrRGVwdGgtLTsKKyAgICAgICAgc2VlayhtYXJrZXIpOyAvLyBhc3N1bWUgbWFya2VyIGlzIHRvcAorICAgICAgICAvLyByZWxlYXNlKG1hcmtlcik7IC8vIHdhc3RlIG9mIGNhbGw7IGl0IGRvZXMgbm90aGluZyBpbiB0aGlzIGNsYXNzCisgICAgfQorCisJcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICBzZWVrKGxhc3RNYXJrZXIpOyAvLyByZXdpbmQgYnV0IGRvIG5vdCByZWxlYXNlIG1hcmtlcgorICAgIH0KKworICAgIC8qKiBTZWVrIHRvIGEgMC1pbmRleGVkIHBvc2l0aW9uIHdpdGhpbiBkYXRhIGJ1ZmZlci4gIENhbid0IGhhbmRsZQorICAgICAqICBjYXNlIHdoZXJlIHlvdSBzZWVrIGJleW9uZCBlbmQgb2YgZXhpc3RpbmcgYnVmZmVyLiAgTm9ybWFsbHkgdXNlZAorICAgICAqICB0byBzZWVrIGJhY2t3YXJkcyBpbiB0aGUgYnVmZmVyLiBEb2VzIG5vdCBmb3JjZSBsb2FkaW5nIG9mIG5vZGVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlZWsoaW50IGluZGV4KSB7IHAgPSBpbmRleDsgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL1JFQURNRS5ydGYgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9SRUFETUUucnRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWIwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9SRUFETUUucnRmCkBAIC0wLDAgKzEsMzQgQEAKK3tccnRmMVxtYWNcYW5zaWNwZzEwMDAwXGNvY29hcnRmODI0XGNvY29hc3VicnRmNDIwCit7XGZvbnR0YmxcZjBcZm5pbFxmY2hhcnNldDc3IEx1Y2lkYUdyYW5kZTtcZjFcZm5pbFxmY2hhcnNldDc3IEx1Y2lkYUdyYW5kZS1Cb2xkO30KK3tcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O1xyZWQyNTVcZ3JlZW4wXGJsdWUwO30KK1xwYXJkXHR4NTY2XHR4MTEzM1x0eDE3MDBcdHgyMjY3XHR4MjgzNFx0eDM0MDFcdHgzOTY4XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNlx0eDY4MDNccWxccW5hdHVyYWxccGFyZGlybmF0dXJhbAorCitcZjBcZnMzNiBcY2YwIFx1bCBcdWxjMCBIb3cgdG8gdXNlIHRoZSAiUmVnZW5lcmF0ZSBleGFtcGxlcyIgdGFyZ2V0czoKK1xmczI2IFwKK1x1bG5vbmUgXAorU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvamVjdCBidWlsZCBzZXR0aW5nIAorXGYxXGIgQU5UTFJfRVhUUkFfSkFWQV9BUkdTXAorCitcZjBcYjAgdG8gdGhlIEphdmEgY2xhc3NwYXRoIGNvbnRhaW5pbmcgdGhlIC5qYXIgZmlsZXMgZnJvbSB0aGUgQU5UTFIgdjMgYmV0YSBkaXN0cmlidXRpb24uXAorVGhlIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgYXJndW1lbnQgdG8gdGhlIC1jcCBwYXJhbWV0ZXIgb2YgL3Vzci9iaW4vamF2YS5cCitTZWUgdGhlIGluZGl2aWR1YWwgIlJlZ2VuZXJhdGUiIHRhcmdldHMgZm9yIHRoZSBzcGVjaWZpY3MuXAorXAorQWxzbyBiZSBzdXJlIHRoYXQgYWxsIG5lY2Vzc2FyeSBmaWxlcyBhcmUgd3JpdGVhYmxlLCBvdGhlcndpc2UgdGhlIGJ1aWxkIHdpbGwgZmFpbCBzaWxlbnRseVwKK2JlY2F1c2Ugb3JnLmFudGxyLlRvb2wgY3VycmVudGx5IGFsd2F5cyByZXR1cm5zIDAgYXMgaXRzIGV4aXQgY29kZSwgbm8gbWF0dGVyIHdoYXQgLSBldmVuIGlmIGEgZmF0YWwgZXJyb3Igb2NjdXJlZC5cCitUaGlzIGlzIGEgc2VyaW91cyBpc3N1ZSB3aGVuIHVzaW5nIHRoZSBwbHVnaW4sIGFzIHdlbGwsIGFuZCB3aWxsIGJlIGZpeGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXAorXAorVGhlIFhjb2RlIHBsdWdpbiBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byByZWNvZ25pemUgdGhlIG5ldyByZWNvbW1lbmRlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIEFOVExSIGdyYW1tYXJzOlwKK1xwYXJkXHR4NTY2XHR4MTEzM1x0eDE3MDBcdHgyMjY3XHR4MjgzNFx0eDM0MDFcdHgzOTY4XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNlx0eDY4MDNccWxccW5hdHVyYWxccGFyZGlybmF0dXJhbAorXGNmMCBQYXJzZXJzIGFuZCBjb21iaW5lZCBncmFtbWFyczoJLmcJCWdlbmVyYXRlIE5hbWVMZXhlci4oaHxtKSBhbmQgTmFtZVBhcnNlci4oaHxtKSBmaWxlc1wKK1xwYXJkXHR4NTY2XHR4MTEzM1x0eDE3MDBcdHgyMjY3XHR4MjgzNFx0eDM0MDFcdHgzOTY4XHR4NDUzNVx0eDUxMDJcdHg1NjY5XHR4NjIzNlx0eDY4MDNccWxccW5hdHVyYWxccGFyZGlybmF0dXJhbAorXGNmMCBMZXhlcnM6CQkJCQkJCS5nbCAJCWdlbmVyYXRlIE5hbWVMZXhlci4oaHxtKSBmaWxlc1wKK1BhcnNlciBncmFtbWFycyAoYWx0ZXJuYXRpdmVseSk6IAkuZ3AJCWdlbmVyYXRlIE5hbWVQYXJzZXIuKGh8bSkgZmlsZXNcCitccGFyZFx0eDU2Nlx0eDExNTNcdHgxNzAwXHR4MjI2N1x0eDI4MzRcdHgzNDAxXHR4Mzk2OFx0eDQ0MjBcdHg0NTM1XHR4NTEwMlx0eDU2NjlcdHg2MjM2XHR4NjgwM1xxbFxxbmF0dXJhbFxwYXJkaXJuYXR1cmFsCitcY2YwIFRyZWVwYXJzZXJzOiAJCQkJCQkJLmd0cAkJZ2VuZXJhdGUgTmFtZS4oaHxtKSBmaWxlcyAoXGNmMiB0aGlzIGhhcyBjaGFuZ2VkIGZyb20gdGhlIHByZXZpb3VzIHJlbGVhc2UhIVxjZjAgKVwKK1wKK0l0IHNob3VsZCBjb250aW51ZSB0byB3b3JrIGJ1dCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcy4gU29tZXRpbWUgaW4gdGhlIG5lYXIgZnV0dXJlIEkgd2lsbCBtYWtlIHVwZGF0ZXMgYXZhaWxhYmxlXAorYW5kIGFubm91bmNlIHRoZW0gb24gdGhlIG1haWxpbmcgbGlzdCBhbnRsci1pbnRlcmVzdEBhbnRsci5vcmcgYW5kIG9uIG15IHNpdGUgaHR0cDovL2NsYXNzZHVtcC5vcmcvcGFnZXMvYW50bHJcCitcCitTaGFyZSBhbmQgZW5qb3kuXAorXAorLWt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvVGVzdC1JbmZvLnBsaXN0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvVGVzdC1JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzllZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9UZXN0LUluZm8ucGxpc3QKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+JHtFWEVDVVRBQkxFX05BTUV9PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KKwk8c3RyaW5nPmNvbS55b3VyY29tcGFueS4ke1BST0RVQ1RfTkFNRTpyZmMxMDM0aWRlbnRpZmllcn08L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+CisJPHN0cmluZz42LjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkJOREw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4xLjA8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz4/Pz8/PC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjEuMDwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL1Rlc3RzLUluZm8ucGxpc3QgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9UZXN0cy1JbmZvLnBsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmMjU1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9UZXN0cy1JbmZvLnBsaXN0CkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPiR7RVhFQ1VUQUJMRV9OQU1FfTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJZGVudGlmaWVyPC9rZXk+CisJPHN0cmluZz5jb20ueW91cmNvbXBhbnkuVGVzdDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgorCTxzdHJpbmc+Qk5ETDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KKwk8c3RyaW5nPj8/Pz88L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+MS4wPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYW50bHIzLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9hbnRscjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk0MWRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYW50bHIzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxBTlRMUi9BQ0JUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTXV0YWJsZUFycmF5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTXV0YWJsZURpY3Rpb25hcnkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZU1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVJlY29nbml6ZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCaXRTZXQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNoYXJTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbVN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vbkVycm9yTm9kZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25Ub2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRGQS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Zy5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEb3VibGVLZXlNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVycm9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYXN0UXVldWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmlsZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJIYXNoTWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hSdWxlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUklucHV0U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkludEFycmF5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkludFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMaW5rQmFzZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMb29rYWhlYWRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJOb2RlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlB0ckJ1ZmZlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZWFkZXJTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZU1lbW8uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN5bWJvbFN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5Tb3VyY2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVJdGVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5pcXVlSURNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQXJyYXlJdGVyYXRvci5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VNYXBFbGVtZW50Lm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQmFzZU1hcEVsZW1lbnQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNiNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VNYXBFbGVtZW50Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VSZWNvZ25pemVyLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQmFzZVJlY29nbml6ZXIubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzgwMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VSZWNvZ25pemVyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VTdGFjay5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VTdGFjay5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzU3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQmFzZVN0YWNrLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VUcmVlLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQmFzZVRyZWUubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc4MTUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VUcmVlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VUcmVlQWRhcHRvci5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJhc2VUcmVlQWRhcHRvci5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyM2YyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQmFzZVRyZWVBZGFwdG9yLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJpdFNldC5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJpdFNldC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmQ4MjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQml0U2V0Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MzA1OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ZGZhOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODBkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQ2hhclN0cmVhbVN0YXRlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vbkVycm9yTm9kZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vbkVycm9yTm9kZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDVmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQ29tbW9uRXJyb3JOb2RlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRva2VuLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQ29tbW9uVG9rZW4ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ4MDViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRva2VuLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRva2VuU3RyZWFtLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQ29tbW9uVG9rZW5TdHJlYW0ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNlZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRva2VuU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRyZWUubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJDb21tb25UcmVlLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMTYzMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJDb21tb25UcmVlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQ29tbW9uVHJlZUFkYXB0b3IubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQ3ZjExCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZlYjAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDk3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzMzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkZhc3RRdWV1ZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkZhc3RRdWV1ZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNThiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSRmFzdFF1ZXVlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkhhc2hNYXAubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJIYXNoTWFwLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmOWVlYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJIYXNoTWFwLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkhhc2hSdWxlLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSSGFzaFJ1bGUubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYxOGJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkhhc2hSdWxlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkludEFycmF5Lm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSSW50QXJyYXkubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjAyYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkludEFycmF5Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxleGVyLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTGV4ZXIubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQyYTRmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxleGVyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcyNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxpbmtCYXNlLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTGlua0Jhc2UubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUzOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxpbmtCYXNlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxvb2thaGVhZFN0cmVhbS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUkxvb2thaGVhZFN0cmVhbS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODE1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTG9va2FoZWFkU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1hcC5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1hcC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNGExZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTWFwLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1hcEVsZW1lbnQubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJNYXBFbGVtZW50Lm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhNDc2MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJNYXBFbGVtZW50Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1MDMzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTZhODAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0OWVmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzlhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTk4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTZjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWMyMGQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk5vZGVNYXBFbGVtZW50Lm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSTm9kZU1hcEVsZW1lbnQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQzYTNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUk5vZGVNYXBFbGVtZW50Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlBhcnNlVHJlZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlBhcnNlVHJlZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZWI3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUGFyc2VUcmVlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlBhcnNlci5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlBhcnNlci5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmExNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUGFyc2VyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzY1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlB0ckJ1ZmZlci5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlB0ckJ1ZmZlci5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDk2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUHRyQnVmZmVyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjMyODY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGE3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDJkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZjA5OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVNYXBFbGVtZW50Lm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUnVsZU1hcEVsZW1lbnQubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTI5ZDllCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVNYXBFbGVtZW50Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVNZW1vLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUnVsZU1lbW8ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQwOTgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVNZW1vLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVSZXR1cm5TY29wZS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVSZXR1cm5TY29wZS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGE5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUnVsZVJldHVyblNjb3BlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVTdGFjay5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bGVTdGFjay5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTEyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSUnVsZVN0YWNrLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlJ1bnRpbWVFeGNlcHRpb24ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJSdW50aW1lRXhjZXB0aW9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMDY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJSdW50aW1lRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlN0cmVhbUVudW1lcmF0b3IubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3OGU2YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlN0cmluZ1N0cmVhbS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlN0cmluZ1N0cmVhbS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Njg5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSU3RyaW5nU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlN5bWJvbFN0YWNrLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSU3ltYm9sU3RhY2subwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjU4OGRlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlN5bWJvbFN0YWNrLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDdmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzN2Q0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVFeGNlcHRpb24ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlRXhjZXB0aW9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4MmFkYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVJdGVyYXRvci5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVJdGVyYXRvci5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDI1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVHJlZUl0ZXJhdG9yLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVQYXJzZXIubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlUGFyc2VyLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkMTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlUGFyc2VyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVQYXR0ZXJuTGV4ZXIubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlUGF0dGVybkxleGVyLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhM2M5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlUGF0dGVybkxleGVyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVHJlZVBhdHRlcm5QYXJzZXIubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTg1NmMzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVSZXdyaXRlci5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVSZXdyaXRlci5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzUxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVHJlZVJld3JpdGVyLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwNDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVWaXNpdG9yLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVHJlZVZpc2l0b3IubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E4OGViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVWaXNpdG9yLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVWaXNpdG9yQWN0aW9uLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVHJlZVZpc2l0b3JBY3Rpb24ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ2YjVhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVWaXNpdG9yQWN0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlRyZWVXaXphcmQubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlV2l6YXJkLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZjI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJUcmVlV2l6YXJkLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5vIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDdjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlVuaXF1ZUlETWFwLm8gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9idWlsZC9BTlRMUi5idWlsZC9EZWJ1Zy9BTlRMUi5idWlsZC9PYmplY3RzLW5vcm1hbC9pMzg2L0FOVExSVW5pcXVlSURNYXAubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTkxZjNkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlVuaXF1ZUlETWFwLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvYnVpbGQvQU5UTFIuYnVpbGQvRGVidWcvQU5UTFIuYnVpbGQvT2JqZWN0cy1ub3JtYWwvaTM4Ni9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0MjEzNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2J1aWxkL0FOVExSLmJ1aWxkL0RlYnVnL0FOVExSLmJ1aWxkL09iamVjdHMtbm9ybWFsL2kzODYvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDLnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQy50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1YjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQy50b2tlbnMKQEAgLTAsMCArMSwzMSBAQAorVF9fMjA9MjAKK0lOVD01CitJRD00CitUX185PTkKK1RfXzg9OAorVF9fNz03CitUX18xOT0xOQorV1M9NgorVF9fMTY9MTYKK1RfXzE1PTE1CitUX18xOD0xOAorVF9fMTc9MTcKK1RfXzEyPTEyCitUX18xMT0xMQorVF9fMTQ9MTQKK1RfXzEzPTEzCitUX18xMD0xMAorJ2NoYXInPTEyCisnfSc9MTUKKyc9PSc9MTgKKyd7Jz0xNAorJ3ZvaWQnPTEzCisnOyc9NworJz0nPTE3CisnaW50Jz0xMQorJzwnPTE5CisnKCc9OAorJ2Zvcic9MTYKKycrJz0yMAorJywnPTkKKycpJz0xMApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDTGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ0xleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0MDU0MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ0xleGVyLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBTaW1wbGVDLmcgMjAxMS0wNS0wNiAxMzo1MzoxMgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBTdGFydCBjeWNsaWNERkFJbnRlcmZhY2UgKi8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgVF9fNyA3CisjZGVmaW5lIFRfXzggOAorI2RlZmluZSBUX185IDkKKyNkZWZpbmUgVF9fMTAgMTAKKyNkZWZpbmUgVF9fMTEgMTEKKyNkZWZpbmUgVF9fMTIgMTIKKyNkZWZpbmUgVF9fMTMgMTMKKyNkZWZpbmUgVF9fMTQgMTQKKyNkZWZpbmUgVF9fMTUgMTUKKyNkZWZpbmUgVF9fMTYgMTYKKyNkZWZpbmUgVF9fMTcgMTcKKyNkZWZpbmUgVF9fMTggMTgKKyNkZWZpbmUgVF9fMTkgMTkKKyNkZWZpbmUgVF9fMjAgMjAKKyNkZWZpbmUgSUQgNAorI2RlZmluZSBJTlQgNQorI2RlZmluZSBXUyA2CisvKiBpbnRlcmZhY2UgbGV4ZXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ0xleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCit9CisrICh2b2lkKSBpbml0aWFsaXplOworKyAoU2ltcGxlQ0xleGVyICopbmV3U2ltcGxlQ0xleGVyV2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKy8qIE9iakMgc3RhcnQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLSAodm9pZCkgbVRfXzcgOyAKKy0gKHZvaWQpIG1UX184IDsgCistICh2b2lkKSBtVF9fOSA7IAorLSAodm9pZCkgbVRfXzEwIDsgCistICh2b2lkKSBtVF9fMTEgOyAKKy0gKHZvaWQpIG1UX18xMiA7IAorLSAodm9pZCkgbVRfXzEzIDsgCistICh2b2lkKSBtVF9fMTQgOyAKKy0gKHZvaWQpIG1UX18xNSA7IAorLSAodm9pZCkgbVRfXzE2IDsgCistICh2b2lkKSBtVF9fMTcgOyAKKy0gKHZvaWQpIG1UX18xOCA7IAorLSAodm9pZCkgbVRfXzE5IDsgCistICh2b2lkKSBtVF9fMjAgOyAKKy0gKHZvaWQpIG1JRCA7IAorLSAodm9pZCkgbUlOVCA7IAorLSAodm9pZCkgbVdTIDsgCistICh2b2lkKSBtVG9rZW5zIDsgCisKK0BlbmQgLyogZW5kIG9mIFNpbXBsZUNMZXhlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDTGV4ZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ0xleGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlNTNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ0xleGVyLm0KQEAgLTAsMCArMSwxMTYwIEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IFNpbXBsZUMuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDExLTA1LTA2IDEzOjUzOjEyCisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IFNpbXBsZUNMZXhlckxleGVyCisgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLgorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFNpbXBsZUMuZyAyMDExLTA1LTA2IDEzOjUzOjEyCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlNpbXBsZUNMZXhlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzISAqLworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNMZXhlciAvLyBsaW5lIDMzMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiU2ltcGxlQy5nIl07Cit9CisKKysgKE5TU3RyaW5nICopIHRva2VuTmFtZUZvclR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OmFUb2tlblR5cGVdOworfQorCisrIChTaW1wbGVDTGV4ZXIgKiluZXdTaW1wbGVDTGV4ZXJXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbU2ltcGxlQ0xleGVyIGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjE4KzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIFN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisKKy8qIFN0YXJ0IG9mIFJ1bGVzICovCisvLyAkQU5UTFIgc3RhcnQgIlRfXzciCistICh2b2lkKSBtVF9fNworeworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX183OworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzo3OjY6ICggJygnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo3Ojg6ICcoJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JygnXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzciICovCisKKy8vICRBTlRMUiBzdGFydCAiVF9fOCIKKy0gKHZvaWQpIG1UX184Cit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzg7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjg6NjogKCAnKScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjg6ODogJyknIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKSddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fOCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX185IgorLSAodm9pZCkgbVRfXzkKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fOTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6OTo2OiAoICcrJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6OTo4OiAnKycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicrJ107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX185IiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlRfXzEwIgorLSAodm9pZCkgbVRfXzEwCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzEwOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDo3OiAoICcsJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTA6OTogJywnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonLCddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fMTAiICovCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMTEiCistICh2b2lkKSBtVF9fMTEKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMTE7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExOjc6ICggJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMTo5OiAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xMSIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMiIKKy0gKHZvaWQpIG1UX18xMgoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6MTI6NzogKCAnPCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjEyOjk6ICc8JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JzwnXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzEyIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlRfXzEzIgorLSAodm9pZCkgbVRfXzEzCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzEzOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMzo3OiAoICc9JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTM6OTogJz0nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonPSddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fMTMiICovCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMTQiCistICh2b2lkKSBtVF9fMTQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMTQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjE0Ojc6ICggJz09JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTQ6OTogJz09JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIj09Il07IAorCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzE0IiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlRfXzE1IgorLSAodm9pZCkgbVRfXzE1Cit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzE1OworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxNTo3OiAoICdjaGFyJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTU6OTogJ2NoYXInIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiY2hhciJdOyAKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xNSIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX18xNiIKKy0gKHZvaWQpIG1UX18xNgoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xNjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6MTY6NzogKCAnZm9yJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTY6OTogJ2ZvcicgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJmb3IiXTsgCisKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fMTYiICovCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMTciCistICh2b2lkKSBtVF9fMTcKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMTc7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjE3Ojc6ICggJ2ludCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjE3Ojk6ICdpbnQnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaW50Il07IAorCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzE3IiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlRfXzE4IgorLSAodm9pZCkgbVRfXzE4Cit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzE4OworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxODo3OiAoICd2b2lkJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTg6OTogJ3ZvaWQnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAidm9pZCJdOyAKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xOCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX18xOSIKKy0gKHZvaWQpIG1UX18xOQoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xOTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6MTk6NzogKCAneycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjE5Ojk6ICd7JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J3snXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzE5IiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlRfXzIwIgorLSAodm9pZCkgbVRfXzIwCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzIwOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoyMDo3OiAoICd9JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MjA6OTogJ30nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonfSddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fMjAiICovCisKKy8vICRBTlRMUiBzdGFydCAiSUQiCistICh2b2lkKSBtSUQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gSUQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjk0OjU6ICggKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo5NDo5OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICdBJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnWicpKXx8W2lucHV0IExBOjFdID09ICdfJ3x8KChbaW5wdXQgTEE6MV0gPj0gJ2EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICd6JykpKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTFfMCA+PSAnMCcgJiYgTEExXzAgPD0gJzknKXx8KExBMV8wID49ICdBJyAmJiBMQTFfMCA8PSAnWicpfHxMQTFfMD09J18nfHwoTEExXzAgPj0gJ2EnICYmIExBMV8wIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIklEIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIklOVCIKKy0gKHZvaWQpIG1JTlQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gSU5UOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzo5Nzo1OiAoICggJzAnIC4uICc5JyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6OTc6NzogKCAnMCcgLi4gJzknICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIFNpbXBsZUMuZzo5Nzo3OiAoICcwJyAuLiAnOScgKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDIgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MiA9IDI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEyXzAgPj0gJzAnICYmIExBMl8wIDw9ICc5JykpICkgeworICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQyID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMjsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOmlucHV0IGRlY2lzaW9uTnVtYmVyOjJdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MisrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjogOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJJTlQiICovCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjEwMDo1OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDA6OTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjEwMDo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTNfMCA+PSAnXHQnICYmIExBM18wIDw9ICdcbicpfHxMQTNfMD09J1xyJ3x8TEEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gJ1x0JykgJiYgKFtpbnB1dCBMQToxXSA8PSAnXG4nKSl8fFtpbnB1dCBMQToxXSA9PSAnXHInfHxbaW5wdXQgTEE6MV0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDMgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6M107CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQzKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzOiA7CisKKworICAgICAgICAgX2NoYW5uZWw9SElEREVOOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiV1MiICovCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBTaW1wbGVDLmc6MTo4OiAoIFRfXzcgfCBUX184IHwgVF9fOSB8IFRfXzEwIHwgVF9fMTEgfCBUX18xMiB8IFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBJRCB8IElOVCB8IFdTICkgLy9ydWxlYmxvY2sKKyAgICBOU0ludGVnZXIgYWx0ND0xNzsKKyAgICB1bmljaGFyIGNoYXJMQTQgPSBbaW5wdXQgTEE6MV07CisgICAgc3dpdGNoIChjaGFyTEE0KSB7CisgICAgICAgIGNhc2UgJygnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcrJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJywnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnOyc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc8JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND02OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz0nOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzcgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKExBNF83PT0nPScpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFsdDQgPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzggPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKExBNF84PT0naCcpICkgeworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMTkgPSBbaW5wdXQgTEE6M107CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTRfMTk9PSdhJykgKSB7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMjMgPSBbaW5wdXQgTEE6NF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzIzPT0ncicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8yNyA9IFtpbnB1dCBMQTo1XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBNF8yNyA+PSAnMCcgJiYgTEE0XzI3IDw9ICc5Jyl8fChMQTRfMjcgPj0gJ0EnICYmIExBNF8yNyA8PSAnWicpfHxMQTRfMjc9PSdfJ3x8KExBNF8yNyA+PSAnYScgJiYgTEE0XzI3IDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ9MTU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQgPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFsdDQgPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF85ID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTRfOT09J28nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzIwID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzIwPT0ncicpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzI0ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMjQgPj0gJzAnICYmIExBNF8yNCA8PSAnOScpfHwoTEE0XzI0ID49ICdBJyAmJiBMQTRfMjQgPD0gJ1onKXx8TEE0XzI0PT0nXyd8fChMQTRfMjQgPj0gJ2EnICYmIExBNF8yNCA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ9MTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gMTA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQgPSAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gMTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMTAgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKExBNF8xMD09J24nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzIxID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzIxPT0ndCcpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzI1ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMjUgPj0gJzAnICYmIExBNF8yNSA8PSAnOScpfHwoTEE0XzI1ID49ICdBJyAmJiBMQTRfMjUgPD0gJ1onKXx8TEE0XzI1PT0nXyd8fChMQTRfMjUgPj0gJ2EnICYmIExBNF8yNSA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ9MTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gMTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQgPSAxNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gMTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndic6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMTEgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKExBNF8xMT09J28nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzIyID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzIyPT0naScpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzI2ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNF8yNj09J2QnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMzAgPSBbaW5wdXQgTEE6NV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMzAgPj0gJzAnICYmIExBNF8zMCA8PSAnOScpfHwoTEE0XzMwID49ICdBJyAmJiBMQTRfMzAgPD0gJ1onKXx8TEE0XzMwPT0nXyd8fChMQTRfMzAgPj0gJ2EnICYmIExBNF8zMCA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTE1OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDEyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDE1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWx0NCA9IDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3snOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ30nOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0EnOiA7CisgICAgICAgIGNhc2UgJ0InOiA7CisgICAgICAgIGNhc2UgJ0MnOiA7CisgICAgICAgIGNhc2UgJ0QnOiA7CisgICAgICAgIGNhc2UgJ0UnOiA7CisgICAgICAgIGNhc2UgJ0YnOiA7CisgICAgICAgIGNhc2UgJ0cnOiA7CisgICAgICAgIGNhc2UgJ0gnOiA7CisgICAgICAgIGNhc2UgJ0knOiA7CisgICAgICAgIGNhc2UgJ0onOiA7CisgICAgICAgIGNhc2UgJ0snOiA7CisgICAgICAgIGNhc2UgJ0wnOiA7CisgICAgICAgIGNhc2UgJ00nOiA7CisgICAgICAgIGNhc2UgJ04nOiA7CisgICAgICAgIGNhc2UgJ08nOiA7CisgICAgICAgIGNhc2UgJ1AnOiA7CisgICAgICAgIGNhc2UgJ1EnOiA7CisgICAgICAgIGNhc2UgJ1InOiA7CisgICAgICAgIGNhc2UgJ1MnOiA7CisgICAgICAgIGNhc2UgJ1QnOiA7CisgICAgICAgIGNhc2UgJ1UnOiA7CisgICAgICAgIGNhc2UgJ1YnOiA7CisgICAgICAgIGNhc2UgJ1cnOiA7CisgICAgICAgIGNhc2UgJ1gnOiA7CisgICAgICAgIGNhc2UgJ1knOiA7CisgICAgICAgIGNhc2UgJ1onOiA7CisgICAgICAgIGNhc2UgJ18nOiA7CisgICAgICAgIGNhc2UgJ2EnOiA7CisgICAgICAgIGNhc2UgJ2InOiA7CisgICAgICAgIGNhc2UgJ2QnOiA7CisgICAgICAgIGNhc2UgJ2UnOiA7CisgICAgICAgIGNhc2UgJ2cnOiA7CisgICAgICAgIGNhc2UgJ2gnOiA7CisgICAgICAgIGNhc2UgJ2onOiA7CisgICAgICAgIGNhc2UgJ2snOiA7CisgICAgICAgIGNhc2UgJ2wnOiA7CisgICAgICAgIGNhc2UgJ20nOiA7CisgICAgICAgIGNhc2UgJ24nOiA7CisgICAgICAgIGNhc2UgJ28nOiA7CisgICAgICAgIGNhc2UgJ3AnOiA7CisgICAgICAgIGNhc2UgJ3EnOiA7CisgICAgICAgIGNhc2UgJ3InOiA7CisgICAgICAgIGNhc2UgJ3MnOiA7CisgICAgICAgIGNhc2UgJ3QnOiA7CisgICAgICAgIGNhc2UgJ3UnOiA7CisgICAgICAgIGNhc2UgJ3cnOiA7CisgICAgICAgIGNhc2UgJ3gnOiA7CisgICAgICAgIGNhc2UgJ3knOiA7CisgICAgICAgIGNhc2UgJ3onOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOiA7CisgICAgICAgIGNhc2UgJzEnOiA7CisgICAgICAgIGNhc2UgJzInOiA7CisgICAgICAgIGNhc2UgJzMnOiA7CisgICAgICAgIGNhc2UgJzQnOiA7CisgICAgICAgIGNhc2UgJzUnOiA7CisgICAgICAgIGNhc2UgJzYnOiA7CisgICAgICAgIGNhc2UgJzcnOiA7CisgICAgICAgIGNhc2UgJzgnOiA7CisgICAgICAgIGNhc2UgJzknOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JzogOworICAgICAgICBjYXNlICdcbic6IDsKKyAgICAgICAgY2FzZSAnXHInOiA7CisgICAgICAgIGNhc2UgJyAnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiA7CisgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246NCBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgIG52YWUuYyA9IGNoYXJMQTQ7CisgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgfQorCisgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjEwOiBUX183IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRfXzddOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MToxNTogVF9fOCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX184XTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6MjA6IFRfXzkgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtVF9fOV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjI1OiBUX18xMCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xMF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjMxOiBUX18xMSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xMV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNiA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjM3OiBUX18xMiAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xMl07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNyA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjQzOiBUX18xMyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xM107IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOCA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjQ5OiBUX18xNCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xNF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjU1OiBUX18xNSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xNV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTAgOiA7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo2MTogVF9fMTYgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtVF9fMTZdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExIDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6Njc6IFRfXzE3IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRfXzE3XTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMiA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjczOiBUX18xOCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xOF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTMgOiA7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo3OTogVF9fMTkgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtVF9fMTldOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0IDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6ODU6IFRfXzIwIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRfXzIwXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjkxOiBJRCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1JRF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTYgOiA7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo5NDogSU5UIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUlOVF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTcgOiA7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo5ODogV1MgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtV1NdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKK0BlbmQgLyogZW5kIG9mIFNpbXBsZUNMZXhlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDM5NyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ1BhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzYjJhZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ1BhcnNlci5oCkBAIC0wLDAgKzEsMTA5IEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFNpbXBsZUMuZyAyMDExLTA1LTA2IDEzOjUzOjEyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUi5oPgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIHBhcnNlckhlYWRlckZpbGUgKi8KKyNpZm5kZWYgQU5UTFIzVG9rZW5UeXBlQWxyZWFkeURlZmluZWQKKyNkZWZpbmUgQU5UTFIzVG9rZW5UeXBlQWxyZWFkeURlZmluZWQKK3R5cGVkZWYgZW51bSB7CisgICAgQU5UTFJfRU9GID0gLTEsCisgICAgSU5WQUxJRCwKKyAgICBFT1IsCisgICAgRE9XTiwKKyAgICBVUCwKKyAgICBNSU4KK30gQU5UTFIzVG9rZW5UeXBlOworI2VuZGlmCisKKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGludGVyZmFjZSBzdGFydCBERkEyCitAaW50ZXJmYWNlIERGQTIgOiBBTlRMUkRGQSB7Cit9CisrIG5ld0RGQTJXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKXRoZVJlY29nbml6ZXI7CistIGluaXRXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKXJlY29nbml6ZXI7CitAZW5kIC8qIGVuZCBvZiBERkEyIGludGVyZmFjZSAgKi8KKworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW50ZXJmYWNlIGVuZCBERkEyCisKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgVF9fNyA3CisjZGVmaW5lIFRfXzggOAorI2RlZmluZSBUX185IDkKKyNkZWZpbmUgVF9fMTAgMTAKKyNkZWZpbmUgVF9fMTEgMTEKKyNkZWZpbmUgVF9fMTIgMTIKKyNkZWZpbmUgVF9fMTMgMTMKKyNkZWZpbmUgVF9fMTQgMTQKKyNkZWZpbmUgVF9fMTUgMTUKKyNkZWZpbmUgVF9fMTYgMTYKKyNkZWZpbmUgVF9fMTcgMTcKKyNkZWZpbmUgVF9fMTggMTgKKyNkZWZpbmUgVF9fMTkgMTkKKyNkZWZpbmUgVF9fMjAgMjAKKyNkZWZpbmUgSUQgNAorI2RlZmluZSBJTlQgNQorI2RlZmluZSBXUyA2CisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorCisvKiBJbnRlcmZhY2UgZ3JhbW1hciBjbGFzcyAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyIDogQU5UTFJQYXJzZXIgeyAvKiBsaW5lIDU3MiAqLworLyogT2JqQyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgc3RhcnQgb2YgbWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgbWVtVmFycyAqLworCitERkEyICpkZmEyOworIH0KKworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXMgKi8KKy8qIE9iakMgc3RhcnQgb2YgcHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgcHJvcGVydGllcyAqLworCisrICh2b2lkKSBpbml0aWFsaXplOworKyAoaWQpIG5ld1NpbXBsZUNQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW07CisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisKKy8qIE9iakMgc3RhcnQgb2YgbWV0aG9kc0RlY2wgKi8KKy8qIE9iakMgZW5kIG9mIG1ldGhvZHNEZWNsICovCisKKy0gKHZvaWQpcHJvZ3JhbTsgCistICh2b2lkKWRlY2xhcmF0aW9uOyAKKy0gKHZvaWQpdmFyaWFibGU7IAorLSAodm9pZClkZWNsYXJhdG9yOyAKKy0gKE5TU3RyaW5nICopZnVuY3Rpb25IZWFkZXI7IAorLSAodm9pZClmb3JtYWxQYXJhbWV0ZXI7IAorLSAodm9pZCl0eXBlOyAKKy0gKHZvaWQpYmxvY2s7IAorLSAodm9pZClzdGF0OyAKKy0gKHZvaWQpZm9yU3RhdDsgCistICh2b2lkKWFzc2lnblN0YXQ7IAorLSAodm9pZClleHByOyAKKy0gKHZvaWQpY29uZEV4cHI7IAorLSAodm9pZClhZXhwcjsgCistICh2b2lkKWF0b207IAorCisKK0BlbmQgLyogZW5kIG9mIFNpbXBsZUNQYXJzZXIgaW50ZXJmYWNlICovCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ1BhcnNlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDUGFyc2VyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1YTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvU2ltcGxlQ1BhcnNlci5tCkBAIC0wLDAgKzEsMTQzOCBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBPQkpDIHNvdXJjZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiBTaW1wbGVDLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMS0wNS0wNiAxMzo1MzoxMgorICogICAgIC0gICAgICAgICAgICAgICAgZm9yIHRoZSBwYXJzZXIgOiBTaW1wbGVDUGFyc2VyUGFyc2VyCisgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLgorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFNpbXBsZUMuZyAyMDExLTA1LTA2IDEzOjUzOjEyCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlNpbXBsZUNQYXJzZXIuaCIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGltcGxlbWVudGF0aW9uIHN0YXJ0IERGQTIKK0BpbXBsZW1lbnRhdGlvbiBERkEyCitjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfZW90WzEzXSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl9lb2ZbMTNdID0KKyAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9OworY29uc3Qgc3RhdGljIHVuaWNoYXIgZGZhMl9taW5bMTNdID0KKyAgICB7NCw0LDcsNCwwLDQsMTEsOCwwLDAsNCw0LDh9OworY29uc3Qgc3RhdGljIHVuaWNoYXIgZGZhMl9tYXhbMTNdID0KKyAgICB7MTgsNCwxMSwxOCwwLDQsMTksMTAsMCwwLDE4LDQsMTB9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX2FjY2VwdFsxM10gPQorICAgIHstMSwtMSwtMSwtMSwxLC0xLC0xLC0xLDIsMywtMSwtMSwtMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfc3BlY2lhbFsxM10gPQorICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbltdID0ge307Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjBbXSA9IHszLCAtMSwgLTEsIC0xLCA0fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uMVtdID0gezYsIC0xLCAxMH07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjJbXSA9IHs4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAtMSwgOX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjNbXSA9IHsyfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uNFtdID0gezEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorIC0xLCAtMSwgLTEsIC0xLCAxLCAtMSwgMSwgMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjVbXSA9IHs3fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uNltdID0gezExLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKKyAtMSwgLTEsIC0xLCAtMSwgMTEsIC0xLCAxMSwgMTF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb243W10gPSB7MTJ9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb244W10gPSB7NSwgLTEsIC0xLCAtMSwgNiwgLTEsIC0xLCAtMSwgCisgLTEsIC0xLCAtMSwgNSwgLTEsIDUsIDV9OworCisKKysgKGlkKSBuZXdERkEyV2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilhUmVjb2duaXplcgoreworICAgIHJldHVybiBbW1tERkEyIGFsbG9jXSBpbml0V2l0aFJlY29nbml6ZXI6YVJlY29nbml6ZXJdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKikgdGhlUmVjb2duaXplcgoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhSZWNvZ25pemVyOnRoZVJlY29nbml6ZXJdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIGRlY2lzaW9uTnVtYmVyID0gMjsKKyAgICAgICAgZW90ID0gZGZhMl9lb3Q7CisgICAgICAgIGVvZiA9IGRmYTJfZW9mOworICAgICAgICBtaW4gPSBkZmEyX21pbjsKKyAgICAgICAgbWF4ID0gZGZhMl9tYXg7CisgICAgICAgIGFjY2VwdCA9IGRmYTJfYWNjZXB0OworICAgICAgICBzcGVjaWFsID0gZGZhMl9zcGVjaWFsOworICAgICAgICBpZiAoISh0cmFuc2l0aW9uID0gY2FsbG9jKDEzLCBzaXplb2Yodm9pZCopKSkpIHsKKyAgICAgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSAxMzsKKyAgICAgICAgdHJhbnNpdGlvblswXSA9IGRmYTJfdHJhbnNpdGlvbjQ7CisgICAgICAgIHRyYW5zaXRpb25bMV0gPSBkZmEyX3RyYW5zaXRpb24zOworICAgICAgICB0cmFuc2l0aW9uWzJdID0gZGZhMl90cmFuc2l0aW9uMDsKKyAgICAgICAgdHJhbnNpdGlvblszXSA9IGRmYTJfdHJhbnNpdGlvbjg7CisKKyAgICAgICAgdHJhbnNpdGlvbls0XSA9IGRmYTJfdHJhbnNpdGlvbjU7CisgICAgICAgIHRyYW5zaXRpb25bNV0gPSBkZmEyX3RyYW5zaXRpb24yOworICAgICAgICB0cmFuc2l0aW9uWzZdID0gZGZhMl90cmFuc2l0aW9uMTsKKworCisgICAgICAgIHRyYW5zaXRpb25bN10gPSBkZmEyX3RyYW5zaXRpb242OworICAgICAgICB0cmFuc2l0aW9uWzhdID0gZGZhMl90cmFuc2l0aW9uNzsKKyAgICAgICAgdHJhbnNpdGlvbls5XSA9IGRmYTJfdHJhbnNpdGlvbjE7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgZnJlZSh0cmFuc2l0aW9uKTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIEAiMjA6MTogZGVjbGFyYXRpb24gOiAoIHZhcmlhYmxlIHwgZnVuY3Rpb25IZWFkZXIgJzsnIHwgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKTsiOworfQorCisKK0BlbmQgLyogZW5kIERGQTIgaW1wbGVtZW50YXRpb24gKi8KKworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gZW5kIERGQTIKKworCisKKyNwcmFnbWEgbWFyayBCaXRzZXRzCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtMjg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtMjhfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNjgwMTJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjUwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb241MF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uNjA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjYwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTFfaW5fZGVjbGFyYXRpb242MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzExX2luX2RlY2xhcmF0aW9uNjJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjc1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb243NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA4MDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uNzc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjc3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTk5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTk5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDEwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTEwMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMDFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA4MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xMV9pbl92YXJpYWJsZTEwMzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzExX2luX3ZhcmlhYmxlMTAzX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjEyMjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lEX2luX2RlY2xhcmF0b3IxMjJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMTUxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjE1MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAxMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0lEX2luX2Z1bmN0aW9uSGVhZGVyMTUzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fZnVuY3Rpb25IZWFkZXIxNTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwODBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV183X2luX2Z1bmN0aW9uSGVhZGVyMTU1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfN19pbl9mdW5jdGlvbkhlYWRlcjE1NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA2ODExMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjE1OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjE1OV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDUwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzEwX2luX2Z1bmN0aW9uSGVhZGVyMTYzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTBfaW5fZnVuY3Rpb25IZWFkZXIxNjNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNjgwMTBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNjU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNjVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA1MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV184X2luX2Z1bmN0aW9uSGVhZGVyMTczOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfOF9pbl9mdW5jdGlvbkhlYWRlcjE3M19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMTk1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIxOTVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMTBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjE5NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMTk3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTlfaW5fYmxvY2syODY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18xOV9pbl9ibG9jazI4Nl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDFGODhCMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2szMDBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAxRjg4QjBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zdGF0X2luX2Jsb2NrMzE1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfc3RhdF9pbl9ibG9jazMxNV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDE5MDhCMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzIwX2luX2Jsb2NrMzI2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjBfaW5fYmxvY2szMjZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mb3JTdGF0X2luX3N0YXQzMzg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mb3JTdGF0X2luX3N0YXQzMzhfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX3N0YXQzNDY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX3N0YXQzNDZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA4MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xMV9pbl9zdGF0MzQ4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTFfaW5fc3RhdDM0OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX3N0YXQzNjI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9zdGF0MzYyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYXNzaWduU3RhdF9pbl9zdGF0MzcwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYXNzaWduU3RhdF9pbl9zdGF0MzcwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTFfaW5fc3RhdDM3MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzExX2luX3N0YXQzNzJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xMV9pbl9zdGF0MzgwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTFfaW5fc3RhdDM4MF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzE2X2luX2ZvclN0YXQzOTk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18xNl9pbl9mb3JTdGF0Mzk5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDgwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfN19pbl9mb3JTdGF0NDAxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfN19pbl9mb3JTdGF0NDAxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDEwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NDAzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NDAzX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTFfaW5fZm9yU3RhdDQwNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzExX2luX2ZvclN0YXQ0MDVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwQjBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2ZvclN0YXQ0MDc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2ZvclN0YXQ0MDdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA4MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xMV9pbl9mb3JTdGF0NDA5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTFfaW5fZm9yU3RhdDQwOV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAxMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDQxMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDQxMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDEwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzhfaW5fZm9yU3RhdDQxMzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzhfaW5fZm9yU3RhdDQxM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA4MDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ0MTU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9mb3JTdGF0NDE1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSURfaW5fYXNzaWduU3RhdDQ0MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lEX2luX2Fzc2lnblN0YXQ0NDJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDIwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xM19pbl9hc3NpZ25TdGF0NDQ0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTNfaW5fYXNzaWduU3RhdDQ0NF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDBCMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDQ0NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDQ0Nl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2NvbmRFeHByX2luX2V4cHI0Njg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19jb25kRXhwcl9pbl9leHByNDY4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI0ODc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19hZXhwcl9pbl9jb25kRXhwcjQ4N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwNTAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3NldF9pbl9jb25kRXhwcjQ5MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3NldF9pbl9jb25kRXhwcjQ5MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDBCMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2FleHByX2luX2NvbmRFeHByNDk5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI0OTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hdG9tX2luX2FleHByNTIxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYXRvbV9pbl9hZXhwcjUyMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDIwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzlfaW5fYWV4cHI1MjU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV185X2luX2FleHByNTI1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMEIwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYXRvbV9pbl9hZXhwcjUyNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2F0b21faW5fYWV4cHI1MjdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAyMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JRF9pbl9hdG9tNTQ3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fYXRvbTU0N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0lOVF9pbl9hdG9tNTYxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSU5UX2luX2F0b201NjFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV183X2luX2F0b201NzU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV183X2luX2F0b201NzVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwQjBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2F0b201Nzc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2F0b201NzdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAxMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV184X2luX2F0b201Nzk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV184X2luX2F0b201NzlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CisKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworCisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHN0YXJ0CisvLyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKy8vCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXIgIC8vIGxpbmUgNjM3CisKKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgZ2xvYmFsIEF0dHJpYnV0ZSBTY29wZXMKKy8qIE9iakMgc3RhcnQgZ2xvYmFsQXR0cmlidXRlU2NvcGUgKi8KKy8qIE9iakMgZW5kIGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW50aGVzaXplICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBzdGFydCBzeW50aGVzaXplKCkgKi8KKy8qIE9iakMgZW5kIHN5bnRoZXNpemUoKSAqLworCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTI4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTI4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb241MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNTBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjYwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb242MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzExX2luX2RlY2xhcmF0aW9uNjIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xMV9pbl9kZWNsYXJhdGlvbjYyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb243NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uNzVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjc3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb243N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3R5cGVfaW5fdmFyaWFibGU5OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3R5cGVfaW5fdmFyaWFibGU5OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMDEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTAxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTFfaW5fdmFyaWFibGUxMDMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xMV9pbl92YXJpYWJsZTEwM19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX2RlY2xhcmF0b3IxMjIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19JRF9pbl9kZWNsYXJhdG9yMTIyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjE1MSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNTFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19JRF9pbl9mdW5jdGlvbkhlYWRlcjE1MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX2Z1bmN0aW9uSGVhZGVyMTUzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfN19pbl9mdW5jdGlvbkhlYWRlcjE1NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzdfaW5fZnVuY3Rpb25IZWFkZXIxNTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNTlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xMF9pbl9mdW5jdGlvbkhlYWRlcjE2MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzEwX2luX2Z1bmN0aW9uSGVhZGVyMTYzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMTY1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMTY1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfOF9pbl9mdW5jdGlvbkhlYWRlcjE3MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzhfaW5fZnVuY3Rpb25IZWFkZXIxNzNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjE5NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMTk1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIxOTcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjE5N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzE5X2luX2Jsb2NrMjg2ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMTlfaW5fYmxvY2syODZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV192YXJpYWJsZV9pbl9ibG9jazMwMCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzAwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfc3RhdF9pbl9ibG9jazMxNSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3N0YXRfaW5fYmxvY2szMTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18yMF9pbl9ibG9jazMyNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzIwX2luX2Jsb2NrMzI2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzM4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzM4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9zdGF0MzQ2ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9zdGF0MzQ2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTFfaW5fc3RhdDM0OCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzExX2luX3N0YXQzNDhfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9zdGF0MzYyID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fc3RhdDM2Ml9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDM3MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDM3MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzExX2luX3N0YXQzNzIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xMV9pbl9zdGF0MzcyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTFfaW5fc3RhdDM4MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzExX2luX3N0YXQzODBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xNl9pbl9mb3JTdGF0Mzk5ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMTZfaW5fZm9yU3RhdDM5OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzdfaW5fZm9yU3RhdDQwMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzdfaW5fZm9yU3RhdDQwMV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDQwMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDQwM19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzExX2luX2ZvclN0YXQ0MDUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xMV9pbl9mb3JTdGF0NDA1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NDA3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NDA3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTFfaW5fZm9yU3RhdDQwOSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzExX2luX2ZvclN0YXQ0MDlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ0MTEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ0MTFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV184X2luX2ZvclN0YXQ0MTMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV184X2luX2ZvclN0YXQ0MTNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9mb3JTdGF0NDE1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDQxNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX2Fzc2lnblN0YXQ0NDIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19JRF9pbl9hc3NpZ25TdGF0NDQyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTNfaW5fYXNzaWduU3RhdDQ0NCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzEzX2luX2Fzc2lnblN0YXQ0NDRfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2Fzc2lnblN0YXQ0NDYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2Fzc2lnblN0YXQ0NDZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19jb25kRXhwcl9pbl9leHByNDY4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjQ2OF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNDg3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI0ODdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19zZXRfaW5fY29uZEV4cHI0OTEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zZXRfaW5fY29uZEV4cHI0OTFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hZXhwcl9pbl9jb25kRXhwcjQ5OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2FleHByX2luX2NvbmRFeHByNDk5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYXRvbV9pbl9hZXhwcjUyMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2F0b21faW5fYWV4cHI1MjFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV185X2luX2FleHByNTI1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfOV9pbl9hZXhwcjUyNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2F0b21faW5fYWV4cHI1MjcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hdG9tX2luX2FleHByNTI3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSURfaW5fYXRvbTU0NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX2F0b201NDdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19JTlRfaW5fYXRvbTU2MSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lOVF9pbl9hdG9tNTYxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfN19pbl9hdG9tNTc1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfN19pbl9hdG9tNTc1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9hdG9tNTc3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9hdG9tNTc3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfOF9pbl9hdG9tNTc5ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfOF9pbl9hdG9tNTc5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldFRva2VuTmFtZXM6W1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aE9iamVjdHM6QCI8aW52YWxpZD4iLCBAIjxFT1I+IiwgQCI8RE9XTj4iLCBAIjxVUD4iLCAKKyBAIklEIiwgQCJJTlQiLCBAIldTIiwgQCInKCciLCBAIicpJyIsIEAiJysnIiwgQCInLCciLCBAIic7JyIsIEAiJzwnIiwgQCInPSciLCAKKyBAIic9PSciLCBAIidjaGFyJyIsIEAiJ2ZvciciLCBAIidpbnQnIiwgQCIndm9pZCciLCBAIid7JyIsIEAiJ30nIiwgbmlsXSByZXRhaW5dXTsKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRHcmFtbWFyRmlsZU5hbWU6QCJTaW1wbGVDLmciXTsKK30KKworKyAoU2ltcGxlQ1BhcnNlciAqKW5ld1NpbXBsZUNQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICByZXR1cm4gW1tTaW1wbGVDUGFyc2VyIGFsbG9jXSBpbml0V2l0aFRva2VuU3RyZWFtOmFTdHJlYW1dOworCisKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbSBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MTUrMV0gcmV0YWluXV07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKworCisgICAgICAgIGRmYTIgPSBbREZBMiBuZXdERkEyV2l0aFJlY29nbml6ZXI6c2VsZl07CisgICAgICAgIC8qIHN0YXJ0IG9mIGFjdGlvbnMtYWN0aW9uU2NvcGUtaW5pdCAqLworICAgICAgICAvKiBzdGFydCBvZiBpbml0ICovCisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW2RmYTIgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIHN0YXJ0IG1lbWJlcnMgKi8KKy8qIE9iakMgZW5kIG1lbWJlcnMgKi8KKy8qIE9iakMgc3RhcnQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisvKiBPYmpDIHN0YXJ0IHJ1bGVzICovCisvKgorICogJEFOVExSIHN0YXJ0IHByb2dyYW0KKyAqIFNpbXBsZUMuZzo3OjE6IHByb2dyYW0gOiAoIGRlY2xhcmF0aW9uICkrIDsKKyAqLworLSAodm9pZCkgcHJvZ3JhbQoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjg6NTogKCAoIGRlY2xhcmF0aW9uICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo4Ojk6ICggZGVjbGFyYXRpb24gKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjg6OTogKCBkZWNsYXJhdGlvbiApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MSA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBMV8wPT1JRHx8TEExXzA9PTE1fHwoTEExXzAgPj0gMTcgJiYgTEExXzAgPD0gMTgpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODo5OiBkZWNsYXJhdGlvbiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW0yOF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGRlY2xhcmF0aW9uXTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjppbnB1dCBkZWNpc2lvbk51bWJlcjoxXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDErKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDE6IDsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHByb2dyYW0gKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBkZWNsYXJhdGlvbgorICogU2ltcGxlQy5nOjIwOjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyICc7JyB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrICk7CisgKi8KKy0gKHZvaWQpIGRlY2xhcmF0aW9uCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAgTlNTdHJpbmcgKiBmdW5jdGlvbkhlYWRlcjEgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBOU1N0cmluZyAqIGZ1bmN0aW9uSGVhZGVyMiA9IG5pbCA7CisgICAgICAgICAKKworICAgICAgICAvLyBTaW1wbGVDLmc6MjE6NTogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyICc7JyB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDI9MzsKKyAgICAgICAgYWx0MiA9IFtkZmEyIHByZWRpY3Q6aW5wdXRdOworICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MjE6OTogdmFyaWFibGUgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjUwXTsKKyAgICAgICAgICAgICAgICBbc2VsZiB2YXJpYWJsZV07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MjI6OTogZnVuY3Rpb25IZWFkZXIgJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb242MF07CisgICAgICAgICAgICAgICAgZnVuY3Rpb25IZWFkZXIxID0gW3NlbGYgZnVuY3Rpb25IZWFkZXJdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTEgRm9sbG93OkZPTExPV18xMV9pbl9kZWNsYXJhdGlvbjYyXTsgCisKKyAgICAgICAgICAgICAgICAgTlNMb2coQCIlQCBpcyBhIGRlY2xhcmF0aW9uXG4iLCBmdW5jdGlvbkhlYWRlcjEKKyAgICAgICAgICAgICAgICApOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoyNDo5OiBmdW5jdGlvbkhlYWRlciBibG9jayAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uNzVdOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uSGVhZGVyMiA9IFtzZWxmIGZ1bmN0aW9uSGVhZGVyXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uNzddOworICAgICAgICAgICAgICAgIFtzZWxmIGJsb2NrXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgIE5TTG9nKEAiJUAgaXMgYSBkZWZpbml0aW9uXG4iLCBmdW5jdGlvbkhlYWRlcjIKKyAgICAgICAgICAgICAgICApOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsYXJhdGlvbiAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHZhcmlhYmxlCisgKiBTaW1wbGVDLmc6Mjg6MTogdmFyaWFibGUgOiB0eXBlIGRlY2xhcmF0b3IgJzsnIDsKKyAqLworLSAodm9pZCkgdmFyaWFibGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUMuZzoyOTo1OiAoIHR5cGUgZGVjbGFyYXRvciAnOycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjI5Ojk6IHR5cGUgZGVjbGFyYXRvciAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX3ZhcmlhYmxlOTldOworICAgICAgICBbc2VsZiB0eXBlXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMDFdOworICAgICAgICBbc2VsZiBkZWNsYXJhdG9yXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTEgRm9sbG93OkZPTExPV18xMV9pbl92YXJpYWJsZTEwM107IAorCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHZhcmlhYmxlICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbGFyYXRvcgorICogU2ltcGxlQy5nOjMyOjE6IGRlY2xhcmF0b3IgOiBJRCA7CisgKi8KKy0gKHZvaWQpIGRlY2xhcmF0b3IKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUMuZzozMzo1OiAoIElEICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzozMzo5OiBJRCAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SUQgRm9sbG93OkZPTExPV19JRF9pbl9kZWNsYXJhdG9yMTIyXTsgCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbGFyYXRvciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGZ1bmN0aW9uSGVhZGVyCisgKiBTaW1wbGVDLmc6MzY6MTogZnVuY3Rpb25IZWFkZXIgcmV0dXJucyBbTlNTdHJpbmcgKm5hbWVdIDogdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJyA7CisgKi8KKy0gKE5TU3RyaW5nICopIGZ1bmN0aW9uSGVhZGVyCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIE5TU3RyaW5nICogbmFtZSA9IG5pbCA7CisKKworCisgICAgICAgIG5hbWU9bmlsOyAvLyBmb3Igbm93IHlvdSBtdXN0IGluaXQgaGVyZSByYXRoZXIgdGhhbiBpbiAncmV0dXJucycKKworICAgIEB0cnkgeworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpJRDMgPSBuaWw7CisKKyAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjU6ICggdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6NDA6OTogdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNTFdOworICAgICAgICBbc2VsZiB0eXBlXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICBJRDM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SUQgRm9sbG93OkZPTExPV19JRF9pbl9mdW5jdGlvbkhlYWRlcjE1M107IAorCisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTo3IEZvbGxvdzpGT0xMT1dfN19pbl9mdW5jdGlvbkhlYWRlcjE1NV07IAorCisgICAgICAgIC8vIFNpbXBsZUMuZzo0MDoyMTogKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQ0PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTRfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTRfMD09SUR8fExBNF8wPT0xNXx8KExBNF8wID49IDE3ICYmIExBNF8wIDw9IDE4KSkgKSB7CisgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjIzOiBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMTU5XTsKKyAgICAgICAgICAgICAgICBbc2VsZiBmb3JtYWxQYXJhbWV0ZXJdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzPTI7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PTEwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjQxOiAnLCcgZm9ybWFsUGFyYW1ldGVyIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTAgRm9sbG93OkZPTExPV18xMF9pbl9mdW5jdGlvbkhlYWRlcjE2M107IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjE2NV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgZm9ybWFsUGFyYW1ldGVyXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgICAgICAgICBsb29wMzogOworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjggRm9sbG93OkZPTExPV184X2luX2Z1bmN0aW9uSGVhZGVyMTczXTsgCisKKyAgICAgICAgbmFtZSA9ICAoSUQzIT1uaWw/SUQzLnRleHQ6bmlsKTsKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisvKiAkQU5UTFIgZW5kIGZ1bmN0aW9uSGVhZGVyICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZm9ybWFsUGFyYW1ldGVyCisgKiBTaW1wbGVDLmc6NDQ6MTogZm9ybWFsUGFyYW1ldGVyIDogdHlwZSBkZWNsYXJhdG9yIDsKKyAqLworLSAodm9pZCkgZm9ybWFsUGFyYW1ldGVyCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDLmc6NDU6NTogKCB0eXBlIGRlY2xhcmF0b3IgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjQ1Ojk6IHR5cGUgZGVjbGFyYXRvciAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMTk1XTsKKyAgICAgICAgW3NlbGYgdHlwZV07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjE5N107CisgICAgICAgIFtzZWxmIGRlY2xhcmF0b3JdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGZvcm1hbFBhcmFtZXRlciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHR5cGUKKyAqIFNpbXBsZUMuZzo0ODoxOiB0eXBlIDogKCAnaW50JyB8ICdjaGFyJyB8ICd2b2lkJyB8IElEICk7CisgKi8KKy0gKHZvaWQpIHR5cGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUMuZzo0OTo1OiAoICdpbnQnIHwgJ2NoYXInIHwgJ3ZvaWQnIHwgSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBpZiAoW2lucHV0IExBOjFdID09IElEfHxbaW5wdXQgTEE6MV0gPT0gMTV8fCgoW2lucHV0IExBOjFdID49IDE3KSAmJiAoW2lucHV0IExBOjFdIDw9IDE4KSkpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgIFtzdGF0ZSBzZXRJc0Vycm9yUmVjb3Zlcnk6Tk9dOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHR5cGUgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBibG9jaworICogU2ltcGxlQy5nOjU1OjE6IGJsb2NrIDogJ3snICggdmFyaWFibGUgKSogKCBzdGF0ICkqICd9JyA7CisgKi8KKy0gKHZvaWQpIGJsb2NrCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDLmc6NTY6NTogKCAneycgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogJ30nICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo1Njo5OiAneycgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogJ30nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxOSBGb2xsb3c6Rk9MTE9XXzE5X2luX2Jsb2NrMjg2XTsgCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDU9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTVfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBNV8wPT1JRCkgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNV8yID0gW2lucHV0IExBOjJdOworICAgICAgICAgICAgICAgIGlmICggKExBNV8yPT1JRCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTVfMD09MTV8fChMQTVfMCA+PSAxNyAmJiBMQTVfMCA8PSAxOCkpICkgeworICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1NzoxMzogdmFyaWFibGUgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV192YXJpYWJsZV9pbl9ibG9jazMwMF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHZhcmlhYmxlXTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3A1OiA7CisKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Nj0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNl8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBNl8wID49IElEICYmIExBNl8wIDw9IElOVCl8fExBNl8wPT03fHxMQTZfMD09MTF8fExBNl8wPT0xNnx8TEE2XzA9PTE5KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NTg6MTM6IHN0YXQgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19zdGF0X2luX2Jsb2NrMzE1XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgc3RhdF07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3A2OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wNjogOworCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjIwIEZvbGxvdzpGT0xMT1dfMjBfaW5fYmxvY2szMjZdOyAKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBibG9jayAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHN0YXQKKyAqIFNpbXBsZUMuZzo2MjoxOiBzdGF0IDogKCBmb3JTdGF0IHwgZXhwciAnOycgfCBibG9jayB8IGFzc2lnblN0YXQgJzsnIHwgJzsnICk7CisgKi8KKy0gKHZvaWQpIHN0YXQKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUMuZzo2Mjo1OiAoIGZvclN0YXQgfCBleHByICc7JyB8IGJsb2NrIHwgYXNzaWduU3RhdCAnOycgfCAnOycgKSAvL3J1bGVibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0Nz01OworICAgICAgICB1bmljaGFyIGNoYXJMQTcgPSBbaW5wdXQgTEE6MV07CisgICAgICAgIHN3aXRjaCAoY2hhckxBNykgeworICAgICAgICAgICAgY2FzZSAxNjogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJRDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE3XzIgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTdfMj09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ3PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE3XzI9PTl8fChMQTdfMiA+PSAxMSAmJiBMQTdfMiA8PSAxMil8fExBN18yPT0xNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246NyBzdGF0ZToyIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgIG52YWUuYyA9IExBN18yOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElOVDogOworICAgICAgICAgICAgY2FzZSA3OiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5OiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogOworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjo3IHN0YXRlOjAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIG52YWUuYyA9IGNoYXJMQTc7CisgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjYyOjc6IGZvclN0YXQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19mb3JTdGF0X2luX3N0YXQzMzhdOworICAgICAgICAgICAgICAgIFtzZWxmIGZvclN0YXRdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjYzOjc6IGV4cHIgJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9zdGF0MzQ2XTsKKyAgICAgICAgICAgICAgICBbc2VsZiBleHByXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjExIEZvbGxvdzpGT0xMT1dfMTFfaW5fc3RhdDM0OF07IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo2NDo3OiBibG9jayAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX3N0YXQzNjJdOworICAgICAgICAgICAgICAgIFtzZWxmIGJsb2NrXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0IDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo2NTo3OiBhc3NpZ25TdGF0ICc7JyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDM3MF07CisgICAgICAgICAgICAgICAgW3NlbGYgYXNzaWduU3RhdF07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxMSBGb2xsb3c6Rk9MTE9XXzExX2luX3N0YXQzNzJdOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNSA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NjY6NzogJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTEgRm9sbG93OkZPTExPV18xMV9pbl9zdGF0MzgwXTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXQgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBmb3JTdGF0CisgKiBTaW1wbGVDLmc6Njk6MTogZm9yU3RhdCA6ICdmb3InICcoJyBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBhc3NpZ25TdGF0ICcpJyBibG9jayA7CisgKi8KKy0gKHZvaWQpIGZvclN0YXQKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUMuZzo3MDo1OiAoICdmb3InICcoJyBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBhc3NpZ25TdGF0ICcpJyBibG9jayApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6NzA6OTogJ2ZvcicgJygnIGFzc2lnblN0YXQgJzsnIGV4cHIgJzsnIGFzc2lnblN0YXQgJyknIGJsb2NrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxNiBGb2xsb3c6Rk9MTE9XXzE2X2luX2ZvclN0YXQzOTldOyAKKworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6NyBGb2xsb3c6Rk9MTE9XXzdfaW5fZm9yU3RhdDQwMV07IAorCisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NDAzXTsKKyAgICAgICAgW3NlbGYgYXNzaWduU3RhdF07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjExIEZvbGxvdzpGT0xMT1dfMTFfaW5fZm9yU3RhdDQwNV07IAorCisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NDA3XTsKKyAgICAgICAgW3NlbGYgZXhwcl07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjExIEZvbGxvdzpGT0xMT1dfMTFfaW5fZm9yU3RhdDQwOV07IAorCisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NDExXTsKKyAgICAgICAgW3NlbGYgYXNzaWduU3RhdF07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjggRm9sbG93OkZPTExPV184X2luX2ZvclN0YXQ0MTNdOyAKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ0MTVdOworICAgICAgICBbc2VsZiBibG9ja107CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZm9yU3RhdCAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGFzc2lnblN0YXQKKyAqIFNpbXBsZUMuZzo3MzoxOiBhc3NpZ25TdGF0IDogSUQgJz0nIGV4cHIgOworICovCistICh2b2lkKSBhc3NpZ25TdGF0Cit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDLmc6NzQ6NTogKCBJRCAnPScgZXhwciApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6NzQ6OTogSUQgJz0nIGV4cHIgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOklEIEZvbGxvdzpGT0xMT1dfSURfaW5fYXNzaWduU3RhdDQ0Ml07IAorCisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxMyBGb2xsb3c6Rk9MTE9XXzEzX2luX2Fzc2lnblN0YXQ0NDRdOyAKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDQ0Nl07CisgICAgICAgIFtzZWxmIGV4cHJdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGFzc2lnblN0YXQgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBleHByCisgKiBTaW1wbGVDLmc6Nzc6MTogZXhwciA6IGNvbmRFeHByIDsKKyAqLworLSAodm9pZCkgZXhwcgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjc3OjU6ICggY29uZEV4cHIgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjc3Ojk6IGNvbmRFeHByIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjQ2OF07CisgICAgICAgIFtzZWxmIGNvbmRFeHByXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBleHByICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgY29uZEV4cHIKKyAqIFNpbXBsZUMuZzo4MDoxOiBjb25kRXhwciA6IGFleHByICggKCAnPT0nIHwgJzwnICkgYWV4cHIgKT8gOworICovCistICh2b2lkKSBjb25kRXhwcgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjgxOjU6ICggYWV4cHIgKCAoICc9PScgfCAnPCcgKSBhZXhwciApPyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6ODE6OTogYWV4cHIgKCAoICc9PScgfCAnPCcgKSBhZXhwciApPyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2FleHByX2luX2NvbmRFeHByNDg3XTsKKyAgICAgICAgW3NlbGYgYWV4cHJdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgIC8vIFNpbXBsZUMuZzo4MToxNTogKCAoICc9PScgfCAnPCcgKSBhZXhwciApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0OD0yOworICAgICAgICBOU0ludGVnZXIgTEE4XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoTEE4XzA9PTEyfHxMQThfMD09MTQpICkgeworICAgICAgICAgICAgYWx0OD0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo4MToxNzogKCAnPT0nIHwgJzwnICkgYWV4cHIgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChbaW5wdXQgTEE6MV0gPT0gMTJ8fFtpbnB1dCBMQToxXSA9PSAxNCkgeworICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgIFtzdGF0ZSBzZXRJc0Vycm9yUmVjb3Zlcnk6Tk9dOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI0OTldOworICAgICAgICAgICAgICAgIFtzZWxmIGFleHByXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGNvbmRFeHByICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgYWV4cHIKKyAqIFNpbXBsZUMuZzo4NDoxOiBhZXhwciA6IGF0b20gKCAnKycgYXRvbSApKiA7CisgKi8KKy0gKHZvaWQpIGFleHByCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDLmc6ODU6NTogKCBhdG9tICggJysnIGF0b20gKSogKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjg1Ojk6IGF0b20gKCAnKycgYXRvbSApKiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2F0b21faW5fYWV4cHI1MjFdOworICAgICAgICBbc2VsZiBhdG9tXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0OT0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBOV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEE5XzA9PTkpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo4NToxNjogJysnIGF0b20gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjkgRm9sbG93OkZPTExPV185X2luX2FleHByNTI1XTsgCisKKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19hdG9tX2luX2FleHByNTI3XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgYXRvbV07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3A5OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wOTogOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgYWV4cHIgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBhdG9tCisgKiBTaW1wbGVDLmc6ODg6MTogYXRvbSA6ICggSUQgfCBJTlQgfCAnKCcgZXhwciAnKScgKTsKKyAqLworLSAodm9pZCkgYXRvbQoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjg5OjU6ICggSUQgfCBJTlQgfCAnKCcgZXhwciAnKScgKSAvL3J1bGVibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MTA9MzsKKyAgICAgICAgdW5pY2hhciBjaGFyTEExMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgc3dpdGNoIChjaGFyTEExMCkgeworICAgICAgICAgICAgY2FzZSBJRDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5UOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDEwPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDEwPTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246MTAgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgbnZhZS5jID0gY2hhckxBMTA7CisgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo4OTo3OiBJRCAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOklEIEZvbGxvdzpGT0xMT1dfSURfaW5fYXRvbTU0N107IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo5MDo3OiBJTlQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpJTlQgRm9sbG93OkZPTExPV19JTlRfaW5fYXRvbTU2MV07IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo5MTo3OiAnKCcgZXhwciAnKScgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTo3IEZvbGxvdzpGT0xMT1dfN19pbl9hdG9tNTc1XTsgCisKKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9hdG9tNTc3XTsKKyAgICAgICAgICAgICAgICBbc2VsZiBleHByXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjggRm9sbG93OkZPTExPV184X2luX2F0b201NzldOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgYXRvbSAqLworLyogT2JqQyBlbmQgcnVsZXMgKi8KKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1BhcnNlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDY5MiAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDX18uZ2wgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9MTC1zdGFyL1NpbXBsZUNfXy5nbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZmODBiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9TaW1wbGVDX18uZ2wKQEAgLTAsMCArMSwzNyBAQAorbGV4ZXIgZ3JhbW1hciBTaW1wbGVDOworb3B0aW9ucyB7CisgIGxhbmd1YWdlPU9iakM7CisKK30KKworVDcgOiAnOycgOworVDggOiAnKCcgOworVDkgOiAnLCcgOworVDEwIDogJyknIDsKK1QxMSA6ICdpbnQnIDsKK1QxMiA6ICdjaGFyJyA7CitUMTMgOiAndm9pZCcgOworVDE0IDogJ3snIDsKK1QxNSA6ICd9JyA7CitUMTYgOiAnZm9yJyA7CitUMTcgOiAnPScgOworVDE4IDogJz09JyA7CitUMTkgOiAnPCcgOworVDIwIDogJysnIDsKKworLy8gJEFOVExSIHNyYyAiU2ltcGxlQy5nIiA5NAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSoKKyAgICA7CisKKy8vICRBTlRMUiBzcmMgIlNpbXBsZUMuZyIgOTcKK0lOVCA6CSgnMCcuLic5JykrCisgICAgOworCisvLyAkQU5UTFIgc3JjICJTaW1wbGVDLmciIDEwMAorV1MgIDogICAoICAgJyAnCisgICAgICAgIHwgICAnXHQnCisgICAgICAgIHwgICAnXHInCisgICAgICAgIHwgICAnXG4nCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWw9OTk7IH0KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9hbnRscjMuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvYW50bHIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxNjI3OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvYW50bHIzLmgKQEAgLTAsMCArMSw3OSBAQAorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uRXJyb3JOb2RlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSREZBLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRQcm94eS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJFcnJvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFzdFF1ZXVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaFJ1bGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50QXJyYXkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxpbmtCYXNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxvb2thaGVhZFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vZGVNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUHRyQnVmZmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZU1lbW8uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN5bWJvbFN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5Tb3VyY2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVJdGVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5pcXVlSURNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhNWEwZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvaW5wdXQKQEAgLTAsMCArMSwxMiBAQAorY2hhciBjOworaW50IHg7CisKK3ZvaWQgYmFyKGludCB4KTsKKworaW50IGZvbyhpbnQgeSwgY2hhciBkKSB7CisgIGludCBpOworICBmb3IgKGk9MDsgaTwzOyBpPWkrMSkgeworICAgIHg9MzsKKyAgICB5PTU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvbWFpbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9tYWluLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2NDViZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvbWFpbi5tCkBAIC0wLDAgKzEsMzAgQEAKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxhbnRscjMuaD4KKyNpbXBvcnQgIlNpbXBsZUNMZXhlci5oIgorI2ltcG9ydCAiU2ltcGxlQ1BhcnNlci5oIgorCitpbnQgbWFpbigpIHsKKwlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCisJTlNTdHJpbmcgKnN0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ29udGVudHNPZkZpbGU6QCIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9MTC1zdGFyL2lucHV0Il07CisJTlNMb2coQCJpbnB1dCBpczogJUAiLCBzdHJpbmcpOworCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbW0FOVExSU3RyaW5nU3RyZWFtIGFsbG9jXSBpbml0V2l0aFN0cmluZ05vQ29weTpzdHJpbmddOworCVNpbXBsZUNMZXhlciAqbGV4ZXIgPSBbW1NpbXBsZUNMZXhlciBhbGxvY10gaW5pdFdpdGhDaGFyU3RyZWFtOnN0cmVhbV07CisKKy8vCUFOVExSQ29tbW9uVG9rZW4gKmN1cnJlbnRUb2tlbjsKKy8vCXdoaWxlICgoY3VycmVudFRva2VuID0gW2xleGVyIG5leHRUb2tlbl0pICYmIFtjdXJyZW50VG9rZW4gZ2V0VHlwZV0gIT0gQU5UTFJUb2tlblR5cGVFT0YpIHsKKy8vCQlOU0xvZyhAIiVAIiwgW2N1cnJlbnRUb2tlbiB0b1N0cmluZ10pOworLy8JfQorCQorCUFOVExSQ29tbW9uVG9rZW5TdHJlYW0gKnRva2VucyA9IFtbQU5UTFJDb21tb25Ub2tlblN0cmVhbSBhbGxvY10gaW5pdFdpdGhUb2tlblNvdXJjZTpsZXhlcl07CisJU2ltcGxlQ1BhcnNlciAqcGFyc2VyID0gW1tTaW1wbGVDUGFyc2VyIGFsbG9jXSBpbml0V2l0aFRva2VuU3RyZWFtOnRva2Vuc107CisJW3BhcnNlciBwcm9ncmFtXTsKKworCVtsZXhlciByZWxlYXNlXTsKKwlbc3RyZWFtIHJlbGVhc2VdOworCVt0b2tlbnMgcmVsZWFzZV07CisJW3BhcnNlciByZWxlYXNlXTsKKworCVtwb29sIHJlbGVhc2VdOworCXJldHVybiAwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvb3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9vdXRwdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3YzUzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvb3V0cHV0CkBAIC0wLDAgKzEsMiBAQAorYmFyIGlzIGEgZGVjbGFyYXRpb24KK2ZvbyBpcyBhIGRlZmluaXRpb24KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvc2ltcGxlYy5nIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvTEwtc3Rhci9zaW1wbGVjLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhODI0NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL0xMLXN0YXIvc2ltcGxlYy5nCkBAIC0wLDAgKzEsMTA2IEBACitncmFtbWFyIFNpbXBsZUM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2U9T2JqQzsKKworfQorCitwcm9ncmFtCisgICAgOiAgIGRlY2xhcmF0aW9uKworICAgIDsKKworLyoqIEluIHRoaXMgcnVsZSwgdGhlIGZ1bmN0aW9uSGVhZGVyIGxlZnQgcHJlZml4IG9uIHRoZSBsYXN0IHR3bworICogIGFsdGVybmF0aXZlcyBpcyBub3QgTEwoaykgZm9yIGEgZml4ZWQgay4gIEhvd2V2ZXIsIGl0IGlzCisgKiAgTEwoKikuICBUaGUgTEwoKikgYWxnb3JpdGhtIHNpbXBseSBzY2FucyBhaGVhZCB1bnRpbCBpdCBzZWVzCisgKiAgZWl0aGVyIHRoZSAnOycgb3IgdGhlICd7JyBvZiB0aGUgYmxvY2sgYW5kIHRoZW4gaXQgcGlja3MKKyAqICB0aGUgYXBwcm9wcmlhdGUgYWx0ZXJuYXRpdmUuICBMb29raGVhZCBjYW4gYmUgYXJiaXRyYXJpbHkKKyAqICBsb25nIGluIHRoZW9yeSwgYnV0IGlzIDw9MTAgaW4gbW9zdCBjYXNlcy4gIFdvcmtzIGdyZWF0LgorICogIFVzZSBBTlRMUldvcmtzIHRvIHNlZSB0aGUgbG9va2FoZWFkIHVzZSAoc3RlcCBieSBMb2NhdGlvbikKKyAqICBhbmQgbG9vayBmb3IgYmx1ZSB0b2tlbnMgaW4gdGhlIGlucHV0IHdpbmRvdyBwYW5lLiA6KQorICovCitkZWNsYXJhdGlvbgorICAgIDogICB2YXJpYWJsZQorICAgIHwgICBmdW5jdGlvbkhlYWRlciAnOycKKwl7IE5TTG9nKEAiXCVAIGlzIGEgZGVjbGFyYXRpb25cbiIsICRmdW5jdGlvbkhlYWRlci5uYW1lKTsgfQorICAgIHwgICBmdW5jdGlvbkhlYWRlciBibG9jaworCXsgTlNMb2coQCJcJUAgaXMgYSBkZWZpbml0aW9uXG4iLCAkZnVuY3Rpb25IZWFkZXIubmFtZSk7IH0KKyAgICA7CisKK3ZhcmlhYmxlCisgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAnOycKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgSUQgCisgICAgOworCitmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtOU1N0cmluZyAqbmFtZV0KK0Bpbml0IHsKKyAgICBuYW1lPW5pbDsgLy8gZm9yIG5vdyB5b3UgbXVzdCBpbml0IGhlcmUgcmF0aGVyIHRoYW4gaW4gJ3JldHVybnMnCit9CisgICAgOiAgIHR5cGUgSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScKKwl7JG5hbWUgPSAkSUQudGV4dDt9CisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICAgICAgICAKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgJ2ludCcgICAKKyAgICB8ICAgJ2NoYXInICAKKyAgICB8ICAgJ3ZvaWQnCisgICAgfCAgIElEICAgICAgICAKKyAgICA7CisKK2Jsb2NrCisgICAgOiAgICd7JworICAgICAgICAgICAgdmFyaWFibGUqCisgICAgICAgICAgICBzdGF0KgorICAgICAgICAnfScKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnICAgICAgCisgICAgfCBibG9jaworICAgIHwgYXNzaWduU3RhdCAnOycKKyAgICB8ICc7JworICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCAnPScgZXhwciAgICAgICAgCisgICAgOworCitleHByOiAgIGNvbmRFeHByCisgICAgOworCitjb25kRXhwcgorICAgIDogICBhZXhwciAoICgnPT0nIHwgJzwnKSBhZXhwciApPworICAgIDsKKworYWV4cHIKKyAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgOworCithdG9tCisgICAgOiBJRCAgICAgIAorICAgIHwgSU5UICAgICAgCisgICAgfCAnKCcgZXhwciAnKScKKyAgICA7IAorCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7ICRjaGFubmVsPUhJRERFTjsgfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZC5nIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWQuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc1MWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWQuZwpAQCAtMCwwICsxLDI2IEBACitncmFtbWFyIENvbWJpbmVkOworCitvcHRpb25zIHsKKwlsYW5ndWFnZT1PYmpDOworfQorCitzdGF0OiBpZGVudGlmaWVyKyAgOworCitpZGVudGlmaWVyCisgICAgOiBJRAorICAgIDsKKworCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDogICAoJzAnLi4nOScpKworICAgIDsKKworV1MgIDogICAoICAgJyAnCisgICAgICAgIHwgICAnXHQnCisgICAgICAgIHwgICAnXHInCisgICAgICAgIHwgICAnXG4nCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWw9OTk7IH0KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWQudG9rZW5zIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWQudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMmY0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZC50b2tlbnMKQEAgLTAsMCArMSwzIEBACitXUz02CitJTlQ9NQorSUQ9NApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWRMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWRMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZExleGVyLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gJEFOVExSIDMuMiBBdWcgMjQsIDIwMTAgMTA6NDU6NTcgQ29tYmluZWQuZyAyMDEwLTA4LTI0IDEzOjUzOjQyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJhbnRscjMuaCIKKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBTdGFydCBjeWNsaWNERkFJbnRlcmZhY2UgKi8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgSU5UIDUKKyNkZWZpbmUgV1MgNgorI2RlZmluZSBJRCA0CisjZGVmaW5lIEVPRiAtMQorQGludGVyZmFjZSBDb21iaW5lZExleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisvLyBzdGFydCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZW1WYXJzCit9CisrIChDb21iaW5lZExleGVyICopbmV3Q29tYmluZWRMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQ7CisKKy0gKHZvaWQpbUlEOyAKKy0gKHZvaWQpbUlOVDsgCistICh2b2lkKW1XUzsgCistICh2b2lkKW1Ub2tlbnM7IAorCitAZW5kIC8qIGVuZCBvZiBDb21iaW5lZExleGVyIGludGVyZmFjZSAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWRMZXhlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWRMZXhlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YmUxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZExleGVyLm0KQEAgLTAsMCArMSw0MDMgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDMuMiBBdWcgMjQsIDIwMTAgMTA6NDU6NTcKKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IENvbWJpbmVkLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMC0wOC0yNCAxMzo1Mzo0MgorICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiBDb21iaW5lZExleGVyTGV4ZXIgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLiAKKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCisqLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAkQU5UTFIgMy4yIEF1ZyAyNCwgMjAxMCAxMDo0NTo1NyBDb21iaW5lZC5nIDIwMTAtMDgtMjQgMTM6NTM6NDIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIkNvbWJpbmVkTGV4ZXIuaCIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisKKy8qKiBBcyBwZXIgVGVyZW5jZTogTm8gcmV0dXJucyBmb3IgbGV4ZXIgcnVsZXMhICovCitAaW1wbGVtZW50YXRpb24gQ29tYmluZWRMZXhlciAvLyBsaW5lIDMzMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiQ29tYmluZWQuZyJdOworfQorCisrIChOU1N0cmluZyAqKSB0b2tlbk5hbWVGb3JUeXBlOihOU0ludGVnZXIpYVRva2VuVHlwZQoreworICAgIHJldHVybiBbW3NlbGYgZ2V0VG9rZW5OYW1lc10gb2JqZWN0QXRJbmRleDphVG9rZW5UeXBlXTsKK30KKworKyAoQ29tYmluZWRMZXhlciAqKW5ld0NvbWJpbmVkTGV4ZXJXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbQ29tYmluZWRMZXhlciBhbGxvY10gaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXRdOworfQorCistIChpZCkgaW5pdFdpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46NCsxXV0pICE9IG5pbCkgeworCisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMgKi8KKy8qIHN0YXJ0IG1ldGhvZHMoKSAqLworCisvKiBTdGFydCBvZiBSdWxlcyAqLworLy8gJEFOVExSIHN0YXJ0ICJJRCIKKy0gKHZvaWQpIG1JRAoreworICAgIC8vCisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBJRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBDb21iaW5lZC5nOjE0OjU6ICggKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIENvbWJpbmVkLmc6MTQ6OTogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnQScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ1onKSl8fFtpbnB1dCBMQToxXSA9PSAnXyd8fCgoW2lucHV0IExBOjFdID49ICdhJykgJiYgKFtpbnB1dCBMQToxXSA8PSAneicpKSkgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7fQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBMV8wPj0nMCcgJiYgTEExXzA8PSc5Jyl8fChMQTFfMD49J0EnICYmIExBMV8wPD0nWicpfHxMQTFfMD09J18nfHwoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tYmluZWQuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTZXQ6bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlO30KKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDE6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJJRCIKKworLy8gJEFOVExSIHN0YXJ0ICJJTlQiCistICh2b2lkKSBtSU5UCit7CisgICAgLy8KKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBDb21iaW5lZC5nOjE3OjU6ICggKCAnMCcgLi4gJzknICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIENvbWJpbmVkLmc6MTc6OTogKCAnMCcgLi4gJzknICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIENvbWJpbmVkLmc6MTc6OTogKCAnMCcgLi4gJzknICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQyPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tYmluZWQuZzoxNzoxMDogJzAnIC4uICc5JyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFJhbmdlRnJvbUNoYXI6JzAnIHRvOic5J107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MiA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFN0cmVhbTppbnB1dCBkZWNpc2lvbk51bWJlcjoyXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJJTlQiCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gQ29tYmluZWQuZzoyMDo1OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIENvbWJpbmVkLmc6MjA6OTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gQ29tYmluZWQuZzoyMDo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250Mz0wOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mz0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBM18wPj0nXHQnICYmIExBM18wPD0nXG4nKXx8TEEzXzA9PSdccid8fExBM18wPT0nICcpICkgeworICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbWJpbmVkLmc6IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnXHQnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdcbicpKXx8W2lucHV0IExBOjFdID09ICdccid8fFtpbnB1dCBMQToxXSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTZXQ6bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlO30KKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQzID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9IFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU3RyZWFtOmlucHV0IGRlY2lzaW9uTnVtYmVyOjNdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MysrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMzogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgX2NoYW5uZWw9OTk7ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiV1MiCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBDb21iaW5lZC5nOjE6ODogKCBJRCB8IElOVCB8IFdTICkgLy9ydWxlYmxvY2sKKyAgICBOU0ludGVnZXIgYWx0ND0zOworICAgIHN3aXRjaCAoW2lucHV0IExBOjFdKSB7CisgICAgICAgIGNhc2UgJ0EnOiA7CisgICAgICAgIGNhc2UgJ0InOiA7CisgICAgICAgIGNhc2UgJ0MnOiA7CisgICAgICAgIGNhc2UgJ0QnOiA7CisgICAgICAgIGNhc2UgJ0UnOiA7CisgICAgICAgIGNhc2UgJ0YnOiA7CisgICAgICAgIGNhc2UgJ0cnOiA7CisgICAgICAgIGNhc2UgJ0gnOiA7CisgICAgICAgIGNhc2UgJ0knOiA7CisgICAgICAgIGNhc2UgJ0onOiA7CisgICAgICAgIGNhc2UgJ0snOiA7CisgICAgICAgIGNhc2UgJ0wnOiA7CisgICAgICAgIGNhc2UgJ00nOiA7CisgICAgICAgIGNhc2UgJ04nOiA7CisgICAgICAgIGNhc2UgJ08nOiA7CisgICAgICAgIGNhc2UgJ1AnOiA7CisgICAgICAgIGNhc2UgJ1EnOiA7CisgICAgICAgIGNhc2UgJ1InOiA7CisgICAgICAgIGNhc2UgJ1MnOiA7CisgICAgICAgIGNhc2UgJ1QnOiA7CisgICAgICAgIGNhc2UgJ1UnOiA7CisgICAgICAgIGNhc2UgJ1YnOiA7CisgICAgICAgIGNhc2UgJ1cnOiA7CisgICAgICAgIGNhc2UgJ1gnOiA7CisgICAgICAgIGNhc2UgJ1knOiA7CisgICAgICAgIGNhc2UgJ1onOiA7CisgICAgICAgIGNhc2UgJ18nOiA7CisgICAgICAgIGNhc2UgJ2EnOiA7CisgICAgICAgIGNhc2UgJ2InOiA7CisgICAgICAgIGNhc2UgJ2MnOiA7CisgICAgICAgIGNhc2UgJ2QnOiA7CisgICAgICAgIGNhc2UgJ2UnOiA7CisgICAgICAgIGNhc2UgJ2YnOiA7CisgICAgICAgIGNhc2UgJ2cnOiA7CisgICAgICAgIGNhc2UgJ2gnOiA7CisgICAgICAgIGNhc2UgJ2knOiA7CisgICAgICAgIGNhc2UgJ2onOiA7CisgICAgICAgIGNhc2UgJ2snOiA7CisgICAgICAgIGNhc2UgJ2wnOiA7CisgICAgICAgIGNhc2UgJ20nOiA7CisgICAgICAgIGNhc2UgJ24nOiA7CisgICAgICAgIGNhc2UgJ28nOiA7CisgICAgICAgIGNhc2UgJ3AnOiA7CisgICAgICAgIGNhc2UgJ3EnOiA7CisgICAgICAgIGNhc2UgJ3InOiA7CisgICAgICAgIGNhc2UgJ3MnOiA7CisgICAgICAgIGNhc2UgJ3QnOiA7CisgICAgICAgIGNhc2UgJ3UnOiA7CisgICAgICAgIGNhc2UgJ3YnOiA7CisgICAgICAgIGNhc2UgJ3cnOiA7CisgICAgICAgIGNhc2UgJ3gnOiA7CisgICAgICAgIGNhc2UgJ3knOiA7CisgICAgICAgIGNhc2UgJ3onOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMCc6IDsKKyAgICAgICAgY2FzZSAnMSc6IDsKKyAgICAgICAgY2FzZSAnMic6IDsKKyAgICAgICAgY2FzZSAnMyc6IDsKKyAgICAgICAgY2FzZSAnNCc6IDsKKyAgICAgICAgY2FzZSAnNSc6IDsKKyAgICAgICAgY2FzZSAnNic6IDsKKyAgICAgICAgY2FzZSAnNyc6IDsKKyAgICAgICAgY2FzZSAnOCc6IDsKKyAgICAgICAgY2FzZSAnOSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCc6IDsKKyAgICAgICAgY2FzZSAnXG4nOiA7CisgICAgICAgIGNhc2UgJ1xyJzogOworICAgICAgICBjYXNlICcgJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiA7CisgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uOjQgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICBAdGhyb3cgbnZhZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgLy8gQ29tYmluZWQuZzoxOjEwOiBJRCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtSURdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAvLyBDb21iaW5lZC5nOjE6MTM6IElOVCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtSU5UXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gQ29tYmluZWQuZzoxOjE3OiBXUyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKK0BlbmQgLyogZW5kIG9mIENvbWJpbmVkTGV4ZXIgaW1wbGVtZW50YXRpb24gbGluZSAzOTcgKi8KKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2NvbWJpbmVkL0NvbWJpbmVkUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDhmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZFBhcnNlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vICRBTlRMUiAzLjIgQXVnIDI0LCAyMDEwIDEwOjQ1OjU3IENvbWJpbmVkLmcgMjAxMC0wOC0yNCAxMzo1Mzo0MgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiYW50bHIzLmgiCisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogcGFyc2VySGVhZGVyRmlsZSAqLworI3ByYWdtYSBtYXJrIFRva2VucworI2RlZmluZSBXUyA2CisjZGVmaW5lIElOVCA1CisjZGVmaW5lIElEIDQKKyNkZWZpbmUgRU9GIC0xCisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKK0BpbnRlcmZhY2UgQ29tYmluZWRQYXJzZXIgOiBBTlRMUlBhcnNlciB7IC8qIGxpbmUgNTcyICovCisvLyBzdGFydCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhcgorCisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZW1WYXJzCisvLyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIKKworCisvLyBTdGFydCBvZiBtZW1WYXJzCisKKyB9CisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZXRob2RzRGVjbAorCisKKy0gKHZvaWQpc3RhdDsgCistICh2b2lkKWlkZW50aWZpZXI7IAorCisKK0BlbmQgLyogZW5kIG9mIENvbWJpbmVkUGFyc2VyIGludGVyZmFjZSAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvQ29tYmluZWRQYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2NvbWJpbmVkL0NvbWJpbmVkUGFyc2VyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1ZDZmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2NvbWJpbmVkL0NvbWJpbmVkUGFyc2VyLm0KQEAgLTAsMCArMSwyMDQgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDMuMiBBdWcgMjQsIDIwMTAgMTA6NDU6NTcKKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IENvbWJpbmVkLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMC0wOC0yNCAxMzo1Mzo0MgorICogICAgIC0gICAgICAgICAgICAgICAgZm9yIHRoZSBwYXJzZXIgOiBDb21iaW5lZFBhcnNlclBhcnNlciAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuIAorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vICRBTlRMUiAzLjIgQXVnIDI0LCAyMDEwIDEwOjQ1OjU3IENvbWJpbmVkLmcgMjAxMC0wOC0yNCAxMzo1Mzo0MgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiQ29tYmluZWRQYXJzZXIuaCIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisKKworI3ByYWdtYSBtYXJrIEJpdHNldHMKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2lkZW50aWZpZXJfaW5fc3RhdDIwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfaWRlbnRpZmllcl9pbl9zdGF0MjBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMTJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JRF9pbl9pZGVudGlmaWVyMzU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19JRF9pbl9pZGVudGlmaWVyMzVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CisKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisvKiByZXR1cm5TY29wZSAqLworCisvKiByZXR1cm5TY29wZSAqLworCisKKworQGltcGxlbWVudGF0aW9uIENvbWJpbmVkUGFyc2VyICAvLyBsaW5lIDYzNworCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfaWRlbnRpZmllcl9pbl9zdGF0MjAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19pZGVudGlmaWVyX2luX3N0YXQyMF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX2lkZW50aWZpZXIzNSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX2lkZW50aWZpZXIzNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRUb2tlbk5hbWVzOltbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czpAIjxpbnZhbGlkPiIsIEAiPEVPUj4iLCBAIjxET1dOPiIsIEAiPFVQPiIsIAorIEAiSUQiLCBAIklOVCIsIEAiV1MiLCBuaWxdIHJldGFpbl1dOworfQorCisrIChDb21iaW5lZFBhcnNlciAqKW5ld0NvbWJpbmVkUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPilhU3RyZWFtCit7CisgICAgcmV0dXJuIFtbQ29tYmluZWRQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbV07CisKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtIFN0YXRlOltbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjoyKzFdIHJldGFpbl1dKSAhPSBuaWwpIHsKKworCisKKyAgICAgICAgLyogc3RhcnQgb2YgYWN0aW9ucy1hY3Rpb25TY29wZS1pbml0ICovCisgICAgICAgIC8qIHN0YXJ0IG9mIGluaXQgKi8KKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisvLyBzdGFydCBhY3Rpb25zLmFjdGlvblNjb3BlLm1ldGhvZHMKKy8vIHN0YXJ0IG1ldGhvZHMoKQorLy8gc3RhcnQgcnVsZXMKKy8qCisgKiAkQU5UTFIgc3RhcnQgc3RhdAorICogQ29tYmluZWQuZzo3OjE6IHN0YXQgOiAoIGlkZW50aWZpZXIgKSsgOworICovCistICh2b2lkKSBzdGF0Cit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBDb21iaW5lZC5nOjc6NTogKCAoIGlkZW50aWZpZXIgKSsgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gQ29tYmluZWQuZzo3Ojc6ICggaWRlbnRpZmllciApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyBDb21iaW5lZC5nOjc6NzogKCBpZGVudGlmaWVyICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQxPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTFfMD09SUQpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbWJpbmVkLmc6Nzo3OiBpZGVudGlmaWVyIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2lkZW50aWZpZXJfaW5fc3RhdDIwXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgaWRlbnRpZmllcl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQxID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMTsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9IFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU3RyZWFtOmlucHV0IGRlY2lzaW9uTnVtYmVyOjFdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MSsrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMTogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzdGF0ICovCisvKgorICogJEFOVExSIHN0YXJ0IGlkZW50aWZpZXIKKyAqIENvbWJpbmVkLmc6OToxOiBpZGVudGlmaWVyIDogSUQgOworICovCistICh2b2lkKSBpZGVudGlmaWVyCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBDb21iaW5lZC5nOjEwOjU6ICggSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gQ29tYmluZWQuZzoxMDo3OiBJRCAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SUQgRm9sbG93OkZPTExPV19JRF9pbl9pZGVudGlmaWVyMzVdOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBpZGVudGlmaWVyICovCisKK0BlbmQgLyogZW5kIG9mIENvbWJpbmVkUGFyc2VyIGltcGxlbWVudGF0aW9uIGxpbmUgNjkyICovCisKKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2NvbWJpbmVkL0NvbWJpbmVkX18uZ2wgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZF9fLmdsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzFjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9Db21iaW5lZF9fLmdsCkBAIC0wLDAgKzEsMjIgQEAKK2xleGVyIGdyYW1tYXIgQ29tYmluZWQ7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2U9T2JqQzsKKworfQorCisvLyAkQU5UTFIgc3JjICJDb21iaW5lZC5nIiAxNAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSoKKyAgICA7CisKKy8vICRBTlRMUiBzcmMgIkNvbWJpbmVkLmciIDE3CitJTlQgOiAgICgnMCcuLic5JykrCisgICAgOworCisvLyAkQU5UTFIgc3JjICJDb21iaW5lZC5nIiAyMAorV1MgIDogICAoICAgJyAnCisgICAgICAgIHwgICAnXHQnCisgICAgICAgIHwgICAnXHInCisgICAgICAgIHwgICAnXG4nCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWw9OTk7IH0KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvYW50bHIzLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9hbnRscjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjE2Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvYW50bHIzLmgKQEAgLTAsMCArMSw3OSBAQAorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uRXJyb3JOb2RlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSREZBLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRQcm94eS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJFcnJvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFzdFF1ZXVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaFJ1bGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50QXJyYXkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxpbmtCYXNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxvb2thaGVhZFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vZGVNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUHRyQnVmZmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZU1lbW8uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN5bWJvbFN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5Tb3VyY2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVJdGVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5pcXVlSURNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvbWFpbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvbWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjViZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9tYWluLm0KQEAgLTAsMCArMSwyMyBAQAorI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIkNvbWJpbmVkTGV4ZXIuaCIKKyNpbXBvcnQgImFudGxyMy5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkKK3sKKyAgICBOU0xvZyhAInN0YXJ0aW5nIGNvbWJpbmVkXG4iKTsKKwlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCU5TU3RyaW5nICpzdHJpbmcgPSBAInh5eXl5YXh5eXl5YiI7CisJTlNMb2coQCIlQCIsIHN0cmluZyk7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTpzdHJpbmddOworCUNvbWJpbmVkTGV4ZXIgKmxleGVyID0gW0NvbWJpbmVkTGV4ZXIgbmV3Q29tYmluZWRMZXhlcldpdGhDaGFyU3RyZWFtOnN0cmVhbV07CisJaWQ8QU5UTFJUb2tlbj4gY3VycmVudFRva2VuOworCXdoaWxlICgoY3VycmVudFRva2VuID0gW2xleGVyIG5leHRUb2tlbl0pICYmIFtjdXJyZW50VG9rZW4gZ2V0VHlwZV0gIT0gQU5UTFJUb2tlblR5cGVFT0YpIHsKKwkJTlNMb2coQCIlQCIsIGN1cnJlbnRUb2tlbik7CisJfQorCVtsZXhlciByZWxlYXNlXTsKKwlbc3RyZWFtIHJlbGVhc2VdOworCQorCVtwb29sIHJlbGVhc2VdOworICAgIE5TTG9nKEAiZXhpdGluZyBjb21iaW5lZFxuIik7CisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvb3V0cHV0MS9Db21iaW5lZC50b2tlbnMgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9jb21iaW5lZC9vdXRwdXQxL0NvbWJpbmVkLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjJmNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvY29tYmluZWQvb3V0cHV0MS9Db21iaW5lZC50b2tlbnMKQEAgLTAsMCArMSwzIEBACitXUz02CitJTlQ9NQorSUQ9NApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5LmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyZjk4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5LmcKQEAgLTAsMCArMSw4NiBAQAorbGV4ZXIgZ3JhbW1hciBGdXp6eTsKK29wdGlvbnMge2ZpbHRlcj10cnVlOyBsYW5ndWFnZT1PYmpDO30KKworSU1QT1JUCisJOgknaW1wb3J0JyBXUyBuYW1lPVFJRFN0YXIgV1M/ICc7JworCTsKKwkKKy8qKiBBdm9pZHMgaGF2aW5nICJyZXR1cm4gZm9vOyIgbWF0Y2ggYXMgYSBmaWVsZCAqLworUkVUVVJOCisJOgkncmV0dXJuJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306LikqICc7JworCTsKKworQ0xBU1MKKwk6CSdjbGFzcycgV1MgbmFtZT1JRCBXUz8gKCdleHRlbmRzJyBXUyBRSUQgV1M/KT8KKwkJKCdpbXBsZW1lbnRzJyBXUyBRSUQgV1M/ICgnLCcgV1M/IFFJRCBXUz8pKik/ICd7JworICAgICAgICB7TlNMb2coQCJmb3VuZCBjbGFzcyBcJUAiLCAkbmFtZS50ZXh0KTt9CisJOworCQorTUVUSE9ECisgICAgOiAgIFRZUEUgV1MgbmFtZT1JRCBXUz8gJygnICggQVJHIFdTPyAoJywnIFdTPyBBUkcgV1M/KSogKT8gJyknIFdTPyAKKyAgICAgICAoJ3Rocm93cycgV1MgUUlEIFdTPyAoJywnIFdTPyBRSUQgV1M/KSopPyAneycKKyAgICAgICAge05TTG9nKEAiZm91bmQgbWV0aG9kIFwlQCIsICRuYW1lLnRleHQpO30KKyAgICA7CisKK0ZJRUxECisgICAgOiAgIFRZUEUgV1MgbmFtZT1JRCAnW10nPyBXUz8gKCc7J3wnPScpCisgICAgICAgIHtOU0xvZyhAImZvdW5kIHZhciBcJUAiLCAkbmFtZS50ZXh0KTt9CisgICAgOworCitTVEFUOgkoJ2lmJ3wnd2hpbGUnfCdzd2l0Y2gnfCdmb3InKSBXUz8gJygnIDsKKwkKK0NBTEwKKyAgICA6ICAgbmFtZT1RSUQgV1M/ICcoJworICAgICAgICB7LyppZ25vcmUgaWYgdGhpcy9zdXBlciAqLyBOU0xvZyhAImZvdW5kIGNhbGwgXCVAIiwkbmFtZS50ZXh0KTt9CisgICAgOworCitDT01NRU5UCisgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgICAgIHtOU0xvZyhAImZvdW5kIGNvbW1lbnQgXCVAIiwgW3NlbGYgdGV4dF0pO30KKyAgICA7CisKK1NMX0NPTU1FTlQKKyAgICA6ICAgJy8vJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqICdcbicKKyAgICAgICAge05TTG9nKEAiZm91bmQgLy8gY29tbWVudCBcJUAiLCBbc2VsZiB0ZXh0XSk7fQorICAgIDsKKwkKK1NUUklORworCToJJyInIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTogRVNDIHwgLikqICciJworCTsKKworQ0hBUgorCToJJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnXCcnCisJOworCitXUyAgOiAgICgnICd8J1x0J3wnXG4nKSsKKyAgICA7CisKK2ZyYWdtZW50CitRSUQgOglJRCAoJy4nIElEKSoKKwk7CisJCisvKiogUUlEIGNhbm5vdCBzZWUgYmV5b25kIGVuZCBvZiB0b2tlbiBzbyB1c2luZyBRSUQgJy4qJz8gc29tZXdoZXJlIHdvbid0CisgKiAgZXZlciBtYXRjaCBzaW5jZSBrPTEgbG9va2FoZWFkIGluIHRoZSBRSUQgbG9vcCBvZiAnLicgd2lsbCBtYWtlIGl0IGxvb3AuCisgKiAgSSBtYWRlIHRoaXMgcnVsZSB0byBjb21wZW5zYXRlLgorICovCitmcmFnbWVudAorUUlEU3RhcgorCToJSUQgKCcuJyBJRCkqICcuKic/CisJOworCitmcmFnbWVudAorVFlQRTogICBRSUQgJ1tdJz8KKyAgICA7CisgICAgCitmcmFnbWVudAorQVJHIDogICBUWVBFIFdTIElECisgICAgOworCitmcmFnbWVudAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICA7CisKK2ZyYWdtZW50CitFU0MJOgknXFwnICgnIid8J1wnJ3wnXFwnKQorCTsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyNTVhNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5LmgKQEAgLTAsMCArMSw4NyBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSAvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nIDIwMTEtMDUtMDUgMjI6MDU6MDEKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogU3RhcnQgY3ljbGljREZBSW50ZXJmYWNlICovCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjaWZkZWYgRU9GCisjdW5kZWYgRU9GCisjZW5kaWYKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIEFSRyA0CisjZGVmaW5lIENBTEwgNQorI2RlZmluZSBDSEFSIDYKKyNkZWZpbmUgQ0xBU1MgNworI2RlZmluZSBDT01NRU5UIDgKKyNkZWZpbmUgRVNDIDkKKyNkZWZpbmUgRklFTEQgMTAKKyNkZWZpbmUgSUQgMTEKKyNkZWZpbmUgSU1QT1JUIDEyCisjZGVmaW5lIE1FVEhPRCAxMworI2RlZmluZSBRSUQgMTQKKyNkZWZpbmUgUUlEU3RhciAxNQorI2RlZmluZSBSRVRVUk4gMTYKKyNkZWZpbmUgU0xfQ09NTUVOVCAxNworI2RlZmluZSBTVEFUIDE4CisjZGVmaW5lIFNUUklORyAxOQorI2RlZmluZSBUWVBFIDIwCisjZGVmaW5lIFdTIDIxCisvKiBpbnRlcmZhY2UgbGV4ZXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgRnV6enkgOiBBTlRMUkxleGVyIHsgLy8gbGluZSAyODMKK1NFTCBzeW5wcmVkOV9GdXp6eVNlbGVjdG9yOworU0VMIHN5bnByZWQyX0Z1enp5U2VsZWN0b3I7CitTRUwgc3lucHJlZDdfRnV6enlTZWxlY3RvcjsKK1NFTCBzeW5wcmVkNF9GdXp6eVNlbGVjdG9yOworU0VMIHN5bnByZWQ4X0Z1enp5U2VsZWN0b3I7CitTRUwgc3lucHJlZDZfRnV6enlTZWxlY3RvcjsKK1NFTCBzeW5wcmVkNV9GdXp6eVNlbGVjdG9yOworU0VMIHN5bnByZWQzX0Z1enp5U2VsZWN0b3I7CitTRUwgc3lucHJlZDFfRnV6enlTZWxlY3RvcjsKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMgKi8KK30KKysgKHZvaWQpIGluaXRpYWxpemU7CisrIChGdXp6eSAqKW5ld0Z1enp5V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKy8qIE9iakMgc3RhcnQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLSAodm9pZCkgbUlNUE9SVCA7IAorLSAodm9pZCkgbVJFVFVSTiA7IAorLSAodm9pZCkgbUNMQVNTIDsgCistICh2b2lkKSBtTUVUSE9EIDsgCistICh2b2lkKSBtRklFTEQgOyAKKy0gKHZvaWQpIG1TVEFUIDsgCistICh2b2lkKSBtQ0FMTCA7IAorLSAodm9pZCkgbUNPTU1FTlQgOyAKKy0gKHZvaWQpIG1TTF9DT01NRU5UIDsgCistICh2b2lkKSBtU1RSSU5HIDsgCistICh2b2lkKSBtQ0hBUiA7IAorLSAodm9pZCkgbVdTIDsgCistICh2b2lkKSBtUUlEIDsgCistICh2b2lkKSBtUUlEU3RhciA7IAorLSAodm9pZCkgbVRZUEUgOyAKKy0gKHZvaWQpIG1BUkcgOyAKKy0gKHZvaWQpIG1JRCA7IAorLSAodm9pZCkgbUVTQyA7IAorLSAodm9pZCkgbVRva2VucyA7IAorLSAodm9pZCkgc3lucHJlZDFfRnV6enlfZnJhZ21lbnQgOyAKKy0gKHZvaWQpIHN5bnByZWQyX0Z1enp5X2ZyYWdtZW50IDsgCistICh2b2lkKSBzeW5wcmVkM19GdXp6eV9mcmFnbWVudCA7IAorLSAodm9pZCkgc3lucHJlZDRfRnV6enlfZnJhZ21lbnQgOyAKKy0gKHZvaWQpIHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50IDsgCistICh2b2lkKSBzeW5wcmVkNl9GdXp6eV9mcmFnbWVudCA7IAorLSAodm9pZCkgc3lucHJlZDdfRnV6enlfZnJhZ21lbnQgOyAKKy0gKHZvaWQpIHN5bnByZWQ4X0Z1enp5X2ZyYWdtZW50IDsgCistICh2b2lkKSBzeW5wcmVkOV9GdXp6eV9mcmFnbWVudCA7IAorCitAZW5kIC8qIGVuZCBvZiBGdXp6eSBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ZjQxMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lm0KQEAgLTAsMCArMSwyMzczIEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IEZ1enp5LmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMS0wNS0wNiAxMTo0Nzo0NgorICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiBGdXp6eUxleGVyCisgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLgorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IEZ1enp5LmcgMjAxMS0wNS0wNiAxMTo0Nzo0NgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJGdXp6eS5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzISAqLworQGltcGxlbWVudGF0aW9uIEZ1enp5IC8vIGxpbmUgMzMwCisKKysgKHZvaWQpIGluaXRpYWxpemUKK3sKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRHcmFtbWFyRmlsZU5hbWU6QCJGdXp6eS5nIl07Cit9CisKKysgKE5TU3RyaW5nICopIHRva2VuTmFtZUZvclR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OmFUb2tlblR5cGVdOworfQorCisrIChGdXp6eSAqKW5ld0Z1enp5V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHJldHVybiBbW0Z1enp5IGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjMwKzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIFNFTCBzeW5wcmVkOV9GdXp6eVNlbGVjdG9yID0gQHNlbGVjdG9yKHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50KTsKKworICAgICAgICBTRUwgc3lucHJlZDJfRnV6enlTZWxlY3RvciA9IEBzZWxlY3RvcihzeW5wcmVkMl9GdXp6eV9mcmFnbWVudCk7CisKKyAgICAgICAgU0VMIHN5bnByZWQ3X0Z1enp5U2VsZWN0b3IgPSBAc2VsZWN0b3Ioc3lucHJlZDdfRnV6enlfZnJhZ21lbnQpOworCisgICAgICAgIFNFTCBzeW5wcmVkNF9GdXp6eVNlbGVjdG9yID0gQHNlbGVjdG9yKHN5bnByZWQ0X0Z1enp5X2ZyYWdtZW50KTsKKworICAgICAgICBTRUwgc3lucHJlZDhfRnV6enlTZWxlY3RvciA9IEBzZWxlY3RvcihzeW5wcmVkOF9GdXp6eV9mcmFnbWVudCk7CisKKyAgICAgICAgU0VMIHN5bnByZWQ2X0Z1enp5U2VsZWN0b3IgPSBAc2VsZWN0b3Ioc3lucHJlZDZfRnV6enlfZnJhZ21lbnQpOworCisgICAgICAgIFNFTCBzeW5wcmVkNV9GdXp6eVNlbGVjdG9yID0gQHNlbGVjdG9yKHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50KTsKKworICAgICAgICBTRUwgc3lucHJlZDNfRnV6enlTZWxlY3RvciA9IEBzZWxlY3RvcihzeW5wcmVkM19GdXp6eV9mcmFnbWVudCk7CisKKyAgICAgICAgU0VMIHN5bnByZWQxX0Z1enp5U2VsZWN0b3IgPSBAc2VsZWN0b3Ioc3lucHJlZDFfRnV6enlfZnJhZ21lbnQpOworCisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIFN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisKKy0gKGlkPEFOVExSVG9rZW4+KSBuZXh0VG9rZW4KK3sKKyAgICB3aGlsZSAoWUVTKSB7CisgICAgICAgIGlmICggW2lucHV0IExBOjFdID09IEFOVExSQ2hhclN0cmVhbUVPRiApIHsKKyAgICAgICAgICAgIHJldHVybiBbQU5UTFJDb21tb25Ub2tlbiBlb2ZUb2tlbl07CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUudG9rZW4gPSBuaWw7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSBpbnB1dC5pbmRleDsKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LmNoYXJQb3NpdGlvbkluTGluZTsKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydExpbmUgPSBpbnB1dC5saW5lOworICAgICAgICBzdGF0ZS50ZXh0ID0gbmlsOworICAgICAgICBAdHJ5IHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBtID0gW2lucHV0IG1hcmtdOworICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nID0gMTsgLyogbWVhbnMgd2Ugd29uJ3QgdGhyb3cgc2xvdyBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IE5POworICAgICAgICAgICAgW3NlbGYgbVRva2Vuc107CisgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcgPSAwOworICAgICAgICAgICAgLyogbVRva2VucyBiYWNrdHJhY2tzIHdpdGggc3lucHJlZCBhdCBiYWNrdHJhY2tpbmc9PTIKKyAgICAgICAgICAgICAgIGFuZCB3ZSBzZXQgdGhlIHN5bnByZWRnYXRlIHRvIGFsbG93IGFjdGlvbnMgYXQgbGV2ZWwgMS4gKi8KKyAgICAgICAgICAgIGlmICggc3RhdGUuZmFpbGVkICkgeworICAgICAgICAgICAgICAgIFtpbnB1dCByZXdpbmQ6bV07CisgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOyAvKiBhZHZhbmNlIG9uZSBjaGFyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgW3NlbGYgZW1pdF07CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gaW4gYmFja3RyYWNraW5nIG1vZGUsIGJ1dC4uLgorICAgICAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICAgICAgW3NlbGYgcmVjb3ZlcjpyZV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy0gKHZvaWQpbWVtb2l6ZTooaWQ8QU5UTFJJbnRTdHJlYW0+KWFuSW5wdXQKKyAgICAgIFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleAorICAgICBTdGFydEluZGV4OihOU0ludGVnZXIpcnVsZVN0YXJ0SW5kZXgKK3sKKyAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDEgKSBbc3VwZXIgbWVtb2l6ZTphbklucHV0IFJ1bGVJbmRleDpydWxlSW5kZXggU3RhcnRJbmRleDpydWxlU3RhcnRJbmRleF07Cit9CisKKy0gKEJPT0wpYWxyZWFkeVBhcnNlZFJ1bGU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0IFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleAoreworICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMSApIHJldHVybiBbc3VwZXIgYWxyZWFkeVBhcnNlZFJ1bGU6YW5JbnB1dCBSdWxlSW5kZXg6cnVsZUluZGV4XTsKKyAgICByZXR1cm4gTk87Cit9CisvKiBTdGFydCBvZiBSdWxlcyAqLworLy8gJEFOVExSIHN0YXJ0ICJJTVBPUlQiCistICh2b2lkKSBtSU1QT1JUCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElNUE9SVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpuYW1lPW5pbDsKKworICAgICAgICAvLyBGdXp6eS5nOjU6MjogKCAnaW1wb3J0JyBXUyBuYW1lPSBRSURTdGFyICggV1MgKT8gJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIEZ1enp5Lmc6NTo0OiAnaW1wb3J0JyBXUyBuYW1lPSBRSURTdGFyICggV1MgKT8gJzsnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaW1wb3J0Il07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICBOU0ludGVnZXIgbmFtZVN0YXJ0MzEgPSBpbnB1dC5pbmRleDsKKyAgICAgICAgW3NlbGYgbVFJRFN0YXJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKyAgICAgICAgbmFtZSA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjppbnB1dCBUeXBlOkFOVExSVG9rZW5UeXBlSW52YWxpZCBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDpuYW1lU3RhcnQzMSBTdG9wOmlucHV0LmluZGV4LTFdIHJldGFpbl07CisgICAgICAgIG5hbWUubGluZSA9IHNlbGYubGluZTsKKworCisgICAgICAgIC8vIEZ1enp5Lmc6NToyOTogKCBXUyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBMV8wID49ICdcdCcgJiYgTEExXzAgPD0gJ1xuJyl8fExBMV8wPT0nICcpICkgeworICAgICAgICAgICAgYWx0MT0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6NToyOTogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiSU1QT1JUIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlJFVFVSTiIKKy0gKHZvaWQpIG1SRVRVUk4KK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gUkVUVVJOOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIEZ1enp5Lmc6MTA6MjogKCAncmV0dXJuJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIEZ1enp5Lmc6MTA6NDogJ3JldHVybicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICc7JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAInJldHVybiJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTJfMD09JzsnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyPTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTJfMCA+PSAweDAwMDAgJiYgTEEyXzAgPD0gJzonKXx8KExBMl8wID49ICc8JyAmJiBMQTJfMCA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjEwOjM4OiAuIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoQW55XTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AyOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjogOworCisKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiUkVUVVJOIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkNMQVNTIgorLSAodm9pZCkgbUNMQVNTCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IENMQVNTOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKm5hbWU9bmlsOworCisgICAgICAgIC8vIEZ1enp5Lmc6MTQ6MjogKCAnY2xhc3MnIFdTIG5hbWU9IElEICggV1MgKT8gKCAnZXh0ZW5kcycgV1MgUUlEICggV1MgKT8gKT8gKCAnaW1wbGVtZW50cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAneycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gRnV6enkuZzoxNDo0OiAnY2xhc3MnIFdTIG5hbWU9IElEICggV1MgKT8gKCAnZXh0ZW5kcycgV1MgUUlEICggV1MgKT8gKT8gKCAnaW1wbGVtZW50cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAneycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJjbGFzcyJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgTlNJbnRlZ2VyIG5hbWVTdGFydDgxID0gaW5wdXQuaW5kZXg7CisgICAgICAgIFtzZWxmIG1JRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworICAgICAgICBuYW1lID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOmlucHV0IFR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkIENoYW5uZWw6QU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0IFN0YXJ0Om5hbWVTdGFydDgxIFN0b3A6aW5wdXQuaW5kZXgtMV0gcmV0YWluXTsKKyAgICAgICAgbmFtZS5saW5lID0gc2VsZi5saW5lOworCisKKyAgICAgICAgLy8gRnV6enkuZzoxNDoyMzogKCBXUyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0Mz0yOworICAgICAgICBOU0ludGVnZXIgTEEzXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBM18wID49ICdcdCcgJiYgTEEzXzAgPD0gJ1xuJyl8fExBM18wPT0nICcpICkgeworICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MTQ6MjM6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIC8vIEZ1enp5Lmc6MTQ6Mjc6ICggJ2V4dGVuZHMnIFdTIFFJRCAoIFdTICk/ICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQ1PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTVfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTVfMD09J2UnKSApIHsKKyAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjE0OjI4OiAnZXh0ZW5kcycgV1MgUUlEICggV1MgKT8gLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiZXh0ZW5kcyJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoxNDo0NTogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ0PTI7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBNF8wID49ICdcdCcgJiYgTEE0XzAgPD0gJ1xuJyl8fExBNF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjE0OjQ1OiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gRnV6enkuZzoxNTozOiAoICdpbXBsZW1lbnRzJyBXUyBRSUQgKCBXUyApPyAoICcsJyAoIFdTICk/IFFJRCAoIFdTICk/ICkqICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQxMD0yOworICAgICAgICBOU0ludGVnZXIgTEExMF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBMTBfMD09J2knKSApIHsKKyAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MTU6NDogJ2ltcGxlbWVudHMnIFdTIFFJRCAoIFdTICk/ICggJywnICggV1MgKT8gUUlEICggV1MgKT8gKSogLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaW1wbGVtZW50cyJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoxNToyNDogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ2PTI7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNl8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBNl8wID49ICdcdCcgJiYgTEE2XzAgPD0gJ1xuJyl8fExBNl8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjE1OjI0OiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ5PTI7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTlfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE5XzA9PScsJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MTU6Mjk6ICcsJyAoIFdTICk/IFFJRCAoIFdTICk/IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaENoYXI6JywnXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjE1OjMzOiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDc9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE3XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE3XzAgPj0gJ1x0JyAmJiBMQTdfMCA8PSAnXG4nKXx8TEE3XzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MTU6MzM6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoxNTo0MTogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBOF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBOF8wID49ICdcdCcgJiYgTEE4XzAgPD0gJ1xuJyl8fExBOF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjE1OjQxOiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICAgICAgICAgIGxvb3A5OiA7CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J3snXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKyAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMSApIHsKKyAgICAgICAgICAgIE5TTG9nKEAiZm91bmQgY2xhc3MgJUAiLCAobmFtZSE9bmlsP25hbWUudGV4dDpuaWwpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJDTEFTUyIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJNRVRIT0QiCistICh2b2lkKSBtTUVUSE9ECit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IE1FVEhPRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpuYW1lPW5pbDsKKworICAgICAgICAvLyBGdXp6eS5nOjIwOjU6ICggVFlQRSBXUyBuYW1lPSBJRCAoIFdTICk/ICcoJyAoIEFSRyAoIFdTICk/ICggJywnICggV1MgKT8gQVJHICggV1MgKT8gKSogKT8gJyknICggV1MgKT8gKCAndGhyb3dzJyBXUyBRSUQgKCBXUyApPyAoICcsJyAoIFdTICk/IFFJRCAoIFdTICk/ICkqICk/ICd7JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjIwOjk6IFRZUEUgV1MgbmFtZT0gSUQgKCBXUyApPyAnKCcgKCBBUkcgKCBXUyApPyAoICcsJyAoIFdTICk/IEFSRyAoIFdTICk/ICkqICk/ICcpJyAoIFdTICk/ICggJ3Rocm93cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAneycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbVRZUEVdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgTlNJbnRlZ2VyIG5hbWVTdGFydDE1OCA9IGlucHV0LmluZGV4OworICAgICAgICBbc2VsZiBtSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKyAgICAgICAgbmFtZSA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjppbnB1dCBUeXBlOkFOVExSVG9rZW5UeXBlSW52YWxpZCBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDpuYW1lU3RhcnQxNTggU3RvcDppbnB1dC5pbmRleC0xXSByZXRhaW5dOworICAgICAgICBuYW1lLmxpbmUgPSBzZWxmLmxpbmU7CisKKworICAgICAgICAvLyBGdXp6eS5nOjIwOjI1OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQxMT0yOworICAgICAgICBOU0ludGVnZXIgTEExMV8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKChMQTExXzAgPj0gJ1x0JyAmJiBMQTExXzAgPD0gJ1xuJyl8fExBMTFfMD09JyAnKSApIHsKKyAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQxMSkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjA6MjU6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKCddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICAvLyBGdXp6eS5nOjIwOjMzOiAoIEFSRyAoIFdTICk/ICggJywnICggV1MgKT8gQVJHICggV1MgKT8gKSogKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDE2PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTE2XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBMTZfMCA+PSAnQScgJiYgTEExNl8wIDw9ICdaJyl8fExBMTZfMD09J18nfHwoTEExNl8wID49ICdhJyAmJiBMQTE2XzAgPD0gJ3onKSkgKSB7CisgICAgICAgICAgICBhbHQxNj0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MTYpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIwOjM1OiBBUkcgKCBXUyApPyAoICcsJyAoIFdTICk/IEFSRyAoIFdTICk/ICkqIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtQVJHXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjA6Mzk6ICggV1MgKT8gLy8gYmxvY2sKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0MTI9MjsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEExMl8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTJfMCA+PSAnXHQnICYmIExBMTJfMCA8PSAnXG4nKXx8TEExMl8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjA6Mzk6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE1PTI7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTE1XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTVfMD09JywnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIwOjQ0OiAnLCcgKCBXUyApPyBBUkcgKCBXUyApPyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicsJ107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoyMDo0ODogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxMz0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTEzXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEExM18wID49ICdcdCcgJiYgTEExM18wIDw9ICdcbicpfHxMQTEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoyMDo0ODogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbUFSR107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIwOjU2OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMTRfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTE0XzAgPj0gJ1x0JyAmJiBMQTE0XzAgPD0gJ1xuJyl8fExBMTRfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIwOjU2OiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgICAgICAgICBsb29wMTU6IDsKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKSddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICAvLyBGdXp6eS5nOjIwOjY5OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQxNz0yOworICAgICAgICBOU0ludGVnZXIgTEExN18wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKChMQTE3XzAgPj0gJ1x0JyAmJiBMQTE3XzAgPD0gJ1xuJyl8fExBMTdfMD09JyAnKSApIHsKKyAgICAgICAgICAgIGFsdDE3PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjA6Njk6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIC8vIEZ1enp5Lmc6MjE6ODogKCAndGhyb3dzJyBXUyBRSUQgKCBXUyApPyAoICcsJyAoIFdTICk/IFFJRCAoIFdTICk/ICkqICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyMj0yOworICAgICAgICBOU0ludGVnZXIgTEEyMl8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBMjJfMD09J3QnKSApIHsKKyAgICAgICAgICAgIGFsdDIyPTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQyMikgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjE6OTogJ3Rocm93cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJ0aHJvd3MiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICBbc2VsZiBtUUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjE6MjU6ICggV1MgKT8gLy8gYmxvY2sKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0MTg9MjsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEExOF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMThfMCA+PSAnXHQnICYmIExBMThfMCA8PSAnXG4nKXx8TEExOF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MjE6MjU6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDIxPTI7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTIxXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjFfMD09JywnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDIxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIxOjMwOiAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicsJ107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoyMTozNDogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxOT0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTE5XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEExOV8wID49ICdcdCcgJiYgTEExOV8wIDw9ICdcbicpfHxMQTE5XzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE5PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzoyMTozNDogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVFJRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIxOjQyOiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDIwPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMjBfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTIwXzAgPj0gJ1x0JyAmJiBMQTIwXzAgPD0gJ1xuJyl8fExBMjBfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjA9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjIxOjQyOiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDIxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgICAgICAgICBsb29wMjE6IDsKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjoneyddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAxICkgeworICAgICAgICAgICAgTlNMb2coQCJmb3VuZCBtZXRob2QgJUAiLCAobmFtZSE9bmlsP25hbWUudGV4dDpuaWwpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJNRVRIT0QiICovCisKKy8vICRBTlRMUiBzdGFydCAiRklFTEQiCistICh2b2lkKSBtRklFTEQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gRklFTEQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqbmFtZT1uaWw7CisKKyAgICAgICAgLy8gRnV6enkuZzoyNjo1OiAoIFRZUEUgV1MgbmFtZT0gSUQgKCAnW10nICk/ICggV1MgKT8gKCAnOycgfCAnPScgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjI2Ojk6IFRZUEUgV1MgbmFtZT0gSUQgKCAnW10nICk/ICggV1MgKT8gKCAnOycgfCAnPScgKSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtVFlQRV07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICBOU0ludGVnZXIgbmFtZVN0YXJ0MjYxID0gaW5wdXQuaW5kZXg7CisgICAgICAgIFtzZWxmIG1JRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworICAgICAgICBuYW1lID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOmlucHV0IFR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkIENoYW5uZWw6QU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0IFN0YXJ0Om5hbWVTdGFydDI2MSBTdG9wOmlucHV0LmluZGV4LTFdIHJldGFpbl07CisgICAgICAgIG5hbWUubGluZSA9IHNlbGYubGluZTsKKworCisgICAgICAgIC8vIEZ1enp5Lmc6MjY6MjU6ICggJ1tdJyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MjM9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMjNfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTIzXzA9PSdbJykgKSB7CisgICAgICAgICAgICBhbHQyMz0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MjMpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjI2OjI1OiAnW10nIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIltdIl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gRnV6enkuZzoyNjozMTogKCBXUyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MjQ9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMjRfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoICgoTEEyNF8wID49ICdcdCcgJiYgTEEyNF8wIDw9ICdcbicpfHxMQTI0XzA9PScgJykgKSB7CisgICAgICAgICAgICBhbHQyND0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MjQpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjI2OjMxOiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKworICAgICAgICBpZiAoW2lucHV0IExBOjFdID09ICc7J3x8W2lucHV0IExBOjFdID09ICc9JykgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gTk87CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsgc3RhdGUuZmFpbGVkID0gWUVTOyByZXR1cm4gOyB9CisKKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICB9CisKKworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAxICkgeworICAgICAgICAgICAgTlNMb2coQCJmb3VuZCB2YXIgJUAiLCAobmFtZSE9bmlsP25hbWUudGV4dDpuaWwpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJGSUVMRCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJTVEFUIgorLSAodm9pZCkgbVNUQVQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gU1RBVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBGdXp6eS5nOjMwOjU6ICggKCAnaWYnIHwgJ3doaWxlJyB8ICdzd2l0Y2gnIHwgJ2ZvcicgKSAoIFdTICk/ICcoJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjMwOjc6ICggJ2lmJyB8ICd3aGlsZScgfCAnc3dpdGNoJyB8ICdmb3InICkgKCBXUyApPyAnKCcgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gRnV6enkuZzozMDo3OiAoICdpZicgfCAnd2hpbGUnIHwgJ3N3aXRjaCcgfCAnZm9yJyApIC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyNT00OworICAgICAgICB1bmljaGFyIGNoYXJMQTI1ID0gW2lucHV0IExBOjFdOworICAgICAgICBzd2l0Y2ggKGNoYXJMQTI1KSB7CisgICAgICAgICAgICBjYXNlICdpJzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyNT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3cnOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MjU9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdmJzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyNT00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorCisgICAgICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjI1IHN0YXRlOjAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIG52YWUuYyA9IGNoYXJMQTI1OworICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0MjUpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjMwOjg6ICdpZicgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaWYiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjMwOjEzOiAnd2hpbGUnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIndoaWxlIl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAgICAgLy8gRnV6enkuZzozMDoyMTogJ3N3aXRjaCcgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAic3dpdGNoIl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAgICAgLy8gRnV6enkuZzozMDozMDogJ2ZvcicgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiZm9yIl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gRnV6enkuZzozMDozNzogKCBXUyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MjY9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMjZfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoICgoTEEyNl8wID49ICdcdCcgJiYgTEEyNl8wIDw9ICdcbicpfHxMQTI2XzA9PScgJykgKSB7CisgICAgICAgICAgICBhbHQyNj0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MjYpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjMwOjM3OiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JygnXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJTVEFUIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkNBTEwiCistICh2b2lkKSBtQ0FMTAoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBDQUxMOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKm5hbWU9bmlsOworCisgICAgICAgIC8vIEZ1enp5Lmc6MzM6NTogKG5hbWU9IFFJRCAoIFdTICk/ICcoJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjMzOjk6IG5hbWU9IFFJRCAoIFdTICk/ICcoJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBOU0ludGVnZXIgbmFtZVN0YXJ0MzI2ID0gaW5wdXQuaW5kZXg7CisgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKyAgICAgICAgbmFtZSA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjppbnB1dCBUeXBlOkFOVExSVG9rZW5UeXBlSW52YWxpZCBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDpuYW1lU3RhcnQzMjYgU3RvcDppbnB1dC5pbmRleC0xXSByZXRhaW5dOworICAgICAgICBuYW1lLmxpbmUgPSBzZWxmLmxpbmU7CisKKworICAgICAgICAvLyBGdXp6eS5nOjMzOjE4OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyNz0yOworICAgICAgICBOU0ludGVnZXIgTEEyN18wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKChMQTI3XzAgPj0gJ1x0JyAmJiBMQTI3XzAgPD0gJ1xuJyl8fExBMjdfMD09JyAnKSApIHsKKyAgICAgICAgICAgIGFsdDI3PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQyNykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6MzM6MTg6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKCddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAxICkgeworICAgICAgICAgICAgLyppZ25vcmUgaWYgdGhpcy9zdXBlciAqLyBOU0xvZyhAImZvdW5kIGNhbGwgJUAiLChuYW1lIT1uaWw/bmFtZS50ZXh0Om5pbCkpOworICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIkNBTEwiICovCisKKy8vICRBTlRMUiBzdGFydCAiQ09NTUVOVCIKKy0gKHZvaWQpIG1DT01NRU5UCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IENPTU1FTlQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gRnV6enkuZzozODo1OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gRnV6enkuZzozODo5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiLyoiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mjg9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTI4XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTI4XzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMjhfMSA9IFtpbnB1dCBMQToyXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTI4XzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI4PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjhfMSA+PSAweDAwMDAgJiYgTEEyOF8xIDw9ICcuJyl8fChMQTI4XzEgPj0gJzAnICYmIExBMjhfMSA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mjg9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyOF8wID49IDB4MDAwMCAmJiBMQTI4XzAgPD0gJyknKXx8KExBMjhfMCA+PSAnKycgJiYgTEEyOF8wIDw9IDB4RkZGRikpICkgeworICAgICAgICAgICAgICAgIGFsdDI4PTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQyOCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzozODo0MTogLiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaEFueV07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMjg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AyODogOworCisKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCIqLyJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDEgKSB7CisgICAgICAgICAgICBOU0xvZyhAImZvdW5kIGNvbW1lbnQgJUAiLCBbc2VsZiB0ZXh0XSk7CisgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiQ09NTUVOVCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJTTF9DT01NRU5UIgorLSAodm9pZCkgbVNMX0NPTU1FTlQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gU0xfQ09NTUVOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBGdXp6eS5nOjQzOjU6ICggJy8vJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJ1xcbicgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gRnV6enkuZzo0Mzo5OiAnLy8nICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnXFxuJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIi8vIl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDI5PTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyOV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEEyOV8wPT0nXG4nKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyOT0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyOV8wID49IDB4MDAwMCAmJiBMQTI5XzAgPD0gJ1x0Jyl8fChMQTI5XzAgPj0gMHgwMDBCICYmIExBMjlfMCA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyOT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6NDM6NDE6IC4gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hBbnldOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI5OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjk6IDsKKworCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonXG4nXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKyAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMSApIHsKKyAgICAgICAgICAgIE5TTG9nKEAiZm91bmQgLy8gY29tbWVudCAlQCIsIFtzZWxmIHRleHRdKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJTTF9DT01NRU5UIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlNUUklORyIKKy0gKHZvaWQpIG1TVFJJTkcKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gU1RSSU5HOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIEZ1enp5Lmc6NDg6MjogKCAnXCInICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogRVNDIHwgLiApKiAnXCInICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIEZ1enp5Lmc6NDg6NDogJ1wiJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IEVTQyB8IC4gKSogJ1wiJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JyInXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDMwPTM7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzMF8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEEzMF8wPT0nIicpICkgeworICAgICAgICAgICAgICAgIGFsdDMwPTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMzBfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzBfMiA9IFtpbnB1dCBMQToyXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTMwXzI9PSciJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMwPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMF8yPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzA9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMwXzI9PSdcJycpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzMD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTMwXzIgPj0gMHgwMDAwICYmIExBMzBfMiA8PSAnIScpfHwoTEEzMF8yID49ICcjJyAmJiBMQTMwXzIgPD0gJyYnKXx8KExBMzBfMiA+PSAnKCcgJiYgTEEzMF8yIDw9ICdbJyl8fChMQTMwXzIgPj0gJ10nICYmIExBMzBfMiA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzA9MjsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEzMF8wID49IDB4MDAwMCAmJiBMQTMwXzAgPD0gJyEnKXx8KExBMzBfMCA+PSAnIycgJiYgTEEzMF8wIDw9ICdbJyl8fChMQTMwXzAgPj0gJ10nICYmIExBMzBfMCA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMD0yOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6NDg6MzQ6IEVTQyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtRVNDXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzo0ODo0MDogLiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaEFueV07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzMDogOworCisKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOiciJ107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiU1RSSU5HIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkNIQVIiCistICh2b2lkKSBtQ0hBUgoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBDSEFSOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIEZ1enp5Lmc6NTI6MjogKCAnXFwnJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IEVTQyB8IC4gKSogJ1xcJycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gRnV6enkuZzo1Mjo0OiAnXFwnJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IEVTQyB8IC4gKSogJ1xcJycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOidcJyddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MzE9MzsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTMxXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTMxXzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgIGFsdDMxPTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMzFfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzFfMiA9IFtpbnB1dCBMQToyXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTMxXzI9PSdcJycpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzMT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMzFfMj09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV8yPT0nIicpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzMT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTMxXzIgPj0gMHgwMDAwICYmIExBMzFfMiA8PSAnIScpfHwoTEEzMV8yID49ICcjJyAmJiBMQTMxXzIgPD0gJyYnKXx8KExBMzFfMiA+PSAnKCcgJiYgTEEzMV8yIDw9ICdbJyl8fChMQTMxXzIgPj0gJ10nICYmIExBMzFfMiA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzE9MjsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEzMV8wID49IDB4MDAwMCAmJiBMQTMxXzAgPD0gJyYnKXx8KExBMzFfMCA+PSAnKCcgJiYgTEEzMV8wIDw9ICdbJyl8fChMQTMxXzAgPj0gJ10nICYmIExBMzFfMCA8PSAweEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMT0yOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6NTI6MzU6IEVTQyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtRVNDXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzo1Mjo0MTogLiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaEFueV07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzMTogOworCisKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOidcJyddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIkNIQVIiICovCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gRnV6enkuZzo1NTo1OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxuJyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjU1Ojk6ICggJyAnIHwgJ1xcdCcgfCAnXFxuJyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyBGdXp6eS5nOjU1Ojk6ICggJyAnIHwgJ1xcdCcgfCAnXFxuJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MzIgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MzIgPSAyOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzJfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTMyXzAgPj0gJ1x0JyAmJiBMQTMyXzAgPD0gJ1xuJyl8fExBMzJfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIEZ1enp5Lmc6IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnXHQnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdcbicpKXx8W2lucHV0IExBOjFdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gTk87CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsgc3RhdGUuZmFpbGVkID0gWUVTOyByZXR1cm4gOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MzIgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6MzJdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MzIrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDMyOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIldTIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlFJRCIKKy0gKHZvaWQpIG1RSUQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gRnV6enkuZzo1OTo1OiAoIElEICggJy4nIElEICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIEZ1enp5Lmc6NTk6NzogSUQgKCAnLicgSUQgKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MzM9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTMzXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTMzXzA9PScuJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MzM9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjU5OjExOiAnLicgSUQgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicuJ107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1JRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDMzOiA7CisKKworICAgICAgICB9CisKKworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlFJRCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJRSURTdGFyIgorLSAodm9pZCkgbVFJRFN0YXIKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gRnV6enkuZzo2ODoyOiAoIElEICggJy4nIElEICkqICggJy4qJyApPyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjY4OjQ6IElEICggJy4nIElEICkqICggJy4qJyApPyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzND0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzRfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBMzRfMD09Jy4nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzNF8xID0gW2lucHV0IExBOjJdOworICAgICAgICAgICAgICAgIGlmICggKChMQTM0XzEgPj0gJ0EnICYmIExBMzRfMSA8PSAnWicpfHxMQTM0XzE9PSdfJ3x8KExBMzRfMSA+PSAnYScgJiYgTEEzNF8xIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzND0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzo2ODo4OiAnLicgSUQgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicuJ107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1JRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDM0OiA7CisKKworICAgICAgICAvLyBGdXp6eS5nOjY4OjE3OiAoICcuKicgKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDM1PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTM1XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoTEEzNV8wPT0nLicpICkgeworICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDM1KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gRnV6enkuZzo2ODoxNzogJy4qJyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCIuKiJdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiUUlEU3RhciIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUWVBFIgorLSAodm9pZCkgbVRZUEUKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gRnV6enkuZzo3Mjo1OiAoIFFJRCAoICdbXScgKT8gKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gRnV6enkuZzo3Mjo5OiBRSUQgKCAnW10nICk/IC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIC8vIEZ1enp5Lmc6NzI6MTM6ICggJ1tdJyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MzY9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMzZfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTM2XzA9PSdbJykgKSB7CisgICAgICAgICAgICBhbHQzNj0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MzYpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBGdXp6eS5nOjcyOjEzOiAnW10nIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIltdIl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUWVBFIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkFSRyIKKy0gKHZvaWQpIG1BUkcKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gRnV6enkuZzo3Njo1OiAoIFRZUEUgV1MgSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gRnV6enkuZzo3Njo5OiBUWVBFIFdTIElEIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1UWVBFXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgIFtzZWxmIG1JRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBteSBzdHVmZiAqLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJBUkciICovCisKKy8vICRBTlRMUiBzdGFydCAiSUQiCistICh2b2lkKSBtSUQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gRnV6enkuZzo4MDo1OiAoICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nIHwgJzAnIC4uICc5JyApKiApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBGdXp6eS5nOjgwOjk6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nIHwgJzAnIC4uICc5JyApKiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IE5POworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorCisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDM3PTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzN18wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBMzdfMCA+PSAnMCcgJiYgTEEzN18wIDw9ICc5Jyl8fChMQTM3XzAgPj0gJ0EnICYmIExBMzdfMCA8PSAnWicpfHxMQTM3XzA9PSdfJ3x8KExBMzdfMCA+PSAnYScgJiYgTEEzN18wIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgIGFsdDM3PTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRnV6enkuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IE5POworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDM3OiA7CisKKworICAgICAgICB9CisKKworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIG15IHN0dWZmICovCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIklEIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkVTQyIKKy0gKHZvaWQpIG1FU0MKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gRnV6enkuZzo4NDo1OiAoICdcXFxcJyAoICdcIicgfCAnXFwnJyB8ICdcXFxcJyApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIEZ1enp5Lmc6ODQ6NzogJ1xcXFwnICggJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOidcXCddOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworICAgICAgICBpZiAoW2lucHV0IExBOjFdID09ICciJ3x8W2lucHV0IExBOjFdID09ICdcJyd8fFtpbnB1dCBMQToxXSA9PSAnXFwnKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICBzdGF0ZS5mYWlsZWQgPSBOTzsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKworICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgIH0KKworCisgICAgICAgIH0KKworCisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogbXkgc3R1ZmYgKi8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiRVNDIiAqLworCistICh2b2lkKSBtVG9rZW5zCit7CisgICAgLy8gRnV6enkuZzoxOjM5OiAoIElNUE9SVCB8IFJFVFVSTiB8IENMQVNTIHwgTUVUSE9EIHwgRklFTEQgfCBTVEFUIHwgQ0FMTCB8IENPTU1FTlQgfCBTTF9DT01NRU5UIHwgU1RSSU5HIHwgQ0hBUiB8IFdTICkgLy9ydWxlYmxvY2sKKyAgICBOU0ludGVnZXIgYWx0Mzg9MTI7CisgICAgdW5pY2hhciBjaGFyTEEzOCA9IFtpbnB1dCBMQToxXTsKKyAgICBzd2l0Y2ggKGNoYXJMQTM4KSB7CisgICAgICAgIGNhc2UgJ2knOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF8xID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDFfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ0X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNV9GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD01OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDZfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9NjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ3X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorCisgICAgICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjozOCBzdGF0ZToxIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgbnZhZS5jID0gTEEzOF8xOworICAgICAgICAgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncic6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTM4XzcgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkMl9GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDRfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD03OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKworICAgICAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246Mzggc3RhdGU6NyBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgIG52YWUuYyA9IExBMzhfNzsKKyAgICAgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF85ID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDNfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ0X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNV9GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD01OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDdfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9NzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsgc3RhdGUuZmFpbGVkID0gWUVTOyByZXR1cm4gOyB9CisKKyAgICAgICAgICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjM4IHN0YXRlOjkgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICBudmFlLmMgPSBMQTM4Xzk7CisgICAgICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzogOworICAgICAgICBjYXNlICdzJzogOworICAgICAgICBjYXNlICd3JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzhfMTEgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNF9GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD00OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDVfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD03OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKworICAgICAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246Mzggc3RhdGU6MTEgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICBudmFlLmMgPSBMQTM4XzExOworICAgICAgICAgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnQSc6IDsKKyAgICAgICAgY2FzZSAnQic6IDsKKyAgICAgICAgY2FzZSAnQyc6IDsKKyAgICAgICAgY2FzZSAnRCc6IDsKKyAgICAgICAgY2FzZSAnRSc6IDsKKyAgICAgICAgY2FzZSAnRic6IDsKKyAgICAgICAgY2FzZSAnRyc6IDsKKyAgICAgICAgY2FzZSAnSCc6IDsKKyAgICAgICAgY2FzZSAnSSc6IDsKKyAgICAgICAgY2FzZSAnSic6IDsKKyAgICAgICAgY2FzZSAnSyc6IDsKKyAgICAgICAgY2FzZSAnTCc6IDsKKyAgICAgICAgY2FzZSAnTSc6IDsKKyAgICAgICAgY2FzZSAnTic6IDsKKyAgICAgICAgY2FzZSAnTyc6IDsKKyAgICAgICAgY2FzZSAnUCc6IDsKKyAgICAgICAgY2FzZSAnUSc6IDsKKyAgICAgICAgY2FzZSAnUic6IDsKKyAgICAgICAgY2FzZSAnUyc6IDsKKyAgICAgICAgY2FzZSAnVCc6IDsKKyAgICAgICAgY2FzZSAnVSc6IDsKKyAgICAgICAgY2FzZSAnVic6IDsKKyAgICAgICAgY2FzZSAnVyc6IDsKKyAgICAgICAgY2FzZSAnWCc6IDsKKyAgICAgICAgY2FzZSAnWSc6IDsKKyAgICAgICAgY2FzZSAnWic6IDsKKyAgICAgICAgY2FzZSAnXyc6IDsKKyAgICAgICAgY2FzZSAnYSc6IDsKKyAgICAgICAgY2FzZSAnYic6IDsKKyAgICAgICAgY2FzZSAnZCc6IDsKKyAgICAgICAgY2FzZSAnZSc6IDsKKyAgICAgICAgY2FzZSAnZyc6IDsKKyAgICAgICAgY2FzZSAnaCc6IDsKKyAgICAgICAgY2FzZSAnaic6IDsKKyAgICAgICAgY2FzZSAnayc6IDsKKyAgICAgICAgY2FzZSAnbCc6IDsKKyAgICAgICAgY2FzZSAnbSc6IDsKKyAgICAgICAgY2FzZSAnbic6IDsKKyAgICAgICAgY2FzZSAnbyc6IDsKKyAgICAgICAgY2FzZSAncCc6IDsKKyAgICAgICAgY2FzZSAncSc6IDsKKyAgICAgICAgY2FzZSAndCc6IDsKKyAgICAgICAgY2FzZSAndSc6IDsKKyAgICAgICAgY2FzZSAndic6IDsKKyAgICAgICAgY2FzZSAneCc6IDsKKyAgICAgICAgY2FzZSAneSc6IDsKKyAgICAgICAgY2FzZSAneic6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTM4XzEyID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDRfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzOD03OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKworICAgICAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246Mzggc3RhdGU6MTIgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICBudmFlLmMgPSBMQTM4XzEyOworICAgICAgICAgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLyc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTM4XzEzID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDhfRnV6enlfZnJhZ21lbnQpXSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mzg9ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50KV0pICkgeworICAgICAgICAgICAgICAgIGFsdDM4PTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorCisgICAgICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjozOCBzdGF0ZToxMyBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgIG52YWUuYyA9IExBMzhfMTM7CisgICAgICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICciJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0Mzg9MTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXCcnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQzOD0xMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCc6IDsKKyAgICAgICAgY2FzZSAnXG4nOiA7CisgICAgICAgIGNhc2UgJyAnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQzOD0xMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogOworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorCisgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246Mzggc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICBudmFlLmMgPSBjaGFyTEEzODsKKyAgICAgICAgQHRocm93IG52YWU7CisKKyAgICB9CisKKyAgICBzd2l0Y2ggKGFsdDM4KSB7CisgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgIC8vIEZ1enp5Lmc6MTo0MTogSU1QT1JUIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUlNUE9SVF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6NDg6IFJFVFVSTiAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1SRVRVUk5dOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gRnV6enkuZzoxOjU1OiBDTEFTUyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1DTEFTU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6NjE6IE1FVEhPRCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1NRVRIT0RdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1IDogOworICAgICAgICAgICAgLy8gRnV6enkuZzoxOjY4OiBGSUVMRCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1GSUVMRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDYgOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6NzQ6IFNUQVQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtU1RBVF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDcgOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6Nzk6IENBTEwgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtQ0FMTF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDggOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6ODQ6IENPTU1FTlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtQ09NTUVOVF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDkgOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6OTI6IFNMX0NPTU1FTlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtU0xfQ09NTUVOVF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwIDogOworICAgICAgICAgICAgLy8gRnV6enkuZzoxOjEwMzogU1RSSU5HIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVNUUklOR107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExIDogOworICAgICAgICAgICAgLy8gRnV6enkuZzoxOjExMDogQ0hBUiAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1DSEFSXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTIgOiA7CisgICAgICAgICAgICAvLyBGdXp6eS5nOjE6MTE1OiBXUyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMV9GdXp6eV9mcmFnbWVudAorLSAodm9pZCkgc3lucHJlZDFfRnV6enlfZnJhZ21lbnQKK3sKKyAgICAvLyBGdXp6eS5nOjE6NDE6ICggSU1QT1JUICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgLy8gRnV6enkuZzoxOjQxOiBJTVBPUlQgLy8gYWx0CisgICAgeworICAgIFtzZWxmIG1JTVBPUlRdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgfQorCit9IC8vICRBTlRMUiBlbmQgc3lucHJlZDFfRnV6enlfZnJhZ21lbnQKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyX0Z1enp5X2ZyYWdtZW50CistICh2b2lkKSBzeW5wcmVkMl9GdXp6eV9mcmFnbWVudAoreworICAgIC8vIEZ1enp5Lmc6MTo0ODogKCBSRVRVUk4gKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyBGdXp6eS5nOjE6NDg6IFJFVFVSTiAvLyBhbHQKKyAgICB7CisgICAgW3NlbGYgbVJFVFVSTl07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICB9CisKK30gLy8gJEFOVExSIGVuZCBzeW5wcmVkMl9GdXp6eV9mcmFnbWVudAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDNfRnV6enlfZnJhZ21lbnQKKy0gKHZvaWQpIHN5bnByZWQzX0Z1enp5X2ZyYWdtZW50Cit7CisgICAgLy8gRnV6enkuZzoxOjU1OiAoIENMQVNTICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgLy8gRnV6enkuZzoxOjU1OiBDTEFTUyAvLyBhbHQKKyAgICB7CisgICAgW3NlbGYgbUNMQVNTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgIH0KKworfSAvLyAkQU5UTFIgZW5kIHN5bnByZWQzX0Z1enp5X2ZyYWdtZW50CisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNF9GdXp6eV9mcmFnbWVudAorLSAodm9pZCkgc3lucHJlZDRfRnV6enlfZnJhZ21lbnQKK3sKKyAgICAvLyBGdXp6eS5nOjE6NjE6ICggTUVUSE9EICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgLy8gRnV6enkuZzoxOjYxOiBNRVRIT0QgLy8gYWx0CisgICAgeworICAgIFtzZWxmIG1NRVRIT0RdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgfQorCit9IC8vICRBTlRMUiBlbmQgc3lucHJlZDRfRnV6enlfZnJhZ21lbnQKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50CistICh2b2lkKSBzeW5wcmVkNV9GdXp6eV9mcmFnbWVudAoreworICAgIC8vIEZ1enp5Lmc6MTo2ODogKCBGSUVMRCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgIC8vIEZ1enp5Lmc6MTo2ODogRklFTEQgLy8gYWx0CisgICAgeworICAgIFtzZWxmIG1GSUVMRF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICB9CisKK30gLy8gJEFOVExSIGVuZCBzeW5wcmVkNV9GdXp6eV9mcmFnbWVudAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDZfRnV6enlfZnJhZ21lbnQKKy0gKHZvaWQpIHN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50Cit7CisgICAgLy8gRnV6enkuZzoxOjc0OiAoIFNUQVQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyBGdXp6eS5nOjE6NzQ6IFNUQVQgLy8gYWx0CisgICAgeworICAgIFtzZWxmIG1TVEFUXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgIH0KKworfSAvLyAkQU5UTFIgZW5kIHN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50CisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkN19GdXp6eV9mcmFnbWVudAorLSAodm9pZCkgc3lucHJlZDdfRnV6enlfZnJhZ21lbnQKK3sKKyAgICAvLyBGdXp6eS5nOjE6Nzk6ICggQ0FMTCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgIC8vIEZ1enp5Lmc6MTo3OTogQ0FMTCAvLyBhbHQKKyAgICB7CisgICAgW3NlbGYgbUNBTExdOyBpZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA7CisKKworCisgICAgfQorCit9IC8vICRBTlRMUiBlbmQgc3lucHJlZDdfRnV6enlfZnJhZ21lbnQKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ4X0Z1enp5X2ZyYWdtZW50CistICh2b2lkKSBzeW5wcmVkOF9GdXp6eV9mcmFnbWVudAoreworICAgIC8vIEZ1enp5Lmc6MTo4NDogKCBDT01NRU5UICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgLy8gRnV6enkuZzoxOjg0OiBDT01NRU5UIC8vIGFsdAorICAgIHsKKyAgICBbc2VsZiBtQ09NTUVOVF07IGlmICggc3RhdGUuZmFpbGVkICkgcmV0dXJuIDsKKworCisKKyAgICB9CisKK30gLy8gJEFOVExSIGVuZCBzeW5wcmVkOF9GdXp6eV9mcmFnbWVudAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDlfRnV6enlfZnJhZ21lbnQKKy0gKHZvaWQpIHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50Cit7CisgICAgLy8gRnV6enkuZzoxOjkyOiAoIFNMX0NPTU1FTlQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyBGdXp6eS5nOjE6OTI6IFNMX0NPTU1FTlQgLy8gYWx0CisgICAgeworICAgIFtzZWxmIG1TTF9DT01NRU5UXTsgaWYgKCBzdGF0ZS5mYWlsZWQgKSByZXR1cm4gOworCisKKworICAgIH0KKworfSAvLyAkQU5UTFIgZW5kIHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50CisKK0BlbmQgLyogZW5kIG9mIEZ1enp5IGltcGxlbWVudGF0aW9uIGxpbmUgMzk3ICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkudG9rZW5zIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS50b2tlbnMKQEAgLTAsMCArMSwxOCBAQAorQVJHPTQKK0NBTEw9NQorQ0hBUj02CitDTEFTUz03CitDT01NRU5UPTgKK0VTQz05CitGSUVMRD0xMAorSUQ9MTEKK0lNUE9SVD0xMgorTUVUSE9EPTEzCitRSUQ9MTQKK1FJRFN0YXI9MTUKK1JFVFVSTj0xNgorU0xfQ09NTUVOVD0xNworU1RBVD0xOAorU1RSSU5HPTE5CitUWVBFPTIwCitXUz0yMQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enlMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enlMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjI4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eUxleGVyLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gJEFOVExSIDMuMiBBdWcgMjQsIDIwMTAgMTA6NDU6NTcgRnV6enkuZyAyMDEwLTA4LTI0IDEzOjUzOjQwCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJhbnRscjMuaCIKKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBTdGFydCBjeWNsaWNERkFJbnRlcmZhY2UgKi8KKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGludGVyZmFjZSBzdGFydCBERkEzOAorQGludGVyZmFjZSBERkEzOCA6IEFOVExSREZBIHsKK30KKysgbmV3REZBMzhXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKXRoZVJlY29nbml6ZXI7CistIGluaXRXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKXJlY29nbml6ZXI7CitAZW5kIC8qIGVuZCBvZiBERkEzOCBpbnRlcmZhY2UgICovCisKKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGludGVyZmFjZSBlbmQgREZBMzgKKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgU1RBVCAxNQorI2RlZmluZSBDTEFTUyAxMAorI2RlZmluZSBFU0MgMTkKKyNkZWZpbmUgQ0hBUiAyMQorI2RlZmluZSBJRCA4CisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBRSUQgOQorI2RlZmluZSBUWVBFIDExCisjZGVmaW5lIElNUE9SVCA2CisjZGVmaW5lIFdTIDQKKyNkZWZpbmUgQVJHIDEyCisjZGVmaW5lIFFJRFN0YXIgNQorI2RlZmluZSBTTF9DT01NRU5UIDE4CisjZGVmaW5lIFJFVFVSTiA3CisjZGVmaW5lIEZJRUxEIDE0CisjZGVmaW5lIENBTEwgMTYKKyNkZWZpbmUgQ09NTUVOVCAxNworI2RlZmluZSBNRVRIT0QgMTMKKyNkZWZpbmUgU1RSSU5HIDIwCitAaW50ZXJmYWNlIEZ1enp5IDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCitERkEzOCAqZGZhMzg7CitTRUwgc3lucHJlZDlfRnV6enlTZWxlY3RvcjsKK1NFTCBzeW5wcmVkN19GdXp6eVNlbGVjdG9yOworU0VMIHN5bnByZWQyX0Z1enp5U2VsZWN0b3I7CitTRUwgc3lucHJlZDRfRnV6enlTZWxlY3RvcjsKK1NFTCBzeW5wcmVkOF9GdXp6eVNlbGVjdG9yOworU0VMIHN5bnByZWQ2X0Z1enp5U2VsZWN0b3I7CitTRUwgc3lucHJlZDVfRnV6enlTZWxlY3RvcjsKK1NFTCBzeW5wcmVkM19GdXp6eVNlbGVjdG9yOworU0VMIHN5bnByZWQxX0Z1enp5U2VsZWN0b3I7CisvLyBzdGFydCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZW1WYXJzCit9CisrIChGdXp6eSAqKW5ld0Z1enp5V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKworLSAodm9pZCltSU1QT1JUOyAKKy0gKHZvaWQpbVJFVFVSTjsgCistICh2b2lkKW1DTEFTUzsgCistICh2b2lkKW1NRVRIT0Q7IAorLSAodm9pZCltRklFTEQ7IAorLSAodm9pZCltU1RBVDsgCistICh2b2lkKW1DQUxMOyAKKy0gKHZvaWQpbUNPTU1FTlQ7IAorLSAodm9pZCltU0xfQ09NTUVOVDsgCistICh2b2lkKW1TVFJJTkc7IAorLSAodm9pZCltQ0hBUjsgCistICh2b2lkKW1XUzsgCistICh2b2lkKW1RSUQ7IAorLSAodm9pZCltUUlEU3RhcjsgCistICh2b2lkKW1UWVBFOyAKKy0gKHZvaWQpbUFSRzsgCistICh2b2lkKW1JRDsgCistICh2b2lkKW1FU0M7IAorLSAodm9pZCltVG9rZW5zOyAKKy0gKHZvaWQpc3lucHJlZDFfRnV6enlfZnJhZ21lbnQ7IAorLSAodm9pZClzeW5wcmVkMl9GdXp6eV9mcmFnbWVudDsgCistICh2b2lkKXN5bnByZWQzX0Z1enp5X2ZyYWdtZW50OyAKKy0gKHZvaWQpc3lucHJlZDRfRnV6enlfZnJhZ21lbnQ7IAorLSAodm9pZClzeW5wcmVkNV9GdXp6eV9mcmFnbWVudDsgCistICh2b2lkKXN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50OyAKKy0gKHZvaWQpc3lucHJlZDdfRnV6enlfZnJhZ21lbnQ7IAorLSAodm9pZClzeW5wcmVkOF9GdXp6eV9mcmFnbWVudDsgCistICh2b2lkKXN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50OyAKKworQGVuZCAvKiBlbmQgb2YgRnV6enkgaW50ZXJmYWNlICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9hbnRscjMuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L2FudGxyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTYyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9hbnRscjMuaApAQCAtMCwwICsxLDc5IEBACisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VSZWNvZ25pemVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VTdGFjay5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQml0U2V0Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25FcnJvck5vZGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVG9rZW4uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJERkEuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWcuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdFdmVudFByb3h5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1BhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVycm9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYXN0UXVldWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaE1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJIYXNoUnVsZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJJbnRBcnJheS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJJbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGV4ZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGlua0Jhc2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTG9va2FoZWFkU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9kZU1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQdHJCdWZmZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlTWVtby5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bnRpbWVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyZWFtRW51bWVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJTdHJpbmdTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3ltYm9sU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblNvdXJjZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZUl0ZXJhdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaD4KKy8vI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKy8vI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmlxdWVJRE1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmg+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L2lucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWUxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9pbnB1dApAQCAtMCwwICsxLDEzIEBACitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKKworcHVibGljIGNsYXNzIE1haW4geworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCSAgICBmb3IgKGludCBpPTA7IGk8YXJncy5sZW5ndGg7IGkrKykgeworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzW2ldKTsKKwkJRnV6enlKYXZhIGxleCA9IG5ldyBGdXp6eUphdmEoaW5wdXQpOworCQlUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTsKKwkJdG9rZW5zLnRvU3RyaW5nKCk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKHRva2Vucyk7CisJICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9tYWluLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9tYWluLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5YTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L21haW4ubQpAQCAtMCwwICsxLDI2IEBACisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiRnV6enkuaCIKKyNpbXBvcnQgImFudGxyMy5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkKK3sKKyAgICBOU0Vycm9yICplcnJvcjsKKwlOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworCU5TU3RyaW5nICppbnB1dCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ29udGVudHNPZkZpbGU6QCIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9pbnB1dCIgIGVuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZyBlcnJvcjomZXJyb3JdOworCU5TTG9nKEAiJUAiLCBpbnB1dCk7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTppbnB1dF07CisJRnV6enkgKmxleCA9IFtGdXp6eSBuZXdGdXp6eVdpdGhDaGFyU3RyZWFtOnN0cmVhbV07CisJQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqdG9rZW5zID0gW0FOVExSQ29tbW9uVG9rZW5TdHJlYW0gbmV3QU5UTFJDb21tb25Ub2tlblN0cmVhbVdpdGhUb2tlblNvdXJjZTpsZXhdOworCU5TTG9nKCBbdG9rZW5zIHRvU3RyaW5nXSApOworCisJaWQ8QU5UTFJUb2tlbj4gY3VycmVudFRva2VuOworCXdoaWxlICgoY3VycmVudFRva2VuID0gW2xleCBuZXh0VG9rZW5dKSAmJiBbY3VycmVudFRva2VuIGdldFR5cGVdICE9IEFOVExSVG9rZW5UeXBlRU9GKSB7CisJCU5TTG9nKEAiIyMjICVAIiwgW2N1cnJlbnRUb2tlbiB0b1N0cmluZ10pOworCX0KKworCVtsZXggcmVsZWFzZV07CisJW3N0cmVhbSByZWxlYXNlXTsKKwkKKwlbcG9vbCByZWxlYXNlXTsKKwlyZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9vdXRwdXQxL0Z1enp5Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9vdXRwdXQxL0Z1enp5Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4YTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L291dHB1dDEvRnV6enkubQpAQCAtMCwwICsxLDIxNjIgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDMuMiBBdWcgMjAsIDIwMTAgMTM6Mzk6MzIKKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDEwLTA4LTIwIDEzOjQwOjE1CisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IEZ1enp5TGV4ZXIgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLiAKKyAqCisgKiBDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBKaW0gSWRsZSwgamltaXxoZXJlaXNhbmF0fGlkbGV8ZG90Z29lc2hlcmV8d3MuCisgKgorICoKKyovCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vICRBTlRMUiAzLjIgQXVnIDIwLCAyMDEwIDEzOjM5OjMyIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZyAyMDEwLTA4LTIwIDEzOjQwOjE1CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJGdXp6eS5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGltcGxlbWVudGF0aW9uIHN0YXJ0IERGQTM4CitAaW1wbGVtZW50YXRpb24gREZBMzgKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMzhfZW90WzE5XSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMzhfZW9mWzE5XSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTM4X21pblsxOV0gPQorICAgIHs5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTM4X21heFsxOV0gPQorICAgIHsxMjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEzOF9hY2NlcHRbMTldID0KKyAgICB7LTEsLTEsNCw1LDcsLTEsMiwtMSw4LDksLTEsMywtMSwxLDYsMTAsLTEsMTIsMTF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEzOF9zcGVjaWFsWzE5XSA9CisgICAgey0xLDAsLTEsLTEsLTEsMSwtMSwyLC0xLC0xLDMsLTEsNCwtMSwtMSwtMSw1LC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMzhfdHJhbnNpdGlvbltdID0ge307Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTM4X3RyYW5zaXRpb24wW10gPSB7MTcsIDE3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNywgLTEsIAorIDE1LCAtMSwgLTEsIC0xLCAtMSwgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA3LCAtMSwgLTEsIC0xLCAtMSwgCisgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIAorIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC0xLCAtMSwgLTEsIC0xLCAKKyAxLCAtMSwgMSwgMSwgMTAsIDEsIDEsIDE2LCAxLCAxLCAxMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgNSwgMTYsIDEsIAorIDEsIDEsIDE2LCAxLCAxLCAxfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMzhfdHJhbnNpdGlvbjFbXSA9IHstMX07CisKKworKyAoKSBuZXdERkEzOFdpdGhSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopYVJlY29nbml6ZXIKK3sKKyAgICByZXR1cm4gW1tbREZBMzggYWxsb2NdIGluaXRXaXRoUmVjb2duaXplcjphUmVjb2duaXplcl0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXRXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKSB0aGVSZWNvZ25pemVyCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoUmVjb2duaXplcjp0aGVSZWNvZ25pemVyXSkgIT0gbmlsKSB7CisgICAgICAgIGRlY2lzaW9uTnVtYmVyID0gMzg7CisgICAgICAgIGVvdCA9IGRmYTM4X2VvdDsKKyAgICAgICAgZW9mID0gZGZhMzhfZW9mOworICAgICAgICBtaW4gPSBkZmEzOF9taW47CisgICAgICAgIG1heCA9IGRmYTM4X21heDsKKyAgICAgICAgYWNjZXB0ID0gZGZhMzhfYWNjZXB0OworICAgICAgICBzcGVjaWFsID0gZGZhMzhfc3BlY2lhbDsKKyAgICAgICAgaWYgKCEodHJhbnNpdGlvbiA9IGNhbGxvYygxOSwgc2l6ZW9mKHZvaWQqKSkpKSB7CisgICAgICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gMTk7CisgICAgICAgIHRyYW5zaXRpb25bMF0gPSBkZmEzOF90cmFuc2l0aW9uMDsKKyAgICAgICAgdHJhbnNpdGlvblsxXSA9IGRmYTM4X3RyYW5zaXRpb24xOworICAgICAgICB0cmFuc2l0aW9uWzJdID0gZGZhMzhfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblszXSA9IGRmYTM4X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bNF0gPSBkZmEzOF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzVdID0gZGZhMzhfdHJhbnNpdGlvbjE7CisgICAgICAgIHRyYW5zaXRpb25bNl0gPSBkZmEzOF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzddID0gZGZhMzhfdHJhbnNpdGlvbjE7CisgICAgICAgIHRyYW5zaXRpb25bOF0gPSBkZmEzOF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzldID0gZGZhMzhfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblsxMF0gPSBkZmEzOF90cmFuc2l0aW9uMTsKKyAgICAgICAgdHJhbnNpdGlvblsxMV0gPSBkZmEzOF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzEyXSA9IGRmYTM4X3RyYW5zaXRpb24xOworICAgICAgICB0cmFuc2l0aW9uWzEzXSA9IGRmYTM4X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMTRdID0gZGZhMzhfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblsxNV0gPSBkZmEzOF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzE2XSA9IGRmYTM4X3RyYW5zaXRpb24xOworICAgICAgICB0cmFuc2l0aW9uWzE3XSA9IGRmYTM4X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMThdID0gZGZhMzhfdHJhbnNpdGlvbjsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIHN0YXJ0IGRmYS5zcGVjaWFsU3RhdGVTVHMgKi8KKy0gKE5TSW50ZWdlcikgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbjooTlNJbnRlZ2VyKXMgU3RyZWFtOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dAoreworICAgIGlkPEFOVExSSW50U3RyZWFtPiBpbnB1dCA9IGFuSW5wdXQ7CisgICAgc3dpdGNoIChzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwIDogOworICAgICAgICAgICAgICAgICAgICAvKiBjeWNsaWNERkFTdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF8xID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGluZGV4MzhfMSA9IFtpbnB1dCBnZXRJbmRleF07CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCByZXdpbmRdOworICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNF9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAyO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNV9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAzO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBzZWVrOmluZGV4MzhfMV07CisgICAgICAgICAgICAgICAgICAgIGlmICggcyA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvKiBjeWNsaWNERkFTdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF81ID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGluZGV4MzhfNSA9IFtpbnB1dCBnZXRJbmRleF07CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCByZXdpbmRdOworICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkMl9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA2O30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNF9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAyO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNV9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAzO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBzZWVrOmluZGV4MzhfNV07CisgICAgICAgICAgICAgICAgICAgIGlmICggcyA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgICAgICAvKiBjeWNsaWNERkFTdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF83ID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGluZGV4MzhfNyA9IFtpbnB1dCBnZXRJbmRleF07CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCByZXdpbmRdOworICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkOF9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA4O30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkOV9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA5O30KKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBzZWVrOmluZGV4MzhfN107CisgICAgICAgICAgICAgICAgICAgIGlmICggcyA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgICAgICAvKiBjeWNsaWNERkFTdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF8xMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBpbmRleDM4XzEwID0gW2lucHV0IGdldEluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgW2lucHV0IHJld2luZF07CisgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgLyogY3ljbGljREZBRWRnZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQzX0Z1enp5X2ZyYWdtZW50KV0pIHsgcyA9IDExO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNF9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAyO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkNV9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAzO30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBzZWVrOmluZGV4MzhfMTBdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHMgPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgICAgICAgICAgLyogY3ljbGljREZBU3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzhfMTIgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgaW5kZXgzOF8xMiA9IFtpbnB1dCBnZXRJbmRleF07CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCByZXdpbmRdOworICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkMV9GdXp6eV9mcmFnbWVudCldKSB7IHMgPSAxMzt9CisKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBjeWNsaWNERkFFZGdlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDRfRnV6enlfZnJhZ21lbnQpXSkgeyBzID0gMjt9CisKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBjeWNsaWNERkFFZGdlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDVfRnV6enlfZnJhZ21lbnQpXSkgeyBzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBjeWNsaWNERkFFZGdlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTpAc2VsZWN0b3Ioc3lucHJlZDZfRnV6enlfZnJhZ21lbnQpXSkgeyBzID0gMTQ7fQorCisgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogY3ljbGljREZBRWRnZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ3X0Z1enp5X2ZyYWdtZW50KV0pIHsgcyA9IDQ7fQorCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgW2lucHV0IHNlZWs6aW5kZXgzOF8xMl07CisgICAgICAgICAgICAgICAgICAgIGlmICggcyA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1IDogOworICAgICAgICAgICAgICAgICAgICAvKiBjeWNsaWNERkFTdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzOF8xNiA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBpbmRleDM4XzE2ID0gW2lucHV0IGdldEluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgW2lucHV0IHJld2luZF07CisgICAgICAgICAgICAgICAgICAgIHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgLyogY3ljbGljREZBRWRnZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ0X0Z1enp5X2ZyYWdtZW50KV0pIHsgcyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogY3ljbGljREZBRWRnZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50KV0pIHsgcyA9IDM7fQorCisgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogY3ljbGljREZBRWRnZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoW3NlbGYgZXZhbHVhdGVTeW50YWN0aWNQcmVkaWNhdGU6QHNlbGVjdG9yKHN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50KV0pIHsgcyA9IDE0O30KKworICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGN5Y2xpY0RGQUVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3RvcihzeW5wcmVkN19GdXp6eV9mcmFnbWVudCldKSB7IHMgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBzZWVrOmluZGV4MzhfMTZdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHMgPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIFtyZWNvZ25pemVyIGdldEJhY2t0cmFja2luZ0xldmVsXSA+IDAgKSB7IFtyZWNvZ25pemVyIHNldEZhaWxlZDpZRVNdOyByZXR1cm4gLTE7IH0KKyAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3QU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbjozOCBzdGF0ZTpzIHN0cmVhbTpbcmVjb2duaXplciBnZXRJbnB1dF1dOworICAgIC8qIFtzZWxmIGVycm9yOm52YWVdOyAqLyAKKyAgICBAdGhyb3cgbnZhZTsKK30KKworLyogZW5kIGRmYS5zcGVjaWFsU3RhdGVTVHMgKi8KKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBmcmVlKHRyYW5zaXRpb24pOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKyAgICByZXR1cm4gQCIxOjE6IFRva2VucyBvcHRpb25zIHtrPTE7IGJhY2t0cmFjaz10cnVlOyB9IDogKCBJTVBPUlQgfCBSRVRVUk4gfCBDTEFTUyB8IE1FVEhPRCB8IEZJRUxEIHwgU1RBVCB8IENBTEwgfCBDT01NRU5UIHwgU0xfQ09NTUVOVCB8IFNUUklORyB8IENIQVIgfCBXUyApOyI7Cit9CisKKworQGVuZAorI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gZW5kIERGQTM4CisKKworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzIQorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyovCitAaW1wbGVtZW50YXRpb24gRnV6enkgLy8gbGluZSAzMzAKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIi91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZyJdOworfQorCisrIChOU1N0cmluZyAqKSB0b2tlbk5hbWVGb3JUeXBlOihOU0ludGVnZXIpYVRva2VuVHlwZQoreworICAgIHJldHVybiBbW3NlbGYgZ2V0VG9rZW5OYW1lc10gb2JqZWN0QXRJbmRleDphVG9rZW5UeXBlXTsKK30KKworKyAoRnV6enkgKiluZXdGdXp6eTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbRnV6enkgYWxsb2NdIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0XTsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0IFN0YXRlOltBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjMwKzFdXSkgIT0gbmlsKSB7CisgICAgICAgIFNFTCBzeW5wcmVkOV9GdXp6eVNlbGVjdG9yID0gQHNlbGVjdG9yKHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50KTsKKworICAgICAgICBTRUwgc3lucHJlZDJfRnV6enlTZWxlY3RvciA9IEBzZWxlY3RvcihzeW5wcmVkMl9GdXp6eV9mcmFnbWVudCk7CisKKyAgICAgICAgU0VMIHN5bnByZWQ3X0Z1enp5U2VsZWN0b3IgPSBAc2VsZWN0b3Ioc3lucHJlZDdfRnV6enlfZnJhZ21lbnQpOworCisgICAgICAgIFNFTCBzeW5wcmVkNF9GdXp6eVNlbGVjdG9yID0gQHNlbGVjdG9yKHN5bnByZWQ0X0Z1enp5X2ZyYWdtZW50KTsKKworICAgICAgICBTRUwgc3lucHJlZDhfRnV6enlTZWxlY3RvciA9IEBzZWxlY3RvcihzeW5wcmVkOF9GdXp6eV9mcmFnbWVudCk7CisKKyAgICAgICAgU0VMIHN5bnByZWQ2X0Z1enp5U2VsZWN0b3IgPSBAc2VsZWN0b3Ioc3lucHJlZDZfRnV6enlfZnJhZ21lbnQpOworCisgICAgICAgIFNFTCBzeW5wcmVkNV9GdXp6eVNlbGVjdG9yID0gQHNlbGVjdG9yKHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50KTsKKworICAgICAgICBTRUwgc3lucHJlZDNfRnV6enlTZWxlY3RvciA9IEBzZWxlY3RvcihzeW5wcmVkM19GdXp6eV9mcmFnbWVudCk7CisKKyAgICAgICAgU0VMIHN5bnByZWQxX0Z1enp5U2VsZWN0b3IgPSBAc2VsZWN0b3Ioc3lucHJlZDFfRnV6enlfZnJhZ21lbnQpOworCisgICAgICAgIGRmYTM4ID0gW0RGQTM4IG5ld0RGQTM4V2l0aFJlY29nbml6ZXI6c2VsZl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW2RmYTM4IHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLy8gU3RhcnQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzCisvLyBzdGFydCBtZXRob2RzKCkKKworLSAoaWQ8QU5UTFJUb2tlbj4pIG5leHRUb2tlbgoreworICAgIHdoaWxlIChZRVMpIHsKKyAgICAgICAgaWYgKCBbaW5wdXQgTEE6MV0gPT0gQU5UTFJDaGFyU3RyZWFtRU9GICkgeworICAgICAgICAgICAgcmV0dXJuIFtBTlRMUkNvbW1vblRva2VuIGVvZlRva2VuXTsgLy8gc2hvdWxkIHJlYWxseSBiZSBhICtlb2ZUb2tlbiBjYWxsIGhlcmUgLT4gZ28gZmlndXJlCisgICAgICAgIH0KKyAgICAgICAgc3RhdGUudG9rZW4gPSBuaWw7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSBbaW5wdXQgZ2V0SW5kZXhdOworICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gW2lucHV0IGdldENoYXJQb3NpdGlvbkluTGluZV07CisgICAgICAgIHN0YXRlLnRva2VuU3RhcnRMaW5lID0gW2lucHV0IGdldExpbmVdOworICAgICAgICBzdGF0ZS50ZXh0ID0gbmlsOworICAgICAgICBAdHJ5IHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBtID0gW2lucHV0IG1hcmtdOworICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nID0gMTsgLyogbWVhbnMgd2Ugd29uJ3QgdGhyb3cgc2xvdyBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IE5POworICAgICAgICAgICAgW3NlbGYgbVRva2Vuc107CisgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcgPSAwOworICAgICAgICAgICAgLyogbVRva2VucyBiYWNrdHJhY2tzIHdpdGggc3lucHJlZCBhdCBiYWNrdHJhY2tpbmc9PTIKKyAgICAgICAgICAgICAgIGFuZCB3ZSBzZXQgdGhlIHN5bnByZWRnYXRlIHRvIGFsbG93IGFjdGlvbnMgYXQgbGV2ZWwgMS4gKi8KKyAgICAgICAgICAgIGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHsKKyAgICAgICAgICAgICAgICBbaW5wdXQgcmV3aW5kOm1dOworICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsgLyogYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFtzZWxmIGVtaXRdOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKyAgICAgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6cmVdOworICAgICAgICB9CisgICAgfQorfQorCistICh2b2lkKW1lbW9pemU6KGlkPEFOVExSSW50U3RyZWFtPilhbklucHV0CisgICAgICBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKKyAgICAgU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4Cit7CisgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAxICkgW3N1cGVyIG1lbW9pemU6YW5JbnB1dCBSdWxlSW5kZXg6cnVsZUluZGV4IFN0YXJ0SW5kZXg6cnVsZVN0YXJ0SW5kZXhdOworfQorCistIChCT09MKWFscmVhZHlQYXJzZWRSdWxlOihpZDxBTlRMUkludFN0cmVhbT4pYW5JbnB1dCBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKK3sKKyAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDEgKSByZXR1cm4gW3N1cGVyIGFscmVhZHlQYXJzZWRSdWxlOmFuSW5wdXQgUnVsZUluZGV4OnJ1bGVJbmRleF07CisgICAgcmV0dXJuIE5POworfQorLy8gU3RhcnQgb2YgUnVsZXMKKy8vICRBTlRMUiBzdGFydCAiSU1QT1JUIgorLSAodm9pZCkgbUlNUE9SVAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBJTVBPUlQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgaWQ8QU5UTFJUb2tlbj4gbmFtZT1uaWw7CisKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjU6MjogKCAnaW1wb3J0JyBXUyBuYW1lPSBRSURTdGFyICggV1MgKT8gJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo1OjQ6ICdpbXBvcnQnIFdTIG5hbWU9IFFJRFN0YXIgKCBXUyApPyAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJpbXBvcnQiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIE5TSW50ZWdlciBuYW1lU3RhcnQzMSA9IFtzZWxmIGdldEluZGV4XTsKKyAgICAgICAgW3NlbGYgbVFJRFN0YXJdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworCisgICAgICAgIG5hbWUgPSBbW0FOVExSQ29tbW9uVG9rZW4gbmV3QU5UTFJDb21tb25Ub2tlbjppbnB1dCBUeXBlOkFOVExSVG9rZW5UeXBlSW52YWxpZCBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDpuYW1lU3RhcnQzMSBTdG9wOltzZWxmIGdldEluZGV4XS0xXSByZXRhaW5dOworICAgICAgICBbbmFtZSBzZXRMaW5lOltzZWxmIGdldExpbmVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NToyOTogKCBXUyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBMV8wPj0nXHQnICYmIExBMV8wPD0nXG4nKXx8TEExXzA9PScgJykgKSB7CisgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjU6Mjk6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonOyddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIklNUE9SVCIKKworLy8gJEFOVExSIHN0YXJ0ICJSRVRVUk4iCistICh2b2lkKSBtUkVUVVJOCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFJFVFVSTjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTA6MjogKCAncmV0dXJuJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxMDo0OiAncmV0dXJuJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJzsnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAicmV0dXJuIl07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTJfMD09JzsnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyPTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTJfMD49MHgwMDAwICYmIExBMl8wPD0nOicpfHwoTEEyXzA+PSc8JyAmJiBMQTJfMDw9MHhGRkZGKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjEwOjM4OiAuIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoQW55XTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiUkVUVVJOIgorCisvLyAkQU5UTFIgc3RhcnQgIkNMQVNTIgorLSAodm9pZCkgbUNMQVNTCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IENMQVNTOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIGlkPEFOVExSVG9rZW4+IG5hbWU9bmlsOworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxNDoyOiAoICdjbGFzcycgV1MgbmFtZT0gSUQgKCBXUyApPyAoICdleHRlbmRzJyBXUyBRSUQgKCBXUyApPyApPyAoICdpbXBsZW1lbnRzJyBXUyBRSUQgKCBXUyApPyAoICcsJyAoIFdTICk/IFFJRCAoIFdTICk/ICkqICk/ICd7JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTQ6NDogJ2NsYXNzJyBXUyBuYW1lPSBJRCAoIFdTICk/ICggJ2V4dGVuZHMnIFdTIFFJRCAoIFdTICk/ICk/ICggJ2ltcGxlbWVudHMnIFdTIFFJRCAoIFdTICk/ICggJywnICggV1MgKT8gUUlEICggV1MgKT8gKSogKT8gJ3snIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiY2xhc3MiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIE5TSW50ZWdlciBuYW1lU3RhcnQ4MSA9IFtzZWxmIGdldEluZGV4XTsKKyAgICAgICAgW3NlbGYgbUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKworICAgICAgICBuYW1lID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld0FOVExSQ29tbW9uVG9rZW46aW5wdXQgVHlwZTpBTlRMUlRva2VuVHlwZUludmFsaWQgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6bmFtZVN0YXJ0ODEgU3RvcDpbc2VsZiBnZXRJbmRleF0tMV0gcmV0YWluXTsKKyAgICAgICAgW25hbWUgc2V0TGluZTpbc2VsZiBnZXRMaW5lXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE0OjIzOiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQzPTI7CisgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoICgoTEEzXzA+PSdcdCcgJiYgTEEzXzA8PSdcbicpfHxMQTNfMD09JyAnKSApIHsKKyAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTQ6MjM6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxNDoyNzogKCAnZXh0ZW5kcycgV1MgUUlEICggV1MgKT8gKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDU9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBNV8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBNV8wPT0nZScpICkgeworICAgICAgICAgICAgYWx0NT0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxNDoyODogJ2V4dGVuZHMnIFdTIFFJRCAoIFdTICk/IC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImV4dGVuZHMiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE0OjQ1OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDQ9MjsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE0XzA+PSdcdCcgJiYgTEE0XzA8PSdcbicpfHxMQTRfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE0OjQ1OiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTU6MzogKCAnaW1wbGVtZW50cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MTA9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMTBfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTEwXzA9PSdpJykgKSB7CisgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTU6NDogJ2ltcGxlbWVudHMnIFdTIFFJRCAoIFdTICk/ICggJywnICggV1MgKT8gUUlEICggV1MgKT8gKSogLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaW1wbGVtZW50cyJdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVFJRF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTU6MjQ6ICggV1MgKT8gLy8gYmxvY2sKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0Nj0yOworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTZfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTZfMD49J1x0JyAmJiBMQTZfMDw9J1xuJyl8fExBNl8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTU6MjQ6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDk9MjsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBOV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTlfMD09JywnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE1OjI5OiAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicsJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTU6MzM6ICggV1MgKT8gLy8gYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0Nz0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTdfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTdfMD49J1x0JyAmJiBMQTdfMDw9J1xuJyl8fExBN18wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ3PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTU6MzM6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtUUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxNTo0MTogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBOF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBOF8wPj0nXHQnICYmIExBOF8wPD0nXG4nKXx8TEE4XzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxNTo0MTogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3A5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgICAgICAgICBsb29wOTogOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOid7J107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDEgKSB7CisgICAgICAgICAgICBOU0xvZyhAImZvdW5kIGNsYXNzICVAIiwgKG5hbWUhPW5pbD9bbmFtZSBnZXRUZXh0XTowKSk7CisgICAgICAgIH0gIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIkNMQVNTIgorCisvLyAkQU5UTFIgc3RhcnQgIk1FVEhPRCIKKy0gKHZvaWQpIG1NRVRIT0QKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gTUVUSE9EOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIGlkPEFOVExSVG9rZW4+IG5hbWU9bmlsOworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMDo1OiAoIFRZUEUgV1MgbmFtZT0gSUQgKCBXUyApPyAnKCcgKCBBUkcgKCBXUyApPyAoICcsJyAoIFdTICk/IEFSRyAoIFdTICk/ICkqICk/ICcpJyAoIFdTICk/ICggJ3Rocm93cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAneycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjIwOjk6IFRZUEUgV1MgbmFtZT0gSUQgKCBXUyApPyAnKCcgKCBBUkcgKCBXUyApPyAoICcsJyAoIFdTICk/IEFSRyAoIFdTICk/ICkqICk/ICcpJyAoIFdTICk/ICggJ3Rocm93cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAneycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UWVBFXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIE5TSW50ZWdlciBuYW1lU3RhcnQxNTggPSBbc2VsZiBnZXRJbmRleF07CisgICAgICAgIFtzZWxmIG1JRF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisKKyAgICAgICAgbmFtZSA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdBTlRMUkNvbW1vblRva2VuOmlucHV0IFR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkIENoYW5uZWw6QU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0IFN0YXJ0Om5hbWVTdGFydDE1OCBTdG9wOltzZWxmIGdldEluZGV4XS0xXSByZXRhaW5dOworICAgICAgICBbbmFtZSBzZXRMaW5lOltzZWxmIGdldExpbmVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6MjU6ICggV1MgKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDExPTI7CisgICAgICAgIE5TSW50ZWdlciBMQTExXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBMTFfMD49J1x0JyAmJiBMQTExXzA8PSdcbicpfHxMQTExXzA9PScgJykgKSB7CisgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6MjU6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKCddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6MzM6ICggQVJHICggV1MgKT8gKCAnLCcgKCBXUyApPyBBUkcgKCBXUyApPyApKiApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MTY9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMTZfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoICgoTEExNl8wPj0nQScgJiYgTEExNl8wPD0nWicpfHxMQTE2XzA9PSdfJ3x8KExBMTZfMD49J2EnICYmIExBMTZfMDw9J3onKSkgKSB7CisgICAgICAgICAgICBhbHQxNj0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MTYpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6MzU6IEFSRyAoIFdTICk/ICggJywnICggV1MgKT8gQVJHICggV1MgKT8gKSogLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtQVJHXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMDozOTogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxMj0yOworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTEyXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExMl8wPj0nXHQnICYmIExBMTJfMDw9J1xuJyl8fExBMTJfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6Mzk6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE1PTI7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTE1XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTVfMD09JywnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6NDQ6ICcsJyAoIFdTICk/IEFSRyAoIFdTICk/IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaENoYXI6JywnXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMDo0ODogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxMz0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTEzXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEExM18wPj0nXHQnICYmIExBMTNfMDw9J1xuJyl8fExBMTNfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6NDg6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtQVJHXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMDo1NjogKCBXUyApPyAvLyBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxND0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTE0XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEExNF8wPj0nXHQnICYmIExBMTRfMDw9J1xuJyl8fExBMTRfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjA6NTY6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMTU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICAgICAgICAgIGxvb3AxNTogOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicpJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMDo2OTogKCBXUyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MTc9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMTdfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoICgoTEExN18wPj0nXHQnICYmIExBMTdfMDw9J1xuJyl8fExBMTdfMD09JyAnKSApIHsKKyAgICAgICAgICAgIGFsdDE3PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMDo2OTogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjIxOjg6ICggJ3Rocm93cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MjI9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMjJfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTIyXzA9PSd0JykgKSB7CisgICAgICAgICAgICBhbHQyMj0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MjIpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjE6OTogJ3Rocm93cycgV1MgUUlEICggV1MgKT8gKCAnLCcgKCBXUyApPyBRSUQgKCBXUyApPyApKiAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJ0aHJvd3MiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjIxOjI1OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE4PTI7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMThfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTE4XzA+PSdcdCcgJiYgTEExOF8wPD0nXG4nKXx8TEExOF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMToyNTogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0MjE9MjsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMjFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMV8wPT0nLCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MjE9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMTozMDogJywnICggV1MgKT8gUUlEICggV1MgKT8gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonLCddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjIxOjM0OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE5PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMTlfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTE5XzA+PSdcdCcgJiYgTEExOV8wPD0nXG4nKXx8TEExOV8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOT0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMTozNDogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1RSURdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjIxOjQyOiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDIwPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMjBfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTIwXzA+PSdcdCcgJiYgTEEyMF8wPD0nXG4nKXx8TEEyMF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyMD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyMTo0MjogV1MgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AyMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgICAgICAgICAgbG9vcDIxOiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J3snXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMSApIHsKKyAgICAgICAgICAgIE5TTG9nKEAiZm91bmQgbWV0aG9kICVAIiwgKG5hbWUhPW5pbD9bbmFtZSBnZXRUZXh0XTowKSk7CisgICAgICAgIH0gIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIk1FVEhPRCIKKworLy8gJEFOVExSIHN0YXJ0ICJGSUVMRCIKKy0gKHZvaWQpIG1GSUVMRAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBGSUVMRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICBpZDxBTlRMUlRva2VuPiBuYW1lPW5pbDsKKworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MjY6NTogKCBUWVBFIFdTIG5hbWU9IElEICggJ1tdJyApPyAoIFdTICk/ICggJzsnIHwgJz0nICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjI2Ojk6IFRZUEUgV1MgbmFtZT0gSUQgKCAnW10nICk/ICggV1MgKT8gKCAnOycgfCAnPScgKSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRZUEVdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgTlNJbnRlZ2VyIG5hbWVTdGFydDI2MSA9IFtzZWxmIGdldEluZGV4XTsKKyAgICAgICAgW3NlbGYgbUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKworICAgICAgICBuYW1lID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld0FOVExSQ29tbW9uVG9rZW46aW5wdXQgVHlwZTpBTlRMUlRva2VuVHlwZUludmFsaWQgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6bmFtZVN0YXJ0MjYxIFN0b3A6W3NlbGYgZ2V0SW5kZXhdLTFdIHJldGFpbl07CisgICAgICAgIFtuYW1lIHNldExpbmU6W3NlbGYgZ2V0TGluZV1dOyAgLyogZWxlbWVudCgpICovCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyNjoyNTogKCAnW10nICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyMz0yOworICAgICAgICBOU0ludGVnZXIgTEEyM18wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBMjNfMD09J1snKSApIHsKKyAgICAgICAgICAgIGFsdDIzPTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQyMykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoyNjoyNTogJ1tdJyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJbXSJdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjI2OjMxOiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyND0yOworICAgICAgICBOU0ludGVnZXIgTEEyNF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKChMQTI0XzA+PSdcdCcgJiYgTEEyNF8wPD0nXG4nKXx8TEEyNF8wPT0nICcpICkgeworICAgICAgICAgICAgYWx0MjQ9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDI0KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjI2OjMxOiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBpZiAoW2lucHV0IExBOjFdID09ICc7J3x8W2lucHV0IExBOjFdID09ICc9JykgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICBzdGF0ZS5mYWlsZWQgPSBOTzsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTt9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDEgKSB7CisgICAgICAgICAgICBOU0xvZyhAImZvdW5kIHZhciAlQCIsIChuYW1lIT1uaWw/W25hbWUgZ2V0VGV4dF06MCkpOworICAgICAgICB9ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJGSUVMRCIKKworLy8gJEFOVExSIHN0YXJ0ICJTVEFUIgorLSAodm9pZCkgbVNUQVQKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gU1RBVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MzA6NTogKCAoICdpZicgfCAnd2hpbGUnIHwgJ3N3aXRjaCcgfCAnZm9yJyApICggV1MgKT8gJygnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzozMDo3OiAoICdpZicgfCAnd2hpbGUnIHwgJ3N3aXRjaCcgfCAnZm9yJyApICggV1MgKT8gJygnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzozMDo3OiAoICdpZicgfCAnd2hpbGUnIHwgJ3N3aXRjaCcgfCAnZm9yJyApIC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyNT00OworICAgICAgICBzd2l0Y2ggKFtpbnB1dCBMQToxXSkgeworICAgICAgICAgICAgY2FzZSAnaSc6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MjU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd3JzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyNT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI1PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZic6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MjU9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uOjI1IHN0YXRlOjAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIEB0aHJvdyBudmFlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQyNSkgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzozMDo4OiAnaWYnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImlmIl07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjMwOjEzOiAnd2hpbGUnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIndoaWxlIl07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjMwOjIxOiAnc3dpdGNoJyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJzd2l0Y2giXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MzA6MzA6ICdmb3InIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImZvciJdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjMwOjM3OiAoIFdTICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyNj0yOworICAgICAgICBOU0ludGVnZXIgTEEyNl8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKChMQTI2XzA+PSdcdCcgJiYgTEEyNl8wPD0nXG4nKXx8TEEyNl8wPT0nICcpICkgeworICAgICAgICAgICAgYWx0MjY9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDI2KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjMwOjM3OiBXUyAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JygnXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJTVEFUIgorCisvLyAkQU5UTFIgc3RhcnQgIkNBTEwiCistICh2b2lkKSBtQ0FMTAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBDQUxMOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIGlkPEFOVExSVG9rZW4+IG5hbWU9bmlsOworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzozMzo1OiAobmFtZT0gUUlEICggV1MgKT8gJygnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzozMzo5OiBuYW1lPSBRSUQgKCBXUyApPyAnKCcgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgTlNJbnRlZ2VyIG5hbWVTdGFydDMyNiA9IFtzZWxmIGdldEluZGV4XTsKKyAgICAgICAgW3NlbGYgbVFJRF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisKKyAgICAgICAgbmFtZSA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdBTlRMUkNvbW1vblRva2VuOmlucHV0IFR5cGU6QU5UTFJUb2tlblR5cGVJbnZhbGlkIENoYW5uZWw6QU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0IFN0YXJ0Om5hbWVTdGFydDMyNiBTdG9wOltzZWxmIGdldEluZGV4XS0xXSByZXRhaW5dOworICAgICAgICBbbmFtZSBzZXRMaW5lOltzZWxmIGdldExpbmVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MzM6MTg6ICggV1MgKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDI3PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTI3XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBMjdfMD49J1x0JyAmJiBMQTI3XzA8PSdcbicpfHxMQTI3XzA9PScgJykgKSB7CisgICAgICAgICAgICBhbHQyNz0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MjcpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MzM6MTg6IFdTIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKCddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAxICkgeworICAgICAgICAgICAgLyppZ25vcmUgaWYgdGhpcy9zdXBlciAqLyBOU0xvZyhAImZvdW5kIGNhbGwgJUAiLChuYW1lIT1uaWw/W25hbWUgZ2V0VGV4dF06MCkpOworICAgICAgICB9ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJDQUxMIgorCisvLyAkQU5UTFIgc3RhcnQgIkNPTU1FTlQiCistICh2b2lkKSBtQ09NTUVOVAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBDT01NRU5UOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzozODo1OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjM4Ojk6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCIvKiJdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mjg9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTI4XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTI4XzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMjhfMSA9IFtpbnB1dCBMQToyXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTI4XzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI4PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjhfMT49MHgwMDAwICYmIExBMjhfMTw9Jy4nKXx8KExBMjhfMT49JzAnICYmIExBMjhfMTw9MHhGRkZGKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI4PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjhfMD49MHgwMDAwICYmIExBMjhfMDw9JyknKXx8KExBMjhfMD49JysnICYmIExBMjhfMDw9MHhGRkZGKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mjg9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6Mzg6NDE6IC4gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hBbnldOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI4OiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiKi8iXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMSApIHsKKyAgICAgICAgICAgIE5TTG9nKEAiZm91bmQgY29tbWVudCAlQCIsIFtzZWxmIGdldFRleHRdKTsKKyAgICAgICAgfSAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiQ09NTUVOVCIKKworLy8gJEFOVExSIHN0YXJ0ICJTTF9DT01NRU5UIgorLSAodm9pZCkgbVNMX0NPTU1FTlQKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gU0xfQ09NTUVOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NDM6NTogKCAnLy8nICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnXFxuJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NDM6OTogJy8vJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJ1xcbicgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCIvLyJdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mjk9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTI5XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTI5XzA9PSdcbicpICkgeworICAgICAgICAgICAgICAgIGFsdDI5PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTI5XzA+PTB4MDAwMCAmJiBMQTI5XzA8PSdcdCcpfHwoTEEyOV8wPj0weDAwMEIgJiYgTEEyOV8wPD0weEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyOT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo0Mzo0MTogLiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaEFueV07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI5OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjk6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOidcbiddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAxICkgeworICAgICAgICAgICAgTlNMb2coQCJmb3VuZCAvLyBjb21tZW50ICVAIiwgW3NlbGYgZ2V0VGV4dF0pOworICAgICAgICB9ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJTTF9DT01NRU5UIgorCisvLyAkQU5UTFIgc3RhcnQgIlNUUklORyIKKy0gKHZvaWQpIG1TVFJJTkcKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gU1RSSU5HOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo0ODoyOiAoICdcIicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiBFU0MgfCAuICkqICdcIicgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjQ4OjQ6ICdcIicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiBFU0MgfCAuICkqICdcIicgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOiciJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzMD0zOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzBfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBMzBfMD09JyInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMD0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMwXzA9PSdcXCcpICkgeworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTMwXzIgPSBbaW5wdXQgTEE6Ml07CisgICAgICAgICAgICAgICAgaWYgKCAoTEEzMF8yPT0nIicpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzMD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMzBfMj09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMwPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMF8yPT0nXCcnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzA9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEzMF8yPj0weDAwMDAgJiYgTEEzMF8yPD0nIScpfHwoTEEzMF8yPj0nIycgJiYgTEEzMF8yPD0nJicpfHwoTEEzMF8yPj0nKCcgJiYgTEEzMF8yPD0nWycpfHwoTEEzMF8yPj0nXScgJiYgTEEzMF8yPD0weEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzA9MjsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEzMF8wPj0weDAwMDAgJiYgTEEzMF8wPD0nIScpfHwoTEEzMF8wPj0nIycgJiYgTEEzMF8wPD0nWycpfHwoTEEzMF8wPj0nXScgJiYgTEEzMF8wPD0weEZGRkYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMD0yOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo0ODozNDogRVNDIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtRVNDXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NDg6NDA6IC4gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hBbnldOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDMwOiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonIiddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIlNUUklORyIKKworLy8gJEFOVExSIHN0YXJ0ICJDSEFSIgorLSAodm9pZCkgbUNIQVIKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gQ0hBUjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NTI6MjogKCAnXFwnJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IEVTQyB8IC4gKSogJ1xcJycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjUyOjQ6ICdcXCcnICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogRVNDIHwgLiApKiAnXFwnJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J1wnJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzMT0zOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBMzFfMD09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MzE9MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzMV8yID0gW2lucHV0IExBOjJdOworICAgICAgICAgICAgICAgIGlmICggKExBMzFfMj09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzMV8yPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTMxXzI9PSciJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMzFfMj49MHgwMDAwICYmIExBMzFfMjw9JyEnKXx8KExBMzFfMj49JyMnICYmIExBMzFfMjw9JyYnKXx8KExBMzFfMj49JygnICYmIExBMzFfMjw9J1snKXx8KExBMzFfMj49J10nICYmIExBMzFfMjw9MHhGRkZGKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDMxPTI7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMzFfMD49MHgwMDAwICYmIExBMzFfMDw9JyYnKXx8KExBMzFfMD49JygnICYmIExBMzFfMDw9J1snKXx8KExBMzFfMD49J10nICYmIExBMzFfMDw9MHhGRkZGKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MzE9MjsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NTI6MzU6IEVTQyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbUVTQ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjUyOjQxOiAuIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoQW55XTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzMTogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J1wnJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiQ0hBUiIKKworLy8gJEFOVExSIHN0YXJ0ICJXUyIKKy0gKHZvaWQpIG1XUworeworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBXUzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NTU6NTogKCAoICcgJyB8ICdcXHQnIHwgJ1xcbicgKSsgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjU1Ojk6ICggJyAnIHwgJ1xcdCcgfCAnXFxuJyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NTU6OTogKCAnICcgfCAnXFx0JyB8ICdcXG4nICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQzMj0wOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MzI9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTMyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEzMl8wPj0nXHQnICYmIExBMzJfMDw9J1xuJyl8fExBMzJfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzMj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICdcdCcpICYmIChbaW5wdXQgTEE6MV0gPD0gJ1xuJykpfHxbaW5wdXQgTEE6MV0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmZhaWxlZCA9IE5POworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTZXQ6bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlO30KKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQzMiA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDMyOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA+IDAgKSB7IHN0YXRlLmZhaWxlZCA9IFlFUzsgcmV0dXJuIDsgfSAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFN0cmVhbTppbnB1dCBkZWNpc2lvbk51bWJlcjozMl07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQzMisrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMzI6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJXUyIKKworLy8gJEFOVExSIHN0YXJ0ICJRSUQiCistICh2b2lkKSBtUUlECit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo1OTo1OiAoIElEICggJy4nIElEICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo1OTo3OiBJRCAoICcuJyBJRCApKiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDMzPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzM18wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEEzM18wPT0nLicpICkgeworICAgICAgICAgICAgICAgIGFsdDMzPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQzMykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjU5OjExOiAnLicgSUQgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicuJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBtSURdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDMzOiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJRSUQiCisKKy8vICRBTlRMUiBzdGFydCAiUUlEU3RhciIKKy0gKHZvaWQpIG1RSURTdGFyCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo2ODoyOiAoIElEICggJy4nIElEICkqICggJy4qJyApPyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6Njg6NDogSUQgKCAnLicgSUQgKSogKCAnLionICk/IC8vIGFsdAorICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtSURdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MzQ9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTM0XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTM0XzA9PScuJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzRfMSA9IFtpbnB1dCBMQToyXTsKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEzNF8xPj0nQScgJiYgTEEzNF8xPD0nWicpfHxMQTM0XzE9PSdfJ3x8KExBMzRfMT49J2EnICYmIExBMzRfMTw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM0PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6Njg6ODogJy4nIElEIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonLiddOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgbUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzNDogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6Njg6MTc6ICggJy4qJyApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MzU9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBMzVfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTM1XzA9PScuJykgKSB7CisgICAgICAgICAgICBhbHQzNT0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYWx0MzUpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6Njg6MTc6ICcuKicgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiLioiXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJRSURTdGFyIgorCisvLyAkQU5UTFIgc3RhcnQgIlRZUEUiCistICh2b2lkKSBtVFlQRQoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6NzI6NTogKCBRSUQgKCAnW10nICk/ICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo3Mjo5OiBRSUQgKCAnW10nICk/IC8vIGFsdAorICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtUUlEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjcyOjEzOiAoICdbXScgKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDM2PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTM2XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoTEEzNl8wPT0nWycpICkgeworICAgICAgICAgICAgYWx0MzY9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDM2KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjcyOjEzOiAnW10nIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIltdIl07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVFlQRSIKKworLy8gJEFOVExSIHN0YXJ0ICJBUkciCistICh2b2lkKSBtQVJHCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo3Njo1OiAoIFRZUEUgV1MgSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjc2Ojk6IFRZUEUgV1MgSUQgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UWVBFXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgIFtzZWxmIG1XU107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICBbc2VsZiBtSURdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiQVJHIgorCisvLyAkQU5UTFIgc3RhcnQgIklEIgorLSAodm9pZCkgbUlECit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo4MDo1OiAoICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nIHwgJzAnIC4uICc5JyApKiApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6ODA6OTogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgfCAnMCcgLi4gJzknICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnQScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ1onKSl8fFtpbnB1dCBMQToxXSA9PSAnXyd8fCgoW2lucHV0IExBOjFdID49ICdhJykgJiYgKFtpbnB1dCBMQToxXSA8PSAneicpKSkgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICBzdGF0ZS5mYWlsZWQgPSBOTzsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwICkgeyBzdGF0ZS5mYWlsZWQgPSBZRVM7IHJldHVybiA7IH0KKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTt9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzNz0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMzdfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTM3XzA+PScwJyAmJiBMQTM3XzA8PSc5Jyl8fChMQTM3XzA+PSdBJyAmJiBMQTM3XzA8PSdaJyl8fExBMzdfMD09J18nfHwoTEEzN18wPj0nYScgJiYgTEEzN18wPD0neicpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzNz0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gTk87CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsgc3RhdGUuZmFpbGVkID0gWUVTOyByZXR1cm4gOyB9CisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7fQorICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDM3OiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJJRCIKKworLy8gJEFOVExSIHN0YXJ0ICJFU0MiCistICh2b2lkKSBtRVNDCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo4NDo1OiAoICdcXFxcJyAoICdcIicgfCAnXFwnJyB8ICdcXFxcJyApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzo4NDo3OiAnXFxcXCcgKCAnXCInIHwgJ1xcJycgfCAnXFxcXCcgKSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J1xcJ107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGlmIChbaW5wdXQgTEE6MV0gPT0gJyInfHxbaW5wdXQgTEE6MV0gPT0gJ1wnJ3x8W2lucHV0IExBOjFdID09ICdcXCcpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgc3RhdGUuZmFpbGVkID0gTk87CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsgc3RhdGUuZmFpbGVkID0gWUVTOyByZXR1cm4gOyB9CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7fQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiRVNDIgorCistICh2b2lkKSBtVG9rZW5zCit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6Mzk6ICggSU1QT1JUIHwgUkVUVVJOIHwgQ0xBU1MgfCBNRVRIT0QgfCBGSUVMRCB8IFNUQVQgfCBDQUxMIHwgQ09NTUVOVCB8IFNMX0NPTU1FTlQgfCBTVFJJTkcgfCBDSEFSIHwgV1MgKSAvL3J1bGVibG9jaworICAgIE5TSW50ZWdlciBhbHQzOD0xMjsKKyAgICBhbHQzOCA9IFtkZmEzOCBwcmVkaWN0OmlucHV0XTsKKyAgICBzd2l0Y2ggKGFsdDM4KSB7CisgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjQxOiBJTVBPUlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUlNUE9SVF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6NDg6IFJFVFVSTiAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtUkVUVVJOXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo1NTogQ0xBU1MgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUNMQVNTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo2MTogTUVUSE9EIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1NRVRIT0RdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjY4OiBGSUVMRCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtRklFTERdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjc0OiBTVEFUIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1TVEFUXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDcgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo3OTogQ0FMTCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtQ0FMTF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4IDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6ODQ6IENPTU1FTlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUNPTU1FTlRdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjkyOiBTTF9DT01NRU5UIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1TTF9DT01NRU5UXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6MTAzOiBTVFJJTkcgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbVNUUklOR107IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjExMDogQ0hBUiAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtQ0hBUl07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjExNTogV1MgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkMV9GdXp6eV9mcmFnbWVudAorLSAodm9pZCkgc3lucHJlZDFfRnV6enlfZnJhZ21lbnQKK3sKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo0MTogKCBJTVBPUlQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo0MTogSU1QT1JUIC8vIGFsdAorICAgIHsKKyAgICAgICAgW3NlbGYgbUlNUE9SVF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgLyogZWxlbWVudHMgKi8KKyAgICB9Cit9IC8vICRBTlRMUiBlbmQgc3lucHJlZDFfRnV6enlfZnJhZ21lbnQKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQyX0Z1enp5X2ZyYWdtZW50CistICh2b2lkKSBzeW5wcmVkMl9GdXp6eV9mcmFnbWVudAoreworICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjQ4OiAoIFJFVFVSTiApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjQ4OiBSRVRVUk4gLy8gYWx0CisgICAgeworICAgICAgICBbc2VsZiBtUkVUVVJOXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAvKiBlbGVtZW50cyAqLworICAgIH0KK30gLy8gJEFOVExSIGVuZCBzeW5wcmVkMl9GdXp6eV9mcmFnbWVudAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDNfRnV6enlfZnJhZ21lbnQKKy0gKHZvaWQpIHN5bnByZWQzX0Z1enp5X2ZyYWdtZW50Cit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6NTU6ICggQ0xBU1MgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo1NTogQ0xBU1MgLy8gYWx0CisgICAgeworICAgICAgICBbc2VsZiBtQ0xBU1NdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgLyogZWxlbWVudCgpICovCisgICAgIC8qIGVsZW1lbnRzICovCisgICAgfQorfSAvLyAkQU5UTFIgZW5kIHN5bnByZWQzX0Z1enp5X2ZyYWdtZW50CisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkNF9GdXp6eV9mcmFnbWVudAorLSAodm9pZCkgc3lucHJlZDRfRnV6enlfZnJhZ21lbnQKK3sKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo2MTogKCBNRVRIT0QgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo2MTogTUVUSE9EIC8vIGFsdAorICAgIHsKKyAgICAgICAgW3NlbGYgbU1FVEhPRF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgLyogZWxlbWVudHMgKi8KKyAgICB9Cit9IC8vICRBTlRMUiBlbmQgc3lucHJlZDRfRnV6enlfZnJhZ21lbnQKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ1X0Z1enp5X2ZyYWdtZW50CistICh2b2lkKSBzeW5wcmVkNV9GdXp6eV9mcmFnbWVudAoreworICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjY4OiAoIEZJRUxEICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6Njg6IEZJRUxEIC8vIGFsdAorICAgIHsKKyAgICAgICAgW3NlbGYgbUZJRUxEXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAvKiBlbGVtZW50cyAqLworICAgIH0KK30gLy8gJEFOVExSIGVuZCBzeW5wcmVkNV9GdXp6eV9mcmFnbWVudAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDZfRnV6enlfZnJhZ21lbnQKKy0gKHZvaWQpIHN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50Cit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6NzQ6ICggU1RBVCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjc0OiBTVEFUIC8vIGFsdAorICAgIHsKKyAgICAgICAgW3NlbGYgbVNUQVRdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgLyogZWxlbWVudCgpICovCisgICAgIC8qIGVsZW1lbnRzICovCisgICAgfQorfSAvLyAkQU5UTFIgZW5kIHN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50CisKKy8vICRBTlRMUiBzdGFydCBzeW5wcmVkN19GdXp6eV9mcmFnbWVudAorLSAodm9pZCkgc3lucHJlZDdfRnV6enlfZnJhZ21lbnQKK3sKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo3OTogKCBDQUxMICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6Nzk6IENBTEwgLy8gYWx0CisgICAgeworICAgICAgICBbc2VsZiBtQ0FMTF07IGlmICggc3RhdGUuZmFpbGVkID09IFlFUyApIHJldHVybiA7CisgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgLyogZWxlbWVudHMgKi8KKyAgICB9Cit9IC8vICRBTlRMUiBlbmQgc3lucHJlZDdfRnV6enlfZnJhZ21lbnQKKworLy8gJEFOVExSIHN0YXJ0IHN5bnByZWQ4X0Z1enp5X2ZyYWdtZW50CistICh2b2lkKSBzeW5wcmVkOF9GdXp6eV9mcmFnbWVudAoreworICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjg0OiAoIENPTU1FTlQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5Lmc6MTo4NDogQ09NTUVOVCAvLyBhbHQKKyAgICB7CisgICAgICAgIFtzZWxmIG1DT01NRU5UXTsgaWYgKCBzdGF0ZS5mYWlsZWQgPT0gWUVTICkgcmV0dXJuIDsKKyAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAvKiBlbGVtZW50cyAqLworICAgIH0KK30gLy8gJEFOVExSIGVuZCBzeW5wcmVkOF9GdXp6eV9mcmFnbWVudAorCisvLyAkQU5UTFIgc3RhcnQgc3lucHJlZDlfRnV6enlfZnJhZ21lbnQKKy0gKHZvaWQpIHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50Cit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9GdXp6eS5nOjE6OTI6ICggU0xfQ09NTUVOVCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvZnV6enkvRnV6enkuZzoxOjkyOiBTTF9DT01NRU5UIC8vIGFsdAorICAgIHsKKyAgICAgICAgW3NlbGYgbVNMX0NPTU1FTlRdOyBpZiAoIHN0YXRlLmZhaWxlZCA9PSBZRVMgKSByZXR1cm4gOworICAgICAgLyogZWxlbWVudCgpICovCisgICAgIC8qIGVsZW1lbnRzICovCisgICAgfQorfSAvLyAkQU5UTFIgZW5kIHN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50CisKK0BlbmQgLy8gZW5kIG9mIEZ1enp5IGltcGxlbWVudGF0aW9uIC8vIGxpbmUgMzk3CisKKy8qIEVuZCBvZiBjb2RlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9vdXRwdXQxL0Z1enp5LnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L291dHB1dDEvRnV6enkudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzAzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9vdXRwdXQxL0Z1enp5LnRva2VucwpAQCAtMCwwICsxLDE4IEBACitTVEFUPTE1CitDTEFTUz0xMAorRVNDPTE5CitDSEFSPTIxCitJRD04CitRSUQ9OQorVFlQRT0xMQorSU1QT1JUPTYKK1dTPTQKK0FSRz0xMgorUUlEU3Rhcj01CitTTF9DT01NRU5UPTE4CitSRVRVUk49NworRklFTEQ9MTQKK0NBTEw9MTYKK0NPTU1FTlQ9MTcKK01FVEhPRD0xMworU1RSSU5HPTIwCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9vdXRwdXQxL0Z1enp5TGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L291dHB1dDEvRnV6enlMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGIxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9mdXp6eS9vdXRwdXQxL0Z1enp5TGV4ZXIuaApAQCAtMCwwICsxLDg3IEBACisvLyAkQU5UTFIgMy4yIEF1ZyAyMCwgMjAxMCAxMzozOTozMiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2Z1enp5L0Z1enp5LmcgMjAxMC0wOC0yMCAxMzo0MDoxNQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiYW50bHIzLmgiCisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogU3RhcnQgY3ljbGljREZBSW50ZXJmYWNlICovCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2Ugc3RhcnQgREZBMzgKK0BpbnRlcmZhY2UgREZBMzggOiBBTlRMUkRGQSB7Cit9CisrIG5ld0RGQTM4V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKil0aGVSZWNvZ25pemVyOworLSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilyZWNvZ25pemVyOworQGVuZAorCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2UgZW5kIERGQTM4CisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjZGVmaW5lIFNUQVQgMTUKKyNkZWZpbmUgQ0xBU1MgMTAKKyNkZWZpbmUgRVNDIDE5CisjZGVmaW5lIENIQVIgMjEKKyNkZWZpbmUgSUQgOAorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgUUlEIDkKKyNkZWZpbmUgVFlQRSAxMQorI2RlZmluZSBJTVBPUlQgNgorI2RlZmluZSBXUyA0CisjZGVmaW5lIEFSRyAxMgorI2RlZmluZSBRSURTdGFyIDUKKyNkZWZpbmUgU0xfQ09NTUVOVCAxOAorI2RlZmluZSBSRVRVUk4gNworI2RlZmluZSBGSUVMRCAxNAorI2RlZmluZSBDQUxMIDE2CisjZGVmaW5lIENPTU1FTlQgMTcKKyNkZWZpbmUgTUVUSE9EIDEzCisjZGVmaW5lIFNUUklORyAyMAorQGludGVyZmFjZSBGdXp6eSA6IEFOVExSTGV4ZXIgeyAvLyBsaW5lIDI4MworICAgIERGQTM4ICpkZmEzODsKKyAgICBTRUwgc3lucHJlZDlfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDJfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDdfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDRfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDhfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDZfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDVfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDNfRnV6enlTZWxlY3RvcjsKKyAgICBTRUwgc3lucHJlZDFfRnV6enlTZWxlY3RvcjsKK30KKysgKEZ1enp5ICopbmV3RnV6enk6KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKworLSAodm9pZCltSU1QT1JUOyAKKy0gKHZvaWQpbVJFVFVSTjsgCistICh2b2lkKW1DTEFTUzsgCistICh2b2lkKW1NRVRIT0Q7IAorLSAodm9pZCltRklFTEQ7IAorLSAodm9pZCltU1RBVDsgCistICh2b2lkKW1DQUxMOyAKKy0gKHZvaWQpbUNPTU1FTlQ7IAorLSAodm9pZCltU0xfQ09NTUVOVDsgCistICh2b2lkKW1TVFJJTkc7IAorLSAodm9pZCltQ0hBUjsgCistICh2b2lkKW1XUzsgCistICh2b2lkKW1RSUQ7IAorLSAodm9pZCltUUlEU3RhcjsgCistICh2b2lkKW1UWVBFOyAKKy0gKHZvaWQpbUFSRzsgCistICh2b2lkKW1JRDsgCistICh2b2lkKW1FU0M7IAorLSAodm9pZCltVG9rZW5zOyAKKy0gKHZvaWQpc3lucHJlZDFfRnV6enlfZnJhZ21lbnQ7IAorLSAodm9pZClzeW5wcmVkMl9GdXp6eV9mcmFnbWVudDsgCistICh2b2lkKXN5bnByZWQzX0Z1enp5X2ZyYWdtZW50OyAKKy0gKHZvaWQpc3lucHJlZDRfRnV6enlfZnJhZ21lbnQ7IAorLSAodm9pZClzeW5wcmVkNV9GdXp6eV9mcmFnbWVudDsgCistICh2b2lkKXN5bnByZWQ2X0Z1enp5X2ZyYWdtZW50OyAKKy0gKHZvaWQpc3lucHJlZDdfRnV6enlfZnJhZ21lbnQ7IAorLSAodm9pZClzeW5wcmVkOF9GdXp6eV9mcmFnbWVudDsgCistICh2b2lkKXN5bnByZWQ5X0Z1enp5X2ZyYWdtZW50OyAKKworQGVuZCAvLyBlbmQgb2YgRnV6enkgaW50ZXJmYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVC5nIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTgwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9ULmcKQEAgLTAsMCArMSw0OSBAQAorLyoqIERlbW9uc3RyYXRlcyBob3cgc2VtYW50aWMgcHJlZGljYXRlcyBnZXQgaG9pc3RlZCBvdXQgb2YgdGhlIHJ1bGUgaW4gCisgKiAgd2hpY2ggdGhleSBhcmUgZm91bmQgYW5kIHVzZWQgaW4gb3RoZXIgZGVjaXNpb25zLiAgVGhpcyBncmFtbWFyIGlsbHVzdHJhdGVzCisgKiAgaG93IHByZWRpY2F0ZXMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlbnVtIGFzIGEga2V5d29yZCBhbmQKKyAqICBhbiBJRCAqZHluYW1pY2FsbHkqLiA6KQorCisgKiBSdW4gImphdmEgb3JnLmFudGxyLlRvb2wgLWRmYSB0LmciIHRvIGdlbmVyYXRlIERPVCAoZ3JhcGh2aXopIGZpbGVzLiAgU2VlCisgKiB0aGUgVF9kZWMtMS5kb3QgZmlsZSB0byBzZWUgdGhlIHByZWRpY2F0ZXMgaW4gYWN0aW9uLgorICovCitncmFtbWFyIFQ7CisKK29wdGlvbnMgeworCWxhbmd1YWdlPU9iakM7Cit9CisKK0BtZW1WYXJzIHsKKy8qIFdpdGggdGhpcyB0cnVlLCBlbnVtIGlzIHNlZW4gYXMgYSBrZXl3b3JkLiAgRmFsc2UsIGl0J3MgYW4gaWRlbnRpZmllciAqLworQk9PTCBlbmFibGVFbnVtOworfQorCitAaW5pdCB7CitlbmFibGVFbnVtID0gTk87Cit9CisKK3N0YXQ6IGlkZW50aWZpZXIgICAge05TTG9nKEAiZW51bSBpcyBhbiBJRCIpO30KKyAgICB8IGVudW1Bc0tleXdvcmQge05TTG9nKEAiZW51bSBpcyBhIGtleXdvcmQiKTt9CisgICAgOworCitpZGVudGlmaWVyCisgICAgOiBJRAorICAgIHwgZW51bUFzSUQKKyAgICA7CisKK2VudW1Bc0tleXdvcmQgOiB7ZW5hYmxlRW51bX0/ICdlbnVtJyA7CisKK2VudW1Bc0lEIDogeyFlbmFibGVFbnVtfT8gJ2VudW0nIDsKKworSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSoKKyAgICA7CisKK0lOVCA6CSgnMCcuLic5JykrCisgICAgOworCitXUyAgOiAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgICdccicKKyAgICAgICAgfCAgICdcbicKKyAgICAgICAgKSsKKyAgICAgICAgeyAkY2hhbm5lbD05OTsgfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9ULnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL1QudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTAxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9ULnRva2VucwpAQCAtMCwwICsxLDUgQEAKK1RfXzc9NworSUQ9NAorSU5UPTUKK1dTPTYKKydlbnVtJz03CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9UTGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL1RMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTA2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9UTGV4ZXIuaApAQCAtMCwwICsxLDQxIEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFQuZyAyMDExLTA1LTA2IDE5OjE0OjIzCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUi5oPgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIFN0YXJ0IGN5Y2xpY0RGQUludGVyZmFjZSAqLworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIGVuZAorI3ByYWdtYSBtYXJrIFRva2VucworI2lmZGVmIEVPRgorI3VuZGVmIEVPRgorI2VuZGlmCisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBUX183IDcKKyNkZWZpbmUgSUQgNAorI2RlZmluZSBJTlQgNQorI2RlZmluZSBXUyA2CisvKiBpbnRlcmZhY2UgbGV4ZXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgVExleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCit9CisrICh2b2lkKSBpbml0aWFsaXplOworKyAoVExleGVyICopbmV3VExleGVyV2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKy8qIE9iakMgc3RhcnQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLSAodm9pZCkgbVRfXzcgOyAKKy0gKHZvaWQpIG1JRCA7IAorLSAodm9pZCkgbUlOVCA7IAorLSAodm9pZCkgbVdTIDsgCistICh2b2lkKSBtVG9rZW5zIDsgCisKK0BlbmQgLyogZW5kIG9mIFRMZXhlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVExleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9UTGV4ZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVExleGVyLm0KQEAgLTAsMCArMSw0NzIgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogVC5nCisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDIwMTEtMDUtMDYgMTk6MTQ6MjMKKyAqICAgICAtICAgICAgICAgICAgICAgICBmb3IgdGhlIGxleGVyIDogVExleGVyTGV4ZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gVC5nIDIwMTEtMDUtMDYgMTk6MTQ6MjMKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiVExleGVyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKy8qKiBBcyBwZXIgVGVyZW5jZTogTm8gcmV0dXJucyBmb3IgbGV4ZXIgcnVsZXMhICovCitAaW1wbGVtZW50YXRpb24gVExleGVyIC8vIGxpbmUgMzMwCisKKysgKHZvaWQpIGluaXRpYWxpemUKK3sKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRHcmFtbWFyRmlsZU5hbWU6QCJULmciXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gW1tzZWxmIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6YVRva2VuVHlwZV07Cit9CisKKysgKFRMZXhlciAqKW5ld1RMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICByZXR1cm4gW1tUTGV4ZXIgYWxsb2NdIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0XTsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dCBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46NSsxXSByZXRhaW5dXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworCisvKiBTdGFydCBvZiBSdWxlcyAqLworLy8gJEFOVExSIHN0YXJ0ICJUX183IgorLSAodm9pZCkgbVRfXzcKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fNzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBULmc6Nzo2OiAoICdlbnVtJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBULmc6Nzo4OiAnZW51bScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJlbnVtIl07IAorCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzciICovCisKKy8vICRBTlRMUiBzdGFydCAiSUQiCistICh2b2lkKSBtSUQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gSUQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gVC5nOjM3OjU6ICggKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFQuZzozNzo5OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICdBJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnWicpKXx8W2lucHV0IExBOjFdID09ICdfJ3x8KChbaW5wdXQgTEE6MV0gPj0gJ2EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICd6JykpKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTFfMCA+PSAnMCcgJiYgTEExXzAgPD0gJzknKXx8KExBMV8wID49ICdBJyAmJiBMQTFfMCA8PSAnWicpfHxMQTFfMD09J18nfHwoTEExXzAgPj0gJ2EnICYmIExBMV8wIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFQuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIklEIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIklOVCIKKy0gKHZvaWQpIG1JTlQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gSU5UOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFQuZzo0MDo1OiAoICggJzAnIC4uICc5JyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBULmc6NDA6NzogKCAnMCcgLi4gJzknICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIFQuZzo0MDo3OiAoICcwJyAuLiAnOScgKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDIgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MiA9IDI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEyXzAgPj0gJzAnICYmIExBMl8wIDw9ICc5JykpICkgeworICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFQuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQyID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMjsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOmlucHV0IGRlY2lzaW9uTnVtYmVyOjJdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MisrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjogOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJJTlQiICovCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gVC5nOjQzOjU6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gVC5nOjQzOjk6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIFQuZzo0Mzo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTNfMCA+PSAnXHQnICYmIExBM18wIDw9ICdcbicpfHxMQTNfMD09J1xyJ3x8TEEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gVC5nOiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gJ1x0JykgJiYgKFtpbnB1dCBMQToxXSA8PSAnXG4nKSl8fFtpbnB1dCBMQToxXSA9PSAnXHInfHxbaW5wdXQgTEE6MV0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDMgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6M107CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQzKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzOiA7CisKKworICAgICAgICAgX2NoYW5uZWw9OTk7IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJXUyIgKi8KKworLSAodm9pZCkgbVRva2VucworeworICAgIC8vIFQuZzoxOjg6ICggVF9fNyB8IElEIHwgSU5UIHwgV1MgKSAvL3J1bGVibG9jaworICAgIE5TSW50ZWdlciBhbHQ0PTQ7CisgICAgdW5pY2hhciBjaGFyTEE0ID0gW2lucHV0IExBOjFdOworICAgIHN3aXRjaCAoY2hhckxBNCkgeworICAgICAgICBjYXNlICdlJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTRfMT09J24nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzUgPSBbaW5wdXQgTEE6M107CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTRfNT09J3UnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF82ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNF82PT0nbScpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF83ID0gW2lucHV0IExBOjVdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE0XzcgPj0gJzAnICYmIExBNF83IDw9ICc5Jyl8fChMQTRfNyA+PSAnQScgJiYgTEE0XzcgPD0gJ1onKXx8TEE0Xzc9PSdfJ3x8KExBNF83ID49ICdhJyAmJiBMQTRfNyA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdBJzogOworICAgICAgICBjYXNlICdCJzogOworICAgICAgICBjYXNlICdDJzogOworICAgICAgICBjYXNlICdEJzogOworICAgICAgICBjYXNlICdFJzogOworICAgICAgICBjYXNlICdGJzogOworICAgICAgICBjYXNlICdHJzogOworICAgICAgICBjYXNlICdIJzogOworICAgICAgICBjYXNlICdJJzogOworICAgICAgICBjYXNlICdKJzogOworICAgICAgICBjYXNlICdLJzogOworICAgICAgICBjYXNlICdMJzogOworICAgICAgICBjYXNlICdNJzogOworICAgICAgICBjYXNlICdOJzogOworICAgICAgICBjYXNlICdPJzogOworICAgICAgICBjYXNlICdQJzogOworICAgICAgICBjYXNlICdRJzogOworICAgICAgICBjYXNlICdSJzogOworICAgICAgICBjYXNlICdTJzogOworICAgICAgICBjYXNlICdUJzogOworICAgICAgICBjYXNlICdVJzogOworICAgICAgICBjYXNlICdWJzogOworICAgICAgICBjYXNlICdXJzogOworICAgICAgICBjYXNlICdYJzogOworICAgICAgICBjYXNlICdZJzogOworICAgICAgICBjYXNlICdaJzogOworICAgICAgICBjYXNlICdfJzogOworICAgICAgICBjYXNlICdhJzogOworICAgICAgICBjYXNlICdiJzogOworICAgICAgICBjYXNlICdjJzogOworICAgICAgICBjYXNlICdkJzogOworICAgICAgICBjYXNlICdmJzogOworICAgICAgICBjYXNlICdnJzogOworICAgICAgICBjYXNlICdoJzogOworICAgICAgICBjYXNlICdpJzogOworICAgICAgICBjYXNlICdqJzogOworICAgICAgICBjYXNlICdrJzogOworICAgICAgICBjYXNlICdsJzogOworICAgICAgICBjYXNlICdtJzogOworICAgICAgICBjYXNlICduJzogOworICAgICAgICBjYXNlICdvJzogOworICAgICAgICBjYXNlICdwJzogOworICAgICAgICBjYXNlICdxJzogOworICAgICAgICBjYXNlICdyJzogOworICAgICAgICBjYXNlICdzJzogOworICAgICAgICBjYXNlICd0JzogOworICAgICAgICBjYXNlICd1JzogOworICAgICAgICBjYXNlICd2JzogOworICAgICAgICBjYXNlICd3JzogOworICAgICAgICBjYXNlICd4JzogOworICAgICAgICBjYXNlICd5JzogOworICAgICAgICBjYXNlICd6JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOiA7CisgICAgICAgIGNhc2UgJzEnOiA7CisgICAgICAgIGNhc2UgJzInOiA7CisgICAgICAgIGNhc2UgJzMnOiA7CisgICAgICAgIGNhc2UgJzQnOiA7CisgICAgICAgIGNhc2UgJzUnOiA7CisgICAgICAgIGNhc2UgJzYnOiA7CisgICAgICAgIGNhc2UgJzcnOiA7CisgICAgICAgIGNhc2UgJzgnOiA7CisgICAgICAgIGNhc2UgJzknOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXHQnOiA7CisgICAgICAgIGNhc2UgJ1xuJzogOworICAgICAgICBjYXNlICdccic6IDsKKyAgICAgICAgY2FzZSAnICc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogOworICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjQgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICBudmFlLmMgPSBjaGFyTEE0OworICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgIH0KKworICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAvLyBULmc6MToxMDogVF9fNyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX183XTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgLy8gVC5nOjE6MTU6IElEIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUlEXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gVC5nOjE6MTg6IElOVCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1JTlRdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAvLyBULmc6MToyMjogV1MgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtV1NdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKK0BlbmQgLyogZW5kIG9mIFRMZXhlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDM5NyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL1RQYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL1RQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThkMGRlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVFBhcnNlci5oCkBAIC0wLDAgKzEsODcgQEAKKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gVC5nIDIwMTEtMDUtMDYgMTk6MTQ6MjMKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogcGFyc2VySGVhZGVyRmlsZSAqLworI2lmbmRlZiBBTlRMUjNUb2tlblR5cGVBbHJlYWR5RGVmaW5lZAorI2RlZmluZSBBTlRMUjNUb2tlblR5cGVBbHJlYWR5RGVmaW5lZAordHlwZWRlZiBlbnVtIHsKKyAgICBBTlRMUl9FT0YgPSAtMSwKKyAgICBJTlZBTElELAorICAgIEVPUiwKKyAgICBET1dOLAorICAgIFVQLAorICAgIE1JTgorfSBBTlRMUjNUb2tlblR5cGU7CisjZW5kaWYKKworI3ByYWdtYSBtYXJrIFRva2VucworI2lmZGVmIEVPRgorI3VuZGVmIEVPRgorI2VuZGlmCisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBUX183IDcKKyNkZWZpbmUgSUQgNAorI2RlZmluZSBJTlQgNQorI2RlZmluZSBXUyA2CisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorCisvKiBJbnRlcmZhY2UgZ3JhbW1hciBjbGFzcyAqLworQGludGVyZmFjZSBUUGFyc2VyIDogQU5UTFJQYXJzZXIgeyAvKiBsaW5lIDU3MiAqLworLyogT2JqQyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtVmFycyAqLworCisvKiBXaXRoIHRoaXMgdHJ1ZSwgZW51bSBpcyBzZWVuIGFzIGEga2V5d29yZC4gIEZhbHNlLCBpdCdzIGFuIGlkZW50aWZpZXIgKi8KK0JPT0wgZW5hYmxlRW51bTsKKworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgc3RhcnQgb2YgbWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgbWVtVmFycyAqLworCisgfQorCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBzdGFydCBvZiBwcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBwcm9wZXJ0aWVzICovCisKKysgKHZvaWQpIGluaXRpYWxpemU7CisrIChpZCkgbmV3VFBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbTsKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKworLyogT2JqQyBzdGFydCBvZiBtZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgb2YgbWV0aG9kc0RlY2wgKi8KKworLSAodm9pZClzdGF0OyAKKy0gKHZvaWQpaWRlbnRpZmllcjsgCistICh2b2lkKWVudW1Bc0tleXdvcmQ7IAorLSAodm9pZCllbnVtQXNJRDsgCisKKworQGVuZCAvKiBlbmQgb2YgVFBhcnNlciBpbnRlcmZhY2UgKi8KKworLyoqIERlbW9uc3RyYXRlcyBob3cgc2VtYW50aWMgcHJlZGljYXRlcyBnZXQgaG9pc3RlZCBvdXQgb2YgdGhlIHJ1bGUgaW4gCisgKiAgd2hpY2ggdGhleSBhcmUgZm91bmQgYW5kIHVzZWQgaW4gb3RoZXIgZGVjaXNpb25zLiAgVGhpcyBncmFtbWFyIGlsbHVzdHJhdGVzCisgKiAgaG93IHByZWRpY2F0ZXMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlbnVtIGFzIGEga2V5d29yZCBhbmQKKyAqICBhbiBJRCAqZHluYW1pY2FsbHkqLiA6KQorCisgKiBSdW4gImphdmEgb3JnLmFudGxyLlRvb2wgLWRmYSB0LmciIHRvIGdlbmVyYXRlIERPVCAoZ3JhcGh2aXopIGZpbGVzLiAgU2VlCisgKiB0aGUgVF9kZWMtMS5kb3QgZmlsZSB0byBzZWUgdGhlIHByZWRpY2F0ZXMgaW4gYWN0aW9uLgorICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVFBhcnNlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvVFBhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDAyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9UUGFyc2VyLm0KQEAgLTAsMCArMSwzNTQgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogVC5nCisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDIwMTEtMDUtMDYgMTk6MTQ6MjMKKyAqICAgICAtICAgICAgICAgICAgICAgIGZvciB0aGUgcGFyc2VyIDogVFBhcnNlclBhcnNlcgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCisqLworLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBULmcgMjAxMS0wNS0wNiAxOToxNDoyMworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJUUGFyc2VyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiogRGVtb25zdHJhdGVzIGhvdyBzZW1hbnRpYyBwcmVkaWNhdGVzIGdldCBob2lzdGVkIG91dCBvZiB0aGUgcnVsZSBpbiAKKyAqICB3aGljaCB0aGV5IGFyZSBmb3VuZCBhbmQgdXNlZCBpbiBvdGhlciBkZWNpc2lvbnMuICBUaGlzIGdyYW1tYXIgaWxsdXN0cmF0ZXMKKyAqICBob3cgcHJlZGljYXRlcyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVudW0gYXMgYSBrZXl3b3JkIGFuZAorICogIGFuIElEICpkeW5hbWljYWxseSouIDopCisKKyAqIFJ1biAiamF2YSBvcmcuYW50bHIuVG9vbCAtZGZhIHQuZyIgdG8gZ2VuZXJhdGUgRE9UIChncmFwaHZpeikgZmlsZXMuICBTZWUKKyAqIHRoZSBUX2RlYy0xLmRvdCBmaWxlIHRvIHNlZSB0aGUgcHJlZGljYXRlcyBpbiBhY3Rpb24uCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworI3ByYWdtYSBtYXJrIEJpdHNldHMKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2lkZW50aWZpZXJfaW5fc3RhdDM0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfaWRlbnRpZmllcl9pbl9zdGF0MzRfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19lbnVtQXNLZXl3b3JkX2luX3N0YXQ0NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2VudW1Bc0tleXdvcmRfaW5fc3RhdDQ3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSURfaW5faWRlbnRpZmllcjY2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5faWRlbnRpZmllcjY2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZW51bUFzSURfaW5faWRlbnRpZmllcjc0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZW51bUFzSURfaW5faWRlbnRpZmllcjc0X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfN19pbl9lbnVtQXNLZXl3b3JkODk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV183X2luX2VudW1Bc0tleXdvcmQ4OV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzdfaW5fZW51bUFzSUQxMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV183X2luX2VudW1Bc0lEMTAwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorLy8jcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisvLworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisKK0BpbXBsZW1lbnRhdGlvbiBUUGFyc2VyICAvLyBsaW5lIDYzNworCisvKiBPYmpDIHN0YXJ0IG9mIHJ1bGVBdHRyaWJ1dGVTY29wZSAqLworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKy8qIE9iakMgZW5kIG9mIHJ1bGVBdHRyaWJ1dGVTY29wZSAqLworI3ByYWdtYSBtYXJrIGdsb2JhbCBBdHRyaWJ1dGUgU2NvcGVzCisvKiBPYmpDIHN0YXJ0IGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIGVuZCBnbG9iYWxBdHRyaWJ1dGVTY29wZSAqLworLyogT2JqQyBzdGFydCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBlbmQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnRoZXNpemUgKi8KKy8qIE9iakMgc3RhcnQgc3ludGhlc2l6ZSgpICovCisvKiBPYmpDIGVuZCBzeW50aGVzaXplKCkgKi8KKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgICNwcmFnbWEgbWFyayBCaXRzZXRzCisgICAgRk9MTE9XX2lkZW50aWZpZXJfaW5fc3RhdDM0ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfaWRlbnRpZmllcl9pbl9zdGF0MzRfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19lbnVtQXNLZXl3b3JkX2luX3N0YXQ0NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2VudW1Bc0tleXdvcmRfaW5fc3RhdDQ3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSURfaW5faWRlbnRpZmllcjY2ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfSURfaW5faWRlbnRpZmllcjY2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZW51bUFzSURfaW5faWRlbnRpZmllcjc0ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZW51bUFzSURfaW5faWRlbnRpZmllcjc0X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfN19pbl9lbnVtQXNLZXl3b3JkODkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV183X2luX2VudW1Bc0tleXdvcmQ4OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzdfaW5fZW51bUFzSUQxMDAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV183X2luX2VudW1Bc0lEMTAwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldFRva2VuTmFtZXM6W1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aE9iamVjdHM6QCI8aW52YWxpZD4iLCBAIjxFT1I+IiwgQCI8RE9XTj4iLCBAIjxVUD4iLCAKKyBAIklEIiwgQCJJTlQiLCBAIldTIiwgQCInZW51bSciLCBuaWxdIHJldGFpbl1dOworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIlQuZyJdOworfQorCisrIChUUGFyc2VyICopbmV3VFBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHJldHVybiBbW1RQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbV07CisKKworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtIFN0YXRlOltbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjo0KzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisKKworICAgICAgICAvKiBzdGFydCBvZiBhY3Rpb25zLWFjdGlvblNjb3BlLWluaXQgKi8KKworICAgICAgICBlbmFibGVFbnVtID0gTk87CisKKyAgICAgICAgLyogc3RhcnQgb2YgaW5pdCAqLworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBzdGFydCBtZW1iZXJzICovCisvKiBPYmpDIGVuZCBtZW1iZXJzICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworLyogT2JqQyBzdGFydCBydWxlcyAqLworLyoKKyAqICRBTlRMUiBzdGFydCBzdGF0CisgKiBULmc6MjQ6MTogc3RhdCA6ICggaWRlbnRpZmllciB8IGVudW1Bc0tleXdvcmQgKTsKKyAqLworLSAodm9pZCkgc3RhdAoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gVC5nOjI0OjU6ICggaWRlbnRpZmllciB8IGVudW1Bc0tleXdvcmQgKSAvL3J1bGVibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoTEExXzA9PUlEKSApIHsKKyAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggKExBMV8wPT03KSApIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMiA9IFtpbnB1dCBMQToyXTsKKworICAgICAgICAgICAgaWYgKCAoKCFlbmFibGVFbnVtKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICgoZW5hYmxlRW51bSkpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246MSBzdGF0ZToyIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgbnZhZS5jID0gTEExXzI7CisgICAgICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246MSBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBudmFlLmMgPSBMQTFfMDsKKyAgICAgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gVC5nOjI0Ojc6IGlkZW50aWZpZXIgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19pZGVudGlmaWVyX2luX3N0YXQzNF07CisgICAgICAgICAgICAgICAgW3NlbGYgaWRlbnRpZmllcl07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIE5TTG9nKEAiZW51bSBpcyBhbiBJRCIpOworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAgICAgLy8gVC5nOjI1Ojc6IGVudW1Bc0tleXdvcmQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19lbnVtQXNLZXl3b3JkX2luX3N0YXQ0N107CisgICAgICAgICAgICAgICAgW3NlbGYgZW51bUFzS2V5d29yZF07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIE5TTG9nKEAiZW51bSBpcyBhIGtleXdvcmQiKTsKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzdGF0ICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgaWRlbnRpZmllcgorICogVC5nOjI4OjE6IGlkZW50aWZpZXIgOiAoIElEIHwgZW51bUFzSUQgKTsKKyAqLworLSAodm9pZCkgaWRlbnRpZmllcgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gVC5nOjI5OjU6ICggSUQgfCBlbnVtQXNJRCApIC8vcnVsZWJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgIE5TSW50ZWdlciBMQTJfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTJfMD09SUQpICkgeworICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoTEEyXzA9PTcpICkgeworICAgICAgICAgICAgYWx0Mj0yOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjoyIHN0YXRlOjAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIG52YWUuYyA9IExBMl8wOworICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBULmc6Mjk6NzogSUQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpJRCBGb2xsb3c6Rk9MTE9XX0lEX2luX2lkZW50aWZpZXI2Nl07IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIFQuZzozMDo3OiBlbnVtQXNJRCAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2VudW1Bc0lEX2luX2lkZW50aWZpZXI3NF07CisgICAgICAgICAgICAgICAgW3NlbGYgZW51bUFzSURdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGlkZW50aWZpZXIgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBlbnVtQXNLZXl3b3JkCisgKiBULmc6MzM6MTogZW51bUFzS2V5d29yZCA6ey4uLn0/ICdlbnVtJyA7CisgKi8KKy0gKHZvaWQpIGVudW1Bc0tleXdvcmQKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFQuZzozMzoxNTogKHsuLi59PyAnZW51bScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gVC5nOjMzOjE3OiB7Li4ufT8gJ2VudW0nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICggISgoZW5hYmxlRW51bSkpICkgeworICAgICAgICAgICAgQHRocm93IFtBTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbiBuZXdFeGNlcHRpb246QCJlbnVtQXNLZXl3b3JkIiBwcmVkaWNhdGU6QCJlbmFibGVFbnVtIiBzdHJlYW06aW5wdXRdOworICAgICAgICB9CisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjcgRm9sbG93OkZPTExPV183X2luX2VudW1Bc0tleXdvcmQ4OV07IAorCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGVudW1Bc0tleXdvcmQgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBlbnVtQXNJRAorICogVC5nOjM1OjE6IGVudW1Bc0lEIDp7Li4ufT8gJ2VudW0nIDsKKyAqLworLSAodm9pZCkgZW51bUFzSUQKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFQuZzozNToxMDogKHsuLi59PyAnZW51bScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gVC5nOjM1OjEyOiB7Li4ufT8gJ2VudW0nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICggISgoIWVuYWJsZUVudW0pKSApIHsKKyAgICAgICAgICAgIEB0aHJvdyBbQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAiZW51bUFzSUQiIHByZWRpY2F0ZTpAIiFlbmFibGVFbnVtIiBzdHJlYW06aW5wdXRdOworICAgICAgICB9CisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjcgRm9sbG93OkZPTExPV183X2luX2VudW1Bc0lEMTAwXTsgCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZW51bUFzSUQgKi8KKy8qIE9iakMgZW5kIHJ1bGVzICovCisKK0BlbmQgLyogZW5kIG9mIFRQYXJzZXIgaW1wbGVtZW50YXRpb24gbGluZSA2OTIgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL2FudGxyMy5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvYW50bHIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxNjI3OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL2FudGxyMy5oCkBAIC0wLDAgKzEsNzkgQEAKKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZU1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVJlY29nbml6ZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCaXRTZXQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNoYXJTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbVN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vbkVycm9yTm9kZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25Ub2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25Ub2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRGQS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Zy5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50UHJveHkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdFdmVudExpc3RlbmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRXJyb3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkZhc3RRdWV1ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJIYXNoTWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hSdWxlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkludEFycmF5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkludFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMZXhlclJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMaW5rQmFzZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJMb29rYWhlYWRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJOb2RlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlB0ckJ1ZmZlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVNZW1vLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVTdGFjay5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVudGltZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJTdHJlYW1FbnVtZXJhdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmluZ1N0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJTeW1ib2xTdGFjay5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbitEZWJ1Z2dlclN1cHBvcnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW4uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuU291cmNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlSXRlcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlVuYnVmZmVyZWRUb2tlblN0cmVhbS5oPgorLy8jaW1wb3J0IDxBTlRMUi9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbS5oPgorLy8jaW1wb3J0IDxBTlRMUi9BTlRMUlVuYnVmZmVyZWRDb21tb25UcmVlTm9kZVN0cmVhbVN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlVuaXF1ZUlETWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24uaD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL2lucHV0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjYWVmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL2lucHV0CkBAIC0wLDAgKzEgQEAKK2VudW0KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL21haW4ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2hvaXN0ZWRQcmVkaWNhdGVzL21haW4ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdiZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvbWFpbi5tCkBAIC0wLDAgKzEsMzAgQEAKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUi5oPgorI2ltcG9ydCAiVExleGVyLmgiCisjaW1wb3J0ICJUUGFyc2VyLmgiCisKK2ludCBtYWluKCkgeworICAgIE5TRXJyb3IgKmVycm9yOworCU5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisJCisJTlNTdHJpbmcgKnN0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ29udGVudHNPZkZpbGU6QCIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9pbnB1dCIgZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nIGVycm9yOiZlcnJvcl07CisJTlNMb2coQCJpbnB1dCBpcyA6ICVAIiwgc3RyaW5nKTsKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOnN0cmluZ107CisJVExleGVyICpsZXhlciA9IFtUTGV4ZXIgbmV3VExleGVyV2l0aENoYXJTdHJlYW06c3RyZWFtXTsKKwkKKwkvLwlBTlRMUlRva2VuICpjdXJyZW50VG9rZW47CisJLy8Jd2hpbGUgKChjdXJyZW50VG9rZW4gPSBbbGV4ZXIgbmV4dFRva2VuXSkgJiYgW2N1cnJlbnRUb2tlbiB0eXBlXSAhPSBBTlRMUlRva2VuVHlwZUVPRikgeworCS8vCQlOU0xvZyhAIiVAIiwgY3VycmVudFRva2VuKTsKKwkvLwl9CisJCisJQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqdG9rZW5TdHJlYW0gPSBbQU5UTFJDb21tb25Ub2tlblN0cmVhbSBuZXdBTlRMUkNvbW1vblRva2VuU3RyZWFtV2l0aFRva2VuU291cmNlOmxleGVyXTsKKwlUUGFyc2VyICpwYXJzZXIgPSBbW1RQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06dG9rZW5TdHJlYW1dOworCVtwYXJzZXIgc3RhdF07CisJW2xleGVyIHJlbGVhc2VdOworCVtzdHJlYW0gcmVsZWFzZV07CisJW3Rva2VuU3RyZWFtIHJlbGVhc2VdOworCVtwYXJzZXIgcmVsZWFzZV07CisJCisJW3Bvb2wgcmVsZWFzZV07CisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvb3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvaG9pc3RlZFByZWRpY2F0ZXMvb3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTcwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9ob2lzdGVkUHJlZGljYXRlcy9vdXRwdXQKQEAgLTAsMCArMSBAQAorZW51bSBpcyBhbiBJRApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0LnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdC50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNzg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdC50b2tlbnMKQEAgLTAsMCArMSw0IEBACitMRVRURVI9NAorVG9rZW5zPTcKK0RJR0lUPTUKK0lEPTYKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGI4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nCkBAIC0wLDAgKzEsMTYgQEAKK2xleGVyIGdyYW1tYXIgVGVzdExleGVyOworb3B0aW9ucyB7CisJbGFuZ3VhZ2U9T2JqQzsKK30KKworQGhlYWRlciB7fQorCitJRAk6CUxFVFRFUiAoTEVUVEVSIHwgRElHSVQpKgorCTsKKworZnJhZ21lbnQgRElHSVQJOgknMCcuLic5JworCTsKKworZnJhZ21lbnQgTEVUVEVSCisJOgknYScuLid6JyB8ICdBJy4uJ1onCisJOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjMGZkZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gJEFOVExSIDMuMiBBdWcgMDcsIDIwMTAgMjI6MDg6MzggL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3QuZyAyMDEwLTA4LTExIDEzOjI0OjM5CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJhbnRscjMuaCIKKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjZGVmaW5lIERJR0lUIDUKKyNkZWZpbmUgSUQgNgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgTEVUVEVSIDQKK0BpbnRlcmZhY2UgVGVzdExleGVyIDogQU5UTFJMZXhlciB7Cit9CistICh2b2lkKSBtSUQ7IAorLSAodm9pZCkgbURJR0lUOyAKKy0gKHZvaWQpIG1MRVRURVI7IAorLSAodm9pZCkgbVRva2VuczsgCitAZW5kIC8vIGVuZCBvZiBUZXN0IGludGVyZmFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmgub2xkIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuaC5vbGQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjgyNTJjYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmgub2xkCkBAIC0wLDAgKzEsMjkgQEAKKy8vICRBTlRMUiAzLjAgVGVzdC5nbCAyMDA3LTA4LTA0IDE1OjU5OjQzCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUi5oPgorCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgVGVzdExleGVyX0xFVFRFUgk0CisjZGVmaW5lIFRlc3RMZXhlcl9FT0YJLTEKKyNkZWZpbmUgVGVzdExleGVyX1Rva2Vucwk3CisjZGVmaW5lIFRlc3RMZXhlcl9ESUdJVAk1CisjZGVmaW5lIFRlc3RMZXhlcl9JRAk2CisKK0BpbnRlcmZhY2UgVGVzdExleGVyIDogQU5UTFJMZXhlciB7CisgICAgTlNJbnRlZ2VyIF90b2tlblR5cGU7Cit9CisKKworLSAodm9pZCkgbUlEOworLSAodm9pZCkgbURJR0lUOworLSAodm9pZCkgbUxFVFRFUjsKKy0gKHZvaWQpIG1Ub2tlbnM7CisKKworCitAZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5NWY2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLm0KQEAgLTAsMCArMSwyMTAgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogVGVzdExleGVyLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMS0wNS0wNiAxOToxNjoyMgorICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiBUZXN0TGV4ZXJMZXhlcgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCisqLworLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBUZXN0TGV4ZXIuZyAyMDExLTA1LTA2IDE5OjE2OjIyCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlRlc3RMZXhlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzISAqLworQGltcGxlbWVudGF0aW9uIFRlc3RMZXhlciAvLyBsaW5lIDMzMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiVGVzdExleGVyLmciXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gW1tzZWxmIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6YVRva2VuVHlwZV07Cit9CisKKysgKFRlc3RMZXhlciAqKW5ld1Rlc3RMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICByZXR1cm4gW1tUZXN0TGV4ZXIgYWxsb2NdIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0XTsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dCBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46NCsxXSByZXRhaW5dXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworCisvKiBTdGFydCBvZiBSdWxlcyAqLworLy8gJEFOVExSIHN0YXJ0ICJJRCIKKy0gKHZvaWQpIG1JRAoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBJRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBUZXN0TGV4ZXIuZzo4OjQ6ICggTEVUVEVSICggTEVUVEVSIHwgRElHSVQgKSogKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gVGVzdExleGVyLmc6ODo2OiBMRVRURVIgKCBMRVRURVIgfCBESUdJVCApKiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtTEVUVEVSXTsgCisKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEExXzAgPj0gJzAnICYmIExBMV8wIDw9ICc5Jyl8fChMQTFfMCA+PSAnQScgJiYgTEExXzAgPD0gJ1onKXx8KExBMV8wID49ICdhJyAmJiBMQTFfMCA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBUZXN0TGV4ZXIuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIklEIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkRJR0lUIgorLSAodm9pZCkgbURJR0lUCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFRlc3RMZXhlci5nOjExOjE2OiAoICcwJyAuLiAnOScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gVGVzdExleGVyLmc6IC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnMCcpICYmIChbaW5wdXQgTEE6MV0gPD0gJzknKSkpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICB9CisKKworICAgICAgICB9CisKKworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIkRJR0lUIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIkxFVFRFUiIKKy0gKHZvaWQpIG1MRVRURVIKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gVGVzdExleGVyLmc6MTU6MjogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBUZXN0TGV4ZXIuZzogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICdBJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnWicpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ2EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICd6JykpKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJMRVRURVIiICovCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBUZXN0TGV4ZXIuZzoxOjg6ICggSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyBUZXN0TGV4ZXIuZzoxOjEwOiBJRCAvLyBhbHQKKyAgICB7CisgICAgW3NlbGYgbUlEXTsgCisKKworCisgICAgfQorCisKK30KKworQGVuZCAvKiBlbmQgb2YgVGVzdExleGVyIGltcGxlbWVudGF0aW9uIGxpbmUgMzk3ICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIubS5vbGQgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5tLm9sZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDhkZTkyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIubS5vbGQKQEAgLTAsMCArMSwxNTcgQEAKKy8vICRBTlRMUiAzLjAgVGVzdC5nbCAyMDA3LTA4LTA0IDE1OjU5OjQzCisKKyNpbXBvcnQgIlRlc3RMZXhlci5oIgorCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzIQorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyovCitAaW1wbGVtZW50YXRpb24gVGVzdExleGVyCisKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworCWlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dF0pICE9IG5pbCkgeworCX0KKwlyZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworCVtzdXBlciBkZWFsbG9jXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gbmlsOworfQorCistIChOU1N0cmluZyAqKSBncmFtbWFyRmlsZU5hbWUKK3sKKwlyZXR1cm4gQCJUZXN0LmdsIjsKK30KKworCistICh2b2lkKSBtSUQKK3sKKyAgICBAdHJ5IHsKKyAgICAgICAgcnVsZU5lc3RpbmdMZXZlbCsrOworICAgICAgICBpbnQgX3R5cGUgPSBUZXN0TGV4ZXJfSUQ7CisgICAgICAgIC8vIFRlc3QuZ2w6ODo2OiAoIExFVFRFUiAoIExFVFRFUiB8IERJR0lUICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFRlc3QuZ2w6ODo2OiBMRVRURVIgKCBMRVRURVIgfCBESUdJVCApKiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtTEVUVEVSXTsKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAJaW50IExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgCWlmICggKExBMV8wPj0nMCcgJiYgTEExXzA8PSc5Jyl8fChMQTFfMD49J0EnICYmIExBMV8wPD0nWicpfHwoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSApIHsKKyAgICAgICAgICAgIAkJYWx0MSA9IDE7CisgICAgICAgICAgICAJfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgCWNhc2UgMSA6CisgICAgICAgIAkgICAgLy8gVGVzdC5nbDogLy8gYWx0CisgICAgICAgIAkgICAgeworICAgICAgICAJICAgIGlmICgoW2lucHV0IExBOjFdPj0nMCcgJiYgW2lucHV0IExBOjFdPD0nOScpfHwoW2lucHV0IExBOjFdPj0nQScgJiYgW2lucHV0IExBOjFdPD0nWicpfHwoW2lucHV0IExBOjFdPj0nYScgJiYgW2lucHV0IExBOjFdPD0neicpKSB7CisgICAgICAgIAkgICAgCVtpbnB1dCBjb25zdW1lXTsKKworICAgICAgICAJICAgIH0gZWxzZSB7CisgICAgICAgIAkgICAgCUFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAJICAgIAlbc2VsZiByZWNvdmVyOm1zZV07CUB0aHJvdyBtc2U7CisgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgCSAgICB9CisgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAJICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7IGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgc2VsZi0+X3Rva2VuVHlwZSA9IF90eXBlOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIHJ1bGVOZXN0aW5nTGV2ZWwtLTsKKyAgICAgICAgLy8gcnVsZSBjbGVhbnVwCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kIElECisKKworLSAodm9pZCkgbURJR0lUCit7CisgICAgQHRyeSB7CisgICAgICAgIHJ1bGVOZXN0aW5nTGV2ZWwrKzsKKyAgICAgICAgLy8gVGVzdC5nbDoxMToxODogKCAnMCcgLi4gJzknICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFRlc3QuZ2w6MTE6MTg6ICcwJyAuLiAnOScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hSYW5nZUZyb21DaGFyOicwJyB0bzonOSddOworCisgICAgICAgIH0KKworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIHJ1bGVOZXN0aW5nTGV2ZWwtLTsKKyAgICAgICAgLy8gcnVsZSBjbGVhbnVwCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kIERJR0lUCisKKworLSAodm9pZCkgbUxFVFRFUgoreworICAgIEB0cnkgeworICAgICAgICBydWxlTmVzdGluZ0xldmVsKys7CisgICAgICAgIC8vIFRlc3QuZ2w6MTU6NDogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBUZXN0LmdsOiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBpZiAoKFtpbnB1dCBMQToxXT49J0EnICYmIFtpbnB1dCBMQToxXTw9J1onKXx8KFtpbnB1dCBMQToxXT49J2EnICYmIFtpbnB1dCBMQToxXTw9J3onKSkgeworICAgICAgICAJW2lucHV0IGNvbnN1bWVdOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgCVtzZWxmIHJlY292ZXI6bXNlXTsJQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgcnVsZU5lc3RpbmdMZXZlbC0tOworICAgICAgICAvLyBydWxlIGNsZWFudXAKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgTEVUVEVSCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBUZXN0LmdsOjE6MTA6ICggSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAvLyBUZXN0LmdsOjE6MTA6IElEIC8vIGFsdAorICAgIHsKKyAgICBbc2VsZiBtSURdOworCisKKworICAgIH0KKworCit9CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci50b2tlbnMgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwYzA0MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLnRva2VucwpAQCAtMCwwICsxLDMgQEAKK0RJR0lUPTQKK0lEPTUKK0xFVFRFUj02CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlckxleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlckxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkMWNlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyTGV4ZXIuaApAQCAtMCwwICsxLDM5IEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFRlc3RMZXhlci5nIDIwMTEtMDUtMDYgMTk6MTY6MjIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogU3RhcnQgY3ljbGljREZBSW50ZXJmYWNlICovCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjaWZkZWYgRU9GCisjdW5kZWYgRU9GCisjZW5kaWYKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIERJR0lUIDQKKyNkZWZpbmUgSUQgNQorI2RlZmluZSBMRVRURVIgNgorLyogaW50ZXJmYWNlIGxleGVyIGNsYXNzICovCitAaW50ZXJmYWNlIFRlc3RMZXhlciA6IEFOVExSTGV4ZXIgeyAvLyBsaW5lIDI4MworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworfQorKyAodm9pZCkgaW5pdGlhbGl6ZTsKKysgKFRlc3RMZXhlciAqKW5ld1Rlc3RMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQ7CisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMubGV4ZXIubWV0aG9kc0RlY2wgKi8KKy8qIE9iakMgZW5kIGFjdGlvbnMubGV4ZXIubWV0aG9kc0RlY2wgKi8KKy0gKHZvaWQpIG1JRCA7IAorLSAodm9pZCkgbURJR0lUIDsgCistICh2b2lkKSBtTEVUVEVSIDsgCistICh2b2lkKSBtVG9rZW5zIDsgCisKK0BlbmQgLyogZW5kIG9mIFRlc3RMZXhlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9hbnRscjMuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvYW50bHIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxNjI3OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvYW50bHIzLmgKQEAgLTAsMCArMSw3OSBAQAorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uRXJyb3JOb2RlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSREZBLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRQcm94eS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJFcnJvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFzdFF1ZXVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaFJ1bGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50QXJyYXkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxpbmtCYXNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxvb2thaGVhZFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vZGVNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUHRyQnVmZmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZU1lbW8uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN5bWJvbFN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5Tb3VyY2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVJdGVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5pcXVlSURNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9tYWluLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL21haW4ubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9tYWluLm0KQEAgLTAsMCArMSwyMyBAQAorI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgIlRlc3RMZXhlci5oIgorI2ltcG9ydCAiYW50bHIzLmgiCisjaW1wb3J0IDx1bmlzdGQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCit7CisJTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKwkKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAiYWJCOUNkZDQ0Il07CisJVGVzdExleGVyICpsZXhlciA9IFtbVGVzdExleGVyIGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06c3RyZWFtXTsKKwlpZDxBTlRMUlRva2VuPiBjdXJyZW50VG9rZW47CisJd2hpbGUgKChjdXJyZW50VG9rZW4gPSBbW2xleGVyIG5leHRUb2tlbl0gcmV0YWluXSkgJiYgW2N1cnJlbnRUb2tlbiBnZXRUeXBlXSAhPSBBTlRMUlRva2VuVHlwZUVPRikgeworCQlOU0xvZyhAIiVAIiwgY3VycmVudFRva2VuKTsKKwl9CisJW2xleGVyIHJlbGVhc2VdOworCVtzdHJlYW0gcmVsZWFzZV07CisJCisJW3Bvb2wgcmVsZWFzZV07CisgICAgLy8gc2xlZXAgZm9yIG9iamVjdGFsbG9jCisgICAgLy8gd2hpbGUgKDEpIHNsZWVwKDYwKTsKKwlyZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL291dHB1dDEvVGVzdC50b2tlbnMgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL291dHB1dDEvVGVzdC50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMGZjNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvb3V0cHV0MS9UZXN0LnRva2VucwpAQCAtMCwwICsxLDMgQEAKK0RJR0lUPTUKK0lEPTYKK0xFVFRFUj00CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL291dHB1dDEvVGVzdExleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL291dHB1dDEvVGVzdExleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmMTY5MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvb3V0cHV0MS9UZXN0TGV4ZXIuaApAQCAtMCwwICsxLDI2IEBACisvLyAkQU5UTFIgMy4yIEF1ZyAwNywgMjAxMCAyMjowODozOCAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdC5nIDIwMTAtMDgtMTEgMTM6MjQ6MzkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgImFudGxyMy5oIgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgRElHSVQgNQorI2RlZmluZSBJRCA2CisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBMRVRURVIgNAorQGludGVyZmFjZSBUZXN0IDogQU5UTFJMZXhlciB7Cit9CistICh2b2lkKSBtSUQ7IAorLSAodm9pZCkgbURJR0lUOyAKKy0gKHZvaWQpIG1MRVRURVI7IAorLSAodm9pZCkgbVRva2VuczsgCitAZW5kIC8vIGVuZCBvZiBUZXN0IGludGVyZmFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvb3V0cHV0MS9UZXN0TGV4ZXIudG9rZW5zIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9vdXRwdXQxL1Rlc3RMZXhlci50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMGZjNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvb3V0cHV0MS9UZXN0TGV4ZXIudG9rZW5zCkBAIC0wLDAgKzEsMyBAQAorRElHSVQ9NQorSUQ9NgorTEVUVEVSPTQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvb3V0cHV0MS9UZXN0TGV4ZXJMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9vdXRwdXQxL1Rlc3RMZXhlckxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MGFiMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvb3V0cHV0MS9UZXN0TGV4ZXJMZXhlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vICRBTlRMUiAzLjIgQXVnIDA3LCAyMDEwIDIyOjA4OjM4IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuZyAyMDEwLTA4LTExIDEzOjQxOjQ0CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJhbnRscjMuaCIKKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjZGVmaW5lIERJR0lUIDUKKyNkZWZpbmUgSUQgNgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgTEVUVEVSIDQKK0BpbnRlcmZhY2UgVGVzdExleGVyIDogQU5UTFJMZXhlciB7Cit9CistICh2b2lkKSBtSUQ7IAorLSAodm9pZCkgbURJR0lUOyAKKy0gKHZvaWQpIG1MRVRURVI7IAorLSAodm9pZCkgbVRva2VuczsgCitAZW5kIC8vIGVuZCBvZiBUZXN0TGV4ZXIgaW50ZXJmYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9vdXRwdXQxL1Rlc3RsZXhlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9vdXRwdXQxL1Rlc3RsZXhlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjM5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL291dHB1dDEvVGVzdGxleGVyLm0KQEAgLTAsMCArMSwyMTYgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDMuMiBBdWcgMDcsIDIwMTAgMjI6MDg6MzgKKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDEwLTA4LTExIDEzOjQxOjQ0CisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IFRlc3RMZXhlckxleGVyICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4gCisgKgorICogQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgSmltIElkbGUsIGppbWl8aGVyZWlzYW5hdHxpZGxlfGRvdGdvZXNoZXJlfHdzLgorICoKKyAqCisqLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAkQU5UTFIgMy4yIEF1ZyAwNywgMjAxMCAyMjowODozOCAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmcgMjAxMC0wOC0xMSAxMzo0MTo0NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiVGVzdExleGVyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzIQorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyovCitAaW1wbGVtZW50YXRpb24gVGVzdExleGVyCisKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIi91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuZyJdOworfQorCistIChpZCkgaW5pdFdpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46NCsxXV0pICE9IG5pbCkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gW1tzZWxmIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6YVRva2VuVHlwZV07Cit9CisKKy8vICRBTlRMUiBzdGFydCAiSUQiCistICh2b2lkKSBtSUQKK3sKKyAgICAvLworICAgIC8vIFRoaXMgaXMgbm90IGluIHRoZSBKYXZhLnN0ZworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElEOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuZzo4OjQ6ICggTEVUVEVSICggTEVUVEVSIHwgRElHSVQgKSogKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nOjg6NjogTEVUVEVSICggTEVUVEVSIHwgRElHSVQgKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1MRVRURVJdOworCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxPTI7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgICAgIGlmICggKExBMV8wPj0nMCcgJiYgTEExXzA8PSc5Jyl8fChMQTFfMD49J0EnICYmIExBMV8wPD0nWicpfHwoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nOiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKFtpbnB1dCBMQToxXT49JzAnICYmIFtpbnB1dCBMQToxXTw9JzknKXx8KFtpbnB1dCBMQToxXT49J0EnICYmIFtpbnB1dCBMQToxXTw9J1onKXx8KFtpbnB1dCBMQToxXT49J2EnICYmIFtpbnB1dCBMQToxXTw9J3onKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7fQorICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMTogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgSUQKKworLy8gJEFOVExSIHN0YXJ0ICJESUdJVCIKKy0gKHZvaWQpIG1ESUdJVAoreworICAgIC8vCisgICAgLy8gVGhpcyBpcyBub3QgaW4gdGhlIEphdmEuc3RnCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nOjExOjE2OiAoICcwJyAuLiAnOScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nOjExOjE4OiAnMCcgLi4gJzknIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoUmFuZ2VGcm9tQ2hhcjonMCcgdG86JzknXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgRElHSVQKKworLy8gJEFOVExSIHN0YXJ0ICJMRVRURVIiCistICh2b2lkKSBtTEVUVEVSCit7CisgICAgLy8KKyAgICAvLyBUaGlzIGlzIG5vdCBpbiB0aGUgSmF2YS5zdGcKKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmc6MTU6MjogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL2xleGVydGVzdC1zaW1wbGUvVGVzdExleGVyLmc6IC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICgoW2lucHV0IExBOjFdPj0nQScgJiYgW2lucHV0IExBOjFdPD0nWicpfHwoW2lucHV0IExBOjFdPj0nYScgJiYgW2lucHV0IExBOjFdPD0neicpKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTt9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kIExFVFRFUgorCistICh2b2lkKSBtVG9rZW5zCit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9sZXhlcnRlc3Qtc2ltcGxlL1Rlc3RMZXhlci5nOjE6ODogKCBJRCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvbGV4ZXJ0ZXN0LXNpbXBsZS9UZXN0TGV4ZXIuZzoxOjEwOiBJRCAvLyBhbHQKKyAgICB7CisgICAgICAgIFtzZWxmIG1JRF07CisKKyAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAvKiBlbGVtZW50cyAqLworICAgIH0KKworCit9CisKK0BlbmQgLy8gZW5kIG9mIFRlc3RMZXhlciBpbXBsZW1lbnRhdGlvbgorCisvKiBFbmQgb2YgY29kZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmcgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDAxZDAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmcKQEAgLTAsMCArMSw3NSBAQAorZ3JhbW1hciBTeW1ib2xUYWJsZTsKKworLyogU2NvcGUgb2Ygc3ltYm9sIG5hbWVzLiAgQm90aCBnbG9iYWxzIGFuZCBibG9jayBydWxlcyBuZWVkIHRvIHB1c2ggYSBuZXcKKyAqIHN5bWJvbCB0YWJsZSB1cG9uIGVudHJ5IGFuZCB0aGV5IG11c3QgdXNlIHRoZSBzYW1lIHN0YWNrLiAgU28sIEkgbXVzdAorICogZGVmaW5lIGEgZ2xvYmFsIHNjb3BlIGFuZCBzYXkgdGhhdCBnbG9iYWxzIGFuZCBibG9jayB1c2UgdGhpcyBieSBzYXlpbmcKKyAqICdzY29wZSBTeW1ib2xzOycgaW4gdGhvc2UgcnVsZSBkZWZpbml0aW9ucy4KKyAqLworCitvcHRpb25zIHsKKwlsYW5ndWFnZT1PYmpDOworfQorCitzY29wZSBTeW1ib2xzIHsKKyAgQU5UTFJQdHJCdWZmZXIgKm5hbWVzOworfQorCitAbWVtVmFycyB7CitpbnQgbGV2ZWw7Cit9CisKK0Bpbml0IHsKK2xldmVsID0gMDsKK30KKworcHJvZworLy8gc2NvcGUgU3ltYm9sczsKKyAgICA6ICAgZ2xvYmFscyAobWV0aG9kKSoKKyAgICA7CisKK2dsb2JhbHMKK3Njb3BlIFN5bWJvbHM7CitAaW5pdCB7CisgICAgbGV2ZWwrKzsKKyAgICAkU3ltYm9sczo6bmFtZXMgPSBbQU5UTFJQdHJCdWZmZXIgbmV3QU5UTFJQdHJCdWZmZXJXaXRoTGVuOjEwXTsKK30KKyAgICA6ICAgKGRlY2wpKgorICAgICAgICB7CisgICAgICAgICAgICBOU0xvZyggQCJnbG9iYWxzOiBcJUAiLCBbJFN5bWJvbHM6Om5hbWVzIHRvU3RyaW5nXSApOworICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgfQorICAgIDsKKworbWV0aG9kCisgICAgOiAgICdtZXRob2QnIElEICcoJyAnKScgYmxvY2sKKyAgICA7CisKK2Jsb2NrCitzY29wZSBTeW1ib2xzOworQGluaXQgeworICAgIGxldmVsKys7CisgICAgJFN5bWJvbHM6Om5hbWVzID0gW0FOVExSUHRyQnVmZmVyIG5ld0FOVExSUHRyQnVmZmVyV2l0aExlbjoxMF07Cit9CisgICAgOiAgICd7JyAoZGVjbCkqIChzdGF0KSogJ30nCisgICAgICAgIHsKKyAgICAgICAgICAgIE5TTG9nKCBAImxldmVsIFwlZCBzeW1ib2xzOiBcJUAiLCBsZXZlbCwgWyRTeW1ib2xzOjpuYW1lcyB0b1N0cmluZ10gKTsKKyAgICAgICAgICAgIGxldmVsLS07CisgICAgICAgIH0KKyAgICA7CisKK3N0YXQ6ICAgSUQgJz0nIElOVCAnOycKKyAgICB8ICAgYmxvY2sKKyAgICA7CisKK2RlY2w6ICAgJ2ludCcgSUQgJzsnCisgICAgICAgIHtbJFN5bWJvbHM6Om5hbWVzIGFkZE9iamVjdDokSURdO30gLy8gYWRkIHRvIGN1cnJlbnQgc3ltYm9sIHRhYmxlCisgICAgOworCitJRCAgOiAgICgnYScuLid6JykrCisgICAgOworCitJTlQgOiAgICgnMCcuLic5JykrCisgICAgOworCitXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPUhJRERFTjt9CisgICAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlNDNlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS50b2tlbnMKQEAgLTAsMCArMSwxOSBAQAorVF9fNz03CitUX184PTgKK1RfXzk9OQorVF9fMTA9MTAKK1RfXzExPTExCitUX18xMj0xMgorVF9fMTM9MTMKK1RfXzE0PTE0CitJRD00CitJTlQ9NQorV1M9NgorJygnPTcKKycpJz04CisnOyc9OQorJz0nPTEwCisnaW50Jz0xMQorJ21ldGhvZCc9MTIKKyd7Jz0xMworJ30nPTE0CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg5NTIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlTGV4ZXIuaApAQCAtMCwwICsxLDU1IEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFN5bWJvbFRhYmxlLmcgMjAxMS0wNS0wNiAxNTowNDo0MworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBTdGFydCBjeWNsaWNERkFJbnRlcmZhY2UgKi8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgVF9fNyA3CisjZGVmaW5lIFRfXzggOAorI2RlZmluZSBUX185IDkKKyNkZWZpbmUgVF9fMTAgMTAKKyNkZWZpbmUgVF9fMTEgMTEKKyNkZWZpbmUgVF9fMTIgMTIKKyNkZWZpbmUgVF9fMTMgMTMKKyNkZWZpbmUgVF9fMTQgMTQKKyNkZWZpbmUgSUQgNAorI2RlZmluZSBJTlQgNQorI2RlZmluZSBXUyA2CisvKiBpbnRlcmZhY2UgbGV4ZXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgU3ltYm9sVGFibGVMZXhlciA6IEFOVExSTGV4ZXIgeyAvLyBsaW5lIDI4MworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworfQorKyAodm9pZCkgaW5pdGlhbGl6ZTsKKysgKFN5bWJvbFRhYmxlTGV4ZXIgKiluZXdTeW1ib2xUYWJsZUxleGVyV2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKy8qIE9iakMgc3RhcnQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLSAodm9pZCkgbVRfXzcgOyAKKy0gKHZvaWQpIG1UX184IDsgCistICh2b2lkKSBtVF9fOSA7IAorLSAodm9pZCkgbVRfXzEwIDsgCistICh2b2lkKSBtVF9fMTEgOyAKKy0gKHZvaWQpIG1UX18xMiA7IAorLSAodm9pZCkgbVRfXzEzIDsgCistICh2b2lkKSBtVF9fMTQgOyAKKy0gKHZvaWQpIG1JRCA7IAorLSAodm9pZCkgbUlOVCA7IAorLSAodm9pZCkgbVdTIDsgCistICh2b2lkKSBtVG9rZW5zIDsgCisKK0BlbmQgLyogZW5kIG9mIFN5bWJvbFRhYmxlTGV4ZXIgaW50ZXJmYWNlICovCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZUxleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVMZXhlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVMZXhlci5tCkBAIC0wLDAgKzEsNzk5IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IFN5bWJvbFRhYmxlLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMS0wNS0wNiAxNTowNDo0MworICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiBTeW1ib2xUYWJsZUxleGVyTGV4ZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gU3ltYm9sVGFibGUuZyAyMDExLTA1LTA2IDE1OjA0OjQzCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlN5bWJvbFRhYmxlTGV4ZXIuaCIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworLyoqIEFzIHBlciBUZXJlbmNlOiBObyByZXR1cm5zIGZvciBsZXhlciBydWxlcyEgKi8KK0BpbXBsZW1lbnRhdGlvbiBTeW1ib2xUYWJsZUxleGVyIC8vIGxpbmUgMzMwCisKKysgKHZvaWQpIGluaXRpYWxpemUKK3sKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRHcmFtbWFyRmlsZU5hbWU6QCJTeW1ib2xUYWJsZS5nIl07Cit9CisKKysgKE5TU3RyaW5nICopIHRva2VuTmFtZUZvclR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OmFUb2tlblR5cGVdOworfQorCisrIChTeW1ib2xUYWJsZUxleGVyICopbmV3U3ltYm9sVGFibGVMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICByZXR1cm4gW1tTeW1ib2xUYWJsZUxleGVyIGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjEyKzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIFN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisKKy8qIFN0YXJ0IG9mIFJ1bGVzICovCisvLyAkQU5UTFIgc3RhcnQgIlRfXzciCistICh2b2lkKSBtVF9fNworeworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX183OworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6Nzo2OiAoICcoJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjc6ODogJygnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKCddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fNyIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX184IgorLSAodm9pZCkgbVRfXzgKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fODsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjg6NjogKCAnKScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo4Ojg6ICcpJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JyknXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzgiICovCisKKy8vICRBTlRMUiBzdGFydCAiVF9fOSIKKy0gKHZvaWQpIG1UX185Cit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzk7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo5OjY6ICggJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6OTo4OiAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX185IiAqLworCisvLyAkQU5UTFIgc3RhcnQgIlRfXzEwIgorLSAodm9pZCkgbVRfXzEwCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzEwOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MTA6NzogKCAnPScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxMDo5OiAnPScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic9J107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xMCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMSIKKy0gKHZvaWQpIG1UX18xMQoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjExOjc6ICggJ2ludCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxMTo5OiAnaW50JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImludCJdOyAKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xMSIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMiIKKy0gKHZvaWQpIG1UX18xMgoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjEyOjc6ICggJ21ldGhvZCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxMjo5OiAnbWV0aG9kJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAIm1ldGhvZCJdOyAKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xMiIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMyIKKy0gKHZvaWQpIG1UX18xMworeworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjEzOjc6ICggJ3snICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MTM6OTogJ3snIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjoneyddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiVF9fMTMiICovCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMTQiCistICh2b2lkKSBtVF9fMTQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMTQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxNDo3OiAoICd9JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjE0Ojk6ICd9JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J30nXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIlRfXzE0IiAqLworCisvLyAkQU5UTFIgc3RhcnQgIklEIgorLSAodm9pZCkgbUlECit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElEOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6Njg6NTogKCAoICdhJyAuLiAneicgKSsgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo2ODo5OiAoICdhJyAuLiAneicgKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo2ODo5OiAoICdhJyAuLiAneicgKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDEgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MSA9IDI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEExXzAgPj0gJ2EnICYmIExBMV8wIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjppbnB1dCBkZWNpc2lvbk51bWJlcjoxXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDErKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDE6IDsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiSUQiICovCisKKy8vICRBTlRMUiBzdGFydCAiSU5UIgorLSAodm9pZCkgbUlOVAoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBJTlQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo3MTo1OiAoICggJzAnIC4uICc5JyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjcxOjk6ICggJzAnIC4uICc5JyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjcxOjk6ICggJzAnIC4uICc5JyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MiA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTJfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTJfMCA+PSAnMCcgJiYgTEEyXzAgPD0gJzknKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQyID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMjsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOmlucHV0IGRlY2lzaW9uTnVtYmVyOjJdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MisrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjogOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJJTlQiICovCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo3NDo1OiAoICggJyAnIHwgJ1xcbicgfCAnXFxyJyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjc0Ojk6ICggJyAnIHwgJ1xcbicgfCAnXFxyJyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjc0Ojk6ICggJyAnIHwgJ1xcbicgfCAnXFxyJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBM18wPT0nXG4nfHxMQTNfMD09J1xyJ3x8TEEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFtpbnB1dCBMQToxXSA9PSAnXG4nfHxbaW5wdXQgTEE6MV0gPT0gJ1xyJ3x8W2lucHV0IExBOjFdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQzID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOmlucHV0IGRlY2lzaW9uTnVtYmVyOjNdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MysrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMzogOworCisKKyAgICAgICAgX2NoYW5uZWw9SElEREVOOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJXUyIgKi8KKworLSAodm9pZCkgbVRva2VucworeworICAgIC8vIFN5bWJvbFRhYmxlLmc6MTo4OiAoIFRfXzcgfCBUX184IHwgVF9fOSB8IFRfXzEwIHwgVF9fMTEgfCBUX18xMiB8IFRfXzEzIHwgVF9fMTQgfCBJRCB8IElOVCB8IFdTICkgLy9ydWxlYmxvY2sKKyAgICBOU0ludGVnZXIgYWx0ND0xMTsKKyAgICB1bmljaGFyIGNoYXJMQTQgPSBbaW5wdXQgTEE6MV07CisgICAgc3dpdGNoIChjaGFyTEE0KSB7CisgICAgICAgIGNhc2UgJygnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc7JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz0nOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfNSA9IFtpbnB1dCBMQToyXTsKKworICAgICAgICAgICAgaWYgKCAoTEE0XzU9PSduJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xMiA9IFtpbnB1dCBMQTozXTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNF8xMj09J3QnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xNCA9IFtpbnB1dCBMQTo0XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE0XzE0ID49ICdhJyAmJiBMQTRfMTQgPD0gJ3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWx0NCA9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfNiA9IFtpbnB1dCBMQToyXTsKKworICAgICAgICAgICAgaWYgKCAoTEE0XzY9PSdlJykgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xMyA9IFtpbnB1dCBMQTozXTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNF8xMz09J3QnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xNSA9IFtpbnB1dCBMQTo0XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTRfMTU9PSdoJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzE3ID0gW2lucHV0IExBOjVdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTRfMTc9PSdvJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xOCA9IFtpbnB1dCBMQTo2XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBNF8xOD09J2QnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xOSA9IFtpbnB1dCBMQTo3XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE0XzE5ID49ICdhJyAmJiBMQTRfMTkgPD0gJ3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gOTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NCA9IDk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWx0NCA9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAneyc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9NzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd9JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND04OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOiA7CisgICAgICAgIGNhc2UgJ2InOiA7CisgICAgICAgIGNhc2UgJ2MnOiA7CisgICAgICAgIGNhc2UgJ2QnOiA7CisgICAgICAgIGNhc2UgJ2UnOiA7CisgICAgICAgIGNhc2UgJ2YnOiA7CisgICAgICAgIGNhc2UgJ2cnOiA7CisgICAgICAgIGNhc2UgJ2gnOiA7CisgICAgICAgIGNhc2UgJ2onOiA7CisgICAgICAgIGNhc2UgJ2snOiA7CisgICAgICAgIGNhc2UgJ2wnOiA7CisgICAgICAgIGNhc2UgJ24nOiA7CisgICAgICAgIGNhc2UgJ28nOiA7CisgICAgICAgIGNhc2UgJ3AnOiA7CisgICAgICAgIGNhc2UgJ3EnOiA7CisgICAgICAgIGNhc2UgJ3InOiA7CisgICAgICAgIGNhc2UgJ3MnOiA7CisgICAgICAgIGNhc2UgJ3QnOiA7CisgICAgICAgIGNhc2UgJ3UnOiA7CisgICAgICAgIGNhc2UgJ3YnOiA7CisgICAgICAgIGNhc2UgJ3cnOiA7CisgICAgICAgIGNhc2UgJ3gnOiA7CisgICAgICAgIGNhc2UgJ3knOiA7CisgICAgICAgIGNhc2UgJ3onOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnMCc6IDsKKyAgICAgICAgY2FzZSAnMSc6IDsKKyAgICAgICAgY2FzZSAnMic6IDsKKyAgICAgICAgY2FzZSAnMyc6IDsKKyAgICAgICAgY2FzZSAnNCc6IDsKKyAgICAgICAgY2FzZSAnNSc6IDsKKyAgICAgICAgY2FzZSAnNic6IDsKKyAgICAgICAgY2FzZSAnNyc6IDsKKyAgICAgICAgY2FzZSAnOCc6IDsKKyAgICAgICAgY2FzZSAnOSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nOiA7CisgICAgICAgIGNhc2UgJ1xyJzogOworICAgICAgICBjYXNlICcgJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND0xMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogOworICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjQgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICBudmFlLmMgPSBjaGFyTEE0OworICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgIH0KKworICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjE6MTA6IFRfXzcgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtVF9fN107IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MToxNTogVF9fOCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX184XTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxOjIwOiBUX185IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRfXzldOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjE6MjU6IFRfXzEwIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRfXzEwXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1IDogOworICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxOjMxOiBUX18xMSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xMV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNiA6IDsKKyAgICAgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MTozNzogVF9fMTIgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtVF9fMTJdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDcgOiA7CisgICAgICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjE6NDM6IFRfXzEzIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVRfXzEzXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4IDogOworICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxOjQ5OiBUX18xNCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xNF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOSA6IDsKKyAgICAgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MTo1NTogSUQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtSURdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwIDogOworICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoxOjU4OiBJTlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtSU5UXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMSA6IDsKKyAgICAgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MTo2MjogV1MgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtV1NdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKK0BlbmQgLyogZW5kIG9mIFN5bWJvbFRhYmxlTGV4ZXIgaW1wbGVtZW50YXRpb24gbGluZSAzOTcgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVQYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzA5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVQYXJzZXIuaApAQCAtMCwwICsxLDExMyBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBTeW1ib2xUYWJsZS5nIDIwMTEtMDUtMDYgMTU6MDQ6NDIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogcGFyc2VySGVhZGVyRmlsZSAqLworI2lmbmRlZiBBTlRMUjNUb2tlblR5cGVBbHJlYWR5RGVmaW5lZAorI2RlZmluZSBBTlRMUjNUb2tlblR5cGVBbHJlYWR5RGVmaW5lZAordHlwZWRlZiBlbnVtIHsKKyAgICBBTlRMUl9FT0YgPSAtMSwKKyAgICBJTlZBTElELAorICAgIEVPUiwKKyAgICBET1dOLAorICAgIFVQLAorICAgIE1JTgorfSBBTlRMUjNUb2tlblR5cGU7CisjZW5kaWYKKworI3ByYWdtYSBtYXJrIFRva2VucworI2lmZGVmIEVPRgorI3VuZGVmIEVPRgorI2VuZGlmCisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBUX183IDcKKyNkZWZpbmUgVF9fOCA4CisjZGVmaW5lIFRfXzkgOQorI2RlZmluZSBUX18xMCAxMAorI2RlZmluZSBUX18xMSAxMQorI2RlZmluZSBUX18xMiAxMgorI2RlZmluZSBUX18xMyAxMworI2RlZmluZSBUX18xNCAxNAorI2RlZmluZSBJRCA0CisjZGVmaW5lIElOVCA1CisjZGVmaW5lIFdTIDYKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKKy8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlICovCitAaW50ZXJmYWNlIFN5bWJvbHNfU2NvcGUgOiBBTlRMUlN5bWJvbHNTY29wZSB7CitBTlRMUlB0ckJ1ZmZlciAqIG5hbWVzOworCit9CisvKiBzdGFydCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZUludGVyZmFjZSBwcm9wZXJ0aWVzICovCisKK0Bwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0bmFtZXMsIHNldHRlcj1zZXRuYW1lczopIEFOVExSUHRyQnVmZmVyICogbmFtZXM7CisKKy8qIGVuZCBnbG9iYWxBdHRyaWJ1dGVTY29wZUludGVyZmFjZSBwcm9wZXJ0aWVzICovCisKKworKyAoU3ltYm9sc19TY29wZSAqKW5ld1N5bWJvbHNfU2NvcGU7CistIChpZCkgaW5pdDsKKy8qIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlIG1ldGhvZHNEZWNsICovCisKKy0gKEFOVExSUHRyQnVmZmVyICopZ2V0bmFtZXM7CistICh2b2lkKXNldG5hbWVzOihBTlRMUlB0ckJ1ZmZlciAqKWFWYWw7CisKKy8qIEVuZCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZUludGVyZmFjZSBtZXRob2RzRGVjbCAqLworCitAZW5kIC8qIGVuZCBvZiBTeW1ib2xzX1Njb3BlIGludGVyZmFjZSAqLworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorCisvKiBJbnRlcmZhY2UgZ3JhbW1hciBjbGFzcyAqLworQGludGVyZmFjZSBTeW1ib2xUYWJsZVBhcnNlciA6IEFOVExSUGFyc2VyIHsgLyogbGluZSA1NzIgKi8KKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisKKworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisvKiBPYmpDIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworLy9BTlRMUlN5bWJvbFN0YWNrICpnU3RhY2s7CitBTlRMUlN5bWJvbFN0YWNrICpTeW1ib2xzX3N0YWNrOworU3ltYm9sc19TY29wZSAqU3ltYm9sc19zY29wZTsKKworLyogT2JqQyBlbmQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKworaW50IGxldmVsOworCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtVmFycyAqLworLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzICovCisvKiBPYmpDIGVuZCBvZiBtZW1WYXJzICovCisKKyB9CisKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wcm9wZXJ0aWVzICovCisvKiBPYmpDIHN0YXJ0IG9mIHByb3BlcnRpZXMgKi8KKy8qIE9iakMgZW5kIG9mIHByb3BlcnRpZXMgKi8KKworKyAodm9pZCkgaW5pdGlhbGl6ZTsKKysgKGlkKSBuZXdTeW1ib2xUYWJsZVBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbTsKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKworLyogT2JqQyBzdGFydCBvZiBtZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgb2YgbWV0aG9kc0RlY2wgKi8KKworLSAodm9pZClwcm9nOyAKKy0gKHZvaWQpZ2xvYmFsczsgCistICh2b2lkKW1ldGhvZDsgCistICh2b2lkKWJsb2NrOyAKKy0gKHZvaWQpc3RhdDsgCistICh2b2lkKWRlY2w7IAorCisKK0BlbmQgLyogZW5kIG9mIFN5bWJvbFRhYmxlUGFyc2VyIGludGVyZmFjZSAqLworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVQYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZVBhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmIzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVQYXJzZXIubQpAQCAtMCwwICsxLDYwMSBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBPQkpDIHNvdXJjZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiBTeW1ib2xUYWJsZS5nCisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDIwMTEtMDUtMDYgMTU6MDQ6NDIKKyAqICAgICAtICAgICAgICAgICAgICAgIGZvciB0aGUgcGFyc2VyIDogU3ltYm9sVGFibGVQYXJzZXJQYXJzZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gU3ltYm9sVGFibGUuZyAyMDExLTA1LTA2IDE1OjA0OjQyCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlN5bWJvbFRhYmxlUGFyc2VyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKyNwcmFnbWEgbWFyayBCaXRzZXRzCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19nbG9iYWxzX2luX3Byb2c1MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2dsb2JhbHNfaW5fcHJvZzUwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAxMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfbWV0aG9kX2luX3Byb2c1MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX21ldGhvZF9pbl9wcm9nNTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDEwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19kZWNsX2luX2dsb2JhbHM4NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xfaW5fZ2xvYmFsczg1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwODAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTJfaW5fbWV0aG9kMTE2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTJfaW5fbWV0aG9kMTE2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDEwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSURfaW5fbWV0aG9kMTE4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fbWV0aG9kMTE4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDgwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfN19pbl9tZXRob2QxMjA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV183X2luX21ldGhvZDEyMF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDEwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzhfaW5fbWV0aG9kMTIyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfOF9pbl9tZXRob2QxMjJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDIwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ibG9ja19pbl9tZXRob2QxMjQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9tZXRob2QxMjRfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xM19pbl9ibG9jazE1MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzEzX2luX2Jsb2NrMTUzX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA2ODEwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbF9pbl9ibG9jazE1NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xfaW5fYmxvY2sxNTZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDY4MTBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zdGF0X2luX2Jsb2NrMTYxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfc3RhdF9pbl9ibG9jazE2MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwNjAxMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzE0X2luX2Jsb2NrMTY1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTRfaW5fYmxvY2sxNjVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JRF9pbl9zdGF0MTg5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fc3RhdDE4OV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzEwX2luX3N0YXQxOTE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18xMF9pbl9zdGF0MTkxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDIwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSU5UX2luX3N0YXQxOTM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19JTlRfaW5fc3RhdDE5M19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDIwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzlfaW5fc3RhdDE5NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzlfaW5fc3RhdDE5NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX3N0YXQyMDU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9zdGF0MjA1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTFfaW5fZGVjbDIxOTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzExX2luX2RlY2wyMTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMTBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JRF9pbl9kZWNsMjIxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fZGVjbDIyMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDIwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzlfaW5fZGVjbDIyMzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzlfaW5fZGVjbDIyM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKKworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCitAaW1wbGVtZW50YXRpb24gU3ltYm9sc19TY29wZSAgLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVJbXBsZW1lbnRhdGlvbiAqLworLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTc1MCAqLworCitAc3ludGhlc2l6ZSBuYW1lczsKKworKyAoU3ltYm9sc19TY29wZSAqKW5ld1N5bWJvbHNfU2NvcGUKK3sKKyAgICByZXR1cm4gW1tbU3ltYm9sc19TY29wZSBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisvKiBzdGFydCBvZiBpdGVyYXRlIGdldCBhbmQgc2V0IGZ1bmN0aW9ucyAqLworCistIChBTlRMUlB0ckJ1ZmZlciAqKWdldG5hbWVzIHsgcmV0dXJuKCBuYW1lcyApOyB9CisKKy0gKHZvaWQpc2V0bmFtZXM6KEFOVExSUHRyQnVmZmVyICopYVZhbCB7IG5hbWVzID0gYVZhbDsgfQorCisvKiBFbmQgb2YgaXRlcmF0ZSBnZXQgYW5kIHNldCBmdW5jdGlvbnMgKi8KKworQGVuZCAvKiBlbmQgb2YgU3ltYm9sc19TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKKy8vI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorLy8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorCitAaW1wbGVtZW50YXRpb24gU3ltYm9sVGFibGVQYXJzZXIgIC8vIGxpbmUgNjM3CisKKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgZ2xvYmFsIEF0dHJpYnV0ZSBTY29wZXMKKy8qIE9iakMgc3RhcnQgZ2xvYmFsQXR0cmlidXRlU2NvcGUgKi8KK3N0YXRpYyBfc3RhY2s7CisKKy8qIE9iakMgZW5kIGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW50aGVzaXplICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBzdGFydCBzeW50aGVzaXplKCkgKi8KKy8qIE9iakMgZW5kIHN5bnRoZXNpemUoKSAqLworCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfZ2xvYmFsc19pbl9wcm9nNTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19nbG9iYWxzX2luX3Byb2c1MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX21ldGhvZF9pbl9wcm9nNTMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19tZXRob2RfaW5fcHJvZzUzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZGVjbF9pbl9nbG9iYWxzODUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsX2luX2dsb2JhbHM4NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzEyX2luX21ldGhvZDExNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzEyX2luX21ldGhvZDExNl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX21ldGhvZDExOCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX21ldGhvZDExOF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzdfaW5fbWV0aG9kMTIwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfN19pbl9tZXRob2QxMjBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV184X2luX21ldGhvZDEyMiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzhfaW5fbWV0aG9kMTIyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYmxvY2tfaW5fbWV0aG9kMTI0ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fbWV0aG9kMTI0X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTNfaW5fYmxvY2sxNTMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xM19pbl9ibG9jazE1M19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xfaW5fYmxvY2sxNTYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsX2luX2Jsb2NrMTU2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfc3RhdF9pbl9ibG9jazE2MSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3N0YXRfaW5fYmxvY2sxNjFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xNF9pbl9ibG9jazE2NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzE0X2luX2Jsb2NrMTY1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSURfaW5fc3RhdDE4OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX3N0YXQxODlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xMF9pbl9zdGF0MTkxID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMTBfaW5fc3RhdDE5MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lOVF9pbl9zdGF0MTkzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfSU5UX2luX3N0YXQxOTNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV185X2luX3N0YXQxOTUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV185X2luX3N0YXQxOTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9zdGF0MjA1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fc3RhdDIwNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzExX2luX2RlY2wyMTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xMV9pbl9kZWNsMjE5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSURfaW5fZGVjbDIyMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX2RlY2wyMjFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV185X2luX2RlY2wyMjMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV185X2luX2RlY2wyMjNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworCisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0VG9rZW5OYW1lczpbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoT2JqZWN0czpAIjxpbnZhbGlkPiIsIEAiPEVPUj4iLCBAIjxET1dOPiIsIEAiPFVQPiIsIAorIEAiSUQiLCBAIklOVCIsIEAiV1MiLCBAIicoJyIsIEAiJyknIiwgQCInOyciLCBAIic9JyIsIEAiJ2ludCciLCBAIidtZXRob2QnIiwgCisgQCIneyciLCBAIid9JyIsIG5pbF0gcmV0YWluXV07CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiU3ltYm9sVGFibGUuZyJdOworfQorCisrIChTeW1ib2xUYWJsZVBhcnNlciAqKW5ld1N5bWJvbFRhYmxlUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPilhU3RyZWFtCit7CisgICAgcmV0dXJuIFtbU3ltYm9sVGFibGVQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbV07CisKKworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtIFN0YXRlOltbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjo2KzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisKKworICAgICAgICAvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZUluaXQgKi8KKyAgICAgICAgU3ltYm9sc19zY29wZSA9IFtTeW1ib2xzX1Njb3BlIG5ld1N5bWJvbHNfU2NvcGVdOworICAgICAgICBTeW1ib2xzX3N0YWNrID0gW0FOVExSU3ltYm9sU3RhY2sgbmV3QU5UTFJTeW1ib2xTdGFja1dpdGhMZW46MzBdOworICAgICAgICAvKiBzdGFydCBvZiBhY3Rpb25zLWFjdGlvblNjb3BlLWluaXQgKi8KKworICAgICAgICBsZXZlbCA9IDA7CisKKyAgICAgICAgLyogc3RhcnQgb2YgaW5pdCAqLworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtTeW1ib2xzX3N0YWNrIHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBzdGFydCBtZW1iZXJzICovCisvKiBPYmpDIGVuZCBtZW1iZXJzICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworLyogT2JqQyBzdGFydCBydWxlcyAqLworLyoKKyAqICRBTlRMUiBzdGFydCBwcm9nCisgKiBTeW1ib2xUYWJsZS5nOjI1OjE6IHByb2cgOiBnbG9iYWxzICggbWV0aG9kICkqIDsKKyAqLworLSAodm9pZCkgcHJvZworeworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoyNzo1OiAoIGdsb2JhbHMgKCBtZXRob2QgKSogKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzoyNzo5OiBnbG9iYWxzICggbWV0aG9kICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZ2xvYmFsc19pbl9wcm9nNTBdOworICAgICAgICBbc2VsZiBnbG9iYWxzXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEExXzA9PTEyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjI3OjE4OiBtZXRob2QgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19tZXRob2RfaW5fcHJvZzUzXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWV0aG9kXTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBwcm9nICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZ2xvYmFscworICogU3ltYm9sVGFibGUuZzozMDoxOiBnbG9iYWxzIDogKCBkZWNsICkqIDsKKyAqLworLSAodm9pZCkgZ2xvYmFscworeworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisgICAgW1N5bWJvbHNfc3RhY2sgcHVzaDpbW1N5bWJvbHNfU2NvcGUgbmV3U3ltYm9sc19TY29wZV0gcmV0YWluXV07CisKKworICAgICAgICBsZXZlbCsrOworICAgICAgICAvKiBzY29wZVNldEF0dHJpYnV0ZVJlZiAqLygoU3ltYm9sc19TY29wZSAqKVtTeW1ib2xzX3N0YWNrIHBlZWtdKS5uYW1lcyA9ICBbQU5UTFJQdHJCdWZmZXIgbmV3QU5UTFJQdHJCdWZmZXJXaXRoTGVuOjEwXTsKKworICAgIEB0cnkgeworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjM2OjU6ICggKCBkZWNsICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MzY6OTogKCBkZWNsICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTJfMD09MTEpICkgeworICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6MzY6MTA6IGRlY2wgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsX2luX2dsb2JhbHM4NV07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGRlY2xdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKworCisKKyAgICAgICAgICAgICAgICAgICAgTlNMb2coIEAiZ2xvYmFsczogJUAiLCBbKChTeW1ib2xzX1Njb3BlICopW1N5bWJvbHNfc3RhY2sgcGVla10pLm5hbWVzIHRvU3RyaW5nXSApOworICAgICAgICAgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICAgICAgICAgIAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisgICAgICAgIFtTeW1ib2xzX3N0YWNrIHBvcF07CisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZ2xvYmFscyAqLworCisvKgorICogJEFOVExSIHN0YXJ0IG1ldGhvZAorICogU3ltYm9sVGFibGUuZzo0MzoxOiBtZXRob2QgOiAnbWV0aG9kJyBJRCAnKCcgJyknIGJsb2NrIDsKKyAqLworLSAodm9pZCkgbWV0aG9kCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjQ0OjU6ICggJ21ldGhvZCcgSUQgJygnICcpJyBibG9jayApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjQ0Ojk6ICdtZXRob2QnIElEICcoJyAnKScgYmxvY2sgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjEyIEZvbGxvdzpGT0xMT1dfMTJfaW5fbWV0aG9kMTE2XTsgCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOklEIEZvbGxvdzpGT0xMT1dfSURfaW5fbWV0aG9kMTE4XTsgCisKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjcgRm9sbG93OkZPTExPV183X2luX21ldGhvZDEyMF07IAorCisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTo4IEZvbGxvdzpGT0xMT1dfOF9pbl9tZXRob2QxMjJdOyAKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX21ldGhvZDEyNF07CisgICAgICAgIFtzZWxmIGJsb2NrXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBtZXRob2QgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBibG9jaworICogU3ltYm9sVGFibGUuZzo0NzoxOiBibG9jayA6ICd7JyAoIGRlY2wgKSogKCBzdGF0ICkqICd9JyA7CisgKi8KKy0gKHZvaWQpIGJsb2NrCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKyAgICBbU3ltYm9sc19zdGFjayBwdXNoOltbU3ltYm9sc19TY29wZSBuZXdTeW1ib2xzX1Njb3BlXSByZXRhaW5dXTsKKworCisgICAgICAgIGxldmVsKys7CisgICAgICAgIC8qIHNjb3BlU2V0QXR0cmlidXRlUmVmICovKChTeW1ib2xzX1Njb3BlICopW1N5bWJvbHNfc3RhY2sgcGVla10pLm5hbWVzID0gIFtBTlRMUlB0ckJ1ZmZlciBuZXdBTlRMUlB0ckJ1ZmZlcldpdGhMZW46MTBdOworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6NTM6NTogKCAneycgKCBkZWNsICkqICggc3RhdCApKiAnfScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo1Mzo5OiAneycgKCBkZWNsICkqICggc3RhdCApKiAnfScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjEzIEZvbGxvdzpGT0xMT1dfMTNfaW5fYmxvY2sxNTNdOyAKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mz0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEEzXzA9PTExKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjUzOjE0OiBkZWNsIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZGVjbF9pbl9ibG9jazE1Nl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGRlY2xdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDM6IDsKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ0PTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTRfMD09SUR8fExBNF8wPT0xMykgKSB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo1MzoyMjogc3RhdCAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3N0YXRfaW5fYmxvY2sxNjFdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzdGF0XTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3A0OiA7CisKKworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTQgRm9sbG93OkZPTExPV18xNF9pbl9ibG9jazE2NV07IAorCisKKyAgICAgICAgICAgICAgICAgICAgTlNMb2coIEAibGV2ZWwgJWQgc3ltYm9sczogJUAiLCBsZXZlbCwgWygoU3ltYm9sc19TY29wZSAqKVtTeW1ib2xzX3N0YWNrIHBlZWtdKS5uYW1lcyB0b1N0cmluZ10gKTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworICAgICAgICBbU3ltYm9sc19zdGFjayBwb3BdOworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGJsb2NrICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgc3RhdAorICogU3ltYm9sVGFibGUuZzo2MDoxOiBzdGF0IDogKCBJRCAnPScgSU5UICc7JyB8IGJsb2NrICk7CisgKi8KKy0gKHZvaWQpIHN0YXQKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6NjA6NTogKCBJRCAnPScgSU5UICc7JyB8IGJsb2NrICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDU9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBNV8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBNV8wPT1JRCkgKSB7CisgICAgICAgICAgICBhbHQ1PTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChMQTVfMD09MTMpICkgeworICAgICAgICAgICAgYWx0NT0yOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjo1IHN0YXRlOjAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIG52YWUuYyA9IExBNV8wOworICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyBTeW1ib2xUYWJsZS5nOjYwOjk6IElEICc9JyBJTlQgJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SUQgRm9sbG93OkZPTExPV19JRF9pbl9zdGF0MTg5XTsgCisKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTAgRm9sbG93OkZPTExPV18xMF9pbl9zdGF0MTkxXTsgCisKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SU5UIEZvbGxvdzpGT0xMT1dfSU5UX2luX3N0YXQxOTNdOyAKKworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTo5IEZvbGxvdzpGT0xMT1dfOV9pbl9zdGF0MTk1XTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo2MTo5OiBibG9jayAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX3N0YXQyMDVdOworICAgICAgICAgICAgICAgIFtzZWxmIGJsb2NrXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzdGF0ICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbAorICogU3ltYm9sVGFibGUuZzo2NDoxOiBkZWNsIDogJ2ludCcgSUQgJzsnIDsKKyAqLworLSAodm9pZCkgZGVjbAoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqSUQxID0gbmlsOworCisgICAgICAgIC8vIFN5bWJvbFRhYmxlLmc6NjQ6NTogKCAnaW50JyBJRCAnOycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU3ltYm9sVGFibGUuZzo2NDo5OiAnaW50JyBJRCAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjExIEZvbGxvdzpGT0xMT1dfMTFfaW5fZGVjbDIxOV07IAorCisgICAgICAgIElEMT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpJRCBGb2xsb3c6Rk9MTE9XX0lEX2luX2RlY2wyMjFdOyAKKworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6OSBGb2xsb3c6Rk9MTE9XXzlfaW5fZGVjbDIyM107IAorCisgICAgICAgIFsoKFN5bWJvbHNfU2NvcGUgKilbU3ltYm9sc19zdGFjayBwZWVrXSkubmFtZXMgYWRkT2JqZWN0OklEMV07CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsICovCisvKiBPYmpDIGVuZCBydWxlcyAqLworCitAZW5kIC8qIGVuZCBvZiBTeW1ib2xUYWJsZVBhcnNlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDY5MiAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlX18uZ2wgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGVfXy5nbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDRiMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlX18uZ2wKQEAgLTAsMCArMSwyNiBAQAorbGV4ZXIgZ3JhbW1hciBTeW1ib2xUYWJsZTsKK29wdGlvbnMgeworICBsYW5ndWFnZT1PYmpDOworCit9CisKK1Q3IDogJ21ldGhvZCcgOworVDggOiAnKCcgOworVDkgOiAnKScgOworVDEwIDogJ3snIDsKK1QxMSA6ICd9JyA7CitUMTIgOiAnPScgOworVDEzIDogJzsnIDsKK1QxNCA6ICdpbnQnIDsKKworLy8gJEFOVExSIHNyYyAiU3ltYm9sVGFibGUuZyIgNjYKK0lEICA6ICAgKCdhJy4uJ3onKSsKKyAgICA7CisKKy8vICRBTlRMUiBzcmMgIlN5bWJvbFRhYmxlLmciIDY5CitJTlQgOiAgICgnMCcuLic5JykrCisgICAgOworCisvLyAkQU5UTFIgc3JjICJTeW1ib2xUYWJsZS5nIiA3MgorV1MgIDogICAoJyAnfCdcbid8J1xyJykrIHskY2hhbm5lbD05OTt9CisgICAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL2FudGxyMy5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL2FudGxyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTYyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvYW50bHIzLmgKQEAgLTAsMCArMSw3OSBAQAorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlTWFwRWxlbWVudC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlUmVjb2duaXplci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQmFzZVRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJpdFNldC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCdWZmZXJlZFRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ2hhclN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uRXJyb3JOb2RlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNvbW1vblRyZWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSREZBLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRQcm94eS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZU5vZGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJFcnJvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRmFzdFF1ZXVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkhhc2hNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaFJ1bGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50QXJyYXkuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSW50U3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxpbmtCYXNlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkxvb2thaGVhZFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vZGVNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUHRyQnVmZmVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZU1lbW8uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdW50aW1lRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN0cmVhbUVudW1lcmF0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyaW5nU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlN5bWJvbFN0YWNrLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuK0RlYnVnZ2VyU3VwcG9ydC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblJld3JpdGVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5Tb3VyY2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVJdGVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZFRva2VuU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLmg+CisvLyNpbXBvcnQgPEFOVExSL0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW5pcXVlSURNYXAuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5oPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL2lucHV0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL2lucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmY5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvaW5wdXQKQEAgLTAsMCArMSwxMiBAQAoraW50IGk7CitpbnQgajsKK21ldGhvZCBmb28oKSB7CisgIGludCBpOworICBpbnQgazsKKyAgaT0zOworICB7CisgICAgaW50IGo7CisgICAgaW50IGs7CisgICAgayA9IDQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9tYWluLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvbWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDlhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvbWFpbi5tCkBAIC0wLDAgKzEsMzAgQEAKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxhbnRscjMuaD4KKyNpbXBvcnQgIlN5bWJvbFRhYmxlTGV4ZXIuaCIKKyNpbXBvcnQgIlN5bWJvbFRhYmxlUGFyc2VyLmgiCisKK2ludCBtYWluKCkgeworCU5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisJCisJTlNTdHJpbmcgKnN0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoQ29udGVudHNPZkZpbGU6QCIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvYW50bHIzLW1haW4vcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvaW5wdXQiXTsKKwlOU0xvZyhAImlucHV0IGlzIDogJUAiLCBzdHJpbmcpOworCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbW0FOVExSU3RyaW5nU3RyZWFtIGFsbG9jXSBpbml0V2l0aFN0cmluZ05vQ29weTpzdHJpbmddOworCVN5bWJvbFRhYmxlTGV4ZXIgKmxleGVyID0gW1tTeW1ib2xUYWJsZUxleGVyIGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06c3RyZWFtXTsKKwkKKy8vCUFOVExSQ29tbW9uVG9rZW4gKmN1cnJlbnRUb2tlbjsKKy8vCXdoaWxlICgoY3VycmVudFRva2VuID0gW2xleGVyIG5leHRUb2tlbl0pICYmIFtjdXJyZW50VG9rZW4gZ2V0VHlwZV0gIT0gQU5UTFJUb2tlblR5cGVFT0YpIHsKKy8vCQlOU0xvZyhAIiVAIiwgY3VycmVudFRva2VuKTsKKy8vCX0KKwkKKwlBTlRMUkNvbW1vblRva2VuU3RyZWFtICp0b2tlbnMgPSBbW0FOVExSQ29tbW9uVG9rZW5TdHJlYW0gYWxsb2NdIGluaXRXaXRoVG9rZW5Tb3VyY2U6bGV4ZXJdOworCVN5bWJvbFRhYmxlUGFyc2VyICpwYXJzZXIgPSBbW1N5bWJvbFRhYmxlUGFyc2VyIGFsbG9jXSBpbml0V2l0aFRva2VuU3RyZWFtOnRva2Vuc107CisJW3BhcnNlciBwcm9nXTsKKworCVtsZXhlciByZWxlYXNlXTsKKwlbc3RyZWFtIHJlbGVhc2VdOworCVt0b2tlbnMgcmVsZWFzZV07CisJW3BhcnNlciByZWxlYXNlXTsKKwkKKwlbcG9vbCByZWxlYXNlXTsKKwlyZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL291dHB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNmZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL291dHB1dApAQCAtMCwwICsxLDMgQEAKK2dsb2JhbHM6IFtbQDIsNDo0PSdpJyw8ND4sMTo0XSwgW0A3LDExOjExPSdqJyw8ND4sMjo0XV0KK2xldmVsIDIgc3ltYm9sczogW1tAMzcsNjY6NjY9J2onLDw0Piw4OjhdLCBbQDQyLDc3Ojc3PSdrJyw8ND4sOTo4XV0KK2xldmVsIDEgc3ltYm9sczogW1tAMjAsMzU6MzU9J2knLDw0Piw0OjZdLCBbQDI1LDQ0OjQ0PSdrJyw8ND4sNTo2XV0KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9vdXRwdXQxL1N5bWJvbFRhYmxlLnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9vdXRwdXQxL1N5bWJvbFRhYmxlLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQwOTAxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL291dHB1dDEvU3ltYm9sVGFibGUudG9rZW5zCkBAIC0wLDAgKzEsMTkgQEAKK1dTPTYKK1RfXzEyPTEyCitUX18xMT0xMQorVF9fMTQ9MTQKK1RfXzEzPTEzCitUX18xMD0xMAorSU5UPTUKK0lEPTQKK1RfXzk9OQorVF9fOD04CitUX183PTcKKyc7Jz0xMworJ30nPTExCisnPSc9MTIKKydpbnQnPTE0CisnKCc9OAorJ21ldGhvZCc9NworJyknPTkKKyd7Jz0xMApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL291dHB1dDEvU3ltYm9sVGFibGVMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL291dHB1dDEvU3ltYm9sVGFibGVMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Mjc2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZUxleGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gJEFOVExSIDMuMiBBdWcgMTksIDIwMTAgMTc6MTY6MDQgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZyAyMDEwLTA4LTE5IDE3OjE2OjQ3CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJhbnRscjMuaCIKKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2Ugc3RhcnQgREZBNAorQGludGVyZmFjZSBERkE0IDogQU5UTFJERkEgeworfQorKyBuZXdERkE0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKil0aGVSZWNvZ25pemVyOworLSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilyZWNvZ25pemVyOworQGVuZAorCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2UgZW5kIERGQTQKKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgV1MgNgorI2RlZmluZSBUX18xMiAxMgorI2RlZmluZSBUX18xMSAxMQorI2RlZmluZSBUX18xNCAxNAorI2RlZmluZSBUX18xMyAxMworI2RlZmluZSBUX18xMCAxMAorI2RlZmluZSBJTlQgNQorI2RlZmluZSBJRCA0CisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBUX185IDkKKyNkZWZpbmUgVF9fOCA4CisjZGVmaW5lIFRfXzcgNworQGludGVyZmFjZSBTeW1ib2xUYWJsZUxleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisgICAgREZBNCAqZGZhNDsKK30KKysgKFN5bWJvbFRhYmxlTGV4ZXIgKiluZXdTeW1ib2xUYWJsZUxleGVyOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQ7CisKKy0gKHZvaWQpIG1UX183OyAKKy0gKHZvaWQpIG1UX184OyAKKy0gKHZvaWQpIG1UX185OyAKKy0gKHZvaWQpIG1UX18xMDsgCistICh2b2lkKSBtVF9fMTE7IAorLSAodm9pZCkgbVRfXzEyOyAKKy0gKHZvaWQpIG1UX18xMzsgCistICh2b2lkKSBtVF9fMTQ7IAorLSAodm9pZCkgbUlEOyAKKy0gKHZvaWQpIG1JTlQ7IAorLSAodm9pZCkgbVdTOyAKKy0gKHZvaWQpIG1Ub2tlbnM7IAorQGVuZCAvLyBlbmQgb2YgU3ltYm9sVGFibGVMZXhlciBpbnRlcmZhY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZUxleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZUxleGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmOTI5MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9vdXRwdXQxL1N5bWJvbFRhYmxlTGV4ZXIubQpAQCAtMCwwICsxLDcxMiBAQAorLyoqIFxmaWxlCisgKiAgVGhpcyBPQkpDIHNvdXJjZSBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgJEFOVExSIHZlcnNpb24gMy4yIEF1ZyAxOSwgMjAxMCAxNzoxNjowNAorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDEwLTA4LTE5IDE3OjE2OjQ3CisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IFN5bWJvbFRhYmxlTGV4ZXJMZXhlciAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuIAorICoKKyAqIEMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEppbSBJZGxlLCBqaW1pfGhlcmVpc2FuYXR8aWRsZXxkb3Rnb2VzaGVyZXx3cy4KKyAqCisgKgorKi8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gJEFOVExSIDMuMiBBdWcgMTksIDIwMTAgMTc6MTY6MDQgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZyAyMDEwLTA4LTE5IDE3OjE2OjQ3CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJTeW1ib2xUYWJsZUxleGVyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gc3RhcnQgREZBNAorQGltcGxlbWVudGF0aW9uIERGQTQKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF9lb3RbMjFdID0KKyAgICB7LTEsOSwtMSwtMSwtMSwtMSwtMSwtMSw5LC0xLC0xLC0xLDksOSw5LDE3LDksLTEsOSwyMCwtMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTRfZW9mWzIxXSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTRfbWluWzIxXSA9CisgICAgezEwLDEwMSwwLDAsMCwwLDAsMCwxMTAsMCwwLDAsMTE2LDExNiwxMDQsOTcsMTExLDAsMTAwLDk3LDB9OworY29uc3Qgc3RhdGljIHVuaWNoYXIgZGZhNF9tYXhbMjFdID0KKyAgICB7MTI1LDEwMSwwLDAsMCwwLDAsMCwxMTAsMCwwLDAsMTE2LDExNiwxMDQsMTIyLDExMSwwLDEwMCwxMjIsMH07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTRfYWNjZXB0WzIxXSA9CisgICAgey0xLC0xLDIsMyw0LDUsNiw3LC0xLDksMTAsMTEsLTEsLTEsLTEsLTEsLTEsOCwtMSwtMSwxfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF9zcGVjaWFsWzIxXSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uW10gPSB7fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uMFtdID0gezExLCAtMSwgLTEsIDExLCAtMSwgLTEsIC0xLCAKKyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMSwgLTEsIC0xLCAKKyAtMSwgLTEsIC0xLCAtMSwgLTEsIDIsIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIAorIDEwLCAxMCwgMTAsIDEwLCAtMSwgNywgLTEsIDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOCwgOSwgOSwgOSwgMSwgOSwgOSwgOSwgCisgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgNCwgLTEsIDV9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb24xW10gPSB7MTl9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb24yW10gPSB7MTZ9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb24zW10gPSB7MTh9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb240W10gPSB7MTN9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb241W10gPSB7MTV9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb242W10gPSB7MTJ9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb243W10gPSB7MTR9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb244W10gPSB7OSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgCisgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOX07CisKKworKyAoKSBuZXdERkE0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilhUmVjb2duaXplcgoreworICAgIHJldHVybiBbW1tERkE0IGFsbG9jXSBpbml0V2l0aFJlY29nbml6ZXI6YVJlY29nbml6ZXJdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKikgdGhlUmVjb2duaXplcgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFJlY29nbml6ZXI6dGhlUmVjb2duaXplcl0pICE9IG5pbCkgeworICAgICAgICBkZWNpc2lvbk51bWJlciA9IDQ7CisgICAgICAgIGVvdCA9IGRmYTRfZW90OworICAgICAgICBlb2YgPSBkZmE0X2VvZjsKKyAgICAgICAgbWluID0gZGZhNF9taW47CisgICAgICAgIG1heCA9IGRmYTRfbWF4OworICAgICAgICBhY2NlcHQgPSBkZmE0X2FjY2VwdDsKKyAgICAgICAgc3BlY2lhbCA9IGRmYTRfc3BlY2lhbDsKKyAgICAgICAgaWYgKCEodHJhbnNpdGlvbiA9IGNhbGxvYygyMSwgc2l6ZW9mKHZvaWQqKSkpKSB7CisgICAgICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gMjE7CisgICAgICAgIHRyYW5zaXRpb25bMF0gPSBkZmE0X3RyYW5zaXRpb24wOworICAgICAgICB0cmFuc2l0aW9uWzFdID0gZGZhNF90cmFuc2l0aW9uNjsKKyAgICAgICAgdHJhbnNpdGlvblsyXSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblszXSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvbls0XSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvbls1XSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvbls2XSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvbls3XSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvbls4XSA9IGRmYTRfdHJhbnNpdGlvbjQ7CisgICAgICAgIHRyYW5zaXRpb25bOV0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMTBdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzExXSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblsxMl0gPSBkZmE0X3RyYW5zaXRpb243OworICAgICAgICB0cmFuc2l0aW9uWzEzXSA9IGRmYTRfdHJhbnNpdGlvbjU7CisgICAgICAgIHRyYW5zaXRpb25bMTRdID0gZGZhNF90cmFuc2l0aW9uMjsKKyAgICAgICAgdHJhbnNpdGlvblsxNV0gPSBkZmE0X3RyYW5zaXRpb244OworICAgICAgICB0cmFuc2l0aW9uWzE2XSA9IGRmYTRfdHJhbnNpdGlvbjM7CisgICAgICAgIHRyYW5zaXRpb25bMTddID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzE4XSA9IGRmYTRfdHJhbnNpdGlvbjE7CisgICAgICAgIHRyYW5zaXRpb25bMTldID0gZGZhNF90cmFuc2l0aW9uODsKKyAgICAgICAgdHJhbnNpdGlvblsyMF0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgZnJlZSh0cmFuc2l0aW9uKTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIEAiMToxOiBUb2tlbnMgOiAoIFRfXzcgfCBUX184IHwgVF9fOSB8IFRfXzEwIHwgVF9fMTEgfCBUX18xMiB8IFRfXzEzIHwgVF9fMTQgfCBJRCB8IElOVCB8IFdTICk7IjsKK30KKworCitAZW5kCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbXBsZW1lbnRhdGlvbiBlbmQgREZBNAorCisKKworLyoqIEFzIHBlciBUZXJlbmNlOiBObyByZXR1cm5zIGZvciBsZXhlciBydWxlcyEKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisqLworQGltcGxlbWVudGF0aW9uIFN5bWJvbFRhYmxlTGV4ZXIgLy8gbGluZSAzMzAKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIi91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmciXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gW1tzZWxmIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6YVRva2VuVHlwZV07Cit9CisKKysgKFN5bWJvbFRhYmxlTGV4ZXIgKiluZXdTeW1ib2xUYWJsZUxleGVyOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICByZXR1cm4gW1tTeW1ib2xUYWJsZUxleGVyIGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dCBTdGF0ZTpbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjoxMisxXV0pICE9IG5pbCkgeworCisgICAgICAgIGRmYTQgPSBbREZBNCBuZXdERkE0V2l0aFJlY29nbml6ZXI6c2VsZl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW2RmYTQgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvLyBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMKKy8vIHN0YXJ0IG1ldGhvZHMoKQorCisvLyBTdGFydCBvZiBSdWxlcworLy8gJEFOVExSIHN0YXJ0ICJUX183IgorLSAodm9pZCkgbVRfXzcKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fNzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjc6NjogKCAnbWV0aG9kJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjc6ODogJ21ldGhvZCcgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJtZXRob2QiXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fNyIKKworLy8gJEFOVExSIHN0YXJ0ICJUX184IgorLSAodm9pZCkgbVRfXzgKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fODsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjg6NjogKCAnKCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo4Ojg6ICcoJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JygnXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fOCIKKworLy8gJEFOVExSIHN0YXJ0ICJUX185IgorLSAodm9pZCkgbVRfXzkKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fOTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjk6NjogKCAnKScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo5Ojg6ICcpJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JyknXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fOSIKKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMCIKKy0gKHZvaWQpIG1UX18xMAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjEwOjc6ICggJ3snICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTA6OTogJ3snIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjoneyddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJUX18xMCIKKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMSIKKy0gKHZvaWQpIG1UX18xMQoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjExOjc6ICggJ30nICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTE6OTogJ30nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonfSddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJUX18xMSIKKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMiIKKy0gKHZvaWQpIG1UX18xMgoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjEyOjc6ICggJz0nICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTI6OTogJz0nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonPSddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJUX18xMiIKKworLy8gJEFOVExSIHN0YXJ0ICJUX18xMyIKKy0gKHZvaWQpIG1UX18xMworeworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjEzOjc6ICggJzsnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTM6OTogJzsnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonOyddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJUX18xMyIKKworLy8gJEFOVExSIHN0YXJ0ICJUX18xNCIKKy0gKHZvaWQpIG1UX18xNAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xNDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjE0Ojc6ICggJ2ludCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxNDo5OiAnaW50JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImludCJdOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJUX18xNCIKKworLy8gJEFOVExSIHN0YXJ0ICJJRCIKKy0gKHZvaWQpIG1JRAoreworICAgIC8vCisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBJRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjY2OjU6ICggKCAnYScgLi4gJ3onICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6NjY6OTogKCAnYScgLi4gJ3onICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6NjY6OTogKCAnYScgLi4gJ3onICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQxPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo2NjoxMDogJ2EnIC4uICd6JyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFJhbmdlRnJvbUNoYXI6J2EnIHRvOid6J107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFN0cmVhbTppbnB1dCBkZWNpc2lvbk51bWJlcjoxXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDErKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDE6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJJRCIKKworLy8gJEFOVExSIHN0YXJ0ICJJTlQiCistICh2b2lkKSBtSU5UCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjY5OjU6ICggKCAnMCcgLi4gJzknICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6Njk6OTogKCAnMCcgLi4gJzknICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6Njk6OTogKCAnMCcgLi4gJzknICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQyPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo2OToxMDogJzAnIC4uICc5JyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFJhbmdlRnJvbUNoYXI6JzAnIHRvOic5J107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MiA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFN0cmVhbTppbnB1dCBkZWNpc2lvbk51bWJlcjoyXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJJTlQiCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo3Mjo1OiAoICggJyAnIHwgJ1xcbicgfCAnXFxyJyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjcyOjk6ICggJyAnIHwgJ1xcbicgfCAnXFxyJyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjcyOjk6ICggJyAnIHwgJ1xcbicgfCAnXFxyJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250Mz0wOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mz0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEEzXzA9PSdcbid8fExBM18wPT0nXHInfHxMQTNfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoW2lucHV0IExBOjFdID09ICdcbid8fFtpbnB1dCBMQToxXSA9PSAnXHInfHxbaW5wdXQgTEE6MV0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTt9CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MyA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDM7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFN0cmVhbTppbnB1dCBkZWNpc2lvbk51bWJlcjozXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDMrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDM6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgc3RhdGUuY2hhbm5lbD05OTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIldTIgorCistICh2b2lkKSBtVG9rZW5zCit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjg6ICggVF9fNyB8IFRfXzggfCBUX185IHwgVF9fMTAgfCBUX18xMSB8IFRfXzEyIHwgVF9fMTMgfCBUX18xNCB8IElEIHwgSU5UIHwgV1MgKSAvL3J1bGVibG9jaworICAgIE5TSW50ZWdlciBhbHQ0PTExOworICAgIGFsdDQgPSBbZGZhNCBwcmVkaWN0OmlucHV0XTsKKyAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjEwOiBUX183IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX183XTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjE1OiBUX184IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX184XTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjIwOiBUX185IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX185XTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0IDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjI1OiBUX18xMCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtVF9fMTBdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjE6MzE6IFRfXzExIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18xMV07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTozNzogVF9fMTIgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbVRfXzEyXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3IDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjQzOiBUX18xMyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtVF9fMTNdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDggOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjE6NDk6IFRfXzE0IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18xNF07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTo1NTogSUQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUlEXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMCA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MTo1ODogSU5UIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1JTlRdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzoxOjYyOiBXUyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtV1NdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCit9CisKK0BlbmQgLy8gZW5kIG9mIFN5bWJvbFRhYmxlTGV4ZXIgaW1wbGVtZW50YXRpb24gLy8gbGluZSAzOTcKKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9vdXRwdXQxL1N5bWJvbFRhYmxlUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjI5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZVBhcnNlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vICRBTlRMUiAzLjIgQXVnIDE5LCAyMDEwIDE3OjE2OjA0IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmcgMjAxMC0wOC0xOSAxNzoxNjo0NworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiYW50bHIzLmgiCisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI3ByYWdtYSBtYXJrIFRva2VucworI2RlZmluZSBXUyA2CisjZGVmaW5lIFRfXzEyIDEyCisjZGVmaW5lIFRfXzExIDExCisjZGVmaW5lIFRfXzE0IDE0CisjZGVmaW5lIFRfXzEzIDEzCisjZGVmaW5lIFRfXzEwIDEwCisjZGVmaW5lIElOVCA1CisjZGVmaW5lIElEIDQKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIFRfXzkgOQorI2RlZmluZSBUX184IDgKKyNkZWZpbmUgVF9fNyA3CisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCitAaW50ZXJmYWNlIFN5bWJvbHNfU2NvcGUgOiBBTlRMUlN5bWJvbHNTY29wZSB7ICAvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZURlY2wgKi8KK0FOVExSSGFzaE1hcCAqIG5hbWVzOworfQorLyogc3RhcnQgb2YgcHJvcGVydGllcyAqLworCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldG5hbWVzLCBzZXR0ZXI9c2V0bmFtZXM6KSBBTlRMUkhhc2hNYXAgKiBuYW1lczsKKworLyogZW5kIHByb3BlcnRpZXMgKi8KKworKyAoU3ltYm9sc19TY29wZSAqKW5ld1N5bWJvbHNfU2NvcGU7CisvKiBzdGFydCBvZiBpdGVyYXRlZCBnZXQgYW5kIHNldCBmdW5jdGlvbnMgKi8KKworLSAoQU5UTFJIYXNoTWFwICopZ2V0bmFtZXM7CistICh2b2lkKXNldG5hbWVzOihBTlRMUkhhc2hNYXAgKilhVmFsOworCisvKiBFbmQgb2YgaXRlcmF0ZWQgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovCisKK0BlbmQKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHN0YXJ0CisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIGVuZAorQGludGVyZmFjZSBTeW1ib2xUYWJsZVBhcnNlciA6IEFOVExSUGFyc2VyIHsgLy8gbGluZSA1MjkKKy8vIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyCisvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworQU5UTFJTeW1ib2xTdGFjayAqZ1N0YWNrOworU3ltYm9sc19TY29wZSAqU3ltYm9sc19zY29wZTsKKworLy8gc3RhcnQgb2YgYWN0aW9uLWFjdGlvblNjb3BlLW1lbVZhcnMKKworaW50IGxldmVsOworCisvLyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIKKworCisvLyBTdGFydCBvZiBtZW1WYXJzCisKKyB9CisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZXRob2RzRGVjbAorCisKKy0gKHZvaWQpcHJvZzsgCistICh2b2lkKWdsb2JhbHM7IAorLSAodm9pZCltZXRob2Q7IAorLSAodm9pZClibG9jazsgCistICh2b2lkKXN0YXQ7IAorLSAodm9pZClkZWNsOyAKKworCitAZW5kIC8vIGVuZCBvZiBTeW1ib2xUYWJsZVBhcnNlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9vdXRwdXQxL1N5bWJvbFRhYmxlUGFyc2VyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZVBhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMDU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvb3V0cHV0MS9TeW1ib2xUYWJsZVBhcnNlci5tCkBAIC0wLDAgKzEsNTc5IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAzLjIgQXVnIDE5LCAyMDEwIDE3OjE2OjA0CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nCisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDIwMTAtMDgtMTkgMTc6MTY6NDcKKyAqICAgICAtICAgICAgICAgICAgICAgIGZvciB0aGUgcGFyc2VyIDogU3ltYm9sVGFibGVQYXJzZXJQYXJzZXIgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLiAKKyAqCisgKiBDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBKaW0gSWRsZSwgamltaXxoZXJlaXNhbmF0fGlkbGV8ZG90Z29lc2hlcmV8d3MuCisgKgorICoKKyovCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vICRBTlRMUiAzLjIgQXVnIDE5LCAyMDEwIDE3OjE2OjA0IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmcgMjAxMC0wOC0xOSAxNzoxNjo0NworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiU3ltYm9sVGFibGVQYXJzZXIuaCIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisKKworI3ByYWdtYSBtYXJrIEJpdHNldHMKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2dsb2JhbHNfaW5fcHJvZzQ0OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2dsb2JhbHNfaW5fcHJvZzQ0X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDgyTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19tZXRob2RfaW5fcHJvZzQ3OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX21ldGhvZF9pbl9wcm9nNDdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwODJMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xfaW5fZ2xvYmFsczc5OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xfaW5fZ2xvYmFsczc5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0MDAyTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV183X2luX21ldGhvZDExMDsKKworY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV183X2luX21ldGhvZDExMF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAxMExMfTsKKworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSURfaW5fbWV0aG9kMTEyOworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lEX2luX21ldGhvZDExMl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDEwMExMfTsKKworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfOF9pbl9tZXRob2QxMTQ7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfOF9pbl9tZXRob2QxMTRfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAyMDBMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzlfaW5fbWV0aG9kMTE2OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzlfaW5fbWV0aG9kMTE2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwNDAwTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ibG9ja19pbl9tZXRob2QxMTg7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYmxvY2tfaW5fbWV0aG9kMTE4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xMF9pbl9ibG9jazE0NzsKKworY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18xMF9pbl9ibG9jazE0N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwNEMxMExMfTsKKworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbF9pbl9ibG9jazE1MDsKKworY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19kZWNsX2luX2Jsb2NrMTUwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0QzEwTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zdGF0X2luX2Jsb2NrMTU1OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3N0YXRfaW5fYmxvY2sxNTVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDBDMTBMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzExX2luX2Jsb2NrMTU5OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzExX2luX2Jsb2NrMTU5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JRF9pbl9zdGF0MTgzOworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lEX2luX3N0YXQxODNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDEwMDBMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzEyX2luX3N0YXQxODU7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTJfaW5fc3RhdDE4NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAyMExMfTsKKworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSU5UX2luX3N0YXQxODc7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSU5UX2luX3N0YXQxODdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDIwMDBMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzEzX2luX3N0YXQxODk7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMTNfaW5fc3RhdDE4OV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKKworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYmxvY2tfaW5fc3RhdDE5OTsKKworY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9zdGF0MTk5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18xNF9pbl9kZWNsMjEzOworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzE0X2luX2RlY2wyMTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMTBMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0lEX2luX2RlY2wyMTU7CisKK2NvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fZGVjbDIxNV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMjAwMExMfTsKKworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMTNfaW5fZGVjbDIxNzsKKworY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18xM19pbl9kZWNsMjE3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCisKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworQGltcGxlbWVudGF0aW9uIFN5bWJvbHNfU2NvcGUgIC8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW1wbCAqLworLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTc1MCAqLworCitAc3ludGhlc2l6ZSBuYW1lczsKKysgKFN5bWJvbHNfU2NvcGUgKiluZXdTeW1ib2xzX1Njb3BlCit7CisgICAgcmV0dXJuIFtbW1N5bWJvbHNfU2NvcGUgYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisvKiBzdGFydCBvZiBpdGVyYXRlIGdldCBhbmQgc2V0IGZ1bmN0aW9ucyAqLworCistIChBTlRMUkhhc2hNYXAgKilnZXRuYW1lcyB7IHJldHVybiggbmFtZXMgKTsgfQorCistICh2b2lkKXNldG5hbWVzOihBTlRMUkhhc2hNYXAgKilhVmFsIHsgbmFtZXMgPSBhVmFsOyB9CisKKworCisvKiBFbmQgb2YgaXRlcmF0ZSBnZXQgYW5kIHNldCBmdW5jdGlvbnMgKi8KKworQGVuZAorCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisKK0BpbXBsZW1lbnRhdGlvbiBTeW1ib2xUYWJsZVBhcnNlciAgLy8gbGluZSA2MTAKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIEZPTExPV19nbG9iYWxzX2luX3Byb2c0NCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2dsb2JhbHNfaW5fcHJvZzQ0X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfbWV0aG9kX2luX3Byb2c0NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX21ldGhvZF9pbl9wcm9nNDdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19kZWNsX2luX2dsb2JhbHM3OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2RlY2xfaW5fZ2xvYmFsczc5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfN19pbl9tZXRob2QxMTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV183X2luX21ldGhvZDExMF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX21ldGhvZDExMiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX21ldGhvZDExMl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzhfaW5fbWV0aG9kMTE0ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfOF9pbl9tZXRob2QxMTRfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV185X2luX21ldGhvZDExNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzlfaW5fbWV0aG9kMTE2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYmxvY2tfaW5fbWV0aG9kMTE4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fbWV0aG9kMTE4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTBfaW5fYmxvY2sxNDcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xMF9pbl9ibG9jazE0N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xfaW5fYmxvY2sxNTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsX2luX2Jsb2NrMTUwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfc3RhdF9pbl9ibG9jazE1NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3N0YXRfaW5fYmxvY2sxNTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xMV9pbl9ibG9jazE1OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzExX2luX2Jsb2NrMTU5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSURfaW5fc3RhdDE4MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX3N0YXQxODNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xMl9pbl9zdGF0MTg1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMTJfaW5fc3RhdDE4NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lOVF9pbl9zdGF0MTg3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfSU5UX2luX3N0YXQxODdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18xM19pbl9zdGF0MTg5ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMTNfaW5fc3RhdDE4OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Jsb2NrX2luX3N0YXQxOTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19ibG9ja19pbl9zdGF0MTk5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMTRfaW5fZGVjbDIxMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzE0X2luX2RlY2wyMTNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19JRF9pbl9kZWNsMjE1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfSURfaW5fZGVjbDIxNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzEzX2luX2RlY2wyMTcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18xM19pbl9kZWNsMjE3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldFRva2VuTmFtZXM6W1tbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOkAiPGludmFsaWQ+IiwgQCI8RU9SPiIsIEAiPERPV04+IiwgQCI8VVA+IiwgCisgQCJJRCIsIEAiSU5UIiwgQCJXUyIsIEAiJ21ldGhvZCciLCBAIicoJyIsIEAiJyknIiwgQCIneyciLCBAIid9JyIsIEAiJz0nIiwgCisgQCInOyciLCBAIidpbnQnIiwgbmlsXSByZXRhaW5dXTsKK30KKworKyAoU3ltYm9sVGFibGVQYXJzZXIgKiluZXdTeW1ib2xUYWJsZVBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHJldHVybiBbW1N5bWJvbFRhYmxlUGFyc2VyIGFsbG9jXSBpbml0V2l0aFRva2VuU3RyZWFtOmFTdHJlYW1dOworCit9CisKKy0gKGlkKSBpbml0V2l0aFRva2VuU3RyZWFtOihpZDxBTlRMUlRva2VuU3RyZWFtPilhU3RyZWFtCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbSBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46NisxXSByZXRhaW5dXSkgIT0gbmlsKSB7CisKKworICAgICAgICAoU3ltYm9sc19TY29wZSAqKVN5bWJvbHNfc2NvcGUgPSBbU3ltYm9sc19TY29wZSBuZXdTeW1ib2xzX1Njb3BlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIHN0YXJ0IG9mIGFjdGlvbnMtYWN0aW9uU2NvcGUtaW5pdAorCisgICAgICAgIGxldmVsID0gMDsKKworICAgICAgICAvLyBzdGFydCBvZiBpbml0CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW1N5bWJvbHNfc2NvcGUgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorLy8gc3RhcnQgYWN0aW9ucy5hY3Rpb25TY29wZS5tZXRob2RzCisvLyBzdGFydCBtZXRob2RzKCkKKy8vIHN0YXJ0IHJ1bGVzCisvKgorICogJEFOVExSIHN0YXJ0IHByb2cKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MjU6MTogcHJvZyA6IGdsb2JhbHMgKCBtZXRob2QgKSogOworICovCistICh2b2lkKSBwcm9nCit7CisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjI1OjU6ICggZ2xvYmFscyAoIG1ldGhvZCApKiApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjI1Ojk6IGdsb2JhbHMgKCBtZXRob2QgKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZ2xvYmFsc19pbl9wcm9nNDRdOworICAgICAgICBbc2VsZiBnbG9iYWxzXTsKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEExXzA9PTcpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MjU6MTg6IG1ldGhvZCAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19tZXRob2RfaW5fcHJvZzQ3XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWV0aG9kXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMTogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBwcm9nICovCisvKgorICogJEFOVExSIHN0YXJ0IGdsb2JhbHMKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6Mjg6MTogZ2xvYmFscyA6ICggZGVjbCApKiA7CisgKi8KKy0gKHZvaWQpIGdsb2JhbHMKK3sKKyAgICAvLyBydWxlU2NvcGVTZXRVcAorICAgIGdTdGFjayA9IFtBTlRMUlN5bWJvbFN0YWNrIG5ld0FOVExSU3ltYm9sU3RhY2tXaXRoTGVuOjMwXTsKKyAgICBTeW1ib2xzX3Njb3BlID0gW1tTeW1ib2xzX1Njb3BlIG5ld1N5bWJvbHNfU2NvcGVdIHJldGFpbl07CisgICAgW2dTdGFjayBwdXNoOlN5bWJvbHNfc2NvcGVdOworCisKKyAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgLyogc2NvcGVTZXRBdHRyaWJ1dGVSZWYgKi8KKyAgICAoKFN5bWJvbHNfU2NvcGUgKilbZ1N0YWNrIHBlZWtdKS5uYW1lcyA9ICBbQU5UTFJIYXNoTWFwIG5ld0FOVExSSGFzaE1hcFdpdGhMZW46MTAxXTsKKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjM0OjU6ICggKCBkZWNsICkqICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MzQ6OTogKCBkZWNsICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTJfMD09MTQpICkgeworICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6MzQ6MTA6IGRlY2wgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZGVjbF9pbl9nbG9iYWxzNzldOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBkZWNsXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AyOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMjogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICAgICAgTlNMb2coQCJnbG9iYWxzOiAlQCIsIC8qIHNjb3BlQXR0cmlidXRlUmVmICovCisgICAgICAgICgoU3ltYm9sc19TY29wZSAqKVtnU3RhY2sgcGVla10pLm5hbWVzKTsKKyAgICAgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgICAgIFtnU3RhY2sgcG9wXTsKKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBnbG9iYWxzICovCisvKgorICogJEFOVExSIHN0YXJ0IG1ldGhvZAorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo0MToxOiBtZXRob2QgOiAnbWV0aG9kJyBJRCAnKCcgJyknIGJsb2NrIDsKKyAqLworLSAodm9pZCkgbWV0aG9kCit7CisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjQyOjU6ICggJ21ldGhvZCcgSUQgJygnICcpJyBibG9jayApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjQyOjk6ICdtZXRob2QnIElEICcoJyAnKScgYmxvY2sgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjcgRm9sbG93OkZPTExPV183X2luX21ldGhvZDExMF07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpJRCBGb2xsb3c6Rk9MTE9XX0lEX2luX21ldGhvZDExMl07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTo4IEZvbGxvdzpGT0xMT1dfOF9pbl9tZXRob2QxMTRdOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6OSBGb2xsb3c6Rk9MTE9XXzlfaW5fbWV0aG9kMTE2XTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYmxvY2tfaW5fbWV0aG9kMTE4XTsKKyAgICAgICAgW3NlbGYgYmxvY2tdOworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIG1ldGhvZCAqLworLyoKKyAqICRBTlRMUiBzdGFydCBibG9jaworICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo0NToxOiBibG9jayA6ICd7JyAoIGRlY2wgKSogKCBzdGF0ICkqICd9JyA7CisgKi8KKy0gKHZvaWQpIGJsb2NrCit7CisgICAgLy8gcnVsZVNjb3BlU2V0VXAKKyAgICBnU3RhY2sgPSBbQU5UTFJTeW1ib2xTdGFjayBuZXdBTlRMUlN5bWJvbFN0YWNrV2l0aExlbjozMF07CisgICAgU3ltYm9sc19zY29wZSA9IFtbU3ltYm9sc19TY29wZSBuZXdTeW1ib2xzX1Njb3BlXSByZXRhaW5dOworICAgIFtnU3RhY2sgcHVzaDpTeW1ib2xzX3Njb3BlXTsKKworCisgICAgICAgIGxldmVsKys7CisgICAgICAgIC8qIHNjb3BlU2V0QXR0cmlidXRlUmVmICovCisgICAgKChTeW1ib2xzX1Njb3BlICopW2dTdGFjayBwZWVrXSkubmFtZXMgPSAgW0FOVExSSGFzaE1hcCBuZXdBTlRMUkhhc2hNYXBXaXRoTGVuOjEwMV07CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo1MTo1OiAoICd7JyAoIGRlY2wgKSogKCBzdGF0ICkqICd9JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjUxOjk6ICd7JyAoIGRlY2wgKSogKCBzdGF0ICkqICd9JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTAgRm9sbG93OkZPTExPV18xMF9pbl9ibG9jazE0N107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTNfMD09MTQpICkgeworICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6NTE6MTQ6IGRlY2wgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZGVjbF9pbl9ibG9jazE1MF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGRlY2xdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzOiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ0PTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTRfMD09SUR8fExBNF8wPT0xMCkgKSB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo1MToyMjogc3RhdCAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19zdGF0X2luX2Jsb2NrMTU1XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgc3RhdF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDQ6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjExIEZvbGxvdzpGT0xMT1dfMTFfaW5fYmxvY2sxNTldOyAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICAgICAgTlNMb2coQCJsZXZlbCAlZCBzeW1ib2xzOiAlQCIsIGxldmVsLCAvKiBzY29wZUF0dHJpYnV0ZVJlZiAqLworICAgICAgICAoKFN5bWJvbHNfU2NvcGUgKilbZ1N0YWNrIHBlZWtdKS5uYW1lcyk7CisgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0gICAgQGZpbmFsbHkgeworICAgICAgICBbZ1N0YWNrIHBvcF07CisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgYmxvY2sgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgc3RhdAorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo1ODoxOiBzdGF0IDogKCBJRCAnPScgSU5UICc7JyB8IGJsb2NrICk7CisgKi8KKy0gKHZvaWQpIHN0YXQKK3sKKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6NTg6NTogKCBJRCAnPScgSU5UICc7JyB8IGJsb2NrICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDU9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBNV8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBNV8wPT1JRCkgKSB7CisgICAgICAgICAgICBhbHQ1PTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChMQTVfMD09MTApICkgeworICAgICAgICAgICAgYWx0NT0yOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb246NSBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjU4Ojk6IElEICc9JyBJTlQgJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SUQgRm9sbG93OkZPTExPV19JRF9pbl9zdGF0MTgzXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MTIgRm9sbG93OkZPTExPV18xMl9pbl9zdGF0MTg1XTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SU5UIEZvbGxvdzpGT0xMT1dfSU5UX2luX3N0YXQxODddOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxMyBGb2xsb3c6Rk9MTE9XXzEzX2luX3N0YXQxODldOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3Njb3Blcy9TeW1ib2xUYWJsZS5nOjU5Ojk6IGJsb2NrIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19ibG9ja19pbl9zdGF0MTk5XTsKKyAgICAgICAgICAgICAgICBbc2VsZiBibG9ja107CisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXQgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbAorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo2MjoxOiBkZWNsIDogJ2ludCcgSUQgJzsnIDsKKyAqLworLSAodm9pZCkgZGVjbAoreworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICBAdHJ5IHsKKyAgICAgICAgaWQ8QU5UTFJUb2tlbj4gSUQxID0gbmlsOworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2NvcGVzL1N5bWJvbFRhYmxlLmc6NjI6NTogKCAnaW50JyBJRCAnOycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zY29wZXMvU3ltYm9sVGFibGUuZzo2Mjo5OiAnaW50JyBJRCAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjE0IEZvbGxvdzpGT0xMT1dfMTRfaW5fZGVjbDIxM107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgIElEMT0oaWQ8QU5UTFJUb2tlbj4pW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOklEIEZvbGxvdzpGT0xMT1dfSURfaW5fZGVjbDIxNV07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxMyBGb2xsb3c6Rk9MTE9XXzEzX2luX2RlY2wyMTddOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbLyogc2NvcGVBdHRyaWJ1dGVSZWYgKi8KKyAgICAgICAgKChTeW1ib2xzX1Njb3BlICopW2dTdGFjayBwZWVrXSkubmFtZXMgYWRkT2JqZWN0OklEMV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbCAqLworCitAZW5kIC8vIGVuZCBvZiBTeW1ib2xUYWJsZVBhcnNlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDY2OQorCisvKiBFbmQgb2YgY29kZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzg2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmcKQEAgLTAsMCArMSwxMTkgQEAKK2dyYW1tYXIgU2ltcGxlQzsKK29wdGlvbnMgeworICAgIG91dHB1dD1BU1Q7CisgICAgbGFuZ3VhZ2U9T2JqQzsKK30KKwordG9rZW5zIHsKKyAgICBWQVJfREVGOworICAgIEFSR19ERUY7CisgICAgRlVOQ19IRFI7CisgICAgRlVOQ19ERUNMOworICAgIEZVTkNfREVGOworICAgIEJMT0NLOworfQorCitwcm9ncmFtCisgICAgOiAgIGRlY2xhcmF0aW9uKworICAgIDsKKworZGVjbGFyYXRpb24KKyAgICA6ICAgdmFyaWFibGUKKyAgICB8ICAgZnVuY3Rpb25IZWFkZXIgS19TRU1JQ09MT04gLT4gXihGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIpCisgICAgfCAgIGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2spCisgICAgOworCit2YXJpYWJsZQorICAgIDogICB0eXBlIGRlY2xhcmF0b3IgS19TRU1JQ09MT04gLT4gXihWQVJfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgS19JRCAKKyAgICA7CisKK2Z1bmN0aW9uSGVhZGVyCisgICAgOiAgIHR5cGUgS19JRCBLX0xDVVJWRSAoIGZvcm1hbFBhcmFtZXRlciAoIEtfQ09NTUEgZm9ybWFsUGFyYW1ldGVyICkqICk/IEtfUkNVUlZFCisgICAgICAgIC0+IF4oRlVOQ19IRFIgdHlwZSBLX0lEIGZvcm1hbFBhcmFtZXRlcispCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yIC0+IF4oQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IpCisgICAgOworCit0eXBlCisgICAgOiAgIEtfSU5UX1RZUEUgICAKKyAgICB8ICAgS19DSEFSICAKKyAgICB8ICAgS19WT0lECisgICAgfCAgIEtfSUQgICAgICAgIAorICAgIDsKKworYmxvY2sKKyAgICA6ICAgbGM9S19MQ1VSTFkKKyAgICAgICAgICAgIHZhcmlhYmxlKgorICAgICAgICAgICAgc3RhdCoKKyAgICAgICAgS19SQ1VSTFkKKyAgICAgICAgLT4gXihCTE9DS1skbGMsQCJCTE9DSyJdIHZhcmlhYmxlKiBzdGF0KikKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgS19TRU1JQ09MT04hCisgICAgfCBibG9jaworICAgIHwgYXNzaWduU3RhdCBLX1NFTUlDT0xPTiEKKyAgICB8IEtfU0VNSUNPTE9OIQorICAgIDsKKworZm9yU3RhdAorICAgIDogICBLX0ZPUiBLX0xDVVJWRSBzdGFydD1hc3NpZ25TdGF0IEtfU0VNSUNPTE9OIGV4cHIgS19TRU1JQ09MT04gbmV4dD1hc3NpZ25TdGF0IEtfUkNVUlZFIGJsb2NrCisgICAgICAgIC0+IF4oS19GT1IgJHN0YXJ0IGV4cHIgJG5leHQgYmxvY2spCisgICAgOworCithc3NpZ25TdGF0CisgICAgOiAgIEtfSUQgS19FUSBleHByIC0+IF4oS19FUSBLX0lEIGV4cHIpCisgICAgOworCitleHByOiAgIGNvbmRFeHByCisgICAgOworCitjb25kRXhwcgorICAgIDogICBhZXhwciAoIChLX0VRRVFeIHwgS19MVF4pIGFleHByICk/CisgICAgOworCithZXhwcgorICAgIDogICBhdG9tICggS19QTFVTXiBhdG9tICkqCisgICAgOworCithdG9tCisgICAgOiBLX0lEICAgICAgCisgICAgfCBLX0lOVCAgICAgIAorICAgIHwgS19MQ1VSVkUgZXhwciBLX1JDVVJWRSAtPiBleHByCisgICAgOyAKKworS19GT1IgOiAnZm9yJyA7CitLX0NIQVI6ICdjaGFyJzsKK0tfSU5UX1RZUEUgOiAnaW50JyA7CitLX1ZPSUQ6ICd2b2lkJzsKKworS19JRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworS19JTlQgOglhbkludCs9KCcwJy4uJzknKSsge05TTG9nKEAiXCVAIiwgJGFuSW50KTt9CisgICAgOworCitLX0xDVVJWRSA6ICcoJzsKK0tfUkNVUlZFIDogJyknOworS19QTFVTIDogJysnIDsKK0tfQ09NTUEgOiAnLCc7CitLX1NFTUlDT0xPTiA6ICc7JzsKK0tfTFQgICA6ICc8JyA7CitLX0VRICAgOiAnPScgOworS19FUUVRIDogJz09JyA7CitLX0xDVVJMWSA6ICd7JzsKK0tfUkNVUkxZIDogJ30nOworCitXUyAgOiAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgICdccicKKyAgICAgICAgfCAgICdcbicKKyAgICAgICAgKSsKKyAgICAgICAgeyAkY2hhbm5lbD1ISURERU47IH0KKyAgICA7ICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy50b2tlbnMgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVlZjFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy50b2tlbnMKQEAgLTAsMCArMSwyMyBAQAorQVJHX0RFRj00CitCTE9DSz01CitGVU5DX0RFQ0w9NgorRlVOQ19ERUY9NworRlVOQ19IRFI9OAorS19DSEFSPTkKK0tfQ09NTUE9MTAKK0tfRVE9MTEKK0tfRVFFUT0xMgorS19GT1I9MTMKK0tfSUQ9MTQKK0tfSU5UPTE1CitLX0lOVF9UWVBFPTE2CitLX0xDVVJMWT0xNworS19MQ1VSVkU9MTgKK0tfTFQ9MTkKK0tfUExVUz0yMAorS19SQ1VSTFk9MjEKK0tfUkNVUlZFPTIyCitLX1NFTUlDT0xPTj0yMworS19WT0lEPTI0CitWQVJfREVGPTI1CitXUz0yNgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ0xleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMzNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ0xleGVyLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBTaW1wbGVDLmcgMjAxMS0wNS0wNiAxNTowOToxNworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBTdGFydCBjeWNsaWNERkFJbnRlcmZhY2UgKi8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgQVJHX0RFRiA0CisjZGVmaW5lIEJMT0NLIDUKKyNkZWZpbmUgRlVOQ19ERUNMIDYKKyNkZWZpbmUgRlVOQ19ERUYgNworI2RlZmluZSBGVU5DX0hEUiA4CisjZGVmaW5lIEtfQ0hBUiA5CisjZGVmaW5lIEtfQ09NTUEgMTAKKyNkZWZpbmUgS19FUSAxMQorI2RlZmluZSBLX0VRRVEgMTIKKyNkZWZpbmUgS19GT1IgMTMKKyNkZWZpbmUgS19JRCAxNAorI2RlZmluZSBLX0lOVCAxNQorI2RlZmluZSBLX0lOVF9UWVBFIDE2CisjZGVmaW5lIEtfTENVUkxZIDE3CisjZGVmaW5lIEtfTENVUlZFIDE4CisjZGVmaW5lIEtfTFQgMTkKKyNkZWZpbmUgS19QTFVTIDIwCisjZGVmaW5lIEtfUkNVUkxZIDIxCisjZGVmaW5lIEtfUkNVUlZFIDIyCisjZGVmaW5lIEtfU0VNSUNPTE9OIDIzCisjZGVmaW5lIEtfVk9JRCAyNAorI2RlZmluZSBWQVJfREVGIDI1CisjZGVmaW5lIFdTIDI2CisvKiBpbnRlcmZhY2UgbGV4ZXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ0xleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCit9CisrICh2b2lkKSBpbml0aWFsaXplOworKyAoU2ltcGxlQ0xleGVyICopbmV3U2ltcGxlQ0xleGVyV2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKy8qIE9iakMgc3RhcnQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworLSAodm9pZCkgbUtfRk9SIDsgCistICh2b2lkKSBtS19DSEFSIDsgCistICh2b2lkKSBtS19JTlRfVFlQRSA7IAorLSAodm9pZCkgbUtfVk9JRCA7IAorLSAodm9pZCkgbUtfSUQgOyAKKy0gKHZvaWQpIG1LX0lOVCA7IAorLSAodm9pZCkgbUtfTENVUlZFIDsgCistICh2b2lkKSBtS19SQ1VSVkUgOyAKKy0gKHZvaWQpIG1LX1BMVVMgOyAKKy0gKHZvaWQpIG1LX0NPTU1BIDsgCistICh2b2lkKSBtS19TRU1JQ09MT04gOyAKKy0gKHZvaWQpIG1LX0xUIDsgCistICh2b2lkKSBtS19FUSA7IAorLSAodm9pZCkgbUtfRVFFUSA7IAorLSAodm9pZCkgbUtfTENVUkxZIDsgCistICh2b2lkKSBtS19SQ1VSTFkgOyAKKy0gKHZvaWQpIG1XUyA7IAorLSAodm9pZCkgbVRva2VucyA7IAorCitAZW5kIC8qIGVuZCBvZiBTaW1wbGVDTGV4ZXIgaW50ZXJmYWNlICovCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNMZXhlci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ0xleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNMZXhlci5qYXZhCkBAIC0wLDAgKzEsNzMwIEBACisvLyAkQU5UTFIgMy4yIEF1ZyAxMywgMjAxMCAxNDoxOTozMSBTaW1wbGVDLmcgMjAxMC0wOC0xMyAxNDoyOToxOQorCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIFNpbXBsZUNMZXhlciBleHRlbmRzIExleGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMVD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSPTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUj0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVU5DX0hEUj02OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVD0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVU5DX0RFRj04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9UWVBFPTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEPTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0tMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVU5DX0RFQ0w9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUkdfREVGPTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1M9MjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxPQ0s9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTPTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPSUQ9MTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVE9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSX0RFRj00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRRVE9MTc7CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICAvLyBkZWxlZ2F0b3JzCisKKyAgICBwdWJsaWMgU2ltcGxlQ0xleGVyKCkgezt9IAorICAgIHB1YmxpYyBTaW1wbGVDTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCkgeworICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgU2ltcGxlQ0xleGVyKENoYXJTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzdXBlcihpbnB1dCxzdGF0ZSk7CisKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiU2ltcGxlQy5nIjsgfQorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Nzo3OiAoICc7JyApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Nzo5OiAnOycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc7Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjg6NzogKCAnKCcgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjg6OTogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo5Ojc6ICggJywnICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo5Ojk6ICcsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJywnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTA6NzogKCAnKScgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjEwOjk6ICcpJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyknKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTE6NzogKCAneycgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjExOjk6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTI6NzogKCAnfScgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjEyOjk6ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ30nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJGT1IiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbUZPUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBGT1I7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTE6NTogKCAnZm9yJyApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTE6NzogJ2ZvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiRk9SIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJJTlRfVFlQRSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtSU5UX1RZUEUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gSU5UX1RZUEU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTI6MTA6ICggJ2ludCcgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjkyOjEyOiAnaW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImludCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJJTlRfVFlQRSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiQ0hBUiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtQ0hBUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBDSEFSOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjkzOjU6ICggJ2NoYXInICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo5Mzo3OiAnY2hhcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjaGFyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIkNIQVIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlZPSUQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVZPSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVk9JRDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo5NDo1OiAoICd2b2lkJyApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTQ6NzogJ3ZvaWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidm9pZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJWT0lEIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJJRCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gSUQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTY6NTogKCAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjk2Ojk6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTY6MzM6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICBsb29wMToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMV8wPj0nMCcgJiYgTEExXzA8PSc5Jyl8fChMQTFfMD49J0EnICYmIExBMV8wPD0nWicpfHxMQTFfMD09J18nfHwoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIFNpbXBsZUMuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJJRCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiSU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1JTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gSU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgQ29tbW9uVG9rZW4gaW50PW51bGw7CisgICAgICAgICAgICBMaXN0IGxpc3RfaW50PW51bGw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTk6NTogKCAoaW50Kz0gKCAnMCcgLi4gJzknICkgKSsgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjk5Ojc6IChpbnQrPSAoICcwJyAuLiAnOScgKSApKworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjk5OjEwOiAoaW50Kz0gKCAnMCcgLi4gJzknICkgKSsKKyAgICAgICAgICAgIGludCBjbnQyPTA7CisgICAgICAgICAgICBsb29wMjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOworICAgICAgICAgICAgICAgIGludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMl8wPj0nMCcgJiYgTEEyXzA8PSc5JykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyBTaW1wbGVDLmc6OTk6MTA6IGludCs9ICggJzAnIC4uICc5JyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gU2ltcGxlQy5nOjk5OjEyOiAoICcwJyAuLiAnOScgKQorICAgICAgICAgICAgCSAgICAvLyBTaW1wbGVDLmc6OTk6MTM6ICcwJyAuLiAnOScKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBtYXRjaFJhbmdlKCcwJywnOScpOyAKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MiA+PSAxICkgYnJlYWsgbG9vcDI7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MisrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIE5TTG9nKEAiJUAiLCBsaXN0X2ludCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIklOVCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiRVEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbUVRKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IEVROworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjEwMjo2OiAoICc9JyApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTAyOjg6ICc9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz0nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIkVRIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJFUUVRIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1FUUVRKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IEVRRVE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTAzOjY6ICggJz09JyApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTAzOjg6ICc9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJFUUVRIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJMVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtTFQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gTFQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTA0OjY6ICggJzwnICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxMDQ6ODogJzwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiTFQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlBMVVMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVBMVVMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUExVUzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxMDU6NjogKCAnKycgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjEwNTo4OiAnKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcrJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJQTFVTIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJXUyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtV1MoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gV1M7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTA3OjU6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjEwNzo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjEwNzo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgaW50IGNudDM9MDsKKyAgICAgICAgICAgIGxvb3AzOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEzXzA+PSdcdCcgJiYgTEEzXzA8PSdcbicpfHxMQTNfMD09J1xyJ3x8TEEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIFNpbXBsZUMuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x0JyAmJiBpbnB1dC5MQSgxKTw9J1xuJyl8fGlucHV0LkxBKDEpPT0nXHInfHxpbnB1dC5MQSgxKT09JyAnICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQzID49IDEgKSBicmVhayBsb29wMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQzKys7CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgIF9jaGFubmVsPTk5OyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiV1MiCisKKyAgICBwdWJsaWMgdm9pZCBtVG9rZW5zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjE6ODogKCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBGT1IgfCBJTlRfVFlQRSB8IENIQVIgfCBWT0lEIHwgSUQgfCBJTlQgfCBFUSB8IEVRRVEgfCBMVCB8IFBMVVMgfCBXUyApCisgICAgICAgIGludCBhbHQ0PTE3OworICAgICAgICBhbHQ0ID0gZGZhNC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjEwOiBUX18yMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjE2OiBUX18yMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjIyOiBUX18yMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjI4OiBUX18yNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjM0OiBUX18yNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjQwOiBUX18yNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjQ2OiBGT1IKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUZPUigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6NTA6IElOVF9UWVBFCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1JTlRfVFlQRSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOSA6CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6NTk6IENIQVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUNIQVIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwIDoKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo2NDogVk9JRAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVk9JRCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOgorICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjY5OiBJRAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtSUQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyIDoKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo3MjogSU5UCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1JTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzIDoKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo3NjogRVEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUVRKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNCA6CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6Nzk6IEVRRVEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUVRRVEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1IDoKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo4NDogTFQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUxUKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNiA6CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6ODc6IFBMVVMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVBMVVMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3IDoKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTo5MjogV1MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVdTKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIERGQTQgZGZhNCA9IG5ldyBERkE0KHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNF9lb3RTID0KKyAgICAgICAgIlw3XHVmZmZmXDRcMTNcMlx1ZmZmZlwxXDI2XDNcdWZmZmZcNFwxM1wyXHVmZmZmXDFcMzNcMVwzNFwyXDEzXDIiKworICAgICAgICAiXHVmZmZmXDFcMzdcMVw0MFwyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTRfZW9mUyA9CisgICAgICAgICJcNDFcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNF9taW5TID0KKyAgICAgICAgIlwxXDExXDZcdWZmZmZcMVwxNTdcMVwxNTZcMVwxNTBcMVwxNTdcMlx1ZmZmZlwxXDc1XDNcdWZmZmZcMVwxNjIiKworICAgICAgICAiXDFcMTY0XDFcMTQxXDFcMTUxXDJcdWZmZmZcMlw2MFwxXDE2MlwxXDE0NFwyXHVmZmZmXDJcNjBcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE0X21heFMgPQorICAgICAgICAiXDFcMTc1XDZcdWZmZmZcMVwxNTdcMVwxNTZcMVwxNTBcMVwxNTdcMlx1ZmZmZlwxXDc1XDNcdWZmZmZcMVwxNjIiKworICAgICAgICAiXDFcMTY0XDFcMTQxXDFcMTUxXDJcdWZmZmZcMlwxNzJcMVwxNjJcMVwxNDRcMlx1ZmZmZlwyXDE3MlwyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTRfYWNjZXB0UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDFcMVwyXDFcM1wxXDRcMVw1XDFcNlw0XHVmZmZmXDFcMTNcMVwxNFwxXHVmZmZmXDFcMTciKworICAgICAgICAiXDFcMjBcMVwyMVw0XHVmZmZmXDFcMTZcMVwxNVw0XHVmZmZmXDFcN1wxXDEwXDJcdWZmZmZcMVwxMVwxXDEyIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTRfc3BlY2lhbFMgPQorICAgICAgICAiXDQxXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkE0X3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwyXDIwXDJcdWZmZmZcMVwyMFwyMlx1ZmZmZlwxXDIwXDdcdWZmZmZcMVwyXDFcNFwxXHVmZmZmXDFcMTciKworICAgICAgICAgICAgIlwxXDNcM1x1ZmZmZlwxMlwxNFwxXHVmZmZmXDFcMVwxXDE2XDFcMTVcM1x1ZmZmZlwzMlwxM1w0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVwxM1wxXHVmZmZmXDJcMTNcMVwxMVwyXDEzXDFcN1wyXDEzXDFcMTBcMTRcMTNcMVwxMlw0XDEzXDEiKworICAgICAgICAgICAgIlw1XDFcdWZmZmZcMVw2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwyMSIsCisgICAgICAgICAgICAiXDFcMjIiLAorICAgICAgICAgICAgIlwxXDIzIiwKKyAgICAgICAgICAgICJcMVwyNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDI1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwyNyIsCisgICAgICAgICAgICAiXDFcMzAiLAorICAgICAgICAgICAgIlwxXDMxIiwKKyAgICAgICAgICAgICJcMVwzMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxMlwxM1w3XHVmZmZmXDMyXDEzXDRcdWZmZmZcMVwxM1wxXHVmZmZmXDMyXDEzIiwKKyAgICAgICAgICAgICJcMTJcMTNcN1x1ZmZmZlwzMlwxM1w0XHVmZmZmXDFcMTNcMVx1ZmZmZlwzMlwxMyIsCisgICAgICAgICAgICAiXDFcMzUiLAorICAgICAgICAgICAgIlwxXDM2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDEyXDEzXDdcdWZmZmZcMzJcMTNcNFx1ZmZmZlwxXDEzXDFcdWZmZmZcMzJcMTMiLAorICAgICAgICAgICAgIlwxMlwxM1w3XHVmZmZmXDMyXDEzXDRcdWZmZmZcMVwxM1wxXHVmZmZmXDMyXDEzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBNF9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE0X2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTRfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNF9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTRfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBNF9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTRfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBNF9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE0X2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTRfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBNF9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNF9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkE0X3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBNF90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTRfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBNF90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNF90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkE0IGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBNChCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDQ7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTRfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkE0X2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBNF9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTRfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkE0X2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTRfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTRfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIxOjE6IFRva2VucyA6ICggVF9fMjEgfCBUX18yMiB8IFRfXzIzIHwgVF9fMjQgfCBUX18yNSB8IFRfXzI2IHwgRk9SIHwgSU5UX1RZUEUgfCBDSEFSIHwgVk9JRCB8IElEIHwgSU5UIHwgRVEgfCBFUUVRIHwgTFQgfCBQTFVTIHwgV1MgKTsiOworICAgICAgICB9CisgICAgfQorIAorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ0xleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDTGV4ZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTUwNmUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ0xleGVyLm0KQEAgLTAsMCArMSwxMTUyIEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IFNpbXBsZUMuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDExLTA1LTA2IDE1OjA5OjE3CisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IFNpbXBsZUNMZXhlckxleGVyCisgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLgorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFNpbXBsZUMuZyAyMDExLTA1LTA2IDE1OjA5OjE3CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlNpbXBsZUNMZXhlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzISAqLworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNMZXhlciAvLyBsaW5lIDMzMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiU2ltcGxlQy5nIl07Cit9CisKKysgKE5TU3RyaW5nICopIHRva2VuTmFtZUZvclR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OmFUb2tlblR5cGVdOworfQorCisrIChTaW1wbGVDTGV4ZXIgKiluZXdTaW1wbGVDTGV4ZXJXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbU2ltcGxlQ0xleGVyIGFsbG9jXSBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dF07Cit9CisKKy0gKGlkKSBpbml0V2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjE4KzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIFN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisKKy8qIFN0YXJ0IG9mIFJ1bGVzICovCisvLyAkQU5UTFIgc3RhcnQgIktfRk9SIgorLSAodm9pZCkgbUtfRk9SCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfRk9SOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzo5MTo3OiAoICdmb3InICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo5MTo5OiAnZm9yJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImZvciJdOyAKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJLX0ZPUiIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJLX0NIQVIiCistICh2b2lkKSBtS19DSEFSCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfQ0hBUjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6OTI6NzogKCAnY2hhcicgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjkyOjk6ICdjaGFyJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImNoYXIiXTsgCisKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiS19DSEFSIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIktfSU5UX1RZUEUiCistICh2b2lkKSBtS19JTlRfVFlQRQoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBLX0lOVF9UWVBFOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzo5MzoxMjogKCAnaW50JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6OTM6MTQ6ICdpbnQnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaW50Il07IAorCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfSU5UX1RZUEUiICovCisKKy8vICRBTlRMUiBzdGFydCAiS19WT0lEIgorLSAodm9pZCkgbUtfVk9JRAoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBLX1ZPSUQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjk0Ojc6ICggJ3ZvaWQnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo5NDo5OiAndm9pZCcgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJ2b2lkIl07IAorCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfVk9JRCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJLX0lEIgorLSAodm9pZCkgbUtfSUQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19JRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6OTY6NzogKCAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgKSogKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjk2OjExOiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICdBJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnWicpKXx8W2lucHV0IExBOjFdID09ICdfJ3x8KChbaW5wdXQgTEE6MV0gPj0gJ2EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICd6JykpKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTFfMCA+PSAnMCcgJiYgTEExXzAgPD0gJzknKXx8KExBMV8wID49ICdBJyAmJiBMQTFfMCA8PSAnWicpfHxMQTFfMD09J18nfHwoTEExXzAgPj0gJ2EnICYmIExBMV8wIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKXx8KChbaW5wdXQgTEE6MV0gPj0gJ0EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdaJykpfHxbaW5wdXQgTEE6MV0gPT0gJ18nfHwoKFtpbnB1dCBMQToxXSA+PSAnYScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ3onKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfSUQiICovCisKKy8vICRBTlRMUiBzdGFydCAiS19JTlQiCistICh2b2lkKSBtS19JTlQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19JTlQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqYW5JbnQ9bmlsOworICAgICAgICBBTXV0YWJsZUFycmF5ICpsaXN0X2FuSW50PW5pbDsgCisgICAgICAgIC8vIFNpbXBsZUMuZzo5OTo3OiAoIChhbkludCs9ICggJzAnIC4uICc5JyApICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo5OTo5OiAoYW5JbnQrPSAoICcwJyAuLiAnOScgKSApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyBTaW1wbGVDLmc6OTk6MTQ6IChhbkludCs9ICggJzAnIC4uICc5JyApICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQyID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDIgPSAyOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMl8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBMl8wID49ICcwJyAmJiBMQTJfMCA8PSAnOScpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6OTk6MTQ6IGFuSW50Kz0gKCAnMCcgLi4gJzknICkgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYW5JbnQgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICcwJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnOScpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZS5jID0gYW5JbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MiA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjppbnB1dCBkZWNpc2lvbk51bWJlcjoyXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKworCisgICAgICAgIE5TTG9nKEAiJUAiLCBsaXN0X2FuSW50KTsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtsaXN0X2FuSW50IHJlbGVhc2VdOworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfSU5UIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIktfTENVUlZFIgorLSAodm9pZCkgbUtfTENVUlZFCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfTENVUlZFOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDI6MTA6ICggJygnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDI6MTI6ICcoJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JygnXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfTENVUlZFIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIktfUkNVUlZFIgorLSAodm9pZCkgbUtfUkNVUlZFCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfUkNVUlZFOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDM6MTA6ICggJyknICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDM6MTI6ICcpJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JyknXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfUkNVUlZFIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIktfUExVUyIKKy0gKHZvaWQpIG1LX1BMVVMKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19QTFVTOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDQ6ODogKCAnKycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjEwNDoxMDogJysnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKyddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiS19QTFVTIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIktfQ09NTUEiCistICh2b2lkKSBtS19DT01NQQoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBLX0NPTU1BOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDU6OTogKCAnLCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjEwNToxMTogJywnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonLCddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiS19DT01NQSIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJLX1NFTUlDT0xPTiIKKy0gKHZvaWQpIG1LX1NFTUlDT0xPTgoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBLX1NFTUlDT0xPTjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6MTA2OjEzOiAoICc7JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTA2OjE1OiAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJLX1NFTUlDT0xPTiIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJLX0xUIgorLSAodm9pZCkgbUtfTFQKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19MVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBTaW1wbGVDLmc6MTA3Ojg6ICggJzwnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDc6MTA6ICc8JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JzwnXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIktfTFQiICovCisKKy8vICRBTlRMUiBzdGFydCAiS19FUSIKKy0gKHZvaWQpIG1LX0VRCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfRVE7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjEwODo4OiAoICc9JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MTA4OjEwOiAnPScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic9J107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJLX0VRIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIktfRVFFUSIKKy0gKHZvaWQpIG1LX0VRRVEKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19FUUVROworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDk6ODogKCAnPT0nICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMDk6MTA6ICc9PScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCI9PSJdOyAKKworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJLX0VRRVEiICovCisKKy8vICRBTlRMUiBzdGFydCAiS19MQ1VSTFkiCistICh2b2lkKSBtS19MQ1VSTFkKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19MQ1VSTFk7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExMDoxMDogKCAneycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExMDoxMjogJ3snIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjoneyddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiS19MQ1VSTFkiICovCisKKy8vICRBTlRMUiBzdGFydCAiS19SQ1VSTFkiCistICh2b2lkKSBtS19SQ1VSTFkKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19SQ1VSTFk7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExMToxMDogKCAnfScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExMToxMjogJ30nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonfSddOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiS19SQ1VSTFkiICovCisKKy8vICRBTlRMUiBzdGFydCAiV1MiCistICh2b2lkKSBtV1MKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gV1M7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExMzo1OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxMTM6OTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjExMzo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTNfMCA+PSAnXHQnICYmIExBM18wIDw9ICdcbicpfHxMQTNfMD09J1xyJ3x8TEEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gJ1x0JykgJiYgKFtpbnB1dCBMQToxXSA8PSAnXG4nKSl8fFtpbnB1dCBMQToxXSA9PSAnXHInfHxbaW5wdXQgTEE6MV0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDMgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6M107CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQzKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AzOiA7CisKKworICAgICAgICAgX2NoYW5uZWw9SElEREVOOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiV1MiICovCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBTaW1wbGVDLmc6MTo4OiAoIEtfRk9SIHwgS19DSEFSIHwgS19JTlRfVFlQRSB8IEtfVk9JRCB8IEtfSUQgfCBLX0lOVCB8IEtfTENVUlZFIHwgS19SQ1VSVkUgfCBLX1BMVVMgfCBLX0NPTU1BIHwgS19TRU1JQ09MT04gfCBLX0xUIHwgS19FUSB8IEtfRVFFUSB8IEtfTENVUkxZIHwgS19SQ1VSTFkgfCBXUyApIC8vcnVsZWJsb2NrCisgICAgTlNJbnRlZ2VyIGFsdDQ9MTc7CisgICAgdW5pY2hhciBjaGFyTEE0ID0gW2lucHV0IExBOjFdOworICAgIHN3aXRjaCAoY2hhckxBNCkgeworICAgICAgICBjYXNlICdmJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8xID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTRfMT09J28nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzE3ID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzE3PT0ncicpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzIzID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMjMgPj0gJzAnICYmIExBNF8yMyA8PSAnOScpfHwoTEE0XzIzID49ICdBJyAmJiBMQTRfMjMgPD0gJ1onKXx8TEE0XzIzPT0nXyd8fChMQTRfMjMgPj0gJ2EnICYmIExBNF8yMyA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ9NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8yID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTRfMj09J2gnKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzE4ID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzE4PT0nYScpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzI0ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNF8yND09J3InKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMjggPSBbaW5wdXQgTEE6NV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMjggPj0gJzAnICYmIExBNF8yOCA8PSAnOScpfHwoTEE0XzI4ID49ICdBJyAmJiBMQTRfMjggPD0gJ1onKXx8TEE0XzI4PT0nXyd8fChMQTRfMjggPj0gJ2EnICYmIExBNF8yOCA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQgPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdpJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF8zID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTRfMz09J24nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzE5ID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzE5PT0ndCcpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzI1ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMjUgPj0gJzAnICYmIExBNF8yNSA8PSAnOScpfHwoTEE0XzI1ID49ICdBJyAmJiBMQTRfMjUgPD0gJ1onKXx8TEE0XzI1PT0nXyd8fChMQTRfMjUgPj0gJ2EnICYmIExBNF8yNSA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ9NTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQgPSAzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd2JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBNF80ID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTRfND09J28nKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzIwID0gW2lucHV0IExBOjNdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzIwPT0naScpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE0XzI2ID0gW2lucHV0IExBOjRdOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNF8yNj09J2QnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMzAgPSBbaW5wdXQgTEE6NV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTRfMzAgPj0gJzAnICYmIExBNF8zMCA8PSAnOScpfHwoTEE0XzMwID49ICdBJyAmJiBMQTRfMzAgPD0gJ1onKXx8TEE0XzMwPT0nXyd8fChMQTRfMzAgPj0gJ2EnICYmIExBNF8zMCA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQgPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQ0ID0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdBJzogOworICAgICAgICBjYXNlICdCJzogOworICAgICAgICBjYXNlICdDJzogOworICAgICAgICBjYXNlICdEJzogOworICAgICAgICBjYXNlICdFJzogOworICAgICAgICBjYXNlICdGJzogOworICAgICAgICBjYXNlICdHJzogOworICAgICAgICBjYXNlICdIJzogOworICAgICAgICBjYXNlICdJJzogOworICAgICAgICBjYXNlICdKJzogOworICAgICAgICBjYXNlICdLJzogOworICAgICAgICBjYXNlICdMJzogOworICAgICAgICBjYXNlICdNJzogOworICAgICAgICBjYXNlICdOJzogOworICAgICAgICBjYXNlICdPJzogOworICAgICAgICBjYXNlICdQJzogOworICAgICAgICBjYXNlICdRJzogOworICAgICAgICBjYXNlICdSJzogOworICAgICAgICBjYXNlICdTJzogOworICAgICAgICBjYXNlICdUJzogOworICAgICAgICBjYXNlICdVJzogOworICAgICAgICBjYXNlICdWJzogOworICAgICAgICBjYXNlICdXJzogOworICAgICAgICBjYXNlICdYJzogOworICAgICAgICBjYXNlICdZJzogOworICAgICAgICBjYXNlICdaJzogOworICAgICAgICBjYXNlICdfJzogOworICAgICAgICBjYXNlICdhJzogOworICAgICAgICBjYXNlICdiJzogOworICAgICAgICBjYXNlICdkJzogOworICAgICAgICBjYXNlICdlJzogOworICAgICAgICBjYXNlICdnJzogOworICAgICAgICBjYXNlICdoJzogOworICAgICAgICBjYXNlICdqJzogOworICAgICAgICBjYXNlICdrJzogOworICAgICAgICBjYXNlICdsJzogOworICAgICAgICBjYXNlICdtJzogOworICAgICAgICBjYXNlICduJzogOworICAgICAgICBjYXNlICdvJzogOworICAgICAgICBjYXNlICdwJzogOworICAgICAgICBjYXNlICdxJzogOworICAgICAgICBjYXNlICdyJzogOworICAgICAgICBjYXNlICdzJzogOworICAgICAgICBjYXNlICd0JzogOworICAgICAgICBjYXNlICd1JzogOworICAgICAgICBjYXNlICd3JzogOworICAgICAgICBjYXNlICd4JzogOworICAgICAgICBjYXNlICd5JzogOworICAgICAgICBjYXNlICd6JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND01OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzAnOiA7CisgICAgICAgIGNhc2UgJzEnOiA7CisgICAgICAgIGNhc2UgJzInOiA7CisgICAgICAgIGNhc2UgJzMnOiA7CisgICAgICAgIGNhc2UgJzQnOiA7CisgICAgICAgIGNhc2UgJzUnOiA7CisgICAgICAgIGNhc2UgJzYnOiA7CisgICAgICAgIGNhc2UgJzcnOiA7CisgICAgICAgIGNhc2UgJzgnOiA7CisgICAgICAgIGNhc2UgJzknOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnKCc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9NzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcpJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0ND04OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJysnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLCc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnOyc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPCc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDQ9MTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPSc6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMTMgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKExBNF8xMz09Jz0nKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTE0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWx0NCA9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3snOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ30nOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JzogOworICAgICAgICBjYXNlICdcbic6IDsKKyAgICAgICAgY2FzZSAnXHInOiA7CisgICAgICAgIGNhc2UgJyAnOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhbHQ0PTE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiA7CisgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246NCBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgIG52YWUuYyA9IGNoYXJMQTQ7CisgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgfQorCisgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjEwOiBLX0ZPUiAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1LX0ZPUl07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjE2OiBLX0NIQVIgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19DSEFSXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6MjM6IEtfSU5UX1RZUEUgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19JTlRfVFlQRV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjM0OiBLX1ZPSUQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19WT0lEXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1IDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6NDE6IEtfSUQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19JRF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNiA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjQ2OiBLX0lOVCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1LX0lOVF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNyA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjUyOiBLX0xDVVJWRSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1LX0xDVVJWRV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOCA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjYxOiBLX1JDVVJWRSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1LX1JDVVJWRV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjcwOiBLX1BMVVMgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19QTFVTXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMCA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjc3OiBLX0NPTU1BIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUtfQ09NTUFdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExIDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6ODU6IEtfU0VNSUNPTE9OIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUtfU0VNSUNPTE9OXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMiA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjk3OiBLX0xUIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUtfTFRdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzIDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6MTAyOiBLX0VRIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUtfRVFdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0IDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6MTA3OiBLX0VRRVEgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19FUUVRXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNSA6IDsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxOjExNDogS19MQ1VSTFkgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtS19MQ1VSTFldOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2IDogOworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjE6MTIzOiBLX1JDVVJMWSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1LX1JDVVJMWV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTcgOiA7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MToxMzI6IFdTIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVdTXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworfQorCitAZW5kIC8qIGVuZCBvZiBTaW1wbGVDTGV4ZXIgaW1wbGVtZW50YXRpb24gbGluZSAzOTcgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0MjBjYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNQYXJzZXIuaApAQCAtMCwwICsxLDQxNSBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBTaW1wbGVDLmcgMjAxMS0wNS0wNiAxNTowOToxNworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBwYXJzZXJIZWFkZXJGaWxlICovCisjaWZuZGVmIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCisjZGVmaW5lIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCit0eXBlZGVmIGVudW0geworICAgIEFOVExSX0VPRiA9IC0xLAorICAgIElOVkFMSUQsCisgICAgRU9SLAorICAgIERPV04sCisgICAgVVAsCisgICAgTUlOCit9IEFOVExSM1Rva2VuVHlwZTsKKyNlbmRpZgorCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2Ugc3RhcnQgREZBMgorQGludGVyZmFjZSBERkEyIDogQU5UTFJERkEgeworfQorKyBuZXdERkEyV2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKil0aGVSZWNvZ25pemVyOworLSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilyZWNvZ25pemVyOworQGVuZCAvKiBlbmQgb2YgREZBMiBpbnRlcmZhY2UgICovCisKKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGludGVyZmFjZSBlbmQgREZBMgorCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjaWZkZWYgRU9GCisjdW5kZWYgRU9GCisjZW5kaWYKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIEFSR19ERUYgNAorI2RlZmluZSBCTE9DSyA1CisjZGVmaW5lIEZVTkNfREVDTCA2CisjZGVmaW5lIEZVTkNfREVGIDcKKyNkZWZpbmUgRlVOQ19IRFIgOAorI2RlZmluZSBLX0NIQVIgOQorI2RlZmluZSBLX0NPTU1BIDEwCisjZGVmaW5lIEtfRVEgMTEKKyNkZWZpbmUgS19FUUVRIDEyCisjZGVmaW5lIEtfRk9SIDEzCisjZGVmaW5lIEtfSUQgMTQKKyNkZWZpbmUgS19JTlQgMTUKKyNkZWZpbmUgS19JTlRfVFlQRSAxNgorI2RlZmluZSBLX0xDVVJMWSAxNworI2RlZmluZSBLX0xDVVJWRSAxOAorI2RlZmluZSBLX0xUIDE5CisjZGVmaW5lIEtfUExVUyAyMAorI2RlZmluZSBLX1JDVVJMWSAyMQorI2RlZmluZSBLX1JDVVJWRSAyMgorI2RlZmluZSBLX1NFTUlDT0xPTiAyMworI2RlZmluZSBLX1ZPSUQgMjQKKyNkZWZpbmUgVkFSX0RFRiAyNQorI2RlZmluZSBXUyAyNgorI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvKiByZXR1cm5TY29wZUludGVyZmFjZSBsaW5lIDE4MzggKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovCit9CisvKiBzdGFydCBwcm9wZXJ0aWVzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcyAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuOworLyogdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc0RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvKiBtZXRob2RzRGVjbCAqLworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCisKKworCisvKiByZXR1cm5TY29wZUludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2RlY2xhcmF0aW9uX3JldHVybiAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2RlY2xhcmF0aW9uX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvKiByZXR1cm5TY29wZUludGVyZmFjZSBsaW5lIDE4MzggKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovCit9CisvKiBzdGFydCBwcm9wZXJ0aWVzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcyAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvKiByZXR1cm5TY29wZUludGVyZmFjZSBsaW5lIDE4MzggKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovCit9CisvKiBzdGFydCBwcm9wZXJ0aWVzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcyAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybiAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvKiByZXR1cm5TY29wZUludGVyZmFjZSBsaW5lIDE4MzggKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovCit9CisvKiBzdGFydCBwcm9wZXJ0aWVzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcyAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuOworLyogdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc0RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvKiBtZXRob2RzRGVjbCAqLworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCisKKworCisvKiByZXR1cm5TY29wZUludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgbGluZSAxODM4ICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMoKSAqLworfQorLyogc3RhcnQgcHJvcGVydGllcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9jb25kRXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgbGluZSAxODM4ICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMoKSAqLworfQorLyogc3RhcnQgcHJvcGVydGllcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuOworLyogdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc0RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvKiBtZXRob2RzRGVjbCAqLworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCisKKworCisvKiByZXR1cm5TY29wZUludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYXRvbV9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgbGluZSAxODM4ICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMoKSAqLworfQorLyogc3RhcnQgcHJvcGVydGllcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworCisvKiBJbnRlcmZhY2UgZ3JhbW1hciBjbGFzcyAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyIDogQU5UTFJQYXJzZXIgeyAvKiBsaW5lIDU3MiAqLworLyogT2JqQyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgc3RhcnQgb2YgbWVtVmFycyAqLworLyogQVNUIHBhcnNlckhlYWRlckZpbGUubWVtVmFycyAqLworTlNJbnRlZ2VyIHJ1bGVMZXZlbDsKK05TQXJyYXkgKnJ1bGVOYW1lczsKKyAgLyogQVNUIHN1cGVyLm1lbVZhcnMgKi8KKy8qIEFTVCBwYXJzZXJNZW1WYXJzICovCitpZDxBTlRMUlRyZWVBZGFwdG9yPiB0cmVlQWRhcHRvcjsgICAvKiBBU1QgcGFyc2VyTWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgbWVtVmFycyAqLworCitERkEyICpkZmEyOworIH0KKworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXMgKi8KKy8qIE9iakMgc3RhcnQgb2YgcHJvcGVydGllcyAqLworLyogQVNUIHBhcnNlckhlYWRlckZpbGUucHJvcGVydGllcyAqLworICAvKiBBU1Qgc3VwZXIucHJvcGVydGllcyAqLworLyogQVNUIHBhcnNlclByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZUFkYXB0b3IsIHNldHRlcj1zZXRUcmVlQWRhcHRvcjopIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOyAgIC8qIEFTVCBwYXJzZXJwcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBwcm9wZXJ0aWVzICovCisKKysgKHZvaWQpIGluaXRpYWxpemU7CisrIChpZCkgbmV3U2ltcGxlQ1BhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbTsKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKworLyogT2JqQyBzdGFydCBvZiBtZXRob2RzRGVjbCAqLworLyogQVNUIHBhcnNlckhlYWRlckZpbGUubWV0aG9kc0RlY2wgKi8KKyAgLyogQVNUIHN1cGVyLm1ldGhvZHNEZWNsICovCisvKiBBU1QgcGFyc2VyTWV0aG9kc0RlY2wgKi8KKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPil0aGVUcmVlQWRhcHRvcjsgICAvKiBBU1QgcGFyc2VybWV0aG9kc0RlY2wgKi8KKy8qIE9iakMgZW5kIG9mIG1ldGhvZHNEZWNsICovCisKKy0gKFNpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gKilwcm9ncmFtOyAKKy0gKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuICopZGVjbGFyYXRpb247IAorLSAoU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gKil2YXJpYWJsZTsgCistIChTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuICopZGVjbGFyYXRvcjsgCistIChTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybiAqKWZ1bmN0aW9uSGVhZGVyOyAKKy0gKFNpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiAqKWZvcm1hbFBhcmFtZXRlcjsgCistIChTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICopdHlwZTsgCistIChTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiAqKWJsb2NrOyAKKy0gKFNpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm4gKilzdGF0OyAKKy0gKFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKilmb3JTdGF0OyAKKy0gKFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKilhc3NpZ25TdGF0OyAKKy0gKFNpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4gKilleHByOyAKKy0gKFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuICopY29uZEV4cHI7IAorLSAoU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKilhZXhwcjsgCistIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopYXRvbTsgCisKKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1BhcnNlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1BhcnNlci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDRlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxODE0IEBACisvLyAkQU5UTFIgMy4yIEF1ZyAxMywgMjAxMCAxNDoxOTozMSBTaW1wbGVDLmcgMjAxMC0wOC0xMyAxNDoyOToxOQorCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlQ1BhcnNlciBleHRlbmRzIFBhcnNlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJWQVJfREVGIiwgIkFSR19ERUYiLCAiRlVOQ19IRFIiLCAiRlVOQ19ERUNMIiwgIkZVTkNfREVGIiwgIkJMT0NLIiwgIklEIiwgIkVRIiwgIklOVCIsICJGT1IiLCAiSU5UX1RZUEUiLCAiQ0hBUiIsICJWT0lEIiwgIkVRRVEiLCAiTFQiLCAiUExVUyIsICJXUyIsICInOyciLCAiJygnIiwgIicsJyIsICInKSciLCAiJ3snIiwgIid9JyIKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExUPTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVI9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfSERSPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVGPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RZUEU9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVDTD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSR19ERUY9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUz0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSz05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVM9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9JRD0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUT0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJfREVGPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFFUT0xNzsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworCisgICAgICAgIHB1YmxpYyBTaW1wbGVDUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTaW1wbGVDUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0LCBzdGF0ZSk7CisgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgcHJvdGVjdGVkIFRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFRyZWVBZGFwdG9yKFRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKyAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICB9CisgICAgcHVibGljIFRyZWVBZGFwdG9yIGdldFRyZWVBZGFwdG9yKCkgeworICAgICAgICByZXR1cm4gYWRhcHRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VG9rZW5OYW1lcygpIHsgcmV0dXJuIFNpbXBsZUNQYXJzZXIudG9rZW5OYW1lczsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIlNpbXBsZUMuZyI7IH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBwcm9ncmFtX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAicHJvZ3JhbSIKKyAgICAvLyBTaW1wbGVDLmc6MTY6MTogcHJvZ3JhbSA6ICggZGVjbGFyYXRpb24gKSsgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLnByb2dyYW1fcmV0dXJuIHByb2dyYW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLnByb2dyYW1fcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLnByb2dyYW1fcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRpb25fcmV0dXJuIGRlY2xhcmF0aW9uMSA9IG51bGw7CisKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MTc6NTogKCAoIGRlY2xhcmF0aW9uICkrICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxNzo5OiAoIGRlY2xhcmF0aW9uICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxNzo5OiAoIGRlY2xhcmF0aW9uICkrCisgICAgICAgICAgICBpbnQgY250MT0wOworICAgICAgICAgICAgbG9vcDE6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMV8wPT1JRHx8KExBMV8wPj1JTlRfVFlQRSAmJiBMQTFfMDw9Vk9JRCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyBTaW1wbGVDLmc6MTc6OTogZGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtODUpOworICAgICAgICAgICAgCSAgICBkZWNsYXJhdGlvbjE9ZGVjbGFyYXRpb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIAkgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIGRlY2xhcmF0aW9uMS5nZXRUcmVlKCkpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQxID49IDEgKSBicmVhayBsb29wMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQxKys7CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInByb2dyYW0iCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGRlY2xhcmF0aW9uX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZGVjbGFyYXRpb24iCisgICAgLy8gU2ltcGxlQy5nOjIwOjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyICc7JyAtPiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKTsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5kZWNsYXJhdGlvbl9yZXR1cm4gZGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmRlY2xhcmF0aW9uX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5kZWNsYXJhdGlvbl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsND1udWxsOworICAgICAgICBTaW1wbGVDUGFyc2VyLnZhcmlhYmxlX3JldHVybiB2YXJpYWJsZTIgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuZnVuY3Rpb25IZWFkZXJfcmV0dXJuIGZ1bmN0aW9uSGVhZGVyMyA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mdW5jdGlvbkhlYWRlcl9yZXR1cm4gZnVuY3Rpb25IZWFkZXI1ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmJsb2NrX3JldHVybiBibG9jazYgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDRfdHJlZT1udWxsOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMT1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMSIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2Z1bmN0aW9uSGVhZGVyPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBmdW5jdGlvbkhlYWRlciIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2Jsb2NrPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBibG9jayIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjIxOjU6ICggdmFyaWFibGUgfCBmdW5jdGlvbkhlYWRlciAnOycgLT4gXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkgfCBmdW5jdGlvbkhlYWRlciBibG9jayAtPiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApICkKKyAgICAgICAgICAgIGludCBhbHQyPTM7CisgICAgICAgICAgICBhbHQyID0gZGZhMi5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoyMTo5OiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjEwNSk7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlMj12YXJpYWJsZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgdmFyaWFibGUyLmdldFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MjI6OTogZnVuY3Rpb25IZWFkZXIgJzsnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMTUpOworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkhlYWRlcjM9ZnVuY3Rpb25IZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2Z1bmN0aW9uSGVhZGVyLmFkZChmdW5jdGlvbkhlYWRlcjMuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsND0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX2RlY2xhcmF0aW9uMTE3KTsgIAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fMjEuYWRkKGNoYXJfbGl0ZXJhbDQpOworCisKKworICAgICAgICAgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50czogZnVuY3Rpb25IZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMjI6Mjg6IC0+IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoyMjozMTogXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdCgoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKEZVTkNfREVDTCwgIkZVTkNfREVDTCIpLCByb290XzEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2Z1bmN0aW9uSGVhZGVyLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjIzOjk6IGZ1bmN0aW9uSGVhZGVyIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMzUpOworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkhlYWRlcjU9ZnVuY3Rpb25IZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2Z1bmN0aW9uSGVhZGVyLmFkZChmdW5jdGlvbkhlYWRlcjUuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzcpOworICAgICAgICAgICAgICAgICAgICBibG9jazY9YmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2Jsb2NrLmFkZChibG9jazYuZ2V0VHJlZSgpKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBibG9jaywgZnVuY3Rpb25IZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMjM6MzA6IC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjIzOjMzOiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3QoKE9iamVjdClhZGFwdG9yLmNyZWF0ZShGVU5DX0RFRiwgIkZVTkNfREVGIiksIHJvb3RfMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fZnVuY3Rpb25IZWFkZXIubmV4dFRyZWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2Jsb2NrLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImRlY2xhcmF0aW9uIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyB2YXJpYWJsZV9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInZhcmlhYmxlIgorICAgIC8vIFNpbXBsZUMuZzoyNjoxOiB2YXJpYWJsZSA6IHR5cGUgZGVjbGFyYXRvciAnOycgLT4gXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSA7CisgICAgcHVibGljIGZpbmFsIFNpbXBsZUNQYXJzZXIudmFyaWFibGVfcmV0dXJuIHZhcmlhYmxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci52YXJpYWJsZV9yZXR1cm4gcmV0dmFsID0gbmV3IFNpbXBsZUNQYXJzZXIudmFyaWFibGVfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDk9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci50eXBlX3JldHVybiB0eXBlNyA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5kZWNsYXJhdG9yX3JldHVybiBkZWNsYXJhdG9yOCA9IG51bGw7CisKKworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsOV90cmVlPW51bGw7CisgICAgICAgIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gc3RyZWFtXzIxPW5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDIxIik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZGVjbGFyYXRvcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZGVjbGFyYXRvciIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3R5cGU9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHR5cGUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoyNzo1OiAoIHR5cGUgZGVjbGFyYXRvciAnOycgLT4gXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Mjc6OTogdHlwZSBkZWNsYXJhdG9yICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTE2Nik7CisgICAgICAgICAgICB0eXBlNz10eXBlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgc3RyZWFtX3R5cGUuYWRkKHR5cGU3LmdldFRyZWUoKSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTY4KTsKKyAgICAgICAgICAgIGRlY2xhcmF0b3I4PWRlY2xhcmF0b3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fZGVjbGFyYXRvci5hZGQoZGVjbGFyYXRvcjguZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDk9KFRva2VuKW1hdGNoKGlucHV0LDIxLEZPTExPV18yMV9pbl92YXJpYWJsZTE3MCk7ICAKKyAgICAgICAgICAgIHN0cmVhbV8yMS5hZGQoY2hhcl9saXRlcmFsOSk7CisKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IGRlY2xhcmF0b3IsIHR5cGUKKyAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgLy8gMjc6Mjk6IC0+IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Mjc6MzI6IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdCgoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKFZBUl9ERUYsICJWQVJfREVGIiksIHJvb3RfMSk7CisKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX3R5cGUubmV4dFRyZWUoKSk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9kZWNsYXJhdG9yLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJ2YXJpYWJsZSIKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZGVjbGFyYXRvcl9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImRlY2xhcmF0b3IiCisgICAgLy8gU2ltcGxlQy5nOjMwOjE6IGRlY2xhcmF0b3IgOiBJRCA7CisgICAgcHVibGljIGZpbmFsIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4gZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4gcmV0dmFsID0gbmV3IFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gSUQxMD1udWxsOworCisgICAgICAgIE9iamVjdCBJRDEwX3RyZWU9bnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjMxOjU6ICggSUQgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjMxOjk6IElECisgICAgICAgICAgICB7CisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgIElEMTA9KFRva2VuKW1hdGNoKGlucHV0LElELEZPTExPV19JRF9pbl9kZWNsYXJhdG9yMTk5KTsgCisgICAgICAgICAgICBJRDEwX3RyZWUgPSAoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKElEMTApOworICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIElEMTBfdHJlZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJkZWNsYXJhdG9yIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBmdW5jdGlvbkhlYWRlcl9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImZ1bmN0aW9uSGVhZGVyIgorICAgIC8vIFNpbXBsZUMuZzozNDoxOiBmdW5jdGlvbkhlYWRlciA6IHR5cGUgSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScgLT4gXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5mdW5jdGlvbkhlYWRlcl9yZXR1cm4gZnVuY3Rpb25IZWFkZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmZ1bmN0aW9uSGVhZGVyX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5mdW5jdGlvbkhlYWRlcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gSUQxMj1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWwxMz1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWwxNT1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWwxNz1udWxsOworICAgICAgICBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuIHR5cGUxMSA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuIGZvcm1hbFBhcmFtZXRlcjE0ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmZvcm1hbFBhcmFtZXRlcl9yZXR1cm4gZm9ybWFsUGFyYW1ldGVyMTYgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IElEMTJfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMTNfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMTVfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMTdfdHJlZT1udWxsOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV9JRD1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiBJRCIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMj1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMiIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMz1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMyIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yND1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyNCIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2Zvcm1hbFBhcmFtZXRlcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZm9ybWFsUGFyYW1ldGVyIik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fdHlwZT1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgdHlwZSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjM1OjU6ICggdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJyAtPiBeKCBGVU5DX0hEUiB0eXBlIElEICggZm9ybWFsUGFyYW1ldGVyICkrICkgKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjM1Ojk6IHR5cGUgSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIyMTkpOworICAgICAgICAgICAgdHlwZTExPXR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fdHlwZS5hZGQodHlwZTExLmdldFRyZWUoKSk7CisgICAgICAgICAgICBJRDEyPShUb2tlbiltYXRjaChpbnB1dCxJRCxGT0xMT1dfSURfaW5fZnVuY3Rpb25IZWFkZXIyMjEpOyAgCisgICAgICAgICAgICBzdHJlYW1fSUQuYWRkKElEMTIpOworCisgICAgICAgICAgICBjaGFyX2xpdGVyYWwxMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX2Z1bmN0aW9uSGVhZGVyMjIzKTsgIAorICAgICAgICAgICAgc3RyZWFtXzIyLmFkZChjaGFyX2xpdGVyYWwxMyk7CisKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzozNToyMTogKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT1JRHx8KExBNF8wPj1JTlRfVFlQRSAmJiBMQTRfMDw9Vk9JRCkpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzozNToyMzogZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIyNyk7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hbFBhcmFtZXRlcjE0PWZvcm1hbFBhcmFtZXRlcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fZm9ybWFsUGFyYW1ldGVyLmFkZChmb3JtYWxQYXJhbWV0ZXIxNC5nZXRUcmVlKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MzU6Mzk6ICggJywnIGZvcm1hbFBhcmFtZXRlciApKgorICAgICAgICAgICAgICAgICAgICBsb29wMzoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09MjMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gU2ltcGxlQy5nOjM1OjQxOiAnLCcgZm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGNoYXJfbGl0ZXJhbDE1PShUb2tlbiltYXRjaChpbnB1dCwyMyxGT0xMT1dfMjNfaW5fZnVuY3Rpb25IZWFkZXIyMzEpOyAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RyZWFtXzIzLmFkZChjaGFyX2xpdGVyYWwxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzMpOworICAgICAgICAgICAgICAgICAgICAJICAgIGZvcm1hbFBhcmFtZXRlcjE2PWZvcm1hbFBhcmFtZXRlcigpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RyZWFtX2Zvcm1hbFBhcmFtZXRlci5hZGQoZm9ybWFsUGFyYW1ldGVyMTYuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGFyX2xpdGVyYWwxNz0oVG9rZW4pbWF0Y2goaW5wdXQsMjQsRk9MTE9XXzI0X2luX2Z1bmN0aW9uSGVhZGVyMjQxKTsgIAorICAgICAgICAgICAgc3RyZWFtXzI0LmFkZChjaGFyX2xpdGVyYWwxNyk7CisKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IElELCBmb3JtYWxQYXJhbWV0ZXIsIHR5cGUKKyAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgLy8gMzY6OTogLT4gXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjM2OjEyOiBeKCBGVU5DX0hEUiB0eXBlIElEICggZm9ybWFsUGFyYW1ldGVyICkrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdCgoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKEZVTkNfSERSLCAiRlVOQ19IRFIiKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fdHlwZS5uZXh0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX0lELm5leHROb2RlKCkpOworICAgICAgICAgICAgICAgIGlmICggIShzdHJlYW1fZm9ybWFsUGFyYW1ldGVyLmhhc05leHQoKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICggc3RyZWFtX2Zvcm1hbFBhcmFtZXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fZm9ybWFsUGFyYW1ldGVyLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmVhbV9mb3JtYWxQYXJhbWV0ZXIucmVzZXQoKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCByb290XzEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZnVuY3Rpb25IZWFkZXIiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGZvcm1hbFBhcmFtZXRlcl9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyBTaW1wbGVDLmc6Mzk6MTogZm9ybWFsUGFyYW1ldGVyIDogdHlwZSBkZWNsYXJhdG9yIC0+IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmZvcm1hbFBhcmFtZXRlcl9yZXR1cm4gZm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmZvcm1hbFBhcmFtZXRlcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci50eXBlX3JldHVybiB0eXBlMTggPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4gZGVjbGFyYXRvcjE5ID0gbnVsbDsKKworCisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZGVjbGFyYXRvcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZGVjbGFyYXRvciIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3R5cGU9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHR5cGUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo0MDo1OiAoIHR5cGUgZGVjbGFyYXRvciAtPiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo0MDo5OiB0eXBlIGRlY2xhcmF0b3IKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjgxKTsKKyAgICAgICAgICAgIHR5cGUxOD10eXBlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgc3RyZWFtX3R5cGUuYWRkKHR5cGUxOC5nZXRUcmVlKCkpOworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODMpOworICAgICAgICAgICAgZGVjbGFyYXRvcjE5PWRlY2xhcmF0b3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fZGVjbGFyYXRvci5hZGQoZGVjbGFyYXRvcjE5LmdldFRyZWUoKSk7CisKKworICAgICAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBkZWNsYXJhdG9yLCB0eXBlCisgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgIC8vIDQwOjI1OiAtPiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjI4OiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9iamVjdCByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3QoKE9iamVjdClhZGFwdG9yLmNyZWF0ZShBUkdfREVGLCAiQVJHX0RFRiIpLCByb290XzEpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV90eXBlLm5leHRUcmVlKCkpOworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fZGVjbGFyYXRvci5uZXh0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCByb290XzEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZm9ybWFsUGFyYW1ldGVyIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyB0eXBlX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAidHlwZSIKKyAgICAvLyBTaW1wbGVDLmc6NDM6MTogdHlwZSA6ICggJ2ludCcgfCAnY2hhcicgfCAndm9pZCcgfCBJRCApOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuIHR5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIHNldDIwPW51bGw7CisKKyAgICAgICAgT2JqZWN0IHNldDIwX3RyZWU9bnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjQ0OjU6ICggJ2ludCcgfCAnY2hhcicgfCAndm9pZCcgfCBJRCApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgIHNldDIwPShUb2tlbilpbnB1dC5MVCgxKTsKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PUlEfHwoaW5wdXQuTEEoMSk+PUlOVF9UWVBFICYmIGlucHV0LkxBKDEpPD1WT0lEKSApIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIChPYmplY3QpYWRhcHRvci5jcmVhdGUoc2V0MjApKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtc2U7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJ0eXBlIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBibG9ja19yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImJsb2NrIgorICAgIC8vIFNpbXBsZUMuZzo1MDoxOiBibG9jayA6IGxjPSAneycgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogJ30nIC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5ibG9ja19yZXR1cm4gYmxvY2soKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmJsb2NrX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5ibG9ja19yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gbGM9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMjM9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci52YXJpYWJsZV9yZXR1cm4gdmFyaWFibGUyMSA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5zdGF0X3JldHVybiBzdGF0MjIgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IGxjX3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDIzX3RyZWU9bnVsbDsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjU9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjUiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjY9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjYiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV92YXJpYWJsZT1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgdmFyaWFibGUiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9zdGF0PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBzdGF0Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NTE6NTogKGxjPSAneycgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogJ30nIC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1MTo5OiBsYz0gJ3snICggdmFyaWFibGUgKSogKCBzdGF0ICkqICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbGM9KFRva2VuKW1hdGNoKGlucHV0LDI1LEZPTExPV18yNV9pbl9ibG9jazM3Nik7ICAKKyAgICAgICAgICAgIHN0cmVhbV8yNS5hZGQobGMpOworCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NTI6MTM6ICggdmFyaWFibGUgKSoKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTVfMD09SUQpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTVfMj09SUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTVfMD49SU5UX1RZUEUgJiYgTEE1XzA8PVZPSUQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gU2ltcGxlQy5nOjUyOjEzOiB2YXJpYWJsZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzkwKTsKKyAgICAgICAgICAgIAkgICAgdmFyaWFibGUyMT12YXJpYWJsZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgCSAgICBzdHJlYW1fdmFyaWFibGUuYWRkKHZhcmlhYmxlMjEuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NTM6MTM6ICggc3RhdCApKgorICAgICAgICAgICAgbG9vcDY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNl8wPT1JRHx8KExBNl8wPj1JTlQgJiYgTEE2XzA8PUZPUil8fChMQTZfMD49MjEgJiYgTEE2XzA8PTIyKXx8TEE2XzA9PTI1KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gU2ltcGxlQy5nOjUzOjEzOiBzdGF0CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfc3RhdF9pbl9ibG9jazQwNSk7CisgICAgICAgICAgICAJICAgIHN0YXQyMj1zdGF0KCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAJICAgIHN0cmVhbV9zdGF0LmFkZChzdGF0MjIuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBjaGFyX2xpdGVyYWwyMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzI2X2luX2Jsb2NrNDE2KTsgIAorICAgICAgICAgICAgc3RyZWFtXzI2LmFkZChjaGFyX2xpdGVyYWwyMyk7CisKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IHN0YXQsIHZhcmlhYmxlCisgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgIC8vIDU1Ojk6IC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjU1OjEyOiBeKCBCTE9DS1skbGMsQFwiQkxPQ0tcIl0gKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KChPYmplY3QpYWRhcHRvci5jcmVhdGUoQkxPQ0ssIGxjLCBAIkJMT0NLIiksIHJvb3RfMSk7CisKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NTU6MzQ6ICggdmFyaWFibGUgKSoKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHN0cmVhbV92YXJpYWJsZS5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fdmFyaWFibGUubmV4dFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtX3ZhcmlhYmxlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjU1OjQ0OiAoIHN0YXQgKSoKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHN0cmVhbV9zdGF0Lmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9zdGF0Lm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmVhbV9zdGF0LnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImJsb2NrIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBzdGF0X3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAic3RhdCIKKyAgICAvLyBTaW1wbGVDLmc6NTg6MTogc3RhdCA6ICggZm9yU3RhdCB8IGV4cHIgJzsnIHwgYmxvY2sgfCBhc3NpZ25TdGF0ICc7JyB8ICc7JyApOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLnN0YXRfcmV0dXJuIHN0YXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLnN0YXRfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLnN0YXRfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDI2PW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDI5PW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDMwPW51bGw7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuZm9yU3RhdF9yZXR1cm4gZm9yU3RhdDI0ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIyNSA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5ibG9ja19yZXR1cm4gYmxvY2syNyA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hc3NpZ25TdGF0X3JldHVybiBhc3NpZ25TdGF0MjggPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDI2X3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDI5X3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDMwX3RyZWU9bnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjU4OjU6ICggZm9yU3RhdCB8IGV4cHIgJzsnIHwgYmxvY2sgfCBhc3NpZ25TdGF0ICc7JyB8ICc7JyApCisgICAgICAgICAgICBpbnQgYWx0Nz01OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIEZPUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTdfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE3XzI9PUVRKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Nz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTdfMj49RVFFUSAmJiBMQTdfMjw9UExVUyl8fExBN18yPT0yMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3LCAyLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDcsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1ODo3OiBmb3JTdGF0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDQ0OSk7CisgICAgICAgICAgICAgICAgICAgIGZvclN0YXQyND1mb3JTdGF0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBmb3JTdGF0MjQuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1OTo3OiBleHByICc7JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX3N0YXQ0NTcpOworICAgICAgICAgICAgICAgICAgICBleHByMjU9ZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgZXhwcjI1LmdldFRyZWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDI2PShUb2tlbiltYXRjaChpbnB1dCwyMSxGT0xMT1dfMjFfaW5fc3RhdDQ1OSk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjYwOjc6IGJsb2NrCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Jsb2NrX2luX3N0YXQ0NjgpOworICAgICAgICAgICAgICAgICAgICBibG9jazI3PWJsb2NrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBibG9jazI3LmdldFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NjE6NzogYXNzaWduU3RhdCAnOycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYXNzaWduU3RhdF9pbl9zdGF0NDc2KTsKKyAgICAgICAgICAgICAgICAgICAgYXNzaWduU3RhdDI4PWFzc2lnblN0YXQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIGFzc2lnblN0YXQyOC5nZXRUcmVlKCkpOworICAgICAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWwyOT0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX3N0YXQ0NzgpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo2Mjo3OiAnOycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsMzA9KFRva2VuKW1hdGNoKGlucHV0LDIxLEZPTExPV18yMV9pbl9zdGF0NDg3KTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAic3RhdCIKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZm9yU3RhdF9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImZvclN0YXQiCisgICAgLy8gU2ltcGxlQy5nOjY1OjE6IGZvclN0YXQgOiAnZm9yJyAnKCcgc3RhcnQ9IGFzc2lnblN0YXQgJzsnIGV4cHIgJzsnIG5leHQ9IGFzc2lnblN0YXQgJyknIGJsb2NrIC0+IF4oICdmb3InICRzdGFydCBleHByICRuZXh0IGJsb2NrICkgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmZvclN0YXRfcmV0dXJuIGZvclN0YXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmZvclN0YXRfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmZvclN0YXRfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIHN0cmluZ19saXRlcmFsMzE9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMzI9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMzM9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMzU9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMzY9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hc3NpZ25TdGF0X3JldHVybiBzdGFydCA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hc3NpZ25TdGF0X3JldHVybiBuZXh0ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIzNCA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5ibG9ja19yZXR1cm4gYmxvY2szNyA9IG51bGw7CisKKworICAgICAgICBPYmplY3Qgc3RyaW5nX2xpdGVyYWwzMV90cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWwzMl90cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWwzM190cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWwzNV90cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWwzNl90cmVlPW51bGw7CisgICAgICAgIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gc3RyZWFtXzIxPW5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDIxIik7CisgICAgICAgIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gc3RyZWFtX0ZPUj1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiBGT1IiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjI9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjIiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjQ9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjQiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9hc3NpZ25TdGF0PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBhc3NpZ25TdGF0Iik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fYmxvY2s9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGJsb2NrIik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZXhwcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZXhwciIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjY2OjU6ICggJ2ZvcicgJygnIHN0YXJ0PSBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBuZXh0PSBhc3NpZ25TdGF0ICcpJyBibG9jayAtPiBeKCAnZm9yJyAkc3RhcnQgZXhwciAkbmV4dCBibG9jayApICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo2Njo5OiAnZm9yJyAnKCcgc3RhcnQ9IGFzc2lnblN0YXQgJzsnIGV4cHIgJzsnIG5leHQ9IGFzc2lnblN0YXQgJyknIGJsb2NrCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdfbGl0ZXJhbDMxPShUb2tlbiltYXRjaChpbnB1dCxGT1IsRk9MTE9XX0ZPUl9pbl9mb3JTdGF0NTA3KTsgIAorICAgICAgICAgICAgc3RyZWFtX0ZPUi5hZGQoc3RyaW5nX2xpdGVyYWwzMSk7CisKKyAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDMyPShUb2tlbiltYXRjaChpbnB1dCwyMixGT0xMT1dfMjJfaW5fZm9yU3RhdDUwOSk7ICAKKyAgICAgICAgICAgIHN0cmVhbV8yMi5hZGQoY2hhcl9saXRlcmFsMzIpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MTMpOworICAgICAgICAgICAgc3RhcnQ9YXNzaWduU3RhdCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHN0cmVhbV9hc3NpZ25TdGF0LmFkZChzdGFydC5nZXRUcmVlKCkpOworICAgICAgICAgICAgY2hhcl9saXRlcmFsMzM9KFRva2VuKW1hdGNoKGlucHV0LDIxLEZPTExPV18yMV9pbl9mb3JTdGF0NTE1KTsgIAorICAgICAgICAgICAgc3RyZWFtXzIxLmFkZChjaGFyX2xpdGVyYWwzMyk7CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDUxNyk7CisgICAgICAgICAgICBleHByMzQ9ZXhwcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHN0cmVhbV9leHByLmFkZChleHByMzQuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDM1PShUb2tlbiltYXRjaChpbnB1dCwyMSxGT0xMT1dfMjFfaW5fZm9yU3RhdDUxOSk7ICAKKyAgICAgICAgICAgIHN0cmVhbV8yMS5hZGQoY2hhcl9saXRlcmFsMzUpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MjMpOworICAgICAgICAgICAgbmV4dD1hc3NpZ25TdGF0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgc3RyZWFtX2Fzc2lnblN0YXQuYWRkKG5leHQuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDM2PShUb2tlbiltYXRjaChpbnB1dCwyNCxGT0xMT1dfMjRfaW5fZm9yU3RhdDUyNSk7ICAKKyAgICAgICAgICAgIHN0cmVhbV8yNC5hZGQoY2hhcl9saXRlcmFsMzYpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ibG9ja19pbl9mb3JTdGF0NTI3KTsKKyAgICAgICAgICAgIGJsb2NrMzc9YmxvY2soKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fYmxvY2suYWRkKGJsb2NrMzcuZ2V0VHJlZSgpKTsKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IG5leHQsIHN0YXJ0LCBGT1IsIGJsb2NrLCBleHByCisgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbCwgc3RhcnQsIG5leHQKKyAgICAgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9zdGFydD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgc3RhcnQiLHN0YXJ0IT1udWxsP3N0YXJ0LnRyZWU6bnVsbCk7CisgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX25leHQ9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIG5leHQiLG5leHQhPW51bGw/bmV4dC50cmVlOm51bGwpOworCisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAvLyA2Nzo5OiAtPiBeKCAnZm9yJyAkc3RhcnQgZXhwciAkbmV4dCBibG9jayApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjY3OjEyOiBeKCAnZm9yJyAkc3RhcnQgZXhwciAkbmV4dCBibG9jayApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9iamVjdCByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtX0ZPUi5uZXh0Tm9kZSgpLCByb290XzEpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9zdGFydC5uZXh0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2V4cHIubmV4dFRyZWUoKSk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9uZXh0Lm5leHRUcmVlKCkpOworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fYmxvY2submV4dFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImZvclN0YXQiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGFzc2lnblN0YXRfcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgT2JqZWN0IHRyZWU7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJlZSgpIHsgcmV0dXJuIHRyZWU7IH0KKyAgICB9OworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJhc3NpZ25TdGF0IgorICAgIC8vIFNpbXBsZUMuZzo3MDoxOiBhc3NpZ25TdGF0IDogSUQgRVEgZXhwciAtPiBeKCBFUSBJRCBleHByICkgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuIGFzc2lnblN0YXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIElEMzg9bnVsbDsKKyAgICAgICAgVG9rZW4gRVEzOT1udWxsOworICAgICAgICBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHI0MCA9IG51bGw7CisKKworICAgICAgICBPYmplY3QgSUQzOF90cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBFUTM5X3RyZWU9bnVsbDsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fRVE9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gRVEiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fSUQ9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gSUQiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9leHByPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBleHByIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NzE6NTogKCBJRCBFUSBleHByIC0+IF4oIEVRIElEIGV4cHIgKSApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NzE6OTogSUQgRVEgZXhwcgorICAgICAgICAgICAgeworICAgICAgICAgICAgSUQzOD0oVG9rZW4pbWF0Y2goaW5wdXQsSUQsRk9MTE9XX0lEX2luX2Fzc2lnblN0YXQ1NzApOyAgCisgICAgICAgICAgICBzdHJlYW1fSUQuYWRkKElEMzgpOworCisgICAgICAgICAgICBFUTM5PShUb2tlbiltYXRjaChpbnB1dCxFUSxGT0xMT1dfRVFfaW5fYXNzaWduU3RhdDU3Mik7ICAKKyAgICAgICAgICAgIHN0cmVhbV9FUS5hZGQoRVEzOSk7CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDU3NCk7CisgICAgICAgICAgICBleHByNDA9ZXhwcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHN0cmVhbV9leHByLmFkZChleHByNDAuZ2V0VHJlZSgpKTsKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IEVRLCBJRCwgZXhwcgorICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAvLyA3MToyMDogLT4gXiggRVEgSUQgZXhwciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjcxOjIzOiBeKCBFUSBJRCBleHByICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fRVEubmV4dE5vZGUoKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fSUQubmV4dE5vZGUoKSk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9leHByLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJhc3NpZ25TdGF0IgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBleHByX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZXhwciIKKyAgICAvLyBTaW1wbGVDLmc6NzQ6MTogZXhwciA6IGNvbmRFeHByIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5leHByX3JldHVybiBleHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5leHByX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5leHByX3JldHVybigpOworICAgICAgICByZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworICAgICAgICBPYmplY3Qgcm9vdF8wID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmNvbmRFeHByX3JldHVybiBjb25kRXhwcjQxID0gbnVsbDsKKworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo3NDo1OiAoIGNvbmRFeHByICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo3NDo5OiBjb25kRXhwcgorICAgICAgICAgICAgeworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19jb25kRXhwcl9pbl9leHByNTk4KTsKKyAgICAgICAgICAgIGNvbmRFeHByNDE9Y29uZEV4cHIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgY29uZEV4cHI0MS5nZXRUcmVlKCkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImV4cHIiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGNvbmRFeHByX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiY29uZEV4cHIiCisgICAgLy8gU2ltcGxlQy5nOjc3OjE6IGNvbmRFeHByIDogYWV4cHIgKCAoICc9PScgfCAnPCcgKSBhZXhwciApPyA7CisgICAgcHVibGljIGZpbmFsIFNpbXBsZUNQYXJzZXIuY29uZEV4cHJfcmV0dXJuIGNvbmRFeHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5jb25kRXhwcl9yZXR1cm4gcmV0dmFsID0gbmV3IFNpbXBsZUNQYXJzZXIuY29uZEV4cHJfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIHN0cmluZ19saXRlcmFsNDM9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsNDQ9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hZXhwcl9yZXR1cm4gYWV4cHI0MiA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hZXhwcl9yZXR1cm4gYWV4cHI0NSA9IG51bGw7CisKKworICAgICAgICBPYmplY3Qgc3RyaW5nX2xpdGVyYWw0M190cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWw0NF90cmVlPW51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo3ODo1OiAoIGFleHByICggKCAnPT0nIHwgJzwnICkgYWV4cHIgKT8gKQorICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjc4Ojk6IGFleHByICggKCAnPT0nIHwgJzwnICkgYWV4cHIgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MTcpOworICAgICAgICAgICAgYWV4cHI0Mj1hZXhwcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBhZXhwcjQyLmdldFRyZWUoKSk7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Nzg6MTU6ICggKCAnPT0nIHwgJzwnICkgYWV4cHIgKT8KKyAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoKExBOV8wPj1FUUVRICYmIExBOV8wPD1MVCkpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo3ODoxNzogKCAnPT0nIHwgJzwnICkgYWV4cHIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Nzg6MTc6ICggJz09JyB8ICc8JyApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBOF8wPT1FUUVRKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOF8wPT1MVCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDgsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjc4OjE4OiAnPT0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saXRlcmFsNDM9KFRva2VuKW1hdGNoKGlucHV0LEVRRVEsRk9MTE9XX0VRRVFfaW5fY29uZEV4cHI2MjIpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGl0ZXJhbDQzX3RyZWUgPSAoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKHN0cmluZ19saXRlcmFsNDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KHN0cmluZ19saXRlcmFsNDNfdHJlZSwgcm9vdF8wKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Nzg6MjY6ICc8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWw0ND0oVG9rZW4pbWF0Y2goaW5wdXQsTFQsRk9MTE9XX0xUX2luX2NvbmRFeHByNjI3KTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsNDRfdHJlZSA9IChPYmplY3QpYWRhcHRvci5jcmVhdGUoY2hhcl9saXRlcmFsNDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KGNoYXJfbGl0ZXJhbDQ0X3RyZWUsIHJvb3RfMCk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MzEpOworICAgICAgICAgICAgICAgICAgICBhZXhwcjQ1PWFleHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBhZXhwcjQ1LmdldFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiY29uZEV4cHIiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGFleHByX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiYWV4cHIiCisgICAgLy8gU2ltcGxlQy5nOjgxOjE6IGFleHByIDogYXRvbSAoICcrJyBhdG9tICkqIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5hZXhwcl9yZXR1cm4gYWV4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmFleHByX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5hZXhwcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsNDc9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hdG9tX3JldHVybiBhdG9tNDYgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuYXRvbV9yZXR1cm4gYXRvbTQ4ID0gbnVsbDsKKworCisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWw0N190cmVlPW51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo4Mjo1OiAoIGF0b20gKCAnKycgYXRvbSApKiApCisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODI6OTogYXRvbSAoICcrJyBhdG9tICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2F0b21faW5fYWV4cHI2NTMpOworICAgICAgICAgICAgYXRvbTQ2PWF0b20oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgYXRvbTQ2LmdldFRyZWUoKSk7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODI6MTQ6ICggJysnIGF0b20gKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzA9PVBMVVMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIFNpbXBsZUMuZzo4MjoxNjogJysnIGF0b20KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBjaGFyX2xpdGVyYWw0Nz0oVG9rZW4pbWF0Y2goaW5wdXQsUExVUyxGT0xMT1dfUExVU19pbl9hZXhwcjY1Nyk7IAorICAgICAgICAgICAgCSAgICBjaGFyX2xpdGVyYWw0N190cmVlID0gKE9iamVjdClhZGFwdG9yLmNyZWF0ZShjaGFyX2xpdGVyYWw0Nyk7CisgICAgICAgICAgICAJICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KGNoYXJfbGl0ZXJhbDQ3X3RyZWUsIHJvb3RfMCk7CisKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfYXRvbV9pbl9hZXhwcjY2MCk7CisgICAgICAgICAgICAJICAgIGF0b200OD1hdG9tKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAJICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBhdG9tNDguZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImFleHByIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBhdG9tX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiYXRvbSIKKyAgICAvLyBTaW1wbGVDLmc6ODU6MTogYXRvbSA6ICggSUQgfCBJTlQgfCAnKCcgZXhwciAnKScgLT4gZXhwciApOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmF0b21fcmV0dXJuIGF0b20oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmF0b21fcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmF0b21fcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIElENDk9bnVsbDsKKyAgICAgICAgVG9rZW4gSU5UNTA9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsNTE9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsNTM9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5leHByX3JldHVybiBleHByNTIgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IElENDlfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgSU5UNTBfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsNTFfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsNTNfdHJlZT1udWxsOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMj1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMiIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yND1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyNCIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2V4cHI9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGV4cHIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo4Njo1OiAoIElEIHwgSU5UIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgKQorICAgICAgICAgICAgaW50IGFsdDExPTM7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDExPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDExLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjg2Ojc6IElECisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICAgICAgICAgIElENDk9KFRva2VuKW1hdGNoKGlucHV0LElELEZPTExPV19JRF9pbl9hdG9tNjgwKTsgCisgICAgICAgICAgICAgICAgICAgIElENDlfdHJlZSA9IChPYmplY3QpYWRhcHRvci5jcmVhdGUoSUQ0OSk7CisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBJRDQ5X3RyZWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODc6NzogSU5UCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICAgICAgICAgIElOVDUwPShUb2tlbiltYXRjaChpbnB1dCxJTlQsRk9MTE9XX0lOVF9pbl9hdG9tNjk0KTsgCisgICAgICAgICAgICAgICAgICAgIElOVDUwX3RyZWUgPSAoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKElOVDUwKTsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIElOVDUwX3RyZWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODg6NzogJygnIGV4cHIgJyknCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsNTE9KFRva2VuKW1hdGNoKGlucHV0LDIyLEZPTExPV18yMl9pbl9hdG9tNzA4KTsgIAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fMjIuYWRkKGNoYXJfbGl0ZXJhbDUxKTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2F0b203MTApOworICAgICAgICAgICAgICAgICAgICBleHByNTI9ZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fZXhwci5hZGQoZXhwcjUyLmdldFRyZWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDUzPShUb2tlbiltYXRjaChpbnB1dCwyNCxGT0xMT1dfMjRfaW5fYXRvbTcxMik7ICAKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtXzI0LmFkZChjaGFyX2xpdGVyYWw1Myk7CisKKworCisgICAgICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBleHByCisgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIDg4OjIwOiAtPiBleHByCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBzdHJlYW1fZXhwci5uZXh0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImF0b20iCisKKyAgICAvLyBEZWxlZ2F0ZWQgcnVsZXMKKworCisgICAgcHJvdGVjdGVkIERGQTIgZGZhMiA9IG5ldyBERkEyKHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMl9lb3RTID0KKyAgICAgICAgIlwxNVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyX2VvZlMgPQorICAgICAgICAiXDE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTJfbWluUyA9CisgICAgICAgICJcMlwxMlwxXDI1XDFcMTJcMVx1ZmZmZlwxXDEyXDFcMjVcMVwyN1wyXHVmZmZmXDJcMTJcMVwyNyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyX21heFMgPQorICAgICAgICAiXDFcMjBcMVwxMlwxXDI2XDFcMzBcMVx1ZmZmZlwxXDEyXDFcMzFcMVwzMFwyXHVmZmZmXDFcMjBcMVwxMlwxIisKKyAgICAgICAgIlwzMCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyX2FjY2VwdFMgPQorICAgICAgICAiXDRcdWZmZmZcMVwxXDNcdWZmZmZcMVwzXDFcMlwzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTJfc3BlY2lhbFMgPQorICAgICAgICAiXDE1XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEyX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxXDFcM1x1ZmZmZlwzXDEiLAorICAgICAgICAgICAgIlwxXDIiLAorICAgICAgICAgICAgIlwxXDRcMVwzIiwKKyAgICAgICAgICAgICJcMVw1XDNcdWZmZmZcM1w1XDdcdWZmZmZcMVw2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDciLAorICAgICAgICAgICAgIlwxXDExXDNcdWZmZmZcMVwxMCIsCisgICAgICAgICAgICAiXDFcMTJcMVw2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTNcM1x1ZmZmZlwzXDEzIiwKKyAgICAgICAgICAgICJcMVwxNCIsCisgICAgICAgICAgICAiXDFcMTJcMVw2IgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMl9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMl9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMl9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTJfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMl9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTJfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMl90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMl9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTJfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMl9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTJfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMl9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMl90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjIwOjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyICc7JyAtPiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKTsiOworICAgICAgICB9CisgICAgfQorIAorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW04NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMUM0MDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uMTA1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9kZWNsYXJhdGlvbjExNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTM1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMjAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTE2OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAyMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIxX2luX3ZhcmlhYmxlMTcwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjE5OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIyMTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19JRF9pbl9mdW5jdGlvbkhlYWRlcjIyMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyX2luX2Z1bmN0aW9uSGVhZGVyMjIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTAxQzQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTgwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjNfaW5fZnVuY3Rpb25IZWFkZXIyMzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDFDNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAxODAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNF9pbl9mdW5jdGlvbkhlYWRlcjI0MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjgxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19zZXRfaW5fdHlwZTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNV9pbl9ibG9jazM3NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDY2MUY0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzkwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwNjYxRjQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfc3RhdF9pbl9ibG9jazQwNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDY2MDM0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI2X2luX2Jsb2NrNDE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9zdGF0NDU3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjFfaW5fc3RhdDQ1OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX3N0YXQ0NjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9zdGF0NDc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjFfaW5fc3RhdDQ4NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0ZPUl9pbl9mb3JTdGF0NTA3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDQwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjJfaW5fZm9yU3RhdDUwOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDA0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAyMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIxX2luX2ZvclN0YXQ1MTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAxNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2ZvclN0YXQ1MTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9mb3JTdGF0NTE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjRfaW5fZm9yU3RhdDUyNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDIwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19JRF9pbl9hc3NpZ25TdGF0NTcwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDgwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfRVFfaW5fYXNzaWduU3RhdDU3MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDE0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDU3NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2NvbmRFeHByX2luX2V4cHI1OTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYxNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwNjAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0VRRVFfaW5fY29uZEV4cHI2MjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAxNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19MVF9pbl9jb25kRXhwcjYyNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDE0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYXRvbV9pbl9hZXhwcjY1MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwODAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX1BMVVNfaW5fYWV4cHI2NTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAxNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hdG9tX2luX2FleHByNjYwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDA4MDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfSURfaW5fYXRvbTY4MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0lOVF9pbl9hdG9tNjk0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjJfaW5fYXRvbTcwOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDE0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fYXRvbTcxMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDEwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI0X2luX2F0b203MTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1BhcnNlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1BhcnNlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmEwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDUGFyc2VyLm0KQEAgLTAsMCArMSwzMTA2IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IFNpbXBsZUMuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDExLTA1LTA2IDE1OjA5OjE3CisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IFNpbXBsZUNQYXJzZXJQYXJzZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gU2ltcGxlQy5nIDIwMTEtMDUtMDYgMTU6MDk6MTcKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiU2ltcGxlQ1BhcnNlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gc3RhcnQgREZBMgorQGltcGxlbWVudGF0aW9uIERGQTIKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl9lb3RbMTNdID0KKyAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX2VvZlsxM10gPQorICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX07Citjb25zdCBzdGF0aWMgdW5pY2hhciBkZmEyX21pblsxM10gPQorICAgIHs5LDE0LDE4LDksMCwxNCwxNywxMCwwLDAsOSwxNCwxMH07Citjb25zdCBzdGF0aWMgdW5pY2hhciBkZmEyX21heFsxM10gPQorICAgIHsyNCwxNCwyMywyNCwwLDE0LDIzLDIyLDAsMCwyNCwxNCwyMn07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfYWNjZXB0WzEzXSA9CisgICAgey0xLC0xLC0xLC0xLDEsLTEsLTEsLTEsMiwzLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl9zcGVjaWFsWzEzXSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uW10gPSB7fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uMFtdID0gezksIC0xLCAtMSwgLTEsIC0xLCAtMSwgOH07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjFbXSA9IHsxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisgLTEsIC0xLCAtMSwgLTEsIC0xLCA2fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uMltdID0gezUsIC0xLCAtMSwgLTEsIC0xLCA1LCAtMSwgNSwgCisgLTEsIC0xLCAtMSwgLTEsIC0xLCA2LCAtMSwgNX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjNbXSA9IHsxMSwgLTEsIC0xLCAtMSwgLTEsIDExLCAtMSwgCisgMTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjRbXSA9IHszLCAtMSwgLTEsIC0xLCAtMSwgNH07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjVbXSA9IHsxLCAtMSwgLTEsIC0xLCAtMSwgMSwgLTEsIDEsIAorIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uNltdID0gezd9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb243W10gPSB7MTJ9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb244W10gPSB7Mn07CisKKworKyAoaWQpIG5ld0RGQTJXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKWFSZWNvZ25pemVyCit7CisgICAgcmV0dXJuIFtbW0RGQTIgYWxsb2NdIGluaXRXaXRoUmVjb2duaXplcjphUmVjb2duaXplcl0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXRXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKSB0aGVSZWNvZ25pemVyCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aFJlY29nbml6ZXI6dGhlUmVjb2duaXplcl07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgZGVjaXNpb25OdW1iZXIgPSAyOworICAgICAgICBlb3QgPSBkZmEyX2VvdDsKKyAgICAgICAgZW9mID0gZGZhMl9lb2Y7CisgICAgICAgIG1pbiA9IGRmYTJfbWluOworICAgICAgICBtYXggPSBkZmEyX21heDsKKyAgICAgICAgYWNjZXB0ID0gZGZhMl9hY2NlcHQ7CisgICAgICAgIHNwZWNpYWwgPSBkZmEyX3NwZWNpYWw7CisgICAgICAgIGlmICghKHRyYW5zaXRpb24gPSBjYWxsb2MoMTMsIHNpemVvZih2b2lkKikpKSkgeworICAgICAgICAgICAgW3NlbGYgcmVsZWFzZV07CisgICAgICAgICAgICByZXR1cm4gbmlsOworICAgICAgICB9CisgICAgICAgIGxlbiA9IDEzOworICAgICAgICB0cmFuc2l0aW9uWzBdID0gZGZhMl90cmFuc2l0aW9uNTsKKyAgICAgICAgdHJhbnNpdGlvblsxXSA9IGRmYTJfdHJhbnNpdGlvbjg7CisgICAgICAgIHRyYW5zaXRpb25bMl0gPSBkZmEyX3RyYW5zaXRpb240OworICAgICAgICB0cmFuc2l0aW9uWzNdID0gZGZhMl90cmFuc2l0aW9uMjsKKworICAgICAgICB0cmFuc2l0aW9uWzRdID0gZGZhMl90cmFuc2l0aW9uNjsKKyAgICAgICAgdHJhbnNpdGlvbls1XSA9IGRmYTJfdHJhbnNpdGlvbjA7CisgICAgICAgIHRyYW5zaXRpb25bNl0gPSBkZmEyX3RyYW5zaXRpb24xOworCisKKyAgICAgICAgdHJhbnNpdGlvbls3XSA9IGRmYTJfdHJhbnNpdGlvbjM7CisgICAgICAgIHRyYW5zaXRpb25bOF0gPSBkZmEyX3RyYW5zaXRpb243OworICAgICAgICB0cmFuc2l0aW9uWzldID0gZGZhMl90cmFuc2l0aW9uMTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBmcmVlKHRyYW5zaXRpb24pOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24KK3sKKyAgICByZXR1cm4gQCIyMDoxOiBkZWNsYXJhdGlvbiA6ICggdmFyaWFibGUgfCBmdW5jdGlvbkhlYWRlciBLX1NFTUlDT0xPTiAtPiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKTsiOworfQorCisKK0BlbmQgLyogZW5kIERGQTIgaW1wbGVtZW50YXRpb24gKi8KKworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gZW5kIERGQTIKKworCisKKyNwcmFnbWEgbWFyayBCaXRzZXRzCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtODU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtODVfZGF0YVtdID0geyAweDAwMDAwMDAwMDEwMTQyMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjEwNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uMTA1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMTU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjExNV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDgwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfU0VNSUNPTE9OX2luX2RlY2xhcmF0aW9uMTE3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19TRU1JQ09MT05faW5fZGVjbGFyYXRpb24xMTdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjEzNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTM1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDIwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjEzN19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3R5cGVfaW5fdmFyaWFibGUxNjY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0MDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTE2ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxNjhfZGF0YVtdID0geyAweDAwMDAwMDAwMDA4MDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX1NFTUlDT0xPTl9pbl92YXJpYWJsZTE3MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfU0VNSUNPTE9OX2luX3ZhcmlhYmxlMTcwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTk5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTk5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjIxOTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIyMTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDQwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0lEX2luX2Z1bmN0aW9uSGVhZGVyMjIxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjIyMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA0MDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfTENVUlZFX2luX2Z1bmN0aW9uSGVhZGVyMjIzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19MQ1VSVkVfaW5fZnVuY3Rpb25IZWFkZXIyMjNfZGF0YVtdID0geyAweDAwMDAwMDAwMDE0MTQyMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMjc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMjdfZGF0YVtdID0geyAweDAwMDAwMDAwMDA0MDA0MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0NPTU1BX2luX2Z1bmN0aW9uSGVhZGVyMjMxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19DT01NQV9pbl9mdW5jdGlvbkhlYWRlcjIzMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMTAxNDIwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIzMzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIzM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDQwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfUkNVUlZFX2luX2Z1bmN0aW9uSGVhZGVyMjQxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19SQ1VSVkVfaW5fZnVuY3Rpb25IZWFkZXIyNDFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjI4MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjgxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0MDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjI4M19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfTENVUkxZX2luX2Jsb2NrMzc2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19MQ1VSTFlfaW5fYmxvY2szNzZfZGF0YVtdID0geyAweDAwMDAwMDAwMDFBN0UyMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV192YXJpYWJsZV9pbl9ibG9jazM5MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzkwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAxQTdFMjAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfc3RhdF9pbl9ibG9jazQwNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3N0YXRfaW5fYmxvY2s0MDVfZGF0YVtdID0geyAweDAwMDAwMDAwMDBBNkUwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX1JDVVJMWV9pbl9ibG9jazQxNjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfUkNVUkxZX2luX2Jsb2NrNDE2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9zdGF0NDU3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9zdGF0NDU3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwODAwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19TRU1JQ09MT05faW5fc3RhdDQ1OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfU0VNSUNPTE9OX2luX3N0YXQ0NTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ibG9ja19pbl9zdGF0NDY4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYmxvY2tfaW5fc3RhdDQ2OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDQ3NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDQ3Nl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDgwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfU0VNSUNPTE9OX2luX3N0YXQ0Nzg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX1NFTUlDT0xPTl9pbl9zdGF0NDc4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19TRU1JQ09MT05faW5fc3RhdDQ4NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfU0VNSUNPTE9OX2luX3N0YXQ0ODdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0ZPUl9pbl9mb3JTdGF0NTA3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDUwN19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA0MDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfTENVUlZFX2luX2ZvclN0YXQ1MDk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0xDVVJWRV9pbl9mb3JTdGF0NTA5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0MDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTEzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTEzX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwODAwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19TRU1JQ09MT05faW5fZm9yU3RhdDUxNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfU0VNSUNPTE9OX2luX2ZvclN0YXQ1MTVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNEMwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2ZvclN0YXQ1MTc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2ZvclN0YXQ1MTdfZGF0YVtdID0geyAweDAwMDAwMDAwMDA4MDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX1NFTUlDT0xPTl9pbl9mb3JTdGF0NTE5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19TRU1JQ09MT05faW5fZm9yU3RhdDUxOV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwNDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUyMzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUyM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDQwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfUkNVUlZFX2luX2ZvclN0YXQ1MjU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX1JDVVJWRV9pbl9mb3JTdGF0NTI1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDIwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDUyNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0lEX2luX2Fzc2lnblN0YXQ1NzA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0lEX2luX2Fzc2lnblN0YXQ1NzBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA4MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0VRX2luX2Fzc2lnblN0YXQ1NzI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0VRX2luX2Fzc2lnblN0YXQ1NzJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNEMwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2Fzc2lnblN0YXQ1NzQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2Fzc2lnblN0YXQ1NzRfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19jb25kRXhwcl9pbl9leHByNTk4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjU5OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjE3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MTdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwODEwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0VRRVFfaW5fY29uZEV4cHI2MjI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0VRRVFfaW5fY29uZEV4cHI2MjJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNEMwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0xUX2luX2NvbmRFeHByNjI3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19MVF9pbl9jb25kRXhwcjYyN19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA0QzAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MzFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hdG9tX2luX2FleHByNjUzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYXRvbV9pbl9hZXhwcjY1M19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDEwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfUExVU19pbl9hZXhwcjY1NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfUExVU19pbl9hZXhwcjY1N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA0QzAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2F0b21faW5fYWV4cHI2NjA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19hdG9tX2luX2FleHByNjYwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMTAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19JRF9pbl9hdG9tNjgwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19JRF9pbl9hdG9tNjgwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19JTlRfaW5fYXRvbTY5NDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfSU5UX2luX2F0b202OTRfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0xDVVJWRV9pbl9hdG9tNzA4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19MQ1VSVkVfaW5fYXRvbTcwOF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA0QzAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fYXRvbTcxMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fYXRvbTcxMF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDQwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfUkNVUlZFX2luX2F0b203MTI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX1JDVVJWRV9pbl9hdG9tNzEyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDUGFyc2VyX2RlY2xhcmF0aW9uX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAvKiByZXR1cm5TY29wZSAqLworLyogQVNUIHJldHVyblNjb3BlLnN5bnRoZXNpemUgKi8KK0BzeW50aGVzaXplIHRyZWU7IC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIHNlbGYudHJlZSA9IG5pbDsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybiAvKiByZXR1cm5TY29wZSAqLworLyogQVNUIHJldHVyblNjb3BlLnN5bnRoZXNpemUgKi8KK0BzeW50aGVzaXplIHRyZWU7IC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIHNlbGYudHJlZSA9IG5pbDsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybiAvKiByZXR1cm5TY29wZSAqLworLyogQVNUIHJldHVyblNjb3BlLnN5bnRoZXNpemUgKi8KK0BzeW50aGVzaXplIHRyZWU7IC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIHNlbGYudHJlZSA9IG5pbDsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiAvKiByZXR1cm5TY29wZSAqLworLyogQVNUIHJldHVyblNjb3BlLnN5bnRoZXNpemUgKi8KK0BzeW50aGVzaXplIHRyZWU7IC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIHNlbGYudHJlZSA9IG5pbDsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuIC8qIHJldHVyblNjb3BlICovCisvKiBBU1QgcmV0dXJuU2NvcGUuc3ludGhlc2l6ZSAqLworQHN5bnRoZXNpemUgdHJlZTsgLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTgzNyAqLworKyAoU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgc2VsZi50cmVlID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAvKiByZXR1cm5TY29wZSAqLworLyogQVNUIHJldHVyblNjb3BlLnN5bnRoZXNpemUgKi8KK0BzeW50aGVzaXplIHRyZWU7IC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIHNlbGYudHJlZSA9IG5pbDsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuIC8qIHJldHVyblNjb3BlICovCisvKiBBU1QgcmV0dXJuU2NvcGUuc3ludGhlc2l6ZSAqLworQHN5bnRoZXNpemUgdHJlZTsgLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTgzNyAqLworKyAoU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgc2VsZi50cmVlID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuIC8qIHJldHVyblNjb3BlICovCisvKiBBU1QgcmV0dXJuU2NvcGUuc3ludGhlc2l6ZSAqLworQHN5bnRoZXNpemUgdHJlZTsgLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTgzNyAqLworKyAoU2ltcGxlQ1BhcnNlcl9jb25kRXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgc2VsZi50cmVlID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuIC8qIHJldHVyblNjb3BlICovCisvKiBBU1QgcmV0dXJuU2NvcGUuc3ludGhlc2l6ZSAqLworQHN5bnRoZXNpemUgdHJlZTsgLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTgzNyAqLworKyAoU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgc2VsZi50cmVlID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfYXRvbV9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCisvLyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKy8vCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXIgIC8vIGxpbmUgNjM3CisKKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgZ2xvYmFsIEF0dHJpYnV0ZSBTY29wZXMKKy8qIE9iakMgc3RhcnQgZ2xvYmFsQXR0cmlidXRlU2NvcGUgKi8KKy8qIE9iakMgZW5kIGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW50aGVzaXplICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBzdGFydCBzeW50aGVzaXplKCkgKi8KKy8qIEFTVCBnZW5lcmljUGFyc2VyLnN5bnRoZXNpemUgKi8KKy8qIEFTVCBwYXJzZXJQcm9wZXJ0aWVzICovCitAc3ludGhlc2l6ZSB0cmVlQWRhcHRvcjsKKy8qIE9iakMgZW5kIHN5bnRoZXNpemUoKSAqLworCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTg1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTg1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb24xMDUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjEwNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTE1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX1NFTUlDT0xPTl9pbl9kZWNsYXJhdGlvbjExNyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfU0VNSUNPTE9OX2luX2RlY2xhcmF0aW9uMTE3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMzUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjEzNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTM3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTE2Nl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxNjggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTY4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19TRU1JQ09MT05faW5fdmFyaWFibGUxNzAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX1NFTUlDT0xPTl9pbl92YXJpYWJsZTE3MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfSURfaW5fZGVjbGFyYXRvcjE5OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fZGVjbGFyYXRvcjE5OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIyMTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMjE5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjIyMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIyMjFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0xDVVJWRV9pbl9mdW5jdGlvbkhlYWRlcjIyMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfTENVUlZFX2luX2Z1bmN0aW9uSGVhZGVyMjIzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19DT01NQV9pbl9mdW5jdGlvbkhlYWRlcjIzMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfQ09NTUFfaW5fZnVuY3Rpb25IZWFkZXIyMzFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX1JDVVJWRV9pbl9mdW5jdGlvbkhlYWRlcjI0MSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfUkNVUlZFX2luX2Z1bmN0aW9uSGVhZGVyMjQxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIyODEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjI4MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMjgzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0xDVVJMWV9pbl9ibG9jazM3NiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfTENVUkxZX2luX2Jsb2NrMzc2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2szOTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9ibG9jazM5MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3N0YXRfaW5fYmxvY2s0MDUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zdGF0X2luX2Jsb2NrNDA1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19SQ1VSTFlfaW5fYmxvY2s0MTYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX1JDVVJMWV9pbl9ibG9jazQxNl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDQ0OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDQ0OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fc3RhdDQ1NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fc3RhdDQ1N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfU0VNSUNPTE9OX2luX3N0YXQ0NTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX1NFTUlDT0xPTl9pbl9zdGF0NDU5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYmxvY2tfaW5fc3RhdDQ2OCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Jsb2NrX2luX3N0YXQ0NjhfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX1NFTUlDT0xPTl9pbl9zdGF0NDc4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19TRU1JQ09MT05faW5fc3RhdDQ3OF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfU0VNSUNPTE9OX2luX3N0YXQ0ODcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX1NFTUlDT0xPTl9pbl9zdGF0NDg3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDUwNyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfRk9SX2luX2ZvclN0YXQ1MDdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0xDVVJWRV9pbl9mb3JTdGF0NTA5ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19MQ1VSVkVfaW5fZm9yU3RhdDUwOV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxM19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfU0VNSUNPTE9OX2luX2ZvclN0YXQ1MTUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX1NFTUlDT0xPTl9pbl9mb3JTdGF0NTE1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NTE3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NTE3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19TRU1JQ09MT05faW5fZm9yU3RhdDUxOSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfU0VNSUNPTE9OX2luX2ZvclN0YXQ1MTlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MjMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MjNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX1JDVVJWRV9pbl9mb3JTdGF0NTI1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19SQ1VSVkVfaW5fZm9yU3RhdDUyNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19ibG9ja19pbl9mb3JTdGF0NTI3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9hc3NpZ25TdGF0NTcwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19JRF9pbl9hc3NpZ25TdGF0NTcwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19FUV9pbl9hc3NpZ25TdGF0NTcyID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19FUV9pbl9hc3NpZ25TdGF0NTcyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9hc3NpZ25TdGF0NTc0ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9hc3NpZ25TdGF0NTc0X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjU5OCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2NvbmRFeHByX2luX2V4cHI1OThfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYxNyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjE3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19FUUVRX2luX2NvbmRFeHByNjIyID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19FUUVRX2luX2NvbmRFeHByNjIyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19MVF9pbl9jb25kRXhwcjYyNyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfTFRfaW5fY29uZEV4cHI2MjdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYzMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYXRvbV9pbl9hZXhwcjY1MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2F0b21faW5fYWV4cHI2NTNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX1BMVVNfaW5fYWV4cHI2NTcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX1BMVVNfaW5fYWV4cHI2NTdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hdG9tX2luX2FleHByNjYwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYXRvbV9pbl9hZXhwcjY2MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfSURfaW5fYXRvbTY4MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fYXRvbTY4MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfSU5UX2luX2F0b202OTQgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0lOVF9pbl9hdG9tNjk0X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19MQ1VSVkVfaW5fYXRvbTcwOCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfTENVUlZFX2luX2F0b203MDhfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2F0b203MTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2F0b203MTBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX1JDVVJWRV9pbl9hdG9tNzEyID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19SQ1VSVkVfaW5fYXRvbTcxMl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRUb2tlbk5hbWVzOltbQU11dGFibGVBcnJheSBhcnJheVdpdGhPYmplY3RzOkAiPGludmFsaWQ+IiwgQCI8RU9SPiIsIEAiPERPV04+IiwgQCI8VVA+IiwgCisgQCJBUkdfREVGIiwgQCJCTE9DSyIsIEAiRlVOQ19ERUNMIiwgQCJGVU5DX0RFRiIsIEAiRlVOQ19IRFIiLCBAIktfQ0hBUiIsIAorIEAiS19DT01NQSIsIEAiS19FUSIsIEAiS19FUUVRIiwgQCJLX0ZPUiIsIEAiS19JRCIsIEAiS19JTlQiLCBAIktfSU5UX1RZUEUiLCAKKyBAIktfTENVUkxZIiwgQCJLX0xDVVJWRSIsIEAiS19MVCIsIEAiS19QTFVTIiwgQCJLX1JDVVJMWSIsIEAiS19SQ1VSVkUiLCAKKyBAIktfU0VNSUNPTE9OIiwgQCJLX1ZPSUQiLCBAIlZBUl9ERUYiLCBAIldTIiwgbmlsXSByZXRhaW5dXTsKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRHcmFtbWFyRmlsZU5hbWU6QCJTaW1wbGVDLmciXTsKK30KKworKyAoU2ltcGxlQ1BhcnNlciAqKW5ld1NpbXBsZUNQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICByZXR1cm4gW1tTaW1wbGVDUGFyc2VyIGFsbG9jXSBpbml0V2l0aFRva2VuU3RyZWFtOmFTdHJlYW1dOworCisKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbSBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MTUrMV0gcmV0YWluXV07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKworCisgICAgICAgIGRmYTIgPSBbREZBMiBuZXdERkEyV2l0aFJlY29nbml6ZXI6c2VsZl07CisgICAgICAgIC8qIHN0YXJ0IG9mIGFjdGlvbnMtYWN0aW9uU2NvcGUtaW5pdCAqLworICAgICAgICAvKiBzdGFydCBvZiBpbml0ICovCisgICAgICAgIC8qIEFTVCBnZW5lcmljUGFyc2VyLmluaXQgKi8KKyAgICAgICAgW3NlbGYgc2V0VHJlZUFkYXB0b3I6W1tBTlRMUkNvbW1vblRyZWVBZGFwdG9yIG5ld1RyZWVBZGFwdG9yXSByZXRhaW5dXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbZGZhMiByZWxlYXNlXTsKKyAgICAvKiBBU1QgZ2VuZXJpY1BhcnNlci5kZWFsbG9jICovCisgICAgW3NlbGYgc2V0VHJlZUFkYXB0b3I6bmlsXTsKKworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBzdGFydCBtZW1iZXJzICovCisvKiBPYmpDIGVuZCBtZW1iZXJzICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIEFTVCBnZW5lcmljUGFyc2VyLm1ldGhvZHMgKi8KKy8qIEFTVCBwYXJzZXJNZXRob2RzICovCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3IKK3sKKwlyZXR1cm4gdHJlZUFkYXB0b3I7Cit9CisKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKK3sKKwlpZiAoYVRyZWVBZGFwdG9yICE9IHRyZWVBZGFwdG9yKSB7CisJCXRyZWVBZGFwdG9yID0gYVRyZWVBZGFwdG9yOworCX0KK30KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworLyogT2JqQyBzdGFydCBydWxlcyAqLworLyoKKyAqICRBTlRMUiBzdGFydCBwcm9ncmFtCisgKiBTaW1wbGVDLmc6MTY6MTogcHJvZ3JhbSA6ICggZGVjbGFyYXRpb24gKSsgOworICovCistIChTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuICopIHByb2dyYW0KK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gKiBkZWNsYXJhdGlvbjEgPSBuaWwgOworICAgICAgICAgCisKKworICAgICAgICAvLyBTaW1wbGVDLmc6MTc6NTogKCAoIGRlY2xhcmF0aW9uICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoxNzo5OiAoIGRlY2xhcmF0aW9uICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgLy8gU2ltcGxlQy5nOjE3Ojk6ICggZGVjbGFyYXRpb24gKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDEgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MSA9IDI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTFfMD09S19DSEFSfHxMQTFfMD09S19JRHx8TEExXzA9PUtfSU5UX1RZUEV8fExBMV8wPT1LX1ZPSUQpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoxNzo5OiBkZWNsYXJhdGlvbiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW04NV07CisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uMSA9IFtzZWxmIGRlY2xhcmF0aW9uXTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltkZWNsYXJhdGlvbjEgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDEgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6MV07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQxKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgcHJvZ3JhbSAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2xhcmF0aW9uCisgKiBTaW1wbGVDLmc6MjA6MTogZGVjbGFyYXRpb24gOiAoIHZhcmlhYmxlIHwgZnVuY3Rpb25IZWFkZXIgS19TRU1JQ09MT04gLT4gXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkgfCBmdW5jdGlvbkhlYWRlciBibG9jayAtPiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApICk7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuICopIGRlY2xhcmF0aW9uCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqS19TRU1JQ09MT040ID0gbmlsOworICAgICAgICAgU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gKiB2YXJpYWJsZTIgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybiAqIGZ1bmN0aW9uSGVhZGVyMyA9IG5pbCA7CisgICAgICAgICAKKyAgICAgICAgIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICogZnVuY3Rpb25IZWFkZXI1ID0gbmlsIDsKKyAgICAgICAgIAorICAgICAgICAgU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gKiBibG9jazYgPSBuaWwgOworICAgICAgICAgCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1NFTUlDT0xPTjRfdHJlZT1uaWw7CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0tfU0VNSUNPTE9OID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19TRU1JQ09MT04iXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX2Z1bmN0aW9uSGVhZGVyID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgZnVuY3Rpb25IZWFkZXIiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX2Jsb2NrID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgYmxvY2siXSByZXRhaW5dOworICAgICAgICAvLyBTaW1wbGVDLmc6MjE6NTogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyIEtfU0VNSUNPTE9OIC0+IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgZnVuY3Rpb25IZWFkZXIgYmxvY2sgLT4gXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApIC8vcnVsZWJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyPTM7CisgICAgICAgIGFsdDIgPSBbZGZhMiBwcmVkaWN0OmlucHV0XTsKKyAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjIxOjk6IHZhcmlhYmxlIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworCisgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb24xMDVdOworICAgICAgICAgICAgICAgIHZhcmlhYmxlMiA9IFtzZWxmIHZhcmlhYmxlXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbdmFyaWFibGUyIGdldFRyZWVdIHRvVHJlZTpyb290XzBdOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoyMjo5OiBmdW5jdGlvbkhlYWRlciBLX1NFTUlDT0xPTiAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTE1XTsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbkhlYWRlcjMgPSBbc2VsZiBmdW5jdGlvbkhlYWRlcl07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbc3RyZWFtX2Z1bmN0aW9uSGVhZGVyIGFkZEVsZW1lbnQ6W2Z1bmN0aW9uSGVhZGVyMyBnZXRUcmVlXV07CisKKyAgICAgICAgICAgICAgICBLX1NFTUlDT0xPTjQ9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19TRU1JQ09MT04gRm9sbG93OkZPTExPV19LX1NFTUlDT0xPTl9pbl9kZWNsYXJhdGlvbjExN107ICAKKyAgICAgICAgICAgICAgICAgICAgW3N0cmVhbV9LX1NFTUlDT0xPTiBhZGRFbGVtZW50OktfU0VNSUNPTE9ONF07CisKKworICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgLy8gZWxlbWVudHM6IGZ1bmN0aW9uSGVhZGVyCisgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gcmV0dmFsIiBlbGVtZW50OnJldHZhbCE9bmlsP1tyZXR2YWwgZ2V0VHJlZV06bmlsXSByZXRhaW5dOworCisgICAgICAgICAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgICAgICAgICAvLyAyMjozNjogLT4gXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzoyMjozOTogXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJDb21tb25UcmVlICpyb290XzEgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6RlVOQ19ERUNMIFRleHQ6QCJGVU5DX0RFQ0wiXQorICAgICAgICAgICAgICAgICAgICAgICAgIG9sZDpyb290XzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9mdW5jdGlvbkhlYWRlciBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MjM6OTogZnVuY3Rpb25IZWFkZXIgYmxvY2sgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjEzNV07CisgICAgICAgICAgICAgICAgZnVuY3Rpb25IZWFkZXI1ID0gW3NlbGYgZnVuY3Rpb25IZWFkZXJdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgW3N0cmVhbV9mdW5jdGlvbkhlYWRlciBhZGRFbGVtZW50OltmdW5jdGlvbkhlYWRlcjUgZ2V0VHJlZV1dOworCisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTM3XTsKKyAgICAgICAgICAgICAgICBibG9jazYgPSBbc2VsZiBibG9ja107CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbc3RyZWFtX2Jsb2NrIGFkZEVsZW1lbnQ6W2Jsb2NrNiBnZXRUcmVlXV07CisKKyAgICAgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBmdW5jdGlvbkhlYWRlciwgYmxvY2sKKyAgICAgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICAgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8vIDIzOjMwOiAtPiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MjM6MzM6IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJDb21tb25UcmVlICpyb290XzEgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6RlVOQ19ERUYgVGV4dDpAIkZVTkNfREVGIl0KKyAgICAgICAgICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fZnVuY3Rpb25IZWFkZXIgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9ibG9jayBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICBbc3RyZWFtX0tfU0VNSUNPTE9OIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2Z1bmN0aW9uSGVhZGVyIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2Jsb2NrIHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xhcmF0aW9uICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgdmFyaWFibGUKKyAqIFNpbXBsZUMuZzoyNjoxOiB2YXJpYWJsZSA6IHR5cGUgZGVjbGFyYXRvciBLX1NFTUlDT0xPTiAtPiBeKCBWQVJfREVGIHR5cGUgZGVjbGFyYXRvciApIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gKikgdmFyaWFibGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX1NFTUlDT0xPTjkgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICogdHlwZTcgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuICogZGVjbGFyYXRvcjggPSBuaWwgOworICAgICAgICAgCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1NFTUlDT0xPTjlfdHJlZT1uaWw7CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0tfU0VNSUNPTE9OID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19TRU1JQ09MT04iXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX2RlY2xhcmF0b3IgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBkZWNsYXJhdG9yIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV90eXBlID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgdHlwZSJdIHJldGFpbl07CisgICAgICAgIC8vIFNpbXBsZUMuZzoyNzo1OiAoIHR5cGUgZGVjbGFyYXRvciBLX1NFTUlDT0xPTiAtPiBeKCBWQVJfREVGIHR5cGUgZGVjbGFyYXRvciApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzoyNzo5OiB0eXBlIGRlY2xhcmF0b3IgS19TRU1JQ09MT04gLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2XTsKKyAgICAgICAgdHlwZTcgPSBbc2VsZiB0eXBlXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3N0cmVhbV90eXBlIGFkZEVsZW1lbnQ6W3R5cGU3IGdldFRyZWVdXTsKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxNjhdOworICAgICAgICBkZWNsYXJhdG9yOCA9IFtzZWxmIGRlY2xhcmF0b3JdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2RlY2xhcmF0b3IgYWRkRWxlbWVudDpbZGVjbGFyYXRvcjggZ2V0VHJlZV1dOworCisgICAgICAgIEtfU0VNSUNPTE9OOT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX1NFTUlDT0xPTiBGb2xsb3c6Rk9MTE9XX0tfU0VNSUNPTE9OX2luX3ZhcmlhYmxlMTcwXTsgIAorICAgICAgICAgICAgW3N0cmVhbV9LX1NFTUlDT0xPTiBhZGRFbGVtZW50OktfU0VNSUNPTE9OOV07CisKKworICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAvLyBlbGVtZW50czogZGVjbGFyYXRvciwgdHlwZQorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyAyNzozNzogLT4gXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Mjc6NDA6IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBjcmVhdGVUcmVlOlZBUl9ERUYgVGV4dDpAIlZBUl9ERUYiXQorICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX3R5cGUgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fZGVjbGFyYXRvciBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF8xIHRvVHJlZTpyb290XzBdOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICBbc3RyZWFtX0tfU0VNSUNPTE9OIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2RlY2xhcmF0b3IgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fdHlwZSByZWxlYXNlXTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydCBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnQgVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCB2YXJpYWJsZSAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2xhcmF0b3IKKyAqIFNpbXBsZUMuZzozMDoxOiBkZWNsYXJhdG9yIDogS19JRCA7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4gKikgZGVjbGFyYXRvcgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfSUQxMCA9IG5pbDsKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfSUQxMF90cmVlPW5pbDsKKworICAgICAgICAvLyBTaW1wbGVDLmc6MzE6NTogKCBLX0lEICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzozMTo5OiBLX0lEIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgLyogQVNUUGFyc2VyIHRva2VuUmVmICovCisgICAgICAgIEtfSUQxMD0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0lEIEZvbGxvdzpGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTk5XTsgCisgICAgICAgIEtfSUQxMF90cmVlID0gLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlOktfSUQxMF0gcmV0YWluXQorICAgICAgICA7CisgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpLX0lEMTBfdHJlZSAgdG9UcmVlOnJvb3RfMF07CisKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbGFyYXRvciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGZ1bmN0aW9uSGVhZGVyCisgKiBTaW1wbGVDLmc6MzQ6MTogZnVuY3Rpb25IZWFkZXIgOiB0eXBlIEtfSUQgS19MQ1VSVkUgKCBmb3JtYWxQYXJhbWV0ZXIgKCBLX0NPTU1BIGZvcm1hbFBhcmFtZXRlciApKiApPyBLX1JDVVJWRSAtPiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSA7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICopIGZ1bmN0aW9uSGVhZGVyCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqS19JRDEyID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0xDVVJWRTEzID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0NPTU1BMTUgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfUkNVUlZFMTcgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICogdHlwZTExID0gbmlsIDsKKyAgICAgICAgIAorICAgICAgICAgU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuICogZm9ybWFsUGFyYW1ldGVyMTQgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gKiBmb3JtYWxQYXJhbWV0ZXIxNiA9IG5pbCA7CisgICAgICAgICAKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfSUQxMl90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0xDVVJWRTEzX3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfQ09NTUExNV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1JDVVJWRTE3X3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0lEID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19JRCJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0tfTENVUlZFID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19MQ1VSVkUiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX1JDVVJWRSA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfUkNVUlZFIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fS19DT01NQSA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfQ09NTUEiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIGZvcm1hbFBhcmFtZXRlciJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fdHlwZSA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHR5cGUiXSByZXRhaW5dOworICAgICAgICAvLyBTaW1wbGVDLmc6MzU6NTogKCB0eXBlIEtfSUQgS19MQ1VSVkUgKCBmb3JtYWxQYXJhbWV0ZXIgKCBLX0NPTU1BIGZvcm1hbFBhcmFtZXRlciApKiApPyBLX1JDVVJWRSAtPiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6MzU6OTogdHlwZSBLX0lEIEtfTENVUlZFICggZm9ybWFsUGFyYW1ldGVyICggS19DT01NQSBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gS19SQ1VSVkUgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMjE5XTsKKyAgICAgICAgdHlwZTExID0gW3NlbGYgdHlwZV07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fdHlwZSBhZGRFbGVtZW50Olt0eXBlMTEgZ2V0VHJlZV1dOworCisgICAgICAgIEtfSUQxMj0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0lEIEZvbGxvdzpGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjIyMV07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fS19JRCBhZGRFbGVtZW50OktfSUQxMl07CisKKworICAgICAgICBLX0xDVVJWRTEzPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfTENVUlZFIEZvbGxvdzpGT0xMT1dfS19MQ1VSVkVfaW5fZnVuY3Rpb25IZWFkZXIyMjNdOyAgCisgICAgICAgICAgICBbc3RyZWFtX0tfTENVUlZFIGFkZEVsZW1lbnQ6S19MQ1VSVkUxM107CisKKworICAgICAgICAvLyBTaW1wbGVDLmc6MzU6Mjg6ICggZm9ybWFsUGFyYW1ldGVyICggS19DT01NQSBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDQ9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBNF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKExBNF8wPT1LX0NIQVJ8fExBNF8wPT1LX0lEfHxMQTRfMD09S19JTlRfVFlQRXx8TEE0XzA9PUtfVk9JRCkgKSB7CisgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjM1OjMwOiBmb3JtYWxQYXJhbWV0ZXIgKCBLX0NPTU1BIGZvcm1hbFBhcmFtZXRlciApKiAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIyN107CisgICAgICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyMTQgPSBbc2VsZiBmb3JtYWxQYXJhbWV0ZXJdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgW3N0cmVhbV9mb3JtYWxQYXJhbWV0ZXIgYWRkRWxlbWVudDpbZm9ybWFsUGFyYW1ldGVyMTQgZ2V0VHJlZV1dOworCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBM18wPT1LX0NPTU1BKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjM1OjQ4OiBLX0NPTU1BIGZvcm1hbFBhcmFtZXRlciAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS19DT01NQTE1PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfQ09NTUEgRm9sbG93OkZPTExPV19LX0NPTU1BX2luX2Z1bmN0aW9uSGVhZGVyMjMxXTsgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX0tfQ09NTUEgYWRkRWxlbWVudDpLX0NPTU1BMTVdOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjMzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxQYXJhbWV0ZXIxNiA9IFtzZWxmIGZvcm1hbFBhcmFtZXRlcl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciBhZGRFbGVtZW50Oltmb3JtYWxQYXJhbWV0ZXIxNiBnZXRUcmVlXV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICAgICAgICAgIGxvb3AzOiA7CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKworICAgICAgICBLX1JDVVJWRTE3PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfUkNVUlZFIEZvbGxvdzpGT0xMT1dfS19SQ1VSVkVfaW5fZnVuY3Rpb25IZWFkZXIyNDFdOyAgCisgICAgICAgICAgICBbc3RyZWFtX0tfUkNVUlZFIGFkZEVsZW1lbnQ6S19SQ1VSVkUxN107CisKKworICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAvLyBlbGVtZW50czogZm9ybWFsUGFyYW1ldGVyLCB0eXBlLCBLX0lECisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9yZXR2YWwgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gcmV0dmFsIiBlbGVtZW50OnJldHZhbCE9bmlsP1tyZXR2YWwgZ2V0VHJlZV06bmlsXSByZXRhaW5dOworCisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgIC8vIDM2Ojk6IC0+IF4oIEZVTkNfSERSIHR5cGUgS19JRCAoIGZvcm1hbFBhcmFtZXRlciApKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzozNjoxMjogXiggRlVOQ19IRFIgdHlwZSBLX0lEICggZm9ybWFsUGFyYW1ldGVyICkrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBjcmVhdGVUcmVlOkZVTkNfSERSIFRleHQ6QCJGVU5DX0hEUiJdCisgICAgICAgICAgICAgICAgIG9sZDpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fdHlwZSBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAgLy8gVE9ETzogYXJnczogCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fS19JRCBuZXh0Tm9kZV0KKyAgICAgICAgICAgICAgICAgdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6MzY6MzM6ICggZm9ybWFsUGFyYW1ldGVyICkrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggIShbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciBoYXNOZXh0XSkgKSB7CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBbQU5UTFJSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICggW3N0cmVhbV9mb3JtYWxQYXJhbWV0ZXIgaGFzTmV4dF0gKSB7CisgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgW3N0cmVhbV9mb3JtYWxQYXJhbWV0ZXIgcmVzZXRdOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisgICAgICAgIFtzdHJlYW1fS19JRCByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9LX0xDVVJWRSByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9LX1JDVVJWRSByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9LX0NPTU1BIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV90eXBlIHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGZ1bmN0aW9uSGVhZGVyICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZm9ybWFsUGFyYW1ldGVyCisgKiBTaW1wbGVDLmc6Mzk6MTogZm9ybWFsUGFyYW1ldGVyIDogdHlwZSBkZWNsYXJhdG9yIC0+IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICovCistIChTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gKikgZm9ybWFsUGFyYW1ldGVyCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgIFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKiB0eXBlMTggPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuICogZGVjbGFyYXRvcjE5ID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZGVjbGFyYXRvciA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIGRlY2xhcmF0b3IiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3R5cGUgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSB0eXBlIl0gcmV0YWluXTsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjU6ICggdHlwZSBkZWNsYXJhdG9yIC0+IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjk6IHR5cGUgZGVjbGFyYXRvciAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjgxXTsKKyAgICAgICAgdHlwZTE4ID0gW3NlbGYgdHlwZV07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fdHlwZSBhZGRFbGVtZW50Olt0eXBlMTggZ2V0VHJlZV1dOworCisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODNdOworICAgICAgICBkZWNsYXJhdG9yMTkgPSBbc2VsZiBkZWNsYXJhdG9yXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3N0cmVhbV9kZWNsYXJhdG9yIGFkZEVsZW1lbnQ6W2RlY2xhcmF0b3IxOSBnZXRUcmVlXV07CisKKyAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgLy8gZWxlbWVudHM6IGRlY2xhcmF0b3IsIHR5cGUKKyAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLy8gNDA6MjU6IC0+IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjQwOjI4OiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQU5UTFJDb21tb25UcmVlICpyb290XzEgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKyAgICAgICAgICAgICAgICByb290XzEgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTpBUkdfREVGIFRleHQ6QCJBUkdfREVGIl0KKyAgICAgICAgICAgICAgICAgb2xkOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV90eXBlIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX2RlY2xhcmF0b3IgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKyAgICAgICAgW3N0cmVhbV9kZWNsYXJhdG9yIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX3R5cGUgcmVsZWFzZV07CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZm9ybWFsUGFyYW1ldGVyICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgdHlwZQorICogU2ltcGxlQy5nOjQzOjE6IHR5cGUgOiAoIEtfSU5UX1RZUEUgfCBLX0NIQVIgfCBLX1ZPSUQgfCBLX0lEICk7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKikgdHlwZQoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKnNldDIwID0gbmlsOworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqc2V0MjBfdHJlZT1uaWw7CisKKyAgICAgICAgLy8gU2ltcGxlQy5nOjQ0OjU6ICggS19JTlRfVFlQRSB8IEtfQ0hBUiB8IEtfVk9JRCB8IEtfSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworCisgICAgICAgIC8qIEFTVFBhcnNlciBtYXRjaFJ1bGVCbG9ja1NldCAqLworICAgICAgICAvKiBBU1RQYXJzZXIgbWF0Y2hTZXQgKi8KKyAgICAgICAgc2V0MjAgPSAoQU5UTFJDb21tb25Ub2tlbiAqKVtpbnB1dCBMVDoxXTsgLyogbWF0Y2hTZXQgKi8KKworICAgICAgICBpZiAoW2lucHV0IExBOjFdID09IEtfQ0hBUnx8W2lucHV0IExBOjFdID09IEtfSUR8fFtpbnB1dCBMQToxXSA9PSBLX0lOVF9UWVBFfHxbaW5wdXQgTEE6MV0gPT0gS19WT0lEKSB7CisgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6LyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgICAgIChBTlRMUkNvbW1vblRyZWUgKilbW3RyZWVBZGFwdG9yIGNyZWF0ZTpzZXQyMF0gcmV0YWluXQorICAgICAgICAgICAgIHRvVHJlZTpyb290XzAgXTsKKyAgICAgICAgICAgIFtzdGF0ZSBzZXRJc0Vycm9yUmVjb3Zlcnk6Tk9dOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydCBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnQgVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCB0eXBlICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgYmxvY2sKKyAqIFNpbXBsZUMuZzo1MDoxOiBibG9jayA6IGxjPSBLX0xDVVJMWSAoIHZhcmlhYmxlICkqICggc3RhdCApKiBLX1JDVVJMWSAtPiBeKCBCTE9DS1skbGMsQFwiQkxPQ0tcIl0gKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogKSA7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuICopIGJsb2NrCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqbGMgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfUkNVUkxZMjMgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiAqIHZhcmlhYmxlMjEgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuICogc3RhdDIyID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqbGNfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19SQ1VSTFkyM190cmVlPW5pbDsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fS19MQ1VSTFkgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBLX0xDVVJMWSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0tfUkNVUkxZID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19SQ1VSTFkiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3ZhcmlhYmxlID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgdmFyaWFibGUiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3N0YXQgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBzdGF0Il0gcmV0YWluXTsKKyAgICAgICAgLy8gU2ltcGxlQy5nOjUxOjU6IChsYz0gS19MQ1VSTFkgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogS19SQ1VSTFkgLT4gXiggQkxPQ0tbJGxjLEBcIkJMT0NLXCJdICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjUxOjk6IGxjPSBLX0xDVVJMWSAoIHZhcmlhYmxlICkqICggc3RhdCApKiBLX1JDVVJMWSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBsYz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0xDVVJMWSBGb2xsb3c6Rk9MTE9XX0tfTENVUkxZX2luX2Jsb2NrMzc2XTsgIAorICAgICAgICAgICAgW3N0cmVhbV9LX0xDVVJMWSBhZGRFbGVtZW50OmxjXTsKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ1PTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEE1XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoIChMQTVfMD09S19JRCkgKSB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNV8yID0gW2lucHV0IExBOjJdOworICAgICAgICAgICAgICAgIGlmICggKExBNV8yPT1LX0lEKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBNV8wPT1LX0NIQVJ8fExBNV8wPT1LX0lOVF9UWVBFfHxMQTVfMD09S19WT0lEKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ1PTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NTI6MTM6IHZhcmlhYmxlIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2szOTBdOworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTIxID0gW3NlbGYgdmFyaWFibGVdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX3ZhcmlhYmxlIGFkZEVsZW1lbnQ6W3ZhcmlhYmxlMjEgZ2V0VHJlZV1dOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDU6IDsKKworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ2PTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEE2XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEE2XzAgPj0gS19GT1IgJiYgTEE2XzAgPD0gS19JTlQpfHwoTEE2XzAgPj0gS19MQ1VSTFkgJiYgTEE2XzAgPD0gS19MQ1VSVkUpfHxMQTZfMD09S19TRU1JQ09MT04pICkgeworICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1MzoxMzogc3RhdCAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3N0YXRfaW5fYmxvY2s0MDVdOworICAgICAgICAgICAgICAgICAgICBzdGF0MjIgPSBbc2VsZiBzdGF0XTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICAgICAgW3N0cmVhbV9zdGF0IGFkZEVsZW1lbnQ6W3N0YXQyMiBnZXRUcmVlXV07CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3A2OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wNjogOworCisKKyAgICAgICAgS19SQ1VSTFkyMz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX1JDVVJMWSBGb2xsb3c6Rk9MTE9XX0tfUkNVUkxZX2luX2Jsb2NrNDE2XTsgIAorICAgICAgICAgICAgW3N0cmVhbV9LX1JDVVJMWSBhZGRFbGVtZW50OktfUkNVUkxZMjNdOworCisKKyAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgLy8gZWxlbWVudHM6IHN0YXQsIHZhcmlhYmxlCisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9yZXR2YWwgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gcmV0dmFsIiBlbGVtZW50OnJldHZhbCE9bmlsP1tyZXR2YWwgZ2V0VHJlZV06bmlsXSByZXRhaW5dOworCisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgIC8vIDU1Ojk6IC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1NToxMjogXiggQkxPQ0tbJGxjLEBcIkJMT0NLXCJdICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBjcmVhdGVUcmVlOkJMT0NLIEZyb21Ub2tlbjpsYyBUZXh0OkAiQkxPQ0siXQorICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1NTozNDogKCB2YXJpYWJsZSApKgorICAgICAgICAgICAgICAgIHdoaWxlICggW3N0cmVhbV92YXJpYWJsZSBoYXNOZXh0XSApIHsKKyAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fdmFyaWFibGUgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFtzdHJlYW1fdmFyaWFibGUgcmVzZXRdOworCisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjU1OjQ0OiAoIHN0YXQgKSoKKyAgICAgICAgICAgICAgICB3aGlsZSAoIFtzdHJlYW1fc3RhdCBoYXNOZXh0XSApIHsKKyAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fc3RhdCBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgW3N0cmVhbV9zdGF0IHJlc2V0XTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisgICAgICAgIFtzdHJlYW1fS19MQ1VSTFkgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fS19SQ1VSTFkgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fdmFyaWFibGUgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fc3RhdCByZWxlYXNlXTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydCBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnQgVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBibG9jayAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHN0YXQKKyAqIFNpbXBsZUMuZzo1ODoxOiBzdGF0IDogKCBmb3JTdGF0IHwgZXhwciBLX1NFTUlDT0xPTiAhfCBibG9jayB8IGFzc2lnblN0YXQgS19TRU1JQ09MT04gIXwgS19TRU1JQ09MT04gISk7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm4gKikgc3RhdAoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfU0VNSUNPTE9OMjYgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfU0VNSUNPTE9OMjkgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfU0VNSUNPTE9OMzAgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuICogZm9yU3RhdDI0ID0gbmlsIDsKKyAgICAgICAgIAorICAgICAgICAgU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqIGV4cHIyNSA9IG5pbCA7CisgICAgICAgICAKKyAgICAgICAgIFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuICogYmxvY2syNyA9IG5pbCA7CisgICAgICAgICAKKyAgICAgICAgIFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKiBhc3NpZ25TdGF0MjggPSBuaWwgOworICAgICAgICAgCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1NFTUlDT0xPTjI2X3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfU0VNSUNPTE9OMjlfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19TRU1JQ09MT04zMF90cmVlPW5pbDsKKworICAgICAgICAvLyBTaW1wbGVDLmc6NTg6NTogKCBmb3JTdGF0IHwgZXhwciBLX1NFTUlDT0xPTiAhfCBibG9jayB8IGFzc2lnblN0YXQgS19TRU1JQ09MT04gIXwgS19TRU1JQ09MT04gISkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDc9NTsKKyAgICAgICAgdW5pY2hhciBjaGFyTEE3ID0gW2lucHV0IExBOjFdOworICAgICAgICBzd2l0Y2ggKGNoYXJMQTcpIHsKKyAgICAgICAgICAgIGNhc2UgS19GT1I6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE3XzIgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTdfMj09S19FUSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTdfMj09S19FUUVRfHwoTEE3XzIgPj0gS19MVCAmJiBMQTdfMiA8PSBLX1BMVVMpfHxMQTdfMj09S19TRU1JQ09MT04pICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ3PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjcgc3RhdGU6MiBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICBudmFlLmMgPSBMQTdfMjsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgY2FzZSBLX0xDVVJWRTogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLX0xDVVJMWTogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLX1NFTUlDT0xPTjogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246NyBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBudmFlLmMgPSBjaGFyTEE3OworICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1ODo3OiBmb3JTdGF0IC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworCisgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5XTsKKyAgICAgICAgICAgICAgICBmb3JTdGF0MjQgPSBbc2VsZiBmb3JTdGF0XTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbZm9yU3RhdDI0IGdldFRyZWVdIHRvVHJlZTpyb290XzBdOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo1OTo3OiBleHByIEtfU0VNSUNPTE9OICEgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19leHByX2luX3N0YXQ0NTddOworICAgICAgICAgICAgICAgIGV4cHIyNSA9IFtzZWxmIGV4cHJdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltleHByMjUgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07CisKKyAgICAgICAgICAgICAgICBLX1NFTUlDT0xPTjI2PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfU0VNSUNPTE9OIEZvbGxvdzpGT0xMT1dfS19TRU1JQ09MT05faW5fc3RhdDQ1OV07IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo2MDo3OiBibG9jayAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKworICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX3N0YXQ0NjhdOworICAgICAgICAgICAgICAgIGJsb2NrMjcgPSBbc2VsZiBibG9ja107CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2Jsb2NrMjcgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjYxOjc6IGFzc2lnblN0YXQgS19TRU1JQ09MT04gISAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKworICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDQ3Nl07CisgICAgICAgICAgICAgICAgYXNzaWduU3RhdDI4ID0gW3NlbGYgYXNzaWduU3RhdF07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2Fzc2lnblN0YXQyOCBnZXRUcmVlXSB0b1RyZWU6cm9vdF8wXTsKKworICAgICAgICAgICAgICAgIEtfU0VNSUNPTE9OMjk9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19TRU1JQ09MT04gRm9sbG93OkZPTExPV19LX1NFTUlDT0xPTl9pbl9zdGF0NDc4XTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjYyOjc6IEtfU0VNSUNPTE9OICEgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgICAgICAgICBLX1NFTUlDT0xPTjMwPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfU0VNSUNPTE9OIEZvbGxvdzpGT0xMT1dfS19TRU1JQ09MT05faW5fc3RhdDQ4N107IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgc3RhdCAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGZvclN0YXQKKyAqIFNpbXBsZUMuZzo2NToxOiBmb3JTdGF0IDogS19GT1IgS19MQ1VSVkUgc3RhcnQ9IGFzc2lnblN0YXQgS19TRU1JQ09MT04gZXhwciBLX1NFTUlDT0xPTiBuZXh0PSBhc3NpZ25TdGF0IEtfUkNVUlZFIGJsb2NrIC0+IF4oIEtfRk9SICRzdGFydCBleHByICRuZXh0IGJsb2NrICkgOworICovCistIChTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuICopIGZvclN0YXQKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0ZPUjMxID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0xDVVJWRTMyID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX1NFTUlDT0xPTjMzID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX1NFTUlDT0xPTjM1ID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX1JDVVJWRTM2ID0gbmlsOworICAgICAgICAgU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqIHN0YXJ0ID0gbmlsIDsKKyAgICAgICAgIAorICAgICAgICAgU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqIG5leHQgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuICogZXhwcjM0ID0gbmlsIDsKKyAgICAgICAgIAorICAgICAgICAgU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gKiBibG9jazM3ID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19GT1IzMV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0xDVVJWRTMyX3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfU0VNSUNPTE9OMzNfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19TRU1JQ09MT04zNV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1JDVVJWRTM2X3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0xDVVJWRSA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfTENVUlZFIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fS19SQ1VSVkUgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBLX1JDVVJWRSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0tfU0VNSUNPTE9OID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19TRU1JQ09MT04iXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0ZPUiA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfRk9SIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9hc3NpZ25TdGF0ID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgYXNzaWduU3RhdCJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fYmxvY2sgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBibG9jayJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZXhwciA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIGV4cHIiXSByZXRhaW5dOworICAgICAgICAvLyBTaW1wbGVDLmc6NjY6NTogKCBLX0ZPUiBLX0xDVVJWRSBzdGFydD0gYXNzaWduU3RhdCBLX1NFTUlDT0xPTiBleHByIEtfU0VNSUNPTE9OIG5leHQ9IGFzc2lnblN0YXQgS19SQ1VSVkUgYmxvY2sgLT4gXiggS19GT1IgJHN0YXJ0IGV4cHIgJG5leHQgYmxvY2sgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDLmc6NjY6OTogS19GT1IgS19MQ1VSVkUgc3RhcnQ9IGFzc2lnblN0YXQgS19TRU1JQ09MT04gZXhwciBLX1NFTUlDT0xPTiBuZXh0PSBhc3NpZ25TdGF0IEtfUkNVUlZFIGJsb2NrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIEtfRk9SMzE9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19GT1IgRm9sbG93OkZPTExPV19LX0ZPUl9pbl9mb3JTdGF0NTA3XTsgIAorICAgICAgICAgICAgW3N0cmVhbV9LX0ZPUiBhZGRFbGVtZW50OktfRk9SMzFdOworCisKKyAgICAgICAgS19MQ1VSVkUzMj0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0xDVVJWRSBGb2xsb3c6Rk9MTE9XX0tfTENVUlZFX2luX2ZvclN0YXQ1MDldOyAgCisgICAgICAgICAgICBbc3RyZWFtX0tfTENVUlZFIGFkZEVsZW1lbnQ6S19MQ1VSVkUzMl07CisKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxM107CisgICAgICAgIHN0YXJ0ID0gW3NlbGYgYXNzaWduU3RhdF07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fYXNzaWduU3RhdCBhZGRFbGVtZW50OltzdGFydCBnZXRUcmVlXV07CisKKyAgICAgICAgS19TRU1JQ09MT04zMz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX1NFTUlDT0xPTiBGb2xsb3c6Rk9MTE9XX0tfU0VNSUNPTE9OX2luX2ZvclN0YXQ1MTVdOyAgCisgICAgICAgICAgICBbc3RyZWFtX0tfU0VNSUNPTE9OIGFkZEVsZW1lbnQ6S19TRU1JQ09MT04zM107CisKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZm9yU3RhdDUxN107CisgICAgICAgIGV4cHIzNCA9IFtzZWxmIGV4cHJdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2V4cHIgYWRkRWxlbWVudDpbZXhwcjM0IGdldFRyZWVdXTsKKworICAgICAgICBLX1NFTUlDT0xPTjM1PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfU0VNSUNPTE9OIEZvbGxvdzpGT0xMT1dfS19TRU1JQ09MT05faW5fZm9yU3RhdDUxOV07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fS19TRU1JQ09MT04gYWRkRWxlbWVudDpLX1NFTUlDT0xPTjM1XTsKKworCisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTIzXTsKKyAgICAgICAgbmV4dCA9IFtzZWxmIGFzc2lnblN0YXRdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2Fzc2lnblN0YXQgYWRkRWxlbWVudDpbbmV4dCBnZXRUcmVlXV07CisKKyAgICAgICAgS19SQ1VSVkUzNj0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX1JDVVJWRSBGb2xsb3c6Rk9MTE9XX0tfUkNVUlZFX2luX2ZvclN0YXQ1MjVdOyAgCisgICAgICAgICAgICBbc3RyZWFtX0tfUkNVUlZFIGFkZEVsZW1lbnQ6S19SQ1VSVkUzNl07CisKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjddOworICAgICAgICBibG9jazM3ID0gW3NlbGYgYmxvY2tdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2Jsb2NrIGFkZEVsZW1lbnQ6W2Jsb2NrMzcgZ2V0VHJlZV1dOworCisgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgIC8vIGVsZW1lbnRzOiBzdGFydCwgbmV4dCwgZXhwciwgYmxvY2ssIEtfRk9SCisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwsIHN0YXJ0LCBuZXh0CisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9zdGFydCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBzdGFydCIgZWxlbWVudDpzdGFydCE9bmlsP1tzdGFydCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fbmV4dCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBuZXh0IiBlbGVtZW50Om5leHQhPW5pbD9bbmV4dCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLy8gNjc6OTogLT4gXiggS19GT1IgJHN0YXJ0IGV4cHIgJG5leHQgYmxvY2sgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Njc6MTI6IF4oIEtfRk9SICRzdGFydCBleHByICRuZXh0IGJsb2NrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX0tfRk9SIG5leHROb2RlXQorICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX3N0YXJ0IG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX2V4cHIgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fbmV4dCBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9ibG9jayBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF8xIHRvVHJlZTpyb290XzBdOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICBbc3RyZWFtX0tfTENVUlZFIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX0tfUkNVUlZFIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX0tfU0VNSUNPTE9OIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX0tfRk9SIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2Fzc2lnblN0YXQgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fYmxvY2sgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fZXhwciByZWxlYXNlXTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydCBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnQgVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBmb3JTdGF0ICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgYXNzaWduU3RhdAorICogU2ltcGxlQy5nOjcwOjE6IGFzc2lnblN0YXQgOiBLX0lEIEtfRVEgZXhwciAtPiBeKCBLX0VRIEtfSUQgZXhwciApIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqKSBhc3NpZ25TdGF0Cit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqS19JRDM4ID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0VRMzkgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuICogZXhwcjQwID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19JRDM4X3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfRVEzOV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fS19JRCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfSUQiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0VRID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gS19FUSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZXhwciA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIGV4cHIiXSByZXRhaW5dOworICAgICAgICAvLyBTaW1wbGVDLmc6NzE6NTogKCBLX0lEIEtfRVEgZXhwciAtPiBeKCBLX0VRIEtfSUQgZXhwciApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo3MTo5OiBLX0lEIEtfRVEgZXhwciAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBLX0lEMzg9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fYXNzaWduU3RhdDU3MF07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fS19JRCBhZGRFbGVtZW50OktfSUQzOF07CisKKworICAgICAgICBLX0VRMzk9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19FUSBGb2xsb3c6Rk9MTE9XX0tfRVFfaW5fYXNzaWduU3RhdDU3Ml07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fS19FUSBhZGRFbGVtZW50OktfRVEzOV07CisKKworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDU3NF07CisgICAgICAgIGV4cHI0MCA9IFtzZWxmIGV4cHJdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2V4cHIgYWRkRWxlbWVudDpbZXhwcjQwIGdldFRyZWVdXTsKKworICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAvLyBlbGVtZW50czogS19JRCwgS19FUSwgZXhwcgorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyA3MToyNDogLT4gXiggS19FUSBLX0lEIGV4cHIgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTaW1wbGVDLmc6NzE6Mjc6IF4oIEtfRVEgS19JRCBleHByICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX0tfRVEgbmV4dE5vZGVdCisgICAgICAgICAgICAgICAgIG9sZDpyb290XzFdOworCisgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFyZ3M6IAorICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX0tfSUQgbmV4dE5vZGVdCisgICAgICAgICAgICAgICAgIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fZXhwciBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF8xIHRvVHJlZTpyb290XzBdOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICBbc3RyZWFtX0tfSUQgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fS19FUSByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9leHByIHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGFzc2lnblN0YXQgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBleHByCisgKiBTaW1wbGVDLmc6NzQ6MTogZXhwciA6IGNvbmRFeHByIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqKSBleHByCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgIFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuICogY29uZEV4cHI0MSA9IG5pbCA7CisgICAgICAgICAKKworCisgICAgICAgIC8vIFNpbXBsZUMuZzo3NDo1OiAoIGNvbmRFeHByICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo3NDo5OiBjb25kRXhwciAvLyBhbHQKKyAgICAgICAgeworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjU5OF07CisgICAgICAgIGNvbmRFeHByNDEgPSBbc2VsZiBjb25kRXhwcl07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbY29uZEV4cHI0MSBnZXRUcmVlXSB0b1RyZWU6cm9vdF8wXTsKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZXhwciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGNvbmRFeHByCisgKiBTaW1wbGVDLmc6Nzc6MTogY29uZEV4cHIgOiBhZXhwciAoICggS19FUUVRIF58IEtfTFQgXikgYWV4cHIgKT8gOworICovCistIChTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybiAqKSBjb25kRXhwcgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfRVFFUTQzID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0xUNDQgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiAqIGFleHByNDIgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiAqIGFleHByNDUgPSBuaWwgOworICAgICAgICAgCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0VRRVE0M190cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0xUNDRfdHJlZT1uaWw7CisKKyAgICAgICAgLy8gU2ltcGxlQy5nOjc4OjU6ICggYWV4cHIgKCAoIEtfRVFFUSBefCBLX0xUIF4pIGFleHByICk/ICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUMuZzo3ODo5OiBhZXhwciAoICggS19FUUVRIF58IEtfTFQgXikgYWV4cHIgKT8gLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZVJlZiAqLworICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2FleHByX2luX2NvbmRFeHByNjE3XTsKKyAgICAgICAgYWV4cHI0MiA9IFtzZWxmIGFleHByXTsKKworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOlthZXhwcjQyIGdldFRyZWVdIHRvVHJlZTpyb290XzBdOworCisgICAgICAgIC8vIFNpbXBsZUMuZzo3ODoxNTogKCAoIEtfRVFFUSBefCBLX0xUIF4pIGFleHByICk/IC8vIGJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQ5PTI7CisgICAgICAgIE5TSW50ZWdlciBMQTlfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICBpZiAoIChMQTlfMD09S19FUUVRfHxMQTlfMD09S19MVCkgKSB7CisgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjc4OjE3OiAoIEtfRVFFUSBefCBLX0xUIF4pIGFleHByIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6Nzg6MTc6ICggS19FUUVRIF58IEtfTFQgXikgLy8gYmxvY2sKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0OD0yOworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQThfMCA9IFtpbnB1dCBMQToxXTsKKworICAgICAgICAgICAgICAgIGlmICggKExBOF8wPT1LX0VRRVEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4XzA9PUtfTFQpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ4PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjggc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICBudmFlLmMgPSBMQThfMDsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo3ODoxODogS19FUUVRIF4gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLX0VRRVE0Mz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0VRRVEgRm9sbG93OkZPTExPV19LX0VRRVFfaW5fY29uZEV4cHI2MjJdOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIEtfRVFFUTQzX3RyZWUgPSAvKiBBU1RQYXJzZXIgY3JlYXRlTm9kZUZyb21Ub2tlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlOktfRVFFUTQzXSByZXRhaW5dCisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6S19FUUVRNDNfdHJlZSBvbGQ6cm9vdF8wXTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjc4OjI4OiBLX0xUIF4gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLX0xUNDQ9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19MVCBGb2xsb3c6Rk9MTE9XX0tfTFRfaW5fY29uZEV4cHI2MjddOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIEtfTFQ0NF90cmVlID0gLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChBTlRMUkNvbW1vblRyZWUgKilbW3RyZWVBZGFwdG9yIGNyZWF0ZTpLX0xUNDRdIHJldGFpbl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpLX0xUNDRfdHJlZSBvbGQ6cm9vdF8wXTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MzFdOworICAgICAgICAgICAgICAgIGFleHByNDUgPSBbc2VsZiBhZXhwcl07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2FleHByNDUgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGNvbmRFeHByICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgYWV4cHIKKyAqIFNpbXBsZUMuZzo4MToxOiBhZXhwciA6IGF0b20gKCBLX1BMVVMgXiBhdG9tICkqIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKikgYWV4cHIKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX1BMVVM0NyA9IG5pbDsKKyAgICAgICAgIFNpbXBsZUNQYXJzZXJfYXRvbV9yZXR1cm4gKiBhdG9tNDYgPSBuaWwgOworICAgICAgICAgCisgICAgICAgICBTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICogYXRvbTQ4ID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19QTFVTNDdfdHJlZT1uaWw7CisKKyAgICAgICAgLy8gU2ltcGxlQy5nOjgyOjU6ICggYXRvbSAoIEtfUExVUyBeIGF0b20gKSogKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQy5nOjgyOjk6IGF0b20gKCBLX1BMVVMgXiBhdG9tICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19hdG9tX2luX2FleHByNjUzXTsKKyAgICAgICAgYXRvbTQ2ID0gW3NlbGYgYXRvbV07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbYXRvbTQ2IGdldFRyZWVdIHRvVHJlZTpyb290XzBdOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxMD0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMTBfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBMTBfMD09S19QTFVTKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUMuZzo4MjoxNjogS19QTFVTIF4gYXRvbSAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLX1BMVVM0Nz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX1BMVVMgRm9sbG93OkZPTExPV19LX1BMVVNfaW5fYWV4cHI2NTddOyAKKyAgICAgICAgICAgICAgICAgICAgS19QTFVTNDdfdHJlZSA9IC8qIEFTVFBhcnNlciBjcmVhdGVOb2RlRnJvbVRva2VuICovCisgICAgICAgICAgICAgICAgICAgIChBTlRMUkNvbW1vblRyZWUgKilbW3RyZWVBZGFwdG9yIGNyZWF0ZTpLX1BMVVM0N10gcmV0YWluXQorICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpLX1BMVVM0N190cmVlIG9sZDpyb290XzBdOworCisKKyAgICAgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19hdG9tX2luX2FleHByNjYwXTsKKyAgICAgICAgICAgICAgICAgICAgYXRvbTQ4ID0gW3NlbGYgYXRvbV07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbYXRvbTQ4IGdldFRyZWVdIHRvVHJlZTpyb290XzBdOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxMDogOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGFleHByICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgYXRvbQorICogU2ltcGxlQy5nOjg1OjE6IGF0b20gOiAoIEtfSUQgfCBLX0lOVCB8IEtfTENVUlZFIGV4cHIgS19SQ1VSVkUgLT4gZXhwciApOworICovCistIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopIGF0b20KK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfYXRvbV9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0lENDkgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfSU5UNTAgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfTENVUlZFNTEgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfUkNVUlZFNTMgPSBuaWw7CisgICAgICAgICBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuICogZXhwcjUyID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19JRDQ5X3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfSU5UNTBfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19MQ1VSVkU1MV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1JDVVJWRTUzX3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0xDVVJWRSA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfTENVUlZFIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fS19SQ1VSVkUgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBLX1JDVVJWRSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZXhwciA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIGV4cHIiXSByZXRhaW5dOworICAgICAgICAvLyBTaW1wbGVDLmc6ODY6NTogKCBLX0lEIHwgS19JTlQgfCBLX0xDVVJWRSBleHByIEtfUkNVUlZFIC0+IGV4cHIgKSAvL3J1bGVibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0MTE9MzsKKyAgICAgICAgdW5pY2hhciBjaGFyTEExMSA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgc3dpdGNoIChjaGFyTEExMSkgeworICAgICAgICAgICAgY2FzZSBLX0lEOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxMT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19MQ1VSVkU6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogOworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjoxMSBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBudmFlLmMgPSBjaGFyTEExMTsKKyAgICAgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQy5nOjg2Ojc6IEtfSUQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgICAgICAgICAvKiBBU1RQYXJzZXIgdG9rZW5SZWYgKi8KKyAgICAgICAgICAgICAgICBLX0lENDk9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fYXRvbTY4MF07IAorICAgICAgICAgICAgICAgIEtfSUQ0OV90cmVlID0gLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgICAgICAgICAoQU5UTFJDb21tb25UcmVlICopW1t0cmVlQWRhcHRvciBjcmVhdGU6S19JRDQ5XSByZXRhaW5dCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpLX0lENDlfdHJlZSAgdG9UcmVlOnJvb3RfMF07CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODc6NzogS19JTlQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgICAgICAgICAvKiBBU1RQYXJzZXIgdG9rZW5SZWYgKi8KKyAgICAgICAgICAgICAgICBLX0lOVDUwPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfSU5UIEZvbGxvdzpGT0xMT1dfS19JTlRfaW5fYXRvbTY5NF07IAorICAgICAgICAgICAgICAgIEtfSU5UNTBfdHJlZSA9IC8qIEFTVFBhcnNlciBjcmVhdGVOb2RlRnJvbVRva2VuICovCisgICAgICAgICAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlOktfSU5UNTBdIHJldGFpbl0KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOktfSU5UNTBfdHJlZSAgdG9UcmVlOnJvb3RfMF07CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDLmc6ODg6NzogS19MQ1VSVkUgZXhwciBLX1JDVVJWRSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS19MQ1VSVkU1MT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0xDVVJWRSBGb2xsb3c6Rk9MTE9XX0tfTENVUlZFX2luX2F0b203MDhdOyAgCisgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fS19MQ1VSVkUgYWRkRWxlbWVudDpLX0xDVVJWRTUxXTsKKworCisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fYXRvbTcxMF07CisgICAgICAgICAgICAgICAgZXhwcjUyID0gW3NlbGYgZXhwcl07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbc3RyZWFtX2V4cHIgYWRkRWxlbWVudDpbZXhwcjUyIGdldFRyZWVdXTsKKworICAgICAgICAgICAgICAgIEtfUkNVUlZFNTM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19SQ1VSVkUgRm9sbG93OkZPTExPV19LX1JDVVJWRV9pbl9hdG9tNzEyXTsgIAorICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX0tfUkNVUlZFIGFkZEVsZW1lbnQ6S19SQ1VSVkU1M107CisKKworICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgLy8gZWxlbWVudHM6IGV4cHIKKyAgICAgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICAgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8vIDg4OjMwOiAtPiBleHByCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9leHByIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8wXTsKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICBbc3RyZWFtX0tfTENVUlZFIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX0tfUkNVUlZFIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2V4cHIgcmVsZWFzZV07CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgYXRvbSAqLworLyogT2JqQyBlbmQgcnVsZXMgKi8KKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1BhcnNlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDY5MiAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmcgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY4OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmcKQEAgLTAsMCArMSw2OSBAQAordHJlZSBncmFtbWFyIFNpbXBsZUNUUDsKK29wdGlvbnMgeworICAgIHRva2VuVm9jYWIgPSBTaW1wbGVDOworCWxhbmd1YWdlID0gT2JqQzsKKwlBU1RMYWJlbFR5cGUgPSBBTlRMUkNvbW1vblRyZWU7Cit9CisKK3Njb3BlIFN5bWJvbHMKK3sKK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsKK30KKworcHJvZ3JhbQorICAgIDogICBkZWNsYXJhdGlvbisKKyAgICA7CisKK2RlY2xhcmF0aW9uCisgICAgOiAgIHZhcmlhYmxlCisgICAgfCAgIF4oRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyKQorICAgIHwgICBeKEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrKQorICAgIDsKKwordmFyaWFibGUKKyAgICA6ICAgXihWQVJfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgS19JRCAKKyAgICA7CisKK2Z1bmN0aW9uSGVhZGVyCisgICAgOiAgIF4oRlVOQ19IRFIgdHlwZSBLX0lEIGZvcm1hbFBhcmFtZXRlcispCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgXihBUkdfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgS19JTlRfVFlQRQorICAgIHwgICBLX0NIQVIgIAorICAgIHwgICBLX1ZPSUQKKyAgICB8ICAgS19JRCAgICAgICAgCisgICAgOworCitibG9jaworICAgIDogICBeKEJMT0NLIHZhcmlhYmxlKiBzdGF0KikKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIKKyAgICB8IGJsb2NrCisgICAgOworCitmb3JTdGF0CisgICAgOiAgIF4oS19GT1IgZXhwciBleHByIGV4cHIgYmxvY2spCisgICAgOworCitleHByOiAgIF4oS19FUUVRIGV4cHIgZXhwcikKKyAgICB8ICAgXihLX0xUIGV4cHIgZXhwcikKKyAgICB8ICAgXihLX1BMVVMgZXhwciBleHByKQorICAgIHwgICBeKEtfRVEgS19JRCBlPWV4cHIpIHsgTlNMb2coQCJhc3NpZ25pbmcgXCVAIHRvIHZhcmlhYmxlIFwlQCIsICRlLnRleHQsICRLX0lELnRleHQpOyB9CisgICAgfCAgIGF0b20KKyAgICA7CisKK2F0b20KKyAgICA6IEtfSUQgICAgICAKKyAgICB8IEtfSU5UICAgICAgCisgICAgOyAKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzMmI2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5oCkBAIC0wLDAgKzEsMTQwIEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFNpbXBsZUNUUC5nIDIwMTEtMDUtMDYgMTU6MDk6MjgKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogdHJlZVBhcnNlckhlYWRlckZpbGUgKi8KKyNpZm5kZWYgQU5UTFIzVG9rZW5UeXBlQWxyZWFkeURlZmluZWQKKyNkZWZpbmUgQU5UTFIzVG9rZW5UeXBlQWxyZWFkeURlZmluZWQKK3R5cGVkZWYgZW51bSB7CisgICAgQU5UTFJfRU9GID0gLTEsCisgICAgSU5WQUxJRCwKKyAgICBFT1IsCisgICAgRE9XTiwKKyAgICBVUCwKKyAgICBNSU4KK30gQU5UTFIzVG9rZW5UeXBlOworI2VuZGlmCisKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorI2RlZmluZSBFT0YgLTEKKyNkZWZpbmUgQVJHX0RFRiA0CisjZGVmaW5lIEJMT0NLIDUKKyNkZWZpbmUgRlVOQ19ERUNMIDYKKyNkZWZpbmUgRlVOQ19ERUYgNworI2RlZmluZSBGVU5DX0hEUiA4CisjZGVmaW5lIEtfQ0hBUiA5CisjZGVmaW5lIEtfQ09NTUEgMTAKKyNkZWZpbmUgS19FUSAxMQorI2RlZmluZSBLX0VRRVEgMTIKKyNkZWZpbmUgS19GT1IgMTMKKyNkZWZpbmUgS19JRCAxNAorI2RlZmluZSBLX0lOVCAxNQorI2RlZmluZSBLX0lOVF9UWVBFIDE2CisjZGVmaW5lIEtfTENVUkxZIDE3CisjZGVmaW5lIEtfTENVUlZFIDE4CisjZGVmaW5lIEtfTFQgMTkKKyNkZWZpbmUgS19QTFVTIDIwCisjZGVmaW5lIEtfUkNVUkxZIDIxCisjZGVmaW5lIEtfUkNVUlZFIDIyCisjZGVmaW5lIEtfU0VNSUNPTE9OIDIzCisjZGVmaW5lIEtfVk9JRCAyNAorI2RlZmluZSBWQVJfREVGIDI1CisjZGVmaW5lIFdTIDI2CisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZUludGVyZmFjZSAqLworQGludGVyZmFjZSBTeW1ib2xzX1Njb3BlIDogQU5UTFJTeW1ib2xzU2NvcGUgeworQU5UTFJDb21tb25UcmVlICogdHJlZTsKKworfQorLyogc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2UgcHJvcGVydGllcyAqLworCitAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWdldHRyZWUsIHNldHRlcj1zZXR0cmVlOikgQU5UTFJDb21tb25UcmVlICogdHJlZTsKKworLyogZW5kIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlIHByb3BlcnRpZXMgKi8KKworCisrIChTeW1ib2xzX1Njb3BlICopbmV3U3ltYm9sc19TY29wZTsKKy0gKGlkKSBpbml0OworLyogc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2UgbWV0aG9kc0RlY2wgKi8KKworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0dHJlZTsKKy0gKHZvaWQpc2V0dHJlZTooQU5UTFJDb21tb25UcmVlICopYVZhbDsKKworLyogRW5kIG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlIG1ldGhvZHNEZWNsICovCisKK0BlbmQgLyogZW5kIG9mIFN5bWJvbHNfU2NvcGUgaW50ZXJmYWNlICovCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHN0YXJ0CisvKiByZXR1cm5TY29wZUludGVyZmFjZSBTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1RQX2V4cHJfcmV0dXJuIDpBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUgeyAvKiByZXR1cm5TY29wZUludGVyZmFjZSBsaW5lIDE4MzggKi8KKyAvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMoKSAqLworfQorLyogc3RhcnQgcHJvcGVydGllcyAqLworKyAoU2ltcGxlQ1RQX2V4cHJfcmV0dXJuICopbmV3U2ltcGxlQ1RQX2V4cHJfcmV0dXJuOworLyogdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzICovCisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKworLyogSW50ZXJmYWNlIGdyYW1tYXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1RQIDogQU5UTFJUcmVlUGFyc2VyIHsgLyogbGluZSA1NzIgKi8KKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisKKworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisvKiBPYmpDIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworLy9BTlRMUlN5bWJvbFN0YWNrICpnU3RhY2s7CitBTlRMUlN5bWJvbFN0YWNrICpTeW1ib2xzX3N0YWNrOworU3ltYm9sc19TY29wZSAqU3ltYm9sc19zY29wZTsKKworLyogT2JqQyBlbmQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZW1WYXJzICovCisvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIG1lbVZhcnMgKi8KKworIH0KKworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXMgKi8KKy8qIE9iakMgc3RhcnQgb2YgcHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgcHJvcGVydGllcyAqLworCisrICh2b2lkKSBpbml0aWFsaXplOworKyAoaWQpIG5ld1NpbXBsZUNUUDooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYVN0cmVhbTsKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKworLyogT2JqQyBzdGFydCBvZiBtZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgb2YgbWV0aG9kc0RlY2wgKi8KKworLSAodm9pZClwcm9ncmFtOyAKKy0gKHZvaWQpZGVjbGFyYXRpb247IAorLSAodm9pZCl2YXJpYWJsZTsgCistICh2b2lkKWRlY2xhcmF0b3I7IAorLSAodm9pZClmdW5jdGlvbkhlYWRlcjsgCistICh2b2lkKWZvcm1hbFBhcmFtZXRlcjsgCistICh2b2lkKXR5cGU7IAorLSAodm9pZClibG9jazsgCistICh2b2lkKXN0YXQ7IAorLSAodm9pZClmb3JTdGF0OyAKKy0gKFNpbXBsZUNUUF9leHByX3JldHVybiAqKWV4cHI7IAorLSAodm9pZClhdG9tOyAKKworCitAZW5kIC8qIGVuZCBvZiBTaW1wbGVDVFAgaW50ZXJmYWNlICovCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlMGQxYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5qYXZhCkBAIC0wLDAgKzEsODUyIEBACisvLyAkQU5UTFIgMy4yIEF1ZyAxMywgMjAxMCAxNDoxOTozMSBTaW1wbGVDVFAuZyAyMDEwLTA4LTEzIDE0OjI5OjE5CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjtpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVDVFAgZXh0ZW5kcyBUcmVlUGFyc2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlZBUl9ERUYiLCAiQVJHX0RFRiIsICJGVU5DX0hEUiIsICJGVU5DX0RFQ0wiLCAiRlVOQ19ERUYiLCAiQkxPQ0siLCAiSUQiLCAiRVEiLCAiSU5UIiwgIkZPUiIsICJJTlRfVFlQRSIsICJDSEFSIiwgIlZPSUQiLCAiRVFFUSIsICJMVCIsICJQTFVTIiwgIldTIiwgIic7JyIsICInKCciLCAiJywnIiwgIicpJyIsICIneyciLCAiJ30nIgorICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTFQ9MTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjY9MjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjU9MjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ9MjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM9MjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI9MjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE9MjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUj0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1I9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ19IRFI9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlQ9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ19ERUY9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfVFlQRT0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ19ERUNMPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJHX0RFRj01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTPTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJMT0NLPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVUz0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0lEPTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRPTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUl9ERUY9NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUUVRPTE3OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisKKyAgICAgICAgcHVibGljIFNpbXBsZUNUUChUcmVlTm9kZVN0cmVhbSBpbnB1dCkgeworICAgICAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU2ltcGxlQ1RQKFRyZWVOb2RlU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0LCBzdGF0ZSk7CisgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VG9rZW5OYW1lcygpIHsgcmV0dXJuIFNpbXBsZUNUUC50b2tlbk5hbWVzOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiU2ltcGxlQ1RQLmciOyB9CisKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJwcm9ncmFtIgorICAgIC8vIFNpbXBsZUNUUC5nOjg6MTogcHJvZ3JhbSA6ICggZGVjbGFyYXRpb24gKSsgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHByb2dyYW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6OTo1OiAoICggZGVjbGFyYXRpb24gKSsgKQorICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6OTo5OiAoIGRlY2xhcmF0aW9uICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo5Ojk6ICggZGVjbGFyYXRpb24gKSsKKyAgICAgICAgICAgIGludCBjbnQxPTA7CisgICAgICAgICAgICBsb29wMToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExXzA9PVZBUl9ERUZ8fChMQTFfMD49RlVOQ19ERUNMICYmIExBMV8wPD1GVU5DX0RFRikpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyBTaW1wbGVDVFAuZzo5Ojk6IGRlY2xhcmF0aW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTQzKTsKKyAgICAgICAgICAgIAkgICAgZGVjbGFyYXRpb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MSA+PSAxICkgYnJlYWsgbG9vcDE7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDEsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MSsrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJwcm9ncmFtIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImRlY2xhcmF0aW9uIgorICAgIC8vIFNpbXBsZUNUUC5nOjEyOjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjEzOjU6ICggdmFyaWFibGUgfCBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKQorICAgICAgICAgICAgaW50IGFsdDI9MzsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBWQVJfREVGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGVU5DX0RFQ0w6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZVTkNfREVGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyPTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzoxMzo5OiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNjMpOworICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTQ6OTogXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxGVU5DX0RFQ0wsRk9MTE9XX0ZVTkNfREVDTF9pbl9kZWNsYXJhdGlvbjc0KTsgCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb243Nik7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSGVhZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzoxNTo5OiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsRlVOQ19ERUYsRk9MTE9XX0ZVTkNfREVGX2luX2RlY2xhcmF0aW9uODgpOyAKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IAorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjkwKTsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25IZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb245Mik7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAidmFyaWFibGUiCisgICAgLy8gU2ltcGxlQ1RQLmc6MTg6MTogdmFyaWFibGUgOiBeKCBWQVJfREVGIHR5cGUgZGVjbGFyYXRvciApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB2YXJpYWJsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzoxOTo1OiAoIF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgKQorICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTk6OTogXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goaW5wdXQsVkFSX0RFRixGT0xMT1dfVkFSX0RFRl9pbl92YXJpYWJsZTExMyk7IAorCisgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IAorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTExNSk7CisgICAgICAgICAgICB0eXBlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTExNyk7CisgICAgICAgICAgICBkZWNsYXJhdG9yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJ2YXJpYWJsZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJkZWNsYXJhdG9yIgorICAgIC8vIFNpbXBsZUNUUC5nOjIyOjE6IGRlY2xhcmF0b3IgOiBJRCA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzoyMzo1OiAoIElEICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjIzOjk6IElECisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaChpbnB1dCxJRCxGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjEzNyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImRlY2xhcmF0b3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZnVuY3Rpb25IZWFkZXIiCisgICAgLy8gU2ltcGxlQ1RQLmc6MjY6MTogZnVuY3Rpb25IZWFkZXIgOiBeKCBGVU5DX0hEUiB0eXBlIElEICggZm9ybWFsUGFyYW1ldGVyICkrICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZ1bmN0aW9uSGVhZGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjI3OjU6ICggXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjI3Ojk6IF4oIEZVTkNfSERSIHR5cGUgSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goaW5wdXQsRlVOQ19IRFIsRk9MTE9XX0ZVTkNfSERSX2luX2Z1bmN0aW9uSGVhZGVyMTU4KTsgCisKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMTYwKTsKKyAgICAgICAgICAgIHR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBtYXRjaChpbnB1dCxJRCxGT0xMT1dfSURfaW5fZnVuY3Rpb25IZWFkZXIxNjIpOyAKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjI3OjI4OiAoIGZvcm1hbFBhcmFtZXRlciApKworICAgICAgICAgICAgaW50IGNudDM9MDsKKyAgICAgICAgICAgIGxvb3AzOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09QVJHX0RFRikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIFNpbXBsZUNUUC5nOjI3OjI4OiBmb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNjQpOworICAgICAgICAgICAgCSAgICBmb3JtYWxQYXJhbWV0ZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MyA+PSAxICkgYnJlYWsgbG9vcDM7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDMsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MysrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZnVuY3Rpb25IZWFkZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZm9ybWFsUGFyYW1ldGVyIgorICAgIC8vIFNpbXBsZUNUUC5nOjMwOjE6IGZvcm1hbFBhcmFtZXRlciA6IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzozMTo1OiAoIF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgKQorICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MzE6OTogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goaW5wdXQsQVJHX0RFRixGT0xMT1dfQVJHX0RFRl9pbl9mb3JtYWxQYXJhbWV0ZXIxODYpOyAKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMTg4KTsKKyAgICAgICAgICAgIHR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjE5MCk7CisgICAgICAgICAgICBkZWNsYXJhdG9yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJmb3JtYWxQYXJhbWV0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAidHlwZSIKKyAgICAvLyBTaW1wbGVDVFAuZzozNDoxOiB0eXBlIDogKCAnaW50JyB8ICdjaGFyJyB8ICd2b2lkJyB8IElEICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzozNTo1OiAoICdpbnQnIHwgJ2NoYXInIHwgJ3ZvaWQnIHwgSUQgKQorICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT1JRHx8KGlucHV0LkxBKDEpPj1JTlRfVFlQRSAmJiBpbnB1dC5MQSgxKTw9Vk9JRCkgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInR5cGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiYmxvY2siCisgICAgLy8gU2ltcGxlQ1RQLmc6NDE6MTogYmxvY2sgOiBeKCBCTE9DSyAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBibG9jaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo0Mjo1OiAoIF4oIEJMT0NLICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgKQorICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NDI6OTogXiggQkxPQ0sgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goaW5wdXQsQkxPQ0ssRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjczKTsgCisKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PVRva2VuLkRPV04gKSB7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo0MjoxNzogKCB2YXJpYWJsZSApKgorICAgICAgICAgICAgICAgIGxvb3A0OgorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDQ9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE0XzA9PVZBUl9ERUYpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAJICAgIC8vIFNpbXBsZUNUUC5nOjQyOjE3OiB2YXJpYWJsZQorICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2syNzUpOworICAgICAgICAgICAgICAgIAkgICAgdmFyaWFibGUoKTsKKworICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjQyOjI3OiAoIHN0YXQgKSoKKyAgICAgICAgICAgICAgICBsb29wNToKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTVfMD49QkxPQ0sgJiYgTEE1XzA8PUZPUil8fChMQTVfMD49RVFFUSAmJiBMQTVfMDw9UExVUykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAJICAgIC8vIFNpbXBsZUNUUC5nOjQyOjI3OiBzdGF0CisgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19zdGF0X2luX2Jsb2NrMjc4KTsKKyAgICAgICAgICAgICAgICAJICAgIHN0YXQoKTsKKworICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiYmxvY2siCisKKworICAgIC8vICRBTlRMUiBzdGFydCAic3RhdCIKKyAgICAvLyBTaW1wbGVDVFAuZzo0NToxOiBzdGF0IDogKCBmb3JTdGF0IHwgZXhwciB8IGJsb2NrICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgc3RhdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo0NTo1OiAoIGZvclN0YXQgfCBleHByIHwgYmxvY2sgKQorICAgICAgICAgICAgaW50IGFsdDY9MzsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBGT1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgY2FzZSBFUToKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgY2FzZSBFUUVROgorICAgICAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nj0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxPQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDY9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDYsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjQ1Ojc6IGZvclN0YXQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19mb3JTdGF0X2luX3N0YXQyOTIpOworICAgICAgICAgICAgICAgICAgICBmb3JTdGF0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo0Njo3OiBleHByCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9zdGF0MzAwKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NDc6NzogYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ibG9ja19pbl9zdGF0MzA4KTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJzdGF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImZvclN0YXQiCisgICAgLy8gU2ltcGxlQ1RQLmc6NTA6MTogZm9yU3RhdCA6IF4oICdmb3InIGV4cHIgZXhwciBleHByIGJsb2NrICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvclN0YXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NTE6NTogKCBeKCAnZm9yJyBleHByIGV4cHIgZXhwciBibG9jayApICkKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjUxOjk6IF4oICdmb3InIGV4cHIgZXhwciBleHByIGJsb2NrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEZPUixGT0xMT1dfRk9SX2luX2ZvclN0YXQzMjgpOyAKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDMzMCk7CisgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzMyKTsKKyAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2ZvclN0YXQzMzQpOworICAgICAgICAgICAgZXhwcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzMzYpOworICAgICAgICAgICAgYmxvY2soKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5VUCwgbnVsbCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImZvclN0YXQiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGV4cHJfcmV0dXJuIGV4dGVuZHMgVHJlZVJ1bGVSZXR1cm5TY29wZSB7CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZXhwciIKKyAgICAvLyBTaW1wbGVDVFAuZzo1NDoxOiBleHByIDogKCBeKCBFUUVRIGV4cHIgZXhwciApIHwgXiggTFQgZXhwciBleHByICkgfCBeKCBQTFVTIGV4cHIgZXhwciApIHwgXiggRVEgSUQgZT0gZXhwciApIHwgYXRvbSApOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDVFAuZXhwcl9yZXR1cm4gZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNUUC5leHByX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1RQLmV4cHJfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSBJRDE9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1RQLmV4cHJfcmV0dXJuIGUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU0OjU6ICggXiggRVFFUSBleHByIGV4cHIgKSB8IF4oIExUIGV4cHIgZXhwciApIHwgXiggUExVUyBleHByIGV4cHIgKSB8IF4oIEVRIElEIGU9IGV4cHIgKSB8IGF0b20gKQorICAgICAgICAgICAgaW50IGFsdDc9NTsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBFUUVROgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDcsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU0Ojk6IF4oIEVRRVEgZXhwciBleHByICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxFUUVRLEZPTExPV19FUUVRX2luX2V4cHIzNTIpOyAKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IAorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2V4cHIzNTQpOworICAgICAgICAgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZXhwcjM1Nik7CisgICAgICAgICAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU1Ojk6IF4oIExUIGV4cHIgZXhwciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsTFQsRk9MTE9XX0xUX2luX2V4cHIzNjgpOyAKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IAorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2V4cHIzNzApOworICAgICAgICAgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZXhwcjM3Mik7CisgICAgICAgICAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU2Ojk6IF4oIFBMVVMgZXhwciBleHByICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxQTFVTLEZPTExPV19QTFVTX2luX2V4cHIzODQpOyAKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IAorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2V4cHIzODYpOworICAgICAgICAgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZXhwcjM4OCk7CisgICAgICAgICAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU3Ojk6IF4oIEVRIElEIGU9IGV4cHIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LEVRLEZPTExPV19FUV9pbl9leHByNDAwKTsgCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgSUQxPShBTlRMUkNvbW1vblRyZWUpbWF0Y2goaW5wdXQsSUQsRk9MTE9XX0lEX2luX2V4cHI0MDIpOyAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9leHByNDA2KTsKKyAgICAgICAgICAgICAgICAgICAgZT1leHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgICBOU0xvZyhAImFzc2lnbmluZyAlQCB0byB2YXJpYWJsZSAlQCIsIChlIT1udWxsPyhpbnB1dC5nZXRUb2tlblN0cmVhbSgpLnRvU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KGUuc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgoZS5zdGFydCkpKTpudWxsKSwgKElEMSE9bnVsbD9JRDEuZ2V0VGV4dCgpOm51bGwpKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo1ODo5OiBhdG9tCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYXRvbV9pbl9leHByNDE5KTsKKyAgICAgICAgICAgICAgICAgICAgYXRvbSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImV4cHIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiYXRvbSIKKyAgICAvLyBTaW1wbGVDVFAuZzo2MToxOiBhdG9tIDogKCBJRCB8IElOVCApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGF0b20oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NjI6NTogKCBJRCB8IElOVCApCisgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PUlEfHxpbnB1dC5MQSgxKT09SU5UICkgeworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtc2U7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJhdG9tIgorCisgICAgLy8gRGVsZWdhdGVkIHJ1bGVzCisKKworIAorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW00MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAxOTJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNjMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19GVU5DX0RFQ0xfaW5fZGVjbGFyYXRpb243NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uNzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19GVU5DX0RFRl9pbl9kZWNsYXJhdGlvbjg4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb245MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAyMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uOTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19WQVJfREVGX2luX3ZhcmlhYmxlMTEzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTExNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDA0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19JRF9pbl9kZWNsYXJhdG9yMTM3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfRlVOQ19IRFJfaW5fZnVuY3Rpb25IZWFkZXIxNTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA0TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMTYwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfSURfaW5fZnVuY3Rpb25IZWFkZXIxNjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDIwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNjQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDI4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19BUkdfREVGX2luX2Zvcm1hbFBhcmFtZXRlcjE4NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMTg4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIxOTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19zZXRfaW5fdHlwZTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19CTE9DS19pbl9ibG9jazI3MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMjc1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDBFM0UxOEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfc3RhdF9pbl9ibG9jazI3OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwRTNFMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDI5MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fc3RhdDMwMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX3N0YXQzMDggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19GT1JfaW5fZm9yU3RhdDMyOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDMzMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwRTFDMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDMzMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwRTFDMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDMzNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAyMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzMzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19FUUVRX2luX2V4cHIzNTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA0TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHIzNTQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMEUxQzAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHIzNTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19MVF9pbl9leHByMzY4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9leHByMzcwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDBFMUMwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9leHByMzcyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwOEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfUExVU19pbl9leHByMzg0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9leHByMzg2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDBFMUMwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9leHByMzg4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwOEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfRVFfaW5fZXhwcjQwMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0lEX2luX2V4cHI0MDIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMEUxQzAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHI0MDYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hdG9tX2luX2V4cHI0MTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19zZXRfaW5fYXRvbTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTEwMGViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLm0KQEAgLTAsMCArMSwxMjIyIEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IFNpbXBsZUNUUC5nCisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDIwMTEtMDUtMDYgMTU6MDk6MjgKKyAqICAgICAtICAgICAgICAgICBmb3IgdGhlIHRyZWUgcGFyc2VyIDogU2ltcGxlQ1RQVHJlZVBhcnNlcgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCisqLworLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBTaW1wbGVDVFAuZyAyMDExLTA1LTA2IDE1OjA5OjI4CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlNpbXBsZUNUUC5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisjcHJhZ21hIG1hcmsgQml0c2V0cworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTU2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTU2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAyMDAwMEMyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb243NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNzZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19GVU5DX0RFQ0xfaW5fZGVjbGFyYXRpb244NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0ZVTkNfREVDTF9pbl9kZWNsYXJhdGlvbjg3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb244OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uODlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19GVU5DX0RFRl9pbl9kZWNsYXJhdGlvbjEwMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0ZVTkNfREVGX2luX2RlY2xhcmF0aW9uMTAxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMDM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjEwM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAyMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTA1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMDVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19WQVJfREVGX2luX3ZhcmlhYmxlMTI2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfVkFSX0RFRl9pbl92YXJpYWJsZTEyNl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3R5cGVfaW5fdmFyaWFibGUxMjg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTI4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0MDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTEzMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMzBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0lEX2luX2RlY2xhcmF0b3IxNTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0lEX2luX2RlY2xhcmF0b3IxNTBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19GVU5DX0hEUl9pbl9mdW5jdGlvbkhlYWRlcjE3MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0ZVTkNfSERSX2luX2Z1bmN0aW9uSGVhZGVyMTcxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjE3MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNzNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDQwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0lEX2luX2Z1bmN0aW9uSGVhZGVyMTc1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjE3NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAxMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjE3NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjE3N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAxOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0FSR19ERUZfaW5fZm9ybWFsUGFyYW1ldGVyMTk5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfQVJHX0RFRl9pbl9mb3JtYWxQYXJhbWV0ZXIxOTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDRMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjIwMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjAxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA0MDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyMDM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjIwM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjgzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfQkxPQ0tfaW5fYmxvY2syODNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDRMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV192YXJpYWJsZV9pbl9ibG9jazI4NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMjg1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAyMThGODI4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfc3RhdF9pbl9ibG9jazI4ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3N0YXRfaW5fYmxvY2syODhfZGF0YVtdID0geyAweDAwMDAwMDAwMDAxOEY4MjhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mb3JTdGF0X2luX3N0YXQzMDI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mb3JTdGF0X2luX3N0YXQzMDJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX3N0YXQzMTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX3N0YXQzMTBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ibG9ja19pbl9zdGF0MzE4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYmxvY2tfaW5fc3RhdDMxOF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfRk9SX2luX2ZvclN0YXQzMzg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0ZPUl9pbl9mb3JTdGF0MzM4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMThEODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMThEODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQ0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQ0X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDIwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDM0NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzNDZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0VRRVFfaW5fZXhwcjM2MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfRVFFUV9pbl9leHByMzYyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9leHByMzY0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9leHByMzY0X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMThEODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9leHByMzY2Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9leHByMzY2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19MVF9pbl9leHByMzc4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19MVF9pbl9leHByMzc4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9leHByMzgwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9leHByMzgwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMThEODAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9leHByMzgyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9leHByMzgyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19QTFVTX2luX2V4cHIzOTQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX1BMVVNfaW5fZXhwcjM5NF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjM5NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjM5Nl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDE4RDgwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjM5ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjM5OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfRVFfaW5fZXhwcjQxMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfRVFfaW5fZXhwcjQxMF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfSURfaW5fZXhwcjQxMjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfSURfaW5fZXhwcjQxMl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDE4RDgwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjQxNjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjQxNl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2F0b21faW5fZXhwcjQyOTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2F0b21faW5fZXhwcjQyOV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKKworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCitAaW1wbGVtZW50YXRpb24gU3ltYm9sc19TY29wZSAgLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVJbXBsZW1lbnRhdGlvbiAqLworLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTc1MCAqLworCitAc3ludGhlc2l6ZSB0cmVlOworCisrIChTeW1ib2xzX1Njb3BlICopbmV3U3ltYm9sc19TY29wZQoreworICAgIHJldHVybiBbW1tTeW1ib2xzX1Njb3BlIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIHN0YXJ0IG9mIGl0ZXJhdGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovCisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldHRyZWUgeyByZXR1cm4oIHRyZWUgKTsgfQorCistICh2b2lkKXNldHRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFWYWwgeyB0cmVlID0gYVZhbDsgfQorCisvKiBFbmQgb2YgaXRlcmF0ZSBnZXQgYW5kIHNldCBmdW5jdGlvbnMgKi8KKworQGVuZCAvKiBlbmQgb2YgU3ltYm9sc19TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDVFBfZXhwcl9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDVFBfZXhwcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1RQX2V4cHJfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKKy8vI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorLy8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1RQICAvLyBsaW5lIDYzNworCisvKiBPYmpDIHN0YXJ0IG9mIHJ1bGVBdHRyaWJ1dGVTY29wZSAqLworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKy8qIE9iakMgZW5kIG9mIHJ1bGVBdHRyaWJ1dGVTY29wZSAqLworI3ByYWdtYSBtYXJrIGdsb2JhbCBBdHRyaWJ1dGUgU2NvcGVzCisvKiBPYmpDIHN0YXJ0IGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCitzdGF0aWMgX3N0YWNrOworCisvKiBPYmpDIGVuZCBnbG9iYWxBdHRyaWJ1dGVTY29wZSAqLworLyogT2JqQyBzdGFydCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBlbmQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnRoZXNpemUgKi8KKy8qIE9iakMgc3RhcnQgc3ludGhlc2l6ZSgpICovCisvKiBPYmpDIGVuZCBzeW50aGVzaXplKCkgKi8KKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgICNwcmFnbWEgbWFyayBCaXRzZXRzCisgICAgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01NiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01Nl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNzYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjc2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfRlVOQ19ERUNMX2luX2RlY2xhcmF0aW9uODcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19GVU5DX0RFQ0xfaW5fZGVjbGFyYXRpb244N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uODkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjg5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfRlVOQ19ERUZfaW5fZGVjbGFyYXRpb24xMDEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19GVU5DX0RFRl9pbl9kZWNsYXJhdGlvbjEwMV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTAzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMDNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjEwNSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTA1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfVkFSX0RFRl9pbl92YXJpYWJsZTEyNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX1ZBUl9ERUZfaW5fdmFyaWFibGUxMjZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTI4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTEyOF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMzAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTMwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTUwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTUwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfRlVOQ19IRFJfaW5fZnVuY3Rpb25IZWFkZXIxNzEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19GVU5DX0hEUl9pbl9mdW5jdGlvbkhlYWRlcjE3MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNzMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMTczX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjE3NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIxNzVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNzcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNzdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19BUkdfREVGX2luX2Zvcm1hbFBhcmFtZXRlcjE5OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0FSR19ERUZfaW5fZm9ybWFsUGFyYW1ldGVyMTk5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIyMDEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjIwMV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMjAzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyMDNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19CTE9DS19pbl9ibG9jazI4MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjgzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2syODUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9ibG9jazI4NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3N0YXRfaW5fYmxvY2syODggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zdGF0X2luX2Jsb2NrMjg4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzAyID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzAyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9zdGF0MzEwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9zdGF0MzEwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYmxvY2tfaW5fc3RhdDMxOCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Jsb2NrX2luX3N0YXQzMThfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0ZPUl9pbl9mb3JTdGF0MzM4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDMzOF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0MiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0Ml9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzNDYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19ibG9ja19pbl9mb3JTdGF0MzQ2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19FUUVRX2luX2V4cHIzNjIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0VRRVFfaW5fZXhwcjM2Ml9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM2NCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM2NF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM2NiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM2Nl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfTFRfaW5fZXhwcjM3OCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfTFRfaW5fZXhwcjM3OF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM4MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM4MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM4MiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM4Ml9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfUExVU19pbl9leHByMzk0ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19QTFVTX2luX2V4cHIzOTRfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2V4cHIzOTYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2V4cHIzOTZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2V4cHIzOTggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2V4cHIzOThfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0VRX2luX2V4cHI0MTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0VRX2luX2V4cHI0MTBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0lEX2luX2V4cHI0MTIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0lEX2luX2V4cHI0MTJfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2V4cHI0MTYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2V4cHI0MTZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hdG9tX2luX2V4cHI0MjkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hdG9tX2luX2V4cHI0MjlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworCisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0VG9rZW5OYW1lczpbW0FNdXRhYmxlQXJyYXkgYXJyYXlXaXRoT2JqZWN0czpAIjxpbnZhbGlkPiIsIEAiPEVPUj4iLCBAIjxET1dOPiIsIEAiPFVQPiIsIAorIEAiQVJHX0RFRiIsIEAiQkxPQ0siLCBAIkZVTkNfREVDTCIsIEAiRlVOQ19ERUYiLCBAIkZVTkNfSERSIiwgQCJLX0NIQVIiLCAKKyBAIktfQ09NTUEiLCBAIktfRVEiLCBAIktfRVFFUSIsIEAiS19GT1IiLCBAIktfSUQiLCBAIktfSU5UIiwgQCJLX0lOVF9UWVBFIiwgCisgQCJLX0xDVVJMWSIsIEAiS19MQ1VSVkUiLCBAIktfTFQiLCBAIktfUExVUyIsIEAiS19SQ1VSTFkiLCBAIktfUkNVUlZFIiwgCisgQCJLX1NFTUlDT0xPTiIsIEAiS19WT0lEIiwgQCJWQVJfREVGIiwgQCJXUyIsIG5pbF0gcmV0YWluXV07CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiU2ltcGxlQ1RQLmciXTsKK30KKworKyAoU2ltcGxlQ1RQICopbmV3U2ltcGxlQ1RQOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhU3RyZWFtCit7CisgICAgcmV0dXJuIFtbU2ltcGxlQ1RQIGFsbG9jXSBpbml0V2l0aFN0cmVhbTphU3RyZWFtXTsKKworCit9CisKKy0gKGlkKSBpbml0V2l0aFN0cmVhbTooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYVN0cmVhbQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhTdHJlYW06YVN0cmVhbSBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MTIrMV0gcmV0YWluXV07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKworCisgICAgICAgIC8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW5pdCAqLworICAgICAgICBTeW1ib2xzX3Njb3BlID0gW1N5bWJvbHNfU2NvcGUgbmV3U3ltYm9sc19TY29wZV07CisgICAgICAgIFN5bWJvbHNfc3RhY2sgPSBbQU5UTFJTeW1ib2xTdGFjayBuZXdBTlRMUlN5bWJvbFN0YWNrV2l0aExlbjozMF07CisgICAgICAgIC8qIHN0YXJ0IG9mIGFjdGlvbnMtYWN0aW9uU2NvcGUtaW5pdCAqLworICAgICAgICAvKiBzdGFydCBvZiBpbml0ICovCisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW1N5bWJvbHNfc3RhY2sgcmVsZWFzZV07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIHN0YXJ0IG1lbWJlcnMgKi8KKy8qIE9iakMgZW5kIG1lbWJlcnMgKi8KKy8qIE9iakMgc3RhcnQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisvKiBPYmpDIHN0YXJ0IHJ1bGVzICovCisvKgorICogJEFOVExSIHN0YXJ0IHByb2dyYW0KKyAqIFNpbXBsZUNUUC5nOjEzOjE6IHByb2dyYW0gOiAoIGRlY2xhcmF0aW9uICkrIDsKKyAqLworLSAodm9pZCkgcHJvZ3JhbQoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTQ6NTogKCAoIGRlY2xhcmF0aW9uICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjE0Ojk6ICggZGVjbGFyYXRpb24gKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTQ6OTogKCBkZWNsYXJhdGlvbiApKyAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworICAgICAgICBOU0ludGVnZXIgY250MSA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxID0gMjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTFfMCA+PSBGVU5DX0RFQ0wgJiYgTEExXzAgPD0gRlVOQ19ERUYpfHxMQTFfMD09VkFSX0RFRikgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTQ6OTogZGVjbGFyYXRpb24gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtNTZdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBkZWNsYXJhdGlvbl07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDEgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6MV07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQxKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBwcm9ncmFtICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbGFyYXRpb24KKyAqIFNpbXBsZUNUUC5nOjE3OjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApOworICovCistICh2b2lkKSBkZWNsYXJhdGlvbgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTg6NTogKCB2YXJpYWJsZSB8IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApIC8vcnVsZWJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQyPTM7CisgICAgICAgIHVuaWNoYXIgY2hhckxBMiA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgc3dpdGNoIChjaGFyTEEyKSB7CisgICAgICAgICAgICBjYXNlIFZBUl9ERUY6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlVOQ19ERUNMOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZVTkNfREVGOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogOworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjoyIHN0YXRlOjAgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIG52YWUuYyA9IGNoYXJMQTI7CisgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MTg6OTogdmFyaWFibGUgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjc2XTsKKyAgICAgICAgICAgICAgICBbc2VsZiB2YXJpYWJsZV07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzoxOTo5OiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkZVTkNfREVDTCBGb2xsb3c6Rk9MTE9XX0ZVTkNfREVDTF9pbl9kZWNsYXJhdGlvbjg3XTsgCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uODldOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBmdW5jdGlvbkhlYWRlcl07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjIwOjk6IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpGVU5DX0RFRiBGb2xsb3c6Rk9MTE9XX0ZVTkNfREVGX2luX2RlY2xhcmF0aW9uMTAxXTsgCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTAzXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZnVuY3Rpb25IZWFkZXJdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMDVdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBibG9ja107CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsYXJhdGlvbiAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHZhcmlhYmxlCisgKiBTaW1wbGVDVFAuZzoyMzoxOiB2YXJpYWJsZSA6IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICovCistICh2b2lkKSB2YXJpYWJsZQoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MjQ6NTogKCBeKCBWQVJfREVGIHR5cGUgZGVjbGFyYXRvciApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjI0Ojk6IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlZBUl9ERUYgRm9sbG93OkZPTExPV19WQVJfREVGX2luX3ZhcmlhYmxlMTI2XTsgCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3R5cGVfaW5fdmFyaWFibGUxMjhdOworICAgICAgICAgICAgW3NlbGYgdHlwZV07CisKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTMwXTsKKyAgICAgICAgICAgIFtzZWxmIGRlY2xhcmF0b3JdOworCisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHZhcmlhYmxlICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbGFyYXRvcgorICogU2ltcGxlQ1RQLmc6Mjc6MTogZGVjbGFyYXRvciA6IEtfSUQgOworICovCistICh2b2lkKSBkZWNsYXJhdG9yCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDVFAuZzoyODo1OiAoIEtfSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6Mjg6OTogS19JRCAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fZGVjbGFyYXRvcjE1MF07IAorCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xhcmF0b3IgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBmdW5jdGlvbkhlYWRlcgorICogU2ltcGxlQ1RQLmc6MzE6MTogZnVuY3Rpb25IZWFkZXIgOiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSA7CisgKi8KKy0gKHZvaWQpIGZ1bmN0aW9uSGVhZGVyCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDVFAuZzozMjo1OiAoIF4oIEZVTkNfSERSIHR5cGUgS19JRCAoIGZvcm1hbFBhcmFtZXRlciApKyApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjMyOjk6IF4oIEZVTkNfSERSIHR5cGUgS19JRCAoIGZvcm1hbFBhcmFtZXRlciApKyApIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpGVU5DX0hEUiBGb2xsb3c6Rk9MTE9XX0ZVTkNfSERSX2luX2Z1bmN0aW9uSGVhZGVyMTcxXTsgCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNzNdOworICAgICAgICAgICAgW3NlbGYgdHlwZV07CisKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIxNzVdOyAKKworICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MzI6MzA6ICggZm9ybWFsUGFyYW1ldGVyICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgICAgICBOU0ludGVnZXIgY250MyA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDMgPSAyOworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09QVJHX0RFRikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzozMjozMDogZm9ybWFsUGFyYW1ldGVyIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMTc3XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGZvcm1hbFBhcmFtZXRlcl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY250MyA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzOworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjppbnB1dCBkZWNpc2lvbk51bWJlcjozXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDMrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgICAgICBsb29wMzogOworCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpVUCBGb2xsb3c6bmlsXTsgCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBmdW5jdGlvbkhlYWRlciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGZvcm1hbFBhcmFtZXRlcgorICogU2ltcGxlQ1RQLmc6MzU6MTogZm9ybWFsUGFyYW1ldGVyIDogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSA7CisgKi8KKy0gKHZvaWQpIGZvcm1hbFBhcmFtZXRlcgoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6MzY6NTogKCBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjM2Ojk6IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFSR19ERUYgRm9sbG93OkZPTExPV19BUkdfREVGX2luX2Zvcm1hbFBhcmFtZXRlcjE5OV07IAorCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6RE9XTiBGb2xsb3c6bmlsXTsgCisgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjIwMV07CisgICAgICAgICAgICBbc2VsZiB0eXBlXTsKKworICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMjAzXTsKKyAgICAgICAgICAgIFtzZWxmIGRlY2xhcmF0b3JdOworCisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGZvcm1hbFBhcmFtZXRlciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHR5cGUKKyAqIFNpbXBsZUNUUC5nOjM5OjE6IHR5cGUgOiAoIEtfSU5UX1RZUEUgfCBLX0NIQVIgfCBLX1ZPSUQgfCBLX0lEICk7CisgKi8KKy0gKHZvaWQpIHR5cGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjQwOjU6ICggS19JTlRfVFlQRSB8IEtfQ0hBUiB8IEtfVk9JRCB8IEtfSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6IC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmIChbaW5wdXQgTEE6MV0gPT0gS19DSEFSfHxbaW5wdXQgTEE6MV0gPT0gS19JRHx8W2lucHV0IExBOjFdID09IEtfSU5UX1RZUEV8fFtpbnB1dCBMQToxXSA9PSBLX1ZPSUQpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgIFtzdGF0ZSBzZXRJc0Vycm9yUmVjb3Zlcnk6Tk9dOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgIH0KKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHR5cGUgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBibG9jaworICogU2ltcGxlQ1RQLmc6NDY6MTogYmxvY2sgOiBeKCBCTE9DSyAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIDsKKyAqLworLSAodm9pZCkgYmxvY2sKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjQ3OjU6ICggXiggQkxPQ0sgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDVFAuZzo0Nzo5OiBeKCBCTE9DSyAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpCTE9DSyBGb2xsb3c6Rk9MTE9XX0JMT0NLX2luX2Jsb2NrMjgzXTsgCisKKyAgICAgICAgaWYgKCBbaW5wdXQgTEE6MV0gPT0gRE9XTiApIHsKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0ND0yOworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTRfMD09VkFSX0RFRikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo0NzoxNzogdmFyaWFibGUgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV192YXJpYWJsZV9pbl9ibG9jazI4NV07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiB2YXJpYWJsZV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgICAgIGxvb3A0OiA7CisKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ1PTI7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBNV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgICAgIGlmICggKExBNV8wPT1CTE9DS3x8KExBNV8wID49IEtfRVEgJiYgTEE1XzAgPD0gS19JTlQpfHwoTEE1XzAgPj0gS19MVCAmJiBMQTVfMCA8PSBLX1BMVVMpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjQ3OjI3OiBzdGF0IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfc3RhdF9pbl9ibG9jazI4OF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBzdGF0XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICAgICAgbG9vcDU6IDsKKworCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6VVAgRm9sbG93Om5pbF07IAorICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBibG9jayAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHN0YXQKKyAqIFNpbXBsZUNUUC5nOjUwOjE6IHN0YXQgOiAoIGZvclN0YXQgfCBleHByIHwgYmxvY2sgKTsKKyAqLworLSAodm9pZCkgc3RhdAoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NTA6NTogKCBmb3JTdGF0IHwgZXhwciB8IGJsb2NrICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDY9MzsKKyAgICAgICAgdW5pY2hhciBjaGFyTEE2ID0gW2lucHV0IExBOjFdOworICAgICAgICBzd2l0Y2ggKGNoYXJMQTYpIHsKKyAgICAgICAgICAgIGNhc2UgS19GT1I6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19FUTogOworICAgICAgICAgICAgY2FzZSBLX0VRRVE6IDsKKyAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgY2FzZSBLX0xUOiA7CisgICAgICAgICAgICBjYXNlIEtfUExVUzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTE9DSzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246NiBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBudmFlLmMgPSBjaGFyTEE2OworICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjUwOjc6IGZvclN0YXQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19mb3JTdGF0X2luX3N0YXQzMDJdOworICAgICAgICAgICAgICAgIFtzZWxmIGZvclN0YXRdOworCisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NTE6NzogZXhwciAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fc3RhdDMxMF07CisgICAgICAgICAgICAgICAgW3NlbGYgZXhwcl07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6IDsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbGVDVFAuZzo1Mjo3OiBibG9jayAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX3N0YXQzMThdOworICAgICAgICAgICAgICAgIFtzZWxmIGJsb2NrXTsKKworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzdGF0ICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgZm9yU3RhdAorICogU2ltcGxlQ1RQLmc6NTU6MTogZm9yU3RhdCA6IF4oIEtfRk9SIGV4cHIgZXhwciBleHByIGJsb2NrICkgOworICovCistICh2b2lkKSBmb3JTdGF0Cit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDVFAuZzo1Njo1OiAoIF4oIEtfRk9SIGV4cHIgZXhwciBleHByIGJsb2NrICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NTY6OTogXiggS19GT1IgZXhwciBleHByIGV4cHIgYmxvY2sgKSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19GT1IgRm9sbG93OkZPTExPV19LX0ZPUl9pbl9mb3JTdGF0MzM4XTsgCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0MF07CisgICAgICAgICAgICBbc2VsZiBleHByXTsKKworICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0Ml07CisgICAgICAgICAgICBbc2VsZiBleHByXTsKKworICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NF07CisgICAgICAgICAgICBbc2VsZiBleHByXTsKKworICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzNDZdOworICAgICAgICAgICAgW3NlbGYgYmxvY2tdOworCisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGZvclN0YXQgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCBleHByCisgKiBTaW1wbGVDVFAuZzo1OToxOiBleHByIDogKCBeKCBLX0VRRVEgZXhwciBleHByICkgfCBeKCBLX0xUIGV4cHIgZXhwciApIHwgXiggS19QTFVTIGV4cHIgZXhwciApIHwgXiggS19FUSBLX0lEIGU9IGV4cHIgKSB8IGF0b20gKTsKKyAqLworLSAoU2ltcGxlQ1RQX2V4cHJfcmV0dXJuICopIGV4cHIKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgU2ltcGxlQ1RQX2V4cHJfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNUUF9leHByX3JldHVybiBuZXdTaW1wbGVDVFBfZXhwcl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworCisgICAgQHRyeSB7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19JRDEgPSBuaWw7CisgICAgICAgICBTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKiBlID0gbmlsIDsKKyAgICAgICAgIAorCisgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU5OjU6ICggXiggS19FUUVRIGV4cHIgZXhwciApIHwgXiggS19MVCBleHByIGV4cHIgKSB8IF4oIEtfUExVUyBleHByIGV4cHIgKSB8IF4oIEtfRVEgS19JRCBlPSBleHByICkgfCBhdG9tICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDc9NTsKKyAgICAgICAgdW5pY2hhciBjaGFyTEE3ID0gW2lucHV0IExBOjFdOworICAgICAgICBzd2l0Y2ggKGNoYXJMQTcpIHsKKyAgICAgICAgICAgIGNhc2UgS19FUUVROiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtfTFQ6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19QTFVTOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtfRVE6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246NyBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBudmFlLmMgPSBjaGFyTEE3OworICAgICAgICAgICAgQHRocm93IG52YWU7CisKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjU5Ojk6IF4oIEtfRVFFUSBleHByIGV4cHIgKSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfRVFFUSBGb2xsb3c6Rk9MTE9XX0tfRVFFUV9pbl9leHByMzYyXTsgCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZXhwcjM2NF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGV4cHJdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9leHByMzY2XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZXhwcl07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjYwOjk6IF4oIEtfTFQgZXhwciBleHByICkgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0xUIEZvbGxvdzpGT0xMT1dfS19MVF9pbl9leHByMzc4XTsgCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZXhwcjM4MF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGV4cHJdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9leHByMzgyXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZXhwcl07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjYxOjk6IF4oIEtfUExVUyBleHByIGV4cHIgKSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfUExVUyBGb2xsb3c6Rk9MTE9XX0tfUExVU19pbl9leHByMzk0XTsgCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZXhwcjM5Nl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGV4cHJdOworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9leHByMzk4XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZXhwcl07CisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0IDogOworICAgICAgICAgICAgICAgIC8vIFNpbXBsZUNUUC5nOjYyOjk6IF4oIEtfRVEgS19JRCBlPSBleHByICkgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0VRIEZvbGxvdzpGT0xMT1dfS19FUV9pbl9leHByNDEwXTsgCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICBLX0lEMT0oQU5UTFJDb21tb25UcmVlICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfSUQgRm9sbG93OkZPTExPV19LX0lEX2luX2V4cHI0MTJdOyAKKworICAgICAgICAgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZXhwcjQxNl07CisgICAgICAgICAgICAgICAgICAgIGUgPSBbc2VsZiBleHByXTsKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6VVAgRm9sbG93Om5pbF07IAorCisKKyAgICAgICAgICAgICAgICAgTlNMb2coQCJhc3NpZ25pbmcgJUAgdG8gdmFyaWFibGUgJUAiLCAoZSE9bmlsP1tbaW5wdXQgZ2V0VG9rZW5TdHJlYW1dIHRvU3RyaW5nRnJvbVN0YXJ0OltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RhcnRJbmRleDpbZSBnZXRTdGFydF1dVG9FbmQ6W1tpbnB1dCBnZXRUcmVlQWRhcHRvcl0gZ2V0VG9rZW5TdG9wSW5kZXg6W2UgZ2V0U3RhcnRdXV06MCksIChLX0lEMSE9bmlsP0tfSUQxLnRleHQ6bmlsKSk7IAorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgOiA7CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlQ1RQLmc6NjM6OTogYXRvbSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2F0b21faW5fZXhwcjQyOV07CisgICAgICAgICAgICAgICAgW3NlbGYgYXRvbV07CisKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZXhwciAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGF0b20KKyAqIFNpbXBsZUNUUC5nOjY2OjE6IGF0b20gOiAoIEtfSUQgfCBLX0lOVCApOworICovCistICh2b2lkKSBhdG9tCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBTaW1wbGVDVFAuZzo2Nzo1OiAoIEtfSUQgfCBLX0lOVCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBTaW1wbGVDVFAuZzogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49IEtfSUQpICYmIChbaW5wdXQgTEE6MV0gPD0gS19JTlQpKSkgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgW3N0YXRlIHNldElzRXJyb3JSZWNvdmVyeTpOT107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgYXRvbSAqLworLyogT2JqQyBlbmQgcnVsZXMgKi8KKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1RQIGltcGxlbWVudGF0aW9uIGxpbmUgNjkyICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAudG9rZW5zIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVlZjFmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLnRva2VucwpAQCAtMCwwICsxLDIzIEBACitBUkdfREVGPTQKK0JMT0NLPTUKK0ZVTkNfREVDTD02CitGVU5DX0RFRj03CitGVU5DX0hEUj04CitLX0NIQVI9OQorS19DT01NQT0xMAorS19FUT0xMQorS19FUUVRPTEyCitLX0ZPUj0xMworS19JRD0xNAorS19JTlQ9MTUKK0tfSU5UX1RZUEU9MTYKK0tfTENVUkxZPTE3CitLX0xDVVJWRT0xOAorS19MVD0xOQorS19QTFVTPTIwCitLX1JDVVJMWT0yMQorS19SQ1VSVkU9MjIKK0tfU0VNSUNPTE9OPTIzCitLX1ZPSUQ9MjQKK1ZBUl9ERUY9MjUKK1dTPTI2CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDX18uZ2wgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDX18uZ2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3Y2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNfXy5nbApAQCAtMCwwICsxLDQ3IEBACitsZXhlciBncmFtbWFyIFNpbXBsZUM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2U9T2JqQzsKKworfQorCitUMjEgOiAnOycgOworVDIyIDogJygnIDsKK1QyMyA6ICcsJyA7CitUMjQgOiAnKScgOworVDI1IDogJ3snIDsKK1QyNiA6ICd9JyA7CisKKy8vICRBTlRMUiBzcmMgIlNpbXBsZUMuZyIgOTEKK0ZPUiA6ICdmb3InIDsKKy8vICRBTlRMUiBzcmMgIlNpbXBsZUMuZyIgOTIKK0lOVF9UWVBFIDogJ2ludCcgOworLy8gJEFOVExSIHNyYyAiU2ltcGxlQy5nIiA5MworQ0hBUjogJ2NoYXInOworLy8gJEFOVExSIHNyYyAiU2ltcGxlQy5nIiA5NAorVk9JRDogJ3ZvaWQnOworCisvLyAkQU5UTFIgc3JjICJTaW1wbGVDLmciIDk2CitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworLy8gJEFOVExSIHNyYyAiU2ltcGxlQy5nIiA5OQorSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKKy8vICRBTlRMUiBzcmMgIlNpbXBsZUMuZyIgMTAyCitFUSAgIDogJz0nIDsKKy8vICRBTlRMUiBzcmMgIlNpbXBsZUMuZyIgMTAzCitFUUVRIDogJz09JyA7CisvLyAkQU5UTFIgc3JjICJTaW1wbGVDLmciIDEwNAorTFQgICA6ICc8JyA7CisvLyAkQU5UTFIgc3JjICJTaW1wbGVDLmciIDEwNQorUExVUyA6ICcrJyA7CisKKy8vICRBTlRMUiBzcmMgIlNpbXBsZUMuZyIgMTA3CitXUyAgOiAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgICdccicKKyAgICAgICAgfCAgICdcbicKKyAgICAgICAgKSsKKyAgICAgICAgeyAkY2hhbm5lbD05OTsgfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9hbnRscjMuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL2FudGxyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTYyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9hbnRscjMuaApAQCAtMCwwICsxLDc5IEBACisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VSZWNvZ25pemVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VTdGFjay5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQml0U2V0Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25FcnJvck5vZGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVG9rZW4uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJERkEuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWcuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdFdmVudFByb3h5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1BhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVycm9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYXN0UXVldWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaE1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJIYXNoUnVsZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJJbnRBcnJheS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJJbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGV4ZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGlua0Jhc2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTG9va2FoZWFkU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9kZU1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQdHJCdWZmZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlTWVtby5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bnRpbWVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyZWFtRW51bWVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJTdHJpbmdTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3ltYm9sU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblNvdXJjZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZUl0ZXJhdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaD4KKy8vI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKy8vI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmlxdWVJRE1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmg+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL2lucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTVhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9pbnB1dApAQCAtMCwwICsxLDEyIEBACitjaGFyIGM7CitpbnQgeDsKKwordm9pZCBiYXIoaW50IHgpOworCitpbnQgZm9vKGludCB5LCBjaGFyIGQpIHsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPDM7IGk9aSsxKSB7CisgICAgeD0zOworICAgIHk9NTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvbWFpbi5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvbWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzVhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9tYWluLm0KQEAgLTAsMCArMSw4NCBAQAorI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgImFudGxyMy5oIgorI2ltcG9ydCAiU2ltcGxlQ0xleGVyLmgiCisjaW1wb3J0ICJTaW1wbGVDUGFyc2VyLmgiCisjaW1wb3J0ICJTaW1wbGVDV2Fsa2VyLmgiCisjaW1wb3J0ICJzdGRpby5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkgeworICAgIE5TRXJyb3IgKmFuRXJyb3I7CisJTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyAgICBjaGFyICppbnAgPSAiL1VzZXJzL2Fjb25kaXQvc291cmNlL2FudGxyMy9hY29uZGl0X2xvY2FsaG9zdC9jb2RlL2FudGxyL2FudGxyMy1tYWluL3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvaW5wdXQiOworICAgIAorLyoKKyAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICAgICAgTlNMb2coQCJwcm92aWRlIHRoZSBpbnB1dCBmaWxlLCBwbGVhc2UiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICovCisJCisJLy8gc2ltcGx5IHJlYWQgaW4gdGhlIGlucHV0IGZpbGUgaW4gb25lIGd1bHAKKwlOU1N0cmluZyAqc3RyaW5nID0gW05TU3RyaW5nIHN0cmluZ1dpdGhDb250ZW50c09mRmlsZTpbTlNTdHJpbmcgc3RyaW5nV2l0aENTdHJpbmc6aW5wIGVuY29kaW5nOk5TQVNDSUlTdHJpbmdFbmNvZGluZ10gZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nIGVycm9yOiZhbkVycm9yXTsKKwlOU0xvZyhAImlucHV0IGlzIDogJUAiLCBzdHJpbmcpOworCisJLy8gY3JlYXRlIGEgc3RyZWFtIG92ZXIgdGhlIGlucHV0LCBzbyB0aGUgbGV4ZXIgY2FuIHNlZWsgYmFjayBhbmQgZm9ydGgsIGJ1dCBkb24ndCBjb3B5IHRoZSBzdHJpbmcsCisJLy8gYXMgd2UgbWFrZSBzdXJlIGl0IHdpbGwgbm90IGdvIGF3YXkuCisJLy8gSWYgdGhlIHN0cmluZyB3b3VsZCBiZSBjb21pbmcgZnJvbSBhIHZvbGF0aWxlIHNvdXJjZSwgc2F5IGEgdGV4dCBmaWVsZCwgd2UgY291bGQgb3B0IHRvIGNvcHkgdGhlIHN0cmluZy4KKwkvLyBUaGF0IHdheSB3ZSBjb3VsZCBkbyB0aGUgcGFyc2luZyBpbiBhIGRpZmZlcmVudCB0aHJlYWQsIGFuZCBzdGlsbCBsZXQgdGhlIHVzZXIgZWRpdCB0aGUgb3JpZ2luYWwgc3RyaW5nLgorCS8vIEJ1dCBoZXJlIHdlIGRvIGl0IHRoZSBzaW1wbGUgd2F5LgorCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06c3RyaW5nXTsKKwkKKwkvLyBBY3R1YWxseSBjcmVhdGUgdGhlIGxleGVyIGZlZWRpbmcgb2YgdGhlIGNoYXJhY3RlciBzdHJlYW0uCisJU2ltcGxlQ0xleGVyICpsZXhlciA9IFtTaW1wbGVDTGV4ZXIgbmV3U2ltcGxlQ0xleGVyV2l0aENoYXJTdHJlYW06c3RyZWFtXTsKKwkKKwkvLyBGb3IgZnVuLCB5b3UgY291bGQgcHJpbnQgYWxsIHRva2VucyB0aGUgbGV4ZXIgcmVjb2duaXplZCwgYnV0IHdlIGNhbiBvbmx5IGRvIGl0IG9uY2UuIEFmdGVyIHRoYXQKKwkvLyB3ZSB3b3VsZCBuZWVkIHRvIHJlc2V0IHRoZSBsZXhlciwgYW5kIGxleCBhZ2Fpbi4KKy8vICAgIGlkPEFOVExSVG9rZW4+IGN1cnJlbnRUb2tlbjsKKy8vICAgIHdoaWxlICgoY3VycmVudFRva2VuID0gW2xleGVyIG5leHRUb2tlbl0pICYmIFtjdXJyZW50VG9rZW4gdHlwZV0gIT0gQU5UTFJUb2tlblR5cGVFT0YpIHsKKy8vICAgICAgICBOU0xvZyhAIiVAIiwgY3VycmVudFRva2VuKTsKKy8vICAgIH0KKy8vCSAgW2xleGVyIHJlc2V0XTsKKwkKKwkvLyBTaW5jZSB0aGUgcGFyc2VyIG5lZWRzIHRvIHNjYW4gYmFjayBhbmQgZm9ydGggb3ZlciB0aGUgdG9rZW5zLCB3ZSBwdXQgdGhlbSBpbnRvIGEgc3RyZWFtLCB0b28uCisJQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqdG9rZW5TdHJlYW0gPSBbQU5UTFJDb21tb25Ub2tlblN0cmVhbSBuZXdBTlRMUkNvbW1vblRva2VuU3RyZWFtV2l0aFRva2VuU291cmNlOmxleGVyXTsKKworCS8vIENvbnN0cnVjdCBhIHBhcnNlciBhbmQgZmVlZCBpdCB0aGUgdG9rZW4gc3RyZWFtLgorCVNpbXBsZUNQYXJzZXIgKnBhcnNlciA9IFtbU2ltcGxlQ1BhcnNlciBhbGxvY10gaW5pdFdpdGhUb2tlblN0cmVhbTp0b2tlblN0cmVhbV07CisJCisJLy8gV2Ugc3RhcnQgdGhlIHBhcnNpbmcgcHJvY2VzcyBieSBjYWxsaW5nIGEgcGFyc2VyIHJ1bGUuIEluIHRoZW9yeSB5b3UgY2FuIGNhbGwgYW55IHBhcnNlciBydWxlIGhlcmUsCisJLy8gYnV0IGl0IG9idmlvdXNseSBoYXMgdG8gbWF0Y2ggdGhlIGlucHV0IHRva2VuIHN0cmVhbS4gT3RoZXJ3aXNlIHBhcnNpbmcgd291bGQgZmFpbC4KKwkvLyBBbHNvIHdhdGNoIG91dCBmb3IgaW50ZXJuYWwgZGVwZW5kZW5jaWVzIGluIHlvdXIgZ3JhbW1hciAoZS5nLiB5b3UgdXNlIGEgc3ltYm9sIHRhYmxlIHRoYXQncyBvbmx5CisJLy8gaW5pdGlhbGl6ZWQgd2hlbiB5b3UgY2FsbCBhIHNwZWNpZmljIHBhcnNlciBydWxlKS4KKwkvLyBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUsIHNvIHdlIGp1c3QgY2FsbCB0aGUgdG9wLW1vc3QgcnVsZSAncHJvZ3JhbScuCisJLy8gU2luY2Ugd2Ugd2FudCB0byBwYXJzZSB0aGUgQVNUIHRoZSBwYXJzZXIgYnVpbGRzLCB3ZSBqdXN0IGFzayB0aGUgcmV0dXJuZWQgb2JqZWN0IGZvciB0aGF0LgorCUFOVExSQ29tbW9uVHJlZSAqcHJvZ3JhbV90cmVlID0gW1twYXJzZXIgcHJvZ3JhbV0gZ2V0VHJlZV07CisKKyAgICBOU0xvZyhAIlJlYWNoZWQgZW5kIG9mIGZpcnN0IHBhcnNlXG4iKTsKKwkvLyBQcmludCB0aGUgbWF0Y2hlZCB0cmVlIGFzIGEgTGlzcC1zdHlsZSBzdHJpbmcKKwlOU0xvZyhAInRyZWU6ICVAIiwgW3Byb2dyYW1fdHJlZSB0cmVlRGVzY3JpcHRpb25dKTsKKwkKKwkvLyBDcmVhdGUgYSBuZXcgdHJlZSBub2RlIHN0cmVhbSB0aGF0J3MgZmVlZGluZyBvZmYgb2YgdGhlIHJvb3Qgbm9kZSAodGh1cyBzZWVpbmcgdGhlIHdob2xlIHRyZWUpCisJQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbSAqdHJlZVN0cmVhbSA9IFtBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIG5ld0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW06cHJvZ3JhbV90cmVlXTsKKwkvLyB0ZWxsIHRoZSBUcmVlTm9kZVN0cmVhbSB3aGVyZSB0aGUgdG9rZW5zIG9yaWdpbmFsbHkgY2FtZSBmcm9tLCBzbyB3ZSBjYW4gcmV0cmlldmUgYXJiaXRyYXJ5IHRva2VucyBhbmQgdGhlaXIgdGV4dC4KKwlbdHJlZVN0cmVhbSBzZXRUb2tlblN0cmVhbTp0b2tlblN0cmVhbV07CisJCisJLy8gQ3JlYXRlIHRoZSB0cmVlcGFyc2VyIGluc3RhbmNlLCBwYXNzaW5nIGl0IHRoZSBzdHJlYW0gb2Ygbm9kZXMKKwlTaW1wbGVDV2Fsa2VyICp3YWxrZXIgPSBbW1NpbXBsZUNXYWxrZXIgYWxsb2NdIGluaXRXaXRoU3RyZWFtOnRyZWVTdHJlYW1dOworCS8vIEFzIHdpdGggcGFyc2VycywgeW91IGNhbiBpbnZva2UgYW55IHRyZWVwYXJzZXIgcnVsZSBoZXJlLgorCVt3YWxrZXIgcHJvZ3JhbV07CisKKwkvLyBXaGV3LCBkb25lLiBSZWxlYXNlIGV2ZXJ5dGhpbmcgdGhhdCB3ZSBhcmUgcmVzcG9uc2libGUgZm9yLgorCVtsZXhlciByZWxlYXNlXTsKKwlbc3RyZWFtIHJlbGVhc2VdOworCVt0b2tlblN0cmVhbSByZWxlYXNlXTsKKwlbcGFyc2VyIHJlbGVhc2VdOworCVt0cmVlU3RyZWFtIHJlbGVhc2VdOworCVt3YWxrZXIgcmVsZWFzZV07CisKKwlbcG9vbCByZWxlYXNlXTsKKworICAgIC8vIHVzZSB0aGlzIGZvciBPYmplY3RBbGxvYyBvbiBUaWdlcgorICAgIC8vd2hpbGUoMSkgc2xlZXAoNSk7CisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDE3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQKQEAgLTAsMCArMSBAQAordHJlZT0oVkFSX0RFRiBjaGFyIGMpIChWQVJfREVGIGludCB4KSAoRlVOQ19ERUNMIChGVU5DX0hEUiB2b2lkIGJhciAoQVJHX0RFRiBpbnQgeCkpKSAoRlVOQ19ERUYgKEZVTkNfSERSIGludCBmb28gKEFSR19ERUYgaW50IHkpIChBUkdfREVGIGNoYXIgZCkpIChCTE9DSyAoVkFSX0RFRiBpbnQgaSkgKGZvciAoPSBpIDApICg8IGkgMykgKD0gaSAoKyBpIDEpKSAoQkxPQ0sgKD0geCAzKSAoPSB5IDUpKSkpKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDLnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQy50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwNmRiOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQy50b2tlbnMKQEAgLTAsMCArMSwyOSBAQAorS19JRD0xMAorVF9fMjY9MjYKK1RfXzI1PTI1CitUX18yND0yNAorVF9fMjM9MjMKK0tfRVFFUT0xNgorVF9fMjI9MjIKK0tfSU5UPTExCitUX18yMT0yMQorS19GT1I9MTQKK0ZVTkNfSERSPTYKK0ZVTkNfREVGPTgKK0tfSU5UX1RZUEU9MTkKK0ZVTkNfREVDTD03CitBUkdfREVGPTUKK1dTPTIwCitLX0VRPTE1CitCTE9DSz05CitLX0xUPTE3CitLX0NIQVI9MTIKK0tfVk9JRD0xMworVkFSX0RFRj00CitLX1BMVVM9MTgKKyc7Jz0yMQorJ30nPTI2CisnKCc9MjIKKycsJz0yMworJyknPTI0Cisneyc9MjUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ0xleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzJhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNMZXhlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vICRBTlRMUiAzLjIgQXVnIDIzLCAyMDEwIDA3OjQ4OjA2IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nIDIwMTAtMDgtMjMgMDc6NTQ6NDcKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgImFudGxyMy5oIgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIFN0YXJ0IGN5Y2xpY0RGQUludGVyZmFjZSAqLworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW50ZXJmYWNlIHN0YXJ0IERGQTQKK0BpbnRlcmZhY2UgREZBNCA6IEFOVExSREZBIHsKK30KKysgbmV3REZBNFdpdGhSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopdGhlUmVjb2duaXplcjsKKy0gaW5pdFdpdGhSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopcmVjb2duaXplcjsKK0BlbmQgLyogZW5kIG9mIERGQTQgaW50ZXJmYWNlICAqLworCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2UgZW5kIERGQTQKKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgS19JRCAxMAorI2RlZmluZSBUX18yNiAyNgorI2RlZmluZSBUX18yNSAyNQorI2RlZmluZSBUX18yNCAyNAorI2RlZmluZSBUX18yMyAyMworI2RlZmluZSBLX0VRRVEgMTYKKyNkZWZpbmUgVF9fMjIgMjIKKyNkZWZpbmUgS19JTlQgMTEKKyNkZWZpbmUgVF9fMjEgMjEKKyNkZWZpbmUgS19GT1IgMTQKKyNkZWZpbmUgRlVOQ19IRFIgNgorI2RlZmluZSBGVU5DX0RFRiA4CisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBLX0lOVF9UWVBFIDE5CisjZGVmaW5lIEZVTkNfREVDTCA3CisjZGVmaW5lIEFSR19ERUYgNQorI2RlZmluZSBXUyAyMAorI2RlZmluZSBLX0VRIDE1CisjZGVmaW5lIEJMT0NLIDkKKyNkZWZpbmUgS19MVCAxNworI2RlZmluZSBLX0NIQVIgMTIKKyNkZWZpbmUgS19WT0lEIDEzCisjZGVmaW5lIFZBUl9ERUYgNAorI2RlZmluZSBLX1BMVVMgMTgKK0BpbnRlcmZhY2UgU2ltcGxlQ0xleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCitERkE0ICpkZmE0OworLy8gc3RhcnQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzCisvLyBzdGFydCBvZiBhY3Rpb24tYWN0aW9uU2NvcGUtbWVtVmFycworfQorKyAoU2ltcGxlQ0xleGVyICopbmV3U2ltcGxlQ0xleGVyOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQ7CisKKy0gKHZvaWQpbVRfXzIxOyAKKy0gKHZvaWQpbVRfXzIyOyAKKy0gKHZvaWQpbVRfXzIzOyAKKy0gKHZvaWQpbVRfXzI0OyAKKy0gKHZvaWQpbVRfXzI1OyAKKy0gKHZvaWQpbVRfXzI2OyAKKy0gKHZvaWQpbUtfRk9SOyAKKy0gKHZvaWQpbUtfSU5UX1RZUEU7IAorLSAodm9pZCltS19DSEFSOyAKKy0gKHZvaWQpbUtfVk9JRDsgCistICh2b2lkKW1LX0lEOyAKKy0gKHZvaWQpbUtfSU5UOyAKKy0gKHZvaWQpbUtfRVE7IAorLSAodm9pZCltS19FUUVROyAKKy0gKHZvaWQpbUtfTFQ7IAorLSAodm9pZCltS19QTFVTOyAKKy0gKHZvaWQpbVdTOyAKKy0gKHZvaWQpbVRva2VuczsgCisKK0BlbmQgLyogZW5kIG9mIFNpbXBsZUNMZXhlciBpbnRlcmZhY2UgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ0xleGVyLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNMZXhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTc2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNMZXhlci5qYXZhCkBAIC0wLDAgKzEsNzMwIEBACisvLyAkQU5UTFIgMy4yIEF1ZyAxMywgMjAxMCAxOTo0MToyNSAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZyAyMDEwLTA4LTEzIDE5OjQyOjE4CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgU2ltcGxlQ0xleGVyIGV4dGVuZHMgTGV4ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExUPTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVI9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfSERSPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVGPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RZUEU9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVDTD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSR19ERUY9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUz0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSz05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVM9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9JRD0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUT0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJfREVGPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFFUT0xNzsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworICAgIHB1YmxpYyBTaW1wbGVDTGV4ZXIoKSB7O30gCisgICAgcHVibGljIFNpbXBsZUNMZXhlcihDaGFyU3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBTaW1wbGVDTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN1cGVyKGlucHV0LHN0YXRlKTsKKworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZyI7IH0KKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzo3OiAoICc7JyApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3Ojk6ICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo4Ojc6ICggJygnICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjg6OTogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk6NzogKCAnLCcgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTo5OiAnLCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA6NzogKCAnKScgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA6OTogJyknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjExOjc6ICggJ3snICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjExOjk6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMjo3OiAoICd9JyApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMjo5OiAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiRk9SIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1GT1IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gRk9SOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTE6NTogKCAnZm9yJyApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5MTo3OiAnZm9yJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJGT1IiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIklOVF9UWVBFIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1JTlRfVFlQRSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBJTlRfVFlQRTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjkyOjEwOiAoICdpbnQnICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjkyOjEyOiAnaW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImludCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJJTlRfVFlQRSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiQ0hBUiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtQ0hBUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBDSEFSOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTM6NTogKCAnY2hhcicgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTM6NzogJ2NoYXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2hhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJDSEFSIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJWT0lEIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1WT0lEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFZPSUQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5NDo1OiAoICd2b2lkJyApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5NDo3OiAndm9pZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2b2lkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlZPSUQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIklEIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1JRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBJRDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk2OjU6ICggKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk2Ojk6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5NjozMzogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIGxvb3AxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExXzA+PScwJyAmJiBMQTFfMDw9JzknKXx8KExBMV8wPj0nQScgJiYgTEExXzA8PSdaJyl8fExBMV8wPT0nXyd8fChMQTFfMD49J2EnICYmIExBMV8wPD0neicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiSUQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIklOVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtSU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IElOVDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIENvbW1vblRva2VuIGludD1udWxsOworICAgICAgICAgICAgTGlzdCBsaXN0X2ludD1udWxsOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTk6NTogKCAoaW50Kz0gKCAnMCcgLi4gJzknICkgKSsgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTk6NzogKGludCs9ICggJzAnIC4uICc5JyApICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5OToxMDogKGludCs9ICggJzAnIC4uICc5JyApICkrCisgICAgICAgICAgICBpbnQgY250Mj0wOworICAgICAgICAgICAgbG9vcDI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTJfMD49JzAnICYmIExBMl8wPD0nOScpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTk6MTA6IGludCs9ICggJzAnIC4uICc5JyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTk6MTI6ICggJzAnIC4uICc5JyApCisgICAgICAgICAgICAJICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk5OjEzOiAnMCcgLi4gJzknCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbWF0Y2hSYW5nZSgnMCcsJzknKTsgCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDIgPj0gMSApIGJyZWFrIGxvb3AyOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBOU0xvZyhAIiVAIiwgbGlzdF9pbnQpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJJTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIkVRIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1FUSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBFUTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwMjo2OiAoICc9JyApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDI6ODogJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiRVEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIkVRRVEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbUVRRVEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gRVFFUTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwMzo2OiAoICc9PScgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTAzOjg6ICc9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJFUUVRIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJMVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtTFQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gTFQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDQ6NjogKCAnPCcgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA0Ojg6ICc8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzwnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIkxUIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJQTFVTIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1QTFVTKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFBMVVM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDU6NjogKCAnKycgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA1Ojg6ICcrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJysnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlBMVVMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIldTIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1XUygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBXUzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwNzo1OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwNzo5OiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA3Ojk6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICBpbnQgY250Mz0wOworICAgICAgICAgICAgbG9vcDM6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTNfMD49J1x0JyAmJiBMQTNfMDw9J1xuJyl8fExBM18wPT0nXHInfHxMQTNfMD09JyAnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdCcgJiYgaW5wdXQuTEEoMSk8PSdcbicpfHxpbnB1dC5MQSgxKT09J1xyJ3x8aW5wdXQuTEEoMSk9PScgJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MyA+PSAxICkgYnJlYWsgbG9vcDM7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDMsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MysrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICBfY2hhbm5lbD05OTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIldTIgorCisgICAgcHVibGljIHZvaWQgbVRva2VucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6ODogKCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBGT1IgfCBJTlRfVFlQRSB8IENIQVIgfCBWT0lEIHwgSUQgfCBJTlQgfCBFUSB8IEVRRVEgfCBMVCB8IFBMVVMgfCBXUyApCisgICAgICAgIGludCBhbHQ0PTE3OworICAgICAgICBhbHQ0ID0gZGZhNC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MTA6IFRfXzIxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MToxNjogVF9fMjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjIyOiBUX18yMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6Mjg6IFRfXzI0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTozNDogVF9fMjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2IDoKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjQwOiBUX18yNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6NDY6IEZPUgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtRk9SKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjUwOiBJTlRfVFlQRQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtSU5UX1RZUEUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkgOgorICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6NTk6IENIQVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUNIQVIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwIDoKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjY0OiBWT0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1WT0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMSA6CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTo2OTogSUQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUlEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMiA6CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTo3MjogSU5UCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1JTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzIDoKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjc2OiBFUQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtRVEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0IDoKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjc5OiBFUUVRCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1FUUVRKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNSA6CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTo4NDogTFQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbUxUKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNiA6CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTo4NzogUExVUworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUExVUygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTcgOgorICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6OTI6IFdTCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1XUygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBERkE0IGRmYTQgPSBuZXcgREZBNCh0aGlzKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTRfZW90UyA9CisgICAgICAgICJcN1x1ZmZmZlw0XDEzXDJcdWZmZmZcMVwyNlwzXHVmZmZmXDRcMTNcMlx1ZmZmZlwxXDMzXDFcMzRcMlwxM1wyIisKKyAgICAgICAgIlx1ZmZmZlwxXDM3XDFcNDBcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE0X2VvZlMgPQorICAgICAgICAiXDQxXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTRfbWluUyA9CisgICAgICAgICJcMVwxMVw2XHVmZmZmXDFcMTU3XDFcMTU2XDFcMTUwXDFcMTU3XDJcdWZmZmZcMVw3NVwzXHVmZmZmXDFcMTYyIisKKyAgICAgICAgIlwxXDE2NFwxXDE0MVwxXDE1MVwyXHVmZmZmXDJcNjBcMVwxNjJcMVwxNDRcMlx1ZmZmZlwyXDYwXDJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBNF9tYXhTID0KKyAgICAgICAgIlwxXDE3NVw2XHVmZmZmXDFcMTU3XDFcMTU2XDFcMTUwXDFcMTU3XDJcdWZmZmZcMVw3NVwzXHVmZmZmXDFcMTYyIisKKyAgICAgICAgIlwxXDE2NFwxXDE0MVwxXDE1MVwyXHVmZmZmXDJcMTcyXDFcMTYyXDFcMTQ0XDJcdWZmZmZcMlwxNzJcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE0X2FjY2VwdFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwxXDFcMlwxXDNcMVw0XDFcNVwxXDZcNFx1ZmZmZlwxXDEzXDFcMTRcMVx1ZmZmZlwxXDE3IisKKyAgICAgICAgIlwxXDIwXDFcMjFcNFx1ZmZmZlwxXDE2XDFcMTVcNFx1ZmZmZlwxXDdcMVwxMFwyXHVmZmZmXDFcMTFcMVwxMiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkE0X3NwZWNpYWxTID0KKyAgICAgICAgIlw0MVx1ZmZmZn0+IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gREZBNF90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMlwyMFwyXHVmZmZmXDFcMjBcMjJcdWZmZmZcMVwyMFw3XHVmZmZmXDFcMlwxXDRcMVx1ZmZmZlwxXDE3IisKKyAgICAgICAgICAgICJcMVwzXDNcdWZmZmZcMTJcMTRcMVx1ZmZmZlwxXDFcMVwxNlwxXDE1XDNcdWZmZmZcMzJcMTNcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTNcMVx1ZmZmZlwyXDEzXDFcMTFcMlwxM1wxXDdcMlwxM1wxXDEwXDE0XDEzXDFcMTJcNFwxM1wxIisKKyAgICAgICAgICAgICJcNVwxXHVmZmZmXDFcNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMjEiLAorICAgICAgICAgICAgIlwxXDIyIiwKKyAgICAgICAgICAgICJcMVwyMyIsCisgICAgICAgICAgICAiXDFcMjQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwyNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMjciLAorICAgICAgICAgICAgIlwxXDMwIiwKKyAgICAgICAgICAgICJcMVwzMSIsCisgICAgICAgICAgICAiXDFcMzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMTJcMTNcN1x1ZmZmZlwzMlwxM1w0XHVmZmZmXDFcMTNcMVx1ZmZmZlwzMlwxMyIsCisgICAgICAgICAgICAiXDEyXDEzXDdcdWZmZmZcMzJcMTNcNFx1ZmZmZlwxXDEzXDFcdWZmZmZcMzJcMTMiLAorICAgICAgICAgICAgIlwxXDM1IiwKKyAgICAgICAgICAgICJcMVwzNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxMlwxM1w3XHVmZmZmXDMyXDEzXDRcdWZmZmZcMVwxM1wxXHVmZmZmXDMyXDEzIiwKKyAgICAgICAgICAgICJcMTJcMTNcN1x1ZmZmZlwzMlwxM1w0XHVmZmZmXDFcMTNcMVx1ZmZmZlwzMlwxMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTRfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBNF9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE0X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTRfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkE0X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTRfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkE0X21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTRfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBNF9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE0X2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTRfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTRfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBNF90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTRfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkE0X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTRfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTRfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBNCBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTQoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA0OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkE0X2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBNF9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTRfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkE0X21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBNF9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkE0X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkE0X3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMToxOiBUb2tlbnMgOiAoIFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IEZPUiB8IElOVF9UWVBFIHwgQ0hBUiB8IFZPSUQgfCBJRCB8IElOVCB8IEVRIHwgRVFFUSB8IExUIHwgUExVUyB8IFdTICk7IjsKKyAgICAgICAgfQorICAgIH0KKyAKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ0xleGVyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNMZXhlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDRjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNMZXhlci5tCkBAIC0wLDAgKzEsOTg1IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAzLjIgQXVnIDIzLCAyMDEwIDA3OjQ4OjA2CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDEwLTA4LTIzIDA3OjU0OjQ3CisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IFNpbXBsZUNMZXhlckxleGVyICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4gCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gJEFOVExSIDMuMiBBdWcgMjMsIDIwMTAgMDc6NDg6MDYgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmcgMjAxMC0wOC0yMyAwNzo1NDo0NworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiU2ltcGxlQ0xleGVyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gc3RhcnQgREZBNAorQGltcGxlbWVudGF0aW9uIERGQTQKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF9lb3RbMzNdID0KKyAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsMTEsMTEsMTEsMTEsLTEsLTEsMjIsLTEsLTEsLTEsMTEsMTEsMTEsMTEsLTEsLTEsCisgICAgIDI3LDI4LDExLDExLC0xLC0xLDMxLDMyLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF9lb2ZbMzNdID0KKyAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTRfbWluWzMzXSA9CisgICAgezksMCwwLDAsMCwwLDAsMTExLDExMCwxMDQsMTExLDAsMCw2MSwwLDAsMCwxMTQsMTE2LDk3LDEwNSwwLDAsNDgsNDgsCisgICAgIDExNCwxMDAsMCwwLDQ4LDQ4LDAsMH07Citjb25zdCBzdGF0aWMgdW5pY2hhciBkZmE0X21heFszM10gPQorICAgIHsxMjUsMCwwLDAsMCwwLDAsMTExLDExMCwxMDQsMTExLDAsMCw2MSwwLDAsMCwxMTQsMTE2LDk3LDEwNSwwLDAsMTIyLAorICAgICAxMjIsMTE0LDEwMCwwLDAsMTIyLDEyMiwwLDB9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X2FjY2VwdFszM10gPQorICAgIHstMSwxLDIsMyw0LDUsNiwtMSwtMSwtMSwtMSwxMSwxMiwtMSwxNSwxNiwxNywtMSwtMSwtMSwtMSwxNCwxMywtMSwtMSwKKyAgICAgLTEsLTEsNyw4LC0xLC0xLDksMTB9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3NwZWNpYWxbMzNdID0KKyAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uW10gPSB7fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uMFtdID0gezI0fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uMVtdID0gezI2fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uMltdID0gezI5fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uM1tdID0gezIwfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uNFtdID0gezI1fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uNVtdID0gezE2LCAxNiwgLTEsIC0xLCAxNiwgLTEsIC0xLCAKKyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTYsIC0xLCAKKyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCAtMSwgMTUsIDMsIC0xLCAtMSwgLTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgCisgMTIsIDEyLCAxMiwgMTIsIDEyLCAtMSwgMSwgMTQsIDEzLCAtMSwgLTEsIC0xLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAKKyAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAKKyAxMSwgMTEsIC0xLCAtMSwgLTEsIC0xLCAxMSwgLTEsIDExLCAxMSwgOSwgMTEsIDExLCA3LCAxMSwgMTEsIDgsIDExLCAxMSwgCisgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMSwgMTEsIDExLCAxMSwgNSwgLTEsIDZ9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb242W10gPSB7MjF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb243W10gPSB7MTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIAorIDExLCAxMSwgMTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIAorIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIAorIC0xLCAtMSwgLTEsIC0xLCAxMSwgLTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIAorIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTRfdHJhbnNpdGlvbjhbXSA9IHsxOH07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTRfdHJhbnNpdGlvbjlbXSA9IHsxOX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTRfdHJhbnNpdGlvbjEwW10gPSB7MjN9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE0X3RyYW5zaXRpb24xMVtdID0gezE3fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhNF90cmFuc2l0aW9uMTJbXSA9IHszMH07CisKKworKyAoKSBuZXdERkE0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilhUmVjb2duaXplcgoreworICAgIHJldHVybiBbW1tERkE0IGFsbG9jXSBpbml0V2l0aFJlY29nbml6ZXI6YVJlY29nbml6ZXJdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKikgdGhlUmVjb2duaXplcgoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFJlY29nbml6ZXI6dGhlUmVjb2duaXplcl0pICE9IG5pbCkgeworICAgICAgICBkZWNpc2lvbk51bWJlciA9IDQ7CisgICAgICAgIGVvdCA9IGRmYTRfZW90OworICAgICAgICBlb2YgPSBkZmE0X2VvZjsKKyAgICAgICAgbWluID0gZGZhNF9taW47CisgICAgICAgIG1heCA9IGRmYTRfbWF4OworICAgICAgICBhY2NlcHQgPSBkZmE0X2FjY2VwdDsKKyAgICAgICAgc3BlY2lhbCA9IGRmYTRfc3BlY2lhbDsKKyAgICAgICAgaWYgKCEodHJhbnNpdGlvbiA9IGNhbGxvYygzMywgc2l6ZW9mKHZvaWQqKSkpKSB7CisgICAgICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gMzM7CisgICAgICAgIHRyYW5zaXRpb25bMF0gPSBkZmE0X3RyYW5zaXRpb241OworICAgICAgICB0cmFuc2l0aW9uWzFdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzJdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzNdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzRdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzVdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzZdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzddID0gZGZhNF90cmFuc2l0aW9uMTE7CisgICAgICAgIHRyYW5zaXRpb25bOF0gPSBkZmE0X3RyYW5zaXRpb244OworICAgICAgICB0cmFuc2l0aW9uWzldID0gZGZhNF90cmFuc2l0aW9uOTsKKyAgICAgICAgdHJhbnNpdGlvblsxMF0gPSBkZmE0X3RyYW5zaXRpb24zOworICAgICAgICB0cmFuc2l0aW9uWzExXSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblsxMl0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMTNdID0gZGZhNF90cmFuc2l0aW9uNjsKKyAgICAgICAgdHJhbnNpdGlvblsxNF0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMTVdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzE2XSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblsxN10gPSBkZmE0X3RyYW5zaXRpb24xMDsKKyAgICAgICAgdHJhbnNpdGlvblsxOF0gPSBkZmE0X3RyYW5zaXRpb24wOworICAgICAgICB0cmFuc2l0aW9uWzE5XSA9IGRmYTRfdHJhbnNpdGlvbjQ7CisgICAgICAgIHRyYW5zaXRpb25bMjBdID0gZGZhNF90cmFuc2l0aW9uMTsKKyAgICAgICAgdHJhbnNpdGlvblsyMV0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMjJdID0gZGZhNF90cmFuc2l0aW9uOworICAgICAgICB0cmFuc2l0aW9uWzIzXSA9IGRmYTRfdHJhbnNpdGlvbjc7CisgICAgICAgIHRyYW5zaXRpb25bMjRdID0gZGZhNF90cmFuc2l0aW9uNzsKKyAgICAgICAgdHJhbnNpdGlvblsyNV0gPSBkZmE0X3RyYW5zaXRpb24yOworICAgICAgICB0cmFuc2l0aW9uWzI2XSA9IGRmYTRfdHJhbnNpdGlvbjEyOworICAgICAgICB0cmFuc2l0aW9uWzI3XSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblsyOF0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMjldID0gZGZhNF90cmFuc2l0aW9uNzsKKyAgICAgICAgdHJhbnNpdGlvblszMF0gPSBkZmE0X3RyYW5zaXRpb243OworICAgICAgICB0cmFuc2l0aW9uWzMxXSA9IGRmYTRfdHJhbnNpdGlvbjsKKyAgICAgICAgdHJhbnNpdGlvblszMl0gPSBkZmE0X3RyYW5zaXRpb247CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgZnJlZSh0cmFuc2l0aW9uKTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIEAiMToxOiBUb2tlbnMgOiAoIFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IEtfRk9SIHwgS19JTlRfVFlQRSB8IEtfQ0hBUiB8IEtfVk9JRCB8IEtfSUQgfCBLX0lOVCB8IEtfRVEgfCBLX0VRRVEgfCBLX0xUIHwgS19QTFVTIHwgV1MgKTsiOworfQorCisKK0BlbmQgLyogZW5kIERGQTQgaW1wbGVtZW50YXRpb24gKi8KKworI3ByYWdtYSBtYXJrIEN5Y2xpYyBERkEgaW1wbGVtZW50YXRpb24gZW5kIERGQTQKKworCisKKy8qKiBBcyBwZXIgVGVyZW5jZTogTm8gcmV0dXJucyBmb3IgbGV4ZXIgcnVsZXMhCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIGVuZAorKi8KK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDTGV4ZXIgLy8gbGluZSAzMzAKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIi91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nIl07Cit9CisKKysgKE5TU3RyaW5nICopIHRva2VuTmFtZUZvclR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OmFUb2tlblR5cGVdOworfQorCisrIChTaW1wbGVDTGV4ZXIgKiluZXdTaW1wbGVDTGV4ZXI6KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHJldHVybiBbW1NpbXBsZUNMZXhlciBhbGxvY10gaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXRdOworfQorCistIChpZCkgaW5pdFdpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MTgrMV1dKSAhPSBuaWwpIHsKKworICAgICAgICBkZmE0ID0gW0RGQTQgbmV3REZBNFdpdGhSZWNvZ25pemVyOnNlbGZdOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtkZmE0IHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogU3RhcnQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCisvKiBzdGFydCBtZXRob2RzKCkgKi8KKworLyogU3RhcnQgb2YgUnVsZXMgKi8KKy8vICRBTlRMUiBzdGFydCAiVF9fMjEiCistICh2b2lkKSBtVF9fMjEKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMjE7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzo3OiAoICc7JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3Ojk6ICc7JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JzsnXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fMjEiCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMjIiCistICh2b2lkKSBtVF9fMjIKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMjI7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODo3OiAoICcoJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo4Ojk6ICcoJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JygnXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fMjIiCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMjMiCistICh2b2lkKSBtVF9fMjMKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMjM7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTo3OiAoICcsJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5Ojk6ICcsJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JywnXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fMjMiCisKKy8vICRBTlRMUiBzdGFydCAiVF9fMjQiCistICh2b2lkKSBtVF9fMjQKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gVF9fMjQ7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA6NzogKCAnKScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA6OTogJyknIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonKSddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJUX18yNCIKKworLy8gJEFOVExSIHN0YXJ0ICJUX18yNSIKKy0gKHZvaWQpIG1UX18yNQoreworICAgIC8vCisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18yNTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMTo3OiAoICd7JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMTo5OiAneycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOid7J107IAorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIlRfXzI1IgorCisvLyAkQU5UTFIgc3RhcnQgIlRfXzI2IgorLSAodm9pZCkgbVRfXzI2Cit7CisgICAgLy8KKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFRfXzI2OworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEyOjc6ICggJ30nICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEyOjk6ICd9JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6J30nXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiVF9fMjYiCisKKy8vICRBTlRMUiBzdGFydCAiS19GT1IiCistICh2b2lkKSBtS19GT1IKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19GT1I7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTE6NzogKCAnZm9yJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5MTo5OiAnZm9yJyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaFN0cmluZzpAImZvciJdOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJLX0ZPUiIKKworLy8gJEFOVExSIHN0YXJ0ICJLX0lOVF9UWVBFIgorLSAodm9pZCkgbUtfSU5UX1RZUEUKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19JTlRfVFlQRTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5MjoxMjogKCAnaW50JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5MjoxNDogJ2ludCcgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJpbnQiXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiS19JTlRfVFlQRSIKKworLy8gJEFOVExSIHN0YXJ0ICJLX0NIQVIiCistICh2b2lkKSBtS19DSEFSCit7CisgICAgLy8KKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfQ0hBUjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5Mzo3OiAoICdjaGFyJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5Mzo5OiAnY2hhcicgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJjaGFyIl07IAorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIktfQ0hBUiIKKworLy8gJEFOVExSIHN0YXJ0ICJLX1ZPSUQiCistICh2b2lkKSBtS19WT0lECit7CisgICAgLy8KKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfVk9JRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5NDo3OiAoICd2b2lkJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5NDo5OiAndm9pZCcgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hTdHJpbmc6QCJ2b2lkIl07IAorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIktfVk9JRCIKKworLy8gJEFOVExSIHN0YXJ0ICJLX0lEIgorLSAodm9pZCkgbUtfSUQKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19JRDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5Njo3OiAoICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyApKiApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5NjoxMTogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nICkqIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnQScpICYmIChbaW5wdXQgTEE6MV0gPD0gJ1onKSl8fFtpbnB1dCBMQToxXSA9PSAnXyd8fCgoW2lucHV0IExBOjFdID49ICdhJykgJiYgKFtpbnB1dCBMQToxXSA8PSAneicpKSkgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7fQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MT0yOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBMV8wPj0nMCcgJiYgTEExXzA8PSc5Jyl8fChMQTFfMD49J0EnICYmIExBMV8wPD0nWicpfHxMQTFfMD09J18nfHwoTEExXzA+PSdhJyAmJiBMQTFfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnMCcpICYmIChbaW5wdXQgTEE6MV0gPD0gJzknKSl8fCgoW2lucHV0IExBOjFdID49ICdBJykgJiYgKFtpbnB1dCBMQToxXSA8PSAnWicpKXx8W2lucHV0IExBOjFdID09ICdfJ3x8KChbaW5wdXQgTEE6MV0gPj0gJ2EnKSAmJiAoW2lucHV0IExBOjFdIDw9ICd6JykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTt9CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiS19JRCIKKworLy8gJEFOVExSIHN0YXJ0ICJLX0lOVCIKKy0gKHZvaWQpIG1LX0lOVAoreworICAgIC8vCisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBLX0lOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICBpZDxBTlRMUlRva2VuPiAqaW50PW5pbDsKKyAgICAgICAgTlNNdXRhYmxlQXJyYXkgKmxpc3RfaW50PW5pbDsgCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk5Ojc6ICggKGludCs9ICggJzAnIC4uICc5JyApICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk5Ojk6IChpbnQrPSAoICcwJyAuLiAnOScgKSApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5OToxMjogKGludCs9ICggJzAnIC4uICc5JyApICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQyPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQyPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6OTk6MTI6IGludCs9ICggJzAnIC4uICc5JyApIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjk5OjE0OiAoICcwJyAuLiAnOScgKSAvLyBibG9ja1NpbmdsZUFsdAorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo5OToxNTogJzAnIC4uICc5JyAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaFJhbmdlRnJvbUNoYXI6JzAnIHRvOic5J107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MiA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPSBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFN0cmVhbTppbnB1dCBkZWNpc2lvbk51bWJlcjoyXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgTlNMb2coQCIlQCIsIGxpc3RfaW50KTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW2xpc3RfaW50IHJlbGVhc2VdOworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiS19JTlQiCisKKy8vICRBTlRMUiBzdGFydCAiS19FUSIKKy0gKHZvaWQpIG1LX0VRCit7CisgICAgLy8KKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfRVE7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTAyOjg6ICggJz0nICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwMjoxMDogJz0nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonPSddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJLX0VRIgorCisvLyAkQU5UTFIgc3RhcnQgIktfRVFFUSIKKy0gKHZvaWQpIG1LX0VRRVEKK3sKKyAgICAvLworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gS19FUUVROworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwMzo4OiAoICc9PScgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTAzOjEwOiAnPT0nIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiPT0iXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiS19FUUVRIgorCisvLyAkQU5UTFIgc3RhcnQgIktfTFQiCistICh2b2lkKSBtS19MVAoreworICAgIC8vCisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBLX0xUOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjEwNDo4OiAoICc8JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDQ6MTA6ICc8JyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaENoYXI6JzwnXTsgCisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiS19MVCIKKworLy8gJEFOVExSIHN0YXJ0ICJLX1BMVVMiCistICh2b2lkKSBtS19QTFVTCit7CisgICAgLy8KKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IEtfUExVUzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDU6ODogKCAnKycgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA1OjEwOiAnKycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOicrJ107IAorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIktfUExVUyIKKworLy8gJEFOVExSIHN0YXJ0ICJXUyIKKy0gKHZvaWQpIG1XUworeworICAgIC8vCisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBXUzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDc6NTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxMDc6OTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTA3Ojk6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQzPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQzPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEEzXzA+PSdcdCcgJiYgTEEzXzA8PSdcbicpfHxMQTNfMD09J1xyJ3x8TEEzXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnXHQnKSAmJiAoW2lucHV0IExBOjFdIDw9ICdcbicpKXx8W2lucHV0IExBOjFdID09ICdccid8fFtpbnB1dCBMQToxXSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTZXQ6bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlO30KKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQzID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9IFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU3RyZWFtOmlucHV0IGRlY2lzaW9uTnVtYmVyOjNdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MysrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMzogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgc3RhdGUuY2hhbm5lbD05OTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgW3N0YXRlIHNldFR5cGU6X3R5cGVdOworCisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgIH0KKyAgICByZXR1cm47Cit9CisvLyAkQU5UTFIgZW5kICJXUyIKKworLSAodm9pZCkgbVRva2VucworeworICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6ODogKCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBLX0ZPUiB8IEtfSU5UX1RZUEUgfCBLX0NIQVIgfCBLX1ZPSUQgfCBLX0lEIHwgS19JTlQgfCBLX0VRIHwgS19FUUVRIHwgS19MVCB8IEtfUExVUyB8IFdTICkgLy9ydWxlYmxvY2sKKyAgICBOU0ludGVnZXIgYWx0ND0xNzsKKyAgICBhbHQ0ID0gW2RmYTQgcHJlZGljdDppbnB1dF07CisgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MTA6IFRfXzIxIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18yMV07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MTY6IFRfXzIyIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18yMl07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMyA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MjI6IFRfXzIzIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18yM107IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6Mjg6IFRfXzI0IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18yNF07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MzQ6IFRfXzI1IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18yNV07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6NDA6IFRfXzI2IC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1UX18yNl07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNyA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6NDY6IEtfRk9SIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1LX0ZPUl07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOCA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6NTI6IEtfSU5UX1RZUEUgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUtfSU5UX1RZUEVdOyAKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDkgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjYzOiBLX0NIQVIgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUtfQ0hBUl07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTAgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjcwOiBLX1ZPSUQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUtfVk9JRF07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTEgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjc3OiBLX0lEIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1LX0lEXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6ODI6IEtfSU5UIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1LX0lOVF07IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTMgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjg4OiBLX0VRIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1LX0VRXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNCA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6OTM6IEtfRVFFUSAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtS19FUUVRXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNSA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MTAwOiBLX0xUIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1LX0xUXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNiA6IDsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE6MTA1OiBLX1BMVVMgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbUtfUExVU107IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTcgOiA7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxOjExMjogV1MgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbVdTXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworfQorCitAZW5kIC8qIGVuZCBvZiBTaW1wbGVDTGV4ZXIgaW1wbGVtZW50YXRpb24gbGluZSAzOTcgKi8KKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1BhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0ZjE4MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1BhcnNlci5oCkBAIC0wLDAgKzEsMzAwIEBACisvLyAkQU5UTFIgMy4yIEF1ZyAyMywgMjAxMCAwNzo0ODowNiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZyAyMDEwLTA4LTIzIDA3OjU0OjQ2CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0ICJhbnRscjMuaCIKKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2Ugc3RhcnQgREZBMgorQGludGVyZmFjZSBERkEyIDogQU5UTFJERkEgeworfQorKyBuZXdERkEyV2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKil0aGVSZWNvZ25pemVyOworLSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilyZWNvZ25pemVyOworQGVuZCAvKiBlbmQgb2YgREZBMiBpbnRlcmZhY2UgICovCisKKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGludGVyZmFjZSBlbmQgREZBMgorI3ByYWdtYSBtYXJrIFRva2VucworI2RlZmluZSBLX0lEIDEwCisjZGVmaW5lIFRfXzI2IDI2CisjZGVmaW5lIFRfXzI1IDI1CisjZGVmaW5lIFRfXzI0IDI0CisjZGVmaW5lIFRfXzIzIDIzCisjZGVmaW5lIEtfRVFFUSAxNgorI2RlZmluZSBUX18yMiAyMgorI2RlZmluZSBLX0lOVCAxMQorI2RlZmluZSBUX18yMSAyMQorI2RlZmluZSBLX0ZPUiAxNAorI2RlZmluZSBGVU5DX0hEUiA2CisjZGVmaW5lIEZVTkNfREVGIDgKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIEtfSU5UX1RZUEUgMTkKKyNkZWZpbmUgRlVOQ19ERUNMIDcKKyNkZWZpbmUgQVJHX0RFRiA1CisjZGVmaW5lIFdTIDIwCisjZGVmaW5lIEtfRVEgMTUKKyNkZWZpbmUgQkxPQ0sgOQorI2RlZmluZSBLX0xUIDE3CisjZGVmaW5lIEtfQ0hBUiAxMgorI2RlZmluZSBLX1ZPSUQgMTMKKyNkZWZpbmUgVkFSX0RFRiA0CisjZGVmaW5lIEtfUExVUyAxOAorI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8vIHN0YXJ0IG9mIG1lbVZhcnMoKQorfQorCisvLyBzdGFydCBwcm9wZXJ0aWVzCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm47CisvLyB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzZGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvLyBtZXRob2RzRGVjbAorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2RlY2xhcmF0aW9uX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuOworLy8gdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc2RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLy8gbWV0aG9kc0RlY2wKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8vIHN0YXJ0IG9mIG1lbVZhcnMoKQorfQorCisvLyBzdGFydCBwcm9wZXJ0aWVzCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybjsKKy8vIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNkZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8vIG1ldGhvZHNEZWNsCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8vIHN0YXJ0IG9mIG1lbVZhcnMoKQorfQorCisvLyBzdGFydCBwcm9wZXJ0aWVzCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm47CisvLyB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzZGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvLyBtZXRob2RzRGVjbAorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuOworLy8gdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc2RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLy8gbWV0aG9kc0RlY2wKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLy8gbGluZSAxNjcyCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvLyBzdGFydCBvZiBtZW1WYXJzKCkKK30KKworLy8gc3RhcnQgcHJvcGVydGllcworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybjsKKy8vIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNkZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8vIG1ldGhvZHNEZWNsCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8vIHN0YXJ0IG9mIG1lbVZhcnMoKQorfQorCisvLyBzdGFydCBwcm9wZXJ0aWVzCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm47CisvLyB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzZGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvLyBtZXRob2RzRGVjbAorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuOworLy8gdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc2RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLy8gbWV0aG9kc0RlY2wKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybjsKKy8vIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNkZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8vIG1ldGhvZHNEZWNsCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8vIHN0YXJ0IG9mIG1lbVZhcnMoKQorfQorCisvLyBzdGFydCBwcm9wZXJ0aWVzCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoU2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm47CisvLyB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzZGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvLyBtZXRob2RzRGVjbAorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLy8gbGluZSAxNjcyCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvLyBzdGFydCBvZiBtZW1WYXJzKCkKK30KKworLy8gc3RhcnQgcHJvcGVydGllcworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuOworLy8gdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc2RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLy8gbWV0aG9kc0RlY2wKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9leHByX3JldHVybjsKKy8vIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNkZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8vIG1ldGhvZHNEZWNsCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlcl9jb25kRXhwcl9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLy8gbGluZSAxNjcyCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvLyBzdGFydCBvZiBtZW1WYXJzKCkKK30KKworLy8gc3RhcnQgcHJvcGVydGllcworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9jb25kRXhwcl9yZXR1cm47CisvLyB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMKKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzZGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvLyBtZXRob2RzRGVjbAorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCitAaW50ZXJmYWNlIFNpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuOworLy8gdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc2RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLy8gbWV0aG9kc0RlY2wKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworQGludGVyZmFjZSBTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybjsKKy8vIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNkZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8vIG1ldGhvZHNEZWNsCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKK0BpbnRlcmZhY2UgU2ltcGxlQ1BhcnNlciA6IEFOVExSUGFyc2VyIHsgLy8gbGluZSA1MjkKKy8vIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyCisKKworLy8gc3RhcnQgb2YgYWN0aW9uLWFjdGlvblNjb3BlLW1lbVZhcnMKKy8vIHN0YXJ0IG9mIHJ1bGVBdHRyaWJ1dGVTY29wZU1lbVZhcgorCisKKy8vIFN0YXJ0IG9mIG1lbVZhcnMKKy8qIEFTVCBwYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMgKi8KKy8qIEFTVCBwYXJzZXJtZW1WYXJzICovCitpZDxBTlRMUlRyZWVBZGFwdG9yPiB0cmVlQWRhcHRvcjsKKworREZBMiAqZGZhMjsKKyB9CisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZXRob2RzRGVjbAorCisvKiBBU1QgcGFyc2VySGVhZGVyRmlsZS5tZXRob2RzZGVjbCAqLworLyogQVNUIHBhcnNlck1ldGhvZHNEZWNsICovCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pdGhlVHJlZUFkYXB0b3I7CisKKy0gKFNpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gKilwcm9ncmFtOyAKKy0gKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuICopZGVjbGFyYXRpb247IAorLSAoU2ltcGxlQ1BhcnNlcl92YXJpYWJsZV9yZXR1cm4gKil2YXJpYWJsZTsgCistIChTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuICopZGVjbGFyYXRvcjsgCistIChTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybiAqKWZ1bmN0aW9uSGVhZGVyOyAKKy0gKFNpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiAqKWZvcm1hbFBhcmFtZXRlcjsgCistIChTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICopdHlwZTsgCistIChTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiAqKWJsb2NrOyAKKy0gKFNpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm4gKilzdGF0OyAKKy0gKFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKilmb3JTdGF0OyAKKy0gKFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKilhc3NpZ25TdGF0OyAKKy0gKFNpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4gKilleHByOyAKKy0gKFNpbXBsZUNQYXJzZXJfY29uZEV4cHJfcmV0dXJuICopY29uZEV4cHI7IAorLSAoU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKilhZXhwcjsgCistIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopYXRvbTsgCisKKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1BhcnNlciBpbnRlcmZhY2UgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1BhcnNlci5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYWIzZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTgxNCBAQAorLy8gJEFOVExSIDMuMiBBdWcgMTMsIDIwMTAgMTk6NDE6MjUgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmcgMjAxMC0wOC0xMyAxOTo0MjoxOAorCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlQ1BhcnNlciBleHRlbmRzIFBhcnNlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJWQVJfREVGIiwgIkFSR19ERUYiLCAiRlVOQ19IRFIiLCAiRlVOQ19ERUNMIiwgIkZVTkNfREVGIiwgIkJMT0NLIiwgIklEIiwgIkVRIiwgIklOVCIsICJGT1IiLCAiSU5UX1RZUEUiLCAiQ0hBUiIsICJWT0lEIiwgIkVRRVEiLCAiTFQiLCAiUExVUyIsICJXUyIsICInOyciLCAiJygnIiwgIicsJyIsICInKSciLCAiJ3snIiwgIid9JyIKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExUPTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVI9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfSERSPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVGPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RZUEU9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVDTD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSR19ERUY9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUz0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSz05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVM9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9JRD0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUT0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJfREVGPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFFUT0xNzsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworCisgICAgICAgIHB1YmxpYyBTaW1wbGVDUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTaW1wbGVDUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0LCBzdGF0ZSk7CisgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgcHJvdGVjdGVkIFRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKworICAgIHB1YmxpYyB2b2lkIHNldFRyZWVBZGFwdG9yKFRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKyAgICAgICAgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKKyAgICB9CisgICAgcHVibGljIFRyZWVBZGFwdG9yIGdldFRyZWVBZGFwdG9yKCkgeworICAgICAgICByZXR1cm4gYWRhcHRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VG9rZW5OYW1lcygpIHsgcmV0dXJuIFNpbXBsZUNQYXJzZXIudG9rZW5OYW1lczsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nIjsgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIHByb2dyYW1fcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgT2JqZWN0IHRyZWU7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJlZSgpIHsgcmV0dXJuIHRyZWU7IH0KKyAgICB9OworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJwcm9ncmFtIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE2OjE6IHByb2dyYW0gOiAoIGRlY2xhcmF0aW9uICkrIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5wcm9ncmFtX3JldHVybiBwcm9ncmFtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5wcm9ncmFtX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5wcm9ncmFtX3JldHVybigpOworICAgICAgICByZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworICAgICAgICBPYmplY3Qgcm9vdF8wID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmRlY2xhcmF0aW9uX3JldHVybiBkZWNsYXJhdGlvbjEgPSBudWxsOworCisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTc6NTogKCAoIGRlY2xhcmF0aW9uICkrICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE3Ojk6ICggZGVjbGFyYXRpb24gKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTc6OTogKCBkZWNsYXJhdGlvbiApKworICAgICAgICAgICAgaW50IGNudDE9MDsKKyAgICAgICAgICAgIGxvb3AxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMD09SUR8fChMQTFfMD49SU5UX1RZUEUgJiYgTEExXzA8PVZPSUQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTc6OTogZGVjbGFyYXRpb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdGlvbl9pbl9wcm9ncmFtODUpOworICAgICAgICAgICAgCSAgICBkZWNsYXJhdGlvbjE9ZGVjbGFyYXRpb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIAkgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIGRlY2xhcmF0aW9uMS5nZXRUcmVlKCkpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQxID49IDEgKSBicmVhayBsb29wMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQxKys7CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInByb2dyYW0iCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGRlY2xhcmF0aW9uX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZGVjbGFyYXRpb24iCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjA6MTogZGVjbGFyYXRpb24gOiAoIHZhcmlhYmxlIHwgZnVuY3Rpb25IZWFkZXIgJzsnIC0+IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgZnVuY3Rpb25IZWFkZXIgYmxvY2sgLT4gXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmRlY2xhcmF0aW9uX3JldHVybiBkZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRpb25fcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmRlY2xhcmF0aW9uX3JldHVybigpOworICAgICAgICByZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworICAgICAgICBPYmplY3Qgcm9vdF8wID0gbnVsbDsKKworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWw0PW51bGw7CisgICAgICAgIFNpbXBsZUNQYXJzZXIudmFyaWFibGVfcmV0dXJuIHZhcmlhYmxlMiA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mdW5jdGlvbkhlYWRlcl9yZXR1cm4gZnVuY3Rpb25IZWFkZXIzID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmZ1bmN0aW9uSGVhZGVyX3JldHVybiBmdW5jdGlvbkhlYWRlcjUgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuYmxvY2tfcmV0dXJuIGJsb2NrNiA9IG51bGw7CisKKworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsNF90cmVlPW51bGw7CisgICAgICAgIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gc3RyZWFtXzIxPW5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDIxIik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fZnVuY3Rpb25IZWFkZXI9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGZ1bmN0aW9uSGVhZGVyIik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fYmxvY2s9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGJsb2NrIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyMTo1OiAoIHZhcmlhYmxlIHwgZnVuY3Rpb25IZWFkZXIgJzsnIC0+IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgZnVuY3Rpb25IZWFkZXIgYmxvY2sgLT4gXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApCisgICAgICAgICAgICBpbnQgYWx0Mj0zOworICAgICAgICAgICAgYWx0MiA9IGRmYTIucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyMTo5OiB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjEwNSk7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlMj12YXJpYWJsZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgdmFyaWFibGUyLmdldFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyMjo5OiBmdW5jdGlvbkhlYWRlciAnOycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjExNSk7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSGVhZGVyMz1mdW5jdGlvbkhlYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fZnVuY3Rpb25IZWFkZXIuYWRkKGZ1bmN0aW9uSGVhZGVyMy5nZXRUcmVlKCkpOworICAgICAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWw0PShUb2tlbiltYXRjaChpbnB1dCwyMSxGT0xMT1dfMjFfaW5fZGVjbGFyYXRpb24xMTcpOyAgCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV8yMS5hZGQoY2hhcl9saXRlcmFsNCk7CisKKworCisgICAgICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBmdW5jdGlvbkhlYWRlcgorICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgICAgICAvLyAyMjoyODogLT4gXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjI6MzE6IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3QoKE9iamVjdClhZGFwdG9yLmNyZWF0ZShGVU5DX0RFQ0wsICJGVU5DX0RFQ0wiKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9mdW5jdGlvbkhlYWRlci5uZXh0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjIzOjk6IGZ1bmN0aW9uSGVhZGVyIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMzUpOworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkhlYWRlcjU9ZnVuY3Rpb25IZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2Z1bmN0aW9uSGVhZGVyLmFkZChmdW5jdGlvbkhlYWRlcjUuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzcpOworICAgICAgICAgICAgICAgICAgICBibG9jazY9YmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2Jsb2NrLmFkZChibG9jazYuZ2V0VHJlZSgpKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBmdW5jdGlvbkhlYWRlciwgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMjM6MzA6IC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjM6MzM6IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdCgoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKEZVTkNfREVGLCAiRlVOQ19ERUYiKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9mdW5jdGlvbkhlYWRlci5uZXh0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fYmxvY2submV4dFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCByb290XzEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZGVjbGFyYXRpb24iCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIHZhcmlhYmxlX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAidmFyaWFibGUiCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjY6MTogdmFyaWFibGUgOiB0eXBlIGRlY2xhcmF0b3IgJzsnIC0+IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLnZhcmlhYmxlX3JldHVybiB2YXJpYWJsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNQYXJzZXIudmFyaWFibGVfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLnZhcmlhYmxlX3JldHVybigpOworICAgICAgICByZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworICAgICAgICBPYmplY3Qgcm9vdF8wID0gbnVsbDsKKworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWw5PW51bGw7CisgICAgICAgIFNpbXBsZUNQYXJzZXIudHlwZV9yZXR1cm4gdHlwZTcgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4gZGVjbGFyYXRvcjggPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDlfdHJlZT1udWxsOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMT1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMSIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2RlY2xhcmF0b3I9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGRlY2xhcmF0b3IiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV90eXBlPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSB0eXBlIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyNzo1OiAoIHR5cGUgZGVjbGFyYXRvciAnOycgLT4gXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyNzo5OiB0eXBlIGRlY2xhcmF0b3IgJzsnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2KTsKKyAgICAgICAgICAgIHR5cGU3PXR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fdHlwZS5hZGQodHlwZTcuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxNjgpOworICAgICAgICAgICAgZGVjbGFyYXRvcjg9ZGVjbGFyYXRvcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHN0cmVhbV9kZWNsYXJhdG9yLmFkZChkZWNsYXJhdG9yOC5nZXRUcmVlKCkpOworICAgICAgICAgICAgY2hhcl9saXRlcmFsOT0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX3ZhcmlhYmxlMTcwKTsgIAorICAgICAgICAgICAgc3RyZWFtXzIxLmFkZChjaGFyX2xpdGVyYWw5KTsKKworCisKKyAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAvLyBlbGVtZW50czogdHlwZSwgZGVjbGFyYXRvcgorICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9yZXR2YWw9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIHJldHZhbCIscmV0dmFsIT1udWxsP3JldHZhbC50cmVlOm51bGwpOworCisgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAvLyAyNzoyOTogLT4gXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjI3OjMyOiBeKCBWQVJfREVGIHR5cGUgZGVjbGFyYXRvciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9iamVjdCByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3QoKE9iamVjdClhZGFwdG9yLmNyZWF0ZShWQVJfREVGLCAiVkFSX0RFRiIpLCByb290XzEpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV90eXBlLm5leHRUcmVlKCkpOworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fZGVjbGFyYXRvci5uZXh0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCByb290XzEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAidmFyaWFibGUiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGRlY2xhcmF0b3JfcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgT2JqZWN0IHRyZWU7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJlZSgpIHsgcmV0dXJuIHRyZWU7IH0KKyAgICB9OworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJkZWNsYXJhdG9yIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjMwOjE6IGRlY2xhcmF0b3IgOiBJRCA7CisgICAgcHVibGljIGZpbmFsIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4gZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4gcmV0dmFsID0gbmV3IFNpbXBsZUNQYXJzZXIuZGVjbGFyYXRvcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gSUQxMD1udWxsOworCisgICAgICAgIE9iamVjdCBJRDEwX3RyZWU9bnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MzE6NTogKCBJRCApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozMTo5OiBJRAorICAgICAgICAgICAgeworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICBJRDEwPShUb2tlbiltYXRjaChpbnB1dCxJRCxGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjE5OSk7IAorICAgICAgICAgICAgSUQxMF90cmVlID0gKE9iamVjdClhZGFwdG9yLmNyZWF0ZShJRDEwKTsKKyAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBJRDEwX3RyZWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZGVjbGFyYXRvciIKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZnVuY3Rpb25IZWFkZXJfcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgT2JqZWN0IHRyZWU7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJlZSgpIHsgcmV0dXJuIHRyZWU7IH0KKyAgICB9OworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJmdW5jdGlvbkhlYWRlciIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNDoxOiBmdW5jdGlvbkhlYWRlciA6IHR5cGUgSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScgLT4gXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5mdW5jdGlvbkhlYWRlcl9yZXR1cm4gZnVuY3Rpb25IZWFkZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmZ1bmN0aW9uSGVhZGVyX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5mdW5jdGlvbkhlYWRlcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gSUQxMj1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWwxMz1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWwxNT1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWwxNz1udWxsOworICAgICAgICBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuIHR5cGUxMSA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuIGZvcm1hbFBhcmFtZXRlcjE0ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmZvcm1hbFBhcmFtZXRlcl9yZXR1cm4gZm9ybWFsUGFyYW1ldGVyMTYgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IElEMTJfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMTNfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMTVfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMTdfdHJlZT1udWxsOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV9JRD1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiBJRCIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMj1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMiIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMz1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMyIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yND1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyNCIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2Zvcm1hbFBhcmFtZXRlcj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgZm9ybWFsUGFyYW1ldGVyIik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fdHlwZT1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgdHlwZSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MzU6NTogKCB0eXBlIElEICcoJyAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gJyknIC0+IF4oIEZVTkNfSERSIHR5cGUgSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNTo5OiB0eXBlIElEICcoJyAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gJyknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMjE5KTsKKyAgICAgICAgICAgIHR5cGUxMT10eXBlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgc3RyZWFtX3R5cGUuYWRkKHR5cGUxMS5nZXRUcmVlKCkpOworICAgICAgICAgICAgSUQxMj0oVG9rZW4pbWF0Y2goaW5wdXQsSUQsRk9MTE9XX0lEX2luX2Z1bmN0aW9uSGVhZGVyMjIxKTsgIAorICAgICAgICAgICAgc3RyZWFtX0lELmFkZChJRDEyKTsKKworICAgICAgICAgICAgY2hhcl9saXRlcmFsMTM9KFRva2VuKW1hdGNoKGlucHV0LDIyLEZPTExPV18yMl9pbl9mdW5jdGlvbkhlYWRlcjIyMyk7ICAKKyAgICAgICAgICAgIHN0cmVhbV8yMi5hZGQoY2hhcl9saXRlcmFsMTMpOworCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNToyMTogKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT1JRHx8KExBNF8wPj1JTlRfVFlQRSAmJiBMQTRfMDw9Vk9JRCkpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjM1OjIzOiBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3KTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyMTQ9Zm9ybWFsUGFyYW1ldGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9mb3JtYWxQYXJhbWV0ZXIuYWRkKGZvcm1hbFBhcmFtZXRlcjE0LmdldFRyZWUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjM1OjM5OiAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDM6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PTIzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjM1OjQxOiAnLCcgZm9ybWFsUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGNoYXJfbGl0ZXJhbDE1PShUb2tlbiltYXRjaChpbnB1dCwyMyxGT0xMT1dfMjNfaW5fZnVuY3Rpb25IZWFkZXIyMzEpOyAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RyZWFtXzIzLmFkZChjaGFyX2xpdGVyYWwxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzMpOworICAgICAgICAgICAgICAgICAgICAJICAgIGZvcm1hbFBhcmFtZXRlcjE2PWZvcm1hbFBhcmFtZXRlcigpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RyZWFtX2Zvcm1hbFBhcmFtZXRlci5hZGQoZm9ybWFsUGFyYW1ldGVyMTYuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGFyX2xpdGVyYWwxNz0oVG9rZW4pbWF0Y2goaW5wdXQsMjQsRk9MTE9XXzI0X2luX2Z1bmN0aW9uSGVhZGVyMjQxKTsgIAorICAgICAgICAgICAgc3RyZWFtXzI0LmFkZChjaGFyX2xpdGVyYWwxNyk7CisKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IGZvcm1hbFBhcmFtZXRlciwgSUQsIHR5cGUKKyAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgLy8gMzY6OTogLT4gXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MzY6MTI6IF4oIEZVTkNfSERSIHR5cGUgSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KChPYmplY3QpYWRhcHRvci5jcmVhdGUoRlVOQ19IRFIsICJGVU5DX0hEUiIpLCByb290XzEpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV90eXBlLm5leHRUcmVlKCkpOworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fSUQubmV4dE5vZGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKCAhKHN0cmVhbV9mb3JtYWxQYXJhbWV0ZXIuaGFzTmV4dCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKCBzdHJlYW1fZm9ybWFsUGFyYW1ldGVyLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9mb3JtYWxQYXJhbWV0ZXIubmV4dFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtX2Zvcm1hbFBhcmFtZXRlci5yZXNldCgpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJmdW5jdGlvbkhlYWRlciIKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZm9ybWFsUGFyYW1ldGVyX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZm9ybWFsUGFyYW1ldGVyIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjM5OjE6IGZvcm1hbFBhcmFtZXRlciA6IHR5cGUgZGVjbGFyYXRvciAtPiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuIGZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuZm9ybWFsUGFyYW1ldGVyX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIudHlwZV9yZXR1cm4gdHlwZTE4ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmRlY2xhcmF0b3JfcmV0dXJuIGRlY2xhcmF0b3IxOSA9IG51bGw7CisKKworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2RlY2xhcmF0b3I9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGRlY2xhcmF0b3IiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV90eXBlPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSB0eXBlIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo0MDo1OiAoIHR5cGUgZGVjbGFyYXRvciAtPiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjQwOjk6IHR5cGUgZGVjbGFyYXRvcgorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIyODEpOworICAgICAgICAgICAgdHlwZTE4PXR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fdHlwZS5hZGQodHlwZTE4LmdldFRyZWUoKSk7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjI4Myk7CisgICAgICAgICAgICBkZWNsYXJhdG9yMTk9ZGVjbGFyYXRvcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHN0cmVhbV9kZWNsYXJhdG9yLmFkZChkZWNsYXJhdG9yMTkuZ2V0VHJlZSgpKTsKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IGRlY2xhcmF0b3IsIHR5cGUKKyAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgLy8gNDA6MjU6IC0+IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo0MDoyODogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KChPYmplY3QpYWRhcHRvci5jcmVhdGUoQVJHX0RFRiwgIkFSR19ERUYiKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fdHlwZS5uZXh0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2RlY2xhcmF0b3IubmV4dFRyZWUoKSk7CisKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImZvcm1hbFBhcmFtZXRlciIKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgdHlwZV9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInR5cGUiCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NDM6MTogdHlwZSA6ICggJ2ludCcgfCAnY2hhcicgfCAndm9pZCcgfCBJRCApOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuIHR5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLnR5cGVfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIHNldDIwPW51bGw7CisKKyAgICAgICAgT2JqZWN0IHNldDIwX3RyZWU9bnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NDQ6NTogKCAnaW50JyB8ICdjaGFyJyB8ICd2b2lkJyB8IElEICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICBzZXQyMD0oVG9rZW4paW5wdXQuTFQoMSk7CisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT1JRHx8KGlucHV0LkxBKDEpPj1JTlRfVFlQRSAmJiBpbnB1dC5MQSgxKTw9Vk9JRCkgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCAoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKHNldDIwKSk7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3JSZWNvdmVyeT1mYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbXNlOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAidHlwZSIKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgYmxvY2tfcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgT2JqZWN0IHRyZWU7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJlZSgpIHsgcmV0dXJuIHRyZWU7IH0KKyAgICB9OworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJibG9jayIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1MDoxOiBibG9jayA6IGxjPSAneycgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogJ30nIC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5ibG9ja19yZXR1cm4gYmxvY2soKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmJsb2NrX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5ibG9ja19yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gbGM9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMjM9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci52YXJpYWJsZV9yZXR1cm4gdmFyaWFibGUyMSA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5zdGF0X3JldHVybiBzdGF0MjIgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IGxjX3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDIzX3RyZWU9bnVsbDsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjU9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjUiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjY9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjYiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV92YXJpYWJsZT1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgdmFyaWFibGUiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9zdGF0PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBzdGF0Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1MTo1OiAobGM9ICd7JyAoIHZhcmlhYmxlICkqICggc3RhdCApKiAnfScgLT4gXiggQkxPQ0tbJGxjLEBcIkJMT0NLXCJdICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTE6OTogbGM9ICd7JyAoIHZhcmlhYmxlICkqICggc3RhdCApKiAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGxjPShUb2tlbiltYXRjaChpbnB1dCwyNSxGT0xMT1dfMjVfaW5fYmxvY2szNzYpOyAgCisgICAgICAgICAgICBzdHJlYW1fMjUuYWRkKGxjKTsKKworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTI6MTM6ICggdmFyaWFibGUgKSoKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTVfMD09SUQpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTVfMj09SUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTVfMD49SU5UX1RZUEUgJiYgTEE1XzA8PVZPSUQpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTI6MTM6IHZhcmlhYmxlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2szOTApOworICAgICAgICAgICAgCSAgICB2YXJpYWJsZTIxPXZhcmlhYmxlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAJICAgIHN0cmVhbV92YXJpYWJsZS5hZGQodmFyaWFibGUyMS5nZXRUcmVlKCkpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjUzOjEzOiAoIHN0YXQgKSoKKyAgICAgICAgICAgIGxvb3A2OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ2PTI7CisgICAgICAgICAgICAgICAgaW50IExBNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTZfMD09SUR8fChMQTZfMD49SU5UICYmIExBNl8wPD1GT1IpfHwoTEE2XzA+PTIxICYmIExBNl8wPD0yMil8fExBNl8wPT0yNSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjUzOjEzOiBzdGF0CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfc3RhdF9pbl9ibG9jazQwNSk7CisgICAgICAgICAgICAJICAgIHN0YXQyMj1zdGF0KCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAJICAgIHN0cmVhbV9zdGF0LmFkZChzdGF0MjIuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBjaGFyX2xpdGVyYWwyMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzI2X2luX2Jsb2NrNDE2KTsgIAorICAgICAgICAgICAgc3RyZWFtXzI2LmFkZChjaGFyX2xpdGVyYWwyMyk7CisKKworCisgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgLy8gZWxlbWVudHM6IHZhcmlhYmxlLCBzdGF0CisgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsYWJlbHM6IHJldHZhbAorICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgIC8vIDU1Ojk6IC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTU6MTI6IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9iamVjdCByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3QoKE9iamVjdClhZGFwdG9yLmNyZWF0ZShCTE9DSywgbGMsIEAiQkxPQ0siKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU1OjM0OiAoIHZhcmlhYmxlICkqCisgICAgICAgICAgICAgICAgd2hpbGUgKCBzdHJlYW1fdmFyaWFibGUuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX3ZhcmlhYmxlLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmVhbV92YXJpYWJsZS5yZXNldCgpOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU1OjQ0OiAoIHN0YXQgKSoKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHN0cmVhbV9zdGF0Lmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9zdGF0Lm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmVhbV9zdGF0LnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImJsb2NrIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBzdGF0X3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAic3RhdCIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1ODoxOiBzdGF0IDogKCBmb3JTdGF0IHwgZXhwciAnOycgfCBibG9jayB8IGFzc2lnblN0YXQgJzsnIHwgJzsnICk7CisgICAgcHVibGljIGZpbmFsIFNpbXBsZUNQYXJzZXIuc3RhdF9yZXR1cm4gc3RhdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuc3RhdF9yZXR1cm4gcmV0dmFsID0gbmV3IFNpbXBsZUNQYXJzZXIuc3RhdF9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMjY9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMjk9bnVsbDsKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsMzA9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mb3JTdGF0X3JldHVybiBmb3JTdGF0MjQgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuZXhwcl9yZXR1cm4gZXhwcjI1ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmJsb2NrX3JldHVybiBibG9jazI3ID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuIGFzc2lnblN0YXQyOCA9IG51bGw7CisKKworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMjZfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMjlfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMzBfdHJlZT1udWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1ODo1OiAoIGZvclN0YXQgfCBleHByICc7JyB8IGJsb2NrIHwgYXNzaWduU3RhdCAnOycgfCAnOycgKQorICAgICAgICAgICAgaW50IGFsdDc9NTsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBGT1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEE3XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBN18yPT1FUSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE3XzI+PUVRRVEgJiYgTEE3XzI8PVBMVVMpfHxMQTdfMj09MjEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ3PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNywgMiwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1ODo3OiBmb3JTdGF0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDQ0OSk7CisgICAgICAgICAgICAgICAgICAgIGZvclN0YXQyND1mb3JTdGF0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBmb3JTdGF0MjQuZ2V0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU5Ojc6IGV4cHIgJzsnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fc3RhdDQ1Nyk7CisgICAgICAgICAgICAgICAgICAgIGV4cHIyNT1leHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBleHByMjUuZ2V0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsMjY9KFRva2VuKW1hdGNoKGlucHV0LDIxLEZPTExPV18yMV9pbl9zdGF0NDU5KTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo2MDo3OiBibG9jaworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ibG9ja19pbl9zdGF0NDY4KTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2syNz1ibG9jaygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgYmxvY2syNy5nZXRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NjE6NzogYXNzaWduU3RhdCAnOycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYXNzaWduU3RhdF9pbl9zdGF0NDc2KTsKKyAgICAgICAgICAgICAgICAgICAgYXNzaWduU3RhdDI4PWFzc2lnblN0YXQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIGFzc2lnblN0YXQyOC5nZXRUcmVlKCkpOworICAgICAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWwyOT0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX3N0YXQ0NzgpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjYyOjc6ICc7JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWwzMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX3N0YXQ0ODcpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJzdGF0IgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBmb3JTdGF0X3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZm9yU3RhdCIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo2NToxOiBmb3JTdGF0IDogJ2ZvcicgJygnIHN0YXJ0PSBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBuZXh0PSBhc3NpZ25TdGF0ICcpJyBibG9jayAtPiBeKCAnZm9yJyAkc3RhcnQgZXhwciAkbmV4dCBibG9jayApIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5mb3JTdGF0X3JldHVybiBmb3JTdGF0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5mb3JTdGF0X3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5mb3JTdGF0X3JldHVybigpOworICAgICAgICByZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworICAgICAgICBPYmplY3Qgcm9vdF8wID0gbnVsbDsKKworICAgICAgICBUb2tlbiBzdHJpbmdfbGl0ZXJhbDMxPW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDMyPW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDMzPW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDM1PW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDM2PW51bGw7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuYXNzaWduU3RhdF9yZXR1cm4gc3RhcnQgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuYXNzaWduU3RhdF9yZXR1cm4gbmV4dCA9IG51bGw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5leHByX3JldHVybiBleHByMzQgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuYmxvY2tfcmV0dXJuIGJsb2NrMzcgPSBudWxsOworCisKKyAgICAgICAgT2JqZWN0IHN0cmluZ19saXRlcmFsMzFfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMzJfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMzNfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMzVfdHJlZT1udWxsOworICAgICAgICBPYmplY3QgY2hhcl9saXRlcmFsMzZfdHJlZT1udWxsOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV8yMT1uZXcgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShhZGFwdG9yLCJ0b2tlbiAyMSIpOworICAgICAgICBSZXdyaXRlUnVsZVRva2VuU3RyZWFtIHN0cmVhbV9GT1I9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gRk9SIik7CisgICAgICAgIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gc3RyZWFtXzIyPW5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDIyIik7CisgICAgICAgIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gc3RyZWFtXzI0PW5ldyBSZXdyaXRlUnVsZVRva2VuU3RyZWFtKGFkYXB0b3IsInRva2VuIDI0Iik7CisgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fYXNzaWduU3RhdD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgYXNzaWduU3RhdCIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2Jsb2NrPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBibG9jayIpOworICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX2V4cHI9bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIGV4cHIiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjY2OjU6ICggJ2ZvcicgJygnIHN0YXJ0PSBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBuZXh0PSBhc3NpZ25TdGF0ICcpJyBibG9jayAtPiBeKCAnZm9yJyAkc3RhcnQgZXhwciAkbmV4dCBibG9jayApICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjY2Ojk6ICdmb3InICcoJyBzdGFydD0gYXNzaWduU3RhdCAnOycgZXhwciAnOycgbmV4dD0gYXNzaWduU3RhdCAnKScgYmxvY2sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ19saXRlcmFsMzE9KFRva2VuKW1hdGNoKGlucHV0LEZPUixGT0xMT1dfRk9SX2luX2ZvclN0YXQ1MDcpOyAgCisgICAgICAgICAgICBzdHJlYW1fRk9SLmFkZChzdHJpbmdfbGl0ZXJhbDMxKTsKKworICAgICAgICAgICAgY2hhcl9saXRlcmFsMzI9KFRva2VuKW1hdGNoKGlucHV0LDIyLEZPTExPV18yMl9pbl9mb3JTdGF0NTA5KTsgIAorICAgICAgICAgICAgc3RyZWFtXzIyLmFkZChjaGFyX2xpdGVyYWwzMik7CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxMyk7CisgICAgICAgICAgICBzdGFydD1hc3NpZ25TdGF0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgc3RyZWFtX2Fzc2lnblN0YXQuYWRkKHN0YXJ0LmdldFRyZWUoKSk7CisgICAgICAgICAgICBjaGFyX2xpdGVyYWwzMz0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX2ZvclN0YXQ1MTUpOyAgCisgICAgICAgICAgICBzdHJlYW1fMjEuYWRkKGNoYXJfbGl0ZXJhbDMzKTsKKworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NTE3KTsKKyAgICAgICAgICAgIGV4cHIzND1leHByKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgc3RyZWFtX2V4cHIuYWRkKGV4cHIzNC5nZXRUcmVlKCkpOworICAgICAgICAgICAgY2hhcl9saXRlcmFsMzU9KFRva2VuKW1hdGNoKGlucHV0LDIxLEZPTExPV18yMV9pbl9mb3JTdGF0NTE5KTsgIAorICAgICAgICAgICAgc3RyZWFtXzIxLmFkZChjaGFyX2xpdGVyYWwzNSk7CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUyMyk7CisgICAgICAgICAgICBuZXh0PWFzc2lnblN0YXQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fYXNzaWduU3RhdC5hZGQobmV4dC5nZXRUcmVlKCkpOworICAgICAgICAgICAgY2hhcl9saXRlcmFsMzY9KFRva2VuKW1hdGNoKGlucHV0LDI0LEZPTExPV18yNF9pbl9mb3JTdGF0NTI1KTsgIAorICAgICAgICAgICAgc3RyZWFtXzI0LmFkZChjaGFyX2xpdGVyYWwzNik7CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjcpOworICAgICAgICAgICAgYmxvY2szNz1ibG9jaygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHN0cmVhbV9ibG9jay5hZGQoYmxvY2szNy5nZXRUcmVlKCkpOworCisKKyAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAvLyBlbGVtZW50czogYmxvY2ssIGV4cHIsIEZPUiwgc3RhcnQsIG5leHQKKyAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsLCBzdGFydCwgbmV4dAorICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyB3aWxkY2FyZCBsYWJlbHM6IAorICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3JldHZhbD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgcmV0dmFsIixyZXR2YWwhPW51bGw/cmV0dmFsLnRyZWU6bnVsbCk7CisgICAgICAgICAgICBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtX3N0YXJ0PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBzdGFydCIsc3RhcnQhPW51bGw/c3RhcnQudHJlZTpudWxsKTsKKyAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fbmV4dD1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgbmV4dCIsbmV4dCE9bnVsbD9uZXh0LnRyZWU6bnVsbCk7CisKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgIC8vIDY3Ojk6IC0+IF4oICdmb3InICRzdGFydCBleHByICRuZXh0IGJsb2NrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo2NzoxMjogXiggJ2ZvcicgJHN0YXJ0IGV4cHIgJG5leHQgYmxvY2sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgcm9vdF8xID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5iZWNvbWVSb290KHN0cmVhbV9GT1IubmV4dE5vZGUoKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fc3RhcnQubmV4dFRyZWUoKSk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9leHByLm5leHRUcmVlKCkpOworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fbmV4dC5uZXh0VHJlZSgpKTsKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgc3RyZWFtX2Jsb2NrLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJmb3JTdGF0IgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBhc3NpZ25TdGF0X3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiYXNzaWduU3RhdCIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3MDoxOiBhc3NpZ25TdGF0IDogSUQgRVEgZXhwciAtPiBeKCBFUSBJRCBleHByICkgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuIGFzc2lnblN0YXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmFzc2lnblN0YXRfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFRva2VuIElEMzg9bnVsbDsKKyAgICAgICAgVG9rZW4gRVEzOT1udWxsOworICAgICAgICBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHI0MCA9IG51bGw7CisKKworICAgICAgICBPYmplY3QgSUQzOF90cmVlPW51bGw7CisgICAgICAgIE9iamVjdCBFUTM5X3RyZWU9bnVsbDsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fRVE9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gRVEiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fSUQ9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gSUQiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9leHByPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBleHByIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3MTo1OiAoIElEIEVRIGV4cHIgLT4gXiggRVEgSUQgZXhwciApICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjcxOjk6IElEIEVRIGV4cHIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIElEMzg9KFRva2VuKW1hdGNoKGlucHV0LElELEZPTExPV19JRF9pbl9hc3NpZ25TdGF0NTcwKTsgIAorICAgICAgICAgICAgc3RyZWFtX0lELmFkZChJRDM4KTsKKworICAgICAgICAgICAgRVEzOT0oVG9rZW4pbWF0Y2goaW5wdXQsRVEsRk9MTE9XX0VRX2luX2Fzc2lnblN0YXQ1NzIpOyAgCisgICAgICAgICAgICBzdHJlYW1fRVEuYWRkKEVRMzkpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2Fzc2lnblN0YXQ1NzQpOworICAgICAgICAgICAgZXhwcjQwPWV4cHIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBzdHJlYW1fZXhwci5hZGQoZXhwcjQwLmdldFRyZWUoKSk7CisKKworICAgICAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBFUSwgZXhwciwgSUQKKyAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKyAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworICAgICAgICAgICAgLy8gNzE6MjA6IC0+IF4oIEVRIElEIGV4cHIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjcxOjIzOiBeKCBFUSBJRCBleHByICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJvb3RfMSA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKyAgICAgICAgICAgICAgICByb290XzEgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fRVEubmV4dE5vZGUoKSwgcm9vdF8xKTsKKworICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBzdHJlYW1fSUQubmV4dE5vZGUoKSk7CisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzEsIHN0cmVhbV9leHByLm5leHRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHJvb3RfMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR2YWwuc3RvcCA9IGlucHV0LkxUKC0xKTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CisgICAgICAgICAgICBhZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyhyZXR2YWwudHJlZSwgcmV0dmFsLnN0YXJ0LCByZXR2YWwuc3RvcCk7CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgIAlyZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7CisKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJhc3NpZ25TdGF0IgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBleHByX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZXhwciIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3NDoxOiBleHByIDogY29uZEV4cHIgOworICAgIHB1YmxpYyBmaW5hbCBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuIGV4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDUGFyc2VyLmV4cHJfcmV0dXJuKCk7CisgICAgICAgIHJldHZhbC5zdGFydCA9IGlucHV0LkxUKDEpOworCisgICAgICAgIE9iamVjdCByb290XzAgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuY29uZEV4cHJfcmV0dXJuIGNvbmRFeHByNDEgPSBudWxsOworCisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NzQ6NTogKCBjb25kRXhwciApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3NDo5OiBjb25kRXhwcgorICAgICAgICAgICAgeworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19jb25kRXhwcl9pbl9leHByNTk4KTsKKyAgICAgICAgICAgIGNvbmRFeHByNDE9Y29uZEV4cHIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgY29uZEV4cHI0MS5nZXRUcmVlKCkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImV4cHIiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGNvbmRFeHByX3JldHVybiBleHRlbmRzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSB7CisgICAgICAgIE9iamVjdCB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiY29uZEV4cHIiCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzc6MTogY29uZEV4cHIgOiBhZXhwciAoICggJz09JyB8ICc8JyApIGFleHByICk/IDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5jb25kRXhwcl9yZXR1cm4gY29uZEV4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmNvbmRFeHByX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5jb25kRXhwcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gc3RyaW5nX2xpdGVyYWw0Mz1udWxsOworICAgICAgICBUb2tlbiBjaGFyX2xpdGVyYWw0ND1udWxsOworICAgICAgICBTaW1wbGVDUGFyc2VyLmFleHByX3JldHVybiBhZXhwcjQyID0gbnVsbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyLmFleHByX3JldHVybiBhZXhwcjQ1ID0gbnVsbDsKKworCisgICAgICAgIE9iamVjdCBzdHJpbmdfbGl0ZXJhbDQzX3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDQ0X3RyZWU9bnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzg6NTogKCBhZXhwciAoICggJz09JyB8ICc8JyApIGFleHByICk/ICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc4Ojk6IGFleHByICggKCAnPT0nIHwgJzwnICkgYWV4cHIgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MTcpOworICAgICAgICAgICAgYWV4cHI0Mj1hZXhwcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBhZXhwcjQyLmdldFRyZWUoKSk7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3ODoxNTogKCAoICc9PScgfCAnPCcgKSBhZXhwciApPworICAgICAgICAgICAgaW50IGFsdDk9MjsKKyAgICAgICAgICAgIGludCBMQTlfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoICgoTEE5XzA+PUVRRVEgJiYgTEE5XzA8PUxUKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzg6MTc6ICggJz09JyB8ICc8JyApIGFleHByCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzg6MTc6ICggJz09JyB8ICc8JyApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBOF8wPT1FUUVRKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBOF8wPT1MVCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDgsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzg6MTg6ICc9PScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpdGVyYWw0Mz0oVG9rZW4pbWF0Y2goaW5wdXQsRVFFUSxGT0xMT1dfRVFFUV9pbl9jb25kRXhwcjYyMik7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saXRlcmFsNDNfdHJlZSA9IChPYmplY3QpYWRhcHRvci5jcmVhdGUoc3RyaW5nX2xpdGVyYWw0Myk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3Qoc3RyaW5nX2xpdGVyYWw0M190cmVlLCByb290XzApOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc4OjI2OiAnPCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsNDQ9KFRva2VuKW1hdGNoKGlucHV0LExULEZPTExPV19MVF9pbl9jb25kRXhwcjYyNyk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDQ0X3RyZWUgPSAoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKGNoYXJfbGl0ZXJhbDQ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IuYmVjb21lUm9vdChjaGFyX2xpdGVyYWw0NF90cmVlLCByb290XzApOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxKTsKKyAgICAgICAgICAgICAgICAgICAgYWV4cHI0NT1hZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgYWV4cHI0NS5nZXRUcmVlKCkpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImNvbmRFeHByIgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBhZXhwcl9yZXR1cm4gZXh0ZW5kcyBQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeworICAgICAgICBPYmplY3QgdHJlZTsKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmVlKCkgeyByZXR1cm4gdHJlZTsgfQorICAgIH07CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImFleHByIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjgxOjE6IGFleHByIDogYXRvbSAoICcrJyBhdG9tICkqIDsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5hZXhwcl9yZXR1cm4gYWV4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTaW1wbGVDUGFyc2VyLmFleHByX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5hZXhwcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgT2JqZWN0IHJvb3RfMCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gY2hhcl9saXRlcmFsNDc9bnVsbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hdG9tX3JldHVybiBhdG9tNDYgPSBudWxsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXIuYXRvbV9yZXR1cm4gYXRvbTQ4ID0gbnVsbDsKKworCisgICAgICAgIE9iamVjdCBjaGFyX2xpdGVyYWw0N190cmVlPW51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjgyOjU6ICggYXRvbSAoICcrJyBhdG9tICkqICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjgyOjk6IGF0b20gKCAnKycgYXRvbSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLm5pbCgpOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19hdG9tX2luX2FleHByNjUzKTsKKyAgICAgICAgICAgIGF0b200Nj1hdG9tKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIGF0b200Ni5nZXRUcmVlKCkpOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODI6MTQ6ICggJysnIGF0b20gKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzA9PVBMVVMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjgyOjE2OiAnKycgYXRvbQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGNoYXJfbGl0ZXJhbDQ3PShUb2tlbiltYXRjaChpbnB1dCxQTFVTLEZPTExPV19QTFVTX2luX2FleHByNjU3KTsgCisgICAgICAgICAgICAJICAgIGNoYXJfbGl0ZXJhbDQ3X3RyZWUgPSAoT2JqZWN0KWFkYXB0b3IuY3JlYXRlKGNoYXJfbGl0ZXJhbDQ3KTsKKyAgICAgICAgICAgIAkgICAgcm9vdF8wID0gKE9iamVjdClhZGFwdG9yLmJlY29tZVJvb3QoY2hhcl9saXRlcmFsNDdfdHJlZSwgcm9vdF8wKTsKKworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19hdG9tX2luX2FleHByNjYwKTsKKyAgICAgICAgICAgIAkgICAgYXRvbTQ4PWF0b20oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIAkgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIGF0b200OC5nZXRUcmVlKCkpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworICAgICAgICAgICAgYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAJcmV0dmFsLnRyZWUgPSAoT2JqZWN0KWFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCByZXR2YWwuc3RhcnQsIGlucHV0LkxUKC0xKSwgcmUpOworCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiYWV4cHIiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGF0b21fcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgT2JqZWN0IHRyZWU7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VHJlZSgpIHsgcmV0dXJuIHRyZWU7IH0KKyAgICB9OworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJhdG9tIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjg1OjE6IGF0b20gOiAoIElEIHwgSU5UIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgKTsKKyAgICBwdWJsaWMgZmluYWwgU2ltcGxlQ1BhcnNlci5hdG9tX3JldHVybiBhdG9tKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1BhcnNlci5hdG9tX3JldHVybiByZXR2YWwgPSBuZXcgU2ltcGxlQ1BhcnNlci5hdG9tX3JldHVybigpOworICAgICAgICByZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTsKKworICAgICAgICBPYmplY3Qgcm9vdF8wID0gbnVsbDsKKworICAgICAgICBUb2tlbiBJRDQ5PW51bGw7CisgICAgICAgIFRva2VuIElOVDUwPW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDUxPW51bGw7CisgICAgICAgIFRva2VuIGNoYXJfbGl0ZXJhbDUzPW51bGw7CisgICAgICAgIFNpbXBsZUNQYXJzZXIuZXhwcl9yZXR1cm4gZXhwcjUyID0gbnVsbDsKKworCisgICAgICAgIE9iamVjdCBJRDQ5X3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IElOVDUwX3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDUxX3RyZWU9bnVsbDsKKyAgICAgICAgT2JqZWN0IGNoYXJfbGl0ZXJhbDUzX3RyZWU9bnVsbDsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjI9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjIiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBzdHJlYW1fMjQ9bmV3IFJld3JpdGVSdWxlVG9rZW5TdHJlYW0oYWRhcHRvciwidG9rZW4gMjQiKTsKKyAgICAgICAgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV9leHByPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSBleHByIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo4Njo1OiAoIElEIHwgSU5UIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgKQorICAgICAgICAgICAgaW50IGFsdDExPTM7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDExPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDExLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODY6NzogSUQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgSUQ0OT0oVG9rZW4pbWF0Y2goaW5wdXQsSUQsRk9MTE9XX0lEX2luX2F0b202ODApOyAKKyAgICAgICAgICAgICAgICAgICAgSUQ0OV90cmVlID0gKE9iamVjdClhZGFwdG9yLmNyZWF0ZShJRDQ5KTsKKyAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5hZGRDaGlsZChyb290XzAsIElENDlfdHJlZSk7CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjg3Ojc6IElOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChPYmplY3QpYWRhcHRvci5uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBJTlQ1MD0oVG9rZW4pbWF0Y2goaW5wdXQsSU5ULEZPTExPV19JTlRfaW5fYXRvbTY5NCk7IAorICAgICAgICAgICAgICAgICAgICBJTlQ1MF90cmVlID0gKE9iamVjdClhZGFwdG9yLmNyZWF0ZShJTlQ1MCk7CisgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBJTlQ1MF90cmVlKTsKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODg6NzogJygnIGV4cHIgJyknCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsNTE9KFRva2VuKW1hdGNoKGlucHV0LDIyLEZPTExPV18yMl9pbl9hdG9tNzA4KTsgIAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fMjIuYWRkKGNoYXJfbGl0ZXJhbDUxKTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2F0b203MTApOworICAgICAgICAgICAgICAgICAgICBleHByNTI9ZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fZXhwci5hZGQoZXhwcjUyLmdldFRyZWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDUzPShUb2tlbiltYXRjaChpbnB1dCwyNCxGT0xMT1dfMjRfaW5fYXRvbTcxMik7ICAKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtXzI0LmFkZChjaGFyX2xpdGVyYWw1Myk7CisKKworCisgICAgICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBleHByCisgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICAgICAgICAgIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fcmV0dmFsPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSByZXR2YWwiLHJldHZhbCE9bnVsbD9yZXR2YWwudHJlZTpudWxsKTsKKworICAgICAgICAgICAgICAgICAgICByb290XzAgPSAoT2JqZWN0KWFkYXB0b3IubmlsKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIDg4OjIwOiAtPiBleHByCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCBzdHJlYW1fZXhwci5uZXh0VHJlZSgpKTsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChPYmplY3QpYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKyAgICAgICAgICAgIGFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgCXJldHZhbC50cmVlID0gKE9iamVjdClhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgcmV0dmFsLnN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImF0b20iCisKKyAgICAvLyBEZWxlZ2F0ZWQgcnVsZXMKKworCisgICAgcHJvdGVjdGVkIERGQTIgZGZhMiA9IG5ldyBERkEyKHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMl9lb3RTID0KKyAgICAgICAgIlwxNVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyX2VvZlMgPQorICAgICAgICAiXDE1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTJfbWluUyA9CisgICAgICAgICJcMlwxMlwxXDI1XDFcMTJcMVx1ZmZmZlwxXDEyXDFcMjVcMVwyN1wyXHVmZmZmXDJcMTJcMVwyNyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyX21heFMgPQorICAgICAgICAiXDFcMjBcMVwxMlwxXDI2XDFcMzBcMVx1ZmZmZlwxXDEyXDFcMzFcMVwzMFwyXHVmZmZmXDFcMjBcMVwxMlwxIisKKyAgICAgICAgIlwzMCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyX2FjY2VwdFMgPQorICAgICAgICAiXDRcdWZmZmZcMVwxXDNcdWZmZmZcMVwzXDFcMlwzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTJfc3BlY2lhbFMgPQorICAgICAgICAiXDE1XHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkEyX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxXDFcM1x1ZmZmZlwzXDEiLAorICAgICAgICAgICAgIlwxXDIiLAorICAgICAgICAgICAgIlwxXDRcMVwzIiwKKyAgICAgICAgICAgICJcMVw1XDNcdWZmZmZcM1w1XDdcdWZmZmZcMVw2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDciLAorICAgICAgICAgICAgIlwxXDExXDNcdWZmZmZcMVwxMCIsCisgICAgICAgICAgICAiXDFcMTJcMVw2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTNcM1x1ZmZmZlwzXDEzIiwKKyAgICAgICAgICAgICJcMVwxNCIsCisgICAgICAgICAgICAiXDFcMTJcMVw2IgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTJfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMl9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMl9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyX21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMl9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTJfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMl9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTJfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMl90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkEyX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkEyKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMl9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTJfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMl9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTJfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMl9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMl90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjIwOjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyICc7JyAtPiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKTsiOworICAgICAgICB9CisgICAgfQorIAorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW04NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMUM0MDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uMTA1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9kZWNsYXJhdGlvbjExNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTM1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMjAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTE2OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAyMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIxX2luX3ZhcmlhYmxlMTcwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjE5OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIyMTkgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19JRF9pbl9mdW5jdGlvbkhlYWRlcjIyMSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyX2luX2Z1bmN0aW9uSGVhZGVyMjIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTAxQzQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTgwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjNfaW5fZnVuY3Rpb25IZWFkZXIyMzEgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDFDNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAxODAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNF9pbl9mdW5jdGlvbkhlYWRlcjI0MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjgxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19zZXRfaW5fdHlwZTAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNV9pbl9ibG9jazM3NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDY2MUY0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzkwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwNjYxRjQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfc3RhdF9pbl9ibG9jazQwNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDY2MDM0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI2X2luX2Jsb2NrNDE2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9zdGF0NDU3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDIwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjFfaW5fc3RhdDQ1OSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX3N0YXQ0NjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9zdGF0NDc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjFfaW5fc3RhdDQ4NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0ZPUl9pbl9mb3JTdGF0NTA3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDQwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjJfaW5fZm9yU3RhdDUwOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDA0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxMyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAyMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIxX2luX2ZvclN0YXQ1MTUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAxNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2ZvclN0YXQ1MTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMjAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9mb3JTdGF0NTE5ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTIzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMTAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjRfaW5fZm9yU3RhdDUyNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDIwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19JRF9pbl9hc3NpZ25TdGF0NTcwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDgwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfRVFfaW5fYXNzaWduU3RhdDU3MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDE0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fYXNzaWduU3RhdDU3NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2NvbmRFeHByX2luX2V4cHI1OTggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYxNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwNjAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0VRRVFfaW5fY29uZEV4cHI2MjIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAxNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19MVF9pbl9jb25kRXhwcjYyNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDE0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYXRvbV9pbl9hZXhwcjY1MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwODAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX1BMVVNfaW5fYWV4cHI2NTcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwNDAxNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19hdG9tX2luX2FleHByNjYwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDA4MDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfSURfaW5fYXRvbTY4MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0lOVF9pbl9hdG9tNjk0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjJfaW5fYXRvbTcwOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDA0MDE0MDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fYXRvbTcxMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDEwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI0X2luX2F0b203MTIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDUGFyc2VyLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNQYXJzZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODY2NDBhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDUGFyc2VyLm0KQEAgLTAsMCArMSwyNzYzIEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAzLjIgQXVnIDIzLCAyMDEwIDA3OjQ4OjA2CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDEwLTA4LTIzIDA3OjU0OjQ2CisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IFNpbXBsZUNQYXJzZXJQYXJzZXIgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLiAKKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCisqLworLy8gW1RoZSAiQlNEIGxpY2VuY2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDEwIEFsYW4gQ29uZGl0CisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisvLyAkQU5UTFIgMy4yIEF1ZyAyMywgMjAxMCAwNzo0ODowNiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZyAyMDEwLTA4LTIzIDA3OjU0OjQ2CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJTaW1wbGVDUGFyc2VyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbXBsZW1lbnRhdGlvbiBzdGFydCBERkEyCitAaW1wbGVtZW50YXRpb24gREZBMgorY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX2VvdFsxM10gPQorICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfZW9mWzEzXSA9CisgICAgey0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTJfbWluWzEzXSA9CisgICAgezEwLDEwLDIxLDEwLDAsMTAsMjEsMjMsMCwwLDEwLDEwLDIzfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTJfbWF4WzEzXSA9CisgICAgezEzLDEwLDIyLDI0LDAsMTAsMjUsMjQsMCwwLDEzLDEwLDI0fTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl9hY2NlcHRbMTNdID0KKyAgICB7LTEsLTEsLTEsLTEsMSwtMSwtMSwtMSwzLDIsLTEsLTEsLTF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3NwZWNpYWxbMTNdID0KKyAgICB7LTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb25bXSA9IHt9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb24wW10gPSB7OSwgLTEsIC0xLCAtMSwgOH07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjFbXSA9IHsxMCwgNn07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjJbXSA9IHs1LCA1LCA1LCA1LCAtMSwgLTEsIC0xLCAtMSwgCisgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNn07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjNbXSA9IHsxMSwgMTEsIDExLCAxMX07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjRbXSA9IHs0LCAzfTsKK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhMl90cmFuc2l0aW9uNVtdID0gezEsIDEsIDEsIDF9OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmEyX3RyYW5zaXRpb242W10gPSB7N307Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjdbXSA9IHsxMn07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTJfdHJhbnNpdGlvbjhbXSA9IHsyfTsKKworCisrICgpIG5ld0RGQTJXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKWFSZWNvZ25pemVyCit7CisgICAgcmV0dXJuIFtbW0RGQTIgYWxsb2NdIGluaXRXaXRoUmVjb2duaXplcjphUmVjb2duaXplcl0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXRXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKSB0aGVSZWNvZ25pemVyCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoUmVjb2duaXplcjp0aGVSZWNvZ25pemVyXSkgIT0gbmlsKSB7CisgICAgICAgIGRlY2lzaW9uTnVtYmVyID0gMjsKKyAgICAgICAgZW90ID0gZGZhMl9lb3Q7CisgICAgICAgIGVvZiA9IGRmYTJfZW9mOworICAgICAgICBtaW4gPSBkZmEyX21pbjsKKyAgICAgICAgbWF4ID0gZGZhMl9tYXg7CisgICAgICAgIGFjY2VwdCA9IGRmYTJfYWNjZXB0OworICAgICAgICBzcGVjaWFsID0gZGZhMl9zcGVjaWFsOworICAgICAgICBpZiAoISh0cmFuc2l0aW9uID0gY2FsbG9jKDEzLCBzaXplb2Yodm9pZCopKSkpIHsKKyAgICAgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSAxMzsKKyAgICAgICAgdHJhbnNpdGlvblswXSA9IGRmYTJfdHJhbnNpdGlvbjU7CisgICAgICAgIHRyYW5zaXRpb25bMV0gPSBkZmEyX3RyYW5zaXRpb244OworICAgICAgICB0cmFuc2l0aW9uWzJdID0gZGZhMl90cmFuc2l0aW9uNDsKKyAgICAgICAgdHJhbnNpdGlvblszXSA9IGRmYTJfdHJhbnNpdGlvbjI7CisgICAgICAgIHRyYW5zaXRpb25bNF0gPSBkZmEyX3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bNV0gPSBkZmEyX3RyYW5zaXRpb242OworICAgICAgICB0cmFuc2l0aW9uWzZdID0gZGZhMl90cmFuc2l0aW9uMDsKKyAgICAgICAgdHJhbnNpdGlvbls3XSA9IGRmYTJfdHJhbnNpdGlvbjE7CisgICAgICAgIHRyYW5zaXRpb25bOF0gPSBkZmEyX3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bOV0gPSBkZmEyX3RyYW5zaXRpb247CisgICAgICAgIHRyYW5zaXRpb25bMTBdID0gZGZhMl90cmFuc2l0aW9uMzsKKyAgICAgICAgdHJhbnNpdGlvblsxMV0gPSBkZmEyX3RyYW5zaXRpb243OworICAgICAgICB0cmFuc2l0aW9uWzEyXSA9IGRmYTJfdHJhbnNpdGlvbjE7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgZnJlZSh0cmFuc2l0aW9uKTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCit7CisgICAgcmV0dXJuIEAiMjA6MTogZGVjbGFyYXRpb24gOiAoIHZhcmlhYmxlIHwgZnVuY3Rpb25IZWFkZXIgJzsnIC0+IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgZnVuY3Rpb25IZWFkZXIgYmxvY2sgLT4gXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApOyI7Cit9CisKKworQGVuZCAvKiBlbmQgREZBMiBpbXBsZW1lbnRhdGlvbiAqLworCisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbXBsZW1lbnRhdGlvbiBlbmQgREZBMgorCisKKworI3ByYWdtYSBtYXJrIEJpdHNldHMKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW04NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW04NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwM0MwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uMTA1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb24xMDVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjExNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTE1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMjAwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMjFfaW5fZGVjbGFyYXRpb24xMTc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18yMV9pbl9kZWNsYXJhdGlvbjExN19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTM1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMzVfZGF0YVtdID0geyAweDAwMDAwMDAwMDIwMDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjEzNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTM3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTE2NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3R5cGVfaW5fdmFyaWFibGUxNjZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA0MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTY4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTE2OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDIwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzIxX2luX3ZhcmlhYmxlMTcwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjFfaW5fdmFyaWFibGUxNzBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0lEX2luX2RlY2xhcmF0b3IxOTk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0lEX2luX2RlY2xhcmF0b3IxOTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMjE5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjIxOV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIyMjE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0lEX2luX2Z1bmN0aW9uSGVhZGVyMjIxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwNDAwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMjJfaW5fZnVuY3Rpb25IZWFkZXIyMjM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18yMl9pbl9mdW5jdGlvbkhlYWRlcjIyM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMTAwM0MwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIyNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIyN19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMTgwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzIzX2luX2Z1bmN0aW9uSGVhZGVyMjMxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjNfaW5fZnVuY3Rpb25IZWFkZXIyMzFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDNDMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIyMzNfZGF0YVtdID0geyAweDAwMDAwMDAwMDE4MDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18yNF9pbl9mdW5jdGlvbkhlYWRlcjI0MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzI0X2luX2Z1bmN0aW9uSGVhZGVyMjQxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIyODE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjI4MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMjgzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zZXRfaW5fdHlwZTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19zZXRfaW5fdHlwZTBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18yNV9pbl9ibG9jazM3NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzI1X2luX2Jsb2NrMzc2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDA2NjA3QzAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2szOTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV192YXJpYWJsZV9pbl9ibG9jazM5MF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwNjYwN0MwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3N0YXRfaW5fYmxvY2s0MDU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19zdGF0X2luX2Jsb2NrNDA1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDA2NjA0QzAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMjZfaW5fYmxvY2s0MTY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18yNl9pbl9ibG9jazQxNl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDQ0OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDQ0OV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fc3RhdDQ1NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fc3RhdDQ1N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDIwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzIxX2luX3N0YXQ0NTk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18yMV9pbl9zdGF0NDU5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYmxvY2tfaW5fc3RhdDQ2ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Jsb2NrX2luX3N0YXQ0NjhfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAyMDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18yMV9pbl9zdGF0NDc4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjFfaW5fc3RhdDQ3OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzIxX2luX3N0YXQ0ODc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18yMV9pbl9zdGF0NDg3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDUwNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfRk9SX2luX2ZvclN0YXQ1MDdfZGF0YVtdID0geyAweDAwMDAwMDAwMDA0MDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18yMl9pbl9mb3JTdGF0NTA5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjJfaW5fZm9yU3RhdDUwOV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxMzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUxM19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDIwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzIxX2luX2ZvclN0YXQ1MTU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV18yMV9pbl9mb3JTdGF0NTE1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwNDAwQzAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NTE3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NTE3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMjAwMDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMjFfaW5fZm9yU3RhdDUxOTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzIxX2luX2ZvclN0YXQ1MTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDA0MDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MjM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MjNfZGF0YVtdID0geyAweDAwMDAwMDAwMDEwMDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18yNF9pbl9mb3JTdGF0NTI1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjRfaW5fZm9yU3RhdDUyNV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMjAwMDAwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1Mjc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9mb3JTdGF0NTI3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19JRF9pbl9hc3NpZ25TdGF0NTcwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19JRF9pbl9hc3NpZ25TdGF0NTcwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDA4MDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19FUV9pbl9hc3NpZ25TdGF0NTcyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19FUV9pbl9hc3NpZ25TdGF0NTcyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwNDAwQzAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9hc3NpZ25TdGF0NTc0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9hc3NpZ25TdGF0NTc0X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjU5ODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2NvbmRFeHByX2luX2V4cHI1OThfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYxNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjE3X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDMwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19FUUVRX2luX2NvbmRFeHByNjIyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19FUUVRX2luX2NvbmRFeHByNjIyX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwNDAwQzAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19MVF9pbl9jb25kRXhwcjYyNzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfTFRfaW5fY29uZEV4cHI2MjdfZGF0YVtdID0geyAweDAwMDAwMDAwMDA0MDBDMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYzMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYXRvbV9pbl9hZXhwcjY1MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2F0b21faW5fYWV4cHI2NTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX1BMVVNfaW5fYWV4cHI2NTc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX1BMVVNfaW5fYWV4cHI2NTdfZGF0YVtdID0geyAweDAwMDAwMDAwMDA0MDBDMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hdG9tX2luX2FleHByNjYwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfYXRvbV9pbl9hZXhwcjY2MF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA0MDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfSURfaW5fYXRvbTY4MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfSURfaW5fYXRvbTY4MF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfSU5UX2luX2F0b202OTQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0lOVF9pbl9hdG9tNjk0X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfMjJfaW5fYXRvbTcwODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzIyX2luX2F0b203MDhfZGF0YVtdID0geyAweDAwMDAwMDAwMDA0MDBDMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2F0b203MTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2F0b203MTBfZGF0YVtdID0geyAweDAwMDAwMDAwMDEwMDAwMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV18yNF9pbl9hdG9tNzEyOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfMjRfaW5fYXRvbTcxMl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKKworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuCisrIChTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0VHJlZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuCisrIChTaW1wbGVDUGFyc2VyX2RlY2xhcmF0aW9uX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0VHJlZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuCisrIChTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0VHJlZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4KKysgKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4KKysgKFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9mdW5jdGlvbkhlYWRlcl9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuCisrIChTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0VHJlZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4KKysgKFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4KKysgKFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybgorKyAoU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFRyZWU6bmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuCisrIChTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0VHJlZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4KKysgKFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1NpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybgorKyAoU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqKW5ld1NpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFRyZWU6bmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybgorKyAoU2ltcGxlQ1BhcnNlcl9jb25kRXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFRyZWU6bmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybgorKyAoU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFRyZWU6bmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuCisrIChTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICopbmV3U2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybgoreworICAgIHJldHVybiBbW1tTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3NlbGYgc2V0VHJlZTpuaWxdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCisKK0BpbXBsZW1lbnRhdGlvbiBTaW1wbGVDUGFyc2VyICAvLyBsaW5lIDYxMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTg1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTg1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb24xMDUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjEwNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTE1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18yMV9pbl9kZWNsYXJhdGlvbjExNyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzIxX2luX2RlY2xhcmF0aW9uMTE3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMzUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjEzNV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTM3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb24xMzdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTY2ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTE2Nl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxNjggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTY4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMjFfaW5fdmFyaWFibGUxNzAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18yMV9pbl92YXJpYWJsZTE3MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfSURfaW5fZGVjbGFyYXRvcjE5OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fZGVjbGFyYXRvcjE5OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIyMTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMjE5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjIyMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIyMjFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18yMl9pbl9mdW5jdGlvbkhlYWRlcjIyMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzIyX2luX2Z1bmN0aW9uSGVhZGVyMjIzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMjI3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMjNfaW5fZnVuY3Rpb25IZWFkZXIyMzEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18yM19pbl9mdW5jdGlvbkhlYWRlcjIzMV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIzMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIzM19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzI0X2luX2Z1bmN0aW9uSGVhZGVyMjQxID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMjRfaW5fZnVuY3Rpb25IZWFkZXIyNDFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjI4MSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMjgxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjI4M19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3NldF9pbl90eXBlMCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3NldF9pbl90eXBlMF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzI1X2luX2Jsb2NrMzc2ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMjVfaW5fYmxvY2szNzZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV192YXJpYWJsZV9pbl9ibG9jazM5MCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzkwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfc3RhdF9pbl9ibG9jazQwNSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3N0YXRfaW5fYmxvY2s0MDVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18yNl9pbl9ibG9jazQxNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzI2X2luX2Jsb2NrNDE2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9yU3RhdF9pbl9zdGF0NDQ5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9zdGF0NDU3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9zdGF0NDU3X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMjFfaW5fc3RhdDQ1OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzIxX2luX3N0YXQ0NTlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9zdGF0NDY4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYmxvY2tfaW5fc3RhdDQ2OF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDQ3NiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Fzc2lnblN0YXRfaW5fc3RhdDQ3Nl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzIxX2luX3N0YXQ0NzggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18yMV9pbl9zdGF0NDc4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMjFfaW5fc3RhdDQ4NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzIxX2luX3N0YXQ0ODdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0ZPUl9pbl9mb3JTdGF0NTA3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDUwN19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzIyX2luX2ZvclN0YXQ1MDkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18yMl9pbl9mb3JTdGF0NTA5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTEzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTEzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfMjFfaW5fZm9yU3RhdDUxNSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzIxX2luX2ZvclN0YXQ1MTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2ZvclN0YXQ1MTcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2ZvclN0YXQ1MTdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18yMV9pbl9mb3JTdGF0NTE5ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMjFfaW5fZm9yU3RhdDUxOV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUyMyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Fzc2lnblN0YXRfaW5fZm9yU3RhdDUyM19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzI0X2luX2ZvclN0YXQ1MjUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18yNF9pbl9mb3JTdGF0NTI1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDUyNyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQ1MjdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0lEX2luX2Fzc2lnblN0YXQ1NzAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0lEX2luX2Fzc2lnblN0YXQ1NzBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0VRX2luX2Fzc2lnblN0YXQ1NzIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0VRX2luX2Fzc2lnblN0YXQ1NzJfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2Fzc2lnblN0YXQ1NzQgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2Fzc2lnblN0YXQ1NzRfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19jb25kRXhwcl9pbl9leHByNTk4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjU5OF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjE3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MTdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0VRRVFfaW5fY29uZEV4cHI2MjIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0VRRVFfaW5fY29uZEV4cHI2MjJfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0xUX2luX2NvbmRFeHByNjI3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19MVF9pbl9jb25kRXhwcjYyN19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2FleHByX2luX2NvbmRFeHByNjMxID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYWV4cHJfaW5fY29uZEV4cHI2MzFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hdG9tX2luX2FleHByNjUzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfYXRvbV9pbl9hZXhwcjY1M19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfUExVU19pbl9hZXhwcjY1NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfUExVU19pbl9hZXhwcjY1N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2F0b21faW5fYWV4cHI2NjAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hdG9tX2luX2FleHByNjYwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9hdG9tNjgwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19JRF9pbl9hdG9tNjgwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JTlRfaW5fYXRvbTY5NCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSU5UX2luX2F0b202OTRfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV18yMl9pbl9hdG9tNzA4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfMjJfaW5fYXRvbTcwOF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fYXRvbTcxMCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fYXRvbTcxMF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzI0X2luX2F0b203MTIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV18yNF9pbl9hdG9tNzEyX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldFRva2VuTmFtZXM6W1tbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOkAiPGludmFsaWQ+IiwgQCI8RU9SPiIsIEAiPERPV04+IiwgQCI8VVA+IiwgCisgQCJWQVJfREVGIiwgQCJBUkdfREVGIiwgQCJGVU5DX0hEUiIsIEAiRlVOQ19ERUNMIiwgQCJGVU5DX0RFRiIsIEAiQkxPQ0siLCAKKyBAIktfSUQiLCBAIktfSU5UIiwgQCJLX0NIQVIiLCBAIktfVk9JRCIsIEAiS19GT1IiLCBAIktfRVEiLCBAIktfRVFFUSIsIAorIEAiS19MVCIsIEAiS19QTFVTIiwgQCJLX0lOVF9UWVBFIiwgQCJXUyIsIEAiJzsnIiwgQCInKCciLCBAIicsJyIsIEAiJyknIiwgCisgQCIneyciLCBAIid9JyIsIG5pbF0gcmV0YWluXV07Cit9CisKKysgKFNpbXBsZUNQYXJzZXIgKiluZXdTaW1wbGVDUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPilhU3RyZWFtCit7CisgICAgcmV0dXJuIFtbU2ltcGxlQ1BhcnNlciBhbGxvY10gaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtXTsKKworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0V2l0aFRva2VuU3RyZWFtOmFTdHJlYW0gU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjE1KzFdIHJldGFpbl1dKSAhPSBuaWwpIHsKKworCisgICAgICAgIGRmYTIgPSBbREZBMiBuZXdERkEyV2l0aFJlY29nbml6ZXI6c2VsZl07CisKKyAgICAgICAgLyogc3RhcnQgb2YgYWN0aW9ucy1hY3Rpb25TY29wZS1pbml0ICovCisgICAgICAgIC8qIHN0YXJ0IG9mIGluaXQgKi8KKyAgICAgICAgLyogQVNUIGdlbmVyaWNQYXJzZXIuaW5pdCAqLworICAgICAgICBbc2VsZiBzZXRUcmVlQWRhcHRvcjpbW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3QU5UTFJDb21tb25UcmVlQWRhcHRvcl0gcmV0YWluXV07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW2RmYTIgcmVsZWFzZV07CisgICAgLyogQVNUIGdlbmVyaWNQYXJzZXIuZGVhbGxvYyAqLworICAgIFtzZWxmIHNldFRyZWVBZGFwdG9yOm5pbF07CisKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisvLyBzdGFydCBhY3Rpb25zLmFjdGlvblNjb3BlLm1ldGhvZHMKKy8vIHN0YXJ0IG1ldGhvZHMoKQorLyogQVNUIGdlbmVyaWNQYXJzZXIubWV0aG9kcyAqLworLyogQVNUIHBhcnNlck1ldGhvZHMgKi8KKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcgoreworCXJldHVybiB0cmVlQWRhcHRvcjsKK30KKworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgoreworCWlmIChhVHJlZUFkYXB0b3IgIT0gdHJlZUFkYXB0b3IpIHsKKwkJdHJlZUFkYXB0b3IgPSBhVHJlZUFkYXB0b3I7CisJfQorfQorLy8gc3RhcnQgcnVsZXMKKy8qCisgKiAkQU5UTFIgc3RhcnQgcHJvZ3JhbQorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTY6MTogcHJvZ3JhbSA6ICggZGVjbGFyYXRpb24gKSsgOworICovCistIChTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuICopIHByb2dyYW0KK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX3Byb2dyYW1fcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfcHJvZ3JhbV9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9wcm9ncmFtX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gKiBkZWNsYXJhdGlvbjEgPSBuaWw7CisKKworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE3OjU6ICggKCBkZWNsYXJhdGlvbiApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoxNzo5OiAoIGRlY2xhcmF0aW9uICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjE3Ojk6ICggZGVjbGFyYXRpb24gKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDE9MDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTFfMD49S19JRCAmJiBMQTFfMDw9S19WT0lEKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MTc6OTogZGVjbGFyYXRpb24gLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTg1XTsKKyAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24xID0gW3NlbGYgZGVjbGFyYXRpb25dOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltkZWNsYXJhdGlvbjEgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQxID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMTsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9IFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU3RyZWFtOmlucHV0IGRlY2lzaW9uTnVtYmVyOjFdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MSsrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMTogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBwcm9ncmFtICovCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2xhcmF0aW9uCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyMDoxOiBkZWNsYXJhdGlvbiA6ICggdmFyaWFibGUgfCBmdW5jdGlvbkhlYWRlciAnOycgLT4gXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkgfCBmdW5jdGlvbkhlYWRlciBibG9jayAtPiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApICk7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfZGVjbGFyYXRpb25fcmV0dXJuICopIGRlY2xhcmF0aW9uCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl9kZWNsYXJhdGlvbl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDQgPSBuaWw7CisgICAgICAgIFNpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuICogdmFyaWFibGUyID0gbmlsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICogZnVuY3Rpb25IZWFkZXIzID0gbmlsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICogZnVuY3Rpb25IZWFkZXI1ID0gbmlsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXJfYmxvY2tfcmV0dXJuICogYmxvY2s2ID0gbmlsOworCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWw0X3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV8yMSA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiAyMSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZnVuY3Rpb25IZWFkZXIgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgZnVuY3Rpb25IZWFkZXIiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX2Jsb2NrID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIGJsb2NrIl0gcmV0YWluXTsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjE6NTogKCB2YXJpYWJsZSB8IGZ1bmN0aW9uSGVhZGVyICc7JyAtPiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKSAvL3J1bGVibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0Mj0zOworICAgICAgICBhbHQyID0gW2RmYTIgcHJlZGljdDppbnB1dF07CisgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjIxOjk6IHZhcmlhYmxlIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb24xMDVdOworICAgICAgICAgICAgICAgIHZhcmlhYmxlMiA9IFtzZWxmIHZhcmlhYmxlXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3ZhcmlhYmxlMiBnZXRUcmVlXSB0b1RyZWU6cm9vdF8wXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyMjo5OiBmdW5jdGlvbkhlYWRlciAnOycgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTE1XTsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbkhlYWRlcjMgPSBbc2VsZiBmdW5jdGlvbkhlYWRlcl07CisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgW3N0cmVhbV9mdW5jdGlvbkhlYWRlciBhZGRFbGVtZW50OltmdW5jdGlvbkhlYWRlcjMgZ2V0VHJlZV1dOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsND0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToyMSBGb2xsb3c6Rk9MTE9XXzIxX2luX2RlY2xhcmF0aW9uMTE3XTsgIAorICAgICAgICAgICAgICAgICAgICBbc3RyZWFtXzIxIGFkZEVsZW1lbnQ6Y2hhcl9saXRlcmFsNF07CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKworICAgICAgICAgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgICAgICAgICAgLy8gZWxlbWVudHM6IGZ1bmN0aW9uSGVhZGVyCisgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICAgICAgIFtyZXR2YWwgc2V0VHJlZTpyb290XzBdOworCisgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gcmV0dmFsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8vIDIyOjI4OiAtPiBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjI6MzE6IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgICAgICAgICAgICAgICAgICAgICByb290XzEgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6W1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOihOU0ludGVnZXIpRlVOQ19ERUNMIFRleHQ6W1tBTlRMUkJhc2VSZWNvZ25pemVyIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6KE5TVUludGVnZXIpRlVOQ19ERUNMXV0gcmV0YWluXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZDpyb290XzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9mdW5jdGlvbkhlYWRlciBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjIzOjk6IGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjEzNV07CisgICAgICAgICAgICAgICAgZnVuY3Rpb25IZWFkZXI1ID0gW3NlbGYgZnVuY3Rpb25IZWFkZXJdOworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFtzdHJlYW1fZnVuY3Rpb25IZWFkZXIgYWRkRWxlbWVudDpbZnVuY3Rpb25IZWFkZXI1IGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTM3XTsKKyAgICAgICAgICAgICAgICBibG9jazYgPSBbc2VsZiBibG9ja107CisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgW3N0cmVhbV9ibG9jayBhZGRFbGVtZW50OltibG9jazYgZ2V0VHJlZV1dOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisKKyAgICAgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBmdW5jdGlvbkhlYWRlciwgYmxvY2sKKyAgICAgICAgICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgICAgICAgICAvLyB0b2tlbiBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAgW3JldHZhbCBzZXRUcmVlOnJvb3RfMF07CisKKyAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICAgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgICAgICAgICAgLy8gMjM6MzA6IC0+IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjIzOjMzOiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgICAgICAgICAgICAgICAgICAgICByb290XzEgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6W1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOihOU0ludGVnZXIpRlVOQ19ERUYgVGV4dDpbW0FOVExSQmFzZVJlY29nbml6ZXIgZ2V0VG9rZW5OYW1lc10gb2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcilGVU5DX0RFRl1dIHJldGFpbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fZnVuY3Rpb25IZWFkZXIgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworICAgICAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fYmxvY2sgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF8xIHRvVHJlZTpyb290XzBdOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKyAgICAgICAgW3N0cmVhbV8yMSByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9mdW5jdGlvbkhlYWRlciByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9ibG9jayByZWxlYXNlXTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBkZWNsYXJhdGlvbiAqLworLyoKKyAqICRBTlRMUiBzdGFydCB2YXJpYWJsZQorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MjY6MTogdmFyaWFibGUgOiB0eXBlIGRlY2xhcmF0b3IgJzsnIC0+IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICovCistIChTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiAqKSB2YXJpYWJsZQoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfdmFyaWFibGVfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpjaGFyX2xpdGVyYWw5ID0gbmlsOworICAgICAgICBTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICogdHlwZTcgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqIGRlY2xhcmF0b3I4ID0gbmlsOworCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWw5X3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV8yMSA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiAyMSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZGVjbGFyYXRvciA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBkZWNsYXJhdG9yIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV90eXBlID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHR5cGUiXSByZXRhaW5dOworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyNzo1OiAoIHR5cGUgZGVjbGFyYXRvciAnOycgLT4gXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzoyNzo5OiB0eXBlIGRlY2xhcmF0b3IgJzsnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3R5cGVfaW5fdmFyaWFibGUxNjZdOworICAgICAgICB0eXBlNyA9IFtzZWxmIHR5cGVdOworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3N0cmVhbV90eXBlIGFkZEVsZW1lbnQ6W3R5cGU3IGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTY4XTsKKyAgICAgICAgZGVjbGFyYXRvcjggPSBbc2VsZiBkZWNsYXJhdG9yXTsKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fZGVjbGFyYXRvciBhZGRFbGVtZW50OltkZWNsYXJhdG9yOCBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgY2hhcl9saXRlcmFsOT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToyMSBGb2xsb3c6Rk9MTE9XXzIxX2luX3ZhcmlhYmxlMTcwXTsgIAorICAgICAgICAgICAgW3N0cmVhbV8yMSBhZGRFbGVtZW50OmNoYXJfbGl0ZXJhbDldOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKworICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAvLyBlbGVtZW50czogdHlwZSwgZGVjbGFyYXRvcgorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICBbcmV0dmFsIHNldFRyZWU6cm9vdF8wXTsKKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLy8gMjc6Mjk6IC0+IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Mjc6MzI6IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpbW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcilWQVJfREVGIFRleHQ6W1tBTlRMUkJhc2VSZWNvZ25pemVyIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6KE5TVUludGVnZXIpVkFSX0RFRl1dIHJldGFpbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV90eXBlIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9kZWNsYXJhdG9yIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisgICAgICAgIFtzdHJlYW1fMjEgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fZGVjbGFyYXRvciByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV90eXBlIHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIHZhcmlhYmxlICovCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2xhcmF0b3IKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjMwOjE6IGRlY2xhcmF0b3IgOiBLX0lEIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqKSBkZWNsYXJhdG9yCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2RlY2xhcmF0b3JfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfZGVjbGFyYXRvcl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfSUQxMCA9IG5pbDsKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfSUQxMF90cmVlPW5pbDsKKworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozMTo1OiAoIEtfSUQgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MzE6OTogS19JRCAvLyBhbHQKKyAgICAgICAgeworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvKiBBU1RQYXJzZXIgdG9rZW5SZWYgKi8KKyAgICAgICAgS19JRDEwPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfSUQgRm9sbG93OkZPTExPV19LX0lEX2luX2RlY2xhcmF0b3IxOTldOyAKKyAgICAgICAgS19JRDEwX3RyZWUgPSAvKiBBU1RQYXJzZXIgY3JlYXRlTm9kZUZyb21Ub2tlbiAqLworICAgICAgICAoQU5UTFJDb21tb25UcmVlICopW1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOktfSUQxMF0gcmV0YWluXTsKKyAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOktfSUQxMF90cmVlICB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZGVjbGFyYXRvciAqLworLyoKKyAqICRBTlRMUiBzdGFydCBmdW5jdGlvbkhlYWRlcgorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MzQ6MTogZnVuY3Rpb25IZWFkZXIgOiB0eXBlIEtfSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScgLT4gXiggRlVOQ19IRFIgdHlwZSBLX0lEICggZm9ybWFsUGFyYW1ldGVyICkrICkgOworICovCistIChTaW1wbGVDUGFyc2VyX2Z1bmN0aW9uSGVhZGVyX3JldHVybiAqKSBmdW5jdGlvbkhlYWRlcgoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfZnVuY3Rpb25IZWFkZXJfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0lEMTIgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDEzID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpjaGFyX2xpdGVyYWwxNSA9IG5pbDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqY2hhcl9saXRlcmFsMTcgPSBuaWw7CisgICAgICAgIFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKiB0eXBlMTEgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuICogZm9ybWFsUGFyYW1ldGVyMTQgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuICogZm9ybWFsUGFyYW1ldGVyMTYgPSBuaWw7CisKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKktfSUQxMl90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWwxM190cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWwxNV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWwxN190cmVlPW5pbDsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fS19JRCA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBLX0lEIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fMjIgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gMjIiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV8yMyA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiAyMyJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtXzI0ID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIDI0Il0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9mb3JtYWxQYXJhbWV0ZXIgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgZm9ybWFsUGFyYW1ldGVyIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV90eXBlID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHR5cGUiXSByZXRhaW5dOworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNTo1OiAoIHR5cGUgS19JRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJyAtPiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNTo5OiB0eXBlIEtfSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjIxOV07CisgICAgICAgIHR5cGUxMSA9IFtzZWxmIHR5cGVdOworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3N0cmVhbV90eXBlIGFkZEVsZW1lbnQ6W3R5cGUxMSBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgS19JRDEyPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfSUQgRm9sbG93OkZPTExPV19LX0lEX2luX2Z1bmN0aW9uSGVhZGVyMjIxXTsgIAorICAgICAgICAgICAgW3N0cmVhbV9LX0lEIGFkZEVsZW1lbnQ6S19JRDEyXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgY2hhcl9saXRlcmFsMTM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjIgRm9sbG93OkZPTExPV18yMl9pbl9mdW5jdGlvbkhlYWRlcjIyM107ICAKKyAgICAgICAgICAgIFtzdHJlYW1fMjIgYWRkRWxlbWVudDpjaGFyX2xpdGVyYWwxM107CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjM1OjIzOiAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gLy8gYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDQ9MjsKKyAgICAgICAgTlNJbnRlZ2VyIExBNF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgIGlmICggKChMQTRfMD49S19JRCAmJiBMQTRfMDw9S19WT0lEKSkgKSB7CisgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6MzU6MjU6IGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIyN107CisgICAgICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyMTQgPSBbc2VsZiBmb3JtYWxQYXJhbWV0ZXJdOworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFtzdHJlYW1fZm9ybWFsUGFyYW1ldGVyIGFkZEVsZW1lbnQ6W2Zvcm1hbFBhcmFtZXRlcjE0IGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09MjMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNTo0MzogJywnIGZvcm1hbFBhcmFtZXRlciAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsMTU9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjMgRm9sbG93OkZPTExPV18yM19pbl9mdW5jdGlvbkhlYWRlcjIzMV07ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0cmVhbV8yMyBhZGRFbGVtZW50OmNoYXJfbGl0ZXJhbDE1XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjIzM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWFsUGFyYW1ldGVyMTYgPSBbc2VsZiBmb3JtYWxQYXJhbWV0ZXJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fZm9ybWFsUGFyYW1ldGVyIGFkZEVsZW1lbnQ6W2Zvcm1hbFBhcmFtZXRlcjE2IGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgICAgICAgICAgbG9vcDM6IDsKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGNoYXJfbGl0ZXJhbDE3PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjI0IEZvbGxvdzpGT0xMT1dfMjRfaW5fZnVuY3Rpb25IZWFkZXIyNDFdOyAgCisgICAgICAgICAgICBbc3RyZWFtXzI0IGFkZEVsZW1lbnQ6Y2hhcl9saXRlcmFsMTddOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKworICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAvLyBlbGVtZW50czogS19JRCwgZm9ybWFsUGFyYW1ldGVyLCB0eXBlCisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgIFtyZXR2YWwgc2V0VHJlZTpyb290XzBdOworCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyAzNjo5OiAtPiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNjoxMjogXiggRlVOQ19IRFIgdHlwZSBLX0lEICggZm9ybWFsUGFyYW1ldGVyICkrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpbW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcilGVU5DX0hEUiBUZXh0OltbQU5UTFJCYXNlUmVjb2duaXplciBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OihOU1VJbnRlZ2VyKUZVTkNfSERSXV0gcmV0YWluXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX3R5cGUgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhcmdzOiAKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9LX0lEIG5leHROb2RlXSB0b1RyZWU6cm9vdF8xXTsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzozNjozMzogKCBmb3JtYWxQYXJhbWV0ZXIgKSsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAhKFtzdHJlYW1fZm9ybWFsUGFyYW1ldGVyIGhhc05leHRdKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IFtOU0V4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTpAIlJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24iIHJlYXNvbjpuaWwgdXNlckluZm86bmlsXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKCBbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciBoYXNOZXh0XSApIHsKKyAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fZm9ybWFsUGFyYW1ldGVyIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciByZXNldF07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKyAgICAgICAgW3N0cmVhbV9LX0lEIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtXzIyIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtXzIzIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtXzI0IHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2Zvcm1hbFBhcmFtZXRlciByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV90eXBlIHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGZ1bmN0aW9uSGVhZGVyICovCisvKgorICogJEFOVExSIHN0YXJ0IGZvcm1hbFBhcmFtZXRlcgorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Mzk6MTogZm9ybWFsUGFyYW1ldGVyIDogdHlwZSBkZWNsYXJhdG9yIC0+IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICovCistIChTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm4gKikgZm9ybWFsUGFyYW1ldGVyCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9mb3JtYWxQYXJhbWV0ZXJfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfZm9ybWFsUGFyYW1ldGVyX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2Zvcm1hbFBhcmFtZXRlcl9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIFNpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gKiB0eXBlMTggPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9kZWNsYXJhdG9yX3JldHVybiAqIGRlY2xhcmF0b3IxOSA9IG5pbDsKKworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZGVjbGFyYXRvciA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBkZWNsYXJhdG9yIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV90eXBlID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHR5cGUiXSByZXRhaW5dOworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo0MDo1OiAoIHR5cGUgZGVjbGFyYXRvciAtPiBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjQwOjk6IHR5cGUgZGVjbGFyYXRvciAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjI4MV07CisgICAgICAgIHR5cGUxOCA9IFtzZWxmIHR5cGVdOworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3N0cmVhbV90eXBlIGFkZEVsZW1lbnQ6W3R5cGUxOCBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyODNdOworICAgICAgICBkZWNsYXJhdG9yMTkgPSBbc2VsZiBkZWNsYXJhdG9yXTsKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fZGVjbGFyYXRvciBhZGRFbGVtZW50OltkZWNsYXJhdG9yMTkgZ2V0VHJlZV1dOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworCisgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgIC8vIGVsZW1lbnRzOiBkZWNsYXJhdG9yLCB0eXBlCisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgIFtyZXR2YWwgc2V0VHJlZTpyb290XzBdOworCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyA0MDoyNTogLT4gXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo0MDoyODogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OltbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTooTlNJbnRlZ2VyKUFSR19ERUYgVGV4dDpbW0FOVExSQmFzZVJlY29nbml6ZXIgZ2V0VG9rZW5OYW1lc10gb2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcilBUkdfREVGXV0gcmV0YWluXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX3R5cGUgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX2RlY2xhcmF0b3IgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKyAgICAgICAgW3N0cmVhbV9kZWNsYXJhdG9yIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX3R5cGUgcmVsZWFzZV07CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZm9ybWFsUGFyYW1ldGVyICovCisvKgorICogJEFOVExSIHN0YXJ0IHR5cGUKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjQzOjE6IHR5cGUgOiAoIEtfSU5UIHwgS19DSEFSIHwgS19WT0lEIHwgS19JRCApOworICovCistIChTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICopIHR5cGUKK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX3R5cGVfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfdHlwZV9yZXR1cm4gbmV3U2ltcGxlQ1BhcnNlcl90eXBlX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqc2V0MjAgPSBuaWw7CisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpzZXQyMF90cmVlPW5pbDsKKworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo0NDo1OiAoIEtfSU5UIHwgS19DSEFSIHwgS19WT0lEIHwgS19JRCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLyogQVNUUGFyc2VyIG1hdGNoUnVsZUJsb2NrU2V0ICovCisgICAgICAgIC8qIEFTVFBhcnNlciBtYXRjaFNldCAqLworICAgICAgICBzZXQyMCA9IChBTlRMUkNvbW1vblRva2VuICopW2lucHV0IExUOjFdOworICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gS19JRCkgJiYgKFtpbnB1dCBMQToxXSA8PSBLX1ZPSUQpKSkgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDovKiBBU1RQYXJzZXIgY3JlYXRlTm9kZUZyb21Ub2tlbiAqLworICAgICAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTpzZXQyMF0gcmV0YWluXSB0b1RyZWU6cm9vdF8wIF07CisgICAgICAgICAgICBbc3RhdGUgc2V0SXNFcnJvclJlY292ZXJ5Ok5PXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU2V0Om5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCB0eXBlICovCisvKgorICogJEFOVExSIHN0YXJ0IGJsb2NrCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1MDoxOiBibG9jayA6IGxjPSAneycgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogJ30nIC0+IF4oIEJMT0NLWyRsYyxAXCJCTE9DS1wiXSAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gKikgYmxvY2sKK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqbGMgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDIzID0gbmlsOworICAgICAgICBTaW1wbGVDUGFyc2VyX3ZhcmlhYmxlX3JldHVybiAqIHZhcmlhYmxlMjEgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqIHN0YXQyMiA9IG5pbDsKKworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqbGNfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqY2hhcl9saXRlcmFsMjNfdHJlZT1uaWw7CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtXzI1ID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIDI1Il0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fMjYgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gMjYiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3ZhcmlhYmxlID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHZhcmlhYmxlIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9zdGF0ID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHN0YXQiXSByZXRhaW5dOworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1MTo1OiAobGM9ICd7JyAoIHZhcmlhYmxlICkqICggc3RhdCApKiAnfScgLT4gXiggQkxPQ0tbJGxjLEBcIkJMT0NLXCJdICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTE6OTogbGM9ICd7JyAoIHZhcmlhYmxlICkqICggc3RhdCApKiAnfScgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgbGM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjUgRm9sbG93OkZPTExPV18yNV9pbl9ibG9jazM3Nl07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fMjUgYWRkRWxlbWVudDpsY107CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ1PTI7CisgICAgICAgICAgICBzd2l0Y2ggKFtpbnB1dCBMQToxXSkgeworICAgICAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTVfMiA9IFtpbnB1dCBMQToyXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE1XzI9PUtfSUQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS19JTlQ6IDsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE1XzMgPSBbaW5wdXQgTEE6Ml07CisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNV8zPT1LX0lEKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEtfQ0hBUjogOworICAgICAgICAgICAgICAgIGNhc2UgS19WT0lEOiA7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTI6MTM6IHZhcmlhYmxlIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMzkwXTsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUyMSA9IFtzZWxmIHZhcmlhYmxlXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fdmFyaWFibGUgYWRkRWxlbWVudDpbdmFyaWFibGUyMSBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBsb29wNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDU6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDY9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTZfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKChMQTZfMD49S19JRCAmJiBMQTZfMDw9S19JTlQpfHxMQTZfMD09S19GT1J8fChMQTZfMD49MjEgJiYgTEE2XzA8PTIyKXx8TEE2XzA9PTI1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1MzoxMzogc3RhdCAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19zdGF0X2luX2Jsb2NrNDA1XTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdDIyID0gW3NlbGYgc3RhdF07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgICAgICBbc3RyZWFtX3N0YXQgYWRkRWxlbWVudDpbc3RhdDIyIGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3A2OworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wNjogOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBjaGFyX2xpdGVyYWwyMz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToyNiBGb2xsb3c6Rk9MTE9XXzI2X2luX2Jsb2NrNDE2XTsgIAorICAgICAgICAgICAgW3N0cmVhbV8yNiBhZGRFbGVtZW50OmNoYXJfbGl0ZXJhbDIzXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisKKyAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgLy8gZWxlbWVudHM6IHN0YXQsIHZhcmlhYmxlCisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwKKyAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gd2lsZGNhcmQgbGFiZWxzOiAKKyAgICAgICAgIFtyZXR2YWwgc2V0VHJlZTpyb290XzBdOworCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyA1NTo5OiAtPiBeKCBCTE9DS1skbGMsQFwiQkxPQ0tcIl0gKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo1NToxMjogXiggQkxPQ0tbJGxjLEBcIkJMT0NLXCJdICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpbW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6KE5TSW50ZWdlcilCTE9DSyBUZXh0OltbQU5UTFJCYXNlUmVjb2duaXplciBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OihOU1VJbnRlZ2VyKUJMT0NLXV0gcmV0YWluXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU1OjM0OiAoIHZhcmlhYmxlICkqCisgICAgICAgICAgICAgICAgd2hpbGUgKCBbc3RyZWFtX3ZhcmlhYmxlIGhhc05leHRdICkgeworICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV92YXJpYWJsZSBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgW3N0cmVhbV92YXJpYWJsZSByZXNldF07CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTU6NDQ6ICggc3RhdCApKgorICAgICAgICAgICAgICAgIHdoaWxlICggW3N0cmVhbV9zdGF0IGhhc05leHRdICkgeworICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9zdGF0IG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBbc3RyZWFtX3N0YXQgcmVzZXRdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKyAgICAgICAgW3N0cmVhbV8yNSByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV8yNiByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV92YXJpYWJsZSByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9zdGF0IHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGJsb2NrICovCisvKgorICogJEFOVExSIHN0YXJ0IHN0YXQKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU4OjE6IHN0YXQgOiAoIGZvclN0YXQgfCBleHByICc7JyB8IGJsb2NrIHwgYXNzaWduU3RhdCAnOycgfCAnOycgKTsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqKSBzdGF0Cit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9zdGF0X3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX3N0YXRfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfc3RhdF9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDI2ID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpjaGFyX2xpdGVyYWwyOSA9IG5pbDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqY2hhcl9saXRlcmFsMzAgPSBuaWw7CisgICAgICAgIFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKiBmb3JTdGF0MjQgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiAqIGV4cHIyNSA9IG5pbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyX2Jsb2NrX3JldHVybiAqIGJsb2NrMjcgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqIGFzc2lnblN0YXQyOCA9IG5pbDsKKworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqY2hhcl9saXRlcmFsMjZfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqY2hhcl9saXRlcmFsMjlfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqY2hhcl9saXRlcmFsMzBfdHJlZT1uaWw7CisKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NTg6NTogKCBmb3JTdGF0IHwgZXhwciAnOycgfCBibG9jayB8IGFzc2lnblN0YXQgJzsnIHwgJzsnICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDc9NTsKKyAgICAgICAgc3dpdGNoIChbaW5wdXQgTEE6MV0pIHsKKyAgICAgICAgICAgIGNhc2UgS19GT1I6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE3XzIgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTdfMj09S19FUSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDc9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEE3XzI+PUtfRVFFUSAmJiBMQTdfMjw9S19QTFVTKXx8TEE3XzI9PTIxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Nz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb246NyBzdGF0ZToyIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtfSU5UOiA7CisgICAgICAgICAgICBjYXNlIDIyOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1OiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogOworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb246NyBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU4Ojc6IGZvclN0YXQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19mb3JTdGF0X2luX3N0YXQ0NDldOworICAgICAgICAgICAgICAgIGZvclN0YXQyNCA9IFtzZWxmIGZvclN0YXRdOworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbZm9yU3RhdDI0IGdldFRyZWVdIHRvVHJlZTpyb290XzBdOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjU5Ojc6IGV4cHIgJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9zdGF0NDU3XTsKKyAgICAgICAgICAgICAgICBleHByMjUgPSBbc2VsZiBleHByXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2V4cHIyNSBnZXRUcmVlXSB0b1RyZWU6cm9vdF8wXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDI2PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjIxIEZvbGxvdzpGT0xMT1dfMjFfaW5fc3RhdDQ1OV07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjYwOjc6IGJsb2NrIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYmxvY2tfaW5fc3RhdDQ2OF07CisgICAgICAgICAgICAgICAgYmxvY2syNyA9IFtzZWxmIGJsb2NrXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2Jsb2NrMjcgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NjE6NzogYXNzaWduU3RhdCAnOycgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19hc3NpZ25TdGF0X2luX3N0YXQ0NzZdOworICAgICAgICAgICAgICAgIGFzc2lnblN0YXQyOCA9IFtzZWxmIGFzc2lnblN0YXRdOworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbYXNzaWduU3RhdDI4IGdldFRyZWVdIHRvVHJlZTpyb290XzBdOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsMjk9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjEgRm9sbG93OkZPTExPV18yMV9pbl9zdGF0NDc4XTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NjI6NzogJzsnIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbDMwPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOjIxIEZvbGxvdzpGT0xMT1dfMjFfaW5fc3RhdDQ4N107ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIHN0YXQgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgZm9yU3RhdAorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NjU6MTogZm9yU3RhdCA6IEtfRk9SICcoJyBzdGFydD0gYXNzaWduU3RhdCAnOycgZXhwciAnOycgbmV4dD0gYXNzaWduU3RhdCAnKScgYmxvY2sgLT4gXiggS19GT1IgJHN0YXJ0IGV4cHIgJG5leHQgYmxvY2sgKSA7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKikgZm9yU3RhdAoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfZm9yU3RhdF9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9mb3JTdGF0X3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2ZvclN0YXRfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX0ZPUjMxID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpjaGFyX2xpdGVyYWwzMiA9IG5pbDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqY2hhcl9saXRlcmFsMzMgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDM1ID0gbmlsOworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpjaGFyX2xpdGVyYWwzNiA9IG5pbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqIHN0YXJ0ID0gbmlsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm4gKiBuZXh0ID0gbmlsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4gKiBleHByMzQgPSBuaWw7CisKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9ibG9ja19yZXR1cm4gKiBibG9jazM3ID0gbmlsOworCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0ZPUjMxX3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKmNoYXJfbGl0ZXJhbDMyX3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKmNoYXJfbGl0ZXJhbDMzX3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKmNoYXJfbGl0ZXJhbDM1X3RyZWU9bmlsOworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKmNoYXJfbGl0ZXJhbDM2X3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV8yMSA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiAyMSJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtXzIyID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIDIyIl0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fMjQgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gMjQiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0ZPUiA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBLX0ZPUiJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fYXNzaWduU3RhdCA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBhc3NpZ25TdGF0Il0gcmV0YWluXTsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV9ibG9jayA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBibG9jayJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZXhwciA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBleHByIl0gcmV0YWluXTsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NjY6NTogKCBLX0ZPUiAnKCcgc3RhcnQ9IGFzc2lnblN0YXQgJzsnIGV4cHIgJzsnIG5leHQ9IGFzc2lnblN0YXQgJyknIGJsb2NrIC0+IF4oIEtfRk9SICRzdGFydCBleHByICRuZXh0IGJsb2NrICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NjY6OTogS19GT1IgJygnIHN0YXJ0PSBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBuZXh0PSBhc3NpZ25TdGF0ICcpJyBibG9jayAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBLX0ZPUjMxPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfRk9SIEZvbGxvdzpGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDUwN107ICAKKyAgICAgICAgICAgIFtzdHJlYW1fS19GT1IgYWRkRWxlbWVudDpLX0ZPUjMxXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgY2hhcl9saXRlcmFsMzI9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjIgRm9sbG93OkZPTExPV18yMl9pbl9mb3JTdGF0NTA5XTsgIAorICAgICAgICAgICAgW3N0cmVhbV8yMiBhZGRFbGVtZW50OmNoYXJfbGl0ZXJhbDMyXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYXNzaWduU3RhdF9pbl9mb3JTdGF0NTEzXTsKKyAgICAgICAgc3RhcnQgPSBbc2VsZiBhc3NpZ25TdGF0XTsKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fYXNzaWduU3RhdCBhZGRFbGVtZW50OltzdGFydCBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgY2hhcl9saXRlcmFsMzM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjEgRm9sbG93OkZPTExPV18yMV9pbl9mb3JTdGF0NTE1XTsgIAorICAgICAgICAgICAgW3N0cmVhbV8yMSBhZGRFbGVtZW50OmNoYXJfbGl0ZXJhbDMzXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0NTE3XTsKKyAgICAgICAgZXhwcjM0ID0gW3NlbGYgZXhwcl07CisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2V4cHIgYWRkRWxlbWVudDpbZXhwcjM0IGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBjaGFyX2xpdGVyYWwzNT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToyMSBGb2xsb3c6Rk9MTE9XXzIxX2luX2ZvclN0YXQ1MTldOyAgCisgICAgICAgICAgICBbc3RyZWFtXzIxIGFkZEVsZW1lbnQ6Y2hhcl9saXRlcmFsMzVdOworICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19hc3NpZ25TdGF0X2luX2ZvclN0YXQ1MjNdOworICAgICAgICBuZXh0ID0gW3NlbGYgYXNzaWduU3RhdF07CisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2Fzc2lnblN0YXQgYWRkRWxlbWVudDpbbmV4dCBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgY2hhcl9saXRlcmFsMzY9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjQgRm9sbG93OkZPTExPV18yNF9pbl9mb3JTdGF0NTI1XTsgIAorICAgICAgICAgICAgW3N0cmVhbV8yNCBhZGRFbGVtZW50OmNoYXJfbGl0ZXJhbDM2XTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDUyN107CisgICAgICAgIGJsb2NrMzcgPSBbc2VsZiBibG9ja107CisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2Jsb2NrIGFkZEVsZW1lbnQ6W2Jsb2NrMzcgZ2V0VHJlZV1dOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworCisgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgIC8vIGVsZW1lbnRzOiBLX0ZPUiwgZXhwciwgc3RhcnQsIG5leHQsIGJsb2NrCisgICAgICAgIC8vIHRva2VuIGxhYmVsczogCisgICAgICAgIC8vIHJ1bGUgbGFiZWxzOiByZXR2YWwsIHN0YXJ0LCBuZXh0CisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICBbcmV0dmFsIHNldFRyZWU6cm9vdF8wXTsKKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fc3RhcnQgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gc3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6c3RhcnQhPW5pbD9bc3RhcnQgZ2V0VHJlZV06bmlsXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX25leHQgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gbmV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDpuZXh0IT1uaWw/W25leHQgZ2V0VHJlZV06bmlsXSByZXRhaW5dOworCisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgIC8vIDY3Ojk6IC0+IF4oIEtfRk9SICRzdGFydCBleHByICRuZXh0IGJsb2NrICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Njc6MTI6IF4oIEtfRk9SICRzdGFydCBleHByICRuZXh0IGJsb2NrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpbc3RyZWFtX0tfRk9SIG5leHROb2RlXSBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX3N0YXJ0IG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9leHByIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9uZXh0IG5leHRUcmVlXSB0b1RyZWU6cm9vdF8xXTsKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9ibG9jayBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF8xIHRvVHJlZTpyb290XzBdOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworICAgICAgICBbc3RyZWFtXzIxIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtXzIyIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtXzI0IHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX0tfRk9SIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2Fzc2lnblN0YXQgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fYmxvY2sgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fZXhwciByZWxlYXNlXTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBmb3JTdGF0ICovCisvKgorICogJEFOVExSIHN0YXJ0IGFzc2lnblN0YXQKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjcwOjE6IGFzc2lnblN0YXQgOiBLX0lEIEtfRVEgZXhwciAtPiBeKCBLX0VRIEtfSUQgZXhwciApIDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqKSBhc3NpZ25TdGF0Cit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9hc3NpZ25TdGF0X3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2Fzc2lnblN0YXRfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfYXNzaWduU3RhdF9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfSUQzOCA9IG5pbDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqS19FUTM5ID0gbmlsOworICAgICAgICBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuICogZXhwcjQwID0gbmlsOworCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0lEMzhfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19FUTM5X3RyZWU9bmlsOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0lEID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfSUQiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV9LX0VRID0gCisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIEtfRVEiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX2V4cHIgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgZXhwciJdIHJldGFpbl07CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjcxOjU6ICggS19JRCBLX0VRIGV4cHIgLT4gXiggS19FUSBLX0lEIGV4cHIgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3MTo5OiBLX0lEIEtfRVEgZXhwciAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBLX0lEMzg9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fYXNzaWduU3RhdDU3MF07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fS19JRCBhZGRFbGVtZW50OktfSUQzOF07CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIEtfRVEzOT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0VRIEZvbGxvdzpGT0xMT1dfS19FUV9pbl9hc3NpZ25TdGF0NTcyXTsgIAorICAgICAgICAgICAgW3N0cmVhbV9LX0VRIGFkZEVsZW1lbnQ6S19FUTM5XTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9hc3NpZ25TdGF0NTc0XTsKKyAgICAgICAgZXhwcjQwID0gW3NlbGYgZXhwcl07CisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX2V4cHIgYWRkRWxlbWVudDpbZXhwcjQwIGdldFRyZWVdXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKworICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAvLyBlbGVtZW50czogS19FUSwgS19JRCwgZXhwcgorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICBbcmV0dmFsIHNldFRyZWU6cm9vdF8wXTsKKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLy8gNzE6MjQ6IC0+IF4oIEtfRVEgS19JRCBleHByICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NzE6Mjc6IF4oIEtfRVEgS19JRCBleHByICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworICAgICAgICAgICAgICAgIHJvb3RfMSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpbc3RyZWFtX0tfRVEgbmV4dE5vZGVdIG9sZDpyb290XzFdOworCisgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFyZ3M6IAorICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX0tfSUQgbmV4dE5vZGVdIHRvVHJlZTpyb290XzFdOworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtX2V4cHIgbmV4dFRyZWVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKyAgICAgICAgW3N0cmVhbV9LX0lEIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX0tfRVEgcmVsZWFzZV07CisgICAgICAgIFtzdHJlYW1fZXhwciByZWxlYXNlXTsKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBhc3NpZ25TdGF0ICovCisvKgorICogJEFOVExSIHN0YXJ0IGV4cHIKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc0OjE6IGV4cHIgOiBjb25kRXhwciA7CisgKi8KKy0gKFNpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4gKikgZXhwcgoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfZXhwcl9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1BhcnNlcl9leHByX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybiAqIGNvbmRFeHByNDEgPSBuaWw7CisKKworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc0OjU6ICggY29uZEV4cHIgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6NzQ6OTogY29uZEV4cHIgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfY29uZEV4cHJfaW5fZXhwcjU5OF07CisgICAgICAgIGNvbmRFeHByNDEgPSBbc2VsZiBjb25kRXhwcl07CisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2NvbmRFeHByNDEgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZXhwciAqLworLyoKKyAqICRBTlRMUiBzdGFydCBjb25kRXhwcgorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6Nzc6MTogY29uZEV4cHIgOiBhZXhwciAoICggS19FUUVRIHwgS19MVCApIGFleHByICk/IDsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9jb25kRXhwcl9yZXR1cm4gKikgY29uZEV4cHIKK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybiBuZXdTaW1wbGVDUGFyc2VyX2NvbmRFeHByX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisgICAgQU5UTFJDb21tb25UcmVlICpyb290XzAgPSBuaWw7CisKKyAgICBAdHJ5IHsKKyAgICAgICAgLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqS19FUUVRNDMgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfTFQ0NCA9IG5pbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9hZXhwcl9yZXR1cm4gKiBhZXhwcjQyID0gbmlsOworCisgICAgICAgIFNpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuICogYWV4cHI0NSA9IG5pbDsKKworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19FUUVRNDNfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19MVDQ0X3RyZWU9bmlsOworCisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc4OjU6ICggYWV4cHIgKCAoIEtfRVFFUSB8IEtfTFQgKSBhZXhwciApPyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3ODo5OiBhZXhwciAoICggS19FUUVRIHwgS19MVCApIGFleHByICk/IC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2FleHByX2luX2NvbmRFeHByNjE3XTsKKyAgICAgICAgYWV4cHI0MiA9IFtzZWxmIGFleHByXTsKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbYWV4cHI0MiBnZXRUcmVlXSB0b1RyZWU6cm9vdF8wXTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3ODoxNTogKCAoIEtfRVFFUSB8IEtfTFQgKSBhZXhwciApPyAvLyBibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0OT0yOworICAgICAgICBOU0ludGVnZXIgTEE5XzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICAgICAgaWYgKCAoKExBOV8wPj1LX0VRRVEgJiYgTEE5XzA8PUtfTFQpKSApIHsKKyAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo3ODoxNzogKCBLX0VRRVEgfCBLX0xUICkgYWV4cHIgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc4OjE3OiAoIEtfRVFFUSB8IEtfTFQgKSAvLyBibG9jaworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBhbHQ4PTI7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBOF8wID0gW2lucHV0IExBOjFdOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE4XzA9PUtfRVFFUSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQThfMD09S19MVCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDg9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uOjggc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc4OjE4OiBLX0VRRVEgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLX0VRRVE0Mz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0VRRVEgRm9sbG93OkZPTExPV19LX0VRRVFfaW5fY29uZEV4cHI2MjJdOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIEtfRVFFUTQzX3RyZWUgPSAvKiBBU1RQYXJzZXIgY3JlYXRlTm9kZUZyb21Ub2tlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTpLX0VRRVE0M10gcmV0YWluXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpLX0VRRVE0M190cmVlIG9sZDpyb290XzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjc4OjI4OiBLX0xUIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS19MVDQ0PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfTFQgRm9sbG93OkZPTExPV19LX0xUX2luX2NvbmRFeHByNjI3XTsgCisgICAgICAgICAgICAgICAgICAgICAgICBLX0xUNDRfdHJlZSA9IC8qIEFTVFBhcnNlciBjcmVhdGVOb2RlRnJvbVRva2VuICovCisgICAgICAgICAgICAgICAgICAgICAgICAoQU5UTFJDb21tb25UcmVlICopW1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOktfTFQ0NF0gcmV0YWluXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDpLX0xUNDRfdHJlZSBvbGQ6cm9vdF8wXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19hZXhwcl9pbl9jb25kRXhwcjYzMV07CisgICAgICAgICAgICAgICAgYWV4cHI0NSA9IFtzZWxmIGFleHByXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2FleHByNDUgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBjb25kRXhwciAqLworLyoKKyAqICRBTlRMUiBzdGFydCBhZXhwcgorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODE6MTogYWV4cHIgOiBhdG9tICggS19QTFVTIGF0b20gKSogOworICovCistIChTaW1wbGVDUGFyc2VyX2FleHByX3JldHVybiAqKSBhZXhwcgoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIFNpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuICogcmV0dmFsID0gW1NpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfYWV4cHJfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpLX1BMVVM0NyA9IG5pbDsKKyAgICAgICAgU2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybiAqIGF0b200NiA9IG5pbDsKKworICAgICAgICBTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuICogYXRvbTQ4ID0gbmlsOworCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX1BMVVM0N190cmVlPW5pbDsKKworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo4Mjo1OiAoIGF0b20gKCBLX1BMVVMgYXRvbSApKiApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUMuZzo4Mjo5OiBhdG9tICggS19QTFVTIGF0b20gKSogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYXRvbV9pbl9hZXhwcjY1M107CisgICAgICAgIGF0b200NiA9IFtzZWxmIGF0b21dOworICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKyAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOlthdG9tNDYgZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDEwPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExMF8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoTEExMF8wPT1LX1BMVVMpICkgeworICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODI6MTY6IEtfUExVUyBhdG9tIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtfUExVUzQ3PShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfUExVUyBGb2xsb3c6Rk9MTE9XX0tfUExVU19pbl9hZXhwcjY1N107IAorICAgICAgICAgICAgICAgICAgICBLX1BMVVM0N190cmVlID0gLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTpLX1BMVVM0N10gcmV0YWluXTsKKyAgICAgICAgICAgICAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OktfUExVUzQ3X3RyZWUgb2xkOnJvb3RfMF07CisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciBydWxlUmVmICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2F0b21faW5fYWV4cHI2NjBdOworICAgICAgICAgICAgICAgICAgICBhdG9tNDggPSBbc2VsZiBhdG9tXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpbYXRvbTQ4IGdldFRyZWVdIHRvVHJlZTpyb290XzBdOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDEwOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMTA6IDsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgYWV4cHIgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgYXRvbQorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODU6MTogYXRvbSA6ICggS19JRCB8IEtfSU5UIHwgJygnIGV4cHIgJyknIC0+IGV4cHIgKTsKKyAqLworLSAoU2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybiAqKSBhdG9tCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIC8qIEFTVCBydWxlRGVjbGFyYXRpb25zICovCisgICAgU2ltcGxlQ1BhcnNlcl9hdG9tX3JldHVybiAqIHJldHZhbCA9IFtTaW1wbGVDUGFyc2VyX2F0b21fcmV0dXJuIG5ld1NpbXBsZUNQYXJzZXJfYXRvbV9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKktfSUQ0OSA9IG5pbDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqS19JTlQ1MCA9IG5pbDsKKyAgICAgICAgQU5UTFJDb21tb25Ub2tlbiAqY2hhcl9saXRlcmFsNTEgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDUzID0gbmlsOworICAgICAgICBTaW1wbGVDUGFyc2VyX2V4cHJfcmV0dXJuICogZXhwcjUyID0gbmlsOworCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpLX0lENDlfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19JTlQ1MF90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWw1MV90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpjaGFyX2xpdGVyYWw1M190cmVlPW5pbDsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fMjIgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gMjIiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV8yNCA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiAyNCJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fZXhwciA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSBleHByIl0gcmV0YWluXTsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODY6NTogKCBLX0lEIHwgS19JTlQgfCAnKCcgZXhwciAnKScgLT4gZXhwciApIC8vcnVsZWJsb2NrCisgICAgICAgIE5TSW50ZWdlciBhbHQxMT0zOworICAgICAgICBzd2l0Y2ggKFtpbnB1dCBMQToxXSkgeworICAgICAgICAgICAgY2FzZSBLX0lEOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQxMT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjI6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogOworICAgICAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb246MTEgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgQHRocm93IG52YWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODY6NzogS19JRCAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgICAgICAgICAvKiBBU1RQYXJzZXIgdG9rZW5SZWYgKi8KKyAgICAgICAgICAgICAgICBLX0lENDk9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fYXRvbTY4MF07IAorICAgICAgICAgICAgICAgIEtfSUQ0OV90cmVlID0gLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgICAgICAgICAoQU5UTFJDb21tb25UcmVlICopW1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOktfSUQ0OV0gcmV0YWluXTsKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6S19JRDQ5X3RyZWUgIHRvVHJlZTpyb290XzBdOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQy5nOjg3Ojc6IEtfSU5UIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8qIEFTVFBhcnNlciB0b2tlblJlZiAqLworICAgICAgICAgICAgICAgIEtfSU5UNTA9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JTlQgRm9sbG93OkZPTExPV19LX0lOVF9pbl9hdG9tNjk0XTsgCisgICAgICAgICAgICAgICAgS19JTlQ1MF90cmVlID0gLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKyAgICAgICAgICAgICAgICAoQU5UTFJDb21tb25UcmVlICopW1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOktfSU5UNTBdIHJldGFpbl07CisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOktfSU5UNTBfdHJlZSAgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDLmc6ODg6NzogJygnIGV4cHIgJyknIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWw1MT0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToyMiBGb2xsb3c6Rk9MTE9XXzIyX2luX2F0b203MDhdOyAgCisgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fMjIgYWRkRWxlbWVudDpjaGFyX2xpdGVyYWw1MV07CisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19leHByX2luX2F0b203MTBdOworICAgICAgICAgICAgICAgIGV4cHI1MiA9IFtzZWxmIGV4cHJdOworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICAgICAgICAgIFtzdHJlYW1fZXhwciBhZGRFbGVtZW50OltleHByNTIgZ2V0VHJlZV1dOyAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgY2hhcl9saXRlcmFsNTM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6MjQgRm9sbG93OkZPTExPV18yNF9pbl9hdG9tNzEyXTsgIAorICAgICAgICAgICAgICAgICAgICBbc3RyZWFtXzI0IGFkZEVsZW1lbnQ6Y2hhcl9saXRlcmFsNTNdOworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisKKyAgICAgICAgICAgICAgICAvLyBBU1QgUkVXUklURQorICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzOiBleHByCisgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGFiZWxzOiAKKyAgICAgICAgICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgICAgICAgICAgLy8gdG9rZW4gbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHJ1bGUgbGlzdCBsYWJlbHM6IAorICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICAgICAgICAgIFtyZXR2YWwgc2V0VHJlZTpyb290XzBdOworCisgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gcmV0dmFsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAgICAgICAgIC8vIDg4OjIwOiAtPiBleHByCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9leHByIG5leHRUcmVlXSB0b1RyZWU6cm9vdF8wXTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworICAgICAgICBbc3RyZWFtXzIyIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtXzI0IHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX2V4cHIgcmVsZWFzZV07CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgYXRvbSAqLworCitAZW5kIC8qIGVuZCBvZiBTaW1wbGVDUGFyc2VyIGltcGxlbWVudGF0aW9uIGxpbmUgNjY5ICovCisKKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1RQLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNUUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTk0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNUUC5oCkBAIC0wLDAgKzEsMTAyIEBACisvLyAkQU5UTFIgMy4yIEF1ZyAyMywgMjAxMCAwNzo0ODowNiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nIDIwMTAtMDgtMjMgMDc6NTU6MDQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgImFudGxyMy5oIgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgS19JRCAxMAorI2RlZmluZSBUX18yNiAyNgorI2RlZmluZSBUX18yNSAyNQorI2RlZmluZSBUX18yNCAyNAorI2RlZmluZSBUX18yMyAyMworI2RlZmluZSBLX0VRRVEgMTYKKyNkZWZpbmUgVF9fMjIgMjIKKyNkZWZpbmUgS19JTlQgMTEKKyNkZWZpbmUgVF9fMjEgMjEKKyNkZWZpbmUgS19GT1IgMTQKKyNkZWZpbmUgRlVOQ19IRFIgNgorI2RlZmluZSBGVU5DX0RFRiA4CisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBLX0lOVF9UWVBFIDE5CisjZGVmaW5lIEZVTkNfREVDTCA3CisjZGVmaW5lIEFSR19ERUYgNQorI2RlZmluZSBXUyAyMAorI2RlZmluZSBLX0VRIDE1CisjZGVmaW5lIEJMT0NLIDkKKyNkZWZpbmUgS19MVCAxNworI2RlZmluZSBLX0NIQVIgMTIKKyNkZWZpbmUgS19WT0lEIDEzCisjZGVmaW5lIFZBUl9ERUYgNAorI2RlZmluZSBLX1BMVVMgMTgKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKK0BpbnRlcmZhY2UgU3ltYm9sc19TY29wZSA6IEFOVExSU3ltYm9sc1Njb3BlIHsgIC8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlRGVjbCAqLworQU5UTFJDb21tb25UcmVlICogdHJlZTsKK30KKy8qIHN0YXJ0IG9mIHByb3BlcnRpZXMgKi8KKworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXR0cmVlLCBzZXR0ZXI9c2V0dHJlZTopIEFOVExSQ29tbW9uVHJlZSAqIHRyZWU7CisKKy8qIGVuZCBwcm9wZXJ0aWVzICovCisKKysgKFN5bWJvbHNfU2NvcGUgKiluZXdTeW1ib2xzX1Njb3BlOworLyogc3RhcnQgb2YgaXRlcmF0ZWQgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovCisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldHRyZWU7CistICh2b2lkKXNldHRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFWYWw7CisKKy8qIEVuZCBvZiBpdGVyYXRlZCBnZXQgYW5kIHNldCBmdW5jdGlvbnMgKi8KKworQGVuZCAvKiBlbmQgb2YgU3ltYm9sc19TY29wZSBpbnRlcmZhY2UgKi8KKworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKK0BpbnRlcmZhY2UgU2ltcGxlQ1RQX2V4cHJfcmV0dXJuIDpBTlRMUlRyZWVSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKyAvLyBzdGFydCBvZiBtZW1WYXJzKCkKK30KKworLy8gc3RhcnQgcHJvcGVydGllcworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFNpbXBsZUNUUF9leHByX3JldHVybiAqKW5ld1NpbXBsZUNUUF9leHByX3JldHVybjsKKy8vIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcworICAvLyBtZXRob2RzRGVjbAorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCitAaW50ZXJmYWNlIFNpbXBsZUNUUCA6IEFOVExSVHJlZVBhcnNlciB7IC8vIGxpbmUgNTI5CisvLyBzdGFydCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhcgorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KK0FOVExSU3ltYm9sU3RhY2sgKmdTdGFjazsKK1N5bWJvbHNfU2NvcGUgKlN5bWJvbHNfc2NvcGU7CisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZW1WYXJzCisvLyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIKKworCisvLyBTdGFydCBvZiBtZW1WYXJzCisKKyB9CisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZXRob2RzRGVjbAorCisKKy0gKHZvaWQpcHJvZ3JhbTsgCistICh2b2lkKWRlY2xhcmF0aW9uOyAKKy0gKHZvaWQpdmFyaWFibGU7IAorLSAodm9pZClkZWNsYXJhdG9yOyAKKy0gKHZvaWQpZnVuY3Rpb25IZWFkZXI7IAorLSAodm9pZClmb3JtYWxQYXJhbWV0ZXI7IAorLSAodm9pZCl0eXBlOyAKKy0gKHZvaWQpYmxvY2s7IAorLSAodm9pZClzdGF0OyAKKy0gKHZvaWQpZm9yU3RhdDsgCistIChTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKilleHByOyAKKy0gKHZvaWQpYXRvbTsgCisKKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1RQIGludGVyZmFjZSAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDVFAuamF2YSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1RQLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzY2NjMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1RQLmphdmEKQEAgLTAsMCArMSw4NTIgQEAKKy8vICRBTlRMUiAzLjIgQXVnIDEzLCAyMDEwIDE5OjQxOjI1IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmcgMjAxMC0wOC0xMyAxOTo0MjoxMworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLio7aW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgU2ltcGxlQ1RQIGV4dGVuZHMgVHJlZVBhcnNlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJWQVJfREVGIiwgIkFSR19ERUYiLCAiRlVOQ19IRFIiLCAiRlVOQ19ERUNMIiwgIkZVTkNfREVGIiwgIkJMT0NLIiwgIklEIiwgIkVRIiwgIklOVCIsICJGT1IiLCAiSU5UX1RZUEUiLCAiQ0hBUiIsICJWT0lEIiwgIkVRRVEiLCAiTFQiLCAiUExVUyIsICJXUyIsICInOyciLCAiJygnIiwgIicsJyIsICInKSciLCAiJ3snIiwgIid9JyIKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExUPTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQVI9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfSERSPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVGPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RZUEU9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTkNfREVDTD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSR19ERUY9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUz0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DSz05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVM9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9JRD0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUT0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVJfREVGPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVFFUT0xNzsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworCisgICAgICAgIHB1YmxpYyBTaW1wbGVDVFAoVHJlZU5vZGVTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFNpbXBsZUNUUChUcmVlTm9kZVN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBTaW1wbGVDVFAudG9rZW5OYW1lczsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmciOyB9CisKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJwcm9ncmFtIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6ODoxOiBwcm9ncmFtIDogKCBkZWNsYXJhdGlvbiApKyA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcHJvZ3JhbSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjk6NTogKCAoIGRlY2xhcmF0aW9uICkrICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6OTo5OiAoIGRlY2xhcmF0aW9uICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjk6OTogKCBkZWNsYXJhdGlvbiApKworICAgICAgICAgICAgaW50IGNudDE9MDsKKyAgICAgICAgICAgIGxvb3AxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMD09VkFSX0RFRnx8KExBMV8wPj1GVU5DX0RFQ0wgJiYgTEExXzA8PUZVTkNfREVGKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6OTo5OiBkZWNsYXJhdGlvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW00Myk7CisgICAgICAgICAgICAJICAgIGRlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDEgPj0gMSApIGJyZWFrIGxvb3AxOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigxLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDErKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicHJvZ3JhbSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJkZWNsYXJhdGlvbiIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjEyOjE6IGRlY2xhcmF0aW9uIDogKCB2YXJpYWJsZSB8IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTM6NTogKCB2YXJpYWJsZSB8IF4oIEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlciApIHwgXiggRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2sgKSApCisgICAgICAgICAgICBpbnQgYWx0Mj0zOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIFZBUl9ERUY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZVTkNfREVDTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mj0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlVOQ19ERUY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDIsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTM6OTogdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjYzKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTQ6OTogXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxGVU5DX0RFQ0wsRk9MTE9XX0ZVTkNfREVDTF9pbl9kZWNsYXJhdGlvbjc0KTsgCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb243Nik7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSGVhZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjE1Ojk6IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxGVU5DX0RFRixGT0xMT1dfRlVOQ19ERUZfaW5fZGVjbGFyYXRpb244OCk7IAorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uOTApOworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkhlYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjkyKTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJkZWNsYXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJ2YXJpYWJsZSIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjE4OjE6IHZhcmlhYmxlIDogXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgdmFyaWFibGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoxOTo1OiAoIF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgKQorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoxOTo5OiBeKCBWQVJfREVGIHR5cGUgZGVjbGFyYXRvciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaChpbnB1dCxWQVJfREVGLEZPTExPV19WQVJfREVGX2luX3ZhcmlhYmxlMTEzKTsgCisKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTE1KTsKKyAgICAgICAgICAgIHR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTE3KTsKKyAgICAgICAgICAgIGRlY2xhcmF0b3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5VUCwgbnVsbCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInZhcmlhYmxlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImRlY2xhcmF0b3IiCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoyMjoxOiBkZWNsYXJhdG9yIDogSUQgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGRlY2xhcmF0b3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoyMzo1OiAoIElEICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MjM6OTogSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LElELEZPTExPV19JRF9pbl9kZWNsYXJhdG9yMTM3KTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZGVjbGFyYXRvciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJmdW5jdGlvbkhlYWRlciIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjI2OjE6IGZ1bmN0aW9uSGVhZGVyIDogXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBmdW5jdGlvbkhlYWRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjI3OjU6ICggXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6Mjc6OTogXiggRlVOQ19IRFIgdHlwZSBJRCAoIGZvcm1hbFBhcmFtZXRlciApKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaChpbnB1dCxGVU5DX0hEUixGT0xMT1dfRlVOQ19IRFJfaW5fZnVuY3Rpb25IZWFkZXIxNTgpOyAKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNjApOworICAgICAgICAgICAgdHlwZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LElELEZPTExPV19JRF9pbl9mdW5jdGlvbkhlYWRlcjE2Mik7IAorICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoyNzoyODogKCBmb3JtYWxQYXJhbWV0ZXIgKSsKKyAgICAgICAgICAgIGludCBjbnQzPTA7CisgICAgICAgICAgICBsb29wMzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mz0yOworICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PUFSR19ERUYpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjI3OjI4OiBmb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNjQpOworICAgICAgICAgICAgCSAgICBmb3JtYWxQYXJhbWV0ZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MyA+PSAxICkgYnJlYWsgbG9vcDM7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDMsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MysrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZnVuY3Rpb25IZWFkZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZm9ybWFsUGFyYW1ldGVyIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzA6MTogZm9ybWFsUGFyYW1ldGVyIDogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzE6NTogKCBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzE6OTogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goaW5wdXQsQVJHX0RFRixGT0xMT1dfQVJHX0RFRl9pbl9mb3JtYWxQYXJhbWV0ZXIxODYpOyAKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3R5cGVfaW5fZm9ybWFsUGFyYW1ldGVyMTg4KTsKKyAgICAgICAgICAgIHR5cGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjE5MCk7CisgICAgICAgICAgICBkZWNsYXJhdG9yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJmb3JtYWxQYXJhbWV0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAidHlwZSIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjM0OjE6IHR5cGUgOiAoICdpbnQnIHwgJ2NoYXInIHwgJ3ZvaWQnIHwgSUQgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzU6NTogKCAnaW50JyB8ICdjaGFyJyB8ICd2b2lkJyB8IElEICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT1JRHx8KGlucHV0LkxBKDEpPj1JTlRfVFlQRSAmJiBpbnB1dC5MQSgxKTw9Vk9JRCkgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInR5cGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiYmxvY2siCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0MToxOiBibG9jayA6IF4oIEJMT0NLICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGJsb2NrKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDI6NTogKCBeKCBCTE9DSyAoIHZhcmlhYmxlICkqICggc3RhdCApKiApICkKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDI6OTogXiggQkxPQ0sgKCB2YXJpYWJsZSApKiAoIHN0YXQgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goaW5wdXQsQkxPQ0ssRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjczKTsgCisKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PVRva2VuLkRPV04gKSB7CisgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjQyOjE3OiAoIHZhcmlhYmxlICkqCisgICAgICAgICAgICAgICAgbG9vcDQ6CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTRfMD09VkFSX0RFRikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgIAkgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0MjoxNzogdmFyaWFibGUKKyAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMjc1KTsKKyAgICAgICAgICAgICAgICAJICAgIHZhcmlhYmxlKCk7CisKKyAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjQyOjI3OiAoIHN0YXQgKSoKKyAgICAgICAgICAgICAgICBsb29wNToKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTVfMD49QkxPQ0sgJiYgTEE1XzA8PUZPUil8fChMQTVfMD49RVFFUSAmJiBMQTVfMDw9UExVUykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAJICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDI6Mjc6IHN0YXQKKyAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3N0YXRfaW5fYmxvY2syNzgpOworICAgICAgICAgICAgICAgIAkgICAgc3RhdCgpOworCisgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJibG9jayIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJzdGF0IgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDU6MTogc3RhdCA6ICggZm9yU3RhdCB8IGV4cHIgfCBibG9jayApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN0YXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0NTo1OiAoIGZvclN0YXQgfCBleHByIHwgYmxvY2sgKQorICAgICAgICAgICAgaW50IGFsdDY9MzsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBGT1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElEOgorICAgICAgICAgICAgY2FzZSBFUToKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgY2FzZSBFUUVROgorICAgICAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nj0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxPQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDY9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDYsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDU6NzogZm9yU3RhdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2ZvclN0YXRfaW5fc3RhdDI5Mik7CisgICAgICAgICAgICAgICAgICAgIGZvclN0YXQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDY6NzogZXhwcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fc3RhdDMwMCk7CisgICAgICAgICAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDc6NzogYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ibG9ja19pbl9zdGF0MzA4KTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2soKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJzdGF0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImZvclN0YXQiCisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo1MDoxOiBmb3JTdGF0IDogXiggJ2ZvcicgZXhwciBleHByIGV4cHIgYmxvY2sgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZm9yU3RhdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjUxOjU6ICggXiggJ2ZvcicgZXhwciBleHByIGV4cHIgYmxvY2sgKSApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjUxOjk6IF4oICdmb3InIGV4cHIgZXhwciBleHByIGJsb2NrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEZPUixGT0xMT1dfRk9SX2luX2ZvclN0YXQzMjgpOyAKKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDMzMCk7CisgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzMyKTsKKyAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2ZvclN0YXQzMzQpOworICAgICAgICAgICAgZXhwcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzMzYpOworICAgICAgICAgICAgYmxvY2soKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5VUCwgbnVsbCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImZvclN0YXQiCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGV4cHJfcmV0dXJuIGV4dGVuZHMgVHJlZVJ1bGVSZXR1cm5TY29wZSB7CisgICAgfTsKKworICAgIC8vICRBTlRMUiBzdGFydCAiZXhwciIKKyAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU0OjE6IGV4cHIgOiAoIF4oIEVRRVEgZXhwciBleHByICkgfCBeKCBMVCBleHByIGV4cHIgKSB8IF4oIFBMVVMgZXhwciBleHByICkgfCBeKCBFUSBJRCBlPSBleHByICkgfCBhdG9tICk7CisgICAgcHVibGljIGZpbmFsIFNpbXBsZUNUUC5leHByX3JldHVybiBleHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU2ltcGxlQ1RQLmV4cHJfcmV0dXJuIHJldHZhbCA9IG5ldyBTaW1wbGVDVFAuZXhwcl9yZXR1cm4oKTsKKyAgICAgICAgcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7CisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlIElEMT1udWxsOworICAgICAgICBTaW1wbGVDVFAuZXhwcl9yZXR1cm4gZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo1NDo1OiAoIF4oIEVRRVEgZXhwciBleHByICkgfCBeKCBMVCBleHByIGV4cHIgKSB8IF4oIFBMVVMgZXhwciBleHByICkgfCBeKCBFUSBJRCBlPSBleHByICkgfCBhdG9tICkKKyAgICAgICAgICAgIGludCBhbHQ3PTU7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgRVFFUToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVROgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJRDoKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA3LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU0Ojk6IF4oIEVRRVEgZXhwciBleHByICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxFUUVRLEZPTExPV19FUUVRX2luX2V4cHIzNTIpOyAKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IAorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2V4cHIzNTQpOworICAgICAgICAgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZXhwcjM1Nik7CisgICAgICAgICAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NTU6OTogXiggTFQgZXhwciBleHByICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxMVCxGT0xMT1dfTFRfaW5fZXhwcjM2OCk7IAorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX2V4cHJfaW5fZXhwcjM3MCk7CisgICAgICAgICAgICAgICAgICAgIGV4cHIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9leHByMzcyKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LCBUb2tlbi5VUCwgbnVsbCk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo1Njo5OiBeKCBQTFVTIGV4cHIgZXhwciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsUExVUyxGT0xMT1dfUExVU19pbl9leHByMzg0KTsgCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9leHByMzg2KTsKKyAgICAgICAgICAgICAgICAgICAgZXhwcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19leHByX2luX2V4cHIzODgpOworICAgICAgICAgICAgICAgICAgICBleHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU3Ojk6IF4oIEVRIElEIGU9IGV4cHIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LEVRLEZPTExPV19FUV9pbl9leHByNDAwKTsgCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLkRPV04sIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgSUQxPShBTlRMUkNvbW1vblRyZWUpbWF0Y2goaW5wdXQsSUQsRk9MTE9XX0lEX2luX2V4cHI0MDIpOyAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfZXhwcl9pbl9leHByNDA2KTsKKyAgICAgICAgICAgICAgICAgICAgZT1leHByKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgICBOU0xvZyhAImFzc2lnbmluZyAlQCB0byB2YXJpYWJsZSAlQCIsIChlIT1udWxsPyhpbnB1dC5nZXRUb2tlblN0cmVhbSgpLnRvU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KGUuc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgoZS5zdGFydCkpKTpudWxsKSwgKElEMSE9bnVsbD9JRDEuZ2V0VGV4dCgpOm51bGwpKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU4Ojk6IGF0b20KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19hdG9tX2luX2V4cHI0MTkpOworICAgICAgICAgICAgICAgICAgICBhdG9tKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZXhwciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJhdG9tIgorICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NjE6MTogYXRvbSA6ICggSUQgfCBJTlQgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhdG9tKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NjI6NTogKCBJRCB8IElOVCApCisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09SUR8fGlucHV0LkxBKDEpPT1JTlQgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImF0b20iCisKKyAgICAvLyBEZWxlZ2F0ZWQgcnVsZXMKKworCisgCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRpb25faW5fcHJvZ3JhbTQzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDE5Mkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfdmFyaWFibGVfaW5fZGVjbGFyYXRpb242MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0ZVTkNfREVDTF9pbl9kZWNsYXJhdGlvbjc0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb243NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0ZVTkNfREVGX2luX2RlY2xhcmF0aW9uODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA0TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjkwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDIwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYmxvY2tfaW5fZGVjbGFyYXRpb245MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX1ZBUl9ERUZfaW5fdmFyaWFibGUxMTMgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA0TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTE1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDQwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZGVjbGFyYXRvcl9pbl92YXJpYWJsZTExNyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0lEX2luX2RlY2xhcmF0b3IxMzcgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19GVU5DX0hEUl9pbl9mdW5jdGlvbkhlYWRlcjE1OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNjAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19JRF9pbl9mdW5jdGlvbkhlYWRlcjE2MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMjBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2Zvcm1hbFBhcmFtZXRlcl9pbl9mdW5jdGlvbkhlYWRlcjE2NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMjhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0FSR19ERUZfaW5fZm9ybWFsUGFyYW1ldGVyMTg2ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIxODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwNDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjE5MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3NldF9pbl90eXBlMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjczID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2syNzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMEUzRTE4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19zdGF0X2luX2Jsb2NrMjc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDBFM0UwOEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MjkyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9zdGF0MzAwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYmxvY2tfaW5fc3RhdDMwOCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0ZPUl9pbl9mb3JTdGF0MzI4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzMwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDBFMUMwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzMyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDBFMUMwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzM0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDIwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDMzNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0VRRVFfaW5fZXhwcjM1MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDRMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fZXhwcjM1NCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwRTFDMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fZXhwcjM1NiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0xUX2luX2V4cHIzNjggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA0TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHIzNzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMEUxQzAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHIzNzIgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19QTFVTX2luX2V4cHIzODQgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA0TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHIzODYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMEUxQzAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19leHByX2luX2V4cHIzODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDA4TH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19FUV9pbl9leHByNDAwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwNEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfSURfaW5fZXhwcjQwMiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwRTFDMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2V4cHJfaW5fZXhwcjQwNiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDhMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX2F0b21faW5fZXhwcjQxOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3NldF9pbl9hdG9tMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9vdXRwdXQxL1NpbXBsZUNUUC5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDVFAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWMwOTUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDVFAubQpAQCAtMCwwICsxLDEwNTkgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDMuMiBBdWcgMjMsIDIwMTAgMDc6NDg6MDYKKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMC0wOC0yMyAwNzo1NTowNAorICogICAgIC0gICAgICAgICAgIGZvciB0aGUgdHJlZSBwYXJzZXIgOiBTaW1wbGVDVFBUcmVlUGFyc2VyICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4gCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gJEFOVExSIDMuMiBBdWcgMjMsIDIwMTAgMDc6NDg6MDYgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZyAyMDEwLTA4LTIzIDA3OjU1OjA0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJTaW1wbGVDVFAuaCIKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisKKworI3ByYWdtYSBtYXJrIEJpdHNldHMKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01Nl9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDE5MkxMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNzY7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjc2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfRlVOQ19ERUNMX2luX2RlY2xhcmF0aW9uODc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19GVU5DX0RFQ0xfaW5fZGVjbGFyYXRpb244N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uODk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjg5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfRlVOQ19ERUZfaW5fZGVjbGFyYXRpb24xMDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19GVU5DX0RFRl9pbl9kZWNsYXJhdGlvbjEwMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTAzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMDNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAyMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjEwNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTA1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfVkFSX0RFRl9pbl92YXJpYWJsZTEyNjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX1ZBUl9ERUZfaW5fdmFyaWFibGUxMjZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDRMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV190eXBlX2luX3ZhcmlhYmxlMTI4Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTEyOF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMzA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTMwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTUwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTUwX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfRlVOQ19IRFJfaW5fZnVuY3Rpb25IZWFkZXIxNzE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19GVU5DX0hEUl9pbl9mdW5jdGlvbkhlYWRlcjE3MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNzM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMTczX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwNDAwTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjE3NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIxNzVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMjBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNzc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNzdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMjhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19BUkdfREVGX2luX2Zvcm1hbFBhcmFtZXRlcjE5OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0FSR19ERUZfaW5fZm9ybWFsUGFyYW1ldGVyMTk5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIyMDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjIwMV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMjAzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyMDNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zZXRfaW5fdHlwZTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19zZXRfaW5fdHlwZTBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19CTE9DS19pbl9ibG9jazI4NjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjg2X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2syODg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV192YXJpYWJsZV9pbl9ibG9jazI4OF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA3Q0UxOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3N0YXRfaW5fYmxvY2syOTE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19zdGF0X2luX2Jsb2NrMjkxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDdDRTA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzA1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzA1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZXhwcl9pbl9zdGF0MzEzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZXhwcl9pbl9zdGF0MzEzX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfYmxvY2tfaW5fc3RhdDMyMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2Jsb2NrX2luX3N0YXQzMjFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0ZPUl9pbl9mb3JTdGF0MzQxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDM0MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0M19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA3OEMwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA3OEMwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDIwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzNDk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19ibG9ja19pbl9mb3JTdGF0MzQ5X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA4TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfS19FUUVRX2luX2V4cHIzNjU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0VRRVFfaW5fZXhwcjM2NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjM2NzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjM2N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA3OEMwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjM2OTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjM2OV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfTFRfaW5fZXhwcjM4MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0tfTFRfaW5fZXhwcjM4MV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwNExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjM4MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjM4M19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDA3OEMwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2V4cHJfaW5fZXhwcjM4NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX2V4cHJfaW5fZXhwcjM4NV9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwOExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0tfUExVU19pbl9leHByMzk3Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfS19QTFVTX2luX2V4cHIzOTdfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDRMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2V4cHIzOTk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2V4cHIzOTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNzhDMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2V4cHI0MDE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2V4cHI0MDFfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0VRX2luX2V4cHI0MTM7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0VRX2luX2V4cHI0MTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDRMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19LX0lEX2luX2V4cHI0MTU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19LX0lEX2luX2V4cHI0MTVfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwNzhDMDBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19leHByX2luX2V4cHI0MTk7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19leHByX2luX2V4cHI0MTlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19hdG9tX2luX2V4cHI0MzI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19hdG9tX2luX2V4cHI0MzJfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zZXRfaW5fYXRvbTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV19zZXRfaW5fYXRvbTBfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CisKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworQGltcGxlbWVudGF0aW9uIFN5bWJvbHNfU2NvcGUgIC8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW1wbCAqLworLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTc1MCAqLworCitAc3ludGhlc2l6ZSB0cmVlOworKyAoU3ltYm9sc19TY29wZSAqKW5ld1N5bWJvbHNfU2NvcGUKK3sKKyAgICByZXR1cm4gW1tbU3ltYm9sc19TY29wZSBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKy8qIHN0YXJ0IG9mIGl0ZXJhdGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovCisKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldHRyZWUgeyByZXR1cm4oIHRyZWUgKTsgfQorCistICh2b2lkKXNldHRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFWYWwgeyB0cmVlID0gYVZhbDsgfQorCisKKworLyogRW5kIG9mIGl0ZXJhdGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovCisKK0BlbmQgLyogZW5kIG9mIFN5bWJvbHNfU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CitAaW1wbGVtZW50YXRpb24gU2ltcGxlQ1RQX2V4cHJfcmV0dXJuCisrIChTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKiluZXdTaW1wbGVDVFBfZXhwcl9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbU2ltcGxlQ1RQX2V4cHJfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKKworQGltcGxlbWVudGF0aW9uIFNpbXBsZUNUUCAgLy8gbGluZSA2MTAKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgICNwcmFnbWEgbWFyayBCaXRzZXRzCisgICAgRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01NiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01Nl9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3ZhcmlhYmxlX2luX2RlY2xhcmF0aW9uNzYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjc2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfRlVOQ19ERUNMX2luX2RlY2xhcmF0aW9uODcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19GVU5DX0RFQ0xfaW5fZGVjbGFyYXRpb244N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uODkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mdW5jdGlvbkhlYWRlcl9pbl9kZWNsYXJhdGlvbjg5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfRlVOQ19ERUZfaW5fZGVjbGFyYXRpb24xMDEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19GVU5DX0RFRl9pbl9kZWNsYXJhdGlvbjEwMV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTAzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZnVuY3Rpb25IZWFkZXJfaW5fZGVjbGFyYXRpb24xMDNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19ibG9ja19pbl9kZWNsYXJhdGlvbjEwNSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTA1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfVkFSX0RFRl9pbl92YXJpYWJsZTEyNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX1ZBUl9ERUZfaW5fdmFyaWFibGUxMjZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV190eXBlX2luX3ZhcmlhYmxlMTI4ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfdHlwZV9pbl92YXJpYWJsZTEyOF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMzAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19kZWNsYXJhdG9yX2luX3ZhcmlhYmxlMTMwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTUwID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19JRF9pbl9kZWNsYXJhdG9yMTUwX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfRlVOQ19IRFJfaW5fZnVuY3Rpb25IZWFkZXIxNzEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19GVU5DX0hEUl9pbl9mdW5jdGlvbkhlYWRlcjE3MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3R5cGVfaW5fZnVuY3Rpb25IZWFkZXIxNzMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Z1bmN0aW9uSGVhZGVyMTczX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19JRF9pbl9mdW5jdGlvbkhlYWRlcjE3NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIxNzVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNzcgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19mb3JtYWxQYXJhbWV0ZXJfaW5fZnVuY3Rpb25IZWFkZXIxNzdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19BUkdfREVGX2luX2Zvcm1hbFBhcmFtZXRlcjE5OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0FSR19ERUZfaW5fZm9ybWFsUGFyYW1ldGVyMTk5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdHlwZV9pbl9mb3JtYWxQYXJhbWV0ZXIyMDEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjIwMV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2RlY2xhcmF0b3JfaW5fZm9ybWFsUGFyYW1ldGVyMjAzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbGFyYXRvcl9pbl9mb3JtYWxQYXJhbWV0ZXIyMDNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19zZXRfaW5fdHlwZTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zZXRfaW5fdHlwZTBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19CTE9DS19pbl9ibG9jazI4NiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0JMT0NLX2luX2Jsb2NrMjg2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdmFyaWFibGVfaW5fYmxvY2syODggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV192YXJpYWJsZV9pbl9ibG9jazI4OF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3N0YXRfaW5fYmxvY2syOTEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zdGF0X2luX2Jsb2NrMjkxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzA1ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZm9yU3RhdF9pbl9zdGF0MzA1X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfZXhwcl9pbl9zdGF0MzEzID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZXhwcl9pbl9zdGF0MzEzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfYmxvY2tfaW5fc3RhdDMyMSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2Jsb2NrX2luX3N0YXQzMjFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0ZPUl9pbl9mb3JTdGF0MzQxID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDM0MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0M19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2Jsb2NrX2luX2ZvclN0YXQzNDkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19ibG9ja19pbl9mb3JTdGF0MzQ5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfS19FUUVRX2luX2V4cHIzNjUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0VRRVFfaW5fZXhwcjM2NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM2NyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM2N19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM2OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM2OV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfTFRfaW5fZXhwcjM4MSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0tfTFRfaW5fZXhwcjM4MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM4MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM4M19kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX2V4cHJfaW5fZXhwcjM4NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2V4cHJfaW5fZXhwcjM4NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0tfUExVU19pbl9leHByMzk3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfS19QTFVTX2luX2V4cHIzOTdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2V4cHIzOTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2V4cHIzOTlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2V4cHI0MDEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2V4cHI0MDFfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0VRX2luX2V4cHI0MTMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0VRX2luX2V4cHI0MTNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19LX0lEX2luX2V4cHI0MTUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19LX0lEX2luX2V4cHI0MTVfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19leHByX2luX2V4cHI0MTkgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19leHByX2luX2V4cHI0MTlfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19hdG9tX2luX2V4cHI0MzIgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19hdG9tX2luX2V4cHI0MzJfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19zZXRfaW5fYXRvbTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zZXRfaW5fYXRvbTBfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworCisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0VG9rZW5OYW1lczpbW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6QCI8aW52YWxpZD4iLCBAIjxFT1I+IiwgQCI8RE9XTj4iLCBAIjxVUD4iLCAKKyBAIlZBUl9ERUYiLCBAIkFSR19ERUYiLCBAIkZVTkNfSERSIiwgQCJGVU5DX0RFQ0wiLCBAIkZVTkNfREVGIiwgQCJCTE9DSyIsIAorIEAiS19JRCIsIEAiS19JTlQiLCBAIktfQ0hBUiIsIEAiS19WT0lEIiwgQCJLX0ZPUiIsIEAiS19FUSIsIEAiS19FUUVRIiwgCisgQCJLX0xUIiwgQCJLX1BMVVMiLCBAIktfSU5UX1RZUEUiLCBAIldTIiwgQCInOyciLCBAIicoJyIsIEAiJywnIiwgQCInKSciLCAKKyBAIid7JyIsIEAiJ30nIiwgbmlsXSByZXRhaW5dXTsKK30KKworKyAoU2ltcGxlQ1RQICopbmV3U2ltcGxlQ1RQOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhU3RyZWFtCit7CisKKyAgICByZXR1cm4gW1tTaW1wbGVDVFAgYWxsb2NdIGluaXRXaXRoU3RyZWFtOmFTdHJlYW1dOworCit9CisKKworLSAoaWQpIGluaXRXaXRoU3RyZWFtOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhU3RyZWFtCit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RyZWFtOmFTdHJlYW0gU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjEyKzFdIHJldGFpbl1dKSAhPSBuaWwpIHsKKworCisKKyAgICAgICAgLyogc3RhcnQgb2YgYWN0aW9ucy1hY3Rpb25TY29wZS1pbml0ICovCisgICAgICAgIC8qIHN0YXJ0IG9mIGluaXQgKi8KKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbU3ltYm9sc19zY29wZSByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisvLyBzdGFydCBhY3Rpb25zLmFjdGlvblNjb3BlLm1ldGhvZHMKKy8vIHN0YXJ0IG1ldGhvZHMoKQorLy8gc3RhcnQgcnVsZXMKKy8qCisgKiAkQU5UTFIgc3RhcnQgcHJvZ3JhbQorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoxMzoxOiBwcm9ncmFtIDogKCBkZWNsYXJhdGlvbiApKyA7CisgKi8KKy0gKHZvaWQpIHByb2dyYW0KK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTQ6NTogKCAoIGRlY2xhcmF0aW9uICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTQ6OTogKCBkZWNsYXJhdGlvbiApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjE0Ojk6ICggZGVjbGFyYXRpb24gKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDE9MDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDE9MjsKKyAgICAgICAgICAgIE5TSW50ZWdlciBMQTFfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgIGlmICggKExBMV8wPT1WQVJfREVGfHwoTEExXzA+PUZVTkNfREVDTCAmJiBMQTFfMDw9RlVOQ19ERUYpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjE0Ojk6IGRlY2xhcmF0aW9uIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0aW9uX2luX3Byb2dyYW01Nl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGRlY2xhcmF0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDEgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0gW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTdHJlYW06aW5wdXQgZGVjaXNpb25OdW1iZXI6MV07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQxKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIHByb2dyYW0gKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbGFyYXRpb24KKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTc6MTogZGVjbGFyYXRpb24gOiAoIHZhcmlhYmxlIHwgXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkgfCBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApICk7CisgKi8KKy0gKHZvaWQpIGRlY2xhcmF0aW9uCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjE4OjU6ICggdmFyaWFibGUgfCBeKCBGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIgKSB8IF4oIEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrICkgKSAvL3J1bGVibG9jaworICAgICAgICBOU0ludGVnZXIgYWx0Mj0zOworICAgICAgICBzd2l0Y2ggKFtpbnB1dCBMQToxXSkgeworICAgICAgICAgICAgY2FzZSBWQVJfREVGOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZVTkNfREVDTDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGVU5DX0RFRjogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyPTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uOjIgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgQHRocm93IG52YWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjE4Ojk6IHZhcmlhYmxlIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV192YXJpYWJsZV9pbl9kZWNsYXJhdGlvbjc2XTsKKyAgICAgICAgICAgICAgICBbc2VsZiB2YXJpYWJsZV07CisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MTk6OTogXiggRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyICkgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpGVU5DX0RFQ0wgRm9sbG93OkZPTExPV19GVU5DX0RFQ0xfaW5fZGVjbGFyYXRpb244N107ICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTiBGb2xsb3c6bmlsXTsgCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uODldOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBmdW5jdGlvbkhlYWRlcl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUCBGb2xsb3c6bmlsXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoyMDo5OiBeKCBGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jayApIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6RlVOQ19ERUYgRm9sbG93OkZPTExPV19GVU5DX0RFRl9pbl9kZWNsYXJhdGlvbjEwMV07ICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTiBGb2xsb3c6bmlsXTsgCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Z1bmN0aW9uSGVhZGVyX2luX2RlY2xhcmF0aW9uMTAzXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZnVuY3Rpb25IZWFkZXJdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2Jsb2NrX2luX2RlY2xhcmF0aW9uMTA1XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgYmxvY2tdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlVVAgRm9sbG93Om5pbF07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xhcmF0aW9uICovCisvKgorICogJEFOVExSIHN0YXJ0IHZhcmlhYmxlCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjIzOjE6IHZhcmlhYmxlIDogXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSA7CisgKi8KKy0gKHZvaWQpIHZhcmlhYmxlCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjI0OjU6ICggXiggVkFSX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjI0Ojk6IF4oIFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yICkgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlZBUl9ERUYgRm9sbG93OkZPTExPV19WQVJfREVGX2luX3ZhcmlhYmxlMTI2XTsgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTiBGb2xsb3c6bmlsXTsgCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX3ZhcmlhYmxlMTI4XTsKKyAgICAgICAgICAgIFtzZWxmIHR5cGVdOworICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2RlY2xhcmF0b3JfaW5fdmFyaWFibGUxMzBdOworICAgICAgICAgICAgW3NlbGYgZGVjbGFyYXRvcl07CisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUCBGb2xsb3c6bmlsXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgdmFyaWFibGUgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgZGVjbGFyYXRvcgorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzoyNzoxOiBkZWNsYXJhdG9yIDogS19JRCA7CisgKi8KKy0gKHZvaWQpIGRlY2xhcmF0b3IKK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6Mjg6NTogKCBLX0lEICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6Mjg6OTogS19JRCAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fZGVjbGFyYXRvcjE1MF07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xhcmF0b3IgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgZnVuY3Rpb25IZWFkZXIKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzE6MTogZnVuY3Rpb25IZWFkZXIgOiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSA7CisgKi8KKy0gKHZvaWQpIGZ1bmN0aW9uSGVhZGVyCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjMyOjU6ICggXiggRlVOQ19IRFIgdHlwZSBLX0lEICggZm9ybWFsUGFyYW1ldGVyICkrICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzozMjo5OiBeKCBGVU5DX0hEUiB0eXBlIEtfSUQgKCBmb3JtYWxQYXJhbWV0ZXIgKSsgKSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6RlVOQ19IRFIgRm9sbG93OkZPTExPV19GVU5DX0hEUl9pbl9mdW5jdGlvbkhlYWRlcjE3MV07ICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdHlwZV9pbl9mdW5jdGlvbkhlYWRlcjE3M107CisgICAgICAgICAgICBbc2VsZiB0eXBlXTsKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19JRCBGb2xsb3c6Rk9MTE9XX0tfSURfaW5fZnVuY3Rpb25IZWFkZXIxNzVdOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzozMjozMDogKCBmb3JtYWxQYXJhbWV0ZXIgKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgICAgIE5TSW50ZWdlciBjbnQzPTA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDM9MjsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PUFSR19ERUYpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzozMjozMDogZm9ybWFsUGFyYW1ldGVyIC8vIGFsdAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZm9ybWFsUGFyYW1ldGVyX2luX2Z1bmN0aW9uSGVhZGVyMTc3XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGZvcm1hbFBhcmFtZXRlcl07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY250MyA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AzOworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9IFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoU3RyZWFtOmlucHV0IGRlY2lzaW9uTnVtYmVyOjNdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MysrOworICAgICAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgICAgIGxvb3AzOiA7CisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUCBGb2xsb3c6bmlsXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZnVuY3Rpb25IZWFkZXIgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgZm9ybWFsUGFyYW1ldGVyCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjM1OjE6IGZvcm1hbFBhcmFtZXRlciA6IF4oIEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yICkgOworICovCistICh2b2lkKSBmb3JtYWxQYXJhbWV0ZXIKK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzY6NTogKCBeKCBBUkdfREVGIHR5cGUgZGVjbGFyYXRvciApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6MzY6OTogXiggQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IgKSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QVJHX0RFRiBGb2xsb3c6Rk9MTE9XX0FSR19ERUZfaW5fZm9ybWFsUGFyYW1ldGVyMTk5XTsgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTiBGb2xsb3c6bmlsXTsgCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV190eXBlX2luX2Zvcm1hbFBhcmFtZXRlcjIwMV07CisgICAgICAgICAgICBbc2VsZiB0eXBlXTsKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsYXJhdG9yX2luX2Zvcm1hbFBhcmFtZXRlcjIwM107CisgICAgICAgICAgICBbc2VsZiBkZWNsYXJhdG9yXTsKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQIEZvbGxvdzpuaWxdOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBmb3JtYWxQYXJhbWV0ZXIgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgdHlwZQorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzozOToxOiB0eXBlIDogKCBLX0lOVCB8IEtfQ0hBUiB8IEtfVk9JRCB8IEtfSUQgKTsKKyAqLworLSAodm9pZCkgdHlwZQoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0MDo1OiAoIEtfSU5UIHwgS19DSEFSIHwgS19WT0lEIHwgS19JRCApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOiAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gS19JRCkgJiYgKFtpbnB1dCBMQToxXSA8PSBLX1ZPSUQpKSkgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgW3N0YXRlIHNldElzRXJyb3JSZWNvdmVyeTpOT107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFNldDpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgIH0KKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgdHlwZSAqLworLyoKKyAqICRBTlRMUiBzdGFydCBibG9jaworICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0NjoxOiBibG9jayA6IF4oIEJMT0NLICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgOworICovCistICh2b2lkKSBibG9jaworeworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0Nzo1OiAoIF4oIEJMT0NLICggdmFyaWFibGUgKSogKCBzdGF0ICkqICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo0Nzo5OiBeKCBCTE9DSyAoIHZhcmlhYmxlICkqICggc3RhdCApKiApIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpCTE9DSyBGb2xsb3c6Rk9MTE9XX0JMT0NLX2luX2Jsb2NrMjg2XTsgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICBpZiAoIFtpbnB1dCBMQToxXSA9PSBBTlRMUlRva2VuVHlwZURPV04gKSB7CisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgYWx0ND0yOworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTRfMCA9IFtpbnB1dCBMQToxXTsKKyAgICAgICAgICAgICAgICBpZiAoIChMQTRfMD09VkFSX0RFRikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjQ3OjE3OiB2YXJpYWJsZSAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3ZhcmlhYmxlX2luX2Jsb2NrMjg4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHZhcmlhYmxlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICAgICAgbG9vcDQ6IDsKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDU9MjsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEE1XzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICAgICAgaWYgKCAoKExBNV8wPj1CTE9DSyAmJiBMQTVfMDw9S19JTlQpfHwoTEE1XzA+PUtfRk9SICYmIExBNV8wPD1LX1BMVVMpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NDc6Mjc6IHN0YXQgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19zdGF0X2luX2Jsb2NrMjkxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHN0YXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3A1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgICAgICBsb29wNTogOworICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlVVAgRm9sbG93Om5pbF07IAorICAgICAgICB9ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgYmxvY2sgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgc3RhdAorICogL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo1MDoxOiBzdGF0IDogKCBmb3JTdGF0IHwgZXhwciB8IGJsb2NrICk7CisgKi8KKy0gKHZvaWQpIHN0YXQKK3sKKyAgICAvKiBydWxlU2NvcGVTZXRVcCAqLworCisgICAgQHRyeSB7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NTA6NTogKCBmb3JTdGF0IHwgZXhwciB8IGJsb2NrICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDY9MzsKKyAgICAgICAgc3dpdGNoIChbaW5wdXQgTEE6MV0pIHsKKyAgICAgICAgICAgIGNhc2UgS19GT1I6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgY2FzZSBLX0VROiA7CisgICAgICAgICAgICBjYXNlIEtfRVFFUTogOworICAgICAgICAgICAgY2FzZSBLX0xUOiA7CisgICAgICAgICAgICBjYXNlIEtfUExVUzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTE9DSzogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uOjYgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgQHRocm93IG52YWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjUwOjc6IGZvclN0YXQgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2ZvclN0YXRfaW5fc3RhdDMwNV07CisgICAgICAgICAgICAgICAgW3NlbGYgZm9yU3RhdF07CisgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NTE6NzogZXhwciAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9zdGF0MzEzXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBleHByXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo1Mjo3OiBibG9jayAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYmxvY2tfaW5fc3RhdDMyMV07CisgICAgICAgICAgICAgICAgW3NlbGYgYmxvY2tdOworICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBzdGF0ICovCisvKgorICogJEFOVExSIHN0YXJ0IGZvclN0YXQKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NTU6MTogZm9yU3RhdCA6IF4oIEtfRk9SIGV4cHIgZXhwciBleHByIGJsb2NrICkgOworICovCistICh2b2lkKSBmb3JTdGF0Cit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU2OjU6ICggXiggS19GT1IgZXhwciBleHByIGV4cHIgYmxvY2sgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU2Ojk6IF4oIEtfRk9SIGV4cHIgZXhwciBleHByIGJsb2NrICkgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfRk9SIEZvbGxvdzpGT0xMT1dfS19GT1JfaW5fZm9yU3RhdDM0MV07ICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9mb3JTdGF0MzQzXTsKKyAgICAgICAgICAgIFtzZWxmIGV4cHJdOworICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZm9yU3RhdDM0NV07CisgICAgICAgICAgICBbc2VsZiBleHByXTsKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19leHByX2luX2ZvclN0YXQzNDddOworICAgICAgICAgICAgW3NlbGYgZXhwcl07CisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYmxvY2tfaW5fZm9yU3RhdDM0OV07CisgICAgICAgICAgICBbc2VsZiBibG9ja107CisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUCBGb2xsb3c6bmlsXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgZm9yU3RhdCAqLworLyoKKyAqICRBTlRMUiBzdGFydCBleHByCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU5OjE6IGV4cHIgOiAoIF4oIEtfRVFFUSBleHByIGV4cHIgKSB8IF4oIEtfTFQgZXhwciBleHByICkgfCBeKCBLX1BMVVMgZXhwciBleHByICkgfCBeKCBLX0VRIEtfSUQgZT0gZXhwciApIHwgYXRvbSApOworICovCistIChTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKikgZXhwcgoreworICAgIC8qIHJ1bGVTY29wZVNldFVwICovCisKKyAgICBTaW1wbGVDVFBfZXhwcl9yZXR1cm4gKiByZXR2YWwgPSBbU2ltcGxlQ1RQX2V4cHJfcmV0dXJuIG5ld1NpbXBsZUNUUF9leHByX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisgICAgQHRyeSB7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqS19JRDEgPSBuaWw7CisgICAgICAgIFNpbXBsZUNUUF9leHByX3JldHVybiAqIGUgPSBuaWw7CisKKworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU5OjU6ICggXiggS19FUUVRIGV4cHIgZXhwciApIHwgXiggS19MVCBleHByIGV4cHIgKSB8IF4oIEtfUExVUyBleHByIGV4cHIgKSB8IF4oIEtfRVEgS19JRCBlPSBleHByICkgfCBhdG9tICkgLy9ydWxlYmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGFsdDc9NTsKKyAgICAgICAgc3dpdGNoIChbaW5wdXQgTEE6MV0pIHsKKyAgICAgICAgICAgIGNhc2UgS19FUUVROiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtfTFQ6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19QTFVTOiA7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtfRVE6IDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS19JRDogOworICAgICAgICAgICAgY2FzZSBLX0lOVDogOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uOjcgc3RhdGU6MCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgQHRocm93IG52YWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjU5Ojk6IF4oIEtfRVFFUSBleHByIGV4cHIgKSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOktfRVFFUSBGb2xsb3c6Rk9MTE9XX0tfRVFFUV9pbl9leHByMzY1XTsgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9leHByMzY3XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZXhwcl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9leHByMzY5XTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgZXhwcl07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUCBGb2xsb3c6bmlsXTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOiA7CisgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy9zaW1wbGVjVHJlZVBhcnNlci9TaW1wbGVDVFAuZzo2MDo5OiBeKCBLX0xUIGV4cHIgZXhwciApIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19MVCBGb2xsb3c6Rk9MTE9XX0tfTFRfaW5fZXhwcjM4MV07ICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTiBGb2xsb3c6bmlsXTsgCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZXhwcjM4M107CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGV4cHJdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX2V4cHJfaW5fZXhwcjM4NV07CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIGV4cHJdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlVVAgRm9sbG93Om5pbF07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NjE6OTogXiggS19QTFVTIGV4cHIgZXhwciApIC8vIGFsdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6S19QTFVTIEZvbGxvdzpGT0xMT1dfS19QTFVTX2luX2V4cHIzOTddOyAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19leHByX2luX2V4cHIzOTldOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBleHByXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19leHByX2luX2V4cHI0MDFdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBleHByXTsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworICAgICAgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworCisgICAgICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQIEZvbGxvdzpuaWxdOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjYyOjk6IF4oIEtfRVEgS19JRCBlPSBleHByICkgLy8gYWx0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0VRIEZvbGxvdzpGT0xMT1dfS19FUV9pbl9leHByNDEzXTsgICAvKiBlbGVtZW50KCkgKi8KKworICAgICAgICAgICAgICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVET1dOIEZvbGxvdzpuaWxdOyAKKyAgICAgICAgICAgICAgICAgICAgS19JRDE9KEFOVExSQ29tbW9uVHJlZSAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpLX0lEIEZvbGxvdzpGT0xMT1dfS19JRF9pbl9leHByNDE1XTsgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfZXhwcl9pbl9leHByNDE5XTsKKyAgICAgICAgICAgICAgICAgICAgZSA9IFtzZWxmIGV4cHJdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudCgpICovCisKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlVVAgRm9sbG93Om5pbF07ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIE5TTG9nKEAiYXNzaWduaW5nICVAIHRvIHZhcmlhYmxlICVAIiwgKGUhPW5pbD9bW2lucHV0IGdldFRva2VuU3RyZWFtXSB0b1N0cmluZ0Zyb21TdGFydDpbW2lucHV0IGdldFRyZWVBZGFwdG9yXSBnZXRUb2tlblN0YXJ0SW5kZXg6W2UgZ2V0U3RhcnRdXQorICAgICAgICAgICAgICAgICAgICAgICAgIFRvRW5kOltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RvcEluZGV4OltlIGdldFN0YXJ0XV1dOm5pbCksIChLX0lEMSE9bmlsP1tLX0lEMSBnZXRUZXh0XTowKSk7ICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1IDogOworICAgICAgICAgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6NjM6OTogYXRvbSAvLyBhbHQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfYXRvbV9pbl9leHByNDMyXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBhdG9tXTsKKyAgICAgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgZXhwciAqLworLyoKKyAqICRBTlRMUiBzdGFydCBhdG9tCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjY2OjE6IGF0b20gOiAoIEtfSUQgfCBLX0lOVCApOworICovCistICh2b2lkKSBhdG9tCit7CisgICAgLyogcnVsZVNjb3BlU2V0VXAgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL1NpbXBsZUNUUC5nOjY3OjU6ICggS19JRCB8IEtfSU5UICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvU2ltcGxlQ1RQLmc6IC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSBLX0lEKSAmJiAoW2lucHV0IExBOjFdIDw9IEtfSU5UKSkpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgIFtzdGF0ZSBzZXRJc0Vycm9yUmVjb3Zlcnk6Tk9dOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTZXQ6bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICB9CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfSAgICBAZmluYWxseSB7CisgICAgfQorICAgIHJldHVybiA7Cit9CisvKiAkQU5UTFIgZW5kIGF0b20gKi8KKworQGVuZCAvKiBlbmQgb2YgU2ltcGxlQ1RQIGltcGxlbWVudGF0aW9uIGxpbmUgNjY5ICovCisKKworLyogRW5kIG9mIGNvZGUKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1RQLnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3NpbXBsZWNUcmVlUGFyc2VyL291dHB1dDEvU2ltcGxlQ1RQLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDA2ZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvc2ltcGxlY1RyZWVQYXJzZXIvb3V0cHV0MS9TaW1wbGVDVFAudG9rZW5zCkBAIC0wLDAgKzEsMjkgQEAKK0tfSUQ9MTAKK1RfXzI2PTI2CitUX18yNT0yNQorVF9fMjQ9MjQKK1RfXzIzPTIzCitLX0VRRVE9MTYKK1RfXzIyPTIyCitLX0lOVD0xMQorVF9fMjE9MjEKK0tfRk9SPTE0CitGVU5DX0hEUj02CitGVU5DX0RFRj04CitLX0lOVF9UWVBFPTE5CitGVU5DX0RFQ0w9NworQVJHX0RFRj01CitXUz0yMAorS19FUT0xNQorQkxPQ0s9OQorS19MVD0xNworS19DSEFSPTEyCitLX1ZPSUQ9MTMKK1ZBUl9ERUY9NAorS19QTFVTPTE4CisnOyc9MjEKKyd9Jz0yNgorJygnPTIyCisnLCc9MjMKKycpJz0yNAorJ3snPTI1CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmcuZyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZy5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwYTI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmcuZwpAQCAtMCwwICsxLDIyIEBACitncmFtbWFyIExhbmc7CitvcHRpb25zIHsKKwlvdXRwdXQ9QVNUOworCWxhbmd1YWdlID0gT2JqQzsKKwlBU1RMYWJlbFR5cGU9QU5UTFJDb21tb25UcmVlOworfQorCit0b2tlbnMge0RFQ0w7fSAvLyBhbiBpbWFnaW5hcnkgbm9kZQorCitzdGFydCA6IGRlY2wgOworCitkZWNsIDogdHlwZSBJRCAnOycgLT4gXihERUNMIHR5cGUgSUQpCisgICAgIDsKK3R5cGUgOiBJTlRUWVBFICAvLyBhdXRvbWF0aWMgdHJlZSBjb25zdHJ1Y3Rpb24gYnVpbGRzIGEgbm9kZSBmb3IgdGhpcyBydWxlCisgICAgIHwgRkxPQVRUWVBFCisgICAgIDsKKworSU5UVFlQRSA6ICdpbnQnIDsKK0ZMT0FUVFlQRSA6ICdmbG9hdCcgOworSUQgOiAnYScuLid6JysgOworSU5UIDogJzAnLi4nOScrIDsKK1dTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nLnRva2VucyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZy50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1ZDE0OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZy50b2tlbnMKQEAgLTAsMCArMSw4IEBACitUX18xMD0xMAorREVDTD00CitGTE9BVFRZUEU9NQorSUQ9NgorSU5UPTcKK0lOVFRZUEU9OAorV1M9OQorJzsnPTEwCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdEdW1wRGVjbC5nIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nRHVtcERlY2wuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wN2QzZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nRHVtcERlY2wuZwpAQCAtMCwwICsxLDE3IEBACit0cmVlIGdyYW1tYXIgTGFuZ0R1bXBEZWNsOworb3B0aW9ucyB7CisgICAgdG9rZW5Wb2NhYj1MYW5nOworCWxhbmd1YWdlID0gT2JqQzsKKyAgICBBU1RMYWJlbFR5cGUgPSBBTlRMUkNvbW1vblRyZWU7Cit9CisKK2RlY2wgOiBeKERFQ0wgdHlwZSBkZWNsYXJhdG9yKQorICAgICAgIC8vIGxhYmVsLnN0YXJ0LCBsYWJlbC5zdGFydCwgbGFiZWwudGV4dAorICAgICAgIHsgTlNMb2coQCJpbnQgXCVAIiwgJGRlY2xhcmF0b3IudGV4dCk7fQorICAgICA7CisKK3R5cGUgOiBJTlRUWVBFIDsKKworZGVjbGFyYXRvcgorICAgICA6IElECisgICAgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0R1bXBEZWNsLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdEdW1wRGVjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYWExNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdEdW1wRGVjbC5oCkBAIC0wLDAgKzEsODkgQEAKKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gTGFuZ0R1bXBEZWNsLmcgMjAxMS0wNS0wNiAxNzozOTowOQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiB0cmVlUGFyc2VySGVhZGVyRmlsZSAqLworI2lmbmRlZiBBTlRMUjNUb2tlblR5cGVBbHJlYWR5RGVmaW5lZAorI2RlZmluZSBBTlRMUjNUb2tlblR5cGVBbHJlYWR5RGVmaW5lZAordHlwZWRlZiBlbnVtIHsKKyAgICBBTlRMUl9FT0YgPSAtMSwKKyAgICBJTlZBTElELAorICAgIEVPUiwKKyAgICBET1dOLAorICAgIFVQLAorICAgIE1JTgorfSBBTlRMUjNUb2tlblR5cGU7CisjZW5kaWYKKworI3ByYWdtYSBtYXJrIFRva2VucworI2lmZGVmIEVPRgorI3VuZGVmIEVPRgorI2VuZGlmCisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBUX18xMCAxMAorI2RlZmluZSBERUNMIDQKKyNkZWZpbmUgRkxPQVRUWVBFIDUKKyNkZWZpbmUgSUQgNgorI2RlZmluZSBJTlQgNworI2RlZmluZSBJTlRUWVBFIDgKKyNkZWZpbmUgV1MgOQorI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIExhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybiAqLworQGludGVyZmFjZSBMYW5nRHVtcERlY2xfZGVjbGFyYXRvcl9yZXR1cm4gOkFOVExSVHJlZVJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworIC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovCit9CisvKiBzdGFydCBwcm9wZXJ0aWVzICovCisrIChMYW5nRHVtcERlY2xfZGVjbGFyYXRvcl9yZXR1cm4gKiluZXdMYW5nRHVtcERlY2xfZGVjbGFyYXRvcl9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworCisvKiBJbnRlcmZhY2UgZ3JhbW1hciBjbGFzcyAqLworQGludGVyZmFjZSBMYW5nRHVtcERlY2wgOiBBTlRMUlRyZWVQYXJzZXIgeyAvKiBsaW5lIDU3MiAqLworLyogT2JqQyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKworCisvKiBPYmpDIGVuZCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhciAqLworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgc3RhcnQgb2YgbWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgbWVtVmFycyAqLworCisgfQorCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBzdGFydCBvZiBwcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBwcm9wZXJ0aWVzICovCisKKysgKHZvaWQpIGluaXRpYWxpemU7CisrIChpZCkgbmV3TGFuZ0R1bXBEZWNsOihpZDxBTlRMUlRyZWVOb2RlU3RyZWFtPilhU3RyZWFtOworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzRGVjbCAqLworCisvKiBPYmpDIHN0YXJ0IG9mIG1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBtZXRob2RzRGVjbCAqLworCistICh2b2lkKWRlY2w7IAorLSAodm9pZCl0eXBlOyAKKy0gKExhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybiAqKWRlY2xhcmF0b3I7IAorCisKK0BlbmQgLyogZW5kIG9mIExhbmdEdW1wRGVjbCBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nRHVtcERlY2wubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0R1bXBEZWNsLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiZDY5NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0R1bXBEZWNsLm0KQEAgLTAsMCArMSwyNTggQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogTGFuZ0R1bXBEZWNsLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMS0wNS0wNiAxNzozOTowOQorICogICAgIC0gICAgICAgICAgIGZvciB0aGUgdHJlZSBwYXJzZXIgOiBMYW5nRHVtcERlY2xUcmVlUGFyc2VyCisgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLgorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IExhbmdEdW1wRGVjbC5nIDIwMTEtMDUtMDYgMTc6Mzk6MDkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiTGFuZ0R1bXBEZWNsLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKyNwcmFnbWEgbWFyayBCaXRzZXRzCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19ERUNMX2luX2RlY2w0NTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0RFQ0xfaW5fZGVjbDQ1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDA0TEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl9kZWNsNDc7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX2RlY2w0N19kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDA0MExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX2RlY2xhcmF0b3JfaW5fZGVjbDQ5Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZGVjbGFyYXRvcl9pbl9kZWNsNDlfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDhMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JTlRUWVBFX2luX3R5cGU4MTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lOVFRZUEVfaW5fdHlwZTgxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjk1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfSURfaW5fZGVjbGFyYXRvcjk1X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorQGltcGxlbWVudGF0aW9uIExhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybiAvKiByZXR1cm5TY29wZSAqLworIC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKExhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybiAqKW5ld0xhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybgoreworICAgIHJldHVybiBbW1tMYW5nRHVtcERlY2xfZGVjbGFyYXRvcl9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKKworLy8jcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisvLworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisKK0BpbXBsZW1lbnRhdGlvbiBMYW5nRHVtcERlY2wgIC8vIGxpbmUgNjM3CisKKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgZ2xvYmFsIEF0dHJpYnV0ZSBTY29wZXMKKy8qIE9iakMgc3RhcnQgZ2xvYmFsQXR0cmlidXRlU2NvcGUgKi8KKy8qIE9iakMgZW5kIGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW50aGVzaXplICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBzdGFydCBzeW50aGVzaXplKCkgKi8KKy8qIE9iakMgZW5kIHN5bnRoZXNpemUoKSAqLworCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfREVDTF9pbl9kZWNsNDUgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19ERUNMX2luX2RlY2w0NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX3R5cGVfaW5fZGVjbDQ3ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfdHlwZV9pbl9kZWNsNDdfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19kZWNsYXJhdG9yX2luX2RlY2w0OSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX2RlY2xhcmF0b3JfaW5fZGVjbDQ5X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSU5UVFlQRV9pbl90eXBlODEgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19JTlRUWVBFX2luX3R5cGU4MV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX2RlY2xhcmF0b3I5NSA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX2RlY2xhcmF0b3I5NV9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRUb2tlbk5hbWVzOltbQU11dGFibGVBcnJheSBhcnJheVdpdGhPYmplY3RzOkAiPGludmFsaWQ+IiwgQCI8RU9SPiIsIEAiPERPV04+IiwgQCI8VVA+IiwgCisgQCJERUNMIiwgQCJGTE9BVFRZUEUiLCBAIklEIiwgQCJJTlQiLCBAIklOVFRZUEUiLCBAIldTIiwgQCInOyciLCBuaWxdIHJldGFpbl1dOworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIkxhbmdEdW1wRGVjbC5nIl07Cit9CisKKysgKExhbmdEdW1wRGVjbCAqKW5ld0xhbmdEdW1wRGVjbDooaWQ8QU5UTFJUcmVlTm9kZVN0cmVhbT4pYVN0cmVhbQoreworICAgIHJldHVybiBbW0xhbmdEdW1wRGVjbCBhbGxvY10gaW5pdFdpdGhTdHJlYW06YVN0cmVhbV07CisKKworfQorCistIChpZCkgaW5pdFdpdGhTdHJlYW06KGlkPEFOVExSVHJlZU5vZGVTdHJlYW0+KWFTdHJlYW0KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoU3RyZWFtOmFTdHJlYW0gU3RhdGU6W1tBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjMrMV0gcmV0YWluXV07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKworCisgICAgICAgIC8qIHN0YXJ0IG9mIGFjdGlvbnMtYWN0aW9uU2NvcGUtaW5pdCAqLworICAgICAgICAvKiBzdGFydCBvZiBpbml0ICovCisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIHN0YXJ0IG1lbWJlcnMgKi8KKy8qIE9iakMgZW5kIG1lbWJlcnMgKi8KKy8qIE9iakMgc3RhcnQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisvKiBPYmpDIHN0YXJ0IHJ1bGVzICovCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2wKKyAqIExhbmdEdW1wRGVjbC5nOjg6MTogZGVjbCA6IF4oIERFQ0wgdHlwZSBkZWNsYXJhdG9yICkgOworICovCistICh2b2lkKSBkZWNsCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAgTGFuZ0R1bXBEZWNsX2RlY2xhcmF0b3JfcmV0dXJuICogZGVjbGFyYXRvcjEgPSBuaWwgOworICAgICAgICAgCisKKyAgICAgICAgLy8gTGFuZ0R1bXBEZWNsLmc6ODo2OiAoIF4oIERFQ0wgdHlwZSBkZWNsYXJhdG9yICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gTGFuZ0R1bXBEZWNsLmc6ODo4OiBeKCBERUNMIHR5cGUgZGVjbGFyYXRvciApIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpERUNMIEZvbGxvdzpGT0xMT1dfREVDTF9pbl9kZWNsNDVdOyAKKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IAorICAgICAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdHlwZV9pbl9kZWNsNDddOworICAgICAgICAgICAgW3NlbGYgdHlwZV07CisKKyAgICAgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworCisgICAgICAgICAgICAvKiBydWxlUmVmICovCisgICAgICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsYXJhdG9yX2luX2RlY2w0OV07CisgICAgICAgICAgICBkZWNsYXJhdG9yMSA9IFtzZWxmIGRlY2xhcmF0b3JdOworCisgICAgICAgICAgICBbc2VsZiBwb3BGb2xsb3ddOworCisKKworICAgICAgICAgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyAKKworCisgICAgICAgICBOU0xvZyhAImludCAlQCIsIChkZWNsYXJhdG9yMSE9bmlsP1tbaW5wdXQgZ2V0VG9rZW5TdHJlYW1dIHRvU3RyaW5nRnJvbVN0YXJ0OltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RhcnRJbmRleDpbZGVjbGFyYXRvcjEgZ2V0U3RhcnRdXVRvRW5kOltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RvcEluZGV4OltkZWNsYXJhdG9yMSBnZXRTdGFydF1dXTowKSk7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gOworfQorLyogJEFOVExSIGVuZCBkZWNsICovCisKKy8qCisgKiAkQU5UTFIgc3RhcnQgdHlwZQorICogTGFuZ0R1bXBEZWNsLmc6MTM6MTogdHlwZSA6IElOVFRZUEUgOworICovCistICh2b2lkKSB0eXBlCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICAvLyBMYW5nRHVtcERlY2wuZzoxMzo2OiAoIElOVFRZUEUgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gTGFuZ0R1bXBEZWNsLmc6MTM6ODogSU5UVFlQRSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SU5UVFlQRSBGb2xsb3c6Rk9MTE9XX0lOVFRZUEVfaW5fdHlwZTgxXTsgCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKy8qICRBTlRMUiBlbmQgdHlwZSAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2xhcmF0b3IKKyAqIExhbmdEdW1wRGVjbC5nOjE1OjE6IGRlY2xhcmF0b3IgOiBJRCA7CisgKi8KKy0gKExhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybiAqKSBkZWNsYXJhdG9yCit7CisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIExhbmdEdW1wRGVjbF9kZWNsYXJhdG9yX3JldHVybiAqIHJldHZhbCA9IFtMYW5nRHVtcERlY2xfZGVjbGFyYXRvcl9yZXR1cm4gbmV3TGFuZ0R1bXBEZWNsX2RlY2xhcmF0b3JfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKworICAgIEB0cnkgeworICAgICAgICAvLyBMYW5nRHVtcERlY2wuZzoxNjo2OiAoIElEICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIExhbmdEdW1wRGVjbC5nOjE2Ojg6IElEIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpJRCBGb2xsb3c6Rk9MTE9XX0lEX2luX2RlY2xhcmF0b3I5NV07IAorCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2xhcmF0b3IgKi8KKy8qIE9iakMgZW5kIHJ1bGVzICovCisKK0BlbmQgLyogZW5kIG9mIExhbmdEdW1wRGVjbCBpbXBsZW1lbnRhdGlvbiBsaW5lIDY5MiAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nRHVtcERlY2wudG9rZW5zIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nRHVtcERlY2wudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWQxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdEdW1wRGVjbC50b2tlbnMKQEAgLTAsMCArMSw4IEBACitUX18xMD0xMAorREVDTD00CitGTE9BVFRZUEU9NQorSUQ9NgorSU5UPTcKK0lOVFRZUEU9OAorV1M9OQorJzsnPTEwCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ3ZDEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nTGV4ZXIuaApAQCAtMCwwICsxLDQ2IEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IExhbmcuZyAyMDExLTA1LTA2IDE3OjM4OjUyCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFuZGFyZCBhbnRscjMgT0JKQyBydW50aW1lIGRlZmluaXRpb25zCisgKi8KKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUi5oPgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIFN0YXJ0IGN5Y2xpY0RGQUludGVyZmFjZSAqLworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIGVuZAorI3ByYWdtYSBtYXJrIFRva2VucworI2lmZGVmIEVPRgorI3VuZGVmIEVPRgorI2VuZGlmCisjZGVmaW5lIEVPRiAtMQorI2RlZmluZSBUX18xMCAxMAorI2RlZmluZSBERUNMIDQKKyNkZWZpbmUgRkxPQVRUWVBFIDUKKyNkZWZpbmUgSUQgNgorI2RlZmluZSBJTlQgNworI2RlZmluZSBJTlRUWVBFIDgKKyNkZWZpbmUgV1MgOQorLyogaW50ZXJmYWNlIGxleGVyIGNsYXNzICovCitAaW50ZXJmYWNlIExhbmdMZXhlciA6IEFOVExSTGV4ZXIgeyAvLyBsaW5lIDI4MworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworfQorKyAodm9pZCkgaW5pdGlhbGl6ZTsKKysgKExhbmdMZXhlciAqKW5ld0xhbmdMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQ7CisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMubGV4ZXIubWV0aG9kc0RlY2wgKi8KKy8qIE9iakMgZW5kIGFjdGlvbnMubGV4ZXIubWV0aG9kc0RlY2wgKi8KKy0gKHZvaWQpIG1UX18xMCA7IAorLSAodm9pZCkgbUlOVFRZUEUgOyAKKy0gKHZvaWQpIG1GTE9BVFRZUEUgOyAKKy0gKHZvaWQpIG1JRCA7IAorLSAodm9pZCkgbUlOVCA7IAorLSAodm9pZCkgbVdTIDsgCistICh2b2lkKSBtVG9rZW5zIDsgCisKK0BlbmQgLyogZW5kIG9mIExhbmdMZXhlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nTGV4ZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0xleGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZjkwYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ0xleGVyLm0KQEAgLTAsMCArMSw1MzIgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogTGFuZy5nCisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDIwMTEtMDUtMDYgMTc6Mzg6NTIKKyAqICAgICAtICAgICAgICAgICAgICAgICBmb3IgdGhlIGxleGVyIDogTGFuZ0xleGVyTGV4ZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gTGFuZy5nIDIwMTEtMDUtMDYgMTc6Mzg6NTIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiTGFuZ0xleGVyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCisKKy8qKiBBcyBwZXIgVGVyZW5jZTogTm8gcmV0dXJucyBmb3IgbGV4ZXIgcnVsZXMhICovCitAaW1wbGVtZW50YXRpb24gTGFuZ0xleGVyIC8vIGxpbmUgMzMwCisKKysgKHZvaWQpIGluaXRpYWxpemUKK3sKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRHcmFtbWFyRmlsZU5hbWU6QCJMYW5nLmciXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gW1tzZWxmIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6YVRva2VuVHlwZV07Cit9CisKKysgKExhbmdMZXhlciAqKW5ld0xhbmdMZXhlcldpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICByZXR1cm4gW1tMYW5nTGV4ZXIgYWxsb2NdIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0XTsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dCBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46NysxXSByZXRhaW5dXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworCisvKiBTdGFydCBvZiBSdWxlcyAqLworLy8gJEFOVExSIHN0YXJ0ICJUX18xMCIKKy0gKHZvaWQpIG1UX18xMAoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBUX18xMDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBMYW5nLmc6Nzo3OiAoICc7JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBMYW5nLmc6Nzo5OiAnOycgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgW3NlbGYgbWF0Y2hDaGFyOic7J107IAorCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJUX18xMCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJJTlRUWVBFIgorLSAodm9pZCkgbUlOVFRZUEUKK3sKKyAgICAvLworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICBAdHJ5IHsKKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gSU5UVFlQRTsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBMYW5nLmc6MTg6OTogKCAnaW50JyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBMYW5nLmc6MTg6MTE6ICdpbnQnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiaW50Il07IAorCisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIklOVFRZUEUiICovCisKKy8vICRBTlRMUiBzdGFydCAiRkxPQVRUWVBFIgorLSAodm9pZCkgbUZMT0FUVFlQRQoreworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBGTE9BVFRZUEU7CisgICAgICAgIE5TSW50ZWdlciBfY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgLy8gTGFuZy5nOjE5OjExOiAoICdmbG9hdCcgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gTGFuZy5nOjE5OjEzOiAnZmxvYXQnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoU3RyaW5nOkAiZmxvYXQiXTsgCisKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiRkxPQVRUWVBFIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIklEIgorLSAodm9pZCkgbUlECit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElEOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIExhbmcuZzoyMDo0OiAoICggJ2EnIC4uICd6JyApKyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBMYW5nLmc6MjA6NjogKCAnYScgLi4gJ3onICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIExhbmcuZzoyMDo2OiAoICdhJyAuLiAneicgKSsgLy8gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKyAgICAgICAgTlNJbnRlZ2VyIGNudDEgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBOU0ludGVnZXIgYWx0MSA9IDI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEExXzAgPj0gJ2EnICYmIExBMV8wIDw9ICd6JykpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiA7CisgICAgICAgICAgICAgICAgICAgIC8vIExhbmcuZzogLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoW2lucHV0IExBOjFdID49ICdhJykgJiYgKFtpbnB1dCBMQToxXSA8PSAneicpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQxID49IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wMTsKKyAgICAgICAgICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBbQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOmlucHV0IGRlY2lzaW9uTnVtYmVyOjFdOworICAgICAgICAgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY250MSsrOworICAgICAgICB9IHdoaWxlIChZRVMpOworICAgICAgICBsb29wMTogOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm47Cit9CisvKiAkQU5UTFIgZW5kICJJRCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJJTlQiCistICh2b2lkKSBtSU5UCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBMYW5nLmc6MjE6NTogKCAoICcwJyAuLiAnOScgKSsgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gTGFuZy5nOjIxOjc6ICggJzAnIC4uICc5JyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyBMYW5nLmc6MjE6NzogKCAnMCcgLi4gJzknICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQyID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDIgPSAyOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMl8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBMl8wID49ICcwJyAmJiBMQTJfMCA8PSAnOScpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBMYW5nLmc6IC8vIGFsdAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKFtpbnB1dCBMQToxXSA+PSAnMCcpICYmIChbaW5wdXQgTEE6MV0gPD0gJzknKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgICAgICAgICAgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIGlmICggY250MiA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9vcDI7CisgICAgICAgICAgICAgICAgICAgIEFOVExSRWFybHlFeGl0RXhjZXB0aW9uICplZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjppbnB1dCBkZWNpc2lvbk51bWJlcjoyXTsKKyAgICAgICAgICAgICAgICAgICAgQHRocm93IGVlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgfSB3aGlsZSAoWUVTKTsKKyAgICAgICAgbG9vcDI6IDsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiSU5UIiAqLworCisvLyAkQU5UTFIgc3RhcnQgIldTIgorLSAodm9pZCkgbVdTCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFdTOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIExhbmcuZzoyMjo0OiAoICggJyAnIHwgJ1xcbicgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyBMYW5nLmc6MjI6NjogKCAnICcgfCAnXFxuJyApIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIGlmIChbaW5wdXQgTEE6MV0gPT0gJ1xuJ3x8W2lucHV0IExBOjFdID09ICcgJykgeworICAgICAgICAgICAgW2lucHV0IGNvbnN1bWVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICAgICAgICAgIFtzZWxmIHJlY292ZXI6bXNlXTsKKyAgICAgICAgICAgIEB0aHJvdyBtc2U7CisgICAgICAgIH0KKworCisgICAgICAgIF9jaGFubmVsPUhJRERFTjsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiV1MiICovCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBMYW5nLmc6MTo4OiAoIFRfXzEwIHwgSU5UVFlQRSB8IEZMT0FUVFlQRSB8IElEIHwgSU5UIHwgV1MgKSAvL3J1bGVibG9jaworICAgIE5TSW50ZWdlciBhbHQzPTY7CisgICAgdW5pY2hhciBjaGFyTEEzID0gW2lucHV0IExBOjFdOworICAgIHN3aXRjaCAoY2hhckxBMykgeworICAgICAgICBjYXNlICc7JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2knOiA7CisgICAgICAgICAgICB7CisgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzIgPSBbaW5wdXQgTEE6Ml07CisKKyAgICAgICAgICAgIGlmICggKExBM18yPT0nbicpICkgeworICAgICAgICAgICAgICAgIE5TSW50ZWdlciBMQTNfNyA9IFtpbnB1dCBMQTozXTsKKworICAgICAgICAgICAgICAgIGlmICggKExBM183PT0ndCcpICkgeworICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzkgPSBbaW5wdXQgTEE6NF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBM185ID49ICdhJyAmJiBMQTNfOSA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHQzID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbHQzID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18zID0gW2lucHV0IExBOjJdOworCisgICAgICAgICAgICBpZiAoIChMQTNfMz09J2wnKSApIHsKKyAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzggPSBbaW5wdXQgTEE6M107CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTNfOD09J28nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18xMCA9IFtpbnB1dCBMQTo0XTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMTA9PSdhJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOU0ludGVnZXIgTEEzXzEyID0gW2lucHV0IExBOjVdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMTI9PSd0JykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNJbnRlZ2VyIExBM18xMyA9IFtpbnB1dCBMQTo2XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTNfMTMgPj0gJ2EnICYmIExBM18xMyA8PSAneicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz00OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MyA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzID0gNDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MyA9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYWx0MyA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6IDsKKyAgICAgICAgY2FzZSAnYic6IDsKKyAgICAgICAgY2FzZSAnYyc6IDsKKyAgICAgICAgY2FzZSAnZCc6IDsKKyAgICAgICAgY2FzZSAnZSc6IDsKKyAgICAgICAgY2FzZSAnZyc6IDsKKyAgICAgICAgY2FzZSAnaCc6IDsKKyAgICAgICAgY2FzZSAnaic6IDsKKyAgICAgICAgY2FzZSAnayc6IDsKKyAgICAgICAgY2FzZSAnbCc6IDsKKyAgICAgICAgY2FzZSAnbSc6IDsKKyAgICAgICAgY2FzZSAnbic6IDsKKyAgICAgICAgY2FzZSAnbyc6IDsKKyAgICAgICAgY2FzZSAncCc6IDsKKyAgICAgICAgY2FzZSAncSc6IDsKKyAgICAgICAgY2FzZSAncic6IDsKKyAgICAgICAgY2FzZSAncyc6IDsKKyAgICAgICAgY2FzZSAndCc6IDsKKyAgICAgICAgY2FzZSAndSc6IDsKKyAgICAgICAgY2FzZSAndic6IDsKKyAgICAgICAgY2FzZSAndyc6IDsKKyAgICAgICAgY2FzZSAneCc6IDsKKyAgICAgICAgY2FzZSAneSc6IDsKKyAgICAgICAgY2FzZSAneic6IDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGFsdDM9NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcwJzogOworICAgICAgICBjYXNlICcxJzogOworICAgICAgICBjYXNlICcyJzogOworICAgICAgICBjYXNlICczJzogOworICAgICAgICBjYXNlICc0JzogOworICAgICAgICBjYXNlICc1JzogOworICAgICAgICBjYXNlICc2JzogOworICAgICAgICBjYXNlICc3JzogOworICAgICAgICBjYXNlICc4JzogOworICAgICAgICBjYXNlICc5JzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0Mz01OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzogOworICAgICAgICBjYXNlICcgJzogOworICAgICAgICAgICAgeworICAgICAgICAgICAgYWx0Mz02OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiA7CisgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246MyBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgIG52YWUuYyA9IGNoYXJMQTM7CisgICAgICAgIEB0aHJvdyBudmFlOworCisgICAgfQorCisgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgIC8vIExhbmcuZzoxOjEwOiBUX18xMCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1UX18xMF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMiA6IDsKKyAgICAgICAgICAgIC8vIExhbmcuZzoxOjE2OiBJTlRUWVBFIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUlOVFRZUEVdOyAKKworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMgOiA7CisgICAgICAgICAgICAvLyBMYW5nLmc6MToyNDogRkxPQVRUWVBFIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbUZMT0FUVFlQRV07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNCA6IDsKKyAgICAgICAgICAgIC8vIExhbmcuZzoxOjM0OiBJRCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1JRF07IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNSA6IDsKKyAgICAgICAgICAgIC8vIExhbmcuZzoxOjM3OiBJTlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtSU5UXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2IDogOworICAgICAgICAgICAgLy8gTGFuZy5nOjE6NDE6IFdTIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgW3NlbGYgbVdTXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKworfQorCitAZW5kIC8qIGVuZCBvZiBMYW5nTGV4ZXIgaW1wbGVtZW50YXRpb24gbGluZSAzOTcgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdQYXJzZXIuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTFmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL0xhbmdQYXJzZXIuaApAQCAtMCwwICsxLDE0OSBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBMYW5nLmcgMjAxMS0wNS0wNiAxNzozODo1MgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBwYXJzZXJIZWFkZXJGaWxlICovCisjaWZuZGVmIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCisjZGVmaW5lIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCit0eXBlZGVmIGVudW0geworICAgIEFOVExSX0VPRiA9IC0xLAorICAgIElOVkFMSUQsCisgICAgRU9SLAorICAgIERPV04sCisgICAgVVAsCisgICAgTUlOCit9IEFOVExSM1Rva2VuVHlwZTsKKyNlbmRpZgorCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjaWZkZWYgRU9GCisjdW5kZWYgRU9GCisjZW5kaWYKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIFRfXzEwIDEwCisjZGVmaW5lIERFQ0wgNAorI2RlZmluZSBGTE9BVFRZUEUgNQorI2RlZmluZSBJRCA2CisjZGVmaW5lIElOVCA3CisjZGVmaW5lIElOVFRZUEUgOAorI2RlZmluZSBXUyA5CisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworI3ByYWdtYSBtYXJrIFJ1bGUgUmV0dXJuIFNjb3BlcyBzdGFydAorLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgTGFuZ1BhcnNlcl9zdGFydF9yZXR1cm4gKi8KK0BpbnRlcmZhY2UgTGFuZ1BhcnNlcl9zdGFydF9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgbGluZSAxODM4ICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMoKSAqLworfQorLyogc3RhcnQgcHJvcGVydGllcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChMYW5nUGFyc2VyX3N0YXJ0X3JldHVybiAqKW5ld0xhbmdQYXJzZXJfc3RhcnRfcmV0dXJuOworLyogdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc0RlY2wgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWU7CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvKiBtZXRob2RzRGVjbCAqLworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovCisKKworCisvKiByZXR1cm5TY29wZUludGVyZmFjZSBMYW5nUGFyc2VyX2RlY2xfcmV0dXJuICovCitAaW50ZXJmYWNlIExhbmdQYXJzZXJfZGVjbF9yZXR1cm4gOkFOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlIHsgLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgbGluZSAxODM4ICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMoKSAqLworfQorLyogc3RhcnQgcHJvcGVydGllcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChMYW5nUGFyc2VyX2RlY2xfcmV0dXJuICopbmV3TGFuZ1BhcnNlcl9kZWNsX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworLyogcmV0dXJuU2NvcGVJbnRlcmZhY2UgTGFuZ1BhcnNlcl90eXBlX3JldHVybiAqLworQGludGVyZmFjZSBMYW5nUGFyc2VyX3R5cGVfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoTGFuZ1BhcnNlcl90eXBlX3JldHVybiAqKW5ld0xhbmdQYXJzZXJfdHlwZV9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKworLyogSW50ZXJmYWNlIGdyYW1tYXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgTGFuZ1BhcnNlciA6IEFOVExSUGFyc2VyIHsgLyogbGluZSA1NzIgKi8KKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisKKworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisvKiBPYmpDIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisKKworLyogT2JqQyBlbmQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZW1WYXJzICovCisvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMgKi8KKy8qIEFTVCBwYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMgKi8KK05TSW50ZWdlciBydWxlTGV2ZWw7CitOU0FycmF5ICpydWxlTmFtZXM7CisgIC8qIEFTVCBzdXBlci5tZW1WYXJzICovCisvKiBBU1QgcGFyc2VyTWVtVmFycyAqLworaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7ICAgLyogQVNUIHBhcnNlck1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIG1lbVZhcnMgKi8KKworIH0KKworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXMgKi8KKy8qIE9iakMgc3RhcnQgb2YgcHJvcGVydGllcyAqLworLyogQVNUIHBhcnNlckhlYWRlckZpbGUucHJvcGVydGllcyAqLworICAvKiBBU1Qgc3VwZXIucHJvcGVydGllcyAqLworLyogQVNUIHBhcnNlclByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZUFkYXB0b3IsIHNldHRlcj1zZXRUcmVlQWRhcHRvcjopIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOyAgIC8qIEFTVCBwYXJzZXJwcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBwcm9wZXJ0aWVzICovCisKKysgKHZvaWQpIGluaXRpYWxpemU7CisrIChpZCkgbmV3TGFuZ1BhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbTsKKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKworLyogT2JqQyBzdGFydCBvZiBtZXRob2RzRGVjbCAqLworLyogQVNUIHBhcnNlckhlYWRlckZpbGUubWV0aG9kc0RlY2wgKi8KKyAgLyogQVNUIHN1cGVyLm1ldGhvZHNEZWNsICovCisvKiBBU1QgcGFyc2VyTWV0aG9kc0RlY2wgKi8KKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPil0aGVUcmVlQWRhcHRvcjsgICAvKiBBU1QgcGFyc2VybWV0aG9kc0RlY2wgKi8KKy8qIE9iakMgZW5kIG9mIG1ldGhvZHNEZWNsICovCisKKy0gKExhbmdQYXJzZXJfc3RhcnRfcmV0dXJuICopc3RhcnQ7IAorLSAoTGFuZ1BhcnNlcl9kZWNsX3JldHVybiAqKWRlY2w7IAorLSAoTGFuZ1BhcnNlcl90eXBlX3JldHVybiAqKXR5cGU7IAorCisKK0BlbmQgLyogZW5kIG9mIExhbmdQYXJzZXIgaW50ZXJmYWNlICovCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ1BhcnNlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9MYW5nUGFyc2VyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0OWQwOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvTGFuZ1BhcnNlci5tCkBAIC0wLDAgKzEsNTE1IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0KKyAqCisgKiAgICAgLSAgRnJvbSB0aGUgZ3JhbW1hciBzb3VyY2UgZmlsZSA6IExhbmcuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDExLTA1LTA2IDE3OjM4OjUyCisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IExhbmdQYXJzZXJQYXJzZXIKKyAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuCisgKgorICogT2JqQyBsYW5ndWFnZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgYnkgQWxhbiBDb25kaXQsIGFjb25kaXR8aGVyZWlzYW5hdHxpcG5zfGRvdGdvZXNoZXJlfGNvbS4KKyAqCisgKgorKi8KKy8vICRBTlRMUiAke3Byb2plY3QudmVyc2lvbn0gJHtidWlsZE51bWJlcn0gTGFuZy5nIDIwMTEtMDUtMDYgMTc6Mzg6NTIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiTGFuZ1BhcnNlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisjcHJhZ21hIG1hcmsgQml0c2V0cworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfZGVjbF9pbl9zdGFydDQxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBGT0xMT1dfZGVjbF9pbl9zdGFydDQxX2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfdHlwZV9pbl9kZWNsNTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIEZPTExPV190eXBlX2luX2RlY2w1MF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDA0MExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX0lEX2luX2RlY2w1MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lEX2luX2RlY2w1Ml9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDQwMExMfTsKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XXzEwX2luX2RlY2w1NDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XXzEwX2luX2RlY2w1NF9kYXRhW10gPSB7IDB4MDAwMDAwMDAwMDAwMDAwMkxMfTsKKworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgc3RhcnQKK0BpbXBsZW1lbnRhdGlvbiBMYW5nUGFyc2VyX3N0YXJ0X3JldHVybiAvKiByZXR1cm5TY29wZSAqLworLyogQVNUIHJldHVyblNjb3BlLnN5bnRoZXNpemUgKi8KK0BzeW50aGVzaXplIHRyZWU7IC8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE4MzcgKi8KKysgKExhbmdQYXJzZXJfc3RhcnRfcmV0dXJuICopbmV3TGFuZ1BhcnNlcl9zdGFydF9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbTGFuZ1BhcnNlcl9zdGFydF9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy0gKGlkKSBpbml0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogQVNUIHJldHVyblNjb3BlLm1ldGhvZHMgKi8KKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIHNlbGYudHJlZSA9IG5pbDsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZSBpbXBsZW1lbnRhdGlvbiAqLworCisKK0BpbXBsZW1lbnRhdGlvbiBMYW5nUGFyc2VyX2RlY2xfcmV0dXJuIC8qIHJldHVyblNjb3BlICovCisvKiBBU1QgcmV0dXJuU2NvcGUuc3ludGhlc2l6ZSAqLworQHN5bnRoZXNpemUgdHJlZTsgLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTgzNyAqLworKyAoTGFuZ1BhcnNlcl9kZWNsX3JldHVybiAqKW5ld0xhbmdQYXJzZXJfZGVjbF9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbTGFuZ1BhcnNlcl9kZWNsX3JldHVybiBhbGxvY10gaW5pdF0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXQKK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRdOworICAgIHJldHVybiBzZWxmOworfQorCisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZQoreworICAgIHJldHVybiB0cmVlOworfQorCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICh0cmVlICE9IG5pbCkgW3RyZWUgcmVsZWFzZV07CisgICAgICAgIGlmIChhVHJlZSAhPSBuaWwpIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgc2VsZi50cmVlID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworCisKK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlIGltcGxlbWVudGF0aW9uICovCisKKworQGltcGxlbWVudGF0aW9uIExhbmdQYXJzZXJfdHlwZV9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChMYW5nUGFyc2VyX3R5cGVfcmV0dXJuICopbmV3TGFuZ1BhcnNlcl90eXBlX3JldHVybgoreworICAgIHJldHVybiBbW1tMYW5nUGFyc2VyX3R5cGVfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCisvLyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKy8vCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKworQGltcGxlbWVudGF0aW9uIExhbmdQYXJzZXIgIC8vIGxpbmUgNjM3CisKKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlICovCisjcHJhZ21hIG1hcmsgZ2xvYmFsIEF0dHJpYnV0ZSBTY29wZXMKKy8qIE9iakMgc3RhcnQgZ2xvYmFsQXR0cmlidXRlU2NvcGUgKi8KKy8qIE9iakMgZW5kIGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIHN0YXJ0IGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW50aGVzaXplICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBzdGFydCBzeW50aGVzaXplKCkgKi8KKy8qIEFTVCBnZW5lcmljUGFyc2VyLnN5bnRoZXNpemUgKi8KKy8qIEFTVCBwYXJzZXJQcm9wZXJ0aWVzICovCitAc3ludGhlc2l6ZSB0cmVlQWRhcHRvcjsKKy8qIE9iakMgZW5kIHN5bnRoZXNpemUoKSAqLworCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgI3ByYWdtYSBtYXJrIEJpdHNldHMKKyAgICBGT0xMT1dfZGVjbF9pbl9zdGFydDQxID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKilGT0xMT1dfZGVjbF9pbl9zdGFydDQxX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfdHlwZV9pbl9kZWNsNTAgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV190eXBlX2luX2RlY2w1MF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lEX2luX2RlY2w1MiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lEX2luX2RlY2w1Ml9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XXzEwX2luX2RlY2w1NCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XXzEwX2luX2RlY2w1NF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisKKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRUb2tlbk5hbWVzOltbQU11dGFibGVBcnJheSBhcnJheVdpdGhPYmplY3RzOkAiPGludmFsaWQ+IiwgQCI8RU9SPiIsIEAiPERPV04+IiwgQCI8VVA+IiwgCisgQCJERUNMIiwgQCJGTE9BVFRZUEUiLCBAIklEIiwgQCJJTlQiLCBAIklOVFRZUEUiLCBAIldTIiwgQCInOyciLCBuaWxdIHJldGFpbl1dOworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIkxhbmcuZyJdOworfQorCisrIChMYW5nUGFyc2VyICopbmV3TGFuZ1BhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHJldHVybiBbW0xhbmdQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbV07CisKKworfQorCistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtIFN0YXRlOltbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjozKzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisKKworICAgICAgICAvKiBzdGFydCBvZiBhY3Rpb25zLWFjdGlvblNjb3BlLWluaXQgKi8KKyAgICAgICAgLyogc3RhcnQgb2YgaW5pdCAqLworICAgICAgICAvKiBBU1QgZ2VuZXJpY1BhcnNlci5pbml0ICovCisgICAgICAgIFtzZWxmIHNldFRyZWVBZGFwdG9yOltbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl0gcmV0YWluXV07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgLyogQVNUIGdlbmVyaWNQYXJzZXIuZGVhbGxvYyAqLworICAgIFtzZWxmIHNldFRyZWVBZGFwdG9yOm5pbF07CisKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy8qIE9iakMgc3RhcnQgbWVtYmVycyAqLworLyogT2JqQyBlbmQgbWVtYmVycyAqLworLyogT2JqQyBzdGFydCBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kcyAqLworLyogT2JqQyBlbmQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHMgKi8KKy8qIE9iakMgc3RhcnQgbWV0aG9kcygpICovCisvKiBBU1QgZ2VuZXJpY1BhcnNlci5tZXRob2RzICovCisvKiBBU1QgcGFyc2VyTWV0aG9kcyAqLworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yCit7CisJcmV0dXJuIHRyZWVBZGFwdG9yOworfQorCistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCit7CisJaWYgKGFUcmVlQWRhcHRvciAhPSB0cmVlQWRhcHRvcikgeworCQl0cmVlQWRhcHRvciA9IGFUcmVlQWRhcHRvcjsKKwl9Cit9CisvKiBPYmpDIGVuZCBtZXRob2RzKCkgKi8KKy8qIE9iakMgc3RhcnQgcnVsZXMgKi8KKy8qCisgKiAkQU5UTFIgc3RhcnQgc3RhcnQKKyAqIExhbmcuZzoxMDoxOiBzdGFydCA6IGRlY2wgOworICovCistIChMYW5nUGFyc2VyX3N0YXJ0X3JldHVybiAqKSBzdGFydAoreworICAgIC8qIG15IHJ1bGVTY29wZVNldFVwICovCisgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICAvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworICAgIExhbmdQYXJzZXJfc3RhcnRfcmV0dXJuICogcmV0dmFsID0gW0xhbmdQYXJzZXJfc3RhcnRfcmV0dXJuIG5ld0xhbmdQYXJzZXJfc3RhcnRfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8qIEFTVCBydWxlTGFiZWxEZWZzICovCisgICAgICAgICBMYW5nUGFyc2VyX2RlY2xfcmV0dXJuICogZGVjbDEgPSBuaWwgOworICAgICAgICAgCisKKworICAgICAgICAvLyBMYW5nLmc6MTA6NzogKCBkZWNsICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIExhbmcuZzoxMDo5OiBkZWNsIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19kZWNsX2luX3N0YXJ0NDFdOworICAgICAgICBkZWNsMSA9IFtzZWxmIGRlY2xdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W2RlY2wxIGdldFRyZWVdIHRvVHJlZTpyb290XzBdOworCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKworICAgICAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydCBUbzpyZXR2YWwuc3RvcFRva2VuXTsKKworICAgIH0KKyAgICBAY2F0Y2ggKEFOVExSUmVjb2duaXRpb25FeGNlcHRpb24gKnJlKSB7CisgICAgICAgIFtzZWxmIHJlcG9ydEVycm9yOnJlXTsKKyAgICAgICAgW3NlbGYgcmVjb3ZlcjppbnB1dCBFeGNlcHRpb246cmVdOworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZS5zZXRFcnJvclJldHVyblZhbHVlICovCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnQgVG86W2lucHV0IExUOi0xXSBFeGNlcHRpb246cmVdOworCisgICAgfQorCisgICAgQGZpbmFsbHkgeworICAgICAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBzdGFydCAqLworCisvKgorICogJEFOVExSIHN0YXJ0IGRlY2wKKyAqIExhbmcuZzoxMjoxOiBkZWNsIDogdHlwZSBJRCAnOycgLT4gXiggREVDTCB0eXBlIElEICkgOworICovCistIChMYW5nUGFyc2VyX2RlY2xfcmV0dXJuICopIGRlY2wKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBMYW5nUGFyc2VyX2RlY2xfcmV0dXJuICogcmV0dmFsID0gW0xhbmdQYXJzZXJfZGVjbF9yZXR1cm4gbmV3TGFuZ1BhcnNlcl9kZWNsX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpJRDMgPSBuaWw7CisgICAgICAgIEFOVExSQ29tbW9uVG9rZW4gKmNoYXJfbGl0ZXJhbDQgPSBuaWw7CisgICAgICAgICBMYW5nUGFyc2VyX3R5cGVfcmV0dXJuICogdHlwZTIgPSBuaWwgOworICAgICAgICAgCisKKyAgICAgICAgQU5UTFJDb21tb25UcmVlICpJRDNfdHJlZT1uaWw7CisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqY2hhcl9saXRlcmFsNF90cmVlPW5pbDsKKyAgICAgICAgQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtICpzdHJlYW1fMTAgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiAxMCJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0lEID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gSUQiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3R5cGUgPQorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbTp0cmVlQWRhcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOkAicnVsZSB0eXBlIl0gcmV0YWluXTsKKyAgICAgICAgLy8gTGFuZy5nOjEyOjY6ICggdHlwZSBJRCAnOycgLT4gXiggREVDTCB0eXBlIElEICkgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gTGFuZy5nOjEyOjg6IHR5cGUgSUQgJzsnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8qIHJ1bGVSZWYgKi8KKyAgICAgICAgW3NlbGYgcHVzaEZvbGxvdzpGT0xMT1dfdHlwZV9pbl9kZWNsNTBdOworICAgICAgICB0eXBlMiA9IFtzZWxmIHR5cGVdOworCisgICAgICAgIFtzZWxmIHBvcEZvbGxvd107CisKKworICAgICAgICBbc3RyZWFtX3R5cGUgYWRkRWxlbWVudDpbdHlwZTIgZ2V0VHJlZV1dOworCisgICAgICAgIElEMz0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpJRCBGb2xsb3c6Rk9MTE9XX0lEX2luX2RlY2w1Ml07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fSUQgYWRkRWxlbWVudDpJRDNdOworCisKKyAgICAgICAgY2hhcl9saXRlcmFsND0oQU5UTFJDb21tb25Ub2tlbiAqKVtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZToxMCBGb2xsb3c6Rk9MTE9XXzEwX2luX2RlY2w1NF07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fMTAgYWRkRWxlbWVudDpjaGFyX2xpdGVyYWw0XTsKKworCisgICAgICAgIC8vIEFTVCBSRVdSSVRFCisgICAgICAgIC8vIGVsZW1lbnRzOiBJRCwgdHlwZQorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyAxMjoyMDogLT4gXiggREVDTCB0eXBlIElEICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTGFuZy5nOjEyOjIzOiBeKCBERUNMIHR5cGUgSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OgorICAgICAgICAgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6REVDTCBUZXh0OkAiREVDTCJdCisgICAgICAgICAgICAgICAgIG9sZDpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fdHlwZSBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAgLy8gVE9ETzogYXJnczogCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fSUQgbmV4dE5vZGVdCisgICAgICAgICAgICAgICAgIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworCisgICAgICAgIH0KKworICAgICAgICAvKiBBU1RQYXJzZXIgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLyogQVNUIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisKKyAgICAgICAgW3N0cmVhbV8xMCByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV9JRCByZWxlYXNlXTsKKyAgICAgICAgW3N0cmVhbV90eXBlIHJlbGVhc2VdOworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIGRlY2wgKi8KKworLyoKKyAqICRBTlRMUiBzdGFydCB0eXBlCisgKiBMYW5nLmc6MTQ6MTogdHlwZSA6ICggSU5UVFlQRSB8IEZMT0FUVFlQRSApOworICovCistIChMYW5nUGFyc2VyX3R5cGVfcmV0dXJuICopIHR5cGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBMYW5nUGFyc2VyX3R5cGVfcmV0dXJuICogcmV0dmFsID0gW0xhbmdQYXJzZXJfdHlwZV9yZXR1cm4gbmV3TGFuZ1BhcnNlcl90eXBlX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpzZXQ1ID0gbmlsOworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqc2V0NV90cmVlPW5pbDsKKworICAgICAgICAvLyBMYW5nLmc6MTQ6NjogKCBJTlRUWVBFIHwgRkxPQVRUWVBFICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIExhbmcuZzogLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKworICAgICAgICAvKiBBU1RQYXJzZXIgbWF0Y2hSdWxlQmxvY2tTZXQgKi8KKyAgICAgICAgLyogQVNUUGFyc2VyIG1hdGNoU2V0ICovCisgICAgICAgIHNldDUgPSAoQU5UTFJDb21tb25Ub2tlbiAqKVtpbnB1dCBMVDoxXTsgLyogbWF0Y2hTZXQgKi8KKworICAgICAgICBpZiAoW2lucHV0IExBOjFdID09IEZMT0FUVFlQRXx8W2lucHV0IExBOjFdID09IElOVFRZUEUpIHsKKyAgICAgICAgICAgIFtpbnB1dCBjb25zdW1lXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDovKiBBU1RQYXJzZXIgY3JlYXRlTm9kZUZyb21Ub2tlbiAqLworICAgICAgICAgICAgKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlOnNldDVdIHJldGFpbl0KKyAgICAgICAgICAgICB0b1RyZWU6cm9vdF8wIF07CisgICAgICAgICAgICBbc3RhdGUgc2V0SXNFcnJvclJlY292ZXJ5Ok5PXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiAqbXNlID0gW0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246bmlsIHN0cmVhbTppbnB1dF07CisgICAgICAgICAgICBAdGhyb3cgbXNlOworICAgICAgICB9CisKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgdHlwZSAqLworLyogT2JqQyBlbmQgcnVsZXMgKi8KKworQGVuZCAvKiBlbmQgb2YgTGFuZ1BhcnNlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDY5MiAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9NYWluLmphdmEgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDczNGUzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9NYWluLmphdmEKQEAgLTAsMCArMSwyMCBAQAoraW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qOworCitwdWJsaWMgY2xhc3MgTWFpbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGFyZ3NbMF0pOworCQlMYW5nTGV4ZXIgbGV4ID0gbmV3IExhbmdMZXhlcihpbnB1dCk7CisJCUNvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOworCQlMYW5nUGFyc2VyIHBhcnNlciA9IG5ldyBMYW5nUGFyc2VyKHRva2Vucyk7CisJCS8vTGFuZ1BhcnNlci5kZWNsX3JldHVybiByID0gcGFyc2VyLmRlY2woKTsKKwkJTGFuZ1BhcnNlci5zdGFydF9yZXR1cm4gciA9IHBhcnNlci5zdGFydCgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInRyZWU6ICIrKChUcmVlKXIudHJlZSkudG9TdHJpbmdUcmVlKCkpOworCQlDb21tb25UcmVlIHIwID0gKChDb21tb25UcmVlKXIudHJlZSk7CisKKwkJQ29tbW9uVHJlZU5vZGVTdHJlYW0gbm9kZXMgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0ocjApOworCQlub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOworCQlMYW5nRHVtcERlY2wgd2Fsa2VyID0gbmV3IExhbmdEdW1wRGVjbChub2Rlcyk7CisJCXdhbGtlci5kZWNsKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9SRUFETUUudHh0IGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5NjRlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMSBAQAorSGkuICBUaGlzIGlzIGEgc2ltcGxlIGRlbW8gb2YgdHJlZSBjb25zdHJ1Y3Rpb24gYW5kIHRyZWUgcGFyc2luZyB3aXRoIEFOVExSCit2My4gIEhlcmUncyBob3cgdG8gdHJ5IGl0IG91dC4KKworJCBqYXZhIG9yZy5hbnRsci5Ub29sIExhbmdQYXJzZXIuZyBMYW5nVHJlZVBhcnNlci5nCiskIGphdmFjICouamF2YQorJCBqYXZhIE1haW4gaW5wdXQKKworWW91IHNob3VsZCBzZWUgb3V0OgorCit0cmVlOiAoREVDTCBpbnQgYSkKK2ludCBhCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL2ZpbGVzIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9maWxlcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZWFlNmRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9maWxlcwpAQCAtMCwwICsxLDYgQEAKK1JFQURNRS50eHQKK01haW4uamF2YQorTGFuZy5nCitMYW5nRHVtcERlY2wuZworaW5wdXQKK291dHB1dApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU2MTBjMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvaW5wdXQKQEAgLTAsMCArMSBAQAoraW50IGE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL21haW4ubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvbWFpbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWVhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL21haW4ubQpAQCAtMCwwICsxLDU1IEBACisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiYW50bHIzLmgiCisjaW1wb3J0ICJMYW5nTGV4ZXIuaCIKKyNpbXBvcnQgIkxhbmdQYXJzZXIuaCIKKyNpbXBvcnQgIkxhbmdEdW1wRGVjbC5oIgorI2ltcG9ydCAic3RkaW8uaCIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyoKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjsKKworcHVibGljIGNsYXNzIE1haW4geworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzWzBdKTsKKwkJTGFuZ0xleGVyIGxleCA9IG5ldyBMYW5nTGV4ZXIoaW5wdXQpOworCQlDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTsKKwkJTGFuZ1BhcnNlciBwYXJzZXIgPSBuZXcgTGFuZ1BhcnNlcih0b2tlbnMpOworCQkvL0xhbmdQYXJzZXIuZGVjbF9yZXR1cm4gciA9IHBhcnNlci5kZWNsKCk7CisJCUxhbmdQYXJzZXIuc3RhcnRfcmV0dXJuIHIgPSBwYXJzZXIuc3RhcnQoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmVlOiAiKygoVHJlZSlyLnRyZWUpLnRvU3RyaW5nVHJlZSgpKTsKKwkJQ29tbW9uVHJlZSByMCA9ICgoQ29tbW9uVHJlZSlyLnRyZWUpOworICAgICAgICAKKwkJQ29tbW9uVHJlZU5vZGVTdHJlYW0gbm9kZXMgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0ocjApOworCQlub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOworCQlMYW5nRHVtcERlY2wgd2Fsa2VyID0gbmV3IExhbmdEdW1wRGVjbChub2Rlcyk7CisJCXdhbGtlci5kZWNsKCk7CisJfQorfQorKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCit7CisgICAgTlNFcnJvciAqZXJyb3I7CisgICAgTlNMb2coQCJzdGFydGluZyB0cmVlcGFyc2VyXG4iKTsKKyAgICBOU1N0cmluZyAqZGlyID0gQCIvVXNlcnMvYWNvbmRpdC9zb3VyY2UvYW50bHIzL2Fjb25kaXRfbG9jYWxob3N0L2NvZGUvYW50bHIvbWFpbi9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVwYXJzZXIvaW5wdXQiOworCU5TU3RyaW5nICpzdHJpbmcgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aENvbnRlbnRzT2ZGaWxlOmRpciAgZW5jb2Rpbmc6TlNBU0NJSVN0cmluZ0VuY29kaW5nIGVycm9yOiZlcnJvcl07CisJTlNMb2coQCJpbnB1dCA9ICVAIiwgc3RyaW5nKTsKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOnN0cmluZ107CisJTGFuZ0xleGVyICpsZXggPSBbTGFuZ0xleGVyIG5ld0xhbmdMZXhlcldpdGhDaGFyU3RyZWFtOnN0cmVhbV07CisgICAgQU5UTFJDb21tb25Ub2tlblN0cmVhbSAqdG9rZW5zID0gW0FOVExSQ29tbW9uVG9rZW5TdHJlYW0gbmV3QU5UTFJDb21tb25Ub2tlblN0cmVhbVdpdGhUb2tlblNvdXJjZTpsZXhdOworICAgIExhbmdQYXJzZXIgKnBhcnNlciA9IFtMYW5nUGFyc2VyIG5ld0xhbmdQYXJzZXI6dG9rZW5zXTsKKy8vICAgIExhbmdQYXJzZXJfZGVjbF9yZXR1cm4gKnIgPSBbcGFyc2VyIGRlY2xdOworICAgIExhbmdQYXJzZXJfc3RhcnRfcmV0dXJuICpyID0gW3BhcnNlciBzdGFydF07CisgICAgTlNMb2coIEAidHJlZTogJUAiLCBbci50cmVlIHRvU3RyaW5nVHJlZV0pOworICAgIEFOVExSQ29tbW9uVHJlZSAqcjAgPSBbciBnZXRUcmVlXTsKKyAgICAKKyAgICBBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtICpub2RlcyA9IFtBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIG5ld0FOVExSQ29tbW9uVHJlZU5vZGVTdHJlYW06cjBdOworICAgIFtub2RlcyBzZXRUb2tlblN0cmVhbTp0b2tlbnNdOworICAgIExhbmdEdW1wRGVjbCAqd2Fsa2VyID0gW0xhbmdEdW1wRGVjbCBuZXdMYW5nRHVtcERlY2w6bm9kZXNdOworICAgIFt3YWxrZXIgZGVjbF07CisKKyAgICBOU0xvZyhAImV4aXRpbmcgdHJlZXBhcnNlclxuIik7CisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9vdXRwdXQgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcGFyc2VyL291dHB1dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGRhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXBhcnNlci9vdXRwdXQKQEAgLTAsMCArMSwyIEBACit0cmVlOiAoREVDTCBpbnQgYSkKK2ludCBhCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODJhMDgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZwpAQCAtMCwwICsxLDE5IEBACitncmFtbWFyIFRyZWVSZXdyaXRlOworCitvcHRpb25zIHsKKwlvdXRwdXQ9QVNUOworCWxhbmd1YWdlPU9iakM7Cit9CisKK3J1bGU6CUlOVCBzdWJydWxlIC0+IF4oc3VicnVsZSBJTlQpCisJOworCQorc3VicnVsZQorICAgIDogICBJTlQKKyAgICA7CisgICAgCitJTlQJOgkoJzAnLi4nOScpKworCTsKKworV1MgIDogICAnICcgeyRjaGFubmVsPUhJRERFTjt9CisgICAgOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUudG9rZW5zIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODE5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS50b2tlbnMKQEAgLTAsMCArMSwyIEBACitJTlQ9NAorV1M9NQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGVMZXhlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGVMZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTY4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZUxleGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBUcmVlUmV3cml0ZS5nIDIwMTEtMDUtMDYgMTg6NTY6MjgKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogU3RhcnQgY3ljbGljREZBSW50ZXJmYWNlICovCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjaWZkZWYgRU9GCisjdW5kZWYgRU9GCisjZW5kaWYKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIElOVCA0CisjZGVmaW5lIFdTIDUKKy8qIGludGVyZmFjZSBsZXhlciBjbGFzcyAqLworQGludGVyZmFjZSBUcmVlUmV3cml0ZUxleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMubGV4ZXIubWVtVmFycyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCit9CisrICh2b2lkKSBpbml0aWFsaXplOworKyAoVHJlZVJld3JpdGVMZXhlciAqKW5ld1RyZWVSZXdyaXRlTGV4ZXJXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0OworLyogT2JqQyBzdGFydCBhY3Rpb25zLmxleGVyLm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBhY3Rpb25zLmxleGVyLm1ldGhvZHNEZWNsICovCistICh2b2lkKSBtSU5UIDsgCistICh2b2lkKSBtV1MgOyAKKy0gKHZvaWQpIG1Ub2tlbnMgOyAKKworQGVuZCAvKiBlbmQgb2YgVHJlZVJld3JpdGVMZXhlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGVMZXhlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGVMZXhlci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWQzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZUxleGVyLm0KQEAgLTAsMCArMSwyMTAgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogVHJlZVJld3JpdGUuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDExLTA1LTA2IDE4OjU2OjI4CisgKiAgICAgLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBsZXhlciA6IFRyZWVSZXdyaXRlTGV4ZXJMZXhlcgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCisqLworLy8gJEFOVExSICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfSBUcmVlUmV3cml0ZS5nIDIwMTEtMDUtMDYgMTg6NTY6MjgKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiVHJlZVJld3JpdGVMZXhlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzISAqLworQGltcGxlbWVudGF0aW9uIFRyZWVSZXdyaXRlTGV4ZXIgLy8gbGluZSAzMzAKKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIlRyZWVSZXdyaXRlLmciXTsKK30KKworKyAoTlNTdHJpbmcgKikgdG9rZW5OYW1lRm9yVHlwZTooTlNJbnRlZ2VyKWFUb2tlblR5cGUKK3sKKyAgICByZXR1cm4gW1tzZWxmIGdldFRva2VuTmFtZXNdIG9iamVjdEF0SW5kZXg6YVRva2VuVHlwZV07Cit9CisKKysgKFRyZWVSZXdyaXRlTGV4ZXIgKiluZXdUcmVlUmV3cml0ZUxleGVyV2l0aENoYXJTdHJlYW06KGlkPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHJldHVybiBbW1RyZWVSZXdyaXRlTGV4ZXIgYWxsb2NdIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0XTsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aENoYXJTdHJlYW06YW5JbnB1dCBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MysxXSByZXRhaW5dXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMubGV4ZXIubWV0aG9kcyAqLworLyogT2JqQyBzdGFydCBtZXRob2RzKCkgKi8KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworCisvKiBTdGFydCBvZiBSdWxlcyAqLworLy8gJEFOVExSIHN0YXJ0ICJJTlQiCistICh2b2lkKSBtSU5UCit7CisgICAgLy8KKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBUcmVlUmV3cml0ZS5nOjE1OjU6ICggKCAnMCcgLi4gJzknICkrICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFRyZWVSZXdyaXRlLmc6MTU6NzogKCAnMCcgLi4gJzknICkrIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIC8vIFRyZWVSZXdyaXRlLmc6MTU6NzogKCAnMCcgLi4gJzknICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQxID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgTlNJbnRlZ2VyIGFsdDEgPSAyOworICAgICAgICAgICAgTlNJbnRlZ2VyIExBMV8wID0gW2lucHV0IExBOjFdOworICAgICAgICAgICAgaWYgKCAoKExBMV8wID49ICcwJyAmJiBMQTFfMCA8PSAnOScpKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgICAgICAgICAvLyBUcmVlUmV3cml0ZS5nOiAvLyBhbHQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKChbaW5wdXQgTEE6MV0gPj0gJzAnKSAmJiAoW2lucHV0IExBOjFdIDw9ICc5JykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gKm1zZSA9IFtBTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOm5pbCBzdHJlYW06aW5wdXRdOworICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgcmVjb3Zlcjptc2VdOworICAgICAgICAgICAgICAgICAgICAgICAgQHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDEgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246aW5wdXQgZGVjaXNpb25OdW1iZXI6MV07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQxKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybjsKK30KKy8qICRBTlRMUiBlbmQgIklOVCIgKi8KKworLy8gJEFOVExSIHN0YXJ0ICJXUyIKKy0gKHZvaWQpIG1XUworeworICAgIC8vCisgICAgLyogbXkgcnVsZVNjb3BlU2V0VXAgKi8KKyAgICAvKiBUZXJlbmNlJ3Mgc3R1ZmYgKi8KKworICAgIEB0cnkgeworICAgICAgICBOU0ludGVnZXIgX3R5cGUgPSBXUzsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyBUcmVlUmV3cml0ZS5nOjE4OjU6ICggJyAnICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFRyZWVSZXdyaXRlLmc6MTg6OTogJyAnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonICddOyAKKworCisgICAgICAgIF9jaGFubmVsPUhJRERFTjsKKworCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisKKyAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiV1MiICovCisKKy0gKHZvaWQpIG1Ub2tlbnMKK3sKKyAgICAvLyBUcmVlUmV3cml0ZS5nOjE6ODogKCBJTlQgfCBXUyApIC8vcnVsZWJsb2NrCisgICAgTlNJbnRlZ2VyIGFsdDI9MjsKKyAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICBpZiAoICgoTEEyXzAgPj0gJzAnICYmIExBMl8wIDw9ICc5JykpICkgeworICAgICAgICBhbHQyPTE7CisgICAgfQorICAgIGVsc2UgaWYgKCAoTEEyXzA9PScgJykgKSB7CisgICAgICAgIGFsdDI9MjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gKm52YWUgPSBbQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBuZXdFeGNlcHRpb246MiBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgIG52YWUuYyA9IExBMl8wOworICAgICAgICBAdGhyb3cgbnZhZTsKKworICAgIH0KKyAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgLy8gVHJlZVJld3JpdGUuZzoxOjEwOiBJTlQgLy8gYWx0CisgICAgICAgICAgICB7CisgICAgICAgICAgICBbc2VsZiBtSU5UXTsgCisKKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgLy8gVHJlZVJld3JpdGUuZzoxOjE0OiBXUyAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFtzZWxmIG1XU107IAorCisKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKK30KKworQGVuZCAvKiBlbmQgb2YgVHJlZVJld3JpdGVMZXhlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDM5NyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlUGFyc2VyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODdjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZVBhcnNlci5oCkBAIC0wLDAgKzEsMTI0IEBACisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFRyZWVSZXdyaXRlLmcgMjAxMS0wNS0wNiAxODo1NjoyOAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIE9CSkMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFIuaD4KKy8qIEVuZCBvZiBzdGFuZGFyZCBhbnRscjMgcnVudGltZSBkZWZpbml0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBwYXJzZXJIZWFkZXJGaWxlICovCisjaWZuZGVmIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCisjZGVmaW5lIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCit0eXBlZGVmIGVudW0geworICAgIEFOVExSX0VPRiA9IC0xLAorICAgIElOVkFMSUQsCisgICAgRU9SLAorICAgIERPV04sCisgICAgVVAsCisgICAgTUlOCit9IEFOVExSM1Rva2VuVHlwZTsKKyNlbmRpZgorCisjcHJhZ21hIG1hcmsgVG9rZW5zCisjaWZkZWYgRU9GCisjdW5kZWYgRU9GCisjZW5kaWYKKyNkZWZpbmUgRU9GIC0xCisjZGVmaW5lIElOVCA0CisjZGVmaW5lIFdTIDUKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHN0YXJ0CisvKiByZXR1cm5TY29wZUludGVyZmFjZSBUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybiAqLworQGludGVyZmFjZSBUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvKiByZXR1cm5TY29wZUludGVyZmFjZSBsaW5lIDE4MzggKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCitBTlRMUkNvbW1vblRyZWUgKnRyZWU7IC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovCit9CisvKiBzdGFydCBwcm9wZXJ0aWVzICovCisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcyAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuICopbmV3VHJlZVJld3JpdGVQYXJzZXJfcnVsZV9yZXR1cm47CisvKiB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8qIG1ldGhvZHNEZWNsICovCitAZW5kIC8qIGVuZCBvZiByZXR1cm5TY29wZUludGVyZmFjZSBpbnRlcmZhY2UgKi8KKworCisKKy8qIHJldHVyblNjb3BlSW50ZXJmYWNlIFRyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuICovCitAaW50ZXJmYWNlIFRyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMgKi8KK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLyogT2JqQyBzdGFydCBvZiBtZW1WYXJzKCkgKi8KK30KKy8qIHN0YXJ0IHByb3BlcnRpZXMgKi8KKy8qIEFTVCByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWUsIHNldHRlcj1zZXRUcmVlOikgQU5UTFJDb21tb25UcmVlICp0cmVlOworKyAoVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gKiluZXdUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybjsKKy8qIHRoaXMgaXMgc3RhcnQgb2Ygc2V0IGFuZCBnZXQgbWV0aG9kcyAqLworLyogQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworCistICh2b2lkKSBzZXRUcmVlOihBTlRMUkNvbW1vblRyZWUgKilhVHJlZTsKKyAgLyogbWV0aG9kc0RlY2wgKi8KK0BlbmQgLyogZW5kIG9mIHJldHVyblNjb3BlSW50ZXJmYWNlIGludGVyZmFjZSAqLworCisKKworCisvKiBJbnRlcmZhY2UgZ3JhbW1hciBjbGFzcyAqLworQGludGVyZmFjZSBUcmVlUmV3cml0ZVBhcnNlciA6IEFOVExSUGFyc2VyIHsgLyogbGluZSA1NzIgKi8KKy8qIE9iakMgc3RhcnQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisKKworLyogT2JqQyBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisvKiBPYmpDIHN0YXJ0IG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyICovCisKKworLyogT2JqQyBlbmQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVNZW1WYXIgKi8KKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZW1WYXJzICovCisvKiBPYmpDIHN0YXJ0IG9mIG1lbVZhcnMgKi8KKy8qIEFTVCBwYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMgKi8KK05TSW50ZWdlciBydWxlTGV2ZWw7CitOU0FycmF5ICpydWxlTmFtZXM7CisgIC8qIEFTVCBzdXBlci5tZW1WYXJzICovCisvKiBBU1QgcGFyc2VyTWVtVmFycyAqLworaWQ8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7ICAgLyogQVNUIHBhcnNlck1lbVZhcnMgKi8KKy8qIE9iakMgZW5kIG9mIG1lbVZhcnMgKi8KKworIH0KKworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXMgKi8KKy8qIE9iakMgc3RhcnQgb2YgcHJvcGVydGllcyAqLworLyogQVNUIHBhcnNlckhlYWRlckZpbGUucHJvcGVydGllcyAqLworICAvKiBBU1Qgc3VwZXIucHJvcGVydGllcyAqLworLyogQVNUIHBhcnNlclByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZUFkYXB0b3IsIHNldHRlcj1zZXRUcmVlQWRhcHRvcjopIGlkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOyAgIC8qIEFTVCBwYXJzZXJwcm9wZXJ0aWVzICovCisvKiBPYmpDIGVuZCBvZiBwcm9wZXJ0aWVzICovCisKKysgKHZvaWQpIGluaXRpYWxpemU7CisrIChpZCkgbmV3VHJlZVJld3JpdGVQYXJzZXI6KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW07CisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzRGVjbCAqLworLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHNEZWNsICovCisKKy8qIE9iakMgc3RhcnQgb2YgbWV0aG9kc0RlY2wgKi8KKy8qIEFTVCBwYXJzZXJIZWFkZXJGaWxlLm1ldGhvZHNEZWNsICovCisgIC8qIEFTVCBzdXBlci5tZXRob2RzRGVjbCAqLworLyogQVNUIHBhcnNlck1ldGhvZHNEZWNsICovCistIChpZDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pdGhlVHJlZUFkYXB0b3I7ICAgLyogQVNUIHBhcnNlcm1ldGhvZHNEZWNsICovCisvKiBPYmpDIGVuZCBvZiBtZXRob2RzRGVjbCAqLworCistIChUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybiAqKXJ1bGU7IAorLSAoVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gKilzdWJydWxlOyAKKworCitAZW5kIC8qIGVuZCBvZiBUcmVlUmV3cml0ZVBhcnNlciBpbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGVQYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlUGFyc2VyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0MGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlUGFyc2VyLm0KQEAgLTAsMCArMSwzODMgQEAKKy8qKiBcZmlsZQorICogIFRoaXMgT0JKQyBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uICR7cHJvamVjdC52ZXJzaW9ufSAke2J1aWxkTnVtYmVyfQorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogVHJlZVJld3JpdGUuZworICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiAyMDExLTA1LTA2IDE4OjU2OjI4CisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IFRyZWVSZXdyaXRlUGFyc2VyUGFyc2VyCisgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLgorICoKKyAqIE9iakMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEFsYW4gQ29uZGl0LCBhY29uZGl0fGhlcmVpc2FuYXR8aXBuc3xkb3Rnb2VzaGVyZXxjb20uCisgKgorICoKKyovCisvLyAkQU5UTFIgJHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9IFRyZWVSZXdyaXRlLmcgMjAxMS0wNS0wNiAxODo1NjoyOAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJUcmVlUmV3cml0ZVBhcnNlci5oIgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXJ0IG9mIHJlY29nbml6ZXIKKyAqLworCisjcHJhZ21hIG1hcmsgQml0c2V0cworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSU5UX2luX3J1bGUyNjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lOVF9pbl9ydWxlMjZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMTBMTH07CitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19zdWJydWxlX2luX3J1bGUyODsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3N1YnJ1bGVfaW5fcnVsZTI4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9Oworc3RhdGljIEFOVExSQml0U2V0ICpGT0xMT1dfSU5UX2luX3N1YnJ1bGU1MzsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lOVF9pbl9zdWJydWxlNTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CisKKworI3ByYWdtYSBtYXJrIER5bmFtaWMgR2xvYmFsIFNjb3BlcworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcworCisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHN0YXJ0CitAaW1wbGVtZW50YXRpb24gVHJlZVJld3JpdGVQYXJzZXJfcnVsZV9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybiAqKW5ld1RyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1RyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCitAaW1wbGVtZW50YXRpb24gVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gLyogcmV0dXJuU2NvcGUgKi8KKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOyAvKiBzdGFydCBvZiBzeW50aGVzaXplIC0tIE9CSkMtTGluZSAxODM3ICovCisrIChUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybiAqKW5ld1RyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuCit7CisgICAgcmV0dXJuIFtbW1RyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuIGFsbG9jXSBpbml0XSByZXRhaW5dOworfQorCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIEFTVCByZXR1cm5TY29wZS5tZXRob2RzICovCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlCit7CisgICAgaWYgKHRyZWUgIT0gYVRyZWUpIHsKKyAgICAgICAgaWYgKHRyZWUgIT0gbmlsKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKGFUcmVlICE9IG5pbCkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBzZWxmLnRyZWUgPSBuaWw7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisKKworQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi8KKworCisvLyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKy8vCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKKworQGltcGxlbWVudGF0aW9uIFRyZWVSZXdyaXRlUGFyc2VyICAvLyBsaW5lIDYzNworCisvKiBPYmpDIHN0YXJ0IG9mIHJ1bGVBdHRyaWJ1dGVTY29wZSAqLworI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMKKy8qIE9iakMgZW5kIG9mIHJ1bGVBdHRyaWJ1dGVTY29wZSAqLworI3ByYWdtYSBtYXJrIGdsb2JhbCBBdHRyaWJ1dGUgU2NvcGVzCisvKiBPYmpDIHN0YXJ0IGdsb2JhbEF0dHJpYnV0ZVNjb3BlICovCisvKiBPYmpDIGVuZCBnbG9iYWxBdHRyaWJ1dGVTY29wZSAqLworLyogT2JqQyBzdGFydCBhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZSAqLworLyogT2JqQyBlbmQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnRoZXNpemUgKi8KKy8qIE9iakMgc3RhcnQgc3ludGhlc2l6ZSgpICovCisvKiBBU1QgZ2VuZXJpY1BhcnNlci5zeW50aGVzaXplICovCisvKiBBU1QgcGFyc2VyUHJvcGVydGllcyAqLworQHN5bnRoZXNpemUgdHJlZUFkYXB0b3I7CisvKiBPYmpDIGVuZCBzeW50aGVzaXplKCkgKi8KKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgICNwcmFnbWEgbWFyayBCaXRzZXRzCisgICAgRk9MTE9XX0lOVF9pbl9ydWxlMjYgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19JTlRfaW5fcnVsZTI2X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfc3VicnVsZV9pbl9ydWxlMjggPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19zdWJydWxlX2luX3J1bGUyOF9kYXRhIENvdW50OihOU1VJbnRlZ2VyKTFdIHJldGFpbl07CisgICAgRk9MTE9XX0lOVF9pbl9zdWJydWxlNTMgPSBbW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6KGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqKUZPTExPV19JTlRfaW5fc3VicnVsZTUzX2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldFRva2VuTmFtZXM6W1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aE9iamVjdHM6QCI8aW52YWxpZD4iLCBAIjxFT1I+IiwgQCI8RE9XTj4iLCBAIjxVUD4iLCAKKyBAIklOVCIsIEAiV1MiLCBuaWxdIHJldGFpbl1dOworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIlRyZWVSZXdyaXRlLmciXTsKK30KKworKyAoVHJlZVJld3JpdGVQYXJzZXIgKiluZXdUcmVlUmV3cml0ZVBhcnNlcjooaWQ8QU5UTFJUb2tlblN0cmVhbT4pYVN0cmVhbQoreworICAgIHJldHVybiBbW1RyZWVSZXdyaXRlUGFyc2VyIGFsbG9jXSBpbml0V2l0aFRva2VuU3RyZWFtOmFTdHJlYW1dOworCisKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbSBTdGF0ZTpbW0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MisxXSByZXRhaW5dXTsKKyAgICBpZiAoIHNlbGYgIT0gbmlsICkgeworCisKKyAgICAgICAgLyogc3RhcnQgb2YgYWN0aW9ucy1hY3Rpb25TY29wZS1pbml0ICovCisgICAgICAgIC8qIHN0YXJ0IG9mIGluaXQgKi8KKyAgICAgICAgLyogQVNUIGdlbmVyaWNQYXJzZXIuaW5pdCAqLworICAgICAgICBbc2VsZiBzZXRUcmVlQWRhcHRvcjpbW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdIHJldGFpbl1dOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIC8qIEFTVCBnZW5lcmljUGFyc2VyLmRlYWxsb2MgKi8KKyAgICBbc2VsZiBzZXRUcmVlQWRhcHRvcjpuaWxdOworCisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvKiBPYmpDIHN0YXJ0IG1lbWJlcnMgKi8KKy8qIE9iakMgZW5kIG1lbWJlcnMgKi8KKy8qIE9iakMgc3RhcnQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHMgKi8KKy8qIE9iakMgZW5kIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworLyogQVNUIGdlbmVyaWNQYXJzZXIubWV0aG9kcyAqLworLyogQVNUIHBhcnNlck1ldGhvZHMgKi8KKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcgoreworCXJldHVybiB0cmVlQWRhcHRvcjsKK30KKworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFUcmVlQWRhcHRvcgoreworCWlmIChhVHJlZUFkYXB0b3IgIT0gdHJlZUFkYXB0b3IpIHsKKwkJdHJlZUFkYXB0b3IgPSBhVHJlZUFkYXB0b3I7CisJfQorfQorLyogT2JqQyBlbmQgbWV0aG9kcygpICovCisvKiBPYmpDIHN0YXJ0IHJ1bGVzICovCisvKgorICogJEFOVExSIHN0YXJ0IHJ1bGUKKyAqIFRyZWVSZXdyaXRlLmc6ODoxOiBydWxlIDogSU5UIHN1YnJ1bGUgLT4gXiggc3VicnVsZSBJTlQgKSA7CisgKi8KKy0gKFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuICopIHJ1bGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybiAqIHJldHZhbCA9IFtUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybiBuZXdUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpJTlQxID0gbmlsOworICAgICAgICAgVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gKiBzdWJydWxlMiA9IG5pbCA7CisgICAgICAgICAKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKklOVDFfdHJlZT1uaWw7CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0lOVCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIElOVCJdIHJldGFpbl07CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fc3VicnVsZSA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIHN1YnJ1bGUiXSByZXRhaW5dOworICAgICAgICAvLyBUcmVlUmV3cml0ZS5nOjg6NTogKCBJTlQgc3VicnVsZSAtPiBeKCBzdWJydWxlIElOVCApICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFRyZWVSZXdyaXRlLmc6ODo3OiBJTlQgc3VicnVsZSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBJTlQxPShBTlRMUkNvbW1vblRva2VuICopW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOklOVCBGb2xsb3c6Rk9MTE9XX0lOVF9pbl9ydWxlMjZdOyAgCisgICAgICAgICAgICBbc3RyZWFtX0lOVCBhZGRFbGVtZW50OklOVDFdOworCisKKyAgICAgICAgLyogcnVsZVJlZiAqLworICAgICAgICBbc2VsZiBwdXNoRm9sbG93OkZPTExPV19zdWJydWxlX2luX3J1bGUyOF07CisgICAgICAgIHN1YnJ1bGUyID0gW3NlbGYgc3VicnVsZV07CisKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fc3VicnVsZSBhZGRFbGVtZW50OltzdWJydWxlMiBnZXRUcmVlXV07CisKKyAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgLy8gZWxlbWVudHM6IHN1YnJ1bGUsIElOVAorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgIHJldHZhbC50cmVlID0gcm9vdF8wOworCisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtICpzdHJlYW1fcmV0dmFsID0KKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInRva2VuIHJldHZhbCIgZWxlbWVudDpyZXR2YWwhPW5pbD9bcmV0dmFsIGdldFRyZWVdOm5pbF0gcmV0YWluXTsKKworICAgICAgICByb290XzAgPSAoQU5UTFJDb21tb25UcmVlICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKworICAgICAgICAvLyA4OjE5OiAtPiBeKCBzdWJydWxlIElOVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRyZWVSZXdyaXRlLmc6ODoyMjogXiggc3VicnVsZSBJTlQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KVtzdHJlYW1fc3VicnVsZSBuZXh0Tm9kZV0gb2xkOnJvb3RfMV07CisKKyAgICAgICAgICAgICAgICAgLy8gVE9ETzogYXJnczogCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJlYW1fSU5UIG5leHROb2RlXQorICAgICAgICAgICAgICAgICB0b1RyZWU6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpyb290XzEgdG9UcmVlOnJvb3RfMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCisgICAgICAgIC8qIEFTVCBydWxlQ2xlYW5VcCAqLworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisgICAgICAgIFtzdHJlYW1fSU5UIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX3N1YnJ1bGUgcmVsZWFzZV07CisKKyAgICAgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6cmV0dmFsLnRyZWUgRnJvbTpyZXR2YWwuc3RhcnQgVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgLyogQVNUUGFyc2VyIHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSAqLworICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgZXJyb3JOb2RlOmlucHV0IEZyb206cmV0dmFsLnN0YXJ0IFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0KKworICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLyogVGVyZW5jZSdzIHN0dWZmICovCisKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgcnVsZSAqLworCisvKgorICogJEFOVExSIHN0YXJ0IHN1YnJ1bGUKKyAqIFRyZWVSZXdyaXRlLmc6MTE6MTogc3VicnVsZSA6IElOVCA7CisgKi8KKy0gKFRyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuICopIHN1YnJ1bGUKK3sKKyAgICAvKiBteSBydWxlU2NvcGVTZXRVcCAqLworICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgLyogQVNUIHJ1bGVEZWNsYXJhdGlvbnMgKi8KKyAgICBUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybiAqIHJldHZhbCA9IFtUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybiBuZXdUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybl07CisgICAgW3JldHZhbCBzZXRTdGFydDpbaW5wdXQgTFQ6MV1dOworCisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvKiBBU1QgcnVsZUxhYmVsRGVmcyAqLworICAgICAgICBBTlRMUkNvbW1vblRva2VuICpJTlQzID0gbmlsOworCisgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqSU5UM190cmVlPW5pbDsKKworICAgICAgICAvLyBUcmVlUmV3cml0ZS5nOjEyOjU6ICggSU5UICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIFRyZWVSZXdyaXRlLmc6MTI6OTogSU5UIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIHJvb3RfMCA9IChBTlRMUkNvbW1vblRyZWUgKilbW1t0cmVlQWRhcHRvciBjbGFzc10gbmV3RW1wdHlUcmVlXSByZXRhaW5dOworCisKKyAgICAgICAgLyogQVNUUGFyc2VyIHRva2VuUmVmICovCisgICAgICAgIElOVDM9KEFOVExSQ29tbW9uVG9rZW4gKilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SU5UIEZvbGxvdzpGT0xMT1dfSU5UX2luX3N1YnJ1bGU1M107IAorICAgICAgICBJTlQzX3RyZWUgPSAvKiBBU1RQYXJzZXIgY3JlYXRlTm9kZUZyb21Ub2tlbiAqLworICAgICAgICAoQU5UTFJDb21tb25UcmVlICopW1t0cmVlQWRhcHRvciBjcmVhdGU6SU5UM10gcmV0YWluXQorICAgICAgICA7CisgICAgICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDpJTlQzX3RyZWUgIHRvVHJlZTpyb290XzBdOworCisKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlQ2xlYW5VcCAqLworICAgICAgICAvKiBBU1QgcnVsZUNsZWFuVXAgKi8KKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworICAgICAgICBbcmV0dmFsIHNldFN0b3A6W2lucHV0IExUOi0xXV07CisKKworCisgICAgICAgICAgICByZXR2YWwudHJlZSA9IChBTlRMUkNvbW1vblRyZWUgKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07CisgICAgICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIC8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9CisKKyAgICBAZmluYWxseSB7CisgICAgICAgIC8qIFRlcmVuY2UncyBzdHVmZiAqLworCisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisvKiAkQU5UTFIgZW5kIHN1YnJ1bGUgKi8KKy8qIE9iakMgZW5kIHJ1bGVzICovCisKK0BlbmQgLyogZW5kIG9mIFRyZWVSZXdyaXRlUGFyc2VyIGltcGxlbWVudGF0aW9uIGxpbmUgNjkyICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9hbnRscjMuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL2FudGxyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTYyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9hbnRscjMuaApAQCAtMCwwICsxLDc5IEBACisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VNYXBFbGVtZW50Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VSZWNvZ25pemVyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJhc2VTdGFjay5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJCYXNlVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQml0U2V0Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDaGFyU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkNoYXJTdHJlYW1TdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25FcnJvck5vZGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVG9rZW4uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVG9rZW5TdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSQ29tbW9uVHJlZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlQWRhcHRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJERkEuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWcuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdFdmVudFByb3h5Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnRXZlbnRMaXN0ZW5lci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1BhcnNlci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1Rva2VuU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkRlYnVnVHJlZUFkYXB0b3IuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJEZWJ1Z1RyZWVQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSRWFybHlFeGl0RXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkVycm9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJGYXN0UXVldWUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSSGFzaE1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJIYXNoUnVsZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJJbnRBcnJheS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJJbnRTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGV4ZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGV4ZXJSdWxlUmV0dXJuU2NvcGUuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTGlua0Jhc2UuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTG9va2FoZWFkU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWFwLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRTZXRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJNaXNzaW5nVG9rZW5FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9kZU1hcEVsZW1lbnQuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUGFyc2VyLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJQdHJCdWZmZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJld3JpdGVSdWxlRWxlbWVudFN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlTWVtby5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJSdWxlU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSUnVsZVJldHVyblNjb3BlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlJ1bnRpbWVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3RyZWFtRW51bWVyYXRvci5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJTdHJpbmdTdHJlYW0uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSU3ltYm9sU3RhY2suaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblNvdXJjZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUb2tlblN0cmVhbS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJUcmVlLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVBZGFwdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVFeGNlcHRpb24uaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZUl0ZXJhdG9yLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVOb2RlU3RyZWFtLmg+CisjaW1wb3J0IDxBTlRMUi9BTlRMUlRyZWVQYXJzZXIuaD4KKyNpbXBvcnQgPEFOVExSL0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uaD4KKy8vI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW0uaD4KKy8vI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmJ1ZmZlcmVkQ29tbW9uVHJlZU5vZGVTdHJlYW1TdGF0ZS5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbmlxdWVJRE1hcC5oPgorI2ltcG9ydCA8QU5UTFIvQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmg+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9tYWluLm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9tYWluLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4ZjllMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL21haW4ubQpAQCAtMCwwICsxLDM4IEBACisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCAiYW50bHIzLmgiCisjaW1wb3J0ICJUcmVlUmV3cml0ZUxleGVyLmgiCisjaW1wb3J0ICJUcmVlUmV3cml0ZVBhcnNlci5oIgorLy8jaW1wb3J0ICJzdGRpby5oIgorLy8jaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBtYWluKCkgeworCU5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07CisKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAiMjMgNDIiXTsKKwlUcmVlUmV3cml0ZUxleGVyICpsZXhlciA9IFtUcmVlUmV3cml0ZUxleGVyIG5ld1RyZWVSZXdyaXRlTGV4ZXJXaXRoQ2hhclN0cmVhbTpzdHJlYW1dOworCQorLy8gICAgaWQ8QU5UTFJUb2tlbj4gY3VycmVudFRva2VuOworLy8gICAgd2hpbGUgKChjdXJyZW50VG9rZW4gPSBbbGV4ZXIgbmV4dFRva2VuXSkgJiYgW2N1cnJlbnRUb2tlbiB0eXBlXSAhPSBBTlRMUlRva2VuVHlwZUVPRikgeworLy8gICAgICAgIE5TTG9nKEAiJUAiLCBjdXJyZW50VG9rZW4pOworLy8gICAgfQorCQorCUFOVExSQ29tbW9uVG9rZW5TdHJlYW0gKnRva2VuU3RyZWFtID0gW0FOVExSQ29tbW9uVG9rZW5TdHJlYW0gbmV3QU5UTFJDb21tb25Ub2tlblN0cmVhbVdpdGhUb2tlblNvdXJjZTpsZXhlcl07CisJVHJlZVJld3JpdGVQYXJzZXIgKnBhcnNlciA9IFtbVHJlZVJld3JpdGVQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06dG9rZW5TdHJlYW1dOworCUFOVExSQ29tbW9uVHJlZSAqcnVsZV90cmVlID0gW1twYXJzZXIgcnVsZV0gZ2V0VHJlZV07CisJTlNMb2coQCJ0cmVlOiAlQCIsIFtydWxlX3RyZWUgdHJlZURlc2NyaXB0aW9uXSk7CisvLwlBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtICp0cmVlU3RyZWFtID0gW1tBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtIGFsbG9jXSBpbml0V2l0aFRyZWU6cHJvZ3JhbV90cmVlXTsKKy8vCVNpbXBsZUNUUCAqd2Fsa2VyID0gW1tTaW1wbGVDVFAgYWxsb2NdIGluaXRXaXRoVHJlZU5vZGVTdHJlYW06dHJlZVN0cmVhbV07CisvLwlbd2Fsa2VyIHByb2dyYW1dOworCisJW2xleGVyIHJlbGVhc2VdOworCVtzdHJlYW0gcmVsZWFzZV07CisJW3Rva2VuU3RyZWFtIHJlbGVhc2VdOworCVtwYXJzZXIgcmVsZWFzZV07CisvLwlbdHJlZVN0cmVhbSByZWxlYXNlXTsKKy8vCVt3YWxrZXIgcmVsZWFzZV07CisKKwlbcG9vbCByZWxlYXNlXTsKKyAgICAvLyBzbGVlcCBmb3Igb2JqZWN0YWxsb2MKKyAgICAvLyB3aGlsZSgxKSBzbGVlcCg2MCk7CisJcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZS50b2tlbnMgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9vdXRwdXQxL1RyZWVSZXdyaXRlLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE4Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZS50b2tlbnMKQEAgLTAsMCArMSwyIEBACitXUz01CitJTlQ9NApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZUxleGVyLmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9vdXRwdXQxL1RyZWVSZXdyaXRlTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdmMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZUxleGVyLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gJEFOVExSIDMuMiBBdWcgMjAsIDIwMTAgMTU6MDA6MTkgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nIDIwMTAtMDgtMjAgMTU6MDM6MTQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgImFudGxyMy5oIgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIFN0YXJ0IGN5Y2xpY0RGQUludGVyZmFjZSAqLworCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0CisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIGVuZAorI3ByYWdtYSBtYXJrIFRva2VucworI2RlZmluZSBJTlQgNAorI2RlZmluZSBXUyA1CisjZGVmaW5lIEVPRiAtMQorQGludGVyZmFjZSBUcmVlUmV3cml0ZUxleGVyIDogQU5UTFJMZXhlciB7IC8vIGxpbmUgMjgzCisvLyBzdGFydCBvZiBhY3Rpb25zLmxleGVyLm1lbVZhcnMKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZW1WYXJzCit9CisrIChUcmVlUmV3cml0ZUxleGVyICopbmV3VHJlZVJld3JpdGVMZXhlcjooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0OworCistICh2b2lkKW1JTlQ7IAorLSAodm9pZCltV1M7IAorLSAodm9pZCltVG9rZW5zOyAKKworQGVuZCAvKiBlbmQgb2YgVHJlZVJld3JpdGVMZXhlciBpbnRlcmZhY2UgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL291dHB1dDEvVHJlZVJld3JpdGVMZXhlci5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZUxleGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MmIwNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL291dHB1dDEvVHJlZVJld3JpdGVMZXhlci5tCkBAIC0wLDAgKzEsMjI0IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAzLjIgQXVnIDIwLCAyMDEwIDE1OjAwOjE5CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMC0wOC0yMCAxNTowMzoxNAorICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiBUcmVlUmV3cml0ZUxleGVyTGV4ZXIgKgorICogRWRpdGluZyBpdCwgYXQgbGVhc3QgbWFudWFsbHksIGlzIG5vdCB3aXNlLiAKKyAqCisgKiBDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBKaW0gSWRsZSwgamltaXxoZXJlaXNhbmF0fGlkbGV8ZG90Z29lc2hlcmV8d3MuCisgKgorICoKKyovCisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMTAgQWxhbiBDb25kaXQKKy8vCisvLyBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyBhcmUgbWV0OgorLy8gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisvLyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorLy8gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworLy8gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKy8vIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKy8vIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorLy8gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKy8vIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vICRBTlRMUiAzLjIgQXVnIDIwLCAyMDEwIDE1OjAwOjE5IC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZyAyMDEwLTA4LTIwIDE1OjAzOjE0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmNsdWRlIHRoZSBBTlRMUjMgZ2VuZXJhdGVkIGhlYWRlciBmaWxlLgorICovCisjaW1wb3J0ICJUcmVlUmV3cml0ZUxleGVyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworCisvKiogQXMgcGVyIFRlcmVuY2U6IE5vIHJldHVybnMgZm9yIGxleGVyIHJ1bGVzIQorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBzdGFydAorI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKKyovCitAaW1wbGVtZW50YXRpb24gVHJlZVJld3JpdGVMZXhlciAvLyBsaW5lIDMzMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nIl07Cit9CisKKysgKE5TU3RyaW5nICopIHRva2VuTmFtZUZvclR5cGU6KE5TSW50ZWdlcilhVG9rZW5UeXBlCit7CisgICAgcmV0dXJuIFtbc2VsZiBnZXRUb2tlbk5hbWVzXSBvYmplY3RBdEluZGV4OmFUb2tlblR5cGVdOworfQorCisrIChUcmVlUmV3cml0ZUxleGVyICopbmV3VHJlZVJld3JpdGVMZXhlcjooaWQ8QU5UTFJDaGFyU3RyZWFtPilhbklucHV0Cit7CisgICAgcmV0dXJuIFtbVHJlZVJld3JpdGVMZXhlciBhbGxvY10gaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXRdOworfQorCistIChpZCkgaW5pdFdpdGhDaGFyU3RyZWFtOihpZDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46MysxXV0pICE9IG5pbCkgeworCisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCisvLyBTdGFydCBvZiBhY3Rpb25zLmxleGVyLm1ldGhvZHMKKy8vIHN0YXJ0IG1ldGhvZHMoKQorCisvLyBTdGFydCBvZiBSdWxlcworLy8gJEFOVExSIHN0YXJ0ICJJTlQiCistICh2b2lkKSBtSU5UCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IElOVDsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmc6MTU6NTogKCAoICcwJyAuLiAnOScgKSsgKSAvLyBydWxlQmxvY2tTaW5nbGVBbHQKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nOjE1Ojc6ICggJzAnIC4uICc5JyApKyAvLyBhbHQKKyAgICAgICAgeworICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmc6MTU6NzogKCAnMCcgLi4gJzknICkrIC8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisgICAgICAgIE5TSW50ZWdlciBjbnQxPTA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5TSW50ZWdlciBhbHQxPTI7CisgICAgICAgICAgICBOU0ludGVnZXIgTEExXzAgPSBbaW5wdXQgTEE6MV07CisgICAgICAgICAgICBpZiAoICgoTEExXzA+PScwJyAmJiBMQTFfMDw9JzknKSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6IDsKKyAgICAgICAgICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nOjE1Ojg6ICcwJyAuLiAnOScgLy8gYWx0CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYgbWF0Y2hSYW5nZUZyb21DaGFyOicwJyB0bzonOSddOyAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICBpZiAoIGNudDEgPj0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3AxOworICAgICAgICAgICAgICAgICAgICBBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbiAqZWVlID0gW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhTdHJlYW06aW5wdXQgZGVjaXNpb25OdW1iZXI6MV07CisgICAgICAgICAgICAgICAgICAgIEB0aHJvdyBlZWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQxKys7CisgICAgICAgIH0gd2hpbGUgKFlFUyk7CisgICAgICAgIGxvb3AxOiA7CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gdG9rZW4rcnVsZSBsaXN0IGxhYmVscworCisgICAgICAgIFtzdGF0ZSBzZXRUeXBlOl90eXBlXTsKKworICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgLy8KKyAgICB9CisgICAgcmV0dXJuOworfQorLy8gJEFOVExSIGVuZCAiSU5UIgorCisvLyAkQU5UTFIgc3RhcnQgIldTIgorLSAodm9pZCkgbVdTCit7CisgICAgLy8KKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgQHRyeSB7CisgICAgICAgIE5TSW50ZWdlciBfdHlwZSA9IFdTOworICAgICAgICBOU0ludGVnZXIgX2NoYW5uZWwgPSBBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQ7CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZzoxODo1OiAoICcgJyApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmc6MTg6OTogJyAnIC8vIGFsdAorICAgICAgICB7CisgICAgICAgIFtzZWxmIG1hdGNoQ2hhcjonICddOyAKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgc3RhdGUuY2hhbm5lbD05OTsgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgLyogZWxlbWVudHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKworICAgICAgICBbc3RhdGUgc2V0VHlwZTpfdHlwZV07CisKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgIH0KKyAgICBAZmluYWxseSB7CisgICAgICAgIC8vCisgICAgfQorICAgIHJldHVybjsKK30KKy8vICRBTlRMUiBlbmQgIldTIgorCistICh2b2lkKSBtVG9rZW5zCit7CisgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nOjE6ODogKCBJTlQgfCBXUyApIC8vcnVsZWJsb2NrCisgICAgTlNJbnRlZ2VyIGFsdDI9MjsKKyAgICBOU0ludGVnZXIgTEEyXzAgPSBbaW5wdXQgTEE6MV07CisKKyAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKSkgKSB7CisgICAgICAgIGFsdDI9MTsKKyAgICB9CisgICAgZWxzZSBpZiAoIChMQTJfMD09JyAnKSApIHsKKyAgICAgICAgYWx0Mj0yOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSA9IFtBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uIG5ld0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb246MiBzdGF0ZTowIHN0cmVhbTppbnB1dF07CisgICAgICAgIEB0aHJvdyBudmFlOworICAgIH0KKyAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgY2FzZSAxIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nOjE6MTA6IElOVCAvLyBhbHQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBtSU5UXTsgCisgICAgICAgICAgICAgIC8qIGVsZW1lbnQoKSAqLworICAgICAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyIDogOworICAgICAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nOjE6MTQ6IFdTIC8vIGFsdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFtzZWxmIG1XU107IAorICAgICAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgICAgICAvKiBlbGVtZW50cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKK30KKworQGVuZCAvLyBlbmQgb2YgVHJlZVJld3JpdGVMZXhlciBpbXBsZW1lbnRhdGlvbiAvLyBsaW5lIDM5NworCisvKiBFbmQgb2YgY29kZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZVBhcnNlci5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OGU3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9vdXRwdXQxL1RyZWVSZXdyaXRlUGFyc2VyLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gJEFOVExSIDMuMiBBdWcgMjAsIDIwMTAgMTU6MDA6MTkgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nIDIwMTAtMDgtMjAgMTU6MDM6MTQKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCA8Q29jb2EvQ29jb2EuaD4KKyNpbXBvcnQgImFudGxyMy5oIgorLyogRW5kIG9mIHN0YW5kYXJkIGFudGxyMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNkZWZpbmUgV1MgNQorI2RlZmluZSBJTlQgNAorI2RlZmluZSBFT0YgLTEKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHN0YXJ0CitAaW50ZXJmYWNlIFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuIDpBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZSB7IC8vIGxpbmUgMTY3MgorLy8gcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycworQU5UTFJDb21tb25UcmVlICp0cmVlOyAvLyBzdGFydCBvZiBtZW1WYXJzKCkKK30KKworLy8gc3RhcnQgcHJvcGVydGllcworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIEFOVExSQ29tbW9uVHJlZSAqdHJlZTsKKysgKFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuICopbmV3VHJlZVJld3JpdGVQYXJzZXJfcnVsZV9yZXR1cm47CisvLyB0aGlzIGlzIHN0YXJ0IG9mIHNldCBhbmQgZ2V0IG1ldGhvZHMKKy8vIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNkZWNsCistIChBTlRMUkNvbW1vblRyZWUgKilnZXRUcmVlOworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWU7CisgIC8vIG1ldGhvZHNEZWNsCitAZW5kIAorQGludGVyZmFjZSBUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybiA6QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgeyAvLyBsaW5lIDE2NzIKKy8vIHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMKK0FOVExSQ29tbW9uVHJlZSAqdHJlZTsgLy8gc3RhcnQgb2YgbWVtVmFycygpCit9CisKKy8vIHN0YXJ0IHByb3BlcnRpZXMKK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VHJlZSwgc2V0dGVyPXNldFRyZWU6KSBBTlRMUkNvbW1vblRyZWUgKnRyZWU7CisrIChUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybiAqKW5ld1RyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuOworLy8gdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzCisvLyByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzZGVjbAorLSAoQU5UTFJDb21tb25UcmVlICopZ2V0VHJlZTsKKy0gKHZvaWQpIHNldFRyZWU6KEFOVExSQ29tbW9uVHJlZSAqKWFUcmVlOworICAvLyBtZXRob2RzRGVjbAorQGVuZCAKKworI3ByYWdtYSBtYXJrIFJ1bGUgcmV0dXJuIHNjb3BlcyBlbmQKK0BpbnRlcmZhY2UgVHJlZVJld3JpdGVQYXJzZXIgOiBBTlRMUlBhcnNlciB7IC8vIGxpbmUgNTI5CisvLyBzdGFydCBvZiBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhcgorCisKKy8vIHN0YXJ0IG9mIGFjdGlvbi1hY3Rpb25TY29wZS1tZW1WYXJzCisvLyBzdGFydCBvZiBydWxlQXR0cmlidXRlU2NvcGVNZW1WYXIKKworCisvLyBTdGFydCBvZiBtZW1WYXJzCisvLyBwYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMKKy8vIHBhcnNlcm1lbVZhcnMKK2lkPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworCisgfQorCisvLyBzdGFydCBvZiBhY3Rpb24tYWN0aW9uU2NvcGUtbWV0aG9kc0RlY2wKKworLy8gcGFyc2VySGVhZGVyRmlsZS5tZXRob2RzZGVjbAorLy8gcGFyc2VyTWV0aG9kc0RlY2wKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcjsKKy0gKHZvaWQpIHNldFRyZWVBZGFwdG9yOihpZDxBTlRMUlRyZWVBZGFwdG9yPil0aGVUcmVlQWRhcHRvcjsKKworLSAoVHJlZVJld3JpdGVQYXJzZXJfcnVsZV9yZXR1cm4gKiltcnVsZTsgCistIChUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybiAqKW1zdWJydWxlOyAKKworCitAZW5kIC8qIGVuZCBvZiBUcmVlUmV3cml0ZVBhcnNlciBpbnRlcmZhY2UgKi8KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL291dHB1dDEvVHJlZVJld3JpdGVQYXJzZXIubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL291dHB1dDEvVHJlZVJld3JpdGVQYXJzZXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQwODVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvb3V0cHV0MS9UcmVlUmV3cml0ZVBhcnNlci5tCkBAIC0wLDAgKzEsMzU0IEBACisvKiogXGZpbGUKKyAqICBUaGlzIE9CSkMgc291cmNlIGZpbGUgd2FzIGdlbmVyYXRlZCBieSAkQU5UTFIgdmVyc2lvbiAzLjIgQXVnIDIwLCAyMDEwIDE1OjAwOjE5CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmcKKyAqICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIDogMjAxMC0wOC0yMCAxNTowMzoxNAorICogICAgIC0gICAgICAgICAgICAgICAgZm9yIHRoZSBwYXJzZXIgOiBUcmVlUmV3cml0ZVBhcnNlclBhcnNlciAqCisgKiBFZGl0aW5nIGl0LCBhdCBsZWFzdCBtYW51YWxseSwgaXMgbm90IHdpc2UuIAorICoKKyAqIEMgbGFuZ3VhZ2UgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGJ5IEppbSBJZGxlLCBqaW1pfGhlcmVpc2FuYXR8aWRsZXxkb3Rnb2VzaGVyZXx3cy4KKyAqCisgKgorKi8KKy8vIFtUaGUgIkJTRCBsaWNlbmNlIl0KKy8vIENvcHlyaWdodCAoYykgMjAxMCBBbGFuIENvbmRpdAorLy8KKy8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKy8vIGFyZSBtZXQ6CisvLyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisvLyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisvLyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorLy8gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisvLyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorLy8gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gJEFOVExSIDMuMiBBdWcgMjAsIDIwMTAgMTU6MDA6MTkgL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nIDIwMTAtMDgtMjAgMTU6MDM6MTQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluY2x1ZGUgdGhlIEFOVExSMyBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCisgKi8KKyNpbXBvcnQgIlRyZWVSZXdyaXRlUGFyc2VyLmgiCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworCisKKyNwcmFnbWEgbWFyayBCaXRzZXRzCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JTlRfaW5fcnVsZTI2OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lOVF9pbl9ydWxlMjZfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMTBMTH07CisKK3N0YXRpYyBBTlRMUkJpdFNldCAqRk9MTE9XX3N1YnJ1bGVfaW5fcnVsZTI4OworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX3N1YnJ1bGVfaW5fcnVsZTI4X2RhdGFbXSA9IHsgMHgwMDAwMDAwMDAwMDAwMDAyTEx9OworCitzdGF0aWMgQU5UTFJCaXRTZXQgKkZPTExPV19JTlRfaW5fc3VicnVsZTUzOworCitjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgRk9MTE9XX0lOVF9pbl9zdWJydWxlNTNfZGF0YVtdID0geyAweDAwMDAwMDAwMDAwMDAwMDJMTH07CisKKworCisjcHJhZ21hIG1hcmsgRHluYW1pYyBHbG9iYWwgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzCisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgc3RhcnQKK0BpbXBsZW1lbnRhdGlvbiBUcmVlUmV3cml0ZVBhcnNlcl9ydWxlX3JldHVybgorQHN5bnRoZXNpemUgdHJlZTsKKysgKFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuICopbmV3VHJlZVJld3JpdGVQYXJzZXJfcnVsZV9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbVHJlZVJld3JpdGVQYXJzZXJfcnVsZV9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8vIHJldHVyblNjb3BlLm1ldGhvZHMKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFRyZWU6bmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCisKK0BlbmQgCisKK0BpbXBsZW1lbnRhdGlvbiBUcmVlUmV3cml0ZVBhcnNlcl9zdWJydWxlX3JldHVybgorQHN5bnRoZXNpemUgdHJlZTsKKysgKFRyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuICopbmV3VHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4KK3sKKyAgICByZXR1cm4gW1tbVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gYWxsb2NdIGluaXRdIHJldGFpbl07Cit9CisKKy8vIHJldHVyblNjb3BlLm1ldGhvZHMKKy0gKEFOVExSQ29tbW9uVHJlZSAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooQU5UTFJDb21tb25UcmVlICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAodHJlZSAhPSBuaWwpIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoYVRyZWUgIT0gbmlsKSBbYVRyZWUgcmV0YWluXTsKKyAgICAgICAgdHJlZSA9IGFUcmVlOworICAgIH0KK30KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIFtzZWxmIHNldFRyZWU6bmlsXTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKworCisKK0BlbmQgCisKKworCitAaW1wbGVtZW50YXRpb24gVHJlZVJld3JpdGVQYXJzZXIgIC8vIGxpbmUgNjEwCisKKysgKHZvaWQpIGluaXRpYWxpemUKK3sKKyAgICBGT0xMT1dfSU5UX2luX3J1bGUyNiA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lOVF9pbl9ydWxlMjZfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworICAgIEZPTExPV19zdWJydWxlX2luX3J1bGUyOCA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX3N1YnJ1bGVfaW5fcnVsZTI4X2RhdGEgQ291bnQ6KE5TVUludGVnZXIpMV0gcmV0YWluXTsKKyAgICBGT0xMT1dfSU5UX2luX3N1YnJ1bGU1MyA9IFtbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czooY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICopRk9MTE9XX0lOVF9pbl9zdWJydWxlNTNfZGF0YSBDb3VudDooTlNVSW50ZWdlcikxXSByZXRhaW5dOworCisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0VG9rZW5OYW1lczpbW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6QCI8aW52YWxpZD4iLCBAIjxFT1I+IiwgQCI8RE9XTj4iLCBAIjxVUD4iLCAKKyBAIklOVCIsIEAiV1MiLCBuaWxdIHJldGFpbl1dOworfQorCisrIChUcmVlUmV3cml0ZVBhcnNlciAqKW5ld1RyZWVSZXdyaXRlUGFyc2VyOihpZDxBTlRMUlRva2VuU3RyZWFtPilhU3RyZWFtCit7CisgICAgcmV0dXJuIFtbVHJlZVJld3JpdGVQYXJzZXIgYWxsb2NdIGluaXRXaXRoVG9rZW5TdHJlYW06YVN0cmVhbV07CisKK30KKworLSAoaWQpIGluaXRXaXRoVG9rZW5TdHJlYW06KGlkPEFOVExSVG9rZW5TdHJlYW0+KWFTdHJlYW0KK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtIFN0YXRlOltbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjoyKzFdIHJldGFpbl1dKSAhPSBuaWwpIHsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gc3RhcnQgb2YgYWN0aW9ucy1hY3Rpb25TY29wZS1pbml0CisgICAgICAgIC8vIHN0YXJ0IG9mIGluaXQKKyAgICAgICAgLy8gZ2VuZXJpY1BhcnNlci5pbml0CisgICAgICAgIFtzZWxmIHNldFRyZWVBZGFwdG9yOltbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdBTlRMUkNvbW1vblRyZWVBZGFwdG9yXSByZXRhaW5dXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlQWRhcHRvcjpuaWxdOworCisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorLy8gc3RhcnQgYWN0aW9ucy5hY3Rpb25TY29wZS5tZXRob2RzCisvLyBzdGFydCBtZXRob2RzKCkKKy8vIGdlbmVyaWNQYXJzZXIubWV0aG9kcworLy8gcGFyc2VyTWV0aG9kcworLSAoaWQ8QU5UTFJUcmVlQWRhcHRvcj4pIGdldFRyZWVBZGFwdG9yCit7CisJcmV0dXJuIHRyZWVBZGFwdG9yOworfQorCistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWQ8QU5UTFJUcmVlQWRhcHRvcj4pYVRyZWVBZGFwdG9yCit7CisJaWYgKGFUcmVlQWRhcHRvciAhPSB0cmVlQWRhcHRvcikgeworCQl0cmVlQWRhcHRvciA9IGFUcmVlQWRhcHRvcjsKKwl9Cit9CisvLyBzdGFydCBydWxlcworLyoKKyAqICRBTlRMUiBzdGFydCBydWxlCisgKiAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmc6ODoxOiBydWxlIDogSU5UIHN1YnJ1bGUgLT4gXiggc3VicnVsZSBJTlQgKSA7CisgKi8KKy0gKFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuICopIHJ1bGUKK3sKKyAgICAvLyBydWxlU2NvcGVTZXRVcAorCisgICAgLy8gcnVsZURlY2xhcmF0aW9ucworICAgIFRyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuICogcmV0dmFsID0gW1RyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuIG5ld1RyZWVSZXdyaXRlUGFyc2VyX3J1bGVfcmV0dXJuXTsKKyAgICBbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07CisKKyAgICBBTlRMUkNvbW1vblRyZWUgKnJvb3RfMCA9IG5pbDsKKworICAgIEB0cnkgeworICAgICAgICAvLyBydWxlTGFiZWxEZWZzCisgICAgICAgIGlkPEFOVExSVG9rZW4+IElOVDEgPSBuaWw7CisgICAgICAgIFRyZWVSZXdyaXRlUGFyc2VyX3N1YnJ1bGVfcmV0dXJuICogc3VicnVsZTIgPSBuaWw7CisKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKklOVDFfdHJlZT1uaWw7CisgICAgICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtX0lOVCA9IAorICAgICAgICAgICAgW1tBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiBJTlQiXSByZXRhaW5dOworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3N1YnJ1bGUgPSAKKyAgICAgICAgICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJ1bGUgc3VicnVsZSJdIHJldGFpbl07CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZzo4OjU6ICggSU5UIHN1YnJ1bGUgLT4gXiggc3VicnVsZSBJTlQgKSApIC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmc6ODo3OiBJTlQgc3VicnVsZSAvLyBhbHQKKyAgICAgICAgeworICAgICAgICBJTlQxPShpZDxBTlRMUlRva2VuPilbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6SU5UIEZvbGxvdzpGT0xMT1dfSU5UX2luX3J1bGUyNl07ICAKKyAgICAgICAgICAgIFtzdHJlYW1fSU5UIGFkZEVsZW1lbnQ6SU5UMV07CisgICAgICAgICAgLyogZWxlbWVudCgpICovCisgICAgICAgIFtzZWxmIHB1c2hGb2xsb3c6Rk9MTE9XX3N1YnJ1bGVfaW5fcnVsZTI4XTsKKyAgICAgICAgc3VicnVsZTIgPSBbc2VsZiBzdWJydWxlXTsKKyAgICAgICAgW3NlbGYgcG9wRm9sbG93XTsKKworCisgICAgICAgIFtzdHJlYW1fc3VicnVsZSBhZGRFbGVtZW50OltzdWJydWxlMiBnZXRUcmVlXV07ICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisKKyAgICAgICAgLy8gQVNUIFJFV1JJVEUKKyAgICAgICAgLy8gZWxlbWVudHM6IElOVCwgc3VicnVsZQorICAgICAgICAvLyB0b2tlbiBsYWJlbHM6IAorICAgICAgICAvLyBydWxlIGxhYmVsczogcmV0dmFsCisgICAgICAgIC8vIHRva2VuIGxpc3QgbGFiZWxzOiAKKyAgICAgICAgLy8gcnVsZSBsaXN0IGxhYmVsczogCisgICAgICAgIC8vIHdpbGRjYXJkIGxhYmVsczogCisgICAgICAgICBbcmV0dmFsIHNldFRyZWU6cm9vdF8wXTsKKworICAgICAgICByZXR2YWwudHJlZSA9IHJvb3RfMDsKKworICAgICAgICBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtX3JldHZhbCA9CisgICAgICAgICAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiByZXR2YWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6cmV0dmFsIT1uaWw/W3JldHZhbCBnZXRUcmVlXTpuaWxdIHJldGFpbl07CisKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgLy8gODoxOTogLT4gXiggc3VicnVsZSBJTlQgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAvdXNyL2xvY2FsL0FOVExSMy1PYmpDMi4wLVJ1bnRpbWUvRnJhbWV3b3JrL2V4YW1wbGVzL3RyZWVyZXdyaXRlL1RyZWVSZXdyaXRlLmc6ODoyMjogXiggc3VicnVsZSBJTlQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgICAgICAgICAgICAgcm9vdF8xID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OihpZDxBTlRMUlRyZWU+KVtzdHJlYW1fc3VicnVsZSBuZXh0Tm9kZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQ6cm9vdF8xXTsKKworICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhcmdzOiAKKyAgICAgICAgICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV9JTlQgbmV4dE5vZGVdIHRvVHJlZTpyb290XzFdOworCisgICAgICAgICAgICAgICAgW3RyZWVBZGFwdG9yIGFkZENoaWxkOnJvb3RfMSB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSByb290XzA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRva2VuK3J1bGUgbGlzdCBsYWJlbHMKKyAgICAgICAgW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOworCisgICAgICAgIFtzdHJlYW1fSU5UIHJlbGVhc2VdOworICAgICAgICBbc3RyZWFtX3N1YnJ1bGUgcmVsZWFzZV07CisKKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIHJ1bGVQb3N0UHJvY2Vzc2luZzpyb290XzBdOworICAgICAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0VG9rZW4gVG86cmV0dmFsLnN0b3BUb2tlbl07CisKKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgIFtzZWxmIHJlY292ZXI6aW5wdXQgRXhjZXB0aW9uOnJlXTsKKyAgICAgICAgcmV0dmFsLnRyZWUgPSAoQU5UTFJDb21tb25UcmVlICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOltpbnB1dCBMVDotMV0gRXhjZXB0aW9uOnJlXTsKKworICAgIH0gICAgQGZpbmFsbHkgeworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorLyogJEFOVExSIGVuZCBydWxlICovCisvKgorICogJEFOVExSIHN0YXJ0IHN1YnJ1bGUKKyAqIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZzoxMToxOiBzdWJydWxlIDogSU5UIDsKKyAqLworLSAoVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gKikgc3VicnVsZQoreworICAgIC8vIHJ1bGVTY29wZVNldFVwCisKKyAgICAvLyBydWxlRGVjbGFyYXRpb25zCisgICAgVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gKiByZXR2YWwgPSBbVHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm4gbmV3VHJlZVJld3JpdGVQYXJzZXJfc3VicnVsZV9yZXR1cm5dOworICAgIFtyZXR2YWwgc2V0U3RhcnQ6W2lucHV0IExUOjFdXTsKKworICAgIEFOVExSQ29tbW9uVHJlZSAqcm9vdF8wID0gbmlsOworCisgICAgQHRyeSB7CisgICAgICAgIC8vIHJ1bGVMYWJlbERlZnMKKyAgICAgICAgaWQ8QU5UTFJUb2tlbj4gSU5UMyA9IG5pbDsKKworICAgICAgICBBTlRMUkNvbW1vblRyZWUgKklOVDNfdHJlZT1uaWw7CisKKyAgICAgICAgLy8gL3Vzci9sb2NhbC9BTlRMUjMtT2JqQzIuMC1SdW50aW1lL0ZyYW1ld29yay9leGFtcGxlcy90cmVlcmV3cml0ZS9UcmVlUmV3cml0ZS5nOjEyOjU6ICggSU5UICkgLy8gcnVsZUJsb2NrU2luZ2xlQWx0CisgICAgICAgIC8vIC91c3IvbG9jYWwvQU5UTFIzLU9iakMyLjAtUnVudGltZS9GcmFtZXdvcmsvZXhhbXBsZXMvdHJlZXJld3JpdGUvVHJlZVJld3JpdGUuZzoxMjo5OiBJTlQgLy8gYWx0CisgICAgICAgIHsKKyAgICAgICAgcm9vdF8wID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisKKyAgICAgICAgSU5UMz0oaWQ8QU5UTFJUb2tlbj4pW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOklOVCBGb2xsb3c6Rk9MTE9XX0lOVF9pbl9zdWJydWxlNTNdOyAKKyAgICAgICAgSU5UM190cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVtbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTpJTlQzXSByZXRhaW5dOworICAgICAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6SU5UM190cmVlICB0b1RyZWU6cm9vdF8wXTsKKyAgICAgICAgICAvKiBlbGVtZW50KCkgKi8KKyAgICAgICAgIC8qIGVsZW1lbnRzICovCisgICAgICAgIH0KKworICAgICAgICAvLyB0b2tlbitydWxlIGxpc3QgbGFiZWxzCisgICAgICAgIFtyZXR2YWwgc2V0U3RvcDpbaW5wdXQgTFQ6LTFdXTsKKworCisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICAgICAgW3RyZWVBZGFwdG9yIHNldFRva2VuQm91bmRhcmllczpyZXR2YWwudHJlZSBGcm9tOnJldHZhbC5zdGFydFRva2VuIFRvOnJldHZhbC5zdG9wVG9rZW5dOworCisgICAgfQorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIHJldHZhbC50cmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlQWRhcHRvciBlcnJvck5vZGU6aW5wdXQgRnJvbTpyZXR2YWwuc3RhcnRUb2tlbiBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07CisKKyAgICB9ICAgIEBmaW5hbGx5IHsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKy8qICRBTlRMUiBlbmQgc3VicnVsZSAqLworCitAZW5kIC8qIGVuZCBvZiBUcmVlUmV3cml0ZVBhcnNlciBpbXBsZW1lbnRhdGlvbiBsaW5lIDY2OSAqLworCisKKy8qIEVuZCBvZiBjb2RlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9maWxlbGlzdC5qYXZhIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZmlsZWxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWE1NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvZmlsZWxpc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACitBTlRMUkJhc2VSZWNvZ25pemVyLmphdmEKK0FOVExSQmFzZVRyZWUuamF2YQorQU5UTFJCYXNlVHJlZUFkYXB0b3IuamF2YQorQU5UTFJCaXRTZXQuamF2YQorQU5UTFJCbGFua0RlYnVnRXZlbnRMaXN0ZW5lci5qYXZhCitBTlRMUkJ1ZmZlcmVkVG9rZW5TdHJlYW0uamF2YQorQU5UTFJCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmEKK0FOVExSQ2hhclN0cmVhbS5qYXZhCitBTlRMUkNoYXJTdHJlYW1TdGF0ZS5qYXZhCitBTlRMUkNsYXNzaWNUb2tlbi5qYXZhCitBTlRMUkNvbW1vbkVycm9yTm9kZS5qYXZhCitBTlRMUkNvbW1vblRva2VuLmphdmEKK0FOVExSQ29tbW9uVG9rZW5TdHJlYW0uamF2YQorQU5UTFJDb21tb25UcmVlLmphdmEKK0FOVExSQ29tbW9uVHJlZUFkYXB0b3IuamF2YQorQU5UTFJDb21tb25UcmVlTm9kZVN0cmVhbS5qYXZhCitBTlRMUkRlYnVnRXZlbnRIdWIuamF2YQorQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuamF2YQorQU5UTFJEZWJ1Z0V2ZW50UmVwZWF0ZXIuamF2YQorQU5UTFJEZWJ1Z0V2ZW50U29ja2V0UHJveHkuamF2YQorQU5UTFJEZWJ1Z1BhcnNlci5qYXZhCitBTlRMUkRlYnVnVG9rZW5TdHJlYW0uamF2YQorQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLmphdmEKK0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5qYXZhCitBTlRMUkRlYnVnVHJlZVBhcnNlci5qYXZhCitBTlRMUkRGQS5qYXZhCitBTlRMUkRPVFRyZWVHZW5lcmF0b3IuamF2YQorQU5UTFJFYXJseUV4aXRFeGNlcHRpb24uamF2YQorQU5UTFJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uamF2YQorQU5UTFJGYXN0UXVldWUuamF2YQorQU5UTFJGaWxlU3RyZWFtLmphdmEKK0FOVExSSW5wdXRTdHJlYW0uamF2YQorQU5UTFJJbnRBcnJheS5qYXZhCitBTlRMUkludFN0cmVhbS5qYXZhCitBTlRMUkxlZ2FjeUNvbW1vblRva2VuU3RyZWFtLmphdmEKK0FOVExSTGV4ZXIuamF2YQorQU5UTFJMb29rYWhlYWRTdHJlYW0uamF2YQorQU5UTFJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLmphdmEKK0FOVExSTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLmphdmEKK0FOVExSTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5qYXZhCitBTlRMUk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5qYXZhCitBTlRMUk1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbi5qYXZhCitBTlRMUk1pc3NpbmdUb2tlbkV4Y2VwdGlvbi5qYXZhCitBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uLmphdmEKK0FOVExSUGFyc2VyLmphdmEKK0FOVExSUGFyc2VyUnVsZVJldHVyblNjb3BlLmphdmEKK0FOVExSUGFyc2VUcmVlLmphdmEKK0FOVExSUGFyc2VUcmVlQnVpbGRlci5qYXZhCitBTlRMUlByb2ZpbGVyLmphdmEKK0FOVExSUmVhZGVyU3RyZWFtLmphdmEKK0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24uamF2YQorQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUuamF2YQorQU5UTFJSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIuamF2YQorQU5UTFJSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24uamF2YQorQU5UTFJSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uLmphdmEKK0FOVExSUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uLmphdmEKK0FOVExSUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmphdmEKK0FOVExSUmV3cml0ZVJ1bGVOb2RlU3RyZWFtLmphdmEKK0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLmphdmEKK0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5qYXZhCitBTlRMUlJ1bGVSZXR1cm5TY29wZS5qYXZhCitBTlRMUlNlcmlhbGl6ZWRHcmFtbWFyLmphdmEKK0FOVExSU3RhdHMuamF2YQorQU5UTFJTdHJpbmdTdHJlYW0uamF2YQorQU5UTFJUb2tlbi5qYXZhCitBTlRMUlRva2VuUmV3cml0ZVN0cmVhbS5qYXZhCitBTlRMUlRva2VuU291cmNlLmphdmEKK0FOVExSVG9rZW5TdHJlYW0uamF2YQorQU5UTFJUcmFjZURlYnVnRXZlbnRMaXN0ZW5lci5qYXZhCitBTlRMUlRyYWNlci5qYXZhCitBTlRMUlRyZWUuamF2YQorQU5UTFJUcmVlQWRhcHRvci5qYXZhCitBTlRMUlRyZWVGaWx0ZXIuamF2YQorQU5UTFJUcmVlSXRlcmF0b3IuamF2YQorQU5UTFJUcmVlTm9kZVN0cmVhbS5qYXZhCitBTlRMUlRyZWVQYXJzZXIuamF2YQorQU5UTFJUcmVlUGF0dGVybkxleGVyLmphdmEKK0FOVExSVHJlZVBhdHRlcm5QYXJzZXIuamF2YQorQU5UTFJUcmVlUmV3cml0ZXIuamF2YQorQU5UTFJUcmVlUnVsZVJldHVyblNjb3BlLmphdmEKK0FOVExSVHJlZVZpc2l0b3IuamF2YQorQU5UTFJUcmVlVmlzaXRvckFjdGlvbi5qYXZhCitBTlRMUlRyZWVXaXphcmQuamF2YQorQU5UTFJVbmJ1ZmZlcmVkVG9rZW5TdHJlYW0uamF2YQorQU5UTFJVbndhbnRlZFRva2VuRXhjZXB0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2ZpbGVsaXN0Lm9iamMgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9maWxlbGlzdC5vYmpjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTMzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9maWxlbGlzdC5vYmpjCkBAIC0wLDAgKzEsOTEgQEAKK0FOVExSQmFzZU1hcEVsZW1lbnQubQorQU5UTFJCYXNlUmVjb2duaXplci5tCitBTlRMUkJhc2VTdGFjay5tCitBTlRMUkJhc2VUcmVlLm0KK0FOVExSQmFzZVRyZWVBZGFwdG9yLm0KK0FOVExSQml0U2V0Lm0KK0FOVExSQnVmZmVyZWRUb2tlblN0cmVhbS5tCitBTlRMUkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0ubQorQU5UTFJDaGFyU3RyZWFtLmgKK0FOVExSQ2hhclN0cmVhbVN0YXRlLm0KK0FOVExSQ29tbW9uRXJyb3JOb2RlLm0KK0FOVExSQ29tbW9uVG9rZW4ubQorQU5UTFJDb21tb25Ub2tlblN0cmVhbS5tCitBTlRMUkNvbW1vblRyZWUubQorQU5UTFJDb21tb25UcmVlQWRhcHRvci5tCitBTlRMUkNvbW1vblRyZWVOb2RlU3RyZWFtLm0KK0FOVExSRGVidWcuaAorQU5UTFJEZWJ1Z0V2ZW50TGlzdGVuZXIuaAorQU5UTFJEZWJ1Z0V2ZW50UHJveHkubQorQU5UTFJEZWJ1Z1BhcnNlci5tCitBTlRMUkRlYnVnVG9rZW5TdHJlYW0ubQorQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yLm0KK0FOVExSRGVidWdUcmVlTm9kZVN0cmVhbS5tCitBTlRMUkRlYnVnVHJlZVBhcnNlci5tCitBTlRMUkRGQS5tCitBTlRMUkVhcmx5RXhpdEV4Y2VwdGlvbi5tCitBTlRMUkVycm9yLmgKK0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uLm0KK0FOVExSRmFzdFF1ZXVlLm0KK0FOVExSSGFzaE1hcC5tCitBTlRMUkhhc2hSdWxlLm0KK0FOVExSSW50QXJyYXkubQorQU5UTFJJbnRTdHJlYW0uaAorQU5UTFJMZXhlci5tCitBTlRMUkxleGVyUnVsZVJldHVyblNjb3BlLm0KK0FOVExSTGV4ZXJTdGF0ZS5tCitBTlRMUkxpbmtCYXNlLm0KK0FOVExSTG9va2FoZWFkU3RyZWFtLm0KK0FOVExSTWFwLm0KK0FOVExSTWFwRWxlbWVudC5tCitBTlRMUk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24ubQorQU5UTFJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24ubQorQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLm0KK0FOVExSTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLm0KK0FOVExSTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLm0KK0FOVExSTWlzc2luZ1Rva2VuRXhjZXB0aW9uLm0KK0FOVExSTm9kZU1hcEVsZW1lbnQubQorQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5tCitBTlRMUlBhcnNlci5tCitBTlRMUlBhcnNlclJ1bGVSZXR1cm5TY29wZS5tCitBTlRMUlBhcnNlVHJlZS5tCitBTlRMUlB0ckJ1ZmZlci5tCitBTlRMUlB0clN0YWNrLm0KK0FOVExSUmVjb2duaXRpb25FeGNlcHRpb24ubQorQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUubQorQU5UTFJSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ubQorQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0ubQorQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0KK0FOVExSUnVsZU1hcEVsZW1lbnQubQorQU5UTFJSdWxlTWVtby5tCitBTlRMUlJ1bGVSZXR1cm5TY29wZS5tCitBTlRMUlJ1bGVTdGFjay5tCitBTlRMUlJ1bnRpbWVFeGNlcHRpb24ubQorQU5UTFJTdHJlYW1FbnVtZXJhdG9yLm0KK0FOVExSU3RyaW5nU3RyZWFtLm0KK0FOVExSU3RyaW5nU3RyZWFtU3RhdGUuaAorQU5UTFJTeW1ib2xTdGFjay5tCitBTlRMUlRva2VuLmgKK0FOVExSVG9rZW4rRGVidWdnZXJTdXBwb3J0Lm0KK0FOVExSVG9rZW5SZXdyaXRlU3RyZWFtLm0KK0FOVExSVG9rZW5TdHJlYW0uaAorQU5UTFJUcmVlLm0KK0FOVExSVHJlZUFkYXB0b3IubQorQU5UTFJUcmVlRXhjZXB0aW9uLm0KK0FOVExSVHJlZUl0ZXJhdG9yLm0KK0FOVExSVHJlZU5vZGVTdHJlYW0uaAorQU5UTFJUcmVlUGFyc2VyLm0KK0FOVExSVHJlZVBhdHRlcm5MZXhlci5tCitBTlRMUlRyZWVQYXR0ZXJuUGFyc2VyLm0KK0FOVExSVHJlZVJld3JpdGVyLm0KK0FOVExSVHJlZVJ1bGVSZXR1cm5TY29wZS5tCitBTlRMUlRyZWVWaXNpdG9yLm0KK0FOVExSVHJlZVZpc2l0b3JBY3Rpb24ubQorQU5UTFJUcmVlV2l6YXJkLm0KK0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtLm0KK0FOVExSVW5idWZmZXJlZENvbW1vblRyZWVOb2RlU3RyZWFtU3RhdGUubQorQU5UTFJVbmlxdWVJRE1hcC5tCitBTlRMUlVud2FudGVkVG9rZW5FeGNlcHRpb24ubQorRmFzdFF1ZXVlLm0KK0ludEFycmF5Lm0KK0xvb2thaGVhZFN0cmVhbS5tCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9qYXZhIHNyYyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL2phdmEgc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTJjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay9qYXZhIHNyYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0vVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9UZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS9UZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2ZTEyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0vVGVzdFJld3JpdGVSdWxlVG9rZW5TdHJlYW0uaApAQCAtMCwwICsxLDUxIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0IDxTZW5UZXN0aW5nS2l0L1NlblRlc3RpbmdLaXQuaD4KKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3IuaCIKKyNpbXBvcnQgIkFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlbi5oIgorCitAaW50ZXJmYWNlIFRlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtIDogU2VuVGVzdENhc2UgeworICAgIEFOVExSQ29tbW9uVHJlZUFkYXB0b3IgKnRyZWVBZGFwdG9yOworICAgIEFOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSAqc3RyZWFtOworICAgIAorICAgIEFOVExSQ29tbW9uVG9rZW4gKnRva2VuMTsKKyAgICBBTlRMUkNvbW1vblRva2VuICp0b2tlbjI7CisgICAgQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4zOworICAgIEFOVExSQ29tbW9uVG9rZW4gKnRva2VuNDsKK30KKworLSAodm9pZCkgc2V0VXA7CistICh2b2lkKSB0ZWFyRG93bjsKKy8vLSAodm9pZCkgdGVzdDAxRW1wdHlSZXdyaXRlU3RyZWFtOworLSAodm9pZCkgdGVzdDAyUmV3cml0ZVN0cmVhbUNvdW50OworLSAodm9pZCkgdGVzdDAzU2luZ2xlRWxlbWVudDsKKy0gKHZvaWQpIHRlc3QwNFNpbmdsZUVsZW1lbnREdXA7CistICh2b2lkKSB0ZXN0MDVNdWx0aXBsZUVsZW1lbnRzOworLSAodm9pZCkgdGVzdDA2TXVsdGlwbGVFbGVtZW50c0FmdGVyUmVzZXQ7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9UZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS9UZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL1Rlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtL1Rlc3RSZXdyaXRlUnVsZVRva2VuU3RyZWFtLm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWY4NDM2MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9UZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS9UZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5tCkBAIC0wLDAgKzEsMjAxIEBACisvLyBbVGhlICJCU0QgbGljZW5jZSJdCisvLyBDb3B5cmlnaHQgKGMpIDIwMDcgS2F5IFJvZXBrZQorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW1wb3J0ICJUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVBZGFwdG9yLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBUZXN0UmV3cml0ZVJ1bGVUb2tlblN0cmVhbQorCistICh2b2lkKSBzZXRVcAoreworICAgIHRyZWVBZGFwdG9yID0gW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdOworICAgIHN0cmVhbSA9IFtBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJyZXdyaXRlIHJ1bGUgdG9rZW4gc3RyZWFtIl07CisgICAgdG9rZW4xID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46NV07CisgICAgdG9rZW4yID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46Nl07CisgICAgdG9rZW4zID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46N107CisgICAgdG9rZW40ID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46OF07CisgICAgW3Rva2VuMSBzZXRUZXh0OkAidG9rZW4gMSJdOworICAgIFt0b2tlbjIgc2V0VGV4dDpAInRva2VuIDIiXTsKKyAgICBbdG9rZW4zIHNldFRleHQ6QCJ0b2tlbiAzIl07CisgICAgW3Rva2VuNCBzZXRUZXh0OkAidG9rZW4gNCJdOworfQorCistICh2b2lkKSB0ZWFyRG93bgoreworICAgIFt0b2tlbjEgcmVsZWFzZV07IHRva2VuMSA9IG5pbDsKKyAgICBbdG9rZW4yIHJlbGVhc2VdOyB0b2tlbjIgPSBuaWw7CisgICAgW3Rva2VuMyByZWxlYXNlXTsgdG9rZW4zID0gbmlsOworICAgIFt0b2tlbjQgcmVsZWFzZV07IHRva2VuNCA9IG5pbDsKKyAgICAKKyAgICBbdHJlZUFkYXB0b3IgcmVsZWFzZV07IHRyZWVBZGFwdG9yID0gbmlsOworICAgIFtzdHJlYW0gcmVsZWFzZV07IHN0cmVhbSA9IG5pbDsKK30KKworLSAodm9pZCkgdGVzdDAxRW1wdHlSZXdyaXRlU3RyZWFtCit7CisgICAgdHJlZUFkYXB0b3IgPSBbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl07CisgICAgc3RyZWFtID0gW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJld3JpdGUgcnVsZSB0b2tlbiBzdHJlYW0iXTsKKyAgICBTVEFzc2VydEZhbHNlKFtzdHJlYW0gaGFzTmV4dF0sIEAiLShCT09MKWhhc05leHQgc2hvdWxkIGJlIE5PLCBidXQgaXNuJ3QiKTsKKyAgICBTVEFzc2VydFRocm93cyhbc3RyZWFtIG5leHRUb2tlbl0sIEAiLW5leHQgb24gZW1wdHkgc3RyZWFtIHNob3VsZCB0aHJvdyBleGNlcHRpb24sIGJ1dCBkb2Vzbid0Iik7Cit9CisKKy0gKHZvaWQpIHRlc3QwMlJld3JpdGVTdHJlYW1Db3VudAoreworICAgIHRyZWVBZGFwdG9yID0gW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdOworICAgIHN0cmVhbSA9IFtBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVRva2VuU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJyZXdyaXRlIHJ1bGUgdG9rZW4gc3RyZWFtIl07CisgICAgdG9rZW4xID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46NV07CisgICAgdG9rZW4yID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46Nl07CisgICAgW3Rva2VuMSBzZXRUZXh0OkAidG9rZW4gMSJdOworICAgIFt0b2tlbjIgc2V0VGV4dDpAInRva2VuIDIiXTsKKyAgICBTVEFzc2VydFRydWUoW3N0cmVhbSBzaXplXSA9PSAwLAorICAgICAgICAgICAgICAgICBAImVtcHR5IHN0cmVhbSBzaG91bGQgaGF2ZSBjb3VudD09MCIpOworICAgIFtzdHJlYW0gYWRkRWxlbWVudDp0b2tlbjFdOworICAgIFNUQXNzZXJ0VHJ1ZShbc3RyZWFtIHNpemVdID09IDEsCisgICAgICAgICAgICAgICAgIEAic2luZ2xlIGVsZW1lbnQgc3RyZWFtIHNob3VsZCBoYXZlIGNvdW50PT0xIik7CisgICAgW3N0cmVhbSBhZGRFbGVtZW50OnRva2VuMl07CisgICAgU1RBc3NlcnRUcnVlKFtzdHJlYW0gc2l6ZV0gPT0gMiwKKyAgICAgICAgICAgICAgICAgQCJtdWx0aXBsZSBzdHJlYW0gc2hvdWxkIGhhdmUgY291bnQ9PTIiKTsKKworfQorCistICh2b2lkKSB0ZXN0MDNTaW5nbGVFbGVtZW50Cit7CisgICAgdHJlZUFkYXB0b3IgPSBbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl07CisgICAgc3RyZWFtID0gW0FOVExSUmV3cml0ZVJ1bGVUb2tlblN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpAInJld3JpdGUgcnVsZSB0b2tlbiBzdHJlYW0iXTsKKyAgICB0b2tlbjEgPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjo1XTsKKyAgICB0b2tlbjIgPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjo2XTsKKyAgICB0b2tlbjMgPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjo3XTsKKyAgICB0b2tlbjQgPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjo4XTsKKyAgICBbdG9rZW4xIHNldFRleHQ6QCJ0b2tlbiAxIl07CisgICAgW3Rva2VuMiBzZXRUZXh0OkAidG9rZW4gMiJdOworICAgIFt0b2tlbjMgc2V0VGV4dDpAInRva2VuIDMiXTsKKyAgICBbdG9rZW40IHNldFRleHQ6QCJ0b2tlbiA0Il07CisgICAgW3N0cmVhbSBhZGRFbGVtZW50OnRva2VuMV07CisgICAgU1RBc3NlcnRUcnVlKFtzdHJlYW0gaGFzTmV4dF0sIEAiLWhhc05leHQgc2hvdWxkIGJlIFlFUywgYnV0IGlzbid0Iik7CisgICAgQU5UTFJDb21tb25UcmVlICp0cmVlID0gW3N0cmVhbSBuZXh0Tm9kZV07CisgICAgU1RBc3NlcnRFcXVhbE9iamVjdHMoW3RyZWUgZ2V0VG9rZW5dLCB0b2tlbjEsIEAicmV0dXJuIHRva2VuIGZyb20gc3RyZWFtIHNob3VsZCBiZSB0b2tlbjEsIGJ1dCBpc24ndCIpOworfQorCistICh2b2lkKSB0ZXN0MDRTaW5nbGVFbGVtZW50RHVwCit7CisgICAgW3N0cmVhbSBhZGRFbGVtZW50OnRva2VuMV07CisgICAgQU5UTFJDb21tb25UcmVlICp0cmVlMSwgKnRyZWUyOworICAgIFNUQXNzZXJ0Tm9UaHJvdyh0cmVlMSA9IFtzdHJlYW0gbmV4dE5vZGVdLAorICAgICAgICAgICAgICAgICAgICBAInN0cmVhbSBpdGVyYXRpb24gc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgU1RBc3NlcnROb1Rocm93KHRyZWUyID0gW3N0cmVhbSBuZXh0Tm9kZV0sCisgICAgICAgICAgICAgICAgICAgIEAic3RyZWFtIGl0ZXJhdGlvbiBwYXN0IGVsZW1lbnQgY291bnQgKHNpbmdsZSBlbGVtZW50KSBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydEVxdWFsT2JqZWN0cyhbdHJlZTEgZ2V0VG9rZW5dLCBbdHJlZTIgZ2V0VG9rZW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgIEAidG9rZW5zIHNob3VsZCBiZSB0aGUgc2FtZSIpOworICAgIFNUQXNzZXJ0RmFsc2UodHJlZTEgPT0gdHJlZTIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIEAidHJlZXMgc2hvdWxkIGJlIGRpZmZlcmVudCwgYnV0IGFyZW4ndCIpOworfQorCistICh2b2lkKSB0ZXN0MDVNdWx0aXBsZUVsZW1lbnRzCit7CisgICAgW3N0cmVhbSBhZGRFbGVtZW50OnRva2VuMV07CisgICAgW3N0cmVhbSBhZGRFbGVtZW50OnRva2VuMl07CisgICAgW3N0cmVhbSBhZGRFbGVtZW50OnRva2VuM107CisgICAgQU5UTFJDb21tb25UcmVlICp0cmVlMSwgKnRyZWUyLCAqdHJlZTMsICp0cmVlNDsKKyAgICBTVEFzc2VydE5vVGhyb3codHJlZTEgPSBbc3RyZWFtIG5leHROb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgQCJzdHJlYW0gaXRlcmF0aW9uIHNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICApOworICAgIFNUQXNzZXJ0RXF1YWxPYmplY3RzKFt0cmVlMSBnZXRUb2tlbl0sIHRva2VuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBAIlt0cmVlMSB0b2tlbl0gc2hvdWxkIGJlIGVxdWFsIHRvIHRva2VuMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIFNUQXNzZXJ0Tm9UaHJvdyh0cmVlMiA9IFtzdHJlYW0gbmV4dE5vZGVdLAorICAgICAgICAgICAgICAgICAgICBAInN0cmVhbSBpdGVyYXRpb24gc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgU1RBc3NlcnRFcXVhbE9iamVjdHMoW3RyZWUyIGdldFRva2VuXSwgdG9rZW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEAiW3RyZWUyIHRva2VuXSBzaG91bGQgYmUgZXF1YWwgdG8gdG9rZW4yIgorICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgU1RBc3NlcnROb1Rocm93KHRyZWUzID0gW3N0cmVhbSBuZXh0Tm9kZV0sCisgICAgICAgICAgICAgICAgICAgIEAic3RyZWFtIGl0ZXJhdGlvbiBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydEVxdWFsT2JqZWN0cyhbdHJlZTMgZ2V0VG9rZW5dLCB0b2tlbjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQCJbdHJlZTMgdG9rZW5dIHNob3VsZCBiZSBlcXVhbCB0byB0b2tlbjMiCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydFRocm93cyh0cmVlNCA9IFtzdHJlYW0gbmV4dE5vZGVdLAorICAgICAgICAgICAgICAgICAgICBAIml0ZXJhdGluZyBiZXlvbmQgZW5kIG9mIHN0cmVhbSBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICApOworfQorCistICh2b2lkKSB0ZXN0MDZNdWx0aXBsZUVsZW1lbnRzQWZ0ZXJSZXNldAoreworICAgIFtzdHJlYW0gYWRkRWxlbWVudDp0b2tlbjFdOworICAgIFtzdHJlYW0gYWRkRWxlbWVudDp0b2tlbjJdOworICAgIFtzdHJlYW0gYWRkRWxlbWVudDp0b2tlbjNdOworICAgIEFOVExSQ29tbW9uVHJlZSAqdHJlZTEsICp0cmVlMiwgKnRyZWUzOworICAgIAorICAgIC8vIGNvbnN1bWUgdGhlIHN0cmVhbSBjb21wbGV0ZWx5CisgICAgU1RBc3NlcnROb1Rocm93KHRyZWUxID0gW3N0cmVhbSBuZXh0Tm9kZV0sCisgICAgICAgICAgICAgICAgICAgIEAic3RyZWFtIGl0ZXJhdGlvbiBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydEVxdWFsT2JqZWN0cyhbdHJlZTEgZ2V0VG9rZW5dLCB0b2tlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgQCJbdHJlZTEgdG9rZW5dIHNob3VsZCBiZSBlcXVhbCB0byB0b2tlbjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydE5vVGhyb3codHJlZTIgPSBbc3RyZWFtIG5leHROb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgQCJzdHJlYW0gaXRlcmF0aW9uIHNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICApOworICAgIFNUQXNzZXJ0RXF1YWxPYmplY3RzKFt0cmVlMiBnZXRUb2tlbl0sIHRva2VuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBAIlt0cmVlMiB0b2tlbl0gc2hvdWxkIGJlIGVxdWFsIHRvIHRva2VuMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIFNUQXNzZXJ0Tm9UaHJvdyh0cmVlMyA9IFtzdHJlYW0gbmV4dE5vZGVdLAorICAgICAgICAgICAgICAgICAgICBAInN0cmVhbSBpdGVyYXRpb24gc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgW3N0cmVhbSByZXNldF07IC8vIGFmdGVyIHJlc2V0dGluZyB0aGUgc3RyZWFtIGl0IHNob3VsZCBkdXAKKyAgICAKKyAgICBBTlRMUkNvbW1vblRyZWUgKnRyZWUxRHVwLCAqdHJlZTJEdXAsICp0cmVlM0R1cDsKKworICAgIFNUQXNzZXJ0Tm9UaHJvdyh0cmVlMUR1cCA9IFtzdHJlYW0gbmV4dE5vZGVdLAorICAgICAgICAgICAgICAgICAgICBAInN0cmVhbSBpdGVyYXRpb24gc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgU1RBc3NlcnRUcnVlKHRyZWUxICE9IHRyZWUxRHVwLAorICAgICAgICAgICAgICAgICBAIlt0cmVlMSB0b2tlbl0gc2hvdWxkIGJlIGVxdWFsIHRvIHRva2VuMSIKKyAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydE5vVGhyb3codHJlZTJEdXAgPSBbc3RyZWFtIG5leHROb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgQCJzdHJlYW0gaXRlcmF0aW9uIHNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICApOworICAgIFNUQXNzZXJ0VHJ1ZSh0cmVlMiAhPSB0cmVlMkR1cCwKKyAgICAgICAgICAgICAgICAgQCJbdHJlZTIgdG9rZW5dIHNob3VsZCBiZSBlcXVhbCB0byB0b2tlbjIiCisgICAgICAgICAgICAgICAgICk7CisgICAgU1RBc3NlcnROb1Rocm93KHRyZWUzRHVwID0gW3N0cmVhbSBuZXh0Tm9kZV0sCisgICAgICAgICAgICAgICAgICAgIEAic3RyZWFtIGl0ZXJhdGlvbiBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBTVEFzc2VydFRydWUodHJlZTMgIT0gdHJlZTNEdXAsCisgICAgICAgICAgICAgICAgIEAiW3RyZWUzIHRva2VuXSBzaG91bGQgYmUgZXF1YWwgdG8gdG9rZW4zIgorICAgICAgICAgICAgICAgICApOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9BTlRMUkZhc3RRdWV1ZVRlc3QuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL0FOVExSRmFzdFF1ZXVlVGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODVhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9BTlRMUkZhc3RRdWV1ZVRlc3QuaApAQCAtMCwwICsxLDI0IEBACisvLworLy8gIEFOVExSRmFzdFF1ZXVlVGVzdC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMy8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8U2VuVGVzdGluZ0tpdC9TZW5UZXN0aW5nS2l0Lmg+CisKKworQGludGVyZmFjZSBBTlRMUkZhc3RRdWV1ZVRlc3QgOiBTZW5UZXN0Q2FzZSB7CisKK30KKworLSh2b2lkKSB0ZXN0SW5pdDsKKy0odm9pZCkgdGVzdEFkZEFuZEdldDsKKy0odm9pZCkgdGVzdEludmFsaWRFbGVtZW50SW5kZXg7CistKHZvaWQpIHRlc3RIZWFkOworLSh2b2lkKSB0ZXN0Q2xlYXI7CistKHZvaWQpIHRlc3REZXNjcmlwdGlvbjsKKy0odm9pZCkgdGVzdFJlbW92ZTsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvQU5UTFJGYXN0UXVldWVUZXN0Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9BTlRMUkZhc3RRdWV1ZVRlc3QubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDUwOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvQU5UTFJGYXN0UXVldWVUZXN0Lm0KQEAgLTAsMCArMSwxMDMgQEAKKy8vCisvLyAgQU5UTFJGYXN0UXVldWVUZXN0Lm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDEzLzA1LzIwMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgSWFuIE1pY2hlbGwgYW5kIEFsYW4gQ29uZGl0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiQU5UTFJGYXN0UXVldWVUZXN0LmgiCisjaW1wb3J0ICJBTlRMUkZhc3RRdWV1ZS5oIgorI2ltcG9ydCAiQU5UTFJFcnJvci5oIgorI2ltcG9ydCAiQU5UTFJSdW50aW1lRXhjZXB0aW9uLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkZhc3RRdWV1ZVRlc3QKKworLSh2b2lkKSB0ZXN0SW5pdAoreworCUFOVExSRmFzdFF1ZXVlICpxdWV1ZSA9IFtbQU5UTFJGYXN0UXVldWUgbmV3QU5UTFJGYXN0UXVldWVdIHJldGFpbl07CisJU1RBc3NlcnROb3ROaWwocXVldWUsIEAiUXVldWUgd2FzIG5vdCBjcmVhdGVkIGFuZCB3YXMgbmlsIik7CisJW3F1ZXVlIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RBZGRBbmRHZXQKK3sKKwlBTlRMUkZhc3RRdWV1ZSAqcXVldWUgPSBbW0FOVExSRmFzdFF1ZXVlIG5ld0FOVExSRmFzdFF1ZXVlXSByZXRhaW5dOworCVNUQXNzZXJ0Tm90TmlsKHF1ZXVlLCBAIlF1ZXVlIHdhcyBub3QgY3JlYXRlZCBhbmQgd2FzIG5pbCIpOworCVtxdWV1ZSBhZGRPYmplY3Q6QCJNeSBTdHJpbmciXTsKKwlTVEFzc2VydFRydWUoW1txdWV1ZSBvYmplY3RBdEluZGV4OjBdIGlzS2luZE9mQ2xhc3M6W05TU3RyaW5nIGNsYXNzXV0sIEAiRmlyc3Qgb2JqZWN0IGlzIG5vdCBhIE5TU3RyaW5nIik7CisJU1RBc3NlcnRFcXVhbHMoW3F1ZXVlIG9iamVjdEF0SW5kZXg6MF0sIEAiTXkgU3RyaW5nIiwgQCJPYmplY3QgYXQgaW5kZXggemVybyBpcyBpbnZhbGlkIik7CisJU1RBc3NlcnRUcnVlKFtxdWV1ZSBzaXplXSA9PSAxLCBAIlF1ZXVlIGlzIHRoZSB3cm9uZyBzaXplOiAlZCIsIFtxdWV1ZSBzaXplXSk7CisJW3F1ZXVlIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RJbnZhbGlkRWxlbWVudEluZGV4Cit7CisgICAgLy9BTlRMUlJ1bnRpbWVFeGNlcHRpb24gKkFOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiA9IFtBTlRMUk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOkAiTm8gc3VjaCBlbGVtZW50IGV4Y2VwdGlvbiJdOworICAgIGlkIHJldFZhbDsKKwlBTlRMUkZhc3RRdWV1ZSAqcXVldWUgPSBbW0FOVExSRmFzdFF1ZXVlIG5ld0FOVExSRmFzdFF1ZXVlXSByZXRhaW5dOworCVNUQXNzZXJ0Tm90TmlsKHF1ZXVlLCBAIlF1ZXVlIHdhcyBub3QgY3JlYXRlZCBhbmQgd2FzIG5pbCIpOworCUB0cnkgCisJeworCQlyZXRWYWwgPSBbcXVldWUgb2JqZWN0QXRJbmRleDoxMDBdOworCX0KKwlAY2F0Y2ggKEFOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAqZSkgCisJeworCQlTVEFzc2VydFRydWUoW1tlIG5hbWVdIGlzRXF1YWxUbzpAIkFOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiJdLCBAIkV4Y2VwdGlvbiB3YXMgbm90IHR5cGU6IEFOVExSTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAtLSAlQCIsIFtlIG5hbWVdKTsKKwkJcmV0dXJuOworCX0KKwlTVEZhaWwoQCJFeGNlcHRpb24gQU5UTFJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIC0tICVAIiwgW3JldFZhbCBuYW1lXSk7CisgICAgW3F1ZXVlIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RIZWFkCit7CisJQU5UTFJGYXN0UXVldWUgKnF1ZXVlID0gW1tBTlRMUkZhc3RRdWV1ZSBuZXdBTlRMUkZhc3RRdWV1ZV0gcmV0YWluXTsKKwlTVEFzc2VydE5vdE5pbChxdWV1ZSwgQCJRdWV1ZSB3YXMgbm90IGNyZWF0ZWQgYW5kIHdhcyBuaWwiKTsKKwlbcXVldWUgYWRkT2JqZWN0OkAiSXRlbSAxIl07CisJW3F1ZXVlIGFkZE9iamVjdDpAIkl0ZW0gMiJdOworCVtxdWV1ZSBhZGRPYmplY3Q6QCJJdGVtIDMiXTsKKwlpZCBoZWFkID0gW3F1ZXVlIGhlYWRdOworCVNUQXNzZXJ0Tm90TmlsKGhlYWQsIEAiT2JqZWN0IHJldHVybmVkIGZyb20gaGVhZCBpcyBuaWwiKTsKKwlTVEFzc2VydEVxdWFscyhoZWFkLCBAIkl0ZW0gMSIsIEAiT2JqZWN0IHJldHVybmVkIHdhcyBub3QgZmlyc3QgaXRlbSBpbiIpOworCVtxdWV1ZSByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0Q2xlYXIKK3sKKwlBTlRMUkZhc3RRdWV1ZSAqcXVldWUgPSBbW0FOVExSRmFzdFF1ZXVlIG5ld0FOVExSRmFzdFF1ZXVlXSByZXRhaW5dOworCVNUQXNzZXJ0Tm90TmlsKHF1ZXVlLCBAIlF1ZXVlIHdhcyBub3QgY3JlYXRlZCBhbmQgd2FzIG5pbCIpOworCVtxdWV1ZSBhZGRPYmplY3Q6QCJJdGVtIDEiXTsKKwlbcXVldWUgYWRkT2JqZWN0OkAiSXRlbSAyIl07CisJW3F1ZXVlIGFkZE9iamVjdDpAIkl0ZW0gMyJdOworCVNUQXNzZXJ0VHJ1ZShbcXVldWUgc2l6ZV0gPT0gMywgQCJRdWV1ZSB3YXMgdG9vIHNtYWxsLCB3YXM6ICVkIGV4cGVjdGVkIDMiLCBbcXVldWUgc2l6ZV0pOworCVtxdWV1ZSByZXNldF07CisJU1RBc3NlcnRUcnVlKFtxdWV1ZSBzaXplXSA9PSAwLCBAIlF1ZXVlIGlzIG5vdCBlbXB0eSwgaXQncyBzdGlsbCAlZCIsIFtxdWV1ZSBzaXplXSk7CisJW3F1ZXVlIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3REZXNjcmlwdGlvbgoreworCUFOVExSRmFzdFF1ZXVlICpxdWV1ZSA9IFtbQU5UTFJGYXN0UXVldWUgbmV3QU5UTFJGYXN0UXVldWVdIHJldGFpbl07CisJU1RBc3NlcnROb3ROaWwocXVldWUsIEAiUXVldWUgd2FzIG5vdCBjcmVhdGVkIGFuZCB3YXMgbmlsIik7CisJW3F1ZXVlIGFkZE9iamVjdDpAIk15Il07CisJW3F1ZXVlIGFkZE9iamVjdDpAIlN0cmluZyJdOworCVNUQXNzZXJ0VHJ1ZShbW3F1ZXVlIGRlc2NyaXB0aW9uXSBpc0VxdWFsVG9TdHJpbmc6QCJNeSBTdHJpbmciXSwgQCJRdWV1ZSBkZXNjcmlwdGlvbiB3YXMgbm90IHJpZ2h0LCBnb3Q6IFwiJUBcIiBleHBlY3RlZDogXCJNeSBTdHJpbmdcIiIsIFtxdWV1ZSBkZXNjcmlwdGlvbl0pOworCVtxdWV1ZSByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0UmVtb3ZlCit7CisJQU5UTFJGYXN0UXVldWUgKnF1ZXVlID0gW1tBTlRMUkZhc3RRdWV1ZSBuZXdBTlRMUkZhc3RRdWV1ZV0gcmV0YWluXTsKKwlTVEFzc2VydE5vdE5pbChxdWV1ZSwgQCJRdWV1ZSB3YXMgbm90IGNyZWF0ZWQgYW5kIHdhcyBuaWwiKTsKKwlbcXVldWUgYWRkT2JqZWN0OkAiTXkiXTsKKwlbcXVldWUgYWRkT2JqZWN0OkAiU3RyaW5nIl07CisJU1RBc3NlcnRUcnVlKFtxdWV1ZSBzaXplXSA9PSAyLCBAIlF1ZXVlIG5vdCB0aGUgY29ycmVjdCBzaXplLCB3YXM6ICVkIGV4cGVjdGVkIDIiLCBbcXVldWUgc2l6ZV0pOworCVtxdWV1ZSByZW1vdmVdOworCVNUQXNzZXJ0VHJ1ZShbcXVldWUgc2l6ZV0gPT0gMSwgQCJRdWV1ZSBub3QgdGhlIGNvcnJlY3Qgc2l6ZSwgd2FzICVkIGV4cGVjdGVkIDEiLCBbcXVldWUgc2l6ZV0pOworCVtxdWV1ZSByZW1vdmVdOyAvLyB0ZXN0IHRoYXQgdGhlIHF1ZXVlIGlzIHJlc2V0IHdoZW4gd2UgcmVtb3ZlIHRoZSBsYXN0IG9iamVjdC4uLgorCVNUQXNzZXJ0VHJ1ZShbcXVldWUgc2l6ZV0gPT0gMCwgQCJRdWV1ZSB3YXMgbm90IHJlc2V0LCB3aGVuIHdlIGhpdCB0aGUgYnVmZmVyLCB3YXMgc3RpbGwgJWQiLCBbcXVldWUgc2l6ZV0pOworCVtxdWV1ZSByZWxlYXNlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvQU5UTFJJbnRBcnJheVRlc3QuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL0FOVExSSW50QXJyYXlUZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmZmIyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL0FOVExSSW50QXJyYXlUZXN0LmgKQEAgLTAsMCArMSwyMSBAQAorLy8KKy8vICBBTlRMUkludEFycmF5VGVzdC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMy8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8U2VuVGVzdGluZ0tpdC9TZW5UZXN0aW5nS2l0Lmg+CisKKworQGludGVyZmFjZSBBTlRMUkludEFycmF5VGVzdCA6IFNlblRlc3RDYXNlIAoreworCit9CisKKy0odm9pZCkgdGVzdEFkZDsKKy0odm9pZCkgdGVzdFB1c2hQb3A7CistKHZvaWQpIHRlc3RDbGVhckFuZEFkZDsKKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvQU5UTFJJbnRBcnJheVRlc3QubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL0FOVExSSW50QXJyYXlUZXN0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZGMyMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL0FOVExSSW50QXJyYXlUZXN0Lm0KQEAgLTAsMCArMSw0NyBAQAorLy8KKy8vICBBTlRMUkludEFycmF5VGVzdC5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMy8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiQU5UTFJJbnRBcnJheVRlc3QuaCIKKyNpbXBvcnQgIkFOVExSSW50QXJyYXkuaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSSW50QXJyYXlUZXN0CisKKy0odm9pZCkgdGVzdEFkZAoreworCUFOVExSSW50QXJyYXkgKmludEFycmF5ID0gW0FOVExSSW50QXJyYXkgbmV3QXJyYXlXaXRoTGVuOjEwXTsKKwlbaW50QXJyYXkgYWRkSW50ZWdlcjoxXTsKKwlTVEFzc2VydFRydWUoW2ludEFycmF5IGNvdW50XSA9PSAxLCBAIkludCBhcnJheSBzaG91bGQgYmUgb2Ygc2l6ZSAxIik7CisJU1RBc3NlcnRUcnVlKFtpbnRBcnJheSBpbnRlZ2VyQXRJbmRleDowXSA9PSAxLCBAIkZpcnN0IGl0ZW0gaW4gaW50IGFycmF5IHNob3VsZCBiZSAxIik7CisJW2ludEFycmF5IHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RQdXNoUG9wCit7CisJQU5UTFJJbnRBcnJheSAqaW50QXJyYXkgPSBbQU5UTFJJbnRBcnJheSBuZXdBcnJheVdpdGhMZW46MTBdOworCWZvciAoTlNJbnRlZ2VyIGkgPSAwOyBpIDwgMTA7IGkrKykKKwl7CisJCVtpbnRBcnJheSBwdXNoOmkgKyAxXTsKKwl9CisJTlNJbnRlZ2VyIHBvcHBlZCA9IFtpbnRBcnJheSBwb3BdOworCU5TTG9nKEAiUG9wcGVkIHZhbHVlOiAlZCIsIHBvcHBlZCk7CisJU1RBc3NlcnRUcnVlKHBvcHBlZCA9PSAxMCwgQCJQb3Agc2hvdWxkIHB1bGwgdGhlIGxhc3QgZWxlbWVudCBvdXQsIHdoaWNoIHNob3VsZCBiZSAxMCB3YXM6ICVkIiwgcG9wcGVkKTsKKwlbaW50QXJyYXkgcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdENsZWFyQW5kQWRkCit7CisJQU5UTFJJbnRBcnJheSAqaW50QXJyYXkgPSBbQU5UTFJJbnRBcnJheSBuZXdBcnJheVdpdGhMZW46MTBdOworCVtpbnRBcnJheSBhZGRJbnRlZ2VyOjFdOworCVNUQXNzZXJ0VHJ1ZShbaW50QXJyYXkgY291bnRdID09IDEsIEAiSW50IGFycmF5IHNob3VsZCBiZSBvZiBzaXplIDEiKTsKKwlTVEFzc2VydFRydWUoW2ludEFycmF5IGludGVnZXJBdEluZGV4OjBdID09IDEsIEAiRmlyc3QgaXRlbSBpbiBpbnQgYXJyYXkgc2hvdWxkIGJlIDEiKTsKKwlbaW50QXJyYXkgcmVzZXRdOworCVNUQXNzZXJ0VHJ1ZShbaW50QXJyYXkgY291bnRdID09IDAsIEAiQXJyYXkgc2l6ZSBzaG91bGQgYmUgMCIpOworCVtpbnRBcnJheSByZWxlYXNlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvSW50QXJyYXlUZXN0LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9JbnRBcnJheVRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhkN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvSW50QXJyYXlUZXN0LmgKQEAgLTAsMCArMSwyMSBAQAorLy8KKy8vICBJbnRBcnJheVRlc3QuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMTMvMDUvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFNlblRlc3RpbmdLaXQvU2VuVGVzdGluZ0tpdC5oPgorCisKK0BpbnRlcmZhY2UgSW50QXJyYXlUZXN0IDogU2VuVGVzdENhc2UgCit7CisKK30KKworLSh2b2lkKSB0ZXN0QWRkOworLSh2b2lkKSB0ZXN0UHVzaFBvcDsKKy0odm9pZCkgdGVzdENsZWFyQW5kQWRkOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9JbnRBcnJheVRlc3QubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL0ludEFycmF5VGVzdC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2YzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9JbnRBcnJheVRlc3QubQpAQCAtMCwwICsxLDQ3IEBACisvLworLy8gIEludEFycmF5VGVzdC5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMy8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiSW50QXJyYXlUZXN0LmgiCisjaW1wb3J0ICJJbnRBcnJheS5oIgorCitAaW1wbGVtZW50YXRpb24gSW50QXJyYXlUZXN0CisKKy0odm9pZCkgdGVzdEFkZAoreworCUludEFycmF5ICppbnRBcnJheSA9IFtJbnRBcnJheSBuZXdJbnRBcnJheVdpdGhMZW46MTBdOworCVtpbnRBcnJheSBhZGRJbnRlZ2VyOjFdOworCVNUQXNzZXJ0VHJ1ZShbaW50QXJyYXkgY291bnRdID09IDEsIEAiSW50IGFycmF5IHNob3VsZCBiZSBvZiBzaXplIDEiKTsKKwlTVEFzc2VydFRydWUoW2ludEFycmF5IGludGVnZXJBdEluZGV4OjBdID09IDEsIEAiRmlyc3QgaXRlbSBpbiBpbnQgYXJyYXkgc2hvdWxkIGJlIDEiKTsKKwlbaW50QXJyYXkgcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdFB1c2hQb3AKK3sKKwlJbnRBcnJheSAqaW50QXJyYXkgPSBbSW50QXJyYXkgbmV3SW50QXJyYXlXaXRoTGVuOjEwXTsKKwlmb3IgKE5TSW50ZWdlciBpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQlbaW50QXJyYXkgcHVzaDppICsgMV07CisJfQorCU5TSW50ZWdlciBwb3BwZWQgPSBbaW50QXJyYXkgcG9wXTsKKwlOU0xvZyhAIlBvcHBlZCB2YWx1ZTogJWQiLCBwb3BwZWQpOworCVNUQXNzZXJ0VHJ1ZShwb3BwZWQgPT0gMTAsIEAiUG9wIHNob3VsZCBwdWxsIHRoZSBsYXN0IGVsZW1lbnQgb3V0LCB3aGljaCBzaG91bGQgYmUgMTAgd2FzOiAlZCIsIHBvcHBlZCk7CisJW2ludEFycmF5IHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RDbGVhckFuZEFkZAoreworCUludEFycmF5ICppbnRBcnJheSA9IFtJbnRBcnJheSBuZXdJbnRBcnJheVdpdGhMZW46MTBdOworCVtpbnRBcnJheSBhZGRJbnRlZ2VyOjFdOworCVNUQXNzZXJ0VHJ1ZShbaW50QXJyYXkgY291bnRdID09IDEsIEAiSW50IGFycmF5IHNob3VsZCBiZSBvZiBzaXplIDEiKTsKKwlTVEFzc2VydFRydWUoW2ludEFycmF5IGludGVnZXJBdEluZGV4OjBdID09IDEsIEAiRmlyc3QgaXRlbSBpbiBpbnQgYXJyYXkgc2hvdWxkIGJlIDEiKTsKKwlbaW50QXJyYXkgcmVzZXRdOworCVNUQXNzZXJ0VHJ1ZShbaW50QXJyYXkgY291bnRdID09IDAsIEAiQXJyYXkgc2l6ZSBzaG91bGQgYmUgMCIpOworCVtpbnRBcnJheSByZWxlYXNlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL21pc2MvVGVzdERpY3Rpb25hcnkuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL1Rlc3REaWN0aW9uYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5YTEzNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL1Rlc3REaWN0aW9uYXJ5LmgKQEAgLTAsMCArMSwyMyBAQAorLy8KKy8vICBUZXN0RGljdGlvbmFyeS5oCisvLyAgU1Q0CisvLworLy8gIENyZWF0ZWQgYnkgQWxhbiBDb25kaXQgb24gNC8yMC8xMS4KKy8vICBDb3B5cmlnaHQgMjAxMSBBbGFuIENvbmRpdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFNlblRlc3RpbmdLaXQvU2VuVGVzdGluZ0tpdC5oPgorCisKK0BpbnRlcmZhY2UgVGVzdERpY3Rpb25hcnkgOiBTZW5UZXN0Q2FzZSB7CitAcHJpdmF0ZQorICAgIAorfQorCistICh2b2lkKSB0ZXN0MDFhZGQ7CistICh2b2lkKSB0ZXN0MDJhZGQ7CistICh2b2lkKSB0ZXN0MDNhZGQ7CistICh2b2lkKSB0ZXN0MDRyZW1vdmVmcm9tTG87CistICh2b2lkKSB0ZXN0MDVyZW1vdmVmcm9tSGk7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9taXNjL1Rlc3REaWN0aW9uYXJ5Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9UZXN0RGljdGlvbmFyeS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzYxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvbWlzYy9UZXN0RGljdGlvbmFyeS5tCkBAIC0wLDAgKzEsMTM3IEBACisvLworLy8gIFRlc3REaWN0aW9uYXJ5Lm0KKy8vICBTVDQKKy8vCisvLyAgQ3JlYXRlZCBieSBBbGFuIENvbmRpdCBvbiA0LzIwLzExLgorLy8gIENvcHlyaWdodCAyMDExIEFsYW4gQ29uZGl0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiVGVzdERpY3Rpb25hcnkuaCIKKyNpbXBvcnQgIkFNdXRhYmxlRGljdGlvbmFyeS5oIgorCitAaW1wbGVtZW50YXRpb24gVGVzdERpY3Rpb25hcnkKKworLSAodm9pZClzZXRVcAoreworICAgIFtzdXBlciBzZXRVcF07CisgICAgCisgICAgLy8gU2V0LXVwIGNvZGUgaGVyZS4KK30KKworLSAodm9pZCl0ZWFyRG93bgoreworICAgIC8vIFRlYXItZG93biBjb2RlIGhlcmUuCisgICAgCisgICAgW3N1cGVyIHRlYXJEb3duXTsKK30KKworLSAodm9pZCkgdGVzdDAxYWRkCit7CisgICAgQU11dGFibGVEaWN0aW9uYXJ5ICp0ZXN0RGljdDsKKyAgICBOU1N0cmluZyAqa2V5MSA9IEAiYTEwMSI7CisgICAgTlNTdHJpbmcgKm9iajEgPSBAIm9iajEwMSI7CisgICAgCisgICAgdGVzdERpY3QgPSBbQU11dGFibGVEaWN0aW9uYXJ5IG5ld0RpY3Rpb25hcnldOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6b2JqMSBmb3JLZXk6a2V5MV07CisgICAgTlNTdHJpbmcgKmV4cGVjdGVkID0gb2JqMTsKKyAgICBOU1N0cmluZyAqcmVzdWx0ID0gW3Rlc3REaWN0IG9iamVjdEZvcktleTprZXkxXTsKKyAgICBTVEFzc2VydFRydWUoIFtleHBlY3RlZCBpc0VxdWFsVG86cmVzdWx0XSwgQCJFeHBlY3RlZCBcIiVAXCIgYnV0IGdvdCBcIiVAXCIiLCBleHBlY3RlZCwgcmVzdWx0ICk7Cit9CisKKy0gKHZvaWQpIHRlc3QwMmFkZAoreworICAgIEFNdXRhYmxlRGljdGlvbmFyeSAqdGVzdERpY3Q7CisgICAgTlNTdHJpbmcgKmtleTEgPSBAImExMDEiOworICAgIE5TU3RyaW5nICpvYmoxID0gQCJvYmoxMDEiOworICAgIE5TU3RyaW5nICprZXkyID0gQCJhMTAyIjsKKyAgICBOU1N0cmluZyAqb2JqMiA9IEAib2JqMTAyIjsKKyAgICAKKyAgICB0ZXN0RGljdCA9IFtBTXV0YWJsZURpY3Rpb25hcnkgbmV3RGljdGlvbmFyeV07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpvYmoxIGZvcktleTprZXkxXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0Om9iajIgZm9yS2V5OmtleTJdOworICAgIE5TU3RyaW5nICpleHBlY3RlZCA9IG9iajE7CisgICAgTlNTdHJpbmcgKnJlc3VsdCA9IFt0ZXN0RGljdCBvYmplY3RGb3JLZXk6a2V5MV07CisgICAgU1RBc3NlcnRUcnVlKCBbZXhwZWN0ZWQgaXNFcXVhbFRvOnJlc3VsdF0sIEAiRXhwZWN0ZWQgXCIlQFwiIGJ1dCBnb3QgXCIlQFwiIiwgZXhwZWN0ZWQsIHJlc3VsdCApOworfQorCistICh2b2lkKSB0ZXN0MDNhZGQKK3sKKyAgICBBTXV0YWJsZURpY3Rpb25hcnkgKnRlc3REaWN0OworICAgIE5TU3RyaW5nICprZXkxID0gQCJhMTAxIjsKKyAgICBOU1N0cmluZyAqb2JqMSA9IEAib2JqMTAxIjsKKyAgICAKKyAgICB0ZXN0RGljdCA9IFtBTXV0YWJsZURpY3Rpb25hcnkgbmV3RGljdGlvbmFyeV07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpvYmoxIGZvcktleTprZXkxXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTAyIiAgZm9yS2V5OkAiYTEwMiJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDMiICBmb3JLZXk6QCJhMTAzIl07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwNCIgIGZvcktleTpAImExMDQiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTA1IiAgZm9yS2V5OkAiYTEwNSJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDYiICBmb3JLZXk6QCJhMTA2Il07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwNyIgIGZvcktleTpAImExMDciXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTA4IiAgZm9yS2V5OkAiYTEwOCJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDkiICBmb3JLZXk6QCJhMTA5Il07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajExMCIgZm9yS2V5OkAiYTExMCJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMTEiIGZvcktleTpAImExMTEiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTEyIiBmb3JLZXk6QCJhMTEyIl07CisgICAgTlNTdHJpbmcgKmV4cGVjdGVkID0gQCJvYmoxMDYiOworICAgIE5TU3RyaW5nICpyZXN1bHQgPSBbdGVzdERpY3Qgb2JqZWN0Rm9yS2V5OkAiYTEwNiJdOworICAgIFNUQXNzZXJ0VHJ1ZSggW2V4cGVjdGVkIGlzRXF1YWxUbzpyZXN1bHRdLCBAIkV4cGVjdGVkIFwiJUBcIiBidXQgZ290IFwiJUBcIiIsIGV4cGVjdGVkLCByZXN1bHQgKTsKK30KKworLSAodm9pZCkgdGVzdDA0cmVtb3ZlZnJvbUxvCit7CisgICAgQU11dGFibGVEaWN0aW9uYXJ5ICp0ZXN0RGljdDsKKyAgICBOU1N0cmluZyAqa2V5MSA9IEAiYTEwMSI7CisgICAgTlNTdHJpbmcgKm9iajEgPSBAIm9iajEwMSI7CisgICAgCisgICAgdGVzdERpY3QgPSBbQU11dGFibGVEaWN0aW9uYXJ5IG5ld0RpY3Rpb25hcnldOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6b2JqMSBmb3JLZXk6a2V5MV07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwNyIgZm9yS2V5OkAiYTEwNyJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDgiIGZvcktleTpAImExMDgiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTA5IiBmb3JLZXk6QCJhMTA5Il07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajExMCIgZm9yS2V5OkAiYTExMCJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMTEiIGZvcktleTpAImExMTEiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTEyIiBmb3JLZXk6QCJhMTEyIl07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwMiIgZm9yS2V5OkAiYTEwMiJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDMiIGZvcktleTpAImExMDMiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTA0IiBmb3JLZXk6QCJhMTA0Il07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwNSIgZm9yS2V5OkAiYTEwNSJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDYiIGZvcktleTpAImExMDYiXTsKKyAgICBOU1N0cmluZyAqZXhwZWN0ZWQgPSBAIm9iajEwNSI7CisgICAgTlNTdHJpbmcgKnJlc3VsdCA9IFt0ZXN0RGljdCBvYmplY3RGb3JLZXk6QCJhMTA1Il07CisgICAgU1RBc3NlcnRUcnVlKCBbZXhwZWN0ZWQgaXNFcXVhbFRvOnJlc3VsdF0sIEAiRXhwZWN0ZWQgXCIlQFwiIGJ1dCBnb3QgXCIlQFwiIiwgZXhwZWN0ZWQsIHJlc3VsdCApOworICAgIFt0ZXN0RGljdCByZW1vdmVPYmplY3RGb3JLZXk6QCJhMTA0Il07CisgICAgcmVzdWx0ID0gW3Rlc3REaWN0IG9iamVjdEZvcktleTpAImExMDYiXTsKKyAgICBleHBlY3RlZCA9IEAib2JqMTA2IjsKKyAgICBTVEFzc2VydFRydWUoIFtleHBlY3RlZCBpc0VxdWFsVG86cmVzdWx0XSwgQCJFeHBlY3RlZCBcIiVAXCIgYnV0IGdvdCBcIiVAXCIiLCBleHBlY3RlZCwgcmVzdWx0ICk7Cit9CisKKy0gKHZvaWQpIHRlc3QwNXJlbW92ZWZyb21IaQoreworICAgIEFNdXRhYmxlRGljdGlvbmFyeSAqdGVzdERpY3Q7CisgICAgTlNTdHJpbmcgKmtleTEgPSBAImExMDEiOworICAgIE5TU3RyaW5nICpvYmoxID0gQCJvYmoxMDEiOworICAgIAorICAgIHRlc3REaWN0ID0gW0FNdXRhYmxlRGljdGlvbmFyeSBuZXdEaWN0aW9uYXJ5XTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0Om9iajEgZm9yS2V5OmtleTFdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDciIGZvcktleTpAImExMDciXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTA4IiBmb3JLZXk6QCJhMTA4Il07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwOSIgZm9yS2V5OkAiYTEwOSJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMTAiIGZvcktleTpAImExMTAiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTExIiBmb3JLZXk6QCJhMTExIl07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajExMiIgZm9yS2V5OkAiYTExMiJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDIiIGZvcktleTpAImExMDIiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTAzIiBmb3JLZXk6QCJhMTAzIl07CisgICAgW3Rlc3REaWN0IHNldE9iamVjdDpAIm9iajEwNCIgZm9yS2V5OkAiYTEwNCJdOworICAgIFt0ZXN0RGljdCBzZXRPYmplY3Q6QCJvYmoxMDUiIGZvcktleTpAImExMDUiXTsKKyAgICBbdGVzdERpY3Qgc2V0T2JqZWN0OkAib2JqMTA2IiBmb3JLZXk6QCJhMTA2Il07CisgICAgTlNTdHJpbmcgKmV4cGVjdGVkID0gQCJvYmoxMDUiOworICAgIE5TU3RyaW5nICpyZXN1bHQgPSBbdGVzdERpY3Qgb2JqZWN0Rm9yS2V5OkAiYTEwNSJdOworICAgIFNUQXNzZXJ0VHJ1ZSggW2V4cGVjdGVkIGlzRXF1YWxUbzpyZXN1bHRdLCBAIkV4cGVjdGVkIFwiJUBcIiBidXQgZ290IFwiJUBcIiIsIGV4cGVjdGVkLCByZXN1bHQgKTsKKyAgICBbdGVzdERpY3QgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAiYTEwOCJdOworICAgIHJlc3VsdCA9IFt0ZXN0RGljdCBvYmplY3RGb3JLZXk6QCJhMTEwIl07CisgICAgZXhwZWN0ZWQgPSBAIm9iajExMCI7CisgICAgU1RBc3NlcnRUcnVlKCBbZXhwZWN0ZWQgaXNFcXVhbFRvOnJlc3VsdF0sIEAiRXhwZWN0ZWQgXCIlQFwiIGJ1dCBnb3QgXCIlQFwiIiwgZXhwZWN0ZWQsIHJlc3VsdCApOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvcmVjb2duaXplci9BTlRMUlJlY29nbml6ZXJUZXN0LmggYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvcmVjb2duaXplci9BTlRMUlJlY29nbml6ZXJUZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzIwODk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9yZWNvZ25pemVyL0FOVExSUmVjb2duaXplclRlc3QuaApAQCAtMCwwICsxLDE2IEBACisvLworLy8gIEFOVExSUmVjb2duaXplclRlc3QuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMDIvMDcvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFNlblRlc3RpbmdLaXQvU2VuVGVzdGluZ0tpdC5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJSZWNvZ25pemVyVGVzdCA6IFNlblRlc3RDYXNlIHsKKworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvcmVjb2duaXplci9BTlRMUlJlY29nbml6ZXJUZXN0Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvcmVjb2duaXplci9BTlRMUlJlY29nbml6ZXJUZXN0Lm0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjg1NzEwNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9yZWNvZ25pemVyL0FOVExSUmVjb2duaXplclRlc3QubQpAQCAtMCwwICsxLDE0IEBACisvLworLy8gIEFOVExSUmVjb2duaXplclRlc3QubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMDIvMDcvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgIkFOVExSUmVjb2duaXplclRlc3QuaCIKKworCitAaW1wbGVtZW50YXRpb24gQU5UTFJSZWNvZ25pemVyVGVzdAorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvc2V0cy9BTlRMUkJpdFNldFRlc3QuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9zZXRzL0FOVExSQml0U2V0VGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmY2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvc2V0cy9BTlRMUkJpdFNldFRlc3QuaApAQCAtMCwwICsxLDI0IEBACisvLworLy8gIEFOVExSQml0U2V0VGVzdC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMy8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCA8U2VuVGVzdGluZ0tpdC9TZW5UZXN0aW5nS2l0Lmg+CisKK0BpbnRlcmZhY2UgQU5UTFJCaXRTZXRUZXN0IDogU2VuVGVzdENhc2UgCit7CisJCit9CisKKy0odm9pZCkgdGVzdFdpdGhCaXREYXRhOworLSh2b2lkKSB0ZXN0V2l0aEJpdEFycmF5OworLSh2b2lkKSB0ZXN0QWRkOworLSh2b2lkKSB0ZXN0UmVtb3ZlOworLSh2b2lkKSB0ZXN0Q29weUJpdFNldDsKKy0odm9pZCkgdGVzdE9yOworLSh2b2lkKSB0ZXN0RGVzY3JpcHRpb247CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9zZXRzL0FOVExSQml0U2V0VGVzdC5tIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3NldHMvQU5UTFJCaXRTZXRUZXN0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmZDg5NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9zZXRzL0FOVExSQml0U2V0VGVzdC5tCkBAIC0wLDAgKzEsMTA4IEBACisvLworLy8gIEFOVExSQml0U2V0VGVzdC5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMy8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsIGFuZCBBbGFuIENvbmRpdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgIkFOVExSQml0U2V0VGVzdC5oIgorI2ltcG9ydCAiQU5UTFJCaXRTZXQuaCIKKyNpbXBvcnQgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxDb3JlRm91bmRhdGlvbi9DRkJpdFZlY3Rvci5oPgorCitAaW1wbGVtZW50YXRpb24gQU5UTFJCaXRTZXRUZXN0CisKKy0odm9pZCkgdGVzdFdpdGhCaXREYXRhCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBiaXREYXRhW10gPSB7M0xMLCAxTEx9OworCUFOVExSQml0U2V0ICpiaXRTZXQgPSBbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czpiaXREYXRhIENvdW50OjJdOworICAgIENGSW5kZXggYWN0dWFsID0gKENGSW5kZXgpW2JpdFNldCBudW1CaXRzXTsKKyAgICBDRkluZGV4IGV4cGVjdGVkID0gMzsKKwkKKyAgICBTVEFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBAIlRoZXJlIHNob3VsZCBiZSB0aHJlZSBiaXRzIHNldCBpbiBiaXR2ZWN0b3IuIEJ1dCBJIGhhdmUgJWQiLCBhY3R1YWwpOworCVtiaXRTZXQgcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdFdpdGhCaXRBcnJheQoreworCUFNdXRhYmxlQXJyYXkgKmJpdHMgPSBbQU11dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eToxMF07CisJW2JpdHMgYWRkT2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoQm9vbDpZRVNdXTsKKwlbYml0cyBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhCb29sOllFU11dOworCVtiaXRzIGFkZE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6Tk9dXTsKKwlbYml0cyBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhCb29sOllFU11dOworCVtiaXRzIGFkZE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6Tk9dXTsKKwlbYml0cyBhZGRPYmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhCb29sOllFU11dOworCVNUQXNzZXJ0VHJ1ZShbW2JpdHMgb2JqZWN0QXRJbmRleDowXSBib29sVmFsdWVdLCBAIlZhbHVlIGF0IGluZGV4IDAgd2FzIG5vdCB0cnVlIik7CisJU1RBc3NlcnRUcnVlKFtbYml0cyBvYmplY3RBdEluZGV4OjFdIGJvb2xWYWx1ZV0sIEAiVmFsdWUgYXQgaW5kZXggMSB3YXMgbm90IHRydWUiKTsKKwlTVEFzc2VydEZhbHNlKFtbYml0cyBvYmplY3RBdEluZGV4OjJdIGJvb2xWYWx1ZV0sIEAiVmFsdWUgYXQgaW5kZXggMiB3YXMgbm90IGZhbHNlIik7CisJU1RBc3NlcnRUcnVlKFtbYml0cyBvYmplY3RBdEluZGV4OjNdIGJvb2xWYWx1ZV0sIEAiVmFsdWUgYXQgaW5kZXggMyB3YXMgbm90IHRydWUiKTsKKwlTVEFzc2VydEZhbHNlKFtbYml0cyBvYmplY3RBdEluZGV4OjRdIGJvb2xWYWx1ZV0sIEAiVmFsdWUgYXQgaW5kZXggNCB3YXMgbm90IGZhbHNlIik7CisJU1RBc3NlcnRUcnVlKFtbYml0cyBvYmplY3RBdEluZGV4OjVdIGJvb2xWYWx1ZV0sIEAiVmFsdWUgYXQgaW5kZXggNSB3YXMgbm90IHRydWUiKTsKKwlBTlRMUkJpdFNldCAqYml0U2V0ID0gW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEFycmF5OmJpdHNdOworCUNGSW5kZXggYWN0dWFsID0gKENGSW5kZXgpW2JpdFNldCBudW1CaXRzXTsKKwlDRkluZGV4IGV4cGVjdGVkID0gNDsKKwlTVEFzc2VydEVxdWFscyhhY3R1YWwsIGV4cGVjdGVkLCBAIlRoZXJlIHNob3VsZCBiZSBmb3VyIGJpdHMgc2V0IGluIGJpdHZlY3Rvci4gQnV0IEkgaGF2ZSAlZCIsIGFjdHVhbCk7CisJW2JpdFNldCByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0QWRkCit7CisKKwlBTlRMUkJpdFNldCAqYml0U2V0ID0gW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0XTsKKwlbYml0U2V0IGFkZDoxXTsKKwlbYml0U2V0IGFkZDoyXTsKKwlbYml0U2V0IGFkZDozXTsKKwlDRkluZGV4IGFjdHVhbCA9IChDRkluZGV4KVtiaXRTZXQgbnVtQml0c107CisJQ0ZJbmRleCBleHBlY3RlZCA9IDM7CisJU1RBc3NlcnRFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCwgQCJUaGVyZSBzaG91bGQgYmUgdGhyZWUgYml0cyBzZXQgaW4gYml0dmVjdG9yLiBCdXQgSSBoYXZlICVkIiwgYWN0dWFsKTsKKwlbYml0U2V0IHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RSZW1vdmUKK3sKKwlBTlRMUkJpdFNldCAqYml0U2V0ID0gW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0XTsKKwlbYml0U2V0IGFkZDoxXTsKKwlDRkluZGV4IGFjdHVhbCA9IChDRkluZGV4KVtiaXRTZXQgbnVtQml0c107CisJQ0ZJbmRleCBleHBlY3RlZCA9IDE7CisJU1RBc3NlcnRUcnVlKGFjdHVhbCA9PSBleHBlY3RlZCwgQCJCaXRzZXQgd2FzIG5vdCBvZiBzaXplIDEiKTsKKwlTVEFzc2VydFRydWUoW2JpdFNldCBtZW1iZXI6MV0sIEAiQml0IGF0IGluZGV4IDEgaXMgbm90IGEgbWVtYmVyLi4uIik7CisJW2JpdFNldCByZW1vdmU6MV07CisJYWN0dWFsID0gW2JpdFNldCBudW1CaXRzXTsKKwlTVEFzc2VydFRydWUoYWN0dWFsID09IDAsIEAiQml0c2V0IHdhcyBub3QgZW1wdHkiKTsKKwlTVEFzc2VydEZhbHNlKFtiaXRTZXQgbWVtYmVyOjFdLCBAIkJpdCBhdCBpbmRleCAxIGlzIGEgbWVtYmVyLi4uIik7CisJU1RBc3NlcnRUcnVlKFtiaXRTZXQgaXNOaWxdLCBAIlRoZXJlIHdhcyBhdCBsZWFzdCBvbmUgYml0IG9uLi4uIik7Cit9CisKKy0odm9pZCkgdGVzdENvcHlCaXRTZXQKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGJpdERhdGFbXSA9IHszTEwsIDFMTH07CisJQU5UTFJCaXRTZXQgKmJpdFNldCA9IFtBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOmJpdERhdGEgQ291bnQ6Ml07CisJQU5UTFJCaXRTZXQgKmNvcHkgPSBbYml0U2V0IG11dGFibGVDb3B5V2l0aFpvbmU6bmlsXTsKKwlDRkluZGV4IGFjdHVhbCA9IChDRkluZGV4KVtjb3B5IG51bUJpdHNdOworCVNUQXNzZXJ0RXF1YWxzKGFjdHVhbCwgKENGSW5kZXgpW2JpdFNldCBudW1CaXRzXSwgQCJUaGVyZSBzaG91bGQgYmUgdGhyZWUgYml0cyBzZXQgaW4gYml0dmVjdG9yLiBCdXQgSSBoYXZlICVkIiwgW2NvcHkgbnVtQml0c10pOworCVtiaXRTZXQgcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdE9yCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBiaXREYXRhW10gPSB7M0xMLCAxTEx9OworCUFOVExSQml0U2V0ICpiaXRTZXQgPSBbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRXaXRoQml0czpiaXREYXRhIENvdW50OjJdOworCQorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgb3RoZXJEYXRhW10gPSB7NUxMLCAzTEwsIDFMTH07CisJQU5UTFJCaXRTZXQgKm90aGVyQml0U2V0ID0gW0FOVExSQml0U2V0IG5ld0FOVExSQml0U2V0V2l0aEJpdHM6b3RoZXJEYXRhIENvdW50OjNdOworCQorCUFOVExSQml0U2V0ICpjID0gW2JpdFNldCBvcjpvdGhlckJpdFNldF07CisJU1RBc3NlcnRUcnVlKFtjIHNpemVdID09IFtvdGhlckJpdFNldCBzaXplXSwgQCJjIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBvdGhlckJpdFNldCIpOworfQorCistKHZvaWQpIHRlc3REZXNjcmlwdGlvbgoreworCUFOVExSQml0U2V0ICpiaXRTZXQgPSBbQU5UTFJCaXRTZXQgbmV3QU5UTFJCaXRTZXRdOworCVtiaXRTZXQgYWRkOjFdOworCVtiaXRTZXQgYWRkOjJdOworCU5TTXV0YWJsZVN0cmluZyAqYURlc2NyaXB0aW9uID0gKE5TTXV0YWJsZVN0cmluZyAqKVtiaXRTZXQgZGVzY3JpcHRpb25dOworCVNUQXNzZXJ0VHJ1ZShbYURlc2NyaXB0aW9uIGlzRXF1YWxUb1N0cmluZzpAInsxLDJ9Il0sIEAiRGVzY3JpcHRpb24gd2FzIG5vdCByaWdodCwgZXhwZWN0ZWQgJ3sxLDJ9JyBnb3Q6ICVAIiwgYURlc2NyaXB0aW9uKTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3N0cmVhbS9BTlRMUlN0cmluZ1N0cmVhbVRlc3QuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9zdHJlYW0vQU5UTFJTdHJpbmdTdHJlYW1UZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2NTQzNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9zdHJlYW0vQU5UTFJTdHJpbmdTdHJlYW1UZXN0LmgKQEAgLTAsMCArMSwyNCBAQAorLy8KKy8vICBBTlRMUlN0cmluZ1N0cmVhbVRlc3QuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMTIvMDUvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFNlblRlc3RpbmdLaXQvU2VuVGVzdGluZ0tpdC5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJTdHJpbmdTdHJlYW1UZXN0IDogU2VuVGVzdENhc2UgeworCit9CisKKy0odm9pZCkgdGVzdEluaXRXaXRoSW5wdXQ7CistKHZvaWQpIHRlc3RDb25zdW1lQW5kUmVzZXQ7CistKHZvaWQpIHRlc3RDb25zdW1lV2l0aE5ld0xpbmU7CistKHZvaWQpIHRlc3RTZWVrOworLSh2b2lkKSB0ZXN0U2Vla01hcmtBbmRSZXdpbmQ7CistKHZvaWQpIHRlc3RMQUVPRjsKKy0odm9pZCkgdGVzdExURU9GOyAvLyBzYW1lIGFzIExBCisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS9zdHJlYW0vQU5UTFJTdHJpbmdTdHJlYW1UZXN0Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvc3RyZWFtL0FOVExSU3RyaW5nU3RyZWFtVGVzdC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvc3RyZWFtL0FOVExSU3RyaW5nU3RyZWFtVGVzdC5tCkBAIC0wLDAgKzEsMTA4IEBACisvLworLy8gIEFOVExSU3RyaW5nU3RyZWFtVGVzdC5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMi8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiQU5UTFJTdHJpbmdTdHJlYW1UZXN0LmgiCisjaW1wb3J0ICJBTlRMUkNoYXJTdHJlYW0uaCIKKyNpbXBvcnQgIkFOVExSU3RyaW5nU3RyZWFtLmgiCisjaW1wb3J0ICJBTlRMUkVycm9yLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUlN0cmluZ1N0cmVhbVRlc3QKKworLSh2b2lkKSB0ZXN0SW5pdFdpdGhJbnB1dAoreworCU5TU3RyaW5nICppbnB1dCA9IEAiVGhpcyBpcyBhIHN0cmluZyB1c2VkIGZvciBBTlRMUlN0cmluZ1N0cmVhbSBpbnB1dCA7KSI7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTppbnB1dF07CisJTlNTdHJpbmcgKnN1YlN0cmluZyA9IFtzdHJlYW0gc3Vic3RyaW5nOjAgVG86MTBdOworCU5TTG9nKEAiVGhlIGZpcnN0IHRlbiBjaGFycyBhcmUgJyVAJyIsIHN1YlN0cmluZyk7CisJU1RBc3NlcnRUcnVlKFtAIlRoaXMgaXMgYSAiIGlzRXF1YWxUb1N0cmluZzpzdWJTdHJpbmddLCBAIlRoZSBzdHJpbmdzIGRvIG5vdCBtYXRjaCIpOworCVtzdHJlYW0gcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdENvbnN1bWVBbmRSZXNldAoreworCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJUaGlzIGlzIGEgc3RyaW5nIHVzZWQgZm9yIGlucHV0Il07CisJW3N0cmVhbSBjb25zdW1lXTsKKwlTVEFzc2VydFRydWUoc3RyZWFtLmluZGV4ID4gMCwgQCJJbmRleCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAgYWZ0ZXIgY29uc3VtZSIpOworCVtzdHJlYW0gcmVzZXRdOworCVNUQXNzZXJ0VHJ1ZShzdHJlYW0uaW5kZXggPT0gMCwgQCJJbmRleCBzaG91bGQgYmUgMCBhZnRlciByZXNldCIpOworCVtzdHJlYW0gcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdENvbnN1bWVXaXRoTmV3TGluZQoreworCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJUaGlzIGlzIGEgc3RyaW5nXG51c2VkIGZvciBpbnB1dCJdOworCXdoaWxlIChzdHJlYW0uaW5kZXggPCBbc3RyZWFtIHNpemVdICYmIHN0cmVhbS5saW5lID09IDEpCisJeworCQlbc3RyZWFtIGNvbnN1bWVdOworCX0KKwlTVEFzc2VydFRydWUoc3RyZWFtLmxpbmUgPT0gMiwgQCJMaW5lIG51bWJlciBpcyBpbmNvcnJlY3QsIHNob3VsZCBiZSAyLCB3YXMgJWQhIiwgc3RyZWFtLmxpbmUpOworCVNUQXNzZXJ0VHJ1ZShzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lID09IDAsIEAiQ2hhciBwb3NpdGlvbiBpbiBsaW5lIHNob3VsZCBiZSAwLCBpdCB3YXM6ICVkISIsIHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUpOworCVtzdHJlYW0gcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdExBRU9GCit7CisgICAgTlNJbnRlZ2VyIGk7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTpAIlRoaXMgaXMgYSBzdHJpbmdcbnVzZWQgZm9yIGlucHV0Il07CisJQk9PTCBlb2ZGb3VuZCA9IE5POworCWZvciAoaSA9IDE7IGkgPD0gW3N0cmVhbSBzaXplXSsxOyBpKyspIHsKKwkJTlNJbnRlZ2VyIHIgPSBbc3RyZWFtIExBOmldOworCQlpZiAociA9PSAoTlNJbnRlZ2VyKUFOVExSQ2hhclN0cmVhbUVPRikgeworCQkJZW9mRm91bmQgPSBZRVM7CisgICAgICAgICAgICBicmVhazsKKwkJfQorCX0KKwlTVEFzc2VydFRydWUoZW9mRm91bmQsIEAiRU9GIFdhcyBub3QgZm91bmQgaW4gc3RyZWFtLCBMZW5ndGggPSVkLCBpbmRleCA9ICVkLCBpID0gJWQiLCBbc3RyZWFtIHNpemVdLCBzdHJlYW0uaW5kZXgsIGkpOworCVtzdHJlYW0gcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdExURU9GCit7CisgICAgTlNJbnRlZ2VyIGk7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTpAIlRoaXMgaXMgYSBzdHJpbmdcbnVzZWQgZm9yIGlucHV0Il07CisJQk9PTCBlb2ZGb3VuZCA9IE5POworCWZvciAoIGkgPSAxOyBpIDw9IFtzdHJlYW0gc2l6ZV0rMTsgaSsrKSB7CisJCU5TSW50ZWdlciByID0gW3N0cmVhbSBMVDppXTsKKwkJaWYgKHIgPT0gKE5TSW50ZWdlcilBTlRMUkNoYXJTdHJlYW1FT0YpIHsKKwkJCWVvZkZvdW5kID0gWUVTOworICAgICAgICAgICAgYnJlYWs7CisJCX0KKwl9CisJU1RBc3NlcnRUcnVlKGVvZkZvdW5kLCBAIkVPRiBXYXMgbm90IGZvdW5kIGluIHN0cmVhbSwgTGVuZ3RoID0lZCwgaW5kZXggPSAlZCwgaSA9ICVkIiwgW3N0cmVhbSBzaXplXSwgc3RyZWFtLmluZGV4LCBpKTsKKwlbc3RyZWFtIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RTZWVrCit7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9W0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAiVGhpcyBpcyBhIHN0cmluZyB1c2VkIGZvciBpbnB1dCJdOworCVtzdHJlYW0gc2VlazoxMF07CisJU1RBc3NlcnRUcnVlKHN0cmVhbS5pbmRleCA9PSAxMCwgQCJJbmRleCBzaG91bGQgYmUgMTAiKTsKKwkvLyBHZXQgY2hhciAxMCB3aGljaCBpcyBzICh3aXRoIDAgYmVpbmcgVCkKKwlTVEFzc2VydFRydWUoW3N0cmVhbSBMQToxXSA+IC0xICYmIChjaGFyKVtzdHJlYW0gTEE6MV0gPT0gJ3MnLCBAIkNoYXIgcmV0dXJuZWQgc2hvdWxkIGJlIHMiKTsKKwlbc3RyZWFtIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3RTZWVrTWFya0FuZFJld2luZAoreworCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPVtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTpAIlRoaXMgaXMgYSBzdHJpbmcgdXNlZCBmb3IgaW5wdXQiXTsKKwlbc3RyZWFtIG1hcmtdOworCVtzdHJlYW0gc2VlazoxMF07CisJU1RBc3NlcnRUcnVlKHN0cmVhbS5pbmRleCA9PSAxMCwgQCJJbmRleCBzaG91bGQgYmUgMTAiKTsKKwlbc3RyZWFtIHJld2luZF07CisJU1RBc3NlcnRUcnVlKHN0cmVhbS5pbmRleCA9PSAwLCBAIkluZGV4IHNob3VsZCBiZSAwIik7CisJW3N0cmVhbSBzZWVrOjVdOworCVNUQXNzZXJ0VHJ1ZShzdHJlYW0uaW5kZXggPT0gNSwgQCJJbmRleCBzaG91bGQgYmUgNSIpOworCVtzdHJlYW0gbWFya107IC8vIG1ha2UgYSBuZXcgbWFya2VyIHRvIHRlc3QgYSBicmFuY2guCisJW3N0cmVhbSBzZWVrOjEwXTsKKwlTVEFzc2VydFRydWUoc3RyZWFtLmluZGV4ID09IDEwLCBAIkluZGV4IHNob3VsZCBiZSAxMCIpOworCVtzdHJlYW0gcmV3aW5kXTsgLy8gc2hvdWxkIGJlIG1hcmtlZCB0byA1LgorCVNUQXNzZXJ0VHJ1ZShzdHJlYW0uaW5kZXggPT0gNSwgQCJJbmRleCBzaG91bGQgYmUgNSIpOworCVtzdHJlYW0gcmVsZWFzZV07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90b2tlbi9BTlRMUkNvbW1vblRva2VuVGVzdC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3Rva2VuL0FOVExSQ29tbW9uVG9rZW5UZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMDI4YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90b2tlbi9BTlRMUkNvbW1vblRva2VuVGVzdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vCisvLyAgQU5UTFJDb21tb25Ub2tlblRlc3QuaAorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMjUvMDUvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFNlblRlc3RpbmdLaXQvU2VuVGVzdGluZ0tpdC5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25Ub2tlblRlc3QgOiBTZW5UZXN0Q2FzZSAKK3sKKworfQorCistKHZvaWQpIHRlc3QwMUluaXRBbmRSZWxlYXNlOworLSh2b2lkKSB0ZXN0MDJHZXRFT0ZUb2tlbjsKKy0odm9pZCkgdGVzdDAzSW5pdFdpdGhUb2tlblR5cGU7CistKHZvaWQpIHRlc3QwNEluaXRXaXRoVG9rZW5UeXBlQW5kVGV4dDsKKy0odm9pZCkgdGVzdDA1SW5pdFdpdGhDaGFyU3RyZWFtOworLSh2b2lkKSB0ZXN0MDZJbml0V2l0aFRva2VuOworLSh2b2lkKSB0ZXN0MDdUb2tlbkRlc2NyaXB0aW9uOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdG9rZW4vQU5UTFJDb21tb25Ub2tlblRlc3QubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90b2tlbi9BTlRMUkNvbW1vblRva2VuVGVzdC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDVjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdG9rZW4vQU5UTFJDb21tb25Ub2tlblRlc3QubQpAQCAtMCwwICsxLDk4IEBACisvLworLy8gIEFOVExSQ29tbW9uVG9rZW5UZXN0Lm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI1LzA1LzIwMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgSWFuIE1pY2hlbGwgYW5kIEFsYW4gQ29uZGl0LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiQU5UTFJDb21tb25Ub2tlblRlc3QuaCIKKyNpbXBvcnQgIkFOVExSQ29tbW9uVG9rZW4uaCIKKyNpbXBvcnQgIkFOVExSU3RyaW5nU3RyZWFtLmgiCisKK0BpbXBsZW1lbnRhdGlvbiBBTlRMUkNvbW1vblRva2VuVGVzdAorCistKHZvaWQpIHRlc3QwMUluaXRBbmRSZWxlYXNlCit7CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW5dIHJldGFpbl07CisJU1RBc3NlcnROb3ROaWwodG9rZW4sIEAiVG9rZW4gd2FzIG5pbCIpOworCVt0b2tlbiByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0MDJHZXRFT0ZUb2tlbgoreworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuID0gW1tBTlRMUkNvbW1vblRva2VuIGVvZlRva2VuXSByZXRhaW5dOworCVNUQXNzZXJ0Tm90TmlsKHRva2VuLCBAIlRva2VuIHdhcyBuaWwiKTsKKwlTVEFzc2VydEVxdWFscyh0b2tlbi50eXBlLCAoTlNJbnRlZ2VyKUFOVExSVG9rZW5UeXBlRU9GLCBAIlRva2VuIHdhcyBub3Qgb2YgdHlwZSBBTlRMUlRva2VuVHlwZUVPRiIpOworCVt0b2tlbiByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0MDNJbml0V2l0aFRva2VuVHlwZQoreworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOkFOVExSVG9rZW5UeXBlVVBdIHJldGFpbl07CisJdG9rZW4udGV4dCA9IEAiPFVQPiI7CisJU1RBc3NlcnROb3ROaWwodG9rZW4sIEAiVG9rZW4gd2FzIG5pbCIpOworCVNUQXNzZXJ0RXF1YWxzKHRva2VuLnR5cGUsIChOU0ludGVnZXIpQU5UTFJUb2tlblR5cGVVUCwgQCJUb2tlbiB3YXMgbm90IG9mIHR5cGUgQU5UTFJUb2tlblR5cGVVUCIpOworCVNUQXNzZXJ0Tm90TmlsKHRva2VuLnRleHQsIEAiVG9rZW4gdGV4dCB3YXMgbmlsLCB3YXMgZXhwZWN0aW5nIDxVUD4iKTsKKwlTVEFzc2VydFRydWUoW3Rva2VuLnRleHQgaXNFcXVhbFRvU3RyaW5nOkAiPFVQPiJdLCBAIlRva2VuIHRleHQgd2FzIG5vdCA8VVA+IHdhcyBpbnN0ZWFkOiAlQCIsIHRva2VuLnRleHQpOworCVt0b2tlbiByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0MDRJbml0V2l0aFRva2VuVHlwZUFuZFRleHQKK3sKKwlBTlRMUkNvbW1vblRva2VuICp0b2tlbiA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpBTlRMUlRva2VuVHlwZVVQIFRleHQ6QCI8VVA+Il0gcmV0YWluXTsKKwlTVEFzc2VydE5vdE5pbCh0b2tlbiwgQCJUb2tlbiB3YXMgbmlsIik7CisJU1RBc3NlcnRFcXVhbHModG9rZW4udHlwZSwgKE5TSW50ZWdlcilBTlRMUlRva2VuVHlwZVVQLCBAIlRva2VuIHdhcyBub3Qgb2YgdHlwZSBBTlRMUlRva2VuVHlwZVVQIik7CisJU1RBc3NlcnROb3ROaWwodG9rZW4udGV4dCwgQCJUb2tlbiB0ZXh0IHdhcyBuaWwsIHdhcyBleHBlY3RpbmcgPFVQPiIpOworCVNUQXNzZXJ0VHJ1ZShbdG9rZW4udGV4dCBpc0VxdWFsVG9TdHJpbmc6QCI8VVA+Il0sIEAiVG9rZW4gdGV4dCB3YXMgbm90IDxVUD4gd2FzIGluc3RlYWQ6ICVAIiwgdG9rZW4udGV4dCk7CisJW3Rva2VuIHJlbGVhc2VdOworfQorCistKHZvaWQpIHRlc3QwNUluaXRXaXRoQ2hhclN0cmVhbQoreworCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il0gcmV0YWluXTsKKwlBTlRMUkNvbW1vblRva2VuICp0b2tlbiA9IFtbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdIHJldGFpbl07CisJU1RBc3NlcnROb3ROaWwodG9rZW4sIEAiVG9rZW4gd2FzIG5pbCIpOworCVNUQXNzZXJ0RXF1YWxzKHRva2VuLnR5cGUsIChOU0ludGVnZXIpNTU1LCBAIlRva2VuIHdhcyBub3Qgb2YgdHlwZSA1NTUiKTsgLy8gTmljZSByYW5kb20gdHlwZSBudW1iZXIKKwlTVEFzc2VydE5vdE5pbCh0b2tlbi50ZXh0LCBAIlRva2VuIHRleHQgd2FzIG5pbCwgd2FzIGV4cGVjdGluZyB8fCIpOworCVNUQXNzZXJ0VHJ1ZShbdG9rZW4udGV4dCBpc0VxdWFsVG9TdHJpbmc6QCJ8fCJdLCBAIlRva2VuIHRleHQgd2FzIG5vdCB8fCB3YXMgaW5zdGVhZDogJUAiLCB0b2tlbi50ZXh0KTsKKwlbdG9rZW4gcmVsZWFzZV07CisgICAgW3N0cmVhbSByZWxlYXNlXTsKK30KKworLSh2b2lkKSB0ZXN0MDZJbml0V2l0aFRva2VuCit7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJ0aGlzfHxpc3x8YXx8ZG91YmxlfHxwaXBlZHx8c2VwYXJhdGVkfHxjc3YiXSByZXRhaW5dOworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOnN0cmVhbSBUeXBlOjU1NSBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo0IFN0b3A6NV0gcmV0YWluXTsKKwlTVEFzc2VydE5vdE5pbCh0b2tlbiwgQCJUb2tlbiB3YXMgbmlsIik7CisJU1RBc3NlcnRFcXVhbHModG9rZW4udHlwZSwgKE5TSW50ZWdlcik1NTUsIEAiVG9rZW4gd2FzIG5vdCBvZiB0eXBlIDU1NSIpOyAvLyBOaWNlIHJhbmRvbSB0eXBlIG51bWJlcgorCVNUQXNzZXJ0Tm90TmlsKHRva2VuLnRleHQsIEAiVG9rZW4gdGV4dCB3YXMgbmlsLCB3YXMgZXhwZWN0aW5nIHx8Iik7CisJU1RBc3NlcnRUcnVlKFt0b2tlbi50ZXh0IGlzRXF1YWxUb1N0cmluZzpAInx8Il0sIEAiVG9rZW4gdGV4dCB3YXMgbm90IHx8IHdhcyBpbnN0ZWFkOiAlQCIsIHRva2VuLnRleHQpOworCQorCUFOVExSQ29tbW9uVG9rZW4gKm5ld1Rva2VuID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuV2l0aFRva2VuOnRva2VuXSByZXRhaW5dOworCVNUQXNzZXJ0Tm90TmlsKG5ld1Rva2VuLCBAIk5ldyB0b2tlbiBpcyBuaWwhIik7CisJU1RBc3NlcnRFcXVhbHMobmV3VG9rZW4udHlwZSwgdG9rZW4udHlwZSwgQCJUb2tlbnMgdHlwZXMgZG8gbm90IG1hdGNoICVkOiVkISIsIG5ld1Rva2VuLnR5cGUsIHRva2VuLnR5cGUpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1Rva2VuLmxpbmUsIHRva2VuLmxpbmUsIEAiVG9rZW4gbGluZXMgZG8gbm90IG1hdGNoISIpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1Rva2VuLmluZGV4LCB0b2tlbi5pbmRleCwgQCJUb2tlbiBpbmRleGVzIGRvIG5vdCBtYXRjaCIpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1Rva2VuLmNoYW5uZWwsIHRva2VuLmNoYW5uZWwsIEAiVG9rZW4gY2hhbm5lbHMgYXJlIG5vdCB0aGUgc2FtZSIpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1Rva2VuLmNoYXJQb3NpdGlvbkluTGluZSwgdG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lLCBAIlRva2VuIGNoYXIgcG9zaXRpb25zIGluIGxpbmVzIGRvIG5vdCBtYXRjaCIpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1Rva2VuLnN0YXJ0SW5kZXgsIHRva2VuLnN0YXJ0SW5kZXgsIEAiVG9rZW4gc3RhcnQgcG9zaXRpb25zIGRvIG5vdCBtYXRjaCIpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1Rva2VuLnN0b3BJbmRleCwgdG9rZW4uc3RvcEluZGV4LCBAIlRva2VuIHN0b3AgcG9zaXRpb25zIGRvIG5vdCBtYXRjaCIpOworCVNUQXNzZXJ0VHJ1ZShbbmV3VG9rZW4udGV4dCBpc0VxdWFsVG9TdHJpbmc6dG9rZW4udGV4dF0sIEAiVG9rZW4gdGV4dCBkb2VzIG5vdCBtYXRjaCEiKTsKKwlbdG9rZW4gcmVsZWFzZV07CisJW25ld1Rva2VuIHJlbGVhc2VdOworICAgIFtzdHJlYW0gcmVsZWFzZV07Cit9CisKKy0odm9pZCkgdGVzdDA3VG9rZW5EZXNjcmlwdGlvbgoreworICAgIE5TU3RyaW5nICphRGVzY3JpcHRpb247CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJ0aGlzfHxpc3x8YXx8ZG91YmxlfHxwaXBlZHx8c2VwYXJhdGVkfHxjc3YiXSByZXRhaW5dOworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuID0gW1tBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOnN0cmVhbSBUeXBlOjU1NSBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo0IFN0b3A6NV0gcmV0YWluXTsKKyAgICBhRGVzY3JpcHRpb24gPSBbdG9rZW4gZGVzY3JpcHRpb25dOworCVNUQXNzZXJ0VHJ1ZShbYURlc2NyaXB0aW9uIGlzRXF1YWxUb1N0cmluZzpAIltAMCwgNDo1PSd8fCcsPDU1NT4sMDowXSJdLCBAIlN0cmluZyBkZXNjcmlwdGlvbiBmb3IgdG9rZW4gaXMgbm90IGNvcnJlY3QhIGdvdCAlQCIsIGFEZXNjcmlwdGlvbik7CisgICAgW3Rva2VuIHJlbGVhc2VdOworICAgIFtzdHJlYW0gcmVsZWFzZV07Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uRXJyb3JOb2RlVGVzdC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3RyZWUvQU5UTFJDb21tb25FcnJvck5vZGVUZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODYxYmYzNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uRXJyb3JOb2RlVGVzdC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vCisvLyAgQU5UTFJDb21tb25FcnJvck5vZGVUZXN0LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDEwLzA2LzIwMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgSWFuIE1pY2hlbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0IDxTZW5UZXN0aW5nS2l0L1NlblRlc3RpbmdLaXQuaD4KKworCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uRXJyb3JOb2RlVGVzdCA6IFNlblRlc3RDYXNlIHsKKworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QubSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uRXJyb3JOb2RlVGVzdC5tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZDFjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vbkVycm9yTm9kZVRlc3QubQpAQCAtMCwwICsxLDE0IEBACisvLworLy8gIEFOVExSQ29tbW9uRXJyb3JOb2RlVGVzdC5tCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAxMC8wNi8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKworI2ltcG9ydCAiQU5UTFJDb21tb25FcnJvck5vZGVUZXN0LmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSQ29tbW9uRXJyb3JOb2RlVGVzdAorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vblRyZWVBZGFwdG9yVGVzdC5oIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3RyZWUvQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MzI2Njc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3RyZWUvQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QuaApAQCAtMCwwICsxLDE2IEBACisvLworLy8gIEFOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0LmgKKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDEwLzA2LzIwMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgSWFuIE1pY2hlbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0IDxTZW5UZXN0aW5nS2l0L1NlblRlc3RpbmdLaXQuaD4KKworCitAaW50ZXJmYWNlIEFOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0IDogU2VuVGVzdENhc2UgeworCit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vblRyZWVBZGFwdG9yVGVzdC5tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljOWE3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vblRyZWVBZGFwdG9yVGVzdC5tCkBAIC0wLDAgKzEsMTQgQEAKKy8vCisvLyAgQU5UTFJDb21tb25UcmVlQWRhcHRvclRlc3QubQorLy8gIEFOVExSCisvLworLy8gIENyZWF0ZWQgYnkgSWFuIE1pY2hlbGwgb24gMTAvMDYvMjAxMC4KKy8vICBDb3B5cmlnaHQgMjAxMCBJYW4gTWljaGVsbC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgIkFOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0LmgiCisKKworQGltcGxlbWVudGF0aW9uIEFOVExSQ29tbW9uVHJlZUFkYXB0b3JUZXN0CisKK0BlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uVHJlZVRlc3QuaCBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uVHJlZVRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQyM2IzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvT2JqQy9GcmFtZXdvcmsvdGVzdC9ydW50aW1lL3RyZWUvQU5UTFJDb21tb25UcmVlVGVzdC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vCisvLyAgQU5UTFJDb21tb25UcmVlVGVzdC5oCisvLyAgQU5UTFIKKy8vCisvLyAgQ3JlYXRlZCBieSBJYW4gTWljaGVsbCBvbiAyNi8wNS8yMDEwLgorLy8gIENvcHlyaWdodCAyMDEwIElhbiBNaWNoZWxsIGFuZCBBbGFuIENvbmRpdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisKKyNpbXBvcnQgPFNlblRlc3RpbmdLaXQvU2VuVGVzdGluZ0tpdC5oPgorCisKK0BpbnRlcmZhY2UgQU5UTFJDb21tb25UcmVlVGVzdCA6IFNlblRlc3RDYXNlIAoreworfQorCistKHZvaWQpIHRlc3QwMUluaXRBbmRSZWxlYXNlOworLSh2b2lkKSB0ZXN0MDJJbml0V2l0aFRyZWU7CistKHZvaWQpIHRlc3QwM1dpdGhUb2tlbjsKKy0odm9pZCkgdGVzdDA0SW52YWxpZFRyZWVOb2RlOworLSh2b2lkKSB0ZXN0MDVJbml0V2l0aENvbW1vblRyZWVOb2RlOworLSh2b2lkKSB0ZXN0MDZDb3B5VHJlZTsKKy0odm9pZCkgdGVzdDA3RGVzY3JpcHRpb247CistKHZvaWQpIHRlc3QwOFRleHQ7CistKHZvaWQpIHRlc3QwOUFkZENoaWxkOworLSh2b2lkKSB0ZXN0MTBBZGRDaGlsZHJlbjsKKy0odm9pZCkgdGVzdDExQWRkU2VsZkFzQ2hpbGQ7CistKHZvaWQpIHRlc3QxMkFkZEVtcHR5Q2hpbGRXaXRoTm9DaGlsZHJlbjsKKy0odm9pZCkgdGVzdDEzQWRkRW1wdHlDaGlsZFdpdGhDaGlsZHJlbjsKKy0odm9pZCkgdGVzdDE0Q2hpbGRBdEluZGV4OworLSh2b2lkKSB0ZXN0MTVTZXRDaGlsZEF0SW5kZXg7CistKHZvaWQpIHRlc3QxNkdldEFuY2VzdG9yOworLSh2b2lkKSB0ZXN0MTdGaXJzdENoaWxkV2l0aFR5cGU7CistKHZvaWQpIHRlc3QxOFNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzRm9yUGFyZW50VHJlZTsKKy0odm9pZCkgdGVzdDE5RGVsZXRlQ2hpbGQ7CistKHZvaWQpIHRlc3QyMFRyZWVEZXNjcmlwdGlvbnM7CistKHZvaWQpIHRlc3QyMVJlcGxhY2VDaGlsZHJlbkF0SW5kZXhXaXRoTm9DaGlsZHJlbjsKKy0odm9pZCkgdGVzdDIyUmVwbGFjZUNoaWxkcmVuQXRJbmRleDsKKy0odm9pZCkgdGVzdDIzUmVwbGFjZUNoaWxkcmVuQXRJbmRleFdpdGhDaGlsZDsKKy0odm9pZCkgdGVzdDI0UmVwbGFjZWNoaWxkcmVuQXRJbmRleFdpdGhMZXNzQ2hpbGRyZW47CistKHZvaWQpIHRlc3QyNVJlcGxhY2VjaGlsZHJlbkF0SW5kZXhXaXRoTW9yZUNoaWxkcmVuOworCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vblRyZWVUZXN0Lm0gYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL0ZyYW1ld29yay90ZXN0L3J1bnRpbWUvdHJlZS9BTlRMUkNvbW1vblRyZWVUZXN0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0NDcyMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvRnJhbWV3b3JrL3Rlc3QvcnVudGltZS90cmVlL0FOVExSQ29tbW9uVHJlZVRlc3QubQpAQCAtMCwwICsxLDU1NSBAQAorLy8KKy8vICBBTlRMUkNvbW1vblRyZWVUZXN0Lm0KKy8vICBBTlRMUgorLy8KKy8vICBDcmVhdGVkIGJ5IElhbiBNaWNoZWxsIG9uIDI2LzA1LzIwMTAuCisvLyAgQ29weXJpZ2h0IDIwMTAgSWFuIE1pY2hlbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworCisjaW1wb3J0ICJBTlRMUkJhc2VUcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRyZWVUZXN0LmgiCisjaW1wb3J0ICJBTlRMUlN0cmluZ1N0cmVhbS5oIgorI2ltcG9ydCAiQU5UTFJDb21tb25UcmVlLmgiCisjaW1wb3J0ICJBTlRMUkNvbW1vblRva2VuLmgiCisjaW1wb3J0ICJBTlRMUkVycm9yLmgiCisjaW1wb3J0ICJBTlRMUlJ1bnRpbWVFeGNlcHRpb24uaCIKKworQGltcGxlbWVudGF0aW9uIEFOVExSQ29tbW9uVHJlZVRlc3QKKworLSh2b2lkKSB0ZXN0MDFJbml0QW5kUmVsZWFzZQoreworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJU1RBc3NlcnROb3ROaWwodHJlZSwgQCJUcmVlIHdhcyBuaWwiKTsKKwkvLyBGSVhNRTogSXQgZG9lc24ndCBkbyBhbnl0aGluZyBlbHNlLCBwZXJoYXBzIGluaXRXaXRoVHJlZSBzaG91bGQgc2V0IHNvbWV0aGluZyBzb21ld2hlcmUsIGphdmEgc2F5cyBubyB0aG91Z2guLi4KKyAgICByZXR1cm47Cit9CisKKy0odm9pZCkgdGVzdDAySW5pdFdpdGhUcmVlCit7CisJQU5UTFJDb21tb25UcmVlICp0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlTVEFzc2VydE5vdE5pbCh0cmVlLCBAIlRyZWUgd2FzIG5pbCIpOworICAgIGlmICh0cmVlICE9IG5pbCkKKyAgICAgICAgU1RBc3NlcnRFcXVhbHMoW3RyZWUgZ2V0VHlwZV0sIChOU0ludGVnZXIpQU5UTFJUb2tlblR5cGVJbnZhbGlkLCBAIlRyZWUgc2hvdWxkIGhhdmUgYW4gaW52YWxpZCB0b2tlbiB0eXBlLCBiZWNhdXNlIGl0IGhhcyBubyB0b2tlbiIpOworICAgIC8vIFt0cmVlIHJlbGVhc2VdOworICAgIHJldHVybjsKK30KKworLSh2b2lkKSB0ZXN0MDNXaXRoVG9rZW4KK3sKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCXRva2VuLmxpbmUgPSAxOworCXRva2VuLmNoYXJQb3NpdGlvbkluTGluZSA9IDQ7CisJQU5UTFJDb21tb25UcmVlICp0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuOnRva2VuXTsKKwlTVEFzc2VydE5vdE5pbCh0cmVlLCBAIlRyZWUgd2FzIG5pbCIpOworICAgIGlmICh0cmVlICE9IG5pbCkKKyAgICAgICAgU1RBc3NlcnROb3ROaWwodHJlZS50b2tlbiwgQCJUcmVlIHdpdGggdG9rZW4gd2FzIG5pbCIpOworICAgIGlmICh0cmVlICE9IG5pbCAmJiB0cmVlLnRva2VuICE9IG5pbCkgeworICAgICAgICBTVEFzc2VydEVxdWFscygoTlNVSW50ZWdlcikgdHJlZS50b2tlbi5saW5lLCAoTlNVSW50ZWdlcikxLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIlRyZWUgc2hvdWxkIGJlIGF0IGxpbmUgMSwgYnV0IHdhcyBhdCAlZCIsIHRyZWUudG9rZW4ubGluZV0gKTsKKyAgICAgICAgU1RBc3NlcnRFcXVhbHMoKE5TVUludGVnZXIpIHRyZWUudG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lLCAoTlNVSW50ZWdlcik0LCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIkNoYXIgcG9zaXRpb24gc2hvdWxkIGJlIDEsIGJ1dCB3YXMgYXQgJWQiLCB0cmVlLnRva2VuLmNoYXJQb3NpdGlvbkluTGluZV0pOworICAgICAgICBTVEFzc2VydE5vdE5pbCgoKEFOVExSQ29tbW9uVG9rZW4gKil0cmVlLnRva2VuKS50ZXh0LCBAIlRyZWUgd2l0aCB0b2tlbiB3aXRoIHRleHQgd2FzIG5pbCIpOworICAgIH0KKyAgICBpZiAodHJlZSAhPSBuaWwgJiYgdHJlZS50b2tlbiAhPSBuaWwgJiYgdHJlZS50b2tlbi50ZXh0ICE9IG5pbCkKKyAgICAgICAgU1RBc3NlcnRUcnVlKFt0cmVlLnRva2VuLnRleHQgaXNFcXVhbFRvU3RyaW5nOkAifHwiXSwgQCJUZXh0IHdhcyBub3QgfHwiKTsKKwkvL1t0cmVlIHJlbGVhc2VdOworICAgIHJldHVybjsKK30KKworLSh2b2lkKSB0ZXN0MDRJbnZhbGlkVHJlZU5vZGUKK3sKKwlBTlRMUkNvbW1vblRyZWUgKnRyZWUgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW46W0FOVExSQ29tbW9uVG9rZW4gaW52YWxpZFRva2VuXV07CisJU1RBc3NlcnROb3ROaWwodHJlZSwgQCJUcmVlIHdhcyBuaWwiKTsKKwlTVEFzc2VydEVxdWFscyh0cmVlLnRva2VuLnR5cGUsIChOU0ludGVnZXIpQU5UTFJUb2tlblR5cGVJbnZhbGlkLCBAIlRyZWUgVG9rZW4gdHlwZSB3YXMgbm90IEFOVExSVG9rZW5UeXBlSW52YWxpZCIpOworCS8vW3RyZWUgcmVsZWFzZV07CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QwNUluaXRXaXRoQ29tbW9uVHJlZU5vZGUKK3sKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjp0b2tlbl07CisJU1RBc3NlcnROb3ROaWwodHJlZSwgQCJUcmVlIHdhcyBuaWwiKTsKKwlTVEFzc2VydE5vdE5pbCh0cmVlLnRva2VuLCBAIlRyZWUgdG9rZW4gd2FzIG5pbCIpOworCUFOVExSQ29tbW9uVHJlZSAqbmV3VHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUcmVlOnRyZWVdOworCVNUQXNzZXJ0Tm90TmlsKG5ld1RyZWUsIEAiTmV3IHRyZWUgd2FzIG5pbCIpOworCVNUQXNzZXJ0Tm90TmlsKG5ld1RyZWUudG9rZW4sIEAiTmV3IHRyZWUgdG9rZW4gd2FzIG5pbCIpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1RyZWUudG9rZW4sIHRyZWUudG9rZW4sIEAiVG9rZW5zIGRpZCBub3QgbWF0Y2giKTsKKwlTVEFzc2VydEVxdWFscyhuZXdUcmVlLnN0YXJ0SW5kZXgsIHRyZWUuc3RhcnRJbmRleCwgQCJUb2tlbiBzdGFydCBpbmRleCBkaWQgbm90IG1hdGNoICVkOiVkIiwgbmV3VHJlZS5zdGFydEluZGV4LCB0cmVlLnN0YXJ0SW5kZXgpOworCVNUQXNzZXJ0RXF1YWxzKG5ld1RyZWUuc3RvcEluZGV4LCB0cmVlLnN0b3BJbmRleCwgQCJUb2tlbiBzdG9wIGluZGV4IGRpZCBub3QgbWF0Y2ggJWQ6JWQiLCBuZXdUcmVlLnN0b3BJbmRleCwgdHJlZS5zdG9wSW5kZXgpOworCS8vW3N0cmVhbSByZWxlYXNlXTsKKwkvL1t0cmVlIHJlbGVhc2VdOworCS8vW25ld1RyZWUgcmVsZWFzZV07CisJLy9bdG9rZW4gcmVsZWFzZV07CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QwNkNvcHlUcmVlCit7CisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTpAInRoaXN8fGlzfHxhfHxkb3VibGV8fHBpcGVkfHxzZXBhcmF0ZWR8fGNzdiJdOworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46c3RyZWFtIFR5cGU6NTU1IENoYW5uZWw6QU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0IFN0YXJ0OjQgU3RvcDo1XTsKKwlBTlRMUkNvbW1vblRyZWUgKnRyZWUgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW46dG9rZW5dOworCVNUQXNzZXJ0Tm90TmlsKHRyZWUsIEAiVHJlZSB3YXMgbmlsIik7CisJQU5UTFJDb21tb25UcmVlICpuZXdUcmVlID0gKEFOVExSQ29tbW9uVHJlZSAqKVt0cmVlIGNvcHlXaXRoWm9uZTpuaWxdOworCVNUQXNzZXJ0VHJ1ZShbbmV3VHJlZSBpc0tpbmRPZkNsYXNzOltBTlRMUkNvbW1vblRyZWUgY2xhc3NdXSwgQCJDb3BpZWQgdHJlZSB3YXMgbm90IGFuIEFOVExSQ29tbW9uVHJlZSIpOworCVNUQXNzZXJ0Tm90TmlsKG5ld1RyZWUsIEAiTmV3IHRyZWUgd2FzIG5pbCIpOworCS8vIFNUQXNzZXJ0RXF1YWxzKG5ld1RyZWUudG9rZW4sIHRyZWUudG9rZW4sIEAiVG9rZW5zIGRpZCBub3QgbWF0Y2giKTsKKwlTVEFzc2VydEVxdWFscyhuZXdUcmVlLnN0b3BJbmRleCwgdHJlZS5zdG9wSW5kZXgsIEAiVG9rZW4gc3RvcCBpbmRleCBkaWQgbm90IG1hdGNoIik7CisJU1RBc3NlcnRFcXVhbHMobmV3VHJlZS5zdGFydEluZGV4LCB0cmVlLnN0YXJ0SW5kZXgsIEAiVG9rZW4gc3RhcnQgaW5kZXggZGlkIG5vdCBtYXRjaCIpOworCS8vW3N0cmVhbSByZWxlYXNlXTsKKwkvL1t0cmVlIHJlbGVhc2VdOworCS8vW25ld1RyZWUgcmVsZWFzZV07CisJLy8gW3Rva2VuIHJlbGVhc2VdOworICAgIHJldHVybjsKK30KKworLSh2b2lkKSB0ZXN0MDdEZXNjcmlwdGlvbgoreworICAgIE5TU3RyaW5nICphU3RyaW5nOworCUFOVExSQ29tbW9uVHJlZSAqZXJyb3JUcmVlID0gW0FOVExSQ29tbW9uVHJlZSBpbnZhbGlkTm9kZV07CisJU1RBc3NlcnROb3ROaWwoZXJyb3JUcmVlLCBAIkVycm9yIHRyZWUgbm9kZSBpcyBuaWwiKTsKKyAgICBpZiAoZXJyb3JUcmVlICE9IG5pbCkgeworICAgICAgICBhU3RyaW5nID0gW2Vycm9yVHJlZSBkZXNjcmlwdGlvbl07CisgICAgICAgIFNUQXNzZXJ0Tm90TmlsKCBhU3RyaW5nLCBAImVycm9yVHJlZSBkZXNjcmlwdGlvbiByZXR1cm5lZCBuaWwiKTsKKyAgICAgICAgaWYgKGFTdHJpbmcgIT0gbmlsKQorICAgICAgICAgICAgU1RBc3NlcnRUcnVlKFthU3RyaW5nIGlzRXF1YWxUb1N0cmluZzpAIjxlcnJvcm5vZGU+Il0sIEAiTm90IGEgdmFsaWQgZXJyb3Igbm9kZSBkZXNjcmlwdGlvbiAlQCIsIGFTdHJpbmcpOworICAgIH0KKwkvL1tlcnJvclRyZWUgcmVsZWFzZV07CisJCisJQU5UTFJDb21tb25UcmVlICp0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQXTsKKwlTVEFzc2VydE5vdE5pbCh0cmVlLCBAIlRyZWUgaXMgbmlsIik7CisgICAgaWYgKHRyZWUgIT0gbmlsKQorICAgICAgICBTVEFzc2VydE5pbChbdHJlZSBkZXNjcmlwdGlvbl0sIEAiVHJlZSBkZXNjcmlwdGlvbiB3YXMgbm90IG5pbCwgd2FzOiAlQCIsIFt0cmVlIGRlc2NyaXB0aW9uXSk7CisJLy9bdHJlZSByZWxlYXNlXTsKKwkKKwl0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlTVEFzc2VydE5vdE5pbCh0cmVlLCBAIlRyZWUgaXMgbmlsIik7CisgICAgaWYgKHRyZWUgIT0gbmlsKSB7CisgICAgICAgIGFTdHJpbmcgPSBbdHJlZSBkZXNjcmlwdGlvbl07CisgICAgICAgIFNUQXNzZXJ0Tm90TmlsKGFTdHJpbmcsIEAidHJlZSBkZXNjcmlwdGlvbiByZXR1cm5lZCBuaWwiKTsKKyAgICAgICAgaWYgKGFTdHJpbmcgIT0gbmlsKQorICAgICAgICAgICAgU1RBc3NlcnRUcnVlKFthU3RyaW5nIGlzRXF1YWxUb1N0cmluZzpAIm5pbCJdLCBAIlRyZWUgZGVzY3JpcHRpb24gd2FzIG5vdCBlbXB0eSIsIFt0cmVlIGRlc2NyaXB0aW9uXSk7CisgICAgfQorCS8vW3RyZWUgcmVsZWFzZV07CisJCisJQU5UTFJTdHJpbmdTdHJlYW0gKnN0cmVhbSA9IFtBTlRMUlN0cmluZ1N0cmVhbSBuZXdBTlRMUlN0cmluZ1N0cmVhbTpAInRoaXN8fGlzfHxhfHxkb3VibGV8fHBpcGVkfHxzZXBhcmF0ZWR8fGNzdiJdOworCUFOVExSQ29tbW9uVG9rZW4gKnRva2VuID0gW0FOVExSQ29tbW9uVG9rZW4gbmV3VG9rZW46c3RyZWFtIFR5cGU6NTU1IENoYW5uZWw6QU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0IFN0YXJ0OjQgU3RvcDo1XTsKKwl0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuOnRva2VuXTsKKwlTVEFzc2VydE5vdE5pbCh0cmVlLCBAIlRyZWUgbm9kZSBpcyBuaWwiKTsKKyAgICBhU3RyaW5nID0gW3RyZWUgZGVzY3JpcHRpb25dOworICAgIFNUQXNzZXJ0Tm90TmlsKGFTdHJpbmcsIEAidHJlZSBkZXNjcmlwdGlvbiByZXR1cm5lZCBuaWwiKTsKKyAgICBpZiAoYVN0cmluZyAhPSBuaWwpCisgICAgICAgIFNUQXNzZXJ0VHJ1ZShbYVN0cmluZyBpc0VxdWFsVG9TdHJpbmc6QCJ8fCJdLCBAImRlc2NyaXB0aW9uIHdhcyBub3QgfHwgd2FzIGluc3RlYWQgJUAiLCBbdHJlZSBkZXNjcmlwdGlvbl0pOworCS8vW3RyZWUgcmVsZWFzZV07CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QwOFRleHQKK3sKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjp0b2tlbl07CisJU1RBc3NlcnROb3ROaWwodHJlZSwgQCJUcmVlIHdhcyBuaWwiKTsKKwlTVEFzc2VydFRydWUoW3RyZWUudG9rZW4udGV4dCBpc0VxdWFsVG9TdHJpbmc6QCJ8fCJdLCBAIlRyZWUgdGV4dCB3YXMgbm90IHZhbGlkLCBzaG91bGQgaGF2ZSBiZWVuIHx8IHdhcyAlQCIsIHRyZWUudG9rZW4udGV4dCk7CisJLy9bdHJlZSByZWxlYXNlXTsKKwkKKwkvLyB0ZXN0IG5pbCAoZm9yIGxpbmUgY292ZXJhZ2UpCisJdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJU1RBc3NlcnROb3ROaWwodHJlZSwgQCJUcmVlIHdhcyBuaWwiKTsKKwlTVEFzc2VydE5pbCh0cmVlLnRva2VuLnRleHQsIEAiVHJlZSB0ZXh0IHdhcyBub3QgbmlsOiAlQCIsIHRyZWUudG9rZW4udGV4dCk7CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QwOUFkZENoaWxkCit7CisJLy8gQ3JlYXRlIGEgbmV3IHRyZWUKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlblR5cGU6NTU1XTsKKyAgICBwYXJlbnQudG9rZW4ubGluZSA9IDE7CisJcGFyZW50LnRva2VuLmNoYXJQb3NpdGlvbkluTGluZSA9IDE7CisJCisJLy8gQ2hpbGQgdHJlZQorCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJ0aGlzfHxpc3x8YXx8ZG91YmxlfHxwaXBlZHx8c2VwYXJhdGVkfHxjc3YiXTsKKwlBTlRMUkNvbW1vblRva2VuICp0b2tlbiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOnN0cmVhbSBUeXBlOjU1NSBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo0IFN0b3A6NV07CisJdG9rZW4ubGluZSA9IDE7CisJdG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lID0gNDsKKwlBTlRMUkNvbW1vblRyZWUgKnRyZWUgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW46dG9rZW5dOworCQorCS8vIEFkZCBhIGNoaWxkIHRvIHRoZSBwYXJlbnQgdHJlZQorCVtwYXJlbnQgYWRkQ2hpbGQ6dHJlZV07CisKKworCVNUQXNzZXJ0Tm90TmlsKHBhcmVudCwgQCJwYXJlbnQgd2FzIG5pbCIpOworICAgIGlmIChwYXJlbnQgIT0gbmlsKQorICAgICAgICBTVEFzc2VydE5vdE5pbChwYXJlbnQudG9rZW4sIEAicGFyZW50IHdhcyBuaWwiKTsKKwlTVEFzc2VydEVxdWFscygoTlNJbnRlZ2VyKXBhcmVudC50b2tlbi5saW5lLCAoTlNJbnRlZ2VyKTEsIEAiVHJlZSBzaG91bGQgYmUgYXQgbGluZSAxIGJ1dCBpcyAlZCIsIHBhcmVudC50b2tlbi5saW5lKTsKKwlTVEFzc2VydEVxdWFscygoTlNJbnRlZ2VyKXBhcmVudC50b2tlbi5jaGFyUG9zaXRpb25JbkxpbmUsIChOU0ludGVnZXIpMSwgQCJDaGFyIHBvc2l0aW9uIHNob3VsZCBiZSAxIGJ1dCBpcyAlZCIsIHBhcmVudC50b2tlbi5jaGFyUG9zaXRpb25JbkxpbmUpOworCQorCVNUQXNzZXJ0RXF1YWxzKChOU0ludGVnZXIpW3BhcmVudCBnZXRDaGlsZENvdW50XSwgKE5TSW50ZWdlcikxLCBAIlRoZXJlIHNob3VsZCBiZSAxIGNoaWxkIGJ1dCB0aGVyZSB3ZXJlICVkIiwgW3BhcmVudCBnZXRDaGlsZENvdW50XSk7CisJU1RBc3NlcnRFcXVhbHMoKE5TSW50ZWdlcilbW3BhcmVudCBnZXRDaGlsZDowXSBnZXRDaGlsZEluZGV4XSwgKE5TSW50ZWdlcikwLCBAIkNoaWxkIGluZGV4IHNob3VsZCBiZSAwIHdhcyA6ICVkIiwgW1twYXJlbnQgZ2V0Q2hpbGQ6MF0gZ2V0Q2hpbGRJbmRleF0pOworCVNUQXNzZXJ0RXF1YWxzKFtbcGFyZW50IGdldENoaWxkOjBdIGdldFBhcmVudF0sIHBhcmVudCwgQCJQYXJlbnQgbm90IHNldCBmb3IgY2hpbGQiKTsKKwkKKwkvL1twYXJlbnQgcmVsZWFzZV07CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QxMEFkZENoaWxkcmVuCit7CisJLy8gQ3JlYXRlIGEgbmV3IHRyZWUKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJCisJLy8gQ2hpbGQgdHJlZQorCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJ0aGlzfHxpc3x8YXx8ZG91YmxlfHxwaXBlZHx8c2VwYXJhdGVkfHxjc3YiXTsKKwlBTlRMUkNvbW1vblRva2VuICp0b2tlbiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOnN0cmVhbSBUeXBlOjU1NSBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo0IFN0b3A6NV07CisJdG9rZW4ubGluZSA9IDE7CisJdG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lID0gNDsKKwlBTlRMUkNvbW1vblRyZWUgKnRyZWUgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW46dG9rZW5dOworCQorCS8vIEFkZCBhIGNoaWxkIHRvIHRoZSBwYXJlbnQgdHJlZQorCVtwYXJlbnQgYWRkQ2hpbGQ6IHRyZWVdOworCQorCUFOVExSQ29tbW9uVHJlZSAqbmV3UGFyZW50ID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlbbmV3UGFyZW50IGFkZENoaWxkcmVuOnBhcmVudC5jaGlsZHJlbl07CisJCisJU1RBc3NlcnRFcXVhbHMoW25ld1BhcmVudCBnZXRDaGlsZDowXSwgW3BhcmVudCBnZXRDaGlsZDowXSwgQCJDaGlsZHJlbiBkaWQgbm90IG1hdGNoIik7CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QxMUFkZFNlbGZBc0NoaWxkCit7CisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCUB0cnkgCisJeworCQlbcGFyZW50IGFkZENoaWxkOnBhcmVudF07CisJfQorCUBjYXRjaCAoTlNFeGNlcHRpb24gKmUpIAorCXsKKwkJU1RBc3NlcnRUcnVlKFtbZSBuYW1lXSBpc0VxdWFsVG9TdHJpbmc6QCJBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiJdLCBAIkdvdCB3cm9uZyBraW5kIG9mIGV4Y2VwdGlvbiEgJUAiLCBbZSBuYW1lXSk7CisJCS8vW3BhcmVudCByZWxlYXNlXTsKKwkJcmV0dXJuOworCX0KKwlTVEZhaWwoQCJEaWQgbm90IGdldCBhbiBleGNlcHRpb24gd2hlbiBhZGRpbmcgYW4gZW1wdHkgY2hpbGQhIik7CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QxMkFkZEVtcHR5Q2hpbGRXaXRoTm9DaGlsZHJlbgoreworCUFOVExSQ29tbW9uVHJlZSAqZW1wdHlDaGlsZCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCVtwYXJlbnQgYWRkQ2hpbGQ6ZW1wdHlDaGlsZF07CisJU1RBc3NlcnRFcXVhbHMoKE5TSW50ZWdlcilbcGFyZW50IGdldENoaWxkQ291bnRdLCAoTlNJbnRlZ2VyKTAsIEAiVGhlcmUgd2VyZSBzdXBwb3NlZCB0byBiZSBubyBjaGlsZHJlbiEiKTsKKwkvL1twYXJlbnQgcmVsZWFzZV07CisJLy9bZW1wdHlDaGlsZCByZWxlYXNlXTsKKyAgICByZXR1cm47Cit9CisKKy0odm9pZCkgdGVzdDEzQWRkRW1wdHlDaGlsZFdpdGhDaGlsZHJlbgoreworCS8vIENyZWF0ZSBhIG5ldyB0cmVlCisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCQorCS8vIENoaWxkIHRyZWUKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCXRva2VuLmxpbmUgPSAxOworCXRva2VuLmNoYXJQb3NpdGlvbkluTGluZSA9IDQ7CisJQU5UTFJDb21tb25UcmVlICp0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuOnRva2VuXTsKKwkKKwkvLyBBZGQgYSBjaGlsZCB0byB0aGUgcGFyZW50IHRyZWUKKwlbcGFyZW50IGFkZENoaWxkOiB0cmVlXTsKKwkKKwlBTlRMUkNvbW1vblRyZWUgKm5ld1BhcmVudCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJW25ld1BhcmVudCBhZGRDaGlsZDpwYXJlbnRdOworCQorCVNUQXNzZXJ0RXF1YWxzKChOU0ludGVnZXIpW25ld1BhcmVudCBnZXRDaGlsZENvdW50XSwgKE5TSW50ZWdlcikxLCBAIlBhcmVudCBzaG91bGQgb25seSBoYXZlIDEgY2hpbGQ6ICVkIiwgW25ld1BhcmVudCBnZXRDaGlsZENvdW50XSk7CisJU1RBc3NlcnRFcXVhbHMoW25ld1BhcmVudCBnZXRDaGlsZDowXSwgdHJlZSwgQCJDaGlsZCB3YXMgbm90IHRoZSBjb3JyZWN0IG9iamVjdC4iKTsKKwkvL1twYXJlbnQgcmVsZWFzZV07CisJLy9bbmV3UGFyZW50IHJlbGVhc2VdOworCS8vW3RyZWUgcmVsZWFzZV07CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QxNENoaWxkQXRJbmRleAoreworCS8vIENyZWF0ZSBhIG5ldyB0cmVlCisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCQorCS8vIENoaWxkIHRyZWUKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjp0b2tlbl07CisJCisJLy8gQWRkIGEgY2hpbGQgdG8gdGhlIHBhcmVudCB0cmVlCisJW3BhcmVudCBhZGRDaGlsZDogdHJlZV07CisJCisJU1RBc3NlcnRFcXVhbHMoKE5TSW50ZWdlcilbcGFyZW50IGdldENoaWxkQ291bnRdLCAoTlNJbnRlZ2VyKTEsIEAiVGhlcmUgd2VyZSBlaXRoZXIgbm8gY2hpbGRyZW4gb3IgbW9yZSB0aGFuIDE6ICVkIiwgW3BhcmVudCBnZXRDaGlsZENvdW50XSk7CisJCisJQU5UTFJDb21tb25UcmVlICpjaGlsZCA9IFtwYXJlbnQgZ2V0Q2hpbGQ6MF07CisJU1RBc3NlcnROb3ROaWwoY2hpbGQsIEAiQ2hpbGQgYXQgaW5kZXggMCBzaG91bGQgbm90IGJlIG5pbCIpOworCVNUQXNzZXJ0RXF1YWxzKGNoaWxkLCB0cmVlLCBAIkNoaWxkIGFuZCBPcmlnaW5hbCB0cmVlIHdlcmUgbm90IHRoZSBzYW1lIik7CisJLy9bcGFyZW50IHJlbGVhc2VdOworICAgIHJldHVybjsKK30KKworLSh2b2lkKSB0ZXN0MTVTZXRDaGlsZEF0SW5kZXgKK3sKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJCisJLy8gQ2hpbGQgdHJlZQorCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJ0aGlzfHxpc3x8YXx8ZG91YmxlfHxwaXBlZHx8c2VwYXJhdGVkfHxjc3YiXTsKKwlBTlRMUkNvbW1vblRva2VuICp0b2tlbiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOnN0cmVhbSBUeXBlOjU1NSBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo0IFN0b3A6NV07CisJQU5UTFJDb21tb25UcmVlICp0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuOnRva2VuXTsKKwkKKwkKKwl0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQXTsKKwl0cmVlLnRva2VuLnRleHQgPSBAIjxVUD4iOworCVtwYXJlbnQgYWRkQ2hpbGQ6dHJlZV07CisJCisJU1RBc3NlcnRUcnVlKFtwYXJlbnQgZ2V0Q2hpbGQ6MF0gPT0gdHJlZSwgQCJUcmVlcyBkb24ndCBtYXRjaCIpOworCVtwYXJlbnQgc2V0Q2hpbGQ6MCBXaXRoOnRyZWVdOworCQorCUFOVExSQ29tbW9uVHJlZSAqY2hpbGQgPSBbcGFyZW50IGdldENoaWxkOjBdOworCVNUQXNzZXJ0VHJ1ZShbcGFyZW50IGdldENoaWxkQ291bnRdID09IDEsIEAiVGhlcmUgd2VyZSBlaXRoZXIgbm8gY2hpbGRyZW4gb3IgbW9yZSB0aGFuIDE6ICVkIiwgW3BhcmVudCBnZXRDaGlsZENvdW50XSk7CisJU1RBc3NlcnROb3ROaWwoY2hpbGQsIEAiQ2hpbGQgYXQgaW5kZXggMCBzaG91bGQgbm90IGJlIG5pbCIpOworCVNUQXNzZXJ0RXF1YWxzKGNoaWxkLCB0cmVlLCBAIkNoaWxkIGFuZCBPcmlnaW5hbCB0cmVlIHdlcmUgbm90IHRoZSBzYW1lIik7CisJLy9bcGFyZW50IHJlbGVhc2VdOworICAgIHJldHVybjsKK30KKworLSh2b2lkKSB0ZXN0MTZHZXRBbmNlc3RvcgoreworCUFOVExSQ29tbW9uVHJlZSAqcGFyZW50ID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQXTsKKwlwYXJlbnQudG9rZW4udGV4dCA9IEAiPFVQPiI7CisJCisJQU5UTFJDb21tb25UcmVlICpkb3duID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCWRvd24udG9rZW4udGV4dCA9IEAiPERPV04+IjsKKwkKKwlbcGFyZW50IGFkZENoaWxkOmRvd25dOworCQorCS8vIENoaWxkIHRyZWUKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjp0b2tlbl07CisJCisJW2Rvd24gYWRkQ2hpbGQ6dHJlZV07CisJU1RBc3NlcnRUcnVlKFt0cmVlIGhhc0FuY2VzdG9yOkFOVExSVG9rZW5UeXBlVVBdLCBAIlNob3VsZCBoYXZlIGFuIGFuY2VzdG9yIG9mIHR5cGUgQU5UTFJUb2tlblR5cGVVUCIpOworCQorCUFOVExSQ29tbW9uVHJlZSAqYW5jZXN0b3IgPSBbdHJlZSBnZXRBbmNlc3RvcjpBTlRMUlRva2VuVHlwZVVQXTsKKwlTVEFzc2VydE5vdE5pbChhbmNlc3RvciwgQCJBbmNlc3RvciBzaG91bGQgbm90IGJlIG5pbCIpOworCVNUQXNzZXJ0RXF1YWxzKGFuY2VzdG9yLCBwYXJlbnQsIEAiQWNlbnN0b3JzIGRvIG5vdCBtYXRjaCIpOworCS8vW3BhcmVudCByZWxlYXNlXTsKKyAgICByZXR1cm47Cit9CisKKy0odm9pZCkgdGVzdDE3Rmlyc3RDaGlsZFdpdGhUeXBlCit7CisJLy8gQ3JlYXRlIGEgbmV3IHRyZWUKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJCisJQU5UTFJDb21tb25UcmVlICp1cCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUF07CisJQU5UTFJDb21tb25UcmVlICpkb3duID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCQorCVtwYXJlbnQgYWRkQ2hpbGQ6dXBdOworCVtwYXJlbnQgYWRkQ2hpbGQ6ZG93bl07CisJCisJQU5UTFJDb21tb25UcmVlICpmb3VuZCA9IChBTlRMUkNvbW1vblRyZWUgKilbcGFyZW50IGdldEZpcnN0Q2hpbGRXaXRoVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCVNUQXNzZXJ0Tm90TmlsKGZvdW5kLCBAIkNoaWxkIHdpdGggdHlwZSBET1dOIHNob3VsZCBub3QgYmUgbmlsIik7CisgICAgaWYgKGZvdW5kICE9IG5pbCkgeworICAgICAgICBTVEFzc2VydE5vdE5pbChmb3VuZC50b2tlbiwgQCJDaGlsZCB0b2tlbiB3aXRoIHR5cGUgRE9XTiBzaG91bGQgbm90IGJlIG5pbCIpOworICAgICAgICBpZiAoZm91bmQudG9rZW4gIT0gbmlsKQorICAgICAgICAgICAgU1RBc3NlcnRFcXVhbHMoKE5TSW50ZWdlcilmb3VuZC50b2tlbi50eXBlLCAoTlNJbnRlZ2VyKUFOVExSVG9rZW5UeXBlRE9XTiwgQCJUb2tlbiB0eXBlIHdhcyBub3QgY29ycmVjdCwgc2hvdWxkIGJlIGRvd24hIik7CisgICAgfQorCWZvdW5kID0gKEFOVExSQ29tbW9uVHJlZSAqKVtwYXJlbnQgZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlOkFOVExSVG9rZW5UeXBlVVBdOworCVNUQXNzZXJ0Tm90TmlsKGZvdW5kLCBAIkNoaWxkIHdpdGggdHlwZSBVUCBzaG91bGQgbm90IGJlIG5pbCIpOworICAgIGlmIChmb3VuZCAhPSBuaWwpIHsKKyAgICAgICAgU1RBc3NlcnROb3ROaWwoZm91bmQudG9rZW4sIEAiQ2hpbGQgdG9rZW4gd2l0aCB0eXBlIFVQIHNob3VsZCBub3QgYmUgbmlsIik7CisgICAgICAgIGlmIChmb3VuZC50b2tlbiAhPSBuaWwpCisgICAgICAgICAgICBTVEFzc2VydEVxdWFscygoTlNJbnRlZ2VyKWZvdW5kLnRva2VuLnR5cGUsIChOU0ludGVnZXIpQU5UTFJUb2tlblR5cGVVUCwgQCJUb2tlbiB0eXBlIHdhcyBub3QgY29ycmVjdCwgc2hvdWxkIGJlIHVwISIpOworICAgIH0KKwkvL1twYXJlbnQgcmVsZWFzZV07CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QxOFNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzRm9yUGFyZW50VHJlZQoreworCS8vIENoaWxkIHRyZWUKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjp0b2tlbl07CisJCisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW5UeXBlOjU1NV07CisJU1RBc3NlcnROb3ROaWwodHJlZSwgQCJ0cmVlIHNob3VsZCBub3QgYmUgbmlsIik7CisJQHRyeSAKKwl7CisJCVt0cmVlIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzXTsKKwl9CisJQGNhdGNoIChOU0V4Y2VwdGlvbiAqIGUpIAorCXsKKwkJU1RGYWlsKEAiRXhjZXB0aW9uIHdhcyB0aHJvd24gYW5kIHRoaXMgaXMgbm90IHdoYXQncyByaWdodC4uLiIpOworCX0KKwkKKwlCT09MIHBhc3NlZCA9IE5POworCUB0cnkgCisJeworCQlbdHJlZSBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczpwYXJlbnQgQXQ6MF07CisJfQorCUBjYXRjaCAoTlNFeGNlcHRpb24gKiBlKSAKKwl7CisJCVNUQXNzZXJ0VHJ1ZShbW2UgbmFtZV0gaXNFcXVhbFRvU3RyaW5nOkAiQU5UTFJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iXSwgQCJFeGNlcHRpb24gd2FzIG5vdCBhbiBBTlRMUklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBidXQgd2FzICVAIiwgW2UgbmFtZV0pOworCQlwYXNzZWQgPSBZRVM7CisJfQorCWlmICghcGFzc2VkKQorCXsKKwkJU1RGYWlsKEAiQW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisJfQorCQorCVNUQXNzZXJ0Tm90TmlsKHBhcmVudCwgQCJwYXJlbnQgc2hvdWxkIG5vdCBiZSBuaWwiKTsKKwlbcGFyZW50IGFkZENoaWxkOnRyZWVdOworCUB0cnkgCisJeworCQlbdHJlZSBzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlczpwYXJlbnQgQXQ6MF07CisJfQorCUBjYXRjaCAoTlNFeGNlcHRpb24gKiBlKSAKKwl7CisJCVNURmFpbChAIk5vIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biEiKTsKKwl9CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QxOURlbGV0ZUNoaWxkCit7CisJLy8gQ2hpbGQgdHJlZQorCUFOVExSU3RyaW5nU3RyZWFtICpzdHJlYW0gPSBbQU5UTFJTdHJpbmdTdHJlYW0gbmV3QU5UTFJTdHJpbmdTdHJlYW06QCJ0aGlzfHxpc3x8YXx8ZG91YmxlfHxwaXBlZHx8c2VwYXJhdGVkfHxjc3YiXTsKKwlBTlRMUkNvbW1vblRva2VuICp0b2tlbiA9IFtBTlRMUkNvbW1vblRva2VuIG5ld1Rva2VuOnN0cmVhbSBUeXBlOjU1NSBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo0IFN0b3A6NV07CisJQU5UTFJDb21tb25UcmVlICp0cmVlID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuOnRva2VuXTsKKwkKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudCA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJW3BhcmVudCBhZGRDaGlsZDp0cmVlXTsKKwkKKwlBTlRMUkNvbW1vblRyZWUgKmRlbGV0ZWRDaGlsZCA9IFtwYXJlbnQgZGVsZXRlQ2hpbGQ6MF07CisJU1RBc3NlcnRFcXVhbHMoZGVsZXRlZENoaWxkLCB0cmVlLCBAIkNoaWxkcmVuIGRvIG5vdCBtYXRjaCEiKTsKKwlTVEFzc2VydEVxdWFscygoTlNJbnRlZ2VyKVtwYXJlbnQgZ2V0Q2hpbGRDb3VudF0sIChOU0ludGVnZXIpMCwgQCJDaGlsZCBjb3VudCBzaG91bGQgYmUgemVybyEiKTsKKyAgICByZXR1cm47Cit9CisKKy0odm9pZCkgdGVzdDIwVHJlZURlc2NyaXB0aW9ucworeworCS8vIENoaWxkIHRyZWUKKwlBTlRMUlN0cmluZ1N0cmVhbSAqc3RyZWFtID0gW0FOVExSU3RyaW5nU3RyZWFtIG5ld0FOVExSU3RyaW5nU3RyZWFtOkAidGhpc3x8aXN8fGF8fGRvdWJsZXx8cGlwZWR8fHNlcGFyYXRlZHx8Y3N2Il07CisJQU5UTFJDb21tb25Ub2tlbiAqdG9rZW4gPSBbQU5UTFJDb21tb25Ub2tlbiBuZXdUb2tlbjpzdHJlYW0gVHlwZTo1NTUgQ2hhbm5lbDpBTlRMUlRva2VuQ2hhbm5lbERlZmF1bHQgU3RhcnQ6NCBTdG9wOjVdOworCUFOVExSQ29tbW9uVHJlZSAqdHJlZSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlbjp0b2tlbl07CisJCisJLy8gRGVzY3JpcHRpb24gZm9yIHRyZWUKKwlOU1N0cmluZyAqdHJlZURlc2MgPSBbdHJlZSB0cmVlRGVzY3JpcHRpb25dOworICAgIFNUQXNzZXJ0Tm90TmlsKHRyZWVEZXNjLCBAIlRyZWUgZGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBuaWwiKTsKKyAgICBTVEFzc2VydFRydWUoW3RyZWVEZXNjIGlzRXF1YWxUb1N0cmluZzpAInx8Il0sIEAiVHJlZSBkZXNjcmlwdGlvbiB3YXMgbm90IHx8IGJ1dCByYXRoZXIgJUAiLCB0cmVlRGVzYyk7CisJCisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCVNUQXNzZXJ0VHJ1ZShbW3BhcmVudCB0cmVlRGVzY3JpcHRpb25dIGlzRXF1YWxUb1N0cmluZzpAIm5pbCJdLCBAIlRyZWUgZGVzY3JpcHRpb24gd2FzIG5vdCBuaWwgd2FzICVAIiwgW3BhcmVudCB0cmVlRGVzY3JpcHRpb25dKTsKKwlbcGFyZW50IGFkZENoaWxkOnRyZWVdOworCXRyZWVEZXNjID0gW3BhcmVudCB0cmVlRGVzY3JpcHRpb25dOworCVNUQXNzZXJ0VHJ1ZShbdHJlZURlc2MgaXNFcXVhbFRvU3RyaW5nOkAifHwiXSwgQCJUcmVlIGRlc2NyaXB0aW9uIHdhcyBub3QgfHwgYnV0IHdhczogJUAiLCB0cmVlRGVzYyk7CisJCisJLy8gVGVzdCBub24gZW1wdHkgcGFyZW50CisJQU5UTFJDb21tb25UcmVlICpkb3duID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCWRvd24udG9rZW4udGV4dCA9IEAiPERPV04+IjsKKwkKKwlbdHJlZSBhZGRDaGlsZDpkb3duXTsKKwl0cmVlRGVzYyA9IFtwYXJlbnQgdHJlZURlc2NyaXB0aW9uXTsKKwlTVEFzc2VydFRydWUoW3RyZWVEZXNjIGlzRXF1YWxUb1N0cmluZzpAIih8fCA8RE9XTj4pIl0sIEAiVHJlZSBkZXNjcmlwdGlvbiB3YXMgd3JvbmcgZXhwZWN0ZWQgKHx8IDxET1dOPikgYnV0IGdvdDogJUAiLCB0cmVlRGVzYyk7CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QyMVJlcGxhY2VDaGlsZHJlbkF0SW5kZXhXaXRoTm9DaGlsZHJlbgoreworCUFOVExSQ29tbW9uVHJlZSAqcGFyZW50ID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudDIgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCUFOVExSQ29tbW9uVHJlZSAqY2hpbGQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTl07CisJY2hpbGQudG9rZW4udGV4dCA9IEAiPERPV04+IjsKKwlbcGFyZW50MiBhZGRDaGlsZDpjaGlsZF07CisJQHRyeSAKKwl7CisJCVtwYXJlbnQgcmVwbGFjZUNoaWxkcmVuRnJvbToxIFRvOjIgV2l0aDpwYXJlbnQyXTsKKwl9CisJQGNhdGNoIChOU0V4Y2VwdGlvbiAqZXgpCisJeworCQlTVEFzc2VydFRydWUoW1tleCBuYW1lXSBpc0VxdWFsVG9TdHJpbmc6QCJBTlRMUklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiJdLCBAIkV4cGVjdGVkIGFuIGlsbGVnYWwgYXJndW1lbnQgZXhjZXB0aW9uLi4uIEdvdCBpbnN0ZWFkOiAlQCIsIFtleCBuYW1lXSk7CisJCXJldHVybjsKKwl9CisJU1RGYWlsKEAiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIHdoZW4gSSB0cmllZCB0byByZXBsYWNlIGEgY2hpbGQgb24gYSBwYXJlbnQgd2l0aCBubyBjaGlsZHJlbiIpOworICAgIHJldHVybjsKK30KKworLSh2b2lkKSB0ZXN0MjJSZXBsYWNlQ2hpbGRyZW5BdEluZGV4Cit7CisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQxID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlBTlRMUkNvbW1vblRyZWUgKmNoaWxkMSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUF07CisJW3BhcmVudDEgYWRkQ2hpbGQ6Y2hpbGQxXTsKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudDIgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCUFOVExSQ29tbW9uVHJlZSAqY2hpbGQyID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCWNoaWxkMi50b2tlbi50ZXh0ID0gQCI8RE9XTj4iOworCVtwYXJlbnQyIGFkZENoaWxkOmNoaWxkMl07CisJCisJW3BhcmVudDIgcmVwbGFjZUNoaWxkcmVuRnJvbTowIFRvOjAgV2l0aDpwYXJlbnQxXTsKKwkKKwlTVEFzc2VydEVxdWFscyhbcGFyZW50MiBnZXRDaGlsZDowXSwgY2hpbGQxLCBAIkNoaWxkIGZvciBwYXJlbnQgMiBzaG91bGQgaGF2ZSBiZWVuIGZyb20gcGFyZW50IDEiKTsKKyAgICByZXR1cm47Cit9CisKKy0odm9pZCkgdGVzdDIzUmVwbGFjZUNoaWxkcmVuQXRJbmRleFdpdGhDaGlsZAoreworCUFOVExSQ29tbW9uVHJlZSAqcmVwbGFjZW1lbnQgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlVVBdOworCXJlcGxhY2VtZW50LnRva2VuLnRleHQgPSBAIjxVUD4iOworCUFOVExSQ29tbW9uVHJlZSAqcGFyZW50ID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlBTlRMUkNvbW1vblRyZWUgKmNoaWxkID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCWNoaWxkLnRva2VuLnRleHQgPSBAIjxET1dOPiI7CisJW3BhcmVudCBhZGRDaGlsZDpjaGlsZF07CisJCisJW3BhcmVudCByZXBsYWNlQ2hpbGRyZW5Gcm9tOjAgVG86MCBXaXRoOnJlcGxhY2VtZW50XTsKKwkKKwlTVEFzc2VydFRydWUoW3BhcmVudCBnZXRDaGlsZDowXSA9PSByZXBsYWNlbWVudCwgQCJDaGlsZHJlbiBkbyBub3QgbWF0Y2giKTsKKyAgICByZXR1cm47Cit9CisKKy0odm9pZCkgdGVzdDI0UmVwbGFjZWNoaWxkcmVuQXRJbmRleFdpdGhMZXNzQ2hpbGRyZW4KK3sKKwlBTlRMUkNvbW1vblRyZWUgKnBhcmVudDEgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVdOworCUFOVExSQ29tbW9uVHJlZSAqY2hpbGQxID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQXTsKKwlbcGFyZW50MSBhZGRDaGlsZDpjaGlsZDFdOworCQorCUFOVExSQ29tbW9uVHJlZSAqcGFyZW50MiA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZV07CisJCisJQU5UTFJDb21tb25UcmVlICpjaGlsZDIgPSBbQU5UTFJDb21tb25UcmVlIG5ld1RyZWVXaXRoVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRU9GXTsKKwlbcGFyZW50MiBhZGRDaGlsZDpjaGlsZDJdOworCQorCUFOVExSQ29tbW9uVHJlZSAqY2hpbGQzID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlV2l0aFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZURPV05dOworCWNoaWxkMi50b2tlbi50ZXh0ID0gQCI8RE9XTj4iOworCVtwYXJlbnQyIGFkZENoaWxkOmNoaWxkM107CisJCisJW3BhcmVudDIgcmVwbGFjZUNoaWxkcmVuRnJvbTowIFRvOjEgV2l0aDpwYXJlbnQxXTsKKwlTVEFzc2VydEVxdWFscygoTlNJbnRlZ2VyKVtwYXJlbnQyIGdldENoaWxkQ291bnRdLCAoTlNJbnRlZ2VyKTEsIEAiU2hvdWxkIGhhdmUgb25lIGNoaWxkIGJ1dCBoYXMgJWQiLCBbcGFyZW50MiBnZXRDaGlsZENvdW50XSk7CisJU1RBc3NlcnRFcXVhbHMoW3BhcmVudDIgZ2V0Q2hpbGQ6MF0sIGNoaWxkMSwgQCJDaGlsZCBmb3IgcGFyZW50IDIgc2hvdWxkIGhhdmUgYmVlbiBmcm9tIHBhcmVudCAxIik7CisgICAgcmV0dXJuOworfQorCistKHZvaWQpIHRlc3QyNVJlcGxhY2VjaGlsZHJlbkF0SW5kZXhXaXRoTW9yZUNoaWxkcmVuCit7CisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQxID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwlBTlRMUkNvbW1vblRyZWUgKmNoaWxkMSA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVVUF07CisJW3BhcmVudDEgYWRkQ2hpbGQ6Y2hpbGQxXTsKKwlBTlRMUkNvbW1vblRyZWUgKmNoaWxkMiA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVFT0ZdOworCVtwYXJlbnQxIGFkZENoaWxkOmNoaWxkMl07CisJCisJQU5UTFJDb21tb25UcmVlICpwYXJlbnQyID0gW0FOVExSQ29tbW9uVHJlZSBuZXdUcmVlXTsKKwkKKwlBTlRMUkNvbW1vblRyZWUgKmNoaWxkMyA9IFtBTlRMUkNvbW1vblRyZWUgbmV3VHJlZVdpdGhUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVET1dOXTsKKwljaGlsZDIudG9rZW4udGV4dCA9IEAiPERPV04+IjsKKwlbcGFyZW50MiBhZGRDaGlsZDpjaGlsZDNdOworCQorCVtwYXJlbnQyIHJlcGxhY2VDaGlsZHJlbkZyb206MCBUbzowIFdpdGg6cGFyZW50MV07CisJU1RBc3NlcnRFcXVhbHMoKE5TSW50ZWdlcilbcGFyZW50MiBnZXRDaGlsZENvdW50XSwgKE5TSW50ZWdlcikyLCBAIlNob3VsZCBoYXZlIG9uZSBjaGlsZCBidXQgaGFzICVkIiwgW3BhcmVudDIgZ2V0Q2hpbGRDb3VudF0pOworCVNUQXNzZXJ0RXF1YWxzKFtwYXJlbnQyIGdldENoaWxkOjBdLCBjaGlsZDEsIEAiQ2hpbGQgZm9yIHBhcmVudCAyIHNob3VsZCBoYXZlIGJlZW4gZnJvbSBwYXJlbnQgMSIpOworCVNUQXNzZXJ0RXF1YWxzKFtwYXJlbnQyIGdldENoaWxkOjFdLCBjaGlsZDIsIEAiQW4gZXh0cmEgY2hpbGQgKGNoaWxkMikgc2hvdWxkIGJlIGluIHRoZSBjaGlsZHJlbiBjb2xsZWN0aW9uIik7CisgICAgcmV0dXJuOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9PYmpDL1JFQURNRSBiL2FudGxyLTMuNC9ydW50aW1lL09iakMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmJmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9PYmpDL1JFQURNRQpAQCAtMCwwICsxLDI2IEBACitBTlRMUiB2ZXJzaW9uIDMgc3VwcG9ydHMgdGFyZ2V0IGxhbmd1YWdlIGdlbmVyYXRpb24gZm9yIHRoZSBsZXhpY2FsCithbmFseXplciBhbmQgcGFyc2Vycy4gT2JqZWN0aXZlIEMgd2FzIHN1cHBvcnRlZCBwcmV2aW91c2x5IGJ1dCBoYWQgbm90CitiZWVuIGJyb3VnaHQgdXAgdG8gZGF0ZSBmb3Igc29tZSB0aW1lLiBUaGlzIHJlbGVhc2UgaXMgYnVpbHQgb24gdGhlIHdvcmsKK2J5IEtheSBSb2Vwa2UsIElhbiBNaWNoZWxsIGFuZCBBbGFuIENvbmRpdC4KKworVGhlIHByb2plY3QgaXMgY3VycmVudGx5IHdvcmtpbmcgc3VmZmljaWVudGx5IGZvciBtZSB0byB1c2UgaXQgaW4gY29tcGlsaW5nCitteSBncmFtbWFyIGFuZCB0cmVlIHdhbGtlci4gSSBhbSBzdXJlIHRoYXQgaXQgc3RpbGwgaGFzIHNvbWUgYnVncyBidXQgSSBoYXZlCitmaXhlZCBhbGwgb2YgdGhlIGJ1Z3MgdGhhdCBJIGhhdmUgZm91bmQgc28gZmFyLgorCitUaGUgcHJvamVjdCBjb25zaXN0cyBvZiBhbiBPYmplY3RpdmUtQyBydW50aW1lIGZyYW1ld29yayB0aGF0IG11c3QgYmUKK2luc3RhbGxlZCBpbiAvTGlicmFyeS9GcmFtZXdvcmtzLgorCitJdCBhbHNvIHJlcXVpcmVzIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIFN0cmluZyBUZW1wbGF0ZSBmaWxlcyB0bworc3VwcG9ydCB0aGUgdGFyZ2V0IGxhbmd1YWdlIGNvZGUgZ2VuZXJhdGlvbi4gSG9wZWZ1bGx5LCBhdCBzb21lIHBvaW50Cit0aGV5IHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIEFOVExSIHJlbGVhc2UgY29kZSwgc28gdGhhdCB0aGUKK2luZGl2aWR1YWwgdXNlciBkb2Vzbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgYnV0IGxvYWQgdGhlIGZyYW1ld29yayBpbnRvCit0aGUgcHJvcGVyIGxvY2F0aW9uLiBIb3dldmVyLCBmb3Igbm93IHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBPYmpDCitkaXJlY3RvcnkgaW4gYW50bHItMy4yL3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcworYW5kIHRoZW4gY29weSB0aGUgT2JqQyAiLnN0ZyIgZmlsZXMgdG8gCithbnRsci0zLjIvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvKi4KKworVGhlcmUgaXMgYWxzbyBhIGphdmEgZmlsZSBPYmpDVGFyZ2V0LmphdmEgdGhhdCBnb2VzIGluIDwKK2FudGxyLTMuMi90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2NvZGVnZW4vT2JqQ1RhcmdldC9KYXZhPi4KKworSWYgeW91IGFyZSB1c2luZyBBbnRscjMuMyB0aGUgY29kZSBmcm9tIGhlcmUgaXMgaW5jbHVkZWQgd2l0aCB0aGUgQW50bHIgdGFyYmFsbC4gWW91IGp1c3QgbmVlZAordG8gY29weSB0aGUgQU5UTFIuZnJhbWV3b3JrIHRvIC9MaWJyYXJ5L0ZyYW1ld29ya3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvLnA0aWdub3JlIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvLnA0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTEwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS8ucDRpZ25vcmUKQEAgLTAsMCArMSw4IEBACitCdWlsZAorQnVpbGQuYmF0CitNYWtlZmlsZQorTWFrZWZpbGUub2xkCitfYnVpbGQKK2JsaWIKK3BtX3RvX2JsaWIKK3RhZ3MKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L0J1aWxkLlBMIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvQnVpbGQuUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5ZTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L0J1aWxkLlBMCkBAIC0wLDAgKzEsMjAgQEAKK3VzZSBNb2R1bGU6OkJ1aWxkOworCitteSAkYnVpbGQgPSBNb2R1bGU6OkJ1aWxkLT5uZXcoCisgICBtb2R1bGVfbmFtZSA9PiAnQU5UTFI6OlJ1bnRpbWUnLAorICAgbGljZW5zZSAgICAgPT4gJ3BlcmwnLAorICAgcmVxdWlyZXMgICAgPT4geworICAgICAgICdDYXJwJyAgICAgICAgICAgICAgPT4gJzEuMDQnLAorICAgICAgICdNb29zZScgICAgICAgICAgICAgPT4gJzAuODInLAorICAgICAgICdSZWFkb25seScgICAgICAgICAgPT4gJzEuMDMnLAorICAgICAgICdMaXN0OjpNb3JlVXRpbHMnICAgPT4gJzAuMjInLAorICAgICAgICdXYW50JyAgICAgICAgICAgICAgPT4gJzAuMTgnLAorICAgICAgICdFcnJvcicgICAgICAgICAgICAgPT4gJzAuMTcwMTQnLAorICAgfSwKKyAgIGJ1aWxkX3JlcXVpcmVzID0+IHsKKyAgICAgICAnVGVzdDo6Q2xhc3MnICAgICAgID0+ICcwLjI4JywKKyAgICAgICAnSmF2YTo6SlZNOjpDbGFzc2ZpbGUnID0+ICcwLjIwJywKKyAgIH0sCisgICB0ZXN0X2ZpbGVzID0+ICd0LyoudCB0L2V4YW1wbGVzLyoudCcsCispOworJGJ1aWxkLT5jcmVhdGVfYnVpbGRfc2NyaXB0OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvQ2hhbmdlcyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L0NoYW5nZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L0NoYW5nZXMKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L0lOU1RBTEwgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9JTlNUQUxMCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9NQU5JRkVTVCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L01BTklGRVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZGI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9NQU5JRkVTVApAQCAtMCwwICsxLDU5IEBACitCdWlsZC5QTAorQ2hhbmdlcworSU5TVEFMTAorTUFOSUZFU1QJCQlUaGlzIGxpc3Qgb2YgZmlsZXMKK01BTklGRVNULlNLSVAKK01ha2VmaWxlLlBMCitSRUFETUUKK2RvY3MvZGVzaWduLnBvZAorZXhhbXBsZXMvUkVBRE1FCitleGFtcGxlcy9leHByL0V4cHIuZworZXhhbXBsZXMvZXhwci9leHByLnBsCitleGFtcGxlcy9pZC9JRExleGVyLmcKK2V4YW1wbGVzL2lkL2lkLnBsCitleGFtcGxlcy9tZXhwci9NRXhwci5nCitleGFtcGxlcy9tZXhwci9tZXhwci5wbAorZXhhbXBsZXMvc2ltcGxlY2FsYy9TaW1wbGVDYWxjLmcKK2V4YW1wbGVzL3NpbXBsZWNhbGMvc2ltcGxlY2FsYy5wbAorZXhhbXBsZXMvemVyby1vbmUvVC5nCitleGFtcGxlcy96ZXJvLW9uZS90LWVycm9yLnBsCitleGFtcGxlcy96ZXJvLW9uZS90LnBsCitsaWIvQU5UTFIvUnVudGltZS5wbQorbGliL0FOVExSL1J1bnRpbWUvQU5UTFJGaWxlU3RyZWFtLnBtCitsaWIvQU5UTFIvUnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5wbQorbGliL0FOVExSL1J1bnRpbWUvQmFzZVJlY29nbml6ZXIucG0KK2xpYi9BTlRMUi9SdW50aW1lL0JpdFNldC5wbQorbGliL0FOVExSL1J1bnRpbWUvQ2hhclN0cmVhbS5wbQorbGliL0FOVExSL1J1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLnBtCitsaWIvQU5UTFIvUnVudGltZS9Db21tb25Ub2tlbi5wbQorbGliL0FOVExSL1J1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0ucG0KK2xpYi9BTlRMUi9SdW50aW1lL0RGQS5wbQorbGliL0FOVExSL1J1bnRpbWUvRWFybHlFeGl0RXhjZXB0aW9uLnBtCitsaWIvQU5UTFIvUnVudGltZS9FeGNlcHRpb24ucG0KK2xpYi9BTlRMUi9SdW50aW1lL0ludFN0cmVhbS5wbQorbGliL0FOVExSL1J1bnRpbWUvTGV4ZXIucG0KK2xpYi9BTlRMUi9SdW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24ucG0KK2xpYi9BTlRMUi9SdW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5wbQorbGliL0FOVExSL1J1bnRpbWUvTWlzc2luZ1Rva2VuRXhjZXB0aW9uLnBtCitsaWIvQU5UTFIvUnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5wbQorbGliL0FOVExSL1J1bnRpbWUvUGFyc2VyLnBtCitsaWIvQU5UTFIvUnVudGltZS9SZWNvZ25pdGlvbkV4Y2VwdGlvbi5wbQorbGliL0FOVExSL1J1bnRpbWUvU3RyZWFtLnBtCitsaWIvQU5UTFIvUnVudGltZS9Ub2tlbi5wbQorbGliL0FOVExSL1J1bnRpbWUvVG9rZW5Tb3VyY2UucG0KK2xpYi9BTlRMUi9SdW50aW1lL1Rva2VuU3RyZWFtLnBtCitsaWIvQU5UTFIvUnVudGltZS9VbndhbnRlZFRva2VuRXhjZXB0aW9uLnBtCitwb3J0LnltbAordC9hdXRob3IvYXBpLnQKK3QvYXV0aG9yL3Blcmxjcml0aWMudAordC9hdXRob3IvcGVybGNyaXRpY3JjCit0L2F1dGhvci9wb2QtY292ZXJhZ2UudAordC9hdXRob3IvcG9kLnQKK3QvZXhhbXBsZXMvZXhwci50Cit0L2V4YW1wbGVzL3NpbXBsZWNhbGMudAordC9sZXhlci50Cit0L2xpYi9BTlRMUi9SdW50aW1lL1Rlc3QucG0KK3QvdmVyc2lvbi50Cit0b29scy9hbnRsci5iYXQKK3Rvb2xzL2FudGxyLnNoCit0b29scy9wb3J0LnBsCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9NQU5JRkVTVC5TS0lQIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvTUFOSUZFU1QuU0tJUApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDdhNzdlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvTUFOSUZFU1QuU0tJUApAQCAtMCwwICsxLDEwIEBACisjIHByb2plY3QgZmlsZXMKK1wua3BmJAorCiteTWFrZWZpbGUkCitecG1fdG9fYmxpYiQKK15ibGliLworCisjIHRlbXBvcmFyeSBhbmQgYmFja3VwIGZpbGVzCit+JAorXC5iYWskCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9NYWtlZmlsZS5QTCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L01ha2VmaWxlLlBMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzI2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9NYWtlZmlsZS5QTApAQCAtMCwwICsxLDI4IEBACit1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKKworc3ViIE1ZOjpwb3N0YW1ibGUgeworICAgIG15ICRwb3N0YW1ibGUgPSA8PCdNQUtFX0ZSQUcnOworLlBIT05ZOiB0YWdzCisKK3RhZ3M6CisJY3RhZ3MgLWYgdGFncyAtLXJlY3Vyc2UgLS10b3RhbHMgXAorCQktLWV4Y2x1ZGU9YmxpYiBcCisJCS0tZXhjbHVkZT0nKn4nIFwKKwkJLS1sYW5ndWFnZXM9UGVybCAtLWxhbmdtYXA9UGVybDorLnQgXAorTUFLRV9GUkFHCit9CisKK1dyaXRlTWFrZWZpbGUoCisgICAgTkFNRSAgICAgICAgICA9PiAnQU5UTFI6OlJ1bnRpbWUnLAorICAgIFZFUlNJT05fRlJPTSAgPT4gJ2xpYi9BTlRMUi9SdW50aW1lLnBtJywKKyAgICBMSUNFTlNFICAgICAgID0+ICdwZXJsJywKKyAgICBBQlNUUkFDVF9GUk9NID0+ICdsaWIvQU5UTFIvUnVudGltZS5wbScsCisgICAgQVVUSE9SICAgICAgICA9PiAnUm9uYWxkIEJsYXNjaGtlIDxyb25AcmJsYXNjaC5vcmc+JywKKyAgICBQUkVSRVFfUE0gICAgID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAnQ2FycCcgICAgICAgICAgICAgID0+ICcxLjA0JywKKyAgICAgICAgICAgICAgICAgICAgICAnTW9vc2UnICAgICAgICAgICAgID0+ICcwLjgyJywKKyAgICAgICAgICAgICAgICAgICAgICAnUmVhZG9ubHknICAgICAgICAgID0+ICcxLjAzJywKKyAgICAgICAgICAgICAgICAgICAgICAnVGVzdDo6Q2xhc3MnICAgICAgID0+ICcwLjI4JywKKyAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgdGVzdCAgICAgICAgICA9PiB7IFRFU1RTID0+ICd0LyoudCB0L2V4YW1wbGVzLyoudCcgfSwKKyk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9SRUFETUUgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiM2ZkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L1JFQURNRQpAQCAtMCwwICsxLDI4IEBACitBTlRMUjo6UnVudGltZQorCitUaGlzIGlzIHRoZSBQZXJsIDUgcnVudGltZSBmb3IgQU5UTFIuICBJdCBpcyBjdXJyZW50bHkgdW5kZXIgZWFybHkKK2RldmVsb3BtZW50LiAgTW9zdCBwYXJ0cyBhcmUgbm90IHdvcmtpbmcgeWV0LCBhbmQgc29tZSBvZiB0aG9zZSB0aGF0IGFyZSBuZWVkCit0byBjYXRjaCB1cCB3aXRoIHRoZSBjdXJyZW50IGRldmVsb3BtZW50IHZlcnNpb24uICBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgc29tZQorcGFydHMgYXJlIHdvcmtpbmcsIGFzIGlsbHVzdHJhdGVkIGJ5IHRoZSBleGFtcGxlcy4gIFlvdSdkIHByb2JhYmx5IHdhbnQgdG8KK3Rha2UgYSBsb29rIGF0IGV4YW1wbGVzL2V4cHIvLgorCisKK0tOT1dOIElTU1VFUworPT09PT09PT09PT09CisKKyogUGVybCdzIHN5bnRheCBjbGFzaGVzIHdpdGggQU5UTFIncyBTdHJpbmdUZW1wbGF0ZSAoJyUnKSBhbmQgdmFyaWFibGUgKCckJykKK3N5bnRheC4gIEV4cGVjdCBlcnJvciBtZXNzYWdlcyBsaWtlIHRoZSBmb2xsb3dpbmcuCisKK2Vycm9yKDE0Nik6IEV4cHIuZzoxMDoxMDogaW52YWxpZCBTdHJpbmdUZW1wbGF0ZSAlIHNob3J0aGFuZCBzeW50YXg6ICclbWVtb3J5JworZXJyb3IoMTE0KTogRXhwci5nOjE4Ojk6IGF0dHJpYnV0ZSBpcyBub3QgYSB0b2tlbiwgcGFyYW1ldGVyLCBvciByZXR1cm4gdmFsdWU6IG1lbW9yeQorZXJyb3IoMTE0KTogRXhwci5nOjM2Ojk6IGF0dHJpYnV0ZSBpcyBub3QgYSB0b2tlbiwgcGFyYW1ldGVyLCBvciByZXR1cm4gdmFsdWU6IHYKKworQ3VycmVudGx5LCBpdCdzIGJlc3QgdG8gY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGxpa2Ugc286CisKKyQgcGVybCAtYyBFeHByTGV4ZXIucG0KK0V4cHJMZXhlci5wbSBzeW50YXggT0sKKworJCBwZXJsIC1jIEV4cHJQYXJzZXIucG0KK0V4cHJQYXJzZXIucG0gc3ludGF4IE9LCisKK09yIHVzZSB0aGUgbGV4ZXIvcGFyc2VyIGluIGFuIGV4YW1wbGUuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9kb2NzL2Rlc2lnbi5wb2QgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9kb2NzL2Rlc2lnbi5wb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3YTY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2RvY3MvZGVzaWduLnBvZApAQCAtMCwwICsxLDY2IEBACis9aGVhZDEgTkFNRQorCitkZXNpZ24ucG9kIC0gQU5UTFI6OlJ1bnRpbWUgRGVzaWduIERvY3VtZW50CisKKz1oZWFkMSBBQlNUUkFDVAorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZGVzaWduIG9mIHRoZSBDPEFOVExSOjpSdW50aW1lPiBQZXJsIDUgcG9ydC4KKworPWhlYWQxIE9WRVJWSUVXCisKK0M8QU5UTFI6OlJ1bnRpbWU+IGlzIHRoZSBwb3J0IG9mIHRoZSBydW50aW1lIHBhcnQgZm9yIEFOVExSIHRvIFBlcmwgNS4gIEFOVExSJ3MKK3ByaW1hcnkgdGFyZ2V0IGxhbmd1YWdlIGlzIEphdmEuICBUaGlzIHBvcnQgdHJpZXMgdG8gbWltaWMgdGhpcyBpbXBsZW1lbnRhdGlvbgordmVyeSBjbG9zZWx5LCB3aGljaCBob3BlZnVsbHkgbWFrZXMgaXQgZWFzaWVyIHRvIHBvcnQuICBUaGUgcGFydHMgdmlzaWJsZSB0bworUGVybCB1c2VycyBzaG91bGQgYmUgcGVybGlzaCBpZiBwb3NzaWJsZSAtIGF0IGxlYXN0IGFzIGEgc2Vjb25kYXJ5IGludGVyZmFjZS4KKworPWhlYWQxIEJhc2ljIFBvcnRpbmcgQ29uc2lkZXJhdGlvbnMKKworSmF2YSBpcyBidWlsdCBvbiB0d28gYmFzaWMgY29uY2VwdHM6IE9iamVjdHMgYW5kIEV4Y2VwdGlvbnMuICBJZiB0aGVyZSdzIGEKK2dvb2QgbWF0Y2ggZm9yIHRob3NlIGZlYXR1cmVzIG1vc3Qgb3RoZXIgdGhpbmdzIHNob3VsZCBmYWxsIGludG8gcGxhY2UuCisKKz1oZWFkMiBPTworCitDPEFOVExSOjpSdW50aW1lPiB1c2VzIEM8T2JqZWN0OjpJbnNpZGVPdXQ+IGZvciBPTyBtb2RlbGxpbmcuCisKKz1oZWFkMyBQYWNrYWdlcworCitUaGUgSmF2YSBwYWNrYWdlIEM8b3JnLmFudGxyLnJ1bnRpbWU+IG1hcHMgdG8gdGhlIFBlcmwgNSBwYWNrYWdlCitDPEFOVExSOjpSdW50aW1lPi4KKworPWhlYWQzIENsYXNzZXMKKworRWFjaCBKYXZhIGNsYXNzIG1hcHMgdG8gYSBQZXJsIDUgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lLgorCis9aGVhZDIgRXhjZXB0aW9ucworCitDPEV4Y2VwdGlvbjo6Q2xhc3M+IHNob3VsZCBtZWV0IG91ciBuZWVkcyBhbmQgaXMgdXNlZCBieSBDPE9iamVjdDo6SW5zaWRlT3V0PgordG9vLgorCis9aGVhZDIgVHlwZXMKKworSGVyZSdzIGEgbGlzdCBvZiBKYXZhIHR5cGVzIGFuZCBob3cgdGhleSBzaG91bGQgbWFwIHRvIFBlcmwuCisKKz1vdmVyCisKKz1pdGVtIGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUsIFN0cmluZworCitVc2UgYSBQZXJsIHNjYWxhci4KKworPWl0ZW0gQzxqYXZhLnV0aWwuTGlzdD4KKworVXNlIGEgcmVmZXJlbmNlIHRvIGEgUGVybCBhcnJheS4KKworPWl0ZW0gQzxqYXZhLnV0aWwuTWFwPgorCitVc2UgYSByZWZlcmVuY2UgdG8gYSBQZXJsIGhhc2guCisKKz1iYWNrCisKKz1oZWFkMSBTRUUgQUxTTworCitMPGh0dHA6Ly93d3cuYW50bHIub3JnLz4KKworCis9aGVhZDEgQVVUSE9SCisKK1JvbmFsZCBCbGFzY2hrZSAocm9uQHJibGFzY2gub3JnKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvUkVBRE1FIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDQxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9SRUFETUUKQEAgLTAsMCArMSwxNiBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZXhhbXBsZXMgZm9yIHRoZSBQZXJsIDUgY29kZSBnZW5lcmF0aW9uIHRhcmdldC4KKworRmlyc3QgeW91IG5lZWQgdG8gY29tcGlsZSBBTlRMUiwgcnVubmluZyAiYW50IiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4KKworVGhlbiB5b3UgbmVlZCB0byBidWlsZCB0aGUgUGVybCBtb2R1bGUuCisKKyAgICBwZXJsIE1ha2VmaWxlLlBMCisgICAgbWFrZQorCitBZnRlciB0aGF0IHlvdSBuZWVkIHRvIGNvbXBpbGUgdGhlIGdyYW1tYXIgdXNpbmcgQU5UTFIsIGZvciBleGFtcGxlIGJ5IHVzaW5nCit0aGUgYW50bHIuYmF0IEkndmUgYWRkZWQuCisKKyAgICBjZCBleGFtcGxlc1xleHByCisgICAgLi5cLi5cYW50bHIgRXhwci5nCisKK0ZpbmFsbHkgeW91IGNhbiBydW4gdGhlIGV4YW1wbGUgcHJvZ3JhbXMuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9leHByL0V4cHIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL2V4cHIvRXhwci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDA5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9leHByL0V4cHIuZwpAQCAtMCwwICsxLDUwIEBACitncmFtbWFyIEV4cHI7CisKK29wdGlvbnMgeworICAgIGxhbmd1YWdlID0gUGVybDU7Cit9CisKK0BoZWFkZXIgeworfQorCitAbWVtYmVycyB7CisgICAgbXkgJW1lbW9yeTsKK30KKworcHJvZzogICBzdGF0KyA7CisgICAgICAgICAgICAgICAgCitzdGF0OiAgIGV4cHIgTkVXTElORSB7IHByaW50ICIkZXhwci52YWx1ZVxuIjsgfQorICAgIHwgICBJRCAnPScgZXhwciBORVdMSU5FCisgICAgICAgIHsgJG1lbW9yeXskSUQudGV4dH0gPSAkZXhwci52YWx1ZTsgfQorICAgIHwgICBORVdMSU5FCisgICAgOworCitleHByIHJldHVybnMgW3ZhbHVlXQorICAgIDogICBlPW11bHRFeHByIHsgJHZhbHVlID0gJGUudmFsdWU7IH0KKyAgICAgICAgKCAgICcrJyBlPW11bHRFeHByIHsgJHZhbHVlICs9ICRlLnZhbHVlOyB9CisgICAgICAgIHwgICAnLScgZT1tdWx0RXhwciB7ICR2YWx1ZSAtPSAkZS52YWx1ZTsgfQorICAgICAgICApKgorICAgIDsKKworbXVsdEV4cHIgcmV0dXJucyBbdmFsdWVdCisgICAgOiAgIGU9YXRvbSB7ICR2YWx1ZSA9ICRlLnZhbHVlOyB9ICgnKicgZT1hdG9tIHsgJHZhbHVlICo9ICRlLnZhbHVlOyB9KSoKKyAgICA7IAorCithdG9tIHJldHVybnMgW3ZhbHVlXQorICAgIDogICBJTlQgeyAkdmFsdWUgPSAkSU5ULnRleHQ7IH0KKyAgICB8ICAgSUQKKyAgICAgICAgeworICAgICAgICAgICAgbXkgJHYgPSAkbWVtb3J5eyRJRC50ZXh0fTsKKyAgICAgICAgICAgIGlmIChkZWZpbmVkICR2KSB7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJHY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAidW5kZWZpbmVkIHZhcmlhYmxlICRJRC50ZXh0XG4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfCAgICcoJyBleHByICcpJyB7ICR2YWx1ZSA9ICRleHByLnZhbHVlOyB9CisgICAgOworCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJykrIDsKK0lOVCA6ICAgJzAnLi4nOScrIDsKK05FV0xJTkU6J1xyJz8gJ1xuJyA7CitXUyAgOiAgICgnICd8J1x0JykrIHsgJHNlbGYtPnNraXAoKTsgfSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9leHByL2V4cHIucGwgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9leHByL2V4cHIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4NDljZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL2V4cHIvZXhwci5wbApAQCAtMCwwICsxLDI0IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIGJsaWI7CisKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07Cit1c2UgQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuU3RyZWFtOwordXNlIEV4cHJMZXhlcjsKK3VzZSBFeHByUGFyc2VyOworCitteSAkaW47Cit7CisgICAgdW5kZWYgJC87CisgICAgJGluID0gPD47Cit9CisKK215ICRpbnB1dCA9IEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbS0+bmV3KHsgaW5wdXQgPT4gJGluIH0pOworbXkgJGxleGVyID0gRXhwckxleGVyLT5uZXcoeyBpbnB1dCA9PiAkaW5wdXQgfSk7CisKK215ICR0b2tlbnMgPSBBTlRMUjo6UnVudGltZTo6Q29tbW9uVG9rZW5TdHJlYW0tPm5ldyh7IHRva2VuX3NvdXJjZSA9PiAkbGV4ZXIgfSk7CitteSAkcGFyc2VyID0gRXhwclBhcnNlci0+bmV3KHsgaW5wdXQgPT4gJHRva2VucyB9KTsKKyRwYXJzZXItPnByb2coKTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL2lkL0lETGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL2lkL0lETGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJlZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvaWQvSURMZXhlci5nCkBAIC0wLDAgKzEsNyBAQAorbGV4ZXIgZ3JhbW1hciBJRExleGVyOworb3B0aW9ucyB7IGxhbmd1YWdlID0gUGVybDU7IH0KKworSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWicpKyA7CitJTlQgOiAgICcwJy4uJzknKyA7CitORVdMSU5FOidccic/ICdcbicgeyAkc2VsZi0+c2tpcCgpOyB9IDsKK1dTICA6ICAgKCcgJ3wnXHQnKSsgeyAkY2hhbm5lbCA9IEhJRERFTjsgfSA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9pZC9pZC5wbCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL2lkL2lkLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMWRlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9pZC9pZC5wbApAQCAtMCwwICsxLDI1IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIGJsaWI7CisKK3VzZSBFbmdsaXNoIHF3KCAtbm9fbWF0Y2hfdmFycyApOwordXNlIEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbTsKK3VzZSBJRExleGVyOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitteSAkaW5wdXQgPSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW0tPm5ldyh7IGlucHV0ID0+ICJIZWxsbyBXb3JsZCFcbjQyXG4iIH0pOworbXkgJGxleGVyID0gSURMZXhlci0+bmV3KHsgaW5wdXQgPT4gJGlucHV0IH0pOworCit3aGlsZSAoMSkgeworICAgIG15ICR0b2tlbiA9ICRsZXhlci0+bmV4dF90b2tlbigpOworICAgIGxhc3QgaWYgJHRva2VuLT5nZXRfdHlwZSgpID09IElETGV4ZXItPkVPRjsKKworICAgIHByaW50ICJ0ZXh0OiAiLCAkdG9rZW4tPmdldF90ZXh0KCksICJcbiI7CisgICAgcHJpbnQgInR5cGU6ICIsICR0b2tlbi0+Z2V0X3R5cGUoKSwgIlxuIjsKKyAgICBwcmludCAicG9zOiAiLCAkdG9rZW4tPmdldF9saW5lKCksICc6JywgJHRva2VuLT5nZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lKCksICJcbiI7CisgICAgcHJpbnQgImNoYW5uZWw6ICIsICR0b2tlbi0+Z2V0X2NoYW5uZWwoKSwgIlxuIjsKKyAgICBwcmludCAidG9rZW4gaW5kZXg6ICIsICR0b2tlbi0+Z2V0X3Rva2VuX2luZGV4KCksICJcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL21leHByL01FeHByLmcgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9tZXhwci9NRXhwci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTA0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9tZXhwci9NRXhwci5nCkBAIC0wLDAgKzEsMjggQEAKK2dyYW1tYXIgTUV4cHI7CisKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFBlcmw1OworfQorCitwcm9nOiAgIHN0YXQrIDsKKyAgICAgICAgICAgICAgICAKK3N0YXQ6ICAgZXhwciBORVdMSU5FIHsgcHJpbnQgIiRleHByLnZhbHVlXG4iOyB9CisgICAgfCAgIE5FV0xJTkUKKyAgICA7CisKK2V4cHIgcmV0dXJucyBbdmFsdWVdCisgICAgOiAgIGU9YXRvbSB7ICR2YWx1ZSA9ICRlLnZhbHVlOyB9CisgICAgICAgICggICAnKycgZT1hdG9tIHsgJHZhbHVlICs9ICRlLnZhbHVlOyB9CisgICAgICAgIHwgICAnLScgZT1hdG9tIHsgJHZhbHVlIC09ICRlLnZhbHVlOyB9CisgICAgICAgICkqCisgICAgOworCithdG9tIHJldHVybnMgW3ZhbHVlXQorICAgIDogICBJTlQgeyAkdmFsdWUgPSAkSU5ULnRleHQ7IH0KKyAgICB8ICAgJygnIGV4cHIgJyknIHsgJHZhbHVlID0gJGV4cHIudmFsdWU7IH0KKyAgICA7CisKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSsgOworSU5UIDogICAnMCcuLic5JysgOworTkVXTElORTonXHInPyAnXG4nIDsKK1dTICA6ICAgKCcgJ3wnXHQnKSsgeyAkc2VsZi0+c2tpcCgpOyB9IDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL21leHByL21leHByLnBsIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvbWV4cHIvbWV4cHIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZWY5MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL21leHByL21leHByLnBsCkBAIC0wLDAgKzEsMjAgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgYmxpYjsKKwordXNlIEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbTsKK3VzZSBBTlRMUjo6UnVudGltZTo6Q29tbW9uVG9rZW5TdHJlYW07Cit1c2UgTUV4cHJMZXhlcjsKK3VzZSBNRXhwclBhcnNlcjsKKword2hpbGUgKDw+KSB7CisgICAgbXkgJGlucHV0ID0gQU5UTFI6OlJ1bnRpbWU6OkFOVExSU3RyaW5nU3RyZWFtLT5uZXcoeyBpbnB1dCA9PiAkXyB9KTsKKyAgICBteSAkbGV4ZXIgPSBNRXhwckxleGVyLT5uZXcoJGlucHV0KTsKKworICAgIG15ICR0b2tlbnMgPSBBTlRMUjo6UnVudGltZTo6Q29tbW9uVG9rZW5TdHJlYW0tPm5ldyh7IHRva2VuX3NvdXJjZSA9PiAkbGV4ZXIgfSk7CisgICAgbXkgJHBhcnNlciA9IE1FeHByUGFyc2VyLT5uZXcoJHRva2Vucyk7CisgICAgJHBhcnNlci0+cHJvZygpOworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvc2ltcGxlY2FsYy9TaW1wbGVDYWxjLmcgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9zaW1wbGVjYWxjL1NpbXBsZUNhbGMuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE5ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvc2ltcGxlY2FsYy9TaW1wbGVDYWxjLmcKQEAgLTAsMCArMSwyOSBAQAorZ3JhbW1hciBTaW1wbGVDYWxjOworb3B0aW9ucyB7IGxhbmd1YWdlID0gUGVybDU7IH0KKwordG9rZW5zIHsKKyAgICBQTFVTICA9ICcrJyA7CisgICAgTUlOVVMgPSAnLScgOworICAgIE1VTFQgID0gJyonIDsKKyAgICBESVYgICA9ICcvJyA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQQVJTRVIgUlVMRVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZXhwciAgICA6IHRlcm0gKCAoIFBMVVMgfCBNSU5VUyApICB0ZXJtICkqIDsKKwordGVybSAgICA6IGZhY3RvciAoICggTVVMVCB8IERJViApIGZhY3RvciApKiA7CisKK2ZhY3RvciAgOiBOVU1CRVIgOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTEVYRVIgUlVMRVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTlVNQkVSIDogKERJR0lUKSsgOworCitXSElURVNQQUNFIDogKCAnXHQnIHwgJyAnIHwgJ1xyJyB8ICdcbid8ICdcdTAwMEMnICkrIHsgJGNoYW5uZWwgPSAkc2VsZi0+SElEREVOOyB9IDsKKworZnJhZ21lbnQgRElHSVQgOiAnMCcuLic5JyA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9zaW1wbGVjYWxjL3NpbXBsZWNhbGMucGwgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy9zaW1wbGVjYWxjL3NpbXBsZWNhbGMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxNzZlZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3NpbXBsZWNhbGMvc2ltcGxlY2FsYy5wbApAQCAtMCwwICsxLDI3IEBACisjIXBlcmwKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEFOVExSOjpSdW50aW1lOjpBTlRMUkZpbGVTdHJlYW07Cit1c2UgQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuU3RyZWFtOwordXNlIEFOVExSOjpSdW50aW1lOjpSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKK3VzZSBTaW1wbGVDYWxjTGV4ZXI7Cit1c2UgU2ltcGxlQ2FsY1BhcnNlcjsKKworbXkgJGlucHV0ID0gQU5UTFI6OlJ1bnRpbWU6OkFOVExSRmlsZVN0cmVhbS0+bmV3KHsgZmlsZV9uYW1lID0+ICRBUkdWWzBdIH0pOworbXkgJGxleGVyID0gU2ltcGxlQ2FsY0xleGVyLT5uZXcoeyBpbnB1dCA9PiAkaW5wdXQgfSk7CitteSAkdG9rZW5zID0gQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuU3RyZWFtLT5uZXcoeyB0b2tlbl9zb3VyY2UgPT4gJGxleGVyIH0pOworbXkgJHBhcnNlciA9IFNpbXBsZUNhbGNQYXJzZXItPm5ldyh7IGlucHV0ID0+ICR0b2tlbnMgfSk7CitldmFsIHsKKyAgICAkcGFyc2VyLT5leHByKCk7CisgICAgcHJpbnQgIm9rXG4iOworICAgIHByaW50ICJlcnJvcnM6ICIsICRwYXJzZXItPmdldF9udW1iZXJfb2Zfc3ludGF4X2Vycm9ycygpLCAiXG4iOworICAgIHByaW50ICJmYWlsZWQ6ICIsICRwYXJzZXItPmZhaWxlZCgpLCAiXG4iOworfTsKK2lmIChteSAkZXggPSBBTlRMUjo6UnVudGltZTo6UmVjb2duaXRpb25FeGNlcHRpb24tPmNhdWdodCgpKSB7CisgICAgcHJpbnQgJGV4LT50cmFjZSwgIlxuIjsKK30KK2Vsc2lmICgkZXggPSAkQCkgeworICAgIGRpZSAkZXg7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy90d2Vhay9ULmcgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy90d2Vhay9ULmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMWI4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3R3ZWFrL1QuZwpAQCAtMCwwICsxLDY1IEBACisvKiogQ29udmVydCB0aGUgc2ltcGxlIGlucHV0IHRvIGJlIGphdmEgY29kZTsgd3JhcCBpbiBhIGNsYXNzLAorICogIGNvbnZlcnQgbWV0aG9kIHdpdGggInB1YmxpYyB2b2lkIiwgYWRkIGRlY2xzLiAgVGhpcyBzaG93cyBob3cgdG8gaW5zZXJ0CisgKiAgZXh0cmEgdGV4dCBpbnRvIGEgc3RyZWFtIG9mIHRva2VucyBhbmQgaG93IHRvIHJlcGxhY2UgYSB0b2tlbgorICogIHdpdGggc29tZSB0ZXh0LiAgQ2FsbGluZyB0b1N0cmluZygpIG9uIHRoZSBUb2tlblJld3JpdGVTdHJlYW0KKyAqICBpbiBNYWluIHdpbGwgcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0uCisgKgorICogIE5vdGUgdGhhdCB5b3UgY2FuIGRvIHRoZSBpbnN0cnVjdGlvbnMgaW4gYW55IG9yZGVyIGFzIHRoZQorICogIHJld3JpdGUgaW5zdHJ1Y3Rpb25zIGp1c3QgZ2V0IHF1ZXVlZCB1cCBhbmQgZXhlY3V0ZWQgdXBvbiB0b1N0cmluZygpLgorICovCitncmFtbWFyIFQ7CitvcHRpb25zIHsgbGFuZ3VhZ2UgPSBQZXJsNTsgfQorCitwcm9ncmFtCisgICAgOiAgIG1ldGhvZCsKKyAgICAgICAgeworICAgICAgICAkaW5wdXQtPmluc2VydF9iZWZvcmUoJGlucHV0LT5MVCgxKSwgInB1YmxpYyBjbGFzcyBXcmFwcGVyIHtcbiIpOworICAgICAgICAvLyBub3RlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGxhc3QgdG9rZW4gbWF0Y2hlZCBmb3IgbWV0aG9kOgorICAgICAgICAkaW5wdXQtPmluc2VydF9hZnRlcigkbWV0aG9kLnN0b3AsICJcbn1cbiIpOworICAgICAgICB9CisgICAgOworCittZXRob2QKKyAgICA6ICAgbT0nbWV0aG9kJyBJRCAnKCcgJyknIGJvZHkKKyAgICAgICAgeyAkaW5wdXQtPnJlcGxhY2UoJG0sICJwdWJsaWMgdm9pZCIpOyB9CisgICAgOyAKKworYm9keQorc2NvcGUgeworICAgIC8vIGRlY2xzIGlzIG9uIGJvZHkncyBsb2NhbCB2YXJpYWJsZSBzdGFjayBidXQgaXMgdmlzaWJsZSB0bworICAgIC8vIGFueSBydWxlIHRoYXQgYm9keSBjYWxscyBzdWNoIGFzIHN0YXQuICBGcm9tIG90aGVyIHJ1bGVzCisgICAgLy8gaXQgaXMgcmVmZXJlbmNlZCBhcyAkYm9keTo6ZGVjbHMKKyAgICAvLyBGcm9tIHdpdGhpbiBydWxlIGJvZHksIHlvdSBjYW4gdXNlICRkZWNscyBzaG9ydGhhbmQKKyAgICBkZWNsczsKK30KK0Bpbml0IHsKKyAgICAkYm9keTo6ZGVjbHMgPSBbXTsKK30KKyAgICA6ICAgbGN1cmx5PSd7JyBzdGF0KiAnfScKKyAgICAgICAgeworICAgICAgICAvLyBkdW1wIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGlkZW50aWZpZXJzIHNlZW4gaW4gc3RhdGVtZW50IGxpc3QKKyAgICAgICAgZm9yZWFjaCBteSAkaWQgKCRib2R5OjpkZWNscykgeworICAgICAgICAgICAgJHRva2Vucy0+aW5zZXJ0X2FmdGVyKCRsY3VybHksICJcbmludCAkaWQ7Iik7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIDsKKworc3RhdDogICBJRCAnPScgZXhwciAnOycgeyAkYm9keTo6ZGVjbHMtPmFkZCgkSUQudGV4dCk7IH0gLy8gdHJhY2sgbGVmdC1oYW5kLXNpZGVzCisgICAgOworCitleHByOiAgIG11bCAoJysnIG11bCkqIAorICAgIDsKKworbXVsIDogICBhdG9tICgnKicgYXRvbSkqCisgICAgOworCithdG9tOiAgIElECisgICAgfCAgIElOVAorICAgIDsKKworSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWicpKyA7CisKK0lOVCA6ICAgKCcwJy4uJzknKSsgOworCitXUyAgOiAgICgnICd8J1x0J3wnXG4nKSsgeyAkY2hhbm5lbCA9ICRzZWxmLT5ISURERU47IH0KKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy90d2Vhay9pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3R3ZWFrL2lucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZWYxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy90d2Vhay9pbnB1dApAQCAtMCwwICsxLDkgQEAKK21ldGhvZCBmb28oKSB7CisgIGkgPSAzOworICBrID0gaTsKKyAgaSA9IGsqNDsKK30KKworbWV0aG9kIGJhcigpIHsKKyAgaiA9IGkqMjsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3R3ZWFrL291dHB1dCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3R3ZWFrL291dHB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhlOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvdHdlYWsvb3V0cHV0CkBAIC0wLDAgKzEsMTYgQEAKK3B1YmxpYyBjbGFzcyBXcmFwcGVyIHsKK3B1YmxpYyB2b2lkIGZvbygpIHsKK2ludCBrOworaW50IGk7CisgIGkgPSAzOworICBrID0gaTsKKyAgaSA9IGsqNDsKK30KKworcHVibGljIHZvaWQgYmFyKCkgeworaW50IGo7CisgIGogPSBpKjI7Cit9Cit9CisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvdHdlYWsvdHdlYWsucGwgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9leGFtcGxlcy90d2Vhay90d2Vhay5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZiNzQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvdHdlYWsvdHdlYWsucGwKQEAgLTAsMCArMSwxNiBAQAorIyFwZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJGaWxlU3RyZWFtOwordXNlIEFOVExSOjpSdW50aW1lOjpUb2tlblJld3JpdGVTdHJlYW07Cit1c2UgVExleGVyOwordXNlIFRQYXJzZXI7CisKK215ICRpbnB1dCA9IEFOVExSOjpSdW50aW1lOjpBTlRMUkZpbGVTdHJlYW0tPm5ldyh7IGZpbGVfbmFtZSA9PiAkQVJHVlswXSB9KTsKK215ICRsZXhlciA9IFRMZXhlci0+bmV3KHsgaW5wdXQgPT4gJGlucHV0IH0pOworbXkgJHRva2VucyA9IEFOVExSOjpSdW50aW1lOjpUb2tlblJld3JpdGVTdHJlYW0oeyB0b2tlbl9zb3VyY2UgPT4gJGxleGVyIH0pOworbXkgJHBhcnNlciA9IFRQYXJzZXItPm5ldyh7IGlucHV0ID0+ICR0b2tlbnMgfSk7CiskcGFyc2VyLT5wcm9ncmFtKCk7CitwcmludCAiJHRva2Vuc1xuIjsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3plcm8tb25lL1QuZyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3plcm8tb25lL1QuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdhMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvemVyby1vbmUvVC5nCkBAIC0wLDAgKzEsNCBAQAorbGV4ZXIgZ3JhbW1hciBUOworb3B0aW9ucyB7IGxhbmd1YWdlID0gUGVybDU7IH0KK1pFUk86ICcwJzsKK09ORTogJzEnOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvemVyby1vbmUvdC1lcnJvci5wbCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3plcm8tb25lL3QtZXJyb3IucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4YjNjMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3plcm8tb25lL3QtZXJyb3IucGwKQEAgLTAsMCArMSwyNyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBibGliOworCit1c2UgRW5nbGlzaCBxdyggLW5vX21hdGNoX3ZhcnMgKTsKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07Cit1c2UgVExleGVyOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitteSAkaW5wdXQgPSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW0tPm5ldyh7ICcwMVgwJyB9KTsKK215ICRsZXhlciA9IFRMZXhlci0+bmV3KCRpbnB1dCk7CisKK3doaWxlICgxKSB7CisgICAgbXkgJHRva2VuID0gZXZhbCB7ICRsZXhlci0+bmV4dF90b2tlbigpOyB9OworICAgIGlmICgkRVZBTF9FUlJPUikgeworICAgICAgICBteSAkZXhjZXB0aW9uID0gJEVWQUxfRVJST1I7CisgICAgICAgIHByaW50ICRleGNlcHRpb247CisgICAgICAgIG5leHQ7CisgICAgfQorICAgIGxhc3QgaWYgJHRva2VuLT5nZXRfdHlwZSgpID09ICRUTGV4ZXI6OkVPRjsKKworICAgIHByaW50ICJ0eXBlOiAiLCAkdG9rZW4tPmdldF90eXBlKCksICJcbiI7CisgICAgcHJpbnQgInRleHQ6ICIsICR0b2tlbi0+Z2V0X3RleHQoKSwgIlxuIjsKKyAgICBwcmludCAiXG4iOworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvZXhhbXBsZXMvemVyby1vbmUvdC5wbCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3plcm8tb25lL3QucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2OWNjMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2V4YW1wbGVzL3plcm8tb25lL3QucGwKQEAgLTAsMCArMSwyMiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBibGliOworCit1c2UgRW5nbGlzaCBxdyggLW5vX21hdGNoX3ZhcnMgKTsKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07Cit1c2UgVExleGVyOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitteSAkaW5wdXQgPSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW0tPm5ldyh7IGlucHV0ID0+ICcwMTAnIH0pOworbXkgJGxleGVyID0gVExleGVyLT5uZXcoJGlucHV0KTsKKword2hpbGUgKDEpIHsKKyAgICBteSAkdG9rZW4gPSAkbGV4ZXItPm5leHRfdG9rZW4oKTsKKyAgICBsYXN0IGlmICR0b2tlbi0+Z2V0X3R5cGUoKSA9PSAkVExleGVyOjpFT0Y7CisKKyAgICBwcmludCAidHlwZTogIiwgJHRva2VuLT5nZXRfdHlwZSgpLCAiXG4iOworICAgIHByaW50ICJ0ZXh0OiAiLCAkdG9rZW4tPmdldF90ZXh0KCksICJcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiYmMwNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lLnBtCkBAIC0wLDAgKzEsMTE2IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdmVyc2lvbjsgb3VyICRWRVJTSU9OID0gcXYoJzAuMC4xJyk7CisKKzE7CisKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworQU5UTFI6OlJ1bnRpbWUgLSBBTlRMUiBSdW50aW1lIGZvciBQZXJsIDUKKworCis9aGVhZDEgVkVSU0lPTgorCitUaGlzIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvIEFOVExSOjpSdW50aW1lIHZlcnNpb24gMC4wLjEKKworCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSA8TW9kdWxlOjpOYW1lPjsKKyAgICAjIEJyaWVmIGJ1dCB3b3JraW5nIGNvZGUgZXhhbXBsZShzKSBoZXJlIHNob3dpbmcgdGhlIG1vc3QgY29tbW9uIHVzYWdlKHMpCisKKyAgICAjIFRoaXMgc2VjdGlvbiB3aWxsIGJlIGFzIGZhciBhcyBtYW55IHVzZXJzIGJvdGhlciByZWFkaW5nCisgICAgIyBzbyBtYWtlIGl0IGFzIGVkdWNhdGlvbmFsIGFuZCBleGVtcGxhcnkgYXMgcG9zc2libGUuCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0EgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgbW9kdWxlIGFuZCBpdHMgZmVhdHVyZXMuCitNYXkgaW5jbHVkZSBudW1lcm91cyBzdWJzZWN0aW9ucyAoaS5lLiA9aGVhZDIsID1oZWFkMywgZXRjLikKKworCis9aGVhZDEgU1VCUk9VVElORVMvTUVUSE9EUworCitBIHNlcGFyYXRlIHNlY3Rpb24gbGlzdGluZyB0aGUgcHVibGljIGNvbXBvbmVudHMgb2YgdGhlIG1vZHVsZSdzIGludGVyZmFjZS4KK1RoZXNlIG5vcm1hbGx5IGNvbnNpc3Qgb2YgZWl0aGVyIHN1YnJvdXRpbmVzIHRoYXQgbWF5IGJlIGV4cG9ydGVkLCBvciBtZXRob2RzCit0aGF0IG1heSBiZSBjYWxsZWQgb24gb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIGNsYXNzZXMgdGhhdCB0aGUgbW9kdWxlIHByb3ZpZGVzLgorTmFtZSB0aGUgc2VjdGlvbiBhY2NvcmRpbmdseS4KKworSW4gYW4gb2JqZWN0LW9yaWVudGVkIG1vZHVsZSwgdGhpcyBzZWN0aW9uIHNob3VsZCBiZWdpbiB3aXRoIGEgc2VudGVuY2Ugb2YgdGhlCitmb3JtICJBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzLi4uIiwgdG8gZ2l2ZSB0aGUgcmVhZGVyIGEgaGlnaC1sZXZlbAorY29udGV4dCB0byBoZWxwIHRoZW0gdW5kZXJzdGFuZCB0aGUgbWV0aG9kcyB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgZGVzY3JpYmVkLgorCisKKz1oZWFkMSBESUFHTk9TVElDUworCitBIGxpc3Qgb2YgZXZlcnkgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZSB0aGF0IHRoZSBtb2R1bGUgY2FuIGdlbmVyYXRlCisoZXZlbiB0aGUgb25lcyB0aGF0IHdpbGwgIm5ldmVyIGhhcHBlbiIpLCB3aXRoIGEgZnVsbCBleHBsYW5hdGlvbiBvZiBlYWNoCitwcm9ibGVtLCBvbmUgb3IgbW9yZSBsaWtlbHkgY2F1c2VzLCBhbmQgYW55IHN1Z2dlc3RlZCByZW1lZGllcy4KKyhTZWUgYWxzbyAiRG9jdW1lbnRpbmcgRXJyb3JzIiBpbiBDaGFwdGVyIDEzLikKKworCis9aGVhZDEgQ09ORklHVVJBVElPTiBBTkQgRU5WSVJPTk1FTlQKKworQSBmdWxsIGV4cGxhbmF0aW9uIG9mIGFueSBjb25maWd1cmF0aW9uIHN5c3RlbShzKSB1c2VkIGJ5IHRoZSBtb2R1bGUsCitpbmNsdWRpbmcgdGhlIG5hbWVzIGFuZCBsb2NhdGlvbnMgb2YgYW55IGNvbmZpZ3VyYXRpb24gZmlsZXMsIGFuZCB0aGUKK21lYW5pbmcgb2YgYW55IGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldC4gVGhlc2UKK2Rlc2NyaXB0aW9ucyBtdXN0IGFsc28gaW5jbHVkZSBkZXRhaWxzIG9mIGFueSBjb25maWd1cmF0aW9uIGxhbmd1YWdlIHVzZWQuCisoU2VlIGFsc28gIkNvbmZpZ3VyYXRpb24gRmlsZXMiIGluIENoYXB0ZXIgMTkuKQorCisKKz1oZWFkMSBERVBFTkRFTkNJRVMKKworQSBsaXN0IG9mIGFsbCB0aGUgb3RoZXIgbW9kdWxlcyB0aGF0IHRoaXMgbW9kdWxlIHJlbGllcyB1cG9uLCBpbmNsdWRpbmcgYW55CityZXN0cmljdGlvbnMgb24gdmVyc2lvbnMsIGFuZCBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlc2UgcmVxdWlyZWQgbW9kdWxlcyBhcmUKK3BhcnQgb2YgdGhlIHN0YW5kYXJkIFBlcmwgZGlzdHJpYnV0aW9uLCBwYXJ0IG9mIHRoZSBtb2R1bGUncyBkaXN0cmlidXRpb24sCitvciBtdXN0IGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LgorCisKKz1oZWFkMSBJTkNPTVBBVElCSUxJVElFUworCitBIGxpc3Qgb2YgYW55IG1vZHVsZXMgdGhhdCB0aGlzIG1vZHVsZSBjYW5ub3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoLgorVGhpcyBtYXkgYmUgZHVlIHRvIG5hbWUgY29uZmxpY3RzIGluIHRoZSBpbnRlcmZhY2UsIG9yIGNvbXBldGl0aW9uIGZvcgorc3lzdGVtIG9yIHByb2dyYW0gcmVzb3VyY2VzLCBvciBkdWUgdG8gaW50ZXJuYWwgbGltaXRhdGlvbnMgb2YgUGVybAorKGZvciBleGFtcGxlLCBtYW55IG1vZHVsZXMgdGhhdCB1c2Ugc291cmNlIGNvZGUgZmlsdGVycyBhcmUgbXV0dWFsbHkKK2luY29tcGF0aWJsZSkuCisKKworPWhlYWQxIEJVR1MgQU5EIExJTUlUQVRJT05TCisKK0EgbGlzdCBvZiBrbm93biBwcm9ibGVtcyB3aXRoIHRoZSBtb2R1bGUsIHRvZ2V0aGVyIHdpdGggc29tZSBpbmRpY2F0aW9uCit3aGV0aGVyIHRoZXkgYXJlIGxpa2VseSB0byBiZSBmaXhlZCBpbiBhbiB1cGNvbWluZyByZWxlYXNlLgorCitBbHNvIGEgbGlzdCBvZiByZXN0cmljdGlvbnMgb24gdGhlIGZlYXR1cmVzIHRoZSBtb2R1bGUgZG9lcyBwcm92aWRlOgorZGF0YSB0eXBlcyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkLCBwZXJmb3JtYW5jZSBpc3N1ZXMgYW5kIHRoZSBjaXJjdW1zdGFuY2VzCitpbiB3aGljaCB0aGV5IG1heSBhcmlzZSwgcHJhY3RpY2FsIGxpbWl0YXRpb25zIG9uIHRoZSBzaXplIG9mIGRhdGEgc2V0cywKK3NwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90ICh5ZXQpIGhhbmRsZWQsIGV0Yy4KKworVGhlIGluaXRpYWwgdGVtcGxhdGUgdXN1YWxseSBqdXN0IGhhczoKKworVGhlcmUgYXJlIG5vIGtub3duIGJ1Z3MgaW4gdGhpcyBtb2R1bGUuCitQbGVhc2UgcmVwb3J0IHByb2JsZW1zIHRvIDxNYWludGFpbmVyIG5hbWUocyk+ICAoPGNvbnRhY3QgYWRkcmVzcz4pCitQYXRjaGVzIGFyZSB3ZWxjb21lLgorCis9aGVhZDEgQVVUSE9SCisKK1JvbmFsZCBCbGFzY2hrZSAocm9uQHJibGFzY2gub3JnKQorCisKKz1oZWFkMSBMSUNFTkNFIEFORCBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA4IFJvbmFsZCBCbGFzY2hrZSAocm9uQHJibGFzY2gub3JnKS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0Jhc2VkIG9uIEFOVExSIEphdmEgUnVudGltZSBieSBUZXJlbmNlIFBhcnIuCisKK1RoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgKHNlZSBMPHBlcmxhcnRpc3RpYz4pCitvciBBTlRMUiAoc2VlIEw8aHR0cDovL3d3dy5hbnRsci5vcmcvbGljZW5zZS5odG1sPikgaXRzZWxmLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9BTlRMUkZpbGVTdHJlYW0ucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9BTlRMUkZpbGVTdHJlYW0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmZTNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0FOVExSRmlsZVN0cmVhbS5wbQpAQCAtMCwwICsxLDg0IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpBTlRMUkZpbGVTdHJlYW07CisKK3VzZSBDYXJwOwordXNlIFJlYWRvbmx5OworCit1c2UgTW9vc2U7CisKK2V4dGVuZHMgJ0FOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbSc7CisKK2hhcyAnZmlsZV9uYW1lJyA9PiAoCisgICAgaXMgID0+ICdybycsCisgICAgaXNhID0+ICdTdHInLAorICAgIHJlcXVpcmVkID0+IDEsCispOworCitzdWIgQlVJTERBUkdTIHsKKyAgICBteSAoJGNsYXNzLCBAYXJncykgPSBAXzsKKyAgICBteSAkYXJncyA9ICRjbGFzcy0+U1VQRVI6OkJVSUxEQVJHUyhAYXJncyk7CisKKyAgICBteSAkZmlsZV9uYW1lID0gJGFyZ3MtPntmaWxlX25hbWV9OworICAgIGlmICghZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBteSAkZmg7CisgICAgbXkgJGVuY29kaW5nID0gJGFyZ3MtPntlbmNvZGluZ307CisgICAgaWYgKGRlZmluZWQgJGVuY29kaW5nKSB7CisgICAgICAgIG9wZW4gJGZoLCAiPDplbmNvZGluZygkZW5jb2RpbmcpIiwgJGZpbGVfbmFtZQorICAgICAgICAgICAgb3IgY3JvYWsgIkNhbid0IG9wZW4gJGZpbGVfbmFtZTogJCEiOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3BlbiAkZmgsICc8JywgJGZpbGVfbmFtZQorICAgICAgICAgICAgb3IgY3JvYWsgIkNhbid0IG9wZW4gJGZpbGVfbmFtZTogJCEiOworICAgIH0KKworICAgIG15ICRjb250ZW50OworICAgIHsKKyAgICAgICAgbG9jYWwgJC87CisgICAgICAgICRjb250ZW50ID0gPCRmaD47CisgICAgfQorICAgIGNsb3NlICRmaCBvciBjYXJwICJDYW4ndCBjbG9zZSAkZmg6ICQhIjsKKworICAgICRhcmdzLT57aW5wdXR9ID0gJGNvbnRlbnQ7CisKKyAgICByZXR1cm4gJGFyZ3M7Cit9CisKK3N1YiBsb2FkIHsKKyAgICBteSAoJHNlbGYsICRmaWxlX25hbWUsICRlbmNvZGluZykgPSBAXzsKKworICAgIGlmICghZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBteSAkZmg7CisgICAgaWYgKGRlZmluZWQgJGVuY29kaW5nKSB7CisgICAgICAgIG9wZW4gJGZoLCAiPDplbmNvZGluZygkZW5jb2RpbmcpIiwgJGZpbGVfbmFtZQorICAgICAgICAgICAgb3IgY3JvYWsgIkNhbid0IG9wZW4gJGZpbGVfbmFtZTogJCEiOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3BlbiAkZmgsICc8JywgJGZpbGVfbmFtZQorICAgICAgICAgICAgb3IgY3JvYWsgIkNhbid0IG9wZW4gJGZpbGVfbmFtZTogJCEiOworICAgIH0KKworICAgIG15ICRjb250ZW50OworICAgIHsKKyAgICAgICAgbG9jYWwgJC87CisgICAgICAgICRjb250ZW50ID0gPCRmaD47CisgICAgfQorICAgIGNsb3NlICRmaCBvciBjYXJwICJDYW4ndCBjbG9zZSAkZmg6ICQhIjsKKworICAgICRzZWxmLT5pbnB1dCgkY29udGVudCk7CisgICAgcmV0dXJuOworfQorCitzdWIgZ2V0X3NvdXJjZV9uYW1lIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5maWxlX25hbWU7Cit9CisKK25vIE1vb3NlOworX19QQUNLQUdFX18tPm1ldGEtPm1ha2VfaW1tdXRhYmxlKCk7CisxOworX19FTkRfXwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0ucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDU1ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0ucG0KQEAgLTAsMCArMSwyMjQgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6OkFOVExSU3RyaW5nU3RyZWFtOworCit1c2UgQ2FycDsKK3VzZSBSZWFkb25seTsKKwordXNlIEFOVExSOjpSdW50aW1lOjpDaGFyU3RyZWFtU3RhdGU7CisKK3VzZSBNb29zZTsKKword2l0aCAnQU5UTFI6OlJ1bnRpbWU6OkludFN0cmVhbScsICdBTlRMUjo6UnVudGltZTo6Q2hhclN0cmVhbSc7CisKK2hhcyAnaW5wdXQnID0+ICgKKyAgICBpcyAgPT4gJ3JvJywKKyAgICBpc2EgPT4gJ1N0cicsCisgICAgcmVxdWlyZWQgPT4gMSwKKyk7CisKK2hhcyAncCcgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnSW50JywKKyAgICBkZWZhdWx0ID0+IDAsCispOworCitoYXMgJ2xpbmUnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAxLAorKTsKKworaGFzICdjaGFyX3Bvc2l0aW9uX2luX2xpbmUnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAwLAorKTsKKworaGFzICdtYXJrX2RlcHRoJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gMCwKKyk7CisKK2hhcyAnbWFya2VycycgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnQXJyYXlSZWZbTWF5YmVbQU5UTFI6OlJ1bnRpbWU6OkNoYXJTdHJlYW1TdGF0ZV1dJywKKyAgICBkZWZhdWx0ID0+IHN1YiB7IFsgdW5kZWYgXSB9LAorKTsKKworaGFzICdsYXN0X21hcmtlcicgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnSW50JywKKyAgICBkZWZhdWx0ID0+IDAsCispOworCitoYXMgJ25hbWUnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ1N0cicsCisgICAgZGVmYXVsdCA9PiBxe30sCispOworCitzdWIgZ2V0X2xpbmUgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPmxpbmU7Cit9CisKK3N1YiBzZXRfbGluZSB7CisgICAgbXkgKCRzZWxmLCAkdmFsdWUpID0gQF87CisgICAgJHNlbGYtPmxpbmUoJHZhbHVlKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5jaGFyX3Bvc2l0aW9uX2luX2xpbmU7Cit9CisKK3N1YiBzZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lIHsKKyAgICBteSAoJHNlbGYsICR2YWx1ZSkgPSBAXzsKKyAgICAkc2VsZi0+Y2hhcl9wb3NpdGlvbl9pbl9saW5lKCR2YWx1ZSk7CisgICAgcmV0dXJuOworfQorCitzdWIgcmVzZXQgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgICRzZWxmLT5wKDApOworICAgICRzZWxmLT5saW5lKDEpOworICAgICRzZWxmLT5jaGFyX3Bvc2l0aW9uX2luX2xpbmUoMCk7CisgICAgJHNlbGYtPm1hcmtfZGVwdGgoMCk7CisgICAgcmV0dXJuOworfQorCitzdWIgY29uc3VtZSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5wIDwgbGVuZ3RoICRzZWxmLT5pbnB1dCkgeworICAgICAgICAkc2VsZi0+Y2hhcl9wb3NpdGlvbl9pbl9saW5lKCRzZWxmLT5jaGFyX3Bvc2l0aW9uX2luX2xpbmUgKyAxKTsKKyAgICAgICAgaWYgKHN1YnN0cigkc2VsZi0+aW5wdXQsICRzZWxmLT5wLCAxKSBlcSAiXG4iKSB7CisgICAgICAgICAgICAkc2VsZi0+bGluZSgkc2VsZi0+bGluZSArIDEpOworICAgICAgICAgICAgJHNlbGYtPmNoYXJfcG9zaXRpb25faW5fbGluZSgwKTsKKyAgICAgICAgfQorICAgICAgICAkc2VsZi0+cCgkc2VsZi0+cCArIDEpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N1YiBMQSB7CisgICAgbXkgKCRzZWxmLCAkaSkgPSBAXzsKKworICAgIGlmICgkaSA9PSAwKSB7CisgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICBpZiAoJGkgPCAwKSB7CisgICAgICAgICsrJGk7ICMgZS5nLiwgdHJhbnNsYXRlIExBKC0xKSB0byB1c2Ugb2Zmc2V0IGk9MDsgdGhlbiBpbnB1dFtwKzAtMV0KKyAgICAgICAgaWYgKCRzZWxmLT5wICsgJGkgLSAxIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5FT0Y7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPnAgKyAkaSAtIDEgPj0gbGVuZ3RoICRzZWxmLT5pbnB1dCkgeworICAgICAgICByZXR1cm4gJHNlbGYtPkVPRjsKKyAgICB9CisKKyAgICByZXR1cm4gc3Vic3RyICRzZWxmLT5pbnB1dCwgJHNlbGYtPnAgKyAkaSAtIDEsIDE7Cit9CisKK3N1YiBMVCB7CisgICAgbXkgKCRzZWxmLCAkaSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+TEEoJGkpOworfQorCitzdWIgaW5kZXggeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+cDsKK30KKworc3ViIHNpemUgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiBsZW5ndGggJHNlbGYtPmlucHV0OworfQorCitzdWIgbWFyayB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgJHNlbGYtPm1hcmtfZGVwdGgoJHNlbGYtPm1hcmtfZGVwdGggKyAxKTsKKyAgICBteSAkc3RhdGU7CisgICAgaWYgKCRzZWxmLT5tYXJrX2RlcHRoID49IEB7JHNlbGYtPm1hcmtlcnN9KSB7CisgICAgICAgICRzdGF0ZSA9IEFOVExSOjpSdW50aW1lOjpDaGFyU3RyZWFtU3RhdGUtPm5ldygpOworICAgICAgICBwdXNoIEB7JHNlbGYtPm1hcmtlcnN9LCAkc3RhdGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHN0YXRlID0gJHNlbGYtPm1hcmtlcnMtPlskc2VsZi0+bWFya19kZXB0aF07CisgICAgfQorCisgICAgJHN0YXRlLT5zZXRfcCgkc2VsZi0+cCk7CisgICAgJHN0YXRlLT5zZXRfbGluZSgkc2VsZi0+bGluZSk7CisgICAgJHN0YXRlLT5zZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lKCRzZWxmLT5jaGFyX3Bvc2l0aW9uX2luX2xpbmUpOworICAgICRzZWxmLT5sYXN0X21hcmtlcigkc2VsZi0+bWFya19kZXB0aCk7CisKKyAgICByZXR1cm4gJHNlbGYtPm1hcmtfZGVwdGg7Cit9CisKK3N1YiByZXdpbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG07CisgICAgaWYgKEBfID09IDApIHsKKyAgICAgICAgJG0gPSAkc2VsZi0+bGFzdF9tYXJrZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG0gPSBzaGlmdDsKKyAgICB9CisKKyAgICBteSAkc3RhdGUgPSAkc2VsZi0+bWFya2Vycy0+WyRtXTsKKyAgICAjIHJlc3RvcmUgc3RyZWFtIHN0YXRlCisgICAgJHNlbGYtPnNlZWsoJHN0YXRlLT5nZXRfcCk7CisgICAgJHNlbGYtPmxpbmUoJHN0YXRlLT5nZXRfbGluZSk7CisgICAgJHNlbGYtPmNoYXJfcG9zaXRpb25faW5fbGluZSgkc3RhdGUtPmdldF9jaGFyX3Bvc2l0aW9uX2luX2xpbmUpOworICAgICRzZWxmLT5yZWxlYXNlKCRtKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiByZWxlYXNlIHsKKyAgICBteSAoJHNlbGYsICRtYXJrZXIpID0gQF87CisKKyAgICAjIHVud2luZCBhbnkgb3RoZXIgbWFya2VycyBtYWRlIGFmdGVyIG0gYW5kIHJlbGVhc2UgbQorICAgICRzZWxmLT5tYXJrX2RlcHRoKCRtYXJrZXIpOworICAgICMgcmVsZWFzZSB0aGlzIG1hcmtlcgorICAgICRzZWxmLT5tYXJrX2RlcHRoKCRzZWxmLT5tYXJrX2RlcHRoIC0gMSk7CisgICAgcmV0dXJuOworfQorCisjIGNvbnN1bWUoKSBhaGVhZCB1bml0IHAgPT0gaW5kZXg7IGNhbid0IGp1c3Qgc2V0IHAgPSBpbmRleCBhcyB3ZSBtdXN0IHVwZGF0ZQorIyBsaW5lIGFuZCBjaGFyX3Bvc2l0aW9uX2luX2xpbmUKK3N1YiBzZWVrIHsKKyAgICBteSAoJHNlbGYsICRpbmRleCkgPSBAXzsKKworICAgIGlmICgkaW5kZXggPD0gJHNlbGYtPnApIHsKKyAgICAgICAgIyBqdXN0IGp1bXA7IGRvbid0IHVwZGF0ZSBzdHJlYW0gc3RhdGUgKGxpbmUsIC4uLikKKyAgICAgICAgJHNlbGYtPnAoJGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICMgc2VlayBmb3J3YXJkLCBjb25zdW1lIHVudGlsIHAgaGl0cyBpbmRleAorICAgIHdoaWxlICgkc2VsZi0+cCA8ICRpbmRleCkgeworICAgICAgICAkc2VsZi0+Y29uc3VtZSgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N1YiBzdWJzdHJpbmcgeworICAgIG15ICgkc2VsZiwgJHN0YXJ0LCAkc3RvcCkgPSBAXzsKKworICAgIHJldHVybiBzdWJzdHIgJHNlbGYtPmlucHV0LCAkc3RhcnQsICRzdG9wIC0gJHN0YXJ0ICsgMTsKK30KKworc3ViIGdldF9zb3VyY2VfbmFtZSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+bmFtZTsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoKTsKKzE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9CYXNlUmVjb2duaXplci5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0Jhc2VSZWNvZ25pemVyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDZlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9CYXNlUmVjb2duaXplci5wbQpAQCAtMCwwICsxLDYxNyBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6QmFzZVJlY29nbml6ZXI7CisKK3VzZSBSZWFkb25seTsKK3VzZSBDYXJwOworCit1c2UgQU5UTFI6OlJ1bnRpbWU6OlJlY29nbml6ZXJTaGFyZWRTdGF0ZTsKK3VzZSBBTlRMUjo6UnVudGltZTo6VG9rZW47Cit1c2UgQU5UTFI6OlJ1bnRpbWU6OlVud2FudGVkVG9rZW5FeGNlcHRpb247Cit1c2UgQU5UTFI6OlJ1bnRpbWU6Ok1pc3NpbmdUb2tlbkV4Y2VwdGlvbjsKK3VzZSBBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOworCit1c2UgTW9vc2U7CisKK1JlYWRvbmx5IG15ICRNRU1PX1JVTEVfRkFJTEVEID0+IC0yOworc3ViIE1FTU9fUlVMRV9GQUlMRUQgeyAkTUVNT19SVUxFX0ZBSUxFRCB9CisKK1JlYWRvbmx5IG15ICRNRU1PX1JVTEVfVU5LTk9XTiA9PiAtMTsKK3N1YiBNRU1PX1JVTEVfVU5LTk9XTiB7ICRNRU1PX1JVTEVfVU5LTk9XTiB9CisKK1JlYWRvbmx5IG15ICRJTklUSUFMX0ZPTExPV19TVEFDS19TSVpFID0+IDEwMDsKK3N1YiBJTklUSUFMX0ZPTExPV19TVEFDS19TSVpFIHsgJElOSVRJQUxfRk9MTE9XX1NUQUNLX1NJWkUgfQorCisjIGNvcGllcyBmcm9tIFRva2VuIG9iamVjdCBmb3IgY29udmVuaWVuY2UgaW4gYWN0aW9ucworUmVhZG9ubHkgbXkgJERFRkFVTFRfVE9LRU5fQ0hBTk5FTCA9PiBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkRFRkFVTFRfQ0hBTk5FTDsKK3N1YiBERUZBVUxUX1RPS0VOX0NIQU5ORUwgeyAkREVGQVVMVF9UT0tFTl9DSEFOTkVMIH0KKworUmVhZG9ubHkgbXkgJEhJRERFTiA9PiBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkhJRERFTl9DSEFOTkVMOworc3ViIEhJRERFTiB7ICRISURERU4gfQorCitSZWFkb25seSBteSAkTkVYVF9UT0tFTl9SVUxFX05BTUUgPT4gJ25leHRfdG9rZW4nOworc3ViIE5FWFRfVE9LRU5fUlVMRV9OQU1FIHsgJE5FWFRfVE9LRU5fUlVMRV9OQU1FIH0KKworIyBTdGF0ZSBvZiBhIGxleGVyLCBwYXJzZXIsIG9yIHRyZWUgcGFyc2VyIGFyZSBjb2xsZWN0ZWQgaW50byBhIHN0YXRlCisjIG9iamVjdCBzbyB0aGUgc3RhdGUgY2FuIGJlIHNoYXJlZC4gIFRoaXMgc2hhcmluZyBpcyBuZWVkZWQgdG8KKyMgaGF2ZSBvbmUgZ3JhbW1hciBpbXBvcnQgb3RoZXJzIGFuZCBzaGFyZSBzYW1lIGVycm9yIHZhcmlhYmxlcworIyBhbmQgb3RoZXIgc3RhdGUgdmFyaWFibGVzLiAgSXQncyBhIGtpbmQgb2YgZXhwbGljaXQgbXVsdGlwbGUKKyMgaW5oZXJpdGFuY2UgdmlhIGRlbGVnYXRpb24gb2YgbWV0aG9kcyBhbmQgc2hhcmVkIHN0YXRlLgoraGFzICdzdGF0ZScgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnQU5UTFI6OlJ1bnRpbWU6OlJlY29nbml6ZXJTaGFyZWRTdGF0ZScsCisgICAgZGVmYXVsdCA9PiBzdWIgeyBBTlRMUjo6UnVudGltZTo6UmVjb2duaXplclNoYXJlZFN0YXRlLT5uZXcoKSB9LAorKTsKKworc3ViIHJlc2V0IHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICBpZiAoIWRlZmluZWQgJHNlbGYtPnN0YXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBteSAkc3RhdGUgPSAkc2VsZi0+c3RhdGU7CisgICAgJHN0YXRlLT5fZnNwKC0xKTsKKyAgICAkc3RhdGUtPmVycm9yX3JlY292ZXJ5KDApOworICAgICRzdGF0ZS0+bGFzdF9lcnJvcl9pbmRleCgtMSk7CisgICAgJHN0YXRlLT5mYWlsZWQoMCk7CisgICAgJHN0YXRlLT5zeW50YXhfZXJyb3JzKDApOworCisgICAgIyB3YWNrIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBiYWNrdHJhY2tpbmcgYW5kIG1lbW9pemF0aW9uCisgICAgJHN0YXRlLT5iYWNrdHJhY2tpbmcoMCk7CisgICAgIyB3aXBlIGNhY2hlCisgICAgJHN0YXRlLT5ydWxlX21lbW8oW10pOworfQorCitzdWIgbWF0Y2ggeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAndm9pZCBtYXRjaChJbnRTdHJlYW0gaW5wdXQsIGludCB0dHlwZSwgQml0U2V0IGZvbGxvdyknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSA0OworICAgIG15ICgkc2VsZiwgJGlucHV0LCAkdHR5cGUsICRmb2xsb3cpID0gQF87CisKKyAgICBteSAkbWF0Y2hlZF9zeW1ib2wgPSAkc2VsZi0+Z2V0X2N1cnJlbnRfaW5wdXRfc3ltYm9sKCRpbnB1dCk7CisgICAgaWYgKCRpbnB1dC0+TEEoMSkgZXEgJHR0eXBlKSB7CisgICAgICAgICRpbnB1dC0+Y29uc3VtZSgpOworICAgICAgICAkc2VsZi0+c3RhdGUtPmVycm9yX3JlY292ZXJ5KDApOworICAgICAgICAkc2VsZi0+c3RhdGUtPmZhaWxlZCgwKTsKKyAgICAgICAgcmV0dXJuICRtYXRjaGVkX3N5bWJvbDsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPnN0YXRlLT5iYWNrdHJhY2tpbmcgPiAwKSB7CisgICAgICAgICRzZWxmLT5zdGF0ZS0+ZmFpbGVkKDEpOworICAgICAgICByZXR1cm4gJG1hdGNoZWRfc3ltYm9sOworICAgIH0KKworICAgIHJldHVybiAkc2VsZi0+cmVjb3Zlcl9mcm9tX21pc21hdGNoZWRfdG9rZW4oJGlucHV0LCAkdHR5cGUsICRmb2xsb3cpOworfQorCitzdWIgbWF0Y2hfYW55IHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgbWF0Y2hfYW55KEludFN0cmVhbSBpbnB1dCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAyOworICAgIG15ICgkc2VsZiwgJGlucHV0KSA9IEBfOworCisgICAgJHNlbGYtPnN0YXRlLT5lcnJvcl9yZWNvdmVyeSgwKTsKKyAgICAkc2VsZi0+c3RhdGUtPmZhaWxlZCgwKTsKKyAgICAkaW5wdXQtPmNvbnN1bWUoKTsKK30KKworc3ViIG1pc21hdGNoX2lzX3Vud2FudGVkX3Rva2VuIHsKKyAgICBteSAoJHNlbGYsICRpbnB1dCwgJHR0eXBlKSA9IEBfOworICAgIHJldHVybiAkaW5wdXQtPkxBKDIpID09ICR0dHlwZTsKK30KKworc3ViIG1pc21hdGNoX2lzX21pc3NpbmdfdG9rZW4geworICAgIG15ICgkc2VsZiwgJGlucHV0LCAkZm9sbG93KSA9IEBfOworCisgICAgaWYgKCFkZWZpbmVkICRmb2xsb3cpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCRmb2xsb3ctPm1lbWJlcihBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPUl9UT0tFTl9UWVBFKSkgeworICAgICAgICBteSAkdmlhYmxlX3Rva2Vuc19mb2xsb3dpbmdfdGhpc19ydWxlID0gJHNlbGYtPmNvbXB1dGVfY29udGV4dF9zZW5zaXRpdmVfcnVsZV9GT0xMT1coKTsKKyAgICAgICAgJGZvbGxvdyA9ICRmb2xsb3ctPm9yKCR2aWFibGVfdG9rZW5zX2ZvbGxvd2luZ190aGlzX3J1bGUpOworICAgICAgICBpZiAoJHNlbGYtPnN0YXRlLT5fZnNwID49IDApIHsKKyAgICAgICAgICAgICRmb2xsb3ctPnJlbW92ZShBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPUl9UT0tFTl9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgkZm9sbG93LT5tZW1iZXIoJGlucHV0LT5MQSgxKSkgfHwgJGZvbGxvdy0+bWVtYmVyKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9SX1RPS0VOX1RZUEUpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3ViIG1pc21hdGNoIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgbWlzbWF0Y2goSW50U3RyZWFtIGlucHV0LCBpbnQgdHR5cGUsIEJpdFNldCBmb2xsb3cpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gNDsKKyAgICBteSAoJHNlbGYsICRpbnB1dCwgJHR0eXBlLCAkZm9sbG93KSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5taXNtYXRjaF9pc191bndhbnRlZF90b2tlbigkaW5wdXQsICR0dHlwZSkpIHsKKyAgICAgICAgQU5UTFI6OlJ1bnRpbWU6OlVud2FudGVkVG9rZW5FeGNlcHRpb24tPm5ldyh7CisgICAgICAgICAgICBleHBlY3RpbmcgPT4gJHR0eXBlLAorICAgICAgICAgICAgaW5wdXQgPT4gJGlucHV0CisgICAgICAgIH0pLT50aHJvdygpOworICAgIH0KKyAgICBlbHNpZiAoJHNlbGYtPm1pc21hdGNoX2lzX21pc3NpbmdfdG9rZW4oJGlucHV0LCAkZm9sbG93KSkgeworICAgICAgICBBTlRMUjo6UnVudGltZTo6TWlzc2luZ1Rva2VuRXhjZXB0aW9uLT5uZXcoeworICAgICAgICAgICAgZXhwZWN0aW5nID0+ICR0dHlwZSwKKyAgICAgICAgICAgIGlucHV0ID0+ICRpbnB1dAorICAgICAgICB9KS0+dGhyb3coKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFOVExSOjpSdW50aW1lOjpNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24tPm5ldyh7CisgICAgICAgICAgICBleHBlY3RpbmcgPT4gJHR0eXBlLAorICAgICAgICAgICAgaW5wdXQgPT4gJGlucHV0CisgICAgICAgIH0pLT50aHJvdygpOworICAgIH0KK30KKworc3ViIHJlcG9ydF9lcnJvciB7CisgICAgUmVhZG9ubHkgbXkgJHVzYWdlID0+ICd2b2lkIHJlcG9ydF9lcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSc7CisgICAgY3JvYWsgJHVzYWdlIGlmIEBfICE9IDI7CisgICAgbXkgKCRzZWxmLCAkZSkgPSBAXzsKKworICAgIGlmICgkc2VsZi0+c3RhdGUtPmVycm9yX3JlY292ZXJ5KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgJHNlbGYtPnN0YXRlLT5zeW50YXhfZXJyb3JzKCRzZWxmLT5zdGF0ZS0+c3ludGF4X2Vycm9ycyArIDEpOworICAgICRzZWxmLT5zdGF0ZS0+ZXJyb3JfcmVjb3ZlcnkoMSk7CisKKyAgICAkc2VsZi0+ZGlzcGxheV9yZWNvZ25pdGlvbl9lcnJvcigkc2VsZi0+Z2V0X3Rva2VuX25hbWVzKCksICRlKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBkaXNwbGF5X3JlY29nbml0aW9uX2Vycm9yIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgZGlzcGxheV9yZWNvZ25pdGlvbl9lcnJvcihTdHJpbmdbXSB0b2tlbl9uYW1lcywgUmVjb2duaXRpb25FeGNlcHRpb24gZSknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAzOworICAgIG15ICgkc2VsZiwgJHRva2VuX25hbWVzLCAkZSkgPSBAXzsKKworICAgIG15ICRoZHIgPSAkc2VsZi0+Z2V0X2Vycm9yX2hlYWRlcigkZSk7CisgICAgbXkgJG1zZyA9ICRzZWxmLT5nZXRfZXJyb3JfbWVzc2FnZSgkZSwgJHRva2VuX25hbWVzKTsKKyAgICAkc2VsZi0+ZW1pdF9lcnJvcl9tZXNzYWdlKCIkaGRyICRtc2ciKTsKK30KKworc3ViIGdldF9lcnJvcl9tZXNzYWdlIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ1N0cmluZyBnZXRfZXJyb3JfbWVzc2FnZShSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlLCBTdHJpbmdbXSB0b2tlbl9uYW1lcyknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAzOworICAgIG15ICgkc2VsZiwgJGUsICR0b2tlbl9uYW1lcykgPSBAXzsKKworICAgIGlmICgkZS0+aXNhKCdBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uJykpIHsKKyAgICAgICAgbXkgJHRva2VuX25hbWU7CisgICAgICAgIGlmICgkZS0+Z2V0X2V4cGVjdGluZyA9PSBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRikgeworICAgICAgICAgICAgJHRva2VuX25hbWUgPSAnRU9GJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0b2tlbl9uYW1lID0gJHRva2VuX25hbWVzLT5bJGUtPmdldF9leHBlY3RpbmddOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICdtaXNtYXRjaGVkIGlucHV0ICcgLiAkc2VsZi0+Z2V0X3Rva2VuX2Vycm9yX2Rpc3BsYXkoJGUtPmdldF90b2tlbikKKyAgICAgICAgICAgIC4gJyBleHBlY3RpbmcgJyAuICR0b2tlbl9uYW1lOworICAgIH0gZWxzaWYgKCRlLT5pc2EoJ0FOVExSOjpSdW50aW1lOjpNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24nKSkgeworICAgICAgICBteSAkdG9rZW5fbmFtZTsKKyAgICAgICAgaWYgKCRlLT5nZXRfZXhwZWN0aW5nID09IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GKSB7CisgICAgICAgICAgICAkdG9rZW5fbmFtZSA9ICdFT0YnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRva2VuX25hbWUgPSAkdG9rZW5fbmFtZXMtPlskZS0+Z2V0X2V4cGVjdGluZ107CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJ21pc21hdGNoZWQgdHJlZSBub2RlOiAnIC4gJGUtPm5vZGUKKyAgICAgICAgICAgIC4gJyBleHBlY3RpbmcgJyAuICR0b2tlbl9uYW1lOworICAgIH0gZWxzaWYgKCRlLT5pc2EoJ0FOVExSOjpSdW50aW1lOjpOb1ZpYWJsZUFsdEV4Y2VwdGlvbicpKSB7CisgICAgICAgIHJldHVybiAnbm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICcgLiAkc2VsZi0+Z2V0X3Rva2VuX2Vycm9yX2Rpc3BsYXkoJGUtPmdldF90b2tlbik7CisgICAgfSBlbHNpZiAoJGUtPmlzYSgnQU5UTFI6OlJ1bnRpbWU6OkVhcmx5RXhpdEV4Y2VwdGlvbicpKSB7CisgICAgICAgIHJldHVybiAncmVxdWlyZWQgKC4uLikrIGxvb3AgZGlkIG5vdCBtYXRjaCBhbnl0aGluZyBhdCBpbnB1dCAnCisgICAgICAgICAgICAuIGdldF90b2tlbl9lcnJvcl9kaXNwbGF5KCRlLT5nZXRfdG9rZW4pOworICAgIH0gZWxzaWYgKCRlLT5pc2EoJ0FOVExSOjpSdW50aW1lOjpNaXNtYXRjaGVkU2V0RXhjZXB0aW9uJykpIHsKKyAgICAgICAgcmV0dXJuICdtaXNtYXRjaGVkIGlucHV0ICcgLiAkc2VsZi0+Z2V0X3Rva2VuX2Vycm9yX2Rpc3BsYXkoJGUtPmdldF90b2tlbikKKyAgICAgICAgICAgIC4gJyBleHBlY3Rpbmcgc2V0ICcgLiAkZS0+Z2V0X2V4cGVjdGluZzsKKyAgICB9IGVsc2lmICgkZS0+aXNhKCdBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbicpKSB7CisgICAgICAgIHJldHVybiAnbWlzbWF0Y2hlZCBpbnB1dCAnIC4gJHNlbGYtPmdldF90b2tlbl9lcnJvcl9kaXNwbGF5KCRlLT5nZXRfdG9rZW4pCisgICAgICAgICAgICAuICcgZXhwZWN0aW5nIHNldCAnIC4gJGUtPmdldF9leHBlY3Rpbmc7CisgICAgfSBlbHNpZiAoJGUtPmlzYSgnQU5UTFI6OlJ1bnRpbWU6OkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbicpKSB7CisgICAgICAgIHJldHVybiAncnVsZSAnIC4gJGUtPnJ1bGVfbmFtZSAuICcgZmFpbGVkIHByZWRpY2F0ZTogeycKKyAgICAgICAgICAgIC4gJGUtPnByZWRpY2F0ZV90ZXh0IC4gJ30/JzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorfQorCitzdWIgZ2V0X251bWJlcl9vZl9zeW50YXhfZXJyb3JzIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5zdGF0ZS0+c3ludGF4X2Vycm9yczsKK30KKworc3ViIGdldF9lcnJvcl9oZWFkZXIgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAnU3RyaW5nIGdldF9lcnJvcl9oZWFkZXIoUmVjb2duaXRpb25FeGNlcHRpb24gZSknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAyOworICAgIG15ICgkc2VsZiwgJGUpID0gQF87CisKKyAgICBteSAkbGluZSA9ICRlLT5nZXRfbGluZSgpOworICAgIG15ICRjb2wgPSAkZS0+Z2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgpOworCisgICAgcmV0dXJuICJsaW5lICRsaW5lOiRjb2wiOworfQorCitzdWIgZ2V0X3Rva2VuX2Vycm9yX2Rpc3BsYXkgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAnU3RyaW5nIGdldF90b2tlbl9lcnJvcl9kaXNwbGF5KFRva2VuIHQpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMjsKKyAgICBteSAoJHNlbGYsICR0KSA9IEBfOworCisgICAgbXkgJHMgPSAkdC0+Z2V0X3RleHQoKTsKKyAgICBpZiAoIWRlZmluZWQgJHMpIHsKKyAgICAgICAgaWYgKCR0LT5nZXRfdHlwZSgpID09IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GKSB7CisgICAgICAgICAgICAkcyA9ICc8RU9GPic7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBteSAkdHR5cGUgPSAkdC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgICRzID0gIjwkdHR5cGU+IjsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzID1+IHMvXG4vXFxcXG4vZzsKKyAgICAkcyA9fiBzL1xyL1xcXFxyL2c7CisgICAgJHMgPX4gcy9cdC9cXFxcdC9nOworCisgICAgcmV0dXJuICInJHMnIjsKK30KKworc3ViIGVtaXRfZXJyb3JfbWVzc2FnZSB7CisgICAgUmVhZG9ubHkgbXkgJHVzYWdlID0+ICd2b2lkIGVtaXRfZXJyb3JfbWVzc2FnZShTdHJpbmcgbXNnKSc7CisgICAgY3JvYWsgJHVzYWdlIGlmIEBfICE9IDI7CisgICAgbXkgKCRzZWxmLCAkbXNnKSA9IEBfOworCisgICAgcHJpbnQgU1RERVJSICRtc2csICJcbiI7Cit9CisKK3N1YiByZWNvdmVyIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgcmVjb3ZlcihJbnRTdHJlYW0gaW5wdXQsIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSc7CisgICAgY3JvYWsgJHVzYWdlIGlmIEBfICE9IDM7CisgICAgbXkgKCRzZWxmLCAkaW5wdXQsICRyZSkgPSBAXzsKKworICAgIGlmICgkc2VsZi0+c3RhdGUtPmxhc3RfZXJyb3JfaW5kZXggPT0gJGlucHV0LT5pbmRleCgpKSB7CisJIyB1aCBvaCwgYW5vdGhlciBlcnJvciBhdCBzYW1lIHRva2VuIGluZGV4OyBtdXN0IGJlIGEgY2FzZQorCSMgd2hlcmUgTFQoMSkgaXMgaW4gdGhlIHJlY292ZXJ5IHRva2VuIHNldCBzbyBub3RoaW5nIGlzCisJIyBjb25zdW1lZDsgY29uc3VtZSBhIHNpbmdsZSB0b2tlbiBzbyBhdCBsZWFzdCB0byBwcmV2ZW50CisJIyBhbiBpbmZpbml0ZSBsb29wOyB0aGlzIGlzIGEgZmFpbHNhZmUuCisgICAgICAgICRpbnB1dC0+Y29uc3VtZSgpOworICAgIH0KKworICAgICRzZWxmLT5zdGF0ZS0+bGFzdF9lcnJvcl9pbmRleCgkaW5wdXQtPmluZGV4KCkpOworICAgIG15ICRmb2xsb3dfc2V0ID0gJHNlbGYtPmNvbXB1dGVfZXJyb3JfcmVjb3Zlcnlfc2V0KCk7CisgICAgJHNlbGYtPmJlZ2luX3Jlc3luYygpOworICAgICRzZWxmLT5jb25zdW1lX3VudGlsKCRpbnB1dCwgJGZvbGxvd19zZXQpOworICAgICRzZWxmLT5lbmRfcmVzeW5jKCk7Cit9CisKK3N1YiBiZWdpbl9yZXN5bmMgeworfQorCitzdWIgZW5kX3Jlc3luYyB7Cit9CisKK3N1YiBjb21wdXRlX2Vycm9yX3JlY292ZXJ5X3NldCB7CisgICAgUmVhZG9ubHkgbXkgJHVzYWdlID0+ICd2b2lkIGNvbXB1dGVfZXJyb3JfcmVjb3Zlcnlfc2V0KCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAxOworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgICRzZWxmLT5jb21iaW5lX2ZvbGxvd3MoMCk7Cit9CisKK3N1YiBjb21wdXRlX2NvbnRleHRfc2Vuc2l0aXZlX3J1bGVfRk9MTE9XIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgY29tcHV0ZV9jb250ZXh0X3NlbnNpdGl2ZV9ydWxlX0ZPTExPVygpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMTsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICAkc2VsZi0+Y29tYmluZV9mb2xsb3dzKDEpOworfQorCitzdWIgY29tYmluZV9mb2xsb3dzIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ0JpdFNldCBjb21iaW5lX2ZvbGxvd3MoYm9vbGVhbiBleGFjdCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAyOworICAgIG15ICgkc2VsZiwgJGV4YWN0KSA9IEBfOworCisgICAgbXkgJHRvcCA9ICRzZWxmLT5zdGF0ZS0+X2ZzcDsKKyAgICBteSAkZm9sbG93X3NldCA9IEFOVExSOjpSdW50aW1lOjpCaXRTZXQtPm5ldygpOworCisgICAgZm9yZWFjaCBteSAkbG9jYWxfZm9sbG93X3NldCAocmV2ZXJzZSBAeyRzZWxmLT5zdGF0ZS0+Zm9sbG93aW5nfSkgeworICAgICAgICAkZm9sbG93X3NldCB8PSAkbG9jYWxfZm9sbG93X3NldDsKKyAgICAgICAgaWYgKCRleGFjdCAmJiAkbG9jYWxfZm9sbG93X3NldC0+bWVtYmVyKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9SX1RPS0VOX1RZUEUpKSB7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgfQorICAgICMkZm9sbG93X3NldC0+cmVtb3ZlKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9SX1RPS0VOX1RZUEUpOworICAgIHJldHVybiAkZm9sbG93X3NldDsKK30KKworc3ViIHJlY292ZXJfZnJvbV9taXNtYXRjaGVkX3Rva2VuIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgcmVjb3Zlcl9mcm9tX21pc21hdGNoZWRfdG9rZW4oSW50U3RyZWFtIGlucHV0LCBpbnQgdHR5cGUsIEJpdFNldCBmb2xsb3cpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gNDsKKyAgICBteSAoJHNlbGYsICRpbnB1dCwgJHR0eXBlLCAkZm9sbG93KSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5taXNtYXRjaF9pc191bndhbnRlZF90b2tlbigkaW5wdXQsICR0dHlwZSkpIHsKKyAgICAgICAgbXkgJGV4ID0gQU5UTFI6OlJ1bnRpbWU6OlVud2FudGVkVG9rZW5FeGNlcHRpb24tPm5ldyh7CisgICAgICAgICAgICBleHBlY3RpbmcgPT4gJHR0eXBlLAorICAgICAgICAgICAgaW5wdXQgPT4gJGlucHV0CisgICAgICAgIH0pOworCisgICAgICAgICRzZWxmLT5iZWdpbl9yZXN5bmMoKTsKKyAgICAgICAgJGlucHV0LT5jb25zdW1lKCk7CisgICAgICAgICRzZWxmLT5lbmRfcmVzeW5jKCk7CisgICAgICAgICRzZWxmLT5yZXBvcnRfZXJyb3IoJGV4KTsKKworICAgICAgICBteSAkbWF0Y2hlZF9zeW1ib2wgPSAkc2VsZi0+Z2V0X2N1cnJlbnRfaW5wdXRfc3ltYm9sKCRpbnB1dCk7CisgICAgICAgICRpbnB1dC0+Y29uc3VtZSgpOworICAgICAgICByZXR1cm4gJG1hdGNoZWRfc3ltYm9sOworICAgIH0KKworICAgIGlmICgkc2VsZi0+bWlzbWF0Y2hfaXNfbWlzc2luZ190b2tlbigkaW5wdXQsICRmb2xsb3cpKSB7CisgICAgICAgIG15ICRpbnNlcnRlZCA9ICRzZWxmLT5nZXRfbWlzc2luZ19zeW1ib2woeworICAgICAgICAgICAgICAgIGlucHV0ID0+ICRpbnB1dCwKKyAgICAgICAgICAgICAgICBleHBlY3RlZF90b2tlbl90eXBlID0+ICR0dHlwZSwKKyAgICAgICAgICAgICAgICBmb2xsb3cgPT4gJGZvbGxvdywKKyAgICAgICAgfSk7CisgICAgICAgIG15ICRleCA9IEFOVExSOjpSdW50aW1lOjpNaXNzaW5nVG9rZW5FeGNlcHRpb24oeworICAgICAgICAgICAgZXhwZWN0aW5nID0+ICR0dHlwZSwKKyAgICAgICAgICAgIGlucHV0ID0+ICRpbnB1dCwKKyAgICAgICAgICAgIGluc2VydGVkID0+ICRpbnNlcnRlZCwKKyAgICAgICAgfSk7CisgICAgICAgICRzZWxmLT5yZXBvcnRfZXJyb3IoJGV4KTsKKyAgICAgICAgcmV0dXJuICRpbnNlcnRlZDsKKyAgICB9CisKKyAgICBBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLT5uZXcoeworICAgICAgICBleHBlY3RpbmcgPT4gJHR0eXBlLAorICAgICAgICBpbnB1dCA9PiAkaW5wdXQsCisgICAgfSktPnRocm93KCk7Cit9CisKK3N1YiByZWNvdmVyX2Zyb21fbWlzbWF0Y2hlZF9zZXQgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAndm9pZCByZWNvdmVyX2Zyb21fbWlzbWF0Y2hlZF9zZXQoSW50U3RyZWFtIGlucHV0LCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlLCBCaXRTZXQgZm9sbG93KSc7CisgICAgY3JvYWsgJHVzYWdlIGlmIEBfICE9IDQ7CisgICAgbXkgKCRzZWxmLCAkaW5wdXQsICRlLCAkZm9sbG93KSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5taXNtYXRjaF9pc19taXNzaW5nX3Rva2VuKCRpbnB1dCwgJGZvbGxvdykpIHsKKyAgICAgICAgJHNlbGYtPnJlcG9ydF9lcnJvcigkZSk7CisgICAgICAgIHJldHVybiAkc2VsZi0+Z2V0X21pc3Npbmdfc3ltYm9sKHsKKyAgICAgICAgICAgICAgICBpbnB1dCA9PiAkaW5wdXQsCisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0+ICRlLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Rva2VuX3R5cGUgPT4gQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5JTlZBTElEX1RPS0VOX1RZUEUsCisgICAgICAgICAgICAgICAgZm9sbG93ID0+ICRmb2xsb3csCisgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICAkZS0+dGhyb3coKTsKK30KKworc3ViIHJlY292ZXJfZnJvbV9taXNtYXRjaGVkX2VsZW1lbnQgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAnYm9vbGVhbiByZWNvdmVyX2Zyb21fbWlzbWF0Y2hlZF9lbGVtZW50KEludFN0cmVhbSBpbnB1dCwgUmVjb2duaXRpb25FeGNlcHRpb24gZSwgQml0U2V0IGZvbGxvdyknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSA0OworICAgIG15ICgkc2VsZiwgJGlucHV0LCAkZSwgJGZvbGxvdykgPSBAXzsKKworICAgIHJldHVybiAwIGlmICghZGVmaW5lZCAkZm9sbG93KTsKKworICAgIGlmICgkZm9sbG93LT5tZW1iZXIoQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5FT1JfVE9LRU5fVFlQRSkpIHsKKyAgICAgICAgbXkgJHZpYWJsZV90b2tlbnNfZm9sbG93aW5nX3RoaXNfcnVsZSA9ICRzZWxmLT5jb21wdXRlX2NvbnRleHRfc2Vuc2l0aXZlX3J1bGVfRk9MTE9XKCk7CisgICAgICAgICRmb2xsb3cgfD0gJHZpYWJsZV90b2tlbnNfZm9sbG93aW5nX3RoaXNfcnVsZTsKKyAgICAgICAgJGZvbGxvdy0+cmVtb3ZlKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9SX1RPS0VOX1RZUEUpOworICAgIH0KKworICAgIGlmICgkZm9sbG93LT5tZW1iZXIoJGlucHV0LT5MQSgxKSkpIHsKKyAgICAgICAgJHNlbGYtPnJlcG9ydF9lcnJvcigkZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdWIgZ2V0X2N1cnJlbnRfaW5wdXRfc3ltYm9sIHsKKyAgICBteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBnZXRfbWlzc2luZ19zeW1ib2wgeworICAgIG15ICgkc2VsZiwgJGFyZ19yZWYpID0gQF87CisgICAgbXkgJGlucHV0ID0gJGFyZ19yZWYtPntpbnB1dH07CisgICAgbXkgJGV4Y2VwdGlvbiA9ICRhcmdfcmVmLT57ZXhjZXB0aW9ufTsKKyAgICBteSAkZXhwZWN0ZWRfdG9rZW5fdHlwZSA9ICRhcmdfcmVmLT57ZXhwZWN0ZWRfdG9rZW5fdHlwZX07CisgICAgbXkgJGZvbGxvdyA9ICRhcmdfcmVmLT57Zm9sbG93fTsKKworICAgIHJldHVybiB1bmRlZjsKK30KKworc3ViIGNvbnN1bWVfdW50aWwgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAndm9pZCBjb25zdW1lX3VudGlsKEludFN0cmVhbSBpbnB1dCwgKGludCB0b2tlbl90eXBlIHwgQml0U2V0IHNldCkpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMzsKKworICAgIGlmICgkX1syXS0+aXNhKCdBTlRMUjo6UnVudGltZTo6Qml0U2V0JykpIHsKKyAgICAgICAgbXkgKCRzZWxmLCAkaW5wdXQsICRzZXQpID0gQF87CisKKyAgICAgICAgbXkgJHR0eXBlID0gJGlucHV0LT5MQSgxKTsKKyAgICAgICAgd2hpbGUgKCR0dHlwZSAhPSBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRiAmJiAhJHNldC0+bWVtYmVyKCR0dHlwZSkpIHsKKyAgICAgICAgICAgICRpbnB1dC0+Y29uc3VtZSgpOworICAgICAgICAgICAgJHR0eXBlID0gJGlucHV0LT5MQSgxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG15ICgkc2VsZiwgJGlucHV0LCAkdG9rZW5fdHlwZSkgPSBAXzsKKworICAgICAgICBteSAkdHR5cGUgPSAkaW5wdXQtPkxBKDEpOworICAgICAgICB3aGlsZSAoJHR0eXBlICE9IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GICYmICR0dHlwZSAhPSAkdG9rZW5fdHlwZSkgeworICAgICAgICAgICAgJGlucHV0LT5jb25zdW1lKCk7CisgICAgICAgICAgICAkdHR5cGUgPSAkaW5wdXQtPkxBKDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdWIgcHVzaF9mb2xsb3cgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAndm9pZCBwdXNoX2ZvbGxvdyhCaXRTZXQgZnNldCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAyOworICAgIG15ICgkc2VsZiwgJGZzZXQpID0gQF87CisKKyAgICBwdXNoIEB7JHNlbGYtPnN0YXRlLT5mb2xsb3dpbmd9LCAkZnNldDsKKyAgICAkc2VsZi0+c3RhdGUtPl9mc3AoJHNlbGYtPnN0YXRlLT5fZnNwICsgMSk7Cit9CisKK3N1YiBnZXRfcnVsZV9pbnZvY2F0aW9uX3N0YWNrIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ0xpc3QgZ2V0X3J1bGVfaW52b2NhdGlvbl9zdGFjaygpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMTsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICBteSAkcnVsZXMgPSBbXTsKKyAgICBmb3IgKG15ICRpID0gMDsgOyArKyRpKSB7CisgICAgICAgIG15IEBmcmFtZSA9IGNhbGxlciAkaTsKKyAgICAgICAgbGFzdCBpZiAhQGZyYW1lOworCisgICAgICAgIG15ICgkcGFja2FnZSwgJGZpbGVuYW1lLCAkbGluZSwgJHN1YnJvdXRpbmUpID0gQGZyYW1lOworCisgICAgICAgIGlmICgkcGFja2FnZSA9fiAvXkFOVExSOjpSdW50aW1lOjovKSB7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRzdWJyb3V0aW5lIGVxIE5FWFRfVE9LRU5fUlVMRV9OQU1FKSB7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRwYWNrYWdlIG5lIHJlZiAkc2VsZikgeworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1c2ggQHskcnVsZXN9LCAkc3Vicm91dGluZTsKKyAgICB9Cit9CisKK3N1YiBnZXRfYmFja3RyYWNraW5nX2xldmVsIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ2ludCBnZXRfYmFja3RyYWNraW5nX2xldmVsKCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAxOworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+c3RhdGUtPmJhY2t0cmFja2luZzsKK30KKworc3ViIHNldF9iYWNrdHJhY2tpbmdfbGV2ZWwgeworICAgIG15ICgkc2VsZiwgJG4pID0gQF87CisgICAgJHNlbGYtPnN0YXRlLT5iYWNrdHJhY2tpbmcoJG4pOworfQorCitzdWIgZmFpbGVkIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5zdGF0ZS0+ZmFpbGVkOworfQorCitzdWIgZ2V0X3Rva2VuX25hbWVzIHsKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBnZXRfZ3JhbW1hcl9maWxlX25hbWUgeworICAgIHJldHVybiB1bmRlZjsKK30KKworc3ViIHRvX3N0cmluZ3MgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAnTGlzdCB0b19zdHJpbmdzKExpc3QgdG9rZW5zKSc7CisgICAgY3JvYWsgJHVzYWdlIGlmIEBfICE9IDI7CisgICAgbXkgKCRzZWxmLCAkdG9rZW5zKSA9IEBfOworCisgICAgaWYgKCFkZWZpbmVkICR0b2tlbnMpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworICAgIHJldHVybiBtYXAgeyAkXy0+Z2V0X3RleHQoKSB9IEB7JHRva2Vuc307Cit9CisKK3N1YiBnZXRfcnVsZV9tZW1vaXphdGlvbiB7CisgICAgUmVhZG9ubHkgbXkgJHVzYWdlID0+ICdpbnQgZ2V0X3J1bGVfbWVtb2l6YXRpb24oaW50IHJ1bGVfaW5kZXgsIGludCBydWxlX3N0YXJ0X2luZGV4KSc7CisgICAgY3JvYWsgJHVzYWdlIGlmIEBfICE9IDM7CisgICAgbXkgKCRzZWxmLCAkcnVsZV9pbmRleCwgJHJ1bGVfc3RhcnRfaW5kZXgpID0gQF87CisKKyAgICBpZiAoIWRlZmluZWQgJHNlbGYtPnJ1bGVfbWVtby0+WyRydWxlX2luZGV4XSkgeworICAgICAgICAkc2VsZi0+cnVsZV9tZW1vLT5bJHJ1bGVfaW5kZXhdID0ge307CisgICAgfQorCisgICAgbXkgJHN0b3BfaW5kZXggPSAkc2VsZi0+c3RhdGUtPnJ1bGVfbWVtby0+WyRydWxlX2luZGV4XS0+eyRydWxlX3N0YXJ0X2luZGV4fTsKKyAgICBpZiAoIWRlZmluZWQgJHN0b3BfaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5NRU1PX1JVTEVfVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuICRzdG9wX2luZGV4OworfQorCitzdWIgYWxyZWR5X3BhcnNlZF9ydWxlIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ2Jvb2xlYW4gYWxyZWR5X3BhcnNlZF9ydWxlKEludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVfaW5kZXgpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMzsKKyAgICBteSAoJHNlbGYsICRpbnB1dCwgJHJ1bGVfaW5kZXgpID0gQF87CisKKyAgICBteSAkc3RvcF9pbmRleCA9ICRzZWxmLT5nZXRfcnVsZV9tZW1vaXphdGlvbigkcnVsZV9pbmRleCwgJGlucHV0LT5pbmRleCgpKTsKKyAgICBpZiAoJHN0b3BfaW5kZXggPT0gJHNlbGYtPk1FTU9fUlVMRV9VTktOT1dOKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgkc3RvcF9pbmRleCA9PSAkc2VsZi0+TUVNT19SVUxFX0ZBSUxFRCkgeworICAgICAgICAkc2VsZi0+c3RhdGUtPmZhaWxlZCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkaW5wdXQtPnNlZWsoJHN0b3BfaW5kZXggKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBtZW1vaXplIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgbWVtb2l6ZShJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlX2luZGV4LCBpbnQgcnVsZV9zdGFydF9pbmRleCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSA0OworICAgIG15ICgkc2VsZiwgJGlucHV0LCAkcnVsZV9pbmRleCwgJHJ1bGVfc3RhcnRfaW5kZXgpID0gQF87CisKKyAgICBteSAkc3RvcF90b2tlbl9pbmRleCA9ICRzZWxmLT5zdGF0ZS0+ZmFpbGVkID8gJHNlbGYtPk1FTU9fUlVMRV9GQUlMRUQgOiAkaW5wdXQtPmluZGV4KCkgLSAxOworICAgIGlmIChkZWZpbmVkICRzZWxmLT5zdGF0ZS0+cnVsZV9tZW1vLT5bJHJ1bGVfaW5kZXhdKSB7CisgICAgICAgICRzZWxmLT5zdGF0ZS0+cnVsZV9tZW1vLT5bJHJ1bGVfaW5kZXhdLT57JHJ1bGVfc3RhcnRfaW5kZXh9ID0gJHN0b3BfdG9rZW5faW5kZXg7CisgICAgfQorfQorCitzdWIgZ2V0X3J1bGVfbWVtb2l6YXRpb25fY2FjaGVfc2l6ZSB7CisgICAgUmVhZG9ubHkgbXkgJHVzYWdlID0+ICdpbnQgZ2V0X3J1bGVfbWVtb2l6YXRpb25fY2FjaGVfc2l6ZSgpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMTsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICBteSAkbiA9IDA7CisgICAgZm9yZWFjaCBteSAkbSAoQHskc2VsZi0+c3RhdGUtPnJ1bGVfbWVtb30pIHsKKyAgICAgICAgJG4gKz0ga2V5cyAleyRtfSBpZiBkZWZpbmVkICRtOworICAgIH0KKworICAgIHJldHVybiAkbjsKK30KKworc3ViIHRyYWNlX2luIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgdHJhY2VfaW4oU3RyaW5nIHJ1bGVfbmFtZSwgaW50IHJ1bGVfaW5kZXgsIGlucHV0X3N5bWJvbCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSA0OworICAgIG15ICgkc2VsZiwgJHJ1bGVfbmFtZSwgJHJ1bGVfaW5kZXgsICRpbnB1dF9zeW1ib2wpID0gQF87CisKKyAgICBwcmludCAiZW50ZXIgJHJ1bGVfbmFtZSAkaW5wdXRfc3ltYm9sIjsKKyAgICBpZiAoJHNlbGYtPnN0YXRlLT5mYWlsZWQpIHsKKyAgICAgICAgcHJpbnQgJyBmYWlsZWQ9JywgJHNlbGYtPnN0YXRlLT5mYWlsZWQ7CisgICAgfQorICAgIGlmICgkc2VsZi0+c3RhdGUtPmJhY2t0cmFja2luZyA+IDApIHsKKyAgICAgICAgcHJpbnQgJyBiYWNrdHJhY2tpbmc9JywgJHNlbGYtPnN0YXRlLT5iYWNrdHJhY2tpbmc7CisgICAgfQorICAgIHByaW50ICJcbiI7Cit9CisKK3N1YiB0cmFjZV9vdXQgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAndm9pZCB0cmFjZV9vdXQoU3RyaW5nIHJ1bGVfbmFtZSwgaW50IHJ1bGVfaW5kZXgsIGlucHV0X3N5bWJvbCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSA0OworICAgIG15ICgkc2VsZiwgJHJ1bGVfbmFtZSwgJHJ1bGVfaW5kZXgsICRpbnB1dF9zeW1ib2wpID0gQF87CisKKyAgICBwcmludCAiZXhpdCAkcnVsZV9uYW1lICRpbnB1dF9zeW1ib2wiOworICAgIGlmICgkc2VsZi0+c3RhdGUtPmZhaWxlZCkgeworICAgICAgICBwcmludCAnIGZhaWxlZD0nLCAkc2VsZi0+c3RhdGUtPmZhaWxlZDsKKyAgICB9CisgICAgaWYgKCRzZWxmLT5zdGF0ZS0+YmFja3RyYWNraW5nID4gMCkgeworICAgICAgICBwcmludCAnIGJhY2t0cmFja2luZz0nLCAkc2VsZi0+c3RhdGUtPmJhY2t0cmFja2luZzsKKyAgICB9CisgICAgcHJpbnQgIlxuIjsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoKTsKKzE7CitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK0FOVExSOjpSdW50aW1lOjpCYXNlUmVjb2duaXplcgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQSBnZW5lcmljIHJlY29nbml6ZXIgdGhhdCBjYW4gaGFuZGxlIHJlY29nbml6ZXJzIGdlbmVyYXRlZCBmcm9tCitsZXhlciwgcGFyc2VyLCBhbmQgdHJlZSBncmFtbWFycy4gIFRoaXMgaXMgYWxsIHRoZSBwYXJzaW5nCitzdXBwb3J0IGNvZGUgZXNzZW50aWFsbHk7IG1vc3Qgb2YgaXQgaXMgZXJyb3IgcmVjb3Zlcnkgc3R1ZmYgYW5kCitiYWNrdHJhY2tpbmcuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9CaXRTZXQucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9CaXRTZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NmYzNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0JpdFNldC5wbQpAQCAtMCwwICsxLDM0NiBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6Qml0U2V0OworCit1c2UgQ2FycDsKK3VzZSBSZWFkb25seTsKK3VzZSBMaXN0OjpVdGlsIHF3KCBtYXggKTsKKwordXNlIE1vb3NlOwordXNlIE1vb3NlOjpVdGlsOjpUeXBlQ29uc3RyYWludHM7CisKK3VzZSBvdmVybG9hZAorICAgICd8PScgPT4gXCZvcl9pbl9wbGFjZSwKKyAgICAnIiInID0+IFwmc3RyOworCisjIG51bWJlciBvZiBiaXRzIC8gbG9uZworUmVhZG9ubHkgbXkgJEJJVFMgPT4gNjQ7CitzdWIgQklUUyB7IHJldHVybiAkQklUUyB9CisKKyMgMl42ID09IDY0CitSZWFkb25seSBteSAkTE9HX0JJVFMgPT4gNjsKK3N1YiBMT0dfQklUUyB7IHJldHVybiAkTE9HX0JJVFMgfQorCisjIFdlIHdpbGwgb2Z0ZW4gbmVlZCB0byBkbyBhIG1vZCBvcGVyYXRvciAoaSBtb2QgbmJpdHMpLiAgSXRzCisjIHR1cm5zIG91dCB0aGF0LCBmb3IgcG93ZXJzIG9mIHR3bywgdGhpcyBtb2Qgb3BlcmF0aW9uIGlzCisjIHNhbWUgYXMgKGkgJiAobmJpdHMtMSkpLiAgU2luY2UgbW9kIGlzIHNsb3csIHdlIHVzZSBhCisjIHByZWNvbXB1dGVkIG1vZCBtYXNrIHRvIGRvIHRoZSBtb2QgaW5zdGVhZC4KK1JlYWRvbmx5IG15ICRNT0RfTUFTSyA9PiBCSVRTIC0gMTsKK3N1YiBNT0RfTUFTSyB7IHJldHVybiAkTU9EX01BU0sgfQorCisjIFRoZSBhY3R1YWwgZGF0YSBiaXQKK2hhcyAnYml0cycgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiBzdWJ0eXBlICdTdHInID0+IHdoZXJlIHsgL14oPzowfDEpKiQveG1zIH0sCispOworCitzdWIgdHJpbV9oZXggeworICAgIG15ICgkbnVtYmVyKSA9IEBfOworCisgICAgJG51bWJlciA9fiBzL14weC8veG1zOworCisgICAgcmV0dXJuICRudW1iZXI7Cit9CisKK3N1YiBCVUlMRCB7CisgICAgbXkgKCRzZWxmLCAkYXJncykgPSBAXzsKKworICAgIG15ICRiaXRzOworICAgIGlmICghJSRhcmdzKSB7ICAjIyBubyBjcml0aWMgKENvbnRyb2xTdHJ1Y3R1cmVzOjpQcm9oaWJpdENhc2NhZGluZ0lmRWxzZSkKKyAgICAgICAgIyBDb25zdHJ1Y3QgYSBiaXRzZXQgb2Ygc2l6ZSBvbmUgd29yZCAoNjQgYml0cykKKyAgICAgICAgJGJpdHMgPSAnMCcgeCBCSVRTOworICAgIH0KKyAgICBlbHNpZiAoZXhpc3RzICRhcmdzLT57Yml0c30pIHsKKyAgICAgICAgJGJpdHMgPSAkYXJncy0+e2JpdHN9OworICAgIH0KKyAgICBlbHNpZiAoZXhpc3RzICRhcmdzLT57bnVtYmVyfSkgeworICAgICAgICAkYml0cyA9IHJldmVyc2UgdW5wYWNrKCdCKicsIHBhY2soJ04nLCAkYXJncy0+e251bWJlcn0pKTsKKyAgICB9CisgICAgZWxzaWYgKGV4aXN0cyAkYXJncy0+e3dvcmRzNjR9KSB7CisgICAgICAgICMgQ29uc3RydWN0aW9uIGZyb20gYSBzdGF0aWMgYXJyYXkgb2YgbG9uZ3MKKyAgICAgICAgbXkgJHdvcmRzNjQgPSAkYXJncy0+e3dvcmRzNjR9OworCisgICAgICAgICMgJG51bWJlciBpcyBpbiBoZXggZm9ybWF0CisgICAgICAgIG15ICRudW1iZXIgPSBqb2luICcnLAorICAgICAgICAgICAgbWFwIHsgdHJpbV9oZXgoJF8pIH0KKyAgICAgICAgICAgIHJldmVyc2UgQCR3b3JkczY0OworCisgICAgICAgICRiaXRzID0gJyc7CisgICAgICAgIGZvcmVhY2ggbXkgJGggKHNwbGl0IC8veG1zLCByZXZlcnNlICRudW1iZXIpIHsKKyAgICAgICAgICAgICRiaXRzIC49IHJldmVyc2Ugc3Vic3RyKHVucGFjaygnQionLCBwYWNrKCdoJywgaGV4ICRoKSksIDQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2lmIChleGlzdHMgJGFyZ3MtPnsnJ30pIHsKKyAgICAgICAjIENvbnN0cnVjdGlvbiBmcm9tIGEgbGlzdCBvZiBpbnRlZ2VycworICAgIH0KKyAgICBlbHNpZiAoZXhpc3RzICRhcmdzLT57c2l6ZX0pIHsKKyAgICAgICAgIyBDb25zdHJ1Y3QgYSBiaXRzZXQgZ2l2ZW4gdGhlIHNpemUKKyAgICAgICAgJGJpdHMgPSAnMCcgeCAkYXJncy0+e3NpemV9OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY3JvYWsgJ0ludmFsaWQgYXJndW1lbnQnOworICAgIH0KKworICAgICRzZWxmLT5iaXRzKCRiaXRzKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBvZiB7CisgICAgbXkgKCRjbGFzcywgJGVsKSA9IEBfOworCisgICAgbXkgJGJzID0gQU5UTFI6OlJ1bnRpbWU6OkJpdFNldC0+bmV3KHsgc2l6ZSA9PiAkZWwgKyAxIH0pOworICAgICRicy0+YWRkKCRlbCk7CisKKyAgICByZXR1cm4gJGJzOworfQorCitzdWIgb3IgOiBtZXRob2QgeyAgIyMgbm8gY3JpdGljIChTdWJyb3V0aW5lczo6UHJvaGliaXRCdWlsdGluSG9tb255bXMpCisgICAgbXkgKCRzZWxmLCAkYSkgPSBAXzsKKworICAgIGlmICghZGVmaW5lZCAkYSkgeworICAgICAgICByZXR1cm4gJHNlbGY7CisgICAgfQorCisgICAgbXkgJHMgPSAkc2VsZi0+Y2xvbmUoKTsKKyAgICAkcy0+b3JfaW5fcGxhY2UoJGEpOworICAgIHJldHVybiAkczsKK30KKworc3ViIGFkZCA6IG1ldGhvZCB7CisgICAgbXkgKCRzZWxmLCAkZWwpID0gQF87CisKKyAgICAkc2VsZi0+Z3Jvd190b19pbmNsdWRlKCRlbCk7CisgICAgbXkgJGJpdHMgPSAkc2VsZi0+Yml0czsKKyAgICBzdWJzdHIoJGJpdHMsICRlbCwgMSwgJzEnKTsKKyAgICAkc2VsZi0+Yml0cygkYml0cyk7CisKKyAgICByZXR1cm47Cit9CisKK3N1YiBncm93X3RvX2luY2x1ZGUgOiBtZXRob2QgeworICAgIG15ICgkc2VsZiwgJGJpdCkgPSBAXzsKKworICAgIGlmICgkYml0ID4gbGVuZ3RoICRzZWxmLT5iaXRzKSB7CisgICAgICAgICRzZWxmLT5iaXRzIC49ICcwJyB4ICgkYml0IC0gKGxlbmd0aCAkc2VsZi0+Yml0cykgKyAxKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N1YiBvcl9pbl9wbGFjZSA6IG1ldGhvZCB7CisgICAgbXkgKCRzZWxmLCAkYSkgPSBAXzsKKworICAgIG15ICRpID0gMDsKKyAgICBmb3JlYWNoIG15ICRiIChzcGxpdCAvL3htcywgJGEtPmJpdHMpIHsKKyAgICAgICAgaWYgKCRiKSB7CisgICAgICAgICAgICAkc2VsZi0+YWRkKCRpKTsKKyAgICAgICAgfQorICAgIH0gY29udGludWUgeworICAgICAgICArKyRpOworICAgIH0KKworICAgIHJldHVybiAkc2VsZjsKK30KKworc3ViIGNsb25lIDogbWV0aG9kIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICByZXR1cm4gQU5UTFI6OlJ1bnRpbWU6OkJpdFNldC0+bmV3KGJpdHMgPT4gJHNlbGYtPmJpdHMpOworfQorCitzdWIgc2l6ZSA6IG1ldGhvZCB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgcmV0dXJuIHNjYWxhciAkc2VsZi0+Yml0cyA9fiAvMS94bXM7Cit9CisKK3N1YiBlcXVhbHMgOiBtZXRob2QgeworICAgIG15ICgkc2VsZiwgJG90aGVyKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT5iaXRzIGVxICRvdGhlci0+Yml0czsKK30KKworc3ViIG1lbWJlciA6IG1ldGhvZCB7CisgICAgbXkgKCRzZWxmLCAkZWwpID0gQF87CisKKyAgICByZXR1cm4gKHN1YnN0ciAkc2VsZi0+Yml0cywgJGVsLCAxKSBlcSAnMSc7Cit9CisKK3N1YiByZW1vdmUgOiBtZXRob2QgeworICAgIG15ICgkc2VsZiwgJGVsKSA9IEBfOworCisgICAgbXkgJGJpdHMgPSAkc2VsZi0+Yml0czsKKyAgICBzdWJzdHIoJGJpdHMsICRlbCwgMSwgJzAnKTsKKyAgICAkc2VsZi0+Yml0cygkYml0cyk7CisKKyAgICByZXR1cm47Cit9CisKK3N1YiBpc19uaWwgOiBtZXRob2QgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+Yml0cyA9fiAvMS94bXMgPyAxIDogMDsKK30KKworc3ViIG51bV9iaXRzIDogbWV0aG9kIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuIGxlbmd0aCAkc2VsZi0+Yml0czsKK30KKworc3ViIGxlbmd0aF9pbl9sb25nX3dvcmRzIDogbWV0aG9kIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5udW1fYml0cygpIC8gJHNlbGYtPkJJVFM7Cit9CisKK3N1YiB0b19hcnJheSA6IG1ldGhvZCB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgbXkgJGVsZW1zID0gW107CisKKyAgICB3aGlsZSAoJHNlbGYtPmJpdHMgPX4gLzEvZ3htcykgeworICAgICAgICBwdXNoIEAkZWxlbXMsICQtWzBdOworICAgIH0KKworICAgIHJldHVybiAkZWxlbXM7Cit9CisKK3N1YiB0b19wYWNrZWRfYXJyYXkgOiBtZXRob2QgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiBbCisgICAgICAgICRzZWxmLT5iaXRzID1+IC8ue0JJVFN9L2d4bXMKKyAgICBdOworfQorCitzdWIgc3RyIDogbWV0aG9kIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPnRvX3N0cmluZygpOworfQorCitzdWIgdG9fc3RyaW5nIDogbWV0aG9kIHsKKyAgICBteSAoJHNlbGYsICRhcmdzKSA9IEBfOworCisgICAgbXkgJHRva2VuX25hbWVzOworICAgIGlmIChkZWZpbmVkICRhcmdzICYmIGV4aXN0cyAkYXJncy0+e3Rva2VuX25hbWVzfSkgeworICAgICAgICAkdG9rZW5fbmFtZXMgPSAkYXJncy0+e3Rva2VuX25hbWVzfTsKKyAgICB9CisKKyAgICBteSBAc3RyOworICAgIG15ICRpID0gMDsKKyAgICBmb3JlYWNoIG15ICRiIChzcGxpdCAvL3htcywgJHNlbGYtPmJpdHMpIHsKKyAgICAgICAgaWYgKCRiKSB7CisgICAgICAgICAgICBpZiAoZGVmaW5lZCAkdG9rZW5fbmFtZXMpIHsKKyAgICAgICAgICAgICAgICBwdXNoIEBzdHIsICR0b2tlbl9uYW1lcy0+WyRpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHVzaCBAc3RyLCAkaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gY29udGludWUgeworICAgICAgICArKyRpOworICAgIH0KKworICAgIHJldHVybiAneycgLiAoam9pbiAnLCcsIEBzdHIpIC4gJ30nOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitBTlRMUjo6UnVudGltZTo6Qml0U2V0IC0gQSBiaXQgc2V0CisKKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgPE1vZHVsZTo6TmFtZT47CisgICAgIyBCcmllZiBidXQgd29ya2luZyBjb2RlIGV4YW1wbGUocykgaGVyZSBzaG93aW5nIHRoZSBtb3N0IGNvbW1vbiB1c2FnZShzKQorCisgICAgIyBUaGlzIHNlY3Rpb24gd2lsbCBiZSBhcyBmYXIgYXMgbWFueSB1c2VycyBib3RoZXIgcmVhZGluZworICAgICMgc28gbWFrZSBpdCBhcyBlZHVjYXRpb25hbCBhbmQgZXhlbXBsYXJ5IGFzIHBvc3NpYmxlLgorCisKKz1oZWFkMSBERVNDUklQVElPTgorCitBIHN0cmlwcGVkLWRvd24gdmVyc2lvbiBvZiBvcmcuYW50bHIubWlzYy5CaXRTZXQgdGhhdCBpcyBqdXN0IGdvb2QgZW5vdWdoIHRvCitoYW5kbGUgcnVudGltZSByZXF1aXJlbWVudHMgc3VjaCBhcyBGT0xMT1cgc2V0cyBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5LgorCisKKz1oZWFkMSBTVUJST1VUSU5FUy9NRVRIT0RTCisKKz1vdmVyCisKKz1pdGVtIEM8b2Y+CisKKy4uLgorCis9aXRlbSBDPG9yPgorCitSZXR1cm4gdGhpcyB8IGEgaW4gYSBuZXcgc2V0LgorCis9aXRlbSBDPGFkZD4KKworT3IgdGhpcyBlbGVtZW50IGludG8gdGhpcyBzZXQgKGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlKS4KKworPWl0ZW0gQzxncm93X3RvX2luY2x1ZGU+CisKK0dyb3dzIHRoZSBzZXQgdG8gYSBsYXJnZXIgbnVtYmVyIG9mIGJpdHMuCisKKz1pdGVtIEM8c2V0X3NpemU+CisKK1NldHMgdGhlIHNpemUgb2YgYSBzZXQuCisKKz1pdGVtIEM8cmVtb3ZlPgorCitSZW1vdmUgdGhpcyBlbGVtZW50IGZyb20gdGhpcyBzZXQuCisKKz1pdGVtIEM8bGVuZ3RoX2luX2xvbmdfd29yZHM+CisKK1JldHVybiBob3cgbXVjaCBzcGFjZSBpcyBiZWluZyB1c2VkIGJ5IHRoZSBiaXRzIGFycmF5IG5vdCBob3cgbWFueSBhY3R1YWxseQoraGF2ZSBtZW1iZXIgYml0cyBvbi4KKworPWJhY2sKKworQSBzZXBhcmF0ZSBzZWN0aW9uIGxpc3RpbmcgdGhlIHB1YmxpYyBjb21wb25lbnRzIG9mIHRoZSBtb2R1bGUncyBpbnRlcmZhY2UuCitUaGVzZSBub3JtYWxseSBjb25zaXN0IG9mIGVpdGhlciBzdWJyb3V0aW5lcyB0aGF0IG1heSBiZSBleHBvcnRlZCwgb3IgbWV0aG9kcwordGhhdCBtYXkgYmUgY2FsbGVkIG9uIG9iamVjdHMgYmVsb25naW5nIHRvIHRoZSBjbGFzc2VzIHRoYXQgdGhlIG1vZHVsZSBwcm92aWRlcy4KK05hbWUgdGhlIHNlY3Rpb24gYWNjb3JkaW5nbHkuCisKK0luIGFuIG9iamVjdC1vcmllbnRlZCBtb2R1bGUsIHRoaXMgc2VjdGlvbiBzaG91bGQgYmVnaW4gd2l0aCBhIHNlbnRlbmNlIG9mIHRoZQorZm9ybSAiQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cy4uLiIsIHRvIGdpdmUgdGhlIHJlYWRlciBhIGhpZ2gtbGV2ZWwKK2NvbnRleHQgdG8gaGVscCB0aGVtIHVuZGVyc3RhbmQgdGhlIG1ldGhvZHMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IGRlc2NyaWJlZC4KKworCis9aGVhZDEgRElBR05PU1RJQ1MKKworQSBsaXN0IG9mIGV2ZXJ5IGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2UgdGhhdCB0aGUgbW9kdWxlIGNhbiBnZW5lcmF0ZQorKGV2ZW4gdGhlIG9uZXMgdGhhdCB3aWxsICJuZXZlciBoYXBwZW4iKSwgd2l0aCBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgZWFjaAorcHJvYmxlbSwgb25lIG9yIG1vcmUgbGlrZWx5IGNhdXNlcywgYW5kIGFueSBzdWdnZXN0ZWQgcmVtZWRpZXMuCisoU2VlIGFsc28gIkRvY3VtZW50aW5nIEVycm9ycyIgaW4gQ2hhcHRlciAxMy4pCisKKworPWhlYWQxIENPTkZJR1VSQVRJT04gQU5EIEVOVklST05NRU5UCisKK0EgZnVsbCBleHBsYW5hdGlvbiBvZiBhbnkgY29uZmlndXJhdGlvbiBzeXN0ZW0ocykgdXNlZCBieSB0aGUgbW9kdWxlLAoraW5jbHVkaW5nIHRoZSBuYW1lcyBhbmQgbG9jYXRpb25zIG9mIGFueSBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgdGhlCittZWFuaW5nIG9mIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQuIFRoZXNlCitkZXNjcmlwdGlvbnMgbXVzdCBhbHNvIGluY2x1ZGUgZGV0YWlscyBvZiBhbnkgY29uZmlndXJhdGlvbiBsYW5ndWFnZSB1c2VkLgorKFNlZSBhbHNvICJDb25maWd1cmF0aW9uIEZpbGVzIiBpbiBDaGFwdGVyIDE5LikKKworCis9aGVhZDEgREVQRU5ERU5DSUVTCisKK0EgbGlzdCBvZiBhbGwgdGhlIG90aGVyIG1vZHVsZXMgdGhhdCB0aGlzIG1vZHVsZSByZWxpZXMgdXBvbiwgaW5jbHVkaW5nIGFueQorcmVzdHJpY3Rpb25zIG9uIHZlcnNpb25zLCBhbmQgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZXNlIHJlcXVpcmVkIG1vZHVsZXMgYXJlCitwYXJ0IG9mIHRoZSBzdGFuZGFyZCBQZXJsIGRpc3RyaWJ1dGlvbiwgcGFydCBvZiB0aGUgbW9kdWxlJ3MgZGlzdHJpYnV0aW9uLAorb3IgbXVzdCBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseS4KKworCis9aGVhZDEgSU5DT01QQVRJQklMSVRJRVMKKworQSBsaXN0IG9mIGFueSBtb2R1bGVzIHRoYXQgdGhpcyBtb2R1bGUgY2Fubm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aC4KK1RoaXMgbWF5IGJlIGR1ZSB0byBuYW1lIGNvbmZsaWN0cyBpbiB0aGUgaW50ZXJmYWNlLCBvciBjb21wZXRpdGlvbiBmb3IKK3N5c3RlbSBvciBwcm9ncmFtIHJlc291cmNlcywgb3IgZHVlIHRvIGludGVybmFsIGxpbWl0YXRpb25zIG9mIFBlcmwKKyhmb3IgZXhhbXBsZSwgbWFueSBtb2R1bGVzIHRoYXQgdXNlIHNvdXJjZSBjb2RlIGZpbHRlcnMgYXJlIG11dHVhbGx5CitpbmNvbXBhdGlibGUpLgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQ2hhclN0cmVhbS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0NoYXJTdHJlYW0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNmVhYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0NoYXJTdHJlYW0ucG0KQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6Q2hhclN0cmVhbTsKKwordXNlIENhcnA7Cit1c2UgUmVhZG9ubHk7CisKK3VzZSBNb29zZTo6Um9sZTsKKyNleHRlbmRzICdBTlRMUjo6UnVudGltZTo6SW50U3RyZWFtJzsKKworUmVhZG9ubHkgbXkgJEVPRiA9PiAtMTsKK3N1YiBFT0YgeyByZXR1cm4gJEVPRiB9CisKK3JlcXVpcmVzICdzdWJzdHJpbmcnOworCityZXF1aXJlcyAnTFQnOworCityZXF1aXJlcyAnZ2V0X2xpbmUnLCAnc2V0X2xpbmUnOworCityZXF1aXJlcyAnZ2V0X2NoYXJfcG9zaXRpb25faW5fbGluZScsICdzZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lJzsKKworbm8gTW9vc2U6OlJvbGU7CisxOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQ2hhclN0cmVhbVN0YXRlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzgyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9DaGFyU3RyZWFtU3RhdGUucG0KQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6Q2hhclN0cmVhbVN0YXRlOworCit1c2UgTW9vc2U7CisKKyMgSW5kZXggaW50byB0aGUgY2hhciBzdHJlYW0gb2YgbmV4dCBsb29rYWhlYWQgY2hhcgoraGFzICdwJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gMCwKKyk7CisKKyMgV2hhdCBsaW5lIG51bWJlciBpcyB0aGUgc2Nhbm5lciBhdCBiZWZvcmUgcHJvY2Vzc2luZyBidWZmZXJbcF0/CitoYXMgJ2xpbmUnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAwLAorKTsKKworIyBXaGF0IGNoYXIgcG9zaXRpb24gMC4ubi0xIGluIGxpbmUgaXMgc2Nhbm5lciBiZWZvcmUgcHJvY2Vzc2luZyBidWZmZXJbcF0/CitoYXMgJ2NoYXJfcG9zaXRpb25faW5fbGluZScgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnSW50JywKKyAgICBkZWZhdWx0ID0+IDAsCispOworCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0NvbW1vblRva2VuLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQ29tbW9uVG9rZW4ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2NGI5NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0NvbW1vblRva2VuLnBtCkBAIC0wLDAgKzEsMjI0IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbjsKKwordXNlIFJlYWRvbmx5OworCit1c2UgTW9vc2U7CisKK3VzZSBvdmVybG9hZAorICAgICdib29sJyA9PiBcJm5vdF9lb2YsCisgICAgZmFsbGJhY2sgPT4gMSwKKyAgICA7CisKK3dpdGggJ0FOVExSOjpSdW50aW1lOjpUb2tlbic7CisKK2hhcyAndHlwZScgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnSW50JywKKyAgICByZXF1aXJlZCA9PiAxLAorKTsKKworaGFzICdsaW5lJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gMCwKKyk7CisKK2hhcyAnY2hhcl9wb3NpdGlvbl9pbl9saW5lJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorICAgICMgc2V0IHRvIGludmFsaWQgcG9zaXRpb24KKyAgICBkZWZhdWx0ID0+IC0xLAorKTsKKworaGFzICdjaGFubmVsJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gc3ViIHsgQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5ERUZBVUxUX0NIQU5ORUwgfQorKTsKKworaGFzICdpbnB1dCcgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnTWF5YmVbQU5UTFI6OlJ1bnRpbWU6OkNoYXJTdHJlYW1dJywKKyk7CisKKyMgV2UgbmVlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdGV4dCBvbmNlIGluIGEgd2hpbGUuICBJZgorIyB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGdldFRleHQgc2hvdWxkIHJldHVybiB0aGlzLiAgTm90ZSB0aGF0CisjIHN0YXJ0L3N0b3AgYXJlIG5vdCBhZmZlY3RlZCBieSBjaGFuZ2luZyB0aGlzLgoraGFzICd0ZXh0JyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdNYXliZVtTdHJdJywKKyk7CisKKyMgV2hhdCB0b2tlbiBudW1iZXIgaXMgdGhpcyBmcm9tIDAuLm4tMSB0b2tlbnM7IDwgMCBpbXBsaWVzIGludmFsaWQgaW5kZXgKK2hhcyAnaW5kZXgnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAtMSwKKyk7CisKKyMgVGhlIGNoYXIgcG9zaXRpb24gaW50byB0aGUgaW5wdXQgYnVmZmVyIHdoZXJlIHRoaXMgdG9rZW4gc3RhcnRzCitoYXMgJ3N0YXJ0JyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorKTsKKworIyBUaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdG9wcworaGFzICdzdG9wJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorKTsKKworc3ViIEJVSUxEIHsKKyAgICBteSAoJHNlbGYsICRhcmdfcmVmKSA9IEBfOworCisgICAgaWYgKGV4aXN0cyAkYXJnX3JlZi0+e3Rva2VufSkgeworICAgICAgICBteSAkdG9rZW4gPSAkYXJnX3JlZi0+e3Rva2VufTsKKyAgICAgICAgJHNlbGYtPnRleHQoJHRva2VuLT5nZXRfdGV4dCgpKTsKKyAgICAgICAgJHNlbGYtPnR5cGUoJHRva2VuLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgJHNlbGYtPmxpbmUoJHRva2VuLT5nZXRfbGluZSgpKTsKKyAgICAgICAgJHNlbGYtPmluZGV4KCR0b2tlbi0+Z2V0X3Rva2VuX2luZGV4KCkpOworICAgICAgICAkc2VsZi0+Y2hhcl9wb3NpdGlvbl9pbl9saW5lKCR0b2tlbi0+Z2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgpKTsKKyAgICAgICAgJHNlbGYtPmNoYW5uZWwoJHRva2VuLT5nZXRfY2hhbm5lbCgpKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdWIgZ2V0X3R5cGUgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPnR5cGU7Cit9CisKK3N1YiBzZXRfdHlwZSB7CisgICAgbXkgKCRzZWxmLCAkdmFsdWUpID0gQF87CisgICAgJHNlbGYtPnZhbHVlKCR2YWx1ZSk7CisgICAgcmV0dXJuOworfQorCisKK3N1YiBnZXRfbGluZSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+bGluZTsKK30KKworc3ViIHNldF9saW5lIHsKKyAgICBteSAoJHNlbGYsICRsaW5lKSA9IEBfOworICAgICRzZWxmLT5saW5lKCRsaW5lKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfdGV4dCB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPnRleHQpIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT50ZXh0OworICAgIH0KKyAgICBpZiAoIWRlZmluZWQgJHNlbGYtPmlucHV0KSB7CisgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICB9CisgICAgJHNlbGYtPnRleHQoJHNlbGYtPmlucHV0LT5zdWJzdHJpbmcoJHNlbGYtPnN0YXJ0LCAkc2VsZi0+c3RvcCkpOworICAgIHJldHVybiAkc2VsZi0+dGV4dDsKK30KKworc3ViIHNldF90ZXh0IHsKKyAgICBteSAoJHNlbGYsICR0ZXh0KSA9IEBfOworICAgICRzZWxmLT50ZXh0KCR0ZXh0KTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5jaGFyX3Bvc2l0aW9uX2luX2xpbmU7Cit9CisKK3N1YiBzZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lIHsKKyAgICBteSAoJHNlbGYsICRwb3MpID0gQF87CisgICAgJHNlbGYtPmNoYXJfcG9zaXRpb25faW5fbGluZSgkcG9zKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfY2hhbm5lbCB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+Y2hhbm5lbDsKK30KKworc3ViIHNldF9jaGFubmVsIHsKKyAgICBteSAoJHNlbGYsICRjaGFubmVsKSA9IEBfOworICAgICRzZWxmLT5jaGFubmVsKCRjaGFubmVsKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfc3RhcnRfaW5kZXggeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPnN0YXJ0OworfQorCitzdWIgc2V0X3N0YXJ0X2luZGV4IHsKKyAgICBteSAoJHNlbGYsICRzdGFydCkgPSBAXzsKKyAgICAkc2VsZi0+c3RhcnQoJHN0YXJ0KTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfc3RvcF9pbmRleCB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+c3RvcDsKK30KKworc3ViIHNldF9zdG9wX2luZGV4IHsKKyAgICBteSAoJHNlbGYsICRzdG9wKSA9IEBfOworICAgICRzZWxmLT5zdG9wKCRzdG9wKTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfdG9rZW5faW5kZXggeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPmluZGV4OworfQorCitzdWIgc2V0X3Rva2VuX2luZGV4IHsKKyAgICBteSAoJHNlbGYsICRpbmRleCkgPSBAXzsKKyAgICAkc2VsZi0+aW5kZXgoJGluZGV4KTsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfaW5wdXRfc3RyZWFtIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5pbnB1dDsKK30KKworc3ViIHNldF9pbnB1dF9zdHJlYW0geworICAgIG15ICgkc2VsZiwgJGlucHV0KSA9IEBfOworICAgICRzZWxmLT5pbnB1dCgkaW5wdXQpOworICAgIHJldHVybjsKK30KKworc3ViIG5vdF9lb2YgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPnR5cGUgIT0gQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5FT0Y7Cit9CisKKz1iZWdpbiBsYXRlcgorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKKwkJaWYgKCBjaGFubmVsPjAgKSB7CisJCQljaGFubmVsU3RyPSIsY2hhbm5lbD0iK2NoYW5uZWw7CisJCX0KKwkJU3RyaW5nIHR4dCA9IGdldFRleHQoKTsKKwkJaWYgKCB0eHQhPW51bGwgKSB7CisJCQl0eHQgPSB0eHQucmVwbGFjZUFsbCgiXG4iLCJcXFxcbiIpOworCQkJdHh0ID0gdHh0LnJlcGxhY2VBbGwoIlxyIiwiXFxcXHIiKTsKKwkJCXR4dCA9IHR4dC5yZXBsYWNlQWxsKCJcdCIsIlxcXFx0Iik7CisJCX0KKwkJZWxzZSB7CisJCQl0eHQgPSAiPG5vIHRleHQ+IjsKKwkJfQorCQlyZXR1cm4gIltAIitnZXRUb2tlbkluZGV4KCkrIiwiK3N0YXJ0KyI6IitzdG9wKyI9JyIrdHh0KyInLDwiK3R5cGUrIj4iK2NoYW5uZWxTdHIrIiwiK2xpbmUrIjoiK2dldENoYXJQb3NpdGlvbkluTGluZSgpKyJdIjsKKwl9CisKKz1lbmQgbGF0ZXIKKworPWN1dAorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0NvbW1vblRva2VuU3RyZWFtLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyOThlYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0NvbW1vblRva2VuU3RyZWFtLnBtCkBAIC0wLDAgKzEsMzkyIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlblN0cmVhbTsKKwordXNlIENhcnA7Cit1c2UgUmVhZG9ubHk7Cit1c2UgVU5JVkVSU0FMIHF3KCBpc2EgKTsKKwordXNlIEFOVExSOjpSdW50aW1lOjpDaGFyU3RyZWFtOwordXNlIEFOVExSOjpSdW50aW1lOjpUb2tlbjsKK3VzZSBBTlRMUjo6UnVudGltZTo6VG9rZW5Tb3VyY2U7CisKK3VzZSBNb29zZTsKKwordXNlIG92ZXJsb2FkCisgICAgJyIiJyA9PiBcJnN0cgorICAgIDsKKword2l0aCAnQU5UTFI6OlJ1bnRpbWU6OkludFN0cmVhbScsCisgICAgICdBTlRMUjo6UnVudGltZTo6VG9rZW5TdHJlYW0nOworCitoYXMgJ3Rva2VuX3NvdXJjZScgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGRvZXMgPT4gJ0FOVExSOjpSdW50aW1lOjpUb2tlblNvdXJjZScsCispOworCitoYXMgJ3Rva2VucycgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnQXJyYXlSZWZbQU5UTFI6OlJ1bnRpbWU6OlRva2VuXScsCisgICAgZGVmYXVsdCA9PiBzdWIgeyBbXSB9LAorKTsKKworaGFzICdjaGFubmVsX292ZXJyaWRlX21hcCcgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnSGFzaFJlZltJbnRdJywKKyk7CisKK2hhcyAnZGlzY2FyZF9zZXQnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0hhc2hSZWZbSW50XScsCispOworCitoYXMgJ2NoYW5uZWwnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkRFRkFVTFRfQ0hBTk5FTCwKKyk7CisKK2hhcyAnZGlzY2FyZF9vZmZfY2hhbm5lbF90b2tlbnMnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0Jvb2wnLAorICAgIGRlZmF1bHQgPT4gMCwKKyk7CisKK2hhcyAnbGFzdF9tYXJrZXInID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAwLAorKTsKKworaGFzICdwJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gLTEsCispOworCitzdWIgc2V0X3Rva2VuX3NvdXJjZSB7CisgICAgbXkgKCRzZWxmLCAkdG9rZW5fc291cmNlKSA9IEBfOworCisgICAgJHNlbGYtPnRva2VuX3NvdXJjZSgkdG9rZW5fc291cmNlKTsKKyAgICAkc2VsZi0+dG9rZW5zKFtdKTsKKyAgICAkc2VsZi0+cCgtMSk7CisgICAgJHNlbGYtPmNoYW5uZWwoQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5ERUZBVUxUX0NIQU5ORUwpOworfQorCitzdWIgZmlsbF9idWZmZXIgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIG15ICRpbmRleCA9IDA7CisgICAgbXkgJHQgPSAkc2VsZi0+dG9rZW5fc291cmNlLT5uZXh0X3Rva2VuKCk7CisgICAgd2hpbGUgKGRlZmluZWQgJHQgJiYgJHQtPmdldF90eXBlKCkgIT0gQU5UTFI6OlJ1bnRpbWU6OkNoYXJTdHJlYW0tPkVPRikgeworICAgICAgICBteSAkZGlzY2FyZCA9IDA7CisJIyBpcyB0aGVyZSBhIGNoYW5uZWwgb3ZlcnJpZGUgZm9yIHRva2VuIHR5cGU/CisgICAgICAgIGlmIChkZWZpbmVkICRzZWxmLT5jaGFubmVsX292ZXJyaWRlX21hcCkgeworICAgICAgICAgICAgbXkgJGNoYW5uZWwgPSAkc2VsZi0+Y2hhbm5lbF9vdmVycmlkZV9tYXAtPnskdC0+Z2V0X3R5cGUoKX07CisgICAgICAgICAgICBpZiAoZGVmaW5lZCAkY2hhbm5lbCkgeworICAgICAgICAgICAgICAgICR0LT5zZXRfY2hhbm5lbCgkY2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVmaW5lZCAkc2VsZi0+ZGlzY2FyZF9zZXQgJiYgJHNlbGYtPmRpc2NhcmRfc2V0LT5jb250YWlucygkdC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgICAgICRkaXNjYXJkID0gMTsKKyAgICAgICAgfSBlbHNpZiAoJHNlbGYtPmRpc2NhcmRfb2ZmX2NoYW5uZWxfdG9rZW5zICYmICR0LT5nZXRfY2hhbm5lbCgpICE9ICRzZWxmLT5jaGFubmVsKSB7CisgICAgICAgICAgICAkZGlzY2FyZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISRkaXNjYXJkKSB7CisgICAgICAgICAgICAkdC0+c2V0X3Rva2VuX2luZGV4KCRpbmRleCk7CisgICAgICAgICAgICBwdXNoIEB7JHNlbGYtPnRva2Vuc30sICR0OworICAgICAgICAgICAgKyskaW5kZXg7CisgICAgICAgIH0KKyAgICB9IGNvbnRpbnVlIHsKKyAgICAgICAgJHQgPSAkc2VsZi0+dG9rZW5fc291cmNlLT5uZXh0X3Rva2VuKCk7CisgICAgfQorCisgICAgIyBsZWF2ZSBwIHBvaW50aW5nIGF0IGZpcnN0IHRva2VuIG9uIGNoYW5uZWwKKyAgICAkc2VsZi0+cCgwKTsKKyAgICAkc2VsZi0+c2tpcF9vZmZfdG9rZW5fY2hhbm5lbHMoJHNlbGYtPnApOworfQorCitzdWIgY29uc3VtZSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5wIDwgQHskc2VsZi0+dG9rZW5zfSkgeworICAgICAgICAkc2VsZi0+cCgkc2VsZi0+cCArIDEpOworICAgICAgICAkc2VsZi0+cCgkc2VsZi0+c2tpcF9vZmZfdG9rZW5fY2hhbm5lbHMoJHNlbGYtPnApKTsgICMgbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgIH0KK30KKworc3ViIHNraXBfb2ZmX3Rva2VuX2NoYW5uZWxzIHsKKyAgICBteSAoJHNlbGYsICRpKSA9IEBfOworCisgICAgbXkgJG4gPSBAeyRzZWxmLT50b2tlbnN9OworICAgIHdoaWxlICgkaSA8ICRuICYmICRzZWxmLT50b2tlbnMtPlskaV0tPmdldF9jaGFubmVsKCkgIT0gJHNlbGYtPmNoYW5uZWwpIHsKKyAgICAgICAgKyskaTsKKyAgICB9CisKKyAgICByZXR1cm4gJGk7Cit9CisKK3N1YiBza2lwX29mZl90b2tlbl9jaGFubmVsc19yZXZlcnNlIHsKKyAgICBteSAoJHNlbGYsICRpKSA9IEBfOworCisgICAgd2hpbGUgKCRpID49IDAgJiYgJHNlbGYtPnRva2Vucy0+WyRpXS0+Z2V0X2NoYW5uZWwoKSAhPSAkc2VsZi0+Y2hhbm5lbCkgeworICAgICAgICAtLSRpOworICAgIH0KKworICAgIHJldHVybiAkaTsKK30KKworc3ViIHNldF90b2tlbl90eXBlX2NoYW5uZWwgeworICAgIG15ICgkc2VsZiwgJHR0eXBlLCAkY2hhbm5lbCkgPSBAXzsKKworICAgIGlmICghZGVmaW5lZCAkc2VsZi0+Y2hhbm5lbF9vdmVycmlkZV9tYXApIHsKKyAgICAgICAgJHNlbGYtPmNoYW5uZWxfb3ZlcnJpZGVfbWFwKHt9KTsKKyAgICB9CisKKyAgICAkc2VsZi0+Y2hhbm5lbF9vdmVycmlkZV9tYXAtPnskdHR5cGV9ID0gJGNoYW5uZWw7Cit9CisKK3N1YiBkaXNjYXJkX3Rva2VuX3R5cGUgeworICAgIG15ICgkc2VsZiwgJHR0eXBlKSA9IEBfOworCisgICAgaWYgKCFkZWZpbmVkICRzZWxmLT5kaXNjYXJkX3NldCkgeworICAgICAgICAkc2VsZi0+ZGlzY2FyZF9zZXQoe30pOworICAgIH0KKworICAgICRzZWxmLT5kaXNjYXJkX3NldC0+eyR0dHlwZX0gPSAxOworfQorCitzdWIgZ2V0X3Rva2VucyB7CisgICAgbXkgKCRzZWxmLCAkYXJncykgPSBAXzsKKworICAgIGlmICgkc2VsZi0+cCA9PSAtMSkgeworICAgICAgICAkc2VsZi0+ZmlsbF9idWZmZXIoKTsKKyAgICB9CisgICAgaWYgKCFkZWZpbmVkICRhcmdzKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+dG9rZW5zOworICAgIH0KKworICAgIG15ICRzdGFydCA9ICRhcmdzLT57c3RhcnR9OworICAgIG15ICRzdG9wID0gJGFyZ3MtPntzdG9wfTsKKworICAgIG15ICR0eXBlczsKKyAgICBpZiAoZXhpc3RzICRhcmdzLT57dHlwZXN9KSB7CisgICAgICAgIGlmIChyZWYgJGFyZ3MtPnt0eXBlc30gZXEgJ0FSUkFZJykgeworICAgICAgICAgICAgJHR5cGVzID0gQU5UTFI6OlJ1bnRpbWU6OkJpdFNldC0+bmV3KCRhcmdzLT57dHlwZXN9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0eXBlcyA9ICRhcmdzLT57dHlwZXN9OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXkgJHR0eXBlID0gJGFyZ3MtPnt0dHlwZX07CisgICAgICAgICR0eXBlcyA9IEFOVExSOjpSdW50aW1lOjpCaXRTZXQtPm9mKCR0dHlwZSk7CisgICAgfQorCisKKyAgICBpZiAoJHN0b3AgPj0gQHskc2VsZi0+dG9rZW5zfSkgeworICAgICAgICAkc3RvcCA9ICQjeyRzZWxmLT50b2tlbnN9OworICAgIH0KKyAgICBpZiAoJHN0YXJ0IDwgMCkgeworICAgICAgICAkc3RhcnQgPSAwOworICAgIH0KKworICAgIGlmICgkc3RhcnQgPiAkc3RvcCkgeworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorCisgICAgbXkgJGZpbHRlcmVkX3Rva2VucyA9IFtdOworICAgIGZvcmVhY2ggbXkgJHQgKEB7JHNlbGYtPnRva2Vuc31bJHN0YXJ0Li4kc3RvcF0pIHsKKyAgICAgICAgaWYgKCFkZWZpbmVkICR0eXBlcyB8fCAkdHlwZXMtPm1lbWJlcigkdC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgICAgIHB1c2ggQCRmaWx0ZXJlZF90b2tlbnMsICR0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFAeyRmaWx0ZXJlZF90b2tlbnN9KSB7CisgICAgICAgICRmaWx0ZXJlZF90b2tlbnMgPSB1bmRlZjsKKyAgICB9CisKKyAgICByZXR1cm4gJGZpbHRlcmVkX3Rva2VuczsKK30KKworc3ViIExUIHsKKyAgICBteSAoJHNlbGYsICRrKSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5wID09IC0xKSB7CisgICAgICAgICRzZWxmLT5maWxsX2J1ZmZlcigpOworICAgIH0KKyAgICBpZiAoJGsgPT0gMCkgeworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGlmICgkayA8IDApIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5MQigtJGspOworICAgIH0KKworICAgIGlmICgkc2VsZi0+cCArICRrIC0gMSA+PSBAeyRzZWxmLT50b2tlbnN9KSB7CisgICAgICAgIHJldHVybiBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRl9UT0tFTjsKKyAgICB9CisKKyAgICBteSAkaSA9ICRzZWxmLT5wOworICAgIG15ICRuID0gMTsKKworICAgIHdoaWxlICgkbiA8ICRrKSB7CisgICAgICAgICRpID0gJHNlbGYtPnNraXBfb2ZmX3Rva2VuX2NoYW5uZWxzKCRpKzEpOworICAgICAgICArKyRuOworICAgIH0KKworICAgIGlmICgkaSA+PSBAeyRzZWxmLT50b2tlbnN9KSB7CisgICAgICAgIHJldHVybiBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRl9UT0tFTjsKKyAgICB9CisKKyAgICByZXR1cm4gJHNlbGYtPnRva2Vucy0+WyRpXTsKK30KKworc3ViIExCIHsKKyAgICBteSAoJHNlbGYsICRrKSA9IEBfOworCisgICAgaWYgKCRzZWxmLT5wID09IC0xKSB7CisgICAgICAgICRzZWxmLT5maWxsX2J1ZmZlcigpOworICAgIH0KKyAgICBpZiAoJGsgPT0gMCkgeworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGlmICgkc2VsZi0+cCAtICRrIDwgMCkgeworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorCisgICAgbXkgJGkgPSAkc2VsZi0+cDsKKyAgICBteSAkbiA9IDE7CisgICAgd2hpbGUgKCRuIDw9ICRrKSB7CisgICAgICAgICRrID0gJHNlbGYtPnNraXBfb2ZmX3Rva2VuX2NoYW5uZWxzX3JldmVyc2UoJGkgLSAxKTsKKyAgICAgICAgKyskbjsKKyAgICB9CisKKyAgICBpZiAoJGkgPCAwKSB7CisgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICByZXR1cm4gJHNlbGYtPnRva2Vucy0+WyRpXTsKK30KKworc3ViIGdldCB7CisgICAgbXkgKCRzZWxmLCAkaSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+dG9rZW5zLT5bJGldOworfQorCitzdWIgTEEgeworICAgIG15ICgkc2VsZiwgJGkpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPkxUKCRpKS0+Z2V0X3R5cGUoKTsKK30KKworc3ViIG1hcmsgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIGlmICgkc2VsZi0+cCA9PSAtMSkgeworICAgICAgICAkc2VsZi0+ZmlsbF9idWZmZXIoKTsKKyAgICB9CisgICAgJHNlbGYtPmxhc3RfbWFya2VyKCRzZWxmLT5pbmRleCgpKTsKKyAgICByZXR1cm4gJHNlbGYtPmxhc3RfbWFya2VyOworfQorCitzdWIgcmVsZWFzZSB7CisgICAgbXkgKCRzZWxmLCAkbWFya2VyKSA9IEBfOworCisgICAgIyBubyByZXNvdXJjZXMgdG8gcmVsZWFzZQorfQorCitzdWIgc2l6ZSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgcmV0dXJuIHNjYWxhciBAeyRzZWxmLT50b2tlbnN9OworfQorCitzdWIgaW5kZXggeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+cDsKK30KKworc3ViIHJld2luZCB7CisgICAgUmVhZG9ubHkgbXkgJHVzYWdlID0+ICd2b2lkIHJld2luZChpbnQgbWFya2VyKSB8IHZvaWQgcmV3aW5kKCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAxICYmIEBfICE9IDI7CisKKyAgICBpZiAoQF8gPT0gMSkgeworICAgICAgICBteSAoJHNlbGYpID0gQF87CisgICAgICAgICRzZWxmLT5zZWVrKCRzZWxmLT5sYXN0X21hcmtlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXkgKCRzZWxmLCAkbWFya2VyKSA9IEBfOworICAgICAgICAkc2VsZi0+c2VlaygkbWFya2VyKTsKKyAgICB9Cit9CisKK3N1YiBzZWVrIHsKKyAgICBteSAoJHNlbGYsICRpbmRleCkgPSBAXzsKKworICAgICRzZWxmLT5wKCRpbmRleCk7Cit9CisKK3N1YiBnZXRfdG9rZW5fc291cmNlIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPnRva2VuX3NvdXJjZTsKK30KKworc3ViIGdldF9zb3VyY2VfbmFtZSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+Z2V0X3Rva2VuX3NvdXJjZSgpLT5nZXRfc291cmNlX25hbWUoKTsKK30KKworc3ViIHN0ciB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+dG9fc3RyaW5nKCk7Cit9CisKK3N1YiB0b19zdHJpbmcgeworICAgIFJlYWRvbmx5IG15ICR1c2FnZSA9PiAnU3RyaW5nIHRvX3N0cmluZygpIHwgU3RyaW5nIHRvX3N0cmluZyhpbnQgc3RhcnQsIGludCBzdG9wIHwgU3RyaW5nIHRvX3N0cmluZyhUb2tlbiBzdGFydCwgVG9rZW4gc3RvcCknOworICAgIGNyb2FrICR1c2FnZSBpZiBAXyAhPSAxICYmIEBfICE9IDM7CisKKyAgICBpZiAoQF8gPT0gMSkgeworICAgICAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICAgICAgaWYgKCRzZWxmLT5wID09IC0xKSB7CisgICAgICAgICAgICAkc2VsZi0+ZmlsbF9idWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJHNlbGYtPnRvX3N0cmluZygwLCAkI3skc2VsZi0+dG9rZW5zfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXkgKCRzZWxmLCAkc3RhcnQsICRzdG9wKSA9IEBfOworCisgICAgICAgIGlmIChkZWZpbmVkICRzdGFydCAmJiBkZWZpbmVkICRzdG9wKSB7CisgICAgICAgICAgICBpZiAocmVmKCRzdGFydCkgJiYgJHN0YXJ0LT5pc2EoJ0FOVExSOjpSdW50aW1lOjpUb2tlbicpKSB7CisgICAgICAgICAgICAgICAgJHN0YXJ0ID0gJHN0YXJ0LT5nZXRfdG9rZW5faW5kZXgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlZigkc3RhcnQpICYmICRzdG9wLT5pc2EoJ0FOVExSOjpSdW50aW1lOjpUb2tlbicpKSB7CisgICAgICAgICAgICAgICAgJHN0b3AgPSAkc3RvcC0+Z2V0X3Rva2VuX2luZGV4KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgkc3RhcnQgPCAwIHx8ICRzdG9wIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkc2VsZi0+cCA9PSAtMSkgeworICAgICAgICAgICAgICAgICRzZWxmLT5maWxsX2J1ZmZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzdG9wID49IEB7JHNlbGYtPnRva2Vuc30pIHsKKyAgICAgICAgICAgICAgICAkc3RvcCA9ICQjeyRzZWxmLT50b2tlbnN9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBteSAkYnVmID0gJyc7CisgICAgICAgICAgICBmb3JlYWNoIG15ICR0IChAeyRzZWxmLT50b2tlbnN9WyRzdGFydC4uJHN0b3BdKSB7CisgICAgICAgICAgICAgICAgJGJ1ZiAuPSAkdC0+Z2V0X3RleHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICRidWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK25vIE1vb3NlOworX19QQUNLQUdFX18tPm1ldGEtPm1ha2VfaW1tdXRhYmxlKCk7CisxOworX19FTkRfXwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvREZBLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvREZBLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjBlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9ERkEucG0KQEAgLTAsMCArMSwxOTIgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6OkRGQTsKKwordXNlIFBhcmFtczo6VmFsaWRhdGUgcXcoIDp0eXBlcyApOwordXNlIEVycm9yIHF3KCB0cnkgZmluYWxseSApOworCit1c2UgTW9vc2U7CisKK2hhcyAnZW90JyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdBcnJheVJlZltJbnRdJywKKyk7CisKK2hhcyAnZW9mJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdBcnJheVJlZltJbnRdJywKKyk7CisKK2hhcyAnbWluJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdBcnJheVJlZltTdHJdJywKKyk7CisKK2hhcyAnbWF4JyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdBcnJheVJlZltTdHJdJywKKyk7CisKK2hhcyAnYWNjZXB0JyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdBcnJheVJlZltJbnRdJywKKyk7CisKK2hhcyAnc3BlY2lhbCcgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnQXJyYXlSZWZbSW50XScsCispOworCitoYXMgJ3RyYW5zaXRpb24nID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0FycmF5UmVmW0FycmF5UmVmW0ludF1dJywKKyk7CisKK2hhcyAnZGVjaXNpb25fbnVtYmVyJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorKTsKKworCisjIFdoaWNoIHJlY29nbml6ZXIgZW5jbG9zZXMgdGhpcyBERkE/ICBOZWVkZWQgdG8gY2hlY2sgYmFja3RyYWNraW5nCitoYXMgJ3JlY29nbml6ZXInID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0FOVExSOjpSdW50aW1lOjpCYXNlUmVjb2duaXplcicsCispOworCisKK3N1YiBnZXRfZGVzY3JpcHRpb24geworICAgIHJldHVybiAibi9hIjsKK30KKworIyBGcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHByZWRpY3Qgd2hhdCBhbHRlcm5hdGl2ZSB3aWxsIHN1Y2NlZWQKKyMgdXNpbmcgdGhpcyBERkEgKHJlcHJlc2VudGluZyB0aGUgY292ZXJpbmcgcmVndWxhciBhcHByb3hpbWF0aW9uCisjIHRvIHRoZSB1bmRlcmx5aW5nIENGTCkuICBSZXR1cm4gYW4gYWx0ZXJuYXRpdmUgbnVtYmVyIDEuLm4uICBUaHJvdworIyBhbiBleGNlcHRpb24gdXBvbiBlcnJvci4KK3N1YiBwcmVkaWN0IHsKKyAgICBteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsKKworICAgIG15ICRtYXJrID0gJGlucHV0LT5tYXJrKCk7ICAjIHJlbWVtYmVyIHdoZXJlIGRlY2lzaW9uIHN0YXJ0ZWQgaW4gaW5wdXQKKyAgICBteSAkcyA9IDA7ICMgd2UgYWx3YXlzIHN0YXJ0IGF0IHMwCisKKyAgICB0cnkgeworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgbXkgJHNwZWNpYWxfc3RhdGUgPSAkc2VsZi0+c3BlY2lhbC0+WyRzXTsKKyAgICAgICAgICAgIGlmICgkc3BlY2lhbF9zdGF0ZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgJHMgPSAkc2VsZi0+c3BlY2lhbF9zdGF0ZV90cmFuc2l0aW9uKCRzcGVjaWFsX3N0YXRlLCAkaW5wdXQpOworICAgICAgICAgICAgICAgIGlmICgkcyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+bm9fdmlhYmxlX2FsdCgkcywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRpbnB1dC0+Y29uc3VtZSgpOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgkc2VsZi0+YWNjZXB0LT5bJHNdID49IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHNlbGYtPmFjY2VwdC0+WyRzXTsKKyAgICAgICAgICAgIH0KKworCSAgICAjIGxvb2sgZm9yIGEgbm9ybWFsIGNoYXIgdHJhbnNpdGlvbgorICAgICAgICAgICAgbXkgJGMgPSAkaW5wdXQtPkxBKDEpOyAgIyAtMSA9PSBcdUZGRkYsIGFsbCB0b2tlbnMgZml0IGluIDY1MDAwIHNwYWNlCisKKyAgICAgICAgICAgIGlmICgkYyA+PSAkc2VsZi0+bWluLT5bJHNdICYmICRjIDw9ICRzZWxmLT5tYXgtPlskc10pIHsKKyAgICAgICAgICAgICAgICBteSAkbmV4dF9zID0gJHNlbGYtPnRyYW5zaXRpb24tPlskc11bJGMgLSAkc2VsZi0+bWluLT5bJHNdXTsgICMgbW92ZSB0byBuZXh0IHN0YXRlCisKKyAgICAgICAgICAgICAgICBpZiAoJG5leHRfcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgIyB3YXMgaW4gcmFuZ2UgYnV0IG5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICMgbXVzdCBjaGVjayBFT1QsIHdoaWNoIGlzIGxpa2UgdGhlIGVsc2UgY2xhdXNlLgorICAgICAgICAgICAgICAgICAgICAjIGVvdFtzXT49MCBpbmRpY2F0ZXMgdGhhdCBhbiBFT1QgZWRnZSBnb2VzIHRvIGFub3RoZXIKKyAgICAgICAgICAgICAgICAgICAgIyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRzZWxmLT5lb3QtPlskc10gPj0gMCkgeyAgIyBFT1QgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGU/CisgICAgICAgICAgICAgICAgICAgICAgICAkcyA9ICRzZWxmLT5lb3QtPlskc107CisgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQtPmNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETzogSSBoYWQgdGhpcyBhcyByZXR1cm4gYWNjZXB0W2VvdFtzXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggYXNzdW1lZCBoZXJlIHRoYXQgdGhlIEVPVCBlZGdlIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgI3dlbnQgdG8gYW4gYWNjZXB0Li4uZmFzdGVyIHRvIGRvIHRoaXMsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGF0IGFib3V0IHByZWRpY2F0ZWQgZWRnZXMgY29taW5nIGZyb20gRU9UCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRhcmdldD8KKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+bm9fdmlhYmxlX2FsdCgkcywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgJHMgPSAkbmV4dF9zOworICAgICAgICAgICAgICAgICRpbnB1dC0+Y29uc3VtZSgpOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisKKwkgICAgaWYgKCRzZWxmLT5lb3QtPlskc10gPj0gMCkgeyAgIyBFT1QgVHJhbnNpdGlvbj8KKwkJJHMgPSAkc2VsZi0+ZW90LT5bJHNdOworCQkkaW5wdXQtPmNvbnN1bWUoKTsKKwkJbmV4dDsKKwkgICAgfQorCisJICAgIGlmICgkYyA9PSBBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRiAmJiAkc2VsZi0+ZW9mLT5bJHNdID49IDApIHsgICMgRU9GIFRyYW5zaXRpb24gdG8gYWNjZXB0IHN0YXRlPworCQlyZXR1cm4gJHNlbGYtPmFjY2VwdC0+WyRzZWxmLT5lb2YtPlskc11dOworCSAgICB9CisKKwkgICAgIyBub3QgaW4gcmFuZ2UgYW5kIG5vdCBFT0YvRU9ULCBtdXN0IGJlIGludmFsaWQgc3ltYm9sCisJICAgICRzZWxmLT5ub192aWFibGVfYWx0KCRzLCAkaW5wdXQpOworCSAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmaW5hbGx5IHsKKwkkaW5wdXQtPnJld2luZCgpOworICAgIH07Cit9CisKK3N1YiBub192aWFibGVfYWx0IHsKKyAgICBteSAoJHNlbGYsICRzLCAkaW5wdXQpID0gQF87CisKKyAgICBpZiAoJHNlbGYtPnJlY29nbml6ZXItPnN0YXRlLT5iYWNrdHJhY2tpbmcgPiAwKSB7CisJJHNlbGYtPnJlY29nbml6ZXItPnN0YXRlLT5mYWlsZWQgPSAxOworCXJldHVybjsKKyAgICB9CisgICAgbXkgJG52YWUgPSBBTlRMUjo6UnVudGltZTo6Tm9WaWFibGVBbHRFeGNlcHRpb24oeworCWdyYW1tYXJfZGVjaXNpb25fZGVzY3JpcHRpb24gPT4gJHNlbGYtPmdldF9kZXNjcmlwdGlvbigpLAorCWRlY2lzaW9uX251bWJlciA9PiAkc2VsZi0+ZGVjaXNpb25fbnVtYmVyLAorCXN0YXRlX251bWJlciA9PiAkc2VsZi0+c3RhdGVfbnVtYmVyLAorCWlucHV0ID0+ICRpbnB1dAorICAgIH0pOworICAgICRzZWxmLT5lcnJvcigkbnZhZSk7CisgICAgJG52YWUtPnRocm93KCk7Cit9CisKKyMgQSBob29rIGZvciBkZWJ1Z2dpbmcgaW50ZXJmYWNlCitzdWIgZXJyb3IgeworICAgIG15ICgkc2VsZiwgJG52YWUpID0gQF87Cit9CisKK3N1YiBzcGVjaWFsX3N0YXRlX3RyYW5zaXRpb24geworICAgIG15ICgkc2VsZiwgJHMsICRpbnB1dCkgPSBAXzsKKworICAgIHJldHVybiAtMTsKK30KKworIyBHaXZlbiBhIFN0cmluZyB0aGF0IGhhcyBhIHJ1bi1sZW5ndGgtZW5jb2Rpbmcgb2Ygc29tZSB1bnNpZ25lZCBzaG9ydHMKKyMgbGlrZSAiXDFcMlwzXDkiLCBjb252ZXJ0IHRvIHNob3J0W10gezIsOSw5LDl9LiAgV2UgZG8gdGhpcyB0byBhdm9pZAorIyBzdGF0aWMgc2hvcnRbXSB3aGljaCBnZW5lcmF0ZXMgc28gbXVjaCBpbml0IGNvZGUgdGhhdCB0aGUgY2xhc3Mgd29uJ3QKKyMgY29tcGlsZS4gOigKK3N1YiB1bnBhY2tfZW5jb2RlZF9zdHJpbmcgeworICAgIG15ICgkc2VsZiwgJGVuY29kZWRfc3RyaW5nKSA9IEBfOworCisgICAgbXkgJGRhdGEgPSBbXTsKKyAgICB3aGlsZSAoJGVuY29kZWRfc3RyaW5nID1+IC8oLikoLikvZ3htcykgeworICAgICAgICBteSAoJG4sICR2KSA9ICgkMSwgJDIpOworCisgICAgICAgIHB1c2ggQCRkYXRhLCAkdiB4ICRuOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworc3ViIHVucGFja19lbmNvZGVkX3N0cmluZ190b191bnNpZ25lZF9jaGFycyB7CisgICAgbXkgKCRzZWxmLCAkZW5jb2RlZF9zdHJpbmcpID0gQF87CisgICAKKyAgICByZXR1cm4gJHNlbGYtPnVucGFja19lbmNvZGVkX3N0cmluZygkZW5jb2RlZF9zdHJpbmcpOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKK19fRU5EX18KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0Vhcmx5RXhpdEV4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NjZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvRWFybHlFeGl0RXhjZXB0aW9uLnBtCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6RWFybHlFeGl0RXhjZXB0aW9uOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgYmFzZSBxdyggQU5UTFI6OlJ1bnRpbWU6OkV4Y2VwdGlvbiApOworCisxOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvRXhjZXB0aW9uLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvRXhjZXB0aW9uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDljZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9FeGNlcHRpb24ucG0KQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6RXhjZXB0aW9uOworCit1c2UgRXhjZXB0aW9uOjpDbGFzczsKKwordXNlIE1vb3NlOworCitleHRlbmRzICdNb29zZTo6T2JqZWN0JywgJ0V4Y2VwdGlvbjo6Q2xhc3M6OkJhc2UnOworCitzdWIgQlVJTEQgeworICAgIG15ICgkc2VsZiwgJGFyZ3MpID0gQF87CisKKyAgICBteSAlZXhjZXB0aW9uX2FyZ3M7CisgICAgaWYgKGV4aXN0cyAkYXJncy0+e21lc3NhZ2V9KSB7CisgICAgICAgICRleGNlcHRpb25fYXJnc3ttZXNzYWdlfSA9ICRhcmdzLT57bWVzc2FnZX07CisgICAgfQorCisgICAgJHNlbGYtPl9pbml0aWFsaXplKCVleGNlcHRpb25fYXJncyk7CisgICAgcmV0dXJuOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0ludFN0cmVhbS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0ludFN0cmVhbS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ1OWZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvSW50U3RyZWFtLnBtCkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6OkludFN0cmVhbTsKKwordXNlIE1vb3NlOjpSb2xlOworCityZXF1aXJlcyAnY29uc3VtZSc7CisKK3JlcXVpcmVzICdMQSc7CisKK3JlcXVpcmVzICdtYXJrJzsKKworcmVxdWlyZXMgJ2luZGV4JzsKKworcmVxdWlyZXMgJ3Jld2luZCc7CisKK3JlcXVpcmVzICdyZWxlYXNlJzsKKworcmVxdWlyZXMgJ3NlZWsnOworCityZXF1aXJlcyAnc2l6ZSc7CisKK3JlcXVpcmVzICdnZXRfc291cmNlX25hbWUnOworCitubyBNb29zZTo6Um9sZTsKKzE7CitfX0VORF9fCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9MZXhlci5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL0xleGVyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2JhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9MZXhlci5wbQpAQCAtMCwwICsxLDMyNSBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6TGV4ZXI7CisKK3VzZSBFbmdsaXNoIHF3KCAtbm9fbWF0Y2hfdmFycyApOwordXNlIFJlYWRvbmx5OwordXNlIENhcnA7Cit1c2UgU3dpdGNoOworCit1c2UgQU5UTFI6OlJ1bnRpbWU6OlRva2VuOwordXNlIEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbjsKK3VzZSBBTlRMUjo6UnVudGltZTo6Q2hhclN0cmVhbTsKK3VzZSBBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uOworCit1c2UgTW9vc2U7CisKK2V4dGVuZHMgJ0FOVExSOjpSdW50aW1lOjpCYXNlUmVjb2duaXplcic7Cit3aXRoICdBTlRMUjo6UnVudGltZTo6VG9rZW5Tb3VyY2UnOworCitoYXMgJ2lucHV0JyA9PiAoCisgICAgaXMgPT4gJ3J3JywKKyAgICBkb2VzID0+ICdBTlRMUjo6UnVudGltZTo6Q2hhclN0cmVhbScsCispOworCitzdWIgcmVzZXQgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgICMgcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisgICAgJHNlbGYtPlNVUEVSOjpyZXNldCgpOworCisgICAgIyB3YWNrIExleGVyIHN0YXRlIHZhcmlhYmxlcworICAgIGlmIChkZWZpbmVkICRzZWxmLT5pbnB1dCkgeworICAgICAgICAjIHJld2luZCB0aGUgaW5wdXQKKyAgICAgICAgJHNlbGYtPmlucHV0LT5zZWVrKDApOworICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT5zdGF0ZSkgeworICAgICAgICAkc2VsZi0+c3RhdGUtPnRva2VuKHVuZGVmKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT50eXBlKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+SU5WQUxJRF9UT0tFTl9UWVBFKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT5jaGFubmVsKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+REVGQVVMVF9DSEFOTkVMKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT50b2tlbl9zdGFydF9jaGFyX2luZGV4KC0xKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT50b2tlbl9zdGFydF9jaGFyX3Bvc2l0aW9uX2luX2xpbmUoLTEpOworICAgICAgICAkc2VsZi0+c3RhdGUtPnN0YXJ0X2xpbmUoLTEpOworICAgICAgICAkc2VsZi0+c3RhdGUtPnRleHQodW5kZWYpOworICAgIH0KK30KKworIyBSZXR1cm4gYSB0b2tlbiBmcm9tIHRoaXMgc291cmNlOyBpLmUuLCBtYXRjaCBhIHRva2VuIG9uIHRoZSBjaGFyCisjIHN0cmVhbS4KK3N1YiBuZXh0X3Rva2VuIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICAkc2VsZi0+c3RhdGUtPnRva2VuKHVuZGVmKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT5jaGFubmVsKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+REVGQVVMVF9DSEFOTkVMKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT50b2tlbl9zdGFydF9jaGFyX2luZGV4KCRzZWxmLT5pbnB1dC0+aW5kZXgoKSk7CisgICAgICAgICRzZWxmLT5zdGF0ZS0+dG9rZW5fc3RhcnRfY2hhcl9wb3NpdGlvbl9pbl9saW5lKCRzZWxmLT5pbnB1dC0+Z2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgpKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT50b2tlbl9zdGFydF9saW5lKCRzZWxmLT5pbnB1dC0+Z2V0X2xpbmUoKSk7CisgICAgICAgICRzZWxmLT5zdGF0ZS0+dGV4dCh1bmRlZik7CisKKyAgICAgICAgaWYgKCRzZWxmLT5pbnB1dC0+TEEoMSkgZXEgQU5UTFI6OlJ1bnRpbWU6OkNoYXJTdHJlYW0tPkVPRikgeworICAgICAgICAgICAgcmV0dXJuIEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GX1RPS0VOOworICAgICAgICB9CisKKyAgICAgICAgbXkgJHJ2OworICAgICAgICBteSAkb3AgPSAnJzsKKyAgICAgICAgZXZhbCB7CisgICAgICAgICAgICAkc2VsZi0+bV90b2tlbnMoKTsKKyAgICAgICAgICAgIGlmICghZGVmaW5lZCAkc2VsZi0+c3RhdGUtPnRva2VuKSB7CisgICAgICAgICAgICAgICAgJHNlbGYtPmVtaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkc2VsZi0+c3RhdGUtPnRva2VuID09IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+U0tJUF9UT0tFTikgeworICAgICAgICAgICAgICAgICRvcCA9ICduZXh0JzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkb3AgPSAncmV0dXJuJzsKKyAgICAgICAgICAgICRydiA9ICRzZWxmLT5zdGF0ZS0+dG9rZW47CisgICAgICAgIH07CisgICAgICAgIHJldHVybiAkcnYgaWYgJG9wIGVxICdyZXR1cm4nOworICAgICAgICBuZXh0IGlmICRvcCBlcSAnbmV4dCc7CisKKyAgICAgICAgaWYgKCRFVkFMX0VSUk9SKSB7CisgICAgICAgICAgICBteSAkZXhjZXB0aW9uID0gJEVWQUxfRVJST1I7CisgICAgICAgICAgICBpZiAoJGV4Y2VwdGlvbi0+aXNhKCdBTlRMUjo6UnVudGltZTo6UmVjb2duaXRpb25FeGNlcHRpb24nKSkgeworICAgICAgICAgICAgICAgICRzZWxmLT5yZXBvcnRfZXJyb3IoJGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgJHNlbGYtPnJlY292ZXIoJGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNyb2FrICRleGNlcHRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgSW5zdHJ1Y3QgdGhlIGxleGVyIHRvIHNraXAgY3JlYXRpbmcgYSB0b2tlbiBmb3IgY3VycmVudCBsZXhlciBydWxlCisjIGFuZCBsb29rIGZvciBhbm90aGVyIHRva2VuLiAgbmV4dFRva2VuKCkga25vd3MgdG8ga2VlcCBsb29raW5nIHdoZW4KKyMgYSBsZXhlciBydWxlIGZpbmlzaGVzIHdpdGggdG9rZW4gc2V0IHRvIFNLSVBfVE9LRU4uICBSZWNhbGwgdGhhdAorIyBpZiB0b2tlbj09bnVsbCBhdCBlbmQgb2YgYW55IHRva2VuIHJ1bGUsIGl0IGNyZWF0ZXMgb25lIGZvciB5b3UKKyMgYW5kIGVtaXRzIGl0Lgorc3ViIHNraXAgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgICRzZWxmLT5zdGF0ZS0+dG9rZW4oQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5TS0lQX1RPS0VOKTsKKyAgICByZXR1cm47Cit9CisKKyMgVGhpcyBpcyB0aGUgbGV4ZXIgZW50cnkgcG9pbnQgdGhhdCBzZXRzIGluc3RhbmNlIHZhciAndG9rZW4nCitzdWIgbV90b2tlbnMgeworICAgIGNyb2FrICJVbmltcGxlbWVudGVkIjsKK30KKworIyBTZXQgdGhlIGNoYXIgc3RyZWFtIGFuZCByZXNldCB0aGUgbGV4ZXIKK3N1YiBzZXRfY2hhcl9zdHJlYW0geworICAgIG15ICgkc2VsZiwgJGlucHV0KSA9IEBfOworCisgICAgJHNlbGYtPmlucHV0KHVuZGVmKTsKKyAgICAkc2VsZi0+cmVzZXQoKTsKKyAgICAkc2VsZi0+aW5wdXQoJGlucHV0KTsKK30KKworc3ViIGdldF9jaGFyX3N0cmVhbSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIHJldHVybiAkc2VsZi0+aW5wdXQ7Cit9CisKK3N1YiBnZXRfc291cmNlX25hbWUgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPmlucHV0LT5nZXRfc291cmNlX25hbWUoKTsKK30KKworc3ViIGVtaXQgeworICAgIGlmIChAXyA9PSAxKSB7CisgICAgICAgIG15ICgkc2VsZikgPSBAXzsKKwkjIFRoZSBzdGFuZGFyZCBtZXRob2QgY2FsbGVkIHRvIGF1dG9tYXRpY2FsbHkgZW1pdCBhIHRva2VuIGF0IHRoZQorCSMgb3V0ZXJtb3N0IGxleGljYWwgcnVsZS4gIFRoZSB0b2tlbiBvYmplY3Qgc2hvdWxkIHBvaW50IGludG8gdGhlCisJIyBjaGFyIGJ1ZmZlciBzdGFydC4uc3RvcC4gIElmIHRoZXJlIGlzIGEgdGV4dCBvdmVycmlkZSBpbiAndGV4dCcsCisJIyB1c2UgdGhhdCB0byBzZXQgdGhlIHRva2VuJ3MgdGV4dC4gIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGVtaXQKKwkjIGN1c3RvbSBUb2tlbiBvYmplY3RzLgorICAgICAgICBteSAkdCA9IEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbi0+bmV3KHsKKyAgICAgICAgICAgIGlucHV0ID0+ICRzZWxmLT5pbnB1dCwKKyAgICAgICAgICAgIHR5cGUgID0+ICRzZWxmLT5zdGF0ZS0+dHlwZSwKKyAgICAgICAgICAgIGNoYW5uZWwgPT4gJHNlbGYtPnN0YXRlLT5jaGFubmVsLAorICAgICAgICAgICAgc3RhcnQgPT4gJHNlbGYtPnN0YXRlLT50b2tlbl9zdGFydF9jaGFyX2luZGV4LAorICAgICAgICAgICAgc3RvcCA9PiAkc2VsZi0+Z2V0X2NoYXJfaW5kZXgoKSAtIDEKKyAgICAgICAgfSk7CisKKyAgICAgICAgJHQtPnNldF9saW5lKCRzZWxmLT5zdGF0ZS0+dG9rZW5fc3RhcnRfbGluZSk7CisgICAgICAgICR0LT5zZXRfdGV4dCgkc2VsZi0+c3RhdGUtPnRleHQpOworICAgICAgICAkdC0+c2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgkc2VsZi0+c3RhdGUtPnRva2VuX3N0YXJ0X2NoYXJfcG9zaXRpb25faW5fbGluZSk7CisgICAgICAgICRzZWxmLT5lbWl0KCR0KTsKKyAgICAgICAgcmV0dXJuICR0OworICAgIH0gZWxzaWYgKEBfID09IDIpIHsKKyAgICAgICAgbXkgKCRzZWxmLCAkdG9rZW4pID0gQF87CisJIyBDdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBlbWl0cyBwZXIgbmV4dFRva2VuIGludm9jYXRpb24KKwkjIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuICBTdWJjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kCisJIyBuZXh0VG9rZW4gKHRvIHB1c2ggdG9rZW5zIGludG8gYSBsaXN0IGFuZCBwdWxsIGZyb20gdGhhdCBsaXN0IHJhdGhlcgorCSMgdGhhbiBhIHNpbmdsZSB2YXJpYWJsZSBhcyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMpLgorICAgICAgICAkc2VsZi0+c3RhdGUtPnRva2VuKCR0b2tlbik7CisgICAgfQorfQorCitzdWIgbWF0Y2ggeworICAgIG15ICgkc2VsZiwgJHMpID0gQF87CisKKyAgICBmb3JlYWNoIG15ICRjIChzcGxpdCAvLywgJHMpIHsKKyAgICAgICAgaWYgKCRzZWxmLT5pbnB1dC0+TEEoMSkgbmUgJGMpIHsKKyAgICAgICAgICAgIGlmICgkc2VsZi0+c3RhdGUtPmJhY2t0cmFja2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+c3RhdGUtPmZhaWxlZCgxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBteSAkbXRlID0gQU5UTFI6OlJ1bnRpbWU6Ok1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi0+bmV3KHsKKyAgICAgICAgICAgICAgICBleHBlY3RpbmcgPT4gJGMsCisgICAgICAgICAgICAgICAgaW5wdXQgPT4gJHNlbGYtPmlucHV0CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICRzZWxmLT5yZWNvdmVyKCRtdGUpOworICAgICAgICAgICAgY3JvYWsgJG10ZTsKKyAgICAgICAgfQorICAgICAgICAkc2VsZi0+aW5wdXQtPmNvbnN1bWUoKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT5mYWlsZWQoMCk7CisgICAgfQorfQorCitzdWIgbWF0Y2hfYW55IHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICAkc2VsZi0+aW5wdXQtPmNvbnN1bWUoKTsKK30KKworc3ViIG1hdGNoX3JhbmdlIHsKKyAgICBteSAoJHNlbGYsICRhLCAkYikgPSBAXzsKKworICAgIGlmICgkc2VsZi0+aW5wdXQtPkxBKDEpIGx0ICRhIHx8ICRzZWxmLT5pbnB1dC0+TEEoMSkgZ3QgJGIpIHsKKyAgICAgICAgaWYgKCRzZWxmLT5zdGF0ZS0+YmFja3RyYWNraW5nID4gMCkgeworICAgICAgICAgICAgJHNlbGYtPnN0YXRlLT5mYWlsZWQoMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBteSAkbXJlID0gQU5UTFI6OlJ1bnRpbWU6Ok1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbigkYSwgJGIsICRzZWxmLT5pbnB1dCk7CisgICAgICAgICRzZWxmLT5yZWNvdmVyKCRtcmUpOworICAgICAgICBjcm9hayAkbXJlOworICAgIH0KKworICAgICRzZWxmLT5pbnB1dC0+Y29uc3VtZSgpOworICAgICRzZWxmLT5zdGF0ZS0+ZmFpbGVkKDApOworfQorCitzdWIgZ2V0X2xpbmUgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+aW5wdXQtPmdldF9saW5lKCk7Cit9CisKK3N1YiBnZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPmlucHV0LT5nZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lKCk7Cit9CisKKyMgV2hhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIG9mIGxvb2thaGVhZD8KK3N1YiBnZXRfY2hhcl9pbmRleCB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT5pbnB1dC0+aW5kZXgoKTsKK30KKworIyBSZXR1cm4gdGhlIHRleHQgbWF0Y2hlZCBzbyBmYXIgZm9yIHRoZSBjdXJyZW50IHRva2VuIG9yIGFueQorIyB0ZXh0IG92ZXJyaWRlLgorc3ViIGdldF90ZXh0IHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+c3RhdGUtPnRleHQpIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5zdGF0ZS0+dGV4dDsKKyAgICB9CisgICAgcmV0dXJuICRzZWxmLT5pbnB1dC0+c3Vic3RyaW5nKCRzZWxmLT5zdGF0ZS0+dG9rZW5fc3RhcnRfY2hhcl9pbmRleCwgJHNlbGYtPmdldF9jaGFyX2luZGV4KCkgLSAxKTsKK30KKworIyBTZXQgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyB0b2tlbjsgaXQgd2lwZXMgYW55IHByZXZpb3VzCisjIGNoYW5nZXMgdG8gdGhlIHRleHQuCitzdWIgc2V0X3RleHQgeworICAgIG15ICgkc2VsZiwgJHRleHQpID0gQF87CisKKyAgICAkc2VsZi0+c3RhdGUtPnRleHQoJHRleHQpOworfQorCitzdWIgcmVwb3J0X2Vycm9yIHsKKyAgICBSZWFkb25seSBteSAkdXNhZ2UgPT4gJ3ZvaWQgcmVwb3J0X2Vycm9yKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpJzsKKyAgICBjcm9hayAkdXNhZ2UgaWYgQF8gIT0gMjsKKyAgICBteSAoJHNlbGYsICRlKSA9IEBfOworCisgICAgJHNlbGYtPmRpc3BsYXlfcmVjb2duaXRpb25fZXJyb3IoJHNlbGYtPmdldF90b2tlbl9uYW1lcygpLCAkZSk7Cit9CisKK3N1YiBnZXRfZXJyb3JfbWVzc2FnZSB7CisgICAgbXkgKCRzZWxmLCAkZSwgJHRva2VuX25hbWVzKSA9IEBfOworCisgICAgbXkgJG1zZzsKKyAgICBpZiAoJGUtPmlzYSgnQU5UTFI6OlJ1bnRpbWU6Ok1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbicpKSB7CisgICAgICAgICRtc2cgPSAnbWlzbWF0Y2hlZCBjaGFyYWN0ZXIgJworICAgICAgICAgIC4gJHNlbGYtPmdldF9jaGFyX2Vycm9yX2Rpc3BsYXkoJGUtPmdldF9jKCkpCisgICAgICAgICAgLiAnIGV4cGVjdGluZyAnCisgICAgICAgICAgLiAkc2VsZi0+Z2V0X2NoYXJfZXJyb3JfZGlzcGxheSgkZS0+ZXhwZWN0aW5nKTsKKyAgICB9IGVsc2lmICgkZS0+aXNhKCdBTlRMUjo6UnVudGltZTo6Tm9WaWFibGVBbHRFeGNlcHRpb24nKSkgeworICAgICAgICAkbXNnID0gJ25vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgJyAuICRzZWxmLT5nZXRfY2hhcl9lcnJvcl9kaXNwbGF5KCRlLT5nZXRfYygpKTsKKyAgICB9IGVsc2lmICgkZS0+aXNhKCdBTlRMUjo6UnVudGltZTo6RWFybHlFeGl0RXhjZXB0aW9uJykpIHsKKyAgICAgICAgJG1zZyA9ICdyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGNoYXJhY3RlciAnCisgICAgICAgICAgLiAkc2VsZi0+Z2V0X2NoYXJfZXJyb3JfZGlzcGxheSgkZS0+Z2V0X2MoKSk7CisgICAgfSBlbHNpZiAoJGUtPmlzYSgnQU5UTFI6OlJ1bnRpbWU6Ok1pc21hdGNoZWRTZXRFeGNlcHRpb24nKSkgeworICAgICAgICAkbXNnID0gJ21pc21hdGNoZWQgY2hhcmFjdGVyICcgLiAkc2VsZi0+Z2V0X2NoYXJfZXJyb3JfZGlzcGxheSgkZS0+Z2V0X2MoKSkKKyAgICAgICAgICAuICcgZXhwZWN0aW5nIHNldCAnIC4gJGUtPmV4cGVjdGluZzsKKyAgICB9IGVsc2lmICgkZS0+aXNhKCdBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbicpKSB7CisgICAgICAgICRtc2cgPSAnbWlzbWF0Y2hlZCBjaGFyYWN0ZXIgJyAuICRzZWxmLT5nZXRfY2hhcl9lcnJvcl9kaXNwbGF5KCRlLT5nZXRfYygpKQorICAgICAgICAgIC4gJyBleHBlY3Rpbmcgc2V0ICcgLiAkZS0+ZXhwZWN0aW5nOworICAgIH0gZWxzaWYgKCRlLT5pc2EoJ0FOVExSOjpSdW50aW1lOjpNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24nKSkgeworICAgICAgICAkbXNnID0gJ21pc21hdGNoZWQgY2hhcmFjdGVyICcgLiAkc2VsZi0+Z2V0X2NoYXJfZXJyb3JfZGlzcGxheSgkZS0+Z2V0X2MoKSkKKyAgICAgICAgICAuICcgZXhwZWN0aW5nIHNldCAnIC4gJHNlbGYtPmdldF9jaGFyX2Vycm9yX2Rpc3BsYXkoJGUtPmEpCisgICAgICAgICAgLiAnLi4nIC4gJHNlbGYtPmdldF9jaGFyX2Vycm9yX2Rpc3BsYXkoJGUtPmIpOworICAgIH0gZWxzZSB7CisgICAgICAgICRtc2cgPSAkc2VsZi0+U1VQRVI6OmdldF9lcnJvcl9tZXNzYWdlKCRlLCAkdG9rZW5fbmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gJG1zZzsKK30KKworc3ViIGdldF9jaGFyX2Vycm9yX2Rpc3BsYXkgeworICAgIG15ICgkc2VsZiwgJGMpID0gQF87CisKKyAgICBteSAkczsKKyAgICBpZiAoJGMgZXEgQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5FT0YpIHsKKyAgICAgICAgJHMgPSAnPEVPRj4nOworICAgIH0gZWxzaWYgKCRjIGVxICJcbiIpIHsKKyAgICAgICAgJHMgPSAnXG4nOworICAgIH0gZWxzaWYgKCRjIGVxICJcdCIpIHsKKyAgICAgICAgJHMgPSAnXHQnOworICAgIH0gZWxzaWYgKCRjIGVxICJcciIpIHsKKyAgICAgICAgJHMgPSAnXHInOworICAgIH0gZWxzZSB7CisgICAgICAgICRzID0gJGM7CisgICAgfQorCisgICAgcmV0dXJuICInJHMnIjsKK30KKworIyBMZXhlcnMgY2FuIG5vcm1hbGx5IG1hdGNoIGFueSBjaGFyIGluIGl0J3Mgdm9jYWJ1bGFyeSBhZnRlciBtYXRjaGluZworIyBhIHRva2VuLCBzbyBkbyB0aGUgZWFzeSB0aGluZyBhbmQganVzdCBraWxsIGEgY2hhcmFjdGVyIGFuZCBob3BlCisjIGl0IGFsbCB3b3JrcyBvdXQuICBZb3UgY2FuIGluc3RlYWQgdXNlIHRoZSBydWxlIGludm9jYXRpb24gc3RhY2sKKyMgdG8gZG8gc29waGlzdGljYXRlZCBlcnJvciByZWNvdmVyeSBpZiB5b3UgYXJlIGluIGEgZnJhZ21lbnQgcnVsZS4KK3N1YiByZWNvdmVyIHsKKyAgICBteSAoJHNlbGYsICRyZSkgPSBAXzsKKworICAgICRzZWxmLT5pbnB1dC0+Y29uc3VtZSgpOworfQorCitzdWIgdHJhY2VfaW4geworICAgIG15ICgkc2VsZiwgJHJ1bGVfbmFtZSwgJHJ1bGVfaW5kZXgpID0gQF87CisKKyAgICBteSAkaW5wdXRfc3ltYm9sID0gJHNlbGYtPmlucHV0LT5MVCgxKSAuICcgbGluZT0nIC4gJHNlbGYtPmdldF9saW5lKCkgLiAnOicgLiAkc2VsZi0+Z2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgpOworICAgICRzZWxmLT5TVVBFUjo6dHJhY2VfaW4oJHJ1bGVfbmFtZSwgJHJ1bGVfaW5kZXgsICRpbnB1dF9zeW1ib2wpOworfQorCitzdWIgdHJhY2Vfb3V0IHsKKyAgICBteSAoJHNlbGYsICRydWxlX25hbWUsICRydWxlX2luZGV4KSA9IEBfOworCisgICAgbXkgJGlucHV0X3N5bWJvbCA9ICRzZWxmLT5pbnB1dC0+TFQoMSkgLiAnIGxpbmU9JyAuICRzZWxmLT5nZXRfbGluZSgpIC4gJzonIC4gJHNlbGYtPmdldF9jaGFyX3Bvc2l0aW9uX2luX2xpbmUoKTsKKyAgICAkc2VsZi0+U1VQRVI6OnRyYWNlX291dCgkcnVsZV9uYW1lLCAkcnVsZV9pbmRleCwgJGlucHV0X3N5bWJvbCk7Cit9CisKK25vIE1vb3NlOworX19QQUNLQUdFX18tPm1ldGEtPm1ha2VfaW1tdXRhYmxlKCk7CisxOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3YjBlNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL01pc21hdGNoZWRTZXRFeGNlcHRpb24ucG0KQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpNaXNtYXRjaGVkU2V0RXhjZXB0aW9uOworCit1c2UgTW9vc2U7CisKK2V4dGVuZHMgJ0FOVExSOjpSdW50aW1lOjpFeGNlcHRpb24nOworCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL01pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTQxZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLnBtCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6Ok1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbjsKKwordXNlIEFOVExSOjpSdW50aW1lOjpUb2tlbjsKKwordXNlIE1vb3NlOworCit1c2Ugb3ZlcmxvYWQKKyAgICAnIiInID0+IFwmdG9fc3RyaW5nLAorICAgICdib29sJyA9PiBzdWIgeyAxIH0sCisgICAgZmFsbGJhY2sgPT4gMQorICAgIDsKKworZXh0ZW5kcyAnQU5UTFI6OlJ1bnRpbWU6OlJlY29nbml0aW9uRXhjZXB0aW9uJzsKKworaGFzICdleHBlY3RpbmcnID0+ICgKKyAgICBpcyAgPT4gJ3JvJywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiBBTlRMUjo6UnVudGltZTo6VG9rZW4tPklOVkFMSURfVE9LRU5fVFlQRSwKKyk7CisKK3N1YiBnZXRfZXhwZWN0aW5nIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5leHBlY3Rpbmc7Cit9CisKK3N1YiB0b19zdHJpbmcgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gIk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbigiIC4gJHNlbGYtPmdldF91bmV4cGVjdGVkX3R5cGUoKSAuICIhPSIgLiAkc2VsZi0+ZXhwZWN0aW5nIC4gIikiOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL01pc3NpbmdUb2tlbkV4Y2VwdGlvbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjU1YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvTWlzc2luZ1Rva2VuRXhjZXB0aW9uLnBtCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6Ok1pc3NpbmdUb2tlbkV4Y2VwdGlvbjsKKwordXNlIE1vb3NlOworCit1c2Ugb3ZlcmxvYWQKKyAgICAnIiInID0+IFwmdG9fc3RyaW5nOworCitleHRlbmRzICdBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uJzsKKworaGFzICdpbnNlcnRlZCcgPT4gKAorICAgIGlzICA9PiAncm8nLAorICAgIGlzYSA9PiAnQW55JywKKyk7CisKK3N1YiBnZXRfbWlzc2luZ190eXBlIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5leHBlY3Rpbmc7Cit9CisKK3N1YiB0b19zdHJpbmcgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIGlmIChkZWZpbmVkIChteSAkaW5zZXJ0ZWQgPSAkc2VsZi0+aW5zZXJ0ZWQpICYmIGRlZmluZWQgKG15ICR0b2tlbiA9ICRzZWxmLT50b2tlbikpIHsKKyAgICAgICAgcmV0dXJuICJNaXNzaW5nVG9rZW5FeGNlcHRpb24oaW5zZXJ0ZWQgJGluc2VydGVkIGF0ICIgLiAkdG9rZW4tPmdldF90ZXh0KCkgLiAiKSI7CisgICAgfQorICAgIGlmIChkZWZpbmVkICRzZWxmLT50b2tlbikgeworICAgICAgICByZXR1cm4gIk1pc3NpbmdUb2tlbkV4Y2VwdGlvbihhdCAiIC4gJHNlbGYtPnRva2VuLT5nZXRfdGV4dCgpIC4gIikiOworICAgIH0KKworICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uIjsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoKTsKKzE7CitfX0VORF9fCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL05vVmlhYmxlQWx0RXhjZXB0aW9uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTc4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ob1ZpYWJsZUFsdEV4Y2VwdGlvbi5wbQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpOb1ZpYWJsZUFsdEV4Y2VwdGlvbjsKKwordXNlIE1vb3NlOworCitleHRlbmRzICdBTlRMUjo6UnVudGltZTo6UmVjb2duaXRpb25FeGNlcHRpb24nOworCitoYXMgJ2dyYW1tYXJfZGVjaXNpb25fZGVzY3JpcHRpb24nID0+ICgKKyAgICBpcyAgPT4gJ3JvJywKKyAgICBpc2EgPT4gJ1N0cicsCisgICAgcmVxdWlyZWQgPT4gMSwKKyk7CisKK2hhcyAnZGVjaXNpb25fbnVtYmVyJyA9PiAoCisgICAgaXMgID0+ICdybycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIHJlcXVpcmVkID0+IDEsCispOworCitoYXMgJ3N0YXRlX251bWJlcicgPT4gKAorICAgIGlzICA9PiAncm8nLAorICAgIGlzYSA9PiAnSW50JywKKyAgICByZXF1aXJlZCA9PiAxLAorKTsKKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoKTsKKzE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9QYXJzZXIucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9QYXJzZXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3MDhhZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1BhcnNlci5wbQpAQCAtMCwwICsxLDkzIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpQYXJzZXI7CisKK3VzZSBSZWFkb25seTsKK3VzZSBDYXJwOworCit1c2UgTW9vc2U7CisKK2V4dGVuZHMgJ0FOVExSOjpSdW50aW1lOjpCYXNlUmVjb2duaXplcic7CisKK2hhcyAnaW5wdXQnID0+ICgKKyAgICBpcyAgID0+ICdydycsCisgICAgZG9lcyA9PiAnQU5UTFI6OlJ1bnRpbWU6OlRva2VuU3RyZWFtJworKTsKKworc3ViIHJlc2V0IHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICAkc2VsZi0+U1VQRVI6OnJlc2V0KCk7ICAjICByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+aW5wdXQpIHsKKyAgICAgICAgJHNlbGYtPmlucHV0LT5zZWVrKDApOyAgIyByZXdpbmQgdGhlIGlucHV0CisgICAgfQorfQorCitzdWIgZ2V0X2N1cnJlbnRfaW5wdXRfc3ltYm9sIHsKKyAgICBteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPmlucHV0LT5MVCgxKTsKK30KKworc3ViIGdldF9taXNzaW5nX3N5bWJvbCB7CisgICAgbXkgKCRzZWxmLCAkYXJnX3JlZikgPSBAXzsKKyAgICBteSAkaW5wdXQgPSAkYXJnX3JlZi0+e2lucHV0fTsKKyAgICBteSAkZXhjZXB0aW9uID0gJGFyZ19yZWYtPntleGNlcHRpb259OworICAgIG15ICRleHBlY3RlZF90b2tlbl90eXBlID0gJGFyZ19yZWYtPntleHBlY3RlZF90b2tlbl90eXBlfTsKKyAgICBteSAkZm9sbG93ID0gJGFyZ19yZWYtPntmb2xsb3d9OworCisgICAgbXkgJHRva2VuX3RleHQ7CisgICAgaWYgKCRleHBlY3RlZF90b2tlbl90eXBlID09IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GKSB7CisgICAgICAgICR0b2tlbl90ZXh0ID0gJzxtaXNzaW5nIEVPRj4nOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHRva2VuX3RleHQgPSAnPG1pc3NpbmcgJyAuICRzZWxmLT5nZXRfdG9rZW5fbmFtZXMoKS0+WyRleHBlY3RlZF90b2tlbl90eXBlXSAuICc+JzsKKyAgICB9CisKKyAgICBteSAkdCA9IEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbi0+bmV3KHsKKyAgICAgICAgdHlwZSA9PiAkZXhwZWN0ZWRfdG9rZW5fdHlwZSwKKyAgICAgICAgdGV4dCA9PiAkdG9rZW5fdGV4dAorICAgIH0pOworICAgIG15ICRjdXJyZW50ID0gJGlucHV0LT5MVCgxKTsKKyAgICBpZiAoJGN1cnJlbnQtPmdldF90eXBlKCkgPT0gQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5FT0YpIHsKKyAgICAgICAgJGN1cnJlbnQgPSAkaW5wdXQtPkxUKC0xKTsKKyAgICB9CisgICAgJHQtPnNldF9saW5lKCRjdXJyZW50LT5nZXRfbGluZSgpKTsKKyAgICAkdC0+c2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgkY3VycmVudC0+Z2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgpKTsKKyAgICAkdC0+c2V0X2NoYW5uZWwoJHNlbGYtPkRFRkFVTFRfVE9LRU5fQ0hBTk5FTCk7CisKKyAgICByZXR1cm4gJHQ7Cit9CisKK3N1YiBzZXRfdG9rZW5fc3RyZWFtIHsKKyAgICBteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsKKworICAgICRzZWxmLT5pbnB1dCh1bmRlZik7CisgICAgJHNlbGYtPnJlc2V0KCk7CisgICAgJHNlbGYtPmlucHV0KCRpbnB1dCk7Cit9CisKK3N1YiBnZXRfdG9rZW5fc3RyZWFtIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPmlucHV0OworfQorCitzdWIgZ2V0X3NvdXJjZV9uYW1lIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5pbnB1dC0+Z2V0X3NvdXJjZV9uYW1lKCk7Cit9CisKK3N1YiB0cmFjZV9pbiB7CisgICAgbXkgKCRzZWxmLCAkcnVsZV9uYW1lLCAkcnVsZV9pbmRleCkgPSBAXzsKKworICAgICRzZWxmLT5TVVBFUjo6dHJhY2VfaW4oJHJ1bGVfbmFtZSwgJHJ1bGVfaW5kZXgsICRzZWxmLT5pbnB1dC0+TFQoMSkpOworfQorCitzdWIgdHJhY2Vfb3V0IHsKKyAgICBteSAoJHNlbGYsICRydWxlX25hbWUsICRydWxlX2luZGV4KSA9IEBfOworCisgICAgJHNlbGYtPlNVUEVSOjp0cmFjZV9vdXQoJHJ1bGVfbmFtZSwgJHJ1bGVfaW5kZXgsICRzZWxmLT5pbnB1dC0+TFQoMSkpOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKK19fRU5EX18KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FkY2YxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvUGFyc2VyUnVsZVJldHVyblNjb3BlLnBtCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6OlBhcnNlclJ1bGVSZXR1cm5TY29wZTsKKwordXNlIE1vb3NlOworCitleHRlbmRzICdBTlRMUjo6UnVudGltZTo6UnVsZVJldHVyblNjb3BlJzsKKworaGFzICdzdGFydCcgPT4gKAorICAgIGlzICAgPT4gJ3J3JywKKyAgICBkb2VzID0+ICdBTlRMUjo6UnVudGltZTo6VG9rZW4nLAorKTsKKworaGFzICdzdG9wJyA9PiAoCisgICAgaXMgICA9PiAncncnLAorICAgIGRvZXMgPT4gJ0FOVExSOjpSdW50aW1lOjpUb2tlbicsCispOworCitzdWIgZ2V0X3N0YXJ0IHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5zdGFydDsKK30KKworc3ViIGdldF9zdG9wIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5zdG9wOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKK19fRU5EX18KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvUmVjb2duaXRpb25FeGNlcHRpb24ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4ZDBiYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1JlY29nbml0aW9uRXhjZXB0aW9uLnBtCkBAIC0wLDAgKzEsMTIyIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKKwordXNlIENhcnA7Cit1c2UgUmVhZG9ubHk7CisKK3VzZSBNb29zZTsKK3VzZSBNb29zZTo6VXRpbDo6VHlwZUNvbnN0cmFpbnRzOworCitleHRlbmRzICdBTlRMUjo6UnVudGltZTo6RXhjZXB0aW9uJzsKKworaGFzICdpbnB1dCcgPT4gKAorICAgIGlzICAgPT4gJ3JvJywKKyAgICBkb2VzID0+ICdBTlRMUjo6UnVudGltZTo6SW50U3RyZWFtJywKKyAgICByZXF1aXJlZCA9PiAxLAorKTsKKworaGFzICdpbmRleCcgPT4gKAorICAgIGlzICA9PiAncm8nLAorICAgIGlzYSA9PiAnSW50JywKKyAgICBkZWZhdWx0ID0+IDAsCispOworCitoYXMgJ3Rva2VuJyA9PiAoCisgICAgaXMgICA9PiAncm8nLAorICAgIGRvZXMgPT4gJ0FOVExSOjpSdW50aW1lOjpUb2tlbicsCispOworCitoYXMgJ25vZGUnID0+ICgKKyAgICBpcyAgPT4gJ3JvJywKKyAgICBpc2EgPT4gJ0FueScsCispOworCitzdWJ0eXBlICdDaGFyJworICAgID0+IGFzICdTdHInCisgICAgPT4gd2hlcmUgeyAkXyBlcSAnLTEnIHx8IGxlbmd0aCA9PSAxIH07CisKK2hhcyAnYycgPT4gKAorICAgIGlzICA9PiAncm8nLAorICAgIGlzYSA9PiAnTWF5YmVbQ2hhcl0nLAorKTsKKworaGFzICdsaW5lJyA9PiAoCisgICAgaXMgID0+ICdybycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gMCwKKyk7CisKK2hhcyAnY2hhcl9wb3NpdGlvbl9pbl9saW5lJyA9PiAoCisgICAgaXMgID0+ICdybycsCisgICAgaXNhID0+ICdJbnQnLAorICAgIGRlZmF1bHQgPT4gMCwKKyk7CisKK2hhcyAnYXBwcm94aW1hdGVfbGluZV9pbmZvJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdCb29sJywKKyk7CisKK3N1YiBCVUlMREFSR1MgeworICAgIG15ICgkY2xhc3MsIEBhcmdzKSA9IEBfOworICAgIG15ICRhcmdzID0gJGNsYXNzLT5TVVBFUjo6QlVJTERBUkdTKEBhcmdzKTsKKworICAgIG15ICRuZXdfYXJncyA9IHsgJSRhcmdzIH07CisgICAgbXkgJGlucHV0ID0gJGFyZ3MtPntpbnB1dH07CisgICAgJG5ld19hcmdzLT57aW5wdXR9ID0gJGlucHV0OworICAgICRuZXdfYXJncy0+e2luZGV4fSA9ICRpbnB1dC0+aW5kZXgoKTsKKworICAgIGlmICgkaW5wdXQtPmRvZXMoJ0FOVExSOjpSdW50aW1lOjpUb2tlblN0cmVhbScpKSB7CisgICAgICAgIG15ICR0b2tlbiA9ICRpbnB1dC0+TFQoMSk7CisgICAgICAgICRuZXdfYXJncy0+e3Rva2VufSA9ICR0b2tlbjsKKyAgICAgICAgJG5ld19hcmdzLT57bGluZX0gPSAkdG9rZW4tPmdldF9saW5lKCk7CisgICAgICAgICRuZXdfYXJncy0+e2NoYXJfcG9zaXRpb25faW5fbGluZX0gPSAkdG9rZW4tPmdldF9jaGFyX3Bvc2l0aW9uX2luX2xpbmUoKTsKKyAgICB9CisKKyAgICBpZiAoJGlucHV0LT5kb2VzKCdBTlRMUjo6UnVudGltZTo6VHJlZU5vZGVTdHJlYW0nKSkgeworICAgICAgICAjIGV4dHJhY3RfaW5mb3JtYXRpb25fZnJvbV90cmVlX25vZGVfc3RyZWFtKCRpbnB1dCk7CisgICAgfQorICAgIGVsc2lmICgkaW5wdXQtPmRvZXMoJ0FOVExSOjpSdW50aW1lOjpDaGFyU3RyZWFtJykpIHsKKyAgICAgICAgJG5ld19hcmdzLT57Y30gPSAkaW5wdXQtPkxBKDEpOworICAgICAgICAkbmV3X2FyZ3MtPntsaW5lfSA9ICRpbnB1dC0+Z2V0X2xpbmUoKTsKKyAgICAgICAgJG5ld19hcmdzLT57Y2hhcl9wb3NpdGlvbl9pbl9saW5lfSA9ICRpbnB1dC0+Z2V0X2NoYXJfcG9zaXRpb25faW5fbGluZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJG5ld19hcmdzLT57Y30gPSAkaW5wdXQtPkxBKDEpOworICAgIH0KKworICAgIHJldHVybiAkbmV3X2FyZ3M7Cit9CisKK3N1YiBnZXRfdW5leHBlY3RlZF90eXBlIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICBpZiAoJHNlbGYtPmlucHV0LT5pc2EoJ0FOVExSOjpSdW50aW1lOjpUb2tlblN0cmVhbScpKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+dG9rZW4tPmdldF90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5jOworICAgIH0KK30KKworc3ViIGdldF9jIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5jOworfQorCitzdWIgZ2V0X2xpbmUgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPmxpbmU7Cit9CisKK3N1YiBnZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT5jaGFyX3Bvc2l0aW9uX2luX2xpbmU7Cit9CisKK3N1YiBnZXRfdG9rZW4geworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPnRva2VuOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM1MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLnBtCkBAIC0wLDAgKzEsMTMwIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpSZWNvZ25pemVyU2hhcmVkU3RhdGU7CisKK3VzZSBBTlRMUjo6UnVudGltZTo6VG9rZW47CisKK3VzZSBNb29zZTsKKworIyBUcmFjayB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhbnkgcnVsZSBpbnZvY2F0aW9uLgorIyBTdGFjayBncm93cyB1cHdhcmRzLiAgV2hlbiBpdCBoaXRzIHRoZSBtYXgsIGl0IGdyb3dzIDJ4IGluIHNpemUKKyMgYW5kIGtlZXBzIGdvaW5nLgoraGFzICdmb2xsb3dpbmcnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0FycmF5UmVmW0FOVExSOjpSdW50aW1lOjpCaXRTZXRdJywKKyAgICBkZWZhdWx0ID0+IHN1YiB7IFtdIH0sCispOworCitoYXMgJ19mc3AnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAtMSwKKyk7CisKKyMgVGhpcyBpcyB0cnVlIHdoZW4gd2Ugc2VlIGFuIGVycm9yIGFuZCBiZWZvcmUgaGF2aW5nIHN1Y2Nlc3NmdWxseQorIyBtYXRjaGVkIGEgdG9rZW4uICBQcmV2ZW50cyBnZW5lcmF0aW9uIG9mIG1vcmUgdGhhbiBvbmUgZXJyb3IgbWVzc2FnZQorIyBwZXIgZXJyb3IuCitoYXMgJ2Vycm9yX3JlY292ZXJ5JyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdCb29sJywKKyAgICBkZWZhdWx0ID0+IDAsCispOworCisjIFRoZSBpbmRleCBpbnRvIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIGxhc3QgZXJyb3Igb2NjdXJyZWQuCisjIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZXJlIGFuIGVycm9yIGlzIGZvdW5kCisjIGJ1dCBubyB0b2tlbiBpcyBjb25zdW1lZCBkdXJpbmcgcmVjb3ZlcnkuLi5hbm90aGVyIGVycm9yIGlzIGZvdW5kLAorIyBhZCBuYXNldW0uICBUaGlzIGlzIGEgZmFpbHNhZmUgbWVjaGFuaXNtIHRvIGd1YXJhbnRlZSB0aGF0IGF0IGxlYXN0CisjIG9uZSB0b2tlbi90cmVlIG5vZGUgaXMgY29uc3VtZWQgZm9yIHR3byBlcnJvcnMuCitoYXMgJ2xhc3RfZXJyb3JfaW5kZXgnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAtMSwKKyk7CisKKyMgSW4gbGlldSBvZiBhIHJldHVybiB2YWx1ZSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHJ1bGUgb3IgdG9rZW4KKyMgaGFzIGZhaWxlZCB0byBtYXRjaC4gIFJlc2V0IHRvIGZhbHNlIHVwb24gdmFsaWQgdG9rZW4gbWF0Y2guCitoYXMgJ2ZhaWxlZCcgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnQm9vbCcsCisgICAgZGVmYXVsdCA9PiAwLAorKTsKKworIyBEaWQgdGhlIHJlY29nbml6ZXIgZW5jb3VudGVyIGEgc3ludGF4IGVycm9yPyAgVHJhY2sgaG93IG1hbnkuCitoYXMgJ3N5bnRheF9lcnJvcnMnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAwLAorKTsKKworIyBJZiAwLCBubyBiYWNrdHJhY2tpbmcgaXMgZ29pbmcgb24uICBTYWZlIHRvIGV4ZWMgYWN0aW9ucyBldGMuLi4KKyMgSWYgPjAgdGhlbiBpdCdzIHRoZSBsZXZlbCBvZiBiYWNrdHJhY2tpbmcuCitoYXMgJ2JhY2t0cmFja2luZycgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnSW50JywKKyAgICBkZWZhdWx0ID0+IDAsCispOworCisjIEFuIGFycmF5W3NpemUgbnVtIHJ1bGVzXSBvZiBNYXA8SW50ZWdlcixJbnRlZ2VyPiB0aGF0IHRyYWNrcworIyB0aGUgc3RvcCB0b2tlbiBpbmRleCBmb3IgZWFjaCBydWxlLiAgcnVsZU1lbW9bcnVsZUluZGV4XSBpcworIyB0aGUgbWVtb2l6YXRpb24gdGFibGUgZm9yIHJ1bGVJbmRleC4gIEZvciBrZXkgcnVsZVN0YXJ0SW5kZXgsIHlvdQorIyBnZXQgYmFjayB0aGUgc3RvcCB0b2tlbiBmb3IgYXNzb2NpYXRlZCBydWxlIG9yIE1FTU9fUlVMRV9GQUlMRUQuCisjIFRoaXMgaXMgb25seSB1c2VkIGlmIHJ1bGUgbWVtb2l6YXRpb24gaXMgb24gKHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQpLgoraGFzICdydWxlX21lbW8nID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ01heWJlW0FycmF5UmVmW0hhc2hSZWZbSW50XV1dJywKKyk7CisKKyMgVGhlIGdvYWwgb2YgYWxsIGxleGVyIHJ1bGVzL21ldGhvZHMgaXMgdG8gY3JlYXRlIGEgdG9rZW4gb2JqZWN0LgorIyBUaGlzIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlIGFzIG11bHRpcGxlIHJ1bGVzIG1heSBjb2xsYWJvcmF0ZSB0bworIyBjcmVhdGUgYSBzaW5nbGUgdG9rZW4uICBuZXh0VG9rZW4gd2lsbCByZXR1cm4gdGhpcyBvYmplY3QgYWZ0ZXIKKyMgbWF0Y2hpbmcgbGV4ZXIgcnVsZShzKS4gIElmIHlvdSBzdWJjbGFzcyB0byBhbGxvdyBtdWx0aXBsZSB0b2tlbgorIyBlbWlzc2lvbnMsIHRoZW4gc2V0IHRoaXMgdG8gdGhlIGxhc3QgdG9rZW4gdG8gYmUgbWF0Y2hlZCBvcgorIyBzb21ldGhpbmcgbm9ubnVsbCBzbyB0aGF0IHRoZSBhdXRvIHRva2VuIGVtaXQgbWVjaGFuaXNtIHdpbGwgbm90CisjIGVtaXQgYW5vdGhlciB0b2tlbi4KK2hhcyAndG9rZW4nID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ01heWJlW0FOVExSOjpSdW50aW1lOjpUb2tlbl0nLAorKTsKKworIyBXaGF0IGNoYXJhY3RlciBpbmRleCBpbiB0aGUgc3RyZWFtIGRpZCB0aGUgY3VycmVudCB0b2tlbiBzdGFydCBhdD8KKyMgTmVlZGVkLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSB0ZXh0IGZvciBjdXJyZW50IHRva2VuLiAgU2V0IGF0CisjIHRoZSBzdGFydCBvZiBuZXh0VG9rZW4uCitoYXMgJ3Rva2VuX3N0YXJ0X2NoYXJfaW5kZXgnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCisgICAgZGVmYXVsdCA9PiAtMSwKKyk7CisKKyMgVGhlIGxpbmUgb24gd2hpY2ggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdG9rZW4gcmVzaWRlcworaGFzICd0b2tlbl9zdGFydF9saW5lJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorKTsKKworIyBUaGUgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIGZpcnN0IGNoYXJhY3RlciB3aXRoaW4gdGhlIGxpbmUKK2hhcyAndG9rZW5fc3RhcnRfY2hhcl9wb3NpdGlvbl9pbl9saW5lJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorKTsKKworIyBUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHRva2VuCitoYXMgJ2NoYW5uZWwnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ0ludCcsCispOworCisjIFRoZSB0b2tlbiB0eXBlIGZvciB0aGUgY3VycmVudCB0b2tlbgoraGFzICd0eXBlJyA9PiAoCisgICAgaXMgID0+ICdydycsCisgICAgaXNhID0+ICdJbnQnLAorKTsKKworIyBZb3UgY2FuIHNldCB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgdG9rZW4gdG8gb3ZlcnJpZGUgd2hhdCBpcyBpbgorIyB0aGUgaW5wdXQgY2hhciBidWZmZXIuICBVc2Ugc2V0VGV4dCgpIG9yIGNhbiBzZXQgdGhpcyBpbnN0YW5jZSB2YXIuCitoYXMgJ3RleHQnID0+ICgKKyAgICBpcyAgPT4gJ3J3JywKKyAgICBpc2EgPT4gJ01heWJlW1N0cl0nLAorKTsKKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoKTsKKzE7CitfX0VORF9fCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9SdWxlUmV0dXJuU2NvcGUucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9SdWxlUmV0dXJuU2NvcGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwOGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1J1bGVSZXR1cm5TY29wZS5wbQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpSdWxlUmV0dXJuU2NvcGU7CisKK3VzZSBNb29zZTsKKworc3ViIGdldF9zdGFydCB7CisgICAgcmV0dXJuOworfQorCitzdWIgZ2V0X3N0b3AgeworICAgIHJldHVybjsKK30KKworc3ViIGdldF90cmVlIHsKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfdGVtcGxhdGUgeworICAgIHJldHVybjsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoKTsKKzE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9TdHJlYW0ucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9TdHJlYW0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkMGJhNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1N0cmVhbS5wbQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpTdHJlYW07CisKK3VzZSBNb29zZTo6Um9sZTsKKworcmVxdWlyZXMgJ2NvbnN1bWUnOworCityZXF1aXJlcyAnTEEnOworCityZXF1aXJlcyAnbWFyayc7CisKK3JlcXVpcmVzICdpbmRleCc7CisKK3JlcXVpcmVzICdyZXdpbmQnOworCityZXF1aXJlcyAncmVsZWFzZSc7CisKK3JlcXVpcmVzICdzZWVrJzsKKworcmVxdWlyZXMgJ3NpemUnOworCitubyBNb29zZTo6Um9sZTsKKzE7CitfX0VORF9fCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ub2tlbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1Rva2VuLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDhmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ub2tlbi5wbQpAQCAtMCwwICsxLDgwIEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpUb2tlbjsKKwordXNlIFJlYWRvbmx5OworCit1c2UgZmVhdHVyZSBxdyggc3RhdGUgKTsKKwordXNlIEFOVExSOjpSdW50aW1lOjpDaGFyU3RyZWFtOworI3VzZSBBTlRMUjo6UnVudGltZTo6Q29tbW9uVG9rZW47CisKK3VzZSBNb29zZTo6Um9sZTsKKworUmVhZG9ubHkgbXkgJEVPUl9UT0tFTl9UWVBFID0+IDE7CitzdWIgRU9SX1RPS0VOX1RZUEUgeyAkRU9SX1RPS0VOX1RZUEUgfQorCisjIGltYWdpbmFyeSB0cmVlIG5hdmlnYXRpb24gdHlwZTsgdHJhdmVyc2UgImdldCBjaGlsZCIgbGluaworUmVhZG9ubHkgbXkgJERPV04gPT4gMjsKK3N1YiBET1dOIHsgJERPV04gfQorCisjIGltYWdpbmFyeSB0cmVlIG5hdmlnYXRpb24gdHlwZTsgZmluaXNoIHdpdGggYSBjaGlsZCBsaXN0CitSZWFkb25seSBteSAkVVAgPT4gMzsKK3N1YiBVUCB7ICRVUCB9CisKK1JlYWRvbmx5IG15ICRNSU5fVE9LRU5fVFlQRSA9PiAkVVAgKyAxOworc3ViIE1JTl9UT0tFTl9UWVBFIHsgJE1JTl9UT0tFTl9UWVBFIH0KKworIyBBbGwgdG9rZW5zIGdvIHRvIHRoZSBwYXJzZXIgKHVubGVzcyBza2lwKCkgaXMgY2FsbGVkIGluIHRoYXQgcnVsZSkKKyMgb24gYSBwYXJ0aWN1bGFyICJjaGFubmVsIi4gIFRoZSBwYXJzZXIgdHVuZXMgdG8gYSBwYXJ0aWN1bGFyIGNoYW5uZWwKKyMgc28gdGhhdCB3aGl0ZXNwYWNlIGV0Yy4uLiBjYW4gZ28gdG8gdGhlIHBhcnNlciBvbiBhICJoaWRkZW4iIGNoYW5uZWwuCitSZWFkb25seSBteSAkREVGQVVMVF9DSEFOTkVMID0+IDA7CitzdWIgREVGQVVMVF9DSEFOTkVMIHsgJERFRkFVTFRfQ0hBTk5FTCB9CisKKyMgQW55dGhpbmcgb24gZGlmZmVyZW50IGNoYW5uZWwgdGhhbiBERUZBVUxUX0NIQU5ORUwgaXMgbm90IHBhcnNlZAorIyBieSBwYXJzZXIuCitSZWFkb25seSBteSAkSElEREVOX0NIQU5ORUwgPT4gOTk7CitzdWIgSElEREVOX0NIQU5ORUwgeyAkSElEREVOX0NIQU5ORUwgfQorCitzdWIgRU9GIHsgQU5UTFI6OlJ1bnRpbWU6OkNoYXJTdHJlYW0tPkVPRiB9CisKKyNSZWFkb25seSBteSAkRU9GX1RPS0VOID0+IEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbi0+bmV3KHsgdHlwZSA9PiBFT0YgfSk7CitzdWIgRU9GX1RPS0VOIHsKKyAgICByZXF1aXJlIEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbjsKKyAgICBzdGF0ZSAkRU9GX1RPS0VOID0gQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuLT5uZXcoeyB0eXBlID0+IEVPRiB9KTsKKyAgICByZXR1cm4gJEVPRl9UT0tFTjsKK30KKworUmVhZG9ubHkgbXkgJElOVkFMSURfVE9LRU5fVFlQRSA9PiAwOworc3ViIElOVkFMSURfVE9LRU5fVFlQRSB7ICRJTlZBTElEX1RPS0VOX1RZUEUgfQorCisjUmVhZG9ubHkgbXkgJElOVkFMSURfVE9LRU4gPT4gQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuLT5uZXcoeyB0eXBlID0+IElOVkFMSURfVE9LRU5fVFlQRSB9KTsKK3N1YiBJTlZBTElEX1RPS0VOIHsKKyAgICByZXF1aXJlIEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbjsKKyAgICBzdGF0ZSAkSU5WQUxJRF9UT0tFTiA9IEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbi0+bmV3KHsgdHlwZSA9PiBJTlZBTElEX1RPS0VOX1RZUEUgfSk7CisgICAgcmV0dXJuICRJTlZBTElEX1RPS0VOOworfQorCisjIEluIGFuIGFjdGlvbiwgYSBsZXhlciBydWxlIGNhbiBzZXQgdG9rZW4gdG8gdGhpcyBTS0lQX1RPS0VOIGFuZCBBTlRMUgorIyB3aWxsIGF2b2lkIGNyZWF0aW5nIGEgdG9rZW4gZm9yIHRoaXMgc3ltYm9sIGFuZCB0cnkgdG8gZmV0Y2ggYW5vdGhlci4KKyNSZWFkb25seSBteSAkU0tJUF9UT0tFTiA9PiBBTlRMUjo6UnVudGltZTo6Q29tbW9uVG9rZW4tPm5ldyh7IHR5cGUgPT4gSU5WQUxJRF9UT0tFTl9UWVBFIH0pOworc3ViIFNLSVBfVE9LRU4geworICAgIHJlcXVpcmUgQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuOworICAgIHN0YXRlICRTS0lQX1RPS0VOID0gQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuLT5uZXcoeyB0eXBlID0+IElOVkFMSURfVE9LRU5fVFlQRSB9KTsKKyAgICByZXR1cm4gJFNLSVBfVE9LRU47Cit9CisKK3JlcXVpcmVzICdnZXRfdGV4dCcsICdzZXRfdGV4dCc7CisKK3JlcXVpcmVzICdnZXRfdHlwZScsICdzZXRfdHlwZSc7CisKK3JlcXVpcmVzICdnZXRfbGluZScsICdzZXRfbGluZSc7CisKK3JlcXVpcmVzICdnZXRfY2hhcl9wb3NpdGlvbl9pbl9saW5lJywgJ3NldF9jaGFyX3Bvc2l0aW9uX2luX2xpbmUnOworCityZXF1aXJlcyAnZ2V0X2NoYW5uZWwnLCAnc2V0X2NoYW5uZWwnOworCityZXF1aXJlcyAnZ2V0X3Rva2VuX2luZGV4JywgJ3NldF90b2tlbl9pbmRleCc7CisKK3JlcXVpcmVzICdnZXRfaW5wdXRfc3RyZWFtJywgJ3NldF9pbnB1dF9zdHJlYW0nOworCitubyBNb29zZTo6Um9sZTsKKzE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ub2tlblNvdXJjZS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1Rva2VuU291cmNlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjAwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ub2tlblNvdXJjZS5wbQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpUb2tlblNvdXJjZTsKKwordXNlIE1vb3NlOjpSb2xlOworCisjIFJldHVybiBhIFRva2VuIG9iamVjdCBmcm9tIHlvdXIgaW5wdXQgc3RyZWFtICh1c3VhbGx5IGEgQ2hhclN0cmVhbSkuCisjIERvIG5vdCBmYWlsL3JldHVybiB1cG9uIGxleGluZyBlcnJvcjsga2VlcCBjaGV3aW5nIG9uIHRoZSBjaGFyYWN0ZXJzCisjIHVudGlsIHlvdSBnZXQgYSBnb29kIG9uZTsgZXJyb3JzIGFyZSBub3QgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHBhcnNlci4KK3JlcXVpcmVzICduZXh0X3Rva2VuJzsKKworIyBXaGVyZSBhcmUgeW91IGdldHRpbmcgdG9rZW5zIGZyb20/IG5vcm1hbGx5IHRoZSBpbXBsaWNhdGlvbiB3aWxsIHNpbXBseQorIyBhc2sgbGV4ZXJzIGlucHV0IHN0cmVhbS4KK3JlcXVpcmVzICdnZXRfc291cmNlX25hbWUnOworCitubyBNb29zZTo6Um9sZTsKKzE7CitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK0FOVExSOjpSdW50aW1lOjpUb2tlblNvdXJjZQorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQSBzb3VyY2Ugb2YgdG9rZW5zIG11c3QgcHJvdmlkZSBhIHNlcXVlbmNlIG9mIHRva2VucyB2aWEgbmV4dFRva2VuKCkKK2FuZCBhbHNvIG11c3QgcmV2ZWFsIGl0J3Mgc291cmNlIG9mIGNoYXJhY3RlcnM7IENvbW1vblRva2VuJ3MgdGV4dCBpcworY29tcHV0ZWQgZnJvbSBhIENoYXJTdHJlYW07IGl0IG9ubHkgc3RvcmUgaW5kaWNlcyBpbnRvIHRoZSBjaGFyIHN0cmVhbS4KKworRXJyb3JzIGZyb20gdGhlIGxleGVyIGFyZSBuZXZlciBwYXNzZWQgdG8gdGhlIHBhcnNlci4gIEVpdGhlciB5b3Ugd2FudAordG8ga2VlcCBnb2luZyBvciB5b3UgZG8gbm90IHVwb24gdG9rZW4gcmVjb2duaXRpb24gZXJyb3IuICBJZiB5b3UgZG8gbm90Cit3YW50IHRvIGNvbnRpbnVlIGxleGluZyB0aGVuIHlvdSBkbyBub3Qgd2FudCB0byBjb250aW51ZSBwYXJzaW5nLiAgSnVzdAordGhyb3cgYW4gZXhjZXB0aW9uIG5vdCB1bmRlciBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBhbmQgSmF2YSB3aWxsIG5hdHVyYWxseQordG9zcyB5b3UgYWxsIHRoZSB3YXkgb3V0IG9mIHRoZSByZWNvZ25pemVycy4gIElmIHlvdSB3YW50IHRvIGNvbnRpbnVlCitsZXhpbmcgdGhlbiB5b3Ugc2hvdWxkIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gdG8gdGhlIHBhcnNlci0taXQgaGFzIGFscmVhZHkKK3JlcXVlc3RlZCBhIHRva2VuLiAgS2VlcCBsZXhpbmcgdW50aWwgeW91IGdldCBhIHZhbGlkIG9uZS4gIEp1c3QgcmVwb3J0CitlcnJvcnMgYW5kIGtlZXAgZ29pbmcsIGxvb2tpbmcgZm9yIGEgdmFsaWQgdG9rZW4uCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ub2tlblN0cmVhbS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1Rva2VuU3RyZWFtLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWI4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9saWIvQU5UTFIvUnVudGltZS9Ub2tlblN0cmVhbS5wbQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIEFOVExSOjpSdW50aW1lOjpUb2tlblN0cmVhbTsKKwordXNlIE1vb3NlOjpSb2xlOworI2V4dGVuZHMgJ0FOVExSOjpSdW50aW1lOjpJbnRTdHJlYW0nOworCityZXF1aXJlcyAnTFQnOworCityZXF1aXJlcyAnZ2V0JzsKKworcmVxdWlyZXMgJ2dldF90b2tlbl9zb3VyY2UnOworCityZXF1aXJlcyAndG9fc3RyaW5nJzsKKworbm8gTW9vc2U6OlJvbGU7CisxOworX19FTkRfXwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvbGliL0FOVExSL1J1bnRpbWUvVW53YW50ZWRUb2tlbkV4Y2VwdGlvbi5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMTIwMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L2xpYi9BTlRMUi9SdW50aW1lL1Vud2FudGVkVG9rZW5FeGNlcHRpb24ucG0KQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBBTlRMUjo6UnVudGltZTo6VW53YW50ZWRUb2tlbkV4Y2VwdGlvbjsKKwordXNlIE1vb3NlOworCit1c2Ugb3ZlcmxvYWQKKyAgICAnIiInID0+IFwmdG9fc3RyaW5nOworCitleHRlbmRzICdBTlRMUjo6UnVudGltZTo6TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uJzsKKworc3ViIGdldF91bmV4cGVjdGVkX3Rva2VuIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgcmV0dXJuICRzZWxmLT50b2tlbjsKK30KKworc3ViIHRvX3N0cmluZyB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworCisgICAgbXkgJGV4cDsKKyAgICBpZiAoJHNlbGYtPmV4cGVjdGluZyA9PSBBTlRMUjo6UnVudGltZTo6VG9rZW4tPklOVkFMSURfVE9LRU5fVFlQRSkgeworICAgICAgICAkZXhwID0gJyc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkZXhwID0gIiwgZXhwZWN0ZWQgIiAuICRzZWxmLT5leHBlY3Rpbmc7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPnRva2VuKSB7CisgICAgICAgIHJldHVybiAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD0iIC4gJHNlbGYtPnRva2VuLT5nZXRfdGV4dCgpIC4gIiRleHApIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAiVW53YW50ZWRUb2tlbkV4Y2VwdGlvbihmb3VuZD11bmRlZiRleHApIjsKKyAgICB9Cit9CisKK25vIE1vb3NlOworX19QQUNLQUdFX18tPm1ldGEtPm1ha2VfaW1tdXRhYmxlKCk7CisxOworX19FTkRfXwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvcG9ydC55bWwgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS9wb3J0LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg5N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvcG9ydC55bWwKQEAgLTAsMCArMSw0IEBACistLS0KK3N0YXR1czoKKyAgcnVudGltZS9KYXZhL3NyYy9vcmcvYW50bHIvcnVudGltZS9CaXRTZXQuamF2YToKKyAgICBzaGExOiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2F1dGhvci9hcGkudCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvYXV0aG9yL2FwaS50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGZlODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2F1dGhvci9hcGkudApAQCAtMCwwICsxLDk1IEBACit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBKYXZhOjpKVk06OkNsYXNzZmlsZTsKKwordXNlIFRlc3Q6Ok1vcmUgdGVzdHMgPT4gMjk7CisKK3N1YiBjbGFzc19uYW1lX3RvX2phdmEgeworICAgIG15ICgkbmFtZSkgPSBAXzsKKworICAgIG15ICR0bXAgPSAkbmFtZTsKKyAgICAkdG1wID1+IHMvQU5UTFI6OlJ1bnRpbWUvb3JnLmFudGxyLnJ1bnRpbWUvOworICAgICR0bXAgPX4gcy86Oi8uL2c7CisKKyAgICByZXR1cm4gJHRtcDsKK30KKworc3ViIGphdmFfY2xhc3NfbmFtZV90b19wZXJsIHsKKyAgICBteSAoJG5hbWUpID0gQF87CisKKyAgICBteSAkdG1wID0gJG5hbWU7CisgICAgJHRtcCA9fiBzL29yZ1wuYW50bHJcLnJ1bnRpbWUvQU5UTFI6OlJ1bnRpbWUvOworICAgICR0bXAgPX4gcy9cLi86Oi9nOworCisgICAgcmV0dXJuICR0bXA7Cit9CisKK3N1YiByZXNvbHZlX2phdmFfY2xhc3NfZmlsZSB7CisgICAgbXkgKCRuYW1lLCAkYmFzZWRpcikgPSBAXzsKKworICAgIG15ICR0bXAgPSAkbmFtZTsKKyAgICAkdG1wID1+IHMhXC4hLyFnOworICAgICR0bXAgLj0gJy5jbGFzcyc7CisKKyAgICByZXR1cm4gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkYmFzZWRpciwgJHRtcCk7Cit9CisKK3N1YiBqYXZhX2NvbnN0YW50X25hbWVfdG9fcGVybCB7Cit9CisKK3N1YiBqYXZhX21ldGhvZF9uYW1lX3RvX3BlcmwgeworICAgIG15ICgkbmFtZSkgPSBAXzsKKworICAgIGlmICgkbmFtZSBlcSAnPGluaXQ+JykgeworICAgICAgICByZXR1cm4gJ25ldyc7CisgICAgfQorICAgICMgYWRkIHNwZWNpYWwgY2FzZXMgaGVyZQorICAgIGVsc2UgeworICAgICAgICBteSAkdG1wID0gJG5hbWU7CisgICAgICAgICR0bXAgPX4gcy8oW2Etel0pKFtBLVpdKS8kMV9cTCQyXEUvZzsKKworICAgICAgICByZXR1cm4gJHRtcDsKKyAgICB9Cit9CisKK215IEBqYXZhX2NsYXNzX25hbWVzID0gcXcoCisgICAgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0CispOworCitmb3JlYWNoIG15ICRqYXZhX2NsYXNzX25hbWUgKEBqYXZhX2NsYXNzX25hbWVzKSB7CisgICAgbXkgJGphdmFfY2xhc3NfZmlsZSA9IHJlc29sdmVfamF2YV9jbGFzc19maWxlKCRqYXZhX2NsYXNzX25hbWUsCisgICAgICAgICcuLi8uLi9idWlsZC9ydGNsYXNzZXMnKTsKKworICAgIG15ICRqYXZhX2NsYXNzOworICAgIHsKKyAgICAgICAgbG9jYWwgJFNJR3snX19XQVJOX18nfSA9IHN1YiB7fTsKKyAgICAgICAgJGphdmFfY2xhc3MgPSBKYXZhOjpKVk06OkNsYXNzZmlsZS0+bmV3KCRqYXZhX2NsYXNzX2ZpbGUpOworICAgIH0KKworICAgIG15ICRjbGFzc19uYW1lID0gamF2YV9jbGFzc19uYW1lX3RvX3BlcmwoJGphdmFfY2xhc3NfbmFtZSk7CisgICAgdXNlX29rKCRjbGFzc19uYW1lKTsKKyAgICBwcmludCBtYXAgeyAiJF9cbiIgfSBBTlRMUjo6UnVudGltZTo6Qml0U2V0LT5jYW4oKTsKKyAgICBwcmludCAiLS0tXG4iOworCisgICAgZXZhbCB7ICRjbGFzc19uYW1lLT5uZXcoKSB9OworICAgIHByaW50IGpvaW4gIlxuIiwgQU5UTFI6OlJ1bnRpbWU6OkJpdFNldC0+Y2FuKCk7CisgICAgcHJpbnQgIlxuIjsKKworICAgIG15ICRqYXZhX2ZpZWxkcyA9ICRqYXZhX2NsYXNzLT5maWVsZHM7CisgICAgZm9yZWFjaCBteSAkamF2YV9maWVsZCAoQCRqYXZhX2ZpZWxkcykgeworICAgICAgICBuZXh0IGlmIGdyZXAgeyAkXyBlcSAncHJpdmF0ZScgfSBAeyRqYXZhX2ZpZWxkLT5hY2Nlc3NfZmxhZ3N9OworCisgICAgICAgIG15ICRmaWVsZF9uYW1lID0gJGphdmFfZmllbGQtPm5hbWU7CisgICAgICAgIG9rKCRjbGFzc19uYW1lLT5jYW4oJGZpZWxkX25hbWUpLCAkZmllbGRfbmFtZSk7CisgICAgfQorCisgICAgbXkgJGphdmFfbWV0aG9kcyA9ICRqYXZhX2NsYXNzLT5tZXRob2RzOworICAgIGZvcmVhY2ggbXkgJGphdmFfbWV0aG9kIChAJGphdmFfbWV0aG9kcykgeworICAgICAgICBuZXh0IGlmIGdyZXAgeyAkXyBlcSAncHJpdmF0ZScgfSBAeyRqYXZhX21ldGhvZC0+YWNjZXNzX2ZsYWdzfTsKKworICAgICAgICBteSAkbWV0aG9kX25hbWUgPSBqYXZhX21ldGhvZF9uYW1lX3RvX3BlcmwoJGphdmFfbWV0aG9kLT5uYW1lKTsKKyAgICAgICAgb2soJGNsYXNzX25hbWUtPmNhbigkbWV0aG9kX25hbWUpLCAkbWV0aG9kX25hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvYXV0aG9yL3Blcmxjcml0aWMudCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvYXV0aG9yL3Blcmxjcml0aWMudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI0NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9hdXRob3IvcGVybGNyaXRpYy50CkBAIC0wLDAgKzEsMTkgQEAKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaWxlOjpTcGVjOwordXNlIEVuZ2xpc2ggcXcoLW5vX21hdGNoX3ZhcnMpOworCit1c2UgVGVzdDo6TW9yZTsKKworZXZhbCB7CisgICAgcmVxdWlyZSBUZXN0OjpQZXJsOjpDcml0aWM7Cit9OworaWYgKCAkRVZBTF9FUlJPUiApIHsKKyAgIG15ICRtc2cgPSAnVGVzdDo6UGVybDo6Q3JpdGljIHJlcXVpcmVkIHRvIGNyaXRpY2lzZSBjb2RlJzsKKyAgIHBsYW4oIHNraXBfYWxsID0+ICRtc2cgKTsKK30KKworbXkgJHJjZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICd0JywgJ2F1dGhvcicsICdwZXJsY3JpdGljcmMnICk7CitUZXN0OjpQZXJsOjpDcml0aWMtPmltcG9ydCggLXByb2ZpbGUgPT4gJHJjZmlsZSApOworYWxsX2NyaXRpY19vaygpOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9hdXRob3IvcGVybGNyaXRpY3JjIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9hdXRob3IvcGVybGNyaXRpY3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2M0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2F1dGhvci9wZXJsY3JpdGljcmMKQEAgLTAsMCArMSw1IEBACitzZXZlcml0eSA9IDUKKworI1stQ29kZUxheW91dDo6UmVxdWlyZVRpZHlDb2RlXQorCitbLVN1YnJvdXRpbmVzOjpQcm9oaWJpdEV4cGxpY2l0UmV0dXJuVW5kZWZdCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2F1dGhvci9wb2QtY292ZXJhZ2UudCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvYXV0aG9yL3BvZC1jb3ZlcmFnZS50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWUxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2F1dGhvci9wb2QtY292ZXJhZ2UudApAQCAtMCwwICsxLDEwIEBACit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGVzdDo6TW9yZTsKKworZXZhbCAidXNlIFRlc3Q6OlBvZDo6Q292ZXJhZ2UiOworaWYgKCRAKSB7CisgICAgcGxhbiBza2lwX2FsbCA9PiAiVGVzdDo6UG9kOjpDb3ZlcmFnZSByZXF1aXJlZCBmb3IgdGVzdGluZyBQT0QgY292ZXJhZ2U6ICRAIjsKK30KK2FsbF9wb2RfY292ZXJhZ2Vfb2soKTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvYXV0aG9yL3BvZC50IGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9hdXRob3IvcG9kLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5MDhiOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvYXV0aG9yL3BvZC50CkBAIC0wLDAgKzEsMTAgQEAKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUZXN0OjpNb3JlOworCitldmFsICJ1c2UgVGVzdDo6UG9kIjsKK2lmICgkQCkgeworICAgIHBsYW4gc2tpcF9hbGwgPT4gIlRlc3Q6OlBvZCByZXF1aXJlZCBmb3IgdGVzdGluZyBQT0Q6ICRAIjsKK30KK2FsbF9wb2RfZmlsZXNfb2soKTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy50IGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0Y2RiOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy50CkBAIC0wLDAgKzEsOSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBsaWIgJ3QvbGliJzsKK3VzZSBNeTo6VGVzdDo6Q2xhc3M6OkxvYWQgJ3QvY2xhc3Nlcyc7CisKK1Rlc3Q6OkNsYXNzLT5ydW50ZXN0cygpOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzL1Rlc3QvQU5UTFIvUnVudGltZS9BTlRMUlN0cmluZ1N0cmVhbS5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy9UZXN0L0FOVExSL1J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0YTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy9UZXN0L0FOVExSL1J1bnRpbWUvQU5UTFJTdHJpbmdTdHJlYW0ucG0KQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBUZXN0OjpBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07CisKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07Cit1c2UgVGVzdDo6TW9yZTsKKwordXNlIE1vb3NlOworCitCRUdJTiB7IGV4dGVuZHMgJ015OjpUZXN0OjpDbGFzcycgfQorCitzdWIgY29uc3VtZSA6IFRlc3QoMikgeworICAgIG15ICgkc2VsZikgPSBAXzsKKworICAgIG15ICRzID0gJHNlbGYtPmNsYXNzLT5uZXcoeyBpbnB1dCA9PiAnQUJDJyB9KTsKKyAgICBpcyAkcy0+TEEoMSksICdBJzsKKyAgICAkcy0+Y29uc3VtZSgpOworICAgIGlzICRzLT5MQSgxKSwgJ0InOworfQorCitzdWIgTEEgOiBUZXN0KDUpIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICBteSAkcyA9ICRzZWxmLT5jbGFzcy0+bmV3KHsgaW5wdXQgPT4gJ0FCQycgfSk7CisgICAgaXMgJHMtPkxBKDApLCB1bmRlZjsKKyAgICBpcyAkcy0+TEEoMSksICdBJzsKKyAgICBpcyAkcy0+TEEoMiksICdCJzsKKyAgICBpcyAkcy0+TEEoMyksICdDJzsKKyAgICBpcyAkcy0+TEEoNCksIEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbS0+RU9GOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZShpbmxpbmVfY29uc3RydWN0b3IgPT4gMCk7CisxOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzL1Rlc3QvQU5UTFIvUnVudGltZS9CaXRTZXQucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2NsYXNzZXMvVGVzdC9BTlRMUi9SdW50aW1lL0JpdFNldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY3OWUzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzL1Rlc3QvQU5UTFIvUnVudGltZS9CaXRTZXQucG0KQEAgLTAsMCArMSw4MiBAQAorcGFja2FnZSBUZXN0OjpBTlRMUjo6UnVudGltZTo6Qml0U2V0OworCit1c2UgVGVzdDo6TW9yZTsKKwordXNlIE1vb3NlOworCitCRUdJTiB7IGV4dGVuZHMgJ015OjpUZXN0OjpDbGFzcycgfQorCitzdWIgY29uc3RydWN0b3IgOiBUZXN0cygzKSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIG15ICRjbGFzcyA9ICRzZWxmLT5jbGFzczsKKworICAgIGNhbl9vayAkY2xhc3MsICduZXcnOworICAgIG9rIG15ICRicyA9ICRjbGFzcy0+bmV3KCk7CisgICAgaXNhX29rICRicywgJGNsYXNzOworfQorCitzdWIgY29uc3RydWN0b3JfYml0cyA6IFRlc3RzKDUpIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgbXkgJGJzID0gJHNlbGYtPmNsYXNzLT5uZXcoeyBiaXRzID0+ICcwMDEnIH0pOworICAgIG9rICEkYnMtPm1lbWJlcigwKTsKKyAgICBvayAhJGJzLT5tZW1iZXIoMSk7CisgICAgb2sgJGJzLT5tZW1iZXIoMik7CisgICAgb2sgISRicy0+bWVtYmVyKDMpOworICAgIGlzICIkYnMiLCAnezJ9JzsKK30KKworc3ViIGNvbnN0cnVjdG9yX251bWJlciA6IFRlc3RzKDIpIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgbXkgJGJzID0gJHNlbGYtPmNsYXNzLT5uZXcoeyBudW1iZXIgPT4gMHgxMCB9KTsKKyAgICBvayAkYnMtPm1lbWJlcig0KTsKKyAgICBpcyAiJGJzIiwgJ3s0fSc7Cit9CisKK3N1YiBjb25zdHJ1Y3Rvcl93b3JkczY0IDogVGVzdHMoMikgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICBteSAkYnMgPSAkc2VsZi0+Y2xhc3MtPm5ldygKKyAgICAgICAgeyB3b3JkczY0ID0+IFsgJzB4MDAwMDAwNDAwMDAwMDAwMScsICcweDEwMDAwMDAwMDA4MDAwMDAnIF0gfSk7CisgICAgaXMgIiRicyIsICd7MCwzOCw4NywxMjR9JzsKK30KKworc3ViIG9mIDogVGVzdHMoMikgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICBteSAkYnMgPSAkc2VsZi0+Y2xhc3MtPm9mKDB4MTApOworICAgIG9rICRicy0+bWVtYmVyKDE2KSA7CisgICAgaXMgIiRicyIsICd7MTZ9JyA7Cit9CisKK3N1YiBvcGVyYXRvcl90b19zdHJpbmcgOiBUZXN0cygxKSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIG15ICRicyA9ICRzZWxmLT5jbGFzcy0+bmV3KCk7CisgICAgaXMgIiRicyIsICd7fSc7Cit9CisKK3N1YiBhZGQgOiBUZXN0cygxKSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIG15ICRicyA9ICRzZWxmLT5jbGFzcy0+bmV3KCk7CisgICAgJGJzLT5hZGQoMik7CisgICAgJGJzLT5hZGQoNyk7CisgICAgaXMgIiRicyIsICd7Miw3fSc7Cit9CisKK3N1YiByZW1vdmUgOiBUZXN0cygyKSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIG15ICRicyA9ICRzZWxmLT5jbGFzcy0+bmV3KCk7CisgICAgJGJzLT5hZGQoMyk7CisgICAgJGJzLT5hZGQoMTIpOworICAgIGlzICIkYnMiLCAnezMsMTJ9JzsKKyAgICAkYnMtPnJlbW92ZSgzKTsKKyAgICBpcyAiJGJzIiwgJ3sxMn0nOworfQorCitzdWIgb3BlcmF0b3Jfb3IgOiBUZXN0cygxKSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIG15ICRicyA9ICRzZWxmLT5jbGFzcy0+b2YoNCk7CisgICAgJGJzIHw9ICRzZWxmLT5jbGFzcy0+b2YoNSk7CisgICAgaXMgIiRicyIsICd7NCw1fSc7Cit9CisKK25vIE1vb3NlOworX19QQUNLQUdFX18tPm1ldGEtPm1ha2VfaW1tdXRhYmxlKGlubGluZV9jb25zdHJ1Y3RvciA9PiAwKTsKKzE7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2NsYXNzZXMvVGVzdC9BTlRMUi9SdW50aW1lL0NvbW1vblRva2VuLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzL1Rlc3QvQU5UTFIvUnVudGltZS9Db21tb25Ub2tlbi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZmOTFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzL1Rlc3QvQU5UTFIvUnVudGltZS9Db21tb25Ub2tlbi5wbQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIFRlc3Q6OkFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlbjsKKwordXNlIFRlc3Q6Ok1vcmU7CisKK3VzZSBBTlRMUjo6UnVudGltZTo6VG9rZW47CisKK3VzZSBNb29zZTsKKworQkVHSU4geyBleHRlbmRzICdNeTo6VGVzdDo6Q2xhc3MnIH0KKworc3ViIGNvbnN0cnVjdG9yIDogVGVzdCgxKSB7CisgICAgbXkgJHRva2VuID0gQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuLT5uZXcoeworICAgICAgICBpbnB1dCA9PiB1bmRlZiwKKyAgICAgICAgdHlwZSA9PiAwLAorICAgICAgICBjaGFubmVsID0+IDAsCisgICAgICAgIHN0YXJ0ID0+IDAsCisgICAgICAgIHN0b3AgPT4gMSwKKyAgICB9KTsKKyAgICBpcyAkdG9rZW4tPmdldF9zdGFydF9pbmRleCgpLCAwOworfQorCitzdWIgc2FtZSA6IFRlc3QoMikgeworICAgIG9rKEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GX1RPS0VOID09IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+RU9GX1RPS0VOKTsKKyAgICBvayhBTlRMUjo6UnVudGltZTo6VG9rZW4tPlNLSVBfVE9LRU4gPT0gQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5TS0lQX1RPS0VOKTsKK30KKworc3ViIG5vdF9zYW1lIDogVGVzdCgyKSB7CisgICAgb2sgIShBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRl9UT0tFTiAgIT0gQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5FT0ZfVE9LRU4pOworICAgIG9rICEoQU5UTFI6OlJ1bnRpbWU6OlRva2VuLT5TS0lQX1RPS0VOICE9IEFOVExSOjpSdW50aW1lOjpUb2tlbi0+U0tJUF9UT0tFTik7Cit9CisKK3N1YiBib29sX2VvZiA6IFRlc3QoMSkgeworICAgIG9rICFBTlRMUjo6UnVudGltZTo6VG9rZW4tPkVPRl9UT0tFTjsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoaW5saW5lX2NvbnN0cnVjdG9yID0+IDApOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy9UZXN0L0FOVExSL1J1bnRpbWUvRXhjZXB0aW9uLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9jbGFzc2VzL1Rlc3QvQU5UTFIvUnVudGltZS9FeGNlcHRpb24ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkMDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy9UZXN0L0FOVExSL1J1bnRpbWUvRXhjZXB0aW9uLnBtCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2UgVGVzdDo6QU5UTFI6OlJ1bnRpbWU6OkV4Y2VwdGlvbjsKKwordXNlIFRlc3Q6Ok1vcmU7CisKK3VzZSBNb29zZTsKKworQkVHSU4geyBleHRlbmRzICdNeTo6VGVzdDo6Q2xhc3MnIH0KKworc3ViIGNvbnN0cnVjdG9yIDogVGVzdCgxKSB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIG15ICRleCA9ICRzZWxmLT5jbGFzcy0+bmV3KCk7CisgICAgaXMgJGV4LT5tZXNzYWdlLCAnJzsKK30KKworc3ViIGNvbnN0cnVjdG9yX21lc3NhZ2UgOiBUZXN0KDEpIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisgICAgbXkgJGV4ID0gJHNlbGYtPmNsYXNzLT5uZXcoeyBtZXNzYWdlID0+ICd0ZXN0IGVycm9yIG1lc3NhZ2UnIH0pOworICAgIGlzICRleC0+bWVzc2FnZSwgJ3Rlc3QgZXJyb3IgbWVzc2FnZSc7Cit9CisKK3N1YiB0aHJvdyA6IFRlc3QoMSkgeworICAgIG15ICgkc2VsZikgPSBAXzsKKyAgICBldmFsIHsKKyAgICAgICAgJHNlbGYtPmNsYXNzLT50aHJvdyhtZXNzYWdlID0+ICd0ZXN0IGVycm9yIG1lc3NhZ2UnKTsKKyAgICB9OworICAgIG15ICRleCA9ICRzZWxmLT5jbGFzcy0+Y2F1Z2h0KCk7CisgICAgaXMgJGV4LT5tZXNzYWdlLCAndGVzdCBlcnJvciBtZXNzYWdlJzsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoaW5saW5lX2NvbnN0cnVjdG9yID0+IDApOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvY2xhc3Nlcy9UZXN0L0FOVExSL1J1bnRpbWUvTGV4ZXIucG0gYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2NsYXNzZXMvVGVzdC9BTlRMUi9SdW50aW1lL0xleGVyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OGExZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2NsYXNzZXMvVGVzdC9BTlRMUi9SdW50aW1lL0xleGVyLnBtCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgVGVzdDo6QU5UTFI6OlJ1bnRpbWU6OkxleGVyOworCit1c2UgVGVzdDo6TW9yZTsKKwordXNlIEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbTsKK3VzZSBBTlRMUjo6UnVudGltZTo6TGV4ZXI7CisKK3VzZSBNb29zZTsKKworQkVHSU4geyBleHRlbmRzICdNeTo6VGVzdDo6Q2xhc3MnIH0KKworc3ViIGNvbnN0cnVjdG9yIDogVGVzdCgxKSB7CisgICAgbXkgJGlucHV0ID0gQU5UTFI6OlJ1bnRpbWU6OkFOVExSU3RyaW5nU3RyZWFtLT5uZXcoeyBpbnB1dCA9PiAnQUJDJyB9KTsKKyAgICBteSAkbGV4ZXIgPSBBTlRMUjo6UnVudGltZTo6TGV4ZXItPm5ldyh7IGlucHV0ID0+ICRpbnB1dCB9KTsKKyAgICBvayBkZWZpbmVkICRsZXhlcjsKK30KKworbm8gTW9vc2U7CitfX1BBQ0tBR0VfXy0+bWV0YS0+bWFrZV9pbW11dGFibGUoaW5saW5lX2NvbnN0cnVjdG9yID0+IDApOworMTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvZXhhbXBsZXMvZXhwci50IGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9leGFtcGxlcy9leHByLnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwOTZkYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvZXhhbXBsZXMvZXhwci50CkBAIC0wLDAgKzEsODUgQEAKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBsaWIgcXcoIHQvbGliICk7CisKK3VzZSBUZXN0OjpNb3JlOwordXNlIEFOVExSOjpSdW50aW1lOjpUZXN0OworCitwbGFuIHRlc3RzID0+IDE7CisKKyMgVGhlIFNpbXBsZUNhbGMgZ3JhbW1hciBmcm9tIHRoZSBmaXZlIG1pbnV0ZXMgdHV0b3JpYWwuCitnX3Rlc3Rfb3V0cHV0X2lzKHsgZ3JhbW1hciA9PiA8PCdHUkFNTUFSJywgdGVzdF9wcm9ncmFtID0+IDw8J0NPREUnLCBleHBlY3RlZCA9PiA8PCdPVVRQVVQnIH0pOworZ3JhbW1hciBFeHByOworb3B0aW9ucyB7IGxhbmd1YWdlID0gUGVybDU7IH0KK0BoZWFkZXIge30KKworQG1lbWJlcnMgeworICAgIG15ICVtZW1vcnk7Cit9CisKK3Byb2c6ICAgc3RhdCsgOworCitzdGF0OiAgIGV4cHIgTkVXTElORSB7IHByaW50ICIkZXhwci52YWx1ZVxuIjsgfQorICAgIHwgICBJRCAnPScgZXhwciBORVdMSU5FCisgICAgICAgIHsgJG1lbW9yeXskSUQudGV4dH0gPSAkZXhwci52YWx1ZTsgfQorICAgIHwgICBORVdMSU5FCisgICAgOworCitleHByIHJldHVybnMgW3ZhbHVlXQorICAgIDogICBlPW11bHRFeHByIHsgJHZhbHVlID0gJGUudmFsdWU7IH0KKyAgICAgICAgKCAgICcrJyBlPW11bHRFeHByIHsgJHZhbHVlICs9ICRlLnZhbHVlOyB9CisgICAgICAgIHwgICAnLScgZT1tdWx0RXhwciB7ICR2YWx1ZSAtPSAkZS52YWx1ZTsgfQorICAgICAgICApKgorICAgIDsKKworbXVsdEV4cHIgcmV0dXJucyBbdmFsdWVdCisgICAgOiAgIGU9YXRvbSB7ICR2YWx1ZSA9ICRlLnZhbHVlOyB9ICgnKicgZT1hdG9tIHsgJHZhbHVlICo9ICRlLnZhbHVlOyB9KSoKKyAgICA7CisKK2F0b20gcmV0dXJucyBbdmFsdWVdCisgICAgOiAgIElOVCB7ICR2YWx1ZSA9ICRJTlQudGV4dDsgfQorICAgIHwgICBJRAorICAgICAgICB7CisgICAgICAgICAgICBteSAkdiA9ICRtZW1vcnl7JElELnRleHR9OworICAgICAgICAgICAgaWYgKGRlZmluZWQgJHYpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJ1bmRlZmluZWQgdmFyaWFibGUgJElELnRleHRcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB8ICAgJygnIGV4cHIgJyknIHsgJHZhbHVlID0gJGV4cHIudmFsdWU7IH0KKyAgICA7CisKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSsgOworSU5UIDogICAnMCcuLic5JysgOworTkVXTElORTonXHInPyAnXG4nIDsKK1dTICA6ICAgKCcgJ3wnXHQnKSsgeyAkc2VsZi0+c2tpcCgpOyB9IDsKK0dSQU1NQVIKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07Cit1c2UgQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuU3RyZWFtOwordXNlIEV4cHJMZXhlcjsKK3VzZSBFeHByUGFyc2VyOworCitteSAkaW4gPSA8PCAnRU9UJzsKKzEgKyAxCis4IC0gMQorYSA9IDEwCitiID0gMTMKKzIgKiBhICsgYiArIDEKK0VPVAorCitteSAkaW5wdXQgPSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW0tPm5ldyh7IGlucHV0ID0+ICRpbiB9KTsKK215ICRsZXhlciA9IEV4cHJMZXhlci0+bmV3KHsgaW5wdXQgPT4gJGlucHV0IH0pOworCitteSAkdG9rZW5zID0gQU5UTFI6OlJ1bnRpbWU6OkNvbW1vblRva2VuU3RyZWFtLT5uZXcoeyB0b2tlbl9zb3VyY2UgPT4gJGxleGVyIH0pOworbXkgJHBhcnNlciA9IEV4cHJQYXJzZXItPm5ldyh7IGlucHV0ID0+ICR0b2tlbnMgfSk7CiskcGFyc2VyLT5wcm9nKCk7CitDT0RFCisyCis3CiszNAorT1VUUFVUCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2V4YW1wbGVzL2ZpZy50IGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9leGFtcGxlcy9maWcudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJmOGEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9leGFtcGxlcy9maWcudApAQCAtMCwwICsxLDczIEBACit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgbGliIHF3KCB0L2xpYiApOworCit1c2UgVGVzdDo6TW9yZTsKK3VzZSBBTlRMUjo6UnVudGltZTo6VGVzdDsKKworcGxhbiB0ZXN0cyA9PiAxOworCitUT0RPOiB7Citsb2NhbCAkVE9ETyA9ICdOb3QgaW1wbGVtZW50ZWQgeWV0JzsKKyMgVGhlIFNpbXBsZUNhbGMgZ3JhbW1hciBmcm9tIHRoZSBmaXZlIG1pbnV0ZXMgdHV0b3JpYWwuCitnX3Rlc3Rfb3V0cHV0X2lzKHsgZ3JhbW1hciA9PiA8PCdHUkFNTUFSJywgdGVzdF9wcm9ncmFtID0+IDw8J0NPREUnLCBleHBlY3RlZCA9PiA8PCdPVVRQVVQnIH0pOworZ3JhbW1hciBGaWc7CitvcHRpb25zIHsgbGFuZ3VhZ2UgPSBQZXJsNTsgfQorCitAaGVhZGVyIHsKK3VzZSBSdW5GaWc7Cit9CisKK0BtZW1iZXJzIHsKK2hhcyAnaW5zdGFuY2VzJyA9PiAoCisgICAgZGVmYXVsdCA9PiBzdWIgeyB7fSB9CispOworfQorCitmaWxlIHJldHVybnMgW29iamVjdHNdCisgICAgOiAgIHsgJG9iamVjdHMgPSBbXTsgfQorICAgICAgICAob2JqZWN0IHsgcHVzaCBAJG9iamVjdHMsICRvYmplY3QubzsgfSkrCisgICAgOworCitvYmplY3QgcmV0dXJucyBbb10KKyAgICA6ICAgcWlkIHY9SUQ/CisgICAgICAgIHsKKyAgICAgICAgJG8gPSBSdW5GaWcubmV3SW5zdGFuY2UoJHFpZC50ZXh0KTsKKyAgICAgICAgaWYgKGRlZmluZWQgJHYpIHsKKyAgICAgICAgICAgICRzZWxmLT5pbnN0YW5jZXMtPnskdi50ZXh0LCAkbyk7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAneycgYXNzaWduWyRvXSogJ30nCisgICAgOworCithc3NpZ25bb10KKyAgICA6ICAgSUQgJz0nIGV4cHIgJzsnIHtSdW5GaWcuc2V0T2JqZWN0UHJvcGVydHkobywkSUQudGV4dCwkZXhwci52YWx1ZSk7fQorICAgIDsKKworZXhwciByZXR1cm5zIFt2YWx1ZV0KKyAgICA6ICAgU1RSSU5HICB7ICR2YWx1ZSA9ICRTVFJJTkcudGV4dDsgfQorICAgIHwgICBJTlQgICAgIHsgJHZhbHVlID0gSW50ZWdlci52YWx1ZU9mKCRJTlQudGV4dCk7IH0KKyAgICB8ICAgJyQnIElEICB7ICR2YWx1ZSA9IGluc3RhbmNlcy5nZXQoJElELnRleHQpOyB9CisgICAgfCAgICdbJyAnXScgeyAkdmFsdWUgPSBuZXcgQXJyYXlMaXN0KCk7IH0KKyAgICB8ICAge0FycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsgfQorICAgICAgICAnWycgZT1leHByIHsgZWxlbWVudHMuYWRkKCRlLnZhbHVlKTsgfQorICAgICAgICAgICAgKCcsJyBlPWV4cHIgeyBlbGVtZW50cy5hZGQoJGUudmFsdWUpOyB9KSoKKyAgICAgICAgJ10nCisgICAgICAgIHsgJHZhbHVlID0gZWxlbWVudHM7IH0KKyAgICA7CisKK3FpZCA6ICAgSUQgKCcuJyBJRCkqCisgICAgOworCitTVFJJTkcgOiAnIicgLiogJyInIHsgc2V0VGV4dChnZXRUZXh0KCkuc3Vic3RyaW5nKDEsIGdldFRleHQoKS5sZW5ndGgoKS0xKSk7IH0gOworSU5UIDogICAnMCcuLic5JysgOworSUQgIDogICAoJ18nfCdhJy4uJ3onfCdBJy4uJ1onKSAoJ18nfCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknKSogOworV1MgIDogICAoJyAnfCdcbid8J1x0JykrIHsgJGNoYW5uZWwgPSAkc2VsZi0+SElEREVOOyB9IDsKK0NNVCA6ICAgJy8qJyAuKiAnKi8nICAgICB7ICRjaGFubmVsID0gJHNlbGYtPkhJRERFTjsgfSA7CitHUkFNTUFSCisKK0NPREUKKworT1VUUFVUCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2V4YW1wbGVzL3NpbXBsZWNhbGMudCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvZXhhbXBsZXMvc2ltcGxlY2FsYy50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODgzODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2V4YW1wbGVzL3NpbXBsZWNhbGMudApAQCAtMCwwICsxLDg3IEBACit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgbGliIHF3KCB0L2xpYiApOworCit1c2UgVGVzdDo6TW9yZTsKK3VzZSBBTlRMUjo6UnVudGltZTo6VGVzdDsKKworcGxhbiB0ZXN0cyA9PiAxOworCisjIFRoZSBTaW1wbGVDYWxjIGdyYW1tYXIgZnJvbSB0aGUgZml2ZSBtaW51dGVzIHR1dG9yaWFsLgorZ190ZXN0X291dHB1dF9pcyh7IGdyYW1tYXIgPT4gPDwnR1JBTU1BUicsIHRlc3RfcHJvZ3JhbSA9PiA8PCdDT0RFJywgZXhwZWN0ZWQgPT4gPDwnT1VUUFVUJyB9KTsKK2dyYW1tYXIgU2ltcGxlQ2FsYzsKK29wdGlvbnMgeyBsYW5ndWFnZSA9IFBlcmw1OyB9CisKK3Rva2VucyB7CisJUExVUyAJPSAnKycgOworCU1JTlVTCT0gJy0nIDsKKwlNVUxUCT0gJyonIDsKKwlESVYJPSAnLycgOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUEFSU0VSIFJVTEVTCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4cHIJOiB0ZXJtICggKCBQTFVTIHwgTUlOVVMgKSAgdGVybSApKiA7CisKK3Rlcm0JOiBmYWN0b3IgKCAoIE1VTFQgfCBESVYgKSBmYWN0b3IgKSogOworCitmYWN0b3IJOiBOVU1CRVIgOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTEVYRVIgUlVMRVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTlVNQkVSCTogKERJR0lUKSsgOworCitXSElURVNQQUNFIDogKCAnXHQnIHwgJyAnIHwgJ1xyJyB8ICdcbid8ICdcdTAwMEMnICkrIAl7ICRjaGFubmVsID0gSElEREVOOyB9IDsKKworZnJhZ21lbnQgRElHSVQJOiAnMCcuLic5JyA7CitHUkFNTUFSCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgQU5UTFI6OlJ1bnRpbWU6OkFOVExSU3RyaW5nU3RyZWFtOwordXNlIEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlblN0cmVhbTsKK3VzZSBBTlRMUjo6UnVudGltZTo6UmVjb2duaXRpb25FeGNlcHRpb247Cit1c2UgU2ltcGxlQ2FsY0xleGVyOwordXNlIFNpbXBsZUNhbGNQYXJzZXI7CisKK215IEBleGFtcGxlcyA9ICgKKyAgICAnMScsCisgICAgJzEgKyAxJywKKyAgICAnMSArJywKKyAgICAnMSAqIDIgKyAzJywKKyk7CisKK2ZvcmVhY2ggbXkgJGV4YW1wbGUgKEBleGFtcGxlcykgeworICAgIG15ICRpbnB1dCA9IEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbS0+bmV3KHsgaW5wdXQgPT4gJGV4YW1wbGUgfSk7CisgICAgbXkgJGxleGVyID0gU2ltcGxlQ2FsY0xleGVyLT5uZXcoeyBpbnB1dCA9PiAkaW5wdXQgfSk7CisgICAgbXkgJHRva2VucyA9IEFOVExSOjpSdW50aW1lOjpDb21tb25Ub2tlblN0cmVhbS0+bmV3KHsgdG9rZW5fc291cmNlID0+ICRsZXhlciB9KTsKKyAgICBteSAkcGFyc2VyID0gU2ltcGxlQ2FsY1BhcnNlci0+bmV3KHsgaW5wdXQgPT4gJHRva2VucyB9KTsKKyAgICBldmFsIHsKKyAgICAgICAgJHBhcnNlci0+ZXhwcigpOworICAgICAgICBpZiAoJHBhcnNlci0+Z2V0X251bWJlcl9vZl9zeW50YXhfZXJyb3JzKCkgPT0gMCkgeworICAgICAgICAgICAgcHJpbnQgIiRleGFtcGxlOiBnb29kXG4iOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIiRleGFtcGxlOiBiYWRcbiI7CisgICAgICAgIH0KKyAgICB9OworICAgIGlmIChteSAkZXggPSBBTlRMUjo6UnVudGltZTo6UmVjb2duaXRpb25FeGNlcHRpb24tPmNhdWdodCgpKSB7CisgICAgICAgIHByaW50ICIkZXhhbXBsZTogZXJyb3JcbiI7CisgICAgfSBlbHNpZiAoJGV4ID0gRXhjZXB0aW9uOjpDbGFzcy0+Y2F1Z2h0KCkpIHsKKyAgICAgICAgcHJpbnQgIiRleGFtcGxlOiBlcnJvcjogJGV4XG4iOworICAgICAgICByZWYgJGV4ID8gJGV4LT5yZXRocm93KCkgOiBkaWUgJGV4OworICAgIH0KK30KK0NPREUKKzE6IGdvb2QKKzEgKyAxOiBnb29kCisxICs6IGJhZAorMSAqIDIgKyAzOiBnb29kCitPVVRQVVQKKworX19FTkRfXwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9sZXhlci50IGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9sZXhlci50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTZiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2xleGVyLnQKQEAgLTAsMCArMSwxMjYgQEAKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiBxdyggdC9saWIgKTsKKwordXNlIEZpbGU6OlNsdXJwOworCit1c2UgVGVzdDo6TW9yZTsKK3VzZSBBTlRMUjo6UnVudGltZTo6VGVzdDsKKworcGxhbiB0ZXN0cyA9PiAyOworCitzdWIgZ3JhbW1hcl9maWxlIHsKKyAgICBteSAoJGZpbGUpID0gQF87CisgICAgcmV0dXJuIHJlYWRfZmlsZSgidC8kZmlsZSIpOworfQorCisjIEEgc2ltcGxlIHRlc3Q6IHRyeSB0byBsZXggb25lIHBvc3NpYmxlIHRva2VuLgorZ190ZXN0X291dHB1dF9pcyh7IGdyYW1tYXIgPT4gPDwnR1JBTU1BUicsIHRlc3RfcHJvZ3JhbSA9PiA8PCdDT0RFJywgZXhwZWN0ZWQgPT4gPDwnT1VUUFVUJyB9KTsKKy8qIFRoaXMgaXMgYSBjb21tZW50LiAgTm90ZSB0aGF0IHdlJ3JlIGluIHRoZSBBTlRMUiBncmFtbWFyIGhlcmUsIHNvIGl0J3Mgbm90CisgICBhIFBlcmwgJyMnIGNvbW1lbnQsIGFuZCBtYXkgYmUgbXVsdGkgbGluZS4uLiAqLworLy8gLi4uIG9yIGEgc2luZ2xlIGxpbmUgY29tbWVudAorbGV4ZXIgZ3JhbW1hciBJTlRMZXhlcjsKKy8qIFNldCB0YXJnZXQgbGFuZ3VhZ2UgdG8gUGVybDUuICovCitvcHRpb25zIHsgbGFuZ3VhZ2UgPSBQZXJsNTsgfQorCisvKiBMZXhlciBydWxlIGZvciBhbiBpbnRlZ2VyLiAqLworSU5UIDogJzAnLi4nOScrOworR1JBTU1BUgordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbTsKK3VzZSBJTlRMZXhlcjsKKworbXkgJGlucHV0ID0gQU5UTFI6OlJ1bnRpbWU6OkFOVExSU3RyaW5nU3RyZWFtLT5uZXcoeyBpbnB1dCA9PiAnMTIzJyB9KTsKK215ICRsZXhlciA9IElOVExleGVyLT5uZXcoeyBpbnB1dCA9PiAkaW5wdXQgfSk7Cit3aGlsZSAoKG15ICRfID0gJGxleGVyLT5uZXh0X3Rva2VuKCkpKSB7CisgICAgcHJpbnQgJF8tPmdldF90ZXh0KCksICJcbiI7Cit9CitDT0RFCisxMjMKK09VVFBVVAorCisjIE11bHRpcGxlIGNob2ljZSwgaW5jbHVkaW5nICdza2lwJyBhbmQgJ2hpZGUnIGFjdGlvbnMuCitnX3Rlc3Rfb3V0cHV0X2lzKHsgZ3JhbW1hciA9PiA8PCdHUkFNTUFSJywgdGVzdF9wcm9ncmFtID0+IDw8J0NPREUnLCBleHBlY3RlZCA9PiA8PCdPVVRQVVQnIH0pOworbGV4ZXIgZ3JhbW1hciBJRExleGVyOworb3B0aW9ucyB7IGxhbmd1YWdlID0gUGVybDU7IH0KKworSUQgICAgICA6ICgnYScuLid6J3wnQScuLidaJykrIDsKK0lOVCAgICAgOiAnMCcuLic5JysgOworTkVXTElORSA6ICdccic/ICdcbicgIHsgJHNlbGYtPnNraXAoKSB9IDsKK1dTICAgICAgOiAoJyAnfCdcdCcpKyB7ICRjaGFubmVsID0gSElEREVOIH0gOworR1JBTU1BUgordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbTsKK3VzZSBJRExleGVyOworCitteSAkaW5wdXQgPSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW0tPm5ldyh7IGlucHV0ID0+ICJIZWxsbyBXb3JsZCFcbjQyXG4iIH0pOworbXkgJGxleGVyID0gSURMZXhlci0+bmV3KHsgaW5wdXQgPT4gJGlucHV0IH0pOworCit3aGlsZSAoMSkgeworICAgIG15ICR0b2tlbiA9ICRsZXhlci0+bmV4dF90b2tlbigpOworICAgIGxhc3QgaWYgJHRva2VuLT5nZXRfdHlwZSgpID09IElETGV4ZXItPkVPRjsKKworICAgIHByaW50ICJ0ZXh0OiAnIiwgJHRva2VuLT5nZXRfdGV4dCgpLCAiJ1xuIjsKKyAgICBwcmludCAidHlwZTogIiwgICR0b2tlbi0+Z2V0X3R5cGUoKSwgIlxuIjsKKyAgICBwcmludCAicG9zOiAiLCAgICR0b2tlbi0+Z2V0X2xpbmUoKSwgJzonLCAkdG9rZW4tPmdldF9jaGFyX3Bvc2l0aW9uX2luX2xpbmUoKSwgIlxuIjsKKyAgICBwcmludCAiY2hhbm5lbDogIiwgICAgICR0b2tlbi0+Z2V0X2NoYW5uZWwoKSwgIlxuIjsKKyAgICBwcmludCAidG9rZW4gaW5kZXg6ICIsICR0b2tlbi0+Z2V0X3Rva2VuX2luZGV4KCksICJcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KK0NPREUKK3RleHQ6ICdIZWxsbycKK3R5cGU6IDQKK3BvczogMTowCitjaGFubmVsOiAwCit0b2tlbiBpbmRleDogLTEKKwordGV4dDogJyAnCit0eXBlOiA3Citwb3M6IDE6NQorY2hhbm5lbDogOTkKK3Rva2VuIGluZGV4OiAtMQorCit0ZXh0OiAnV29ybGQnCit0eXBlOiA0Citwb3M6IDE6NgorY2hhbm5lbDogMAordG9rZW4gaW5kZXg6IC0xCisKK3RleHQ6ICc0MicKK3R5cGU6IDUKK3BvczogMjowCitjaGFubmVsOiAwCit0b2tlbiBpbmRleDogLTEKKworT1VUUFVUCisKKz1iZWdpbiBTS0lQIGRvZXNuJ3QgY29tcGlsZSB5ZXQKKworZ190ZXN0X291dHB1dF9pcyh7IGdyYW1tYXIgPT4gc2NhbGFyIGdyYW1tYXJfZmlsZSgnWE1MTGV4ZXIuZycpLCB0ZXN0X3Byb2dyYW0gPT4gPDwnQ09ERScsIGV4cGVjdGVkID0+IDw8J09VVFBVVCcgfSk7Cit1c2UgRW5nbGlzaCBxdyggLW5vX21hdGNoX3ZhcnMgKTsKK3VzZSBBTlRMUjo6UnVudGltZTo6QU5UTFJTdHJpbmdTdHJlYW07Cit1c2UgWE1MTGV4ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK215ICRpbnB1dCA9IEFOVExSOjpSdW50aW1lOjpBTlRMUlN0cmluZ1N0cmVhbS0+bmV3KDw8ICdYTUwnKTsKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPHRlc3Q+Zm9vPC90ZXN0PgorWE1MCitteSAkbGV4ZXIgPSBJRExleGVyLT5uZXcoJGlucHV0KTsKK3doaWxlICgobXkgJF8gPSAkbGV4ZXItPm5leHRfdG9rZW4oKSkpIHsKK30KK0NPREUKK1hNTCBkZWNsYXJhdGlvbgorUENEQVRBOiAiZm9vIgorT1VUUFVUCit9CisKKz1lbmQgU0tJUApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9saWIvQU5UTFIvUnVudGltZS9UZXN0LnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9saWIvQU5UTFIvUnVudGltZS9UZXN0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTA1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2xpYi9BTlRMUi9SdW50aW1lL1Rlc3QucG0KQEAgLTAsMCArMSwxNTUgQEAKK3BhY2thZ2UgQU5UTFI6OlJ1bnRpbWU6OlRlc3Q7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBiYXNlICdUZXN0OjpCdWlsZGVyOjpNb2R1bGUnOworCitteSAkQ0xBU1MgPSBfX1BBQ0tBR0VfXzsKKworb3VyIEBFWFBPUlQgPSBxdyggZ190ZXN0X291dHB1dF9pcyApOworCit1c2UgQ2FycDsKK3VzZSBDd2Q7Cit1c2UgRmlsZTo6U3BlYzsKK3VzZSBGaWxlOjpUZW1wIHF3KCB0ZW1wZGlyICk7CisKK3N1YiByZWFkX2ZpbGUgeworICAgIG15ICgkZmlsZW5hbWUpID0gQF87CisKKyAgICBsb2NhbCAkLzsKKyAgICBvcGVuIG15ICRpbiwgJzwnLCAkZmlsZW5hbWUgb3IgZGllICJDYW4ndCBvcGVuICRmaWxlbmFtZTogJCEiOworICAgIG15ICRjb250ZW50ID0gPCRpbj47CisgICAgY2xvc2UgJGluIG9yIHdhcm4gIkNhbid0IGNsb3NlICRmaWxlbmFtZTogJCEiOworCisgICAgcmV0dXJuICRjb250ZW50OworfQorCitzdWIgd3JpdGVfZmlsZSB7CisgICAgbXkgKCRmaWxlbmFtZSwgJGNvbnRlbnQpID0gQF87CisKKyAgICBvcGVuIG15ICRvdXQsICc+JywgJGZpbGVuYW1lIG9yIGRpZSAiQ2FuJ3Qgb3BlbiAkZmlsZW5hbWU6ICQhIjsKKyAgICBwcmludCAkb3V0ICRjb250ZW50OworICAgIGNsb3NlICRvdXQgb3Igd2FybiAiQ2FuJ3QgY2xvc2UgJGZpbGVuYW1lOiAkISI7CisKKyAgICByZXR1cm47Cit9CisKK3N1YiBnZXRfcGVybCB7CisgICAgaWYgKGRlZmluZWQgJEVOVntIQVJORVNTX1BFUkx9KSB7CisgICAgICAgIHJldHVybiAkRU5We0hBUk5FU1NfUEVSTH07CisgICAgfQorCisgICAgaWYgKCReTyA9fiAvXihNUyk/V2luMzIkLykgeworICAgICAgICByZXR1cm4gV2luMzI6OkdldFNob3J0UGF0aE5hbWUoJF5YKTsKKyAgICB9CisKKyAgICByZXR1cm4gJF5YOworfQorCitzdWIgZ190ZXN0X291dHB1dF9pcyB7CisgICAgbXkgKCRhcmdzKSA9IEBfOworICAgIG15ICRncmFtbWFyID0gJGFyZ3MtPntncmFtbWFyfTsKKyAgICBteSAkdGVzdF9wcm9ncmFtID0gJGFyZ3MtPnt0ZXN0X3Byb2dyYW19OworICAgIG15ICRleHBlY3RlZCA9ICRhcmdzLT57ZXhwZWN0ZWR9OworICAgIG15ICRuYW1lID0gJGFyZ3MtPntuYW1lfSB8fCB1bmRlZjsKKyAgICBteSAkdGIgPSAkQ0xBU1MtPmJ1aWxkZXI7CisKKyAgICBteSAkdG1wZGlyID0gdGVtcGRpciggQ0xFQU5VUCA9PiAxICk7CisKKyAgICBteSAkZ3JhbW1hcl9uYW1lOworICAgIGlmICgkZ3JhbW1hciA9fiAvXig/Oig/OmxleGVyfHBhcnNlcnx0cmVlKVxzKyk/IGdyYW1tYXIgXHMrIChcdyspL3htcykgeworICAgICAgICAkZ3JhbW1hcl9uYW1lID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JvYWsgIkNhbid0IGRldGVybWluZSBncmFtbWFyIG5hbWUiOworICAgIH0KKworICAgICMgd3JpdGUgZ3JhbW1hciBmaWxlCisgICAgbXkgJGdyYW1tYXJfZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHRtcGRpciwgIiRncmFtbWFyX25hbWUuZyIpOworICAgIHdyaXRlX2ZpbGUoJGdyYW1tYXJfZmlsZSwgJGdyYW1tYXIpOworCisgICAgIyB3cml0ZSB0ZXN0IHByb2dyYW0gZmlsZQorICAgIG15ICR0ZXN0X3Byb2dyYW1fZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHRtcGRpciwgJ3Rlc3QucGwnKTsKKyAgICB3cml0ZV9maWxlKCR0ZXN0X3Byb2dyYW1fZmlsZSwgJHRlc3RfcHJvZ3JhbSk7CisKKyAgICBteSAkY3dkID0gY3dkOworICAgIG15ICR0ZXN0X3Jlc3VsdDsKKyAgICBldmFsIHsKKyAgICAgICAgIyBjb21waWxlIGdyYW1tYXIKKyAgICAgICAgbXkgJGFudGxyOworICAgICAgICBpZiAoJF5PID1+IC9saW51eC8pIHsKKyAgICAgICAgICAgICRhbnRsciA9ICdhbnRsci5zaCc7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCReTyA9fiAvTVNXaW4zMi8pIHsKKyAgICAgICAgICAgICRhbnRsciA9ICdhbnRsci5iYXQnOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJGFudGxyID0gJ2FudGxyJzsKKyAgICAgICAgfQorICAgICAgICBteSAkZ19yZXN1bHQgPSBydW5fcHJvZ3JhbShbIEZpbGU6OlNwZWMtPmNhdGZpbGUoJGN3ZCwgJ3Rvb2xzJywgJGFudGxyKSwgJy1vJywgJHRtcGRpciwgJGdyYW1tYXJfZmlsZSBdKTsKKyAgICAgICAgaWYgKCRnX3Jlc3VsdC0+e2V4aXRfY29kZX0gPj4gOCAhPSAwKSB7CisgICAgICAgICAgICBjcm9hayAkZ19yZXN1bHQtPntlcnJ9OworICAgICAgICB9CisKKyAgICAgICAgIyBydW4gdGVzdCBwcm9ncmFtCisgICAgICAgIHsKKyAgICAgICAgICAgICNsb2NhbCAkRU5We1BFUkxDT1ZfREJ9ID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkdG1wZGlyLCAncGVybGNvdi5kYicpOworICAgICAgICAgICAgI2xvY2FsICRFTlZ7TllUUFJPRn0gPSAnZmlsZT0nIC4gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkdG1wZGlyLCAnbnl0cHJvZi5vdXQnKTsKKyAgICAgICAgICAgICR0ZXN0X3Jlc3VsdCA9IHJ1bl9wcm9ncmFtKFsgZ2V0X3BlcmwoKSwgJy1NYmxpYicsICItSSR0bXBkaXIiLCAkdGVzdF9wcm9ncmFtX2ZpbGUgXSk7CisgICAgICAgICAgICBpZiAoJHRlc3RfcmVzdWx0LT57ZXhpdF9jb2RlfSA+PiA4ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjcm9hayAkdGVzdF9yZXN1bHQtPntlcnJ9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBkaWUgJEAgaWYgJEA7CisKKyAgICBteSAkYWN0dWFsID0gJHRlc3RfcmVzdWx0LT57b3V0fTsKKworICAgICMgY29tcGFyZSB3aXRoICRleHBlY3RlZAorICAgIHJldHVybiAkdGItPmlzX2VxKCRhY3R1YWwsICRleHBlY3RlZCwgJG5hbWUpOworfQorCitzdWIgcnVuX3Byb2dyYW0geworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKworICAgIG9wZW4gbXkgJG9sZF9vdXQsICc+JlNURE9VVCcgb3IgZGllICJDYW4ndCBjYXB0dXJlIHN0ZG91dDogJCEiOworICAgIGNsb3NlIFNURE9VVCBvciBkaWUgIkNhbid0IGNsb3NlIHN0ZG91dDogJCEiOworICAgIG9wZW4gU1RET1VULCAnPicsICdvdXQudG1wJyBvciBkaWUgIkNhbid0IHJlZGlyZWN0IHN0ZG91dDogJCEiOworCisgICAgb3BlbiBteSAkb2xkX2VyciwgJz4mU1RERVJSJyBvciBkaWUgIkNhbid0IGNhcHR1cmUgc3RkZXJyOiAkISI7CisgICAgY2xvc2UgU1RERVJSIG9yIGRpZSAiQ2FuJ3QgY2xvc2Ugc3RkZXJyOiAkISI7CisgICAgb3BlbiBTVERFUlIsICc+JywgJ2Vyci50bXAnIG9yIGRpZSAiQ2FuJ3QgcmVkaXJlY3Qgc3RkZXJyOiAkISI7CisKKyAgICBzeXN0ZW0gQCRjb21tYW5kOworICAgIG15ICRleGl0X2NvZGUgPSAkPzsKKworICAgICMgcmVzdG9yZSBzdGRlcnIKKyAgICBteSAkZXJyID0gcmVhZF9maWxlKCdlcnIudG1wJyk7CisgICAgY2xvc2UgU1RERVJSIG9yIGRpZSAiQ2FuJ3QgY2xvc2Ugc3RkZXJyOiAkISI7CisgICAgb3BlbiBTVERFUlIsICc+JicsICRvbGRfZXJyIG9yIGRpZSAiQ2FuJ3QgcmVzdG9yZSBzdGRlcnI6ICQhIjsKKyAgICB1bmxpbmsgJ2Vyci50bXAnIG9yIHdhcm4gIkNhbid0IHJlbW92ZSBlcnIudG1wOiAkISI7CisKKyAgICAjIHJlc3RvcmUgc3Rkb3V0CisgICAgbXkgJG91dCA9IHJlYWRfZmlsZSgnb3V0LnRtcCcpOworICAgIGNsb3NlIFNURE9VVCBvciBkaWUgIkNhbid0IGNsb3NlIHN0ZG91dDogJCEiOworICAgIG9wZW4gU1RET1VULCAnPiYnLCAkb2xkX291dCBvciBkaWUgIkNhbid0IHJlc3RvcmUgc3Rkb3V0OiAkISI7CisgICAgdW5saW5rICdvdXQudG1wJyBvciB3YXJuICJDYW4ndCByZW1vdmUgb3V0LnRtcDogJCEiOworCisgICAgbXkgJGV4aXRfdmFsdWU7CisgICAgaWYgKCRleGl0X2NvZGUgPCAwKSB7CisgICAgICAgICRleGl0X3ZhbHVlID0gJGV4aXRfY29kZTsKKyAgICB9IGVsc2lmICgkZXhpdF9jb2RlICYmIDB4ZmYpIHsKKyAgICAgICAgJGV4aXRfdmFsdWUgPSAiW1NJR05BTCAkZXhpdF9jb2RlXSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGV4aXRfdmFsdWUgPSAkZXhpdF9jb2RlID4+IDg7CisgICAgfQorCisgICAgcmV0dXJuIHsKKyAgICAgICAgZXhpdF9jb2RlID0+ICRleGl0X2NvZGUsCisgICAgICAgIGV4aXRfdmFsdWUgPT4gJGV4aXRfdmFsdWUsCisgICAgICAgIG91dCA9PiAkb3V0LAorICAgICAgICBlcnIgPT4gJGVyciwKKyAgICB9OworfQorCisxOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9saWIvTXkvVGVzdC9DbGFzcy5wbSBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvbGliL015L1Rlc3QvQ2xhc3MucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvbGliL015L1Rlc3QvQ2xhc3MucG0KQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBNeTo6VGVzdDo6Q2xhc3M7CisKK3VzZSBUZXN0OjpNb3JlOworCit1c2UgTW9vc2U7CisKK0JFR0lOIHsgZXh0ZW5kcyAnVGVzdDo6Q2xhc3MnIH0KKworaGFzICdjbGFzcycgPT4gKAorICAgIGlzICA9PiAncncnLAorICAgIGlzYSA9PiAnU3RyJywKKyk7CisKK3N1YiBuZXcgeworICAgIG15ICgkY2xhc3MsIEBhcmdzKSA9IEBfOworICAgIG15ICRzZWxmID0gJGNsYXNzLT5TVVBFUjo6bmV3KEBhcmdzKTsKKyAgICByZXR1cm4gJGNsYXNzLT5tZXRhLT5uZXdfb2JqZWN0KAorICAgICAgICBfX0lOU1RBTkNFX18gPT4gJHNlbGYsIEBhcmdzCisgICAgKTsKK30KKworc3ViIHN0YXJ0dXAgOiBUZXN0cyhzdGFydHVwID0+IDEpIHsKKyAgICBteSAoJHRlc3QpID0gQF87CisgICAgKG15ICRjbGFzcyA9IHJlZiAkdGVzdCkgPX4gcy9eVGVzdDo6Ly94bXM7CisgICAgdXNlX29rICRjbGFzcyBvciBkaWU7CisgICAgJHRlc3QtPmNsYXNzKCRjbGFzcyk7CisgICAgcmV0dXJuOworfQorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZShpbmxpbmVfY29uc3RydWN0b3IgPT4gMCk7CisxOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9saWIvTXkvVGVzdC9DbGFzcy9Mb2FkLnBtIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdC9saWIvTXkvVGVzdC9DbGFzcy9Mb2FkLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDU0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L2xpYi9NeS9UZXN0L0NsYXNzL0xvYWQucG0KQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBNeTo6VGVzdDo6Q2xhc3M6OkxvYWQ7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBiYXNlICdUZXN0OjpDbGFzczo6TG9hZCc7CisKK3N1YiBpc190ZXN0X2NsYXNzIHsKKyAgICBteSAoJGNsYXNzLCAkZmlsZSwgJGRpcikgPSBAXzsKKworICAgIHJldHVybiBpZiAhJGNsYXNzLT5TVVBFUjo6aXNfdGVzdF9jbGFzcygkZmlsZSwgJGRpcik7CisKKyAgICBpZiAoZXhpc3RzICRFTlZ7VEVTVF9DTEFTU30pIHsKKyAgICAgICAgbXkgJHBhdHRlcm4gPSAkRU5We1RFU1RfQ0xBU1N9OworCisgICAgICAgIChteSAkY2xhc3MgPSAkZmlsZSkgPX4gcyFeXFEkZGlyXEUvISF4bXM7CisgICAgICAgICRjbGFzcyA9fiBzL1wucG0kLy94bXM7CisgICAgICAgICRjbGFzcyA9fiBzIS8hOjohZ3htczsKKworICAgICAgICByZXR1cm4gaWYgJGNsYXNzICF+IC8kcGF0dGVybi94bXM7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKzE7CitfX0VORF9fCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L3ZlcnNpb24udCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3QvdmVyc2lvbi50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGU2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90L3ZlcnNpb24udApAQCAtMCwwICsxLDE1IEBACit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKK3VzZSBUZXN0OjpNb3JlIHRlc3RzID0+IDE7CisKK215ICRmaWxlID0gJ2xpYi9BTlRMUi9SdW50aW1lLnBtJzsKKworbXkgJHZlcnNpb24gPSBNTS0+cGFyc2VfdmVyc2lvbigkZmlsZSk7CisKKyMgY2xhc3NpYyBDUEFOCisjbGlrZSgkdmVyc2lvbiwgcXIvXlxkK1wuXGR7Mix9KF9cZHsyLH0pPyQvKTsKKworIyB2ZXJzaW9uLnBtCitsaWtlKCR2ZXJzaW9uLCBxci9eXGQrXC5cZCtcLlxkKyg/Ol9cZCspPyQvKTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3Rvb2xzL2FudGxyLmJhdCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3Rvb2xzL2FudGxyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MGMzZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdG9vbHMvYW50bHIuYmF0CkBAIC0wLDAgKzEsMTMgQEAKK0BlY2hvIG9mZgorCitzZXRsb2NhbAorCitJRiAiJUFOVExSX0hPTUUlIiA9PSAiIiBTRVQgQU5UTFJfSE9NRT0lfmQwJX5wMC4uXC4uXC4uCisKKyIlSkFWQV9IT01FJVxiaW5camF2YSIgXgorICAgIC1EZmlsZS5lbmNvZGluZz1VVEYtOCBeCisgICAgLWNsYXNzcGF0aCAiJUFOVExSX0hPTUUlXHRvb2xcdGFyZ2V0XGNsYXNzZXM7JUFOVExSX0hPTUUlXHJ1bnRpbWVcSmF2YVx0YXJnZXRcY2xhc3NlczslQU5UTFJfSE9NRSVcbGliXGFudGxyLTMuMC5qYXI7JUFOVExSX0hPTUUlXGxpYlxhbnRsci0yLjcuNy5qYXI7JUFOVExSX0hPTUUlXGxpYlxzdHJpbmd0ZW1wbGF0ZS0zLjAuamFyIiBeCisgICAgb3JnLmFudGxyLlRvb2wgXgorICAgICUqCisKK2VuZGxvY2FsCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90b29scy9hbnRsci5zaCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3Rvb2xzL2FudGxyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4YTI1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QZXJsNS90b29scy9hbnRsci5zaApAQCAtMCwwICsxLDggQEAKKyMhL2Jpbi9zaAorCitBTlRMUl9IT01FPWBkaXJuYW1lICIkMCJgLy4uLy4uLy4uCisKK2phdmEgLURmaWxlLmVuY29kaW5nPXdpbmRvd3MtMTI1MiBcCisgICAgLWNsYXNzcGF0aCAiJEFOVExSX0hPTUUvYnVpbGQvY2xhc3NlczokQU5UTFJfSE9NRS9idWlsZC9ydGNsYXNzZXM6JEFOVExSX0hPTUUvbGliL2FudGxyLTMuMC5qYXI6JEFOVExSX0hPTUUvbGliL2FudGxyLTIuNy43LmphcjokQU5UTFJfSE9NRS9saWIvc3RyaW5ndGVtcGxhdGUtMy4wLmphciIgXAorICAgIG9yZy5hbnRsci5Ub29sIFwKKyAgICAkQApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUGVybDUvdG9vbHMvcG9ydC5wbCBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3Rvb2xzL3BvcnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwYTBjYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1Blcmw1L3Rvb2xzL3BvcnQucGwKQEAgLTAsMCArMSwyMDMgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdmVyc2lvbjsKK3VzZSBDYXJwOwordXNlIERpZ2VzdDsKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlNwZWM6OlVuaXg7Cit1c2UgWUFNTDo6VGlueTsKKworbXkgJHZlcnNpb24gPSBxdignMC4wLjEnKTsKKworc3ViIHNheSB7CisgICAgcHJpbnQgQF8sICJcbiI7Cit9CisKK215ICRiYXNlZGlyID0gJy4uLy4uJzsKKworbXkgJGNvbW1hbmRzID0geworICAgICdoZWxwJyAgID0+IFwmaGVscCwKKyAgICAnYWRkJyAgICA9PiBcJmFkZCwKKyAgICAnc3RhdHVzJyA9PiBcJnN0YXR1cywKK307CisKK215ICRoZWxwID0ge307CisKK3N1YiBmaWxldHlwZSB7CisgICAgbXkgKCRwYXRoKSA9IEBfOworCisgICAgaWYgKCRwYXRoID1+IC9cLihqYXZhfGcpJC94bXMpIHsKKyAgICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKKyAgICB9Cit9CisKK3N1YiBzaGExc3VtIHsKKyAgICBteSAoJGZpbGVuYW1lKSA9IEBfOworCisgICAgb3BlbiBteSAkaW4sICc8JywgJGZpbGVuYW1lIG9yIGNyb2FrICJDYW4ndCBvcGVuICRmaWxlbmFtZTogJCEiOworICAgIGlmIChmaWxldHlwZSgkZmlsZW5hbWUpID1+IC9edGV4dFwvL3htcykgeworICAgICAgICAjIGtlZXAgc3RhbmRhcmQgbGluZSBmZWVkIGNvbnZlcnNpb24KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWJpbm1vZGUgJGluKSB7CisgICAgICAgICAgICBjcm9hayAiQ2FuJ3QgYmlubW9kZSAkZmlsZW5hbWU6ICQhIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBteSAkc2hhMSA9IERpZ2VzdC0+bmV3KCdTSEEtMScpOworICAgICRzaGExLT5hZGRmaWxlKCRpbik7CisgICAgbXkgJGRpZ2VzdCA9ICRzaGExLT5oZXhkaWdlc3Q7CisgICAgY2xvc2UgJGluIG9yIHdhcm4gIkNhbid0IGNsb3NlICRmaWxlbmFtZTogJCEiOworICAgIHJldHVybiAkZGlnZXN0OworfQorCitteSAkaW5jX3BhdGhzID0gWworICAgICRiYXNlZGlyLAorICAgICIkYmFzZWRpci9ydW50aW1lL0phdmEvc3JjIiwKK107CisgICAgCitzdWIgcmVzb2x2ZV9maWxlIHsKKyAgICBteSAoJGZpbGVuYW1lKSA9IEBfOworCisgICAgbXkgJHJlc29sdmVkX2ZpbGU7CisgICAgaWYgKC1lICRmaWxlbmFtZSkgeworICAgICAgICAkcmVzb2x2ZWRfZmlsZSA9ICRmaWxlbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG15IEBjYW5pZGF0ZXMgCisgICAgICAgICAgICA9IGdyZXAgeyAtZSAkXyB9IAorICAgICAgICAgICAgICBtYXAgeyBGaWxlOjpTcGVjLT5jYXRmaWxlKCRfLCAkZmlsZW5hbWUpIH0gCisgICAgICAgICAgICAgIEAkaW5jX3BhdGhzOworICAgICAgICAkcmVzb2x2ZWRfZmlsZSA9ICRjYW5pZGF0ZXNbMF07CisgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHJlc29sdmVkX2ZpbGUpIHsKKyAgICAgICAgJHJlc29sdmVkX2ZpbGUgPSBGaWxlOjpTcGVjOjpVbml4LT5jYW5vbnBhdGgoJHJlc29sdmVkX2ZpbGUpOworICAgIH0KKworICAgIHJldHVybiAkcmVzb2x2ZWRfZmlsZTsKK30KKworJGhlbHAtPntoZWxwfSA9IDw8ICdFT0gnOworaGVscDogRGVzY3JpYmUgdGhlIHVzYWdlIG9mIHRoaXMgcHJvZ3JhbSBvciBpdHMgc3ViY29tbWFuZHMuCitVc2FnZTogaGVscCBbU1VCQ09NTUFORC4uLl0KK0VPSAorCitzdWIgaGVscCB7CisgICAgbXkgKCRjbWQpID0gQF87CisKKyAgICBpZiAoZGVmaW5lZCAkY21kKSB7CisgICAgICAgIHByaW50ICRoZWxwLT57JGNtZH07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzYXkgPDwgJ0VPSCc7CitVc2FnZTogcG9ydCA8c3ViY29tbWFuZD4gW29wdGlvbnNdIFthcmdzXQorRU9ICisgICAgICAgIHNheSAiQXZhaWxhYmxlIHN1YmNvbW1hbmRzOiI7CisgICAgICAgIGZvcmVhY2ggbXkgJGNtZCAoa2V5cyAlJGhlbHApIHsKKyAgICAgICAgICAgIHNheSAiICAgJGNtZCI7CisgICAgICAgIH0KKyAgICB9CisKK30KKworJGhlbHAtPnthZGR9ID0gPDwgJ0VPSCc7CithZGQ6IEFkZHMgdGhlIGZpbGUgdG8gdGhlIGxpc3Qgb2YgcG9ydGVkIGZpbGVzLgorVXNhZ2U6IGFkZCBQQVRILi4uCitFT0gKKworc3ViIGFkZCB7CisgICAgbXkgKCRmaWxlbmFtZSkgPSBAXzsKKworICAgIG15ICRwb3J0ID0gWUFNTDo6VGlueS0+cmVhZCgncG9ydC55bWwnKTsKKyAgICBteSAkc3RhdHVzID0gJHBvcnQtPlswXS0+e3N0YXR1c307CisgICAgaWYgKCFkZWZpbmVkICRzdGF0dXMpIHsKKyAgICAgICAgJHN0YXR1cyA9ICRwb3J0LT5bMF0tPntzdGF0dXN9ID0ge307CisgICAgfQorCisgICAgbXkgJHBhdGggPSByZXNvbHZlX2ZpbGUoJGZpbGVuYW1lKTsKKyAgICBpZiAoIWRlZmluZWQgJHBhdGgpIHsKKyAgICAgICAgY3JvYWsgIkZpbGUgbm90IGZvdW5kOiAkZmlsZW5hbWUiOworICAgIH0KKyAgICBteSAkZGlnZXN0ID0gc2hhMXN1bSgkcGF0aCk7CisgICAgJHN0YXR1cy0+eyRmaWxlbmFtZX0gPSB7CisgICAgICAgICdzaGExJyA9PiAkZGlnZXN0LAorICAgIH07CisgICAgJHBvcnQtPndyaXRlKCdwb3J0LnltbCcpOworfQorCiskaGVscC0+e3N0YXR1c30gPSA8PCAnRU9IJzsKK3N0YXR1czogUHJpbnQgdGhlIHN0YXR1cyBvZiB0aGUgcG9ydGVkIGZpbGVzLgordXNhZ2U6IHN0YXR1cyBbUEFUSC4uLl0KK0VPSAorCitzdWIgc3RhdHVzIHsKKyAgICBteSAkcG9ydCA9IFlBTUw6OlRpbnktPnJlYWQoJ3BvcnQueW1sJyk7CisKKyAgICBteSAkc3RhdHVzID0gJHBvcnQtPlswXS0+e3N0YXR1c307CisKKyAgICB3aGlsZSAobXkgKCRmaWxlbmFtZSwgJGZzdGF0dXMpID0gZWFjaCAoJSRzdGF0dXMpKSB7CisgICAgICAgIG15ICRwYXRoID0gcmVzb2x2ZV9maWxlKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJGRpZ2VzdCA9IHNoYTFzdW0oJHBhdGgpOworCisgICAgICAgIGlmICgkZGlnZXN0IG5lICRmc3RhdHVzLT57c2hhMX0pIHsKKyAgICAgICAgICAgIHNheSAiTSAkZmlsZW5hbWUiOworICAgICAgICB9CisgICAgfQorfQorCitteSAoJGNtZCwgQGFyZ3MpID0gQEFSR1Y7CisKK2lmIChkZWZpbmVkICRjbWQpIHsKKyAgICBteSAkY21kX2YgPSAkY29tbWFuZHMtPnskY21kfTsKKyAgICBpZiAoZGVmaW5lZCAkY21kX2YpIHsKKyAgICAgICAgJGNtZF9mLT4oQGFyZ3MpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2F5ICJVbmtub3duIGNvbW1hbmQ6ICckY21kJyI7CisgICAgICAgIHNheSAiVHlwZSAncG9ydCBoZWxwJyBmb3IgdXNhZ2UuIjsKKyAgICAgICAgZXhpdCAxOworICAgIH0KK30KK2Vsc2UgeworICAgIHNheSAiVHlwZSAncG9ydCBoZWxwJyBmb3IgdXNhZ2UuIjsKKyAgICBleGl0IDE7Cit9CisKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworcG9ydCAtIEFOVExSIFBlcmwgNSBwb3J0IHN0YXR1cworCis9aGVhZDEgVkVSU0lPTgorCitUaGlzIGRvY3VtZW50YXRpb24gcmVmZXJzIHRvIHBvcnQgdmVyc2lvbiAwLjAuMQorCis9aGVhZDEgVVNBR0UKKworICAgIHBvcnQgaGVscAorCisgICAgcG9ydCBzdGF0dXMKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBwcmltYXJ5IGxhbmd1YWdlIHRhcmdldCBmb3IgQU5UTFIgaXMgSmF2YS4gIFRoZSBQZXJsIDUgcG9ydCBvbmx5IGZvbGxvd3MKK3RoaXMgcHJpbWFyeSB0YXJnZXQgbGFuZ3VhZ2UuICBUaGlzIGJyaW5ncyB1cCB0aGUgcHJvYmxlbSB0byBmb2xsb3cgdGhlCitjaGFuZ2VzIG1hZGUgdG8gdGhlIHByaW1hcnkgdGFyZ2V0LCBieSBrbm93aW5nIEk8d2hhdD4gaGFzIGNoYW5nZWQgYW5kIEk8aG93Pi4KKworVGhpcyB0b29sIGtlZXBzIGEgZGF0YWJhc2Ugb2YgZmlsZSBwYXRocyBhbmQgY29udGVudCBjaGVja3N1bS4gIE9uY2UgdGhlIHBvcnQKK29mIGEgZmlsZSAoSmF2YSBjbGFzcywgZ3JhbW1hciwgLi4uKSBpcyBjb21wbGV0ZWQgaXQgaXMgYWRkZWQgdG8gdGhlCitkYXRhYmFzZSAoQzxwb3J0IGFkZD4pLiAgVGhpcyBkYXRhYmFzZSBjYW4gdGhlbiBiZSBxdWVyaWVkIHRvIGNoZWNrIHdoYXQKK3ByaW1hcnkgZmlsZXMgaGF2ZSBjaGFuZ2VkIChDPHBvcnQgc3RhdHVzPikuICBUaGUgcmV2aXNpb24gY29udHJvbCBzb2Z0d2FyZQorc2hvdWxkIGJlIGhlbHBmdWwgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY2hhbmdlcy4KKworPWhlYWQxIEFVVEhPUgorCitSb25hbGQgQmxhc2Noa2UgKHJvbkByYmxhc2NoLm9yZykKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL0FVVEhPUlMgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU3OWVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL0FVVEhPUlMKQEAgLTAsMCArMSwyIEBACitCZW5qYW1pbiBOaWVtYW5uIDxwaW5rIGF0IG9kYWhvZGEgZG90IGRlPjogTWFpbiBkZXZlbG9wZXIgb2YgUHl0aG9uIHRhcmdldC4KK0NsaW50b24gUm95IDxjbGludG9uLnJveSBhdCBnbWFpbCBkb3QgY29tPjogQVNUIHRlbXBsYXRlcyBhbmQgcnVudGltZS4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9DaGFuZ2VMb2cgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Nzk2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMzggQEAKKzIwMDctMTEtMDMgIEJlbmphbWluIE5pZW1hbm4gIDxwaW5rQG9kYWhvZGEuZGU+CisKKwkqIFB5dGhvblRhcmdldC5qYXZhLCBkZmEucHksIGV4Y2VwdGlvbnMucHksIHJlY29nbml6ZXIucHksIHN0cmVhbXMucHk6CisJQU5UTFJTdHJpbmdTdHJlYW0uTEEoKSBub3cgcmV0dXJucyB0aGUgY2hhcmFjdGVyJ3Mgb3JkaW5hbCBhbmQKKwlnZW5lcmF0ZWQgbGV4ZXJzIG9wZXJhdGUgb24gaW50ZWdlcnMuIEFsc28gbWFkZSB2YXJpb3VzIHBlcmZvcm1hbmNlCisJdHVuaW5ncy4KKworMjAwNy0xMC0wNyAgQmVuamFtaW4gTmllbWFubiAgPHBpbmtAb2RhaG9kYS5kZT4KKworCSogbWFpbi5weSwgUHl0aG9uLnN0ZyAob3V0cHV0RmlsZSk6IEFkZGVkIHNpbXBsZSBfX21haW5fXyBzZWN0aW9uIHRvCisJZ2VuZXJhdGVkIGNvZGUsIHNvIChzaW1wbGUpIGdyYW1tYXJzIGNhbiBiZSBleGVjdXRlZCBhcyBzdGFuZGFsb25lCisJc2NyaXB0LgorCisJKiB0cmVlLnB5IChSZWNvZ25pdGlvbkV4Y2VwdGlvbi5leHRyYWN0SW5mb3JtYXRpb25Gcm9tVHJlZU5vZGVTdHJlYW0pLAorCWV4Y2VwdGlvbnMucHkgKENvbW1vblRyZWUpOiBTbWFsbCBidWdmaXhlcy4KKworMjAwNy0wOS0zMCAgQmVuamFtaW4gTmllbWFubiAgPHBpbmtAb2RhaG9kYS5kZT4KKworCSogcmVjb2duaXplcnMucHkgKFRva2VuU291cmNlKTogQWRkZWQgaXRlcmF0b3IgaW50ZXJmYWNlIHRvIFRva2VuU291cmNlCisJY2xhc3MgLSBhbmQgdGh1cyB0byBMZXhlci4KKworMjAwNy0wNi0yNyAgQmVuamFtaW4gTmllbWFubiAgPHBpbmtAb2RhaG9kYS5kZT4KKworCSogUHl0aG9uLnN0ZyAoZ2VuZXJpY1BhcnNlciwgcGFyc2VyLCB0cmVlUGFyc2VyKTogVXNlIGNvcnJlY3QgQGluaXQKKwlhY3Rpb24gYmxvY2sgZm9yIHRyZWUgcGFyc2Vycy4KKworMjAwNy0wNS0yNCAgQmVuamFtaW4gTmllbWFubiAgPHBpbmtAb2RhaG9kYS5kZT4KKworCSogUHl0aG9uLnN0ZyAocnVsZSk6IEFkZGVkIHN1cHBvcnQgZm9yIEBkZWNvcmF0ZSB7Li4ufSBhY3Rpb24gZm9yCisJcGFyc2VyIHJ1bGVzIHRvIGFkZCBkZWNvcmF0b3JzIHRvIHRoZSBydWxlIG1ldGhvZC4KKworMjAwNy0wNS0xOCAgQmVuamFtaW4gTmllbWFubiAgPHBpbmtAb2RhaG9kYS5kZT4KKworCSogUHl0aG9uLnN0ZyAoaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QsIGxvb2thaGVhZFJhbmdlVGVzdCk6IAorCU1pbm9yIGltcHJvdmVtZW50IG9mIGdlbmVyYXRlZCBjb2RlICh1c2UgJzxsb3dlcj4gPD0gPExBPiA8PSA8dXBwZXI+JworCWluc3RlYWQgb2YgJzxMQT4gPj0gPGxvd2VyPiBhbmQgPExBPiA8PSA8dXBwZXI+JykuCisJCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9MSUNFTlNFIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxZDVkNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9MSUNFTlNFCkBAIC0wLDAgKzEsMjYgQEAKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwMy0yMDA2IFRlcmVuY2UgUGFycgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vTUFOSUZFU1QuaW4gYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNGFkNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9NQU5JRkVTVC5pbgpAQCAtMCwwICsxLDIgQEAKK2luY2x1ZGUgTElDRU5TRSBBVVRIT1JTIGV6X3NldHVwLnB5CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9SRUFETUUgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTUwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vUkVBRE1FCkBAIC0wLDAgKzEsOTAgQEAKKzEpIEFCT1VUCis9PT09PT09PQorCitUaGlzIGlzIHRoZSBQeXRob24gcGFja2FnZSAnYW50bHIzJywgd2hpY2ggaXMgcmVxdWlyZWQgdG8gdXNlIHBhcnNlcnMgY3JlYXRlZAorYnkgdGhlIEFOVExSMyB0b29sLiBTZWUgPGh0dHA6Ly93d3cuYW50bHIub3JnLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK0FOVExSMy4KKworCisyKSBTVEFUVVMKKz09PT09PT09PQorCitUaGUgUHl0aG9uIHRhcmdldCBmb3IgQU5UTFIzIGlzIHN0aWxsIGluIGJldGEuIERvY3VtZW50YXRpb24gaXMgbGFja2luZywgc29tZQorYml0cyBvZiB0aGUgY29kZSBpcyBub3QgeWV0IGRvbmUsIHNvbWUgZnVuY3Rpb25hbGl0eSBoYXMgbm90IGJlZW4gdGVzdGVkIHlldC4KK0Fsc28gdGhlIEFQSSBtaWdodCBjaGFuZ2UgYSBiaXQgLSBpdCBjdXJyZW50bHkgbWltaWNzIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uLAorYnV0IGl0IG1heSBiZSBtYWRlIGEgYml0IG1vcmUgcHl0aG9uaWMgaGVyZSBhbmQgdGhlcmUuCisKK1dBUk5JTkc6IEN1cnJlbnRseSB0aGUgcnVudGltZSBsaWJyYXJ5IGZvciBWMy4xIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKK3JlY29nbml6ZXJzIGdlbmVyYXRlZCBieSBBTlRMUiBWMy4wLnguIElmIHlvdSBhcmUgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyLAordGhlbiB0aGUgc3VnZ2VzdGVkIHdheSB0byBzb2x2ZSB0aGlzIGlzIHRvIHBhY2thZ2UgdGhlIGNvcnJlY3QgcnVudGltZSB3aXRoCit5b3VyIGFwcGxpY2F0aW9uLiBJbnN0YWxsaW5nIHRoZSBydW50aW1lIGluIHRoZSBnbG9iYWwgc2l0ZS1wYWNrYWdlcyBkaXJlY3RvcnkKK21heSBub3QgYmUgYSBnb29kIGlkZWEuCitJdCBpcyBzdGlsbCB1bmRldGVybWluZWQsIGlmIGEgZnV0dXJlIHJlbGVhc2Ugb2YgdGhlIFYzLjEgcnVudGltZSB3aWxsIGJlCitjb21wYXRpYmxlIHdpdGggVjMuMC54IHJlY29nbml6ZXJzIG9yIGlmIGZ1dHVyZSBydW50aW1lcyBWMy4yKyB3aWxsIGJlCitjb21wYXRpYmxlIHdpdGggVjMuMSByZWNvZ25pemVycy4KK1NvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZS4KKworCiszKSBET1dOTE9BRAorPT09PT09PT09PT0KKworVGhpcyBydW50aW1lIGlzIHBhcnQgb2YgdGhlIEFOVExSIGRpc3RyaWJ1dGlvbi4gVGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBiZSBmb3VuZAorYXQgPGh0dHA6Ly93d3cuYW50bHIub3JnL2Rvd25sb2FkLmh0bWw+LgorCitJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGxhdGVzdCwgbW9zdCBibGVlZGluZyBlZGdlIHZlcnNpb24sIGhhdmUgYSBsb29rIGF0Cit0aGUgcGVyZm9yY2UgZGVwb3QgYXQgPGh0dHA6Ly9maXNoZXllMi5jZW5xdWEuY29tL2Jyb3dzZS9hbnRscj4uIFRoZXJlIGFyZQordGFyYmFsbHMgcmVhZHkgdG8gZG93bmxvYWQsIHNvIHlvdSBkb24ndCBoYXZlIHRvIGluc3RhbGwgdGhlIHBlcmZvcmNlIGNsaWVudC4KKworCis0KSBJTlNUQUxMQVRJT04KKz09PT09PT09PT09PT09PQorCitKdXN0IGxpa2UgYW55IG90aGVyIFB5dGhvbiBwYWNrYWdlOgorJCBweXRob24gc2V0dXAucHkgaW5zdGFsbAorCitTZWUgPGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvaW5zdC8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKKzUpIERPQ1VNRU5UQVRJT04KKz09PT09PT09PT09PT09PT0KKworRG9jdW1lbnRhdGlvbiAoYXMgZmFyIGFzIGl0IGV4aXN0cykgY2FuIGJlIGZvdW5kIGluIHRoZSB3aWtpCis8aHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9BbnRscjNQeXRob25UYXJnZXQ+CisKKworNikgUkVQT1JUSU5HIEJVR1MKKz09PT09PT09PT09PT09PT09CisKK1BsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBBTlRMUiBtYWlsaW5nIGxpc3QgCis8aHR0cDovL3d3dy5hbnRsci5vcmc6ODA4MC9tYWlsbWFuL2xpc3RpbmZvL2FudGxyLWludGVyZXN0PiBvcgorPHBpbmtAb2RhaG9kYS5kZT4uCisKK0V4aXN0aW5nIGJ1Z3MgbWF5IGFwcGVhciBzb21lZGF5IGluIHRoZSBidWd0cmFja2VyOgorPGh0dHA6Ly93d3cuYW50bHIub3JnOjg4ODgvYnJvd3NlL0FOVExSPgorCisKKzcpIEhBQ0tJTkcKKz09PT09PT09PT0KKworT25seSB0aGUgcnVudGltZSBwYWNrYWdlIGNhbiBiZSBmb3VuZCBoZXJlLiBUaGVyZSBhcmUgYWxzbyBzb21lIFN0cmluZ1RlbXBsYXRlCitmaWxlcyBpbiAnc3JjL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vJyBhbmQgc29tZSBKYXZhIGNvZGUgaW4KKydzcmMvb3JnL2FudGxyL2NvZGVnZW4vUHl0aG9uVGFyZ2V0LmphdmEnIChvZiB0aGUgbWFpbiBBTlRMUjMgc291cmNlCitkaXN0cmlidXRpb24pLgorCitJZiB0aGVyZSBhcmUgbm8gZGlyZWN0b3JpZXMgJ3Rlc3RzJyBhbmQgJ3VuaXR0ZXN0cycgaW4gJ3J1bnRpbWUvUHl0aG9uJywgeW91CitzaG91bGQgZmV0Y2ggdGhlIGxhdGVzdCBBTlRMUjMgdmVyc2lvbiBmcm9tIHRoZSBwZXJmb3JjZSBkZXBvdC4gU2VlIHNlY3Rpb24KK0RPV05MT0FELgorWW91J2xsIG5lZWQgamF2YSBhbmQgYW50IGluIG9yZGVyIHRvIGNvbXBpbGUgYW5kIHVzZSB0aGUgdG9vbC4KK0JlIHN1cmUgdG8gcHJvcGVybHkgc2V0dXAgeW91ciBDTEFTU1BBVEguCisoRklYTUU6IGlzIHRoZXJlIHNvbWUgZ2VuZXJpYyBpbmZvcm1hdGlvbiwgaG93IHRvIGJ1aWxkIGl0IHlvdXJzZWxmPyBJIHNob3VsZAorcG9pbnQgdG8gaXQgdG8gYXZvaWQgZHVwbGljYXRpb24uKQorCitZb3UgY2FuIHRoZW4gdXNlIHRoZSBjb21tYW5kcworJCBweXRob24gc2V0dXAucHkgdW5pdHRlc3QKKyQgcHl0aG9uIHNldHVwLnB5IGZ1bmN0ZXN0Cit0byBlbnN1cmUgdGhhdCBjaGFuZ2VzIGRvIG5vdCBicmVhayBleGlzdGluZyBiZWhhdmlvdXIuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPHBpbmtAb2RhaG9kYS5kZT4uIEZvciBsYXJnZXIgY29kZSBjb250cmlidXRpb25zIHlvdSdsbAoraGF2ZSB0byBzaWduIHRoZSAiRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIiwgd2hpY2ggY2FuIGJlIGZvdW5kIG9uCis8aHR0cDovL3d3dy5hbnRsci5vcmcvbGljZW5zZS5odG1sPiBvciB1c2UgdGhlIGZlZWRiYWNrIGZvcm0gYXQKKzxodHRwOi8vd3d3LmFudGxyLm9yZy9taXNjL2ZlZWRiYWNrPi4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9UT0RPIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNWNkZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9UT0RPCkBAIC0wLDAgKzEsODIgQEAKKy0gbmV3IHRlc3QgZnJvbSBDTDQ4MzIKKy0gQ1M0NTMxCistIHRlc3RjYXNlcyBmb3IgZXJyb3Igbm9kZXMKKy0gZGlkIEkgbWlzcyBhIGNoYW5nZSB0byBQeXRob24uc3RnL3JldHVyblNjb3BlPworICAtIHRoZXJlIGFyZSBiYXNlIGNsYXNzZXMgVHJlZS0vUGFyc2VyUnVsZVJldHVyblNjb3BlCistIHVwZGF0ZSBvbGQgYW5kIGFkZCBuZXcgZXhhbXBsZXMKKy0gbmVlZCBwcm90ZWN0aW9ucyBpbiBzY29wZUF0dHJpYnV0ZVJlZj8gQ0w0NDI2CistIHRlc3RjYXNlIGZvciAkSUQuaW50IENMNDQxMworLSBuZWVkIHRvIG92ZXJyaWRlIFRhcmdldC5lbmNvZGVJbnRBc0NoYXJFc2NhcGU/IENMNDM4OQorLSBsb29rIGludG8gYnVpbGRib3QKKyAgLSBsaW5rIGluIHJlcG9ydCBtYWlscyBpcyBicm9rZW4KKyAgLSB0aW1lem9uZSBidWcgaW4gcDQgc2NyYXBlcgorICAtIGNvcmU6CisgICAgLSBvbmx5IGxvb2sgYXQgY2hhbmdlcyBpbiBzcmMvICYgcnVudGltZS9KYXZhCisgICAgLSBxdWljaworICAgICAgLSBpbmNyZW1lbnRpYWwgYnVpbGQgCisgICAgICAtIHNhbml0eSBjaGVjaworICAgIC0gZnVsbAorICAgICAgLSBkZXBlbmQgb24gcXVpY2sKKyAgICAgIC0gZnVsbCBidWlsZAorICAgICAgLSBhbnQgdGVzdAorICAtIHRhcmdldHMKKyAgICAtIGRlcGVuZCBvbiBjaGFuZ2VzIG9uIHNyYy8gYW5kIHJ1bnRpbWUvWFhYCisgICAgLSBkZXBlbmQgb24gc3VjY2Vzc2Z1bCBjb3JlL3F1aWNrIGJ1aWxkCisgIC0gbmlnaHRseWJ1aWxkCisgICAgLSBkZXBlbmQgb24gY29yZS9mdWxsCisgICAgLSBzb21laG93IGNoZWNrIHdoaWNoIHRhcmdldHMgYXJlIG9rCistIFRyZWVXaXphcmQ6CisgIC0gcmFpc2UgZXhjZXB0aW9uIG9uIHBhcnNlIGVycm9ycworICAtIGRvY3VtZW50IGl0IGluIHdpa2kKKy0gcHVibGlzaCBydW50aW1lIG9uIGNoZWVzZXNob3AKKy0gYmV0dGVyIGRvY3VtZW50YXRpb24gZm9yIG91dHB1dD10ZW1wbGF0ZSB3LyBmdWxsIGV4YW1wbGVzCistIGFudGxyMy5tYWluOgorICAtIHZlcmJvc2UvcXVpZXQgZmxhZzogc2hvdy9oaWRlIHdhcm5pbmdzCisgIC0gc2V0IG9wdGlvbnMgaW4gZ3JhbW1hcj8KKyAgLSB3cml0ZSBvcHRpb25wYXJzZXIgZGVzY3JpcHRpb25zCisgIC0gYmV0dGVyIG91dHB1dCBmb3IgcmV0dXJuIG9iamVjdHMKKyAgLSBzdCBzdXBwb3J0CistIGN1c3RvbSBncmFtbWFyIG9wdGlvbnMgcGVyIHRhcmdldAorICAtIG1ha2UgR3JhbW1hci5sZWdhbE9wdGlvbnMgY2hhbmdlYWJsZQorICAtIGZpcnN0IGV4dHJhY3QgbGFuZ3VhZ2Ugb3B0aW9uLCBsb2FkIHRhcmdldCBjbGFzcworICAtIHBhc3Mgb3B0aW9ucyBub3Qga25vd24gYnkgR3JhbW1hciB0byB0YXJnZXQKKy0gcGF0Y2ggZm9yIENTNDAxMCAibnVsbCBjaGVjayBmb3IgJHNjb3BlOjp2YXIgbm93IiBvbmNlIGFjdGlvbiBwYXJzZXIgaXMgZml4ZWQKKy0gcmVuYW1lIEBtZW1iZXJzL0Bpbml0IHRvIEBjbGFzc21lbWJlcnMsIEBpbnN0YW5jZW1lbWJlcnM/CistIGd1bml0PworLSB0ZXN0Y2FzZXMgZXJyb3IgaGFuZGxpbmcgaW4gdHJlZSBwYXJzZXJzCistIGJldHRlciB0ZXN0IGNvdmVyYWdlIGZvciBydW50aW1lIG1vZHVsZXMKKy0gZG9jdW1lbnRhdGlvbgorICAtIG1vcmUgZG9jdW1lbnRhdGlvbiBpbiBkb2NzdHJpbmdzCisgIC0gdHVuZSBkb3h5Z2VuIG91dHB1dAorICAtIGRveHlnZW4gZnJvbnRwYWdlCistIGRvIG5vdCB1c2UgU2V0KiB0ZW1wbGF0ZXMgZm9yIHByb3BlcnRpZXMgZm9yIFB5dGhvbiB0YXJnZXQKKyAgLSBnYXRlIHdpdGggc2VtcHJlZCB7dGFyZ2V0LnVzZVByb3BlcnR5U2V0VGVtcGxhdGVzKCl9PworLSBzcGVjaWFsIHRlbXBsYXRlIGZvciBlbXB0eSBhbHRlcm5hdGl2ZSAtPiBwYXNzCistIGNvbXBsZXRlIHJ1bnRpbWUKKyAtIHRyZWUuRG91YmxlTGlua1RyZWUKKyAtIHRyZWUuUGFyc2VUcmVlCisgLSB0cmVlLlVuQnVmZmVyZWRUcmVlTm9kZVN0cmVhbQorLSBkZWZhdWx0IHZhbHVlcyBpbiBydWxlIGFyZ3VtZW50cz8KKy0gdHVybiBzb21lIG1ldGhvZHMgaW50byBhdHRyaWJ1dGVzCisgIC0gKFN0cmluZ3xDb21tb25Ub2tlbilTdHJlYW0uaW5kZXgoKQorICAtIChTdHJpbmd8Q29tbW9uVG9rZW4pU3RyZWFtLnNpemUoKSAtLT4gX19sZW5fXworLSBnZXQgcmlkIG9mIGdldHRlci9zZXR0ZXIgaW4gZ2VuZXJhdGVkIGNvZGUKKy0gZG9jdW1lbnQgZGlmZmVyZW5jZXMgdG8gamF2YSBBUEkKKy0gYWRkIG1ldGhvZHMgdG8gZW11bGF0ZSBqYXZhIEFQSSwgYnV0IG1hcmsgJ2VtIGFzIGRlcHJlY2F0ZWQKKy0gdXNpbmcgU3RyZWFtLmluZGV4IGFzIGEgc3RhdGUgZm9yICdlcnJvci1hbHJlYWR5LXJlcG9ydGVkJyBvciBtZW1vaXphdGlvbgorICB3aWxsIGJlIGEgcHJvYmxlbSB3aGVuIHRoZSBzdHJlYW0gaXMgbm90IGEgbGluZWFyIGJ1ZmZlcgorLSBvcHRpbWl6YXRpb25zIHdoaWNoIHNob3VsZCBiZSBleHBsb3JlZDoKKyAgLSBERkE6IHBlcmhhcHMgemlwKCkgdGhlIGxpc3RzIGludG8gYSB0dXBsZSAKKyAgICAoZW90LCBlb2YsIG1pbiwgbWF4LCBhY2NlcHQsIHNwZWNpYWwsIHRyYW5zaXRpb24pCisgICAgZm9yIGVhY2ggc3RhdGUuIGNoZWNrb3V0IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBnYWluLgorICAtIFN0aW5nU3RyZWFtOiBsb29rIGludG8gb3B0aW1pemluZyBMQSgpLiBQZXJoYXBzIHVzZSBMQWsgaW5zdGVhZCBvZiBMQShrKQorICAgIGFuZCBjcmVhdGUgdGhlIGF0dHJpYnV0ZXMgd2hlbiBuZWVkZWQuCisgIC0gUGVyZm9ybSBzb21lIG1hZ2ljIHRvIGltcHJvdmUgZGZhU3RhdGVTd2l0Y2guCisgIC0gaW4gbGV4ZXIgcnVsZXM6CisgICAgTEEgPT0gdSdhJyBvciBMQSA9PSB1J2InIG9yIExBID09IHUnYycuLi4KKyAgICAtPiBMQSBpbiAodSdhJywgdSdiJywgdSdjJywgLi4uKQorICAgIG9yICJMQSBpbiBzZWxmLnNldF94eXoiIHdpdGggc2V0X3h5eiBhcyBhIGNsYXNzIG1lbWJlcgorICAgIC0gdHdlYWsgQ29kZUdlbmVyYXRvci5nZW5TZXRFeHByKCkKKyAgLSBtYWtlIEJhc2VUcmVlLm5pbCgpIGFuIGF0dHJpYnV0ZT8gb3Igc2luZ2xldG9uPworICAtIHBzeWNobz8/CistIC4uLgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9fX2luaXRfXy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ODU1OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNTIgQEAKKyIiIiBAcGFja2FnZSBhbnRscjMKK0BicmllZiBBTlRMUjMgcnVudGltZSBwYWNrYWdlCisKK1RoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCBzdXBwb3J0IGNsYXNzZXMsIHdoaWNoIGFyZSBuZWVkZWQgdG8gdXNlIHJlY29nbml6ZXJzCitnZW5lcmF0ZWQgYnkgQU5UTFIzLgorCitAbWFpbnBhZ2UKKworXG5vdGUgUGxlYXNlIGJlIHdhcm5lZCB0aGF0IHRoZSBsaW5lIG51bWJlcnMgaW4gdGhlIEFQSSBkb2N1bWVudGF0aW9uIGRvIG5vdAorbWF0Y2ggdGhlIHJlYWwgbG9jYXRpb25zIGluIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgcGFja2FnZS4gVGhpcyBpcyBhbgordW5pbnRlbmRlZCBhcnRpZmFjdCBvZiBkb3h5Z2VuLCB3aGljaCBJIGNvdWxkIG9ubHkgY29udmluY2UgdG8gdXNlIHRoZQorY29ycmVjdCBtb2R1bGUgbmFtZXMgYnkgY29uY2F0ZW5hdGluZyBhbGwgZmlsZXMgZnJvbSB0aGUgcGFja2FnZSBpbnRvIGEgc2luZ2xlCittb2R1bGUgZmlsZS4uLgorCitIZXJlIGlzIGEgbGl0dGxlIG92ZXJ2aWV3IG92ZXIgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBjbGFzc2VzIHByb3ZpZGVkIGJ5Cit0aGlzIHJ1bnRpbWU6CisKK0BzZWN0aW9uIHJlY29nbml6ZXJzIFJlY29nbml6ZXJzCisKK1RoZXNlIHJlY29nbml6ZXJzIGFyZSBiYXNlY2xhc3NlcyBmb3IgdGhlIGNvZGUgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IEFOVExSMy4KKworLSBCYXNlUmVjb2duaXplcjogQmFzZSBjbGFzcyB3aXRoIGNvbW1vbiByZWNvZ25pemVyIGZ1bmN0aW9uYWxpdHkuCistIExleGVyOiBCYXNlIGNsYXNzIGZvciBsZXhlcnMuCistIFBhcnNlcjogQmFzZSBjbGFzcyBmb3IgcGFyc2Vycy4KKy0gdHJlZS5UcmVlUGFyc2VyOiBCYXNlIGNsYXNzIGZvciAldHJlZSBwYXJzZXIuCisKK0BzZWN0aW9uIHN0cmVhbXMgU3RyZWFtcworCitFYWNoIHJlY29nbml6ZXIgcHVsbHMgaXRzIGlucHV0IGZyb20gb25lIG9mIHRoZSBzdHJlYW0gY2xhc3NlcyBiZWxvdy4gU3RyZWFtcworaGFuZGxlIHN0dWZmIGxpa2UgYnVmZmVyaW5nLCBsb29rLWFoZWFkIGFuZCBzZWVraW5nLgorCitBIGNoYXJhY3RlciBzdHJlYW0gaXMgdXN1YWxseSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcGlwZWxpbmUgb2YgYSB0eXBpY2FsCitBTlRMUjMgYXBwbGljYXRpb24uIEl0IGlzIHVzZWQgYXMgdGhlIGlucHV0IGZvciBhIExleGVyLgorCistIEFOVExSU3RyaW5nU3RyZWFtOiBSZWFkcyBmcm9tIGEgc3RyaW5nIG9iamVjdHMuIFRoZSBpbnB1dCBzaG91bGQgYmUgYSB1bmljb2RlCisgIG9iamVjdCwgb3IgQU5UTFIzIHdpbGwgaGF2ZSB0cm91YmxlIGRlY29kaW5nIG5vbi1hc2NpaSBkYXRhLgorLSBBTlRMUkZpbGVTdHJlYW06IE9wZW5zIGEgZmlsZSBhbmQgcmVhZCB0aGUgY29udGVudHMsIHdpdGggb3B0aW9uYWwgY2hhcmFjdGVyCisgIGRlY29kaW5nLgorLSBBTlRMUklucHV0U3RyZWFtOiBSZWFkcyB0aGUgZGF0ZSBmcm9tIGEgZmlsZS1saWtlIG9iamVjdCwgd2l0aCBvcHRpb25hbAorICBjaGFyYWN0ZXIgZGVjb2RpbmcuCisKK0EgUGFyc2VyIG5lZWRzIGEgVG9rZW5TdHJlYW0gYXMgaW5wdXQgKHdoaWNoIGluIHR1cm4gaXMgdXN1YWxseSBmZWQgYnkgYQorTGV4ZXIpOgorCistIENvbW1vblRva2VuU3RyZWFtOiBBIGJhc2ljIGFuZCBtb3N0IGNvbW1vbmx5IHVzZWQgVG9rZW5TdHJlYW0KKyAgaW1wbGVtZW50YXRpb24uCistIFRva2VuUmV3cml0ZVN0cmVhbTogQSBtb2RpZmljYXRpb24gb2YgQ29tbW9uVG9rZW5TdHJlYW0gdGhhdCBhbGxvd3MgdGhlCisgIHN0cmVhbSB0byBiZSBhbHRlcmVkIChieSB0aGUgUGFyc2VyKS4gU2VlIHRoZSAndHdlYWsnIGV4YW1wbGUgZm9yIGEgdXNlY2FzZS4KKworQW5kIHRyZWUuVHJlZVBhcnNlciBmaW5hbGx5IGZldGNoZXMgaXRzIGlucHV0IGZyb20gYSB0cmVlLlRyZWVOb2RlU3RyZWFtOgorCistIHRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW06IEEgYmFzaWMgYW5kIG1vc3QgY29tbW9ubHkgdXNlZCB0cmVlLlRyZWVOb2RlU3RyZWFtCisgIGltcGxlbWVudGF0aW9uLgorICAKKworQHNlY3Rpb24gdG9rZW5zdHJlZXMgVG9rZW5zIGFuZCBUcmVlcworCitBIExleGVyIGVtaXRzIFRva2VuIG9iamVjdHMgd2hpY2ggYXJlIHVzdWFsbHkgYnVmZmVyZWQgYnkgYSBUb2tlblN0cmVhbS4gQQorUGFyc2VyIGNhbiBidWlsZCBhIFRyZWUsIGlmIHRoZSBvdXRwdXQ9QVNUIG9wdGlvbiBoYXMgYmVlbiBzZXQgaW4gdGhlIGdyYW1tYXIuCisKK1RoZSBydW50aW1lIHByb3ZpZGVzIHRoZXNlIFRva2VuIGltcGxlbWVudGF0aW9uczoKKworLSBDb21tb25Ub2tlbjogQSBiYXNpYyBhbmQgbW9zdCBjb21tb25seSB1c2VkIFRva2VuIGltcGxlbWVudGF0aW9uLgorLSBDbGFzc2ljVG9rZW46IEEgVG9rZW4gb2JqZWN0IGFzIHVzZWQgaW4gQU5UTFIgMi54LCB1c2VkIHRvICV0cmVlCisgIGNvbnN0cnVjdGlvbi4KKworVHJlZSBvYmplY3RzIGFyZSB3cmFwcGVyIGZvciBUb2tlbiBvYmplY3RzLgorCistIHRyZWUuQ29tbW9uVHJlZTogQSBiYXNpYyBhbmQgbW9zdCBjb21tb25seSB1c2VkIFRyZWUgaW1wbGVtZW50YXRpb24uCisKK0EgdHJlZS5UcmVlQWRhcHRvciBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gY3JlYXRlIHRyZWUuVHJlZSBvYmplY3RzIGZvciB0aGUKK2lucHV0IFRva2VuIG9iamVjdHMuCisKKy0gdHJlZS5Db21tb25UcmVlQWRhcHRvcjogQSBiYXNpYyBhbmQgbW9zdCBjb21tb25seSB1c2VkIHRyZWUuVHJlZUFkYXB0b3IKK2ltcGxlbWVudGF0aW9uLgorCisKK0BzZWN0aW9uIEV4Y2VwdGlvbnMKKworUmVjb2duaXRpb25FeGNlcHRpb24gYXJlIGdlbmVyYXRlZCwgd2hlbiBhIHJlY29nbml6ZXIgZW5jb3VudGVycyBpbmNvcnJlY3QKK29yIHVuZXhwZWN0ZWQgaW5wdXQuCisKKy0gUmVjb2duaXRpb25FeGNlcHRpb24KKyAgLSBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24KKyAgLSBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uCisgICAgLSBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uCisgICAgLgorICAtIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbgorICAtIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbgorICAtIE5vVmlhYmxlQWx0RXhjZXB0aW9uCisgIC0gRWFybHlFeGl0RXhjZXB0aW9uCisgIC0gRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uCisgIC4KKy4KKworQSB0cmVlLlJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbiBpcyByYWlzZWQsIHdoZW4gdGhlIHBhcnNlcnMgaGl0cyBhCitjYXJkaW5hbGl0eSBtaXNtYXRjaCBkdXJpbmcgQVNUIGNvbnN0cnVjdGlvbi4gQWx0aG91Z2ggdGhpcyBpcyBiYXNpY2FsbHkgYQorYnVnIGluIHlvdXIgZ3JhbW1hciwgaXQgY2FuIG9ubHkgYmUgZGV0ZWN0ZWQgYXQgcnVudGltZS4KKworLSB0cmVlLlJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbgorICAtIHRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbgorICAtIHRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uCisgIC4KKy4KKworIiIiCisKKyMgdHJlZS5SZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0KKyMgdHJlZS5SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0KKyMgdHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtCisjIENoYXJTdHJlYW0KKyMgREZBCisjIFRva2VuU291cmNlCisKKyMgW1RoZSAiQlNEIGxpY2VuY2UiXQorIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisjICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisjIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisjIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyMgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisjIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK19fdmVyc2lvbl9fID0gJzMuNCcKKworIyBUaGlzIHJ1bnRpbWUgaXMgY29tcGF0aWJsZSB3aXRoIGdlbmVyYXRlZCBwYXJzZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyMgQVBJIHZlcnNpb25zLiAnSEVBRCcgaXMgb25seSB1c2VkIGJ5IHVuaXR0ZXN0cy4KK2NvbXBhdGlibGVfYXBpX3ZlcnNpb25zID0gWydIRUFEJywgMV0KKworZnJvbSBjb25zdGFudHMgaW1wb3J0ICoKK2Zyb20gZGZhIGltcG9ydCAqCitmcm9tIGV4Y2VwdGlvbnMgaW1wb3J0ICoKK2Zyb20gcmVjb2duaXplcnMgaW1wb3J0ICoKK2Zyb20gc3RyZWFtcyBpbXBvcnQgKgorZnJvbSB0b2tlbnMgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvY29tcGF0LnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5YWZjYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvY29tcGF0LnB5CkBAIC0wLDAgKzEsNDggQEAKKyIiIkNvbXBhdGliaWxpdHkgc3R1ZmYiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKK3RyeToKKyAgICBzZXQgPSBzZXQKKyAgICBmcm96ZW5zZXQgPSBmcm96ZW5zZXQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgc2V0LCBJbW11dGFibGVTZXQgYXMgZnJvemVuc2V0CisKKwordHJ5OgorICAgIHJldmVyc2VkID0gcmV2ZXJzZWQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIHJldmVyc2VkKGwpOgorICAgICAgICBsID0gbFs6XQorICAgICAgICBsLnJldmVyc2UoKQorICAgICAgICByZXR1cm4gbAorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvY29uc3RhbnRzLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9jb25zdGFudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0YTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvY29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsNTcgQEAKKyIiIkFOVExSMyBydW50aW1lIHBhY2thZ2UiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKK0VPRiA9IC0xCisKKyMjIEFsbCB0b2tlbnMgZ28gdG8gdGhlIHBhcnNlciAodW5sZXNzIHNraXAoKSBpcyBjYWxsZWQgaW4gdGhhdCBydWxlKQorIyBvbiBhIHBhcnRpY3VsYXIgImNoYW5uZWwiLiAgVGhlIHBhcnNlciB0dW5lcyB0byBhIHBhcnRpY3VsYXIgY2hhbm5lbAorIyBzbyB0aGF0IHdoaXRlc3BhY2UgZXRjLi4uIGNhbiBnbyB0byB0aGUgcGFyc2VyIG9uIGEgImhpZGRlbiIgY2hhbm5lbC4KK0RFRkFVTFRfQ0hBTk5FTCA9IDAKKworIyMgQW55dGhpbmcgb24gZGlmZmVyZW50IGNoYW5uZWwgdGhhbiBERUZBVUxUX0NIQU5ORUwgaXMgbm90IHBhcnNlZAorIyBieSBwYXJzZXIuCitISURERU5fQ0hBTk5FTCA9IDk5CisKKyMgUHJlZGVmaW5lZCB0b2tlbiB0eXBlcworRU9SX1RPS0VOX1RZUEUgPSAxCisKKyMjCisjIGltYWdpbmFyeSB0cmVlIG5hdmlnYXRpb24gdHlwZTsgdHJhdmVyc2UgImdldCBjaGlsZCIgbGluaworRE9XTiA9IDIKKyMjCisjaW1hZ2luYXJ5IHRyZWUgbmF2aWdhdGlvbiB0eXBlOyBmaW5pc2ggd2l0aCBhIGNoaWxkIGxpc3QKK1VQID0gMworCitNSU5fVE9LRU5fVFlQRSA9IFVQKzEKKwkKK0lOVkFMSURfVE9LRU5fVFlQRSA9IDAKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9kZWJ1Zy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvZGVidWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2OGZhNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvZGVidWcucHkKQEAgLTAsMCArMSwxMTM3IEBACisjIGJlZ2luW2xpY2VuY2VdCisjCisjICBbVGhlICJCU0QgbGljZW5jZSJdCisjICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKKyMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyMgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjICBhcmUgbWV0OgorIyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisjICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyMgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisjICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBlbmRbbGljZW5jZV0KKworaW1wb3J0IHNvY2tldAorZnJvbSBhbnRscjMgaW1wb3J0IFBhcnNlciwgVG9rZW5TdHJlYW0sIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlbgorZnJvbSBhbnRscjMudHJlZSBpbXBvcnQgQ29tbW9uVHJlZUFkYXB0b3IsIFRyZWVBZGFwdG9yLCBUcmVlCisKK2NsYXNzIERlYnVnUGFyc2VyKFBhcnNlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgc3RhdGU9Tm9uZSwgZGJnPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICMgd3JhcCB0b2tlbiBzdHJlYW0gaW4gRGVidWdUb2tlblN0cmVhbSAodW5sZXNzIHVzZXIgYWxyZWFkeSBkaWQgc28pLgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzdHJlYW0sIERlYnVnVG9rZW5TdHJlYW0pOgorICAgICAgICAgICAgc3RyZWFtID0gRGVidWdUb2tlblN0cmVhbShzdHJlYW0sIGRiZykKKworICAgICAgICBzdXBlcihEZWJ1Z1BhcnNlciwgc2VsZikuX19pbml0X18oc3RyZWFtLCBzdGF0ZSwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgICMgV2hvIHRvIG5vdGlmeSB3aGVuIGV2ZW50cyBpbiB0aGUgcGFyc2VyIG9jY3VyLgorICAgICAgICBzZWxmLl9kYmcgPSBOb25lCisKKyAgICAgICAgc2VsZi5zZXREZWJ1Z0xpc3RlbmVyKGRiZykKKworCisgICAgZGVmIHNldERlYnVnTGlzdGVuZXIoc2VsZiwgZGJnKToKKwkiIiJQcm92aWRlIGEgbmV3IGRlYnVnIGV2ZW50IGxpc3RlbmVyIGZvciB0aGlzIHBhcnNlci4gIE5vdGlmeSB0aGUKKyAgICAgICAgaW5wdXQgc3RyZWFtIHRvbyB0aGF0IGl0IHNob3VsZCBzZW5kIGV2ZW50cyB0byB0aGlzIGxpc3RlbmVyLgorCSIiIgorCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pbnB1dCwgJ2RiZycpOgorICAgICAgICAgICAgc2VsZi5pbnB1dC5kYmcgPSBkYmcKKworICAgICAgICBzZWxmLl9kYmcgPSBkYmcKKworICAgIGRlZiBnZXREZWJ1Z0xpc3RlbmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGJnCisKKyAgICBkYmcgPSBwcm9wZXJ0eShnZXREZWJ1Z0xpc3RlbmVyLCBzZXREZWJ1Z0xpc3RlbmVyKQorCisKKyAgICBkZWYgYmVnaW5SZXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuX2RiZy5iZWdpblJlc3luYygpCisKKworICAgIGRlZiBlbmRSZXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuX2RiZy5lbmRSZXN5bmMoKQorCisKKyAgICBkZWYgYmVnaW5CYWNrdHJhY2soc2VsZiwgbGV2ZWwpOgorICAgICAgICBzZWxmLl9kYmcuYmVnaW5CYWNrdHJhY2sobGV2ZWwpCisKKworICAgIGRlZiBlbmRCYWNrdHJhY2soc2VsZiwgbGV2ZWwsIHN1Y2Nlc3NmdWwpOgorICAgICAgICBzZWxmLl9kYmcuZW5kQmFja3RyYWNrKGxldmVsLHN1Y2Nlc3NmdWwpCisKKworICAgIGRlZiByZXBvcnRFcnJvcihzZWxmLCBleGMpOgorICAgICAgICBQYXJzZXIucmVwb3J0RXJyb3Ioc2VsZiwgZXhjKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhjLCBSZWNvZ25pdGlvbkV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZWxmLl9kYmcucmVjb2duaXRpb25FeGNlcHRpb24oZXhjKQorCisKK2NsYXNzIERlYnVnVG9rZW5TdHJlYW0oVG9rZW5TdHJlYW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dCwgZGJnPU5vbmUpOgorICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKyAgICAgICAgc2VsZi5pbml0aWFsU3RyZWFtU3RhdGUgPSBUcnVlCisgICAgICAgICMgVHJhY2sgdGhlIGxhc3QgbWFyaygpIGNhbGwgcmVzdWx0IHZhbHVlIGZvciB1c2UgaW4gcmV3aW5kKCkuCisgICAgICAgIHNlbGYubGFzdE1hcmtlciA9IE5vbmUKKworICAgICAgICBzZWxmLl9kYmcgPSBOb25lCisgICAgICAgIHNlbGYuc2V0RGVidWdMaXN0ZW5lcihkYmcpCisKKyAgICAgICAgIyBmb3JjZSBUb2tlblN0cmVhbSB0byBnZXQgYXQgbGVhc3QgZmlyc3QgdmFsaWQgdG9rZW4KKyAgICAgICAgIyBzbyB3ZSBrbm93IGlmIHRoZXJlIGFyZSBhbnkgaGlkZGVuIHRva2VucyBmaXJzdCBpbiB0aGUgc3RyZWFtCisgICAgICAgIHNlbGYuaW5wdXQuTFQoMSkKKworCisgICAgZGVmIGdldERlYnVnTGlzdGVuZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kYmcKKworICAgIGRlZiBzZXREZWJ1Z0xpc3RlbmVyKHNlbGYsIGRiZyk6CisgICAgICAgIHNlbGYuX2RiZyA9IGRiZworCisgICAgZGJnID0gcHJvcGVydHkoZ2V0RGVidWdMaXN0ZW5lciwgc2V0RGVidWdMaXN0ZW5lcikKKworCisgICAgZGVmIGNvbnN1bWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW5pdGlhbFN0cmVhbVN0YXRlOgorICAgICAgICAgICAgc2VsZi5jb25zdW1lSW5pdGlhbEhpZGRlblRva2VucygpCisKKyAgICAgICAgYSA9IHNlbGYuaW5wdXQuaW5kZXgoKQorICAgICAgICB0ID0gc2VsZi5pbnB1dC5MVCgxKQorICAgICAgICBzZWxmLmlucHV0LmNvbnN1bWUoKQorICAgICAgICBiID0gc2VsZi5pbnB1dC5pbmRleCgpCisgICAgICAgIHNlbGYuX2RiZy5jb25zdW1lVG9rZW4odCkKKworICAgICAgICBpZiBiID4gYSsxOgorICAgICAgICAgICAgIyB0aGVuIHdlIGNvbnN1bWVkIG1vcmUgdGhhbiBvbmUgdG9rZW47IG11c3QgYmUgb2ZmIGNoYW5uZWwgdG9rZW5zCisgICAgICAgICAgICBmb3IgaWR4IGluIHJhbmdlKGErMSwgYik6CisgICAgICAgICAgICAgICAgc2VsZi5fZGJnLmNvbnN1bWVIaWRkZW5Ub2tlbihzZWxmLmlucHV0LmdldChpZHgpKTsKKworCisgICAgZGVmIGNvbnN1bWVJbml0aWFsSGlkZGVuVG9rZW5zKHNlbGYpOgorICAgICAgICAiIiJjb25zdW1lIGFsbCBpbml0aWFsIG9mZi1jaGFubmVsIHRva2VucyIiIgorCisgICAgICAgIGZpcnN0T25DaGFubmVsVG9rZW5JbmRleCA9IHNlbGYuaW5wdXQuaW5kZXgoKQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKGZpcnN0T25DaGFubmVsVG9rZW5JbmRleCk6CisgICAgICAgICAgICBzZWxmLl9kYmcuY29uc3VtZUhpZGRlblRva2VuKHNlbGYuaW5wdXQuZ2V0KGlkeCkpCisKKyAgICAgICAgc2VsZi5pbml0aWFsU3RyZWFtU3RhdGUgPSBGYWxzZQorCisKKyAgICBkZWYgTFQoc2VsZiwgaSk6CisgICAgICAgIGlmIHNlbGYuaW5pdGlhbFN0cmVhbVN0YXRlOgorICAgICAgICAgICAgc2VsZi5jb25zdW1lSW5pdGlhbEhpZGRlblRva2VucygpCisKKyAgICAgICAgdCA9IHNlbGYuaW5wdXQuTFQoaSkKKyAgICAgICAgc2VsZi5fZGJnLkxUKGksIHQpCisgICAgICAgIHJldHVybiB0CisKKworICAgIGRlZiBMQShzZWxmLCBpKToKKyAgICAgICAgaWYgc2VsZi5pbml0aWFsU3RyZWFtU3RhdGU6CisgICAgICAgICAgICBzZWxmLmNvbnN1bWVJbml0aWFsSGlkZGVuVG9rZW5zKCkKKworICAgICAgICB0ID0gc2VsZi5pbnB1dC5MVChpKQorICAgICAgICBzZWxmLl9kYmcuTFQoaSwgdCkKKyAgICAgICAgcmV0dXJuIHQudHlwZQorCisKKyAgICBkZWYgZ2V0KHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC5nZXQoaSkKKworCisgICAgZGVmIGluZGV4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC5pbmRleCgpCisKKworICAgIGRlZiBtYXJrKHNlbGYpOgorICAgICAgICBzZWxmLmxhc3RNYXJrZXIgPSBzZWxmLmlucHV0Lm1hcmsoKQorICAgICAgICBzZWxmLl9kYmcubWFyayhzZWxmLmxhc3RNYXJrZXIpCisgICAgICAgIHJldHVybiBzZWxmLmxhc3RNYXJrZXIKKworCisgICAgZGVmIHJld2luZChzZWxmLCBtYXJrZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2RiZy5yZXdpbmQobWFya2VyKQorICAgICAgICBzZWxmLmlucHV0LnJld2luZChtYXJrZXIpCisKKworICAgIGRlZiByZWxlYXNlKHNlbGYsIG1hcmtlcik6CisgICAgICAgIHBhc3MKKworCisgICAgZGVmIHNlZWsoc2VsZiwgaW5kZXgpOgorICAgICAgICAjIFRPRE86IGltcGxlbWVudCBzZWVrIGluIGRiZyBpbnRlcmZhY2UKKyAgICAgICAgIyBzZWxmLl9kYmcuc2VlayhpbmRleCk7CisgICAgICAgIHNlbGYuaW5wdXQuc2VlayhpbmRleCkKKworCisgICAgZGVmIHNpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmlucHV0LnNpemUoKQorCisKKyAgICBkZWYgZ2V0VG9rZW5Tb3VyY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmlucHV0LmdldFRva2VuU291cmNlKCkKKworCisgICAgZGVmIGdldFNvdXJjZU5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldFRva2VuU291cmNlKCkuZ2V0U291cmNlTmFtZSgpCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmLCBzdGFydD1Ob25lLCBzdG9wPU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC50b1N0cmluZyhzdGFydCwgc3RvcCkKKworCitjbGFzcyBEZWJ1Z1RyZWVBZGFwdG9yKFRyZWVBZGFwdG9yKToKKyAgICAiIiJBIFRyZWVBZGFwdG9yIHByb3h5IHRoYXQgZmlyZXMgZGVidWdnaW5nIGV2ZW50cyB0byBhIERlYnVnRXZlbnRMaXN0ZW5lcgorICAgIGRlbGVnYXRlIGFuZCB1c2VzIHRoZSBUcmVlQWRhcHRvciBkZWxlZ2F0ZSB0byBkbyB0aGUgYWN0dWFsIHdvcmsuICBBbGwKKyAgICBBU1QgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgYnkgdGhpcyBhZGFwdG9yOyBubyBjb2RlIGdlbiBjaGFuZ2VzIGFyZSBuZWVkZWQKKyAgICBpbiBnZW5lcmF0ZWQgcnVsZXMuICBEZWJ1Z2dpbmcgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgKmFmdGVyKiBpbnZva2luZworICAgIHRyZWUgYWRhcHRvciByb3V0aW5lcy4KKworICAgIFRyZWVzIGNyZWF0ZWQgd2l0aCBhY3Rpb25zIGluIHJld3JpdGUgYWN0aW9ucyBsaWtlICItPiBeKEFERCB7Zm9vfSB7YmFyfSkiCisgICAgY2Fubm90IGJlIHRyYWNrZWQgYXMgdGhleSBtaWdodCBub3QgdXNlIHRoZSBhZGFwdG9yIHRvIGNyZWF0ZSBmb28sIGJhci4KKyAgICBUaGUgZGVidWcgbGlzdGVuZXIgaGFzIHRvIGRlYWwgd2l0aCB0cmVlIG5vZGUgSURzIGZvciB3aGljaCBpdCBkaWQKKyAgICBub3Qgc2VlIGEgY3JlYXRlTm9kZSBldmVudC4gIEEgc2luZ2xlIDx1bmtub3duPiBub2RlIGlzIHN1ZmZpY2llbnQgZXZlbgorICAgIGlmIGl0IHJlcHJlc2VudHMgYSB3aG9sZSB0cmVlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiZywgYWRhcHRvcik6CisgICAgICAgIHNlbGYuZGJnID0gZGJnCisgICAgICAgIHNlbGYuYWRhcHRvciA9IGFkYXB0b3IKKworCisgICAgZGVmIGNyZWF0ZVdpdGhQYXlsb2FkKHNlbGYsIHBheWxvYWQpOgorICAgICAgICBpZiBwYXlsb2FkLmdldFRva2VuSW5kZXgoKSA8IDA6CisgICAgICAgICAgICAjIGNvdWxkIGJlIHRva2VuIGNvbmp1cmVkIHVwIGR1cmluZyBlcnJvciByZWNvdmVyeQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlRnJvbVR5cGUocGF5bG9hZC5nZXRUeXBlKCksIHBheWxvYWQuZ2V0VGV4dCgpKQorCisgICAgICAgIG5vZGUgPSBzZWxmLmFkYXB0b3IuY3JlYXRlV2l0aFBheWxvYWQocGF5bG9hZCkKKyAgICAgICAgc2VsZi5kYmcuY3JlYXRlTm9kZShub2RlLCBwYXlsb2FkKQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGNyZWF0ZUZyb21Ub2tlbihzZWxmLCB0b2tlblR5cGUsIGZyb21Ub2tlbiwgdGV4dD1Ob25lKToKKyAgICAgICAgbm9kZSA9IHNlbGYuYWRhcHRvci5jcmVhdGVGcm9tVG9rZW4odG9rZW5UeXBlLCBmcm9tVG9rZW4sIHRleHQpCisgICAgICAgIHNlbGYuZGJnLmNyZWF0ZU5vZGUobm9kZSkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBjcmVhdGVGcm9tVHlwZShzZWxmLCB0b2tlblR5cGUsIHRleHQpOgorICAgICAgICBub2RlID0gc2VsZi5hZGFwdG9yLmNyZWF0ZUZyb21UeXBlKHRva2VuVHlwZSwgdGV4dCkKKyAgICAgICAgc2VsZi5kYmcuY3JlYXRlTm9kZShub2RlKQorICAgICAgICByZXR1cm4gbm9kZQorCisKKyAgICBkZWYgZXJyb3JOb2RlKHNlbGYsIGlucHV0LCBzdGFydCwgc3RvcCwgZXhjKToKKyAgICAgICAgbm9kZSA9IHNlbGZhZGFwdG9yLmVycm9yTm9kZShpbnB1dCwgc3RhcnQsIHN0b3AsIGV4YykKKyAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRiZy5lcnJvck5vZGUobm9kZSkKKworICAgICAgICByZXR1cm4gbm9kZQorCisKKyAgICBkZWYgZHVwVHJlZShzZWxmLCB0cmVlKToKKyAgICAgICAgdCA9IHNlbGYuYWRhcHRvci5kdXBUcmVlKHRyZWUpCisgICAgICAgICMgd2FsayB0aGUgdHJlZSBhbmQgZW1pdCBjcmVhdGUgYW5kIGFkZCBjaGlsZCBldmVudHMKKyAgICAgICAgIyB0byBzaW11bGF0ZSB3aGF0IGR1cFRyZWUgaGFzIGRvbmUuIGR1cFRyZWUgZG9lcyBub3QgY2FsbCB0aGlzIGRlYnVnCisgICAgICAgICMgYWRhcHRlciBzbyBJIG11c3Qgc2ltdWxhdGUuCisgICAgICAgIHNlbGYuc2ltdWxhdGVUcmVlQ29uc3RydWN0aW9uKHQpCisgICAgICAgIHJldHVybiB0CisKKworICAgIGRlZiBzaW11bGF0ZVRyZWVDb25zdHJ1Y3Rpb24oc2VsZiwgdCk6CisJIiIiXihBIEIgQyk6IGVtaXQgY3JlYXRlIEEsIGNyZWF0ZSBCLCBhZGQgY2hpbGQsIC4uLiIiIgorICAgICAgICBzZWxmLmRiZy5jcmVhdGVOb2RlKHQpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuYWRhcHRvci5nZXRDaGlsZENvdW50KHQpKToKKyAgICAgICAgICAgIGNoaWxkID0gc2VsZi5hZGFwdG9yLmdldENoaWxkKHQsIGkpCisgICAgICAgICAgICBzZWxmLnNpbXVsYXRlVHJlZUNvbnN0cnVjdGlvbihjaGlsZCkKKyAgICAgICAgICAgIHNlbGYuZGJnLmFkZENoaWxkKHQsIGNoaWxkKQorCisKKyAgICBkZWYgZHVwTm9kZShzZWxmLCB0cmVlTm9kZSk6CisgICAgICAgIGQgPSBzZWxmLmFkYXB0b3IuZHVwTm9kZSh0cmVlTm9kZSkKKyAgICAgICAgc2VsZi5kYmcuY3JlYXRlTm9kZShkKQorICAgICAgICByZXR1cm4gZAorCisKKyAgICBkZWYgbmlsKHNlbGYpOgorICAgICAgICBub2RlID0gc2VsZi5hZGFwdG9yLm5pbCgpCisgICAgICAgIHNlbGYuZGJnLm5pbE5vZGUobm9kZSkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworCisgICAgZGVmIGlzTmlsKHNlbGYsIHRyZWUpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmlzTmlsKHRyZWUpCisKKworICAgIGRlZiBhZGRDaGlsZChzZWxmLCB0LCBjaGlsZCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIFRva2VuKToKKyAgICAgICAgICAgIG4gPSBzZWxmLmNyZWF0ZVdpdGhQYXlsb2FkKGNoaWxkKQorICAgICAgICAgICAgc2VsZi5hZGRDaGlsZCh0LCBuKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB0IGlzIE5vbmUgb3IgY2hpbGQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmFkZENoaWxkKHQsIGNoaWxkKQorICAgICAgICAgICAgc2VsZi5kYmcuYWRkQ2hpbGQodCwgY2hpbGQpCisKKyAgICBkZWYgYmVjb21lUm9vdChzZWxmLCBuZXdSb290LCBvbGRSb290KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdSb290LCBUb2tlbik6CisgICAgICAgICAgICBuID0gc2VsZi5jcmVhdGVXaXRoUGF5bG9hZChuZXdSb290KQorICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmJlY29tZVJvb3Qobiwgb2xkUm9vdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG4gPSBzZWxmLmFkYXB0b3IuYmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KQorCisgICAgICAgIHNlbGYuZGJnLmJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCkKKyAgICAgICAgcmV0dXJuIG4KKworCisgICAgZGVmIHJ1bGVQb3N0UHJvY2Vzc2luZyhzZWxmLCByb290KToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdCkKKworCisgICAgZGVmIGdldFR5cGUoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiBzZWxmLmFkYXB0b3IuZ2V0VHlwZSh0KQorCisKKyAgICBkZWYgc2V0VHlwZShzZWxmLCB0LCB0eXBlKToKKyAgICAgICAgc2VsZi5hZGFwdG9yLnNldFR5cGUodCwgdHlwZSkKKworCisgICAgZGVmIGdldFRleHQoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiBzZWxmLmFkYXB0b3IuZ2V0VGV4dCh0KQorCisKKyAgICBkZWYgc2V0VGV4dChzZWxmLCB0LCB0ZXh0KToKKyAgICAgICAgc2VsZi5hZGFwdG9yLnNldFRleHQodCwgdGV4dCkKKworCisgICAgZGVmIGdldFRva2VuKHNlbGYsIHQpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldFRva2VuKHQpCisKKworICAgIGRlZiBzZXRUb2tlbkJvdW5kYXJpZXMoc2VsZiwgdCwgc3RhcnRUb2tlbiwgc3RvcFRva2VuKToKKyAgICAgICAgc2VsZi5hZGFwdG9yLnNldFRva2VuQm91bmRhcmllcyh0LCBzdGFydFRva2VuLCBzdG9wVG9rZW4pCisgICAgICAgIGlmIHQgaXMgbm90IE5vbmUgYW5kIHN0YXJ0VG9rZW4gaXMgbm90IE5vbmUgYW5kIHN0b3BUb2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGJnLnNldFRva2VuQm91bmRhcmllcygKKyAgICAgICAgICAgICAgICB0LCBzdGFydFRva2VuLmdldFRva2VuSW5kZXgoKSwKKyAgICAgICAgICAgICAgICBzdG9wVG9rZW4uZ2V0VG9rZW5JbmRleCgpKQorCisKKyAgICBkZWYgZ2V0VG9rZW5TdGFydEluZGV4KHNlbGYsIHQpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldFRva2VuU3RhcnRJbmRleCh0KQorCisKKyAgICBkZWYgZ2V0VG9rZW5TdG9wSW5kZXgoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiBzZWxmLmFkYXB0b3IuZ2V0VG9rZW5TdG9wSW5kZXgodCkKKworCisgICAgZGVmIGdldENoaWxkKHNlbGYsIHQsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldENoaWxkKHQsIGkpCisKKworICAgIGRlZiBzZXRDaGlsZChzZWxmLCB0LCBpLCBjaGlsZCk6CisgICAgICAgIHNlbGYuYWRhcHRvci5zZXRDaGlsZCh0LCBpLCBjaGlsZCkKKworCisgICAgZGVmIGRlbGV0ZUNoaWxkKHNlbGYsIHQsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmRlbGV0ZUNoaWxkKHQsIGkpCisKKworICAgIGRlZiBnZXRDaGlsZENvdW50KHNlbGYsIHQpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQodCkKKworCisgICAgZGVmIGdldFVuaXF1ZUlEKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKG5vZGUpCisKKworICAgIGRlZiBnZXRQYXJlbnQoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiBzZWxmLmFkYXB0b3IuZ2V0UGFyZW50KHQpCisKKworICAgIGRlZiBnZXRDaGlsZEluZGV4KHNlbGYsIHQpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldENoaWxkSW5kZXgodCkKKworCisgICAgZGVmIHNldFBhcmVudChzZWxmLCB0LCBwYXJlbnQpOgorICAgICAgICBzZWxmLmFkYXB0b3Iuc2V0UGFyZW50KHQsIHBhcmVudCkKKworCisgICAgZGVmIHNldENoaWxkSW5kZXgoc2VsZiwgdCwgaW5kZXgpOgorICAgICAgICBzZWxmLmFkYXB0b3Iuc2V0Q2hpbGRJbmRleCh0LCBpbmRleCkKKworCisgICAgZGVmIHJlcGxhY2VDaGlsZHJlbihzZWxmLCBwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCwgc3RvcENoaWxkSW5kZXgsIHQpOgorICAgICAgICBzZWxmLmFkYXB0b3IucmVwbGFjZUNoaWxkcmVuKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCkKKworCisgICAgIyMgc3VwcG9ydAorCisgICAgZGVmIGdldERlYnVnTGlzdGVuZXIoc2VsZik6CisgICAgICAgIHJldHVybiBkYmcKKworICAgIGRlZiBzZXREZWJ1Z0xpc3RlbmVyKHNlbGYsIGRiZyk6CisgICAgICAgIHNlbGYuZGJnID0gZGJnCisKKworICAgIGRlZiBnZXRUcmVlQWRhcHRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvcgorCisKKworY2xhc3MgRGVidWdFdmVudExpc3RlbmVyKG9iamVjdCk6CisgICAgIiIiQWxsIGRlYnVnZ2luZyBldmVudHMgdGhhdCBhIHJlY29nbml6ZXIgY2FuIHRyaWdnZXIuCisKKyAgICBJIGRpZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgQVNUIGRlYnVnZ2luZyBpbnRlcmZhY2UgYXMgaXQgd291bGQgY3JlYXRlCisgICAgbG90cyBvZiBleHRyYSBjbGFzc2VzIGFuZCBEZWJ1Z1BhcnNlciBoYXMgYSBkYmcgdmFyIGRlZmluZWQsIHdoaWNoIG1ha2VzCisgICAgaXQgaGFyZCB0byBjaGFuZ2UgdG8gQVNURGVidWdFdmVudExpc3RlbmVyLiAgSSBsb29rZWQgaGFyZCBhdCB0aGlzIGlzc3VlCisgICAgYW5kIGl0IGlzIGVhc2llciB0byB1bmRlcnN0YW5kIGFzIG9uZSBtb25vbGl0aGljIGV2ZW50IGludGVyZmFjZSBmb3IgYWxsCisgICAgcG9zc2libGUgZXZlbnRzLiAgSG9wZWZ1bGx5LCBhZGRpbmcgU1QgZGVidWdnaW5nIHN0dWZmIHdvbid0IGJlIGJhZC4gIExlYXZlCisgICAgZm9yIGZ1dHVyZS4gNC8yNi8yMDA2LgorICAgICIiIgorCisgICAgIyBNb3ZlZCB0byB2ZXJzaW9uIDIgZm9yIHYzLjE6IGFkZGVkIGdyYW1tYXIgbmFtZSB0byBlbnRlci9leGl0IFJ1bGUKKyAgICBQUk9UT0NPTF9WRVJTSU9OID0gIjIiCisKKyAgICBkZWYgZW50ZXJSdWxlKHNlbGYsIGdyYW1tYXJGaWxlTmFtZSwgcnVsZU5hbWUpOgorCSIiIlRoZSBwYXJzZXIgaGFzIGp1c3QgZW50ZXJlZCBhIHJ1bGUuIE5vIGRlY2lzaW9uIGhhcyBiZWVuIG1hZGUgYWJvdXQKKyAgICAgICAgd2hpY2ggYWx0IGlzIHByZWRpY3RlZC4gIFRoaXMgaXMgZmlyZWQgQUZURVIgaW5pdCBhY3Rpb25zIGhhdmUgYmVlbgorICAgICAgICBleGVjdXRlZC4gIEF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgYW5kIGF2YWlsYWJsZSBldGMuLi4KKyAgICAgICAgVGhlIGdyYW1tYXJGaWxlTmFtZSBhbGxvd3MgY29tcG9zaXRlIGdyYW1tYXJzIHRvIGp1bXAgYXJvdW5kIGFtb25nCisgICAgICAgIG11bHRpcGxlIGdyYW1tYXIgZmlsZXMuCisgICAgICAgICIiIgorCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIGVudGVyQWx0KHNlbGYsIGFsdCk6CisJIiIiQmVjYXVzZSBydWxlcyBjYW4gaGF2ZSBsb3RzIG9mIGFsdGVybmF0aXZlcywgaXQgaXMgdmVyeSB1c2VmdWwgdG8KKyAgICAgICAga25vdyB3aGljaCBhbHQgeW91IGFyZSBlbnRlcmluZy4gIFRoaXMgaXMgMS4ubiBmb3IgbiBhbHRzLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgZXhpdFJ1bGUoc2VsZiwgZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk6CisJIiIiVGhpcyBpcyB0aGUgbGFzdCB0aGluZyBleGVjdXRlZCBiZWZvcmUgbGVhdmluZyBhIHJ1bGUuICBJdCBpcworICAgICAgICBleGVjdXRlZCBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBUaGlzIGlzIHRyaWdnZXJlZCBhZnRlcgorICAgICAgICBlcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGhhdmUgb2NjdXJyZWQgKHVubGVzcyB0aGUgZXhjZXB0aW9uIGlzCisgICAgICAgIG5vdCBjYXVnaHQgaW4gdGhpcyBydWxlKS4gIFRoaXMgaW1wbGllcyBhbiAiZXhpdEFsdCIgZXZlbnQuCisgICAgICAgIFRoZSBncmFtbWFyRmlsZU5hbWUgYWxsb3dzIGNvbXBvc2l0ZSBncmFtbWFycyB0byBqdW1wIGFyb3VuZCBhbW9uZworICAgICAgICBtdWx0aXBsZSBncmFtbWFyIGZpbGVzLgorCSIiIgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBlbnRlclN1YlJ1bGUoc2VsZiwgZGVjaXNpb25OdW1iZXIpOgorCSIiIlRyYWNrIGVudHJ5IGludG8gYW55ICguLi4pIHN1YnJ1bGUgb3RoZXIgRUJORiBjb25zdHJ1Y3QiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgZXhpdFN1YlJ1bGUoc2VsZiwgZGVjaXNpb25OdW1iZXIpOgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBlbnRlckRlY2lzaW9uKHNlbGYsIGRlY2lzaW9uTnVtYmVyLCBjb3VsZEJhY2t0cmFjayk6CisJIiIiRXZlcnkgZGVjaXNpb24sIGZpeGVkIGsgb3IgYXJiaXRyYXJ5LCBoYXMgYW4gZW50ZXIvZXhpdCBldmVudAorICAgICAgICBzbyB0aGF0IGEgR1VJIGNhbiBlYXNpbHkgdHJhY2sgd2hhdCBMVC9jb25zdW1lIGV2ZW50cyBhcmUKKyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHByZWRpY3Rpb24uICBZb3Ugd2lsbCBzZWUgYSBzaW5nbGUgZW50ZXIvZXhpdAorICAgICAgICBzdWJydWxlIGJ1dCBtdWx0aXBsZSBlbnRlci9leGl0IGRlY2lzaW9uIGV2ZW50cywgb25lIGZvciBlYWNoCisgICAgICAgIGxvb3AgaXRlcmF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgZXhpdERlY2lzaW9uKHNlbGYsIGRlY2lzaW9uTnVtYmVyKToKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgY29uc3VtZVRva2VuKHNlbGYsIHQpOgorCSIiIkFuIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZDsgbWF0Y2hlZCBieSBhbnkga2luZCBvZiBlbGVtZW50LgorICAgICAgICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorCSIiIgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBjb25zdW1lSGlkZGVuVG9rZW4oc2VsZiwgdCk6CisJIiIiQW4gb2ZmLWNoYW5uZWwgaW5wdXQgdG9rZW4gd2FzIGNvbnN1bWVkLgorICAgICAgICBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorICAgICAgICAodW5sZXNzIG9mIGNvdXJzZSB0aGUgaGlkZGVuIHRva2VuIGlzIGZpcnN0IHN0dWZmIGluIHRoZSBpbnB1dCBzdHJlYW0pLgorCSIiIgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBMVChzZWxmLCBpLCB0KToKKwkiIiJTb21lYm9keSAoYW55Ym9keSkgbG9va2VkIGFoZWFkLiAgTm90ZSB0aGF0IHRoaXMgYWN0dWFsbHkgZ2V0cworICAgICAgICB0cmlnZ2VyZWQgYnkgYm90aCBMQSBhbmQgTFQgY2FsbHMuICBUaGUgZGVidWdnZXIgd2lsbCB3YW50IHRvIGtub3cKKyAgICAgICAgd2hpY2ggVG9rZW4gb2JqZWN0IHdhcyBleGFtaW5lZC4gIExpa2UgY29uc3VtZVRva2VuLCB0aGlzIGluZGljYXRlcworICAgICAgICB3aGF0IHRva2VuIHdhcyBzZWVuIGF0IHRoYXQgZGVwdGguICBBIHJlbW90ZSBkZWJ1Z2dlciBjYW5ub3QgbG9vaworICAgICAgICBhaGVhZCBpbnRvIGEgZmlsZSBpdCBkb2Vzbid0IGhhdmUgc28gTFQgZXZlbnRzIG11c3QgcGFzcyB0aGUgdG9rZW4KKyAgICAgICAgZXZlbiBpZiB0aGUgaW5mbyBpcyByZWR1bmRhbnQuCisJIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIG1hcmsoc2VsZiwgbWFya2VyKToKKwkiIiJUaGUgcGFyc2VyIGlzIGdvaW5nIHRvIGxvb2sgYXJiaXRyYXJpbHkgYWhlYWQ7IG1hcmsgdGhpcyBsb2NhdGlvbiwKKyAgICAgICAgdGhlIHRva2VuIHN0cmVhbSdzIG1hcmtlciBpcyBzZW50IGluIGNhc2UgeW91IG5lZWQgaXQuCisJIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIHJld2luZChzZWxmLCBtYXJrZXI9Tm9uZSk6CisJIiIiQWZ0ZXIgYW4gYXJiaXRyYWlybHkgbG9uZyBsb29rYWhlYWQgYXMgd2l0aCBhIGN5Y2xpYyBERkEgKG9yIHdpdGgKKyAgICAgICAgYW55IGJhY2t0cmFjayksIHRoaXMgaW5mb3JtcyB0aGUgZGVidWdnZXIgdGhhdCBzdHJlYW0gc2hvdWxkIGJlCisgICAgICAgIHJld291bmQgdG8gdGhlIHBvc2l0aW9uIGFzc29jaWF0ZWQgd2l0aCBtYXJrZXIuCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIGJlZ2luQmFja3RyYWNrKHNlbGYsIGxldmVsKToKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgZW5kQmFja3RyYWNrKHNlbGYsIGxldmVsLCBzdWNjZXNzZnVsKToKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgbG9jYXRpb24oc2VsZiwgbGluZSwgcG9zKToKKwkiIiJUbyB3YXRjaCBhIHBhcnNlciBtb3ZlIHRocm91Z2ggdGhlIGdyYW1tYXIsIHRoZSBwYXJzZXIgbmVlZHMgdG8KKyAgICAgICAgaW5mb3JtIHRoZSBkZWJ1Z2dlciB3aGF0IGxpbmUvY2hhclBvcyBpdCBpcyBwYXNzaW5nIGluIHRoZSBncmFtbWFyLgorICAgICAgICBGb3Igbm93LCB0aGlzIGRvZXMgbm90IGtub3cgaG93IHRvIHN3aXRjaCBmcm9tIG9uZSBncmFtbWFyIHRvIHRoZQorICAgICAgICBvdGhlciBhbmQgYmFjayBmb3IgaXNsYW5kIGdyYW1tYXJzIGV0Yy4uLgorCisgICAgICAgIFRoaXMgc2hvdWxkIGFsc28gYWxsb3cgYnJlYWtwb2ludHMgYmVjYXVzZSB0aGUgZGVidWdnZXIgY2FuIHN0b3AKKyAgICAgICAgdGhlIHBhcnNlciB3aGVuZXZlciBpdCBoaXRzIHRoaXMgbGluZS9wb3MuCisJIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIHJlY29nbml0aW9uRXhjZXB0aW9uKHNlbGYsIGUpOgorCSIiIkEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFeGNlcHRpb24uICBJIG1hZGUKKyAgICAgICAgdGhpcyBhIGdlbmVyaWMgZXZlbnQgc28gdGhhdCBJIGNhbiBhbHRlciB0aGUgZXhjZXB0aW9uIGhpZXJhY2h5IGxhdGVyCisgICAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGFsdGVyIGFsbCB0aGUgZGVidWcgb2JqZWN0cy4KKworICAgICAgICBVcG9uIGVycm9yLCB0aGUgc3RhY2sgb2YgZW50ZXIgcnVsZS9zdWJydWxlIG11c3QgYmUgcHJvcGVybHkgdW53b3VuZC4KKyAgICAgICAgSWYgbm8gdmlhYmxlIGFsdCBvY2N1cnMgaXQgaXMgd2l0aGluIGFuIGVudGVyL2V4aXQgZGVjaXNpb24sIHdoaWNoCisgICAgICAgIGFsc28gbXVzdCBiZSByZXdvdW5kLiAgRXZlbiB0aGUgcmV3aW5kIGZvciBlYWNoIG1hcmsgbXVzdCBiZSB1bndvdW50LgorICAgICAgICBJbiB0aGUgSmF2YSB0YXJnZXQgdGhpcyBpcyBwcmV0dHkgZWFzeSB1c2luZyB0cnkvZmluYWxseSwgaWYgYSBiaXQKKyAgICAgICAgdWdseSBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUaGUgcmV3aW5kIGlzIGdlbmVyYXRlZCBpbiBERkEucHJlZGljdCgpCisgICAgICAgIGFjdHVhbGx5IHNvIG5vIGNvZGUgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGF0LiAgRm9yIGxhbmd1YWdlcworICAgICAgICB3L28gdGhpcyAiZmluYWxseSIgZmVhdHVyZSAoQysrPyksIHRoZSB0YXJnZXQgaW1wbGVtZW50b3Igd2lsbCBoYXZlCisgICAgICAgIHRvIGJ1aWxkIGFuIGV2ZW50IHN0YWNrIG9yIHNvbWV0aGluZy4KKworICAgICAgICBBY3Jvc3MgYSBzb2NrZXQgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcsIG9ubHkgdGhlIFJlY29nbml0aW9uRXhjZXB0aW9uCisgICAgICAgIGRhdGEgZmllbGRzIGFyZSB0cmFuc21pdHRlZC4gIFRoZSB0b2tlbiBvYmplY3Qgb3Igd2hhdGV2ZXIgdGhhdAorICAgICAgICBjYXVzZWQgdGhlIHByb2JsZW0gd2FzIHRoZSBsYXN0IG9iamVjdCByZWZlcmVuY2VkIGJ5IExULiAgVGhlCisgICAgICAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyBMVCBldmVudCBzaG91bGQgaG9sZCB0aGUgdW5leHBlY3RlZCBUb2tlbiBvcgorICAgICAgICBjaGFyLgorCisgICAgICAgIEhlcmUgaXMgYSBzYW1wbGUgZXZlbnQgdHJhY2UgZm9yIGdyYW1tYXI6CisKKyAgICAgICAgYiA6IEMgKHs7fUF8QikgLy8gezt9IGlzIHRoZXJlIHRvIHByZXZlbnQgQXxCIGJlY29taW5nIGEgc2V0CisgICAgICAgICAgfCBECisgICAgICAgICAgOworCisgICAgICAgIFRoZSBzZXF1ZW5jZSBmb3IgdGhpcyBydWxlICh3aXRoIG5vIHZpYWJsZSBhbHQgaW4gdGhlIHN1YnJ1bGUpIGZvcgorICAgICAgICBpbnB1dCAnYyBjJyAodGhlcmUgYXJlIDMgdG9rZW5zKSBpczoKKworCQljb21tZW5jZQorCQlMVCgxKQorCQllbnRlclJ1bGUgYgorCQlsb2NhdGlvbiA3IDEKKwkJZW50ZXIgZGVjaXNpb24gMworCQlMVCgxKQorCQlleGl0IGRlY2lzaW9uIDMKKwkJZW50ZXJBbHQxCisJCWxvY2F0aW9uIDcgNQorCQlMVCgxKQorCQljb25zdW1lVG9rZW4gW2MvPDQ+LDE6MF0KKwkJbG9jYXRpb24gNyA3CisJCWVudGVyU3ViUnVsZSAyCisJCWVudGVyIGRlY2lzaW9uIDIKKwkJTFQoMSkKKwkJTFQoMSkKKwkJcmVjb2duaXRpb25FeGNlcHRpb24gTm9WaWFibGVBbHRFeGNlcHRpb24gMiAxIDIKKwkJZXhpdCBkZWNpc2lvbiAyCisJCWV4aXRTdWJSdWxlIDIKKwkJYmVnaW5SZXN5bmMKKwkJTFQoMSkKKwkJY29uc3VtZVRva2VuIFtjLzw0PiwxOjFdCisJCUxUKDEpCisJCWVuZFJlc3luYworCQlMVCgtMSkKKwkJZXhpdFJ1bGUgYgorCQl0ZXJtaW5hdGUKKwkiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgYmVnaW5SZXN5bmMoc2VsZik6CisJIiIiSW5kaWNhdGVzIHRoZSByZWNvZ25pemVyIGlzIGFib3V0IHRvIGNvbnN1bWUgdG9rZW5zIHRvIHJlc3luY2hyb25pemUKKyAgICAgICAgdGhlIHBhcnNlci4gIEFueSBjb25zdW1lIGV2ZW50cyBmcm9tIGhlcmUgdW50aWwgdGhlIHJlY292ZXJlZCBldmVudAorICAgICAgICBhcmUgbm90IHBhcnQgb2YgdGhlIHBhcnNlLS10aGV5IGFyZSBkZWFkIHRva2Vucy4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIGVuZFJlc3luYyhzZWxmKToKKwkiIiJJbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb2duaXplciBoYXMgZmluaXNoZWQgY29uc3VtaW5nIHRva2VucyBpbiBvcmRlcgorICAgICAgICB0byByZXN5Y2hyb25pemUuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXJzCisgICAgICAgIGJlZm9yZSB0aGUgcmVjb2duaXplciBjb21lcyBvdXQgb2YgZXJyb3JSZWNvdmVyeSBtb2RlIChpbiB3aGljaAorICAgICAgICBtdWx0aXBsZSBlcnJvcnMgYXJlIHN1cHByZXNzZWQpLiAgVGhpcyB3aWxsIGJlIHVzZWZ1bAorICAgICAgICBpbiBhIGd1aSB3aGVyZSB5b3Ugd2FudCB0byBwcm9iYWJseSBncmV5IG91dCB0b2tlbnMgdGhhdCBhcmUgY29uc3VtZWQKKyAgICAgICAgYnV0IG5vdCBtYXRjaGVkIHRvIGFueXRoaW5nIGluIGdyYW1tYXIuICBBbnl0aGluZyBiZXR3ZWVuCisgICAgICAgIGEgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXIgd2FzIHRvc3NlZCBvdXQgYnkgdGhlIHBhcnNlci4KKwkiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgc2VtYW50aWNQcmVkaWNhdGUoc2VsZiwgcmVzdWx0LCBwcmVkaWNhdGUpOgorCSIiIkEgc2VtYW50aWMgcHJlZGljYXRlIHdhcyBldmFsdWF0ZSB3aXRoIHRoaXMgcmVzdWx0IGFuZCBhY3Rpb24gdGV4dCIiIgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBjb21tZW5jZShzZWxmKToKKwkiIiJBbm5vdW5jZSB0aGF0IHBhcnNpbmcgaGFzIGJlZ3VuLiAgTm90IHRlY2huaWNhbGx5IHVzZWZ1bCBleGNlcHQgZm9yCisgICAgICAgIHNlbmRpbmcgZXZlbnRzIG92ZXIgYSBzb2NrZXQuICBBIEdVSSBmb3IgZXhhbXBsZSB3aWxsIGxhdW5jaCBhIHRocmVhZAorICAgICAgICB0byBjb25uZWN0IGFuZCBjb21tdW5pY2F0ZSB3aXRoIGEgcmVtb3RlIHBhcnNlci4gIFRoZSB0aHJlYWQgd2lsbCB3YW50CisgICAgICAgIHRvIG5vdGlmeSB0aGUgR1VJIHdoZW4gYSBjb25uZWN0aW9uIGlzIG1hZGUuICBBTlRMUiBwYXJzZXJzCisgICAgICAgIHRyaWdnZXIgdGhpcyB1cG9uIGVudHJ5IHRvIHRoZSBmaXJzdCBydWxlICh0aGUgcnVsZUxldmVsIGlzIHVzZWQgdG8KKyAgICAgICAgZmlndXJlIHRoaXMgb3V0KS4KKwkiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICAiIiJQYXJzaW5nIGlzIG92ZXI7IHN1Y2Nlc3NmdWxseSBvciBub3QuICBNb3N0bHkgdXNlZnVsIGZvciB0ZWxsaW5nCisgICAgICAgIHJlbW90ZSBkZWJ1Z2dpbmcgbGlzdGVuZXJzIHRoYXQgaXQncyB0aW1lIHRvIHF1aXQuICBXaGVuIHRoZSBydWxlCisgICAgICAgIGludm9jYXRpb24gbGV2ZWwgZ29lcyB0byB6ZXJvIGF0IHRoZSBlbmQgb2YgYSBydWxlLCB3ZSBhcmUgZG9uZQorICAgICAgICBwYXJzaW5nLgorCSIiIgorICAgICAgICBwYXNzCisKKworICAgICMjIFQgciBlIGUgIFAgYSByIHMgaSBuIGcKKworICAgIGRlZiBjb25zdW1lTm9kZShzZWxmLCB0KToKKyAgICAgICAgIiIiSW5wdXQgZm9yIGEgdHJlZSBwYXJzZXIgaXMgYW4gQVNULCBidXQgd2Uga25vdyBub3RoaW5nIGZvciBzdXJlCisgICAgICAgIGFib3V0IGEgbm9kZSBleGNlcHQgaXRzIHR5cGUgYW5kIHRleHQgKG9idGFpbmVkIGZyb20gdGhlIGFkYXB0b3IpLgorICAgICAgICBUaGlzIGlzIHRoZSBhbmFsb2cgb2YgdGhlIGNvbnN1bWVUb2tlbiBtZXRob2QuICBBZ2FpbiwgdGhlIElEIGlzCisgICAgICAgIHRoZSBoYXNoQ29kZSB1c3VhbGx5IG9mIHRoZSBub2RlIHNvIGl0IG9ubHkgd29ya3MgaWYgaGFzaENvZGUgaXMKKyAgICAgICAgbm90IGltcGxlbWVudGVkLiAgSWYgdGhlIHR5cGUgaXMgVVAgb3IgRE9XTiwgdGhlbgorICAgICAgICB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisgICAgICAgIGp1c3Qgb25lIFVQIG5vZGUgYW5kIG9uZSBET1dOIG5hdmlnYXRpb24gbm9kZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIExUKHNlbGYsIGksIHQpOgorCSIiIlRoZSB0cmVlIHBhcnNlciBsb29rZWRhaGVhZC4gIElmIHRoZSB0eXBlIGlzIFVQIG9yIERPV04sCisgICAgICAgIHRoZW4gdGhlIElEIGlzIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCBhcyBpdCdzIGZpeGVkLS10aGVyZSBpcworICAgICAgICBqdXN0IG9uZSBVUCBub2RlIGFuZCBvbmUgRE9XTiBuYXZpZ2F0aW9uIG5vZGUuCisJIiIiCisgICAgICAgIHBhc3MKKworCisKKyAgICAjIyBBIFMgVCAgRSB2IGUgbiB0IHMKKworICAgIGRlZiBuaWxOb2RlKHNlbGYsIHQpOgorCSIiIkEgbmlsIHdhcyBjcmVhdGVkIChldmVuIG5pbCBub2RlcyBoYXZlIGEgdW5pcXVlIElELi4uCisgICAgICAgIHRoZXkgYXJlIG5vdCAibnVsbCIgcGVyIHNlKS4gIEFzIG9mIDQvMjgvMjAwNiwgdGhpcworICAgICAgICBzZWVtcyB0byBiZSB1bmlxdWVseSB0cmlnZ2VyZWQgd2hlbiBzdGFydGluZyBhIG5ldyBzdWJ0cmVlCisgICAgICAgIHN1Y2ggYXMgd2hlbiBlbnRlcmluZyBhIHN1YnJ1bGUgaW4gYXV0b21hdGljIG1vZGUgYW5kIHdoZW4KKyAgICAgICAgYnVpbGRpbmcgYSB0cmVlIGluIHJld3JpdGUgbW9kZS4KKworICAgICAgICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgdC5JRCBpcyBzZXQuCisJIiIiCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIGVycm9yTm9kZShzZWxmLCB0KToKKwkiIiJVcG9uIHN5bnRheCBlcnJvciwgcmVjb2duaXplcnMgYnJhY2tldCB0aGUgZXJyb3Igd2l0aCBhbiBlcnJvciBub2RlCisgICAgICAgIGlmIHRoZXkgYXJlIGJ1aWxkaW5nIEFTVHMuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBjcmVhdGVOb2RlKHNlbGYsIG5vZGUsIHRva2VuPU5vbmUpOgorCSIiIkFubm91bmNlIGEgbmV3IG5vZGUgYnVpbHQgZnJvbSB0b2tlbiBlbGVtZW50cyBzdWNoIGFzIHR5cGUgZXRjLi4uCisKKyAgICAgICAgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAgICAgICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHQuSUQsIHR5cGUsIHRleHQgYXJlCisgICAgICAgIHNldC4KKwkiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgYmVjb21lUm9vdChzZWxmLCBuZXdSb290LCBvbGRSb290KToKKwkiIiJNYWtlIGEgbm9kZSB0aGUgbmV3IHJvb3Qgb2YgYW4gZXhpc3Rpbmcgcm9vdC4KKworICAgICAgICBOb3RlOiB0aGUgbmV3Um9vdElEIHBhcmFtZXRlciBpcyBwb3NzaWJseSBkaWZmZXJlbnQKKyAgICAgICAgdGhhbiB0aGUgVHJlZUFkYXB0b3IuYmVjb21lUm9vdCgpIG5ld1Jvb3QgcGFyYW1ldGVyLgorICAgICAgICBJbiBvdXIgY2FzZSwgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisgICAgICAgIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBhbmQgbm90IHJvb3RfbiBvciB3aGF0ZXZlci4KKworICAgICAgICBUaGUgbGlzdGVuZXIgc2hvdWxkIGFzc3VtZSB0aGF0IHRoaXMgZXZlbnQgb2NjdXJzCisgICAgICAgIG9ubHkgd2hlbiB0aGUgY3VycmVudCBzdWJydWxlIChvciBydWxlKSBzdWJ0cmVlIGlzCisgICAgICAgIGJlaW5nIHJlc2V0IHRvIG5ld1Jvb3RJRC4KKworICAgICAgICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgSURzIGFyZSBzZXQuCisKKyAgICAgICAgQHNlZSBhbnRscjMudHJlZS5UcmVlQWRhcHRvci5iZWNvbWVSb290KCkKKwkiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgYWRkQ2hpbGQoc2VsZiwgcm9vdCwgY2hpbGQpOgorCSIiIk1ha2UgY2hpbGRJRCBhIGNoaWxkIG9mIHJvb3RJRC4KKworICAgICAgICBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICAgICAgIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgSURzIGFyZSBzZXQuCisKKyAgICAgICAgQHNlZSBhbnRscjMudHJlZS5UcmVlQWRhcHRvci5hZGRDaGlsZCgpCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBzZXRUb2tlbkJvdW5kYXJpZXMoc2VsZiwgdCwgdG9rZW5TdGFydEluZGV4LCB0b2tlblN0b3BJbmRleCk6CisJIiIiU2V0IHRoZSB0b2tlbiBzdGFydC9zdG9wIHRva2VuIGluZGV4IGZvciBhIHN1YnRyZWUgcm9vdCBvciBub2RlLgorCisgICAgICAgIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKyAgICAgICAgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSB0LklEIGlzIHNldC4KKwkiIiIKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEJsYW5rRGVidWdFdmVudExpc3RlbmVyKERlYnVnRXZlbnRMaXN0ZW5lcik6CisgICAgIiIiQSBibGFuayBsaXN0ZW5lciB0aGF0IGRvZXMgbm90aGluZzsgdXNlZnVsIGZvciByZWFsIGNsYXNzZXMgc28KKyAgICB0aGV5IGRvbid0IGhhdmUgdG8gaGF2ZSBsb3RzIG9mIGJsYW5rIG1ldGhvZHMgYW5kIGFyZSBsZXNzCisgICAgc2Vuc2l0aXZlIHRvIHVwZGF0ZXMgdG8gZGVidWcgaW50ZXJmYWNlLgorCisgICAgTm90ZTogdGhpcyBjbGFzcyBpcyBpZGVudGljYWwgdG8gRGVidWdFdmVudExpc3RlbmVyIGFuZCBleGlzdHMgcHVyZWx5CisgICAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBKYXZhLgorICAgICIiIgorICAgIHBhc3MKKworCitjbGFzcyBUcmFjZURlYnVnRXZlbnRMaXN0ZW5lcihEZWJ1Z0V2ZW50TGlzdGVuZXIpOgorICAgICIiIkEgbGlzdGVuZXIgdGhhdCBzaW1wbHkgcmVjb3JkcyB0ZXh0IHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZXZlbnRzLgorCisgICAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIGRlYnVnZ2luZyBmYWNpbGl0eSA7KQorCisgICAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhlIHJlY29yZCgpIG1ldGhvZCAod2hpY2ggZGVmYXVsdHMgdG8gcHJpbnRpbmcgdG8KKyAgICBzdGRvdXQpIHRvIHJlY29yZCB0aGUgZXZlbnRzIGluIGEgZGlmZmVyZW50IHdheS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGFwdG9yPU5vbmUpOgorICAgICAgICBzdXBlcihUcmFjZURlYnVnRXZlbnRMaXN0ZW5lciwgc2VsZikuX19pbml0X18oKQorCisgICAgICAgIGlmIGFkYXB0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHNlbGYuYWRhcHRvciA9IGFkYXB0b3IKKworICAgIGRlZiByZWNvcmQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGV2ZW50ICsgJ1xuJykKKworICAgIGRlZiBlbnRlclJ1bGUoc2VsZiwgZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk6CisgICAgICAgIHNlbGYucmVjb3JkKCJlbnRlclJ1bGUgIitydWxlTmFtZSkKKworICAgIGRlZiBleGl0UnVsZShzZWxmLCBncmFtbWFyRmlsZU5hbWUsIHJ1bGVOYW1lKToKKyAgICAgICAgc2VsZi5yZWNvcmQoImV4aXRSdWxlICIrcnVsZU5hbWUpCisKKyAgICBkZWYgZW50ZXJTdWJSdWxlKHNlbGYsIGRlY2lzaW9uTnVtYmVyKToKKyAgICAgICAgc2VsZi5yZWNvcmQoImVudGVyU3ViUnVsZSIpCisKKyAgICBkZWYgZXhpdFN1YlJ1bGUoc2VsZiwgZGVjaXNpb25OdW1iZXIpOgorICAgICAgICBzZWxmLnJlY29yZCgiZXhpdFN1YlJ1bGUiKQorCisgICAgZGVmIGxvY2F0aW9uKHNlbGYsIGxpbmUsIHBvcyk6CisgICAgICAgIHNlbGYucmVjb3JkKCJsb2NhdGlvbiAlczolcyIgJSAobGluZSwgcG9zKSkKKworICAgICMjIFRyZWUgcGFyc2luZyBzdHVmZgorCisgICAgZGVmIGNvbnN1bWVOb2RlKHNlbGYsIHQpOgorICAgICAgICBzZWxmLnJlY29yZCgiY29uc3VtZU5vZGUgJXMgJXMgJXMiICUgKAorICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRVbmlxdWVJRCh0KSwKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VGV4dCh0KSwKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VHlwZSh0KSkpCisKKyAgICBkZWYgTFQoc2VsZiwgaSwgdCk6CisgICAgICAgIHNlbGYucmVjb3JkKCJMVCAlcyAlcyAlcyAlcyIgJSAoCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VW5pcXVlSUQodCksCisgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFRleHQodCksCisgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFR5cGUodCkpKQorCisKKyAgICAjIyBBU1Qgc3R1ZmYKKyAgICBkZWYgbmlsTm9kZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi5yZWNvcmQoIm5pbE5vZGUgJXMiICUgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKHQpKQorCisgICAgZGVmIGNyZWF0ZU5vZGUoc2VsZiwgdCwgdG9rZW49Tm9uZSk6CisgICAgICAgIGlmIHRva2VuIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlY29yZCgiY3JlYXRlICVzOiAlcywgJXMiICUgKAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VW5pcXVlSUQodCksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRUZXh0KHQpLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VHlwZSh0KSkpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVjb3JkKCJjcmVhdGUgJXM6ICVzIiAlICgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKHQpLAorICAgICAgICAgICAgICAgICAgICB0b2tlbi5nZXRUb2tlbkluZGV4KCkpKQorCisgICAgZGVmIGJlY29tZVJvb3Qoc2VsZiwgbmV3Um9vdCwgb2xkUm9vdCk6CisgICAgICAgIHNlbGYucmVjb3JkKCJiZWNvbWVSb290ICVzLCAlcyIgJSAoCisgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKG5ld1Jvb3QpLAorICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRVbmlxdWVJRChvbGRSb290KSkpCisKKyAgICBkZWYgYWRkQ2hpbGQoc2VsZiwgcm9vdCwgY2hpbGQpOgorICAgICAgICBzZWxmLnJlY29yZCgiYWRkQ2hpbGQgJXMsICVzIiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VW5pcXVlSUQocm9vdCksCisgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKGNoaWxkKSkpCisKKyAgICBkZWYgc2V0VG9rZW5Cb3VuZGFyaWVzKHNlbGYsIHQsIHRva2VuU3RhcnRJbmRleCwgdG9rZW5TdG9wSW5kZXgpOgorICAgICAgICBzZWxmLnJlY29yZCgic2V0VG9rZW5Cb3VuZGFyaWVzICVzLCAlcywgJXMiICUgKAorICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRVbmlxdWVJRCh0KSwKKyAgICAgICAgICAgICAgICB0b2tlblN0YXJ0SW5kZXgsIHRva2VuU3RvcEluZGV4KSkKKworCitjbGFzcyBSZWNvcmREZWJ1Z0V2ZW50TGlzdGVuZXIoVHJhY2VEZWJ1Z0V2ZW50TGlzdGVuZXIpOgorICAgICIiIkEgbGlzdGVuZXIgdGhhdCByZWNvcmRzIGV2ZW50cyBhcyBzdHJpbmdzIGluIGFuIGFycmF5LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkYXB0b3I9Tm9uZSk6CisgICAgICAgIHN1cGVyKFJlY29yZERlYnVnRXZlbnRMaXN0ZW5lciwgc2VsZikuX19pbml0X18oYWRhcHRvcikKKworICAgICAgICBzZWxmLmV2ZW50cyA9IFtdCisKKyAgICBkZWYgcmVjb3JkKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKGV2ZW50KQorCisKK2NsYXNzIERlYnVnRXZlbnRTb2NrZXRQcm94eShEZWJ1Z0V2ZW50TGlzdGVuZXIpOgorICAgICIiIkEgcHJveHkgZGVidWcgZXZlbnQgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBldmVudHMgb3ZlciBhIHNvY2tldCB0bworICAgIGEgZGVidWdnZXIgKG9yIGFueSBvdGhlciBsaXN0ZW5lcikgdXNpbmcgYSBzaW1wbGUgdGV4dC1iYXNlZCBwcm90b2NvbDsKKyAgICBvbmUgZXZlbnQgcGVyIGxpbmUuICBBTlRMUldvcmtzIGxpc3RlbnMgb24gc2VydmVyIHNvY2tldCB3aXRoIGEKKyAgICBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgaW5zdGFuY2UuICBUaGVzZSB0d28gb2JqZWN0cyBtdXN0IHRoZXJlZm9yZQorICAgIGJlIGtlcHQgaW4gc3luYy4gIE5ldyBldmVudHMgbXVzdCBiZSBoYW5kbGVkIG9uIGJvdGggc2lkZXMgb2Ygc29ja2V0LgorICAgICIiIgorCisgICAgREVGQVVMVF9ERUJVR0dFUl9QT1JUID0gNDkxMDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWNvZ25pemVyLCBhZGFwdG9yPU5vbmUsIHBvcnQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZGVidWc9Tm9uZSk6CisgICAgICAgIHN1cGVyKERlYnVnRXZlbnRTb2NrZXRQcm94eSwgc2VsZikuX19pbml0X18oKQorCisgICAgICAgIHNlbGYuZ3JhbW1hckZpbGVOYW1lID0gcmVjb2duaXplci5nZXRHcmFtbWFyRmlsZU5hbWUoKQorCisJIyBBbG1vc3QgY2VydGFpbmx5IHRoZSByZWNvZ25pemVyIHdpbGwgaGF2ZSBhZGFwdG9yIHNldCwgYnV0CisgICAgICAgICMgd2UgZG9uJ3Qga25vdyBob3cgdG8gY2FzdCBpdCAoUGFyc2VyIG9yIFRyZWVQYXJzZXIpIHRvIGdldAorICAgICAgICAjIHRoZSBhZGFwdG9yIGZpZWxkLiAgTXVzdCBiZSBzZXQgd2l0aCBhIGNvbnN0cnVjdG9yLiA6KAorICAgICAgICBzZWxmLmFkYXB0b3IgPSBhZGFwdG9yCisKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydCBvciBzZWxmLkRFRkFVTFRfREVCVUdHRVJfUE9SVAorCisgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZworCisgICAgICAgIHNlbGYuc29ja2V0ID0gTm9uZQorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBOb25lCisgICAgICAgIHNlbGYuaW5wdXQgPSBOb25lCisgICAgICAgIHNlbGYub3V0cHV0ID0gTm9uZQorCisKKyAgICBkZWYgbG9nKHNlbGYsIG1zZyk6CisgICAgICAgIGlmIHNlbGYuZGVidWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRlYnVnLndyaXRlKG1zZyArICdcbicpCisKKworICAgIGRlZiBoYW5kc2hha2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc29ja2V0IGlzIE5vbmU6CisgICAgICAgICAgICAjIGNyZWF0ZSBsaXN0ZW5pbmcgc29ja2V0CisgICAgICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgICAgICBzZWxmLnNvY2tldC5iaW5kKCgnJywgc2VsZi5wb3J0KSkKKyAgICAgICAgICAgIHNlbGYuc29ja2V0Lmxpc3RlbigxKQorICAgICAgICAgICAgc2VsZi5sb2coIldhaXRpbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gb24gcG9ydCAlZCIgJSBzZWxmLnBvcnQpCisKKyAgICAgICAgICAgICMgd2FpdCBmb3IgYW4gaW5jb21pbmcgY29ubmVjdGlvbgorICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLCBhZGRyID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgIHNlbGYubG9nKCJBY2NlcHRlZCBjb25uZWN0aW9uIGZyb20gJXM6JWQiICUgYWRkcikKKworICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLnNldGJsb2NraW5nKDEpCisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2V0c29ja29wdChzb2NrZXQuU09MX1RDUCwgc29ja2V0LlRDUF9OT0RFTEFZLCAxKQorCisgICAgICAgICAgICAjIEZJWE1FKHBpbmspOiB3cmFwIGludG8gdXRmOCBlbmNvZGluZyBzdHJlYW0KKyAgICAgICAgICAgIHNlbGYub3V0cHV0ID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCd3JywgMCkKKyAgICAgICAgICAgIHNlbGYuaW5wdXQgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3InLCAwKQorCisgICAgICAgICAgICBzZWxmLndyaXRlKCJBTlRMUiAlcyIgJSBzZWxmLlBST1RPQ09MX1ZFUlNJT04pCisgICAgICAgICAgICBzZWxmLndyaXRlKCJncmFtbWFyIFwiJXMiICUgc2VsZi5ncmFtbWFyRmlsZU5hbWUpCisgICAgICAgICAgICBzZWxmLmFjaygpCisKKworICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLmxvZygiPiAlcyIgJSBtc2cpCisgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCIlc1xuIiAlIG1zZykKKyAgICAgICAgc2VsZi5vdXRwdXQuZmx1c2goKQorCisKKyAgICBkZWYgYWNrKHNlbGYpOgorICAgICAgICB0ID0gc2VsZi5pbnB1dC5yZWFkbGluZSgpCisgICAgICAgIHNlbGYubG9nKCI8ICVzIiAlIHQucnN0cmlwKCkpCisKKworICAgIGRlZiB0cmFuc21pdChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYud3JpdGUoZXZlbnQpOworICAgICAgICBzZWxmLmFjaygpOworCisKKyAgICBkZWYgY29tbWVuY2Uoc2VsZik6CisgICAgICAgICMgZG9uJ3QgYm90aGVyIHNlbmRpbmcgZXZlbnQ7IGxpc3RlbmVyIHdpbGwgdHJpZ2dlciB1cG9uIGNvbm5lY3Rpb24KKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJ0ZXJtaW5hdGUiKQorICAgICAgICBzZWxmLm91dHB1dC5jbG9zZSgpCisgICAgICAgIHNlbGYuaW5wdXQuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY2xvc2UoKQorICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCisKKworICAgIGRlZiBlbnRlclJ1bGUoc2VsZiwgZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSk6CisgICAgICAgIHNlbGYudHJhbnNtaXQoImVudGVyUnVsZVx0JXNcdCVzIiAlIChncmFtbWFyRmlsZU5hbWUsIHJ1bGVOYW1lKSkKKworCisgICAgZGVmIGVudGVyQWx0KHNlbGYsIGFsdCk6CisgICAgICAgIHNlbGYudHJhbnNtaXQoImVudGVyQWx0XHQlZCIgJSBhbHQpCisKKworICAgIGRlZiBleGl0UnVsZShzZWxmLCBncmFtbWFyRmlsZU5hbWUsIHJ1bGVOYW1lKToKKyAgICAgICAgc2VsZi50cmFuc21pdCgiZXhpdFJ1bGVcdCVzXHQlcyIgJSAoZ3JhbW1hckZpbGVOYW1lLCBydWxlTmFtZSkpCisKKworICAgIGRlZiBlbnRlclN1YlJ1bGUoc2VsZiwgZGVjaXNpb25OdW1iZXIpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJlbnRlclN1YlJ1bGVcdCVkIiAlIGRlY2lzaW9uTnVtYmVyKQorCisKKyAgICBkZWYgZXhpdFN1YlJ1bGUoc2VsZiwgZGVjaXNpb25OdW1iZXIpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJleGl0U3ViUnVsZVx0JWQiICUgZGVjaXNpb25OdW1iZXIpCisKKworICAgIGRlZiBlbnRlckRlY2lzaW9uKHNlbGYsIGRlY2lzaW9uTnVtYmVyLCBjb3VsZEJhY2t0cmFjayk6CisgICAgICAgIHNlbGYudHJhbnNtaXQoCisgICAgICAgICAgICAiZW50ZXJEZWNpc2lvblx0JWRcdCVkIiAlIChkZWNpc2lvbk51bWJlciwgY291bGRCYWNrdHJhY2spKQorCisKKyAgICBkZWYgZXhpdERlY2lzaW9uKHNlbGYsIGRlY2lzaW9uTnVtYmVyKToKKyAgICAgICAgc2VsZi50cmFuc21pdCgiZXhpdERlY2lzaW9uXHQlZCIgJSBkZWNpc2lvbk51bWJlcikKKworCisgICAgZGVmIGNvbnN1bWVUb2tlbihzZWxmLCB0KToKKyAgICAgICAgc2VsZi50cmFuc21pdCgiY29uc3VtZVRva2VuXHQlcyIgJSBzZWxmLnNlcmlhbGl6ZVRva2VuKHQpKQorCisKKyAgICBkZWYgY29uc3VtZUhpZGRlblRva2VuKHNlbGYsIHQpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJjb25zdW1lSGlkZGVuVG9rZW5cdCVzIiAlIHNlbGYuc2VyaWFsaXplVG9rZW4odCkpCisKKworICAgIGRlZiBMVChzZWxmLCBpLCBvKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvLCBUcmVlKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkxUX3RyZWUoaSwgbykKKyAgICAgICAgcmV0dXJuIHNlbGYuTFRfdG9rZW4oaSwgbykKKworCisgICAgZGVmIExUX3Rva2VuKHNlbGYsIGksIHQpOgorICAgICAgICBpZiB0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50cmFuc21pdCgiTFRcdCVkXHQlcyIgJSAoaSwgc2VsZi5zZXJpYWxpemVUb2tlbih0KSkpCisKKworICAgIGRlZiBtYXJrKHNlbGYsIGkpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJtYXJrXHQlZCIgJSBpKQorCisKKyAgICBkZWYgcmV3aW5kKHNlbGYsIGk9Tm9uZSk6CisgICAgICAgIGlmIGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRyYW5zbWl0KCJyZXdpbmRcdCVkIiAlIGkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRyYW5zbWl0KCJyZXdpbmQiKQorCisKKyAgICBkZWYgYmVnaW5CYWNrdHJhY2soc2VsZiwgbGV2ZWwpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJiZWdpbkJhY2t0cmFja1x0JWQiICUgbGV2ZWwpCisKKworICAgIGRlZiBlbmRCYWNrdHJhY2soc2VsZiwgbGV2ZWwsIHN1Y2Nlc3NmdWwpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJlbmRCYWNrdHJhY2tcdCVkXHQlcyIgJSAoCisgICAgICAgICAgICAgICAgbGV2ZWwsIFsnMCcsICcxJ11bYm9vbChzdWNjZXNzZnVsKV0pKQorCisKKyAgICBkZWYgbG9jYXRpb24oc2VsZiwgbGluZSwgcG9zKToKKyAgICAgICAgc2VsZi50cmFuc21pdCgibG9jYXRpb25cdCVkXHQlZCIgJSAobGluZSwgcG9zKSkKKworCisgICAgZGVmIHJlY29nbml0aW9uRXhjZXB0aW9uKHNlbGYsIGV4Yyk6CisgICAgICAgIHNlbGYudHJhbnNtaXQoJ1x0Jy5qb2luKFsKKyAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgIHN0cihpbnQoZXhjLmluZGV4KSksCisgICAgICAgICAgICAgICAgICAgIHN0cihpbnQoZXhjLmxpbmUpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyKGludChleGMuY2hhclBvc2l0aW9uSW5MaW5lKSldKSkKKworCisgICAgZGVmIGJlZ2luUmVzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJiZWdpblJlc3luYyIpCisKKworICAgIGRlZiBlbmRSZXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNtaXQoImVuZFJlc3luYyIpCisKKworICAgIGRlZiBzZW1hbnRpY1ByZWRpY2F0ZShzZWxmLCByZXN1bHQsIHByZWRpY2F0ZSk6CisgICAgICAgIHNlbGYudHJhbnNtaXQoJ1x0Jy5qb2luKFsKKyAgICAgICAgICAgICAgICAgICAgInNlbWFudGljUHJlZGljYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyKGludChyZXN1bHQpKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lc2NhcGVOZXdsaW5lcyhwcmVkaWNhdGUpXSkpCisKKyAgICAjIyBBIFMgVCAgUCBhIHIgcyBpIG4gZyAgRSB2IGUgbiB0IHMKKworICAgIGRlZiBjb25zdW1lTm9kZShzZWxmLCB0KToKKyAgICAgICAgRklYTUUoMzEpCisjICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoNTApOworIyAgICAgICAgIGJ1Zi5hcHBlbmQoImNvbnN1bWVOb2RlIik7CisjICAgICAgICAgc2VyaWFsaXplTm9kZShidWYsIHQpOworIyAgICAgICAgIHRyYW5zbWl0KGJ1Zi50b1N0cmluZygpKTsKKworCisgICAgZGVmIExUX3RyZWUoc2VsZiwgaSwgdCk6CisgICAgICAgIEZJWE1FKDM0KQorIyAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuZ2V0VW5pcXVlSUQodCk7CisjICAgICAgICAgU3RyaW5nIHRleHQgPSBhZGFwdG9yLmdldFRleHQodCk7CisjICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLmdldFR5cGUodCk7CisjICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoNTApOworIyAgICAgICAgIGJ1Zi5hcHBlbmQoIkxOXHQiKTsgLy8gbG9va2FoZWFkIG5vZGU7IGRpc3Rpbmd1aXNoIGZyb20gTFQgaW4gcHJvdG9jb2wKKyMgICAgICAgICBidWYuYXBwZW5kKGkpOworIyAgICAgICAgIHNlcmlhbGl6ZU5vZGUoYnVmLCB0KTsKKyMgICAgICAgICB0cmFuc21pdChidWYudG9TdHJpbmcoKSk7CisKKworICAgIGRlZiBzZXJpYWxpemVOb2RlKHNlbGYsIGJ1ZiwgdCk6CisgICAgICAgIEZJWE1FKDMzKQorIyAgICAgICAgIGludCBJRCA9IGFkYXB0b3IuZ2V0VW5pcXVlSUQodCk7CisjICAgICAgICAgU3RyaW5nIHRleHQgPSBhZGFwdG9yLmdldFRleHQodCk7CisjICAgICAgICAgaW50IHR5cGUgPSBhZGFwdG9yLmdldFR5cGUodCk7CisjICAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsKKyMgICAgICAgICBidWYuYXBwZW5kKElEKTsKKyMgICAgICAgICBidWYuYXBwZW5kKCJcdCIpOworIyAgICAgICAgIGJ1Zi5hcHBlbmQodHlwZSk7CisjICAgICAgICAgVG9rZW4gdG9rZW4gPSBhZGFwdG9yLmdldFRva2VuKHQpOworIyAgICAgICAgIGludCBsaW5lID0gLTE7CisjICAgICAgICAgaW50IHBvcyA9IC0xOworIyAgICAgICAgIGlmICggdG9rZW4hPW51bGwgKSB7CisjICAgICAgICAgICAgIGxpbmUgPSB0b2tlbi5nZXRMaW5lKCk7CisjICAgICAgICAgICAgIHBvcyA9IHRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworIyAgICAgICAgICAgICB9CisjICAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsKKyMgICAgICAgICBidWYuYXBwZW5kKGxpbmUpOworIyAgICAgICAgIGJ1Zi5hcHBlbmQoIlx0Iik7CisjICAgICAgICAgYnVmLmFwcGVuZChwb3MpOworIyAgICAgICAgIGludCB0b2tlbkluZGV4ID0gYWRhcHRvci5nZXRUb2tlblN0YXJ0SW5kZXgodCk7CisjICAgICAgICAgYnVmLmFwcGVuZCgiXHQiKTsKKyMgICAgICAgICBidWYuYXBwZW5kKHRva2VuSW5kZXgpOworIyAgICAgICAgIHNlcmlhbGl6ZVRleHQoYnVmLCB0ZXh0KTsKKworCisgICAgIyMgQSBTIFQgIEUgdiBlIG4gdCBzCisKKyAgICBkZWYgbmlsTm9kZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi50cmFuc21pdCgibmlsTm9kZVx0JWQiICUgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKHQpKQorCisKKyAgICBkZWYgZXJyb3JOb2RlKHNlbGYsIHQpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJlcnJvck5vZGVcdCVkXHQlZFx0XCIlcyIgJSAoCisgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKHQpLAorICAgICAgICAgICAgIFRva2VuLklOVkFMSURfVE9LRU5fVFlQRSwKKyAgICAgICAgICAgICBzZWxmLmVzY2FwZU5ld2xpbmVzKHQudG9TdHJpbmcoKSkpKQorCisKKworICAgIGRlZiBjcmVhdGVOb2RlKHNlbGYsIG5vZGUsIHRva2VuPU5vbmUpOgorICAgICAgICBpZiB0b2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudHJhbnNtaXQoImNyZWF0ZU5vZGVcdCVkXHQlZCIgJSAoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRVbmlxdWVJRChub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0VG9rZW5JbmRleCgpKSkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50cmFuc21pdCgiY3JlYXRlTm9kZUZyb21Ub2tlbkVsZW1lbnRzXHQlZFx0JWRcdFwiJXMiICUgKAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VW5pcXVlSUQobm9kZSksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRUeXBlKG5vZGUpLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VGV4dChub2RlKSkpCisKKworICAgIGRlZiBiZWNvbWVSb290KHNlbGYsIG5ld1Jvb3QsIG9sZFJvb3QpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJiZWNvbWVSb290XHQlZFx0JWQiICUgKAorICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5nZXRVbmlxdWVJRChuZXdSb290KSwKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VW5pcXVlSUQob2xkUm9vdCkpKQorCisKKyAgICBkZWYgYWRkQ2hpbGQoc2VsZiwgcm9vdCwgY2hpbGQpOgorICAgICAgICBzZWxmLnRyYW5zbWl0KCJhZGRDaGlsZFx0JWRcdCVkIiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuZ2V0VW5pcXVlSUQocm9vdCksCisgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKGNoaWxkKSkpCisKKworICAgIGRlZiBzZXRUb2tlbkJvdW5kYXJpZXMoc2VsZiwgdCwgdG9rZW5TdGFydEluZGV4LCB0b2tlblN0b3BJbmRleCk6CisgICAgICAgIHNlbGYudHJhbnNtaXQoInNldFRva2VuQm91bmRhcmllc1x0JWRcdCVkXHQlZCIgJSAoCisgICAgICAgICAgICAgICAgc2VsZi5hZGFwdG9yLmdldFVuaXF1ZUlEKHQpLAorICAgICAgICAgICAgICAgIHRva2VuU3RhcnRJbmRleCwgdG9rZW5TdG9wSW5kZXgpKQorCisKKworICAgICMjIHN1cHBvcnQKKworICAgIGRlZiBzZXRUcmVlQWRhcHRvcihzZWxmLCBhZGFwdG9yKToKKyAgICAgICAgc2VsZi5hZGFwdG9yID0gYWRhcHRvcgorCisgICAgZGVmIGdldFRyZWVBZGFwdG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yCisKKworICAgIGRlZiBzZXJpYWxpemVUb2tlbihzZWxmLCB0KToKKyAgICAgICAgYnVmID0gW3N0cihpbnQodC5nZXRUb2tlbkluZGV4KCkpKSwKKyAgICAgICAgICAgICAgIHN0cihpbnQodC5nZXRUeXBlKCkpKSwKKyAgICAgICAgICAgICAgIHN0cihpbnQodC5nZXRDaGFubmVsKCkpKSwKKyAgICAgICAgICAgICAgIHN0cihpbnQodC5nZXRMaW5lKCkgb3IgMCkpLAorICAgICAgICAgICAgICAgc3RyKGludCh0LmdldENoYXJQb3NpdGlvbkluTGluZSgpIG9yIDApKSwKKyAgICAgICAgICAgICAgICdcIicgKyBzZWxmLmVzY2FwZU5ld2xpbmVzKHQuZ2V0VGV4dCgpKV0KKyAgICAgICAgcmV0dXJuICdcdCcuam9pbihidWYpCisKKworICAgIGRlZiBlc2NhcGVOZXdsaW5lcyhzZWxmLCB0eHQpOgorICAgICAgICBpZiB0eHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJworCisgICAgICAgIHR4dCA9IHR4dC5yZXBsYWNlKCIlIiwiJTI1IikgICAjIGVzY2FwZSBhbGwgZXNjYXBlIGNoYXIgOykKKyAgICAgICAgdHh0ID0gdHh0LnJlcGxhY2UoIlxuIiwiJTBBIikgICMgZXNjYXBlIFxuCisgICAgICAgIHR4dCA9IHR4dC5yZXBsYWNlKCJcciIsIiUwRCIpICAjIGVzY2FwZSBccgorICAgICAgICByZXR1cm4gdHh0CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2RmYS5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvZGZhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTM3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2RmYS5weQpAQCAtMCwwICsxLDIxMyBAQAorIiIiQU5UTFIzIHJ1bnRpbWUgcGFja2FnZSIiIgorCisjIGJlZ2luW2xpY2VuY2VdCisjCisjIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworIyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBlbmRbbGljZW5zY10KKworZnJvbSBhbnRscjMuY29uc3RhbnRzIGltcG9ydCBFT0YKK2Zyb20gYW50bHIzLmV4Y2VwdGlvbnMgaW1wb3J0IE5vVmlhYmxlQWx0RXhjZXB0aW9uLCBCYWNrdHJhY2tpbmdGYWlsZWQKKworCitjbGFzcyBERkEob2JqZWN0KToKKyAgICAiIiJAYnJpZWYgQSBERkEgaW1wbGVtZW50ZWQgYXMgYSBzZXQgb2YgdHJhbnNpdGlvbiB0YWJsZXMuCisKKyAgICBBbnkgc3RhdGUgdGhhdCBoYXMgYSBzZW1hbnRpYyBwcmVkaWNhdGUgZWRnZSBpcyBzcGVjaWFsOyB0aG9zZSBzdGF0ZXMKKyAgICBhcmUgZ2VuZXJhdGVkIHdpdGggaWYtdGhlbi1lbHNlIHN0cnVjdHVyZXMgaW4gYSBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKCkKKyAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgY3ljbGljREZBIHRlbXBsYXRlLgorICAgIAorICAgICIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXygKKyAgICAgICAgc2VsZiwKKyAgICAgICAgcmVjb2duaXplciwgZGVjaXNpb25OdW1iZXIsCisgICAgICAgIGVvdCwgZW9mLCBtaW4sIG1heCwgYWNjZXB0LCBzcGVjaWFsLCB0cmFuc2l0aW9uCisgICAgICAgICk6CisgICAgICAgICMjIFdoaWNoIHJlY29nbml6ZXIgZW5jbG9zZXMgdGhpcyBERkE/ICBOZWVkZWQgdG8gY2hlY2sgYmFja3RyYWNraW5nCisgICAgICAgIHNlbGYucmVjb2duaXplciA9IHJlY29nbml6ZXIKKworICAgICAgICBzZWxmLmRlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXIKKyAgICAgICAgc2VsZi5lb3QgPSBlb3QKKyAgICAgICAgc2VsZi5lb2YgPSBlb2YKKyAgICAgICAgc2VsZi5taW4gPSBtaW4KKyAgICAgICAgc2VsZi5tYXggPSBtYXgKKyAgICAgICAgc2VsZi5hY2NlcHQgPSBhY2NlcHQKKyAgICAgICAgc2VsZi5zcGVjaWFsID0gc3BlY2lhbAorICAgICAgICBzZWxmLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uCisKKworICAgIGRlZiBwcmVkaWN0KHNlbGYsIGlucHV0KToKKyAgICAgICAgIiIiCisgICAgICAgIEZyb20gdGhlIGlucHV0IHN0cmVhbSwgcHJlZGljdCB3aGF0IGFsdGVybmF0aXZlIHdpbGwgc3VjY2VlZAorCXVzaW5nIHRoaXMgREZBIChyZXByZXNlbnRpbmcgdGhlIGNvdmVyaW5nIHJlZ3VsYXIgYXBwcm94aW1hdGlvbgorCXRvIHRoZSB1bmRlcmx5aW5nIENGTCkuICBSZXR1cm4gYW4gYWx0ZXJuYXRpdmUgbnVtYmVyIDEuLm4uICBUaHJvdworCSBhbiBleGNlcHRpb24gdXBvbiBlcnJvci4KKwkiIiIKKyAgICAgICAgbWFyayA9IGlucHV0Lm1hcmsoKQorICAgICAgICBzID0gMCAjIHdlIGFsd2F5cyBzdGFydCBhdCBzMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgXyBpbiB4cmFuZ2UoNTAwMDApOgorICAgICAgICAgICAgICAgICNwcmludCAiKioqQ3VycmVudCBzdGF0ZSA9ICVkIiAlIHMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzcGVjaWFsU3RhdGUgPSBzZWxmLnNwZWNpYWxbc10KKyAgICAgICAgICAgICAgICBpZiBzcGVjaWFsU3RhdGUgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJpcyBzcGVjaWFsIgorICAgICAgICAgICAgICAgICAgICBzID0gc2VsZi5zcGVjaWFsU3RhdGVUcmFuc2l0aW9uKHNwZWNpYWxTdGF0ZSwgaW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGlmIHMgPT0gLTE6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vVmlhYmxlQWx0KHMsIGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFjY2VwdFtzXSA+PSAxOgorICAgICAgICAgICAgICAgICAgICAjcHJpbnQgImFjY2VwdCBzdGF0ZSBmb3IgYWx0ICVkIiAlIHNlbGYuYWNjZXB0W3NdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmFjY2VwdFtzXQorCisgICAgICAgICAgICAgICAgIyBsb29rIGZvciBhIG5vcm1hbCBjaGFyIHRyYW5zaXRpb24KKyAgICAgICAgICAgICAgICBjID0gaW5wdXQuTEEoMSkKKworICAgICAgICAgICAgICAgICNwcmludCAiTEEgPSAlZCAoJXIpIiAlIChjLCB1bmljaHIoYykgaWYgYyA+PSAwIGVsc2UgJ0VPRicpCisgICAgICAgICAgICAgICAgI3ByaW50ICJyYW5nZSA9ICVkLi4lZCIgJSAoc2VsZi5taW5bc10sIHNlbGYubWF4W3NdKQorCisgICAgICAgICAgICAgICAgaWYgYyA+PSBzZWxmLm1pbltzXSBhbmQgYyA8PSBzZWxmLm1heFtzXToKKyAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRvIG5leHQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc25leHQgPSBzZWxmLnRyYW5zaXRpb25bc11bYy1zZWxmLm1pbltzXV0KKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJpbiByYW5nZSwgbmV4dCBzdGF0ZSA9ICVkIiAlIHNuZXh0CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiBzbmV4dCA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgIm5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgIyB3YXMgaW4gcmFuZ2UgYnV0IG5vdCBhIG5vcm1hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAjIG11c3QgY2hlY2sgRU9ULCB3aGljaCBpcyBsaWtlIHRoZSBlbHNlIGNsYXVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgZW90W3NdPj0wIGluZGljYXRlcyB0aGF0IGFuIEVPVCBlZGdlIGdvZXMgdG8gYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW90W3NdID49IDA6ICMgRU9UIFRyYW5zaXRpb24gdG8gYWNjZXB0IHN0YXRlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCAiRU9UIHRyYW5zIHRvIGFjY2VwdCBzdGF0ZSAlZCIgJSBzZWxmLmVvdFtzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzZWxmLmVvdFtzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETzogSSBoYWQgdGhpcyBhcyByZXR1cm4gYWNjZXB0W2VvdFtzXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoaWNoIGFzc3VtZWQgaGVyZSB0aGF0IHRoZSBFT1QgZWRnZSBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlbnQgdG8gYW4gYWNjZXB0Li4uZmFzdGVyIHRvIGRvIHRoaXMsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hhdCBhYm91dCBwcmVkaWNhdGVkIGVkZ2VzIGNvbWluZyBmcm9tIEVPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFyZ2V0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCAibm8gdmlhYmxlIGFsdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9WaWFibGVBbHQocywgaW5wdXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgICAgICAgICAgICAgIHMgPSBzbmV4dAorICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuZW90W3NdID49IDA6CisgICAgICAgICAgICAgICAgICAgICNwcmludCAiRU9UIHRvICVkIiAlIHNlbGYuZW90W3NdCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzID0gc2VsZi5lb3Rbc10KKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIEVPRiBUcmFuc2l0aW9uIHRvIGFjY2VwdCBzdGF0ZT8KKyAgICAgICAgICAgICAgICBpZiBjID09IEVPRiBhbmQgc2VsZi5lb2Zbc10gPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJFT0YgVHJhbnNpdGlvbiB0byBhY2NlcHQgc3RhdGUgJWQiIFwKKyAgICAgICAgICAgICAgICAgICAgIyAgJSBzZWxmLmFjY2VwdFtzZWxmLmVvZltzXV0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWNjZXB0W3NlbGYuZW9mW3NdXQorCisgICAgICAgICAgICAgICAgIyBub3QgaW4gcmFuZ2UgYW5kIG5vdCBFT0YvRU9ULCBtdXN0IGJlIGludmFsaWQgc3ltYm9sCisgICAgICAgICAgICAgICAgc2VsZi5ub1ZpYWJsZUFsdChzLCBpbnB1dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiREZBIGJhbmchIikKKyAgICAgICAgICAgIAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5wdXQucmV3aW5kKG1hcmspCisKKworICAgIGRlZiBub1ZpYWJsZUFsdChzZWxmLCBzLCBpbnB1dCk6CisgICAgICAgIGlmIHNlbGYucmVjb2duaXplci5fc3RhdGUuYmFja3RyYWNraW5nID4gMDoKKyAgICAgICAgICAgIHJhaXNlIEJhY2t0cmFja2luZ0ZhaWxlZAorCisgICAgICAgIG52YWUgPSBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigKKyAgICAgICAgICAgIHNlbGYuZ2V0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgIHNlbGYuZGVjaXNpb25OdW1iZXIsCisgICAgICAgICAgICBzLAorICAgICAgICAgICAgaW5wdXQKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmVycm9yKG52YWUpCisgICAgICAgIHJhaXNlIG52YWUKKworCisgICAgZGVmIGVycm9yKHNlbGYsIG52YWUpOgorICAgICAgICAiIiJBIGhvb2sgZm9yIGRlYnVnZ2luZyBpbnRlcmZhY2UiIiIKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihzZWxmLCBzLCBpbnB1dCk6CisgICAgICAgIHJldHVybiAtMQorCisKKyAgICBkZWYgZ2V0RGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiAibi9hIgorCisKKyMjICAgICBkZWYgc3BlY2lhbFRyYW5zaXRpb24oc2VsZiwgc3RhdGUsIHN5bWJvbCk6CisjIyAgICAgICAgIHJldHVybiAwCisKKworICAgIGRlZiB1bnBhY2soY2xzLCBzdHJpbmcpOgorICAgICAgICAiIiJAYnJpZWYgVW5wYWNrIHRoZSBydW5sZW5ndGggZW5jb2RlZCB0YWJsZSBkYXRhLgorCisgICAgICAgIFRlcmVuY2UgaW1wbGVtZW50ZWQgcGFja2VkIHRhYmxlIGluaXRpYWxpemVycywgYmVjYXVzZSBKYXZhIGhhcyBhCisgICAgICAgIHNpemUgcmVzdHJpY3Rpb24gb24gLmNsYXNzIGZpbGVzIGFuZCB0aGUgbG9va3VwIHRhYmxlcyBjYW4gZ3JvdworICAgICAgICBwcmV0dHkgbGFyZ2UuIFRoZSBnZW5lcmF0ZWQgSmF2YUxleGVyLmphdmEgb2YgdGhlIEphdmEuZyBleGFtcGxlCisgICAgICAgIHdvdWxkIGJlIGFib3V0IDE1TUIgd2l0aCB1bmNvbXByZXNzZWQgYXJyYXkgaW5pdGlhbGl6ZXJzLgorCisgICAgICAgIFB5dGhvbiBkb2VzIG5vdCBoYXZlIGFueSBzaXplIHJlc3RyaWN0aW9ucywgYnV0IHRoZSBjb21waWxhdGlvbiBvZgorICAgICAgICBzdWNoIGxhcmdlIHNvdXJjZSBmaWxlcyBzZWVtcyB0byBiZSBwcmV0dHkgbWVtb3J5IGh1bmdyeS4gVGhlIG1lbW9yeQorICAgICAgICBjb25zdW1wdGlvbiBvZiB0aGUgcHl0aG9uIHByb2Nlc3MgZ3JldyB0byA+MS41R0Igd2hlbiBpbXBvcnRpbmcgYQorICAgICAgICAxNU1CIGxleGVyLCBlYXRpbmcgYWxsIG15IHN3YXAgc3BhY2UgYW5kIEkgd2FzIHRvIGltcGFjaWVudCB0byBzZWUsCisgICAgICAgIGlmIGl0IGNvdWxkIGZpbmlzaCBhdCBhbGwuIFdpdGggcGFja2VkIGluaXRpYWxpemVycyB0aGF0IGFyZSB1bnBhY2tlZAorICAgICAgICBhdCBpbXBvcnQgdGltZSBvZiB0aGUgbGV4ZXIgbW9kdWxlLCBldmVyeXRoaW5nIHdvcmtzIGxpa2UgYSBjaGFybS4KKyAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICAKKyAgICAgICAgcmV0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHN0cmluZykgLyAyKToKKyAgICAgICAgICAgIChuLCB2KSA9IG9yZChzdHJpbmdbaSoyXSksIG9yZChzdHJpbmdbaSoyKzFdKQorCisgICAgICAgICAgICAjIElzIHRoZXJlIGEgYml0d2lzZSBvcGVyYXRpb24gdG8gZG8gdGhpcz8KKyAgICAgICAgICAgIGlmIHYgPT0gMHhGRkZGOgorICAgICAgICAgICAgICAgIHYgPSAtMQorCisgICAgICAgICAgICByZXQgKz0gW3ZdICogbgorCisgICAgICAgIHJldHVybiByZXQKKyAgICAKKyAgICB1bnBhY2sgPSBjbGFzc21ldGhvZCh1bnBhY2spCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2RvdHRyZWVnZW4ucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2RvdHRyZWVnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3ZDRlYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvZG90dHJlZWdlbi5weQpAQCAtMCwwICsxLDIxMCBAQAorIiIiIEBwYWNrYWdlIGFudGxyMy5kb3R0cmVlZ2VuZXJhdG9yCitAYnJpZWYgQU5UTFIzIHJ1bnRpbWUgcGFja2FnZSwgdHJlZSBtb2R1bGUKKworVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHN1cHBvcnQgY2xhc3NlcyBmb3IgQVNUIGNvbnN0cnVjdGlvbiBhbmQgdHJlZSBwYXJzZXJzLgorCisiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKKyMgbG90J3Mgb2YgZG9jc3RyaW5ncyBhcmUgbWlzc2luZywgZG9uJ3QgY29tcGxhaW4gZm9yIG5vdy4uLgorIyBweWxpbnQ6IGRpc2FibGUtbXNnPUMwMTExCisKK2Zyb20gYW50bHIzLnRyZWUgaW1wb3J0IENvbW1vblRyZWVBZGFwdG9yCitpbXBvcnQgc3RyaW5ndGVtcGxhdGUzCisKK2NsYXNzIERPVFRyZWVHZW5lcmF0b3Iob2JqZWN0KToKKyAgICAiIiIKKyAgICBBIHV0aWxpdHkgY2xhc3MgdG8gZ2VuZXJhdGUgRE9UIGRpYWdyYW1zIChncmFwaHZpeikgZnJvbQorICAgIGFyYml0cmFyeSB0cmVlcy4gIFlvdSBjYW4gcGFzcyBpbiB5b3VyIG93biB0ZW1wbGF0ZXMgYW5kCisgICAgY2FuIHBhc3MgaW4gYW55IGtpbmQgb2YgdHJlZSBvciB1c2UgVHJlZSBpbnRlcmZhY2UgbWV0aG9kLgorICAgICIiIgorCisgICAgX3RyZWVTVCA9IHN0cmluZ3RlbXBsYXRlMy5TdHJpbmdUZW1wbGF0ZSgKKyAgICAgICAgdGVtcGxhdGU9KAorICAgICAgICAiZGlncmFwaCB7XG4iICsKKyAgICAgICAgIiAgb3JkZXJpbmc9b3V0O1xuIiArCisgICAgICAgICIgIHJhbmtzZXA9LjQ7XG4iICsKKyAgICAgICAgIiAgbm9kZSBbc2hhcGU9cGxhaW50ZXh0LCBmaXhlZHNpemU9dHJ1ZSwgZm9udHNpemU9MTEsIGZvbnRuYW1lPVwiQ291cmllclwiLFxuIiArCisgICAgICAgICIgICAgICAgIHdpZHRoPS4yNSwgaGVpZ2h0PS4yNV07XG4iICsKKyAgICAgICAgIiAgZWRnZSBbYXJyb3dzaXplPS41XVxuIiArCisgICAgICAgICIgICRub2RlcyRcbiIgKworICAgICAgICAiICAkZWRnZXMkXG4iICsKKyAgICAgICAgIn1cbiIpCisgICAgICAgICkKKworICAgIF9ub2RlU1QgPSBzdHJpbmd0ZW1wbGF0ZTMuU3RyaW5nVGVtcGxhdGUoCisgICAgICAgIHRlbXBsYXRlPSIkbmFtZSQgW2xhYmVsPVwiJHRleHQkXCJdO1xuIgorICAgICAgICApCisKKyAgICBfZWRnZVNUID0gc3RyaW5ndGVtcGxhdGUzLlN0cmluZ1RlbXBsYXRlKAorICAgICAgICB0ZW1wbGF0ZT0iJHBhcmVudCQgLT4gJGNoaWxkJCAvLyBcIiRwYXJlbnRUZXh0JFwiIC0+IFwiJGNoaWxkVGV4dCRcIlxuIgorICAgICAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMjIFRyYWNrIG5vZGUgdG8gbnVtYmVyIG1hcHBpbmcgc28gd2UgY2FuIGdldCBwcm9wZXIgbm9kZSBuYW1lIGJhY2sKKyAgICAgICAgc2VsZi5ub2RlVG9OdW1iZXJNYXAgPSB7fQorCisgICAgICAgICMjIFRyYWNrIG5vZGUgbnVtYmVyIHNvIHdlIGNhbiBnZXQgdW5pcXVlIG5vZGUgbmFtZXMKKyAgICAgICAgc2VsZi5ub2RlTnVtYmVyID0gMAorCisKKyAgICBkZWYgdG9ET1Qoc2VsZiwgdHJlZSwgYWRhcHRvcj1Ob25lLCB0cmVlU1Q9X3RyZWVTVCwgZWRnZVNUPV9lZGdlU1QpOgorICAgICAgICBpZiBhZGFwdG9yIGlzIE5vbmU6CisgICAgICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorCisgICAgICAgIHRyZWVTVCA9IHRyZWVTVC5nZXRJbnN0YW5jZU9mKCkKKworICAgICAgICBzZWxmLm5vZGVOdW1iZXIgPSAwCisgICAgICAgIHNlbGYudG9ET1REZWZpbmVOb2Rlcyh0cmVlLCBhZGFwdG9yLCB0cmVlU1QpCisKKyAgICAgICAgc2VsZi5ub2RlTnVtYmVyID0gMAorICAgICAgICBzZWxmLnRvRE9URGVmaW5lRWRnZXModHJlZSwgYWRhcHRvciwgdHJlZVNULCBlZGdlU1QpCisgICAgICAgIHJldHVybiB0cmVlU1QKKworCisgICAgZGVmIHRvRE9URGVmaW5lTm9kZXMoc2VsZiwgdHJlZSwgYWRhcHRvciwgdHJlZVNULCBrbm93bk5vZGVzPU5vbmUpOgorICAgICAgICBpZiBrbm93bk5vZGVzIGlzIE5vbmU6CisgICAgICAgICAgICBrbm93bk5vZGVzID0gc2V0KCkKKworICAgICAgICBpZiB0cmVlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBuID0gYWRhcHRvci5nZXRDaGlsZENvdW50KHRyZWUpCisgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgICMgbXVzdCBoYXZlIGFscmVhZHkgZHVtcGVkIGFzIGNoaWxkIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICMgaW52b2NhdGlvbjsgZG8gbm90aGluZworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBkZWZpbmUgcGFyZW50IG5vZGUKKyAgICAgICAgbnVtYmVyID0gc2VsZi5nZXROb2RlTnVtYmVyKHRyZWUpCisgICAgICAgIGlmIG51bWJlciBub3QgaW4ga25vd25Ob2RlczoKKyAgICAgICAgICAgIHBhcmVudE5vZGVTVCA9IHNlbGYuZ2V0Tm9kZVNUKGFkYXB0b3IsIHRyZWUpCisgICAgICAgICAgICB0cmVlU1Quc2V0QXR0cmlidXRlKCJub2RlcyIsIHBhcmVudE5vZGVTVCkKKyAgICAgICAgICAgIGtub3duTm9kZXMuYWRkKG51bWJlcikKKworICAgICAgICAjIGZvciBlYWNoIGNoaWxkLCBkbyBhICI8dW5pcXVlLW5hbWU+IFtsYWJlbD10ZXh0XSIgbm9kZSBkZWYKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICBjaGlsZCA9IGFkYXB0b3IuZ2V0Q2hpbGQodHJlZSwgaSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbnVtYmVyID0gc2VsZi5nZXROb2RlTnVtYmVyKGNoaWxkKQorICAgICAgICAgICAgaWYgbnVtYmVyIG5vdCBpbiBrbm93bk5vZGVzOgorICAgICAgICAgICAgICAgIG5vZGVTVCA9IHNlbGYuZ2V0Tm9kZVNUKGFkYXB0b3IsIGNoaWxkKQorICAgICAgICAgICAgICAgIHRyZWVTVC5zZXRBdHRyaWJ1dGUoIm5vZGVzIiwgbm9kZVNUKQorICAgICAgICAgICAgICAgIGtub3duTm9kZXMuYWRkKG51bWJlcikKKworICAgICAgICAgICAgc2VsZi50b0RPVERlZmluZU5vZGVzKGNoaWxkLCBhZGFwdG9yLCB0cmVlU1QsIGtub3duTm9kZXMpCisKKworICAgIGRlZiB0b0RPVERlZmluZUVkZ2VzKHNlbGYsIHRyZWUsIGFkYXB0b3IsIHRyZWVTVCwgZWRnZVNUKToKKyAgICAgICAgaWYgdHJlZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbiA9IGFkYXB0b3IuZ2V0Q2hpbGRDb3VudCh0cmVlKQorICAgICAgICBpZiBuID09IDA6CisgICAgICAgICAgICAjIG11c3QgaGF2ZSBhbHJlYWR5IGR1bXBlZCBhcyBjaGlsZCBmcm9tIHByZXZpb3VzCisgICAgICAgICAgICAjIGludm9jYXRpb247IGRvIG5vdGhpbmcKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBhcmVudE5hbWUgPSAibiVkIiAlIHNlbGYuZ2V0Tm9kZU51bWJlcih0cmVlKQorCisgICAgICAgICMgZm9yIGVhY2ggY2hpbGQsIGRvIGEgcGFyZW50IC0+IGNoaWxkIGVkZ2UgdXNpbmcgdW5pcXVlIG5vZGUgbmFtZXMKKyAgICAgICAgcGFyZW50VGV4dCA9IGFkYXB0b3IuZ2V0VGV4dCh0cmVlKQorICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIGNoaWxkID0gYWRhcHRvci5nZXRDaGlsZCh0cmVlLCBpKQorICAgICAgICAgICAgY2hpbGRUZXh0ID0gYWRhcHRvci5nZXRUZXh0KGNoaWxkKQorICAgICAgICAgICAgY2hpbGROYW1lID0gIm4lZCIgJSBzZWxmLmdldE5vZGVOdW1iZXIoY2hpbGQpCisgICAgICAgICAgICBlZGdlU1QgPSBlZGdlU1QuZ2V0SW5zdGFuY2VPZigpCisgICAgICAgICAgICBlZGdlU1Quc2V0QXR0cmlidXRlKCJwYXJlbnQiLCBwYXJlbnROYW1lKQorICAgICAgICAgICAgZWRnZVNULnNldEF0dHJpYnV0ZSgiY2hpbGQiLCBjaGlsZE5hbWUpCisgICAgICAgICAgICBlZGdlU1Quc2V0QXR0cmlidXRlKCJwYXJlbnRUZXh0IiwgcGFyZW50VGV4dCkKKyAgICAgICAgICAgIGVkZ2VTVC5zZXRBdHRyaWJ1dGUoImNoaWxkVGV4dCIsIGNoaWxkVGV4dCkKKyAgICAgICAgICAgIHRyZWVTVC5zZXRBdHRyaWJ1dGUoImVkZ2VzIiwgZWRnZVNUKQorICAgICAgICAgICAgc2VsZi50b0RPVERlZmluZUVkZ2VzKGNoaWxkLCBhZGFwdG9yLCB0cmVlU1QsIGVkZ2VTVCkKKworCisgICAgZGVmIGdldE5vZGVTVChzZWxmLCBhZGFwdG9yLCB0KToKKyAgICAgICAgdGV4dCA9IGFkYXB0b3IuZ2V0VGV4dCh0KQorICAgICAgICBub2RlU1QgPSBzZWxmLl9ub2RlU1QuZ2V0SW5zdGFuY2VPZigpCisgICAgICAgIHVuaXF1ZU5hbWUgPSAibiVkIiAlIHNlbGYuZ2V0Tm9kZU51bWJlcih0KQorICAgICAgICBub2RlU1Quc2V0QXR0cmlidXRlKCJuYW1lIiwgdW5pcXVlTmFtZSkKKyAgICAgICAgaWYgdGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoJyInLCByJ1xcIicpCisgICAgICAgIG5vZGVTVC5zZXRBdHRyaWJ1dGUoInRleHQiLCB0ZXh0KQorICAgICAgICByZXR1cm4gbm9kZVNUCisKKworICAgIGRlZiBnZXROb2RlTnVtYmVyKHNlbGYsIHQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ub2RlVG9OdW1iZXJNYXBbdF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5ub2RlVG9OdW1iZXJNYXBbdF0gPSBzZWxmLm5vZGVOdW1iZXIKKyAgICAgICAgICAgIHNlbGYubm9kZU51bWJlciArPSAxCisgICAgICAgICAgICByZXR1cm4gc2VsZi5ub2RlTnVtYmVyIC0gMQorCisKK2RlZiB0b0RPVCh0cmVlLCBhZGFwdG9yPU5vbmUsIHRyZWVTVD1ET1RUcmVlR2VuZXJhdG9yLl90cmVlU1QsIGVkZ2VTVD1ET1RUcmVlR2VuZXJhdG9yLl9lZGdlU1QpOgorICAgICIiIgorICAgIEdlbmVyYXRlIERPVCAoZ3JhcGh2aXopIGZvciBhIHdob2xlIHRyZWUgbm90IGp1c3QgYSBub2RlLgorICAgIEZvciBleGFtcGxlLCAzKzQqNSBzaG91bGQgZ2VuZXJhdGU6CisKKyAgICBkaWdyYXBoIHsKKyAgICAgICAgbm9kZSBbc2hhcGU9cGxhaW50ZXh0LCBmaXhlZHNpemU9dHJ1ZSwgZm9udHNpemU9MTEsIGZvbnRuYW1lPSJDb3VyaWVyIiwKKyAgICAgICAgICAgIHdpZHRoPS40LCBoZWlnaHQ9LjJdOworICAgICAgICBlZGdlIFthcnJvd3NpemU9LjddCisgICAgICAgICIrIi0+MworICAgICAgICAiKyItPiIqIgorICAgICAgICAiKiItPjQKKyAgICAgICAgIioiLT41CisgICAgfQorCisgICAgUmV0dXJuIHRoZSBTVCBub3QgYSBzdHJpbmcgaW4gY2FzZSBwZW9wbGUgd2FudCB0byBhbHRlci4KKworICAgIFRha2VzIGEgVHJlZSBpbnRlcmZhY2Ugb2JqZWN0LgorCisgICAgRXhhbXBsZSBvZiBpbnZva2F0aW9uOgorCisgICAgICAgIGltcG9ydCBhbnRscjMKKyAgICAgICAgaW1wb3J0IGFudGxyMy5leHRyYXMKKworICAgICAgICBpbnB1dCA9IGFudGxyMy5BTlRMUklucHV0U3RyZWFtKHN5cy5zdGRpbikKKyAgICAgICAgbGV4ID0gVExleGVyKGlucHV0KQorICAgICAgICB0b2tlbnMgPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4KQorICAgICAgICBwYXJzZXIgPSBUUGFyc2VyKHRva2VucykKKyAgICAgICAgdHJlZSA9IHBhcnNlci5lKCkudHJlZQorICAgICAgICBwcmludCB0cmVlLnRvU3RyaW5nVHJlZSgpCisgICAgICAgIHN0ID0gYW50bHIzLmV4dHJhcy50b0RPVCh0KQorICAgICAgICBwcmludCBzdAorICAgICAgICAKKyAgICAiIiIKKworICAgIGdlbiA9IERPVFRyZWVHZW5lcmF0b3IoKQorICAgIHJldHVybiBnZW4udG9ET1QodHJlZSwgYWRhcHRvciwgdHJlZVNULCBlZGdlU1QpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2V4Y2VwdGlvbnMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2V4Y2VwdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiMTA3NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvZXhjZXB0aW9ucy5weQpAQCAtMCwwICsxLDM2NCBAQAorIiIiQU5UTFIzIGV4Y2VwdGlvbiBoaWVyYXJjaHkiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKK2Zyb20gYW50bHIzLmNvbnN0YW50cyBpbXBvcnQgSU5WQUxJRF9UT0tFTl9UWVBFCisKKworY2xhc3MgQmFja3RyYWNraW5nRmFpbGVkKEV4Y2VwdGlvbik6CisgICAgIiIiQGJyaWVmIFJhaXNlZCB0byBzaWduYWwgZmFpbGVkIGJhY2t0cmFjayBhdHRlbXB0IiIiCisKKyAgICBwYXNzCisKKworY2xhc3MgUmVjb2duaXRpb25FeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJAYnJpZWYgVGhlIHJvb3Qgb2YgdGhlIEFOVExSIGV4Y2VwdGlvbiBoaWVyYXJjaHkuCisKKyAgICBUbyBhdm9pZCBFbmdsaXNoLW9ubHkgZXJyb3IgbWVzc2FnZXMgYW5kIHRvIGdlbmVyYWxseSBtYWtlIHRoaW5ncworICAgIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLCB0aGVzZSBleGNlcHRpb25zIGFyZSBub3QgY3JlYXRlZCB3aXRoIHN0cmluZ3MsCisgICAgYnV0IHJhdGhlciB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGFuIGVycm9yLiAgVGhlbgorICAgIHRoZSB2YXJpb3VzIHJlcG9ydGluZyBtZXRob2RzIGluIFBhcnNlciBhbmQgTGV4ZXIgY2FuIGJlIG92ZXJyaWRkZW4KKyAgICB0byBnZW5lcmF0ZSBhIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlLiAgRm9yIGV4YW1wbGUsIE1pc21hdGNoZWRUb2tlbgorICAgIGV4Y2VwdGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGV4cGVjdGVkIHRva2VuIHR5cGUuCisgICAgU28sIGRvbid0IGV4cGVjdCBnZXRNZXNzYWdlKCkgdG8gcmV0dXJuIGFueXRoaW5nLgorCisgICAgTm90ZSB0aGF0IGFzIG9mIEphdmEgMS40LCB5b3UgY2FuIGFjY2VzcyB0aGUgc3RhY2sgdHJhY2UsIHdoaWNoIG1lYW5zCisgICAgdGhhdCB5b3UgY2FuIGNvbXB1dGUgdGhlIGNvbXBsZXRlIHRyYWNlIG9mIHJ1bGVzIGZyb20gdGhlIHN0YXJ0IHN5bWJvbC4KKyAgICBUaGlzIGdpdmVzIHlvdSBjb25zaWRlcmFibGUgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIHRvIGdlbmVyYXRlCisgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLgorCisgICAgQU5UTFIgZ2VuZXJhdGVzIGNvZGUgdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyB1cG9uIHJlY29nbml0aW9uIGVycm9yIGFuZAorICAgIGFsc28gZ2VuZXJhdGVzIGNvZGUgdG8gY2F0Y2ggdGhlc2UgZXhjZXB0aW9ucyBpbiBlYWNoIHJ1bGUuICBJZiB5b3UKKyAgICB3YW50IHRvIHF1aXQgdXBvbiBmaXJzdCBlcnJvciwgeW91IGNhbiB0dXJuIG9mZiB0aGUgYXV0b21hdGljIGVycm9yCisgICAgaGFuZGxpbmcgbWVjaGFuaXNtIHVzaW5nIHJ1bGVjYXRjaCBhY3Rpb24sIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0bworICAgIG92ZXJyaWRlIG1ldGhvZHMgbWlzbWF0Y2ggYW5kIHJlY292ZXJGcm9tTWlzbWF0Y2hTZXQuCisgICAgCisgICAgSW4gZ2VuZXJhbCwgdGhlIHJlY29nbml0aW9uIGV4Y2VwdGlvbnMgY2FuIHRyYWNrIHdoZXJlIGluIGEgZ3JhbW1hciBhCisgICAgcHJvYmxlbSBvY2N1cnJlZCBhbmQvb3Igd2hhdCB3YXMgdGhlIGV4cGVjdGVkIGlucHV0LiAgV2hpbGUgdGhlIHBhcnNlcgorICAgIGtub3dzIGl0cyBzdGF0ZSAoc3VjaCBhcyBjdXJyZW50IGlucHV0IHN5bWJvbCBhbmQgbGluZSBpbmZvKSB0aGF0CisgICAgc3RhdGUgY2FuIGNoYW5nZSBiZWZvcmUgdGhlIGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBzbyBjdXJyZW50IHRva2VuIGluZGV4CisgICAgaXMgY29tcHV0ZWQgYW5kIHN0b3JlZCBhdCBleGNlcHRpb24gdGltZS4gIEZyb20gdGhpcyBpbmZvLCB5b3UgY2FuCisgICAgcGVyaGFwcyBwcmludCBhbiBlbnRpcmUgbGluZSBvZiBpbnB1dCBub3QganVzdCBhIHNpbmdsZSB0b2tlbiwgZm9yIGV4YW1wbGUuCisgICAgQmV0dGVyIHRvIGp1c3Qgc2F5IHRoZSByZWNvZ25pemVyIGhhZCBhIHByb2JsZW0gYW5kIHRoZW4gbGV0IHRoZSBwYXJzZXIKKyAgICBmaWd1cmUgb3V0IGEgZmFuY3kgcmVwb3J0LgorICAgIAorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0PU5vbmUpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZikKKworCSMgV2hhdCBpbnB1dCBzdHJlYW0gZGlkIHRoZSBlcnJvciBvY2N1ciBpbj8KKyAgICAgICAgc2VsZi5pbnB1dCA9IE5vbmUKKworICAgICAgICAjIFdoYXQgaXMgaW5kZXggb2YgdG9rZW4vY2hhciB3ZXJlIHdlIGxvb2tpbmcgYXQgd2hlbiB0aGUgZXJyb3IKKyAgICAgICAgIyBvY2N1cnJlZD8KKyAgICAgICAgc2VsZi5pbmRleCA9IE5vbmUKKworCSMgVGhlIGN1cnJlbnQgVG9rZW4gd2hlbiBhbiBlcnJvciBvY2N1cnJlZC4gIFNpbmNlIG5vdCBhbGwgc3RyZWFtcworCSMgY2FuIHJldHJpZXZlIHRoZSBpdGggVG9rZW4sIHdlIGhhdmUgdG8gdHJhY2sgdGhlIFRva2VuIG9iamVjdC4KKwkjIEZvciBwYXJzZXJzLiAgRXZlbiB3aGVuIGl0J3MgYSB0cmVlIHBhcnNlciwgdG9rZW4gbWlnaHQgYmUgc2V0LgorICAgICAgICBzZWxmLnRva2VuID0gTm9uZQorCisJIyBJZiB0aGlzIGlzIGEgdHJlZSBwYXJzZXIgZXhjZXB0aW9uLCBub2RlIGlzIHNldCB0byB0aGUgbm9kZSB3aXRoCisJIyB0aGUgcHJvYmxlbS4KKyAgICAgICAgc2VsZi5ub2RlID0gTm9uZQorCisJIyBUaGUgY3VycmVudCBjaGFyIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQuIEZvciBsZXhlcnMuCisgICAgICAgIHNlbGYuYyA9IE5vbmUKKworCSMgVHJhY2sgdGhlIGxpbmUgYXQgd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkIGluIGNhc2UgdGhpcyBpcworCSMgZ2VuZXJhdGVkIGZyb20gYSBsZXhlci4gIFdlIG5lZWQgdG8gdHJhY2sgdGhpcyBzaW5jZSB0aGUKKyAgICAgICAgIyB1bmV4cGVjdGVkIGNoYXIgZG9lc24ndCBjYXJyeSB0aGUgbGluZSBpbmZvLgorICAgICAgICBzZWxmLmxpbmUgPSBOb25lCisKKyAgICAgICAgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUgPSBOb25lCisKKyAgICAgICAgIyBJZiB5b3UgYXJlIHBhcnNpbmcgYSB0cmVlIG5vZGUgc3RyZWFtLCB5b3Ugd2lsbCBlbmNvdW50ZXIgc29tCisgICAgICAgICMgaW1hZ2luYXJ5IG5vZGVzIHcvbyBsaW5lL2NvbCBpbmZvLiAgV2Ugbm93IHNlYXJjaCBiYWNrd2FyZHMgbG9va2luZworICAgICAgICAjIGZvciBtb3N0IHJlY2VudCB0b2tlbiB3aXRoIGxpbmUvY29sIGluZm8sIGJ1dCBub3RpZnkgZ2V0RXJyb3JIZWFkZXIoKQorICAgICAgICAjIHRoYXQgaW5mbyBpcyBhcHByb3hpbWF0ZS4KKyAgICAgICAgc2VsZi5hcHByb3hpbWF0ZUxpbmVJbmZvID0gRmFsc2UKKworICAgICAgICAKKyAgICAgICAgaWYgaW5wdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKyAgICAgICAgICAgIHNlbGYuaW5kZXggPSBpbnB1dC5pbmRleCgpCisKKyAgICAgICAgICAgICMgbGF0ZSBpbXBvcnQgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY2llcworICAgICAgICAgICAgZnJvbSBhbnRscjMuc3RyZWFtcyBpbXBvcnQgVG9rZW5TdHJlYW0sIENoYXJTdHJlYW0KKyAgICAgICAgICAgIGZyb20gYW50bHIzLnRyZWUgaW1wb3J0IFRyZWVOb2RlU3RyZWFtCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dCwgVG9rZW5TdHJlYW0pOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLmlucHV0LkxUKDEpCisgICAgICAgICAgICAgICAgc2VsZi5saW5lID0gc2VsZi50b2tlbi5saW5lCisgICAgICAgICAgICAgICAgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUgPSBzZWxmLnRva2VuLmNoYXJQb3NpdGlvbkluTGluZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXQsIFRyZWVOb2RlU3RyZWFtKToKKyAgICAgICAgICAgICAgICBzZWxmLmV4dHJhY3RJbmZvcm1hdGlvbkZyb21UcmVlTm9kZVN0cmVhbShzZWxmLmlucHV0KQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dCwgQ2hhclN0cmVhbSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYyA9IHNlbGYuaW5wdXQuTFQoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lID0gc2VsZi5pbnB1dC5saW5lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gc2VsZi5pbnB1dC5jaGFyUG9zaXRpb25JbkxpbmUKKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYyA9IHNlbGYuaW5wdXQuTEEoMSkKKworICAgIGRlZiBleHRyYWN0SW5mb3JtYXRpb25Gcm9tVHJlZU5vZGVTdHJlYW0oc2VsZiwgbm9kZXMpOgorICAgICAgICBmcm9tIGFudGxyMy50cmVlIGltcG9ydCBUcmVlLCBDb21tb25UcmVlCisgICAgICAgIGZyb20gYW50bHIzLnRva2VucyBpbXBvcnQgQ29tbW9uVG9rZW4KKyAgICAgICAgCisgICAgICAgIHNlbGYubm9kZSA9IG5vZGVzLkxUKDEpCisgICAgICAgIGFkYXB0b3IgPSBub2Rlcy5hZGFwdG9yCisgICAgICAgIHBheWxvYWQgPSBhZGFwdG9yLmdldFRva2VuKHNlbGYubm9kZSkKKyAgICAgICAgaWYgcGF5bG9hZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudG9rZW4gPSBwYXlsb2FkCisgICAgICAgICAgICBpZiBwYXlsb2FkLmxpbmUgPD0gMDoKKyAgICAgICAgICAgICAgICAjIGltYWdpbmFyeSBub2RlOyBubyBsaW5lL3BvcyBpbmZvOyBzY2FuIGJhY2t3YXJkcworICAgICAgICAgICAgICAgIGkgPSAtMQorICAgICAgICAgICAgICAgIHByaW9yTm9kZSA9IG5vZGVzLkxUKGkpCisgICAgICAgICAgICAgICAgd2hpbGUgcHJpb3JOb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmlvclBheWxvYWQgPSBhZGFwdG9yLmdldFRva2VuKHByaW9yTm9kZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJpb3JQYXlsb2FkIGlzIG5vdCBOb25lIGFuZCBwcmlvclBheWxvYWQubGluZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGZvdW5kIHRoZSBtb3N0IHJlY2VudCByZWFsIGxpbmUgLyBwb3MgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lID0gcHJpb3JQYXlsb2FkLmxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gcHJpb3JQYXlsb2FkLmNoYXJQb3NpdGlvbkluTGluZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHByb3hpbWF0ZUxpbmVJbmZvID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGkgLT0gMQorICAgICAgICAgICAgICAgICAgICBwcmlvck5vZGUgPSBub2Rlcy5MVChpKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsc2U6ICMgbm9kZSBjcmVhdGVkIGZyb20gcmVhbCB0b2tlbgorICAgICAgICAgICAgICAgIHNlbGYubGluZSA9IHBheWxvYWQubGluZQorICAgICAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gcGF5bG9hZC5jaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYubm9kZSwgVHJlZSk6CisgICAgICAgICAgICBzZWxmLmxpbmUgPSBzZWxmLm5vZGUubGluZQorICAgICAgICAgICAgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUgPSBzZWxmLm5vZGUuY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubm9kZSwgQ29tbW9uVHJlZSk6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYubm9kZS50b2tlbgorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0eXBlID0gYWRhcHRvci5nZXRUeXBlKHNlbGYubm9kZSkKKyAgICAgICAgICAgIHRleHQgPSBhZGFwdG9yLmdldFRleHQoc2VsZi5ub2RlKQorICAgICAgICAgICAgc2VsZi50b2tlbiA9IENvbW1vblRva2VuKHR5cGU9dHlwZSwgdGV4dD10ZXh0KQorCisgICAgIAorICAgIGRlZiBnZXRVbmV4cGVjdGVkVHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0b2tlbiB0eXBlIG9yIGNoYXIgb2YgdGhlIHVuZXhwZWN0ZWQgaW5wdXQgZWxlbWVudCIiIgorCisgICAgICAgIGZyb20gYW50bHIzLnN0cmVhbXMgaW1wb3J0IFRva2VuU3RyZWFtCisgICAgICAgIGZyb20gYW50bHIzLnRyZWUgaW1wb3J0IFRyZWVOb2RlU3RyZWFtCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0LCBUb2tlblN0cmVhbSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50eXBlCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXQsIFRyZWVOb2RlU3RyZWFtKToKKyAgICAgICAgICAgIGFkYXB0b3IgPSBzZWxmLmlucHV0LnRyZWVBZGFwdG9yCisgICAgICAgICAgICByZXR1cm4gYWRhcHRvci5nZXRUeXBlKHNlbGYubm9kZSkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYworCisgICAgdW5leHBlY3RlZFR5cGUgPSBwcm9wZXJ0eShnZXRVbmV4cGVjdGVkVHlwZSkKKyAgICAKKworY2xhc3MgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uKToKKyAgICAiIiJAYnJpZWYgQSBtaXNtYXRjaGVkIGNoYXIgb3IgVG9rZW4gb3IgdHJlZSBub2RlLiIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHBlY3RpbmcsIGlucHV0KToKKyAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24uX19pbml0X18oc2VsZiwgaW5wdXQpCisgICAgICAgIHNlbGYuZXhwZWN0aW5nID0gZXhwZWN0aW5nCisgICAgICAgIAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICNyZXR1cm4gIk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbigiK3NlbGYuZXhwZWN0aW5nKyIpIgorICAgICAgICByZXR1cm4gIk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiglciE9JXIpIiAlICgKKyAgICAgICAgICAgIHNlbGYuZ2V0VW5leHBlY3RlZFR5cGUoKSwgc2VsZi5leHBlY3RpbmcKKyAgICAgICAgICAgICkKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworCitjbGFzcyBVbndhbnRlZFRva2VuRXhjZXB0aW9uKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbik6CisgICAgIiIiQW4gZXh0cmEgdG9rZW4gd2hpbGUgcGFyc2luZyBhIFRva2VuU3RyZWFtIiIiCisKKyAgICBkZWYgZ2V0VW5leHBlY3RlZFRva2VuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50b2tlbgorCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgZXhwID0gIiwgZXhwZWN0ZWQgJXMiICUgc2VsZi5leHBlY3RpbmcKKyAgICAgICAgaWYgc2VsZi5leHBlY3RpbmcgPT0gSU5WQUxJRF9UT0tFTl9UWVBFOgorICAgICAgICAgICAgZXhwID0gIiIKKworICAgICAgICBpZiBzZWxmLnRva2VuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gIlVud2FudGVkVG9rZW5FeGNlcHRpb24oZm91bmQ9JXMlcykiICUgKE5vbmUsIGV4cCkKKworICAgICAgICByZXR1cm4gIlVud2FudGVkVG9rZW5FeGNlcHRpb24oZm91bmQ9JXMlcykiICUgKHNlbGYudG9rZW4udGV4dCwgZXhwKQorICAgIF9fcmVwcl9fID0gX19zdHJfXworCisKK2NsYXNzIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbihNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pOgorICAgICIiIgorICAgIFdlIHdlcmUgZXhwZWN0aW5nIGEgdG9rZW4gYnV0IGl0J3Mgbm90IGZvdW5kLiAgVGhlIGN1cnJlbnQgdG9rZW4KKyAgICBpcyBhY3R1YWxseSB3aGF0IHdlIHdhbnRlZCBuZXh0LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGluZywgaW5wdXQsIGluc2VydGVkKToKKyAgICAgICAgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIGV4cGVjdGluZywgaW5wdXQpCisKKyAgICAgICAgc2VsZi5pbnNlcnRlZCA9IGluc2VydGVkCisKKworICAgIGRlZiBnZXRNaXNzaW5nVHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwZWN0aW5nCisKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmluc2VydGVkIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRva2VuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuICJNaXNzaW5nVG9rZW5FeGNlcHRpb24oaW5zZXJ0ZWQgJXIgYXQgJXIpIiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLmluc2VydGVkLCBzZWxmLnRva2VuLnRleHQpCisKKyAgICAgICAgaWYgc2VsZi50b2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiTWlzc2luZ1Rva2VuRXhjZXB0aW9uKGF0ICVyKSIgJSBzZWxmLnRva2VuLnRleHQKKworICAgICAgICByZXR1cm4gIk1pc3NpbmdUb2tlbkV4Y2VwdGlvbiIKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworCitjbGFzcyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oUmVjb2duaXRpb25FeGNlcHRpb24pOgorICAgICIiIkBicmllZiBUaGUgbmV4dCB0b2tlbiBkb2VzIG5vdCBtYXRjaCBhIHJhbmdlIG9mIGV4cGVjdGVkIHR5cGVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIsIGlucHV0KToKKyAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24uX19pbml0X18oc2VsZiwgaW5wdXQpCisKKyAgICAgICAgc2VsZi5hID0gYQorICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgIAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKCVyIG5vdCBpbiBbJXIuLiVyXSkiICUgKAorICAgICAgICAgICAgc2VsZi5nZXRVbmV4cGVjdGVkVHlwZSgpLCBzZWxmLmEsIHNlbGYuYgorICAgICAgICAgICAgKQorICAgIF9fcmVwcl9fID0gX19zdHJfXworICAgIAorCitjbGFzcyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uKToKKyAgICAiIiJAYnJpZWYgVGhlIG5leHQgdG9rZW4gZG9lcyBub3QgbWF0Y2ggYSBzZXQgb2YgZXhwZWN0ZWQgdHlwZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0aW5nLCBpbnB1dCk6CisgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIGlucHV0KQorCisgICAgICAgIHNlbGYuZXhwZWN0aW5nID0gZXhwZWN0aW5nCisgICAgICAgIAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiglciBub3QgaW4gJXIpIiAlICgKKyAgICAgICAgICAgIHNlbGYuZ2V0VW5leHBlY3RlZFR5cGUoKSwgc2VsZi5leHBlY3RpbmcKKyAgICAgICAgICAgICkKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworCitjbGFzcyBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKE1pc21hdGNoZWRTZXRFeGNlcHRpb24pOgorICAgICIiIkBicmllZiBVc2VkIGZvciByZW1vdGUgZGVidWdnZXIgZGVzZXJpYWxpemF0aW9uIiIiCisgICAgCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiglciE9JXIpIiAlICgKKyAgICAgICAgICAgIHNlbGYuZ2V0VW5leHBlY3RlZFR5cGUoKSwgc2VsZi5leHBlY3RpbmcKKyAgICAgICAgICAgICkKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworCitjbGFzcyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihSZWNvZ25pdGlvbkV4Y2VwdGlvbik6CisgICAgIiIiQGJyaWVmIFVuYWJsZSB0byBkZWNpZGUgd2hpY2ggYWx0ZXJuYXRpdmUgdG8gY2hvb3NlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLCBncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbiwgZGVjaXNpb25OdW1iZXIsIHN0YXRlTnVtYmVyLCBpbnB1dAorICAgICAgICApOgorICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBpbnB1dCkKKworICAgICAgICBzZWxmLmdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uID0gZ3JhbW1hckRlY2lzaW9uRGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyCisgICAgICAgIHNlbGYuc3RhdGVOdW1iZXIgPSBzdGF0ZU51bWJlcgorCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiglciE9WyVyXSkiICUgKAorICAgICAgICAgICAgc2VsZi51bmV4cGVjdGVkVHlwZSwgc2VsZi5ncmFtbWFyRGVjaXNpb25EZXNjcmlwdGlvbgorICAgICAgICAgICAgKQorICAgIF9fcmVwcl9fID0gX19zdHJfXworICAgIAorCitjbGFzcyBFYXJseUV4aXRFeGNlcHRpb24oUmVjb2duaXRpb25FeGNlcHRpb24pOgorICAgICIiIkBicmllZiBUaGUgcmVjb2duaXplciBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGZvciBhICguLikrIGxvb3AuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVjaXNpb25OdW1iZXIsIGlucHV0KToKKyAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24uX19pbml0X18oc2VsZiwgaW5wdXQpCisKKyAgICAgICAgc2VsZi5kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyCisKKworY2xhc3MgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uKToKKyAgICAiIiJAYnJpZWYgQSBzZW1hbnRpYyBwcmVkaWNhdGUgZmFpbGVkIGR1cmluZyB2YWxpZGF0aW9uLgorCisgICAgVmFsaWRhdGlvbiBvZiBwcmVkaWNhdGVzCisgICAgb2NjdXJzIHdoZW4gbm9ybWFsbHkgcGFyc2luZyB0aGUgYWx0ZXJuYXRpdmUganVzdCBsaWtlIG1hdGNoaW5nIGEgdG9rZW4uCisgICAgRGlzYW1iaWd1YXRpbmcgcHJlZGljYXRlIGV2YWx1YXRpb24gb2NjdXJzIHdoZW4gd2UgaG9pc3QgYSBwcmVkaWNhdGUgaW50bworICAgIGEgcHJlZGljdGlvbiBkZWNpc2lvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dCwgcnVsZU5hbWUsIHByZWRpY2F0ZVRleHQpOgorICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBpbnB1dCkKKyAgICAgICAgCisgICAgICAgIHNlbGYucnVsZU5hbWUgPSBydWxlTmFtZQorICAgICAgICBzZWxmLnByZWRpY2F0ZVRleHQgPSBwcmVkaWNhdGVUZXh0CisKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbigiK3NlbGYucnVsZU5hbWUrIix7IitzZWxmLnByZWRpY2F0ZVRleHQrIn0/KSIKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKyAgICAKKworY2xhc3MgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKFJlY29nbml0aW9uRXhjZXB0aW9uKToKKyAgICAiIiJAYnJpZWYgVGhlIG5leHQgdHJlZSBtb2RlIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGluZywgaW5wdXQpOgorICAgICAgICBSZWNvZ25pdGlvbkV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBpbnB1dCkKKyAgICAgICAgCisgICAgICAgIHNlbGYuZXhwZWN0aW5nID0gZXhwZWN0aW5nCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oJXIhPSVyKSIgJSAoCisgICAgICAgICAgICBzZWxmLmdldFVuZXhwZWN0ZWRUeXBlKCksIHNlbGYuZXhwZWN0aW5nCisgICAgICAgICAgICApCisgICAgX19yZXByX18gPSBfX3N0cl9fCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2V4dHJhcy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvZXh0cmFzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNTVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL2V4dHJhcy5weQpAQCAtMCwwICsxLDQ3IEBACisiIiIgQHBhY2thZ2UgYW50bHIzLmRvdHRyZWVnZW5lcmF0b3IKK0BicmllZiBBTlRMUjMgcnVudGltZSBwYWNrYWdlLCB0cmVlIG1vZHVsZQorCitUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgc3VwcG9ydCBjbGFzc2VzIGZvciBBU1QgY29uc3RydWN0aW9uIGFuZCB0cmVlIHBhcnNlcnMuCisKKyIiIgorCisjIGJlZ2luW2xpY2VuY2VdCisjCisjIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworIyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBlbmRbbGljZW5jZV0KKworIyBsb3QncyBvZiBkb2NzdHJpbmdzIGFyZSBtaXNzaW5nLCBkb24ndCBjb21wbGFpbiBmb3Igbm93Li4uCisjIHB5bGludDogZGlzYWJsZS1tc2c9QzAxMTEKKworZnJvbSB0cmVld2l6YXJkIGltcG9ydCBUcmVlV2l6YXJkCisKK3RyeToKKyAgICBmcm9tIGFudGxyMy5kb3R0cmVlZ2VuIGltcG9ydCB0b0RPVAorZXhjZXB0IEltcG9ydEVycm9yLCBleGM6CisgICAgZGVmIHRvRE9UKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJhaXNlIGV4YwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9tYWluLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzkwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL21haW4ucHkKQEAgLTAsMCArMSwzMDUgQEAKKyIiIkFOVExSMyBydW50aW1lIHBhY2thZ2UiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKKworaW1wb3J0IHN5cworaW1wb3J0IG9wdHBhcnNlCisKK2ltcG9ydCBhbnRscjMKKworCitjbGFzcyBfTWFpbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICBzZWxmLnN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzeXMuc3RkZXJyCisKKworICAgIGRlZiBwYXJzZU9wdGlvbnMoc2VsZiwgYXJndik6CisgICAgICAgIG9wdFBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigpCisgICAgICAgIG9wdFBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAgICAgIi0tZW5jb2RpbmciLAorICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgZGVzdD0iZW5jb2RpbmciCisgICAgICAgICAgICApCisgICAgICAgIG9wdFBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAgICAgIi0taW5wdXQiLAorICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgZGVzdD0iaW5wdXQiCisgICAgICAgICAgICApCisgICAgICAgIG9wdFBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAgICAgIi0taW50ZXJhY3RpdmUiLCAiLWkiLAorICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgIGRlc3Q9ImludGVyYWN0aXZlIgorICAgICAgICAgICAgKQorICAgICAgICBvcHRQYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgICAgICItLW5vLW91dHB1dCIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgZGVzdD0ibm9fb3V0cHV0IgorICAgICAgICAgICAgKQorICAgICAgICBvcHRQYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgICAgICItLXByb2ZpbGUiLAorICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgIGRlc3Q9InByb2ZpbGUiCisgICAgICAgICAgICApCisgICAgICAgIG9wdFBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAgICAgIi0taG90c2hvdCIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgZGVzdD0iaG90c2hvdCIKKyAgICAgICAgICAgICkKKyAgICAgICAgb3B0UGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICAgICAiLS1wb3J0IiwKKyAgICAgICAgICAgIHR5cGU9ImludCIsCisgICAgICAgICAgICBkZXN0PSJwb3J0IiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZQorICAgICAgICAgICAgKQorICAgICAgICBvcHRQYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgICAgICItLWRlYnVnLXNvY2tldCIsCisgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgZGVzdD0iZGVidWdfc29ja2V0IiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuc2V0dXBPcHRpb25zKG9wdFBhcnNlcikKKworICAgICAgICByZXR1cm4gb3B0UGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisKKworICAgIGRlZiBzZXR1cE9wdGlvbnMoc2VsZiwgb3B0UGFyc2VyKToKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBhcmd2KToKKyAgICAgICAgb3B0aW9ucywgYXJncyA9IHNlbGYucGFyc2VPcHRpb25zKGFyZ3YpCisKKyAgICAgICAgc2VsZi5zZXRVcChvcHRpb25zKQorCisgICAgICAgIGlmIG9wdGlvbnMuaW50ZXJhY3RpdmU6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSByYXdfaW5wdXQoIj4+PiAiKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIlxuQnllLlxuIikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIGluU3RyZWFtID0gYW50bHIzLkFOVExSU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VTdHJlYW0ob3B0aW9ucywgaW5TdHJlYW0pCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuaW5wdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaW5TdHJlYW0gPSBhbnRscjMuQU5UTFJTdHJpbmdTdHJlYW0ob3B0aW9ucy5pbnB1dCkKKworICAgICAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMSBhbmQgYXJnc1swXSAhPSAnLSc6CisgICAgICAgICAgICAgICAgaW5TdHJlYW0gPSBhbnRscjMuQU5UTFJGaWxlU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBhcmdzWzBdLCBlbmNvZGluZz1vcHRpb25zLmVuY29kaW5nCisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpblN0cmVhbSA9IGFudGxyMy5BTlRMUklucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLCBlbmNvZGluZz1vcHRpb25zLmVuY29kaW5nCisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgaWYgb3B0aW9ucy5wcm9maWxlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGNQcm9maWxlIGFzIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxlCisKKyAgICAgICAgICAgICAgICBwcm9maWxlLnJ1bmN0eCgKKyAgICAgICAgICAgICAgICAgICAgJ3NlbGYucGFyc2VTdHJlYW0ob3B0aW9ucywgaW5TdHJlYW0pJywKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFscygpLAorICAgICAgICAgICAgICAgICAgICBsb2NhbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGUuZGF0JworICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgICBpbXBvcnQgcHN0YXRzCisgICAgICAgICAgICAgICAgc3RhdHMgPSBwc3RhdHMuU3RhdHMoJ3Byb2ZpbGUuZGF0JykKKyAgICAgICAgICAgICAgICBzdGF0cy5zdHJpcF9kaXJzKCkKKyAgICAgICAgICAgICAgICBzdGF0cy5zb3J0X3N0YXRzKCd0aW1lJykKKyAgICAgICAgICAgICAgICBzdGF0cy5wcmludF9zdGF0cygxMDApCisKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy5ob3RzaG90OgorICAgICAgICAgICAgICAgIGltcG9ydCBob3RzaG90CisKKyAgICAgICAgICAgICAgICBwcm9maWxlciA9IGhvdHNob3QuUHJvZmlsZSgnaG90c2hvdC5kYXQnKQorICAgICAgICAgICAgICAgIHByb2ZpbGVyLnJ1bmN0eCgKKyAgICAgICAgICAgICAgICAgICAgJ3NlbGYucGFyc2VTdHJlYW0ob3B0aW9ucywgaW5TdHJlYW0pJywKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFscygpLAorICAgICAgICAgICAgICAgICAgICBsb2NhbHMoKQorICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZVN0cmVhbShvcHRpb25zLCBpblN0cmVhbSkKKworCisgICAgZGVmIHNldFVwKHNlbGYsIG9wdGlvbnMpOgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBwYXJzZVN0cmVhbShzZWxmLCBvcHRpb25zLCBpblN0cmVhbSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHdyaXRlKHNlbGYsIG9wdGlvbnMsIHRleHQpOgorICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19vdXRwdXQ6CisgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSh0ZXh0KQorCisKKyAgICBkZWYgd3JpdGVsbihzZWxmLCBvcHRpb25zLCB0ZXh0KToKKyAgICAgICAgc2VsZi53cml0ZShvcHRpb25zLCB0ZXh0ICsgJ1xuJykKKworCitjbGFzcyBMZXhlck1haW4oX01haW4pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZXhlckNsYXNzKToKKyAgICAgICAgX01haW4uX19pbml0X18oc2VsZikKKworICAgICAgICBzZWxmLmxleGVyQ2xhc3MgPSBsZXhlckNsYXNzCisKKworICAgIGRlZiBwYXJzZVN0cmVhbShzZWxmLCBvcHRpb25zLCBpblN0cmVhbSk6CisgICAgICAgIGxleGVyID0gc2VsZi5sZXhlckNsYXNzKGluU3RyZWFtKQorICAgICAgICBmb3IgdG9rZW4gaW4gbGV4ZXI6CisgICAgICAgICAgICBzZWxmLndyaXRlbG4ob3B0aW9ucywgc3RyKHRva2VuKSkKKworCitjbGFzcyBQYXJzZXJNYWluKF9NYWluKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGV4ZXJDbGFzc05hbWUsIHBhcnNlckNsYXNzKToKKyAgICAgICAgX01haW4uX19pbml0X18oc2VsZikKKworICAgICAgICBzZWxmLmxleGVyQ2xhc3NOYW1lID0gbGV4ZXJDbGFzc05hbWUKKyAgICAgICAgc2VsZi5sZXhlckNsYXNzID0gTm9uZQorICAgICAgICBzZWxmLnBhcnNlckNsYXNzID0gcGFyc2VyQ2xhc3MKKworCisgICAgZGVmIHNldHVwT3B0aW9ucyhzZWxmLCBvcHRQYXJzZXIpOgorICAgICAgICBvcHRQYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgICAgICItLWxleGVyIiwKKyAgICAgICAgICAgIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgIGRlc3Q9ImxleGVyQ2xhc3MiLAorICAgICAgICAgICAgZGVmYXVsdD1zZWxmLmxleGVyQ2xhc3NOYW1lCisgICAgICAgICAgICApCisgICAgICAgIG9wdFBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAgICAgIi0tcnVsZSIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICBkZXN0PSJwYXJzZXJSdWxlIgorICAgICAgICAgICAgKQorCisKKyAgICBkZWYgc2V0VXAoc2VsZiwgb3B0aW9ucyk6CisgICAgICAgIGxleGVyTW9kID0gX19pbXBvcnRfXyhvcHRpb25zLmxleGVyQ2xhc3MpCisgICAgICAgIHNlbGYubGV4ZXJDbGFzcyA9IGdldGF0dHIobGV4ZXJNb2QsIG9wdGlvbnMubGV4ZXJDbGFzcykKKworCisgICAgZGVmIHBhcnNlU3RyZWFtKHNlbGYsIG9wdGlvbnMsIGluU3RyZWFtKToKKyAgICAgICAga3dhcmdzID0ge30KKyAgICAgICAgaWYgb3B0aW9ucy5wb3J0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dhcmdzWydwb3J0J10gPSBvcHRpb25zLnBvcnQKKyAgICAgICAgaWYgb3B0aW9ucy5kZWJ1Z19zb2NrZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBrd2FyZ3NbJ2RlYnVnX3NvY2tldCddID0gc3lzLnN0ZGVycgorCisgICAgICAgIGxleGVyID0gc2VsZi5sZXhlckNsYXNzKGluU3RyZWFtKQorICAgICAgICB0b2tlblN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5wYXJzZXJDbGFzcyh0b2tlblN0cmVhbSwgKiprd2FyZ3MpCisgICAgICAgIHJlc3VsdCA9IGdldGF0dHIocGFyc2VyLCBvcHRpb25zLnBhcnNlclJ1bGUpKCkKKyAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgaGFzYXR0cihyZXN1bHQsICd0cmVlJykgYW5kIHJlc3VsdC50cmVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVsbihvcHRpb25zLCByZXN1bHQudHJlZS50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZWxuKG9wdGlvbnMsIHJlcHIocmVzdWx0KSkKKworCitjbGFzcyBXYWxrZXJNYWluKF9NYWluKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2Fsa2VyQ2xhc3MpOgorICAgICAgICBfTWFpbi5fX2luaXRfXyhzZWxmKQorCisgICAgICAgIHNlbGYubGV4ZXJDbGFzcyA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJzZXJDbGFzcyA9IE5vbmUKKyAgICAgICAgc2VsZi53YWxrZXJDbGFzcyA9IHdhbGtlckNsYXNzCisKKworICAgIGRlZiBzZXR1cE9wdGlvbnMoc2VsZiwgb3B0UGFyc2VyKToKKyAgICAgICAgb3B0UGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICAgICAiLS1sZXhlciIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICBkZXN0PSJsZXhlckNsYXNzIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZQorICAgICAgICAgICAgKQorICAgICAgICBvcHRQYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgICAgICItLXBhcnNlciIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICBkZXN0PSJwYXJzZXJDbGFzcyIsCisgICAgICAgICAgICBkZWZhdWx0PU5vbmUKKyAgICAgICAgICAgICkKKyAgICAgICAgb3B0UGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICAgICAiLS1wYXJzZXItcnVsZSIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICBkZXN0PSJwYXJzZXJSdWxlIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZQorICAgICAgICAgICAgKQorICAgICAgICBvcHRQYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgICAgICItLXJ1bGUiLAorICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgZGVzdD0id2Fsa2VyUnVsZSIKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHNldFVwKHNlbGYsIG9wdGlvbnMpOgorICAgICAgICBsZXhlck1vZCA9IF9faW1wb3J0X18ob3B0aW9ucy5sZXhlckNsYXNzKQorICAgICAgICBzZWxmLmxleGVyQ2xhc3MgPSBnZXRhdHRyKGxleGVyTW9kLCBvcHRpb25zLmxleGVyQ2xhc3MpCisgICAgICAgIHBhcnNlck1vZCA9IF9faW1wb3J0X18ob3B0aW9ucy5wYXJzZXJDbGFzcykKKyAgICAgICAgc2VsZi5wYXJzZXJDbGFzcyA9IGdldGF0dHIocGFyc2VyTW9kLCBvcHRpb25zLnBhcnNlckNsYXNzKQorCisKKyAgICBkZWYgcGFyc2VTdHJlYW0oc2VsZiwgb3B0aW9ucywgaW5TdHJlYW0pOgorICAgICAgICBsZXhlciA9IHNlbGYubGV4ZXJDbGFzcyhpblN0cmVhbSkKKyAgICAgICAgdG9rZW5TdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYucGFyc2VyQ2xhc3ModG9rZW5TdHJlYW0pCisgICAgICAgIHJlc3VsdCA9IGdldGF0dHIocGFyc2VyLCBvcHRpb25zLnBhcnNlclJ1bGUpKCkKKyAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXNzZXJ0IGhhc2F0dHIocmVzdWx0LCAndHJlZScpLCAiUGFyc2VyIGRpZCBub3QgcmV0dXJuIGFuIEFTVCIKKyAgICAgICAgICAgIG5vZGVTdHJlYW0gPSBhbnRscjMudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbShyZXN1bHQudHJlZSkKKyAgICAgICAgICAgIG5vZGVTdHJlYW0uc2V0VG9rZW5TdHJlYW0odG9rZW5TdHJlYW0pCisgICAgICAgICAgICB3YWxrZXIgPSBzZWxmLndhbGtlckNsYXNzKG5vZGVTdHJlYW0pCisgICAgICAgICAgICByZXN1bHQgPSBnZXRhdHRyKHdhbGtlciwgb3B0aW9ucy53YWxrZXJSdWxlKSgpCisgICAgICAgICAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihyZXN1bHQsICd0cmVlJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVsbihvcHRpb25zLCByZXN1bHQudHJlZS50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlbG4ob3B0aW9ucywgcmVwcihyZXN1bHQpKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy9yZWNvZ25pemVycy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvcmVjb2duaXplcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4MjgwYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvcmVjb2duaXplcnMucHkKQEAgLTAsMCArMSwxNDg1IEBACisiIiJBTlRMUjMgcnVudGltZSBwYWNrYWdlIiIiCisKKyMgYmVnaW5bbGljZW5jZV0KKyMKKyMgW1RoZSAiQlNEIGxpY2VuY2UiXQorIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisjICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisjIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisjIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyMgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisjIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisjIGVuZFtsaWNlbmNlXQorCitpbXBvcnQgc3lzCitpbXBvcnQgaW5zcGVjdAorCitmcm9tIGFudGxyMyBpbXBvcnQgY29tcGF0aWJsZV9hcGlfdmVyc2lvbnMKK2Zyb20gYW50bHIzLmNvbnN0YW50cyBpbXBvcnQgREVGQVVMVF9DSEFOTkVMLCBISURERU5fQ0hBTk5FTCwgRU9GLCBcCisgICAgIEVPUl9UT0tFTl9UWVBFLCBJTlZBTElEX1RPS0VOX1RZUEUKK2Zyb20gYW50bHIzLmV4Y2VwdGlvbnMgaW1wb3J0IFJlY29nbml0aW9uRXhjZXB0aW9uLCBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24sIFwKKyAgICAgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uLCBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24sIFwKKyAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24sIEVhcmx5RXhpdEV4Y2VwdGlvbiwgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiwgXAorICAgICBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLCBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24sIFwKKyAgICAgQmFja3RyYWNraW5nRmFpbGVkLCBVbndhbnRlZFRva2VuRXhjZXB0aW9uLCBNaXNzaW5nVG9rZW5FeGNlcHRpb24KK2Zyb20gYW50bHIzLnRva2VucyBpbXBvcnQgQ29tbW9uVG9rZW4sIFNLSVBfVE9LRU4KK2Zyb20gYW50bHIzLmNvbXBhdCBpbXBvcnQgc2V0LCBmcm96ZW5zZXQsIHJldmVyc2VkCisKKworY2xhc3MgUmVjb2duaXplclNoYXJlZFN0YXRlKG9iamVjdCk6CisgICAgIiIiCisgICAgVGhlIHNldCBvZiBmaWVsZHMgbmVlZGVkIGJ5IGFuIGFic3RyYWN0IHJlY29nbml6ZXIgdG8gcmVjb2duaXplIGlucHV0CisgICAgYW5kIHJlY292ZXIgZnJvbSBlcnJvcnMgZXRjLi4uICBBcyBhIHNlcGFyYXRlIHN0YXRlIG9iamVjdCwgaXQgY2FuIGJlCisgICAgc2hhcmVkIGFtb25nIG11bHRpcGxlIGdyYW1tYXJzOyBlLmcuLCB3aGVuIG9uZSBncmFtbWFyIGltcG9ydHMgYW5vdGhlci4KKworICAgIFRoZXNlIGZpZWxkcyBhcmUgcHVibGljYWxseSB2aXNpYmxlIGJ1dCB0aGUgYWN0dWFsIHN0YXRlIHBvaW50ZXIgcGVyCisgICAgcGFyc2VyIGlzIHByb3RlY3RlZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBUcmFjayB0aGUgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhbnkgcnVsZSBpbnZvY2F0aW9uLgorICAgICAgICAjIFN0YWNrIGdyb3dzIHVwd2FyZHMuCisgICAgICAgIHNlbGYuZm9sbG93aW5nID0gW10KKworICAgICAgICAjIFRoaXMgaXMgdHJ1ZSB3aGVuIHdlIHNlZSBhbiBlcnJvciBhbmQgYmVmb3JlIGhhdmluZyBzdWNjZXNzZnVsbHkKKyAgICAgICAgIyBtYXRjaGVkIGEgdG9rZW4uICBQcmV2ZW50cyBnZW5lcmF0aW9uIG9mIG1vcmUgdGhhbiBvbmUgZXJyb3IgbWVzc2FnZQorICAgICAgICAjIHBlciBlcnJvci4KKyAgICAgICAgc2VsZi5lcnJvclJlY292ZXJ5ID0gRmFsc2UKKworICAgICAgICAjIFRoZSBpbmRleCBpbnRvIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgdGhlIGxhc3QgZXJyb3Igb2NjdXJyZWQuCisgICAgICAgICMgVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlcmUgYW4gZXJyb3IgaXMgZm91bmQKKyAgICAgICAgIyBidXQgbm8gdG9rZW4gaXMgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5Li4uYW5vdGhlciBlcnJvciBpcyBmb3VuZCwKKyAgICAgICAgIyBhZCBuYXNldW0uICBUaGlzIGlzIGEgZmFpbHNhZmUgbWVjaGFuaXNtIHRvIGd1YXJhbnRlZSB0aGF0IGF0IGxlYXN0CisgICAgICAgICMgb25lIHRva2VuL3RyZWUgbm9kZSBpcyBjb25zdW1lZCBmb3IgdHdvIGVycm9ycy4KKyAgICAgICAgc2VsZi5sYXN0RXJyb3JJbmRleCA9IC0xCisKKyAgICAgICAgIyBJZiAwLCBubyBiYWNrdHJhY2tpbmcgaXMgZ29pbmcgb24uICBTYWZlIHRvIGV4ZWMgYWN0aW9ucyBldGMuLi4KKyAgICAgICAgIyBJZiA+MCB0aGVuIGl0J3MgdGhlIGxldmVsIG9mIGJhY2t0cmFja2luZy4KKyAgICAgICAgc2VsZi5iYWNrdHJhY2tpbmcgPSAwCisKKyAgICAgICAgIyBBbiBhcnJheVtzaXplIG51bSBydWxlc10gb2YgTWFwPEludGVnZXIsSW50ZWdlcj4gdGhhdCB0cmFja3MKKyAgICAgICAgIyB0aGUgc3RvcCB0b2tlbiBpbmRleCBmb3IgZWFjaCBydWxlLiAgcnVsZU1lbW9bcnVsZUluZGV4XSBpcworICAgICAgICAjIHRoZSBtZW1vaXphdGlvbiB0YWJsZSBmb3IgcnVsZUluZGV4LiAgRm9yIGtleSBydWxlU3RhcnRJbmRleCwgeW91CisgICAgICAgICMgZ2V0IGJhY2sgdGhlIHN0b3AgdG9rZW4gZm9yIGFzc29jaWF0ZWQgcnVsZSBvciBNRU1PX1JVTEVfRkFJTEVELgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBpcyBvbmx5IHVzZWQgaWYgcnVsZSBtZW1vaXphdGlvbiBpcyBvbiAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdCkuCisgICAgICAgIHNlbGYucnVsZU1lbW8gPSBOb25lCisKKyAgICAgICAgIyMgRGlkIHRoZSByZWNvZ25pemVyIGVuY291bnRlciBhIHN5bnRheCBlcnJvcj8gIFRyYWNrIGhvdyBtYW55LgorICAgICAgICBzZWxmLnN5bnRheEVycm9ycyA9IDAKKworCisgICAgICAgICMgTEVYRVIgRklFTERTIChtdXN0IGJlIGluIHNhbWUgc3RhdGUgb2JqZWN0IHRvIGF2b2lkIGNhc3RpbmcKKyAgICAgICAgIyBjb25zdGFudGx5IGluIGdlbmVyYXRlZCBjb2RlIGFuZCBMZXhlciBvYmplY3QpIDooCisKKworCSMjIFRoZSBnb2FsIG9mIGFsbCBsZXhlciBydWxlcy9tZXRob2RzIGlzIHRvIGNyZWF0ZSBhIHRva2VuIG9iamVjdC4KKyAgICAgICAgIyBUaGlzIGlzIGFuIGluc3RhbmNlIHZhcmlhYmxlIGFzIG11bHRpcGxlIHJ1bGVzIG1heSBjb2xsYWJvcmF0ZSB0bworICAgICAgICAjIGNyZWF0ZSBhIHNpbmdsZSB0b2tlbi4gIG5leHRUb2tlbiB3aWxsIHJldHVybiB0aGlzIG9iamVjdCBhZnRlcgorICAgICAgICAjIG1hdGNoaW5nIGxleGVyIHJ1bGUocykuICBJZiB5b3Ugc3ViY2xhc3MgdG8gYWxsb3cgbXVsdGlwbGUgdG9rZW4KKyAgICAgICAgIyBlbWlzc2lvbnMsIHRoZW4gc2V0IHRoaXMgdG8gdGhlIGxhc3QgdG9rZW4gdG8gYmUgbWF0Y2hlZCBvcgorICAgICAgICAjIHNvbWV0aGluZyBub25udWxsIHNvIHRoYXQgdGhlIGF1dG8gdG9rZW4gZW1pdCBtZWNoYW5pc20gd2lsbCBub3QKKyAgICAgICAgIyBlbWl0IGFub3RoZXIgdG9rZW4uCisgICAgICAgIHNlbGYudG9rZW4gPSBOb25lCisKKyAgICAgICAgIyMgV2hhdCBjaGFyYWN0ZXIgaW5kZXggaW4gdGhlIHN0cmVhbSBkaWQgdGhlIGN1cnJlbnQgdG9rZW4gc3RhcnQgYXQ/CisgICAgICAgICMgTmVlZGVkLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSB0ZXh0IGZvciBjdXJyZW50IHRva2VuLiAgU2V0IGF0CisgICAgICAgICMgdGhlIHN0YXJ0IG9mIG5leHRUb2tlbi4KKyAgICAgICAgc2VsZi50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTEKKworICAgICAgICAjIyBUaGUgbGluZSBvbiB3aGljaCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB0b2tlbiByZXNpZGVzCisgICAgICAgIHNlbGYudG9rZW5TdGFydExpbmUgPSBOb25lCisKKyAgICAgICAgIyMgVGhlIGNoYXJhY3RlciBwb3NpdGlvbiBvZiBmaXJzdCBjaGFyYWN0ZXIgd2l0aGluIHRoZSBsaW5lCisgICAgICAgIHNlbGYudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IE5vbmUKKworICAgICAgICAjIyBUaGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoZSBjdXJyZW50IHRva2VuCisgICAgICAgIHNlbGYuY2hhbm5lbCA9IE5vbmUKKworICAgICAgICAjIyBUaGUgdG9rZW4gdHlwZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW4KKyAgICAgICAgc2VsZi50eXBlID0gTm9uZQorCisgICAgICAgICMjIFlvdSBjYW4gc2V0IHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCB0b2tlbiB0byBvdmVycmlkZSB3aGF0IGlzIGluCisgICAgICAgICMgdGhlIGlucHV0IGNoYXIgYnVmZmVyLiAgVXNlIHNldFRleHQoKSBvciBjYW4gc2V0IHRoaXMgaW5zdGFuY2UgdmFyLgorICAgICAgICBzZWxmLnRleHQgPSBOb25lCisKKworY2xhc3MgQmFzZVJlY29nbml6ZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBAYnJpZWYgQ29tbW9uIHJlY29nbml6ZXIgZnVuY3Rpb25hbGl0eS4KKworICAgIEEgZ2VuZXJpYyByZWNvZ25pemVyIHRoYXQgY2FuIGhhbmRsZSByZWNvZ25pemVycyBnZW5lcmF0ZWQgZnJvbQorICAgIGxleGVyLCBwYXJzZXIsIGFuZCB0cmVlIGdyYW1tYXJzLiAgVGhpcyBpcyBhbGwgdGhlIHBhcnNpbmcKKyAgICBzdXBwb3J0IGNvZGUgZXNzZW50aWFsbHk7IG1vc3Qgb2YgaXQgaXMgZXJyb3IgcmVjb3Zlcnkgc3R1ZmYgYW5kCisgICAgYmFja3RyYWNraW5nLgorICAgICIiIgorCisgICAgTUVNT19SVUxFX0ZBSUxFRCA9IC0yCisgICAgTUVNT19SVUxFX1VOS05PV04gPSAtMQorCisgICAgIyBjb3BpZXMgZnJvbSBUb2tlbiBvYmplY3QgZm9yIGNvbnZlbmllbmNlIGluIGFjdGlvbnMKKyAgICBERUZBVUxUX1RPS0VOX0NIQU5ORUwgPSBERUZBVUxUX0NIQU5ORUwKKworICAgICMgZm9yIGNvbnZlbmllbmNlIGluIGFjdGlvbnMKKyAgICBISURERU4gPSBISURERU5fQ0hBTk5FTAorCisgICAgIyBvdmVycmlkZGVuIGJ5IGdlbmVyYXRlZCBzdWJjbGFzc2VzCisgICAgdG9rZW5OYW1lcyA9IE5vbmUKKworICAgICMgVGhlIGFwaV92ZXJzaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIDMuMy4gSWYgaXQgaXMgbm90CisgICAgIyBvdmVyd3JpdHRlbiBpbiB0aGUgZ2VuZXJhdGVkIHJlY29nbml6ZXIsIHdlIGFzc3VtZSBhIGRlZmF1bHQgb2YgdjAuCisgICAgYXBpX3ZlcnNpb24gPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhdGU9Tm9uZSk6CisgICAgICAgICMgSW5wdXQgc3RyZWFtIG9mIHRoZSByZWNvZ25pemVyLiBNdXN0IGJlIGluaXRpYWxpemVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICAgIHNlbGYuaW5wdXQgPSBOb25lCisKKyAgICAgICAgIyMgU3RhdGUgb2YgYSBsZXhlciwgcGFyc2VyLCBvciB0cmVlIHBhcnNlciBhcmUgY29sbGVjdGVkIGludG8gYSBzdGF0ZQorICAgICAgICAjIG9iamVjdCBzbyB0aGUgc3RhdGUgY2FuIGJlIHNoYXJlZC4gIFRoaXMgc2hhcmluZyBpcyBuZWVkZWQgdG8KKyAgICAgICAgIyBoYXZlIG9uZSBncmFtbWFyIGltcG9ydCBvdGhlcnMgYW5kIHNoYXJlIHNhbWUgZXJyb3IgdmFyaWFibGVzCisgICAgICAgICMgYW5kIG90aGVyIHN0YXRlIHZhcmlhYmxlcy4gIEl0J3MgYSBraW5kIG9mIGV4cGxpY2l0IG11bHRpcGxlCisgICAgICAgICMgaW5oZXJpdGFuY2UgdmlhIGRlbGVnYXRpb24gb2YgbWV0aG9kcyBhbmQgc2hhcmVkIHN0YXRlLgorICAgICAgICBpZiBzdGF0ZSBpcyBOb25lOgorICAgICAgICAgICAgc3RhdGUgPSBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKQorICAgICAgICBzZWxmLl9zdGF0ZSA9IHN0YXRlCisKKyAgICAgICAgaWYgc2VsZi5hcGlfdmVyc2lvbiBub3QgaW4gY29tcGF0aWJsZV9hcGlfdmVyc2lvbnM6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgKCJBTlRMUiB2ZXJzaW9uIG1pc21hdGNoOiAiCisgICAgICAgICAgICAgICAgICJUaGUgcmVjb2duaXplciBoYXMgYmVlbiBnZW5lcmF0ZWQgd2l0aCBBUEkgViVzLCAiCisgICAgICAgICAgICAgICAgICJidXQgdGhpcyBydW50aW1lIGRvZXMgbm90IHN1cHBvcnQgdGhpcy4iKQorICAgICAgICAgICAgICAgICUgc2VsZi5hcGlfdmVyc2lvbikKKworICAgICMgdGhpcyBvbmUgb25seSBleGlzdHMgdG8gc2h1dCB1cCBweWxpbnQgOigKKyAgICBkZWYgc2V0SW5wdXQoc2VsZiwgaW5wdXQpOgorICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKworCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcmVzZXQgdGhlIHBhcnNlcidzIHN0YXRlOyBzdWJjbGFzc2VzIG11c3QgcmV3aW5kcyB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICIiIgorCisgICAgICAgICMgd2FjayBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgaWYgc2VsZi5fc3RhdGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgbm8gc2hhcmVkIHN0YXRlIHdvcmsgdG8gZG8KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX3N0YXRlLmZvbGxvd2luZyA9IFtdCisgICAgICAgIHNlbGYuX3N0YXRlLmVycm9yUmVjb3ZlcnkgPSBGYWxzZQorICAgICAgICBzZWxmLl9zdGF0ZS5sYXN0RXJyb3JJbmRleCA9IC0xCisgICAgICAgIHNlbGYuX3N0YXRlLnN5bnRheEVycm9ycyA9IDAKKyAgICAgICAgIyB3YWNrIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBiYWNrdHJhY2tpbmcgYW5kIG1lbW9pemF0aW9uCisgICAgICAgIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA9IDAKKyAgICAgICAgaWYgc2VsZi5fc3RhdGUucnVsZU1lbW8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9zdGF0ZS5ydWxlTWVtbyA9IHt9CisKKworICAgIGRlZiBtYXRjaChzZWxmLCBpbnB1dCwgdHR5cGUsIGZvbGxvdyk6CisgICAgICAgICIiIgorICAgICAgICBNYXRjaCBjdXJyZW50IGlucHV0IHN5bWJvbCBhZ2FpbnN0IHR0eXBlLiAgQXR0ZW1wdAorICAgICAgICBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uIGVycm9yIHJlY292ZXJ5LiAgSWYKKyAgICAgICAgdGhhdCBmYWlscywgdGhyb3cgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLgorCisgICAgICAgIFRvIHR1cm4gb2ZmIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gb3IgZGVsZXRpb24gZXJyb3IKKyAgICAgICAgcmVjb3ZlcnksIG92ZXJyaWRlIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKCkgYW5kIGhhdmUgaXQKKyAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLiBTZWUgVHJlZVBhcnNlci5yZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbigpLgorICAgICAgICBUaGlzIHdheSBhbnkgZXJyb3IgaW4gYSBydWxlIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uIGFuZAorICAgICAgICBpbW1lZGlhdGUgZXhpdCBmcm9tIHJ1bGUuICBSdWxlIHdvdWxkIHJlY292ZXIgYnkgcmVzeW5jaHJvbml6aW5nCisgICAgICAgIHRvIHRoZSBzZXQgb2Ygc3ltYm9scyB0aGF0IGNhbiBmb2xsb3cgcnVsZSByZWYuCisgICAgICAgICIiIgorCisgICAgICAgIG1hdGNoZWRTeW1ib2wgPSBzZWxmLmdldEN1cnJlbnRJbnB1dFN5bWJvbChpbnB1dCkKKyAgICAgICAgaWYgc2VsZi5pbnB1dC5MQSgxKSA9PSB0dHlwZToKKyAgICAgICAgICAgIHNlbGYuaW5wdXQuY29uc3VtZSgpCisgICAgICAgICAgICBzZWxmLl9zdGF0ZS5lcnJvclJlY292ZXJ5ID0gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVkU3ltYm9sCisKKyAgICAgICAgaWYgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID4gMDoKKyAgICAgICAgICAgICMgRklYTUU6IG5lZWQgdG8gcmV0dXJuIG1hdGNoZWRTeW1ib2wgaGVyZSBhcyB3ZWxsLiBkYW1uISEKKyAgICAgICAgICAgIHJhaXNlIEJhY2t0cmFja2luZ0ZhaWxlZAorCisgICAgICAgIG1hdGNoZWRTeW1ib2wgPSBzZWxmLnJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKGlucHV0LCB0dHlwZSwgZm9sbG93KQorICAgICAgICByZXR1cm4gbWF0Y2hlZFN5bWJvbAorCisKKyAgICBkZWYgbWF0Y2hBbnkoc2VsZiwgaW5wdXQpOgorICAgICAgICAiIiJNYXRjaCB0aGUgd2lsZGNhcmQ6IGluIGEgc3ltYm9sIiIiCisKKyAgICAgICAgc2VsZi5fc3RhdGUuZXJyb3JSZWNvdmVyeSA9IEZhbHNlCisgICAgICAgIHNlbGYuaW5wdXQuY29uc3VtZSgpCisKKworICAgIGRlZiBtaXNtYXRjaElzVW53YW50ZWRUb2tlbihzZWxmLCBpbnB1dCwgdHR5cGUpOgorICAgICAgICByZXR1cm4gaW5wdXQuTEEoMikgPT0gdHR5cGUKKworCisgICAgZGVmIG1pc21hdGNoSXNNaXNzaW5nVG9rZW4oc2VsZiwgaW5wdXQsIGZvbGxvdyk6CisgICAgICAgIGlmIGZvbGxvdyBpcyBOb25lOgorICAgICAgICAgICAgIyB3ZSBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb2xsb3c7IHdlIGNhbiBvbmx5IGNvbnN1bWUKKyAgICAgICAgICAgICMgYSBzaW5nbGUgdG9rZW4gYW5kIGhvcGUgZm9yIHRoZSBiZXN0CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIGNvbXB1dGUgd2hhdCBjYW4gZm9sbG93IHRoaXMgZ3JhbW1hciBlbGVtZW50IHJlZmVyZW5jZQorICAgICAgICBpZiBFT1JfVE9LRU5fVFlQRSBpbiBmb2xsb3c6CisgICAgICAgICAgICB2aWFibGVUb2tlbnNGb2xsb3dpbmdUaGlzUnVsZSA9IHNlbGYuY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKCkKKyAgICAgICAgICAgIGZvbGxvdyA9IGZvbGxvdyB8IHZpYWJsZVRva2Vuc0ZvbGxvd2luZ1RoaXNSdWxlCisKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl9zdGF0ZS5mb2xsb3dpbmcpID4gMDoKKyAgICAgICAgICAgICAgICAjIHJlbW92ZSBFT1IgaWYgd2UncmUgbm90IHRoZSBzdGFydCBzeW1ib2wKKyAgICAgICAgICAgICAgICBmb2xsb3cgPSBmb2xsb3cgLSBzZXQoW0VPUl9UT0tFTl9UWVBFXSkKKworICAgICAgICAjIGlmIGN1cnJlbnQgdG9rZW4gaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgY291bGQgY29tZSBhZnRlciBzZXQKKyAgICAgICAgIyB0aGVuIHdlIGtub3cgd2UncmUgbWlzc2luZyBhIHRva2VuOyBlcnJvciByZWNvdmVyeSBpcyBmcmVlIHRvCisgICAgICAgICMgImluc2VydCIgdGhlIG1pc3NpbmcgdG9rZW4KKyAgICAgICAgaWYgaW5wdXQuTEEoMSkgaW4gZm9sbG93IG9yIEVPUl9UT0tFTl9UWVBFIGluIGZvbGxvdzoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworICAgIGRlZiByZXBvcnRFcnJvcihzZWxmLCBlKToKKyAgICAgICAgIiIiUmVwb3J0IGEgcmVjb2duaXRpb24gcHJvYmxlbS4KKworICAgICAgICBUaGlzIG1ldGhvZCBzZXRzIGVycm9yUmVjb3ZlcnkgdG8gaW5kaWNhdGUgdGhlIHBhcnNlciBpcyByZWNvdmVyaW5nCisgICAgICAgIG5vdCBwYXJzaW5nLiAgT25jZSBpbiByZWNvdmVyeSBtb2RlLCBubyBlcnJvcnMgYXJlIGdlbmVyYXRlZC4KKyAgICAgICAgVG8gZ2V0IG91dCBvZiByZWNvdmVyeSBtb2RlLCB0aGUgcGFyc2VyIG11c3Qgc3VjY2Vzc2Z1bGx5IG1hdGNoCisgICAgICAgIGEgdG9rZW4gKGFmdGVyIGEgcmVzeW5jKS4gIFNvIGl0IHdpbGwgZ286CisKKyAgICAgICAgMS4gZXJyb3Igb2NjdXJzCisgICAgICAgIDIuIGVudGVyIHJlY292ZXJ5IG1vZGUsIHJlcG9ydCBlcnJvcgorICAgICAgICAzLiBjb25zdW1lIHVudGlsIHRva2VuIGZvdW5kIGluIHJlc3luY2ggc2V0CisgICAgICAgIDQuIHRyeSB0byByZXN1bWUgcGFyc2luZworICAgICAgICA1LiBuZXh0IG1hdGNoKCkgd2lsbCByZXNldCBlcnJvclJlY292ZXJ5IG1vZGUKKworICAgICAgICBJZiB5b3Ugb3ZlcnJpZGUsIG1ha2Ugc3VyZSB0byB1cGRhdGUgc3ludGF4RXJyb3JzIGlmIHlvdSBjYXJlIGFib3V0CisgICAgICAgIHRoYXQuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBpZiB3ZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yIGFuZCBoYXZlIG5vdCBtYXRjaGVkIGEgdG9rZW4KKyAgICAgICAgIyB5ZXQgc3VjY2Vzc2Z1bGx5LCBkb24ndCByZXBvcnQgYW55IGVycm9ycy4KKyAgICAgICAgaWYgc2VsZi5fc3RhdGUuZXJyb3JSZWNvdmVyeToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX3N0YXRlLnN5bnRheEVycm9ycyArPSAxICMgZG9uJ3QgY291bnQgc3B1cmlvdXMKKyAgICAgICAgc2VsZi5fc3RhdGUuZXJyb3JSZWNvdmVyeSA9IFRydWUKKworICAgICAgICBzZWxmLmRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKHNlbGYudG9rZW5OYW1lcywgZSkKKworCisgICAgZGVmIGRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKHNlbGYsIHRva2VuTmFtZXMsIGUpOgorICAgICAgICBoZHIgPSBzZWxmLmdldEVycm9ySGVhZGVyKGUpCisgICAgICAgIG1zZyA9IHNlbGYuZ2V0RXJyb3JNZXNzYWdlKGUsIHRva2VuTmFtZXMpCisgICAgICAgIHNlbGYuZW1pdEVycm9yTWVzc2FnZShoZHIrIiAiK21zZykKKworCisgICAgZGVmIGdldEVycm9yTWVzc2FnZShzZWxmLCBlLCB0b2tlbk5hbWVzKToKKyAgICAgICAgIiIiCisgICAgICAgIFdoYXQgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvciB0aGUgdmFyaW91cworICAgICAgICBleGNlcHRpb24gdHlwZXM/CisKKyAgICAgICAgTm90IHZlcnkgb2JqZWN0LW9yaWVudGVkIGNvZGUsIGJ1dCBJIGxpa2UgaGF2aW5nIGFsbCBlcnJvciBtZXNzYWdlCisgICAgICAgIGdlbmVyYXRpb24gd2l0aGluIG9uZSBtZXRob2QgcmF0aGVyIHRoYW4gc3ByZWFkIGFtb25nIGFsbCBvZiB0aGUKKyAgICAgICAgZXhjZXB0aW9uIGNsYXNzZXMuIFRoaXMgYWxzbyBtYWtlcyBpdCBtdWNoIGVhc2llciBmb3IgdGhlIGV4Y2VwdGlvbgorICAgICAgICBoYW5kbGluZyBiZWNhdXNlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBkbyBub3QgaGF2ZSB0byBoYXZlIHBvaW50ZXJzIGJhY2sKKyAgICAgICAgdG8gdGhpcyBvYmplY3QgdG8gYWNjZXNzIHV0aWxpdHkgcm91dGluZXMgYW5kIHNvIG9uLiBBbHNvLCBjaGFuZ2luZworICAgICAgICB0aGUgbWVzc2FnZSBmb3IgYW4gZXhjZXB0aW9uIHR5cGUgd291bGQgYmUgZGlmZmljdWx0IGJlY2F1c2UgeW91CisgICAgICAgIHdvdWxkIGhhdmUgdG8gc3ViY2xhc3NpbmcgZXhjZXB0aW9uLCBidXQgdGhlbiBzb21laG93IGdldCBBTlRMUgorICAgICAgICB0byBtYWtlIHRob3NlIGtpbmRzIG9mIGV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuCisgICAgICAgIFRoaXMgbG9va3Mgd2VpcmQsIGJ1dCB0cnVzdCBtZS0taXQgbWFrZXMgdGhlIG1vc3Qgc2Vuc2UgaW4gdGVybXMKKyAgICAgICAgb2YgZmxleGliaWxpdHkuCisKKyAgICAgICAgRm9yIGdyYW1tYXIgZGVidWdnaW5nLCB5b3Ugd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoaXMgdG8gYWRkCisgICAgICAgIG1vcmUgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhY2sgZnJhbWUgd2l0aAorICAgICAgICBnZXRSdWxlSW52b2NhdGlvblN0YWNrKGUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpIGFuZCwKKyAgICAgICAgZm9yIG5vIHZpYWJsZSBhbHRzLCB0aGUgZGVjaXNpb24gZGVzY3JpcHRpb24gYW5kIHN0YXRlIGV0Yy4uLgorCisgICAgICAgIE92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBtZXNzYWdlIGdlbmVyYXRlZCBmb3Igb25lIG9yIG1vcmUKKyAgICAgICAgZXhjZXB0aW9uIHR5cGVzLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBpc2luc3RhbmNlKGUsIFVud2FudGVkVG9rZW5FeGNlcHRpb24pOgorICAgICAgICAgICAgdG9rZW5OYW1lID0gIjx1bmtub3duPiIKKyAgICAgICAgICAgIGlmIGUuZXhwZWN0aW5nID09IEVPRjoKKyAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSAiRU9GIgorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9IHNlbGYudG9rZW5OYW1lc1tlLmV4cGVjdGluZ10KKworICAgICAgICAgICAgbXNnID0gImV4dHJhbmVvdXMgaW5wdXQgJXMgZXhwZWN0aW5nICVzIiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLmdldFRva2VuRXJyb3JEaXNwbGF5KGUuZ2V0VW5leHBlY3RlZFRva2VuKCkpLAorICAgICAgICAgICAgICAgIHRva2VuTmFtZQorICAgICAgICAgICAgICAgICkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHRva2VuTmFtZSA9ICI8dW5rbm93bj4iCisgICAgICAgICAgICBpZiBlLmV4cGVjdGluZyA9PSBFT0Y6CisgICAgICAgICAgICAgICAgdG9rZW5OYW1lID0gIkVPRiIKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0b2tlbk5hbWUgPSBzZWxmLnRva2VuTmFtZXNbZS5leHBlY3RpbmddCisKKyAgICAgICAgICAgIG1zZyA9ICJtaXNzaW5nICVzIGF0ICVzIiAlICgKKyAgICAgICAgICAgICAgICB0b2tlbk5hbWUsIHNlbGYuZ2V0VG9rZW5FcnJvckRpc3BsYXkoZS50b2tlbikKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbik6CisgICAgICAgICAgICB0b2tlbk5hbWUgPSAiPHVua25vd24+IgorICAgICAgICAgICAgaWYgZS5leHBlY3RpbmcgPT0gRU9GOgorICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9ICJFT0YiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9IHNlbGYudG9rZW5OYW1lc1tlLmV4cGVjdGluZ10KKworICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgaW5wdXQgIiBcCisgICAgICAgICAgICAgICAgICArIHNlbGYuZ2V0VG9rZW5FcnJvckRpc3BsYXkoZS50b2tlbikgXAorICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGluZyAiIFwKKyAgICAgICAgICAgICAgICAgICsgdG9rZW5OYW1lCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbik6CisgICAgICAgICAgICB0b2tlbk5hbWUgPSAiPHVua25vd24+IgorICAgICAgICAgICAgaWYgZS5leHBlY3RpbmcgPT0gRU9GOgorICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9ICJFT0YiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRva2VuTmFtZSA9IHNlbGYudG9rZW5OYW1lc1tlLmV4cGVjdGluZ10KKworICAgICAgICAgICAgbXNnID0gIm1pc21hdGNoZWQgdHJlZSBub2RlOiAlcyBleHBlY3RpbmcgJXMiIFwKKyAgICAgICAgICAgICAgICAgICUgKGUubm9kZSwgdG9rZW5OYW1lKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBOb1ZpYWJsZUFsdEV4Y2VwdGlvbik6CisgICAgICAgICAgICBtc2cgPSAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICIgXAorICAgICAgICAgICAgICAgICAgKyBzZWxmLmdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIEVhcmx5RXhpdEV4Y2VwdGlvbik6CisgICAgICAgICAgICBtc2cgPSAicmVxdWlyZWQgKC4uLikrIGxvb3AgZGlkIG5vdCBtYXRjaCBhbnl0aGluZyBhdCBpbnB1dCAiIFwKKyAgICAgICAgICAgICAgICAgICsgc2VsZi5nZXRUb2tlbkVycm9yRGlzcGxheShlLnRva2VuKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKToKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGlucHV0ICIgXAorICAgICAgICAgICAgICAgICAgKyBzZWxmLmdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pIFwKKyAgICAgICAgICAgICAgICAgICsgIiBleHBlY3Rpbmcgc2V0ICIgXAorICAgICAgICAgICAgICAgICAgKyByZXByKGUuZXhwZWN0aW5nKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uKToKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGlucHV0ICIgXAorICAgICAgICAgICAgICAgICAgKyBzZWxmLmdldFRva2VuRXJyb3JEaXNwbGF5KGUudG9rZW4pIFwKKyAgICAgICAgICAgICAgICAgICsgIiBleHBlY3Rpbmcgc2V0ICIgXAorICAgICAgICAgICAgICAgICAgKyByZXByKGUuZXhwZWN0aW5nKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24pOgorICAgICAgICAgICAgbXNnID0gInJ1bGUgIiBcCisgICAgICAgICAgICAgICAgICArIGUucnVsZU5hbWUgXAorICAgICAgICAgICAgICAgICAgKyAiIGZhaWxlZCBwcmVkaWNhdGU6IHsiIFwKKyAgICAgICAgICAgICAgICAgICsgZS5wcmVkaWNhdGVUZXh0IFwKKyAgICAgICAgICAgICAgICAgICsgIn0/IgorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSBzdHIoZSkKKworICAgICAgICByZXR1cm4gbXNnCisKKworICAgIGRlZiBnZXROdW1iZXJPZlN5bnRheEVycm9ycyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBudW1iZXIgb2YgcmVjb2duaXRpb24gZXJyb3JzIChsZXhlciwgcGFyc2VyLCB0cmVlIHBhcnNlcikuICBFYWNoCisgICAgICAgIHJlY29nbml6ZXIgdHJhY2tzIGl0cyBvd24gbnVtYmVyLiAgU28gcGFyc2VyIGFuZCBsZXhlciBlYWNoIGhhdmUKKyAgICAgICAgc2VwYXJhdGUgY291bnQuICBEb2VzIG5vdCBjb3VudCB0aGUgc3B1cmlvdXMgZXJyb3JzIGZvdW5kIGJldHdlZW4KKyAgICAgICAgYW4gZXJyb3IgYW5kIG5leHQgdmFsaWQgdG9rZW4gbWF0Y2gKKworICAgICAgICBTZWUgYWxzbyByZXBvcnRFcnJvcigpCisJIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZS5zeW50YXhFcnJvcnMKKworCisgICAgZGVmIGdldEVycm9ySGVhZGVyKHNlbGYsIGUpOgorICAgICAgICAiIiIKKyAgICAgICAgV2hhdCBpcyB0aGUgZXJyb3IgaGVhZGVyLCBub3JtYWxseSBsaW5lL2NoYXJhY3RlciBwb3NpdGlvbiBpbmZvcm1hdGlvbj8KKyAgICAgICAgIiIiCisKKyAgICAgICAgc291cmNlX25hbWUgPSBzZWxmLmdldFNvdXJjZU5hbWUoKQorICAgICAgICBpZiBzb3VyY2VfbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiJXMgbGluZSAlZDolZCIgJSAoc291cmNlX25hbWUsIGUubGluZSwgZS5jaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgIHJldHVybiAibGluZSAlZDolZCIgJSAoZS5saW5lLCBlLmNoYXJQb3NpdGlvbkluTGluZSkKKworCisgICAgZGVmIGdldFRva2VuRXJyb3JEaXNwbGF5KHNlbGYsIHQpOgorICAgICAgICAiIiIKKyAgICAgICAgSG93IHNob3VsZCBhIHRva2VuIGJlIGRpc3BsYXllZCBpbiBhbiBlcnJvciBtZXNzYWdlPyBUaGUgZGVmYXVsdAorICAgICAgICBpcyB0byBkaXNwbGF5IGp1c3QgdGhlIHRleHQsIGJ1dCBkdXJpbmcgZGV2ZWxvcG1lbnQgeW91IG1pZ2h0CisgICAgICAgIHdhbnQgdG8gaGF2ZSBhIGxvdCBvZiBpbmZvcm1hdGlvbiBzcGl0IG91dC4gIE92ZXJyaWRlIGluIHRoYXQgY2FzZQorICAgICAgICB0byB1c2UgdC50b1N0cmluZygpICh3aGljaCwgZm9yIENvbW1vblRva2VuLCBkdW1wcyBldmVyeXRoaW5nIGFib3V0CisgICAgICAgIHRoZSB0b2tlbikuIFRoaXMgaXMgYmV0dGVyIHRoYW4gZm9yY2luZyB5b3UgdG8gb3ZlcnJpZGUgYSBtZXRob2QgaW4KKyAgICAgICAgeW91ciB0b2tlbiBvYmplY3RzIGJlY2F1c2UgeW91IGRvbid0IGhhdmUgdG8gZ28gbW9kaWZ5IHlvdXIgbGV4ZXIKKyAgICAgICAgc28gdGhhdCBpdCBjcmVhdGVzIGEgbmV3IEphdmEgdHlwZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcyA9IHQudGV4dAorICAgICAgICBpZiBzIGlzIE5vbmU6CisgICAgICAgICAgICBpZiB0LnR5cGUgPT0gRU9GOgorICAgICAgICAgICAgICAgIHMgPSAiPEVPRj4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHMgPSAiPCIrdC50eXBlKyI+IgorCisgICAgICAgIHJldHVybiByZXByKHMpCisKKworICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICIiIk92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB3aGVyZSBlcnJvciBtZXNzYWdlcyBnbyIiIgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZyArICdcbicpCisKKworICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICIiIgorICAgICAgICBSZWNvdmVyIGZyb20gYW4gZXJyb3IgZm91bmQgb24gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgaXMKKyAgICAgICAgZm9yIE5vVmlhYmxlQWx0IGFuZCBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zLiAgSWYgeW91IGVuYWJsZQorICAgICAgICBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiwgdGhpcyB3aWxsIHVzdWFsbHkgbm90CisgICAgICAgIGhhbmRsZSBtaXNtYXRjaGVkIHN5bWJvbCBleGNlcHRpb25zIGJ1dCB0aGVyZSBjb3VsZCBiZSBhIG1pc21hdGNoZWQKKyAgICAgICAgdG9rZW4gdGhhdCB0aGUgbWF0Y2goKSByb3V0aW5lIGNvdWxkIG5vdCByZWNvdmVyIGZyb20uCisgICAgICAgICIiIgorCisgICAgICAgICMgUFJPQkxFTT8gd2hhdCBpZiBpbnB1dCBzdHJlYW0gaXMgbm90IHRoZSBzYW1lIGFzIGxhc3QgdGltZQorICAgICAgICAjIHBlcmhhcHMgbWFrZSBsYXN0RXJyb3JJbmRleCBhIG1lbWJlciBvZiBpbnB1dAorICAgICAgICBpZiBzZWxmLl9zdGF0ZS5sYXN0RXJyb3JJbmRleCA9PSBpbnB1dC5pbmRleCgpOgorICAgICAgICAgICAgIyB1aCBvaCwgYW5vdGhlciBlcnJvciBhdCBzYW1lIHRva2VuIGluZGV4OyBtdXN0IGJlIGEgY2FzZQorICAgICAgICAgICAgIyB3aGVyZSBMVCgxKSBpcyBpbiB0aGUgcmVjb3ZlcnkgdG9rZW4gc2V0IHNvIG5vdGhpbmcgaXMKKyAgICAgICAgICAgICMgY29uc3VtZWQ7IGNvbnN1bWUgYSBzaW5nbGUgdG9rZW4gc28gYXQgbGVhc3QgdG8gcHJldmVudAorICAgICAgICAgICAgIyBhbiBpbmZpbml0ZSBsb29wOyB0aGlzIGlzIGEgZmFpbHNhZmUuCisgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCkKKworICAgICAgICBzZWxmLl9zdGF0ZS5sYXN0RXJyb3JJbmRleCA9IGlucHV0LmluZGV4KCkKKyAgICAgICAgZm9sbG93U2V0ID0gc2VsZi5jb21wdXRlRXJyb3JSZWNvdmVyeVNldCgpCisKKyAgICAgICAgc2VsZi5iZWdpblJlc3luYygpCisgICAgICAgIHNlbGYuY29uc3VtZVVudGlsKGlucHV0LCBmb2xsb3dTZXQpCisgICAgICAgIHNlbGYuZW5kUmVzeW5jKCkKKworCisgICAgZGVmIGJlZ2luUmVzeW5jKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBob29rIHRvIGxpc3RlbiBpbiBvbiB0aGUgdG9rZW4gY29uc3VtcHRpb24gZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorICAgICAgICBUaGUgRGVidWdQYXJzZXIgc3ViY2xhc3NlcyB0aGlzIHRvIGZpcmUgZXZlbnRzIHRvIHRoZSBsaXN0ZW50ZXIuCisgICAgICAgICIiIgorCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIGVuZFJlc3luYyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgaG9vayB0byBsaXN0ZW4gaW4gb24gdGhlIHRva2VuIGNvbnN1bXB0aW9uIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAgICAgICAgVGhlIERlYnVnUGFyc2VyIHN1YmNsYXNzZXMgdGhpcyB0byBmaXJlIGV2ZW50cyB0byB0aGUgbGlzdGVudGVyLgorICAgICAgICAiIiIKKworICAgICAgICBwYXNzCisKKworICAgIGRlZiBjb21wdXRlRXJyb3JSZWNvdmVyeVNldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbXB1dGUgdGhlIGVycm9yIHJlY292ZXJ5IHNldCBmb3IgdGhlIGN1cnJlbnQgcnVsZS4gIER1cmluZworICAgICAgICBydWxlIGludm9jYXRpb24sIHRoZSBwYXJzZXIgcHVzaGVzIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuCisgICAgICAgIGZvbGxvdyB0aGF0IHJ1bGUgcmVmZXJlbmNlIG9uIHRoZSBzdGFjazsgdGhpcyBhbW91bnRzIHRvCisgICAgICAgIGNvbXB1dGluZyBGSVJTVCBvZiB3aGF0IGZvbGxvd3MgdGhlIHJ1bGUgcmVmZXJlbmNlIGluIHRoZQorICAgICAgICBlbmNsb3NpbmcgcnVsZS4gVGhpcyBsb2NhbCBmb2xsb3cgc2V0IG9ubHkgaW5jbHVkZXMgdG9rZW5zCisgICAgICAgIGZyb20gd2l0aGluIHRoZSBydWxlOyBpLmUuLCB0aGUgRklSU1QgY29tcHV0YXRpb24gZG9uZSBieQorICAgICAgICBBTlRMUiBzdG9wcyBhdCB0aGUgZW5kIG9mIGEgcnVsZS4KKworICAgICAgICBFWEFNUExFCisKKyAgICAgICAgV2hlbiB5b3UgZmluZCBhICJubyB2aWFibGUgYWx0IGV4Y2VwdGlvbiIsIHRoZSBpbnB1dCBpcyBub3QKKyAgICAgICAgY29uc2lzdGVudCB3aXRoIGFueSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGZvciBydWxlIHIuICBUaGUgYmVzdAorICAgICAgICB0aGluZyB0byBkbyBpcyB0byBjb25zdW1lIHRva2VucyB1bnRpbCB5b3Ugc2VlIHNvbWV0aGluZyB0aGF0CisgICAgICAgIGNhbiBsZWdhbGx5IGZvbGxvdyBhIGNhbGwgdG8gciAqb3IqIGFueSBydWxlIHRoYXQgY2FsbGVkIHIuCisgICAgICAgIFlvdSBkb24ndCB3YW50IHRoZSBleGFjdCBzZXQgb2YgdmlhYmxlIG5leHQgdG9rZW5zIGJlY2F1c2UgdGhlCisgICAgICAgIGlucHV0IG1pZ2h0IGp1c3QgYmUgbWlzc2luZyBhIHRva2VuLS15b3UgbWlnaHQgY29uc3VtZSB0aGUKKyAgICAgICAgcmVzdCBvZiB0aGUgaW5wdXQgbG9va2luZyBmb3Igb25lIG9mIHRoZSBtaXNzaW5nIHRva2Vucy4KKworICAgICAgICBDb25zaWRlciBncmFtbWFyOgorCisgICAgICAgIGEgOiAnWycgYiAnXScKKyAgICAgICAgICB8ICcoJyBiICcpJworICAgICAgICAgIDsKKyAgICAgICAgYiA6IGMgJ14nIElOVCA7CisgICAgICAgIGMgOiBJRAorICAgICAgICAgIHwgSU5UCisgICAgICAgICAgOworCisgICAgICAgIEF0IGVhY2ggcnVsZSBpbnZvY2F0aW9uLCB0aGUgc2V0IG9mIHRva2VucyB0aGF0IGNvdWxkIGZvbGxvdworICAgICAgICB0aGF0IHJ1bGUgaXMgcHVzaGVkIG9uIGEgc3RhY2suICBIZXJlIGFyZSB0aGUgdmFyaW91cyAibG9jYWwiCisgICAgICAgIGZvbGxvdyBzZXRzOgorCisgICAgICAgIEZPTExPVyhiMV9pbl9hKSA9IEZJUlNUKCddJykgPSAnXScKKyAgICAgICAgRk9MTE9XKGIyX2luX2EpID0gRklSU1QoJyknKSA9ICcpJworICAgICAgICBGT0xMT1coY19pbl9iKSA9IEZJUlNUKCdeJykgPSAnXicKKworICAgICAgICBVcG9uIGVycm9uZW91cyBpbnB1dCAiW10iLCB0aGUgY2FsbCBjaGFpbiBpcworCisgICAgICAgIGEgLT4gYiAtPiBjCisKKyAgICAgICAgYW5kLCBoZW5jZSwgdGhlIGZvbGxvdyBjb250ZXh0IHN0YWNrIGlzOgorCisgICAgICAgIGRlcHRoICBsb2NhbCBmb2xsb3cgc2V0ICAgICBhZnRlciBjYWxsIHRvIHJ1bGUKKyAgICAgICAgICAwICAgICAgICAgXDxFT0Y+ICAgICAgICAgICAgICAgICAgICBhIChmcm9tIG1haW4oKSkKKyAgICAgICAgICAxICAgICAgICAgICddJyAgICAgICAgICAgICAgICAgICAgIGIKKyAgICAgICAgICAzICAgICAgICAgICdeJyAgICAgICAgICAgICAgICAgICAgIGMKKworICAgICAgICBOb3RpY2UgdGhhdCAnKScgaXMgbm90IGluY2x1ZGVkLCBiZWNhdXNlIGIgd291bGQgaGF2ZSB0byBoYXZlCisgICAgICAgIGJlZW4gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCBpbiBydWxlIGEgZm9yICcpJyB0byBiZQorICAgICAgICBpbmNsdWRlZC4KKworICAgICAgICBGb3IgZXJyb3IgcmVjb3ZlcnksIHdlIGNhbm5vdCBjb25zaWRlciBGT0xMT1coYykKKyAgICAgICAgKGNvbnRleHQtc2Vuc2l0aXZlIG9yIG90aGVyd2lzZSkuICBXZSBuZWVkIHRoZSBjb21iaW5lZCBzZXQgb2YKKyAgICAgICAgYWxsIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXRzLS10aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdAorICAgICAgICBjb3VsZCBmb2xsb3cgYW55IHJlZmVyZW5jZSBpbiB0aGUgY2FsbCBjaGFpbi4gIFdlIG5lZWQgdG8KKyAgICAgICAgcmVzeW5jIHRvIG9uZSBvZiB0aG9zZSB0b2tlbnMuICBOb3RlIHRoYXQgRk9MTE9XKGMpPSdeJyBhbmQgaWYKKyAgICAgICAgd2UgcmVzeW5jJ2QgdG8gdGhhdCB0b2tlbiwgd2UnZCBjb25zdW1lIHVudGlsIEVPRi4gIFdlIG5lZWQgdG8KKyAgICAgICAgc3luYyB0byBjb250ZXh0LXNlbnNpdGl2ZSBGT0xMT1dzIGZvciBhLCBiLCBhbmQgYzogeyddJywnXid9LgorICAgICAgICBJbiB0aGlzIGNhc2UsIGZvciBpbnB1dCAiW10iLCBMQSgxKSBpcyBpbiB0aGlzIHNldCBzbyB3ZSB3b3VsZAorICAgICAgICBub3QgY29uc3VtZSBhbnl0aGluZyBhbmQgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgcnVsZSBjIHdvdWxkCisgICAgICAgIHJldHVybiBub3JtYWxseS4gIEl0IHdvdWxkIG5vdCBmaW5kIHRoZSByZXF1aXJlZCAnXicgdGhvdWdoLgorICAgICAgICBBdCB0aGlzIHBvaW50LCBpdCBnZXRzIGEgbWlzbWF0Y2hlZCB0b2tlbiBlcnJvciBhbmQgdGhyb3dzIGFuCisgICAgICAgIGV4Y2VwdGlvbiAoc2luY2UgTEEoMSkgaXMgbm90IGluIHRoZSB2aWFibGUgZm9sbG93aW5nIHRva2VuCisgICAgICAgIHNldCkuICBUaGUgcnVsZSBleGNlcHRpb24gaGFuZGxlciB0cmllcyB0byByZWNvdmVyLCBidXQgZmluZHMKKyAgICAgICAgdGhlIHNhbWUgcmVjb3Zlcnkgc2V0IGFuZCBkb2Vzbid0IGNvbnN1bWUgYW55dGhpbmcuICBSdWxlIGIKKyAgICAgICAgZXhpdHMgbm9ybWFsbHkgcmV0dXJuaW5nIHRvIHJ1bGUgYS4gIE5vdyBpdCBmaW5kcyB0aGUgJ10nIChhbmQKKyAgICAgICAgd2l0aCB0aGUgc3VjY2Vzc2Z1bCBtYXRjaCBleGl0cyBlcnJvclJlY292ZXJ5IG1vZGUpLgorCisgICAgICAgIFNvLCB5b3UgY25hIHNlZSB0aGF0IHRoZSBwYXJzZXIgd2Fsa3MgdXAgY2FsbCBjaGFpbiBsb29raW5nCisgICAgICAgIGZvciB0aGUgdG9rZW4gdGhhdCB3YXMgYSBtZW1iZXIgb2YgdGhlIHJlY292ZXJ5IHNldC4KKworICAgICAgICBFcnJvcnMgYXJlIG5vdCBnZW5lcmF0ZWQgaW4gZXJyb3JSZWNvdmVyeSBtb2RlLgorCisgICAgICAgIEFOVExSJ3MgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtIGlzIGJhc2VkIHVwb24gb3JpZ2luYWwgaWRlYXM6CisKKyAgICAgICAgIkFsZ29yaXRobXMgKyBEYXRhIFN0cnVjdHVyZXMgPSBQcm9ncmFtcyIgYnkgTmlrbGF1cyBXaXJ0aAorCisgICAgICAgIGFuZAorCisgICAgICAgICJBIG5vdGUgb24gZXJyb3IgcmVjb3ZlcnkgaW4gcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VycyI6CisgICAgICAgIGh0dHA6Ly9wb3J0YWwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9OTQ3OTAyLjk0NzkwNQorCisgICAgICAgIExhdGVyLCBKb3NlZiBHcm9zY2ggaGFkIHNvbWUgZ29vZCBpZGVhczoKKworICAgICAgICAiRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudAorICAgICAgICBQYXJzZXJzIjoKKyAgICAgICAgZnRwOi8vd3d3LmNvY29sYWIuY29tL3Byb2R1Y3RzL2NvY2t0YWlsL2RvY2E0LnBzL2VsbC5wcy56aXAKKworICAgICAgICBMaWtlIEdyb3NjaCBJIGltcGxlbWVudGVkIGxvY2FsIEZPTExPVyBzZXRzIHRoYXQgYXJlIGNvbWJpbmVkCisgICAgICAgIGF0IHJ1bi10aW1lIHVwb24gZXJyb3IgdG8gYXZvaWQgb3ZlcmhlYWQgZHVyaW5nIHBhcnNpbmcuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLmNvbWJpbmVGb2xsb3dzKEZhbHNlKQorCisKKyAgICBkZWYgY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29tcHV0ZSB0aGUgY29udGV4dC1zZW5zaXRpdmUgRk9MTE9XIHNldCBmb3IgY3VycmVudCBydWxlLgorICAgICAgICBUaGlzIGlzIHNldCBvZiB0b2tlbiB0eXBlcyB0aGF0IGNhbiBmb2xsb3cgYSBzcGVjaWZpYyBydWxlCisgICAgICAgIHJlZmVyZW5jZSBnaXZlbiBhIHNwZWNpZmljIGNhbGwgY2hhaW4uICBZb3UgZ2V0IHRoZSBzZXQgb2YKKyAgICAgICAgdmlhYmxlIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBjb21lIG5leHQgKGxvb2thaGVhZCBkZXB0aCAxKQorICAgICAgICBnaXZlbiB0aGUgY3VycmVudCBjYWxsIGNoYWluLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorICAgICAgICBkZWZpbml0aW9uIG9mIHBsYWluIEZPTExPVyBmb3IgcnVsZSByOgorCisgICAgICAgICBGT0xMT1cocik9e3ggfCBTPT4qYWxwaGEgciBiZXRhIGluIEcgYW5kIHggaW4gRklSU1QoYmV0YSl9CisKKyAgICAgICAgd2hlcmUgeCBpbiBUKiBhbmQgYWxwaGEsIGJldGEgaW4gVio7IFQgaXMgc2V0IG9mIHRlcm1pbmFscyBhbmQKKyAgICAgICAgViBpcyB0aGUgc2V0IG9mIHRlcm1pbmFscyBhbmQgbm9udGVybWluYWxzLiAgSW4gb3RoZXIgd29yZHMsCisgICAgICAgIEZPTExPVyhyKSBpcyB0aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdCBjYW4gcG9zc2libHkgZm9sbG93CisgICAgICAgIHJlZmVyZW5jZXMgdG8gciBpbiAqYW55KiBzZW50ZW50aWFsIGZvcm0gKGNvbnRleHQpLiAgQXQKKyAgICAgICAgcnVudGltZSwgaG93ZXZlciwgd2Uga25vdyBwcmVjaXNlbHkgd2hpY2ggY29udGV4dCBhcHBsaWVzIGFzCisgICAgICAgIHdlIGhhdmUgdGhlIGNhbGwgY2hhaW4uICBXZSBtYXkgY29tcHV0ZSB0aGUgZXhhY3QgKHJhdGhlcgorICAgICAgICB0aGFuIGNvdmVyaW5nIHN1cGVyc2V0KSBzZXQgb2YgZm9sbG93aW5nIHRva2Vucy4KKworICAgICAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgZ3JhbW1hcjoKKworICAgICAgICBzdGF0IDogSUQgJz0nIGV4cHIgJzsnICAgICAgLy8gRk9MTE9XKHN0YXQpPT17RU9GfQorICAgICAgICAgICAgIHwgInJldHVybiIgZXhwciAnLicKKyAgICAgICAgICAgICA7CisgICAgICAgIGV4cHIgOiBhdG9tICgnKycgYXRvbSkqIDsgICAvLyBGT0xMT1coZXhwcik9PXsnOycsJy4nLCcpJ30KKyAgICAgICAgYXRvbSA6IElOVCAgICAgICAgICAgICAgICAgIC8vIEZPTExPVyhhdG9tKT09eycrJywnKScsJzsnLCcuJ30KKyAgICAgICAgICAgICB8ICcoJyBleHByICcpJworICAgICAgICAgICAgIDsKKworICAgICAgICBUaGUgRk9MTE9XIHNldHMgYXJlIGFsbCBpbmNsdXNpdmUgd2hlcmVhcyBjb250ZXh0LXNlbnNpdGl2ZQorICAgICAgICBGT0xMT1cgc2V0cyBhcmUgcHJlY2lzZWx5IHdoYXQgY291bGQgZm9sbG93IGEgcnVsZSByZWZlcmVuY2UuCisgICAgICAgIEZvciBpbnB1dCBpbnB1dCAiaT0oMyk7IiwgaGVyZSBpcyB0aGUgZGVyaXZhdGlvbjoKKworICAgICAgICBzdGF0ID0+IElEICc9JyBleHByICc7JworICAgICAgICAgICAgID0+IElEICc9JyBhdG9tICgnKycgYXRvbSkqICc7JworICAgICAgICAgICAgID0+IElEICc9JyAnKCcgZXhwciAnKScgKCcrJyBhdG9tKSogJzsnCisgICAgICAgICAgICAgPT4gSUQgJz0nICcoJyBhdG9tICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgICAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgKCcrJyBhdG9tKSogJzsnCisgICAgICAgICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICc7JworCisgICAgICAgIEF0IHRoZSAiMyIgdG9rZW4sIHlvdSdkIGhhdmUgYSBjYWxsIGNoYWluIG9mCisKKyAgICAgICAgICBzdGF0IC0+IGV4cHIgLT4gYXRvbSAtPiBleHByIC0+IGF0b20KKworICAgICAgICBXaGF0IGNhbiBmb2xsb3cgdGhhdCBzcGVjaWZpYyBuZXN0ZWQgcmVmIHRvIGF0b20/ICBFeGFjdGx5ICcpJworICAgICAgICBhcyB5b3UgY2FuIHNlZSBieSBsb29raW5nIGF0IHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgc3BlY2lmaWMKKyAgICAgICAgaW5wdXQuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIEZPTExPVyhhdG9tKT17JysnLCcpJywnOycsJy4nfS4KKworICAgICAgICBZb3Ugd2FudCB0aGUgZXhhY3QgdmlhYmxlIHRva2VuIHNldCB3aGVuIHJlY292ZXJpbmcgZnJvbSBhCisgICAgICAgIHRva2VuIG1pc21hdGNoLiAgVXBvbiB0b2tlbiBtaXNtYXRjaCwgaWYgTEEoMSkgaXMgbWVtYmVyIG9mCisgICAgICAgIHRoZSB2aWFibGUgbmV4dCB0b2tlbiBzZXQsIHRoZW4geW91IGtub3cgdGhlcmUgaXMgbW9zdCBsaWtlbHkKKyAgICAgICAgYSBtaXNzaW5nIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uICAiSW5zZXJ0IiBvbmUgYnkganVzdCBub3QKKyAgICAgICAgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5jb21iaW5lRm9sbG93cyhUcnVlKQorCisKKyAgICBkZWYgY29tYmluZUZvbGxvd3Moc2VsZiwgZXhhY3QpOgorICAgICAgICBmb2xsb3dTZXQgPSBzZXQoKQorICAgICAgICBmb3IgaWR4LCBsb2NhbEZvbGxvd1NldCBpbiByZXZlcnNlZChsaXN0KGVudW1lcmF0ZShzZWxmLl9zdGF0ZS5mb2xsb3dpbmcpKSk6CisgICAgICAgICAgICBmb2xsb3dTZXQgfD0gbG9jYWxGb2xsb3dTZXQKKyAgICAgICAgICAgIGlmIGV4YWN0OgorICAgICAgICAgICAgICAgICMgY2FuIHdlIHNlZSBlbmQgb2YgcnVsZT8KKyAgICAgICAgICAgICAgICBpZiBFT1JfVE9LRU5fVFlQRSBpbiBsb2NhbEZvbGxvd1NldDoKKyAgICAgICAgICAgICAgICAgICAgIyBPbmx5IGxlYXZlIEVPUiBpbiBzZXQgaWYgYXQgdG9wIChzdGFydCBydWxlKTsgdGhpcyBsZXRzCisgICAgICAgICAgICAgICAgICAgICMgdXMga25vdyBpZiBoYXZlIHRvIGluY2x1ZGUgZm9sbG93KHN0YXJ0IHJ1bGUpOyBpLmUuLCBFT0YKKyAgICAgICAgICAgICAgICAgICAgaWYgaWR4ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd1NldC5yZW1vdmUoRU9SX1RPS0VOX1RZUEUpCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNhbid0IHNlZSBlbmQgb2YgcnVsZSwgcXVpdAorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHJldHVybiBmb2xsb3dTZXQKKworCisgICAgZGVmIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFRva2VuKHNlbGYsIGlucHV0LCB0dHlwZSwgZm9sbG93KToKKyAgICAgICAgIiIiQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gYSBzaW5nbGUgbWlzc2luZyBvciBleHRyYSB0b2tlbi4KKworICAgICAgICBFWFRSQSBUT0tFTgorCisgICAgICAgIExBKDEpIGlzIG5vdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gIElmIExBKDIpIGhhcyB0aGUgcmlnaHQgdG9rZW4sCisgICAgICAgIGhvd2V2ZXIsIHRoZW4gYXNzdW1lIExBKDEpIGlzIHNvbWUgZXh0cmEgc3B1cmlvdXMgdG9rZW4uICBEZWxldGUgaXQKKyAgICAgICAgYW5kIExBKDIpIGFzIGlmIHdlIHdlcmUgZG9pbmcgYSBub3JtYWwgbWF0Y2goKSwgd2hpY2ggYWR2YW5jZXMgdGhlCisgICAgICAgIGlucHV0LgorCisgICAgICAgIE1JU1NJTkcgVE9LRU4KKworICAgICAgICBJZiBjdXJyZW50IHRva2VuIGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNvdWxkIGNvbWUgYWZ0ZXIKKyAgICAgICAgdHR5cGUgdGhlbiBpdCBpcyBvayB0byAnaW5zZXJ0JyB0aGUgbWlzc2luZyB0b2tlbiwgZWxzZSB0aHJvdworICAgICAgICBleGNlcHRpb24gRm9yIGV4YW1wbGUsIElucHV0ICdpPSgzOycgaXMgY2xlYXJseSBtaXNzaW5nIHRoZQorICAgICAgICAnKScuICBXaGVuIHRoZSBwYXJzZXIgcmV0dXJucyBmcm9tIHRoZSBuZXN0ZWQgY2FsbCB0byBleHByLCBpdAorICAgICAgICB3aWxsIGhhdmUgY2FsbCBjaGFpbjoKKworICAgICAgICAgIHN0YXQgLT4gZXhwciAtPiBhdG9tCisKKyAgICAgICAgYW5kIGl0IHdpbGwgYmUgdHJ5aW5nIHRvIG1hdGNoIHRoZSAnKScgYXQgdGhpcyBwb2ludCBpbiB0aGUKKyAgICAgICAgZGVyaXZhdGlvbjoKKworICAgICAgICAgICAgID0+IElEICc9JyAnKCcgSU5UICcpJyAoJysnIGF0b20pKiAnOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICBtYXRjaCgpIHdpbGwgc2VlIHRoYXQgJzsnIGRvZXNuJ3QgbWF0Y2ggJyknIGFuZCByZXBvcnQgYQorICAgICAgICBtaXNtYXRjaGVkIHRva2VuIGVycm9yLiAgVG8gcmVjb3ZlciwgaXQgc2VlcyB0aGF0IExBKDEpPT0nOycKKyAgICAgICAgaXMgaW4gdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4gZm9sbG93IHRoZSAnKScgdG9rZW4KKyAgICAgICAgcmVmZXJlbmNlIGluIHJ1bGUgYXRvbS4gIEl0IGNhbiBhc3N1bWUgdGhhdCB5b3UgZm9yZ290IHRoZSAnKScuCisgICAgICAgICIiIgorCisgICAgICAgIGUgPSBOb25lCisKKyAgICAgICAgIyBpZiBuZXh0IHRva2VuIGlzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZW4gImRlbGV0ZSIgdGhpcyB0b2tlbgorICAgICAgICBpZiBzZWxmLm1pc21hdGNoSXNVbndhbnRlZFRva2VuKGlucHV0LCB0dHlwZSk6CisgICAgICAgICAgICBlID0gVW53YW50ZWRUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpCisKKyAgICAgICAgICAgIHNlbGYuYmVnaW5SZXN5bmMoKQorICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpICMgc2ltcGx5IGRlbGV0ZSBleHRyYSB0b2tlbgorICAgICAgICAgICAgc2VsZi5lbmRSZXN5bmMoKQorCisgICAgICAgICAgICAjIHJlcG9ydCBhZnRlciBjb25zdW1pbmcgc28gQVcgc2VlcyB0aGUgdG9rZW4gaW4gdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgc2VsZi5yZXBvcnRFcnJvcihlKQorCisgICAgICAgICAgICAjIHdlIHdhbnQgdG8gcmV0dXJuIHRoZSB0b2tlbiB3ZSdyZSBhY3R1YWxseSBtYXRjaGluZworICAgICAgICAgICAgbWF0Y2hlZFN5bWJvbCA9IHNlbGYuZ2V0Q3VycmVudElucHV0U3ltYm9sKGlucHV0KQorCisgICAgICAgICAgICAjIG1vdmUgcGFzdCB0dHlwZSB0b2tlbiBhcyBpZiBhbGwgd2VyZSBvaworICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpCisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFN5bWJvbAorCisgICAgICAgICMgY2FuJ3QgcmVjb3ZlciB3aXRoIHNpbmdsZSB0b2tlbiBkZWxldGlvbiwgdHJ5IGluc2VydGlvbgorICAgICAgICBpZiBzZWxmLm1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQsIGZvbGxvdyk6CisgICAgICAgICAgICBpbnNlcnRlZCA9IHNlbGYuZ2V0TWlzc2luZ1N5bWJvbChpbnB1dCwgZSwgdHR5cGUsIGZvbGxvdykKKyAgICAgICAgICAgIGUgPSBNaXNzaW5nVG9rZW5FeGNlcHRpb24odHR5cGUsIGlucHV0LCBpbnNlcnRlZCkKKworICAgICAgICAgICAgIyByZXBvcnQgYWZ0ZXIgaW5zZXJ0aW5nIHNvIEFXIHNlZXMgdGhlIHRva2VuIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIHNlbGYucmVwb3J0RXJyb3IoZSkKKyAgICAgICAgICAgIHJldHVybiBpbnNlcnRlZAorCisgICAgICAgICMgZXZlbiB0aGF0IGRpZG4ndCB3b3JrOyBtdXN0IHRocm93IHRoZSBleGNlcHRpb24KKyAgICAgICAgZSA9IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpCisgICAgICAgIHJhaXNlIGUKKworCisgICAgZGVmIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldChzZWxmLCBpbnB1dCwgZSwgZm9sbG93KToKKyAgICAgICAgIiIiTm90IGN1cnJlbnRseSB1c2VkIiIiCisKKyAgICAgICAgaWYgc2VsZi5taXNtYXRjaElzTWlzc2luZ1Rva2VuKGlucHV0LCBmb2xsb3cpOgorICAgICAgICAgICAgc2VsZi5yZXBvcnRFcnJvcihlKQorICAgICAgICAgICAgIyB3ZSBkb24ndCBrbm93IGhvdyB0byBjb25qdXJlIHVwIGEgdG9rZW4gZm9yIHNldHMgeWV0CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRNaXNzaW5nU3ltYm9sKGlucHV0LCBlLCBJTlZBTElEX1RPS0VOX1RZUEUsIGZvbGxvdykKKworICAgICAgICAjIFRPRE8gZG8gc2luZ2xlIHRva2VuIGRlbGV0aW9uIGxpa2UgYWJvdmUgZm9yIFRva2VuIG1pc21hdGNoCisgICAgICAgIHJhaXNlIGUKKworCisgICAgZGVmIGdldEN1cnJlbnRJbnB1dFN5bWJvbChzZWxmLCBpbnB1dCk6CisgICAgICAgICIiIgorICAgICAgICBNYXRjaCBuZWVkcyB0byByZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sLCB3aGljaCBnZXRzIHB1dAorICAgICAgICBpbnRvIHRoZSBsYWJlbCBmb3IgdGhlIGFzc29jaWF0ZWQgdG9rZW4gcmVmOyBlLmcuLCB4PUlELiAgVG9rZW4KKyAgICAgICAgYW5kIHRyZWUgcGFyc2VycyBuZWVkIHRvIHJldHVybiBkaWZmZXJlbnQgb2JqZWN0cy4gUmF0aGVyIHRoYW4gdGVzdAorICAgICAgICBmb3IgaW5wdXQgc3RyZWFtIHR5cGUgb3IgY2hhbmdlIHRoZSBJbnRTdHJlYW0gaW50ZXJmYWNlLCBJIHVzZQorICAgICAgICBhIHNpbXBsZSBtZXRob2QgdG8gYXNrIHRoZSByZWNvZ25pemVyIHRvIHRlbGwgbWUgd2hhdCB0aGUgY3VycmVudAorICAgICAgICBpbnB1dCBzeW1ib2wgaXMuCisKKyAgICAgICAgVGhpcyBpcyBpZ25vcmVkIGZvciBsZXhlcnMuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBOb25lCisKKworICAgIGRlZiBnZXRNaXNzaW5nU3ltYm9sKHNlbGYsIGlucHV0LCBlLCBleHBlY3RlZFRva2VuVHlwZSwgZm9sbG93KToKKyAgICAgICAgIiIiQ29uanVyZSB1cCBhIG1pc3NpbmcgdG9rZW4gZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorCisgICAgICAgIFRoZSByZWNvZ25pemVyIGF0dGVtcHRzIHRvIHJlY292ZXIgZnJvbSBzaW5nbGUgbWlzc2luZworICAgICAgICBzeW1ib2xzLiBCdXQsIGFjdGlvbnMgbWlnaHQgcmVmZXIgdG8gdGhhdCBtaXNzaW5nIHN5bWJvbC4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHg9SUQge2YoJHgpO30uIFRoZSBhY3Rpb24gY2xlYXJseSBhc3N1bWVzCisgICAgICAgIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4gaWRlbnRpZmllciBtYXRjaGVkIHByZXZpb3VzbHkgYW5kIHRoYXQKKyAgICAgICAgJHggcG9pbnRzIGF0IHRoYXQgdG9rZW4uIElmIHRoYXQgdG9rZW4gaXMgbWlzc2luZywgYnV0CisgICAgICAgIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gaXMgd2hhdCB3ZSB3YW50IHdlIGFzc3VtZSB0aGF0CisgICAgICAgIHRoaXMgdG9rZW4gaXMgbWlzc2luZyBhbmQgd2Uga2VlcCBnb2luZy4gQmVjYXVzZSB3ZQorICAgICAgICBoYXZlIHRvIHJldHVybiBzb21lIHRva2VuIHRvIHJlcGxhY2UgdGhlIG1pc3NpbmcgdG9rZW4sCisgICAgICAgIHdlIGhhdmUgdG8gY29uanVyZSBvbmUgdXAuIFRoaXMgbWV0aG9kIGdpdmVzIHRoZSB1c2VyIGNvbnRyb2wKKyAgICAgICAgb3ZlciB0aGUgdG9rZW5zIHJldHVybmVkIGZvciBtaXNzaW5nIHRva2Vucy4gTW9zdGx5LAorICAgICAgICB5b3Ugd2lsbCB3YW50IHRvIGNyZWF0ZSBzb21ldGhpbmcgc3BlY2lhbCBmb3IgaWRlbnRpZmllcgorICAgICAgICB0b2tlbnMuIEZvciBsaXRlcmFscyBzdWNoIGFzICd7JyBhbmQgJywnLCB0aGUgZGVmYXVsdAorICAgICAgICBhY3Rpb24gaW4gdGhlIHBhcnNlciBvciB0cmVlIHBhcnNlciB3b3Jrcy4gSXQgc2ltcGx5IGNyZWF0ZXMKKyAgICAgICAgYSBDb21tb25Ub2tlbiBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gVGhlIHRleHQgd2lsbCBiZSB0aGUgdG9rZW4uCisgICAgICAgIElmIHlvdSBjaGFuZ2Ugd2hhdCB0b2tlbnMgbXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBsZXhlciwKKyAgICAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0b2tlbnMuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBOb25lCisKKworIyMgICAgIGRlZiByZWNvdmVyRnJvbU1pc3NpbmdFbGVtZW50KHNlbGYsIGlucHV0LCBlLCBmb2xsb3cpOgorIyMgICAgICAgICAiIiIKKyMjICAgICAgICAgVGhpcyBjb2RlIGlzIGZhY3RvcmVkIG91dCBmcm9tIG1pc21hdGNoZWQgdG9rZW4gYW5kIG1pc21hdGNoZWQgc2V0CisjIyAgICAgICAgIHJlY292ZXJ5LiAgSXQgaGFuZGxlcyAic2luZ2xlIHRva2VuIGluc2VydGlvbiIgZXJyb3IgcmVjb3ZlcnkgZm9yCisjIyAgICAgICAgIGJvdGguICBObyB0b2tlbnMgYXJlIGNvbnN1bWVkIHRvIHJlY292ZXIgZnJvbSBpbnNlcnRpb25zLiAgUmV0dXJuCisjIyAgICAgICAgIHRydWUgaWYgcmVjb3Zlcnkgd2FzIHBvc3NpYmxlIGVsc2UgcmV0dXJuIGZhbHNlLgorIyMgICAgICAgICAiIiIKKworIyMgICAgICAgICBpZiBzZWxmLm1pc21hdGNoSXNNaXNzaW5nVG9rZW4oaW5wdXQsIGZvbGxvdyk6CisjIyAgICAgICAgICAgICBzZWxmLnJlcG9ydEVycm9yKGUpCisjIyAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisjIyAgICAgICAgICMgbm90aGluZyB0byBkbzsgdGhyb3cgZXhjZXB0aW9uCisjIyAgICAgICAgIHJldHVybiBGYWxzZQorCisKKyAgICBkZWYgY29uc3VtZVVudGlsKHNlbGYsIGlucHV0LCB0b2tlblR5cGVzKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbnN1bWUgdG9rZW5zIHVudGlsIG9uZSBtYXRjaGVzIHRoZSBnaXZlbiB0b2tlbiBvciB0b2tlbiBzZXQKKworICAgICAgICB0b2tlblR5cGVzIGNhbiBiZSBhIHNpbmdsZSB0b2tlbiB0eXBlIG9yIGEgc2V0IG9mIHRva2VuIHR5cGVzCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodG9rZW5UeXBlcywgKHNldCwgZnJvemVuc2V0KSk6CisgICAgICAgICAgICB0b2tlblR5cGVzID0gZnJvemVuc2V0KFt0b2tlblR5cGVzXSkKKworICAgICAgICB0dHlwZSA9IGlucHV0LkxBKDEpCisgICAgICAgIHdoaWxlIHR0eXBlICE9IEVPRiBhbmQgdHR5cGUgbm90IGluIHRva2VuVHlwZXM6CisgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCkKKyAgICAgICAgICAgIHR0eXBlID0gaW5wdXQuTEEoMSkKKworCisgICAgZGVmIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2soc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gTGlzdDxTdHJpbmc+IG9mIHRoZSBydWxlcyBpbiB5b3VyIHBhcnNlciBpbnN0YW5jZQorICAgICAgICBsZWFkaW5nIHVwIHRvIGEgY2FsbCB0byB0aGlzIG1ldGhvZC4gIFlvdSBjb3VsZCBvdmVycmlkZSBpZgorICAgICAgICB5b3Ugd2FudCBtb3JlIGRldGFpbHMgc3VjaCBhcyB0aGUgZmlsZS9saW5lIGluZm8gb2Ygd2hlcmUKKyAgICAgICAgaW4gdGhlIHBhcnNlciBqYXZhIGNvZGUgYSBydWxlIGlzIGludm9rZWQuCisKKyAgICAgICAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIGZvciBjb250ZXh0LXNlbnNpdGl2ZQorICAgICAgICBlcnJvciByZWNvdmVyeS4KKworICAgICAgICBZb3UgbXVzdCBiZSBjYXJlZnVsLCBpZiB5b3Ugc3ViY2xhc3MgYSBnZW5lcmF0ZWQgcmVjb2duaXplcnMuCisgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgb25seSBzZWFyY2ggdGhlIG1vZHVsZSBvZiBzZWxmCisgICAgICAgIGZvciBydWxlcywgYnV0IHRoZSBzdWJjbGFzcyB3aWxsIG5vdCBjb250YWluIGFueSBydWxlcy4KKyAgICAgICAgWW91IHByb2JhYmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gbG9vayBsaWtlCisKKyAgICAgICAgZGVmIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2soc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0UnVsZUludm9jYXRpb25TdGFjayg8Y2xhc3M+Ll9fbW9kdWxlX18pCisKKyAgICAgICAgd2hlcmUgPGNsYXNzPiBpcyB0aGUgY2xhc3Mgb2YgdGhlIGdlbmVyYXRlZCByZWNvZ25pemVyLCBlLmcuCisgICAgICAgIHRoZSBzdXBlcmNsYXNzIG9mIHNlbGYuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRSdWxlSW52b2NhdGlvblN0YWNrKHNlbGYuX19tb2R1bGVfXykKKworCisgICAgZGVmIF9nZXRSdWxlSW52b2NhdGlvblN0YWNrKGNscywgbW9kdWxlKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgbW9yZSBnZW5lcmFsIHZlcnNpb24gb2YgZ2V0UnVsZUludm9jYXRpb25TdGFjayB3aGVyZSB5b3UgY2FuCisgICAgICAgIHBhc3MgaW4sIGZvciBleGFtcGxlLCBhIFJlY29nbml0aW9uRXhjZXB0aW9uIHRvIGdldCBpdCdzIHJ1bGUKKyAgICAgICAgc3RhY2sgdHJhY2UuICBUaGlzIHJvdXRpbmUgaXMgc2hhcmVkIHdpdGggYWxsIHJlY29nbml6ZXJzLCBoZW5jZSwKKyAgICAgICAgc3RhdGljLgorCisgICAgICAgIFRPRE86IG1vdmUgdG8gYSB1dGlsaXR5IGNsYXNzIG9yIHNvbWV0aGluZzsgd2VpcmQgaGF2aW5nIGxleGVyIGNhbGwKKyAgICAgICAgdGhpcworICAgICAgICAiIiIKKworICAgICAgICAjIG1tbWhoaCwuLi4gcGVyaGFwcyBsb29rIGF0IHRoZSBmaXJzdCBhcmd1bWVudAorICAgICAgICAjIChmX2xvY2Fsc1tjb192YXJuYW1lc1swXV0/KSBhbmQgdGVzdCBpZiBpdCdzIGEgKHN1YiljbGFzcyBvZgorICAgICAgICAjIHJlcXVlc3RlZCByZWNvZ25pemVyLi4uCisKKyAgICAgICAgcnVsZXMgPSBbXQorICAgICAgICBmb3IgZnJhbWUgaW4gcmV2ZXJzZWQoaW5zcGVjdC5zdGFjaygpKToKKyAgICAgICAgICAgIGNvZGUgPSBmcmFtZVswXS5mX2NvZGUKKyAgICAgICAgICAgIGNvZGVNb2QgPSBpbnNwZWN0LmdldG1vZHVsZShjb2RlKQorICAgICAgICAgICAgaWYgY29kZU1vZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgc2tpcCBmcmFtZXMgbm90IGluIHJlcXVlc3RlZCBtb2R1bGUKKyAgICAgICAgICAgIGlmIGNvZGVNb2QuX19uYW1lX18gIT0gbW9kdWxlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgc2tpcCBzb21lIHVud2FudGVkIG5hbWVzCisgICAgICAgICAgICBpZiBjb2RlLmNvX25hbWUgaW4gKCduZXh0VG9rZW4nLCAnPG1vZHVsZT4nKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBydWxlcy5hcHBlbmQoY29kZS5jb19uYW1lKQorCisgICAgICAgIHJldHVybiBydWxlcworCisgICAgX2dldFJ1bGVJbnZvY2F0aW9uU3RhY2sgPSBjbGFzc21ldGhvZChfZ2V0UnVsZUludm9jYXRpb25TdGFjaykKKworCisgICAgZGVmIGdldEJhY2t0cmFja2luZ0xldmVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nCisKKyAgICBkZWYgc2V0QmFja3RyYWNraW5nTGV2ZWwoc2VsZiwgbik6CisgICAgICAgIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA9IG4KKworCisgICAgZGVmIGdldEdyYW1tYXJGaWxlTmFtZShzZWxmKToKKyAgICAgICAgIiIiRm9yIGRlYnVnZ2luZyBhbmQgb3RoZXIgcHVycG9zZXMsIG1pZ2h0IHdhbnQgdGhlIGdyYW1tYXIgbmFtZS4KKworICAgICAgICBIYXZlIEFOVExSIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuZ3JhbW1hckZpbGVOYW1lCisKKworICAgIGRlZiBnZXRTb3VyY2VOYW1lKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiB0b1N0cmluZ3Moc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIiIiQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHVzZSBtb3N0IG9mdGVuIHdpdGggdGVtcGxhdGUgcmV3cml0ZXMuCisKKyAgICAgICAgQ29udmVydCBhIExpc3Q8VG9rZW4+IHRvIExpc3Q8U3RyaW5nPgorICAgICAgICAiIiIKKworICAgICAgICBpZiB0b2tlbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmV0dXJuIFt0b2tlbi50ZXh0IGZvciB0b2tlbiBpbiB0b2tlbnNdCisKKworICAgIGRlZiBnZXRSdWxlTWVtb2l6YXRpb24oc2VsZiwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCk6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhIHJ1bGUgbnVtYmVyIGFuZCBhIHN0YXJ0IHRva2VuIGluZGV4IG51bWJlciwgcmV0dXJuCisgICAgICAgIE1FTU9fUlVMRV9VTktOT1dOIGlmIHRoZSBydWxlIGhhcyBub3QgcGFyc2VkIGlucHV0IHN0YXJ0aW5nIGZyb20KKyAgICAgICAgc3RhcnQgaW5kZXguICBJZiB0aGlzIHJ1bGUgaGFzIHBhcnNlZCBpbnB1dCBzdGFydGluZyBmcm9tIHRoZQorICAgICAgICBzdGFydCBpbmRleCBiZWZvcmUsIHRoZW4gcmV0dXJuIHdoZXJlIHRoZSBydWxlIHN0b3BwZWQgcGFyc2luZy4KKyAgICAgICAgSXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdG9rZW4gbWF0Y2hlZCBieSB0aGUgcnVsZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgcnVsZUluZGV4IG5vdCBpbiBzZWxmLl9zdGF0ZS5ydWxlTWVtbzoKKyAgICAgICAgICAgIHNlbGYuX3N0YXRlLnJ1bGVNZW1vW3J1bGVJbmRleF0gPSB7fQorCisgICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZS5ydWxlTWVtb1tydWxlSW5kZXhdLmdldCgKKyAgICAgICAgICAgIHJ1bGVTdGFydEluZGV4LCBzZWxmLk1FTU9fUlVMRV9VTktOT1dOCisgICAgICAgICAgICApCisKKworICAgIGRlZiBhbHJlYWR5UGFyc2VkUnVsZShzZWxmLCBpbnB1dCwgcnVsZUluZGV4KToKKyAgICAgICAgIiIiCisgICAgICAgIEhhcyB0aGlzIHJ1bGUgYWxyZWFkeSBwYXJzZWQgaW5wdXQgYXQgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlCisgICAgICAgIGlucHV0IHN0cmVhbT8gIFJldHVybiB0aGUgc3RvcCB0b2tlbiBpbmRleCBvciBNRU1PX1JVTEVfVU5LTk9XTi4KKyAgICAgICAgSWYgd2UgYXR0ZW1wdGVkIGJ1dCBmYWlsZWQgdG8gcGFyc2UgcHJvcGVybHkgYmVmb3JlLCByZXR1cm4KKyAgICAgICAgTUVNT19SVUxFX0ZBSUxFRC4KKworICAgICAgICBUaGlzIG1ldGhvZCBoYXMgYSBzaWRlLWVmZmVjdDogaWYgd2UgaGF2ZSBzZWVuIHRoaXMgaW5wdXQgZm9yCisgICAgICAgIHRoaXMgcnVsZSBhbmQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBiZWZvcmUsIHRoZW4gc2VlayBhaGVhZCB0bworICAgICAgICAxIHBhc3QgdGhlIHN0b3AgdG9rZW4gbWF0Y2hlZCBmb3IgdGhpcyBydWxlIGxhc3QgdGltZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc3RvcEluZGV4ID0gc2VsZi5nZXRSdWxlTWVtb2l6YXRpb24ocnVsZUluZGV4LCBpbnB1dC5pbmRleCgpKQorICAgICAgICBpZiBzdG9wSW5kZXggPT0gc2VsZi5NRU1PX1JVTEVfVU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHN0b3BJbmRleCA9PSBzZWxmLk1FTU9fUlVMRV9GQUlMRUQ6CisgICAgICAgICAgICByYWlzZSBCYWNrdHJhY2tpbmdGYWlsZWQKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5wdXQuc2VlayhzdG9wSW5kZXggKyAxKQorCisgICAgICAgIHJldHVybiBUcnVlCisKKworICAgIGRlZiBtZW1vaXplKHNlbGYsIGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4LCBzdWNjZXNzKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlY29yZCB3aGV0aGVyIG9yIG5vdCB0aGlzIHJ1bGUgcGFyc2VkIHRoZSBpbnB1dCBhdCB0aGlzIHBvc2l0aW9uCisgICAgICAgIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgICAgIHN0b3BUb2tlbkluZGV4ID0gaW5wdXQuaW5kZXgoKSAtIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0b3BUb2tlbkluZGV4ID0gc2VsZi5NRU1PX1JVTEVfRkFJTEVECisKKyAgICAgICAgaWYgcnVsZUluZGV4IGluIHNlbGYuX3N0YXRlLnJ1bGVNZW1vOgorICAgICAgICAgICAgc2VsZi5fc3RhdGUucnVsZU1lbW9bcnVsZUluZGV4XVtydWxlU3RhcnRJbmRleF0gPSBzdG9wVG9rZW5JbmRleAorCisKKyAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCk6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoImVudGVyICVzICVzIiAlIChydWxlTmFtZSwgaW5wdXRTeW1ib2wpKQorCisgICAgICAgIGlmIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA+IDA6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgYmFja3RyYWNraW5nPSVzIiAlIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZykKKworICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisKKworICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dFN5bWJvbCk6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoImV4aXQgJXMgJXMiICUgKHJ1bGVOYW1lLCBpbnB1dFN5bWJvbCkpCisKKyAgICAgICAgaWYgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID4gMDoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBiYWNrdHJhY2tpbmc9JXMiICUgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nKQorCisgICAgICAgICMgbW1tbS4uLiB3ZSB1c2UgQmFja3RyYWNraW5nRmFpbGVkIGV4Y2VwdGlvbnMgbm93LiBTbyBob3cgY291bGQgd2UKKyAgICAgICAgIyBnZXQgdGhhdCBpbmZvcm1hdGlvbiBoZXJlPworICAgICAgICAjaWYgc2VsZi5fc3RhdGUuZmFpbGVkOgorICAgICAgICAjICAgIHN5cy5zdGRvdXQud3JpdGUoIiBmYWlsZWQiKQorICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICBzeXMuc3Rkb3V0LndyaXRlKCIgc3VjY2VlZGVkIikKKworICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisKKworY2xhc3MgVG9rZW5Tb3VyY2Uob2JqZWN0KToKKyAgICAiIiIKKyAgICBAYnJpZWYgQWJzdHJhY3QgYmFzZWNsYXNzIGZvciB0b2tlbiBwcm9kdWNlcnMuCisKKyAgICBBIHNvdXJjZSBvZiB0b2tlbnMgbXVzdCBwcm92aWRlIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIHZpYSBuZXh0VG9rZW4oKQorICAgIGFuZCBhbHNvIG11c3QgcmV2ZWFsIGl0J3Mgc291cmNlIG9mIGNoYXJhY3RlcnM7IENvbW1vblRva2VuJ3MgdGV4dCBpcworICAgIGNvbXB1dGVkIGZyb20gYSBDaGFyU3RyZWFtOyBpdCBvbmx5IHN0b3JlIGluZGljZXMgaW50byB0aGUgY2hhciBzdHJlYW0uCisKKyAgICBFcnJvcnMgZnJvbSB0aGUgbGV4ZXIgYXJlIG5ldmVyIHBhc3NlZCB0byB0aGUgcGFyc2VyLiAgRWl0aGVyIHlvdSB3YW50CisgICAgdG8ga2VlcCBnb2luZyBvciB5b3UgZG8gbm90IHVwb24gdG9rZW4gcmVjb2duaXRpb24gZXJyb3IuICBJZiB5b3UgZG8gbm90CisgICAgd2FudCB0byBjb250aW51ZSBsZXhpbmcgdGhlbiB5b3UgZG8gbm90IHdhbnQgdG8gY29udGludWUgcGFyc2luZy4gIEp1c3QKKyAgICB0aHJvdyBhbiBleGNlcHRpb24gbm90IHVuZGVyIFJlY29nbml0aW9uRXhjZXB0aW9uIGFuZCBKYXZhIHdpbGwgbmF0dXJhbGx5CisgICAgdG9zcyB5b3UgYWxsIHRoZSB3YXkgb3V0IG9mIHRoZSByZWNvZ25pemVycy4gIElmIHlvdSB3YW50IHRvIGNvbnRpbnVlCisgICAgbGV4aW5nIHRoZW4geW91IHNob3VsZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIHRvIHRoZSBwYXJzZXItLWl0IGhhcyBhbHJlYWR5CisgICAgcmVxdWVzdGVkIGEgdG9rZW4uICBLZWVwIGxleGluZyB1bnRpbCB5b3UgZ2V0IGEgdmFsaWQgb25lLiAgSnVzdCByZXBvcnQKKyAgICBlcnJvcnMgYW5kIGtlZXAgZ29pbmcsIGxvb2tpbmcgZm9yIGEgdmFsaWQgdG9rZW4uCisgICAgIiIiCisKKyAgICBkZWYgbmV4dFRva2VuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBUb2tlbiBvYmplY3QgZnJvbSB5b3VyIGlucHV0IHN0cmVhbSAodXN1YWxseSBhIENoYXJTdHJlYW0pLgorCisgICAgICAgIERvIG5vdCBmYWlsL3JldHVybiB1cG9uIGxleGluZyBlcnJvcjsga2VlcCBjaGV3aW5nIG9uIHRoZSBjaGFyYWN0ZXJzCisgICAgICAgIHVudGlsIHlvdSBnZXQgYSBnb29kIG9uZTsgZXJyb3JzIGFyZSBub3QgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHBhcnNlci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICIiIlRoZSBUb2tlblNvdXJjZSBpcyBhbiBpbnRlcmF0b3IuCisKKyAgICAgICAgVGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBpbmNsdWRlIHRoZSBmaW5hbCBFT0YgdG9rZW4sIHNlZSBhbHNvIHRoZSBub3RlCisgICAgICAgIGZvciB0aGUgbmV4dCgpIG1ldGhvZC4KKworICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZgorCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG5leHQgdG9rZW4gb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbi4KKworICAgICAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIHJhaXNlIFN0b3BJdGVyYXRpb24gd2hlbiBoaXR0aW5nIHRoZSBFT0YgdG9rZW4sCisgICAgICAgIHNvIEVPRiB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBpdGVyYXRpb24uCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgdG9rZW4gPSBzZWxmLm5leHRUb2tlbigpCisgICAgICAgIGlmIHRva2VuIGlzIE5vbmUgb3IgdG9rZW4udHlwZSA9PSBFT0Y6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiB0b2tlbgorCisKK2NsYXNzIExleGVyKEJhc2VSZWNvZ25pemVyLCBUb2tlblNvdXJjZSk6CisgICAgIiIiCisgICAgQGJyaWVmIEJhc2VjbGFzcyBmb3IgZ2VuZXJhdGVkIGxleGVyIGNsYXNzZXMuCisKKyAgICBBIGxleGVyIGlzIHJlY29nbml6ZXIgdGhhdCBkcmF3cyBpbnB1dCBzeW1ib2xzIGZyb20gYSBjaGFyYWN0ZXIgc3RyZWFtLgorICAgIGxleGVyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LiBBIExleGVyIG9iamVjdAorICAgIHVzZXMgc2ltcGxpZmllZCBtYXRjaCgpIGFuZCBlcnJvciByZWNvdmVyeSBtZWNoYW5pc21zIGluIHRoZSBpbnRlcmVzdAorICAgIG9mIHNwZWVkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0LCBzdGF0ZT1Ob25lKToKKyAgICAgICAgQmFzZVJlY29nbml6ZXIuX19pbml0X18oc2VsZiwgc3RhdGUpCisgICAgICAgIFRva2VuU291cmNlLl9faW5pdF9fKHNlbGYpCisKKyAgICAgICAgIyBXaGVyZSBpcyB0aGUgbGV4ZXIgZHJhd2luZyBjaGFyYWN0ZXJzIGZyb20/CisgICAgICAgIHNlbGYuaW5wdXQgPSBpbnB1dAorCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIEJhc2VSZWNvZ25pemVyLnJlc2V0KHNlbGYpICMgcmVzZXQgYWxsIHJlY29nbml6ZXIgc3RhdGUgdmFyaWFibGVzCisKKyAgICAgICAgaWYgc2VsZi5pbnB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgcmV3aW5kIHRoZSBpbnB1dAorICAgICAgICAgICAgc2VsZi5pbnB1dC5zZWVrKDApCisKKyAgICAgICAgaWYgc2VsZi5fc3RhdGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgbm8gc2hhcmVkIHN0YXRlIHdvcmsgdG8gZG8KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgd2FjayBMZXhlciBzdGF0ZSB2YXJpYWJsZXMKKyAgICAgICAgc2VsZi5fc3RhdGUudG9rZW4gPSBOb25lCisgICAgICAgIHNlbGYuX3N0YXRlLnR5cGUgPSBJTlZBTElEX1RPS0VOX1RZUEUKKyAgICAgICAgc2VsZi5fc3RhdGUuY2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTAorICAgICAgICBzZWxmLl9zdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gLTEKKyAgICAgICAgc2VsZi5fc3RhdGUudG9rZW5TdGFydExpbmUgPSAtMQorICAgICAgICBzZWxmLl9zdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gLTEKKyAgICAgICAgc2VsZi5fc3RhdGUudGV4dCA9IE5vbmUKKworCisgICAgZGVmIG1ha2VFT0ZUb2tlbihzZWxmKToKKyAgICAgICAgZW9mID0gQ29tbW9uVG9rZW4oCisgICAgICAgICAgICB0eXBlPUVPRiwgY2hhbm5lbD1ERUZBVUxUX0NIQU5ORUwsCisgICAgICAgICAgICBpbnB1dD1zZWxmLmlucHV0LAorICAgICAgICAgICAgc3RhcnQ9c2VsZi5pbnB1dC5pbmRleCgpLCBzdG9wPXNlbGYuaW5wdXQuaW5kZXgoKSkKKyAgICAgICAgZW9mLmxpbmUgPSBzZWxmLmlucHV0LmxpbmUKKyAgICAgICAgZW9mLmNoYXJQb3NpdGlvbkluTGluZSA9IHNlbGYuaW5wdXQuY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHJldHVybiBlb2YKKworICAgIGRlZiBuZXh0VG9rZW4oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSB0b2tlbiBmcm9tIHRoaXMgc291cmNlOyBpLmUuLCBtYXRjaCBhIHRva2VuIG9uIHRoZSBjaGFyCisgICAgICAgIHN0cmVhbS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHNlbGYuX3N0YXRlLnRva2VuID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fc3RhdGUuY2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTAorICAgICAgICAgICAgc2VsZi5fc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IHNlbGYuaW5wdXQuaW5kZXgoKQorICAgICAgICAgICAgc2VsZi5fc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IHNlbGYuaW5wdXQuY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgICAgICBzZWxmLl9zdGF0ZS50b2tlblN0YXJ0TGluZSA9IHNlbGYuaW5wdXQubGluZQorICAgICAgICAgICAgc2VsZi5fc3RhdGUudGV4dCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuaW5wdXQuTEEoMSkgPT0gRU9GOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1ha2VFT0ZUb2tlbigpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm1Ub2tlbnMoKQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc3RhdGUudG9rZW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCkKKworICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5fc3RhdGUudG9rZW4gPT0gU0tJUF9UT0tFTjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZS50b2tlbgorCisgICAgICAgICAgICBleGNlcHQgTm9WaWFibGVBbHRFeGNlcHRpb24sIHJlOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0RXJyb3IocmUpCisgICAgICAgICAgICAgICAgc2VsZi5yZWNvdmVyKHJlKSAjIHRocm93IG91dCBjdXJyZW50IGNoYXIgYW5kIHRyeSBhZ2FpbgorCisgICAgICAgICAgICBleGNlcHQgUmVjb2duaXRpb25FeGNlcHRpb24sIHJlOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0RXJyb3IocmUpCisgICAgICAgICAgICAgICAgIyBtYXRjaCgpIHJvdXRpbmUgaGFzIGFscmVhZHkgY2FsbGVkIHJlY292ZXIoKQorCisKKyAgICBkZWYgc2tpcChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEluc3RydWN0IHRoZSBsZXhlciB0byBza2lwIGNyZWF0aW5nIGEgdG9rZW4gZm9yIGN1cnJlbnQgbGV4ZXIgcnVsZQorICAgICAgICBhbmQgbG9vayBmb3IgYW5vdGhlciB0b2tlbi4gIG5leHRUb2tlbigpIGtub3dzIHRvIGtlZXAgbG9va2luZyB3aGVuCisgICAgICAgIGEgbGV4ZXIgcnVsZSBmaW5pc2hlcyB3aXRoIHRva2VuIHNldCB0byBTS0lQX1RPS0VOLiAgUmVjYWxsIHRoYXQKKyAgICAgICAgaWYgdG9rZW49PW51bGwgYXQgZW5kIG9mIGFueSB0b2tlbiBydWxlLCBpdCBjcmVhdGVzIG9uZSBmb3IgeW91CisgICAgICAgIGFuZCBlbWl0cyBpdC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5fc3RhdGUudG9rZW4gPSBTS0lQX1RPS0VOCisKKworICAgIGRlZiBtVG9rZW5zKHNlbGYpOgorICAgICAgICAiIiJUaGlzIGlzIHRoZSBsZXhlciBlbnRyeSBwb2ludCB0aGF0IHNldHMgaW5zdGFuY2UgdmFyICd0b2tlbiciIiIKKworICAgICAgICAjIGFic3RyYWN0IG1ldGhvZAorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzZXRDaGFyU3RyZWFtKHNlbGYsIGlucHV0KToKKyAgICAgICAgIiIiU2V0IHRoZSBjaGFyIHN0cmVhbSBhbmQgcmVzZXQgdGhlIGxleGVyIiIiCisgICAgICAgIHNlbGYuaW5wdXQgPSBOb25lCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKworCisgICAgZGVmIGdldFNvdXJjZU5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmlucHV0LmdldFNvdXJjZU5hbWUoKQorCisKKyAgICBkZWYgZW1pdChzZWxmLCB0b2tlbj1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBzdGFuZGFyZCBtZXRob2QgY2FsbGVkIHRvIGF1dG9tYXRpY2FsbHkgZW1pdCBhIHRva2VuIGF0IHRoZQorICAgICAgICBvdXRlcm1vc3QgbGV4aWNhbCBydWxlLiAgVGhlIHRva2VuIG9iamVjdCBzaG91bGQgcG9pbnQgaW50byB0aGUKKyAgICAgICAgY2hhciBidWZmZXIgc3RhcnQuLnN0b3AuICBJZiB0aGVyZSBpcyBhIHRleHQgb3ZlcnJpZGUgaW4gJ3RleHQnLAorICAgICAgICB1c2UgdGhhdCB0byBzZXQgdGhlIHRva2VuJ3MgdGV4dC4gIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGVtaXQKKyAgICAgICAgY3VzdG9tIFRva2VuIG9iamVjdHMuCisKKyAgICAgICAgSWYgeW91IGFyZSBidWlsZGluZyB0cmVlcywgdGhlbiB5b3Ugc2hvdWxkIGFsc28gb3ZlcnJpZGUKKyAgICAgICAgUGFyc2VyIG9yIFRyZWVQYXJzZXIuZ2V0TWlzc2luZ1N5bWJvbCgpLgorICAgICAgICAiIiIKKworICAgICAgICBpZiB0b2tlbiBpcyBOb25lOgorICAgICAgICAgICAgdG9rZW4gPSBDb21tb25Ub2tlbigKKyAgICAgICAgICAgICAgICBpbnB1dD1zZWxmLmlucHV0LAorICAgICAgICAgICAgICAgIHR5cGU9c2VsZi5fc3RhdGUudHlwZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsPXNlbGYuX3N0YXRlLmNoYW5uZWwsCisgICAgICAgICAgICAgICAgc3RhcnQ9c2VsZi5fc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCwKKyAgICAgICAgICAgICAgICBzdG9wPXNlbGYuZ2V0Q2hhckluZGV4KCktMQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRva2VuLmxpbmUgPSBzZWxmLl9zdGF0ZS50b2tlblN0YXJ0TGluZQorICAgICAgICAgICAgdG9rZW4udGV4dCA9IHNlbGYuX3N0YXRlLnRleHQKKyAgICAgICAgICAgIHRva2VuLmNoYXJQb3NpdGlvbkluTGluZSA9IHNlbGYuX3N0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUKKworICAgICAgICBzZWxmLl9zdGF0ZS50b2tlbiA9IHRva2VuCisKKyAgICAgICAgcmV0dXJuIHRva2VuCisKKworICAgIGRlZiBtYXRjaChzZWxmLCBzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pbnB1dC5MQSgxKSAhPSBvcmQoYyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWNrdHJhY2tpbmdGYWlsZWQKKworICAgICAgICAgICAgICAgICAgICBtdGUgPSBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oYywgc2VsZi5pbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvdmVyKG10ZSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgbXRlCisKKyAgICAgICAgICAgICAgICBzZWxmLmlucHV0LmNvbnN1bWUoKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmlucHV0LkxBKDEpICE9IHM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFja3RyYWNraW5nRmFpbGVkCisKKyAgICAgICAgICAgICAgICBtdGUgPSBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24odW5pY2hyKHMpLCBzZWxmLmlucHV0KQorICAgICAgICAgICAgICAgIHNlbGYucmVjb3ZlcihtdGUpICMgZG9uJ3QgcmVhbGx5IHJlY292ZXI7IGp1c3QgY29uc3VtZSBpbiBsZXhlcgorICAgICAgICAgICAgICAgIHJhaXNlIG10ZQorCisgICAgICAgICAgICBzZWxmLmlucHV0LmNvbnN1bWUoKQorCisKKyAgICBkZWYgbWF0Y2hBbnkoc2VsZik6CisgICAgICAgIHNlbGYuaW5wdXQuY29uc3VtZSgpCisKKworICAgIGRlZiBtYXRjaFJhbmdlKHNlbGYsIGEsIGIpOgorICAgICAgICBpZiBzZWxmLmlucHV0LkxBKDEpIDwgYSBvciBzZWxmLmlucHV0LkxBKDEpID4gYjoKKyAgICAgICAgICAgIGlmIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA+IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgQmFja3RyYWNraW5nRmFpbGVkCisKKyAgICAgICAgICAgIG1yZSA9IE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbih1bmljaHIoYSksIHVuaWNocihiKSwgc2VsZi5pbnB1dCkKKyAgICAgICAgICAgIHNlbGYucmVjb3ZlcihtcmUpCisgICAgICAgICAgICByYWlzZSBtcmUKKworICAgICAgICBzZWxmLmlucHV0LmNvbnN1bWUoKQorCisKKyAgICBkZWYgZ2V0TGluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5wdXQubGluZQorCisKKyAgICBkZWYgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC5jaGFyUG9zaXRpb25JbkxpbmUKKworCisgICAgZGVmIGdldENoYXJJbmRleChzZWxmKToKKyAgICAgICAgIiIiV2hhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIG9mIGxvb2thaGVhZD8iIiIKKworICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC5pbmRleCgpCisKKworICAgIGRlZiBnZXRUZXh0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSB0ZXh0IG1hdGNoZWQgc28gZmFyIGZvciB0aGUgY3VycmVudCB0b2tlbiBvciBhbnkKKyAgICAgICAgdGV4dCBvdmVycmlkZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3N0YXRlLnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUudGV4dAorCisgICAgICAgIHJldHVybiBzZWxmLmlucHV0LnN1YnN0cmluZygKKyAgICAgICAgICAgIHNlbGYuX3N0YXRlLnRva2VuU3RhcnRDaGFySW5kZXgsCisgICAgICAgICAgICBzZWxmLmdldENoYXJJbmRleCgpLTEKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHNldFRleHQoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyB0b2tlbjsgaXQgd2lwZXMgYW55IHByZXZpb3VzCisgICAgICAgIGNoYW5nZXMgdG8gdGhlIHRleHQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9zdGF0ZS50ZXh0ID0gdGV4dAorCisKKyAgICB0ZXh0ID0gcHJvcGVydHkoZ2V0VGV4dCwgc2V0VGV4dCkKKworCisgICAgZGVmIHJlcG9ydEVycm9yKHNlbGYsIGUpOgorICAgICAgICAjIyBUT0RPOiBub3QgdGhvdWdodCBhYm91dCByZWNvdmVyeSBpbiBsZXhlciB5ZXQuCisKKyAgICAgICAgIyMgIyBpZiB3ZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yIGFuZCBoYXZlIG5vdCBtYXRjaGVkIGEgdG9rZW4KKyAgICAgICAgIyMgIyB5ZXQgc3VjY2Vzc2Z1bGx5LCBkb24ndCByZXBvcnQgYW55IGVycm9ycy4KKyAgICAgICAgIyMgaWYgc2VsZi5lcnJvclJlY292ZXJ5OgorICAgICAgICAjIyAgICAgI1N5c3RlbS5lcnIucHJpbnQoIltTUFVSSU9VU10gIik7CisgICAgICAgICMjICAgICByZXR1cm47CisgICAgICAgICMjCisgICAgICAgICMjIHNlbGYuZXJyb3JSZWNvdmVyeSA9IFRydWUKKworICAgICAgICBzZWxmLmRpc3BsYXlSZWNvZ25pdGlvbkVycm9yKHNlbGYudG9rZW5OYW1lcywgZSkKKworCisgICAgZGVmIGdldEVycm9yTWVzc2FnZShzZWxmLCBlLCB0b2tlbk5hbWVzKToKKyAgICAgICAgbXNnID0gTm9uZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKToKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiIFwKKyAgICAgICAgICAgICAgICAgICsgc2VsZi5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykgXAorICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGluZyAiIFwKKyAgICAgICAgICAgICAgICAgICsgc2VsZi5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuZXhwZWN0aW5nKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBOb1ZpYWJsZUFsdEV4Y2VwdGlvbik6CisgICAgICAgICAgICBtc2cgPSAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGNoYXJhY3RlciAiIFwKKyAgICAgICAgICAgICAgICAgICsgc2VsZi5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgRWFybHlFeGl0RXhjZXB0aW9uKToKKyAgICAgICAgICAgIG1zZyA9ICJyZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIGF0IGNoYXJhY3RlciAiIFwKKyAgICAgICAgICAgICAgICAgICsgc2VsZi5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbik6CisgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiBcCisgICAgICAgICAgICAgICAgICArIHNlbGYuZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpIFwKKyAgICAgICAgICAgICAgICAgICsgIiBleHBlY3Rpbmcgc2V0ICIgXAorICAgICAgICAgICAgICAgICAgKyByZXByKGUuZXhwZWN0aW5nKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKToKKyAgICAgICAgICAgIG1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiIFwKKyAgICAgICAgICAgICAgICAgICsgc2VsZi5nZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykgXAorICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGluZyBzZXQgIiBcCisgICAgICAgICAgICAgICAgICArIHJlcHIoZS5leHBlY3RpbmcpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGUsIE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbik6CisgICAgICAgICAgICBtc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIiBcCisgICAgICAgICAgICAgICAgICArIHNlbGYuZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpIFwKKyAgICAgICAgICAgICAgICAgICsgIiBleHBlY3Rpbmcgc2V0ICIgXAorICAgICAgICAgICAgICAgICAgKyBzZWxmLmdldENoYXJFcnJvckRpc3BsYXkoZS5hKSBcCisgICAgICAgICAgICAgICAgICArICIuLiIgXAorICAgICAgICAgICAgICAgICAgKyBzZWxmLmdldENoYXJFcnJvckRpc3BsYXkoZS5iKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSBCYXNlUmVjb2duaXplci5nZXRFcnJvck1lc3NhZ2Uoc2VsZiwgZSwgdG9rZW5OYW1lcykKKworICAgICAgICByZXR1cm4gbXNnCisKKworICAgIGRlZiBnZXRDaGFyRXJyb3JEaXNwbGF5KHNlbGYsIGMpOgorICAgICAgICBpZiBjID09IEVPRjoKKyAgICAgICAgICAgIGMgPSAnPEVPRj4nCisgICAgICAgIHJldHVybiByZXByKGMpCisKKworICAgIGRlZiByZWNvdmVyKHNlbGYsIHJlKToKKyAgICAgICAgIiIiCisgICAgICAgIExleGVycyBjYW4gbm9ybWFsbHkgbWF0Y2ggYW55IGNoYXIgaW4gaXQncyB2b2NhYnVsYXJ5IGFmdGVyIG1hdGNoaW5nCisgICAgICAgIGEgdG9rZW4sIHNvIGRvIHRoZSBlYXN5IHRoaW5nIGFuZCBqdXN0IGtpbGwgYSBjaGFyYWN0ZXIgYW5kIGhvcGUKKyAgICAgICAgaXQgYWxsIHdvcmtzIG91dC4gIFlvdSBjYW4gaW5zdGVhZCB1c2UgdGhlIHJ1bGUgaW52b2NhdGlvbiBzdGFjaworICAgICAgICB0byBkbyBzb3BoaXN0aWNhdGVkIGVycm9yIHJlY292ZXJ5IGlmIHlvdSBhcmUgaW4gYSBmcmFnbWVudCBydWxlLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmlucHV0LmNvbnN1bWUoKQorCisKKyAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgaW5wdXRTeW1ib2wgPSAiJXMgbGluZT0lZDolcyIgJSAoc2VsZi5pbnB1dC5MVCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRMaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgIEJhc2VSZWNvZ25pemVyLnRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXRTeW1ib2wpCisKKworICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgaW5wdXRTeW1ib2wgPSAiJXMgbGluZT0lZDolcyIgJSAoc2VsZi5pbnB1dC5MVCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRMaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgIEJhc2VSZWNvZ25pemVyLnRyYWNlT3V0KHNlbGYsIHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKQorCisKKworY2xhc3MgUGFyc2VyKEJhc2VSZWNvZ25pemVyKToKKyAgICAiIiIKKyAgICBAYnJpZWYgQmFzZWNsYXNzIGZvciBnZW5lcmF0ZWQgcGFyc2VyIGNsYXNzZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGV4ZXIsIHN0YXRlPU5vbmUpOgorICAgICAgICBCYXNlUmVjb2duaXplci5fX2luaXRfXyhzZWxmLCBzdGF0ZSkKKworICAgICAgICBzZWxmLmlucHV0ID0gbGV4ZXIKKworCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBCYXNlUmVjb2duaXplci5yZXNldChzZWxmKSAjIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcworICAgICAgICBpZiBzZWxmLmlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5pbnB1dC5zZWVrKDApICMgcmV3aW5kIHRoZSBpbnB1dAorCisKKyAgICBkZWYgZ2V0Q3VycmVudElucHV0U3ltYm9sKHNlbGYsIGlucHV0KToKKyAgICAgICAgcmV0dXJuIGlucHV0LkxUKDEpCisKKworICAgIGRlZiBnZXRNaXNzaW5nU3ltYm9sKHNlbGYsIGlucHV0LCBlLCBleHBlY3RlZFRva2VuVHlwZSwgZm9sbG93KToKKyAgICAgICAgaWYgZXhwZWN0ZWRUb2tlblR5cGUgPT0gRU9GOgorICAgICAgICAgICAgdG9rZW5UZXh0ID0gIjxtaXNzaW5nIEVPRj4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0b2tlblRleHQgPSAiPG1pc3NpbmcgIiArIHNlbGYudG9rZW5OYW1lc1tleHBlY3RlZFRva2VuVHlwZV0gKyAiPiIKKyAgICAgICAgdCA9IENvbW1vblRva2VuKHR5cGU9ZXhwZWN0ZWRUb2tlblR5cGUsIHRleHQ9dG9rZW5UZXh0KQorICAgICAgICBjdXJyZW50ID0gaW5wdXQuTFQoMSkKKyAgICAgICAgaWYgY3VycmVudC50eXBlID09IEVPRjoKKyAgICAgICAgICAgIGN1cnJlbnQgPSBpbnB1dC5MVCgtMSkKKworICAgICAgICBpZiBjdXJyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdC5saW5lID0gY3VycmVudC5saW5lCisgICAgICAgICAgICB0LmNoYXJQb3NpdGlvbkluTGluZSA9IGN1cnJlbnQuY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHQuY2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTAorICAgICAgICByZXR1cm4gdAorCisKKyAgICBkZWYgc2V0VG9rZW5TdHJlYW0oc2VsZiwgaW5wdXQpOgorICAgICAgICAiIiJTZXQgdGhlIHRva2VuIHN0cmVhbSBhbmQgcmVzZXQgdGhlIHBhcnNlciIiIgorCisgICAgICAgIHNlbGYuaW5wdXQgPSBOb25lCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKworCisgICAgZGVmIGdldFRva2VuU3RyZWFtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dAorCisKKyAgICBkZWYgZ2V0U291cmNlTmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5wdXQuZ2V0U291cmNlTmFtZSgpCisKKworICAgIGRlZiB0cmFjZUluKHNlbGYsIHJ1bGVOYW1lLCBydWxlSW5kZXgpOgorICAgICAgICBCYXNlUmVjb2duaXplci50cmFjZUluKHNlbGYsIHJ1bGVOYW1lLCBydWxlSW5kZXgsIHNlbGYuaW5wdXQuTFQoMSkpCisKKworICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgQmFzZVJlY29nbml6ZXIudHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCwgc2VsZi5pbnB1dC5MVCgxKSkKKworCitjbGFzcyBSdWxlUmV0dXJuU2NvcGUob2JqZWN0KToKKyAgICAiIiIKKyAgICBSdWxlcyBjYW4gcmV0dXJuIHN0YXJ0L3N0b3AgaW5mbyBhcyB3ZWxsIGFzIHBvc3NpYmxlIHRyZWVzIGFuZCB0ZW1wbGF0ZXMuCisgICAgIiIiCisKKyAgICBkZWYgZ2V0U3RhcnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3RhcnQgdG9rZW4gb3IgdHJlZS4iIiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCisgICAgZGVmIGdldFN0b3Aoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3RvcCB0b2tlbiBvciB0cmVlLiIiIgorICAgICAgICByZXR1cm4gTm9uZQorCisKKyAgICBkZWYgZ2V0VHJlZShzZWxmKToKKyAgICAgICAgIiIiSGFzIGEgdmFsdWUgcG90ZW50aWFsbHkgaWYgb3V0cHV0PUFTVC4iIiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCisgICAgZGVmIGdldFRlbXBsYXRlKHNlbGYpOgorICAgICAgICAiIiJIYXMgYSB2YWx1ZSBwb3RlbnRpYWxseSBpZiBvdXRwdXQ9dGVtcGxhdGUuIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgUGFyc2VyUnVsZVJldHVyblNjb3BlKFJ1bGVSZXR1cm5TY29wZSk6CisgICAgIiIiCisgICAgUnVsZXMgdGhhdCByZXR1cm4gbW9yZSB0aGFuIGEgc2luZ2xlIHZhbHVlIG11c3QgcmV0dXJuIGFuIG9iamVjdAorICAgIGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMuICBCZXNpZGVzIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4KKyAgICBSdWxlTGFiZWxTY29wZS5wcmVkZWZpbmVkUnVsZVByb3BlcnRpZXNTY29wZSB0aGVyZSBtYXkgYmUgdXNlci1kZWZpbmVkCisgICAgcmV0dXJuIHZhbHVlcy4gIFRoaXMgY2xhc3Mgc2ltcGx5IGRlZmluZXMgdGhlIG1pbmltdW0gcHJvcGVydGllcyB0aGF0CisgICAgYXJlIGFsd2F5cyBkZWZpbmVkIGFuZCBtZXRob2RzIHRvIGFjY2VzcyB0aGUgb3RoZXJzIHRoYXQgbWlnaHQgYmUKKyAgICBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIG91dHB1dCBvcHRpb24gc3VjaCBhcyB0ZW1wbGF0ZSBhbmQgdHJlZS4KKworICAgIE5vdGUgdGV4dCBpcyBub3QgYW4gYWN0dWFsIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gdmFsdWUsIGl0IGlzIGNvbXB1dGVkCisgICAgZnJvbSBzdGFydCBhbmQgc3RvcCB1c2luZyB0aGUgaW5wdXQgc3RyZWFtJ3MgdG9TdHJpbmcoKSBtZXRob2QuICBJCisgICAgY291bGQgYWRkIGEgY3RvciB0byB0aGlzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaW4gYW5kIHN0b3JlIHRoZSBpbnB1dAorICAgIHN0cmVhbSwgYnV0IEknbSBub3Qgc3VyZSB3ZSB3YW50IHRvIGRvIHRoYXQuICBJdCB3b3VsZCBzZWVtIHRvIGJlIHVuZGVmaW5lZAorICAgIHRvIGdldCB0aGUgLnRleHQgcHJvcGVydHkgYW55d2F5IGlmIHRoZSBydWxlIG1hdGNoZXMgdG9rZW5zIGZyb20gbXVsdGlwbGUKKyAgICBpbnB1dCBzdHJlYW1zLgorCisgICAgSSBkbyBub3QgdXNlIGdldHRlcnMgZm9yIGZpZWxkcyBvZiBvYmplY3RzIHRoYXQgYXJlIHVzZWQgc2ltcGx5IHRvCisgICAgZ3JvdXAgdmFsdWVzIHN1Y2ggYXMgdGhpcyBhZ2dyZWdhdGUuICBUaGUgZ2V0dGVycy9zZXR0ZXJzIGFyZSB0aGVyZSB0bworICAgIHNhdGlzZnkgdGhlIHN1cGVyY2xhc3MgaW50ZXJmYWNlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXJ0ID0gTm9uZQorICAgICAgICBzZWxmLnN0b3AgPSBOb25lCisgICAgICAgIHNlbGYudHJlZSA9IE5vbmUgICMgb25seSB1c2VkIHdoZW4gb3V0cHV0PUFTVAorCisKKyAgICBkZWYgZ2V0U3RhcnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0YXJ0CisKKworICAgIGRlZiBnZXRTdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdG9wCisKKworICAgIGRlZiBnZXRUcmVlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50cmVlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL3N0cmVhbXMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL3N0cmVhbXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliYTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9hbnRscjMvc3RyZWFtcy5weQpAQCAtMCwwICsxLDE1MjIgQEAKKyIiIkFOVExSMyBydW50aW1lIHBhY2thZ2UiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKK2ltcG9ydCBjb2RlY3MKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gYW50bHIzLmNvbnN0YW50cyBpbXBvcnQgREVGQVVMVF9DSEFOTkVMLCBFT0YKK2Zyb20gYW50bHIzLnRva2VucyBpbXBvcnQgVG9rZW4sIENvbW1vblRva2VuCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBiYXNpYyBpbnRlcmZhY2VzCisjICAgSW50U3RyZWFtCisjICAgICstIENoYXJTdHJlYW0KKyMgICAgXC0gVG9rZW5TdHJlYW0KKyMKKyMgc3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudGVkIGFsbCBtZXRob2RzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIEludFN0cmVhbShvYmplY3QpOgorICAgICIiIgorICAgIEBicmllZiBCYXNlIGludGVyZmFjZSBmb3Igc3RyZWFtcyBvZiBpbnRlZ2VyIHZhbHVlcy4KKworICAgIEEgc2ltcGxlIHN0cmVhbSBvZiBpbnRlZ2VycyB1c2VkIHdoZW4gYWxsIEkgY2FyZSBhYm91dCBpcyB0aGUgY2hhcgorICAgIG9yIHRva2VuIHR5cGUgc2VxdWVuY2UgKHN1Y2ggYXMgaW50ZXJwcmV0YXRpb24pLgorICAgICIiIgorCisgICAgZGVmIGNvbnN1bWUoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIExBKHNlbGYsIGkpOgorICAgICAgICAiIiJHZXQgaW50IGF0IGN1cnJlbnQgaW5wdXQgcG9pbnRlciArIGkgYWhlYWQgd2hlcmUgaT0xIGlzIG5leHQgaW50LgorCisgICAgICAgIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIGFsbG93ZWQuICBMQSgtMSkgaXMgcHJldmlvdXMgdG9rZW4gKHRva2VuCisJanVzdCBtYXRjaGVkKS4gIExBKC1pKSB3aGVyZSBpIGlzIGJlZm9yZSBmaXJzdCB0b2tlbiBzaG91bGQKKwl5aWVsZCAtMSwgaW52YWxpZCBjaGFyIC8gRU9GLgorCSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIG1hcmsoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZWxsIHRoZSBzdHJlYW0gdG8gc3RhcnQgYnVmZmVyaW5nIGlmIGl0IGhhc24ndCBhbHJlYWR5LiAgUmV0dXJuCisgICAgICAgIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24sIGluZGV4KCksIG9yIHNvbWUgb3RoZXIgbWFya2VyIHNvIHRoYXQKKyAgICAgICAgd2hlbiBwYXNzZWQgdG8gcmV3aW5kKCkgeW91IGdldCBiYWNrIHRvIHRoZSBzYW1lIHNwb3QuCisgICAgICAgIHJld2luZChtYXJrKCkpIHNob3VsZCBub3QgYWZmZWN0IHRoZSBpbnB1dCBjdXJzb3IuICBUaGUgTGV4ZXIKKyAgICAgICAgdHJhY2sgbGluZS9jb2wgaW5mbyBhcyB3ZWxsIGFzIGlucHV0IGluZGV4IHNvIGl0cyBtYXJrZXJzIGFyZQorICAgICAgICBub3QgcHVyZSBpbnB1dCBpbmRleGVzLiAgU2FtZSBmb3IgdHJlZSBub2RlIHN0cmVhbXMuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGluZGV4KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCBpbmRleCAwLi5uIHdoZXJlIG4gaW5kaWNhdGVzIHRoZQorICAgICAgICBsYXN0IHN5bWJvbCBoYXMgYmVlbiByZWFkLiAgVGhlIGluZGV4IGlzIHRoZSBzeW1ib2wgYWJvdXQgdG8gYmUKKyAgICAgICAgcmVhZCBub3QgdGhlIG1vc3QgcmVjZW50bHkgcmVhZCBzeW1ib2wuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHJld2luZChzZWxmLCBtYXJrZXI9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXNldCB0aGUgc3RyZWFtIHNvIHRoYXQgbmV4dCBjYWxsIHRvIGluZGV4IHdvdWxkIHJldHVybiBtYXJrZXIuCisgICAgICAgIFRoZSBtYXJrZXIgd2lsbCB1c3VhbGx5IGJlIGluZGV4KCkgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS4gIEl0J3MKKyAgICAgICAganVzdCBhIG1hcmtlciB0byBpbmRpY2F0ZSB3aGF0IHN0YXRlIHRoZSBzdHJlYW0gd2FzIGluLiAgVGhpcyBpcworICAgICAgICBlc3NlbnRpYWxseSBjYWxsaW5nIHJlbGVhc2UoKSBhbmQgc2VlaygpLiAgSWYgdGhlcmUgYXJlIG1hcmtlcnMKKyAgICAgICAgY3JlYXRlZCBhZnRlciB0aGlzIG1hcmtlciBhcmd1bWVudCwgdGhpcyByb3V0aW5lIG11c3QgdW5yb2xsIHRoZW0KKyAgICAgICAgbGlrZSBhIHN0YWNrLiAgQXNzdW1lIHRoZSBzdGF0ZSB0aGUgc3RyZWFtIHdhcyBpbiB3aGVuIHRoaXMgbWFya2VyCisgICAgICAgIHdhcyBjcmVhdGVkLgorCisgICAgICAgIElmIG1hcmtlciBpcyBOb25lOgorICAgICAgICBSZXdpbmQgdG8gdGhlIGlucHV0IHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hcmtlci4KKyAgICAgICAgVXNlZCBjdXJyZW50bHkgb25seSBhZnRlciBhIGN5Y2xpYyBERkEgYW5kIGp1c3QKKyAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIGEgc2VtL3N5biBwcmVkaWNhdGUgdG8gZ2V0IHRoZQorICAgICAgICBpbnB1dCBwb3NpdGlvbiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZGVjaXNpb24uCisgICAgICAgIERvIG5vdCAicG9wIiB0aGUgbWFya2VyIG9mZiB0aGUgc3RhdGUuICBtYXJrKGkpCisgICAgICAgIGFuZCByZXdpbmQoaSkgc2hvdWxkIGJhbGFuY2Ugc3RpbGwuIEl0IGlzCisgICAgICAgIGxpa2UgaW52b2tpbmcgcmV3aW5kKGxhc3QgbWFya2VyKSBidXQgaXQgc2hvdWxkIG5vdCAicG9wIgorICAgICAgICB0aGUgbWFya2VyIG9mZi4gIEl0J3MgbGlrZSBzZWVrKGxhc3QgbWFya2VyJ3MgaW5wdXQgcG9zaXRpb24pLgorCSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHJlbGVhc2Uoc2VsZiwgbWFya2VyPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgWW91IG1heSB3YW50IHRvIGNvbW1pdCB0byBhIGJhY2t0cmFjayBidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSB0aGUKKyAgICAgICAgc3RyZWFtIHRvIGtlZXAgYm9va2tlZXBpbmcgb2JqZWN0cyBhcm91bmQgZm9yIGEgbWFya2VyIHRoYXQgaXMKKyAgICAgICAgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gIFRoaXMgd2lsbCBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yIGFzCisgICAgICAgIHJld2luZCgpIGV4Y2VwdCBpdCByZWxlYXNlcyByZXNvdXJjZXMgd2l0aG91dCB0aGUgYmFja3dhcmQgc2Vlay4KKyAgICAgICAgVGhpcyBtdXN0IHRocm93IGF3YXkgcmVzb3VyY2VzIGZvciBhbGwgbWFya2VycyBiYWNrIHRvIHRoZSBtYXJrZXIKKyAgICAgICAgYXJndW1lbnQuICBTbyBpZiB5b3UncmUgbmVzdGVkIDUgbGV2ZWxzIG9mIG1hcmsoKSwgYW5kIHRoZW4gcmVsZWFzZSgyKQorICAgICAgICB5b3UgaGF2ZSB0byByZWxlYXNlIHJlc291cmNlcyBmb3IgZGVwdGhzIDIuLjUuCisJIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgc2VlayhzZWxmLCBpbmRleCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGlucHV0IGN1cnNvciB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IGluZGV4LiAgVGhpcyBpcworICAgICAgICBub3JtYWxseSB1c2VkIHRvIHNlZWsgYWhlYWQgaW4gdGhlIGlucHV0IHN0cmVhbS4gIE5vIGJ1ZmZlcmluZyBpcworICAgICAgICByZXF1aXJlZCB0byBkbyB0aGlzIHVubGVzcyB5b3Uga25vdyB5b3VyIHN0cmVhbSB3aWxsIHVzZSBzZWVrIHRvCisgICAgICAgIG1vdmUgYmFja3dhcmRzIHN1Y2ggYXMgd2hlbiBiYWNrdHJhY2tpbmcuCisKKyAgICAgICAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSByZXdpbmQgaW4gaXRzIG11bHRpLWRpcmVjdGlvbmFsCisgICAgICAgIHJlcXVpcmVtZW50IGFuZCBpbiB0aGF0IGl0cyBhcmd1bWVudCBpcyBzdHJpY3RseSBhbiBpbnB1dCBjdXJzb3IKKyAgICAgICAgKGluZGV4KS4KKworICAgICAgICBGb3IgY2hhciBzdHJlYW1zLCBzZWVraW5nIGZvcndhcmQgbXVzdCB1cGRhdGUgdGhlIHN0cmVhbSBzdGF0ZSBzdWNoCisgICAgICAgIGFzIGxpbmUgbnVtYmVyLiAgRm9yIHNlZWtpbmcgYmFja3dhcmRzLCB5b3Ugd2lsbCBiZSBwcmVzdW1hYmx5CisgICAgICAgIGJhY2t0cmFja2luZyB1c2luZyB0aGUgbWFyay9yZXdpbmQgbWVjaGFuaXNtIHRoYXQgcmVzdG9yZXMgc3RhdGUgYW5kCisgICAgICAgIHNvIHRoaXMgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gdXBkYXRlIHN0YXRlIHdoZW4gc2Vla2luZyBiYWNrd2FyZHMuCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgZm9yIGVmZmljaWVudCBiYWNrdHJhY2tpbmcgdXNpbmcKKyAgICAgICAgbWVtb2l6YXRpb24sIGJ1dCBpbiB0aGUgZnV0dXJlIGl0IG1heSBiZSB1c2VkIGZvciBpbmNyZW1lbnRhbCBwYXJzaW5nLgorCisgICAgICAgIFRoZSBpbmRleCBpcyAwLi5uLTEuICBBIHNlZWsgdG8gcG9zaXRpb24gaSBtZWFucyB0aGF0IExBKDEpIHdpbGwKKyAgICAgICAgcmV0dXJuIHRoZSBpdGggc3ltYm9sLiAgU28sIHNlZWtpbmcgdG8gMCBtZWFucyBMQSgxKSB3aWxsIHJldHVybiB0aGUKKyAgICAgICAgZmlyc3QgZWxlbWVudCBpbiB0aGUgc3RyZWFtLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzaXplKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgT25seSBtYWtlcyBzZW5zZSBmb3Igc3RyZWFtcyB0aGF0IGJ1ZmZlciBldmVyeXRoaW5nIHVwIHByb2JhYmx5LCBidXQKKyAgICAgICAgbWlnaHQgYmUgdXNlZnVsIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBzdHJlYW0gb3IgZm9yIHRlc3RpbmcuICBUaGlzCisgICAgICAgIHZhbHVlIGluY2x1ZGVzIGEgc2luZ2xlIEVPRi4KKwkiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRTb3VyY2VOYW1lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgV2hlcmUgYXJlIHlvdSBnZXR0aW5nIHN5bWJvbHMgZnJvbT8gIE5vcm1hbGx5LCBpbXBsZW1lbnRhdGlvbnMgd2lsbAorICAgICAgICBwYXNzIHRoZSBidWNrIGFsbCB0aGUgd2F5IHRvIHRoZSBsZXhlciB3aG8gY2FuIGFzayBpdHMgaW5wdXQgc3RyZWFtCisgICAgICAgIGZvciB0aGUgZmlsZSBuYW1lIG9yIHdoYXRldmVyLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgQ2hhclN0cmVhbShJbnRTdHJlYW0pOgorICAgICIiIgorICAgIEBicmllZiBBIHNvdXJjZSBvZiBjaGFyYWN0ZXJzIGZvciBhbiBBTlRMUiBsZXhlci4KKworICAgIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisKKyAgICAiIiIKKworICAgICMgcHlsaW50IGRvZXMgbm90IHJlYWxpemUgdGhhdCB0aGlzIGlzIGFuIGludGVyZmFjZSwgdG9vCisgICAgI3B5bGludDogZGlzYWJsZS1tc2c9VzAyMjMKKworICAgIEVPRiA9IC0xCisKKworICAgIGRlZiBzdWJzdHJpbmcoc2VsZiwgc3RhcnQsIHN0b3ApOgorICAgICAgICAiIiIKKyAgICAgICAgRm9yIGluZmluaXRlIHN0cmVhbXMsIHlvdSBkb24ndCBuZWVkIHRoaXM7IHByaW1hcmlseSBJJ20gcHJvdmlkaW5nCisgICAgICAgIGEgdXNlZnVsIGludGVyZmFjZSBmb3IgYWN0aW9uIGNvZGUuICBKdXN0IG1ha2Ugc3VyZSBhY3Rpb25zIGRvbid0CisgICAgICAgIHVzZSB0aGlzIG9uIHN0cmVhbXMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBMVChzZWxmLCBpKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCB0aGUgaXRoIGNoYXJhY3RlciBvZiBsb29rYWhlYWQuICBUaGlzIGlzIHRoZSBzYW1lIHVzdWFsbHkgYXMKKyAgICAgICAgTEEoaSkuICBUaGlzIHdpbGwgYmUgdXNlZCBmb3IgbGFiZWxzIGluIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgbGV4ZXIgY29kZS4gIEknZCBwcmVmZXIgdG8gcmV0dXJuIGEgY2hhciBoZXJlIHR5cGUtd2lzZSwgYnV0IGl0J3MKKyAgICAgICAgcHJvYmFibHkgYmV0dGVyIHRvIGJlIDMyLWJpdCBjbGVhbiBhbmQgYmUgY29uc2lzdGVudCB3aXRoIExBLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRMaW5lKHNlbGYpOgorICAgICAgICAiIiJBTlRMUiB0cmFja3MgdGhlIGxpbmUgaW5mb3JtYXRpb24gYXV0b21hdGljYWxseSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHNldExpbmUoc2VsZiwgbGluZSk6CisgICAgICAgICIiIgorICAgICAgICBCZWNhdXNlIHRoaXMgc3RyZWFtIGNhbiByZXdpbmQsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byByZXNldCB0aGUgbGluZQorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIDAuLm4tMQorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZiwgcG9zKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIFRva2VuU3RyZWFtKEludFN0cmVhbSk6CisgICAgIiIiCisKKyAgICBAYnJpZWYgQSBzdHJlYW0gb2YgdG9rZW5zIGFjY2Vzc2luZyB0b2tlbnMgZnJvbSBhIFRva2VuU291cmNlCisKKyAgICBUaGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgorCisgICAgIiIiCisKKyAgICAjIHB5bGludCBkb2VzIG5vdCByZWFsaXplIHRoYXQgdGhpcyBpcyBhbiBpbnRlcmZhY2UsIHRvbworICAgICNweWxpbnQ6IGRpc2FibGUtbXNnPVcwMjIzCisKKyAgICBkZWYgTFQoc2VsZiwgayk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgVG9rZW4gYXQgY3VycmVudCBpbnB1dCBwb2ludGVyICsgaSBhaGVhZCB3aGVyZSBpPTEgaXMgbmV4dCBUb2tlbi4KKyAgICAgICAgaTwwIGluZGljYXRlcyB0b2tlbnMgaW4gdGhlIHBhc3QuICBTbyAtMSBpcyBwcmV2aW91cyB0b2tlbiBhbmQgLTIgaXMKKyAgICAgICAgdHdvIHRva2VucyBhZ28uIExUKDApIGlzIHVuZGVmaW5lZC4gIEZvciBpPj1uLCByZXR1cm4gVG9rZW4uRU9GVG9rZW4uCisgICAgICAgIFJldHVybiBudWxsIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgICAgICAgIHRoYXQgaXMgbmVnYXRpdmUuCisJIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgcmFuZ2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBIb3cgZmFyIGFoZWFkIGhhcyB0aGUgc3RyZWFtIGJlZW4gYXNrZWQgdG8gbG9vaz8gIFRoZSByZXR1cm4KKyAgICAgICAgdmFsdWUgaXMgYSB2YWxpZCBpbmRleCBmcm9tIDAuLm4tMS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0KHNlbGYsIGkpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IGEgdG9rZW4gYXQgYW4gYWJzb2x1dGUgaW5kZXggaTsgMC4ubi0xLiAgVGhpcyBpcyByZWFsbHkgb25seQorICAgICAgICBuZWVkZWQgZm9yIHByb2ZpbGluZyBhbmQgZGVidWdnaW5nIGFuZCB0b2tlbiBzdHJlYW0gcmV3cml0aW5nLgorICAgICAgICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBidWZmZXIgdXAgdG9rZW5zLCB0aGVuIHRoaXMgbWV0aG9kIG1ha2VzIG5vCisgICAgICAgIHNlbnNlIGZvciB5b3UuICBOYXR1cmFsbHkgeW91IGNhbid0IHVzZSB0aGUgcmV3cml0ZSBzdHJlYW0gZmVhdHVyZS4KKyAgICAgICAgSSBiZWxpZXZlIERlYnVnVG9rZW5TdHJlYW0gY2FuIGVhc2lseSBiZSBhbHRlcmVkIHRvIG5vdCB1c2UKKyAgICAgICAgdGhpcyBtZXRob2QsIHJlbW92aW5nIHRoZSBkZXBlbmRlbmN5LgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUb2tlblNvdXJjZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFdoZXJlIGlzIHRoaXMgc3RyZWFtIHB1bGxpbmcgdG9rZW5zIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisgICAgICAgIHRoZSBvYmplY3QgdGhhdCBwcm92aWRlcyBUb2tlbiBvYmplY3RzLgorCSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHRvU3RyaW5nKHNlbGYsIHN0YXJ0PU5vbmUsIHN0b3A9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIHRleHQgb2YgYWxsIHRva2VucyBmcm9tIHN0YXJ0IHRvIHN0b3AsIGluY2x1c2l2ZS4KKyAgICAgICAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBidWZmZXIgYWxsIHRoZSB0b2tlbnMgdGhlbiBpdCBjYW4ganVzdAorICAgICAgICByZXR1cm4gIiIgb3IgbnVsbDsgIFVzZXJzIHNob3VsZCBub3QgYWNjZXNzICRydWxlTGFiZWwudGV4dCBpbgorICAgICAgICBhbiBhY3Rpb24gb2YgY291cnNlIGluIHRoYXQgY2FzZS4KKworICAgICAgICBCZWNhdXNlIHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UgYSB0b2tlbiB3aXRoIGFuIGluZGV4IHN0b3JlZAorICAgICAgICBpbiBpdCwgd2UgbXVzdCBwcm92aWRlIGEgbWVhbnMgZm9yIHR3byB0b2tlbiBvYmplY3RzIHRoZW1zZWx2ZXMgdG8KKyAgICAgICAgaW5kaWNhdGUgdGhlIHN0YXJ0L2VuZCBsb2NhdGlvbi4gIE1vc3Qgb2Z0ZW4gdGhpcyB3aWxsIGp1c3QgZGVsZWdhdGUKKyAgICAgICAgdG8gdGhlIG90aGVyIHRvU3RyaW5nKGludCxpbnQpLiAgVGhpcyBpcyBhbHNvIHBhcmFsbGVsIHdpdGgKKyAgICAgICAgdGhlIFRyZWVOb2RlU3RyZWFtLnRvU3RyaW5nKE9iamVjdCxPYmplY3QpLgorCSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNoYXJhY3RlciBzdHJlYW1zIGZvciB1c2UgaW4gbGV4ZXJzCisjICAgQ2hhclN0cmVhbQorIyAgIFwtIEFOVExSU3RyaW5nU3RyZWFtCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgQU5UTFJTdHJpbmdTdHJlYW0oQ2hhclN0cmVhbSk6CisgICAgIiIiCisgICAgQGJyaWVmIENoYXJTdHJlYW0gdGhhdCBwdWxsIGRhdGEgZnJvbSBhIHVuaWNvZGUgc3RyaW5nLgorCisgICAgQSBwcmV0dHkgcXVpY2sgQ2hhclN0cmVhbSB0aGF0IHB1bGxzIGFsbCBkYXRhIGZyb20gYW4gYXJyYXkKKyAgICBkaXJlY3RseS4gIEV2ZXJ5IG1ldGhvZCBjYWxsIGNvdW50cyBpbiB0aGUgbGV4ZXIuCisKKyAgICAiIiIKKworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIGRhdGEgVGhpcyBzaG91bGQgYmUgYSB1bmljb2RlIHN0cmluZyBob2xkaW5nIHRoZSBkYXRhIHlvdSB3YW50CisgICAgICAgICAgIHRvIHBhcnNlLiBJZiB5b3UgcGFzcyBpbiBhIGJ5dGUgc3RyaW5nLCB0aGUgTGV4ZXIgd2lsbCBjaG9rZSBvbgorICAgICAgICAgICBub24tYXNjaWkgZGF0YS4KKworICAgICAgICAiIiIKKworICAgICAgICBDaGFyU3RyZWFtLl9faW5pdF9fKHNlbGYpCisKKyAgCSMgVGhlIGRhdGEgYmVpbmcgc2Nhbm5lZAorICAgICAgICBzZWxmLnN0cmRhdGEgPSB1bmljb2RlKGRhdGEpCisgICAgICAgIHNlbGYuZGF0YSA9IFtvcmQoYykgZm9yIGMgaW4gc2VsZi5zdHJkYXRhXQorCisJIyBIb3cgbWFueSBjaGFyYWN0ZXJzIGFyZSBhY3R1YWxseSBpbiB0aGUgYnVmZmVyCisgICAgICAgIHNlbGYubiA9IGxlbihkYXRhKQorCisgCSMgMC4ubi0xIGluZGV4IGludG8gc3RyaW5nIG9mIG5leHQgY2hhcgorICAgICAgICBzZWxmLnAgPSAwCisKKwkjIGxpbmUgbnVtYmVyIDEuLm4gd2l0aGluIHRoZSBpbnB1dAorICAgICAgICBzZWxmLmxpbmUgPSAxCisKKyAJIyBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICAjIGxpbmUgMC4ubi0xCisgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gMAorCisJIyBBIGxpc3Qgb2YgQ2hhclN0cmVhbVN0YXRlIG9iamVjdHMgdGhhdCB0cmFja3MgdGhlIHN0cmVhbSBzdGF0ZQorICAgICAgICAjIHZhbHVlcyBsaW5lLCBjaGFyUG9zaXRpb25JbkxpbmUsIGFuZCBwIHRoYXQgY2FuIGNoYW5nZSBhcyB5b3UKKyAgICAgICAgIyBtb3ZlIHRocm91Z2ggdGhlIGlucHV0IHN0cmVhbS4gIEluZGV4ZWQgZnJvbSAwLi5tYXJrRGVwdGgtMS4KKyAgICAgICAgc2VsZi5fbWFya2VycyA9IFsgXQorICAgICAgICBzZWxmLmxhc3RNYXJrZXIgPSBOb25lCisgICAgICAgIHNlbGYubWFya0RlcHRoID0gMAorCisgICAgICAgICMgV2hhdCBpcyBuYW1lIG9yIHNvdXJjZSBvZiB0aGlzIGNoYXIgc3RyZWFtPworICAgICAgICBzZWxmLm5hbWUgPSBOb25lCisKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlc2V0IHRoZSBzdHJlYW0gc28gdGhhdCBpdCdzIGluIHRoZSBzYW1lIHN0YXRlIGl0IHdhcworICAgICAgICB3aGVuIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgKmV4Y2VwdCogdGhlIGRhdGEgYXJyYXkgaXMgbm90CisgICAgICAgIHRvdWNoZWQuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYucCA9IDAKKyAgICAgICAgc2VsZi5saW5lID0gMQorICAgICAgICBzZWxmLmNoYXJQb3NpdGlvbkluTGluZSA9IDAKKyAgICAgICAgc2VsZi5fbWFya2VycyA9IFsgXQorCisKKyAgICBkZWYgY29uc3VtZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5kYXRhW3NlbGYucF0gPT0gMTA6ICMgXG4KKyAgICAgICAgICAgICAgICBzZWxmLmxpbmUgKz0gMQorICAgICAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNoYXJQb3NpdGlvbkluTGluZSArPSAxCisKKyAgICAgICAgICAgIHNlbGYucCArPSAxCisKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAjIGhhcHBlbmQgd2hlbiB3ZSByZWFjaGVkIEVPRiBhbmQgc2VsZi5kYXRhW3NlbGYucF0gZmFpbHMKKyAgICAgICAgICAgICMganVzdCBkbyBub3RoaW5nCisgICAgICAgICAgICBwYXNzCisKKworCisgICAgZGVmIExBKHNlbGYsIGkpOgorICAgICAgICBpZiBpID09IDA6CisgICAgICAgICAgICByZXR1cm4gMCAjIHVuZGVmaW5lZAorCisgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgaSArPSAxICMgZS5nLiwgdHJhbnNsYXRlIExBKC0xKSB0byB1c2Ugb2Zmc2V0IGk9MDsgdGhlbiBkYXRhW3ArMC0xXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFbc2VsZi5wK2ktMV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRU9GCisKKworCisgICAgZGVmIExUKHNlbGYsIGkpOgorICAgICAgICBpZiBpID09IDA6CisgICAgICAgICAgICByZXR1cm4gMCAjIHVuZGVmaW5lZAorCisgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgaSArPSAxICMgZS5nLiwgdHJhbnNsYXRlIExBKC0xKSB0byB1c2Ugb2Zmc2V0IGk9MDsgdGhlbiBkYXRhW3ArMC0xXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnN0cmRhdGFbc2VsZi5wK2ktMV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRU9GCisKKworICAgIGRlZiBpbmRleChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wgaW5kZXggMC4ubiB3aGVyZSBuIGluZGljYXRlcyB0aGUKKyAgICAgICAgbGFzdCBzeW1ib2wgaGFzIGJlZW4gcmVhZC4gIFRoZSBpbmRleCBpcyB0aGUgaW5kZXggb2YgY2hhciB0bworICAgICAgICBiZSByZXR1cm5lZCBmcm9tIExBKDEpLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5wCisKKworICAgIGRlZiBzaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uCisKKworICAgIGRlZiBtYXJrKHNlbGYpOgorICAgICAgICBzdGF0ZSA9IChzZWxmLnAsIHNlbGYubGluZSwgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX21hcmtlcnNbc2VsZi5tYXJrRGVwdGhdID0gc3RhdGUKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBzZWxmLl9tYXJrZXJzLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgc2VsZi5tYXJrRGVwdGggKz0gMQorCisgICAgICAgIHNlbGYubGFzdE1hcmtlciA9IHNlbGYubWFya0RlcHRoCisKKyAgICAgICAgcmV0dXJuIHNlbGYubGFzdE1hcmtlcgorCisKKyAgICBkZWYgcmV3aW5kKHNlbGYsIG1hcmtlcj1Ob25lKToKKyAgICAgICAgaWYgbWFya2VyIGlzIE5vbmU6CisgICAgICAgICAgICBtYXJrZXIgPSBzZWxmLmxhc3RNYXJrZXIKKworICAgICAgICBwLCBsaW5lLCBjaGFyUG9zaXRpb25JbkxpbmUgPSBzZWxmLl9tYXJrZXJzW21hcmtlci0xXQorCisgICAgICAgIHNlbGYuc2VlayhwKQorICAgICAgICBzZWxmLmxpbmUgPSBsaW5lCisgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIHNlbGYucmVsZWFzZShtYXJrZXIpCisKKworICAgIGRlZiByZWxlYXNlKHNlbGYsIG1hcmtlcj1Ob25lKToKKyAgICAgICAgaWYgbWFya2VyIGlzIE5vbmU6CisgICAgICAgICAgICBtYXJrZXIgPSBzZWxmLmxhc3RNYXJrZXIKKworICAgICAgICBzZWxmLm1hcmtEZXB0aCA9IG1hcmtlci0xCisKKworICAgIGRlZiBzZWVrKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiCisgICAgICAgIGNvbnN1bWUoKSBhaGVhZCB1bnRpbCBwPT1pbmRleDsgY2FuJ3QganVzdCBzZXQgcD1pbmRleCBhcyB3ZSBtdXN0CisgICAgICAgIHVwZGF0ZSBsaW5lIGFuZCBjaGFyUG9zaXRpb25JbkxpbmUuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGluZGV4IDw9IHNlbGYucDoKKyAgICAgICAgICAgIHNlbGYucCA9IGluZGV4ICMganVzdCBqdW1wOyBkb24ndCB1cGRhdGUgc3RyZWFtIHN0YXRlIChsaW5lLCAuLi4pCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHNlZWsgZm9yd2FyZCwgY29uc3VtZSB1bnRpbCBwIGhpdHMgaW5kZXgKKyAgICAgICAgd2hpbGUgc2VsZi5wIDwgaW5kZXg6CisgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorCisKKyAgICBkZWYgc3Vic3RyaW5nKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyZGF0YVtzdGFydDpzdG9wKzFdCisKKworICAgIGRlZiBnZXRMaW5lKHNlbGYpOgorICAgICAgICAiIiJVc2luZyBzZXR0ZXIvZ2V0dGVyIG1ldGhvZHMgaXMgZGVwcmVjYXRlZC4gVXNlIG8ubGluZSBpbnN0ZWFkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5saW5lCisKKworICAgIGRlZiBnZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBVc2luZyBzZXR0ZXIvZ2V0dGVyIG1ldGhvZHMgaXMgZGVwcmVjYXRlZC4gVXNlIG8uY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgIGluc3RlYWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUKKworCisgICAgZGVmIHNldExpbmUoc2VsZiwgbGluZSk6CisgICAgICAgICIiIlVzaW5nIHNldHRlci9nZXR0ZXIgbWV0aG9kcyBpcyBkZXByZWNhdGVkLiBVc2Ugby5saW5lIGluc3RlYWQuIiIiCisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKworCisgICAgZGVmIHNldENoYXJQb3NpdGlvbkluTGluZShzZWxmLCBwb3MpOgorICAgICAgICAiIiIKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLmNoYXJQb3NpdGlvbkluTGluZQorICAgICAgICBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUgPSBwb3MKKworCisgICAgZGVmIGdldFNvdXJjZU5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworCitjbGFzcyBBTlRMUkZpbGVTdHJlYW0oQU5UTFJTdHJpbmdTdHJlYW0pOgorICAgICIiIgorICAgIEBicmllZiBDaGFyU3RyZWFtIHRoYXQgb3BlbnMgYSBmaWxlIHRvIHJlYWQgdGhlIGRhdGEuCisKKyAgICBUaGlzIGlzIGEgY2hhciBidWZmZXIgc3RyZWFtIHRoYXQgaXMgbG9hZGVkIGZyb20gYSBmaWxlCisgICAgYWxsIGF0IG9uY2Ugd2hlbiB5b3UgY29uc3RydWN0IHRoZSBvYmplY3QuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZU5hbWUsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIG9wZW5lZC4gVGhlIGZpbGUgd2lsbCBiZQorICAgICAgICAgICBvcGVuZWQgd2l0aCBtb2RlICdyYicuCisKKyAgICAgICAgQHBhcmFtIGVuY29kaW5nIElmIHlvdSBzZXQgdGhlIG9wdGlvbmFsIGVuY29kaW5nIGFyZ3VtZW50LCB0aGVuIHRoZQorICAgICAgICAgICBkYXRhIHdpbGwgYmUgZGVjb2RlZCBvbiB0aGUgZmx5LgorCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuZmlsZU5hbWUgPSBmaWxlTmFtZQorCisgICAgICAgIGZwID0gY29kZWNzLm9wZW4oZmlsZU5hbWUsICdyYicsIGVuY29kaW5nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgQU5UTFJTdHJpbmdTdHJlYW0uX19pbml0X18oc2VsZiwgZGF0YSkKKworCisgICAgZGVmIGdldFNvdXJjZU5hbWUoc2VsZik6CisgICAgICAgICIiIkRlcHJlY2F0ZWQsIGFjY2VzcyBvLmZpbGVOYW1lIGRpcmVjdGx5LiIiIgorCisgICAgICAgIHJldHVybiBzZWxmLmZpbGVOYW1lCisKKworY2xhc3MgQU5UTFJJbnB1dFN0cmVhbShBTlRMUlN0cmluZ1N0cmVhbSk6CisgICAgIiIiCisgICAgQGJyaWVmIENoYXJTdHJlYW0gdGhhdCByZWFkcyBkYXRhIGZyb20gYSBmaWxlLWxpa2Ugb2JqZWN0LgorCisgICAgVGhpcyBpcyBhIGNoYXIgYnVmZmVyIHN0cmVhbSB0aGF0IGlzIGxvYWRlZCBmcm9tIGEgZmlsZSBsaWtlIG9iamVjdAorICAgIGFsbCBhdCBvbmNlIHdoZW4geW91IGNvbnN0cnVjdCB0aGUgb2JqZWN0LgorCisgICAgQWxsIGlucHV0IGlzIGNvbnN1bWVkIGZyb20gdGhlIGZpbGUsIGJ1dCBpdCBpcyBub3QgY2xvc2VkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIGZpbGUgQSBmaWxlLWxpa2Ugb2JqZWN0IGhvbGRpbmcgeW91ciBpbnB1dC4gT25seSB0aGUgcmVhZCgpCisgICAgICAgICAgIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkLgorCisgICAgICAgIEBwYXJhbSBlbmNvZGluZyBJZiB5b3Ugc2V0IHRoZSBvcHRpb25hbCBlbmNvZGluZyBhcmd1bWVudCwgdGhlbiB0aGUKKyAgICAgICAgICAgZGF0YSB3aWxsIGJlIGRlY29kZWQgb24gdGhlIGZseS4KKworICAgICAgICAiIiIKKworICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgd3JhcCBpbnB1dCBpbiBhIGRlY29kaW5nIHJlYWRlcgorICAgICAgICAgICAgcmVhZGVyID0gY29kZWNzLmxvb2t1cChlbmNvZGluZylbMl0KKyAgICAgICAgICAgIGZpbGUgPSByZWFkZXIoZmlsZSkKKworICAgICAgICBkYXRhID0gZmlsZS5yZWFkKCkKKworICAgICAgICBBTlRMUlN0cmluZ1N0cmVhbS5fX2luaXRfXyhzZWxmLCBkYXRhKQorCisKKyMgSSBndWVzcyB0aGUgQU5UTFIgcHJlZml4IGV4aXN0cyBvbmx5IHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHNvbWUgSmF2YQorIyBtdW1ib2p1bWJvLiBBIHBsYWluICJTdHJpbmdTdHJlYW0iIGxvb2tzIGJldHRlciB0byBtZSwgd2hpY2ggc2hvdWxkIGJlCisjIHRoZSBwcmVmZXJyZWQgbmFtZSBpbiBQeXRob24uCitTdHJpbmdTdHJlYW0gPSBBTlRMUlN0cmluZ1N0cmVhbQorRmlsZVN0cmVhbSA9IEFOVExSRmlsZVN0cmVhbQorSW5wdXRTdHJlYW0gPSBBTlRMUklucHV0U3RyZWFtCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUb2tlbiBzdHJlYW1zCisjICAgVG9rZW5TdHJlYW0KKyMgICArLSBDb21tb25Ub2tlblN0cmVhbQorIyAgIFwtIFRva2VuUmV3cml0ZVN0cmVhbQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2NsYXNzIENvbW1vblRva2VuU3RyZWFtKFRva2VuU3RyZWFtKToKKyAgICAiIiIKKyAgICBAYnJpZWYgVGhlIG1vc3QgY29tbW9uIHN0cmVhbSBvZiB0b2tlbnMKKworICAgIFRoZSBtb3N0IGNvbW1vbiBzdHJlYW0gb2YgdG9rZW5zIGlzIG9uZSB3aGVyZSBldmVyeSB0b2tlbiBpcyBidWZmZXJlZCB1cAorICAgIGFuZCB0b2tlbnMgYXJlIHByZWZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKKyAgICBzZWUgdGhlc2UgdG9rZW5zIGFuZCBjYW5ub3QgY2hhbmdlIHRoZSBmaWx0ZXIgY2hhbm5lbCBudW1iZXIgZHVyaW5nIHRoZQorICAgIHBhcnNlKS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlblNvdXJjZT1Ob25lLCBjaGFubmVsPURFRkFVTFRfQ0hBTk5FTCk6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gdG9rZW5Tb3VyY2UgQSBUb2tlblNvdXJjZSBpbnN0YW5jZSAodXN1YWxseSBhIExleGVyKSB0byBwdWxsCisgICAgICAgICAgICB0aGUgdG9rZW5zIGZyb20uCisKKyAgICAgICAgQHBhcmFtIGNoYW5uZWwgU2tpcCB0b2tlbnMgb24gYW55IGNoYW5uZWwgYnV0IHRoaXMgb25lOyB0aGlzIGlzIGhvdyB3ZQorICAgICAgICAgICAgc2tpcCB3aGl0ZXNwYWNlLi4uCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgVG9rZW5TdHJlYW0uX19pbml0X18oc2VsZikKKworICAgICAgICBzZWxmLnRva2VuU291cmNlID0gdG9rZW5Tb3VyY2UKKworCSMgUmVjb3JkIGV2ZXJ5IHNpbmdsZSB0b2tlbiBwdWxsZWQgZnJvbSB0aGUgc291cmNlIHNvIHdlIGNhbiByZXByb2R1Y2UKKyAgICAgICAgIyBjaHVua3Mgb2YgaXQgbGF0ZXIuCisgICAgICAgIHNlbGYudG9rZW5zID0gW10KKworCSMgTWFwPHRva2VudHlwZSwgY2hhbm5lbD4gdG8gb3ZlcnJpZGUgc29tZSBUb2tlbnMnIGNoYW5uZWwgbnVtYmVycworICAgICAgICBzZWxmLmNoYW5uZWxPdmVycmlkZU1hcCA9IHt9CisKKwkjIFNldDx0b2tlbnR5cGU+OyBkaXNjYXJkIGFueSB0b2tlbnMgd2l0aCB0aGlzIHR5cGUKKyAgICAgICAgc2VsZi5kaXNjYXJkU2V0ID0gc2V0KCkKKworCSMgU2tpcCB0b2tlbnMgb24gYW55IGNoYW5uZWwgYnV0IHRoaXMgb25lOyB0aGlzIGlzIGhvdyB3ZSBza2lwCisgICAgICAgICMgd2hpdGVzcGFjZS4uLgorICAgICAgICBzZWxmLmNoYW5uZWwgPSBjaGFubmVsCisKKwkjIEJ5IGRlZmF1bHQsIHRyYWNrIGFsbCBpbmNvbWluZyB0b2tlbnMKKyAgICAgICAgc2VsZi5kaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyA9IEZhbHNlCisKKwkjIFRoZSBpbmRleCBpbnRvIHRoZSB0b2tlbnMgbGlzdCBvZiB0aGUgY3VycmVudCB0b2tlbiAobmV4dCB0b2tlbgorICAgICAgICAjIHRvIGNvbnN1bWUpLiAgcD09LTEgaW5kaWNhdGVzIHRoYXQgdGhlIHRva2VucyBsaXN0IGlzIGVtcHR5CisgICAgICAgIHNlbGYucCA9IC0xCisKKyAgICAgICAgIyBSZW1lbWJlciBsYXN0IG1hcmtlZCBwb3NpdGlvbgorICAgICAgICBzZWxmLmxhc3RNYXJrZXIgPSBOb25lCisKKyAgICAgICAgIyBob3cgZGVlcCBoYXZlIHdlIGdvbmU/CisgICAgICAgIHNlbGYuX3JhbmdlID0gLTEKKworCisgICAgZGVmIG1ha2VFT0ZUb2tlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5Tb3VyY2UubWFrZUVPRlRva2VuKCkKKworCisgICAgZGVmIHNldFRva2VuU291cmNlKHNlbGYsIHRva2VuU291cmNlKToKKyAgICAgICAgIiIiUmVzZXQgdGhpcyB0b2tlbiBzdHJlYW0gYnkgc2V0dGluZyBpdHMgdG9rZW4gc291cmNlLiIiIgorCisgICAgICAgIHNlbGYudG9rZW5Tb3VyY2UgPSB0b2tlblNvdXJjZQorICAgICAgICBzZWxmLnRva2VucyA9IFtdCisgICAgICAgIHNlbGYucCA9IC0xCisgICAgICAgIHNlbGYuY2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTAorCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYucCA9IDAKKyAgICAgICAgc2VsZi5sYXN0TWFya2VyID0gTm9uZQorCisKKyAgICBkZWYgZmlsbEJ1ZmZlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIExvYWQgYWxsIHRva2VucyBmcm9tIHRoZSB0b2tlbiBzb3VyY2UgYW5kIHB1dCBpbiB0b2tlbnMuCisJVGhpcyBpcyBkb25lIHVwb24gZmlyc3QgTFQgcmVxdWVzdCBiZWNhdXNlIHlvdSBtaWdodCB3YW50IHRvCisgICAgICAgIHNldCBzb21lIHRva2VuIHR5cGUgLyBjaGFubmVsIG92ZXJyaWRlcyBiZWZvcmUgZmlsbGluZyBidWZmZXIuCisgICAgICAgICIiIgorCisKKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgIHQgPSBzZWxmLnRva2VuU291cmNlLm5leHRUb2tlbigpCisgICAgICAgIHdoaWxlIHQgaXMgbm90IE5vbmUgYW5kIHQudHlwZSAhPSBFT0Y6CisgICAgICAgICAgICBkaXNjYXJkID0gRmFsc2UKKworICAgICAgICAgICAgaWYgc2VsZi5kaXNjYXJkU2V0IGlzIG5vdCBOb25lIGFuZCB0LnR5cGUgaW4gc2VsZi5kaXNjYXJkU2V0OgorICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBUcnVlCisKKyAgICAgICAgICAgIGVsaWYgc2VsZi5kaXNjYXJkT2ZmQ2hhbm5lbFRva2VucyBhbmQgdC5jaGFubmVsICE9IHNlbGYuY2hhbm5lbDoKKyAgICAgICAgICAgICAgICBkaXNjYXJkID0gVHJ1ZQorCisgICAgICAgICAgICAjIGlzIHRoZXJlIGEgY2hhbm5lbCBvdmVycmlkZSBmb3IgdG9rZW4gdHlwZT8KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvdmVycmlkZUNoYW5uZWwgPSBzZWxmLmNoYW5uZWxPdmVycmlkZU1hcFt0LnR5cGVdCisKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAjIG5vIG92ZXJyaWRlIGZvciB0aGlzIHR5cGUKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb3ZlcnJpZGVDaGFubmVsID09IHNlbGYuY2hhbm5lbDoKKyAgICAgICAgICAgICAgICAgICAgdC5jaGFubmVsID0gb3ZlcnJpZGVDaGFubmVsCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCA9IFRydWUKKworICAgICAgICAgICAgaWYgbm90IGRpc2NhcmQ6CisgICAgICAgICAgICAgICAgdC5pbmRleCA9IGluZGV4CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgaW5kZXggKz0gMQorCisgICAgICAgICAgICB0ID0gc2VsZi50b2tlblNvdXJjZS5uZXh0VG9rZW4oKQorCisgICAgICAgICMgbGVhdmUgcCBwb2ludGluZyBhdCBmaXJzdCB0b2tlbiBvbiBjaGFubmVsCisgICAgICAgIHNlbGYucCA9IDAKKyAgICAgICAgc2VsZi5wID0gc2VsZi5za2lwT2ZmVG9rZW5DaGFubmVscyhzZWxmLnApCisKKworICAgIGRlZiBjb25zdW1lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgTW92ZSB0aGUgaW5wdXQgcG9pbnRlciB0byB0aGUgbmV4dCBpbmNvbWluZyB0b2tlbi4gIFRoZSBzdHJlYW0KKyAgICAgICAgbXVzdCBiZWNvbWUgYWN0aXZlIHdpdGggTFQoMSkgYXZhaWxhYmxlLiAgY29uc3VtZSgpIHNpbXBseQorICAgICAgICBtb3ZlcyB0aGUgaW5wdXQgcG9pbnRlciBzbyB0aGF0IExUKDEpIHBvaW50cyBhdCB0aGUgbmV4dAorICAgICAgICBpbnB1dCBzeW1ib2wuIENvbnN1bWUgYXQgbGVhc3Qgb25lIHRva2VuLgorCisgICAgICAgIFdhbGsgcGFzdCBhbnkgdG9rZW4gbm90IG9uIHRoZSBjaGFubmVsIHRoZSBwYXJzZXIgaXMgbGlzdGVuaW5nIHRvLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLnAgPCBsZW4oc2VsZi50b2tlbnMpOgorICAgICAgICAgICAgc2VsZi5wICs9IDEKKworICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5za2lwT2ZmVG9rZW5DaGFubmVscyhzZWxmLnApICMgbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorCisKKyAgICBkZWYgc2tpcE9mZlRva2VuQ2hhbm5lbHMoc2VsZiwgaSk6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhIHN0YXJ0aW5nIGluZGV4LCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvbi1jaGFubmVsCisgICAgICAgIHRva2VuLgorICAgICAgICAiIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBzZWxmLnRva2Vuc1tpXS5jaGFubmVsICE9IHNlbGYuY2hhbm5lbDoKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAjIGhpdCB0aGUgZW5kIG9mIHRva2VuIHN0cmVhbQorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJldHVybiBpCisKKworICAgIGRlZiBza2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2Uoc2VsZiwgaSk6CisgICAgICAgIHdoaWxlIGkgPj0gMCBhbmQgc2VsZi50b2tlbnNbaV0uY2hhbm5lbCAhPSBzZWxmLmNoYW5uZWw6CisgICAgICAgICAgICBpIC09IDEKKworICAgICAgICByZXR1cm4gaQorCisKKyAgICBkZWYgc2V0VG9rZW5UeXBlQ2hhbm5lbChzZWxmLCB0dHlwZSwgY2hhbm5lbCk6CisgICAgICAgICIiIgorICAgICAgICBBIHNpbXBsZSBmaWx0ZXIgbWVjaGFuaXNtIHdoZXJlYnkgeW91IGNhbiB0ZWxsIHRoaXMgdG9rZW4gc3RyZWFtCisgICAgICAgIHRvIGZvcmNlIGFsbCB0b2tlbnMgb2YgdHlwZSB0dHlwZSB0byBiZSBvbiBjaGFubmVsLiAgRm9yIGV4YW1wbGUsCisgICAgICAgIHdoZW4gaW50ZXJwcmV0aW5nLCB3ZSBjYW5ub3QgZXhlYyBhY3Rpb25zIHNvIHdlIG5lZWQgdG8gdGVsbAorICAgICAgICB0aGUgc3RyZWFtIHRvIGZvcmNlIGFsbCBXUyBhbmQgTkVXTElORSB0byBiZSBhIGRpZmZlcmVudCwgaWdub3JlZAorICAgICAgICBjaGFubmVsLgorCSIiIgorCisgICAgICAgIHNlbGYuY2hhbm5lbE92ZXJyaWRlTWFwW3R0eXBlXSA9IGNoYW5uZWwKKworCisgICAgZGVmIGRpc2NhcmRUb2tlblR5cGUoc2VsZiwgdHR5cGUpOgorICAgICAgICBzZWxmLmRpc2NhcmRTZXQuYWRkKHR0eXBlKQorCisKKyAgICBkZWYgZ2V0VG9rZW5zKHNlbGYsIHN0YXJ0PU5vbmUsIHN0b3A9Tm9uZSwgdHlwZXM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhIHN0YXJ0IGFuZCBzdG9wIGluZGV4LCByZXR1cm4gYSBsaXN0IG9mIGFsbCB0b2tlbnMgaW4KKyAgICAgICAgdGhlIHRva2VuIHR5cGUgc2V0LiAgUmV0dXJuIE5vbmUgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgICAgICAgIG1ldGhvZCBsb29rcyBhdCBib3RoIG9uIGFuZCBvZmYgY2hhbm5lbCB0b2tlbnMuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgaWYgc3RvcCBpcyBOb25lIG9yIHN0b3AgPj0gbGVuKHNlbGYudG9rZW5zKToKKyAgICAgICAgICAgIHN0b3AgPSBsZW4oc2VsZi50b2tlbnMpIC0gMQorCisgICAgICAgIGlmIHN0YXJ0IGlzIE5vbmUgb3Igc3RvcCA8IDA6CisgICAgICAgICAgICBzdGFydCA9IDAKKworICAgICAgICBpZiBzdGFydCA+IHN0b3A6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UodHlwZXMsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICMgY2FsbGVkIHdpdGggYSBzaW5nbGUgdHlwZSwgd3JhcCBpbnRvIHNldAorICAgICAgICAgICAgdHlwZXMgPSBzZXQoW3R5cGVzXSkKKworICAgICAgICBmaWx0ZXJlZFRva2VucyA9IFsKKyAgICAgICAgICAgIHRva2VuIGZvciB0b2tlbiBpbiBzZWxmLnRva2Vuc1tzdGFydDpzdG9wXQorICAgICAgICAgICAgaWYgdHlwZXMgaXMgTm9uZSBvciB0b2tlbi50eXBlIGluIHR5cGVzCisgICAgICAgICAgICBdCisKKyAgICAgICAgaWYgbGVuKGZpbHRlcmVkVG9rZW5zKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXR1cm4gZmlsdGVyZWRUb2tlbnMKKworCisgICAgZGVmIExUKHNlbGYsIGspOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSBpdGggdG9rZW4gZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAxLi5uIHdoZXJlIGs9MSBpcyB0aGUKKyAgICAgICAgZmlyc3Qgc3ltYm9sIG9mIGxvb2thaGVhZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBpZiBrID09IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIGsgPCAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuTEIoLWspCisKKyAgICAgICAgaSA9IHNlbGYucAorICAgICAgICBuID0gMQorICAgICAgICAjIGZpbmQgayBnb29kIHRva2VucworICAgICAgICB3aGlsZSBuIDwgazoKKyAgICAgICAgICAgICMgc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICAgIGkgPSBzZWxmLnNraXBPZmZUb2tlbkNoYW5uZWxzKGkrMSkgIyBsZWF2ZSBwIG9uIHZhbGlkIHRva2VuCisgICAgICAgICAgICBuICs9IDEKKworICAgICAgICBpZiBpID4gc2VsZi5fcmFuZ2U6CisgICAgICAgICAgICBzZWxmLl9yYW5nZSA9IGkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbnNbaV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tYWtlRU9GVG9rZW4oKQorCisKKyAgICBkZWYgTEIoc2VsZiwgayk6CisgICAgICAgICIiIkxvb2sgYmFja3dhcmRzIGsgdG9rZW5zIG9uLWNoYW5uZWwgdG9rZW5zIiIiCisKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBpZiBrID09IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIHNlbGYucCAtIGsgPCAwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpID0gc2VsZi5wCisgICAgICAgIG4gPSAxCisgICAgICAgICMgZmluZCBrIGdvb2QgdG9rZW5zIGxvb2tpbmcgYmFja3dhcmRzCisgICAgICAgIHdoaWxlIG4gPD0gazoKKyAgICAgICAgICAgICMgc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICAgICAgIGkgPSBzZWxmLnNraXBPZmZUb2tlbkNoYW5uZWxzUmV2ZXJzZShpLTEpICMgbGVhdmUgcCBvbiB2YWxpZCB0b2tlbgorICAgICAgICAgICAgbiArPSAxCisKKyAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiBzZWxmLnRva2Vuc1tpXQorCisKKyAgICBkZWYgZ2V0KHNlbGYsIGkpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFic29sdXRlIHRva2VuIGk7IGlnbm9yZSB3aGljaCBjaGFubmVsIHRoZSB0b2tlbnMgYXJlIG9uOworICAgICAgICB0aGF0IGlzLCBjb3VudCBhbGwgdG9rZW5zIG5vdCBqdXN0IG9uLWNoYW5uZWwgdG9rZW5zLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi50b2tlbnNbaV0KKworCisgICAgZGVmIHNsaWNlKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBpZiBzdGFydCA8IDAgb3Igc3RvcCA8IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiBzZWxmLnRva2Vuc1tzdGFydDpzdG9wKzFdCisKKworICAgIGRlZiBMQShzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIHNlbGYuTFQoaSkudHlwZQorCisKKyAgICBkZWYgbWFyayhzZWxmKToKKyAgICAgICAgc2VsZi5sYXN0TWFya2VyID0gc2VsZi5pbmRleCgpCisgICAgICAgIHJldHVybiBzZWxmLmxhc3RNYXJrZXIKKworCisgICAgZGVmIHJlbGVhc2Uoc2VsZiwgbWFya2VyPU5vbmUpOgorICAgICAgICAjIG5vIHJlc291cmNlcyB0byByZWxlYXNlCisgICAgICAgIHBhc3MKKworCisgICAgZGVmIHNpemUoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi50b2tlbnMpCisKKworICAgIGRlZiByYW5nZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JhbmdlCisKKworICAgIGRlZiBpbmRleChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucAorCisKKyAgICBkZWYgcmV3aW5kKHNlbGYsIG1hcmtlcj1Ob25lKToKKyAgICAgICAgaWYgbWFya2VyIGlzIE5vbmU6CisgICAgICAgICAgICBtYXJrZXIgPSBzZWxmLmxhc3RNYXJrZXIKKworICAgICAgICBzZWxmLnNlZWsobWFya2VyKQorCisKKyAgICBkZWYgc2VlayhzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYucCA9IGluZGV4CisKKworICAgIGRlZiBnZXRUb2tlblNvdXJjZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5Tb3VyY2UKKworCisgICAgZGVmIGdldFNvdXJjZU5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRva2VuU291cmNlLmdldFNvdXJjZU5hbWUoKQorCisKKyAgICBkZWYgdG9TdHJpbmcoc2VsZiwgc3RhcnQ9Tm9uZSwgc3RvcD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgc3RhcnQgPSAwCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc3RhcnQsIGludCk6CisgICAgICAgICAgICBzdGFydCA9IHN0YXJ0LmluZGV4CisKKyAgICAgICAgaWYgc3RvcCBpcyBOb25lOgorICAgICAgICAgICAgc3RvcCA9IGxlbihzZWxmLnRva2VucykgLSAxCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc3RvcCwgaW50KToKKyAgICAgICAgICAgIHN0b3AgPSBzdG9wLmluZGV4CisKKyAgICAgICAgaWYgc3RvcCA+PSBsZW4oc2VsZi50b2tlbnMpOgorICAgICAgICAgICAgc3RvcCA9IGxlbihzZWxmLnRva2VucykgLSAxCisKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oW3QudGV4dCBmb3IgdCBpbiBzZWxmLnRva2Vuc1tzdGFydDpzdG9wKzFdXSkKKworCitjbGFzcyBSZXdyaXRlT3BlcmF0aW9uKG9iamVjdCk6CisgICAgIiIiQGJyaWVmIEludGVybmFsIGhlbHBlciBjbGFzcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGluZGV4LCB0ZXh0KToKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgICAgICAjIFdoYXQgaW5kZXggaW50byByZXdyaXRlcyBMaXN0IGFyZSB3ZT8KKyAgICAgICAgc2VsZi5pbnN0cnVjdGlvbkluZGV4ID0gTm9uZQorCisgICAgICAgICMgVG9rZW4gYnVmZmVyIGluZGV4LgorICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgYnVmKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgcmV3cml0ZSBvcGVyYXRpb24gYnkgcG9zc2libHkgYWRkaW5nIHRvIHRoZSBidWZmZXIuCisgICAgICAgIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgdG9rZW4gdG8gb3BlcmF0ZSBvbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXgKKworICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgb3BOYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgcmV0dXJuICc8JXNAJWQ6IiVzIj4nICUgKAorICAgICAgICAgICAgb3BOYW1lLCBzZWxmLmluZGV4LCBzZWxmLnRleHQpCisKKyAgICBfX3N0cl9fID0gdG9TdHJpbmcKKyAgICBfX3JlcHJfXyA9IHRvU3RyaW5nCisKKworY2xhc3MgSW5zZXJ0QmVmb3JlT3AoUmV3cml0ZU9wZXJhdGlvbik6CisgICAgIiIiQGJyaWVmIEludGVybmFsIGhlbHBlciBjbGFzcy4iIiIKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIGJ1Zi53cml0ZShzZWxmLnRleHQpCisgICAgICAgIGlmIHNlbGYuc3RyZWFtLnRva2Vuc1tzZWxmLmluZGV4XS50eXBlICE9IEVPRjoKKyAgICAgICAgICAgIGJ1Zi53cml0ZShzZWxmLnN0cmVhbS50b2tlbnNbc2VsZi5pbmRleF0udGV4dCkKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXggKyAxCisKKworY2xhc3MgUmVwbGFjZU9wKFJld3JpdGVPcGVyYXRpb24pOgorICAgICIiIgorICAgIEBicmllZiBJbnRlcm5hbCBoZWxwZXIgY2xhc3MuCisKKyAgICBJJ20gZ29pbmcgdG8gdHJ5IHJlcGxhY2luZyByYW5nZSBmcm9tIHguLnkgd2l0aCAoeS14KSsxIFJlcGxhY2VPcAorICAgIGluc3RydWN0aW9ucy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGZpcnN0LCBsYXN0LCB0ZXh0KToKKyAgICAgICAgUmV3cml0ZU9wZXJhdGlvbi5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGZpcnN0LCB0ZXh0KQorICAgICAgICBzZWxmLmxhc3RJbmRleCA9IGxhc3QKKworCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgYnVmKToKKyAgICAgICAgaWYgc2VsZi50ZXh0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVmLndyaXRlKHNlbGYudGV4dCkKKworICAgICAgICByZXR1cm4gc2VsZi5sYXN0SW5kZXggKyAxCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJzxEZWxldGVPcEAlZC4uJWQ+JyAlIChzZWxmLmluZGV4LCBzZWxmLmxhc3RJbmRleCkKKworICAgICAgICByZXR1cm4gJzxSZXBsYWNlT3BAJWQuLiVkOiIlcyI+JyAlICgKKyAgICAgICAgICAgIHNlbGYuaW5kZXgsIHNlbGYubGFzdEluZGV4LCBzZWxmLnRleHQpCisKKyAgICBfX3N0cl9fID0gdG9TdHJpbmcKKyAgICBfX3JlcHJfXyA9IHRvU3RyaW5nCisKKworY2xhc3MgVG9rZW5SZXdyaXRlU3RyZWFtKENvbW1vblRva2VuU3RyZWFtKToKKyAgICAiIiJAYnJpZWYgQ29tbW9uVG9rZW5TdHJlYW0gdGhhdCBjYW4gYmUgbW9kaWZpZWQuCisKKyAgICBVc2VmdWwgZm9yIGR1bXBpbmcgb3V0IHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgZG9pbmcgc29tZQorICAgIGF1Z21lbnRhdGlvbiBvciBvdGhlciBtYW5pcHVsYXRpb25zLgorCisgICAgWW91IGNhbiBpbnNlcnQgc3R1ZmYsIHJlcGxhY2UsIGFuZCBkZWxldGUgY2h1bmtzLiAgTm90ZSB0aGF0IHRoZQorICAgIG9wZXJhdGlvbnMgYXJlIGRvbmUgbGF6aWx5LS1vbmx5IGlmIHlvdSBjb252ZXJ0IHRoZSBidWZmZXIgdG8gYQorICAgIFN0cmluZy4gIFRoaXMgaXMgdmVyeSBlZmZpY2llbnQgYmVjYXVzZSB5b3UgYXJlIG5vdCBtb3ZpbmcgZGF0YSBhcm91bmQKKyAgICBhbGwgdGhlIHRpbWUuICBBcyB0aGUgYnVmZmVyIG9mIHRva2VucyBpcyBjb252ZXJ0ZWQgdG8gc3RyaW5ncywgdGhlCisgICAgdG9TdHJpbmcoKSBtZXRob2QocykgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGFuIG9wZXJhdGlvbiBhdCB0aGUKKyAgICBjdXJyZW50IGluZGV4LiAgSWYgc28sIHRoZSBvcGVyYXRpb24gaXMgZG9uZSBhbmQgdGhlbiBub3JtYWwgU3RyaW5nCisgICAgcmVuZGVyaW5nIGNvbnRpbnVlcyBvbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyBsaWtlIGhhdmluZyBtdWx0aXBsZSBUdXJpbmcKKyAgICBtYWNoaW5lIGluc3RydWN0aW9uIHN0cmVhbXMgKHByb2dyYW1zKSBvcGVyYXRpbmcgb24gYSBzaW5nbGUgaW5wdXQgdGFwZS4gOikKKworICAgIFNpbmNlIHRoZSBvcGVyYXRpb25zIGFyZSBkb25lIGxhemlseSBhdCB0b1N0cmluZy10aW1lLCBvcGVyYXRpb25zIGRvIG5vdAorICAgIHNjcmV3IHVwIHRoZSB0b2tlbiBpbmRleCB2YWx1ZXMuICBUaGF0IGlzLCBhbiBpbnNlcnQgb3BlcmF0aW9uIGF0IHRva2VuCisgICAgaW5kZXggaSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGluZGV4IHZhbHVlcyBmb3IgdG9rZW5zIGkrMS4ubi0xLgorCisgICAgQmVjYXVzZSBvcGVyYXRpb25zIG5ldmVyIGFjdHVhbGx5IGFsdGVyIHRoZSBidWZmZXIsIHlvdSBtYXkgYWx3YXlzIGdldAorICAgIHRoZSBvcmlnaW5hbCB0b2tlbiBzdHJlYW0gYmFjayB3aXRob3V0IHVuZG9pbmcgYW55dGhpbmcuICBTaW5jZQorICAgIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHF1ZXVlZCB1cCwgeW91IGNhbiBlYXNpbHkgc2ltdWxhdGUgdHJhbnNhY3Rpb25zIGFuZAorICAgIHJvbGwgYmFjayBhbnkgY2hhbmdlcyBpZiB0aGVyZSBpcyBhbiBlcnJvciBqdXN0IGJ5IHJlbW92aW5nIGluc3RydWN0aW9ucy4KKyAgICBGb3IgZXhhbXBsZSwKKworICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbSgiaW5wdXQiKTsKKyAgICAgVExleGVyIGxleCA9IG5ldyBUTGV4ZXIoaW5wdXQpOworICAgICBUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXgpOworICAgICBUIHBhcnNlciA9IG5ldyBUKHRva2Vucyk7CisgICAgIHBhcnNlci5zdGFydFJ1bGUoKTsKKworICAgICBUaGVuIGluIHRoZSBydWxlcywgeW91IGNhbiBleGVjdXRlCisgICAgICAgIFRva2VuIHQsdTsKKyAgICAgICAgLi4uCisgICAgICAgIGlucHV0Lmluc2VydEFmdGVyKHQsICJ0ZXh0IHRvIHB1dCBhZnRlciB0Iik7fQorICAgICAgICBpbnB1dC5pbnNlcnRBZnRlcih1LCAidGV4dCBhZnRlciB1Iik7fQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLnRvU3RyaW5nKCkpOworCisgICAgQWN0dWFsbHksIHlvdSBoYXZlIHRvIGNhc3QgdGhlICdpbnB1dCcgdG8gYSBUb2tlblJld3JpdGVTdHJlYW0uIDooCisKKyAgICBZb3UgY2FuIGFsc28gaGF2ZSBtdWx0aXBsZSAiaW5zdHJ1Y3Rpb24gc3RyZWFtcyIgYW5kIGdldCBtdWx0aXBsZQorICAgIHJld3JpdGVzIGZyb20gYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBpbnB1dC4gIEp1c3QgbmFtZSB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBzdHJlYW1zIGFuZCB1c2UgdGhhdCBuYW1lIGFnYWluIHdoZW4gcHJpbnRpbmcgdGhlIGJ1ZmZlci4gIFRoaXMgY291bGQgYmUKKyAgICB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgYSBDIGZpbGUgYW5kIGFsc28gaXRzIGhlYWRlciBmaWxlLS1hbGwgZnJvbSB0aGUKKyAgICBzYW1lIGJ1ZmZlcjoKKworICAgICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoInBhc3MxIiwgdCwgInRleHQgdG8gcHV0IGFmdGVyIHQiKTt9CisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcigicGFzczIiLCB1LCAidGV4dCBhZnRlciB1Iik7fQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zLnRvU3RyaW5nKCJwYXNzMSIpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy50b1N0cmluZygicGFzczIiKSk7CisKKyAgICBJZiB5b3UgZG9uJ3QgdXNlIG5hbWVkIHJld3JpdGUgc3RyZWFtcywgYSAiZGVmYXVsdCIgc3RyZWFtIGlzIHVzZWQgYXMKKyAgICB0aGUgZmlyc3QgZXhhbXBsZSBzaG93cy4KKyAgICAiIiIKKworICAgIERFRkFVTFRfUFJPR1JBTV9OQU1FID0gImRlZmF1bHQiCisgICAgTUlOX1RPS0VOX0lOREVYID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuU291cmNlPU5vbmUsIGNoYW5uZWw9REVGQVVMVF9DSEFOTkVMKToKKyAgICAgICAgQ29tbW9uVG9rZW5TdHJlYW0uX19pbml0X18oc2VsZiwgdG9rZW5Tb3VyY2UsIGNoYW5uZWwpCisKKyAgICAgICAgIyBZb3UgbWF5IGhhdmUgbXVsdGlwbGUsIG5hbWVkIHN0cmVhbXMgb2YgcmV3cml0ZSBvcGVyYXRpb25zLgorICAgICAgICAjIEknbSBjYWxsaW5nIHRoZXNlIHRoaW5ncyAicHJvZ3JhbXMuIgorICAgICAgICAjICBNYXBzIFN0cmluZyAobmFtZSkgLT4gcmV3cml0ZSAoTGlzdCkKKyAgICAgICAgc2VsZi5wcm9ncmFtcyA9IHt9CisgICAgICAgIHNlbGYucHJvZ3JhbXNbc2VsZi5ERUZBVUxUX1BST0dSQU1fTkFNRV0gPSBbXQorCisgCSMgTWFwIFN0cmluZyAocHJvZ3JhbSBuYW1lKSAtPiBJbnRlZ2VyIGluZGV4CisgICAgICAgIHNlbGYubGFzdFJld3JpdGVUb2tlbkluZGV4ZXMgPSB7fQorCisKKyAgICBkZWYgcm9sbGJhY2soc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUm9sbGJhY2sgdGhlIGluc3RydWN0aW9uIHN0cmVhbSBmb3IgYSBwcm9ncmFtIHNvIHRoYXQKKyAgICAgICAgdGhlIGluZGljYXRlZCBpbnN0cnVjdGlvbiAodmlhIGluc3RydWN0aW9uSW5kZXgpIGlzIG5vCisgICAgICAgIGxvbmdlciBpbiB0aGUgc3RyZWFtLiAgVU5URVNURUQhCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSBhcmdzWzBdCisgICAgICAgICAgICBpbnN0cnVjdGlvbkluZGV4ID0gYXJnc1sxXQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSBzZWxmLkRFRkFVTFRfUFJPR1JBTV9OQU1FCisgICAgICAgICAgICBpbnN0cnVjdGlvbkluZGV4ID0gYXJnc1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyIpCisKKyAgICAgICAgcCA9IHNlbGYucHJvZ3JhbXMuZ2V0KHByb2dyYW1OYW1lLCBOb25lKQorICAgICAgICBpZiBwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wcm9ncmFtc1twcm9ncmFtTmFtZV0gPSAoCisgICAgICAgICAgICAgICAgcFtzZWxmLk1JTl9UT0tFTl9JTkRFWDppbnN0cnVjdGlvbkluZGV4XSkKKworCisgICAgZGVmIGRlbGV0ZVByb2dyYW0oc2VsZiwgcHJvZ3JhbU5hbWU9REVGQVVMVF9QUk9HUkFNX05BTUUpOgorICAgICAgICAiIiJSZXNldCB0aGUgcHJvZ3JhbSBzbyB0aGF0IG5vIGluc3RydWN0aW9ucyBleGlzdCIiIgorCisgICAgICAgIHNlbGYucm9sbGJhY2socHJvZ3JhbU5hbWUsIHNlbGYuTUlOX1RPS0VOX0lOREVYKQorCisKKyAgICBkZWYgaW5zZXJ0QWZ0ZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gc2VsZi5ERUZBVUxUX1BST0dSQU1fTkFNRQorICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdCisgICAgICAgICAgICB0ZXh0ID0gYXJnc1sxXQorCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGluZGV4ID0gYXJnc1sxXQorICAgICAgICAgICAgdGV4dCA9IGFyZ3NbMl0KKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyIpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbmRleCwgVG9rZW4pOgorICAgICAgICAgICAgIyBpbmRleCBpcyBhIFRva2VuLCBncmFwIHRoZSBzdHJlYW0gaW5kZXggZnJvbSBpdAorICAgICAgICAgICAgaW5kZXggPSBpbmRleC5pbmRleAorCisgICAgICAgICMgdG8gaW5zZXJ0IGFmdGVyLCBqdXN0IGluc2VydCBiZWZvcmUgbmV4dCBpbmRleCAoZXZlbiBpZiBwYXN0IGVuZCkKKyAgICAgICAgc2VsZi5pbnNlcnRCZWZvcmUocHJvZ3JhbU5hbWUsIGluZGV4KzEsIHRleHQpCisKKworICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gc2VsZi5ERUZBVUxUX1BST0dSQU1fTkFNRQorICAgICAgICAgICAgaW5kZXggPSBhcmdzWzBdCisgICAgICAgICAgICB0ZXh0ID0gYXJnc1sxXQorCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGluZGV4ID0gYXJnc1sxXQorICAgICAgICAgICAgdGV4dCA9IGFyZ3NbMl0KKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyIpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbmRleCwgVG9rZW4pOgorICAgICAgICAgICAgIyBpbmRleCBpcyBhIFRva2VuLCBncmFwIHRoZSBzdHJlYW0gaW5kZXggZnJvbSBpdAorICAgICAgICAgICAgaW5kZXggPSBpbmRleC5pbmRleAorCisgICAgICAgIG9wID0gSW5zZXJ0QmVmb3JlT3Aoc2VsZiwgaW5kZXgsIHRleHQpCisgICAgICAgIHJld3JpdGVzID0gc2VsZi5nZXRQcm9ncmFtKHByb2dyYW1OYW1lKQorICAgICAgICBvcC5pbnN0cnVjdGlvbkluZGV4ID0gbGVuKHJld3JpdGVzKQorICAgICAgICByZXdyaXRlcy5hcHBlbmQob3ApCisKKworICAgIGRlZiByZXBsYWNlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHNlbGYuREVGQVVMVF9QUk9HUkFNX05BTUUKKyAgICAgICAgICAgIGZpcnN0ID0gYXJnc1swXQorICAgICAgICAgICAgbGFzdCA9IGFyZ3NbMF0KKyAgICAgICAgICAgIHRleHQgPSBhcmdzWzFdCisKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMzoKKyAgICAgICAgICAgIHByb2dyYW1OYW1lID0gc2VsZi5ERUZBVUxUX1BST0dSQU1fTkFNRQorICAgICAgICAgICAgZmlyc3QgPSBhcmdzWzBdCisgICAgICAgICAgICBsYXN0ID0gYXJnc1sxXQorICAgICAgICAgICAgdGV4dCA9IGFyZ3NbMl0KKworICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSA0OgorICAgICAgICAgICAgcHJvZ3JhbU5hbWUgPSBhcmdzWzBdCisgICAgICAgICAgICBmaXJzdCA9IGFyZ3NbMV0KKyAgICAgICAgICAgIGxhc3QgPSBhcmdzWzJdCisgICAgICAgICAgICB0ZXh0ID0gYXJnc1szXQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkludmFsaWQgYXJndW1lbnRzIikKKworICAgICAgICBpZiBpc2luc3RhbmNlKGZpcnN0LCBUb2tlbik6CisgICAgICAgICAgICAjIGZpcnN0IGlzIGEgVG9rZW4sIGdyYXAgdGhlIHN0cmVhbSBpbmRleCBmcm9tIGl0CisgICAgICAgICAgICBmaXJzdCA9IGZpcnN0LmluZGV4CisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShsYXN0LCBUb2tlbik6CisgICAgICAgICAgICAjIGxhc3QgaXMgYSBUb2tlbiwgZ3JhcCB0aGUgc3RyZWFtIGluZGV4IGZyb20gaXQKKyAgICAgICAgICAgIGxhc3QgPSBsYXN0LmluZGV4CisKKyAgICAgICAgaWYgZmlyc3QgPiBsYXN0IG9yIGZpcnN0IDwgMCBvciBsYXN0IDwgMCBvciBsYXN0ID49IGxlbihzZWxmLnRva2Vucyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJyZXBsYWNlOiByYW5nZSBpbnZhbGlkOiAlZC4uJWQgKHNpemU9JWQpIgorICAgICAgICAgICAgICAgICUgKGZpcnN0LCBsYXN0LCBsZW4oc2VsZi50b2tlbnMpKSkKKworICAgICAgICBvcCA9IFJlcGxhY2VPcChzZWxmLCBmaXJzdCwgbGFzdCwgdGV4dCkKKyAgICAgICAgcmV3cml0ZXMgPSBzZWxmLmdldFByb2dyYW0ocHJvZ3JhbU5hbWUpCisgICAgICAgIG9wLmluc3RydWN0aW9uSW5kZXggPSBsZW4ocmV3cml0ZXMpCisgICAgICAgIHJld3JpdGVzLmFwcGVuZChvcCkKKworCisgICAgZGVmIGRlbGV0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYucmVwbGFjZSgqKGxpc3QoYXJncykgKyBbTm9uZV0pKQorCisKKyAgICBkZWYgZ2V0TGFzdFJld3JpdGVUb2tlbkluZGV4KHNlbGYsIHByb2dyYW1OYW1lPURFRkFVTFRfUFJPR1JBTV9OQU1FKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGFzdFJld3JpdGVUb2tlbkluZGV4ZXMuZ2V0KHByb2dyYW1OYW1lLCAtMSkKKworCisgICAgZGVmIHNldExhc3RSZXdyaXRlVG9rZW5JbmRleChzZWxmLCBwcm9ncmFtTmFtZSwgaSk6CisgICAgICAgIHNlbGYubGFzdFJld3JpdGVUb2tlbkluZGV4ZXNbcHJvZ3JhbU5hbWVdID0gaQorCisKKyAgICBkZWYgZ2V0UHJvZ3JhbShzZWxmLCBuYW1lKToKKyAgICAgICAgcCA9IHNlbGYucHJvZ3JhbXMuZ2V0KG5hbWUsIE5vbmUpCisgICAgICAgIGlmIHAgaXMgIE5vbmU6CisgICAgICAgICAgICBwID0gc2VsZi5pbml0aWFsaXplUHJvZ3JhbShuYW1lKQorCisgICAgICAgIHJldHVybiBwCisKKworICAgIGRlZiBpbml0aWFsaXplUHJvZ3JhbShzZWxmLCBuYW1lKToKKyAgICAgICAgcCA9IFtdCisgICAgICAgIHNlbGYucHJvZ3JhbXNbbmFtZV0gPSBwCisgICAgICAgIHJldHVybiBwCisKKworICAgIGRlZiB0b09yaWdpbmFsU3RyaW5nKHNlbGYsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLk1JTl9UT0tFTl9JTkRFWAorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IHNlbGYuc2l6ZSgpIC0gMQorCisgICAgICAgIGJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgaSA9IHN0YXJ0CisgICAgICAgIHdoaWxlIGkgPj0gc2VsZi5NSU5fVE9LRU5fSU5ERVggYW5kIGkgPD0gZW5kIGFuZCBpIDwgbGVuKHNlbGYudG9rZW5zKToKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0KGkpLnR5cGUgIT0gRU9GOgorICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShzZWxmLmdldChpKS50ZXh0KQorICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXR2YWx1ZSgpCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHNlbGYuREVGQVVMVF9QUk9HUkFNX05BTUUKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5NSU5fVE9LRU5fSU5ERVgKKyAgICAgICAgICAgIGVuZCA9IHNlbGYuc2l6ZSgpIC0gMQorCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5NSU5fVE9LRU5fSU5ERVgKKyAgICAgICAgICAgIGVuZCA9IHNlbGYuc2l6ZSgpIC0gMQorCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBwcm9ncmFtTmFtZSA9IHNlbGYuREVGQVVMVF9QUk9HUkFNX05BTUUKKyAgICAgICAgICAgIHN0YXJ0ID0gYXJnc1swXQorICAgICAgICAgICAgZW5kID0gYXJnc1sxXQorCisgICAgICAgIGlmIHN0YXJ0IGlzIE5vbmU6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYuTUlOX1RPS0VOX0lOREVYCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc3RhcnQsIGludCk6CisgICAgICAgICAgICBzdGFydCA9IHN0YXJ0LmluZGV4CisKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICBlbmQgPSBsZW4oc2VsZi50b2tlbnMpIC0gMQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgaW50KToKKyAgICAgICAgICAgIGVuZCA9IGVuZC5pbmRleAorCisgICAgICAgICMgZW5zdXJlIHN0YXJ0L2VuZCBhcmUgaW4gcmFuZ2UKKyAgICAgICAgaWYgZW5kID49IGxlbihzZWxmLnRva2Vucyk6CisgICAgICAgICAgICBlbmQgPSBsZW4oc2VsZi50b2tlbnMpIC0gMQorCisgICAgICAgIGlmIHN0YXJ0IDwgMDoKKyAgICAgICAgICAgIHN0YXJ0ID0gMAorCisgICAgICAgIHJld3JpdGVzID0gc2VsZi5wcm9ncmFtcy5nZXQocHJvZ3JhbU5hbWUpCisgICAgICAgIGlmIHJld3JpdGVzIGlzIE5vbmUgb3IgbGVuKHJld3JpdGVzKSA9PSAwOgorICAgICAgICAgICAgIyBubyBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9PcmlnaW5hbFN0cmluZyhzdGFydCwgZW5kKQorCisgICAgICAgIGJ1ZiA9IFN0cmluZ0lPKCkKKworICAgICAgICAjIEZpcnN0LCBvcHRpbWl6ZSBpbnN0cnVjdGlvbiBzdHJlYW0KKyAgICAgICAgaW5kZXhUb09wID0gc2VsZi5yZWR1Y2VUb1NpbmdsZU9wZXJhdGlvblBlckluZGV4KHJld3JpdGVzKQorCisgICAgICAgICMgV2FsayBidWZmZXIsIGV4ZWN1dGluZyBpbnN0cnVjdGlvbnMgYW5kIGVtaXR0aW5nIHRva2VucworICAgICAgICBpID0gc3RhcnQKKyAgICAgICAgd2hpbGUgaSA8PSBlbmQgYW5kIGkgPCBsZW4oc2VsZi50b2tlbnMpOgorICAgICAgICAgICAgb3AgPSBpbmRleFRvT3AuZ2V0KGkpCisgICAgICAgICAgICAjIHJlbW92ZSBzbyBhbnkgbGVmdCBoYXZlIGluZGV4IHNpemUtMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBpbmRleFRvT3BbaV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHQgPSBzZWxmLnRva2Vuc1tpXQorICAgICAgICAgICAgaWYgb3AgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIG5vIG9wZXJhdGlvbiBhdCB0aGF0IGluZGV4LCBqdXN0IGR1bXAgdG9rZW4KKyAgICAgICAgICAgICAgICBpZiB0LnR5cGUgIT0gRU9GOgorICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUodC50ZXh0KQorICAgICAgICAgICAgICAgIGkgKz0gMSAjIG1vdmUgdG8gbmV4dCB0b2tlbgorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgPSBvcC5leGVjdXRlKGJ1ZikgIyBleGVjdXRlIG9wZXJhdGlvbiBhbmQgc2tpcAorCisgICAgICAgICMgaW5jbHVkZSBzdHVmZiBhZnRlciBlbmQgaWYgaXQncyBsYXN0IGluZGV4IGluIGJ1ZmZlcgorICAgICAgICAjIFNvLCBpZiB0aGV5IGRpZCBhbiBpbnNlcnRBZnRlcihsYXN0VmFsaWRJbmRleCwgImZvbyIpLCBpbmNsdWRlCisgICAgICAgICMgZm9vIGlmIGVuZD09bGFzdFZhbGlkSW5kZXguCisgICAgICAgIGlmIGVuZCA9PSBsZW4oc2VsZi50b2tlbnMpIC0gMToKKyAgICAgICAgICAgICMgU2NhbiBhbnkgcmVtYWluaW5nIG9wZXJhdGlvbnMgYWZ0ZXIgbGFzdCB0b2tlbgorICAgICAgICAgICAgIyBzaG91bGQgYmUgaW5jbHVkZWQgKHRoZXkgd2lsbCBiZSBpbnNlcnRzKS4KKyAgICAgICAgICAgIGZvciBpIGluIHNvcnRlZChpbmRleFRvT3Aua2V5cygpKToKKyAgICAgICAgICAgICAgICBvcCA9IGluZGV4VG9PcFtpXQorICAgICAgICAgICAgICAgIGlmIG9wLmluZGV4ID49IGxlbihzZWxmLnRva2VucyktMToKKyAgICAgICAgICAgICAgICAgICAgYnVmLndyaXRlKG9wLnRleHQpCisKKyAgICAgICAgcmV0dXJuIGJ1Zi5nZXR2YWx1ZSgpCisKKyAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworCisgICAgZGVmIHJlZHVjZVRvU2luZ2xlT3BlcmF0aW9uUGVySW5kZXgoc2VsZiwgcmV3cml0ZXMpOgorICAgICAgICAiIiIKKyAgICAgICAgV2UgbmVlZCB0byBjb21iaW5lIG9wZXJhdGlvbnMgYW5kIHJlcG9ydCBpbnZhbGlkIG9wZXJhdGlvbnMgKGxpa2UKKyAgICAgICAgb3ZlcmxhcHBpbmcgcmVwbGFjZXMgdGhhdCBhcmUgbm90IGNvbXBsZXRlZCBuZXN0ZWQpLiAgSW5zZXJ0cyB0bworICAgICAgICBzYW1lIGluZGV4IG5lZWQgdG8gYmUgY29tYmluZWQgZXRjLi4uICAgSGVyZSBhcmUgdGhlIGNhc2VzOgorCisgICAgICAgIEkuaS51IEkuai52ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisgICAgICAgIEkuaS51IEkuaS52ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZTogSWl2dQorCisgICAgICAgIFIuaS1qLnUgUi54LXkudiB8IGktaiBpbiB4LXkgICAgICAgICAgZGVsZXRlIGZpcnN0IFIKKyAgICAgICAgUi5pLWoudSBSLmktai52ICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZmlyc3QgUgorICAgICAgICBSLmktai51IFIueC15LnYgfCB4LXkgaW4gaS1qICAgICAgICAgIEVSUk9SCisgICAgICAgIFIuaS1qLnUgUi54LXkudiB8IGJvdW5kYXJpZXMgb3ZlcmxhcCAgRVJST1IKKworICAgICAgICBEZWxldGUgc3BlY2lhbCBjYXNlIG9mIHJlcGxhY2UgKHRleHQ9PW51bGwpOgorICAgICAgICBELmktai51IEQueC15LnYgfCAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJpZXMgb3ZlcmxhcGNvbWJpbmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobWluKS4ubWF4KHJpZ2h0KQorCisgICAgICAgIEkuaS51IFIueC15LnYgICB8ICAgICAgICAgICAgICAgICAgICAgaSBpbiAoeCsxKS15ZGVsZXRlIEkgKHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IGJlZm9yZSB3ZSdyZSBub3QgZGVsZXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKQorICAgICAgICBJLmkudSBSLngteS52ICAgfCAgICAgICAgICAgICAgICAgICAgIGkgbm90IGluICh4KzEpLXlsZWF2ZSBhbG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25vdmVybGFwcGluZworCisgICAgICAgIFIueC15LnYgSS5pLnUgICB8IGkgaW4geC15ICAgICAgICAgICAgRVJST1IKKyAgICAgICAgUi54LXkudiBJLngudSAgICAgICAgICAgICAgICAgICAgICAgICBSLngteS51diAoY29tYmluZSwgZGVsZXRlIEkpCisgICAgICAgIFIueC15LnYgSS5pLnUgICB8IGkgbm90IGluIHgteSAgICAgICAgbGVhdmUgYWxvbmUsIG5vbm92ZXJsYXBwaW5nCisKKyAgICAgICAgSS5pLnUgPSBpbnNlcnQgdSBiZWZvcmUgb3AgQCBpbmRleCBpCisgICAgICAgIFIueC15LnUgPSByZXBsYWNlIHgteSBpbmRleGVkIHRva2VucyB3aXRoIHUKKworICAgICAgICBGaXJzdCB3ZSBuZWVkIHRvIGV4YW1pbmUgcmVwbGFjZXMuICBGb3IgYW55IHJlcGxhY2Ugb3A6CisKKyAgICAgICAgICAxLiB3aXBlIG91dCBhbnkgaW5zZXJ0aW9ucyBiZWZvcmUgb3Agd2l0aGluIHRoYXQgcmFuZ2UuCisgICAgICAgICAgMi4gRHJvcCBhbnkgcmVwbGFjZSBvcCBiZWZvcmUgdGhhdCBpcyBjb250YWluZWQgY29tcGxldGVseSB3aXRoaW4KKyAgICAgICAgICAgICB0aGF0IHJhbmdlLgorICAgICAgICAgIDMuIFRocm93IGV4Y2VwdGlvbiB1cG9uIGJvdW5kYXJ5IG92ZXJsYXAgd2l0aCBhbnkgcHJldmlvdXMgcmVwbGFjZS4KKworICAgICAgICBUaGVuIHdlIGNhbiBkZWFsIHdpdGggaW5zZXJ0czoKKworICAgICAgICAgIDEuIGZvciBhbnkgaW5zZXJ0cyB0byBzYW1lIGluZGV4LCBjb21iaW5lIGV2ZW4gaWYgbm90IGFkamFjZW50LgorICAgICAgICAgIDIuIGZvciBhbnkgcHJpb3IgcmVwbGFjZSB3aXRoIHNhbWUgbGVmdCBib3VuZGFyeSwgY29tYmluZSB0aGlzCisgICAgICAgICAgICAgaW5zZXJ0IHdpdGggcmVwbGFjZSBhbmQgZGVsZXRlIHRoaXMgcmVwbGFjZS4KKyAgICAgICAgICAzLiB0aHJvdyBleGNlcHRpb24gaWYgaW5kZXggaW4gc2FtZSByYW5nZSBhcyBwcmV2aW91cyByZXBsYWNlCisKKyAgICAgICAgRG9uJ3QgYWN0dWFsbHkgZGVsZXRlOyBtYWtlIG9wIG51bGwgaW4gbGlzdC4gRWFzaWVyIHRvIHdhbGsgbGlzdC4KKyAgICAgICAgTGF0ZXIgd2UgY2FuIHRocm93IGFzIHdlIGFkZCB0byBpbmRleCAtPiBvcCBtYXAuCisKKyAgICAgICAgTm90ZSB0aGF0IEkuMiBSLjItMiB3aWxsIHdpcGUgb3V0IEkuMiBldmVuIHRob3VnaCwgdGVjaG5pY2FsbHksIHRoZQorICAgICAgICBpbnNlcnRlZCBzdHVmZiB3b3VsZCBiZSBiZWZvcmUgdGhlIHJlcGxhY2UgcmFuZ2UuICBCdXQsIGlmIHlvdQorICAgICAgICBhZGQgdG9rZW5zIGluIGZyb250IG9mIGEgbWV0aG9kIGJvZHkgJ3snIGFuZCB0aGVuIGRlbGV0ZSB0aGUgbWV0aG9kCisgICAgICAgIGJvZHksIEkgdGhpbmsgdGhlIHN0dWZmIGJlZm9yZSB0aGUgJ3snIHlvdSBhZGRlZCBzaG91bGQgZGlzYXBwZWFyIHRvby4KKworICAgICAgICBSZXR1cm4gYSBtYXAgZnJvbSB0b2tlbiBpbmRleCB0byBvcGVyYXRpb24uCisgICAgICAgICIiIgorCisgICAgICAgICMgV0FMSyBSRVBMQUNFUworICAgICAgICBmb3IgaSwgcm9wIGluIGVudW1lcmF0ZShyZXdyaXRlcyk6CisgICAgICAgICAgICBpZiByb3AgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyb3AsIFJlcGxhY2VPcCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBXaXBlIHByaW9yIGluc2VydHMgd2l0aGluIHJhbmdlCisgICAgICAgICAgICBmb3IgaiwgaW9wIGluIHNlbGYuZ2V0S2luZE9mT3BzKHJld3JpdGVzLCBJbnNlcnRCZWZvcmVPcCwgaSk6CisgICAgICAgICAgICAgICAgaWYgaW9wLmluZGV4ID09IHJvcC5pbmRleDoKKyAgICAgICAgICAgICAgICAgICAgIyBFLmcuLCBpbnNlcnQgYmVmb3JlIDIsIGRlbGV0ZSAyLi4yOyB1cGRhdGUgcmVwbGFjZQorICAgICAgICAgICAgICAgICAgICAjIHRleHQgdG8gaW5jbHVkZSBpbnNlcnQgYmVmb3JlLCBraWxsIGluc2VydAorICAgICAgICAgICAgICAgICAgICByZXdyaXRlc1tpb3AuaW5zdHJ1Y3Rpb25JbmRleF0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHJvcC50ZXh0ID0gc2VsZi5jYXRPcFRleHQoaW9wLnRleHQsIHJvcC50ZXh0KQorCisgICAgICAgICAgICAgICAgZWxpZiBpb3AuaW5kZXggPiByb3AuaW5kZXggYW5kIGlvcC5pbmRleCA8PSByb3AubGFzdEluZGV4OgorICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSBpbnNlcnQgYXMgaXQncyBhIG5vLW9wLgorICAgICAgICAgICAgICAgICAgICByZXdyaXRlc1tqXSA9IE5vbmUKKworICAgICAgICAgICAgIyBEcm9wIGFueSBwcmlvciByZXBsYWNlcyBjb250YWluZWQgd2l0aGluCisgICAgICAgICAgICBmb3IgaiwgcHJldlJvcCBpbiBzZWxmLmdldEtpbmRPZk9wcyhyZXdyaXRlcywgUmVwbGFjZU9wLCBpKToKKyAgICAgICAgICAgICAgICBpZiAocHJldlJvcC5pbmRleCA+PSByb3AuaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgYW5kIHByZXZSb3AubGFzdEluZGV4IDw9IHJvcC5sYXN0SW5kZXgpOgorICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSByZXBsYWNlIGFzIGl0J3MgYSBuby1vcC4KKyAgICAgICAgICAgICAgICAgICAgcmV3cml0ZXNbal0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIHRocm93IGV4Y2VwdGlvbiB1bmxlc3MgZGlzam9pbnQgb3IgaWRlbnRpY2FsCisgICAgICAgICAgICAgICAgZGlzam9pbnQgPSAocHJldlJvcC5sYXN0SW5kZXggPCByb3AuaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwcmV2Um9wLmluZGV4ID4gcm9wLmxhc3RJbmRleCkKKyAgICAgICAgICAgICAgICBzYW1lID0gKHByZXZSb3AuaW5kZXggPT0gcm9wLmluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJldlJvcC5sYXN0SW5kZXggPT0gcm9wLmxhc3RJbmRleCkKKworICAgICAgICAgICAgICAgICMgRGVsZXRlIHNwZWNpYWwgY2FzZSBvZiByZXBsYWNlICh0ZXh0PT1udWxsKToKKyAgICAgICAgICAgICAgICAjIEQuaS1qLnUgRC54LXkudnwgYm91bmRhcmllcyBvdmVybGFwY29tYmluZSB0bworICAgICAgICAgICAgICAgICMgbWF4KG1pbikuLm1heChyaWdodCkKKyAgICAgICAgICAgICAgICBpZiBwcmV2Um9wLnRleHQgaXMgTm9uZSBhbmQgcm9wLnRleHQgaXMgTm9uZSBhbmQgbm90IGRpc2pvaW50OgorICAgICAgICAgICAgICAgICAgICAjIGtpbGwgZmlyc3QgZGVsZXRlCisgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW3ByZXZSb3AuaW5zdHJ1Y3Rpb25JbmRleF0gPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgcm9wLmluZGV4ID0gbWluKHByZXZSb3AuaW5kZXgsIHJvcC5pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcm9wLmxhc3RJbmRleCA9IG1heChwcmV2Um9wLmxhc3RJbmRleCwgcm9wLmxhc3RJbmRleCkKKworICAgICAgICAgICAgICAgIGVsaWYgbm90IGRpc2pvaW50IGFuZCBub3Qgc2FtZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIG9wIGJvdW5kYXJpZXMgb2YgJXMgb3ZlcmxhcCB3aXRoIHByZXZpb3VzICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAocm9wLCBwcmV2Um9wKSkKKworICAgICAgICAjIFdBTEsgSU5TRVJUUworICAgICAgICBmb3IgaSwgaW9wIGluIGVudW1lcmF0ZShyZXdyaXRlcyk6CisgICAgICAgICAgICBpZiBpb3AgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpb3AsIEluc2VydEJlZm9yZU9wKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIGNvbWJpbmUgY3VycmVudCBpbnNlcnQgd2l0aCBwcmlvciBpZiBhbnkgYXQgc2FtZSBpbmRleAorICAgICAgICAgICAgZm9yIGosIHByZXZJb3AgaW4gc2VsZi5nZXRLaW5kT2ZPcHMocmV3cml0ZXMsIEluc2VydEJlZm9yZU9wLCBpKToKKyAgICAgICAgICAgICAgICBpZiBwcmV2SW9wLmluZGV4ID09IGlvcC5pbmRleDogIyBjb21iaW5lIG9iamVjdHMKKyAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHRvIHN0cmluZ3MuLi53ZSdyZSBpbiBwcm9jZXNzIG9mIHRvU3RyaW5nJ2luZworICAgICAgICAgICAgICAgICAgICAjIHdob2xlIHRva2VuIGJ1ZmZlciBzbyBubyBsYXp5IGV2YWwgaXNzdWUgd2l0aCBhbnkKKyAgICAgICAgICAgICAgICAgICAgIyB0ZW1wbGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgaW9wLnRleHQgPSBzZWxmLmNhdE9wVGV4dChpb3AudGV4dCwgcHJldklvcC50ZXh0KQorICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSByZWR1bmRhbnQgcHJpb3IgaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW2pdID0gTm9uZQorCisgICAgICAgICAgICAjIGxvb2sgZm9yIHJlcGxhY2VzIHdoZXJlIGlvcC5pbmRleCBpcyBpbiByYW5nZTsgZXJyb3IKKyAgICAgICAgICAgIGZvciBqLCByb3AgaW4gc2VsZi5nZXRLaW5kT2ZPcHMocmV3cml0ZXMsIFJlcGxhY2VPcCwgaSk6CisgICAgICAgICAgICAgICAgaWYgaW9wLmluZGV4ID09IHJvcC5pbmRleDoKKyAgICAgICAgICAgICAgICAgICAgcm9wLnRleHQgPSBzZWxmLmNhdE9wVGV4dChpb3AudGV4dCwgcm9wLnRleHQpCisgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIGN1cnJlbnQgaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgIHJld3JpdGVzW2ldID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgaW9wLmluZGV4ID49IHJvcC5pbmRleCBhbmQgaW9wLmluZGV4IDw9IHJvcC5sYXN0SW5kZXg6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IG9wICVzIHdpdGhpbiBib3VuZGFyaWVzIG9mIHByZXZpb3VzICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAoaW9wLCByb3ApKQorCisgICAgICAgIG0gPSB7fQorICAgICAgICBmb3IgaSwgb3AgaW4gZW51bWVyYXRlKHJld3JpdGVzKToKKyAgICAgICAgICAgIGlmIG9wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgZGVsZXRlZCBvcHMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBhc3NlcnQgb3AuaW5kZXggbm90IGluIG0sICJzaG91bGQgb25seSBiZSBvbmUgb3AgcGVyIGluZGV4IgorICAgICAgICAgICAgbVtvcC5pbmRleF0gPSBvcAorCisgICAgICAgIHJldHVybiBtCisKKworICAgIGRlZiBjYXRPcFRleHQoc2VsZiwgYSwgYik6CisgICAgICAgIHggPSAiIgorICAgICAgICB5ID0gIiIKKyAgICAgICAgaWYgYSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHggPSBhCisgICAgICAgIGlmIGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5ID0gYgorICAgICAgICByZXR1cm4geCArIHkKKworCisgICAgZGVmIGdldEtpbmRPZk9wcyhzZWxmLCByZXdyaXRlcywga2luZCwgYmVmb3JlPU5vbmUpOgorICAgICAgICAiIiJHZXQgYWxsIG9wZXJhdGlvbnMgYmVmb3JlIGFuIGluZGV4IG9mIGEgcGFydGljdWxhciBraW5kLiIiIgorCisgICAgICAgIGlmIGJlZm9yZSBpcyBOb25lOgorICAgICAgICAgICAgYmVmb3JlID0gbGVuKHJld3JpdGVzKQorICAgICAgICBlbGlmIGJlZm9yZSA+IGxlbihyZXdyaXRlcyk6CisgICAgICAgICAgICBiZWZvcmUgPSBsZW4ocmV3cml0ZXMpCisKKyAgICAgICAgZm9yIGksIG9wIGluIGVudW1lcmF0ZShyZXdyaXRlc1s6YmVmb3JlXSk6CisgICAgICAgICAgICBpZiBvcCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgaWdub3JlIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgb3AuX19jbGFzc19fID09IGtpbmQ6CisgICAgICAgICAgICAgICAgeWllbGQgaSwgb3AKKworCisgICAgZGVmIHRvRGVidWdTdHJpbmcoc2VsZiwgc3RhcnQ9Tm9uZSwgZW5kPU5vbmUpOgorICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLk1JTl9UT0tFTl9JTkRFWAorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IHNlbGYuc2l6ZSgpIC0gMQorCisgICAgICAgIGJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgaSA9IHN0YXJ0CisgICAgICAgIHdoaWxlIGkgPj0gc2VsZi5NSU5fVE9LRU5fSU5ERVggYW5kIGkgPD0gZW5kIGFuZCBpIDwgbGVuKHNlbGYudG9rZW5zKToKKyAgICAgICAgICAgIGJ1Zi53cml0ZShzZWxmLmdldChpKSkKKyAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgIHJldHVybiBidWYuZ2V0dmFsdWUoKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy90b2tlbnMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL3Rva2Vucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2YzOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy90b2tlbnMucHkKQEAgLTAsMCArMSw0MTggQEAKKyIiIkFOVExSMyBydW50aW1lIHBhY2thZ2UiIiIKKworIyBiZWdpbltsaWNlbmNlXQorIworIyBbVGhlICJCU0QgbGljZW5jZSJdCisjIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyMgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisjIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKyMgZW5kW2xpY2VuY2VdCisKK2Zyb20gYW50bHIzLmNvbnN0YW50cyBpbXBvcnQgRU9GLCBERUZBVUxUX0NIQU5ORUwsIElOVkFMSURfVE9LRU5fVFlQRQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGJhc2ljIHRva2VuIGludGVyZmFjZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBUb2tlbihvYmplY3QpOgorICAgICIiIkBicmllZiBBYnN0cmFjdCB0b2tlbiBiYXNlY2xhc3MuIiIiCisKKyAgICBkZWYgZ2V0VGV4dChzZWxmKToKKyAgICAgICAgIiIiQGJyaWVmIEdldCB0aGUgdGV4dCBvZiB0aGUgdG9rZW4uCisKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLnRleHQgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBzZXRUZXh0KHNlbGYsIHRleHQpOgorICAgICAgICAiIiJAYnJpZWYgU2V0IHRoZSB0ZXh0IG9mIHRoZSB0b2tlbi4KKworICAgICAgICBVc2luZyBzZXR0ZXIvZ2V0dGVyIG1ldGhvZHMgaXMgZGVwcmVjYXRlZC4gVXNlIG8udGV4dCBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0VHlwZShzZWxmKToKKyAgICAgICAgIiIiQGJyaWVmIEdldCB0aGUgdHlwZSBvZiB0aGUgdG9rZW4uCisKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLnR5cGUgaW5zdGVhZC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgc2V0VHlwZShzZWxmLCB0dHlwZSk6CisgICAgICAgICIiIkBicmllZiBHZXQgdGhlIHR5cGUgb2YgdGhlIHRva2VuLgorCisgICAgICAgIFVzaW5nIHNldHRlci9nZXR0ZXIgbWV0aG9kcyBpcyBkZXByZWNhdGVkLiBVc2Ugby50eXBlIGluc3RlYWQuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0TGluZShzZWxmKToKKyAgICAgICAgIiIiQGJyaWVmIEdldCB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhpcyB0b2tlbiB3YXMgbWF0Y2hlZAorCisgICAgICAgIExpbmVzIGFyZSBudW1iZXJlZCAxLi5uCisKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLmxpbmUgaW5zdGVhZC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgc2V0TGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiQGJyaWVmIFNldCB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhpcyB0b2tlbiB3YXMgbWF0Y2hlZAorCisgICAgICAgIFVzaW5nIHNldHRlci9nZXR0ZXIgbWV0aG9kcyBpcyBkZXByZWNhdGVkLiBVc2Ugby5saW5lIGluc3RlYWQuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKHNlbGYpOgorICAgICAgICAiIiJAYnJpZWYgR2V0IHRoZSBjb2x1bW4gb2YgdGhlIHRva2VucyBmaXJzdCBjaGFyYWN0ZXIsCisKKyAgICAgICAgQ29sdW1ucyBhcmUgbnVtYmVyZWQgMC4ubi0xCisKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLmNoYXJQb3NpdGlvbkluTGluZSBpbnN0ZWFkLiIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBzZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZiwgcG9zKToKKyAgICAgICAgIiIiQGJyaWVmIFNldCB0aGUgY29sdW1uIG9mIHRoZSB0b2tlbnMgZmlyc3QgY2hhcmFjdGVyLAorCisgICAgICAgIFVzaW5nIHNldHRlci9nZXR0ZXIgbWV0aG9kcyBpcyBkZXByZWNhdGVkLiBVc2Ugby5jaGFyUG9zaXRpb25JbkxpbmUgaW5zdGVhZC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRDaGFubmVsKHNlbGYpOgorICAgICAgICAiIiJAYnJpZWYgR2V0IHRoZSBjaGFubmVsIG9mIHRoZSB0b2tlbgorCisgICAgICAgIFVzaW5nIHNldHRlci9nZXR0ZXIgbWV0aG9kcyBpcyBkZXByZWNhdGVkLiBVc2Ugby5jaGFubmVsIGluc3RlYWQuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHNldENoYW5uZWwoc2VsZiwgY2hhbm5lbCk6CisgICAgICAgICIiIkBicmllZiBTZXQgdGhlIGNoYW5uZWwgb2YgdGhlIHRva2VuCisKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLmNoYW5uZWwgaW5zdGVhZC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUb2tlbkluZGV4KHNlbGYpOgorICAgICAgICAiIiJAYnJpZWYgR2V0IHRoZSBpbmRleCBpbiB0aGUgaW5wdXQgc3RyZWFtLgorCisgICAgICAgIEFuIGluZGV4IGZyb20gMC4ubi0xIG9mIHRoZSB0b2tlbiBvYmplY3QgaW4gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgVGhpcyBtdXN0IGJlIHZhbGlkIGluIG9yZGVyIHRvIHVzZSB0aGUgQU5UTFJXb3JrcyBkZWJ1Z2dlci4KKworICAgICAgICBVc2luZyBzZXR0ZXIvZ2V0dGVyIG1ldGhvZHMgaXMgZGVwcmVjYXRlZC4gVXNlIG8uaW5kZXggaW5zdGVhZC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgc2V0VG9rZW5JbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkBicmllZiBTZXQgdGhlIGluZGV4IGluIHRoZSBpbnB1dCBzdHJlYW0uCisKKyAgICAgICAgVXNpbmcgc2V0dGVyL2dldHRlciBtZXRob2RzIGlzIGRlcHJlY2F0ZWQuIFVzZSBvLmluZGV4IGluc3RlYWQuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0SW5wdXRTdHJlYW0oc2VsZik6CisgICAgICAgICIiIkBicmllZiBGcm9tIHdoYXQgY2hhcmFjdGVyIHN0cmVhbSB3YXMgdGhpcyB0b2tlbiBjcmVhdGVkLgorCisgICAgICAgIFlvdSBkb24ndCBoYXZlIHRvIGltcGxlbWVudCBidXQgaXQncyBuaWNlIHRvIGtub3cgd2hlcmUgYSBUb2tlbgorICAgICAgICBjb21lcyBmcm9tIGlmIHlvdSBoYXZlIGluY2x1ZGUgZmlsZXMgZXRjLi4uIG9uIHRoZSBpbnB1dC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgc2V0SW5wdXRTdHJlYW0oc2VsZiwgaW5wdXQpOgorICAgICAgICAiIiJAYnJpZWYgRnJvbSB3aGF0IGNoYXJhY3RlciBzdHJlYW0gd2FzIHRoaXMgdG9rZW4gY3JlYXRlZC4KKworICAgICAgICBZb3UgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgYnV0IGl0J3MgbmljZSB0byBrbm93IHdoZXJlIGEgVG9rZW4KKyAgICAgICAgY29tZXMgZnJvbSBpZiB5b3UgaGF2ZSBpbmNsdWRlIGZpbGVzIGV0Yy4uLiBvbiB0aGUgaW5wdXQuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdG9rZW4gaW1wbGVtZW50YXRpb25zCisjCisjIFRva2VuCisjICstIENvbW1vblRva2VuCisjIFwtIENsYXNzaWNUb2tlbgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBDb21tb25Ub2tlbihUb2tlbik6CisgICAgIiIiQGJyaWVmIEJhc2ljIHRva2VuIGltcGxlbWVudGF0aW9uLgorCisgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb3B5IHRoZSB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmVhbSB1cG9uCisgICAgY3JlYXRpb24sIGJ1dCBrZWVwcyBzdGFydC9zdG9wIHBvaW50ZXJzIGludG8gdGhlIHN0cmVhbSB0byBhdm9pZAorICAgIHVubmVjZXNzYXJ5IGNvcHkgb3BlcmF0aW9ucy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9Tm9uZSwgY2hhbm5lbD1ERUZBVUxUX0NIQU5ORUwsIHRleHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaW5wdXQ9Tm9uZSwgc3RhcnQ9Tm9uZSwgc3RvcD1Ob25lLCBvbGRUb2tlbj1Ob25lKToKKyAgICAgICAgVG9rZW4uX19pbml0X18oc2VsZikKKworICAgICAgICBpZiBvbGRUb2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudHlwZSA9IG9sZFRva2VuLnR5cGUKKyAgICAgICAgICAgIHNlbGYubGluZSA9IG9sZFRva2VuLmxpbmUKKyAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gb2xkVG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgICAgICBzZWxmLmNoYW5uZWwgPSBvbGRUb2tlbi5jaGFubmVsCisgICAgICAgICAgICBzZWxmLmluZGV4ID0gb2xkVG9rZW4uaW5kZXgKKyAgICAgICAgICAgIHNlbGYuX3RleHQgPSBvbGRUb2tlbi5fdGV4dAorICAgICAgICAgICAgc2VsZi5pbnB1dCA9IG9sZFRva2VuLmlucHV0CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9sZFRva2VuLCBDb21tb25Ub2tlbik6CisgICAgICAgICAgICAgICAgc2VsZi5zdGFydCA9IG9sZFRva2VuLnN0YXJ0CisgICAgICAgICAgICAgICAgc2VsZi5zdG9wID0gb2xkVG9rZW4uc3RvcAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKyAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gLTEgIyBzZXQgdG8gaW52YWxpZCBwb3NpdGlvbgorICAgICAgICAgICAgc2VsZi5saW5lID0gMAorICAgICAgICAgICAgc2VsZi5jaGFubmVsID0gY2hhbm5lbAorCisJICAgICNXaGF0IHRva2VuIG51bWJlciBpcyB0aGlzIGZyb20gMC4ubi0xIHRva2VuczsgPCAwIGltcGxpZXMgaW52YWxpZCBpbmRleAorICAgICAgICAgICAgc2VsZi5pbmRleCA9IC0xCisKKyAgICAgICAgICAgICMgV2UgbmVlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdGV4dCBvbmNlIGluIGEgd2hpbGUuICBJZgorICAgICAgICAgICAgIyB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGdldFRleHQgc2hvdWxkIHJldHVybiB0aGlzLiAgTm90ZSB0aGF0CisgICAgICAgICAgICAjIHN0YXJ0L3N0b3AgYXJlIG5vdCBhZmZlY3RlZCBieSBjaGFuZ2luZyB0aGlzLgorICAgICAgICAgICAgc2VsZi5fdGV4dCA9IHRleHQKKworICAgICAgICAgICAgIyBUaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdGFydHMKKyAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorCisgICAgICAgICAgICAjIFRoZSBjaGFyIHBvc2l0aW9uIGludG8gdGhlIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGlzIHRva2VuIHN0b3BzCisgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXIsICpub3QqIHRoZSBpbmRleCBhZnRlciBpdCEKKyAgICAgICAgICAgIHNlbGYuc3RvcCA9IHN0b3AKKworCisgICAgZGVmIGdldFRleHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3RleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGV4dAorCisgICAgICAgIGlmIHNlbGYuaW5wdXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc2VsZi5zdGFydCA8IHNlbGYuaW5wdXQuc2l6ZSgpIGFuZCBzZWxmLnN0b3AgPCBzZWxmLmlucHV0LnNpemUoKToKKyAgICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC5zdWJzdHJpbmcoc2VsZi5zdGFydCwgc2VsZi5zdG9wKQorCisgICAgICAgIHJldHVybiAnPEVPRj4nCisKKworICAgIGRlZiBzZXRUZXh0KHNlbGYsIHRleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgT3ZlcnJpZGUgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4uICBnZXRUZXh0KCkgd2lsbCByZXR1cm4gdGhpcyB0ZXh0CisgICAgICAgIHJhdGhlciB0aGFuIHB1bGxpbmcgZnJvbSB0aGUgYnVmZmVyLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbWVhbgorICAgICAgICB0aGF0IHN0YXJ0L3N0b3AgaW5kZXhlcyBhcmUgbm90IHZhbGlkLiAgSXQgbWVhbnMgdGhhdCB0aGF0IGlucHV0CisgICAgICAgIHdhcyBjb252ZXJ0ZWQgdG8gYSBuZXcgc3RyaW5nIGluIHRoZSB0b2tlbiBvYmplY3QuCisJIiIiCisgICAgICAgIHNlbGYuX3RleHQgPSB0ZXh0CisKKyAgICB0ZXh0ID0gcHJvcGVydHkoZ2V0VGV4dCwgc2V0VGV4dCkKKworCisgICAgZGVmIGdldFR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUKKworICAgIGRlZiBzZXRUeXBlKHNlbGYsIHR0eXBlKToKKyAgICAgICAgc2VsZi50eXBlID0gdHR5cGUKKworICAgIGRlZiBnZXRUeXBlTmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnR5cGUpCisKKyAgICB0eXBlTmFtZSA9IHByb3BlcnR5KGxhbWJkYSBzOiBzLmdldFR5cGVOYW1lKCkpCisKKyAgICBkZWYgZ2V0TGluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGluZQorCisgICAgZGVmIHNldExpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKworCisgICAgZGVmIGdldENoYXJQb3NpdGlvbkluTGluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lCisKKyAgICBkZWYgc2V0Q2hhclBvc2l0aW9uSW5MaW5lKHNlbGYsIHBvcyk6CisgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gcG9zCisKKworICAgIGRlZiBnZXRDaGFubmVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jaGFubmVsCisKKyAgICBkZWYgc2V0Q2hhbm5lbChzZWxmLCBjaGFubmVsKToKKyAgICAgICAgc2VsZi5jaGFubmVsID0gY2hhbm5lbAorCisKKyAgICBkZWYgZ2V0VG9rZW5JbmRleChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXgKKworICAgIGRlZiBzZXRUb2tlbkluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi5pbmRleCA9IGluZGV4CisKKworICAgIGRlZiBnZXRJbnB1dFN0cmVhbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5wdXQKKworICAgIGRlZiBzZXRJbnB1dFN0cmVhbShzZWxmLCBpbnB1dCk6CisgICAgICAgIHNlbGYuaW5wdXQgPSBpbnB1dAorCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi50eXBlID09IEVPRjoKKyAgICAgICAgICAgIHJldHVybiAiPEVPRj4iCisKKyAgICAgICAgY2hhbm5lbFN0ciA9ICIiCisgICAgICAgIGlmIHNlbGYuY2hhbm5lbCA+IDA6CisgICAgICAgICAgICBjaGFubmVsU3RyID0gIixjaGFubmVsPSIgKyBzdHIoc2VsZi5jaGFubmVsKQorCisgICAgICAgIHR4dCA9IHNlbGYudGV4dAorICAgICAgICBpZiB0eHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0eHQgPSB0eHQucmVwbGFjZSgiXG4iLCJcXFxcbiIpCisgICAgICAgICAgICB0eHQgPSB0eHQucmVwbGFjZSgiXHIiLCJcXFxcciIpCisgICAgICAgICAgICB0eHQgPSB0eHQucmVwbGFjZSgiXHQiLCJcXFxcdCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0eHQgPSAiPG5vIHRleHQ+IgorCisgICAgICAgIHJldHVybiAiW0AlZCwlZDolZD0lciw8JXM+JXMsJWQ6JWRdIiAlICgKKyAgICAgICAgICAgIHNlbGYuaW5kZXgsCisgICAgICAgICAgICBzZWxmLnN0YXJ0LCBzZWxmLnN0b3AsCisgICAgICAgICAgICB0eHQsCisgICAgICAgICAgICBzZWxmLnR5cGVOYW1lLCBjaGFubmVsU3RyLAorICAgICAgICAgICAgc2VsZi5saW5lLCBzZWxmLmNoYXJQb3NpdGlvbkluTGluZQorICAgICAgICAgICAgKQorCisKK2NsYXNzIENsYXNzaWNUb2tlbihUb2tlbik6CisgICAgIiIiQGJyaWVmIEFsdGVybmF0aXZlIHRva2VuIGltcGxlbWVudGF0aW9uLgorCisgICAgQSBUb2tlbiBvYmplY3QgbGlrZSB3ZSdkIHVzZSBpbiBBTlRMUiAyLng7IGhhcyBhbiBhY3R1YWwgc3RyaW5nIGNyZWF0ZWQKKyAgICBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiAgVGhlc2Ugb2JqZWN0cyBhcmUgbmVlZGVkIGZvciBpbWFnaW5hcnkKKyAgICB0cmVlIG5vZGVzIHRoYXQgaGF2ZSBwYXlsb2FkIG9iamVjdHMuICBXZSBuZWVkIHRvIGNyZWF0ZSBhIFRva2VuIG9iamVjdAorICAgIHRoYXQgaGFzIGEgc3RyaW5nOyB0aGUgdHJlZSBub2RlIHdpbGwgcG9pbnQgYXQgdGhpcyB0b2tlbi4gIENvbW1vblRva2VuCisgICAgaGFzIGluZGV4ZXMgaW50byBhIGNoYXIgc3RyZWFtIGFuZCBoZW5jZSBjYW5ub3QgYmUgdXNlZCB0byBpbnRyb2R1Y2UKKyAgICBuZXcgc3RyaW5ncy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPU5vbmUsIHRleHQ9Tm9uZSwgY2hhbm5lbD1ERUZBVUxUX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgIG9sZFRva2VuPU5vbmUKKyAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgVG9rZW4uX19pbml0X18oc2VsZikKKworICAgICAgICBpZiBvbGRUb2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGV4dCA9IG9sZFRva2VuLnRleHQKKyAgICAgICAgICAgIHNlbGYudHlwZSA9IG9sZFRva2VuLnR5cGUKKyAgICAgICAgICAgIHNlbGYubGluZSA9IG9sZFRva2VuLmxpbmUKKyAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lID0gb2xkVG9rZW4uY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgICAgICBzZWxmLmNoYW5uZWwgPSBvbGRUb2tlbi5jaGFubmVsCisKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYubGluZSA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUgPSBOb25lCisgICAgICAgIHNlbGYuY2hhbm5lbCA9IGNoYW5uZWwKKyAgICAgICAgc2VsZi5pbmRleCA9IE5vbmUKKworCisgICAgZGVmIGdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRleHQKKworICAgIGRlZiBzZXRUZXh0KHNlbGYsIHRleHQpOgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisKKworICAgIGRlZiBnZXRUeXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlCisKKyAgICBkZWYgc2V0VHlwZShzZWxmLCB0dHlwZSk6CisgICAgICAgIHNlbGYudHlwZSA9IHR0eXBlCisKKworICAgIGRlZiBnZXRMaW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5saW5lCisKKyAgICBkZWYgc2V0TGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgc2VsZi5saW5lID0gbGluZQorCisKKyAgICBkZWYgZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUKKworICAgIGRlZiBzZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZiwgcG9zKToKKyAgICAgICAgc2VsZi5jaGFyUG9zaXRpb25JbkxpbmUgPSBwb3MKKworCisgICAgZGVmIGdldENoYW5uZWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNoYW5uZWwKKworICAgIGRlZiBzZXRDaGFubmVsKHNlbGYsIGNoYW5uZWwpOgorICAgICAgICBzZWxmLmNoYW5uZWwgPSBjaGFubmVsCisKKworICAgIGRlZiBnZXRUb2tlbkluZGV4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmRleAorCisgICAgZGVmIHNldFRva2VuSW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKworCisgICAgZGVmIGdldElucHV0U3RyZWFtKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHNldElucHV0U3RyZWFtKHNlbGYsIGlucHV0KToKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgIGNoYW5uZWxTdHIgPSAiIgorICAgICAgICBpZiBzZWxmLmNoYW5uZWwgPiAwOgorICAgICAgICAgICAgY2hhbm5lbFN0ciA9ICIsY2hhbm5lbD0iICsgc3RyKHNlbGYuY2hhbm5lbCkKKworICAgICAgICB0eHQgPSBzZWxmLnRleHQKKyAgICAgICAgaWYgdHh0IGlzIE5vbmU6CisgICAgICAgICAgICB0eHQgPSAiPG5vIHRleHQ+IgorCisgICAgICAgIHJldHVybiAiW0Alciwlciw8JXI+JXMsJXI6JXJdIiAlIChzZWxmLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhclBvc2l0aW9uSW5MaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKworICAgIF9fc3RyX18gPSB0b1N0cmluZworICAgIF9fcmVwcl9fID0gdG9TdHJpbmcKKworCitJTlZBTElEX1RPS0VOID0gQ29tbW9uVG9rZW4odHlwZT1JTlZBTElEX1RPS0VOX1RZUEUpCisKKyMgSW4gYW4gYWN0aW9uLCBhIGxleGVyIHJ1bGUgY2FuIHNldCB0b2tlbiB0byB0aGlzIFNLSVBfVE9LRU4gYW5kIEFOVExSCisjIHdpbGwgYXZvaWQgY3JlYXRpbmcgYSB0b2tlbiBmb3IgdGhpcyBzeW1ib2wgYW5kIHRyeSB0byBmZXRjaCBhbm90aGVyLgorU0tJUF9UT0tFTiA9IENvbW1vblRva2VuKHR5cGU9SU5WQUxJRF9UT0tFTl9UWVBFKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy90cmVlLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy90cmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzg0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL3RyZWUucHkKQEAgLTAsMCArMSwyODQzIEBACisiIiIgQHBhY2thZ2UgYW50bHIzLnRyZWUKK0BicmllZiBBTlRMUjMgcnVudGltZSBwYWNrYWdlLCB0cmVlIG1vZHVsZQorCitUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgc3VwcG9ydCBjbGFzc2VzIGZvciBBU1QgY29uc3RydWN0aW9uIGFuZCB0cmVlIHBhcnNlcnMuCisKKyIiIgorCisjIGJlZ2luW2xpY2VuY2VdCisjCisjIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworIyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBlbmRbbGljZW5jZV0KKworIyBsb3QncyBvZiBkb2NzdHJpbmdzIGFyZSBtaXNzaW5nLCBkb24ndCBjb21wbGFpbiBmb3Igbm93Li4uCisjIHB5bGludDogZGlzYWJsZS1tc2c9QzAxMTEKKworaW1wb3J0IHJlCisKK2Zyb20gYW50bHIzLmNvbnN0YW50cyBpbXBvcnQgVVAsIERPV04sIEVPRiwgSU5WQUxJRF9UT0tFTl9UWVBFCitmcm9tIGFudGxyMy5yZWNvZ25pemVycyBpbXBvcnQgQmFzZVJlY29nbml6ZXIsIFJ1bGVSZXR1cm5TY29wZQorZnJvbSBhbnRscjMuc3RyZWFtcyBpbXBvcnQgSW50U3RyZWFtCitmcm9tIGFudGxyMy50b2tlbnMgaW1wb3J0IENvbW1vblRva2VuLCBUb2tlbiwgSU5WQUxJRF9UT0tFTgorZnJvbSBhbnRscjMuZXhjZXB0aW9ucyBpbXBvcnQgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLCBcCisgICAgIE1pc3NpbmdUb2tlbkV4Y2VwdGlvbiwgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiwgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLCBcCisgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB0cmVlIHJlbGF0ZWQgZXhjZXB0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2NsYXNzIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbihSdW50aW1lRXJyb3IpOgorICAgICIiIgorICAgIEBicmllZiBCYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIEFTVCByZXdyaXRlIGNvbnN0cnVjdGlvbi4KKworICAgIFRoaXMgc2lnbmlmaWVzIGEgY2FzZSB3aGVyZSB0aGUgY2FyZGluYWxpdHkgb2YgdHdvIG9yIG1vcmUgZWxlbWVudHMKKyAgICBpbiBhIHN1YnJ1bGUgYXJlIGRpZmZlcmVudDogKElEIElOVCkrIHdoZXJlIHxJRHwhPXxJTlR8CisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudERlc2NyaXB0aW9uKToKKyAgICAgICAgUnVudGltZUVycm9yLl9faW5pdF9fKHNlbGYsIGVsZW1lbnREZXNjcmlwdGlvbikKKworICAgICAgICBzZWxmLmVsZW1lbnREZXNjcmlwdGlvbiA9IGVsZW1lbnREZXNjcmlwdGlvbgorCisKKyAgICBkZWYgZ2V0TWVzc2FnZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudERlc2NyaXB0aW9uCisKKworY2xhc3MgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbihSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24pOgorICAgICIiIkBicmllZiBObyBlbGVtZW50cyB3aXRoaW4gYSAoLi4uKSsgaW4gYSByZXdyaXRlIHJ1bGUiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbGVtZW50RGVzY3JpcHRpb249Tm9uZSk6CisgICAgICAgIFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBlbGVtZW50RGVzY3JpcHRpb24pCisKKworY2xhc3MgUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKFJld3JpdGVDYXJkaW5hbGl0eUV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgQGJyaWVmIFJlZiB0byBJRCBvciBleHByIGJ1dCBubyB0b2tlbnMgaW4gSUQgc3RyZWFtIG9yIHN1YnRyZWVzIGluIGV4cHIgc3RyZWFtCisgICAgIiIiCisKKyAgICBwYXNzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBiYXNpYyBUcmVlIGFuZCBUcmVlQWRhcHRvciBpbnRlcmZhY2VzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFRyZWUob2JqZWN0KToKKyAgICAiIiIKKyAgICBAYnJpZWYgQWJzdHJhY3QgYmFzZWNsYXNzIGZvciB0cmVlIG5vZGVzLgorCisgICAgV2hhdCBkb2VzIGEgdHJlZSBsb29rIGxpa2U/ICBBTlRMUiBoYXMgYSBudW1iZXIgb2Ygc3VwcG9ydCBjbGFzc2VzCisgICAgc3VjaCBhcyBDb21tb25UcmVlTm9kZVN0cmVhbSB0aGF0IHdvcmsgb24gdGhlc2Uga2luZHMgb2YgdHJlZXMuICBZb3UKKyAgICBkb24ndCBoYXZlIHRvIG1ha2UgeW91ciB0cmVlcyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGJ1dCBpZiB5b3UgZG8sCisgICAgeW91J2xsIGJlIGFibGUgdG8gdXNlIG1vcmUgc3VwcG9ydCBjb2RlLgorCisgICAgTk9URTogV2hlbiBjb25zdHJ1Y3RpbmcgdHJlZXMsIEFOVExSIGNhbiBidWlsZCBhbnkga2luZCBvZiB0cmVlOyBpdCBjYW4KKyAgICBldmVuIHVzZSBUb2tlbiBvYmplY3RzIGFzIHRyZWVzIGlmIHlvdSBhZGQgYSBjaGlsZCBsaXN0IHRvIHlvdXIgdG9rZW5zLgorCisgICAgVGhpcyBpcyBhIHRyZWUgbm9kZSB3aXRob3V0IGFueSBwYXlsb2FkOyBqdXN0IG5hdmlnYXRpb24gYW5kIGZhY3Rvcnkgc3R1ZmYuCisgICAgIiIiCisKKworICAgIGRlZiBnZXRDaGlsZChzZWxmLCBpKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0Q2hpbGRDb3VudChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0UGFyZW50KHNlbGYpOgorICAgICAgICAiIiJUcmVlIHRyYWNrcyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IG5vdyA+IDMuMCIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBzZXRQYXJlbnQoc2VsZiwgdCk6CisgICAgICAgICIiIlRyZWUgdHJhY2tzIHBhcmVudCBhbmQgY2hpbGQgaW5kZXggbm93ID4gMy4wIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgaGFzQW5jZXN0b3Ioc2VsZiwgdHR5cGUpOgorICAgICAgICAiIiJXYWxrIHVwd2FyZHMgbG9va2luZyBmb3IgYW5jZXN0b3Igd2l0aCB0aGlzIHRva2VuIHR5cGUuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGdldEFuY2VzdG9yKHNlbGYsIHR0eXBlKToKKyAgICAgICAgIiIiV2FsayB1cHdhcmRzIGFuZCBnZXQgZmlyc3QgYW5jZXN0b3Igd2l0aCB0aGlzIHRva2VuIHR5cGUuIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGdldEFuY2VzdG9ycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYW5jZXN0b3JzIG9mIHRoaXMgbm9kZS4KKworICAgICAgICBUaGUgZmlyc3Qgbm9kZSBvZiBsaXN0IGlzIHRoZSByb290IGFuZCB0aGUgbGFzdCBpcyB0aGUgcGFyZW50IG9mCisgICAgICAgIHRoaXMgbm9kZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0Q2hpbGRJbmRleChzZWxmKToKKyAgICAgICAgIiIiVGhpcyBub2RlIGlzIHdoYXQgY2hpbGQgaW5kZXg/IDAuLm4tMSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBzZXRDaGlsZEluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiVGhpcyBub2RlIGlzIHdoYXQgY2hpbGQgaW5kZXg/IDAuLm4tMSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoc2VsZik6CisgICAgICAgICIiIlNldCB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbmRleCB2YWx1ZXMgZm9yIGFsbCBjaGlsZHJlbiIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGFkZENoaWxkKHNlbGYsIHQpOgorICAgICAgICAiIiIKKyAgICAgICAgQWRkIHQgYXMgYSBjaGlsZCB0byB0aGlzIG5vZGUuICBJZiB0IGlzIG51bGwsIGRvIG5vdGhpbmcuICBJZiB0CisgICAgICAgIGlzIG5pbCwgYWRkIGFsbCBjaGlsZHJlbiBvZiB0IHRvIHRoaXMnIGNoaWxkcmVuLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzZXRDaGlsZChzZWxmLCBpLCB0KToKKyAgICAgICAgIiIiU2V0IGl0aCBjaGlsZCAoMC4ubi0xKSB0byB0OyB0IG11c3QgYmUgbm9uLW51bGwgYW5kIG5vbi1uaWwgbm9kZSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGRlbGV0ZUNoaWxkKHNlbGYsIGkpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiByZXBsYWNlQ2hpbGRyZW4oc2VsZiwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk6CisgICAgICAgICIiIgorICAgICAgICBEZWxldGUgY2hpbGRyZW4gZnJvbSBzdGFydCB0byBzdG9wIGFuZCByZXBsYWNlIHdpdGggdCBldmVuIGlmIHQgaXMKKyAgICAgICAgYSBsaXN0IChuaWwtcm9vdCB0cmVlKS4gIG51bSBvZiBjaGlsZHJlbiBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UuCisgICAgICAgIEZvciBodWdlIGNoaWxkIGxpc3RzLCBpbnNlcnRpbmcgY2hpbGRyZW4gY2FuIGZvcmNlIHdhbGtpbmcgcmVzdCBvZgorICAgICAgICBjaGlsZHJlbiB0byBzZXQgdGhlaXIgY2hpbGRpbmRleDsgY291bGQgYmUgc2xvdy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgaXNOaWwoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJbmRpY2F0ZXMgdGhlIG5vZGUgaXMgYSBuaWwgbm9kZSBidXQgbWF5IHN0aWxsIGhhdmUgY2hpbGRyZW4sIG1lYW5pbmcKKyAgICAgICAgdGhlIHRyZWUgaXMgYSBmbGF0IGxpc3QuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGdldFRva2VuU3RhcnRJbmRleChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAgICAgICAgICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgc2V0VG9rZW5TdGFydEluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZ2V0VG9rZW5TdG9wSW5kZXgoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBXaGF0IGlzIHRoZSBsYXJnZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKyAgICAgICAgYW5kIGl0cyBjaGlsZHJlbj8KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgc2V0VG9rZW5TdG9wSW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBkdXBOb2RlKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUeXBlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSB0b2tlbiB0eXBlOyBuZWVkZWQgZm9yIHRyZWUgcGFyc2luZy4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUZXh0KHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRMaW5lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSW4gY2FzZSB3ZSBkb24ndCBoYXZlIGEgdG9rZW4gcGF5bG9hZCwgd2hhdCBpcyB0aGUgbGluZSBmb3IgZXJyb3JzPworICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHRvU3RyaW5nVHJlZShzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisKK2NsYXNzIFRyZWVBZGFwdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgQGJyaWVmIEFic3RyYWN0IGJhc2VjbGFzcyBmb3IgdHJlZSBhZGFwdG9ycy4KKworICAgIEhvdyB0byBjcmVhdGUgYW5kIG5hdmlnYXRlIHRyZWVzLiAgUmF0aGVyIHRoYW4gaGF2ZSBhIHNlcGFyYXRlIGZhY3RvcnkKKyAgICBhbmQgYWRhcHRvciwgSSd2ZSBtZXJnZWQgdGhlbS4gIE1ha2VzIHNlbnNlIHRvIGVuY2Fwc3VsYXRlLgorCisgICAgVGhpcyB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIHRyZWUgY29uc3RydWN0aW9uIGNvZGUgZ2VuZXJhdGVkIGluIHRoZQorICAgIGdlbmVyYXRlZCBjb2RlIGluIDIueCBhbmQgdGhlIEFTVEZhY3RvcnkuCisKKyAgICBJIGRvIG5vdCBuZWVkIHRvIGtub3cgdGhlIHR5cGUgb2YgYSB0cmVlIGF0IGFsbCBzbyB0aGV5IGFyZSBhbGwKKyAgICBnZW5lcmljIE9iamVjdHMuICBUaGlzIG1heSBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIHR5cGVjYXN0aW5nIG5lZWRlZC4gOigKKyAgICAiIiIKKworICAgICMgQyBvIG4gcyB0IHIgdSBjIHQgaSBvIG4KKworICAgIGRlZiBjcmVhdGVXaXRoUGF5bG9hZChzZWxmLCBwYXlsb2FkKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIHRyZWUgbm9kZSBmcm9tIFRva2VuIG9iamVjdDsgZm9yIENvbW1vblRyZWUgdHlwZSB0cmVlcywKKyAgICAgICAgdGhlbiB0aGUgdG9rZW4ganVzdCBiZWNvbWVzIHRoZSBwYXlsb2FkLiAgVGhpcyBpcyB0aGUgbW9zdAorICAgICAgICBjb21tb24gY3JlYXRlIGNhbGwuCisKKyAgICAgICAgT3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGR1cE5vZGUoc2VsZiwgdHJlZU5vZGUpOgorICAgICAgICAiIiJEdXBsaWNhdGUgYSBzaW5nbGUgdHJlZSBub2RlLgorCisgICAgICAgIE92ZXJyaWRlIGlmIHlvdSB3YW50IGFub3RoZXIga2luZCBvZiBub2RlIHRvIGJlIGJ1aWx0LiIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGR1cFRyZWUoc2VsZiwgdHJlZSk6CisgICAgICAgICIiIkR1cGxpY2F0ZSB0cmVlIHJlY3Vyc2l2ZWx5LCB1c2luZyBkdXBOb2RlKCkgZm9yIGVhY2ggbm9kZSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIG5pbChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG5pbCBub2RlIChhbiBlbXB0eSBidXQgbm9uLW51bGwgbm9kZSkgdGhhdCBjYW4gaG9sZAorICAgICAgICBhIGxpc3Qgb2YgZWxlbWVudCBhcyB0aGUgY2hpbGRyZW4uICBJZiB5b3Ugd2FudCBhIGZsYXQgdHJlZSAoYSBsaXN0KQorICAgICAgICB1c2UgInQ9YWRhcHRvci5uaWwoKTsgdC5hZGRDaGlsZCh4KTsgdC5hZGRDaGlsZCh5KTsiCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGVycm9yTm9kZShzZWxmLCBpbnB1dCwgc3RhcnQsIHN0b3AsIGV4Yyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSB0cmVlIG5vZGUgcmVwcmVzZW50aW5nIGFuIGVycm9yLiAgVGhpcyBub2RlIHJlY29yZHMgdGhlCisgICAgICAgIHRva2VucyBjb25zdW1lZCBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkuICBUaGUgc3RhcnQgdG9rZW4gaW5kaWNhdGVzIHRoZQorICAgICAgICBpbnB1dCBzeW1ib2wgYXQgd2hpY2ggdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gIFRoZSBzdG9wIHRva2VuIGluZGljYXRlcworICAgICAgICB0aGUgbGFzdCBzeW1ib2wgY29uc3VtZWQgZHVyaW5nIHJlY292ZXJ5LgorCisgICAgICAgIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGlucHV0IHN0cmVhbSBzbyB0aGF0IHRoZSBlcnJvbmVvdXMgdGV4dCBjYW4KKyAgICAgICAgYmUgcGFja2FnZWQgdXAgaW4gdGhlIGVycm9yIG5vZGUuICBUaGUgZXhjZXB0aW9uIGNvdWxkIGJlIHVzZWZ1bAorICAgICAgICB0byBzb21lIGFwcGxpY2F0aW9uczsgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgcHRyIHRvIGl0IGluCisgICAgICAgIHRoZSBDb21tb25FcnJvck5vZGUuCisKKyAgICAgICAgVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGR1cmluZyB0b2tlbiBwYXJzaW5nLCBub3QgdHJlZSBwYXJzaW5nLgorICAgICAgICBUcmVlIHBhcnNpbmcgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gcGFyc2luZyBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24KKyAgICAgICAgc3VjY2VlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgaXNOaWwoc2VsZiwgdHJlZSk6CisgICAgICAgICIiIklzIHRyZWUgY29uc2lkZXJlZCBhIG5pbCBub2RlIHVzZWQgdG8gbWFrZSBsaXN0cyBvZiBjaGlsZCBub2Rlcz8iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBhZGRDaGlsZChzZWxmLCB0LCBjaGlsZCk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgYSBjaGlsZCB0byB0aGUgdHJlZSB0LiAgSWYgY2hpbGQgaXMgYSBmbGF0IHRyZWUgKGEgbGlzdCksIG1ha2UgYWxsCisgICAgICAgIGluIGxpc3QgY2hpbGRyZW4gb2YgdC4gIFdhcm5pbmc6IGlmIHQgaGFzIG5vIGNoaWxkcmVuLCBidXQgY2hpbGQgZG9lcworICAgICAgICBhbmQgY2hpbGQgaXNOaWwgdGhlbiB5b3UgY2FuIGRlY2lkZSBpdCBpcyBvayB0byBtb3ZlIGNoaWxkcmVuIHRvIHQgdmlhCisgICAgICAgIHQuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjsgaS5lLiwgd2l0aG91dCBjb3B5aW5nIHRoZSBhcnJheS4gIEp1c3QKKyAgICAgICAgbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggaGF2ZSB0aGUgdXNlciB3aWxsIGJ1aWxkCisgICAgICAgIEFTVHMuIERvIG5vdGhpbmcgaWYgdCBvciBjaGlsZCBpcyBudWxsLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBiZWNvbWVSb290KHNlbGYsIG5ld1Jvb3QsIG9sZFJvb3QpOgorICAgICAgICAiIiIKKyAgICAgICAgSWYgb2xkUm9vdCBpcyBhIG5pbCByb290LCBqdXN0IGNvcHkgb3IgbW92ZSB0aGUgY2hpbGRyZW4gdG8gbmV3Um9vdC4KKyAgICAgICAgSWYgbm90IGEgbmlsIHJvb3QsIG1ha2Ugb2xkUm9vdCBhIGNoaWxkIG9mIG5ld1Jvb3QuCisKKyAgICAgICAgICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAgICAgICAgICAgb2xkPV4oYSBiIGMpLCBuZXc9ciB5aWVsZHMgXihyIF4oYSBiIGMpKQorCisgICAgICAgIElmIG5ld1Jvb3QgaXMgYSBuaWwtcm9vdGVkIHNpbmdsZSBjaGlsZCB0cmVlLCB1c2UgdGhlIHNpbmdsZQorICAgICAgICBjaGlsZCBhcyB0aGUgbmV3IHJvb3Qgbm9kZS4KKworICAgICAgICAgICBvbGQ9XihuaWwgYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBhIGIgYykKKyAgICAgICAgICAgb2xkPV4oYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBeKGEgYiBjKSkKKworICAgICAgICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKworICAgICAgICAgICBvbGQ9bnVsbCwgbmV3PXIgeWllbGRzIHIKKyAgICAgICAgICAgb2xkPW51bGwsIG5ldz1eKG5pbCByKSB5aWVsZHMgXihuaWwgcikKKworICAgICAgICBSZXR1cm4gbmV3Um9vdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBuZXdSb290IGlzIG5vdCBhCisgICAgICAgIHNpbXBsZSBub2RlIG9yIG5pbCByb290IHdpdGggYSBzaW5nbGUgY2hpbGQgbm9kZS0taXQgbXVzdCBiZSBhIHJvb3QKKyAgICAgICAgbm9kZS4gIElmIG5ld1Jvb3QgaXMgXihuaWwgeCkgcmV0dXJuIHggYXMgbmV3Um9vdC4KKworICAgICAgICBCZSBhZHZpc2VkIHRoYXQgaXQncyBvayBmb3IgbmV3Um9vdCB0byBwb2ludCBhdCBvbGRSb290J3MKKyAgICAgICAgY2hpbGRyZW47IGkuZS4sIHlvdSBkb24ndCBoYXZlIHRvIGNvcHkgdGhlIGxpc3QuICBXZSBhcmUKKyAgICAgICAgY29uc3RydWN0aW5nIHRoZXNlIG5vZGVzIHNvIHdlIHNob3VsZCBoYXZlIHRoaXMgY29udHJvbCBmb3IKKyAgICAgICAgZWZmaWNpZW5jeS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgcnVsZVBvc3RQcm9jZXNzaW5nKHNlbGYsIHJvb3QpOgorICAgICAgICAiIiIKKyAgICAgICAgR2l2ZW4gdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUgY3JlYXRlZCBmb3IgdGhpcyBydWxlLCBwb3N0IHByb2Nlc3MKKyAgICAgICAgaXQgdG8gZG8gYW55IHNpbXBsaWZpY2F0aW9ucyBvciB3aGF0ZXZlciB5b3Ugd2FudC4gIEEgcmVxdWlyZWQKKyAgICAgICAgYmVoYXZpb3IgaXMgdG8gY29udmVydCBeKG5pbCBzaW5nbGVTdWJ0cmVlKSB0byBzaW5nbGVTdWJ0cmVlCisgICAgICAgIGFzIHRoZSBzZXR0aW5nIG9mIHN0YXJ0L3N0b3AgaW5kZXhlcyByZWxpZXMgb24gYSBzaW5nbGUgbm9uLW5pbCByb290CisgICAgICAgIGZvciBub24tZmxhdCB0cmVlcy4KKworICAgICAgICBGbGF0IHRyZWVzIHN1Y2ggYXMgZm9yIGxpc3RzIGxpa2UgImlkbGlzdCA6IElEKyA7IiBhcmUgbGVmdCBhbG9uZQorICAgICAgICB1bmxlc3MgdGhlcmUgaXMgb25seSBvbmUgSUQuICBGb3IgYSBsaXN0LCB0aGUgc3RhcnQvc3RvcCBpbmRleGVzCisgICAgICAgIGFyZSBzZXQgaW4gdGhlIG5pbCBub2RlLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGV4ZWN1dGVkIGFmdGVyIGFsbCBydWxlIHRyZWUgY29uc3RydWN0aW9uIGFuZCByaWdodAorICAgICAgICBiZWZvcmUgc2V0VG9rZW5Cb3VuZGFyaWVzKCkuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGdldFVuaXF1ZUlEKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJGb3IgaWRlbnRpZnlpbmcgdHJlZXMuCisKKyAgICAgICAgSG93IHRvIGlkZW50aWZ5IG5vZGVzIHNvIHdlIGNhbiBzYXkgImFkZCBub2RlIHRvIGEgcHJpb3Igbm9kZSI/CisgICAgICAgIEV2ZW4gYmVjb21lUm9vdCBpcyBhbiBpc3N1ZS4gIFVzZSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShub2RlKQorICAgICAgICB1c3VhbGx5LgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgICMgUiBlIHcgciBpIHQgZSAgUiB1IGwgZSBzCisKKyAgICBkZWYgY3JlYXRlRnJvbVRva2VuKHNlbGYsIHRva2VuVHlwZSwgZnJvbVRva2VuLCB0ZXh0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgbmV3IG5vZGUgZGVyaXZlZCBmcm9tIGEgdG9rZW4sIHdpdGggYSBuZXcgdG9rZW4gdHlwZSBhbmQKKyAgICAgICAgKG9wdGlvbmFsbHkpIG5ldyB0ZXh0LgorCisgICAgICAgIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAgICAgICAgcmV3cml0ZSBydWxlIGFzIElNQUdbJHRva2VuTGFiZWxdIG9yIElNQUdbJHRva2VuTGFiZWwgIklNQUciXS4KKworICAgICAgICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oVG9rZW4pLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBjcmVhdGVGcm9tVHlwZShzZWxmLCB0b2tlblR5cGUsIHRleHQpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgbm9kZSBkZXJpdmVkIGZyb20gYSB0b2tlbiwgd2l0aCBhIG5ldyB0b2tlbiB0eXBlLgorCisgICAgICAgIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdpbmFyeSBub2RlIHJlZiBvbiByaWdodCBzaWRlIG9mIGEKKyAgICAgICAgcmV3cml0ZSBydWxlIGFzIElNQUdbIklNQUciXS4KKworICAgICAgICBUaGlzIHNob3VsZCBpbnZva2UgY3JlYXRlVG9rZW4oaW50LFN0cmluZykuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgIyBDIG8gbiB0IGUgbiB0CisKKyAgICBkZWYgZ2V0VHlwZShzZWxmLCB0KToKKyAgICAgICAgIiIiRm9yIHRyZWUgcGFyc2luZywgSSBuZWVkIHRvIGtub3cgdGhlIHRva2VuIHR5cGUgb2YgYSBub2RlIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgc2V0VHlwZShzZWxmLCB0LCB0eXBlKToKKyAgICAgICAgIiIiTm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdHlwZSBvZiBhIG5vZGUiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUZXh0KHNlbGYsIHQpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgc2V0VGV4dChzZWxmLCB0LCB0ZXh0KToKKyAgICAgICAgIiIiTm9kZSBjb25zdHJ1Y3RvcnMgY2FuIHNldCB0aGUgdGV4dCBvZiBhIG5vZGUiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUb2tlbihzZWxmLCB0KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0b2tlbiBvYmplY3QgZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQuCisKKyAgICAgICAgQ3VycmVudGx5IHVzZWQgb25seSBmb3IgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgVGhlIGVycm9yIGRpc3BsYXkgcm91dGluZSBpbiBCYXNlUmVjb2duaXplciBuZWVkcyB0bworICAgICAgICBkaXNwbGF5IHdoZXJlIHRoZSBpbnB1dCB0aGUgZXJyb3Igb2NjdXJyZWQuIElmIHlvdXIKKyAgICAgICAgdHJlZSBvZiBsaW1pdGF0aW9uIGRvZXMgbm90IHN0b3JlIGluZm9ybWF0aW9uIHRoYXQgY2FuCisgICAgICAgIGxlYWQgeW91IHRvIHRoZSB0b2tlbiwgeW91IGNhbiBjcmVhdGUgYSB0b2tlbiBmaWxsZWQgd2l0aAorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gYW5kIHBhc3MgdGhhdCBiYWNrLiAgU2VlCisgICAgICAgIEJhc2VSZWNvZ25pemVyLmdldEVycm9yTWVzc2FnZSgpLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzZXRUb2tlbkJvdW5kYXJpZXMoc2VsZiwgdCwgc3RhcnRUb2tlbiwgc3RvcFRva2VuKToKKyAgICAgICAgIiIiCisgICAgICAgIFdoZXJlIGFyZSB0aGUgYm91bmRzIGluIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0gZm9yIHRoaXMgbm9kZSBhbmQKKyAgICAgICAgYWxsIGNoaWxkcmVuPyAgRWFjaCBydWxlIHRoYXQgY3JlYXRlcyBBU1Qgbm9kZXMgd2lsbCBjYWxsIHRoaXMKKyAgICAgICAgbWV0aG9kIHJpZ2h0IGJlZm9yZSByZXR1cm5pbmcuICBGbGF0IHRyZWVzIChpLmUuLCBsaXN0cykgd2lsbAorICAgICAgICBzdGlsbCB1c3VhbGx5IGhhdmUgYSBuaWwgcm9vdCBub2RlIGp1c3QgdG8gaG9sZCB0aGUgY2hpbGRyZW4gbGlzdC4KKyAgICAgICAgVGhhdCBub2RlIHdvdWxkIGNvbnRhaW4gdGhlIHN0YXJ0L3N0b3AgaW5kZXhlcyB0aGVuLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUb2tlblN0YXJ0SW5kZXgoc2VsZiwgdCk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgdGhlIHRva2VuIHN0YXJ0IGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4CisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGdldFRva2VuU3RvcEluZGV4KHNlbGYsIHQpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSB0b2tlbiBzdG9wIGluZGV4IGZvciB0aGlzIHN1YnRyZWU7IHJldHVybiAtMSBpZiBubyBzdWNoIGluZGV4CisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgIyBOIGEgdiBpIGcgYSB0IGkgbyBuICAvICBUIHIgZSBlICBQIGEgciBzIGkgbiBnCisKKyAgICBkZWYgZ2V0Q2hpbGQoc2VsZiwgdCwgaSk6CisgICAgICAgICIiIkdldCBhIGNoaWxkIDAuLm4tMSBub2RlIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgc2V0Q2hpbGQoc2VsZiwgdCwgaSwgY2hpbGQpOgorICAgICAgICAiIiJTZXQgaXRoIGNoaWxkICgwLi5uLTEpIHRvIHQ7IHQgbXVzdCBiZSBub24tbnVsbCBhbmQgbm9uLW5pbCBub2RlIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgZGVsZXRlQ2hpbGQoc2VsZiwgdCwgaSk6CisgICAgICAgICIiIlJlbW92ZSBpdGggY2hpbGQgYW5kIHNoaWZ0IGNoaWxkcmVuIGRvd24gZnJvbSByaWdodC4iIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRDaGlsZENvdW50KHNlbGYsIHQpOgorICAgICAgICAiIiJIb3cgbWFueSBjaGlsZHJlbj8gIElmIDAsIHRoZW4gdGhpcyBpcyBhIGxlYWYgbm9kZSIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGdldFBhcmVudChzZWxmLCB0KToKKyAgICAgICAgIiIiCisgICAgICAgIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdC4KKyAgICAgICAgSWYgeW91ciBub2RlIHR5cGUgZG9lc24ndCBoYW5kbGUgdGhpcywgaXQncyBvayBidXQgdGhlIHRyZWUgcmV3cml0ZXMKKyAgICAgICAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzZXRQYXJlbnQoc2VsZiwgdCwgcGFyZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIFdobyBpcyB0aGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlOyBpZiBudWxsLCBpbXBsaWVzIG5vZGUgaXMgcm9vdC4KKyAgICAgICAgSWYgeW91ciBub2RlIHR5cGUgZG9lc24ndCBoYW5kbGUgdGhpcywgaXQncyBvayBidXQgdGhlIHRyZWUgcmV3cml0ZXMKKyAgICAgICAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRDaGlsZEluZGV4KHNlbGYsIHQpOgorICAgICAgICAiIiIKKyAgICAgICAgV2hhdCBpbmRleCBpcyB0aGlzIG5vZGUgaW4gdGhlIGNoaWxkIGxpc3Q/IFJhbmdlOiAwLi5uLTEKKyAgICAgICAgSWYgeW91ciBub2RlIHR5cGUgZG9lc24ndCBoYW5kbGUgdGhpcywgaXQncyBvayBidXQgdGhlIHRyZWUgcmV3cml0ZXMKKyAgICAgICAgaW4gdHJlZSBwYXJzZXJzIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBzZXRDaGlsZEluZGV4KHNlbGYsIHQsIGluZGV4KToKKyAgICAgICAgIiIiCisgICAgICAgIFdoYXQgaW5kZXggaXMgdGhpcyBub2RlIGluIHRoZSBjaGlsZCBsaXN0PyBSYW5nZTogMC4ubi0xCisgICAgICAgIElmIHlvdXIgbm9kZSB0eXBlIGRvZXNuJ3QgaGFuZGxlIHRoaXMsIGl0J3Mgb2sgYnV0IHRoZSB0cmVlIHJld3JpdGVzCisgICAgICAgIGluIHRyZWUgcGFyc2VycyBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgcmVwbGFjZUNoaWxkcmVuKHNlbGYsIHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk6CisgICAgICAgICIiIgorICAgICAgICBSZXBsYWNlIGZyb20gc3RhcnQgdG8gc3RvcCBjaGlsZCBpbmRleCBvZiBwYXJlbnQgd2l0aCB0LCB3aGljaCBtaWdodAorICAgICAgICBiZSBhIGxpc3QuICBOdW1iZXIgb2YgY2hpbGRyZW4gbWF5IGJlIGRpZmZlcmVudAorICAgICAgICBhZnRlciB0aGlzIGNhbGwuCisKKyAgICAgICAgSWYgcGFyZW50IGlzIG51bGwsIGRvbid0IGRvIGFueXRoaW5nOyBtdXN0IGJlIGF0IHJvb3Qgb2Ygb3ZlcmFsbCB0cmVlLgorICAgICAgICBDYW4ndCByZXBsYWNlIHdoYXRldmVyIHBvaW50cyB0byB0aGUgcGFyZW50IGV4dGVybmFsbHkuICBEbyBub3RoaW5nLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgICMgTWlzYworCisgICAgZGVmIGNyZWF0ZShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZXByZWNhdGVkLCB1c2UgY3JlYXRlV2l0aFBheWxvYWQsIGNyZWF0ZUZyb21Ub2tlbiBvciBjcmVhdGVGcm9tVHlwZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyB0byBtaW1pYyB0aGUgSmF2YSBpbnRlcmZhY2Ugb2YgVHJlZUFkYXB0b3IuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDEgYW5kIGlzaW5zdGFuY2UoYXJnc1swXSwgVG9rZW4pOgorICAgICAgICAgICAgIyBPYmplY3QgY3JlYXRlKFRva2VuIHBheWxvYWQpOworIyMgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyMjICAgICAgICAgICAgICAgICAiVXNpbmcgY3JlYXRlKCkgaXMgZGVwcmVjYXRlZCwgdXNlIGNyZWF0ZVdpdGhQYXlsb2FkKCkiLAorIyMgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyMjICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIKKyMjICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVXaXRoUGF5bG9hZChhcmdzWzBdKQorCisgICAgICAgIGlmIChsZW4oYXJncykgPT0gMgorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoYXJnc1swXSwgKGludCwgbG9uZykpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShhcmdzWzFdLCBUb2tlbikKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAjIE9iamVjdCBjcmVhdGUoaW50IHRva2VuVHlwZSwgVG9rZW4gZnJvbVRva2VuKTsKKyMjICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisjIyAgICAgICAgICAgICAgICAgIlVzaW5nIGNyZWF0ZSgpIGlzIGRlcHJlY2F0ZWQsIHVzZSBjcmVhdGVGcm9tVG9rZW4oKSIsCisjIyAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorIyMgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MgorIyMgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZUZyb21Ub2tlbihhcmdzWzBdLCBhcmdzWzFdKQorCisgICAgICAgIGlmIChsZW4oYXJncykgPT0gMworICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoYXJnc1swXSwgKGludCwgbG9uZykpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShhcmdzWzFdLCBUb2tlbikKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGFyZ3NbMl0sIGJhc2VzdHJpbmcpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgIyBPYmplY3QgY3JlYXRlKGludCB0b2tlblR5cGUsIFRva2VuIGZyb21Ub2tlbiwgU3RyaW5nIHRleHQpOworIyMgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyMjICAgICAgICAgICAgICAgICAiVXNpbmcgY3JlYXRlKCkgaXMgZGVwcmVjYXRlZCwgdXNlIGNyZWF0ZUZyb21Ub2tlbigpIiwKKyMjICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisjIyAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yCisjIyAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlRnJvbVRva2VuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pCisKKyAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAyCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShhcmdzWzBdLCAoaW50LCBsb25nKSkKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGFyZ3NbMV0sIGJhc2VzdHJpbmcpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgIyBPYmplY3QgY3JlYXRlKGludCB0b2tlblR5cGUsIFN0cmluZyB0ZXh0KTsKKyMjICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisjIyAgICAgICAgICAgICAgICAgIlVzaW5nIGNyZWF0ZSgpIGlzIGRlcHJlY2F0ZWQsIHVzZSBjcmVhdGVGcm9tVHlwZSgpIiwKKyMjICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisjIyAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yCisjIyAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlRnJvbVR5cGUoYXJnc1swXSwgYXJnc1sxXSkKKworICAgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgICAiTm8gY3JlYXRlIG1ldGhvZCB3aXRoIHRoaXMgc2lnbmF0dXJlIGZvdW5kOiAlcyIKKyAgICAgICAgICAgICUgKCcsICcuam9pbih0eXBlKHYpLl9fbmFtZV9fIGZvciB2IGluIGFyZ3MpKQorICAgICAgICAgICAgKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBUcmVlIGFuZCBUcmVlQWRhcHRvcgorIworIyBUcmVlCisjIFwtIEJhc2VUcmVlCisjCisjIFRyZWVBZGFwdG9yCisjIFwtIEJhc2VUcmVlQWRhcHRvcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2NsYXNzIEJhc2VUcmVlKFRyZWUpOgorICAgICIiIgorICAgIEBicmllZiBBIGdlbmVyaWMgdHJlZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG5vIHBheWxvYWQuCisKKyAgICBZb3UgbXVzdCBzdWJjbGFzcyB0bworICAgIGFjdHVhbGx5IGhhdmUgYW55IHVzZXIgZGF0YS4gIEFOVExSIHYzIHVzZXMgYSBsaXN0IG9mIGNoaWxkcmVuIGFwcHJvYWNoCisgICAgaW5zdGVhZCBvZiB0aGUgY2hpbGQtc2libGluZyBhcHByb2FjaCBpbiB2Mi4gIEEgZmxhdCB0cmVlIChhIGxpc3QpIGlzCisgICAgYW4gZW1wdHkgbm9kZSB3aG9zZSBjaGlsZHJlbiByZXByZXNlbnQgdGhlIGxpc3QuICBBbiBlbXB0eSwgYnV0CisgICAgbm9uLW51bGwgbm9kZSBpcyBjYWxsZWQgIm5pbCIuCisgICAgIiIiCisKKyAgICAjIEJhc2VUcmVlIGlzIGFic3RyYWN0LCBubyBuZWVkIHRvIGNvbXBsYWluIGFib3V0IG5vdCBpbXBsZW1lbnRlZCBhYnN0cmFjdAorICAgICMgbWV0aG9kcworICAgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1XMDIyMworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSBuZXcgbm9kZSBmcm9tIGFuIGV4aXN0aW5nIG5vZGUgZG9lcyBub3RoaW5nIGZvciBCYXNlVHJlZQorICAgICAgICBhcyB0aGVyZSBhcmUgbm8gZmllbGRzIG90aGVyIHRoYW4gdGhlIGNoaWxkcmVuIGxpc3QsIHdoaWNoIGNhbm5vdAorICAgICAgICBiZSBjb3BpZWQgYXMgdGhlIGNoaWxkcmVuIGFyZSBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoaXMgbm9kZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgVHJlZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisgICAgICAgIHNlbGYuY2hpbGRJbmRleCA9IDAKKworCisgICAgZGVmIGdldENoaWxkKHNlbGYsIGkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlbltpXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgIiIiQGJyaWVmIEdldCB0aGUgY2hpbGRyZW4gaW50ZXJuYWwgTGlzdAorCisgICAgICAgIE5vdGUgdGhhdCBpZiB5b3UgZGlyZWN0bHkgbWVzcyB3aXRoCisgICAgICAgIHRoZSBsaXN0LCBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICAgICAgICAiIiIKKworICAgICAgICAjIEZJWE1FOiBtYXJrIGFzIGRlcHJlY2F0ZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGRyZW4KKworCisgICAgZGVmIGdldEZpcnN0Q2hpbGRXaXRoVHlwZShzZWxmLCB0cmVlVHlwZSk6CisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgaWYgY2hpbGQuZ2V0VHlwZSgpID09IHRyZWVUeXBlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZAorCisgICAgICAgIHJldHVybiBOb25lCisKKworICAgIGRlZiBnZXRDaGlsZENvdW50KHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuY2hpbGRyZW4pCisKKworICAgIGRlZiBhZGRDaGlsZChzZWxmLCBjaGlsZFRyZWUpOgorICAgICAgICAiIiJBZGQgdCBhcyBjaGlsZCBvZiB0aGlzIG5vZGUuCisKKyAgICAgICAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgICAgICAgIGFuZCBjaGlsZCBpc05pbCB0aGVuIHRoaXMgcm91dGluZSBtb3ZlcyBjaGlsZHJlbiB0byB0IHZpYQorICAgICAgICB0LmNoaWxkcmVuID0gY2hpbGQuY2hpbGRyZW47IGkuZS4sIHdpdGhvdXQgY29weWluZyB0aGUgYXJyYXkuCisgICAgICAgICIiIgorCisgICAgICAgICMgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBtdWNoIHNpbXBsZXIgYW5kIHByb2JhYmx5IGxlc3MgZWZmaWNpZW50CisgICAgICAgICMgdGhhbiB0aGUgbXVtYm8tanVtYm8gdGhhdCBUZXIgZGlkIGZvciB0aGUgSmF2YSBydW50aW1lLgorCisgICAgICAgIGlmIGNoaWxkVHJlZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgY2hpbGRUcmVlLmlzTmlsKCk6CisgICAgICAgICAgICAjIHQgaXMgYW4gZW1wdHkgbm9kZSBwb3NzaWJseSB3aXRoIGNoaWxkcmVuCisKKyAgICAgICAgICAgIGlmIHNlbGYuY2hpbGRyZW4gaXMgY2hpbGRUcmVlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImF0dGVtcHQgdG8gYWRkIGNoaWxkIGxpc3QgdG8gaXRzZWxmIikKKworICAgICAgICAgICAgIyBmaXggcGFyZW50IHBvaW50ZXIgYW5kIGNoaWxkSW5kZXggZm9yIG5ldyBjaGlsZHJlbgorICAgICAgICAgICAgZm9yIGlkeCwgY2hpbGQgaW4gZW51bWVyYXRlKGNoaWxkVHJlZS5jaGlsZHJlbik6CisgICAgICAgICAgICAgICAgY2hpbGQucGFyZW50ID0gc2VsZgorICAgICAgICAgICAgICAgIGNoaWxkLmNoaWxkSW5kZXggPSBsZW4oc2VsZi5jaGlsZHJlbikgKyBpZHgKKworICAgICAgICAgICAgc2VsZi5jaGlsZHJlbiArPSBjaGlsZFRyZWUuY2hpbGRyZW4KKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBjaGlsZCBpcyBub3QgbmlsIChkb24ndCBjYXJlIGFib3V0IGNoaWxkcmVuKQorICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoY2hpbGRUcmVlKQorICAgICAgICAgICAgY2hpbGRUcmVlLnBhcmVudCA9IHNlbGYKKyAgICAgICAgICAgIGNoaWxkVHJlZS5jaGlsZEluZGV4ID0gbGVuKHNlbGYuY2hpbGRyZW4pIC0gMQorCisKKyAgICBkZWYgYWRkQ2hpbGRyZW4oc2VsZiwgY2hpbGRyZW4pOgorICAgICAgICAiIiJBZGQgYWxsIGVsZW1lbnRzIG9mIGtpZHMgbGlzdCBhcyBjaGlsZHJlbiBvZiB0aGlzIG5vZGUiIiIKKworICAgICAgICBzZWxmLmNoaWxkcmVuICs9IGNoaWxkcmVuCisKKworICAgIGRlZiBzZXRDaGlsZChzZWxmLCBpLCB0KToKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgdC5pc05pbCgpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2FuJ3Qgc2V0IHNpbmdsZSBjaGlsZCB0byBhIGxpc3QiKQorCisgICAgICAgIHNlbGYuY2hpbGRyZW5baV0gPSB0CisgICAgICAgIHQucGFyZW50ID0gc2VsZgorICAgICAgICB0LmNoaWxkSW5kZXggPSBpCisKKworICAgIGRlZiBkZWxldGVDaGlsZChzZWxmLCBpKToKKyAgICAgICAga2lsbGVkID0gc2VsZi5jaGlsZHJlbltpXQorCisgICAgICAgIGRlbCBzZWxmLmNoaWxkcmVuW2ldCisKKyAgICAgICAgIyB3YWxrIHJlc3QgYW5kIGRlY3JlbWVudCB0aGVpciBjaGlsZCBpbmRleGVzCisgICAgICAgIGZvciBpZHgsIGNoaWxkIGluIGVudW1lcmF0ZShzZWxmLmNoaWxkcmVuW2k6XSk6CisgICAgICAgICAgICBjaGlsZC5jaGlsZEluZGV4ID0gaSArIGlkeAorCisgICAgICAgIHJldHVybiBraWxsZWQKKworCisgICAgZGVmIHJlcGxhY2VDaGlsZHJlbihzZWxmLCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCBuZXdUcmVlKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGV0ZSBjaGlsZHJlbiBmcm9tIHN0YXJ0IHRvIHN0b3AgYW5kIHJlcGxhY2Ugd2l0aCB0IGV2ZW4gaWYgdCBpcworICAgICAgICBhIGxpc3QgKG5pbC1yb290IHRyZWUpLiAgbnVtIG9mIGNoaWxkcmVuIGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZS4KKyAgICAgICAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCisgICAgICAgIGNoaWxkcmVuIHRvIHNldCB0aGVpciBjaGlsZGluZGV4OyBjb3VsZCBiZSBzbG93LgorICAgICAgICAiIiIKKworICAgICAgICBpZiAoc3RhcnRDaGlsZEluZGV4ID49IGxlbihzZWxmLmNoaWxkcmVuKQorICAgICAgICAgICAgb3Igc3RvcENoaWxkSW5kZXggPj0gbGVuKHNlbGYuY2hpbGRyZW4pCisgICAgICAgICAgICApOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcigiaW5kZXhlcyBpbnZhbGlkIikKKworICAgICAgICByZXBsYWNpbmdIb3dNYW55ID0gc3RvcENoaWxkSW5kZXggLSBzdGFydENoaWxkSW5kZXggKyAxCisKKyAgICAgICAgIyBub3JtYWxpemUgdG8gYSBsaXN0IG9mIGNoaWxkcmVuIHRvIGFkZDogbmV3Q2hpbGRyZW4KKyAgICAgICAgaWYgbmV3VHJlZS5pc05pbCgpOgorICAgICAgICAgICAgbmV3Q2hpbGRyZW4gPSBuZXdUcmVlLmNoaWxkcmVuCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuID0gW25ld1RyZWVdCisKKyAgICAgICAgcmVwbGFjaW5nV2l0aEhvd01hbnkgPSBsZW4obmV3Q2hpbGRyZW4pCisgICAgICAgIGRlbHRhID0gcmVwbGFjaW5nSG93TWFueSAtIHJlcGxhY2luZ1dpdGhIb3dNYW55CisKKworICAgICAgICBpZiBkZWx0YSA9PSAwOgorICAgICAgICAgICAgIyBpZiBzYW1lIG51bWJlciBvZiBub2RlcywgZG8gZGlyZWN0IHJlcGxhY2UKKyAgICAgICAgICAgIGZvciBpZHgsIGNoaWxkIGluIGVudW1lcmF0ZShuZXdDaGlsZHJlbik6CisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltpZHggKyBzdGFydENoaWxkSW5kZXhdID0gY2hpbGQKKyAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBzZWxmCisgICAgICAgICAgICAgICAgY2hpbGQuY2hpbGRJbmRleCA9IGlkeCArIHN0YXJ0Q2hpbGRJbmRleAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGxlbmd0aCBvZiBjaGlsZHJlbiBjaGFuZ2VzLi4uCisKKyAgICAgICAgICAgICMgLi4uZGVsZXRlIHJlcGxhY2VkIHNlZ21lbnQuLi4KKyAgICAgICAgICAgIGRlbCBzZWxmLmNoaWxkcmVuW3N0YXJ0Q2hpbGRJbmRleDpzdG9wQ2hpbGRJbmRleCsxXQorCisgICAgICAgICAgICAjIC4uLmluc2VydCBuZXcgc2VnbWVudC4uLgorICAgICAgICAgICAgc2VsZi5jaGlsZHJlbltzdGFydENoaWxkSW5kZXg6c3RhcnRDaGlsZEluZGV4XSA9IG5ld0NoaWxkcmVuCisKKyAgICAgICAgICAgICMgLi4uYW5kIGZpeCBpbmRlY2VzCisgICAgICAgICAgICBzZWxmLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoc3RhcnRDaGlsZEluZGV4KQorCisKKyAgICBkZWYgaXNOaWwoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisKKyAgICBkZWYgZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhzZWxmLCBvZmZzZXQ9MCk6CisgICAgICAgIGZvciBpZHgsIGNoaWxkIGluIGVudW1lcmF0ZShzZWxmLmNoaWxkcmVuW29mZnNldDpdKToKKyAgICAgICAgICAgIGNoaWxkLmNoaWxkSW5kZXggPSBpZHggKyBvZmZzZXQKKyAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IHNlbGYKKworCisgICAgZGVmIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKHNlbGYsIHBhcmVudD1Ob25lLCBpPS0xKToKKyAgICAgICAgaWYgcGFyZW50ICE9IHNlbGYucGFyZW50OgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAicGFyZW50cyBkb24ndCBtYXRjaDsgZXhwZWN0ZWQgJXIgZm91bmQgJXIiCisgICAgICAgICAgICAgICAgJSAocGFyZW50LCBzZWxmLnBhcmVudCkKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgaWYgaSAhPSBzZWxmLmNoaWxkSW5kZXg6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJjaGlsZCBpbmRleGVzIGRvbid0IG1hdGNoOyBleHBlY3RlZCAlZCBmb3VuZCAlZCIKKyAgICAgICAgICAgICAgICAlIChpLCBzZWxmLmNoaWxkSW5kZXgpCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGZvciBpZHgsIGNoaWxkIGluIGVudW1lcmF0ZShzZWxmLmNoaWxkcmVuKToKKyAgICAgICAgICAgIGNoaWxkLnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKHNlbGYsIGlkeCkKKworCisgICAgZGVmIGdldENoaWxkSW5kZXgoc2VsZik6CisgICAgICAgICIiIkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy4iIiIKKworICAgICAgICByZXR1cm4gMAorCisKKyAgICBkZWYgc2V0Q2hpbGRJbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgY2hpbGQgaW5kZXhlcy4iIiIKKworICAgICAgICBwYXNzCisKKworICAgIGRlZiBnZXRQYXJlbnQoc2VsZik6CisgICAgICAgICIiIkJhc2VUcmVlIGRvZXNuJ3QgdHJhY2sgcGFyZW50IHBvaW50ZXJzLiIiIgorCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2V0UGFyZW50KHNlbGYsIHQpOgorICAgICAgICAiIiJCYXNlVHJlZSBkb2Vzbid0IHRyYWNrIHBhcmVudCBwb2ludGVycy4iIiIKKworICAgICAgICBwYXNzCisKKworICAgIGRlZiBoYXNBbmNlc3RvcihzZWxmLCB0dHlwZSk6CisgICAgICAgICIiIldhbGsgdXB3YXJkcyBsb29raW5nIGZvciBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0QW5jZXN0b3IodHR5cGUpIGlzIG5vdCBOb25lCisKKyAgICBkZWYgZ2V0QW5jZXN0b3Ioc2VsZiwgdHR5cGUpOgorICAgICAgICAiIiJXYWxrIHVwd2FyZHMgYW5kIGdldCBmaXJzdCBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS4iIiIKKyAgICAgICAgdCA9IHNlbGYuZ2V0UGFyZW50KCkKKyAgICAgICAgd2hpbGUgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHQuZ2V0VHlwZSgpID09IHR0eXBlOgorICAgICAgICAgICAgICAgIHJldHVybiB0CisgICAgICAgICAgICB0ID0gdC5nZXRQYXJlbnQoKQorCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZ2V0QW5jZXN0b3JzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLgorCisgICAgICAgIFRoZSBmaXJzdCBub2RlIG9mIGxpc3QgaXMgdGhlIHJvb3QgYW5kIHRoZSBsYXN0IGlzIHRoZSBwYXJlbnQgb2YKKyAgICAgICAgdGhpcyBub2RlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZmdldFBhcmVudCgpIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGFuY2VzdG9ycyA9IFtdCisgICAgICAgIHQgPSBzZWxmLmdldFBhcmVudCgpCisgICAgICAgIHdoaWxlIHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhbmNlc3RvcnMuaW5zZXJ0KDAsIHQpICMgaW5zZXJ0IGF0IHN0YXJ0CisgICAgICAgICAgICB0ID0gdC5nZXRQYXJlbnQoKQorCisgICAgICAgIHJldHVybiBhbmNlc3RvcnMKKworCisgICAgZGVmIHRvU3RyaW5nVHJlZShzZWxmKToKKyAgICAgICAgIiIiUHJpbnQgb3V0IGEgd2hvbGUgdHJlZSBub3QganVzdCBhIG5vZGUiIiIKKworICAgICAgICBpZiBsZW4oc2VsZi5jaGlsZHJlbikgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRvU3RyaW5nKCkKKworICAgICAgICBidWYgPSBbXQorICAgICAgICBpZiBub3Qgc2VsZi5pc05pbCgpOgorICAgICAgICAgICAgYnVmLmFwcGVuZCgnKCcpCisgICAgICAgICAgICBidWYuYXBwZW5kKHNlbGYudG9TdHJpbmcoKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKQorCisgICAgICAgIGZvciBpLCBjaGlsZCBpbiBlbnVtZXJhdGUoc2VsZi5jaGlsZHJlbik6CisgICAgICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcgJykKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2hpbGQudG9TdHJpbmdUcmVlKCkpCisKKyAgICAgICAgaWYgbm90IHNlbGYuaXNOaWwoKToKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyknKQorCisgICAgICAgIHJldHVybiAnJy5qb2luKGJ1ZikKKworCisgICAgZGVmIGdldExpbmUoc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKworICAgIGRlZiBnZXRDaGFyUG9zaXRpb25JbkxpbmUoc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgdG8gc2F5IGhvdyBhIG5vZGUgKG5vdCBhIHRyZWUpIHNob3VsZCBsb29rIGFzIHRleHQiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworCitjbGFzcyBCYXNlVHJlZUFkYXB0b3IoVHJlZUFkYXB0b3IpOgorICAgICIiIgorICAgIEBicmllZiBBIFRyZWVBZGFwdG9yIHRoYXQgd29ya3Mgd2l0aCBhbnkgVHJlZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAiIiIKKworICAgICMgQmFzZVRyZWVBZGFwdG9yIGlzIGFic3RyYWN0LCBubyBuZWVkIHRvIGNvbXBsYWluIGFib3V0IG5vdCBpbXBsZW1lbnRlZAorICAgICMgYWJzdHJhY3QgbWV0aG9kcworICAgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1XMDIyMworCisgICAgZGVmIG5pbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlV2l0aFBheWxvYWQoTm9uZSkKKworCisgICAgZGVmIGVycm9yTm9kZShzZWxmLCBpbnB1dCwgc3RhcnQsIHN0b3AsIGV4Yyk6CisgICAgICAgICIiIgorICAgICAgICBjcmVhdGUgdHJlZSBub2RlIHRoYXQgaG9sZHMgdGhlIHN0YXJ0IGFuZCBzdG9wIHRva2VucyBhc3NvY2lhdGVkCisgICAgICAgIHdpdGggYW4gZXJyb3IuCisKKyAgICAgICAgSWYgeW91IHNwZWNpZnkgeW91ciBvd24ga2luZCBvZiB0cmVlIG5vZGVzLCB5b3Ugd2lsbCBsaWtlbHkgaGF2ZSB0bworICAgICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZC4gQ29tbW9uVHJlZSByZXR1cm5zIFRva2VuLklOVkFMSURfVE9LRU5fVFlQRQorICAgICAgICBpZiBubyB0b2tlbiBwYXlsb2FkIGJ1dCB5b3UgbWlnaHQgaGF2ZSB0byBzZXQgdG9rZW4gdHlwZSBmb3IgZGlmZgorICAgICAgICBub2RlIHR5cGUuCisKKyAgICAgICAgWW91IGRvbid0IGhhdmUgdG8gc3ViY2xhc3MgQ29tbW9uRXJyb3JOb2RlOyB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0bworICAgICAgICBzdWJjbGFzcyB5b3VyIG93biB0cmVlIG5vZGUgY2xhc3MgdG8gYXZvaWQgY2xhc3MgY2FzdCBleGNlcHRpb24uCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBDb21tb25FcnJvck5vZGUoaW5wdXQsIHN0YXJ0LCBzdG9wLCBleGMpCisKKworICAgIGRlZiBpc05pbChzZWxmLCB0cmVlKToKKyAgICAgICAgcmV0dXJuIHRyZWUuaXNOaWwoKQorCisKKyAgICBkZWYgZHVwVHJlZShzZWxmLCB0LCBwYXJlbnQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBUaGlzIGlzIGdlbmVyaWMgaW4gdGhlIHNlbnNlIHRoYXQgaXQgd2lsbCB3b3JrIHdpdGggYW55IGtpbmQgb2YKKyAgICAgICAgdHJlZSAobm90IGp1c3QgVHJlZSBpbnRlcmZhY2UpLiAgSXQgaW52b2tlcyB0aGUgYWRhcHRvciByb3V0aW5lcworICAgICAgICBub3QgdGhlIHRyZWUgbm9kZSByb3V0aW5lcyB0byBkbyB0aGUgY29uc3RydWN0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIG5ld1RyZWUgPSBzZWxmLmR1cE5vZGUodCkKKworICAgICAgICAjIGVuc3VyZSBuZXcgc3VidHJlZSByb290IGhhcyBwYXJlbnQvY2hpbGQgaW5kZXggc2V0CisKKyAgICAgICAgIyBzYW1lIGluZGV4IGluIG5ldyB0cmVlCisgICAgICAgIHNlbGYuc2V0Q2hpbGRJbmRleChuZXdUcmVlLCBzZWxmLmdldENoaWxkSW5kZXgodCkpCisKKyAgICAgICAgc2VsZi5zZXRQYXJlbnQobmV3VHJlZSwgcGFyZW50KQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuZ2V0Q2hpbGRDb3VudCh0KSk6CisgICAgICAgICAgICBjaGlsZCA9IHNlbGYuZ2V0Q2hpbGQodCwgaSkKKyAgICAgICAgICAgIG5ld1N1YlRyZWUgPSBzZWxmLmR1cFRyZWUoY2hpbGQsIHQpCisgICAgICAgICAgICBzZWxmLmFkZENoaWxkKG5ld1RyZWUsIG5ld1N1YlRyZWUpCisKKyAgICAgICAgcmV0dXJuIG5ld1RyZWUKKworCisgICAgZGVmIGFkZENoaWxkKHNlbGYsIHRyZWUsIGNoaWxkKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCBhIGNoaWxkIHRvIHRoZSB0cmVlIHQuICBJZiBjaGlsZCBpcyBhIGZsYXQgdHJlZSAoYSBsaXN0KSwgbWFrZSBhbGwKKyAgICAgICAgaW4gbGlzdCBjaGlsZHJlbiBvZiB0LiAgV2FybmluZzogaWYgdCBoYXMgbm8gY2hpbGRyZW4sIGJ1dCBjaGlsZCBkb2VzCisgICAgICAgIGFuZCBjaGlsZCBpc05pbCB0aGVuIHlvdSBjYW4gZGVjaWRlIGl0IGlzIG9rIHRvIG1vdmUgY2hpbGRyZW4gdG8gdCB2aWEKKyAgICAgICAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LiAgSnVzdAorICAgICAgICBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBoYXZlIHRoZSB1c2VyIHdpbGwgYnVpbGQKKyAgICAgICAgQVNUcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgI2lmIGlzaW5zdGFuY2UoY2hpbGQsIFRva2VuKToKKyAgICAgICAgIyAgICBjaGlsZCA9IHNlbGYuY3JlYXRlV2l0aFBheWxvYWQoY2hpbGQpCisKKyAgICAgICAgaWYgdHJlZSBpcyBub3QgTm9uZSBhbmQgY2hpbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cmVlLmFkZENoaWxkKGNoaWxkKQorCisKKyAgICBkZWYgYmVjb21lUm9vdChzZWxmLCBuZXdSb290LCBvbGRSb290KToKKyAgICAgICAgIiIiCisgICAgICAgIElmIG9sZFJvb3QgaXMgYSBuaWwgcm9vdCwganVzdCBjb3B5IG9yIG1vdmUgdGhlIGNoaWxkcmVuIHRvIG5ld1Jvb3QuCisgICAgICAgIElmIG5vdCBhIG5pbCByb290LCBtYWtlIG9sZFJvb3QgYSBjaGlsZCBvZiBuZXdSb290LgorCisgICAgICAgICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PXIgeWllbGRzIF4ociBhIGIgYykKKyAgICAgICAgICBvbGQ9XihhIGIgYyksIG5ldz1yIHlpZWxkcyBeKHIgXihhIGIgYykpCisKKyAgICAgICAgSWYgbmV3Um9vdCBpcyBhIG5pbC1yb290ZWQgc2luZ2xlIGNoaWxkIHRyZWUsIHVzZSB0aGUgc2luZ2xlCisgICAgICAgIGNoaWxkIGFzIHRoZSBuZXcgcm9vdCBub2RlLgorCisgICAgICAgICAgb2xkPV4obmlsIGEgYiBjKSwgbmV3PV4obmlsIHIpIHlpZWxkcyBeKHIgYSBiIGMpCisgICAgICAgICAgb2xkPV4oYSBiIGMpLCBuZXc9XihuaWwgcikgeWllbGRzIF4ociBeKGEgYiBjKSkKKworICAgICAgICBJZiBvbGRSb290IHdhcyBudWxsLCBpdCdzIG9rLCBqdXN0IHJldHVybiBuZXdSb290IChldmVuIGlmIGlzTmlsKS4KKworICAgICAgICAgIG9sZD1udWxsLCBuZXc9ciB5aWVsZHMgcgorICAgICAgICAgIG9sZD1udWxsLCBuZXc9XihuaWwgcikgeWllbGRzIF4obmlsIHIpCisKKyAgICAgICAgUmV0dXJuIG5ld1Jvb3QuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgbmV3Um9vdCBpcyBub3QgYQorICAgICAgICBzaW1wbGUgbm9kZSBvciBuaWwgcm9vdCB3aXRoIGEgc2luZ2xlIGNoaWxkIG5vZGUtLWl0IG11c3QgYmUgYSByb290CisgICAgICAgIG5vZGUuICBJZiBuZXdSb290IGlzIF4obmlsIHgpIHJldHVybiB4IGFzIG5ld1Jvb3QuCisKKyAgICAgICAgQmUgYWR2aXNlZCB0aGF0IGl0J3Mgb2sgZm9yIG5ld1Jvb3QgdG8gcG9pbnQgYXQgb2xkUm9vdCdzCisgICAgICAgIGNoaWxkcmVuOyBpLmUuLCB5b3UgZG9uJ3QgaGF2ZSB0byBjb3B5IHRoZSBsaXN0LiAgV2UgYXJlCisgICAgICAgIGNvbnN0cnVjdGluZyB0aGVzZSBub2RlcyBzbyB3ZSBzaG91bGQgaGF2ZSB0aGlzIGNvbnRyb2wgZm9yCisgICAgICAgIGVmZmljaWVuY3kuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobmV3Um9vdCwgVG9rZW4pOgorICAgICAgICAgICAgbmV3Um9vdCA9IHNlbGYuY3JlYXRlKG5ld1Jvb3QpCisKKyAgICAgICAgaWYgb2xkUm9vdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG5ld1Jvb3QKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuZXdSb290LCBDb21tb25UcmVlKToKKyAgICAgICAgICAgIG5ld1Jvb3QgPSBzZWxmLmNyZWF0ZVdpdGhQYXlsb2FkKG5ld1Jvb3QpCisKKyAgICAgICAgIyBoYW5kbGUgXihuaWwgcmVhbC1ub2RlKQorICAgICAgICBpZiBuZXdSb290LmlzTmlsKCk6CisgICAgICAgICAgICBuYyA9IG5ld1Jvb3QuZ2V0Q2hpbGRDb3VudCgpCisgICAgICAgICAgICBpZiBuYyA9PSAxOgorICAgICAgICAgICAgICAgIG5ld1Jvb3QgPSBuZXdSb290LmdldENoaWxkKDApCisKKyAgICAgICAgICAgIGVsaWYgbmMgPiAxOgorICAgICAgICAgICAgICAgICMgVE9ETzogbWFrZSB0cmVlIHJ1biB0aW1lIGV4Y2VwdGlvbnMgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJtb3JlIHRoYW4gb25lIG5vZGUgYXMgcm9vdCIpCisKKyAgICAgICAgIyBhZGQgb2xkUm9vdCB0byBuZXdSb290OyBhZGRDaGlsZCB0YWtlcyBjYXJlIG9mIGNhc2Ugd2hlcmUgb2xkUm9vdAorICAgICAgICAjIGlzIGEgZmxhdCBsaXN0IChpLmUuLCBuaWwtcm9vdGVkIHRyZWUpLiAgQWxsIGNoaWxkcmVuIG9mIG9sZFJvb3QKKyAgICAgICAgIyBhcmUgYWRkZWQgdG8gbmV3Um9vdC4KKyAgICAgICAgbmV3Um9vdC5hZGRDaGlsZChvbGRSb290KQorICAgICAgICByZXR1cm4gbmV3Um9vdAorCisKKyAgICBkZWYgcnVsZVBvc3RQcm9jZXNzaW5nKHNlbGYsIHJvb3QpOgorICAgICAgICAiIiJUcmFuc2Zvcm0gXihuaWwgeCkgdG8geCBhbmQgbmlsIHRvIG51bGwiIiIKKworICAgICAgICBpZiByb290IGlzIG5vdCBOb25lIGFuZCByb290LmlzTmlsKCk6CisgICAgICAgICAgICBpZiByb290LmdldENoaWxkQ291bnQoKSA9PSAwOgorICAgICAgICAgICAgICAgIHJvb3QgPSBOb25lCisKKyAgICAgICAgICAgIGVsaWYgcm9vdC5nZXRDaGlsZENvdW50KCkgPT0gMToKKyAgICAgICAgICAgICAgICByb290ID0gcm9vdC5nZXRDaGlsZCgwKQorICAgICAgICAgICAgICAgICMgd2hvZXZlciBpbnZva2VzIHJ1bGUgd2lsbCBzZXQgcGFyZW50IGFuZCBjaGlsZCBpbmRleAorICAgICAgICAgICAgICAgIHJvb3Quc2V0UGFyZW50KE5vbmUpCisgICAgICAgICAgICAgICAgcm9vdC5zZXRDaGlsZEluZGV4KC0xKQorCisgICAgICAgIHJldHVybiByb290CisKKworICAgIGRlZiBjcmVhdGVGcm9tVG9rZW4oc2VsZiwgdG9rZW5UeXBlLCBmcm9tVG9rZW4sIHRleHQ9Tm9uZSk6CisgICAgICAgIGlmIGZyb21Ub2tlbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlRnJvbVR5cGUodG9rZW5UeXBlLCB0ZXh0KQorCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRva2VuVHlwZSwgKGludCwgbG9uZykpLCB0eXBlKHRva2VuVHlwZSkuX19uYW1lX18KKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZnJvbVRva2VuLCBUb2tlbiksIHR5cGUoZnJvbVRva2VuKS5fX25hbWVfXworICAgICAgICBhc3NlcnQgdGV4dCBpcyBOb25lIG9yIGlzaW5zdGFuY2UodGV4dCwgYmFzZXN0cmluZyksIHR5cGUodGV4dCkuX19uYW1lX18KKworICAgICAgICBmcm9tVG9rZW4gPSBzZWxmLmNyZWF0ZVRva2VuKGZyb21Ub2tlbikKKyAgICAgICAgZnJvbVRva2VuLnR5cGUgPSB0b2tlblR5cGUKKyAgICAgICAgaWYgdGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb21Ub2tlbi50ZXh0ID0gdGV4dAorICAgICAgICB0ID0gc2VsZi5jcmVhdGVXaXRoUGF5bG9hZChmcm9tVG9rZW4pCisgICAgICAgIHJldHVybiB0CisKKworICAgIGRlZiBjcmVhdGVGcm9tVHlwZShzZWxmLCB0b2tlblR5cGUsIHRleHQpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2tlblR5cGUsIChpbnQsIGxvbmcpKSwgdHlwZSh0b2tlblR5cGUpLl9fbmFtZV9fCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRleHQsIGJhc2VzdHJpbmcpIG9yIHRleHQgaXMgTm9uZSwgdHlwZSh0ZXh0KS5fX25hbWVfXworCisgICAgICAgIGZyb21Ub2tlbiA9IHNlbGYuY3JlYXRlVG9rZW4odG9rZW5UeXBlPXRva2VuVHlwZSwgdGV4dD10ZXh0KQorICAgICAgICB0ID0gc2VsZi5jcmVhdGVXaXRoUGF5bG9hZChmcm9tVG9rZW4pCisgICAgICAgIHJldHVybiB0CisKKworICAgIGRlZiBnZXRUeXBlKHNlbGYsIHQpOgorICAgICAgICByZXR1cm4gdC5nZXRUeXBlKCkKKworCisgICAgZGVmIHNldFR5cGUoc2VsZiwgdCwgdHlwZSk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZG9uJ3Qga25vdyBlbm91Z2ggYWJvdXQgVHJlZSBub2RlIikKKworCisgICAgZGVmIGdldFRleHQoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiB0LmdldFRleHQoKQorCisKKyAgICBkZWYgc2V0VGV4dChzZWxmLCB0LCB0ZXh0KToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJkb24ndCBrbm93IGVub3VnaCBhYm91dCBUcmVlIG5vZGUiKQorCisKKyAgICBkZWYgZ2V0Q2hpbGQoc2VsZiwgdCwgaSk6CisgICAgICAgIHJldHVybiB0LmdldENoaWxkKGkpCisKKworICAgIGRlZiBzZXRDaGlsZChzZWxmLCB0LCBpLCBjaGlsZCk6CisgICAgICAgIHQuc2V0Q2hpbGQoaSwgY2hpbGQpCisKKworICAgIGRlZiBkZWxldGVDaGlsZChzZWxmLCB0LCBpKToKKyAgICAgICAgcmV0dXJuIHQuZGVsZXRlQ2hpbGQoaSkKKworCisgICAgZGVmIGdldENoaWxkQ291bnQoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiB0LmdldENoaWxkQ291bnQoKQorCisKKyAgICBkZWYgZ2V0VW5pcXVlSUQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBoYXNoKG5vZGUpCisKKworICAgIGRlZiBjcmVhdGVUb2tlbihzZWxmLCBmcm9tVG9rZW49Tm9uZSwgdG9rZW5UeXBlPU5vbmUsIHRleHQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBUZWxsIG1lIGhvdyB0byBjcmVhdGUgYSB0b2tlbiBmb3IgdXNlIHdpdGggaW1hZ2luYXJ5IHRva2VuIG5vZGVzLgorICAgICAgICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgcHJvYmFibHkgbm8gaW5wdXQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpbWFnaW5hcnkKKyAgICAgICAgdG9rZW4gREVDTCwgYnV0IHlvdSBuZWVkIHRvIGNyZWF0ZSBpdCBhcyBhIHBheWxvYWQgb3Igd2hhdGV2ZXIgZm9yCisgICAgICAgIHRoZSBERUNMIG5vZGUgYXMgaW4gXihERUNMIHR5cGUgSUQpLgorCisgICAgICAgIElmIHlvdSBjYXJlIHdoYXQgdGhlIHRva2VuIHBheWxvYWQgb2JqZWN0cycgdHlwZSBpcywgeW91IHNob3VsZAorICAgICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYW55IG90aGVyIGNyZWF0ZVRva2VuIHZhcmlhbnQuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNvbW1vbiB0cmVlIGltcGxlbWVudGF0aW9uCisjCisjIFRyZWUKKyMgXC0gQmFzZVRyZWUKKyMgICAgXC0gQ29tbW9uVHJlZQorIyAgICAgICBcLSBDb21tb25FcnJvck5vZGUKKyMKKyMgVHJlZUFkYXB0b3IKKyMgXC0gQmFzZVRyZWVBZGFwdG9yCisjICAgIFwtIENvbW1vblRyZWVBZGFwdG9yCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgQ29tbW9uVHJlZShCYXNlVHJlZSk6CisgICAgIiIiQGJyaWVmIEEgdHJlZSBub2RlIHRoYXQgaXMgd3JhcHBlciBmb3IgYSBUb2tlbiBvYmplY3QuCisKKyAgICBBZnRlciAzLjAgcmVsZWFzZQorICAgIHdoaWxlIGJ1aWxkaW5nIHRyZWUgcmV3cml0ZSBzdHVmZiwgaXQgYmVjYW1lIGNsZWFyIHRoYXQgY29tcHV0aW5nCisgICAgcGFyZW50IGFuZCBjaGlsZCBpbmRleCBpcyB2ZXJ5IGRpZmZpY3VsdCBhbmQgY3VtYmVyc29tZS4gIEJldHRlciB0bworICAgIHNwZW5kIHRoZSBzcGFjZSBpbiBldmVyeSB0cmVlIG5vZGUuICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGVzZSBleHRyYQorICAgIGZpZWxkcywgaXQncyBlYXN5IHRvIGN1dCB0aGVtIG91dCBpbiB5b3VyIG93biBCYXNlVHJlZSBzdWJjbGFzcy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBheWxvYWQpOgorICAgICAgICBCYXNlVHJlZS5fX2luaXRfXyhzZWxmKQorCisgICAgICAgICMgV2hhdCB0b2tlbiBpbmRleGVzIGJyYWNrZXQgYWxsIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICAgICMgYW5kIGJlbG93PworICAgICAgICBzZWxmLnN0YXJ0SW5kZXggPSAtMQorICAgICAgICBzZWxmLnN0b3BJbmRleCA9IC0xCisKKyAgICAgICAgIyBXaG8gaXMgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZTsgaWYgbnVsbCwgaW1wbGllcyBub2RlIGlzIHJvb3QKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisKKyAgICAgICAgIyBXaGF0IGluZGV4IGlzIHRoaXMgbm9kZSBpbiB0aGUgY2hpbGQgbGlzdD8gUmFuZ2U6IDAuLm4tMQorICAgICAgICBzZWxmLmNoaWxkSW5kZXggPSAtMQorCisgICAgICAgICMgQSBzaW5nbGUgdG9rZW4gaXMgdGhlIHBheWxvYWQKKyAgICAgICAgaWYgcGF5bG9hZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50b2tlbiA9IE5vbmUKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UocGF5bG9hZCwgQ29tbW9uVHJlZSk6CisgICAgICAgICAgICBzZWxmLnRva2VuID0gcGF5bG9hZC50b2tlbgorICAgICAgICAgICAgc2VsZi5zdGFydEluZGV4ID0gcGF5bG9hZC5zdGFydEluZGV4CisgICAgICAgICAgICBzZWxmLnN0b3BJbmRleCA9IHBheWxvYWQuc3RvcEluZGV4CisKKyAgICAgICAgZWxpZiBwYXlsb2FkIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShwYXlsb2FkLCBUb2tlbik6CisgICAgICAgICAgICBzZWxmLnRva2VuID0gcGF5bG9hZAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IodHlwZShwYXlsb2FkKS5fX25hbWVfXykKKworCisKKyAgICBkZWYgZ2V0VG9rZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRva2VuCisKKworICAgIGRlZiBkdXBOb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gQ29tbW9uVHJlZShzZWxmKQorCisKKyAgICBkZWYgaXNOaWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRva2VuIGlzIE5vbmUKKworCisgICAgZGVmIGdldFR5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudG9rZW4gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX1RPS0VOX1RZUEUKKworICAgICAgICByZXR1cm4gc2VsZi50b2tlbi5nZXRUeXBlKCkKKworICAgIHR5cGUgPSBwcm9wZXJ0eShnZXRUeXBlKQorCisKKyAgICBkZWYgZ2V0VGV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi50b2tlbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0CisKKyAgICB0ZXh0ID0gcHJvcGVydHkoZ2V0VGV4dCkKKworCisgICAgZGVmIGdldExpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudG9rZW4gaXMgTm9uZSBvciBzZWxmLnRva2VuLmdldExpbmUoKSA9PSAwOgorICAgICAgICAgICAgaWYgc2VsZi5nZXRDaGlsZENvdW50KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0Q2hpbGQoMCkuZ2V0TGluZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4uZ2V0TGluZSgpCisKKyAgICBsaW5lID0gcHJvcGVydHkoZ2V0TGluZSkKKworCisgICAgZGVmIGdldENoYXJQb3NpdGlvbkluTGluZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50b2tlbiBpcyBOb25lIG9yIHNlbGYudG9rZW4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkgPT0gLTE6CisgICAgICAgICAgICBpZiBzZWxmLmdldENoaWxkQ291bnQoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRDaGlsZCgwKS5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKQorCisgICAgY2hhclBvc2l0aW9uSW5MaW5lID0gcHJvcGVydHkoZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKQorCisKKyAgICBkZWYgZ2V0VG9rZW5TdGFydEluZGV4KHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0YXJ0SW5kZXggPT0gLTEgYW5kIHNlbGYudG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi5nZXRUb2tlbkluZGV4KCkKKworICAgICAgICByZXR1cm4gc2VsZi5zdGFydEluZGV4CisKKyAgICBkZWYgc2V0VG9rZW5TdGFydEluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi5zdGFydEluZGV4ID0gaW5kZXgKKworICAgIHRva2VuU3RhcnRJbmRleCA9IHByb3BlcnR5KGdldFRva2VuU3RhcnRJbmRleCwgc2V0VG9rZW5TdGFydEluZGV4KQorCisKKyAgICBkZWYgZ2V0VG9rZW5TdG9wSW5kZXgoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RvcEluZGV4ID09IC0xIGFuZCBzZWxmLnRva2VuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4uZ2V0VG9rZW5JbmRleCgpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RvcEluZGV4CisKKyAgICBkZWYgc2V0VG9rZW5TdG9wSW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnN0b3BJbmRleCA9IGluZGV4CisKKyAgICB0b2tlblN0b3BJbmRleCA9IHByb3BlcnR5KGdldFRva2VuU3RvcEluZGV4LCBzZXRUb2tlblN0b3BJbmRleCkKKworCisgICAgZGVmIHNldFVua25vd25Ub2tlbkJvdW5kYXJpZXMoc2VsZik6CisgICAgICAgICIiIkZvciBldmVyeSBub2RlIGluIHRoaXMgc3VidHJlZSwgbWFrZSBzdXJlIGl0J3Mgc3RhcnQvc3RvcCB0b2tlbidzCisgICAgICAgIGFyZSBzZXQuICBXYWxrIGRlcHRoIGZpcnN0LCB2aXNpdCBib3R0b20gdXAuICBPbmx5IHVwZGF0ZXMgbm9kZXMKKyAgICAgICAgd2l0aCBhdCBsZWFzdCBvbmUgdG9rZW4gaW5kZXggPCAwLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLmNoaWxkcmVuIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXJ0SW5kZXggPCAwIG9yIHNlbGYuc3RvcEluZGV4IDwgMDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0SW5kZXggPSBzZWxmLnN0b3BJbmRleCA9IHNlbGYudG9rZW4uZ2V0VG9rZW5JbmRleCgpCisKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGQuc2V0VW5rbm93blRva2VuQm91bmRhcmllcygpCisKKyAgICAgICAgaWYgc2VsZi5zdGFydEluZGV4ID49IDAgYW5kIHNlbGYuc3RvcEluZGV4ID49IDA6CisgICAgICAgICAgICAjIGFscmVhZHkgc2V0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgZmlyc3RDaGlsZCA9IHNlbGYuY2hpbGRyZW5bMF0KKyAgICAgICAgICAgIGxhc3RDaGlsZCA9IHNlbGYuY2hpbGRyZW5bLTFdCisgICAgICAgICAgICBzZWxmLnN0YXJ0SW5kZXggPSBmaXJzdENoaWxkLmdldFRva2VuU3RhcnRJbmRleCgpCisgICAgICAgICAgICBzZWxmLnN0b3BJbmRleCA9IGxhc3RDaGlsZC5nZXRUb2tlblN0b3BJbmRleCgpCisKKworICAgIGRlZiBnZXRDaGlsZEluZGV4KHNlbGYpOgorICAgICAgICAjRklYTUU6IG1hcmsgYXMgZGVwcmVjYXRlZAorICAgICAgICByZXR1cm4gc2VsZi5jaGlsZEluZGV4CisKKworICAgIGRlZiBzZXRDaGlsZEluZGV4KHNlbGYsIGlkeCk6CisgICAgICAgICNGSVhNRTogbWFyayBhcyBkZXByZWNhdGVkCisgICAgICAgIHNlbGYuY2hpbGRJbmRleCA9IGlkeAorCisKKyAgICBkZWYgZ2V0UGFyZW50KHNlbGYpOgorICAgICAgICAjRklYTUU6IG1hcmsgYXMgZGVwcmVjYXRlZAorICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQKKworCisgICAgZGVmIHNldFBhcmVudChzZWxmLCB0KToKKyAgICAgICAgI0ZJWE1FOiBtYXJrIGFzIGRlcHJlY2F0ZWQKKyAgICAgICAgc2VsZi5wYXJlbnQgPSB0CisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pc05pbCgpOgorICAgICAgICAgICAgcmV0dXJuICJuaWwiCisKKyAgICAgICAgaWYgc2VsZi5nZXRUeXBlKCkgPT0gSU5WQUxJRF9UT0tFTl9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICI8ZXJyb3Jub2RlPiIKKworICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0CisKKyAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworCisKKyAgICBkZWYgdG9TdHJpbmdUcmVlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRvU3RyaW5nKCkKKworICAgICAgICByZXQgPSAnJworICAgICAgICBpZiBub3Qgc2VsZi5pc05pbCgpOgorICAgICAgICAgICAgcmV0ICs9ICcoJXMgJyAlIChzZWxmLnRvU3RyaW5nKCkpCisKKyAgICAgICAgcmV0ICs9ICcgJy5qb2luKFtjaGlsZC50b1N0cmluZ1RyZWUoKSBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbl0pCisKKyAgICAgICAgaWYgbm90IHNlbGYuaXNOaWwoKToKKyAgICAgICAgICAgIHJldCArPSAnKScKKworICAgICAgICByZXR1cm4gcmV0CisKKworSU5WQUxJRF9OT0RFID0gQ29tbW9uVHJlZShJTlZBTElEX1RPS0VOKQorCisKK2NsYXNzIENvbW1vbkVycm9yTm9kZShDb21tb25UcmVlKToKKyAgICAiIiJBIG5vZGUgcmVwcmVzZW50aW5nIGVycm9uZW91cyB0b2tlbiByYW5nZSBpbiB0b2tlbiBzdHJlYW0iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dCwgc3RhcnQsIHN0b3AsIGV4Yyk6CisgICAgICAgIENvbW1vblRyZWUuX19pbml0X18oc2VsZiwgTm9uZSkKKworICAgICAgICBpZiAoc3RvcCBpcyBOb25lIG9yCisgICAgICAgICAgICAoc3RvcC5nZXRUb2tlbkluZGV4KCkgPCBzdGFydC5nZXRUb2tlbkluZGV4KCkgYW5kCisgICAgICAgICAgICAgc3RvcC5nZXRUeXBlKCkgIT0gRU9GCisgICAgICAgICAgICAgKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICMgc29tZXRpbWVzIHJlc3luYyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gKHdoZW4gTFQoMSkgaXMKKyAgICAgICAgICAgICMgaW4gZm9sbG93IHNldC4gIFNvLCBzdG9wIHdpbGwgYmUgMSB0byBsZWZ0IHRvIHN0YXJ0LiBhZGp1c3QuCisgICAgICAgICAgICAjIEFsc28gaGFuZGxlIGNhc2Ugd2hlcmUgc3RhcnQgaXMgdGhlIGZpcnN0IHRva2VuIGFuZCBubyB0b2tlbgorICAgICAgICAgICAgIyBpcyBjb25zdW1lZCBkdXJpbmcgcmVjb3Zlcnk7IExUKC0xKSB3aWxsIHJldHVybiBudWxsLgorICAgICAgICAgICAgc3RvcCA9IHN0YXJ0CisKKyAgICAgICAgc2VsZi5pbnB1dCA9IGlucHV0CisgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgICAgICBzZWxmLnN0b3AgPSBzdG9wCisgICAgICAgIHNlbGYudHJhcHBlZEV4Y2VwdGlvbiA9IGV4YworCisKKyAgICBkZWYgaXNOaWwoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisKKyAgICBkZWYgZ2V0VHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIElOVkFMSURfVE9LRU5fVFlQRQorCisKKyAgICBkZWYgZ2V0VGV4dChzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnN0YXJ0LCBUb2tlbik6CisgICAgICAgICAgICBpID0gc2VsZi5zdGFydC5nZXRUb2tlbkluZGV4KCkKKyAgICAgICAgICAgIGogPSBzZWxmLnN0b3AuZ2V0VG9rZW5JbmRleCgpCisgICAgICAgICAgICBpZiBzZWxmLnN0b3AuZ2V0VHlwZSgpID09IEVPRjoKKyAgICAgICAgICAgICAgICBqID0gc2VsZi5pbnB1dC5zaXplKCkKKworICAgICAgICAgICAgYmFkVGV4dCA9IHNlbGYuaW5wdXQudG9TdHJpbmcoaSwgaikKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZi5zdGFydCwgVHJlZSk6CisgICAgICAgICAgICBiYWRUZXh0ID0gc2VsZi5pbnB1dC50b1N0cmluZyhzZWxmLnN0YXJ0LCBzZWxmLnN0b3ApCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcGVvcGxlIHNob3VsZCBzdWJjbGFzcyBpZiB0aGV5IGFsdGVyIHRoZSB0cmVlIHR5cGUgc28gdGhpcworICAgICAgICAgICAgIyBuZXh0IG9uZSBpcyBmb3Igc3VyZSBjb3JyZWN0LgorICAgICAgICAgICAgYmFkVGV4dCA9ICI8dW5rbm93bj4iCisKKyAgICAgICAgcmV0dXJuIGJhZFRleHQKKworCisgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYudHJhcHBlZEV4Y2VwdGlvbiwgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJldHVybiAoIjxtaXNzaW5nIHR5cGU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBzdHIoc2VsZi50cmFwcGVkRXhjZXB0aW9uLmdldE1pc3NpbmdUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICsgIj4iKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLnRyYXBwZWRFeGNlcHRpb24sIFVud2FudGVkVG9rZW5FeGNlcHRpb24pOgorICAgICAgICAgICAgcmV0dXJuICgiPGV4dHJhbmVvdXM6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBzdHIoc2VsZi50cmFwcGVkRXhjZXB0aW9uLmdldFVuZXhwZWN0ZWRUb2tlbigpKQorICAgICAgICAgICAgICAgICAgICArICIsIHJlc3luYz0iICsgc2VsZi5nZXRUZXh0KCkgKyAiPiIpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYudHJhcHBlZEV4Y2VwdGlvbiwgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJldHVybiAoIjxtaXNtYXRjaGVkIHRva2VuOiAiCisgICAgICAgICAgICAgICAgICAgICsgc3RyKHNlbGYudHJhcHBlZEV4Y2VwdGlvbi50b2tlbikKKyAgICAgICAgICAgICAgICAgICAgKyAiLCByZXN5bmM9IiArIHNlbGYuZ2V0VGV4dCgpICsgIj4iKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLnRyYXBwZWRFeGNlcHRpb24sIE5vVmlhYmxlQWx0RXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJldHVybiAoIjx1bmV4cGVjdGVkOiAiCisgICAgICAgICAgICAgICAgICAgICsgc3RyKHNlbGYudHJhcHBlZEV4Y2VwdGlvbi50b2tlbikKKyAgICAgICAgICAgICAgICAgICAgKyAiLCByZXN5bmM9IiArIHNlbGYuZ2V0VGV4dCgpICsgIj4iKQorCisgICAgICAgIHJldHVybiAiPGVycm9yOiAiK3NlbGYuZ2V0VGV4dCgpKyI+IgorCisKK2NsYXNzIENvbW1vblRyZWVBZGFwdG9yKEJhc2VUcmVlQWRhcHRvcik6CisgICAgIiIiCisgICAgQGJyaWVmIEEgVHJlZUFkYXB0b3IgdGhhdCB3b3JrcyB3aXRoIGFueSBUcmVlIGltcGxlbWVudGF0aW9uLgorCisgICAgSXQgcHJvdmlkZXMKKyAgICByZWFsbHkganVzdCBmYWN0b3J5IG1ldGhvZHM7IGFsbCB0aGUgd29yayBpcyBkb25lIGJ5IEJhc2VUcmVlQWRhcHRvci4KKyAgICBJZiB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGRpZmZlcmVudCB0b2tlbnMgY3JlYXRlZCB0aGFuIENsYXNzaWNUb2tlbgorICAgIG9iamVjdHMsIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgYW5kIHRoZW4gc2V0IHRoZSBwYXJzZXIgdHJlZSBhZGFwdG9yIHRvCisgICAgdXNlIHlvdXIgc3ViY2xhc3MuCisKKyAgICBUbyBnZXQgeW91ciBwYXJzZXIgdG8gYnVpbGQgbm9kZXMgb2YgYSBkaWZmZXJlbnQgdHlwZSwgb3ZlcnJpZGUKKyAgICBjcmVhdGUoVG9rZW4pLCBlcnJvck5vZGUoKSwgYW5kIHRvIGJlIHNhZmUsIFlvdXJUcmVlQ2xhc3MuZHVwTm9kZSgpLgorICAgIGR1cE5vZGUgaXMgY2FsbGVkIHRvIGR1cGxpY2F0ZSBub2RlcyBkdXJpbmcgcmV3cml0ZSBvcGVyYXRpb25zLgorICAgICIiIgorCisgICAgZGVmIGR1cE5vZGUoc2VsZiwgdHJlZU5vZGUpOgorICAgICAgICAiIiIKKyAgICAgICAgRHVwbGljYXRlIGEgbm9kZS4gIFRoaXMgaXMgcGFydCBvZiB0aGUgZmFjdG9yeTsKKyAgICAgICAgb3ZlcnJpZGUgaWYgeW91IHdhbnQgYW5vdGhlciBraW5kIG9mIG5vZGUgdG8gYmUgYnVpbHQuCisKKyAgICAgICAgSSBjb3VsZCB1c2UgcmVmbGVjdGlvbiB0byBwcmV2ZW50IGhhdmluZyB0byBvdmVycmlkZSB0aGlzCisgICAgICAgIGJ1dCByZWZsZWN0aW9uIGlzIHNsb3cuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHRyZWVOb2RlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiB0cmVlTm9kZS5kdXBOb2RlKCkKKworCisgICAgZGVmIGNyZWF0ZVdpdGhQYXlsb2FkKHNlbGYsIHBheWxvYWQpOgorICAgICAgICByZXR1cm4gQ29tbW9uVHJlZShwYXlsb2FkKQorCisKKyAgICBkZWYgY3JlYXRlVG9rZW4oc2VsZiwgZnJvbVRva2VuPU5vbmUsIHRva2VuVHlwZT1Ob25lLCB0ZXh0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVsbCBtZSBob3cgdG8gY3JlYXRlIGEgdG9rZW4gZm9yIHVzZSB3aXRoIGltYWdpbmFyeSB0b2tlbiBub2Rlcy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIHByb2JhYmx5IG5vIGlucHV0IHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggaW1hZ2luYXJ5CisgICAgICAgIHRva2VuIERFQ0wsIGJ1dCB5b3UgbmVlZCB0byBjcmVhdGUgaXQgYXMgYSBwYXlsb2FkIG9yIHdoYXRldmVyIGZvcgorICAgICAgICB0aGUgREVDTCBub2RlIGFzIGluIF4oREVDTCB0eXBlIElEKS4KKworICAgICAgICBJZiB5b3UgY2FyZSB3aGF0IHRoZSB0b2tlbiBwYXlsb2FkIG9iamVjdHMnIHR5cGUgaXMsIHlvdSBzaG91bGQKKyAgICAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFueSBvdGhlciBjcmVhdGVUb2tlbiB2YXJpYW50LgorICAgICAgICAiIiIKKworICAgICAgICBpZiBmcm9tVG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gQ29tbW9uVG9rZW4ob2xkVG9rZW49ZnJvbVRva2VuKQorCisgICAgICAgIHJldHVybiBDb21tb25Ub2tlbih0eXBlPXRva2VuVHlwZSwgdGV4dD10ZXh0KQorCisKKyAgICBkZWYgc2V0VG9rZW5Cb3VuZGFyaWVzKHNlbGYsIHQsIHN0YXJ0VG9rZW4sIHN0b3BUb2tlbik6CisgICAgICAgICIiIgorICAgICAgICBUcmFjayBzdGFydC9zdG9wIHRva2VuIGZvciBzdWJ0cmVlIHJvb3QgY3JlYXRlZCBmb3IgYSBydWxlLgorICAgICAgICBPbmx5IHdvcmtzIHdpdGggVHJlZSBub2Rlcy4gIEZvciBydWxlcyB0aGF0IG1hdGNoIG5vdGhpbmcsCisgICAgICAgIHNlZW1zIGxpa2UgdGhpcyB3aWxsIHlpZWxkIHN0YXJ0PWkgYW5kIHN0b3A9aS0xIGluIGEgbmlsIG5vZGUuCisgICAgICAgIE1pZ2h0IGJlIHVzZWZ1bCBpbmZvIHNvIEknbGwgbm90IGZvcmNlIHRvIGJlIGkuLmkuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHN0YXJ0ID0gMAorICAgICAgICBzdG9wID0gMAorCisgICAgICAgIGlmIHN0YXJ0VG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdGFydCA9IHN0YXJ0VG9rZW4uaW5kZXgKKworICAgICAgICBpZiBzdG9wVG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdG9wID0gc3RvcFRva2VuLmluZGV4CisKKyAgICAgICAgdC5zZXRUb2tlblN0YXJ0SW5kZXgoc3RhcnQpCisgICAgICAgIHQuc2V0VG9rZW5TdG9wSW5kZXgoc3RvcCkKKworCisgICAgZGVmIGdldFRva2VuU3RhcnRJbmRleChzZWxmLCB0KToKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiB0LmdldFRva2VuU3RhcnRJbmRleCgpCisKKworICAgIGRlZiBnZXRUb2tlblN0b3BJbmRleChzZWxmLCB0KToKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiB0LmdldFRva2VuU3RvcEluZGV4KCkKKworCisgICAgZGVmIGdldFRleHQoc2VsZiwgdCk6CisgICAgICAgIGlmIHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiB0LmdldFRleHQoKQorCisKKyAgICBkZWYgZ2V0VHlwZShzZWxmLCB0KToKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfVE9LRU5fVFlQRQorCisgICAgICAgIHJldHVybiB0LmdldFR5cGUoKQorCisKKyAgICBkZWYgZ2V0VG9rZW4oc2VsZiwgdCk6CisgICAgICAgICIiIgorICAgICAgICBXaGF0IGlzIHRoZSBUb2tlbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlPyAgSWYKKyAgICAgICAgeW91IGFyZSBub3QgdXNpbmcgQ29tbW9uVHJlZSwgdGhlbiB5b3UgbXVzdAorICAgICAgICBvdmVycmlkZSB0aGlzIGluIHlvdXIgb3duIGFkYXB0b3IuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UodCwgQ29tbW9uVHJlZSk6CisgICAgICAgICAgICByZXR1cm4gdC5nZXRUb2tlbigpCisKKyAgICAgICAgcmV0dXJuIE5vbmUgIyBubyBpZGVhIHdoYXQgdG8gZG8KKworCisgICAgZGVmIGdldENoaWxkKHNlbGYsIHQsIGkpOgorICAgICAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gdC5nZXRDaGlsZChpKQorCisKKyAgICBkZWYgZ2V0Q2hpbGRDb3VudChzZWxmLCB0KToKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIHQuZ2V0Q2hpbGRDb3VudCgpCisKKworICAgIGRlZiBnZXRQYXJlbnQoc2VsZiwgdCk6CisgICAgICAgIHJldHVybiB0LmdldFBhcmVudCgpCisKKworICAgIGRlZiBzZXRQYXJlbnQoc2VsZiwgdCwgcGFyZW50KToKKyAgICAgICAgdC5zZXRQYXJlbnQocGFyZW50KQorCisKKyAgICBkZWYgZ2V0Q2hpbGRJbmRleChzZWxmLCB0KToKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIHQuZ2V0Q2hpbGRJbmRleCgpCisKKworICAgIGRlZiBzZXRDaGlsZEluZGV4KHNlbGYsIHQsIGluZGV4KToKKyAgICAgICAgdC5zZXRDaGlsZEluZGV4KGluZGV4KQorCisKKyAgICBkZWYgcmVwbGFjZUNoaWxkcmVuKHNlbGYsIHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk6CisgICAgICAgIGlmIHBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGRyZW4oc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHN0cmVhbXMKKyMKKyMgVHJlZU5vZGVTdHJlYW0KKyMgXC0gQmFzZVRyZWUKKyMgICAgXC0gQ29tbW9uVHJlZQorIworIyBUcmVlQWRhcHRvcgorIyBcLSBCYXNlVHJlZUFkYXB0b3IKKyMgICAgXC0gQ29tbW9uVHJlZUFkYXB0b3IKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisKK2NsYXNzIFRyZWVOb2RlU3RyZWFtKEludFN0cmVhbSk6CisgICAgIiIiQGJyaWVmIEEgc3RyZWFtIG9mIHRyZWUgbm9kZXMKKworICAgIEl0IGFjY2Vzc2luZyBub2RlcyBmcm9tIGEgdHJlZSBvZiBzb21lIGtpbmQuCisgICAgIiIiCisKKyAgICAjIFRyZWVOb2RlU3RyZWFtIGlzIGFic3RyYWN0LCBubyBuZWVkIHRvIGNvbXBsYWluIGFib3V0IG5vdCBpbXBsZW1lbnRlZAorICAgICMgYWJzdHJhY3QgbWV0aG9kcworICAgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1XMDIyMworCisgICAgZGVmIGdldChzZWxmLCBpKToKKyAgICAgICAgIiIiR2V0IGEgdHJlZSBub2RlIGF0IGFuIGFic29sdXRlIGluZGV4IGk7IDAuLm4tMS4KKyAgICAgICAgSWYgeW91IGRvbid0IHdhbnQgdG8gYnVmZmVyIHVwIG5vZGVzLCB0aGVuIHRoaXMgbWV0aG9kIG1ha2VzIG5vCisgICAgICAgIHNlbnNlIGZvciB5b3UuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIExUKHNlbGYsIGspOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRyZWUgbm9kZSBhdCBjdXJyZW50IGlucHV0IHBvaW50ZXIgKyBpIGFoZWFkIHdoZXJlIGk9MSBpcyBuZXh0IG5vZGUuCisgICAgICAgIGk8MCBpbmRpY2F0ZXMgbm9kZXMgaW4gdGhlIHBhc3QuICBTbyBMVCgtMSkgaXMgcHJldmlvdXMgbm9kZSwgYnV0CisgICAgICAgIGltcGxlbWVudGF0aW9ucyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgcmVzdWx0cyBmb3IgayA8IC0xLgorICAgICAgICBMVCgwKSBpcyB1bmRlZmluZWQuICBGb3IgaT49biwgcmV0dXJuIG51bGwuCisgICAgICAgIFJldHVybiBudWxsIGZvciBMVCgwKSBhbmQgYW55IGluZGV4IHRoYXQgcmVzdWx0cyBpbiBhbiBhYnNvbHV0ZSBhZGRyZXNzCisgICAgICAgIHRoYXQgaXMgbmVnYXRpdmUuCisKKyAgICAgICAgVGhpcyBpcyBhbmFsb2d1cyB0byB0aGUgTFQoKSBtZXRob2Qgb2YgdGhlIFRva2VuU3RyZWFtLCBidXQgdGhpcworICAgICAgICByZXR1cm5zIGEgdHJlZSBub2RlIGluc3RlYWQgb2YgYSB0b2tlbi4gIE1ha2VzIGNvZGUgZ2VuIGlkZW50aWNhbAorICAgICAgICBmb3IgYm90aCBwYXJzZXIgYW5kIHRyZWUgZ3JhbW1hcnMuIDopCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGdldFRyZWVTb3VyY2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBXaGVyZSBpcyB0aGlzIHN0cmVhbSBwdWxsaW5nIG5vZGVzIGZyb20/ICBUaGlzIGlzIG5vdCB0aGUgbmFtZSwgYnV0CisgICAgICAgIHRoZSBvYmplY3QgdGhhdCBwcm92aWRlcyBub2RlIG9iamVjdHMuCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIGdldFRva2VuU3RyZWFtKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSWYgdGhlIHRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtIHdhcyBjcmVhdGVkIGZyb20gYSBUb2tlblN0cmVhbSwKKyAgICAgICAgeW91IGNhbiBzcGVjaWZ5IGl0IGhlcmUuICBVc2VkIHRvIGRvIHJ1bGUgJHRleHQgYXR0cmlidXRlIGluIHRyZWUKKyAgICAgICAgcGFyc2VyLiAgT3B0aW9uYWwgdW5sZXNzIHlvdSB1c2UgdHJlZSBwYXJzZXIgcnVsZSB0ZXh0IGF0dHJpYnV0ZQorICAgICAgICBvciBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBvcHRpb25zLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiBnZXRUcmVlQWRhcHRvcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFdoYXQgYWRhcHRvciBjYW4gdGVsbCBtZSBob3cgdG8gaW50ZXJwcmV0L25hdmlnYXRlIG5vZGVzIGFuZAorICAgICAgICB0cmVlcy4gIEUuZy4sIGdldCB0ZXh0IG9mIGEgbm9kZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgc2V0VW5pcXVlTmF2aWdhdGlvbk5vZGVzKHNlbGYsIHVuaXF1ZU5hdmlnYXRpb25Ob2Rlcyk6CisgICAgICAgICIiIgorICAgICAgICBBcyB3ZSBmbGF0dGVuIHRoZSB0cmVlLCB3ZSB1c2UgVVAsIERPV04gbm9kZXMgdG8gcmVwcmVzZW50CisgICAgICAgIHRoZSB0cmVlIHN0cnVjdHVyZS4gIFdoZW4gZGVidWdnaW5nIHdlIG5lZWQgdW5pcXVlIG5vZGVzCisgICAgICAgIHNvIHdlIGhhdmUgdG8gaW5zdGFudGlhdGUgbmV3IG9uZXMuICBXaGVuIGRvaW5nIG5vcm1hbCB0cmVlCisgICAgICAgIHBhcnNpbmcsIGl0J3Mgc2xvdyBhbmQgYSB3YXN0ZSBvZiBtZW1vcnkgdG8gY3JlYXRlIHVuaXF1ZQorICAgICAgICBuYXZpZ2F0aW9uIG5vZGVzLiAgRGVmYXVsdCBzaG91bGQgYmUgZmFsc2U7CisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVzZXQgdGhlIHRyZWUgbm9kZSBzdHJlYW0gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGFjdHMgbGlrZQorICAgICAgICBhIGZyZXNobHkgY29uc3RydWN0ZWQgc3RyZWFtLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIHRleHQgb2YgYWxsIG5vZGVzIGZyb20gc3RhcnQgdG8gc3RvcCwgaW5jbHVzaXZlLgorICAgICAgICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IGJ1ZmZlciBhbGwgdGhlIG5vZGVzIHRoZW4gaXQgY2FuIHN0aWxsCisgICAgICAgIHdhbGsgcmVjdXJzaXZlbHkgZnJvbSBzdGFydCB1bnRpbCBzdG9wLiAgWW91IGNhbiBhbHdheXMgcmV0dXJuCisgICAgICAgIG51bGwgb3IgIiIgdG9vLCBidXQgdXNlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgJHJ1bGVMYWJlbC50ZXh0IGluCisgICAgICAgIGFuIGFjdGlvbiBvZiBjb3Vyc2UgaW4gdGhhdCBjYXNlLgorICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgICMgUkVXUklUSU5HIFRSRUVTICh1c2VkIGJ5IHRyZWUgcGFyc2VyKQorICAgIGRlZiByZXBsYWNlQ2hpbGRyZW4oc2VsZiwgcGFyZW50LCBzdGFydENoaWxkSW5kZXgsIHN0b3BDaGlsZEluZGV4LCB0KToKKyAgICAgICAgIiIiCisgCVJlcGxhY2UgZnJvbSBzdGFydCB0byBzdG9wIGNoaWxkIGluZGV4IG9mIHBhcmVudCB3aXRoIHQsIHdoaWNoIG1pZ2h0CisgICAgICAgIGJlIGEgbGlzdC4gIE51bWJlciBvZiBjaGlsZHJlbiBtYXkgYmUgZGlmZmVyZW50CisgICAgICAgIGFmdGVyIHRoaXMgY2FsbC4gIFRoZSBzdHJlYW0gaXMgbm90aWZpZWQgYmVjYXVzZSBpdCBpcyB3YWxraW5nIHRoZQorICAgICAgICB0cmVlIGFuZCBtaWdodCBuZWVkIHRvIGtub3cgeW91IGFyZSBtb25rZXlpbmcgd2l0aCB0aGUgdW5kZXJseWluZworICAgICAgICB0cmVlLiAgQWxzbywgaXQgbWlnaHQgYmUgYWJsZSB0byBtb2RpZnkgdGhlIG5vZGUgc3RyZWFtIHRvIGF2b2lkCisgICAgICAgIHJlc3RyZWFtaW5nIGZvciBmdXR1cmUgcGhhc2VzLgorCisgICAgICAgIElmIHBhcmVudCBpcyBudWxsLCBkb24ndCBkbyBhbnl0aGluZzsgbXVzdCBiZSBhdCByb290IG9mIG92ZXJhbGwgdHJlZS4KKyAgICAgICAgQ2FuJ3QgcmVwbGFjZSB3aGF0ZXZlciBwb2ludHMgdG8gdGhlIHBhcmVudCBleHRlcm5hbGx5LiAgRG8gbm90aGluZy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIENvbW1vblRyZWVOb2RlU3RyZWFtKFRyZWVOb2RlU3RyZWFtKToKKyAgICAiIiJAYnJpZWYgQSBidWZmZXJlZCBzdHJlYW0gb2YgdHJlZSBub2Rlcy4KKworICAgIE5vZGVzIGNhbiBiZSBmcm9tIGEgdHJlZSBvZiBBTlkga2luZC4KKworICAgIFRoaXMgbm9kZSBzdHJlYW0gc3Vja3MgYWxsIG5vZGVzIG91dCBvZiB0aGUgdHJlZSBzcGVjaWZpZWQgaW4KKyAgICB0aGUgY29uc3RydWN0b3IgZHVyaW5nIGNvbnN0cnVjdGlvbiBhbmQgbWFrZXMgcG9pbnRlcnMgaW50bworICAgIHRoZSB0cmVlIHVzaW5nIGFuIGFycmF5IG9mIE9iamVjdCBwb2ludGVycy4gVGhlIHN0cmVhbSBuZWNlc3NhcmlseQorICAgIGluY2x1ZGVzIHBvaW50ZXJzIHRvIERPV04gYW5kIFVQIGFuZCBFT0Ygbm9kZXMuCisKKyAgICBUaGlzIHN0cmVhbSBrbm93cyBob3cgdG8gbWFyay9yZWxlYXNlIGZvciBiYWNrdHJhY2tpbmcuCisKKyAgICBUaGlzIHN0cmVhbSBpcyBtb3N0IHN1aXRhYmxlIGZvciB0cmVlIGludGVycHJldGVycyB0aGF0IG5lZWQgdG8KKyAgICBqdW1wIGFyb3VuZCBhIGxvdCBvciBmb3IgdHJlZSBwYXJzZXJzIHJlcXVpcmluZyBzcGVlZCAoYXQgY29zdCBvZiBtZW1vcnkpLgorICAgIFRoZXJlIGlzIHNvbWUgZHVwbGljYXRlZCBmdW5jdGlvbmFsaXR5IGhlcmUgd2l0aCBVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0KKyAgICBidXQganVzdCBpbiBib29ra2VlcGluZywgbm90IHRyZWUgd2Fsa2luZyBldGMuLi4KKworICAgIEBzZWUgVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBUcmVlTm9kZVN0cmVhbS5fX2luaXRfXyhzZWxmKQorCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgICAgIHRyZWUgPSBhcmdzWzBdCisKKyAgICAgICAgICAgIG5vZGVzID0gTm9uZQorICAgICAgICAgICAgZG93biA9IE5vbmUKKyAgICAgICAgICAgIHVwID0gTm9uZQorICAgICAgICAgICAgZW9mID0gTm9uZQorCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBhZGFwdG9yID0gYXJnc1swXQorICAgICAgICAgICAgdHJlZSA9IGFyZ3NbMV0KKworICAgICAgICAgICAgbm9kZXMgPSBOb25lCisgICAgICAgICAgICBkb3duID0gTm9uZQorICAgICAgICAgICAgdXAgPSBOb25lCisgICAgICAgICAgICBlb2YgPSBOb25lCisKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMzoKKyAgICAgICAgICAgIHBhcmVudCA9IGFyZ3NbMF0KKyAgICAgICAgICAgIHN0YXJ0ID0gYXJnc1sxXQorICAgICAgICAgICAgc3RvcCA9IGFyZ3NbMl0KKworICAgICAgICAgICAgYWRhcHRvciA9IHBhcmVudC5hZGFwdG9yCisgICAgICAgICAgICB0cmVlID0gcGFyZW50LnJvb3QKKworICAgICAgICAgICAgbm9kZXMgPSBwYXJlbnQubm9kZXNbc3RhcnQ6c3RvcF0KKyAgICAgICAgICAgIGRvd24gPSBwYXJlbnQuZG93bgorICAgICAgICAgICAgdXAgPSBwYXJlbnQudXAKKyAgICAgICAgICAgIGVvZiA9IHBhcmVudC5lb2YKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50cyIpCisKKyAgICAgICAgIyBhbGwgdGhlc2UgbmF2aWdhdGlvbiBub2RlcyBhcmUgc2hhcmVkIGFuZCBoZW5jZSB0aGV5CisgICAgICAgICMgY2Fubm90IGNvbnRhaW4gYW55IGxpbmUvY29sdW1uIGluZm8KKyAgICAgICAgaWYgZG93biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZG93biA9IGRvd24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZG93biA9IGFkYXB0b3IuY3JlYXRlRnJvbVR5cGUoRE9XTiwgIkRPV04iKQorCisgICAgICAgIGlmIHVwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51cCA9IHVwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnVwID0gYWRhcHRvci5jcmVhdGVGcm9tVHlwZShVUCwgIlVQIikKKworICAgICAgICBpZiBlb2YgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVvZiA9IGVvZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lb2YgPSBhZGFwdG9yLmNyZWF0ZUZyb21UeXBlKEVPRiwgIkVPRiIpCisKKyAgICAgICAgIyBUaGUgY29tcGxldGUgbWFwcGluZyBmcm9tIHN0cmVhbSBpbmRleCB0byB0cmVlIG5vZGUuCisgICAgICAgICMgVGhpcyBidWZmZXIgaW5jbHVkZXMgcG9pbnRlcnMgdG8gRE9XTiwgVVAsIGFuZCBFT0Ygbm9kZXMuCisgICAgICAgICMgSXQgaXMgYnVpbHQgdXBvbiBjdG9yIGludm9jYXRpb24uICBUaGUgZWxlbWVudHMgYXJlIHR5cGUKKyAgICAgICAgIyAgT2JqZWN0IGFzIHdlIGRvbid0IHdoYXQgdGhlIHRyZWVzIGxvb2sgbGlrZS4KKworICAgICAgICAjIExvYWQgdXBvbiBmaXJzdCBuZWVkIG9mIHRoZSBidWZmZXIgc28gd2UgY2FuIHNldCB0b2tlbiB0eXBlcworICAgICAgICAjIG9mIGludGVyZXN0IGZvciByZXZlcnNlSW5kZXhpbmcuICBTbG93cyB1cyBkb3duIGEgd2VlIGJpdCB0bworICAgICAgICAjIGRvIGFsbCBvZiB0aGUgaWYgcD09LTEgdGVzdGluZyBldmVyeXdoZXJlIHRob3VnaC4KKyAgICAgICAgaWYgbm9kZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubm9kZXMgPSBbXQorCisgICAgICAgICMgUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/CisgICAgICAgIHNlbGYucm9vdCA9IHRyZWUKKworICAgICAgICAjIElGIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuCisgICAgICAgIHNlbGYudG9rZW5zID0gTm9uZQorCisgICAgICAgICMgV2hhdCB0cmVlIGFkYXB0b3Igd2FzIHVzZWQgdG8gYnVpbGQgdGhlc2UgdHJlZXMKKyAgICAgICAgc2VsZi5hZGFwdG9yID0gYWRhcHRvcgorCisgICAgICAgICMgUmV1c2Ugc2FtZSBET1dOLCBVUCBuYXZpZ2F0aW9uIG5vZGVzIHVubGVzcyB0aGlzIGlzIHRydWUKKyAgICAgICAgc2VsZi51bmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSBGYWxzZQorCisgICAgICAgICMgVGhlIGluZGV4IGludG8gdGhlIG5vZGVzIGxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSAobmV4dCBub2RlCisgICAgICAgICMgdG8gY29uc3VtZSkuICBJZiAtMSwgbm9kZXMgYXJyYXkgbm90IGZpbGxlZCB5ZXQuCisgICAgICAgIHNlbGYucCA9IC0xCisKKyAgICAgICAgIyBUcmFjayB0aGUgbGFzdCBtYXJrKCkgY2FsbCByZXN1bHQgdmFsdWUgZm9yIHVzZSBpbiByZXdpbmQoKS4KKyAgICAgICAgc2VsZi5sYXN0TWFya2VyID0gTm9uZQorCisgICAgICAgICMgU3RhY2sgb2YgaW5kZXhlcyB1c2VkIGZvciBwdXNoL3BvcCBjYWxscworICAgICAgICBzZWxmLmNhbGxzID0gW10KKworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJlZUl0ZXJhdG9yKHNlbGYucm9vdCwgc2VsZi5hZGFwdG9yKQorCisKKyAgICBkZWYgZmlsbEJ1ZmZlcihzZWxmKToKKyAgICAgICAgIiIiV2FsayB0cmVlIHdpdGggZGVwdGgtZmlyc3Qtc2VhcmNoIGFuZCBmaWxsIG5vZGVzIGJ1ZmZlci4KKyAgICAgICAgRG9uJ3QgZG8gRE9XTiwgVVAgbm9kZXMgaWYgaXRzIGEgbGlzdCAodCBpcyBpc05pbCkuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuX2ZpbGxCdWZmZXIoc2VsZi5yb290KQorICAgICAgICBzZWxmLnAgPSAwICMgYnVmZmVyIG9mIG5vZGVzIGludGlhbGl6ZWQgbm93CisKKworICAgIGRlZiBfZmlsbEJ1ZmZlcihzZWxmLCB0KToKKyAgICAgICAgbmlsID0gc2VsZi5hZGFwdG9yLmlzTmlsKHQpCisKKyAgICAgICAgaWYgbm90IG5pbDoKKyAgICAgICAgICAgIHNlbGYubm9kZXMuYXBwZW5kKHQpICMgYWRkIHRoaXMgbm9kZQorCisgICAgICAgICMgYWRkIERPV04gbm9kZSBpZiB0IGhhcyBjaGlsZHJlbgorICAgICAgICBuID0gc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQodCkKKyAgICAgICAgaWYgbm90IG5pbCBhbmQgbiA+IDA6CisgICAgICAgICAgICBzZWxmLmFkZE5hdmlnYXRpb25Ob2RlKERPV04pCisKKyAgICAgICAgIyBhbmQgbm93IGFkZCBhbGwgaXRzIGNoaWxkcmVuCisgICAgICAgIGZvciBjIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgc2VsZi5fZmlsbEJ1ZmZlcihzZWxmLmFkYXB0b3IuZ2V0Q2hpbGQodCwgYykpCisKKyAgICAgICAgIyBhZGQgVVAgbm9kZSBpZiB0IGhhcyBjaGlsZHJlbgorICAgICAgICBpZiBub3QgbmlsIGFuZCBuID4gMDoKKyAgICAgICAgICAgIHNlbGYuYWRkTmF2aWdhdGlvbk5vZGUoVVApCisKKworICAgIGRlZiBnZXROb2RlSW5kZXgoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIldoYXQgaXMgdGhlIHN0cmVhbSBpbmRleCBmb3Igbm9kZT8gMC4ubi0xCisgICAgICAgIFJldHVybiAtMSBpZiBub2RlIG5vdCBmb3VuZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBmb3IgaSwgdCBpbiBlbnVtZXJhdGUoc2VsZi5ub2Rlcyk6CisgICAgICAgICAgICBpZiB0ID09IG5vZGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkKKworICAgICAgICByZXR1cm4gLTEKKworCisgICAgZGVmIGFkZE5hdmlnYXRpb25Ob2RlKHNlbGYsIHR0eXBlKToKKyAgICAgICAgIiIiCisgICAgICAgIEFzIHdlIGZsYXR0ZW4gdGhlIHRyZWUsIHdlIHVzZSBVUCwgRE9XTiBub2RlcyB0byByZXByZXNlbnQKKyAgICAgICAgdGhlIHRyZWUgc3RydWN0dXJlLiAgV2hlbiBkZWJ1Z2dpbmcgd2UgbmVlZCB1bmlxdWUgbm9kZXMKKyAgICAgICAgc28gaW5zdGFudGlhdGUgbmV3IG9uZXMgd2hlbiB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMgaXMgdHJ1ZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbmF2Tm9kZSA9IE5vbmUKKworICAgICAgICBpZiB0dHlwZSA9PSBET1dOOgorICAgICAgICAgICAgaWYgc2VsZi5oYXNVbmlxdWVOYXZpZ2F0aW9uTm9kZXMoKToKKyAgICAgICAgICAgICAgICBuYXZOb2RlID0gc2VsZi5hZGFwdG9yLmNyZWF0ZUZyb21UeXBlKERPV04sICJET1dOIikKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYXZOb2RlID0gc2VsZi5kb3duCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuaGFzVW5pcXVlTmF2aWdhdGlvbk5vZGVzKCk6CisgICAgICAgICAgICAgICAgbmF2Tm9kZSA9IHNlbGYuYWRhcHRvci5jcmVhdGVGcm9tVHlwZShVUCwgIlVQIikKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYXZOb2RlID0gc2VsZi51cAorCisgICAgICAgIHNlbGYubm9kZXMuYXBwZW5kKG5hdk5vZGUpCisKKworICAgIGRlZiBnZXQoc2VsZiwgaSk6CisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgcmV0dXJuIHNlbGYubm9kZXNbaV0KKworCisgICAgZGVmIExUKHNlbGYsIGspOgorICAgICAgICBpZiBzZWxmLnAgPT0gLTE6CisgICAgICAgICAgICBzZWxmLmZpbGxCdWZmZXIoKQorCisgICAgICAgIGlmIGsgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgayA8IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5MQigtaykKKworICAgICAgICBpZiBzZWxmLnAgKyBrIC0gMSA+PSBsZW4oc2VsZi5ub2Rlcyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5lb2YKKworICAgICAgICByZXR1cm4gc2VsZi5ub2Rlc1tzZWxmLnAgKyBrIC0gMV0KKworCisgICAgZGVmIGdldEN1cnJlbnRTeW1ib2woc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLkxUKDEpCisKKworICAgIGRlZiBMQihzZWxmLCBrKToKKyAgICAgICAgIiIiTG9vayBiYWNrd2FyZHMgayBub2RlcyIiIgorCisgICAgICAgIGlmIGsgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc2VsZi5wIC0gayA8IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiBzZWxmLm5vZGVzW3NlbGYucCAtIGtdCisKKworICAgIGRlZiBpc0VPRihzZWxmLCBvYmopOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldFR5cGUob2JqKSA9PSBFT0YKKworCisgICAgZGVmIGdldFRyZWVTb3VyY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJvb3QKKworCisgICAgZGVmIGdldFNvdXJjZU5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldFRva2VuU3RyZWFtKCkuZ2V0U291cmNlTmFtZSgpCisKKworICAgIGRlZiBnZXRUb2tlblN0cmVhbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zCisKKworICAgIGRlZiBzZXRUb2tlblN0cmVhbShzZWxmLCB0b2tlbnMpOgorICAgICAgICBzZWxmLnRva2VucyA9IHRva2VucworCisKKyAgICBkZWYgZ2V0VHJlZUFkYXB0b3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFkYXB0b3IKKworCisgICAgZGVmIGhhc1VuaXF1ZU5hdmlnYXRpb25Ob2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW5pcXVlTmF2aWdhdGlvbk5vZGVzCisKKworICAgIGRlZiBzZXRVbmlxdWVOYXZpZ2F0aW9uTm9kZXMoc2VsZiwgdW5pcXVlTmF2aWdhdGlvbk5vZGVzKToKKyAgICAgICAgc2VsZi51bmlxdWVOYXZpZ2F0aW9uTm9kZXMgPSB1bmlxdWVOYXZpZ2F0aW9uTm9kZXMKKworCisgICAgZGVmIGNvbnN1bWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgc2VsZi5wICs9IDEKKworCisgICAgZGVmIExBKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmdldFR5cGUoc2VsZi5MVChpKSkKKworCisgICAgZGVmIG1hcmsoc2VsZik6CisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKworICAgICAgICBzZWxmLmxhc3RNYXJrZXIgPSBzZWxmLmluZGV4KCkKKyAgICAgICAgcmV0dXJuIHNlbGYubGFzdE1hcmtlcgorCisKKyAgICBkZWYgcmVsZWFzZShzZWxmLCBtYXJrZXI9Tm9uZSk6CisgICAgICAgICMgbm8gcmVzb3VyY2VzIHRvIHJlbGVhc2UKKworICAgICAgICBwYXNzCisKKworICAgIGRlZiBpbmRleChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucAorCisKKyAgICBkZWYgcmV3aW5kKHNlbGYsIG1hcmtlcj1Ob25lKToKKyAgICAgICAgaWYgbWFya2VyIGlzIE5vbmU6CisgICAgICAgICAgICBtYXJrZXIgPSBzZWxmLmxhc3RNYXJrZXIKKworICAgICAgICBzZWxmLnNlZWsobWFya2VyKQorCisKKyAgICBkZWYgc2VlayhzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgc2VsZi5wID0gaW5kZXgKKworCisgICAgZGVmIHB1c2goc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFrZSBzdHJlYW0ganVtcCB0byBhIG5ldyBsb2NhdGlvbiwgc2F2aW5nIG9sZCBsb2NhdGlvbi4KKyAgICAgICAgU3dpdGNoIGJhY2sgd2l0aCBwb3AoKS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5jYWxscy5hcHBlbmQoc2VsZi5wKSAjIHNhdmUgY3VycmVudCBpbmRleAorICAgICAgICBzZWxmLnNlZWsoaW5kZXgpCisKKworICAgIGRlZiBwb3Aoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZWVrIGJhY2sgdG8gcHJldmlvdXMgaW5kZXggc2F2ZWQgZHVyaW5nIGxhc3QgcHVzaCgpIGNhbGwuCisgICAgICAgIFJldHVybiB0b3Agb2Ygc3RhY2sgKHJldHVybiBpbmRleCkuCisgICAgICAgICIiIgorCisgICAgICAgIHJldCA9IHNlbGYuY2FsbHMucG9wKC0xKQorICAgICAgICBzZWxmLnNlZWsocmV0KQorICAgICAgICByZXR1cm4gcmV0CisKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5wID0gMAorICAgICAgICBzZWxmLmxhc3RNYXJrZXIgPSAwCisgICAgICAgIHNlbGYuY2FsbHMgPSBbXQorCisKKyAgICBkZWYgc2l6ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICByZXR1cm4gbGVuKHNlbGYubm9kZXMpCisKKworICAgICMgVFJFRSBSRVdSSVRFIElOVEVSRkFDRQorCisgICAgZGVmIHJlcGxhY2VDaGlsZHJlbihzZWxmLCBwYXJlbnQsIHN0YXJ0Q2hpbGRJbmRleCwgc3RvcENoaWxkSW5kZXgsIHQpOgorICAgICAgICBpZiBwYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFkYXB0b3IucmVwbGFjZUNoaWxkcmVuKAorICAgICAgICAgICAgICAgIHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdAorICAgICAgICAgICAgICAgICkKKworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICIiIlVzZWQgZm9yIHRlc3RpbmcsIGp1c3QgcmV0dXJuIHRoZSB0b2tlbiB0eXBlIHN0cmVhbSIiIgorCisgICAgICAgIGlmIHNlbGYucCA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgcmV0dXJuICcgJy5qb2luKFtzdHIoc2VsZi5hZGFwdG9yLmdldFR5cGUobm9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5ub2RlcworICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgICAgIGlmIHN0YXJ0IGlzIE5vbmUgb3Igc3RvcCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBzZWxmLnAgPT0gLTE6CisgICAgICAgICAgICBzZWxmLmZpbGxCdWZmZXIoKQorCisgICAgICAgICNTeXN0ZW0ub3V0LnByaW50bG4oInN0b3A6ICIrc3RvcCk7CisgICAgICAgICNpZiAoIHN0YXJ0IGluc3RhbmNlb2YgQ29tbW9uVHJlZSApCisgICAgICAgICMgICAgU3lzdGVtLm91dC5wcmludCgidG9TdHJpbmc6ICIrKChDb21tb25UcmVlKXN0YXJ0KS5nZXRUb2tlbigpKyIsICIpOworICAgICAgICAjZWxzZQorICAgICAgICAjICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdGFydCk7CisgICAgICAgICNpZiAoIHN0b3AgaW5zdGFuY2VvZiBDb21tb25UcmVlICkKKyAgICAgICAgIyAgICBTeXN0ZW0ub3V0LnByaW50bG4oKChDb21tb25UcmVlKXN0b3ApLmdldFRva2VuKCkpOworICAgICAgICAjZWxzZQorICAgICAgICAjICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdG9wKTsKKworICAgICAgICAjIGlmIHdlIGhhdmUgdGhlIHRva2VuIHN0cmVhbSwgdXNlIHRoYXQgdG8gZHVtcCB0ZXh0IGluIG9yZGVyCisgICAgICAgIGlmIHNlbGYudG9rZW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYmVnaW5Ub2tlbkluZGV4ID0gc2VsZi5hZGFwdG9yLmdldFRva2VuU3RhcnRJbmRleChzdGFydCkKKyAgICAgICAgICAgIGVuZFRva2VuSW5kZXggPSBzZWxmLmFkYXB0b3IuZ2V0VG9rZW5TdG9wSW5kZXgoc3RvcCkKKworICAgICAgICAgICAgIyBpZiBpdCdzIGEgdHJlZSwgdXNlIHN0YXJ0L3N0b3AgaW5kZXggZnJvbSBzdGFydCBub2RlCisgICAgICAgICAgICAjIGVsc2UgdXNlIHRva2VuIHJhbmdlIGZyb20gc3RhcnQvc3RvcCBub2RlcworICAgICAgICAgICAgaWYgc2VsZi5hZGFwdG9yLmdldFR5cGUoc3RvcCkgPT0gVVA6CisgICAgICAgICAgICAgICAgZW5kVG9rZW5JbmRleCA9IHNlbGYuYWRhcHRvci5nZXRUb2tlblN0b3BJbmRleChzdGFydCkKKworICAgICAgICAgICAgZWxpZiBzZWxmLmFkYXB0b3IuZ2V0VHlwZShzdG9wKSA9PSBFT0Y6CisgICAgICAgICAgICAgICAgZW5kVG9rZW5JbmRleCA9IHNlbGYuc2l6ZSgpIC0yICMgZG9uJ3QgdXNlIEVPRgorCisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbnMudG9TdHJpbmcoYmVnaW5Ub2tlbkluZGV4LCBlbmRUb2tlbkluZGV4KQorCisgICAgICAgICMgd2FsayBub2RlcyBsb29raW5nIGZvciBzdGFydAorICAgICAgICBpLCB0ID0gMCwgTm9uZQorICAgICAgICBmb3IgaSwgdCBpbiBlbnVtZXJhdGUoc2VsZi5ub2Rlcyk6CisgICAgICAgICAgICBpZiB0ID09IHN0YXJ0OgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBub3cgd2FsayB1bnRpbCB3ZSBzZWUgc3RvcCwgZmlsbGluZyBzdHJpbmcgYnVmZmVyIHdpdGggdGV4dAorICAgICAgICBidWYgPSBbXQorICAgICAgICB0ID0gc2VsZi5ub2Rlc1tpXQorICAgICAgICB3aGlsZSB0ICE9IHN0b3A6CisgICAgICAgICAgICB0ZXh0ID0gc2VsZi5hZGFwdG9yLmdldFRleHQodCkKKyAgICAgICAgICAgIGlmIHRleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIiAiICsgc2VsZi5hZGFwdG9yLmdldFR5cGUodCkKKworICAgICAgICAgICAgYnVmLmFwcGVuZCh0ZXh0KQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICB0ID0gc2VsZi5ub2Rlc1tpXQorCisgICAgICAgICMgaW5jbHVkZSBzdG9wIG5vZGUgdG9vCisgICAgICAgIHRleHQgPSBzZWxmLmFkYXB0b3IuZ2V0VGV4dChzdG9wKQorICAgICAgICBpZiB0ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICB0ZXh0ID0gIiAiICtzZWxmLmFkYXB0b3IuZ2V0VHlwZShzdG9wKQorCisgICAgICAgIGJ1Zi5hcHBlbmQodGV4dCkKKworICAgICAgICByZXR1cm4gJycuam9pbihidWYpCisKKworICAgICMjIGl0ZXJhdG9yIGludGVyZmFjZQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wID09IC0xOgorICAgICAgICAgICAgc2VsZi5maWxsQnVmZmVyKCkKKworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLm5vZGVzOgorICAgICAgICAgICAgeWllbGQgbm9kZQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHRyZWUgcGFyc2VyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBUcmVlUGFyc2VyKEJhc2VSZWNvZ25pemVyKToKKyAgICAiIiJAYnJpZWYgQmFzZWNsYXNzIGZvciBnZW5lcmF0ZWQgdHJlZSBwYXJzZXJzLgorCisgICAgQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKKyAgICBvZiB0aGlzLiAgQWxsIHRoZSBlcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGlzIHNoYXJlZCB3aXRoIFBhcnNlciB2aWEKKyAgICB0aGUgQmFzZVJlY29nbml6ZXIgc3VwZXJjbGFzcy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dCwgc3RhdGU9Tm9uZSk6CisgICAgICAgIEJhc2VSZWNvZ25pemVyLl9faW5pdF9fKHNlbGYsIHN0YXRlKQorCisgICAgICAgIHNlbGYuaW5wdXQgPSBOb25lCisgICAgICAgIHNlbGYuc2V0VHJlZU5vZGVTdHJlYW0oaW5wdXQpCisKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgQmFzZVJlY29nbml6ZXIucmVzZXQoc2VsZikgIyByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKKyAgICAgICAgaWYgc2VsZi5pbnB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5wdXQuc2VlaygwKSAjIHJld2luZCB0aGUgaW5wdXQKKworCisgICAgZGVmIHNldFRyZWVOb2RlU3RyZWFtKHNlbGYsIGlucHV0KToKKyAgICAgICAgIiIiU2V0IHRoZSBpbnB1dCBzdHJlYW0iIiIKKworICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKworCisgICAgZGVmIGdldFRyZWVOb2RlU3RyZWFtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dAorCisKKyAgICBkZWYgZ2V0U291cmNlTmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5wdXQuZ2V0U291cmNlTmFtZSgpCisKKworICAgIGRlZiBnZXRDdXJyZW50SW5wdXRTeW1ib2woc2VsZiwgaW5wdXQpOgorICAgICAgICByZXR1cm4gaW5wdXQuTFQoMSkKKworCisgICAgZGVmIGdldE1pc3NpbmdTeW1ib2woc2VsZiwgaW5wdXQsIGUsIGV4cGVjdGVkVG9rZW5UeXBlLCBmb2xsb3cpOgorICAgICAgICB0b2tlblRleHQgPSAiPG1pc3NpbmcgIiArIHNlbGYudG9rZW5OYW1lc1tleHBlY3RlZFRva2VuVHlwZV0gKyAiPiIKKyAgICAgICAgYWRhcHRvciA9IGlucHV0LmFkYXB0b3IKKyAgICAgICAgcmV0dXJuIGFkYXB0b3IuY3JlYXRlVG9rZW4oCisgICAgICAgICAgICBDb21tb25Ub2tlbih0eXBlPWV4cGVjdGVkVG9rZW5UeXBlLCB0ZXh0PXRva2VuVGV4dCkpCisKKworICAgICMgcHJlY29tcGlsZWQgcmVnZXggdXNlZCBieSBpbkNvbnRleHQKKyAgICBkb3Rkb3QgPSAiLipbXi5dXFwuXFwuW14uXS4qIgorICAgIGRvdWJsZUV0YyA9ICIuKlxcLlxcLlxcLlxccytcXC5cXC5cXC4uKiIKKyAgICBkb3Rkb3RQYXR0ZXJuID0gcmUuY29tcGlsZShkb3Rkb3QpCisgICAgZG91YmxlRXRjUGF0dGVybiA9IHJlLmNvbXBpbGUoZG91YmxlRXRjKQorCisgICAgZGVmIGluQ29udGV4dChzZWxmLCBjb250ZXh0LCBhZGFwdG9yPU5vbmUsIHRva2VuTmFtZT1Ob25lLCB0PU5vbmUpOgorICAgICAgICAiIiJDaGVjayBpZiBjdXJyZW50IG5vZGUgaW4gaW5wdXQgaGFzIGEgY29udGV4dC4KKworICAgICAgICBDb250ZXh0IG1lYW5zIHNlcXVlbmNlIG9mIG5vZGVzIHRvd2FyZHMgcm9vdCBvZiB0cmVlLiAgRm9yIGV4YW1wbGUsCisgICAgICAgIHlvdSBtaWdodCBzYXkgY29udGV4dCBpcyAiTVVMVCIgd2hpY2ggbWVhbnMgbXkgcGFyZW50IG11c3QgYmUgTVVMVC4KKyAgICAgICAgIkNMQVNTIFZBUkRFRiIgc2F5cyBjdXJyZW50IG5vZGUgbXVzdCBiZSBjaGlsZCBvZiBhIFZBUkRFRiBhbmQgd2hvc2UKKyAgICAgICAgcGFyZW50IGlzIGEgQ0xBU1Mgbm9kZS4gIFlvdSBjYW4gdXNlICIuLi4iIHRvIG1lYW4gemVyby1vci1tb3JlIG5vZGVzLgorICAgICAgICAiTUVUSE9EIC4uLiBWQVJERUYiIG1lYW5zIG15IHBhcmVudCBpcyBWQVJERUYgYW5kIHNvbWV3aGVyZSBhYm92ZQorICAgICAgICB0aGF0IGlzIGEgTUVUSE9EIG5vZGUuICBUaGUgZmlyc3Qgbm9kZSBpbiB0aGUgY29udGV4dCBpcyBub3QKKyAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHJvb3QuICBUaGUgY29udGV4dCBtYXRjaGVyIHN0b3BzIG1hdGNoaW5nIGFuZCByZXR1cm5zCisgICAgICAgIHRydWUgd2hlbiBpdCBydW5zIG91dCBvZiBjb250ZXh0LiAgVGhlcmUgaXMgbm8gd2F5IHRvIGZvcmNlIHRoZSBmaXJzdAorICAgICAgICBub2RlIHRvIGJlIHRoZSByb290LgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gX2luQ29udGV4dCgKKyAgICAgICAgICAgIHNlbGYuaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKSwgc2VsZi5nZXRUb2tlbk5hbWVzKCksCisgICAgICAgICAgICBzZWxmLmlucHV0LkxUKDEpLCBjb250ZXh0KQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9pbkNvbnRleHQoY2xzLCBhZGFwdG9yLCB0b2tlbk5hbWVzLCB0LCBjb250ZXh0KToKKyAgICAgICAgIiIiVGhlIHdvcmtlciBmb3IgaW5Db250ZXh0LgorCisgICAgICAgIEl0J3Mgc3RhdGljIGFuZCBmdWxsIG9mIHBhcmFtZXRlcnMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGNscy5kb3Rkb3RQYXR0ZXJuLm1hdGNoKGNvbnRleHQpOgorICAgICAgICAgICAgIyBkb24ndCBhbGxvdyAiLi4iLCBtdXN0IGJlICIuLi4iCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIHN5bnRheDogLi4iKQorCisgICAgICAgIGlmIGNscy5kb3VibGVFdGNQYXR0ZXJuLm1hdGNoKGNvbnRleHQpOgorICAgICAgICAgICAgIyBkb24ndCBhbGxvdyBkb3VibGUgIi4uLiIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgc3ludGF4OiAuLi4gLi4uIikKKworICAgICAgICAjIGVuc3VyZSBzcGFjZXMgYXJvdW5kIC4uLgorICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKCIuLi4iLCAiIC4uLiAiKQorICAgICAgICBjb250ZXh0ID0gY29udGV4dC5zdHJpcCgpCisgICAgICAgIG5vZGVzID0gY29udGV4dC5zcGxpdCgpCisKKyAgICAgICAgbmkgPSBsZW4obm9kZXMpIC0gMQorICAgICAgICB0ID0gYWRhcHRvci5nZXRQYXJlbnQodCkKKyAgICAgICAgd2hpbGUgbmkgPj0gMCBhbmQgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vZGVzW25pXSA9PSAiLi4uIjoKKyAgICAgICAgICAgICAgICAjIHdhbGsgdXB3YXJkcyB1bnRpbCB3ZSBzZWUgbm9kZXNbbmktMV0gdGhlbiBjb250aW51ZSB3YWxraW5nCisgICAgICAgICAgICAgICAgaWYgbmkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyAuLi4gYXQgc3RhcnQgaXMgbm8tb3AKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBnb2FsID0gbm9kZXNbbmktMV0KKyAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGNscy5fZ2V0QW5jZXN0b3IoYWRhcHRvciwgdG9rZW5OYW1lcywgdCwgZ29hbCkKKyAgICAgICAgICAgICAgICBpZiBhbmNlc3RvciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICB0ID0gYW5jZXN0b3IKKyAgICAgICAgICAgICAgICBuaSAtPSAxCisKKyAgICAgICAgICAgIG5hbWUgPSB0b2tlbk5hbWVzW2FkYXB0b3IuZ2V0VHlwZSh0KV0KKyAgICAgICAgICAgIGlmIG5hbWUgIT0gbm9kZXNbbmldOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICAjIGFkdmFuY2UgdG8gcGFyZW50IGFuZCB0byBwcmV2aW91cyBlbGVtZW50IGluIGNvbnRleHQgbm9kZSBsaXN0CisgICAgICAgICAgICBuaSAtPSAxCisgICAgICAgICAgICB0ID0gYWRhcHRvci5nZXRQYXJlbnQodCkKKworICAgICAgICAjIGF0IHJvb3QgYnV0IG1vcmUgbm9kZXMgdG8gbWF0Y2gKKyAgICAgICAgaWYgdCBpcyBOb25lIGFuZCBuaSA+PSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2dldEFuY2VzdG9yKGFkYXB0b3IsIHRva2VuTmFtZXMsIHQsIGdvYWwpOgorICAgICAgICAiIiJIZWxwZXIgZm9yIHN0YXRpYyBpbkNvbnRleHQuIiIiCisgICAgICAgIHdoaWxlIHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuYW1lID0gdG9rZW5OYW1lc1thZGFwdG9yLmdldFR5cGUodCldCisgICAgICAgICAgICBpZiBuYW1lID09IGdvYWw6CisgICAgICAgICAgICAgICAgcmV0dXJuIHQKKyAgICAgICAgICAgIHQgPSBhZGFwdG9yLmdldFBhcmVudCh0KQorCisgICAgICAgIHJldHVybiBOb25lCisKKworICAgIGRlZiBtYXRjaEFueShzZWxmLCBpZ25vcmUpOiAjIGlnbm9yZSBzdHJlYW0sIGNvcHkgb2YgdGhpcy5pbnB1dAorICAgICAgICAiIiIKKyAgICAgICAgTWF0Y2ggJy4nIGluIHRyZWUgcGFyc2VyIGhhcyBzcGVjaWFsIG1lYW5pbmcuICBTa2lwIG5vZGUgb3IKKyAgICAgICAgZW50aXJlIHRyZWUgaWYgbm9kZSBoYXMgY2hpbGRyZW4uICBJZiBjaGlsZHJlbiwgc2NhbiB1bnRpbAorICAgICAgICBjb3JyZXNwb25kaW5nIFVQIG5vZGUuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuX3N0YXRlLmVycm9yUmVjb3ZlcnkgPSBGYWxzZQorCisgICAgICAgIGxvb2sgPSBzZWxmLmlucHV0LkxUKDEpCisgICAgICAgIGlmIHNlbGYuaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRDaGlsZENvdW50KGxvb2spID09IDA6CisgICAgICAgICAgICBzZWxmLmlucHV0LmNvbnN1bWUoKSAjIG5vdCBzdWJ0cmVlLCBjb25zdW1lIDEgbm9kZSBhbmQgcmV0dXJuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIGN1cnJlbnQgbm9kZSBpcyBhIHN1YnRyZWUsIHNraXAgdG8gY29ycmVzcG9uZGluZyBVUC4KKyAgICAgICAgIyBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCisgICAgICAgIGxldmVsID0gMAorICAgICAgICB0b2tlblR5cGUgPSBzZWxmLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VHlwZShsb29rKQorICAgICAgICB3aGlsZSB0b2tlblR5cGUgIT0gRU9GIGFuZCBub3QgKHRva2VuVHlwZSA9PSBVUCBhbmQgbGV2ZWw9PTApOgorICAgICAgICAgICAgc2VsZi5pbnB1dC5jb25zdW1lKCkKKyAgICAgICAgICAgIGxvb2sgPSBzZWxmLmlucHV0LkxUKDEpCisgICAgICAgICAgICB0b2tlblR5cGUgPSBzZWxmLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VHlwZShsb29rKQorICAgICAgICAgICAgaWYgdG9rZW5UeXBlID09IERPV046CisgICAgICAgICAgICAgICAgbGV2ZWwgKz0gMQorCisgICAgICAgICAgICBlbGlmIHRva2VuVHlwZSA9PSBVUDoKKyAgICAgICAgICAgICAgICBsZXZlbCAtPSAxCisKKyAgICAgICAgc2VsZi5pbnB1dC5jb25zdW1lKCkgIyBjb25zdW1lIFVQCisKKworICAgIGRlZiBtaXNtYXRjaChzZWxmLCBpbnB1dCwgdHR5cGUsIGZvbGxvdyk6CisgICAgICAgICIiIgorICAgICAgICBXZSBoYXZlIERPV04vVVAgbm9kZXMgaW4gdGhlIHN0cmVhbSB0aGF0IGhhdmUgbm8gbGluZSBpbmZvOyBvdmVycmlkZS4KKyAgICAgICAgcGx1cyB3ZSB3YW50IHRvIGFsdGVyIHRoZSBleGNlcHRpb24gdHlwZS4gRG9uJ3QgdHJ5IHRvIHJlY292ZXIKKyAgICAgICAgZnJvbSB0cmVlIHBhcnNlciBlcnJvcnMgaW5saW5lLi4uCisgICAgICAgICIiIgorCisgICAgICAgIHJhaXNlIE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpCisKKworICAgIGRlZiBnZXRFcnJvckhlYWRlcihzZWxmLCBlKToKKyAgICAgICAgIiIiCisgICAgICAgIFByZWZpeCBlcnJvciBtZXNzYWdlIHdpdGggdGhlIGdyYW1tYXIgbmFtZSBiZWNhdXNlIG1lc3NhZ2UgaXMKKyAgICAgICAgYWx3YXlzIGludGVuZGVkIGZvciB0aGUgcHJvZ3JhbW1lciBiZWNhdXNlIHRoZSBwYXJzZXIgYnVpbHQKKyAgICAgICAgdGhlIGlucHV0IHRyZWUgbm90IHRoZSB1c2VyLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gKHNlbGYuZ2V0R3JhbW1hckZpbGVOYW1lKCkgKworICAgICAgICAgICAgICAgICI6IG5vZGUgZnJvbSAlc2xpbmUgJXM6JXMiCisgICAgICAgICAgICAgICAgJSAoWycnLCAiYWZ0ZXIgIl1bZS5hcHByb3hpbWF0ZUxpbmVJbmZvXSwKKyAgICAgICAgICAgICAgICAgICBlLmxpbmUsCisgICAgICAgICAgICAgICAgICAgZS5jaGFyUG9zaXRpb25JbkxpbmUKKyAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGdldEVycm9yTWVzc2FnZShzZWxmLCBlLCB0b2tlbk5hbWVzKToKKyAgICAgICAgIiIiCisgICAgICAgIFRyZWUgcGFyc2VycyBwYXJzZSBub2RlcyB0aGV5IHVzdWFsbHkgaGF2ZSBhIHRva2VuIG9iamVjdCBhcworICAgICAgICBwYXlsb2FkLiBTZXQgdGhlIGV4Y2VwdGlvbiB0b2tlbiBhbmQgZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZiwgVHJlZVBhcnNlcik6CisgICAgICAgICAgICBhZGFwdG9yID0gZS5pbnB1dC5nZXRUcmVlQWRhcHRvcigpCisgICAgICAgICAgICBlLnRva2VuID0gYWRhcHRvci5nZXRUb2tlbihlLm5vZGUpCisgICAgICAgICAgICBpZiBlLnRva2VuIGlzIG5vdCBOb25lOiAjIGNvdWxkIGJlIGFuIFVQL0RPV04gbm9kZQorICAgICAgICAgICAgICAgIGUudG9rZW4gPSBDb21tb25Ub2tlbigKKyAgICAgICAgICAgICAgICAgICAgdHlwZT1hZGFwdG9yLmdldFR5cGUoZS5ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgdGV4dD1hZGFwdG9yLmdldFRleHQoZS5ub2RlKQorICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgcmV0dXJuIEJhc2VSZWNvZ25pemVyLmdldEVycm9yTWVzc2FnZShzZWxmLCBlLCB0b2tlbk5hbWVzKQorCisKKyAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgQmFzZVJlY29nbml6ZXIudHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4LCBzZWxmLmlucHV0LkxUKDEpKQorCisKKyAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgIEJhc2VSZWNvZ25pemVyLnRyYWNlT3V0KHNlbGYsIHJ1bGVOYW1lLCBydWxlSW5kZXgsIHNlbGYuaW5wdXQuTFQoMSkpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdHJlZSB2aXNpdG9yCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBUcmVlVmlzaXRvcihvYmplY3QpOgorICAgICIiIkRvIGEgZGVwdGggZmlyc3Qgd2FsayBvZiBhIHRyZWUsIGFwcGx5aW5nIHByZSgpIGFuZCBwb3N0KCkgYWN0aW9ucworICAgIHdlIGdvLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkYXB0b3I9Tm9uZSk6CisgICAgICAgIGlmIGFkYXB0b3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFkYXB0b3IgPSBhZGFwdG9yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisKKyAgICBkZWYgdmlzaXQoc2VsZiwgdCwgcHJlX2FjdGlvbj1Ob25lLCBwb3N0X2FjdGlvbj1Ob25lKToKKyAgICAgICAgIiIiVmlzaXQgZXZlcnkgbm9kZSBpbiB0cmVlIHQgYW5kIHRyaWdnZXIgYW4gYWN0aW9uIGZvciBlYWNoIG5vZGUKKyAgICAgICAgYmVmb3JlL2FmdGVyIGhhdmluZyB2aXNpdGVkIGFsbCBvZiBpdHMgY2hpbGRyZW4uICBCb3R0b20gdXAgd2Fsay4KKyAgICAgICAgRXhlY3V0ZSBib3RoIGFjdGlvbnMgZXZlbiBpZiB0IGhhcyBubyBjaGlsZHJlbi4gIElnbm9yZSByZXR1cm4KKyAgICAgICAgcmVzdWx0cyBmcm9tIHRyYW5zZm9ybWluZyBjaGlsZHJlbiBzaW5jZSB0aGV5IHdpbGwgaGF2ZSBhbHRlcmVkCisgICAgICAgIHRoZSBjaGlsZCBsaXN0IG9mIHRoaXMgbm9kZSAodGhlaXIgcGFyZW50KS4gIFJldHVybiByZXN1bHQgb2YKKyAgICAgICAgYXBwbHlpbmcgcG9zdCBhY3Rpb24gdG8gdGhpcyBub2RlLgorCisgICAgICAgIFRoZSBQeXRob24gdmVyc2lvbiBkaWZmZXJzIGZyb20gdGhlIEphdmEgdmVyc2lvbiBieSB0YWtpbmcgdHdvCisgICAgICAgIGNhbGxhYmxlcyAncHJlX2FjdGlvbicgYW5kICdwb3N0X2FjdGlvbicgaW5zdGVhZCBvZiBhIGNsYXNzIGluc3RhbmNlCisgICAgICAgIHRoYXQgd3JhcHMgdGhvc2UgbWV0aG9kcy4gVGhvc2UgY2FsbGFibGVzIG11c3QgYWNjZXB0IGEgVHJlZU5vZGUgYXMKKyAgICAgICAgdGhlaXIgc2luZ2xlIGFyZ3VtZW50IGFuZCByZXR1cm4gdGhlIChwb3RlbnRpYWxseSB0cmFuc2Zvcm1lZCBvcgorICAgICAgICByZXBsYWNlZCkgVHJlZU5vZGUuCisgICAgICAgICIiIgorCisgICAgICAgIGlzTmlsID0gc2VsZi5hZGFwdG9yLmlzTmlsKHQpCisgICAgICAgIGlmIHByZV9hY3Rpb24gaXMgbm90IE5vbmUgYW5kIG5vdCBpc05pbDoKKyAgICAgICAgICAgICMgaWYgcmV3cml0dGVuLCB3YWxrIGNoaWxkcmVuIG9mIG5ldyB0CisgICAgICAgICAgICB0ID0gcHJlX2FjdGlvbih0KQorCisgICAgICAgIGlkeCA9IDAKKyAgICAgICAgd2hpbGUgaWR4IDwgc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQodCk6CisgICAgICAgICAgICBjaGlsZCA9IHNlbGYuYWRhcHRvci5nZXRDaGlsZCh0LCBpZHgpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGNoaWxkLCBwcmVfYWN0aW9uLCBwb3N0X2FjdGlvbikKKyAgICAgICAgICAgIGlkeCArPSAxCisKKyAgICAgICAgaWYgcG9zdF9hY3Rpb24gaXMgbm90IE5vbmUgYW5kIG5vdCBpc05pbDoKKyAgICAgICAgICAgIHQgPSBwb3N0X2FjdGlvbih0KQorCisgICAgICAgIHJldHVybiB0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHRyZWUgaXRlcmF0b3IKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFRyZWVJdGVyYXRvcihvYmplY3QpOgorICAgICIiIgorICAgIFJldHVybiBhIG5vZGUgc3RyZWFtIGZyb20gYSBkb3VibHktbGlua2VkIHRyZWUgd2hvc2Ugbm9kZXMKKyAgICBrbm93IHdoYXQgY2hpbGQgaW5kZXggdGhleSBhcmUuCisKKyAgICBFbWl0IG5hdmlnYXRpb24gbm9kZXMgKERPV04sIFVQLCBhbmQgRU9GKSB0byBsZXQgc2hvdyB0cmVlIHN0cnVjdHVyZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlLCBhZGFwdG9yPU5vbmUpOgorICAgICAgICBpZiBhZGFwdG9yIGlzIE5vbmU6CisgICAgICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorCisgICAgICAgIHNlbGYucm9vdCA9IHRyZWUKKyAgICAgICAgc2VsZi5hZGFwdG9yID0gYWRhcHRvcgorCisgICAgICAgIHNlbGYuZmlyc3RfdGltZSA9IFRydWUKKyAgICAgICAgc2VsZi50cmVlID0gdHJlZQorCisgICAgICAgICMgSWYgd2UgZW1pdCBVUC9ET1dOIG5vZGVzLCB3ZSBuZWVkIHRvIHNwaXQgb3V0IG11bHRpcGxlIG5vZGVzIHBlcgorICAgICAgICAjIG5leHQoKSBjYWxsLgorICAgICAgICBzZWxmLm5vZGVzID0gW10KKworICAgICAgICAjIG5hdmlnYXRpb24gbm9kZXMgdG8gcmV0dXJuIGR1cmluZyB3YWxrIGFuZCBhdCBlbmQKKyAgICAgICAgc2VsZi5kb3duID0gYWRhcHRvci5jcmVhdGVGcm9tVHlwZShET1dOLCAiRE9XTiIpCisgICAgICAgIHNlbGYudXAgPSBhZGFwdG9yLmNyZWF0ZUZyb21UeXBlKFVQLCAiVVAiKQorICAgICAgICBzZWxmLmVvZiA9IGFkYXB0b3IuY3JlYXRlRnJvbVR5cGUoRU9GLCAiRU9GIikKKworCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmZpcnN0X3RpbWUgPSBUcnVlCisgICAgICAgIHNlbGYudHJlZSA9IHNlbGYucm9vdAorICAgICAgICBzZWxmLm5vZGVzID0gW10KKworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisKKyAgICBkZWYgaGFzX25leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmlyc3RfdGltZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJvb3QgaXMgbm90IE5vbmUKKworICAgICAgICBpZiBsZW4oc2VsZi5ub2RlcykgPiAwOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBpZiBzZWxmLnRyZWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHNlbGYuYWRhcHRvci5nZXRDaGlsZENvdW50KHNlbGYudHJlZSkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAjIGJhY2sgYXQgcm9vdD8KKyAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5nZXRQYXJlbnQoc2VsZi50cmVlKSBpcyBub3QgTm9uZQorCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX25leHQoKToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICBpZiBzZWxmLmZpcnN0X3RpbWU6CisgICAgICAgICAgICAjIGluaXRpYWwgY29uZGl0aW9uCisgICAgICAgICAgICBzZWxmLmZpcnN0X3RpbWUgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQoc2VsZi50cmVlKSA9PSAwOgorICAgICAgICAgICAgICAgICMgc2luZ2xlIG5vZGUgdHJlZSAoc3BlY2lhbCkKKyAgICAgICAgICAgICAgICBzZWxmLm5vZGVzLmFwcGVuZChzZWxmLmVvZikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50cmVlCisKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyZWUKKworICAgICAgICAjIGlmIGFueSBxdWV1ZWQgdXAsIHVzZSB0aG9zZSBmaXJzdAorICAgICAgICBpZiBsZW4oc2VsZi5ub2RlcykgPiAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubm9kZXMucG9wKDApCisKKyAgICAgICAgIyBubyBub2RlcyBsZWZ0PworICAgICAgICBpZiBzZWxmLnRyZWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmVvZgorCisgICAgICAgICMgbmV4dCBub2RlIHdpbGwgYmUgY2hpbGQgMCBpZiBhbnkgY2hpbGRyZW4KKyAgICAgICAgaWYgc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQoc2VsZi50cmVlKSA+IDA6CisgICAgICAgICAgICBzZWxmLnRyZWUgPSBzZWxmLmFkYXB0b3IuZ2V0Q2hpbGQoc2VsZi50cmVlLCAwKQorICAgICAgICAgICAgIyByZWFsIG5vZGUgaXMgbmV4dCBhZnRlciBET1dOCisgICAgICAgICAgICBzZWxmLm5vZGVzLmFwcGVuZChzZWxmLnRyZWUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5kb3duCisKKyAgICAgICAgIyBpZiBubyBjaGlsZHJlbiwgbG9vayBmb3IgbmV4dCBzaWJsaW5nIG9mIHRyZWUgb3IgYW5jZXN0b3IKKyAgICAgICAgcGFyZW50ID0gc2VsZi5hZGFwdG9yLmdldFBhcmVudChzZWxmLnRyZWUpCisgICAgICAgICMgd2hpbGUgd2UncmUgb3V0IG9mIHNpYmxpbmdzLCBrZWVwIHBvcHBpbmcgYmFjayB1cCB0b3dhcmRzIHJvb3QKKyAgICAgICAgd2hpbGUgKHBhcmVudCBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgYW5kIHNlbGYuYWRhcHRvci5nZXRDaGlsZEluZGV4KHNlbGYudHJlZSkrMSA+PSBzZWxmLmFkYXB0b3IuZ2V0Q2hpbGRDb3VudChwYXJlbnQpKToKKyAgICAgICAgICAgICMgd2UncmUgbW92aW5nIGJhY2sgdXAKKyAgICAgICAgICAgIHNlbGYubm9kZXMuYXBwZW5kKHNlbGYudXApCisgICAgICAgICAgICBzZWxmLnRyZWUgPSBwYXJlbnQKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYuYWRhcHRvci5nZXRQYXJlbnQoc2VsZi50cmVlKQorCisgICAgICAgICMgbm8gbm9kZXMgbGVmdD8KKyAgICAgICAgaWYgcGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRyZWUgPSBOb25lICMgYmFjayBhdCByb290PyBub3RoaW5nIGxlZnQgdGhlbgorICAgICAgICAgICAgc2VsZi5ub2Rlcy5hcHBlbmQoc2VsZi5lb2YpICMgYWRkIHRvIHF1ZXVlLCBtaWdodCBoYXZlIFVQIG5vZGVzIGluIHRoZXJlCisgICAgICAgICAgICByZXR1cm4gc2VsZi5ub2Rlcy5wb3AoMCkKKworICAgICAgICAjIG11c3QgaGF2ZSBmb3VuZCBhIG5vZGUgd2l0aCBhbiB1bnZpc2l0ZWQgc2libGluZworICAgICAgICAjIG1vdmUgdG8gaXQgYW5kIHJldHVybiBpdAorICAgICAgICBuZXh0U2libGluZ0luZGV4ID0gc2VsZi5hZGFwdG9yLmdldENoaWxkSW5kZXgoc2VsZi50cmVlKSArIDEKKyAgICAgICAgc2VsZi50cmVlID0gc2VsZi5hZGFwdG9yLmdldENoaWxkKHBhcmVudCwgbmV4dFNpYmxpbmdJbmRleCkKKyAgICAgICAgc2VsZi5ub2Rlcy5hcHBlbmQoc2VsZi50cmVlKSAjIGFkZCB0byBxdWV1ZSwgbWlnaHQgaGF2ZSBVUCBub2RlcyBpbiB0aGVyZQorICAgICAgICByZXR1cm4gc2VsZi5ub2Rlcy5wb3AoMCkKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHN0cmVhbXMgZm9yIHJ1bGUgcmV3cml0aW5nCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0ob2JqZWN0KToKKyAgICAiIiJAYnJpZWYgSW50ZXJuYWwgaGVscGVyIGNsYXNzLgorCisgICAgQSBnZW5lcmljIGxpc3Qgb2YgZWxlbWVudHMgdHJhY2tlZCBpbiBhbiBhbHRlcm5hdGl2ZSB0byBiZSB1c2VkIGluCisgICAgYSAtPiByZXdyaXRlIHJ1bGUuICBXZSBuZWVkIHRvIHN1YmNsYXNzIHRvIGZpbGwgaW4gdGhlIG5leHQoKSBtZXRob2QsCisgICAgd2hpY2ggcmV0dXJucyBlaXRoZXIgYW4gQVNUIG5vZGUgd3JhcHBlZCBhcm91bmQgYSB0b2tlbiBwYXlsb2FkIG9yCisgICAgYW4gZXhpc3Rpbmcgc3VidHJlZS4KKworICAgIE9uY2UgeW91IHN0YXJ0IG5leHQoKWluZywgZG8gbm90IHRyeSB0byBhZGQgbW9yZSBlbGVtZW50cy4gIEl0IHdpbGwKKyAgICBicmVhayB0aGUgY3Vyc29yIHRyYWNraW5nIEkgYmVsaWV2ZS4KKworICAgIEBzZWUgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0KKyAgICBAc2VlIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVUb2tlblN0cmVhbQorCisgICAgVE9ETzogYWRkIG1lY2hhbmlzbSB0byBkZXRlY3QvcHVrZSBvbiBtb2RpZmljYXRpb24gYWZ0ZXIgcmVhZGluZyBmcm9tCisgICAgc3RyZWFtCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRhcHRvciwgZWxlbWVudERlc2NyaXB0aW9uLCBlbGVtZW50cz1Ob25lKToKKyAgICAgICAgIyBDdXJzb3IgMC4ubi0xLiAgSWYgc2luZ2xlRWxlbWVudCE9bnVsbCwgY3Vyc29yIGlzIDAgdW50aWwgeW91IG5leHQoKSwKKyAgICAgICAgIyB3aGljaCBidW1wcyBpdCB0byAxIG1lYW5pbmcgbm8gbW9yZSBlbGVtZW50cy4KKyAgICAgICAgc2VsZi5jdXJzb3IgPSAwCisKKyAgICAgICAgIyBUcmFjayBzaW5nbGUgZWxlbWVudHMgdy9vIGNyZWF0aW5nIGEgbGlzdC4gIFVwb24gMm5kIGFkZCwgYWxsb2MgbGlzdAorICAgICAgICBzZWxmLnNpbmdsZUVsZW1lbnQgPSBOb25lCisKKyAgICAgICAgIyBUaGUgbGlzdCBvZiB0b2tlbnMgb3Igc3VidHJlZXMgd2UgYXJlIHRyYWNraW5nCisgICAgICAgIHNlbGYuZWxlbWVudHMgPSBOb25lCisKKyAgICAgICAgIyBPbmNlIGEgbm9kZSAvIHN1YnRyZWUgaGFzIGJlZW4gdXNlZCBpbiBhIHN0cmVhbSwgaXQgbXVzdCBiZSBkdXAnZAorICAgICAgICAjIGZyb20gdGhlbiBvbi4gIFN0cmVhbXMgYXJlIHJlc2V0IGFmdGVyIHN1YnJ1bGVzIHNvIHRoYXQgdGhlIHN0cmVhbXMKKyAgICAgICAgIyBjYW4gYmUgcmV1c2VkIGluIGZ1dHVyZSBzdWJydWxlcy4gIFNvLCByZXNldCBtdXN0IHNldCBhIGRpcnR5IGJpdC4KKyAgICAgICAgIyBJZiBkaXJ0eSwgdGhlbiBuZXh0KCkgYWx3YXlzIHJldHVybnMgYSBkdXAuCisgICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQorCisgICAgICAgICMgVGhlIGVsZW1lbnQgb3Igc3RyZWFtIGRlc2NyaXB0aW9uOyB1c3VhbGx5IGhhcyBuYW1lIG9mIHRoZSB0b2tlbiBvcgorICAgICAgICAjIHJ1bGUgcmVmZXJlbmNlIHRoYXQgdGhpcyBsaXN0IHRyYWNrcy4gIENhbiBpbmNsdWRlIHJ1bGVuYW1lIHRvbywgYnV0CisgICAgICAgICMgdGhlIGV4Y2VwdGlvbiB3b3VsZCB0cmFjayB0aGF0IGluZm8uCisgICAgICAgIHNlbGYuZWxlbWVudERlc2NyaXB0aW9uID0gZWxlbWVudERlc2NyaXB0aW9uCisKKyAgICAgICAgc2VsZi5hZGFwdG9yID0gYWRhcHRvcgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudHMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgIyBDcmVhdGUgYSBzdHJlYW0sIGJ1dCBmZWVkIG9mZiBhbiBleGlzdGluZyBsaXN0CisgICAgICAgICAgICBzZWxmLnNpbmdsZUVsZW1lbnQgPSBOb25lCisgICAgICAgICAgICBzZWxmLmVsZW1lbnRzID0gZWxlbWVudHMKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBDcmVhdGUgYSBzdHJlYW0gd2l0aCBvbmUgZWxlbWVudAorICAgICAgICAgICAgc2VsZi5hZGQoZWxlbWVudHMpCisKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlc2V0IHRoZSBjb25kaXRpb24gb2YgdGhpcyBzdHJlYW0gc28gdGhhdCBpdCBhcHBlYXJzIHdlIGhhdmUKKyAgICAgICAgbm90IGNvbnN1bWVkIGFueSBvZiBpdHMgZWxlbWVudHMuICBFbGVtZW50cyB0aGVtc2VsdmVzIGFyZSB1bnRvdWNoZWQuCisgICAgICAgIE9uY2Ugd2UgcmVzZXQgdGhlIHN0cmVhbSwgYW55IGZ1dHVyZSB1c2Ugd2lsbCBuZWVkIGR1cGxpY2F0ZXMuICBTZXQKKyAgICAgICAgdGhlIGRpcnR5IGJpdC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5jdXJzb3IgPSAwCisgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCisKKworICAgIGRlZiBhZGQoc2VsZiwgZWwpOgorICAgICAgICBpZiBlbCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5lbGVtZW50cyBpcyBub3QgTm9uZTogIyBpZiBpbiBsaXN0LCBqdXN0IGFkZAorICAgICAgICAgICAgc2VsZi5lbGVtZW50cy5hcHBlbmQoZWwpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLnNpbmdsZUVsZW1lbnQgaXMgTm9uZTogIyBubyBlbGVtZW50cyB5ZXQsIHRyYWNrIHcvbyBsaXN0CisgICAgICAgICAgICBzZWxmLnNpbmdsZUVsZW1lbnQgPSBlbAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBhZGRpbmcgMm5kIGVsZW1lbnQsIG1vdmUgdG8gbGlzdAorICAgICAgICBzZWxmLmVsZW1lbnRzID0gW10KKyAgICAgICAgc2VsZi5lbGVtZW50cy5hcHBlbmQoc2VsZi5zaW5nbGVFbGVtZW50KQorICAgICAgICBzZWxmLnNpbmdsZUVsZW1lbnQgPSBOb25lCisgICAgICAgIHNlbGYuZWxlbWVudHMuYXBwZW5kKGVsKQorCisKKyAgICBkZWYgbmV4dFRyZWUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLiAgSWYgb3V0IG9mIGVsZW1lbnRzLCB0aHJvdworICAgICAgICBhbiBleGNlcHRpb24gdW5sZXNzIHNpemUoKT09MS4gIElmIHNpemUgaXMgMSwgdGhlbiByZXR1cm4gZWxlbWVudHNbMF0uCisKKyAgICAgICAgUmV0dXJuIGEgZHVwbGljYXRlIG5vZGUvc3VidHJlZSBpZiBzdHJlYW0gaXMgb3V0IG9mIGVsZW1lbnRzIGFuZAorICAgICAgICBzaXplPT0xLiBJZiB3ZSd2ZSBhbHJlYWR5IHVzZWQgdGhlIGVsZW1lbnQsIGR1cCAoZGlydHkgYml0IHNldCkuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIChzZWxmLmRpcnR5CisgICAgICAgICAgICBvciAoc2VsZi5jdXJzb3IgPj0gbGVuKHNlbGYpIGFuZCBsZW4oc2VsZikgPT0gMSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAjIGlmIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZSBpcyAxLCBkdXAKKyAgICAgICAgICAgIGVsID0gc2VsZi5fbmV4dCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5kdXAoZWwpCisKKyAgICAgICAgIyB0ZXN0IHNpemUgYWJvdmUgdGhlbiBmZXRjaAorICAgICAgICBlbCA9IHNlbGYuX25leHQoKQorICAgICAgICByZXR1cm4gZWwKKworCisgICAgZGVmIF9uZXh0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgZG8gdGhlIHdvcmsgb2YgZ2V0dGluZyB0aGUgbmV4dCBlbGVtZW50LCBtYWtpbmcgc3VyZSB0aGF0IGl0J3MKKyAgICAgICAgYSB0cmVlIG5vZGUgb3Igc3VidHJlZS4gIERlYWwgd2l0aCB0aGUgb3B0aW1pemF0aW9uIG9mIHNpbmdsZS0KKyAgICAgICAgZWxlbWVudCBsaXN0IHZlcnN1cyBsaXN0IG9mIHNpemUgPiAxLiAgVGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgIGlmIHRoZSBzdHJlYW0gaXMgZW1wdHkgb3Igd2UncmUgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplPjEuCisgICAgICAgIHByb3RlY3RlZCBzbyB5b3UgY2FuIG92ZXJyaWRlIGluIGEgc3ViY2xhc3MgaWYgbmVjZXNzYXJ5LgorICAgICAgICAiIiIKKworICAgICAgICBpZiBsZW4oc2VsZikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbihzZWxmLmVsZW1lbnREZXNjcmlwdGlvbikKKworICAgICAgICBpZiBzZWxmLmN1cnNvciA+PSBsZW4oc2VsZik6ICMgb3V0IG9mIGVsZW1lbnRzPworICAgICAgICAgICAgaWYgbGVuKHNlbGYpID09IDE6ICMgaWYgc2l6ZSBpcyAxLCBpdCdzIG9rOyByZXR1cm4gYW5kIHdlJ2xsIGR1cAorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRvVHJlZShzZWxmLnNpbmdsZUVsZW1lbnQpCisKKyAgICAgICAgICAgICMgb3V0IG9mIGVsZW1lbnRzIGFuZCBzaXplIHdhcyBub3QgMSwgc28gd2UgY2FuJ3QgZHVwCisgICAgICAgICAgICByYWlzZSBSZXdyaXRlQ2FyZGluYWxpdHlFeGNlcHRpb24oc2VsZi5lbGVtZW50RGVzY3JpcHRpb24pCisKKyAgICAgICAgIyB3ZSBoYXZlIGVsZW1lbnRzCisgICAgICAgIGlmIHNlbGYuc2luZ2xlRWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3Vyc29yICs9IDEgIyBtb3ZlIGN1cnNvciBldmVuIGZvciBzaW5nbGUgZWxlbWVudCBsaXN0CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b1RyZWUoc2VsZi5zaW5nbGVFbGVtZW50KQorCisgICAgICAgICMgbXVzdCBoYXZlIG1vcmUgdGhhbiBvbmUgaW4gbGlzdCwgcHVsbCBmcm9tIGVsZW1lbnRzCisgICAgICAgIG8gPSBzZWxmLnRvVHJlZShzZWxmLmVsZW1lbnRzW3NlbGYuY3Vyc29yXSkKKyAgICAgICAgc2VsZi5jdXJzb3IgKz0gMQorICAgICAgICByZXR1cm4gbworCisKKyAgICBkZWYgZHVwKHNlbGYsIGVsKToKKyAgICAgICAgIiIiCisgICAgICAgIFdoZW4gY29uc3RydWN0aW5nIHRyZWVzLCBzb21ldGltZXMgd2UgbmVlZCB0byBkdXAgYSB0b2tlbiBvciBBU1QKKyAgICAgICAgc3VidHJlZS4gIER1cCdpbmcgYSB0b2tlbiBtZWFucyBqdXN0IGNyZWF0aW5nIGFub3RoZXIgQVNUIG5vZGUKKyAgICAgICAgYXJvdW5kIGl0LiAgRm9yIHRyZWVzLCB5b3UgbXVzdCBjYWxsIHRoZSBhZGFwdG9yLmR1cFRyZWUoKSB1bmxlc3MKKyAgICAgICAgdGhlIGVsZW1lbnQgaXMgZm9yIGEgdHJlZSByb290OyB0aGVuIGl0IG11c3QgYmUgYSBub2RlIGR1cC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICBkZWYgdG9UcmVlKHNlbGYsIGVsKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuc3VyZSBzdHJlYW0gZW1pdHMgdHJlZXM7IHRva2VucyBtdXN0IGJlIGNvbnZlcnRlZCB0byBBU1Qgbm9kZXMuCisgICAgICAgIEFTVCBub2RlcyBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5tb2xlc3RlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuIGVsCisKKworICAgIGRlZiBoYXNOZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gKCAoc2VsZi5zaW5nbGVFbGVtZW50IGlzIG5vdCBOb25lIGFuZCBzZWxmLmN1cnNvciA8IDEpCisgICAgICAgICAgICAgICAgIG9yIChzZWxmLmVsZW1lbnRzIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5jdXJzb3IgPCBsZW4oc2VsZi5lbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgKQorCisKKyAgICBkZWYgc2l6ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zaW5nbGVFbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBpZiBzZWxmLmVsZW1lbnRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLmVsZW1lbnRzKQorCisgICAgICAgIHJldHVybiAwCisKKyAgICBfX2xlbl9fID0gc2l6ZQorCisKKyAgICBkZWYgZ2V0RGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgICIiIkRlcHJlY2F0ZWQuIERpcmVjdGx5IGFjY2VzcyBlbGVtZW50RGVzY3JpcHRpb24gYXR0cmlidXRlIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudERlc2NyaXB0aW9uCisKKworY2xhc3MgUmV3cml0ZVJ1bGVUb2tlblN0cmVhbShSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pOgorICAgICIiIkBicmllZiBJbnRlcm5hbCBoZWxwZXIgY2xhc3MuIiIiCisKKyAgICBkZWYgdG9UcmVlKHNlbGYsIGVsKToKKyAgICAgICAgIyBEb24ndCBjb252ZXJ0IHRvIGEgdHJlZSB1bmxlc3MgdGhleSBleHBsaWNpdGx5IGNhbGwgbmV4dFRyZWUuCisgICAgICAgICMgVGhpcyB3YXkgd2UgY2FuIGRvIGhldGVybyB0cmVlIG5vZGVzIGluIHJld3JpdGUuCisgICAgICAgIHJldHVybiBlbAorCisKKyAgICBkZWYgbmV4dE5vZGUoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLl9uZXh0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5jcmVhdGVXaXRoUGF5bG9hZCh0KQorCisKKyAgICBkZWYgbmV4dFRva2VuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmV4dCgpCisKKworICAgIGRlZiBkdXAoc2VsZiwgZWwpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImR1cCBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgdG9rZW4gc3RyZWFtLiIpCisKKworY2xhc3MgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSk6CisgICAgIiIiQGJyaWVmIEludGVybmFsIGhlbHBlciBjbGFzcy4iIiIKKworICAgIGRlZiBuZXh0Tm9kZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRyZWF0IG5leHQgZWxlbWVudCBhcyBhIHNpbmdsZSBub2RlIGV2ZW4gaWYgaXQncyBhIHN1YnRyZWUuCisgICAgICAgIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIG5leHQoKSB3aGVuIHRoZSByZXN1bHQgaGFzIHRvIGJlIGEKKyAgICAgICAgdHJlZSByb290IG5vZGUuICBBbHNvIHByZXZlbnRzIHVzIGZyb20gZHVwbGljYXRpbmcgcmVjZW50bHktYWRkZWQKKyAgICAgICAgY2hpbGRyZW47IGUuZy4sIF4odHlwZSBJRCkrIGFkZHMgSUQgdG8gdHlwZSBhbmQgdGhlbiAybmQgaXRlcmF0aW9uCisgICAgICAgIG11c3QgZHVwIHRoZSB0eXBlIG5vZGUsIGJ1dCBJRCBoYXMgYmVlbiBhZGRlZC4KKworICAgICAgICBSZWZlcmVuY2luZyBhIHJ1bGUgcmVzdWx0IHR3aWNlIGlzIG9rOyBkdXAgZW50aXJlIHRyZWUgYXMKKyAgICAgICAgd2UgY2FuJ3QgYmUgYWRkaW5nIHRyZWVzIGFzIHJvb3Q7IGUuZy4sIGV4cHIgZXhwci4KKworICAgICAgICBIaWRlb3VzIGNvZGUgZHVwbGljYXRpb24gaGVyZSB3aXRoIHN1cGVyLm5leHQoKS4gIENhbid0IHRoaW5rIG9mCisgICAgICAgIGEgcHJvcGVyIHdheSB0byByZWZhY3Rvci4gIFRoaXMgbmVlZHMgdG8gYWx3YXlzIGNhbGwgZHVwIG5vZGUKKyAgICAgICAgYW5kIHN1cGVyLm5leHQoKSBkb2Vzbid0IGtub3cgd2hpY2ggdG8gY2FsbDogZHVwIG5vZGUgb3IgZHVwIHRyZWUuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIChzZWxmLmRpcnR5CisgICAgICAgICAgICBvciAoc2VsZi5jdXJzb3IgPj0gbGVuKHNlbGYpIGFuZCBsZW4oc2VsZikgPT0gMSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAjIGlmIG91dCBvZiBlbGVtZW50cyBhbmQgc2l6ZSBpcyAxLCBkdXAgKGF0IG1vc3QgYSBzaW5nbGUgbm9kZQorICAgICAgICAgICAgIyBzaW5jZSB0aGlzIGlzIGZvciBtYWtpbmcgcm9vdCBub2RlcykuCisgICAgICAgICAgICBlbCA9IHNlbGYuX25leHQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5kdXBOb2RlKGVsKQorCisgICAgICAgICMgdGVzdCBzaXplIGFib3ZlIHRoZW4gZmV0Y2gKKyAgICAgICAgZWwgPSBzZWxmLl9uZXh0KCkKKyAgICAgICAgd2hpbGUgc2VsZi5hZGFwdG9yLmlzTmlsKGVsKSBhbmQgc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQoZWwpID09IDE6CisgICAgICAgICAgICBlbCA9IHNlbGYuYWRhcHRvci5nZXRDaGlsZChlbCwgMCkKKworICAgICAgICAjIGR1cCBqdXN0IHRoZSByb290ICh3YW50IG5vZGUgaGVyZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5kdXBOb2RlKGVsKQorCisKKyAgICBkZWYgZHVwKHNlbGYsIGVsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5kdXBUcmVlKGVsKQorCisKKworY2xhc3MgUmV3cml0ZVJ1bGVOb2RlU3RyZWFtKFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSk6CisgICAgIiIiCisgICAgUXVldWVzIHVwIG5vZGVzIG1hdGNoZWQgb24gbGVmdCBzaWRlIG9mIC0+IGluIGEgdHJlZSBwYXJzZXIuIFRoaXMgaXMKKyAgICB0aGUgYW5hbG9nIG9mIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gZm9yIG5vcm1hbCBwYXJzZXJzLgorICAgICIiIgorCisgICAgZGVmIG5leHROb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmV4dCgpCisKKworICAgIGRlZiB0b1RyZWUoc2VsZiwgZWwpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGFwdG9yLmR1cE5vZGUoZWwpCisKKworICAgIGRlZiBkdXAoc2VsZiwgZWwpOgorICAgICAgICAjIHdlIGR1cCBldmVyeSBub2RlLCBzbyBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGNhbGxpbmcgZHVwOyBzaG9ydC0KKyAgICAgICAgI2NpcmN1aXRlZCBuZXh0KCkgc28gaXQgZG9lc24ndCBjYWxsLgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImR1cCBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgbm9kZSBzdHJlYW0uIikKKworCitjbGFzcyBUcmVlUnVsZVJldHVyblNjb3BlKFJ1bGVSZXR1cm5TY29wZSk6CisgICAgIiIiCisgICAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFBhcnNlclJ1bGVSZXR1cm5TY29wZSBleGNlcHQgdGhhdAorICAgIHRoZSBzdGFydCBwcm9wZXJ0eSBpcyBhIHRyZWUgbm9kZXMgbm90IFRva2VuIG9iamVjdAorICAgIHdoZW4geW91IGFyZSBwYXJzaW5nIHRyZWVzLiAgVG8gYmUgZ2VuZXJpYyB0aGUgdHJlZSBub2RlIHR5cGVzCisgICAgaGF2ZSB0byBiZSBPYmplY3QuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc3RhcnQgPSBOb25lCisgICAgICAgIHNlbGYudHJlZSA9IE5vbmUKKworCisgICAgZGVmIGdldFN0YXJ0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGFydAorCisKKyAgICBkZWYgZ2V0VHJlZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHJlZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy90cmVld2l6YXJkLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2FudGxyMy90cmVld2l6YXJkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NmNlNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vYW50bHIzL3RyZWV3aXphcmQucHkKQEAgLTAsMCArMSw2MTkgQEAKKyIiIiBAcGFja2FnZSBhbnRscjMudHJlZQorQGJyaWVmIEFOVExSMyBydW50aW1lIHBhY2thZ2UsIHRyZWV3aXphcmQgbW9kdWxlCisKK0EgdXRpbGl0eSBtb2R1bGUgdG8gY3JlYXRlIEFTVHMgYXQgcnVudGltZS4KK1NlZSA8aHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L35hZG1pbi8yMDA3LzA3LzAyL0V4cGxvcmluZytDb25jZXB0K29mK1RyZWVXaXphcmQ+IGZvciBhbiBvdmVydmlldy4gTm90ZSB0aGF0IHRoZSBBUEkgb2YgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQuCisKKyIiIgorCisjIGJlZ2luW2xpY2VuY2VdCisjCisjIFtUaGUgIkJTRCBsaWNlbmNlIl0KKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworIyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBlbmRbbGljZW5jZV0KKworZnJvbSBhbnRscjMuY29uc3RhbnRzIGltcG9ydCBJTlZBTElEX1RPS0VOX1RZUEUKK2Zyb20gYW50bHIzLnRva2VucyBpbXBvcnQgQ29tbW9uVG9rZW4KK2Zyb20gYW50bHIzLnRyZWUgaW1wb3J0IENvbW1vblRyZWUsIENvbW1vblRyZWVBZGFwdG9yCisKKworZGVmIGNvbXB1dGVUb2tlblR5cGVzKHRva2VuTmFtZXMpOgorICAgICIiIgorICAgIENvbXB1dGUgYSBkaWN0IHRoYXQgaXMgYW4gaW52ZXJ0ZWQgaW5kZXggb2YKKyAgICB0b2tlbk5hbWVzICh3aGljaCBtYXBzIGludCB0b2tlbiB0eXBlcyB0byBuYW1lcykuCisgICAgIiIiCisKKyAgICBpZiB0b2tlbk5hbWVzIGlzIE5vbmU6CisgICAgICAgIHJldHVybiB7fQorCisgICAgcmV0dXJuIGRpY3QoKG5hbWUsIHR5cGUpIGZvciB0eXBlLCBuYW1lIGluIGVudW1lcmF0ZSh0b2tlbk5hbWVzKSkKKworCisjIyB0b2tlbiB0eXBlcyBmb3IgcGF0dGVybiBwYXJzZXIKK0VPRiA9IC0xCitCRUdJTiA9IDEKK0VORCA9IDIKK0lEID0gMworQVJHID0gNAorUEVSQ0VOVCA9IDUKK0NPTE9OID0gNgorRE9UID0gNworCitjbGFzcyBUcmVlUGF0dGVybkxleGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm4pOgorICAgICAgICAjIyBUaGUgdHJlZSBwYXR0ZXJuIHRvIGxleCBsaWtlICIoQSBCIEMpIgorICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuCisKKwkjIyBJbmRleCBpbnRvIGlucHV0IHN0cmluZworICAgICAgICBzZWxmLnAgPSAtMQorCisJIyMgQ3VycmVudCBjaGFyCisgICAgICAgIHNlbGYuYyA9IE5vbmUKKworCSMjIEhvdyBsb25nIGlzIHRoZSBwYXR0ZXJuIGluIGNoYXI/CisgICAgICAgIHNlbGYubiA9IGxlbihwYXR0ZXJuKQorCisJIyMgU2V0IHdoZW4gdG9rZW4gdHlwZSBpcyBJRCBvciBBUkcKKyAgICAgICAgc2VsZi5zdmFsID0gTm9uZQorCisgICAgICAgIHNlbGYuZXJyb3IgPSBGYWxzZQorCisgICAgICAgIHNlbGYuY29uc3VtZSgpCisKKworICAgIF9faWRTdGFydENoYXIgPSBmcm96ZW5zZXQoCisgICAgICAgICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXycKKyAgICAgICAgKQorICAgIF9faWRDaGFyID0gX19pZFN0YXJ0Q2hhciB8IGZyb3plbnNldCgnMDEyMzQ1Njc4OScpCisKKyAgICBkZWYgbmV4dFRva2VuKHNlbGYpOgorICAgICAgICBzZWxmLnN2YWwgPSAiIgorICAgICAgICB3aGlsZSBzZWxmLmMgIT0gRU9GOgorICAgICAgICAgICAgaWYgc2VsZi5jIGluICgnICcsICdcbicsICdccicsICdcdCcpOgorICAgICAgICAgICAgICAgIHNlbGYuY29uc3VtZSgpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgc2VsZi5jIGluIHNlbGYuX19pZFN0YXJ0Q2hhcjoKKyAgICAgICAgICAgICAgICBzZWxmLnN2YWwgKz0gc2VsZi5jCisgICAgICAgICAgICAgICAgc2VsZi5jb25zdW1lKCkKKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLmMgaW4gc2VsZi5fX2lkQ2hhcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdmFsICs9IHNlbGYuYworICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorCisgICAgICAgICAgICAgICAgcmV0dXJuIElECisKKyAgICAgICAgICAgIGlmIHNlbGYuYyA9PSAnKCc6CisgICAgICAgICAgICAgICAgc2VsZi5jb25zdW1lKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkVHSU4KKworICAgICAgICAgICAgaWYgc2VsZi5jID09ICcpJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorICAgICAgICAgICAgICAgIHJldHVybiBFTkQKKworICAgICAgICAgICAgaWYgc2VsZi5jID09ICclJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorICAgICAgICAgICAgICAgIHJldHVybiBQRVJDRU5UCisKKyAgICAgICAgICAgIGlmIHNlbGYuYyA9PSAnOic6CisgICAgICAgICAgICAgICAgc2VsZi5jb25zdW1lKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09MT04KKworICAgICAgICAgICAgaWYgc2VsZi5jID09ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorICAgICAgICAgICAgICAgIHJldHVybiBET1QKKworICAgICAgICAgICAgaWYgc2VsZi5jID09ICdbJzogIyBncmFiIFt4XSBhcyBhIHN0cmluZywgcmV0dXJuaW5nIHgKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYuYyAhPSAnXSc6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYyA9PSAnXFwnOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25zdW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYyAhPSAnXSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdmFsICs9ICdcXCcKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdmFsICs9IHNlbGYuYworCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN2YWwgKz0gc2VsZi5jCisKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25zdW1lKCkKKworICAgICAgICAgICAgICAgIHNlbGYuY29uc3VtZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFSRworCisgICAgICAgICAgICBzZWxmLmNvbnN1bWUoKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBFT0YKKworICAgICAgICByZXR1cm4gRU9GCisKKworICAgIGRlZiBjb25zdW1lKHNlbGYpOgorICAgICAgICBzZWxmLnAgKz0gMQorICAgICAgICBpZiBzZWxmLnAgPj0gc2VsZi5uOgorICAgICAgICAgICAgc2VsZi5jID0gRU9GCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYyA9IHNlbGYucGF0dGVybltzZWxmLnBdCisKKworY2xhc3MgVHJlZVBhdHRlcm5QYXJzZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5pemVyLCB3aXphcmQsIGFkYXB0b3IpOgorICAgICAgICBzZWxmLnRva2VuaXplciA9IHRva2VuaXplcgorICAgICAgICBzZWxmLndpemFyZCA9IHdpemFyZAorICAgICAgICBzZWxmLmFkYXB0b3IgPSBhZGFwdG9yCisgICAgICAgIHNlbGYudHR5cGUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkgIyBraWNrc3RhcnQKKworCisgICAgZGVmIHBhdHRlcm4oc2VsZik6CisgICAgICAgIGlmIHNlbGYudHR5cGUgPT0gQkVHSU46CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZVRyZWUoKQorCisgICAgICAgIGVsaWYgc2VsZi50dHlwZSA9PSBJRDoKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLnBhcnNlTm9kZSgpCisgICAgICAgICAgICBpZiBzZWxmLnR0eXBlID09IEVPRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZQorCisgICAgICAgICAgICByZXR1cm4gTm9uZSAjIGV4dHJhIGp1bmsgb24gZW5kCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCisgICAgZGVmIHBhcnNlVHJlZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50dHlwZSAhPSBCRUdJTjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgc2VsZi50dHlwZSA9IHNlbGYudG9rZW5pemVyLm5leHRUb2tlbigpCisgICAgICAgIHJvb3QgPSBzZWxmLnBhcnNlTm9kZSgpCisgICAgICAgIGlmIHJvb3QgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgd2hpbGUgc2VsZi50dHlwZSBpbiAoQkVHSU4sIElELCBQRVJDRU5ULCBET1QpOgorICAgICAgICAgICAgaWYgc2VsZi50dHlwZSA9PSBCRUdJTjoKKyAgICAgICAgICAgICAgICBzdWJ0cmVlID0gc2VsZi5wYXJzZVRyZWUoKQorICAgICAgICAgICAgICAgIHNlbGYuYWRhcHRvci5hZGRDaGlsZChyb290LCBzdWJ0cmVlKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoaWxkID0gc2VsZi5wYXJzZU5vZGUoKQorICAgICAgICAgICAgICAgIGlmIGNoaWxkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgICAgICBzZWxmLmFkYXB0b3IuYWRkQ2hpbGQocm9vdCwgY2hpbGQpCisKKyAgICAgICAgaWYgc2VsZi50dHlwZSAhPSBFTkQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYudHR5cGUgPSBzZWxmLnRva2VuaXplci5uZXh0VG9rZW4oKQorICAgICAgICByZXR1cm4gcm9vdAorCisKKyAgICBkZWYgcGFyc2VOb2RlKHNlbGYpOgorICAgICAgICAjICIlbGFiZWw6IiBwcmVmaXgKKyAgICAgICAgbGFiZWwgPSBOb25lCisKKyAgICAgICAgaWYgc2VsZi50dHlwZSA9PSBQRVJDRU5UOgorICAgICAgICAgICAgc2VsZi50dHlwZSA9IHNlbGYudG9rZW5pemVyLm5leHRUb2tlbigpCisgICAgICAgICAgICBpZiBzZWxmLnR0eXBlICE9IElEOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgIGxhYmVsID0gc2VsZi50b2tlbml6ZXIuc3ZhbAorICAgICAgICAgICAgc2VsZi50dHlwZSA9IHNlbGYudG9rZW5pemVyLm5leHRUb2tlbigpCisgICAgICAgICAgICBpZiBzZWxmLnR0eXBlICE9IENPTE9OOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgIHNlbGYudHR5cGUgPSBzZWxmLnRva2VuaXplci5uZXh0VG9rZW4oKSAjIG1vdmUgdG8gSUQgZm9sbG93aW5nIGNvbG9uCisKKyAgICAgICAgIyBXaWxkY2FyZD8KKyAgICAgICAgaWYgc2VsZi50dHlwZSA9PSBET1Q6CisgICAgICAgICAgICBzZWxmLnR0eXBlID0gc2VsZi50b2tlbml6ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIHdpbGRjYXJkUGF5bG9hZCA9IENvbW1vblRva2VuKDAsICIuIikKKyAgICAgICAgICAgIG5vZGUgPSBXaWxkY2FyZFRyZWVQYXR0ZXJuKHdpbGRjYXJkUGF5bG9hZCkKKyAgICAgICAgICAgIGlmIGxhYmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBsYWJlbAorICAgICAgICAgICAgcmV0dXJuIG5vZGUKKworICAgICAgICAjICJJRCIgb3IgIklEW2FyZ10iCisgICAgICAgIGlmIHNlbGYudHR5cGUgIT0gSUQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHRva2VuTmFtZSA9IHNlbGYudG9rZW5pemVyLnN2YWwKKyAgICAgICAgc2VsZi50dHlwZSA9IHNlbGYudG9rZW5pemVyLm5leHRUb2tlbigpCisKKyAgICAgICAgaWYgdG9rZW5OYW1lID09ICJuaWwiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWRhcHRvci5uaWwoKQorCisgICAgICAgIHRleHQgPSB0b2tlbk5hbWUKKyAgICAgICAgIyBjaGVjayBmb3IgYXJnCisgICAgICAgIGFyZyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi50dHlwZSA9PSBBUkc6CisgICAgICAgICAgICBhcmcgPSBzZWxmLnRva2VuaXplci5zdmFsCisgICAgICAgICAgICB0ZXh0ID0gYXJnCisgICAgICAgICAgICBzZWxmLnR0eXBlID0gc2VsZi50b2tlbml6ZXIubmV4dFRva2VuKCkKKworICAgICAgICAjIGNyZWF0ZSBub2RlCisgICAgICAgIHRyZWVOb2RlVHlwZSA9IHNlbGYud2l6YXJkLmdldFRva2VuVHlwZSh0b2tlbk5hbWUpCisgICAgICAgIGlmIHRyZWVOb2RlVHlwZSA9PSBJTlZBTElEX1RPS0VOX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIG5vZGUgPSBzZWxmLmFkYXB0b3IuY3JlYXRlRnJvbVR5cGUodHJlZU5vZGVUeXBlLCB0ZXh0KQorICAgICAgICBpZiBsYWJlbCBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShub2RlLCBUcmVlUGF0dGVybik6CisgICAgICAgICAgICBub2RlLmxhYmVsID0gbGFiZWwKKworICAgICAgICBpZiBhcmcgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uobm9kZSwgVHJlZVBhdHRlcm4pOgorICAgICAgICAgICAgbm9kZS5oYXNUZXh0QXJnID0gVHJ1ZQorCisgICAgICAgIHJldHVybiBub2RlCisKKworY2xhc3MgVHJlZVBhdHRlcm4oQ29tbW9uVHJlZSk6CisgICAgIiIiCisgICAgV2hlbiB1c2luZyAlbGFiZWw6VE9LRU5OQU1FIGluIGEgdHJlZSBmb3IgcGFyc2UoKSwgd2UgbXVzdAorICAgIHRyYWNrIHRoZSBsYWJlbC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXlsb2FkKToKKyAgICAgICAgQ29tbW9uVHJlZS5fX2luaXRfXyhzZWxmLCBwYXlsb2FkKQorCisgICAgICAgIHNlbGYubGFiZWwgPSBOb25lCisgICAgICAgIHNlbGYuaGFzVGV4dEFyZyA9IE5vbmUKKworCisgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxhYmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuICclJyArIHNlbGYubGFiZWwgKyAnOicgKyBDb21tb25UcmVlLnRvU3RyaW5nKHNlbGYpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBDb21tb25UcmVlLnRvU3RyaW5nKHNlbGYpCisKKworY2xhc3MgV2lsZGNhcmRUcmVlUGF0dGVybihUcmVlUGF0dGVybik6CisgICAgcGFzcworCisKK2NsYXNzIFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoQ29tbW9uVHJlZUFkYXB0b3IpOgorICAgICIiIlRoaXMgYWRhcHRvciBjcmVhdGVzIFRyZWVQYXR0ZXJuIG9iamVjdHMgZm9yIHVzZSBkdXJpbmcgc2NhbigpIiIiCisKKyAgICBkZWYgY3JlYXRlV2l0aFBheWxvYWQoc2VsZiwgcGF5bG9hZCk6CisgICAgICAgIHJldHVybiBUcmVlUGF0dGVybihwYXlsb2FkKQorCisKK2NsYXNzIFRyZWVXaXphcmQob2JqZWN0KToKKyAgICAiIiIKKyAgICBCdWlsZCBhbmQgbmF2aWdhdGUgdHJlZXMgd2l0aCB0aGlzIG9iamVjdC4gIE11c3Qga25vdyBhYm91dCB0aGUgbmFtZXMKKyAgICBvZiB0b2tlbnMgc28geW91IGhhdmUgdG8gcGFzcyBpbiBhIG1hcCBvciBhcnJheSBvZiB0b2tlbiBuYW1lcyAoZnJvbSB3aGljaAorICAgIHRoaXMgY2xhc3MgY2FuIGJ1aWxkIHRoZSBtYXApLiAgSS5lLiwgVG9rZW4gREVDTCBtZWFucyBub3RoaW5nIHVubGVzcyB0aGUKKyAgICBjbGFzcyBjYW4gdHJhbnNsYXRlIGl0IHRvIGEgdG9rZW4gdHlwZS4KKworICAgIEluIG9yZGVyIHRvIGNyZWF0ZSBub2RlcyBhbmQgbmF2aWdhdGUsIHRoaXMgY2xhc3MgbmVlZHMgYSBUcmVlQWRhcHRvci4KKworICAgIFRoaXMgY2xhc3MgY2FuIGJ1aWxkIGEgdG9rZW4gdHlwZSAtPiBub2RlIGluZGV4IGZvciByZXBlYXRlZCB1c2Ugb3IgZm9yCisgICAgaXRlcmF0aW5nIG92ZXIgdGhlIHZhcmlvdXMgbm9kZXMgd2l0aCBhIHBhcnRpY3VsYXIgdHlwZS4KKworICAgIFRoaXMgY2xhc3Mgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgVHJlZUFkYXB0b3IgcmF0aGVyIHRoYW4gbW92aW5nCisgICAgYWxsIHRoaXMgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBhZGFwdG9yLiAgQW4gYWRhcHRvciBoZWxwcyBidWlsZCBhbmQKKyAgICBuYXZpZ2F0ZSB0cmVlcyB1c2luZyBtZXRob2RzLiAgVGhpcyBjbGFzcyBoZWxwcyB5b3UgZG8gaXQgd2l0aCBzdHJpbmcKKyAgICBwYXR0ZXJucyBsaWtlICIoQSBCIEMpIi4gIFlvdSBjYW4gY3JlYXRlIGEgdHJlZSBmcm9tIHRoYXQgcGF0dGVybiBvcgorICAgIG1hdGNoIHN1YnRyZWVzIGFnYWluc3QgaXQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRhcHRvcj1Ob25lLCB0b2tlbk5hbWVzPU5vbmUsIHR5cGVNYXA9Tm9uZSk6CisgICAgICAgIGlmIGFkYXB0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hZGFwdG9yID0gYWRhcHRvcgorCisgICAgICAgIGlmIHR5cGVNYXAgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudG9rZW5OYW1lVG9UeXBlTWFwID0gY29tcHV0ZVRva2VuVHlwZXModG9rZW5OYW1lcykKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdG9rZW5OYW1lcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCBoYXZlIGJvdGggdG9rZW5OYW1lcyBhbmQgdHlwZU1hcCIpCisKKyAgICAgICAgICAgIHNlbGYudG9rZW5OYW1lVG9UeXBlTWFwID0gdHlwZU1hcAorCisKKyAgICBkZWYgZ2V0VG9rZW5UeXBlKHNlbGYsIHRva2VuTmFtZSk6CisgICAgICAgICIiIlVzaW5nIHRoZSBtYXAgb2YgdG9rZW4gbmFtZXMgdG8gdG9rZW4gdHlwZXMsIHJldHVybiB0aGUgdHlwZS4iIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbk5hbWVUb1R5cGVNYXBbdG9rZW5OYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9UT0tFTl9UWVBFCisKKworICAgIGRlZiBjcmVhdGUoc2VsZiwgcGF0dGVybik6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSB0cmVlIG9yIG5vZGUgZnJvbSB0aGUgaW5kaWNhdGVkIHRyZWUgcGF0dGVybiB0aGF0IGNsb3NlbHkKKyAgICAgICAgZm9sbG93cyBBTlRMUiB0cmVlIGdyYW1tYXIgdHJlZSBlbGVtZW50IHN5bnRheDoKKworICAgICAgICAocm9vdCBjaGlsZDEgLi4uIGNoaWxkMikuCisKKyAgICAgICAgWW91IGNhbiBhbHNvIGp1c3QgcGFzcyBpbiBhIG5vZGU6IElECisKKyAgICAgICAgQW55IG5vZGUgY2FuIGhhdmUgYSB0ZXh0IGFyZ3VtZW50OiBJRFtmb29dCisgICAgICAgIChub3RpY2UgdGhlcmUgYXJlIG5vIHF1b3RlcyBhcm91bmQgZm9vLS1pdCdzIGNsZWFyIGl0J3MgYSBzdHJpbmcpLgorCisgICAgICAgIG5pbCBpcyBhIHNwZWNpYWwgbmFtZSBtZWFuaW5nICJnaXZlIG1lIGEgbmlsIG5vZGUiLiAgVXNlZnVsIGZvcgorICAgICAgICBtYWtpbmcgbGlzdHM6IChuaWwgQSBCIEMpIGlzIGEgbGlzdCBvZiBBIEIgQy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdG9rZW5pemVyID0gVHJlZVBhdHRlcm5MZXhlcihwYXR0ZXJuKQorICAgICAgICBwYXJzZXIgPSBUcmVlUGF0dGVyblBhcnNlcih0b2tlbml6ZXIsIHNlbGYsIHNlbGYuYWRhcHRvcikKKyAgICAgICAgcmV0dXJuIHBhcnNlci5wYXR0ZXJuKCkKKworCisgICAgZGVmIGluZGV4KHNlbGYsIHRyZWUpOgorICAgICAgICAiIiJXYWxrIHRoZSBlbnRpcmUgdHJlZSBhbmQgbWFrZSBhIG5vZGUgbmFtZSB0byBub2RlcyBtYXBwaW5nLgorCisgICAgICAgIEZvciBub3csIHVzZSByZWN1cnNpb24gYnV0IGxhdGVyIG5vbnJlY3Vyc2l2ZSB2ZXJzaW9uIG1heSBiZQorICAgICAgICBtb3JlIGVmZmljaWVudC4gIFJldHVybnMgYSBkaWN0IGludCAtPiBsaXN0IHdoZXJlIHRoZSBsaXN0IGlzCisgICAgICAgIG9mIHlvdXIgQVNUIG5vZGUgdHlwZS4gIFRoZSBpbnQgaXMgdGhlIHRva2VuIHR5cGUgb2YgdGhlIG5vZGUuCisgICAgICAgICIiIgorCisgICAgICAgIG0gPSB7fQorICAgICAgICBzZWxmLl9pbmRleCh0cmVlLCBtKQorICAgICAgICByZXR1cm4gbQorCisKKyAgICBkZWYgX2luZGV4KHNlbGYsIHQsIG0pOgorICAgICAgICAiIiJEbyB0aGUgd29yayBmb3IgaW5kZXgiIiIKKworICAgICAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0dHlwZSA9IHNlbGYuYWRhcHRvci5nZXRUeXBlKHQpCisgICAgICAgIGVsZW1lbnRzID0gbS5nZXQodHR5cGUpCisgICAgICAgIGlmIGVsZW1lbnRzIGlzIE5vbmU6CisgICAgICAgICAgICBtW3R0eXBlXSA9IGVsZW1lbnRzID0gW10KKworICAgICAgICBlbGVtZW50cy5hcHBlbmQodCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5hZGFwdG9yLmdldENoaWxkQ291bnQodCkpOgorICAgICAgICAgICAgY2hpbGQgPSBzZWxmLmFkYXB0b3IuZ2V0Q2hpbGQodCwgaSkKKyAgICAgICAgICAgIHNlbGYuX2luZGV4KGNoaWxkLCBtKQorCisKKyAgICBkZWYgZmluZChzZWxmLCB0cmVlLCB3aGF0KToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBtYXRjaGluZyB0b2tlbi4KKworICAgICAgICB3aGF0IG1heSBlaXRoZXIgYmUgYW4gaW50ZWdlciBzcGVjaWZ6aW5nIHRoZSB0b2tlbiB0eXBlIHRvIGZpbmQgb3IKKyAgICAgICAgYSBzdHJpbmcgd2l0aCBhIHBhdHRlcm4gdGhhdCBtdXN0IGJlIG1hdGNoZWQuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh3aGF0LCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmluZFRva2VuVHlwZSh0cmVlLCB3aGF0KQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh3aGF0LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maW5kUGF0dGVybih0cmVlLCB3aGF0KQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIid3aGF0JyBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyIikKKworCisgICAgZGVmIF9maW5kVG9rZW5UeXBlKHNlbGYsIHQsIHR0eXBlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgTGlzdCBvZiB0cmVlIG5vZGVzIHdpdGggdG9rZW4gdHlwZSB0dHlwZSIiIgorCisgICAgICAgIG5vZGVzID0gW10KKworICAgICAgICBkZWYgdmlzaXRvcih0cmVlLCBwYXJlbnQsIGNoaWxkSW5kZXgsIGxhYmVscyk6CisgICAgICAgICAgICBub2Rlcy5hcHBlbmQodHJlZSkKKworICAgICAgICBzZWxmLnZpc2l0KHQsIHR0eXBlLCB2aXNpdG9yKQorCisgICAgICAgIHJldHVybiBub2RlcworCisKKyAgICBkZWYgX2ZpbmRQYXR0ZXJuKHNlbGYsIHQsIHBhdHRlcm4pOgorICAgICAgICAiIiJSZXR1cm4gYSBMaXN0IG9mIHN1YnRyZWVzIG1hdGNoaW5nIHBhdHRlcm4uIiIiCisKKyAgICAgICAgc3VidHJlZXMgPSBbXQorCisgICAgICAgICMgQ3JlYXRlIGEgVHJlZVBhdHRlcm4gZnJvbSB0aGUgcGF0dGVybgorICAgICAgICB0b2tlbml6ZXIgPSBUcmVlUGF0dGVybkxleGVyKHBhdHRlcm4pCisgICAgICAgIHBhcnNlciA9IFRyZWVQYXR0ZXJuUGFyc2VyKHRva2VuaXplciwgc2VsZiwgVHJlZVBhdHRlcm5UcmVlQWRhcHRvcigpKQorICAgICAgICB0cGF0dGVybiA9IHBhcnNlci5wYXR0ZXJuKCkKKworICAgICAgICAjIGRvbid0IGFsbG93IGludmFsaWQgcGF0dGVybnMKKyAgICAgICAgaWYgKHRwYXR0ZXJuIGlzIE5vbmUgb3IgdHBhdHRlcm4uaXNOaWwoKQorICAgICAgICAgICAgb3IgaXNpbnN0YW5jZSh0cGF0dGVybiwgV2lsZGNhcmRUcmVlUGF0dGVybikpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByb290VG9rZW5UeXBlID0gdHBhdHRlcm4uZ2V0VHlwZSgpCisKKyAgICAgICAgZGVmIHZpc2l0b3IodHJlZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbCk6CisgICAgICAgICAgICBpZiBzZWxmLl9wYXJzZSh0cmVlLCB0cGF0dGVybiwgTm9uZSk6CisgICAgICAgICAgICAgICAgc3VidHJlZXMuYXBwZW5kKHRyZWUpCisKKyAgICAgICAgc2VsZi52aXNpdCh0LCByb290VG9rZW5UeXBlLCB2aXNpdG9yKQorCisgICAgICAgIHJldHVybiBzdWJ0cmVlcworCisKKyAgICBkZWYgdmlzaXQoc2VsZiwgdHJlZSwgd2hhdCwgdmlzaXRvcik6CisgICAgICAgICIiIlZpc2l0IGV2ZXJ5IG5vZGUgaW4gdHJlZSBtYXRjaGluZyB3aGF0LCBpbnZva2luZyB0aGUgdmlzaXRvci4KKworICAgICAgICBJZiB3aGF0IGlzIGEgc3RyaW5nLCBpdCBpcyBwYXJzZWQgYXMgYSBwYXR0ZXJuIGFuZCBvbmx5IG1hdGNoaW5nCisgICAgICAgIHN1YnRyZWVzIHdpbGwgYmUgdmlzaXRlZC4KKyAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGF0dGVybiBpbiBjb21iaW5hdGlvbgorICAgICAgICB3aXRoIHZpc2l0KHQsIHR0eXBlLCB2aXNpdG9yKSBzbyBuaWwtcm9vdGVkIHBhdHRlcm5zIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgUGF0dGVybnMgd2l0aCB3aWxkY2FyZCByb290cyBhcmUgYWxzbyBub3QgYWxsb3dlZC4KKworICAgICAgICBJZiB3aGF0IGlzIGFuIGludGVnZXIsIGl0IGlzIHVzZWQgYXMgYSB0b2tlbiB0eXBlIGFuZCB2aXNpdCB3aWxsIG1hdGNoCisgICAgICAgIGFsbCBub2RlcyBvZiB0aGF0IHR5cGUgKHRoaXMgaXMgZmFzdGVyIHRoYW4gdGhlIHBhdHRlcm4gbWF0Y2gpLgorICAgICAgICBUaGUgbGFiZWxzIGFyZyBvZiB0aGUgdmlzaXRvciBhY3Rpb24gbWV0aG9kIGlzIG5ldmVyIHNldCAoaXQncyBOb25lKQorICAgICAgICBzaW5jZSB1c2luZyBhIHRva2VuIHR5cGUgcmF0aGVyIHRoYW4gYSBwYXR0ZXJuIGRvZXNuJ3QgbGV0IHVzIHNldCBhCisgICAgICAgIGxhYmVsLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBpc2luc3RhbmNlKHdoYXQsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHNlbGYuX3Zpc2l0VHlwZSh0cmVlLCBOb25lLCAwLCB3aGF0LCB2aXNpdG9yKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh3aGF0LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuX3Zpc2l0UGF0dGVybih0cmVlLCB3aGF0LCB2aXNpdG9yKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIid3aGF0JyBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyIikKKworCisgICAgZGVmIF92aXNpdFR5cGUoc2VsZiwgdCwgcGFyZW50LCBjaGlsZEluZGV4LCB0dHlwZSwgdmlzaXRvcik6CisgICAgICAgICIiIkRvIHRoZSByZWN1cnNpdmUgd29yayBmb3IgdmlzaXQiIiIKKworICAgICAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmFkYXB0b3IuZ2V0VHlwZSh0KSA9PSB0dHlwZToKKyAgICAgICAgICAgIHZpc2l0b3IodCwgcGFyZW50LCBjaGlsZEluZGV4LCBOb25lKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuYWRhcHRvci5nZXRDaGlsZENvdW50KHQpKToKKyAgICAgICAgICAgIGNoaWxkID0gc2VsZi5hZGFwdG9yLmdldENoaWxkKHQsIGkpCisgICAgICAgICAgICBzZWxmLl92aXNpdFR5cGUoY2hpbGQsIHQsIGksIHR0eXBlLCB2aXNpdG9yKQorCisKKyAgICBkZWYgX3Zpc2l0UGF0dGVybihzZWxmLCB0cmVlLCBwYXR0ZXJuLCB2aXNpdG9yKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvciBhbGwgc3VidHJlZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiwgZXhlY3V0ZSB0aGUgdmlzaXQgYWN0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICAjIENyZWF0ZSBhIFRyZWVQYXR0ZXJuIGZyb20gdGhlIHBhdHRlcm4KKyAgICAgICAgdG9rZW5pemVyID0gVHJlZVBhdHRlcm5MZXhlcihwYXR0ZXJuKQorICAgICAgICBwYXJzZXIgPSBUcmVlUGF0dGVyblBhcnNlcih0b2tlbml6ZXIsIHNlbGYsIFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoKSkKKyAgICAgICAgdHBhdHRlcm4gPSBwYXJzZXIucGF0dGVybigpCisKKyAgICAgICAgIyBkb24ndCBhbGxvdyBpbnZhbGlkIHBhdHRlcm5zCisgICAgICAgIGlmICh0cGF0dGVybiBpcyBOb25lIG9yIHRwYXR0ZXJuLmlzTmlsKCkKKyAgICAgICAgICAgIG9yIGlzaW5zdGFuY2UodHBhdHRlcm4sIFdpbGRjYXJkVHJlZVBhdHRlcm4pKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHJvb3RUb2tlblR5cGUgPSB0cGF0dGVybi5nZXRUeXBlKCkKKworICAgICAgICBkZWYgcm9vdHZpc2l0b3IodHJlZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpOgorICAgICAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgICAgIGlmIHNlbGYuX3BhcnNlKHRyZWUsIHRwYXR0ZXJuLCBsYWJlbHMpOgorICAgICAgICAgICAgICAgIHZpc2l0b3IodHJlZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpCisKKyAgICAgICAgc2VsZi52aXNpdCh0cmVlLCByb290VG9rZW5UeXBlLCByb290dmlzaXRvcikKKworCisgICAgZGVmIHBhcnNlKHNlbGYsIHQsIHBhdHRlcm4sIGxhYmVscz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEdpdmVuIGEgcGF0dGVybiBsaWtlIChBU1NJR04gJWxoczpJRCAlcmhzOi4pIHdpdGggb3B0aW9uYWwgbGFiZWxzCisgICAgICAgIG9uIHRoZSB2YXJpb3VzIG5vZGVzIGFuZCAnLicgKGRvdCkgYXMgdGhlIG5vZGUvc3VidHJlZSB3aWxkY2FyZCwKKyAgICAgICAgcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBhbmQgZmlsbCB0aGUgbGFiZWxzIE1hcCB3aXRoCisgICAgICAgIHRoZSBsYWJlbHMgcG9pbnRpbmcgYXQgdGhlIGFwcHJvcHJpYXRlIG5vZGVzLiAgUmV0dXJuIGZhbHNlIGlmCisgICAgICAgIHRoZSBwYXR0ZXJuIGlzIG1hbGZvcm1lZCBvciB0aGUgdHJlZSBkb2VzIG5vdCBtYXRjaC4KKworICAgICAgICBJZiBhIG5vZGUgc3BlY2lmaWVzIGEgdGV4dCBhcmcgaW4gcGF0dGVybiwgdGhlbiB0aGF0IG11c3QgbWF0Y2gKKyAgICAgICAgZm9yIHRoYXQgbm9kZSBpbiB0LgorICAgICAgICAiIiIKKworICAgICAgICB0b2tlbml6ZXIgPSBUcmVlUGF0dGVybkxleGVyKHBhdHRlcm4pCisgICAgICAgIHBhcnNlciA9IFRyZWVQYXR0ZXJuUGFyc2VyKHRva2VuaXplciwgc2VsZiwgVHJlZVBhdHRlcm5UcmVlQWRhcHRvcigpKQorICAgICAgICB0cGF0dGVybiA9IHBhcnNlci5wYXR0ZXJuKCkKKworICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2UodCwgdHBhdHRlcm4sIGxhYmVscykKKworCisgICAgZGVmIF9wYXJzZShzZWxmLCB0MSwgdHBhdHRlcm4sIGxhYmVscyk6CisgICAgICAgICIiIgorICAgICAgICBEbyB0aGUgd29yayBmb3IgcGFyc2UuIENoZWNrIHRvIHNlZSBpZiB0aGUgdHBhdHRlcm4gZml0cyB0aGUKKyAgICAgICAgc3RydWN0dXJlIGFuZCB0b2tlbiB0eXBlcyBpbiB0MS4gIENoZWNrIHRleHQgaWYgdGhlIHBhdHRlcm4gaGFzCisgICAgICAgIHRleHQgYXJndW1lbnRzIG9uIG5vZGVzLiAgRmlsbCBsYWJlbHMgbWFwIHdpdGggcG9pbnRlcnMgdG8gbm9kZXMKKyAgICAgICAgaW4gdHJlZSBtYXRjaGVkIGFnYWluc3Qgbm9kZXMgaW4gcGF0dGVybiB3aXRoIGxhYmVscy4KKwkiIiIKKworICAgICAgICAjIG1ha2Ugc3VyZSBib3RoIGFyZSBub24tbnVsbAorICAgICAgICBpZiB0MSBpcyBOb25lIG9yIHRwYXR0ZXJuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIGNoZWNrIHJvb3RzICh3aWxkY2FyZCBtYXRjaGVzIGFueXRoaW5nKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0cGF0dGVybiwgV2lsZGNhcmRUcmVlUGF0dGVybik6CisgICAgICAgICAgICBpZiBzZWxmLmFkYXB0b3IuZ2V0VHlwZSh0MSkgIT0gdHBhdHRlcm4uZ2V0VHlwZSgpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICAjIGlmIHBhdHRlcm4gaGFzIHRleHQsIGNoZWNrIG5vZGUgdGV4dAorICAgICAgICAgICAgaWYgKHRwYXR0ZXJuLmhhc1RleHRBcmcKKyAgICAgICAgICAgICAgICBhbmQgc2VsZi5hZGFwdG9yLmdldFRleHQodDEpICE9IHRwYXR0ZXJuLmdldFRleHQoKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgdHBhdHRlcm4ubGFiZWwgaXMgbm90IE5vbmUgYW5kIGxhYmVscyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgbWFwIGxhYmVsIGluIHBhdHRlcm4gdG8gbm9kZSBpbiB0MQorICAgICAgICAgICAgbGFiZWxzW3RwYXR0ZXJuLmxhYmVsXSA9IHQxCisKKyAgICAgICAgIyBjaGVjayBjaGlsZHJlbgorICAgICAgICBuMSA9IHNlbGYuYWRhcHRvci5nZXRDaGlsZENvdW50KHQxKQorICAgICAgICBuMiA9IHRwYXR0ZXJuLmdldENoaWxkQ291bnQoKQorICAgICAgICBpZiBuMSAhPSBuMjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4xKToKKyAgICAgICAgICAgIGNoaWxkMSA9IHNlbGYuYWRhcHRvci5nZXRDaGlsZCh0MSwgaSkKKyAgICAgICAgICAgIGNoaWxkMiA9IHRwYXR0ZXJuLmdldENoaWxkKGkpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcGFyc2UoY2hpbGQxLCBjaGlsZDIsIGxhYmVscyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworCisgICAgZGVmIGVxdWFscyhzZWxmLCB0MSwgdDIsIGFkYXB0b3I9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDb21wYXJlIHQxIGFuZCB0MjsgcmV0dXJuIHRydWUgaWYgdG9rZW4gdHlwZXMvdGV4dCwgc3RydWN0dXJlIG1hdGNoCisgICAgICAgIGV4YWN0bHkuCisgICAgICAgIFRoZSB0cmVlcyBhcmUgZXhhbWluZWQgaW4gdGhlaXIgZW50aXJldHkgc28gdGhhdCAoQSBCKSBkb2VzIG5vdCBtYXRjaAorICAgICAgICAoQSBCIEMpIG5vciAoQSAoQiBDKSkuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGFkYXB0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIGFkYXB0b3IgPSBzZWxmLmFkYXB0b3IKKworICAgICAgICByZXR1cm4gc2VsZi5fZXF1YWxzKHQxLCB0MiwgYWRhcHRvcikKKworCisgICAgZGVmIF9lcXVhbHMoc2VsZiwgdDEsIHQyLCBhZGFwdG9yKToKKyAgICAgICAgIyBtYWtlIHN1cmUgYm90aCBhcmUgbm9uLW51bGwKKyAgICAgICAgaWYgdDEgaXMgTm9uZSBvciB0MiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBjaGVjayByb290cworICAgICAgICBpZiBhZGFwdG9yLmdldFR5cGUodDEpICE9IGFkYXB0b3IuZ2V0VHlwZSh0Mik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBhZGFwdG9yLmdldFRleHQodDEpICE9IGFkYXB0b3IuZ2V0VGV4dCh0Mik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIGNoZWNrIGNoaWxkcmVuCisgICAgICAgIG4xID0gYWRhcHRvci5nZXRDaGlsZENvdW50KHQxKQorICAgICAgICBuMiA9IGFkYXB0b3IuZ2V0Q2hpbGRDb3VudCh0MikKKyAgICAgICAgaWYgbjEgIT0gbjI6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBmb3IgaSBpbiByYW5nZShuMSk6CisgICAgICAgICAgICBjaGlsZDEgPSBhZGFwdG9yLmdldENoaWxkKHQxLCBpKQorICAgICAgICAgICAgY2hpbGQyID0gYWRhcHRvci5nZXRDaGlsZCh0MiwgaSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9lcXVhbHMoY2hpbGQxLCBjaGlsZDIsIGFkYXB0b3IpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vZGlzdC9hbnRscl9weXRob25fcnVudGltZS0zLjQtcHkyLjQuZWdnIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LXB5Mi40LmVnZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI5YWNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LXB5Mi40LmVnZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vZGlzdC9hbnRscl9weXRob25fcnVudGltZS0zLjQtcHkyLjYuZWdnIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LXB5Mi42LmVnZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlhOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LXB5Mi42LmVnZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vZGlzdC9hbnRscl9weXRob25fcnVudGltZS0zLjQudGFyLmd6IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LnRhci5negpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBiNDBlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LnRhci5negpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vZGlzdC9hbnRscl9weXRob25fcnVudGltZS0zLjQuemlwIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRjZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2Rpc3QvYW50bHJfcHl0aG9uX3J1bnRpbWUtMy40LnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vZG94eWZpbGUgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vZG94eWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzNTZkZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9kb3h5ZmlsZQpAQCAtMCwwICsxLDI3MCBAQAorIyAtKi0gbW9kZTogZG94eW1hY3MgLSotCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkFOVExSIFB5dGhvbiBBUEkiCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gMy4zCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gYXBpCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0gIlRoZSAkbmFtZSBjbGFzcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgd2lkZ2V0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSBmaWxlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gWUVTCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSBidWlsZC9kb2MvCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0gCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCitERVRBSUxTX0FUX1RPUCAgICAgICAgID0gTk8KK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IFlFUworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVhUUkFDVF9BTEwgICAgICAgICAgICA9IFlFUworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IFlFUworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gTk8KK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBOTworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IE5PCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKK1NIT1dfRElSRUNUT1JJRVMgICAgICAgPSBOTworRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOUFVUICAgICAgICAgICAgICAgICAgPSBidWlsZC9kb2MKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jeHggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmMrKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmphdmEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaWkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaXh4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmlwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaW5sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaGggXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaHh4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLmhwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5oKysgXAorICAgICAgICAgICAgICAgICAgICAgICAgICouaWRsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLm9kbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5jcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5waHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoucGhwMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5pbmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICoubSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5tbSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKi5kb3ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICoucHkKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSBidWlsZC9kb2MvYW50bHIzL19faW5pdF9fLnB5CitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPSBkZmEgZXhjZXB0aW9ucyByZWNvZ25pemVycyBzdHJlYW1zIHRva2VucyBjb25zdGFudHMKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8KK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gTk8KK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IC4KK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorSFRNTF9GT09URVIgICAgICAgICAgICA9IAorSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorSFRNTF9BTElHTl9NRU1CRVJTICAgICA9IFlFUworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCitISENfTE9DQVRJT04gICAgICAgICAgID0gCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfTEFURVggICAgICAgICA9IE5PCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorWE1MX1NDSEVNQSAgICAgICAgICAgICA9IAorWE1MX0RURCAgICAgICAgICAgICAgICA9IAorWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMKK0VYUEFORF9PTkxZX1BSRURFRiAgICAgPSBOTworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9IAorUFJFREVGSU5FRCAgICAgICAgICAgICA9IERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IAorU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbCAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IE5PCitNU0NHRU5fUEFUSCAgICAgICAgICAgID0gCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gWUVTCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBOTworCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZG94eXB5IGludGVncmF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGSUxURVJfU09VUkNFX0ZJTEVTID0gWUVTCitJTlBVVF9GSUxURVIgPSAicHl0aG9uIGRveHlweS5weSIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9lel9zZXR1cC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9lel9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGMwOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL2V6X3NldHVwLnB5CkBAIC0wLDAgKzEsMjI4IEBACisjIXB5dGhvbgorIiIiQm9vdHN0cmFwIHNldHVwdG9vbHMgaW5zdGFsbGF0aW9uCisKK0lmIHlvdSB3YW50IHRvIHVzZSBzZXR1cHRvb2xzIGluIHlvdXIgcGFja2FnZSdzIHNldHVwLnB5LCBqdXN0IGluY2x1ZGUgdGhpcworZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBpdCwgYW5kIGFkZCB0aGlzIHRvIHRoZSB0b3Agb2YgeW91ciBzZXR1cC5weTo6CisKKyAgICBmcm9tIGV6X3NldHVwIGltcG9ydCB1c2Vfc2V0dXB0b29scworICAgIHVzZV9zZXR1cHRvb2xzKCkKKworSWYgeW91IHdhbnQgdG8gcmVxdWlyZSBhIHNwZWNpZmljIHZlcnNpb24gb2Ygc2V0dXB0b29scywgc2V0IGEgZG93bmxvYWQKK21pcnJvciwgb3IgdXNlIGFuIGFsdGVybmF0ZSBkb3dubG9hZCBkaXJlY3RvcnksIHlvdSBjYW4gZG8gc28gYnkgc3VwcGx5aW5nCit0aGUgYXBwcm9wcmlhdGUgb3B0aW9ucyB0byBgYHVzZV9zZXR1cHRvb2xzKClgYC4KKworVGhpcyBmaWxlIGNhbiBhbHNvIGJlIHJ1biBhcyBhIHNjcmlwdCB0byBpbnN0YWxsIG9yIHVwZ3JhZGUgc2V0dXB0b29scy4KKyIiIgoraW1wb3J0IHN5cworREVGQVVMVF9WRVJTSU9OID0gIjAuNmM1IgorREVGQVVMVF9VUkwgICAgID0gImh0dHA6Ly9jaGVlc2VzaG9wLnB5dGhvbi5vcmcvcGFja2FnZXMvJXMvcy9zZXR1cHRvb2xzLyIgJSBzeXMudmVyc2lvbls6M10KKworbWQ1X2RhdGEgPSB7CisgICAgJ3NldHVwdG9vbHMtMC42YjEtcHkyLjMuZWdnJzogJzg4MjJjYWY5MDEyNTBkODQ4Yjk5NmI3ZjI1YzZlNmNhJywKKyAgICAnc2V0dXB0b29scy0wLjZiMS1weTIuNC5lZ2cnOiAnYjc5YThhNDAzZTQ1MDJmYmI4NWVlM2YxOTQxNzM1Y2InLAorICAgICdzZXR1cHRvb2xzLTAuNmIyLXB5Mi4zLmVnZyc6ICc1NjU3NzU5ZDhhNmQ4ZmM0NDA3MGE5ZDA3MjcyZDk5YicsCisgICAgJ3NldHVwdG9vbHMtMC42YjItcHkyLjQuZWdnJzogJzQ5OTZhOGQxNjlkMmJlNjYxZmEzMmE2ZTUyZTRmODJhJywKKyAgICAnc2V0dXB0b29scy0wLjZiMy1weTIuMy5lZ2cnOiAnYmIzMWMwZmM3Mzk5YTYzNTc5OTc1Y2FkOWY1YTA2MTgnLAorICAgICdzZXR1cHRvb2xzLTAuNmIzLXB5Mi40LmVnZyc6ICczOGE4YzZiM2Q2ZWNkMjIyNDdmMTc5ZjdkYTY2OWZhYycsCisgICAgJ3NldHVwdG9vbHMtMC42YjQtcHkyLjMuZWdnJzogJzYyMDQ1YTI0ZWQ0ZTFlYmM3N2ZlMDM5YWE0ZTZmN2U1JywKKyAgICAnc2V0dXB0b29scy0wLjZiNC1weTIuNC5lZ2cnOiAnNGNiMmExODVkMjI4ZGFjZmZiMmQxN2YxMDNiM2IxYzQnLAorICAgICdzZXR1cHRvb2xzLTAuNmMxLXB5Mi4zLmVnZyc6ICdiM2YyYjU1MzlkNjVjYjdmNzRhZDc5MTI3ZjFhOTA4YycsCisgICAgJ3NldHVwdG9vbHMtMC42YzEtcHkyLjQuZWdnJzogJ2I0NWFkZWRhMDY2N2QyZDJmZmUxNDAwOTM2NGYyYTRiJywKKyAgICAnc2V0dXB0b29scy0wLjZjMi1weTIuMy5lZ2cnOiAnZjAwNjRiZjZhYTJiN2QwZjNiYTBiNDNmMjA4MTdjMjcnLAorICAgICdzZXR1cHRvb2xzLTAuNmMyLXB5Mi40LmVnZyc6ICc2MTYxOTJlZWMzNWY0N2U4ZWExNmNkNmExMjJiNzI3NycsCisgICAgJ3NldHVwdG9vbHMtMC42YzMtcHkyLjMuZWdnJzogJ2YxODFmYTEyNWRmZTg1YTI1OWM5Y2Q2ZjFkN2I3OGZhJywKKyAgICAnc2V0dXB0b29scy0wLjZjMy1weTIuNC5lZ2cnOiAnZTBlZDc0NjgyYzk5OGJmYjczYmY4MDNhNTBlN2I3MWUnLAorICAgICdzZXR1cHRvb2xzLTAuNmMzLXB5Mi41LmVnZyc6ICdhYmVmMTZmZGQ2MTk1NTUxNDg0MWM3YzZiZDk4OTY1ZScsCisgICAgJ3NldHVwdG9vbHMtMC42YzQtcHkyLjMuZWdnJzogJ2IwYjkxMzFhY2FiMzIwMjJiZmFjN2Y0NGM1ZDc5NzFmJywKKyAgICAnc2V0dXB0b29scy0wLjZjNC1weTIuNC5lZ2cnOiAnMmExZjk2NTZkNGZiZjNjOTdiZjk0NmMwYTEyNGU2ZTInLAorICAgICdzZXR1cHRvb2xzLTAuNmM0LXB5Mi41LmVnZyc6ICc4ZjVhMDUyZTMyY2RiOWM3MmJjZjRiNTUyNmYyOGFmYycsCisgICAgJ3NldHVwdG9vbHMtMC42YzUtcHkyLjMuZWdnJzogJ2VlOWZkODA5NjVkYTA0ZjJmM2U2YjM1NzZlOWQ4MTY3JywKKyAgICAnc2V0dXB0b29scy0wLjZjNS1weTIuNC5lZ2cnOiAnYWZlMmFkZjFjMDE3MDFlZTg0MTc2MWY1YmNkOGFhNjQnLAorICAgICdzZXR1cHRvb2xzLTAuNmM1LXB5Mi41LmVnZyc6ICdhOGQzZjYxNDk0Y2NhYTg3MTRkZmVkMzdiY2NkM2Q1ZCcsCit9CisKK2ltcG9ydCBzeXMsIG9zCisKK2RlZiBfdmFsaWRhdGVfbWQ1KGVnZ19uYW1lLCBkYXRhKToKKyAgICBpZiBlZ2dfbmFtZSBpbiBtZDVfZGF0YToKKyAgICAgICAgZnJvbSBtZDUgaW1wb3J0IG1kNQorICAgICAgICBkaWdlc3QgPSBtZDUoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgaWYgZGlnZXN0ICE9IG1kNV9kYXRhW2VnZ19uYW1lXToKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAorICAgICAgICAgICAgICAgICJtZDUgdmFsaWRhdGlvbiBvZiAlcyBmYWlsZWQhICAoUG9zc2libGUgZG93bmxvYWQgcHJvYmxlbT8pIgorICAgICAgICAgICAgICAgICUgZWdnX25hbWUKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgcmV0dXJuIGRhdGEKKworCitkZWYgdXNlX3NldHVwdG9vbHMoCisgICAgdmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsIHRvX2Rpcj1vcy5jdXJkaXIsCisgICAgZG93bmxvYWRfZGVsYXk9MTUKKyk6CisgICAgIiIiQXV0b21hdGljYWxseSBmaW5kL2Rvd25sb2FkIHNldHVwdG9vbHMgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIG9uIHN5cy5wYXRoCisKKyAgICBgdmVyc2lvbmAgc2hvdWxkIGJlIGEgdmFsaWQgc2V0dXB0b29scyB2ZXJzaW9uIG51bWJlciB0aGF0IGlzIGF2YWlsYWJsZQorICAgIGFzIGFuIGVnZyBmb3IgZG93bmxvYWQgdW5kZXIgdGhlIGBkb3dubG9hZF9iYXNlYCBVUkwgKHdoaWNoIHNob3VsZCBlbmQgd2l0aAorICAgIGEgJy8nKS4gIGB0b19kaXJgIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgc2V0dXB0b29scyB3aWxsIGJlIGRvd25sb2FkZWQsIGlmCisgICAgaXQgaXMgbm90IGFscmVhZHkgYXZhaWxhYmxlLiAgSWYgYGRvd25sb2FkX2RlbGF5YCBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZAorICAgIGJlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHdpbGwgYmUgcGF1c2VkIGJlZm9yZSBpbml0aWF0aW5nIGEgZG93bmxvYWQsCisgICAgc2hvdWxkIG9uZSBiZSByZXF1aXJlZC4gIElmIGFuIG9sZGVyIHZlcnNpb24gb2Ygc2V0dXB0b29scyBpcyBpbnN0YWxsZWQsCisgICAgdGhpcyByb3V0aW5lIHdpbGwgcHJpbnQgYSBtZXNzYWdlIHRvIGBgc3lzLnN0ZGVycmBgIGFuZCByYWlzZSBTeXN0ZW1FeGl0IGluCisgICAgYW4gYXR0ZW1wdCB0byBhYm9ydCB0aGUgY2FsbGluZyBzY3JpcHQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc2V0dXB0b29scworICAgICAgICBpZiBzZXR1cHRvb2xzLl9fdmVyc2lvbl9fID09ICcwLjAuMSc6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKKyAgICAgICAgICAgICJZb3UgaGF2ZSBhbiBvYnNvbGV0ZSB2ZXJzaW9uIG9mIHNldHVwdG9vbHMgaW5zdGFsbGVkLiAgUGxlYXNlXG4iCisgICAgICAgICAgICAicmVtb3ZlIGl0IGZyb20geW91ciBzeXN0ZW0gZW50aXJlbHkgYmVmb3JlIHJlcnVubmluZyB0aGlzIHNjcmlwdC4iCisgICAgICAgICAgICApCisgICAgICAgICAgICBzeXMuZXhpdCgyKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgZWdnID0gZG93bmxvYWRfc2V0dXB0b29scyh2ZXJzaW9uLCBkb3dubG9hZF9iYXNlLCB0b19kaXIsIGRvd25sb2FkX2RlbGF5KQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZWdnKQorICAgICAgICBpbXBvcnQgc2V0dXB0b29sczsgc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gZWdnCisKKyAgICBpbXBvcnQgcGtnX3Jlc291cmNlcworICAgIHRyeToKKyAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCJzZXR1cHRvb2xzPj0iK3ZlcnNpb24pCisKKyAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3QsIGU6CisgICAgICAgICMgWFhYIGNvdWxkIHdlIGluc3RhbGwgaW4gYSBzdWJwcm9jZXNzIGhlcmU/CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAorICAgICAgICAgICAgIlRoZSByZXF1aXJlZCB2ZXJzaW9uIG9mIHNldHVwdG9vbHMgKD49JXMpIGlzIG5vdCBhdmFpbGFibGUsIGFuZFxuIgorICAgICAgICAgICAgImNhbid0IGJlIGluc3RhbGxlZCB3aGlsZSB0aGlzIHNjcmlwdCBpcyBydW5uaW5nLiBQbGVhc2UgaW5zdGFsbFxuIgorICAgICAgICAgICAgIiBhIG1vcmUgcmVjZW50IHZlcnNpb24gZmlyc3QuXG5cbihDdXJyZW50bHkgdXNpbmcgJXIpIgorICAgICAgICApICUgKHZlcnNpb24sIGUuYXJnc1swXSkKKyAgICAgICAgc3lzLmV4aXQoMikKKworZGVmIGRvd25sb2FkX3NldHVwdG9vbHMoCisgICAgdmVyc2lvbj1ERUZBVUxUX1ZFUlNJT04sIGRvd25sb2FkX2Jhc2U9REVGQVVMVF9VUkwsIHRvX2Rpcj1vcy5jdXJkaXIsCisgICAgZGVsYXkgPSAxNQorKToKKyAgICAiIiJEb3dubG9hZCBzZXR1cHRvb2xzIGZyb20gYSBzcGVjaWZpZWQgbG9jYXRpb24gYW5kIHJldHVybiBpdHMgZmlsZW5hbWUKKworICAgIGB2ZXJzaW9uYCBzaG91bGQgYmUgYSB2YWxpZCBzZXR1cHRvb2xzIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgYXZhaWxhYmxlCisgICAgYXMgYW4gZWdnIGZvciBkb3dubG9hZCB1bmRlciB0aGUgYGRvd25sb2FkX2Jhc2VgIFVSTCAod2hpY2ggc2hvdWxkIGVuZAorICAgIHdpdGggYSAnLycpLiBgdG9fZGlyYCBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBlZ2cgd2lsbCBiZSBkb3dubG9hZGVkLgorICAgIGBkZWxheWAgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHBhdXNlIGJlZm9yZSBhbiBhY3R1YWwgZG93bmxvYWQgYXR0ZW1wdC4KKyAgICAiIiIKKyAgICBpbXBvcnQgdXJsbGliMiwgc2h1dGlsCisgICAgZWdnX25hbWUgPSAic2V0dXB0b29scy0lcy1weSVzLmVnZyIgJSAodmVyc2lvbixzeXMudmVyc2lvbls6M10pCisgICAgdXJsID0gZG93bmxvYWRfYmFzZSArIGVnZ19uYW1lCisgICAgc2F2ZXRvID0gb3MucGF0aC5qb2luKHRvX2RpciwgZWdnX25hbWUpCisgICAgc3JjID0gZHN0ID0gTm9uZQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzYXZldG8pOiAgIyBBdm9pZCByZXBlYXRlZCBkb3dubG9hZHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworICAgICAgICAgICAgaWYgZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiIiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgc2NyaXB0IHJlcXVpcmVzIHNldHVwdG9vbHMgdmVyc2lvbiAlcyB0byBydW4gKGV2ZW4gdG8gZGlzcGxheQoraGVscCkuICBJIHdpbGwgYXR0ZW1wdCB0byBkb3dubG9hZCBpdCBmb3IgeW91IChmcm9tCislcyksIGJ1dAoreW91IG1heSBuZWVkIHRvIGVuYWJsZSBmaXJld2FsbCBhY2Nlc3MgZm9yIHRoaXMgc2NyaXB0IGZpcnN0LgorSSB3aWxsIHN0YXJ0IHRoZSBkb3dubG9hZCBpbiAlZCBzZWNvbmRzLgorCisoTm90ZTogaWYgdGhpcyBtYWNoaW5lIGRvZXMgbm90IGhhdmUgbmV0d29yayBhY2Nlc3MsIHBsZWFzZSBvYnRhaW4gdGhlIGZpbGUKKworICAgJXMKKworYW5kIHBsYWNlIGl0IGluIHRoaXMgZGlyZWN0b3J5IGJlZm9yZSByZXJ1bm5pbmcgdGhpcyBzY3JpcHQuKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiIiLAorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLCBkb3dubG9hZF9iYXNlLCBkZWxheSwgdXJsCisgICAgICAgICAgICAgICAgKTsgZnJvbSB0aW1lIGltcG9ydCBzbGVlcDsgc2xlZXAoZGVsYXkpCisgICAgICAgICAgICBsb2cud2FybigiRG93bmxvYWRpbmcgJXMiLCB1cmwpCisgICAgICAgICAgICBzcmMgPSB1cmxsaWIyLnVybG9wZW4odXJsKQorICAgICAgICAgICAgIyBSZWFkL3dyaXRlIGFsbCBpbiBvbmUgYmxvY2ssIHNvIHdlIGRvbid0IGNyZWF0ZSBhIGNvcnJ1cHQgZmlsZQorICAgICAgICAgICAgIyBpZiB0aGUgZG93bmxvYWQgaXMgaW50ZXJydXB0ZWQuCisgICAgICAgICAgICBkYXRhID0gX3ZhbGlkYXRlX21kNShlZ2dfbmFtZSwgc3JjLnJlYWQoKSkKKyAgICAgICAgICAgIGRzdCA9IG9wZW4oc2F2ZXRvLCJ3YiIpOyBkc3Qud3JpdGUoZGF0YSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNyYzogc3JjLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIGRzdDogZHN0LmNsb3NlKCkKKyAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChzYXZldG8pCisKK2RlZiBtYWluKGFyZ3YsIHZlcnNpb249REVGQVVMVF9WRVJTSU9OKToKKyAgICAiIiJJbnN0YWxsIG9yIHVwZ3JhZGUgc2V0dXB0b29scyBhbmQgRWFzeUluc3RhbGwiIiIKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHNldHVwdG9vbHMKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGVnZyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZWdnID0gZG93bmxvYWRfc2V0dXB0b29scyh2ZXJzaW9uLCBkZWxheT0wKQorICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsZWdnKQorICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBtYWluCisgICAgICAgICAgICByZXR1cm4gbWFpbihsaXN0KGFyZ3YpK1tlZ2ddKSAgICMgd2UncmUgZG9uZSBoZXJlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBlZ2cgYW5kIG9zLnBhdGguZXhpc3RzKGVnZyk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGVnZykKKyAgICBlbHNlOgorICAgICAgICBpZiBzZXR1cHRvb2xzLl9fdmVyc2lvbl9fID09ICcwLjAuMSc6CisgICAgICAgICAgICAjIHRlbGwgdGhlIHVzZXIgdG8gdW5pbnN0YWxsIG9ic29sZXRlIHZlcnNpb24KKyAgICAgICAgICAgIHVzZV9zZXR1cHRvb2xzKHZlcnNpb24pCisKKyAgICByZXEgPSAic2V0dXB0b29scz49Iit2ZXJzaW9uCisgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKKyAgICB0cnk6CisgICAgICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZShyZXEpCisgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBlYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgbWFpbihsaXN0KGFyZ3YpK1tkb3dubG9hZF9zZXR1cHRvb2xzKGRlbGF5PTApXSkKKyAgICAgICAgc3lzLmV4aXQoMCkgIyB0cnkgdG8gZm9yY2UgYW4gZXhpdAorICAgIGVsc2U6CisgICAgICAgIGlmIGFyZ3Y6CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICAgICAgICAgIG1haW4oYXJndikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJTZXR1cHRvb2xzIHZlcnNpb24iLHZlcnNpb24sIm9yIGdyZWF0ZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiIKKyAgICAgICAgICAgIHByaW50ICcoUnVuICJlel9zZXR1cC5weSAtVSBzZXR1cHRvb2xzIiB0byByZWluc3RhbGwgb3IgdXBncmFkZS4pJworCisKKworZGVmIHVwZGF0ZV9tZDUoZmlsZW5hbWVzKToKKyAgICAiIiJVcGRhdGUgb3VyIGJ1aWx0LWluIG1kNSByZWdpc3RyeSIiIgorCisgICAgaW1wb3J0IHJlCisgICAgZnJvbSBtZDUgaW1wb3J0IG1kNQorCisgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShuYW1lKQorICAgICAgICBmID0gb3BlbihuYW1lLCdyYicpCisgICAgICAgIG1kNV9kYXRhW2Jhc2VdID0gbWQ1KGYucmVhZCgpKS5oZXhkaWdlc3QoKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRhdGEgPSBbIiAgICAlcjogJXIsXG4iICUgaXQgZm9yIGl0IGluIG1kNV9kYXRhLml0ZW1zKCldCisgICAgZGF0YS5zb3J0KCkKKyAgICByZXBsID0gIiIuam9pbihkYXRhKQorCisgICAgaW1wb3J0IGluc3BlY3QKKyAgICBzcmNmaWxlID0gaW5zcGVjdC5nZXRzb3VyY2VmaWxlKHN5cy5tb2R1bGVzW19fbmFtZV9fXSkKKyAgICBmID0gb3BlbihzcmNmaWxlLCAncmInKTsgc3JjID0gZi5yZWFkKCk7IGYuY2xvc2UoKQorCisgICAgbWF0Y2ggPSByZS5zZWFyY2goIlxubWQ1X2RhdGEgPSB7XG4oW159XSspfSIsIHNyYykKKyAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkludGVybmFsIGVycm9yISIKKyAgICAgICAgc3lzLmV4aXQoMikKKworICAgIHNyYyA9IHNyY1s6bWF0Y2guc3RhcnQoMSldICsgcmVwbCArIHNyY1ttYXRjaC5lbmQoMSk6XQorICAgIGYgPSBvcGVuKHNyY2ZpbGUsJ3cnKQorICAgIGYud3JpdGUoc3JjKQorICAgIGYuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fPT0nX19tYWluX18nOgorICAgIGlmIGxlbihzeXMuYXJndik+MiBhbmQgc3lzLmFyZ3ZbMV09PSctLW1kNXVwZGF0ZSc6CisgICAgICAgIHVwZGF0ZV9tZDUoc3lzLmFyZ3ZbMjpdKQorICAgIGVsc2U6CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorCisKKworCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9odWRzb24tYnVpbGQuc2ggYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vaHVkc29uLWJ1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZiZTZmODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vaHVkc29uLWJ1aWxkLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9iYXNoCisKK0FOVExSX0pPQj0kezE6LUFOVExSX1Rvb2x9CitTVF9WRVJTSU9OPTMuMQorQU5UTFIyX1ZFUlNJT049Mi43LjcKKworIyBmaW5kIHRoZSBhbnRsci5qYXIgZnJvbSB0aGUgdXBzdHJlYW0gcHJvamVjdAorSkFSPSQobHMgJFdPUktTUEFDRS8uLi8uLi8kQU5UTFJfSk9CL2xhc3RTdWNjZXNzZnVsL29yZy5hbnRsclwkYW50bHIvYXJjaGl2ZS9vcmcuYW50bHIvYW50bHIvKi9hbnRsci0qLWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIpCitlY2hvICJhbnRsci5qYXI9JEpBUiIKKworaWYgWyAhIC1mICIkSkFSIiBdOyB0aGVuCisgICAgZWNobyAiQ291bGQgbm90IGZpbmQgYW50bHIuamFyIgorICAgIGV4aXQgMQorZmkKKworICAgIAorZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiU2V0dGluZyB1cCBkZXBlbmRlbmNpZXMiCitlY2hvCisKK3JtIC1mciAkV09SS1NQQUNFL3RtcAorbWtkaXIgLXAgJFdPUktTUEFDRS90bXAKK2NkICRXT1JLU1BBQ0UKKworIyBzdHJpbmd0ZW1wbGF0ZTMKK2lmIFsgISAtZiBzdHJpbmd0ZW1wbGF0ZTMtJFNUX1ZFUlNJT04udGFyLmd6IF07IHRoZW4KKyAgICB3Z2V0IGh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcGFja2FnZXMvc291cmNlL3Mvc3RyaW5ndGVtcGxhdGUzL3N0cmluZ3RlbXBsYXRlMy0kU1RfVkVSU0lPTi50YXIuZ3oKK2ZpCisoY2QgdG1wOyB0YXIgeHpmIC4uL3N0cmluZ3RlbXBsYXRlMy0kU1RfVkVSU0lPTi50YXIuZ3opCisoY2QgdG1wL3N0cmluZ3RlbXBsYXRlMy0kU1RfVkVSU0lPTjsgcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxpYj0kV09SS1NQQUNFKQorCisjIGFudGxyMgoraWYgWyAhIC1mIGFudGxyLSRBTlRMUjJfVkVSU0lPTi50YXIuZ3ogXTsgdGhlbgorICAgIHdnZXQgaHR0cDovL3d3dy5hbnRscjIub3JnL2Rvd25sb2FkL2FudGxyLSRBTlRMUjJfVkVSU0lPTi50YXIuZ3oKK2ZpCisoY2QgdG1wOyB0YXIgeHpmIC4uL2FudGxyLSRBTlRMUjJfVkVSU0lPTi50YXIuZ3opCisoY2QgdG1wL2FudGxyLSRBTlRMUjJfVkVSU0lPTi9saWIvcHl0aG9uOyBweXRob24gc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGliPSRXT1JLU1BBQ0UpCisKKworZXhwb3J0IENMQVNTUEFUSD0kSkFSCisKK2VjaG8gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIKK2VjaG8gIlJ1bm5pbmcgdGhlIHRlc3RzdWl0ZSIKK2VjaG8KKworY2QgJFdPUktTUEFDRQorcm0gLWZyIHRlc3RvdXQvCitta2RpciAtcCB0ZXN0b3V0LworcHl0aG9uIHNldHVwLnB5IHVuaXR0ZXN0IC0teG1sLW91dHB1dD10ZXN0b3V0LworcHl0aG9uIHNldHVwLnB5IGZ1bmN0ZXN0IC0teG1sLW91dHB1dD10ZXN0b3V0LyAtLWFudGxyLWphcj0iJEpBUiIKKworCitlY2hvICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCitlY2hvICJSdW5uaW5nIHB5bGludCIKK2VjaG8KKworY2QgJFdPUktTUEFDRQorcHlsaW50IC0tcmNmaWxlPXB5bGludHJjIC0tb3V0cHV0LWZvcm1hdD1wYXJzZWFibGUgLS1pbmNsdWRlLWlkcz15ZXMgYW50bHIzIHwgdGVlIHB5bGludC1yZXBvcnQudHh0CisKKworZWNobyAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorZWNobyAiQnVpbGRpbmcgZGlzdCBmaWxlcyIKK2VjaG8KKworY2QgJFdPUktTUEFDRQorcm0gLWYgZGlzdC8qCitjcCAtZiAkSkFSIGRpc3QvCitweXRob24gc2V0dXAucHkgc2Rpc3QgLS1mb3JtYXRzPWd6dGFyLHppcAorZm9yIFBZVEhPTiBpbiAvdXNyL2Jpbi9weXRob24yLj87IGRvCisgICAgJFBZVEhPTiBzZXR1cC5weSBiZGlzdF9lZ2cKK2RvbmUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi9ta2RveHkuc2ggYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vbWtkb3h5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM2ZmZmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vbWtkb3h5LnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgLWUgZG94eWdlbi5zaCBdOyB0aGVuCisgICAgLiBkb3h5Z2VuLnNoCitmaQorCitybSAtZnIgYnVpbGQvZG9jCitta2RpciAtcCBidWlsZC9kb2MvYW50bHIzCisKK2ZvciBmIGluIF9faW5pdF9fIGV4Y2VwdGlvbnMgY29uc3RhbnRzIGRmYSB0b2tlbnMgc3RyZWFtcyByZWNvZ25pemVyczsgZG8KKyAgICBzZWQgLWUgJy9iZWdpblxbbGljZW5jZVxdLywvZW5kXFtsaWNlbmNlXF0vZCcgYW50bHIzLyRmLnB5IFwKKyAgICAgID4+YnVpbGQvZG9jL2FudGxyMy5weQorZG9uZQorCit0b3VjaCBidWlsZC9kb2MvYW50bHIzL19faW5pdF9fLnB5CisKK2NwIC1mIGFudGxyMy90cmVlLnB5IGJ1aWxkL2RvYy9hbnRscjMKK2NwIC1mIGFudGxyMy90cmVld2l6YXJkLnB5IGJ1aWxkL2RvYy9hbnRscjMKKworZG94eWdlbiBkb3h5ZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3B5bGludHJjIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3B5bGludHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDcyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vcHlsaW50cmMKQEAgLTAsMCArMSwzMjEgQEAKKyMgbGludCBQeXRob24gbW9kdWxlcyB1c2luZyBleHRlcm5hbCBjaGVja2Vycy4KKyMgCisjIFRoaXMgaXMgdGhlIG1haW4gY2hlY2tlciBjb250cm9saW5nIHRoZSBvdGhlciBvbmVzIGFuZCB0aGUgcmVwb3J0cworIyBnZW5lcmF0aW9uLiBJdCBpcyBpdHNlbGYgYm90aCBhIHJhdyBjaGVja2VyIGFuZCBhbiBhc3RuZyBjaGVja2VyIGluIG9yZGVyCisjIHRvOgorIyAqIGhhbmRsZSBtZXNzYWdlIGFjdGl2YXRpb24gLyBkZWFjdGl2YXRpb24gYXQgdGhlIG1vZHVsZSBsZXZlbAorIyAqIGhhbmRsZSBzb21lIGJhc2ljIGJ1dCBuZWNlc3Nhcnkgc3RhdHMnZGF0YSAobnVtYmVyIG9mIGNsYXNzZXMsIG1ldGhvZHMuLi4pCisjIAorW01BU1RFUl0KKworIyBTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmaWxlLgorI3JjZmlsZT0KKworIyBQcm9maWxlZCBleGVjdXRpb24uCitwcm9maWxlPW5vCisKKyMgQWRkIDxmaWxlIG9yIGRpcmVjdG9yeT4gdG8gdGhlIGJsYWNrIGxpc3QuIEl0IHNob3VsZCBiZSBhIGJhc2UgbmFtZSwgbm90IGEKKyMgcGF0aC4gWW91IG1heSBzZXQgdGhpcyBvcHRpb24gbXVsdGlwbGUgdGltZXMuCitpZ25vcmU9Q1ZTCisKKyMgUGlja2xlIGNvbGxlY3RlZCBkYXRhIGZvciBsYXRlciBjb21wYXJpc29ucy4KK3BlcnNpc3RlbnQ9eWVzCisKKyMgU2V0IHRoZSBjYWNoZSBzaXplIGZvciBhc3RuZyBvYmplY3RzLgorY2FjaGUtc2l6ZT01MDAKKworIyBMaXN0IG9mIHBsdWdpbnMgKGFzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgb2YgcHl0aG9uIG1vZHVsZXMgbmFtZXMpIHRvIGxvYWQsCisjIHVzdWFsbHkgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbCBjaGVja2Vycy4KK2xvYWQtcGx1Z2lucz0KKworCitbQ09NTUFORFNdCisKKyMgRGlzcGxheSBhIGhlbHAgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UgaWQgYW5kIGV4aXQuIFRoZSB2YWx1ZSBtYXkgYmUgYQorIyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXNzYWdlIGlkcy4KKyNoZWxwLW1zZz0KKworCitbTUVTU0FHRVMgQ09OVFJPTF0KKworIyBFbmFibGUgb25seSBjaGVja2VyKHMpIHdpdGggdGhlIGdpdmVuIGlkKHMpLiBUaGlzIG9wdGlvbiBjb25mbGljdCB3aXRoIHRoZQorIyBkaXNhYmxlLWNoZWNrZXIgb3B0aW9uCisjZW5hYmxlLWNoZWNrZXI9CisKKyMgRW5hYmxlIGFsbCBjaGVja2VyKHMpIGV4Y2VwdCB0aG9zZSB3aXRoIHRoZSBnaXZlbiBpZChzKS4gVGhpcyBvcHRpb24gY29uZmxpY3QKKyMgd2l0aCB0aGUgZGlzYWJsZS1jaGVja2VyIG9wdGlvbgorI2Rpc2FibGUtY2hlY2tlcj0KKworIyBFbmFibGUgYWxsIG1lc3NhZ2VzIGluIHRoZSBsaXN0ZWQgY2F0ZWdvcmllcy4KKyNlbmFibGUtbXNnLWNhdD0KKworIyBEaXNhYmxlIGFsbCBtZXNzYWdlcyBpbiB0aGUgbGlzdGVkIGNhdGVnb3JpZXMuCisjZGlzYWJsZS1tc2ctY2F0PQorCisjIEVuYWJsZSB0aGUgbWVzc2FnZShzKSB3aXRoIHRoZSBnaXZlbiBpZChzKS4KKyNlbmFibGUtbXNnPQorCisjIERpc2FibGUgdGhlIG1lc3NhZ2Uocykgd2l0aCB0aGUgZ2l2ZW4gaWQocykuCisjIFcwNjIyOiBSZWRlZmluaW5nIGJ1aWx0LWluICcuLi4nCisjIEMwMTAzOiBJbnZhbGlkIG5hbWUKKyMgUjA5MDQ6IFRvbyBtYW55IHB1YmxpYyBtZXRob2RzCisjIFIwMjAxOiBNZXRob2QgY291bGQgYmUgYSBmdW5jdGlvbgorIyBDMDMwMjogVG9vIG1hbnkgbGluZXMgaW4gbW9kdWxlCisjIFIwOTAyOiBUb28gbWFueSBpbnN0YW5jZSBhdHRyaWJ1dGVzCisjIFIwOTEzOiBUb28gbWFueSBhcmd1bWVudHMKKyMgUjA5MTI6IFRvbyBtYW55IGJyYW5jaGVzCisjIFIwOTAzOiBUbyBmZXcgcHVibGljIG1ldGhvZHMKKyMgQzAxMTE6IE1pc3NpbmcgZG9jc3RyaW5nCisjIFcwNDAzOiBSZWxhdGl2ZSBpbXBvcnQKKyMgVzA0MDE6IFdpbGRjYXJkIGltcG9ydAorIyBXMDE0MjogKi8qKiBtYWdpYworZGlzYWJsZS1tc2c9VzA2MjIsIEMwMTAzLCBSMDkwNCwgUjAyMDEsIEMwMzAyLCBSMDkwMiwgUjA5MTMsIFIwOTEyLCBSMDkwMywgQzAxMTEsIFcwNDAzLCBXMDQwMSwgVzAxNDIKKworCitbUkVQT1JUU10KKworIyBzZXQgdGhlIG91dHB1dCBmb3JtYXQuIEF2YWlsYWJsZSBmb3JtYXRzIGFyZSB0ZXh0LCBwYXJzZWFibGUsIGNvbG9yaXplZCBhbmQKKyMgaHRtbAorb3V0cHV0LWZvcm1hdD10ZXh0CisKKyMgSW5jbHVkZSBtZXNzYWdlJ3MgaWQgaW4gb3V0cHV0CitpbmNsdWRlLWlkcz15ZXMKKworIyBQdXQgbWVzc2FnZXMgaW4gYSBzZXBhcmF0ZSBmaWxlIGZvciBlYWNoIG1vZHVsZSAvIHBhY2thZ2Ugc3BlY2lmaWVkIG9uIHRoZQorIyBjb21tYW5kIGxpbmUgaW5zdGVhZCBvZiBwcmludGluZyB0aGVtIG9uIHN0ZG91dC4gUmVwb3J0cyAoaWYgYW55KSB3aWxsIGJlCisjIHdyaXR0ZW4gaW4gYSBmaWxlIG5hbWUgInB5bGludF9nbG9iYWwuW3R4dHxodG1sXSIuCitmaWxlcy1vdXRwdXQ9bm8KKworIyBUZWxscyB3ZXRoZXIgdG8gZGlzcGxheSBhIGZ1bGwgcmVwb3J0IG9yIG9ubHkgdGhlIG1lc3NhZ2VzCityZXBvcnRzPXllcworCisjIFB5dGhvbiBleHByZXNzaW9uIHdoaWNoIHNob3VsZCByZXR1cm4gYSBub3RlIGxlc3MgdGhhbiAxMCAoMTAgaXMgdGhlIGhpZ2hlc3QKKyMgbm90ZSkuWW91IGhhdmUgYWNjZXNzIHRvIHRoZSB2YXJpYWJsZXMgZXJyb3JzIHdhcm5pbmcsIHN0YXRlbWVudCB3aGljaAorIyByZXNwZWN0aXZseSBjb250YWluIHRoZSBudW1iZXIgb2YgZXJyb3JzIC8gd2FybmluZ3MgbWVzc2FnZXMgYW5kIHRoZSB0b3RhbAorIyBudW1iZXIgb2Ygc3RhdGVtZW50cyBhbmFseXplZC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBnbG9iYWwgZXZhbHVhdGlvbiByZXBvcnQKKyMgKFIwMDA0KS4KK2V2YWx1YXRpb249MTAuMCAtICgoZmxvYXQoNSAqIGVycm9yICsgd2FybmluZyArIHJlZmFjdG9yICsgY29udmVudGlvbikgLyBzdGF0ZW1lbnQpICogMTApCisKKyMgQWRkIGEgY29tbWVudCBhY2NvcmRpbmcgdG8geW91ciBldmFsdWF0aW9uIG5vdGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgZ2xvYmFsCisjIGV2YWx1YXRpb24gcmVwb3J0IChSMDAwNCkuCitjb21tZW50PW5vCisKKyMgRW5hYmxlIHRoZSByZXBvcnQocykgd2l0aCB0aGUgZ2l2ZW4gaWQocykuCisjZW5hYmxlLXJlcG9ydD0KKworIyBEaXNhYmxlIHRoZSByZXBvcnQocykgd2l0aCB0aGUgZ2l2ZW4gaWQocykuCisjZGlzYWJsZS1yZXBvcnQ9CisKKworIyB0cnkgdG8gZmluZCBidWdzIGluIHRoZSBjb2RlIHVzaW5nIHR5cGUgaW5mZXJlbmNlCisjIAorW1RZUEVDSEVDS10KKworIyBUZWxscyB3ZXRoZXIgbWlzc2luZyBtZW1iZXJzIGFjY2Vzc2VkIGluIG1peGluIGNsYXNzIHNob3VsZCBiZSBpZ25vcmVkLiBBCisjIG1peGluIGNsYXNzIGlzIGRldGVjdGVkIGlmIGl0cyBuYW1lIGVuZHMgd2l0aCAibWl4aW4iIChjYXNlIGluc2Vuc2l0aXZlKS4KK2lnbm9yZS1taXhpbi1tZW1iZXJzPXllcworCisjIFdoZW4gem9wZSBtb2RlIGlzIGFjdGl2YXRlZCwgY29uc2lkZXIgdGhlIGFjcXVpcmVkLW1lbWJlcnMgb3B0aW9uIHRvIGlnbm9yZQorIyBhY2Nlc3MgdG8gc29tZSB1bmRlZmluZWQgYXR0cmlidXRlcy4KK3pvcGU9bm8KKworIyBMaXN0IG9mIG1lbWJlcnMgd2hpY2ggYXJlIHVzdWFsbHkgZ2V0IHRocm91Z2ggem9wZSdzIGFjcXVpc2l0aW9uIG1lY2FuaXNtIGFuZAorIyBzbyBzaG91bGRuJ3QgdHJpZ2dlciBFMDIwMSB3aGVuIGFjY2Vzc2VkIChuZWVkIHpvcGU9eWVzIHRvIGJlIGNvbnNpZGVyZWQpLgorYWNxdWlyZWQtbWVtYmVycz1SRVFVRVNULGFjbF91c2VycyxhcV9wYXJlbnQKKworCisjIGNoZWNrcyBmb3IKKyMgKiB1bnVzZWQgdmFyaWFibGVzIC8gaW1wb3J0cworIyAqIHVuZGVmaW5lZCB2YXJpYWJsZXMKKyMgKiByZWRlZmluaXRpb24gb2YgdmFyaWFibGUgZnJvbSBidWlsdGlucyBvciBmcm9tIGFuIG91dGVyIHNjb3BlCisjICogdXNlIG9mIHZhcmlhYmxlIGJlZm9yZSBhc3NpZ21lbnQKKyMgCitbVkFSSUFCTEVTXQorCisjIFRlbGxzIHdldGhlciB3ZSBzaG91bGQgY2hlY2sgZm9yIHVudXNlZCBpbXBvcnQgaW4gX19pbml0X18gZmlsZXMuCitpbml0LWltcG9ydD1ubworCisjIEEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIG5hbWVzIHVzZWQgZm9yIGR1bW15IHZhcmlhYmxlcyAoaS5lLiBub3QgdXNlZCkuCitkdW1teS12YXJpYWJsZXMtcmd4PV98ZHVtbXkKKworIyBMaXN0IG9mIGFkZGl0aW9uYWwgbmFtZXMgc3VwcG9zZWQgdG8gYmUgZGVmaW5lZCBpbiBidWlsdGlucy4gUmVtZW1iZXIgdGhhdAorIyB5b3Ugc2hvdWxkIGF2b2lkIHRvIGRlZmluZSBuZXcgYnVpbHRpbnMgd2hlbiBwb3NzaWJsZS4KK2FkZGl0aW9uYWwtYnVpbHRpbnM9CisKKworIyBjaGVja3MgZm9yIDoKKyMgKiBkb2Mgc3RyaW5ncworIyAqIG1vZHVsZXMgLyBjbGFzc2VzIC8gZnVuY3Rpb25zIC8gbWV0aG9kcyAvIGFyZ3VtZW50cyAvIHZhcmlhYmxlcyBuYW1lCisjICogbnVtYmVyIG9mIGFyZ3VtZW50cywgbG9jYWwgdmFyaWFibGVzLCBicmFuY2hzLCByZXR1cm5zIGFuZCBzdGF0ZW1lbnRzIGluCisjIGZ1bmN0aW9ucywgbWV0aG9kcworIyAqIHJlcXVpcmVkIG1vZHVsZSBhdHRyaWJ1dGVzCisjICogZGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWVzIGFzIGFyZ3VtZW50cworIyAqIHJlZGVmaW5pdGlvbiBvZiBmdW5jdGlvbiAvIG1ldGhvZCAvIGNsYXNzCisjICogdXNlcyBvZiB0aGUgZ2xvYmFsIHN0YXRlbWVudAorIyAKK1tCQVNJQ10KKworIyBSZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciBtb2R1bGUsIHNlcGFyYXRlZCBieSBhIGNvbW1hCityZXF1aXJlZC1hdHRyaWJ1dGVzPQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBmdW5jdGlvbnMgb3IgY2xhc3NlcyBuYW1lIHdoaWNoIGRvCisjIG5vdCByZXF1aXJlIGEgZG9jc3RyaW5nCituby1kb2NzdHJpbmctcmd4PV9fLipfXworCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1vZHVsZSBuYW1lcworbW9kdWxlLXJneD0oKFthLXpfXVthLXowLTlfXSopfChbQS1aXVthLXpBLVowLTldKykpJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1vZHVsZSBsZXZlbCBuYW1lcworY29uc3Qtcmd4PSgoW0EtWl9dW0EtWjEtOV9dKil8KF9fLipfXykpJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGNsYXNzIG5hbWVzCitjbGFzcy1yZ3g9W0EtWl9dW2EtekEtWjAtOV0rJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGZ1bmN0aW9uIG5hbWVzCitmdW5jdGlvbi1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1ldGhvZCBuYW1lcworbWV0aG9kLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgaW5zdGFuY2UgYXR0cmlidXRlIG5hbWVzCithdHRyLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgYXJndW1lbnQgbmFtZXMKK2FyZ3VtZW50LXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgdmFyaWFibGUgbmFtZXMKK3ZhcmlhYmxlLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgbGlzdCBjb21wcmVoZW5zaW9uIC8KKyMgZ2VuZXJhdG9yIGV4cHJlc3Npb24gdmFyaWFibGUgbmFtZXMKK2lubGluZXZhci1yZ3g9W0EtWmEtel9dW0EtWmEtejAtOV9dKiQKKworIyBHb29kIHZhcmlhYmxlIG5hbWVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgYWNjZXB0ZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hCitnb29kLW5hbWVzPWksaixrLGV4LFJ1bixfCisKKyMgQmFkIHZhcmlhYmxlIG5hbWVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgcmVmdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKK2JhZC1uYW1lcz1mb28sYmFyLGJheix0b3RvLHR1dHUsdGF0YQorCisjIExpc3Qgb2YgYnVpbHRpbnMgZnVuY3Rpb24gbmFtZXMgdGhhdCBzaG91bGQgbm90IGJlIHVzZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hCitiYWQtZnVuY3Rpb25zPW1hcCxmaWx0ZXIsYXBwbHksaW5wdXQKKworCisjIGNoZWNrcyBmb3Igc2lnbiBvZiBwb29yL21pc2Rlc2lnbjoKKyMgKiBudW1iZXIgb2YgbWV0aG9kcywgYXR0cmlidXRlcywgbG9jYWwgdmFyaWFibGVzLi4uCisjICogc2l6ZSwgY29tcGxleGl0eSBvZiBmdW5jdGlvbnMsIG1ldGhvZHMKKyMgCitbREVTSUdOXQorCisjIE1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gLyBtZXRob2QKK21heC1hcmdzPTUKKworIyBNYXhpbXVtIG51bWJlciBvZiBsb2NhbHMgZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1sb2NhbHM9MTUKKworIyBNYXhpbXVtIG51bWJlciBvZiByZXR1cm4gLyB5aWVsZCBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LXJldHVybnM9NgorCisjIE1heGltdW0gbnVtYmVyIG9mIGJyYW5jaCBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LWJyYW5jaHM9MTIKKworIyBNYXhpbXVtIG51bWJlciBvZiBzdGF0ZW1lbnRzIGluIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1zdGF0ZW1lbnRzPTUwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgcGFyZW50cyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAxKS4KK21heC1wYXJlbnRzPTcKKworIyBNYXhpbXVtIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBhIGNsYXNzIChzZWUgUjA5MDIpLgorbWF4LWF0dHJpYnV0ZXM9NworCisjIE1pbmltdW0gbnVtYmVyIG9mIHB1YmxpYyBtZXRob2RzIGZvciBhIGNsYXNzIChzZWUgUjA5MDMpLgorbWluLXB1YmxpYy1tZXRob2RzPTIKKworIyBNYXhpbXVtIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgYSBjbGFzcyAoc2VlIFIwOTA0KS4KK21heC1wdWJsaWMtbWV0aG9kcz0yMAorCisKKyMgY2hlY2tzIGZvciA6CisjICogbWV0aG9kcyB3aXRob3V0IHNlbGYgYXMgZmlyc3QgYXJndW1lbnQKKyMgKiBvdmVycmlkZGVuIG1ldGhvZHMgc2lnbmF0dXJlCisjICogYWNjZXNzIG9ubHkgdG8gZXhpc3RhbnQgbWVtYmVycyB2aWEgc2VsZgorIyAqIGF0dHJpYnV0ZXMgbm90IGRlZmluZWQgaW4gdGhlIF9faW5pdF9fIG1ldGhvZAorIyAqIHN1cHBvcnRlZCBpbnRlcmZhY2VzIGltcGxlbWVudGF0aW9uCisjICogdW5yZWFjaGFibGUgY29kZQorIyAKK1tDTEFTU0VTXQorCisjIExpc3Qgb2YgaW50ZXJmYWNlIG1ldGhvZHMgdG8gaWdub3JlLCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gVGhpcyBpcyB1c2VkIGZvcgorIyBpbnN0YW5jZSB0byBub3QgY2hlY2sgbWV0aG9kcyBkZWZpbmVzIGluIFpvcGUncyBJbnRlcmZhY2UgYmFzZSBjbGFzcy4KK2lnbm9yZS1pZmFjZS1tZXRob2RzPWlzSW1wbGVtZW50ZWRCeSxkZWZlcnJlZCxleHRlbmRzLG5hbWVzLG5hbWVzQW5kRGVzY3JpcHRpb25zLHF1ZXJ5RGVzY3JpcHRpb25Gb3IsZ2V0QmFzZXMsZ2V0RGVzY3JpcHRpb25Gb3IsZ2V0RG9jLGdldE5hbWUsZ2V0VGFnZ2VkVmFsdWUsZ2V0VGFnZ2VkVmFsdWVUYWdzLGlzRXF1YWxPckV4dGVuZGVkQnksc2V0VGFnZ2VkVmFsdWUsaXNJbXBsZW1lbnRlZEJ5SW5zdGFuY2VzT2YsYWRhcHRXaXRoLGlzX2ltcGxlbWVudGVkX2J5CisKKyMgTGlzdCBvZiBtZXRob2QgbmFtZXMgdXNlZCB0byBkZWNsYXJlIChpLmUuIGFzc2lnbikgaW5zdGFuY2UgYXR0cmlidXRlcy4KK2RlZmluaW5nLWF0dHItbWV0aG9kcz1fX2luaXRfXyxfX25ld19fLHNldFVwCisKKworIyBjaGVja3MgZm9yCisjICogZXh0ZXJuYWwgbW9kdWxlcyBkZXBlbmRlbmNpZXMKKyMgKiByZWxhdGl2ZSAvIHdpbGRjYXJkIGltcG9ydHMKKyMgKiBjeWNsaWMgaW1wb3J0cworIyAqIHVzZXMgb2YgZGVwcmVjYXRlZCBtb2R1bGVzCisjIAorW0lNUE9SVFNdCisKKyMgRGVwcmVjYXRlZCBtb2R1bGVzIHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKK2RlcHJlY2F0ZWQtbW9kdWxlcz1yZWdzdWIsc3RyaW5nLFRFUk1JT1MsQmFzdGlvbixyZXhlYworCisjIENyZWF0ZSBhIGdyYXBoIG9mIGV2ZXJ5IChpLmUuIGludGVybmFsIGFuZCBleHRlcm5hbCkgZGVwZW5kZW5jaWVzIGluIHRoZQorIyBnaXZlbiBmaWxlIChyZXBvcnQgUjA0MDIgbXVzdCBub3QgYmUgZGlzYWJsZWQpCitpbXBvcnQtZ3JhcGg9CisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGluIHRoZSBnaXZlbiBmaWxlIChyZXBvcnQgUjA0MDIgbXVzdAorIyBub3QgYmUgZGlzYWJsZWQpCitleHQtaW1wb3J0LWdyYXBoPQorCisjIENyZWF0ZSBhIGdyYXBoIG9mIGludGVybmFsIGRlcGVuZGVuY2llcyBpbiB0aGUgZ2l2ZW4gZmlsZSAocmVwb3J0IFIwNDAyIG11c3QKKyMgbm90IGJlIGRpc2FibGVkKQoraW50LWltcG9ydC1ncmFwaD0KKworCisjIGNoZWNrcyBmb3Igc2ltaWxhcml0aWVzIGFuZCBkdXBsaWNhdGVkIGNvZGUuIFRoaXMgY29tcHV0YXRpb24gbWF5IGJlCisjIG1lbW9yeSAvIENQVSBpbnRlbnNpdmUsIHNvIHlvdSBzaG91bGQgZGlzYWJsZSBpdCBpZiB5b3UgZXhwZXJpbWVudHMgc29tZQorIyBwcm9ibGVtcy4KKyMgCitbU0lNSUxBUklUSUVTXQorCisjIE1pbmltdW0gbGluZXMgbnVtYmVyIG9mIGEgc2ltaWxhcml0eS4KK21pbi1zaW1pbGFyaXR5LWxpbmVzPTQKKworIyBJZ25vcmUgY29tbWVudHMgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLgoraWdub3JlLWNvbW1lbnRzPXllcworCisjIElnbm9yZSBkb2NzdHJpbmdzIHdoZW4gY29tcHV0aW5nIHNpbWlsYXJpdGllcy4KK2lnbm9yZS1kb2NzdHJpbmdzPXllcworCisKKyMgY2hlY2tzIGZvciA6CisjICogdW5hdXRob3JpemVkIGNvbnN0cnVjdGlvbnMKKyMgKiBzdHJpY3QgaW5kZW50YXRpb24KKyMgKiBsaW5lIGxlbmd0aAorIyAqIHVzZSBvZiA8PiBpbnN0ZWFkIG9mICE9CisjIAorW0ZPUk1BVF0KKworIyBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9uIGEgc2luZ2xlIGxpbmUuCittYXgtbGluZS1sZW5ndGg9ODAKKworIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyBpbiBhIG1vZHVsZQorbWF4LW1vZHVsZS1saW5lcz0xMDAwCisKKyMgU3RyaW5nIHVzZWQgYXMgaW5kZW50YXRpb24gdW5pdC4gVGhpcyBpcyB1c3VhbGx5ICIgIiAoNCBzcGFjZXMpIG9yICJcdCIgKDEKKyMgdGFiKS4KK2luZGVudC1zdHJpbmc9JyAgICAnCisKKworIyBjaGVja3MgZm9yOgorIyAqIHdhcm5pbmcgbm90ZXMgaW4gdGhlIGNvZGUgbGlrZSBGSVhNRSwgWFhYCisjICogUEVQIDI2Mzogc291cmNlIGNvZGUgd2l0aCBub24gYXNjaWkgY2hhcmFjdGVyIGJ1dCBubyBlbmNvZGluZyBkZWNsYXJhdGlvbgorIyAKK1tNSVNDRUxMQU5FT1VTXQorCisjIExpc3Qgb2Ygbm90ZSB0YWdzIHRvIHRha2UgaW4gY29uc2lkZXJhdGlvbiwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCitub3Rlcz1GSVhNRSxYWFgsVE9ETwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3NldHVwLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vc2V0dXAucHkKQEAgLTAsMCArMSwzMDAgQEAKKyMgYm9vdHN0cmFwcGluZyBzZXR1cHRvb2xzCitpbXBvcnQgZXpfc2V0dXAKK2V6X3NldHVwLnVzZV9zZXR1cHRvb2xzKCkKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbiBpbXBvcnQgY2xlYW4gYXMgX2NsZWFuCitmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKKworCitjbGFzcyBjbGVhbihfY2xlYW4pOgorICAgICIiIkFsc28gY2xlYW51cCBsb2NhbCB0ZW1wIGZpbGVzLiIiIgorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgX2NsZWFuLnJ1bihzZWxmKQorCisgICAgICAgIGltcG9ydCBmbm1hdGNoCisKKyAgICAgICAgIyBraWxsIHRlbXBvcmFyeSBmaWxlcworICAgICAgICBwYXR0ZXJucyA9IFsKKyAgICAgICAgICAgICMgZ2VuZXJpYyB0ZW1wZmlsZXMKKyAgICAgICAgICAgICcqficsICcqLmJhaycsICcqLnB5YycsCisKKyAgICAgICAgICAgICMgdGVtcGZpbGVzIGdlbmVyYXRlZCBieSBBTlRMUiBydW5zCisgICAgICAgICAgICAndFswLTldKkxleGVyLnB5JywgJ3RbMC05XSpQYXJzZXIucHknLAorICAgICAgICAgICAgJyoudG9rZW5zJywgJypfXy5nJywKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgcGF0aCBpbiAoJ2FudGxyMycsICd1bml0dGVzdHMnLCAndGVzdHMnKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgcGF0aCkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCwgdG9wZG93bj1UcnVlKToKKyAgICAgICAgICAgICAgICAgICAgZ3JhdmV5YXJkID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhdCBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYXZleWFyZC5leHRlbmQoZm5tYXRjaC5maWx0ZXIoZmlsZXMsIHBhdCkpCisKKyAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZ3JhdmV5YXJkOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAnJXMnIiwgZmlsZVBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVQYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBkZWxldGUgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCwgZXhjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworCitjbGFzcyBUZXN0RXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgIHBhc3MKKworCisjIGdybWwuLiB0aGUgY2xhc3MgbmFtZSBhcHBlYXJzIGluIHRoZSAtLWhlbHAgb3V0cHV0OgorIyAuLi4KKyMgT3B0aW9ucyBmb3IgJ0NtZFVuaXRUZXN0JyBjb21tYW5kCisjIC4uLgorIyBzbyBJIGhhdmUgdG8gdXNlIGEgcmF0aGVyIHVnbHkgbmFtZS4uLgorY2xhc3MgdW5pdHRlc3QoQ29tbWFuZCk6CisgICAgIiIiUnVuIHVuaXQgdGVzdHMgZm9yIHBhY2thZ2UiIiIKKworICAgIGRlc2NyaXB0aW9uID0gInJ1biB1bml0IHRlc3RzIGZvciBwYWNrYWdlIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ3htbC1vdXRwdXQ9JywgTm9uZSwKKyAgICAgICAgICJEaXJlY3RvcnkgZm9yIEpVbml0IGNvbXBhdGlibGUgWE1MIGZpbGVzLiIpLAorICAgICAgICBdCisgICAgYm9vbGVhbl9vcHRpb25zID0gW10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYueG1sX291dHB1dCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB0ZXN0RGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICd1bml0dGVzdHMnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcih0ZXN0RGlyKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm90ICd1bml0dGVzdHMnIGRpcmVjdG9yeS4gRGlkIHlvdSBmZXRjaCB0aGUgIgorICAgICAgICAgICAgICAgICJkZXZlbG9wbWVudCB2ZXJzaW9uPyIsCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGltcG9ydCBnbG9iCisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBsb2FkRmFpbHVyZXMgPSBbXQorCisgICAgICAgICMgY29sbGVjdCB0ZXN0cyBmcm9tIGFsbCB1bml0dGVzdHMvdGVzdCoucHkgZmlsZXMKKyAgICAgICAgdGVzdEZpbGVzID0gW10KKyAgICAgICAgZm9yIHRlc3RQYXRoIGluIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4odGVzdERpciwgJ3Rlc3QqLnB5JykpOgorICAgICAgICAgICAgdGVzdEZpbGVzLmFwcGVuZCh0ZXN0UGF0aCkKKworICAgICAgICB0ZXN0RmlsZXMuc29ydCgpCisgICAgICAgIGZvciB0ZXN0UGF0aCBpbiB0ZXN0RmlsZXM6CisgICAgICAgICAgICB0ZXN0SUQgPSBvcy5wYXRoLmJhc2VuYW1lKHRlc3RQYXRoKVs6LTNdCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2RGaWxlLCBtb2RQYXRobmFtZSwgbW9kRGVzY3JpcHRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgID0gaW1wLmZpbmRfbW9kdWxlKHRlc3RJRCwgW3Rlc3REaXJdKQorCisgICAgICAgICAgICAgICAgdGVzdE1vZCA9IGltcC5sb2FkX21vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgdGVzdElELCBtb2RGaWxlLCBtb2RQYXRobmFtZSwgbW9kRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdHMoCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGVzdE1vZCkKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGJ1ZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9YnVmKQorCisgICAgICAgICAgICAgICAgbG9hZEZhaWx1cmVzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguYmFzZW5hbWUodGVzdFBhdGgpLCBidWYuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGlmIHNlbGYueG1sX291dHB1dDoKKyAgICAgICAgICAgIGltcG9ydCB4bWxydW5uZXIKKyAgICAgICAgICAgIHJ1bm5lciA9IHhtbHJ1bm5lci5YTUxUZXN0UnVubmVyKAorICAgICAgICAgICAgICAgIHN0cmVhbT1vcGVuKG9zLnBhdGguam9pbihzZWxmLnhtbF9vdXRwdXQsICd1bml0dGVzdC54bWwnKSwgJ3cnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQorICAgICAgICByZXN1bHQgPSBydW5uZXIucnVuKHN1aXRlKQorCisgICAgICAgIGZvciB0ZXN0TmFtZSwgZXJyb3IgaW4gbG9hZEZhaWx1cmVzOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnXG4nICsgJz0nKjcwICsgJ1xuJykKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb2FkIHRlc3QgbW9kdWxlICVzXG4iICUgdGVzdE5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGVycm9yKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnXG4nKQorCisgICAgICAgIGlmIG5vdCByZXN1bHQud2FzU3VjY2Vzc2Z1bCgpIG9yIGxvYWRGYWlsdXJlczoKKyAgICAgICAgICAgIHJhaXNlIFRlc3RFcnJvcigKKyAgICAgICAgICAgICAgICAiVW5pdCB0ZXN0IHN1aXRlIGZhaWxlZCEiLAorICAgICAgICAgICAgICAgICkKKworCitjbGFzcyBmdW5jdGVzdChDb21tYW5kKToKKyAgICAiIiJSdW4gZnVuY3Rpb25hbCB0ZXN0cyBmb3IgcGFja2FnZSIiIgorCisgICAgZGVzY3JpcHRpb24gPSAicnVuIGZ1bmN0aW9uYWwgdGVzdHMgZm9yIHBhY2thZ2UiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgndGVzdGNhc2U9JywgTm9uZSwKKyAgICAgICAgICJ0ZXN0Y2FzZSB0byBydW4gW2RlZmF1bHQ6IHJ1biBhbGxdIiksCisgICAgICAgICgnYW50bHItdmVyc2lvbj0nLCBOb25lLAorICAgICAgICAgIkFOVExSIHZlcnNpb24gdG8gdXNlIFtkZWZhdWx0OiBIRUFEIChpbiAuLi8uLi9idWlsZCldIiksCisgICAgICAgICgnYW50bHItamFyPScsIE5vbmUsCisgICAgICAgICAiRXhwbGljaXQgcGF0aCB0byBhbiBhbnRsciBqYXIgKG92ZXJyaWRlcyAtLWFudGxyLXZlcnNpb24pIiksCisgICAgICAgICgneG1sLW91dHB1dD0nLCBOb25lLAorICAgICAgICAgIkRpcmVjdG9yeSBmb3IgSlVuaXQgY29tcGF0aWJsZSBYTUwgZmlsZXMuIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RjYXNlID0gTm9uZQorICAgICAgICBzZWxmLmFudGxyX3ZlcnNpb24gPSAnSEVBRCcKKyAgICAgICAgc2VsZi5hbnRscl9qYXIgPSBOb25lCisgICAgICAgIHNlbGYueG1sX291dHB1dCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2xvYgorICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgIGltcG9ydCB1bml0dGVzdAorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIGltcG9ydCBTdHJpbmdJTworCisgICAgICAgIHRlc3REaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ3Rlc3RzJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGVzdERpcik6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgIlRoZXJlIGlzIG5vdCAndGVzdHMnIGRpcmVjdG9yeS4gRGlkIHlvdSBmZXRjaCB0aGUgIgorICAgICAgICAgICAgICAgICJkZXZlbG9wbWVudCB2ZXJzaW9uPyIsCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgICMgbWFrZSBzdXJlLCByZWxhdGl2ZSBpbXBvcnRzIGZyb20gdGVzdGNhc2VzIHdvcmsKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHRlc3REaXIpCisKKyAgICAgICAgcm9vdERpciA9IG9zLnBhdGguYWJzcGF0aCgKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nLCAnLi4nKSkKKworICAgICAgICBpZiBzZWxmLmFudGxyX2phciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IFtzZWxmLmFudGxyX2phcl0KKyAgICAgICAgZWxpZiBzZWxmLmFudGxyX3ZlcnNpb24gPT0gJ0hFQUQnOgorICAgICAgICAgICAgY2xhc3NwYXRoID0gWworICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihyb290RGlyLCAndG9vbCcsICd0YXJnZXQnLCAnY2xhc3NlcycpLAorICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihyb290RGlyLCAncnVudGltZScsICdKYXZhJywgJ3RhcmdldCcsICdjbGFzc2VzJykKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbGFzc3BhdGggPSBbCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJvb3REaXIsICdhcmNoaXZlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FudGxyLSVzLmphcicgJSBzZWxmLmFudGxyX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgXQorCisgICAgICAgIGNsYXNzcGF0aC5leHRlbmQoWworICAgICAgICAgICAgb3MucGF0aC5qb2luKHJvb3REaXIsICdsaWInLCAnYW50bHItMi43LjcuamFyJyksCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocm9vdERpciwgJ2xpYicsICdzdHJpbmd0ZW1wbGF0ZS0zLjIuMS5qYXInKSwKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihyb290RGlyLCAnbGliJywgJ1NULTQuMC4yLmphcicpLAorICAgICAgICAgICAgb3MucGF0aC5qb2luKHJvb3REaXIsICdsaWInLCAnanVuaXQtNC4yLmphcicpCisgICAgICAgICAgICBdKQorICAgICAgICBvcy5lbnZpcm9uWydDTEFTU1BBVEgnXSA9ICc6Jy5qb2luKGNsYXNzcGF0aCkKKworICAgICAgICBvcy5lbnZpcm9uWydBTlRMUlZFUlNJT04nXSA9IHNlbGYuYW50bHJfdmVyc2lvbgorCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgbG9hZEZhaWx1cmVzID0gW10KKworICAgICAgICAjIGNvbGxlY3QgdGVzdHMgZnJvbSBhbGwgdGVzdHMvdCoucHkgZmlsZXMKKyAgICAgICAgdGVzdEZpbGVzID0gW10KKyAgICAgICAgdGVzdF9nbG9iID0gJ3RbMC05XVswLTldWzAtOV0qLnB5JworICAgICAgICBmb3IgdGVzdFBhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbih0ZXN0RGlyLCB0ZXN0X2dsb2IpKToKKyAgICAgICAgICAgIGlmIHRlc3RQYXRoLmVuZHN3aXRoKCdMZXhlci5weScpIG9yIHRlc3RQYXRoLmVuZHN3aXRoKCdQYXJzZXIucHknKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIGlmIGEgc2luZ2xlIHRlc3RjYXNlIGhhcyBiZWVuIHNlbGVjdGVkLCBmaWx0ZXIgb3V0IGFsbCBvdGhlcgorICAgICAgICAgICAgIyB0ZXN0cworICAgICAgICAgICAgaWYgKHNlbGYudGVzdGNhc2UgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgbm90IG9zLnBhdGguYmFzZW5hbWUodGVzdFBhdGgpWzotM10uc3RhcnRzd2l0aChzZWxmLnRlc3RjYXNlKSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdGVzdEZpbGVzLmFwcGVuZCh0ZXN0UGF0aCkKKworICAgICAgICB0ZXN0RmlsZXMuc29ydCgpCisgICAgICAgIGZvciB0ZXN0UGF0aCBpbiB0ZXN0RmlsZXM6CisgICAgICAgICAgICB0ZXN0SUQgPSBvcy5wYXRoLmJhc2VuYW1lKHRlc3RQYXRoKVs6LTNdCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2RGaWxlLCBtb2RQYXRobmFtZSwgbW9kRGVzY3JpcHRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgID0gaW1wLmZpbmRfbW9kdWxlKHRlc3RJRCwgW3Rlc3REaXJdKQorCisgICAgICAgICAgICAgICAgdGVzdE1vZCA9IGltcC5sb2FkX21vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgdGVzdElELCBtb2RGaWxlLCBtb2RQYXRobmFtZSwgbW9kRGVzY3JpcHRpb24pCisKKyAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0cygKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZSh0ZXN0TW9kKSkKKworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBidWYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPWJ1ZikKKworICAgICAgICAgICAgICAgIGxvYWRGYWlsdXJlcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLmJhc2VuYW1lKHRlc3RQYXRoKSwgYnVmLmdldHZhbHVlKCkpKQorCisgICAgICAgIGlmIHNlbGYueG1sX291dHB1dDoKKyAgICAgICAgICAgIGltcG9ydCB4bWxydW5uZXIKKyAgICAgICAgICAgIHJ1bm5lciA9IHhtbHJ1bm5lci5YTUxUZXN0UnVubmVyKAorICAgICAgICAgICAgICAgIHN0cmVhbT1vcGVuKG9zLnBhdGguam9pbihzZWxmLnhtbF9vdXRwdXQsICdmdW5jdGVzdC54bWwnKSwgJ3cnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQorCisgICAgICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4oc3VpdGUpCisKKyAgICAgICAgZm9yIHRlc3ROYW1lLCBlcnJvciBpbiBsb2FkRmFpbHVyZXM6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcbicgKyAnPScqNzAgKyAnXG4nKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvYWQgdGVzdCBtb2R1bGUgJXNcbiIgJSB0ZXN0TmFtZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZXJyb3IpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcbicpCisKKyAgICAgICAgaWYgbm90IHJlc3VsdC53YXNTdWNjZXNzZnVsKCkgb3IgbG9hZEZhaWx1cmVzOgorICAgICAgICAgICAgcmFpc2UgVGVzdEVycm9yKAorICAgICAgICAgICAgICAgICJGdW5jdGlvbmFsIHRlc3Qgc3VpdGUgZmFpbGVkISIsCisgICAgICAgICAgICAgICAgKQorCisKK3NldHVwKG5hbWU9J2FudGxyX3B5dGhvbl9ydW50aW1lJywKKyAgICAgIHZlcnNpb249JzMuNCcsCisgICAgICBwYWNrYWdlcz1bJ2FudGxyMyddLAorCisgICAgICBhdXRob3I9IkJlbmphbWluIE5pZW1hbm4iLAorICAgICAgYXV0aG9yX2VtYWlsPSJwaW5rQG9kYWhvZGEuZGUiLAorICAgICAgdXJsPSJodHRwOi8vd3d3LmFudGxyLm9yZy8iLAorICAgICAgZG93bmxvYWRfdXJsPSJodHRwOi8vd3d3LmFudGxyLm9yZy9kb3dubG9hZC5odG1sIiwKKyAgICAgIGxpY2Vuc2U9IkJTRCIsCisgICAgICBkZXNjcmlwdGlvbj0iUnVudGltZSBwYWNrYWdlIGZvciBBTlRMUjMiLAorICAgICAgbG9uZ19kZXNjcmlwdGlvbj10ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgVGhpcyBpcyB0aGUgcnVudGltZSBwYWNrYWdlIGZvciBBTlRMUjMsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHVzZSBwYXJzZXJzCisgICAgICBnZW5lcmF0ZWQgYnkgQU5UTFIzLgorICAgICAgJycnKSwKKyAgICAgIGNtZGNsYXNzPXsndW5pdHRlc3QnOiB1bml0dGVzdCwKKyAgICAgICAgICAgICAgICAnZnVuY3Rlc3QnOiBmdW5jdGVzdCwKKyAgICAgICAgICAgICAgICAnY2xlYW4nOiBjbGVhbgorICAgICAgICAgICAgICAgIH0sCisgICAgICApCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwMWxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwMWxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyYjk1OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDAxbGV4ZXIuZwpAQCAtMCwwICsxLDYgQEAKK2xleGVyIGdyYW1tYXIgdDAwMWxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitaRVJPOiAnMCc7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwMWxleGVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDFsZXhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI4MjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDFsZXhlci5weQpAQCAtMCwwICsxLDU3IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDAxbGV4ZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgIyByZXBvcnQgZXJyb3JzIHRvIC9kZXYvbnVsbAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIHJlcG9ydEVycm9yKHNlbGYsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZSByZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnMCcpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0b2tlbi50eXBlLCBzZWxmLmxleGVyTW9kdWxlLlpFUk8pCisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0b2tlbi50eXBlLCBzZWxmLmxleGVyTW9kdWxlLkVPRikKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdEl0ZXJhdG9ySW50ZXJmYWNlKHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCcwJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB0eXBlcyA9IFt0b2tlbi50eXBlIGZvciB0b2tlbiBpbiBsZXhlcl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlcywgW3NlbGYubGV4ZXJNb2R1bGUuWkVST10pCisgICAgICAgIAorCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnMScpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgICAgICBleGNlcHQgYW50bHIzLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjLmV4cGVjdGluZywgJzAnKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjLnVuZXhwZWN0ZWRUeXBlLCAnMScpCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDAybGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDAybGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I2N2E5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDJsZXhlci5nCkBAIC0wLDAgKzEsNyBAQAorbGV4ZXIgZ3JhbW1hciB0MDAybGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK1pFUk86ICcwJzsKK09ORTogJzEnOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDJsZXhlci5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDAybGV4ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjMDNiYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDAybGV4ZXIucHkKQEAgLTAsMCArMSw1MCBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgdDAwMmxleGVyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgZW1pdEVycm9yTWVzc2FnZShzZWxmLCBtc2cpOgorICAgICAgICAgICAgICAgICMgcmVwb3J0IGVycm9ycyB0byAvZGV2L251bGwKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiByZXBvcnRFcnJvcihzZWxmLCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UgcmUKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJzAxJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRva2VuLnR5cGUsIHNlbGYubGV4ZXJNb2R1bGUuWkVSTykKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRva2VuLnR5cGUsIHNlbGYubGV4ZXJNb2R1bGUuT05FKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodG9rZW4udHlwZSwgc2VsZi5sZXhlck1vZHVsZS5FT0YpCisgICAgICAgIAorCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnMicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgICAgICBleGNlcHQgYW50bHIzLk5vVmlhYmxlQWx0RXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleGMudW5leHBlY3RlZFR5cGUsICcyJykKKyAgICAgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDNsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDNsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODVlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwM2xleGVyLmcKQEAgLTAsMCArMSw4IEBACitsZXhlciBncmFtbWFyIHQwMDNsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworWkVSTzogJzAnOworT05FOiAnMSc7CitGT09aRTogJ2Zvb3plJzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDAzbGV4ZXIucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwM2xleGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzI5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwM2xleGVyLnB5CkBAIC0wLDAgKzEsNTMgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIHQwMDNsZXhlcih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgICAgICAgICAjIHJlcG9ydCBlcnJvcnMgdG8gL2Rldi9udWxsCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgcmVwb3J0RXJyb3Ioc2VsZiwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlIHJlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCcwZm9vemUxJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRva2VuLnR5cGUsIHNlbGYubGV4ZXJNb2R1bGUuWkVSTykKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRva2VuLnR5cGUsIHNlbGYubGV4ZXJNb2R1bGUuRk9PWkUpCisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0b2tlbi50eXBlLCBzZWxmLmxleGVyTW9kdWxlLk9ORSkKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRva2VuLnR5cGUsIHNlbGYubGV4ZXJNb2R1bGUuRU9GKQorICAgICAgICAKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJzInKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKKyAgICAgICAgZXhjZXB0IGFudGxyMy5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjLnVuZXhwZWN0ZWRUeXBlLCAnMicpCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA0bGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA0bGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzlkMTBkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDRsZXhlci5nCkBAIC0wLDAgKzEsNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDA0bGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0ZPTzogJ2YnICdvJyo7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNGxleGVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDRsZXhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmI0NDRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDRsZXhlci5weQpAQCAtMCwwICsxLDcwIEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDA0bGV4ZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgIyByZXBvcnQgZXJyb3JzIHRvIC9kZXYvbnVsbAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIHJlcG9ydEVycm9yKHNlbGYsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZSByZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZmZvZm9vZm9vbycpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkZPTworICAgICAgICBhc3NlcnQgdG9rZW4uc3RhcnQgPT0gMCwgdG9rZW4uc3RhcnQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0b3AgPT0gMCwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnZicsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRk9PCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSAxLCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSAyLCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdmbycsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRk9PCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSAzLCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSA1LCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdmb28nLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkZPTworICAgICAgICBhc3NlcnQgdG9rZW4uc3RhcnQgPT0gNiwgdG9rZW4uc3RhcnQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0b3AgPT0gOSwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnZm9vbycsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRU9GCisgICAgICAgIAorCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnMicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgICAgICBleGNlcHQgYW50bHIzLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjLmV4cGVjdGluZywgJ2YnKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjLnVuZXhwZWN0ZWRUeXBlLCAnMicpCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDVsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDVsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2M2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNWxleGVyLmcKQEAgLTAsMCArMSw2IEBACitsZXhlciBncmFtbWFyIHQwMDVsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworRk9POiAnZicgJ28nKzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA1bGV4ZXIucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNWxleGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzA4M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNWxleGVyLnB5CkBAIC0wLDAgKzEsNzUgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIHQwMDVsZXhlcih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgICAgICAgICAjIHJlcG9ydCBlcnJvcnMgdG8gL2Rldi9udWxsCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgcmVwb3J0RXJyb3Ioc2VsZiwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlIHJlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb2Zvb2Zvb28nKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDAsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDEsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2ZvJywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDIsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDQsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2ZvbycsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRk9PCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSA1LCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSA4LCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdmb29vJywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5FT0YKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdE1hbGZvcm1lZElucHV0MShzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnMicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworICAgICAgICBleGNlcHQgYW50bHIzLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgYXNzZXJ0IGV4Yy5leHBlY3RpbmcgPT0gJ2YnLCByZXByKGV4Yy5leHBlY3RpbmcpCisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICcyJywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQyKHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcgorCisgICAgICAgIGV4Y2VwdCBhbnRscjMuRWFybHlFeGl0RXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09IGFudGxyMy5FT0YsIHJlcHIoZXhjLnVuZXhwZWN0ZWRUeXBlKQorICAgICAgICAgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNmxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNmxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5M2NiNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA2bGV4ZXIuZwpAQCAtMCwwICsxLDYgQEAKK2xleGVyIGdyYW1tYXIgdDAwNmxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitGT086ICdmJyAoJ28nIHwgJ2EnKSo7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwNmxleGVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDZsZXhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY4NDViCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDZsZXhlci5weQpAQCAtMCwwICsxLDYxIEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDA2bGV4ZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgIyByZXBvcnQgZXJyb3JzIHRvIC9kZXYvbnVsbAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIHJlcG9ydEVycm9yKHNlbGYsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZSByZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9mYWFvb2EnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDAsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDEsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2ZvJywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDIsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDcsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2ZhYW9vYScsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRU9GCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZvZm9hb29hb2EyJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgdG9rZW4KKworICAgICAgICBleGNlcHQgYW50bHIzLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgYXNzZXJ0IGV4Yy5leHBlY3RpbmcgPT0gJ2YnLCByZXByKGV4Yy5leHBlY3RpbmcpCisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICcyJywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmNoYXJQb3NpdGlvbkluTGluZSA9PSAxMCwgcmVwcihleGMuY2hhclBvc2l0aW9uSW5MaW5lKQorICAgICAgICAgICAgYXNzZXJ0IGV4Yy5saW5lID09IDEsIHJlcHIoZXhjLmxpbmUpCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA3bGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA3bGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY1MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDdsZXhlci5nCkBAIC0wLDAgKzEsNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDA3bGV4ZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0ZPTzogJ2YnICgnbycgfCAnYScgJ2InKykqOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDdsZXhlci5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA3bGV4ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwNjU3YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA3bGV4ZXIucHkKQEAgLTAsMCArMSw1OSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgdDAwN2xleGVyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgZW1pdEVycm9yTWVzc2FnZShzZWxmLCBtc2cpOgorICAgICAgICAgICAgICAgICMgcmVwb3J0IGVycm9ycyB0byAvZGV2L251bGwKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiByZXBvcnRFcnJvcihzZWxmLCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UgcmUKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZvZmFiYWJib29hYmInKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDAsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDEsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2ZvJywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDIsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDEyLCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdmYWJhYmJvb2FiYicsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRU9GCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZvYWJvYW8nKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCB0b2tlbgorCisgICAgICAgIGV4Y2VwdCBhbnRscjMuRWFybHlFeGl0RXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICdvJywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmNoYXJQb3NpdGlvbkluTGluZSA9PSA2LCByZXByKGV4Yy5jaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmxpbmUgPT0gMSwgcmVwcihleGMubGluZSkKKyAgICAgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwOGxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwOGxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0OTg2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA4bGV4ZXIuZwpAQCAtMCwwICsxLDYgQEAKK2xleGVyIGdyYW1tYXIgdDAwOGxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitGT086ICdmJyAnYSc/OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDhsZXhlci5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA4bGV4ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyYzE0OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDA4bGV4ZXIucHkKQEAgLTAsMCArMSw2NiBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgdDAwOGxleGVyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgZW1pdEVycm9yTWVzc2FnZShzZWxmLCBtc2cpOgorICAgICAgICAgICAgICAgICMgcmVwb3J0IGVycm9ycyB0byAvZGV2L251bGwKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiByZXBvcnRFcnJvcihzZWxmLCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UgcmUKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZmYWYnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5GT08KKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDAsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDAsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2YnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkZPTworICAgICAgICBhc3NlcnQgdG9rZW4uc3RhcnQgPT0gMSwgdG9rZW4uc3RhcnQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0b3AgPT0gMiwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnZmEnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkZPTworICAgICAgICBhc3NlcnQgdG9rZW4uc3RhcnQgPT0gMywgdG9rZW4uc3RhcnQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0b3AgPT0gMywgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnZicsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRU9GCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZhZmInKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCB0b2tlbgorCisgICAgICAgIGV4Y2VwdCBhbnRscjMuTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICdiJywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmNoYXJQb3NpdGlvbkluTGluZSA9PSAzLCByZXByKGV4Yy5jaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmxpbmUgPT0gMSwgcmVwcihleGMubGluZSkKKyAgICAgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDlsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDlsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjY5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwOWxleGVyLmcKQEAgLTAsMCArMSw2IEBACitsZXhlciBncmFtbWFyIHQwMDlsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworRElHSVQ6ICcwJyAuLiAnOSc7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAwOWxleGVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDlsZXhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJjYmJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMDlsZXhlci5weQpAQCAtMCwwICsxLDY3IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDA5bGV4ZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgICAgICAgICAjIHJlcG9ydCBlcnJvcnMgdG8gL2Rldi9udWxsCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgcmVwb3J0RXJyb3Ioc2VsZiwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlIHJlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorCisKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCcwODUnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5ESUdJVAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RhcnQgPT0gMCwgdG9rZW4uc3RhcnQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0b3AgPT0gMCwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnMCcsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuRElHSVQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDEsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDEsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJzgnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkRJR0lUCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSAyLCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSAyLCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICc1JywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5FT0YKKworCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnMmEnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCB0b2tlbgorCisgICAgICAgIGV4Y2VwdCBhbnRscjMuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgIyBUT0RPOiBUaGlzIHNob3VsZCBwcm92aWRlIG1vcmUgdXNlZnVsIGluZm9ybWF0aW9uCisgICAgICAgICAgICBhc3NlcnQgZXhjLmV4cGVjdGluZyBpcyBOb25lCisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICdhJywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmNoYXJQb3NpdGlvbkluTGluZSA9PSAxLCByZXByKGV4Yy5jaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmxpbmUgPT0gMSwgcmVwcihleGMubGluZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTBsZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTBsZXhlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzYzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxMGxleGVyLmcKQEAgLTAsMCArMSw3IEBACitsZXhlciBncmFtbWFyIHQwMTBsZXhlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworSURFTlRJRklFUjogKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqOworV1M6ICgnICcgfCAnXG4nKSs7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxMGxleGVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTBsZXhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2QzMThjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTBsZXhlci5weQpAQCAtMCwwICsxLDc4IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDEwbGV4ZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgIyByZXBvcnQgZXJyb3JzIHRvIC9kZXYvbnVsbAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIHJlcG9ydEVycm9yKHNlbGYsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZSByZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vYmFyIF9BYjk4IFxuIEExMnNkZicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLklERU5USUZJRVIKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDAsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDUsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJ2Zvb2JhcicsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuV1MKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDYsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDYsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJyAnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLklERU5USUZJRVIKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDcsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDExLCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdfQWI5OCcsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuV1MKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDEyLCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSAxNCwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnIFxuICcsIHRva2VuLnRleHQKKworICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2tlbi50eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuSURFTlRJRklFUgorICAgICAgICBhc3NlcnQgdG9rZW4uc3RhcnQgPT0gMTUsIHRva2VuLnN0YXJ0CisgICAgICAgIGFzc2VydCB0b2tlbi5zdG9wID09IDIwLCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdBMTJzZGYnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkVPRgorCisKKyAgICBkZWYgdGVzdE1hbGZvcm1lZElucHV0KHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdhLWInKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCB0b2tlbgorCisgICAgICAgIGV4Y2VwdCBhbnRscjMuTm9WaWFibGVBbHRFeGNlcHRpb24sIGV4YzoKKyAgICAgICAgICAgIGFzc2VydCBleGMudW5leHBlY3RlZFR5cGUgPT0gJy0nLCByZXByKGV4Yy51bmV4cGVjdGVkVHlwZSkKKyAgICAgICAgICAgIGFzc2VydCBleGMuY2hhclBvc2l0aW9uSW5MaW5lID09IDEsIHJlcHIoZXhjLmNoYXJQb3NpdGlvbkluTGluZSkKKyAgICAgICAgICAgIGFzc2VydCBleGMubGluZSA9PSAxLCByZXByKGV4Yy5saW5lKQorCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDExbGV4ZXIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDExbGV4ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGU5YTNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTFsZXhlci5nCkBAIC0wLDAgKzEsMTkgQEAKK2xleGVyIGdyYW1tYXIgdDAxMWxleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitJREVOVElGSUVSOiAKKyAgICAgICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgCisgICAgICAgICgnYScuLid6JworICAgICAgICB8J0EnLi4nWicKKyAgICAgICAgfCcwJy4uJzknCisgICAgICAgIHwnXycKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgIHByaW50ICJVbmRlcnNjb3JlIiAKKyAgICAgICAgICAgICAgcHJpbnQgImZvbyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKSoKKyAgICA7CisKK1dTOiAoJyAnIHwgJ1xuJykrOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTFsZXhlci5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDExbGV4ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxNDI1NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDExbGV4ZXIucHkKQEAgLTAsMCArMSw3OCBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgdDAxMWxleGVyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgZW1pdEVycm9yTWVzc2FnZShzZWxmLCBtc2cpOgorICAgICAgICAgICAgICAgICMgcmVwb3J0IGVycm9ycyB0byAvZGV2L251bGwKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiByZXBvcnRFcnJvcihzZWxmLCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UgcmUKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhciBfQWI5OCBcbiBBMTJzZGYnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5JREVOVElGSUVSCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSAwLCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSA1LCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICdmb29iYXInLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLldTCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSA2LCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSA2LCB0b2tlbi5zdG9wCisgICAgICAgIGFzc2VydCB0b2tlbi50ZXh0ID09ICcgJywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5JREVOVElGSUVSCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSA3LCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSAxMSwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnX0FiOTgnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLldTCisgICAgICAgIGFzc2VydCB0b2tlbi5zdGFydCA9PSAxMiwgdG9rZW4uc3RhcnQKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0b3AgPT0gMTQsIHRva2VuLnN0b3AKKyAgICAgICAgYXNzZXJ0IHRva2VuLnRleHQgPT0gJyBcbiAnLCB0b2tlbi50ZXh0CisKKyAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBhc3NlcnQgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLklERU5USUZJRVIKKyAgICAgICAgYXNzZXJ0IHRva2VuLnN0YXJ0ID09IDE1LCB0b2tlbi5zdGFydAorICAgICAgICBhc3NlcnQgdG9rZW4uc3RvcCA9PSAyMCwgdG9rZW4uc3RvcAorICAgICAgICBhc3NlcnQgdG9rZW4udGV4dCA9PSAnQTEyc2RmJywgdG9rZW4udGV4dAorCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgYXNzZXJ0IHRva2VuLnR5cGUgPT0gc2VsZi5sZXhlck1vZHVsZS5FT0YKKworCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dChzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnYS1iJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgdG9rZW4KKworICAgICAgICBleGNlcHQgYW50bHIzLk5vVmlhYmxlQWx0RXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICctJywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmNoYXJQb3NpdGlvbkluTGluZSA9PSAxLCByZXByKGV4Yy5jaGFyUG9zaXRpb25JbkxpbmUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmxpbmUgPT0gMSwgcmVwcihleGMubGluZSkKKworICAgICAgICAgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxMmxleGVyWE1MLmlucHV0IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTJsZXhlclhNTC5pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODE1YTlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTJsZXhlclhNTC5pbnB1dApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzwhRE9DVFlQRSBjb21wb25lbnQgWworPCFFTEVNRU5UIGNvbXBvbmVudCAoUENEQVRBfHN1YikqPgorPCFBVFRMSVNUIGNvbXBvbmVudAorICAgICAgICAgIGF0dHIgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICBhdHRyMiBDREFUQSAjSU1QTElFRAorPgorPCFFTE1FTlQgc3ViIEVNUFRZPgorCitdPgorPGNvbXBvbmVudCBhdHRyPSJ2YWwndWUiIGF0dHIyPSd2YWwidWUnPgorPCEtLSBUaGlzIGlzIGEgY29tbWVudCAtLT4KK1RleHQKKzwhW0NEQVRBW2h1aHVdXT4KK8O2w6TDvMOfCismYW1wOworJmx0OworPD94dGFsIGN1cnNvcj0nMTEnPz4KKzxzdWIvPgorPHN1Yj48L3N1Yj4KKzwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEybGV4ZXJYTUwub3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTJsZXhlclhNTC5vdXRwdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1YzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEybGV4ZXJYTUwub3V0cHV0CkBAIC0wLDAgKzEsMzkgQEAKK1hNTCBkZWNsYXJhdGlvbgorQXR0cjogdmVyc2lvbj0nMS4wJworUk9PVEVMRU1FTlQ6IGNvbXBvbmVudAorSU5URVJOQUwgRFREOiBbCis8IUVMRU1FTlQgY29tcG9uZW50IChQQ0RBVEF8c3ViKSo+Cis8IUFUVExJU1QgY29tcG9uZW50CisgICAgICAgICAgYXR0ciBDREFUQSAjSU1QTElFRAorICAgICAgICAgIGF0dHIyIENEQVRBICNJTVBMSUVECis+Cis8IUVMTUVOVCBzdWIgRU1QVFk+CisKK10KK1N0YXJ0IFRhZzogY29tcG9uZW50CitBdHRyOiBhdHRyPSJ2YWwndWUiCitBdHRyOiBhdHRyMj0ndmFsInVlJworUENEQVRBOiAiCisiCitDb21tZW50OiAiPCEtLSBUaGlzIGlzIGEgY29tbWVudCAtLT4iCitQQ0RBVEE6ICIKK1RleHQKKyIKK0NEQVRBOiAiPCFbQ0RBVEFbaHVodV1dPiIKK1BDREFUQTogIgorw7bDpMO8w58KKyZhbXA7CismbHQ7CisiCitQSTogeHRhbAorQXR0cjogY3Vyc29yPScxMScKK1BDREFUQTogIgorIgorRW1wdHkgRWxlbWVudDogc3ViCitQQ0RBVEE6ICIKKyIKK1N0YXJ0IFRhZzogc3ViCitFbmQgVGFnOiBzdWIKK1BDREFUQTogIgorIgorRW5kIFRhZzogY29tcG9uZW50CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxMmxleGVyWE1MLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTJsZXhlclhNTC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZThmOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTJsZXhlclhNTC5weQpAQCAtMCwwICsxLDE4OSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHRleHR3cmFwCisKK2NsYXNzIHQwMTJsZXhlclhNTCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigndDAxMmxleGVyWE1MTGV4ZXIuZycpCisgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgICAgICAgICAjIHJlcG9ydCBlcnJvcnMgdG8gL2Rldi9udWxsCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgcmVwb3J0RXJyb3Ioc2VsZiwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlIHJlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBpbnB1dFBhdGggPSBvcy5wYXRoLnNwbGl0ZXh0KF9fZmlsZV9fKVswXSArICcuaW5wdXQnCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0odW5pY29kZShvcGVuKGlucHV0UGF0aCkucmVhZCgpLCAndXRmLTgnKSkKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgaWYgdG9rZW4udHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkVPRjoKKyAgICAgICAgICAgICAgICBicmVhaworCisKKyAgICAgICAgb3V0cHV0ID0gdW5pY29kZShsZXhlci5vdXRidWYuZ2V0dmFsdWUoKSwgJ3V0Zi04JykKKworICAgICAgICBvdXRwdXRQYXRoID0gb3MucGF0aC5zcGxpdGV4dChfX2ZpbGVfXylbMF0gKyAnLm91dHB1dCcKKyAgICAgICAgdGVzdE91dHB1dCA9IHVuaWNvZGUob3BlbihvdXRwdXRQYXRoKS5yZWFkKCksICd1dGYtOCcpCisKKyAgICAgICAgc3VjY2VzcyA9IChvdXRwdXQgPT0gdGVzdE91dHB1dCkKKyAgICAgICAgaWYgbm90IHN1Y2Nlc3M6CisgICAgICAgICAgICBkID0gZGlmZmxpYi5EaWZmZXIoKQorICAgICAgICAgICAgciA9IGQuY29tcGFyZShvdXRwdXQuc3BsaXRsaW5lcygxKSwgdGVzdE91dHB1dC5zcGxpdGxpbmVzKDEpKQorICAgICAgICAgICAgc2VsZi5mYWlsKAorICAgICAgICAgICAgICAgICcnLmpvaW4oW2wuZW5jb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykgZm9yIGwgaW4gcl0pCisgICAgICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdE1hbGZvcm1lZElucHV0MShzZWxmKToKKyAgICAgICAgaW5wdXQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICA8P3htbCB2ZXJzaW9uPScxLjAnPz4KKyAgICAgICAgPGRvY3VtZW50IGQ+CisgICAgICAgIDwvZG9jdW1lbnQ+CisgICAgICAgICIiIikKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gYW50bHIzLkVPRjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworICAgICAgICBleGNlcHQgYW50bHIzLk5vVmlhYmxlQWx0RXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICBhc3NlcnQgZXhjLnVuZXhwZWN0ZWRUeXBlID09ICc+JywgcmVwcihleGMudW5leHBlY3RlZFR5cGUpCisgICAgICAgICAgICBhc3NlcnQgZXhjLmNoYXJQb3NpdGlvbkluTGluZSA9PSAxMSwgcmVwcihleGMuY2hhclBvc2l0aW9uSW5MaW5lKQorICAgICAgICAgICAgYXNzZXJ0IGV4Yy5saW5lID09IDIsIHJlcHIoZXhjLmxpbmUpCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQyKHNlbGYpOgorICAgICAgICBpbnB1dCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgIDw/dG1sIHZlcnNpb249JzEuMCc/PgorICAgICAgICA8ZG9jdW1lbnQ+CisgICAgICAgIDwvZG9jdW1lbnQ+CisgICAgICAgICIiIikKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gYW50bHIzLkVPRjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKworICAgICAgICBleGNlcHQgYW50bHIzLk1pc21hdGNoZWRTZXRFeGNlcHRpb24sIGV4YzoKKyAgICAgICAgICAgIGFzc2VydCBleGMudW5leHBlY3RlZFR5cGUgPT0gJ3QnLCByZXByKGV4Yy51bmV4cGVjdGVkVHlwZSkKKyAgICAgICAgICAgIGFzc2VydCBleGMuY2hhclBvc2l0aW9uSW5MaW5lID09IDIsIHJlcHIoZXhjLmNoYXJQb3NpdGlvbkluTGluZSkKKyAgICAgICAgICAgIGFzc2VydCBleGMubGluZSA9PSAxLCByZXByKGV4Yy5saW5lKQorCisKKyAgICBkZWYgdGVzdE1hbGZvcm1lZElucHV0MyhzZWxmKToKKyAgICAgICAgaW5wdXQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICA8P3htbCB2ZXJzaW9uPScxLjAnPz4KKyAgICAgICAgPGRvY3UgbWVudCBhdHRyPSJmb28iPgorICAgICAgICA8L2RvY3VtZW50PgorICAgICAgICAiIiIpCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgICAgICBpZiB0b2tlbi50eXBlID09IGFudGxyMy5FT0Y6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisKKyAgICAgICAgZXhjZXB0IGFudGxyMy5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbiwgZXhjOgorICAgICAgICAgICAgYXNzZXJ0IGV4Yy51bmV4cGVjdGVkVHlwZSA9PSAnYScsIHJlcHIoZXhjLnVuZXhwZWN0ZWRUeXBlKQorICAgICAgICAgICAgYXNzZXJ0IGV4Yy5jaGFyUG9zaXRpb25JbkxpbmUgPT0gMTEsIHJlcHIoZXhjLmNoYXJQb3NpdGlvbkluTGluZSkKKyAgICAgICAgICAgIGFzc2VydCBleGMubGluZSA9PSAyLCByZXByKGV4Yy5saW5lKQorCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKworCisjIyAjIHJ1biBhbiBpbmZpbml0ZSBsb29wIHdpdGggcmFuZG9tbHkgbWFuZ2xlZCBpbnB1dAorIyMgd2hpbGUgVHJ1ZToKKyMjICAgICBwcmludCAicGluZyIKKworIyMgICAgIGlucHV0ID0gIiIiXAorIyMgPD94bWwgdmVyc2lvbj0nMS4wJz8+CisjIyA8IURPQ1RZUEUgY29tcG9uZW50IFsKKyMjIDwhRUxFTUVOVCBjb21wb25lbnQgKFBDREFUQXxzdWIpKj4KKyMjIDwhQVRUTElTVCBjb21wb25lbnQKKyMjICAgICAgICAgICBhdHRyIENEQVRBICNJTVBMSUVECisjIyAgICAgICAgICAgYXR0cjIgQ0RBVEEgI0lNUExJRUQKKyMjID4KKyMjIDwhRUxNRU5UIHN1YiBFTVBUWT4KKworIyMgXT4KKyMjIDxjb21wb25lbnQgYXR0cj0idmFsJ3VlIiBhdHRyMj0ndmFsInVlJz4KKyMjIDwhLS0gVGhpcyBpcyBhIGNvbW1lbnQgLS0+CisjIyBUZXh0CisjIyA8IVtDREFUQVtodWh1XV0+CisjIyAmYW1wOworIyMgJmx0OworIyMgPD94dGFsIGN1cnNvcj0nMTEnPz4KKyMjIDxzdWIvPgorIyMgPHN1Yj48L3N1Yj4KKyMjIDwvY29tcG9uZW50PgorIyMgIiIiCisKKyMjICAgICBpbXBvcnQgcmFuZG9tCisjIyAgICAgaW5wdXQgPSBsaXN0KGlucHV0KSAjIG1ha2UgaXQgbXV0YWJsZQorIyMgICAgIGZvciBfIGluIHJhbmdlKDMpOgorIyMgICAgICAgICBwMSA9IHJhbmRvbS5yYW5kcmFuZ2UobGVuKGlucHV0KSkKKyMjICAgICAgICAgcDIgPSByYW5kb20ucmFuZHJhbmdlKGxlbihpbnB1dCkpCisKKyMjICAgICAgICAgYzEgPSBpbnB1dFtwMV0KKyMjICAgICAgICAgaW5wdXRbcDFdID0gaW5wdXRbcDJdCisjIyAgICAgICAgIGlucHV0W3AyXSA9IGMxCisjIyAgICAgaW5wdXQgPSAnJy5qb2luKGlucHV0KSAjIGJhY2sgdG8gc3RyaW5nCisgICAgICAgIAorIyMgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisjIyAgICAgbGV4ZXIgPSBMZXhlcihzdHJlYW0pCisKKyMjICAgICB0cnk6CisjIyAgICAgICAgIHdoaWxlIFRydWU6CisjIyAgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisjIyAgICAgICAgICAgICBpZiB0b2tlbi50eXBlID09IEVPRjoKKyMjICAgICAgICAgICAgICAgICBicmVhaworCisjIyAgICAgZXhjZXB0IGFudGxyMy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiwgZXhjOgorIyMgICAgICAgICBwcmludCBleGMKKyMjICAgICAgICAgZm9yIGwgaW4gaW5wdXQuc3BsaXRsaW5lcygpWzA6ZXhjLmxpbmVdOgorIyMgICAgICAgICAgICAgcHJpbnQgbAorIyMgICAgICAgICBwcmludCAnICcqZXhjLmNoYXJQb3NpdGlvbkluTGluZSArICdeJworCisjIyAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24sIGV4YzoKKyMjICAgICAgICAgcHJpbnQgJ1xuJy5qb2luKFsnJTAyZDogJXMnICUgKGlkeCsxLCBsKSBmb3IgaWR4LCBsIGluIGVudW1lcmF0ZShpbnB1dC5zcGxpdGxpbmVzKCkpXSkKKyMjICAgICAgICAgcHJpbnQgIiVzIGF0ICVkOiVkIiAlIChleGMsIHN0cmVhbS5saW5lLCBzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lKQorIyMgICAgICAgICBwcmludAorICAgICAgICAKKyMjICAgICAgICAgcmFpc2UKKyAgICAKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEybGV4ZXJYTUxMZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTJsZXhlclhNTExleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYTIwMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEybGV4ZXJYTUxMZXhlci5nCkBAIC0wLDAgKzEsMTMyIEBACitsZXhlciBncmFtbWFyIHQwMTJsZXhlclhNTExleGVyOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitAaGVhZGVyIHsKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworfQorCitAbGV4ZXI6OmluaXQgeworc2VsZi5vdXRidWYgPSBTdHJpbmdJTygpCit9CisKK0BsZXhlcjo6bWVtYmVycyB7CitkZWYgb3V0cHV0KHNlbGYsIGxpbmUpOgorICAgIHNlbGYub3V0YnVmLndyaXRlKGxpbmUuZW5jb2RlKCd1dGYtOCcpICsgIlxuIikKK30KKworRE9DVU1FTlQKKyAgICA6ICBYTUxERUNMPyBXUz8gRE9DVFlQRT8gV1M/IEVMRU1FTlQgV1M/IAorICAgIDsKKworZnJhZ21lbnQgRE9DVFlQRQorICAgIDoKKyAgICAgICAgJzwhRE9DVFlQRScgV1Mgcm9vdEVsZW1lbnROYW1lPUdFTkVSSUNfSUQgCisgICAgICAgIHtzZWxmLm91dHB1dCgiUk9PVEVMRU1FTlQ6ICIrcm9vdEVsZW1lbnROYW1lLnRleHQpfQorICAgICAgICBXUworICAgICAgICAoIAorICAgICAgICAgICAgKCAnU1lTVEVNJyBXUyBzeXMxPVZBTFVFCisgICAgICAgICAgICAgICAge3NlbGYub3V0cHV0KCJTWVNURU06ICIrc3lzMS50ZXh0KX0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHwgJ1BVQkxJQycgV1MgcHViPVZBTFVFIFdTIHN5czI9VkFMVUUKKyAgICAgICAgICAgICAgICB7c2VsZi5vdXRwdXQoIlBVQkxJQzogIitwdWIudGV4dCl9CisgICAgICAgICAgICAgICAge3NlbGYub3V0cHV0KCJTWVNURU06ICIrc3lzMi50ZXh0KX0gICAKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgICggV1MgKT8KKyAgICAgICAgKT8KKyAgICAgICAgKCBkdGQ9SU5URVJOQUxfRFRECisgICAgICAgICAgICB7c2VsZi5vdXRwdXQoIklOVEVSTkFMIERURDogIitkdGQudGV4dCl9CisgICAgICAgICk/CisJCSc+JworCTsKKworZnJhZ21lbnQgSU5URVJOQUxfRFREIDogJ1snIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnXScgOworCitmcmFnbWVudCBQSSA6CisgICAgICAgICc8PycgdGFyZ2V0PUdFTkVSSUNfSUQgV1M/IAorICAgICAgICAgIHtzZWxmLm91dHB1dCgiUEk6ICIrdGFyZ2V0LnRleHQpfQorICAgICAgICAoIEFUVFJJQlVURSBXUz8gKSogICc/PicKKwk7CisKK2ZyYWdtZW50IFhNTERFQ0wgOgorICAgICAgICAnPD8nICgneCd8J1gnKSAoJ20nfCdNJykgKCdsJ3wnTCcpIFdTPyAKKyAgICAgICAgICB7c2VsZi5vdXRwdXQoIlhNTCBkZWNsYXJhdGlvbiIpfQorICAgICAgICAoIEFUVFJJQlVURSBXUz8gKSogICc/PicKKwk7CisKKworZnJhZ21lbnQgRUxFTUVOVAorICAgIDogKCBTVEFSVF9UQUcKKyAgICAgICAgICAgIChFTEVNRU5UCisgICAgICAgICAgICB8IHQ9UENEQVRBCisgICAgICAgICAgICAgICAge3NlbGYub3V0cHV0KCJQQ0RBVEE6IFwiIiskdC50ZXh0KyJcIiIpfQorICAgICAgICAgICAgfCB0PUNEQVRBCisgICAgICAgICAgICAgICAge3NlbGYub3V0cHV0KCJDREFUQTogXCIiKyR0LnRleHQrIlwiIil9CisgICAgICAgICAgICB8IHQ9Q09NTUVOVAorICAgICAgICAgICAgICAgIHtzZWxmLm91dHB1dCgiQ29tbWVudDogXCIiKyR0LnRleHQrIlwiIil9CisgICAgICAgICAgICB8IHBpPVBJCisgICAgICAgICAgICApKgorICAgICAgICAgICAgRU5EX1RBRworICAgICAgICB8IEVNUFRZX0VMRU1FTlQKKyAgICAgICAgKQorICAgIDsKKworZnJhZ21lbnQgU1RBUlRfVEFHIAorICAgIDogJzwnIFdTPyBuYW1lPUdFTkVSSUNfSUQgV1M/CisgICAgICAgICAge3NlbGYub3V0cHV0KCJTdGFydCBUYWc6ICIrbmFtZS50ZXh0KX0KKyAgICAgICAgKCBBVFRSSUJVVEUgV1M/ICkqICc+JworICAgIDsKKworZnJhZ21lbnQgRU1QVFlfRUxFTUVOVCAKKyAgICA6ICc8JyBXUz8gbmFtZT1HRU5FUklDX0lEIFdTPworICAgICAgICAgIHtzZWxmLm91dHB1dCgiRW1wdHkgRWxlbWVudDogIituYW1lLnRleHQpfQorICAgICAgICAoIEFUVFJJQlVURSBXUz8gKSogJy8+JworICAgIDsKKworZnJhZ21lbnQgQVRUUklCVVRFIAorICAgIDogbmFtZT1HRU5FUklDX0lEIFdTPyAnPScgV1M/IHZhbHVlPVZBTFVFCisgICAgICAgIHtzZWxmLm91dHB1dCgiQXR0cjogIituYW1lLnRleHQrIj0iK3ZhbHVlLnRleHQpfQorICAgIDsKKworZnJhZ21lbnQgRU5EX1RBRyAKKyAgICA6ICc8LycgV1M/IG5hbWU9R0VORVJJQ19JRCBXUz8gJz4nCisgICAgICAgIHtzZWxmLm91dHB1dCgiRW5kIFRhZzogIituYW1lLnRleHQpfQorICAgIDsKKworZnJhZ21lbnQgQ09NTUVOVAorCToJJzwhLS0nIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnLS0+JworCTsKKworZnJhZ21lbnQgQ0RBVEEKKwk6CSc8IVtDREFUQVsnIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnXV0+JworCTsKKworZnJhZ21lbnQgUENEQVRBIDogKH4nPCcpKyA7IAorCitmcmFnbWVudCBWQUxVRSA6IAorICAgICAgICAoICdcIicgKH4nXCInKSogJ1wiJworICAgICAgICB8ICdcJycgKH4nXCcnKSogJ1wnJworICAgICAgICApCisJOworCitmcmFnbWVudCBHRU5FUklDX0lEIAorICAgIDogKCBMRVRURVIgfCAnXycgfCAnOicpIAorICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiBMRVRURVIgfCAnMCcuLic5JyB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyApKgorCTsKKworZnJhZ21lbnQgTEVUVEVSCisJOiAnYScuLid6JyAKKwl8ICdBJy4uJ1onCisJOworCitmcmFnbWVudCBXUyAgOgorICAgICAgICAoICAgJyAnCisgICAgICAgIHwgICAnXHQnCisgICAgICAgIHwgICggJ1xuJworICAgICAgICAgICAgfAknXHJcbicKKyAgICAgICAgICAgIHwJJ1xyJworICAgICAgICAgICAgKQorICAgICAgICApKworICAgIDsgICAgCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEzcGFyc2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxM3BhcnNlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWIyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxM3BhcnNlci5nCkBAIC0wLDAgKzEsMjMgQEAKK2dyYW1tYXIgdDAxM3BhcnNlcjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworQHBhcnNlcjo6aW5pdCB7CitzZWxmLmlkZW50aWZpZXJzID0gW10KK3NlbGYucmVwb3J0ZWRFcnJvcnMgPSBbXQorfQorCitAcGFyc2VyOjptZW1iZXJzIHsKK2RlZiBmb3VuZElkZW50aWZpZXIoc2VsZiwgbmFtZSk6CisgICAgc2VsZi5pZGVudGlmaWVycy5hcHBlbmQobmFtZSkKKworZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICBzZWxmLnJlcG9ydGVkRXJyb3JzLmFwcGVuZChtc2cpCit9CisKK2RvY3VtZW50OgorICAgICAgICB0PUlERU5USUZJRVIge3NlbGYuZm91bmRJZGVudGlmaWVyKCR0LnRleHQpfQorICAgICAgICA7CisKK0lERU5USUZJRVI6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKjsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEzcGFyc2VyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTNwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyMWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDEzcGFyc2VyLnB5CkBAIC0wLDAgKzEsMzUgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIHQwMTNwYXJzZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZChzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhcicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIuZG9jdW1lbnQoKQorCisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSAwLCBwYXJzZXIucmVwb3J0ZWRFcnJvcnMKKyAgICAgICAgYXNzZXJ0IHBhcnNlci5pZGVudGlmaWVycyA9PSBbJ2Zvb2JhciddCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisKKyAgICAgICAgcGFyc2VyLmRvY3VtZW50KCkKKworICAgICAgICAjIEZJWE1FOiBjdXJyZW50bHkgc3RyaW5ncyB3aXRoIGZvcm1hdHRlZCBlcnJvcnMgYXJlIGNvbGxlY3RlZAorICAgICAgICAjIGNhbid0IGNoZWNrIGVycm9yIGxvY2F0aW9ucyB5ZXQKKyAgICAgICAgYXNzZXJ0IGxlbihwYXJzZXIucmVwb3J0ZWRFcnJvcnMpID09IDEsIHBhcnNlci5yZXBvcnRlZEVycm9ycworICAgICAgICAgICAgCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNHBhcnNlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTRwYXJzZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyMzhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTRwYXJzZXIuZwpAQCAtMCwwICsxLDM1IEBACitncmFtbWFyIHQwMTRwYXJzZXI7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0BwYXJzZXI6OmluaXQgeworc2VsZi5ldmVudHMgPSBbXQorc2VsZi5yZXBvcnRlZEVycm9ycyA9IFtdCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICBzZWxmLnJlcG9ydGVkRXJyb3JzLmFwcGVuZChtc2cpCit9CisgICAgICAgIAorCitkb2N1bWVudDoKKyAgICAgICAgKCBkZWNsYXJhdGlvbgorICAgICAgICB8IGNhbGwKKyAgICAgICAgKSoKKyAgICAgICAgRU9GCisgICAgOworCitkZWNsYXJhdGlvbjoKKyAgICAgICAgJ3ZhcicgdD1JREVOVElGSUVSICc7JworICAgICAgICB7c2VsZi5ldmVudHMuYXBwZW5kKCgnZGVjbCcsICR0LnRleHQpKX0KKyAgICA7CisKK2NhbGw6CisgICAgICAgIHQ9SURFTlRJRklFUiAnKCcgJyknICc7JworICAgICAgICB7c2VsZi5ldmVudHMuYXBwZW5kKCgnY2FsbCcsICR0LnRleHQpKX0KKyAgICA7CisKK0lERU5USUZJRVI6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKjsKK1dTOiAgKCcgJ3wnXHInfCdcdCd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTRwYXJzZXIucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNHBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk2NWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTRwYXJzZXIucHkKQEAgLTAsMCArMSw3NCBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgdDAxNHBhcnNlcih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgndmFyIGZvb2JhcjsgZ25hcnooKTsgdmFyIGJsdXBwOyBmbHVwcCAoICkgOycpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIuZG9jdW1lbnQoKQorCisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSAwLCBwYXJzZXIucmVwb3J0ZWRFcnJvcnMKKyAgICAgICAgYXNzZXJ0IHBhcnNlci5ldmVudHMgPT0gWworICAgICAgICAgICAgKCdkZWNsJywgJ2Zvb2JhcicpLAorICAgICAgICAgICAgKCdjYWxsJywgJ2duYXJ6JyksCisgICAgICAgICAgICAoJ2RlY2wnLCAnYmx1cHAnKSwKKyAgICAgICAgICAgICgnY2FsbCcsICdmbHVwcCcpCisgICAgICAgICAgICBdLCBwYXJzZXIuZXZlbnRzCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgndmFyOyBmb28oKTsnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKworICAgICAgICBwYXJzZXIuZG9jdW1lbnQoKQorCisgICAgICAgICMgRklYTUU6IGN1cnJlbnRseSBzdHJpbmdzIHdpdGggZm9ybWF0dGVkIGVycm9ycyBhcmUgY29sbGVjdGVkCisgICAgICAgICMgY2FuJ3QgY2hlY2sgZXJyb3IgbG9jYXRpb25zIHlldAorICAgICAgICBhc3NlcnQgbGVuKHBhcnNlci5yZXBvcnRlZEVycm9ycykgPT0gMSwgcGFyc2VyLnJlcG9ydGVkRXJyb3JzCisgICAgICAgIGFzc2VydCBwYXJzZXIuZXZlbnRzID09IFtdLCBwYXJzZXIuZXZlbnRzCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQyKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgndmFyIGZvb2JhcigpOyBnbmFyeigpOycpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorCisgICAgICAgIHBhcnNlci5kb2N1bWVudCgpCisKKyAgICAgICAgIyBGSVhNRTogY3VycmVudGx5IHN0cmluZ3Mgd2l0aCBmb3JtYXR0ZWQgZXJyb3JzIGFyZSBjb2xsZWN0ZWQKKyAgICAgICAgIyBjYW4ndCBjaGVjayBlcnJvciBsb2NhdGlvbnMgeWV0CisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSAxLCBwYXJzZXIucmVwb3J0ZWRFcnJvcnMKKyAgICAgICAgYXNzZXJ0IHBhcnNlci5ldmVudHMgPT0gWworICAgICAgICAgICAgKCdjYWxsJywgJ2duYXJ6JyksCisgICAgICAgICAgICBdLCBwYXJzZXIuZXZlbnRzCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQzKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZ25hcnooOyBmbHVwcCgpOycpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorCisgICAgICAgIHBhcnNlci5kb2N1bWVudCgpCisKKyAgICAgICAgIyBGSVhNRTogY3VycmVudGx5IHN0cmluZ3Mgd2l0aCBmb3JtYXR0ZWQgZXJyb3JzIGFyZSBjb2xsZWN0ZWQKKyAgICAgICAgIyBjYW4ndCBjaGVjayBlcnJvciBsb2NhdGlvbnMgeWV0CisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSAxLCBwYXJzZXIucmVwb3J0ZWRFcnJvcnMKKyAgICAgICAgYXNzZXJ0IHBhcnNlci5ldmVudHMgPT0gWworICAgICAgICAgICAgKCdjYWxsJywgJ2duYXJ6JyksCisgICAgICAgICAgICAoJ2NhbGwnLCAnZmx1cHAnKSwKKyAgICAgICAgICAgIF0sIHBhcnNlci5ldmVudHMKKyAgICAgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTVjYWxjLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNWNhbGMuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDhlM2NlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTVjYWxjLmcKQEAgLTAsMCArMSw1NCBAQAorZ3JhbW1hciB0MDE1Y2FsYzsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworQGhlYWRlciB7CitpbXBvcnQgbWF0aAorfQorCitAcGFyc2VyOjppbml0IHsKK3NlbGYucmVwb3J0ZWRFcnJvcnMgPSBbXQorfQorCitAcGFyc2VyOjptZW1iZXJzIHsKK2RlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgc2VsZi5yZXBvcnRlZEVycm9ycy5hcHBlbmQobXNnKQorfQorCitldmFsdWF0ZSByZXR1cm5zIFtyZXN1bHRdOiByPWV4cHJlc3Npb24ge3Jlc3VsdCA9IHJ9OworCitleHByZXNzaW9uIHJldHVybnMgW3Jlc3VsdF06IHI9bXVsdCAoCisgICAgJysnIHIyPW11bHQge3IgKz0gcjJ9CisgIHwgJy0nIHIyPW11bHQge3IgLT0gcjJ9CisgICkqIHtyZXN1bHQgPSByfTsKKworbXVsdCByZXR1cm5zIFtyZXN1bHRdOiByPWxvZyAoCisgICAgJyonIHIyPWxvZyB7ciAqPSByMn0KKyAgfCAnLycgcjI9bG9nIHtyIC89IHIyfQorLy8gIHwgJyUnIHIyPWxvZyB7ciAlPSByMn0KKyAgKSoge3Jlc3VsdCA9IHJ9OworCitsb2cgcmV0dXJucyBbcmVzdWx0XTogJ2xuJyByPWV4cCB7cmVzdWx0ID0gbWF0aC5sb2cocil9CisgICAgfCByPWV4cCB7cmVzdWx0ID0gcn0KKyAgICA7CisKK2V4cCByZXR1cm5zIFtyZXN1bHRdOiByPWF0b20gKCdeJyByMj1hdG9tIHtyID0gbWF0aC5wb3cocixyMil9ICk/IHtyZXN1bHQgPSByfQorICAgIDsKKworYXRvbSByZXR1cm5zIFtyZXN1bHRdOgorICAgIG49SU5URUdFUiB7cmVzdWx0ID0gaW50KCRuLnRleHQpfQorICB8IG49REVDSU1BTCB7cmVzdWx0ID0gZmxvYXQoJG4udGV4dCl9IAorICB8ICcoJyByPWV4cHJlc3Npb24ge3Jlc3VsdCA9IHJ9ICcpJworICB8ICdQSScge3Jlc3VsdCA9IG1hdGgucGl9CisgIHwgJ0UnIHtyZXN1bHQgPSBtYXRoLmV9CisgIDsKKworSU5URUdFUjogRElHSVQrOworCitERUNJTUFMOiBESUdJVCsgJy4nIERJR0lUKzsKKworZnJhZ21lbnQKK0RJR0lUOiAnMCcuLic5JzsKKworV1M6ICgnICcgfCAnXG4nIHwgJ1x0JykrIHskY2hhbm5lbCA9IEhJRERFTn07CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNWNhbGMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNWNhbGMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxZmU4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE1Y2FsYy5weQpAQCAtMCwwICsxLDQ2IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDE1Y2FsYyh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisKKworICAgIGRlZiBfZXZhbHVhdGUoc2VsZiwgZXhwciwgZXhwZWN0ZWQsIGVycm9ycz1bXSk6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGV4cHIpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICByZXN1bHQgPSBwYXJzZXIuZXZhbHVhdGUoKQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkLCAiJXIgIT0gJXIiICUgKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSBsZW4oZXJyb3JzKSwgcGFyc2VyLnJlcG9ydGVkRXJyb3JzCisKKworICAgIGRlZiB0ZXN0VmFsaWQwMShzZWxmKToKKyAgICAgICAgc2VsZi5fZXZhbHVhdGUoIjEgKyAyIiwgMykKKworCisgICAgZGVmIHRlc3RWYWxpZDAyKHNlbGYpOgorICAgICAgICBzZWxmLl9ldmFsdWF0ZSgiMSArIDIgKiAzIiwgNykKKworCisgICAgZGVmIHRlc3RWYWxpZDAzKHNlbGYpOgorICAgICAgICBzZWxmLl9ldmFsdWF0ZSgiMTAgLyAyIiwgNSkKKworCisgICAgZGVmIHRlc3RWYWxpZDA0KHNlbGYpOgorICAgICAgICBzZWxmLl9ldmFsdWF0ZSgiNiArIDIqKDMrMSkgLSA0IiwgMTApCisKKworICAgIGRlZiB0ZXN0TWFsZm9ybWVkSW5wdXQoc2VsZik6CisgICAgICAgIHNlbGYuX2V2YWx1YXRlKCI2IC0gKDIqMSIsIDQsIFsibWlzbWF0Y2hlZCB0b2tlbiBhdCBwb3MgOCJdKQorICAgICAgICAKKyAgICAjIEZJWE1FOiBtb3N0IHBhcnNlIGVycm9ycyByZXN1bHQgaW4gVHlwZUVycm9ycyBpbiBhY3Rpb24gY29kZSwgYmVjYXVzZQorICAgICMgcnVsZXMgcmV0dXJuIE5vbmUsIHdoaWNoIGlzIHRoZW4gYWRkZWQvbXVsdGlwbGllZC4uLiB0byBpbnRlZ2Vycy4KKyAgICAjIGV2YWx1YXRlKCI2IC0gZm9vIDIiLCA0LCBbInNvbWUgZXJyb3IiXSkKKyAgICAgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNmFjdGlvbnMuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE2YWN0aW9ucy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiN2FjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNmFjdGlvbnMuZwpAQCAtMCwwICsxLDMxIEBACitncmFtbWFyIHQwMTZhY3Rpb25zOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitkZWNsYXJhdGlvbiByZXR1cm5zIFtuYW1lXQorICAgIDogICBmdW5jdGlvbkhlYWRlciAnOycKKyAgICAgICAgeyRuYW1lID0gJGZ1bmN0aW9uSGVhZGVyLm5hbWV9CisgICAgOworCitmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtuYW1lXQorICAgIDogICB0eXBlIElECisJeyRuYW1lID0gJElELnRleHR9CisgICAgOworCit0eXBlCisgICAgOiAgICdpbnQnICAgCisgICAgfCAgICdjaGFyJyAgCisgICAgfCAgICd2b2lkJworICAgIDsKKworSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSoKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNmFjdGlvbnMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxNmFjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0Y2FkMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE2YWN0aW9ucy5weQpAQCAtMCwwICsxLDIwIEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDE2YWN0aW9ucyh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgiaW50IGZvbzsiKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgbmFtZSA9IHBhcnNlci5kZWNsYXJhdGlvbigpCisgICAgICAgIGFzc2VydCBuYW1lID09ICdmb28nLCBuYW1lCisgICAgICAgICAgICAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE3cGFyc2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxN3BhcnNlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzZiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxN3BhcnNlci5nCkBAIC0wLDAgKzEsOTEgQEAKK2dyYW1tYXIgdDAxN3BhcnNlcjsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK3Byb2dyYW0KKyAgICA6ICAgZGVjbGFyYXRpb24rCisgICAgOworCitkZWNsYXJhdGlvbgorICAgIDogICB2YXJpYWJsZQorICAgIHwgICBmdW5jdGlvbkhlYWRlciAnOycKKyAgICB8ICAgZnVuY3Rpb25IZWFkZXIgYmxvY2sKKyAgICA7CisKK3ZhcmlhYmxlCisgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAnOycKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgSUQgCisgICAgOworCitmdW5jdGlvbkhlYWRlcgorICAgIDogICB0eXBlIElEICcoJyAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gJyknCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICAgICAgICAKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgJ2ludCcgICAKKyAgICB8ICAgJ2NoYXInICAKKyAgICB8ICAgJ3ZvaWQnCisgICAgfCAgIElEICAgICAgICAKKyAgICA7CisKK2Jsb2NrCisgICAgOiAgICd7JworICAgICAgICAgICAgdmFyaWFibGUqCisgICAgICAgICAgICBzdGF0KgorICAgICAgICAnfScKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnICAgICAgCisgICAgfCBibG9jaworICAgIHwgYXNzaWduU3RhdCAnOycKKyAgICB8ICc7JworICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCAnPScgZXhwciAgICAgICAgCisgICAgOworCitleHByOiAgIGNvbmRFeHByCisgICAgOworCitjb25kRXhwcgorICAgIDogICBhZXhwciAoICgnPT0nIHwgJzwnKSBhZXhwciApPworICAgIDsKKworYWV4cHIKKyAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgOworCithdG9tCisgICAgOiBJRCAgICAgIAorICAgIHwgSU5UICAgICAgCisgICAgfCAnKCcgZXhwciAnKScKKyAgICA7IAorCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxN3BhcnNlci5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE3cGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNGQ4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxN3BhcnNlci5weQpAQCAtMCwwICsxLDU4IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDE3cGFyc2VyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUZXN0UGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGVkRXJyb3JzID0gW10KKyAgICAgICAgCisKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRlZEVycm9ycy5hcHBlbmQobXNnKQorICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gVGVzdFBhcnNlcgorCisKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgiaW50IGZvbzsiKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgcGFyc2VyLnByb2dyYW0oKQorCisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSAwLCBwYXJzZXIucmVwb3J0ZWRFcnJvcnMKKworCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dDEoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdpbnQgZm9vKCkgeyAxKzIgfScpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIucHJvZ3JhbSgpCisKKyAgICAgICAgIyBGSVhNRTogY3VycmVudGx5IHN0cmluZ3Mgd2l0aCBmb3JtYXR0ZWQgZXJyb3JzIGFyZSBjb2xsZWN0ZWQKKyAgICAgICAgIyBjYW4ndCBjaGVjayBlcnJvciBsb2NhdGlvbnMgeWV0CisgICAgICAgIGFzc2VydCBsZW4ocGFyc2VyLnJlcG9ydGVkRXJyb3JzKSA9PSAxLCBwYXJzZXIucmVwb3J0ZWRFcnJvcnMKKworCisgICAgZGVmIHRlc3RNYWxmb3JtZWRJbnB1dDIoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdpbnQgZm9vKCkgeyAxKzsgMSsyIH0nKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgcGFyc2VyLnByb2dyYW0oKQorCisgICAgICAgICMgRklYTUU6IGN1cnJlbnRseSBzdHJpbmdzIHdpdGggZm9ybWF0dGVkIGVycm9ycyBhcmUgY29sbGVjdGVkCisgICAgICAgICMgY2FuJ3QgY2hlY2sgZXJyb3IgbG9jYXRpb25zIHlldAorICAgICAgICBhc3NlcnQgbGVuKHBhcnNlci5yZXBvcnRlZEVycm9ycykgPT0gMiwgcGFyc2VyLnJlcG9ydGVkRXJyb3JzCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE4bGxzdGFyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOGxsc3Rhci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OGFiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOGxsc3Rhci5nCkBAIC0wLDAgKzEsMTExIEBACitncmFtbWFyIHQwMThsbHN0YXI7CisKK29wdGlvbnMgeworICAgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitAaGVhZGVyIHsKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworfQorCitAaW5pdCB7CitzZWxmLm91dHB1dCA9IFN0cmluZ0lPKCkKK30KKworcHJvZ3JhbQorICAgIDogICBkZWNsYXJhdGlvbisKKyAgICA7CisKKy8qKiBJbiB0aGlzIHJ1bGUsIHRoZSBmdW5jdGlvbkhlYWRlciBsZWZ0IHByZWZpeCBvbiB0aGUgbGFzdCB0d28KKyAqICBhbHRlcm5hdGl2ZXMgaXMgbm90IExMKGspIGZvciBhIGZpeGVkIGsuICBIb3dldmVyLCBpdCBpcworICogIExMKCopLiAgVGhlIExMKCopIGFsZ29yaXRobSBzaW1wbHkgc2NhbnMgYWhlYWQgdW50aWwgaXQgc2VlcworICogIGVpdGhlciB0aGUgJzsnIG9yIHRoZSAneycgb2YgdGhlIGJsb2NrIGFuZCB0aGVuIGl0IHBpY2tzCisgKiAgdGhlIGFwcHJvcHJpYXRlIGFsdGVybmF0aXZlLiAgTG9va2hlYWQgY2FuIGJlIGFyYml0cmFyaWx5CisgKiAgbG9uZyBpbiB0aGVvcnksIGJ1dCBpcyA8PTEwIGluIG1vc3QgY2FzZXMuICBXb3JrcyBncmVhdC4KKyAqICBVc2UgQU5UTFJXb3JrcyB0byBzZWUgdGhlIGxvb2thaGVhZCB1c2UgKHN0ZXAgYnkgTG9jYXRpb24pCisgKiAgYW5kIGxvb2sgZm9yIGJsdWUgdG9rZW5zIGluIHRoZSBpbnB1dCB3aW5kb3cgcGFuZS4gOikKKyAqLworZGVjbGFyYXRpb24KKyAgICA6ICAgdmFyaWFibGUKKyAgICB8ICAgZnVuY3Rpb25IZWFkZXIgJzsnCisJe3NlbGYub3V0cHV0LndyaXRlKCRmdW5jdGlvbkhlYWRlci5uYW1lKyIgaXMgYSBkZWNsYXJhdGlvblxuIil9CisgICAgfCAgIGZ1bmN0aW9uSGVhZGVyIGJsb2NrCisJe3NlbGYub3V0cHV0LndyaXRlKCRmdW5jdGlvbkhlYWRlci5uYW1lKyIgaXMgYSBkZWZpbml0aW9uXG4iKX0KKyAgICA7CisKK3ZhcmlhYmxlCisgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAnOycKKyAgICA7CisKK2RlY2xhcmF0b3IKKyAgICA6ICAgSUQgCisgICAgOworCitmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtuYW1lXQorICAgIDogICB0eXBlIElEICcoJyAoIGZvcm1hbFBhcmFtZXRlciAoICcsJyBmb3JtYWxQYXJhbWV0ZXIgKSogKT8gJyknCisJeyRuYW1lID0gJElELnRleHR9CisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICAgICAgICAKKyAgICA7CisKK3R5cGUKKyAgICA6ICAgJ2ludCcgICAKKyAgICB8ICAgJ2NoYXInICAKKyAgICB8ICAgJ3ZvaWQnCisgICAgfCAgIElEICAgICAgICAKKyAgICA7CisKK2Jsb2NrCisgICAgOiAgICd7JworICAgICAgICAgICAgdmFyaWFibGUqCisgICAgICAgICAgICBzdGF0KgorICAgICAgICAnfScKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnICAgICAgCisgICAgfCBibG9jaworICAgIHwgYXNzaWduU3RhdCAnOycKKyAgICB8ICc7JworICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCAnPScgZXhwciAgICAgICAgCisgICAgOworCitleHByOiAgIGNvbmRFeHByCisgICAgOworCitjb25kRXhwcgorICAgIDogICBhZXhwciAoICgnPT0nIHwgJzwnKSBhZXhwciApPworICAgIDsKKworYWV4cHIKKyAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgOworCithdG9tCisgICAgOiBJRCAgICAgIAorICAgIHwgSU5UICAgICAgCisgICAgfCAnKCcgZXhwciAnKScKKyAgICA7IAorCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOGxsc3Rhci5pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE4bGxzdGFyLmlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTVhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOGxsc3Rhci5pbnB1dApAQCAtMCwwICsxLDEyIEBACitjaGFyIGM7CitpbnQgeDsKKwordm9pZCBiYXIoaW50IHgpOworCitpbnQgZm9vKGludCB5LCBjaGFyIGQpIHsKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPDM7IGk9aSsxKSB7CisgICAgeD0zOworICAgIHk9NTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMThsbHN0YXIub3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMThsbHN0YXIub3V0cHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2M1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOGxsc3Rhci5vdXRwdXQKQEAgLTAsMCArMSwyIEBACitiYXIgaXMgYSBkZWNsYXJhdGlvbgorZm9vIGlzIGEgZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMThsbHN0YXIucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOGxsc3Rhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY3ZmUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMThsbHN0YXIucHkKQEAgLTAsMCArMSw3NiBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgZGlmZmxpYgorCitjbGFzcyB0MDE4bGxzdGFyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBpbnB1dFBhdGggPSBvcy5wYXRoLnNwbGl0ZXh0KF9fZmlsZV9fKVswXSArICcuaW5wdXQnCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKG9wZW4oaW5wdXRQYXRoKS5yZWFkKCkpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIucHJvZ3JhbSgpCisKKyAgICAgICAgb3V0cHV0ID0gcGFyc2VyLm91dHB1dC5nZXR2YWx1ZSgpCisKKyAgICAgICAgb3V0cHV0UGF0aCA9IG9zLnBhdGguc3BsaXRleHQoX19maWxlX18pWzBdICsgJy5vdXRwdXQnCisgICAgICAgIHRlc3RPdXRwdXQgPSBvcGVuKG91dHB1dFBhdGgpLnJlYWQoKQorCisgICAgICAgIHN1Y2Nlc3MgPSAob3V0cHV0ID09IHRlc3RPdXRwdXQpCisgICAgICAgIGlmIG5vdCBzdWNjZXNzOgorICAgICAgICAgICAgZCA9IGRpZmZsaWIuRGlmZmVyKCkKKyAgICAgICAgICAgIHIgPSBkLmNvbXBhcmUob3V0cHV0LnNwbGl0bGluZXMoMSksIHRlc3RPdXRwdXQuc3BsaXRsaW5lcygxKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAnJy5qb2luKFtsLmVuY29kZSgnYXNjaWknLCAnYmFja3NsYXNocmVwbGFjZScpIGZvciBsIGluIHJdKQorICAgICAgICAgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKworCisgICAgCisjIyAjIHJ1biBhbiBpbmZpbml0ZSBsb29wIHdpdGggcmFuZG9tbHkgbWFuZ2xlZCBpbnB1dAorIyMgd2hpbGUgVHJ1ZToKKyMjICAgICBwcmludCAicGluZyIKKworIyMgICAgIGlucHV0ID0gb3BlbihpbnB1dFBhdGgpLnJlYWQoKQorCisjIyAgICAgaW1wb3J0IHJhbmRvbQorIyMgICAgIGlucHV0ID0gbGlzdChpbnB1dCkgIyBtYWtlIGl0IG11dGFibGUKKyMjICAgICBmb3IgXyBpbiByYW5nZSgzKToKKyMjICAgICAgICAgcDEgPSByYW5kb20ucmFuZHJhbmdlKGxlbihpbnB1dCkpCisjIyAgICAgICAgIHAyID0gcmFuZG9tLnJhbmRyYW5nZShsZW4oaW5wdXQpKQorCisjIyAgICAgICAgIGMxID0gaW5wdXRbcDFdCisjIyAgICAgICAgIGlucHV0W3AxXSA9IGlucHV0W3AyXQorIyMgICAgICAgICBpbnB1dFtwMl0gPSBjMQorIyMgICAgIGlucHV0ID0gJycuam9pbihpbnB1dCkgIyBiYWNrIHRvIHN0cmluZworCisgICAgICAgIAorIyMgICAgIHRyeToKKyMjICAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisjIyAgICAgICAgIGxleGVyID0gTGV4ZXIoY1N0cmVhbSkKKyMjICAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyMjICAgICAgICAgcGFyc2VyID0gVGVzdFBhcnNlcih0U3RyZWFtKQorIyMgICAgICAgICBwYXJzZXIucHJvZ3JhbSgpCisKKyMjICAgICBleGNlcHQgYW50bHIzLlJlY29nbml0aW9uRXhjZXB0aW9uLCBleGM6CisjIyAgICAgICAgIHByaW50IGV4YworIyMgICAgICAgICBmb3IgbCBpbiBpbnB1dC5zcGxpdGxpbmVzKClbMDpleGMubGluZV06CisjIyAgICAgICAgICAgICBwcmludCBsCisjIyAgICAgICAgIHByaW50ICcgJypleGMuY2hhclBvc2l0aW9uSW5MaW5lICsgJ14nCisKKyMjICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiwgZXhjOgorIyMgICAgICAgICBwcmludCAnXG4nLmpvaW4oWyclMDJkOiAlcycgJSAoaWR4KzEsIGwpIGZvciBpZHgsIGwgaW4gZW51bWVyYXRlKGlucHV0LnNwbGl0bGluZXMoKSldKQorIyMgICAgICAgICBwcmludCAiJXMgYXQgJWQ6JWQiICUgKGV4YywgY1N0cmVhbS5saW5lLCBjU3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSkKKyMjICAgICAgICAgcHJpbnQKKyAgICAgICAgCisjIyAgICAgICAgIHJhaXNlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOWxleGVyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAxOWxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0Nzc3NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE5bGV4ZXIuZwpAQCAtMCwwICsxLDY0IEBACitsZXhlciBncmFtbWFyIHQwMTlsZXhlcjsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICBmaWx0ZXI9dHJ1ZTsKK30KKworSU1QT1JUCisJOgknaW1wb3J0JyBXUyBuYW1lPVFJRFN0YXIgV1M/ICc7JworCTsKKwkKKy8qKiBBdm9pZHMgaGF2aW5nICJyZXR1cm4gZm9vOyIgbWF0Y2ggYXMgYSBmaWVsZCAqLworUkVUVVJOCisJOgkncmV0dXJuJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306LikqICc7JworCTsKKworQ0xBU1MKKwk6CSdjbGFzcycgV1MgbmFtZT1JRCBXUz8gKCdleHRlbmRzJyBXUyBRSUQgV1M/KT8KKwkJKCdpbXBsZW1lbnRzJyBXUyBRSUQgV1M/ICgnLCcgV1M/IFFJRCBXUz8pKik/ICd7JworCTsKKwkKK0NPTU1FTlQKKyAgICA6ICAgJy8qJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqICcqLycKKyAgICA7CisKK1NUUklORworICAgIDoJJyInIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTogRVNDIHwgLikqICciJworCTsKKworQ0hBUgorCToJJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnXCcnCisJOworCitXUyAgOiAgICgnICd8J1x0J3wnXG4nKSsKKyAgICA7CisKK2ZyYWdtZW50CitRSUQgOglJRCAoJy4nIElEKSoKKwk7CisJCisvKiogUUlEIGNhbm5vdCBzZWUgYmV5b25kIGVuZCBvZiB0b2tlbiBzbyB1c2luZyBRSUQgJy4qJz8gc29tZXdoZXJlIHdvbid0CisgKiAgZXZlciBtYXRjaCBzaW5jZSBrPTEgbG9va2FoZWFkIGluIHRoZSBRSUQgbG9vcCBvZiAnLicgd2lsbCBtYWtlIGl0IGxvb3AuCisgKiAgSSBtYWRlIHRoaXMgcnVsZSB0byBjb21wZW5zYXRlLgorICovCitmcmFnbWVudAorUUlEU3RhcgorCToJSUQgKCcuJyBJRCkqICcuKic/CisJOworCitmcmFnbWVudAorVFlQRTogICBRSUQgJ1tdJz8KKyAgICA7CisgICAgCitmcmFnbWVudAorQVJHIDogICBUWVBFIFdTIElECisgICAgOworCitmcmFnbWVudAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICA7CisKK2ZyYWdtZW50CitFU0MJOgknXFwnICgnIid8J1wnJ3wnXFwnKQorCTsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTlsZXhlci5pbnB1dCBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE5bGV4ZXIuaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxZTFjMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE5bGV4ZXIuaW5wdXQKQEAgLTAsMCArMSwxMyBAQAoraW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CisKK3B1YmxpYyBjbGFzcyBNYWluIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUkZpbGVTdHJlYW0oYXJnc1tpXSk7CisJCUZ1enp5SmF2YSBsZXggPSBuZXcgRnV6enlKYXZhKGlucHV0KTsKKwkJVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleCk7CisJCXRva2Vucy50b1N0cmluZygpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbih0b2tlbnMpOworCSAgICB9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMTlsZXhlci5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE5bGV4ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyMWQzMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDE5bGV4ZXIucHkKQEAgLTAsMCArMSwyMiBAQAoraW1wb3J0IG9zCitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyB0MDE5bGV4ZXIodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKworICAgIGRlZiB0ZXN0VmFsaWQoc2VsZik6CisgICAgICAgIGlucHV0UGF0aCA9IG9zLnBhdGguc3BsaXRleHQoX19maWxlX18pWzBdICsgJy5pbnB1dCcKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShvcGVuKGlucHV0UGF0aCkucmVhZCgpKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoc3RyZWFtKQorCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgICAgICBpZiB0b2tlbi50eXBlID09IGFudGxyMy5FT0Y6CisgICAgICAgICAgICAgICAgYnJlYWsKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIwZnV6enkuaW5wdXQgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMGZ1enp5LmlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWUxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMGZ1enp5LmlucHV0CkBAIC0wLDAgKzEsMTMgQEAKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworCitwdWJsaWMgY2xhc3MgTWFpbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJICAgIGZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGFyZ3NbaV0pOworCQlGdXp6eUphdmEgbGV4ID0gbmV3IEZ1enp5SmF2YShpbnB1dCk7CisJCVRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXgpOworCQl0b2tlbnMudG9TdHJpbmcoKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zKTsKKwkgICAgfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIwZnV6enkub3V0cHV0IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjBmdXp6eS5vdXRwdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExMzRmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIwZnV6enkub3V0cHV0CkBAIC0wLDAgKzEsMTIgQEAKK2ZvdW5kIGNsYXNzIE1haW4KK2ZvdW5kIG1ldGhvZCBtYWluCitmb3VuZCB2YXIgaQorZm91bmQgdmFyIGlucHV0Citmb3VuZCBjYWxsIEFOVExSRmlsZVN0cmVhbQorZm91bmQgdmFyIGxleAorZm91bmQgY2FsbCBGdXp6eUphdmEKK2ZvdW5kIHZhciB0b2tlbnMKK2ZvdW5kIGNhbGwgQ29tbW9uVG9rZW5TdHJlYW0KK2ZvdW5kIGNhbGwgdG9rZW5zLnRvU3RyaW5nCitmb3VuZCAvLyBjb21tZW50IC8vU3lzdGVtLm91dC5wcmludGxuKHRva2Vucyk7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIwZnV6enkucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMGZ1enp5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2FhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMGZ1enp5LnB5CkBAIC0wLDAgKzEsNDAgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IGRpZmZsaWIKKworY2xhc3MgdDAyMGZ1enp5KHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCd0MDIwZnV6enlMZXhlci5nJykKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBpbnB1dFBhdGggPSBvcy5wYXRoLnNwbGl0ZXh0KF9fZmlsZV9fKVswXSArICcuaW5wdXQnCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0ob3BlbihpbnB1dFBhdGgpLnJlYWQoKSkKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKHN0cmVhbSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdG9rZW4gPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgaWYgdG9rZW4udHlwZSA9PSBhbnRscjMuRU9GOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKworICAgICAgICBvdXRwdXQgPSBsZXhlci5vdXRwdXQuZ2V0dmFsdWUoKQorCisgICAgICAgIG91dHB1dFBhdGggPSBvcy5wYXRoLnNwbGl0ZXh0KF9fZmlsZV9fKVswXSArICcub3V0cHV0JworICAgICAgICB0ZXN0T3V0cHV0ID0gb3BlbihvdXRwdXRQYXRoKS5yZWFkKCkKKworICAgICAgICBzdWNjZXNzID0gKG91dHB1dCA9PSB0ZXN0T3V0cHV0KQorICAgICAgICBpZiBub3Qgc3VjY2VzczoKKyAgICAgICAgICAgIGQgPSBkaWZmbGliLkRpZmZlcigpCisgICAgICAgICAgICByID0gZC5jb21wYXJlKG91dHB1dC5zcGxpdGxpbmVzKDEpLCB0ZXN0T3V0cHV0LnNwbGl0bGluZXMoMSkpCisgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgJycuam9pbihbbC5lbmNvZGUoJ2FzY2lpJywgJ2JhY2tzbGFzaHJlcGxhY2UnKSBmb3IgbCBpbiByXSkKKyAgICAgICAgICAgICAgICApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIwZnV6enlMZXhlci5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjBmdXp6eUxleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5YWY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIwZnV6enlMZXhlci5nCkBAIC0wLDAgKzEsOTYgQEAKK2xleGVyIGdyYW1tYXIgdDAyMGZ1enp5TGV4ZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1QeXRob247CisgICAgZmlsdGVyPXRydWU7Cit9CisKK0BoZWFkZXIgeworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCit9CisKK0Bpbml0IHsKK3NlbGYub3V0cHV0ID0gU3RyaW5nSU8oKQorfQorCitJTVBPUlQKKwk6CSdpbXBvcnQnIFdTIG5hbWU9UUlEU3RhciBXUz8gJzsnCisJOworCQorLyoqIEF2b2lkcyBoYXZpbmcgInJldHVybiBmb287IiBtYXRjaCBhcyBhIGZpZWxkICovCitSRVRVUk4KKwk6CSdyZXR1cm4nIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTouKSogJzsnCisJOworCitDTEFTUworCToJJ2NsYXNzJyBXUyBuYW1lPUlEIFdTPyAoJ2V4dGVuZHMnIFdTIFFJRCBXUz8pPworCQkoJ2ltcGxlbWVudHMnIFdTIFFJRCBXUz8gKCcsJyBXUz8gUUlEIFdTPykqKT8gJ3snCisgICAgICAgIHtzZWxmLm91dHB1dC53cml0ZSgiZm91bmQgY2xhc3MgIiskbmFtZS50ZXh0KyJcbiIpfQorCTsKKwkKK01FVEhPRAorICAgIDogICBUWVBFIFdTIG5hbWU9SUQgV1M/ICcoJyAoIEFSRyBXUz8gKCcsJyBXUz8gQVJHIFdTPykqICk/ICcpJyBXUz8gCisgICAgICAgKCd0aHJvd3MnIFdTIFFJRCBXUz8gKCcsJyBXUz8gUUlEIFdTPykqKT8gJ3snCisgICAgICAgIHtzZWxmLm91dHB1dC53cml0ZSgiZm91bmQgbWV0aG9kICIrJG5hbWUudGV4dCsiXG4iKTt9CisgICAgOworCitGSUVMRAorICAgIDogICBUWVBFIFdTIG5hbWU9SUQgJ1tdJz8gV1M/ICgnOyd8Jz0nKQorICAgICAgICB7c2VsZi5vdXRwdXQud3JpdGUoImZvdW5kIHZhciAiKyRuYW1lLnRleHQrIlxuIik7fQorICAgIDsKKworU1RBVDoJKCdpZid8J3doaWxlJ3wnc3dpdGNoJ3wnZm9yJykgV1M/ICcoJyA7CisJCitDQUxMCisgICAgOiAgIG5hbWU9UUlEIFdTPyAnKCcKKyAgICAgICAge3NlbGYub3V0cHV0LndyaXRlKCJmb3VuZCBjYWxsICIrJG5hbWUudGV4dCsiXG4iKTt9CisgICAgOworCitDT01NRU5UCisgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgICAgIHtzZWxmLm91dHB1dC53cml0ZSgiZm91bmQgY29tbWVudCAiK3NlbGYuZ2V0VGV4dCgpKyJcbiIpO30KKyAgICA7CisKK1NMX0NPTU1FTlQKKyAgICA6ICAgJy8vJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqICdcbicKKyAgICAgICAge3NlbGYub3V0cHV0LndyaXRlKCJmb3VuZCAvLyBjb21tZW50ICIrc2VsZi5nZXRUZXh0KCkrIlxuIik7fQorICAgIDsKKwkKK1NUUklORworCToJJyInIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTogRVNDIHwgLikqICciJworCTsKKworQ0hBUgorCToJJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnXCcnCisJOworCitXUyAgOiAgICgnICd8J1x0J3wnXG4nKSsKKyAgICA7CisKK2ZyYWdtZW50CitRSUQgOglJRCAoJy4nIElEKSoKKwk7CisJCisvKiogUUlEIGNhbm5vdCBzZWUgYmV5b25kIGVuZCBvZiB0b2tlbiBzbyB1c2luZyBRSUQgJy4qJz8gc29tZXdoZXJlIHdvbid0CisgKiAgZXZlciBtYXRjaCBzaW5jZSBrPTEgbG9va2FoZWFkIGluIHRoZSBRSUQgbG9vcCBvZiAnLicgd2lsbCBtYWtlIGl0IGxvb3AuCisgKiAgSSBtYWRlIHRoaXMgcnVsZSB0byBjb21wZW5zYXRlLgorICovCitmcmFnbWVudAorUUlEU3RhcgorCToJSUQgKCcuJyBJRCkqICcuKic/CisJOworCitmcmFnbWVudAorVFlQRTogICBRSUQgJ1tdJz8KKyAgICA7CisgICAgCitmcmFnbWVudAorQVJHIDogICBUWVBFIFdTIElECisgICAgOworCitmcmFnbWVudAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICA7CisKK2ZyYWdtZW50CitFU0MJOgknXFwnICgnIid8J1wnJ3wnXFwnKQorCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIxaG9pc3QuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIxaG9pc3QuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2FhM2FiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjFob2lzdC5nCkBAIC0wLDAgKzEsMzcgQEAKK2dyYW1tYXIgdDAyMWhvaXN0Oworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworfQorCisvKiBXaXRoIHRoaXMgdHJ1ZSwgZW51bSBpcyBzZWVuIGFzIGEga2V5d29yZC4gIEZhbHNlLCBpdCdzIGFuIGlkZW50aWZpZXIgKi8KK0BwYXJzZXI6OmluaXQgeworc2VsZi5lbmFibGVFbnVtID0gRmFsc2UKK30KKworc3RhdCByZXR1cm5zIFtlbnVtSXNdCisgICAgOiBpZGVudGlmaWVyICAgIHtlbnVtSXMgPSAiSUQifQorICAgIHwgZW51bUFzS2V5d29yZCB7ZW51bUlzID0gImtleXdvcmQifQorICAgIDsKKworaWRlbnRpZmllcgorICAgIDogSUQKKyAgICB8IGVudW1Bc0lECisgICAgOworCitlbnVtQXNLZXl3b3JkIDoge3NlbGYuZW5hYmxlRW51bX0/ICdlbnVtJyA7CisKK2VudW1Bc0lEIDoge25vdCBzZWxmLmVuYWJsZUVudW19PyAnZW51bScgOworCitJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgIDsKKworSU5UIDoJKCcwJy4uJzknKSsKKyAgICA7CisKK1dTICA6ICAgKCAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xyJworICAgICAgICB8ICAgJ1xuJworICAgICAgICApKworICAgICAgICB7JGNoYW5uZWw9SElEREVOfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMWhvaXN0LnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjFob2lzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ3MjYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjFob2lzdC5weQpAQCAtMCwwICsxLDM4IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgdDAyMWhvaXN0KHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2VudW0nKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgcGFyc2VyLmVuYWJsZUVudW0gPSBUcnVlCisgICAgICAgIGVudW1JcyA9IHBhcnNlci5zdGF0KCkKKworICAgICAgICBhc3NlcnQgZW51bUlzID09ICdrZXl3b3JkJywgcmVwcihlbnVtSXMpCisKKworICAgIGRlZiB0ZXN0VmFsaWQyKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZW51bScpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIuZW5hYmxlRW51bSA9IEZhbHNlCisgICAgICAgIGVudW1JcyA9IHBhcnNlci5zdGF0KCkKKworICAgICAgICBhc3NlcnQgZW51bUlzID09ICdJRCcsIHJlcHIoZW51bUlzKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjJzY29wZXMuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIyc2NvcGVzLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmZmM4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIyc2NvcGVzLmcKQEAgLTAsMCArMSwxMjcgQEAKK2dyYW1tYXIgdDAyMnNjb3BlczsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworfQorCisvKiBnbG9iYWwgc2NvcGVzICovCisKK3Njb3BlIGFTY29wZSB7CituYW1lcworfQorCithCitzY29wZSBhU2NvcGU7CisgICAgOiAgIHskYVNjb3BlOjpuYW1lcyA9IFtdO30gSUQqCisgICAgOworCisKKy8qIHJ1bGUgc2NvcGVzLCBmcm9tIHRoZSBib29rLCBmaW5hbCBiZXRhLCBwLjE0NyAqLworCitiW3ZdCitzY29wZSB7eH0KKyAgICA6IHskYjo6eCA9IHY7fSBiMgorICAgIDsKKworYjIKKyAgICA6IGIzCisgICAgOworCitiMyAKKyAgICA6IHskYjo6eH0/PT4gSUQgLy8gb25seSB2aXNpYmxlLCBpZiBiIHdhcyBjYWxsZWQgd2l0aCBUcnVlCisgICAgfCBOVU0KKyAgICA7CisKKworLyogcnVsZSBzY29wZXMsIGZyb20gdGhlIGJvb2ssIGZpbmFsIGJldGEsIHAuMTQ4ICovCisKK2MgcmV0dXJucyBbcmVzXQorc2NvcGUgeworICAgIHN5bWJvbHMKK30KK0Bpbml0IHsKKyAgICAkYzo6c3ltYm9scyA9IHNldCgpOworfQorICAgIDogJ3snIGMxKiBjMisgJ30nCisgICAgICAgIHsgJHJlcyA9ICRjOjpzeW1ib2xzOyB9CisgICAgOworCitjMQorICAgIDogJ2ludCcgSUQgeyRjOjpzeW1ib2xzLmFkZCgkSUQudGV4dCl9ICc7JworICAgIDsKKworYzIKKyAgICA6IElEICc9JyBOVU0gJzsnCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICRJRC50ZXh0IG5vdCBpbiAkYzo6c3ltYm9sczoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJElELnRleHQpCisgICAgICAgIH0KKyAgICA7CisKKy8qIHJlY3Vyc2l2ZSBydWxlIHNjb3BlcywgZnJvbSB0aGUgYm9vaywgZmluYWwgYmV0YSwgcC4xNTAgKi8KKworZCByZXR1cm5zIFtyZXNdCitzY29wZSB7CisgICAgc3ltYm9scworfQorQGluaXQgeworICAgICRkOjpzeW1ib2xzID0gc2V0KCk7Cit9CisgICAgOiAneycgZDEqIGQyKiAnfScKKyAgICAgICAgeyAkcmVzID0gJGQ6OnN5bWJvbHM7IH0KKyAgICA7CisKK2QxCisgICAgOiAnaW50JyBJRCB7JGQ6OnN5bWJvbHMuYWRkKCRJRC50ZXh0KX0gJzsnCisgICAgOworCitkMgorICAgIDogSUQgJz0nIE5VTSAnOycKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIHMgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKCRkKSkpOgorICAgICAgICAgICAgICAgIGlmICRJRC50ZXh0IGluICRkW3NdOjpzeW1ib2xzOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJElELnRleHQpCisgICAgICAgIH0KKyAgICB8IGQKKyAgICA7CisKKy8qIHJlY3Vyc2l2ZSBydWxlIHNjb3BlcywgYWNjZXNzIGJvdHRvbS1tb3N0IHNjb3BlICovCisKK2UgcmV0dXJucyBbcmVzXQorc2NvcGUgeworICAgIGEKK30KK0BhZnRlciB7CisgICAgJHJlcyA9ICRlOjphOworfQorICAgIDogTlVNIHsgJGVbMF06OmEgPSBpbnQoJE5VTS50ZXh0KTsgfQorICAgIHwgJ3snIGUgJ30nCisgICAgOworCisKKy8qIHJlY3Vyc2l2ZSBydWxlIHNjb3BlcywgYWNjZXNzIHdpdGggbmVnYXRpdmUgaW5kZXggKi8KKworZiByZXR1cm5zIFtyZXNdCitzY29wZSB7CisgICAgYQorfQorQGFmdGVyIHsKKyAgICAkcmVzID0gJGY6OmE7Cit9CisgICAgOiBOVU0geyAkZlstMl06OmEgPSBpbnQoJE5VTS50ZXh0KTsgfQorICAgIHwgJ3snIGYgJ30nCisgICAgOworCisKKy8qIHRva2VucyAqLworCitJRCAgOiAgICgnYScuLid6JykrCisgICAgOworCitOVU0gOiAgICgnMCcuLic5JykrCisgICAgOworCitXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPUhJRERFTn0KKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMnNjb3Blcy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIyc2NvcGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYmM1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyMnNjb3Blcy5weQpAQCAtMCwwICsxLDE2NyBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZXh0d3JhcAorCisKK2NsYXNzIHQwMjJzY29wZXModGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKworICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFBhcnNlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgIyByZXBvcnQgZXJyb3JzIHRvIC9kZXYvbnVsbAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIHJlcG9ydEVycm9yKHNlbGYsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZSByZQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisKKyAgICAgICAgCisgICAgZGVmIHRlc3RhMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhcicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIuYSgpCisgICAgICAgIAorCisgICAgZGVmIHRlc3RiMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhcicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5iKEZhbHNlKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IGFudGxyMy5SZWNvZ25pdGlvbkV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdGIyKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vYmFyJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHBhcnNlci5iKFRydWUpCisgICAgICAgIAorCisgICAgZGVmIHRlc3RjMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oCisgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJycnKSkKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgc3ltYm9scyA9IHBhcnNlci5jKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHN5bWJvbHMsCisgICAgICAgICAgICBzZXQoWydpJywgJ2onXSkKKyAgICAgICAgICAgICkKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdGMyKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgKKyAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgeCA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAnJycpKQorCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5jKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4Yy5hcmdzWzBdLCAneCcpCisKKworICAgIGRlZiB0ZXN0ZDEoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKAorICAgICAgICAgICAgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgJycnKSkKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgc3ltYm9scyA9IHBhcnNlci5kKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHN5bWJvbHMsCisgICAgICAgICAgICBzZXQoWydpJywgJ2onXSkKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RlMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oCisgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgeyB7IHsgeyAxMiB9IH0gfSB9CisgICAgICAgICAgICAnJycpKQorCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICByZXMgPSBwYXJzZXIuZSgpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCAxMikKKworCisgICAgZGVmIHRlc3RmMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oCisgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgeyB7IHsgeyAxMiB9IH0gfSB9CisgICAgICAgICAgICAnJycpKQorCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICByZXMgPSBwYXJzZXIuZigpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBOb25lKQorCisKKyAgICBkZWYgdGVzdGYyKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgKKyAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB7IHsgMTIgfSB9CisgICAgICAgICAgICAnJycpKQorCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICByZXMgPSBwYXJzZXIuZigpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBOb25lKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIzc2NvcGVzLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyM3Njb3Blcy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTY5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyM3Njb3Blcy5nCkBAIC0wLDAgKzEsMTggQEAKK2dyYW1tYXIgdDAyM3Njb3BlczsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworfQorCitwcm9nCitzY29wZSB7CituYW1lCit9CisgICAgOiAgIElEIHskcHJvZzo6bmFtZT0kSUQudGV4dDt9CisgICAgOworCitJRCAgOiAgICgnYScuLid6JykrCisgICAgOworCitXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPUhJRERFTn0KKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyM3Njb3Blcy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDIzc2NvcGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzNiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyM3Njb3Blcy5weQpAQCAtMCwwICsxLDIwIEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIHQwMjNzY29wZXModGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKworICAgIGRlZiB0ZXN0VmFsaWQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vYmFyJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHBhcnNlci5wcm9nKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjRmaW5hbGx5LmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNGZpbmFsbHkuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QyNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjRmaW5hbGx5LmcKQEAgLTAsMCArMSwxOSBAQAorZ3JhbW1hciB0MDI0ZmluYWxseTsKKworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworfQorCitwcm9nIHJldHVybnMgW2V2ZW50c10KK0Bpbml0IHtldmVudHMgPSBbXX0KK0BhZnRlciB7ZXZlbnRzLmFwcGVuZCgnYWZ0ZXInKX0KKyAgICA6ICAgSUQge3JhaXNlIFJ1bnRpbWVFcnJvcn0KKyAgICA7CisgICAgY2F0Y2ggW1J1bnRpbWVFcnJvcl0ge2V2ZW50cy5hcHBlbmQoJ2NhdGNoJyl9CisgICAgZmluYWxseSB7ZXZlbnRzLmFwcGVuZCgnZmluYWxseScpfQorCitJRCAgOiAgICgnYScuLid6JykrCisgICAgOworCitXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPUhJRERFTn0KKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNGZpbmFsbHkucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNGZpbmFsbHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyNjlkZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI0ZmluYWxseS5weQpAQCAtMCwwICsxLDIzIEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIHQwMjRmaW5hbGx5KHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhcicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBldmVudHMgPSBwYXJzZXIucHJvZygpCisKKyAgICAgICAgYXNzZXJ0IGV2ZW50cyA9PSBbJ2NhdGNoJywgJ2ZpbmFsbHknXSwgZXZlbnRzCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjVsZXhlclJ1bGVQcm9wZXJ0eVJlZi5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjVsZXhlclJ1bGVQcm9wZXJ0eVJlZi5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTAwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLmcKQEAgLTAsMCArMSwxOCBAQAorbGV4ZXIgZ3JhbW1hciB0MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWY7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0BsZXhlcjo6aW5pdCB7CitzZWxmLnByb3BlcnRpZXMgPSBbXQorfQorCitJREVOVElGSUVSOiAKKyAgICAgICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgICAgIHsKK3NlbGYucHJvcGVydGllcy5hcHBlbmQoCisgICAgKCR0ZXh0LCAkdHlwZSwgJGxpbmUsICRwb3MsICRpbmRleCwgJGNoYW5uZWwsICRzdGFydCwgJHN0b3ApCispCisgICAgICAgIH0KKyAgICA7CitXUzogKCcgJyB8ICdcbicpKzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI1bGV4ZXJSdWxlUHJvcGVydHlSZWYucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGFjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmLnB5CkBAIC0wLDAgKzEsNTQgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgdDAyNWxleGVyUnVsZVByb3BlcnR5UmVmKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vYmFyIF9BYjk4IFxuIEExMnNkZicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gYW50bHIzLkVPRjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGFzc2VydCBsZW4obGV4ZXIucHJvcGVydGllcykgPT0gMywgbGV4ZXIucHJvcGVydGllcworCisgICAgICAgIHRleHQsIHR5cGUsIGxpbmUsIHBvcywgaW5kZXgsIGNoYW5uZWwsIHN0YXJ0LCBzdG9wID0gbGV4ZXIucHJvcGVydGllc1swXQorICAgICAgICBhc3NlcnQgdGV4dCA9PSAnZm9vYmFyJywgbGV4ZXIucHJvcGVydGllc1swXQorICAgICAgICBhc3NlcnQgdHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLklERU5USUZJRVIsIGxleGVyLnByb3BlcnRpZXNbMF0KKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gMSwgbGV4ZXIucHJvcGVydGllc1swXQorICAgICAgICBhc3NlcnQgcG9zID09IDAsIGxleGVyLnByb3BlcnRpZXNbMF0KKyAgICAgICAgYXNzZXJ0IGluZGV4ID09IC0xLCBsZXhlci5wcm9wZXJ0aWVzWzBdCisgICAgICAgIGFzc2VydCBjaGFubmVsID09IGFudGxyMy5ERUZBVUxUX0NIQU5ORUwsIGxleGVyLnByb3BlcnRpZXNbMF0KKyAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IDAsIGxleGVyLnByb3BlcnRpZXNbMF0KKyAgICAgICAgYXNzZXJ0IHN0b3AgPT0gNSwgbGV4ZXIucHJvcGVydGllc1swXQorCisgICAgICAgIHRleHQsIHR5cGUsIGxpbmUsIHBvcywgaW5kZXgsIGNoYW5uZWwsIHN0YXJ0LCBzdG9wID0gbGV4ZXIucHJvcGVydGllc1sxXQorICAgICAgICBhc3NlcnQgdGV4dCA9PSAnX0FiOTgnLCBsZXhlci5wcm9wZXJ0aWVzWzFdCisgICAgICAgIGFzc2VydCB0eXBlID09IHNlbGYubGV4ZXJNb2R1bGUuSURFTlRJRklFUiwgbGV4ZXIucHJvcGVydGllc1sxXQorICAgICAgICBhc3NlcnQgbGluZSA9PSAxLCBsZXhlci5wcm9wZXJ0aWVzWzFdCisgICAgICAgIGFzc2VydCBwb3MgPT0gNywgbGV4ZXIucHJvcGVydGllc1sxXQorICAgICAgICBhc3NlcnQgaW5kZXggPT0gLTEsIGxleGVyLnByb3BlcnRpZXNbMV0KKyAgICAgICAgYXNzZXJ0IGNoYW5uZWwgPT0gYW50bHIzLkRFRkFVTFRfQ0hBTk5FTCwgbGV4ZXIucHJvcGVydGllc1sxXQorICAgICAgICBhc3NlcnQgc3RhcnQgPT0gNywgbGV4ZXIucHJvcGVydGllc1sxXQorICAgICAgICBhc3NlcnQgc3RvcCA9PSAxMSwgbGV4ZXIucHJvcGVydGllc1sxXQorCisgICAgICAgIHRleHQsIHR5cGUsIGxpbmUsIHBvcywgaW5kZXgsIGNoYW5uZWwsIHN0YXJ0LCBzdG9wID0gbGV4ZXIucHJvcGVydGllc1syXQorICAgICAgICBhc3NlcnQgdGV4dCA9PSAnQTEyc2RmJywgbGV4ZXIucHJvcGVydGllc1syXQorICAgICAgICBhc3NlcnQgdHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLklERU5USUZJRVIsIGxleGVyLnByb3BlcnRpZXNbMl0KKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gMiwgbGV4ZXIucHJvcGVydGllc1syXQorICAgICAgICBhc3NlcnQgcG9zID09IDEsIGxleGVyLnByb3BlcnRpZXNbMl0KKyAgICAgICAgYXNzZXJ0IGluZGV4ID09IC0xLCBsZXhlci5wcm9wZXJ0aWVzWzJdCisgICAgICAgIGFzc2VydCBjaGFubmVsID09IGFudGxyMy5ERUZBVUxUX0NIQU5ORUwsIGxleGVyLnByb3BlcnRpZXNbMl0KKyAgICAgICAgYXNzZXJ0IHN0YXJ0ID09IDE1LCBsZXhlci5wcm9wZXJ0aWVzWzJdCisgICAgICAgIGFzc2VydCBzdG9wID09IDIwLCBsZXhlci5wcm9wZXJ0aWVzWzJdCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI2YWN0aW9ucy5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjZhY3Rpb25zLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmOWZlZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI2YWN0aW9ucy5nCkBAIC0wLDAgKzEsMzkgQEAKK2dyYW1tYXIgdDAyNmFjdGlvbnM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0BsZXhlcjo6aW5pdCB7CisgICAgc2VsZi5mb29iYXIgPSAnYXR0cmlidXRlOycKK30KKworcHJvZworQGluaXQgeworICAgIHNlbGYuY2FwdHVyZSgnaW5pdDsnKQorfQorQGFmdGVyIHsKKyAgICBzZWxmLmNhcHR1cmUoJ2FmdGVyOycpCit9CisgICAgOiAgIElERU5USUZJRVIgRU9GCisgICAgOworICAgIGNhdGNoIFsgUmVjb2duaXRpb25FeGNlcHRpb24sIGV4YyBdIHsKKyAgICAgICAgc2VsZi5jYXB0dXJlKCdjYXRjaDsnKQorICAgICAgICByYWlzZQorICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgICAgc2VsZi5jYXB0dXJlKCdmaW5hbGx5OycpCisgICAgfQorCisKK0lERU5USUZJRVIKKyAgICA6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgICAgICB7CisgICAgICAgICAgICAjIGEgY29tbWVudAorICAgICAgICAgIHNlbGYuY2FwdHVyZSgnYWN0aW9uOycpCisgICAgICAgICAgICBzZWxmLmNhcHR1cmUoJ1wlciBcJXIgXCVyIFwlciBcJXIgXCVyIFwlciBcJXI7JyBcJSAoJHRleHQsICR0eXBlLCAkbGluZSwgJHBvcywgJGluZGV4LCAkY2hhbm5lbCwgJHN0YXJ0LCAkc3RvcCkpCisgICAgICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYuY2FwdHVyZShzZWxmLmZvb2JhcikKKyAgICAgICAgfQorICAgIDsKKworV1M6ICgnICcgfCAnXG4nKSs7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNmFjdGlvbnMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyNmFjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0ZTVkNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI2YWN0aW9ucy5weQpAQCAtMCwwICsxLDY2IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIHQwMjZhY3Rpb25zKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcnMgPSBbXQorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9ICIiCisKKworICAgICAgICAgICAgZGVmIGNhcHR1cmUoc2VsZiwgdCk6CisgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ICs9IHQKKworCisgICAgICAgICAgICBkZWYgZW1pdEVycm9yTWVzc2FnZShzZWxmLCBtc2cpOgorICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9ycy5hcHBlbmQobXNnKQorCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIFRQYXJzZXIKKworCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGJhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgICAgICAgICAgc2VsZi5fZXJyb3JzID0gW10KKyAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgPSAiIgorCisKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCArPSB0CisKKworICAgICAgICAgICAgZGVmIGVtaXRFcnJvck1lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcnMuYXBwZW5kKG1zZykKKworICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBUTGV4ZXIKKworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhciBfQWI5OCBcbiBBMTJzZGYnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgcGFyc2VyLnByb2coKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJzZXIuX291dHB1dCwKKyAgICAgICAgICAgICdpbml0O2FmdGVyO2ZpbmFsbHk7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxleGVyLl9vdXRwdXQsCisgICAgICAgICAgICAnYWN0aW9uO3VcJ2Zvb2JhclwnIDQgMSAwIC0xIDAgMCA1O2F0dHJpYnV0ZTthY3Rpb247dVwnX0FiOThcJyA0IDEgNyAtMSAwIDcgMTE7YXR0cmlidXRlO2FjdGlvbjt1XCdBMTJzZGZcJyA0IDIgMSAtMSAwIDE1IDIwO2F0dHJpYnV0ZTsnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjdlb2YuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI3ZW9mLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmYmIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI3ZW9mLmcKQEAgLTAsMCArMSw4IEBACitsZXhlciBncmFtbWFyIHQwMjdlb2Y7CisKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPVB5dGhvbjsKK30KKworRU5EOiBFT0Y7CitTUEFDRTogJyAnOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjdlb2YucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyN2VvZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmFlMThkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjdlb2YucHkKQEAgLTAsMCArMSwyNSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDI3ZW9mKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJUaGF0J3Mgbm90IGhvdyBFT0YgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJyAnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgCisgICAgICAgIHRvayA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2sudHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLlNQQUNFLCB0b2sKKyAgICAgICAgCisgICAgICAgIHRvayA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIGFzc2VydCB0b2sudHlwZSA9PSBzZWxmLmxleGVyTW9kdWxlLkVORCwgdG9rCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjhsYWJlbEV4cHIuZy5kaXNhYmxlZCBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI4bGFiZWxFeHByLmcuZGlzYWJsZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiYTc2YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI4bGFiZWxFeHByLmcuZGlzYWJsZWQKQEAgLTAsMCArMSw1IEBACitsZXhlciBncmFtbWFyIHQwMjhsYWJlbEV4cHI7CitFVEFHTzogKCc8L2EnKT0+ICc8Lyc7CitNRE86IHtUcnVlfT8gKCc8IWEnKT0+ICc8ISc7CitTVEFHTzoge1RydWV9PyAoJzxhJyk9PiAnPCc7CitDREFUQTogJzwnOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjlzeW5wcmVkZ2F0ZS5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjlzeW5wcmVkZ2F0ZS5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDAyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAyOXN5bnByZWRnYXRlLmcKQEAgLTAsMCArMSwxNiBAQAorbGV4ZXIgZ3JhbW1hciB0MDI5c3lucHJlZGdhdGU7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0ZPTworICAgIDogKCdhYicpPT4gQQorICAgIHwgKCdhYycpPT4gQgorICAgIDsKKworZnJhZ21lbnQKK0E6ICdhJzsKKworZnJhZ21lbnQKK0I6ICdhJzsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMjlzeW5wcmVkZ2F0ZS5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI5c3lucHJlZGdhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1ODY4OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDI5c3lucHJlZGdhdGUucHkKQEAgLTAsMCArMSwyMSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDI5c3lucHJlZGdhdGUodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKworICAgIGRlZiB0ZXN0VmFsaWQxKHNlbGYpOgorICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdhYycpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihzdHJlYW0pCisgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzBzcGVjaWFsU3RhdGVzLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMHNwZWNpYWxTdGF0ZXMuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJlNDIzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzBzcGVjaWFsU3RhdGVzLmcKQEAgLTAsMCArMSwyNiBAQAorZ3JhbW1hciB0MDMwc3BlY2lhbFN0YXRlczsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworQGluaXQgeworc2VsZi5jb25kID0gVHJ1ZQorfQorCitAbWVtYmVycyB7CitkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgIHJhaXNlIHJlCit9CisKK3IKKyAgICA6ICgge3NlbGYuY29uZH0/IE5BTUUKKyAgICAgICAgfCB7bm90IHNlbGYuY29uZH0/IE5BTUUgV1MrIE5BTUUKKyAgICAgICAgKQorICAgICAgICAoIFdTKyBOQU1FICk/CisgICAgICAgIEVPRgorICAgIDsKKworTkFNRTogKCdhJy4uJ3onKSAoJ2EnLi4neicgfCAnMCcuLic5JykrOworTlVNQkVSOiAoJzAnLi4nOScpKzsKK1dTOiAnICcrOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzBzcGVjaWFsU3RhdGVzLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzBzcGVjaWFsU3RhdGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzRmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMHNwZWNpYWxTdGF0ZXMucHkKQEAgLTAsMCArMSw0NyBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDMwc3BlY2lhbFN0YXRlcyh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorCisgICAgZGVmIHRlc3RWYWxpZDEoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb28nKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgZXZlbnRzID0gcGFyc2VyLnIoKQorCisKKyAgICBkZWYgdGVzdFZhbGlkMihzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZvbyBuYW1lMScpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBldmVudHMgPSBwYXJzZXIucigpCisKKworICAgIGRlZiB0ZXN0VmFsaWQzKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnYmFyIG5hbWUxJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHBhcnNlci5jb25kID0gRmFsc2UKKyAgICAgICAgZXZlbnRzID0gcGFyc2VyLnIoKQorCisKKyAgICBkZWYgdGVzdFZhbGlkNChzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2JhciBuYW1lMSBuYW1lMicpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIuY29uZCA9IEZhbHNlCisgICAgICAgIGV2ZW50cyA9IHBhcnNlci5yKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMWVtcHR5QWx0LmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMWVtcHR5QWx0LmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmYTU5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDMxZW1wdHlBbHQuZwpAQCAtMCwwICsxLDE2IEBACitncmFtbWFyIHQwMzFlbXB0eUFsdDsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworcgorICAgIDogTkFNRSAKKyAgICAgICAgKCB7c2VsZi5jb25kfT89PiBXUysgTkFNRQorICAgICAgICB8IAorICAgICAgICApCisgICAgICAgIEVPRgorICAgIDsKKworTkFNRTogKCdhJy4uJ3onKSAoJ2EnLi4neicgfCAnMCcuLic5JykrOworTlVNQkVSOiAoJzAnLi4nOScpKzsKK1dTOiAnICcrOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzFlbXB0eUFsdC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDMxZW1wdHlBbHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhZThlMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDMxZW1wdHlBbHQucHkKQEAgLTAsMCArMSwyMSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDMxZW1wdHlBbHQodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKworICAgIGRlZiB0ZXN0VmFsaWQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIGV2ZW50cyA9IHBhcnNlci5yKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMnN1YnJ1bGVQcmVkaWN0LmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMnN1YnJ1bGVQcmVkaWN0LmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMjMyNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDMyc3VicnVsZVByZWRpY3QuZwpAQCAtMCwwICsxLDggQEAKK2dyYW1tYXIgdDAzMnN1YnJ1bGVQcmVkaWN0Oworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCithOiAnQkVHSU4nIGIgV1MrICdFTkQnOworYjogKCBXUysgJ0EnICkrOworV1M6ICcgJzsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDMyc3VicnVsZVByZWRpY3QucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMnN1YnJ1bGVQcmVkaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjJhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzMnN1YnJ1bGVQcmVkaWN0LnB5CkBAIC0wLDAgKzEsNDQgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgdDAzMnN1YnJ1bGVQcmVkaWN0KHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgcGFyc2VyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRQYXJzZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRQYXJzZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZDEoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKAorICAgICAgICAgICAgJ0JFR0lOIEEgRU5EJworICAgICAgICAgICAgKQorCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBldmVudHMgPSBwYXJzZXIuYSgpCisKKworICAgIEB0ZXN0YmFzZS5icm9rZW4oIkRGQSB0cmllcyB0byBsb29rIGJleW9uZCBlbmQgb2YgcnVsZSBiIiwgRXhjZXB0aW9uKQorICAgIGRlZiB0ZXN0VmFsaWQyKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgKKyAgICAgICAgICAgICcgQScKKyAgICAgICAgICAgICkKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgZXZlbnRzID0gcGFyc2VyLmIoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzM2JhY2t0cmFja2luZy5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzNiYWNrdHJhY2tpbmcuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE0YjMwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzNiYWNrdHJhY2tpbmcuZwpAQCAtMCwwICsxLDUzNCBAQAorZ3JhbW1hciB0MDMzYmFja3RyYWNraW5nOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgIGJhY2t0cmFjaz10cnVlOworICAgIG1lbW9pemU9dHJ1ZTsKKyAgICBrPTI7Cit9CisKK3Njb3BlIFN5bWJvbHMgeworCXR5cGVzOworfQorCitAaGVhZGVyIHsKKyMgY29tcGF0aWJpbGl0eSBzdHVmZgordHJ5OgorICAgIHNldCA9IHNldAorICAgIGZyb3plbnNldCA9IGZyb3plbnNldAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBmcm9tIHNldHMgaW1wb3J0IFNldCBhcyBzZXQsIEltbXV0YWJsZVNldCBhcyBmcm96ZW5zZXQKKworCit0cnk6CisgICAgcmV2ZXJzZWQgPSByZXZlcnNlZAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBkZWYgcmV2ZXJzZWQobCk6CisgICAgICAgIGwgPSBsWzpdCisgICAgICAgIGwucmV2ZXJzZSgpCisgICAgICAgIHJldHVybiBsCisKK30KKworQG1lbWJlcnMgeworICAgIGRlZiBpc1R5cGVOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBmb3Igc2NvcGUgaW4gcmV2ZXJzZWQoc2VsZi5TeW1ib2xzX3N0YWNrKToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gc2NvcGUudHlwZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICByZXR1cm4gRmFsc2UKKworfQorCit0cmFuc2xhdGlvbl91bml0CitzY29wZSBTeW1ib2xzOyAvLyBlbnRpcmUgZmlsZSBpcyBhIHNjb3BlCitAaW5pdCB7CisgICRTeW1ib2xzOjp0eXBlcyA9IHNldCgpCit9CisJOiBleHRlcm5hbF9kZWNsYXJhdGlvbisKKwk7CisKKy8qKiBFaXRoZXIgYSBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGFueSBvdGhlciBraW5kIG9mIEMgZGVjbC9kZWYuCisgKiAgVGhlIExMKCopIGFuYWx5c2lzIGFsZ29yaXRobSBmYWlscyB0byBkZWFsIHdpdGggdGhpcyBkdWUgdG8KKyAqICByZWN1cnNpb24gaW4gdGhlIGRlY2xhcmF0b3IgcnVsZXMuICBJJ20gcHV0dGluZyBpbiBhCisgKiAgbWFudWFsIHByZWRpY2F0ZSBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgYmFja3RyYWNrIG92ZXIKKyAqICB0aGUgZW50aXJlIGZ1bmN0aW9uLiAgRnVydGhlciwgeW91IGdldCBhIGJldHRlciBlcnJvcgorICogIGFzIGVycm9ycyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiBkb24ndCBtYWtlIGl0IGZhaWwKKyAqICB0byBwcmVkaWN0IHRoYXQgaXQncyBhIGZ1bmN0aW9uLiAgV2VpcmQgZXJyb3JzIHByZXZpb3VzbHkuCisgKiAgUmVtZW1iZXI6IHRoZSBnb2FsIGlzIHRvIGF2b2lkIGJhY2t0cmFjayBsaWtlIHRoZSBwbGFndWUKKyAqICBiZWNhdXNlIGl0IG1ha2VzIGRlYnVnZ2luZywgYWN0aW9ucywgYW5kIGVycm9ycyBoYXJkZXIuCisgKgorICogIE5vdGUgdGhhdCBrPTEgcmVzdWx0cyBpbiBhIG11Y2ggc21hbGxlciBwcmVkaWN0b3IgZm9yIHRoZSAKKyAqICBmaXhlZCBsb29rYWhlYWQ7IGs9MiBtYWRlIGEgZmV3IGV4dHJhIHRob3VzYW5kIGxpbmVzLiA7KQorICogIEknbGwgaGF2ZSB0byBvcHRpbWl6ZSB0aGF0IGluIHRoZSBmdXR1cmUuCisgKi8KK2V4dGVybmFsX2RlY2xhcmF0aW9uCitvcHRpb25zIHtrPTE7fQorCTogKCBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzPyBkZWNsYXJhdG9yIGRlY2xhcmF0aW9uKiAneycgKT0+IGZ1bmN0aW9uX2RlZmluaXRpb24KKwl8IGRlY2xhcmF0aW9uCisJOworCitmdW5jdGlvbl9kZWZpbml0aW9uCitzY29wZSBTeW1ib2xzOyAvLyBwdXQgcGFyYW1ldGVycyBhbmQgbG9jYWxzIGludG8gc2FtZSBzY29wZSBmb3Igbm93CitAaW5pdCB7CisgICRTeW1ib2xzOjp0eXBlcyA9IHNldCgpCit9CisJOglkZWNsYXJhdGlvbl9zcGVjaWZpZXJzPyBkZWNsYXJhdG9yCisvLyAJCSgJZGVjbGFyYXRpb24rIGNvbXBvdW5kX3N0YXRlbWVudAkvLyBLJlIgc3R5bGUKKy8vIAkJfAljb21wb3VuZF9zdGF0ZW1lbnQJCQkJLy8gQU5TSSBzdHlsZQorLy8gCQkpCisJOworCitkZWNsYXJhdGlvbgorc2NvcGUgeworICBpc1R5cGVkZWY7Cit9CitAaW5pdCB7CisgICRkZWNsYXJhdGlvbjo6aXNUeXBlZGVmID0gRmFsc2UKK30KKwk6ICd0eXBlZGVmJyBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzPyB7JGRlY2xhcmF0aW9uOjppc1R5cGVkZWYgPSBUcnVlfQorCSAgaW5pdF9kZWNsYXJhdG9yX2xpc3QgJzsnIC8vIHNwZWNpYWwgY2FzZSwgbG9va2luZyBmb3IgdHlwZWRlZgkKKwl8IGRlY2xhcmF0aW9uX3NwZWNpZmllcnMgaW5pdF9kZWNsYXJhdG9yX2xpc3Q/ICc7JworCTsKKworZGVjbGFyYXRpb25fc3BlY2lmaWVycworCTogICAoICAgc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIKKwkJfCAgIHR5cGVfc3BlY2lmaWVyCisgICAgICAgIHwgICB0eXBlX3F1YWxpZmllcgorICAgICAgICApKworCTsKKworaW5pdF9kZWNsYXJhdG9yX2xpc3QKKwk6IGluaXRfZGVjbGFyYXRvciAoJywnIGluaXRfZGVjbGFyYXRvcikqCisJOworCitpbml0X2RlY2xhcmF0b3IKKwk6IGRlY2xhcmF0b3IgLy8oJz0nIGluaXRpYWxpemVyKT8KKwk7CisKK3N0b3JhZ2VfY2xhc3Nfc3BlY2lmaWVyCisJOiAnZXh0ZXJuJworCXwgJ3N0YXRpYycKKwl8ICdhdXRvJworCXwgJ3JlZ2lzdGVyJworCTsKKwordHlwZV9zcGVjaWZpZXIKKwk6ICd2b2lkJworCXwgJ2NoYXInCisJfCAnc2hvcnQnCisJfCAnaW50JworCXwgJ2xvbmcnCisJfCAnZmxvYXQnCisJfCAnZG91YmxlJworCXwgJ3NpZ25lZCcKKwl8ICd1bnNpZ25lZCcKKy8vIAl8IHN0cnVjdF9vcl91bmlvbl9zcGVjaWZpZXIKKy8vIAl8IGVudW1fc3BlY2lmaWVyCisJfCB0eXBlX2lkCisJOworCit0eXBlX2lkCisgICAgOiAgIHtzZWxmLmlzVHlwZU5hbWUoc2VsZi5pbnB1dC5MVCgxKS5nZXRUZXh0KCkpfT8gSURFTlRJRklFUgorLy8gICAgCXtTeXN0ZW0ub3V0LnByaW50bG4oJElERU5USUZJRVIudGV4dCsiIGlzIGEgdHlwZSIpO30KKyAgICA7CisKKy8vIHN0cnVjdF9vcl91bmlvbl9zcGVjaWZpZXIKKy8vIG9wdGlvbnMge2s9Mzt9CisvLyBzY29wZSBTeW1ib2xzOyAvLyBzdHJ1Y3RzIGFyZSBzY29wZXMKKy8vIEBpbml0IHsKKy8vICAgJFN5bWJvbHM6OnR5cGVzID0gc2V0KCkKKy8vIH0KKy8vIAk6IHN0cnVjdF9vcl91bmlvbiBJREVOVElGSUVSPyAneycgc3RydWN0X2RlY2xhcmF0aW9uX2xpc3QgJ30nCisvLyAJfCBzdHJ1Y3Rfb3JfdW5pb24gSURFTlRJRklFUgorLy8gCTsKKworLy8gc3RydWN0X29yX3VuaW9uCisvLyAJOiAnc3RydWN0JworLy8gCXwgJ3VuaW9uJworLy8gCTsKKworLy8gc3RydWN0X2RlY2xhcmF0aW9uX2xpc3QKKy8vIAk6IHN0cnVjdF9kZWNsYXJhdGlvbisKKy8vIAk7CisKKy8vIHN0cnVjdF9kZWNsYXJhdGlvbgorLy8gCTogc3BlY2lmaWVyX3F1YWxpZmllcl9saXN0IHN0cnVjdF9kZWNsYXJhdG9yX2xpc3QgJzsnCisvLyAJOworCisvLyBzcGVjaWZpZXJfcXVhbGlmaWVyX2xpc3QKKy8vIAk6ICggdHlwZV9xdWFsaWZpZXIgfCB0eXBlX3NwZWNpZmllciApKworLy8gCTsKKworLy8gc3RydWN0X2RlY2xhcmF0b3JfbGlzdAorLy8gCTogc3RydWN0X2RlY2xhcmF0b3IgKCcsJyBzdHJ1Y3RfZGVjbGFyYXRvcikqCisvLyAJOworCisvLyBzdHJ1Y3RfZGVjbGFyYXRvcgorLy8gCTogZGVjbGFyYXRvciAoJzonIGNvbnN0YW50X2V4cHJlc3Npb24pPworLy8gCXwgJzonIGNvbnN0YW50X2V4cHJlc3Npb24KKy8vIAk7CisKKy8vIGVudW1fc3BlY2lmaWVyCisvLyBvcHRpb25zIHtrPTM7fQorLy8gCTogJ2VudW0nICd7JyBlbnVtZXJhdG9yX2xpc3QgJ30nCisvLyAJfCAnZW51bScgSURFTlRJRklFUiAneycgZW51bWVyYXRvcl9saXN0ICd9JworLy8gCXwgJ2VudW0nIElERU5USUZJRVIKKy8vIAk7CisKKy8vIGVudW1lcmF0b3JfbGlzdAorLy8gCTogZW51bWVyYXRvciAoJywnIGVudW1lcmF0b3IpKgorLy8gCTsKKworLy8gZW51bWVyYXRvcgorLy8gCTogSURFTlRJRklFUiAoJz0nIGNvbnN0YW50X2V4cHJlc3Npb24pPworLy8gCTsKKwordHlwZV9xdWFsaWZpZXIKKwk6ICdjb25zdCcKKwl8ICd2b2xhdGlsZScKKwk7CisKK2RlY2xhcmF0b3IKKwk6IHBvaW50ZXI/IGRpcmVjdF9kZWNsYXJhdG9yCisJfCBwb2ludGVyCisJOworCitkaXJlY3RfZGVjbGFyYXRvcgorCTogICAoCUlERU5USUZJRVIKKwkJCXsKKwkJCWlmIGxlbigkZGVjbGFyYXRpb24pPjAgYW5kICRkZWNsYXJhdGlvbjo6aXNUeXBlZGVmOgorCQkJCSRTeW1ib2xzOjp0eXBlcy5hZGQoJElERU5USUZJRVIudGV4dCkKKwkJCQlwcmludCAiZGVmaW5lIHR5cGUgIiskSURFTlRJRklFUi50ZXh0CisJCQl9CisJCXwJJygnIGRlY2xhcmF0b3IgJyknCisJCSkKKyAgICAgICAgZGVjbGFyYXRvcl9zdWZmaXgqCisJOworCitkZWNsYXJhdG9yX3N1ZmZpeAorCTogICAvKidbJyBjb25zdGFudF9leHByZXNzaW9uICddJworICAgIHwqLyAgICdbJyAnXScKKy8vICAgICB8ICAgJygnIHBhcmFtZXRlcl90eXBlX2xpc3QgJyknCisvLyAgICAgfCAgICcoJyBpZGVudGlmaWVyX2xpc3QgJyknCisgICAgfCAgICcoJyAnKScKKwk7CisKK3BvaW50ZXIKKwk6ICcqJyB0eXBlX3F1YWxpZmllcisgcG9pbnRlcj8KKwl8ICcqJyBwb2ludGVyCisJfCAnKicKKwk7CisKKy8vIHBhcmFtZXRlcl90eXBlX2xpc3QKKy8vIAk6IHBhcmFtZXRlcl9saXN0ICgnLCcgJy4uLicpPworLy8gCTsKKworLy8gcGFyYW1ldGVyX2xpc3QKKy8vIAk6IHBhcmFtZXRlcl9kZWNsYXJhdGlvbiAoJywnIHBhcmFtZXRlcl9kZWNsYXJhdGlvbikqCisvLyAJOworCisvLyBwYXJhbWV0ZXJfZGVjbGFyYXRpb24KKy8vIAk6IGRlY2xhcmF0aW9uX3NwZWNpZmllcnMgKGRlY2xhcmF0b3J8YWJzdHJhY3RfZGVjbGFyYXRvcikqCisvLyAJOworCisvLyBpZGVudGlmaWVyX2xpc3QKKy8vIAk6IElERU5USUZJRVIgKCcsJyBJREVOVElGSUVSKSoKKy8vIAk7CisKKy8vIHR5cGVfbmFtZQorLy8gCTogc3BlY2lmaWVyX3F1YWxpZmllcl9saXN0IGFic3RyYWN0X2RlY2xhcmF0b3I/CisvLyAJOworCisvLyBhYnN0cmFjdF9kZWNsYXJhdG9yCisvLyAJOiBwb2ludGVyIGRpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yPworLy8gCXwgZGlyZWN0X2Fic3RyYWN0X2RlY2xhcmF0b3IKKy8vIAk7CisKKy8vIGRpcmVjdF9hYnN0cmFjdF9kZWNsYXJhdG9yCisvLyAJOgkoICcoJyBhYnN0cmFjdF9kZWNsYXJhdG9yICcpJyB8IGFic3RyYWN0X2RlY2xhcmF0b3Jfc3VmZml4ICkgYWJzdHJhY3RfZGVjbGFyYXRvcl9zdWZmaXgqCisvLyAJOworCisvLyBhYnN0cmFjdF9kZWNsYXJhdG9yX3N1ZmZpeAorLy8gCToJJ1snICddJworLy8gCXwJJ1snIGNvbnN0YW50X2V4cHJlc3Npb24gJ10nCisvLyAJfAknKCcgJyknCisvLyAJfAknKCcgcGFyYW1ldGVyX3R5cGVfbGlzdCAnKScKKy8vIAk7CisJCisvLyBpbml0aWFsaXplcgorLy8gCTogYXNzaWdubWVudF9leHByZXNzaW9uCisvLyAJfCAneycgaW5pdGlhbGl6ZXJfbGlzdCAnLCc/ICd9JworLy8gCTsKKworLy8gaW5pdGlhbGl6ZXJfbGlzdAorLy8gCTogaW5pdGlhbGl6ZXIgKCcsJyBpbml0aWFsaXplcikqCisvLyAJOworCisvLyAvLyBFIHggcCByIGUgcyBzIGkgbyBuIHMKKworLy8gYXJndW1lbnRfZXhwcmVzc2lvbl9saXN0CisvLyAJOiAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAoJywnIGFzc2lnbm1lbnRfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBhZGRpdGl2ZV9leHByZXNzaW9uCisvLyAJOiAobXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbikgKCcrJyBtdWx0aXBsaWNhdGl2ZV9leHByZXNzaW9uIHwgJy0nIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24pKgorLy8gCTsKKworLy8gbXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbgorLy8gCTogKGNhc3RfZXhwcmVzc2lvbikgKCcqJyBjYXN0X2V4cHJlc3Npb24gfCAnLycgY2FzdF9leHByZXNzaW9uIHwgJyUnIGNhc3RfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBjYXN0X2V4cHJlc3Npb24KKy8vIAk6ICcoJyB0eXBlX25hbWUgJyknIGNhc3RfZXhwcmVzc2lvbgorLy8gCXwgdW5hcnlfZXhwcmVzc2lvbgorLy8gCTsKKworLy8gdW5hcnlfZXhwcmVzc2lvbgorLy8gCTogcG9zdGZpeF9leHByZXNzaW9uCisvLyAJfCAnKysnIHVuYXJ5X2V4cHJlc3Npb24KKy8vIAl8ICctLScgdW5hcnlfZXhwcmVzc2lvbgorLy8gCXwgdW5hcnlfb3BlcmF0b3IgY2FzdF9leHByZXNzaW9uCisvLyAJfCAnc2l6ZW9mJyB1bmFyeV9leHByZXNzaW9uCisvLyAJfCAnc2l6ZW9mJyAnKCcgdHlwZV9uYW1lICcpJworLy8gCTsKKworLy8gcG9zdGZpeF9leHByZXNzaW9uCisvLyAJOiAgIHByaW1hcnlfZXhwcmVzc2lvbgorLy8gICAgICAgICAoICAgJ1snIGV4cHJlc3Npb24gJ10nCisvLyAgICAgICAgIHwgICAnKCcgJyknCisvLyAgICAgICAgIHwgICAnKCcgYXJndW1lbnRfZXhwcmVzc2lvbl9saXN0ICcpJworLy8gICAgICAgICB8ICAgJy4nIElERU5USUZJRVIKKy8vICAgICAgICAgfCAgICcqJyBJREVOVElGSUVSCisvLyAgICAgICAgIHwgICAnLT4nIElERU5USUZJRVIKKy8vICAgICAgICAgfCAgICcrKycKKy8vICAgICAgICAgfCAgICctLScKKy8vICAgICAgICAgKSoKKy8vIAk7CisKKy8vIHVuYXJ5X29wZXJhdG9yCisvLyAJOiAnJicKKy8vIAl8ICcqJworLy8gCXwgJysnCisvLyAJfCAnLScKKy8vIAl8ICd+JworLy8gCXwgJyEnCisvLyAJOworCisvLyBwcmltYXJ5X2V4cHJlc3Npb24KKy8vIAk6IElERU5USUZJRVIKKy8vIAl8IGNvbnN0YW50CisvLyAJfCAnKCcgZXhwcmVzc2lvbiAnKScKKy8vIAk7CisKKy8vIGNvbnN0YW50CisvLyAgICAgOiAgIEhFWF9MSVRFUkFMCisvLyAgICAgfCAgIE9DVEFMX0xJVEVSQUwKKy8vICAgICB8ICAgREVDSU1BTF9MSVRFUkFMCisvLyAgICAgfAlDSEFSQUNURVJfTElURVJBTAorLy8gCXwJU1RSSU5HX0xJVEVSQUwKKy8vICAgICB8ICAgRkxPQVRJTkdfUE9JTlRfTElURVJBTAorLy8gICAgIDsKKworLy8gLy8vLy8KKworLy8gZXhwcmVzc2lvbgorLy8gCTogYXNzaWdubWVudF9leHByZXNzaW9uICgnLCcgYXNzaWdubWVudF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIGNvbnN0YW50X2V4cHJlc3Npb24KKy8vIAk6IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24KKy8vIAk7CisKKy8vIGFzc2lnbm1lbnRfZXhwcmVzc2lvbgorLy8gCTogbHZhbHVlIGFzc2lnbm1lbnRfb3BlcmF0b3IgYXNzaWdubWVudF9leHByZXNzaW9uCisvLyAJfCBjb25kaXRpb25hbF9leHByZXNzaW9uCisvLyAJOworCQorLy8gbHZhbHVlCisvLyAJOgl1bmFyeV9leHByZXNzaW9uCisvLyAJOworCisvLyBhc3NpZ25tZW50X29wZXJhdG9yCisvLyAJOiAnPScKKy8vIAl8ICcqPScKKy8vIAl8ICcvPScKKy8vIAl8ICclPScKKy8vIAl8ICcrPScKKy8vIAl8ICctPScKKy8vIAl8ICc8PD0nCisvLyAJfCAnPj49JworLy8gCXwgJyY9JworLy8gCXwgJ149JworLy8gCXwgJ3w9JworLy8gCTsKKworLy8gY29uZGl0aW9uYWxfZXhwcmVzc2lvbgorLy8gCTogbG9naWNhbF9vcl9leHByZXNzaW9uICgnPycgZXhwcmVzc2lvbiAnOicgY29uZGl0aW9uYWxfZXhwcmVzc2lvbik/CisvLyAJOworCisvLyBsb2dpY2FsX29yX2V4cHJlc3Npb24KKy8vIAk6IGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24gKCd8fCcgbG9naWNhbF9hbmRfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBsb2dpY2FsX2FuZF9leHByZXNzaW9uCisvLyAJOiBpbmNsdXNpdmVfb3JfZXhwcmVzc2lvbiAoJyYmJyBpbmNsdXNpdmVfb3JfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBpbmNsdXNpdmVfb3JfZXhwcmVzc2lvbgorLy8gCTogZXhjbHVzaXZlX29yX2V4cHJlc3Npb24gKCd8JyBleGNsdXNpdmVfb3JfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBleGNsdXNpdmVfb3JfZXhwcmVzc2lvbgorLy8gCTogYW5kX2V4cHJlc3Npb24gKCdeJyBhbmRfZXhwcmVzc2lvbikqCisvLyAJOworCisvLyBhbmRfZXhwcmVzc2lvbgorLy8gCTogZXF1YWxpdHlfZXhwcmVzc2lvbiAoJyYnIGVxdWFsaXR5X2V4cHJlc3Npb24pKgorLy8gCTsKKy8vIGVxdWFsaXR5X2V4cHJlc3Npb24KKy8vIAk6IHJlbGF0aW9uYWxfZXhwcmVzc2lvbiAoKCc9PSd8JyE9JykgcmVsYXRpb25hbF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIHJlbGF0aW9uYWxfZXhwcmVzc2lvbgorLy8gCTogc2hpZnRfZXhwcmVzc2lvbiAoKCc8J3wnPid8Jzw9J3wnPj0nKSBzaGlmdF9leHByZXNzaW9uKSoKKy8vIAk7CisKKy8vIHNoaWZ0X2V4cHJlc3Npb24KKy8vIAk6IGFkZGl0aXZlX2V4cHJlc3Npb24gKCgnPDwnfCc+PicpIGFkZGl0aXZlX2V4cHJlc3Npb24pKgorLy8gCTsKKworLy8gLy8gUyB0IGEgdCBlIG0gZSBuIHQgcworCisvLyBzdGF0ZW1lbnQKKy8vIAk6IGxhYmVsZWRfc3RhdGVtZW50CisvLyAJfCBjb21wb3VuZF9zdGF0ZW1lbnQKKy8vIAl8IGV4cHJlc3Npb25fc3RhdGVtZW50CisvLyAJfCBzZWxlY3Rpb25fc3RhdGVtZW50CisvLyAJfCBpdGVyYXRpb25fc3RhdGVtZW50CisvLyAJfCBqdW1wX3N0YXRlbWVudAorLy8gCTsKKworLy8gbGFiZWxlZF9zdGF0ZW1lbnQKKy8vIAk6IElERU5USUZJRVIgJzonIHN0YXRlbWVudAorLy8gCXwgJ2Nhc2UnIGNvbnN0YW50X2V4cHJlc3Npb24gJzonIHN0YXRlbWVudAorLy8gCXwgJ2RlZmF1bHQnICc6JyBzdGF0ZW1lbnQKKy8vIAk7CisKKy8vIGNvbXBvdW5kX3N0YXRlbWVudAorLy8gc2NvcGUgU3ltYm9sczsgLy8gYmxvY2tzIGhhdmUgYSBzY29wZSBvZiBzeW1ib2xzCisvLyBAaW5pdCB7CisvLyAgICRTeW1ib2xzOjp0eXBlcyA9IHt9CisvLyB9CisvLyAJOiAneycgZGVjbGFyYXRpb24qIHN0YXRlbWVudF9saXN0PyAnfScKKy8vIAk7CisKKy8vIHN0YXRlbWVudF9saXN0CisvLyAJOiBzdGF0ZW1lbnQrCisvLyAJOworCisvLyBleHByZXNzaW9uX3N0YXRlbWVudAorLy8gCTogJzsnCisvLyAJfCBleHByZXNzaW9uICc7JworLy8gCTsKKworLy8gc2VsZWN0aW9uX3N0YXRlbWVudAorLy8gCTogJ2lmJyAnKCcgZXhwcmVzc2lvbiAnKScgc3RhdGVtZW50IChvcHRpb25zIHtrPTE7IGJhY2t0cmFjaz1mYWxzZTt9OidlbHNlJyBzdGF0ZW1lbnQpPworLy8gCXwgJ3N3aXRjaCcgJygnIGV4cHJlc3Npb24gJyknIHN0YXRlbWVudAorLy8gCTsKKworLy8gaXRlcmF0aW9uX3N0YXRlbWVudAorLy8gCTogJ3doaWxlJyAnKCcgZXhwcmVzc2lvbiAnKScgc3RhdGVtZW50CisvLyAJfCAnZG8nIHN0YXRlbWVudCAnd2hpbGUnICcoJyBleHByZXNzaW9uICcpJyAnOycKKy8vIAl8ICdmb3InICcoJyBleHByZXNzaW9uX3N0YXRlbWVudCBleHByZXNzaW9uX3N0YXRlbWVudCBleHByZXNzaW9uPyAnKScgc3RhdGVtZW50CisvLyAJOworCisvLyBqdW1wX3N0YXRlbWVudAorLy8gCTogJ2dvdG8nIElERU5USUZJRVIgJzsnCisvLyAJfCAnY29udGludWUnICc7JworLy8gCXwgJ2JyZWFrJyAnOycKKy8vIAl8ICdyZXR1cm4nICc7JworLy8gCXwgJ3JldHVybicgZXhwcmVzc2lvbiAnOycKKy8vIAk7CisKK0lERU5USUZJRVIKKwk6CUxFVFRFUiAoTEVUVEVSfCcwJy4uJzknKSoKKwk7CisJCitmcmFnbWVudAorTEVUVEVSCisJOgknJCcKKwl8CSdBJy4uJ1onCisJfAknYScuLid6JworCXwJJ18nCisJOworCitDSEFSQUNURVJfTElURVJBTAorICAgIDogICAnXCcnICggRXNjYXBlU2VxdWVuY2UgfCB+KCdcJyd8J1xcJykgKSAnXCcnCisgICAgOworCitTVFJJTkdfTElURVJBTAorICAgIDogICciJyAoIEVzY2FwZVNlcXVlbmNlIHwgfignXFwnfCciJykgKSogJyInCisgICAgOworCitIRVhfTElURVJBTCA6ICcwJyAoJ3gnfCdYJykgSGV4RGlnaXQrIEludGVnZXJUeXBlU3VmZml4PyA7CisKK0RFQ0lNQUxfTElURVJBTCA6ICgnMCcgfCAnMScuLic5JyAnMCcuLic5JyopIEludGVnZXJUeXBlU3VmZml4PyA7CisKK09DVEFMX0xJVEVSQUwgOiAnMCcgKCcwJy4uJzcnKSsgSW50ZWdlclR5cGVTdWZmaXg/IDsKKworZnJhZ21lbnQKK0hleERpZ2l0IDogKCcwJy4uJzknfCdhJy4uJ2YnfCdBJy4uJ0YnKSA7CisKK2ZyYWdtZW50CitJbnRlZ2VyVHlwZVN1ZmZpeAorCToJKCd1J3wnVScpPyAoJ2wnfCdMJykKKwl8CSgndSd8J1UnKSAgKCdsJ3wnTCcpPworCTsKKworRkxPQVRJTkdfUE9JTlRfTElURVJBTAorICAgIDogICAoJzAnLi4nOScpKyAnLicgKCcwJy4uJzknKSogRXhwb25lbnQ/IEZsb2F0VHlwZVN1ZmZpeD8KKyAgICB8ICAgJy4nICgnMCcuLic5JykrIEV4cG9uZW50PyBGbG9hdFR5cGVTdWZmaXg/CisgICAgfCAgICgnMCcuLic5JykrIEV4cG9uZW50IEZsb2F0VHlwZVN1ZmZpeD8KKyAgICB8ICAgKCcwJy4uJzknKSsgRXhwb25lbnQ/IEZsb2F0VHlwZVN1ZmZpeAorCTsKKworZnJhZ21lbnQKK0V4cG9uZW50IDogKCdlJ3wnRScpICgnKyd8Jy0nKT8gKCcwJy4uJzknKSsgOworCitmcmFnbWVudAorRmxvYXRUeXBlU3VmZml4IDogKCdmJ3wnRid8J2QnfCdEJykgOworCitmcmFnbWVudAorRXNjYXBlU2VxdWVuY2UKKyAgICA6ICAgJ1xcJyAoJ2InfCd0J3wnbid8J2YnfCdyJ3wnXCInfCdcJyd8J1xcJykKKyAgICB8ICAgT2N0YWxFc2NhcGUKKyAgICA7CisKK2ZyYWdtZW50CitPY3RhbEVzY2FwZQorICAgIDogICAnXFwnICgnMCcuLiczJykgKCcwJy4uJzcnKSAoJzAnLi4nNycpCisgICAgfCAgICdcXCcgKCcwJy4uJzcnKSAoJzAnLi4nNycpCisgICAgfCAgICdcXCcgKCcwJy4uJzcnKQorICAgIDsKKworZnJhZ21lbnQKK1VuaWNvZGVFc2NhcGUKKyAgICA6ICAgJ1xcJyAndScgSGV4RGlnaXQgSGV4RGlnaXQgSGV4RGlnaXQgSGV4RGlnaXQKKyAgICA7CisKK1dTICA6ICAoJyAnfCdccid8J1x0J3wnXHUwMDBDJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30KKyAgICA7CisKK0NPTU1FTlQKKyAgICA6ICAgJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nIHskY2hhbm5lbD1ISURERU47fQorICAgIDsKKworTElORV9DT01NRU5UCisgICAgOiAnLy8nIH4oJ1xuJ3wnXHInKSogJ1xyJz8gJ1xuJyB7JGNoYW5uZWw9SElEREVOO30KKyAgICA7CisKKy8vIGlnbm9yZSAjbGluZSBpbmZvIGZvciBub3cKK0xJTkVfQ09NTUFORCAKKyAgICA6ICcjJyB+KCdcbid8J1xyJykqICdccic/ICdcbicgeyRjaGFubmVsPUhJRERFTjt9CisgICAgOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzM2JhY2t0cmFja2luZy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDMzYmFja3RyYWNraW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNWM2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzM2JhY2t0cmFja2luZy5weQpAQCAtMCwwICsxLDMxIEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIHQwMzNiYWNrdHJhY2tpbmcodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorCisKKyAgICBkZWYgcGFyc2VyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRQYXJzZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRQYXJzZXIKKworCisgICAgQHRlc3RiYXNlLmJyb2tlbigiU29tZSBidWcgaW4gdGhlIHRvb2wiLCBTeW50YXhFcnJvcikKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ludCBhOycpCisKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIGV2ZW50cyA9IHBhcnNlci50cmFuc2xhdGlvbl91bml0KCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzR0b2tlbkxhYmVsUHJvcGVydHlSZWYuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMTIzNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmLmcKQEAgLTAsMCArMSwzMCBAQAorZ3JhbW1hciB0MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCithOiB0PUEKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgJHQudGV4dAorICAgICAgICAgICAgcHJpbnQgJHQudHlwZQorICAgICAgICAgICAgcHJpbnQgJHQubGluZQorICAgICAgICAgICAgcHJpbnQgJHQucG9zCisgICAgICAgICAgICBwcmludCAkdC5jaGFubmVsCisgICAgICAgICAgICBwcmludCAkdC5pbmRleAorICAgICAgICAgICAgI3ByaW50ICR0LnRyZWUKKyAgICAgICAgfQorICAgIDsKKworQTogJ2EnLi4neic7CisKK1dTICA6CisgICAgICAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICB8CSdcclxuJworICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICApCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWwgPSBISURERU4gfQorICAgIDsgICAgCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzR0b2tlbkxhYmVsUHJvcGVydHlSZWYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0ZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM0dG9rZW5MYWJlbFByb3BlcnR5UmVmLnB5CkBAIC0wLDAgKzEsNDAgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgdDAzNHRva2VuTGFiZWxQcm9wZXJ0eVJlZih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFBhcnNlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJyAgIGEnKQorCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBldmVudHMgPSBwYXJzZXIuYSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZi5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZi5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGE5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmLmcKQEAgLTAsMCArMSwxNiBAQAorZ3JhbW1hciB0MDM1cnVsZUxhYmVsUHJvcGVydHlSZWY7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK2EgcmV0dXJucyBbYmxhXTogdD1iCisgICAgICAgIHsKKyAgICAgICAgICAgICRibGEgPSAkdC5zdGFydCwgJHQuc3RvcCwgJHQudGV4dAorICAgICAgICB9CisgICAgOworCitiOiBBKzsKKworQTogJ2EnLi4neic7CisKK1dTOiAnICcrICB7ICRjaGFubmVsID0gSElEREVOIH07CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzNXJ1bGVMYWJlbFByb3BlcnR5UmVmLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDJkYmFhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZi5weQpAQCAtMCwwICsxLDQ3IEBACitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIHQwMzVydWxlTGFiZWxQcm9wZXJ0eVJlZih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFBhcnNlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJyAgIGEgYSBhIGEgICcpCisKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHN0YXJ0LCBzdG9wLCB0ZXh0ID0gcGFyc2VyLmEoKQorCisgICAgICAgICMgZmlyc3QgdG9rZW4gb2YgcnVsZSBiIGlzIHRoZSAybmQgdG9rZW4gKGNvdW50aW5nIGhpZGRlbiB0b2tlbnMpCisgICAgICAgIGFzc2VydCBzdGFydC5pbmRleCA9PSAxLCBzdGFydAorCisgICAgICAgICMgZmlyc3QgdG9rZW4gb2YgcnVsZSBiIGlzIHRoZSA3dGggdG9rZW4gKGNvdW50aW5nIGhpZGRlbiB0b2tlbnMpCisgICAgICAgIGFzc2VydCBzdG9wLmluZGV4ID09IDcsIHN0b3AKKworICAgICAgICBhc3NlcnQgdGV4dCA9PSAiYSBhIGEgYSIsIHRleHQKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzZtdWx0aXBsZVJldHVyblZhbHVlcy5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzZtdWx0aXBsZVJldHVyblZhbHVlcy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2UxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzLmcKQEAgLTAsMCArMSwyNSBAQAorZ3JhbW1hciB0MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK2EgcmV0dXJucyBbZm9vLCBiYXJdOiBBCisgICAgICAgIHsKKyAgICAgICAgICAgICRmb28gPSAiZm9vIjsKKyAgICAgICAgICAgICRiYXIgPSAiYmFyIjsKKyAgICAgICAgfQorICAgIDsKKworQTogJ2EnLi4neic7CisKK1dTICA6CisgICAgICAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICB8CSdcclxuJworICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICApCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWwgPSBISURERU4gfQorICAgIDsgICAgCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM2bXVsdGlwbGVSZXR1cm5WYWx1ZXMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTA0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzLnB5CkBAIC0wLDAgKzEsNDMgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgdDAzNm11bHRpcGxlUmV0dXJuVmFsdWVzKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnICAgYScpCisKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHJldCA9IHBhcnNlci5hKCkKKyAgICAgICAgYXNzZXJ0IHJldC5mb28gPT0gJ2ZvbycsIHJldC5mb28KKyAgICAgICAgYXNzZXJ0IHJldC5iYXIgPT0gJ2JhcicsIHJldC5iYXIKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM3cnVsZVByb3BlcnR5UmVmLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzN3J1bGVQcm9wZXJ0eVJlZi5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYWIxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzN3J1bGVQcm9wZXJ0eVJlZi5nCkBAIC0wLDAgKzEsMTUgQEAKK2dyYW1tYXIgdDAzN3J1bGVQcm9wZXJ0eVJlZjsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworYSByZXR1cm5zIFtibGFdCitAYWZ0ZXIgeworICAgICRibGEgPSAkc3RhcnQsICRzdG9wLCAkdGV4dAorfQorICAgIDogQSsKKyAgICA7CisKK0E6ICdhJy4uJ3onOworCitXUzogJyAnKyAgeyAkY2hhbm5lbCA9IEhJRERFTiB9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzdydWxlUHJvcGVydHlSZWYucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzN3J1bGVQcm9wZXJ0eVJlZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OThhMmJhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzdydWxlUHJvcGVydHlSZWYucHkKQEAgLTAsMCArMSw0NyBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDM3cnVsZVByb3BlcnR5UmVmKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnICAgYSBhIGEgYSAgJykKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgc3RhcnQsIHN0b3AsIHRleHQgPSBwYXJzZXIuYSgpLmJsYQorCisgICAgICAgICMgZmlyc3QgdG9rZW4gb2YgcnVsZSBiIGlzIHRoZSAybmQgdG9rZW4gKGNvdW50aW5nIGhpZGRlbiB0b2tlbnMpCisgICAgICAgIGFzc2VydCBzdGFydC5pbmRleCA9PSAxLCBzdGFydAorICAgICAgICAKKyAgICAgICAgIyBmaXJzdCB0b2tlbiBvZiBydWxlIGIgaXMgdGhlIDd0aCB0b2tlbiAoY291bnRpbmcgaGlkZGVuIHRva2VucykKKyAgICAgICAgYXNzZXJ0IHN0b3AuaW5kZXggPT0gNywgc3RvcAorCisgICAgICAgIGFzc2VydCB0ZXh0ID09ICJhIGEgYSBhIiwgdGV4dAorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzOGxleGVyUnVsZUxhYmVsLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzOGxleGVyUnVsZUxhYmVsLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjMWE2MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM4bGV4ZXJSdWxlTGFiZWwuZwpAQCAtMCwwICsxLDI4IEBACitsZXhlciBncmFtbWFyIHQwMzhsZXhlclJ1bGVMYWJlbDsKK29wdGlvbnMgeworICBsYW5ndWFnZSA9IFB5dGhvbjsKK30KKworQTogJ2EnLi4neicgV1MgJzAnLi4nOScKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgJFdTCisgICAgICAgICAgICBwcmludCAkV1MudHlwZQorICAgICAgICAgICAgcHJpbnQgJFdTLmxpbmUKKyAgICAgICAgICAgIHByaW50ICRXUy5wb3MKKyAgICAgICAgICAgIHByaW50ICRXUy5jaGFubmVsCisgICAgICAgICAgICBwcmludCAkV1MuaW5kZXgKKyAgICAgICAgICAgIHByaW50ICRXUy50ZXh0CisgICAgICAgIH0KKyAgICA7CisKK2ZyYWdtZW50IFdTICA6CisgICAgICAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICB8CSdcclxuJworICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICApCisgICAgICAgICkrCisgICAgICAgIHsgJGNoYW5uZWwgPSBISURERU4gfQorICAgIDsgICAgCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDM4bGV4ZXJSdWxlTGFiZWwucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzOGxleGVyUnVsZUxhYmVsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjY1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzOGxleGVyUnVsZUxhYmVsLnB5CkBAIC0wLDAgKzEsMzMgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgdDAzOGxleGVyUnVsZUxhYmVsKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHRlc3RWYWxpZDEoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdhICAyJykKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdCA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgICAgICBpZiB0LnR5cGUgPT0gYW50bHIzLkVPRjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcHJpbnQgdAorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzOWxhYmVscy5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzlsYWJlbHMuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRjMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzlsYWJlbHMuZwpAQCAtMCwwICsxLDE4IEBACitncmFtbWFyIHQwMzlsYWJlbHM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK2EgcmV0dXJucyBbbF0KKyAgICA6IGlkcys9QSAoICcsJyBpZHMrPShBfEIpICkqIEMgRCB3PS4gaWRzKz0uIEYgRU9GCisgICAgICAgIHsgbCA9ICgkaWRzLCAkdykgfQorICAgIDsKKworQTogJ2EnLi4neic7CitCOiAnMCcuLic5JzsKK0M6IGE9J0EnIHsgcHJpbnQgJGEgfTsKK0Q6IGE9J0ZPT0JBUicgeyBwcmludCAkYSB9OworRTogJ0dOVScgYT0uIHsgcHJpbnQgJGEgfTsKK0Y6ICdCTEFSWicgYT1FT0YgeyBwcmludCAkYSB9OworCitXUzogJyAnKyAgeyAkY2hhbm5lbCA9IEhJRERFTiB9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzlsYWJlbHMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDAzOWxhYmVscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTU5ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwMzlsYWJlbHMucHkKQEAgLTAsMCArMSw1MyBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDM5bGFiZWxzKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKyAgICAKKyAgICAgICAgCisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisgICAgCisgICAgICAgIAorICAgIGRlZiB0ZXN0VmFsaWQxKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgKKyAgICAgICAgICAgICdhLCBiLCBjLCAxLCAyIEEgRk9PQkFSIEdOVTEgQSBCTEFSWicKKyAgICAgICAgICAgICkKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgaWRzLCB3ID0gcGFyc2VyLmEoKQorCisgICAgICAgIGFzc2VydCBsZW4oaWRzKSA9PSA2LCBpZHMKKyAgICAgICAgYXNzZXJ0IGlkc1swXS50ZXh0ID09ICdhJywgaWRzWzBdCisgICAgICAgIGFzc2VydCBpZHNbMV0udGV4dCA9PSAnYicsIGlkc1sxXQorICAgICAgICBhc3NlcnQgaWRzWzJdLnRleHQgPT0gJ2MnLCBpZHNbMl0KKyAgICAgICAgYXNzZXJ0IGlkc1szXS50ZXh0ID09ICcxJywgaWRzWzNdCisgICAgICAgIGFzc2VydCBpZHNbNF0udGV4dCA9PSAnMicsIGlkc1s0XQorICAgICAgICBhc3NlcnQgaWRzWzVdLnRleHQgPT0gJ0EnLCBpZHNbNV0KKworICAgICAgICBhc3NlcnQgdy50ZXh0ID09ICdHTlUxJywgdworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDBidWc4MC5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDBidWc4MC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZjYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0MGJ1ZzgwLmcKQEAgLTAsMCArMSwxMyBAQAorbGV4ZXIgZ3JhbW1hciB0MDQwYnVnODA7IAorb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorIAorSURfTElLRQorICAgIDogJ2RlZmluZWQnIAorICAgIHwge0ZhbHNlfT8gSWRlbnRpZmllciAKKyAgICB8IElkZW50aWZpZXIgCisgICAgOyAKKyAKK2ZyYWdtZW50IAorSWRlbnRpZmllcjogJ2EnLi4neicrIDsgLy8gd2l0aCBqdXN0ICdhJywgb3V0cHV0IGNvbXBpbGVzIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDBidWc4MC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQwYnVnODAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2MzdlNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQwYnVnODAucHkKQEAgLTAsMCArMSwzMyBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDQwYnVnODAodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICAKKworICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2RlZmluZWQnKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHQgPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICAgICAgaWYgdC50eXBlID09IGFudGxyMy5FT0Y6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHByaW50IHQKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQxcGFyYW1ldGVycy5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDFwYXJhbWV0ZXJzLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhODg5MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQxcGFyYW1ldGVycy5nCkBAIC0wLDAgKzEsMTYgQEAKK2dyYW1tYXIgdDA0MXBhcmFtZXRlcnM7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK2FbYXJnMSwgYXJnMl0gcmV0dXJucyBbbF0KKyAgICA6IEErIEVPRgorICAgICAgICB7IAorICAgICAgICAgICAgbCA9ICgkYXJnMSwgJGFyZzIpIAorICAgICAgICAgICAgJGFyZzEgPSAiZ25hcnoiCisgICAgICAgIH0KKyAgICA7CisKK0E6ICdhJy4uJ3onOworCitXUzogJyAnKyAgeyAkY2hhbm5lbCA9IEhJRERFTiB9OwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDFwYXJhbWV0ZXJzLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDFwYXJhbWV0ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTRhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0MXBhcmFtZXRlcnMucHkKQEAgLTAsMCArMSw0NSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDQxcGFyYW1ldGVycyh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFBhcnNlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2EgYSBhJykKKworICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgciA9IHBhcnNlci5hKCdmb28nLCAnYmFyJykKKworICAgICAgICBhc3NlcnQgciA9PSAoJ2ZvbycsICdiYXInKSwgcgorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCisKKworCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQyYXN0LmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0MmFzdC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzY4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0MmFzdC5nCkBAIC0wLDAgKzEsMzUzIEBACitncmFtbWFyIHQwNDJhc3Q7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZSA9IFB5dGhvbjsKKyAgICBvdXRwdXQgPSBBU1Q7Cit9CisKK3Rva2VucyB7CisgICAgVkFSREVGOworICAgIEZMT0FUOworICAgIEVYUFI7CisgICAgQkxPQ0s7CisgICAgVkFSSUFCTEU7CisgICAgRklFTEQ7CisgICAgQ0FMTDsKKyAgICBJTkRFWDsKKyAgICBGSUVMREFDQ0VTUzsKK30KKworQGluaXQgeworc2VsZi5mbGFnID0gRmFsc2UKK30KKworcjEKKyAgICA6IElOVCAoJysnXiBJTlQpKgorICAgIDsKKworcjIKKyAgICA6ICdhc3NlcnQnXiB4PWV4cHJlc3Npb24gKCc6JyEgeT1leHByZXNzaW9uKT8gJzsnIQorICAgIDsKKworcjMKKyAgICA6ICdpZideIGV4cHJlc3Npb24gczE9c3RhdGVtZW50ICgnZWxzZSchIHMyPXN0YXRlbWVudCk/CisgICAgOworCityNAorICAgIDogJ3doaWxlJ14gZXhwcmVzc2lvbiBzdGF0ZW1lbnQKKyAgICA7CisKK3I1CisgICAgOiAncmV0dXJuJ14gZXhwcmVzc2lvbj8gJzsnIQorICAgIDsKKworcjYKKyAgICA6IChJTlR8SUQpKworICAgIDsKKworcjcKKyAgICA6IElOVCAtPiAKKyAgICA7CisKK3I4CisgICAgOiAndmFyJyBJRCAnOicgdHlwZSAtPiBeKCd2YXInIHR5cGUgSUQpIAorICAgIDsKKworcjkKKyAgICA6IHR5cGUgSUQgJzsnIC0+IF4oVkFSREVGIHR5cGUgSUQpIAorICAgIDsKKworcjEwCisgICAgOiBJTlQgLT4ge0NvbW1vblRyZWUoQ29tbW9uVG9rZW4odHlwZT1GTE9BVCwgdGV4dD0kSU5ULnRleHQgKyAiLjAiKSl9CisgICAgOworCityMTEKKyAgICA6IGV4cHJlc3Npb24gLT4gXihFWFBSIGV4cHJlc3Npb24pCisgICAgfCAtPiBFWFBSCisgICAgOworCityMTIKKyAgICA6IElEICgnLCcgSUQpKiAtPiBJRCsKKyAgICA7CisKK3IxMworICAgIDogdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBJRCspCisgICAgOworCityMTQKKyAgICA6ICAgZXhwcmVzc2lvbj8gc3RhdGVtZW50KiB0eXBlKworICAgICAgICAtPiBeKEVYUFIgZXhwcmVzc2lvbj8gc3RhdGVtZW50KiB0eXBlKykKKyAgICA7CisKK3IxNQorICAgIDogSU5UIC0+IElOVCBJTlQKKyAgICA7CisKK3IxNgorICAgIDogJ2ludCcgSUQgKCcsJyBJRCkqIC0+IF4oJ2ludCcgSUQpKworICAgIDsKKworcjE3CisgICAgOiAnZm9yJyAnKCcgc3RhcnQ9c3RhdGVtZW50ICc7JyBleHByZXNzaW9uICc7JyBuZXh0PXN0YXRlbWVudCAnKScgc3RhdGVtZW50CisgICAgICAgIC0+IF4oJ2ZvcicgJHN0YXJ0IGV4cHJlc3Npb24gJG5leHQgc3RhdGVtZW50KQorICAgIDsKKworcjE4CisgICAgOiB0PSdmb3InIC0+IF4oQkxPQ0spCisgICAgOworCityMTkKKyAgICA6IHQ9J2ZvcicgLT4gXihCTE9DS1skdF0pCisgICAgOworCityMjAKKyAgICA6IHQ9J2ZvcicgLT4gXihCTE9DS1skdCwiRk9SIl0pCisgICAgOworCityMjEKKyAgICA6IHQ9J2ZvcicgLT4gQkxPQ0sKKyAgICA7CisKK3IyMgorICAgIDogdD0nZm9yJyAtPiBCTE9DS1skdF0KKyAgICA7CisKK3IyMworICAgIDogdD0nZm9yJyAtPiBCTE9DS1skdCwiRk9SIl0KKyAgICA7CisKK3IyNAorICAgIDogcj1zdGF0ZW1lbnQgZXhwcmVzc2lvbiAtPiBeKCRyIGV4cHJlc3Npb24pCisgICAgOworCityMjUKKyAgICA6IHIrPXN0YXRlbWVudCAoJywnIHIrPXN0YXRlbWVudCkrIGV4cHJlc3Npb24gLT4gXigkciBleHByZXNzaW9uKQorICAgIDsKKworcjI2CisgICAgOiByKz1zdGF0ZW1lbnQgKCcsJyByKz1zdGF0ZW1lbnQpKyAtPiBeKEJMT0NLICRyKykKKyAgICA7CisKK3IyNworICAgIDogcj1zdGF0ZW1lbnQgZXhwcmVzc2lvbiAtPiBeKCRyIF4oJHIgZXhwcmVzc2lvbikpCisgICAgOworCityMjgKKyAgICA6ICgnZm9vMjhhJ3wnZm9vMjhiJykgLT4KKyAgICA7CisKK3IyOQorICAgIDogKHIrPXN0YXRlbWVudCkqIC0+IF4oQkxPQ0sgJHIrKQorICAgIDsKKworcjMwCisgICAgOiBzdGF0ZW1lbnQqIC0+IF4oQkxPQ0sgc3RhdGVtZW50PykKKyAgICA7CisKK3IzMQorICAgIDogbW9kaWZpZXIgdHlwZSBJRCAoJz0nIGV4cHJlc3Npb24pPyAnOycKKyAgICAgICAgLT4ge3NlbGYuZmxhZyA9PSAwfT8gXihWQVJERUYgSUQgbW9kaWZpZXIqIHR5cGUgZXhwcmVzc2lvbj8pCisgICAgICAgIC0+IHtzZWxmLmZsYWcgPT0gMX0/IF4oVkFSSUFCTEUgSUQgbW9kaWZpZXIqIHR5cGUgZXhwcmVzc2lvbj8pCisgICAgICAgIC0+ICAgICAgICAgICAgICAgICAgIF4oRklFTEQgSUQgbW9kaWZpZXIqIHR5cGUgZXhwcmVzc2lvbj8pCisgICAgOworCityMzJbd2hpY2hdCisgIDogSUQgSU5UIC0+IHt3aGljaD09MX0/IElECisgICAgICAgICAgIC0+IHt3aGljaD09Mn0/IElOVAorICAgICAgICAgICAtPiAvLyB5aWVsZCBub3RoaW5nIGFzIGVsc2UtY2xhdXNlCisgIDsKKworcjMzCisgICAgOiAgIG1vZGlmaWVycyEgc3RhdGVtZW50CisgICAgOworCityMzQKKyAgICA6ICAgbW9kaWZpZXJzISByMzRhWyRtb2RpZmllcnMudHJlZV0KKyAgICAvL3wgICBtb2RpZmllcnMhIHIzM2JbJG1vZGlmaWVycy50cmVlXQorICAgIDsKKworcjM0YVttb2RdCisgICAgOiAgICdjbGFzcycgSUQgKCdleHRlbmRzJyBzdXA9dHlwZSk/CisgICAgICAgICggJ2ltcGxlbWVudHMnIGkrPXR5cGUgKCcsJyBpKz10eXBlKSopPworICAgICAgICAneycgc3RhdGVtZW50KiAnfScKKyAgICAgICAgLT4gXignY2xhc3MnIElEIHskbW9kfSBeKCdleHRlbmRzJyAkc3VwKT8gXignaW1wbGVtZW50cycgJGkrKT8gc3RhdGVtZW50KiApCisgICAgOworCityMzUKKyAgICA6ICd7JyAnZXh0ZW5kcycgKHN1cD10eXBlKT8gJ30nCisgICAgICAgIC0+ICBeKCdleHRlbmRzJyAkc3VwKT8KKyAgICA7CisKK3IzNgorICAgIDogJ2lmJyAnKCcgZXhwcmVzc2lvbiAnKScgczE9c3RhdGVtZW50CisgICAgICAgICggJ2Vsc2UnIHMyPXN0YXRlbWVudCAtPiBeKCdpZicgXihFWFBSIGV4cHJlc3Npb24pICRzMSAkczIpCisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAtPiBeKCdpZicgXihFWFBSIGV4cHJlc3Npb24pICRzMSkKKyAgICAgICAgKQorICAgIDsKKworcjM3CisgICAgOiAoSU5UIC0+IElOVCkgKCcrJyBpPUlOVCAtPiBeKCcrJyAkcjM3ICRpKSApKiAKKyAgICA7CisKK3IzOAorICAgIDogSU5UICgnKydeIElOVCkqCisgICAgOworCityMzkKKyAgICA6IChwcmltYXJ5LT5wcmltYXJ5KSAvLyBzZXQgcmV0dXJuIHRyZWUgdG8ganVzdCBwcmltYXJ5CisgICAgICAgICggJygnIGFyZz1leHByZXNzaW9uICcpJworICAgICAgICAgICAgLT4gXihDQUxMICRyMzkgJGFyZykKKyAgICAgICAgfCAnWycgaWU9ZXhwcmVzc2lvbiAnXScKKyAgICAgICAgICAgIC0+IF4oSU5ERVggJHIzOSAkaWUpCisgICAgICAgIHwgJy4nIHA9cHJpbWFyeQorICAgICAgICAgICAgLT4gXihGSUVMREFDQ0VTUyAkcjM5ICRwKQorICAgICAgICApKgorICAgIDsKKworcjQwCisgICAgOiAoSU5UIC0+IElOVCkgKCAoJysnIGkrPUlOVCkqIC0+IF4oJysnICRyNDAgJGkqKSApICc7JworICAgIDsKKworcjQxCisgICAgOiAoSU5UIC0+IElOVCkgKCAoJysnIGk9SU5UKSAtPiBeKCRpICRyNDEpICkqICc7JworICAgIDsKKworcjQyCisgICAgOiBpZHMrPUlEICgnLCchIGlkcys9SUQpKgorICAgIDsKKworcjQzIHJldHVybnMgW3Jlc10KKyAgICA6IGlkcys9SUQhICgnLCchIGlkcys9SUQhKSogeyRyZXMgPSBbaWQudGV4dCBmb3IgaWQgaW4gJGlkc119CisgICAgOworCityNDQKKyAgICA6IGlkcys9SUReICgnLCchIGlkcys9SUReKSoKKyAgICA7CisKK3I0NQorICAgIDogcHJpbWFyeV4KKyAgICA7CisKK3I0NiByZXR1cm5zIFtyZXNdCisgICAgOiBpZHMrPXByaW1hcnkhICgnLCchIGlkcys9cHJpbWFyeSEpKiB7JHJlcyA9IFtpZC50ZXh0IGZvciBpZCBpbiAkaWRzXX0KKyAgICA7CisKK3I0NworICAgIDogaWRzKz1wcmltYXJ5ICgnLCchIGlkcys9cHJpbWFyeSkqCisgICAgOworCityNDgKKyAgICA6IGlkcys9LiAoJywnISBpZHMrPS4pKgorICAgIDsKKworcjQ5CisgICAgOiAuXiBJRAorICAgIDsKKworcjUwCisgICAgOiBJRCAKKyAgICAgICAgLT4gXih7Q29tbW9uVHJlZShDb21tb25Ub2tlbih0eXBlPUZMT0FULCB0ZXh0PSIxLjAiKSl9IElEKQorICAgIDsKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgdG9rZW5MYWJlbFByb3BlcnR5UmVmX3RyZWUKKyovCityNTEgcmV0dXJucyBbcmVzXQorICAgIDogSUQgdD1JRCBJRAorICAgICAgICB7ICRyZXMgPSAkdC50cmVlIH0KKyAgICA7CisKKy8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgIHJ1bGVQcm9wZXJ0eVJlZl90cmVlCisqLworcjUyIHJldHVybnMgW3Jlc10KK0BhZnRlciB7CisgICAgJHJlcyA9ICR0cmVlCit9CisgICAgOiBJRAorICAgIDsKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcnVsZUxhYmVsUHJvcGVydHlSZWZfdHJlZQorKi8KK3I1MyByZXR1cm5zIFtyZXNdCisgICAgOiB0PXByaW1hcnkKKyAgICAgICAgeyAkcmVzID0gJHQudHJlZSB9CisgICAgOworCisvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICBydWxlU2V0UHJvcGVydHlSZWZfdHJlZQorKi8KK3I1NCByZXR1cm5zIFtyZXNdCitAYWZ0ZXIgeworICAgICR0cmVlID0gJHQudHJlZTsKK30KKyAgICA6IElEIHQ9ZXhwcmVzc2lvbiBJRAorICAgIDsKKworLyoqIGJhY2t0cmFja2luZyAqLworcjU1CitvcHRpb25zIHsgYmFja3RyYWNrPXRydWU7IGs9MTsgfQorICAgIDogKG1vZGlmaWVyKyBJTlQpPT4gbW9kaWZpZXIrIGV4cHJlc3Npb24KKyAgICB8IG1vZGlmaWVyKyBzdGF0ZW1lbnQKKyAgICA7CisKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcmV3cml0ZVRva2VuUmVmIHdpdGggbGVuKGFyZ3MpPjAKKyovCityNTYKKyAgICA6IHQ9SUQqIC0+IElEWyR0LCdmb28nXQorICAgIDsKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcmV3cml0ZVRva2VuUmVmUm9vdCB3aXRoIGxlbihhcmdzKT4wCisqLworcjU3CisgICAgOiB0PUlEKiAtPiBeKElEWyR0LCdmb28nXSkKKyAgICA7CisKKy8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgID8/PworKi8KK3I1OAorICAgIDogKHtDb21tb25UcmVlKENvbW1vblRva2VuKHR5cGU9RkxPQVQsIHRleHQ9IjIuMCIpKX0pXgorICAgIDsKKworLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmUm9vdAorKi8KK3I1OQorICAgIDogKHQrPUlEKSsgc3RhdGVtZW50IC0+IF4oJHQgc3RhdGVtZW50KSsKKyAgICA7CisKK3ByaW1hcnkKKyAgICA6IElECisgICAgOworCitleHByZXNzaW9uCisgICAgOiByMQorICAgIDsKKworc3RhdGVtZW50CisgICAgOiAnZm9vemUnCisgICAgfCAnZm9vemUyJworICAgIDsKKworbW9kaWZpZXJzCisgICAgOiBtb2RpZmllcisKKyAgICA7CisKK21vZGlmaWVyCisgICAgOiAncHVibGljJworICAgIHwgJ3ByaXZhdGUnCisgICAgOworCit0eXBlCisgICAgOiAnaW50JworICAgIHwgJ2Jvb2wnCisgICAgOworCitJRCA6ICdhJy4uJ3onICsgOworSU5UIDogJzAnLi4nOScgKzsKK1dTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDJhc3QucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0MmFzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjljMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDJhc3QucHkKQEAgLTAsMCArMSw2ODggQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKKworY2xhc3MgdDA0MmFzdCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorIyMgICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorIyMgICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisjIyAgICAgICAgICAgICBkZWYgcmVwb3J0RXJyb3Ioc2VsZiwgcmUpOgorIyMgICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorIyMgICAgICAgICAgICAgICAgIHJhaXNlIHJlCisKKyMjICAgICAgICAgcmV0dXJuIFRMZXhlcgorICAgIAorCisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisgICAgCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgdGV4dCwgbWV0aG9kLCByQXJncz1bXSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkgI29wdGlvbnM9Jy10cmFjZScpCisgICAgICAgIAorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSh0ZXh0KQorICAgICAgICBzZWxmLmxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKHNlbGYubGV4ZXIpCisgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgCisgICAgICAgIGZvciBhdHRyLCB2YWwgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYucGFyc2VyLCBhdHRyLCB2YWwpCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5wYXJzZXIsIG1ldGhvZCkoKnJBcmdzKQorCisgICAgCisgICAgZGVmIHRlc3RSMShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoIjEgKyAyIiwgJ3IxJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKCsgMSAyKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMmEoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJhc3NlcnQgMiszOyIsICdyMicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhhc3NlcnQgKCsgMiAzKSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjJiKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiYXNzZXJ0IDIrMyA6IDU7IiwgJ3IyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGFzc2VydCAoKyAyIDMpIDUpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIzYShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImlmIDEgZm9vemUiLCAncjMnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcoaWYgMSBmb296ZSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjNiKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiaWYgMSBmb296ZSBlbHNlIGZvb3plIiwgJ3IzJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGlmIDEgZm9vemUgZm9vemUpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI0YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoIndoaWxlIDIgZm9vemUiLCAncjQnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcod2hpbGUgMiBmb296ZSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjVhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicmV0dXJuOyIsICdyNScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ3JldHVybicKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNWIoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJyZXR1cm4gMiszOyIsICdyNScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhyZXR1cm4gKCsgMiAzKSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjZhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiMyIsICdyNicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJzMnCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjZiKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiMyBhIiwgJ3I2JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnMyBhJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI3KHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiMyIsICdyNycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgIHIudHJlZSBpcyBOb25lCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0Ujgoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJ2YXIgZm9vOmJvb2wiLCAncjgnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcodmFyIGJvb2wgZm9vKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSOShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImludCBmb287IiwgJ3I5JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKFZBUkRFRiBpbnQgZm9vKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMTAoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCIxMCIsICdyMTAnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcxMC4wJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxMWEoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCIxKzIiLCAncjExJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEVYUFIgKCsgMSAyKSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjExYihzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoIiIsICdyMTEnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdFWFBSJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxMmEoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJmb28iLCAncjEyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnZm9vJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxMmIoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJmb28sIGJhciwgZ251cnoiLCAncjEyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnZm9vIGJhciBnbnVyeicKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMTNhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiaW50IGZvbzsiLCAncjEzJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGludCBmb28pJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxM2Ioc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJib29sIGZvbywgYmFyLCBnbnVyejsiLCAncjEzJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGJvb2wgZm9vIGJhciBnbnVyeiknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjE0YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoIjErMiBpbnQiLCAncjE0JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEVYUFIgKCsgMSAyKSBpbnQpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxNGIoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCIxKzIgaW50IGJvb2wiLCAncjE0JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEVYUFIgKCsgMSAyKSBpbnQgYm9vbCknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjE0YyhzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImludCBib29sIiwgJ3IxNCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhFWFBSIGludCBib29sKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMTRkKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZm9vemUgZm9vemUgaW50IGJvb2wiLCAncjE0JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEVYUFIgZm9vemUgZm9vemUgaW50IGJvb2wpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxNGUoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCI3KzkgZm9vemUgZm9vemUgaW50IGJvb2wiLCAncjE0JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEVYUFIgKCsgNyA5KSBmb296ZSBmb296ZSBpbnQgYm9vbCknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjE1KHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiNyIsICdyMTUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICc3IDcnCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjE2YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImludCBmb28iLCAncjE2JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGludCBmb28pJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxNmIoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJpbnQgZm9vLCBiYXIsIGdudXJ6IiwgJ3IxNicpCisgICAgICAgICAgICAKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGludCBmb28pIChpbnQgYmFyKSAoaW50IGdudXJ6KScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMTdhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZm9yICggZm9vemUgOyAxICsgMiA7IGZvb3plICkgZm9vemUiLCAncjE3JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKGZvciBmb296ZSAoKyAxIDIpIGZvb3plIGZvb3plKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMThhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZm9yIiwgJ3IxOCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ0JMT0NLJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIxOWEoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJmb3IiLCAncjE5JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnZm9yJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIyMGEoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJmb3IiLCAncjIwJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnRk9SJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIyMWEoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJmb3IiLCAncjIxJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnQkxPQ0snCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjIyYShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImZvciIsICdyMjInKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdmb3InCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjIzYShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImZvciIsICdyMjMnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdGT1InCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjI0YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImZvb3plIDEgKyAyIiwgJ3IyNCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhmb296ZSAoKyAxIDIpKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMjVhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZm9vemUsIGZvb3plMiAxICsgMiIsICdyMjUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcoZm9vemUgKCsgMSAyKSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjI2YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImZvb3plLCBmb296ZTIiLCAncjI2JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEJMT0NLIGZvb3plIGZvb3plMiknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjI3YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImZvb3plIDEgKyAyIiwgJ3IyNycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhmb296ZSAoZm9vemUgKCsgMSAyKSkpJworICAgICAgICAgICAgKQorICAgICAgICAgICAgCisKKyAgICBkZWYgdGVzdFIyOChzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImZvbzI4YSIsICdyMjgnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCisgICAgICAgICAgICByLnRyZWUgaXMgTm9uZQorICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIyOShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgciA9IHNlbGYucGFyc2UoIiIsICdyMjknKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCisjIEZJWE1FOiBicm9rZW4gdXBzdHJlYW0/CisjIyAgICAgZGVmIHRlc3RSMzAoc2VsZik6CisjIyAgICAgICAgIHRyeToKKyMjICAgICAgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJmb296ZSBmb296ZSIsICdyMzAnKQorIyMgICAgICAgICAgICAgc2VsZi5mYWlsKHIudHJlZS50b1N0cmluZ1RyZWUoKSkKKyMjICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyMjICAgICAgICAgICAgIHBhc3MKKworCisgICAgZGVmIHRlc3RSMzFhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicHVibGljIGludCBnbnVyeiA9IDEgKyAyOyIsICdyMzEnLCBmbGFnPTApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhWQVJERUYgZ251cnogcHVibGljIGludCAoKyAxIDIpKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzFiKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicHVibGljIGludCBnbnVyeiA9IDEgKyAyOyIsICdyMzEnLCBmbGFnPTEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhWQVJJQUJMRSBnbnVyeiBwdWJsaWMgaW50ICgrIDEgMikpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIzMWMoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJwdWJsaWMgaW50IGdudXJ6ID0gMSArIDI7IiwgJ3IzMScsIGZsYWc9MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEZJRUxEIGdudXJ6IHB1YmxpYyBpbnQgKCsgMSAyKSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjMyYShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImdudXJ6IDMyIiwgJ3IzMicsIFsxXSwgZmxhZz0yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdnbnVyeicKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzJiKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnogMzIiLCAncjMyJywgWzJdLCBmbGFnPTIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJzMyJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIzMmMoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJnbnVyeiAzMiIsICdyMzInLCBbM10sIGZsYWc9MikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgci50cmVlIGlzIE5vbmUKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzNhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicHVibGljIHByaXZhdGUgZm9vemUiLCAncjMzJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnZm9vemUnCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjM0YShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoInB1YmxpYyBjbGFzcyBnbnVyeiB7IGZvb3plIGZvb3plMiB9IiwgJ3IzNCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhjbGFzcyBnbnVyeiBwdWJsaWMgZm9vemUgZm9vemUyKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzRiKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicHVibGljIGNsYXNzIGdudXJ6IGV4dGVuZHMgYm9vbCBpbXBsZW1lbnRzIGludCwgYm9vbCB7IGZvb3plIGZvb3plMiB9IiwgJ3IzNCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhjbGFzcyBnbnVyeiBwdWJsaWMgKGV4dGVuZHMgYm9vbCkgKGltcGxlbWVudHMgaW50IGJvb2wpIGZvb3plIGZvb3plMiknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjM1KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByID0gc2VsZi5wYXJzZSgieyBleHRlbmRzIH0iLCAncjM1JykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgICAgICAKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgZGVmIHRlc3RSMzZhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiaWYgKCAxICsgMiApIGZvb3plIiwgJ3IzNicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhpZiAoRVhQUiAoKyAxIDIpKSBmb296ZSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjM2YihzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImlmICggMSArIDIgKSBmb296ZSBlbHNlIGZvb3plMiIsICdyMzYnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcoaWYgKEVYUFIgKCsgMSAyKSkgZm9vemUgZm9vemUyKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzcoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCIxICsgMiArIDMiLCAncjM3JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKCsgKCsgMSAyKSAzKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzgoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCIxICsgMiArIDMiLCAncjM4JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKCsgKCsgMSAyKSAzKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzlhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnpbMV0iLCAncjM5JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKElOREVYIGdudXJ6IDEpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFIzOWIoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJnbnVyeigyKSIsICdyMzknKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcoQ0FMTCBnbnVyeiAyKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzljKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnouZ25hcnoiLCAncjM5JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEZJRUxEQUNDRVNTIGdudXJ6IGduYXJ6KScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSMzlkKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnouZ25hcnouZ25vcnoiLCAncjM5JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKEZJRUxEQUNDRVNTIChGSUVMREFDQ0VTUyBnbnVyeiBnbmFyeikgZ25vcnopJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI0MChzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoIjEgKyAyICsgMzsiLCAncjQwJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKCsgMSAyIDMpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI0MShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoIjEgKyAyICsgMzsiLCAncjQxJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKDMgKDIgMSkpJworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI0MihzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImdudXJ6LCBnbmFyeiwgZ25vcnoiLCAncjQyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnZ251cnogZ25hcnogZ25vcnonCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjQzKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnosIGduYXJ6LCBnbm9yeiIsICdyNDMnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCisgICAgICAgICAgICByLnRyZWUgaXMgTm9uZQorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIucmVzLAorICAgICAgICAgICAgWydnbnVyeicsICdnbmFyeicsICdnbm9yeiddCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjQ0KHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnosIGduYXJ6LCBnbm9yeiIsICdyNDQnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcoZ25vcnogKGduYXJ6IGdudXJ6KSknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjQ1KHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnoiLCAncjQ1JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnZ251cnonCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjQ2KHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnosIGduYXJ6LCBnbm9yeiIsICdyNDYnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCisgICAgICAgICAgICByLnRyZWUgaXMgTm9uZQorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIucmVzLAorICAgICAgICAgICAgWydnbnVyeicsICdnbmFyeicsICdnbm9yeiddCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjQ3KHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnosIGduYXJ6LCBnbm9yeiIsICdyNDcnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdnbnVyeiBnbmFyeiBnbm9yeicKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNDgoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJnbnVyeiwgZ25hcnosIGdub3J6IiwgJ3I0OCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ2dudXJ6IGduYXJ6IGdub3J6JworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI0OShzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImdudXJ6IGdub3J6IiwgJ3I0OScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJyhnbnVyeiBnbm9yeiknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjUwKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnoiLCAncjUwJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKDEuMCBnbnVyeiknCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjUxKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnphIGdudXJ6YiBnbnVyemMiLCAncjUxJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnJlcy50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdnbnVyemInCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0UjUyKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgiZ251cnoiLCAncjUyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnJlcy50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICdnbnVyeicKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNTMoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJnbnVyeiIsICdyNTMnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIucmVzLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ2dudXJ6JworICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdFI1NChzZWxmKToKKyAgICAgICAgciA9IHNlbGYucGFyc2UoImdudXJ6YSAxICsgMiBnbnVyemIiLCAncjU0JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAnKCsgMSAyKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNTVhKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicHVibGljIHByaXZhdGUgMSArIDIiLCAncjU1JykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICByLnRyZWUudG9TdHJpbmdUcmVlKCksCisgICAgICAgICAgICAncHVibGljIHByaXZhdGUgKCsgMSAyKScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNTViKHNlbGYpOgorICAgICAgICByID0gc2VsZi5wYXJzZSgicHVibGljIGZvb3plIiwgJ3I1NScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ3B1YmxpYyBmb296ZScKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNTYoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJhIGIgYyBkIiwgJ3I1NicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ2ZvbycKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNTcoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJhIGIgYyBkIiwgJ3I1NycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgci50cmVlLnRvU3RyaW5nVHJlZSgpLAorICAgICAgICAgICAgJ2ZvbycKKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RSNTkoc2VsZik6CisgICAgICAgIHIgPSBzZWxmLnBhcnNlKCJhIGIgYyBmb296ZSIsICdyNTknKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICcoYSBmb296ZSkgKGIgZm9vemUpIChjIGZvb3plKScKKyAgICAgICAgICAgICkKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQzc3lucHJlZC5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDNzeW5wcmVkLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5NGYyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQzc3lucHJlZC5nCkBAIC0wLDAgKzEsMTQgQEAKK2dyYW1tYXIgdDA0M3N5bnByZWQ7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK2E6ICgocysgUCk9PiBzKyBiKT8gRTsKK2I6IFAgJ2Zvbyc7CisKK3M6IFM7CisKKworUzogJyAnOworUDogJysnOworRTogJz4nOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDNzeW5wcmVkLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDNzeW5wcmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDZkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0M3N5bnByZWQucHkKQEAgLTAsMCArMSwzOSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyB0MDQzc3lucHJlZCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorCisgICAgZGVmIGxleGVyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRMZXhlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVExleGVyCisgICAgCisgICAgICAgIAorICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFBhcnNlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkMShzZWxmKToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJyAgICtmb28+JykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIGV2ZW50cyA9IHBhcnNlci5hKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorICAgIApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDR0cmFjZS5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDR0cmFjZS5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2FhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NHRyYWNlLmcKQEAgLTAsMCArMSwyMCBAQAorZ3JhbW1hciB0MDQ0dHJhY2U7CitvcHRpb25zIHsKKyAgbGFuZ3VhZ2UgPSBQeXRob247Cit9CisKK0Bpbml0IHsKKyAgICBzZWxmLl9zdGFjayA9IE5vbmUKK30KKworYTogJzwnICgoSU5UICcrJyk9PmJ8YykgJz4nOworYjogYyAoJysnIGMpKjsKK2M6IElOVCAKKyAgICB7CisgICAgICAgIGlmIHNlbGYuX3N0YWNrIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9zdGFjayA9IHNlbGYuZ2V0UnVsZUludm9jYXRpb25TdGFjaygpCisgICAgfQorICAgIDsKKworSU5UOiAoJzAnLi4nOScpKzsKK1dTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ0dHJhY2UucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NHRyYWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzliNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NHRyYWNlLnB5CkBAIC0wLDAgKzEsOTUgQEAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcihvcHRpb25zPSctdHJhY2UnKQorCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcyA9IFtdCisKKworICAgICAgICAgICAgZGVmIHRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc+JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc8JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorCisKKyAgICBkZWYgcGFyc2VyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRQYXJzZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBiYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICAgICAgICAgIHNlbGYudHJhY2VzID0gW10KKworCisgICAgICAgICAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJz4nK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJzwnK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgZGVmIGdldFJ1bGVJbnZvY2F0aW9uU3RhY2soc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldFJ1bGVJbnZvY2F0aW9uU3RhY2soYmFzZS5fX21vZHVsZV9fKQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisKKworICAgIGRlZiB0ZXN0VHJhY2Uoc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCc8IDEgKyAyICsgMyA+JykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHBhcnNlci5hKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIGxleGVyLnRyYWNlcywKKyAgICAgICAgICAgIFsgJz5UX183JywgJzxUX183JywgJz5XUycsICc8V1MnLCAnPklOVCcsICc8SU5UJywgJz5XUycsICc8V1MnLAorICAgICAgICAgICAgICAnPlRfXzYnLCAnPFRfXzYnLCAnPldTJywgJzxXUycsICc+SU5UJywgJzxJTlQnLCAnPldTJywgJzxXUycsCisgICAgICAgICAgICAgICc+VF9fNicsICc8VF9fNicsICc+V1MnLCAnPFdTJywgJz5JTlQnLCAnPElOVCcsICc+V1MnLCAnPFdTJywKKyAgICAgICAgICAgICAgJz5UX184JywgJzxUX184J10KKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHBhcnNlci50cmFjZXMsCisgICAgICAgICAgICBbICc+YScsICc+c3lucHJlZDFfdDA0NHRyYWNlX2ZyYWdtZW50JywgJzxzeW5wcmVkMV90MDQ0dHJhY2VfZnJhZ21lbnQnLCAnPmInLCAnPmMnLAorICAgICAgICAgICAgICAnPGMnLCAnPmMnLCAnPGMnLCAnPmMnLCAnPGMnLCAnPGInLCAnPGEnIF0KKyAgICAgICAgICAgICkKKworCisgICAgZGVmIHRlc3RJbnZva2F0aW9uU3RhY2soc2VsZik6CisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCc8IDEgKyAyICsgMyA+JykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHBhcnNlci5hKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHBhcnNlci5fc3RhY2ssCisgICAgICAgICAgICBbJ2EnLCAnYicsICdjJ10KKyAgICAgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ1ZGZhYnVnLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NWRmYWJ1Zy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDg5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NWRmYWJ1Zy5nCkBAIC0wLDAgKzEsMzIgQEAKK2dyYW1tYXIgdDA0NWRmYWJ1ZzsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlID0gUHl0aG9uOworICAgIG91dHB1dCA9IEFTVDsKK30KKworCisvLyB0aGlzIHJ1bGUgdXNlZCB0byBnZW5lcmF0ZSBhbiBpbmZpbml0ZSBsb29wIGluIERGQS5wcmVkaWN0CityCitvcHRpb25zIHsgYmFja3RyYWNrPXRydWU7IH0KKyAgICA6IChtb2RpZmllcisgSU5UKT0+IG1vZGlmaWVyKyBleHByZXNzaW9uCisgICAgfCBtb2RpZmllcisgc3RhdGVtZW50CisgICAgOworCitleHByZXNzaW9uCisgICAgOiBJTlQgJysnIElOVAorICAgIDsKKworc3RhdGVtZW50CisgICAgOiAnZm9vemUnCisgICAgfCAnZm9vemUyJworICAgIDsKKworbW9kaWZpZXIKKyAgICA6ICdwdWJsaWMnCisgICAgfCAncHJpdmF0ZScKKyAgICA7CisKK0lEIDogJ2EnLi4neicgKyA7CitJTlQgOiAnMCcuLic5JyArOworV1M6ICgnICcgfCAnXG4nIHwgJ1x0JykrIHskY2hhbm5lbCA9IEhJRERFTjt9OworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NWRmYWJ1Zy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ1ZGZhYnVnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmUxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NWRmYWJ1Zy5weQpAQCAtMCwwICsxLDIxIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCisKK2NsYXNzIFQodGVzdGJhc2UuQU5UTFJUZXN0KToKKworICAgIGRlZiB0ZXN0YnVnKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCJwdWJsaWMgZm9vemUiKQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKworICAgICAgICBwYXJzZXIucigpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDZyZXdyaXRlLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0NnJld3JpdGUuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGRjMWRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDZyZXdyaXRlLmcKQEAgLTAsMCArMSw1NCBAQAorZ3JhbW1hciB0MDQ2cmV3cml0ZTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPVB5dGhvbjsKK30KKworcHJvZ3JhbQorQGluaXQgeworICAgIHN0YXJ0ID0gc2VsZi5pbnB1dC5MVCgxKQorfQorICAgIDogICBtZXRob2QrCisgICAgICAgIHsKKyAgICAgICAgc2VsZi5pbnB1dC5pbnNlcnRCZWZvcmUoc3RhcnQsInB1YmxpYyBjbGFzcyBXcmFwcGVyIHtcbiIpCisgICAgICAgIHNlbGYuaW5wdXQuaW5zZXJ0QWZ0ZXIoJG1ldGhvZC5zdG9wLCAiXG59XG4iKQorICAgICAgICB9CisgICAgOworCittZXRob2QKKyAgICA6ICAgbT0nbWV0aG9kJyBJRCAnKCcgJyknIGJvZHkKKyAgICAgICAge3NlbGYuaW5wdXQucmVwbGFjZSgkbSwgInB1YmxpYyB2b2lkIik7fQorICAgIDsgCisKK2JvZHkKK3Njb3BlIHsKKyAgICBkZWNscworfQorQGluaXQgeworICAgICRib2R5OjpkZWNscyA9IHNldCgpCit9CisgICAgOiAgIGxjdXJseT0neycgc3RhdCogJ30nCisgICAgICAgIHsKKyAgICAgICAgZm9yIGl0IGluICRib2R5OjpkZWNsczoKKyAgICAgICAgICAgIHNlbGYuaW5wdXQuaW5zZXJ0QWZ0ZXIoJGxjdXJseSwgIlxuaW50ICIraXQrIjsiKQorICAgICAgICB9CisgICAgOworCitzdGF0OiAgIElEICc9JyBleHByICc7JyB7JGJvZHk6OmRlY2xzLmFkZCgkSUQudGV4dCk7fQorICAgIDsKKworZXhwcjogICBtdWwgKCcrJyBtdWwpKiAKKyAgICA7CisKK211bCA6ICAgYXRvbSAoJyonIGF0b20pKgorICAgIDsKKworYXRvbTogICBJRAorICAgIHwgICBJTlQKKyAgICA7CisKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSsgOworCitJTlQgOiAgICgnMCcuLic5JykrIDsKKworV1MgIDogICAoJyAnfCdcdCd8J1xuJykrIHskY2hhbm5lbD1ISURERU47fQorICAgIDsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ2cmV3cml0ZS5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ2cmV3cml0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjFlZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDZyZXdyaXRlLnB5CkBAIC0wLDAgKzEsNTUgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKKworY2xhc3MgVCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiB0ZXN0UmV3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisKKyAgICAgICAgaW5wdXQgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICAnJydcCisgICAgICAgICAgICBtZXRob2QgZm9vKCkgeworICAgICAgICAgICAgICBpID0gMzsKKyAgICAgICAgICAgICAgayA9IGk7CisgICAgICAgICAgICAgIGkgPSBrKjQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGhvZCBiYXIoKSB7CisgICAgICAgICAgICAgIGogPSBpKjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAnJycpCisgICAgICAgIAorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuVG9rZW5SZXdyaXRlU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcih0U3RyZWFtKQorICAgICAgICBwYXJzZXIucHJvZ3JhbSgpCisKKyAgICAgICAgZXhwZWN0ZWRPdXRwdXQgPSB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICBwdWJsaWMgY2xhc3MgV3JhcHBlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICAgICAgaW50IGs7CisgICAgICAgIGludCBpOworICAgICAgICAgIGkgPSAzOworICAgICAgICAgIGsgPSBpOworICAgICAgICAgIGkgPSBrKjQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiYXIoKSB7CisgICAgICAgIGludCBqOworICAgICAgICAgIGogPSBpKjI7CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICcnJykKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHN0cih0U3RyZWFtKSwKKyAgICAgICAgICAgIGV4cGVjdGVkT3V0cHV0CisgICAgICAgICAgICApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDd0cmVlcGFyc2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0N3RyZWVwYXJzZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUwYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDd0cmVlcGFyc2VyLmcKQEAgLTAsMCArMSwxMTMgQEAKK2dyYW1tYXIgdDA0N3RyZWVwYXJzZXI7CitvcHRpb25zIHsKKyAgICBsYW5ndWFnZT1QeXRob247CisgICAgb3V0cHV0PUFTVDsKK30KKwordG9rZW5zIHsKKyAgICBWQVJfREVGOworICAgIEFSR19ERUY7CisgICAgRlVOQ19IRFI7CisgICAgRlVOQ19ERUNMOworICAgIEZVTkNfREVGOworICAgIEJMT0NLOworfQorCitwcm9ncmFtCisgICAgOiAgIGRlY2xhcmF0aW9uKworICAgIDsKKworZGVjbGFyYXRpb24KKyAgICA6ICAgdmFyaWFibGUKKyAgICB8ICAgZnVuY3Rpb25IZWFkZXIgJzsnIC0+IF4oRlVOQ19ERUNMIGZ1bmN0aW9uSGVhZGVyKQorICAgIHwgICBmdW5jdGlvbkhlYWRlciBibG9jayAtPiBeKEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrKQorICAgIDsKKwordmFyaWFibGUKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICc7JyAtPiBeKFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yKQorICAgIDsKKworZGVjbGFyYXRvcgorICAgIDogICBJRCAKKyAgICA7CisKK2Z1bmN0aW9uSGVhZGVyCisgICAgOiAgIHR5cGUgSUQgJygnICggZm9ybWFsUGFyYW1ldGVyICggJywnIGZvcm1hbFBhcmFtZXRlciApKiApPyAnKScKKyAgICAgICAgLT4gXihGVU5DX0hEUiB0eXBlIElEIGZvcm1hbFBhcmFtZXRlcispCisgICAgOworCitmb3JtYWxQYXJhbWV0ZXIKKyAgICA6ICAgdHlwZSBkZWNsYXJhdG9yIC0+IF4oQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IpCisgICAgOworCit0eXBlCisgICAgOiAgICdpbnQnICAgCisgICAgfCAgICdjaGFyJyAgCisgICAgfCAgICd2b2lkJworICAgIHwgICBJRCAgICAgICAgCisgICAgOworCitibG9jaworICAgIDogICBsYz0neycKKyAgICAgICAgICAgIHZhcmlhYmxlKgorICAgICAgICAgICAgc3RhdCoKKyAgICAgICAgJ30nCisgICAgICAgIC0+IF4oQkxPQ0tbJGxjLCJCTE9DSyJdIHZhcmlhYmxlKiBzdGF0KikKKyAgICA7CisKK3N0YXQ6IGZvclN0YXQKKyAgICB8IGV4cHIgJzsnIQorICAgIHwgYmxvY2sKKyAgICB8IGFzc2lnblN0YXQgJzsnIQorICAgIHwgJzsnIQorICAgIDsKKworZm9yU3RhdAorICAgIDogICAnZm9yJyAnKCcgc3RhcnQ9YXNzaWduU3RhdCAnOycgZXhwciAnOycgbmV4dD1hc3NpZ25TdGF0ICcpJyBibG9jaworICAgICAgICAtPiBeKCdmb3InICRzdGFydCBleHByICRuZXh0IGJsb2NrKQorICAgIDsKKworYXNzaWduU3RhdAorICAgIDogICBJRCBFUSBleHByIC0+IF4oRVEgSUQgZXhwcikKKyAgICA7CisKK2V4cHI6ICAgY29uZEV4cHIKKyAgICA7CisKK2NvbmRFeHByCisgICAgOiAgIGFleHByICggKCc9PSdeIHwgJzwnXikgYWV4cHIgKT8KKyAgICA7CisKK2FleHByCisgICAgOiAgIGF0b20gKCAnKydeIGF0b20gKSoKKyAgICA7CisKK2F0b20KKyAgICA6IElEICAgICAgCisgICAgfCBJTlQgICAgICAKKyAgICB8ICcoJyBleHByICcpJyAtPiBleHByCisgICAgOyAKKworRk9SIDogJ2ZvcicgOworSU5UX1RZUEUgOiAnaW50JyA7CitDSEFSOiAnY2hhcic7CitWT0lEOiAndm9pZCc7CisKK0lEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgOworCitJTlQgOgkoJzAnLi4nOScpKworICAgIDsKKworRVEgICA6ICc9JyA7CitFUUVRIDogJz09JyA7CitMVCAgIDogJzwnIDsKK1BMVVMgOiAnKycgOworCitXUyAgOiAgICggICAnICcKKyAgICAgICAgfCAgICdcdCcKKyAgICAgICAgfCAgICdccicKKyAgICAgICAgfCAgICdcbicKKyAgICAgICAgKSsKKyAgICAgICAgeyAkY2hhbm5lbD1ISURERU4gfQorICAgIDsgICAgCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0N3RyZWVwYXJzZXIucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0N3RyZWVwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwY2IwNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ3dHJlZXBhcnNlci5weQpAQCAtMCwwICsxLDEyMiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCBhbnRscjMudHJlZQoraW1wb3J0IHRlc3RiYXNlCisKK2NsYXNzIFQodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgd2Fsa2VyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRXYWxrZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBiYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICAgICAgICAgIHNlbGYudHJhY2VzID0gW10KKworCisgICAgICAgICAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJz4nK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJzwnK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gVFdhbGtlcgorICAgIAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCkKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigndDA0N3RyZWVwYXJzZXJXYWxrZXIuZycsIG9wdGlvbnM9Jy10cmFjZScpCisKKyAgICAgICAgCisgICAgZGVmIHRlc3RXYWxrZXIoc2VsZik6CisgICAgICAgIGlucHV0ID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgJycnXAorICAgICAgICAgICAgY2hhciBjOworICAgICAgICAgICAgaW50IHg7CisKKyAgICAgICAgICAgIHZvaWQgYmFyKGludCB4KTsKKworICAgICAgICAgICAgaW50IGZvbyhpbnQgeSwgY2hhciBkKSB7CisgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpPWkrMSkgeworICAgICAgICAgICAgICAgIHg9MzsKKyAgICAgICAgICAgICAgICB5PTU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICcnJykKKyAgICAgICAgCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgciA9IHBhcnNlci5wcm9ncmFtKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHIudHJlZS50b1N0cmluZ1RyZWUoKSwKKyAgICAgICAgICAgICIoVkFSX0RFRiBjaGFyIGMpIChWQVJfREVGIGludCB4KSAoRlVOQ19ERUNMIChGVU5DX0hEUiB2b2lkIGJhciAoQVJHX0RFRiBpbnQgeCkpKSAoRlVOQ19ERUYgKEZVTkNfSERSIGludCBmb28gKEFSR19ERUYgaW50IHkpIChBUkdfREVGIGNoYXIgZCkpIChCTE9DSyAoVkFSX0RFRiBpbnQgaSkgKGZvciAoPSBpIDApICg8IGkgMykgKD0gaSAoKyBpIDEpKSAoQkxPQ0sgKD0geCAzKSAoPSB5IDUpKSkpKSIKKyAgICAgICAgICAgICkKKyAgICAgICAgCisgICAgICAgIG5vZGVzID0gYW50bHIzLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci50cmVlKQorICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0U3RyZWFtKQorICAgICAgICB3YWxrZXIgPSBzZWxmLmdldFdhbGtlcihub2RlcykKKyAgICAgICAgd2Fsa2VyLnByb2dyYW0oKQorCisgICAgICAgICMgRklYTUU6IG5lZWQgdG8gY3Jvc3NjaGVjayB3aXRoIEphdmEgdGFyZ2V0IChjb21waWxlIHdhbGtlciB3aXRoCisgICAgICAgICMgLXRyYWNlIG9wdGlvbiksIGlmIHRoaXMgaXMgdGhlIHJlYWwgbGlzdC4gRm9yIG5vdyBJJ20gaGFwcHkgdGhhdAorICAgICAgICAjIGl0IGRvZXMgbm90IGNyYXNoIDspCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgd2Fsa2VyLnRyYWNlcywKKyAgICAgICAgICAgIFsgJz5wcm9ncmFtJywgJz5kZWNsYXJhdGlvbicsICc+dmFyaWFibGUnLCAnPnR5cGUnLCAnPHR5cGUnLAorICAgICAgICAgICAgICAnPmRlY2xhcmF0b3InLCAnPGRlY2xhcmF0b3InLCAnPHZhcmlhYmxlJywgJzxkZWNsYXJhdGlvbicsCisgICAgICAgICAgICAgICc+ZGVjbGFyYXRpb24nLCAnPnZhcmlhYmxlJywgJz50eXBlJywgJzx0eXBlJywgJz5kZWNsYXJhdG9yJywKKyAgICAgICAgICAgICAgJzxkZWNsYXJhdG9yJywgJzx2YXJpYWJsZScsICc8ZGVjbGFyYXRpb24nLCAnPmRlY2xhcmF0aW9uJywKKyAgICAgICAgICAgICAgJz5mdW5jdGlvbkhlYWRlcicsICc+dHlwZScsICc8dHlwZScsICc+Zm9ybWFsUGFyYW1ldGVyJywKKyAgICAgICAgICAgICAgJz50eXBlJywgJzx0eXBlJywgJz5kZWNsYXJhdG9yJywgJzxkZWNsYXJhdG9yJywKKyAgICAgICAgICAgICAgJzxmb3JtYWxQYXJhbWV0ZXInLCAnPGZ1bmN0aW9uSGVhZGVyJywgJzxkZWNsYXJhdGlvbicsCisgICAgICAgICAgICAgICc+ZGVjbGFyYXRpb24nLCAnPmZ1bmN0aW9uSGVhZGVyJywgJz50eXBlJywgJzx0eXBlJywKKyAgICAgICAgICAgICAgJz5mb3JtYWxQYXJhbWV0ZXInLCAnPnR5cGUnLCAnPHR5cGUnLCAnPmRlY2xhcmF0b3InLAorICAgICAgICAgICAgICAnPGRlY2xhcmF0b3InLCAnPGZvcm1hbFBhcmFtZXRlcicsICc+Zm9ybWFsUGFyYW1ldGVyJywgJz50eXBlJywKKyAgICAgICAgICAgICAgJzx0eXBlJywgJz5kZWNsYXJhdG9yJywgJzxkZWNsYXJhdG9yJywgJzxmb3JtYWxQYXJhbWV0ZXInLAorICAgICAgICAgICAgICAnPGZ1bmN0aW9uSGVhZGVyJywgJz5ibG9jaycsICc+dmFyaWFibGUnLCAnPnR5cGUnLCAnPHR5cGUnLAorICAgICAgICAgICAgICAnPmRlY2xhcmF0b3InLCAnPGRlY2xhcmF0b3InLCAnPHZhcmlhYmxlJywgJz5zdGF0JywgJz5mb3JTdGF0JywKKyAgICAgICAgICAgICAgJz5leHByJywgJz5leHByJywgJz5hdG9tJywgJzxhdG9tJywgJzxleHByJywgJzxleHByJywgJz5leHByJywKKyAgICAgICAgICAgICAgJz5leHByJywgJz5hdG9tJywgJzxhdG9tJywgJzxleHByJywgJz5leHByJywgJz5hdG9tJywgJzxhdG9tJywKKyAgICAgICAgICAgICAgJzxleHByJywgJzxleHByJywgJz5leHByJywgJz5leHByJywgJz5leHByJywgJz5hdG9tJywgJzxhdG9tJywKKyAgICAgICAgICAgICAgJzxleHByJywgJz5leHByJywgJz5hdG9tJywgJzxhdG9tJywgJzxleHByJywgJzxleHByJywgJzxleHByJywKKyAgICAgICAgICAgICAgJz5ibG9jaycsICc+c3RhdCcsICc+ZXhwcicsICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsICc8ZXhwcicsCisgICAgICAgICAgICAgICc8ZXhwcicsICc8c3RhdCcsICc+c3RhdCcsICc+ZXhwcicsICc+ZXhwcicsICc+YXRvbScsICc8YXRvbScsCisgICAgICAgICAgICAgICc8ZXhwcicsICc8ZXhwcicsICc8c3RhdCcsICc8YmxvY2snLCAnPGZvclN0YXQnLCAnPHN0YXQnLAorICAgICAgICAgICAgICAnPGJsb2NrJywgJzxkZWNsYXJhdGlvbicsICc8cHJvZ3JhbScKKyAgICAgICAgICAgICAgXQorICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RSdWxlTGFiZWxQcm9wZXJ0eVJlZlRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCd0MDQ3dHJlZXBhcnNlcldhbGtlci5nJywgb3B0aW9ucz0nLXRyYWNlJykKKworICAgICAgICBpbnB1dCA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgICcnJ1wKKyAgICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAgICcnJykKKyAgICAgICAgCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IHNlbGYuZ2V0TGV4ZXIoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIodFN0cmVhbSkKKyAgICAgICAgciA9IHBhcnNlci52YXJpYWJsZSgpCisKKyAgICAgICAgbm9kZXMgPSBhbnRscjMudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbShyLnRyZWUpCisgICAgICAgIG5vZGVzLnNldFRva2VuU3RyZWFtKHRTdHJlYW0pCisgICAgICAgIHdhbGtlciA9IHNlbGYuZ2V0V2Fsa2VyKG5vZGVzKQorICAgICAgICByID0gd2Fsa2VyLnZhcmlhYmxlKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyLCAnYycpCisgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDd0cmVlcGFyc2VyV2Fsa2VyLmcgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0N3RyZWVwYXJzZXJXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUwYjNjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDd0cmVlcGFyc2VyV2Fsa2VyLmcKQEAgLTAsMCArMSw2NyBAQAordHJlZSBncmFtbWFyIHQwNDd0cmVlcGFyc2VyV2Fsa2VyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgIHRva2VuVm9jYWI9dDA0N3RyZWVwYXJzZXI7CisgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7Cit9CisKK3Byb2dyYW0KKyAgICA6ICAgZGVjbGFyYXRpb24rCisgICAgOworCitkZWNsYXJhdGlvbgorICAgIDogICB2YXJpYWJsZQorICAgIHwgICBeKEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlcikKKyAgICB8ICAgXihGVU5DX0RFRiBmdW5jdGlvbkhlYWRlciBibG9jaykKKyAgICA7CisKK3ZhcmlhYmxlIHJldHVybnMgW3Jlc10KKyAgICA6ICAgXihWQVJfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICAgICAgeyAKKyAgICAgICAgICAgICRyZXMgPSAkZGVjbGFyYXRvci50ZXh0OyAKKyAgICAgICAgfQorICAgIDsKKworZGVjbGFyYXRvcgorICAgIDogICBJRCAKKyAgICA7CisKK2Z1bmN0aW9uSGVhZGVyCisgICAgOiAgIF4oRlVOQ19IRFIgdHlwZSBJRCBmb3JtYWxQYXJhbWV0ZXIrKQorICAgIDsKKworZm9ybWFsUGFyYW1ldGVyCisgICAgOiAgIF4oQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IpCisgICAgOworCit0eXBlCisgICAgOiAgICdpbnQnCisgICAgfCAgICdjaGFyJworICAgIHwgICAndm9pZCcKKyAgICB8ICAgSUQgICAgICAgIAorICAgIDsKKworYmxvY2sKKyAgICA6ICAgXihCTE9DSyB2YXJpYWJsZSogc3RhdCopCisgICAgOworCitzdGF0OiBmb3JTdGF0CisgICAgfCBleHByCisgICAgfCBibG9jaworICAgIDsKKworZm9yU3RhdAorICAgIDogICBeKCdmb3InIGV4cHIgZXhwciBleHByIGJsb2NrKQorICAgIDsKKworZXhwcjogICBeKEVRRVEgZXhwciBleHByKQorICAgIHwgICBeKExUIGV4cHIgZXhwcikKKyAgICB8ICAgXihQTFVTIGV4cHIgZXhwcikKKyAgICB8ICAgXihFUSBJRCBleHByKQorICAgIHwgICBhdG9tCisgICAgOworCithdG9tCisgICAgOiBJRCAgICAgIAorICAgIHwgSU5UICAgICAgCisgICAgOyAKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ4cmV3cml0ZS5nIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDhyZXdyaXRlLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwM2I4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ4cmV3cml0ZS5nCkBAIC0wLDAgKzEsOSBAQAorbGV4ZXIgZ3JhbW1hciB0MDQ4cmV3cml0ZTsKK29wdGlvbnMgeworICAgIGxhbmd1YWdlPVB5dGhvbjsKK30KKworQTogJ2EnOworQjogJ2InOworQzogJ2MnOworCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0OHJld3JpdGUucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0OHJld3JpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1YmY4NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ4cmV3cml0ZS5weQpAQCAtMCwwICsxLDQ5MCBAQAorIiIiVGVzdHN1aXRlIGZvciBUb2tlblJld3JpdGVTdHJlYW0gY2xhc3MuIiIiCisKKyMgZG9uJ3QgY2FyZSBhYm91dCBkb2NzdHJpbmdzCisjIHB5bGludDogZGlzYWJsZS1tc2c9QzAxMTEKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgYW50bHIzCitpbXBvcnQgdGVzdGJhc2UKKworY2xhc3MgVDEodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29tcGlsZUdyYW1tYXIoKQorCisKKyAgICBkZWYgX3BhcnNlKHNlbGYsIGlucHV0KToKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgIGxleGVyID0gc2VsZi5nZXRMZXhlcihjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLlRva2VuUmV3cml0ZVN0cmVhbShsZXhlcikKKyAgICAgICAgdFN0cmVhbS5maWxsQnVmZmVyKCkKKworICAgICAgICByZXR1cm4gdFN0cmVhbQorCisKKyAgICBkZWYgdGVzdEluc2VydEJlZm9yZUluZGV4MChzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwgIjAiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICIwYWJjIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3RJbnNlcnRBZnRlckxhc3RJbmRleChzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcigyLCAieCIpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImFiY3giCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdDJJbnNlcnRCZWZvcmVBZnRlck1pZGRsZUluZGV4KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieCIpCisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcigxLCAieCIpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImF4YnhjIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3RSZXBsYWNlSW5kZXgwKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCwgIngiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJ4YmMiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VMYXN0SW5kZXgoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCAieCIpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImFieCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBleHBlY3RpbmcpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZU1pZGRsZUluZGV4KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMSwgIngiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJheGMiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdDJSZXBsYWNlTWlkZGxlSW5kZXgoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCAieCIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsICJ5IikKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAiYXljIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3QyUmVwbGFjZU1pZGRsZUluZGV4MUluc2VydEJlZm9yZShzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwgIl8iKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCAieCIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsICJ5IikKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAiX2F5YyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZVRoZW5EZWxldGVNaWRkbGVJbmRleChzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsICJ4IikKKyAgICAgICAgdG9rZW5zLmRlbGV0ZSgxKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBleHBlY3RpbmcpCisKKworICAgIGRlZiB0ZXN0SW5zZXJ0SW5QcmlvclJlcGxhY2Uoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgwLCAyLCAieCIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMSwgIjAiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgICAgIHN0cihleGMpLAorICAgICAgICAgICAgICAgICJpbnNlcnQgb3AgPEluc2VydEJlZm9yZU9wQDE6XCIwXCI+IHdpdGhpbiBib3VuZGFyaWVzIG9mICIKKyAgICAgICAgICAgICAgICAicHJldmlvdXMgPFJlcGxhY2VPcEAwLi4yOlwieFwiPiIKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdEluc2VydFRoZW5SZXBsYWNlU2FtZUluZGV4KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCAiMCIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDAsICJ4IikgICMgc3VwZXJjZWRlcyBpbnNlcnQgYXQgMAorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICIweGJjIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3QySW5zZXJ0TWlkZGxlSW5kZXgoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICJ4IikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieSIpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImF5eGJjIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3QySW5zZXJ0VGhlblJlcGxhY2VJbmRleDAoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICJ4IikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCAieSIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDAsICJ6IikKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAieXh6YmMiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VUaGVuSW5zZXJ0QmVmb3JlTGFzdEluZGV4KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwgIngiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDIsICJ5IikKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAiYWJ5eCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBleHBlY3RpbmcpCisKKworICAgIGRlZiB0ZXN0SW5zZXJ0VGhlblJlcGxhY2VMYXN0SW5kZXgoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDIsICJ5IikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwgIngiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYnl4IgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3RSZXBsYWNlVGhlbkluc2VydEFmdGVyTGFzdEluZGV4KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwgIngiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoMiwgInkiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYnh5IgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3RSZXBsYWNlUmFuZ2VUaGVuSW5zZXJ0QXRMZWZ0RWRnZShzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiY2NjYmEiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCA0LCAieCIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMiwgInkiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYnl4YmEiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VSYW5nZVRoZW5JbnNlcnRBdFJpZ2h0RWRnZShzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiY2NjYmEiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCA0LCAieCIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoNCwgInkiKSAjIG5vIGVmZmVjdDsgd2l0aGluIHJhbmdlIG9mIGEgcmVwbGFjZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2Vucy50b1N0cmluZygpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICAgICAgc3RyKGV4YyksCisgICAgICAgICAgICAgICAgImluc2VydCBvcCA8SW5zZXJ0QmVmb3JlT3BANDpcInlcIj4gd2l0aGluIGJvdW5kYXJpZXMgb2YgIgorICAgICAgICAgICAgICAgICJwcmV2aW91cyA8UmVwbGFjZU9wQDIuLjQ6XCJ4XCI+IikKKworCisgICAgZGVmIHRlc3RSZXBsYWNlUmFuZ2VUaGVuSW5zZXJ0QWZ0ZXJSaWdodEVkZ2Uoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmNjY2JhIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwgNCwgIngiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoNCwgInkiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYnh5YmEiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VBbGwoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmNjY2JhIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCwgNiwgIngiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJ4IgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIGV4cGVjdGluZykKKworCisgICAgZGVmIHRlc3RSZXBsYWNlU3Vic2V0VGhlbkZldGNoKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjY2NiYSIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDIsIDQsICJ4eXoiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygwLCA2KQorICAgICAgICBleHBlY3RpbmcgPSAiYWJ4eXpiYSIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBleHBlY3RpbmcpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZVRoZW5SZXBsYWNlU3VwZXJzZXQoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmNjY2JhIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMiwgNCwgInh5eiIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDMsIDUsICJmb28iKSAjIG92ZXJsYXBzLCBlcnJvcgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRva2Vucy50b1N0cmluZygpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICAgICAgc3RyKGV4YyksCisgICAgICAgICAgICAgICAgInJlcGxhY2Ugb3AgYm91bmRhcmllcyBvZiA8UmVwbGFjZU9wQDMuLjU6XCJmb29cIj4gb3ZlcmxhcCAiCisgICAgICAgICAgICAgICAgIndpdGggcHJldmlvdXMgPFJlcGxhY2VPcEAyLi40OlwieHl6XCI+IikKKworCisgICAgZGVmIHRlc3RSZXBsYWNlVGhlblJlcGxhY2VMb3dlckluZGV4ZWRTdXBlcnNldChzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiY2NjYmEiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCA0LCAieHl6IikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMSwgMywgImZvbyIpICMgb3ZlcmxhcCwgZXJyb3IKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgICAgIHN0cihleGMpLAorICAgICAgICAgICAgICAgICJyZXBsYWNlIG9wIGJvdW5kYXJpZXMgb2YgPFJlcGxhY2VPcEAxLi4zOlwiZm9vXCI+IG92ZXJsYXAgIgorICAgICAgICAgICAgICAgICJ3aXRoIHByZXZpb3VzIDxSZXBsYWNlT3BAMi4uNDpcInh5elwiPiIpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZVNpbmdsZU1pZGRsZVRoZW5PdmVybGFwcGluZ1N1cGVyc2V0KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjYmEiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCAyLCAieHl6IikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCwgMywgImZvbyIpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImZvb2EiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgZXhwZWN0aW5nKQorCisKKyAgICBkZWYgdGVzdENvbWJpbmVJbnNlcnRzKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCAieCIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwgInkiKQorICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAieXhhYmMiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKKyAgICBkZWYgdGVzdENvbWJpbmUzSW5zZXJ0cyhzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMSwgIngiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICJ5IikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieiIpCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJ5YXp4YmMiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKKyAgICBkZWYgdGVzdENvbWJpbmVJbnNlcnRPbkxlZnRXaXRoUmVwbGFjZShzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDAsIDIsICJmb28iKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICJ6IikgIyBjb21iaW5lIHdpdGggbGVmdCBlZGdlIG9mIHJld3JpdGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gInpmb28iCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKKyAgICBkZWYgdGVzdENvbWJpbmVJbnNlcnRPbkxlZnRXaXRoRGVsZXRlKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLmRlbGV0ZSgwLCAyKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICJ6IikgIyBjb21iaW5lIHdpdGggbGVmdCBlZGdlIG9mIHJld3JpdGUKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gInoiICMgbWFrZSBzdXJlIGNvbWJvIGlzIG5vdCB6bnVsbAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworCisgICAgZGVmIHRlc3REaXNqb2ludEluc2VydHMoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmMiKQorICAgICAgICB0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICJ4IikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgyLCAieSIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMCwgInoiKQorICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAiemF4YnljIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworCisgICAgZGVmIHRlc3RPdmVybGFwcGluZ1JlcGxhY2Uoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmNjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMSwgMiwgImZvbyIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDAsIDMsICJiYXIiKSAjIHdpcGVzIHByaW9yIG5lc3RlZCByZXBsYWNlCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKKyAgICBkZWYgdGVzdE92ZXJsYXBwaW5nUmVwbGFjZTIoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmNjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCwgMywgImJhciIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsIDIsICJmb28iKSAjIGNhbm5vdCBzcGxpdCBlYXJsaWVyIHJlcGxhY2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICAgICAgICAgIHN0cihleGMpLAorICAgICAgICAgICAgICAgICJyZXBsYWNlIG9wIGJvdW5kYXJpZXMgb2YgPFJlcGxhY2VPcEAxLi4yOlwiZm9vXCI+IG92ZXJsYXAgIgorICAgICAgICAgICAgICAgICJ3aXRoIHByZXZpb3VzIDxSZXBsYWNlT3BAMC4uMzpcImJhclwiPiIpCisKKworICAgIGRlZiB0ZXN0T3ZlcmxhcHBpbmdSZXBsYWNlMyhzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiY2MiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCAyLCAiZm9vIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMCwgMiwgImJhciIpICMgd2lwZXMgcHJpb3IgbmVzdGVkIHJlcGxhY2UKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImJhcmMiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKKyAgICBkZWYgdGVzdE92ZXJsYXBwaW5nUmVwbGFjZTQoc2VsZik6CisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJhYmNjIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMSwgMiwgImZvbyIpCisgICAgICAgIHRva2Vucy5yZXBsYWNlKDEsIDMsICJiYXIiKSAjIHdpcGVzIHByaW9yIG5lc3RlZCByZXBsYWNlCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYmFyIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworCisgICAgZGVmIHRlc3REcm9wSWRlbnRpY2FsUmVwbGFjZShzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiY2MiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCAyLCAiZm9vIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMSwgMiwgImZvbyIpICMgZHJvcCBwcmV2aW91cywgaWRlbnRpY2FsCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhZm9vYyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKworICAgIGRlZiB0ZXN0RHJvcFByZXZDb3ZlcmVkSW5zZXJ0KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjIikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgxLCAiZm9vIikKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoMSwgMiwgImZvbyIpICMga2lsbCBwcmV2IGluc2VydAorICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAiYWZvb2ZvbyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKworICAgIGRlZiB0ZXN0TGVhdmVBbG9uZURpc2pvaW50SW5zZXJ0KHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZSgiYWJjYyIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMSwgIngiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCAzLCAiZm9vIikKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImF4YmZvbyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKworICAgIGRlZiB0ZXN0TGVhdmVBbG9uZURpc2pvaW50SW5zZXJ0MihzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiY2MiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSgyLCAzLCAiZm9vIikKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieCIpCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJheGJmb28iCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKKyAgICBkZWYgdGVzdEluc2VydEJlZm9yZVRva2VuVGhlbkRlbGV0ZVRoYXRUb2tlbihzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoImFiYyIpCisgICAgICAgIHRva2Vucy5pbnNlcnRCZWZvcmUoMiwgInkiKQorICAgICAgICB0b2tlbnMuZGVsZXRlKDIpCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJhYnkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisKK2NsYXNzIFQyKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVHcmFtbWFyKCd0MDQ4cmV3cml0ZTIuZycpCisKKworICAgIGRlZiBfcGFyc2Uoc2VsZiwgaW5wdXQpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuVG9rZW5SZXdyaXRlU3RyZWFtKGxleGVyKQorICAgICAgICB0U3RyZWFtLmZpbGxCdWZmZXIoKQorCisgICAgICAgIHJldHVybiB0U3RyZWFtCisKKworICAgIGRlZiB0ZXN0VG9TdHJpbmdTdGFydFN0b3Aoc2VsZik6CisgICAgICAgICMgVG9rZW5zOiAwMTIzNDU2Nzg5CisgICAgICAgICMgSW5wdXQ6ICB4ID0gMyAqIDAKKyAgICAgICAgdG9rZW5zID0gc2VsZi5fcGFyc2UoInggPSAzICogMDsiKQorICAgICAgICB0b2tlbnMucmVwbGFjZSg0LCA4LCAiMCIpICMgcmVwbGFjZSAzICogMCB3aXRoIDAKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9PcmlnaW5hbFN0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJ4ID0gMyAqIDA7IgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKQorICAgICAgICBleHBlY3RpbmcgPSAieCA9IDA7IgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoMCwgOSkKKyAgICAgICAgZXhwZWN0aW5nID0gInggPSAwOyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDQsIDgpCisgICAgICAgIGV4cGVjdGluZyA9ICIwIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworCisgICAgZGVmIHRlc3RUb1N0cmluZ1N0YXJ0U3RvcDIoc2VsZik6CisgICAgICAgICMgVG9rZW5zOiAwMTIzNDU2Nzg5MDEyMzQ1NjcKKyAgICAgICAgIyBJbnB1dDogIHggPSAzICogMCArIDIgKiAwCisgICAgICAgIHRva2VucyA9IHNlbGYuX3BhcnNlKCJ4ID0gMyAqIDAgKyAyICogMDsiKQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b09yaWdpbmFsU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0aW5nID0gInggPSAzICogMCArIDIgKiAwOyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKyAgICAgICAgdG9rZW5zLnJlcGxhY2UoNCwgOCwgIjAiKSAjIHJlcGxhY2UgMyAqIDAgd2l0aCAwCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpCisgICAgICAgIGV4cGVjdGluZyA9ICJ4ID0gMCArIDIgKiAwOyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDAsIDE3KQorICAgICAgICBleHBlY3RpbmcgPSAieCA9IDAgKyAyICogMDsiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZyg0LCA4KQorICAgICAgICBleHBlY3RpbmcgPSAiMCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDAsIDgpCisgICAgICAgIGV4cGVjdGluZyA9ICJ4ID0gMCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDEyLCAxNikKKyAgICAgICAgZXhwZWN0aW5nID0gIjIgKiAwIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHJlc3VsdCkKKworICAgICAgICB0b2tlbnMuaW5zZXJ0QWZ0ZXIoMTcsICIvLyBjb21tZW50IikKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDEyLCAxOCkKKyAgICAgICAgZXhwZWN0aW5nID0gIjIgKiAwOy8vIGNvbW1lbnQiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgcmVzdWx0KQorCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygwLCA4KSAjIHRyeSBhZ2FpbiBhZnRlciBpbnNlcnQgYXQgZW5kCisgICAgICAgIGV4cGVjdGluZyA9ICJ4ID0gMCIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCByZXN1bHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ4cmV3cml0ZTIuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDQ4cmV3cml0ZTIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTgyNTFjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDhyZXdyaXRlMi5nCkBAIC0wLDAgKzEsMTIgQEAKK2xleGVyIGdyYW1tYXIgdDA0OHJld3JpdGUyOworb3B0aW9ucyB7CisgICAgbGFuZ3VhZ2U9UHl0aG9uOworfQorCitJRCA6ICdhJy4uJ3onKzsKK0lOVCA6ICcwJy4uJzknKzsKK1NFTUkgOiAnOyc7CitQTFVTIDogJysnOworTVVMIDogJyonOworQVNTSUdOIDogJz0nOworV1MgOiAnICcrOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDl0cmVlcGFyc2VyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNDl0cmVlcGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzE1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA0OXRyZWVwYXJzZXIucHkKQEAgLTAsMCArMSw0OTkgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgYW50bHIzCitpbXBvcnQgYW50bHIzLnRyZWUKK2ltcG9ydCB0ZXN0YmFzZQorCitjbGFzcyBUKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHdhbGtlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUV2Fsa2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgPSAiIgorCisKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCArPSB0CisKKworICAgICAgICAgICAgZGVmIHRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc+JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc8JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIFRXYWxrZXIKKyAgICAKKworICAgIGRlZiBleGVjVHJlZVBhcnNlcihzZWxmLCBncmFtbWFyLCBncmFtbWFyRW50cnksIHRyZWVHcmFtbWFyLCB0cmVlRW50cnksIGlucHV0KToKKyAgICAgICAgbGV4ZXJDbHMsIHBhcnNlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hcikKKyAgICAgICAgd2Fsa2VyQ2xzID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcih0cmVlR3JhbW1hcikKKworICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBsZXhlckNscyhjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBwYXJzZXJDbHModFN0cmVhbSkKKyAgICAgICAgciA9IGdldGF0dHIocGFyc2VyLCBncmFtbWFyRW50cnkpKCkKKyAgICAgICAgbm9kZXMgPSBhbnRscjMudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbShyLnRyZWUpCisgICAgICAgIG5vZGVzLnNldFRva2VuU3RyZWFtKHRTdHJlYW0pCisgICAgICAgIHdhbGtlciA9IHdhbGtlckNscyhub2RlcykKKyAgICAgICAgZ2V0YXR0cih3YWxrZXIsIHRyZWVFbnRyeSkoKQorCisgICAgICAgIHJldHVybiB3YWxrZXIuX291dHB1dAorICAgIAorCisgICAgZGVmIHRlc3RGbGF0TGlzdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJ2dyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBJTlQ7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorICAgICAgICAKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJyd0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVAorICAgICAgICAgICAge3NlbGYuY2FwdHVyZSgiXCVzLCBcJXMiIFwlICgkSUQsICRJTlQpKX0KKyAgICAgICAgICA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyAzNCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYWJjLCAzNCIsIGZvdW5kKQorICAgICAgICAKKworCisgICAgZGVmIHRlc3RTaW1wbGVUcmVlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycndHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IF4oSUQgSU5UKQorICAgICAgICAgICAgICAgIHtzZWxmLmNhcHR1cmUoc3RyKCRJRCkrIiwgIitzdHIoJElOVCkpfQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiCisgICAgICAgICAgICApCisgICAgICAgICAgICAKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImFiYywgMzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RGbGF0VnNUcmVlRGVjaXNpb24oc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogYiBjIDsKKyAgICAgICAgICAgIGIgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgICAgICAgICAgYyA6IElEIElOVDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKyAgICAgICAgCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ3RyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBiIGIgOworICAgICAgICAgICAgYiA6IElEIElOVCAgICB7c2VsZi5jYXB0dXJlKHN0cigkSUQpKyIgIitzdHIoJElOVCkrJ1xuJyl9CisgICAgICAgICAgICAgIHwgXihJRCBJTlQpIHtzZWxmLmNhcHR1cmUoIl4oIitzdHIoJElEKSsiICIrc3RyKCRJTlQpKycpJyk7fQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisgICAgICAgIAorICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImEgMSBiIDIiCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJeKGEgMSliIDJcbiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEZsYXRWc1RyZWVEZWNpc2lvbjIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogYiBjIDsKKyAgICAgICAgICAgIGIgOiBJRCBJTlQrIC0+IF4oSUQgSU5UKyk7CisgICAgICAgICAgICBjIDogSUQgSU5UKzsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ3RyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBiIGIgOworICAgICAgICAgICAgYiA6IElEIElOVCsgICAge3NlbGYuY2FwdHVyZShzdHIoJElEKSsiICIrc3RyKCRJTlQpKyJcbiIpfQorICAgICAgICAgICAgICB8IF4oeD1JRCAoeT1JTlQpKykge3NlbGYuY2FwdHVyZSgiXigiK3N0cigkeCkrJyAnK3N0cigkeSkrJyknKX0KKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSAxIDIgMyBiIDQgNSIKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIl4oYSAzKWIgNVxuIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Q3ljbGljREZBTG9va2FoZWFkKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IElEIElOVCsgUEVSSU9EOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgU0VNSSA6ICc7JyA7CisgICAgICAgICAgICBQRVJJT0QgOiAnLicgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycndHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IElEIElOVCsgUEVSSU9EIHtzZWxmLmNhcHR1cmUoImFsdCAxIil9CisgICAgICAgICAgICAgIHwgSUQgSU5UKyBTRU1JICAge3NlbGYuY2FwdHVyZSgiYWx0IDIiKX0KKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSAxIDIgMy4iCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhbHQgMSIsIGZvdW5kKQorCisKKyMjICAgICBkZWYgdGVzdFRlbXBsYXRlT3V0cHV0KHNlbGYpOgorIyMgCQlTdHJpbmcgZ3JhbW1hciA9CisjIyAJCQkiZ3JhbW1hciBUO1xuIiArCisjIyAJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyMjIAkJCSJhIDogSUQgSU5UO1xuIiArCisjIyAJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisjIyAJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisjIyAJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworIyMgCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorIyMgCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIgKworIyMgCQkJIm9wdGlvbnMge291dHB1dD10ZW1wbGF0ZTsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisjIyAJCQkicyA6IGEge1N5c3RlbS5vdXQucHJpbnRsbigkYS5zdCk7fTtcbiIgKworIyMgCQkJImEgOiBJRCBJTlQgLT4ge25ldyBTdHJpbmdUZW1wbGF0ZSgkSU5ULnRleHQpfVxuIiArCisjIyAJCQkiICA7XG4iOworCisjIyAJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyMjIAkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAzNCIpOworIyMgCQlhc3NlcnRFcXVhbHMoIjM0XG4iLCBmb3VuZCk7CisjIyAJfQorCisKKyAgICBkZWYgdGVzdE51bGxhYmxlQ2hpbGRMaXN0KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IElEIElOVD8gLT4gXihJRCBJTlQ/KTsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKyAgICAgICAgCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ3RyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBeKElEIElOVD8pCisgICAgICAgICAgICAgICAge3NlbGYuY2FwdHVyZShzdHIoJElEKSl9CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyIKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE51bGxhYmxlQ2hpbGRMaXN0MihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJydncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBJRCBJTlQ/IFNFTUkgLT4gXihJRCBJTlQ/KSBTRU1JIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFNFTUkgOiAnOycgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycndHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IF4oSUQgSU5UPykgU0VNSQorICAgICAgICAgICAgICAgIHtzZWxmLmNhcHR1cmUoc3RyKCRJRCkpfQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisgICAgICAgIAorICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYzsiCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROdWxsYWJsZUNoaWxkTGlzdDMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogeD1JRCBJTlQ/ICh5PUlEKT8gU0VNSSAtPiBeKCR4IElOVD8gJHk/KSBTRU1JIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFNFTUkgOiAnOycgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ3RyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBeKElEIElOVD8gYikgU0VNSQorICAgICAgICAgICAgICAgIHtzZWxmLmNhcHR1cmUoc3RyKCRJRCkrIiwgIitzdHIoJGIudGV4dCkpfQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICBiIDogSUQ/IDsKKyAgICAgICAgICAgICcnJykKKyAgICAgICAgCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIGRlZjsiCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmMsIGRlZiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEFjdGlvbnNBZnRlclJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogeD1JRCBJTlQ/IFNFTUkgLT4gXigkeCBJTlQ/KSA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBTRU1JIDogJzsnIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ3RyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgQGluaXQge3g9MH0gOiBeKElEIHt4PTF9IHt4PTJ9IElOVD8pCisgICAgICAgICAgICAgICAge3NlbGYuY2FwdHVyZShzdHIoJElEKSsiLCAiK3N0cih4KSl9CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYzsiCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygiYWJjLCAyXG4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZExvb2thaGVhZChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgJysnXiBJTlQ7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBTRU1JIDogJzsnIDsKKyAgICAgICAgICAgIFBFUklPRCA6ICcuJyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsgCisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IHRva2VuVm9jYWI9VDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fQorICAgICAgICAgICAgYSA6IF4oJysnIC4gSU5UKSB7IHNlbGYuY2FwdHVyZSgiYWx0IDEiKSB9CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImEgKyAyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImFsdCAxIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0V2lsZGNhcmRMb29rYWhlYWQyKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAnKydeIElOVDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFNFTUkgOiAnOycgOworICAgICAgICAgICAgUEVSSU9EIDogJy4nIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyB0b2tlblZvY2FiPVQ7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlO30KKyAgICAgICAgICAgIGEgOiBeKCcrJyAuIElOVCkgeyBzZWxmLmNhcHR1cmUoImFsdCAxIikgfQorICAgICAgICAgICAgICB8IF4oJysnIC4gLikgICB7IHNlbGYuY2FwdHVyZSgiYWx0IDIiKSB9CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICAjIEFNQklHIHVwb24gJysnIERPV04gSU5UIFVQIGV0Yy4uIGJ1dCBzbyB3aGF0LgorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSArIDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWx0IDEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZExvb2thaGVhZDMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEICcrJ14gSU5UOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgU0VNSSA6ICc7JyA7CisgICAgICAgICAgICBQRVJJT0QgOiAnLicgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IHRva2VuVm9jYWI9VDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fQorICAgICAgICAgICAgYSA6IF4oJysnIElEIElOVCkgeyBzZWxmLmNhcHR1cmUoImFsdCAxIikgfQorICAgICAgICAgICAgICB8IF4oJysnIC4gLikgICB7IHNlbGYuY2FwdHVyZSgiYWx0IDIiKSB9CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICAjIEFNQklHIHVwb24gJysnIERPV04gSU5UIFVQIGV0Yy4uIGJ1dCBzbyB3aGF0LgorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSArIDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWx0IDEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZFBsdXNMb29rYWhlYWQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEICcrJ14gSU5UOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgU0VNSSA6ICc7JyA7CisgICAgICAgICAgICBQRVJJT0QgOiAnLicgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IHRva2VuVm9jYWI9VDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fQorICAgICAgICAgICAgYSA6IF4oJysnIElOVCBJTlQgKSB7IHNlbGYuY2FwdHVyZSgiYWx0IDEiKSB9CisgICAgICAgICAgICAgIHwgXignKycgLispICAgeyBzZWxmLmNhcHR1cmUoImFsdCAyIikgfQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgIyBBTUJJRyB1cG9uICcrJyBET1dOIElOVCBVUCBldGMuLiBidXQgc28gd2hhdC4KKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImEgKyAyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImFsdCAyIiwgZm91bmQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUwZGVjb3JhdGUuZyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUwZGVjb3JhdGUuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGIxN2QxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTBkZWNvcmF0ZS5nCkBAIC0wLDAgKzEsMjkgQEAKK2dyYW1tYXIgdDA1MGRlY29yYXRlOworb3B0aW9ucyB7CisgIGxhbmd1YWdlID0gUHl0aG9uOworfQorCitAaGVhZGVyIHsKKyAgICBkZWYgbG9nbWUoZnVuYyk6CisgICAgICAgIGRlZiBkZWNvcmF0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCgnYmVmb3JlJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCgnYWZ0ZXInKQorCisgICAgICAgIHJldHVybiBkZWNvcmF0ZWQKK30KKworQHBhcnNlcjo6aW5pdCB7CitzZWxmLmV2ZW50cyA9IFtdCit9CisKK2RvY3VtZW50CitAZGVjb3JhdGUgeworICAgIEBsb2dtZQorfQorICAgIDogSURFTlRJRklFUgorICAgIDsKKworSURFTlRJRklFUjogKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTBkZWNvcmF0ZS5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUwZGVjb3JhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2Yjg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUwZGVjb3JhdGUucHkKQEAgLTAsMCArMSwyMSBAQAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgdDAxM3BhcnNlcih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlR3JhbW1hcigpCisgICAgICAgIAorICAgICAgICAKKyAgICBkZWYgdGVzdFZhbGlkKHNlbGYpOgorICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vYmFyJykKKyAgICAgICAgbGV4ZXIgPSBzZWxmLmdldExleGVyKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHNlbGYuZ2V0UGFyc2VyKHRTdHJlYW0pCisgICAgICAgIHBhcnNlci5kb2N1bWVudCgpCisKKyAgICAgICAgYXNzZXJ0IHBhcnNlci5ldmVudHMgPT0gWydiZWZvcmUnLCAnYWZ0ZXInXQorICAgICAgICAgIAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTF0cmVlUmV3cml0ZUFTVC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUxdHJlZVJld3JpdGVBU1QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyNTNiNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUxdHJlZVJld3JpdGVBU1QucHkKQEAgLTAsMCArMSwxNTkzIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IGFudGxyMworaW1wb3J0IGFudGxyMy50cmVlCitpbXBvcnQgdGVzdGJhc2UKKworY2xhc3MgVCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiB3YWxrZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFdhbGtlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGJhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKKworICAgICAgICAgICAgZGVmIHRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc+JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc8JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRXYWxrZXIKKworCisgICAgZGVmIGV4ZWNUcmVlUGFyc2VyKHNlbGYsIGdyYW1tYXIsIGdyYW1tYXJFbnRyeSwgdHJlZUdyYW1tYXIsIHRyZWVFbnRyeSwgaW5wdXQpOgorICAgICAgICBsZXhlckNscywgcGFyc2VyQ2xzID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyKQorICAgICAgICB3YWxrZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKHRyZWVHcmFtbWFyKQorCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IGxleGVyQ2xzKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHBhcnNlckNscyh0U3RyZWFtKQorICAgICAgICByID0gZ2V0YXR0cihwYXJzZXIsIGdyYW1tYXJFbnRyeSkoKQorICAgICAgICBub2RlcyA9IGFudGxyMy50cmVlLkNvbW1vblRyZWVOb2RlU3RyZWFtKHIudHJlZSkKKyAgICAgICAgbm9kZXMuc2V0VG9rZW5TdHJlYW0odFN0cmVhbSkKKyAgICAgICAgd2Fsa2VyID0gd2Fsa2VyQ2xzKG5vZGVzKQorICAgICAgICByID0gZ2V0YXR0cih3YWxrZXIsIHRyZWVFbnRyeSkoKQorCisgICAgICAgIGlmIHIudHJlZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiByLnRyZWUudG9TdHJpbmdUcmVlKCkKKworICAgICAgICByZXR1cm4gIiIKKworCisgICAgZGVmIHRlc3RGbGF0TGlzdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQxOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHRyZWUgZ3JhbW1hciBUUDE7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTsKKyAgICAgICAgfQorCisgICAgICAgIGEgOiBJRCBJTlQgLT4gSU5UIElEOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjM0IGFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFNpbXBsZVRyZWUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQyOworICAgICAgICB9CisgICAgICAgIGEgOiBeKElEIElOVCkgLT4gXihJTlQgSUQpOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIigzNCBhYmMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Q29tYmluZWRSZXdyaXRlQW5kQXV0byhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQzOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCkgfCBJTlQgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMzsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQzOworICAgICAgICB9CisgICAgICAgIGEgOiBeKElEIElOVCkgLT4gXihJTlQgSUQpIHwgSU5UOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIigzNCBhYmMpIiwgZm91bmQpCisKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgIjM0IgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIzNCIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEF2b2lkRHVwKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQNDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQ0OworICAgICAgICB9CisgICAgICAgIGEgOiBJRCAtPiBeKElEIElEKTsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoYWJjIGFiYykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RMb29wKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDU7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQrIElOVCsgLT4gKF4oSUQgSU5UKSkrIDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHRyZWUgZ3JhbW1hciBUUDU7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UNTsKKyAgICAgICAgfQorICAgICAgICBhIDogKF4oSUQgSU5UKSkrIC0+IElOVCsgSUQrOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhIGIgYyAzIDQgNSIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMyA0IDUgYSBiIGMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RBdXRvRHVwKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDY7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQNjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQ2OworICAgICAgICB9CisgICAgICAgIGEgOiBJRDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RBdXRvRHVwUnVsZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ3OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVCA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICB0cmVlIGdyYW1tYXIgVFA3OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIHRva2VuVm9jYWI9VDc7CisgICAgICAgIH0KKyAgICAgICAgYSA6IGIgYyA7CisgICAgICAgIGIgOiBJRCA7CisgICAgICAgIGMgOiBJTlQgOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhIDEiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEgMSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEF1dG9XaWxkY2FyZChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9CisgICAgICAgICAgICBhIDogSUQgLgorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpCisKKworIyAgICAgZGVmIHRlc3ROb1dpbGRjYXJkQXNSb290RXJyb3Ioc2VsZik6CisjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworIyAgICAgICAgIEVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisjID4KKyMgICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorIyAgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyMgICAgICAgICAgICAgIm9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyMgICAgICAgICAgICAgImEgOiBeKC4gSU5UKQorIyAgICAgICAgICAgICAiICA7XG4iOworIyA+CisjICAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIodHJlZUdyYW1tYXIpOworIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisjICAgICAgICAgYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKyMgICAgICAgICBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworIyAgICAgICAgIGcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworIyAgICAgICAgIGdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisjID4KKyMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMSwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworIyA+CisjICAgICAgICAgaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1dJTERDQVJEX0FTX1JPT1Q7CisjICAgICAgICAgT2JqZWN0IGV4cGVjdGVkQXJnID0gbnVsbDsKKyMgICAgICAgICBhbnRsci5SZWNvZ25pdGlvbkV4Y2VwdGlvbiBleHBlY3RlZEV4YyA9IG51bGw7CisjICAgICAgICAgR3JhbW1hclN5bnRheE1lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKyMgICAgICAgICAgICAgbmV3IEdyYW1tYXJTeW50YXhNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEV4Yyk7CisjID4KKyMgICAgICAgICBjaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyMgICAgIH0KKworICAgIGRlZiB0ZXN0QXV0b1dpbGRjYXJkMihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9CisgICAgICAgICAgICBhIDogXihJRCAuKQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGFiYyAzNCkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RBdXRvV2lsZGNhcmRXaXRoTGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fQorICAgICAgICAgICAgYSA6IElEIGM9LgorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QXV0b1dpbGRjYXJkV2l0aExpc3RMYWJlbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9CisgICAgICAgICAgICBhIDogSUQgYys9LgorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QXV0b0R1cE11bHRpcGxlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDg7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgSUQgSU5UOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQODsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQ4OworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBJRCBJTlQKKyAgICAgICAgICA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImEgYiAzIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIGIgMyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEF1dG9EdXBUcmVlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDk7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHRyZWUgZ3JhbW1hciBUUDk7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UOTsKKyAgICAgICAgfQorICAgICAgICBhIDogXihJRCBJTlQpCisgICAgICAgICAgOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhIDMiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIihhIDMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QXV0b0R1cFRyZWVXaXRoTGFiZWxzKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDEwOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCk7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICB0cmVlIGdyYW1tYXIgVFAxMDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQxMDsKKyAgICAgICAgfQorICAgICAgICBhIDogXih4PUlEIHk9SU5UKQorICAgICAgICAgIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSAzIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoYSAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEF1dG9EdXBUcmVlV2l0aExpc3RMYWJlbHMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMTE7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHRyZWUgZ3JhbW1hciBUUDExOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIHRva2VuVm9jYWI9VDExOworICAgICAgICB9CisgICAgICAgIGEgOiBeKHgrPUlEIHkrPUlOVCkKKyAgICAgICAgICA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImEgMyIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiKGEgMykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQxMjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMTI7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTI7CisgICAgICAgIH0KKyAgICAgICAgYSA6IF4oYiBJTlQpIDsKKyAgICAgICAgYiA6IElEIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSAzIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoYSAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGFiZWxzKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDEzOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCk7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICB0cmVlIGdyYW1tYXIgVFAxMzsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQxMzsKKyAgICAgICAgfQorICAgICAgICBhIDogXih4PWIgSU5UKSA7CisgICAgICAgIGIgOiBJRCA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImEgMyIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiKGEgMykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExpc3RMYWJlbHMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMTQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHRyZWUgZ3JhbW1hciBUUDE0OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIHRva2VuVm9jYWI9VDE0OworICAgICAgICB9CisgICAgICAgIGEgOiBeKHgrPWIgeSs9YykgOworICAgICAgICBiIDogSUQgOworICAgICAgICBjIDogSU5UIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSAzIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoYSAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEF1dG9EdXBOZXN0ZWRUcmVlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDE1OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IHg9SUQgeT1JRCBJTlQgLT4gXigkeCBeKCR5IElOVCkpOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMTU7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTU7CisgICAgICAgIH0KKyAgICAgICAgYSA6IF4oSUQgXihJRCBJTlQpKQorICAgICAgICAgIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYSBiIDMiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIihhIChiIDMpKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdERlbGV0ZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQxNjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICB0cmVlIGdyYW1tYXIgVFAxNjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQxNjsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgLT4KKyAgICAgICAgICA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiIiwgZm91bmQpCisKKyAgICBkZWYgdGVzdFNldE1hdGNoTm9SZXdyaXRlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogSUQgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICAgICAgdG9rZW5Wb2NhYj1UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IGIgSU5UOworICAgICAgICAgICAgYiA6IElEIHwgSU5UOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIDM0IgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmMgMzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTZXRPcHRpb25hbE1hdGNoTm9SZXdyaXRlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogSUQgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICAgICAgdG9rZW5Wb2NhYj1UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IChJRHxJTlQpPyBJTlQgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIDM0IikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYWJjIDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiB4PUlEIElOVCAtPiBeKCR4IElOVCk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgICAgIHRva2VuVm9jYWI9VDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBeKElEIChJRCB8IElOVCkgKSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMgMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIihhYmMgMzQpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDJSb290KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogeD1JRCBJTlQgLT4gXigkeCBJTlQpOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgICAgICB0b2tlblZvY2FiPVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogXigoSUQgfCBJTlQpIElOVCkgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIDM0IgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoYWJjIDM0KSIsIGZvdW5kKQorCisKKyAgICAjIyBSRVdSSVRFIE1PREUKKworICAgIGRlZiB0ZXN0UmV3cml0ZU1vZGVDb21iaW5lZFJld3JpdGVBbmRBdXRvKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDE3OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCkgfCBJTlQgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMTc7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTc7CisgICAgICAgICAgICByZXdyaXRlPXRydWU7CisgICAgICAgIH0KKyAgICAgICAgYSA6IF4oSUQgSU5UKSAtPiBeKElEWyJpY2siXSBJTlQpCisgICAgICAgICAgfCBJTlQgLy8gbGVhdmVzIGl0IGFsb25lLCByZXR1cm5pbmcgJGEuc3RhcnQKKyAgICAgICAgICA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyAzNCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiKGljayAzNCkiLCBmb3VuZCkKKworCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV3cml0ZU1vZGVGbGF0VHJlZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDE4OworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gSUQgSU5UIHwgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQMTg7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTg7CisgICAgICAgICAgICAgIHJld3JpdGU9dHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgOiBJRCBhIDsKKyAgICAgICAgICAgIGEgOiBJTlQgLT4gSU5UWyIxIl0KKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYWJjIDM0IgorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlTW9kZUNoYWluUnVsZUZsYXRUcmVlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gSUQgSU5UIHwgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fQorICAgICAgICAgICAgcyA6IGEgOworICAgICAgICAgICAgYSA6IGIgOworICAgICAgICAgICAgYiA6IElEIElOVCAtPiBJTlQgSUQKKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYWJjIDM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjM0IGFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO30KKyAgICAgICAgICAgIHMgOiBhIDsKKyAgICAgICAgICAgIGEgOiBiIDsgLy8gYS50cmVlIG11c3QgYmVjb21lIGIudHJlZQorICAgICAgICAgICAgYiA6IF4oSUQgSU5UKSAtPiBJTlQKKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYWJjIDM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO30KKyAgICAgICAgICAgIHRva2VucyB7IFg7IH0KKyAgICAgICAgICAgIHMgOiBhKiBiIDsgLy8gb25seSBiIGNvbnRyaWJ1dGVzIHRvIHRyZWUsIGJ1dCBpdCdzIGFmdGVyIGEqOyBzLnRyZWUgPSBiLnRyZWUKKyAgICAgICAgICAgIGEgOiBYIDsKKyAgICAgICAgICAgIGIgOiBeKElEIElOVCkgLT4gSU5UCisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIzNCIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6ICdib28nIElEIElOVCAtPiAnYm9vJyBeKElEIElOVCkgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9CisgICAgICAgICAgICB0b2tlbnMgeyBYOyB9CisgICAgICAgICAgICBzIDogJ2JvbycgYSogYiA7IC8vIGRvbid0IHJlc2V0IHMudHJlZSB0byBiLnRyZWUgZHVlIHRvICdib28nCisgICAgICAgICAgICBhIDogWCA7CisgICAgICAgICAgICBiIDogXihJRCBJTlQpIC0+IElOVAorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICJib28gYWJjIDM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImJvbyAzNCIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6ICdib28nIElEIElOVCAtPiBeKCdib28nIF4oSUQgSU5UKSkgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9CisgICAgICAgICAgICB0b2tlbnMgeyBYOyB9CisgICAgICAgICAgICBzIDogXignYm9vJyBhKiBiKSA7IC8vIGRvbid0IHJlc2V0IHMudHJlZSB0byBiLnRyZWUgZHVlIHRvICdib28nCisgICAgICAgICAgICBhIDogWCA7CisgICAgICAgICAgICBiIDogXihJRCBJTlQpIC0+IElOVAorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICJib28gYWJjIDM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihib28gMzQpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2JvbycgSUQgSU5UIC0+IF4oJ2JvbycgXihJRCBJTlQpKSA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO30KKyAgICAgICAgICAgIHRva2VucyB7IFg7IH0KKyAgICAgICAgICAgIHMgOiBeKGEgYikgOyAvLyBzLnRyZWUgaXMgYS50cmVlCisgICAgICAgICAgICBhIDogJ2JvbycgOworICAgICAgICAgICAgYiA6IF4oSUQgSU5UKSAtPiBJTlQKKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYm9vIGFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoYm9vIDM0KSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVPZlJ1bGVSZWYoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIElOVCAtPiBJRCBJTlQgfCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9CisgICAgICAgICAgICBzIDogYSAtPiBhIDsKKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gSUQgSU5UIDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAzNCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmMgMzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlT2ZSdWxlUmVmUm9vdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIElOVCAtPiBeKElOVCBeKElEIElOVCkpOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9CisgICAgICAgICAgICBzIDogXihhIF4oSUQgSU5UKSkgLT4gYSA7CisgICAgICAgICAgICBhIDogSU5UIDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAxMiAzNCIpCisgICAgICAgICMgZW1pdHMgd2hvbGUgdHJlZSB3aGVuIHlvdSByZWYgdGhlIHJvb3Qgc2luY2UgSSBjYW4ndCBrbm93IHdoZXRoZXIKKyAgICAgICAgIyB5b3Ugd2FudCB0aGUgY2hpbGRyZW4gb3Igbm90LiAgWW91IG1pZ2h0IGJlIHJldHVybmluZyBhIHdob2xlIG5ldworICAgICAgICAjIHRyZWUuICBIbW0uLi5zdGlsbCBzZWVtcyB3ZWlyZC4gIG9oIHdlbGwuCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoMTIgKGFiYyAzNCkpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV3cml0ZU9mUnVsZVJlZlJvb3RMYWJlbGVkKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgSU5UIC0+IF4oSU5UIF4oSUQgSU5UKSk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO30KKyAgICAgICAgICAgIHMgOiBeKGxhYmVsPWEgXihJRCBJTlQpKSAtPiBhIDsKKyAgICAgICAgICAgIGEgOiBJTlQgOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYWJjIDEyIDM0IikKKyAgICAgICAgIyBlbWl0cyB3aG9sZSB0cmVlIHdoZW4geW91IHJlZiB0aGUgcm9vdCBzaW5jZSBJIGNhbid0IGtub3cgd2hldGhlcgorICAgICAgICAjIHlvdSB3YW50IHRoZSBjaGlsZHJlbiBvciBub3QuICBZb3UgbWlnaHQgYmUgcmV0dXJuaW5nIGEgd2hvbGUgbmV3CisgICAgICAgICMgdHJlZS4gIEhtbS4uLnN0aWxsIHNlZW1zIHdlaXJkLiAgb2ggd2VsbC4KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIigxMiAoYWJjIDM0KSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlT2ZSdWxlUmVmUm9vdExpc3RMYWJlbGVkKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgSU5UIC0+IF4oSU5UIF4oSUQgSU5UKSk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO30KKyAgICAgICAgICAgIHMgOiBeKGxhYmVsKz1hIF4oSUQgSU5UKSkgLT4gYSA7CisgICAgICAgICAgICBhIDogSU5UIDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAxMiAzNCIpCisgICAgICAgICMgZW1pdHMgd2hvbGUgdHJlZSB3aGVuIHlvdSByZWYgdGhlIHJvb3Qgc2luY2UgSSBjYW4ndCBrbm93IHdoZXRoZXIKKyAgICAgICAgIyB5b3Ugd2FudCB0aGUgY2hpbGRyZW4gb3Igbm90LiAgWW91IG1pZ2h0IGJlIHJldHVybmluZyBhIHdob2xlIG5ldworICAgICAgICAjIHRyZWUuICBIbW0uLi5zdGlsbCBzZWVtcyB3ZWlyZC4gIG9oIHdlbGwuCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoMTIgKGFiYyAzNCkpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV3cml0ZU9mUnVsZVJlZkNoaWxkKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJRCBeKElOVCBJTlQpKTsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fQorICAgICAgICAgICAgcyA6IF4oSUQgYSkgLT4gYSA7CisgICAgICAgICAgICBhIDogXihJTlQgSU5UKSA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICJhYmMgMzQiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiKDM0IDM0KSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVPZlJ1bGVSZWZMYWJlbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgXihJTlQgSU5UKSk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiIKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO30KKyAgICAgICAgICAgIHMgOiBeKElEIGxhYmVsPWEpIC0+IGEgOworICAgICAgICAgICAgYSA6IF4oSU5UIElOVCkgOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYWJjIDM0IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIigzNCAzNCkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlT2ZSdWxlUmVmTGlzdExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJRCBeKElOVCBJTlQpKTsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fQorICAgICAgICAgICAgcyA6IF4oSUQgbGFiZWwrPWEpIC0+IGEgOworICAgICAgICAgICAgYSA6IF4oSU5UIElOVCkgOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAncycsCisgICAgICAgICAgICAiYWJjIDM0IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIigzNCAzNCkiLCBmb3VuZCkKKworCisKKyAgICBkZWYgdGVzdFJld3JpdGVNb2RlV2l0aFByZWRpY2F0ZWRSZXdyaXRlcyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDE5OworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJRFsicm9vdCJdIF4oSUQgSU5UKSkgfCBJTlQgLT4gXihJRFsicm9vdCJdIElOVCkgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFAxOTsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgICB0b2tlblZvY2FiPVQxOTsKKyAgICAgICAgICAgICAgcmV3cml0ZT10cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA6IF4oSUQgYSkgeyBzZWxmLmJ1ZiArPSAkcy5zdGFydC50b1N0cmluZ1RyZWUoKSB9OworICAgICAgICAgICAgYSA6IF4oSUQgSU5UKSAtPiB7VHJ1ZX0/IF4oSURbImljayJdIElOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gSU5UCisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAzNCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiKHJvb3QgKGljayAzNCkpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0V2lsZGNhcmRTaW5nbGVOb2RlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IF4oSURbInJvb3QiXSBJTlQpOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgICAgICB0b2tlblZvY2FiPVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzIDogXihJRCBjPS4pIC0+ICRjCisgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICJhYmMgMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjM0IiwgZm91bmQpCisKKyAgICBkZWYgdGVzdFdpbGRjYXJkVW5sYWJlbGVkU2luZ2xlTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO30KKyAgICAgICAgICAgIHMgOiBeKElEIC4pIC0+IElECisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZEdyYWJzU3VidHJlZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgeD1JTlQgeT1JTlQgej1JTlQgLT4gXihJRFtcInJvb3RcIl0gXigkeCAkeSAkeikpOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICB0cmVlIGdyYW1tYXIgVFA7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fQorICAgICAgICAgICAgcyA6IF4oSUQgYz0uKSAtPiAkYworICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICJhYmMgMSAyIDMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKDEgMiAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFdpbGRjYXJkR3JhYnNTdWJ0cmVlMihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgeD1JTlQgeT1JTlQgej1JTlQgLT4gSUQgXigkeCAkeSAkeik7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9CisgICAgICAgICAgICBzIDogSUQgYz0uIC0+ICRjCisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ3MnLAorICAgICAgICAgICAgImFiYyAxIDIgMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoMSAyIDMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0V2lsZGNhcmRMaXN0TGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247IG91dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElOVCBJTlQgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO30KKyAgICAgICAgICAgIHMgOiAoYys9LikrIC0+ICRjKworICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICIxIDIgMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIxIDIgMyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFdpbGRjYXJkTGlzdExhYmVsMihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fQorICAgICAgICAgICAgYSAgOiB4PUlOVCB5PUlOVCB6PUlOVCAtPiBeKCR4IF4oJHkgJHopIF4oJHkgJHopKTsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uOyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fQorICAgICAgICAgICAgcyA6IF4oSU5UIChjKz0uKSspIC0+ICRjKworICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdzJywKKyAgICAgICAgICAgICIxIDIgMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoMiAzKSAoMiAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJ1bGVSZXN1bHRBc1Jvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBJRCAnPScgSU5UIC0+IF4oJz0nIElEIElOVCk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBDT0xPTiA6ICc6JyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIHRyZWUgZ3JhbW1hciBUUDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgICAgIHJld3JpdGU9dHJ1ZTsKKyAgICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgICAgICB0b2tlblZvY2FiPVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogXihlcSBlMT1JRCBlMj0uKSAtPiBeKGVxICRlMiAkZTEpIDsKKyAgICAgICAgICAgIGVxIDogJz0nIHwgJzonIHtwYXNzfSA7ICAvLyBidWcgaW4gc2V0IG1hdGNoLCBkb2Vzbid0IGFkZCB0byB0cmVlISEgYm9vaC4gZm9yY2Ugbm9uc2V0LgorICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjID0gMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKD0gMzQgYWJjKSIsIGZvdW5kKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1MmltcG9ydC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUyaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjQ0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1MmltcG9ydC5weQpAQCAtMCwwICsxLDEyMDMgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgYW50bHIzCitpbXBvcnQgYW50bHIzLnRyZWUKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHN5cworCitjbGFzcyBUKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9sZFBhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2VsZi5iYXNlRGlyKQorCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wYXRoID0gc2VsZi5vbGRQYXRoCisKKworICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVFBhcnNlcihiYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGJhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ID0gIiIKKworCisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgKz0gdAorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZUluKHNlbGYsIHJ1bGVOYW1lLCBydWxlSW5kZXgpOgorICAgICAgICAgICAgICAgIHNlbGYudHJhY2VzLmFwcGVuZCgnPicrcnVsZU5hbWUpCisKKworICAgICAgICAgICAgZGVmIHRyYWNlT3V0KHNlbGYsIHJ1bGVOYW1lLCBydWxlSW5kZXgpOgorICAgICAgICAgICAgICAgIHNlbGYudHJhY2VzLmFwcGVuZCgnPCcrcnVsZU5hbWUpCisKKworICAgICAgICAgICAgZGVmIHJlY292ZXIoc2VsZiwgaW5wdXQsIHJlKToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUUGFyc2VyCisKKworICAgIGRlZiBsZXhlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUTGV4ZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBiYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9ICIiCisKKworICAgICAgICAgICAgZGVmIGNhcHR1cmUoc2VsZiwgdCk6CisgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ICs9IHQKKworCisgICAgICAgICAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJz4nK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJzwnK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0KToKKyAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHJldHVybiBUTGV4ZXIKKworCisgICAgZGVmIGV4ZWNQYXJzZXIoc2VsZiwgZ3JhbW1hciwgZ3JhbW1hckVudHJ5LCBzbGF2ZXMsIGlucHV0KToKKyAgICAgICAgZm9yIHNsYXZlIGluIHNsYXZlczoKKyAgICAgICAgICAgIHBhcnNlck5hbWUgPSBzZWxmLndyaXRlSW5saW5lR3JhbW1hcihzbGF2ZSlbMF0KKyAgICAgICAgICAgICMgc2xhdmUgcGFyc2VycyBhcmUgaW1wb3J0ZWQgYXMgbm9ybWFsIHB5dGhvbiBtb2R1bGVzCisgICAgICAgICAgICAjIHRvIGZvcmNlIHJlbG9hZGluZyBjdXJyZW50IHZlcnNpb24sIHB1cmdlIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW3BhcnNlck5hbWUrJ1BhcnNlciddCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgIGxleGVyID0gbGV4ZXJDbHMoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIGdldGF0dHIocGFyc2VyLCBncmFtbWFyRW50cnkpKCkKKworICAgICAgICByZXR1cm4gcGFyc2VyLl9vdXRwdXQKKworCisgICAgZGVmIGV4ZWNMZXhlcihzZWxmLCBncmFtbWFyLCBzbGF2ZXMsIGlucHV0KToKKyAgICAgICAgZm9yIHNsYXZlIGluIHNsYXZlczoKKyAgICAgICAgICAgIHBhcnNlck5hbWUgPSBzZWxmLndyaXRlSW5saW5lR3JhbW1hcihzbGF2ZSlbMF0KKyAgICAgICAgICAgICMgc2xhdmUgcGFyc2VycyBhcmUgaW1wb3J0ZWQgYXMgbm9ybWFsIHB5dGhvbiBtb2R1bGVzCisgICAgICAgICAgICAjIHRvIGZvcmNlIHJlbG9hZGluZyBjdXJyZW50IHZlcnNpb24sIHB1cmdlIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW3BhcnNlck5hbWUrJ1BhcnNlciddCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGxleGVyQ2xzID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyKQorCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IGxleGVyQ2xzKGNTdHJlYW0pCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRva2VuID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgICAgIGlmIHRva2VuIGlzIE5vbmUgb3IgdG9rZW4udHlwZSA9PSBhbnRscjMuRU9GOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGxleGVyLl9vdXRwdXQgKz0gdG9rZW4udGV4dAorCisgICAgICAgIHJldHVybiBsZXhlci5fb3V0cHV0CisKKworICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkU3RpbGxXb3JrcygpIHRocm93cyBFeGNlcHRpb24geworICAgICMgICAgIEVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKyAgICAjICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworICAgICMgICAgIFN0cmluZyBncmFtbWFyID0KKyAgICAjICAgICAicGFyc2VyIGdyYW1tYXIgUztcbiIgKworICAgICMgICAgICJhIDogQiAuIEMgO1xuIjsgLy8gbm90IHF1YWxpZmllZCBJRAorICAgICMgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGdyYW1tYXIpOworICAgICMgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgIyAgICAgfQorCisKKyAgICBkZWYgdGVzdERlbGVnYXRvckludm9rZXNEZWxlZ2F0ZVJ1bGUoc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFMxOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNMS5jYXB0dXJlKHQpCisKKyAgICAgICAgfQorCisgICAgICAgIGEgOiBCIHsgc2VsZi5jYXB0dXJlKCJTLmEiKSB9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIG1hc3RlciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIE0xOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBpbXBvcnQgUzE7CisgICAgICAgIHMgOiBhIDsKKyAgICAgICAgQiA6ICdiJyA7IC8vIGRlZmluZXMgQiBmcm9tIGluaGVyaXRlZCB0b2tlbiBzcGFjZQorICAgICAgICBXUyA6ICgnICd8J1xuJykge3NlbGYuc2tpcCgpfSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIG1hc3RlciwgJ3MnLAorICAgICAgICAgICAgc2xhdmVzPVtzbGF2ZV0sCisgICAgICAgICAgICBpbnB1dD0iYiIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiUy5hIiwgZm91bmQpCisKKworICAgICAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWxlZ2F0b3JJbnZva2VzRGVsZWdhdGVSdWxlV2l0aFJldHVyblN0cnVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAvLyBtdXN0IGdlbmVyYXRlIHNvbWV0aGluZyBsaWtlOgorICAgICAgICAjICAgICAgICAgIC8vIHB1YmxpYyBpbnQgYShpbnQgeCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgcmV0dXJuIGdTLmEoeCk7IH0KKyAgICAgICAgIyAgICAgICAgLy8gaW4gTS4KKyAgICAgICAgIyAgICAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAgICAgIyAgICAgICAgInBhcnNlciBncmFtbWFyIFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgImEgOiBCIHtTeXN0ZW0ub3V0LnByaW50KFwiUy5hXCIpO30gO1xuIjsKKyAgICAgICAgIyAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKyAgICAgICAgIyAgICAgICAgU3RyaW5nIG1hc3RlciA9CisgICAgICAgICMgICAgICAgICJncmFtbWFyIE07XG4iICsKKyAgICAgICAgIyAgICAgICAgImltcG9ydCBTO1xuIiArCisgICAgICAgICMgICAgICAgICJzIDogYSB7U3lzdGVtLm91dC5wcmludGxuKCRhLnRleHQpO30gO1xuIiArCisgICAgICAgICMgICAgICAgICJCIDogJ2InIDsiICsgLy8gZGVmaW5lcyBCIGZyb20gaW5oZXJpdGVkIHRva2VuIHNwYWNlCisgICAgICAgICMgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMiLCAiYiIsIGRlYnVnKTsKKyAgICAgICAgIyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTLmFiXG4iLCBmb3VuZCk7CisgICAgICAgICMgICAgICAgIH0KKworCisgICAgZGVmIHRlc3REZWxlZ2F0b3JJbnZva2VzRGVsZWdhdGVSdWxlV2l0aEFyZ3Moc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFMyOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNMi5jYXB0dXJlKHQpCisgICAgICAgIH0KKyAgICAgICAgYVt4XSByZXR1cm5zIFt5XSA6IEIge3NlbGYuY2FwdHVyZSgiUy5hIik7ICR5PSIxMDAwIjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIG1hc3RlciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIE0yOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBpbXBvcnQgUzI7CisgICAgICAgIHMgOiBsYWJlbD1hWzNdIHtzZWxmLmNhcHR1cmUoJGxhYmVsLnkpO30gOworICAgICAgICBCIDogJ2InIDsgLy8gZGVmaW5lcyBCIGZyb20gaW5oZXJpdGVkIHRva2VuIHNwYWNlCisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgbWFzdGVyLCAncycsCisgICAgICAgICAgICBzbGF2ZXM9W3NsYXZlXSwKKyAgICAgICAgICAgIGlucHV0PSJiIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJTLmExMDAwIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0RGVsZWdhdG9yQWNjZXNzZXNEZWxlZ2F0ZU1lbWJlcnMoc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFMzOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNMy5jYXB0dXJlKHQpCisKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYXB0dXJlKCJmb28iKQorICAgICAgICB9CisgICAgICAgIGEgOiBCIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIG1hc3RlciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIE0zOyAgICAgICAgLy8gdXNlcyBubyBydWxlcyBmcm9tIHRoZSBpbXBvcnQKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgaW1wb3J0IFMzOworICAgICAgICBzIDogJ2InIHtzZWxmLmdTMy5mb28oKTt9IDsgLy8gZ1MgaXMgaW1wb3J0IHBvaW50ZXIKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBtYXN0ZXIsICdzJywKKyAgICAgICAgICAgIHNsYXZlcz1bc2xhdmVdLAorICAgICAgICAgICAgaW5wdXQ9ImIiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImZvbyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdERlbGVnYXRvckludm9rZXNGaXJzdFZlcnNpb25PZkRlbGVnYXRlUnVsZShzZWxmKToKKyAgICAgICAgc2xhdmUgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgcGFyc2VyIGdyYW1tYXIgUzQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuZ000LmNhcHR1cmUodCkKKyAgICAgICAgfQorICAgICAgICBhIDogYiB7c2VsZi5jYXB0dXJlKCJTLmEiKTt9IDsKKyAgICAgICAgYiA6IEIgOworICAgICAgICAnJycpCisKKyAgICAgICAgc2xhdmUyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFQ0OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNNC5jYXB0dXJlKHQpCisgICAgICAgIH0KKyAgICAgICAgYSA6IEIge3NlbGYuY2FwdHVyZSgiVC5hIik7fSA7IC8vIGhpZGRlbiBieSBTLmEKKyAgICAgICAgJycnKQorCisgICAgICAgIG1hc3RlciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIE00OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBpbXBvcnQgUzQsVDQ7CisgICAgICAgIHMgOiBhIDsKKyAgICAgICAgQiA6ICdiJyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgbWFzdGVyLCAncycsCisgICAgICAgICAgICBzbGF2ZXM9W3NsYXZlLCBzbGF2ZTJdLAorICAgICAgICAgICAgaW5wdXQ9ImIiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIlMuYSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdERlbGVnYXRlc1NlZVNhbWVUb2tlblR5cGUoc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFM1OyAvLyBBLCBCLCBDIHRva2VuIHR5cGUgb3JkZXIKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgdG9rZW5zIHsgQTsgQjsgQzsgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNNS5jYXB0dXJlKHQpCisgICAgICAgIH0KKyAgICAgICAgeCA6IEEge3NlbGYuY2FwdHVyZSgiUy54ICIpO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgc2xhdmUyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFQ1OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICB0b2tlbnMgeyBDOyBCOyBBOyB9IC8vLyByZXZlcnNlIG9yZGVyCisgICAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuZ001LmNhcHR1cmUodCkKKyAgICAgICAgfQorICAgICAgICB5IDogQSB7c2VsZi5jYXB0dXJlKCJULnkiKTt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIG1hc3RlciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIE01OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBpbXBvcnQgUzUsVDU7CisgICAgICAgIHMgOiB4IHkgOyAvLyBtYXRjaGVzIEFBLCB3aGljaCBzaG91bGQgYmUgImFhIgorICAgICAgICBCIDogJ2InIDsgLy8gYW5vdGhlciBvcmRlcjogQiwgQSwgQworICAgICAgICBBIDogJ2EnIDsKKyAgICAgICAgQyA6ICdjJyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgbWFzdGVyLCAncycsCisgICAgICAgICAgICBzbGF2ZXM9W3NsYXZlLCBzbGF2ZTJdLAorICAgICAgICAgICAgaW5wdXQ9ImFhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJTLnggVC55IiwgZm91bmQpCisKKworICAgICAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWxlZ2F0ZXNTZWVTYW1lVG9rZW5UeXBlMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArIC8vIEEsIEIsIEMgdG9rZW4gdHlwZSBvcmRlcgorICAgICAgICAjICAgICAgICAgICAgICAgICAidG9rZW5zIHsgQTsgQjsgQzsgfVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlMiA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBUO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ0b2tlbnMgeyBDOyBCOyBBOyB9XG4iICsgLy8gcmV2ZXJzZSBvcmRlcgorICAgICAgICAjICAgICAgICAgICAgICAgICAieSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlQueVwiKTt9IDtcbiI7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlQuZyIsIHNsYXZlMik7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgUyxUO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJzIDogeCB5IDtcbiIgKyAvLyBtYXRjaGVzIEFBLCB3aGljaCBzaG91bGQgYmUgImFhIgorICAgICAgICAjICAgICAgICAgICAgICAgICAiQiA6ICdiJyA7XG4iICsgLy8gYW5vdGhlciBvcmRlcjogQiwgQSwgQworICAgICAgICAjICAgICAgICAgICAgICAgICAiQSA6ICdhJyA7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIkMgOiAnYycgO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJNLmciLCBtYXN0ZXIpOworICAgICAgICAjICAgICAgICAgVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworICAgICAgICAjICAgICAgICAgQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworICAgICAgICAjICAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvTS5nIixjb21wb3NpdGUpOworICAgICAgICAjICAgICAgICAgY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworICAgICAgICAjICAgICAgICAgZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisgICAgICAgICMgICAgICAgICBnLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFRva2VuSURUb1R5cGVNYXAgPSAiW0E9NCwgQj01LCBDPTYsIFdTPTddIjsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSAie30iOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0ID0gIltBLCBCLCBDLCBXU10iOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXAudG9TdHJpbmcoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbWJpbmVkSW1wb3J0c0NvbWJpbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICMgICAgICAgICAvLyBmb3Igbm93LCB3ZSBkb24ndCBhbGxvdyBjb21iaW5lZCB0byBpbXBvcnQgY29tYmluZWQKKyAgICAgICAgIyAgICAgICAgIEVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKyAgICAgICAgIyAgICAgICAgIEVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgc2xhdmUgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBTO1xuIiArIC8vIEEsIEIsIEMgdG9rZW4gdHlwZSBvcmRlcgorICAgICAgICAjICAgICAgICAgICAgICAgICAidG9rZW5zIHsgQTsgQjsgQzsgfVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ4IDogJ3gnIElOVCB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJJTlQgOiAnMCcuLic5JysgO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAicyA6IHggSU5UIDtcbiI7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMSwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkRXJyb3IgPSAiZXJyb3IoMTYxKTogIit0bXBkaXIudG9TdHJpbmcoKS5yZXBsYWNlRmlyc3QoIlxcLVswLTldKyIsIiIpKyIvTS5nOjI6ODogY29tYmluZWQgZ3JhbW1hciBNIGNhbm5vdCBpbXBvcnQgY29tYmluZWQgZ3JhbW1hciBTIjsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCBleHBlY3RlZEVycm9yLCBlcXVldWUuZXJyb3JzLmdldCgwKS50b1N0cmluZygpLnJlcGxhY2VGaXJzdCgiXFwtWzAtOV0rIiwiIikpOworICAgICAgICAjIH0KKworICAgICAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTYW1lU3RyaW5nVHdvTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIyAgICAgICAgIEVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKyAgICAgICAgIyAgICAgICAgIEVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgc2xhdmUgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAicGFyc2VyIGdyYW1tYXIgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAidG9rZW5zIHsgQT0nYSc7IH1cbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAieCA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlMueFwiKTt9IDtcbiI7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZTIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAidG9rZW5zIHsgWD0nYSc7IH1cbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAieSA6IFgge1N5c3RlbS5vdXQucHJpbnRsbihcIlQueVwiKTt9IDtcbiI7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlQuZyIsIHNsYXZlMik7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgUyxUO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJzIDogeCB5IDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltBPTQsIFdTPTYsIFg9NV0iOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7J2EnPTR9IjsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCA9ICJbQSwgWCwgV1NdIjsKKworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcCkudG9TdHJpbmcoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0LAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QpLnRvU3RyaW5nKCkpOworCisgICAgICAgICMgICAgICAgICBPYmplY3QgZXhwZWN0ZWRBcmcgPSAiWD0nYSciOworICAgICAgICAjICAgICAgICAgT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJBIjsKKyAgICAgICAgIyAgICAgICAgIGludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19UT0tFTl9BTElBU19DT05GTElDVDsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgIG5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKyAgICAgICAgIyAgICAgICAgIGNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDEsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkRXJyb3IgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZXJyb3IoMTU4KTogVC5nOjI6MTA6IGNhbm5vdCBhbGlhcyBYPSdhJzsgc3RyaW5nIGFscmVhZHkgYXNzaWduZWQgdG8gQSI7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFcnJvciwgZXF1ZXVlLmVycm9ycy5nZXQoMCkudG9TdHJpbmcoKSk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdFNhbWVOYW1lVHdvU3RyaW5ncygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ0b2tlbnMgeyBBPSdhJzsgfVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlMiA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBUO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ0b2tlbnMgeyBBPSd4JzsgfVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ5IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiVC55XCIpO30gO1xuIjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZTIpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFMsVDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAicyA6IHggeSA7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisgICAgICAgICMgICAgICAgICBUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisgICAgICAgICMgICAgICAgICBDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisgICAgICAgICMgICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisgICAgICAgICMgICAgICAgICBjb21wb3NpdGUuc2V0RGVsZWdhdGlvblJvb3QoZyk7CisgICAgICAgICMgICAgICAgICBnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKyAgICAgICAgIyAgICAgICAgIGcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCA9ICJbQT00LCBUX182PTYsIFdTPTVdIjsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSAieydhJz00LCAneCc9Nn0iOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0ID0gIltBLCBXUywgVF9fNl0iOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIHNvcnRNYXBUb1N0cmluZyhnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgIyAgICAgICAgIE9iamVjdCBleHBlY3RlZEFyZyA9ICJBPSd4JyI7CisgICAgICAgICMgICAgICAgICBPYmplY3QgZXhwZWN0ZWRBcmcyID0gIidhJyI7CisgICAgICAgICMgICAgICAgICBpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfVE9LRU5fQUxJQVNfUkVBU1NJR05NRU5UOworICAgICAgICAjICAgICAgICAgR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworICAgICAgICAjICAgICAgICAgY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMSwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRFcnJvciA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJlcnJvcigxNTkpOiBULmc6MjoxMDogY2Fubm90IGFsaWFzIEE9J3gnOyB0b2tlbiBuYW1lIGFscmVhZHkgYXNzaWduZWQgdG8gJ2EnIjsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEVycm9yLCBlcXVldWUuZXJyb3JzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgIyB9CisKKyAgICAgICAgIyBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0ZWRUb2tlblZvY2FiSWdub3JlZFdpdGhXYXJuaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICMgICAgICAgICBFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisgICAgICAgICMgICAgICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIm9wdGlvbnMge3Rva2VuVm9jYWI9d2hhdGV2ZXI7fVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ0b2tlbnMgeyBBPSdhJzsgfVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInMgOiB4IDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCisgICAgICAgICMgICAgICAgICBPYmplY3QgZXhwZWN0ZWRBcmcgPSAiUyI7CisgICAgICAgICMgICAgICAgICBpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfVE9LRU5fVk9DQUJfSU5fREVMRUdBVEU7CisgICAgICAgICMgICAgICAgICBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorICAgICAgICAjICAgICAgICAgICAgICAgICBuZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworICAgICAgICAjICAgICAgICAgY2hlY2tHcmFtbWFyU2VtYW50aWNzV2FybmluZyhlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMSwgZXF1ZXVlLndhcm5pbmdzLnNpemUoKSk7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZEVycm9yID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIndhcm5pbmcoMTYwKTogUy5nOjI6MTA6IHRva2VuVm9jYWIgb3B0aW9uIGlnbm9yZWQgaW4gaW1wb3J0ZWQgZ3JhbW1hciBTIjsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEVycm9yLCBlcXVldWUud2FybmluZ3MuZ2V0KDApLnRvU3RyaW5nKCkpOworICAgICAgICAjIH0KKworICAgICAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRlZFRva2VuVm9jYWJXb3Jrc0luUm9vdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ0b2tlbnMgeyBBPSdhJzsgfVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgdG9rZW5zID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIkE9OTlcbiI7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiVGVzdC50b2tlbnMiLCB0b2tlbnMpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAib3B0aW9ucyB7dG9rZW5Wb2NhYj1UZXN0O31cbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInMgOiB4IDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltBPTk5LCBXUz0xMDFdIjsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSAieydhJz0xMDB9IjsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCA9ICJbQSwgJ2EnLCBXU10iOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXAudG9TdHJpbmcoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5bnRheEVycm9yc0luSW1wb3J0c05vdFRocm93bk91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJvcHRpb25zIHt0b2tlXG4iOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAicyA6IHggO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJNLmciLCBtYXN0ZXIpOworICAgICAgICAjICAgICAgICAgVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworICAgICAgICAjICAgICAgICAgQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworICAgICAgICAjICAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvTS5nIixjb21wb3NpdGUpOworICAgICAgICAjICAgICAgICAgY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworICAgICAgICAjICAgICAgICAgZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisgICAgICAgICMgICAgICAgICBnLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisKKyAgICAgICAgIyAgICAgICAgIC8vIHdob2xlIGJ1bmNoIG9mIGVycm9ycyBmcm9tIGJhZCBTLmcgZmlsZQorICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDUsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKyAgICAgICAgIyB9CisKKyAgICAgICAgIyBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3ludGF4RXJyb3JzSW5JbXBvcnRzTm90VGhyb3duT3V0MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICI6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlMueFwiKTt9IDtcbiI7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIG1hc3RlciA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJncmFtbWFyIE07XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImltcG9ydCBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJzIDogeCA7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisgICAgICAgICMgICAgICAgICBUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisgICAgICAgICMgICAgICAgICBDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisgICAgICAgICMgICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisgICAgICAgICMgICAgICAgICBjb21wb3NpdGUuc2V0RGVsZWdhdGlvblJvb3QoZyk7CisgICAgICAgICMgICAgICAgICBnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKyAgICAgICAgIyAgICAgICAgIGcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworICAgICAgICAjICAgICAgICAgLy8gd2hvbGUgYnVuY2ggb2YgZXJyb3JzIGZyb20gYmFkIFMuZyBmaWxlCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMywgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworICAgICAgICAjIH0KKworCisgICAgZGVmIHRlc3REZWxlZ2F0b3JSdWxlT3ZlcnJpZGVzRGVsZWdhdGUoc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHBhcnNlciBncmFtbWFyIFM2OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNNi5jYXB0dXJlKHQpCisgICAgICAgIH0KKyAgICAgICAgYSA6IGIge3NlbGYuY2FwdHVyZSgiUy5hIik7fSA7CisgICAgICAgIGIgOiBCIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIG1hc3RlciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIE02OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBpbXBvcnQgUzY7CisgICAgICAgIGIgOiAnYid8J2MnIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBtYXN0ZXIsICdhJywKKyAgICAgICAgICAgIHNsYXZlcz1bc2xhdmVdLAorICAgICAgICAgICAgaW5wdXQ9ImMiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIlMuYSIsIGZvdW5kKQorCisKKyAgICAjICAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9yUnVsZU92ZXJyaWRlc0xvb2thaGVhZEluRGVsZWdhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAjICAgICAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgIyAgICAgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBKYXZhRGVjbDtcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAidHlwZSA6ICdpbnQnIDtcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAiZGVjbCA6IHR5cGUgSUQgJzsnXG4iICsKKyAgICAjICAgICAgICAgICAgICAgICAgICAgIiAgICAgfCB0eXBlIElEIGluaXQgJzsnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJKYXZhRGVjbDogXCIrJGRlY2wudGV4dCk7fVxuIiArCisgICAgIyAgICAgICAgICAgICAgICAgICAgICIgICAgIDtcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAiaW5pdCA6ICc9JyBJTlQgO1xuIiA7CisgICAgIyAgICAgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICMgICAgICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIkphdmFEZWNsLmciLCBzbGF2ZSk7CisgICAgIyAgICAgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAjICAgICAgICAgICAgICAgICAgICAgImdyYW1tYXIgSmF2YTtcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IEphdmFEZWNsO1xuIiArCisgICAgIyAgICAgICAgICAgICAgICAgICAgICJwcm9nIDogZGVjbCA7XG4iICsKKyAgICAjICAgICAgICAgICAgICAgICAgICAgInR5cGUgOiAnaW50JyB8ICdmbG9hdCcgO1xuIiArCisgICAgIyAgICAgICAgICAgICAgICAgICAgICJcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAiSUQgIDogJ2EnLi4neicrIDtcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrIDtcbiIgKworICAgICMgICAgICAgICAgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisgICAgIyAgICAgICAgICAgICAvLyBmb3IgZmxvYXQgdG8gd29yayBpbiBkZWNsLCB0eXBlIG11c3QgYmUgb3ZlcnJpZGRlbgorICAgICMgICAgICAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiSmF2YS5nIiwgbWFzdGVyLCAiSmF2YVBhcnNlciIsICJKYXZhTGV4ZXIiLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZyIsICJmbG9hdCB4ID0gMzsiLCBkZWJ1Zyk7CisgICAgIyAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkphdmFEZWNsOiBmbG9hdHg9MztcbiIsIGZvdW5kKTsKKyAgICAjICAgICB9CisKKyAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWxlZ2F0b3JSdWxlT3ZlcnJpZGVzRGVsZWdhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgIyAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAjICAgICAgICAgInBhcnNlciBncmFtbWFyIFM7XG4iICsKKyAgICAjICAgICAgICAgImEgOiBiIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLmFcIik7fSA7XG4iICsKKyAgICAjICAgICAgICAgImIgOiBCIDtcbiIgOworICAgICMgICAgIG1rZGlyKHRtcGRpcik7CisgICAgIyAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKworICAgICMgICAgIFN0cmluZyBzbGF2ZTIgPQorICAgICMgICAgICAgICAicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworICAgICMgICAgICAgICAidG9rZW5zIHsgQT0neCc7IH1cbiIgKworICAgICMgICAgICAgICAiYiA6IEIge1N5c3RlbS5vdXQucHJpbnRsbihcIlQuYlwiKTt9IDtcbiI7CisgICAgIyAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlQuZyIsIHNsYXZlMik7CisKKyAgICAjICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAjICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICMgICAgICAgICAiaW1wb3J0IFMsIFQ7XG4iICsKKyAgICAjICAgICAgICAgImIgOiAnYid8J2MnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJNLmJcIik7fXxCfEEgO1xuIiArCisgICAgIyAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAjICAgICBTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJNLmciLCBtYXN0ZXIsICJNUGFyc2VyIiwgIk1MZXhlciIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIsICJjIiwgZGVidWcpOworICAgICMgICAgIGFzc2VydEVxdWFscygiTS5iXG4iICsKKyAgICAjICAgICAgICAgICAgICAgICAgIlMuYVxuIiwgZm91bmQpOworICAgICMgfQorCisgICAgIyBMRVhFUiBJTkhFUklUQU5DRQorCisgICAgZGVmIHRlc3RMZXhlckRlbGVnYXRvckludm9rZXNEZWxlZ2F0ZVJ1bGUoc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGxleGVyIGdyYW1tYXIgUzc7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuZ003LmNhcHR1cmUodCkKKyAgICAgICAgfQorICAgICAgICBBIDogJ2EnIHtzZWxmLmNhcHR1cmUoIlMuQSAiKTt9IDsKKyAgICAgICAgQyA6ICdjJyA7CisgICAgICAgICcnJykKKworICAgICAgICBtYXN0ZXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgbGV4ZXIgZ3JhbW1hciBNNzsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgaW1wb3J0IFM3OworICAgICAgICBCIDogJ2InIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNMZXhlcigKKyAgICAgICAgICAgIG1hc3RlciwKKyAgICAgICAgICAgIHNsYXZlcz1bc2xhdmVdLAorICAgICAgICAgICAgaW5wdXQ9ImFiYyIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiUy5BIGFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdExleGVyRGVsZWdhdG9yUnVsZU92ZXJyaWRlc0RlbGVnYXRlKHNlbGYpOgorICAgICAgICBzbGF2ZSA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBsZXhlciBncmFtbWFyIFM4OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBAbWVtYmVycyB7CisgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLmdNOC5jYXB0dXJlKHQpCisgICAgICAgIH0KKyAgICAgICAgQSA6ICdhJyB7c2VsZi5jYXB0dXJlKCJTLkEiKX0gOworICAgICAgICAnJycpCisKKyAgICAgICAgbWFzdGVyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGxleGVyIGdyYW1tYXIgTTg7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGltcG9ydCBTODsKKyAgICAgICAgQSA6ICdhJyB7c2VsZi5jYXB0dXJlKCJNLkEgIik7fSA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjTGV4ZXIoCisgICAgICAgICAgICBtYXN0ZXIsCisgICAgICAgICAgICBzbGF2ZXM9W3NsYXZlXSwKKyAgICAgICAgICAgIGlucHV0PSJhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJNLkEgYSIsIGZvdW5kKQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyRGVsZWdhdG9yUnVsZU92ZXJyaWRlc0RlbGVnYXRlTGVhdmluZ05vUnVsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIyAgICAgICAgIC8vIE0uVG9rZW5zIGhhcyBub3RoaW5nIHRvIHByZWRpY3QgdG9rZW5zIGZyb20gUy4gIFNob3VsZAorICAgICAgICAjICAgICAgICAgLy8gbm90IGluY2x1ZGUgUy5Ub2tlbnMgYWx0IGluIHRoaXMgY2FzZT8KKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIkEgOiAnYScge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuQVwiKTt9IDtcbiI7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiQSA6ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwiTS5BXCIpO30gO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICIvTS5nIiwgbWFzdGVyKTsKKworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworICAgICAgICAjICAgICAgICAgY29tcG9zaXRlLmNyZWF0ZU5GQXMoKTsKKyAgICAgICAgIyAgICAgICAgIGcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisKKyAgICAgICAgIyAgICAgICAgIC8vIHByZWRpY3Qgb25seSBhbHRzIGZyb20gTSBub3QgUworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGluZ0RGQSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICIuczAtJ2EnLT4uczFcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiLnMwLXsnXFxuJywgJyAnfS0+OnMzPT4yXG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIi5zMS08RU9UPi0+OnMyPT4xXG4iOworICAgICAgICAjICAgICAgICAgb3JnLmFudGxyLmFuYWx5c2lzLkRGQSBkZmEgPSBnLmdldExvb2thaGVhZERGQSgxKTsKKyAgICAgICAgIyAgICAgICAgIEZBU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEZBU2VyaWFsaXplcihnKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZmEuc3RhcnRTdGF0ZSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nREZBLCByZXN1bHQpOworCisgICAgICAgICMgICAgICAgICAvLyBtdXN0IG5vdCBiZSBhICJ1bnJlYWNoYWJsZSBhbHQ6IFRva2VucyIgZXJyb3IKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdEludmFsaWRJbXBvcnRNZWNoYW5pc20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIyAgICAgICAgIC8vIE0uVG9rZW5zIGhhcyBub3RoaW5nIHRvIHByZWRpY3QgdG9rZW5zIGZyb20gUy4gIFNob3VsZAorICAgICAgICAjICAgICAgICAgLy8gbm90IGluY2x1ZGUgUy5Ub2tlbnMgYWx0IGluIHRoaXMgY2FzZT8KKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIkEgOiAnYScge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuQVwiKTt9IDtcbiI7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAidHJlZSBncmFtbWFyIE07XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImltcG9ydCBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJhIDogQSA7IjsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICIvTS5nIiwgbWFzdGVyKTsKKworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMSwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS53YXJuaW5ncy5zaXplKCkpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRFcnJvciA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJlcnJvcigxNjEpOiAiK3RtcGRpci50b1N0cmluZygpLnJlcGxhY2VGaXJzdCgiXFwtWzAtOV0rIiwiIikrIi9NLmc6Mjo4OiB0cmVlIGdyYW1tYXIgTSBjYW5ub3QgaW1wb3J0IGxleGVyIGdyYW1tYXIgUyI7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFcnJvciwgZXF1ZXVlLmVycm9ycy5nZXQoMCkudG9TdHJpbmcoKS5yZXBsYWNlRmlyc3QoIlxcLVswLTldKyIsIiIpKTsKKyAgICAgICAgIyB9CisKKyAgICAgICAgIyBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3ludGFjdGljUHJlZGljYXRlUnVsZXNBcmVOb3RJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIyAgICAgICAgIC8vIGlmIHRoaXMgY29tcGlsZXMsIGl0IG1lYW5zIHRoYXQgc3lucHJlZDFfUyBpcyBkZWZpbmVkIGluIFMuamF2YQorICAgICAgICAjICAgICAgICAgLy8gYnV0IG5vdCBNUGFyc2VyLmphdmEuICBNUGFyc2VyIGhhcyBpdHMgb3duIHN5bnByZWQxX00gd2hpY2ggbXVzdAorICAgICAgICAjICAgICAgICAgLy8gYmUgc2VwYXJhdGUgdG8gY29tcGlsZS4KKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJhIDogJ2EnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLmExXCIpO31cbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiICB8ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwiUy5hMlwiKTt9XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIiAgO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJiIDogJ3gnIHwgJ3knIHs7fSA7XG4iOyAvLyBwcmVkcyBnZW5lcmF0ZWQgYnV0IG5vdCBuZWVkIGluIERGQSBoZXJlCisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImltcG9ydCBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJzdGFydCA6IGEgYiA7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIm5vbnNlbnNlIDogJ3EnIHwgJ3EnIHs7fSA7IiArIC8vIGZvcmNlcyBkZWYgb2YgcHJlZHMgaGVyZSBpbiBNCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCAiTUxleGVyIiwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0IiwgImF4IiwgZGVidWcpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTLmExXG4iLCBmb3VuZCk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdEtleXdvcmRWU0lER2l2ZXNOb1dhcm5pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIyAgICAgICAgIEVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKyAgICAgICAgIyAgICAgICAgIEVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgc2xhdmUgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJBIDogJ2FiYycge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuQVwiKTt9IDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIjsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIG1hc3RlciA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJncmFtbWFyIE07XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImltcG9ydCBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJhIDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiTS5hXCIpO30gO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCAiTUxleGVyIiwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEiLCAiYWJjIiwgZGVidWcpOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIHdhcm5pbmdzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLndhcm5pbmdzLnNpemUoKSk7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygiUy5BXG5NLmFcbiIsIGZvdW5kKTsKKyAgICAgICAgIyB9CisKKyAgICAgICAgIyBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2FybmluZ0ZvclVuZGVmaW5lZFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICMgICAgICAgICBFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisgICAgICAgICMgICAgICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImxleGVyIGdyYW1tYXIgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiQSA6ICdhYmMnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLkFcIik7fSA7XG4iOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImEgOiBBQkMgQSB7U3lzdGVtLm91dC5wcmludGxuKFwiTS5hXCIpO30gO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIC8vIEEgaXMgZGVmaW5lZCBpbiBTIGJ1dCBNIHNob3VsZCBzdGlsbCBzZWUgaXQgYW5kIG5vdCBnaXZlIHdhcm5pbmcuCisgICAgICAgICMgICAgICAgICAvLyBvbmx5IHByb2JsZW0gaXMgQUJDLgorCisgICAgICAgICMgICAgICAgICByYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLCBkZWJ1Zyk7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgd2FybmluZ3M6ICIrZXF1ZXVlLCAxLCBlcXVldWUud2FybmluZ3Muc2l6ZSgpKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkRXJyb3IgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAid2FybmluZygxMDUpOiAiK3RtcGRpci50b1N0cmluZygpLnJlcGxhY2VGaXJzdCgiXFwtWzAtOV0rIiwiIikrIi9NLmc6Mzo1OiBubyBsZXhlciBydWxlIGNvcnJlc3BvbmRpbmcgdG8gdG9rZW46IEFCQyI7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFcnJvciwgZXF1ZXVlLndhcm5pbmdzLmdldCgwKS50b1N0cmluZygpLnJlcGxhY2VGaXJzdCgiXFwtWzAtOV0rIiwiIikpOworICAgICAgICAjIH0KKworICAgICAgICAjIC8qKiBNYWtlIHN1cmUgdGhhdCBNIGNhbiBpbXBvcnQgUyB0aGF0IGltcG9ydHMgVC4gKi8KKyAgICAgICAgIyBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0M0xldmVsSW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICMgICAgICAgICBFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisgICAgICAgICMgICAgICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIFQ7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImEgOiBUIDtcbiIgOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZSk7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgc2xhdmUyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIFM7XG4iICsgLy8gQSwgQiwgQyB0b2tlbiB0eXBlIG9yZGVyCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgVDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiYSA6IFMgO1xuIiA7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlMik7CisKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAiZ3JhbW1hciBNO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiYSA6IE0gO1xuIiA7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuZGVmaW5lR3JhbW1hclN5bWJvbHMoKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCA9ICJbTT02LCBTPTUsIFQ9NF0iOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7fSI7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW1QsIFMsIE1dIjsKKworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcCkudG9TdHJpbmcoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0LAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QpLnRvU3RyaW5nKCkpOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCisgICAgICAgICMgICAgICAgICBib29sZWFuIG9rID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCBudWxsLCBmYWxzZSk7CisgICAgICAgICMgICAgICAgICBib29sZWFuIGV4cGVjdGluZyA9IHRydWU7IC8vIHNob3VsZCBiZSBvaworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgb2spOworICAgICAgICAjIH0KKworICAgICAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCaWdUcmVlT2ZJbXBvcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICMgICAgICAgICBFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisgICAgICAgICMgICAgICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIFQ7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInggOiBUIDtcbiIgOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZSk7CisgICAgICAgICMgICAgICAgICBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgVDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAieSA6IFMgO1xuIiA7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKworICAgICAgICAjICAgICAgICAgc2xhdmUgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAicGFyc2VyIGdyYW1tYXIgQztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaSA6IEMgO1xuIiA7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIkMuZyIsIHNsYXZlKTsKKyAgICAgICAgIyAgICAgICAgIHNsYXZlID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIEI7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImogOiBCIDtcbiIgOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJCLmciLCBzbGF2ZSk7CisgICAgICAgICMgICAgICAgICBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBBO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJpbXBvcnQgQixDO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJrIDogQSA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiQS5nIiwgc2xhdmUpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFMsQTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiYSA6IE0gO1xuIiA7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKyAgICAgICAgIyAgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKyAgICAgICAgIyAgICAgICAgIENvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKyAgICAgICAgIyAgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuZGVmaW5lR3JhbW1hclN5bWJvbHMoKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCA9ICJbQT04LCBCPTYsIEM9NywgTT05LCBTPTUsIFQ9NF0iOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7fSI7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW1QsIFMsIEIsIEMsIEEsIE1dIjsKKworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcCkudG9TdHJpbmcoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0LAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QpLnRvU3RyaW5nKCkpOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCisgICAgICAgICMgICAgICAgICBib29sZWFuIG9rID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCBudWxsLCBmYWxzZSk7CisgICAgICAgICMgICAgICAgICBib29sZWFuIGV4cGVjdGluZyA9IHRydWU7IC8vIHNob3VsZCBiZSBvaworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgb2spOworICAgICAgICAjIH0KKworICAgICAgICAjIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlc1Zpc2libGVUaHJvdWdoTXVsdGlsZXZlbEltcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICAjICAgICAgICAgRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBzbGF2ZSA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBUO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJ4IDogVCA7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiVC5nIiwgc2xhdmUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIHNsYXZlMiA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArIC8vIEEsIEIsIEMgdG9rZW4gdHlwZSBvcmRlcgorICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFQ7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImEgOiBTIDtcbiIgOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZTIpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImEgOiBNIHggO1xuIiA7IC8vIHggTVVTVCBCRSBWSVNJQkxFIFRPIE0KKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJNLmciLCBtYXN0ZXIpOworICAgICAgICAjICAgICAgICAgVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworICAgICAgICAjICAgICAgICAgQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworICAgICAgICAjICAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvTS5nIixjb21wb3NpdGUpOworICAgICAgICAjICAgICAgICAgY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworICAgICAgICAjICAgICAgICAgZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisgICAgICAgICMgICAgICAgICBnLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisgICAgICAgICMgICAgICAgICBnLmNvbXBvc2l0ZS5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworCisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltNPTYsIFM9NSwgVD00XSI7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwID0gInt9IjsKKyAgICAgICAgIyAgICAgICAgIFN0cmluZyBleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCA9ICJbVCwgUywgTV0iOworCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXAudG9TdHJpbmcoKSk7CisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbXBvc2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAjICAgICAgICAgLy8gV2Fzbid0IGNvbXBpbGluZy4gaHR0cDovL3d3dy5hbnRsci5vcmcvamlyYS9icm93c2UvQU5UTFItNDM4CisgICAgICAgICMgICAgICAgICBFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisgICAgICAgICMgICAgICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGdzdHIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciBMO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJUMTogJzEnO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJUMjogJzInO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJUMzogJzMnO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJUNDogJzQnO1xuIiA7CisgICAgICAgICMgICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICAjICAgICAgICAgd3JpdGVGaWxlKHRtcGRpciwgIkwuZyIsIGdzdHIpOworICAgICAgICAjICAgICAgICAgZ3N0ciA9CisgICAgICAgICMgICAgICAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBHMTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiczogYSB8IGI7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImE6IFQxO1xuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJiOiBUMjtcbiIgOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJHMS5nIiwgZ3N0cik7CisKKyAgICAgICAgIyAgICAgICAgIGdzdHIgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAicGFyc2VyIGdyYW1tYXIgRzI7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImltcG9ydCBHMTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiYTogVDM7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiRzIuZyIsIGdzdHIpOworICAgICAgICAjICAgICAgICAgU3RyaW5nIEczc3RyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgRzM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImltcG9ydCBHMjtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiYjogVDQ7XG4iIDsKKyAgICAgICAgIyAgICAgICAgIG1rZGlyKHRtcGRpcik7CisgICAgICAgICMgICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiRzMuZyIsIEczc3RyKTsKKworICAgICAgICAjICAgICAgICAgVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworICAgICAgICAjICAgICAgICAgQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworICAgICAgICAjICAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvRzMuZyIsY29tcG9zaXRlKTsKKyAgICAgICAgIyAgICAgICAgIGNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKyAgICAgICAgIyAgICAgICAgIGcucGFyc2VBbmRCdWlsZEFTVCgpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworICAgICAgICAjICAgICAgICAgZy5jb21wb3NpdGUuZGVmaW5lR3JhbW1hclN5bWJvbHMoKTsKKworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCA9ICJbVDE9NCwgVDI9NSwgVDM9NiwgVDQ9N10iOworICAgICAgICAjICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7fSI7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW1QxLCBUMiwgVDMsIFQ0XSI7CisKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFRva2VuSURUb1R5cGVNYXAsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnRva2VuSURUb1R5cGVNYXApLnRvU3RyaW5nKCkpOworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCwgZy5jb21wb3NpdGUuc3RyaW5nTGl0ZXJhbFRvVHlwZU1hcC50b1N0cmluZygpKTsKKyAgICAgICAgIyAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0KS50b1N0cmluZygpKTsKKworICAgICAgICAjICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKworICAgICAgICAjICAgICAgICAgYm9vbGVhbiBvayA9CisgICAgICAgICMgICAgICAgICAgICAgICAgIHJhd0dlbmVyYXRlQW5kQnVpbGRSZWNvZ25pemVyKCJHMy5nIiwgRzNzdHIsICJHM1BhcnNlciIsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgIyAgICAgICAgIGJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBvayk7CisgICAgICAgICMgfQorCisgICAgICAgICMgQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlYWRlcnNQcm9wb2dhdGVkQ29ycmVjdGx5VG9JbXBvcnRlZEdyYW1tYXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgc2xhdmUgPQorICAgICAgICAjICAgICAgICAgICAgICAgICAicGFyc2VyIGdyYW1tYXIgUztcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiYSA6IEIge1N5c3RlbS5vdXQucHJpbnQoXCJTLmFcIik7fSA7XG4iOworICAgICAgICAjICAgICAgICAgbWtkaXIodG1wZGlyKTsKKyAgICAgICAgIyAgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisgICAgICAgICMgICAgICAgICBTdHJpbmcgbWFzdGVyID0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiaW1wb3J0IFM7XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIkBoZWFkZXJ7cGFja2FnZSBteXBhY2thZ2U7fVxuIiArCisgICAgICAgICMgICAgICAgICAgICAgICAgICJAbGV4ZXI6OmhlYWRlcntwYWNrYWdlIG15cGFja2FnZTt9XG4iICsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgInMgOiBhIDtcbiIgKworICAgICAgICAjICAgICAgICAgICAgICAgICAiQiA6ICdiJyA7IiArIC8vIGRlZmluZXMgQiBmcm9tIGluaGVyaXRlZCB0b2tlbiBzcGFjZQorICAgICAgICAjICAgICAgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisgICAgICAgICMgICAgICAgICBib29sZWFuIG9rID0gYW50bHIoIk0uZyIsICJNLmciLCBtYXN0ZXIsIGRlYnVnKTsKKyAgICAgICAgIyAgICAgICAgIGJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisgICAgICAgICMgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBvayk7CisgICAgICAgICMgfQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1M2hldGVyby5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDUzaGV0ZXJvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiM2U5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1M2hldGVyby5weQpAQCAtMCwwICsxLDkzOSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCBhbnRscjMudHJlZQoraW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgc3lzCisKK2NsYXNzIFQodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgcGFyc2VyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIFRQYXJzZXIoYmFzZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBiYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9ICIiCisKKworICAgICAgICAgICAgZGVmIGNhcHR1cmUoc2VsZiwgdCk6CisgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ICs9IHQKKworCisgICAgICAgICAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJz4nK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJzwnK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisgICAgICAgICAgICAgICAgIyBubyBlcnJvciByZWNvdmVyeSB5ZXQsIGp1c3QgY3Jhc2ghCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgPSAiIgorCisKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCArPSB0CisKKworICAgICAgICAgICAgZGVmIHRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc+JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc8JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorCisKKyAgICBkZWYgZXhlY1BhcnNlcihzZWxmLCBncmFtbWFyLCBncmFtbWFyRW50cnksIGlucHV0KToKKyAgICAgICAgbGV4ZXJDbHMsIHBhcnNlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hcikKKworICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBsZXhlckNscyhjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBwYXJzZXJDbHModFN0cmVhbSkKKyAgICAgICAgciA9IGdldGF0dHIocGFyc2VyLCBncmFtbWFyRW50cnkpKCkKKworICAgICAgICBpZiByIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHIudHJlZS50b1N0cmluZ1RyZWUoKQorCisgICAgICAgIHJldHVybiAiIgorCisKKyAgICBkZWYgZXhlY1RyZWVQYXJzZXIoc2VsZiwgZ3JhbW1hciwgZ3JhbW1hckVudHJ5LCB0cmVlR3JhbW1hciwgdHJlZUVudHJ5LCBpbnB1dCk6CisgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisgICAgICAgIHdhbGtlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIodHJlZUdyYW1tYXIpCisKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgIGxleGVyID0gbGV4ZXJDbHMoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIHIgPSBnZXRhdHRyKHBhcnNlciwgZ3JhbW1hckVudHJ5KSgpCisgICAgICAgIG5vZGVzID0gYW50bHIzLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci50cmVlKQorICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0U3RyZWFtKQorICAgICAgICB3YWxrZXIgPSB3YWxrZXJDbHMobm9kZXMpCisgICAgICAgIHIgPSBnZXRhdHRyKHdhbGtlciwgdHJlZUVudHJ5KSgpCisKKyAgICAgICAgaWYgciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiByLnRyZWUudG9TdHJpbmdUcmVlKCkKKworICAgICAgICByZXR1cm4gIiIKKworCisgICAgIyBQQVJTRVJTIC0tIEFVVE8gQVNUCisKKyAgICBkZWYgdGVzdFRva2VuKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDE7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6IElEPFY+IDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgaW5wdXQ9ImEiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImE8Vj4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlbkNvbW1vblRyZWUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBJRDxDb21tb25UcmVlPiA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRva2VuV2l0aFF1YWxpZmllZFR5cGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgICAgIGNsYXNzIFYoQ29tbW9uVHJlZSk6CisgICAgICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBJRDxUUGFyc2VyLlY+IDsgLy8gVFBhcnNlci5WIGlzIHF1YWxpZmllZCBuYW1lCisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhPFY+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TmFtZWRUeXBlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiIgorICAgICAgICAgICAgZ3JhbW1hciAkVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGhlYWRlciB7CisgICAgICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogSUQ8bm9kZT1WPiA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgJ2EnLCBpbnB1dD0iYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhPFY+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VG9rZW5XaXRoTGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIEBoZWFkZXIgeworICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogeD1JRDxWPiA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhPFY+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VG9rZW5XaXRoTGlzdExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDM7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6IHgrPUlEPFY+IDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgaW5wdXQ9ImEiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImE8Vj4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlblJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUNDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIEBoZWFkZXIgeworICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogSUQ8Vj5eIDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgaW5wdXQ9ImEiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImE8Vj4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlblJvb3RXaXRoTGlzdExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDU7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6IHgrPUlEPFY+XiA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhPFY+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDY7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6ICdiZWdpbic8Vj4gOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYmVnaW4iCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImJlZ2luPFY+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U3RyaW5nUm9vdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ3OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgQGhlYWRlciB7CisgICAgICAgIGNsYXNzIFYoQ29tbW9uVHJlZSk6CisgICAgICAgICAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworICAgICAgICB9CisgICAgICAgIGEgOiAnYmVnaW4nPFY+XiA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJiZWdpbiIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYmVnaW48Vj4iLCBmb3VuZCkKKworCisgICAgIyBQQVJTRVJTIC0tIFJFV1JJVEUgQVNUCisKKyAgICBkZWYgdGVzdFJld3JpdGVUb2tlbihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ4OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgQGhlYWRlciB7CisgICAgICAgIGNsYXNzIFYoQ29tbW9uVHJlZSk6CisgICAgICAgICAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworICAgICAgICB9CisgICAgICAgIGEgOiBJRCAtPiBJRDxWPiA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhPFY+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV3cml0ZVRva2VuV2l0aEFyZ3Moc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUOTsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIEBoZWFkZXIgeworICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBpZiBsZW4oYXJncykgPT0gNDoKKyAgICAgICAgICAgICAgICAgICAgdHR5cGUgPSBhcmdzWzBdCisgICAgICAgICAgICAgICAgICAgIHggPSBhcmdzWzFdCisgICAgICAgICAgICAgICAgICAgIHkgPSBhcmdzWzJdCisgICAgICAgICAgICAgICAgICAgIHogPSBhcmdzWzNdCisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gQ29tbW9uVG9rZW4odHlwZT10dHlwZSwgdGV4dD0iIikKKworICAgICAgICAgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICAgICAgICAgIHR0eXBlID0gYXJnc1swXQorICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGFyZ3NbMV0KKyAgICAgICAgICAgICAgICAgICAgeCA9IGFyZ3NbMl0KKyAgICAgICAgICAgICAgICAgICAgeSwgeiA9IDAsIDAKKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiSW52YWxpZCBhcmdzIFwlciIgXCUgKGFyZ3MsKSkKKworICAgICAgICAgICAgICAgIENvbW1vblRyZWUuX19pbml0X18oc2VsZiwgdG9rZW4pCisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgICAgIHNlbGYueSA9IHkKKyAgICAgICAgICAgICAgICBzZWxmLnogPSB6CisKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICB0eHQgPSAiIgorICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHR4dCArPSBzZWxmLnRva2VuLnRleHQKKyAgICAgICAgICAgICAgICB0eHQgKz0iPFY+O1wlZFwlZFwlZCIgXCUgKHNlbGYueCwgc2VsZi55LCBzZWxmLnopCisgICAgICAgICAgICAgICAgcmV0dXJuIHR4dAorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgLT4gSUQ8Vj5bNDIsMTksMzBdIElEPFY+WyRJRCw5OV07CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCI8Vj47NDIxOTMwIGE8Vj47OTkwMCIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVUb2tlblJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMTA7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVCAtPiBeKElEPFY+IElOVCkgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSAyIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoYTxWPiAyKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVTdHJpbmcoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMTE7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6ICdiZWdpbicgLT4gJ2JlZ2luJzxWPiA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJiZWdpbiIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYmVnaW48Vj4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlU3RyaW5nUm9vdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQxMjsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIEBoZWFkZXIgeworICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogJ2JlZ2luJyBJTlQgLT4gXignYmVnaW4nPFY+IElOVCkgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYmVnaW4gMiIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiKGJlZ2luPFY+IDIpIiwgZm91bmQpCisKKyAgICBkZWYgdGVzdFJld3JpdGVSdWxlUmVzdWx0cyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW5zIHtMSVNUO30KKyAgICAgICAgICAgIEBoZWFkZXIgeworICAgICAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgICAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgICAgICBjbGFzcyBXKENvbW1vblRyZWUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlblR5cGUsIHR4dCk6CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKFcsIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVG9rZW4odHlwZT10b2tlblR5cGUsIHRleHQ9dHh0KSkKKworICAgICAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4udGV4dCArICI8Vz4iCisgICAgICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgOiBpZCAoJywnIGlkKSogLT4gXihMSVNUPFc+WyJMSVNUIl0gaWQrKTsKKyAgICAgICAgICAgIGlkIDogSUQgLT4gSUQ8Vj47CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhLGIsYyIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIihMSVNUPFc+IGE8Vj4gYjxWPiBjPFY+KSIsIGZvdW5kKQorCisgICAgZGVmIHRlc3RDb3B5U2VtYW50aWNzV2l0aEhldGVybyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGhlYWRlciB7CisgICAgICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgICAgIGRlZiBkdXBOb2RlKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVihzZWxmKQorCisgICAgICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgSUQpKzsKKyAgICAgICAgICAgIHR5cGUgOiAnaW50JzxWPiA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iaW50IGEsIGIsIGM7IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIihpbnQ8Vj4gYSkgKGludDxWPiBiKSAoaW50PFY+IGMpIiwgZm91bmQpCisKKyAgICAjIFRSRUUgUEFSU0VSUyAtLSBSRVdSSVRFIEFTVAorCisgICAgZGVmIHRlc3RUcmVlUGFyc2VyUmV3cml0ZUZsYXRMaXN0KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDEzOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIElOVDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMTM7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTM7CisgICAgICAgIH0KKyAgICAgICAgQGhlYWRlciB7CisgICAgICAgIGNsYXNzIFYoQ29tbW9uVHJlZSk6CisgICAgICAgICAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworICAgICAgICBjbGFzcyBXKENvbW1vblRyZWUpOgorICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRva2VuLnRleHQgKyAiPFc+IgorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgSU5UIC0+IElOVDxWPiBJRDxXPgorICAgICAgICAgIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYWJjIDM0IgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIzNDxWPiBhYmM8Vz4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUcmVlUGFyc2VyUmV3cml0ZVRyZWUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMTQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgSU5UOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICB0cmVlIGdyYW1tYXIgVFAxNDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQxNDsKKyAgICAgICAgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIGNsYXNzIFcoQ29tbW9uVHJlZSk6CisgICAgICAgICAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW4udGV4dCArICI8Vz4iCisgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBJTlQgLT4gXihJTlQ8Vj4gSUQ8Vz4pCisgICAgICAgICAgOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhYmMgMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIigzNDxWPiBhYmM8Vz4pIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnkoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUMTU7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICB0cmVlR3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICB0cmVlIGdyYW1tYXIgVFAxNTsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICB0b2tlblZvY2FiPVQxNTsKKyAgICAgICAgfQorICAgICAgICB0b2tlbnMgeyBST09UOyB9CisgICAgICAgIEBoZWFkZXIgeworICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuVHlwZSk6CisgICAgICAgICAgICAgICAgQ29tbW9uVHJlZS5fX2luaXRfXyhzZWxmLCBDb21tb25Ub2tlbih0b2tlblR5cGUpKQorCisgICAgICAgICAgICBkZWYgdG9TdHJpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuTmFtZXNbc2VsZi50b2tlbi50eXBlXSArICI8Vj4iCisgICAgICAgICAgICBfX3N0cl9fID0gdG9TdHJpbmcKKworCisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIC0+IFJPT1Q8Vj4gSUQKKyAgICAgICAgICA7CisgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1RyZWVQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICB0cmVlR3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgaW5wdXQ9ImFiYyIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiUk9PVDxWPiBhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeVdpdGhBcmdzKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDE2OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMTY7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTY7CisgICAgICAgIH0KKyAgICAgICAgdG9rZW5zIHsgUk9PVDsgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlblR5cGUsIHgpOgorICAgICAgICAgICAgICAgIENvbW1vblRyZWUuX19pbml0X18oc2VsZiwgQ29tbW9uVG9rZW4odG9rZW5UeXBlKSkKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5OYW1lc1tzZWxmLnRva2VuLnR5cGVdICsgIjxWPjsiICsgc3RyKHNlbGYueCkKKyAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIC0+IFJPT1Q8Vj5bNDJdIElECisgICAgICAgICAgOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhYmMiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIlJPT1Q8Vj47NDIgYWJjIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnlSb290KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDE3OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEIDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgdHJlZSBncmFtbWFyIFRQMTc7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgdG9rZW5Wb2NhYj1UMTc7CisgICAgICAgIH0KKyAgICAgICAgdG9rZW5zIHsgUk9PVDsgfQorICAgICAgICBAaGVhZGVyIHsKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlblR5cGUpOgorICAgICAgICAgICAgICAgIENvbW1vblRyZWUuX19pbml0X18oc2VsZiwgQ29tbW9uVG9rZW4odG9rZW5UeXBlKSkKKworICAgICAgICAgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbk5hbWVzW3NlbGYudG9rZW4udHlwZV0gKyAiPFY+IgorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgLT4gXihST09UPFY+IElEKQorICAgICAgICAgIDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjVHJlZVBhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYWJjIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIoUk9PVDxWPiBhYmMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnlGcm9tUmVhbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQxODsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIHRyZWUgZ3JhbW1hciBUUDE4OworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIHRva2VuVm9jYWI9VDE4OworICAgICAgICB9CisgICAgICAgIHRva2VucyB7IFJPT1Q7IH0KKyAgICAgICAgQGhlYWRlciB7CisgICAgICAgIGNsYXNzIFYoQ29tbW9uVHJlZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5UeXBlLCB0cmVlPU5vbmUpOgorICAgICAgICAgICAgICAgIGlmIHRyZWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZS5fX2luaXRfXyhzZWxmLCBDb21tb25Ub2tlbih0b2tlblR5cGUpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUuX19pbml0X18oc2VsZiwgdHJlZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbi50eXBlID0gdG9rZW5UeXBlCisKKyAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5OYW1lc1tzZWxmLnRva2VuLnR5cGVdKyI8Vj5AIitzdHIoc2VsZi50b2tlbi5saW5lKQorICAgICAgICAgICAgX19zdHJfXyA9IHRvU3RyaW5nCisKKyAgICAgICAgfQorICAgICAgICBhIDogSUQgLT4gUk9PVDxWPlskSURdCisgICAgICAgICAgOworICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhYmMiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIlJPT1Q8Vj5AMSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRyZWVQYXJzZXJBdXRvSGV0ZXJvQVNUKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogSUQgJzsnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgdHJlZSBncmFtbWFyIFRQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICAgICAgdG9rZW5Wb2NhYj1UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW5zIHsgUk9PVDsgfQorICAgICAgICAgICAgQGhlYWRlciB7CisgICAgICAgICAgICBjbGFzcyBWKENvbW1vblRyZWUpOgorICAgICAgICAgICAgICAgIGRlZiB0b1N0cmluZyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbW1vblRyZWUudG9TdHJpbmcoc2VsZikgKyAiPFY+IgorICAgICAgICAgICAgICAgIF9fc3RyX18gPSB0b1N0cmluZworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEgOiBJRDxWPiAnOyc8Vj47CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNUcmVlUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgdHJlZUdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhYmM7IgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmM8Vj4gOzxWPiIsIGZvdW5kKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1NG1haW4ucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1NG1haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyNjUxMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDU0bWFpbi5weQpAQCAtMCwwICsxLDMxOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCBhbnRscjMudHJlZQoraW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgc3lzCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitjbGFzcyBUKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9sZFBhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2VsZi5iYXNlRGlyKQorCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wYXRoID0gc2VsZi5vbGRQYXRoCisKKworICAgIGRlZiB0ZXN0T3ZlcnJpZGVNYWluKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiImxleGVyIGdyYW1tYXIgVDM7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBQeXRob247CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQG1haW4geworICAgICAgICAgICAgZGVmIG1haW4oYXJndik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJubyIpCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElEOiAoJ2EnLi4neicgfCAnXHUwMGMwJy4uJ1x1MDBmZicpKzsKKyAgICAgICAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgICAgICAgICAiIiIpCisKKworICAgICAgICBzdGRvdXQgPSBTdHJpbmdJTygpCisKKyAgICAgICAgbGV4ZXJNb2QgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIsIHJldHVybk1vZHVsZT1UcnVlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsZXhlck1vZC5tYWluKAorICAgICAgICAgICAgWydsZXhlci5weSddCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdExleGVyRnJvbUZpbGUoc2VsZik6CisgICAgICAgIGlucHV0ID0gImZvbyBiYXIiCisgICAgICAgIGlucHV0UGF0aCA9IHNlbGYud3JpdGVGaWxlKCJpbnB1dC50eHQiLCBpbnB1dCkKKworICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiImxleGVyIGdyYW1tYXIgVDE7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBQeXRob247CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSUQ6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgICAgICAgICAiIiIpCisKKworICAgICAgICBzdGRvdXQgPSBTdHJpbmdJTygpCisKKyAgICAgICAgbGV4ZXJNb2QgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIsIHJldHVybk1vZHVsZT1UcnVlKQorICAgICAgICBsZXhlck1vZC5tYWluKAorICAgICAgICAgICAgWydsZXhlci5weScsIGlucHV0UGF0aF0sCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN0ZG91dC5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKSksIDMpCisKKworICAgIGRlZiB0ZXN0TGV4ZXJGcm9tU3RkSU8oc2VsZik6CisgICAgICAgIGlucHV0ID0gImZvbyBiYXIiCisKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiJsZXhlciBncmFtbWFyIFQyOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlID0gUHl0aG9uOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElEOiAnYScuLid6Jys7CisgICAgICAgICAgICBXUzogJyAnKyB7ICRjaGFubmVsID0gSElEREVOOyB9OworICAgICAgICAgICAgIiIiKQorCisKKyAgICAgICAgc3Rkb3V0ID0gU3RyaW5nSU8oKQorCisgICAgICAgIGxleGVyTW9kID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyLCByZXR1cm5Nb2R1bGU9VHJ1ZSkKKyAgICAgICAgbGV4ZXJNb2QubWFpbigKKyAgICAgICAgICAgIFsnbGV4ZXIucHknXSwKKyAgICAgICAgICAgIHN0ZGluPVN0cmluZ0lPKGlucHV0KSwKKyAgICAgICAgICAgIHN0ZG91dD1zdGRvdXQKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oc3Rkb3V0LmdldHZhbHVlKCkuc3BsaXRsaW5lcygpKSwgMykKKworCisgICAgZGVmIHRlc3RMZXhlckVuY29kaW5nKHNlbGYpOgorICAgICAgICBpbnB1dCA9IHUiZsO2w7YgYsOkciIuZW5jb2RlKCd1dGYtOCcpCisKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiJsZXhlciBncmFtbWFyIFQzOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlID0gUHl0aG9uOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElEOiAoJ2EnLi4neicgfCAnXHUwMGMwJy4uJ1x1MDBmZicpKzsKKyAgICAgICAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgICAgICAgICAiIiIpCisKKworICAgICAgICBzdGRvdXQgPSBTdHJpbmdJTygpCisKKyAgICAgICAgbGV4ZXJNb2QgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIsIHJldHVybk1vZHVsZT1UcnVlKQorICAgICAgICBsZXhlck1vZC5tYWluKAorICAgICAgICAgICAgWydsZXhlci5weScsICctLWVuY29kaW5nJywgJ3V0Zi04J10sCisgICAgICAgICAgICBzdGRpbj1TdHJpbmdJTyhpbnB1dCksCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN0ZG91dC5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKSksIDMpCisKKworICAgIGRlZiB0ZXN0Q29tYmluZWQoc2VsZik6CisgICAgICAgIGlucHV0ID0gImZvbyBiYXIiCisKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHIiIiJncmFtbWFyIFQ0OworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlID0gUHl0aG9uOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHIgcmV0dXJucyBbcmVzXTogKElEKSsgRU9GIHsgJHJlcyA9ICR0ZXh0OyB9OworCisgICAgICAgICAgICBJRDogJ2EnLi4neicrOworICAgICAgICAgICAgV1M6ICcgJysgeyAkY2hhbm5lbCA9IEhJRERFTjsgfTsKKyAgICAgICAgICAgICIiIikKKworCisgICAgICAgIHN0ZG91dCA9IFN0cmluZ0lPKCkKKworICAgICAgICBsZXhlck1vZCwgcGFyc2VyTW9kID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyLCByZXR1cm5Nb2R1bGU9VHJ1ZSkKKyAgICAgICAgcGFyc2VyTW9kLm1haW4oCisgICAgICAgICAgICBbJ2NvbWJpbmVkLnB5JywgJy0tcnVsZScsICdyJ10sCisgICAgICAgICAgICBzdGRpbj1TdHJpbmdJTyhpbnB1dCksCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN0ZG91dC5zcGxpdGxpbmVzKCkpLCAxLCBzdGRvdXQpCisKKworICAgIGRlZiB0ZXN0Q29tYmluZWRPdXRwdXRBU1Qoc2VsZik6CisgICAgICAgIGlucHV0ID0gImZvbyArIGJhciIKKworICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgciIiImdyYW1tYXIgVDU7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBQeXRob247CisgICAgICAgICAgICAgIG91dHB1dCA9IEFTVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcjogSUQgT1BeIElEIEVPRiE7CisKKyAgICAgICAgICAgIElEOiAnYScuLid6Jys7CisgICAgICAgICAgICBPUDogJysnOworICAgICAgICAgICAgV1M6ICcgJysgeyAkY2hhbm5lbCA9IEhJRERFTjsgfTsKKyAgICAgICAgICAgICIiIikKKworCisgICAgICAgIHN0ZG91dCA9IFN0cmluZ0lPKCkKKworICAgICAgICBsZXhlck1vZCwgcGFyc2VyTW9kID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyLCByZXR1cm5Nb2R1bGU9VHJ1ZSkKKyAgICAgICAgcGFyc2VyTW9kLm1haW4oCisgICAgICAgICAgICBbJ2NvbWJpbmVkLnB5JywgJy0tcnVsZScsICdyJ10sCisgICAgICAgICAgICBzdGRpbj1TdHJpbmdJTyhpbnB1dCksCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdGRvdXQsICIoKyBmb28gYmFyKSIpCisKKworICAgIGRlZiB0ZXN0VHJlZVBhcnNlcihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJydncmFtbWFyIFQ2OworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlID0gUHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQgPSBBU1Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHI6IElEIE9QXiBJRCBFT0YhOworCisgICAgICAgICAgICBJRDogJ2EnLi4neicrOworICAgICAgICAgICAgT1A6ICcrJzsKKyAgICAgICAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycndHJlZSBncmFtbWFyIFQ2V2Fsa2VyOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgICAgIHRva2VuVm9jYWI9VDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByIHJldHVybnMgW3Jlc106IF4oT1AgYT1JRCBiPUlEKQorICAgICAgICAgICAgICB7ICRyZXMgPSAiXCVzIFwlcyBcJXMiIFwlICgkYS50ZXh0LCAkT1AudGV4dCwgJGIudGV4dCkgfQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgbGV4ZXJNb2QsIHBhcnNlck1vZCA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hciwgcmV0dXJuTW9kdWxlPVRydWUpCisgICAgICAgIHdhbGtlck1vZCA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIodHJlZUdyYW1tYXIsIHJldHVybk1vZHVsZT1UcnVlKQorCisgICAgICAgIHN0ZG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgd2Fsa2VyTW9kLm1haW4oCisgICAgICAgICAgICBbJ3dhbGtlci5weScsICctLXJ1bGUnLCAncicsICctLXBhcnNlcicsICdUNlBhcnNlcicsICctLXBhcnNlci1ydWxlJywgJ3InLCAnLS1sZXhlcicsICdUNkxleGVyJ10sCisgICAgICAgICAgICBzdGRpbj1TdHJpbmdJTygiYStiIiksCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdGRvdXQsICJ1J2EgKyBiJyIpCisKKworICAgIGRlZiB0ZXN0VHJlZVBhcnNlclJld3JpdGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUNzsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICBsYW5ndWFnZSA9IFB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0ID0gQVNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByOiBJRCBPUF4gSUQgRU9GITsKKworICAgICAgICAgICAgSUQ6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIE9QOiAnKyc7CisgICAgICAgICAgICBXUzogJyAnKyB7ICRjaGFubmVsID0gSElEREVOOyB9OworICAgICAgICAgICAgJycnKQorCisgICAgICAgIHRyZWVHcmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ3RyZWUgZ3JhbW1hciBUN1dhbGtlcjsKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICAgICAgICB0b2tlblZvY2FiPVQ3OworICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW5zIHsKKyAgICAgICAgICAgICAgQVJHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcjogXihPUCBhPUlEIGI9SUQpIC0+IF4oT1AgXihBUkcgSUQpIF4oQVJHIElEKSk7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgbGV4ZXJNb2QsIHBhcnNlck1vZCA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hciwgcmV0dXJuTW9kdWxlPVRydWUpCisgICAgICAgIHdhbGtlck1vZCA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIodHJlZUdyYW1tYXIsIHJldHVybk1vZHVsZT1UcnVlKQorCisgICAgICAgIHN0ZG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgd2Fsa2VyTW9kLm1haW4oCisgICAgICAgICAgICBbJ3dhbGtlci5weScsICctLXJ1bGUnLCAncicsICctLXBhcnNlcicsICdUN1BhcnNlcicsICctLXBhcnNlci1ydWxlJywgJ3InLCAnLS1sZXhlcicsICdUN0xleGVyJ10sCisgICAgICAgICAgICBzdGRpbj1TdHJpbmdJTygiYStiIiksCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdGRvdXQsICIoKyAoQVJHIGEpIChBUkcgYikpIikKKworCisKKyAgICBkZWYgdGVzdEdyYW1tYXJJbXBvcnQoc2VsZik6CisgICAgICAgIHNsYXZlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgcGFyc2VyIGdyYW1tYXIgVDhTOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYSA6IEI7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgcGFyc2VyTmFtZSA9IHNlbGYud3JpdGVJbmxpbmVHcmFtbWFyKHNsYXZlKVswXQorICAgICAgICAjIHNsYXZlIHBhcnNlcnMgYXJlIGltcG9ydGVkIGFzIG5vcm1hbCBweXRob24gbW9kdWxlcworICAgICAgICAjIHRvIGZvcmNlIHJlbG9hZGluZyBjdXJyZW50IHZlcnNpb24sIHB1cmdlIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1twYXJzZXJOYW1lKydQYXJzZXInXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbWFzdGVyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOE07CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1wb3J0IFQ4UzsKKyAgICAgICAgICAgIHMgcmV0dXJucyBbcmVzXTogYSB7ICRyZXMgPSAkYS50ZXh0IH07CisgICAgICAgICAgICBCIDogJ2InIDsgLy8gZGVmaW5lcyBCIGZyb20gaW5oZXJpdGVkIHRva2VuIHNwYWNlCisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykge3NlbGYuc2tpcCgpfSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgc3Rkb3V0ID0gU3RyaW5nSU8oKQorCisgICAgICAgIGxleGVyTW9kLCBwYXJzZXJNb2QgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKG1hc3RlciwgcmV0dXJuTW9kdWxlPVRydWUpCisgICAgICAgIHBhcnNlck1vZC5tYWluKAorICAgICAgICAgICAgWydpbXBvcnQucHknLCAnLS1ydWxlJywgJ3MnXSwKKyAgICAgICAgICAgIHN0ZGluPVN0cmluZ0lPKCJiIiksCisgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0CisgICAgICAgICAgICApCisKKyAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdGRvdXQsICJ1J2InIikKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTV0ZW1wbGF0ZXMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1NXRlbXBsYXRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDkwYjAxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTV0ZW1wbGF0ZXMucHkKQEAgLTAsMCArMSw1MDggQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgYW50bHIzCitpbXBvcnQgYW50bHIzLnRyZWUKK2ltcG9ydCBzdHJpbmd0ZW1wbGF0ZTMKK2ltcG9ydCB0ZXN0YmFzZQoraW1wb3J0IHN5cworaW1wb3J0IG9zCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitjbGFzcyBUKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIGV4ZWNQYXJzZXIoc2VsZiwgZ3JhbW1hciwgZ3JhbW1hckVudHJ5LCBpbnB1dCwgZ3JvdXA9Tm9uZSk6CisgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgIGxleGVyID0gbGV4ZXJDbHMoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGFyc2VyLnRlbXBsYXRlTGliID0gZ3JvdXAKKyAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihwYXJzZXIsIGdyYW1tYXJFbnRyeSkoKQorICAgICAgICBpZiByZXN1bHQuc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnN0LnRvU3RyaW5nKCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCisgICAgZGVmIHRlc3RJbmxpbmVUZW1wbGF0ZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJydncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogSUQgSU5UCisgICAgICAgICAgICAgIC0+IHRlbXBsYXRlKGlkPXskSUQudGV4dH0sIGludD17JElOVC50ZXh0fSkKKyAgICAgICAgICAgICAgICAgImlkPTxpZD4sIGludD08aW50PiIKKyAgICAgICAgICAgIDsKKworICAgICAgICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyAzNCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiaWQ9YWJjLCBpbnQ9MzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RFeHRlcm5hbFRlbXBsYXRlKHNlbGYpOgorICAgICAgICB0ZW1wbGF0ZXMgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICAnJydcCisgICAgICAgICAgICBncm91cCBUOworICAgICAgICAgICAgZXhwcihhcmdzLCBvcCkgOjo9IDw8CisgICAgICAgICAgICBbPGFyZ3M7IHNlcGFyYXRvcj17PG9wPn0+XQorICAgICAgICAgICAgPj4KKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGdyb3VwID0gc3RyaW5ndGVtcGxhdGUzLlN0cmluZ1RlbXBsYXRlR3JvdXAoCisgICAgICAgICAgICBmaWxlPVN0cmluZ0lPKHRlbXBsYXRlcyksCisgICAgICAgICAgICBsZXhlcj0nYW5nbGUtYnJhY2tldCcKKyAgICAgICAgICAgICkKKworICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDI7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhIDogcis9YXJnIE9QIHIrPWFyZworICAgICAgICAgICAgICAtPiBleHByKG9wPXskT1AudGV4dH0sIGFyZ3M9eyRyfSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGFyZzogSUQgLT4gdGVtcGxhdGUodD17JElELnRleHR9KSAiPHQ+IjsKKworICAgICAgICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICAgICAgICBPUDogJysnOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICkKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhICsgYiIsCisgICAgICAgICAgICBncm91cAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJbYStiXSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEVtcHR5VGVtcGxhdGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IElEIElOVAorICAgICAgICAgICAgICAtPgorICAgICAgICAgICAgOworCisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIDM0IgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb3VuZCBpcyBOb25lKQorCisKKyAgICBkZWYgdGVzdExpc3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYTogKHIrPWIpKiBFT0YKKyAgICAgICAgICAgICAgLT4gdGVtcGxhdGUocj17JHJ9KQorICAgICAgICAgICAgICAgICAiPHI7IHNlcGFyYXRvcj1cIixcIj4iCisgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIGI6IElECisgICAgICAgICAgICAgIC0+IHRlbXBsYXRlKHQ9eyRJRC50ZXh0fSkgIjx0PiIKKyAgICAgICAgICAgIDsKKworICAgICAgICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyBkZWYgZ2hpIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhYmMsZGVmLGdoaSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEFjdGlvbihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJydncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhOiBJRAorICAgICAgICAgICAgICAtPiB7IHN0cmluZ3RlbXBsYXRlMy5TdHJpbmdUZW1wbGF0ZSgiaGVsbG8iKSB9CisgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICkKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgICJhYmMiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImhlbGxvIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VGVtcGxhdGVFeHByZXNzaW9uSW5BY3Rpb24oc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYTogSUQKKyAgICAgICAgICAgICAgeyAkc3QgPSAleyJoZWxsbyJ9IH0KKyAgICAgICAgICAgIDsKKworICAgICAgICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiaGVsbG8iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUZW1wbGF0ZUV4cHJlc3Npb25JbkFjdGlvbjIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYTogSUQKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcyA9ICV7ImhlbGxvIDxmb28+In0KKyAgICAgICAgICAgICAgICAlcmVzLmZvbyA9ICJ3b3JsZCI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLT4geyByZXMgfQorICAgICAgICAgICAgOworCisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYWJjIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJoZWxsbyB3b3JsZCIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEluZGlyZWN0VGVtcGxhdGVDb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgdGVtcGxhdGVzID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgJycnXAorICAgICAgICAgICAgZ3JvdXAgVDsKKyAgICAgICAgICAgIGV4cHIoYXJncywgb3ApIDo6PSA8PAorICAgICAgICAgICAgWzxhcmdzOyBzZXBhcmF0b3I9ezxvcD59Pl0KKyAgICAgICAgICAgID4+CisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICkKKworICAgICAgICBncm91cCA9IHN0cmluZ3RlbXBsYXRlMy5TdHJpbmdUZW1wbGF0ZUdyb3VwKAorICAgICAgICAgICAgZmlsZT1TdHJpbmdJTyh0ZW1wbGF0ZXMpLAorICAgICAgICAgICAgbGV4ZXI9J2FuZ2xlLWJyYWNrZXQnCisgICAgICAgICAgICApCisKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJydncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhOiBJRAorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJHN0ID0gJSh7ImV4cHIifSkoYXJncz17WzEsIDIsIDNdfSwgb3A9eyIrIn0pCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDsKKworICAgICAgICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyIsCisgICAgICAgICAgICBncm91cAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJbMSsyKzNdIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UHJlZGljYXRlcyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJydncmFtbWFyIFQzOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IElEIElOVAorICAgICAgICAgICAgICAtPiB7JElELnRleHQ9PSdhJ30/IHRlbXBsYXRlKGludD17JElOVC50ZXh0fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQTogPGludD4iCisgICAgICAgICAgICAgIC0+IHskSUQudGV4dD09J2InfT8gdGVtcGxhdGUoaW50PXskSU5ULnRleHR9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCOiA8aW50PiIKKyAgICAgICAgICAgICAgLT4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZShpbnQ9eyRJTlQudGV4dH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6IDxpbnQ+IgorICAgICAgICAgICAgOworCisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICAiYiAzNCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiQjogMzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RCYWNrdHJhY2tpbmdNb2RlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDQ7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgICAgICAgIGJhY2t0cmFjaz10cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYSA6IChJRCBJTlQpPT4gSUQgSU5UCisgICAgICAgICAgICAgIC0+IHRlbXBsYXRlKGlkPXskSUQudGV4dH0sIGludD17JElOVC50ZXh0fSkKKyAgICAgICAgICAgICAgICAgImlkPTxpZD4sIGludD08aW50PiIKKyAgICAgICAgICAgIDsKKworICAgICAgICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgImFiYyAzNCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiaWQ9YWJjLCBpbnQ9MzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDU7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgICAgICAgIHJld3JpdGU9dHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvZzogc3RhdCs7CisKKyAgICAgICAgICAgIHN0YXQKKyAgICAgICAgICAgICAgICA6ICdpZicgJygnIGV4cHIgJyknIHN0YXQKKyAgICAgICAgICAgICAgICB8ICdyZXR1cm4nIHJldHVybl9leHByICc7JworICAgICAgICAgICAgICAgIHwgJ3snIHN0YXQqICd9JworICAgICAgICAgICAgICAgIHwgSUQgJz0nIGV4cHIgJzsnCisgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICByZXR1cm5fZXhwcgorICAgICAgICAgICAgICAgIDogZXhwcgorICAgICAgICAgICAgICAgICAgLT4gdGVtcGxhdGUodD17JHRleHR9KSA8PGJvb20oPHQ+KT4+CisgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICBleHByCisgICAgICAgICAgICAgICAgOiBJRAorICAgICAgICAgICAgICAgIHwgSU5UCisgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICBJRDogICdhJy4uJ3onKzsKKyAgICAgICAgICAgIElOVDogJzAnLi4nOScrOworICAgICAgICAgICAgV1M6ICgnICd8J1xuJykrIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICBDT01NRU5UOiAnLyonIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnKi8nIHskY2hhbm5lbCA9IEhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGlucHV0ID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgJycnXAorICAgICAgICAgICAgaWYgKCBmb28gKSB7CisgICAgICAgICAgICAgIGIgPSAvKiBibGEgKi8gMjsKKyAgICAgICAgICAgICAgcmV0dXJuIDEgLyogZm9vICovOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnbnVyeiAqLworICAgICAgICAgICAgcmV0dXJuIDEyOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgbGV4ZXJDbHMsIHBhcnNlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hcikKKworICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBsZXhlckNscyhjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLlRva2VuUmV3cml0ZVN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wcm9nKCkKKworICAgICAgICBmb3VuZCA9IHRTdHJlYW0udG9TdHJpbmcoKQorCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgJycnXAorICAgICAgICAgICAgaWYgKCBmb28gKSB7CisgICAgICAgICAgICAgIGIgPSAvKiBibGEgKi8gMjsKKyAgICAgICAgICAgICAgcmV0dXJuIGJvb20oMSkgLyogZm9vICovOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnbnVyeiAqLworICAgICAgICAgICAgcmV0dXJuIGJvb20oMTIpOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0ZWQsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRyZWVSZXdyaXRlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJ2dyYW1tYXIgVDY7CisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b2tlbnMgeworICAgICAgICAgICAgICBCTE9DSzsKKyAgICAgICAgICAgICAgQVNTSUdOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9nOiBzdGF0KzsKKworICAgICAgICAgICAgc3RhdAorICAgICAgICAgICAgICAgIDogSUYgJygnIGU9ZXhwciAnKScgcz1zdGF0CisgICAgICAgICAgICAgICAgICAtPiBeKElGICRlICRzKQorICAgICAgICAgICAgICAgIHwgUkVUVVJOIGV4cHIgJzsnCisgICAgICAgICAgICAgICAgICAtPiBeKFJFVFVSTiBleHByKQorICAgICAgICAgICAgICAgIHwgJ3snIHN0YXQqICd9JworICAgICAgICAgICAgICAgICAgLT4gXihCTE9DSyBzdGF0KikKKyAgICAgICAgICAgICAgICB8IElEICc9JyBleHByICc7JworICAgICAgICAgICAgICAgICAgLT4gXihBU1NJR04gSUQgZXhwcikKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIGV4cHIKKyAgICAgICAgICAgICAgICA6IElECisgICAgICAgICAgICAgICAgfCBJTlQKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIElGOiAnaWYnOworICAgICAgICAgICAgUkVUVVJOOiAncmV0dXJuJzsKKyAgICAgICAgICAgIElEOiAgJ2EnLi4neicrOworICAgICAgICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUzogKCcgJ3wnXG4nKSsgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgIENPTU1FTlQ6ICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLikqICcqLycgeyRjaGFubmVsID0gSElEREVOO30gOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgdHJlZUdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycndHJlZSBncmFtbWFyIFQ2V2Fsa2VyOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgICAgdG9rZW5Wb2NhYj1UNjsKKyAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgICAgICAgIG91dHB1dD10ZW1wbGF0ZTsKKyAgICAgICAgICAgICAgcmV3cml0ZT10cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm9nOiBzdGF0KzsKKworICAgICAgICAgICAgc3RhdAorICAgICAgICAgICAgICAgIDogXihJRiBleHByIHN0YXQpCisgICAgICAgICAgICAgICAgfCBeKFJFVFVSTiByZXR1cm5fZXhwcikKKyAgICAgICAgICAgICAgICB8IF4oQkxPQ0sgc3RhdCopCisgICAgICAgICAgICAgICAgfCBeKEFTU0lHTiBJRCBleHByKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgcmV0dXJuX2V4cHIKKyAgICAgICAgICAgICAgICA6IGV4cHIKKyAgICAgICAgICAgICAgICAgIC0+IHRlbXBsYXRlKHQ9eyR0ZXh0fSkgPDxib29tKDx0Pik+PgorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgZXhwcgorICAgICAgICAgICAgICAgIDogSUQKKyAgICAgICAgICAgICAgICB8IElOVAorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgKQorCisgICAgICAgIGlucHV0ID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgJycnXAorICAgICAgICAgICAgaWYgKCBmb28gKSB7CisgICAgICAgICAgICAgIGIgPSAvKiBibGEgKi8gMjsKKyAgICAgICAgICAgICAgcmV0dXJuIDEgLyogZm9vICovOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnbnVyeiAqLworICAgICAgICAgICAgcmV0dXJuIDEyOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgbGV4ZXJDbHMsIHBhcnNlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hcikKKyAgICAgICAgd2Fsa2VyQ2xzID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcih0cmVlR3JhbW1hcikKKworICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBsZXhlckNscyhjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLlRva2VuUmV3cml0ZVN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIHRyZWUgPSBwYXJzZXIucHJvZygpLnRyZWUKKyAgICAgICAgbm9kZXMgPSBhbnRscjMudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbSh0cmVlKQorICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0U3RyZWFtKQorICAgICAgICB3YWxrZXIgPSB3YWxrZXJDbHMobm9kZXMpCisgICAgICAgIHdhbGtlci5wcm9nKCkKKworICAgICAgICBmb3VuZCA9IHRTdHJlYW0udG9TdHJpbmcoKQorCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgJycnXAorICAgICAgICAgICAgaWYgKCBmb28gKSB7CisgICAgICAgICAgICAgIGIgPSAvKiBibGEgKi8gMjsKKyAgICAgICAgICAgICAgcmV0dXJuIGJvb20oMSkgLyogZm9vICovOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnbnVyeiAqLworICAgICAgICAgICAgcmV0dXJuIGJvb20oMTIpOworICAgICAgICAgICAgJycnCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0ZWQsIGZvdW5kKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1NmxleGVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTZsZXhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTNmOTJhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTZsZXhlci5weQpAQCAtMCwwICsxLDQ5IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IGFudGxyMworaW1wb3J0IGFudGxyMy50cmVlCitpbXBvcnQgc3RyaW5ndGVtcGxhdGUzCitpbXBvcnQgdGVzdGJhc2UKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworIyBGSVhNRTogcG9ydCBvdGhlciB0ZXN0cyBmcm9tIFRlc3RMZXhlci5qYXZhCisKK2NsYXNzIFQodGVzdGJhc2UuQU5UTFJUZXN0KToKKyAgICBkZWYgZXhlY1BhcnNlcihzZWxmLCBncmFtbWFyLCBncmFtbWFyRW50cnksIGlucHV0KToKKyAgICAgICAgbGV4ZXJDbHMsIHBhcnNlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoZ3JhbW1hcikKKworICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyAgICAgICAgbGV4ZXIgPSBsZXhlckNscyhjU3RyZWFtKQorICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICBwYXJzZXIgPSBwYXJzZXJDbHModFN0cmVhbSkKKyAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihwYXJzZXIsIGdyYW1tYXJFbnRyeSkoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgCisKKyAgICBkZWYgdGVzdFJlZlRvUnVsZURvZXNOb3RTZXRDaGFubmVsKHNlbGYpOgorICAgICAgICAjIHRoaXMgbXVzdCBzZXQgY2hhbm5lbCBvZiBBIHRvIEhJRERFTi4gICRjaGFubmVsIGlzIGxvY2FsIHRvIHJ1bGUKKyAgICAgICAgIyBsaWtlICR0eXBlLgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBQOworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEgcmV0dXJucyBbZm9vXTogQSBFT0YgeyAkZm9vID0gJ1wlcywgY2hhbm5lbD1cJWQnIFwlICgkQS50ZXh0LCAkQS5jaGFubmVsKTsgfSA7CisgICAgICAgICAgICBBIDogJy0nIFdTIEkgOworICAgICAgICAgICAgSSA6ICcwJy4uJzknKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKyAgICAgICAgCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgIi0gMzQiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIi0gMzQsIGNoYW5uZWw9MCIsIGZvdW5kKQorCisgICAgICAgIAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDU3YXV0b0FTVC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDU3YXV0b0FTVC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMxZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTdhdXRvQVNULnB5CkBAIC0wLDAgKzEsMTAwNSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCBhbnRscjMudHJlZQoraW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgc3lzCisKK2NsYXNzIFRlc3RBdXRvQVNUKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcnMgPSBbXQorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9ICIiCisKKworICAgICAgICAgICAgZGVmIGNhcHR1cmUoc2VsZiwgdCk6CisgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ICs9IHQKKworCisgICAgICAgICAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJz4nK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJzwnK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXJyb3JzLmFwcGVuZChtc2cpCisKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgPSAiIgorCisKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCArPSB0CisKKworICAgICAgICAgICAgZGVmIHRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc+JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc8JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorCisKKyAgICBkZWYgZXhlY1BhcnNlcihzZWxmLCBncmFtbWFyLCBncmFtbWFyRW50cnksIGlucHV0LCBleHBlY3RFcnJvcnM9RmFsc2UpOgorICAgICAgICBsZXhlckNscywgcGFyc2VyQ2xzID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyKQorCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IGxleGVyQ2xzKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHBhcnNlckNscyh0U3RyZWFtKQorICAgICAgICByID0gZ2V0YXR0cihwYXJzZXIsIGdyYW1tYXJFbnRyeSkoKQorCisgICAgICAgIGlmIG5vdCBleHBlY3RFcnJvcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocGFyc2VyLl9lcnJvcnMpLCAwLCBwYXJzZXIuX2Vycm9ycykKKworICAgICAgICByZXN1bHQgPSAiIgorCisgICAgICAgIGlmIHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHIsICdyZXN1bHQnKToKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gci5yZXN1bHQKKworICAgICAgICAgICAgaWYgci50cmVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSByLnRyZWUudG9TdHJpbmdUcmVlKCkKKworICAgICAgICBpZiBub3QgZXhwZWN0RXJyb3JzOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LCBwYXJzZXIuX2Vycm9ycworCisKKyAgICBkZWYgZXhlY1RyZWVQYXJzZXIoc2VsZiwgZ3JhbW1hciwgZ3JhbW1hckVudHJ5LCB0cmVlR3JhbW1hciwgdHJlZUVudHJ5LCBpbnB1dCk6CisgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisgICAgICAgIHdhbGtlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIodHJlZUdyYW1tYXIpCisKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgIGxleGVyID0gbGV4ZXJDbHMoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIHIgPSBnZXRhdHRyKHBhcnNlciwgZ3JhbW1hckVudHJ5KSgpCisgICAgICAgIG5vZGVzID0gYW50bHIzLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci50cmVlKQorICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0U3RyZWFtKQorICAgICAgICB3YWxrZXIgPSB3YWxrZXJDbHMobm9kZXMpCisgICAgICAgIHIgPSBnZXRhdHRyKHdhbGtlciwgdHJlZUVudHJ5KSgpCisKKyAgICAgICAgaWYgciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiByLnRyZWUudG9TdHJpbmdUcmVlKCkKKworICAgICAgICByZXR1cm4gIiIKKworCisgICAgZGVmIHRlc3RUb2tlbkxpc3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fTsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpOworCisKKyAgICBkZWYgdGVzdFRva2VuTGlzdEluU2luZ2xlQWx0QmxvY2soc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiAoSUQgSU5UKSA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCJhIiwgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhYmMgMzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTaW1wbGVSb290QXRPdXRlckxldmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBmb287CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUReIElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGFiYyAzNCkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTaW1wbGVSb290QXRPdXRlckxldmVsUmV2ZXJzZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJTlQgSUReIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjM0IGFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoYWJjIDM0KSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEJhbmcoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UISBJRCEgSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyAzNCBkYWcgNDUzMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhYmMgNDUzMiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE9wdGlvbmFsVGhlblJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogKCBJRCBJTlQgKT8gSUReIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgMSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihiIGEgMSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RMYWJlbGVkU3RyaW5nUm9vdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiB2PSd2b2lkJ14gSUQgJzsnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgInZvaWQgZm9vOyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIodm9pZCBmb28gOykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiB2PSd2b2lkJ14gLiAnOycgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAidm9pZCBmb287IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIih2b2lkIGZvbyA7KSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFdpbGRjYXJkUm9vdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiB2PSd2b2lkJyAuXiAnOycgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAidm9pZCBmb287IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihmb28gdm9pZCA7KSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFdpbGRjYXJkUm9vdFdpdGhMYWJlbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiB2PSd2b2lkJyB4PS5eICc7JyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJ2b2lkIGZvbzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGZvbyB2b2lkIDspIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0V2lsZGNhcmRSb290V2l0aExpc3RMYWJlbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiB2PSd2b2lkJyB4PS5eICc7JyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJ2b2lkIGZvbzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGZvbyB2b2lkIDspIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0V2lsZGNhcmRCYW5nV2l0aExpc3RMYWJlbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiB2PSd2b2lkJyB4PS4hICc7JyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJ2b2lkIGZvbzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygidm9pZCA7IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Um9vdFJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUReIElOVF4gSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSAzNCBjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIigzNCBhIGMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Um9vdFJvb3QyKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIElOVF4gSUReIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgMzQgYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoYyAoMzQgYSkpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Um9vdFRoZW5Sb290SW5Mb29wKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEXiAoSU5UICcqJ14gSUQpKyA7CisgICAgICAgICAgICBJRCAgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSAzNCAqIGIgOSAqIGMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKCogKCogKGEgMzQpIGIgOSkgYykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROZXN0ZWRTdWJydWxlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6ICd2b2lkJyAoKHtwYXNzfUlEfElOVCkgSUQgfCAnbnVsbCcgKSAnOycgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAidm9pZCBhIGI7IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoInZvaWQgYSBiIDsiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RJbnZva2VSdWxlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSAgOiB0eXBlIElEIDsKKyAgICAgICAgICAgIHR5cGUgOiB7cGFzc30naW50JyB8ICdmbG9hdCcgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiaW50IGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiaW50IGEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RJbnZva2VSdWxlQXNSb290KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSAgOiB0eXBlXiBJRCA7CisgICAgICAgICAgICB0eXBlIDoge3Bhc3N9J2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImludCBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihpbnQgYSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RJbnZva2VSdWxlQXNSb290V2l0aExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSAgOiB4PXR5cGVeIElEIDsKKyAgICAgICAgICAgIHR5cGUgOiB7cGFzc30naW50JyB8ICdmbG9hdCcgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiaW50IGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGludCBhKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEludm9rZVJ1bGVBc1Jvb3RXaXRoTGlzdExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSAgOiB4Kz10eXBlXiBJRCA7CisgICAgICAgICAgICB0eXBlIDoge3Bhc3N9J2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImludCBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihpbnQgYSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSdWxlUm9vdEluTG9vcChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAoJysnXiBJRCkqIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImErYitjK2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKCsgKCsgKCsgYSBiKSBjKSBkKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJ1bGVJbnZvY2F0aW9uUnVsZVJvb3RJbkxvb3Aoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgKG9wXiBJRCkqIDsKKyAgICAgICAgICAgIG9wIDoge3Bhc3N9JysnIHwgJy0nIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImErYitjLWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKC0gKCsgKCsgYSBiKSBjKSBkKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRhaWxSZWN1cnNpb24oc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBzIDogYSA7CisgICAgICAgICAgICBhIDogYXRvbSAoJ2V4cCdeIGEpPyA7CisgICAgICAgICAgICBhdG9tIDogSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJzIiwgIjMgZXhwIDQgZXhwIDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGV4cCAzIChleHAgNCA1KSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTZXQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUR8SU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTZXRSb290KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogKCcrJyB8ICctJyleIElEIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIithYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKCsgYWJjKSIsIGZvdW5kKQorCisKKyAgICBAdGVzdGJhc2UuYnJva2VuKAorICAgICAgICAiRkFJTFMgdW50aWwgYW50bHIuZyByZWJ1aWx0IGluIHYzIiwgdGVzdGJhc2UuR3JhbW1hckNvbXBpbGVFcnJvcikKKyAgICBkZWYgdGVzdFNldFJvb3RXaXRoTGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogeD0oJysnIHwgJy0nKV4gSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiK2FiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoKyBhYmMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2V0QXNSdWxlUm9vdEluTG9vcChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAoKCcrJ3wnLScpXiBJRCkqIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImErYi1jIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIigtICgrIGEgYikgYykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROb3RTZXQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogfklEICcrJyBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiMzQrMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIzNCArIDIiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROb3RTZXRXaXRoTGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogeD1+SUQgJysnIElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICIzNCsyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjM0ICsgMiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE5vdFNldFdpdGhMaXN0TGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogeD1+SUQgJysnIElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICIzNCsyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjM0ICsgMiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE5vdFNldFJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogficrJ14gSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjM0IDU1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIigzNCA1NSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROb3RTZXRSb290V2l0aExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IH4nKydeIElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICIzNCA1NSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoMzQgNTUpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Tm90U2V0Um9vdFdpdGhMaXN0TGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogficrJ14gSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjM0IDU1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIigzNCA1NSkiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROb3RTZXRSdWxlUm9vdEluTG9vcChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJTlQgKH5JTlReIElOVCkqIDsKKyAgICAgICAgICAgIGJsb3J0IDogJysnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjMrNCs1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIigrICgrIDMgNCkgNSkiLCBmb3VuZCkKKworCisgICAgQHRlc3RiYXNlLmJyb2tlbigiRklYTUU6IFdoYXQgaGFwcGVuZWQgdG8gdGhlIHNlbWljb2xvbj8iLCBBc3NlcnRpb25FcnJvcikKKyAgICBkZWYgdGVzdFRva2VuTGFiZWxSZXVzZShzZWxmKToKKyAgICAgICAgIyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbSBkdWUgdG8gbXVsdGlwbGUgZGVmaW5lcworICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSByZXR1cm5zIFtyZXN1bHRdIDogaWQ9SUQgaWQ9SUQgeyRyZXN1bHQgPSAiMm5kIGlkPSIrJGlkLnRleHQrIjsiO30gOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjJuZCBpZD1iO2EgYiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRva2VuTGFiZWxSZXVzZTIoc2VsZik6CisgICAgICAgICMgY2hlY2sgZm9yIGNvbXBpbGF0aW9uIHByb2JsZW0gZHVlIHRvIG11bHRpcGxlIGRlZmluZXMKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgcmV0dXJucyBbcmVzdWx0XTogaWQ9SUQgaWQ9SUReIHskcmVzdWx0ID0gIjJuZCBpZD0iKyRpZC50ZXh0KycsJzt9IDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIybmQgaWQ9YiwoYiBhKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRva2VuTGlzdExhYmVsUmV1c2Uoc2VsZik6CisgICAgICAgICMgY2hlY2sgZm9yIGNvbXBpbGF0aW9uIHByb2JsZW0gZHVlIHRvIG11bHRpcGxlIGRlZmluZXMKKyAgICAgICAgIyBtYWtlIHN1cmUgaWRzIGhhcyBib3RoIElEIHRva2VucworICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSByZXR1cm5zIFtyZXN1bHRdIDogaWRzKz1JRCBpZHMrPUlEIHskcmVzdWx0ID0gImlkIGxpc3Q9WyIrIiwiLmpvaW4oW3QudGV4dCBmb3IgdCBpbiAkaWRzXSkrJ10sJzt9IDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIGV4cGVjdGluZyA9ICJpZCBsaXN0PVthLGJdLGEgYiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlbkxpc3RMYWJlbFJldXNlMihzZWxmKToKKyAgICAgICAgIyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbSBkdWUgdG8gbXVsdGlwbGUgZGVmaW5lcworICAgICAgICAjIG1ha2Ugc3VyZSBpZHMgaGFzIGJvdGggSUQgdG9rZW5zCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiBpZHMrPUlEXiBpZHMrPUlEIHskcmVzdWx0ID0gImlkIGxpc3Q9WyIrIiwiLmpvaW4oW3QudGV4dCBmb3IgdCBpbiAkaWRzXSkrJ10sJzt9IDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIGV4cGVjdGluZyA9ICJpZCBsaXN0PVthLGJdLChhIGIpIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRva2VuTGlzdExhYmVsUnVsZVJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogaWQrPUlEXiA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlbkxpc3RMYWJlbEJhbmcoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogaWQrPUlEISA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJ1bGVMaXN0TGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIHJldHVybnMgW3Jlc3VsdF06IHgrPWIgeCs9YiB7CisgICAgICAgICAgICB0PSR4WzFdCisgICAgICAgICAgICAkcmVzdWx0ID0gIjJuZCB4PSIrdC50b1N0cmluZ1RyZWUoKSsnLCc7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYiA6IElEOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjJuZCB4PWIsYSBiIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UnVsZUxpc3RMYWJlbFJ1bGVSb290KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSByZXR1cm5zIFtyZXN1bHRdIDogKCB4Kz1iXiApKyB7CisgICAgICAgICAgICAkcmVzdWx0ID0gIng9IiskeFsxXS50b1N0cmluZ1RyZWUoKSsnLCc7CisgICAgICAgICAgICB9IDsKKyAgICAgICAgICAgIGIgOiBJRDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJ4PShiIGEpLChiIGEpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UnVsZUxpc3RMYWJlbEJhbmcoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiB4Kz1iISB4Kz1iIHsKKyAgICAgICAgICAgICRyZXN1bHQgPSAiMXN0IHg9IiskeFswXS50b1N0cmluZ1RyZWUoKSsnLCc7CisgICAgICAgICAgICB9IDsKKyAgICAgICAgICAgIGIgOiBJRDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIxc3QgeD1hLGIiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb21wbGljYXRlZE1lbGFuZ2Uoc2VsZik6CisgICAgICAgICMgY2hlY2sgZm9yIGNvbXBpbGF0aW9uIHByb2JsZW0KKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBBIGI9QiBiPUIgYys9QyBjKz1DIEQge3MgPSAkRC50ZXh0fSA7CisgICAgICAgICAgICBBIDogJ2EnIDsKKyAgICAgICAgICAgIEIgOiAnYicgOworICAgICAgICAgICAgQyA6ICdjJyA7CisgICAgICAgICAgICBEIDogJ2QnIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiBiIGMgYyBkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiBiIGMgYyBkIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmV0dXJuVmFsdWVXaXRoQVNUKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBmb287CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiBJRCBiIHsgJHJlc3VsdCA9IHN0cigkYi5pKSArICdcbic7fSA7CisgICAgICAgICAgICBiIHJldHVybnMgW2ldIDogSU5UIHskaT1pbnQoJElOVC50ZXh0KTt9IDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIzNFxuYWJjIDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2V0TG9vcChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDsgfQorICAgICAgICAgICAgciA6IChJTlR8SUQpKyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onICsgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScgKzsKKyAgICAgICAgICAgIFdTOiAoJyAnIHwgJ1xuJyB8ICdcXHQnKSsgeyRjaGFubmVsID0gSElEREVOO307CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgInIiLCAiYWJjIDM0IGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IGQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RFeHRyYVRva2VuSW5TaW1wbGVEZWNsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBmb287CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBkZWNsIDogdHlwZV4gSUQgJz0nISBJTlQgJzsnISA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kLCBlcnJvcnMgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImRlY2wiLCAiaW50IDM0IHg9MTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgdSczNCcgZXhwZWN0aW5nIElEIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihpbnQgeCAxKSIsIGZvdW5kKSAjIHRyZWUgZ2V0cyBjb3JyZWN0IHggYW5kIDEgdG9rZW5zCisKKworICAgIGRlZiB0ZXN0TWlzc2luZ0lESW5TaW1wbGVEZWNsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBmb287CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0VYUFI7fQorICAgICAgICAgICAgZGVjbCA6IHR5cGVeIElEICc9JyEgSU5UICc7JyEgOworICAgICAgICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCwgZXJyb3JzID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJkZWNsIiwgImludCA9MTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTo0IG1pc3NpbmcgSUQgYXQgdSc9JyJdLCBlcnJvcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoaW50IDxtaXNzaW5nIElEPiAxKSIsIGZvdW5kKSAjIHRyZWUgZ2V0cyBpbnZlbnRlZCBJRCB0b2tlbgorCisKKyAgICBkZWYgdGVzdE1pc3NpbmdTZXRJblNpbXBsZURlY2woc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7RVhQUjt9CisgICAgICAgICAgICBkZWNsIDogdHlwZV4gSUQgJz0nISBJTlQgJzsnISA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kLCBlcnJvcnMgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImRlY2wiLCAieD0xOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0RXJyb3JzPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsibGluZSAxOjAgbWlzbWF0Y2hlZCBpbnB1dCB1J3gnIGV4cGVjdGluZyBzZXQgTm9uZSJdLCBlcnJvcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoPGVycm9yOiB4PiB4IDEpIiwgZm91bmQpICMgdHJlZSBnZXRzIGludmVudGVkIElEIHRva2VuCisKKworICAgIGRlZiB0ZXN0TWlzc2luZ1Rva2VuR2l2ZXNFcnJvck5vZGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgOyAvLyBmb2xsb3cgaXMgRU9GCisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCwgZXJyb3JzID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyIsIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTozIG1pc3NpbmcgSU5UIGF0ICc8RU9GPiciXSwgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDxtaXNzaW5nIElOVD4iLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RNaXNzaW5nVG9rZW5HaXZlc0Vycm9yTm9kZUluSW52b2tlZFJ1bGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBiIDsKKyAgICAgICAgICAgIGIgOiBJRCBJTlQgOyAvLyBmb2xsb3cgc2hvdWxkIHNlZSBFT0YKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kLCBlcnJvcnMgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYWJjIiwgZXhwZWN0RXJyb3JzPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsibGluZSAxOjMgbWlzbWF0Y2hlZCBpbnB1dCAnPEVPRj4nIGV4cGVjdGluZyBJTlQiXSwgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiPG1pc21hdGNoZWQgdG9rZW46IDxFT0Y+LCByZXN5bmM9YWJjPiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEV4dHJhVG9rZW5HaXZlc0Vycm9yTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgYyA7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgYyA6IElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCwgZXJyb3JzID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyBpY2sgMzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgdSdpY2snIGV4cGVjdGluZyBJTlQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCwgZXJyb3JzID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjM0IiwgZXhwZWN0RXJyb3JzPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsibGluZSAxOjAgbWlzc2luZyBJRCBhdCB1JzM0JyJdLCBlcnJvcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCI8bWlzc2luZyBJRD4gMzQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RNaXNzaW5nRmlyc3RUb2tlbkdpdmVzRXJyb3JOb2RlMihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgYyA7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgYyA6IElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCwgZXJyb3JzID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjM0IiwgZXhwZWN0RXJyb3JzPVRydWUpCisKKyAgICAgICAgIyBmaW5kcyBhbiBlcnJvciBhdCB0aGUgZmlyc3QgdG9rZW4sIDM0LCBhbmQgcmUtc3luY3MuCisgICAgICAgICMgcmUtc3luY2hyb25pemluZyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gYmVjYXVzZSAzNCBmb2xsb3dzCisgICAgICAgICMgcmVmIHRvIHJ1bGUgYiAoc3RhcnQgb2YgYykuIEl0IHRoZW4gbWF0Y2hlcyAzNCBpbiBjLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTowIG1pc3NpbmcgSUQgYXQgdSczNCciXSwgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiPG1pc3NpbmcgSUQ+IDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Tm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgfCBjIDsKKyAgICAgICAgICAgIGIgOiBJRCA7CisgICAgICAgICAgICBjIDogSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIFMgOiAnKicgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQsIGVycm9ycyA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICIqIiwgZXhwZWN0RXJyb3JzPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsibGluZSAxOjAgbm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0IHUnKiciXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiPHVuZXhwZWN0ZWQ6IFtAMCwwOjA9dScqJyw8Nj4sMTowXSwgcmVzeW5jPSo+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDU4cmV3cml0ZUFTVC5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDU4cmV3cml0ZUFTVC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTAzNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNThyZXdyaXRlQVNULnB5CkBAIC0wLDAgKzEsMTUxNyBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCBhbnRscjMudHJlZQoraW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgc3lzCisKK2NsYXNzIFRlc3RSZXdyaXRlQVNUKHRlc3RiYXNlLkFOVExSVGVzdCk6CisgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBUUGFyc2VyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcnMgPSBbXQorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9ICIiCisKKworICAgICAgICAgICAgZGVmIGNhcHR1cmUoc2VsZiwgdCk6CisgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ICs9IHQKKworCisgICAgICAgICAgICBkZWYgdHJhY2VJbihzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJz4nK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiB0cmFjZU91dChzZWxmLCBydWxlTmFtZSwgcnVsZUluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlcy5hcHBlbmQoJzwnK3J1bGVOYW1lKQorCisKKyAgICAgICAgICAgIGRlZiBlbWl0RXJyb3JNZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXJyb3JzLmFwcGVuZChtc2cpCisKKworICAgICAgICByZXR1cm4gVFBhcnNlcgorCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgY2xhc3MgVExleGVyKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgPSAiIgorCisKKyAgICAgICAgICAgIGRlZiBjYXB0dXJlKHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCArPSB0CisKKworICAgICAgICAgICAgZGVmIHRyYWNlSW4oc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc+JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgdHJhY2VPdXQoc2VsZiwgcnVsZU5hbWUsIHJ1bGVJbmRleCk6CisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXMuYXBwZW5kKCc8JytydWxlTmFtZSkKKworCisgICAgICAgICAgICBkZWYgcmVjb3ZlcihzZWxmLCBpbnB1dCwgcmUpOgorICAgICAgICAgICAgICAgICMgbm8gZXJyb3IgcmVjb3ZlcnkgeWV0LCBqdXN0IGNyYXNoIQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgcmV0dXJuIFRMZXhlcgorCisKKyAgICBkZWYgZXhlY1BhcnNlcihzZWxmLCBncmFtbWFyLCBncmFtbWFyRW50cnksIGlucHV0LCBleHBlY3RFcnJvcnM9RmFsc2UpOgorICAgICAgICBsZXhlckNscywgcGFyc2VyQ2xzID0gc2VsZi5jb21waWxlSW5saW5lR3JhbW1hcihncmFtbWFyKQorCisgICAgICAgIGNTdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKGlucHV0KQorICAgICAgICBsZXhlciA9IGxleGVyQ2xzKGNTdHJlYW0pCisgICAgICAgIHRTdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpCisgICAgICAgIHBhcnNlciA9IHBhcnNlckNscyh0U3RyZWFtKQorICAgICAgICByID0gZ2V0YXR0cihwYXJzZXIsIGdyYW1tYXJFbnRyeSkoKQorCisgICAgICAgIGlmIG5vdCBleHBlY3RFcnJvcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocGFyc2VyLl9lcnJvcnMpLCAwLCBwYXJzZXIuX2Vycm9ycykKKworICAgICAgICByZXN1bHQgPSAiIgorCisgICAgICAgIGlmIHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHIsICdyZXN1bHQnKToKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gci5yZXN1bHQKKworICAgICAgICAgICAgaWYgci50cmVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSByLnRyZWUudG9TdHJpbmdUcmVlKCkKKworICAgICAgICBpZiBub3QgZXhwZWN0RXJyb3JzOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LCBwYXJzZXIuX2Vycm9ycworCisKKyAgICBkZWYgZXhlY1RyZWVQYXJzZXIoc2VsZiwgZ3JhbW1hciwgZ3JhbW1hckVudHJ5LCB0cmVlR3JhbW1hciwgdHJlZUVudHJ5LCBpbnB1dCk6CisgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisgICAgICAgIHdhbGtlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIodHJlZUdyYW1tYXIpCisKKyAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgIGxleGVyID0gbGV4ZXJDbHMoY1N0cmVhbSkKKyAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0pCisgICAgICAgIHIgPSBnZXRhdHRyKHBhcnNlciwgZ3JhbW1hckVudHJ5KSgpCisgICAgICAgIG5vZGVzID0gYW50bHIzLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW0oci50cmVlKQorICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0U3RyZWFtKQorICAgICAgICB3YWxrZXIgPSB3YWxrZXJDbHMobm9kZXMpCisgICAgICAgIHIgPSBnZXRhdHRyKHdhbGtlciwgdHJlZUVudHJ5KSgpCisKKyAgICAgICAgaWYgciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiByLnRyZWUudG9TdHJpbmdUcmVlKCkKKworICAgICAgICByZXR1cm4gIiIKKworCisgICAgZGVmIHRlc3REZWxldGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTaW5nbGVUb2tlbihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAtPiBJRDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTaW5nbGVUb2tlblRvTmV3Tm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAtPiBJRFsieCJdOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIngiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTaW5nbGVUb2tlblRvTmV3Tm9kZVJvb3Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgLT4gXihJRFsieCJdIElOVCk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKHggSU5UKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFNpbmdsZVRva2VuVG9OZXdOb2RlMihzZWxmKToKKyAgICAgICAgIyBBbGxvdyBjcmVhdGlvbiBvZiBuZXcgbm9kZXMgdy9vIGFyZ3MuCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFRUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIC0+IElEWyBdOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIklEIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2luZ2xlQ2hhckxpdGVyYWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2MnIC0+ICdjJzsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFNpbmdsZVN0cmluZ0xpdGVyYWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2ljaycgLT4gJ2ljayc7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJpY2siKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiaWNrIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2luZ2xlUnVsZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBiIC0+IGI7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJlb3JkZXJUb2tlbnMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IElOVCBJRDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIzNCBhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZW9yZGVyVG9rZW5BbmRSdWxlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgSU5UIC0+IElOVCBiOworICAgICAgICAgICAgYiA6IElEIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIzNCBhYmMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlblRyZWUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IF4oSU5UIElEKTsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoMzQgYWJjKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRva2VuVHJlZUFmdGVyT3RoZXJTdHVmZihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiAndm9pZCcgSUQgSU5UIC0+ICd2b2lkJyBeKElOVCBJRCk7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJ2b2lkIGFiYyAzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJ2b2lkICgzNCBhYmMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TmVzdGVkVG9rZW5UcmVlV2l0aE91dGVyTG9vcChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCBJRCBhbmQgSU5UIGJvdGggaXRlcmF0ZSBvdmVyIG91dGVyIGluZGV4IHZhcmlhYmxlCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0RVSDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIElEIElOVCAtPiBeKCBEVUggSUQgXiggRFVIIElOVCkgKSsgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSAxIGIgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoRFVIIGEgKERVSCAxKSkgKERVSCBiIChEVUggMikpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0T3B0aW9uYWxTaW5nbGVUb2tlbihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAtPiBJRD8gOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdENsb3N1cmVTaW5nbGVUb2tlbihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJRCAtPiBJRCogOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFBvc2l0aXZlQ2xvc3VyZVNpbmdsZVRva2VuKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIElEIC0+IElEKyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIGIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBiIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0T3B0aW9uYWxTaW5nbGVSdWxlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgLT4gYj87CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImFiYyIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdENsb3N1cmVTaW5nbGVSdWxlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgYiAtPiBiKjsKKyAgICAgICAgICAgIGIgOiBJRCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIGIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBiIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Q2xvc3VyZU9mTGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogeCs9YiB4Kz1iIC0+ICR4KjsKKyAgICAgICAgICAgIGIgOiBJRCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIGIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBiIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0T3B0aW9uYWxMYWJlbE5vTGlzdExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6ICh4PUlEKT8gLT4gJHg/OworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UG9zaXRpdmVDbG9zdXJlU2luZ2xlUnVsZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBiIGIgLT4gYis7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFNpbmdsZVByZWRpY2F0ZVQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgLT4ge1RydWV9PyBJRCAtPiA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2luZ2xlUHJlZGljYXRlRihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCAtPiB7RmFsc2V9PyBJRCAtPiA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TXVsdGlwbGVQcmVkaWNhdGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQgSU5UIC0+IHtGYWxzZX0/IElECisgICAgICAgICAgICAgICAgICAgICAgIC0+IHtUcnVlfT8gSU5UCisgICAgICAgICAgICAgICAgICAgICAgIC0+CisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIyIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TXVsdGlwbGVQcmVkaWNhdGVUcmVlcyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBJTlQgLT4ge0ZhbHNlfT8gXihJRCBJTlQpCisgICAgICAgICAgICAgICAgICAgICAgIC0+IHtUcnVlfT8gXihJTlQgSUQpCisgICAgICAgICAgICAgICAgICAgICAgIC0+IElECisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoMiBhKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFNpbXBsZVRyZWUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogb3AgSU5UIC0+IF4ob3AgSU5UKTsKKyAgICAgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICItMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKC0gMzQpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2ltcGxlVHJlZTIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogb3AgSU5UIC0+IF4oSU5UIG9wKTsKKyAgICAgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICIrIDM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIigzNCArKSIsIGZvdW5kKQorCisKKworICAgIGRlZiB0ZXN0TmVzdGVkVHJlZXMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ3ZhcicgKElEICc6JyB0eXBlICc7JykrIC0+IF4oJ3ZhcicgXignOicgSUQgdHlwZSkrKSA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgInZhciBhOmludDsgYjpmbG9hdDsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKHZhciAoOiBhIGludCkgKDogYiBmbG9hdCkpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0SW1hZ2luYXJ5VG9rZW5Db3B5KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtWQVI7fQorICAgICAgICAgICAgYSA6IElEICgnLCcgSUQpKi0+IF4oVkFSIElEKSsgOworICAgICAgICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhLGIsYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoVkFSIGEpIChWQVIgYikgKFZBUiBjKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFRva2VuVW5yZWZlcmVuY2VkT25MZWZ0QnV0RGVmaW5lZChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7VkFSO30KKyAgICAgICAgICAgIGEgOiBiIC0+IElEIDsKKyAgICAgICAgICAgIGIgOiBJRCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIklEIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0SW1hZ2luYXJ5VG9rZW5Db3B5U2V0VGV4dChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7VkFSO30KKyAgICAgICAgICAgIGEgOiBJRCAoJywnIElEKSotPiBeKFZBUlsidmFyIl0gSUQpKyA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEsYixjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIih2YXIgYSkgKHZhciBiKSAodmFyIGMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0SW1hZ2luYXJ5VG9rZW5Ob0NvcHlGcm9tVG9rZW4oc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiBsYz0neycgSUQrICd9JyAtPiBeKEJMT0NLWyRsY10gSUQrKSA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgInthIGIgY30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKHsgYSBiIGMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0SW1hZ2luYXJ5VG9rZW5Ob0NvcHlGcm9tVG9rZW5TZXRUZXh0KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgICAgICBhIDogbGM9J3snIElEKyAnfScgLT4gXihCTE9DS1skbGMsImJsb2NrIl0gSUQrKSA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgInthIGIgY30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGJsb2NrIGEgYiBjKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE1peGVkUmV3cml0ZUFuZEF1dG9BU1Qoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiBiIGJeIDsgLy8gMm5kIGIgbWF0Y2hlcyBvbmx5IGFuIElOVDsgY2FuIG1ha2UgaXQgcm9vdAorICAgICAgICAgICAgYiA6IElEIElOVCAtPiBJTlQgSUQKKyAgICAgICAgICAgICAgfCBJTlQKKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSAxIDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKDIgMSBhKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFN1YnJ1bGVXaXRoUmV3cml0ZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgICAgICAgYSA6IGIgYiA7CisgICAgICAgICAgICBiIDogKElEIElOVCAtPiBJTlQgSUQgfCBJTlQgSU5UIC0+IElOVCsgKQorICAgICAgICAgICAgICA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIDEgMiAzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjEgYSAyIDMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTdWJydWxlV2l0aFJld3JpdGUyKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtUWVBFO30KKyAgICAgICAgICAgIGEgOiBiIGIgOworICAgICAgICAgICAgYiA6ICdpbnQnCisgICAgICAgICAgICAgICAgKCBJRCAtPiBeKFRZUEUgJ2ludCcgSUQpCisgICAgICAgICAgICAgICAgfCBJRCAnPScgSU5UIC0+IF4oVFlQRSAnaW50JyBJRCBJTlQpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICc7JworICAgICAgICAgICAgICA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJpbnQgYTsgaW50IGI9MzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKFRZUEUgaW50IGEpIChUWVBFIGludCBiIDMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TmVzdGVkUmV3cml0ZVNodXRzT2ZmQXV0b0FTVChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgICAgICAgYSA6IGIgYiA7CisgICAgICAgICAgICBiIDogSUQgKCBJRCAobGFzdD1JRCAtPiAkbGFzdCkrICkgJzsnIC8vIGdldCBsYXN0IElECisgICAgICAgICAgICAgIHwgSU5UIC8vIHNob3VsZCBzdGlsbCBnZXQgYXV0byBBU1QgY29uc3RydWN0aW9uCisgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiBjIGQ7IDQyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImQgNDIiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZXdyaXRlQWN0aW9ucyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBhdG9tIC0+IF4oe3NlbGYuYWRhcHRvci5jcmVhdGUoSU5ULCI5Iil9IGF0b20pIDsKKyAgICAgICAgICAgIGF0b20gOiBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoOSAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVBY3Rpb25zMihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBhdG9tIC0+IHtzZWxmLmFkYXB0b3IuY3JlYXRlKElOVCwiOSIpfSBhdG9tIDsKKyAgICAgICAgICAgIGF0b20gOiBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCI5IDMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSZWZUb09sZFZhbHVlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgICAgICBhIDogKGF0b20gLT4gYXRvbSkgKG9wPScrJyByPWF0b20gLT4gXigkb3AgJGEgJHIpICkqIDsKKyAgICAgICAgICAgIGF0b20gOiBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiMys0KzUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKCsgKCsgMyA0KSA1KSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlcyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgICAgICAgYSA6IGF0b20gLT4gXihhdG9tIGF0b20pIDsgLy8gTk9UIENZQ0xFISAoZHVwIGF0b20pCisgICAgICAgICAgICBhdG9tIDogSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKDMgMykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb3B5U2VtYW50aWNzRm9yUnVsZXMyKHNlbGYpOgorICAgICAgICAjIGNvcHkgdHlwZSBhcyBhIHJvb3QgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiAoLi4uKSsgaW4gcmV3cml0ZQorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgSUQpKyA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiaW50IGEsYixjOyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoaW50IGEpIChpbnQgYikgKGludCBjKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlczMoc2VsZik6CisgICAgICAgICMgY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKyAgICAgICAgIyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogbW9kaWZpZXI/IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgbW9kaWZpZXI/IElEKSsgOworICAgICAgICAgICAgdHlwZSA6ICdpbnQnIDsKKyAgICAgICAgICAgIG1vZGlmaWVyIDogJ3B1YmxpYycgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAicHVibGljIGludCBhLGIsYzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGludCBwdWJsaWMgYSkgKGludCBwdWJsaWMgYikgKGludCBwdWJsaWMgYykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb3B5U2VtYW50aWNzRm9yUnVsZXMzRG91YmxlKHNlbGYpOgorICAgICAgICAjIGNvcHkgdHlwZSAqYW5kKiBtb2RpZmllciBldmVuIHRob3VnaCBpdCdzIG9wdGlvbmFsCisgICAgICAgICMgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiAoLi4uKSsgaW4gcmV3cml0ZQorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IG1vZGlmaWVyPyB0eXBlIElEICgnLCcgSUQpKiAnOycgLT4gXih0eXBlIG1vZGlmaWVyPyBJRCkrIF4odHlwZSBtb2RpZmllcj8gSUQpKyA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgOworICAgICAgICAgICAgbW9kaWZpZXIgOiAncHVibGljJyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJwdWJsaWMgaW50IGEsYixjOyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKSAoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlczQoc2VsZik6CisgICAgICAgICMgY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKyAgICAgICAgIyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge01PRDt9CisgICAgICAgICAgICBhIDogbW9kaWZpZXI/IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgXihNT0QgbW9kaWZpZXIpPyBJRCkrIDsKKyAgICAgICAgICAgIHR5cGUgOiAnaW50JyA7CisgICAgICAgICAgICBtb2RpZmllciA6ICdwdWJsaWMnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgInB1YmxpYyBpbnQgYSxiLGM7IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihpbnQgKE1PRCBwdWJsaWMpIGEpIChpbnQgKE1PRCBwdWJsaWMpIGIpIChpbnQgKE1PRCBwdWJsaWMpIGMpIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Q29weVNlbWFudGljc0xpc3RzKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtNT0Q7fQorICAgICAgICAgICAgYSA6IElEICgnLCcgSUQpKiAnOycgLT4gSUQrIElEKyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhLGIsYzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBiIGMgYSBiIGMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb3B5UnVsZUxhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgICAgICBhIDogeD1iIC0+ICR4ICR4OworICAgICAgICAgICAgYiA6IElEIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBhIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Q29weVJ1bGVMYWJlbDIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiB4PWIgLT4gXigkeCAkeCk7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoYSBhKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFF1ZXVlaW5nT2ZUb2tlbnMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2ludCcgSUQgKCcsJyBJRCkqICc7JyAtPiBeKCdpbnQnIElEKykgOworICAgICAgICAgICAgb3AgOiAnKyd8Jy0nIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImludCBhLGIsYzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGludCBhIGIgYykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb3B5T2ZUb2tlbnMoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2ludCcgSUQgJzsnIC0+ICdpbnQnIElEICdpbnQnIElEIDsKKyAgICAgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJpbnQgYTsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiaW50IGEgaW50IGEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlbkNvcHlJbkxvb3Aoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2ludCcgSUQgKCcsJyBJRCkqICc7JyAtPiBeKCdpbnQnIElEKSsgOworICAgICAgICAgICAgb3AgOiAnKyd8Jy0nIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImludCBhLGIsYzsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKGludCBhKSAoaW50IGIpIChpbnQgYykiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUb2tlbkNvcHlJbkxvb3BBZ2FpbnN0VHdvT3RoZXJzKHNlbGYpOgorICAgICAgICAjIG11c3Qgc21lYXIgJ2ludCcgY29waWVzIGFjcm9zcyBhcyByb290IG9mIG11bHRpcGxlIHRyZWVzCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogJ2ludCcgSUQgJzonIElOVCAoJywnIElEICc6JyBJTlQpKiAnOycgLT4gXignaW50JyBJRCBJTlQpKyA7CisgICAgICAgICAgICBvcCA6ICcrJ3wnLScgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiaW50IGE6MSxiOjIsYzozOyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoaW50IGEgMSkgKGludCBiIDIpIChpbnQgYyAzKSIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdExpc3RSZWZkT25lQXRBVGltZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCsgLT4gSUQgSUQgSUQgOyAvLyB3b3JrcyBpZiAzIGlucHV0IElEcworICAgICAgICAgICAgb3AgOiAnKyd8Jy0nIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiBjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiBjIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U3BsaXRMaXN0V2l0aExhYmVscyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7VkFSO30KKyAgICAgICAgICAgIGEgOiBmaXJzdD1JRCBvdGhlcnMrPUlEKiAtPiAkZmlyc3QgVkFSICRvdGhlcnMrIDsKKyAgICAgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIGIgYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhIFZBUiBiIGMiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb21wbGljYXRlZE1lbGFuZ2Uoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiBBIEEgYj1CIEIgYj1CIGMrPUMgQyBjKz1DIEQge3M9JEQudGV4dH0gLT4gQSsgQisgQysgRCA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIEEgOiAnYScgOworICAgICAgICAgICAgQiA6ICdiJyA7CisgICAgICAgICAgICBDIDogJ2MnIDsKKyAgICAgICAgICAgIEQgOiAnZCcgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBhIGIgYiBiIGMgYyBjIGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBhIGIgYiBiIGMgYyBjIGQiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RSdWxlTGFiZWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiB4PWIgLT4gJHg7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QW1iaWd1b3VzUnVsZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBhIC0+IGEgfCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UOiAnMCcuLic5JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwKKwkJCQkgICAgImEiLCAiYWJjIDM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UnVsZUxpc3RMYWJlbChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgICAgICAgYSA6IHgrPWIgeCs9YiAtPiAkeCs7CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJ1bGVMaXN0TGFiZWwyKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgICAgICBhIDogeCs9YiB4Kz1iIC0+ICR4ICR4KjsKKyAgICAgICAgICAgIGIgOiBJRCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIGIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYSBiIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0T3B0aW9uYWwoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiB4PWIgKHk9Yik/IC0+ICR4ICR5PzsKKyAgICAgICAgICAgIGIgOiBJRCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RPcHRpb25hbDIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiB4PUlEICh5PWIpPyAtPiAkeCAkeT87CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE9wdGlvbmFsMyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgICAgICAgYSA6IHg9SUQgKHk9Yik/IC0+ICgkeCAkeSk/OworICAgICAgICAgICAgYiA6IElEIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhIGIiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RPcHRpb25hbDQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiB4Kz1JRCAoeT1iKT8gLT4gKCR4ICR5KT87CisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImEgYiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE9wdGlvbmFsNShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgICAgICAgYSA6IElEIC0+IElEPyA7IC8vIG1hdGNoIGFuIElEIHRvIG9wdGlvbmFsIElECisgICAgICAgICAgICBiIDogSUQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCJhIiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QXJiaXRyYXJ5RXhwclR5cGUoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgICAgICAgIGEgOiB4Kz1iIHgrPWIgLT4ge0NvbW1vblRyZWUoTm9uZSl9OworICAgICAgICAgICAgYiA6IElEIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTZXQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhOiAoSU5UfElEKSsgLT4gSU5UKyBJRCsgOworICAgICAgICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjIgYSAzNCBkZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIyIDM0IGEgZGUiLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTZXQyKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYTogKElOVHxJRCkgLT4gSU5UPyBJRD8gOworICAgICAgICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiMiIsIGZvdW5kKQorCisKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJodHRwOi8vd3d3LmFudGxyLm9yZzo4ODg4L2Jyb3dzZS9BTlRMUi0xNjIiLAorICAgICAgICAgICAgICAgICAgICAgYW50bHIzLnRyZWUuUmV3cml0ZUVtcHR5U3RyZWFtRXhjZXB0aW9uKQorICAgIGRlZiB0ZXN0U2V0V2l0aExhYmVsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IHg9KElOVHxJRCkgLT4gJHggOworICAgICAgICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiMiIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJld3JpdGVBY3Rpb24oc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMgeyBGTE9BVDsgfQorICAgICAgICAgICAgcgorICAgICAgICAgICAgICAgIDogSU5UIC0+IHtDb21tb25UcmVlKENvbW1vblRva2VuKHR5cGU9RkxPQVQsIHRleHQ9JElOVC50ZXh0KyIuMCIpKX0KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUzogKCcgJyB8ICdcbicgfCAnXHQnKSsgeyRjaGFubmVsID0gSElEREVOO307CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgInIiLCAiMjUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiMjUuMCIsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdE9wdGlvbmFsU3VicnVsZVdpdGhvdXRSZWFsRWxlbWVudHMoc2VsZik6CisgICAgICAgICMgY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKyAgICAgICAgIyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByIiIiCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge1BBUk1TO30KKworICAgICAgICAgICAgbW9kdWxvCisgICAgICAgICAgICAgOiAnbW9kdWxvJyBJRCAoJygnIHBhcm1zKyAnKScpPyAtPiBeKCdtb2R1bG8nIElEIF4oUEFSTVMgcGFybXMrKT8pCisgICAgICAgICAgICAgOworICAgICAgICAgICAgcGFybXMgOiAnIyd8SUQ7CisgICAgICAgICAgICBJRCA6ICgnYScuLid6JyB8ICdBJy4uJ1onKSs7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAibW9kdWxvIiwgIm1vZHVsbyBhYmMgKHggeSAjKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIobW9kdWxvIGFiYyAoUEFSTVMgeCB5ICMpKSIsIGZvdW5kKQorCisKKyAgICAjIyBDIEEgUiBEIEkgTiBBIEwgSSBUIFkgIEkgUyBTIFUgRSBTCisKKyAgICBkZWYgdGVzdENhcmRpbmFsaXR5KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBUOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgICAgICBhIDogSUQgSUQgSU5UIElOVCBJTlQgLT4gKElEIElOVCkrOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiAzIDQgNSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgYW50bHIzLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdENhcmRpbmFsaXR5MihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCsgLT4gSUQgSUQgSUQgOyAvLyBvbmx5IDIgaW5wdXQgSURzCisgICAgICAgICAgICBvcCA6ICcrJ3wnLScgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImEgYiIpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgYW50bHIzLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdENhcmRpbmFsaXR5MyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRD8gSU5UIC0+IElEIElOVCA7CisgICAgICAgICAgICBvcCA6ICcrJ3wnLScgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgIjMiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IGFudGxyMy50cmVlLlJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgZGVmIHRlc3RMb29wQ2FyZGluYWxpdHkoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogSUQ/IElOVCAtPiBJRCsgSU5UIDsKKyAgICAgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiMyIpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgYW50bHIzLnRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBJRCBjPS4gLT4gJGM7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMgMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiMzQiLCBmb3VuZCkKKworCisgICAgIyBFIFIgUiBPIFIgUworCisgICAgZGVmIHRlc3RFeHRyYVRva2VuSW5TaW1wbGVEZWNsKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBmb287CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICB0b2tlbnMge0VYUFI7fQorICAgICAgICAgICAgZGVjbCA6IHR5cGUgSUQgJz0nIElOVCAnOycgLT4gXihFWFBSIHR5cGUgSUQgSU5UKSA7CisgICAgICAgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kLCBlcnJvcnMgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImRlY2wiLCAiaW50IDM0IHg9MTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgdSczNCcgZXhwZWN0aW5nIElEIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIihFWFBSIGludCB4IDEpIiwgZm91bmQpICMgdHJlZSBnZXRzIGNvcnJlY3QgeCBhbmQgMSB0b2tlbnMKKworCisgICAgI0B0ZXN0YmFzZS5icm9rZW4oIkZJWE1FIiwgQXNzZXJ0aW9uRXJyb3IpCisgICAgZGVmIHRlc3RNaXNzaW5nSURJblNpbXBsZURlY2woc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7RVhQUjt9CisgICAgICAgICAgICBkZWNsIDogdHlwZSBJRCAnPScgSU5UICc7JyAtPiBeKEVYUFIgdHlwZSBJRCBJTlQpIDsKKyAgICAgICAgICAgIHR5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQsIGVycm9ycyA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiZGVjbCIsICJpbnQgPTE7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RFcnJvcnM9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoWyJsaW5lIDE6NCBtaXNzaW5nIElEIGF0IHUnPSciXSwgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiKEVYUFIgaW50IDxtaXNzaW5nIElEPiAxKSIsIGZvdW5kKSAjIHRyZWUgZ2V0cyBpbnZlbnRlZCBJRCB0b2tlbgorCisKKyAgICBkZWYgdGVzdE1pc3NpbmdTZXRJblNpbXBsZURlY2woc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIHRva2VucyB7RVhQUjt9CisgICAgICAgICAgICBkZWNsIDogdHlwZSBJRCAnPScgSU5UICc7JyAtPiBeKEVYUFIgdHlwZSBJRCBJTlQpIDsKKyAgICAgICAgICAgIHR5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQsIGVycm9ycyA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiZGVjbCIsICJ4PTE7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RFcnJvcnM9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoWyJsaW5lIDE6MCBtaXNtYXRjaGVkIGlucHV0IHUneCcgZXhwZWN0aW5nIHNldCBOb25lIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoRVhQUiA8ZXJyb3I6IHg+IHggMSkiLCBmb3VuZCkgIyB0cmVlIGdldHMgaW52ZW50ZWQgSUQgdG9rZW4KKworCisgICAgZGVmIHRlc3RNaXNzaW5nVG9rZW5HaXZlc0Vycm9yTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIElOVCAtPiBJRCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQsIGVycm9ycyA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICJhYmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTozIG1pc3NpbmcgSU5UIGF0ICc8RU9GPiciXSwgZXJyb3JzKQorICAgICAgICAjIGRvZXNuJ3QgZG8gaW4tbGluZSByZWNvdmVyeSBmb3Igc2V0cyAoeWV0PykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoImFiYyA8bWlzc2luZyBJTlQ+IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0RXh0cmFUb2tlbkdpdmVzRXJyb3JOb2RlKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgcicnJworICAgICAgICAgICAgZ3JhbW1hciBmb287CisgICAgICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1QeXRob247b3V0cHV0PUFTVDt9CisgICAgICAgICAgICBhIDogYiBjIC0+IGIgYzsKKyAgICAgICAgICAgIGIgOiBJRCAtPiBJRCA7CisgICAgICAgICAgICBjIDogSU5UIC0+IElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgICAgICcnJykKKworICAgICAgICBmb3VuZCwgZXJyb3JzID0gc2VsZi5leGVjUGFyc2VyKGdyYW1tYXIsICJhIiwgImFiYyBpY2sgMzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgdSdpY2snIGV4cGVjdGluZyBJTlQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiYWJjIDM0IiwgZm91bmQpCisKKworICAgICNAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEFzc2VydGlvbkVycm9yKQorICAgIGRlZiB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IElEIElOVCAtPiBJRCBJTlQgOworICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgZm91bmQsIGVycm9ycyA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAiYSIsICIzNCIsIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTowIG1pc3NpbmcgSUQgYXQgdSczNCciXSwgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiPG1pc3NpbmcgSUQ+IDM0IiwgZm91bmQpCisKKworICAgICNAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEFzc2VydGlvbkVycm9yKQorICAgIGRlZiB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZTIoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICByJycnCisgICAgICAgICAgICBncmFtbWFyIGZvbzsKKyAgICAgICAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVB5dGhvbjtvdXRwdXQ9QVNUO30KKyAgICAgICAgICAgIGEgOiBiIGMgLT4gYiBjOworICAgICAgICAgICAgYiA6IElEIC0+IElEIDsKKyAgICAgICAgICAgIGMgOiBJTlQgLT4gSU5UIDsKKyAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kLCBlcnJvcnMgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiMzQiLCBleHBlY3RFcnJvcnM9VHJ1ZSkKKyAgICAgICAgIyBmaW5kcyBhbiBlcnJvciBhdCB0aGUgZmlyc3QgdG9rZW4sIDM0LCBhbmQgcmUtc3luY3MuCisgICAgICAgICMgcmUtc3luY2hyb25pemluZyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gYmVjYXVzZSAzNCBmb2xsb3dzCisgICAgICAgICMgcmVmIHRvIHJ1bGUgYiAoc3RhcnQgb2YgYykuIEl0IHRoZW4gbWF0Y2hlcyAzNCBpbiBjLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhbImxpbmUgMTowIG1pc3NpbmcgSUQgYXQgdSczNCciXSwgZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygiPG1pc3NpbmcgSUQ+IDM0IiwgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Tm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIHInJycKKyAgICAgICAgICAgIGdyYW1tYXIgZm9vOworICAgICAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UHl0aG9uO291dHB1dD1BU1Q7fQorICAgICAgICAgICAgYSA6IGIgLT4gYiB8IGMgLT4gYzsKKyAgICAgICAgICAgIGIgOiBJRCAtPiBJRCA7CisgICAgICAgICAgICBjIDogSU5UIC0+IElOVCA7CisgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgICAgICBTIDogJyonIDsKKyAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAgICAgJycnKQorCisgICAgICAgIGZvdW5kLCBlcnJvcnMgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgImEiLCAiKiIsIGV4cGVjdEVycm9ycz1UcnVlKQorICAgICAgICAjIGZpbmRzIGFuIGVycm9yIGF0IHRoZSBmaXJzdCB0b2tlbiwgMzQsIGFuZCByZS1zeW5jcy4KKyAgICAgICAgIyByZS1zeW5jaHJvbml6aW5nIGRvZXMgbm90IGNvbnN1bWUgYSB0b2tlbiBiZWNhdXNlIDM0IGZvbGxvd3MKKyAgICAgICAgIyByZWYgdG8gcnVsZSBiIChzdGFydCBvZiBjKS4gSXQgdGhlbiBtYXRjaGVzIDM0IGluIGMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsibGluZSAxOjAgbm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0IHUnKiciXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKTsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoIjx1bmV4cGVjdGVkOiBbQDAsMDowPXUnKicsPDY+LDE6MF0sIHJlc3luYz0qPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA1OWRlYnVnLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTlkZWJ1Zy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjYyMGQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3QwNTlkZWJ1Zy5weQpAQCAtMCwwICsxLDc4MyBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCBhbnRscjMKK2ltcG9ydCBhbnRscjMudHJlZQoraW1wb3J0IGFudGxyMy5kZWJ1ZworaW1wb3J0IHRlc3RiYXNlCitpbXBvcnQgc3lzCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KK2ltcG9ydCB0aW1lCisKK2NsYXNzIERlYnVnZ2VyKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3J0KToKKyAgICAgICAgc3VwZXIoRGVidWdnZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5ldmVudHMgPSBbXQorICAgICAgICBzZWxmLnN1Y2Nlc3MgPSBGYWxzZQorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSBsaXN0ZW5pbmcgc29ja2V0CisgICAgICAgIHMgPSBOb25lCisgICAgICAgIHRzdGFydCA9IHRpbWUudGltZSgpCisgICAgICAgIHdoaWxlIHRpbWUudGltZSgpIC0gdHN0YXJ0IDwgMTA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKCcxMjcuMC4wLjEnLCBzZWxmLnBvcnQpKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBleGM6CisgICAgICAgICAgICAgICAgaWYgZXhjLmFyZ3NbMF0gIT0gZXJybm8uRUNPTk5SRUZVU0VEOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIGlmIHMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZChbJ25vc29ja2V0J10pCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzLnNldGJsb2NraW5nKDEpCisgICAgICAgIHMuc2V0dGltZW91dCgxMC4wKQorCisgICAgICAgIG91dHB1dCA9IHMubWFrZWZpbGUoJ3cnLCAwKQorICAgICAgICBpbnB1dCA9IHMubWFrZWZpbGUoJ3InLCAwKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaGFuZHNoYWtlCisgICAgICAgICAgICBsID0gaW5wdXQucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgICAgICAgICBhc3NlcnQgbCA9PSAnQU5UTFIgMicKKyAgICAgICAgICAgIGwgPSBpbnB1dC5yZWFkbGluZSgpLnN0cmlwKCkKKyAgICAgICAgICAgIGFzc2VydCBsLnN0YXJ0c3dpdGgoJ2dyYW1tYXIgIicpCisKKyAgICAgICAgICAgIG91dHB1dC53cml0ZSgnQUNLXG4nKQorICAgICAgICAgICAgb3V0cHV0LmZsdXNoKCkKKworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBldmVudCA9IGlucHV0LnJlYWRsaW5lKCkuc3RyaXAoKQorICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZChldmVudC5zcGxpdCgnXHQnKSkKKworICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZSgnQUNLXG4nKQorICAgICAgICAgICAgICAgIG91dHB1dC5mbHVzaCgpCisKKyAgICAgICAgICAgICAgICBpZiBldmVudCA9PSAndGVybWluYXRlJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWNjZXNzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZChbJ3RpbWVvdXQnXSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXhjOgorICAgICAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKFsnc29ja2V0ZXJyb3InLCBleGMuYXJnc10pCisKKyAgICAgICAgcy5jbG9zZSgpCisKKworY2xhc3MgVCh0ZXN0YmFzZS5BTlRMUlRlc3QpOgorICAgIGRlZiBleGVjUGFyc2VyKHNlbGYsIGdyYW1tYXIsIGdyYW1tYXJFbnRyeSwgaW5wdXQsIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgIHBhcnNlcl9hcmdzPXt9KToKKyAgICAgICAgaWYgbGlzdGVuZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHBvcnQgPSA0OTEwMAorICAgICAgICAgICAgZGVidWdnZXIgPSBEZWJ1Z2dlcihwb3J0KQorICAgICAgICAgICAgZGVidWdnZXIuc3RhcnQoKQorICAgICAgICAgICAgIyBUT0RPKHBpbmspOiBpbnN0YWxsIGFsYXJtLCBzbyBpdCBkb2Vzbid0IGhhbmcgZm9yZXZlciBpbiBjYXNlIG9mIGEgYnVnCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBvcnQgPSBOb25lCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGV4ZXJDbHMsIHBhcnNlckNscyA9IHNlbGYuY29tcGlsZUlubGluZUdyYW1tYXIoCisgICAgICAgICAgICAgICAgZ3JhbW1hciwgb3B0aW9ucz0nLWRlYnVnJykKKworICAgICAgICAgICAgY1N0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oaW5wdXQpCisgICAgICAgICAgICBsZXhlciA9IGxleGVyQ2xzKGNTdHJlYW0pCisgICAgICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorICAgICAgICAgICAgcGFyc2VyID0gcGFyc2VyQ2xzKHRTdHJlYW0sIGRiZz1saXN0ZW5lciwgcG9ydD1wb3J0LCAqKnBhcnNlcl9hcmdzKQorICAgICAgICAgICAgZ2V0YXR0cihwYXJzZXIsIGdyYW1tYXJFbnRyeSkoKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBsaXN0ZW5lciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlYnVnZ2VyLmpvaW4oKQorICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dlcgorCisgICAgZGVmIHRlc3RCYXNpY1BhcnNlcihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBFT0Y7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBsaXN0ZW5lciA9IGFudGxyMy5kZWJ1Zy5SZWNvcmREZWJ1Z0V2ZW50TGlzdGVuZXIoKQorCisgICAgICAgIHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIiwKKyAgICAgICAgICAgIGxpc3RlbmVyPWxpc3RlbmVyKQorCisgICAgICAgICMgV2Ugb25seSBjaGVjayB0aGF0IHNvbWUgTFQgZXZlbnRzIGFyZSBwcmVzZW50LiBIb3cgbWFueSBpcyBzdWJqZWN0CisgICAgICAgICMgdG8gY2hhbmdlIChhdCB0aGUgdGltZSBvZiB3cml0aW5nIHRoZXJlIGFyZSB0d28sIHdoaWNoIGlzIG9uZSB0b28KKyAgICAgICAgIyBtYW55KS4KKyAgICAgICAgbHRfZXZlbnRzID0gW2V2ZW50IGZvciBldmVudCBpbiBsaXN0ZW5lci5ldmVudHMKKyAgICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50LnN0YXJ0c3dpdGgoIkxUICIpXQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGx0X2V2ZW50cywgW10pCisKKyAgICAgICAgIyBGb3IgdGhlIHJlc3QsIGZpbHRlciBvdXQgTFQgZXZlbnRzIHRvIGdldCBhIHJlbGlhYmxlIHRlc3QuCisgICAgICAgIGV4cGVjdGVkID0gWyJlbnRlclJ1bGUgYSIsCisgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiA2OjEiLAorICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24gNjo1IiwKKyAgICAgICAgICAgICAgICAgICAgImxvY2F0aW9uIDY6OCIsCisgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiA2OjExIiwKKyAgICAgICAgICAgICAgICAgICAgImV4aXRSdWxlIGEiXQorICAgICAgICBmb3VuZCA9IFtldmVudCBmb3IgZXZlbnQgaW4gbGlzdGVuZXIuZXZlbnRzCisgICAgICAgICAgICAgICAgIGlmIG5vdCBldmVudC5zdGFydHN3aXRoKCJMVCAiKV0KKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoZm91bmQsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RTb2NrZXRQcm94eShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBFT0Y7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBkZWJ1Z2dlciA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIiwKKyAgICAgICAgICAgIGxpc3RlbmVyPU5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlYnVnZ2VyLnN1Y2Nlc3MpCisgICAgICAgIGV4cGVjdGVkID0gW1snZW50ZXJSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnNSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc4J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnMScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJy0xJywgJy0xJywgJzAnLCAnMScsICcxJywgJyI8RU9GPiddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICctMScsICctMScsICcwJywgJzEnLCAnMScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzExJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RSZWNvZ25pdGlvbkV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCBFT0Y7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBkZWJ1Z2dlciA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIGIiLAorICAgICAgICAgICAgbGlzdGVuZXI9Tm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVidWdnZXIuc3VjY2VzcykKKyAgICAgICAgZXhwZWN0ZWQgPSBbWydlbnRlclJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc1J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNCcsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lSGlkZGVuVG9rZW4nLCAnMScsICc1JywgJzk5JywgJzEnLCAnMScsICciJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc4J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcyJywgJzQnLCAnMCcsICcxJywgJzInLCAnImInXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzInLCAnNCcsICcwJywgJzEnLCAnMicsICciYiddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzInLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzMnLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcyJywgJzQnLCAnMCcsICcxJywgJzInLCAnImInXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzInLCAnNCcsICcwJywgJzEnLCAnMicsICciYiddLAorICAgICAgICAgICAgICAgICAgICBbJ2JlZ2luUmVzeW5jJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzInLCAnNCcsICcwJywgJzEnLCAnMicsICciYiddLAorICAgICAgICAgICAgICAgICAgICBbJ2VuZFJlc3luYyddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4Y2VwdGlvbicsICdVbndhbnRlZFRva2VuRXhjZXB0aW9uJywgJzInLCAnMScsICcyJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnMycsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzMnLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsndGVybWluYXRlJ11dCisKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoZGVidWdnZXIuZXZlbnRzLCBleHBlY3RlZCkKKworCisgICAgZGVmIHRlc3RTZW1QcmVkKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgYSA6IHtUcnVlfT8gSUQgRU9GOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZGVidWdnZXIgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSIsCisgICAgICAgICAgICBsaXN0ZW5lcj1Ob25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZWJ1Z2dlci5zdWNjZXNzKQorICAgICAgICBleHBlY3RlZCA9IFtbJ2VudGVyUnVsZScsICdULmcnLCAnYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydzZW1hbnRpY1ByZWRpY2F0ZScsICcxJywgJ1RydWUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzEzJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNCcsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzE2J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnMScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJy0xJywgJy0xJywgJzAnLCAnMScsICcxJywgJyI8RU9GPiddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICctMScsICctMScsICcwJywgJzEnLCAnMScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzE5J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdFBvc2l0aXZlQ2xvc3VyZUJsb2NrKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEICggSUQgfCBJTlQgKSsgRU9GOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZGVidWdnZXIgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSAxIGIgYyAzIiwKKyAgICAgICAgICAgIGxpc3RlbmVyPU5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlYnVnZ2VyLnN1Y2Nlc3MpCisgICAgICAgIGV4cGVjdGVkID0gW1snZW50ZXJSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnNSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZUhpZGRlblRva2VuJywgJzEnLCAnNicsICc5OScsICcxJywgJzEnLCAnIiddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnOCddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyU3ViUnVsZScsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJEZWNpc2lvbicsICcxJywgJzAnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzInLCAnNScsICcwJywgJzEnLCAnMicsICciMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXREZWNpc2lvbicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnOCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMicsICc1JywgJzAnLCAnMScsICcyJywgJyIxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzInLCAnNScsICcwJywgJzEnLCAnMicsICciMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVIaWRkZW5Ub2tlbicsICczJywgJzYnLCAnOTknLCAnMScsICczJywgJyInXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckRlY2lzaW9uJywgJzEnLCAnMCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnNCcsICc0JywgJzAnLCAnMScsICc0JywgJyJiJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdERlY2lzaW9uJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc4J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICc0JywgJzQnLCAnMCcsICcxJywgJzQnLCAnImInXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnNCcsICc0JywgJzAnLCAnMScsICc0JywgJyJiJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZUhpZGRlblRva2VuJywgJzUnLCAnNicsICc5OScsICcxJywgJzUnLCAnIiddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMScsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICc2JywgJzQnLCAnMCcsICcxJywgJzYnLCAnImMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzgnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzYnLCAnNCcsICcwJywgJzEnLCAnNicsICciYyddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICc2JywgJzQnLCAnMCcsICcxJywgJzYnLCAnImMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lSGlkZGVuVG9rZW4nLCAnNycsICc2JywgJzk5JywgJzEnLCAnNycsICciJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJEZWNpc2lvbicsICcxJywgJzAnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzgnLCAnNScsICcwJywgJzEnLCAnOCcsICciMyddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXREZWNpc2lvbicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnOCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnOCcsICc1JywgJzAnLCAnMScsICc4JywgJyIzJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzgnLCAnNScsICcwJywgJzEnLCAnOCcsICciMyddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMScsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnOScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRTdWJSdWxlJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzIyJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnOScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJy0xJywgJy0xJywgJzAnLCAnMScsICc5JywgJyI8RU9GPiddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICctMScsICctMScsICcwJywgJzEnLCAnOScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzI1J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdENsb3N1cmVCbG9jayhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGEgOiBJRCAoIElEIHwgSU5UICkqIEVPRjsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGRlYnVnZ2VyID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgaW5wdXQ9ImEgMSBiIGMgMyIsCisgICAgICAgICAgICBsaXN0ZW5lcj1Ob25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZWJ1Z2dlci5zdWNjZXNzKQorICAgICAgICBleHBlY3RlZCA9IFtbJ2VudGVyUnVsZScsICdULmcnLCAnYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNCcsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzAnLCAnNCcsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVIaWRkZW5Ub2tlbicsICcxJywgJzYnLCAnOTknLCAnMScsICcxJywgJyInXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzgnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlclN1YlJ1bGUnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMScsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcyJywgJzUnLCAnMCcsICcxJywgJzInLCAnIjEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzgnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzInLCAnNScsICcwJywgJzEnLCAnMicsICciMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICcyJywgJzUnLCAnMCcsICcxJywgJzInLCAnIjEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lSGlkZGVuVG9rZW4nLCAnMycsICc2JywgJzk5JywgJzEnLCAnMycsICciJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJEZWNpc2lvbicsICcxJywgJzAnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzQnLCAnNCcsICcwJywgJzEnLCAnNCcsICciYiddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXREZWNpc2lvbicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnOCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnNCcsICc0JywgJzAnLCAnMScsICc0JywgJyJiJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzQnLCAnNCcsICcwJywgJzEnLCAnNCcsICciYiddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVIaWRkZW5Ub2tlbicsICc1JywgJzYnLCAnOTknLCAnMScsICc1JywgJyInXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckRlY2lzaW9uJywgJzEnLCAnMCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnNicsICc0JywgJzAnLCAnMScsICc2JywgJyJjJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdERlY2lzaW9uJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc4J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICc2JywgJzQnLCAnMCcsICcxJywgJzYnLCAnImMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnNicsICc0JywgJzAnLCAnMScsICc2JywgJyJjJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZUhpZGRlblRva2VuJywgJzcnLCAnNicsICc5OScsICcxJywgJzcnLCAnIiddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMScsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICc4JywgJzUnLCAnMCcsICcxJywgJzgnLCAnIjMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzgnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzgnLCAnNScsICcwJywgJzEnLCAnOCcsICciMyddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICc4JywgJzUnLCAnMCcsICcxJywgJzgnLCAnIjMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckRlY2lzaW9uJywgJzEnLCAnMCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzknLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdERlY2lzaW9uJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0U3ViUnVsZScsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcyMiddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzknLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnOScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzknLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcyNSddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsndGVybWluYXRlJ11dCisKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoZGVidWdnZXIuZXZlbnRzLCBleHBlY3RlZCkKKworCisgICAgZGVmIHRlc3RNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEICggSUQgfCBJTlQgKSBFT0Y7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBkZWJ1Z2dlciA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhIiwKKyAgICAgICAgICAgIGxpc3RlbmVyPU5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlYnVnZ2VyLnN1Y2Nlc3MpCisgICAgICAgIGV4cGVjdGVkID0gW1snZW50ZXJSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnNSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc4J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnMScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJy0xJywgJy0xJywgJzAnLCAnMScsICcxJywgJyI8RU9GPiddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzEnLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhjZXB0aW9uJywgJ01pc21hdGNoZWRTZXRFeGNlcHRpb24nLCAnMScsICcxJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGNlcHRpb24nLCAnTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbicsICcxJywgJzEnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2JlZ2luUmVzeW5jJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnMScsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbmRSZXN5bmMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzI0J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdEJsb2NrKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEICggYiB8IGMgKSBFT0Y7CisgICAgICAgIGIgOiBJRDsKKyAgICAgICAgYyA6IElOVDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgICAgJycnKQorCisgICAgICAgIGRlYnVnZ2VyID0gc2VsZi5leGVjUGFyc2VyKAorICAgICAgICAgICAgZ3JhbW1hciwgJ2EnLAorICAgICAgICAgICAgaW5wdXQ9ImEgMSIsCisgICAgICAgICAgICBsaXN0ZW5lcj1Ob25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZWJ1Z2dlci5zdWNjZXNzKQorICAgICAgICBleHBlY3RlZCA9ICBbWydlbnRlclJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc1J10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZUhpZGRlblRva2VuJywgJzEnLCAnNicsICc5OScsICcxJywgJzEnLCAnIiddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzgnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJTdWJSdWxlJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJEZWNpc2lvbicsICcxJywgJzAnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcyJywgJzUnLCAnMCcsICcxJywgJzInLCAnIjEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZXhpdERlY2lzaW9uJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMiddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzE0J10sCisgICAgICAgICAgICAgICAgICAgICBbJ2VudGVyUnVsZScsICdULmcnLCAnYyddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcyJywgJzUnLCAnMCcsICcxJywgJzInLCAnIjEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcyJywgJzUnLCAnMCcsICcxJywgJzInLCAnIjEnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzInLCAnNScsICcwJywgJzEnLCAnMicsICciMSddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzgnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2MnXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnZXhpdFN1YlJ1bGUnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzE4J10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzMnLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzMnLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICctMScsICctMScsICcwJywgJzEnLCAnMycsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcyMSddLAorICAgICAgICAgICAgICAgICAgICAgWydleGl0UnVsZScsICdULmcnLCAnYSddLAorICAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdE5vVmlhYmxlQWx0KHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgYSA6IElEICggYiB8IGMgKSBFT0Y7CisgICAgICAgIGIgOiBJRDsKKyAgICAgICAgYyA6IElOVDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgICBCQU5HIDogJyEnIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBkZWJ1Z2dlciA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSJhICEiLAorICAgICAgICAgICAgbGlzdGVuZXI9Tm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVidWdnZXIuc3VjY2VzcykKKyAgICAgICAgZXhwZWN0ZWQgPSAgW1snZW50ZXJSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnNSddLAorICAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnMCcsICc1JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVIaWRkZW5Ub2tlbicsICcxJywgJzcnLCAnOTknLCAnMScsICcxJywgJyInXSwKKyAgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc4J10sCisgICAgICAgICAgICAgICAgICAgICBbJ2VudGVyU3ViUnVsZScsICcxJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMScsICcwJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMicsICc0JywgJzAnLCAnMScsICcyJywgJyIhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMicsICc0JywgJzAnLCAnMScsICcyJywgJyIhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMicsICc0JywgJzAnLCAnMScsICcyJywgJyIhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2V4Y2VwdGlvbicsICdOb1ZpYWJsZUFsdEV4Y2VwdGlvbicsICcyJywgJzEnLCAnMiddLAorICAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMSddLAorICAgICAgICAgICAgICAgICAgICAgWydleGl0U3ViUnVsZScsICcxJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2V4Y2VwdGlvbicsICdOb1ZpYWJsZUFsdEV4Y2VwdGlvbicsICcyJywgJzEnLCAnMiddLAorICAgICAgICAgICAgICAgICAgICAgWydiZWdpblJlc3luYyddLAorICAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzInLCAnNCcsICcwJywgJzEnLCAnMicsICciISddLAorICAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnMicsICc0JywgJzAnLCAnMScsICcyJywgJyIhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnLTEnLCAnLTEnLCAnMCcsICcxJywgJzMnLCAnIjxFT0Y+J10sCisgICAgICAgICAgICAgICAgICAgICBbJ2VuZFJlc3luYyddLAorICAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzIxJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ2V4aXRSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgICBbJ3Rlcm1pbmF0ZSddXQorCisgICAgICAgIHNlbGYuYXNzZXJ0TGlzdEVxdWFsKGRlYnVnZ2VyLmV2ZW50cywgZXhwZWN0ZWQpCisKKworICAgIGRlZiB0ZXN0UnVsZUJsb2NrKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgIH0KKyAgICAgICAgYSA6IGIgfCBjOworICAgICAgICBiIDogSUQ7CisgICAgICAgIGMgOiBJTlQ7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICAgICcnJykKKworICAgICAgICBkZWJ1Z2dlciA9IHNlbGYuZXhlY1BhcnNlcigKKyAgICAgICAgICAgIGdyYW1tYXIsICdhJywKKyAgICAgICAgICAgIGlucHV0PSIxIiwKKyAgICAgICAgICAgIGxpc3RlbmVyPU5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlYnVnZ2VyLnN1Y2Nlc3MpCisgICAgICAgIGV4cGVjdGVkID0gW1snZW50ZXJSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJEZWNpc2lvbicsICcxJywgJzAnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXREZWNpc2lvbicsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMiddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnOSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyUnVsZScsICdULmcnLCAnYyddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzgnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciMSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc1JywgJzAnLCAnMScsICcwJywgJyIxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzgnLCAnOCddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRSdWxlJywgJ1QuZycsICdjJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxMCddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsndGVybWluYXRlJ11dCisKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoZGVidWdnZXIuZXZlbnRzLCBleHBlY3RlZCkKKworCisgICAgZGVmIHRlc3RSdWxlQmxvY2tTaW5nbGVBbHQoc2VsZik6CisgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgIHInJycKKyAgICAgICAgZ3JhbW1hciBUOworICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyAgICAgICAgfQorICAgICAgICBhIDogYjsKKyAgICAgICAgYiA6IElEOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZGVidWdnZXIgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSIsCisgICAgICAgICAgICBsaXN0ZW5lcj1Ob25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZWJ1Z2dlci5zdWNjZXNzKQorICAgICAgICBleHBlY3RlZCA9IFtbJ2VudGVyUnVsZScsICdULmcnLCAnYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlclJ1bGUnLCAnVC5nJywgJ2InXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc3JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNycsICc1J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNCcsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc3JywgJzcnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0UnVsZScsICdULmcnLCAnYiddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnNiddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRSdWxlJywgJ1QuZycsICdhJ10sCisgICAgICAgICAgICAgICAgICAgIFsndGVybWluYXRlJ11dCisKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoZGVidWdnZXIuZXZlbnRzLCBleHBlY3RlZCkKKworCisgICAgZGVmIHRlc3RCbG9ja1NpbmdsZUFsdChzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGEgOiAoIGIgKTsKKyAgICAgICAgYiA6IElEOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZGVidWdnZXIgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSIsCisgICAgICAgICAgICBsaXN0ZW5lcj1Ob25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZWJ1Z2dlci5zdWNjZXNzKQorICAgICAgICBleHBlY3RlZCA9IFtbJ2VudGVyUnVsZScsICdULmcnLCAnYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzYnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc3J10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJSdWxlJywgJ1QuZycsICdiJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNycsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJBbHQnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzcnLCAnNSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzQnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydjb25zdW1lVG9rZW4nLCAnMCcsICc0JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNycsICc3J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2InXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzEwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdERGQShzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgcicnJworICAgICAgICBncmFtbWFyIFQ7CisgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworICAgICAgICB9CisgICAgICAgIGEgOiAoIGIgfCBjICkgRU9GOworICAgICAgICBiIDogSUQqIElOVDsKKyAgICAgICAgYyA6IElEKyBCQU5HOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIEJBTkcgOiAnISc7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgZGVidWdnZXIgPSBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSEiLAorICAgICAgICAgICAgbGlzdGVuZXI9Tm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVidWdnZXIuc3VjY2VzcykKKyAgICAgICAgZXhwZWN0ZWQgPSBbWydlbnRlclJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcxJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICc1J10sCisgICAgICAgICAgICAgICAgICAgIFsnZW50ZXJTdWJSdWxlJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckRlY2lzaW9uJywgJzEnLCAnMCddLAorICAgICAgICAgICAgICAgICAgICBbJ21hcmsnLCAnMCddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc1JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMScsICc0JywgJzAnLCAnMScsICcxJywgJyIhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzEnLCAnNCcsICcwJywgJzEnLCAnMScsICciISddLAorICAgICAgICAgICAgICAgICAgICBbJ3Jld2luZCcsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdERlY2lzaW9uJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlckFsdCcsICcyJ10sCisgICAgICAgICAgICAgICAgICAgIFsnbG9jYXRpb24nLCAnNicsICcxMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyUnVsZScsICdULmcnLCAnYyddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzgnLCAnMSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydlbnRlclN1YlJ1bGUnLCAnMyddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMycsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcwJywgJzUnLCAnMCcsICcxJywgJzAnLCAnImEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMyddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyQWx0JywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzUnXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMCcsICc1JywgJzAnLCAnMScsICcwJywgJyJhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzAnLCAnNScsICcwJywgJzEnLCAnMCcsICciYSddLAorICAgICAgICAgICAgICAgICAgICBbJ2VudGVyRGVjaXNpb24nLCAnMycsICcwJ10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICcxJywgJzQnLCAnMCcsICcxJywgJzEnLCAnIiEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0RGVjaXNpb24nLCAnMyddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRTdWJSdWxlJywgJzMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc4JywgJzknXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJzEnLCAnNCcsICcwJywgJzEnLCAnMScsICciISddLAorICAgICAgICAgICAgICAgICAgICBbJ0xUJywgJzEnLCAnMScsICc0JywgJzAnLCAnMScsICcxJywgJyIhJ10sCisgICAgICAgICAgICAgICAgICAgIFsnY29uc3VtZVRva2VuJywgJzEnLCAnNCcsICcwJywgJzEnLCAnMScsICciISddLAorICAgICAgICAgICAgICAgICAgICBbJ2xvY2F0aW9uJywgJzgnLCAnMTMnXSwKKyAgICAgICAgICAgICAgICAgICAgWydleGl0UnVsZScsICdULmcnLCAnYyddLAorICAgICAgICAgICAgICAgICAgICBbJ2V4aXRTdWJSdWxlJywgJzEnXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzE1J10sCisgICAgICAgICAgICAgICAgICAgIFsnTFQnLCAnMScsICctMScsICctMScsICcwJywgJzEnLCAnMicsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydMVCcsICcxJywgJy0xJywgJy0xJywgJzAnLCAnMScsICcyJywgJyI8RU9GPiddLAorICAgICAgICAgICAgICAgICAgICBbJ2NvbnN1bWVUb2tlbicsICctMScsICctMScsICcwJywgJzEnLCAnMicsICciPEVPRj4nXSwKKyAgICAgICAgICAgICAgICAgICAgWydsb2NhdGlvbicsICc2JywgJzE4J10sCisgICAgICAgICAgICAgICAgICAgIFsnZXhpdFJ1bGUnLCAnVC5nJywgJ2EnXSwKKyAgICAgICAgICAgICAgICAgICAgWyd0ZXJtaW5hdGUnXV0KKworICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChkZWJ1Z2dlci5ldmVudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdEJhc2ljQVNUKHNlbGYpOgorICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICByJycnCisgICAgICAgIGdyYW1tYXIgVDsKKyAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisgICAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICB9CisgICAgICAgIGEgOiAoIGIgfCBjICkgRU9GITsKKyAgICAgICAgYiA6IElEKiBJTlQgLT4gXihJTlQgSUQqKTsKKyAgICAgICAgYyA6IElEKyBCQU5HIC0+IF4oQkFORyBJRCspOworICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICAgIEJBTkcgOiAnISc7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgICAnJycpCisKKyAgICAgICAgbGlzdGVuZXIgPSBhbnRscjMuZGVidWcuUmVjb3JkRGVidWdFdmVudExpc3RlbmVyKCkKKworICAgICAgICBzZWxmLmV4ZWNQYXJzZXIoCisgICAgICAgICAgICBncmFtbWFyLCAnYScsCisgICAgICAgICAgICBpbnB1dD0iYSEiLAorICAgICAgICAgICAgbGlzdGVuZXI9bGlzdGVuZXIpCisKKyAgICAgICAgIyBkb24ndCBjaGVjayBvdXRwdXQgZm9yIG5vdyAodG9vIGR5bmFtaWMpLCBJJ20gc2F0aXNmaWVkIGlmIGl0CisgICAgICAgICMgZG9lc24ndCBjcmFzaAorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA2MGxlZnRyZWN1cnNpb24ucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdGVzdHMvdDA2MGxlZnRyZWN1cnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwNjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90MDYwbGVmdHJlY3Vyc2lvbi5weQpAQCAtMCwwICsxLDQ2OCBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcmUKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCisKKworIyBMZWZ0LXJlY3Vyc2lvbiByZXNvbHV0aW9uIGlzIG5vdCB5ZXQgZW5hYmxlZCBpbiB0aGUgdG9vbC4KKworIyBjbGFzcyBUZXN0TGVmdFJlY3Vyc2lvbih0ZXN0YmFzZS5BTlRMUlRlc3QpOgorIyAgICAgZGVmIHBhcnNlckNsYXNzKHNlbGYsIGJhc2UpOgorIyAgICAgICAgIGNsYXNzIFRQYXJzZXIoYmFzZSk6CisjICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorIyAgICAgICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyMgICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9ICIiCisKKworIyAgICAgICAgICAgICBkZWYgY2FwdHVyZShzZWxmLCB0KToKKyMgICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCArPSBzdHIodCkKKworCisjICAgICAgICAgICAgIGRlZiByZWNvdmVyKHNlbGYsIGlucHV0LCByZSk6CisjICAgICAgICAgICAgICAgICAjIG5vIGVycm9yIHJlY292ZXJ5IHlldCwganVzdCBjcmFzaCEKKyMgICAgICAgICAgICAgICAgIHJhaXNlCisKKyMgICAgICAgICByZXR1cm4gVFBhcnNlcgorCisKKyMgICAgIGRlZiBleGVjUGFyc2VyKHNlbGYsIGdyYW1tYXIsIGdyYW1tYXJFbnRyeSwgaW5wdXQpOgorIyAgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisKKyMgICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyMgICAgICAgICBsZXhlciA9IGxleGVyQ2xzKGNTdHJlYW0pCisjICAgICAgICAgdFN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShsZXhlcikKKyMgICAgICAgICBwYXJzZXIgPSBwYXJzZXJDbHModFN0cmVhbSkKKyMgICAgICAgICBnZXRhdHRyKHBhcnNlciwgZ3JhbW1hckVudHJ5KSgpCisjICAgICAgICAgcmV0dXJuIHBhcnNlci5fb3V0cHV0CisKKworIyAgICAgZGVmIHJ1blRlc3RzKHNlbGYsIGdyYW1tYXIsIHRlc3RzLCBncmFtbWFyRW50cnkpOgorIyAgICAgICAgIGxleGVyQ2xzLCBwYXJzZXJDbHMgPSBzZWxmLmNvbXBpbGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisKKyMgICAgICAgICBidWlsZF9hc3QgPSByZS5zZWFyY2gocidvdXRwdXRccyo9XHMqQVNUJywgZ3JhbW1hcikKKworIyAgICAgICAgIGZvciBpbnB1dCwgZXhwZWN0aW5nIGluIHRlc3RzOgorIyAgICAgICAgICAgICBjU3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbShpbnB1dCkKKyMgICAgICAgICAgICAgbGV4ZXIgPSBsZXhlckNscyhjU3RyZWFtKQorIyAgICAgICAgICAgICB0U3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKGxleGVyKQorIyAgICAgICAgICAgICBwYXJzZXIgPSBwYXJzZXJDbHModFN0cmVhbSkKKyMgICAgICAgICAgICAgciA9IGdldGF0dHIocGFyc2VyLCBncmFtbWFyRW50cnkpKCkKKyMgICAgICAgICAgICAgZm91bmQgPSBwYXJzZXIuX291dHB1dAorIyAgICAgICAgICAgICBpZiBidWlsZF9hc3Q6CisjICAgICAgICAgICAgICAgZm91bmQgKz0gci50cmVlLnRvU3RyaW5nVHJlZSgpCisKKyMgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisjICAgICAgICAgICAgICAgICBleHBlY3RpbmcsIGZvdW5kLAorIyAgICAgICAgICAgICAgICAgIiVyICE9ICVyIChmb3IgaW5wdXQgJXIpIiAlIChleHBlY3RpbmcsIGZvdW5kLCBpbnB1dCkpCisKKworIyAgICAgZGVmIHRlc3RTaW1wbGUoc2VsZik6CisjICAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyMgICAgICAgICAgICAgciIiIgorIyAgICAgICAgICAgICBncmFtbWFyIFQ7CisjICAgICAgICAgICAgIG9wdGlvbnMgeworIyAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworIyAgICAgICAgICAgICB9CisjICAgICAgICAgICAgIHMgOiBhIHsgc2VsZi5jYXB0dXJlKCRhLnRleHQpIH0gOworIyAgICAgICAgICAgICBhIDogYSBJRAorIyAgICAgICAgICAgICAgIHwgSUQKKyMgICAgICAgICAgICAgICA7CisjICAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyMgICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworIyAgICAgICAgICAgICAiIiIpCisKKyMgICAgICAgICBmb3VuZCA9IHNlbGYuZXhlY1BhcnNlcihncmFtbWFyLCAncycsICdhIGIgYycpCisjICAgICAgICAgZXhwZWN0aW5nID0gImFiYyIKKyMgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyMgICAgIGRlZiB0ZXN0U2VtUHJlZChzZWxmKToKKyMgICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorIyAgICAgICAgICAgICByIiIiCisjICAgICAgICAgICAgIGdyYW1tYXIgVDsKKyMgICAgICAgICAgICAgb3B0aW9ucyB7CisjICAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisjICAgICAgICAgICAgIH0KKyMgICAgICAgICAgICAgcyA6IGEgeyBzZWxmLmNhcHR1cmUoJGEudGV4dCkgfSA7CisjICAgICAgICAgICAgIGEgOiBhIHtUcnVlfT8gSUQKKyMgICAgICAgICAgICAgICB8IElECisjICAgICAgICAgICAgICAgOworIyAgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisjICAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyMgICAgICAgICAgICAgIiIiKQorCisjICAgICAgICAgZm91bmQgPSBzZWxmLmV4ZWNQYXJzZXIoZ3JhbW1hciwgInMiLCAiYSBiIGMiKQorIyAgICAgICAgIGV4cGVjdGluZyA9ICJhYmMiCisjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworIyAgICAgZGVmIHRlc3RUZXJuYXJ5RXhwcihzZWxmKToKKyMgICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorIyAgICAgICAgICAgICByIiIiCisjICAgICAgICAgICAgIGdyYW1tYXIgVDsKKyMgICAgICAgICAgICAgb3B0aW9ucyB7CisjICAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisjICAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworIyAgICAgICAgICAgICB9CisjICAgICAgICAgICAgIGUgOiBlICcqJ14gZQorIyAgICAgICAgICAgICAgIHwgZSAnKydeIGUKKyMgICAgICAgICAgICAgICB8IGUgJz8nPGFzc29jPXJpZ2h0Pl4gZSAnOichIGUKKyMgICAgICAgICAgICAgICB8IGUgJz0nPGFzc29jPXJpZ2h0Pl4gZQorIyAgICAgICAgICAgICAgIHwgSUQKKyMgICAgICAgICAgICAgICA7CisjICAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyMgICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworIyAgICAgICAgICAgICAiIiIpCisKKyMgICAgICAgICB0ZXN0cyA9IFsKKyMgICAgICAgICAgICAgKCJhIiwgImEiKSwKKyMgICAgICAgICAgICAgKCJhK2IiLCAiKCsgYSBiKSIpLAorIyAgICAgICAgICAgICAoImEqYiIsICIoKiBhIGIpIiksCisjICAgICAgICAgICAgICgiYT9iOmMiLCAiKD8gYSBiIGMpIiksCisjICAgICAgICAgICAgICgiYT1iPWMiLCAiKD0gYSAoPSBiIGMpKSIpLAorIyAgICAgICAgICAgICAoImE/YitjOmQiLCAiKD8gYSAoKyBiIGMpIGQpIiksCisjICAgICAgICAgICAgICgiYT9iPWM6ZCIsICIoPyBhICg9IGIgYykgZCkiKSwKKyMgICAgICAgICAgICAgKCJhPyBiP2M6ZCA6IGUiLCAiKD8gYSAoPyBiIGMgZCkgZSkiKSwKKyMgICAgICAgICAgICAgKCJhP2I6IGM/ZDplIiwgIig/IGEgYiAoPyBjIGQgZSkpIiksCisjICAgICAgICAgICAgIF0KKyMgICAgICAgICBzZWxmLnJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZSIpCisKKworIyAgICAgZGVmIHRlc3REZWNsYXJhdGlvbnNVc2luZ0FTVE9wZXJhdG9ycyhzZWxmKToKKyMgICAgICAgICBncmFtbWFyID0gdGV4dHdyYXAuZGVkZW50KAorIyAgICAgICAgICAgICByIiIiCisjICAgICAgICAgICAgIGdyYW1tYXIgVDsKKyMgICAgICAgICAgICAgb3B0aW9ucyB7CisjICAgICAgICAgICAgICAgICBsYW5ndWFnZT1QeXRob247CisjICAgICAgICAgICAgICAgICBvdXRwdXQ9QVNUOworIyAgICAgICAgICAgICB9CisjICAgICAgICAgICAgIGRlY2xhcmF0b3IKKyMgICAgICAgICAgICAgICAgICAgICA6IGRlY2xhcmF0b3IgJ1snXiBlICddJyEKKyMgICAgICAgICAgICAgICAgICAgICB8IGRlY2xhcmF0b3IgJ1snXiAnXSchCisjICAgICAgICAgICAgICAgICAgICAgfCBkZWNsYXJhdG9yICcoJ14gJyknIQorIyAgICAgICAgICAgICAgICAgICAgIHwgJyonXiBkZWNsYXJhdG9yIC8vIGJpbmRzIGxlc3MgdGlnaHQgdGhhbiBzdWZmaXhlcworIyAgICAgICAgICAgICAgICAgICAgIHwgJygnISBkZWNsYXJhdG9yICcpJyEKKyMgICAgICAgICAgICAgICAgICAgICB8IElECisjICAgICAgICAgICAgICAgICAgICAgOworIyAgICAgICAgICAgICBlIDogSU5UIDsKKyMgICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworIyAgICAgICAgICAgICBJTlQgOiAnMCcuLic5JysgOworIyAgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykge3NlbGYuc2tpcCgpfSA7CisjICAgICAgICAgICAgICIiIikKKworIyAgICAgICAgIHRlc3RzID0gWworIyAgICAgICAgICAgICAoImEiLCAiYSIpLAorIyAgICAgICAgICAgICAoIiphIiwgIigqIGEpIiksCisjICAgICAgICAgICAgICgiKiphIiwgIigqICgqIGEpKSIpLAorIyAgICAgICAgICAgICAoImFbM10iLCAiKFsgYSAzKSIpLAorIyAgICAgICAgICAgICAoImJbXSIsICIoWyBiKSIpLAorIyAgICAgICAgICAgICAoIihhKSIsICJhIiksCisjICAgICAgICAgICAgICgiYVtdKCkiLCAiKCggKFsgYSkpIiksCisjICAgICAgICAgICAgICgiYVtdW10iLCAiKFsgKFsgYSkpIiksCisjICAgICAgICAgICAgICgiKmFbXSIsICIoKiAoWyBhKSkiKSwKKyMgICAgICAgICAgICAgKCIoKmEpW10iLCAiKFsgKCogYSkpIiksCisjICAgICAgICAgICAgIF0KKyMgICAgICAgICBzZWxmLnJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZGVjbGFyYXRvciIpCisKKworIyAgICAgZGVmIHRlc3REZWNsYXJhdGlvbnNVc2luZ1Jld3JpdGVPcGVyYXRvcnMoc2VsZik6CisjICAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyMgICAgICAgICAgICAgciIiIgorIyAgICAgICAgICAgICBncmFtbWFyIFQ7CisjICAgICAgICAgICAgIG9wdGlvbnMgeworIyAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworIyAgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyMgICAgICAgICAgICAgfQorIyAgICAgICAgICAgICBkZWNsYXJhdG9yCisjICAgICAgICAgICAgICAgICAgICAgOiBkZWNsYXJhdG9yICdbJyBlICddJyAtPiBeKCdbJyBkZWNsYXJhdG9yIGUpCisjICAgICAgICAgICAgICAgICAgICAgfCBkZWNsYXJhdG9yICdbJyAnXScgLT4gXignWycgZGVjbGFyYXRvcikKKyMgICAgICAgICAgICAgICAgICAgICB8IGRlY2xhcmF0b3IgJygnICcpJyAtPiBeKCcoJyBkZWNsYXJhdG9yKQorIyAgICAgICAgICAgICAgICAgICAgIHwgJyonIGRlY2xhcmF0b3IgLT4gXignKicgZGVjbGFyYXRvcikgIC8vIGJpbmRzIGxlc3MgdGlnaHQgdGhhbiBzdWZmaXhlcworIyAgICAgICAgICAgICAgICAgICAgIHwgJygnIGRlY2xhcmF0b3IgJyknIC0+IGRlY2xhcmF0b3IKKyMgICAgICAgICAgICAgICAgICAgICB8IElEIC0+IElECisjICAgICAgICAgICAgICAgICAgICAgOworIyAgICAgICAgICAgICBlIDogSU5UIDsKKyMgICAgICAgICAgICAgSUQgOiAnYScuLid6JysgOworIyAgICAgICAgICAgICBJTlQgOiAnMCcuLic5JysgOworIyAgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykge3NlbGYuc2tpcCgpfSA7CisjICAgICAgICAgICAgICIiIikKKworIyAgICAgICAgIHRlc3RzID0gWworIyAgICAgICAgICAgICAoImEiLCAiYSIpLAorIyAgICAgICAgICAgICAoIiphIiwgIigqIGEpIiksCisjICAgICAgICAgICAgICgiKiphIiwgIigqICgqIGEpKSIpLAorIyAgICAgICAgICAgICAoImFbM10iLCAiKFsgYSAzKSIpLAorIyAgICAgICAgICAgICAoImJbXSIsICIoWyBiKSIpLAorIyAgICAgICAgICAgICAoIihhKSIsICJhIiksCisjICAgICAgICAgICAgICgiYVtdKCkiLCAiKCggKFsgYSkpIiksCisjICAgICAgICAgICAgICgiYVtdW10iLCAiKFsgKFsgYSkpIiksCisjICAgICAgICAgICAgICgiKmFbXSIsICIoKiAoWyBhKSkiKSwKKyMgICAgICAgICAgICAgKCIoKmEpW10iLCAiKFsgKCogYSkpIiksCisjICAgICAgICAgICAgIF0KKyMgICAgICAgICBzZWxmLnJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZGVjbGFyYXRvciIpCisKKworIyAgICAgZGVmIHRlc3RFeHByZXNzaW9uc1VzaW5nQVNUT3BlcmF0b3JzKHNlbGYpOgorIyAgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisjICAgICAgICAgICAgIHIiIiIKKyMgICAgICAgICAgICAgZ3JhbW1hciBUOworIyAgICAgICAgICAgICBvcHRpb25zIHsKKyMgICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyMgICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisjICAgICAgICAgICAgIH0KKyMgICAgICAgICAgICAgZSA6IGUgJy4nXiBJRAorIyAgICAgICAgICAgICAgIHwgZSAnLideICd0aGlzJworIyAgICAgICAgICAgICAgIHwgJy0nXiBlCisjICAgICAgICAgICAgICAgfCBlICcqJ14gZQorIyAgICAgICAgICAgICAgIHwgZSAoJysnXnwnLSdeKSBlCisjICAgICAgICAgICAgICAgfCBJTlQKKyMgICAgICAgICAgICAgICB8IElECisjICAgICAgICAgICAgICAgOworIyAgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisjICAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisjICAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyMgICAgICAgICAgICAgIiIiKQorCisjICAgICAgICAgdGVzdHMgPSBbCisjICAgICAgICAgICAgICgiYSIsICJhIiksCisjICAgICAgICAgICAgICgiMSIsICIxIiksCisjICAgICAgICAgICAgICgiYSsxIiwgIigrIGEgMSkiKSwKKyMgICAgICAgICAgICAgKCJhKjEiLCAiKCogYSAxKSIpLAorIyAgICAgICAgICAgICAoImEuYiIsICIoLiBhIGIpIiksCisjICAgICAgICAgICAgICgiYS50aGlzIiwgIiguIGEgdGhpcykiKSwKKyMgICAgICAgICAgICAgKCJhLWIrYyIsICIoKyAoLSBhIGIpIGMpIiksCisjICAgICAgICAgICAgICgiYStiKmMiLCAiKCsgYSAoKiBiIGMpKSIpLAorIyAgICAgICAgICAgICAoImEuYisxIiwgIigrICguIGEgYikgMSkiKSwKKyMgICAgICAgICAgICAgKCItYSIsICIoLSBhKSIpLAorIyAgICAgICAgICAgICAoIi1hK2IiLCAiKCsgKC0gYSkgYikiKSwKKyMgICAgICAgICAgICAgKCItYS5iIiwgIigtICguIGEgYikpIiksCisjICAgICAgICAgICAgIF0KKyMgICAgICAgICBzZWxmLnJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZSIpCisKKworIyAgICAgQHRlc3RiYXNlLmJyb2tlbigKKyMgICAgICAgICAiR3JhbW1hciBjb21waWxhdGlvbiByZXR1cm5zIGVycm9ycyIsIHRlc3RiYXNlLkdyYW1tYXJDb21waWxlRXJyb3IpCisjICAgICBkZWYgdGVzdEV4cHJlc3Npb25zVXNpbmdSZXdyaXRlT3BlcmF0b3JzKHNlbGYpOgorIyAgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisjICAgICAgICAgICAgIHIiIiIKKyMgICAgICAgICAgICAgZ3JhbW1hciBUOworIyAgICAgICAgICAgICBvcHRpb25zIHsKKyMgICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyMgICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisjICAgICAgICAgICAgIH0KKyMgICAgICAgICAgICAgZSA6IGUgJy4nIElEICAgICAgICAgICAgICAgICAgIC0+IF4oJy4nIGUgSUQpCisjICAgICAgICAgICAgICAgfCBlICcuJyAndGhpcycgICAgICAgICAgICAgICAtPiBeKCcuJyBlICd0aGlzJykKKyMgICAgICAgICAgICAgICB8ICctJyBlICAgICAgICAgICAgICAgICAgICAgIC0+IF4oJy0nIGUpCisjICAgICAgICAgICAgICAgfCBlICcqJyBiPWUgICAgICAgICAgICAgICAgICAtPiBeKCcqJyBlICRiKQorIyAgICAgICAgICAgICAgIHwgZSAob3A9JysnfG9wPSctJykgYj1lICAgICAgLT4gXigkb3AgZSAkYikKKyMgICAgICAgICAgICAgICB8IElOVCAgICAgICAgICAgICAgICAgICAgICAgIC0+IElOVAorIyAgICAgICAgICAgICAgIHwgSUQgICAgICAgICAgICAgICAgICAgICAgICAgLT4gSUQKKyMgICAgICAgICAgICAgICA7CisjICAgICAgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyMgICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyMgICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworIyAgICAgICAgICAgICAiIiIpCisKKyMgICAgICAgICB0ZXN0cyA9IFsKKyMgICAgICAgICAgICAgKCJhIiwgImEiKSwKKyMgICAgICAgICAgICAgKCIxIiwgIjEiKSwKKyMgICAgICAgICAgICAgKCJhKzEiLCAiKCsgYSAxKSIpLAorIyAgICAgICAgICAgICAoImEqMSIsICIoKiBhIDEpIiksCisjICAgICAgICAgICAgICgiYS5iIiwgIiguIGEgYikiKSwKKyMgICAgICAgICAgICAgKCJhLnRoaXMiLCAiKC4gYSB0aGlzKSIpLAorIyAgICAgICAgICAgICAoImErYipjIiwgIigrIGEgKCogYiBjKSkiKSwKKyMgICAgICAgICAgICAgKCJhLmIrMSIsICIoKyAoLiBhIGIpIDEpIiksCisjICAgICAgICAgICAgICgiLWEiLCAiKC0gYSkiKSwKKyMgICAgICAgICAgICAgKCItYStiIiwgIigrICgtIGEpIGIpIiksCisjICAgICAgICAgICAgICgiLWEuYiIsICIoLSAoLiBhIGIpKSIpLAorIyAgICAgICAgICAgICBdCisjICAgICAgICAgc2VsZi5ydW5UZXN0cyhncmFtbWFyLCB0ZXN0cywgImUiKQorCisKKyMgICAgIGRlZiB0ZXN0RXhwcmVzc2lvbkFzc29jaWF0aXZpdHkoc2VsZik6CisjICAgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyMgICAgICAgICAgICAgciIiIgorIyAgICAgICAgICAgICBncmFtbWFyIFQ7CisjICAgICAgICAgICAgIG9wdGlvbnMgeworIyAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworIyAgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyMgICAgICAgICAgICAgfQorIyAgICAgICAgICAgICBlCisjICAgICAgICAgICAgICAgOiBlICcuJ14gSUQKKyMgICAgICAgICAgICAgICB8ICctJ14gZQorIyAgICAgICAgICAgICAgIHwgZSAnXic8YXNzb2M9cmlnaHQ+XiBlCisjICAgICAgICAgICAgICAgfCBlICcqJ14gZQorIyAgICAgICAgICAgICAgIHwgZSAoJysnXnwnLSdeKSBlCisjICAgICAgICAgICAgICAgfCBlICgnPSc8YXNzb2M9cmlnaHQ+XiB8Jys9Jzxhc3NvYz1yaWdodD5eKSBlCisjICAgICAgICAgICAgICAgfCBJTlQKKyMgICAgICAgICAgICAgICB8IElECisjICAgICAgICAgICAgICAgOworIyAgICAgICAgICAgICBJRCA6ICdhJy4uJ3onKyA7CisjICAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisjICAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyMgICAgICAgICAgICAgIiIiKQorCisjICAgICAgICAgdGVzdHMgPSBbCisjICAgICAgICAgICAgICgiYSIsICJhIiksCisjICAgICAgICAgICAgICgiMSIsICIxIiksCisjICAgICAgICAgICAgICgiYSsxIiwgIigrIGEgMSkiKSwKKyMgICAgICAgICAgICAgKCJhKjEiLCAiKCogYSAxKSIpLAorIyAgICAgICAgICAgICAoImEuYiIsICIoLiBhIGIpIiksCisjICAgICAgICAgICAgICgiYS1iK2MiLCAiKCsgKC0gYSBiKSBjKSIpLAorIyAgICAgICAgICAgICAoImErYipjIiwgIigrIGEgKCogYiBjKSkiKSwKKyMgICAgICAgICAgICAgKCJhLmIrMSIsICIoKyAoLiBhIGIpIDEpIiksCisjICAgICAgICAgICAgICgiLWEiLCAiKC0gYSkiKSwKKyMgICAgICAgICAgICAgKCItYStiIiwgIigrICgtIGEpIGIpIiksCisjICAgICAgICAgICAgICgiLWEuYiIsICIoLSAoLiBhIGIpKSIpLAorIyAgICAgICAgICAgICAoImFeYl5jIiwgIiheIGEgKF4gYiBjKSkiKSwKKyMgICAgICAgICAgICAgKCJhPWI9YyIsICIoPSBhICg9IGIgYykpIiksCisjICAgICAgICAgICAgICgiYT1iPWMrZC5lIiwgIig9IGEgKD0gYiAoKyBjICguIGQgZSkpKSkiKSwKKyMgICAgICAgICAgICAgXQorIyAgICAgICAgIHNlbGYucnVuVGVzdHMoZ3JhbW1hciwgdGVzdHMsICJlIikKKworCisjICAgICBkZWYgdGVzdEphdmFFeHByZXNzaW9ucyhzZWxmKToKKyMgICAgICAgZ3JhbW1hciA9IHRleHR3cmFwLmRlZGVudCgKKyMgICAgICAgICAgICAgciIiIgorIyAgICAgICAgICAgICBncmFtbWFyIFQ7CisjICAgICAgICAgICAgIG9wdGlvbnMgeworIyAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9UHl0aG9uOworIyAgICAgICAgICAgICAgICAgb3V0cHV0PUFTVDsKKyMgICAgICAgICAgICAgfQorIyAgICAgICAgICAgICBleHByZXNzaW9uTGlzdAorIyAgICAgICAgICAgICAgICAgOiAgIGUgKCcsJyEgZSkqCisjICAgICAgICAgICAgICAgICA7CisjICAgICAgICAgICAgIGUgICA6ICAgJygnISBlICcpJyEKKyMgICAgICAgICAgICAgICAgIHwgICAndGhpcycKKyMgICAgICAgICAgICAgICAgIHwgICAnc3VwZXInCisjICAgICAgICAgICAgICAgICB8ICAgSU5UCisjICAgICAgICAgICAgICAgICB8ICAgSUQKKyMgICAgICAgICAgICAgICAgIHwgICB0eXBlICcuJ14gJ2NsYXNzJworIyAgICAgICAgICAgICAgICAgfCAgIGUgJy4nXiBJRAorIyAgICAgICAgICAgICAgICAgfCAgIGUgJy4nXiAndGhpcycKKyMgICAgICAgICAgICAgICAgIHwgICBlICcuJ14gJ3N1cGVyJyAnKCdeIGV4cHJlc3Npb25MaXN0PyAnKSchCisjICAgICAgICAgICAgICAgICB8ICAgZSAnLideICduZXcnXiBJRCAnKCchIGV4cHJlc3Npb25MaXN0PyAnKSchCisjICAgICAgICAgICAgICAgICB8ICAgICAgICduZXcnXiB0eXBlICggJygnIGV4cHJlc3Npb25MaXN0PyAnKSchIHwgKG9wdGlvbnMge2s9MTt9OidbJyBlICddJyEpKykgLy8gdWdseTsgc2ltcGxpZmllZAorIyAgICAgICAgICAgICAgICAgfCAgIGUgJ1snXiBlICddJyEKKyMgICAgICAgICAgICAgICAgIHwgICAnKCdeIHR5cGUgJyknISBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAoJysrJ14gfCAnLS0nXikKKyMgICAgICAgICAgICAgICAgIHwgICBlICcoJ14gZXhwcmVzc2lvbkxpc3Q/ICcpJyEKKyMgICAgICAgICAgICAgICAgIHwgICAoJysnXnwnLSdefCcrKydefCctLSdeKSBlCisjICAgICAgICAgICAgICAgICB8ICAgKCd+J158JyEnXikgZQorIyAgICAgICAgICAgICAgICAgfCAgIGUgKCcqJ158Jy8nXnwnJSdeKSBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAoJysnXnwnLSdeKSBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAoJzwnXiAnPCcgfCAnPideICc+JyAnPicgfCAnPideICc+JykgZQorIyAgICAgICAgICAgICAgICAgfCAgIGUgKCc8PSdeIHwgJz49J14gfCAnPideIHwgJzwnXikgZQorIyAgICAgICAgICAgICAgICAgfCAgIGUgJ2luc3RhbmNlb2YnXiBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAoJz09J14gfCAnIT0nXikgZQorIyAgICAgICAgICAgICAgICAgfCAgIGUgJyYnXiBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAnXic8YXNzb2M9cmlnaHQ+XiBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAnfCdeIGUKKyMgICAgICAgICAgICAgICAgIHwgICBlICcmJideIGUKKyMgICAgICAgICAgICAgICAgIHwgICBlICd8fCdeIGUKKyMgICAgICAgICAgICAgICAgIHwgICBlICc/JyBlICc6JyBlCisjICAgICAgICAgICAgICAgICB8ICAgZSAoJz0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnKz0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnLT0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnKj0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnLz0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnJj0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnfD0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnXj0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnPj49Jzxhc3NvYz1yaWdodD5eCisjICAgICAgICAgICAgICAgICAgICAgICB8Jz4+Pj0nPGFzc29jPXJpZ2h0Pl4KKyMgICAgICAgICAgICAgICAgICAgICAgIHwnPDw9Jzxhc3NvYz1yaWdodD5eCisjICAgICAgICAgICAgICAgICAgICAgICB8JyU9Jzxhc3NvYz1yaWdodD5eKSBlCisjICAgICAgICAgICAgICAgICA7CisjICAgICAgICAgICAgIHR5cGU6IElECisjICAgICAgICAgICAgICAgICB8IElEICdbJ14gJ10nIQorIyAgICAgICAgICAgICAgICAgfCAnaW50JworIyAgICAgICAgICAgICAgICAgfCAnaW50JyAnWydeICddJyEKKyMgICAgICAgICAgICAgICAgIDsKKyMgICAgICAgICAgICAgSUQgOiAoJ2EnLi4neid8J0EnLi4nWid8J18nfCckJykrOworIyAgICAgICAgICAgICBJTlQgOiAnMCcuLic5JysgOworIyAgICAgICAgICAgICBXUyA6ICgnICd8J1xuJykge3NlbGYuc2tpcCgpfSA7CisjICAgICAgICAgICAgICIiIikKKworIyAgICAgICB0ZXN0cyA9IFsKKyMgICAgICAgICAgICgiYSIsICJhIiksCisjICAgICAgICAgICAoIjEiLCAiMSIpLAorIyAgICAgICAgICAgKCJhKzEiLCAiKCsgYSAxKSIpLAorIyAgICAgICAgICAgKCJhKjEiLCAiKCogYSAxKSIpLAorIyAgICAgICAgICAgKCJhLmIiLCAiKC4gYSBiKSIpLAorIyAgICAgICAgICAgKCJhLWIrYyIsICIoKyAoLSBhIGIpIGMpIiksCisjICAgICAgICAgICAoImErYipjIiwgIigrIGEgKCogYiBjKSkiKSwKKyMgICAgICAgICAgICgiYS5iKzEiLCAiKCsgKC4gYSBiKSAxKSIpLAorIyAgICAgICAgICAgKCItYSIsICIoLSBhKSIpLAorIyAgICAgICAgICAgKCItYStiIiwgIigrICgtIGEpIGIpIiksCisjICAgICAgICAgICAoIi1hLmIiLCAiKC0gKC4gYSBiKSkiKSwKKyMgICAgICAgICAgICgiYV5iXmMiLCAiKF4gYSAoXiBiIGMpKSIpLAorIyAgICAgICAgICAgKCJhPWI9YyIsICIoPSBhICg9IGIgYykpIiksCisjICAgICAgICAgICAoImE9Yj1jK2QuZSIsICIoPSBhICg9IGIgKCsgYyAoLiBkIGUpKSkpIiksCisjICAgICAgICAgICAoImF8YiZjIiwgIih8IGEgKCYgYiBjKSkiKSwKKyMgICAgICAgICAgICgiKGF8YikmYyIsICIoJiAofCBhIGIpIGMpIiksCisjICAgICAgICAgICAoImEgPiBiIiwgIig+IGEgYikiKSwKKyMgICAgICAgICAgICgiYSA+PiBiIiwgIig+IGEgYikiKSwgICMgdGV4dCBpcyBmcm9tIG9uZSB0b2tlbgorIyAgICAgICAgICAgKCJhIDwgYiIsICIoPCBhIGIpIiksCisjICAgICAgICAgICAoIihUKXgiLCAiKCggVCB4KSIpLAorIyAgICAgICAgICAgKCJuZXcgQSgpLmIiLCAiKC4gKG5ldyBBICgpIGIpIiksCisjICAgICAgICAgICAoIihUKXQuZigpIiwgIigoICgoIFQgKC4gdCBmKSkpIiksCisjICAgICAgICAgICAoImEuZih4KT09VC5jIiwgIig9PSAoKCAoLiBhIGYpIHgpICguIFQgYykpIiksCisjICAgICAgICAgICAoImEuZigpLmcoeCwxKSIsICIoKCAoLiAoKCAoLiBhIGYpKSBnKSB4IDEpIiksCisjICAgICAgICAgICAoIm5ldyBUWygobi0xKSAqIHgpICsgMV0iLCAiKG5ldyBUIFsgKCsgKCogKC0gbiAxKSB4KSAxKSkiKSwKKyMgICAgICAgICAgIF0KKyMgICAgICAgc2VsZi5ydW5UZXN0cyhncmFtbWFyLCB0ZXN0cywgImUiKQorCisKKyMgICAgIGRlZiB0ZXN0UmV0dXJuVmFsdWVBbmRBY3Rpb25zKHNlbGYpOgorIyAgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisjICAgICAgICAgICAgIHIiIiIKKyMgICAgICAgICAgICAgZ3JhbW1hciBUOworIyAgICAgICAgICAgICBvcHRpb25zIHsKKyMgICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyMgICAgICAgICAgICAgfQorIyAgICAgICAgICAgICBzIDogZSB7IHNlbGYuY2FwdHVyZSgkZS52KSB9IDsKKyMgICAgICAgICAgICAgZSByZXR1cm5zIFt2LCBpZ25vcmVkXQorIyAgICAgICAgICAgICAgIDogZSAnKicgYj1lIHskdiAqPSAkYi52O30KKyMgICAgICAgICAgICAgICB8IGUgJysnIGI9ZSB7JHYgKz0gJGIudjt9CisjICAgICAgICAgICAgICAgfCBJTlQgeyR2ID0gaW50KCRJTlQudGV4dCk7fQorIyAgICAgICAgICAgICAgIDsKKyMgICAgICAgICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyMgICAgICAgICAgICAgV1MgOiAoJyAnfCdcbicpIHtzZWxmLnNraXAoKX0gOworIyAgICAgICAgICAgICAiIiIpCisKKyMgICAgICAgICB0ZXN0cyA9IFsKKyMgICAgICAgICAgICAgKCI0IiwgIjQiKSwKKyMgICAgICAgICAgICAgKCIxKzIiLCAiMyIpCisjICAgICAgICAgICAgIF0KKyMgICAgICAgICBzZWxmLnJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAicyIpCisKKworIyAgICAgZGVmIHRlc3RSZXR1cm5WYWx1ZUFuZEFjdGlvbnNBbmRBU1RzKHNlbGYpOgorIyAgICAgICAgIGdyYW1tYXIgPSB0ZXh0d3JhcC5kZWRlbnQoCisjICAgICAgICAgICAgIHIiIiIKKyMgICAgICAgICAgICAgZ3JhbW1hciBUOworIyAgICAgICAgICAgICBvcHRpb25zIHsKKyMgICAgICAgICAgICAgICAgIGxhbmd1YWdlPVB5dGhvbjsKKyMgICAgICAgICAgICAgICAgIG91dHB1dD1BU1Q7CisjICAgICAgICAgICAgIH0KKyMgICAgICAgICAgICAgcyA6IGUgeyBzZWxmLmNhcHR1cmUoInY9XCVzLCAiIFwlICRlLnYpIH0gOworIyAgICAgICAgICAgICBlIHJldHVybnMgW3YsIGlnbm9yZWRdCisjICAgICAgICAgICAgICAgOiBlICcqJ14gYj1lIHskdiAqPSAkYi52O30KKyMgICAgICAgICAgICAgICB8IGUgJysnXiBiPWUgeyR2ICs9ICRiLnY7fQorIyAgICAgICAgICAgICAgIHwgSU5UIHskdiA9IGludCgkSU5ULnRleHQpO30KKyMgICAgICAgICAgICAgICA7CisjICAgICAgICAgICAgIElOVCA6ICcwJy4uJzknKyA7CisjICAgICAgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2VsZi5za2lwKCl9IDsKKyMgICAgICAgICAgICAgIiIiKQorCisjICAgICAgICAgdGVzdHMgPSBbCisjICAgICAgICAgICAgICgiNCIsICJ2PTQsIDQiKSwKKyMgICAgICAgICAgICAgKCIxKzIiLCAidj0zLCAoKyAxIDIpIiksCisjICAgICAgICAgICAgIF0KKyMgICAgICAgICBzZWxmLnJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAicyIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90ZXN0YmFzZS5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi90ZXN0cy90ZXN0YmFzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWM3ZmVjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3Rlc3RzL3Rlc3RiYXNlLnB5CkBAIC0wLDAgKzEsNDUwIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgoraW1wb3J0IHJlCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgaGFzaGxpYgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCitpbXBvcnQgYW50bHIzCisKK2RlZiB1bmxpbmsocGF0aCk6CisgICAgdHJ5OgorICAgICAgICBvcy51bmxpbmsocGF0aCkKKyAgICBleGNlcHQgT1NFcnJvciwgZXhjOgorICAgICAgICBpZiBleGMuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgcmFpc2UKKworCitjbGFzcyBHcmFtbWFyQ29tcGlsZUVycm9yKEV4Y2VwdGlvbik6CisgICIiIkdyYW1tYXIgZmFpbGVkIHRvIGNvbXBpbGUuIiIiCisgIHBhc3MKKworCisjIEF0IGxlYXN0IG9uIE1hY09TWCB0ZW1wZGlyICgvdG1wKSBpcyBhIHN5bWxpbmsuIEl0J3Mgc29tZXRpbWVzIGRlcmVmZXJlbmNlcywKKyMgc29tZXRpbWVzIG5vdCwgYnJlYWtpbmcgdGhlIGluc3BlY3QuZ2V0bW9kdWxlKCkgZnVuY3Rpb24uCit0ZXN0YmFzZWRpciA9IG9zLnBhdGguam9pbigKKyAgICBvcy5wYXRoLnJlYWxwYXRoKHRlbXBmaWxlLmdldHRlbXBkaXIoKSksCisgICAgJ2FudGxyMy10ZXN0JykKKworCitjbGFzcyBCcm9rZW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLmZhaWx1cmVFeGNlcHRpb24pOgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgbmFtZSwgcmVhc29uID0gc2VsZi5hcmdzCisgICAgICAgIHJldHVybiAnJXM6ICVzOiAlcyB3b3JrcyBub3cnICUgKAorICAgICAgICAgICAgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBuYW1lLCByZWFzb24pKQorCisKK2RlZiBicm9rZW4ocmVhc29uLCAqZXhjZXB0aW9ucyk6CisgICAgJycnSW5kaWNhdGVzIGEgZmFpbGluZyAob3IgZXJyb25lb3VzKSB0ZXN0IGNhc2UgZmFpbHMgdGhhdCBzaG91bGQgc3VjY2VlZC4KKyAgICBJZiB0aGUgdGVzdCBmYWlscyB3aXRoIGFuIGV4Y2VwdGlvbiwgbGlzdCB0aGUgZXhjZXB0aW9uIHR5cGUgaW4gYXJncycnJworICAgIGRlZiB3cmFwcGVyKHRlc3RfbWV0aG9kKToKKyAgICAgICAgZGVmIHJlcGxhY2VtZW50KCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVzdF9tZXRob2QoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgZXhjZXB0IGV4Y2VwdGlvbnMgb3IgdW5pdHRlc3QuVGVzdENhc2UuZmFpbHVyZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEJyb2tlblRlc3QodGVzdF9tZXRob2QuX19uYW1lX18sIHJlYXNvbikKKyAgICAgICAgcmVwbGFjZW1lbnQuX19kb2NfXyA9IHRlc3RfbWV0aG9kLl9fZG9jX18KKyAgICAgICAgcmVwbGFjZW1lbnQuX19uYW1lX18gPSAnWFhYXycgKyB0ZXN0X21ldGhvZC5fX25hbWVfXworICAgICAgICByZXBsYWNlbWVudC50b2RvID0gcmVhc29uCisgICAgICAgIHJldHVybiByZXBsYWNlbWVudAorICAgIHJldHVybiB3cmFwcGVyCisKKworZGVwZW5kZW5jeUNhY2hlID0ge30KK2NvbXBpbGVFcnJvckNhY2hlID0ge30KKworIyBzZXR1cCBqYXZhIENMQVNTUEFUSAoraWYgJ0NMQVNTUEFUSCcgbm90IGluIG9zLmVudmlyb246CisgICAgY3AgPSBbXQorCisgICAgYmFzZURpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJywgJy4uJywgJy4uJykpCisgICAgbGliRGlyID0gb3MucGF0aC5qb2luKGJhc2VEaXIsICdsaWInKQorCisgICAgamFyID0gb3MucGF0aC5qb2luKGxpYkRpciwgJ1NULTQuMC4xLmphcicpCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGphcik6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICJNaXNzaW5nIGZpbGUgJyVzJy4gR3JhcCBpdCBmcm9tIGEgZGlzdHJpYnV0aW9uIHBhY2thZ2UuIgorICAgICAgICAgICAgJSBqYXIsCisgICAgICAgICAgICApCisgICAgY3AuYXBwZW5kKGphcikKKworICAgIGphciA9IG9zLnBhdGguam9pbihsaWJEaXIsICdhbnRsci0yLjcuNy5qYXInKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShqYXIpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAiTWlzc2luZyBmaWxlICclcycuIEdyYXAgaXQgZnJvbSBhIGRpc3RyaWJ1dGlvbiBwYWNrYWdlLiIKKyAgICAgICAgICAgICUgamFyLAorICAgICAgICAgICAgKQorICAgIGNwLmFwcGVuZChqYXIpCisKKyAgICBqYXIgPSBvcy5wYXRoLmpvaW4obGliRGlyLCAnanVuaXQtNC4yLmphcicpCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGphcik6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICJNaXNzaW5nIGZpbGUgJyVzJy4gR3JhcCBpdCBmcm9tIGEgZGlzdHJpYnV0aW9uIHBhY2thZ2UuIgorICAgICAgICAgICAgJSBqYXIsCisgICAgICAgICAgICApCisgICAgY3AuYXBwZW5kKGphcikKKworICAgIGNwLmFwcGVuZChvcy5wYXRoLmpvaW4oYmFzZURpciwgJ3J1bnRpbWUnLCAnUHl0aG9uJywgJ2J1aWxkJykpCisKKyAgICBjbGFzc3BhdGggPSAnLWNwICInICsgJzonLmpvaW4oW29zLnBhdGguYWJzcGF0aChwKSBmb3IgcCBpbiBjcF0pICsgJyInCisKK2Vsc2U6CisgICAgY2xhc3NwYXRoID0gJycKKworCitjbGFzcyBBTlRMUlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgc2VsZi5tb2R1bGVOYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHN5cy5tb2R1bGVzW3NlbGYuX19tb2R1bGVfX10uX19maWxlX18pKVswXQorICAgICAgICBzZWxmLmNsYXNzTmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIHNlbGYuX2Jhc2VEaXIgPSBOb25lCisKKyAgICAgICAgc2VsZi5sZXhlck1vZHVsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJzZXJNb2R1bGUgPSBOb25lCisKKyAgICAgICAgc2VsZi5ncmFtbWFyTmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5ncmFtbWFyVHlwZSA9IE5vbmUKKworCisgICAgZGVmIGFzc2VydExpc3RFcXVhbChzZWxmLCBhLCBiKToKKyAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1wb3J0IGRpZmZsaWIKKyAgICAgICAgYSA9IFtzdHIobCkgKyAnXG4nIGZvciBsIGluIGFdCisgICAgICAgIGIgPSBbc3RyKGwpICsgJ1xuJyBmb3IgbCBpbiBiXQorCisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCcnLmpvaW4oZGlmZmxpYi51bmlmaWVkX2RpZmYoYSwgYikpKQorCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYmFzZURpcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fYmFzZURpciBpcyBOb25lOgorICAgICAgICAgICAgdGVzdE5hbWUgPSAndW5rbm93blRlc3QnCisgICAgICAgICAgICBmb3IgZnJhbWUgaW4gaW5zcGVjdC5zdGFjaygpOgorICAgICAgICAgICAgICAgIGNvZGUgPSBmcmFtZVswXS5mX2NvZGUKKyAgICAgICAgICAgICAgICBjb2RlTW9kID0gaW5zcGVjdC5nZXRtb2R1bGUoY29kZSkKKyAgICAgICAgICAgICAgICBpZiBjb2RlTW9kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIHNraXAgZnJhbWVzIG5vdCBpbiByZXF1ZXN0ZWQgbW9kdWxlCisgICAgICAgICAgICAgICAgaWYgY29kZU1vZCBpcyBub3Qgc3lzLm1vZHVsZXNbc2VsZi5fX21vZHVsZV9fXToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgc2tpcCBzb21lIHVud2FudGVkIG5hbWVzCisgICAgICAgICAgICAgICAgaWYgY29kZS5jb19uYW1lIGluICgnbmV4dFRva2VuJywgJzxtb2R1bGU+Jyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBjb2RlLmNvX25hbWUuc3RhcnRzd2l0aCgndGVzdCcpOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZSA9IGNvZGUuY29fbmFtZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBzZWxmLl9iYXNlRGlyID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgIHRlc3RiYXNlZGlyLAorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlTmFtZSwgc2VsZi5jbGFzc05hbWUsIHRlc3ROYW1lKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5fYmFzZURpcik6CisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5fYmFzZURpcikKKworICAgICAgICByZXR1cm4gc2VsZi5fYmFzZURpcgorCisKKyAgICBkZWYgX2ludm9rZWFudGxyKHNlbGYsIGRpciwgZmlsZSwgb3B0aW9ucywgamF2YU9wdGlvbnM9JycpOgorICAgICAgICBjbWQgPSAnY2QgJXM7IGphdmEgJXMgJXMgb3JnLmFudGxyLlRvb2wgLW8gLiAlcyAlcyAyPiYxJyAlICgKKyAgICAgICAgICAgIGRpciwgamF2YU9wdGlvbnMsIGNsYXNzcGF0aCwgb3B0aW9ucywgZmlsZQorICAgICAgICAgICAgKQorICAgICAgICBmcCA9IG9zLnBvcGVuKGNtZCkKKyAgICAgICAgb3V0cHV0ID0gJycKKyAgICAgICAgZmFpbGVkID0gRmFsc2UKKyAgICAgICAgZm9yIGxpbmUgaW4gZnA6CisgICAgICAgICAgICBvdXRwdXQgKz0gbGluZQorCisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ2Vycm9yKCcpOgorICAgICAgICAgICAgICAgIGZhaWxlZCA9IFRydWUKKworICAgICAgICByYyA9IGZwLmNsb3NlKCkKKyAgICAgICAgaWYgcmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmYWlsZWQgPSBUcnVlCisKKyAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckNvbXBpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbXBpbGUgZ3JhbW1hciAnJXMnOlxuJXNcblxuIiAlIChmaWxlLCBjbWQpCisgICAgICAgICAgICAgICAgKyBvdXRwdXQKKyAgICAgICAgICAgICAgICApCisKKworICAgIGRlZiBjb21waWxlR3JhbW1hcihzZWxmLCBncmFtbWFyTmFtZT1Ob25lLCBvcHRpb25zPScnLCBqYXZhT3B0aW9ucz0nJyk6CisgICAgICAgIGlmIGdyYW1tYXJOYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBncmFtbWFyTmFtZSA9IHNlbGYubW9kdWxlTmFtZSArICcuZycKKworICAgICAgICBzZWxmLl9iYXNlRGlyID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgdGVzdGJhc2VkaXIsCisgICAgICAgICAgICBzZWxmLm1vZHVsZU5hbWUpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYuX2Jhc2VEaXIpOgorICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5fYmFzZURpcikKKworICAgICAgICBpZiBzZWxmLmdyYW1tYXJOYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmdyYW1tYXJOYW1lID0gb3MucGF0aC5zcGxpdGV4dChncmFtbWFyTmFtZSlbMF0KKworICAgICAgICBncmFtbWFyUGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksIGdyYW1tYXJOYW1lKQorCisgICAgICAgICMgZ2V0IHR5cGUgYW5kIG5hbWUgZnJvbSBmaXJzdCBncmFtbWFyIGxpbmUKKyAgICAgICAgZ3JhbW1hciA9IG9wZW4oZ3JhbW1hclBhdGgsICdyJykucmVhZCgpCisgICAgICAgIG0gPSByZS5tYXRjaChyJ1xzKigobGV4ZXJ8cGFyc2VyfHRyZWUpXHMrfClncmFtbWFyXHMrKFxTKyk7JywgZ3JhbW1hciwgcmUuTVVMVElMSU5FKQorICAgICAgICBhc3NlcnQgbSBpcyBub3QgTm9uZSwgZ3JhbW1hcgorICAgICAgICBzZWxmLmdyYW1tYXJUeXBlID0gbS5ncm91cCgyKQorICAgICAgICBpZiBzZWxmLmdyYW1tYXJUeXBlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmdyYW1tYXJUeXBlID0gJ2NvbWJpbmVkJworCisgICAgICAgIGlmIHNlbGYuZ3JhbW1hclR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmdyYW1tYXJUeXBlIGluICgnbGV4ZXInLCAncGFyc2VyJywgJ3RyZWUnLCAnY29tYmluZWQnKSwgc2VsZi5ncmFtbWFyVHlwZQorCisgICAgICAgICMgZG9uJ3QgdHJ5IHRvIHJlYnVpbGQgZ3JhbW1hciwgaWYgaXQgYWxyZWFkeSBmYWlsZWQKKyAgICAgICAgaWYgZ3JhbW1hck5hbWUgaW4gY29tcGlsZUVycm9yQ2FjaGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICMgICAgICMgZ2V0IGRlcGVuZGVuY2llcyBmcm9tIGFudGxyCisgICAgICAgICMgICAgIGlmIGdyYW1tYXJOYW1lIGluIGRlcGVuZGVuY3lDYWNoZToKKyAgICAgICAgIyAgICAgICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lDYWNoZVtncmFtbWFyTmFtZV0KKworICAgICAgICAjICAgICBlbHNlOgorICAgICAgICAjICAgICAgICAgZGVwZW5kZW5jaWVzID0gW10KKyAgICAgICAgIyAgICAgICAgIGNtZCA9ICgnY2QgJXM7IGphdmEgJXMgJXMgb3JnLmFudGxyLlRvb2wgLW8gLiAtZGVwZW5kICVzIDI+JjEnCisgICAgICAgICMgICAgICAgICAgICAgICAgJSAoc2VsZi5iYXNlRGlyLCBqYXZhT3B0aW9ucywgY2xhc3NwYXRoLCBncmFtbWFyUGF0aCkpCisKKyAgICAgICAgIyAgICAgICAgIG91dHB1dCA9ICIiCisgICAgICAgICMgICAgICAgICBmYWlsZWQgPSBGYWxzZQorCisgICAgICAgICMgICAgICAgICBmcCA9IG9zLnBvcGVuKGNtZCkKKyAgICAgICAgIyAgICAgICAgIGZvciBsaW5lIGluIGZwOgorICAgICAgICAjICAgICAgICAgICAgIG91dHB1dCArPSBsaW5lCisKKyAgICAgICAgIyAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ2Vycm9yKCcpOgorICAgICAgICAjICAgICAgICAgICAgICAgICBmYWlsZWQgPSBUcnVlCisgICAgICAgICMgICAgICAgICAgICAgZWxpZiAnOicgaW4gbGluZToKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgYSwgYiA9IGxpbmUuc3RyaXAoKS5zcGxpdCgnOicsIDEpCisgICAgICAgICMgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5qb2luKHNlbGYuYmFzZURpciwgYS5zdHJpcCgpKSwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuYmFzZURpciwgYi5zdHJpcCgpKV0pCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgIyAgICAgICAgIHJjID0gZnAuY2xvc2UoKQorICAgICAgICAjICAgICAgICAgaWYgcmMgaXMgbm90IE5vbmU6CisgICAgICAgICMgICAgICAgICAgICAgZmFpbGVkID0gVHJ1ZQorCisgICAgICAgICMgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICMgICAgICAgICAgICAgcmFpc2UgR3JhbW1hckNvbXBpbGVFcnJvcigKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgImFudGxyIC1kZXBlbmQgZmFpbGVkIHdpdGggY29kZSAlcyBvbiBncmFtbWFyICclcyc6XG5cbiIKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgJSAocmMsIGdyYW1tYXJOYW1lKQorICAgICAgICAjICAgICAgICAgICAgICAgICArIGNtZAorICAgICAgICAjICAgICAgICAgICAgICAgICArICJcbiIKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgKyBvdXRwdXQKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICMgICAgICAgICAjIGFkZCBkZXBlbmRlbmNpZXMgdG8gbXkgLnN0ZyBmaWxlcworICAgICAgICAjICAgICAgICAgdGVtcGxhdGVEaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicsICcuLicsICcuLicsICd0b29sJywgJ3NyYycsICdtYWluJywgJ3Jlc291cmNlcycsICdvcmcnLCAnYW50bHInLCAnY29kZWdlbicsICd0ZW1wbGF0ZXMnLCAnUHl0aG9uJykpCisgICAgICAgICMgICAgICAgICB0ZW1wbGF0ZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnKi5zdGcnKSkKKworICAgICAgICAjICAgICAgICAgZm9yIGRzdCwgc3JjIGluIGRlcGVuZGVuY2llczoKKyAgICAgICAgIyAgICAgICAgICAgICBzcmMuZXh0ZW5kKHRlbXBsYXRlcykKKworICAgICAgICAjICAgICAgICAgZGVwZW5kZW5jeUNhY2hlW2dyYW1tYXJOYW1lXSA9IGRlcGVuZGVuY2llcworCisgICAgICAgICMgICAgIHJlYnVpbGQgPSBGYWxzZQorICAgICAgICAjICAgICBmb3IgZGVzdCwgc291cmNlcyBpbiBkZXBlbmRlbmNpZXM6CisgICAgICAgICMgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZGVzdCk6CisgICAgICAgICMgICAgICAgICAgICAgcmVidWlsZCA9IFRydWUKKyAgICAgICAgIyAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgICAgICAgICBmb3Igc291cmNlIGluIHNvdXJjZXM6CisgICAgICAgICMgICAgICAgICAgICAgaWYgb3MucGF0aC5nZXRtdGltZShzb3VyY2UpID4gb3MucGF0aC5nZXRtdGltZShkZXN0KToKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgcmVidWlsZCA9IFRydWUKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgYnJlYWsKKworCisgICAgICAgICMgICAgIGlmIHJlYnVpbGQ6CisgICAgICAgICMgICAgICAgICBzZWxmLl9pbnZva2VhbnRscihzZWxmLmJhc2VEaXIsIGdyYW1tYXJQYXRoLCBvcHRpb25zLCBqYXZhT3B0aW9ucykKKworICAgICAgICAgICAgc2VsZi5faW52b2tlYW50bHIoc2VsZi5iYXNlRGlyLCBncmFtbWFyUGF0aCwgb3B0aW9ucywgamF2YU9wdGlvbnMpCisKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBtYXJrIGdyYW1tYXIgYXMgYnJva2VuCisgICAgICAgICAgICBjb21waWxlRXJyb3JDYWNoZVtncmFtbWFyTmFtZV0gPSBUcnVlCisgICAgICAgICAgICByYWlzZQorCisKKyAgICBkZWYgbGV4ZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgIiIiT3B0aW9uYWxseSBidWlsZCBhIHN1YmNsYXNzIG9mIGdlbmVyYXRlZCBsZXhlciBjbGFzcyIiIgorCisgICAgICAgIHJldHVybiBiYXNlCisKKworICAgIGRlZiBwYXJzZXJDbGFzcyhzZWxmLCBiYXNlKToKKyAgICAgICAgIiIiT3B0aW9uYWxseSBidWlsZCBhIHN1YmNsYXNzIG9mIGdlbmVyYXRlZCBwYXJzZXIgY2xhc3MiIiIKKworICAgICAgICByZXR1cm4gYmFzZQorCisKKyAgICBkZWYgd2Fsa2VyQ2xhc3Moc2VsZiwgYmFzZSk6CisgICAgICAgICIiIk9wdGlvbmFsbHkgYnVpbGQgYSBzdWJjbGFzcyBvZiBnZW5lcmF0ZWQgd2Fsa2VyIGNsYXNzIiIiCisKKyAgICAgICAgcmV0dXJuIGJhc2UKKworCisgICAgZGVmIF9fbG9hZF9tb2R1bGUoc2VsZiwgbmFtZSk6CisgICAgICAgIG1vZEZpbGUsIG1vZFBhdGhuYW1lLCBtb2REZXNjcmlwdGlvbiBcCisgICAgICAgICAgICAgICAgID0gaW1wLmZpbmRfbW9kdWxlKG5hbWUsIFtzZWxmLmJhc2VEaXJdKQorCisgICAgICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUoCisgICAgICAgICAgICBuYW1lLCBtb2RGaWxlLCBtb2RQYXRobmFtZSwgbW9kRGVzY3JpcHRpb24KKyAgICAgICAgICAgICkKKworCisgICAgZGVmIGdldExleGVyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkJ1aWxkIGxleGVyIGluc3RhbmNlLiBBcmd1bWVudHMgYXJlIHBhc3NlZCB0byBsZXhlci5fX2luaXRfXygpLiIiIgorCisgICAgICAgIGlmIHNlbGYuZ3JhbW1hclR5cGUgPT0gJ2xleGVyJzoKKyAgICAgICAgICAgIHNlbGYubGV4ZXJNb2R1bGUgPSBzZWxmLl9fbG9hZF9tb2R1bGUoc2VsZi5ncmFtbWFyTmFtZSkKKyAgICAgICAgICAgIGNscyA9IGdldGF0dHIoc2VsZi5sZXhlck1vZHVsZSwgc2VsZi5ncmFtbWFyTmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGV4ZXJNb2R1bGUgPSBzZWxmLl9fbG9hZF9tb2R1bGUoc2VsZi5ncmFtbWFyTmFtZSArICdMZXhlcicpCisgICAgICAgICAgICBjbHMgPSBnZXRhdHRyKHNlbGYubGV4ZXJNb2R1bGUsIHNlbGYuZ3JhbW1hck5hbWUgKyAnTGV4ZXInKQorCisgICAgICAgIGNscyA9IHNlbGYubGV4ZXJDbGFzcyhjbHMpCisKKyAgICAgICAgbGV4ZXIgPSBjbHMoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHJldHVybiBsZXhlcgorCisKKyAgICBkZWYgZ2V0UGFyc2VyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkJ1aWxkIHBhcnNlciBpbnN0YW5jZS4gQXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gcGFyc2VyLl9faW5pdF9fKCkuIiIiCisKKyAgICAgICAgaWYgc2VsZi5ncmFtbWFyVHlwZSA9PSAncGFyc2VyJzoKKyAgICAgICAgICAgIHNlbGYubGV4ZXJNb2R1bGUgPSBzZWxmLl9fbG9hZF9tb2R1bGUoc2VsZi5ncmFtbWFyTmFtZSkKKyAgICAgICAgICAgIGNscyA9IGdldGF0dHIoc2VsZi5sZXhlck1vZHVsZSwgc2VsZi5ncmFtbWFyTmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGFyc2VyTW9kdWxlID0gc2VsZi5fX2xvYWRfbW9kdWxlKHNlbGYuZ3JhbW1hck5hbWUgKyAnUGFyc2VyJykKKyAgICAgICAgICAgIGNscyA9IGdldGF0dHIoc2VsZi5wYXJzZXJNb2R1bGUsIHNlbGYuZ3JhbW1hck5hbWUgKyAnUGFyc2VyJykKKyAgICAgICAgY2xzID0gc2VsZi5wYXJzZXJDbGFzcyhjbHMpCisKKyAgICAgICAgcGFyc2VyID0gY2xzKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICByZXR1cm4gcGFyc2VyCisKKworICAgIGRlZiBnZXRXYWxrZXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQnVpbGQgd2Fsa2VyIGluc3RhbmNlLiBBcmd1bWVudHMgYXJlIHBhc3NlZCB0byB3YWxrZXIuX19pbml0X18oKS4iIiIKKworICAgICAgICBzZWxmLndhbGtlck1vZHVsZSA9IHNlbGYuX19sb2FkX21vZHVsZShzZWxmLmdyYW1tYXJOYW1lICsgJ1dhbGtlcicpCisgICAgICAgIGNscyA9IGdldGF0dHIoc2VsZi53YWxrZXJNb2R1bGUsIHNlbGYuZ3JhbW1hck5hbWUgKyAnV2Fsa2VyJykKKyAgICAgICAgY2xzID0gc2VsZi53YWxrZXJDbGFzcyhjbHMpCisKKyAgICAgICAgd2Fsa2VyID0gY2xzKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICByZXR1cm4gd2Fsa2VyCisKKworICAgIGRlZiB3cml0ZUlubGluZUdyYW1tYXIoc2VsZiwgZ3JhbW1hcik6CisgICAgICAgICMgQ3JlYXRlIGEgdW5pcXVlIElEIGZvciB0aGlzIHRlc3QgYW5kIHVzZSBpdCBhcyB0aGUgZ3JhbW1hciBuYW1lLAorICAgICAgICAjIHRvIGF2b2lkIGNsYXNzIG5hbWUgcmV1c2UuIFRoaXMga2luZGEgc3Vja3MuIE5lZWQgdG8gZmluZCBhIHdheSBzbworICAgICAgICAjIHRlc3RzIGNhbiB1c2UgdGhlIHNhbWUgZ3JhbW1hciBuYW1lIHdpdGhvdXQgbWVzc2luZyB1cCB0aGUgbmFtZXNwYWNlLgorICAgICAgICAjIFdlbGwsIGZpcnN0IEkgc2hvdWxkIGZpZ3VyZSBvdXQgd2hhdCB0aGUgZXhhY3QgcHJvYmxlbSBpcy4uLgorICAgICAgICBpZCA9IGhhc2hsaWIubWQ1KHNlbGYuYmFzZURpcikuaGV4ZGlnZXN0KClbLTg6XQorICAgICAgICBncmFtbWFyID0gZ3JhbW1hci5yZXBsYWNlKCckVFAnLCAnVFAnICsgaWQpCisgICAgICAgIGdyYW1tYXIgPSBncmFtbWFyLnJlcGxhY2UoJyRUJywgJ1QnICsgaWQpCisKKyAgICAgICAgIyBnZXQgdHlwZSBhbmQgbmFtZSBmcm9tIGZpcnN0IGdyYW1tYXIgbGluZQorICAgICAgICBtID0gcmUubWF0Y2gocidccyooKGxleGVyfHBhcnNlcnx0cmVlKVxzK3wpZ3JhbW1hclxzKyhcUyspOycsIGdyYW1tYXIsIHJlLk1VTFRJTElORSkKKyAgICAgICAgYXNzZXJ0IG0gaXMgbm90IE5vbmUsIGdyYW1tYXIKKyAgICAgICAgZ3JhbW1hclR5cGUgPSBtLmdyb3VwKDIpCisgICAgICAgIGlmIGdyYW1tYXJUeXBlIGlzIE5vbmU6CisgICAgICAgICAgICBncmFtbWFyVHlwZSA9ICdjb21iaW5lZCcKKyAgICAgICAgZ3JhbW1hck5hbWUgPSBtLmdyb3VwKDMpCisKKyAgICAgICAgYXNzZXJ0IGdyYW1tYXJUeXBlIGluICgnbGV4ZXInLCAncGFyc2VyJywgJ3RyZWUnLCAnY29tYmluZWQnKSwgZ3JhbW1hclR5cGUKKworICAgICAgICBncmFtbWFyUGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmJhc2VEaXIsIGdyYW1tYXJOYW1lICsgJy5nJykKKworICAgICAgICAjIGR1bXAgdGVtcCBncmFtbWFyIGZpbGUKKyAgICAgICAgZnAgPSBvcGVuKGdyYW1tYXJQYXRoLCAndycpCisgICAgICAgIGZwLndyaXRlKGdyYW1tYXIpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICByZXR1cm4gZ3JhbW1hck5hbWUsIGdyYW1tYXJQYXRoLCBncmFtbWFyVHlwZQorCisKKyAgICBkZWYgd3JpdGVGaWxlKHNlbGYsIG5hbWUsIGNvbnRlbnRzKToKKyAgICAgICAgdGVzdERpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZURpciwgbmFtZSkKKworICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3cnKQorICAgICAgICBmcC53cml0ZShjb250ZW50cykKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgIHJldHVybiBwYXRoCisKKworICAgIGRlZiBjb21waWxlSW5saW5lR3JhbW1hcihzZWxmLCBncmFtbWFyLCBvcHRpb25zPScnLCBqYXZhT3B0aW9ucz0nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTW9kdWxlPUZhbHNlKToKKyAgICAgICAgIyB3cml0ZSBncmFtbWFyIGZpbGUKKyAgICAgICAgZ3JhbW1hck5hbWUsIGdyYW1tYXJQYXRoLCBncmFtbWFyVHlwZSA9IHNlbGYud3JpdGVJbmxpbmVHcmFtbWFyKGdyYW1tYXIpCisKKyAgICAgICAgIyBjb21waWxlIGl0CisgICAgICAgIHNlbGYuX2ludm9rZWFudGxyKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGdyYW1tYXJQYXRoKSwKKyAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoZ3JhbW1hclBhdGgpLAorICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgIGphdmFPcHRpb25zCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgZ3JhbW1hclR5cGUgPT0gJ2NvbWJpbmVkJzoKKyAgICAgICAgICAgIGxleGVyTW9kID0gc2VsZi5fX2xvYWRfbW9kdWxlKGdyYW1tYXJOYW1lICsgJ0xleGVyJykKKyAgICAgICAgICAgIHBhcnNlck1vZCA9IHNlbGYuX19sb2FkX21vZHVsZShncmFtbWFyTmFtZSArICdQYXJzZXInKQorICAgICAgICAgICAgaWYgcmV0dXJuTW9kdWxlOgorICAgICAgICAgICAgICAgIHJldHVybiBsZXhlck1vZCwgcGFyc2VyTW9kCisKKyAgICAgICAgICAgIGxleGVyQ2xzID0gZ2V0YXR0cihsZXhlck1vZCwgZ3JhbW1hck5hbWUgKyAnTGV4ZXInKQorICAgICAgICAgICAgbGV4ZXJDbHMgPSBzZWxmLmxleGVyQ2xhc3MobGV4ZXJDbHMpCisgICAgICAgICAgICBwYXJzZXJDbHMgPSBnZXRhdHRyKHBhcnNlck1vZCwgZ3JhbW1hck5hbWUgKyAnUGFyc2VyJykKKyAgICAgICAgICAgIHBhcnNlckNscyA9IHNlbGYucGFyc2VyQ2xhc3MocGFyc2VyQ2xzKQorCisgICAgICAgICAgICByZXR1cm4gbGV4ZXJDbHMsIHBhcnNlckNscworCisgICAgICAgIGlmIGdyYW1tYXJUeXBlID09ICdsZXhlcic6CisgICAgICAgICAgICBsZXhlck1vZCA9IHNlbGYuX19sb2FkX21vZHVsZShncmFtbWFyTmFtZSkKKyAgICAgICAgICAgIGlmIHJldHVybk1vZHVsZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV4ZXJNb2QKKworICAgICAgICAgICAgbGV4ZXJDbHMgPSBnZXRhdHRyKGxleGVyTW9kLCBncmFtbWFyTmFtZSkKKyAgICAgICAgICAgIGxleGVyQ2xzID0gc2VsZi5sZXhlckNsYXNzKGxleGVyQ2xzKQorCisgICAgICAgICAgICByZXR1cm4gbGV4ZXJDbHMKKworICAgICAgICBpZiBncmFtbWFyVHlwZSA9PSAncGFyc2VyJzoKKyAgICAgICAgICAgIHBhcnNlck1vZCA9IHNlbGYuX19sb2FkX21vZHVsZShncmFtbWFyTmFtZSkKKyAgICAgICAgICAgIGlmIHJldHVybk1vZHVsZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyTW9kCisKKyAgICAgICAgICAgIHBhcnNlckNscyA9IGdldGF0dHIocGFyc2VyTW9kLCBncmFtbWFyTmFtZSkKKyAgICAgICAgICAgIHBhcnNlckNscyA9IHNlbGYucGFyc2VyQ2xhc3MocGFyc2VyQ2xzKQorCisgICAgICAgICAgICByZXR1cm4gcGFyc2VyQ2xzCisKKyAgICAgICAgaWYgZ3JhbW1hclR5cGUgPT0gJ3RyZWUnOgorICAgICAgICAgICAgd2Fsa2VyTW9kID0gc2VsZi5fX2xvYWRfbW9kdWxlKGdyYW1tYXJOYW1lKQorICAgICAgICAgICAgaWYgcmV0dXJuTW9kdWxlOgorICAgICAgICAgICAgICAgIHJldHVybiB3YWxrZXJNb2QKKworICAgICAgICAgICAgd2Fsa2VyQ2xzID0gZ2V0YXR0cih3YWxrZXJNb2QsIGdyYW1tYXJOYW1lKQorICAgICAgICAgICAgd2Fsa2VyQ2xzID0gc2VsZi53YWxrZXJDbGFzcyh3YWxrZXJDbHMpCisKKyAgICAgICAgICAgIHJldHVybiB3YWxrZXJDbHMKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdGFudGxyMy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdGFudGxyMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGM2NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0YW50bHIzLnB5CkBAIC0wLDAgKzEsNyBAQAorCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IGFudGxyMworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4odGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3RiYXNlLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0YmFzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzkyODg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0YmFzZS5weQpAQCAtMCwwICsxLDI3IEBACitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgQnJva2VuVGVzdCh1bml0dGVzdC5UZXN0Q2FzZS5mYWlsdXJlRXhjZXB0aW9uKToKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIG5hbWUsIHJlYXNvbiA9IHNlbGYuYXJncworICAgICAgICByZXR1cm4gJyVzOiAlczogJXMgd29ya3Mgbm93JyAlICgKKyAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbmFtZSwgcmVhc29uKSkKKworCitkZWYgYnJva2VuKHJlYXNvbiwgKmV4Y2VwdGlvbnMpOgorICAgICcnJ0luZGljYXRlcyBhIGZhaWxpbmcgKG9yIGVycm9uZW91cykgdGVzdCBjYXNlIGZhaWxzIHRoYXQgc2hvdWxkIHN1Y2NlZWQuCisgICAgSWYgdGhlIHRlc3QgZmFpbHMgd2l0aCBhbiBleGNlcHRpb24sIGxpc3QgdGhlIGV4Y2VwdGlvbiB0eXBlIGluIGFyZ3MnJycKKyAgICBkZWYgd3JhcHBlcih0ZXN0X21ldGhvZCk6CisgICAgICAgIGRlZiByZXBsYWNlbWVudCgqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlc3RfbWV0aG9kKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBleGNlcHRpb25zIG9yIHVuaXR0ZXN0LlRlc3RDYXNlLmZhaWx1cmVFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBCcm9rZW5UZXN0KHRlc3RfbWV0aG9kLl9fbmFtZV9fLCByZWFzb24pCisgICAgICAgIHJlcGxhY2VtZW50Ll9fZG9jX18gPSB0ZXN0X21ldGhvZC5fX2RvY19fCisgICAgICAgIHJlcGxhY2VtZW50Ll9fbmFtZV9fID0gJ1hYWF8nICsgdGVzdF9tZXRob2QuX19uYW1lX18KKyAgICAgICAgcmVwbGFjZW1lbnQudG9kbyA9IHJlYXNvbgorICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQKKyAgICByZXR1cm4gd3JhcHBlcgorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdGRmYS5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdGRmYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYzZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0ZGZhLnB5CkBAIC0wLDAgKzEsNjMgQEAKKworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBhbnRscjMKKworCitjbGFzcyBUZXN0REZBKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHRoZSBERkEgY2xhc3MuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlNldHVwIHRlc3QgZml4dXJlLgorCisgICAgICAgIFdlIG5lZWQgYSBSZWNvZ25pemVyIGluIG9yZGVyIHRvIGluc3RhbmNpYXRlIGEgREZBLgorCisgICAgICAgICIiIgorCisgICAgICAgIGNsYXNzIFRSZWNvZ25pemVyKGFudGxyMy5CYXNlUmVjb2duaXplcik6CisgICAgICAgICAgICBhcGlfdmVyc2lvbiA9ICdIRUFEJworCisgICAgICAgIHNlbGYucmVjb2cgPSBUUmVjb2duaXplcigpCisKKworICAgIGRlZiB0ZXN0SW5pdChzZWxmKToKKyAgICAgICAgIiIiREZBLl9faW5pdF9fKCkKKworICAgICAgICBKdXN0IGEgc21va2UgdGVzdC4KKworICAgICAgICAiIiIKKworICAgICAgICBkZmEgPSBhbnRscjMuREZBKAorICAgICAgICAgICAgc2VsZi5yZWNvZywgMSwKKyAgICAgICAgICAgIGVvdD1bXSwKKyAgICAgICAgICAgIGVvZj1bXSwKKyAgICAgICAgICAgIG1pbj1bXSwKKyAgICAgICAgICAgIG1heD1bXSwKKyAgICAgICAgICAgIGFjY2VwdD1bXSwKKyAgICAgICAgICAgIHNwZWNpYWw9W10sCisgICAgICAgICAgICB0cmFuc2l0aW9uPVtdCisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0VW5wYWNrKHNlbGYpOgorICAgICAgICAiIiJERkEudW5wYWNrKCkiIiIKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIGFudGxyMy5ERkEudW5wYWNrKAorICAgICAgICAgICAgdSJcMVwzXDFcNFwyXHVmZmZmXDFcNVwyMlx1ZmZmZlwxXDJcMzFcdWZmZmZcMVw2XDZcdWZmZmYiCisgICAgICAgICAgICB1IlwzMlw2XDRcdWZmZmZcMVw2XDFcdWZmZmZcMzJcNiIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBbIDMsIDQsIC0xLCAtMSwgNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgIDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgICAgICAgICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIC0xLCAtMSwgLTEsIC0xLCA2LCAtMSwKKyAgICAgICAgICAgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKyAgICAgICAgICAgICAgNiwgNiwgNiwgNiwgNgorICAgICAgICAgICAgICBdCisgICAgICAgICAgICApCisKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4odGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3Rkb3R0cmVlZ2VuLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0ZG90dHJlZWdlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI3OTdlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0ZG90dHJlZWdlbi5weQpAQCAtMCwwICsxLDc0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCB0ZXh0d3JhcAorCitpbXBvcnQgc3RyaW5ndGVtcGxhdGUzCisKK2Zyb20gYW50bHIzLmRvdHRyZWVnZW4gaW1wb3J0IHRvRE9UCitmcm9tIGFudGxyMy50cmVld2l6YXJkIGltcG9ydCBUcmVlV2l6YXJkCitmcm9tIGFudGxyMy50cmVlIGltcG9ydCBDb21tb25UcmVlQWRhcHRvcgorCisKK2NsYXNzIFRlc3RUb0RPVCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciB0aGUgdG9ET1QgZnVuY3Rpb24uIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgc2VsZi50b2tlbnMgPSBbCisgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiSUQiLCAiVkFSIgorICAgICAgICAgICAgXQorICAgICAgICBzZWxmLndpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKworCisgICAgZGVmIHRlc3ROb25lKHNlbGYpOgorICAgICAgICAiIiJ0b0RPVCgpIiIiCisKKyAgICAgICAgdHJlZVNUID0gc3RyaW5ndGVtcGxhdGUzLlN0cmluZ1RlbXBsYXRlKAorICAgICAgICAgICAgdGVtcGxhdGU9KAorICAgICAgICAgICAgImRpZ3JhcGgge1xuIiArCisgICAgICAgICAgICAiICAkbm9kZXMkXG4iICsKKyAgICAgICAgICAgICIgICRlZGdlcyRcbiIgKworICAgICAgICAgICAgIn1cbiIpCisgICAgICAgICAgICApCisKKyAgICAgICAgZWRnZVNUID0gc3RyaW5ndGVtcGxhdGUzLlN0cmluZ1RlbXBsYXRlKAorICAgICAgICAgICAgdGVtcGxhdGU9IiRwYXJlbnQkIC0+ICRjaGlsZCRcbiIKKyAgICAgICAgICAgICkKKworICAgICAgICB0cmVlID0gc2VsZi53aXouY3JlYXRlKCIoQSBCIChCIEMgQykgKEIgKEMgRCBEKSkpIikKKyAgICAgICAgc3QgPSB0b0RPVCh0cmVlLCBzZWxmLmFkYXB0b3IsIHRyZWVTVCwgZWRnZVNUKQorCisgICAgICAgIHJlc3VsdCA9IHN0LnRvU3RyaW5nKCkKKyAgICAgICAgZXhwZWN0ZWQgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICAnJydcCisgICAgICAgICAgICBkaWdyYXBoIHsKKyAgICAgICAgICAgICAgbjAgW2xhYmVsPSJBIl07CisgICAgICAgICAgICAgIG4xIFtsYWJlbD0iQiJdOworICAgICAgICAgICAgICBuMiBbbGFiZWw9IkIiXTsKKyAgICAgICAgICAgICAgbjMgW2xhYmVsPSJDIl07CisgICAgICAgICAgICAgIG40IFtsYWJlbD0iQyJdOworICAgICAgICAgICAgICBuNSBbbGFiZWw9IkIiXTsKKyAgICAgICAgICAgICAgbjYgW2xhYmVsPSJDIl07CisgICAgICAgICAgICAgIG43IFtsYWJlbD0iRCJdOworICAgICAgICAgICAgICBuOCBbbGFiZWw9IkQiXTsKKworICAgICAgICAgICAgICBuMCAtPiBuMQorICAgICAgICAgICAgICBuMCAtPiBuMgorICAgICAgICAgICAgICBuMiAtPiBuMworICAgICAgICAgICAgICBuMiAtPiBuNAorICAgICAgICAgICAgICBuMCAtPiBuNQorICAgICAgICAgICAgICBuNSAtPiBuNgorICAgICAgICAgICAgICBuNiAtPiBuNworICAgICAgICAgICAgICBuNiAtPiBuOAorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbih0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdGV4Y2VwdGlvbnMucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3RleGNlcHRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGVmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3RleGNlcHRpb25zLnB5CkBAIC0wLDAgKzEsOTYgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGFudGxyMworaW1wb3J0IHRlc3RiYXNlCisKKworY2xhc3MgVGVzdFJlY29nbml0aW9uRXhjZXB0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgdGhlIGFudGxyMy5SZWNvZ25pdGlvbkV4Y2VwdGlvbiBjbGFzcyIiIgorCisgICAgZGVmIHRlc3RJbml0Tm9uZShzZWxmKToKKyAgICAgICAgIiIiUmVjb2duaXRpb25FeGNlcHRpb24uX19pbml0X18oKSIiIgorCisgICAgICAgIGV4YyA9IGFudGxyMy5SZWNvZ25pdGlvbkV4Y2VwdGlvbigpCisgICAgICAgIAorCitjbGFzcyBUZXN0RWFybHlFeGl0RXhjZXB0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgdGhlIGFudGxyMy5FYXJseUV4aXRFeGNlcHRpb24gY2xhc3MiIiIKKworICAgIEB0ZXN0YmFzZS5icm9rZW4oIkZJWE1FIiwgRXhjZXB0aW9uKQorICAgIGRlZiB0ZXN0SW5pdE5vbmUoc2VsZik6CisgICAgICAgICIiIkVhcmx5RXhpdEV4Y2VwdGlvbi5fX2luaXRfXygpIiIiCisKKyAgICAgICAgZXhjID0gYW50bHIzLkVhcmx5RXhpdEV4Y2VwdGlvbigpCisgICAgICAgIAorCitjbGFzcyBUZXN0RmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgdGhlIGFudGxyMy5GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdEluaXROb25lKHNlbGYpOgorICAgICAgICAiIiJGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24uX19pbml0X18oKSIiIgorCisgICAgICAgIGV4YyA9IGFudGxyMy5GYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oKQorICAgICAgICAKKworY2xhc3MgVGVzdE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciB0aGUgYW50bHIzLk1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdEluaXROb25lKHNlbGYpOgorICAgICAgICAiIiJNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uLl9faW5pdF9fKCkiIiIKKworICAgICAgICBleGMgPSBhbnRscjMuTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbigpCisgICAgICAgIAorCitjbGFzcyBUZXN0TWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgdGhlIGFudGxyMy5NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdEluaXROb25lKHNlbGYpOgorICAgICAgICAiIiJNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24uX19pbml0X18oKSIiIgorCisgICAgICAgIGV4YyA9IGFudGxyMy5NaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oKQorICAgICAgICAKKworY2xhc3MgVGVzdE1pc21hdGNoZWRTZXRFeGNlcHRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciB0aGUgYW50bHIzLk1pc21hdGNoZWRTZXRFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdEluaXROb25lKHNlbGYpOgorICAgICAgICAiIiJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLl9faW5pdF9fKCkiIiIKKworICAgICAgICBleGMgPSBhbnRscjMuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpCisgICAgICAgIAorCitjbGFzcyBUZXN0TWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgdGhlIGFudGxyMy5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gY2xhc3MiIiIKKyAgICAKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdEluaXROb25lKHNlbGYpOgorICAgICAgICAiIiJNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24uX19pbml0X18oKSIiIgorCisgICAgICAgIGV4YyA9IGFudGxyMy5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oKQorICAgICAgICAKKworY2xhc3MgVGVzdE1pc21hdGNoZWRUcmVlTm9kZUV4Y2VwdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHRoZSBhbnRscjMuTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgCisgICAgQHRlc3RiYXNlLmJyb2tlbigiRklYTUUiLCBFeGNlcHRpb24pCisgICAgZGVmIHRlc3RJbml0Tm9uZShzZWxmKToKKyAgICAgICAgIiIiTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLl9faW5pdF9fKCkiIiIKKworICAgICAgICBleGMgPSBhbnRscjMuTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uKCkKKyAgICAgICAgCisKK2NsYXNzIFRlc3ROb1ZpYWJsZUFsdEV4Y2VwdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHRoZSBhbnRscjMuTm9WaWFibGVBbHRFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAKKyAgICBAdGVzdGJhc2UuYnJva2VuKCJGSVhNRSIsIEV4Y2VwdGlvbikKKyAgICBkZWYgdGVzdEluaXROb25lKHNlbGYpOgorICAgICAgICAiIiJOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5fX2luaXRfXygpIiIiCisKKyAgICAgICAgZXhjID0gYW50bHIzLk5vVmlhYmxlQWx0RXhjZXB0aW9uKCkKKyAgICAgICAgCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbih0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHJlY29nbml6ZXJzLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0cmVjb2duaXplcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkODc5MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHJlY29nbml6ZXJzLnB5CkBAIC0wLDAgKzEsNjcgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgYW50bHIzCisKKworY2xhc3MgVGVzdEJhc2VSZWNvZ25pemVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgQmFzZVJlY29nbml6ZXIgY2xhc3MiIiIKKworICAgIGRlZiB0ZXN0R2V0UnVsZUludm9jYXRpb25TdGFjayhzZWxmKToKKyAgICAgICAgIiIiQmFzZVJlY29nbml6ZXIuX2dldFJ1bGVJbnZvY2F0aW9uU3RhY2soKSIiIgorCisgICAgICAgIHJ1bGVzID0gYW50bHIzLkJhc2VSZWNvZ25pemVyLl9nZXRSdWxlSW52b2NhdGlvblN0YWNrKF9fbmFtZV9fKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHJ1bGVzLAorICAgICAgICAgICAgWyd0ZXN0R2V0UnVsZUludm9jYXRpb25TdGFjayddCisgICAgICAgICAgICApCisKKworY2xhc3MgVGVzdFRva2VuU291cmNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0Y2FzZSB0byB0aGUgYW50bHIzLlRva2VuU291cmNlIGNsYXNzIiIiCisKKworICAgIGRlZiB0ZXN0SXRlcmF0b3JJbnRlcmZhY2Uoc2VsZik6CisgICAgICAgICIiIlRva2VuU291cmNlLm5leHQoKSIiIgorCisgICAgICAgIGNsYXNzIFRyaXZpYWxUb2tlbihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUpOgorICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKworICAgICAgICBjbGFzcyBUZXN0U291cmNlKGFudGxyMy5Ub2tlblNvdXJjZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMgPSBbCisgICAgICAgICAgICAgICAgICAgIFRyaXZpYWxUb2tlbigxKSwKKyAgICAgICAgICAgICAgICAgICAgVHJpdmlhbFRva2VuKDIpLAorICAgICAgICAgICAgICAgICAgICBUcml2aWFsVG9rZW4oMyksCisgICAgICAgICAgICAgICAgICAgIFRyaXZpYWxUb2tlbig0KSwKKyAgICAgICAgICAgICAgICAgICAgVHJpdmlhbFRva2VuKGFudGxyMy5FT0YpLAorICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgICAgIGRlZiBuZXh0VG9rZW4oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zLnBvcCgwKQorCisKKyAgICAgICAgc3JjID0gVGVzdFNvdXJjZSgpCisgICAgICAgIHRva2VucyA9IFtdCisgICAgICAgIGZvciB0b2tlbiBpbiBzcmM6CisgICAgICAgICAgICB0b2tlbnMuYXBwZW5kKHRva2VuLnR5cGUpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodG9rZW5zLCBbMSwgMiwgMywgNF0pCisKKworCitjbGFzcyBUZXN0TGV4ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RJbml0KHNlbGYpOgorICAgICAgICAiIiJMZXhlci5fX2luaXRfXygpIiIiCisKKyAgICAgICAgY2xhc3MgVExleGVyKGFudGxyMy5MZXhlcik6CisgICAgICAgICAgICBhcGlfdmVyc2lvbiA9ICdIRUFEJworCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZvbycpCisgICAgICAgIFRMZXhlcihzdHJlYW0pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0c3RyZWFtcy5pbnB1dDEgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3RzdHJlYW1zLmlucHV0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA3ZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0c3RyZWFtcy5pbnB1dDEKQEAgLTAsMCArMSwyIEBACitmb28KK2JhcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHN0cmVhbXMuaW5wdXQyIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0c3RyZWFtcy5pbnB1dDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkY2NmNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHN0cmVhbXMuaW5wdXQyCkBAIC0wLDAgKzEsMiBAQAorZm9vCitiw6RyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0c3RyZWFtcy5weSBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHN0cmVhbXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0MzBiYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHN0cmVhbXMucHkKQEAgLTAsMCArMSw2NjEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IGFudGxyMworCisKK2NsYXNzIFRlc3RTdHJpbmdTdHJlYW0odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgY2FzZSBmb3IgdGhlIFN0cmluZ1N0cmVhbSBjbGFzcy4iIiIKKworICAgIGRlZiB0ZXN0U2l6ZShzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nU3RyZWFtLnNpemUoKSIiIgorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2ZvbycpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLnNpemUoKSwgMykKKworCisgICAgZGVmIHRlc3RJbmRleChzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nU3RyZWFtLmluZGV4KCkiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb28nKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCAwKQorCisKKyAgICBkZWYgdGVzdENvbnN1bWUoc2VsZik6CisgICAgICAgICIiIlN0cmluZ1N0cmVhbS5jb25zdW1lKCkiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb29cbmJhcicpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGYKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmluZGV4KCksIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5saW5lLCAxKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBvCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMSkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgbworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgMykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDEpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIFxuCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCA0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMikKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgYgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgNSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDIpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGEKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmluZGV4KCksIDYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5saW5lLCAyKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyByCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCA3KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMikKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgRU9GCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCA3KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMikKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgRU9GCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCA3KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMikKKworCisgICAgZGVmIHRlc3RSZXNldChzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nU3RyZWFtLnJlc2V0KCkiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb28nKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorCisgICAgICAgIHN0cmVhbS5yZXNldCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxUKDEpLCAnZicpCisKKworICAgIGRlZiB0ZXN0TEEoc2VsZik6CisgICAgICAgICIiIlN0cmluZ1N0cmVhbS5MQSgpIiIiCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLlN0cmluZ1N0cmVhbSgnZm9vJykKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTFQoMSksICdmJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxUKDIpLCAnbycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgzKSwgJ28nKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgxKSwgJ28nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTFQoMiksIGFudGxyMy5FT0YpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgzKSwgYW50bHIzLkVPRikKKworCisgICAgZGVmIHRlc3RTdWJzdHJpbmcoc2VsZik6CisgICAgICAgICIiIlN0cmluZ1N0cmVhbS5zdWJzdHJpbmcoKSIiIgorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb2JhcicpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLnN1YnN0cmluZygwLCAwKSwgJ2YnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uc3Vic3RyaW5nKDAsIDEpLCAnZm8nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uc3Vic3RyaW5nKDAsIDUpLCAnZm9vYmFyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLnN1YnN0cmluZygzLCA1KSwgJ2JhcicpCisKKworICAgIGRlZiB0ZXN0U2Vla0ZvcndhcmQoc2VsZik6CisgICAgICAgICIiIlN0cmluZ1N0cmVhbS5zZWVrKCk6IGZvcndhcmQiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb29cbmJhcicpCisKKyAgICAgICAgc3RyZWFtLnNlZWsoNCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgNCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgxKSwgJ2InKQorCisKKyMjICAgICAjIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyMjICAgICBkZWYgdGVzdFNlZWtCYWNrd2FyZChzZWxmKToKKyMjICAgICAgICAgIiIiU3RyaW5nU3RyZWFtLnNlZWsoKTogYmFja3dhcmQiIiIKKworIyMgICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb29cbmJhcicpCisKKyMjICAgICAgICAgc3RyZWFtLnNlZWsoNCkKKyMjICAgICAgICAgc3RyZWFtLnNlZWsoMSkKKworIyMgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgMSkKKyMjICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDEpCisjIyAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDEpCisjIyAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MQSgxKSwgJ28nKQorCisKKyAgICBkZWYgdGVzdE1hcmsoc2VsZik6CisgICAgICAgICIiIlN0cmluZ1N0cmVhbS5tYXJrKCkiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb29cbmJhcicpCisKKyAgICAgICAgc3RyZWFtLnNlZWsoNCkKKworICAgICAgICBtYXJrZXIgPSBzdHJlYW0ubWFyaygpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1hcmtlciwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLm1hcmtEZXB0aCwgMSkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIG1hcmtlciA9IHN0cmVhbS5tYXJrKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobWFya2VyLCAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubWFya0RlcHRoLCAyKQorCisKKyAgICBkZWYgdGVzdFJlbGVhc2VMYXN0KHNlbGYpOgorICAgICAgICAiIiJTdHJpbmdTdHJlYW0ucmVsZWFzZSgpOiBsYXN0IG1hcmtlciIiIgorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb1xuYmFyJykKKworICAgICAgICBzdHJlYW0uc2Vlayg0KQorICAgICAgICBtYXJrZXIxID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgbWFya2VyMiA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0ucmVsZWFzZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5tYXJrRGVwdGgsIDEpCisKKyAgICAgICAgIyByZWxlYXNlIHNhbWUgbWFya2VyIGFnYWluLCBub3RoaW5nIGhhcyBjaGFuZ2VkCisgICAgICAgIHN0cmVhbS5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLm1hcmtEZXB0aCwgMSkKKworCisgICAgZGVmIHRlc3RSZWxlYXNlTmVzdGVkKHNlbGYpOgorICAgICAgICAiIiJTdHJpbmdTdHJlYW0ucmVsZWFzZSgpOiBuZXN0ZWQiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuU3RyaW5nU3RyZWFtKCdmb29cbmJhcicpCisKKyAgICAgICAgc3RyZWFtLnNlZWsoNCkKKyAgICAgICAgbWFya2VyMSA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIG1hcmtlcjIgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBtYXJrZXIzID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5yZWxlYXNlKG1hcmtlcjIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5tYXJrRGVwdGgsIDEpCisKKworICAgIGRlZiB0ZXN0UmV3aW5kTGFzdChzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nU3RyZWFtLnJld2luZCgpOiBsYXN0IG1hcmtlciIiIgorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb1xuYmFyJykKKworICAgICAgICBzdHJlYW0uc2Vlayg0KQorCisgICAgICAgIG1hcmtlciA9IHN0cmVhbS5tYXJrKCkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisKKyAgICAgICAgc3RyZWFtLnJld2luZCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5tYXJrRGVwdGgsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCA0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxUKDEpLCAnYicpCisKKworICAgIGRlZiB0ZXN0UmV3aW5kTmVzdGVkKHNlbGYpOgorICAgICAgICAiIiJTdHJpbmdTdHJlYW0ucmV3aW5kKCk6IG5lc3RlZCIiIgorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5TdHJpbmdTdHJlYW0oJ2Zvb1xuYmFyJykKKworICAgICAgICBzdHJlYW0uc2Vlayg0KQorICAgICAgICBtYXJrZXIxID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgbWFya2VyMiA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIG1hcmtlcjMgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLnJld2luZChtYXJrZXIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubWFya0RlcHRoLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgNSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgxKSwgJ2EnKQorCisKK2NsYXNzIFRlc3RGaWxlU3RyZWFtKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHRoZSBGaWxlU3RyZWFtIGNsYXNzLiIiIgorCisKKyAgICBkZWYgdGVzdE5vRW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ3Rlc3RzdHJlYW1zLmlucHV0MScpCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkZpbGVTdHJlYW0ocGF0aCkKKworICAgICAgICBzdHJlYW0uc2Vlayg0KQorICAgICAgICBtYXJrZXIxID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgbWFya2VyMiA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIG1hcmtlcjMgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLnJld2luZChtYXJrZXIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubWFya0RlcHRoLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgNSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgxKSwgJ2EnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTEEoMSksIG9yZCgnYScpKQorCisKKyAgICBkZWYgdGVzdEVuY29kZWQoc2VsZik6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ3Rlc3RzdHJlYW1zLmlucHV0MicpCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkZpbGVTdHJlYW0ocGF0aCwgJ3V0Zi04JykKKworICAgICAgICBzdHJlYW0uc2Vlayg0KQorICAgICAgICBtYXJrZXIxID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgbWFya2VyMiA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIG1hcmtlcjMgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLnJld2luZChtYXJrZXIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubWFya0RlcHRoLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uaW5kZXgoKSwgNSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmxpbmUsIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5jaGFyUG9zaXRpb25JbkxpbmUsIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MVCgxKSwgdSfDpCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MQSgxKSwgb3JkKHUnw6QnKSkKKworCisKK2NsYXNzIFRlc3RJbnB1dFN0cmVhbSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciB0aGUgSW5wdXRTdHJlYW0gY2xhc3MuIiIiCisKKyAgICBkZWYgdGVzdE5vRW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGZpbGUgPSBTdHJpbmdJTygnZm9vXG5iYXInKQorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5JbnB1dFN0cmVhbShmaWxlKQorCisgICAgICAgIHN0cmVhbS5zZWVrKDQpCisgICAgICAgIG1hcmtlcjEgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBtYXJrZXIyID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgbWFya2VyMyA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0ucmV3aW5kKG1hcmtlcjIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5tYXJrRGVwdGgsIDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5pbmRleCgpLCA1KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0ubGluZSwgMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmNoYXJQb3NpdGlvbkluTGluZSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxUKDEpLCAnYScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MQSgxKSwgb3JkKCdhJykpCisKKworICAgIGRlZiB0ZXN0RW5jb2RlZChzZWxmKToKKyAgICAgICAgZmlsZSA9IFN0cmluZ0lPKHUnZm9vXG5iw6RyJy5lbmNvZGUoJ3V0Zi04JykpCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLklucHV0U3RyZWFtKGZpbGUsICd1dGYtOCcpCisKKyAgICAgICAgc3RyZWFtLnNlZWsoNCkKKyAgICAgICAgbWFya2VyMSA9IHN0cmVhbS5tYXJrKCkKKworICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIG1hcmtlcjIgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBtYXJrZXIzID0gc3RyZWFtLm1hcmsoKQorCisgICAgICAgIHN0cmVhbS5yZXdpbmQobWFya2VyMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLm1hcmtEZXB0aCwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmluZGV4KCksIDUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5saW5lLCAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhclBvc2l0aW9uSW5MaW5lLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTFQoMSksIHUnw6QnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTEEoMSksIG9yZCh1J8OkJykpCisKKworY2xhc3MgVGVzdENvbW1vblRva2VuU3RyZWFtKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHRoZSBTdHJpbmdTdHJlYW0gY2xhc3MuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlNldHVwIHRlc3QgZml4dXJlCisKKyAgICAgICAgVGhlIGNvbnN0cnVjdG9yIG9mIENvbW1vblRva2VuU3RyZWFtIG5lZWRzIGEgdG9rZW4gc291cmNlLiBUaGlzCisgICAgICAgIGlzIGEgc2ltcGxlIG1vY2sgY2xhc3MgcHJvdmlkaW5nIGp1c3QgdGhlIG5leHRUb2tlbigpIG1ldGhvZC4KKworICAgICAgICAiIiIKKworICAgICAgICBjbGFzcyBNb2NrU291cmNlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnMgPSBbXQorCisgICAgICAgICAgICBkZWYgbWFrZUVPRlRva2VuKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT1hbnRscjMuRU9GKQorCisgICAgICAgICAgICBkZWYgbmV4dFRva2VuKHNlbGYpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudG9rZW5zLnBvcCgwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYuc291cmNlID0gTW9ja1NvdXJjZSgpCisKKworICAgIGRlZiB0ZXN0SW5pdChzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uX19pbml0X18oKSIiIgorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShzZWxmLnNvdXJjZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmluZGV4KCksIC0xKQorCisKKyAgICBkZWYgdGVzdFNldFRva2VuU291cmNlKHNlbGYpOgorICAgICAgICAiIiJDb21tb25Ub2tlblN0cmVhbS5zZXRUb2tlblNvdXJjZSgpIiIiCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKE5vbmUpCisgICAgICAgIHN0cmVhbS5zZXRUb2tlblNvdXJjZShzZWxmLnNvdXJjZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLmluZGV4KCksIC0xKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uY2hhbm5lbCwgYW50bHIzLkRFRkFVTFRfQ0hBTk5FTCkKKworCisgICAgZGVmIHRlc3RMVEVtcHR5U291cmNlKHNlbGYpOgorICAgICAgICAiIiJDb21tb25Ub2tlblN0cmVhbS5MVCgpOiBFT0YgKGVtcHR5IHNvdXJjZSkiIiIKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0oc2VsZi5zb3VyY2UpCisKKyAgICAgICAgbHQxID0gc3RyZWFtLkxUKDEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGx0MS50eXBlLCBhbnRscjMuRU9GKQorCisKKyAgICBkZWYgdGVzdExUMShzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uTFQoMSkiIiIKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTIpCisgICAgICAgICAgICApCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKHNlbGYuc291cmNlKQorCisgICAgICAgIGx0MSA9IHN0cmVhbS5MVCgxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsdDEudHlwZSwgMTIpCisKKworICAgIGRlZiB0ZXN0TFQxV2l0aEhpZGRlbihzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uTFQoMSk6IHdpdGggaGlkZGVuIHRva2VucyIiIgorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMiwgY2hhbm5lbD1hbnRscjMuSElEREVOX0NIQU5ORUwpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEzKQorICAgICAgICAgICAgKQorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShzZWxmLnNvdXJjZSkKKworICAgICAgICBsdDEgPSBzdHJlYW0uTFQoMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobHQxLnR5cGUsIDEzKQorCisKKyAgICBkZWYgdGVzdExUMkJleW9uZEVuZChzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uTFQoMik6IGJleW9uZCBlbmQiIiIKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTIpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEzLCBjaGFubmVsPWFudGxyMy5ISURERU5fQ0hBTk5FTCkKKyAgICAgICAgICAgICkKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0oc2VsZi5zb3VyY2UpCisKKyAgICAgICAgbHQxID0gc3RyZWFtLkxUKDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGx0MS50eXBlLCBhbnRscjMuRU9GKQorCisKKyAgICAjIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgICBkZWYgdGVzdExUTmVnYXRpdmUoc2VsZik6CisgICAgICAgICIiIkNvbW1vblRva2VuU3RyZWFtLkxUKC0xKTogbG9vayBiYWNrIiIiCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEyKQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMykKKyAgICAgICAgICAgICkKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0oc2VsZi5zb3VyY2UpCisgICAgICAgIHN0cmVhbS5maWxsQnVmZmVyKCkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorCisgICAgICAgIGx0MSA9IHN0cmVhbS5MVCgtMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobHQxLnR5cGUsIDEyKQorCisKKyAgICBkZWYgdGVzdExCMShzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uTEIoMSkiIiIKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTIpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEzKQorICAgICAgICAgICAgKQorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShzZWxmLnNvdXJjZSkKKyAgICAgICAgc3RyZWFtLmZpbGxCdWZmZXIoKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxCKDEpLnR5cGUsIDEyKQorCisKKyAgICBkZWYgdGVzdExUWmVybyhzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uTFQoMCkiIiIKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTIpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEzKQorICAgICAgICAgICAgKQorCisgICAgICAgIHN0cmVhbSA9IGFudGxyMy5Db21tb25Ub2tlblN0cmVhbShzZWxmLnNvdXJjZSkKKworICAgICAgICBsdDEgPSBzdHJlYW0uTFQoMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGx0MSBpcyBOb25lKQorCisKKyAgICBkZWYgdGVzdExCQmV5b25kQmVnaW4oc2VsZik6CisgICAgICAgICIiIkNvbW1vblRva2VuU3RyZWFtLkxCKC0xKTogYmV5b25kIGJlZ2luIiIiCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEyKQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMiwgY2hhbm5lbD1hbnRscjMuSElEREVOX0NIQU5ORUwpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEyLCBjaGFubmVsPWFudGxyMy5ISURERU5fQ0hBTk5FTCkKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTMpCisgICAgICAgICAgICApCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKHNlbGYuc291cmNlKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyZWFtLkxCKDEpIGlzIE5vbmUpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJlYW0uTEIoMykgaXMgTm9uZSkKKworCisgICAgZGVmIHRlc3RGaWxsQnVmZmVyKHNlbGYpOgorICAgICAgICAiIiJDb21tb25Ub2tlblN0cmVhbS5maWxsQnVmZmVyKCkiIiIKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTIpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEzKQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xNCkKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9YW50bHIzLkVPRikKKyAgICAgICAgICAgICkKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0oc2VsZi5zb3VyY2UpCisgICAgICAgIHN0cmVhbS5maWxsQnVmZmVyKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oc3RyZWFtLnRva2VucyksIDMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS50b2tlbnNbMF0udHlwZSwgMTIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS50b2tlbnNbMV0udHlwZSwgMTMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS50b2tlbnNbMl0udHlwZSwgMTQpCisKKworICAgIGRlZiB0ZXN0Q29uc3VtZShzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uVG9rZW5TdHJlYW0uY29uc3VtZSgpIiIiCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEyKQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMykKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9YW50bHIzLkVPRikKKyAgICAgICAgICAgICkKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0oc2VsZi5zb3VyY2UpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MQSgxKSwgMTIpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTEEoMSksIDEzKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxBKDEpLCBhbnRscjMuRU9GKQorCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyZWFtLkxBKDEpLCBhbnRscjMuRU9GKQorCisKKyAgICBkZWYgdGVzdFNlZWsoc2VsZik6CisgICAgICAgICIiIkNvbW1vblRva2VuU3RyZWFtLnNlZWsoKSIiIgorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMikKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTMpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPWFudGxyMy5FT0YpCisgICAgICAgICAgICApCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKHNlbGYuc291cmNlKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTEEoMSksIDEyKQorCisgICAgICAgIHN0cmVhbS5zZWVrKDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmVhbS5MQSgxKSwgYW50bHIzLkVPRikKKworICAgICAgICBzdHJlYW0uc2VlaygwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTEEoMSksIDEyKQorCisKKyAgICBkZWYgdGVzdE1hcmtSZXdpbmQoc2VsZik6CisgICAgICAgICIiIkNvbW1vblRva2VuU3RyZWFtLm1hcmsoKS9yZXdpbmQoKSIiIgorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMikKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTMpCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPWFudGxyMy5FT0YpCisgICAgICAgICAgICApCisKKyAgICAgICAgc3RyZWFtID0gYW50bHIzLkNvbW1vblRva2VuU3RyZWFtKHNlbGYuc291cmNlKQorICAgICAgICBzdHJlYW0uZmlsbEJ1ZmZlcigpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBtYXJrZXIgPSBzdHJlYW0ubWFyaygpCisKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzdHJlYW0ucmV3aW5kKG1hcmtlcikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJlYW0uTEEoMSksIDEzKQorCisKKyAgICBkZWYgdGVzdFRvU3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJDb21tb25Ub2tlblN0cmVhbS50b1N0cmluZygpIiIiCisKKyAgICAgICAgc2VsZi5zb3VyY2UudG9rZW5zLmFwcGVuZCgKKyAgICAgICAgICAgIGFudGxyMy5Db21tb25Ub2tlbih0eXBlPTEyLCB0ZXh0PSJmb28iKQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuc291cmNlLnRva2Vucy5hcHBlbmQoCisgICAgICAgICAgICBhbnRscjMuQ29tbW9uVG9rZW4odHlwZT0xMywgdGV4dD0iYmFyIikKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTQsIHRleHQ9ImdudXJ6IikKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLnNvdXJjZS50b2tlbnMuYXBwZW5kKAorICAgICAgICAgICAgYW50bHIzLkNvbW1vblRva2VuKHR5cGU9MTUsIHRleHQ9ImJsYXJ6IikKKyAgICAgICAgICAgICkKKworICAgICAgICBzdHJlYW0gPSBhbnRscjMuQ29tbW9uVG9rZW5TdHJlYW0oc2VsZi5zb3VyY2UpCisKKyAgICAgICAgYXNzZXJ0IHN0cmVhbS50b1N0cmluZygpID09ICJmb29iYXJnbnVyemJsYXJ6IgorICAgICAgICBhc3NlcnQgc3RyZWFtLnRvU3RyaW5nKDEsIDIpID09ICJiYXJnbnVyeiIKKyAgICAgICAgYXNzZXJ0IHN0cmVhbS50b1N0cmluZyhzdHJlYW0udG9rZW5zWzFdLCBzdHJlYW0udG9rZW5zWy0yXSkgPT0gImJhcmdudXJ6IgorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbih0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1B5dGhvbi91bml0dGVzdHMvdGVzdHRyZWUucHkgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3R0cmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNGUzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3R0cmVlLnB5CkBAIC0wLDAgKzEsMTM1MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gYW50bHIzLnRyZWUgaW1wb3J0IChDb21tb25UcmVlTm9kZVN0cmVhbSwgQ29tbW9uVHJlZSwgQ29tbW9uVHJlZUFkYXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVBhcnNlciwgVHJlZVZpc2l0b3IsIFRyZWVJdGVyYXRvcikKK2Zyb20gYW50bHIzIGltcG9ydCBDb21tb25Ub2tlbiwgVVAsIERPV04sIEVPRgorZnJvbSBhbnRscjMudHJlZXdpemFyZCBpbXBvcnQgVHJlZVdpemFyZAorCitjbGFzcyBUZXN0VHJlZU5vZGVTdHJlYW0odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgY2FzZSBmb3IgdGhlIFRyZWVOb2RlU3RyZWFtIGNsYXNzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisKKworICAgIGRlZiBuZXdTdHJlYW0oc2VsZiwgdCk6CisgICAgICAgICIiIkJ1aWxkIG5ldyBzdHJlYW07IGxldCdzIHVzIG92ZXJyaWRlIHRvIHRlc3Qgb3RoZXIgc3RyZWFtcy4iIiIKKyAgICAgICAgcmV0dXJuIENvbW1vblRyZWVOb2RlU3RyZWFtKHQpCisKKworICAgIGRlZiB0ZXN0U2luZ2xlTm9kZShzZWxmKToKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKworICAgICAgICBzdHJlYW0gPSBzZWxmLm5ld1N0cmVhbSh0KQorICAgICAgICBleHBlY3RpbmcgPSAiMTAxIgorICAgICAgICBmb3VuZCA9IHNlbGYudG9Ob2Rlc09ubHlTdHJpbmcoc3RyZWFtKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGZvdW5kKQorCisgICAgICAgIGV4cGVjdGluZyA9ICIxMDEiCisgICAgICAgIGZvdW5kID0gc3RyKHN0cmVhbSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RUd29DaGlsZHJlbk9mTmlsUm9vdChzZWxmKToKKyAgICAgICAgY2xhc3MgVihDb21tb25UcmVlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b2tlbj1Ob25lLCB0dHlwZT1Ob25lLCB4PU5vbmUpOgorICAgICAgICAgICAgICAgIGlmIHggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKworICAgICAgICAgICAgICAgIGlmIHR0eXBlIGlzIG5vdCBOb25lIGFuZCB0b2tlbiBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gQ29tbW9uVG9rZW4odHlwZT10dHlwZSkKKworICAgICAgICAgICAgICAgIGlmIHRva2VuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gdG9rZW4KKworICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdHh0ID0gc2VsZi50b2tlbi50ZXh0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHh0ID0gIiIKKworICAgICAgICAgICAgICAgIHR4dCArPSAiPFY+IgorICAgICAgICAgICAgICAgIHJldHVybiB0eHQKKworICAgICAgICByb290XzAgPSBzZWxmLmFkYXB0b3IubmlsKCk7CisgICAgICAgIHQgPSBWKHR0eXBlPTEwMSwgeD0yKQorICAgICAgICB1ID0gVih0b2tlbj1Db21tb25Ub2tlbih0eXBlPTEwMiwgdGV4dD0iMTAyIikpCisgICAgICAgIHNlbGYuYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHQpCisgICAgICAgIHNlbGYuYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhyb290XzAucGFyZW50IGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKC0xLCByb290XzAuY2hpbGRJbmRleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgdC5jaGlsZEluZGV4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCB1LmNoaWxkSW5kZXgpCisKKworICAgIGRlZiB0ZXN0NE5vZGVzKHNlbGYpOgorICAgICAgICAjIF4oMTAxIF4oMTAyIDEwMykgMTA0KQorICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkpCisgICAgICAgIHQuZ2V0Q2hpbGQoMCkuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDMpKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNCkpKQorCisgICAgICAgIHN0cmVhbSA9IHNlbGYubmV3U3RyZWFtKHQpCisgICAgICAgIGV4cGVjdGluZyA9ICIxMDEgMTAyIDEwMyAxMDQiCisgICAgICAgIGZvdW5kID0gc2VsZi50b05vZGVzT25seVN0cmluZyhzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSAyIDEwMiAyIDEwMyAzIDEwNCAzIgorICAgICAgICBmb3VuZCA9IHN0cihzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmKToKKyAgICAgICAgcm9vdCA9IENvbW1vblRyZWUoTm9uZSkKKworICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkpCisgICAgICAgIHQuZ2V0Q2hpbGQoMCkuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDMpKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNCkpKQorCisgICAgICAgIHUgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwNSkpCisKKyAgICAgICAgcm9vdC5hZGRDaGlsZCh0KQorICAgICAgICByb290LmFkZENoaWxkKHUpCisKKyAgICAgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ocm9vdCkKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSAxMDIgMTAzIDEwNCAxMDUiCisgICAgICAgIGZvdW5kID0gc2VsZi50b05vZGVzT25seVN0cmluZyhzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSAyIDEwMiAyIDEwMyAzIDEwNCAzIDEwNSIKKyAgICAgICAgZm91bmQgPSBzdHIoc3RyZWFtKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEZsYXRMaXN0KHNlbGYpOgorICAgICAgICByb290ID0gQ29tbW9uVHJlZShOb25lKQorCisgICAgICAgIHJvb3QuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKSkKKyAgICAgICAgcm9vdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpKQorICAgICAgICByb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisKKyAgICAgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ocm9vdCkKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSAxMDIgMTAzIgorICAgICAgICBmb3VuZCA9IHNlbGYudG9Ob2Rlc09ubHlTdHJpbmcoc3RyZWFtKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGZvdW5kKQorCisgICAgICAgIGV4cGVjdGluZyA9ICIxMDEgMTAyIDEwMyIKKyAgICAgICAgZm91bmQgPSBzdHIoc3RyZWFtKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdExpc3RXaXRoT25lTm9kZShzZWxmKToKKyAgICAgICAgcm9vdCA9IENvbW1vblRyZWUoTm9uZSkKKworICAgICAgICByb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkpCisKKyAgICAgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ocm9vdCkKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSIKKyAgICAgICAgZm91bmQgPSBzZWxmLnRvTm9kZXNPbmx5U3RyaW5nKHN0cmVhbSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCkKKworICAgICAgICBleHBlY3RpbmcgPSAiMTAxIgorICAgICAgICBmb3VuZCA9IHN0cihzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QW92ZXJCKHNlbGYpOgorICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkpCisKKyAgICAgICAgc3RyZWFtID0gc2VsZi5uZXdTdHJlYW0odCkKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSAxMDIiCisgICAgICAgIGZvdW5kID0gc2VsZi50b05vZGVzT25seVN0cmluZyhzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwMSAyIDEwMiAzIgorICAgICAgICBmb3VuZCA9IHN0cihzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TFQoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzKSAxMDQpCisgICAgICAgIHQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDIpKSkKKyAgICAgICAgdC5nZXRDaGlsZCgwKS5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMykpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA0KSkpCisKKyAgICAgICAgc3RyZWFtID0gc2VsZi5uZXdTdHJlYW0odCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTAxLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChET1dOLCBzdHJlYW0uTFQoMikuZ2V0VHlwZSgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDIsIHN0cmVhbS5MVCgzKS5nZXRUeXBlKCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKERPV04sIHN0cmVhbS5MVCg0KS5nZXRUeXBlKCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMywgc3RyZWFtLkxUKDUpLmdldFR5cGUoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVAsIHN0cmVhbS5MVCg2KS5nZXRUeXBlKCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwNCwgc3RyZWFtLkxUKDcpLmdldFR5cGUoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVAsIHN0cmVhbS5MVCg4KS5nZXRUeXBlKCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEVPRiwgc3RyZWFtLkxUKDkpLmdldFR5cGUoKSkKKyAgICAgICAgIyBjaGVjayB3YXkgYWhlYWQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoRU9GLCBzdHJlYW0uTFQoMTAwKS5nZXRUeXBlKCkpCisKKworICAgIGRlZiB0ZXN0TWFya1Jld2luZEVudGlyZShzZWxmKToKKyAgICAgICAgIyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisgICAgICAgICMgc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworICAgICAgICAjIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisgICAgICAgIHIwID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICByMSA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQocjEpCisgICAgICAgIHIxLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisgICAgICAgIHIyID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDYpKQorICAgICAgICByMi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNykpKQorICAgICAgICByMS5hZGRDaGlsZChyMikKKyAgICAgICAgcjAuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDQpKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDUpKSkKKworICAgICAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbShyMCkKKyAgICAgICAgbSA9IHN0cmVhbS5tYXJrKCkgIyBNQVJLCisgICAgICAgIGZvciBfIGluIHJhbmdlKDEzKTogIyBjb25zdW1lIHRpbCBlbmQKKyAgICAgICAgICAgIHN0cmVhbS5MVCgxKQorICAgICAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEVPRiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVAsIHN0cmVhbS5MVCgtMSkuZ2V0VHlwZSgpKSAgI1RPRE86IHJlbW92ZT8KKyAgICAgICAgc3RyZWFtLnJld2luZChtKSAgICAgICMgUkVXSU5ECisKKyAgICAgICAgIyBjb25zdW1lIHRpbCBlbmQgYWdhaW4gOikKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UoMTMpOiAjIGNvbnN1bWUgdGlsIGVuZAorICAgICAgICAgICAgc3RyZWFtLkxUKDEpCisgICAgICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoRU9GLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVUCwgc3RyZWFtLkxUKC0xKS5nZXRUeXBlKCkpICAjVE9ETzogcmVtb3ZlPworCisKKyAgICBkZWYgdGVzdE1hcmtSZXdpbmRJbk1pZGRsZShzZWxmKToKKyAgICAgICAgIyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisgICAgICAgICMgc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworICAgICAgICAjIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisgICAgICAgIHIwID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICByMSA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQocjEpCisgICAgICAgIHIxLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisgICAgICAgIHIyID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDYpKQorICAgICAgICByMi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNykpKQorICAgICAgICByMS5hZGRDaGlsZChyMikKKyAgICAgICAgcjAuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDQpKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDUpKSkKKworICAgICAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbShyMCkKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UoNyk6ICMgY29uc3VtZSB0aWwgbWlkZGxlCisgICAgICAgICAgICAjU3lzdGVtLm91dC5wcmludGxuKHRyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDcsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIG0gPSBzdHJlYW0ubWFyaygpICMgTUFSSworICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDcKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgVVAKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgVVAKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTA0CisgICAgICAgIHN0cmVhbS5yZXdpbmQobSkgICAgICAjIFJFV0lORAorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwNywgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVUCwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVUCwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDQsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgIyBub3cgd2UncmUgcGFzdCByZXdpbmQgcG9zaXRpb24KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA1LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVQLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEVPRiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVAsIHN0cmVhbS5MVCgtMSkuZ2V0VHlwZSgpKQorCisKKyAgICBkZWYgdGVzdE1hcmtSZXdpbmROZXN0ZWQoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAgICAgICAjIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKyAgICAgICAgIyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVUCBVUCAxMDQgMTA1IFVQIEVPRgorICAgICAgICByMCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjEgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpCisgICAgICAgIHIwLmFkZENoaWxkKHIxKQorICAgICAgICByMS5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMykpKQorICAgICAgICByMiA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA2KSkKKyAgICAgICAgcjIuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDcpKSkKKyAgICAgICAgcjEuYWRkQ2hpbGQocjIpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA0KSkpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA1KSkpCisKKyAgICAgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ocjApCisgICAgICAgIG0gPSBzdHJlYW0ubWFyaygpICMgTUFSSyBhdCBzdGFydAorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDEKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgRE4KKyAgICAgICAgbTIgPSBzdHJlYW0ubWFyaygpICMgTUFSSyBvbiAxMDIKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTAyCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIEROCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIDEwMworICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDYKKyAgICAgICAgc3RyZWFtLnJld2luZChtMikgICAgICAjIFJFV0lORCB0byAxMDIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTAyLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKERPV04sIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkKKyAgICAgICAgIyBzdG9wIGF0IDEwMyBhbmQgcmV3aW5kIHRvIHN0YXJ0CisgICAgICAgIHN0cmVhbS5yZXdpbmQobSkgIyBSRVdJTkQgdG8gMTAxCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMSwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChET1dOLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChET1dOLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorCisKKyAgICBkZWYgdGVzdFNlZWsoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAgICAgICAjIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKyAgICAgICAgIyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVUCBVUCAxMDQgMTA1IFVQIEVPRgorICAgICAgICByMCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjEgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpCisgICAgICAgIHIwLmFkZENoaWxkKHIxKQorICAgICAgICByMS5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMykpKQorICAgICAgICByMiA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA2KSkKKyAgICAgICAgcjIuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDcpKSkKKyAgICAgICAgcjEuYWRkQ2hpbGQocjIpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA0KSkpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA1KSkpCisKKyAgICAgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ocjApCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIDEwMQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSBETgorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDIKKyAgICAgICAgc3RyZWFtLnNlZWsoNykgICAjIHNlZWsgdG8gMTA3CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwNywgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTA3CisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIFVQCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIFVQCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwNCwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKworCisgICAgZGVmIHRlc3RTZWVrRnJvbVN0YXJ0KHNlbGYpOgorICAgICAgICAjIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKyAgICAgICAgIyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgICAgICAgICMgU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVVAgVVAgMTA0IDEwNSBVUCBFT0YKKyAgICAgICAgcjAgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMSkpCisgICAgICAgIHIxID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDIpKQorICAgICAgICByMC5hZGRDaGlsZChyMSkKKyAgICAgICAgcjEuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDMpKSkKKyAgICAgICAgcjIgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwNikpCisgICAgICAgIHIyLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA3KSkpCisgICAgICAgIHIxLmFkZENoaWxkKHIyKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNCkpKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNSkpKQorCisgICAgICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtKHIwKQorICAgICAgICBzdHJlYW0uc2Vlayg3KSAgICMgc2VlayB0byAxMDcKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA3LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDcKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgVVAKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgVVAKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA0LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorCisKKyAgICBkZWYgdGVzdFJlc2V0KHNlbGYpOgorICAgICAgICAjIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKyAgICAgICAgIyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgICAgICAgICMgU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVVAgVVAgMTA0IDEwNSBVUCBFT0YKKyAgICAgICAgcjAgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMSkpCisgICAgICAgIHIxID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDIpKQorICAgICAgICByMC5hZGRDaGlsZChyMSkKKyAgICAgICAgcjEuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDMpKSkKKyAgICAgICAgcjIgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwNikpCisgICAgICAgIHIyLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA3KSkpCisgICAgICAgIHIxLmFkZENoaWxkKHIyKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNCkpKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNSkpKQorCisgICAgICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtKHIwKQorICAgICAgICB2MSA9IHNlbGYudG9Ob2Rlc09ubHlTdHJpbmcoc3RyZWFtKSAjIHNjYW4gYWxsCisgICAgICAgIHN0cmVhbS5yZXNldCgpCisgICAgICAgIHYyID0gc2VsZi50b05vZGVzT25seVN0cmluZyhzdHJlYW0pICMgc2NhbiBhbGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjEsIHYyKQorCisKKyAgICBkZWYgdGVzdEl0ZXJhdG9yKHNlbGYpOgorICAgICAgICByMCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjEgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpCisgICAgICAgIHIwLmFkZENoaWxkKHIxKQorICAgICAgICByMS5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMykpKQorICAgICAgICByMiA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA2KSkKKyAgICAgICAgcjIuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDcpKSkKKyAgICAgICAgcjEuYWRkQ2hpbGQocjIpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA0KSkpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA1KSkpCisKKyAgICAgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ocjApCisKKyAgICAgICAgZXhwZWN0aW5nID0gWworICAgICAgICAgICAgMTAxLCBET1dOLCAxMDIsIERPV04sIDEwMywgMTA2LCBET1dOLCAxMDcsIFVQLCBVUCwgMTA0LCAxMDUsIFVQXQorICAgICAgICBmb3VuZCA9IFt0LnR5cGUgZm9yIHQgaW4gc3RyZWFtXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0b05vZGVzT25seVN0cmluZyhzZWxmLCBub2Rlcyk6CisgICAgICAgIGJ1ZiA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKG5vZGVzLnNpemUoKSk6CisgICAgICAgICAgICB0ID0gbm9kZXMuTFQoaSsxKQorICAgICAgICAgICAgdHlwZSA9IG5vZGVzLmdldFRyZWVBZGFwdG9yKCkuZ2V0VHlwZSh0KQorICAgICAgICAgICAgaWYgbm90ICh0eXBlPT1ET1dOIG9yIHR5cGU9PVVQKToKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHN0cih0eXBlKSkKKworICAgICAgICByZXR1cm4gJyAnLmpvaW4oYnVmKQorCisKK2NsYXNzIFRlc3RDb21tb25UcmVlTm9kZVN0cmVhbSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciB0aGUgQ29tbW9uVHJlZU5vZGVTdHJlYW0gY2xhc3MuIiIiCisKKyAgICBkZWYgdGVzdFB1c2hQb3Aoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzKSBeKDEwNCAxMDUpIF4oMTA2IDEwNykgMTA4IDEwOSkKKyAgICAgICAgIyBzdHJlYW0gaGFzIDkgcmVhbCArIDggbmF2IG5vZGVzCisgICAgICAgICMgU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIFVQIDEwNCBETiAxMDUgVVAgMTA2IEROIDEwNyBVUCAxMDggMTA5IFVQCisgICAgICAgIHIwID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICByMSA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkKKyAgICAgICAgcjEuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDMpKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQocjEpCisgICAgICAgIHIyID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDQpKQorICAgICAgICByMi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNSkpKQorICAgICAgICByMC5hZGRDaGlsZChyMikKKyAgICAgICAgcjMgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwNikpCisgICAgICAgIHIzLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA3KSkpCisgICAgICAgIHIwLmFkZENoaWxkKHIzKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwOCkpKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwOSkpKQorCisgICAgICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtKHIwKQorICAgICAgICBleHBlY3RpbmcgPSAiMTAxIDIgMTAyIDIgMTAzIDMgMTA0IDIgMTA1IDMgMTA2IDIgMTA3IDMgMTA4IDEwOSAzIgorICAgICAgICBmb3VuZCA9IHN0cihzdHJlYW0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKyAgICAgICAgIyBBc3N1bWUgd2Ugd2FudCB0byBoaXQgbm9kZSAxMDcgYW5kIHRoZW4gImNhbGwgMTAyIiB0aGVuIHJldHVybgorCisgICAgICAgIGluZGV4T2YxMDIgPSAyCisgICAgICAgIGluZGV4T2YxMDcgPSAxMgorICAgICAgICBmb3IgXyBpbiByYW5nZShpbmRleE9mMTA3KTojIGNvbnN1bWUgdGlsIDEwNyBub2RlCisgICAgICAgICAgICBzdHJlYW0uY29uc3VtZSgpCisKKyAgICAgICAgIyBDQUxMIDEwMgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDcsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5wdXNoKGluZGV4T2YxMDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTAyCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKERPV04sIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIEROCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMywgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTAzCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVQLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICAjIFJFVFVSTgorICAgICAgICBzdHJlYW0ucG9wKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA3LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorCisKKyAgICBkZWYgdGVzdE5lc3RlZFB1c2hQb3Aoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzKSBeKDEwNCAxMDUpIF4oMTA2IDEwNykgMTA4IDEwOSkKKyAgICAgICAgIyBzdHJlYW0gaGFzIDkgcmVhbCArIDggbmF2IG5vZGVzCisgICAgICAgICMgU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIFVQIDEwNCBETiAxMDUgVVAgMTA2IEROIDEwNyBVUCAxMDggMTA5IFVQCisgICAgICAgIHIwID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICByMSA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkKKyAgICAgICAgcjEuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDMpKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQocjEpCisgICAgICAgIHIyID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDQpKQorICAgICAgICByMi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNSkpKQorICAgICAgICByMC5hZGRDaGlsZChyMikKKyAgICAgICAgcjMgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwNikpCisgICAgICAgIHIzLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA3KSkpCisgICAgICAgIHIwLmFkZENoaWxkKHIzKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwOCkpKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwOSkpKQorCisgICAgICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtKHIwKQorCisgICAgICAgICMgQXNzdW1lIHdlIHdhbnQgdG8gaGl0IG5vZGUgMTA3IGFuZCB0aGVuICJjYWxsIDEwMiIsIHdoaWNoCisgICAgICAgICMgY2FsbHMgMTA0LCB0aGVuIHJldHVybgorCisgICAgICAgIGluZGV4T2YxMDIgPSAyCisgICAgICAgIGluZGV4T2YxMDcgPSAxMgorICAgICAgICBmb3IgXyBpbiByYW5nZShpbmRleE9mMTA3KTogIyBjb25zdW1lIHRpbCAxMDcgbm9kZQorICAgICAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwNywgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgIyBDQUxMIDEwMgorICAgICAgICBzdHJlYW0ucHVzaChpbmRleE9mMTAyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDIsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIDEwMgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChET1dOLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSBETgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDMsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIDEwMworCisgICAgICAgICMgQ0FMTCAxMDQKKyAgICAgICAgaW5kZXhPZjEwNCA9IDYKKyAgICAgICAgc3RyZWFtLnB1c2goaW5kZXhPZjEwNCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA0LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoRE9XTiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgRE4KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA1LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSAxMDMKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVAsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgICMgUkVUVVJOICh0byBVUCBub2RlIGluIDEwMiBzdWJ0cmVlKQorICAgICAgICBzdHJlYW0ucG9wKCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVUCwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgIyBSRVRVUk4gKHRvIGVtcHR5IHN0YWNrKQorICAgICAgICBzdHJlYW0ucG9wKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTA3LCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorCisKKyAgICBkZWYgdGVzdFB1c2hQb3BGcm9tRU9GKHNlbGYpOgorICAgICAgICAjIF4oMTAxIF4oMTAyIDEwMykgXigxMDQgMTA1KSBeKDEwNiAxMDcpIDEwOCAxMDkpCisgICAgICAgICMgc3RyZWFtIGhhcyA5IHJlYWwgKyA4IG5hdiBub2RlcworICAgICAgICAjIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyBVUCAxMDQgRE4gMTA1IFVQIDEwNiBETiAxMDcgVVAgMTA4IDEwOSBVUAorICAgICAgICByMCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjEgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpCisgICAgICAgIHIxLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisgICAgICAgIHIwLmFkZENoaWxkKHIxKQorICAgICAgICByMiA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA0KSkKKyAgICAgICAgcjIuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDUpKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQocjIpCisgICAgICAgIHIzID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDYpKQorICAgICAgICByMy5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNykpKQorICAgICAgICByMC5hZGRDaGlsZChyMykKKyAgICAgICAgcjAuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDgpKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDkpKSkKKworICAgICAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbShyMCkKKworICAgICAgICB3aGlsZSBzdHJlYW0uTEEoMSkgIT0gRU9GOgorICAgICAgICAgICAgc3RyZWFtLmNvbnN1bWUoKQorCisgICAgICAgIGluZGV4T2YxMDIgPSAyCisgICAgICAgIGluZGV4T2YxMDQgPSA2CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEVPRiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKworICAgICAgICAjIENBTEwgMTAyCisgICAgICAgIHN0cmVhbS5wdXNoKGluZGV4T2YxMDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMiwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTAyCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKERPV04sIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIEROCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEwMywgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKSAjIGNvbnN1bWUgMTAzCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVQLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICAjIFJFVFVSTiAodG8gZW1wdHkgc3RhY2spCisgICAgICAgIHN0cmVhbS5wb3AoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChFT0YsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisKKyAgICAgICAgIyBDQUxMIDEwNAorICAgICAgICBzdHJlYW0ucHVzaChpbmRleE9mMTA0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDQsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIDEwMgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChET1dOLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorICAgICAgICBzdHJlYW0uY29uc3VtZSgpICMgY29uc3VtZSBETgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMDUsIHN0cmVhbS5MVCgxKS5nZXRUeXBlKCkpCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCkgIyBjb25zdW1lIDEwMworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVUCwgc3RyZWFtLkxUKDEpLmdldFR5cGUoKSkKKyAgICAgICAgIyBSRVRVUk4gKHRvIGVtcHR5IHN0YWNrKQorICAgICAgICBzdHJlYW0ucG9wKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoRU9GLCBzdHJlYW0uTFQoMSkuZ2V0VHlwZSgpKQorCisKK2NsYXNzIFRlc3RDb21tb25UcmVlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHRoZSBDb21tb25UcmVlIGNsYXNzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJTZXR1cCB0ZXN0IGZpeHVyZSIiIgorCisgICAgICAgIHNlbGYuYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKworCisgICAgZGVmIHRlc3RTaW5nbGVOb2RlKHNlbGYpOgorICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModC5wYXJlbnQgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoLTEsIHQuY2hpbGRJbmRleCkKKworCisgICAgZGVmIHRlc3Q0Tm9kZXMoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzKSAxMDQpCisgICAgICAgIHIwID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpKQorICAgICAgICByMC5nZXRDaGlsZCgwKS5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMykpKQorICAgICAgICByMC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwNCkpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyMC5wYXJlbnQgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoLTEsIHIwLmNoaWxkSW5kZXgpCisKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmKToKKyAgICAgICAgIyBeKG5pbCAxMDEgMTAyIDEwMykKKyAgICAgICAgcjAgPSBDb21tb25UcmVlKE5vbmUpCisgICAgICAgIGMwPUNvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoYzApCisgICAgICAgIGMxPUNvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoYzEpCisgICAgICAgIGMyPUNvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoYzIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHIwLnBhcmVudCBpcyBOb25lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgtMSwgcjAuY2hpbGRJbmRleCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocjAsIGMwLnBhcmVudCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMCwgYzAuY2hpbGRJbmRleCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocjAsIGMxLnBhcmVudCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMSwgYzEuY2hpbGRJbmRleCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocjAsIGMyLnBhcmVudCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMiwgYzIuY2hpbGRJbmRleCkKKworCisgICAgZGVmIHRlc3RMaXN0MihzZWxmKToKKyAgICAgICAgIyBBZGQgY2hpbGQgXihuaWwgMTAxIDEwMiAxMDMpIHRvIHJvb3QgNQorICAgICAgICAjIHNob3VsZCBwdWxsIDEwMSAxMDIgMTAzIGRpcmVjdGx5IHRvIGJlY29tZSA1J3MgY2hpbGQgbGlzdAorICAgICAgICByb290ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbig1KSkKKworICAgICAgICAjIGNoaWxkIHRyZWUKKyAgICAgICAgcjAgPSBDb21tb25UcmVlKE5vbmUpCisgICAgICAgIGMwPUNvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoYzApCisgICAgICAgIGMxPUNvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAyKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoYzEpCisgICAgICAgIGMyPUNvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkKKyAgICAgICAgcjAuYWRkQ2hpbGQoYzIpCisKKyAgICAgICAgcm9vdC5hZGRDaGlsZChyMCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm9vdC5wYXJlbnQgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoLTEsIHJvb3QuY2hpbGRJbmRleCkKKyAgICAgICAgIyBjaGVjayBjaGlsZHJlbiBvZiByb290IGFsbCBwb2ludCBhdCByb290CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvb3QsIGMwLnBhcmVudCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMCwgYzAuY2hpbGRJbmRleCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm9vdCwgYzAucGFyZW50KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxLCBjMS5jaGlsZEluZGV4KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb290LCBjMC5wYXJlbnQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDIsIGMyLmNoaWxkSW5kZXgpCisKKworICAgIGRlZiB0ZXN0QWRkTGlzdFRvRXhpc3RDaGlsZHJlbihzZWxmKToKKyAgICAgICAgIyBBZGQgY2hpbGQgXihuaWwgMTAxIDEwMiAxMDMpIHRvIHJvb3QgXig1IDYpCisgICAgICAgICMgc2hvdWxkIGFkZCAxMDEgMTAyIDEwMyB0byBlbmQgb2YgNSdzIGNoaWxkIGxpc3QKKyAgICAgICAgcm9vdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oNSkpCisgICAgICAgIHJvb3QuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig2KSkpCisKKyAgICAgICAgIyBjaGlsZCB0cmVlCisgICAgICAgIHIwID0gQ29tbW9uVHJlZShOb25lKQorICAgICAgICBjMD1Db21tb25UcmVlKENvbW1vblRva2VuKDEwMSkpCisgICAgICAgIHIwLmFkZENoaWxkKGMwKQorICAgICAgICBjMT1Db21tb25UcmVlKENvbW1vblRva2VuKDEwMikpCisgICAgICAgIHIwLmFkZENoaWxkKGMxKQorICAgICAgICBjMj1Db21tb25UcmVlKENvbW1vblRva2VuKDEwMykpCisgICAgICAgIHIwLmFkZENoaWxkKGMyKQorCisgICAgICAgIHJvb3QuYWRkQ2hpbGQocjApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvb3QucGFyZW50IGlzIE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKC0xLCByb290LmNoaWxkSW5kZXgpCisgICAgICAgICMgY2hlY2sgY2hpbGRyZW4gb2Ygcm9vdCBhbGwgcG9pbnQgYXQgcm9vdAorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb290LCBjMC5wYXJlbnQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEsIGMwLmNoaWxkSW5kZXgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvb3QsIGMwLnBhcmVudCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMiwgYzEuY2hpbGRJbmRleCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm9vdCwgYzAucGFyZW50KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBjMi5jaGlsZEluZGV4KQorCisKKyAgICBkZWYgdGVzdER1cFRyZWUoc2VsZik6CisgICAgICAgICMgXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAgICAgICByMCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgcjEgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpCisgICAgICAgIHIwLmFkZENoaWxkKHIxKQorICAgICAgICByMS5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMykpKQorICAgICAgICByMiA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA2KSkKKyAgICAgICAgcjIuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDcpKSkKKyAgICAgICAgcjEuYWRkQ2hpbGQocjIpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA0KSkpCisgICAgICAgIHIwLmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTA1KSkpCisKKyAgICAgICAgZHVwID0gc2VsZi5hZGFwdG9yLmR1cFRyZWUocjApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGR1cC5wYXJlbnQgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoLTEsIGR1cC5jaGlsZEluZGV4KQorICAgICAgICBkdXAuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKQorCisKKyAgICBkZWYgdGVzdEJlY29tZVJvb3Qoc2VsZik6CisgICAgICAgICMgNSBiZWNvbWVzIHJvb3Qgb2YgXihuaWwgMTAxIDEwMiAxMDMpCisgICAgICAgIG5ld1Jvb3QgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDUpKQorCisgICAgICAgIG9sZFJvb3QgPSBDb21tb25UcmVlKE5vbmUpCisgICAgICAgIG9sZFJvb3QuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKSkKKyAgICAgICAgb2xkUm9vdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpKQorICAgICAgICBvbGRSb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisKKyAgICAgICAgc2VsZi5hZGFwdG9yLmJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCkKKyAgICAgICAgbmV3Um9vdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0QmVjb21lUm9vdDIoc2VsZik6CisgICAgICAgICMgNSBiZWNvbWVzIHJvb3Qgb2YgXigxMDEgMTAyIDEwMykKKyAgICAgICAgbmV3Um9vdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oNSkpCisKKyAgICAgICAgb2xkUm9vdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgb2xkUm9vdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpKQorICAgICAgICBvbGRSb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisKKyAgICAgICAgc2VsZi5hZGFwdG9yLmJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCkKKyAgICAgICAgbmV3Um9vdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0QmVjb21lUm9vdDMoc2VsZik6CisgICAgICAgICMgXihuaWwgNSkgYmVjb21lcyByb290IG9mIF4obmlsIDEwMSAxMDIgMTAzKQorICAgICAgICBuZXdSb290ID0gQ29tbW9uVHJlZShOb25lKQorICAgICAgICBuZXdSb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oNSkpKQorCisgICAgICAgIG9sZFJvb3QgPSBDb21tb25UcmVlKE5vbmUpCisgICAgICAgIG9sZFJvb3QuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKSkKKyAgICAgICAgb2xkUm9vdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpKQorICAgICAgICBvbGRSb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisKKyAgICAgICAgc2VsZi5hZGFwdG9yLmJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCkKKyAgICAgICAgbmV3Um9vdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0QmVjb21lUm9vdDUoc2VsZik6CisgICAgICAgICMgXihuaWwgNSkgYmVjb21lcyByb290IG9mIF4oMTAxIDEwMiAxMDMpCisgICAgICAgIG5ld1Jvb3QgPSBDb21tb25UcmVlKE5vbmUpCisgICAgICAgIG5ld1Jvb3QuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig1KSkpCisKKyAgICAgICAgb2xkUm9vdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAxKSkKKyAgICAgICAgb2xkUm9vdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDEwMikpKQorICAgICAgICBvbGRSb290LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oMTAzKSkpCisKKyAgICAgICAgc2VsZi5hZGFwdG9yLmJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCkKKyAgICAgICAgbmV3Um9vdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0QmVjb21lUm9vdDYoc2VsZik6CisgICAgICAgICMgZW11bGF0ZXMgY29uc3RydWN0aW9uIG9mIF4oNSA2KQorICAgICAgICByb290XzAgPSBzZWxmLmFkYXB0b3IubmlsKCkKKyAgICAgICAgcm9vdF8xID0gc2VsZi5hZGFwdG9yLm5pbCgpCisgICAgICAgIHJvb3RfMSA9IHNlbGYuYWRhcHRvci5iZWNvbWVSb290KENvbW1vblRyZWUoQ29tbW9uVG9rZW4oNSkpLCByb290XzEpCisKKyAgICAgICAgc2VsZi5hZGFwdG9yLmFkZENoaWxkKHJvb3RfMSwgQ29tbW9uVHJlZShDb21tb25Ub2tlbig2KSkpCisKKyAgICAgICAgc2VsZi5hZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKQorCisgICAgICAgIHJvb3RfMC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgICMgVGVzdCByZXBsYWNlQ2hpbGRyZW4KKworICAgIGRlZiB0ZXN0UmVwbGFjZVdpdGhOb0NoaWxkcmVuKHNlbGYpOgorICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbigxMDEpKQorICAgICAgICBuZXdDaGlsZCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oNSkpCisgICAgICAgIGVycm9yID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAJdC5yZXBsYWNlQ2hpbGRyZW4oMCwgMCwgbmV3Q2hpbGQpCisKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIAllcnJvciA9IFRydWUKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXJyb3IpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZVdpdGhPbmVDaGlsZHJlbihzZWxmKToKKyAgICAgICAgIyBhc3N1bWUgdG9rZW4gdHlwZSA5OSBhbmQgdXNlIHRleHQKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImEiKSkKKyAgICAgICAgYzAgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJiIikpCisgICAgICAgIHQuYWRkQ2hpbGQoYzApCisKKyAgICAgICAgbmV3Q2hpbGQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJjIikpCisgICAgICAgIHQucmVwbGFjZUNoaWxkcmVuKDAsIDAsIG5ld0NoaWxkKQorICAgICAgICBleHBlY3RpbmcgPSAiKGEgYykiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZUluTWlkZGxlKHNlbGYpOgorICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYSIpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImIiKSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYyIpKSkgIyBpbmRleCAxCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iZCIpKSkKKworICAgICAgICBuZXdDaGlsZCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9IngiKSkKKyAgICAgICAgdC5yZXBsYWNlQ2hpbGRyZW4oMSwgMSwgbmV3Q2hpbGQpCisgICAgICAgIGV4cGVjdGluZyA9ICIoYSBiIHggZCkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZUF0TGVmdChzZWxmKToKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImEiKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJiIikpKSAjIGluZGV4IDAKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJjIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImQiKSkpCisKKyAgICAgICAgbmV3Q2hpbGQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ4IikpCisgICAgICAgIHQucmVwbGFjZUNoaWxkcmVuKDAsIDAsIG5ld0NoaWxkKQorICAgICAgICBleHBlY3RpbmcgPSAiKGEgeCBjIGQpIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpCisgICAgICAgIHQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VBdFJpZ2h0KHNlbGYpOgorICAgICAgICB0ID0gQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYSIpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImIiKSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYyIpKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJkIikpKSAjIGluZGV4IDIKKworICAgICAgICBuZXdDaGlsZCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9IngiKSkKKyAgICAgICAgdC5yZXBsYWNlQ2hpbGRyZW4oMiwgMiwgbmV3Q2hpbGQpCisgICAgICAgIGV4cGVjdGluZyA9ICIoYSBiIGMgeCkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZU9uZVdpdGhUd29BdExlZnQoc2VsZik6CisgICAgICAgIHQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJhIikpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYiIpKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJjIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImQiKSkpCisKKyAgICAgICAgbmV3Q2hpbGRyZW4gPSBzZWxmLmFkYXB0b3IubmlsKCkKKyAgICAgICAgbmV3Q2hpbGRyZW4uYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0ieCIpKSkKKyAgICAgICAgbmV3Q2hpbGRyZW4uYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0ieSIpKSkKKworICAgICAgICB0LnJlcGxhY2VDaGlsZHJlbigwLCAwLCBuZXdDaGlsZHJlbikKKyAgICAgICAgZXhwZWN0aW5nID0gIihhIHggeSBjIGQpIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpCisgICAgICAgIHQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VPbmVXaXRoVHdvQXRSaWdodChzZWxmKToKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImEiKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJiIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImMiKSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iZCIpKSkKKworICAgICAgICBuZXdDaGlsZHJlbiA9IHNlbGYuYWRhcHRvci5uaWwoKQorICAgICAgICBuZXdDaGlsZHJlbi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ4IikpKQorICAgICAgICBuZXdDaGlsZHJlbi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ5IikpKQorCisgICAgICAgIHQucmVwbGFjZUNoaWxkcmVuKDIsIDIsIG5ld0NoaWxkcmVuKQorICAgICAgICBleHBlY3RpbmcgPSAiKGEgYiBjIHggeSkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZU9uZVdpdGhUd29Jbk1pZGRsZShzZWxmKToKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImEiKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJiIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImMiKSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iZCIpKSkKKworICAgICAgICBuZXdDaGlsZHJlbiA9IHNlbGYuYWRhcHRvci5uaWwoKQorICAgICAgICBuZXdDaGlsZHJlbi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ4IikpKQorICAgICAgICBuZXdDaGlsZHJlbi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ5IikpKQorCisgICAgICAgIHQucmVwbGFjZUNoaWxkcmVuKDEsIDEsIG5ld0NoaWxkcmVuKQorICAgICAgICBleHBlY3RpbmcgPSAiKGEgYiB4IHkgZCkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZVR3b1dpdGhPbmVBdExlZnQoc2VsZik6CisgICAgICAgIHQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJhIikpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYiIpKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJjIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImQiKSkpCisKKyAgICAgICAgbmV3Q2hpbGQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ4IikpCisKKyAgICAgICAgdC5yZXBsYWNlQ2hpbGRyZW4oMCwgMSwgbmV3Q2hpbGQpCisgICAgICAgIGV4cGVjdGluZyA9ICIoYSB4IGQpIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpCisgICAgICAgIHQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKQorCisKKyAgICBkZWYgdGVzdFJlcGxhY2VUd29XaXRoT25lQXRSaWdodChzZWxmKToKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImEiKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJiIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImMiKSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iZCIpKSkKKworICAgICAgICBuZXdDaGlsZCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9IngiKSkKKworICAgICAgICB0LnJlcGxhY2VDaGlsZHJlbigxLCAyLCBuZXdDaGlsZCkKKyAgICAgICAgZXhwZWN0aW5nID0gIihhIGIgeCkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSkKKyAgICAgICAgdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpCisKKworICAgIGRlZiB0ZXN0UmVwbGFjZUFsbFdpdGhPbmUoc2VsZik6CisgICAgICAgIHQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJhIikpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iYiIpKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJjIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImQiKSkpCisKKyAgICAgICAgbmV3Q2hpbGQgPSBDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ4IikpCisKKyAgICAgICAgdC5yZXBsYWNlQ2hpbGRyZW4oMCwgMiwgbmV3Q2hpbGQpCisgICAgICAgIGV4cGVjdGluZyA9ICIoYSB4KSIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCB0LnRvU3RyaW5nVHJlZSgpKQorICAgICAgICB0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkKKworCisgICAgZGVmIHRlc3RSZXBsYWNlQWxsV2l0aFR3byhzZWxmKToKKyAgICAgICAgdCA9IENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImEiKSkKKyAgICAgICAgdC5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJiIikpKQorICAgICAgICB0LmFkZENoaWxkKENvbW1vblRyZWUoQ29tbW9uVG9rZW4oOTksIHRleHQ9ImMiKSkpCisgICAgICAgIHQuYWRkQ2hpbGQoQ29tbW9uVHJlZShDb21tb25Ub2tlbig5OSwgdGV4dD0iZCIpKSkKKworICAgICAgICBuZXdDaGlsZHJlbiA9IHNlbGYuYWRhcHRvci5uaWwoKQorICAgICAgICBuZXdDaGlsZHJlbi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ4IikpKQorICAgICAgICBuZXdDaGlsZHJlbi5hZGRDaGlsZChDb21tb25UcmVlKENvbW1vblRva2VuKDk5LCB0ZXh0PSJ5IikpKQorCisgICAgICAgIHQucmVwbGFjZUNoaWxkcmVuKDAsIDIsIG5ld0NoaWxkcmVuKQorICAgICAgICBleHBlY3RpbmcgPSAiKGEgeCB5KSIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCB0LnRvU3RyaW5nVHJlZSgpKQorICAgICAgICB0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkKKworCitjbGFzcyBUZXN0VHJlZUNvbnRleHQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIFRyZWVQYXJzZXIuaW5Db250ZXh0KCkgbWV0aG9kIiIiCisKKyAgICB0b2tlbk5hbWVzID0gWworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlZFQyIsICJBU1NJR04iLCAiUFJJTlQiLAorICAgICAgICAiUExVUyIsICJNVUxUIiwgIkRPVCIsICJJRCIsICJJTlQiLCAiV1MiLCAiJ1snIiwgIicsJyIsICInXSciCisgICAgICAgIF0KKworICAgIGRlZiB0ZXN0U2ltcGxlUGFyZW50KHNlbGYpOgorICAgICAgICB0cmVlID0gIihuaWwgKEFTU0lHTiBJRFt4XSBJTlRbM10pIChQUklOVCAoTVVMVCBJRFt4XSAoVkVDIElOVFsxXSBJTlRbMl0gSU5UWzNdKSkpKSIKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKHRyZWUpCisKKyAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UoCisgICAgICAgICAgICB0LAorICAgICAgICAgICAgIihuaWwgKEFTU0lHTiBJRFt4XSBJTlRbM10pIChQUklOVCAoTVVMVCBJRCAoVkVDIElOVCAleDpJTlQgSU5UKSkpKSIsCisgICAgICAgICAgICBsYWJlbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZCkKKyAgICAgICAgbm9kZSA9IGxhYmVscy5nZXQoIngiKQorCisgICAgICAgIGV4cGVjdGluZyA9IFRydWUKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiVkVDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROb1BhcmVudChzZWxmKToKKyAgICAgICAgdHJlZSA9ICIoUFJJTlQgKE1VTFQgSURbeF0gKFZFQyBJTlRbMV0gSU5UWzJdIElOVFszXSkpKSIKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKHRyZWUpCisKKyAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UoCisgICAgICAgICAgICB0LAorICAgICAgICAgICAgIigleDpQUklOVCAoTVVMVCBJRCAoVkVDIElOVCBJTlQgSU5UKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gRmFsc2UKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiVkVDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RQYXJlbnRXaXRoV2lsZGNhcmQoc2VsZik6CisgICAgICAgIHRyZWUgPSAiKG5pbCAoQVNTSUdOIElEW3hdIElOVFszXSkgKFBSSU5UIChNVUxUIElEW3hdIChWRUMgSU5UWzFdIElOVFsyXSBJTlRbM10pKSkpIgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUodHJlZSkKKworICAgICAgICBsYWJlbHMgPSB7fQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSgKKyAgICAgICAgICAgIHQsCisgICAgICAgICAgICAiKG5pbCAoQVNTSUdOIElEW3hdIElOVFszXSkgKFBSSU5UIChNVUxUIElEIChWRUMgSU5UICV4OklOVCBJTlQpKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gVHJ1ZQorICAgICAgICBmb3VuZCA9IFRyZWVQYXJzZXIuX2luQ29udGV4dChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMsIG5vZGUsICJWRUMgLi4uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZEF0U3RhcnRJZ25vcmVkKHNlbGYpOgorICAgICAgICB0cmVlID0gIihuaWwgKEFTU0lHTiBJRFt4XSBJTlRbM10pIChQUklOVCAoTVVMVCBJRFt4XSAoVkVDIElOVFsxXSBJTlRbMl0gSU5UWzNdKSkpKSIKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKHRyZWUpCisKKyAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UoCisgICAgICAgICAgICB0LAorICAgICAgICAgICAgIihuaWwgKEFTU0lHTiBJRFt4XSBJTlRbM10pIChQUklOVCAoTVVMVCBJRCAoVkVDIElOVCAleDpJTlQgSU5UKSkpKSIsCisgICAgICAgICAgICBsYWJlbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZCkKKyAgICAgICAgbm9kZSA9IGxhYmVscy5nZXQoIngiKQorCisgICAgICAgIGV4cGVjdGluZyA9IFRydWUKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiLi4uVkVDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZEluQmV0d2VlbihzZWxmKToKKyAgICAgICAgdHJlZSA9ICIobmlsIChBU1NJR04gSURbeF0gSU5UWzNdKSAoUFJJTlQgKE1VTFQgSURbeF0gKFZFQyBJTlRbMV0gSU5UWzJdIElOVFszXSkpKSkiCisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSh0cmVlKQorCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICIobmlsIChBU1NJR04gSURbeF0gSU5UWzNdKSAoUFJJTlQgKE1VTFQgSUQgKFZFQyBJTlQgJXg6SU5UIElOVCkpKSkiLAorICAgICAgICAgICAgbGFiZWxzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsaWQpCisgICAgICAgIG5vZGUgPSBsYWJlbHMuZ2V0KCJ4IikKKworICAgICAgICBleHBlY3RpbmcgPSBUcnVlCisgICAgICAgIGZvdW5kID0gVHJlZVBhcnNlci5faW5Db250ZXh0KGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcywgbm9kZSwgIlBSSU5ULi4uVkVDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RMb3RzT2ZXaWxkY2FyZHMoc2VsZik6CisgICAgICAgIHRyZWUgPSAiKG5pbCAoQVNTSUdOIElEW3hdIElOVFszXSkgKFBSSU5UIChNVUxUIElEW3hdIChWRUMgSU5UWzFdIElOVFsyXSBJTlRbM10pKSkpIgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUodHJlZSkKKworICAgICAgICBsYWJlbHMgPSB7fQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSgKKyAgICAgICAgICAgIHQsCisgICAgICAgICAgICAiKG5pbCAoQVNTSUdOIElEW3hdIElOVFszXSkgKFBSSU5UIChNVUxUIElEIChWRUMgSU5UICV4OklOVCBJTlQpKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gVHJ1ZQorICAgICAgICBmb3VuZCA9IFRyZWVQYXJzZXIuX2luQ29udGV4dChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMsIG5vZGUsICIuLi4gUFJJTlQgLi4uIFZFQyAuLi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdERlZXAoc2VsZik6CisgICAgICAgIHRyZWUgPSAiKFBSSU5UIChNVUxUIElEW3hdIChWRUMgKE1VTFQgSU5UWzldIElOVFsxXSkgSU5UWzJdIElOVFszXSkpKSIKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKHRyZWUpCisKKyAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UoCisgICAgICAgICAgICB0LAorICAgICAgICAgICAgIihQUklOVCAoTVVMVCBJRCAoVkVDIChNVUxUIElOVCAleDpJTlQpIElOVCBJTlQpKSkiLAorICAgICAgICAgICAgbGFiZWxzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsaWQpCisgICAgICAgIG5vZGUgPSBsYWJlbHMuZ2V0KCJ4IikKKworICAgICAgICBleHBlY3RpbmcgPSBUcnVlCisgICAgICAgIGZvdW5kID0gVHJlZVBhcnNlci5faW5Db250ZXh0KGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcywgbm9kZSwgIlZFQyAuLi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdERlZXBBbmRGaW5kUm9vdChzZWxmKToKKyAgICAgICAgdHJlZSA9ICIoUFJJTlQgKE1VTFQgSURbeF0gKFZFQyAoTVVMVCBJTlRbOV0gSU5UWzFdKSBJTlRbMl0gSU5UWzNdKSkpIgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUodHJlZSkKKworICAgICAgICBsYWJlbHMgPSB7fQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSgKKyAgICAgICAgICAgIHQsCisgICAgICAgICAgICAiKFBSSU5UIChNVUxUIElEIChWRUMgKE1VTFQgSU5UICV4OklOVCkgSU5UIElOVCkpKSIsCisgICAgICAgICAgICBsYWJlbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZCkKKyAgICAgICAgbm9kZSA9IGxhYmVscy5nZXQoIngiKQorCisgICAgICAgIGV4cGVjdGluZyA9IFRydWUKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiUFJJTlQgLi4uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3REZWVwQW5kRmluZFJvb3QyKHNlbGYpOgorICAgICAgICB0cmVlID0gIihQUklOVCAoTVVMVCBJRFt4XSAoVkVDIChNVUxUIElOVFs5XSBJTlRbMV0pIElOVFsyXSBJTlRbM10pKSkiCisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSh0cmVlKQorCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICIoUFJJTlQgKE1VTFQgSUQgKFZFQyAoTVVMVCBJTlQgJXg6SU5UKSBJTlQgSU5UKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gVHJ1ZQorICAgICAgICBmb3VuZCA9IFRyZWVQYXJzZXIuX2luQ29udGV4dChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMsIG5vZGUsICJQUklOVCAuLi4gVkVDIC4uLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Q2hhaW4oc2VsZik6CisgICAgICAgIHRyZWUgPSAiKFBSSU5UIChNVUxUIElEW3hdIChWRUMgKE1VTFQgSU5UWzldIElOVFsxXSkgSU5UWzJdIElOVFszXSkpKSIKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKHRyZWUpCisKKyAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UoCisgICAgICAgICAgICB0LAorICAgICAgICAgICAgIihQUklOVCAoTVVMVCBJRCAoVkVDIChNVUxUIElOVCAleDpJTlQpIElOVCBJTlQpKSkiLAorICAgICAgICAgICAgbGFiZWxzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsaWQpCisgICAgICAgIG5vZGUgPSBsYWJlbHMuZ2V0KCJ4IikKKworICAgICAgICBleHBlY3RpbmcgPSBUcnVlCisgICAgICAgIGZvdW5kID0gVHJlZVBhcnNlci5faW5Db250ZXh0KGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcywgbm9kZSwgIlBSSU5UIE1VTFQgVkVDIE1VTFQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICAjIyBURVNUIElOVkFMSUQgQ09OVEVYVFMKKworICAgIGRlZiB0ZXN0Tm90UGFyZW50KHNlbGYpOgorICAgICAgICB0cmVlID0gIihQUklOVCAoTVVMVCBJRFt4XSAoVkVDIChNVUxUIElOVFs5XSBJTlRbMV0pIElOVFsyXSBJTlRbM10pKSkiCisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSh0cmVlKQorCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICIoUFJJTlQgKE1VTFQgSUQgKFZFQyAoTVVMVCBJTlQgJXg6SU5UKSBJTlQgSU5UKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gRmFsc2UKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiVkVDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RNaXNtYXRjaChzZWxmKToKKyAgICAgICAgdHJlZSA9ICIoUFJJTlQgKE1VTFQgSURbeF0gKFZFQyAoTVVMVCBJTlRbOV0gSU5UWzFdKSBJTlRbMl0gSU5UWzNdKSkpIgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUodHJlZSkKKworICAgICAgICBsYWJlbHMgPSB7fQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSgKKyAgICAgICAgICAgIHQsCisgICAgICAgICAgICAiKFBSSU5UIChNVUxUIElEIChWRUMgKE1VTFQgSU5UICV4OklOVCkgSU5UIElOVCkpKSIsCisgICAgICAgICAgICBsYWJlbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZCkKKyAgICAgICAgbm9kZSA9IGxhYmVscy5nZXQoIngiKQorCisgICAgICAgIGV4cGVjdGluZyA9IEZhbHNlCisgICAgICAgICMjIG1pc3NpbmcgTVVMVAorICAgICAgICBmb3VuZCA9IFRyZWVQYXJzZXIuX2luQ29udGV4dChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMsIG5vZGUsICJQUklOVCBWRUMgTVVMVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TWlzbWF0Y2gyKHNlbGYpOgorICAgICAgICB0cmVlID0gIihQUklOVCAoTVVMVCBJRFt4XSAoVkVDIChNVUxUIElOVFs5XSBJTlRbMV0pIElOVFsyXSBJTlRbM10pKSkiCisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSh0cmVlKQorCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICIoUFJJTlQgKE1VTFQgSUQgKFZFQyAoTVVMVCBJTlQgJXg6SU5UKSBJTlQgSU5UKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gRmFsc2UKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiUFJJTlQgVkVDIC4uLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TWlzbWF0Y2gzKHNlbGYpOgorICAgICAgICB0cmVlID0gIihQUklOVCAoTVVMVCBJRFt4XSAoVkVDIChNVUxUIElOVFs5XSBJTlRbMV0pIElOVFsyXSBJTlRbM10pKSkiCisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSh0cmVlKQorCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICIoUFJJTlQgKE1VTFQgSUQgKFZFQyAoTVVMVCBJTlQgJXg6SU5UKSBJTlQgSU5UKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgZXhwZWN0aW5nID0gRmFsc2UKKyAgICAgICAgZm91bmQgPSBUcmVlUGFyc2VyLl9pbkNvbnRleHQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzLCBub2RlLCAiVkVDIC4uLiBWRUMgTVVMVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0RG91YmxlRXRjKHNlbGYpOgorICAgICAgICB0cmVlID0gIihQUklOVCAoTVVMVCBJRFt4XSAoVkVDIChNVUxUIElOVFs5XSBJTlRbMV0pIElOVFsyXSBJTlRbM10pKSkiCisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbk5hbWVzKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSh0cmVlKQorCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKAorICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICIoUFJJTlQgKE1VTFQgSUQgKFZFQyAoTVVMVCBJTlQgJXg6SU5UKSBJTlQgSU5UKSkpIiwKKyAgICAgICAgICAgIGxhYmVscykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkKQorICAgICAgICBub2RlID0gbGFiZWxzLmdldCgieCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgVHJlZVBhcnNlci5faW5Db250ZXh0KGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcywgbm9kZSwgIlBSSU5UIC4uLiAuLi4gVkVDIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBleGM6CisgICAgICAgICAgICBleHBlY3RpbmcgPSAiaW52YWxpZCBzeW50YXg6IC4uLiAuLi4iCisgICAgICAgICAgICBmb3VuZCA9IHN0cihleGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdERvdERvdChzZWxmKToKKyAgICAgICAgdHJlZSA9ICIoUFJJTlQgKE1VTFQgSURbeF0gKFZFQyAoTVVMVCBJTlRbOV0gSU5UWzFdKSBJTlRbMl0gSU5UWzNdKSkpIgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5OYW1lcykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUodHJlZSkKKworICAgICAgICBsYWJlbHMgPSB7fQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSgKKyAgICAgICAgICAgIHQsCisgICAgICAgICAgICAiKFBSSU5UIChNVUxUIElEIChWRUMgKE1VTFQgSU5UICV4OklOVCkgSU5UIElOVCkpKSIsCisgICAgICAgICAgICBsYWJlbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZCkKKyAgICAgICAgbm9kZSA9IGxhYmVscy5nZXQoIngiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFRyZWVQYXJzZXIuX2luQ29udGV4dChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMsIG5vZGUsICJQUklOVCAuLiBWRUMiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIGV4cGVjdGluZyA9ICJpbnZhbGlkIHN5bnRheDogLi4iCisgICAgICAgICAgICBmb3VuZCA9IHN0cihleGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKK2NsYXNzIFRlc3RUcmVlVmlzaXRvcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBvZiB0aGUgVHJlZVZpc2l0b3IgY2xhc3MuIiIiCisKKyAgICB0b2tlbk5hbWVzID0gWworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlZFQyIsICJBU1NJR04iLCAiUFJJTlQiLAorICAgICAgICAiUExVUyIsICJNVUxUIiwgIkRPVCIsICJJRCIsICJJTlQiLCAiV1MiLCAiJ1snIiwgIicsJyIsICInXSciCisgICAgICAgIF0KKworICAgIGRlZiB0ZXN0VHJlZVZpc2l0b3Ioc2VsZik6CisgICAgICAgIHRyZWUgPSAiKFBSSU5UIChNVUxUIElEW3hdIChWRUMgKE1VTFQgSU5UWzldIElOVFsxXSkgSU5UWzJdIElOVFszXSkpKSIKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VuTmFtZXMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKHRyZWUpCisKKyAgICAgICAgZm91bmQgPSBbXQorICAgICAgICBkZWYgcHJlKHQpOgorICAgICAgICAgICAgZm91bmQuYXBwZW5kKCJwcmUoJXMpIiAlIHQpCisgICAgICAgICAgICByZXR1cm4gdAorICAgICAgICBkZWYgcG9zdCh0KToKKyAgICAgICAgICAgIGZvdW5kLmFwcGVuZCgicG9zdCglcykiICUgdCkKKyAgICAgICAgICAgIHJldHVybiB0CisKKyAgICAgICAgdmlzaXRvciA9IFRyZWVWaXNpdG9yKGFkYXB0b3IpCisgICAgICAgIHZpc2l0b3IudmlzaXQodCwgcHJlLCBwb3N0KQorCisgICAgICAgIGV4cGVjdGluZyA9IFsgInByZShQUklOVCkiLCAicHJlKE1VTFQpIiwgInByZSh4KSIsICJwb3N0KHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAicHJlKFZFQykiLCAicHJlKE1VTFQpIiwgInByZSg5KSIsICJwb3N0KDkpIiwgInByZSgxKSIsCisgICAgICAgICAgICAgICAgICAgICAgInBvc3QoMSkiLCAicG9zdChNVUxUKSIsICJwcmUoMikiLCAicG9zdCgyKSIsICJwcmUoMykiLAorICAgICAgICAgICAgICAgICAgICAgICJwb3N0KDMpIiwgInBvc3QoVkVDKSIsICJwb3N0KE1VTFQpIiwgInBvc3QoUFJJTlQpIiBdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCitjbGFzcyBUZXN0VHJlZUl0ZXJhdG9yKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0b2tlbnMgPSBbCisgICAgICAgICI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLAorICAgICAgICAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIgXQorCisgICAgZGVmIHRlc3ROb2RlKHNlbGYpOgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiQSIpCisgICAgICAgIGl0ID0gVHJlZUl0ZXJhdG9yKHQpCisgICAgICAgIGV4cGVjdGluZyA9ICJBIEVPRiIKKyAgICAgICAgZm91bmQgPSBzZWxmLnRvU3RyaW5nKGl0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEZsYXRBQihzZWxmKToKKyAgICAgICAgYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChhZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihuaWwgQSBCKSIpCisgICAgICAgIGl0ID0gVHJlZUl0ZXJhdG9yKHQpCisgICAgICAgIGV4cGVjdGluZyA9ICJuaWwgRE9XTiBBIEIgVVAgRU9GIgorICAgICAgICBmb3VuZCA9IHNlbGYudG9TdHJpbmcoaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0QUIoc2VsZik6CisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCIoQSBCKSIpCisgICAgICAgIGl0ID0gVHJlZUl0ZXJhdG9yKHQpCisgICAgICAgIGV4cGVjdGluZyA9ICJBIERPV04gQiBVUCBFT0YiCisgICAgICAgIGZvdW5kID0gc2VsZi50b1N0cmluZyhpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RBQkMoc2VsZik6CisgICAgICAgIGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCIoQSBCIEMpIikKKyAgICAgICAgaXQgPSBUcmVlSXRlcmF0b3IodCkKKyAgICAgICAgZXhwZWN0aW5nID0gIkEgRE9XTiBCIEMgVVAgRU9GIgorICAgICAgICBmb3VuZCA9IHNlbGYudG9TdHJpbmcoaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0VmVydGljYWxMaXN0KHNlbGYpOgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgKEIgQykpIikKKyAgICAgICAgaXQgPSBUcmVlSXRlcmF0b3IodCkKKyAgICAgICAgZXhwZWN0aW5nID0gIkEgRE9XTiBCIERPV04gQyBVUCBVUCBFT0YiCisgICAgICAgIGZvdW5kID0gc2VsZi50b1N0cmluZyhpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RDb21wbGV4KHNlbGYpOgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgKEIgKEMgRCBFKSBGKSBHKSIpCisgICAgICAgIGl0ID0gVHJlZUl0ZXJhdG9yKHQpCisgICAgICAgIGV4cGVjdGluZyA9ICJBIERPV04gQiBET1dOIEMgRE9XTiBEIEUgVVAgRiBVUCBHIFVQIEVPRiIKKyAgICAgICAgZm91bmQgPSBzZWxmLnRvU3RyaW5nKGl0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFJlc2V0KHNlbGYpOgorICAgICAgICBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IoKQorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKGFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgKEIgKEMgRCBFKSBGKSBHKSIpCisgICAgICAgIGl0ID0gVHJlZUl0ZXJhdG9yKHQpCisgICAgICAgIGV4cGVjdGluZyA9ICJBIERPV04gQiBET1dOIEMgRE9XTiBEIEUgVVAgRiBVUCBHIFVQIEVPRiIKKyAgICAgICAgZm91bmQgPSBzZWxmLnRvU3RyaW5nKGl0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKQorCisgICAgICAgIGl0LnJlc2V0KCkKKyAgICAgICAgZXhwZWN0aW5nID0gIkEgRE9XTiBCIERPV04gQyBET1dOIEQgRSBVUCBGIFVQIEcgVVAgRU9GIgorICAgICAgICBmb3VuZCA9IHNlbGYudG9TdHJpbmcoaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0b1N0cmluZyhzZWxmLCBpdCk6CisgICAgICAgIGJ1ZiA9IFtdCisgICAgICAgIGZvciBuIGluIGl0OgorICAgICAgICAgICAgYnVmLmFwcGVuZChzdHIobikpCisKKyAgICAgICAgcmV0dXJuICcgJy5qb2luKGJ1ZikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4odGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24vdW5pdHRlc3RzL3Rlc3R0cmVld2l6YXJkLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0dHJlZXdpemFyZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ5OWJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3VuaXR0ZXN0cy90ZXN0dHJlZXdpemFyZC5weQpAQCAtMCwwICsxLDY5MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gYW50bHIzLnRyZWUgaW1wb3J0IENvbW1vblRyZWVBZGFwdG9yLCBDb21tb25UcmVlLCBJTlZBTElEX1RPS0VOX1RZUEUKK2Zyb20gYW50bHIzLnRyZWV3aXphcmQgaW1wb3J0IFRyZWVXaXphcmQsIGNvbXB1dGVUb2tlblR5cGVzLCBcCisgICAgIFRyZWVQYXR0ZXJuTGV4ZXIsIEVPRiwgSUQsIEJFR0lOLCBFTkQsIFBFUkNFTlQsIENPTE9OLCBET1QsIEFSRywgXAorICAgICBUcmVlUGF0dGVyblBhcnNlciwgXAorICAgICBUcmVlUGF0dGVybiwgV2lsZGNhcmRUcmVlUGF0dGVybiwgVHJlZVBhdHRlcm5UcmVlQWRhcHRvcgorCisKK2NsYXNzIFRlc3RDb21wdXRlVG9rZW5UeXBlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciB0aGUgY29tcHV0ZVRva2VuVHlwZXMgZnVuY3Rpb24uIiIiCisKKyAgICBkZWYgdGVzdE5vbmUoc2VsZik6CisgICAgICAgICIiImNvbXB1dGVUb2tlblR5cGVzKE5vbmUpIC0+IHt9IiIiCisKKyAgICAgICAgdHlwZU1hcCA9IGNvbXB1dGVUb2tlblR5cGVzKE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHR5cGVNYXAsIGRpY3QpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlTWFwLCB7fSkKKworCisgICAgZGVmIHRlc3RMaXN0KHNlbGYpOgorICAgICAgICAiIiJjb21wdXRlVG9rZW5UeXBlcyhbJ2EnLCAnYiddKSAtPiB7ICdhJzogMCwgJ2InOiAxIH0iIiIKKworICAgICAgICB0eXBlTWFwID0gY29tcHV0ZVRva2VuVHlwZXMoWydhJywgJ2InXSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UodHlwZU1hcCwgZGljdCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGVNYXAsIHsgJ2EnOiAwLCAnYic6IDEgfSkKKworCitjbGFzcyBUZXN0VHJlZVBhdHRlcm5MZXhlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciB0aGUgVHJlZVBhdHRlcm5MZXhlciBjbGFzcy4iIiIKKworICAgIGRlZiB0ZXN0QmVnaW4oc2VsZik6CisgICAgICAgICIiIlRyZWVQYXR0ZXJuTGV4ZXIoKTogJygnIiIiCisKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCcoJykKKyAgICAgICAgdHlwZSA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUsIEJFR0lOKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZXhlci5zdmFsLCAnJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuZXJyb3IsIEZhbHNlKQorCisKKyAgICBkZWYgdGVzdEVuZChzZWxmKToKKyAgICAgICAgIiIiVHJlZVBhdHRlcm5MZXhlcigpOiAnKSciIiIKKworICAgICAgICBsZXhlciA9IFRyZWVQYXR0ZXJuTGV4ZXIoJyknKQorICAgICAgICB0eXBlID0gbGV4ZXIubmV4dFRva2VuKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSwgRU5EKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZXhlci5zdmFsLCAnJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuZXJyb3IsIEZhbHNlKQorCisKKyAgICBkZWYgdGVzdFBlcmNlbnQoc2VsZik6CisgICAgICAgICIiIlRyZWVQYXR0ZXJuTGV4ZXIoKTogJyUnIiIiCisKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCclJykKKyAgICAgICAgdHlwZSA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUsIFBFUkNFTlQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxleGVyLnN2YWwsICcnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZXhlci5lcnJvciwgRmFsc2UpCisKKworICAgIGRlZiB0ZXN0RG90KHNlbGYpOgorICAgICAgICAiIiJUcmVlUGF0dGVybkxleGVyKCk6ICcuJyIiIgorCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignLicpCisgICAgICAgIHR5cGUgPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlLCBET1QpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxleGVyLnN2YWwsICcnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZXhlci5lcnJvciwgRmFsc2UpCisKKworICAgIGRlZiB0ZXN0Q29sb24oc2VsZik6CisgICAgICAgICIiIlRyZWVQYXR0ZXJuTGV4ZXIoKTogJzonIiIiCisKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCc6JykKKyAgICAgICAgdHlwZSA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUsIENPTE9OKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZXhlci5zdmFsLCAnJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuZXJyb3IsIEZhbHNlKQorCisKKyAgICBkZWYgdGVzdEVPRihzZWxmKToKKyAgICAgICAgIiIiVHJlZVBhdHRlcm5MZXhlcigpOiBFT0YiIiIKKworICAgICAgICBsZXhlciA9IFRyZWVQYXR0ZXJuTGV4ZXIoJyAgXG4gXHIgXHQgJykKKyAgICAgICAgdHlwZSA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUsIEVPRikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuc3ZhbCwgJycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxleGVyLmVycm9yLCBGYWxzZSkKKworCisgICAgZGVmIHRlc3RJRChzZWxmKToKKyAgICAgICAgIiIiVHJlZVBhdHRlcm5MZXhlcigpOiBJRCIiIgorCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignX2ZvbzEyX2JhcicpCisgICAgICAgIHR5cGUgPSBsZXhlci5uZXh0VG9rZW4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlLCBJRCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuc3ZhbCwgJ19mb28xMl9iYXInKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZXhlci5lcnJvciwgRmFsc2UpCisKKworICAgIGRlZiB0ZXN0QVJHKHNlbGYpOgorICAgICAgICAiIiJUcmVlUGF0dGVybkxleGVyKCk6IEFSRyIiIgorCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignWyBcXF1ibGFcXG5dJykKKyAgICAgICAgdHlwZSA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUsIEFSRykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuc3ZhbCwgJyBdYmxhXFxuJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuZXJyb3IsIEZhbHNlKQorCisKKyAgICBkZWYgdGVzdEVycm9yKHNlbGYpOgorICAgICAgICAiIiJUcmVlUGF0dGVybkxleGVyKCk6IGVycm9yIiIiCisKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCcxJykKKyAgICAgICAgdHlwZSA9IGxleGVyLm5leHRUb2tlbigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUsIEVPRikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGV4ZXIuc3ZhbCwgJycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxleGVyLmVycm9yLCBUcnVlKQorCisKK2NsYXNzIFRlc3RUcmVlUGF0dGVyblBhcnNlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciB0aGUgVHJlZVBhdHRlcm5QYXJzZXIgY2xhc3MuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlNldHVwIHRleHQgZml4dXJlCisKKyAgICAgICAgV2UgbmVlZCBhIHRyZWUgYWRhcHRvciwgdXNlIENvbW1vblRyZWVBZGFwdG9yLgorICAgICAgICBBbmQgYSBjb25zdGFudCBsaXN0IG9mIHRva2VuIG5hbWVzLgorCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKyAgICAgICAgc2VsZi50b2tlbnMgPSBbCisgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiSUQiLCAiVkFSIgorICAgICAgICAgICAgXQorICAgICAgICBzZWxmLndpemFyZCA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCB0b2tlbk5hbWVzPXNlbGYudG9rZW5zKQorCisKKyAgICBkZWYgdGVzdFNpbmdsZU5vZGUoc2VsZik6CisgICAgICAgICIiIlRyZWVQYXR0ZXJuUGFyc2VyOiAnSUQnIiIiCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignSUQnKQorICAgICAgICBwYXJzZXIgPSBUcmVlUGF0dGVyblBhcnNlcihsZXhlciwgc2VsZi53aXphcmQsIHNlbGYuYWRhcHRvcikKKyAgICAgICAgdHJlZSA9IHBhcnNlci5wYXR0ZXJuKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UodHJlZSwgQ29tbW9uVHJlZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRyZWUuZ2V0VHlwZSgpLCAxMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHJlZS5nZXRUZXh0KCksICdJRCcpCisKKworICAgIGRlZiB0ZXN0U2luZ2xlTm9kZVdpdGhBcmcoc2VsZik6CisgICAgICAgICIiIlRyZWVQYXR0ZXJuUGFyc2VyOiAnSURbZm9vXSciIiIKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCdJRFtmb29dJykKKyAgICAgICAgcGFyc2VyID0gVHJlZVBhdHRlcm5QYXJzZXIobGV4ZXIsIHNlbGYud2l6YXJkLCBzZWxmLmFkYXB0b3IpCisgICAgICAgIHRyZWUgPSBwYXJzZXIucGF0dGVybigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHRyZWUsIENvbW1vblRyZWUpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cmVlLmdldFR5cGUoKSwgMTApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRyZWUuZ2V0VGV4dCgpLCAnZm9vJykKKworCisgICAgZGVmIHRlc3RTaW5nbGVMZXZlbFRyZWUoc2VsZik6CisgICAgICAgICIiIlRyZWVQYXR0ZXJuUGFyc2VyOiAnKEEgQiknIiIiCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignKEEgQiknKQorICAgICAgICBwYXJzZXIgPSBUcmVlUGF0dGVyblBhcnNlcihsZXhlciwgc2VsZi53aXphcmQsIHNlbGYuYWRhcHRvcikKKyAgICAgICAgdHJlZSA9IHBhcnNlci5wYXR0ZXJuKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UodHJlZSwgQ29tbW9uVHJlZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRyZWUuZ2V0VHlwZSgpLCA1KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cmVlLmdldFRleHQoKSwgJ0EnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cmVlLmdldENoaWxkQ291bnQoKSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHJlZS5nZXRDaGlsZCgwKS5nZXRUeXBlKCksIDYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRyZWUuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpLCAnQicpCisKKworICAgIGRlZiB0ZXN0TmlsKHNlbGYpOgorICAgICAgICAiIiJUcmVlUGF0dGVyblBhcnNlcjogJ25pbCciIiIKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCduaWwnKQorICAgICAgICBwYXJzZXIgPSBUcmVlUGF0dGVyblBhcnNlcihsZXhlciwgc2VsZi53aXphcmQsIHNlbGYuYWRhcHRvcikKKyAgICAgICAgdHJlZSA9IHBhcnNlci5wYXR0ZXJuKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UodHJlZSwgQ29tbW9uVHJlZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRyZWUuZ2V0VHlwZSgpLCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cmVlLmdldFRleHQoKSwgTm9uZSkKKworCisgICAgZGVmIHRlc3RXaWxkY2FyZChzZWxmKToKKyAgICAgICAgIiIiVHJlZVBhdHRlcm5QYXJzZXI6ICcoLiknIiIiCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignKC4pJykKKyAgICAgICAgcGFyc2VyID0gVHJlZVBhdHRlcm5QYXJzZXIobGV4ZXIsIHNlbGYud2l6YXJkLCBzZWxmLmFkYXB0b3IpCisgICAgICAgIHRyZWUgPSBwYXJzZXIucGF0dGVybigpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHRyZWUsIFdpbGRjYXJkVHJlZVBhdHRlcm4pKQorCisKKyAgICBkZWYgdGVzdExhYmVsKHNlbGYpOgorICAgICAgICAiIiJUcmVlUGF0dGVyblBhcnNlcjogJyglYTpBKSciIiIKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCcoJWE6QSknKQorICAgICAgICBwYXJzZXIgPSBUcmVlUGF0dGVyblBhcnNlcihsZXhlciwgc2VsZi53aXphcmQsIFRyZWVQYXR0ZXJuVHJlZUFkYXB0b3IoKSkKKyAgICAgICAgdHJlZSA9IHBhcnNlci5wYXR0ZXJuKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UodHJlZSwgVHJlZVBhdHRlcm4pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cmVlLmxhYmVsLCAnYScpCisKKworICAgIGRlZiB0ZXN0RXJyb3IxKHNlbGYpOgorICAgICAgICAiIiJUcmVlUGF0dGVyblBhcnNlcjogJyknIiIiCisgICAgICAgIGxleGVyID0gVHJlZVBhdHRlcm5MZXhlcignKScpCisgICAgICAgIHBhcnNlciA9IFRyZWVQYXR0ZXJuUGFyc2VyKGxleGVyLCBzZWxmLndpemFyZCwgc2VsZi5hZGFwdG9yKQorICAgICAgICB0cmVlID0gcGFyc2VyLnBhdHRlcm4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHJlZSBpcyBOb25lKQorCisKKyAgICBkZWYgdGVzdEVycm9yMihzZWxmKToKKyAgICAgICAgIiIiVHJlZVBhdHRlcm5QYXJzZXI6ICcoKSciIiIKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCcoKScpCisgICAgICAgIHBhcnNlciA9IFRyZWVQYXR0ZXJuUGFyc2VyKGxleGVyLCBzZWxmLndpemFyZCwgc2VsZi5hZGFwdG9yKQorICAgICAgICB0cmVlID0gcGFyc2VyLnBhdHRlcm4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHJlZSBpcyBOb25lKQorCisKKyAgICBkZWYgdGVzdEVycm9yMyhzZWxmKToKKyAgICAgICAgIiIiVHJlZVBhdHRlcm5QYXJzZXI6ICcoQSBdKSciIiIKKyAgICAgICAgbGV4ZXIgPSBUcmVlUGF0dGVybkxleGVyKCcoQSBdKScpCisgICAgICAgIHBhcnNlciA9IFRyZWVQYXR0ZXJuUGFyc2VyKGxleGVyLCBzZWxmLndpemFyZCwgc2VsZi5hZGFwdG9yKQorICAgICAgICB0cmVlID0gcGFyc2VyLnBhdHRlcm4oKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHJlZSBpcyBOb25lKQorCisKK2NsYXNzIFRlc3RUcmVlV2l6YXJkKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHRoZSBUcmVlV2l6YXJkIGNsYXNzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJTZXR1cCB0ZXh0IGZpeHVyZQorCisgICAgICAgIFdlIG5lZWQgYSB0cmVlIGFkYXB0b3IsIHVzZSBDb21tb25UcmVlQWRhcHRvci4KKyAgICAgICAgQW5kIGEgY29uc3RhbnQgbGlzdCBvZiB0b2tlbiBuYW1lcy4KKworICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvcigpCisgICAgICAgIHNlbGYudG9rZW5zID0gWworICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIklEIiwgIlZBUiIKKyAgICAgICAgICAgIF0KKworCisgICAgZGVmIHRlc3RJbml0KHNlbGYpOgorICAgICAgICAiIiJUcmVlV2l6YXJkLl9faW5pdF9fKCkiIiIKKworICAgICAgICB3aXogPSBUcmVlV2l6YXJkKAorICAgICAgICAgICAgc2VsZi5hZGFwdG9yLAorICAgICAgICAgICAgdG9rZW5OYW1lcz1bJ2EnLCAnYiddCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHdpei5hZGFwdG9yIGlzIHNlbGYuYWRhcHRvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICB3aXoudG9rZW5OYW1lVG9UeXBlTWFwLAorICAgICAgICAgICAgeyAnYSc6IDAsICdiJzogMSB9CisgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0R2V0VG9rZW5UeXBlKHNlbGYpOgorICAgICAgICAiIiJUcmVlV2l6YXJkLmdldFRva2VuVHlwZSgpIiIiCisKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZCgKKyAgICAgICAgICAgIHNlbGYuYWRhcHRvciwKKyAgICAgICAgICAgIHRva2VuTmFtZXM9c2VsZi50b2tlbnMKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHdpei5nZXRUb2tlblR5cGUoJ0EnKSwKKyAgICAgICAgICAgIDUKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHdpei5nZXRUb2tlblR5cGUoJ1ZBUicpLAorICAgICAgICAgICAgMTEKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgICAgIHdpei5nZXRUb2tlblR5cGUoJ2ludmFsaWQnKSwKKyAgICAgICAgICAgIElOVkFMSURfVE9LRU5fVFlQRQorICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RTaW5nbGVOb2RlKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCJJRCIpCisgICAgICAgIGZvdW5kID0gdC50b1N0cmluZ1RyZWUoKQorICAgICAgICBleHBlY3RpbmcgPSAiSUQiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0U2luZ2xlTm9kZVdpdGhBcmcoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIklEW2Zvb10iKQorICAgICAgICBmb3VuZCA9IHQudG9TdHJpbmdUcmVlKCkKKyAgICAgICAgZXhwZWN0aW5nID0gImZvbyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RTaW5nbGVOb2RlVHJlZShzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEpIikKKyAgICAgICAgZm91bmQgPSB0LnRvU3RyaW5nVHJlZSgpCisgICAgICAgIGV4cGVjdGluZyA9ICJBIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdFNpbmdsZUxldmVsVHJlZShzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgQiBDIEQpIikKKyAgICAgICAgZm91bmQgPSB0LnRvU3RyaW5nVHJlZSgpCisgICAgICAgIGV4cGVjdGluZyA9ICIoQSBCIEMgRCkiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0TGlzdFRyZWUoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihuaWwgQSBCIEMpIikKKyAgICAgICAgZm91bmQgPSB0LnRvU3RyaW5nVHJlZSgpCisgICAgICAgIGV4cGVjdGluZyA9ICJBIEIgQyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3RJbnZhbGlkTGlzdFRyZWUoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIkEgQiBDIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQgaXMgTm9uZSkKKworCisgICAgZGVmIHRlc3REb3VibGVMZXZlbFRyZWUoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihBIChCIEMpIChCIEQpIEUpIikKKyAgICAgICAgZm91bmQgPSB0LnRvU3RyaW5nVHJlZSgpCisgICAgICAgIGV4cGVjdGluZyA9ICIoQSAoQiBDKSAoQiBEKSBFKSIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIF9fc2ltcGxpZnlJbmRleE1hcChzZWxmLCBpbmRleE1hcCk6CisgICAgICAgIHJldHVybiBkaWN0KCAjIHN0cmluZ2lmeSBub2RlcyBmb3IgZWFzeSBjb21wYXJpbmcKKyAgICAgICAgICAgICh0dHlwZSwgW3N0cihub2RlKSBmb3Igbm9kZSBpbiBub2Rlc10pCisgICAgICAgICAgICBmb3IgdHR5cGUsIG5vZGVzIGluIGluZGV4TWFwLml0ZW1zKCkKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0U2luZ2xlTm9kZUluZGV4KHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHRyZWUgPSB3aXouY3JlYXRlKCJJRCIpCisgICAgICAgIGluZGV4TWFwID0gd2l6LmluZGV4KHRyZWUpCisgICAgICAgIGZvdW5kID0gc2VsZi5fX3NpbXBsaWZ5SW5kZXhNYXAoaW5kZXhNYXApCisgICAgICAgIGV4cGVjdGluZyA9IHsgMTA6IFsiSUQiXSB9CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0Tm9SZXBlYXRzSW5kZXgoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdHJlZSA9IHdpei5jcmVhdGUoIihBIEIgQyBEKSIpCisgICAgICAgIGluZGV4TWFwID0gd2l6LmluZGV4KHRyZWUpCisgICAgICAgIGZvdW5kID0gc2VsZi5fX3NpbXBsaWZ5SW5kZXhNYXAoaW5kZXhNYXApCisgICAgICAgIGV4cGVjdGluZyA9IHsgODpbJ0QnXSwgNjpbJ0InXSwgNzpbJ0MnXSwgNTpbJ0EnXSB9CisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworICAgIGRlZiB0ZXN0UmVwZWF0c0luZGV4KHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHRyZWUgPSB3aXouY3JlYXRlKCIoQSBCIChBIEMgQikgQiBEIEQpIikKKyAgICAgICAgaW5kZXhNYXAgPSB3aXouaW5kZXgodHJlZSkKKyAgICAgICAgZm91bmQgPSBzZWxmLl9fc2ltcGxpZnlJbmRleE1hcChpbmRleE1hcCkKKyAgICAgICAgZXhwZWN0aW5nID0geyA4OiBbJ0QnLCAnRCddLCA2OiBbJ0InLCAnQicsICdCJ10sIDc6IFsnQyddLCA1OiBbJ0EnLCAnQSddIH0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBmb3VuZCkKKworCisgICAgZGVmIHRlc3ROb1JlcGVhdHNWaXNpdChzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0cmVlID0gd2l6LmNyZWF0ZSgiKEEgQiBDIEQpIikKKworICAgICAgICBlbGVtZW50cyA9IFtdCisgICAgICAgIGRlZiB2aXNpdG9yKG5vZGUsIHBhcmVudCwgY2hpbGRJbmRleCwgbGFiZWxzKToKKyAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZChzdHIobm9kZSkpCisKKyAgICAgICAgd2l6LnZpc2l0KHRyZWUsIHdpei5nZXRUb2tlblR5cGUoIkIiKSwgdmlzaXRvcikKKworICAgICAgICBleHBlY3RpbmcgPSBbJ0InXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGVsZW1lbnRzKQorCisKKyAgICBkZWYgdGVzdE5vUmVwZWF0c1Zpc2l0MihzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0cmVlID0gd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpCisKKyAgICAgICAgZWxlbWVudHMgPSBbXQorICAgICAgICBkZWYgdmlzaXRvcihub2RlLCBwYXJlbnQsIGNoaWxkSW5kZXgsIGxhYmVscyk6CisgICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoc3RyKG5vZGUpKQorCisgICAgICAgIHdpei52aXNpdCh0cmVlLCB3aXouZ2V0VG9rZW5UeXBlKCJDIiksIHZpc2l0b3IpCisKKyAgICAgICAgZXhwZWN0aW5nID0gWydDJ10KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBlbGVtZW50cykKKworCisgICAgZGVmIHRlc3RSZXBlYXRzVmlzaXQoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdHJlZSA9IHdpei5jcmVhdGUoIihBIEIgKEEgQyBCKSBCIEQgRCkiKQorCisgICAgICAgIGVsZW1lbnRzID0gW10KKyAgICAgICAgZGVmIHZpc2l0b3Iobm9kZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpOgorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKHN0cihub2RlKSkKKworICAgICAgICB3aXoudmlzaXQodHJlZSwgd2l6LmdldFRva2VuVHlwZSgiQiIpLCB2aXNpdG9yKQorCisgICAgICAgIGV4cGVjdGluZyA9IFsnQicsICdCJywgJ0InXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGVsZW1lbnRzKQorCisKKyAgICBkZWYgdGVzdFJlcGVhdHNWaXNpdDIoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdHJlZSA9IHdpei5jcmVhdGUoIihBIEIgKEEgQyBCKSBCIEQgRCkiKQorCisgICAgICAgIGVsZW1lbnRzID0gW10KKyAgICAgICAgZGVmIHZpc2l0b3Iobm9kZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpOgorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKHN0cihub2RlKSkKKworICAgICAgICB3aXoudmlzaXQodHJlZSwgd2l6LmdldFRva2VuVHlwZSgiQSIpLCB2aXNpdG9yKQorCisgICAgICAgIGV4cGVjdGluZyA9IFsnQScsICdBJ10KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBlbGVtZW50cykKKworCisgICAgZGVmIHRlc3RSZXBlYXRzVmlzaXRXaXRoQ29udGV4dChzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0cmVlID0gd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpCisKKyAgICAgICAgZWxlbWVudHMgPSBbXQorICAgICAgICBkZWYgdmlzaXRvcihub2RlLCBwYXJlbnQsIGNoaWxkSW5kZXgsIGxhYmVscyk6CisgICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoJyVzQCVzWyVkXScgJSAobm9kZSwgcGFyZW50LCBjaGlsZEluZGV4KSkKKworICAgICAgICB3aXoudmlzaXQodHJlZSwgd2l6LmdldFRva2VuVHlwZSgiQiIpLCB2aXNpdG9yKQorCisgICAgICAgIGV4cGVjdGluZyA9IFsnQkBBWzBdJywgJ0JAQVsxXScsICdCQEFbMl0nXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGVsZW1lbnRzKQorCisKKyAgICBkZWYgdGVzdFJlcGVhdHNWaXNpdFdpdGhOdWxsUGFyZW50QW5kQ29udGV4dChzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0cmVlID0gd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpCisKKyAgICAgICAgZWxlbWVudHMgPSBbXQorICAgICAgICBkZWYgdmlzaXRvcihub2RlLCBwYXJlbnQsIGNoaWxkSW5kZXgsIGxhYmVscyk6CisgICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoCisgICAgICAgICAgICAgICAgJyVzQCVzWyVkXScKKyAgICAgICAgICAgICAgICAlIChub2RlLCBbJ25pbCcsIHBhcmVudF1bcGFyZW50IGlzIG5vdCBOb25lXSwgY2hpbGRJbmRleCkKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgd2l6LnZpc2l0KHRyZWUsIHdpei5nZXRUb2tlblR5cGUoIkEiKSwgdmlzaXRvcikKKworICAgICAgICBleHBlY3RpbmcgPSBbJ0FAbmlsWzBdJywgJ0FAQVsxXSddCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZWxlbWVudHMpCisKKworICAgIGRlZiB0ZXN0VmlzaXRQYXR0ZXJuKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHRyZWUgPSB3aXouY3JlYXRlKCIoQSBCIEMgKEEgQikgRCkiKQorCisgICAgICAgIGVsZW1lbnRzID0gW10KKyAgICAgICAgZGVmIHZpc2l0b3Iobm9kZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpOgorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKAorICAgICAgICAgICAgICAgIHN0cihub2RlKQorICAgICAgICAgICAgICAgICkKKworICAgICAgICB3aXoudmlzaXQodHJlZSwgJyhBIEIpJywgdmlzaXRvcikKKworICAgICAgICBleHBlY3RpbmcgPSBbJ0EnXSAjIHNob3VsZG4ndCBtYXRjaCBvdmVyYWxsIHJvb3QsIGp1c3QgKEEgQikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBlbGVtZW50cykKKworCisgICAgZGVmIHRlc3RWaXNpdFBhdHRlcm5NdWx0aXBsZShzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0cmVlID0gd2l6LmNyZWF0ZSgiKEEgQiBDIChBIEIpIChEIChBIEIpKSkiKQorCisgICAgICAgIGVsZW1lbnRzID0gW10KKyAgICAgICAgZGVmIHZpc2l0b3Iobm9kZSwgcGFyZW50LCBjaGlsZEluZGV4LCBsYWJlbHMpOgorICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKAorICAgICAgICAgICAgICAgICclc0Alc1slZF0nCisgICAgICAgICAgICAgICAgJSAobm9kZSwgWyduaWwnLCBwYXJlbnRdW3BhcmVudCBpcyBub3QgTm9uZV0sIGNoaWxkSW5kZXgpCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIHdpei52aXNpdCh0cmVlLCAnKEEgQiknLCB2aXNpdG9yKQorCisgICAgICAgIGV4cGVjdGluZyA9IFsnQUBBWzJdJywgJ0FARFswXSddCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZWxlbWVudHMpCisKKworICAgIGRlZiB0ZXN0VmlzaXRQYXR0ZXJuTXVsdGlwbGVXaXRoTGFiZWxzKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHRyZWUgPSB3aXouY3JlYXRlKCIoQSBCIEMgKEFbZm9vXSBCW2Jhcl0pIChEIChBW2JpZ10gQltkb2ddKSkpIikKKworICAgICAgICBlbGVtZW50cyA9IFtdCisgICAgICAgIGRlZiB2aXNpdG9yKG5vZGUsIHBhcmVudCwgY2hpbGRJbmRleCwgbGFiZWxzKToKKyAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAnJXNAJXNbJWRdJXMmJXMnCisgICAgICAgICAgICAgICAgJSAobm9kZSwKKyAgICAgICAgICAgICAgICAgICBbJ25pbCcsIHBhcmVudF1bcGFyZW50IGlzIG5vdCBOb25lXSwKKyAgICAgICAgICAgICAgICAgICBjaGlsZEluZGV4LAorICAgICAgICAgICAgICAgICAgIGxhYmVsc1snYSddLAorICAgICAgICAgICAgICAgICAgIGxhYmVsc1snYiddLAorICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgd2l6LnZpc2l0KHRyZWUsICcoJWE6QSAlYjpCKScsIHZpc2l0b3IpCisKKyAgICAgICAgZXhwZWN0aW5nID0gWydmb29AQVsyXWZvbyZiYXInLCAnYmlnQERbMF1iaWcmZG9nJ10KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0aW5nLCBlbGVtZW50cykKKworCisgICAgZGVmIHRlc3RQYXJzZShzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgQiBDKSIpCisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoQSBCIEMpIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHZhbGlkKQorCisKKyAgICBkZWYgdGVzdFBhcnNlU2luZ2xlTm9kZShzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiQSIpCisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKHQsICJBIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHZhbGlkKQorCisKKyAgICBkZWYgdGVzdFBhcnNlU2luZ2xlTm9kZUZhaWxzKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCJBIikKKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UodCwgIkIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHZhbGlkKQorCisKKyAgICBkZWYgdGVzdFBhcnNlRmxhdFRyZWUoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihuaWwgQSBCIEMpIikKKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UodCwgIihuaWwgQSBCIEMpIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHZhbGlkKQorCisKKyAgICBkZWYgdGVzdFBhcnNlRmxhdFRyZWVGYWlscyhzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKG5pbCBBIEIgQykiKQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSh0LCAiKG5pbCBBIEIpIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB2YWxpZCkKKworCisgICAgZGVmIHRlc3RQYXJzZUZsYXRUcmVlRmFpbHMyKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCIobmlsIEEgQiBDKSIpCisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKHQsICIobmlsIEEgQiBBKSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdmFsaWQpCisKKworICAgIGRlZiB0ZXN0V2lsZGNhcmQoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihBIEIgQykiKQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSh0LCAiKEEgLiAuKSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2YWxpZCkKKworCisgICAgZGVmIHRlc3RQYXJzZVdpdGhUZXh0KHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCIoQSBCW2Zvb10gQ1tiYXJdKSIpCisgICAgICAgICMgQyBwYXR0ZXJuIGhhcyBubyB0ZXh0IGFyZyBzbyBkZXNwaXRlIFtiYXJdIGluIHQsIG5vIG5lZWQKKyAgICAgICAgIyB0byBtYXRjaCB0ZXh0LS1jaGVjayBzdHJ1Y3R1cmUgb25seS4KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UodCwgIihBIEJbZm9vXSBDKSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2YWxpZCkKKworCisgICAgZGVmIHRlc3RQYXJzZVdpdGhUZXh0MihzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgQltUX18zMl0gKEMgKEQgRVthXSkpKSIpCisgICAgICAgICMgQyBwYXR0ZXJuIGhhcyBubyB0ZXh0IGFyZyBzbyBkZXNwaXRlIFtiYXJdIGluIHQsIG5vIG5lZWQKKyAgICAgICAgIyB0byBtYXRjaCB0ZXh0LS1jaGVjayBzdHJ1Y3R1cmUgb25seS4KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UodCwgIihBIEJbZm9vXSBDKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCIoQSBUX18zMiAoQyAoRCBhKSkpIiwgdC50b1N0cmluZ1RyZWUoKSkKKworCisgICAgZGVmIHRlc3RQYXJzZVdpdGhUZXh0RmFpbHMoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihBIEIgQykiKQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSh0LCAiKEFbZm9vXSBCIEMpIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB2YWxpZCkgIyBmYWlscworCisKKyAgICBkZWYgdGVzdFBhcnNlTGFiZWxzKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCIoQSBCIEMpIikKKyAgICAgICAgbGFiZWxzID0ge30KKyAgICAgICAgdmFsaWQgPSB3aXoucGFyc2UodCwgIiglYTpBICViOkIgJWM6QykiLCBsYWJlbHMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2YWxpZCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIkEiLCBzdHIobGFiZWxzWyJhIl0pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiQiIsIHN0cihsYWJlbHNbImIiXSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJDIiwgc3RyKGxhYmVsc1siYyJdKSkKKworCisgICAgZGVmIHRlc3RQYXJzZVdpdGhXaWxkY2FyZExhYmVscyhzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgQiBDKSIpCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoQSAlYjouICVjOi4pIiwgbGFiZWxzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModmFsaWQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJCIiwgc3RyKGxhYmVsc1siYiJdKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIkMiLCBzdHIobGFiZWxzWyJjIl0pKQorCisKKyAgICBkZWYgdGVzdFBhcnNlTGFiZWxzQW5kVGVzdFRleHQoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihBIEJbZm9vXSBDKSIpCisgICAgICAgIGxhYmVscyA9IHt9CisgICAgICAgIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoJWE6QSAlYjpCW2Zvb10gJWM6QykiLCBsYWJlbHMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2YWxpZCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIkEiLCBzdHIobGFiZWxzWyJhIl0pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiZm9vIiwgc3RyKGxhYmVsc1siYiJdKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIkMiLCBzdHIobGFiZWxzWyJjIl0pKQorCisKKyAgICBkZWYgdGVzdFBhcnNlTGFiZWxzSW5OZXN0ZWRUcmVlKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQgPSB3aXouY3JlYXRlKCIoQSAoQiBDKSAoRCBFKSkiKQorICAgICAgICBsYWJlbHMgPSB7fQorICAgICAgICB2YWxpZCA9IHdpei5wYXJzZSh0LCAiKCVhOkEgKCViOkIgJWM6QykgKCVkOkQgJWU6RSkgKSIsIGxhYmVscykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHZhbGlkKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiQSIsIHN0cihsYWJlbHNbImEiXSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJCIiwgc3RyKGxhYmVsc1siYiJdKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIkMiLCBzdHIobGFiZWxzWyJjIl0pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiRCIsIHN0cihsYWJlbHNbImQiXSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJFIiwgc3RyKGxhYmVsc1siZSJdKSkKKworCisgICAgZGVmIHRlc3RFcXVhbHMoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdDEgPSB3aXouY3JlYXRlKCIoQSBCIEMpIikKKyAgICAgICAgdDIgPSB3aXouY3JlYXRlKCIoQSBCIEMpIikKKyAgICAgICAgc2FtZSA9IHdpei5lcXVhbHModDEsIHQyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2FtZSkKKworCisgICAgZGVmIHRlc3RFcXVhbHNXaXRoVGV4dChzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0MSA9IHdpei5jcmVhdGUoIihBIEJbZm9vXSBDKSIpCisgICAgICAgIHQyID0gd2l6LmNyZWF0ZSgiKEEgQltmb29dIEMpIikKKyAgICAgICAgc2FtZSA9IHdpei5lcXVhbHModDEsIHQyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2FtZSkKKworCisgICAgZGVmIHRlc3RFcXVhbHNXaXRoTWlzbWF0Y2hlZFRleHQoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdDEgPSB3aXouY3JlYXRlKCIoQSBCW2Zvb10gQykiKQorICAgICAgICB0MiA9IHdpei5jcmVhdGUoIihBIEIgQykiKQorICAgICAgICBzYW1lID0gd2l6LmVxdWFscyh0MSwgdDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2FtZSkKKworCisgICAgZGVmIHRlc3RFcXVhbHNXaXRoTWlzbWF0Y2hlZExpc3Qoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdDEgPSB3aXouY3JlYXRlKCIoQSBCIEMpIikKKyAgICAgICAgdDIgPSB3aXouY3JlYXRlKCIoQSBCIEEpIikKKyAgICAgICAgc2FtZSA9IHdpei5lcXVhbHModDEsIHQyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNhbWUpCisKKworICAgIGRlZiB0ZXN0RXF1YWxzV2l0aE1pc21hdGNoZWRMaXN0TGVuZ3RoKHNlbGYpOgorICAgICAgICB3aXogPSBUcmVlV2l6YXJkKHNlbGYuYWRhcHRvciwgc2VsZi50b2tlbnMpCisgICAgICAgIHQxID0gd2l6LmNyZWF0ZSgiKEEgQiBDKSIpCisgICAgICAgIHQyID0gd2l6LmNyZWF0ZSgiKEEgQikiKQorICAgICAgICBzYW1lID0gd2l6LmVxdWFscyh0MSwgdDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2FtZSkKKworCisgICAgZGVmIHRlc3RGaW5kUGF0dGVybihzZWxmKToKKyAgICAgICAgd2l6ID0gVHJlZVdpemFyZChzZWxmLmFkYXB0b3IsIHNlbGYudG9rZW5zKQorICAgICAgICB0ID0gd2l6LmNyZWF0ZSgiKEEgQiBDIChBW2Zvb10gQltiYXJdKSAoRCAoQVtiaWddIEJbZG9nXSkpKSIpCisgICAgICAgIHN1YnRyZWVzID0gd2l6LmZpbmQodCwgIihBIEIpIikKKyAgICAgICAgZm91bmQgPSBbc3RyKG5vZGUpIGZvciBub2RlIGluIHN1YnRyZWVzXQorICAgICAgICBleHBlY3RpbmcgPSBbJ2ZvbycsICdiaWcnXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RpbmcsIGZvdW5kKQorCisKKyAgICBkZWYgdGVzdEZpbmRUb2tlblR5cGUoc2VsZik6CisgICAgICAgIHdpeiA9IFRyZWVXaXphcmQoc2VsZi5hZGFwdG9yLCBzZWxmLnRva2VucykKKyAgICAgICAgdCA9IHdpei5jcmVhdGUoIihBIEIgQyAoQVtmb29dIEJbYmFyXSkgKEQgKEFbYmlnXSBCW2RvZ10pKSkiKQorICAgICAgICBzdWJ0cmVlcyA9IHdpei5maW5kKHQsIHdpei5nZXRUb2tlblR5cGUoJ0EnKSkKKyAgICAgICAgZm91bmQgPSBbc3RyKG5vZGUpIGZvciBub2RlIGluIHN1YnRyZWVzXQorICAgICAgICBleHBlY3RpbmcgPSBbJ0EnLCAnZm9vJywgJ2JpZyddCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdGluZywgZm91bmQpCisKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4odGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9QeXRob24veG1scnVubmVyLnB5IGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3htbHJ1bm5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGZlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUHl0aG9uL3htbHJ1bm5lci5weQpAQCAtMCwwICsxLDM3OCBAQAorIiIiCitYTUwgVGVzdCBSdW5uZXIgZm9yIFB5VW5pdAorIiIiCisKKyMgV3JpdHRlbiBieSBTZWJhc3RpYW4gUml0dGF1IDxzcml0dGF1QGpyb2dlci5pbi1iZXJsaW4uZGU+IGFuZCBwbGFjZWQgaW4KKyMgdGhlIFB1YmxpYyBEb21haW4uIFdpdGggY29udHJpYnV0aW9ucyBieSBQYW9sbyBCb3JlbGxpLgorCitfX3JldmlzaW9uX18gPSAiJElkOiAvcHJpdmF0ZS9weXRob24vc3RkbGliL3htbHJ1bm5lci5weSAxNjY1NCAyMDA3LTExLTEyVDEyOjQ2OjM1LjM2ODk0NVogc3JpdHRhdSAgJCIKKworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20geG1sLnNheC5zYXh1dGlscyBpbXBvcnQgZXNjYXBlCisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKworY2xhc3MgX1Rlc3RJbmZvKG9iamVjdCk6CisKKyAgICAiIiJJbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgdGVzdC4KKyAgICAKKyAgICBVc2VkIGJ5IF9YTUxUZXN0UmVzdWx0LgorICAgIAorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3QsIHRpbWUpOgorICAgICAgICAoc2VsZi5fY2xhc3MsIHNlbGYuX21ldGhvZCkgPSB0ZXN0LmlkKCkucnNwbGl0KCIuIiwgMSkKKyAgICAgICAgc2VsZi5fdGltZSA9IHRpbWUKKyAgICAgICAgc2VsZi5fZXJyb3IgPSBOb25lCisgICAgICAgIHNlbGYuX2ZhaWx1cmUgPSBOb25lCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGNyZWF0ZV9zdWNjZXNzKHRlc3QsIHRpbWUpOgorICAgICAgICAiIiJDcmVhdGUgYSBfVGVzdEluZm8gaW5zdGFuY2UgZm9yIGEgc3VjY2Vzc2Z1bCB0ZXN0LiIiIgorICAgICAgICByZXR1cm4gX1Rlc3RJbmZvKHRlc3QsIHRpbWUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGNyZWF0ZV9mYWlsdXJlKHRlc3QsIHRpbWUsIGZhaWx1cmUpOgorICAgICAgICAiIiJDcmVhdGUgYSBfVGVzdEluZm8gaW5zdGFuY2UgZm9yIGEgZmFpbGVkIHRlc3QuIiIiCisgICAgICAgIGluZm8gPSBfVGVzdEluZm8odGVzdCwgdGltZSkKKyAgICAgICAgaW5mby5fZmFpbHVyZSA9IGZhaWx1cmUKKyAgICAgICAgcmV0dXJuIGluZm8KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgY3JlYXRlX2Vycm9yKHRlc3QsIHRpbWUsIGVycm9yKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgX1Rlc3RJbmZvIGluc3RhbmNlIGZvciBhbiBlcnJvbmVvdXMgdGVzdC4iIiIKKyAgICAgICAgaW5mbyA9IF9UZXN0SW5mbyh0ZXN0LCB0aW1lKQorICAgICAgICBpbmZvLl9lcnJvciA9IGVycm9yCisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICBkZWYgcHJpbnRfcmVwb3J0KHNlbGYsIHN0cmVhbSk6CisgICAgICAgICIiIlByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVzdCBjYXNlIGluIFhNTCBmb3JtYXQgdG8gdGhlCisgICAgICAgIHN1cHBsaWVkIHN0cmVhbS4KKworICAgICAgICAiIiIKKyAgICAgICAgc3RyZWFtLndyaXRlKCcgIDx0ZXN0Y2FzZSBjbGFzc25hbWU9IiUoY2xhc3MpcyIgbmFtZT0iJShtZXRob2QpcyIgdGltZT0iJSh0aW1lKS40ZiI+JyAlIFwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY2xhc3MiOiBzZWxmLl9jbGFzcywKKyAgICAgICAgICAgICAgICAibWV0aG9kIjogc2VsZi5fbWV0aG9kLAorICAgICAgICAgICAgICAgICJ0aW1lIjogc2VsZi5fdGltZSwKKyAgICAgICAgICAgIH0pCisgICAgICAgIGlmIHNlbGYuX2ZhaWx1cmUgIT0gTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2Vycm9yKHN0cmVhbSwgJ2ZhaWx1cmUnLCBzZWxmLl9mYWlsdXJlKQorICAgICAgICBpZiBzZWxmLl9lcnJvciAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5fcHJpbnRfZXJyb3Ioc3RyZWFtLCAnZXJyb3InLCBzZWxmLl9lcnJvcikKKyAgICAgICAgc3RyZWFtLndyaXRlKCc8L3Rlc3RjYXNlPlxuJykKKworICAgIGRlZiBfcHJpbnRfZXJyb3Ioc2VsZiwgc3RyZWFtLCB0YWduYW1lLCBlcnJvcik6CisgICAgICAgICIiIlByaW50IGluZm9ybWF0aW9uIGZyb20gYSBmYWlsdXJlIG9yIGVycm9yIHRvIHRoZSBzdXBwbGllZCBzdHJlYW0uIiIiCisgICAgICAgIHRleHQgPSBlc2NhcGUoc3RyKGVycm9yWzFdKSkKKyAgICAgICAgc3RyZWFtLndyaXRlKCdcbicpCisgICAgICAgIHN0cmVhbS53cml0ZSgnICAgIDwlcyB0eXBlPSIlcyI+JXNcbicgXAorICAgICAgICAgICAgJSAodGFnbmFtZSwgc3RyKGVycm9yWzBdKSwgdGV4dCkpCisgICAgICAgIHRiX3N0cmVhbSA9IFN0cmluZ0lPKCkKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X3RiKGVycm9yWzJdLCBOb25lLCB0Yl9zdHJlYW0pCisgICAgICAgIHN0cmVhbS53cml0ZShlc2NhcGUodGJfc3RyZWFtLmdldHZhbHVlKCkpKQorICAgICAgICBzdHJlYW0ud3JpdGUoJyAgICA8LyVzPlxuJyAlIHRhZ25hbWUpCisgICAgICAgIHN0cmVhbS53cml0ZSgnICAnKQorCisKK2NsYXNzIF9YTUxUZXN0UmVzdWx0KHVuaXR0ZXN0LlRlc3RSZXN1bHQpOgorCisgICAgIiIiQSB0ZXN0IHJlc3VsdCBjbGFzcyB0aGF0IHN0b3JlcyByZXN1bHQgYXMgWE1MLgorCisgICAgVXNlZCBieSBYTUxUZXN0UnVubmVyLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2xhc3NuYW1lKToKKyAgICAgICAgdW5pdHRlc3QuVGVzdFJlc3VsdC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl90ZXN0X25hbWUgPSBjbGFzc25hbWUKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBzZWxmLl9lcnJvciA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmFpbHVyZSA9IE5vbmUKKworICAgIGRlZiBzdGFydFRlc3Qoc2VsZiwgdGVzdCk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RSZXN1bHQuc3RhcnRUZXN0KHNlbGYsIHRlc3QpCisgICAgICAgIHNlbGYuX2Vycm9yID0gTm9uZQorICAgICAgICBzZWxmLl9mYWlsdXJlID0gTm9uZQorICAgICAgICBzZWxmLl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIGRlZiBzdG9wVGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgdGltZV90YWtlbiA9IHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZQorICAgICAgICB1bml0dGVzdC5UZXN0UmVzdWx0LnN0b3BUZXN0KHNlbGYsIHRlc3QpCisgICAgICAgIGlmIHNlbGYuX2Vycm9yOgorICAgICAgICAgICAgaW5mbyA9IF9UZXN0SW5mby5jcmVhdGVfZXJyb3IodGVzdCwgdGltZV90YWtlbiwgc2VsZi5fZXJyb3IpCisgICAgICAgIGVsaWYgc2VsZi5fZmFpbHVyZToKKyAgICAgICAgICAgIGluZm8gPSBfVGVzdEluZm8uY3JlYXRlX2ZhaWx1cmUodGVzdCwgdGltZV90YWtlbiwgc2VsZi5fZmFpbHVyZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZm8gPSBfVGVzdEluZm8uY3JlYXRlX3N1Y2Nlc3ModGVzdCwgdGltZV90YWtlbikKKyAgICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKGluZm8pCisKKyAgICBkZWYgYWRkRXJyb3Ioc2VsZiwgdGVzdCwgZXJyKToKKyAgICAgICAgdW5pdHRlc3QuVGVzdFJlc3VsdC5hZGRFcnJvcihzZWxmLCB0ZXN0LCBlcnIpCisgICAgICAgIHNlbGYuX2Vycm9yID0gZXJyCisKKyAgICBkZWYgYWRkRmFpbHVyZShzZWxmLCB0ZXN0LCBlcnIpOgorICAgICAgICB1bml0dGVzdC5UZXN0UmVzdWx0LmFkZEZhaWx1cmUoc2VsZiwgdGVzdCwgZXJyKQorICAgICAgICBzZWxmLl9mYWlsdXJlID0gZXJyCisKKyAgICBkZWYgcHJpbnRfcmVwb3J0KHNlbGYsIHN0cmVhbSwgdGltZV90YWtlbiwgb3V0LCBlcnIpOgorICAgICAgICAiIiJQcmludHMgdGhlIFhNTCByZXBvcnQgdG8gdGhlIHN1cHBsaWVkIHN0cmVhbS4KKyAgICAgICAgCisgICAgICAgIFRoZSB0aW1lIHRoZSB0ZXN0cyB0b29rIHRvIHBlcmZvcm0gYXMgd2VsbCBhcyB0aGUgY2FwdHVyZWQgc3RhbmRhcmQKKyAgICAgICAgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBzdHJlYW1zIG11c3QgYmUgcGFzc2VkIGluLmEKKworICAgICAgICAiIiIKKyAgICAgICAgc3RyZWFtLndyaXRlKCc8dGVzdHN1aXRlIGVycm9ycz0iJShlKWQiIGZhaWx1cmVzPSIlKGYpZCIgJyAlIFwKKyAgICAgICAgICAgIHsgImUiOiBsZW4oc2VsZi5lcnJvcnMpLCAiZiI6IGxlbihzZWxmLmZhaWx1cmVzKSB9KQorICAgICAgICBzdHJlYW0ud3JpdGUoJ25hbWU9IiUobilzIiB0ZXN0cz0iJSh0KWQiIHRpbWU9IiUodGltZSkuM2YiPlxuJyAlIFwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAibiI6IHNlbGYuX3Rlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAidCI6IHNlbGYudGVzdHNSdW4sCisgICAgICAgICAgICAgICAgInRpbWUiOiB0aW1lX3Rha2VuLAorICAgICAgICAgICAgfSkKKyAgICAgICAgZm9yIGluZm8gaW4gc2VsZi5fdGVzdHM6CisgICAgICAgICAgICBpbmZvLnByaW50X3JlcG9ydChzdHJlYW0pCisgICAgICAgIHN0cmVhbS53cml0ZSgnICA8c3lzdGVtLW91dD48IVtDREFUQVslc11dPjwvc3lzdGVtLW91dD5cbicgJSBvdXQpCisgICAgICAgIHN0cmVhbS53cml0ZSgnICA8c3lzdGVtLWVycj48IVtDREFUQVslc11dPjwvc3lzdGVtLWVycj5cbicgJSBlcnIpCisgICAgICAgIHN0cmVhbS53cml0ZSgnPC90ZXN0c3VpdGU+XG4nKQorCisKK2NsYXNzIFhNTFRlc3RSdW5uZXIob2JqZWN0KToKKworICAgICIiIkEgdGVzdCBydW5uZXIgdGhhdCBzdG9yZXMgcmVzdWx0cyBpbiBYTUwgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBKVW5pdC4KKworICAgIFhNTFRlc3RSdW5uZXIoc3RyZWFtPU5vbmUpIC0+IFhNTCB0ZXN0IHJ1bm5lcgorCisgICAgVGhlIFhNTCBmaWxlIGlzIHdyaXR0ZW4gdG8gdGhlIHN1cHBsaWVkIHN0cmVhbS4gSWYgc3RyZWFtIGlzIE5vbmUsIHRoZQorICAgIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBhIGZpbGUgY2FsbGVkIFRFU1QtPG1vZHVsZT4uPGNsYXNzPi54bWwgaW4gdGhlCisgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAoaWYgbm90IG92ZXJyaWRkZW4gd2l0aCB0aGUgcGF0aCBwcm9wZXJ0eSksCisgICAgd2hlcmUgPG1vZHVsZT4gYW5kIDxjbGFzcz4gYXJlIHRoZSBtb2R1bGUgYW5kIGNsYXNzIG5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW09Tm9uZSk6CisgICAgICAgIHNlbGYuX3N0cmVhbSA9IHN0cmVhbQorICAgICAgICBzZWxmLl9wYXRoID0gIi4iCisKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QpOgorICAgICAgICAiIiJSdW4gdGhlIGdpdmVuIHRlc3QgY2FzZSBvciB0ZXN0IHN1aXRlLiIiIgorICAgICAgICBjbGFzc18gPSB0ZXN0Ll9fY2xhc3NfXworICAgICAgICBjbGFzc25hbWUgPSBjbGFzc18uX19tb2R1bGVfXyArICIuIiArIGNsYXNzXy5fX25hbWVfXworICAgICAgICBpZiBzZWxmLl9zdHJlYW0gPT0gTm9uZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIlRFU1QtJXMueG1sIiAlIGNsYXNzbmFtZQorICAgICAgICAgICAgc3RyZWFtID0gZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZmlsZW5hbWUpLCAidyIpCisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyZWFtID0gc2VsZi5fc3RyZWFtCisKKyAgICAgICAgcmVzdWx0ID0gX1hNTFRlc3RSZXN1bHQoY2xhc3NuYW1lKQorICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgICAgICAjIFRPRE86IFB5dGhvbiAyLjU6IFVzZSB0aGUgd2l0aCBzdGF0ZW1lbnQKKyAgICAgICAgb2xkX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgb2xkX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgc3lzLnN0ZG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc3lzLnN0ZGVyciA9IFN0cmluZ0lPKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvdXRfcyA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIG91dF9zID0gIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBlcnJfcyA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGVycl9zID0gIiIKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRfc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gb2xkX3N0ZGVycgorCisgICAgICAgIHRpbWVfdGFrZW4gPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKKyAgICAgICAgcmVzdWx0LnByaW50X3JlcG9ydChzdHJlYW0sIHRpbWVfdGFrZW4sIG91dF9zLCBlcnJfcykKKyAgICAgICAgaWYgc2VsZi5fc3RyZWFtID09IE5vbmU6CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfc2V0X3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIHNlbGYuX3BhdGggPSBwYXRoCisKKyAgICBwYXRoID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX3BhdGgsIF9zZXRfcGF0aCwgTm9uZSwKKyAgICAgICAgICAgICIiIlRoZSBwYXRoIHdoZXJlIHRoZSBYTUwgZmlsZXMgYXJlIHN0b3JlZC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVGhpcyBwcm9wZXJ0eSBpcyBpZ25vcmVkIHdoZW4gdGhlIFhNTCBmaWxlIGlzIHdyaXR0ZW4gdG8gYSBmaWxlCisgICAgICAgICAgICBzdHJlYW0uIiIiKQorCisKK2NsYXNzIFhNTFRlc3RSdW5uZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3N0cmVhbSA9IFN0cmluZ0lPKCkKKworICAgIGRlZiBfdHJ5X3Rlc3RfcnVuKHNlbGYsIHRlc3RfY2xhc3MsIGV4cGVjdGVkKToKKworICAgICAgICAiIiJSdW4gdGhlIHRlc3Qgc3VpdGUgYWdhaW5zdCB0aGUgc3VwcGxpZWQgdGVzdCBjbGFzcyBhbmQgY29tcGFyZSB0aGUKKyAgICAgICAgWE1MIHJlc3VsdCBhZ2FpbnN0IHRoZSBleHBlY3RlZCBYTUwgc3RyaW5nLiBGYWlsIGlmIHRoZSBleHBlY3RlZAorICAgICAgICBzdHJpbmcgZG9lc24ndCBtYXRjaCB0aGUgYWN0dWFsIHN0cmluZy4gQWxsIHRpbWUgYXR0cmlidXRlIGluIHRoZQorICAgICAgICBleHBlY3RlZCBzdHJpbmcgc2hvdWxkIGhhdmUgdGhlIHZhbHVlICIwLjAwMCIuIEFsbCBlcnJvciBhbmQgZmFpbHVyZQorICAgICAgICBtZXNzYWdlcyBhcmUgcmVkdWNlZCB0byAiRm9vYmFyIi4KKworICAgICAgICAiIiIKKworICAgICAgICBydW5uZXIgPSBYTUxUZXN0UnVubmVyKHNlbGYuX3N0cmVhbSkKKyAgICAgICAgcnVubmVyLnJ1bih1bml0dGVzdC5tYWtlU3VpdGUodGVzdF9jbGFzcykpCisKKyAgICAgICAgZ290ID0gc2VsZi5fc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgIyBSZXBsYWNlIGFsbCB0aW1lPSJYLllZWSIgYXR0cmlidXRlcyBieSB0aW1lPSIwLjAwMCIgdG8gZW5hYmxlIGEKKyAgICAgICAgIyBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uCisgICAgICAgIGdvdCA9IHJlLnN1YihyJ3RpbWU9IlxkK1wuXGQrIicsICd0aW1lPSIwLjAwMCInLCBnb3QpCisgICAgICAgICMgTGlrZXdpc2UsIHJlcGxhY2UgYWxsIGZhaWx1cmUgYW5kIGVycm9yIG1lc3NhZ2VzIGJ5IGEgc2ltcGxlICJGb29iYXIiCisgICAgICAgICMgc3RyaW5nLgorICAgICAgICBnb3QgPSByZS5zdWIocicoP3MpPGZhaWx1cmUgKC4qPyk+Lio/PC9mYWlsdXJlPicsIHInPGZhaWx1cmUgXDE+Rm9vYmFyPC9mYWlsdXJlPicsIGdvdCkKKyAgICAgICAgZ290ID0gcmUuc3ViKHInKD9zKTxlcnJvciAoLio/KT4uKj88L2Vycm9yPicsIHInPGVycm9yIFwxPkZvb2JhcjwvZXJyb3I+JywgZ290KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgIGRlZiB0ZXN0X25vX3Rlc3RzKHNlbGYpOgorICAgICAgICAiIiJSZWdyZXNzaW9uIHRlc3Q6IENoZWNrIHdoZXRoZXIgYSB0ZXN0IHJ1biB3aXRob3V0IGFueSB0ZXN0cworICAgICAgICBtYXRjaGVzIGEgcHJldmlvdXMgcnVuLgorICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIFRlc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fdHJ5X3Rlc3RfcnVuKFRlc3RUZXN0LCAiIiI8dGVzdHN1aXRlIGVycm9ycz0iMCIgZmFpbHVyZXM9IjAiIG5hbWU9InVuaXR0ZXN0LlRlc3RTdWl0ZSIgdGVzdHM9IjAiIHRpbWU9IjAuMDAwIj4KKyAgPHN5c3RlbS1vdXQ+PCFbQ0RBVEFbXV0+PC9zeXN0ZW0tb3V0PgorICA8c3lzdGVtLWVycj48IVtDREFUQVtdXT48L3N5c3RlbS1lcnI+Cis8L3Rlc3RzdWl0ZT4KKyIiIikKKworICAgIGRlZiB0ZXN0X3N1Y2Nlc3Moc2VsZik6CisgICAgICAgICIiIlJlZ3Jlc3Npb24gdGVzdDogQ2hlY2sgd2hldGhlciBhIHRlc3QgcnVuIHdpdGggYSBzdWNjZXNzZnVsIHRlc3QKKyAgICAgICAgbWF0Y2hlcyBhIHByZXZpb3VzIHJ1bi4KKyAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBUZXN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9mb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl90cnlfdGVzdF9ydW4oVGVzdFRlc3QsICIiIjx0ZXN0c3VpdGUgZXJyb3JzPSIwIiBmYWlsdXJlcz0iMCIgbmFtZT0idW5pdHRlc3QuVGVzdFN1aXRlIiB0ZXN0cz0iMSIgdGltZT0iMC4wMDAiPgorICA8dGVzdGNhc2UgY2xhc3NuYW1lPSJfX21haW5fXy5UZXN0VGVzdCIgbmFtZT0idGVzdF9mb28iIHRpbWU9IjAuMDAwIj48L3Rlc3RjYXNlPgorICA8c3lzdGVtLW91dD48IVtDREFUQVtdXT48L3N5c3RlbS1vdXQ+CisgIDxzeXN0ZW0tZXJyPjwhW0NEQVRBW11dPjwvc3lzdGVtLWVycj4KKzwvdGVzdHN1aXRlPgorIiIiKQorCisgICAgZGVmIHRlc3RfZmFpbHVyZShzZWxmKToKKyAgICAgICAgIiIiUmVncmVzc2lvbiB0ZXN0OiBDaGVjayB3aGV0aGVyIGEgdGVzdCBydW4gd2l0aCBhIGZhaWxpbmcgdGVzdAorICAgICAgICBtYXRjaGVzIGEgcHJldmlvdXMgcnVuLgorICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIFRlc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oRmFsc2UpCisgICAgICAgIHNlbGYuX3RyeV90ZXN0X3J1bihUZXN0VGVzdCwgIiIiPHRlc3RzdWl0ZSBlcnJvcnM9IjAiIGZhaWx1cmVzPSIxIiBuYW1lPSJ1bml0dGVzdC5UZXN0U3VpdGUiIHRlc3RzPSIxIiB0aW1lPSIwLjAwMCI+CisgIDx0ZXN0Y2FzZSBjbGFzc25hbWU9Il9fbWFpbl9fLlRlc3RUZXN0IiBuYW1lPSJ0ZXN0X2ZvbyIgdGltZT0iMC4wMDAiPgorICAgIDxmYWlsdXJlIHR5cGU9ImV4Y2VwdGlvbnMuQXNzZXJ0aW9uRXJyb3IiPkZvb2JhcjwvZmFpbHVyZT4KKyAgPC90ZXN0Y2FzZT4KKyAgPHN5c3RlbS1vdXQ+PCFbQ0RBVEFbXV0+PC9zeXN0ZW0tb3V0PgorICA8c3lzdGVtLWVycj48IVtDREFUQVtdXT48L3N5c3RlbS1lcnI+Cis8L3Rlc3RzdWl0ZT4KKyIiIikKKworICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorICAgICAgICAiIiJSZWdyZXNzaW9uIHRlc3Q6IENoZWNrIHdoZXRoZXIgYSB0ZXN0IHJ1biB3aXRoIGEgZXJyb25lb3VzIHRlc3QKKyAgICAgICAgbWF0Y2hlcyBhIHByZXZpb3VzIHJ1bi4KKyAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBUZXN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9mb28oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcigpCisgICAgICAgIHNlbGYuX3RyeV90ZXN0X3J1bihUZXN0VGVzdCwgIiIiPHRlc3RzdWl0ZSBlcnJvcnM9IjEiIGZhaWx1cmVzPSIwIiBuYW1lPSJ1bml0dGVzdC5UZXN0U3VpdGUiIHRlc3RzPSIxIiB0aW1lPSIwLjAwMCI+CisgIDx0ZXN0Y2FzZSBjbGFzc25hbWU9Il9fbWFpbl9fLlRlc3RUZXN0IiBuYW1lPSJ0ZXN0X2ZvbyIgdGltZT0iMC4wMDAiPgorICAgIDxlcnJvciB0eXBlPSJleGNlcHRpb25zLkluZGV4RXJyb3IiPkZvb2JhcjwvZXJyb3I+CisgIDwvdGVzdGNhc2U+CisgIDxzeXN0ZW0tb3V0PjwhW0NEQVRBW11dPjwvc3lzdGVtLW91dD4KKyAgPHN5c3RlbS1lcnI+PCFbQ0RBVEFbXV0+PC9zeXN0ZW0tZXJyPgorPC90ZXN0c3VpdGU+CisiIiIpCisKKyAgICBkZWYgdGVzdF9zdGRvdXRfY2FwdHVyZShzZWxmKToKKyAgICAgICAgIiIiUmVncmVzc2lvbiB0ZXN0OiBDaGVjayB3aGV0aGVyIGEgdGVzdCBydW4gd2l0aCBvdXRwdXQgdG8gc3Rkb3V0CisgICAgICAgIG1hdGNoZXMgYSBwcmV2aW91cyBydW4uCisgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgVGVzdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHByaW50ICJUZXN0IgorICAgICAgICBzZWxmLl90cnlfdGVzdF9ydW4oVGVzdFRlc3QsICIiIjx0ZXN0c3VpdGUgZXJyb3JzPSIwIiBmYWlsdXJlcz0iMCIgbmFtZT0idW5pdHRlc3QuVGVzdFN1aXRlIiB0ZXN0cz0iMSIgdGltZT0iMC4wMDAiPgorICA8dGVzdGNhc2UgY2xhc3NuYW1lPSJfX21haW5fXy5UZXN0VGVzdCIgbmFtZT0idGVzdF9mb28iIHRpbWU9IjAuMDAwIj48L3Rlc3RjYXNlPgorICA8c3lzdGVtLW91dD48IVtDREFUQVtUZXN0CitdXT48L3N5c3RlbS1vdXQ+CisgIDxzeXN0ZW0tZXJyPjwhW0NEQVRBW11dPjwvc3lzdGVtLWVycj4KKzwvdGVzdHN1aXRlPgorIiIiKQorCisgICAgZGVmIHRlc3Rfc3RkZXJyX2NhcHR1cmUoc2VsZik6CisgICAgICAgICIiIlJlZ3Jlc3Npb24gdGVzdDogQ2hlY2sgd2hldGhlciBhIHRlc3QgcnVuIHdpdGggb3V0cHV0IHRvIHN0ZGVycgorICAgICAgICBtYXRjaGVzIGEgcHJldmlvdXMgcnVuLgorICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIFRlc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJUZXN0IgorICAgICAgICBzZWxmLl90cnlfdGVzdF9ydW4oVGVzdFRlc3QsICIiIjx0ZXN0c3VpdGUgZXJyb3JzPSIwIiBmYWlsdXJlcz0iMCIgbmFtZT0idW5pdHRlc3QuVGVzdFN1aXRlIiB0ZXN0cz0iMSIgdGltZT0iMC4wMDAiPgorICA8dGVzdGNhc2UgY2xhc3NuYW1lPSJfX21haW5fXy5UZXN0VGVzdCIgbmFtZT0idGVzdF9mb28iIHRpbWU9IjAuMDAwIj48L3Rlc3RjYXNlPgorICA8c3lzdGVtLW91dD48IVtDREFUQVtdXT48L3N5c3RlbS1vdXQ+CisgIDxzeXN0ZW0tZXJyPjwhW0NEQVRBW1Rlc3QKK11dPjwvc3lzdGVtLWVycj4KKzwvdGVzdHN1aXRlPgorIiIiKQorCisgICAgY2xhc3MgTnVsbFN0cmVhbShvYmplY3QpOgorICAgICAgICAiIiJBIGZpbGUtbGlrZSBvYmplY3QgdGhhdCBkaXNjYXJkcyBldmVyeXRoaW5nIHdyaXR0ZW4gdG8gaXQuIiIiCisgICAgICAgIGRlZiB3cml0ZShzZWxmLCBidWZmZXIpOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfdW5pdHRlc3RzX2NoYW5naW5nX3N0ZG91dChzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgWE1MVGVzdFJ1bm5lciByZWNvdmVycyBncmFjZWZ1bGx5IGZyb20gdW5pdCB0ZXN0cworICAgICAgICB0aGF0IGNoYW5nZSBzdGRvdXQsIGJ1dCBkb24ndCBjaGFuZ2UgaXQgYmFjayBwcm9wZXJseS4KKworICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgVGVzdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBYTUxUZXN0UnVubmVyVGVzdC5OdWxsU3RyZWFtKCkKKworICAgICAgICBydW5uZXIgPSBYTUxUZXN0UnVubmVyKHNlbGYuX3N0cmVhbSkKKyAgICAgICAgcnVubmVyLnJ1bih1bml0dGVzdC5tYWtlU3VpdGUoVGVzdFRlc3QpKQorCisgICAgZGVmIHRlc3RfdW5pdHRlc3RzX2NoYW5naW5nX3N0ZGVycihzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgWE1MVGVzdFJ1bm5lciByZWNvdmVycyBncmFjZWZ1bGx5IGZyb20gdW5pdCB0ZXN0cworICAgICAgICB0aGF0IGNoYW5nZSBzdGRlcnIsIGJ1dCBkb24ndCBjaGFuZ2UgaXQgYmFjayBwcm9wZXJseS4KKworICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgVGVzdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBYTUxUZXN0UnVubmVyVGVzdC5OdWxsU3RyZWFtKCkKKworICAgICAgICBydW5uZXIgPSBYTUxUZXN0UnVubmVyKHNlbGYuX3N0cmVhbSkKKyAgICAgICAgcnVubmVyLnJ1bih1bml0dGVzdC5tYWtlU3VpdGUoVGVzdFRlc3QpKQorCisKK2NsYXNzIFhNTFRlc3RQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKKyAgICBkZWYgcnVuVGVzdHMoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGVzdFJ1bm5lciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXN0UnVubmVyID0gWE1MVGVzdFJ1bm5lcigpCisgICAgICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtLnJ1blRlc3RzKHNlbGYpCisKK21haW4gPSBYTUxUZXN0UHJvZ3JhbQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbihtb2R1bGU9Tm9uZSkKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvQU5UTFItTElDRU5TRS50eHQgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L0FOVExSLUxJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZTA0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L0FOVExSLUxJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjYgQEAKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwMy0yMDA4IFRlcmVuY2UgUGFycgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L0hpc3RvcnkudHh0IGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9IaXN0b3J5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBiMjhmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9IaXN0b3J5LnR4dApAQCAtMCwwICsxLDE0OSBAQAorPT09IDEuOC41IC8gMTAtMjEtMTAKKworKiAxIEJ1ZyBGaXgKKyAgLSBmaXhlZCBBTlRMUjM6OkludGVyYWN0aXZlU3RyaW5nU3RyZWFtIHRvIHdvcmsgd2l0aCBSdWJ5IDEuOS4gVGhlIGxleGVyIG1haW4gc2NyaXB0CisgICAgc2hvdWxkIGZ1bmN0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgZm9yIFJ1YnkgMS45IG5vdy4KKworPT09IDEuOC40IC8gMTAtMDgtMTAKKworKiAxIEJ1ZyBGaXgKKyAgLSByZW1vdmVkIGRpcmVjdG9yeSBkZXBlbmRlbmN5IGZyb20gdGFza3MgY3JlYXRlZCBieSBBTlRMUjM6OlRhc2ssIHdoaWNoIGNhdXNlZAorICAgIGNvbXBpbGF0aW9uIHRvIGJlIHBlcmZvcm1lZCB0d2ljZSBpbiBzb21lIHNpdHVhdGlvbnMKKworPT09IDEuOC4zIC8gMTAtMDgtMTAKKworKiAyIEJ1ZyBGaXhlcworICAtIGZpeGVkIHR5cG8gaW4gVG9rZW5SZXdyaXRlU3RyZWFtI2Nhc3RfcmFuZ2UKKyAgLSBhZGRlZCB3b3JrLWFyb3VuZCBjb2RlIHRvIGhhbmRsZSB0aGUgbGFjayBvZiBzdXBwb3J0IGZvciBTdG9wSXRlcmF0aW9uIGluIFJ1YmluaXVzCisKKz09PSAxLjguMiAvIDEwLTAyLTEwCisKKyogQnVnIEZpeDogcmVtb3ZlZCByZWZlcmVuY2VzIHRvIFBhcnNlciN0b2tlbl9zdHJlYW0KKyAgLSBjaGFuZ2VkIHJlZmVyZW5jZXMgdG8gUGFyc2VyI3Rva2VuX3N0cmVhbSB0byBQYXJzZXIjaW5wdXQgaW4gYGFudGxyMy9wcm9maWxlLnJiJyB0bworICAgIGF2b2lkICJwcml2YXRlIG1ldGhvZCB0b2tlbl9zdHJlYW0gY2FsbGVkIiBlcnJvcnMgaW4gcHJvZmlsZSBtb2RlCisKKyogTWlub3IgRW5oYW5jZW1lbnQ6IG5ldyBzYW1wbGVzIGluY2x1ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgorICAtIGFkZGVkIGEgbmV3bHkgZGV2ZWxvcGVkIGBzYW1wbGVzL0phdmFTY3JpcHQuZycgZmlsZSBmb3IgcGFyc2luZyBKYXZhU2NyaXB0LgorICAgIFdoaWxlIG5vdCBlbnRpcmVseSBjb21wbGV0ZSBhbmQgZmxhd2xlc3MsIGl0IGRvZXMgYSBwcmV0dHkgZ29vZCBqb2IKKyAgICBvZiBwYXJzaW5nIEphdmFTY3JpcHQgdXAgdGhyb3VnaCBGaXJlZm94J3MgMS42IHZlcnNpb24gb2YgdGhlIGxhbmd1YWdlLgorICAtIGluY2x1ZGVkIHRoZSBgc2FtcGxlcy9zdGFuZGFyZCcgZGlyZWN0b3J5IHdpdGggdGhlIHBhY2thZ2UgZGlzdHJpYnV0aW9uLAorICAgIHdoaWNoIGhhcyBiZWVuIGluIHRoZSBkZXZlbG9wbWVudCByZXBvc2l0b3J5IGZvciBhIHdoaWxlLCBidXQgSSBuZXZlcgorICAgIHVwZGF0ZWQgdGhlIHBhY2thZ2Ugc3BlYyB0byBpbmNsdWRlIHRoZXNlIGZpbGVzLgorCis9PT0gMS44LjAgLyAwNy0wMy0xMAorCisqIEJ1ZyBGaXggLyBNYWpvciBFbmhhbmNlbWVudDogbWFkZSBhbnRscjMgY29tcGF0aWJsZSB3aXRoIHJ1YnkgMS45CisgIC0gYWx0ZXJlZCBBTlRMUjM6OlN0cmluZ1N0cmVhbSB0byBhbHdheXMgaGF2ZSAjcGVlayByZXR1cm4gYW4gaW50ZWdlciBpbiBib3RoCisgICAgUnVieSAxLjggYW5kIDEuOS4gSW4gMS45LCBAZGF0YSBpcyBub3cgYW4gYXJyYXkgb2YgY29kZSBwb2ludCB2YWx1ZXMgYW5kCisgICAgdGhlIG5ldyBpbnN0YW5jZSB2YXJpYWJsZSBAc3RyaW5nIGNvbnRhaW5zIHRoZSBhY3R1YWwgc3RyaW5nLiBJbiBSdWJ5IDEuOCwKKyAgICBib3RoIEBkYXRhIGFuZCBAc3RyaW5nIGNvbnRhaW4gdGhlIHN0cmluZyB2YWx1ZS4KKyAgLSBsZXhlciBjb2RlIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQgdXNpbmcgJz9jJyBjaGFyYWN0ZXIgc3ludGF4OyBjaGFyYWN0ZXJzCisgICAgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBoZXhhZGVjaW1hbCBpbnRlZ2VycyB0byBtYWtlIHRoZSBjb2RlIGNvbXBhdGlibGUKKyAgICB3aXRoIFJ1YnkgMS45CisKKz09PSAxLjcuNSAvIDA2LTE4LTEwCisKKyogTWlub3IgRW5oYW5jZW1lbnRzCisgIC0gYWRkZWQgI2NvbXBpbGUhIGFuZCAjY2xvYmJlciEgbWV0aG9kcyB0byBkaXJlY3RseSBpbnZva2UgdGhlICdjb21waWxlJworICAgIGFuZCAnY2xvYmJlcicgdGFza3MgcmVzcGVjdGl2ZWx5CisgIAorKiBCdWcgRml4ZXMKKyAgLSByZW1vdmVkIHNwZWNpYWwgcnVieS1zdHlsaXN0aWMgZm9ybWF0dGluZyBvbiBzeW50YWN0aWMgcHJlZGljYXRlIG1ldGhvZCBuYW1lcyB0bworICAgIGZpeCBhIGJhZCBidWcgaW4gY29kZS1nZW5lcmF0aW9uIHRoYXQgY3JvcHBlZCB1cCBpbiBtb3JlIGNvbXBsZXggZ3JhbW1hcnMKKworPT09IDEuNy4yIC8gMDUtMTYtMTAKKworKiBNaW5vciBFbmhhbmNlbWVudHMKKyAgLSBhZGRlZCBuZXcgI2hvbGQgY29udmVuaWVuY2UgbWV0aG9kIHRvIEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0KKworKiBCdWcgRml4ZXMKKyAgLSBjb3JyZWN0ZWQgYSB0eXBvIGluIEFOVExSMzo6RXJyb3IjRmFpbGVkUHJlZGljYXRlIHdoaWNoIGNhdXNlZCBhCisgICAgTm9NZXRob2RFcnJvciB0byByYWlzZSBpbnN0ZWFkIG9mIEZhaWxlZFByZWRpY2F0ZSB3aGVuIHNlbWFudGljCisgICAgcHJlZGljYXRlcyBmYWlsZWQKKworKiBEb2N1bWVudGF0aW9uCisgIC0gYWRkZWQgbW9yZSBjb250ZW50IHRvIHRoZSBydWJ5IGFudGxyMyBndWlkZQorICAtIHNldCB1cCBhbiBvZmZpY2lhbCBwcm9qZWN0IHdlYnNpdGUgYXQKKyAgICBodHRwOi8vYW50bHIub2hib3lvaGJveW9oYm95Lm9yZworCis9PT0gMS43LjAgLyAwNC0yMC0xMAorCisqIE1pbm9yIEVuaGFuY2VtZW50cworICAtIGFkZGVkIG5ldyAjZWFjaF9vbl9jaGFubmVsIGFuZCAjd2FsayBjb252ZW5pZW5jZSBtZXRob2RzIHRvIEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0KKworKiBCdWcgRml4ZXMKKyAgLSBkaXNjb3ZlcmVkIGFuZCBmaXhlZCBhIHJhcmUgYnV0IHNlcmlvdXMgYnVnIGluIHRoZSB3YXkgdGhlIG91dHB1dCBjb2RlIGV2YWx1YXRlcworICAgIHN5bnRhY3RpYyBwcmVkaWNhdGVzCisKKyogRG9jdW1lbnRhdGlvbgorICAtIGJlZ2FuIGRldmVsb3BpbmcgYSBtb3JlIHRob3JvdWdoIHVzYWdlIGd1aWRlIGZvciB0aGUgcGFja2FnZQorICAtIHRoZSBndWlkZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9uIEdpdEh1YiBhdAorICAgIGh0dHA6Ly9vaGJveW9oYm95b2hib3kuZ2l0aHViLmNvbS9hbnRscjMKKworPT09IDEuNi4zIC8gMDItMTItMTAKKworKiA0IE1pbm9yIEVuaGFuY2VtZW50cworICAtIGFkZGVkIC0taGVscCBhbmQgLS12ZXJzaW9uIG9wdGlvbnMgdG8gYW50bHI0cnVieQorICAtIGRvY3VtZW50ZWQgdGhlIGFudGxyNHJ1Ynkgc291cmNlIGFuZCBhZGRlZCBsaWNlbnNlIGluZm9ybWF0aW9uCisgIC0gcHJldHRpZWQgdXAgdGhlIHNvdXJjZSBjb2RlIGluIGFsbCBvZiB0aGUgbGlicmFyeSBmaWxlcyBhIGxpdHRsZQorICAtIGFkZGVkIGEgaG9lLWJhc2VkIHJha2VmaWxlIHdpdGggdGhlIGdlbSBkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlCisKKz09PSAxLjYuMCAvIDAxLTI3LTEwCisKKyogNCBNaW5vciBFbmhhbmNlbWVudHMgdG8gcnVudGltZSBsaWJyYXJ5CisgIC0gQ29tbW9uVG9rZW5TdHJlYW0gYW5kIHN1YmNsYXNzZXMgY2FuIG5vdyBhbHNvIGFjY2VwdCBhbm90aGVyIENvbW1vblRva2VuU3RyZWFtCisgICAgb2JqZWN0LCBzZXJ2aW5nIHNvcnQgb2YgYXMgYSBjb3B5IGNvbnN0cnVjdG9yLiBUaGlzIHByb3ZpZGVzIGEgcmVhc29uYWJsZSB3YXkKKyAgICB0byBjYXN0IGEgQ29tbW9uVG9rZW5TdHJlYW0gaW50byBhIFRva2VuUmV3cml0ZVN0cmVhbSBhbmQgdmljZS12ZXJzYQorICAtIENvbW1vblRyZWVOb2RlU3RyZWFtIGNhbiB0YWtlIGFuIG9wdGlvbnMgaGFzaCBhdCB0aGUgZW5kIG9mIGFueSBvZiBpdHMgdmFyaW91cworICAgIHNpZ25hdHVyZXMgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIGF0dHJpYnV0ZXMgbGlrZSB0b2tlbl9zdHJlYW0KKyAgLSBJZiBhIHBhcnNlciBpcyBjcmVhdGVkIHdpdGggYSBDaGFyYWN0ZXJTdHJlYW0gb2JqZWN0IChpLmUuLCBTdHJpbmdTdHJlYW0pLCBpdAorICAgIHdpbGwgYWxzbyB0cnkgdG8gY2FzdCBpdCBieSBjaGVja2luZyBmb3IgYW4gYXNzb2NpYXRlZCBsZXhlciAobGlrZSBpdCBjdXJyZW50bHkKKyAgICBkb2VzIHdoZW4gY3JlYXRlZCB3aXRoIFN0cmluZyBvciBJTyBvYmplY3RzKS4KKyAgLSBUZW1wbGF0ZS1vdXRwdXQgbW9kZSBwYXJzZXJzIGhhdmUgYSBuZXcgY2xhc3MgbWV0aG9kICJsb2FkX3RlbXBsYXRlcyggcGF0aCApIgorICAgIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSB0ZW1wbGF0ZSBncm91cCBmaWxlIGF0ICtwYXRoKyBhbmQsIGlmIHN1Y2Nlc3NmdWwsCisgICAgc2V0IGl0IHRvIHRoZSBwYXJzZXIncyBkZWZhdWx0IHRlbXBsYXRlIGxpYnJhcnkuIChTZWUgdGhlIENNaW51cyBleGFtcGxlIHNldCBmb3IKKyAgICBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIGNhbiBiZSB1c2VkKQorCisqIDIgYnVnIGZpeGVzIC8gMSBjaGFuZ2UgdG8gdGVtcGxhdGVzCisgIC0gYmFja3RyYWNraW5nIHdhcyBicm9rZW4gaW4gc2l0dWF0aW9ucyB3aGVyZSByZWNvZ25pdGlvbiBmYWlsZWQgd2hlbgorICAgIGEgc2VtYW50aWMgcHJlZGljYXRlIHdhcyBlbmNvdW50ZXJlZCBhcyB0aGUgdGVtcGxhdGUgY29kZSBkaWQgbm90CisgICAgdGhyb3cgQmFja3RyYWNraW5nRmFpbGVkIHdoZW4gaXQgd2FzIGluIGJhY2t0cmFja2luZyBtb2RlIGluc3RlYWQgb2YKKyAgICBQcmVkaWNhdGVGYWlsZWQKKyAgLSBydWxlIG1lbW9pemF0aW9uIGFsc28gaGFkIGEgbWFqb3IgYnVnIGluIHRoYXQgcnVsZXMgdGhhdCB3ZXJlIG1lbW9pemVkCisgICAgYWZ0ZXIgZmFpbHVyZSBkaWQgbm90IHRocm93IEJhY2t0cmFja2luZ0ZhaWxlZCB3aGVuIGl0IHdhcyBuZWVkZWQKKyAgLSBJIGNoYW5nZWQgYGF0dHJpYnV0ZSBzY29wZScgc3RydWN0dXJlcyAobm90IHJ1bGUgcmV0dXJuIHNjb3BlcywgYnV0CisgICAgdGhlIGdyb3VwcyBvZiBhdHRyaWJ1dGVzIHlvdSBjYW4gYXNzaWduIHRvIHJ1bGVzIHdpdGggdGhlIGBzY29wZScga2V5d29yZCksCisgICAgZnJvbSBiZWluZyBpbXBsZW1lbnRlZCBhcyBuYW1lZCBjb25zdGFudHMgaW4gdGhlIGNsYXNzIGJvZHkgdG8gY2xhc3MKKyAgICB2YXJpYWJsZXMgYmVsb25naW5nIHRvIHRoZSByZWNvZ25pemVyLiBBcyBjbGFzcyB2YXJpYWJsZXMgZG8gbm90IG5lZWQKKyAgICB0byBmb2xsb3cgbmFtaW5nIGNvbnZlbnRpb25zLCB0aGlzIHByb3ZpZGVzIG1vcmUgZnJlZWRvbSBpbiBuYW1pbmcgd2l0aG91dAorICAgIGFsbCBvZiB0aGUgdWdseSBuYW1lIG1hbmdsaW5nLiBUaGVzZSBhcmUgZ2VuZXJhbGx5IHVzZWQgcHJpdmF0ZWx5IGJ5IHBhcnNlcnMsCisgICAgc28gaXQgc2hvdWxkbid0IGJlIHRvbyBkcmFzdGljIG9mIGEgY2hhbmdlIGFzIHRvIGJyZWFrIGVuZCB1c2VyJ3MgY29kZS4KKworPT09IDEuNS4wIC8gMDEtMjUtMTAKKworKiAyIG1pbm9yIGVuaGFuY2VtZW50cworICAtIEFkZGVkIEJhc2VUcmVlI3dhbGssIHdoaWNoIGl0ZXJhdGVzIGluIGEgdG9wLWRvd24gZmFzaGlvbiBhY3Jvc3MgYWxsIG5vdGVzIGluIGEgdHJlZS4KKyAgLSBBZGRlZCBCYXNlVHJlZSNwcnVuZSwgd2hpY2ggc3RvcHMgZGVjZW50IGludG8gdGhlIGN1cnJlbnQgbm9kZSBkdXJpbmcgQmFzZVRyZWUjd2Fsay4KKworKiAxIG9wdGltaXphdGlvbgorICAtIGNoYW5nZWQgYGNsb3N1cmUgbG9vcHMnICggdXNlcyBvZiB0aGUgYConIG9yIGArJyBtb2RpZmllcnMgKSBmcm9tIHVzaW5nCisgICAgS2VybmVsI2xvb3AgdG8gYHdoaWxlIHRydWUgLi4uIGVuZCcgc3R5bGUgbG9vcHMsIHdoaWNoIHNob3VsZCBiZSBzbGlnaHRseQorICAgIGZhc3RlcgorCisqIG5ldyB0ZXN0IGNvZGUKKyAgLSB0ZXN0L2Z1bmN0aW9uYS90ZW1wbGF0ZS1vdXRwdXQvdGVtcGxhdGUtb3V0cHV0LnJiIHNlcnZlcyBhcyBhIGJhc2ljCisgICAgZnVuY3Rpb25hbCB0ZXN0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgbmV3IHRlbXBsYXRlIG91dHB1dCBtb2RlCisKKz09PSAxLjQuMCAvIDAxLTE3LTEwCisKKyogMSBtYWpvciBuZXcgZmVhdHVyZQorICAtIGZpbmlzaGVkIGJhc2ljIGltcGxlbWVudGF0aW9uIG9mIGEgdGVtcGxhdGUgb3V0cHV0IG1vZGUuCisgIC0gbGliL2FudGxyMy90ZW1wbGF0ZS5yYiBkZWZpbmVzIGEgbnVtYmVyIG9mIGNsYXNzZXMgZm9yCisgICAgRVJCLWJhc2VkIHRlbXBsYXRlIG91dHB1dCB0cmFuc2xhdGlvbgorICAtIHRlbXBsYXRlcy9TVC5zdGcgZGVmaW5lcyB0aGUgUnVieSB0YXJnZXQgdGVtcGxhdGVzIHRvCisgICAgZ2VuZXJhdGUgdGVtcGxhdGUgb3V0cHV0IG1vZGUgcmVjb2duaXplcnMKKyAgICAKKyogbmV3IHRlc3QgY29kZQorICAtIGFkZGVkIHRlbXBsYXRlIHVuaXQgdGVzdHMgYXQgdGVzdC91bml0L3Rlc3QtdGVtcGxhdGUucmIKKyAgLSB0ZXN0L2Z1bmN0aW9uYWwvdGVtcGxhdGUtb3V0cHV0L3RlbXBsYXRlLW91dHB1dC5yYiBzZXJ2ZXMgYXMgYSBiYXNpYworICAgIGZ1bmN0aW9uYWwgdGVzdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG5ldyB0ZW1wbGF0ZSBvdXRwdXQgbW9kZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9SRUFETUUudHh0IGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0M2Q0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L1JFQURNRS50eHQKQEAgLTAsMCArMSwxMzIgQEAKK0FOVExSIDMgZm9yIFJ1YnkKKyAgICBieSBLeWxlIFlldHRlciAoa2N5NWJAeWFob28uY29tKQorICAgIGh0dHA6Ly9hbnRsci5vaGJveW9oYm95b2hib3kub3JnCisgICAgaHR0cDovL2dpdGh1Yi5jb20vb2hib3lvaGJveW9oYm95L2FudGxyMworCis9PSBERVNDUklQVElPTjoKKworRnVsbHktZmVhdHVyZWQgQU5UTFIgMyBwYXJzZXIgZ2VuZXJhdGlvbiBmb3IgUnVieS4KKworQU5UTFIgKEFOb3RoZXIgVG9vbCBmb3IgTGFuZ3VhZ2UgUmVjb2duaXRpb24pIGlzIGEgdG9vbCB0aGF0IGlzIHVzZWQgdG8gZ2VuZXJhdGUKK2NvZGUgZm9yIHBlcmZvcm1pbmcgYSB2YXJpZXR5IG9mIGxhbmd1YWdlIHJlY29nbml0aW9uIHRhc2tzOiBsZXhpbmcsIHBhcnNpbmcsCithYnN0cmFjdCBzeW50YXggdHJlZSBjb25zdHJ1Y3Rpb24gYW5kIG1hbmlwdWxhdGlvbiwgdHJlZSBzdHJ1Y3R1cmUgcmVjb2duaXRpb24sCithbmQgaW5wdXQgdHJhbnNsYXRpb24uIFRoZSB0b29sIG9wZXJhdGVzIHNpbWlsYXJseSB0byBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycywKK3Rha2luZyBpbiBhIGdyYW1tYXIgc3BlY2lmaWNhdGlvbiB3cml0dGVuIGluIHRoZSBzcGVjaWFsIEFOVExSIG1ldGFsYW5ndWFnZSBhbmQKK3Byb2R1Y2luZyBzb3VyY2UgY29kZSB0aGF0IGltcGxlbWVudHMgdGhlIHJlY29nbml0aW9uIGZ1bmN0aW9uYWxpdHkuCisKK1doaWxlIHRoZSB0b29sIGl0c2VsZiBpcyBpbXBsZW1lbnRlZCBpbiBKYXZhLCBpdCBoYXMgYW4gZXh0ZW5zaWJsZSBkZXNpZ24gdGhhdAorYWxsb3dzIGZvciBjb2RlIGdlbmVyYXRpb24gaW4gb3RoZXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBUbyBpbXBsZW1lbnQgYW4KK0FOVExSIGxhbmd1YWdlIHRhcmdldCwgYSBkZXZlbG9wZXIgbWF5IHN1cHBseSBhIHNldCBvZiB0ZW1wbGF0ZXMgd3JpdHRlbiBpbiB0aGUKK1N0cmluZ1RlbXBsYXRlIChodHRwOi8vd3d3LnN0cmluZ3RlbXBsYXRlLm9yZykgbGFuZ3VhZ2UuCisKK0FOVExSIGlzIGN1cnJlbnRseSBkaXN0cmlidXRlZCB3aXRoIGEgZmFpcmx5IGxpbWl0ZWQgUnVieSB0YXJnZXQgaW1wbGVtZW50YXRpb24uCitXaGlsZSBpdCBkb2VzIHByb3ZpZGUgaW1wbGVtZW50YXRpb24gZm9yIGJhc2ljIGxleGVyIGFuZCBwYXJzZXIgY2xhc3NlcywgdGhlCit0YXJnZXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgaW1wbGVtZW50YXRpb24gZm9yIGFic3RyYWN0IHN5bnRheCB0cmVlCitjb25zdHJ1Y3Rpb24sIHRyZWUgcGFyc2VyIGNsYXNzIGdlbmVyYXRpb24sIGlucHV0IHRyYW5zbGF0aW9uLCBvciBhIG51bWJlciBvZgordGhlIG90aGVyIEFOVExSIGZlYXR1cmVzIHRoYXQgZ2l2ZSB0aGUgcHJvZ3JhbSBhbiBlZGdlIG92ZXIgdHJhZGl0aW9uYWwgY29kZQorZ2VuZXJhdG9ycy4KKworVGhpcyBnZW0gcGFja2FnZXMgdG9nZXRoZXIgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWFqb3JpdHkgb2YgZmVhdHVyZXMKK0FOVExSIHByb3ZpZGVzIGZvciBvdGhlciBsYW5ndWFnZSB0YXJnZXRzLCBzdWNoIGFzIEphdmEgYW5kIFB5dGhvbi4gSXQgY29udGFpbnM6CisKKyogQSBjdXN0b21pemVkIHZlcnNpb24gb2YgdGhlIGxhdGVzdCBBTlRMUiBwcm9ncmFtLCBidW5kbGluZyBhbGwgbmVjZXNzYXJ5CisgIGphdmEgY29kZSBhbmQgdGVtcGxhdGVzIGZvciBwcm9kdWNpbmcgZnVsbHkgZmVhdHVyZWQgbGFuZ3VhZ2UgcmVjb2duaXRpb24KKyAgaW4gcnVieSBjb2RlCisKKyogYSBydWJ5IHJ1bi10aW1lIGxpYnJhcnkgdGhhdCBjb2xsZWN0cyBjbGFzc2VzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29kZSB0aGF0CisgIEFOVExSIGdlbmVyYXRlcworICAKKyogYSB3cmFwcGVyIHNjcmlwdCwgYGFudGxyNHJ1YnknLCB3aGljaCBleGVjdXRlcyB0aGUgQU5UTFIgY29tbWFuZCBsaW5lIHRvb2wKKyAgYWZ0ZXIgZW5zdXJpbmcgdGhlIEFOVExSIGphciBpcyBKYXZhJ3MgY2xhc3MgcGF0aAorCis9PSBGRUFUVVJFUworCisxLiBnZW5lcmF0ZXMgcnVieSBjb2RlIGNhcGFibGUgb2Y6CisgICAqIGxleGluZyB0ZXh0IGlucHV0CisgICAqIHBhcnNpbmcgbGV4aWNhbCBvdXRwdXQgYW5kIHJlc3BvbmRpbmcgd2l0aCBhcmJpdHJhcnkgYWN0aW9ucyAKKyAgICogY29uc3RydWN0aW5nIEFic3RyYWN0IFN5bnRheCBUcmVlcyAoQVNUcykKKyAgICogcGFyc2luZyBBU1Qgc3RydWN0dXJlIGFuZCByZXNwb25kaW5nIHdpdGggYXJiaXRyYXJ5IGFjdGlvbnMKKyAgICogdHJhbnNsYXRpbmcgaW5wdXQgc291cmNlIHRvIHNvbWUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0CisKKzIuIFRoaXMgcGFja2FnZSBjYW4gc2VydmUgYXMgYSBwb3dlcmZ1bCBhc3Npc3RhbnQgd2hlbiBwZXJmb3JtaW5nIHRhc2tzCisgICBzdWNoIGFzOgorICAgKiBjb2RlIGNvbXBpbGF0aW9uCisgICAqIHNvdXJjZSBjb2RlIGhpZ2hsaWdodGluZyBhbmQgZm9ybWF0dGluZworICAgKiBkb21haW4tc3BlY2lmaWMgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24KKyAgICogc291cmNlIGNvZGUgZXh0cmFjdGlvbiBhbmQgYW5hbHlzaXMKKworPT0gVVNBR0UKKworMS4gV3JpdGUgYW4gQU5UTFIgZ3JhbW1hciBzcGVjaWZpY2F0aW9uIGZvciBhIGxhbmd1YWdlCisKKyAgIGdyYW1tYXIgU29tZUxhbmd1YWdlOworICAgCisgICBvcHRpb25zIHsKKyAgICAgbGFuZ3VhZ2UgPSBSdWJ5OyAgICAvLyA8LSB0aGlzIG9wdGlvbiBtdXN0IGJlIHNldCB0byBSdWJ5CisgICAgIG91dHB1dCAgID0gQVNUOworICAgfQorICAgCisgICB0b3A6IGV4cHIgKCAnLCcgZXhwciApKgorICAgICAgOworICAgIAorICAgYW5kIHNvIG9uLi4uCisgICAKKworMi4gUnVuIHRoZSBBTlRMUiB0b29sIHdpdGggdGhlIGFudGxyNHJ1YnkgY29tbWFuZCB0byBnZW5lcmF0ZSBvdXRwdXQ6CisgICAKKyAgIGFudGxyNHJ1YnkgU29tZUxhbmd1YWdlLmcKKyAgICMgY3JlYXRlczoKKyAgICMgICBTb21lTGFuZ3VhZ2VQYXJzZXIucmIKKyAgICMgICBTb21lTGFuZ3VhZ2VMZXhlci5yYgorICAgIyAgIFNvbWVMYW5ndWFnZS5nCisKKzMuIFRyeSBvdXQgdGhlIHJlc3VsdHMgZGlyZWN0bHksIGlmIHlvdSBsaWtlOgorCisgICMgc2VlIGhvdyB0aGUgbGV4ZXIgdG9rZW5pemVzIHNvbWUgaW5wdXQKKyAgcnVieSBTb21lTGFuZ3VhZ2VMZXhlci5yYiA8IHBhdGgvdG8vc291cmNlLWNvZGUueHl6CisgIAorICAjIGNoZWNrIHdoZXRoZXIgdGhlIHBhcnNlciBzdWNjZXNzZnVsbHkgbWF0Y2hlcyBzb21lIGlucHV0CisgIHJ1YnkgU29tZUxhbmd1YWdlUGFyc2VyLnJiIC0tcnVsZT10b3AgPCBwYXRoL3RvL3NvdXJjZS1jb2RlLnh5egorCistPiBSZWFkIHVwIG9uIHRoZSBwYWNrYWdlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgc3BlY2lmaWMgZGV0YWlscworICAgYWJvdXQgbG9hZGluZyB0aGUgcmVjb2duaXplcnMgYW5kIHVzaW5nIHRoZWlyIGNsYXNzIGRlZmluaXRpb25zCisKKz09IElTU1VFUworCisqIEN1cnJlbnRseSwgdGhlcmUgYXJlIGEgZmV3IG51YW5jZWQgd2F5cyBpbiB3aGljaCB1c2luZyB0aGUgcnVieSBvdXRwdXQgZGlmZmVycworICBmcm9tIHRoZSBjb252ZW50aW9ucyBhbmQgZXhhbXBsZXMgY292ZXJlZCBpbiB0aGUgQU5UTFIgc3RhbmRhcmQgZG9jdW1lbnRhdGlvbi4KKyAgSSBhbSBzdGlsbCB3b3JraW5nIG9uIGRvY3VtZW50aW5nIHRoZXNlIGRldGFpbHMuCisKKyogU28gZmFyLCB0aGlzIGhhcyBvbmx5IGJlZW4gdGVzdGVkIG9uIExpbnV4IHdpdGggcnVieSAxLjguNyBhbmQgcnVieSAxLjkuMS4KKyAgSSdtIGN1cnJlbnRseSB3b3JraW5nIG9uIHZlcmlmeWluZyBiZWhhdmlvciBvbiBvdGhlciBzeXN0ZW1zIGFuZCB3aXRoCisgIHNsaWdodGx5IG9sZGVyIHZlcnNpb25zIG9mIHJ1YnkuIAorCis9PSBMSUNFTlNFCisKK1tUaGUgIkJTRCBsaWNlbnNlIl0KK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEt5bGUgWWV0dGVyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDFmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMucmIKQEAgLTAsMCArMSwyMTIgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMworCitUaGUgbWFpbiBuYW1lc3BhY2UgZm9yIHRoZSBBTlRMUiBydW50aW1lIGxpYnJhcmllcywgd2hpY2ggYXJlIHVzZWQgYnkKK1J1YnktdGFyZ2V0ZWQgcmVjb2duaXplcnMgZ2VuZXJhdGVkIGJ5IEFOVExSLiBUaGUgZW50aXJlIGxpYnJhcnkgaXMgc2VnbWVudGVkCitpbnRvIHNldmVyYWwgbWFpbiBjb21wb25lbnRzLCBhcyB3ZWxsIGFzIGEgZmV3IGFkZGl0aW9uYWwgdXRpbGl0eSBjb21wb25lbnRzLAorZWFjaCBjb250YWluZWQgd2l0aGluIGEgc2VwYXJhdGUgc2NyaXB0LgorCis9PSBMaWJyYXJ5IENvbXBvbmVudHMKKworTm90IGFsbCBjb21wb25lbnRzIG9mIHRoZSBBTlRMUjMgbGlicmFyeSBhcmUgbmVjZXNzYXJ5IHdpdGhpbiBBTlRMUiBnZW5lcmF0ZWQKK2NvZGUuIFNvbWUgY29tcG9uZW50cyBhcmUgb25seSB1c2VkIHdpdGhpbiBzcGVjaWZpYyB0eXBlcyBvZiByZWNvZ25pemVycyBhbmQKK3NvbWUgYXJlIHNpbXBseSBleHRyYSB1dGlsaXRpZXMgZm9yIHVzZSBieSBhbnlvbmUgd29ya2luZyB3aXRoIEFOVExSIGNvZGUuIFRodXMsCit3aGVuIHJlcXVpcmluZyAnYW50bHIzJywgb25seSB0aGUgZXNzZW50aWFsIGNvcmUgY29tcG9uZW50cyBhcmUgbG9hZGVkCitpbW1lZGlhdGVseS4gVGhlIHJlc3QgYXJlIGNvbmZpZ3VyZWQgdG8gYXV0b2xvYWQgd2hlbiBhbnkgb2YgdGhlIGNvbnN0YW50IG5hbWVzCit0aGV5IGRlZmluZSBhcmUgcmVmZXJlbmNlZC4KKworVGhlIGZvbGxvd2luZyBsaXN0IGdpdmVzIGEgYnJpZWYgaW50cm9kdWN0aW9uIHRvIGVhY2ggY29tcG9uZW50IG9mIHRoZSBBTlRMUjMKK3J1bnRpbWUgbGlicmFyeS4gVGhlIGl0ZW1zIGFyZSBsb29zZWx5IG9yZGVyZWQgYnkgaW1wb3J0YW5jZS4KKworYW50bHIzL3JlY29nbml6ZXJzLnJiOjoKKyAgY29udGFpbnMgdGhlIGJhc2UgY2xhc3NlcyBmb3IgQU5UTFItZ2VuZXJhdGVkIHJlY29nbml6ZXJzLCBhbmQgdGh1cywgaXMgb25lIG9mCisgIHRoZSBtb3N0IGltcG9ydGFudCBjb21wb25lbnRzIG9mIHRoZSBydW50aW1lIGxpYnJhcnkuIGxvYWRlZCBieSBkZWZhdWx0CithbnRscjMvZGZhLnJiOjoKKyAgZGVmaW5lcyBhIHNpbmdsZSBERkEgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIHNpbXVsYXRlIHN0YXRlIG1hY2hpbmVzIGZvciBjZXJ0YWluCisgIGRlY2lzaW9ucyByZWNvZ25pemVycyBtdXN0IG1ha2UgaW4gY29kZSBnZW5lcmF0ZWQgYnkgQU5UTFIKK2FudGxyMy9zdHJlYW1zLnJiOjoKKyAgZGVmaW5lcyB0aGUgc3RyZWFtIGNsYXNzZXMgdXNlZCBieSBBTlRMUiByZWNvZ25pemVycyB0byB3YWxrIHNlcXVlbnRpYWxseQorICB0aHJvdWdoIHN0cmluZ3MsIHRva2VucywgYW5kIHRyZWUgbm9kZXMgbG9hZGVkIGJ5IGRlZmF1bHQKK2FudGxyMy90b2tlbi5yYjo6CisgIGNvbnRhaW5zIGFsbCBtb2R1bGVzIGFuZCBjbGFzc2VzIGNvbmNlcm5lZCB3aXRoIG1ha2luZyB0b2tlbnMsIHRoZSBjaHVua3Mgb2YKKyAgdGV4dCBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIHByb2R1Y2VkIGJ5IGxleGVycyBhbmQgdXNlZCBieSBwYXJzZXJzIGFuZCBBU1RzCisgIGxvYWRlZCBieSBkZWZhdWx0CithbnRscjMvZXJyb3IucmI6OgorICBkZWZpbmVzIHRoZSBFcnJvciBtb2R1bGUsIHdoaWNoIGNvbnRhaW5zIGRlZmluaXRpb25zIGZvciBtb3N0IG9mIHRoZSBtYW55CisgIGVycm9yIGNsYXNzZXMgdXNlZCB0aHJvdWdoIHRoZSBydW50aW1lIGxpYnJhcnkgYW5kIEFOVExSIGdlbmVyYXRlZAorICByZWNvZ25pemVycy4gbG9hZGVkIGJ5IGRlZmF1bHQKK2FudGxyMy9jb25zdGFudHMucmI6OgorICBqdXN0IGEgbW9kdWxlIHVzZWQgYXMgYSBuYW1lc3BhY2UgZm9yIHRoZSBuYW1lZCBjb25zdGFudCB2YWx1ZXMgdXNlZAorICB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LiBsb2FkZWQgYnkgZGVmYXVsdAorYW50bHIzL3RyZWUucmI6OgorICBjb250YWlucyBldmVyeXRoaW5nIHBlcnRhaW5pbmcgdG8gQWJzdHJhY3QgU3ludGF4IFRyZWVzIChBU1RzKS4gVGhpcyBzY3JpcHQgaXMKKyAgbm90IGxvYWRlZCBieSBkZWZhdWx0IHdoZW4gJ2FudGxyMycgaXMgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhdXRsb2FkZWQgb24gZGVtYW5kCisgIHdoZW4gYW55IGNvbnN0YW50IGRlZmluZWQgaW4gdGhlIHNjcmlwdCBpcyByZWZlcmVuY2VkLiBjb250ZW50cyBhcmUgYXV0b2xvYWRlZAorICBvbiBkZW1hbmQKK2FudGxyMy9kZWJ1Zy5yYjo6CisgIHdoZW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgQU5UTFIgdXNpbmcgdGhlICctZGVidWcnIG9wdGlvbiwgYWxsIG9mIHRoZQorICBhZGRpdGlvbmFsIGNsYXNzZXMgYW5kIG1peGlucyByZXF1aXJlZCBieSB0aGUgZGVidWcgY29kZSBhcmUgY29udGFpbmVkIHdpdGhpbgorICB0aGUgRGVidWcgbW9kdWxlIGRlZmluZWQgYnkgdGhpcyBsaWJyYXJ5LiB0aGUgRGVidWcgbW9kdWxlIGlzIGF1dG9sb2FkZWQgb24KKyAgZGVtYW5kCithbnRscjMvbWFpbi5yYjo6CisgIGRlZmluZXMgdGhlIE1haW4gbW9kdWxlLiBXaGVuIEFOVExSLWdlbmVyYXRlZCByZWNvZ25pemVyIGNvZGUgaXMgcnVuIGRpcmVjdGx5CisgIGFzIGEgc2NyaXB0IChub3QgbG9hZGVkIGFzIGEgbW9kdWxlKSwgdGhlIGNvZGUgd2lsbCBiZWhhdmUgYXMgYSBmdWxsCisgIGNvbW1hbmQtbGluZSBzY3JpcHQgYnkgdXNpbmcgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBpbiB0aGUgTWFpbiBtb2R1bGUuIHRoZQorICBNYWluIG1vZHVsZSBpcyBhdXRsb2FkZWQgb24gZGVtYW5kCithbnRscjMvdHJlZS13aXphcmQucmI6OgorICBjb250YWlucyBleHRyYSB0b29scyB0byBlYXNpbHkgY29uc3RydWN0IEFTVHMgYnkgcGFyc2luZyBkZXNjcmlwdGlvbnMgd3JpdHRlbgorICBpbiBhIHNwZWNpYWwgRFNMCithbnRscjMvZG90LnJiOjoKKyAgZXh0cmEgdXRpbGl0aWVzIHRvIGdlbmVyYXRlIERPVCBtYXAgc3BlY2lmaWNhdGlvbnMgZm9yIGdyYXBoaWNhbC4KKyAgcmVwcmVzZW50YXRpb25zIG9mIEFTVHMKKworQGF1dGhvciBLeWxlIFlldHRlcgorCis9ZW5kCisKK21vZHVsZSBBTlRMUjMKKyAgCisgICMgOnN0b3Bkb2M6CisgICMgQkVHSU4gUEFUSFMgLS0gZG8gbm90IG1vZGlmeQorICAKKyAgTElCUkFSWV9QQVRIICA9IDo6RmlsZS5leHBhbmRfcGF0aCggOjpGaWxlLmRpcm5hbWUoIF9fRklMRV9fICkgKS5mcmVlemUKKyAgUFJPSkVDVF9QQVRIICA9IDo6RmlsZS5kaXJuYW1lKCBMSUJSQVJZX1BBVEggKS5mcmVlemUKKyAgREFUQV9QQVRIICAgICA9IDo6RmlsZS5qb2luKCBQUk9KRUNUX1BBVEgsICdqYXZhJyApLmZyZWV6ZQorICAKKyAgIyBFTkQgUEFUSFMKKyAgIyA6c3RhcnRkb2M6CisgIAorICAjIFJldHVybnMgdGhlIGxpYnJhcnkgcGF0aCBmb3IgdGhlIG1vZHVsZS4gSWYgYW55IGFyZ3VtZW50cyBhcmUgZ2l2ZW4sCisgICMgdGhleSB3aWxsIGJlIGpvaW5lZCB0byB0aGUgZW5kIG9mIHRoZSBsaWJyYXkgcGF0aCB1c2luZworICAjIDx0dD5GaWxlLmpvaW48L3R0Pi4KKyAgIworICBkZWYgc2VsZi5saWJyYXJ5X3BhdGgoICphcmdzICkKKyAgICA6OkZpbGUuZXhwYW5kX3BhdGgoIDo6RmlsZS5qb2luKCBMSUJSQVJZX1BBVEgsICphcmdzICkgKQorICBlbmQKKyAgCisgICMgUmV0dXJucyB0aGUgbHBhdGggZm9yIHRoZSBtb2R1bGUuIElmIGFueSBhcmd1bWVudHMgYXJlIGdpdmVuLAorICAjIHRoZXkgd2lsbCBiZSBqb2luZWQgdG8gdGhlIGVuZCBvZiB0aGUgcGF0aCB1c2luZworICAjIDx0dD5GaWxlLmpvaW48L3R0Pi4KKyAgIworICBkZWYgc2VsZi5kYXRhX3BhdGgoICphcmdzICkKKyAgICA6OkZpbGUuZXhwYW5kX3BhdGgoIDo6RmlsZS5qb2luKCBEQVRBX1BBVEgsICphcmdzICkgKQorICBlbmQKKyAgCisgICMgVGhpcyBpcyB1c2VkIGludGVybmFsbHkgaW4gYSBoYW5kZnVsIG9mIGxvY2F0aW9ucyBpbiB0aGUgcnVudGltZSBsaWJyYXJ5CisgICMgd2hlcmUgYXNzdW1wdGlvbnMgaGF2ZSBiZWVuIG1hZGUgdGhhdCBhIGNvbmRpdGlvbiB3aWxsIG5ldmVyIGhhcHBlbgorICAjIHVuZGVyIG5vcm1hbCB1c2FnZSBjb25kaXRpb25zIGFuZCB0aHVzIGFuIEFOVExSMzo6QnVnIGVycm9yIHdpbGwgYmUKKyAgIyByYWlzZWQgaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG9jY3VyLgorICBkZWYgc2VsZi5idWchKCBtZXNzYWdlID0gbmlsICkKKyAgICBidWcgPSBCdWcubmV3KCBtZXNzYWdlICkKKyAgICBidWcuc2V0X2JhY2t0cmFjZSggY2FsbGVyICkKKyAgICByYWlzZSggYnVnICkKKyAgZW5kCisgIAorICBAYW50bHJfamFyID0gbmlsCisgIAorICBkZWYgc2VsZi5hbnRscl9qYXI9KCBwYXRoICkKKyAgICBAYW50bHJfamFyID0gcGF0aCA/IEZpbGUuZXhwYW5kX3BhdGgoIHBhdGgudG9fcyApIDogcGF0aAorICBlbmQKKyAgCisgIGRlZiBzZWxmLmFudGxyX2phcgorICAgIEBhbnRscl9qYXIgYW5kIHJldHVybiggQGFudGxyX2phciApCisgICAgCisgICAgcGF0aCA9IGRhdGFfcGF0aCAiYW50bHItZnVsbC0jeyBBTlRMUl9WRVJTSU9OX1NUUklORyB9LmphciIKKyAgICBpZiBlbnZfcGF0aCA9IEVOVlsgJ1JVQllfQU5UTFJfSkFSJyBdCisgICAgICBpZiBGaWxlLmZpbGU/KCBlbnZfcGF0aCApIHRoZW4gcmV0dXJuIEZpbGUuZXhwYW5kX3BhdGgoIGVudl9wYXRoICkgZW5kCisgICAgICAKKyAgICAgIHdhcm4oIAorICAgICAgICAiI3sgX19GSUxFX18gfTojeyBfX0xJTkVfXyB9OiAiIDw8CisgICAgICAgICJpZ25vcmluZyBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIFJVQllfQU5UTFJfSkFSICg9JXApICIgJSBlbnZfcGF0aCA8PAorICAgICAgICAiYXMgaXQgaXMgbm90IHRoZSBwYXRoIHRvIGFuIGV4aXN0aW5nIGZpbGVcbiIgPDwKKyAgICAgICAgIiAgLT4gdHJ5aW5nIGRlZmF1bHQgamFyIHBhdGggJXAgaW5zdGVhZCIgJSBwYXRoCisgICAgICApCisgICAgZW5kCisgICAgCisgICAgRmlsZS5leGlzdHM/KCBwYXRoICkgPyBwYXRoIDogbmlsCisgIGVuZAorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5hbWVzcGFjZSBhbmQgTG9hZCBQYXRoIFNldHVwICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgCisgICMgVHJlZSBjbGFzc2VzIGFyZSBvbmx5IHVzZWQgYnkgdHJlZSBwYXJzZXJzIG9yIEFTVC1idWlsZGluZyBwYXJzZXJzCisgICMgVGh1cywgdGhleSdyZSBub3QgZXNzZW50aWFsIGZvciBldmVyeXRoaW5nIEFOVExSIGdlbmVyYXRlcyBhbmQKKyAgIyBhcmUgYXV0b2xvYWRlZCBvbi1kZW1hbmQKKyAgYXV0b2xvYWQgOkFTVCwgJ2FudGxyMy90cmVlJworICAKKyAgdHJlZV9jbGFzc2VzID0gWyAKKyAgICA6VHJlZSwgOlRyZWVBZGFwdG9yLCA6QmFzZVRyZWUsIDpCYXNlVHJlZUFkYXB0b3IsCisgICAgOkNvbW1vblRyZWUsIDpDb21tb25FcnJvck5vZGUsIDpDb21tb25UcmVlQWRhcHRvciwKKyAgICA6VHJlZU5vZGVTdHJlYW0sIDpDb21tb25UcmVlTm9kZVN0cmVhbSwgOlRyZWVQYXJzZXIsCisgICAgOlRyZWVWaXNpdG9yLCA6UmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLAorICAgIDpSZXdyaXRlUnVsZVRva2VuU3RyZWFtLCA6UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLAorICAgIDpSZXdyaXRlUnVsZU5vZGVTdHJlYW0KKyAgXQorICAKKyAgZm9yIGtsYXNzIGluIHRyZWVfY2xhc3NlcworICAgIGF1dG9sb2FkIGtsYXNzLCAnYW50bHIzL3RyZWUnCisgIGVuZAorICAKKyAgIyBTZXQgdXAgbm9uLWVzc2VudGlhbCBjb21wb25lbnRzIHRvIGJlIGxvYWRlZCBvbi1kZW1hbmQKKyAgYXV0b2xvYWQgOlRva2VuUmV3cml0ZVN0cmVhbSwgJ2FudGxyMy9zdHJlYW1zL3Jld3JpdGUnCisgIGF1dG9sb2FkIDpGaWx0ZXJNb2RlLCAnYW50bHIzL21vZGVzL2ZpbHRlcicKKyAgYXV0b2xvYWQgOkFTVEJ1aWxkZXIsICdhbnRscjMvbW9kZXMvYXN0LWJ1aWxkZXInCisgIGF1dG9sb2FkIDpNYWluLCAgJ2FudGxyMy9tYWluJworICBhdXRvbG9hZCA6RGVidWcsICdhbnRscjMvZGVidWcnCisgIGF1dG9sb2FkIDpQcm9maWxlLCAnYW50bHIzL3Byb2ZpbGUnCisgIGF1dG9sb2FkIDpET1QsICdhbnRscjMvZG90JworICBhdXRvbG9hZCA6SW50ZXJhY3RpdmVTdHJpbmdTdHJlYW0sICdhbnRscjMvc3RyZWFtcy9pbnRlcmFjdGl2ZScKKyAgCisgIGF1dG9sb2FkIDpUZW1wbGF0ZSwgJ2FudGxyMy90ZW1wbGF0ZScKKyAgCisgICRMT0FEX1BBVEguaW5jbHVkZT8oIGxpYnJhcnlfcGF0aCApIG9yICRMT0FEX1BBVEgudW5zaGlmdCggbGlicmFyeV9wYXRoICkKKyAgCitlbmQgICMgbW9kdWxlIEFOVExSMworCisKK3JlcXVpcmUgJ3NldCcKK3JlcXVpcmUgJ2FudGxyMy91dGlsJworcmVxdWlyZSAnYW50bHIzL3ZlcnNpb24nCisKK3VubGVzcyAkMCA9PSAnYW50bHI0cnVieScKKyAgcmVxdWlyZSAnYW50bHIzL2NvbnN0YW50cycKKyAgcmVxdWlyZSAnYW50bHIzL2Vycm9yJworICByZXF1aXJlICdhbnRscjMvdG9rZW4nCisgIHJlcXVpcmUgJ2FudGxyMy9yZWNvZ25pemVycycKKyAgcmVxdWlyZSAnYW50bHIzL2RmYScKKyAgcmVxdWlyZSAnYW50bHIzL3N0cmVhbXMnCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9jb25zdGFudHMucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvY29uc3RhbnRzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzZjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvY29uc3RhbnRzLnJiCkBAIC0wLDAgKzEsOTggQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKK21vZHVsZSBBTlRMUjMKKyAgCisKKz1iZWdpbiByZG9jIEFOVExSMzo6Q29uc3RhbnRzCisKK0Egc2ltcGxlIG1vZHVsZSB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIGJ1aWx0LWluIHRva2VuIHR5cGVzLCBjaGFubmVscywgYW5kCit0b2tlbiBuYW1lcyB1c2VkIGJ5IEFOVExSIHRocm91Z2hvdXQgdGhlIHJ1bnRpbWUgbGlicmFyeS4KKworPWVuZAorbW9kdWxlIENvbnN0YW50cworICAjIGJ1aWx0LWluIHRva2VuIGNoYW5uZWwgSURzCisgIAorICAjIHRoZSBjaGFubmVsIHRvIHdoaWNoIG1vc3QgdG9rZW5zIHdpbGwgYmUgYXNzaWduZWQKKyAgREVGQVVMVCA9IERFRkFVTFRfQ0hBTk5FTCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTCA9IDpkZWZhdWx0CisgIAorICAjIHRoZSBjaGFubmVsIGZvciB0b2tlbnMgd2hpY2ggc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gYSBwYXJzZXIgYnkgYSB0b2tlbiBzdHJlYW0KKyAgSElEREVOICA9IEhJRERFTl9DSEFOTkVMICA9IDpoaWRkZW4KKyAgCisgICMgZmxhZyB1c2VkIGJ5IHJlY29nbml6ZXJzIGR1cmluZyBtZW1vaXphdGlvbiB0bworICAjIHJlcHJlc2VudCBhIHByZXZpb3VzIHByZWRpY3Rpb24gZmFpbHVyZQorICBNRU1PX1JVTEVfRkFJTEVEID0gLTIKKyAgCisgICMgZmxhZyB1c2VkIGJ5IHJlY29nbml6ZXJzIGR1cmluZyBtZW1vaXphdGlvbiB0byBpbmRpY2F0ZQorICAjIHRoYXQgdGhlIHJ1bGUgaGFzIG5vdCBiZWVuIG1lbW9pemVkIHlldAorICBNRU1PX1JVTEVfVU5LTk9XTiA9IC0xCisgIAorICAjIGJ1aWx0LWluIHRva2VuIHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSBBTlRMUjMKKyAgCisgIElOVkFMSURfVE9LRU5fVFlQRSA9IDAKKyAgCisgIEVPRiA9IC0xCisgIAorICAKKyAgIyBJbWFnaW5hcnkgdHJlZS1uYXZpZ2F0aW9uIHRva2VuIHR5cGUgaW5kaWNhdGluZyB0aGUgYXNjZW50IGFmdGVyIG1vdmluZyB0aHJvdWdoIHRoZQorICAjIGNoaWxkcmVuIG9mIGEgbm9kZQorICBVUCA9IDMKKyAgCisgICMgSW1hZ2luYXJ5IHRyZWUtbmF2aWdhdGlvbiB0b2tlbiB0eXBlIGluZGljYXRpbmcgYSBkZXNjZW50IGludG8gdGhlIGNoaWxkcmVuIG9mIGEgbm9kZQorICBET1dOID0gMgorICAKKyAgIyBFbmQgb2YgUnVsZSAodXNlZCBpbnRlcm5hbGx5IGJ5IERGQXMpCisgIEVPUl9UT0tFTl9UWVBFID0gMQorICAKKyAgIyBUaGUgc21hbGxlc3QgcG9zc2libGUgdmFsdWUgb2Ygbm9uLWJ1aWx0aW4gQU5UTFItZ2VuZXJhdGVkIHRva2VuIHR5cGVzCisgIE1JTl9UT0tFTl9UWVBFID0gNAorICAKKyAgIyBBIGhhc2ggbWFwcGluZyBidWlsdCBpbiB0b2tlbiB0eXBlcyB0byB0aGVpciByZXNwZWN0aXZlIG5hbWVzCisgICMgcmV0dXJuaW5nIGEgc3RyaW5nICI8VU5LTk9XTjogI3t0eXBlfT4iIGZvciBub24tYnVpbHRpbiB0b2tlbgorICAjIHR5cGVzCisgIEJVSUxUX0lOX1RPS0VOX05BTUVTID0gSGFzaC5uZXcgZG8gfGgsIGt8CisgICAgIjxVTktOT1dOOiAjeyBrIH0+IgorICBlbmQKKyAgCisgIEJVSUxUX0lOX1RPS0VOX05BTUVTLnVwZGF0ZSggCisgICAgMCA9PiAiPGludmFsaWQ+Ii5mcmVlemUsIDEgPT4gIjxFT1I+Ii5mcmVlemUsIAorICAgIDIgPT4gIjxET1dOPiIuZnJlZXplLCAzID0+ICI8VVA+Ii5mcmVlemUsIAorICAgIC0xID0+ICI8RU9GPiIuZnJlZXplCisgICkKKyAgCisgIAorZW5kCisKK2luY2x1ZGUgQ29uc3RhbnRzCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZWJ1Zy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZWJ1Zy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY1ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL2RlYnVnLnJiCkBAIC0wLDAgKzEsNjk3IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMycKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKK21vZHVsZSBBTlRMUjMKKyAgCis9YmVnaW4gcmRvYyBBTlRMUjM6OkRlYnVnCisKK05hbWVzcGFjZSBmb3IgYWxsIGRlYnVnZ2luZy1yZWxhdGVkIGNsYXNzIGFuZCBtb2R1bGUgZGVmaW5pdGlvbnMuCisKKz1lbmQKKworbW9kdWxlIERlYnVnCisKK0RFRkFVTFRfUE9SVCA9IDQ5MTAwCisKKyMgc2luY2UgdGhlcmUgYXJlIG1hbnkgY29tcG9uZW50cyB0byB0aGUgZGVidWctbW9kZQorIyBzZWN0aW9uIG9mIHRoZSBhbnRscjMgcnVudGltZSBsaWJyYXJ5LCBtb3N0IG9mIHdoaWNoCisjIGFyZSBub3QgdXNlZCBzaW11bHRhbmVvdXNseSwgZGVidWcucmIgY29udGFpbnMgdGhlCisjIGJhc2Ugb2YgdGhlIGRlYnVnIGxpYnJhcnkgYW5kIHRoZSB2YXJpb3VzIGxpc3RlbmVycworIyBhbmQgdHJlZS1yZWxhdGVkIGNvZGUgYXJlIGF1dGxvYWRlZCBvbi1kZW1hbmQKK2F1dG9sb2FkIDpFdmVudFNvY2tldFByb3h5LCAnYW50bHIzL2RlYnVnL3NvY2tldCcKK2F1dG9sb2FkIDpSZW1vdGVFdmVudFNvY2tldExpc3RlbmVyLCAnYW50bHIzL2RlYnVnL3NvY2tldCcKK2F1dG9sb2FkIDpUcmFjZUV2ZW50TGlzdGVuZXIsICdhbnRscjMvZGVidWcvdHJhY2UtZXZlbnQtbGlzdGVuZXInCithdXRvbG9hZCA6UmVjb3JkRXZlbnRMaXN0ZW5lciwgJ2FudGxyMy9kZWJ1Zy9yZWNvcmQtZXZlbnQtbGlzdGVuZXInCithdXRvbG9hZCA6UnVsZVRyYWNlciwgJ2FudGxyMy9kZWJ1Zy9ydWxlLXRyYWNlcicKK2F1dG9sb2FkIDpFdmVudEh1YiwgJ2FudGxyMy9kZWJ1Zy9ldmVudC1odWInCithdXRvbG9hZCA6VHJlZUFkYXB0b3IsICdhbnRscjMvdHJlZS9kZWJ1ZycKK2F1dG9sb2FkIDpUcmVlTm9kZVN0cmVhbSwgJ2FudGxyMy90cmVlL2RlYnVnJworCitSZWNvZ25pemVyU2hhcmVkU3RhdGUgPSBTdHJ1Y3QubmV3KCAKKyAgIyB0aGUgcnVsZSBpbnZvY2F0aW9uIGRlcHRoCisgIDpydWxlX2ludm9jYXRpb25fc3RhY2ssCisgICMgYSBib29sZWFuIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgZGVjaXNpb24gaXMgY3ljbGljCisgIDpjeWNsaWNfZGVjaXNpb24sCisgICMgYSBzdGFjayB0aGF0IHRyYWNrcyBmb2xsb3cgc2V0cyBmb3IgZXJyb3IgcmVjb3ZlcnkKKyAgOmZvbGxvd2luZywKKyAgIyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjb2duaXplciBpcyBpbiBlcnJvciByZWNvdmVyeSBtb2RlCisgIDplcnJvcl9yZWNvdmVyeSwKKyAgIyB0aGUgaW5kZXggaW4gdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgbGFzdCBlcnJvcgorICA6bGFzdF9lcnJvcl9pbmRleCwKKyAgIyB0cmFja3MgdGhlIGJhY2t0cmFja2luZyBkZXB0aAorICA6YmFja3RyYWNraW5nLAorICAjIGlmIGEgZ3JhbW1hciBpcyBjb21waWxlZCB3aXRoIHRoZSBtZW1vaXphdGlvbiBvcHRpb24sIHRoaXMgd2lsbAorICAjIGJlIHNldCB0byBhIGhhc2ggbWFwcGluZyBwcmV2aW91c2x5IHBhcnNlZCBydWxlcyB0byBjYWNoZWQgaW5kaWNlcworICA6cnVsZV9tZW1vcnksCisgICMgdHJhY2tzIHRoZSBudW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzZWVuIHNvIGZhcgorICA6c3ludGF4X2Vycm9ycywKKyAgIyBob2xkcyBuZXdseSBjb25zdHJ1Y3RlZCB0b2tlbnMgZm9yIGxleGVyIHJ1bGVzCisgIDp0b2tlbiwKKyAgIyB0aGUgaW5wdXQgc3RyZWFtIGluZGV4IGF0IHdoaWNoIHRoZSB0b2tlbiBzdGFydHMKKyAgOnRva2VuX3N0YXJ0X3Bvc2l0aW9uLAorICAjIHRoZSBpbnB1dCBzdHJlYW0gbGluZSBudW1iZXIgYXQgd2hpY2ggdGhlIHRva2VuIHN0YXJ0cworICA6dG9rZW5fc3RhcnRfbGluZSwKKyAgIyB0aGUgaW5wdXQgc3RyZWFtIGNvbHVtbiBhdCB3aGljaCB0aGUgdG9rZW4gc3RhcnRzCisgIDp0b2tlbl9zdGFydF9jb2x1bW4sCisgICMgdGhlIGNoYW5uZWwgdmFsdWUgb2YgdGhlIHRhcmdldCB0b2tlbgorICA6Y2hhbm5lbCwKKyAgIyB0aGUgdHlwZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IHRva2VuCisgIDp0eXBlLAorICAjIHRoZSB0ZXh0IG9mIHRoZSB0YXJnZXQgdG9rZW4KKyAgOnRleHQKKykKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpEZWJ1Zzo6UmVjb2duaXplclNoYXJlZFN0YXRlCisKK0FOVExSMzo6RGVidWc6OlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBpcyBpZGVudGljYWwgdG8KK0FOVExSMzo6UmVjb2duaXplclNoYXJlZFN0YXRlLCBidXQgYWRkcyBhZGRpdGlvbmFsIGZpZWxkcyB1c2VkIGZvciByZWNvZ25pemVycworZ2VuZXJhdGVkIGluIGRlYnVnIG9yIHByb2ZpbGluZyBtb2RlLgorCis9ZW5kCitjbGFzcyBSZWNvZ25pemVyU2hhcmVkU3RhdGUKKyAgZGVmIGluaXRpYWxpemUKKyAgICBzdXBlciggW10sIGZhbHNlLCBbXSwgZmFsc2UsIC0xLCAwLCBuaWwsIDAsIG5pbCwgLTEgKQorICAgICMgXi0tIHNhbWUgYXMgdGhpcyAtLXYgCisgICAgIyBzZWxmLmZvbGxvd2luZyA9IFtdCisgICAgIyBzZWxmLmVycm9yX3JlY292ZXJ5ID0gZmFsc2UKKyAgICAjIHNlbGYubGFzdF9lcnJvcl9pbmRleCA9IC0xCisgICAgIyBzZWxmLmJhY2t0cmFja2luZyA9IDAKKyAgICAjIHNlbGYuc3ludGF4X2Vycm9ycyA9IDAKKyAgICAjIHNlbGYucnVsZV9sZXZlbCA9IDAKKyAgICAjIHNlbGYudG9rZW5fc3RhcnRfcG9zaXRpb24gPSAtMQorICBlbmQKKyAgCisgIGRlZiByZXNldCEKKyAgICBzZWxmLmZvbGxvd2luZy5jbGVhcgorICAgIHNlbGYuZXJyb3JfcmVjb3ZlcnkgPSBmYWxzZQorICAgIHNlbGYubGFzdF9lcnJvcl9pbmRleCA9IC0xCisgICAgc2VsZi5iYWNrdHJhY2tpbmcgPSAwCisgICAgc2VsZi5ydWxlX21lbW9yeSBhbmQgcnVsZV9tZW1vcnkuY2xlYXIKKyAgICBzZWxmLnN5bnRheF9lcnJvcnMgPSAwCisgICAgc2VsZi50b2tlbiA9IG5pbAorICAgIHNlbGYudG9rZW5fc3RhcnRfcG9zaXRpb24gPSAtMQorICAgIHNlbGYudG9rZW5fc3RhcnRfbGluZSA9IG5pbAorICAgIHNlbGYudG9rZW5fc3RhcnRfY29sdW1uID0gbmlsCisgICAgc2VsZi5jaGFubmVsID0gbmlsCisgICAgc2VsZi50eXBlID0gbmlsCisgICAgc2VsZi50ZXh0ID0gbmlsCisgICAgc2VsZi5ydWxlX2ludm9jYXRpb25fc3RhY2suY2xlYXIKKyAgZW5kCisgIAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RGVidWc6OlBhcnNlckV2ZW50cworCitQYXJzZXJFdmVudHMgYWRkcyBkZWJ1Z2dpbmcgZXZlbnQgaG9vayBtZXRob2RzIGFuZCBmdW5jdGlvbmFsaXR5IHRoYXQgaXMKK3JlcXVpcmVkIGJ5IHRoZSBjb2RlIEFOVExSIGdlbmVyYXRlZCB3aGVuIGNhbGxlZCB3aXRoIHRoZSA8dHQ+LWRlYnVnPC90dD4KK3N3aXRjaC4KKworPWVuZAorbW9kdWxlIFBhcnNlckV2ZW50cworICBpbmNsdWRlIEFOVExSMzo6RXJyb3IKKyAgCisgIGRlZiBzZWxmLmluY2x1ZGVkKCBrbGFzcyApCisgICAgc3VwZXIKKyAgICBpZiBrbGFzcy5pc19hPyggOjpDbGFzcyApCisgICAgICBkZWYga2xhc3MuZGVidWc/CisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIAorICBhdHRyX3JlYWRlciA6ZGVidWdfbGlzdGVuZXIKKyAgCisgIGRlZiBpbml0aWFsaXplKCBzdHJlYW0sIG9wdGlvbnMgPSB7fSApCisgICAgQGRlYnVnX2xpc3RlbmVyID0gb3B0aW9uc1sgOmRlYnVnX2xpc3RlbmVyIF0gfHw9IGJlZ2luCisgICAgICBFdmVudFNvY2tldFByb3h5Lm5ldyggc2VsZiwgb3B0aW9ucyApLmhhbmRzaGFrZQorICAgIGVuZAorICAgIG9wdGlvbnNbIDpzdGF0ZSBdIHx8PSBEZWJ1Zzo6UmVjb2duaXplclNoYXJlZFN0YXRlLm5ldworICAgIHN1cGVyKCBzdHJlYW0sIG9wdGlvbnMgKQorICAgIGlmIEBpbnB1dC5pc19hPyggRGVidWc6OlRva2VuU3RyZWFtICkKKyAgICAgIEBpbnB1dC5kZWJ1Z19saXN0ZW5lciB8fD0gQGRlYnVnX2xpc3RlbmVyCisgICAgZWxzZQorICAgICAgQGlucHV0ID0gRGVidWc6OlRva2VuU3RyZWFtLndyYXAoIEBpbnB1dCwgQGRlYnVnX2xpc3RlbmVyICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgcnVsZV9sZXZlbAorICAgIEBzdGF0ZS5ydWxlX2ludm9jYXRpb25fc3RhY2subGVuZ3RoCisgIGVuZAorICAKKyAgZGVmIGN5Y2xpY19kZWNpc2lvbj8KKyAgICBAc3RhdGUuY3ljbGljX2RlY2lzaW9uCisgIGVuZAorICAKKyAgZGVmIGN5Y2xpY19kZWNpc2lvbj0oIGZsYWcgKQorICAgIEBzdGF0ZS5jeWNsaWNfZGVjaXNpb24gPSBmbGFnCisgIGVuZAorICAKKyAgIyBjdXN0b20gYXR0cmlidXRlIHdyaXRlciBmb3IgZGVidWdfbGlzdGVuZXIKKyAgIyBwcm9wZWdhdGVzIHRoZSBjaGFuZ2UgaW4gbGlzdGVuZXIgdG8gdGhlCisgICMgcGFyc2VyJ3MgZGVidWdnaW5nIGlucHV0IHN0cmVhbQorICBkZWYgZGVidWdfbGlzdGVuZXI9KCBkYmcgKQorICAgIEBkZWJ1Z19saXN0ZW5lciA9IGRiZworICAgIEBpbnB1dC5kZWJ1Z19saXN0ZW5lciA9IGRiZyByZXNjdWUgbmlsCisgIGVuZAorICAKKyAgZGVmIGJlZ2luX3Jlc3luYworICAgIEBkZWJ1Z19saXN0ZW5lci5iZWdpbl9yZXN5bmMKKyAgICBzdXBlcgorICBlbmQKKyAgCisgIGRlZiBlbmRfcmVzeW5jCisgICAgQGRlYnVnX2xpc3RlbmVyLmVuZF9yZXN5bmMKKyAgICBzdXBlcgorICBlbmQKKyAgCisgICMgVE8tRE86IGlzIHRoaXMgcG9pbnRsZXNzPworICBkZWYgcmVzeW5jCisgICAgYmVnaW5fcmVzeW5jCisgICAgeWllbGQoIHNlbGYgKQorICBlbnN1cmUKKyAgICBlbmRfcmVzeW5jCisgIGVuZAorICAKKyAgZGVmIGJlZ2luX2JhY2t0cmFjaworICAgIEBkZWJ1Z19saXN0ZW5lci5iZWdpbl9iYWNrdHJhY2soIEBzdGF0ZS5iYWNrdHJhY2tpbmcgKQorICBlbmQKKyAgCisgIGRlZiBlbmRfYmFja3RyYWNrKCBzdWNjZXNzZnVsICkKKyAgICBAZGVidWdfbGlzdGVuZXIuZW5kX2JhY2t0cmFjayggQHN0YXRlLmJhY2t0cmFja2luZywgc3VjY2Vzc2Z1bCApCisgIGVuZAorICAKKyAgZGVmIGJhY2t0cmFjaworICAgIEBzdGF0ZS5iYWNrdHJhY2tpbmcgKz0gMQorICAgIEBkZWJ1Z19saXN0ZW5lci5iZWdpbl9iYWNrdHJhY2soIEBzdGF0ZS5iYWNrdHJhY2tpbmcgKQorICAgIHN0YXJ0ID0gQGlucHV0Lm1hcmsKKyAgICBzdWNjZXNzID0KKyAgICAgIGJlZ2luIHlpZWxkCisgICAgICByZXNjdWUgQmFja3RyYWNraW5nRmFpbGVkIHRoZW4gZmFsc2UKKyAgICAgIGVsc2UgdHJ1ZQorICAgICAgZW5kCisgICAgcmV0dXJuIHN1Y2Nlc3MKKyAgZW5zdXJlCisgICAgQGlucHV0LnJld2luZCggc3RhcnQgKQorICAgIEBkZWJ1Z19saXN0ZW5lci5lbmRfYmFja3RyYWNrKCBAc3RhdGUuYmFja3RyYWNraW5nLCAoIHN1Y2Nlc3MgcmVzY3VlIG5pbCApICkKKyAgICBAc3RhdGUuYmFja3RyYWNraW5nIC09IDEKKyAgZW5kCisgIAorICBkZWYgcmVwb3J0X2Vycm9yKCBleGMgKQorICAgIEFOVExSMzo6UmVjb2duaXRpb25FcnJvciA9PT0gZXhjIGFuZAorICAgICAgQGRlYnVnX2xpc3RlbmVyLnJlY29nbml0aW9uX2V4Y2VwdGlvbiggZXhjICkKKyAgICBzdXBlcgorICBlbmQKKyAgCisgIGRlZiBtaXNzaW5nX3N5bWJvbCggZXJyb3IsIGV4cGVjdGVkX3R5cGUsIGZvbGxvdyApCisgICAgc3ltYm9sID0gc3VwZXIKKyAgICBAZGVidWdfbGlzdGVuZXIuY29uc3VtZV9ub2RlKCBzeW1ib2wgKQorICAgIHJldHVybiggc3ltYm9sICkKKyAgZW5kCisgIAorICBkZWYgaW5fcnVsZSggZ3JhbW1hcl9maWxlLCBydWxlX25hbWUgKQorICAgIEBzdGF0ZS5ydWxlX2ludm9jYXRpb25fc3RhY2suZW1wdHk/IGFuZCBAZGVidWdfbGlzdGVuZXIuY29tbWVuY2UKKyAgICBAZGVidWdfbGlzdGVuZXIuZW50ZXJfcnVsZSggZ3JhbW1hcl9maWxlLCBydWxlX25hbWUgKQorICAgIEBzdGF0ZS5ydWxlX2ludm9jYXRpb25fc3RhY2sucHVzaCggZ3JhbW1hcl9maWxlLCBydWxlX25hbWUgKQorICAgIHlpZWxkCisgIGVuc3VyZQorICAgIEBzdGF0ZS5ydWxlX2ludm9jYXRpb25fc3RhY2sucG9wKCAyICkKKyAgICBAZGVidWdfbGlzdGVuZXIuZXhpdF9ydWxlKCBncmFtbWFyX2ZpbGUsIHJ1bGVfbmFtZSApCisgICAgQHN0YXRlLnJ1bGVfaW52b2NhdGlvbl9zdGFjay5lbXB0eT8gYW5kIEBkZWJ1Z19saXN0ZW5lci50ZXJtaW5hdGUKKyAgZW5kCisgIAorICBkZWYgcnVsZV9pbnZvY2F0aW9uX3N0YWNrCisgICAgQHN0YXRlLnJ1bGVfaW52b2NhdGlvbl9zdGFjay5lYWNoX3NsaWNlKCAyICkudG9fYQorICBlbmQKKyAgCisgIGRlZiBwcmVkaWNhdGU/KCBkZXNjcmlwdGlvbiApCisgICAgcmVzdWx0ID0geWllbGQKKyAgICBAZGVidWdfbGlzdGVuZXIuc2VtYW50aWNfcHJlZGljYXRlKCByZXN1bHQsIGRlc2NyaXB0aW9uICkKKyAgICByZXR1cm4gcmVzdWx0CisgIGVuZAorICAKKyAgZGVmIGluX2FsdGVybmF0aXZlKCBhbHRfbnVtYmVyICkKKyAgICBAZGVidWdfbGlzdGVuZXIuZW50ZXJfYWx0ZXJuYXRpdmUoIGFsdF9udW1iZXIgKQorICBlbmQKKyAgCisgIGRlZiBpbl9zdWJydWxlKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIEBkZWJ1Z19saXN0ZW5lci5lbnRlcl9zdWJydWxlKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIHlpZWxkCisgIGVuc3VyZQorICAgIEBkZWJ1Z19saXN0ZW5lci5leGl0X3N1YnJ1bGUoIGRlY2lzaW9uX251bWJlciApCisgIGVuZAorICAKKyAgZGVmIGluX2RlY2lzaW9uKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIEBkZWJ1Z19saXN0ZW5lci5lbnRlcl9kZWNpc2lvbiggZGVjaXNpb25fbnVtYmVyICkKKyAgICB5aWVsZAorICBlbnN1cmUKKyAgICBAZGVidWdfbGlzdGVuZXIuZXhpdF9kZWNpc2lvbiggZGVjaXNpb25fbnVtYmVyICkKKyAgZW5kCitlbmQKKworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkRlYnVnOjpUb2tlblN0cmVhbQorCitBIG1vZHVsZSB0aGF0IHdyYXBzIHRva2VuIHN0cmVhbSBtZXRob2RzIHdpdGggZGVidWdnaW5nIGV2ZW50IGNvZGUuIEEgZGVidWdnYWJsZQorcGFyc2VyIHdpbGwgPHR0PmV4dGVuZDwvdHQ+IGl0cyBpbnB1dCBzdHJlYW0gd2l0aCB0aGlzIG1vZHVsZSBpZiB0aGUgc3RyZWFtIGlzCitub3QgYWxyZWFkeSBhIERlYnVnOjpUb2tlblN0cmVhbS4KKworPWVuZAorbW9kdWxlIFRva2VuU3RyZWFtCisgIAorICBkZWYgc2VsZi53cmFwKCBzdHJlYW0sIGRlYnVnX2xpc3RlbmVyID0gbmlsICkKKyAgICBzdHJlYW0uZXh0ZW5kKCBzZWxmICkKKyAgICBzdHJlYW0uaW5zdGFuY2VfZXZhbCBkbworICAgICAgQGluaXRpYWxfc3RyZWFtX3N0YXRlID0gdHJ1ZQorICAgICAgQGRlYnVnX2xpc3RlbmVyID0gZGVidWdfbGlzdGVuZXIKKyAgICAgIEBsYXN0X21hcmtlciA9IG5pbAorICAgIGVuZAorICAgIHJldHVybiggc3RyZWFtICkKKyAgZW5kCisgIGF0dHJfcmVhZGVyIDpsYXN0X21hcmtlcgorICBhdHRyX2FjY2Vzc29yIDpkZWJ1Z19saXN0ZW5lcgorICAKKyAgZGVmIGNvbnN1bWUKKyAgICBAaW5pdGlhbF9zdHJlYW1fc3RhdGUgYW5kIGNvbnN1bWVfaW5pdGlhbF9oaWRkZW5fdG9rZW5zCisgICAgYSA9IGluZGV4ICsgMSAjIHRoZSBuZXh0IHBvc2l0aW9uIElGIHRoZXJlIGFyZSBubyBoaWRkZW4gdG9rZW5zIGluIGJldHdlZW4KKyAgICB0ID0gc3VwZXIKKyAgICBiID0gaW5kZXggICAgICMgdGhlIGFjdHVhbCBwb3NpdGlvbiBhZnRlciBjb25zdW1pbmcKKyAgICBAZGVidWdfbGlzdGVuZXIuY29uc3VtZV90b2tlbiggdCApIGlmIEBkZWJ1Z19saXN0ZW5lcgorICAgIAorICAgICMgaWYgYiA+IGEsIHJlcG9ydCB0aGUgY29uc3VtcHRpb24gb2YgaGlkZGVuIHRva2VucworICAgIGZvciBpIGluIGEuLi5iCisgICAgICBAZGVidWdfbGlzdGVuZXIuY29uc3VtZV9oaWRkZW5fdG9rZW4gYXQoIGkgKQorICAgIGVuZAorICBlbmQKKyAgCisgIAorICAjIGFmdGVyIGEgdG9rZW4gc3RyZWFtIGZpbGxzIHVwIGl0cyBidWZmZXIKKyAgIyBieSBleGhhdXN0aW5nIGl0cyB0b2tlbiBzb3VyY2UsIGl0IG1heQorICAjIHNraXAgdG8gYW4gaW5pdGlhbCBwb3NpdGlvbiBiZXlvbmQgdGhlIGZpcnN0CisgICMgYWN0dWFsIHRva2VuLCBpZiB0aGVyZSBhcmUgaGlkZGVuIHRva2VucworICAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KKyAgIworICAjIFRoaXMgcHJpdmF0ZSBtZXRob2QgaXMgdXNlZCB0bworICAjIGZpZ3VyZSBvdXQgaWYgYW55IGhpZGRlbiB0b2tlbnMKKyAgIyB3ZXJlIHNraXBwZWQgaW5pdGlhbGx5LCBhbmQgdGhlbgorICAjIHJlcG9ydCB0aGVpciBjb25zdW1wdGlvbiB0bworICAjIHRoZSBkZWJ1ZyBsaXN0ZW5lcgorICBkZWYgY29uc3VtZV9pbml0aWFsX2hpZGRlbl90b2tlbnMKKyAgICBmaXJzdF9vbl9jaGFubmVsX3Rva2VuX2luZGV4ID0gc2VsZi5pbmRleAorICAgIGZpcnN0X29uX2NoYW5uZWxfdG9rZW5faW5kZXgudGltZXMgZG8gfGluZGV4fAorICAgICAgQGRlYnVnX2xpc3RlbmVyLmNvbnN1bWVfaGlkZGVuX3Rva2VuIGF0KCBpbmRleCApCisgICAgZW5kCisgICAgQGluaXRpYWxfc3RyZWFtX3N0YXRlID0gZmFsc2UKKyAgZW5kCisgIAorICBwcml2YXRlIDpjb25zdW1lX2luaXRpYWxfaGlkZGVuX3Rva2VucworICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU3RyZWFtIE1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgCisgIGRlZiBsb29rKCBzdGVwcyA9IDEgKQorICAgIEBpbml0aWFsX3N0cmVhbV9zdGF0ZSBhbmQgY29uc3VtZV9pbml0aWFsX2hpZGRlbl90b2tlbnMKKyAgICB0b2tlbiA9IHN1cGVyKCBzdGVwcyApCisgICAgQGRlYnVnX2xpc3RlbmVyLmxvb2soIHN0ZXBzLCB0b2tlbiApCisgICAgcmV0dXJuIHRva2VuCisgIGVuZAorICAKKyAgZGVmIHBlZWsoIHN0ZXBzID0gMSApCisgICAgbG9vayggc3RlcHMgKS50eXBlCisgIGVuZAorICAKKyAgZGVmIG1hcmsKKyAgICBAbGFzdF9tYXJrZXIgPSBzdXBlcgorICAgIEBkZWJ1Z19saXN0ZW5lci5tYXJrKCBAbGFzdF9tYXJrZXIgKQorICAgIHJldHVybiBAbGFzdF9tYXJrZXIKKyAgZW5kCisgIAorICBkZWYgcmV3aW5kKCBtYXJrZXIgPSBuaWwsIHJlbGVhc2UgPSB0cnVlICkKKyAgICBAZGVidWdfbGlzdGVuZXIucmV3aW5kKCBtYXJrZXIgKQorICAgIHN1cGVyCisgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RGVidWc6OkV2ZW50TGlzdGVuZXIKKworQSBsaXN0ZW5lciB0aGF0IHNpbXBseSByZWNvcmRzIHRleHQgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBldmVudHMuIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHRoZQorZGVidWdnaW5nIGZhY2lsaXR5IDspIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoZSByZWNvcmQoKSBtZXRob2QgKHdoaWNoIGRlZmF1bHRzIHRvIHByaW50aW5nCit0byBzdGRvdXQpIHRvIHJlY29yZCB0aGUgZXZlbnRzIGluIGEgZGlmZmVyZW50IHdheS4KKworPWVuZAorbW9kdWxlIEV2ZW50TGlzdGVuZXIKKyAgUFJPVE9DT0xfVkVSU0lPTiA9ICcyJworICAjIFRoZSBwYXJzZXIgaGFzIGp1c3QgZW50ZXJlZCBhIHJ1bGUuIE5vIGRlY2lzaW9uIGhhcyBiZWVuIG1hZGUgYWJvdXQKKyAgIyB3aGljaCBhbHQgaXMgcHJlZGljdGVkLiAgVGhpcyBpcyBmaXJlZCBBRlRFUiBpbml0IGFjdGlvbnMgaGF2ZSBiZWVuCisgICMgZXhlY3V0ZWQuICBBdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGFuZCBhdmFpbGFibGUgZXRjLi4uCisgICMgVGhlIGdyYW1tYXJGaWxlTmFtZSBhbGxvd3MgY29tcG9zaXRlIGdyYW1tYXJzIHRvIGp1bXAgYXJvdW5kIGFtb25nCisgICMgbXVsdGlwbGUgZ3JhbW1hciBmaWxlcy4KKyAgCisgIGRlZiBlbnRlcl9ydWxlKCBncmFtbWFyX2ZpbGUsIHJ1bGVfbmFtZSApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorICAKKyAgIyBCZWNhdXNlIHJ1bGVzIGNhbiBoYXZlIGxvdHMgb2YgYWx0ZXJuYXRpdmVzLCBpdCBpcyB2ZXJ5IHVzZWZ1bCB0bworICAjIGtub3cgd2hpY2ggYWx0IHlvdSBhcmUgZW50ZXJpbmcuICBUaGlzIGlzIDEuLm4gZm9yIG4gYWx0cy4KKyAgCisgIGRlZiBlbnRlcl9hbHRlcm5hdGl2ZSggYWx0ICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisgIAorICAjIFRoaXMgaXMgdGhlIGxhc3QgdGhpbmcgZXhlY3V0ZWQgYmVmb3JlIGxlYXZpbmcgYSBydWxlLiAgSXQgaXMKKyAgIyBleGVjdXRlZCBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBUaGlzIGlzIHRyaWdnZXJlZCBhZnRlcgorICAjIGVycm9yIHJlcG9ydGluZyBhbmQgcmVjb3ZlcnkgaGF2ZSBvY2N1cnJlZCAodW5sZXNzIHRoZSBleGNlcHRpb24gaXMKKyAgIyBub3QgY2F1Z2h0IGluIHRoaXMgcnVsZSkuICBUaGlzIGltcGxpZXMgYW4gImV4aXRBbHQiIGV2ZW50LgorICAjIFRoZSBncmFtbWFyRmlsZU5hbWUgYWxsb3dzIGNvbXBvc2l0ZSBncmFtbWFycyB0byBqdW1wIGFyb3VuZCBhbW9uZworICAjIG11bHRpcGxlIGdyYW1tYXIgZmlsZXMuCisgIAorICBkZWYgZXhpdF9ydWxlKCBncmFtbWFyX2ZpbGUsIHJ1bGVfbmFtZSApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorCisgICMgVHJhY2sgZW50cnkgaW50byBhbnkgKC4uLikgc3VicnVsZSBvdGhlciBFQk5GIGNvbnN0cnVjdAorICAKKyAgZGVmIGVudGVyX3N1YnJ1bGUoIGRlY2lzaW9uX251bWJlciApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorCisgIGRlZiBleGl0X3N1YnJ1bGUoIGRlY2lzaW9uX251bWJlciApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorICAKKyAgIyBFdmVyeSBkZWNpc2lvbiwgZml4ZWQgayBvciBhcmJpdHJhcnksIGhhcyBhbiBlbnRlci9leGl0IGV2ZW50CisgICMgc28gdGhhdCBhIEdVSSBjYW4gZWFzaWx5IHRyYWNrIHdoYXQgbG9vay9jb25zdW1lIGV2ZW50cyBhcmUKKyAgIyBhc3NvY2lhdGVkIHdpdGggcHJlZGljdGlvbi4gIFlvdSB3aWxsIHNlZSBhIHNpbmdsZSBlbnRlci9leGl0CisgICMgc3VicnVsZSBidXQgbXVsdGlwbGUgZW50ZXIvZXhpdCBkZWNpc2lvbiBldmVudHMsIG9uZSBmb3IgZWFjaAorICAjIGxvb3AgaXRlcmF0aW9uLgorICAKKyAgZGVmIGVudGVyX2RlY2lzaW9uKCBkZWNpc2lvbl9udW1iZXIgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICBkZWYgZXhpdF9kZWNpc2lvbiggZGVjaXNpb25fbnVtYmVyICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBBbiBpbnB1dCB0b2tlbiB3YXMgY29uc3VtZWQ7IG1hdGNoZWQgYnkgYW55IGtpbmQgb2YgZWxlbWVudC4KKyAgIyBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorICAKKyAgZGVmIGNvbnN1bWVfdG9rZW4oIHRyZWUgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICAjIEFuIG9mZi1jaGFubmVsIGlucHV0IHRva2VuIHdhcyBjb25zdW1lZC4KKyAgIyBUcmlnZ2VyIGFmdGVyIHRoZSB0b2tlbiB3YXMgbWF0Y2hlZCBieSB0aGluZ3MgbGlrZSBtYXRjaCgpLCBtYXRjaEFueSgpLgorICAjICh1bmxlc3Mgb2YgY291cnNlIHRoZSBoaWRkZW4gdG9rZW4gaXMgZmlyc3Qgc3R1ZmYgaW4gdGhlIGlucHV0IHN0cmVhbSkuCisgIAorICBkZWYgY29uc3VtZV9oaWRkZW5fdG9rZW4oIHRyZWUgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICAjIFNvbWVib2R5IChhbnlib2R5KSBsb29rZWQgYWhlYWQuICBOb3RlIHRoYXQgdGhpcyBhY3R1YWxseSBnZXRzCisgICMgdHJpZ2dlcmVkIGJ5IGJvdGggcGVlayBhbmQgbG9vayBjYWxscy4gIFRoZSBkZWJ1Z2dlciB3aWxsIHdhbnQgdG8ga25vdworICAjIHdoaWNoIFRva2VuIG9iamVjdCB3YXMgZXhhbWluZWQuICBMaWtlIGNvbnN1bWVUb2tlbiwgdGhpcyBpbmRpY2F0ZXMKKyAgIyB3aGF0IHRva2VuIHdhcyBzZWVuIGF0IHRoYXQgZGVwdGguICBBIHJlbW90ZSBkZWJ1Z2dlciBjYW5ub3QgbG9vaworICAjIGFoZWFkIGludG8gYSBmaWxlIGl0IGRvZXNuJ3QgaGF2ZSBzbyBsb29rIGV2ZW50cyBtdXN0IHBhc3MgdGhlIHRva2VuCisgICMgZXZlbiBpZiB0aGUgaW5mbyBpcyByZWR1bmRhbnQuCisgIAorICBkZWYgbG9vayggaSwgdHJlZSApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorCisgICMgVGhlIHBhcnNlciBpcyBnb2luZyB0byBsb29rIGFyYml0cmFyaWx5IGFoZWFkOyBtYXJrIHRoaXMgbG9jYXRpb24sCisgICMgdGhlIHRva2VuIHN0cmVhbSdzIG1hcmtlciBpcyBzZW50IGluIGNhc2UgeW91IG5lZWQgaXQuCisgIAorICBkZWYgbWFyayggbWFya2VyICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBBZnRlciBhbiBhcmJpdHJhaXJseSBsb25nIGxvb2sgYXMgd2l0aCBhIGN5Y2xpYyBERkEgKG9yIHdpdGgKKyAgIyBhbnkgYmFja3RyYWNrKSwgdGhpcyBpbmZvcm1zIHRoZSBkZWJ1Z2dlciB0aGF0IHN0cmVhbSBzaG91bGQgYmUKKyAgIyByZXdvdW5kIHRvIHRoZSBwb3NpdGlvbiBhc3NvY2lhdGVkIHdpdGggbWFya2VyLgorICAKKyAgZGVmIHJld2luZCggbWFya2VyID0gbmlsICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgZGVmIGJlZ2luX2JhY2t0cmFjayggbGV2ZWwgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICBkZWYgZW5kX2JhY2t0cmFjayggbGV2ZWwsIHN1Y2Nlc3NmdWwgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKyAgCisgIGRlZiBiYWNrdHJhY2soIGxldmVsICkKKyAgICBiZWdpbl9iYWNrdHJhY2soIGxldmVsICkKKyAgICBzdWNjZXNzZnVsID0geWllbGQoIHNlbGYgKQorICAgIGVuZF9iYWNrdHJhY2soIGxldmVsLCBzdWNjZXNzZnVsICkKKyAgZW5kCisKKyAgIyBUbyB3YXRjaCBhIHBhcnNlciBtb3ZlIHRocm91Z2ggdGhlIGdyYW1tYXIsIHRoZSBwYXJzZXIgbmVlZHMgdG8KKyAgIyBpbmZvcm0gdGhlIGRlYnVnZ2VyIHdoYXQgbGluZS9jaGFyUG9zIGl0IGlzIHBhc3NpbmcgaW4gdGhlIGdyYW1tYXIuCisgICMgRm9yIG5vdywgdGhpcyBkb2VzIG5vdCBrbm93IGhvdyB0byBzd2l0Y2ggZnJvbSBvbmUgZ3JhbW1hciB0byB0aGUKKyAgIyBvdGhlciBhbmQgYmFjayBmb3IgaXNsYW5kIGdyYW1tYXJzIGV0Yy4uLgorICAjIFRoaXMgc2hvdWxkIGFsc28gYWxsb3cgYnJlYWtwb2ludHMgYmVjYXVzZSB0aGUgZGVidWdnZXIgY2FuIHN0b3AKKyAgIyB0aGUgcGFyc2VyIHdoZW5ldmVyIGl0IGhpdHMgdGhpcyBsaW5lL3Bvcy4KKyAgCisgIGRlZiBsb2NhdGlvbiggbGluZSwgcG9zaXRpb24gKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICAjIEEgcmVjb2duaXRpb24gZXhjZXB0aW9uIG9jY3VycmVkIHN1Y2ggYXMgTm9WaWFibGVBbHRFcnJvci4gIEkgbWFkZQorICAjIHRoaXMgYSBnZW5lcmljIGV2ZW50IHNvIHRoYXQgSSBjYW4gYWx0ZXIgdGhlIGV4Y2VwdGlvbiBoaWVyYWNoeSBsYXRlcgorICAjIHdpdGhvdXQgaGF2aW5nIHRvIGFsdGVyIGFsbCB0aGUgZGVidWcgb2JqZWN0cy4KKyAgIyBVcG9uIGVycm9yLCB0aGUgc3RhY2sgb2YgZW50ZXIgcnVsZS9zdWJydWxlIG11c3QgYmUgcHJvcGVybHkgdW53b3VuZC4KKyAgIyBJZiBubyB2aWFibGUgYWx0IG9jY3VycyBpdCBpcyB3aXRoaW4gYW4gZW50ZXIvZXhpdCBkZWNpc2lvbiwgd2hpY2gKKyAgIyBhbHNvIG11c3QgYmUgcmV3b3VuZC4gIEV2ZW4gdGhlIHJld2luZCBmb3IgZWFjaCBtYXJrIG11c3QgYmUgdW53b3VudC4KKyAgIyBJbiB0aGUgSmF2YSB0YXJnZXQgdGhpcyBpcyBwcmV0dHkgZWFzeSB1c2luZyB0cnkvZmluYWxseSwgaWYgYSBiaXQKKyAgIyB1Z2x5IGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRoZSByZXdpbmQgaXMgZ2VuZXJhdGVkIGluIERGQS5wcmVkaWN0KCkKKyAgIyBhY3R1YWxseSBzbyBubyBjb2RlIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBmb3IgdGhhdC4gIEZvciBsYW5ndWFnZXMKKyAgIyB3L28gdGhpcyAiZmluYWxseSIgZmVhdHVyZSAoQysrPyksIHRoZSB0YXJnZXQgaW1wbGVtZW50b3Igd2lsbCBoYXZlCisgICMgdG8gYnVpbGQgYW4gZXZlbnQgc3RhY2sgb3Igc29tZXRoaW5nLgorICAjIEFjcm9zcyBhIHNvY2tldCBmb3IgcmVtb3RlIGRlYnVnZ2luZywgb25seSB0aGUgUmVjb2duaXRpb25FcnJvcgorICAjIGRhdGEgZmllbGRzIGFyZSB0cmFuc21pdHRlZC4gIFRoZSB0b2tlbiBvYmplY3Qgb3Igd2hhdGV2ZXIgdGhhdAorICAjIGNhdXNlZCB0aGUgcHJvYmxlbSB3YXMgdGhlIGxhc3Qgb2JqZWN0IHJlZmVyZW5jZWQgYnkgbG9vay4gIFRoZQorICAjIGltbWVkaWF0ZWx5IHByZWNlZGluZyBsb29rIGV2ZW50IHNob3VsZCBob2xkIHRoZSB1bmV4cGVjdGVkIFRva2VuIG9yCisgICMgY2hhci4KKyAgIyBIZXJlIGlzIGEgc2FtcGxlIGV2ZW50IHRyYWNlIGZvciBncmFtbWFyOgorICAjIGIgOiBDICh7O31BfEIpIC8vIHs7fSBpcyB0aGVyZSB0byBwcmV2ZW50IEF8QiBiZWNvbWluZyBhIHNldAorICAjIHwgRAorICAjIDsKKyAgIyBUaGUgc2VxdWVuY2UgZm9yIHRoaXMgcnVsZSAod2l0aCBubyB2aWFibGUgYWx0IGluIHRoZSBzdWJydWxlKSBmb3IKKyAgIyBpbnB1dCAnYyBjJyAodGhlcmUgYXJlIDMgdG9rZW5zKSBpczoKKyAgIyBjb21tZW5jZQorICAjIGxvb2sKKyAgIyBlbnRlclJ1bGUgYgorICAjIGxvY2F0aW9uIDcgMQorICAjIGVudGVyIGRlY2lzaW9uIDMKKyAgIyBsb29rCisgICMgZXhpdCBkZWNpc2lvbiAzCisgICMgZW50ZXJBbHQxCisgICMgbG9jYXRpb24gNyA1CisgICMgbG9vaworICAjIGNvbnN1bWVUb2tlbiBbYy88ND4sMTowXQorICAjIGxvY2F0aW9uIDcgNworICAjIGVudGVyU3ViUnVsZSAyCisgICMgZW50ZXIgZGVjaXNpb24gMgorICAjIGxvb2sKKyAgIyBsb29rCisgICMgcmVjb2duaXRpb25FcnJvciBOb1ZpYWJsZUFsdEVycm9yIDIgMSAyCisgICMgZXhpdCBkZWNpc2lvbiAyCisgICMgZXhpdFN1YlJ1bGUgMgorICAjIGJlZ2luUmVzeW5jCisgICMgbG9vaworICAjIGNvbnN1bWVUb2tlbiBbYy88ND4sMToxXQorICAjIGxvb2sKKyAgIyBlbmRSZXN5bmMKKyAgIyBsb29rKC0xKQorICAjIGV4aXRSdWxlIGIKKyAgIyB0ZXJtaW5hdGUKKyAgCisgIGRlZiByZWNvZ25pdGlvbl9leGNlcHRpb24oIGV4Y2VwdGlvbiApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorCisgICMgSW5kaWNhdGVzIHRoZSByZWNvZ25pemVyIGlzIGFib3V0IHRvIGNvbnN1bWUgdG9rZW5zIHRvIHJlc3luY2hyb25pemUKKyAgIyB0aGUgcGFyc2VyLiAgQW55IGNvbnN1bWUgZXZlbnRzIGZyb20gaGVyZSB1bnRpbCB0aGUgcmVjb3ZlcmVkIGV2ZW50CisgICMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXJzZS0tdGhleSBhcmUgZGVhZCB0b2tlbnMuCisgIAorICBkZWYgYmVnaW5fcmVzeW5jKCkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb2duaXplciBoYXMgZmluaXNoZWQgY29uc3VtaW5nIHRva2VucyBpbiBvcmRlcgorICAjIHRvIHJlc3ljaHJvbml6ZS4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBiZWdpblJlc3luYy9lbmRSZXN5bmMgcGFpcnMKKyAgIyBiZWZvcmUgdGhlIHJlY29nbml6ZXIgY29tZXMgb3V0IG9mIGVycm9yUmVjb3ZlcnkgbW9kZSAoaW4gd2hpY2gKKyAgIyBtdWx0aXBsZSBlcnJvcnMgYXJlIHN1cHByZXNzZWQpLiAgVGhpcyB3aWxsIGJlIHVzZWZ1bAorICAjIGluIGEgZ3VpIHdoZXJlIHlvdSB3YW50IHRvIHByb2JhYmx5IGdyZXkgb3V0IHRva2VucyB0aGF0IGFyZSBjb25zdW1lZAorICAjIGJ1dCBub3QgbWF0Y2hlZCB0byBhbnl0aGluZyBpbiBncmFtbWFyLiAgQW55dGhpbmcgYmV0d2VlbgorICAjIGEgYmVnaW5SZXN5bmMvZW5kUmVzeW5jIHBhaXIgd2FzIHRvc3NlZCBvdXQgYnkgdGhlIHBhcnNlci4KKyAgCisgIGRlZiBlbmRfcmVzeW5jKCkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisgIAorICBkZWYgcmVzeW5jCisgICAgYmVnaW5fcmVzeW5jCisgICAgeWllbGQoIHNlbGYgKQorICAgIGVuZF9yZXN5bmMKKyAgZW5kCisKKyAgIyBBIHNlbWFudGljIHByZWRpY2F0ZSB3YXMgZXZhbHVhdGUgd2l0aCB0aGlzIHJlc3VsdCBhbmQgYWN0aW9uIHRleHQKKyAgCisgIGRlZiBzZW1hbnRpY19wcmVkaWNhdGUoIHJlc3VsdCwgcHJlZGljYXRlICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisgIAorICAjIEFubm91bmNlIHRoYXQgcGFyc2luZyBoYXMgYmVndW4uICBOb3QgdGVjaG5pY2FsbHkgdXNlZnVsIGV4Y2VwdCBmb3IKKyAgIyBzZW5kaW5nIGV2ZW50cyBvdmVyIGEgc29ja2V0LiAgQSBHVUkgZm9yIGV4YW1wbGUgd2lsbCBsYXVuY2ggYSB0aHJlYWQKKyAgIyB0byBjb25uZWN0IGFuZCBjb21tdW5pY2F0ZSB3aXRoIGEgcmVtb3RlIHBhcnNlci4gIFRoZSB0aHJlYWQgd2lsbCB3YW50CisgICMgdG8gbm90aWZ5IHRoZSBHVUkgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbWFkZS4gIEFOVExSIHBhcnNlcnMKKyAgIyB0cmlnZ2VyIHRoaXMgdXBvbiBlbnRyeSB0byB0aGUgZmlyc3QgcnVsZSAodGhlIHJ1bGVMZXZlbCBpcyB1c2VkIHRvCisgICMgZmlndXJlIHRoaXMgb3V0KS4KKyAgCisgIGRlZiBjb21tZW5jZSggICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBQYXJzaW5nIGlzIG92ZXI7IHN1Y2Nlc3NmdWxseSBvciBub3QuICBNb3N0bHkgdXNlZnVsIGZvciB0ZWxsaW5nCisgICMgcmVtb3RlIGRlYnVnZ2luZyBsaXN0ZW5lcnMgdGhhdCBpdCdzIHRpbWUgdG8gcXVpdC4gIFdoZW4gdGhlIHJ1bGUKKyAgIyBpbnZvY2F0aW9uIGxldmVsIGdvZXMgdG8gemVybyBhdCB0aGUgZW5kIG9mIGEgcnVsZSwgd2UgYXJlIGRvbmUKKyAgIyBwYXJzaW5nLgorICAKKyAgZGVmIHRlcm1pbmF0ZSggICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBJbnB1dCBmb3IgYSB0cmVlIHBhcnNlciBpcyBhbiBBU1QsIGJ1dCB3ZSBrbm93IG5vdGhpbmcgZm9yIHN1cmUKKyAgIyBhYm91dCBhIG5vZGUgZXhjZXB0IGl0cyB0eXBlIGFuZCB0ZXh0IChvYnRhaW5lZCBmcm9tIHRoZSBhZGFwdG9yKS4KKyAgIyBUaGlzIGlzIHRoZSBhbmFsb2cgb2YgdGhlIGNvbnN1bWVUb2tlbiBtZXRob2QuICBBZ2FpbiwgdGhlIElEIGlzCisgICMgdGhlIGhhc2hDb2RlIHVzdWFsbHkgb2YgdGhlIG5vZGUgc28gaXQgb25seSB3b3JrcyBpZiBoYXNoQ29kZSBpcworICAjIG5vdCBpbXBsZW1lbnRlZC4gIElmIHRoZSB0eXBlIGlzIFVQIG9yIERPV04sIHRoZW4KKyAgIyB0aGUgSUQgaXMgbm90IHJlYWxseSBtZWFuaW5nZnVsIGFzIGl0J3MgZml4ZWQtLXRoZXJlIGlzCisgICMganVzdCBvbmUgVVAgbm9kZSBhbmQgb25lIERPV04gbmF2aWdhdGlvbiBub2RlLgorICAKKyAgZGVmIGNvbnN1bWVfbm9kZSggdHJlZSApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorICAKKyAgIyBBIG5pbCB3YXMgY3JlYXRlZCAoZXZlbiBuaWwgbm9kZXMgaGF2ZSBhIHVuaXF1ZSBJRC4uLgorICAjIHRoZXkgYXJlIG5vdCAibnVsbCIgcGVyIHNlKS4gIEFzIG9mIDQvMjgvMjAwNiwgdGhpcworICAjIHNlZW1zIHRvIGJlIHVuaXF1ZWx5IHRyaWdnZXJlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IHN1YnRyZWUKKyAgIyBzdWNoIGFzIHdoZW4gZW50ZXJpbmcgYSBzdWJydWxlIGluIGF1dG9tYXRpYyBtb2RlIGFuZCB3aGVuCisgICMgYnVpbGRpbmcgYSB0cmVlIGluIHJld3JpdGUgbW9kZS4KKyAgIyBJZiB5b3UgYXJlIHJlY2VpdmluZyB0aGlzIGV2ZW50IG92ZXIgYSBzb2NrZXQgdmlhCisgICMgUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIHRoZW4gb25seSB0cmVlLklEIGlzIHNldC4KKyAgCisgIGRlZiBmbGF0X25vZGUoIHRyZWUgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICAjIFVwb24gc3ludGF4IGVycm9yLCByZWNvZ25pemVycyBicmFja2V0IHRoZSBlcnJvciB3aXRoIGFuIGVycm9yIG5vZGUKKyAgIyBpZiB0aGV5IGFyZSBidWlsZGluZyBBU1RzLgorICAKKyAgZGVmIGVycm9yX25vZGUoIHRyZWUgKQorICAgICMgZG8gbm90aGluZworICBlbmQKKworICAjIEFubm91bmNlIGEgbmV3IG5vZGUgYnVpbHQgZnJvbSB0b2tlbiBlbGVtZW50cyBzdWNoIGFzIHR5cGUgZXRjLi4uCisgICMgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAjIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgdHJlZS5JRCwgdHlwZSwgdGV4dCBhcmUKKyAgIyBzZXQuCisgIAorICBkZWYgY3JlYXRlX25vZGUoIG5vZGUsIHRva2VuID0gbmlsICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBNYWtlIGEgbm9kZSB0aGUgbmV3IHJvb3Qgb2YgYW4gZXhpc3Rpbmcgcm9vdC4KKyAgIyBOb3RlOiB0aGUgbmV3Um9vdElEIHBhcmFtZXRlciBpcyBwb3NzaWJseSBkaWZmZXJlbnQKKyAgIyB0aGFuIHRoZSBUcmVlQWRhcHRvci5iZWNvbWVSb290KCkgbmV3Um9vdCBwYXJhbWV0ZXIuCisgICMgSW4gb3VyIGNhc2UsIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZworICAjIFRyZWVBZGFwdG9yLmJlY29tZVJvb3QoKSBhbmQgbm90IHJvb3RfbiBvciB3aGF0ZXZlci4KKyAgIyBUaGUgbGlzdGVuZXIgc2hvdWxkIGFzc3VtZSB0aGF0IHRoaXMgZXZlbnQgb2NjdXJzCisgICMgb25seSB3aGVuIHRoZSBjdXJyZW50IHN1YnJ1bGUgKG9yIHJ1bGUpIHN1YnRyZWUgaXMKKyAgIyBiZWluZyByZXNldCB0byBuZXdSb290SUQuCisgICMgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAjIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgSURzIGFyZSBzZXQuCisgICMgQHNlZSBhbnRscjMudHJlZS5UcmVlQWRhcHRvci5iZWNvbWVSb290KCkKKyAgCisgIGRlZiBiZWNvbWVfcm9vdCggbmV3X3Jvb3QsIG9sZF9yb290ICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisKKyAgIyBNYWtlIGNoaWxkSUQgYSBjaGlsZCBvZiByb290SUQuCisgICMgSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBldmVudCBvdmVyIGEgc29ja2V0IHZpYQorICAjIFJlbW90ZURlYnVnRXZlbnRTb2NrZXRMaXN0ZW5lciB0aGVuIG9ubHkgSURzIGFyZSBzZXQuCisgICMgQHNlZSBhbnRscjMudHJlZS5UcmVlQWRhcHRvci5hZGRDaGlsZCgpCisgIAorICBkZWYgYWRkX2NoaWxkKCByb290LCBjaGlsZCApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorCisgICMgU2V0IHRoZSB0b2tlbiBzdGFydC9zdG9wIHRva2VuIGluZGV4IGZvciBhIHN1YnRyZWUgcm9vdCBvciBub2RlLgorICAjIElmIHlvdSBhcmUgcmVjZWl2aW5nIHRoaXMgZXZlbnQgb3ZlciBhIHNvY2tldCB2aWEKKyAgIyBSZW1vdGVEZWJ1Z0V2ZW50U29ja2V0TGlzdGVuZXIgdGhlbiBvbmx5IHRyZWUuSUQgaXMgc2V0LgorICAKKyAgZGVmIHNldF90b2tlbl9ib3VuZGFyaWVzKCB0cmVlLCB0b2tlbl9zdGFydF9pbmRleCwgdG9rZW5fc3RvcF9pbmRleCApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorICAKKyAgZGVmIGV4YW1pbmVfcnVsZV9tZW1vaXphdGlvbiggcnVsZSApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorICAKKyAgZGVmIG9uKCBldmVudF9uYW1lLCAmYmxvY2sgKQorICAgIHNjbGFzcyA9IGNsYXNzIDw8IHNlbGY7IHNlbGY7IGVuZAorICAgIHNjbGFzcy5zZW5kKCA6ZGVmaW5lX21ldGhvZCwgZXZlbnRfbmFtZSwgJmJsb2NrICkKKyAgZW5kCisgIAorICBFVkVOVFMgPSBbIAorICAgIDphZGRfY2hpbGQsIDpiYWNrdHJhY2ssIDpiZWNvbWVfcm9vdCwgOmJlZ2luX2JhY2t0cmFjaywKKyAgICA6YmVnaW5fcmVzeW5jLCA6Y29tbWVuY2UsIDpjb25zdW1lX2hpZGRlbl90b2tlbiwKKyAgICA6Y29uc3VtZV9ub2RlLCA6Y29uc3VtZV90b2tlbiwgOmNyZWF0ZV9ub2RlLCA6ZW5kX2JhY2t0cmFjaywKKyAgICA6ZW5kX3Jlc3luYywgOmVudGVyX2FsdGVybmF0aXZlLCA6ZW50ZXJfZGVjaXNpb24sIDplbnRlcl9ydWxlLAorICAgIDplbnRlcl9zdWJfcnVsZSwgOmVycm9yX25vZGUsIDpleGl0X2RlY2lzaW9uLCA6ZXhpdF9ydWxlLAorICAgIDpleGl0X3N1Yl9ydWxlLCA6ZmxhdF9ub2RlLCA6bG9jYXRpb24sIDpsb29rLCA6bWFyaywKKyAgICA6cmVjb2duaXRpb25fZXhjZXB0aW9uLCA6cmVzeW5jLCA6cmV3aW5kLAorICAgIDpzZW1hbnRpY19wcmVkaWNhdGUsIDpzZXRfdG9rZW5fYm91bmRhcmllcywgOnRlcm1pbmF0ZQorICBdLmZyZWV6ZQorCitlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvZXZlbnQtaHViLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL2RlYnVnL2V2ZW50LWh1Yi5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzhmOTNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL2RlYnVnL2V2ZW50LWh1Yi5yYgpAQCAtMCwwICsxLDIxMCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCittb2R1bGUgQU5UTFIzCittb2R1bGUgRGVidWcKKz1iZWdpbiByZG9jIEFOVExSMzo6RGVidWc6OkV2ZW50SHViCisKK0Egc3BlY2lhbCBldmVudCBsaXN0ZW5lciB0aGF0IGludGVyY2VwdHMgZGVidWcgZXZlbnRzIGFuZCBmb3J3YXJkcyB0aGVtIHRvIG90aGVyCitkZWJ1ZyBldmVudCBsaXN0bmVycy4gQXMgZGVidWctbW9kZSByZWNvZ25pemVycyBhcmUgYWJsZSB0byBzZW5kIGV2ZW50CitpbmZvcm1hdGlvbiB0byBvbmx5IG9uZSBsaXN0ZW5lciwgRXZlbnRIdWJzIHByb3ZpZGUgYSBzaW1wbGUgc29sdXRpb24gaW4KK3NpdHVhdGlvbnMgd2hlcmUgbXVsdGlwbGUgZXZlbnQgbGlzdG5lcnMgYXJlIGRlc2lyZWQuCisKKz1lbmQKK2NsYXNzIEV2ZW50SHViCisgIGluY2x1ZGUgQU5UTFIzOjpEZWJ1Zzo6RXZlbnRMaXN0ZW5lcgorICBhdHRyX3JlYWRlciA6bGlzdGVuZXJzCisgIAorICBkZWYgaW5pdGlhbGl6ZSggKmxpc3RlbmVycyApCisgICAgQGxpc3RlbmVycyA9IFsgbGlzdGVuZXJzIF0uZmxhdHRlbiEKKyAgICBAbGlzdGVuZXJzLmNvbXBhY3QhCisgIGVuZAorICAKKyAgZGVmIGFkZCggKmxpc3RlbmVycyApCisgICAgQGxpc3RlbmVycy5wdXNoKCAqbGlzdGVuZXJzICkKKyAgZW5kCisKKyAgZGVmIGFkZF9jaGlsZCggcm9vdCwgY2hpbGQgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5hZGRfY2hpbGQoIHJvb3QsIGNoaWxkICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgYmFja3RyYWNrKCBsZXZlbCApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLmJhY2t0cmFjayggbGV2ZWwgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBiZWNvbWVfcm9vdCggbmV3X3Jvb3QsIG9sZF9yb290ICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuYmVjb21lX3Jvb3QoIG5ld19yb290LCBvbGRfcm9vdCApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGJlZ2luX2JhY2t0cmFjayggbGV2ZWwgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5iZWdpbl9iYWNrdHJhY2soIGxldmVsICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgYmVnaW5fcmVzeW5jKCkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuYmVnaW5fcmVzeW5jKCkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgY29tbWVuY2UoKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5jb21tZW5jZSgpCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGNvbnN1bWVfaGlkZGVuX3Rva2VuKCB0cmVlICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuY29uc3VtZV9oaWRkZW5fdG9rZW4oIHRyZWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBjb25zdW1lX25vZGUoIHRyZWUgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5jb25zdW1lX25vZGUoIHRyZWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBjb25zdW1lX3Rva2VuKCB0cmVlICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuY29uc3VtZV90b2tlbiggdHJlZSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV9ub2RlKCBub2RlLCB0b2tlbiApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLmNyZWF0ZV9ub2RlKCBub2RlLCB0b2tlbiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGVuZF9iYWNrdHJhY2soIGxldmVsLCBzdWNjZXNzZnVsICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuZW5kX2JhY2t0cmFjayggbGV2ZWwsIHN1Y2Nlc3NmdWwgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBlbmRfcmVzeW5jKCkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuZW5kX3Jlc3luYygpCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGVudGVyX2FsdGVybmF0aXZlKCBhbHQgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5lbnRlcl9hbHRlcm5hdGl2ZSggYWx0ICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgZW50ZXJfZGVjaXNpb24oIGRlY2lzaW9uX251bWJlciApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLmVudGVyX2RlY2lzaW9uKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBlbnRlcl9ydWxlKCBncmFtbWFyX2ZpbGVfbmFtZSwgcnVsZV9uYW1lICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIuZW50ZXJfcnVsZSggZ3JhbW1hcl9maWxlX25hbWUsIHJ1bGVfbmFtZSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGVudGVyX3N1Yl9ydWxlKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5lbnRlcl9zdWJfcnVsZSggZGVjaXNpb25fbnVtYmVyICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgZXJyb3Jfbm9kZSggdHJlZSApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLmVycm9yX25vZGUoIHRyZWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBleGl0X2RlY2lzaW9uKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5leGl0X2RlY2lzaW9uKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBleGl0X3J1bGUoIGdyYW1tYXJfZmlsZV9uYW1lLCBydWxlX25hbWUgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5leGl0X3J1bGUoIGdyYW1tYXJfZmlsZV9uYW1lLCBydWxlX25hbWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBleGl0X3N1Yl9ydWxlKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5leGl0X3N1Yl9ydWxlKCBkZWNpc2lvbl9udW1iZXIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBmbGF0X25vZGUoIHRyZWUgKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5mbGF0X25vZGUoIHRyZWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBsb2NhdGlvbiggbGluZSwgcG9zaXRpb24gKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5sb2NhdGlvbiggbGluZSwgcG9zaXRpb24gKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBsb29rKCBpLCB0cmVlICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIubG9vayggaSwgdHJlZSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIG1hcmsoIG1hcmtlciApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLm1hcmsoIG1hcmtlciApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHJlY29nbml0aW9uX2V4Y2VwdGlvbiggZXhjZXB0aW9uICkKKyAgICBmb3IgbGlzdGVuZXIgaW4gQGxpc3RlbmVycworICAgICAgbGlzdGVuZXIucmVjb2duaXRpb25fZXhjZXB0aW9uKCBleGNlcHRpb24gKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiByZXN5bmMoKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5yZXN5bmMoKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiByZXdpbmQoIG1hcmtlciApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLnJld2luZCggbWFya2VyICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgc2VtYW50aWNfcHJlZGljYXRlKCByZXN1bHQsIHByZWRpY2F0ZSApCisgICAgZm9yIGxpc3RlbmVyIGluIEBsaXN0ZW5lcnMKKyAgICAgIGxpc3RlbmVyLnNlbWFudGljX3ByZWRpY2F0ZSggcmVzdWx0LCBwcmVkaWNhdGUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBzZXRfdG9rZW5fYm91bmRhcmllcyggdHJlZSwgdG9rZW5fc3RhcnRfaW5kZXgsIHRva2VuX3N0b3BfaW5kZXggKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci5zZXRfdG9rZW5fYm91bmRhcmllcyggdHJlZSwgdG9rZW5fc3RhcnRfaW5kZXgsIHRva2VuX3N0b3BfaW5kZXggKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB0ZXJtaW5hdGUoKQorICAgIGZvciBsaXN0ZW5lciBpbiBAbGlzdGVuZXJzCisgICAgICBsaXN0ZW5lci50ZXJtaW5hdGUoKQorICAgIGVuZAorICBlbmQKKyAgCitlbmQKKworZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZWJ1Zy9yZWNvcmQtZXZlbnQtbGlzdGVuZXIucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvcmVjb3JkLWV2ZW50LWxpc3RlbmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGQyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvcmVjb3JkLWV2ZW50LWxpc3RlbmVyLnJiCkBAIC0wLDAgKzEsMjUgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworbW9kdWxlIEFOVExSMworbW9kdWxlIERlYnVnCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RGVidWc6OlJlY29yZEV2ZW50TGlzdGVuZXIKKworQSBkZWJ1ZyBsaXN0ZW5lciB0aGF0IHJlY29yZHMgaW50ZXJjZXB0ZWQgZXZlbnRzIGFzIHN0cmluZ3MgaW4gYW4gYXJyYXkuCisKKz1lbmQKK2NsYXNzIFJlY29yZEV2ZW50TGlzdGVuZXIgPCBUcmFjZUV2ZW50TGlzdGVuZXIKKyAgYXR0cl9yZWFkZXIgOmV2ZW50cworICBkZWYgaW5pdGlhbGl6ZSggYWRhcHRvciA9IG5pbCApCisgICAgc3VwZXIKKyAgICBAZXZlbnRzID0gW10KKyAgZW5kCisgIAorICBkZWYgcmVjb3JkKCBldmVudF9tZXNzYWdlLCAqaW50ZXJwb2xhdGlvbl9hcmd1bWVudHMgKQorICAgIGV2ZW50X21lc3NhZ2UgPSBldmVudF9tZXNzYWdlLnRvX3MKKyAgICBAZXZlbnRzIDw8IGV2ZW50X21lc3NhZ2UgJSBpbnRlcnBvbGF0aW9uX2FyZ3VtZW50cworICBlbmQKK2VuZAorZW5kICMgbW9kdWxlIERlYnVnCitlbmQgIyBtb2R1bGUgQU5UTFIzCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvcnVsZS10cmFjZXIucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvcnVsZS10cmFjZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZWJ1Zy9ydWxlLXRyYWNlci5yYgpAQCAtMCwwICsxLDU1IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBEZWJ1ZworPWJlZ2luIHJkb2MgQU5UTFIzOjpEZWJ1Zzo6UnVsZVRyYWNlcgorCitSdWxlVHJhY2VyIGlzIHNpbXBsZSBkZWJ1ZyBldmVudCBsaXN0ZW5lciB0aGF0IHdyaXRlcyB0aGUgbmFtZXMgb2YgcnVsZSBtZXRob2RzCithcyB0aGV5IGFyZSBlbnRlcmVkIGFuZCBleGl0dGVkIHRvIGFuIG91dHB1dCBzdHJlYW0uCisKKz1lbmQKK2NsYXNzIFJ1bGVUcmFjZXIKKyAgaW5jbHVkZSBFdmVudExpc3RlbmVyCisgIAorICBBUlJPV19JTiA9ICctLT4gJy5mcmVlemUKKyAgQVJST1dfT1VUID0gJzwtLSAnLmZyZWV6ZQorICAKKyAgYXR0cl9yZWFkZXIgOmxldmVsCisgIGF0dHJfYWNjZXNzb3IgOnNwYWNlc19wZXJfaW5kZW50LCA6ZGV2aWNlCisgIAorICBkZWYgaW5pdGlhbGl6ZSggb3B0aW9ucyA9IHt9ICkKKyAgICBAaW5wdXQgPSBvcHRpb25zWyA6aW5wdXQgXQorICAgIEBsZXZlbCA9IDAKKyAgICBAc3BhY2VzX3Blcl9pbmRlbnQgPSBvcHRpb25zWyA6c3BhY2VzX3Blcl9pbmRlbnQgXSB8fCAyCisgICAgQGRldmljZSA9IG9wdGlvbnNbIDpkZXZpY2UgXSB8fCBvcHRpb25zWyA6b3V0cHV0IF0gfHwgJHN0ZGVycgorICBlbmQKKyAgCisgIGRlZiBlbnRlcl9ydWxlKCBncmFtbWFyX2ZpbGUsIG5hbWUgKQorICAgIGluZGVudCA9IEBsZXZlbCAqIEBzcGFjZXNfcGVyX2luZGVudAorICAgIAorICAgIEBkZXZpY2UucHJpbnQoICcgJyAqIGluZGVudCwgQVJST1dfSU4sIG5hbWUgKQorICAgIGlmIEBpbnB1dAorICAgICAgaW5wdXRfc3ltYm9sID0gQGlucHV0Lmxvb2sgfHwgOkVPRgorICAgICAgQGRldmljZS5wdXRzKCAiIGxvb2sgPSAlcCIgJSBpbnB1dF9zeW1ib2wgKQorICAgIGVsc2UgQGRldmljZS5wcmludCggIlxuIiApCisgICAgZW5kCisgICAgCisgICAgQGxldmVsICs9IDEKKyAgZW5kCisgIAorICBkZWYgZXhpdF9ydWxlKCBncmFtbWFyX2ZpbGUsIG5hbWUgKQorICAgIEBsZXZlbCAtPSAxCisgICAgCisgICAgaW5kZW50ID0gQGxldmVsICogQHNwYWNlc19wZXJfaW5kZW50CisgICAgCisgICAgQGRldmljZS5wcmludCggJyAnICogaW5kZW50LCBBUlJPV19PVVQsIG5hbWUgKQorICAgIGlmIEBpbnB1dAorICAgICAgaW5wdXRfc3ltYm9sID0gKCBAaW5wdXQubG9vayB8fCA6RU9GICkKKyAgICAgIEBkZXZpY2UucHV0cyggIiBsb29rID0gJXAiICUgaW5wdXRfc3ltYm9sICkKKyAgICBlbHNlIEBkZXZpY2UucHJpbnQoICJcbiIgKQorICAgIGVuZAorICBlbmQKK2VuZAorZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZWJ1Zy9zb2NrZXQucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Yzg3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvc29ja2V0LnJiCkBAIC0wLDAgKzEsMzYwIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ3NvY2tldCcKKworbW9kdWxlIEFOVExSMworbW9kdWxlIERlYnVnCisKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpEZWJ1Zzo6RXZlbnRTb2NrZXRQcm94eQorCitBIHByb3h5IGRlYnVnIGV2ZW50IGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgZXZlbnRzIG92ZXIgYSBzb2NrZXQgdG8KK2EgZGVidWdnZXIgKG9yIGFueSBvdGhlciBsaXN0ZW5lcikgdXNpbmcgYSBzaW1wbGUgdGV4dC1iYXNlZCBwcm90b2NvbDsKK29uZSBldmVudCBwZXIgbGluZS4gIEFOVExSV29ya3MgbGlzdGVucyBvbiBzZXJ2ZXIgc29ja2V0IHdpdGggYQorUmVtb3RlRGVidWdFdmVudFNvY2tldExpc3RlbmVyIGluc3RhbmNlLiAgVGhlc2UgdHdvIG9iamVjdHMgbXVzdCB0aGVyZWZvcmUKK2JlIGtlcHQgaW4gc3luYy4gIE5ldyBldmVudHMgbXVzdCBiZSBoYW5kbGVkIG9uIGJvdGggc2lkZXMgb2Ygc29ja2V0LgorCis9ZW5kCitjbGFzcyBFdmVudFNvY2tldFByb3h5CisgIGluY2x1ZGUgRXZlbnRMaXN0ZW5lcgorICAKKyAgU09DS0VUX0FERFJfUEFDSyA9ICdzbkNDQ0NhOCcuZnJlZXplCisgIAorICBkZWYgaW5pdGlhbGl6ZSggcmVjb2duaXplciwgb3B0aW9ucyA9IHt9ICkKKyAgICBzdXBlcigpCisgICAgQGdyYW1tYXJfZmlsZV9uYW1lID0gcmVjb2duaXplci5ncmFtbWFyX2ZpbGVfbmFtZQorICAgIEBhZGFwdG9yID0gb3B0aW9uc1sgOmFkYXB0b3IgXQorICAgIEBwb3J0ID0gb3B0aW9uc1sgOnBvcnQgXSB8fCBERUZBVUxUX1BPUlQKKyAgICBAbG9nID0gb3B0aW9uc1sgOmxvZyBdCisgICAgQHNvY2tldCA9IG5pbAorICAgIEBjb25uZWN0aW9uID0gbmlsCisgIGVuZAorICAKKyAgZGVmIGxvZyEoIG1lc3NhZ2UsICppbnRlcnBvbGF0aW9uX2FyZ3VtZW50cyApCisgICAgQGxvZyBhbmQgQGxvZy5wcmludGYoIG1lc3NhZ2UsICppbnRlcnBvbGF0aW9uX2FyZ3VtZW50cyApCisgIGVuZAorICAKKyAgZGVmIGhhbmRzaGFrZQorICAgIHVubGVzcyBAc29ja2V0CisgICAgICBiZWdpbgorICAgICAgICBAc29ja2V0ID0gU29ja2V0Lm5ldyggU29ja2V0OjpBRl9JTkVULCBTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwICkKKyAgICAgICAgQHNvY2tldC5zZXRzb2Nrb3B0KCBTb2NrZXQ6OlNPTF9TT0NLRVQsIFNvY2tldDo6U09fUkVVU0VBRERSLCAxICkKKyAgICAgICAgQHNvY2tldC5iaW5kKCBTb2NrZXQucGFja19zb2NrYWRkcl9pbiggQHBvcnQsICcnICkgKQorICAgICAgICBAc29ja2V0Lmxpc3RlbiggMSApCisgICAgICAgIGxvZyEoICJ3YWl0aW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9uIG9uIHBvcnQgJWlcbiIsIEBwb3J0ICkKKyAgICAgICAgCisgICAgICAgIEBjb25uZWN0aW9uLCBhZGRyID0gQHNvY2tldC5hY2NlcHQKKyAgICAgICAgcG9ydCwgaG9zdCA9IFNvY2tldC51bnBhY2tfc29ja2FkZHJfaW4oIGFkZHIgKQorICAgICAgICBsb2chKCAiQWNjZXB0ZWQgY29ubmVjdGlvbiBmcm9tICVzOiVzXG4iLCBob3N0LCBwb3J0ICkKKyAgICAgICAgCisgICAgICAgIEBjb25uZWN0aW9uLnNldHNvY2tvcHQoIFNvY2tldDo6U09MX1RDUCwgU29ja2V0OjpUQ1BfTk9ERUxBWSwgMSApCisgICAgICAgIAorICAgICAgICB3cml0ZSggJ0FOVExSICVzJywgUFJPVE9DT0xfVkVSU0lPTiApCisgICAgICAgIHdyaXRlKCAnZ3JhbW1hciAlcCcsIEBncmFtbWFyX2ZpbGVfbmFtZSApCisgICAgICAgIGFjaworICAgICAgcmVzY3VlIElPRXJyb3IgPT4gZXJyb3IKKyAgICAgICAgbG9nISggImhhbmRzaGFrZSBmYWlsZWQgZHVlIHRvIGFuIElPRXJyb3I6XG4iICkKKyAgICAgICAgbG9nISggIiAgJXM6ICVzIiwgZXJyb3IuY2xhc3MsIGVycm9yLm1lc3NhZ2UgKQorICAgICAgICBsb2chKCAiICBCYWNrdHJhY2U6ICIgKQorICAgICAgICBsb2chKCAiICAtICVzIiwgZXJyb3IuYmFja3RyYWNlLmpvaW4oICJcbiAgLSAiICkgKQorICAgICAgICBAY29ubmVjdGlvbiBhbmQgQGNvbm5lY3Rpb24uY2xvc2UKKyAgICAgICAgQHNvY2tldCBhbmQgQHNvY2tldC5jbG9zZQorICAgICAgICBAc29ja2V0ID0gbmlsCisgICAgICAgIHJhaXNlCisgICAgICBlbmQKKyAgICBlbmQKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKyAgCisgIGRlZiB3cml0ZSggbWVzc2FnZSwgKmludGVycG9sYXRpb25fYXJndW1lbnRzICkKKyAgICBtZXNzYWdlIDw8ID9cbgorICAgIGxvZyEoICItLS0+ICN7IG1lc3NhZ2UgfSIsICppbnRlcnBvbGF0aW9uX2FyZ3VtZW50cyApCisgICAgQGNvbm5lY3Rpb24ucHJpbnRmKCBtZXNzYWdlLCAqaW50ZXJwb2xhdGlvbl9hcmd1bWVudHMgKQorICAgIEBjb25uZWN0aW9uLmZsdXNoCisgIGVuZAorICAKKyAgZGVmIGFjaworICAgIGxpbmUgPSBAY29ubmVjdGlvbi5yZWFkbGluZQorICAgIGxvZyEoICI8LS0tICVzIiwgbGluZSApCisgICAgbGluZQorICBlbmQKKyAgCisgIGRlZiB0cmFuc21pdCggZXZlbnQsICppbnRlcnBvbGF0aW9uX2FyZ3VtZW50cyApCisgICAgd3JpdGUoIGV2ZW50LCAqaW50ZXJwb2xhdGlvbl9hcmd1bWVudHMgKQorICAgIGFjaygpCisgIHJlc2N1ZSBJT0Vycm9yCisgICAgQGNvbm5lY3Rpb24uY2xvc2UKKyAgICByYWlzZQorICBlbmQKKyAgCisgIGRlZiBjb21tZW5jZQorICAgICMgZG9uJ3QgYm90aGVyIHNlbmRpbmcgZXZlbnQ7IGxpc3RlbmVyIHdpbGwgdHJpZ2dlciB1cG9uIGNvbm5lY3Rpb24KKyAgZW5kCisgIAorICBkZWYgdGVybWluYXRlCisgICAgdHJhbnNtaXQgJ3Rlcm1pbmF0ZScKKyAgICBAY29ubmVjdGlvbi5jbG9zZQorICAgIEBzb2NrZXQuY2xvc2UKKyAgZW5kCisgIAorICBkZWYgZW50ZXJfcnVsZSggZ3JhbW1hcl9maWxlX25hbWUsIHJ1bGVfbmFtZSApCisgICAgdHJhbnNtaXQgIiVzXHQlc1x0JXMiLCA6ZW50ZXJfcnVsZSwgZ3JhbW1hcl9maWxlX25hbWUsIHJ1bGVfbmFtZQorICBlbmQKKyAgCisgIGRlZiBlbnRlcl9hbHRlcm5hdGl2ZSggYWx0ICkKKyAgICB0cmFuc21pdCAiJXNcdCVzIiwgOmVudGVyX2FsdGVybmF0aXZlLCBhbHQKKyAgZW5kCisgIAorICBkZWYgZXhpdF9ydWxlKCBncmFtbWFyX2ZpbGVfbmFtZSwgcnVsZV9uYW1lICkKKyAgICB0cmFuc21pdCAiJXNcdCVzXHQlcyIsIDpleGl0X3J1bGUsIGdyYW1tYXJfZmlsZV9uYW1lLCBydWxlX25hbWUKKyAgZW5kCisgIAorICBkZWYgZW50ZXJfc3VicnVsZSggZGVjaXNpb25fbnVtYmVyICkKKyAgICB0cmFuc21pdCAiJXNcdCVpIiwgOmVudGVyX3N1YnJ1bGUsIGRlY2lzaW9uX251bWJlcgorICBlbmQKKyAgCisgIGRlZiBleGl0X3N1YnJ1bGUoIGRlY2lzaW9uX251bWJlciApCisgICAgdHJhbnNtaXQgIiVzXHQlaSIsIDpleGl0X3N1YnJ1bGUsIGRlY2lzaW9uX251bWJlcgorICBlbmQKKyAgCisgIGRlZiBlbnRlcl9kZWNpc2lvbiggZGVjaXNpb25fbnVtYmVyICkKKyAgICB0cmFuc21pdCAiJXNcdCVpIiwgOmVudGVyX2RlY2lzaW9uLCBkZWNpc2lvbl9udW1iZXIKKyAgZW5kCisgIAorICBkZWYgZXhpdF9kZWNpc2lvbiggZGVjaXNpb25fbnVtYmVyICkKKyAgICB0cmFuc21pdCAiJXNcdCVpIiwgOmV4aXRfZGVjaXNpb24sIGRlY2lzaW9uX251bWJlcgorICBlbmQKKyAgCisgIGRlZiBjb25zdW1lX3Rva2VuKCB0b2tlbiApCisgICAgdHJhbnNtaXQgIiVzXHQlcyIsIDpjb25zdW1lX3Rva2VuLCBzZXJpYWxpemVfdG9rZW4oIHRva2VuICkKKyAgZW5kCisgIAorICBkZWYgY29uc3VtZV9oaWRkZW5fdG9rZW4oIHRva2VuICkKKyAgICB0cmFuc21pdCAiJXNcdCVzIiwgOmNvbnN1bWVfaGlkZGVuX3Rva2VuLCBzZXJpYWxpemVfdG9rZW4oIHRva2VuICkKKyAgZW5kCisgIAorICBkZWYgbG9vayggaSwgaXRlbSApCisgICAgY2FzZSBpdGVtCisgICAgd2hlbiBBU1Q6OlRyZWUKKyAgICAgIGxvb2tfdHJlZSggaSwgaXRlbSApCisgICAgd2hlbiBuaWwKKyAgICBlbHNlCisgICAgICB0cmFuc21pdCAiJXNcdCVpXHQlcyIsIDpsb29rLCBpLCBzZXJpYWxpemVfdG9rZW4oIGl0ZW0gKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBtYXJrKCBpICkKKyAgICB0cmFuc21pdCAiJXNcdCVpIiwgOm1hcmssIGkKKyAgZW5kCisgIAorICBkZWYgcmV3aW5kKCBpID0gbmlsICkKKyAgICBpID8gdHJhbnNtaXQoICIlc1x0JWkiLCA6cmV3aW5kLCBpICkgOiB0cmFuc21pdCggJyVzJywgOnJld2luZCApCisgIGVuZAorICAKKyAgZGVmIGJlZ2luX2JhY2t0cmFjayggbGV2ZWwgKQorICAgIHRyYW5zbWl0ICIlc1x0JWkiLCA6YmVnaW5fYmFja3RyYWNrLCBsZXZlbAorICBlbmQKKyAgZGVmIGVuZF9iYWNrdHJhY2soIGxldmVsLCBzdWNjZXNzZnVsICkKKyAgICB0cmFuc21pdCAiJXNcdCVpXHQlcCIsIDplbmRfYmFja3RyYWNrLCBsZXZlbCwgKCBzdWNjZXNzZnVsID8gdHJ1ZSA6IGZhbHNlICkKKyAgZW5kCisgIAorICBkZWYgbG9jYXRpb24oIGxpbmUsIHBvc2l0aW9uICkKKyAgICB0cmFuc21pdCAiJXNcdCVpXHQlaSIsIDpsb2NhdGlvbiwgbGluZSwgcG9zaXRpb24KKyAgZW5kCisgIAorICBkZWYgcmVjb2duaXRpb25fZXhjZXB0aW9uKCBleGNlcHRpb24gKQorICAgIHRyYW5zbWl0ICIlc1x0JXBcdCVpXHQlaVx0JWkiLCA6cmVjb2duaXRpb25fZXhjZXB0aW9uLCBleGNlcHRpb24uY2xhc3MsCisgICAgICBleGNlcHRpb24uaW5kZXgsIGV4Y2VwdGlvbi5saW5lLCBleGNlcHRpb24uY29sdW1uCisgIGVuZAorICAKKyAgZGVmIGJlZ2luX3Jlc3luYworICAgIHRyYW5zbWl0ICclcycsIDpiZWdpbl9yZXN5bmMKKyAgZW5kCisgIAorICBkZWYgZW5kX3Jlc3luYworICAgIHRyYW5zbWl0ICclcycsIDplbmRfcmVzeW5jCisgIGVuZAorICAKKyAgZGVmIHNlbWFudGljX3ByZWRpY2F0ZSggcmVzdWx0LCBwcmVkaWNhdGUgKQorICAgIHB1cmVfYm9vbGVhbiA9ICEoICFyZXN1bHQgKQorICAgIHRyYW5zbWl0ICIlc1x0JXNcdCVzIiwgOnNlbWFudGljX3ByZWRpY2F0ZSwgcHVyZV9ib29sZWFuLCBlc2NhcGVfbmV3bGluZXMoIHByZWRpY2F0ZSApCisgIGVuZAorICAKKyAgZGVmIGNvbnN1bWVfbm9kZSggdHJlZSApCisgICAgdHJhbnNtaXQgIiVzXHQlcyIsIDpjb25zdW1lX25vZGUsIHNlcmlhbGl6ZV9ub2RlKCB0cmVlICkKKyAgZW5kCisgIAorICBkZWYgYWRhcHRvcgorICAgIEBhZGFwdG9yIHx8PSBBTlRMUjM6OkNvbW1vblRyZWVBZGFwdG9yLm5ldworICBlbmQKKyAgCisgIGRlZiBsb29rX3RyZWUoIGksIHRyZWUgKQorICAgIHRyYW5zbWl0ICIlc1x0JXNcdCVzIiwgOmxvb2tfdHJlZSwgaSwgc2VyaWFsaXplX25vZGUoIHRyZWUgKQorICBlbmQKKyAgCisgIGRlZiBmbGF0X25vZGUoIHRyZWUgKQorICAgIHRyYW5zbWl0ICIlc1x0JWkiLCA6ZmxhdF9ub2RlLCBhZGFwdG9yLnVuaXF1ZV9pZCggdHJlZSApCisgIGVuZAorICAKKyAgZGVmIGVycm9yX25vZGUoIHRyZWUgKQorICAgIHRyYW5zbWl0ICIlc1x0JWlcdCVpXHQlcCIsIDplcnJvcl9ub2RlLCBhZGFwdG9yLnVuaXF1ZV9pZCggdHJlZSApLAorICAgICAgICAgICAgVG9rZW46OklOVkFMSURfVE9LRU5fVFlQRSwgZXNjYXBlX25ld2xpbmVzKCB0cmVlLnRvX3MgKQorICBlbmQKKyAgCisgIGRlZiBjcmVhdGVfbm9kZSggbm9kZSwgdG9rZW4gPSBuaWwgKQorICAgIGlmIHRva2VuCisgICAgICB0cmFuc21pdCAiJXNcdCVpXHQlaSIsIDpjcmVhdGVfbm9kZSwgYWRhcHRvci51bmlxdWVfaWQoIG5vZGUgKSwKKyAgICAgICAgICAgICAgdG9rZW4udG9rZW5faW5kZXgKKyAgICBlbHNlCisgICAgICB0cmFuc21pdCAiJXNcdCVpXHQlaVx0JXAiLCA6Y3JlYXRlX25vZGUsIGFkYXB0b3IudW5pcXVlX2lkKCBub2RlICksCisgICAgICAgICAgYWRhcHRvci50eXBlX29mKCBub2RlICksIGFkYXB0b3IudGV4dF9vZiggbm9kZSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGJlY29tZV9yb290KCBuZXdfcm9vdCwgb2xkX3Jvb3QgKQorICAgIHRyYW5zbWl0ICIlc1x0JWlcdCVpIiwgOmJlY29tZV9yb290LCBhZGFwdG9yLnVuaXF1ZV9pZCggbmV3X3Jvb3QgKSwKKyAgICAgICAgICAgICAgYWRhcHRvci51bmlxdWVfaWQoIG9sZF9yb290ICkKKyAgZW5kCisgIAorICBkZWYgYWRkX2NoaWxkKCByb290LCBjaGlsZCApCisgICAgdHJhbnNtaXQgIiVzXHQlaVx0JWkiLCA6YWRkX2NoaWxkLCBhZGFwdG9yLnVuaXF1ZV9pZCggcm9vdCApLAorICAgICAgICAgICAgIGFkYXB0b3IudW5pcXVlX2lkKCBjaGlsZCApCisgIGVuZAorICAKKyAgZGVmIHNldF90b2tlbl9ib3VuZGFyaWVzKCB0LCB0b2tlbl9zdGFydF9pbmRleCwgdG9rZW5fc3RvcF9pbmRleCApCisgICAgdHJhbnNtaXQgIiVzXHQlaVx0JWlcdCVpIiwgOnNldF90b2tlbl9ib3VuZGFyaWVzLCBhZGFwdG9yLnVuaXF1ZV9pZCggdCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX3N0YXJ0X2luZGV4LCB0b2tlbl9zdG9wX2luZGV4CisgIGVuZAorICAKKyAgYXR0cl9hY2Nlc3NvciA6YWRhcHRvcgorICAKKyAgZGVmIHNlcmlhbGl6ZV90b2tlbiggdG9rZW4gKQorICAgIFsgdG9rZW4udG9rZW5faW5kZXgsIHRva2VuLnR5cGUsIHRva2VuLmNoYW5uZWwsCisgICAgIHRva2VuLmxpbmUsIHRva2VuLmNvbHVtbiwKKyAgICAgZXNjYXBlX25ld2xpbmVzKCB0b2tlbi50ZXh0ICkgXS5qb2luKCAiXHQiICkKKyAgZW5kCisgIAorICBkZWYgc2VyaWFsaXplX25vZGUoIG5vZGUgKQorICAgIGFkYXB0b3IgfHw9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlQWRhcHRvci5uZXcKKyAgICBpZCA9IGFkYXB0b3IudW5pcXVlX2lkKCBub2RlICkKKyAgICB0eXBlID0gYWRhcHRvci50eXBlX29mKCBub2RlICkKKyAgICB0b2tlbiA9IGFkYXB0b3IudG9rZW4oIG5vZGUgKQorICAgIGxpbmUgPSB0b2tlbi5saW5lIHJlc2N1ZSAtMQorICAgIGNvbCAgPSB0b2tlbi5jb2x1bW4gcmVzY3VlIC0xCisgICAgaW5kZXggPSBhZGFwdG9yLnRva2VuX3N0YXJ0X2luZGV4KCBub2RlICkKKyAgICBbIGlkLCB0eXBlLCBsaW5lLCBjb2wsIGluZGV4IF0uam9pbiggIlx0IiApCisgIGVuZAorICAKKyAgCisgIGRlZiBlc2NhcGVfbmV3bGluZXMoIHRleHQgKQorICAgIHRleHQuaW5zcGVjdC50YXAgZG8gfHR8CisgICAgICB0LmdzdWIhKCAvJS8sICclJScgKQorICAgIGVuZAorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkRlYnVnOjpSZW1vdGVFdmVudFNvY2tldExpc3RlbmVyCisKK0EgZGVidWdnaW5nIGV2ZW50IGxpc3RlbmVyIHdoaWNoIGludGVyY2VwdHMgZGVidWcgZXZlbnQgbWVzc2FnZXMgc2VudCBieSBhIEV2ZW50U29ja2V0UHJveHkKK292ZXIgYW4gSVAgc29ja2V0LgorCis9ZW5kCitjbGFzcyBSZW1vdGVFdmVudFNvY2tldExpc3RlbmVyIDwgOjpUaHJlYWQKKyAgYXV0b2xvYWQgOlN0cmluZ0lPLCAnc3RyaW5naW8nCisgIEVTQ0FQRV9NQVAgPSBIYXNoLm5ldyB7IHxoLCBrfCBrIH0KKyAgRVNDQVBFX01BUC51cGRhdGUoIAorICAgID9uID0+ID9cbiwgP3QgPT4gP1x0LCA/YSA9PiA/XGEsID9iID0+ID9cYiwgP2UgPT4gP1xlLAorICAgID9mID0+ID9cZiwgP3IgPT4gP1xyLCA/diA9PiA/XHYKKyAgKQorICAKKyAgYXR0cl9yZWFkZXIgOmhvc3QsIDpwb3J0CisgIAorICBkZWYgaW5pdGlhbGl6ZSggb3B0aW9ucyA9IHt9ICkKKyAgICBAbGlzdGVuZXIgPSBsaXN0ZW5lcgorICAgIEBob3N0ID0gb3B0aW9ucy5mZXRjaCggOmhvc3QsICdsb2NhbGhvc3QnICkKKyAgICBAcG9ydCA9IG9wdGlvbnMuZmV0Y2goIDpwb3J0LCBERUZBVUxUX1BPUlQgKQorICAgIEBidWZmZXIgPSBTdHJpbmdJTy5uZXcKKyAgICBzdXBlciBkbworICAgICAgY29ubmVjdCBkbworICAgICAgICBoYW5kc2hha2UKKyAgICAgICAgbG9vcCBkbworICAgICAgICAgIHlpZWxkKCByZWFkX2V2ZW50ICkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIGhhbmRzaGFrZQorICAgIEB2ZXJzaW9uID0gQHNvY2tldC5yZWFkbGluZS5zcGxpdCggIlx0IiApWyAtMSBdCisgICAgQGdyYW1tYXJfZmlsZSA9IEBzb2NrZXQucmVhZGxpbmUuc3BsaXQoICJcdCIgKVsgLTEgXQorICAgIGFjaworICBlbmQKKyAgCisgIGRlZiBhY2sKKyAgICBAc29ja2V0LnB1dHMoICJhY2siICkKKyAgICBAc29ja2V0LmZsdXNoCisgIGVuZAorICAKKyAgZGVmIHVucGFja19ldmVudCggZXZlbnQgKQorICAgIGV2ZW50Lm5pbD8gYW5kIHJhaXNlKCBTdG9wSXRlcmF0aW9uICkKKyAgICBldmVudC5jaG9tcCEKKyAgICBuYW1lLCAqZWxlbWVudHMgPSBldmVudC5zcGxpdCggIlx0IiwtMSApCisgICAgbmFtZSA9IG5hbWUudG9fc3ltCisgICAgbmFtZSA9PSA6dGVybWluYXRlIGFuZCByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgZWxlbWVudHMubWFwISBkbyB8ZWxlbXwKKyAgICAgIGVsZW0uZW1wdHk/IGFuZCBuZXh0KCBuaWwgKQorICAgICAgY2FzZSBlbGVtCisgICAgICB3aGVuIC9eXGQrJC8gdGhlbiBJbnRlZ2VyKCBlbGVtICkKKyAgICAgIHdoZW4gL15cZCtcLlxkKyQvIHRoZW4gRmxvYXQoIGVsZW0gKQorICAgICAgd2hlbiAvXnRydWUkLyB0aGVuIHRydWUKKyAgICAgIHdoZW4gL15mYWxzZSQvIHRoZW4gZmFsc2UKKyAgICAgIHdoZW4gL14iKC4qKSIkLyB0aGVuIHBhcnNlX3N0cmluZyggJDEgKQorICAgICAgZW5kCisgICAgZW5kCisgICAgZWxlbWVudHMudW5zaGlmdCggbmFtZSApCisgICAgcmV0dXJuKCBlbGVtZW50cyApCisgIGVuZAorICAKKyAgZGVmIHJlYWRfZXZlbnQKKyAgICBldmVudCA9IEBzb2NrZXQucmVhZGxpbmUgb3IgcmFpc2UoIFN0b3BJdGVyYXRpb24gKQorICAgIGFjaworICAgIHJldHVybiB1bnBhY2tfZXZlbnQoIGV2ZW50ICkKKyAgZW5kCisgIAorICBkZWYgY29ubmVjdAorICAgIFRDUFNvY2tldC5vcGVuKCBAaG9zdCwgQHBvcnQgKSBkbyB8c29ja2V0fAorICAgICAgQHNvY2tldCA9IHNvY2tldAorICAgICAgeWllbGQKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgcGFyc2Vfc3RyaW5nKCBzdHJpbmcgKQorICAgIEBidWZmZXIuc3RyaW5nID0gc3RyaW5nCisgICAgQGJ1ZmZlci5yZXdpbmQKKyAgICBvdXQgPSAnJworICAgIHVudGlsIEBidWZmZXIuZW9mPworICAgICAgY2FzZSBjID0gQGJ1ZmZlci5nZXRjCisgICAgICB3aGVuID9cXCAgICAgICAgICAgICAgICAgICAgIyBlc2NhcGUKKyAgICAgICAgbmMgPSBAYnVmZmVyLmdldGMKKyAgICAgICAgb3V0IDw8IAorICAgICAgICAgIGlmIG5jLmJldHdlZW4/KCA/MCwgPzkgKSAgIyBvY3RhbCBpbnRlZ2VyCisgICAgICAgICAgICBAYnVmZmVyLnVuZ2V0YyggbmMgKQorICAgICAgICAgICAgQGJ1ZmZlci5yZWFkKCAzICkudG9faSggOCApLmNocgorICAgICAgICAgIGVsc2lmIG5jID09ID94CisgICAgICAgICAgICBAYnVmZmVyLnJlYWQoIDIgKS50b19pKCAxNiApLmNocgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVTQ0FQRV9NQVBbIG5jIF0KKyAgICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0IDw8IGMKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJldHVybiBvdXQKKyAgZW5kCisgIAorZW5kICMgY2xhc3MgUmVtb3RlRXZlbnRTb2NrZXRMaXN0ZW5lcgorZW5kICMgbW9kdWxlIERlYnVnCitlbmQgIyBtb2R1bGUgQU5UTFIzCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvdHJhY2UtZXZlbnQtbGlzdGVuZXIucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGVidWcvdHJhY2UtZXZlbnQtbGlzdGVuZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiNzlhZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZWJ1Zy90cmFjZS1ldmVudC1saXN0ZW5lci5yYgpAQCAtMCwwICsxLDkyIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBEZWJ1ZworPWJlZ2luIHJkb2MgQU5UTFIzOjpEZWJ1Zzo6RXZlbnRMaXN0ZW5lcgorCitBIGxpc3RlbmVyIHRoYXQgc2ltcGx5IHJlY29yZHMgdGV4dCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGV2ZW50cy4KK1VzZWZ1bCBmb3IgZGVidWdnaW5nIHRoZSBkZWJ1Z2dpbmcgZmFjaWxpdHkgOykKK1N1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoZSByZWNvcmQoKSBtZXRob2QgKHdoaWNoIGRlZmF1bHRzIHRvIHByaW50aW5nIHRvCitzdGRvdXQpIHRvIHJlY29yZCB0aGUgZXZlbnRzIGluIGEgZGlmZmVyZW50IHdheS4KKworPWVuZAorY2xhc3MgVHJhY2VFdmVudExpc3RlbmVyCisgIGluY2x1ZGUgRXZlbnRMaXN0ZW5lcgorICAKKyAgZGVmIGluaXRpYWxpemUoIGFkYXB0b3IgPSBuaWwsIGRldmljZSA9ICRzdGRlcnIgKQorICAgIHN1cGVyKCkKKyAgICBAZGV2aWNlID0gZGV2aWNlCisgICAgQGFkYXB0b3IgPSBhZGFwdG9yIHx8PSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZUFkYXB0b3IubmV3CisgIGVuZAorICAKKyAgZGVmIHJlY29yZCggZXZlbnRfbWVzc2FnZSwgKmludGVycG9sYXRpb25fYXJndW1lbnRzICkKKyAgICBldmVudF9tZXNzYWdlID0gZXZlbnRfbWVzc2FnZS50b19zIDw8ICJcbiIKKyAgICBAZGV2aWNlLnByaW50ZiggZXZlbnRfbWVzc2FnZSwgKmludGVycG9sYXRpb25fYXJndW1lbnRzICkKKyAgZW5kCisgIAorICBkZWYgZW50ZXJfYWx0ZXJuYXRpdmUoIGFsdF9udW1iZXIgKQorICAgIHJlY29yZCAiKCVzKTogbnVtYmVyPSVzIiwgX19tZXRob2RfXywgYWx0X251bWJlcgorICBlbmQKKyAgCisgIGRlZiBlbnRlcl9ydWxlKCBncmFtbWFyX2ZpbGVfbmFtZSwgcnVsZV9uYW1lICkKKyAgICByZWNvcmQgIiglcyk6IHJ1bGU9JXMiLCBfX21ldGhvZF9fLCBydWxlX25hbWUKKyAgZW5kCisgIAorICBkZWYgZXhpdF9ydWxlKCBncmFtbWFyX2ZpbGVfbmFtZSwgcnVsZV9uYW1lICkKKyAgICByZWNvcmQgIiglcyk6IHJ1bGU9JXMiLCBfX21ldGhvZF9fLCBydWxlX25hbWUKKyAgZW5kCisgIAorICBkZWYgZW50ZXJfc3VicnVsZSggZGVjaXNpb25fbnVtYmVyICkKKyAgICByZWNvcmQgIiglcyk6IGRlY2lzaW9uPSVzIiwgX19tZXRob2RfXywgZGVjaXNpb25fbnVtYmVyCisgIGVuZAorICAKKyAgZGVmIGV4aXRfc3VicnVsZSggZGVjaXNpb25fbnVtYmVyICkKKyAgICByZWNvcmQgIiglcyk6IGRlY2lzaW9uPSVzIiwgX19tZXRob2RfXywgZGVjaXNpb25fbnVtYmVyCisgIGVuZAorICAKKyAgZGVmIGxvY2F0aW9uKCBsaW5lLCBwb3NpdGlvbiApCisgICAgcmVjb3JkICcoJXMpOiBsaW5lPSVzIHBvc2l0aW9uPSVzJywgX19tZXRob2RfXywgbGluZSwgcG9zaXRpb24KKyAgZW5kCisgIAorICBkZWYgY29uc3VtZV9ub2RlKCB0cmVlICkKKyAgICByZWNvcmQgJyglcykgdW5pcXVlX2lkPSVzIHRleHQ9JXAgdHlwZT0lc1slc10nLCBfX21ldGhvZF9fLCBAYWRhcHRvci51bmlxdWVfaWQoIHRyZWUgKSwKKyAgICAgICAgICAgQGFkYXB0b3IudGV4dF9vZiggdHJlZSApLCBAYWRhcHRvci50eXBlX25hbWUoIHRyZWUgKSwgQGFkYXB0b3IudHlwZV9vZiggdHJlZSApCisgIGVuZAorICAKKyAgZGVmIGxvb2soIGksIHRyZWUgKQorICAgIHJlY29yZCAnKCVzKTogaz0lcyB1bmlxdWVfaWQ9JXMgdGV4dD0lcCB0eXBlPSVzWyVzXScsIF9fbWV0aG9kX18sIGksIEBhZGFwdG9yLnVuaXF1ZV9pZCggdHJlZSApLAorICAgICAgICAgICAgQGFkYXB0b3IudGV4dF9vZiggdHJlZSApLCBAYWRhcHRvci50eXBlX25hbWUoIHRyZWUgKSwgQGFkYXB0b3IudHlwZV9vZiggdHJlZSApCisgIGVuZAorICAKKyAgZGVmIGZsYXRfbm9kZSggdHJlZSApCisgICAgcmVjb3JkICcoJXMpOiB1bmlxdWVfaWQ9JXMnLCBfX21ldGhvZF9fLCBAYWRhcHRvci51bmlxdWVfaWQoIHRyZWUgKQorICBlbmQKKyAgCisgIGRlZiBjcmVhdGVfbm9kZSggdHJlZSwgdG9rZW4gPSBuaWwgKQorICAgIHVubGVzcyB0b2tlbgorICAgICAgcmVjb3JkICcoJXMpOiB1bmlxdWVfaWQ9JXMgdGV4dD0lcCB0eXBlPSVzWyVzXScsIF9fbWV0aG9kX18sIEBhZGFwdG9yLnVuaXF1ZV9pZCggdHJlZSApLAorICAgICAgICAgICAgQGFkYXB0b3IudGV4dF9vZiggdHJlZSApLCBAYWRhcHRvci50eXBlX25hbWUoIHRyZWUgKSwgQGFkYXB0b3IudHlwZV9vZiggdHJlZSApCisgICAgZWxzZQorICAgICAgcmVjb3JkICcoJXMpOiB1bmlxdWVfaWQ9JXMgdHlwZT0lc1slc10nLCBfX21ldGhvZF9fLCBAYWRhcHRvci51bmlxdWVfaWQoIHRyZWUgKSwKKyAgICAgICAgICAgICAgQGFkYXB0b3IudHlwZV9vZiggdHJlZSApLCBAYWRhcHRvci50eXBlX25hbWUoIHRyZWUgKSwgQGFkYXB0b3IudHlwZV9vZiggdHJlZSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGJlY29tZV9yb290KCBuZXdfcm9vdCwgb2xkX3Jvb3QgKQorICAgIHJlY29yZCAnKCVzKTogb2xkX3Jvb3RfaWQ9JXMgbmV3X3Jvb3RfaWQ9JXMnLCBfX21ldGhvZF9fLCBAYWRhcHRvci51bmlxdWVfaWQoIG5ld19yb290ICksCisgICAgICAgICAgICBAYWRhcHRvci51bmlxdWVfaWQoIG9sZF9yb290ICkKKyAgZW5kCisgIAorICBkZWYgYWRkX2NoaWxkKCByb290LCBjaGlsZCApCisgICAgcmVjb3JkICcoJXMpOiByb290X2lkPSVzIGNoaWxkX2lkPSVzJywgX19tZXRob2RfXywgQGFkYXB0b3IudW5pcXVlX2lkKCByb290ICksCisgICAgICAgICAgICBAYWRhcHRvci51bmlxdWVfaWQoIGNoaWxkICkKKyAgZW5kCisgIAorICBkZWYgc2V0X3Rva2VuX2JvdW5kYXJpZXMoIHRyZWUsIHRva2VuX3N0YXJ0X2luZGV4LCB0b2tlbl9zdG9wX2luZGV4ICkKKyAgICByZWNvcmQgJyglcyk6IHVuaXF1ZV9pZD0lcyBpbmRleF9yYW5nZT0lcy4uJXMnLCBfX21ldGhvZF9fLCBAYWRhcHRvci51bmlxdWVfaWQoIHRyZWUgKSwKKyAgICAgICAgICAgIHRva2VuX3N0YXJ0X2luZGV4LCB0b2tlbl9zdG9wX2luZGV4CisgIGVuZAorZW5kICMgY2xhc3MgVHJhY2VFdmVudExpc3RlbmVyCitlbmQgIyBtb2R1bGUgRGVidWcKK2VuZCAjIG1vZHVsZSBBTlRMUjMKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kZmEucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGZhLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Y2MwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvZGZhLnJiCkBAIC0wLDAgKzEsMzIwIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKz1iZWdpbiBMSUNFTlNFCisKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEt5bGUgWWV0dGVyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworPWVuZAorCittb2R1bGUgQU5UTFIzCisKKz1iZWdpbiByZG9jIEFOVExSMzo6REZBCisKK0RGQSBpcyBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIHRoYXQgY2hvb3NlcyBiZXR3ZWVuCithbHRlcm5hdGl2ZXMgaW4gYSBydWxlIGJhc2VkIHVwb24gbG9va2FoZWFkIHN5bWJvbHMgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCisKK0RldGVybWluaXN0aWMgRmluaXRlIEF1dG9tYXRhIChERkEpIGFyZSBmaW5pdGUgc3RhdGUgbWFjaGluZXMgdGhhdCBhcmUgY2FwYWJsZQorb2YgcmVjb2duaXppbmcgPGk+cmVndWxhciBsYW5ndWFnZXM8L2k+LiBGb3IgbW9yZSBiYWNrZ3JvdW5kIG9uIHRoZSBzdWJqZWN0LAorY2hlY2sgb3V0IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGV0ZXJtaW5pc3RpY19maW5pdGUtc3RhdGVfbWFjaGluZSBvcgorY2hlY2sgb3V0IGdlbmVyYWwgQU5UTFIgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vd3d3LmFudGxyLm9yZworCitBTlRMUiBpbXBsZW1lbnRzIG1vc3Qgb2YgaXRzIGRlY2lzaW9uIGxvZ2ljIGRpcmVjdGx5IHVzaW5nIGNvZGUgYnJhbmNoaW5nCitzdHJ1Y3R1cmVzIGluIG1ldGhvZHMuIEhvd2V2ZXIsIGZvciBjZXJ0YWluIHR5cGVzIG9mIGRlY2lzaW9ucywgQU5UTFIgd2lsbAorZ2VuZXJhdGUgYSBzcGVjaWFsIERGQSBjbGFzcyBkZWZpbml0aW9uIHRvIGltcGxlbWVudCBhIGRlY2lzaW9uLgorCitDb25jZXB0dWFsbHksIHRoZXNlIHN0YXRlIG1hY2hpbmVzIGFyZSBkZWZpbmVkIGJ5IGEgbnVtYmVyIG9mIHN0YXRlcywgZWFjaCBzdGF0ZQorcmVwcmVzZW50ZWQgYnkgYW4gaW50ZWdlciBpbmRleGVkIHVwd2FyZCBmcm9tIHplcm8uIFN0YXRlIG51bWJlciArMCsgaXMgdGhlCis8aT5zdGFydCBzdGF0ZTwvaT4gb2YgdGhlIG1hY2hpbmU7IGV2ZXJ5IHByZWRpY3Rpb24gd2lsbCBiZWdpbiBpbiBzdGF0ZSArMCsuIEF0CitlYWNoIHN0ZXAsIHRoZSBtYWNoaW5lIGV4YW1pbmVzIHRoZSBuZXh0IHN5bWJvbCBvbiB0aGUgaW5wdXQgc3RyZWFtLCBjaGVja3MgdGhlCit2YWx1ZSBhZ2FpbnN0IHRoZSB0cmFuc2l0aW9uIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlLCBhbmQKK2VpdGhlciBtb3ZlcyB0byBhIG5ldyBzdGF0ZSBudW1iZXIgdG8gcmVwZWF0IHRoZSBwcm9jZXNzIG9yIGRlY2lkZXMgdGhhdCB0aGUKK21hY2hpbmUgY2Fubm90IHRyYW5zaXRpb24gYW55IGZ1cnRoZXIuIElmIHRoZSBtYWNoaW5lIGNhbm5vdCB0cmFuc2l0aW9uIGFueQorZnVydGhlciBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgaXMgZGVmaW5lZCBhcyBhbiA8aT5hY2NlcHQgc3RhdGU8L2k+LCBhbgorYWx0ZXJuYXRpdmUgaGFzIGJlZW4gY2hvc2VuIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHByZWRpY3Rpb24gcHJvY2VkdXJlIGVuZHMuIElmCit0aGUgY3VycmVudCBzdGF0ZSBpcyBub3QgYW4gPGk+YWNjZXB0IHN0YXRlPC9pPiwgdGhlIHByZWRpY3Rpb24gaGFzIGZhaWxlZCBhbmQKK3RoZXJlIGlzIDxpPm5vIHZpYWJsZSBhbHRlcm5hdGl2ZTwvaT4uCisKK0luIGdlbmVyYXRlZCBjb2RlLCBBTlRMUiBkZWZpbmVzIERGQSBzdGF0ZXMgdXNpbmcgc2V2ZW4gcGFyYW1ldGVycywgZWFjaCBkZWZpbmVkCithcyBhIG1lbWJlciBvZiBzZXZlbiBzZXBlcmF0ZSBhcnJheSBjb25zdGFudHMgLS0gK01JTissICtNQVgrLCArRU9UKywgK0VPRissCisrU1BFQ0lBTCssICtBQ0NFUFQrLCBhbmQgK1RSQU5TSVRJT04rLiBUaGUgcGFyYW1ldGVycyB0aGF0IGNoYXJhY3Rlcml6ZSBzdGF0ZQorK3MrIGFyZSBkZWZpbmVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGVzZSBsaXN0cyBhdCBpbmRleCArcysuCisKK01JTltzXTo6CisgIFRoZSBzbWFsbGVzdCB2YWx1ZSBvZiB0aGUgbmV4dCBpbnB1dCBzeW1ib2wgdGhhdCBoYXMgCisgIGEgdHJhbnNpdGlvbiBmb3Igc3RhdGUgK3MrCitNQVhbc106OgorICBUaGUgbGFyZ2VzdCB2YWx1ZSBvZiB0aGUgbmV4dCBpbnB1dCBzeW1ib2wgdGhhdCBoYXMgCisgIGEgdHJhbnNpdGlvbiBmb3Igc3RhdGUgK3MrCitUUkFOU0lUSU9OW3NdOjoKKyAgQSBsaXN0IHRoYXQgZGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBudW1iZXIgYmFzZWQgdXBvbgorICB0aGUgY3VycmVudCBpbnB1dCBzeW1ib2wuCitFT1Rbc106OgorICBJZiBwb3NpdGl2ZSwgaXQgc3BlY2lmaWVzIGEgc3RhdGUgdHJhbnNpdGlvbiBpbiAKKyAgc2l0dWF0aW9ucyB3aGVyZSBhIG5vbi1tYXRjaGluZyBpbnB1dCBzeW1ib2wgZG9lcworICBub3QgaW5kaWNhdGUgZmFpbHVyZS4KK1NQRUNJQUxbc106OgorICBJZiBwb3NpdGl2ZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHByZWRpY3Rpb24gCisgIGFsZ29yaXRobSBtdXN0IGRlZmVyIHRvIGEgc3BlY2lhbCBjb2RlIGJsb2NrIAorICB0byBkZXRlcm1pbmUgdGhlIG5leHQgc3RhdGUuIFRoZSB2YWx1ZSBpcyB1c2VkCisgIGJ5IHRoZSBzcGVjaWFsIHN0YXRlIGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBuZXh0CisgIHN0YXRlLgorQUNDRVBUW3NdOjoKKyAgSWYgcG9zaXRpdmUgYW5kIHRoZXJlIGFyZSBubyBwb3NzaWJsZSBzdGF0ZQorICB0cmFuc2l0aW9ucywgdGhpcyBpcyB0aGUgYWx0ZXJuYXRpdmUgbnVtYmVyCisgIHRoYXQgaGFzIGJlZW4gcHJlZGljdGVkCitFT0Zbc106OgorICBJZiBwb3NpdGl2ZSBhbmQgdGhlIGlucHV0IHN0cmVhbSBoYXMgYmVlbiBleGhhdXN0ZWQsCisgIHRoaXMgaXMgdGhlIGFsdGVybmF0aXZlIG51bWJlciB0aGF0IGhhcyBiZWVuIHByZWRpY3RlZC4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHByZWRpY3Rpb24gYWxnb3JpdGhtLCBjaGVjayBvdXQgdGhlICNwcmVkaWN0IG1ldGhvZAorYmVsb3cuCisKKz1lbmQKKworY2xhc3MgREZBCisgIGluY2x1ZGUgQ29uc3RhbnRzCisgIGluY2x1ZGUgRXJyb3IKKyAgCisgIGF0dHJfcmVhZGVyIDpyZWNvZ25pemVyLCA6ZGVjaXNpb25fbnVtYmVyLCA6ZW90LCA6ZW9mLCA6bWluLCA6bWF4LAorICAgICAgICAgICAgICA6YWNjZXB0LCA6c3BlY2lhbCwgOnRyYW5zaXRpb24sIDpzcGVjaWFsX2Jsb2NrCisgIAorICBjbGFzcyA8PCBzZWxmCisgICAgYXR0cl9yZWFkZXIgOmRlY2lzaW9uLCA6ZW90LCA6ZW9mLCA6bWluLCA6bWF4LAorICAgICAgICAgICAgICAgIDphY2NlcHQsIDpzcGVjaWFsLCA6dHJhbnNpdGlvbgorICAgIAorICAgIGRlZiB1bnBhY2soICpkYXRhICkKKyAgICAgIGRhdGEuZW1wdHk/IGFuZCByZXR1cm4gW10uZnJlZXplCisgICAgICAKKyAgICAgIG4gPSBkYXRhLmxlbmd0aCAvIDIKKyAgICAgIHNpemUgPSAwCisgICAgICBuLnRpbWVzIHsgfGl8IHNpemUgKz0gZGF0YVsgMippIF0gfQorICAgICAgaWYgc2l6ZSA+IDEwMjQKKyAgICAgICAgdmFsdWVzID0gSGFzaC5uZXcoIDAgKQorICAgICAgICBkYXRhLmVhY2hfc2xpY2UoIDIgKSBkbyB8Y291bnQsIHZhbHVlfAorICAgICAgICAgIHZhbHVlc1sgdmFsdWUgXSArPSBjb3VudAorICAgICAgICBlbmQKKyAgICAgICAgZGVmYXVsdCA9IHZhbHVlcy5rZXlzLm1heF9ieSB7IHx2fCB2YWx1ZXNbIHYgXSB9CisgICAgICAgIAorICAgICAgICB1bnBhY2tlZCA9IEhhc2gubmV3KCBkZWZhdWx0ICkKKyAgICAgICAgcG9zaXRpb24gPSAwCisgICAgICAgIGRhdGEuZWFjaF9zbGljZSggMiApIGRvIHxjb3VudCwgdmFsdWV8CisgICAgICAgICAgdW5sZXNzIHZhbHVlID09IGRlZmF1bHQKKyAgICAgICAgICAgIGNvdW50LnRpbWVzIHsgfGl8IHVucGFja2VkWyBwb3NpdGlvbiArIGkgXSA9IHZhbHVlIH0KKyAgICAgICAgICBlbmQKKyAgICAgICAgICBwb3NpdGlvbiArPSBjb3VudAorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgdW5wYWNrZWQgPSBbXQorICAgICAgICBkYXRhLmVhY2hfc2xpY2UoIDIgKSBkbyB8Y291bnQsIHZhbHVlfAorICAgICAgICAgIHVucGFja2VkLmZpbGwoIHZhbHVlLCB1bnBhY2tlZC5sZW5ndGgsIGNvdW50ICkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIAorICAgICAgcmV0dXJuIHVucGFja2VkCisgICAgZW5kCisgICAgCisgIGVuZAorICAKKyAgZGVmIGluaXRpYWxpemUoIHJlY29nbml6ZXIsIGRlY2lzaW9uX251bWJlciA9IG5pbCwKKyAgICAgICAgICAgICAgICAgZW90ID0gbmlsLCBlb2YgPSBuaWwsIG1pbiA9IG5pbCwgbWF4ID0gbmlsLAorICAgICAgICAgICAgICAgICBhY2NlcHQgPSBuaWwsIHNwZWNpYWwgPSBuaWwsCisgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24gPSBuaWwsICZzcGVjaWFsX2Jsb2NrICkKKyAgICBAcmVjb2duaXplciA9IHJlY29nbml6ZXIKKyAgICBAZGVjaXNpb25fbnVtYmVyID0gZGVjaXNpb25fbnVtYmVyIHx8IHNlbGYuY2xhc3MuZGVjaXNpb24KKyAgICBAZW90ID0gZW90IHx8IHNlbGYuY2xhc3M6OkVPVCAjLmVvdAorICAgIEBlb2YgPSBlb2YgfHwgc2VsZi5jbGFzczo6RU9GICMuZW9mCisgICAgQG1pbiA9IG1pbiB8fCBzZWxmLmNsYXNzOjpNSU4gIy5taW4KKyAgICBAbWF4ID0gbWF4IHx8IHNlbGYuY2xhc3M6Ok1BWCAjLm1heAorICAgIEBhY2NlcHQgPSBhY2NlcHQgfHwgc2VsZi5jbGFzczo6QUNDRVBUICMuYWNjZXB0CisgICAgQHNwZWNpYWwgPSBzcGVjaWFsIHx8IHNlbGYuY2xhc3M6OlNQRUNJQUwgIy5zcGVjaWFsCisgICAgQHRyYW5zaXRpb24gPSB0cmFuc2l0aW9uIHx8IHNlbGYuY2xhc3M6OlRSQU5TSVRJT04gIy50cmFuc2l0aW9uCisgICAgQHNwZWNpYWxfYmxvY2sgPSBzcGVjaWFsX2Jsb2NrCisgIHJlc2N1ZSBOYW1lRXJyb3IgPT4gZQorICAgIHJhaXNlIHVubGVzcyBlLm1lc3NhZ2UgPX4gL3VuaW5pdGlhbGl6ZWQgY29uc3RhbnQvCisgICAgY29uc3RhbnQgPSBlLm5hbWUKKyAgICBtZXNzYWdlID0gVXRpbC50aWR5KCA8PC1FTkQgKQorICAgIHwgTm8gI3sgY29uc3RhbnQgfSBpbmZvcm1hdGlvbiBwcm92aWRlZC4KKyAgICB8IERGQSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIHdpdGhvdXQgcHJvdmlkaW5nIHN0YXRlIGFycmF5IGluZm9ybWF0aW9uLgorICAgIHwgV2hlbiBERkFzIGFyZSBnZW5lcmF0ZWQgYnkgQU5UTFIsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGFscmVhZHkgYmUKKyAgICB8IHByb3ZpZGVkIGluIHRoZSBERkEgc3ViY2xhc3MgY29uc3RhbnRzLgorICAgIEVORAorICBlbmQKKyAgCisgIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjkvCisgICAgCisgICAgZGVmIHByZWRpY3QoIGlucHV0ICkKKyAgICAgIG1hcmsgPSBpbnB1dC5tYXJrCisgICAgICBzdGF0ZSA9IDAKKyAgICAgIAorICAgICAgNTAwMDAudGltZXMgZG8KKyAgICAgICAgc3BlY2lhbF9zdGF0ZSA9IEBzcGVjaWFsWyBzdGF0ZSBdCisgICAgICAgIGlmIHNwZWNpYWxfc3RhdGUgPj0gMAorICAgICAgICAgIHN0YXRlID0gQHNwZWNpYWxfYmxvY2suY2FsbCggc3BlY2lhbF9zdGF0ZSApCisgICAgICAgICAgaWYgc3RhdGUgPT0gLTEKKyAgICAgICAgICAgIG5vX3ZpYWJsZV9hbHRlcm5hdGl2ZSggc3RhdGUsIGlucHV0ICkKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgZW5kCisgICAgICAgICAgaW5wdXQuY29uc3VtZQorICAgICAgICAgIG5leHQKKyAgICAgICAgZW5kCisgICAgICAgIEBhY2NlcHRbIHN0YXRlIF0gPj0gMSBhbmQgcmV0dXJuIEBhY2NlcHRbIHN0YXRlIF0KKyAgICAgICAgCisgICAgICAgICMgbG9vayBmb3IgYSBub3JtYWwgY2hhciB0cmFuc2l0aW9uCisgICAgICAgIAorICAgICAgICBjID0gaW5wdXQucGVlay5vcmQKKyAgICAgICAgIyB0aGUgQG1pbiBhbmQgQG1heCBhcnJheXMgY29udGFpbiB0aGUgYm91bmRzIG9mIHRoZSBjaGFyYWN0ZXIgKG9yIHRva2VuIHR5cGUpCisgICAgICAgICMgcmFuZ2VzIGZvciB0aGUgdHJhbnNpdGlvbiBkZWNpc2lvbnMKKyAgICAgICAgaWYgYy5iZXR3ZWVuPyggQG1pblsgc3RhdGUgXSwgQG1heFsgc3RhdGUgXSApCisgICAgICAgICAgIyBjIC0gQG1pbltzdGF0ZV0gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2l0aGluIHRoZSByYW5nZQorICAgICAgICAgICMgc28gZm9yIGEgcmFuZ2UgbGlrZSA/YS4uP3osIGEgbWF0Y2ggb2YgP2Egd291bGQgYmUgMCwKKyAgICAgICAgICAjID9jIHdvdWxkIGJlIDIsIGFuZCA/eiB3b3VsZCBiZSAyNQorICAgICAgICAgIG5leHRfc3RhdGUgPSBAdHJhbnNpdGlvblsgc3RhdGUgXVsgYyAtIEBtaW5bIHN0YXRlIF0gXQorICAgICAgICAgIGlmIG5leHRfc3RhdGUgPCAwCisgICAgICAgICAgICBpZiBAZW90WyBzdGF0ZSBdID49IDAKKyAgICAgICAgICAgICAgc3RhdGUgPSBAZW90WyBzdGF0ZSBdCisgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBub192aWFibGVfYWx0ZXJuYXRpdmUoIHN0YXRlLCBpbnB1dCApCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgIGVuZAorICAgICAgICAgIAorICAgICAgICAgIHN0YXRlID0gbmV4dF9zdGF0ZQorICAgICAgICAgIGlucHV0LmNvbnN1bWUKKyAgICAgICAgICBuZXh0CisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgaWYgQGVvdFsgc3RhdGUgXSA+PSAwCisgICAgICAgICAgc3RhdGUgPSBAZW90WyBzdGF0ZSBdCisgICAgICAgICAgaW5wdXQuY29uc3VtZSgpCisgICAgICAgICAgbmV4dAorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgICggYyA9PSBFT0YgJiYgQGVvZlsgc3RhdGUgXSA+PSAwICkgYW5kIHJldHVybiBAYWNjZXB0WyBAZW9mWyBzdGF0ZSBdIF0KKyAgICAgICAgbm9fdmlhYmxlX2FsdGVybmF0aXZlKCBzdGF0ZSwgaW5wdXQgKQorICAgICAgICByZXR1cm4gMAorICAgICAgZW5kCisgICAgICAKKyAgICAgIEFOVExSMy5idWchKCBVdGlsLnRpZHkoIDw8LUVORCApICkKKyAgICAgIHwgREZBIEJBTkchCisgICAgICB8ICAgVGhlIHByZWRpY3Rpb24gbG9vcCBoYXMgZXhjZWVkZWQgYSBtYXhpbXVtIGxpbWl0IG9mIDUwMDAwIGl0ZXJhdGlvbnMKKyAgICAgIHwgLS0tLQorICAgICAgfCBkZWNpc2lvbjogI0BkZWNpc2lvbl9udW1iZXIKKyAgICAgIHwgZGVzY3JpcHRpb246ICN7IGRlc2NyaXB0aW9uIH0KKyAgICAgIEVORAorICAgIGVuc3VyZQorICAgICAgaW5wdXQucmV3aW5kKCBtYXJrICkKKyAgICBlbmQKKyAgICAKKyAgZWxzZQorICAgIAorICAgIGRlZiBwcmVkaWN0KCBpbnB1dCApCisgICAgICBtYXJrID0gaW5wdXQubWFyaworICAgICAgc3RhdGUgPSAwCisgICAgICAKKyAgICAgIDUwMDAwLnRpbWVzIGRvCisgICAgICAgIHNwZWNpYWxfc3RhdGUgPSBAc3BlY2lhbFsgc3RhdGUgXQorICAgICAgICBpZiBzcGVjaWFsX3N0YXRlID49IDAKKyAgICAgICAgICBzdGF0ZSA9IEBzcGVjaWFsX2Jsb2NrLmNhbGwoIHNwZWNpYWxfc3RhdGUgKQorICAgICAgICAgIGlmIHN0YXRlID09IC0xCisgICAgICAgICAgICBub192aWFibGVfYWx0ZXJuYXRpdmUoIHN0YXRlLCBpbnB1dCApCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgIGVuZAorICAgICAgICAgIGlucHV0LmNvbnN1bWUKKyAgICAgICAgICBuZXh0CisgICAgICAgIGVuZAorICAgICAgICBAYWNjZXB0WyBzdGF0ZSBdID49IDEgYW5kIHJldHVybiBAYWNjZXB0WyBzdGF0ZSBdCisgICAgICAgIAorICAgICAgICAjIGxvb2sgZm9yIGEgbm9ybWFsIGNoYXIgdHJhbnNpdGlvbgorICAgICAgICAKKyAgICAgICAgYyA9IGlucHV0LnBlZWsKKyAgICAgICAgIyB0aGUgQG1pbiBhbmQgQG1heCBhcnJheXMgY29udGFpbiB0aGUgYm91bmRzIG9mIHRoZSBjaGFyYWN0ZXIgKG9yIHRva2VuIHR5cGUpCisgICAgICAgICMgcmFuZ2VzIGZvciB0aGUgdHJhbnNpdGlvbiBkZWNpc2lvbnMKKyAgICAgICAgaWYgYy5iZXR3ZWVuPyggQG1pblsgc3RhdGUgXSwgQG1heFsgc3RhdGUgXSApCisgICAgICAgICAgIyBjIC0gQG1pbltzdGF0ZV0gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2l0aGluIHRoZSByYW5nZQorICAgICAgICAgICMgc28gZm9yIGEgcmFuZ2UgbGlrZSA/YS4uP3osIGEgbWF0Y2ggb2YgP2Egd291bGQgYmUgMCwKKyAgICAgICAgICAjID9jIHdvdWxkIGJlIDIsIGFuZCA/eiB3b3VsZCBiZSAyNQorICAgICAgICAgIG5leHRfc3RhdGUgPSBAdHJhbnNpdGlvblsgc3RhdGUgXVsgYyAtIEBtaW5bIHN0YXRlIF0gXQorICAgICAgICAgIGlmIG5leHRfc3RhdGUgPCAwCisgICAgICAgICAgICBpZiBAZW90WyBzdGF0ZSBdID49IDAKKyAgICAgICAgICAgICAgc3RhdGUgPSBAZW90WyBzdGF0ZSBdCisgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBub192aWFibGVfYWx0ZXJuYXRpdmUoIHN0YXRlLCBpbnB1dCApCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgIGVuZAorICAgICAgICAgIAorICAgICAgICAgIHN0YXRlID0gbmV4dF9zdGF0ZQorICAgICAgICAgIGlucHV0LmNvbnN1bWUoKQorICAgICAgICAgIG5leHQKKyAgICAgICAgZW5kCisgICAgICAgIGlmIEBlb3RbIHN0YXRlIF0gPj0gMAorICAgICAgICAgIHN0YXRlID0gQGVvdFsgc3RhdGUgXQorICAgICAgICAgIGlucHV0LmNvbnN1bWUoKQorICAgICAgICAgIG5leHQKKyAgICAgICAgZW5kCisgICAgICAgICggYyA9PSBFT0YgJiYgQGVvZlsgc3RhdGUgXSA+PSAwICkgYW5kIHJldHVybiBAYWNjZXB0WyBAZW9mWyBzdGF0ZSBdIF0KKyAgICAgICAgbm9fdmlhYmxlX2FsdGVybmF0aXZlKCBzdGF0ZSwgaW5wdXQgKQorICAgICAgICByZXR1cm4gMAorICAgICAgZW5kCisgICAgICAKKyAgICAgIEFOVExSMy5idWchKCBVdGlsLnRpZHkoIDw8LUVORCApICkKKyAgICAgIHwgREZBIEJBTkchCisgICAgICB8ICAgVGhlIHByZWRpY3Rpb24gbG9vcCBoYXMgZXhjZWVkZWQgYSBtYXhpbXVtIGxpbWl0IG9mIDUwMDAwIGl0ZXJhdGlvbnMKKyAgICAgIHwgLS0tLQorICAgICAgfCBkZWNpc2lvbjogI0BkZWNpc2lvbl9udW1iZXIKKyAgICAgIHwgZGVzY3JpcHRpb246ICN7IGRlc2NyaXB0aW9uIH0KKyAgICAgIEVORAorICAgIGVuc3VyZQorICAgICAgaW5wdXQucmV3aW5kKCBtYXJrICkKKyAgICBlbmQKKyAgICAKKyAgZW5kCisgIAorICBkZWYgbm9fdmlhYmxlX2FsdGVybmF0aXZlKCBzdGF0ZSwgaW5wdXQgKQorICAgIHJhaXNlKCBCYWNrdHJhY2tpbmdGYWlsZWQgKSBpZiBAcmVjb2duaXplci5zdGF0ZS5iYWNrdHJhY2tpbmcgPiAwCisgICAgZXhjZXB0ID0gTm9WaWFibGVBbHRlcm5hdGl2ZS5uZXcoIGRlc2NyaXB0aW9uLCBAZGVjaXNpb25fbnVtYmVyLCBzdGF0ZSwgaW5wdXQgKQorICAgIGVycm9yKCBleGNlcHQgKQorICAgIHJhaXNlKCBleGNlcHQgKQorICBlbmQKKyAgCisgIGRlZiBlcnJvciggZXhjZXB0ICkKKyAgICAjIG92ZXJyaWRhYmxlIGRlYnVnZ2luZyBob29rCisgIGVuZAorICAKKyAgZGVmIHNwZWNpYWxfc3RhdGVfdHJhbnNpdGlvbiggc3RhdGUsIGlucHV0ICkKKyAgICByZXR1cm4gLTEKKyAgZW5kCisgIAorICBkZWYgZGVzY3JpcHRpb24KKyAgICByZXR1cm4gIm4vYSIKKyAgZW5kCitlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL2RvdC5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kb3QucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2MjVkZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9kb3QucmIKQEAgLTAsMCArMSwxNzQgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKK3JlcXVpcmUgJ2FudGxyMycKK3JlcXVpcmUgJ2VyYicKKworbW9kdWxlIEFOVExSMworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkRPVAorCitBbiBleHRyYSB1dGlsaXR5IGZvciBnZW5lcmF0aW5nIGdyYXBodml6IERPVCBmaWxlIHJlcHJlc2VudGF0aW9ucyBvZiBBTlRMUgorQWJzdHJhY3QgU3ludGF4IFRyZWUgbm9kZXMuCisKK1RoaXMgbW9kdWxlIGhhcyBiZWVuIGRpcmVjdGx5IHBvcnRlZCB0byBSdWJ5IGZyb20gdGhlIEFOVExSIFB5dGhvbiBydW50aW1lCitsaWJyYXJ5LgorCis9ZW5kCisKK21vZHVsZSBET1QKKyAgY2xhc3MgQ29udGV4dAorICAgIGRlZiBbXT0oIHZhciwgdmFsdWUgKQorICAgICAgaW5zdGFuY2VfdmFyaWFibGVfc2V0KCA6IkAjeyB2YXIgfSIsIHZhbHVlICkKKyAgICBlbmQKKyAgICBkZWYgW10oIHZhciApCisgICAgICBpbnN0YW5jZV92YXJpYWJsZV9nZXQoIDoiQCN7IHZhciB9IiApCisgICAgZW5kCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoIHRlbXBsYXRlLCB2YXJzID0ge30gKQorICAgICAgQF9fdGVtcGxhdGVfXyA9IHRlbXBsYXRlCisgICAgICB2YXJzLmVhY2ggZG8gfHZhciwgdmFsdWV8CisgICAgICAgIHNlbGZbIHZhciBdID0gdmFsdWUKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICBAX190ZW1wbGF0ZV9fLnJlc3VsdCggYmluZGluZyApCisgICAgZW5kCisgIGVuZAorICBjbGFzcyBUcmVlR2VuZXJhdG9yCisgICAgVFJFRV9URU1QTEFURSA9IEVSQi5uZXcoIFV0aWwudGlkeSggPDwtRU5EICkgKQorICAgIHwgZGlncmFwaCB7CisgICAgfCAgIG9yZGVyaW5nPW91dDsKKyAgICB8ICAgcmFua3NlcD0uNDsKKyAgICB8ICAgbm9kZSBbc2hhcGU9cGxhaW50ZXh0LCBmaXhlZHNpemU9dHJ1ZSwgZm9udHNpemU9MTEsIGZvbnRuYW1lPSJDb3VyaWVyIiwKKyAgICB8ICAgICAgICAgd2lkdGg9LjI1LCBoZWlnaHQ9LjI1XTsKKyAgICB8ICAgZWRnZSBbYXJyb3dzaXplPS41XTsKKyAgICB8ICAgPCU9IEBub2Rlcy5qb2luKCJcbiAgIikgJT4KKyAgICB8ICAgPCU9IEBlZGdlcy5qb2luKCJcbiAgIikgJT4KKyAgICB8IH0KKyAgICBFTkQKKyAgICAKKyAgICBOT0RFX1RFTVBMQVRFID0gRVJCLm5ldyggVXRpbC50aWR5KCA8PC1FTkQgKSApCisgICAgfCA8JT0gQG5hbWUgJT4gW2xhYmVsPSI8JT0gQHRleHQgJT4iXTsKKyAgICBFTkQKKyAgICAKKyAgICBFREdFX1RFTVBMQVRFID0gRVJCLm5ldyggVXRpbC50aWR5KCA8PC1FTkQgKSApCisgICAgfCA8JT0gQHBhcmVudCAlPiAtPiA8JT0gQGNoaWxkICU+OyAvLyAiPCU9IEBwYXJlbnRfdGV4dCAlPiIgLT4gIjwlPSBAY2hpbGRfdGV4dCAlPiIKKyAgICBFTkQKKyAgICAKKyAgICBkZWYgc2VsZi5nZW5lcmF0ZSggdHJlZSwgYWRhcHRvciA9IG5pbCwgdHJlZV90ZW1wbGF0ZSA9IFRSRUVfVEVNUExBVEUsCisgICAgICAgICAgICAgICAgICAgICAgZWRnZV90ZW1wbGF0ZSA9IEVER0VfVEVNUExBVEUgKQorICAgICAgbmV3LnRvX2RvdCggdHJlZSwgYWRhcHRvciwgdHJlZV90ZW1wbGF0ZSwgZWRnZV90ZW1wbGF0ZSApCisgICAgZW5kCisgICAgCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBub2RlX251bWJlciA9IDAKKyAgICAgIEBub2RlX3RvX251bWJlcl9tYXAgPSBIYXNoLm5ldyBkbyB8bWFwLCBub2RlfAorICAgICAgICBtYXBbIG5vZGUgXSA9IEBub2RlX251bWJlcgorICAgICAgICBAbm9kZV9udW1iZXIgKz0gMQorICAgICAgICBAbm9kZV9udW1iZXIgLSAxCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fZG90KCB0cmVlLCBhZGFwdG9yID0gbmlsLCB0cmVlX3RlbXBsYXRlID0gVFJFRV9URU1QTEFURSwKKyAgICAgICAgICAgICAgIGVkZ2VfdGVtcGxhdGUgPSBFREdFX1RFTVBMQVRFICkKKyAgICAgIGFkYXB0b3IgfHw9IEFTVDo6Q29tbW9uVHJlZUFkYXB0b3IubmV3CisgICAgICBAbm9kZV9udW1iZXIgPSAwCisgICAgICB0cmVlX3RlbXBsYXRlID0gQ29udGV4dC5uZXcoIHRyZWVfdGVtcGxhdGUsIDpub2RlcyA9PiBbXSwgOmVkZ2VzID0+IFtdICkKKyAgICAgIGRlZmluZV9ub2RlcyggdHJlZSwgYWRhcHRvciwgdHJlZV90ZW1wbGF0ZSApCisgICAgICAKKyAgICAgIEBub2RlX251bWJlciA9IDAKKyAgICAgIGRlZmluZV9lZGdlcyggdHJlZSwgYWRhcHRvciwgdHJlZV90ZW1wbGF0ZSwgZWRnZV90ZW1wbGF0ZSApCisgICAgICByZXR1cm4gdHJlZV90ZW1wbGF0ZS50b19zCisgICAgZW5kCisgICAgCisgICAgZGVmIGRlZmluZV9ub2RlcyggdHJlZSwgYWRhcHRvciwgdHJlZV90ZW1wbGF0ZSwga25vd25fbm9kZXMgPSBuaWwgKQorICAgICAga25vd25fbm9kZXMgfHw9IFNldC5uZXcKKyAgICAgIHRyZWUubmlsPyBhbmQgcmV0dXJuCisgICAgICBuID0gYWRhcHRvci5jaGlsZF9jb3VudCggdHJlZSApCisgICAgICBuID09IDAgYW5kIHJldHVybgorICAgICAgbnVtYmVyID0gbm9kZV9udW1iZXIoIHRyZWUgKQorICAgICAgdW5sZXNzIGtub3duX25vZGVzLmluY2x1ZGU/KCBudW1iZXIgKQorICAgICAgICBwYXJlbnRfbm9kZV90ZW1wbGF0ZSA9IG5vZGVfdGVtcGxhdGVfZm9yKCBhZGFwdG9yLCBjaGlsZCApCisgICAgICAgIHRyZWVfdGVtcGxhdGVbIDpub2RlcyBdIDw8IHBhcmVudF9ub2RlX3RlbXBsYXRlCisgICAgICAgIGtub3duX25vZGVzLmFkZCggbnVtYmVyICkKKyAgICAgIGVuZAorICAgICAgCisgICAgICBuLnRpbWVzIGRvIHxpbmRleHwKKyAgICAgICAgY2hpbGQgPSBhZGFwdG9yLmNoaWxkX29mKCB0cmVlLCBpbmRleCApCisgICAgICAgIG51bWJlciA9IEBub2RlX3RvX251bWJlcl9tYXBbIGNoaWxkIF0KKyAgICAgICAgdW5sZXNzIGtub3duX25vZGVzLmluY2x1ZGU/KCBudW1iZXIgKQorICAgICAgICAgIG5vZGVfdGVtcGxhdGUgPSBub2RlX3RlbXBsYXRlX2ZvciggYWRhcHRvciwgY2hpbGQgKQorICAgICAgICAgIHRyZWVfdGVtcGxhdGVbIDpub2RlcyBdIDw8IG5vZGVfdGVtcGxhdGUKKyAgICAgICAgICBrbm93bl9ub2Rlcy5hZGQoIG51bWJlciApCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgZGVmaW5lX25vZGVzKCBjaGlsZCwgYWRhcHRvciwgdHJlZV90ZW1wbGF0ZSwgZWRnZV90ZW1wbGF0ZSApCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgZGVmaW5lX2VkZ2VzKCB0cmVlLCBhZGFwdG9yLCB0cmVlX3RlbXBsYXRlLCBlZGdlX3RlbXBsYXRlICkKKyAgICAgIHRyZWUubmlsPyBvciByZXR1cm4KKyAgICAgIAorICAgICAgbiA9IGFkYXB0b3IuY2hpbGRfY291bnQoIHRyZWUgKQorICAgICAgbiA9PSAwIGFuZCByZXR1cm4KKyAgICAgIAorICAgICAgcGFyZW50X25hbWUgPSAnbiVpJyAlIEBub2RlX3RvX251bWJlcl9tYXBbIHRyZWUgXQorICAgICAgcGFyZW50X3RleHQgPSBhZGFwdG9yLnRleHRfb2YoIHRyZWUgKQorICAgICAgbi50aW1lcyBkbyB8aW5kZXh8CisgICAgICAgIGNoaWxkID0gYWRhcHRvci5jaGlsZF9vZiggdHJlZSwgaW5kZXggKQorICAgICAgICBjaGlsZF90ZXh0ID0gYWRhcHRvci50ZXh0X29mKCBjaGlsZCApCisgICAgICAgIGNoaWxkX25hbWUgPSAnbiVpJyAlIEBub2RlX3RvX251bWJlcl9tYXBbIHRyZWUgXQorICAgICAgICBlZGdlX3RlbXBsYXRlID0gQ29udGV4dC5uZXcoIGVkZ2VfdGVtcGxhdGUsCisgICAgICAgICAgOnBhcmVudCA9PiBwYXJlbnRfbmFtZSwgOmNoaWxkID0+IGNoaWxkX25hbWUsCisgICAgICAgICAgOnBhcmVudF90ZXh0ID0+IHBhcmVudF90ZXh0LCA6Y2hpbGRfdGV4dCA9PiBjaGlsZF90ZXh0CisgICAgICAgICkKKyAgICAgICAgdHJlZV90ZW1wbGF0ZVsgOmVkZ2VzIF0gPDwgZWRnZV90ZW1wbGF0ZQorICAgICAgICBkZWZpbmVfZWRnZXMoIGNoaWxkLCBhZGFwdG9yLCB0cmVlX3RlbXBsYXRlLCBlZGdlX3RlbXBsYXRlICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiBub2RlX3RlbXBsYXRlX2ZvciggYWRhcHRvciwgdHJlZSApCisgICAgICB0ZXh0ID0gYWRhcHRvci50ZXh0X29mKCB0cmVlICkKKyAgICAgIG5vZGVfdGVtcGxhdGUgPSBDb250ZXh0Lm5ldyggTk9ERV9URU1QTEFURSApCisgICAgICB1bmlxdWVfbmFtZSA9ICduJWknICUgQG5vZGVfdG9fbnVtYmVyX21hcFsgdHJlZSBdCisgICAgICBub2RlX3RlbXBsYXRlWyA6bmFtZSBdID0gdW5pcXVlX25hbWUKKyAgICAgIHRleHQgYW5kIHRleHQgPSB0ZXh0LmdzdWIoIC8iLywgJ1xcIicgKQorICAgICAgbm9kZV90ZW1wbGF0ZVsgOnRleHQgXSA9IHRleHQKKyAgICAgIHJldHVybiBub2RlX3RlbXBsYXRlCisgICAgZW5kCisgIGVuZAorZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9lcnJvci5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9lcnJvci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTgxNjkyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL2Vycm9yLnJiCkBAIC0wLDAgKzEsNjcwIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKz1iZWdpbiBMSUNFTlNFCisKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEt5bGUgWWV0dGVyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworPWVuZAorCisjIEFOVExSMyBleGNlcHRpb24gaGllcmFyY2h5CisjIC0gcG9ydGVkIGZyb20gdGhlIEFOVExSMyBQeXRob24gUnVudGltZSBsaWJyYXJ5IGJ5CisjICAgS3lsZSBZZXR0ZXIgKGtjeTViQHlhaG9vLmNvbSkKK21vZHVsZSBBTlRMUjMKKworIyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHJ1YmluaXVzLCB3aGljaCBkb2VzIG5vdCBpbXBsZW1lbnQgU3RvcEl0ZXJhdGlvbiB5ZXQKK3VubGVzcyBkZWZpbmVkPyggU3RvcEl0ZXJhdGlvbiApCisgIFN0b3BJdGVyYXRpb24gPSBDbGFzcy5uZXcoIFN0YW5kYXJkRXJyb3IgKQorZW5kCisKK21vZHVsZSBFcnJvcgorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpCYWNrdHJhY2tpbmdGYWlsZWQKKworZXJyb3I6OiBCYWNrdHJhY2tpbmdGYWlsZWQKK3VzZWQgYnk6OiBhbGwgcmVjb2duaXplcnMKK29jY3VycyB3aGVuOjoKKyAgcmVjb2duaXplciBpcyBpbiBiYWNrdHJhY2tpbmcgbW9kZSAoaS5lLiByLnN0YXRlLmJhY2t0cmFja2luZyA+IDApCisgIGFuZCB0aGUgZGVjaXNpb24gcGF0aCB0aGUgcmVjb2duaXplciBpcyBjdXJyZW50bHkgYXR0ZW1wdGluZworICBoaXQgYSBwb2ludCBvZiBmYWlsdXJlCitub3Rlczo6CisgIC0gZnVuY3Rpb25zIG1vcmUgYXMgYW4gaW50ZXJuYWwgc2lnbmFsLCBzaW1pbGxhciB0byBleGNlcHRpb24KKyAgICBjbGFzc2VzIHN1Y2ggYXMgU3RvcEl0ZXJhdGlvbiBhbmQgU3lzdGVtRXhpdAorICAtIHVzZWQgdG8gaW5mb3JtIHRoZSByZWNvZ25pemVyIHRoYXQgaXQgbmVlZHMgdG8gcmV3aW5kCisgICAgdGhlIGlucHV0IHRvIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdGFydGVkIHRoZSBkZWNpc2lvbgorICAgIGFuZCB0aGVuIGVpdGhlciB0cnkgYW5vdGhlciBwb3NzaWJsZSBkZWNpc2lvbiBwYXRoIG9yCisgICAgZGVjbGFyZSBmYWlsdXJlCisgIC0gbm90IGEgc3ViY2xhc3Mgb2YgUmVjb2duaXRpb25FcnJvcgorCis9ZW5kCisKK2NsYXNzIEJhY2t0cmFja2luZ0ZhaWxlZCA8IFN0YW5kYXJkRXJyb3I7IGVuZAorICAKKyAgIyBUbyBhdm9pZCBFbmdsaXNoLW9ubHkgZXJyb3IgbWVzc2FnZXMgYW5kIHRvIGdlbmVyYWxseSBtYWtlIHRoaW5ncworICAjIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlLCB0aGVzZSBleGNlcHRpb25zIGFyZSBub3QgY3JlYXRlZCB3aXRoIHN0cmluZ3MsCisgICMgYnV0IHJhdGhlciB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGFuIGVycm9yLiAgVGhlbgorICAjIHRoZSB2YXJpb3VzIHJlcG9ydGluZyBtZXRob2RzIGluIFBhcnNlciBhbmQgTGV4ZXIgY2FuIGJlIG92ZXJyaWRkZW4KKyAgIyB0byBnZW5lcmF0ZSBhIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlLiAgRm9yIGV4YW1wbGUsIE1pc21hdGNoZWRUb2tlbgorICAjIGV4Y2VwdGlvbnMgYXJlIGJ1aWx0IHdpdGggdGhlIGV4cGVjdGVkIHRva2VuIHR5cGUuCisgICMgU28sIGRvbid0IGV4cGVjdCBnZXRNZXNzYWdlKCkgdG8gcmV0dXJuIGFueXRoaW5nLgorICAjCisgICMgTm90ZSB0aGF0IGFzIG9mIEphdmEgMS40LCB5b3UgY2FuIGFjY2VzcyB0aGUgc3RhY2sgdHJhY2UsIHdoaWNoIG1lYW5zCisgICMgdGhhdCB5b3UgY2FuIGNvbXB1dGUgdGhlIGNvbXBsZXRlIHRyYWNlIG9mIHJ1bGVzIGZyb20gdGhlIHN0YXJ0IHN5bWJvbC4KKyAgIyBUaGlzIGdpdmVzIHlvdSBjb25zaWRlcmFibGUgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIHRvIGdlbmVyYXRlCisgICMgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLgorICAjCisgICMgQU5UTFIgZ2VuZXJhdGVzIGNvZGUgdGhhdCB0aHJvd3MgZXhjZXB0aW9ucyB1cG9uIHJlY29nbml0aW9uIGVycm9yIGFuZAorICAjIGFsc28gZ2VuZXJhdGVzIGNvZGUgdG8gY2F0Y2ggdGhlc2UgZXhjZXB0aW9ucyBpbiBlYWNoIHJ1bGUuICBJZiB5b3UKKyAgIyB3YW50IHRvIHF1aXQgdXBvbiBmaXJzdCBlcnJvciwgeW91IGNhbiB0dXJuIG9mZiB0aGUgYXV0b21hdGljIGVycm9yCisgICMgaGFuZGxpbmcgbWVjaGFuaXNtIHVzaW5nIHJ1bGVjYXRjaCBhY3Rpb24sIGJ1dCB5b3Ugc3RpbGwgbmVlZCB0bworICAjIG92ZXJyaWRlIG1ldGhvZHMgbWlzbWF0Y2ggYW5kIHJlY292ZXJGcm9tTWlzbWF0Y2hTZXQuCisgICMKKyAgIyBJbiBnZW5lcmFsLCB0aGUgcmVjb2duaXRpb24gZXhjZXB0aW9ucyBjYW4gdHJhY2sgd2hlcmUgaW4gYSBncmFtbWFyIGEKKyAgIyBwcm9ibGVtIG9jY3VycmVkIGFuZC9vciB3aGF0IHdhcyB0aGUgZXhwZWN0ZWQgaW5wdXQuICBXaGlsZSB0aGUgcGFyc2VyCisgICMga25vd3MgaXRzIHN0YXRlIChzdWNoIGFzIGN1cnJlbnQgaW5wdXQgc3ltYm9sIGFuZCBsaW5lIGluZm8pIHRoYXQKKyAgIyBzdGF0ZSBjYW4gY2hhbmdlIGJlZm9yZSB0aGUgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIHNvIGN1cnJlbnQgdG9rZW4gaW5kZXgKKyAgIyBpcyBjb21wdXRlZCBhbmQgc3RvcmVkIGF0IGV4Y2VwdGlvbiB0aW1lLiAgRnJvbSB0aGlzIGluZm8sIHlvdSBjYW4KKyAgIyBwZXJoYXBzIHByaW50IGFuIGVudGlyZSBsaW5lIG9mIGlucHV0IG5vdCBqdXN0IGEgc2luZ2xlIHRva2VuLCBmb3IgZXhhbXBsZS4KKyAgIyBCZXR0ZXIgdG8ganVzdCBzYXkgdGhlIHJlY29nbml6ZXIgaGFkIGEgcHJvYmxlbSBhbmQgdGhlbiBsZXQgdGhlIHBhcnNlcgorICAjIGZpZ3VyZSBvdXQgYSBmYW5jeSByZXBvcnQuCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RXJyb3I6OlJlY29nbml0aW9uRXJyb3IKKworVGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHZhcmlldHkgb2Ygc3ludGF4IGVycm9ycyB0aGF0IGNhbiBvY2N1ciBkdXJpbmcgdGhlCityZWNvZ25pdGlvbiBwcm9jZXNzLiBUaGVzZSBlcnJvcnMgYWxsIHR5cGljYWxseSBjb25jZXJuIGFuIGV4cGVjdGF0aW9uIGJ1aWx0IGluCit0byB0aGUgcmVjb2duaXplciBieSB0aGUgcnVsZXMgb2YgYSBncmFtbWFyIGFuZCBhbiBpbnB1dCBzeW1ib2wgd2hpY2ggZmFpbGVkIHRvCitmaXQgdGhlIGV4cGVjdGF0aW9uLgorCis9ZW5kCisKK2NsYXNzIFJlY29nbml0aW9uRXJyb3IgPCBTdGFuZGFyZEVycm9yCisgIGluY2x1ZGUgQU5UTFIzOjpDb25zdGFudHMKKyAgYXR0cl9hY2Nlc3NvciA6aW5wdXQsIDppbmRleCwgOmxpbmUsIDpjb2x1bW4sIDpzeW1ib2wsIDp0b2tlbiwgOnNvdXJjZV9uYW1lCisgIAorICBkZWYgaW5pdGlhbGl6ZSggaW5wdXQgPSBuaWwgKQorICAgIEBpbmRleCA9IEBsaW5lID0gIEBjb2x1bW4gPSBuaWwKKyAgICBAYXBwcm94aW1hdGVfbGluZV9pbmZvID0gZmFsc2UKKyAgICBpZiBAaW5wdXQgPSBpbnB1dAorICAgICAgQGluZGV4ID0gaW5wdXQuaW5kZXgKKyAgICAgIEBzb3VyY2VfbmFtZSA9IEBpbnB1dC5zb3VyY2VfbmFtZSByZXNjdWUgbmlsCisgICAgICBjYXNlIEBpbnB1dAorICAgICAgd2hlbiBUb2tlblN0cmVhbQorICAgICAgICBAdG9rZW4gPSBAc3ltYm9sID0gaW5wdXQubG9vaworICAgICAgICBAbGluZSAgID0gQHN5bWJvbC5saW5lCisgICAgICAgIEBjb2x1bW4gPSBAc3ltYm9sLmNvbHVtbgorICAgICAgd2hlbiBDaGFyYWN0ZXJTdHJlYW0KKyAgICAgICAgQHRva2VuID0gQHN5bWJvbCA9IGlucHV0LnBlZWsgfHwgRU9GCisgICAgICAgIEBsaW5lICAgPSBAaW5wdXQubGluZQorICAgICAgICBAY29sdW1uID0gQGlucHV0LmNvbHVtbgorICAgICAgd2hlbiBBU1Q6OlRyZWVOb2RlU3RyZWFtCisgICAgICAgIEBzeW1ib2wgPSBAaW5wdXQubG9vaworICAgICAgICBpZiBAc3ltYm9sLnJlc3BvbmRfdG8/KCA6bGluZSApIGFuZCBAc3ltYm9sLnJlc3BvbmRfdG8/KCA6Y29sdW1uICkKKyAgICAgICAgICBAbGluZSwgQGNvbHVtbiA9IEBzeW1ib2wubGluZSwgQHN5bWJvbC5jb2x1bW4KKyAgICAgICAgZWxzZQorICAgICAgICAgIGV4dHJhY3RfZnJvbV9ub2RlX3N0cmVhbSggQGlucHV0ICkKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIEBzeW1ib2wgPSBAaW5wdXQubG9vaworICAgICAgICBpZiBAc3ltYm9sLnJlc3BvbmRfdG8/KCA6bGluZSApIGFuZCBAc3ltYm9sLnJlc3BvbmRfdG8/KCA6Y29sdW1uICkKKyAgICAgICAgICBAbGluZSwgQGNvbHVtbiA9IEBzeW1ib2wubGluZSwgQHN5bWJvbC5jb2x1bW4KKyAgICAgICAgZWxzaWYgQGlucHV0LnJlc3BvbmRfdG8/KCA6bGluZSApIGFuZCBAaW5wdXQucmVzcG9uZF90bz8oIDpjb2x1bW4gKQorICAgICAgICAgIEBsaW5lLCBAY29sdW1uID0gQGlucHV0LmxpbmUsIEBpbnB1dC5jb2x1bW4KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBzdXBlciggbWVzc2FnZSApCisgIGVuZAorICAKKyAgZGVmIGFwcHJveGltYXRlX2xpbmVfaW5mbz8KKyAgICBAYXBwcm94aW1hdGVfbGluZV9pbmZvCisgIGVuZAorICAKKyAgZGVmIHVuZXhwZWN0ZWRfdHlwZQorICAgIGNhc2UgQGlucHV0CisgICAgd2hlbiBUb2tlblN0cmVhbQorICAgICAgQHN5bWJvbC50eXBlCisgICAgd2hlbiBBU1Q6OlRyZWVOb2RlU3RyZWFtCisgICAgICBhZGFwdG9yID0gQGlucHV0LmFkYXB0b3IKKyAgICAgIHJldHVybiBhZGFwdG9yLnR5cGUoIEBzeW1ib2wgKQorICAgIGVsc2UKKyAgICAgIHJldHVybiBAc3ltYm9sCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGxvY2F0aW9uCisgICAgaWYgQHNvdXJjZV9uYW1lIHRoZW4gImluICNAc291cmNlX25hbWUgQCBsaW5lICNAbGluZTojQGNvbHVtbiIKKyAgICBlbHNlICJsaW5lICNAbGluZTojQGNvbHVtbiIKKyAgICBlbmQKKyAgZW5kCisgIAorICBhbGlhcyBpbnNwZWN0IG1lc3NhZ2UKKyAgCitwcml2YXRlCisgIAorICBkZWYgZXh0cmFjdF9mcm9tX25vZGVfc3RyZWFtKCBub2RlcyApCisgICAgYWRhcHRvciA9IG5vZGVzLmFkYXB0b3IKKyAgICBwYXlsb2FkID0gYWRhcHRvci50b2tlbiggQHN5bWJvbCApCisgICAgCisgICAgaWYgcGF5bG9hZAorICAgICAgQHRva2VuID0gcGF5bG9hZAorICAgICAgaWYgcGF5bG9hZC5saW5lIDw9IDAKKyAgICAgICAgaSA9IC0xCisgICAgICAgIHdoaWxlIHByaW9yX25vZGUgPSBub2Rlcy5sb29rKCBpICkKKyAgICAgICAgICBwcmlvcl9wYXlsb2FkID0gYWRhcHRvci50b2tlbiggcHJpb3Jfbm9kZSApCisgICAgICAgICAgaWYgcHJpb3JfcGF5bG9hZCBhbmQgcHJpb3JfcGF5bG9hZC5saW5lID4gMAorICAgICAgICAgICAgQGxpbmUgPSBwcmlvcl9wYXlsb2FkLmxpbmUKKyAgICAgICAgICAgIEBjb2x1bW4gPSBwcmlvcl9wYXlsb2FkLmNvbHVtbgorICAgICAgICAgICAgQGFwcHJveGltYXRlX2xpbmVfaW5mbyA9IHRydWUKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZW5kCisgICAgICAgICAgaSAtPSAxCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBAbGluZSA9IHBheWxvYWQubGluZQorICAgICAgICBAY29sdW1uID0gcGF5bG9hZC5jb2x1bW4KKyAgICAgIGVuZAorICAgIGVsc2lmIEBzeW1ib2wuaXNfYT8oIEFTVDo6VHJlZSApCisgICAgICBAbGluZSA9IEBzeW1ib2wubGluZQorICAgICAgQGNvbHVtbiA9IEBzeW1ib2wuY29sdW1uCisgICAgICBAc3ltYm9sLmlzX2E/KCBBU1Q6OkNvbW1vblRyZWUgKSBhbmQgQHRva2VuID0gQHN5bWJvbC50b2tlbgorICAgIGVsc2UKKyAgICAgIHR5cGUgPSBhZGFwdG9yLnR5cGUoIEBzeW1ib2wgKQorICAgICAgdGV4dCA9IGFkYXB0b3IudGV4dCggQHN5bWJvbCApCisgICAgICB0b2tlbl9jbGFzcyA9IEBpbnB1dC50b2tlbl9jbGFzcyByZXNjdWUgQ29tbW9uVG9rZW4KKyAgICAgIEB0b2tlbiA9IHRva2VuX2NsYXNzLm5ldworICAgICAgQHRva2VuLnR5cGUgPSB0eXBlCisgICAgICBAdG9rZW4udGV4dCA9IHRleHQKKyAgICAgIEB0b2tlbgorICAgIGVuZAorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpNaXNtYXRjaGVkVG9rZW4KKwordHlwZTo6IE1pc21hdGNoZWRUb2tlbgordXNlZCBieTo6IGxleGVycyBhbmQgcGFyc2Vycworb2NjdXJzIHdoZW46OgorICBUaGUgcmVjb2duaXplciBleHBlY3RlZCB0byBtYXRjaCBhIHN5bWJvbCA8dHQ+eDwvdHQ+IGF0IHRoZSBjdXJyZW50IGlucHV0CisgIHBvc2l0aW9uLCBidXQgaXQgc2F3IGEgZGlmZmVyZW50IHN5bWJvbCA8dHQ+eTwvdHQ+IGluc3RlYWQuCisKKz1lbmQKKworY2xhc3MgTWlzbWF0Y2hlZFRva2VuIDwgUmVjb2duaXRpb25FcnJvcgorICBhdHRyX3JlYWRlciA6ZXhwZWN0aW5nCisgIAorICBkZWYgaW5pdGlhbGl6ZSggZXhwZWN0aW5nLCBpbnB1dCApCisgICAgQGV4cGVjdGluZyA9IGV4cGVjdGluZworICAgIHN1cGVyKCBpbnB1dCApCisgIGVuZAorICAKKyAgZGVmIG1lc3NhZ2UKKyAgICAiJXM6ICVwICVwIiAlIFsgc2VsZi5jbGFzcywgdW5leHBlY3RlZF90eXBlLCBAZXhwZWN0aW5nLmluc3BlY3QgXQorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpVbndhbnRlZFRva2VuCisKK1RPRE86IHRoaXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHVzZWQgYnkgYW55IGNvZGUKKworPWVuZAorCitjbGFzcyBVbndhbnRlZFRva2VuIDwgTWlzbWF0Y2hlZFRva2VuCisgIGRlZiB1bmV4cGVjdGVkX3Rva2VuCisgICAgcmV0dXJuIEB0b2tlbgorICBlbmQKKyAgCisgIGRlZiBtZXNzYWdlCisgICAgZXhwID0gQGV4cGVjdGluZyA9PSBJTlZBTElEX1RPS0VOX1RZUEUgPyAnJyA6ICIsIGV4cGVjdGVkICVwIiAlIEBleHBlY3RpbmcKKyAgICB0ZXh0ID0gQHN5bWJvbC50ZXh0IHJlc2N1ZSBuaWwKKyAgICAiJXM6IGZvdW5kPSVwJXMiICUgWyBzZWxmLmNsYXNzLCB0ZXh0LCBleHAgXQorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpNaXNzaW5nVG9rZW4KKworZXJyb3I6OiBNaXNzaW5nVG9rZW4KK3VzZWQgYnk6OiBwYXJzZXJzIGFuZCB0cmVlIHBhcnNlcnMKK29jY3VycyB3aGVuOjoKKyAgVGhlIHJlY29nbml6ZXIgZXhwZWN0ZWQgdG8gbWF0Y2ggc29tZSBzeW1ib2wsIGJ1dCBpdCBzZWVzIGEgZGlmZmVyZW50IHN5bWJvbC4KKyAgVGhlIHN5bWJvbCBpdCBzZWVzIGlzIGFjdHVhbGx5IHdoYXQgdGhlIHJlY29nbml6ZXIgZXhwZWN0ZWQgdG8gbWF0Y2ggbmV4dC4KKworPT09IEV4YW1wbGUKKworZ3JhbW1hcjoKKworICBncmFtbWFyIE1pc3NpbmdUb2tlbkV4YW1wbGU7CisKKyAgb3B0aW9ucyB7IGxhbmd1YWdlID0gUnVieTsgfQorICAKKyAgQG1lbWJlcnMgeworICAgIGRlZiByZXBvcnRfZXJyb3IoZSkKKyAgICAgIHJhaXNlIGUKKyAgICBlbmQKKyAgfQorICAKKyAgbWlzc2luZzogQSBCIEM7CisgIAorICBBOiAnYSc7CisgIEI6ICdiJzsKKyAgQzogJ2MnOworCitpbiBydWJ5OgorCisgIHJlcXVpcmUgJ01pc3NpbmdUb2tlbkV4YW1wbGVMZXhlcicKKyAgcmVxdWlyZSAnTWlzc2luZ1Rva2VuRXhhbXBsZVBhcnNlcicKKyAgCisgIGxleGVyID0gTWlzc2luZ1Rva2VuRXhhbXBsZTo6TGV4ZXIubmV3KCAiYWMiICkgICMgPD0gbm90aWNlIHRoZSBtaXNzaW5nICdiJworICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICBwYXJzZXIgPSBNaXNzaW5nVG9rZW5FeGFtcGxlOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAKKyAgcGFyc2VyLm1pc3NpbmcKKyAgIyByYWlzZXMgQU5UTFIzOjpFcnJvcjo6TWlzc2luZ1Rva2VuOiBhdCAiYyIKKworPWVuZAorCitjbGFzcyBNaXNzaW5nVG9rZW4gPCBNaXNtYXRjaGVkVG9rZW4KKyAgYXR0cl9hY2Nlc3NvciA6aW5zZXJ0ZWQKKyAgZGVmIGluaXRpYWxpemUoIGV4cGVjdGluZywgaW5wdXQsIGluc2VydGVkICkKKyAgICBzdXBlciggZXhwZWN0aW5nLCBpbnB1dCApCisgICAgQGluc2VydGVkID0gaW5zZXJ0ZWQKKyAgZW5kCisgIAorICBkZWYgbWlzc2luZ190eXBlCisgICAgcmV0dXJuIEBleHBlY3RpbmcKKyAgZW5kCisgIAorICBkZWYgbWVzc2FnZQorICAgIGlmIEBpbnNlcnRlZCBhbmQgQHN5bWJvbAorICAgICAgIiVzOiBpbnNlcnRlZCAlcCBhdCAlcCIgJQorICAgICAgICBbIHNlbGYuY2xhc3MsIEBpbnNlcnRlZCwgQHN5bWJvbC50ZXh0IF0KKyAgICBlbHNlCisgICAgICBtc2cgPSBzZWxmLmNsYXNzLnRvX3MKKyAgICAgIG1zZyA8PCAnOiBhdCAlcCcgJSB0b2tlbi50ZXh0IHVubGVzcyBAdG9rZW4ubmlsPworICAgICAgcmV0dXJuIG1zZworICAgIGVuZAorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpNaXNtYXRjaGVkUmFuZ2UKKworZXJyb3I6OiBNaXNtYXRjaGVkUmFuZ2UKK3VzZWQgYnk6OiBhbGwgcmVjb2duaXplcnMgCitvY2N1cnMgd2hlbjo6CisgIEEgcmVjb2duaXplciBleHBlY3RlZCB0byBtYXRjaCBhbiBpbnB1dCBzeW1ib2wgKGVpdGhlciBhIGNoYXJhY3RlciB2YWx1ZSBvcgorICBhbiBpbnRlZ2VyIHRva2VuIHR5cGUgdmFsdWUpIHRoYXQgZmFsbHMgaW50byBhIHJhbmdlIG9mIHBvc3NpYmxlIHZhbHVlcywgYnV0CisgIGluc3RlYWQgaXQgc2F3IGEgc3ltYm9sIHRoYXQgZmFsbHMgb3V0c2lkZSB0aGUgZXhwZWN0ZWQgcmFuZ2UuCisKKz1lbmQKKworY2xhc3MgTWlzbWF0Y2hlZFJhbmdlIDwgUmVjb2duaXRpb25FcnJvcgorICBhdHRyX2FjY2Vzc29yIDptaW4sIDptYXgKKyAgZGVmIGluaXRpYWxpemUoIG1pbiwgbWF4LCBpbnB1dCApCisgICAgQG1pbiA9IG1pbgorICAgIEBtYXggPSBtYXgKKyAgICBzdXBlciggaW5wdXQgKQorICBlbmQKKyAgCisgIGRlZiBtZXNzYWdlCisgICAgIiVzOiAlcCBub3QgaW4gJXAuLiVwIiAlCisgICAgICBbIHNlbGYuY2xhc3MsIHVuZXhwZWN0ZWRfdHlwZSwgQG1pbiwgQG1heCBdCisgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RXJyb3I6Ok1pc21hdGNoZWRTZXQKKworZXJyb3I6OiBNaXNtYXRjaGVkU2V0Cit1c2VkIGJ5OjogYWxsIHJlY29nbml6ZXJzCitvY2N1cnMgd2hlbjo6CisgIEEgcmVjb2duaXplciBleHBlY3RzIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCB0byBiZSBhIG1lbWJlciBvZiBhIHNldCBvZgorICBwb3NzaWJsZSBzeW1ib2wgdmFsdWVzLCBidXQgdGhlIGN1cnJlbnQgc3ltYm9sIGRvZXMgbm90IG1hdGNoLgorCis9ZW5kCisKK2NsYXNzIE1pc21hdGNoZWRTZXQgPCBSZWNvZ25pdGlvbkVycm9yCisgIGF0dHJfYWNjZXNzb3IgOmV4cGVjdGluZworICBkZWYgaW5pdGlhbGl6ZSggZXhwZWN0aW5nLCBpbnB1dCApCisgICAgc3VwZXIoIGlucHV0ICkKKyAgICBAZXhwZWN0aW5nID0gZXhwZWN0aW5nCisgIGVuZAorICAKKyAgZGVmIG1lc3NhZ2UKKyAgICAiJXM6ICVwIG5vdCBpbiAlcCIgJQorICAgICAgWyBzZWxmLmNsYXNzLCB1bmV4cGVjdGVkX3R5cGUsIEBleHBlY3RpbmcgXQorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpNaXNtYXRjaGVkTm90U2V0CisKK2Vycm9yOjogTWlzbWF0Y2hlZE5vdFNldAordXNlZCBieTo6IGFsbCByZWNvZ25pemVycworb2NjdXJzIHdoZW46OgorICBBIHJlY29nbml6ZXIgZXhwZWN0ZWQgdG8gbWF0Y2ggc3ltYm9sIHRoYXQgaXMgbm90IGluIHNvbWUgc2V0IG9mIHN5bWJvbHMgYnV0CisgIGZhaWxlZC4KKworPWVuZAorCitjbGFzcyBNaXNtYXRjaGVkTm90U2V0IDwgTWlzbWF0Y2hlZFNldAorICBkZWYgbWVzc2FnZQorICAgICclczogJXAgIT0gJXAnICUKKyAgICAgIFsgc2VsZi5jbGFzcywgdW5leHBlY3RlZF90eXBlLCBAZXhwZWN0aW5nIF0KKyAgZW5kCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpFcnJvcjo6Tm9WaWFibGVBbHRlcm5hdGl2ZQorCitlcnJvcjo6IE5vVmlhYmxlQWx0ZXJuYXRpdmUKK3VzZWQgYnk6OiBhbGwgcmVjb2duaXplcnMKK29jY3VycyB3aGVuOjoKKyAgQSByZWNvZ25pemVyIG11c3QgY2hvb3NlIGJldHdlZW4gbXVsdGlwbGUgcG9zc2libGUgcmVjb2duaXRpb24gcGF0aHMgYmFzZWQKKyAgdXBvbiB0aGUgY3VycmVudCBhbmQgZnV0dXJlIGlucHV0IHN5bWJvbHMsIGJ1dCBpdCBoYXMgZGV0ZXJtaW5lZCB0aGF0CisgIHRoZSBpbnB1dCBkb2VzIG5vdCBzdWl0IGFueSBvZiB0aGUgcG9zc2libGUgcmVjb2duaXRpb24gYWx0ZXJuYXRpdmVzLgorCitJbiBBTlRMUiB0ZXJtaW5vbG9neSwgYSBydWxlIGlzIGNvbXBvc2VkIG9mIG9uZSBvciBtb3JlIF9hbHRlcm5hdGl2ZXNfLAorc3BlY2lmaWNhdGlvbnMgc2VwZXJhdGVkIGJ5IDx0dD58PC90dD4gY2hhcmFjdGVycy4gQW4gYWx0ZXJuYXRpdmUgaXMgY29tcG9zZWQgb2YKK2Egc2VyaWVzIG9mIGVsZW1lbnRzLCBpbmNsdWRpbmcgX3N1YnJ1bGVzXyAtLSBydWxlIHNwZWNpZmljYXRpb25zIGVuY2xvc2VkCit3aXRoaW4gcGFyZW50aGVzZXMuIFdoZW4gcmVjb2duaXRpb24gY29kZSBlbnRlcnMgYSBydWxlIG1ldGhvZCAob3IgYSBzdWJydWxlCitibG9jaykgdGhhdCBoYXMgbXVsdGlwbGUgYWx0ZXJuYXRpdmVzLCB0aGUgcmVjb2duaXplciBtdXN0IGRlY2lkZSB3aGljaCBvbmUgb2YKK3RoZSBtdWx0aXBsZSBwb3NzaWJsZSBwYXRocyB0byBmb2xsb3cgYnkgY2hlY2tpbmcgYSBudW1iZXIgb2YgZnV0dXJlIGlucHV0CitzeW1ib2xzLiBUaHVzLCBOb1ZpYWJsZUFsdGVybmF0aXZlIGVycm9ycyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IGlucHV0IGRvZXMKK25vdCBmaXQgYW55IG9mIHRoZSBwb3NzaWJsZSBwYXRocy4KKworSW4gbGV4ZXJzLCB0aGlzIGVycm9yIGlzIG9mdGVuIHJhaXNlZCBieSB0aGUgbWFpbiArdG9rZW5zISsgcnVsZSwgd2hpY2ggbXVzdAorY2hvb3NlIGJldHdlZW4gYWxsIHBvc3NpYmxlIHRva2VuIHJ1bGVzLiBJZiByYWlzZWQgYnkgK3Rva2VucyssIGl0IG1lYW5zIHRoZQorY3VycmVudCBpbnB1dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcGFydCBvZiBhbnkgdG9rZW4gc3BlY2lmaWNhdGlvbi4KKworPWVuZAorCitjbGFzcyBOb1ZpYWJsZUFsdGVybmF0aXZlIDwgUmVjb2duaXRpb25FcnJvcgorICBhdHRyX2FjY2Vzc29yIDpncmFtbWFyX2RlY2lzaW9uX2Rlc2NyaXB0aW9uLCA6ZGVjaXNpb25fbnVtYmVyLCA6c3RhdGVfbnVtYmVyCisgIGRlZiBpbml0aWFsaXplKCBncmFtbWFyX2RlY2lzaW9uX2Rlc2NyaXB0aW9uLCBkZWNpc2lvbl9udW1iZXIsIHN0YXRlX251bWJlciwgaW5wdXQgKQorICAgIEBncmFtbWFyX2RlY2lzaW9uX2Rlc2NyaXB0aW9uID0gZ3JhbW1hcl9kZWNpc2lvbl9kZXNjcmlwdGlvbgorICAgIEBkZWNpc2lvbl9udW1iZXIgPSBkZWNpc2lvbl9udW1iZXIKKyAgICBAc3RhdGVfbnVtYmVyID0gc3RhdGVfbnVtYmVyCisgICAgc3VwZXIoIGlucHV0ICkKKyAgZW5kCisgIAorICBkZWYgbWVzc2FnZQorICAgICclczogJXAgIT0gWyVwXScgJQorICAgICAgWyBzZWxmLmNsYXNzLCB1bmV4cGVjdGVkX3R5cGUsIEBncmFtbWFyX2RlY2lzaW9uX2Rlc2NyaXB0aW9uIF0KKyAgZW5kCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpFcnJvcjo6RWFybHlFeGl0CisKK2Vycm9yOjogRWFybHlFeGl0Cit1c2VkIGJ5OjogYWxsIHJlY29nbml6ZXJzCitvY2N1cnMgd2hlbjo6CisgIFRoZSByZWNvZ25pemVyIGlzIGluIGEgPHR0PiguLikrPC90dD4gc3VicnVsZSwgbWVhbmluZyB0aGUgcmVjb2duaXplciBtdXN0CisgIG1hdGNoIHRoZSBib2R5IG9mIHRoZSBzdWJydWxlIG9uZSBvciBtb3JlIHRpbWVzLiBJZiBpdCBmYWlscyB0byBtYXRjaCBhdCBsZWFzdAorICBvbmUgb2NjdXJlbmNlIG9mIHRoZSBzdWJydWxlLCB0aGUgcmVjb2duaXplciB3aWxsIHJhaXNlIGFuIEVhcmx5RXhpdAorICBleGNlcHRpb24uCisKKz09IEV4YW1wbGUKKworY29uc2lkZXIgYSBncmFtbWFyIGxpa2U6CisgIGxleGVyIGdyYW1tYXIgRWFybHlFeGl0RGVtbzsKKyAgLi4uCisgIElEOiAnYScuLid6JyAoJzAnLi4nOScpKzsKKyAgCitub3cgaW4gcnVieQorCisgIHJlcXVpcmUgJ0Vhcmx5RXhpdERlbW8nCisgIAorICBpbnB1dCA9IEFOVExSMzo6U3RyaW5nU3RyZWFtLm5ldyggImFiIiApCisgIGxleGVyID0gRWFybHlFeGl0RGVtbzo6TGV4ZXIubmV3KCBpbnB1dCApCisgIGxleGVyLm5leHRfdG9rZW4KKyAgIyAtPiByYWlzZXMgRWFybHlFeGl0OiBsaW5lIDE6MSByZXF1aXJlZCAoLi4uKSsgbG9vcCBkaWQgbm90IG1hdGNoIAorICAjICAgICAgICAgICAgICAgICAgICAgIGFueXRoaW5nIGF0IGNoYXJhY3RlciAiYiIKKworPWVuZAorCitjbGFzcyBFYXJseUV4aXQgPCBSZWNvZ25pdGlvbkVycm9yCisgIGF0dHJfYWNjZXNzb3IgOmRlY2lzaW9uX251bWJlcgorICAKKyAgZGVmIGluaXRpYWxpemUoIGRlY2lzaW9uX251bWJlciwgaW5wdXQgKQorICAgIEBkZWNpc2lvbl9udW1iZXIgPSBkZWNpc2lvbl9udW1iZXIKKyAgICBzdXBlciggaW5wdXQgKQorICBlbmQKKyAgCisgIGRlZiBtZXNzYWdlCisgICAgIlRoZSByZWNvZ25pemVyIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgZm9yIGEgKC4uKSsgbG9vcC4iCisgIGVuZAorICAKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpGYWlsZWRQcmVkaWNhdGUKKworZXJyb3I6OiBGYWlsZWRQcmVkaWNhdGUKK3VzZWQgYnk6OiBhbGwgcmVjb2duaXplcnMKK29jY3VycyB3aGVuOjoKKyAgQSByZWNvZ25pemVyIGlzIGluIGEgcnVsZSB3aXRoIGEgcHJlZGljYXRlIGFjdGlvbiBlbGVtZW50LCBhbmQgdGhlIHByZWRpY2F0aW5nCisgIGFjdGlvbiBjb2RlIGV2YWx1YXRlZCB0byBhICtmYWxzZSsgdmFsdWUuCisKKz1lbmQKKworY2xhc3MgRmFpbGVkUHJlZGljYXRlIDwgUmVjb2duaXRpb25FcnJvcgorICBhdHRyX2FjY2Vzc29yIDppbnB1dCwgOnJ1bGVfbmFtZSwgOnByZWRpY2F0ZV90ZXh0CisgIGRlZiBpbml0aWFsaXplKCBpbnB1dCwgcnVsZV9uYW1lLCBwcmVkaWNhdGVfdGV4dCApCisgICAgQHJ1bGVfbmFtZSA9IHJ1bGVfbmFtZQorICAgIEBwcmVkaWNhdGVfdGV4dCA9IHByZWRpY2F0ZV90ZXh0CisgICAgc3VwZXIoIGlucHV0ICkKKyAgZW5kCisgIAorICBkZWYgaW5zcGVjdAorICAgICclcyglcywgeyAlcyB9PyknICUgWyBzZWxmLmNsYXNzLm5hbWUsIEBydWxlX25hbWUsIEBwcmVkaWNhdGVfdGV4dCBdCisgIGVuZAorICAKKyAgZGVmIG1lc3NhZ2UKKyAgICAicnVsZSAjQHJ1bGVfbmFtZSBmYWlsZWQgcHJlZGljYXRlOiB7ICNAcHJlZGljYXRlX3RleHQgfT8iCisgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RXJyb3I6Ok1pc21hdGNoZWRUcmVlTm9kZQorCitlcnJvcjo6IE1pc21hdGNoZWRUcmVlTm9kZQordXNlZCBieTo6IHRyZWUgcGFyc2Vycworb2NjdXJzIHdoZW46OgorICBBIHRyZWUgcGFyc2VyIGV4cGVjdHMgdG8gbWF0Y2ggYSB0cmVlIG5vZGUgY29udGFpbmluZyBhIHNwZWNpZmljIHR5cGUgb2YKKyAgdG9rZW4sIGJ1dCB0aGUgY3VycmVudCB0cmVlIG5vZGUncyB0b2tlbiB0eXBlIGRvZXMgbm90IG1hdGNoLiBJdCdzIGVzc2VudGlhbGx5CisgIHRoZSBzYW1lIGFzIE1pc21hdGNoZWRUb2tlbiwgYnV0IHVzZWQgc3BlY2lmaWNhbGx5IGZvciB0cmVlIG5vZGVzLgorCis9ZW5kCisKK2NsYXNzIE1pc21hdGNoZWRUcmVlTm9kZSA8IFJlY29nbml0aW9uRXJyb3IKKyAgYXR0cl9hY2Nlc3NvciA6ZXhwZWN0aW5nLCA6aW5wdXQKKyAgZGVmIGluaXRpYWxpemUoIGV4cGVjdGluZywgaW5wdXQgKQorICAgIEBleHBlY3RpbmcgPSBleHBlY3RpbmcKKyAgICBzdXBlciggaW5wdXQgKQorICBlbmQKKyAgCisgIGRlZiBtZXNzYWdlCisgICAgJyVzOiAlcCAhPSAlcCcgJQorICAgICAgWyBzZWxmLmNsYXNzLCB1bmV4cGVjdGVkX3R5cGUsIEBleHBlY3RpbmcgXQorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkVycm9yOjpSZXdyaXRlQ2FyZGluYWxpdHlFcnJvcgorCitlcnJvcjo6IFJld3JpdGVDYXJkaW5hbGl0eUVycm9yCit1c2VkIGJ5OjogdHJlZS1yZXdyaXRpbmcgcGFyc2VycyBhbmQgdHJlZSBwYXJzZXJzCitvY2N1cnMgd2hlbjo6CisgIFRoZXJlIGlzIGFuIGluY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGFwcGVhcmFuY2VzIG9mIHNvbWUgc3ltYm9sCisgIG9uIHRoZSBsZWZ0IHNpZGUgb2YgYSByZXdyaXRlIHJ1bGUgYW5kIHRoZSBudW1iZXIgb2YgdGhlIHNhbWUgc3ltYm9sCisgIHNlZW4gb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSByZXdyaXRlIHJ1bGUKKworPWVuZAorCitjbGFzcyBSZXdyaXRlQ2FyZGluYWxpdHlFcnJvciA8IFN0YW5kYXJkRXJyb3IKKyAgYXR0cl9hY2Nlc3NvciA6ZWxlbWVudF9kZXNjcmlwdGlvbgorICBkZWYgaW5pdGlhbGl6ZSggZWxlbWVudF9kZXNjcmlwdGlvbiApCisgICAgQGVsZW1lbnRfZGVzY3JpcHRpb24gPSBlbGVtZW50X2Rlc2NyaXB0aW9uCisgICAgc3VwZXIoIG1lc3NhZ2UgKQorICBlbmQKKyAgCisgIGRlZiBtZXNzYWdlCisgICAgIiVzOiAlcyIgJSBbIHNlbGYuY2xhc3MsIEBlbGVtZW50X2Rlc2NyaXB0aW9uIF0KKyAgZW5kCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpFcnJvcjo6UmV3cml0ZUVhcmx5RXhpdAorCitlcnJvcjo6IFJld3JpdGVFYXJseUV4aXQKK3VzZWQgYnk6OiB0cmVlLXJld3JpdGluZyBwYXJzZXJzIGFuZCB0cmVlIHBhcnNlcnMKK29jY3VycyB3aGVuOjoKKyAgQSB0cmVlLXJld3JpdGUgcnVsZSByZXF1aXJlcyBvbmUgb3IgbW9yZSBvY2N1cmVuY2Ugb2YgYSBzeW1ib2wsIGJ1dCBub25lCisgIGhhdmUgYmVlbiBzZWVuLgorCis9ZW5kCisKK2NsYXNzIFJld3JpdGVFYXJseUV4aXQgPCBSZXdyaXRlQ2FyZGluYWxpdHlFcnJvcgorICBhdHRyX2FjY2Vzc29yIDplbGVtZW50X2Rlc2NyaXB0aW9uCisgIGRlZiBpbml0aWFsaXplKCBlbGVtZW50X2Rlc2NyaXB0aW9uID0gbmlsICkKKyAgICBzdXBlciggZWxlbWVudF9kZXNjcmlwdGlvbiApCisgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RXJyb3I6OlJld3JpdGVFbXB0eVN0cmVhbQorCitlcnJvcjo6IFJld3JpdGVFbXB0eVN0cmVhbQordXNlZCBieTo6IHRyZWUtcmV3cml0aW5nIHBhcnNlcnMgYW5kIHRyZWUgcGFyc2VycworCis9ZW5kCisKK2NsYXNzIFJld3JpdGVFbXB0eVN0cmVhbSA8IFJld3JpdGVDYXJkaW5hbGl0eUVycm9yOyBlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpFcnJvcjo6VHJlZUluY29uc2lzdGVuY3kKKworZXJyb3I6OiBUcmVlSW5jb25zaXN0ZW5jeQordXNlZCBieTo6IGNsYXNzZXMgdGhhdCBkZWFsIHdpdGggdHJlZSBzdHJ1Y3R1cmVzCitvY2N1cnMgd2hlbjo6CisgIEEgdHJlZSBub2RlJ3MgZGF0YSBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgdG8gd2hpY2ggaXQKKyAgYmVsb25ncy4KKworc2l0dWF0aW9ucyB0aGF0IHJlc3VsdCBpbiB0cmVlIGluY29uc2lzdGVuY2llczoKKworMS4gQSBub2RlIGhhcyBhIGNoaWxkIG5vZGUgd2l0aCBhICtAcGFyZW50KyBhdHRyaWJ1dGUgZGlmZmVyZW50IHRoYW4gdGhlIG5vZGUuCisyLiBBIG5vZGUgaGFzIGEgY2hpbGQgYXQgaW5kZXggK24rLCBidXQgdGhlIGNoaWxkJ3MgK0BjaGlsZF9pbmRleCsgdmFsdWUgaXMgbm90CisgICArbisKKzMuIEFuIGFkYXB0b3IgZW5jb3VudGVyZWQgYSBzaXR1YXRpb24gd2hlcmUgbXVsdGlwbGUgdHJlZSBub2RlcyBoYXZlIGJlZW4KKyAgIHNpbXVsdGFuZW91c2x5IHJlcXVlc3RlZCBhcyBhIG5ldyB0cmVlIHJvb3QuCisKKz1lbmQKKworY2xhc3MgVHJlZUluY29uc2lzdGVuY3kgPCBTdGFuZGFyZEVycm9yCisgIGRlZiBzZWxmLmZhaWxlZF9pbmRleF9jaGVjayEoIGV4cGVjdGVkLCByZWFsICkKKyAgICBuZXcoIAorICAgICAgIiVzOiBjaGlsZCBpbmRleGVzIGRvbid0IG1hdGNoIC0+IGV4cGVjdGVkICVkIGZvdW5kICVkIiAlCisgICAgICBbIHNlbGYsIGV4cGVjdGVkLCByZWFsIF0KKyAgICApCisgIGVuZAorICAKKyAgZGVmIHNlbGYuZmFpbGVkX3BhcmVudF9jaGVjayEoIGV4cGVjdGVkLCByZWFsICkKKyAgICBuZXcoIAorICAgICAgIiVzOiBwYXJlbnRzIGRvbid0IG1hdGNoOyBleHBlY3RlZCAlcCBmb3VuZCAlcCIgJQorICAgICAgWyBzZWxmLCBleHBlY3RlZCwgcmVhbCBdCisgICAgKQorICBlbmQKKyAgCisgIGRlZiBzZWxmLm11bHRpcGxlX3Jvb3RzIQorICAgIG5ldyAiJXM6IGF0dGVtcHRlZCB0byBjaGFuZ2UgbW9yZSB0aGFuIG9uZSBub2RlIHRvIHJvb3QiICUgc2VsZgorICBlbmQKK2VuZAorCittb2R1bGVfZnVuY3Rpb24KKworZGVmIE1pc21hdGNoZWRUb2tlbiggZXhwZWN0aW5nLCBpbnB1dCA9IEBpbnB1dCApCisgIE1pc21hdGNoZWRUb2tlbi5uZXcoIGV4cGVjdGluZywgaW5wdXQgKQorZW5kCisKK2RlZiBVbndhbnRlZFRva2VuKCBleHBlY3RpbmcsIGlucHV0ID0gQGlucHV0ICkKKyAgVW53YW50ZWRUb2tlbi5uZXcoIGV4cGVjdGluZywgaW5wdXQgKQorZW5kCisKK2RlZiBNaXNzaW5nVG9rZW4oIGV4cGVjdGluZywgaW5zZXJ0ZWQsIGlucHV0ID0gQGlucHV0ICkKKyAgTWlzc2luZ1Rva2VuLm5ldyggZXhwZWN0aW5nLCBpbnB1dCwgaW5zZXJ0ZWQgKQorZW5kCisKK2RlZiBNaXNtYXRjaGVkUmFuZ2UoIG1pbiwgbWF4LCBpbnB1dCA9IEBpbnB1dCApCisgIE1pc21hdGNoZWRSYW5nZS5uZXcoIG1pbiwgbWF4LCBpbnB1dCApCitlbmQKKworZGVmIE1pc21hdGNoZWRTZXQoIGV4cGVjdGluZywgaW5wdXQgPSBAaW5wdXQgKQorICBNaXNtYXRjaGVkU2V0Lm5ldyggZXhwZWN0aW5nLCBpbnB1dCApCitlbmQKKworZGVmIE1pc21hdGNoZWROb3RTZXQoIGV4cGVjdGluZywgaW5wdXQgPSBAaW5wdXQgKQorICBNaXNtYXRjaGVkTm90U2V0Lm5ldyggZXhwZWN0aW5nLCBpbnB1dCApCitlbmQKKworZGVmIE5vVmlhYmxlQWx0ZXJuYXRpdmUoIGRlc2NyaXB0aW9uLCBkZWNpc2lvbiwgc3RhdGUsIGlucHV0ID0gQGlucHV0ICkKKyAgTm9WaWFibGVBbHRlcm5hdGl2ZS5uZXcoIGRlc2NyaXB0aW9uLCBkZWNpc2lvbiwgc3RhdGUsIGlucHV0ICkKK2VuZAorCitkZWYgRWFybHlFeGl0KCBkZWNpc2lvbiwgaW5wdXQgPSBAaW5wdXQgKQorICBFYXJseUV4aXQubmV3KCBkZWNpc2lvbiwgaW5wdXQgKQorZW5kCisKK2RlZiBGYWlsZWRQcmVkaWNhdGUoIHJ1bGUsIHByZWRpY2F0ZSwgaW5wdXQgPSBAaW5wdXQgKQorICBGYWlsZWRQcmVkaWNhdGUubmV3KCBpbnB1dCwgcnVsZSwgcHJlZGljYXRlICkKK2VuZAorCitkZWYgTWlzbWF0Y2hlZFRyZWVOb2RlKCBleHBlY3RpbmcsIGlucHV0ID0gQGlucHV0ICkKKyAgTWlzbWF0Y2hlZFRyZWVOb2RlLm5ldyggZXhwZWN0aW5nLCBpbnB1dCApCitlbmQKKworZGVmIFJld3JpdGVDYXJkaW5hbGl0eUVycm9yKCBlbGVtZW50X2Rlc2NyaXB0aW9uICkKKyAgUmV3cml0ZUNhcmRpbmFsaXR5RXJyb3IubmV3KCBlbGVtZW50X2Rlc2NyaXB0aW9uICkKK2VuZAorCitkZWYgUmV3cml0ZUVhcmx5RXhpdCggZWxlbWVudF9kZXNjcmlwdGlvbiA9IG5pbCApCisgIFJld3JpdGVFYXJseUV4aXQubmV3KCBlbGVtZW50X2Rlc2NyaXB0aW9uICkKK2VuZAorCitkZWYgUmV3cml0ZUVtcHR5U3RyZWFtKCBlbGVtZW50X2Rlc2NyaXB0aW9uICkKKyAgUmV3cml0ZUVtcHR5U3RyZWFtLm5ldyggZWxlbWVudF9kZXNjcmlwdGlvbiApCitlbmQKKworZW5kCisgIAoraW5jbHVkZSBFcnJvcgorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkJ1ZworCisKKworPWVuZAorCitjbGFzcyBCdWcgPCBTdGFuZGFyZEVycm9yCisgIGRlZiBpbml0aWFsaXplKCBtZXNzYWdlID0gbmlsLCAqYXJncyApCisgICAgbWVzc2FnZSA9ICJzb21ldGhpbmcgb2NjdXJyZWQgdGhhdCBzaG91bGQgbm90IG9jY3VyIHdpdGhpbiB1bm1vZGlmaWVkLCAiIDw8CisgICAgICAgICAgICAgICJBTlRMUi1nZW5lcmF0ZWQgc291cmNlIGNvZGU6ICN7IG1lc3NhZ2UgfSIKKyAgICBzdXBlciggbWVzc2FnZSwgKmFyZ3MgKQorICBlbmQKK2VuZAorCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9tYWluLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL21haW4ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyOGQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9tYWluLnJiCkBAIC0wLDAgKzEsNTg2IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKz1iZWdpbiBMSUNFTlNFCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBLeWxlIFlldHRlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz1lbmQKKworcmVxdWlyZSAnb3B0cGFyc2UnCityZXF1aXJlICdhbnRscjMnCisKK21vZHVsZSBBTlRMUjMKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpNYWluCisKK05hbWVzcGFjZSBtb2R1bGUgZm9yIHRoZSBxdWljayBzY3JpcHQgTWFpbiBjbGFzc2VzLgorCis9ZW5kCisKK21vZHVsZSBNYWluCisKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpNYWluOjpPcHRpb25zCisKK0RlZmluZXMgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIGF0dHJpYnV0ZSBtYXBwaW5ncyBzaGFyZWQgYnkgYWxsIHR5cGVzIG9mCitNYWluIGNsYXNzZXMuCisKKz1lbmQKKworbW9kdWxlIE9wdGlvbnMKKyAgIyB0aGUgaW5wdXQgZW5jb2RpbmcgdHlwZTsgZGVmYXVsdHMgdG8gK25pbCsgKGN1cnJlbnRseSwgbm90IHVzZWQpCisgIGF0dHJfYWNjZXNzb3IgOmVuY29kaW5nCisgICMgdGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBNYWluIHNjcmlwdDsgZGVmYXVsdHMgdG8gPHR0PiRzdGRpbjwvdHQ+CisgIGF0dHJfYWNjZXNzb3IgOmlucHV0CisgICMgYSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBydW4gdGhlIE1haW4KKyAgIyBzY3JpcHQgaW4gaW50ZXJhY3RpdmUgbW9kZTsgZGVmYXVsdHMgdG8gK2ZhbHNlKworICBhdHRyX2FjY2Vzc29yIDppbnRlcmFjdGl2ZQorICBhdHRyX2FjY2Vzc29yIDpub19vdXRwdXQKKyAgYXR0cl9hY2Nlc3NvciA6cHJvZmlsZQorICBhdHRyX2FjY2Vzc29yIDpkZWJ1Z19zb2NrZXQKKyAgYXR0cl9hY2Nlc3NvciA6cnVieV9wcm9mCisgIAorICBkZWYgaW5pdGlhbGl6ZSggb3B0aW9ucyA9IHt9ICkKKyAgICBAbm9fb3V0cHV0ICAgID0gb3B0aW9ucy5mZXRjaCggOm5vX291dHB1dCwgZmFsc2UgKQorICAgIEBwcm9maWxlICAgICAgPSBvcHRpb25zLmZldGNoKCA6cHJvZmlsZSwgZmFsc2UgKQorICAgIEBkZWJ1Z19zb2NrZXQgPSBvcHRpb25zLmZldGNoKCA6ZGVidWdfc29ja2V0LCBmYWxzZSApCisgICAgQHJ1YnlfcHJvZiAgICA9IG9wdGlvbnMuZmV0Y2goIDpydWJ5X3Byb2YsIGZhbHNlICkKKyAgICBAZW5jb2RpbmcgICAgID0gb3B0aW9ucy5mZXRjaCggOmVuY29kaW5nLCBuaWwgKQorICAgIEBpbnRlcmFjdGl2ZSAgPSBvcHRpb25zLmZldGNoKCA6aW50ZXJhY3RpdmUsIGZhbHNlICkKKyAgICBAaW5wdXQgICAgICAgID0gb3B0aW9ucy5mZXRjaCggOmlucHV0LCAkc3RkaW4gKQorICBlbmQKKyAgCisgICMgY29uc3RydWN0cyBhbiBPcHRpb25QYXJzZXIgYW5kIHBhcnNlcyB0aGUgYXJndW1lbnQgbGlzdCBwcm92aWRlZCBieSArYXJndisKKyAgZGVmIHBhcnNlX29wdGlvbnMoIGFyZ3YgPSBBUkdWICkKKyAgICBvcGFyc2VyID0gT3B0aW9uUGFyc2VyLm5ldyBkbyB8IG8gfAorICAgICAgby5zZXBhcmF0b3IgJ0lucHV0IE9wdGlvbnM6JworICAgICAgCisgICAgICBvLm9uKCAnLWknLCAnLS1pbnB1dCAidGV4dCB0byBwcm9jZXNzIicsIGRvYyggPDwtRU5EICkgKSB7IHx2YWx8IEBpbnB1dCA9IHZhbCB9CisgICAgICB8IGEgc3RyaW5nIHRvIHVzZSBhcyBkaXJlY3QgaW5wdXQgdG8gdGhlIHJlY29nbml6ZXIKKyAgICAgIEVORAorICAgICAgCisgICAgICBvLm9uKCAnLUknLCAnLS1pbnRlcmFjdGl2ZScsIGRvYyggPDwtRU5EICkgKSB7IEBpbnRlcmFjdGl2ZSA9IHRydWUgfQorICAgICAgfCBydW4gYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiB3aXRoIHRoZSByZWNvZ25pemVyCisgICAgICBFTkQKKyAgICBlbmQKKyAgICAKKyAgICBzZXR1cF9vcHRpb25zKCBvcGFyc2VyICkKKyAgICByZXR1cm4gb3BhcnNlci5wYXJzZSggYXJndiApCisgIGVuZAorICAKK3ByaXZhdGUKKyAgCisgIGRlZiBzZXR1cF9vcHRpb25zKCBvcGFyc2VyICkKKyAgICAjIG92ZXJyaWRhYmxlIGhvb2sgdG8gbW9kaWZ5IC8gYXBwZW5kIG9wdGlvbnMKKyAgZW5kCisgIAorICBkZWYgZG9jKCBkZXNjcmlwdGlvbl9zdHJpbmcgKQorICAgIGRlc2NyaXB0aW9uX3N0cmluZy5jaG9tcCEKKyAgICBkZXNjcmlwdGlvbl9zdHJpbmcuZ3N1YiEoIC9eICpcfCA/LywgJycgKQorICAgIGRlc2NyaXB0aW9uX3N0cmluZy5nc3ViISggL1xzKy8sICcgJyApCisgICAgcmV0dXJuIGRlc2NyaXB0aW9uX3N0cmluZworICBlbmQKKyAgCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpNYWluOjpNYWluCisKK1RoZSBiYXNlLWNsYXNzIGZvciB0aGUgdGhyZWUgcHJpbWFyeSBNYWluIHNjcmlwdC1ydW5uZXIgY2xhc3Nlcy4KK0l0IGRlZmluZXMgdGhlIHNrZWxldGFsIHN0cnVjdHVyZSBzaGFyZWQgYnkgYWxsIG1haW4KK3NjcmlwdHMsIGJ1dCBpc24ndCBwYXJ0aWN1bGFybHkgdXNlZnVsIG9uIGl0cyBvd24uCisKKz1lbmQKKworY2xhc3MgTWFpbgorICBpbmNsdWRlIE9wdGlvbnMKKyAgaW5jbHVkZSBVdGlsCisgIGF0dHJfYWNjZXNzb3IgOm91dHB1dCwgOmVycm9yCisgIAorICBkZWYgaW5pdGlhbGl6ZSggb3B0aW9ucyA9IHt9ICkKKyAgICBAaW5wdXQgID0gb3B0aW9ucy5mZXRjaCggOmlucHV0LCAkc3RkaW4gKQorICAgIEBvdXRwdXQgPSBvcHRpb25zLmZldGNoKCA6b3V0cHV0LCAkc3Rkb3V0ICkKKyAgICBAZXJyb3IgID0gb3B0aW9ucy5mZXRjaCggOmVycm9yLCAkc3RkZXJyICkKKyAgICBAbmFtZSAgID0gb3B0aW9ucy5mZXRjaCggOm5hbWUsIEZpbGUuYmFzZW5hbWUoICQwLCAnLnJiJyApICkKKyAgICBzdXBlcgorICAgIGJsb2NrX2dpdmVuPyBhbmQgeWllbGQoIHNlbGYgKQorICBlbmQKKyAgCisgIAorICAjIHJ1bnMgdGhlIHNjcmlwdAorICBkZWYgZXhlY3V0ZSggYXJndiA9IEFSR1YgKQorICAgIGFyZ3MgPSBwYXJzZV9vcHRpb25zKCBhcmd2ICkKKyAgICBzZXR1cAorICAgIAorICAgIEBpbnRlcmFjdGl2ZSBhbmQgcmV0dXJuIGV4ZWN1dGVfaW50ZXJhY3RpdmUKKyAgICAKKyAgICBpbl9zdHJlYW0gPSAKKyAgICAgIGNhc2UKKyAgICAgIHdoZW4gQGlucHV0LmlzX2E/KCA6OlN0cmluZyApIHRoZW4gU3RyaW5nU3RyZWFtLm5ldyggQGlucHV0ICkKKyAgICAgIHdoZW4gYXJncy5sZW5ndGggPT0gMSAmJiBhcmdzLmZpcnN0ICE9ICctJworICAgICAgICBBTlRMUjM6OkZpbGVTdHJlYW0ubmV3KCBhcmdzWyAwIF0gKQorICAgICAgZWxzZSBBTlRMUjM6OkZpbGVTdHJlYW0ubmV3KCBAaW5wdXQgKQorICAgICAgZW5kCisgICAgY2FzZQorICAgIHdoZW4gQHJ1YnlfcHJvZgorICAgICAgbG9hZF9ydWJ5X3Byb2YKKyAgICAgIHByb2ZpbGUgPSBSdWJ5UHJvZi5wcm9maWxlIGRvCisgICAgICAgIHJlY29nbml6ZSggaW5fc3RyZWFtICkKKyAgICAgIGVuZAorICAgICAgcHJpbnRlciA9IFJ1YnlQcm9mOjpGbGF0UHJpbnRlci5uZXcoIHByb2ZpbGUgKQorICAgICAgcHJpbnRlci5wcmludCggQG91dHB1dCApCisgICAgd2hlbiBAcHJvZmlsZQorICAgICAgcmVxdWlyZSAncHJvZmlsZXInCisgICAgICBQcm9maWxlcl9fLnN0YXJ0X3Byb2ZpbGUKKyAgICAgIHJlY29nbml6ZSggaW5fc3RyZWFtICkKKyAgICAgIFByb2ZpbGVyX18ucHJpbnRfcHJvZmlsZQorICAgIGVsc2UKKyAgICAgIHJlY29nbml6ZSggaW5fc3RyZWFtICkKKyAgICBlbmQKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIHJlY29nbml6ZSggKmFyZ3MgKQorICAgICMgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMKKyAgZW5kCisgIAorICBkZWYgZXhlY3V0ZV9pbnRlcmFjdGl2ZQorICAgIEBvdXRwdXQucHV0cyggdGlkeSggPDwtRU5EICkgKQorICAgIHwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHwgUnVieSBBTlRMUiBDb25zb2xlIGZvciAjeyAkMCB9CisgICAgfCB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+CisgICAgfCAqIEVudGVyIHNvdXJjZSBjb2RlIGxpbmVzIAorICAgIHwgKiBFbnRlciBFT0YgdG8gZmluaXNoIHVwIGFuZCBleGl0CisgICAgfCAgIChjb250cm9sK0Qgb24gTWFjL0xpbnV4L1VuaXggb3IgY29udHJvbCtaIG9uIFdpbmRvd3MpCisgICAgfCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgfCAKKyAgICBFTkQKKyAgICAKKyAgICByZWFkX21ldGhvZCA9IAorICAgICAgYmVnaW4KKyAgICAgICAgcmVxdWlyZSAncmVhZGxpbmUnCisgICAgICAgIGxpbmVfbnVtYmVyID0gMAorICAgICAgICBsYW1iZGEgZG8KKyAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgaWYgbGluZSA9IFJlYWRsaW5lLnJlYWRsaW5lKCAiI0BuYW1lOiN7IGxpbmVfbnVtYmVyICs9IDEgfT4gIiwgdHJ1ZSApCisgICAgICAgICAgICAgIGxpbmUgPDwgJC8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgQG91dHB1dC5wcmludCggIlxuIiApICMgZW5zdXJlcyByZXN1bHQgb3V0cHV0IGlzIG9uIGEgbmV3IGxpbmUgYWZ0ZXIgRU9GIGlzIGVudGVyZWQKKyAgICAgICAgICAgICAgbmlsCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICByZXNjdWUgSW50ZXJydXB0LCBFT0ZFcnJvcgorICAgICAgICAgICAgcmV0cnkKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBsaW5lIDw8ICJcbiIgaWYgbGluZQorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIGxhbWJkYSBkbworICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBwcmludGYoICIlczolaT4gIiwgQG5hbWUsIEBpbnB1dC5saW5lbm8gKQorICAgICAgICAgICAgZmx1c2gKKyAgICAgICAgICAgIGxpbmUgPSBAaW5wdXQuZ2V0cyBvcgorICAgICAgICAgICAgICBAb3V0cHV0LnByaW50KCAiXG4iICkgIyBlbnN1cmVzIHJlc3VsdCBvdXRwdXQgaXMgb24gYSBuZXcgbGluZSBhZnRlciBFT0YgaXMgZW50ZXJlZAorICAgICAgICAgICAgbGluZQorICAgICAgICAgIHJlc2N1ZSBJbnRlcnJ1cHQsIEVPRkVycm9yCisgICAgICAgICAgICByZXRyeQorICAgICAgICAgIGVuZAorICAgICAgICAgIGxpbmUKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAKKyAgICBzdHJlYW0gPSBJbnRlcmFjdGl2ZVN0cmluZ1N0cmVhbS5uZXcoIDpuYW1lID0+IEBuYW1lLCAmcmVhZF9tZXRob2QgKQorICAgIHJlY29nbml6ZSggc3RyZWFtICkKKyAgZW5kCisgIAorICBkZWYgc2NyZWVuX3dpZHRoCisgICAgKCBFTlZbICdDT0xVTU5TJyBdIHx8IDgwICkudG9faQorICBlbmQKKyAgCisgIGRlZiBhdHRlbXB0KCBsaWIsIG1lc3NhZ2UgPSBuaWwsIGV4aXRfc3RhdHVzID0gbmlsICkKKyAgICB5aWVsZAorICByZXNjdWUgTG9hZEVycm9yID0+IGVycm9yCisgICAgbWVzc2FnZSBvciByYWlzZQorICAgIEBlcnJvci5wdXRzKCBtZXNzYWdlICkKKyAgICByZXBvcnRfZXJyb3IoIGVycm9yICkKKyAgICByZXBvcnRfbG9hZF9wYXRoCisgICAgZXhpdCggZXhpdF9zdGF0dXMgKSBpZiBleGl0X3N0YXR1cworICByZXNjdWUgPT4gZXJyb3IKKyAgICBAZXJyb3IucHV0cyggInJlY2VpdmVkIGFuIGVycm9yIHdoaWxlIGF0dGVtcHRpbmcgdG8gbG9hZCAlcCIgJSBsaWIgKQorICAgIHJlcG9ydF9lcnJvciggZXJyb3IgKQorICAgIGV4aXQoIGV4aXRfc3RhdHVzICkgaWYgZXhpdF9zdGF0dXMKKyAgZW5kCisgIAorICBkZWYgcmVwb3J0X2Vycm9yKCBlcnJvciApCisgICAgcHV0cyEoICJ+IGVycm9yIGRldGFpbHM6IiApCisgICAgcHV0cyEoICcgIFsgJXMgXScgJSBlcnJvci5jbGFzcy5uYW1lICkKKyAgICBtZXNzYWdlID0gZXJyb3IudG9fcy5nc3ViKCAvXG4vLCAiXG4gICAgICIgKQorICAgIHB1dHMhKCAnICAtPiAnIDw8IG1lc3NhZ2UgKQorICAgIGZvciBjYWxsIGluIGVycm9yLmJhY2t0cmFjZQorICAgICAgcHV0cyEoICcgICAgICcgPDwgY2FsbCApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHJlcG9ydF9sb2FkX3BhdGgKKyAgICBwdXRzISggIn4gY29udGVudCBvZiAkTE9BRF9QQVRIOiAiICkKKyAgICBmb3IgZGlyIGluICRMT0FEX1BBVEgKKyAgICAgIHB1dHMhKCAiICAtICN7IGRpciB9IiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHNldHVwCisgICAgIyBob29rCisgIGVuZAorICAKKyAgZGVmIGZldGNoX2NsYXNzKCBuYW1lICkKKyAgICBuYW1lLm5pbD8gfHwgbmFtZS5lbXB0eT8gYW5kIHJldHVybiggbmlsICkKKyAgICB1bmxlc3MgY29uc3RhbnRfZXhpc3RzPyggbmFtZSApCisgICAgICB0cnlfdG9fbG9hZCggbmFtZSApCisgICAgICBjb25zdGFudF9leGlzdHM/KCBuYW1lICkgb3IgcmV0dXJuKCBuaWwgKQorICAgIGVuZAorICAgIAorICAgIG5hbWUuc3BsaXQoIC86Oi8gKS5pbmplY3QoIE9iamVjdCApIGRvIHxtb2QsIG5hbWV8CisgICAgICAjIDo6U29tZU1vZHVsZSBzcGxpdHMgdG8gWycnLCAnU29tZU1vZHVsZSddIC0gc28gaWdub3JlIGVtcHR5IHN0cmluZ3MKKyAgICAgIG5hbWUuZW1wdHk/IGFuZCBuZXh0KCBtb2QgKSAKKyAgICAgIG1vZC5jb25zdF9nZXQoIG5hbWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBjb25zdGFudF9leGlzdHM/KCBuYW1lICkKKyAgICBldmFsKCAiZGVmaW5lZD8oI3sgbmFtZSB9KSIgKSA9PSAnY29uc3RhbnQnCisgIGVuZAorICAKKyAgZGVmIHRyeV90b19sb2FkKCBuYW1lICkKKyAgICBpZiBuYW1lID1+IC8oXHcrKTo6KExleGVyfFBhcnNlcnxUcmVlUGFyc2VyKSQvCisgICAgICByZXRyeV9vayA9IHRydWUKKyAgICAgIG1vZHVsZV9uYW1lLCByZWNvZ25pemVyX3R5cGUgPSAkMSwgJDIKKyAgICAgIHNjcmlwdCA9IG5hbWUuZ3N1YiggLzo6LywgJycgKQorICAgICAgYmVnaW4KKyAgICAgICAgcmV0dXJuKCByZXF1aXJlKCBzY3JpcHQgKSApCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIGlmIHJldHJ5X29rCisgICAgICAgICAgc2NyaXB0LCByZXRyeV9vayA9IG1vZHVsZV9uYW1lLCBmYWxzZQorICAgICAgICAgIHJldHJ5CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4oIG5pbCApCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAKKyAgJXcocHV0cyBwcmludCBwcmludGYgZmx1c2gpLmVhY2ggZG8gfG1ldGhvZHwKKyAgICBjbGFzc19ldmFsKCA8PC1FTkQsIF9fRklMRV9fLCBfX0xJTkVfXyApCisgICAgICBwcml2YXRlCisgICAgICAKKyAgICAgIGRlZiAjeyBtZXRob2QgfSgqYXJncykKKyAgICAgICAgQG91dHB1dC4jeyBtZXRob2QgfSgqYXJncykgdW5sZXNzIEBub19vdXRwdXQKKyAgICAgIGVuZAorICAgICAgCisgICAgICBkZWYgI3sgbWV0aG9kIH0hKCAqYXJncyApCisgICAgICAgIEBlcnJvci4jeyBtZXRob2QgfSgqYXJncykgdW5sZXNzIEBub19vdXRwdXQKKyAgICAgIGVuZAorICAgIEVORAorICBlbmQKK2VuZAorCisKKz1iZWdpbiByZG9jIEFOVExSMzo6TWFpbjo6TGV4ZXJNYWluCisKK0EgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBhIGhhbmR5IHRlc3Qgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGFuIEFOVExSCitnZW5lcmF0ZWQgbGV4ZXIgZmlsZSBpcyBydW4gZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCis9ZW5kCitjbGFzcyBMZXhlck1haW4gPCBNYWluCisgIGRlZiBpbml0aWFsaXplKCBsZXhlcl9jbGFzcywgb3B0aW9ucyA9IHt9ICkKKyAgICBzdXBlciggb3B0aW9ucyApCisgICAgQGxleGVyX2NsYXNzID0gbGV4ZXJfY2xhc3MKKyAgZW5kCisgIAorICBkZWYgcmVjb2duaXplKCBpbl9zdHJlYW0gKQorICAgIGxleGVyID0gQGxleGVyX2NsYXNzLm5ldyggaW5fc3RyZWFtICkKKyAgICAKKyAgICBsb29wIGRvCisgICAgICBiZWdpbgorICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICAgICAgaWYgdG9rZW4ubmlsPyB8fCB0b2tlbi50eXBlID09IEFOVExSMzo6RU9GIHRoZW4gYnJlYWsKKyAgICAgICAgZWxzZSBkaXNwbGF5X3Rva2VuKCB0b2tlbiApCisgICAgICAgIGVuZAorICAgICAgcmVzY3VlIEFOVExSMzo6UmVjb2duaXRpb25FcnJvciA9PiBlcnJvcgorICAgICAgICByZXBvcnRfZXJyb3IoIGVycm9yICkKKyAgICAgICAgYnJlYWsKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBkaXNwbGF5X3Rva2VuKCB0b2tlbiApCisgICAgY2FzZSB0b2tlbi5jaGFubmVsCisgICAgd2hlbiBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorICAgICAgcHJlZml4ID0gJy0tPicKKyAgICAgIHN1ZmZpeCA9ICcnCisgICAgd2hlbiBBTlRMUjM6OkhJRERFTl9DSEFOTkVMCisgICAgICBwcmVmaXggPSAnIyAgJworICAgICAgc3VmZml4ID0gJyAoaGlkZGVuKScKKyAgICBlbHNlCisgICAgICBwcmVmaXggPSAnfn4+JworICAgICAgc3VmZml4ID0gJyAoY2hhbm5lbCAlcCknICUgdG9rZW4uY2hhbm5lbAorICAgIGVuZAorICAgIAorICAgIHByaW50ZiggIiVzICUtMTVzICUtMTVwIEAgbGluZSAlLTNpIGNvbCAlLTNpJXNcbiIsCisgICAgICAgICAgIHByZWZpeCwgdG9rZW4ubmFtZSwgdG9rZW4udGV4dCwKKyAgICAgICAgICAgdG9rZW4ubGluZSwgdG9rZW4uY29sdW1uLCBzdWZmaXggKQorICBlbmQKKyAgCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpNYWluOjpQYXJzZXJNYWluCisKK0EgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBhIGhhbmR5IHRlc3Qgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGFuIEFOVExSCitnZW5lcmF0ZWQgcGFyc2VyIGZpbGUgaXMgcnVuIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworPWVuZAorY2xhc3MgUGFyc2VyTWFpbiA8IE1haW4KKyAgYXR0cl9hY2Nlc3NvciA6bGV4ZXJfY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICA6bGV4ZXJfY2xhc3MsCisgICAgICAgICAgICAgICAgOnBhcnNlcl9jbGFzcywKKyAgICAgICAgICAgICAgICA6cGFyc2VyX3J1bGUsCisgICAgICAgICAgICAgICAgOnBvcnQsCisgICAgICAgICAgICAgICAgOmxvZworICAKKyAgZGVmIGluaXRpYWxpemUoIHBhcnNlcl9jbGFzcywgb3B0aW9ucyA9IHt9ICkKKyAgICBzdXBlciggb3B0aW9ucyApCisgICAgQGxleGVyX2NsYXNzX25hbWUgPSBvcHRpb25zWyA6bGV4ZXJfY2xhc3NfbmFtZSBdCisgICAgQGxleGVyX2NsYXNzICAgICAgPSBvcHRpb25zWyA6bGV4ZXJfY2xhc3MgXQorICAgIEBwYXJzZXJfY2xhc3MgICAgID0gcGFyc2VyX2NsYXNzCisgICAgQHBhcnNlcl9ydWxlID0gb3B0aW9uc1sgOnBhcnNlcl9ydWxlIF0KKyAgICBpZiBAZGVidWcgPSAoIEBwYXJzZXJfY2xhc3MuZGVidWc/IHJlc2N1ZSBmYWxzZSApCisgICAgICBAdHJhY2UgPSBvcHRpb25zLmZldGNoKCA6dHJhY2UsIG5pbCApCisgICAgICBAcG9ydCA9IG9wdGlvbnMuZmV0Y2goIDpwb3J0LCBBTlRMUjM6OkRlYnVnOjpERUZBVUxUX1BPUlQgKQorICAgICAgQGxvZyAgPSBvcHRpb25zLmZldGNoKCA6bG9nLCBAZXJyb3IgKQorICAgIGVuZAorICAgIEBwcm9maWxlID0gKCBAcGFyc2VyX2NsYXNzLnByb2ZpbGU/IHJlc2N1ZSBmYWxzZSApCisgIGVuZAorICAKKyAgZGVmIHNldHVwX29wdGlvbnMoIG9wdCApCisgICAgc3VwZXIKKyAgICAKKyAgICBvcHQuc2VwYXJhdG9yICIiCisgICAgb3B0LnNlcGFyYXRvciggIlBhcnNlciBDb25maWd1cmF0aW9uOiIgKQorICAgIAorICAgIG9wdC5vbiggJy0tbGV4ZXItbmFtZSBDTEFTU19OQU1FJywgIm5hbWUgb2YgdGhlIGxleGVyIGNsYXNzIHRvIHVzZSIgKSB7IHx2YWx8CisgICAgICBAbGV4ZXJfY2xhc3NfbmFtZSA9IHZhbAorICAgICAgQGxleGVyX2NsYXNzID0gbmlsCisgICAgfQorICAgIAorICAgIG9wdC5vbiggJy0tbGV4ZXItZmlsZSBQQVRIX1RPX0xJQlJBUlknLCAicGF0aCB0byBsaWJyYXJ5IGRlZmluaW5nIHRoZSBsZXhlciBjbGFzcyIgKSB7IHx2YWx8CisgICAgICBiZWdpbgorICAgICAgICB0ZXN0KCA/ZiwgdmFsICkgPyBsb2FkKCB2YWwgKSA6IHJlcXVpcmUoIHZhbCApCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIHdhcm4oICJ1bmFibGUgdG8gbG9hZCB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgLS1sZXhlci1maWxlOiAjeyAkISB9IiApCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgb3B0Lm9uKCAnLS1ydWxlIE5BTUUnLCAibmFtZSBvZiB0aGUgcGFyc2VyIHJ1bGUgdG8gZXhlY3V0ZSIgKSB7IHx2YWx8IEBwYXJzZXJfcnVsZSA9IHZhbCB9CisgICAgCisgICAgaWYgQGRlYnVnCisgICAgICBvcHQuc2VwYXJhdG9yICcnCisgICAgICBvcHQuc2VwYXJhdG9yICJEZWJ1ZyBNb2RlIE9wdGlvbnM6IgorICAgICAgCisgICAgICBvcHQub24oICctLXRyYWNlJywgJy10JywgInByaW50IHJ1bGUgdHJhY2UgaW5zdGVhZCBvZiBvcGVuaW5nIGEgZGVidWcgc29ja2V0IiApIGRvCisgICAgICAgIEB0cmFjZSA9IHRydWUKKyAgICAgIGVuZAorICAgICAgCisgICAgICBvcHQub24oICctLXBvcnQgTlVNQkVSJywgSW50ZWdlciwgInBvcnQgbnVtYmVyIHRvIHVzZSBmb3IgdGhlIGRlYnVnIHNvY2tldCIgKSBkbyB8bnVtYmVyfAorICAgICAgICBAcG9ydCA9IG51bWJlcgorICAgICAgZW5kCisgICAgICAKKyAgICAgIG9wdC5vbiggJy0tbG9nIFBBVEgnLCAicGF0aCBvZiBmaWxlIHRvIHVzZSB0byByZWNvcmQgc29ja2V0IGFjdGl2aXR5IiwKKyAgICAgICAgICAgICAiKHN0ZGVyciBieSBkZWZhdWx0KSIgKSBkbyB8cGF0aHwKKyAgICAgICAgQGxvZyA9IG9wZW4oIHBhdGgsICd3JyApCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgc2V0dXAKKyAgICB1bmxlc3MgQGxleGVyX2NsYXNzIHx8PSBmZXRjaF9jbGFzcyggQGxleGVyX2NsYXNzX25hbWUgKQorICAgICAgaWYgQGxleGVyX2NsYXNzX25hbWUKKyAgICAgICAgZmFpbCggInVuYWJsZSB0byBsb2NhdGUgdGhlIGxleGVyIGNsYXNzIGBgI0BsZXhlcl9jbGFzc19uYW1lJyciICkKKyAgICAgIGVsc2UKKyAgICAgICAgdW5sZXNzIEBsZXhlcl9jbGFzcyA9IEBwYXJzZXJfY2xhc3MuYXNzb2NpYXRlZF9sZXhlcgorICAgICAgICAgIGZhaWwoIGRvYyggPDwtRU5EICkgKQorICAgICAgICAgIHwgbm8gbGV4ZXIgY2xhc3MgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGggdGhlIC0tbGV4ZXItbmFtZSBvcHRpb24KKyAgICAgICAgICB8IGFuZCAjQHBhcnNlcl9jbGFzcyBkb2VzIG5vdCBhcHBlYXIgdG8gaGF2ZSBhbiBhc3NvY2lhdGVkCisgICAgICAgICAgfCBsZXhlciBjbGFzcworICAgICAgICAgIEVORAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICAgIEBwYXJzZXJfcnVsZSB8fD0gQHBhcnNlcl9jbGFzcy5kZWZhdWx0X3J1bGUgb3IKKyAgICAgIGZhaWwoICJhIHBhcnNlciBydWxlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgdmlhIC0tcnVsZSBOQU1FIiApCisgIGVuZAorICAKKyAgZGVmIHJlY29nbml6ZSggaW5fc3RyZWFtICkKKyAgICBwYXJzZXJfb3B0aW9ucyA9IHt9CisgICAgaWYgQGRlYnVnCisgICAgICBpZiBAdHJhY2UKKyAgICAgICAgcGFyc2VyX29wdGlvbnNbIDpkZWJ1Z19saXN0ZW5lciBdID0gQU5UTFIzOjpEZWJ1Zzo6UnVsZVRyYWNlci5uZXcKKyAgICAgIGVsc2UKKyAgICAgICAgcGFyc2VyX29wdGlvbnNbIDpwb3J0IF0gPSBAcG9ydAorICAgICAgICBwYXJzZXJfb3B0aW9uc1sgOmxvZyBdICA9IEBsb2cKKyAgICAgIGVuZAorICAgIGVuZAorICAgIGxleGVyID0gQGxleGVyX2NsYXNzLm5ldyggaW5fc3RyZWFtICkKKyAgICAjIHRva2VuX3N0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEBwYXJzZXJfY2xhc3MubmV3KCBsZXhlciwgcGFyc2VyX29wdGlvbnMgKQorICAgIHJlc3VsdCA9IHBhcnNlci5zZW5kKCBAcGFyc2VyX3J1bGUgKSBhbmQgcHJlc2VudCggcmVzdWx0ICkKKyAgICBAcHJvZmlsZSBhbmQgcHV0cyggcGFyc2VyLmdlbmVyYXRlX3JlcG9ydCApCisgIGVuZAorICAKKyAgZGVmIHByZXNlbnQoIHJldHVybl92YWx1ZSApCisgICAgQVNUQnVpbGRlciA+IEBwYXJzZXJfY2xhc3MgYW5kIHJldHVybl92YWx1ZSA9IHJldHVybl92YWx1ZS50cmVlCisgICAgaWYgcmV0dXJuX3ZhbHVlCisgICAgICB0ZXh0ID0gCisgICAgICAgIGJlZ2luCisgICAgICAgICAgcmVxdWlyZSAncHAnCisgICAgICAgICAgcmV0dXJuX3ZhbHVlLnByZXR0eV9pbnNwZWN0CisgICAgICAgIHJlc2N1ZSBMb2FkRXJyb3IsIE5vTWV0aG9kRXJyb3IKKyAgICAgICAgICByZXR1cm5fdmFsdWUuaW5zcGVjdAorICAgICAgICBlbmQKKyAgICAgIHB1dHMoIHRleHQgKQorICAgIGVuZAorICBlbmQKKyAgCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpNYWluOjpXYWxrZXJNYWluCisKK0EgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBhIGhhbmR5IHRlc3Qgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGFuIEFOVExSCitnZW5lcmF0ZWQgdHJlZSB3YWxrZXIgKHRyZWUgcGFyc2VyKSBmaWxlIGlzIHJ1biBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKKz1lbmQKKworY2xhc3MgV2Fsa2VyTWFpbiA8IE1haW4KKyAgYXR0cl9hY2Nlc3NvciA6d2Fsa2VyX2NsYXNzLCA6bGV4ZXJfY2xhc3MsIDpwYXJzZXJfY2xhc3MKKyAgCisgIGRlZiBpbml0aWFsaXplKCB3YWxrZXJfY2xhc3MsIG9wdGlvbnMgPSB7fSApCisgICAgc3VwZXIoIG9wdGlvbnMgKQorICAgIEB3YWxrZXJfY2xhc3MgPSB3YWxrZXJfY2xhc3MKKyAgICBAbGV4ZXJfY2xhc3NfbmFtZSA9IG9wdGlvbnNbIDpsZXhlcl9jbGFzc19uYW1lIF0KKyAgICBAbGV4ZXJfY2xhc3MgID0gb3B0aW9uc1sgOmxleGVyX2NsYXNzIF0KKyAgICBAcGFyc2VyX2NsYXNzX25hbWUgPSBvcHRpb25zWyA6cGFyc2VyX2NsYXNzX25hbWUgXQorICAgIEBwYXJzZXJfY2xhc3MgPSBvcHRpb25zWyA6cGFyc2VyX2NsYXNzIF0KKyAgICBpZiBAZGVidWcgPSAoIEBwYXJzZXJfY2xhc3MuZGVidWc/IHJlc2N1ZSBmYWxzZSApCisgICAgICBAcG9ydCA9IG9wdGlvbnMuZmV0Y2goIDpwb3J0LCBBTlRMUjM6OkRlYnVnOjpERUZBVUxUX1BPUlQgKQorICAgICAgQGxvZyAgPSBvcHRpb25zLmZldGNoKCA6bG9nLCBAZXJyb3IgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBzZXR1cF9vcHRpb25zKCBvcHQgKQorICAgIHN1cGVyCisgICAgCisgICAgb3B0LnNlcGFyYXRvciAnJworICAgIG9wdC5zZXBhcmF0b3IgIlRyZWUgUGFyc2VyIENvbmZpZ3VyYXRpb246IgorICAgIAorICAgIG9wdC5vbiggJy0tbGV4ZXItbmFtZSBDTEFTU19OQU1FJywgJ2Z1bGwgbmFtZSBvZiB0aGUgbGV4ZXIgY2xhc3MgdG8gdXNlJyApIHsgfHZhbHwgQGxleGVyX2NsYXNzX25hbWUgPSB2YWwgfQorICAgIG9wdC5vbigKKyAgICAgICctLWxleGVyLWZpbGUgUEFUSF9UT19MSUJSQVJZJywKKyAgICAgICdwYXRoIHRvIGxvYWQgdG8gbWFrZSB0aGUgbGV4ZXIgY2xhc3MgYXZhaWxhYmxlJworICAgICkgeyB8dmFsfAorICAgICAgYmVnaW4KKyAgICAgICAgdGVzdCggP2YsIHZhbCApID8gbG9hZCggdmFsICkgOiByZXF1aXJlKCB2YWwgKQorICAgICAgcmVzY3VlIExvYWRFcnJvcgorICAgICAgICB3YXJuKCAidW5hYmxlIHRvIGxvYWQgdGhlIGxpYnJhcnkgYCN7IHZhbCB9JyBzcGVjaWZpZWQgYnkgLS1sZXhlci1maWxlOiAjeyAkISB9IiApCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgb3B0Lm9uKAorICAgICAgJy0tcGFyc2VyLW5hbWUgQ0xBU1NfTkFNRScsCisgICAgICAnZnVsbCBuYW1lIG9mIHRoZSBwYXJzZXIgY2xhc3MgdG8gdXNlJworICAgICkgeyB8dmFsfCBAcGFyc2VyX2NsYXNzX25hbWUgPSB2YWwgfQorICAgIG9wdC5vbigKKyAgICAgICctLXBhcnNlci1maWxlIFBBVEhfVE9fTElCUkFSWScsCisgICAgICAncGF0aCB0byBsb2FkIHRvIG1ha2UgdGhlIHBhcnNlciBjbGFzcyBhdmFpbGFibGUnCisgICAgKSB7IHx2YWx8CisgICAgICBiZWdpbgorICAgICAgICB0ZXN0KCA/ZiwgdmFsICkgPyBsb2FkKCB2YWwgKSA6IHJlcXVpcmUoIHZhbCApCisgICAgICByZXNjdWUgTG9hZEVycm9yCisgICAgICAgIHdhcm4oICJ1bmFibGUgdG8gbG9hZCB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgLS1wYXJzZXItZmlsZTogI3sgJCEgfSIgKQorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIG9wdC5vbiggJy0tcGFyc2VyLXJ1bGUgTkFNRScsICJuYW1lIG9mIHRoZSBwYXJzZXIgcnVsZSB0byB1c2Ugb24gdGhlIGlucHV0IiApIHsgfHZhbHwgQHBhcnNlcl9ydWxlID0gdmFsIH0KKyAgICBvcHQub24oICctLXJ1bGUgTkFNRScsICJuYW1lIG9mIHRoZSBydWxlIHRvIGludm9rZSBpbiB0aGUgdHJlZSBwYXJzZXIiICkgeyB8dmFsfCBAd2Fsa2VyX3J1bGUgPSB2YWwgfQorICAgIAorICAgIGlmIEBkZWJ1ZworICAgICAgb3B0LnNlcGFyYXRvciAnJworICAgICAgb3B0LnNlcGFyYXRvciAiRGVidWcgTW9kZSBPcHRpb25zOiIKKyAgICAgIAorICAgICAgb3B0Lm9uKCAnLS1wb3J0IE5VTUJFUicsIEludGVnZXIsICJwb3J0IG51bWJlciB0byB1c2UgZm9yIHRoZSBkZWJ1ZyBzb2NrZXQiICkgZG8gfG51bWJlcnwKKyAgICAgICAgQHBvcnQgPSBudW1iZXIKKyAgICAgIGVuZAorICAgICAgb3B0Lm9uKCAnLS1sb2cgUEFUSCcsICJwYXRoIG9mIGZpbGUgdG8gdXNlIHRvIHJlY29yZCBzb2NrZXQgYWN0aXZpdHkiLAorICAgICAgICAgICAgICIoc3RkZXJyIGJ5IGRlZmF1bHQpIiApIGRvIHxwYXRofAorICAgICAgICBAbG9nID0gb3BlbiggcGF0aCwgJ3cnICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgICMgVE9ETzogZmluaXNoIHRoZSBNYWluIG1vZHVsZXMKKyAgZGVmIHNldHVwCisgICAgdW5sZXNzIEBsZXhlcl9jbGFzcyB8fD0gZmV0Y2hfY2xhc3MoIEBsZXhlcl9jbGFzc19uYW1lICkKKyAgICAgIGZhaWwoICJ1bmFibGUgdG8gbG9jYXRlIHRoZSBsZXhlciBjbGFzcyAjQGxleGVyX2NsYXNzX25hbWUiICkKKyAgICBlbmQKKyAgICB1bmxlc3MgQHBhcnNlcl9jbGFzcyB8fD0gZmV0Y2hfY2xhc3MoIEBwYXJzZXJfY2xhc3NfbmFtZSApCisgICAgICBmYWlsKCAidW5hYmxlIHRvIGxvY2F0ZSB0aGUgcGFyc2VyIGNsYXNzICNAcGFyc2VyX2NsYXNzX25hbWUiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgcmVjb2duaXplKCBpbl9zdHJlYW0gKQorICAgIHdhbGtlcl9vcHRpb25zID0ge30KKyAgICBpZiBAZGVidWcKKyAgICAgIHdhbGtlcl9vcHRpb25zWyA6cG9ydCBdID0gQHBvcnQKKyAgICAgIHdhbGtlcl9vcHRpb25zWyA6bG9nIF0gPSBAbG9nCisgICAgZW5kCisgICAgQGxleGVyID0gQGxleGVyX2NsYXNzLm5ldyggaW5fc3RyZWFtICkKKyAgICBAdG9rZW5fc3RyZWFtID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIEBsZXhlciApCisgICAgQHBhcnNlciA9IEBwYXJzZXJfY2xhc3MubmV3KCBAdG9rZW5fc3RyZWFtICkKKyAgICBpZiByZXN1bHQgPSBAcGFyc2VyLnNlbmQoIEBwYXJzZXJfcnVsZSApCisgICAgICByZXN1bHQucmVzcG9uZF90bz8oIDp0cmVlICkgb3IgZmFpbCggIlBhcnNlciBkaWQgbm90IHJldHVybiBhbiBBU1QgZm9yIHJ1bGUgI0BwYXJzZXJfcnVsZSIgKQorICAgICAgQG5vZGVfc3RyZWFtID0gQU5UTFIzOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICAgIEBub2RlX3N0cmVhbS50b2tlbl9zdHJlYW0gPSBAdG9rZW5fc3RyZWFtCisgICAgICBAd2Fsa2VyID0gQHdhbGtlcl9jbGFzcy5uZXcoIEBub2RlX3N0cmVhbSwgd2Fsa2VyX29wdGlvbnMgKQorICAgICAgaWYgcmVzdWx0ID0gQHdhbGtlci5zZW5kKCBAd2Fsa2VyX3J1bGUgKQorICAgICAgICBvdXQgPSByZXN1bHQudHJlZS5pbnNwZWN0IHJlc2N1ZSByZXN1bHQuaW5zcGVjdAorICAgICAgICBwdXRzKCBvdXQgKQorICAgICAgZWxzZSBwdXRzISggIndhbGtlci4jQHdhbGtlcl9ydWxlIHJldHVybmVkIG5pbCIgKQorICAgICAgZW5kCisgICAgZWxzZSBwdXRzISggInBhcnNlci4jQHBhcnNlcl9ydWxlIHJldHVybmVkIG5pbCIgKQorICAgIGVuZAorICBlbmQKK2VuZAorZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9tb2Rlcy9hc3QtYnVpbGRlci5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9tb2Rlcy9hc3QtYnVpbGRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Y2U3NjhhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL21vZGVzL2FzdC1idWlsZGVyLnJiCkBAIC0wLDAgKzEsNDAgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKK3JlcXVpcmUgJ2FudGxyMycKK3JlcXVpcmUgJ2FudGxyMy90cmVlJworCittb2R1bGUgQU5UTFIzCittb2R1bGUgQVNUQnVpbGRlcgorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgCisgIGRlZiBzZWxmLmluY2x1ZGVkKCBrbGFzcyApCisgICAgZGVmIGtsYXNzLnJldHVybl9zY29wZV9tZW1iZXJzCisgICAgICBzdXBlci5wdXNoKCA6dHJlZSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGluaXRpYWxpemUoIGlucHV0LCBvcHRpb25zID0ge30gKQorICAgIEBhZGFwdG9yID0gb3B0aW9uc1sgOmFkYXB0b3IgXSB8fD0gYmVnaW4KKyAgICAgICggaW5wdXQuYWRhcHRvciByZXNjdWUgbmlsICkgb3IKKyAgICAgICAgQVNUOjpDb21tb25UcmVlQWRhcHRvci5uZXcoIHRva2VuX2NsYXNzICkKKyAgICBlbmQKKyAgICBzdXBlciggaW5wdXQsIG9wdGlvbnMgKQorICBlbmQKKyAgCisgIHNoYXJlZF9hdHRyaWJ1dGUoIDphZGFwdG9yICkKKyAgCitwcml2YXRlCisgIAorICBkZWYgc3VidHJlZV9zdHJlYW0oIGRlc2MsIGVsZW1lbnQgPSBuaWwgKQorICAgIEFTVDo6UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm5ldyggQGFkYXB0b3IsIGRlc2MsIGVsZW1lbnQgKQorICBlbmQKKyAgCisgIGRlZiB0b2tlbl9zdHJlYW0oIGRlc2MsIGVsZW1lbnQgPSBuaWwgKQorICAgIEFTVDo6UmV3cml0ZVJ1bGVUb2tlblN0cmVhbS5uZXcoIEBhZGFwdG9yLCBkZXNjLCBlbGVtZW50ICkKKyAgZW5kCisgIAorICBkZWYgbm9kZV9zdHJlYW0oIGRlc2MsIGVsZW1lbnQgPSBuaWwgKQorICAgIEFTVDo6UmV3cml0ZVJ1bGVOb2RlU3RyZWFtLm5ldyggQGFkYXB0b3IsIGRlc2MsIGVsZW1lbnQgKQorICBlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvbW9kZXMvZmlsdGVyLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL21vZGVzL2ZpbHRlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGI2M2JmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL21vZGVzL2ZpbHRlci5yYgpAQCAtMCwwICsxLDU4IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMycKKworbW9kdWxlIEFOVExSMworPWJlZ2luIHJkb2MgQU5UTFIzOjpGaWx0ZXJNb2RlCisKK0lmIGEgbGV4ZXIgZ3JhbW1hciBzcGVjaWZpZXMgdGhlIDx0dD5maWx0ZXIgPSB0cnVlPC90PiBvcHRpb24sIHRoZSBnZW5lcmF0ZWQKK0xleGVyIGNvZGUgd2lsbCBpbmNsdWRlIHRoaXMgbW9kdWxlLiBJdCBtb2RpZmllcyB0aGUgc3RhbmRhcmQKKzx0dD5uZXh0X3Rva2VuPC90dD4gdG8gY2F0Y2ggUmVjb2duaXRpb25FcnJvcnMgYW5kIHNraXAgYWhlYWQgaW4gdGhlIGlucHV0IHVudGlsCit0aGUgdG9rZW4hIG1ldGhvZCBjYW4gbWF0Y2ggYSB0b2tlbiB3aXRob3V0IHJhaXNpbmcgYSBSZWNvZ25pdGlvbkVycm9yLgorCitTZWUgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9MZXhpY2FsK2ZpbHRlcnMgZm9yIG1vcmUgaW5mbyBvbgorbGV4ZXIgZmlsdGVyIG1vZGUuCisKKz1lbmQKK21vZHVsZSBGaWx0ZXJNb2RlCisgIGRlZiBuZXh0X3Rva2VuCisgICAgIyBpZiBhdCBlbmQtb2YtZmlsZSwgcmV0dXJuIHRoZSBFT0YgdG9rZW4KKyAgICBAaW5wdXQucGVlayA9PSBBTlRMUjM6OkVPRiBhbmQgcmV0dXJuIEFOVExSMzo6RU9GX1RPS0VOCisgICAgCisgICAgQHN0YXRlLnRva2VuICAgICAgICAgICAgICAgID0gbmlsCisgICAgQHN0YXRlLmNoYW5uZWwgICAgICAgICAgICAgID0gQU5UTFIzOjpERUZBVUxUX0NIQU5ORUwKKyAgICBAc3RhdGUudG9rZW5fc3RhcnRfcG9zaXRpb24gPSBAaW5wdXQuaW5kZXgKKyAgICBAc3RhdGUudG9rZW5fc3RhcnRfY29sdW1uICAgPSBAaW5wdXQuY29sdW1uCisgICAgQHN0YXRlLnRva2VuX3N0YXJ0X2xpbmUgICAgID0gQGlucHV0LmxpbmUKKyAgICBAc3RhdGUudGV4dCAgICAgICAgICAgICAgICAgPSBuaWwKKyAgICBAc3RhdGUuYmFja3RyYWNraW5nICAgICAgICAgPSAxCisgICAgCisgICAgbSA9IEBpbnB1dC5tYXJrCisgICAgdG9rZW4hCisgICAgQGlucHV0LnJlbGVhc2UoIG0gKQorICAgIGVtaXQKKyAgICByZXR1cm4gQHN0YXRlLnRva2VuCisgIHJlc2N1ZSBBTlRMUjM6OkJhY2t0cmFja2luZ0ZhaWxlZAorICAgICMgdG9rZW4hIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorICAgICMgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLgorICAgIEBpbnB1dC5yZXdpbmQoIG0gKQorICAgIEBpbnB1dC5jb25zdW1lICMgYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluCisgICAgcmV0cnkKKyAgcmVzY3VlIEFOVExSMzo6RXJyb3I6OlJlY29nbml0aW9uRXJyb3IgPT4gcmUKKyAgICAjIHNob3VsZG4ndCBoYXBwZW4gaW4gYmFja3RyYWNraW5nIG1vZGUsIGJ1dC4uLgorICAgIHJlcG9ydF9lcnJvciggcmUgKQorICAgIHJlY292ZXIoIHJlICkKKyAgZW5zdXJlCisgICAgQHN0YXRlLmJhY2t0cmFja2luZyA9IDAKKyAgZW5kCisgIAorICBkZWYgbWVtb2l6ZSggcnVsZSwgc3RhcnRfaW5kZXgsIHN1Y2Nlc3MgKQorICAgIHN1cGVyKCBydWxlLCBzdGFydF9pbmRleCwgc3VjY2VzcyApIGlmIEBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAxCisgIGVuZAorICAKKyAgZGVmIGFscmVhZHlfcGFyc2VkX3J1bGU/KCBydWxlICkKKyAgICBAc3RhdGUuYmFja3RyYWNraW5nID4gMSA/IHN1cGVyKCBydWxlICkgOiBmYWxzZQorICBlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvcHJvZmlsZS5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9wcm9maWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGIxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvcHJvZmlsZS5yYgpAQCAtMCwwICsxLDM2MCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCis9YmVnaW4gTElDRU5TRQorCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBLeWxlIFlldHRlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz1lbmQKKworbW9kdWxlIEFOVExSMworbW9kdWxlIFByb2ZpbGUKKz1iZWdpbiByZG9jIEFOVExSMzo6UHJvZmlsZTo6UGFyc2VyRXZlbnRzCisKK0FOVExSMzo6UHJvZmlsZTo6UGFyc2VyRXZlbnRzIGV4cGFuZHMgYmFzaWMgZGVidWdnaW5nIGV2ZW50cyBmb3IgdXNlIGJ5CityZWNvZ25pdGlvbiBjb2RlIGdlbmVyYXRlZCBieSBBTlRMUiB3aGVuIGNhbGxlZCB3aXRoIHRoZSA8dHQ+LXByb2ZpbGU8L3R0Pgorc3dpdGNoLgorCis9ZW5kCittb2R1bGUgUGFyc2VyRXZlbnRzCisgIGluY2x1ZGUgQU5UTFIzOjpEZWJ1Zzo6UGFyc2VyRXZlbnRzCisgIAorICBkZWYgc2VsZi5pbmNsdWRlZCgga2xhc3MgKQorICAgIHN1cGVyCisgICAgaWYga2xhc3MuaXNfYT8oIDo6Q2xhc3MgKQorICAgICAgZGVmIGtsYXNzLnByb2ZpbGU/CisgICAgICAgIHRydWUKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplKCBzdHJlYW0sIG9wdGlvbnMgPSB7fSApCisgICAgb3B0aW9uc1sgOmRlYnVnX2xpc3RlbmVyIF0gfHw9IFByb2ZpbGVyLm5ldyggc2VsZiApCisgICAgc3VwZXIoIHN0cmVhbSwgb3B0aW9ucyApCisgIGVuZAorICAKKyAgZGVmIGFscmVhZHlfcGFyc2VkX3J1bGU/KCBydWxlICkKKyAgICBAZGVidWdfbGlzdGVuZXIuZXhhbWluZV9ydWxlX21lbW9pemF0aW9uKCBydWxlICkKKyAgICBzdXBlcgorICBlbmQKKyAgCisgIGRlZiBwcm9maWxlCisgICAgQGRlYnVnX2xpc3RlbmVyLnByb2ZpbGUKKyAgZW5kCisgIAorICBkZWYgbWVtb2l6ZSggcnVsZSwgc3RhcnRfaW5kZXgsIHN1Y2Nlc3MgKQorICAgIEBkZWJ1Z19saXN0ZW5lci5tZW1vaXplKCBydWxlLCBydWxlX3N0YXJ0X2luZGV4LCBzdWNlc3MgKQorICAgIHN1cGVyCisgIGVuZAorZW5kCisKK2NsYXNzIERhdGFTZXQgPCA6OkFycmF5CisgIGluY2x1ZGUgOjpNYXRoCisgIGRlZiB0b3RhbAorICAgIGluamVjdCggOisgKQorICBlbmQKKyAgZGVmIGF2ZXJhZ2UKKyAgICBsZW5ndGggPiAwID8gKCB0b3RhbC50b19mIC8gbGVuZ3RoICkgOiAwCisgIGVuZAorICBkZWYgdmFyaWFuY2UKKyAgICBsZW5ndGguemVybz8gYW5kIHJldHVybiggMC4wICkKKyAgICBtZWFuID0gYXZlcmFnZQorICAgIGluamVjdCggMC4wICkgeyB8dCwgaXwgdCArICggaSAtIG1lYW4gKSoqMiB9IC8gKCBsZW5ndGggLSAxICkKKyAgZW5kCisgIGRlZiBzdGFuZGFyZF9kZXZpYXRpb24KKyAgICBzcXJ0KCB2YXJpYW5jZSApCisgIGVuZAorZW5kCisKKwordW5sZXNzIGNvbnN0X2RlZmluZWQ/KCA6UHJvZmlsZSApCisgIFByb2ZpbGUgPSBTdHJ1Y3QubmV3KCAKKyAgICA6Z3JhbW1hcl9maWxlLCA6cGFyc2VyX2NsYXNzLCA6dG9wX3J1bGUsCisgICAgOnJ1bGVfaW52b2NhdGlvbnMsIDpndWVzc2luZ19ydWxlX2ludm9jYXRpb25zLCA6cnVsZV9pbnZvY2F0aW9uX2RlcHRoLAorICAgIDpmaXhlZF9sb29rcywgOmN5Y2xpY19sb29rcywgOnN5bnRhY3RpY19wcmVkaWNhdGVfbG9va3MsCisgICAgOm1lbW9pemF0aW9uX2NhY2hlX2VudHJpZXMsIDptZW1vaXphdGlvbl9jYWNoZV9oaXRzLAorICAgIDptZW1vaXphdGlvbl9jYWNoZV9taXNzZXMsIDp0b2tlbnMsIDpoaWRkZW5fdG9rZW5zLAorICAgIDpjaGFyYWN0ZXJzX21hdGNoZWQsIDpoaWRkZW5fY2hhcmFjdGVyc19tYXRjaGVkLCA6c2VtYW50aWNfcHJlZGljYXRlcywKKyAgICA6c3ludGFjdGljX3ByZWRpY2F0ZXMsIDpyZXBvcnRlZF9lcnJvcnMKKyAgKQorZW5kCisKK2NsYXNzIFByb2ZpbGUKKyAgZGVmIGluaXRpYWxpemUKKyAgICBpbml0X3ZhbHVlcyA9IEFycmF5Lm5ldyggc2VsZi5jbGFzcy5tZW1iZXJzLmxlbmd0aCwgMCApCisgICAgc3VwZXIoICppbml0X3ZhbHVlcyApCisgICAgc2VsZi50b3BfcnVsZSA9IHNlbGYucGFyc2VyX2NsYXNzID0gc2VsZi5ncmFtbWFyX2ZpbGUgPSBuaWwKKyAgICBzZWxmLmZpeGVkX2xvb2tzID0gRGF0YVNldC5uZXcKKyAgICBzZWxmLmN5Y2xpY19sb29rcyA9IERhdGFTZXQubmV3CisgICAgc2VsZi5zeW50YWN0aWNfcHJlZGljYXRlX2xvb2tzID0gRGF0YVNldC5uZXcKKyAgZW5kCisgIAorICBkZWYgZml4ZWRfZGVjaXNpb25zCisgICAgZml4ZWRfbG9va3MubGVuZ3RoCisgIGVuZAorICAKKyAgZGVmIGN5Y2xpY19kZWNpc2lvbnMKKyAgICBjeWNsaWNfbG9va3MubGVuZ3RoCisgIGVuZAorICAKKyAgZGVmIGJhY2t0cmFja2luZ19kZWNpc2lvbnMKKyAgICBzeW50YWN0aWNfcHJlZGljYXRlX2xvb2tzLmxlbmd0aAorICBlbmQKKyAgCisgIGRlZiBnZW5lcmF0ZV9yZXBvcnQKKyAgICByZXBvcnQgPSAnKycgPDwgJy0nICogNzggPDwgIitcbiIKKyAgICByZXBvcnQgPDwgJ3wgJyA8PCAiQU5UTFIgUnVsZSBQcm9maWxlIi5jZW50ZXIoIDc2ICkgPDwgIiB8XG4iCisgICAgcmVwb3J0IDw8ICcrJyA8PCAnLScgKiA3OCA8PCAiK1xuIgorICAgIHJlcG9ydCA8PCAifCBHZW5lcmF0ZWQgYXQgI3sgVGltZS5ub3cgfSIubGp1c3QoIDc4ICkgPDwgIiB8XG4iCisgICAgcmVwb3J0IDw8ICJ8IFByb2ZpbGVkICN7IHBhcnNlcl9jbGFzcy5uYW1lIH0jI3sgdG9wX3J1bGUgfSIubGp1c3QoIDc4ICkgPDwgIiB8XG4iCisgICAgcmVwb3J0IDw8ICJ8IFJ1bGUgc291cmNlIGdlbmVyYXRlZCBmcm9tIGdyYW1tYXIgZmlsZSAjeyBncmFtbWFyX2ZpbGUgfSIubGp1c3QoIDc4ICkgPDwgIiB8XG4iCisgICAgcmVwb3J0IDw8ICcrJyA8PCAnLScgKiA3OCA8PCAiK1xuIgorICAgIAorICAgIHJlcG9ydCA8PCAnfCAnIDw8ICJSdWxlIEludm9jYXRpb25zIi5jZW50ZXIoIDc2ICkgPDwgIiB8XG4iCisgICAgcmVwb3J0IDw8ICcrJyA8PCAnLScgKiA2OCA8PCAnKycgPDwgJy0nICogOSA8PCAiK1xuIgorICAgIHJlcG9ydCA8PCAifCAlLTY2cyB8ICU3aSB8XG4iICUgWyAiVG90YWwgSW52b2NhdGlvbnMiLCBydWxlX2ludm9jYXRpb25zIF0KKyAgICByZXBvcnQgPDwgInwgJS02NnMgfCAlN2kgfFxuIiAlIFsgImBgR3Vlc3NpbmcnJyBJbnZvY2F0aW9ucyIsIGd1ZXNzaW5nX3J1bGVfaW52b2NhdGlvbnMgXQorICAgIHJlcG9ydCA8PCAifCAlLTY2cyB8ICU3aSB8XG4iICUgWyAiRGVlcGVzdCBMZXZlbCBvZiBJbnZvY2F0aW9uIiwgcnVsZV9pbnZvY2F0aW9uX2RlcHRoIF0KKyAgICByZXBvcnQgPDwgJysnIDw8ICctJyAqIDY4IDw8ICcrJyA8PCAnLScgKiA5IDw8ICIrXG4iCisgICAgCisgICAgcmVwb3J0IDw8ICd8ICcgPDwgIkV4ZWN1dGlvbiBFdmVudHMiLmNlbnRlciggNzYgKSA8PCAiIHxcbiIKKyAgICByZXBvcnQgPDwgJysnIDw8ICctJyAqIDY4IDw8ICcrJyA8PCAnLScgKiA5IDw8ICIrXG4iCisgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJTZW1hbnRpYyBQcmVkaWNhdGVzIEV2YWx1YXRlZCIsIHNlbWFudGljX3ByZWRpY2F0ZXMgXQorICAgIHJlcG9ydCA8PCAifCAlLTY2cyB8ICU3aSB8XG4iICUgWyAiU3ludGFjdGljIFByZWRpY2F0ZXMgRXZhbHVhdGVkIiwgc3ludGFjdGljX3ByZWRpY2F0ZXMgXQorICAgIHJlcG9ydCA8PCAifCAlLTY2cyB8ICU3aSB8XG4iICUgWyAiRXJyb3JzIFJlcG9ydGVkIiwgcmVwb3J0ZWRfZXJyb3JzIF0KKyAgICByZXBvcnQgPDwgJysnIDw8ICctJyAqIDY4IDw8ICcrJyA8PCAnLScgKiA5IDw8ICIrXG4iCisgICAgCisgICAgcmVwb3J0IDw8ICd8ICcgPDwgIlRva2VuIGFuZCBDaGFyYWN0ZXIgRGF0YSIuY2VudGVyKCA3NiApIDw8ICIgfFxuIgorICAgIHJlcG9ydCA8PCAnKycgPDwgJy0nICogNjggPDwgJysnIDw8ICctJyAqIDkgPDwgIitcbiIKKyAgICByZXBvcnQgPDwgInwgJS02NnMgfCAlN2kgfFxuIiAlIFsgIlRva2VucyBDb25zdW1lZCIsIHRva2VucyBdCisgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJIaWRkZW4gVG9rZW5zIENvbnN1bWVkIiwgaGlkZGVuX3Rva2VucyBdCisgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJDaGFyYWN0ZXJzIE1hdGNoZWQiLCBjaGFyYWN0ZXJzX21hdGNoZWQgXQorICAgIHJlcG9ydCA8PCAifCAlLTY2cyB8ICU3aSB8XG4iICUgWyAiSGlkZGVuIENoYXJhY3RlcnMgTWF0Y2hlZCIsIGhpZGRlbl9jaGFyYWN0ZXJzX21hdGNoZWQgXQorICAgIHJlcG9ydCA8PCAnKycgPDwgJy0nICogNjggPDwgJysnIDw8ICctJyAqIDkgPDwgIitcbiIKKyAgICAKKyAgICByZXBvcnQgPDwgJ3wgJyA8PCAiTWVtb2l6YXRpb24iLmNlbnRlciggNzYgKSA8PCAiIHxcbiIKKyAgICByZXBvcnQgPDwgJysnIDw8ICctJyAqIDY4IDw8ICcrJyA8PCAnLScgKiA5IDw8ICIrXG4iCisgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJDYWNoZSBFbnRyaWVzIiwgbWVtb2l6YXRpb25fY2FjaGVfZW50cmllcyBdCisgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJDYWNoZSBIaXRzIiwgbWVtb2l6YXRpb25fY2FjaGVfaGl0cyBdCisgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJDYWNoZSBNaXNzZXMiLCBtZW1vaXphdGlvbl9jYWNoZV9taXNzZXMgXQorICAgIHJlcG9ydCA8PCAnKycgPDwgJy0nICogNjggPDwgJysnIDw8ICctJyAqIDkgPDwgIitcbiIKKyAgICAKKyAgICBbIAorICAgICAgWyAnRml4ZWQgTG9va2FoZWFkIChrKScsIGZpeGVkX2xvb2tzIF0sCisgICAgICBbICdBcmJpdHJhcnkgTG9va2FoZWFkIChrKScsIGN5Y2xpY19sb29rcyBdLAorICAgICAgWyAnQmFja3RyYWNraW5nIChTeW50YWN0aWMgUHJlZGljYXRlKScsIHN5bnRhY3RpY19wcmVkaWNhdGVfbG9va3MgXQorICAgIF0uZWFjaCBkbyB8bmFtZSwgc2V0fAorICAgICAgbWVhbiwgc3RkZXYgPSAnJTQuMmYnICUgc2V0LmF2ZXJhZ2UsICclNC4yZicgJSBzZXQuc3RhbmRhcmRfZGV2aWF0aW9uCisgICAgICByZXBvcnQgPDwgJ3wgJyA8PCAiI3sgbmFtZSB9IERlY2lzaW9ucyIuY2VudGVyKCA3NiApIDw8ICIgfFxuIgorICAgICAgcmVwb3J0IDw8ICcrJyA8PCAnLScgKiA2OCA8PCAnKycgPDwgJy0nICogOSA8PCAiK1xuIgorICAgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJDb3VudCIsIHNldC5sZW5ndGggXQorICAgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdpIHxcbiIgJSBbICJNaW5pbXVtIGsiLCBzZXQubWluIF0KKyAgICAgIHJlcG9ydCA8PCAifCAlLTY2cyB8ICU3aSB8XG4iICUgWyAiTWF4aW11bSBrIiwgc2V0Lm1heCBdCisgICAgICByZXBvcnQgPDwgInwgJS02NnMgfCAlN3MgfFxuIiAlIFsgIkF2ZXJhZ2UgayIsIG1lYW4gXQorICAgICAgcmVwb3J0IDw8ICJ8ICUtNjZzIHwgJTdzIHxcbiIgJSBbICJTdGFuZGFyZCBEZXZpYXRpb24gb2YgayIsIHN0ZGV2IF0KKyAgICAgIHJlcG9ydCA8PCAnKycgPDwgJy0nICogNjggPDwgJysnIDw8ICctJyAqIDkgPDwgIitcbiIKKyAgICBlbmQKKyAgICByZXR1cm4oIHJlcG9ydCApCisgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6UHJvZmlsZTo6UHJvZmlsZXIKKworV2hlbiBBTlRMUiBpcyBydW4gd2l0aCB0aGUgPHR0Pi1wcm9maWxlPC90dD4gc3dpdGNoLCBpdCBnZW5lcmF0ZXMgcmVjb2duaXRpb24KK2NvZGUgdGhhdCBwZXJmb3JtcyBhY2NvdW50aW5nIGFib3V0IHRoZSBkZWNpc2lvbiBsb2dpYyBwZXJmb3JtZWQgd2hpbGUgcGFyc2luZworYW55IGdpdmVuIGlucHV0LiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvIGhlbHAgcmVmYWN0b3IgYSBzbG93IGdyYW1tYXIuCitQcm9maWxlciBpcyBhbiBldmVudC1saXN0ZW5lciB0aGF0IHBlcmZvcm1zIGFsbCBvZiB0aGUgcHJvZmlsaW5nIGFjY291bnRpbmcgYW5kCitidWlsZHMgYSBzaW1wbGUgcmVwb3J0IHRvIHByZXNlbnQgdGhlIHZhcmlvdXMgc3RhdGlzdGljcy4KKworPWVuZAorY2xhc3MgUHJvZmlsZXIKKyAgaW5jbHVkZSBEZWJ1Zzo6RXZlbnRMaXN0ZW5lcgorICBpbmNsdWRlIENvbnN0YW50cworICAKKyAgUFJPVE9DT0xfVkVSU0lPTiA9IDIKKyAgCisgIGF0dHJfYWNjZXNzb3IgOnBhcnNlcgorICBhdHRyX3JlYWRlciA6cnVsZV9sZXZlbAorICBhdHRyX3JlYWRlciA6ZGVjaXNpb25fbGV2ZWwKKyAgCisgICMgdHJhY2tzIHRoZSBtYXhpbXVtIGxvb2sgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGRlY2lzaW9uCisgICMgKG1heExvb2thaGVhZEluQ3VycmVudERlY2lzaW9uIGluIGphdmEgUHJvZmlsZXIpCisgIGF0dHJfcmVhZGVyIDpkZWNpc2lvbl9sb29rCisgIAorICAjIHRoZSBsYXN0IHRva2VuIGNvbnN1bWVkCisgICMgKGxhc3RUb2tlbkNvbnN1bWVkIGluIGphdmEgUHJvZmlsZXIpCisgIGF0dHJfcmVhZGVyIDpsYXN0X3Rva2VuCisgIGF0dHJfcmVhZGVyIDpsb29rX3N0YWNrCisgIGF0dHJfcmVhZGVyIDpwcm9maWxlCisgIAorICBhdHRyX2FjY2Vzc29yIDpvdXRwdXQKKyAgCisgIGRlZiBpbml0aWFsaXplKCBwYXJzZXIgPSBuaWwsIG91dHB1dCA9IG5pbCApCisgICAgQHBhcnNlciA9IHBhcnNlcgorICAgIEBwcm9maWxlID0gbmlsCisgICAgQHJ1bGVfbGV2ZWwgPSAwCisgICAgQGRlY2lzaW9uX2xldmVsID0gMAorICAgIEBkZWNpc2lvbl9sb29rID0gMAorICAgIEBsYXN0X3Rva2VuID0gbmlsCisgICAgQGxvb2tfc3RhY2sgPSBbXQorICAgIEBvdXRwdXQgPSBvdXRwdXQKKyAgZW5kCisgIAorICBkZWYgY29tbWVuY2UKKyAgICBAcHJvZmlsZSA9IFByb2ZpbGUubmV3CisgICAgQHJ1bGVfbGV2ZWwgPSAwCisgICAgQGRlY2lzaW9uX2xldmVsID0gMAorICAgIEBkZWNpc2lvbl9sb29rID0gMAorICAgIEBsYXN0X3Rva2VuID0gbmlsCisgICAgQGxvb2tfc3RhY2sgPSBbXQorICBlbmQKKyAgCisgIGRlZiBlbnRlcl9ydWxlKCBncmFtbWFyX2ZpbGVfbmFtZSwgcnVsZV9uYW1lICkKKyAgICBpZiBAcnVsZV9sZXZlbC56ZXJvPworICAgICAgY29tbWVuY2UKKyAgICAgIEBwcm9maWxlLmdyYW1tYXJfZmlsZSA9IGdyYW1tYXJfZmlsZV9uYW1lCisgICAgICBAcHJvZmlsZS5wYXJzZXJfY2xhc3MgPSBAcGFyc2VyLmNsYXNzCisgICAgICBAcHJvZmlsZS50b3BfcnVsZSA9IHJ1bGVfbmFtZQorICAgIGVuZAorICAgIEBydWxlX2xldmVsICs9IDEKKyAgICBAcHJvZmlsZS5ydWxlX2ludm9jYXRpb25zICs9IDEKKyAgICBAcHJvZmlsZS5ydWxlX2ludm9jYXRpb25fZGVwdGggPCBAcnVsZV9sZXZlbCBhbmQKKyAgICAgIEBwcm9maWxlLnJ1bGVfaW52b2NhdGlvbl9kZXB0aCA9IEBydWxlX2xldmVsCisgIGVuZAorICAKKyAgZGVmIGV4aXRfcnVsZSggZ3JhbW1hcl9maWxlX25hbWUsIHJ1bGVfbmFtZSApCisgICAgQHJ1bGVfbGV2ZWwgLT0gMQorICBlbmQKKworICBkZWYgZXhhbWluZV9ydWxlX21lbW9pemF0aW9uKCBydWxlICkKKyAgICBzdG9wX2luZGV4ID0gcGFyc2VyLnJ1bGVfbWVtb2l6YXRpb24oIHJ1bGUsIEBwYXJzZXIuaW5wdXQuaW5kZXggKQorICAgIGlmIHN0b3BfaW5kZXggPT0gTUVNT19SVUxFX1VOS05PV04KKyAgICAgIEBwcm9maWxlLm1lbW9pemF0aW9uX2NhY2hlX21pc3NlcyArPSAxCisgICAgICBAcHJvZmlsZS5ndWVzc2luZ19ydWxlX2ludm9jYXRpb25zICs9IDEKKyAgICBlbHNlCisgICAgICBAcHJvZmlsZS5tZW1vaXphdGlvbl9jYWNoZV9oaXRzICs9IDEKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgbWVtb2l6ZSggcnVsZSwgc3RhcnRfaW5kZXgsIHN1Y2Nlc3MgKQorICAgIEBwcm9maWxlLm1lbW9pemF0aW9uX2NhY2hlX2VudHJpZXMgKz0gMQorICBlbmQKKyAgCisgIAorICBkZWYgZW50ZXJfZGVjaXNpb24oIGRlY2lzaW9uX251bWJlciApCisgICAgQGRlY2lzaW9uX2xldmVsICs9IDEKKyAgICBzdGFydGluZ19sb29rX2luZGV4ID0gQHBhcnNlci5pbnB1dC5pbmRleAorICAgIEBsb29rX3N0YWNrIDw8IHN0YXJ0aW5nX2xvb2tfaW5kZXgKKyAgZW5kCisKKyAgZGVmIGV4aXRfZGVjaXNpb24oIGRlY2lzaW9uX251bWJlciApCisgICAgQGxvb2tfc3RhY2sucG9wCisgICAgQGRlY2lzaW9uX2xldmVsIC09IDEKKyAgICBpZiBAcGFyc2VyLmN5Y2xpY19kZWNpc2lvbj8gdGhlbgorICAgICAgQHByb2ZpbGUuY3ljbGljX2xvb2tzIDw8IEBkZWNpc2lvbl9sb29rCisgICAgZWxzZSBAcHJvZmlsZS5maXhlZF9sb29rcyA8PCBAZGVjaXNpb25fbG9vaworICAgIGVuZAorICAgIAorICAgIEBwYXJzZXIuY3ljbGljX2RlY2lzaW9uID0gZmFsc2UKKyAgICBAZGVjaXNpb25fbG9vayA9IDAgICAgCisgIGVuZAorICAKKyAgZGVmIGNvbnN1bWVfdG9rZW4oIHRva2VuICkKKyAgICBAbGFzdF90b2tlbiA9IHRva2VuCisgIGVuZAorCisgIGRlZiBpbl9kZWNpc2lvbj8KKyAgICByZXR1cm4oIEBkZWNpc2lvbl9sZXZlbCA+IDAgKQorICBlbmQKKyAgCisgIGRlZiBjb25zdW1lX2hpZGRlbl90b2tlbiggdG9rZW4gKQorICAgIEBsYXN0X3Rva2VuID0gdG9rZW4KKyAgZW5kCisKKyAgZGVmIGxvb2soIGksIHRva2VuICkKKyAgICBpbl9kZWNpc2lvbj8gb3IgcmV0dXJuCisgICAgc3RhcnRpbmdfaW5kZXggPSBsb29rX3N0YWNrLmxhc3QKKyAgICBpbnB1dCA9IEBwYXJzZXIuaW5wdXQKKyAgICB0aGlzX3JlZl9pbmRleCA9IGlucHV0LmluZGV4CisgICAgbnVtX2hpZGRlbiA9IGlucHV0LnRva2Vucyggc3RhcnRpbmdfaW5kZXgsIHRoaXNfcmVmX2luZGV4ICkuY291bnQgeyB8dHwgdC5oaWRkZW4/IH0KKyAgICBkZXB0aCA9IGkgKyB0aGlzX3JlZl9pbmRleCAtIHN0YXJ0aW5nX2luZGV4IC0gbnVtX2hpZGRlbgorICAgIGlmIGRlcHRoID4gQGRlY2lzaW9uX2xvb2sKKyAgICAgIEBkZWNpc2lvbl9sb29rID0gZGVwdGgKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgZW5kX2JhY2t0cmFjayggbGV2ZWwsIHN1Y2Nlc3NmdWwgKQorICAgIEBwcm9maWxlLnN5bnRhY3RpY19wcmVkaWNhdGVfbG9va3MgPDwgQGRlY2lzaW9uX2xvb2sKKyAgZW5kCisgIAorICBkZWYgcmVjb2duaXRpb25fZXhjZXB0aW9uKCBlcnJvciApCisgICAgQHByb2ZpbGUucmVwb3J0ZWRfZXJyb3JzICs9IDEKKyAgZW5kCisgIAorICBkZWYgc2VtYW50aWNfcHJlZGljYXRlKCByZXN1bHQsIHByZWRpY2F0ZSApCisgICAgaW5fZGVjaXNpb24/IGFuZCBAcHJvZmlsZS5zZW1hbnRpY19wcmVkaWNhdGVzICs9IDEKKyAgZW5kCisgIAorICBkZWYgdGVybWluYXRlCisgICAgaW5wdXQgPSBAcGFyc2VyLmlucHV0CisgICAgaGlkZGVuX3Rva2VucyA9IGlucHV0LnNlbGVjdCB7IHx0b2tlbnwgdG9rZW4uaGlkZGVuPyB9CisgICAgQHByb2ZpbGUuaGlkZGVuX3Rva2VucyA9IGhpZGRlbl90b2tlbnMubGVuZ3RoCisgICAgQHByb2ZpbGUudG9rZW5zID0gaW5wdXQudG9rZW5zLmxlbmd0aAorICAgIEBwcm9maWxlLmhpZGRlbl9jaGFyYWN0ZXJzX21hdGNoZWQgPSBoaWRkZW5fdG9rZW5zLmluamVjdCggMCApIGRvIHxjb3VudCwgdG9rZW58CisgICAgICBjb3VudCArIHRva2VuLnRleHQubGVuZ3RoIHJlc2N1ZSBjb3VudAorICAgIGVuZAorICAgIEBwcm9maWxlLmNoYXJhY3RlcnNfbWF0Y2hlZCA9ICggQGxhc3RfdG9rZW4gfHwgaW5wdXQudG9rZW5zLmxhc3QgKS5zdG9wICsgMSByZXNjdWUgMAorICAgIHdyaXRlX3JlcG9ydAorICBlbmQKKyAgCisgIAorICBkZWYgd3JpdGVfcmVwb3J0CisgICAgQG91dHB1dCA8PCBAcHJvZmlsZS5nZW5lcmF0ZV9yZXBvcnQgdW5sZXNzIEBvdXRwdXQubmlsPworICByZXNjdWUgTm9NZXRob2RFcnJvciA9PiBlcnJvcgorICAgIGlmIGVycm9yLm5hbWUudG9fcyA9PSAnPDwnCisgICAgICB3YXJuKCA8PC1FTkQuc3RyaXAhICUgWyBfX0ZJTEVfXywgX19MSU5FX18sIEBvdXRwdXQgXSApCisgICAgICAgIFslcyBAICVzXTogZmFpbGVkIHRvIHdyaXRlIHJlcG9ydCB0byAlcCBhcyBpdCBkb2VzIG5vdCByZXNwb25kIHRvIDo8PAorICAgICAgRU5ECisgICAgZWxzZSByYWlzZQorICAgIGVuZAorICByZXNjdWUgSU9FcnJvciA9PiBlcnJvcgorICAgICRzdGRlcnIucHV0cyggVXRpbC50aWR5KCA8PC1FTkQgKSAlIFsgX19GSUxFX18sIF9fTElORV9fLCBAb3V0cHV0LCBlcnJvci5jbGFzcywgZXJyb3IubWVzc2FnZSBdICkKKyAgICB8IFslcyBAICVzXTogZmFpbGVkIHRvIHdyaXRlIHByb2ZpbGUgcmVwb3J0IHRvICVwIGR1ZSB0byBhbiBJTyBFcnJvcjoKKyAgICB8ICAgJXM6ICVzCisgICAgRU5ECisgICAgJHN0ZGVyci5wdXRzKCBlcnJvci5iYWNrdHJhY2UubWFwIHsgfGNhbGx8ICIgIC0gI3sgY2FsbCB9IiB9LmpvaW4oICJcbiIgKSApCisgIGVuZAorICAKKyAgZGVmIHJlcG9ydAorICAgIEBwcm9maWxlLmdlbmVyYXRlX3JlcG9ydAorICBlbmQKKyAgCisgIGFsaWFzIHRvX3MgcmVwb3J0CitlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvcmVjb2duaXplcnMucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvcmVjb2duaXplcnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0ZjhkYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9yZWNvZ25pemVycy5yYgpAQCAtMCwwICsxLDEzNTEgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKK21vZHVsZSBBTlRMUjMKK3VubGVzcyBjb25zdF9kZWZpbmVkPyggOlJlY29nbml6ZXJTaGFyZWRTdGF0ZSApCisKK1JlY29nbml6ZXJTaGFyZWRTdGF0ZSA9IFN0cnVjdC5uZXcoIAorICA6Zm9sbG93aW5nLAorICA6ZXJyb3JfcmVjb3ZlcnksCisgIDpsYXN0X2Vycm9yX2luZGV4LAorICA6YmFja3RyYWNraW5nLAorICA6cnVsZV9tZW1vcnksCisgIDpzeW50YXhfZXJyb3JzLAorICA6dG9rZW4sCisgIDp0b2tlbl9zdGFydF9wb3NpdGlvbiwKKyAgOnRva2VuX3N0YXJ0X2xpbmUsCisgIDp0b2tlbl9zdGFydF9jb2x1bW4sCisgIDpjaGFubmVsLAorICA6dHlwZSwKKyAgOnRleHQKKykKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpSZWNvZ25pemVyU2hhcmVkU3RhdGUKKworQSBiaWcgU3RydWN0LWJhc2VkIGNsYXNzIGNvbnRhaW5pbmcgbW9zdCBvZiB0aGUgZGF0YSB0aGF0IG1ha2VzIHVwIGEKK3JlY29nbml6ZXIncyBzdGF0ZS4gVGhlc2UgYXR0cmlidXRlcyBhcmUgZXh0ZXJuYWxpemVkIGZyb20gdGhlIHJlY29nbml6ZXIgaXRzZWxmCitzbyB0aGF0IHJlY29nbml6ZXIgZGVsZWdhdGlvbiAod2hpY2ggb2NjdXJzIHdoZW4geW91IGltcG9ydCBvdGhlciBncmFtbWFycyBpbnRvCit5b3VyIGdyYW1tYXIpIGNhbiBmdW5jdGlvbjsgbXVsdGlwbGUgcmVjb2duaXplcnMgY2FuIHNoYXJlIGEgY29tbW9uIHN0YXRlLgorCis9PSBTdHJ1Y3R1cmUgQXR0cmlidXRlcworCitmb2xsb3dpbmc6OgorICBhIHN0YWNrIHRoYXQgdHJhY2tzIGZvbGxvdyBzZXRzIGZvciBlcnJvciByZWNvdmVyeQorZXJyb3JfcmVjb3Zlcnk6OgorICBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjb2duaXplciBpcyBpbiBlcnJvciByZWNvdmVyeSBtb2RlCitsYXN0X2Vycm9yX2luZGV4OjoKKyAgdGhlIGluZGV4IGluIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIGxhc3QgZXJyb3IKK2JhY2t0cmFja2luZzo6CisgIHRyYWNrcyB0aGUgYmFja3RyYWNraW5nIGRlcHRoCitydWxlX21lbW9yeTo6CisgIGlmIGEgZ3JhbW1hciBpcyBjb21waWxlZCB3aXRoIHRoZSBtZW1vaXphdGlvbiBvcHRpb24sIHRoaXMgd2lsbCBiZSAKKyAgc2V0IHRvIGEgaGFzaCBtYXBwaW5nIHByZXZpb3VzbHkgcGFyc2VkIHJ1bGVzIHRvIGNhY2hlZCBpbmRpY2VzCitzeW50YXhfZXJyb3JzOjoKKyAgdHJhY2tzIHRoZSBudW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzZWVuIHNvIGZhcgordG9rZW46OgorICBob2xkcyBuZXdseSBjb25zdHJ1Y3RlZCB0b2tlbnMgZm9yIGxleGVyIHJ1bGVzCit0b2tlbl9zdGFydF9wb3NpdGlvbjo6CisgIHRoZSBpbnB1dCBzdHJlYW0gaW5kZXggYXQgd2hpY2ggdGhlIHRva2VuIHN0YXJ0cwordG9rZW5fc3RhcnRfbGluZTo6CisgIHRoZSBpbnB1dCBzdHJlYW0gbGluZSBudW1iZXIgYXQgd2hpY2ggdGhlIHRva2VuIHN0YXJ0cwordG9rZW5fc3RhcnRfY29sdW1uOjoKKyAgdGhlIGlucHV0IHN0cmVhbSBjb2x1bW4gYXQgd2hpY2ggdGhlIHRva2VuIHN0YXJ0cworY2hhbm5lbDo6CisgIHRoZSBjaGFubmVsIHZhbHVlIG9mIHRoZSB0YXJnZXQgdG9rZW4KK3R5cGU6OgorICB0aGUgdHlwZSB2YWx1ZSBvZiB0aGUgdGFyZ2V0IHRva2VuCit0ZXh0OjoKKyAgdGhlIHRleHQgb2YgdGhlIHRhcmdldCB0b2tlbgorCis9ZW5kCisKK2NsYXNzIFJlY29nbml6ZXJTaGFyZWRTdGF0ZQorICBkZWYgaW5pdGlhbGl6ZQorICAgIHN1cGVyKCBbXSwgZmFsc2UsIC0xLCAwLCBuaWwsIDAsIG5pbCwgLTEgKQorICAgICMgXi0tIHNhbWUgYXMgdGhpcyAtLXYgCisgICAgIyBzZWxmLmZvbGxvd2luZyA9IFtdCisgICAgIyBzZWxmLmVycm9yX3JlY292ZXJ5ID0gZmFsc2UKKyAgICAjIHNlbGYubGFzdF9lcnJvcl9pbmRleCA9IC0xCisgICAgIyBzZWxmLmJhY2t0cmFja2luZyA9IDAKKyAgICAjIHNlbGYuc3ludGF4X2Vycm9ycyA9IDAKKyAgICAjIHNlbGYudG9rZW5fc3RhcnRfcG9zaXRpb24gPSAtMQorICBlbmQKKyAgCisgIAorICAjIHJlc3RvcmVzIGFsbCBvZiB0aGUgc3RhdGUgdmFyaWFibGVzIHRvIHRoZWlyIHJlc3BlY3RpdmUKKyAgIyBpbml0aWFsIGRlZmF1bHQgdmFsdWVzCisgIGRlZiByZXNldCEKKyAgICBzZWxmLmZvbGxvd2luZy5jbGVhcgorICAgIHNlbGYuZXJyb3JfcmVjb3ZlcnkgPSBmYWxzZQorICAgIHNlbGYubGFzdF9lcnJvcl9pbmRleCA9IC0xCisgICAgc2VsZi5iYWNrdHJhY2tpbmcgPSAwCisgICAgc2VsZi5ydWxlX21lbW9yeSBhbmQgcnVsZV9tZW1vcnkuY2xlYXIKKyAgICBzZWxmLnN5bnRheF9lcnJvcnMgPSAwCisgICAgc2VsZi50b2tlbiA9IG5pbAorICAgIHNlbGYudG9rZW5fc3RhcnRfcG9zaXRpb24gPSAtMQorICAgIHNlbGYudG9rZW5fc3RhcnRfbGluZSA9IG5pbAorICAgIHNlbGYudG9rZW5fc3RhcnRfY29sdW1uID0gbmlsCisgICAgc2VsZi5jaGFubmVsID0gbmlsCisgICAgc2VsZi50eXBlID0gbmlsCisgICAgc2VsZi50ZXh0ID0gbmlsCisgIGVuZAorZW5kCisKK2VuZCAjIHVubGVzcyBjb25zdF9kZWZpbmVkPyggOlJlY29nbml6ZXJTaGFyZWRTdGF0ZSApCisKKz1iZWdpbiByZG9jIEFOVExSMzo6UmVjb2duaXplcgorCis9IFNjb3BlCisKK1Njb3BlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGluc3RhbmNlcyBvZiBBTlRMUidzIHZhcmlvdXMgYXR0cmlidXRlIHNjb3Blcy4KK0l0IGlzIGlkZW50aWNhbCB0byBSdWJ5J3MgYnVpbHQtaW4gU3RydWN0IGNsYXNzLCBidXQgaXQgdGFrZXMgc3RyaW5nCithdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGZyb20gdGhlIEFOVExSIGdyYW1tYXIgYXMgcGFyYW1ldGVycywgYW5kIG92ZXJyaWRlcwordGhlICNpbml0aWFsaXplIG1ldGhvZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGlmIGFueSBhcmUgcHJlc2VudCBpbgordGhlIHNjb3BlIGRlY2xhcmF0aW9uLgorCisgIEJsb2NrID0gU2NvcGUubmV3KCAibmFtZSIsICJkZXB0aCA9IDAiLCAidmFyaWFibGVzID0ge30iICkKKyAgQmxvY2submV3ICAgICAgICAgICAgICAgICAgICAjID0+ICM8c3RydWN0IEJsb2NrIG5hbWU9bmlsLCBkZXB0aD0wLCB2YXJpYWJsZXM9e30+CisgIEJsb2NrLm5ldyggImZ1bmN0aW9uIiApICAgICAgIyA9PiAjPHN0cnVjdCBCbG9jayBuYW1lPSJmdW5jdGlvbiIsIGRlcHRoPTAsIHZhcmlhYmxlcz17fT4KKyAgQmxvY2submV3KCAnYScsIDEsIDp4ID0+IDMgKSAjID0+ICM8c3RydWN0IEJsb2NrIG5hbWU9ImEiLCBkZXB0aD0xLCB2YXJpYWJsZXM9eyA6eCA9PiAzIH0+CisKKz1lbmQKKworY2xhc3MgU2NvcGUgPCA6OlN0cnVjdAorICBkZWYgc2VsZi5uZXcoICpkZWNsYXJhdGlvbnMsICZib2R5ICkKKyAgICBuYW1lcyA9IFtdCisgICAgZGVmYXVsdHMgPSB7fQorICAgIGZvciBkZWNsIGluIGRlY2xhcmF0aW9ucworICAgICAgbmFtZSwgZGVmYXVsdCA9IGRlY2wudG9fcy5zcGxpdCggL1xzKj1ccyovLCAyICkKKyAgICAgIG5hbWVzIDw8ICggbmFtZSA9IG5hbWUudG9fc3ltICkKKyAgICAgIGRlZmF1bHQgYW5kIGRlZmF1bHRzWyBuYW1lIF0gPSBkZWZhdWx0CisgICAgZW5kCisgICAgc3VwZXIoICpuYW1lcyApIGRvCisgICAgICAKKyAgICAgICMgSWYgbm8gZGVmYXVsdHMsIGxlYXZlIHRoZSBpbml0aWFsaXplIG1ldGhvZCB0aGUgc2FtZSBhcworICAgICAgIyB0aGUgc3RydWN0J3MgZGVmYXVsdCBpbml0aWFsaXplIGZvciBzcGVlZC4gT3RoZXJ3aXNlLAorICAgICAgIyBvdmVyd3JpdGUgdGhlIGluaXRpYWxpemUgdG8gcG9wdWxhdGUgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgIHVubGVzcyBkZWZhdWx0cy5lbXB0eT8KKyAgICAgICAgcGFyYW1ldGVycyA9IG5hbWVzLm1hcCBkbyB8IG5hbWUgfAorICAgICAgICAgICIjeyBuYW1lIH0gPSAiIDw8IGRlZmF1bHRzLmZldGNoKCBuYW1lLCAnbmlsJyApCisgICAgICAgIGVuZC5qb2luKCAnLCAnICkKKyAgICAgICAgY2xhc3NfZXZhbCggPDwtRU5EICkKKyAgICAgICAgICBkZWYgaW5pdGlhbGl6ZSggI3sgcGFyYW1ldGVycyB9ICkKKyAgICAgICAgICAgIHN1cGVyKCAjeyBuYW1lcy5qb2luKCAnLCAnICkgfSApCisgICAgICAgICAgZW5kCisgICAgICAgIEVORAorICAgICAgZW5kCisgICAgICAKKyAgICAgIGJvZHkgYW5kIGNsYXNzX2V2YWwoICZib2R5ICkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpSZWNvZ25pemVyCisKKz0gUmVjb2duaXplcgorCitBcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgQU5UTFItZ2VuZXJhdGVkIHJlY29nbml6ZXJzLCBSZWNvZ25pemVyIHByb3ZpZGVzCittdWNoIG9mIHRoZSBzaGFyZWQgZnVuY3Rpb25hbGl0eSBhbmQgc3RydWN0dXJlIHVzZWQgaW4gdGhlIHJlY29nbml0aW9uIHByb2Nlc3MuCitGb3IgYWxsIGVmZmVjdGl2ZSBwdXJwb3NlcywgdGhlIGNsYXNzIGFuZCBpdHMgaW1tZWRpYXRlIHN1YmNsYXNzZXMgTGV4ZXIsCitQYXJzZXIsIGFuZCBUcmVlUGFyc2VyIGFyZSBhYnN0cmFjdCBjbGFzc2VzLiBUaGV5IGNhbiBiZSBpbnN0YW50aWF0ZWQsIGJ1dAordGhleSdyZSBwcmV0dHkgdXNlbGVzcyBvbiB0aGVpciBvd24uIEluc3RlYWQsIHRvIG1ha2UgdXNlZnVsIGNvZGUsIHlvdSB3cml0ZSBhbgorQU5UTFIgZ3JhbW1hciBhbmQgQU5UTFIgd2lsbCBnZW5lcmF0ZSBjbGFzc2VzIHdoaWNoIGluaGVyaXQgZnJvbSBvbmUgb2YgdGhlCityZWNvZ25pemVyIGJhc2UgY2xhc3NlcywgcHJvdmlkaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3JhbW1hciBydWxlcworaXRzZWxmLiB0aGlzIGdyb3VwIG9mIGNsYXNzZXMgdG8gaW1wbGVtZW50IG5lY2Vzc2FyeSB0YXNrcy4gUmVjb2duaXplcgorZGVmaW5lcyBtZXRob2RzIHJlbGF0ZWQgdG86CisKKyogdG9rZW4gYW5kIGNoYXJhY3RlciBtYXRjaGluZworKiBwcmVkaWN0aW9uIGFuZCByZWNvZ25pdGlvbiBzdHJhdGVneQorKiByZWNvdmVyaW5nIGZyb20gZXJyb3JzCisqIHJlcG9ydGluZyBlcnJvcnMKKyogbWVtb2l6YXRpb24KKyogc2ltcGxlIHJ1bGUgdHJhY2luZyBhbmQgZGVidWdnaW5nCisKKz1lbmQKKworY2xhc3MgUmVjb2duaXplcgorICBpbmNsdWRlIENvbnN0YW50cworICBpbmNsdWRlIEVycm9yCisgIGluY2x1ZGUgVG9rZW5GYWN0b3J5CisgIGV4dGVuZCBDbGFzc01hY3JvcworICAKKyAgQHJ1bGVzID0ge30KKyAgCisgICMgaW5oZXJpdGVkIGNsYXNzIG1ldGhvZHMgYW5kIGhvb2tzCisgIGNsYXNzIDw8IHNlbGYKKyAgICBhdHRyX3JlYWRlciA6Z3JhbW1hcl9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgOmFudGxyX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgOmFudGxyX3ZlcnNpb25fc3RyaW5nLAorICAgICAgICAgICAgICAgIDpsaWJyYXJ5X3ZlcnNpb25fc3RyaW5nLAorICAgICAgICAgICAgICAgIDpncmFtbWFyX2hvbWUKKyAgICAKKyAgICBhdHRyX2FjY2Vzc29yIDp0b2tlbl9zY2hlbWUsIDpkZWZhdWx0X3J1bGUKKyAgICAKKyAgICAjIGdlbmVyYXRlZCByZWNvZ25pemVyIGNvZGUgdXNlcyB0aGlzIG1ldGhvZCB0byBzdGFtcAorICAgICMgdGhlIGNvZGUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZ3JhbW1hciBmaWxlIGFuZAorICAgICMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBTlRMUiBiZWluZyB1c2VkIHRvIGdlbmVyYXRlCisgICAgIyB0aGUgY29kZQorICAgIGRlZiBnZW5lcmF0ZWRfdXNpbmcoIGdyYW1tYXJfZmlsZSwgYW50bHJfdmVyc2lvbiwgbGlicmFyeV92ZXJzaW9uID0gbmlsICkKKyAgICAgIEBncmFtbWFyX2ZpbGVfbmFtZSA9IGdyYW1tYXJfZmlsZS5mcmVlemUKKyAgICAgIEBhbnRscl92ZXJzaW9uX3N0cmluZyA9IGFudGxyX3ZlcnNpb24uZnJlZXplCisgICAgICBAbGlicmFyeV92ZXJzaW9uID0gVXRpbC5wYXJzZV92ZXJzaW9uKCBsaWJyYXJ5X3ZlcnNpb24gKQorICAgICAgaWYgQGFudGxyX3ZlcnNpb25fc3RyaW5nID1+IC9eKFxkKylcLihcZCspKD86XC4oXGQrKSg/OmIoXGQrKSk/KT8oLiopJC8KKyAgICAgICAgQGFudGxyX3ZlcnNpb24gPSBbICQxLCAkMiwgJDMsICQ0IF0ubWFwISB7IHxzdHJ8IHN0ci50b19pIH0KKyAgICAgICAgdGltZXN0YW1wID0gJDUuc3RyaXAKKyAgICAgICAgI0BhbnRscl9yZWxlYXNlX3RpbWUgPSAkNS5lbXB0eT8gPyBuaWwgOiBUaW1lLnBhcnNlKCQ1KQorICAgICAgZWxzZQorICAgICAgICByYWlzZSAiYmFkIHZlcnNpb24gc3RyaW5nOiAlcCIgJSB2ZXJzaW9uX3N0cmluZworICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgIyB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdlbmVyYXRlIHJldHVybi12YWx1ZSBzdHJ1Y3R1cmVzIGZvcgorICAgICMgcnVsZXMgd2l0aCBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLiBUbyBhdm9pZCBnZW5lcmF0aW5nCisgICAgIyBhIHNwZWNpYWwgY2xhc3MgZm9yIGV2ZXIgcnVsZSBpbiBBU1QgcGFyc2VycyBhbmQgc3VjaAorICAgICMgKHdoZXJlIG1vc3QgcnVsZXMgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0IHNldCBvZiByZXR1cm4gdmFsdWVzKSwKKyAgICAjIGVhY2ggcmVjb2duaXplciBnZXRzIGEgZGVmYXVsdCByZXR1cm4gdmFsdWUgc3RydWN0dXJlCisgICAgIyBhc3NpZ25lZCB0byB0aGUgY29uc3RhbnQgK1JldHVybisuIFJ1bGVzIHdoaWNoIGRvbid0CisgICAgIyByZXF1aXJlIGFkZGl0aW9uYWwgY3VzdG9tIG1lbWJlcnMgd2lsbCBoYXZlIGEgcnVsZS1yZXR1cm4KKyAgICAjIG5hbWUgY29uc3RhbnQgdGhhdCBqdXN0IHBvaW50cyB0byB0aGUgZ2VuZXJpYyByZXR1cm4KKyAgICAjIHZhbHVlLiAKKyAgICBkZWYgZGVmaW5lX3JldHVybl9zY29wZSggKm1lbWJlcnMgKQorICAgICAgaWYgbWVtYmVycy5lbXB0eT8gdGhlbiBnZW5lcmljX3JldHVybl9zY29wZQorICAgICAgZWxzZQorICAgICAgICBtZW1iZXJzICs9IHJldHVybl9zY29wZV9tZW1iZXJzCisgICAgICAgIFN0cnVjdC5uZXcoICptZW1iZXJzICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgICMgdXNlZCBhcyBhIGhvb2sgdG8gYWRkIGFkZGl0aW9uYWwgZGVmYXVsdCBtZW1iZXJzCisgICAgIyB0byBkZWZhdWx0IHJldHVybiB2YWx1ZSBzdHJ1Y3R1cmVzCisgICAgIyBGb3IgZXhhbXBsZSwgYWxsIEFTVC1idWlsZGluZyBwYXJzZXJzIG92ZXJyaWRlCisgICAgIyB0aGlzIG1ldGhvZCB0byBhZGQgYW4gZXh0cmEgKzp0cmVlKyBmaWVsZCB0bworICAgICMgYWxsIHJ1bGUgcmV0dXJuIHN0cnVjdHVyZXMuCisgICAgZGVmIHJldHVybl9zY29wZV9tZW1iZXJzCisgICAgICBbIDpzdGFydCwgOnN0b3AgXQorICAgIGVuZAorICAgIAorICAgICMgc2V0cyB1cCBhbmQgcmV0dXJucyB0aGUgZ2VuZXJpYyBydWxlIHJldHVybgorICAgICMgc2NvcGUgZm9yIGEgcmVjb2duaXplcgorICAgIGRlZiBnZW5lcmljX3JldHVybl9zY29wZQorICAgICAgQGdlbmVyaWNfcmV0dXJuX3Njb3BlIHx8PSBiZWdpbgorICAgICAgICBzdHJ1Y3QgPSBTdHJ1Y3QubmV3KCAqcmV0dXJuX3Njb3BlX21lbWJlcnMgKQorICAgICAgICBjb25zdF9zZXQoIDpSZXR1cm4sIHN0cnVjdCApCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgaW1wb3J0ZWRfZ3JhbW1hcnMKKyAgICAgIEBpbXBvcnRlZF9ncmFtbWFycyB8fD0gU2V0Lm5ldworICAgIGVuZAorICAgIAorICAgIGRlZiBtYXN0ZXJfZ3JhbW1hcnMKKyAgICAgIEBtYXN0ZXJfZ3JhbW1hcnMgfHw9IFtdCisgICAgZW5kCisgICAgCisgICAgZGVmIG1hc3RlcgorICAgICAgbWFzdGVyX2dyYW1tYXJzLmxhc3QKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgbWFzdGVycyggKmdyYW1tYXJfbmFtZXMgKQorICAgICAgZm9yIGdyYW1tYXIgaW4gZ3JhbW1hcl9uYW1lcworICAgICAgICB1bmxlc3MgbWFzdGVyX2dyYW1tYXJzLmluY2x1ZGU/KCBncmFtbWFyICkKKyAgICAgICAgICBtYXN0ZXJfZ3JhbW1hcnMgPDwgZ3JhbW1hcgorICAgICAgICAgIGF0dHJfcmVhZGVyKCBVdGlsLnNuYWtlX2Nhc2UoIGdyYW1tYXIgKSApCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgICAgcHJpdmF0ZSA6bWFzdGVycworICAgIAorICAgIGRlZiBpbXBvcnRzKCAqZ3JhbW1hcl9uYW1lcyApCisgICAgICBmb3IgZ3JhbW1hciBpbiBncmFtbWFyX25hbWVzCisgICAgICAgIGltcG9ydGVkX2dyYW1tYXJzLmFkZD8oIGdyYW1tYXIudG9fc3ltICkgYW5kCisgICAgICAgICAgYXR0cl9yZWFkZXIoIFV0aWwuc25ha2VfY2FzZSggZ3JhbW1hciApICkKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIGltcG9ydGVkX2dyYW1tYXJzCisgICAgZW5kCisgICAgcHJpdmF0ZSA6aW1wb3J0cworICAgIAorICAgIGRlZiBydWxlcworICAgICAgc2VsZjo6UlVMRV9NRVRIT0RTLmR1cCByZXNjdWUgW10KKyAgICBlbmQKKyAgICAKKyAgICBkZWYgZGVmYXVsdF9ydWxlCisgICAgICBAZGVmYXVsdF9ydWxlIHx8PSBydWxlcy5maXJzdAorICAgIGVuZAorICAgIAorICAgIGRlZiBkZWJ1Zz8KKyAgICAgIHJldHVybiBmYWxzZQorICAgIGVuZAorICAgIAorICAgIGRlZiBwcm9maWxlPworICAgICAgcmV0dXJuIGZhbHNlCisgICAgZW5kCisgICAgCisgICAgZGVmIFNjb3BlKCAqZGVjbGFyYXRpb25zLCAmYm9keSApCisgICAgICBTY29wZS5uZXcoICpkZWNsYXJhdGlvbnMsICZib2R5ICkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9rZW5fY2xhc3MKKyAgICAgIEB0b2tlbl9jbGFzcyB8fD0gYmVnaW4KKyAgICAgICAgc2VsZjo6VG9rZW4gICAgICAgICAgICByZXNjdWUKKyAgICAgICAgc3VwZXJjbGFzcy50b2tlbl9jbGFzcyByZXNjdWUKKyAgICAgICAgQU5UTFIzOjpDb21tb25Ub2tlbgorICAgICAgZW5kCisgICAgZW5kCisgICAgcHJpdmF0ZSA6Z2VuZXJhdGVkX3VzaW5nCisgIGVuZAorICAKKyAgQGdyYW1tYXJfZmlsZV9uYW1lID0gbmlsCisgIEBhbnRscl92ZXJzaW9uID0gQU5UTFIzOjpBTlRMUl9WRVJTSU9OCisgIEBhbnRscl92ZXJzaW9uX3N0cmluZyA9IEFOVExSMzo6QU5UTFJfVkVSU0lPTl9TVFJJTkcKKyAgCisgIGRlZiBncmFtbWFyX2ZpbGVfbmFtZQorICAgIHNlbGYuY2xhc3MuZ3JhbW1hcl9maWxlX25hbWUKKyAgZW5kCisgIAorICBkZWYgYW50bHJfdmVyc2lvbgorICAgIHNlbGYuY2xhc3MuYW50bHJfdmVyc2lvbgorICBlbmQKKyAgCisgIGRlZiBhbnRscl92ZXJzaW9uX3N0cmluZworICAgIHNlbGYuY2xhc3MuYW50bHJfdmVyc2lvbl9zdHJpbmcKKyAgZW5kCisgIAorICBhdHRyX2FjY2Vzc29yIDppbnB1dAorICBhdHRyX3JlYWRlciA6c3RhdGUKKyAgCisgIGRlZiBlYWNoX2RlbGVnYXRlCisgICAgYmxvY2tfZ2l2ZW4/IG9yIHJldHVybiBlbnVtX2ZvciggX19tZXRob2RfXyApCisgICAgZm9yIGdyYW1tYXIgaW4gc2VsZi5jbGFzcy5pbXBvcnRlZF9ncmFtbWFycworICAgICAgZGVsID0gX19zZW5kX18oIFV0aWwuc25ha2VfY2FzZSggZ3JhbW1hciApICkgYW5kCisgICAgICAgIHlpZWxkKCBkZWwgKQorICAgIGVuZAorICBlbmQKKyAgCisgICMgQ3JlYXRlIGEgbmV3IHJlY29nbml6ZXIuIFRoZSBjb25zdHJ1Y3RvciBzaW1wbHkgZW5zdXJlcyB0aGF0CisgICMgYWxsIHJlY29nbml6ZXJzIGFyZSBpbml0aWFsaXplZCB3aXRoIGEgc2hhcmVkIHN0YXRlIG9iamVjdC4KKyAgIyBTZWUgdGhlIG1haW4gcmVjb2duaXplciBzdWJjbGFzc2VzIGZvciBtb3JlIHNwZWNpZmljCisgICMgaW5mb3JtYXRpb24gYWJvdXQgY3JlYXRpbmcgcmVjb2duaXplciBvYmplY3RzIGxpa2UKKyAgIyBsZXhlcnMgYW5kIHBhcnNlcnMuCisgIGRlZiBpbml0aWFsaXplKCBvcHRpb25zID0ge30gKQorICAgIEBzdGF0ZSAgPSBvcHRpb25zWyA6c3RhdGUgXSB8fCBSZWNvZ25pemVyU2hhcmVkU3RhdGUubmV3CisgICAgQGVycm9yX291dHB1dCA9IG9wdGlvbnMuZmV0Y2goIDplcnJvcl9vdXRwdXQsICRzdGRlcnIgKQorICAgIGRlZmluZWQ/KCBAaW5wdXQgKSBvciBAaW5wdXQgPSBuaWwKKyAgICBpbml0aWFsaXplX2RmYXMKKyAgZW5kCisgIAorICAjIFJlc2V0cyB0aGUgcmVjb2duaXplcidzIHN0YXRlIGRhdGEgdG8gaW5pdGlhbCB2YWx1ZXMuCisgICMgQXMgYSByZXN1bHQsIGFsbCBlcnJvciB0cmFja2luZyBhbmQgZXJyb3IgcmVjb3ZlcnkKKyAgIyBkYXRhIGFjY3VtdWxhdGVkIGluIHRoZSBjdXJyZW50IHN0YXRlIHdpbGwgYmUgY2xlYXJlZC4KKyAgIyBJdCB3aWxsIGFsc28gYXR0ZW1wdCB0byByZXNldCB0aGUgaW5wdXQgc3RyZWFtCisgICMgdmlhIGlucHV0LnJlc2V0LCBidXQgaXQgaWdub3JlcyBhbnkgZXJyb3JzIHJlY2VpdmVkCisgICMgZnJvbSBkb2luZyBzby4gVGh1cyB0aGUgaW5wdXQgc3RyZWFtIGlzIG5vdCBndWFyZW50ZWVkCisgICMgdG8gYmUgcmV3b3VuZCB0byBpdHMgaW5pdGlhbCBwb3NpdGlvbgorICBkZWYgcmVzZXQKKyAgICBAc3RhdGUgYW5kIEBzdGF0ZS5yZXNldCEKKyAgICBAaW5wdXQgYW5kIEBpbnB1dC5yZXNldCByZXNjdWUgbmlsCisgIGVuZAorICAKKyAgIyBBdHRlbXB0IHRvIG1hdGNoIHRoZSBjdXJyZW50IGlucHV0IHN5bWJvbCB0aGUgdG9rZW4gdHlwZQorICAjIHNwZWNpZmllZCBieSArdHlwZSsuIElmIHRoZSBzeW1ib2wgbWF0Y2hlcyB0aGUgdHlwZSwKKyAgIyBjb25zdW1lIHRoZSBjdXJyZW50IHN5bWJvbCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4gSWYKKyAgIyB0aGUgc3ltYm9sIGRvZXNuJ3QgbWF0Y2gsIGF0dGVtcHQgdG8gdXNlIHRoZSBmb2xsb3ctc2V0CisgICMgZGF0YSBwcm92aWRlZCBieSArZm9sbG93KyB0byByZWNvdmVyIGZyb20gdGhlIG1pc21hdGNoZWQKKyAgIyB0b2tlbi4gCisgIGRlZiBtYXRjaCggdHlwZSwgZm9sbG93ICkKKyAgICBtYXRjaGVkX3N5bWJvbCA9IGN1cnJlbnRfc3ltYm9sCisgICAgaWYgQGlucHV0LnBlZWsgPT0gdHlwZQorICAgICAgQGlucHV0LmNvbnN1bWUKKyAgICAgIEBzdGF0ZS5lcnJvcl9yZWNvdmVyeSA9IGZhbHNlCisgICAgICByZXR1cm4gbWF0Y2hlZF9zeW1ib2wKKyAgICBlbmQKKyAgICByYWlzZSggQmFja3RyYWNraW5nRmFpbGVkICkgaWYgQHN0YXRlLmJhY2t0cmFja2luZyA+IDAKKyAgICByZXR1cm4gcmVjb3Zlcl9mcm9tX21pc21hdGNoZWRfdG9rZW4oIHR5cGUsIGZvbGxvdyApCisgIGVuZAorICAKKyAgIyBtYXRjaCBhbnl0aGluZyAtLSBpLmUuIHdpbGRjYXJkIG1hdGNoLiBTaW1wbHkgY29uc3VtZQorICAjIHRoZSBjdXJyZW50IHN5bWJvbCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIAorICBkZWYgbWF0Y2hfYW55CisgICAgQHN0YXRlLmVycm9yX3JlY292ZXJ5ID0gZmFsc2UKKyAgICBAaW5wdXQuY29uc3VtZQorICBlbmQKKyAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRXJyb3IgUmVwb3J0aW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgCisgICMgV2hlbiBhIHJlY29nbml0aW9uIGVycm9yIG9jY3VycywgdGhpcyBtZXRob2QgaXMgdGhlIG1haW4KKyAgIyBob29rIGZvciBjYXJyeWluZyBvdXQgdGhlIGVycm9yIHJlcG9ydGluZyBwcm9jZXNzLiBUaGUKKyAgIyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzICtkaXNwbGF5X3JlY29nbml0aW9uX2Vycm9yKworICAjIHRvIGRpc3BsYXkgdGhlIGVycm9yIGluZm8gb24gJHN0ZGVyci4gCisgIGRlZiByZXBvcnRfZXJyb3IoIGUgPSAkISApCisgICAgQHN0YXRlLmVycm9yX3JlY292ZXJ5IGFuZCByZXR1cm4KKyAgICBAc3RhdGUuc3ludGF4X2Vycm9ycyArPSAxCisgICAgQHN0YXRlLmVycm9yX3JlY292ZXJ5ID0gdHJ1ZQorICAgIGRpc3BsYXlfcmVjb2duaXRpb25fZXJyb3IoIGUgKQorICBlbmQKKyAgCisgICMgZXJyb3IgcmVwb3J0aW5nIGhvb2sgZm9yIHByZXNlbnRpbmcgdGhlIGluZm9ybWF0aW9uCisgICMgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYnVpbGRzIGFwcHJvcHJpYXRlIGVycm9yCisgICMgbWVzc2FnZSB0ZXh0IHVzaW5nICtlcnJvcl9oZWFkZXIrIGFuZCArZXJyb3JfbWVzc2FnZSssCisgICMgYW5kIGNhbGxzICtlbWl0X2Vycm9yX21lc3NhZ2UrIHRvIHdyaXRlIHRoZSBlcnJvcgorICAjIG1lc3NhZ2Ugb3V0IHRvIHNvbWUgc291cmNlCisgIGRlZiBkaXNwbGF5X3JlY29nbml0aW9uX2Vycm9yKCBlID0gJCEgKQorICAgIGhlYWRlciA9IGVycm9yX2hlYWRlciggZSApCisgICAgbWVzc2FnZSA9IGVycm9yX21lc3NhZ2UoIGUgKQorICAgIGVtaXRfZXJyb3JfbWVzc2FnZSggIiN7IGhlYWRlciB9ICN7IG1lc3NhZ2UgfSIgKQorICBlbmQKKyAgCisgICMgdXNlZCB0byBjb25zdHJ1Y3QgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQorICAjIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyB0eXBlIG9mIGVycm9yIGFuZCB0aGUKKyAgIyBlcnJvcidzIGF0dHJpYnV0ZXMKKyAgZGVmIGVycm9yX21lc3NhZ2UoIGUgPSAkISApCisgICAgY2FzZSBlCisgICAgd2hlbiBVbndhbnRlZFRva2VuCisgICAgICB0b2tlbl9uYW1lID0gdG9rZW5fbmFtZSggZS5leHBlY3RpbmcgKQorICAgICAgImV4dHJhbmVvdXMgaW5wdXQgI3sgdG9rZW5fZXJyb3JfZGlzcGxheSggZS51bmV4cGVjdGVkX3Rva2VuICkgfSBleHBlY3RpbmcgI3sgdG9rZW5fbmFtZSB9IgorICAgIHdoZW4gTWlzc2luZ1Rva2VuCisgICAgICB0b2tlbl9uYW1lID0gdG9rZW5fbmFtZSggZS5leHBlY3RpbmcgKQorICAgICAgIm1pc3NpbmcgI3sgdG9rZW5fbmFtZSB9IGF0ICN7IHRva2VuX2Vycm9yX2Rpc3BsYXkoIGUuc3ltYm9sICkgfSIKKyAgICB3aGVuIE1pc21hdGNoZWRUb2tlbgorICAgICAgdG9rZW5fbmFtZSA9IHRva2VuX25hbWUoIGUuZXhwZWN0aW5nICkKKyAgICAgICJtaXNtYXRjaGVkIGlucHV0ICN7IHRva2VuX2Vycm9yX2Rpc3BsYXkoIGUuc3ltYm9sICkgfSBleHBlY3RpbmcgI3sgdG9rZW5fbmFtZSB9IgorICAgIHdoZW4gTWlzbWF0Y2hlZFRyZWVOb2RlCisgICAgICB0b2tlbl9uYW1lID0gdG9rZW5fbmFtZSggZS5leHBlY3RpbmcgKQorICAgICAgIm1pc21hdGNoZWQgdHJlZSBub2RlOiAjeyBlLnN5bWJvbCB9IGV4cGVjdGluZyAjeyB0b2tlbl9uYW1lIH0iCisgICAgd2hlbiBOb1ZpYWJsZUFsdGVybmF0aXZlCisgICAgICAibm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICIgPDwgdG9rZW5fZXJyb3JfZGlzcGxheSggZS5zeW1ib2wgKQorICAgIHdoZW4gTWlzbWF0Y2hlZFNldAorICAgICAgIm1pc21hdGNoZWQgaW5wdXQgJXMgZXhwZWN0aW5nIHNldCAlcyIgJQorICAgICAgICBbIHRva2VuX2Vycm9yX2Rpc3BsYXkoIGUuc3ltYm9sICksIGUuZXhwZWN0aW5nLmluc3BlY3QgXQorICAgIHdoZW4gTWlzbWF0Y2hlZE5vdFNldAorICAgICAgIm1pc21hdGNoZWQgaW5wdXQgJXMgZXhwZWN0aW5nIHNldCAlcyIgJQorICAgICAgICBbIHRva2VuX2Vycm9yX2Rpc3BsYXkoIGUuc3ltYm9sICksIGUuZXhwZWN0aW5nLmluc3BlY3QgXQorICAgIHdoZW4gRmFpbGVkUHJlZGljYXRlCisgICAgICAicnVsZSAlcyBmYWlsZWQgcHJlZGljYXRlOiB7ICVzIH0/IiAlIFsgZS5ydWxlX25hbWUsIGUucHJlZGljYXRlX3RleHQgXQorICAgIGVsc2UgZS5tZXNzYWdlCisgICAgZW5kCisgIGVuZAorICAKKyAgIyAKKyAgIyB1c2VkIHRvIGFkZCBhIHRhZyB0byB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IGluZGljYXRlcworICAjIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5wdXQgc3RyZWFtIHdoZW4gdGhlIGVycm9yCisgICMgb2NjdXJyZWQKKyAgIyAKKyAgZGVmIGVycm9yX2hlYWRlciggZSA9ICQhICkKKyAgICBlLmxvY2F0aW9uCisgIGVuZAorICAKKyAgIyAKKyAgIyBmb3JtYXRzIGEgdG9rZW4gb2JqZWN0IGFwcHJvcHJpYXRlbHkgZm9yIGluc3BlY3Rpb24KKyAgIyB3aXRoaW4gYW4gZXJyb3IgbWVzc2FnZQorICAjIAorICBkZWYgdG9rZW5fZXJyb3JfZGlzcGxheSggdG9rZW4gKQorICAgIHVubGVzcyB0ZXh0ID0gdG9rZW4udGV4dCB8fCAoIHRva2VuLnNvdXJjZV90ZXh0IHJlc2N1ZSBuaWwgKQorICAgICAgdGV4dCA9CisgICAgICAgIGNhc2UKKyAgICAgICAgd2hlbiB0b2tlbi50eXBlID09IEVPRiB0aGVuICc8RU9GPicKKyAgICAgICAgd2hlbiBuYW1lID0gdG9rZW5fbmFtZSggdG9rZW4udHlwZSApIHJlc2N1ZSBuaWwgdGhlbiAiPCN7IG5hbWUgfT4iCisgICAgICAgIHdoZW4gdG9rZW4ucmVzcG9uZF90bz8oIDpuYW1lICkgdGhlbiAiPCN7IHRva2VuLm5hbWUgfT4iCisgICAgICAgIGVsc2UgIjwjeyB0b2tlbi50eXBlIH0+IgorICAgICAgICBlbmQKKyAgICBlbmQKKyAgICByZXR1cm4gdGV4dC5pbnNwZWN0CisgIGVuZAorICAKKyAgIyAKKyAgIyBXcml0ZSB0aGUgZXJyb3IgcmVwb3J0IGRhdGEgb3V0IHRvIHNvbWUgc291cmNlLiBCeSBkZWZhdWx0LAorICAjIHRoZSBlcnJvciBtZXNzYWdlIGlzIHdyaXR0ZW4gdG8gJHN0ZGVycgorICAjIAorICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKCBtZXNzYWdlICkKKyAgICBAZXJyb3Jfb3V0cHV0LnB1dHMoIG1lc3NhZ2UgKSBpZiBAZXJyb3Jfb3V0cHV0CisgIGVuZAorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFcnJvciBSZWNvdmVyeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgCisgIGRlZiByZWNvdmVyKCBlcnJvciA9ICQhICkKKyAgICBAc3RhdGUubGFzdF9lcnJvcl9pbmRleCA9PSBAaW5wdXQuaW5kZXggYW5kIEBpbnB1dC5jb25zdW1lCisgICAgQHN0YXRlLmxhc3RfZXJyb3JfaW5kZXggPSBAaW5wdXQuaW5kZXgKKyAgICAKKyAgICBmb2xsb3dfc2V0ID0gY29tcHV0ZV9lcnJvcl9yZWNvdmVyeV9zZXQKKyAgICAKKyAgICByZXN5bmMgeyBjb25zdW1lX3VudGlsKCBmb2xsb3dfc2V0ICkgfQorICBlbmQKKyAgCisgIGRlZiByZXN5bmMKKyAgICBiZWdpbl9yZXN5bmMKKyAgICByZXR1cm4oIHlpZWxkICkKKyAgZW5zdXJlCisgICAgZW5kX3Jlc3luYworICBlbmQKKyAgCisgICMgb3ZlcnJpZGFibGUgaG9vayBtZXRob2QgdGhhdCBpcyBleGVjdXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICMgcmVzeW5jaW5nIHByb2NlZHVyZSBpbiByZWNvdmVyCisgICMKKyAgIyBieSBkZWZhdWx0LCBpdCBkb2VzIG5vdGhpbmcKKyAgZGVmIGJlZ2luX3Jlc3luYworICAgICMgZG8gbm90aGluZworICBlbmQKKyAgCisgICMgb3ZlcnJpZGFibGUgaG9vayBtZXRob2QgdGhhdCBpcyBhZnRlciB0aGUgcmVzeW5jaW5nIHByb2NlZHVyZSBoYXMgY29tcGxldGVkCisgICMKKyAgIyBieSBkZWZhdWx0LCBpdCBkb2VzIG5vdGhpbmcKKyAgZGVmIGVuZF9yZXN5bmMKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisgIAorICAjIChUaGUgZm9sbG93aW5nIGV4cGxhbmF0aW9uIGhhcyBiZWVuIGxpZnRlZCBkaXJlY3RseSBmcm9tIHRoZQorICAjICBzb3VyY2UgY29kZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBBTlRMUiBKYXZhIHJ1bnRpbWUgbGlicmFyeSkKKyAgIyAKKyAgIyBDb21wdXRlIHRoZSBlcnJvciByZWNvdmVyeSBzZXQgZm9yIHRoZSBjdXJyZW50IHJ1bGUuICBEdXJpbmcKKyAgIyBydWxlIGludm9jYXRpb24sIHRoZSBwYXJzZXIgcHVzaGVzIHRoZSBzZXQgb2YgdG9rZW5zIHRoYXQgY2FuCisgICMgZm9sbG93IHRoYXQgcnVsZSByZWZlcmVuY2Ugb24gdGhlIHN0YWNrOyB0aGlzIGFtb3VudHMgdG8KKyAgIyBjb21wdXRpbmcgRklSU1Qgb2Ygd2hhdCBmb2xsb3dzIHRoZSBydWxlIHJlZmVyZW5jZSBpbiB0aGUKKyAgIyBlbmNsb3NpbmcgcnVsZS4gVGhpcyBsb2NhbCBmb2xsb3cgc2V0IG9ubHkgaW5jbHVkZXMgdG9rZW5zCisgICMgZnJvbSB3aXRoaW4gdGhlIHJ1bGU7IGkuZS4sIHRoZSBGSVJTVCBjb21wdXRhdGlvbiBkb25lIGJ5CisgICMgQU5UTFIgc3RvcHMgYXQgdGhlIGVuZCBvZiBhIHJ1bGUuCisgICMgCisgICMgRVhBTVBMRQorICAjIAorICAjIFdoZW4geW91IGZpbmQgYSAibm8gdmlhYmxlIGFsdCBleGNlcHRpb24iLCB0aGUgaW5wdXQgaXMgbm90CisgICMgY29uc2lzdGVudCB3aXRoIGFueSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGZvciBydWxlIHIuICBUaGUgYmVzdAorICAjIHRoaW5nIHRvIGRvIGlzIHRvIGNvbnN1bWUgdG9rZW5zIHVudGlsIHlvdSBzZWUgc29tZXRoaW5nIHRoYXQKKyAgIyBjYW4gbGVnYWxseSBmb2xsb3cgYSBjYWxsIHRvIHIgKm9yKiBhbnkgcnVsZSB0aGF0IGNhbGxlZCByLgorICAjIFlvdSBkb24ndCB3YW50IHRoZSBleGFjdCBzZXQgb2YgdmlhYmxlIG5leHQgdG9rZW5zIGJlY2F1c2UgdGhlCisgICMgaW5wdXQgbWlnaHQganVzdCBiZSBtaXNzaW5nIGEgdG9rZW4tLXlvdSBtaWdodCBjb25zdW1lIHRoZQorICAjIHJlc3Qgb2YgdGhlIGlucHV0IGxvb2tpbmcgZm9yIG9uZSBvZiB0aGUgbWlzc2luZyB0b2tlbnMuCisgICMgCisgICMgQ29uc2lkZXIgZ3JhbW1hcjoKKyAgIyAKKyAgIyAgIGEgOiAnWycgYiAnXScKKyAgIyAgICAgfCAnKCcgYiAnKScKKyAgIyAgICAgOworICAjICAgYiA6IGMgJ14nIElOVCA7CisgICMgICBjIDogSUQKKyAgIyAgICAgfCBJTlQKKyAgIyAgICAgOworICAjIAorICAjIEF0IGVhY2ggcnVsZSBpbnZvY2F0aW9uLCB0aGUgc2V0IG9mIHRva2VucyB0aGF0IGNvdWxkIGZvbGxvdworICAjIHRoYXQgcnVsZSBpcyBwdXNoZWQgb24gYSBzdGFjay4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzICJsb2NhbCIKKyAgIyBmb2xsb3cgc2V0czoKKyAgIyAKKyAgIyAgIEZPTExPVyggYjFfaW5fYSApID0gRklSU1QoICddJyApID0gJ10nCisgICMgICBGT0xMT1coIGIyX2luX2EgKSA9IEZJUlNUKCAnKScgKSA9ICcpJworICAjICAgRk9MTE9XKCBjX2luX2IgKSA9IEZJUlNUKCAnXicgKSA9ICdeJworICAjIAorICAjIFVwb24gZXJyb25lb3VzIGlucHV0ICJbXSIsIHRoZSBjYWxsIGNoYWluIGlzCisgICMgCisgICMgICBhIC0+IGIgLT4gYworICAjIAorICAjIGFuZCwgaGVuY2UsIHRoZSBmb2xsb3cgY29udGV4dCBzdGFjayBpczoKKyAgIyAKKyAgIyAgIGRlcHRoICBsb2NhbCBmb2xsb3cgc2V0ICAgICBhZnRlciBjYWxsIHRvIHJ1bGUKKyAgIyAgICAgMCAgICAgICAgIFw8RU9GPiAgICAgICAgICAgICAgICAgICBhIChmcm9tIG1haW4oICkgKQorICAjICAgICAxICAgICAgICAgICddJyAgICAgICAgICAgICAgICAgICAgIGIKKyAgIyAgICAgMyAgICAgICAgICAnXicgICAgICAgICAgICAgICAgICAgICBjCisgICMgCisgICMgTm90aWNlIHRoYXQgPHR0PicpJzwvdHQ+IGlzIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSBiIHdvdWxkIGhhdmUgdG8gaGF2ZQorICAjIGJlZW4gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgY29udGV4dCBpbiBydWxlIGEgZm9yICcpJyB0byBiZQorICAjIGluY2x1ZGVkLgorICAjIAorICAjIEZvciBlcnJvciByZWNvdmVyeSwgd2UgY2Fubm90IGNvbnNpZGVyIEZPTExPVyhjKQorICAjIChjb250ZXh0LXNlbnNpdGl2ZSBvciBvdGhlcndpc2UpLiAgV2UgbmVlZCB0aGUgY29tYmluZWQgc2V0IG9mCisgICMgYWxsIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPVyBzZXRzLS10aGUgc2V0IG9mIGFsbCB0b2tlbnMgdGhhdAorICAjIGNvdWxkIGZvbGxvdyBhbnkgcmVmZXJlbmNlIGluIHRoZSBjYWxsIGNoYWluLiAgV2UgbmVlZCB0bworICAjIHJlc3luYyB0byBvbmUgb2YgdGhvc2UgdG9rZW5zLiAgTm90ZSB0aGF0IEZPTExPVyhjKT0nXicgYW5kIGlmCisgICMgd2UgcmVzeW5jJ2QgdG8gdGhhdCB0b2tlbiwgd2UnZCBjb25zdW1lIHVudGlsIEVPRi4gIFdlIG5lZWQgdG8KKyAgIyBzeW5jIHRvIGNvbnRleHQtc2Vuc2l0aXZlIEZPTExPV3MgZm9yIGEsIGIsIGFuZCBjOiB7J10nLCdeJ30uCisgICMgSW4gdGhpcyBjYXNlLCBmb3IgaW5wdXQgIltdIiwgTEEoMSkgaXMgaW4gdGhpcyBzZXQgc28gd2Ugd291bGQKKyAgIyBub3QgY29uc3VtZSBhbnl0aGluZyBhbmQgYWZ0ZXIgcHJpbnRpbmcgYW4gZXJyb3IgcnVsZSBjIHdvdWxkCisgICMgcmV0dXJuIG5vcm1hbGx5LiAgSXQgd291bGQgbm90IGZpbmQgdGhlIHJlcXVpcmVkICdeJyB0aG91Z2guCisgICMgQXQgdGhpcyBwb2ludCwgaXQgZ2V0cyBhIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IgYW5kIHRocm93cyBhbgorICAjIGV4Y2VwdGlvbiAoc2luY2UgTEEoMSkgaXMgbm90IGluIHRoZSB2aWFibGUgZm9sbG93aW5nIHRva2VuCisgICMgc2V0KS4gIFRoZSBydWxlIGV4Y2VwdGlvbiBoYW5kbGVyIHRyaWVzIHRvIHJlY292ZXIsIGJ1dCBmaW5kcworICAjIHRoZSBzYW1lIHJlY292ZXJ5IHNldCBhbmQgZG9lc24ndCBjb25zdW1lIGFueXRoaW5nLiAgUnVsZSBiCisgICMgZXhpdHMgbm9ybWFsbHkgcmV0dXJuaW5nIHRvIHJ1bGUgYS4gIE5vdyBpdCBmaW5kcyB0aGUgJ10nIChhbmQKKyAgIyB3aXRoIHRoZSBzdWNjZXNzZnVsIG1hdGNoIGV4aXRzIGVycm9yUmVjb3ZlcnkgbW9kZSkuCisgICMgCisgICMgU28sIHlvdSBjbmEgc2VlIHRoYXQgdGhlIHBhcnNlciB3YWxrcyB1cCBjYWxsIGNoYWluIGxvb2tpbmcKKyAgIyBmb3IgdGhlIHRva2VuIHRoYXQgd2FzIGEgbWVtYmVyIG9mIHRoZSByZWNvdmVyeSBzZXQuCisgICMgCisgICMgRXJyb3JzIGFyZSBub3QgZ2VuZXJhdGVkIGluIGVycm9yUmVjb3ZlcnkgbW9kZS4KKyAgIyAKKyAgIyBBTlRMUidzIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBpcyBiYXNlZCB1cG9uIG9yaWdpbmFsIGlkZWFzOgorICAjIAorICAjICJBbGdvcml0aG1zICsgRGF0YSBTdHJ1Y3R1cmVzID0gUHJvZ3JhbXMiIGJ5IE5pa2xhdXMgV2lydGgKKyAgIyAKKyAgIyBhbmQKKyAgIyAKKyAgIyAiQSBub3RlIG9uIGVycm9yIHJlY292ZXJ5IGluIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlcnMiOgorICAjIGh0dHA6Ly9wb3J0YWwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9OTQ3OTAyLjk0NzkwNQorICAjIAorICAjIExhdGVyLCBKb3NlZiBHcm9zY2ggaGFkIHNvbWUgZ29vZCBpZGVhczoKKyAgIyAKKyAgIyAiRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudAorICAjIFBhcnNlcnMiOgorICAjIGZ0cDovL3d3dy5jb2NvbGFiLmNvbS9wcm9kdWN0cy9jb2NrdGFpbC9kb2NhNC5wcy9lbGwucHMuemlwCisgICMgCisgICMgTGlrZSBHcm9zY2ggSSBpbXBsZW1lbnRlZCBsb2NhbCBGT0xMT1cgc2V0cyB0aGF0IGFyZSBjb21iaW5lZAorICAjIGF0IHJ1bi10aW1lIHVwb24gZXJyb3IgdG8gYXZvaWQgb3ZlcmhlYWQgZHVyaW5nIHBhcnNpbmcuCisgIGRlZiBjb21wdXRlX2Vycm9yX3JlY292ZXJ5X3NldAorICAgIGNvbWJpbmVfZm9sbG93cyggZmFsc2UgKQorICBlbmQKKyAgCisgIGRlZiByZWNvdmVyX2Zyb21fbWlzbWF0Y2hlZF90b2tlbiggdHlwZSwgZm9sbG93ICkKKyAgICBpZiBtaXNtYXRjaF9pc191bndhbnRlZF90b2tlbj8oIHR5cGUgKQorICAgICAgZXJyID0gVW53YW50ZWRUb2tlbiggdHlwZSApCisgICAgICByZXN5bmMgeyBAaW5wdXQuY29uc3VtZSB9CisgICAgICByZXBvcnRfZXJyb3IoIGVyciApCisgICAgICAKKyAgICAgIHJldHVybiBAaW5wdXQuY29uc3VtZQorICAgIGVuZAorICAgIAorICAgIGlmIG1pc21hdGNoX2lzX21pc3NpbmdfdG9rZW4/KCBmb2xsb3cgKQorICAgICAgaW5zZXJ0ZWQgPSBtaXNzaW5nX3N5bWJvbCggbmlsLCB0eXBlLCBmb2xsb3cgKQorICAgICAgcmVwb3J0X2Vycm9yKCBNaXNzaW5nVG9rZW4oIHR5cGUsIGluc2VydGVkICkgKQorICAgICAgcmV0dXJuIGluc2VydGVkCisgICAgZW5kCisgICAgCisgICAgcmFpc2UgTWlzbWF0Y2hlZFRva2VuKCB0eXBlICkKKyAgZW5kCisgIAorICBkZWYgcmVjb3Zlcl9mcm9tX21pc21hdGNoZWRfc2V0KCBlLCBmb2xsb3cgKQorICAgIGlmIG1pc21hdGNoX2lzX21pc3NpbmdfdG9rZW4/KCBmb2xsb3cgKQorICAgICAgcmVwb3J0X2Vycm9yKCBlICkKKyAgICAgIHJldHVybiBtaXNzaW5nX3N5bWJvbCggZSwgSU5WQUxJRF9UT0tFTl9UWVBFLCBmb2xsb3cgKQorICAgIGVuZAorICAgIHJhaXNlIGUKKyAgZW5kCisgIAorICBkZWYgcmVjb3Zlcl9mcm9tX21pc21hdGNoZWRfZWxlbWVudCggZSwgZm9sbG93ICkKKyAgICBmb2xsb3cubmlsPyBhbmQgcmV0dXJuIGZhbHNlCisgICAgaWYgZm9sbG93LmluY2x1ZGU/KCBFT1JfVE9LRU5fVFlQRSApCisgICAgICB2aWFibGVfdG9rZW5zID0gY29tcHV0ZV9jb250ZXh0X3NlbnNpdGl2ZV9ydWxlX2ZvbGxvdworICAgICAgZm9sbG93ID0gKCBmb2xsb3cgfCB2aWFibGVfdG9rZW5zICkgLSBTZXRbIEVPUl9UT0tFTl9UWVBFIF0KKyAgICBlbmQKKyAgICBpZiBmb2xsb3cuaW5jbHVkZT8oIEBpbnB1dC5wZWVrICkKKyAgICAgIHJlcG9ydF9lcnJvciggZSApCisgICAgICByZXR1cm4gdHJ1ZQorICAgIGVuZAorICAgIHJldHVybiBmYWxzZQorICBlbmQKKyAgCisgICMgQ29uanVyZSB1cCBhIG1pc3NpbmcgdG9rZW4gZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorICAjIAorICAjIFRoZSByZWNvZ25pemVyIGF0dGVtcHRzIHRvIHJlY292ZXIgZnJvbSBzaW5nbGUgbWlzc2luZworICAjIHN5bWJvbHMuIEJ1dCwgYWN0aW9ucyBtaWdodCByZWZlciB0byB0aGF0IG1pc3Npbmcgc3ltYm9sLgorICAjIEZvciBleGFtcGxlLCB4PUlEIHtmKCR4KTt9LiBUaGUgYWN0aW9uIGNsZWFybHkgYXNzdW1lcworICAjIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4gaWRlbnRpZmllciBtYXRjaGVkIHByZXZpb3VzbHkgYW5kIHRoYXQKKyAgIyAkeCBwb2ludHMgYXQgdGhhdCB0b2tlbi4gSWYgdGhhdCB0b2tlbiBpcyBtaXNzaW5nLCBidXQKKyAgIyB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtIGlzIHdoYXQgd2Ugd2FudCB3ZSBhc3N1bWUgdGhhdAorICAjIHRoaXMgdG9rZW4gaXMgbWlzc2luZyBhbmQgd2Uga2VlcCBnb2luZy4gQmVjYXVzZSB3ZQorICAjIGhhdmUgdG8gcmV0dXJuIHNvbWUgdG9rZW4gdG8gcmVwbGFjZSB0aGUgbWlzc2luZyB0b2tlbiwKKyAgIyB3ZSBoYXZlIHRvIGNvbmp1cmUgb25lIHVwLiBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgdXNlciBjb250cm9sCisgICMgb3ZlciB0aGUgdG9rZW5zIHJldHVybmVkIGZvciBtaXNzaW5nIHRva2Vucy4gTW9zdGx5LAorICAjIHlvdSB3aWxsIHdhbnQgdG8gY3JlYXRlIHNvbWV0aGluZyBzcGVjaWFsIGZvciBpZGVudGlmaWVyCisgICMgdG9rZW5zLiBGb3IgbGl0ZXJhbHMgc3VjaCBhcyAneycgYW5kICcsJywgdGhlIGRlZmF1bHQKKyAgIyBhY3Rpb24gaW4gdGhlIHBhcnNlciBvciB0cmVlIHBhcnNlciB3b3Jrcy4gSXQgc2ltcGx5IGNyZWF0ZXMKKyAgIyBhIENvbW1vblRva2VuIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgdGV4dCB3aWxsIGJlIHRoZSB0b2tlbi4KKyAgIyBJZiB5b3UgY2hhbmdlIHdoYXQgdG9rZW5zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgbGV4ZXIsCisgICMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0b2tlbnMuCisgIGRlZiBtaXNzaW5nX3N5bWJvbCggZXJyb3IsIGV4cGVjdGVkX3Rva2VuX3R5cGUsIGZvbGxvdyApCisgICAgcmV0dXJuIG5pbAorICBlbmQKKyAgCisgIGRlZiBtaXNtYXRjaF9pc191bndhbnRlZF90b2tlbj8oIHR5cGUgKQorICAgIEBpbnB1dC5wZWVrKCAyICkgPT0gdHlwZQorICBlbmQKKyAgCisgIGRlZiBtaXNtYXRjaF9pc19taXNzaW5nX3Rva2VuPyggZm9sbG93ICkKKyAgICBmb2xsb3cubmlsPyBhbmQgcmV0dXJuIGZhbHNlCisgICAgaWYgZm9sbG93LmluY2x1ZGU/KCBFT1JfVE9LRU5fVFlQRSApCisgICAgICB2aWFibGVfdG9rZW5zID0gY29tcHV0ZV9jb250ZXh0X3NlbnNpdGl2ZV9ydWxlX2ZvbGxvdworICAgICAgZm9sbG93ID0gZm9sbG93IHwgdmlhYmxlX3Rva2VucworICAgICAgCisgICAgICBmb2xsb3cuZGVsZXRlKCBFT1JfVE9LRU5fVFlQRSApIHVubGVzcyBAc3RhdGUuZm9sbG93aW5nLmVtcHR5PworICAgIGVuZAorICAgIGlmIGZvbGxvdy5pbmNsdWRlPyggQGlucHV0LnBlZWsgKSBvciBmb2xsb3cuaW5jbHVkZT8oIEVPUl9UT0tFTl9UWVBFICkKKyAgICAgIHJldHVybiB0cnVlCisgICAgZW5kCisgICAgcmV0dXJuIGZhbHNlCisgIGVuZAorICAKKyAgZGVmIHN5bnRheF9lcnJvcnM/CisgICAgKCBlcnJvcl9jb3VudCA9IEBzdGF0ZS5zeW50YXhfZXJyb3JzICkgPiAwIGFuZCByZXR1cm4oIGVycm9yX2NvdW50ICkKKyAgZW5kCisgIAorICAjIGZhY3RvciBvdXQgd2hhdCB0byBkbyB1cG9uIHRva2VuIG1pc21hdGNoIHNvCisgICMgdHJlZSBwYXJzZXJzIGNhbiBiZWhhdmUgZGlmZmVyZW50bHkuCisgICMKKyAgIyAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGFyc2VyIHRvIGRvIHRoaW5ncworICAjCSAgbGlrZSBiYWlsaW5nIG91dCBhZnRlciB0aGUgZmlyc3QgZXJyb3IKKyAgIwkqIGp1c3QgcmFpc2UgdGhlIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mCisgICMJICBjYWxsaW5nIHRoZSByZWNvdmVyeSBtZXRob2QuCisgICMKKyAgZGVmIG51bWJlcl9vZl9zeW50YXhfZXJyb3JzCisgICAgQHN0YXRlLnN5bnRheF9lcnJvcnMKKyAgZW5kCisgIAorICAjIAorICAjIENvbXB1dGUgdGhlIGNvbnRleHQtc2Vuc2l0aXZlICtGT0xMT1crIHNldCBmb3IgY3VycmVudCBydWxlLgorICAjIFRoaXMgaXMgc2V0IG9mIHRva2VuIHR5cGVzIHRoYXQgY2FuIGZvbGxvdyBhIHNwZWNpZmljIHJ1bGUKKyAgIyByZWZlcmVuY2UgZ2l2ZW4gYSBzcGVjaWZpYyBjYWxsIGNoYWluLiAgWW91IGdldCB0aGUgc2V0IG9mCisgICMgdmlhYmxlIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBjb21lIG5leHQgKGxvb2sgZGVwdGggMSkKKyAgIyBnaXZlbiB0aGUgY3VycmVudCBjYWxsIGNoYWluLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZQorICAjIGRlZmluaXRpb24gb2YgcGxhaW4gRk9MTE9XIGZvciBydWxlIHI6CisgICMgCisgICMgICAgRk9MTE9XKHIpPXt4IHwgUz0+KmFscGhhIHIgYmV0YSBpbiBHIGFuZCB4IGluIEZJUlNUKGJldGEpfQorICAjIAorICAjIHdoZXJlIHggaW4gVCogYW5kIGFscGhhLCBiZXRhIGluIFYqOyBUIGlzIHNldCBvZiB0ZXJtaW5hbHMgYW5kCisgICMgViBpcyB0aGUgc2V0IG9mIHRlcm1pbmFscyBhbmQgbm9udGVybWluYWxzLiAgSW4gb3RoZXIgd29yZHMsCisgICMgRk9MTE9XKHIpIGlzIHRoZSBzZXQgb2YgYWxsIHRva2VucyB0aGF0IGNhbiBwb3NzaWJseSBmb2xsb3cKKyAgIyByZWZlcmVuY2VzIHRvIHIgaW4gKmFueSogc2VudGVudGlhbCBmb3JtIChjb250ZXh0KS4gIEF0CisgICMgcnVudGltZSwgaG93ZXZlciwgd2Uga25vdyBwcmVjaXNlbHkgd2hpY2ggY29udGV4dCBhcHBsaWVzIGFzCisgICMgd2UgaGF2ZSB0aGUgY2FsbCBjaGFpbi4gIFdlIG1heSBjb21wdXRlIHRoZSBleGFjdCAocmF0aGVyCisgICMgdGhhbiBjb3ZlcmluZyBzdXBlcnNldCkgc2V0IG9mIGZvbGxvd2luZyB0b2tlbnMuCisgICMgCisgICMgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGdyYW1tYXI6CisgICMgCisgICMgICBzdGF0IDogSUQgJz0nIGV4cHIgJzsnICAgICAgLy8gRk9MTE9XKHN0YXQpPT17RU9GfQorICAjICAgICAgICB8ICJyZXR1cm4iIGV4cHIgJy4nCisgICMgICAgICAgIDsKKyAgIyAgIGV4cHIgOiBhdG9tICgnKycgYXRvbSkqIDsgICAvLyBGT0xMT1coZXhwcik9PXsnOycsJy4nLCcpJ30KKyAgIyAgIGF0b20gOiBJTlQgICAgICAgICAgICAgICAgICAvLyBGT0xMT1coYXRvbSk9PXsnKycsJyknLCc7JywnLid9CisgICMgICAgICAgIHwgJygnIGV4cHIgJyknCisgICMgICAgICAgIDsKKyAgIyAKKyAgIyBUaGUgRk9MTE9XIHNldHMgYXJlIGFsbCBpbmNsdXNpdmUgd2hlcmVhcyBjb250ZXh0LXNlbnNpdGl2ZQorICAjIEZPTExPVyBzZXRzIGFyZSBwcmVjaXNlbHkgd2hhdCBjb3VsZCBmb2xsb3cgYSBydWxlIHJlZmVyZW5jZS4KKyAgIyBGb3IgaW5wdXQgaW5wdXQgImk9KDMpOyIsIGhlcmUgaXMgdGhlIGRlcml2YXRpb246CisgICMgCisgICMgICBzdGF0ID0+IElEICc9JyBleHByICc7JworICAjICAgICAgICA9PiBJRCAnPScgYXRvbSAoJysnIGF0b20pKiAnOycKKyAgIyAgICAgICAgPT4gSUQgJz0nICcoJyBleHByICcpJyAoJysnIGF0b20pKiAnOycKKyAgIyAgICAgICAgPT4gSUQgJz0nICcoJyBhdG9tICcpJyAoJysnIGF0b20pKiAnOycKKyAgIyAgICAgICAgPT4gSUQgJz0nICcoJyBJTlQgJyknICgnKycgYXRvbSkqICc7JworICAjICAgICAgICA9PiBJRCAnPScgJygnIElOVCAnKScgJzsnCisgICMgCisgICMgQXQgdGhlICIzIiB0b2tlbiwgeW91J2QgaGF2ZSBhIGNhbGwgY2hhaW4gb2YKKyAgIyAKKyAgIyAgIHN0YXQgLT4gZXhwciAtPiBhdG9tIC0+IGV4cHIgLT4gYXRvbQorICAjIAorICAjIFdoYXQgY2FuIGZvbGxvdyB0aGF0IHNwZWNpZmljIG5lc3RlZCByZWYgdG8gYXRvbT8gIEV4YWN0bHkgJyknCisgICMgYXMgeW91IGNhbiBzZWUgYnkgbG9va2luZyBhdCB0aGUgZGVyaXZhdGlvbiBvZiB0aGlzIHNwZWNpZmljCisgICMgaW5wdXQuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIEZPTExPVyhhdG9tKT17JysnLCcpJywnOycsJy4nfS4KKyAgIyAKKyAgIyBZb3Ugd2FudCB0aGUgZXhhY3QgdmlhYmxlIHRva2VuIHNldCB3aGVuIHJlY292ZXJpbmcgZnJvbSBhCisgICMgdG9rZW4gbWlzbWF0Y2guICBVcG9uIHRva2VuIG1pc21hdGNoLCBpZiBMQSgxKSBpcyBtZW1iZXIgb2YKKyAgIyB0aGUgdmlhYmxlIG5leHQgdG9rZW4gc2V0LCB0aGVuIHlvdSBrbm93IHRoZXJlIGlzIG1vc3QgbGlrZWx5CisgICMgYSBtaXNzaW5nIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uICAiSW5zZXJ0IiBvbmUgYnkganVzdCBub3QKKyAgIyB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICMgCisgIGRlZiBjb21wdXRlX2NvbnRleHRfc2Vuc2l0aXZlX3J1bGVfZm9sbG93CisgICAgY29tYmluZV9mb2xsb3dzIHRydWUKKyAgZW5kCisgIAorICBkZWYgY29tYmluZV9mb2xsb3dzKCBleGFjdCApCisgICAgZm9sbG93X3NldCA9IFNldC5uZXcKKyAgICBAc3RhdGUuZm9sbG93aW5nLmVhY2hfd2l0aF9pbmRleC5yZXZlcnNlX2VhY2ggZG8gfGxvY2FsX2ZvbGxvd19zZXQsIGluZGV4fAorICAgICAgZm9sbG93X3NldCB8PSBsb2NhbF9mb2xsb3dfc2V0CisgICAgICBpZiBleGFjdAorICAgICAgICBpZiBsb2NhbF9mb2xsb3dfc2V0LmluY2x1ZGU/KCBFT1JfVE9LRU5fVFlQRSApCisgICAgICAgICAgZm9sbG93X3NldC5kZWxldGUoIEVPUl9UT0tFTl9UWVBFICkgaWYgaW5kZXggPiAwCisgICAgICAgIGVsc2UKKyAgICAgICAgICBicmVhaworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJldHVybiBmb2xsb3dfc2V0CisgIGVuZAorICAKKyAgIyAKKyAgIyBNYXRjaCBuZWVkcyB0byByZXR1cm4gdGhlIGN1cnJlbnQgaW5wdXQgc3ltYm9sLCB3aGljaCBnZXRzIHB1dAorICAjIGludG8gdGhlIGxhYmVsIGZvciB0aGUgYXNzb2NpYXRlZCB0b2tlbiByZWY7IGUuZy4sIHg9SUQuICBUb2tlbgorICAjIGFuZCB0cmVlIHBhcnNlcnMgbmVlZCB0byByZXR1cm4gZGlmZmVyZW50IG9iamVjdHMuIFJhdGhlciB0aGFuIHRlc3QKKyAgIyBmb3IgaW5wdXQgc3RyZWFtIHR5cGUgb3IgY2hhbmdlIHRoZSBJbnRTdHJlYW0gaW50ZXJmYWNlLCBJIHVzZQorICAjIGEgc2ltcGxlIG1ldGhvZCB0byBhc2sgdGhlIHJlY29nbml6ZXIgdG8gdGVsbCBtZSB3aGF0IHRoZSBjdXJyZW50CisgICMgaW5wdXQgc3ltYm9sIGlzLgorICAjIAorICAjIFRoaXMgaXMgaWdub3JlZCBmb3IgbGV4ZXJzLgorICAjIAorICBkZWYgY3VycmVudF9zeW1ib2wKKyAgICBAaW5wdXQubG9vaworICBlbmQKKyAgCisgICMgCisgICMgQ29uc3VtZSBpbnB1dCBzeW1ib2xzIHVudGlsIG9uZSBtYXRjaGVzIGEgdHlwZSB3aXRoaW4gdHlwZXMKKyAgIyAKKyAgIyB0eXBlcyBjYW4gYmUgYSBzaW5nbGUgc3ltYm9sIHR5cGUgb3IgYSBzZXQgb2Ygc3ltYm9sIHR5cGVzCisgICMgCisgIGRlZiBjb25zdW1lX3VudGlsKCB0eXBlcyApCisgICAgdHlwZXMuaXNfYT8oIFNldCApIG9yIHR5cGVzID0gU2V0WyAqdHlwZXMgXQorICAgIHR5cGUgPSBAaW5wdXQucGVlaworICAgIHVudGlsIHR5cGUgPT0gRU9GIG9yIHR5cGVzLmluY2x1ZGU/KCB0eXBlICkKKyAgICAgIEBpbnB1dC5jb25zdW1lCisgICAgICB0eXBlID0gQGlucHV0LnBlZWsKKyAgICBlbmQKKyAgICByZXR1cm4oIHR5cGUgKQorICBlbmQKKyAgCisgICMgCisgICMgUmV0dXJucyB0cnVlIGlmIHRoZSByZWNvZ25pemVyIGlzIGN1cnJlbnRseSBpbiBhIGRlY2lzaW9uIGZvciB3aGljaAorICAjIGJhY2t0cmFja2luZyBoYXMgYmVlbiBlbmFibGVkCisgICMgCisgIGRlZiBiYWNrdHJhY2tpbmc/CisgICAgQHN0YXRlLmJhY2t0cmFja2luZyA+IDAKKyAgZW5kCisgIAorICBkZWYgYmFja3RyYWNraW5nX2xldmVsCisgICAgQHN0YXRlLmJhY2t0cmFja2luZworICBlbmQKKyAgCisgIGRlZiBiYWNrdHJhY2tpbmdfbGV2ZWw9KCBuICkKKyAgICBAc3RhdGUuYmFja3RyYWNraW5nID0gbgorICBlbmQKKyAgCisgIGRlZiBiYWNrdHJhY2sKKyAgICBAc3RhdGUuYmFja3RyYWNraW5nICs9IDEKKyAgICBzdGFydCA9IEBpbnB1dC5tYXJrCisgICAgc3VjY2VzcyA9CisgICAgICBiZWdpbiB5aWVsZAorICAgICAgcmVzY3VlIEJhY2t0cmFja2luZ0ZhaWxlZCB0aGVuIGZhbHNlCisgICAgICBlbHNlIHRydWUKKyAgICAgIGVuZAorICAgIHJldHVybiBzdWNjZXNzCisgIGVuc3VyZQorICAgIEBpbnB1dC5yZXdpbmQoIHN0YXJ0ICkKKyAgICBAc3RhdGUuYmFja3RyYWNraW5nIC09IDEKKyAgZW5kCisgIAorICBkZWYgc3ludGFjdGljX3ByZWRpY2F0ZT8oIG5hbWUgKQorICAgIGJhY2t0cmFjayB7IHNlbmQgbmFtZSB9CisgIGVuZAorICAKKyAgYWxpYXMgYmFja3RyYWNraW5nIGJhY2t0cmFja2luZ19sZXZlbAorICBhbGlhcyBiYWNrdHJhY2tpbmc9IGJhY2t0cmFja2luZ19sZXZlbD0KKyAgCisgIGRlZiBydWxlX21lbW9pemF0aW9uKCBydWxlLCBzdGFydF9pbmRleCApCisgICAgQHN0YXRlLnJ1bGVfbWVtb3J5LmZldGNoKCBydWxlICkgZG8KKyAgICAgIEBzdGF0ZS5ydWxlX21lbW9yeVsgcnVsZSBdID0gSGFzaC5uZXcoIE1FTU9fUlVMRV9VTktOT1dOICkKKyAgICBlbmRbIHN0YXJ0X2luZGV4IF0KKyAgZW5kCisgIAorICBkZWYgYWxyZWFkeV9wYXJzZWRfcnVsZT8oIHJ1bGUgKQorICAgIHN0b3BfaW5kZXggPSBydWxlX21lbW9pemF0aW9uKCBydWxlLCBAaW5wdXQuaW5kZXggKQorICAgIGNhc2Ugc3RvcF9pbmRleAorICAgIHdoZW4gTUVNT19SVUxFX1VOS05PV04gdGhlbiByZXR1cm4gZmFsc2UKKyAgICB3aGVuIE1FTU9fUlVMRV9GQUlMRUQKKyAgICAgIHJhaXNlIEJhY2t0cmFja2luZ0ZhaWxlZAorICAgIGVsc2UKKyAgICAgIEBpbnB1dC5zZWVrKCBzdG9wX2luZGV4ICsgMSApCisgICAgZW5kCisgICAgcmV0dXJuIHRydWUKKyAgZW5kCisgIAorICBkZWYgbWVtb2l6ZSggcnVsZSwgc3RhcnRfaW5kZXgsIHN1Y2Nlc3MgKQorICAgIHN0b3BfaW5kZXggPSBzdWNjZXNzID8gQGlucHV0LmluZGV4IC0gMSA6IE1FTU9fUlVMRV9GQUlMRUQKKyAgICBtZW1vID0gQHN0YXRlLnJ1bGVfbWVtb3J5WyBydWxlIF0gYW5kIG1lbW9bIHN0YXJ0X2luZGV4IF0gPSBzdG9wX2luZGV4CisgIGVuZAorICAKKyAgZGVmIHRyYWNlX2luKCBydWxlX25hbWUsIHJ1bGVfaW5kZXgsIGlucHV0X3N5bWJvbCApCisgICAgQGVycm9yX291dHB1dC5wcmludGYoICItLT4gZW50ZXIgJXMgb24gJXMiLCBydWxlX25hbWUsIGlucHV0X3N5bWJvbCApCisgICAgQHN0YXRlLmJhY2t0cmFja2luZyA+IDAgYW5kIEBlcnJvcl9vdXRwdXQucHJpbnRmKCAKKyAgICAgICIgKGluIGJhY2t0cmFja2luZyBtb2RlOiBkZXB0aCA9ICVzKSIsIEBzdGF0ZS5iYWNrdHJhY2tpbmcKKyAgICApCisgICAgQGVycm9yX291dHB1dC5wcmludCggIlxuIiApCisgIGVuZAorICAKKyAgZGVmIHRyYWNlX291dCggcnVsZV9uYW1lLCBydWxlX2luZGV4LCBpbnB1dF9zeW1ib2wgKQorICAgIEBlcnJvcl9vdXRwdXQucHJpbnRmKCAiPC0tIGV4aXQgJXMgb24gJXMiLCBydWxlX25hbWUsIGlucHV0X3N5bWJvbCApCisgICAgQHN0YXRlLmJhY2t0cmFja2luZyA+IDAgYW5kIEBlcnJvcl9vdXRwdXQucHJpbnRmKCAKKyAgICAgICIgKGluIGJhY2t0cmFja2luZyBtb2RlOiBkZXB0aCA9ICVzKSIsIEBzdGF0ZS5iYWNrdHJhY2tpbmcKKyAgICApCisgICAgQGVycm9yX291dHB1dC5wcmludCggIlxuIiApCisgIGVuZAorICAKK3ByaXZhdGUKKyAgCisgIGRlZiBpbml0aWFsaXplX2RmYXMKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCitlbmQKKworCisjIGNvbnN0YW50IGFsaWFzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdGhlCisjIHJ1bnRpbWUgbGlicmFyeQorQmFzZVJlY29nbml6ZXIgPSBSZWNvZ25pemVyCisKKz1iZWdpbiByZG9jIEFOVExSMzo6TGV4ZXIKKworPSBMZXhlcgorCitMZXhlciBpcyB0aGUgZGVmYXVsdCBzdXBlcmNsYXNzIG9mIGFsbCBsZXhlcnMgZ2VuZXJhdGVkIGJ5IEFOVExSLiBUaGUgY2xhc3MKK3RhaWxvcnMgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBSZWNvZ25pemVyIHRvIHRoZSB0YXNrIG9mCittYXRjaGluZyBwYXR0ZXJucyBpbiB0aGUgdGV4dCBpbnB1dCBhbmQgYnJlYWtpbmcgdGhlIGlucHV0IGludG8gdG9rZW5zLgorCis9PSBBYm91dCBMZXhlcnMKKworQSBsZXhlcidzIGpvYiBpcyB0byB0YWtlIGlucHV0IHRleHQgYW5kIGJyZWFrIGl0IHVwIGludG8gX3Rva2Vuc18gLS0gb2JqZWN0cwordGhhdCBlbmNhcHN1bGF0ZSBhIHBpZWNlIG9mIHRleHQsIGEgdHlwZSBsYWJlbCAoc3VjaCBhcyBJRCBvciBJTlRFR0VSKSwgYW5kIHRoZQorcG9zaXRpb24gb2YgdGhlIHRleHQgd2l0aCByZXNwZWN0IHRvIHRoZSBpbnB1dC4gVGh1cywgYSBsZXhlciBpcyBlc3NlbnRpYWxseSBhCitjb21wbGljYXRlZCBpdGVyYXRvciB0aGF0IHN0ZXBzIHRocm91Z2ggYW4gaW5wdXQgc3RyZWFtIGFuZCBwcm9kdWNlcyBhIHNlcXVlbmNlCitvZiB0b2tlbnMuIFNvbWV0aW1lcyBsZXhlcnMgYXJlIGVub3VnaCB0byBjYXJyeSBvdXQgYSBnb2FsIG9uIHRoZWlyIG93biwgc3VjaCBhcwordGFza3MgbGlrZSBzb3VyY2UgY29kZSBoaWdobGlnaHRpbmcgYW5kIHNpbXBsZSBjb2RlIGFuYWx5c2lzLiBVc3VhbGx5LCBob3dldmVyLAordGhlIGxleGVyIGNvbnZlcnRzIHRleHQgaW50byB0b2tlbnMgZm9yIHVzZSBieSBhIHBhcnNlciwgd2hpY2ggcmVjb2duaXplcyBsYXJnZXIKK3N0cnVjdHVyZXMgd2l0aGluIHRoZSB0ZXh0LgorCitBTlRMUiBwYXJzZXJzIGhhdmUgYSB2YXJpZXR5IG9mIGVudHJ5IHBvaW50cyBzcGVjaWZpZWQgYnkgcGFyc2VyIHJ1bGVzLCBlYWNoIG9mCit3aGljaCBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHNlbnRlbmNlIGluIGEgZ3JhbW1hci4gTGV4ZXJzLAoraG93ZXZlciwgYXJlIHByaW1hcmlseSBpbnRlbmRlZCB0byBoYXZlIGEgc2luZ2xlIGVudHJ5IHBvaW50LiBJdCBsb29rcyBhdCB0aGUKK2NoYXJhY3RlcnMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgaW5wdXQgcG9zaXRpb24sIGRlY2lkZXMgaWYgdGhlIGNodW5rIG9mIHRleHQKK21hdGNoZXMgb25lIG9mIGEgbnVtYmVyIG9mIHBvc3NpYmxlIHRva2VuIHR5cGUgZGVmaW5pdGlvbnMsIHdyYXBzIHRoZSBjaHVuayBpbnRvCithIHRva2VuIHdpdGggaW5mb3JtYXRpb24gb24gaXRzIHR5cGUgYW5kIGxvY2F0aW9uLCBhbmQgYWR2YW5jZXMgdGhlIGlucHV0IHN0cmVhbQordG8gdGhlIG5leHQgcGxhY2UuCisKKz09IEFOVExSIExleGVycyBhbmQgdGhlIExleGVyIEFQSQorCitBTlRMUi1nZW5lcmF0ZWQgbGV4ZXJzIHdpbGwgc3ViY2xhc3MgdGhpcyBjbGFzcywgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UKK3dpdGhpbiBhIGdyYW1tYXIgZmlsZS4gVGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YKK2VhY2ggbGV4ZXIgcnVsZSBhcyBhIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiBUaGUgc3ViY2xhc3Mgd2lsbCBhbHNvIHByb3ZpZGUgYW4KK2ltcGxlbWVudGF0aW9uIGZvciB0aGUgYWJzdHJhY3QgbWV0aG9kICNtX3Rva2VucywgdGhlIHB1cnBvc2Ugb2Ygd2hpY2ggaXMgdG8KK211bHRpcGxleCB0aGUgdG9rZW4gdHlwZSBkZWZpbml0aW9ucyBhbmQgcHJlZGljdCB3aGF0IHJ1bGUgZGVmaW5pdGlvbiB0byBleGVjdXRlCit0byBmZXRjaCBhIHRva2VuLiBUaGUgcHJpbWFyeSBtZXRob2QgaW4gdGhlIGxleGVyIEFQSSwgI25leHRfdG9rZW4sIHVzZXMKKyNtX3Rva2VucyB0byBmZXRjaCB0aGUgbmV4dCB0b2tlbiBhbmQgZHJpdmUgdGhlIGl0ZXJhdGlvbi4KKworSWYgdGhlIGxleGVyIGlzIHByZXBhcmluZyB0b2tlbnMgZm9yIHVzZSBieSBhbiBBTlRMUiBnZW5lcmF0ZWQgcGFyc2VyLCB0aGUgbGV4ZXIKK3dpbGwgZ2VuZXJhbGx5IGJlIHVzZWQgdG8gYnVpbGQgYSBUb2tlblN0cmVhbSBvYmplY3QuIFRoZSBmb2xsb3dpbmcgY29kZSBleGFtcGxlCitkZW1vbnN0cmF0ZXMgdGhlIHR5cGljYWwgc2V0dXAgZm9yIHVzaW5nIEFOVExSIHBhcnNlcnMgYW5kIGxleGVycyBpbiBSdWJ5LgorICAKKyAgIyBpbiBIeXBvdGhldGljYWxMZXhlci5yYgorICBtb2R1bGUgSHlwb3RoZXRpY2FsCisgIGNsYXNzIExleGVyIDwgQU5UTFIzOjpMZXhlcgorICAgICMgLi4uCisgICAgIyBBTlRMUiBnZW5lcmF0ZWQgY29kZQorICAgICMgLi4uCisgIGVuZAorICBlbmQKKyAgCisgICMgaW4gSHlwb3RoZXRpY2FsUGFyc2VyLnJiCisgIG1vZHVsZSBIeXBvdGhldGljYWwKKyAgY2xhc3MgUGFyc2VyIDwgQU5UTFIzOjpQYXJzZXIKKyAgICAjIC4uLgorICAgICMgbW9yZSBBTlRMUiBnZW5lcmF0ZWQgY29kZQorICAgICMgLi4uCisgIGVuZAorICBlbmQKKyAgCisgICMgdG8gdGFrZSBoeXBvdGhldGljYWwgc291cmNlIGNvZGUgYW5kIHByZXBhcmUgaXQgZm9yIHBhcnNpbmcsCisgICMgdGhlcmUgaXMgZ2VuZXJhbGx5IGEgZm91ci1zdGVwIGNvbnN0cnVjdGlvbiBwcm9jZXNzCisgIAorICBzb3VyY2UgPSAic29tZSBoeXBvdGhldGljYWwgc291cmNlIGNvZGUiCisgIGlucHV0ID0gQU5UTFIzOjpTdHJpbmdTdHJlYW0ubmV3KHNvdXJjZSwgOmZpbGUgPT4gJ2JsYWgtZGUtYmxhaC5oeXAnKQorICBsZXhlciA9IEh5cG90aGV0aWNhbDo6TGV4ZXIubmV3KCBpbnB1dCApCisgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgIHBhcnNlciA9IEh5cG90aGV0aWNhbDo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgCisgICMgaWYgeW91J3JlIHVzaW5nIHRoZSBzdGFuZGFyZCBzdHJlYW1zLCBBTlRMUjM6OlN0cmluZ1N0cmVhbSBhbmQKKyAgIyBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLCB5b3UgY2FuIHdyaXRlIHRoZSBzYW1lIHByb2Nlc3MgCisgICMgc2hvd24gYWJvdmUgbW9yZSBzdWNjaW5jdGx5OgorICAKKyAgbGV4ZXIgID0gSHlwb3RoZXRpY2FsOjpMZXhlci5uZXcoInNvbWUgaHlwb3RoZXRpY2FsIHNvdXJjZSBjb2RlIiwgOmZpbGUgPT4gJ2JsYWgtZGUtYmxhaC5oeXAnKQorICBwYXJzZXIgPSBIeXBvdGhldGljYWw6OlBhcnNlci5uZXcoIGxleGVyICkKKworPWVuZAorY2xhc3MgTGV4ZXIgPCBSZWNvZ25pemVyCisgIGluY2x1ZGUgVG9rZW5Tb3VyY2UKKyAgQHRva2VuX2NsYXNzID0gQ29tbW9uVG9rZW4KKyAgCisgIGRlZiBzZWxmLmRlZmF1bHRfcnVsZQorICAgIEBkZWZhdWx0X3J1bGUgfHw9IDp0b2tlbiEKKyAgZW5kCisgIAorICBkZWYgc2VsZi5tYWluKCBhcmd2ID0gQVJHViwgb3B0aW9ucyA9IHt9ICkKKyAgICBpZiBhcmd2LmlzX2E/KCA6Okhhc2ggKSB0aGVuIGFyZ3YsIG9wdGlvbnMgPSBBUkdWLCBhcmd2IGVuZAorICAgIG1haW4gPSBBTlRMUjM6Ok1haW46OkxleGVyTWFpbi5uZXcoIHNlbGYsIG9wdGlvbnMgKQorICAgIGJsb2NrX2dpdmVuPyA/IHlpZWxkKCBtYWluICkgOiBtYWluLmV4ZWN1dGUoIGFyZ3YgKQorICBlbmQKKyAgCisgIGRlZiBzZWxmLmFzc29jaWF0ZWRfcGFyc2VyCisgICAgQGFzc29jaWF0ZWRfcGFyc2VyIHx8PSBiZWdpbgorICAgICAgQGdyYW1tYXJfaG9tZSBhbmQgQGdyYW1tYXJfaG9tZTo6UGFyc2VyCisgICAgcmVzY3VlIE5hbWVFcnJvcgorICAgICAgZ3JhbW1hcl9uYW1lID0gQGdyYW1tYXJfaG9tZS5uYW1lLnNwbGl0KCAiOjoiICkubGFzdAorICAgICAgYmVnaW4KKyAgICAgICAgcmVxdWlyZSAiI3sgZ3JhbW1hcl9uYW1lIH1QYXJzZXIiCisgICAgICAgIEBncmFtbWFyX2hvbWU6OlBhcnNlcgorICAgICAgcmVzY3VlIExvYWRFcnJvciwgTmFtZUVycm9yCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisKKyAgZGVmIGluaXRpYWxpemUoIGlucHV0LCBvcHRpb25zID0ge30gKQorICAgIHN1cGVyKCBvcHRpb25zICkKKyAgICBAaW5wdXQgPSBjYXN0X2lucHV0KCBpbnB1dCwgb3B0aW9ucyApCisgIGVuZAorICAKKyAgZGVmIGN1cnJlbnRfc3ltYm9sCisgICAgbmlsCisgIGVuZAorICAKKyAgZGVmIG5leHRfdG9rZW4KKyAgICBsb29wIGRvCisgICAgICBAc3RhdGUudG9rZW4gPSBuaWwKKyAgICAgIEBzdGF0ZS5jaGFubmVsID0gREVGQVVMVF9DSEFOTkVMCisgICAgICBAc3RhdGUudG9rZW5fc3RhcnRfcG9zaXRpb24gPSBAaW5wdXQuaW5kZXgKKyAgICAgIEBzdGF0ZS50b2tlbl9zdGFydF9jb2x1bW4gPSBAaW5wdXQuY29sdW1uCisgICAgICBAc3RhdGUudG9rZW5fc3RhcnRfbGluZSA9IEBpbnB1dC5saW5lCisgICAgICBAc3RhdGUudGV4dCA9IG5pbAorICAgICAgQGlucHV0LnBlZWsgPT0gRU9GIGFuZCByZXR1cm4gRU9GX1RPS0VOCisgICAgICBiZWdpbgorICAgICAgICB0b2tlbiEKKyAgICAgICAgCisgICAgICAgIGNhc2UgdG9rZW4gPSBAc3RhdGUudG9rZW4KKyAgICAgICAgd2hlbiBuaWwgdGhlbiByZXR1cm4oIGVtaXQgKQorICAgICAgICB3aGVuIFNLSVBfVE9LRU4gdGhlbiBuZXh0CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gdG9rZW4KKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgTm9WaWFibGVBbHRlcm5hdGl2ZSA9PiByZQorICAgICAgICByZXBvcnRfZXJyb3IoIHJlICkKKyAgICAgICAgcmVjb3ZlciggcmUgKQorICAgICAgcmVzY3VlIEVycm9yOjpSZWNvZ25pdGlvbkVycm9yID0+IHJlCisgICAgICAgIHJlcG9ydF9lcnJvciggcmUgKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHNraXAKKyAgICBAc3RhdGUudG9rZW4gPSBTS0lQX1RPS0VOCisgIGVuZAorICAKKyAgYWJzdHJhY3QgOnRva2VuIQorICAKKyAgZGVmIGV4aGF1c3QKKyAgICBzZWxmLnRvX2EKKyAgZW5kCisgIAorICBkZWYgY2hhcl9zdHJlYW09KCBpbnB1dCApCisgICAgQGlucHV0ID0gbmlsCisgICAgcmVzZXQoKQorICAgIEBpbnB1dCA9IGlucHV0CisgIGVuZAorICAKKyAgZGVmIHNvdXJjZV9uYW1lCisgICAgQGlucHV0LnNvdXJjZV9uYW1lCisgIGVuZAorICAKKyAgZGVmIGVtaXQoIHRva2VuID0gQHN0YXRlLnRva2VuICkKKyAgICB0b2tlbiB8fD0gY3JlYXRlX3Rva2VuCisgICAgQHN0YXRlLnRva2VuID0gdG9rZW4KKyAgICByZXR1cm4gdG9rZW4KKyAgZW5kCisgIAorICBkZWYgbWF0Y2goIGV4cGVjdGVkICkKKyAgICBjYXNlIGV4cGVjdGVkCisgICAgd2hlbiBTdHJpbmcKKyAgICAgIGV4cGVjdGVkLmVhY2hfYnl0ZSBkbyB8Y2hhcnwKKyAgICAgICAgdW5sZXNzIEBpbnB1dC5wZWVrID09IGNoYXIKKyAgICAgICAgICBAc3RhdGUuYmFja3RyYWNraW5nID4gMCBhbmQgcmFpc2UgQmFja3RyYWNraW5nRmFpbGVkCisgICAgICAgICAgZXJyb3IgPSBNaXNtYXRjaGVkVG9rZW4oIGNoYXIgKQorICAgICAgICAgIHJlY292ZXIoIGVycm9yICkKKyAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICBlbmQKKyAgICAgICAgQGlucHV0LmNvbnN1bWUoKQorICAgICAgZW5kCisgICAgZWxzZSAjIHNpbmdsZSBpbnRlZ2VyIGNoYXJhY3RlcgorICAgICAgdW5sZXNzIEBpbnB1dC5wZWVrID09IGV4cGVjdGVkCisgICAgICAgIEBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwIGFuZCByYWlzZSBCYWNrdHJhY2tpbmdGYWlsZWQKKyAgICAgICAgZXJyb3IgPSBNaXNtYXRjaGVkVG9rZW4oIGV4cGVjdGVkICkKKyAgICAgICAgcmVjb3ZlciggZXJyb3IgKQorICAgICAgICByYWlzZSBlcnJvcgorICAgICAgZW5kCisgICAgICBAaW5wdXQuY29uc3VtZQorICAgIGVuZAorICAgIHJldHVybiB0cnVlCisgIGVuZAorICAgIAorICBkZWYgbWF0Y2hfYW55CisgICAgQGlucHV0LmNvbnN1bWUKKyAgZW5kCisgIAorICBkZWYgbWF0Y2hfcmFuZ2UoIG1pbiwgbWF4ICkKKyAgICBjaGFyID0gQGlucHV0LnBlZWsKKyAgICBpZiBjaGFyLmJldHdlZW4/KCBtaW4sIG1heCApIHRoZW4gQGlucHV0LmNvbnN1bWUKKyAgICBlbHNlCisgICAgICBAc3RhdGUuYmFja3RyYWNraW5nID4gMCBhbmQgcmFpc2UgQmFja3RyYWNraW5nRmFpbGVkCisgICAgICBlcnJvciA9IE1pc21hdGNoZWRSYW5nZSggbWluLmNociwgbWF4LmNociApCisgICAgICByZWNvdmVyKCBlcnJvciApCisgICAgICByYWlzZSggZXJyb3IgKQorICAgIGVuZAorICAgIHJldHVybiB0cnVlCisgIGVuZAorICAKKyAgZGVmIGxpbmUKKyAgICBAaW5wdXQubGluZQorICBlbmQKKyAgCisgIGRlZiBjb2x1bW4KKyAgICBAaW5wdXQuY29sdW1uCisgIGVuZAorICAKKyAgZGVmIGNoYXJhY3Rlcl9pbmRleAorICAgIEBpbnB1dC5pbmRleAorICBlbmQKKyAgCisgIGRlZiB0ZXh0CisgICAgQHN0YXRlLnRleHQgYW5kIHJldHVybiBAc3RhdGUudGV4dAorICAgIEBpbnB1dC5zdWJzdHJpbmcoIEBzdGF0ZS50b2tlbl9zdGFydF9wb3NpdGlvbiwgY2hhcmFjdGVyX2luZGV4IC0gMSApCisgIGVuZAorICAKKyAgZGVmIHRleHQ9KCB0ZXh0ICkKKyAgICBAc3RhdGUudGV4dCA9IHRleHQKKyAgZW5kCisgIAorICBkZWYgcmVwb3J0X2Vycm9yKCBlICkKKyAgICBkaXNwbGF5X3JlY29nbml0aW9uX2Vycm9yKCBlICkKKyAgZW5kCisgIAorICBkZWYgZXJyb3JfbWVzc2FnZSggZSApCisgICAgY2hhciA9IGNoYXJhY3Rlcl9lcnJvcl9kaXNwbGF5KCBlLnN5bWJvbCApIHJlc2N1ZSBuaWwKKyAgICBjYXNlIGUKKyAgICB3aGVuIEVycm9yOjpNaXNtYXRjaGVkVG9rZW4KKyAgICAgIGV4cGVjdGluZyA9IGNoYXJhY3Rlcl9lcnJvcl9kaXNwbGF5KCBlLmV4cGVjdGluZyApCisgICAgICAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgI3sgY2hhciB9OyBleHBlY3RpbmcgI3sgZXhwZWN0aW5nIH0iCisgICAgd2hlbiBFcnJvcjo6Tm9WaWFibGVBbHRlcm5hdGl2ZQorICAgICAgIm5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBjaGFyYWN0ZXIgI3sgY2hhciB9IgorICAgIHdoZW4gRXJyb3I6OkVhcmx5RXhpdAorICAgICAgInJlcXVpcmVkICggLi4uICkrIGxvb3AgZGlkIG5vdCBtYXRjaCBhbnl0aGluZyBhdCBjaGFyYWN0ZXIgI3sgY2hhciB9IgorICAgIHdoZW4gRXJyb3I6Ok1pc21hdGNoZWROb3RTZXQKKyAgICAgICJtaXNtYXRjaGVkIGNoYXJhY3RlciAlczsgZXhwZWN0aW5nIHNldCAlcCIgJSBbIGNoYXIsIGUuZXhwZWN0aW5nIF0KKyAgICB3aGVuIEVycm9yOjpNaXNtYXRjaGVkU2V0CisgICAgICAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgJXM7IGV4cGVjdGluZyBzZXQgJXAiICUgWyBjaGFyLCBlLmV4cGVjdGluZyBdCisgICAgd2hlbiBFcnJvcjo6TWlzbWF0Y2hlZFJhbmdlCisgICAgICBhID0gY2hhcmFjdGVyX2Vycm9yX2Rpc3BsYXkoIGUubWluICkKKyAgICAgIGIgPSBjaGFyYWN0ZXJfZXJyb3JfZGlzcGxheSggZS5tYXggKQorICAgICAgIm1pc21hdGNoZWQgY2hhcmFjdGVyICVzOyBleHBlY3Rpbmcgc2V0ICVzLi4lcyIgJSBbIGNoYXIsIGEsIGIgXQorICAgIGVsc2Ugc3VwZXIKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgY2hhcmFjdGVyX2Vycm9yX2Rpc3BsYXkoIGNoYXIgKQorICAgIGNhc2UgY2hhcgorICAgIHdoZW4gRU9GIHRoZW4gJzxFT0Y+JworICAgIHdoZW4gSW50ZWdlciB0aGVuIGNoYXIuY2hyLmluc3BlY3QKKyAgICBlbHNlIGNoYXIuaW5zcGVjdAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiByZWNvdmVyKCByZSApCisgICAgQGlucHV0LmNvbnN1bWUKKyAgZW5kCisgIAorICBhbGlhcyBpbnB1dD0gY2hhcl9zdHJlYW09CisgIAorcHJpdmF0ZQorICAKKyAgZGVmIGNhc3RfaW5wdXQoIGlucHV0LCBvcHRpb25zICkKKyAgICBjYXNlIGlucHV0CisgICAgd2hlbiBDaGFyYWN0ZXJTdHJlYW0gdGhlbiBpbnB1dAorICAgIHdoZW4gOjpTdHJpbmcgdGhlbiBTdHJpbmdTdHJlYW0ubmV3KCBpbnB1dCwgb3B0aW9ucyApCisgICAgd2hlbiA6OklPLCBBUkdGIHRoZW4gRmlsZVN0cmVhbS5uZXcoIGlucHV0LCBvcHRpb25zICkKKyAgICBlbHNlIGlucHV0CisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHRyYWNlX2luKCBydWxlX25hbWUsIHJ1bGVfaW5kZXggKQorICAgIGlmIHN5bWJvbCA9IEBpbnB1dC5sb29rIGFuZCBzeW1ib2wgIT0gRU9GIHRoZW4gc3ltYm9sID0gc3ltYm9sLmluc3BlY3QKKyAgICBlbHNlIHN5bWJvbCA9ICc8RU9GPicgZW5kCisgICAgaW5wdXRfc3ltYm9sID0gIiN7IHN5bWJvbCB9IEAgbGluZSAjeyBsaW5lIH0gLyBjb2wgI3sgY29sdW1uIH0iCisgICAgc3VwZXIoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCwgaW5wdXRfc3ltYm9sICkKKyAgZW5kCisgIAorICBkZWYgdHJhY2Vfb3V0KCBydWxlX25hbWUsIHJ1bGVfaW5kZXggKQorICAgIGlmIHN5bWJvbCA9IEBpbnB1dC5sb29rIGFuZCBzeW1ib2wgIT0gRU9GIHRoZW4gc3ltYm9sID0gc3ltYm9sLmluc3BlY3QKKyAgICBlbHNlIHN5bWJvbCA9ICc8RU9GPicgZW5kCisgICAgaW5wdXRfc3ltYm9sID0gIiN7IHN5bWJvbCB9IEAgbGluZSAjeyBsaW5lIH0gLyBjb2wgI3sgY29sdW1uIH0iCisgICAgc3VwZXIoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCwgaW5wdXRfc3ltYm9sICkKKyAgZW5kCisgIAorICBkZWYgY3JlYXRlX3Rva2VuKCAmYiApCisgICAgaWYgYmxvY2tfZ2l2ZW4/IHRoZW4gc3VwZXIoICZiICkKKyAgICBlbHNlCisgICAgICBzdXBlciBkbyB8dHwKKyAgICAgICAgdC5pbnB1dCA9IEBpbnB1dAorICAgICAgICB0LnR5cGUgPSBAc3RhdGUudHlwZQorICAgICAgICB0LmNoYW5uZWwgPSBAc3RhdGUuY2hhbm5lbAorICAgICAgICB0LnN0YXJ0ID0gQHN0YXRlLnRva2VuX3N0YXJ0X3Bvc2l0aW9uCisgICAgICAgIHQuc3RvcCA9IEBpbnB1dC5pbmRleCAtIDEKKyAgICAgICAgdC5saW5lID0gQHN0YXRlLnRva2VuX3N0YXJ0X2xpbmUKKyAgICAgICAgdC50ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHQuY29sdW1uID0gQHN0YXRlLnRva2VuX3N0YXJ0X2NvbHVtbgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorZW5kCisKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpQYXJzZXIKKworPSBQYXJzZXIKKworUGFyc2VyIGlzIHRoZSBkZWZhdWx0IGJhc2UgY2xhc3Mgb2YgQU5UTFItZ2VuZXJhdGVkIHBhcnNlciBjbGFzc2VzLiBUaGUgY2xhc3MKK3RhaWxvcnMgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgUmVjb2duaXplciB0byB0aGUgdGFzayBvZiBwYXJzaW5nLgorCis9PSBBYm91dCBQYXJzaW5nCisKK1RoaXMgaXMganVzdCBhIGxvc2Ugb3ZlcnZpZXcgb2YgcGFyc2luZy4gRm9yIGNvbnNpZGVyYWJseSBtb3JlIGluLWRlcHRoIGNvdmVyYWdlCitvZiB0aGUgdG9waWMsIHJlYWQgdGhlIEFOVExSIGRvY3VtZW50YXRpb24gb3IgY2hlY2sgb3V0IHRoZSBBTlRMUiB3ZWJzaXRlCisoaHR0cDovL3d3dy5hbnRsci5vcmcpLgorCitBIGdyYW1tYXIgZGVmaW5lcyB0aGUgdm9jYWJ1bGFyeSBhbmQgdGhlIHNlbnRlbmNlIHN0cnVjdHVyZSBvZiBhIGxhbmd1YWdlLiBXaGlsZQorYSBsZXhlciBjb25jZXJucyB0aGUgYmFzaWMgdm9jYWJ1bGFyeSBzeW1ib2xzIG9mIHRoZSBsYW5ndWFnZSwgYSBwYXJzZXIncworcHJpbWFyeSB0YXNrIGlzIHRvIGltcGxlbWVudCB0aGUgc2VudGVuY2Ugc3RydWN0dXJlLgorCitQYXJzZXJzIGFyZSBzZXQgdXAgYnkgcHJvdmlkaW5nIGEgc3RyZWFtIG9mIHRva2Vucywgd2hpY2ggaXMgdXN1YWxseSBjcmVhdGVkIGJ5CithIGNvcnJlc3BvbmRpbmcgbGV4ZXIuIFRoZW4sIHRoZSB1c2VyIHJlcXVlc3RzIGEgc3BlY2lmaWMgc2VudGVuY2Utc3RydWN0dXJlCit3aXRoaW4gdGhlIGdyYW1tYXIsIHN1Y2ggYXMgImNsYXNzX2RlZmluaXRpb24iIG9yICJ4bWxfbm9kZSIsIGZyb20gdGhlIHBhcnNlci4KK0l0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIHRva2VucywgdmVyaWZ5aW5nIHRoZSBzeW50YXggb2YgdGhlIHNlbnRlbmNlIGFuZAorcGVyZm9ybWluZyBhY3Rpb25zIHNwZWNpZmllZCBieSB0aGUgZ3JhbW1hci4gSXQgc3RvcHMgd2hlbiBpdCBlbmNvdW50ZXJzIGFuCitlcnJvciBvciB3aGVuIGl0IGhhcyBtYXRjaGVkIHRoZSBmdWxsIHNlbnRlbmNlIGFjY29yZGluZyB0byBpdHMgZGVmaW5lZAorc3RydWN0dXJlLgorCis9PSBBTlRMUiBQYXJzZXJzIGFuZCB0aGUgUGFyc2VyIEFQSQorCitQbGFpbiBBTlRMUi1nZW5lcmF0ZWQgcGFyc2VycyBkaXJlY3RseSBzdWJjbGFzcyB0aGlzIGNsYXNzLCB1bmxlc3Mgc3BlY2lmaWVkCitvdGhlcndpc2Ugd2l0aGluIHRoZSBncmFtbWFyIG9wdGlvbnMuIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIHByb3ZpZGUgYSBtZXRob2QKK2ZvciBlYWNoIHBhcnNlciBydWxlIGRlZmluZWQgaW4gdGhlIEFOVExSIGdyYW1tYXIsIGFzIHdlbGwgYXMgYW55IG90aGVyCitjdXN0b21pemVkIG1lbWJlciBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIHNwZWNpZmllZCBpbiB0aGUgc291cmNlIGdyYW1tYXIuCisKK1RoaXMgY2xhc3MgZG9lcyBub3Qgb3ZlcnJpZGUgbXVjaCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBpbiBSZWNvZ25pemVyLCBhbmQKK3RodXMgdGhlIEFQSSBjbG9zZWx5IG1pcnJvcnMgUmVjb2duaXplci4KKworPWVuZAorY2xhc3MgUGFyc2VyIDwgUmVjb2duaXplcgorICBkZWYgc2VsZi5tYWluKCBhcmd2ID0gQVJHViwgb3B0aW9ucyA9IHt9ICkKKyAgICBpZiBhcmd2LmlzX2E/KCA6Okhhc2ggKSB0aGVuIGFyZ3YsIG9wdGlvbnMgPSBBUkdWLCBhcmd2IGVuZAorICAgIG1haW4gPSBBTlRMUjM6Ok1haW46OlBhcnNlck1haW4ubmV3KCBzZWxmLCBvcHRpb25zICkKKyAgICBibG9ja19naXZlbj8gPyB5aWVsZCggbWFpbiApIDogbWFpbi5leGVjdXRlKCBhcmd2ICkKKyAgZW5kCisgIAorICBkZWYgc2VsZi5hc3NvY2lhdGVkX2xleGVyCisgICAgQGFzc29jaWF0ZWRfbGV4ZXIgfHw9IGJlZ2luCisgICAgICBAZ3JhbW1hcl9ob21lIGFuZCBAZ3JhbW1hcl9ob21lOjpMZXhlcgorICAgIHJlc2N1ZSBOYW1lRXJyb3IKKyAgICAgIGdyYW1tYXJfbmFtZSA9IEBncmFtbWFyX2hvbWUubmFtZS5zcGxpdCggIjo6IiApLmxhc3QKKyAgICAgIGJlZ2luCisgICAgICAgIHJlcXVpcmUgIiN7IGdyYW1tYXJfbmFtZSB9TGV4ZXIiCisgICAgICAgIEBncmFtbWFyX2hvbWU6OkxleGVyCisgICAgICByZXNjdWUgTG9hZEVycm9yLCBOYW1lRXJyb3IKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIAorICBkZWYgaW5pdGlhbGl6ZSggaW5wdXQsIG9wdGlvbnMgPSB7fSApCisgICAgc3VwZXIoIG9wdGlvbnMgKQorICAgIEBpbnB1dCA9IG5pbAorICAgIHJlc2V0CisgICAgQGlucHV0ID0gY2FzdF9pbnB1dCggaW5wdXQsIG9wdGlvbnMgKQorICBlbmQKKyAgCisgIGRlZiBtaXNzaW5nX3N5bWJvbCggZXJyb3IsIGV4cGVjdGVkX3R5cGUsIGZvbGxvdyApCisgICAgY3VycmVudCA9IEBpbnB1dC5sb29rCisgICAgY3VycmVudCA9IEBpbnB1dC5sb29rKCAtMSApIGlmIGN1cnJlbnQgPT0gQU5UTFIzOjpFT0ZfVE9LRU4KKyAgICB0ID0KKyAgICAgIGNhc2UKKyAgICAgIHdoZW4gY3VycmVudCAmJiBjdXJyZW50ICE9IEFOVExSMzo6RU9GX1RPS0VOIHRoZW4gY3VycmVudC5jbG9uZQorICAgICAgd2hlbiBAaW5wdXQudG9rZW5fY2xhc3MgdGhlbiBAaW5wdXQudG9rZW5fY2xhc3MubmV3CisgICAgICBlbHNlICggY3JlYXRlX3Rva2VuIHJlc2N1ZSBDb21tb25Ub2tlbi5uZXcgKQorICAgICAgZW5kCisgICAgCisgICAgdC50eXBlID0gZXhwZWN0ZWRfdHlwZQorICAgIG5hbWUgPSB0Lm5hbWUuZ3N1YiggLyhePCl8KD4kKS8sJycgKQorICAgIHQudGV4dCA9ICI8bWlzc2luZyAjeyBuYW1lIH0+IgorICAgIHQuY2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTAorICAgIHJldHVybiggdCApCisgIGVuZAorICAKKyAgZGVmIHRva2VuX3N0cmVhbT0oIGlucHV0ICkKKyAgICBAaW5wdXQgPSBuaWwKKyAgICByZXNldAorICAgIEBpbnB1dCA9IGlucHV0CisgIGVuZAorICBhbGlhcyB0b2tlbl9zdHJlYW0gaW5wdXQKKyAgCisgIGRlZiBzb3VyY2VfbmFtZQorICAgIEBpbnB1dC5zb3VyY2VfbmFtZQorICBlbmQKKyAgCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIHRyYWNlX2luKCBydWxlX25hbWUsIHJ1bGVfaW5kZXggKQorICAgIHN1cGVyKCBydWxlX25hbWUsIHJ1bGVfaW5kZXgsIEBpbnB1dC5sb29rLmluc3BlY3QgKQorICBlbmQKKyAgCisgIGRlZiB0cmFjZV9vdXQoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCApCisgICAgc3VwZXIoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCwgQGlucHV0Lmxvb2suaW5zcGVjdCApCisgIGVuZAorICAKKyAgZGVmIGNhc3RfaW5wdXQoIGlucHV0LCBvcHRpb25zICkKKyAgICBjYXNlIGlucHV0CisgICAgd2hlbiBUb2tlblN0cmVhbSB0aGVuIGlucHV0CisgICAgd2hlbiBUb2tlblNvdXJjZSB0aGVuIENvbW1vblRva2VuU3RyZWFtLm5ldyggaW5wdXQsIG9wdGlvbnMgKQorICAgIHdoZW4gSU8sIFN0cmluZywgQ2hhcmFjdGVyU3RyZWFtCisgICAgICBpZiBsZXhlcl9jbGFzcyA9IHNlbGYuY2xhc3MuYXNzb2NpYXRlZF9sZXhlcgorICAgICAgICBDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyX2NsYXNzLm5ldyggaW5wdXQsIG9wdGlvbnMgKSwgb3B0aW9ucyApCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsIFV0aWwudGlkeSggPDwtRU5ELCB0cnVlICkKKyAgICAgICAgfCB1bmFibGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IGlucHV0ICN7IGlucHV0Lmluc3BlY3QgfQorICAgICAgICB8IHRvIGEgQU5UTFIzOjpUb2tlblN0cmVhbSBvYmplY3QgYXMgI3sgc2VsZi5jbGFzcyB9CisgICAgICAgIHwgZG9lcyBub3QgYXBwZWFyIHRvIGhhdmUgYW4gYXNzb2NpYXRlZCBsZXhlciBjbGFzcworICAgICAgICBFTkQKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgICMgYXNzdW1lIGl0J3MgYSBzdHJlYW0gaWYgaXQgYXQgbGVhc3QgaW1wbGVtZW50cyBwZWVrIGFuZCBjb25zdW1lCisgICAgICB1bmxlc3MgaW5wdXQucmVzcG9uZF90bz8oIDpwZWVrICkgYW5kIGlucHV0LnJlc3BvbmRfdG8/KCA6Y29uc3VtZSApCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsIFV0aWwudGlkeSggPDwtRU5ELCB0cnVlICkKKyAgICAgICAgfCAjeyBzZWxmLmNsYXNzIH0gcmVxdWlyZXMgYSB0b2tlbiBzdHJlYW0gYXMgaW5wdXQsIGJ1dAorICAgICAgICB8ICN7IGlucHV0Lmluc3BlY3QgfSB3YXMgcHJvdmlkZWQKKyAgICAgICAgRU5ECisgICAgICBlbmQKKyAgICAgIGlucHV0CisgICAgZW5kCisgIGVuZAorICAKK2VuZAorCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9zdHJlYW1zLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3N0cmVhbXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViMTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9zdHJlYW1zLnJiCkBAIC0wLDAgKzEsMTA5MSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCis9YmVnaW4gTElDRU5TRQorCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBLeWxlIFlldHRlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz1lbmQKKworbW9kdWxlIEFOVExSMworCisKKz1iZWdpbiByZG9jIEFOVExSMzo6U3RyZWFtCisKKz0gQU5UTFIzIFN0cmVhbXMKKworVGhpcyBkb2N1bWVudGF0aW9uIGZpcnN0IGNvdmVycyB0aGUgZ2VuZXJhbCBjb25jZXB0IG9mIHN0cmVhbXMgYXMgdXNlZCBieSBBTlRMUgorcmVjb2duaXplcnMsIGFuZCB0aGVuIGRpc2N1c3NlcyB0aGUgc3BlY2lmaWMgPHR0PkFOVExSMzo6U3RyZWFtPC90dD4gbW9kdWxlLgorCis9PSBBTlRMUiBTdHJlYW0gQ2xhc3NlcworCitBTlRMUiByZWNvZ25pemVycyBuZWVkIGEgd2F5IHRvIHdhbGsgdGhyb3VnaCBpbnB1dCBkYXRhIGluIGEgc2VyaWFsaXplZCBJTy1zdHlsZQorZmFzaGlvbi4gVGhleSBhbHNvIG5lZWQgc29tZSBib29rLWtlZXBpbmcgYWJvdXQgdGhlIGlucHV0IHRvIHByb3ZpZGUgdXNlZnVsCitpbmZvcm1hdGlvbiB0byBkZXZlbG9wZXJzLCBzdWNoIGFzIGN1cnJlbnQgbGluZSBudW1iZXIgYW5kIGNvbHVtbi4gRnVydGhlcm1vcmUsCit0byBpbXBsZW1lbnQgYmFja3RyYWNraW5nIGFuZCB2YXJpb3VzIGVycm9yIHJlY292ZXJ5IHRlY2huaXF1ZXMsIHJlY29nbml6ZXJzCituZWVkIGEgd2F5IHRvIHJlY29yZCB2YXJpb3VzIGxvY2F0aW9ucyBpbiB0aGUgaW5wdXQgYXQgYSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZQorcmVjb2duaXRpb24gcHJvY2VzcyBzbyB0aGUgaW5wdXQgc3RhdGUgbWF5IGJlIHJlc3RvcmVkIGJhY2sgdG8gYSBwcmlvciBzdGF0ZS4KKworQU5UTFIgYnVuZGxlcyBhbGwgb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGludG8gYSBudW1iZXIgb2YgU3RyZWFtIGNsYXNzZXMsIGVhY2gKK2Rlc2lnbmVkIHRvIGJlIHVzZWQgYnkgcmVjb2duaXplcnMgZm9yIGEgc3BlY2lmaWMgcmVjb2duaXRpb24gdGFzay4gTW9zdCBvZiB0aGUKK1N0cmVhbSBoaWVyYXJjaHkgaXMgaW1wbGVtZW50ZWQgaW4gYW50bHIzL3N0cmVhbS5yYiwgd2hpY2ggaXMgbG9hZGVkIGJ5IGRlZmF1bHQKK3doZW4gJ2FudGxyMycgaXMgcmVxdWlyZWQuCisKKy0tLQorCitIZXJlJ3MgYSBicmllZiBvdmVydmlldyBvZiB0aGUgdmFyaW91cyBzdHJlYW0gY2xhc3NlcyBhbmQgdGhlaXIgcmVzcGVjdGl2ZQorcHVycG9zZToKKworU3RyaW5nU3RyZWFtOjoKKyAgU2ltaWxhciB0byBTdHJpbmdJTyBmcm9tIHRoZSBzdGFuZGFyZCBSdWJ5IGxpYnJhcnksIFN0cmluZ1N0cmVhbSB3cmFwcyByYXcKKyAgU3RyaW5nIGRhdGEgaW4gYSBTdHJlYW0gaW50ZXJmYWNlIGZvciB1c2UgYnkgQU5UTFIgbGV4ZXJzLgorRmlsZVN0cmVhbTo6CisgIEEgc3ViY2xhc3Mgb2YgU3RyaW5nU3RyZWFtLCBGaWxlU3RyZWFtIHNpbXBseSB3cmFwcyBkYXRhIHJlYWQgZnJvbSBhbiBJTyBvcgorICBGaWxlIG9iamVjdCBmb3IgdXNlIGJ5IGxleGVycy4KK0NvbW1vblRva2VuU3RyZWFtOjoKKyAgVGhlIGpvYiBvZiBhIFRva2VuU3RyZWFtIGlzIHRvIHJlYWQgbGV4ZXIgb3V0cHV0IGFuZCB0aGVuIHByb3ZpZGUgQU5UTFIKKyAgcGFyc2VycyB3aXRoIHRoZSBtZWFucyB0byBzZXF1ZW50aWFsIHdhbGsgdGhyb3VnaCBzZXJpZXMgb2YgdG9rZW5zLgorICBDb21tb25Ub2tlblN0cmVhbSBpcyB0aGUgZGVmYXVsdCBUb2tlblN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KK1Rva2VuUmV3cml0ZVN0cmVhbTo6CisgIEEgc3ViY2xhc3Mgb2YgQ29tbW9uVG9rZW5TdHJlYW0sIFRva2VuUmV3cml0ZVN0cmVhbXMgcHJvdmlkZSByZXdyaXRpbmctcGFyc2VycworICB0aGUgYWJpbGl0eSB0byBwcm9kdWNlIG5ldyBvdXRwdXQgdGV4dCBmcm9tIGFuIGlucHV0IHRva2VuLXNlcXVlbmNlIGJ5CisgIG1hbmFnaW5nIHJld3JpdGUgInByb2dyYW1zIiBvbiB0b3Agb2YgdGhlIHN0cmVhbS4KK0NvbW1vblRyZWVOb2RlU3RyZWFtOjoKKyAgSW4gYSBzaW1pbGFyIGZhc2hpb24gdG8gQ29tbW9uVG9rZW5TdHJlYW0sIENvbW1vblRyZWVOb2RlU3RyZWFtIGZlZWRzIHRva2VucworICB0byByZWNvZ25pemVycyBpbiBhIHNlcXVlbnRpYWwgZmFzaGlvbi4gSG93ZXZlciwgdGhlIHN0cmVhbSBvYmplY3Qgc2VyaWFsaXplcworICBhbiBBYnN0cmFjdCBTeW50YXggVHJlZSBpbnRvIGEgZmxhdCwgb25lLWRpbWVuc2lvbmFsIHNlcXVlbmNlLCBidXQgcHJlc2VydmVzCisgIHRoZSB0d28tZGltZW5zaW9uYWwgc2hhcGUgb2YgdGhlIHRyZWUgdXNpbmcgc3BlY2lhbCBVUCBhbmQgRE9XTiB0b2tlbnMuIFRoZQorICBzZXF1ZW5jZSBpcyBwcmltYXJpbHkgdXNlZCBieSBBTlRMUiBUcmVlIFBhcnNlcnMuICpub3RlKiAtLSB0aGlzIGlzIG5vdAorICBkZWZpbmVkIGluIGFudGxyMy9zdHJlYW0ucmIsIGJ1dCBhbnRscjMvdHJlZS5yYgorCistLS0KKworVGhlIG5leHQgZmV3IHNlY3Rpb25zIGNvdmVyIHRoZSBtb3N0IHNpZ25pZmljYW50IG1ldGhvZHMgb2YgYWxsIHN0cmVhbSBjbGFzc2VzLiAKKworPT09IGNvbnN1bWUgLyBsb29rIC8gcGVlaworCis8dHQ+c3RyZWFtLmNvbnN1bWU8L3R0PiBpcyB1c2VkIHRvIGFkdmFuY2UgYSBzdHJlYW0gb25lIHVuaXQuIFN0cmluZ1N0cmVhbXMgYXJlCithZHZhbmNlZCBieSBvbmUgY2hhcmFjdGVyIGFuZCBUb2tlblN0cmVhbXMgYXJlIGFkdmFuY2VkIGJ5IG9uZSB0b2tlbi4KKworPHR0PnN0cmVhbS5wZWVrKGsgPSAxKTwvdHQ+IGlzIHVzZWQgdG8gcXVpY2tseSByZXRyaWV2ZSB0aGUgb2JqZWN0IG9mIGludGVyZXN0Cit0byBhIHJlY29nbml6ZXIgYXQgbG9vay1haGVhZCBwb3NpdGlvbiBzcGVjaWZpZWQgYnkgPHR0Pms8L3R0Pi4gRm9yCis8Yj5TdHJpbmdTdHJlYW1zPC9iPiwgdGhpcyBpcyB0aGUgPGk+aW50ZWdlciB2YWx1ZSBvZiB0aGUgY2hhcmFjdGVyPC9pPgorPHR0Pms8L3R0PiBjaGFyYWN0ZXJzIGFoZWFkIG9mIHRoZSBzdHJlYW0gY3Vyc29yLiBGb3IgPGI+VG9rZW5TdHJlYW1zPC9iPiwgdGhpcworaXMgdGhlIDxpPmludGVnZXIgdG9rZW4gdHlwZSBvZiB0aGUgdG9rZW48L2k+IDx0dD5rPC90dD4gdG9rZW5zIGFoZWFkIG9mIHRoZQorc3RyZWFtIGN1cnNvci4KKworPHR0PnN0cmVhbS5sb29rKGsgPSAxKTwvdHQ+IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGZ1bGwgb2JqZWN0IG9mIGludGVyZXN0IGF0Citsb29rLWFoZWFkIHBvc2l0aW9uIHNwZWNpZmllZCBieSA8dHQ+azwvdHQ+LiBXaGlsZSA8dHQ+cGVlazwvdHQ+IHByb3ZpZGVzIHRoZQorPGk+YmFyZS1taW5pbXVtIGxpZ2h0d2VpZ2h0IGluZm9ybWF0aW9uPC9pPiB0aGF0IHRoZSByZWNvZ25pemVyIG5lZWRzLAorPHR0Pmxvb2s8L3R0PiBwcm92aWRlcyB0aGUgPGk+ZnVsbCBvYmplY3Qgb2YgY29uY2VybjwvaT4gaW4gdGhlIHN0cmVhbS4gRm9yCis8Yj5TdHJpbmdTdHJlYW1zPC9iPiwgdGhpcyBpcyBhIDxpPnN0cmluZyBvYmplY3QgY29udGFpbmluZyB0aGUgc2luZ2xlCitjaGFyYWN0ZXI8L2k+IDx0dD5rPC90dD4gY2hhcmFjdGVycyBhaGVhZCBvZiB0aGUgc3RyZWFtIGN1cnNvci4gRm9yCis8Yj5Ub2tlblN0cmVhbXM8L2I+LCB0aGlzIGlzIHRoZSA8aT5mdWxsIHRva2VuIHN0cnVjdHVyZTwvaT4gPHR0Pms8L3R0PiB0b2tlbnMKK2FoZWFkIG9mIHRoZSBzdHJlYW0gY3Vyc29yLgorCis8Yj5Ob3RlOjwvYj4gaW4gbW9zdCBBTlRMUiBydW50aW1lIEFQSXMgZm9yIG90aGVyIGxhbmd1YWdlcywgPHR0PnBlZWs8L3R0PiBpcworaW1wbGVtZW50ZWQgYnkgc29tZSBtZXRob2Qgd2l0aCBhIG5hbWUgbGlrZSA8dHQ+TEEoayk8L3R0PiBhbmQgPHR0Pmxvb2s8L3R0PiBpcworaW1wbGVtZW50ZWQgYnkgc29tZSBtZXRob2Qgd2l0aCBhIG5hbWUgbGlrZSA8dHQ+TFQoayk8L3R0Pi4gV2hlbiB3cml0aW5nIHRoaXMKK1J1YnkgcnVudGltZSBBUEksIEkgZm91bmQgdGhpcyBuYW1pbmcgcHJhY3RpY2UgYm90aCBjb25mdXNpbmcsIGFtYmlndW91cywgYW5kCit1bi1SdWJ5LWxpa2UuIFRodXMsIEkgY2hvc2UgPHR0PnBlZWs8L3R0PiBhbmQgPHR0Pmxvb2s8L3R0PiB0byByZXByZXNlbnQgYQorcXVpY2stbG9vayAocGVlaykgYW5kIGEgZnVsbC1mbGVkZ2VkIGxvb2stYWhlYWQgb3BlcmF0aW9uIChsb29rKS4gSWYgdGhpcyBjYXVzZXMKK2NvbmZ1c2lvbiBvciBhbnkgc29ydCBvZiBjb21wYXRpYmlsaXR5IHN0cmlmZSBmb3IgZGV2ZWxvcGVycyB1c2luZyB0aGlzCitpbXBsZW1lbnRhdGlvbiwgYWxsIGFwb2xvZ2llcy4KKworPT09IG1hcmsgLyByZXdpbmQgLyByZWxlYXNlCisKKzx0dD5tYXJrZXIgPSBzdHJlYW0ubWFyazwvdHQ+IGNhdXNlcyB0aGUgc3RyZWFtIHRvIHJlY29yZCBpbXBvcnRhbnQgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBjdXJyZW50IHN0cmVhbSBzdGF0ZSwgcGxhY2UgdGhlIGRhdGEgaW4gYW4gaW50ZXJuYWwgbWVtb3J5IHRhYmxlLCBhbmQKK3JldHVybiBhIG1lbWVudG8sIDx0dD5tYXJrZXI8L3R0Pi4gVGhlIG1hcmtlciBvYmplY3QgaXMgdHlwaWNhbGx5IGFuIGludGVnZXIga2V5Cit0byB0aGUgc3RyZWFtJ3MgaW50ZXJuYWwgbWVtb3J5IHRhYmxlLgorCitVc2VkIGluIHRhbmRlbSB3aXRoLCA8dHQ+c3RyZWFtLnJld2luZChtYXJrID0gbGFzdF9tYXJrZXIpPC90dD4sIHRoZSBtYXJrZXIgY2FuCitiZSB1c2VkIHRvIHJlc3RvcmUgdGhlIHN0cmVhbSB0byBhbiBlYXJsaWVyIHN0YXRlLiBUaGlzIGlzIHVzZWQgYnkgcmVjb2duaXplcnMKK3RvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyBiYWNrdHJhY2tpbmcgYW5kIGVycm9yIHJlY292ZXJ5LgorCis8dHQ+c3RyZWFtLnJlbGVhc2UobWFya2VyID0gbGFzdF9tYXJrZXIpPC90dD4gY2FuIGJlIHVzZWQgdG8gcmVsZWFzZSBhbiBleGlzdGluZworc3RhdGUgbWFya2VyIGZyb20gdGhlIG1lbW9yeSB0YWJsZS4KKworPT09IHNlZWsKKworPHR0PnN0cmVhbS5zZWVrKHBvc2l0aW9uKTwvdHQ+IG1vdmVzIHRoZSBzdHJlYW0gY3Vyc29yIHRvIGFuIGFic29sdXRlIHBvc2l0aW9uCit3aXRoaW4gdGhlIHN0cmVhbSwgYmFzaWNhbGx5IGxpa2UgdHlwaWNhbCBydWJ5IDx0dD5JTyNzZWVrPC90dD4gc3R5bGUgbWV0aG9kcy4KK0hvd2V2ZXIsIHVubGlrZSA8dHQ+SU8jc2VlazwvdHQ+LCBBTlRMUiBzdHJlYW1zIGN1cnJlbnRseSBhbHdheXMgdXNlIGFic29sdXRlCitwb3NpdGlvbiBzZWVraW5nLgorCis9PSBUaGUgU3RyZWFtIE1vZHVsZQorCis8dHQ+QU5UTFIzOjpTdHJlYW08L3R0PiBpcyBhbiBhYnN0cmFjdC1pc2ggYmFzZSBtaXhpbiBmb3IgYWxsIElPLWxpa2Ugc3RyZWFtCitjbGFzc2VzIHVzZWQgYnkgQU5UTFIgcmVjb2duaXplcnMuCisKK1RoZSBtb2R1bGUgZG9lc24ndCBkbyBtdWNoIG9uIGl0cyBvd24gYmVzaWRlcyBkZWZpbmUgYXJndWFibHkgYW5ub3lpbmcKK2BgYWJzdHJhY3QnJyBwc2V1ZG8tbWV0aG9kcyB0aGF0IGRlbWFuZCBpbXBsZW1lbnRhdGlvbiB3aGVuIGl0IGlzIG1peGVkIGluIHRvIGEKK2NsYXNzIHRoYXQgd2FudHMgdG8gYmUgYSBTdHJlYW0uIFJpZ2h0IG5vdyB0aGlzIGV4aXN0cyBhcyBhbiBhcnRpZmFjdCBvZiBwb3J0aW5nCit0aGUgQU5UTFIgSmF2YS9QeXRob24gcnVudGltZSBsaWJyYXJ5IHRvIFJ1YnkuIEluIEphdmEsIG9mIGNvdXJzZSwgdGhpcyBpcworcmVwcmVzZW50ZWQgYXMgYW4gaW50ZXJmYWNlLiBJbiBSdWJ5LCBob3dldmVyLCBvYmplY3RzIGFyZSBkdWNrLXR5cGVkIGFuZAoraW50ZXJmYWNlcyBhcmVuJ3QgdGhhdCB1c2VmdWwgYXMgcHJvZ3JhbW1hdGljIGVudGl0aWVzIC0tIGluIGZhY3QsIGl0J3MgbWlsZGx5Cit3YXN0ZWZ1bCB0byBoYXZlIGEgbW9kdWxlIGxpa2UgdGhpcyBoYW5naW5nIG91dC4gVGh1cywgSSBtYXkgYXhlIGl0LgorCitXaGVuIG1peGVkIGluLCBpdCBkb2VzIGdpdmUgdGhlIGNsYXNzIGEgI3NpemUgYW5kICNzb3VyY2VfbmFtZSBhdHRyaWJ1dGUKK21ldGhvZHMuCisKK0V4Y2VwdCBpbiBhIHNtYWxsIGhhbmRmdWwgb2YgcGxhY2VzLCBtb3N0IG9mIHRoZSBBTlRMUiBydW50aW1lIGxpYnJhcnkgdXNlcworZHVjay10eXBpbmcgYW5kIG5vdCB0eXBlIGNoZWNraW5nIG9uIG9iamVjdHMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWV0aG9kcyB3aGljaAorbWFuaXB1bGF0ZSBzdHJlYW0gb2JqZWN0cyBkb24ndCB1c3VhbGx5IGJvdGhlciBjaGVja2luZyB0aGF0IHRoZSBvYmplY3QgaXMgYQorU3RyZWFtIGFuZCBhc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHByb3BlciBzdHJlYW0gaW50ZXJmYWNlLiBUaHVzLAoraXQgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSB0aGF0IGN1c3RvbSBzdHJlYW0gb2JqZWN0cyBpbmNsdWRlIEFOVExSMzo6U3RyZWFtLAordGhvdWdoIGl0IGlzbid0IGEgYmFkIGlkZWEuCisKKz1lbmQKKworbW9kdWxlIFN0cmVhbQorICBpbmNsdWRlIEFOVExSMzo6Q29uc3RhbnRzCisgIGV4dGVuZCBDbGFzc01hY3JvcworICAKKyAgIyMKKyAgIyA6bWV0aG9kOiBjb25zdW1lCisgICMgdXNlZCB0byBhZHZhbmNlIGEgc3RyZWFtIG9uZSB1bml0IChzdWNoIGFzIGNoYXJhY3RlciBvciB0b2tlbikKKyAgYWJzdHJhY3QgOmNvbnN1bWUKKyAgCisgICMjCisgICMgOm1ldGhvZDogcGVlayggayA9IDEgKQorICAjIHVzZWQgdG8gcXVpY2tseSByZXRyZWl2ZSB0aGUgb2JqZWN0IG9mIGludGVyZXN0IHRvIGEgcmVjb2duaXplciBhdCBsb29rYWhlYWQKKyAgIyBwb3NpdGlvbiBzcGVjaWZpZWQgYnkgPHR0Pms8L3R0PiAoc3VjaCBhcyBpbnRlZ2VyIHZhbHVlIG9mIGEgY2hhcmFjdGVyIG9yIGFuCisgICMgaW50ZWdlciB0b2tlbiB0eXBlKQorICBhYnN0cmFjdCA6cGVlaworICAKKyAgIyMKKyAgIyA6bWV0aG9kOiBsb29rKCBrID0gMSApCisgICMgdXNlZCB0byByZXRyZWl2ZSB0aGUgZnVsbCBvYmplY3Qgb2YgaW50ZXJlc3QgYXQgbG9va2FoZWFkIHBvc2l0aW9uIHNwZWNpZmllZAorICAjIGJ5IDx0dD5rPC90dD4gKHN1Y2ggYXMgYSBjaGFyYWN0ZXIgc3RyaW5nIG9yIGEgdG9rZW4gc3RydWN0dXJlKQorICBhYnN0cmFjdCA6bG9vaworICAKKyAgIyMKKyAgIyA6bWV0aG9kOiBtYXJrCisgICMgc2F2ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIHRoZSBwdXJwb3NlcyBvZiBiYWNrdHJhY2tpbmcgYW5kCisgICMgcmV0dXJucyBhIHZhbHVlIHRvIHBhc3MgdG8gI3Jld2luZCBhdCBhIGxhdGVyIHRpbWUKKyAgYWJzdHJhY3QgOm1hcmsKKyAgCisgICMjCisgICMgOm1ldGhvZDogaW5kZXgKKyAgIyByZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBzdHJlYW0KKyAgYWJzdHJhY3QgOmluZGV4CisgIAorICAjIworICAjIDptZXRob2Q6IHJld2luZCggbWFya2VyID0gbGFzdF9tYXJrZXIgKQorICAjIHJlc3RvcmVzIHRoZSBzdHJlYW0gcG9zaXRpb24gdXNpbmcgdGhlIHN0YXRlIGluZm9ybWF0aW9uIHByZXZpb3VzbHkgc2F2ZWQKKyAgIyBieSB0aGUgZ2l2ZW4gbWFya2VyCisgIGFic3RyYWN0IDpyZXdpbmQKKyAgCisgICMjCisgICMgOm1ldGhvZDogcmVsZWFzZSggbWFya2VyID0gbGFzdF9tYXJrZXIgKQorICAjIGNsZWFycyB0aGUgc2F2ZWQgc3RhdGUgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtYXJrZXIgdmFsdWUKKyAgYWJzdHJhY3QgOnJlbGVhc2UKKyAgCisgICMjCisgICMgOm1ldGhvZDogc2VlayggcG9zaXRpb24gKQorICAjIG1vdmUgdGhlIHN0cmVhbSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGUgaW5kZXggZ2l2ZW4gYnkgK3Bvc2l0aW9uKworICBhYnN0cmFjdCA6c2VlaworICAKKyAgIyMKKyAgIyB0aGUgdG90YWwgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIHN0cmVhbQorICBhdHRyX3JlYWRlciA6c2l6ZQorICAKKyAgIyMKKyAgIyBpbmRpY2F0ZXMgYW4gaWRlbnRpZnlpbmcgbmFtZSBmb3IgdGhlIHN0cmVhbSAtLSB1c3VhbGx5IHRoZSBmaWxlIHBhdGggb2YgdGhlIGlucHV0CisgIGF0dHJfYWNjZXNzb3IgOnNvdXJjZV9uYW1lCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpDaGFyYWN0ZXJTdHJlYW0KKworQ2hhcmFjdGVyU3RyZWFtIGZ1cnRoZXIgZXh0ZW5kcyB0aGUgYWJzdHJhY3QtaXNoIGJhc2UgbWl4aW4gU3RyZWFtIHRvIGFkZAorbWV0aG9kcyBzcGVjaWZpYyB0byBuYXZpZ2F0aW5nIGNoYXJhY3Rlci1iYXNlZCBpbnB1dCBkYXRhLiBUaHVzLCBpdCBzZXJ2ZXMgYXMgYW4KK2ltbWl0YXRpb24gb2YgdGhlIEphdmEgaW50ZXJmYWNlIGZvciB0ZXh0LWJhc2VkIHN0cmVhbXMsIHdoaWNoIGFyZSBwcmltYXJpbHkKK3VzZWQgYnkgbGV4ZXJzLgorCitJdCBhZGRzIHRoZSBgYGFic3RyYWN0JycgbWV0aG9kLCA8dHQ+c3Vic3RyaW5nKHN0YXJ0LCBzdG9wKTwvdHQ+LCB3aGljaCBtdXN0IGJlCitpbXBsZW1lbnRlZCB0byByZXR1cm4gYSBzbGljZSBvZiB0aGUgaW5wdXQgc3RyaW5nIGZyb20gcG9zaXRpb24gPHR0PnN0YXJ0PC90dD4KK3RvIHBvc2l0aW9uIDx0dD5zdG9wPC90dD4uIEl0IGFsc28gYWRkcyBhdHRyaWJ1dGUgYWNjZXNzb3IgbWV0aG9kcyA8dHQ+bGluZTwvdHQ+CithbmQgPHR0PmNvbHVtbjwvdHQ+LCB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgYW5kCitwb3NpdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgbGluZSwgcmVzcGVjdGl2ZWx5LgorCis9PSBBIFdvcmQgQWJvdXQgPHR0PmxpbmU8L3R0PiBhbmQgPHR0PmNvbHVtbjwvdHQ+IGF0dHJpYnV0ZXMKKworUHJlc3VtYWJseSwgdGhlIGNvbmNlcHQgb2YgPHR0PmxpbmU8L3R0PiBhbmQgPHR0PmNvbHVtbjwvdHQ+IGF0dGlyYnV0ZXMgb2YgdGV4dAorYXJlIGZhbWlsbGlhciB0byBtb3N0IGRldmVsb3BlcnMuIExpbmUgbnVtYmVycyBvZiB0ZXh0IGFyZSBpbmRleGVkIGZyb20gbnVtYmVyIDEKK3VwIChub3QgMCkuIENvbHVtbiBudW1iZXJzIGFyZSBpbmRleGVkIGZyb20gMCB1cC4gVGh1cywgZXhhbWluaW5nIHNhbXBsZSB0ZXh0OgorCisgIEhleSB0aGlzIGlzIHRoZSBmaXJzdCBsaW5lLgorICBPaCwgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCBsaW5lLgorCitMaW5lIDEgaXMgdGhlIHN0cmluZyAiSGV5IHRoaXMgaXMgdGhlIGZpcnN0IGxpbmVcXG4iLiBJZiBhIGNoYXJhY3RlciBzdHJlYW0gaXMgYXQKK2xpbmUgMiwgY2hhcmFjdGVyIDAsIHRoZSBzdHJlYW0gY3Vyc29yIGlzIHNpdHRpbmcgYmV0d2VlbiB0aGUgY2hhcmFjdGVycyAiXFxuIgorYW5kICJPIi4KKworKk5vdGU6KiBtb3N0IEFOVExSIHJ1bnRpbWUgQVBJcyBmb3Igb3RoZXIgbGFuZ3VhZ2VzIHJlZmVyIHRvIDx0dD5jb2x1bW48L3R0Pgord2l0aCB0aGUgbW9yZS1wcmVjaXNlLCBidXQgbGVuZ3RoeSBuYW1lIDx0dD5jaGFyUG9zaXRpb25JbkxpbmU8L3R0Pi4gSSBwcmVmZXJlZAordG8ga2VlcCBpdCBzaW1wbGUgYW5kIGZhbWlsbGlhciBpbiB0aGlzIFJ1YnkgcnVudGltZSBBUEkuCisKKz1lbmQKKworbW9kdWxlIENoYXJhY3RlclN0cmVhbQorICBpbmNsdWRlIFN0cmVhbQorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgaW5jbHVkZSBDb25zdGFudHMKKyAgCisgICMjCisgICMgOm1ldGhvZDogc3Vic3RyaW5nKHN0YXJ0LHN0b3ApCisgIGFic3RyYWN0IDpzdWJzdHJpbmcKKyAgCisgIGF0dHJfYWNjZXNzb3IgOmxpbmUKKyAgYXR0cl9hY2Nlc3NvciA6Y29sdW1uCitlbmQKKworCis9YmVnaW4gcmRvYyBBTlRMUjM6OlRva2VuU3RyZWFtCisKK1Rva2VuU3RyZWFtIGZ1cnRoZXIgZXh0ZW5kcyB0aGUgYWJzdHJhY3QtaXNoIGJhc2UgbWl4aW4gU3RyZWFtIHRvIGFkZCBtZXRob2RzCitzcGVjaWZpYyB0byBuYXZpZ2F0aW5nIHRva2VuIHNlcXVlbmNlcy4gVGh1cywgaXQgc2VydmVzIGFzIGFuIGltaXRhdGlvbiBvZiB0aGUKK0phdmEgaW50ZXJmYWNlIGZvciB0b2tlbi1iYXNlZCBzdHJlYW1zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IGRpZmZlcmVudAorY29tcG9uZW50cyBpbiBBTlRMUiwgaW5jbHVkaW5nIHBhcnNlcnMgYW5kIHRyZWUgcGFyc2Vycy4KKworPT0gVG9rZW4gU3RyZWFtcworCitUb2tlbiBzdHJlYW1zIHdyYXAgYSBzZXF1ZW5jZSBvZiB0b2tlbiBvYmplY3RzIHByb2R1Y2VkIGJ5IHNvbWUgdG9rZW4gc291cmNlLAordXN1YWxseSBhIGxleGVyLiBUaGV5IHByb3ZpZGUgdGhlIG9wZXJhdGlvbnMgcmVxdWlyZWQgYnkgaGlnaGVyLWxldmVsCityZWNvZ25pemVycywgc3VjaCBhcyBwYXJzZXJzIGFuZCB0cmVlIHBhcnNlcnMgZm9yIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUKK3NlcXVlbmNlIG9mIHRva2Vucy4gVW5saWtlIHNpbXBsZSBjaGFyYWN0ZXItYmFzZWQgc3RyZWFtcywgc3VjaCBhcyBTdHJpbmdTdHJlYW0sCit0b2tlbi1iYXNlZCBzdHJlYW1zIGhhdmUgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBjb21wbGV4aXR5IGJlY2F1c2UgdGhleSBtdXN0CittYW5hZ2UgdGhlIHRhc2sgb2YgInR1bmluZyIgdG8gYSBzcGVjaWZpYyB0b2tlbiBjaGFubmVsLgorCitPbmUgb2YgdGhlIG1haW4gYWR2YW50YWdlcyBvZiBBTlRMUi1iYXNlZCByZWNvZ25pdGlvbiBpcyB0aGUgdG9rZW4KKzxpPmNoYW5uZWw8L2k+IGZlYXR1cmUsIHdoaWNoIGFsbG93cyB5b3UgdG8gaG9sZCBvbiB0byBhbGwgdG9rZW5zIG9mIGludGVyZXN0Cit3aGlsZSBvbmx5IHByZXNlbnRpbmcgYSBzcGVjaWZpYyBzZXQgb2YgaW50ZXJlc3RpbmcgdG9rZW5zIHRvIGEgcGFyc2VyLiBGb3IKK2V4YW1wbGUsIGlmIHlvdSBuZWVkIHRvIGhpZGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgZnJvbSBhIHBhcnNlciwgYnV0IGhhbmcgb24KK3RvIHRoZW0gZm9yIHNvbWUgb3RoZXIgcHVycG9zZSwgeW91IGhhdmUgdGhlIGxleGVyIGFzc2lnbiB0aGUgY29tbWVudHMgYW5kCit3aGl0ZXNwYWNlIHRvIGNoYW5uZWwgdmFsdWUgSElEREVOIGFzIGl0IGNyZWF0ZXMgdGhlIHRva2Vucy4KKworV2hlbiB5b3UgY3JlYXRlIGEgdG9rZW4gc3RyZWFtLCB5b3UgY2FuIHR1bmUgaXQgdG8gc29tZSBzcGVjaWZpYyBjaGFubmVsIHZhbHVlLgorVGhlbiwgYWxsIDx0dD5wZWVrPC90dD4sIDx0dD5sb29rPC90dD4sIGFuZCA8dHQ+Y29uc3VtZTwvdHQ+IG9wZXJhdGlvbnMgb25seQoreWllbGQgdG9rZW5zIHRoYXQgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBmb3IgPHR0PmNoYW5uZWw8L3R0Pi4gVGhlIHN0cmVhbSBza2lwcworb3ZlciBhbnkgbm9uLW1hdGNoaW5nIHRva2VucyBpbiBiZXR3ZWVuLgorCis9PSBUaGUgVG9rZW5TdHJlYW0gSW50ZXJmYWNlCisKK0luIGFkZGl0aW9uIHRvIHRoZSBhYnN0cmFjdCBtZXRob2RzIGFuZCBhdHRyaWJ1dGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgYmFzZQorU3RyZWFtIG1vZHVsZSwgVG9rZW5TdHJlYW0gYWRkcyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgorcmVxdWlyZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLgorCis9ZW5kCisKK21vZHVsZSBUb2tlblN0cmVhbQorICBpbmNsdWRlIFN0cmVhbQorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgCisgICMjCisgICMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSB0b2tlbiBzb3VyY2Ugb2JqZWN0IChzdWNoIGFzIGEgbGV4ZXIpIGZyb20gd2hpY2gKKyAgIyBhbGwgdG9rZW5zIGluIHRoZSBzdHJlYW0gd2VyZSByZXRyZWl2ZWQKKyAgYXR0cl9yZWFkZXIgOnRva2VuX3NvdXJjZQorICAKKyAgIyMKKyAgIyBleHBlY3RlZCB0byByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1hcmtlciBwcm9kdWNlZCBieSBhIGNhbGwgdG8gCisgICMgPHR0PnN0cmVhbS5tYXJrPC90dD4KKyAgYXR0cl9yZWFkZXIgOmxhc3RfbWFya2VyCisgIAorICAjIworICAjIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgaW50ZWdlciBpbmRleCBvZiB0aGUgc3RyZWFtIGN1cnNvcgorICBhdHRyX3JlYWRlciA6cG9zaXRpb24KKyAgCisgICMjCisgICMgdGhlIGludGVnZXIgY2hhbm5lbCB2YWx1ZSB0byB3aGljaCB0aGUgc3RyZWFtIGlzIGBgdHVuZWQnJworICBhdHRyX2FjY2Vzc29yIDpjaGFubmVsCisgIAorICAjIworICAjIDptZXRob2Q6IHRvX3Moc3RhcnQ9MCxzdG9wPXRva2Vucy5sZW5ndGgtMSkKKyAgIyBzaG91bGQgdGFrZSB0aGUgdG9rZW5zIGJldHdlZW4gc3RhcnQgYW5kIHN0b3AgaW4gdGhlIHNlcXVlbmNlLCBleHRyYWN0IHRoZWlyIHRleHQKKyAgIyBhbmQgcmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCB0aGUgdGV4dCBjaHVua3MKKyAgYWJzdHJhY3QgOnRvX3MKKyAgCisgICMjCisgICMgOm1ldGhvZDogYXQoIGkgKQorICAjIHJldHVybiB0aGUgc3RyZWFtIHN5bWJvbCBhdCBpbmRleCAraSsKKyAgYWJzdHJhY3QgOmF0CitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpTdHJpbmdTdHJlYW0KKworQSBTdHJpbmdTdHJlYW0ncyBwdXJwb3NlIGlzIHRvIHdyYXAgdGhlIGJhc2ljLCBuYWtlZCB0ZXh0IGlucHV0IG9mIGEgcmVjb2duaXRpb24KK3N5c3RlbS4gTGlrZSBhbGwgb3RoZXIgc3RyZWFtIHR5cGVzLCBpdCBwcm92aWRlcyBzZXJpYWwgbmF2aWdhdGlvbiBvZiB0aGUgaW5wdXQ7CithIHJlY29nbml6ZXIgY2FuIGFyYml0cmFyaWx5IHN0ZXAgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCB0aGUgc3RyZWFtJ3MKK3N5bWJvbHMgYXMgaXQgcmVxdWlyZXMuIFN0cmluZ1N0cmVhbSBhbmQgaXRzIHN1YmNsYXNzZXMgYXJlIHRoZXkgbWFpbiB3YXkgdG8KK2ZlZWQgdGV4dCBpbnB1dCBpbnRvIGFuIEFOVExSIExleGVyIGZvciB0b2tlbiBwcm9jZXNzaW5nLgorCitUaGUgc3RyZWFtJ3Mgc3ltYm9scyBvZiBpbnRlcmVzdCwgb2YgY291cnNlLCBhcmUgY2hhcmFjdGVyIHZhbHVlcy4gVGh1cywgdGhlCisjcGVlayBtZXRob2QgcmV0dXJucyB0aGUgaW50ZWdlciBjaGFyYWN0ZXIgdmFsdWUgYXQgbG9vay1haGVhZCBwb3NpdGlvbgorPHR0Pms8L3R0PiBhbmQgdGhlICNsb29rIG1ldGhvZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgdmFsdWUgYXMgYSArU3RyaW5nKy4gVGhleQorYWxzbyB0cmFjayB2YXJpb3VzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBhdAordGhlIGN1cnJlbnQgcG9zaXRpb24uCisKKz09PSBOb3RlIEFib3V0IFRleHQgRW5jb2RpbmcKKworVGhpcyB2ZXJzaW9uIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgcHJpbWFyaWx5IHRhcmdldHMgcnVieSB2ZXJzaW9uIDEuOCwgd2hpY2gKK2RvZXMgbm90IGhhdmUgc3Ryb25nIGJ1aWx0LWluIHN1cHBvcnQgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVyIGVuY29kaW5ncy4gVGh1cywKK2NoYXJhY3RlcnMgYXJlIGFzc3VtZWQgdG8gYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgYnl0ZSAtLSBhbiBpbnRlZ2VyIGJldHdlZW4KKzAgYW5kIDI1NS4gUnVieSAxLjkgZG9lcyBwcm92aWRlIGJ1aWx0LWluIGVuY29kaW5nIHN1cHBvcnQgZm9yIG11bHRpLWJ5dGUKK2NoYXJhY3RlcnMsIGJ1dCBjdXJyZW50bHkgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IHByb3ZpZGUgYW55IHN0cmVhbXMgdG8gaGFuZGxlCitub24tQVNDSUkgZW5jb2RpbmcuIEhvd2V2ZXIsIGVuY29kaW5nLXNhdnZ5IHJlY29nbml0aW9uIGNvZGUgaXMgYSBmdXR1cmUKK2RldmVsb3BtZW50IGdvYWwgZm9yIHRoaXMgcHJvamVjdC4KKworPWVuZAorCitjbGFzcyBTdHJpbmdTdHJlYW0KKyAgTkVXTElORSA9ID9cbi5vcmQKKyAgCisgIGluY2x1ZGUgQ2hhcmFjdGVyU3RyZWFtCisgIAorICAjIGN1cnJlbnQgaW50ZWdlciBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIHN0cmVhbQorICBhdHRyX3JlYWRlciA6cG9zaXRpb24KKyAgCisgICMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2YgdGhlIGlucHV0LCBpbmRleGVkIHVwd2FyZCBmcm9tIDEKKyAgYXR0cl9yZWFkZXIgOmxpbmUKKyAgCisgICMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHBvc2l0aW9uIHdpdGhpbiB0aGUgY3VycmVudCBsaW5lLCBpbmRleGVkIHVwd2FyZCBmcm9tIDAKKyAgYXR0cl9yZWFkZXIgOmNvbHVtbgorICAKKyAgIyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbSAtLSB1c3VhbGx5IGEgZmlsZSBuYW1lCisgICMgZGVmYXVsdHMgdG8gPHR0PiIoc3RyaW5nKSI8L3R0PgorICBhdHRyX2FjY2Vzc29yIDpuYW1lCisgIAorICAjIHRoZSBlbnRpcmUgc3RyaW5nIHRoYXQgaXMgd3JhcHBlZCBieSB0aGUgc3RyZWFtCisgIGF0dHJfcmVhZGVyIDpkYXRhCisgIGF0dHJfcmVhZGVyIDpzdHJpbmcKKyAgCisgIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjkvCisgICAgCisgICAgIyBjcmVhdGVzIGEgbmV3IFN0cmluZ1N0cmVhbSBvYmplY3Qgd2hlcmUgK2RhdGErIGlzIHRoZSBzdHJpbmcgZGF0YSB0byBzdHJlYW0uCisgICAgIyBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBpbiBhIHN5bWJvbC10by12YWx1ZSBoYXNoOgorICAgICMKKyAgICAjIFs6ZmlsZSBvciA6bmFtZV0gdGhlIChmaWxlKSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzdHJlYW07IGRlZmF1bHQ6IDx0dD4nKHN0cmluZyknPC90dD4KKyAgICAjIFs6bGluZV0gdGhlIGluaXRpYWwgbGluZSBudW1iZXI7IGRlZmF1bHQ6ICsxKworICAgICMgWzpjb2x1bW5dIHRoZSBpbml0aWFsIGNvbHVtbiBudW1iZXI7IGRlZmF1bHQ6ICswKworICAgICMgCisgICAgZGVmIGluaXRpYWxpemUoIGRhdGEsIG9wdGlvbnMgPSB7fSApICAgICAgIyBmb3IgMS45CisgICAgICBAc3RyaW5nICAgPSBkYXRhLnRvX3MuZW5jb2RlKCBFbmNvZGluZzo6VVRGXzggKS5mcmVlemUKKyAgICAgIEBkYXRhICAgICA9IEBzdHJpbmcuY29kZXBvaW50cy50b19hLmZyZWV6ZQorICAgICAgQHBvc2l0aW9uID0gb3B0aW9ucy5mZXRjaCA6cG9zaXRpb24sIDAKKyAgICAgIEBsaW5lICAgICA9IG9wdGlvbnMuZmV0Y2ggOmxpbmUsIDEKKyAgICAgIEBjb2x1bW4gICA9IG9wdGlvbnMuZmV0Y2ggOmNvbHVtbiwgMAorICAgICAgQG1hcmtlcnMgID0gW10KKyAgICAgIEBuYW1lICAgfHw9IG9wdGlvbnNbIDpmaWxlIF0gfHwgb3B0aW9uc1sgOm5hbWUgXSAjIHx8ICcoc3RyaW5nKScKKyAgICAgIG1hcmsKKyAgICBlbmQKKyAgICAKKyAgICAjCisgICAgIyBpZGVudGljYWwgdG8gI3BlZWssIGV4Y2VwdCBpdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgdmFsdWUgYXMgYSBTdHJpbmcKKyAgICAjIAorICAgIGRlZiBsb29rKCBrID0gMSApICAgICAgICAgICAgICAgIyBmb3IgMS45CisgICAgICBrID09IDAgYW5kIHJldHVybiBuaWwKKyAgICAgIGsgKz0gMSBpZiBrIDwgMAorICAgICAgCisgICAgICBpbmRleCA9IEBwb3NpdGlvbiArIGsgLSAxCisgICAgICBpbmRleCA8IDAgYW5kIHJldHVybiBuaWwKKyAgICAgIAorICAgICAgQHN0cmluZ1sgaW5kZXggXQorICAgIGVuZAorICAgIAorICBlbHNlCisgICAgCisgICAgIyBjcmVhdGVzIGEgbmV3IFN0cmluZ1N0cmVhbSBvYmplY3Qgd2hlcmUgK2RhdGErIGlzIHRoZSBzdHJpbmcgZGF0YSB0byBzdHJlYW0uCisgICAgIyBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBpbiBhIHN5bWJvbC10by12YWx1ZSBoYXNoOgorICAgICMKKyAgICAjIFs6ZmlsZSBvciA6bmFtZV0gdGhlIChmaWxlKSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzdHJlYW07IGRlZmF1bHQ6IDx0dD4nKHN0cmluZyknPC90dD4KKyAgICAjIFs6bGluZV0gdGhlIGluaXRpYWwgbGluZSBudW1iZXI7IGRlZmF1bHQ6ICsxKworICAgICMgWzpjb2x1bW5dIHRoZSBpbml0aWFsIGNvbHVtbiBudW1iZXI7IGRlZmF1bHQ6ICswKworICAgICMgCisgICAgZGVmIGluaXRpYWxpemUoIGRhdGEsIG9wdGlvbnMgPSB7fSApICAgICMgZm9yIDEuOAorICAgICAgQGRhdGEgPSBkYXRhLnRvX3MKKyAgICAgIEBkYXRhLmVxdWFsPyggZGF0YSApIGFuZCBAZGF0YSA9IEBkYXRhLmNsb25lCisgICAgICBAZGF0YS5mcmVlemUKKyAgICAgIEBzdHJpbmcgPSBAZGF0YQorICAgICAgQHBvc2l0aW9uID0gb3B0aW9ucy5mZXRjaCA6cG9zaXRpb24sIDAKKyAgICAgIEBsaW5lID0gb3B0aW9ucy5mZXRjaCA6bGluZSwgMQorICAgICAgQGNvbHVtbiA9IG9wdGlvbnMuZmV0Y2ggOmNvbHVtbiwgMAorICAgICAgQG1hcmtlcnMgPSBbXQorICAgICAgQG5hbWUgfHw9IG9wdGlvbnNbIDpmaWxlIF0gfHwgb3B0aW9uc1sgOm5hbWUgXSAjIHx8ICcoc3RyaW5nKScKKyAgICAgIG1hcmsKKyAgICBlbmQKKyAgICAKKyAgICAjCisgICAgIyBpZGVudGljYWwgdG8gI3BlZWssIGV4Y2VwdCBpdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgdmFsdWUgYXMgYSBTdHJpbmcKKyAgICAjIAorICAgIGRlZiBsb29rKCBrID0gMSApICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgMS44CisgICAgICBrID09IDAgYW5kIHJldHVybiBuaWwKKyAgICAgIGsgKz0gMSBpZiBrIDwgMAorICAgICAgCisgICAgICBpbmRleCA9IEBwb3NpdGlvbiArIGsgLSAxCisgICAgICBpbmRleCA8IDAgYW5kIHJldHVybiBuaWwKKyAgICAgIAorICAgICAgYyA9IEBkYXRhWyBpbmRleCBdIGFuZCBjLmNocgorICAgIGVuZAorICAgIAorICBlbmQKKyAgCisgIGRlZiBzaXplCisgICAgQGRhdGEubGVuZ3RoCisgIGVuZAorICAKKyAgYWxpYXMgbGVuZ3RoIHNpemUKKyAgCisgICMgCisgICMgcmV3aW5kcyB0aGUgc3RyZWFtIGJhY2sgdG8gdGhlIHN0YXJ0IGFuZCBjbGVhcnMgb3V0IGFueSBleGlzdGluZyBtYXJrZXIgZW50cmllcworICAjIAorICBkZWYgcmVzZXQKKyAgICBpbml0aWFsX2xvY2F0aW9uID0gQG1hcmtlcnMuZmlyc3QKKyAgICBAcG9zaXRpb24sIEBsaW5lLCBAY29sdW1uID0gaW5pdGlhbF9sb2NhdGlvbgorICAgIEBtYXJrZXJzLmNsZWFyCisgICAgQG1hcmtlcnMgPDwgaW5pdGlhbF9sb2NhdGlvbgorICAgIHJldHVybiBzZWxmCisgIGVuZAorICAKKyAgIworICAjIGFkdmFuY2UgdGhlIHN0cmVhbSBieSBvbmUgY2hhcmFjdGVyOyByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgY29uc3VtZWQKKyAgIyAKKyAgZGVmIGNvbnN1bWUKKyAgICBjID0gQGRhdGFbIEBwb3NpdGlvbiBdIHx8IEVPRgorICAgIGlmIEBwb3NpdGlvbiA8IEBkYXRhLmxlbmd0aAorICAgICAgQGNvbHVtbiArPSAxCisgICAgICBpZiBjID09IE5FV0xJTkUKKyAgICAgICAgQGxpbmUgKz0gMQorICAgICAgICBAY29sdW1uID0gMAorICAgICAgZW5kCisgICAgICBAcG9zaXRpb24gKz0gMQorICAgIGVuZAorICAgIHJldHVybiggYyApCisgIGVuZAorICAKKyAgIworICAjIHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IGxvb2stYWhlYWQgZGlzdGFuY2UgK2srIGFzIGFuIGludGVnZXIuIDx0dD5rID0gMTwvdHQ+IHJlcHJlc2VudHMKKyAgIyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuICtrKyBncmVhdGVyIHRoYW4gMSByZXByZXNlbnRzIHVwY29taW5nIGNoYXJhY3RlcnMuIEEgbmVnYXRpdmUKKyAgIyB2YWx1ZSBvZiAraysgcmV0dXJucyBwcmV2aW91cyBjaGFyYWN0ZXJzIGNvbnN1bWVkLCB3aGVyZSA8dHQ+ayA9IC0xPC90dD4gaXMgdGhlIGxhc3QKKyAgIyBjaGFyYWN0ZXIgY29uc3VtZWQuIDx0dD5rID0gMDwvdHQ+IGhhcyB1bmRlZmluZWQgYmVoYXZpb3IgYW5kIHJldHVybnMgK25pbCsKKyAgIyAKKyAgZGVmIHBlZWsoIGsgPSAxICkKKyAgICBrID09IDAgYW5kIHJldHVybiBuaWwKKyAgICBrICs9IDEgaWYgayA8IDAKKyAgICBpbmRleCA9IEBwb3NpdGlvbiArIGsgLSAxCisgICAgaW5kZXggPCAwIGFuZCByZXR1cm4gbmlsCisgICAgQGRhdGFbIGluZGV4IF0gb3IgRU9GCisgIGVuZAorICAKKyAgIworICAjIHJldHVybiBhIHN1YnN0cmluZyBhcm91bmQgdGhlIHN0cmVhbSBjdXJzb3IgYXQgYSBkaXN0YW5jZSAraysKKyAgIyBpZiA8dHQ+ayA+PSAwPC90dD4sIHJldHVybiB0aGUgbmV4dCBrIGNoYXJhY3RlcnMKKyAgIyBpZiA8dHQ+ayA8IDA8L3R0PiwgcmV0dXJuIHRoZSBwcmV2aW91cyA8dHQ+fGt8PC90dD4gY2hhcmFjdGVycworICAjIAorICBkZWYgdGhyb3VnaCggayApCisgICAgaWYgayA+PSAwIHRoZW4gQHN0cmluZ1sgQHBvc2l0aW9uLCBrIF0gZWxzZQorICAgICAgc3RhcnQgPSAoIEBwb3NpdGlvbiArIGsgKS5hdF9sZWFzdCggMCApICMgc3RhcnQgY2Fubm90IGJlIG5lZ2F0aXZlIG9yIGluZGV4IHdpbGwgd3JhcCBhcm91bmQKKyAgICAgIEBzdHJpbmdbIHN0YXJ0IC4uLiBAcG9zaXRpb24gXQorICAgIGVuZAorICBlbmQKKyAgCisgICMgb3BlcmF0b3Igc3R5bGUgbG9vay1haGVhZAorICBhbGlhcyA+PiBsb29rCisgIAorICAjIG9wZXJhdG9yIHN0eWxlIGxvb2stYmVoaW5kCisgIGRlZiA8PCggayApCisgICAgc2VsZiA8PCAtaworICBlbmQKKyAgCisgIGFsaWFzIGluZGV4IHBvc2l0aW9uCisgIGFsaWFzIGNoYXJhY3Rlcl9pbmRleCBwb3NpdGlvbgorICAKKyAgYWxpYXMgc291cmNlX25hbWUgbmFtZQorICAKKyAgIworICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGFwcGVhcnMgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBsaW5lLgorICAjIFRoaXMgaXMgYW4gZXh0cmEgdXRpbGl0eSBtZXRob2QgZm9yIHVzZSBpbnNpZGUgbGV4ZXIgYWN0aW9ucyBpZiBuZWVkZWQuCisgICMgCisgIGRlZiBiZWdpbm5pbmdfb2ZfbGluZT8KKyAgICBAcG9zaXRpb24uemVybz8gb3IgQGRhdGFbIEBwb3NpdGlvbiAtIDEgXSA9PSBORVdMSU5FCisgIGVuZAorICAKKyAgIworICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGFwcGVhcnMgdG8gYmUgYXQgdGhlIGVuZCBvZiBhIG5ldyBsaW5lLgorICAjIFRoaXMgaXMgYW4gZXh0cmEgdXRpbGl0eSBtZXRob2QgZm9yIHVzZSBpbnNpZGUgbGV4ZXIgYWN0aW9ucyBpZiBuZWVkZWQuCisgICMgCisgIGRlZiBlbmRfb2ZfbGluZT8KKyAgICBAZGF0YVsgQHBvc2l0aW9uIF0gPT0gTkVXTElORSAjaWYgQHBvc2l0aW9uIDwgQGRhdGEubGVuZ3RoCisgIGVuZAorICAKKyAgIworICAjIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgIyBUaGlzIGlzIGFuIGV4dHJhIHV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW5zaWRlIGxleGVyIGFjdGlvbnMgaWYgbmVlZGVkLgorICAjIAorICBkZWYgZW5kX29mX3N0cmluZz8KKyAgICBAcG9zaXRpb24gPj0gQGRhdGEubGVuZ3RoCisgIGVuZAorCisgICMKKyAgIyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBhcHBlYXJzIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJlYW0gKHBvc2l0aW9uID0gMCkuCisgICMgVGhpcyBpcyBhbiBleHRyYSB1dGlsaXR5IG1ldGhvZCBmb3IgdXNlIGluc2lkZSBsZXhlciBhY3Rpb25zIGlmIG5lZWRlZC4KKyAgIyAKKyAgZGVmIGJlZ2lubmluZ19vZl9zdHJpbmc/CisgICAgQHBvc2l0aW9uID09IDAKKyAgZW5kCisgIAorICBhbGlhcyBlb2Y/IGVuZF9vZl9zdHJpbmc/CisgIGFsaWFzIGJvZj8gYmVnaW5uaW5nX29mX3N0cmluZz8KKyAgCisgICMKKyAgIyByZWNvcmQgdGhlIGN1cnJlbnQgc3RyZWFtIGxvY2F0aW9uIHBhcmFtZXRlcnMgaW4gdGhlIHN0cmVhbSdzIG1hcmtlciB0YWJsZSBhbmQKKyAgIyByZXR1cm4gYW4gaW50ZWdlci12YWx1ZWQgYm9va21hcmsgdGhhdCBtYXkgYmUgdXNlZCB0byByZXN0b3JlIHRoZSBzdHJlYW0ncworICAjIHBvc2l0aW9uIHdpdGggdGhlICNyZXdpbmQgbWV0aG9kLiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCBiYWNrdHJhY2tpbmcuCisgICMgCisgIGRlZiBtYXJrCisgICAgc3RhdGUgPSBbIEBwb3NpdGlvbiwgQGxpbmUsIEBjb2x1bW4gXS5mcmVlemUKKyAgICBAbWFya2VycyA8PCBzdGF0ZQorICAgIHJldHVybiBAbWFya2Vycy5sZW5ndGggLSAxCisgIGVuZAorICAKKyAgIworICAjIHJlc3RvcmUgdGhlIHN0cmVhbSB0byBhbiBlYXJsaWVyIGxvY2F0aW9uIHJlY29yZGVkIGJ5ICNtYXJrLiBJZiBubyBtYXJrZXIgdmFsdWUgaXMKKyAgIyBwcm92aWRlZCwgdGhlIGxhc3QgbWFya2VyIGdlbmVyYXRlZCBieSAjbWFyayB3aWxsIGJlIHVzZWQuCisgICMgCisgIGRlZiByZXdpbmQoIG1hcmtlciA9IEBtYXJrZXJzLmxlbmd0aCAtIDEsIHJlbGVhc2UgPSB0cnVlICkKKyAgICAoIG1hcmtlciA+PSAwIGFuZCBsb2NhdGlvbiA9IEBtYXJrZXJzWyBtYXJrZXIgXSApIG9yIHJldHVybiggc2VsZiApCisgICAgQHBvc2l0aW9uLCBAbGluZSwgQGNvbHVtbiA9IGxvY2F0aW9uCisgICAgcmVsZWFzZSggbWFya2VyICkgaWYgcmVsZWFzZQorICAgIHJldHVybiBzZWxmCisgIGVuZAorICAKKyAgIworICAjIHRoZSB0b3RhbCBudW1iZXIgb2YgbWFya2VycyBjdXJyZW50bHkgaW4gZXhpc3RlbmNlCisgICMgCisgIGRlZiBtYXJrX2RlcHRoCisgICAgQG1hcmtlcnMubGVuZ3RoCisgIGVuZAorICAKKyAgIworICAjIHRoZSBsYXN0IG1hcmtlciB2YWx1ZSBjcmVhdGVkIGJ5IGEgY2FsbCB0byAjbWFyaworICAjIAorICBkZWYgbGFzdF9tYXJrZXIKKyAgICBAbWFya2Vycy5sZW5ndGggLSAxCisgIGVuZAorICAKKyAgIworICAjIGxldCBnbyBvZiB0aGUgYm9va21hcmsgZGF0YSBmb3IgdGhlIG1hcmtlciBhbmQgYWxsIG1hcmtlcgorICAjIHZhbHVlcyBjcmVhdGVkIGFmdGVyIHRoZSBtYXJrZXIuCisgICMgCisgIGRlZiByZWxlYXNlKCBtYXJrZXIgPSBAbWFya2Vycy5sZW5ndGggLSAxICkKKyAgICBtYXJrZXIuYmV0d2Vlbj8oIDEsIEBtYXJrZXJzLmxlbmd0aCAtIDEgKSBvciByZXR1cm4KKyAgICBAbWFya2Vycy5wb3AoIEBtYXJrZXJzLmxlbmd0aCAtIG1hcmtlciApCisgICAgcmV0dXJuIHNlbGYKKyAgZW5kCisgIAorICAjCisgICMganVtcCB0byB0aGUgYWJzb2x1dGUgcG9zaXRpb24gdmFsdWUgZ2l2ZW4gYnkgK2luZGV4Ky4KKyAgIyBub3RlOiBpZiAraW5kZXgrIGlzIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiwgdGhlICtsaW5lKyBhbmQgK2NvbHVtbisKKyAgIyAgICAgICBhdHRyaWJ1dGVzIG9mIHRoZSBzdHJlYW0gd2lsbCBwcm9iYWJseSBiZSBpbmNvcnJlY3QKKyAgIyAKKyAgZGVmIHNlZWsoIGluZGV4ICkKKyAgICBpbmRleCA9IGluZGV4LmJvdW5kKCAwLCBAZGF0YS5sZW5ndGggKSAgIyBlbnN1cmVzIGluZGV4IGlzIHdpdGhpbiB0aGUgc3RyZWFtJ3MgcmFuZ2UKKyAgICBpZiBpbmRleCA+IEBwb3NpdGlvbgorICAgICAgc2tpcHBlZCA9IHRocm91Z2goIGluZGV4IC0gQHBvc2l0aW9uICkKKyAgICAgIGlmIGxjID0gc2tpcHBlZC5jb3VudCggIlxuIiApIGFuZCBsYy56ZXJvPworICAgICAgICBAY29sdW1uICs9IHNraXBwZWQubGVuZ3RoCisgICAgICBlbHNlCisgICAgICAgIEBsaW5lICs9IGxjCisgICAgICAgIEBjb2x1bW4gPSBza2lwcGVkLmxlbmd0aCAtIHNraXBwZWQucmluZGV4KCAiXG4iICkgLSAxCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBAcG9zaXRpb24gPSBpbmRleAorICAgIHJldHVybiBuaWwKKyAgZW5kCisgIAorICAjIAorICAjIGN1c3RvbWl6ZWQgb2JqZWN0IGluc3BlY3Rpb24gdGhhdCBzaG93czoKKyAgIyAqIHRoZSBzdHJlYW0gY2xhc3MKKyAgIyAqIHRoZSBzdHJlYW0ncyBsb2NhdGlvbiBpbiA8dHQ+aW5kZXggLyBsaW5lOmNvbHVtbjwvdHQ+IGZvcm1hdAorICAjICogK2JlZm9yZV9jaGFycysgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGN1cnNvciAoNiBjaGFyYWN0ZXJzIGJ5IGRlZmF1bHQpCisgICMgKiArYWZ0ZXJfY2hhcnMrIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGN1cnNvciAoMTAgY2hhcmFjdGVycyBieSBkZWZhdWx0KQorICAjIAorICBkZWYgaW5zcGVjdCggYmVmb3JlX2NoYXJzID0gNiwgYWZ0ZXJfY2hhcnMgPSAxMCApCisgICAgYmVmb3JlID0gdGhyb3VnaCggLWJlZm9yZV9jaGFycyApLmluc3BlY3QKKyAgICBAcG9zaXRpb24gLSBiZWZvcmVfY2hhcnMgPiAwIGFuZCBiZWZvcmUuaW5zZXJ0KCAwLCAnLi4uICcgKQorICAgIAorICAgIGFmdGVyID0gdGhyb3VnaCggYWZ0ZXJfY2hhcnMgKS5pbnNwZWN0CisgICAgQHBvc2l0aW9uICsgYWZ0ZXJfY2hhcnMgKyAxIDwgQGRhdGEubGVuZ3RoIGFuZCBhZnRlciA8PCAnIC4uLicKKyAgICAKKyAgICBsb2NhdGlvbiA9ICIjQHBvc2l0aW9uIC8gbGluZSAjQGxpbmU6I0Bjb2x1bW4iCisgICAgIiM8I3sgc2VsZi5jbGFzcyB9OiAjeyBiZWZvcmUgfSB8ICN7IGFmdGVyIH0gQCAjeyBsb2NhdGlvbiB9PiIKKyAgZW5kCisgIAorICAjCisgICMgcmV0dXJuIHRoZSBzdHJpbmcgc2xpY2UgYmV0d2VlbiBwb3NpdGlvbiArc3RhcnQrIGFuZCArc3RvcCsKKyAgIyAKKyAgZGVmIHN1YnN0cmluZyggc3RhcnQsIHN0b3AgKQorICAgIEBzdHJpbmdbIHN0YXJ0LCBzdG9wIC0gc3RhcnQgKyAxIF0KKyAgZW5kCisgIAorICAjCisgICMgaWRlbnRpY2FsIHRvIFN0cmluZyNbXQorICAjIAorICBkZWYgW10oIHN0YXJ0LCAqYXJncyApCisgICAgQHN0cmluZ1sgc3RhcnQsICphcmdzIF0KKyAgZW5kCitlbmQKKworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkZpbGVTdHJlYW0KKworRmlsZVN0cmVhbSBpcyBhIGNoYXJhY3RlciBzdHJlYW0gdGhhdCB1c2VzIGRhdGEgc3RvcmVkIGluIHNvbWUgZXh0ZXJuYWwgZmlsZS4gSXQKK2lzIG5lYXJseSBpZGVudGljYWwgdG8gU3RyaW5nU3RyZWFtIGFuZCBmdW5jdGlvbnMgYXMgdXNlIGRhdGEgbG9jYXRlZCBpbiBhIGZpbGUKK3doaWxlIGF1dG9tYXRpY2FsbHkgc2V0dGluZyB1cCB0aGUgK3NvdXJjZV9uYW1lKyBhbmQgK2xpbmUrIHBhcmFtZXRlcnMuIEl0IGRvZXMKK25vdCBhY3R1YWxseSB1c2UgYW55IGJ1ZmZlcmVkIElPIG9wZXJhdGlvbnMgdGhyb3VnaG91dCB0aGUgc3RyZWFtIG5hdmlnYXRpb24KK3Byb2Nlc3MuIEluc3RlYWQsIGl0IHJlYWRzIHRoZSBmaWxlIGRhdGEgb25jZSB3aGVuIHRoZSBzdHJlYW0gaXMgaW5pdGlhbGl6ZWQuCisKKz1lbmQKKworY2xhc3MgRmlsZVN0cmVhbSA8IFN0cmluZ1N0cmVhbQorICAKKyAgIworICAjIGNyZWF0ZXMgYSBuZXcgRmlsZVN0cmVhbSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuICtmaWxlKyBvYmplY3QuCisgICMgSWYgK2ZpbGUrIGlzIGEgcGF0aCBzdHJpbmcsIHRoZSBmaWxlIHdpbGwgYmUgcmVhZCBhbmQgdGhlIGNvbnRlbnRzCisgICMgd2lsbCBiZSB1c2VkIGFuZCB0aGUgK25hbWUrIGF0dHJpYnV0ZSB3aWxsIGJlIHNldCB0byB0aGUgcGF0aC4KKyAgIyBJZiArZmlsZSsgaXMgYW4gSU8tbGlrZSBvYmplY3QgKHRoYXQgcmVzcG9uZHMgdG8gOnJlYWQpLAorICAjIHRoZSBjb250ZW50IG9mIHRoZSBvYmplY3Qgd2lsbCBiZSB1c2VkIGFuZCB0aGUgc3RyZWFtIHdpbGwKKyAgIyBhdHRlbXB0IHRvIHNldCBpdHMgK25hbWUrIG9iamVjdCBmaXJzdCB0cnlpbmcgdGhlIG1ldGhvZCAjbmFtZQorICAjIG9uIHRoZSBvYmplY3QsIHRoZW4gdHJ5aW5nIHRoZSBtZXRob2QgI3BhdGggb24gdGhlIG9iamVjdC4KKyAgIworICAjIHNlZSBTdHJpbmdTdHJlYW0ubmV3IGZvciBhIGxpc3Qgb2YgYWRkaXRpb25hbCBvcHRpb25zCisgICMgdGhlIGNvbnN0cnVjdGVyIGFjY2VwdHMKKyAgIyAKKyAgZGVmIGluaXRpYWxpemUoIGZpbGUsIG9wdGlvbnMgPSB7fSApCisgICAgY2FzZSBmaWxlCisgICAgd2hlbiAkc3RkaW4gdGhlbgorICAgICAgZGF0YSA9ICRzdGRpbi5yZWFkCisgICAgICBAbmFtZSA9ICcoc3RkaW4pJworICAgIHdoZW4gQVJHRgorICAgICAgZGF0YSA9IGZpbGUucmVhZAorICAgICAgQG5hbWUgPSBmaWxlLnBhdGgKKyAgICB3aGVuIDo6RmlsZSB0aGVuCisgICAgICBmaWxlID0gZmlsZS5jbG9uZQorICAgICAgZmlsZS5yZW9wZW4oIGZpbGUucGF0aCwgJ3InICkKKyAgICAgIEBuYW1lID0gZmlsZS5wYXRoCisgICAgICBkYXRhID0gZmlsZS5yZWFkCisgICAgICBmaWxlLmNsb3NlCisgICAgZWxzZQorICAgICAgaWYgZmlsZS5yZXNwb25kX3RvPyggOnJlYWQgKQorICAgICAgICBkYXRhID0gZmlsZS5yZWFkCisgICAgICAgIGlmIGZpbGUucmVzcG9uZF90bz8oIDpuYW1lICkgdGhlbiBAbmFtZSA9IGZpbGUubmFtZQorICAgICAgICBlbHNpZiBmaWxlLnJlc3BvbmRfdG8/KCA6cGF0aCApIHRoZW4gQG5hbWUgPSBmaWxlLnBhdGgKKyAgICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIEBuYW1lID0gZmlsZS50b19zCisgICAgICAgIGlmIHRlc3QoID9mLCBAbmFtZSApIHRoZW4gZGF0YSA9IEZpbGUucmVhZCggQG5hbWUgKQorICAgICAgICBlbHNlIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJjb3VsZCBub3QgZmluZCBhbiBleGlzdGluZyBmaWxlIGF0ICVwIiAlIEBuYW1lCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgZW5kCisgICAgc3VwZXIoIGRhdGEsIG9wdGlvbnMgKQorICBlbmQKKyAgCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbQorCitDb21tb25Ub2tlblN0cmVhbSBzZXJ2ZXMgYXMgdGhlIHByaW1hcnkgdG9rZW4gc3RyZWFtIGltcGxlbWVudGF0aW9uIGZvciBmZWVkaW5nCitzZXF1ZW50aWFsIHRva2VuIGlucHV0IGludG8gcGFyc2Vycy4KKworVXNpbmcgc29tZSBUb2tlblNvdXJjZSAoc3VjaCBhcyBhIGxleGVyKSwgdGhlIHN0cmVhbSBjb2xsZWN0cyBhIHRva2VuIHNlcXVlbmNlLAorc2V0dGluZyB0aGUgdG9rZW4ncyA8dHQ+aW5kZXg8L3R0PiBhdHRyaWJ1dGUgdG8gaW5kaWNhdGUgdGhlIHRva2VuJ3MgcG9zaXRpb24KK3dpdGhpbiB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtcyBtYXkgYmUgdHVuZWQgdG8gc29tZSBjaGFubmVsIHZhbHVlOyBvZmYtY2hhbm5lbAordG9rZW5zIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGJ5IHRoZSAjcGVlaywgI2xvb2ssIGFuZCAjY29uc3VtZSBtZXRob2RzLgorCis9PT0gU2FtcGxlIFVzYWdlCisKKyAgCisgIHNvdXJjZV9pbnB1dCA9IEFOVExSMzo6U3RyaW5nU3RyZWFtLm5ldygiMzUgKiA0IC0gMSIpCisgIGxleGVyID0gQ2FsY3VsYXRvcjo6TGV4ZXIubmV3KHNvdXJjZV9pbnB1dCkKKyAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcobGV4ZXIpCisgIAorICAjIGFzc3VtZSB0aGlzIGdyYW1tYXIgZGVmaW5lcyB3aGl0ZXNwYWNlIGFzIHRva2VucyBvbiBjaGFubmVsIEhJRERFTgorICAjIGFuZCBudW1iZXJzIGFuZCBvcGVyYXRpb25zIGFzIHRva2VucyBvbiBjaGFubmVsIERFRkFVTFQKKyAgdG9rZW5zLmxvb2sgICAgICAgICAjID0+IDAgSU5UWyczNSddIEAgbGluZSAxIGNvbCAwICgwLi4xKQorICB0b2tlbnMubG9vaygyKSAgICAgICMgPT4gMiBNVUxUWyIqIl0gQCBsaW5lIDEgY29sIDIgKDMuLjMpCisgIHRva2Vucy50b2tlbnMoMCwgMikKKyAgICAjID0+IFswIElOVFsiMzUiXSBAbGluZSAxIGNvbCAwICgwLi4xKSwgCisgICAgIyAgICAgMSBXU1siICJdIEBsaW5lIDEgY29sIDIgKDEuLjEpLCAKKyAgICAjICAgICAyIE1VTFRbIioiXSBAIGxpbmUgMSBjb2wgMyAoMy4uMyldCisgICAgIyBub3RpY2UgdGhlICN0b2tlbnMgbWV0aG9kIGRvZXMgbm90IGZpbHRlciBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgCisgIGxleGVyLnJlc2V0CisgIGhpZGRlbl90b2tlbnMgPSAKKyAgICBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyhsZXhlciwgOmNoYW5uZWwgPT4gQU5UTFIzOjpISURERU4pCisgIGhpZGRlbl90b2tlbnMubG9vayAjID0+IDEgV1NbJyAnXSBAIGxpbmUgMSBjb2wgMiAoMS4uMSkKKworPWVuZAorCitjbGFzcyBDb21tb25Ub2tlblN0cmVhbQorICBpbmNsdWRlIFRva2VuU3RyZWFtCisgIGluY2x1ZGUgRW51bWVyYWJsZQorICAKKyAgIworICAjIGNvbnN0cnVjdHMgYSBuZXcgdG9rZW4gc3RyZWFtIHVzaW5nIHRoZSArdG9rZW5fc291cmNlKyBwcm92aWRlZC4gK3Rva2VuX3NvdXJjZSsgaXMKKyAgIyB1c3VhbGx5IGEgbGV4ZXIsIGJ1dCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgK25leHRfdG9rZW4rIGFuZCBpbmNsdWRlcworICAjIEFOVExSMzo6VG9rZW5Tb3VyY2UuCisgICMKKyAgIyBJZiBhIGJsb2NrIGlzIHByb3ZpZGVkLCBlYWNoIHRva2VuIGhhcnZlc3RlZCB3aWxsIGJlIHlpZWxkZWQgYW5kIGlmIHRoZSBibG9jaworICAjIHJldHVybnMgYSArbmlsKyBvciArZmFsc2UrIHZhbHVlLCB0aGUgdG9rZW4gd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHN0cmVhbSAtLQorICAjIGl0IHdpbGwgYmUgZGlzY2FyZGVkLgorICAjCisgICMgPT09IE9wdGlvbnMKKyAgIyBbOmNoYW5uZWxdIFRoZSBjaGFubmVsIHZhbHVlIHRoZSBzdHJlYW0gc2hvdWxkIGJlIHR1bmVkIHRvIGluaXRpYWxseQorICAjIFs6c291cmNlX25hbWVdIFRoZSBzb3VyY2UgbmFtZSAoZmlsZSBuYW1lKSBhdHRyaWJ1dGUgb2YgdGhlIHN0cmVhbQorICAjIAorICAjID09PSBFeGFtcGxlCisgICMKKyAgIyAgICMgY3JlYXRlIGEgbmV3IHRva2VuIHN0cmVhbSB0aGF0IGlzIHR1bmVkIHRvIGNoYW5uZWwgOmNvbW1lbnQsIGFuZAorICAjICAgIyBkaXNjYXJkIGFsbCBXSElURV9TUEFDRSB0b2tlbnMKKyAgIyAgIEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KGxleGVyLCA6Y2hhbm5lbCA9PiA6Y29tbWVudCkgZG8gfHRva2VufAorICAjICAgICB0b2tlbi5uYW1lICE9ICdXSElURV9TUEFDRScKKyAgIyAgIGVuZAorICAjIAorICBkZWYgaW5pdGlhbGl6ZSggdG9rZW5fc291cmNlLCBvcHRpb25zID0ge30gKQorICAgIGNhc2UgdG9rZW5fc291cmNlCisgICAgd2hlbiBDb21tb25Ub2tlblN0cmVhbQorICAgICAgIyB0aGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBjb252ZXJ0IGEgQ29tbW9uVG9rZW5TdHJlYW0KKyAgICAgICMgdG8gYSBSZXdyaXRlVG9rZW5TdHJlYW0gb3Igb3RoZXIgdmFyaWF0aW9uIG9mIHRoZSBzdGFuZGFyZCB0b2tlbiBzdHJlYW0KKyAgICAgIHN0cmVhbSA9IHRva2VuX3NvdXJjZQorICAgICAgQHRva2VuX3NvdXJjZSA9IHN0cmVhbS50b2tlbl9zb3VyY2UKKyAgICAgIEBjaGFubmVsID0gb3B0aW9ucy5mZXRjaCggOmNoYW5uZWwgKSB7IHN0cmVhbS5jaGFubmVsIG9yIERFRkFVTFRfQ0hBTk5FTCB9CisgICAgICBAc291cmNlX25hbWUgPSBvcHRpb25zLmZldGNoKCA6c291cmNlX25hbWUgKSB7IHN0cmVhbS5zb3VyY2VfbmFtZSB9CisgICAgICB0b2tlbnMgPSBzdHJlYW0udG9rZW5zLm1hcCB7IHwgdCB8IHQuZHVwIH0KKyAgICBlbHNlCisgICAgICBAdG9rZW5fc291cmNlID0gdG9rZW5fc291cmNlCisgICAgICBAY2hhbm5lbCA9IG9wdGlvbnMuZmV0Y2goIDpjaGFubmVsLCBERUZBVUxUX0NIQU5ORUwgKQorICAgICAgQHNvdXJjZV9uYW1lID0gb3B0aW9ucy5mZXRjaCggOnNvdXJjZV9uYW1lICkgeyAgQHRva2VuX3NvdXJjZS5zb3VyY2VfbmFtZSByZXNjdWUgbmlsIH0KKyAgICAgIHRva2VucyA9IEB0b2tlbl9zb3VyY2UudG9fYQorICAgIGVuZAorICAgIEBsYXN0X21hcmtlciA9IG5pbAorICAgIEB0b2tlbnMgPSBibG9ja19naXZlbj8gPyB0b2tlbnMuc2VsZWN0IHsgfCB0IHwgeWllbGQoIHQsIHNlbGYgKSB9IDogdG9rZW5zCisgICAgQHRva2Vucy5lYWNoX3dpdGhfaW5kZXggeyB8dCwgaXwgdC5pbmRleCA9IGkgfQorICAgIEBwb3NpdGlvbiA9IAorICAgICAgaWYgZmlyc3RfdG9rZW4gPSBAdG9rZW5zLmZpbmQgeyB8dHwgdC5jaGFubmVsID09IEBjaGFubmVsIH0KKyAgICAgICAgQHRva2Vucy5pbmRleCggZmlyc3RfdG9rZW4gKQorICAgICAgZWxzZSBAdG9rZW5zLmxlbmd0aAorICAgICAgZW5kCisgIGVuZAorICAKKyAgIworICAjIHJlc2V0cyB0aGUgdG9rZW4gc3RyZWFtIGFuZCByZWJ1aWxkcyBpdCB3aXRoIGEgcG90ZW50aWFsbHkgbmV3IHRva2VuIHNvdXJjZS4KKyAgIyBJZiBubyArdG9rZW5fc291cmNlKyB2YWx1ZSBpcyBwcm92aWRlZCwgdGhlIHN0cmVhbSB3aWxsIGF0dGVtcHQgdG8gcmVzZXQgdGhlCisgICMgY3VycmVudCArdG9rZW5fc291cmNlKyBieSBjYWxsaW5nICtyZXNldCsgb24gdGhlIG9iamVjdC4gVGhlIHN0cmVhbSB3aWxsCisgICMgdGhlbiBjbGVhciB0aGUgdG9rZW4gYnVmZmVyIGFuZCBhdHRlbXB0IHRvIGhhcnZlc3QgbmV3IHRva2Vucy4gSWRlbnRpY2FsIGluCisgICMgYmVoYXZpb3IgdG8gQ29tbW9uVG9rZW5TdHJlYW0ubmV3LCBpZiBhIGJsb2NrIGlzIHByb3ZpZGVkLCB0b2tlbnMgd2lsbCBiZQorICAjIHlpZWxkZWQgYW5kIGRpc2NhcmRlZCBpZiB0aGUgYmxvY2sgcmV0dXJucyBhICtmYWxzZSsgb3IgK25pbCsgdmFsdWUuCisgICMgCisgIGRlZiByZWJ1aWxkKCB0b2tlbl9zb3VyY2UgPSBuaWwgKQorICAgIGlmIHRva2VuX3NvdXJjZS5uaWw/CisgICAgICBAdG9rZW5fc291cmNlLnJlc2V0IHJlc2N1ZSBuaWwKKyAgICBlbHNlIEB0b2tlbl9zb3VyY2UgPSB0b2tlbl9zb3VyY2UKKyAgICBlbmQKKyAgICBAdG9rZW5zID0gYmxvY2tfZ2l2ZW4/ID8gQHRva2VuX3NvdXJjZS5zZWxlY3QgeyB8dG9rZW58IHlpZWxkKCB0b2tlbiApIH0gOiAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdG9rZW5fc291cmNlLnRvX2EKKyAgICBAdG9rZW5zLmVhY2hfd2l0aF9pbmRleCB7IHx0LCBpfCB0LmluZGV4ID0gaSB9CisgICAgQGxhc3RfbWFya2VyID0gbmlsCisgICAgQHBvc2l0aW9uID0gCisgICAgICBpZiBmaXJzdF90b2tlbiA9IEB0b2tlbnMuZmluZCB7IHx0fCB0LmNoYW5uZWwgPT0gQGNoYW5uZWwgfQorICAgICAgICBAdG9rZW5zLmluZGV4KCBmaXJzdF90b2tlbiApCisgICAgICBlbHNlIEB0b2tlbnMubGVuZ3RoCisgICAgICBlbmQKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKyAgCisgICMKKyAgIyB0dW5lIHRoZSBzdHJlYW0gdG8gYSBuZXcgY2hhbm5lbCB2YWx1ZQorICAjIAorICBkZWYgdHVuZV90byggY2hhbm5lbCApCisgICAgQGNoYW5uZWwgPSBjaGFubmVsCisgIGVuZAorICAKKyAgZGVmIHRva2VuX2NsYXNzCisgICAgQHRva2VuX3NvdXJjZS50b2tlbl9jbGFzcworICByZXNjdWUgTm9NZXRob2RFcnJvcgorICAgIEBwb3NpdGlvbiA9PSAtMSBhbmQgZmlsbF9idWZmZXIKKyAgICBAdG9rZW5zLmVtcHR5PyA/IENvbW1vblRva2VuIDogQHRva2Vucy5maXJzdC5jbGFzcworICBlbmQKKyAgCisgIGFsaWFzIGluZGV4IHBvc2l0aW9uCisgIAorICBkZWYgc2l6ZQorICAgIEB0b2tlbnMubGVuZ3RoCisgIGVuZAorICAKKyAgYWxpYXMgbGVuZ3RoIHNpemUKKyAgCisgICMjIyMjIyBTdGF0ZS1Db250cm9sICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAKKyAgIworICAjIHJld2luZCB0aGUgc3RyZWFtIHRvIGl0cyBpbml0aWFsIHN0YXRlCisgICMgCisgIGRlZiByZXNldAorICAgIEBwb3NpdGlvbiA9IDAKKyAgICBAcG9zaXRpb24gKz0gMSB3aGlsZSB0b2tlbiA9IEB0b2tlbnNbIEBwb3NpdGlvbiBdIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmNoYW5uZWwgIT0gQGNoYW5uZWwKKyAgICBAbGFzdF9tYXJrZXIgPSBuaWwKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKyAgCisgICMKKyAgIyBib29rbWFyayB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgaW5wdXQgc3RyZWFtCisgICMgCisgIGRlZiBtYXJrCisgICAgQGxhc3RfbWFya2VyID0gQHBvc2l0aW9uCisgIGVuZAorICAKKyAgZGVmIHJlbGVhc2UoIG1hcmtlciA9IG5pbCApCisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorICAKKyAgCisgIGRlZiByZXdpbmQoIG1hcmtlciA9IEBsYXN0X21hcmtlciwgcmVsZWFzZSA9IHRydWUgKQorICAgIHNlZWsoIG1hcmtlciApCisgIGVuZAorICAKKyAgIworICAjIHNhdmVzIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiwgeWllbGRzIHRvIHRoZSBibG9jaywKKyAgIyBhbmQgdGhlbiBlbnN1cmVzIHRoZSBzdHJlYW0ncyBwb3NpdGlvbiBpcyByZXN0b3JlZCBiZWZvcmUKKyAgIyByZXR1cm5pbmcgdGhlIHZhbHVlIG9mIHRoZSBibG9jaworICAjICAKKyAgZGVmIGhvbGQoIHBvcyA9IEBwb3NpdGlvbiApCisgICAgYmxvY2tfZ2l2ZW4/IG9yIHJldHVybiBlbnVtX2ZvciggOmhvbGQsIHBvcyApCisgICAgYmVnaW4KKyAgICAgIHlpZWxkCisgICAgZW5zdXJlCisgICAgICBzZWVrKCBwb3MgKQorICAgIGVuZAorICBlbmQKKyAgCisgICMjIyMjIyBTdHJlYW0gTmF2aWdhdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIAorICAjCisgICMgYWR2YW5jZSB0aGUgc3RyZWFtIG9uZSBzdGVwIHRvIHRoZSBuZXh0IG9uLWNoYW5uZWwgdG9rZW4KKyAgIyAKKyAgZGVmIGNvbnN1bWUKKyAgICB0b2tlbiA9IEB0b2tlbnNbIEBwb3NpdGlvbiBdIHx8IEVPRl9UT0tFTgorICAgIGlmIEBwb3NpdGlvbiA8IEB0b2tlbnMubGVuZ3RoCisgICAgICBAcG9zaXRpb24gPSBmdXR1cmU/KCAyICkgfHwgQHRva2Vucy5sZW5ndGgKKyAgICBlbmQKKyAgICByZXR1cm4oIHRva2VuICkKKyAgZW5kCisgIAorICAjCisgICMganVtcCB0byB0aGUgc3RyZWFtIHBvc2l0aW9uIHNwZWNpZmllZCBieSAraW5kZXgrCisgICMgbm90ZTogc2VlayBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgIyAgICAgICB0b2tlbiBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGlzIG9uLWNoYW5uZWwsCisgICMKKyAgZGVmIHNlZWsoIGluZGV4ICkKKyAgICBAcG9zaXRpb24gPSBpbmRleC50b19pLmJvdW5kKCAwLCBAdG9rZW5zLmxlbmd0aCApCisgICAgcmV0dXJuIHNlbGYKKyAgZW5kCisgIAorICAjCisgICMgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBvbi1jaGFubmVsIHRva2VuIGF0IGxvb2stYWhlYWQgZGlzdGFuY2UgK2srLiA8dHQ+ayA9IDE8L3R0PiByZXByZXNlbnRzCisgICMgdGhlIGN1cnJlbnQgdG9rZW4uICtrKyBncmVhdGVyIHRoYW4gMSByZXByZXNlbnRzIHVwY29taW5nIG9uLWNoYW5uZWwgdG9rZW5zLiBBIG5lZ2F0aXZlCisgICMgdmFsdWUgb2YgK2srIHJldHVybnMgcHJldmlvdXMgb24tY2hhbm5lbCB0b2tlbnMgY29uc3VtZWQsIHdoZXJlIDx0dD5rID0gLTE8L3R0PiBpcyB0aGUgbGFzdAorICAjIG9uLWNoYW5uZWwgdG9rZW4gY29uc3VtZWQuIDx0dD5rID0gMDwvdHQ+IGhhcyB1bmRlZmluZWQgYmVoYXZpb3IgYW5kIHJldHVybnMgK25pbCsKKyAgIyAKKyAgZGVmIHBlZWsoIGsgPSAxICkKKyAgICB0ayA9IGxvb2soIGsgKSBhbmQgcmV0dXJuKCB0ay50eXBlICkKKyAgZW5kCisgIAorICAjCisgICMgb3BlcmF0ZXMgc2ltaWxsYXJseSB0byAjcGVlaywgYnV0IHJldHVybnMgdGhlIGZ1bGwgdG9rZW4gb2JqZWN0IGF0IGxvb2stYWhlYWQgcG9zaXRpb24gK2srCisgICMKKyAgZGVmIGxvb2soIGsgPSAxICkKKyAgICBpbmRleCA9IGZ1dHVyZT8oIGsgKSBvciByZXR1cm4gbmlsCisgICAgQHRva2Vucy5mZXRjaCggaW5kZXgsIEVPRl9UT0tFTiApCisgIGVuZAorICAKKyAgYWxpYXMgPj4gbG9vaworICBkZWYgPDwgaworICAgIHNlbGYgPj4gLWsKKyAgZW5kCisgIAorICAjCisgICMgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9uLWNoYW5uZWwgdG9rZW4gYXQgbG9vay1haGVhZCBwb3NpdGlvbiAraysgb3IgbmlsIGlmIG5vIG90aGVyCisgICMgb24tY2hhbm5lbCB0b2tlbnMgZXhpc3QKKyAgIyAKKyAgZGVmIGZ1dHVyZT8oIGsgPSAxICkKKyAgICBAcG9zaXRpb24gPT0gLTEgYW5kIGZpbGxfYnVmZmVyCisgICAgCisgICAgY2FzZQorICAgIHdoZW4gayA9PSAwIHRoZW4gbmlsCisgICAgd2hlbiBrIDwgMCB0aGVuIHBhc3Q/KCAtayApCisgICAgd2hlbiBrID09IDEgdGhlbiBAcG9zaXRpb24KKyAgICBlbHNlCisgICAgICAjIHNpbmNlIHRoZSBzdHJlYW0gb25seSB5aWVsZHMgb24tY2hhbm5lbAorICAgICAgIyB0b2tlbnMsIHRoZSBzdHJlYW0gY2FuJ3QganVzdCBnbyB0byB0aGUKKyAgICAgICMgbmV4dCBwb3NpdGlvbiwgYnV0IHJhdGhlciBtdXN0IHNraXAKKyAgICAgICMgb3ZlciBvZmYtY2hhbm5lbCB0b2tlbnMKKyAgICAgICggayAtIDEgKS50aW1lcy5pbmplY3QoIEBwb3NpdGlvbiApIGRvIHxjdXJzb3IsIHwKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICB0ayA9IEB0b2tlbnMuYXQoIGN1cnNvciArPSAxICkgb3IgcmV0dXJuKCBjdXJzb3IgKQorICAgICAgICAgICMgXi0gaWYgdGsgaXMgbmlsIChpLmUuIGkgaXMgb3V0c2lkZSBhcnJheSBsaW1pdHMpCisgICAgICAgIGVuZCB1bnRpbCB0ay5jaGFubmVsID09IEBjaGFubmVsCisgICAgICAgIGN1cnNvcgorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAKKyAgIworICAjIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBvbi1jaGFubmVsIHRva2VuIGF0IGxvb2stYmVoaW5kIHBvc2l0aW9uICtrKyBvciBuaWwgaWYgbm8gb3RoZXIKKyAgIyBvbi1jaGFubmVsIHRva2VucyBleGlzdCBiZWZvcmUgdGhlIGN1cnJlbnQgdG9rZW4KKyAgIyAKKyAgZGVmIHBhc3Q/KCBrID0gMSApCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIAorICAgIGNhc2UKKyAgICB3aGVuIGsgPT0gMCB0aGVuIG5pbAorICAgIHdoZW4gQHBvc2l0aW9uIC0gayA8IDAgdGhlbiBuaWwKKyAgICBlbHNlCisgICAgICAKKyAgICAgIGsudGltZXMuaW5qZWN0KCBAcG9zaXRpb24gKSBkbyB8Y3Vyc29yLCB8CisgICAgICAgIGJlZ2luCisgICAgICAgICAgY3Vyc29yIDw9IDAgYW5kIHJldHVybiggbmlsICkKKyAgICAgICAgICB0ayA9IEB0b2tlbnMuYXQoIGN1cnNvciAtPSAxICkgb3IgcmV0dXJuKCBuaWwgKQorICAgICAgICBlbmQgdW50aWwgdGsuY2hhbm5lbCA9PSBAY2hhbm5lbAorICAgICAgICBjdXJzb3IKKyAgICAgIGVuZAorICAgICAgCisgICAgZW5kCisgIGVuZAorICAKKyAgIworICAjIHlpZWxkcyBlYWNoIHRva2VuIGluIHRoZSBzdHJlYW0gKGluY2x1ZGluZyBvZmYtY2hhbm5lbCB0b2tlbnMpCisgICMgSWYgbm8gYmxvY2sgaXMgcHJvdmlkZWQsIHRoZSBtZXRob2QgcmV0dXJucyBhbiBFbnVtZXJhdG9yIG9iamVjdC4KKyAgIyAjZWFjaCBhY2NlcHRzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyAjdG9rZW5zCisgICMgCisgIGRlZiBlYWNoKCAqYXJncyApCisgICAgYmxvY2tfZ2l2ZW4/IG9yIHJldHVybiBlbnVtX2ZvciggOmVhY2gsICphcmdzICkKKyAgICB0b2tlbnMoICphcmdzICkuZWFjaCB7IHx0b2tlbnwgeWllbGQoIHRva2VuICkgfQorICBlbmQKKyAgCisgIAorICAjCisgICMgeWllbGRzIGVhY2ggdG9rZW4gaW4gdGhlIHN0cmVhbSB3aXRoIHRoZSBnaXZlbiBjaGFubmVsIHZhbHVlCisgICMgSWYgbm8gY2hhbm5lbCB2YWx1ZSBpcyBnaXZlbiwgdGhlIHN0cmVhbSdzIHR1bmVkIGNoYW5uZWwgdmFsdWUgd2lsbCBiZSB1c2VkLgorICAjIElmIG5vIGJsb2NrIGlzIGdpdmVuLCBhbiBlbnVtZXJhdG9yIHdpbGwgYmUgcmV0dXJuZWQuIAorICAjIAorICBkZWYgZWFjaF9vbl9jaGFubmVsKCBjaGFubmVsID0gQGNoYW5uZWwgKQorICAgIGJsb2NrX2dpdmVuPyBvciByZXR1cm4gZW51bV9mb3IoIDplYWNoX29uX2NoYW5uZWwsIGNoYW5uZWwgKQorICAgIGZvciB0b2tlbiBpbiBAdG9rZW5zCisgICAgICB0b2tlbi5jaGFubmVsID09IGNoYW5uZWwgYW5kIHlpZWxkKCB0b2tlbiApCisgICAgZW5kCisgIGVuZAorICAKKyAgIworICAjIGl0ZXJhdGVzIHRocm91Z2ggdGhlIHRva2VuIHN0cmVhbSwgeWllbGRpbmcgZWFjaCBvbiBjaGFubmVsIHRva2VuIGFsb25nIHRoZSB3YXkuCisgICMgQWZ0ZXIgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQsIHRoZSBzdHJlYW0ncyBwb3NpdGlvbiB3aWxsIGJlIHJlc3RvcmVkIHRvIHdoZXJlCisgICMgaXQgd2FzIGJlZm9yZSAjd2FsayB3YXMgY2FsbGVkLiBXaGlsZSAjZWFjaCBvciAjZWFjaF9vbl9jaGFubmVsIGRvZXMgbm90IGNoYW5nZQorICAjIHRoZSBwb3NpdGlvbnMgc3RyZWFtIGR1cmluZyBpdGVyYXRpb24sICN3YWxrIGFkdmFuY2VzIHRocm91Z2ggdGhlIHN0cmVhbS4gVGhpcworICAjIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGxvb2sgYWhlYWQgYW5kIGJlaGluZCB0aGUgY3VycmVudCB0b2tlbiBkdXJpbmcgaXRlcmF0aW9uLgorICAjIElmIG5vIGJsb2NrIGlzIGdpdmVuLCBhbiBlbnVtZXJhdG9yIHdpbGwgYmUgcmV0dXJuZWQuIAorICAjIAorICBkZWYgd2FsaworICAgIGJsb2NrX2dpdmVuPyBvciByZXR1cm4gZW51bV9mb3IoIDp3YWxrICkKKyAgICBpbml0aWFsX3Bvc2l0aW9uID0gQHBvc2l0aW9uCisgICAgYmVnaW4KKyAgICAgIHdoaWxlIHRva2VuID0gbG9vayBhbmQgdG9rZW4udHlwZSAhPSBFT0YKKyAgICAgICAgY29uc3VtZQorICAgICAgICB5aWVsZCggdG9rZW4gKQorICAgICAgZW5kCisgICAgICByZXR1cm4gc2VsZgorICAgIGVuc3VyZQorICAgICAgQHBvc2l0aW9uID0gaW5pdGlhbF9wb3NpdGlvbgorICAgIGVuZAorICBlbmQKKyAgCisgICMgCisgICMgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHRva2VuIGJ1ZmZlci4gSWYgK3N0YXJ0KyBhbmQgK3N0b3ArIGFyZSBwcm92aWRlZCwgdG9rZW5zCisgICMgcmV0dXJucyBhIHNsaWNlIG9mIHRoZSB0b2tlbiBidWZmZXIgZnJvbSA8dHQ+c3RhcnQuLnN0b3A8L3R0Pi4gVGhlIHBhcmFtZXRlcnMKKyAgIyBhcmUgY29udmVydGVkIHRvIGludGVnZXJzIHdpdGggdGhlaXIgPHR0PnRvX2k8L3R0PiBtZXRob2RzLCBhbmQgdGh1cyB0b2tlbnMKKyAgIyBjYW4gYmUgcHJvdmlkZWQgdG8gc3BlY2lmeSBzdGFydCBhbmQgc3RvcC4gSWYgYSBibG9jayBpcyBwcm92aWRlZCwgdG9rZW5zIGFyZQorICAjIHlpZWxkZWQgYW5kIGZpbHRlcmVkIG91dCBvZiB0aGUgcmV0dXJuIGFycmF5IGlmIHRoZSBibG9jayByZXR1cm5zIGEgK2ZhbHNlKworICAjIG9yICtuaWwrIHZhbHVlLiAKKyAgIyAKKyAgZGVmIHRva2Vucyggc3RhcnQgPSBuaWwsIHN0b3AgPSBuaWwgKQorICAgIHN0b3AubmlsPyAgfHwgc3RvcCA+PSBAdG9rZW5zLmxlbmd0aCBhbmQgc3RvcCA9IEB0b2tlbnMubGVuZ3RoIC0gMQorICAgIHN0YXJ0Lm5pbD8gfHwgc3RvcCA8IDAgYW5kIHN0YXJ0ID0gMAorICAgIHRva2VucyA9IEB0b2tlbnNbIHN0YXJ0Li5zdG9wIF0KKyAgICAKKyAgICBpZiBibG9ja19naXZlbj8KKyAgICAgIHRva2Vucy5kZWxldGVfaWYgeyB8dHwgbm90IHlpZWxkKCB0ICkgfQorICAgIGVuZAorICAgIAorICAgIHJldHVybiggdG9rZW5zICkKKyAgZW5kCisgIAorICAKKyAgZGVmIGF0KCBpICkKKyAgICBAdG9rZW5zLmF0IGkKKyAgZW5kCisgIAorICAjCisgICMgaWRlbnRpY2FsIHRvIEFycmF5I1tdLCBhcyBhcHBsaWVkIHRvIHRoZSBzdHJlYW0ncyB0b2tlbiBidWZmZXIKKyAgIyAKKyAgZGVmIFtdKCBpLCAqYXJncyApCisgICAgQHRva2Vuc1sgaSwgKmFyZ3MgXQorICBlbmQKKyAgCisgICMjIyMjIyBTdGFuZGFyZCBDb252ZXJzaW9uIE1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBkZWYgaW5zcGVjdAorICAgIHN0cmluZyA9ICIjPCVwOiBAdG9rZW5fc291cmNlPSVwIEAgJXAvJXAiICUKKyAgICAgIFsgc2VsZi5jbGFzcywgQHRva2VuX3NvdXJjZS5jbGFzcywgQHBvc2l0aW9uLCBAdG9rZW5zLmxlbmd0aCBdCisgICAgdGsgPSBsb29rKCAtMSApIGFuZCBzdHJpbmcgPDwgIiAjeyB0ay5pbnNwZWN0IH0gPC0tIgorICAgIHRrID0gbG9vayggMSApIGFuZCBzdHJpbmcgPDwgIiAtLT4gI3sgdGsuaW5zcGVjdCB9IgorICAgIHN0cmluZyA8PCAnPicKKyAgZW5kCisgIAorICAjCisgICMgZmV0Y2hlcyB0aGUgdGV4dCBjb250ZW50IG9mIGFsbCB0b2tlbnMgYmV0d2VlbiArc3RhcnQrIGFuZCArc3RvcCsgYW5kCisgICMgam9pbnMgdGhlIGNodW5rcyBpbnRvIGEgc2luZ2xlIHN0cmluZworICAjIAorICBkZWYgZXh0cmFjdF90ZXh0KCBzdGFydCA9IDAsIHN0b3AgPSBAdG9rZW5zLmxlbmd0aCAtIDEgKQorICAgIHN0YXJ0ID0gc3RhcnQudG9faS5hdF9sZWFzdCggMCApCisgICAgc3RvcCA9IHN0b3AudG9faS5hdF9tb3N0KCBAdG9rZW5zLmxlbmd0aCApCisgICAgQHRva2Vuc1sgc3RhcnQuLnN0b3AgXS5tYXAhIHsgfHR8IHQudGV4dCB9LmpvaW4oICcnICkKKyAgZW5kCisgIAorICBhbGlhcyB0b19zIGV4dHJhY3RfdGV4dAorICAKK2VuZAorCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9zdHJlYW1zL2ludGVyYWN0aXZlLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3N0cmVhbXMvaW50ZXJhY3RpdmUucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYwNjA1MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9zdHJlYW1zL2ludGVyYWN0aXZlLnJiCkBAIC0wLDAgKzEsMTM2IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK21vZHVsZSBBTlRMUjMKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpNYWluOjpJbnRlcmFjdGl2ZVN0cmluZ1N0cmVhbQorCitBIHNwZWNpYWwgc3RyZWFtIHVzZWQgaW4gdGhlIDxiPmludGVyYWN0aXZlIG1vZGU8L2I+IG9mIHRoZSBNYWluIHNjcmlwdHMuIEl0Cit1c2VzIFJlYWRsaW5lIChpZiBhdmFpbGFibGUpIG9yIHN0YW5kYXJkIElPI2dldHMgdG8gZmV0Y2ggZGF0YSBvbiBkZW1hbmQuCisKKz1lbmQKKworY2xhc3MgSW50ZXJhY3RpdmVTdHJpbmdTdHJlYW0gPCBTdHJpbmdTdHJlYW0KKyAgCisgIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjkvCisgICAgCisgICAgIyBjcmVhdGVzIGEgbmV3IFN0cmluZ1N0cmVhbSBvYmplY3Qgd2hlcmUgK2RhdGErIGlzIHRoZSBzdHJpbmcgZGF0YSB0byBzdHJlYW0uCisgICAgIyBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBpbiBhIHN5bWJvbC10by12YWx1ZSBoYXNoOgorICAgICMKKyAgICAjIFs6ZmlsZSBvciA6bmFtZV0gdGhlIChmaWxlKSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzdHJlYW07IGRlZmF1bHQ6IDx0dD4nKHN0cmluZyknPC90dD4KKyAgICAjIFs6bGluZV0gdGhlIGluaXRpYWwgbGluZSBudW1iZXI7IGRlZmF1bHQ6ICsxKworICAgICMgWzpjb2x1bW5dIHRoZSBpbml0aWFsIGNvbHVtbiBudW1iZXI7IGRlZmF1bHQ6ICswKworICAgICMgCisgICAgZGVmIGluaXRpYWxpemUoIG9wdGlvbnMgPSB7fSwgJmJsb2NrICkgICAgICAjIGZvciAxLjkKKyAgICAgIEBzdHJpbmcgPSAnJworICAgICAgQGRhdGEgICA9IFtdCisgICAgICBAcG9zaXRpb24gPSBvcHRpb25zLmZldGNoIDpwb3NpdGlvbiwgMAorICAgICAgQGxpbmUgICAgID0gb3B0aW9ucy5mZXRjaCA6bGluZSwgMQorICAgICAgQGNvbHVtbiAgID0gb3B0aW9ucy5mZXRjaCA6Y29sdW1uLCAwCisgICAgICBAbWFya2VycyAgPSBbXQorICAgICAgbWFyaworICAgICAgQGluaXRpYWxpemVkID0gQGVvZiA9IGZhbHNlCisgICAgICBAcmVhZGxpbmUgPSBibG9jayBvciByYWlzZSggQXJndW1lbnRFcnJvciwgIm5vIGxpbmUtcmVhZGluZyBibG9jayB3YXMgcHJvdmlkZWQiICkKKyAgICAgIEBuYW1lIHx8PSBvcHRpb25zWyA6ZmlsZSBdIHx8IG9wdGlvbnNbIDpuYW1lIF0gfHwgJyhpbnRlcmFjdGl2ZSknCisgICAgZW5kCisgICAgCisgICAgZGVmIHJlYWRsaW5lCisgICAgICBAaW5pdGlhbGl6ZWQgPSB0cnVlCisgICAgICB1bmxlc3MgQGVvZgorICAgICAgICBpZiBsaW5lID0gQHJlYWRsaW5lLmNhbGwKKyAgICAgICAgICBsaW5lID0gbGluZS50b19zLmVuY29kZSggRW5jb2Rpbmc6OlVURl84ICkKKyAgICAgICAgICBAc3RyaW5nIDw8IGxpbmUKKyAgICAgICAgICBAZGF0YS5jb25jYXQoIGxpbmUuY29kZXBvaW50cy50b19hICkKKyAgICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgQGVvZiA9IHRydWUKKyAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgZWxzZQorICAgIAorICAgICMgY3JlYXRlcyBhIG5ldyBTdHJpbmdTdHJlYW0gb2JqZWN0IHdoZXJlICtkYXRhKyBpcyB0aGUgc3RyaW5nIGRhdGEgdG8gc3RyZWFtLgorICAgICMgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgaW4gYSBzeW1ib2wtdG8tdmFsdWUgaGFzaDoKKyAgICAjCisgICAgIyBbOmZpbGUgb3IgOm5hbWVdIHRoZSAoZmlsZSkgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc3RyZWFtOyBkZWZhdWx0OiA8dHQ+JyhzdHJpbmcpJzwvdHQ+CisgICAgIyBbOmxpbmVdIHRoZSBpbml0aWFsIGxpbmUgbnVtYmVyOyBkZWZhdWx0OiArMSsKKyAgICAjIFs6Y29sdW1uXSB0aGUgaW5pdGlhbCBjb2x1bW4gbnVtYmVyOyBkZWZhdWx0OiArMCsKKyAgICAjIAorICAgIGRlZiBpbml0aWFsaXplKCBvcHRpb25zID0ge30sICZibG9jayApCisgICAgICBAc3RyaW5nID0gQGRhdGEgPSAnJworICAgICAgQHBvc2l0aW9uID0gb3B0aW9ucy5mZXRjaCA6cG9zaXRpb24sIDAKKyAgICAgIEBsaW5lICAgICA9IG9wdGlvbnMuZmV0Y2ggOmxpbmUsIDEKKyAgICAgIEBjb2x1bW4gICA9IG9wdGlvbnMuZmV0Y2ggOmNvbHVtbiwgMAorICAgICAgQG1hcmtlcnMgPSBbXQorICAgICAgbWFyaworICAgICAgQGluaXRpYWxpemVkID0gQGVvZiA9IGZhbHNlCisgICAgICBAcmVhZGxpbmUgPSBibG9jayBvciByYWlzZSggQXJndW1lbnRFcnJvciwgIm5vIGxpbmUtcmVhZGluZyBibG9jayB3YXMgcHJvdmlkZWQiICkKKyAgICAgIEBuYW1lIHx8PSBvcHRpb25zWyA6ZmlsZSBdIHx8IG9wdGlvbnNbIDpuYW1lIF0gfHwgJyhpbnRlcmFjdGl2ZSknCisgICAgZW5kCisgICAgCisgICAgZGVmIHJlYWRsaW5lCisgICAgICBAaW5pdGlhbGl6ZWQgPSB0cnVlCisgICAgICB1bmxlc3MgQGVvZgorICAgICAgICBpZiBsaW5lID0gQHJlYWRsaW5lLmNhbGwKKyAgICAgICAgICBAZGF0YSA8PCBsaW5lLnRvX3MKKyAgICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgICBlbHNlCisgICAgICAgICAgQGVvZiA9IHRydWUKKyAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgZW5kCisgIAorICBwcml2YXRlIDpyZWFkbGluZQorICAKKyAgZGVmIGNvbnN1bWUKKyAgICBAcG9zaXRpb24gPCBAZGF0YS5zaXplIGFuZCByZXR1cm4oIHN1cGVyICkKKyAgICB1bmxlc3MgQGVvZgorICAgICAgcmVhZGxpbmUKKyAgICAgIGNvbnN1bWUKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgcGVlayggaSA9IDEgKQorICAgIGkuemVybz8gYW5kIHJldHVybiAwCisgICAgaSArPSAxIGlmIGkgPCAwCisgICAgaW5kZXggPSBAcG9zaXRpb24gKyBpIC0gMQorICAgIGluZGV4IDwgMCBhbmQgcmV0dXJuIDAKKyAgICAKKyAgICBpZiBpbmRleCA8IEBkYXRhLnNpemUKKyAgICAgIGNoYXIgPSBAZGF0YVsgaW5kZXggXQorICAgIGVsc2lmIHJlYWRsaW5lCisgICAgICBwZWVrKCBpICkKKyAgICBlbHNlIEVPRgorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBsb29rKCBpID0gMSApCisgICAgcGVlayggaSApLmNociByZXNjdWUgRU9GCisgIGVuZAorICAKKyAgZGVmIHN1YnN0cmluZyggc3RhcnQsIHN0b3AgKQorICAgIGZpbGxfdGhyb3VnaCggc3RvcCApCisgICAgQHN0cmluZ1sgc3RhcnQgLi4gc3RvcCBdCisgIGVuZAorICAKK3ByaXZhdGUKKyAgCisgIGRlZiBmaWxsX3Rocm91Z2goIHBvc2l0aW9uICkKKyAgICBAZW9mIGFuZCByZXR1cm4KKyAgICBpZiBAcG9zaXRpb24gPCAwIHRoZW4gZmlsbF9vdXQKKyAgICBlbHNlIHJlYWRsaW5lIHVudGlsICggQGRhdGEuc2l6ZSA+IEBwb3NpdGlvbiBvciBAZW9mICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgZmlsbF9vdXQKKyAgICBAZW9mIGFuZCByZXR1cm4KKyAgICByZWFkbGluZSB1bnRpbCBAZW9mCisgIGVuZAorZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3N0cmVhbXMvcmV3cml0ZS5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9zdHJlYW1zL3Jld3JpdGUucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTk0NWRlYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy9zdHJlYW1zL3Jld3JpdGUucmIKQEAgLTAsMCArMSw0MjQgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKK21vZHVsZSBBTlRMUjMKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW0KKworVG9rZW5SZXdyaXRlU3RyZWFtIGlzIGEgc3BlY2lhbGl6ZWQgZm9ybSBvZiBDb21tb25Ub2tlblN0cmVhbSB0aGF0IHByb3ZpZGVzIHNpbXBsZSBzdHJlYW0gZWRpdGluZyBmdW5jdGlvbmFsaXR5LiBCeSBjcmVhdGluZyA8aT5yZXdyaXRlIHByb2dyYW1zPC9pPiwgbmV3IHRleHQgb3V0cHV0IGNhbiBiZSBjcmVhdGVkIGJhc2VkIHVwb24gdGhlIHRva2VucyBpbiB0aGUgc3RyZWFtLiBUaGUgYmFzaWMgdG9rZW4gc3RyZWFtIGl0c2VsZiBpcyBwcmVzZXJ2ZWQsIGFuZCB0ZXh0IG91dHB1dCBpcyByZW5kZXJlZCBvbiBkZW1hbmQgdXNpbmcgdGhlICN0b19zIG1ldGhvZC4KKworPWVuZAorCitjbGFzcyBUb2tlblJld3JpdGVTdHJlYW0gPCBDb21tb25Ub2tlblN0cmVhbQorCisgIHVubGVzcyBkZWZpbmVkPyggUmV3cml0ZU9wZXJhdGlvbiApCisgICAgUmV3cml0ZU9wZXJhdGlvbiA9IFN0cnVjdC5uZXcoIDpzdHJlYW0sIDpsb2NhdGlvbiwgOnRleHQgKQorICBlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW06OlJld3JpdGVPcGVyYXRpb24KKworUmV3aXRlT3BlcmF0aW9uIG9iamVjdHMgcmVwcmVzZW50IHNvbWUgcGFydGljdWxhciBlZGl0aW5nIGNvbW1hbmQgdGhhdCBzaG91bGQKK2JlIGV4ZWN1dGVkIGJ5IGEgdG9rZW4gcmV3cml0ZSBzdHJlYW0gYXQgc29tZSB0aW1lIGluIGZ1dHVyZSB3aGVuIHRoZSBzdHJlYW0gaXMKK3JlbmRlcmluZyBhIHJld3JpdHRlbiBzdHJlYW0uCisKK1RvIHBlcmZvcm0gdG9rZW4gc3RyZWFtIHJld3JpdGVzIHNhZmVseSBhbmQgZWZmaWNpZW50bHksIHRoZSByZXdyaXRlcyBhcmUKK2V4ZWN1dGVkIGxhemlseSAodGhhdCBpcywgb25seSB3aGVuIHRoZSByZXdyaXR0ZW4gdGV4dCBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCkuCitSZXdyaXRlIHN0cmVhbXMgaW1wbGVtZW50IGxhenkgcmV3cml0aW5nIGJ5IHN0b3JpbmcgdGhlIHBhcmFtZXRlcnMgb2YKK2VkaXQtaW5kdWNpbmcgbWV0aG9kcyBsaWtlICtkZWxldGUrIGFuZCAraW5zZXJ0KyBhcyBSZXdyaXRlT3BlcmF0aW9uIG9iamVjdHMgaW4KK2EgcmV3cml0ZSBwcm9ncmFtIGxpc3QuCisKK1RoZSB0aHJlZSBzdWJjbGFzc2VzIG9mIFJld3JpdGVPcGVyYXRpb24sIEluc2VydEJlZm9yZSwgRGVsZXRlLCBhbmQgUmVwbGFjZSwKK2RlZmluZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RyZWFtIGVkaXRzLgorCis9ZW5kCisKKyAgY2xhc3MgUmV3cml0ZU9wZXJhdGlvbgorICAgIGV4dGVuZCBDbGFzc01hY3JvcworICAgIEBvcGVyYXRpb25fbmFtZSA9ICcnCisgICAgCisgICAgY2xhc3MgPDwgc2VsZgorICAgICAgIyMKKyAgICAgICMgdGhlIHByaW50YWJsZSBuYW1lIG9mIG9wZXJhdGlvbnMgcmVwcmVzZW50ZWQgYnkgdGhlIGNsYXNzIC0tIHVzZWQgZm9yIGluc3BlY3Rpb24KKyAgICAgIGF0dHJfcmVhZGVyIDpvcGVyYXRpb25fbmFtZQorICAgIGVuZAorICAgIAorICAgICMjCisgICAgIyA6bWV0aG9kOiBleGVjdXRlKCBidWZmZXIgKQorICAgICMgcnVuIHRoZSByZXdyaXRlIG9wZXJhdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCBhbmQgYXBwZW5kIHRoZSBvdXRwdXQgdG8gK2J1ZmZlcisKKyAgICBhYnN0cmFjdCA6ZXhlY3V0ZQorICAgIAorICAgICMjCisgICAgIyByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBvcGVyYXRpb24gYXMgc2V0IGJ5IGl0cyBjbGFzcworICAgIGRlZiBuYW1lCisgICAgICBzZWxmLmNsYXNzLm9wZXJhdGlvbl9uYW1lCisgICAgZW5kCisgICAgCisgICAgIyMKKyAgICAjIHJldHVybiBhIGNvbXBhY3QsIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uCisgICAgZGVmIGluc3BlY3QKKyAgICAgIHJldHVybiAiKCVzIEAgJXAgOiAlcCkiICUgWyBuYW1lLCBsb2NhdGlvbiwgdGV4dCBdCisgICAgZW5kCisgIGVuZAorICAKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW06Okluc2VydEJlZm9yZQorCitSZXByZXNlbnRzIHJld3JpdGUgb3BlcmF0aW9uOgorCithZGQgc3RyaW5nIDx0dD5vcC50ZXh0PC90dD4gdG8gdGhlIHJld3JpdGUgb3V0cHV0IGltbWVkaWF0ZWx5IGJlZm9yZSBhZGRpbmcgdGhlCit0ZXh0IGNvbnRlbnQgb2YgdGhlIHRva2VuIGF0IGluZGV4IDx0dD5vcC5pbmRleDwvdHQ+CisKKz1lbmQKKyAgCisgIGNsYXNzIEluc2VydEJlZm9yZSA8IFJld3JpdGVPcGVyYXRpb24KKyAgICBAb3BlcmF0aW9uX25hbWUgPSAnaW5zZXJ0LWJlZm9yZScuZnJlZXplCisgICAgCisgICAgYWxpYXMgaW5kZXggIGxvY2F0aW9uCisgICAgYWxpYXMgaW5kZXg9IGxvY2F0aW9uPQorICAgIAorICAgIGRlZiBleGVjdXRlKCBidWZmZXIgKQorICAgICAgYnVmZmVyIDw8IHRleHQudG9fcworICAgICAgdG9rZW4gPSBzdHJlYW1bIGxvY2F0aW9uIF0KKyAgICAgIGJ1ZmZlciA8PCB0b2tlbi50ZXh0LnRvX3MgaWYgdG9rZW4KKyAgICAgIHJldHVybiBsb2NhdGlvbiArIDEKKyAgICBlbmQKKyAgZW5kCisgIAorPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW06OlJlcGxhY2UKKworUmVwcmVzZW50cyByZXdyaXRlIG9wZXJhdGlvbjoKKworYWRkIHRleHQgPHR0Pm9wLnRleHQ8L3R0PiB0byB0aGUgcmV3cml0ZSBidWZmZXIgaW4gbGlldSBvZiB0aGUgdGV4dCBvZiB0b2tlbnMKK2luZGV4ZWQgd2l0aGluIHRoZSByYW5nZSA8dHQ+b3AuaW5kZXggLi4gb3AubGFzdF9pbmRleDwvdHQ+CisKKz1lbmQKKyAgCisgIGNsYXNzIFJlcGxhY2UgPCBSZXdyaXRlT3BlcmF0aW9uCisgICAgCisgICAgQG9wZXJhdGlvbl9uYW1lID0gJ3JlcGxhY2UnLmZyZWV6ZQorICAgIAorICAgIGRlZiBpbml0aWFsaXplKCBzdHJlYW0sIGxvY2F0aW9uLCB0ZXh0ICkKKyAgICAgIHN1cGVyKCBzdHJlYW0sIG5pbCwgdGV4dCApCisgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KKyAgICBlbmQKKyAgICAKKyAgICBkZWYgbG9jYXRpb249KCB2YWwgKQorICAgICAgY2FzZSB2YWwKKyAgICAgIHdoZW4gUmFuZ2UgdGhlbiBzdXBlciggdmFsICkKKyAgICAgIGVsc2UKKyAgICAgICAgdmFsID0gdmFsLnRvX2kKKyAgICAgICAgc3VwZXIoIHZhbC4udmFsICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiBleGVjdXRlKCBidWZmZXIgKQorICAgICAgYnVmZmVyIDw8IHRleHQudG9fcyB1bmxlc3MgdGV4dC5uaWw/CisgICAgICByZXR1cm4oIGxvY2F0aW9uLmVuZCArIDEgKQorICAgIGVuZAorICAgIAorICAgIGRlZiBpbmRleAorICAgICAgbG9jYXRpb24uZmlyc3QKKyAgICBlbmQKKyAgICAKKyAgZW5kCisgIAorPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW06OkRlbGV0ZQorCitSZXByZXNlbnRzIHJld3JpdGUgb3BlcmF0aW9uOgorCitza2lwIG92ZXIgdGhlIHRva2VucyBpbmRleGVkIHdpdGhpbiB0aGUgcmFuZ2UgPHR0Pm9wLmluZGV4IC4uIG9wLmxhc3RfaW5kZXg8L3R0PgorYW5kIGRvIG5vdCBhZGQgYW55IHRleHQgdG8gdGhlIHJld3JpdGUgYnVmZmVyCisKKz1lbmQKKyAgCisgIGNsYXNzIERlbGV0ZSA8IFJlcGxhY2UKKyAgICBAb3BlcmF0aW9uX25hbWUgPSAnZGVsZXRlJy5mcmVlemUKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZSggc3RyZWFtLCBsb2NhdGlvbiApCisgICAgICBzdXBlciggc3RyZWFtLCBsb2NhdGlvbiwgbmlsICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBjbGFzcyBSZXdyaXRlUHJvZ3JhbQorICAgIGRlZiBpbml0aWFsaXplKCBzdHJlYW0sIG5hbWUgPSBuaWwgKQorICAgICAgQHN0cmVhbSA9IHN0cmVhbQorICAgICAgQG5hbWUgPSBuYW1lCisgICAgICBAb3BlcmF0aW9ucyA9IFtdCisgICAgZW5kCisgICAgCisgICAgZGVmIHJlcGxhY2UoICpyYW5nZV9hcmd1bWVudHMgKQorICAgICAgcmFuZ2UsIHRleHQgPSBjYXN0X3JhbmdlKCByYW5nZV9hcmd1bWVudHMsIDEgKQorICAgICAgCisgICAgICBvcCA9IFJlcGxhY2UubmV3KCBAc3RyZWFtLCByYW5nZSwgdGV4dCApCisgICAgICBAb3BlcmF0aW9ucyA8PCBvcAorICAgICAgcmV0dXJuIG9wCisgICAgZW5kCisgICAgCisgICAgZGVmIGluc2VydF9iZWZvcmUoIGluZGV4LCB0ZXh0ICkKKyAgICAgIGluZGV4ID0gaW5kZXgudG9faQorICAgICAgaW5kZXggPCAwIGFuZCBpbmRleCArPSBAc3RyZWFtLmxlbmd0aAorICAgICAgb3AgPSBJbnNlcnRCZWZvcmUubmV3KCBAc3RyZWFtLCBpbmRleCwgdGV4dCApCisgICAgICBAb3BlcmF0aW9ucyA8PCBvcAorICAgICAgcmV0dXJuIG9wCisgICAgZW5kCisgICAgCisgICAgZGVmIGluc2VydF9hZnRlciggaW5kZXgsIHRleHQgKQorICAgICAgaW5kZXggPSBpbmRleC50b19pCisgICAgICBpbmRleCA8IDAgYW5kIGluZGV4ICs9IEBzdHJlYW0ubGVuZ3RoCisgICAgICBvcCA9IEluc2VydEJlZm9yZS5uZXcoIEBzdHJlYW0sIGluZGV4ICsgMSwgdGV4dCApCisgICAgICBAb3BlcmF0aW9ucyA8PCBvcAorICAgICAgcmV0dXJuIG9wCisgICAgZW5kCisgICAgCisgICAgZGVmIGRlbGV0ZSggKnJhbmdlX2FyZ3VtZW50cyApCisgICAgICByYW5nZSwgPSBjYXN0X3JhbmdlKCByYW5nZV9hcmd1bWVudHMgKQorICAgICAgb3AgPSBEZWxldGUubmV3KCBAc3RyZWFtLCByYW5nZSApCisgICAgICBAb3BlcmF0aW9ucyA8PCBvcAorICAgICAgcmV0dXJuIG9wCisgICAgZW5kCisgIAorICAgIGRlZiByZWR1Y2UKKyAgICAgIG9wZXJhdGlvbnMgPSBAb3BlcmF0aW9ucy5yZXZlcnNlCisgICAgICByZWR1Y2VkID0gW10KKyAgICAgIAorICAgICAgdW50aWwgb3BlcmF0aW9ucy5lbXB0eT8KKyAgICAgICAgb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5zaGlmdAorICAgICAgICBsb2NhdGlvbiA9IG9wZXJhdGlvbi5sb2NhdGlvbgorICAgICAgICAKKyAgICAgICAgY2FzZSBvcGVyYXRpb24KKyAgICAgICAgd2hlbiBSZXBsYWNlCisgICAgICAgICAgb3BlcmF0aW9ucy5kZWxldGVfaWYgZG8gfHByaW9yX29wZXJhdGlvbnwKKyAgICAgICAgICAgIHByaW9yX2xvY2F0aW9uID0gcHJpb3Jfb3BlcmF0aW9uLmxvY2F0aW9uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgcHJpb3Jfb3BlcmF0aW9uCisgICAgICAgICAgICB3aGVuIEluc2VydEJlZm9yZQorICAgICAgICAgICAgICBsb2NhdGlvbi5pbmNsdWRlPyggcHJpb3JfbG9jYXRpb24gKQorICAgICAgICAgICAgd2hlbiBSZXBsYWNlCisgICAgICAgICAgICAgIGlmIGxvY2F0aW9uLmNvdmVycz8oIHByaW9yX2xvY2F0aW9uICkKKyAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICAgIGVsc2lmIGxvY2F0aW9uLm92ZXJsYXBzPyggcHJpb3JfbG9jYXRpb24gKQorICAgICAgICAgICAgICAgIGNvbmZsaWN0ISggb3BlcmF0aW9uLCBwcmlvcl9vcGVyYXRpb24gKQorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICB3aGVuIEluc2VydEJlZm9yZQorICAgICAgICAgIG9wZXJhdGlvbnMuZGVsZXRlX2lmIGRvIHxwcmlvcl9vcGVyYXRpb258CisgICAgICAgICAgICBwcmlvcl9sb2NhdGlvbiA9IHByaW9yX29wZXJhdGlvbi5sb2NhdGlvbgorICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIHByaW9yX29wZXJhdGlvbgorICAgICAgICAgICAgd2hlbiBJbnNlcnRCZWZvcmUKKyAgICAgICAgICAgICAgaWYgcHJpb3JfbG9jYXRpb24gPT0gbG9jYXRpb24KKyAgICAgICAgICAgICAgICBvcGVyYXRpb24udGV4dCArPSBwcmlvcl9vcGVyYXRpb24udGV4dAorICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB3aGVuIFJlcGxhY2UKKyAgICAgICAgICAgICAgaWYgbG9jYXRpb24gPT0gcHJpb3JfbG9jYXRpb24uZmlyc3QKKyAgICAgICAgICAgICAgICBwcmlvcl9vcGVyYXRpb24udGV4dCA9IG9wZXJhdGlvbi50ZXh0IDw8IHByaW9yX29wZXJhdGlvbi50ZXh0LnRvX3MKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBuaWwKKyAgICAgICAgICAgICAgICBicmVhayggZmFsc2UgKQorICAgICAgICAgICAgICBlbHNpZiBwcmlvcl9sb2NhdGlvbi5pbmNsdWRlPyggbG9jYXRpb24gKQorICAgICAgICAgICAgICAgIGNvbmZsaWN0ISggb3BlcmF0aW9uLCBwcmlvcl9vcGVyYXRpb24gKQorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgIHJlZHVjZWQudW5zaGlmdCggb3BlcmF0aW9uICkgaWYgb3BlcmF0aW9uCisgICAgICBlbmQKKyAgICAgIAorICAgICAgQG9wZXJhdGlvbnMucmVwbGFjZSggcmVkdWNlZCApCisgICAgICAKKyAgICAgIEBvcGVyYXRpb25zLmluamVjdCgge30gKSBkbyB8bWFwLCBvcGVyYXRpb258CisgICAgICAgIG90aGVyX29wZXJhaXRvbiA9IG1hcFsgb3BlcmF0aW9uLmluZGV4IF0gYW5kCisgICAgICAgICAgQU5UTFIzLmJ1ZyEoIFV0aWwudGlkeSggPDwtRU5EICkgJSBbIHNlbGYuY2xhc3MsIG9wZXJhdGlvbiwgb3RoZXJfb3BlcmFpdG9uIF0gKQorICAgICAgICAgIHwgJXMjcmVkdWNlISBzaG91bGQgaGF2ZSBsZWZ0IG9ubHkgb25lIG9wZXJhdGlvbiBwZXIgaW5kZXgsCisgICAgICAgICAgfCBidXQgJXAgY29uZmxpY3RzIHdpdGggJXAKKyAgICAgICAgICBFTkQKKyAgICAgICAgbWFwWyBvcGVyYXRpb24uaW5kZXggXSA9IG9wZXJhdGlvbgorICAgICAgICBtYXAKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiBleGVjdXRlKCAqcmFuZ2VfYXJndW1lbnRzICkKKyAgICAgIGlmIHJhbmdlX2FyZ3VtZW50cy5lbXB0eT8KKyAgICAgICAgcmFuZ2UgPSAwIC4uLiBAc3RyZWFtLmxlbmd0aAorICAgICAgZWxzZQorICAgICAgICByYW5nZSwgPSBjYXN0X3JhbmdlKCByYW5nZV9hcmd1bWVudHMgKQorICAgICAgZW5kCisgICAgICAKKyAgICAgIG91dHB1dCA9ICcnCisgICAgICAKKyAgICAgIHRva2VucyA9IEBzdHJlYW0udG9rZW5zCisgICAgICAKKyAgICAgIG9wZXJhdGlvbnMgPSByZWR1Y2UKKyAgICAgIAorICAgICAgY3Vyc29yID0gcmFuZ2UuZmlyc3QKKyAgICAgIHdoaWxlIHJhbmdlLmluY2x1ZGU/KCBjdXJzb3IgKQorICAgICAgICBpZiBvcGVyYXRpb24gPSBvcGVyYXRpb25zLmRlbGV0ZSggY3Vyc29yICkKKyAgICAgICAgICBjdXJzb3IgPSBvcGVyYXRpb24uZXhlY3V0ZSggb3V0cHV0ICkKKyAgICAgICAgZWxzZQorICAgICAgICAgIHRva2VuID0gdG9rZW5zWyBjdXJzb3IgXQorICAgICAgICAgIG91dHB1dCA8PCB0b2tlbi50ZXh0IGlmIHRva2VuCisgICAgICAgICAgY3Vyc29yICs9IDEKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIGlmIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnMuZGVsZXRlKCBjdXJzb3IgKSBhbmQKKyAgICAgICAgIG9wZXJhdGlvbi5pc19hPyggSW5zZXJ0QmVmb3JlICkKKyAgICAgICAgIyBjYXRjaCBlZGdlICdpbnNlcnQtYWZ0ZXInIG9wZXJhdGlvbnMKKyAgICAgICAgb3BlcmF0aW9uLmV4ZWN1dGUoIG91dHB1dCApCisgICAgICBlbmQKKyAgICAgIAorICAgICAgcmV0dXJuIG91dHB1dAorICAgIGVuZAorICAgIAorICAgIGRlZiBjbGVhcgorICAgICAgQG9wZXJhdGlvbnMuY2xlYXIKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdW5kbyggbnVtYmVyX29mX29wZXJhdGlvbnMgPSAxICkKKyAgICAgIEBvcGVyYXRpb25zLnBvcCggbnVtYmVyX29mX29wZXJhdGlvbnMgKQorICAgIGVuZAorICAgIAorICAgIGRlZiBjb25mbGljdCEoIGN1cnJlbnQsIHByZXZpb3VzICkKKyAgICAgIG1lc3NhZ2UgPSAnb3BlcmF0aW9uICVwIG92ZXJsYXBzIHdpdGggcHJldmlvdXMgb3BlcmF0aW9uICVwJyAlIFsgY3VycmVudCwgcHJldmlvdXMgXQorICAgICAgcmFpc2UoIFJhbmdlRXJyb3IsIG1lc3NhZ2UsIGNhbGxlciApCisgICAgZW5kCisgICAgCisgICAgZGVmIGNhc3RfcmFuZ2UoIGFyZ3MsIGV4dHJhID0gMCApCisgICAgICBzaW5nbGUsIHBhaXIgPSBleHRyYSArIDEsIGV4dHJhICsgMgorICAgICAgY2FzZSBjaGVja19hcmd1bWVudHMoIGFyZ3MsIHNpbmdsZSwgcGFpciApCisgICAgICB3aGVuIHNpbmdsZQorICAgICAgICBsb2MgPSBhcmdzLnNoaWZ0CisgICAgICAgIAorICAgICAgICBpZiBsb2MuaXNfYT8oIFJhbmdlICkKKyAgICAgICAgICBmaXJzdCwgbGFzdCA9IGxvYy5maXJzdC50b19pLCBsb2MubGFzdC50b19pCisgICAgICAgICAgbG9jLmV4Y2x1ZGVfZW5kPyBhbmQgbGFzdCAtPSAxCisgICAgICAgICAgcmV0dXJuIGNhc3RfcmFuZ2UoIGFyZ3MudW5zaGlmdCggZmlyc3QsIGxhc3QgKSwgZXh0cmEgKQorICAgICAgICBlbHNlCisgICAgICAgICAgbG9jID0gbG9jLnRvX2kKKyAgICAgICAgICByZXR1cm4gY2FzdF9yYW5nZSggYXJncy51bnNoaWZ0KCBsb2MsIGxvYyApLCBleHRyYSApCisgICAgICAgIGVuZAorICAgICAgd2hlbiBwYWlyCisgICAgICAgIGZpcnN0LCBsYXN0ID0gYXJncy5zaGlmdCggMiApLm1hcCEgeyB8YXJnfCBhcmcudG9faSB9CisgICAgICAgIGlmIGZpcnN0IDwgMCBhbmQgbGFzdCA8IDAKKyAgICAgICAgICBmaXJzdCArPSBAc3RyZWFtLmxlbmd0aAorICAgICAgICAgIGxhc3QgKz0gQHN0cmVhbS5sZW5ndGgKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxhc3QgPCAwIGFuZCBsYXN0ICs9IEBzdHJlYW0ubGVuZ3RoCisgICAgICAgICAgZmlyc3QgPSBmaXJzdC5hdF9sZWFzdCggMCApCisgICAgICAgIGVuZAorICAgICAgICByZXR1cm4oIGFyZ3MudW5zaGlmdCggZmlyc3QgLi4gbGFzdCApICkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiBjaGVja19hcmd1bWVudHMoIGFyZ3MsIG1pbiwgbWF4ICkKKyAgICAgIG4gPSBhcmdzLmxlbmd0aAorICAgICAgaWYgbiA8IG1pbgorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLAorICAgICAgICAgICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgjeyBhcmdzLmxlbmd0aCB9IGZvciAjeyBtaW4gfSkiLAorICAgICAgICAgIGNhbGxlcgorICAgICAgZWxzaWYgbiA+IG1heAorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLAorICAgICAgICAgICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgjeyBhcmdzLmxlbmd0aCB9IGZvciAjeyBtYXggfSkiLAorICAgICAgICAgIGNhbGxlcgorICAgICAgZWxzZSByZXR1cm4gbgorICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgcHJpdmF0ZSA6Y29uZmxpY3QhLCA6Y2FzdF9yYW5nZSwgOmNoZWNrX2FyZ3VtZW50cworICBlbmQKKyAgICAKKyAgYXR0cl9yZWFkZXIgOnByb2dyYW1zCisKKyAgZGVmIGluaXRpYWxpemUoIHRva2VuX3NvdXJjZSwgb3B0aW9ucyA9IHt9ICkKKyAgICBzdXBlciggdG9rZW5fc291cmNlLCBvcHRpb25zICkKKyAgICAKKyAgICBAcHJvZ3JhbXMgPSBIYXNoLm5ldyBkbyB8cHJvZ3JhbXMsIG5hbWV8CisgICAgICBpZiBuYW1lLmlzX2E/KCBTdHJpbmcgKQorICAgICAgICBwcm9ncmFtc1sgbmFtZSBdID0gUmV3cml0ZVByb2dyYW0ubmV3KCBzZWxmLCBuYW1lICkKKyAgICAgIGVsc2UgcHJvZ3JhbXNbIG5hbWUudG9fcyBdCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBAbGFzdF9yZXdyaXRlX3Rva2VuX2luZGV4ZXMgPSB7fQorICBlbmQKKyAgCisgIGRlZiByZXdyaXRlKCBwcm9ncmFtX25hbWUgPSAnZGVmYXVsdCcsIHJhbmdlID0gbmlsICkKKyAgICBwcm9ncmFtID0gQHByb2dyYW1zWyBwcm9ncmFtX25hbWUgXQorICAgIGlmIGJsb2NrX2dpdmVuPworICAgICAgeWllbGQoIHByb2dyYW0gKQorICAgICAgcHJvZ3JhbS5leGVjdXRlKCByYW5nZSApCisgICAgZWxzZSBwcm9ncmFtCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHByb2dyYW0oIG5hbWUgPSAnZGVmYXVsdCcgKQorICAgIHJldHVybiBAcHJvZ3JhbXNbIG5hbWUgXQorICBlbmQKKyAgCisgIGRlZiBkZWxldGVfcHJvZ3JhbSggbmFtZSA9ICdkZWZhdWx0JyApCisgICAgQHByb2dyYW1zLmRlbGV0ZSggbmFtZSApCisgIGVuZAorICAKKyAgZGVmIG9yaWdpbmFsX3N0cmluZyggc3RhcnQgPSAwLCBmaW5pc2ggPSBzaXplIC0gMSApCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIAorICAgIHJldHVybiggc2VsZlsgc3RhcnQuLmZpbmlzaCBdLm1hcCB7IHx0fCB0LnRleHQgfS5qb2luKCAnJyApICkKKyAgZW5kCisKKyAgZGVmIGluc2VydF9iZWZvcmUoICphcmdzICkKKyAgICBAcHJvZ3JhbXNbICdkZWZhdWx0JyBdLmluc2VydF9iZWZvcmUoICphcmdzICkKKyAgZW5kCisgIAorICBkZWYgaW5zZXJ0X2FmdGVyKCAqYXJncyApCisgICAgQHByb2dyYW1zWyAnZGVmYXVsdCcgXS5pbnNlcnRfYWZ0ZXIoICphcmdzICkKKyAgZW5kCisgIAorICBkZWYgcmVwbGFjZSggKmFyZ3MgKQorICAgIEBwcm9ncmFtc1sgJ2RlZmF1bHQnIF0ucmVwbGFjZSggKmFyZ3MgKQorICBlbmQKKyAgCisgIGRlZiBkZWxldGUoICphcmdzICkKKyAgICBAcHJvZ3JhbXNbICdkZWZhdWx0JyBdLmRlbGV0ZSggKmFyZ3MgKQorICBlbmQKKyAgCisgIGRlZiByZW5kZXIoICphcmd1bWVudHMgKQorICAgIGNhc2UgYXJndW1lbnRzLmZpcnN0CisgICAgd2hlbiBTdHJpbmcsIFN5bWJvbCB0aGVuIG5hbWUgPSBhcmd1bWVudHMuc2hpZnQudG9fcworICAgIGVsc2UgbmFtZSA9ICdkZWZhdWx0JworICAgIGVuZAorICAgIEBwcm9ncmFtc1sgbmFtZSBdLmV4ZWN1dGUoICphcmd1bWVudHMgKQorICBlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGFzay5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90YXNrLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjU3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGFzay5yYgpAQCAtMCwwICsxLDQ4OCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMnCityZXF1aXJlICdzZXQnCityZXF1aXJlICdyYWtlJworcmVxdWlyZSAncmFrZS90YXNrbGliJworcmVxdWlyZSAnc2hlbGx3b3JkcycKKworbW9kdWxlIEFOVExSMworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkNvbXBpbGVUYXNrCisKK0EgcmFrZSB0YXNrLWdlbmVyYXRpbmcgdXRpbGl0eSBjb25jZXJuaW5nIEFOVExSIGdyYW1tYXIgZmlsZQorY29tcGlsYXRpb24uIFRoaXMgaXMgYSBnZW5lcmFsIHV0aWxpdHkgLS0gdGhlIGdyYW1tYXJzIGRvCitub3QgaGF2ZSB0byBiZSB0YXJnZXR0ZWQgZm9yIFJ1Ynkgb3V0cHV0OyBpdCBoYW5kbGVzIGFsbAora25vd24gQU5UTFIgbGFuZ3VhZ2UgdGFyZ2V0cy4KKworICByZXF1aXJlICdhbnRscjMvdGFzaycKKyAgCisgIEFOVExSMzo6Q29tcGlsZVRhc2suZGVmaW5lKAorICAgIDpuYW1lID0+ICdncmFtbWFycycsIDpvdXRwdXRfZGlyZWN0b3J5ID0+ICdsaWIvcGFyc2VycycKKyAgKSBkbyB8IHQgfAorICAgIHQuZ3JhbW1hcl9zZXQoICdhbnRsci9NYWluUGFyc2VyLmcnLCAnYW50bHIvTWFpblRyZWUuZycgKQorICAgIAorICAgIHQuZ3JhbW1hcl9zZXQoICdhbnRsci9UZW1wbGF0ZS5nJyApIGRvIHwgZ3JhbSB8CisgICAgICBncmFtLm91dHB1dF9kaXJlY3RvcnkgPSAnbGliL3BhcnNlcnMvdGVtcGxhdGUnCisgICAgICBncmFtLmRlYnVnID0gdHJ1ZQorICAgIGVuZAorICBlbmQKKyAgCisKK1RPRE86IGZpbmlzaCBkb2N1bWVudGF0aW9uCisKKz1lbmQKKworY2xhc3MgQ29tcGlsZVRhc2sgPCBSYWtlOjpUYXNrTGliCisgIGF0dHJfcmVhZGVyIDpncmFtbWFyX3NldHMsIDpvcHRpb25zCisgIGF0dHJfYWNjZXNzb3IgOm5hbWUKKyAgCisgIGRlZiBzZWxmLmRlZmluZSggKmdyYW1tYXJfZmlsZXMgKQorICAgIGxpYiA9IG5ldyggKmdyYW1tYXJfZmlsZXMgKQorICAgIGJsb2NrX2dpdmVuPyBhbmQgeWllbGQoIGxpYiApCisgICAgbGliLmRlZmluZQorICAgIHJldHVybiggbGliICkKKyAgZW5kCisgIAorICBkZWYgaW5pdGlhbGl6ZSggKmdyYW1tYXJfZmlsZXMgKQorICAgIGdyYW1tYXJfZmlsZXMgPSBbIGdyYW1tYXJfZmlsZXMgXS5mbGF0dGVuIQorICAgIG9wdGlvbnMgPSBIYXNoID09PSBncmFtbWFyX2ZpbGVzLmxhc3QgPyBncmFtbWFyX2ZpbGVzLnBvcCA6IHt9CisgICAgQGdyYW1tYXJfc2V0cyA9IFtdCisgICAgQG5hbWUgPSBvcHRpb25zLmZldGNoKCA6bmFtZSwgJ2FudGxyLWdyYW1tYXJzJyApCisgICAgQG9wdGlvbnMgPSBvcHRpb25zCisgICAgQG5hbWVzcGFjZSA9IFJha2UuYXBwbGljYXRpb24uY3VycmVudF9zY29wZQorICAgIGdyYW1tYXJfZmlsZXMuZW1wdHk/IG9yIGdyYW1tYXJfc2V0KCBncmFtbWFyX2ZpbGVzICkKKyAgZW5kCisgIAorICBkZWYgdGFyZ2V0X2ZpbGVzCisgICAgQGdyYW1tYXJfc2V0cy5pbmplY3QoIFtdICkgZG8gfCBsaXN0LCBzZXQgfAorICAgICAgbGlzdC5jb25jYXQoIHNldC50YXJnZXRfZmlsZXMgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBncmFtbWFyX3NldCggKmdyYW1tYXJfZmlsZXMgKQorICAgIGdyYW1tYXJfZmlsZXMgPSBbIGdyYW1tYXJfZmlsZXMgXS5mbGF0dGVuIQorICAgIG9wdGlvbnMgPSBAb3B0aW9ucy5tZXJnZSggCisgICAgICBIYXNoID09PSBncmFtbWFyX2ZpbGVzLmxhc3QgPyBncmFtbWFyX2ZpbGVzLnBvcCA6IHt9CisgICAgKQorICAgIHNldCA9IEdyYW1tYXJTZXQubmV3KCBncmFtbWFyX2ZpbGVzLCBvcHRpb25zICkKKyAgICBibG9ja19naXZlbj8gYW5kIHlpZWxkKCBzZXQgKQorICAgIEBncmFtbWFyX3NldHMgPDwgc2V0CisgICAgcmV0dXJuKCBzZXQgKQorICBlbmQKKyAgCisgIGRlZiBjb21waWxlX3Rhc2sKKyAgICBmdWxsX25hbWUgPSAoIEBuYW1lc3BhY2UgKyBbIEBuYW1lLCAnY29tcGlsZScgXSApLmpvaW4oICc6JyApCisgICAgUmFrZTo6VGFza1sgZnVsbF9uYW1lIF0KKyAgZW5kCisgIAorICBkZWYgY29tcGlsZSEKKyAgICBjb21waWxlX3Rhc2suaW52b2tlCisgIGVuZAorICAKKyAgZGVmIGNsb2JiZXJfdGFzaworICAgIGZ1bGxfbmFtZSA9ICggQG5hbWVzcGFjZSArIFsgQG5hbWUsICdjbG9iYmVyJyBdICkuam9pbiggJzonICkKKyAgICBSYWtlOjpUYXNrWyBmdWxsX25hbWUgXQorICBlbmQKKyAgCisgIGRlZiBjbG9iYmVyIQorICAgIGNsb2JiZXJfdGFzay5pbnZva2UKKyAgZW5kCisgIAorICBkZWYgZGVmaW5lCisgICAgbmFtZXNwYWNlKCBAbmFtZSApIGRvCisgICAgICBkZXNjKCAidHJhc2ggYWxsIEFOVExSLWdlbmVyYXRlZCBzb3VyY2UgY29kZSIgKQorICAgICAgdGFzayggJ2Nsb2JiZXInICkgZG8KKyAgICAgICAgZm9yIHNldCBpbiBAZ3JhbW1hcl9zZXRzCisgICAgICAgICAgc2V0LmNsZWFuCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAKKyAgICAgIGZvciBzZXQgaW4gQGdyYW1tYXJfc2V0cworICAgICAgICBzZXQuZGVmaW5lX3Rhc2tzCisgICAgICBlbmQKKyAgICAgIAorICAgICAgZGVzYyggImNvbXBpbGUgQU5UTFIgZ3JhbW1hcnMiICkKKyAgICAgIHRhc2soICdjb21waWxlJyA9PiB0YXJnZXRfZmlsZXMgKQorICAgIGVuZAorICBlbmQKKyAgCisKKyNjbGFzcyBDb21waWxlVGFzazo6R3JhbW1hclNldAorY2xhc3MgR3JhbW1hclNldAorICBhdHRyX2FjY2Vzc29yIDphbnRscl9qYXIsIDpkZWJ1ZywKKyAgICAgICAgICAgICAgICA6dHJhY2UsIDpwcm9maWxlLCA6Y29tcGlsZV9vcHRpb25zLAorICAgICAgICAgICAgICAgIDpqYXZhX29wdGlvbnMKKyAgYXR0cl9yZWFkZXIgOmxvYWRfcGF0aCwgOmdyYW1tYXJzCisgIGF0dHJfd3JpdGVyIDpvdXRwdXRfZGlyZWN0b3J5CisgIAorICBkZWYgaW5pdGlhbGl6ZSggZ3JhbW1hcl9maWxlcywgb3B0aW9ucyA9IHt9ICkKKyAgICBAbG9hZF9wYXRoID0gZ3JhbW1hcl9maWxlcy5tYXAgeyB8IGYgfCBGaWxlLmRpcm5hbWUoIGYgKSB9CisgICAgQGxvYWRfcGF0aC5wdXNoKCAnLicsIEBvdXRwdXRfZGlyZWN0b3J5ICkKKyAgICAKKyAgICBpZiBleHRyYV9sb2FkID0gb3B0aW9uc1sgOmxvYWRfcGF0aCBdCisgICAgICBleHRyYV9sb2FkID0gWyBleHRyYV9sb2FkIF0uZmxhdHRlbgorICAgICAgQGxvYWRfcGF0aC51bnNoaWZ0KCBleHRyYV9sb2FkICkKKyAgICBlbmQKKyAgICBAbG9hZF9wYXRoLnVuaXEhCisgICAgCisgICAgQGdyYW1tYXJzID0gZ3JhbW1hcl9maWxlcy5tYXAgZG8gfCBmaWxlIHwKKyAgICAgIEdyYW1tYXJGaWxlLm5ldyggc2VsZiwgZmlsZSApCisgICAgZW5kCisgICAgQG91dHB1dF9kaXJlY3RvcnkgPSAnLicKKyAgICBkaXIgPSBvcHRpb25zWyA6b3V0cHV0X2RpcmVjdG9yeSBdIGFuZCBAb3V0cHV0X2RpcmVjdG9yeSA9IGRpci50b19zCisgICAgCisgICAgQGFudGxyX2phciA9IG9wdGlvbnMuZmV0Y2goIDphbnRscl9qYXIsIEFOVExSMy5hbnRscl9qYXIgKQorICAgIEBkZWJ1ZyA9IG9wdGlvbnMuZmV0Y2goIDpkZWJ1ZywgZmFsc2UgKQorICAgIEB0cmFjZSA9IG9wdGlvbnMuZmV0Y2goIDp0cmFjZSwgZmFsc2UgKQorICAgIEBwcm9maWxlID0gb3B0aW9ucy5mZXRjaCggOnByb2ZpbGUsIGZhbHNlICkKKyAgICBAY29tcGlsZV9vcHRpb25zID0KKyAgICAgIGNhc2Ugb3B0cyA9IG9wdGlvbnNbIDpjb21waWxlX29wdGlvbnMgXQorICAgICAgd2hlbiBBcnJheSB0aGVuIG9wdHMKKyAgICAgIGVsc2UgU2hlbGx3b3Jkcy5zaGVsbHdvcmRzKCBvcHRzLnRvX3MgKQorICAgICAgZW5kCisgICAgQGphdmFfb3B0aW9ucyA9CisgICAgICBjYXNlIG9wdHMgPSBvcHRpb25zWyA6amF2YV9vcHRpb25zIF0KKyAgICAgIHdoZW4gQXJyYXkgdGhlbiBvcHRzCisgICAgICBlbHNlIFNoZWxsd29yZHMuc2hlbGx3b3Jkcyggb3B0cy50b19zICkKKyAgICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB0YXJnZXRfZmlsZXMKKyAgICBAZ3JhbW1hcnMubWFwIHsgfCBncmFtIHwgZ3JhbS50YXJnZXRfZmlsZXMgfS5mbGF0dGVuCisgIGVuZAorICAKKyAgZGVmIG91dHB1dF9kaXJlY3RvcnkKKyAgICBAb3V0cHV0X2RpcmVjdG9yeSB8fCAnLicKKyAgZW5kCisgIAorICBkZWYgZGVmaW5lX3Rhc2tzCisgICAgZmlsZSggQGFudGxyX2phciApCisgICAgCisgICAgZm9yIGdyYW1tYXIgaW4gQGdyYW1tYXJzCisgICAgICBkZXBzID0gWyBAYW50bHJfamFyIF0KKyAgICAgIGlmICB2b2NhYiA9IGdyYW1tYXIudG9rZW5fdm9jYWIgYW5kCisgICAgICAgICAgdGZpbGUgPSBmaW5kX3Rva2Vuc19maWxlKCB2b2NhYiwgZ3JhbW1hciApCisgICAgICAgIGZpbGUoIHRmaWxlICkKKyAgICAgICAgZGVwcyA8PCB0ZmlsZQorICAgICAgZW5kCisgICAgICBncmFtbWFyLmRlZmluZV90YXNrcyggZGVwcyApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGNsZWFuCisgICAgZm9yIGdyYW1tYXIgaW4gQGdyYW1tYXJzCisgICAgICBncmFtbWFyLmNsZWFuCisgICAgZW5kCisgICAgaWYgdGVzdCggP2QsIG91dHB1dF9kaXJlY3RvcnkgKSBhbmQgKCBEaXIuZW50cmllcyggb3V0cHV0X2RpcmVjdG9yeSApIC0gJXcoIC4gLi4gKSApLmVtcHR5PworICAgICAgcm1kaXIoIG91dHB1dF9kaXJlY3RvcnkgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBmaW5kX3Rva2Vuc19maWxlKCB2b2NhYiwgZ3JhbW1hciApCisgICAgZ3JhbSA9IEBncmFtbWFycy5maW5kIHsgfCBncmFtIHwgZ3JhbS5uYW1lID09IHZvY2FiIH0gYW5kCisgICAgICByZXR1cm4oIGdyYW0udG9rZW5zX2ZpbGUgKQorICAgIGZpbGUgPSBsb2NhdGUoICIjeyB2b2NhYiB9LnRva2VucyIgKSBhbmQgcmV0dXJuKCBmaWxlICkKKyAgICB3YXJuKCBVdGlsLnRpZHkoIDw8LUVORCwgdHJ1ZSApICkKKyAgICB8IHVuYWJsZSB0byBsb2NhdGUgLnRva2VucyBmaWxlIGAjeyB2b2NhYiB9JyByZWZlcmVuY2VkIGluICN7IGdyYW1tYXIucGF0aCB9CisgICAgfCAtLSBpZ25vcmluZyBkZXBlbmRlbmN5CisgICAgRU5ECisgICAgcmV0dXJuKCBuaWwgKQorICBlbmQKKyAgCisgIGRlZiBsb2NhdGUoIGZpbGVfbmFtZSApCisgICAgZGlyID0gQGxvYWRfcGF0aC5maW5kIGRvIHwgZGlyIHwKKyAgICAgIEZpbGUuZmlsZT8oIEZpbGUuam9pbiggZGlyLCBmaWxlX25hbWUgKSApCisgICAgZW5kCisgICAgZGlyIGFuZCByZXR1cm4oIEZpbGUuam9pbiggZGlyLCBmaWxlX25hbWUgKSApCisgIGVuZAorICAKKyAgZGVmIGNvbXBpbGUoIGdyYW1tYXIgKQorICAgIGRpciA9IG91dHB1dF9kaXJlY3RvcnkKKyAgICB0ZXN0KCA/ZCwgZGlyICkgb3IgRmlsZVV0aWxzLm1rcGF0aCggZGlyICkKKyAgICBzaCggYnVpbGRfY29tbWFuZCggZ3JhbW1hciApICkKKyAgZW5kCisgIAorICBkZWYgYnVpbGRfY29tbWFuZCggZ3JhbW1hciApCisgICAgcGFydHMgPSBbICdqYXZhJywgJy1jcCcsIEBhbnRscl9qYXIgXQorICAgIHBhcnRzLmNvbmNhdCggQGphdmFfb3B0aW9ucyApCisgICAgcGFydHMgPDwgJ29yZy5hbnRsci5Ub29sJyA8PCAnLWZvJyA8PCBvdXRwdXRfZGlyZWN0b3J5CisgICAgcGFydHMgPDwgJy1kZWJ1ZycgaWYgQGRlYnVnCisgICAgcGFydHMgPDwgJy1wcm9maWxlJyBpZiBAcHJvZmlsZQorICAgIHBhcnRzIDw8ICctdHJhY2UnIGlmIEB0cmFjZQorICAgIHBhcnRzLmNvbmNhdCggQGNvbXBpbGVfb3B0aW9ucyApCisgICAgcGFydHMgPDwgZ3JhbW1hci5wYXRoCisgICAgcmV0dXJuIHBhcnRzLm1hcCEgeyB8IHQgfCBlc2NhcGUoIHQgKSB9LmpvaW4oICcgJyApCisgIGVuZAorICAKKyAgZGVmIGVzY2FwZSggdG9rZW4gKQorICAgIHRva2VuID0gdG9rZW4udG9fcy5kdXAKKyAgICB0b2tlbi5lbXB0eT8gYW5kIHJldHVybiggJSgnJykgKQorICAgIHRva2VuLmdzdWIhKCAvKFteQS1aYS16MC05X1wtLiw6XC9AXG5dKS9uLCAiXFxcXFxcMSIgKQorICAgIHRva2VuLmdzdWIhKCAvXG4vLCAiJ1xuJyIgKQorICAgIHJldHVybiggdG9rZW4gKQorICBlbmQKKyAgCitlbmQKKworY2xhc3MgR3JhbW1hckZpbGUKKyAgTEFOR1VBR0VTID0geyAKKyAgICAiQWN0aW9uU2NyaXB0IiA9PiBbICIuYXMiIF0sCisgICAgIkNTaGFycDIiID0+IFsgIi5jcyIgXSwKKyAgICAiQyIgPT4gWyAiLmMiLCAiLmgiIF0sCisgICAgIk9iakMiID0+IFsgIi5tIiwgIi5oIiBdLAorICAgICJDU2hhcnAzIiA9PiBbICIuY3MiIF0sCisgICAgIkNwcCIgPT4gWyAiLmNwcCIsICIuaCIgXSwKKyAgICAiUnVieSIgPT4gWyAiLnJiIiBdLAorICAgICJKYXZhIiA9PiBbICIuamF2YSIgXSwKKyAgICAiSmF2YVNjcmlwdCIgPT4gWyAiLmpzIiBdLAorICAgICJQeXRob24iID0+IFsgIi5weSIgXSwKKyAgICAiRGVscGhpIiA9PiBbICIucGFzIiBdLAorICAgICJQZXJsNSIgPT4gWyAiLnBtIiBdCisgIH0uZnJlZXplCisgIEdSQU1NQVJfVFlQRVMgPSAldyhsZXhlciBwYXJzZXIgdHJlZSBjb21iaW5lZCkKKyAgCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyBDT05TVFJVQ1RPUiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgIAorICBkZWYgaW5pdGlhbGl6ZSggZ3JvdXAsIHBhdGgsIG9wdGlvbnMgPSB7fSApCisgICAgQGdyb3VwID0gZ3JvdXAKKyAgICBAcGF0aCA9IHBhdGgudG9fcworICAgIEBpbXBvcnRzID0gW10KKyAgICBAbGFuZ3VhZ2UgPSAnSmF2YScKKyAgICBAdG9rZW5fdm9jYWIgPSBuaWwKKyAgICBAdGFza3NfZGVmaW5lZCA9IGZhbHNlCisgICAgQGV4dHJhX2RlcGVuZGVuY2llcyA9IFtdCisgICAgaWYgZXh0cmEgPSBvcHRpb25zWyA6ZXh0cmFfZGVwZW5kZW5jaWVzIF0KKyAgICAgIGV4dHJhID0gWyBleHRyYSBdLmZsYXR0ZW4KKyAgICAgIEBleHRyYV9kZXBlbmRlbmNpZXMuY29uY2F0KCBleHRyYSApCisgICAgZW5kCisgICAgCisgICAgc3R1ZHkKKyAgICB5aWVsZCggc2VsZiApIGlmIGJsb2NrX2dpdmVuPworICAgIGZldGNoX2ltcG9ydHMKKyAgZW5kCisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMgQVRUUklCVVRFUyBBTkQgQVRUUklCVVRFLUlTSCBNRVRIT0RTICMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBhdHRyX3JlYWRlciA6dHlwZSwgOm5hbWUsIDpsYW5ndWFnZSwgOnNvdXJjZSwKKyAgICAgICAgICAgICAgOnRva2VuX3ZvY2FiLCA6aW1wb3J0cywgOmltcG9ydGVkX2dyYW1tYXJzLAorICAgICAgICAgICAgICA6cGF0aCwgOmdyb3VwCisgIAorICBmb3IgYXR0ciBpbiBbIDpvdXRwdXRfZGlyZWN0b3J5LCA6bG9hZF9wYXRoLCA6YW50bHJfamFyIF0KKyAgICBjbGFzc19ldmFsKCA8PC1FTkQgKQorICAgICAgZGVmICN7IGF0dHIgfQorICAgICAgICBAZ3JvdXAuI3sgYXR0ciB9CisgICAgICBlbmQKKyAgICBFTkQKKyAgZW5kCisgIAorICBkZWYgbGV4ZXJfZmlsZXMKKyAgICBpZiBsZXhlcj8gdGhlbiBiYXNlID0gQG5hbWUKKyAgICBlbHNpZiBjb21iaW5lZD8gdGhlbiBiYXNlID0gQG5hbWUgKyAnTGV4ZXInCisgICAgZWxzZSByZXR1cm4oIFtdICkKKyAgICBlbmQKKyAgICByZXR1cm4oIGZpbGVfbmFtZXMoIGJhc2UgKSApCisgIGVuZAorICAKKyAgZGVmIHBhcnNlcl9maWxlcworICAgIGlmIHBhcnNlcj8gdGhlbiBiYXNlID0gQG5hbWUKKyAgICBlbHNpZiBjb21iaW5lZD8gdGhlbiBiYXNlID0gQG5hbWUgKyAnUGFyc2VyJworICAgIGVsc2UgcmV0dXJuKCBbXSApCisgICAgZW5kCisgICAgcmV0dXJuKCBmaWxlX25hbWVzKCBiYXNlICkgKQorICBlbmQKKyAgCisgIGRlZiB0cmVlX3BhcnNlcl9maWxlcworICAgIHJldHVybiggdHJlZT8gPyBmaWxlX25hbWVzKCBAbmFtZSApIDogW10gKQorICBlbmQKKyAgCisgIGRlZiBmaWxlX25hbWVzKCBiYXNlICkKKyAgICBMQU5HVUFHRVMuZmV0Y2goIEBsYW5ndWFnZSApLm1hcCBkbyB8IGV4dCB8CisgICAgICBGaWxlLmpvaW4oIG91dHB1dF9kaXJlY3RvcnksIGJhc2UgKyBleHQgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGZvciB0eXBlIGluIEdSQU1NQVJfVFlQRVMKKyAgICBjbGFzc19ldmFsKCA8PC1FTkQgKQorICAgICAgZGVmICN7IHR5cGUgfT8KKyAgICAgICAgQHR5cGUgPT0gI3sgdHlwZS5pbnNwZWN0IH0KKyAgICAgIGVuZAorICAgIEVORAorICBlbmQKKyAgCisgIGRlZiBkZWxlZ2F0ZV9maWxlcyggZGVsZWdhdGVfc3VmZml4ICkKKyAgICBmaWxlX25hbWVzKCAiI3sgbmFtZSB9XyN7IGRlbGVnYXRlX3N1ZmZpeCB9IiApCisgIGVuZAorICAKKyAgZGVmIHRva2Vuc19maWxlCisgICAgRmlsZS5qb2luKCBvdXRwdXRfZGlyZWN0b3J5LCBuYW1lICsgJy50b2tlbnMnICkKKyAgZW5kCisgIAorICBkZWYgdGFyZ2V0X2ZpbGVzKCBhbGwgPSB0cnVlICkKKyAgICB0YXJnZXRzID0gWyB0b2tlbnNfZmlsZSBdCisgICAgCisgICAgZm9yIHRhcmdldF90eXBlIGluICV3KCBsZXhlciBwYXJzZXIgdHJlZV9wYXJzZXIgKQorICAgICAgZm9yIGZpbGUgaW4gc2VsZi5zZW5kKCA6IiN7IHRhcmdldF90eXBlIH1fZmlsZXMiICkKKyAgICAgICAgdGFyZ2V0cyA8PCBmaWxlCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBpZiBhbGwKKyAgICAgIGZvciBncmFtbWFyIGluIEBpbXBvcnRlZF9ncmFtbWFycworICAgICAgICB0YXJnZXRzLmNvbmNhdCggZ3JhbW1hci50YXJnZXRfZmlsZXMgKQorICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgcmV0dXJuIHRhcmdldHMKKyAgZW5kCisgIAorICBkZWYgdXBkYXRlCisgICAgdG91Y2goIEBwYXRoICkKKyAgZW5kCisgIAorICBkZWYgYWxsX2ltcG9ydGVkX2ZpbGVzCisgICAgaW1wb3J0ZWRfZmlsZXMgPSBbXQorICAgIGZvciBncmFtbWFyIGluIEBpbXBvcnRlZF9ncmFtbWFycworICAgICAgaW1wb3J0ZWRfZmlsZXMucHVzaCggZ3JhbW1hci5wYXRoLCAqZ3JhbW1hci5hbGxfaW1wb3J0ZWRfZmlsZXMgKQorICAgIGVuZAorICAgIHJldHVybiBpbXBvcnRlZF9maWxlcworICBlbmQKKyAgCisgIGRlZiBjbGVhbgorICAgIGRlbGV0ZWQgPSBbXQorICAgIGZvciB0YXJnZXQgaW4gdGFyZ2V0X2ZpbGVzCisgICAgICBpZiB0ZXN0KCA/ZiwgdGFyZ2V0ICkKKyAgICAgICAgcm0oIHRhcmdldCApCisgICAgICAgIGRlbGV0ZWQgPDwgdGFyZ2V0CisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBmb3IgZ3JhbW1hciBpbiBAaW1wb3J0ZWRfZ3JhbW1hcnMKKyAgICAgIGRlbGV0ZWQuY29uY2F0KCBncmFtbWFyLmNsZWFuICkKKyAgICBlbmQKKyAgICAKKyAgICByZXR1cm4gZGVsZXRlZAorICBlbmQKKyAgCisgIGRlZiBkZWZpbmVfdGFza3MoIHNoYXJlZF9kZXBlbmRzICkKKyAgICB1bmxlc3MgQHRhc2tzX2RlZmluZWQKKyAgICAgIGRlcGVuZHMgPSBbIEBwYXRoLCAqYWxsX2ltcG9ydGVkX2ZpbGVzIF0KKyAgICAgIGZvciBmIGluIGRlcGVuZHMKKyAgICAgICAgZmlsZSggZiApCisgICAgICBlbmQKKyAgICAgIGRlcGVuZHMgPSBzaGFyZWRfZGVwZW5kcyArIGRlcGVuZHMKKyAgICAgIAorICAgICAgdGFyZ2V0X2ZpbGVzLmVhY2ggZG8gfCB0YXJnZXQgfAorICAgICAgICBmaWxlKCB0YXJnZXQgPT4gKCBkZXBlbmRzIC0gWyB0YXJnZXQgXSApICkgZG8gICAjIHByZXZlbnRzIHJlY3Vyc2l2ZSAudG9rZW5zIGZpbGUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgQGdyb3VwLmNvbXBpbGUoIHNlbGYgKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgCisgICAgICBAdGFza3NfZGVmaW5lZCA9IHRydWUKKyAgICBlbmQKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIGZldGNoX2ltcG9ydHMKKyAgICBAaW1wb3J0ZWRfZ3JhbW1hcnMgPSBAaW1wb3J0cy5tYXAgZG8gfCBpbXAgfAorICAgICAgZmlsZSA9IGdyb3VwLmxvY2F0ZSggIiN7IGltcCB9LmciICkgb3IgcmFpc2UoIFV0aWwudGlkeSggPDwtRU5EICkgKQorICAgICAgfCAjeyBAcGF0aCB9OiB1bmFibGUgdG8gbG9jYXRlIGltcG9ydGVkIGdyYW1tYXIgZmlsZSAjeyBpbXAgfS5nCisgICAgICB8IHNlYXJjaCBkaXJlY3RvcmllcyAoIEBsb2FkX3BhdGggKToKKyAgICAgIHwgICAtICN7IGxvYWRfcGF0aC5qb2luKCAiXG4gIC0gIiApIH0KKyAgICAgIEVORAorICAgICAgSW1wb3J0ZWQubmV3KCBzZWxmLCBmaWxlICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgc3R1ZHkKKyAgICBAc291cmNlID0gRmlsZS5yZWFkKCBAcGF0aCApCisgICAgQHNvdXJjZSA9fiAvXlxzKihsZXhlcnxwYXJzZXJ8dHJlZSk/XHMqZ3JhbW1hclxzKihcUyspXHMqOy8gb3IKKyAgICAgIHJhaXNlIEdyYW1tYXI6OkZvcm1hdEVycm9yWyBAc291cmNlLCBAcGF0aCBdCisgICAgQG5hbWUgPSAkMgorICAgIEB0eXBlID0gJDEgfHwgJ2NvbWJpbmVkJworICAgIGlmIEBzb3VyY2UgPX4gL15ccypvcHRpb25zXHMqXHsoLio/KVx9L20KKyAgICAgIG9wdGlvbl9ibG9jayA9ICQxCisgICAgICBpZiBvcHRpb25fYmxvY2sgPX4gL1xzKmxhbmd1YWdlXHMqPVxzKihcUyspXHMqOy8KKyAgICAgICAgQGxhbmd1YWdlID0gJDEKKyAgICAgICAgTEFOR1VBR0VTLmhhc19rZXk/KCBAbGFuZ3VhZ2UgKSBvcgorICAgICAgICAgIHJhaXNlKCBHcmFtbWFyOjpGb3JtYXRFcnJvciwgIlVua25vd24gQU5UTFIgdGFyZ2V0IGxhbmd1YWdlOiAlcCIgJSBAbGFuZ3VhZ2UgKQorICAgICAgZW5kCisgICAgICBvcHRpb25fYmxvY2sgPX4gL1xzKnRva2VuVm9jYWJccyo9XHMqKFxTKylccyo7LyBhbmQKKyAgICAgICAgQHRva2VuX3ZvY2FiID0gJDEKKyAgICBlbmQKKyAgICAKKyAgICBAc291cmNlLnNjYW4oIC9eXHMqaW1wb3J0XHMrKFx3K1xzKig/OixccypcdytccyopKik7LyApIGRvCisgICAgICBsaXN0ID0gJDEuc3RyaXAKKyAgICAgIEBpbXBvcnRzLmNvbmNhdCggbGlzdC5zcGxpdCggL1xzKixccyovICkgKQorICAgIGVuZAorICBlbmQKK2VuZCAjIGNsYXNzIEdyYW1tYXIKKworY2xhc3MgR3JhbW1hckZpbGU6OkltcG9ydGVkIDwgR3JhbW1hckZpbGUKKyAgZGVmIGluaXRpYWxpemUoIG93bmVyLCBwYXRoICkKKyAgICBAb3duZXIgPSBvd25lcgorICAgIEBwYXRoID0gcGF0aC50b19zCisgICAgQGltcG9ydHMgPSBbXQorICAgIEBsYW5ndWFnZSA9ICdKYXZhJworICAgIEB0b2tlbl92b2NhYiA9IG5pbAorICAgIHN0dWR5CisgICAgZmV0Y2hfaW1wb3J0cworICBlbmQKKyAgCisgIGZvciBhdHRyIGluIFsgOmxvYWRfcGF0aCwgOm91dHB1dF9kaXJlY3RvcnksIDphbnRscl9qYXIsIDp2ZXJib3NlLCA6Z3JvdXAgXQorICAgIGNsYXNzX2V2YWwoIDw8LUVORCApCisgICAgICBkZWYgI3sgYXR0ciB9CisgICAgICAgIEBvd25lci4jeyBhdHRyIH0KKyAgICAgIGVuZAorICAgIEVORAorICBlbmQKKyAgCisgIGRlZiBkZWxlZ2F0ZV9maWxlcyggc3VmZml4ICkKKyAgICBAb3duZXIuZGVsZWdhdGVfZmlsZXMoICIjeyBAbmFtZSB9XyN7IHN1ZmZpeCB9IiApCisgIGVuZAorICAKKyAgZGVmIHRhcmdldF9maWxlcworICAgIHRhcmdldHMgPSBbIHRva2Vuc19maWxlIF0KKyAgICB0YXJnZXRzLmNvbmNhdCggQG93bmVyLmRlbGVnYXRlX2ZpbGVzKCBAbmFtZSApICkKKyAgICByZXR1cm4oIHRhcmdldHMgKQorICBlbmQKK2VuZAorCitjbGFzcyBHcmFtbWFyRmlsZTo6Rm9ybWF0RXJyb3IgPCBTdGFuZGFyZEVycm9yCisgIGF0dHJfcmVhZGVyIDpmaWxlLCA6c291cmNlCisgIAorICBkZWYgc2VsZi5bXSggKmFyZ3MgKQorICAgIG5ldyggKmFyZ3MgKQorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplKCBzb3VyY2UsIGZpbGUgPSBuaWwgKQorICAgIEBmaWxlID0gZmlsZQorICAgIEBzb3VyY2UgPSBzb3VyY2UKKyAgICBtZXNzYWdlID0gJycKKyAgICBpZiBmaWxlLm5pbD8gIyBpbmxpbmUKKyAgICAgIG1lc3NhZ2UgPDwgImJhZCBpbmxpbmUgZ3JhbW1hciBzb3VyY2U6XG4iCisgICAgICBtZXNzYWdlIDw8ICggIi0iICogODAgKSA8PCAiXG4iCisgICAgICBtZXNzYWdlIDw8IEBzb3VyY2UKKyAgICAgIG1lc3NhZ2VbIC0xIF0gPT0gP1xuIG9yIG1lc3NhZ2UgPDwgIlxuIgorICAgICAgbWVzc2FnZSA8PCAoICItIiAqIDgwICkgPDwgIlxuIgorICAgICAgbWVzc2FnZSA8PCAiY291bGQgbm90IGxvY2F0ZSBhIGdyYW1tYXIgbmFtZSBhbmQgdHlwZSBkZWNsYXJhdGlvbiBtYXRjaGluZ1xuIgorICAgICAgbWVzc2FnZSA8PCAiL15ccyoobGV4ZXJ8cGFyc2VyfHRyZWUpP1xzKmdyYW1tYXJccyooXFMrKVxzKjsvIgorICAgIGVsc2UKKyAgICAgIG1lc3NhZ2UgPDwgJ2JhZCBncmFtbWFyIHNvdXJjZSBpbiBmaWxlICVwXG4nICUgQGZpbGUKKyAgICAgIG1lc3NhZ2UgPDwgKCAiLSIgKiA4MCApIDw8ICJcbiIKKyAgICAgIG1lc3NhZ2UgPDwgQHNvdXJjZQorICAgICAgbWVzc2FnZVsgLTEgXSA9PSA/XG4gb3IgbWVzc2FnZSA8PCAiXG4iCisgICAgICBtZXNzYWdlIDw8ICggIi0iICogODAgKSA8PCAiXG4iCisgICAgICBtZXNzYWdlIDw8ICJjb3VsZCBub3QgbG9jYXRlIGEgZ3JhbW1hciBuYW1lIGFuZCB0eXBlIGRlY2xhcmF0aW9uIG1hdGNoaW5nXG4iCisgICAgICBtZXNzYWdlIDw8ICIvXlxzKihsZXhlcnxwYXJzZXJ8dHJlZSk/XHMqZ3JhbW1hclxzKihcUyspXHMqOy8iCisgICAgZW5kCisgICAgc3VwZXIoIG1lc3NhZ2UgKQorICBlbmQKK2VuZCAjIGVycm9yIEdyYW1tYXI6OkZvcm1hdEVycm9yCitlbmQgIyBjbGFzcyBDb21waWxlVGFzaworZW5kICMgbW9kdWxlIEFOVExSMwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RlbXBsYXRlLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RlbXBsYXRlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmMyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGVtcGxhdGUucmIKQEAgLTAsMCArMSwzMzMgQEAKKyMhL3Vzci9iaW4vcnVieQorCisKK3JlcXVpcmUgJ2VyYicKK3JlcXVpcmUgJ2FudGxyMycKKworbW9kdWxlIEFOVExSMworbW9kdWxlIFRlbXBsYXRlCittb2R1bGUgQnVpbGRlcgorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgCisgIG1vZHVsZSBDbGFzc01ldGhvZHMKKyAgICBhdHRyX3dyaXRlciA6dGVtcGxhdGVfbGlicmFyeQorICAgIAorICAgIGRlZiB0ZW1wbGF0ZV9saWJyYXJ5CisgICAgICBAdGVtcGxhdGVfbGlicmFyeSB8fD0gQU5UTFIzOjpUZW1wbGF0ZTo6R3JvdXAubmV3CisgICAgZW5kCisgICAgCisgICAgZGVmIHJldHVybl9zY29wZV9tZW1iZXJzCisgICAgICBzdXBlci5wdXNoKCA6dGVtcGxhdGUgKQorICAgIGVuZAorICAgIAorICAgIGRlZiBsb2FkX3RlbXBsYXRlcyggZ3JvdXBfZmlsZSApCisgICAgICBAdGVtcGxhdGVfbGlicmFyeSA9IAorICAgICAgICBBTlRMUjM6OlRlbXBsYXRlOjpHcm91cC5sb2FkKCBncm91cF9maWxlICkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgZGVmaW5lX3RlbXBsYXRlKCBuYW1lLCBzb3VyY2UsICZibG9jayApCisgICAgICB0ZW1wbGF0ZV9saWJyYXJ5LmRlZmluZV90ZW1wbGF0ZSggbmFtZSwgc291cmNlLCAmYmxvY2sgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBzZWxmLmluY2x1ZGVkKCBrbGFzcyApCisgICAgc3VwZXIKKyAgICBDbGFzcyA9PT0ga2xhc3MgYW5kIGtsYXNzLmV4dGVuZCggQ2xhc3NNZXRob2RzICkKKyAgZW5kCisgIAorICBkZWYgaW5pdGlhbGl6ZSggaW5wdXQsIG9wdGlvbnMgPSB7fSApCisgICAgdGVtcGxhdGVzID0gQHRlbXBsYXRlcyB8fCBvcHRpb25zLmZldGNoKCA6dGVtcGxhdGVzICkgZG8KKyAgICAgIHNlbGYuY2xhc3MudGVtcGxhdGVfbGlicmFyeSBvciBBTlRMUjM6OlRlbXBsYXRlOjpHcm91cC5uZXcKKyAgICBlbmQKKyAgICBzdXBlciggaW5wdXQsIG9wdGlvbnMgKQorICAgIHNlbGYudGVtcGxhdGVzID0gdGVtcGxhdGVzCisgIGVuZAorICAKKyAgc2hhcmVkX2F0dHJpYnV0ZSggOnRlbXBsYXRlcyApCisgIAorICBkZWYgY3JlYXRlX3RlbXBsYXRlKCBzb3VyY2UsIHZhbHVlcyA9IHt9ICkKKyAgICBAdGVtcGxhdGVzLm5ldyggc291cmNlLCB2YWx1ZXMgKQorICBlbmQKKyAgCisgIGRlZiBmZXRjaF90ZW1wbGF0ZSggbmFtZSwgdmFsdWVzID0ge30gKQorICAgIEB0ZW1wbGF0ZXMuZmV0Y2goIG5hbWUsIHZhbHVlcyApCisgIGVuZAorZW5kCisKK21vZHVsZSBSZXdyaXRlQnVpbGRlcgorICBpbmNsdWRlIEJ1aWxkZXIKKyAgCisgIGRlZiBzZWxmLmluY2x1ZGVkKCBrbGFzcyApCisgICAgc3VwZXIKKyAgICBDbGFzcyA9PT0ga2xhc3MgYW5kIGtsYXNzLmV4dGVuZCggQnVpbGRlcjo6Q2xhc3NNZXRob2RzICkKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIGNhc3RfaW5wdXQoIGlucHV0LCBvcHRpb25zICkKKyAgICBjYXNlIGlucHV0CisgICAgd2hlbiBUb2tlblNvdXJjZSB0aGVuIFRva2VuUmV3cml0ZVN0cmVhbS5uZXcoIGlucHV0LCBvcHRpb25zICkKKyAgICB3aGVuIElPLCBTdHJpbmcKKyAgICAgIGlmIGxleGVyX2NsYXNzID0gc2VsZi5jbGFzcy5hc3NvY2lhdGVkX2xleGVyCisgICAgICAgIFRva2VuUmV3cml0ZVN0cmVhbS5uZXcoIGxleGVyX2NsYXNzLm5ldyggaW5wdXQsIG9wdGlvbnMgKSwgb3B0aW9ucyApCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsIFV0aWwudGlkeSggPDwtRU5ELCB0cnVlICkKKyAgICAgICAgfCB1bmFibGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0IGlucHV0ICN7IGlucHV0Lmluc3BlY3QgfQorICAgICAgICB8IHRvIGEgQU5UTFIzOjpUb2tlblN0cmVhbSBvYmplY3QgYXMgI3sgc2VsZi5jbGFzcyB9CisgICAgICAgIHwgZG9lcyBub3QgYXBwZWFyIHRvIGhhdmUgYW4gYXNzb2NpYXRlZCBsZXhlciBjbGFzcworICAgICAgICBFTkQKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHN1cGVyCisgICAgZW5kCisgIGVuZAorICAKK2VuZAorCisKK2F1dG9sb2FkIDpHcm91cEZpbGUsICdhbnRscjMvdGVtcGxhdGUvZ3JvdXAtZmlsZScKKworY2xhc3MgR3JvdXAgPCBNb2R1bGUKKyAgYXV0b2xvYWQgOkxleGVyLCAnYW50bHIzL3RlbXBsYXRlL2dyb3VwLWZpbGUnCisgIGF1dG9sb2FkIDpQYXJzZXIsICdhbnRscjMvdGVtcGxhdGUvZ3JvdXAtZmlsZScKKyAgCisgIGRlZiBzZWxmLnBhcnNlKCBzb3VyY2UsIG9wdGlvbnMgPSB7fSApCisgICAgbmFtZXNwYWNlID0gb3B0aW9ucy5mZXRjaCggOm5hbWVzcGFjZSwgOjpPYmplY3QgKQorICAgIGxleGVyICA9IExleGVyLm5ldyggc291cmNlLCBvcHRpb25zICkKKyAgICBwYXJzZXIgPSBQYXJzZXIubmV3KCBsZXhlciwgb3B0aW9ucyApCisgICAgcmV0dXJuKCBwYXJzZXIuZ3JvdXAoIG5hbWVzcGFjZSApICkKKyAgZW5kCisgIAorICBkZWYgc2VsZi5sb2FkKCBncm91cF9maWxlLCBvcHRpb25zID0ge30gKQorICAgIHVubGVzcyggRmlsZS5maWxlPyggZ3JvdXBfZmlsZSApICkKKyAgICAgIGRpciA9ICRMT0FEX1BBVEguZmluZCBkbyB8IGQgfAorICAgICAgICBGaWxlLmZpbGU/KCBGaWxlLmpvaW4oIGRpciwgZ3JvdXBfZmlsZSApICkKKyAgICAgIGVuZCBvciByYWlzZSggTG9hZEVycm9yLCAibm8gc3VjaCB0ZW1wbGF0ZSBncm91cCBmaWxlIHRvIGxvYWQgJXMiICUgZ3JvdXBfZmlsZSApCisgICAgICBncm91cF9maWxlID0gRmlsZS5qb2luKCBkaXIsIGdyb3VwX2ZpbGUgKQorICAgIGVuZAorICAgIG5hbWVzcGFjZSA9IG9wdGlvbnMuZmV0Y2goIDpuYW1lc3BhY2UsIDo6T2JqZWN0ICkKKyAgICBpbnB1dCA9IEFOVExSMzo6RmlsZVN0cmVhbS5uZXcoIGdyb3VwX2ZpbGUsIG9wdGlvbnMgKQorICAgIGxleGVyID0gTGV4ZXIubmV3KCBpbnB1dCwgb3B0aW9ucyApCisgICAgcGFyc2VyID0gUGFyc2VyLm5ldyggbGV4ZXIsIG9wdGlvbnMgKQorICAgIHJldHVybiggcGFyc2VyLmdyb3VwKCBuYW1lc3BhY2UgKSApCisgIGVuZAorICAKKyAgZGVmIHNlbGYubmV3KCAmYmxvY2sgKQorICAgIHN1cGVyIGRvCisgICAgICBjb25zdF9zZXQoIDpURU1QTEFURVMsIHt9ICkKKyAgICAgIGJsb2NrX2dpdmVuPyBhbmQgbW9kdWxlX2V2YWwoICZibG9jayApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIG5ldyggc291cmNlLCB2YWx1ZXMgPSB7fSApCisgICAgZXJiID0gRVJCLm5ldyggc291cmNlLCBuaWwsICclJyApCisgICAgdGVtcGxhdGUgPSBDb250ZXh0Lm5ldyggdmFsdWVzICkKKyAgICB0ZW1wbGF0ZS5leHRlbmQoIHNlbGYgKQorICAgIHNjbGFzcyA9IGNsYXNzIDw8IHRlbXBsYXRlOyBzZWxmOyBlbmQKKyAgICBlcmIuZGVmX21ldGhvZCggc2NsYXNzLCAndG9fcycgKQorICAgIHJldHVybiggdGVtcGxhdGUgKQorICBlbmQKKyAgCisgIGRlZiBmZXRjaCggbmFtZSwgdmFsdWVzID0ge30gKQorICAgIHNlbGY6OlRFTVBMQVRFUy5mZXRjaCggbmFtZS50b19zICkubmV3KCB2YWx1ZXMgKQorICBlbmQKKyAgCisgIGRlZiB0ZW1wbGF0ZXMKKyAgICBzZWxmOjpURU1QTEFURVMKKyAgZW5kCisgIAorICBkZWYgdGVtcGxhdGVfZGVmaW5lZD8oIG5hbWUgKQorICAgIHNlbGY6OlRFTVBMQVRFUy5oYXNfa2V5PyggbmFtZS50b19zICkKKyAgZW5kCisgIAorICBkZWYgZGVmaW5lX3RlbXBsYXRlKCBuYW1lLCBzb3VyY2UsIHBhcmFtZXRlcnMgPSBuaWwsICZibG9jayApCisgICAgbmFtZSA9IG5hbWUudG9fcy5kdXAuZnJlZXplCisgICAgQ29udGV4dC5kZWZpbmUoIHNlbGYsIG5hbWUsIHBhcmFtZXRlcnMgKSBkbyB8IHRjbGFzcyB8CisgICAgICBzZWxmOjpURU1QTEFURVNbIG5hbWUgXSA9IHRjbGFzcworICAgICAgRVJCLm5ldyggc291cmNlLCBuaWwsICclJyApLmRlZl9tZXRob2QoIHRjbGFzcywgJ3RvX3MnICkKKyAgICAgIAorICAgICAgZGVmaW5lX3RlbXBsYXRlX21ldGhvZHMoIHRjbGFzcyApCisgICAgZW5kCisgICAgcmV0dXJuKCBzZWxmICkKKyAgZW5kCisgIAorICBkZWYgYWxpYXNfdGVtcGxhdGUoIG5ld19uYW1lLCBvbGRfbmFtZSApCisgICAgbmV3X25hbWUsIG9sZF9uYW1lID0gbmV3X25hbWUudG9fcy5kdXAuZnJlZXplLCBvbGRfbmFtZS50b19zCisgICAgY29udGV4dCA9IHNlbGY6OlRFTVBMQVRFUy5mZXRjaCggb2xkX25hbWUudG9fcyApIGRvCisgICAgICByYWlzZSggTmFtZUVycm9yLAorICAgICAgICAidW5kZWZpbmVkIHRlbXBsYXRlIGAlcycgZm9yIHRlbXBsYXRlIGdyb3VwICVwIiAlIFsgb2xkX25hbWUsIHNlbGYgXQorICAgICAgKQorICAgIGVuZAorICAgIGNvbnRleHQuZGVmaW5lX2FsaWFzKCBuZXdfbmFtZSApIGRvIHwgdGNsYXNzIHwKKyAgICAgIHNlbGY6OlRFTVBMQVRFU1sgbmV3X25hbWUgXSA9IHRjbGFzcworICAgICAgZGVmaW5lX3RlbXBsYXRlX21ldGhvZHMoIHRjbGFzcyApCisgICAgZW5kCisgICAgcmV0dXJuKCBzZWxmICkKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIGRlZmluZV90ZW1wbGF0ZV9tZXRob2RzKCBjb250ZXh0ICkKKyAgICBuYW1lID0gY29udGV4dC5uYW1lCisgICAgaWYgcGFyYW1zID0gY29udGV4dC5wYXJhbWV0ZXJzCisgICAgICBpbml0ID0gcGFyYW1zLm5hbWVzLm1hcCBkbyB8IHBhcmFtIHwKKyAgICAgICAgIl9fX1sgI3sgcGFyYW0uaW5zcGVjdCB9IF0gPSAjeyBwYXJhbSB9IgorICAgICAgZW5kLmpvaW4oICJcbiIgKQorICAgICAgCisgICAgICBtb2R1bGVfZXZhbCggPDwtRU5EICkKKyAgICAgICAgbW9kdWxlX2Z1bmN0aW9uCisgICAgICAgIAorICAgICAgICBkZWYgI3sgbmFtZSB9KCAjeyBwYXJhbXMgfSApCisgICAgICAgICAgVEVNUExBVEVTWyAjeyBuYW1lLmluc3BlY3QgfSBdLm5ldyBkbyB8IF9fXyB8CisgICAgICAgICAgICAjeyBpbml0IH0KKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kCisgICAgICAgIAorICAgICAgICBkZWYgI3sgbmFtZSB9ISggI3sgcGFyYW1zIH0gKQorICAgICAgICAgIFRFTVBMQVRFU1sgI3sgbmFtZS5pbnNwZWN0IH0gXS5uZXcgZG8gfCBfX18gfAorICAgICAgICAgICAgI3sgaW5pdCB9CisgICAgICAgICAgZW5kLnRvX3MKKyAgICAgICAgZW5kCisgICAgICBFTkQKKyAgICAgIAorICAgIGVsc2UKKyAgICAgIAorICAgICAgbW9kdWxlX2V2YWwoIDw8LUVORCApCisgICAgICAgIG1vZHVsZV9mdW5jdGlvbgorICAgICAgICAKKyAgICAgICAgZGVmICN7IG5hbWUgfSggdmFsdWVzID0ge30gKQorICAgICAgICAgIFRFTVBMQVRFU1sgI3sgbmFtZS5pbnNwZWN0IH0gXS5uZXcoIHZhbHVlcyApCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgZGVmICN7IG5hbWUgfSEoIHZhbHVlcyA9IHt9ICkKKyAgICAgICAgICBURU1QTEFURVNbICN7IG5hbWUuaW5zcGVjdCB9IF0ubmV3KCB2YWx1ZXMgKS50b19zCisgICAgICAgIGVuZAorICAgICAgRU5ECisgICAgICAKKyAgICBlbmQKKyAgZW5kCitlbmQKKworY2xhc3MgQ29udGV4dAorICBWQVJJQUJMRV9GT1JNID0gL14oQCk/W2Etel9ceDgwLVx4ZmZdW1x3XHg4MC1ceGZmXSokLworICBTRVRURVJfRk9STSA9IC9eKFthLXpfXHg4MC1ceGZmXVtcd1x4ODAtXHhmZl0qKT0kLworICBBVFRSX0ZPUk0gPSAvXlthLXpfXHg4MC1ceGZmXVtcd1x4ODAtXHhmZl0qJC8KKyAgCisgIGNsYXNzIDw8IHNlbGYKKyAgICBhdHRyX2FjY2Vzc29yIDpncm91cCwgOm5hbWUsIDpwYXJhbWV0ZXJzCisgICAgcHJvdGVjdGVkIDpncm91cD0sIDpuYW1lPQorICAgIAorICAgIGRlZiBkZWZpbmVfYWxpYXMoIG5hbWUgKQorICAgICAgbmV3ID0gY2xvbmUKKyAgICAgIG5ldy5uYW1lID0gbmFtZQorICAgICAgbmV3Lmdyb3VwID0gQGdyb3VwCisgICAgICBibG9ja19naXZlbj8gYW5kIHlpZWxkKCBuZXcgKQorICAgICAgcmV0dXJuKCBuZXcgKQorICAgIGVuZAorICAgIAorICAgIGRlZiBkZWZpbmUoIGdyb3VwLCBuYW1lLCBwYXJhbWV0ZXJzICkKKyAgICAgIENsYXNzLm5ldyggc2VsZiApIGRvCisgICAgICAgIGluY2x1ZGUoIGdyb3VwICkKKyAgICAgICAgCisgICAgICAgIEBncm91cCA9IGdyb3VwCisgICAgICAgIEBuYW1lICA9IG5hbWUKKyAgICAgICAgQHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzCisgICAgICAgIAorICAgICAgICBibG9ja19naXZlbj8gYW5kIHlpZWxkKCBzZWxmICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBtZXRob2RfbWlzc2luZyggbWV0aG9kLCAqYXJncyApCisgICAgY2FzZSBuYW1lID0gbWV0aG9kLnRvX3MKKyAgICB3aGVuIFNFVFRFUl9GT1JNIHRoZW4gcmV0dXJuKCBzZWxmWyAkMSBdID0gYXJncy5maXJzdCApCisgICAgd2hlbiBBVFRSX0ZPUk0KKyAgICAgIGFyZ3MuZW1wdHk/IGFuZCBoYXNfaXZhcj8oIG5hbWUgKSBhbmQgcmV0dXJuKCBzZWxmWyBuYW1lIF0gKQorICAgIGVuZAorICAgIHN1cGVyCisgIGVuZAorICAKKyAgZGVmIFtdPSggbmFtZSwgdmFsdWUgKQorICAgIGluc3RhbmNlX3ZhcmlhYmxlX3NldCggbWFrZV9pdmFyKCBuYW1lICksIHZhbHVlICkKKyAgZW5kCisgIAorICBkZWYgW10oIG5hbWUgKQorICAgIG5hbWUgPSBtYWtlX2l2YXIoIG5hbWUgKQorICAgIGluc3RhbmNlX3ZhcmlhYmxlX2RlZmluZWQ/KCBuYW1lICkgPyBpbnN0YW5jZV92YXJpYWJsZV9nZXQoIG5hbWUgKSA6IG5pbAorICBlbmQKKyAgCisgIGRlZiA8PCggdmFyaWFibGVfbWFwICkKKyAgICB2YXJpYWJsZV9tYXAuZWFjaF9wYWlyIGRvIHwgbmFtZSwgdmFsdWUgfAorICAgICAgc2VsZlsgbmFtZSBdID0gdmFsdWUKKyAgICBlbmQKKyAgICByZXR1cm4oIHNlbGYgKQorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplKCB2YXJpYWJsZV9tYXAgPSBuaWwgKQorICAgIHZhcmlhYmxlX21hcCBhbmQgc2VsZiA8PCB2YXJpYWJsZV9tYXAKKyAgICBibG9ja19naXZlbj8gYW5kIHlpZWxkKCBzZWxmICkKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIGhhc19pdmFyPyggbmFtZSApCisgICAgaW5zdGFuY2VfdmFyaWFibGVfZGVmaW5lZD8oIG1ha2VfaXZhciggbmFtZSApICkKKyAgZW5kCisgIAorICBkZWYgbWFrZV9pdmFyKCBuYW1lICkKKyAgICBuYW1lID0gbmFtZS50b19zCisgICAgVkFSSUFCTEVfRk9STSA9fiBuYW1lIG9yCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiY2Fubm90IGNvbnZlcnQgJXAgdG8gYW4gaW5zdGFuY2UgdmFyaWFibGUgbmFtZSIgJSBuYW1lCisgICAgJDEgPyBuYW1lIDogIkAjeyBuYW1lIH0iCisgIGVuZAorICAKK2VuZAorCitQYXJhbWV0ZXIgPSBTdHJ1Y3QubmV3KCA6bmFtZSwgOmRlZmF1bHQgKQorY2xhc3MgUGFyYW1ldGVyCisgIGRlZiB0b19zCisgICAgZGVmYXVsdCA/ICIjeyBuYW1lIH0gPSAjeyBkZWZhdWx0IH0iIDogIiN7IG5hbWUgfSIKKyAgZW5kCitlbmQKKworY2xhc3MgUGFyYW1ldGVyTGlzdCA8IDo6QXJyYXkKKyAgYXR0cl9hY2Nlc3NvciA6c3BsYXQsIDpibG9jaworICAKKyAgZGVmIHNlbGYuZGVmYXVsdAorICAgIG5ldy5hZGQoIDp2YWx1ZXMgKSBkbyB8IHAgfAorICAgICAgcC5kZWZhdWx0ID0gJ3t9JworICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBuYW1lcworICAgIG5hbWVzID0gbWFwIHsgfCBwYXJhbSB8IHBhcmFtLm5hbWUudG9fcyB9CisgICAgQHNwbGF0IGFuZCBuYW1lcyA8PCBAc3BsYXQudG9fcworICAgIEBibG9jayBhbmQgbmFtZXMgPDwgQGJsb2NrLnRvX3MKKyAgICByZXR1cm4oIG5hbWVzICkKKyAgZW5kCisgIAorICBkZWYgYWRkKCBuYW1lLCBvcHRpb25zID0gbmlsICkKKyAgICBwYXJhbSA9CisgICAgICBjYXNlIG5hbWUKKyAgICAgIHdoZW4gUGFyYW1ldGVyIHRoZW4gbmFtZQorICAgICAgZWxzZSBQYXJhbWV0ZXIubmV3KCBuYW1lLnRvX3MgKQorICAgICAgZW5kCisgICAgaWYgb3B0aW9ucworICAgICAgZGVmYXVsdCA9IG9wdGlvbnNbIDpkZWZhdWx0IF0gYW5kIHBhcmFtLmRlZmF1bHQgPSBkZWZhdWx0CisgICAgICBwYXJhbS5zcGxhdCA9IG9wdGlvbnMuZmV0Y2goIDpzcGxhdCwgZmFsc2UgKQorICAgICAgcGFyYW0uYmxvY2sgPSBvcHRpb25zLmZldGNoKCA6YmxvY2ssIGZhbHNlICkKKyAgICBlbmQKKyAgICBibG9ja19naXZlbj8gYW5kIHlpZWxkKCBwYXJhbSApCisgICAgcHVzaCggcGFyYW0gKQorICAgIHJldHVybiggc2VsZiApCisgIGVuZAorICAKKyAgZGVmIHRvX3MKKyAgICBzaWduYXR1cmUgPSBqb2luKCAnLCAnICkKKyAgICBAc3BsYXQgYW5kIHNpZ25hdHVyZSA8PCAiLCAqIiA8PCBAc3BsYXQudG9fcworICAgIEBibG9jayBhbmQgc2lnbmF0dXJlIDw8ICIsICYiIDw8IEBibG9jay50b19zCisgICAgcmV0dXJuKCBzaWduYXR1cmUgKQorICBlbmQKK2VuZAorZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9ncm91cC1maWxlLWxleGVyLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RlbXBsYXRlL2dyb3VwLWZpbGUtbGV4ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ZDk3MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9ncm91cC1maWxlLWxleGVyLnJiCkBAIC0wLDAgKzEsOTg4IEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIEdyb3VwRmlsZS5nCisjIAorIyBHZW5lcmF0ZWQgdXNpbmcgQU5UTFIgdmVyc2lvbjogMy4yLjEtU05BUFNIT1QgSnVuIDE4LCAyMDEwIDA1OjM4OjExCisjIFJ1YnkgcnVudGltZSBsaWJyYXJ5IHZlcnNpb246IDEuNy41CisjIElucHV0IGdyYW1tYXIgZmlsZTogR3JvdXBGaWxlLmcKKyMgR2VuZXJhdGVkIGF0OiAyMDEwLTA3LTAzIDIzOjE1OjM1CisjIAorCisjIH5+fj4gc3RhcnQgbG9hZCBwYXRoIHNldHVwCit0aGlzX2RpcmVjdG9yeSA9IEZpbGUuZXhwYW5kX3BhdGgoIEZpbGUuZGlybmFtZSggX19GSUxFX18gKSApCiskTE9BRF9QQVRILnVuc2hpZnQoIHRoaXNfZGlyZWN0b3J5ICkgdW5sZXNzICRMT0FEX1BBVEguaW5jbHVkZT8oIHRoaXNfZGlyZWN0b3J5ICkKKworYW50bHJfbG9hZF9mYWlsZWQgPSBwcm9jIGRvCisgIGxvYWRfcGF0aCA9ICRMT0FEX1BBVEgubWFwIHsgfGRpcnwgJyAgLSAnIDw8IGRpciB9LmpvaW4oICQvICkKKyAgcmFpc2UgTG9hZEVycm9yLCA8PC1FTkQuc3RyaXAhCisgIAorRmFpbGVkIHRvIGxvYWQgdGhlIEFOVExSMyBydW50aW1lIGxpYnJhcnkgKHZlcnNpb24gMS43LjUpOgorCitFbnN1cmUgdGhlIGxpYnJhcnkgaGFzIGJlZW4gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBpcyBhdmFpbGFibGUKK29uIHRoZSBsb2FkIHBhdGguIElmIHJ1YnlnZW1zIGlzIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSwgdGhpcyBjYW4KK2JlIGRvbmUgd2l0aCB0aGUgY29tbWFuZDoKKyAgCisgIGdlbSBpbnN0YWxsIGFudGxyMworCitDdXJyZW50IGxvYWQgcGF0aDoKKyN7IGxvYWRfcGF0aCB9CisKKyAgRU5ECitlbmQKKworZGVmaW5lZD8oIEFOVExSMyApIG9yIGJlZ2luCisgIAorICAjIDE6IHRyeSB0byBsb2FkIHRoZSBydWJ5IGFudGxyMyBydW50aW1lIGxpYnJhcnkgZnJvbSB0aGUgc3lzdGVtIHBhdGgKKyAgcmVxdWlyZSAnYW50bHIzJworICAKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgCisgICMgMjogdHJ5IHRvIGxvYWQgcnVieWdlbXMgaWYgaXQgaXNuJ3QgYWxyZWFkeSBsb2FkZWQKKyAgZGVmaW5lZD8oIEdlbSApIG9yIGJlZ2luCisgICAgcmVxdWlyZSAncnVieWdlbXMnCisgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICBhbnRscl9sb2FkX2ZhaWxlZC5jYWxsCisgIGVuZAorICAKKyAgIyAzOiB0cnkgdG8gYWN0aXZhdGUgdGhlIGFudGxyMyBnZW0KKyAgYmVnaW4KKyAgICBHZW0uYWN0aXZhdGUoICdhbnRscjMnLCAnfj4gMS43LjUnICkKKyAgcmVzY3VlIEdlbTo6TG9hZEVycm9yCisgICAgYW50bHJfbG9hZF9mYWlsZWQuY2FsbAorICBlbmQKKyAgCisgIHJlcXVpcmUgJ2FudGxyMycKKyAgCitlbmQKKyMgPH5+fiBlbmQgbG9hZCBwYXRoIHNldHVwCisKKyMgLSAtIC0gLSAtIC0gYmVnaW4gYWN0aW9uIEBsZXhlcjo6aGVhZGVyIC0gLSAtIC0gLSAtCisjIEdyb3VwRmlsZS5nCisKKworbW9kdWxlIEFOVExSMworbW9kdWxlIFRlbXBsYXRlCisKKyMgLSAtIC0gLSAtIC0gZW5kIGFjdGlvbiBAbGV4ZXI6OmhlYWRlciAtIC0gLSAtIC0gLSAtCisKKworbW9kdWxlIEdyb3VwRmlsZQorICAjIFRva2VuRGF0YSBkZWZpbmVzIGFsbCBvZiB0aGUgdG9rZW4gdHlwZSBpbnRlZ2VyIHZhbHVlcworICAjIGFzIGNvbnN0YW50cywgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBpbiBhbGwgCisgICMgQU5UTFItZ2VuZXJhdGVkIHJlY29nbml6ZXJzLgorICBjb25zdF9kZWZpbmVkPyggOlRva2VuRGF0YSApIG9yIFRva2VuRGF0YSA9IEFOVExSMzo6VG9rZW5TY2hlbWUubmV3CisKKyAgbW9kdWxlIFRva2VuRGF0YQorCisgICAgIyBkZWZpbmUgdGhlIHRva2VuIGNvbnN0YW50cworICAgIGRlZmluZV90b2tlbnMoIDpJRCA9PiA1LCA6RU9GID0+IC0xLCA6VF9fMTkgPT4gMTksIDpXUyA9PiA5LCA6VF9fMTYgPT4gMTYsIAorICAgICAgICAgICAgICAgICAgIDpUX18xNSA9PiAxNSwgOlRfXzE4ID0+IDE4LCA6VF9fMTcgPT4gMTcsIDpUX18xMiA9PiAxMiwgCisgICAgICAgICAgICAgICAgICAgOlRFTVBMQVRFID0+IDYsIDpUX18xMSA9PiAxMSwgOlRfXzE0ID0+IDE0LCA6VF9fMTMgPT4gMTMsIAorICAgICAgICAgICAgICAgICAgIDpUX18xMCA9PiAxMCwgOkNPTlNUQU5UID0+IDQsIDpDT01NRU5UID0+IDgsIDpTVFJJTkcgPT4gNyApCisgICAgCisgIGVuZAorCisKKyAgY2xhc3MgTGV4ZXIgPCBBTlRMUjM6OkxleGVyCisgICAgQGdyYW1tYXJfaG9tZSA9IEdyb3VwRmlsZQorICAgIGluY2x1ZGUgVG9rZW5EYXRhCisKKyAgICAKKyAgICBiZWdpbgorICAgICAgZ2VuZXJhdGVkX3VzaW5nKCAiR3JvdXBGaWxlLmciLCAiMy4yLjEtU05BUFNIT1QgSnVuIDE4LCAyMDEwIDA1OjM4OjExIiwgIjEuNy41IiApCisgICAgcmVzY3VlIE5vTWV0aG9kRXJyb3IgPT4gZXJyb3IKKyAgICAgICMgaWdub3JlCisgICAgZW5kCisgICAgCisgICAgUlVMRV9OQU1FUyAgID0gWyAiVF9fMTAiLCAiVF9fMTEiLCAiVF9fMTIiLCAiVF9fMTMiLCAiVF9fMTQiLCAiVF9fMTUiLCAKKyAgICAgICAgICAgICAgICAgICAgICJUX18xNiIsICJUX18xNyIsICJUX18xOCIsICJUX18xOSIsICJDT05TVEFOVCIsICJJRCIsIAorICAgICAgICAgICAgICAgICAgICAgIlRFTVBMQVRFIiwgIlNUUklORyIsICJDT01NRU5UIiwgIldTIiBdLmZyZWV6ZQorICAgIFJVTEVfTUVUSE9EUyA9IFsgOnRfXzEwISwgOnRfXzExISwgOnRfXzEyISwgOnRfXzEzISwgOnRfXzE0ISwgOnRfXzE1ISwgCisgICAgICAgICAgICAgICAgICAgICA6dF9fMTYhLCA6dF9fMTchLCA6dF9fMTghLCA6dF9fMTkhLCA6Y29uc3RhbnQhLCA6aWQhLCAKKyAgICAgICAgICAgICAgICAgICAgIDp0ZW1wbGF0ZSEsIDpzdHJpbmchLCA6Y29tbWVudCEsIDp3cyEgXS5mcmVlemUKKworICAgIAorICAgIGRlZiBpbml0aWFsaXplKCBpbnB1dD1uaWwsIG9wdGlvbnMgPSB7fSApCisgICAgICBzdXBlciggaW5wdXQsIG9wdGlvbnMgKQorCisgICAgZW5kCisgICAgCisgICAgCisgICAgIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gbGV4ZXIgcnVsZXMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICAjIGxleGVyIHJ1bGUgdF9fMTAhIChUX18xMCkKKyAgICAjIChpbiBHcm91cEZpbGUuZykKKyAgICBkZWYgdF9fMTAhCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2VfaW4oIF9fbWV0aG9kX18sIDEgKQorCisgICAgICB0eXBlID0gVF9fMTAKKyAgICAgIGNoYW5uZWwgPSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorCisgICAgICAKKyAgICAgICMgLSAtIC0gLSBtYWluIHJ1bGUgYmxvY2sgLSAtIC0gLQorICAgICAgIyBhdCBsaW5lIDE2Ojk6ICdncm91cCcKKyAgICAgIG1hdGNoKCAiZ3JvdXAiICkKKworICAgICAgCisgICAgICBAc3RhdGUudHlwZSA9IHR5cGUKKyAgICAgIEBzdGF0ZS5jaGFubmVsID0gY2hhbm5lbAorCisgICAgZW5zdXJlCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCAxICkKKworICAgIGVuZAorCisgICAgIyBsZXhlciBydWxlIHRfXzExISAoVF9fMTEpCisgICAgIyAoaW4gR3JvdXBGaWxlLmcpCisgICAgZGVmIHRfXzExIQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX2luKCBfX21ldGhvZF9fLCAyICkKKworICAgICAgdHlwZSA9IFRfXzExCisgICAgICBjaGFubmVsID0gQU5UTFIzOjpERUZBVUxUX0NIQU5ORUwKKworICAgICAgCisgICAgICAjIC0gLSAtIC0gbWFpbiBydWxlIGJsb2NrIC0gLSAtIC0KKyAgICAgICMgYXQgbGluZSAxNzo5OiAnOjonCisgICAgICBtYXRjaCggIjo6IiApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgMiApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xMiEgKFRfXzEyKQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xMiEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgMyApCisKKyAgICAgIHR5cGUgPSBUX18xMgorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMTg6OTogJzsnCisgICAgICBtYXRjaCggMHgzYiApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgMyApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xMyEgKFRfXzEzKQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xMyEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgNCApCisKKyAgICAgIHR5cGUgPSBUX18xMworICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMTk6OTogJzo6PScKKyAgICAgIG1hdGNoKCAiOjo9IiApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgNCApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xNCEgKFRfXzE0KQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xNCEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgNSApCisKKyAgICAgIHR5cGUgPSBUX18xNAorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMjA6OTogJygnCisgICAgICBtYXRjaCggMHgyOCApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgNSApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xNSEgKFRfXzE1KQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xNSEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgNiApCisKKyAgICAgIHR5cGUgPSBUX18xNQorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMjE6OTogJyknCisgICAgICBtYXRjaCggMHgyOSApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgNiApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xNiEgKFRfXzE2KQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xNiEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgNyApCisKKyAgICAgIHR5cGUgPSBUX18xNgorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMjI6OTogJywnCisgICAgICBtYXRjaCggMHgyYyApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgNyApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xNyEgKFRfXzE3KQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xNyEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgOCApCisKKyAgICAgIHR5cGUgPSBUX18xNworICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMjM6OTogJyonCisgICAgICBtYXRjaCggMHgyYSApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgOCApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xOCEgKFRfXzE4KQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xOCEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgOSApCisKKyAgICAgIHR5cGUgPSBUX18xOAorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMjQ6OTogJyYnCisgICAgICBtYXRjaCggMHgyNiApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgOSApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0X18xOSEgKFRfXzE5KQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0X18xOSEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgMTAgKQorCisgICAgICB0eXBlID0gVF9fMTkKKyAgICAgIGNoYW5uZWwgPSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorCisgICAgICAKKyAgICAgICMgLSAtIC0gLSBtYWluIHJ1bGUgYmxvY2sgLSAtIC0gLQorICAgICAgIyBhdCBsaW5lIDI1Ojk6ICc9JworICAgICAgbWF0Y2goIDB4M2QgKQorCisgICAgICAKKyAgICAgIEBzdGF0ZS50eXBlID0gdHlwZQorICAgICAgQHN0YXRlLmNoYW5uZWwgPSBjaGFubmVsCisKKyAgICBlbnN1cmUKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9vdXQoIF9fbWV0aG9kX18sIDEwICkKKworICAgIGVuZAorCisgICAgIyBsZXhlciBydWxlIGNvbnN0YW50ISAoQ09OU1RBTlQpCisgICAgIyAoaW4gR3JvdXBGaWxlLmcpCisgICAgZGVmIGNvbnN0YW50IQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX2luKCBfX21ldGhvZF9fLCAxMSApCisKKyAgICAgIHR5cGUgPSBDT05TVEFOVAorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMTI1OjU6ICdBJyAuLiAnWicgKCAnYScgLi4gJ3onIHwgJ18nIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgIG1hdGNoX3JhbmdlKCAweDQxLCAweDVhICkKKyAgICAgICMgYXQgbGluZSAxMjU6MTQ6ICggJ2EnIC4uICd6JyB8ICdfJyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknICkqCisgICAgICB3aGlsZSB0cnVlICMgZGVjaXNpb24gMQorICAgICAgICBhbHRfMSA9IDIKKyAgICAgICAgbG9va18xXzAgPSBAaW5wdXQucGVlayggMSApCisKKyAgICAgICAgaWYgKCBsb29rXzFfMC5iZXR3ZWVuPyggMHgzMCwgMHgzOSApIHx8IGxvb2tfMV8wLmJldHdlZW4/KCAweDQxLCAweDVhICkgfHwgbG9va18xXzAgPT0gMHg1ZiB8fCBsb29rXzFfMC5iZXR3ZWVuPyggMHg2MSwgMHg3YSApICkKKyAgICAgICAgICBhbHRfMSA9IDEKKworICAgICAgICBlbmQKKyAgICAgICAgY2FzZSBhbHRfMQorICAgICAgICB3aGVuIDEKKyAgICAgICAgICAjIGF0IGxpbmUgCisgICAgICAgICAgaWYgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHgzMCwgMHgzOSApIHx8IEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4NDEsIDB4NWEgKSB8fCBAaW5wdXQucGVlayggMSApID09IDB4NWYgfHwgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHg2MSwgMHg3YSApCisgICAgICAgICAgICBAaW5wdXQuY29uc3VtZQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1zZSA9IE1pc21hdGNoZWRTZXQoIG5pbCApCisgICAgICAgICAgICByZWNvdmVyIG1zZQorICAgICAgICAgICAgcmFpc2UgbXNlCisgICAgICAgICAgZW5kCisKKworCisgICAgICAgIGVsc2UKKyAgICAgICAgICBicmVhayAjIG91dCBvZiBsb29wIGZvciBkZWNpc2lvbiAxCisgICAgICAgIGVuZAorICAgICAgZW5kICMgbG9vcCBmb3IgZGVjaXNpb24gMQorCisgICAgICAKKyAgICAgIEBzdGF0ZS50eXBlID0gdHlwZQorICAgICAgQHN0YXRlLmNoYW5uZWwgPSBjaGFubmVsCisKKyAgICBlbnN1cmUKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9vdXQoIF9fbWV0aG9kX18sIDExICkKKworICAgIGVuZAorCisgICAgIyBsZXhlciBydWxlIGlkISAoSUQpCisgICAgIyAoaW4gR3JvdXBGaWxlLmcpCisgICAgZGVmIGlkIQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX2luKCBfX21ldGhvZF9fLCAxMiApCisKKyAgICAgIHR5cGUgPSBJRAorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMTI5OjU6ICggJ2EnIC4uICd6JyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdfJyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknICkqCisgICAgICBpZiBAaW5wdXQucGVlayggMSApID09IDB4NWYgfHwgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHg2MSwgMHg3YSApCisgICAgICAgIEBpbnB1dC5jb25zdW1lCisgICAgICBlbHNlCisgICAgICAgIG1zZSA9IE1pc21hdGNoZWRTZXQoIG5pbCApCisgICAgICAgIHJlY292ZXIgbXNlCisgICAgICAgIHJhaXNlIG1zZQorICAgICAgZW5kCisKKworICAgICAgIyBhdCBsaW5lIDEzMDo1OiAoICdhJyAuLiAneicgfCAnXycgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyApKgorICAgICAgd2hpbGUgdHJ1ZSAjIGRlY2lzaW9uIDIKKyAgICAgICAgYWx0XzIgPSAyCisgICAgICAgIGxvb2tfMl8wID0gQGlucHV0LnBlZWsoIDEgKQorCisgICAgICAgIGlmICggbG9va18yXzAuYmV0d2Vlbj8oIDB4MzAsIDB4MzkgKSB8fCBsb29rXzJfMC5iZXR3ZWVuPyggMHg0MSwgMHg1YSApIHx8IGxvb2tfMl8wID09IDB4NWYgfHwgbG9va18yXzAuYmV0d2Vlbj8oIDB4NjEsIDB4N2EgKSApCisgICAgICAgICAgYWx0XzIgPSAxCisKKyAgICAgICAgZW5kCisgICAgICAgIGNhc2UgYWx0XzIKKyAgICAgICAgd2hlbiAxCisgICAgICAgICAgIyBhdCBsaW5lIAorICAgICAgICAgIGlmIEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4MzAsIDB4MzkgKSB8fCBAaW5wdXQucGVlayggMSApLmJldHdlZW4/KCAweDQxLCAweDVhICkgfHwgQGlucHV0LnBlZWsoIDEgKSA9PSAweDVmIHx8IEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4NjEsIDB4N2EgKQorICAgICAgICAgICAgQGlucHV0LmNvbnN1bWUKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtc2UgPSBNaXNtYXRjaGVkU2V0KCBuaWwgKQorICAgICAgICAgICAgcmVjb3ZlciBtc2UKKyAgICAgICAgICAgIHJhaXNlIG1zZQorICAgICAgICAgIGVuZAorCisKKworICAgICAgICBlbHNlCisgICAgICAgICAgYnJlYWsgIyBvdXQgb2YgbG9vcCBmb3IgZGVjaXNpb24gMgorICAgICAgICBlbmQKKyAgICAgIGVuZCAjIGxvb3AgZm9yIGRlY2lzaW9uIDIKKworICAgICAgCisgICAgICBAc3RhdGUudHlwZSA9IHR5cGUKKyAgICAgIEBzdGF0ZS5jaGFubmVsID0gY2hhbm5lbAorCisgICAgZW5zdXJlCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCAxMiApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB0ZW1wbGF0ZSEgKFRFTVBMQVRFKQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB0ZW1wbGF0ZSEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgMTMgKQorCisgICAgICB0eXBlID0gVEVNUExBVEUKKyAgICAgIGNoYW5uZWwgPSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorCisgICAgICAKKyAgICAgICMgLSAtIC0gLSBtYWluIHJ1bGUgYmxvY2sgLSAtIC0gLQorICAgICAgIyBhdCBsaW5lIDEzNDo1OiAnPDw8JyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6ICdcXFxcJyAuIHwgLiApKiAnPj4+JworICAgICAgbWF0Y2goICI8PDwiICkKKyAgICAgICMgYXQgbGluZSAxMzU6NTogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAnXFxcXCcgLiB8IC4gKSoKKyAgICAgIHdoaWxlIHRydWUgIyBkZWNpc2lvbiAzCisgICAgICAgIGFsdF8zID0gMworICAgICAgICBsb29rXzNfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICBpZiAoIGxvb2tfM18wID09IDB4M2UgKQorICAgICAgICAgIGxvb2tfM18xID0gQGlucHV0LnBlZWsoIDIgKQorCisgICAgICAgICAgaWYgKCBsb29rXzNfMSA9PSAweDNlICkKKyAgICAgICAgICAgIGxvb2tfM180ID0gQGlucHV0LnBlZWsoIDMgKQorCisgICAgICAgICAgICBpZiAoIGxvb2tfM180ID09IDB4M2UgKQorICAgICAgICAgICAgICBhbHRfMyA9IDMKKyAgICAgICAgICAgIGVsc2lmICggbG9va18zXzQuYmV0d2Vlbj8oIDB4MCwgMHgzZCApIHx8IGxvb2tfM180LmJldHdlZW4/KCAweDNmLCAweGZmZmYgKSApCisgICAgICAgICAgICAgIGFsdF8zID0gMgorCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICBlbHNpZiAoIGxvb2tfM18xLmJldHdlZW4/KCAweDAsIDB4M2QgKSB8fCBsb29rXzNfMS5iZXR3ZWVuPyggMHgzZiwgMHhmZmZmICkgKQorICAgICAgICAgICAgYWx0XzMgPSAyCisKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzaWYgKCBsb29rXzNfMCA9PSAweDVjICkKKyAgICAgICAgICBsb29rXzNfMiA9IEBpbnB1dC5wZWVrKCAyICkKKworICAgICAgICAgIGlmICggbG9va18zXzIgPT0gMHgzZSApCisgICAgICAgICAgICBhbHRfMyA9IDEKKyAgICAgICAgICBlbHNpZiAoIGxvb2tfM18yID09IDB4NWMgKQorICAgICAgICAgICAgYWx0XzMgPSAxCisgICAgICAgICAgZWxzaWYgKCBsb29rXzNfMi5iZXR3ZWVuPyggMHgwLCAweDNkICkgfHwgbG9va18zXzIuYmV0d2Vlbj8oIDB4M2YsIDB4NWIgKSB8fCBsb29rXzNfMi5iZXR3ZWVuPyggMHg1ZCwgMHhmZmZmICkgKQorICAgICAgICAgICAgYWx0XzMgPSAxCisKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzaWYgKCBsb29rXzNfMC5iZXR3ZWVuPyggMHgwLCAweDNkICkgfHwgbG9va18zXzAuYmV0d2Vlbj8oIDB4M2YsIDB4NWIgKSB8fCBsb29rXzNfMC5iZXR3ZWVuPyggMHg1ZCwgMHhmZmZmICkgKQorICAgICAgICAgIGFsdF8zID0gMgorCisgICAgICAgIGVuZAorICAgICAgICBjYXNlIGFsdF8zCisgICAgICAgIHdoZW4gMQorICAgICAgICAgICMgYXQgbGluZSAxMzU6MzU6ICdcXFxcJyAuCisgICAgICAgICAgbWF0Y2goIDB4NWMgKQorICAgICAgICAgIG1hdGNoX2FueQorCisgICAgICAgIHdoZW4gMgorICAgICAgICAgICMgYXQgbGluZSAxMzU6NDQ6IC4KKyAgICAgICAgICBtYXRjaF9hbnkKKworICAgICAgICBlbHNlCisgICAgICAgICAgYnJlYWsgIyBvdXQgb2YgbG9vcCBmb3IgZGVjaXNpb24gMworICAgICAgICBlbmQKKyAgICAgIGVuZCAjIGxvb3AgZm9yIGRlY2lzaW9uIDMKKyAgICAgIG1hdGNoKCAiPj4+IiApCisKKyAgICAgIAorICAgICAgQHN0YXRlLnR5cGUgPSB0eXBlCisgICAgICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKworICAgIGVuc3VyZQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgMTMgKQorCisgICAgZW5kCisKKyAgICAjIGxleGVyIHJ1bGUgc3RyaW5nISAoU1RSSU5HKQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiBzdHJpbmchCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2VfaW4oIF9fbWV0aG9kX18sIDE0ICkKKworICAgICAgdHlwZSA9IFNUUklORworICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMTQwOjM6ICggJ1wiJyAofiAoICdcXFxcJyB8ICdcIicgKSB8ICdcXFxcJyAuICkqICdcIicgfCAnXFwnJyAofiAoICdcXFxcJyB8ICdcXCcnICkgfCAnXFxcXCcgLiApKiAnXFwnJyApCisgICAgICBhbHRfNiA9IDIKKyAgICAgIGxvb2tfNl8wID0gQGlucHV0LnBlZWsoIDEgKQorCisgICAgICBpZiAoIGxvb2tfNl8wID09IDB4MjIgKQorICAgICAgICBhbHRfNiA9IDEKKyAgICAgIGVsc2lmICggbG9va182XzAgPT0gMHgyNyApCisgICAgICAgIGFsdF82ID0gMgorICAgICAgZWxzZQorICAgICAgICByYWlzZSBOb1ZpYWJsZUFsdGVybmF0aXZlKCAiIiwgNiwgMCApCisgICAgICBlbmQKKyAgICAgIGNhc2UgYWx0XzYKKyAgICAgIHdoZW4gMQorICAgICAgICAjIGF0IGxpbmUgMTQwOjU6ICdcIicgKH4gKCAnXFxcXCcgfCAnXCInICkgfCAnXFxcXCcgLiApKiAnXCInCisgICAgICAgIG1hdGNoKCAweDIyICkKKyAgICAgICAgIyBhdCBsaW5lIDE0MDoxMDogKH4gKCAnXFxcXCcgfCAnXCInICkgfCAnXFxcXCcgLiApKgorICAgICAgICB3aGlsZSB0cnVlICMgZGVjaXNpb24gNAorICAgICAgICAgIGFsdF80ID0gMworICAgICAgICAgIGxvb2tfNF8wID0gQGlucHV0LnBlZWsoIDEgKQorCisgICAgICAgICAgaWYgKCBsb29rXzRfMC5iZXR3ZWVuPyggMHgwLCAweDIxICkgfHwgbG9va180XzAuYmV0d2Vlbj8oIDB4MjMsIDB4NWIgKSB8fCBsb29rXzRfMC5iZXR3ZWVuPyggMHg1ZCwgMHhmZmZmICkgKQorICAgICAgICAgICAgYWx0XzQgPSAxCisgICAgICAgICAgZWxzaWYgKCBsb29rXzRfMCA9PSAweDVjICkKKyAgICAgICAgICAgIGFsdF80ID0gMgorCisgICAgICAgICAgZW5kCisgICAgICAgICAgY2FzZSBhbHRfNAorICAgICAgICAgIHdoZW4gMQorICAgICAgICAgICAgIyBhdCBsaW5lIDE0MDoxMjogfiAoICdcXFxcJyB8ICdcIicgKQorICAgICAgICAgICAgaWYgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHgwLCAweDIxICkgfHwgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHgyMywgMHg1YiApIHx8IEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4NWQsIDB4ZmYgKQorICAgICAgICAgICAgICBAaW5wdXQuY29uc3VtZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtc2UgPSBNaXNtYXRjaGVkU2V0KCBuaWwgKQorICAgICAgICAgICAgICByZWNvdmVyIG1zZQorICAgICAgICAgICAgICByYWlzZSBtc2UKKyAgICAgICAgICAgIGVuZAorCisKKworICAgICAgICAgIHdoZW4gMgorICAgICAgICAgICAgIyBhdCBsaW5lIDE0MDozMTogJ1xcXFwnIC4KKyAgICAgICAgICAgIG1hdGNoKCAweDVjICkKKyAgICAgICAgICAgIG1hdGNoX2FueQorCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWsgIyBvdXQgb2YgbG9vcCBmb3IgZGVjaXNpb24gNAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQgIyBsb29wIGZvciBkZWNpc2lvbiA0CisgICAgICAgIG1hdGNoKCAweDIyICkKKworICAgICAgd2hlbiAyCisgICAgICAgICMgYXQgbGluZSAxNDE6NTogJ1xcJycgKH4gKCAnXFxcXCcgfCAnXFwnJyApIHwgJ1xcXFwnIC4gKSogJ1xcJycKKyAgICAgICAgbWF0Y2goIDB4MjcgKQorICAgICAgICAjIGF0IGxpbmUgMTQxOjEwOiAofiAoICdcXFxcJyB8ICdcXCcnICkgfCAnXFxcXCcgLiApKgorICAgICAgICB3aGlsZSB0cnVlICMgZGVjaXNpb24gNQorICAgICAgICAgIGFsdF81ID0gMworICAgICAgICAgIGxvb2tfNV8wID0gQGlucHV0LnBlZWsoIDEgKQorCisgICAgICAgICAgaWYgKCBsb29rXzVfMC5iZXR3ZWVuPyggMHgwLCAweDI2ICkgfHwgbG9va181XzAuYmV0d2Vlbj8oIDB4MjgsIDB4NWIgKSB8fCBsb29rXzVfMC5iZXR3ZWVuPyggMHg1ZCwgMHhmZmZmICkgKQorICAgICAgICAgICAgYWx0XzUgPSAxCisgICAgICAgICAgZWxzaWYgKCBsb29rXzVfMCA9PSAweDVjICkKKyAgICAgICAgICAgIGFsdF81ID0gMgorCisgICAgICAgICAgZW5kCisgICAgICAgICAgY2FzZSBhbHRfNQorICAgICAgICAgIHdoZW4gMQorICAgICAgICAgICAgIyBhdCBsaW5lIDE0MToxMjogfiAoICdcXFxcJyB8ICdcXCcnICkKKyAgICAgICAgICAgIGlmIEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4MCwgMHgyNiApIHx8IEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4MjgsIDB4NWIgKSB8fCBAaW5wdXQucGVlayggMSApLmJldHdlZW4/KCAweDVkLCAweGZmICkKKyAgICAgICAgICAgICAgQGlucHV0LmNvbnN1bWUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgbXNlID0gTWlzbWF0Y2hlZFNldCggbmlsICkKKyAgICAgICAgICAgICAgcmVjb3ZlciBtc2UKKyAgICAgICAgICAgICAgcmFpc2UgbXNlCisgICAgICAgICAgICBlbmQKKworCisKKyAgICAgICAgICB3aGVuIDIKKyAgICAgICAgICAgICMgYXQgbGluZSAxNDE6MzE6ICdcXFxcJyAuCisgICAgICAgICAgICBtYXRjaCggMHg1YyApCisgICAgICAgICAgICBtYXRjaF9hbnkKKworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrICMgb3V0IG9mIGxvb3AgZm9yIGRlY2lzaW9uIDUKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kICMgbG9vcCBmb3IgZGVjaXNpb24gNQorICAgICAgICBtYXRjaCggMHgyNyApCisKKyAgICAgIGVuZAorICAgICAgCisgICAgICBAc3RhdGUudHlwZSA9IHR5cGUKKyAgICAgIEBzdGF0ZS5jaGFubmVsID0gY2hhbm5lbAorCisgICAgZW5zdXJlCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCAxNCApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSBjb21tZW50ISAoQ09NTUVOVCkKKyAgICAjIChpbiBHcm91cEZpbGUuZykKKyAgICBkZWYgY29tbWVudCEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgMTUgKQorCisgICAgICB0eXBlID0gQ09NTUVOVAorICAgICAgY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisKKyAgICAgIAorICAgICAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgICAgICAjIGF0IGxpbmUgMTQ2OjM6ICggKCAnIycgfCAnLy8nICkgKH4gJ1xcbicgKSogfCAnLyonICggLiApKiAnKi8nICkKKyAgICAgIGFsdF8xMCA9IDIKKyAgICAgIGxvb2tfMTBfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgaWYgKCBsb29rXzEwXzAgPT0gMHgyMyApCisgICAgICAgIGFsdF8xMCA9IDEKKyAgICAgIGVsc2lmICggbG9va18xMF8wID09IDB4MmYgKQorICAgICAgICBsb29rXzEwXzIgPSBAaW5wdXQucGVlayggMiApCisKKyAgICAgICAgaWYgKCBsb29rXzEwXzIgPT0gMHgyZiApCisgICAgICAgICAgYWx0XzEwID0gMQorICAgICAgICBlbHNpZiAoIGxvb2tfMTBfMiA9PSAweDJhICkKKyAgICAgICAgICBhbHRfMTAgPSAyCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBOb1ZpYWJsZUFsdGVybmF0aXZlKCAiIiwgMTAsIDIgKQorICAgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgTm9WaWFibGVBbHRlcm5hdGl2ZSggIiIsIDEwLCAwICkKKyAgICAgIGVuZAorICAgICAgY2FzZSBhbHRfMTAKKyAgICAgIHdoZW4gMQorICAgICAgICAjIGF0IGxpbmUgMTQ2OjU6ICggJyMnIHwgJy8vJyApICh+ICdcXG4nICkqCisgICAgICAgICMgYXQgbGluZSAxNDY6NTogKCAnIycgfCAnLy8nICkKKyAgICAgICAgYWx0XzcgPSAyCisgICAgICAgIGxvb2tfN18wID0gQGlucHV0LnBlZWsoIDEgKQorCisgICAgICAgIGlmICggbG9va183XzAgPT0gMHgyMyApCisgICAgICAgICAgYWx0XzcgPSAxCisgICAgICAgIGVsc2lmICggbG9va183XzAgPT0gMHgyZiApCisgICAgICAgICAgYWx0XzcgPSAyCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBOb1ZpYWJsZUFsdGVybmF0aXZlKCAiIiwgNywgMCApCisgICAgICAgIGVuZAorICAgICAgICBjYXNlIGFsdF83CisgICAgICAgIHdoZW4gMQorICAgICAgICAgICMgYXQgbGluZSAxNDY6NzogJyMnCisgICAgICAgICAgbWF0Y2goIDB4MjMgKQorCisgICAgICAgIHdoZW4gMgorICAgICAgICAgICMgYXQgbGluZSAxNDY6MTM6ICcvLycKKyAgICAgICAgICBtYXRjaCggIi8vIiApCisKKyAgICAgICAgZW5kCisgICAgICAgICMgYXQgbGluZSAxNDY6MjA6ICh+ICdcXG4nICkqCisgICAgICAgIHdoaWxlIHRydWUgIyBkZWNpc2lvbiA4CisgICAgICAgICAgYWx0XzggPSAyCisgICAgICAgICAgbG9va184XzAgPSBAaW5wdXQucGVlayggMSApCisKKyAgICAgICAgICBpZiAoIGxvb2tfOF8wLmJldHdlZW4/KCAweDAsIDB4OSApIHx8IGxvb2tfOF8wLmJldHdlZW4/KCAweGIsIDB4ZmZmZiApICkKKyAgICAgICAgICAgIGFsdF84ID0gMQorCisgICAgICAgICAgZW5kCisgICAgICAgICAgY2FzZSBhbHRfOAorICAgICAgICAgIHdoZW4gMQorICAgICAgICAgICAgIyBhdCBsaW5lIDE0NjoyMDogfiAnXFxuJworICAgICAgICAgICAgaWYgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHgwLCAweDkgKSB8fCBAaW5wdXQucGVlayggMSApLmJldHdlZW4/KCAweGIsIDB4ZmYgKQorICAgICAgICAgICAgICBAaW5wdXQuY29uc3VtZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtc2UgPSBNaXNtYXRjaGVkU2V0KCBuaWwgKQorICAgICAgICAgICAgICByZWNvdmVyIG1zZQorICAgICAgICAgICAgICByYWlzZSBtc2UKKyAgICAgICAgICAgIGVuZAorCisKKworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrICMgb3V0IG9mIGxvb3AgZm9yIGRlY2lzaW9uIDgKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kICMgbG9vcCBmb3IgZGVjaXNpb24gOAorCisgICAgICB3aGVuIDIKKyAgICAgICAgIyBhdCBsaW5lIDE0Nzo1OiAnLyonICggLiApKiAnKi8nCisgICAgICAgIG1hdGNoKCAiLyoiICkKKyAgICAgICAgIyBhdCBsaW5lIDE0NzoxMDogKCAuICkqCisgICAgICAgIHdoaWxlIHRydWUgIyBkZWNpc2lvbiA5CisgICAgICAgICAgYWx0XzkgPSAyCisgICAgICAgICAgbG9va185XzAgPSBAaW5wdXQucGVlayggMSApCisKKyAgICAgICAgICBpZiAoIGxvb2tfOV8wID09IDB4MmEgKQorICAgICAgICAgICAgbG9va185XzEgPSBAaW5wdXQucGVlayggMiApCisKKyAgICAgICAgICAgIGlmICggbG9va185XzEgPT0gMHgyZiApCisgICAgICAgICAgICAgIGFsdF85ID0gMgorICAgICAgICAgICAgZWxzaWYgKCBsb29rXzlfMS5iZXR3ZWVuPyggMHgwLCAweDJlICkgfHwgbG9va185XzEuYmV0d2Vlbj8oIDB4MzAsIDB4ZmZmZiApICkKKyAgICAgICAgICAgICAgYWx0XzkgPSAxCisKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2lmICggbG9va185XzAuYmV0d2Vlbj8oIDB4MCwgMHgyOSApIHx8IGxvb2tfOV8wLmJldHdlZW4/KCAweDJiLCAweGZmZmYgKSApCisgICAgICAgICAgICBhbHRfOSA9IDEKKworICAgICAgICAgIGVuZAorICAgICAgICAgIGNhc2UgYWx0XzkKKyAgICAgICAgICB3aGVuIDEKKyAgICAgICAgICAgICMgYXQgbGluZSAxNDc6MTA6IC4KKyAgICAgICAgICAgIG1hdGNoX2FueQorCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWsgIyBvdXQgb2YgbG9vcCBmb3IgZGVjaXNpb24gOQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQgIyBsb29wIGZvciBkZWNpc2lvbiA5CisgICAgICAgIG1hdGNoKCAiKi8iICkKKworICAgICAgZW5kCisgICAgICAKKyAgICAgIEBzdGF0ZS50eXBlID0gdHlwZQorICAgICAgQHN0YXRlLmNoYW5uZWwgPSBjaGFubmVsCisgICAgIyAtLT4gYWN0aW9uCisgICAgIHNraXAgCisgICAgIyA8LS0gYWN0aW9uCisgICAgZW5zdXJlCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCAxNSApCisKKyAgICBlbmQKKworICAgICMgbGV4ZXIgcnVsZSB3cyEgKFdTKQorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgIGRlZiB3cyEKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgMTYgKQorCisgICAgICB0eXBlID0gV1MKKyAgICAgIGNoYW5uZWwgPSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorCisgICAgICAKKyAgICAgICMgLSAtIC0gLSBtYWluIHJ1bGUgYmxvY2sgLSAtIC0gLQorICAgICAgIyBhdCBsaW5lIDE1MTo1OiAoICcgJyB8ICdcXHQnIHwgJ1xcbicgfCAnXFxyJyB8ICdcXGYnICkrCisgICAgICAjIGF0IGZpbGUgMTUxOjU6ICggJyAnIHwgJ1xcdCcgfCAnXFxuJyB8ICdcXHInIHwgJ1xcZicgKSsKKyAgICAgIG1hdGNoX2NvdW50XzExID0gMAorICAgICAgd2hpbGUgdHJ1ZQorICAgICAgICBhbHRfMTEgPSAyCisgICAgICAgIGxvb2tfMTFfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICBpZiAoIGxvb2tfMTFfMC5iZXR3ZWVuPyggMHg5LCAweGEgKSB8fCBsb29rXzExXzAuYmV0d2Vlbj8oIDB4YywgMHhkICkgfHwgbG9va18xMV8wID09IDB4MjAgKQorICAgICAgICAgIGFsdF8xMSA9IDEKKworICAgICAgICBlbmQKKyAgICAgICAgY2FzZSBhbHRfMTEKKyAgICAgICAgd2hlbiAxCisgICAgICAgICAgIyBhdCBsaW5lIAorICAgICAgICAgIGlmIEBpbnB1dC5wZWVrKCAxICkuYmV0d2Vlbj8oIDB4OSwgMHhhICkgfHwgQGlucHV0LnBlZWsoIDEgKS5iZXR3ZWVuPyggMHhjLCAweGQgKSB8fCBAaW5wdXQucGVlayggMSApID09IDB4MjAKKyAgICAgICAgICAgIEBpbnB1dC5jb25zdW1lCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbXNlID0gTWlzbWF0Y2hlZFNldCggbmlsICkKKyAgICAgICAgICAgIHJlY292ZXIgbXNlCisgICAgICAgICAgICByYWlzZSBtc2UKKyAgICAgICAgICBlbmQKKworCisKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1hdGNoX2NvdW50XzExID4gMCBhbmQgYnJlYWsKKyAgICAgICAgICBlZWUgPSBFYXJseUV4aXQoIDExICkKKworCisgICAgICAgICAgcmFpc2UgZWVlCisgICAgICAgIGVuZAorICAgICAgICBtYXRjaF9jb3VudF8xMSArPSAxCisgICAgICBlbmQKKworICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgc2tpcCAKKyAgICAgICMgPC0tIGFjdGlvbgorCisgICAgICAKKyAgICAgIEBzdGF0ZS50eXBlID0gdHlwZQorICAgICAgQHN0YXRlLmNoYW5uZWwgPSBjaGFubmVsCisKKyAgICBlbnN1cmUKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9vdXQoIF9fbWV0aG9kX18sIDE2ICkKKworICAgIGVuZAorCisgICAgIyBtYWluIHJ1bGUgdXNlZCB0byBzdHVkeSB0aGUgaW5wdXQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sCisgICAgIyBhbmQgY2hvb3NlIHRoZSBwcm9wZXIgbGV4ZXIgcnVsZSB0byBjYWxsIGluIG9yZGVyIHRvCisgICAgIyBmZXRjaCB0aGUgbmV4dCB0b2tlbgorICAgICMgCisgICAgIyB1c3VhbGx5LCB5b3UgZG9uJ3QgbWFrZSBkaXJlY3QgY2FsbHMgdG8gdGhpcyBtZXRob2QsCisgICAgIyBidXQgaW5zdGVhZCB1c2UgdGhlIG5leHRfdG9rZW4gbWV0aG9kLCB3aGljaCB3aWxsCisgICAgIyBidWlsZCBhbmQgZW1pdCB0aGUgYWN0dWFsIG5leHQgdG9rZW4KKyAgICBkZWYgdG9rZW4hCisgICAgICAjIGF0IGxpbmUgMTo4OiAoIFRfXzEwIHwgVF9fMTEgfCBUX18xMiB8IFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgQ09OU1RBTlQgfCBJRCB8IFRFTVBMQVRFIHwgU1RSSU5HIHwgQ09NTUVOVCB8IFdTICkKKyAgICAgIGFsdF8xMiA9IDE2CisgICAgICBhbHRfMTIgPSBAZGZhMTIucHJlZGljdCggQGlucHV0ICkKKyAgICAgIGNhc2UgYWx0XzEyCisgICAgICB3aGVuIDEKKyAgICAgICAgIyBhdCBsaW5lIDE6MTA6IFRfXzEwCisgICAgICAgIHRfXzEwIQorCisgICAgICB3aGVuIDIKKyAgICAgICAgIyBhdCBsaW5lIDE6MTY6IFRfXzExCisgICAgICAgIHRfXzExIQorCisgICAgICB3aGVuIDMKKyAgICAgICAgIyBhdCBsaW5lIDE6MjI6IFRfXzEyCisgICAgICAgIHRfXzEyIQorCisgICAgICB3aGVuIDQKKyAgICAgICAgIyBhdCBsaW5lIDE6Mjg6IFRfXzEzCisgICAgICAgIHRfXzEzIQorCisgICAgICB3aGVuIDUKKyAgICAgICAgIyBhdCBsaW5lIDE6MzQ6IFRfXzE0CisgICAgICAgIHRfXzE0IQorCisgICAgICB3aGVuIDYKKyAgICAgICAgIyBhdCBsaW5lIDE6NDA6IFRfXzE1CisgICAgICAgIHRfXzE1IQorCisgICAgICB3aGVuIDcKKyAgICAgICAgIyBhdCBsaW5lIDE6NDY6IFRfXzE2CisgICAgICAgIHRfXzE2IQorCisgICAgICB3aGVuIDgKKyAgICAgICAgIyBhdCBsaW5lIDE6NTI6IFRfXzE3CisgICAgICAgIHRfXzE3IQorCisgICAgICB3aGVuIDkKKyAgICAgICAgIyBhdCBsaW5lIDE6NTg6IFRfXzE4CisgICAgICAgIHRfXzE4IQorCisgICAgICB3aGVuIDEwCisgICAgICAgICMgYXQgbGluZSAxOjY0OiBUX18xOQorICAgICAgICB0X18xOSEKKworICAgICAgd2hlbiAxMQorICAgICAgICAjIGF0IGxpbmUgMTo3MDogQ09OU1RBTlQKKyAgICAgICAgY29uc3RhbnQhCisKKyAgICAgIHdoZW4gMTIKKyAgICAgICAgIyBhdCBsaW5lIDE6Nzk6IElECisgICAgICAgIGlkIQorCisgICAgICB3aGVuIDEzCisgICAgICAgICMgYXQgbGluZSAxOjgyOiBURU1QTEFURQorICAgICAgICB0ZW1wbGF0ZSEKKworICAgICAgd2hlbiAxNAorICAgICAgICAjIGF0IGxpbmUgMTo5MTogU1RSSU5HCisgICAgICAgIHN0cmluZyEKKworICAgICAgd2hlbiAxNQorICAgICAgICAjIGF0IGxpbmUgMTo5ODogQ09NTUVOVAorICAgICAgICBjb21tZW50IQorCisgICAgICB3aGVuIDE2CisgICAgICAgICMgYXQgbGluZSAxOjEwNjogV1MKKyAgICAgICAgd3MhCisKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgCisgICAgIyAtIC0gLSAtIC0gLSAtIC0gLSAtIERGQSBkZWZpbml0aW9ucyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgICBjbGFzcyBERkExMiA8IEFOVExSMzo6REZBCisgICAgICBFT1QgPSB1bnBhY2soIDEsIC0xLCAxLCAxMSwgMTQsIC0xLCAxLCAxMSwgMSwgMjAsIDEsIDExLCAyLCAtMSwgMSwgCisgICAgICAgICAgICAgICAgICAgIDExLCAxLCAyMywgMSwgLTEgKQorICAgICAgRU9GID0gdW5wYWNrKCAyNCwgLTEgKQorICAgICAgTUlOID0gdW5wYWNrKCAxLCA5LCAxLCAxMTQsIDEsIDU4LCAxMywgLTEsIDEsIDExMSwgMSwgNjEsIDEsIDExNywgCisgICAgICAgICAgICAgICAgICAgIDIsIC0xLCAxLCAxMTIsIDEsIDQ4LCAxLCAtMSApCisgICAgICBNQVggPSB1bnBhY2soIDEsIDEyMiwgMSwgMTE0LCAxLCA1OCwgMTMsIC0xLCAxLCAxMTEsIDEsIDYxLCAxLCAxMTcsIAorICAgICAgICAgICAgICAgICAgICAyLCAtMSwgMSwgMTEyLCAxLCAxMjIsIDEsIC0xICkKKyAgICAgIEFDQ0VQVCA9IHVucGFjayggMywgLTEsIDEsIDMsIDEsIDUsIDEsIDYsIDEsIDcsIDEsIDgsIDEsIDksIDEsIDEwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgMSwgMTEsIDEsIDEyLCAxLCAxMywgMSwgMTQsIDEsIDE1LCAxLCAxNiwgMywgLTEsIAorICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCAxLCAyLCAyLCAtMSwgMSwgMSApCisgICAgICBTUEVDSUFMID0gdW5wYWNrKCAyNCwgLTEgKQorICAgICAgVFJBTlNJVElPTiA9IFsgCisgICAgICAgIHVucGFjayggMiwgMTUsIDEsIC0xLCAyLCAxNSwgMTgsIC0xLCAxLCAxNSwgMSwgLTEsIDEsIDEzLCAxLCAxNCwgCisgICAgICAgICAgICAgICAgMiwgLTEsIDEsIDgsIDEsIDEzLCAxLCA0LCAxLCA1LCAxLCA3LCAxLCAtMSwgMSwgNiwgMiwgLTEsIAorICAgICAgICAgICAgICAgIDEsIDE0LCAxMCwgLTEsIDEsIDIsIDEsIDMsIDEsIDEyLCAxLCA5LCAzLCAtMSwgMjYsIDEwLCA0LCAKKyAgICAgICAgICAgICAgICAtMSwgMSwgMTEsIDEsIC0xLCA2LCAxMSwgMSwgMSwgMTksIDExICksCisgICAgICAgIHVucGFjayggMSwgMTYgKSwKKyAgICAgICAgdW5wYWNrKCAxLCAxNyApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soIDEsIDE4ICksCisgICAgICAgIHVucGFjayggMSwgMTkgKSwKKyAgICAgICAgdW5wYWNrKCAxLCAyMSApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soICApLAorICAgICAgICB1bnBhY2soIDEsIDIyICksCisgICAgICAgIHVucGFjayggMTAsIDExLCA3LCAtMSwgMjYsIDExLCA0LCAtMSwgMSwgMTEsIDEsIC0xLCAyNiwgMTEgKSwKKyAgICAgICAgdW5wYWNrKCAgKQorICAgICAgXS5mcmVlemUKKyAgICAgIAorICAgICAgKCAwIC4uLiBNSU4ubGVuZ3RoICkuemlwKCBNSU4sIE1BWCApIGRvIHwgaSwgYSwgeiB8CisgICAgICAgIGlmIGEgPiAwIGFuZCB6IDwgMAorICAgICAgICAgIE1BWFsgaSBdICU9IDB4MTAwMDAKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIAorICAgICAgQGRlY2lzaW9uID0gMTIKKyAgICAgIAorCisgICAgICBkZWYgZGVzY3JpcHRpb24KKyAgICAgICAgPDwtJ19fZGZhX2Rlc2NyaXB0aW9uX18nLnN0cmlwIQorICAgICAgICAgIDE6MTogVG9rZW5zIDogKCBUX18xMCB8IFRfXzExIHwgVF9fMTIgfCBUX18xMyB8IFRfXzE0IHwgVF9fMTUgfCBUX18xNiB8IFRfXzE3IHwgVF9fMTggfCBUX18xOSB8IENPTlNUQU5UIHwgSUQgfCBURU1QTEFURSB8IFNUUklORyB8IENPTU1FTlQgfCBXUyApOworICAgICAgICBfX2RmYV9kZXNjcmlwdGlvbl9fCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIAorICAgIHByaXZhdGUKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZV9kZmFzCisgICAgICBzdXBlciByZXNjdWUgbmlsCisgICAgICBAZGZhMTIgPSBERkExMi5uZXcoIHNlbGYsIDEyICkKKworICAgIGVuZAorICBlbmQgIyBjbGFzcyBMZXhlciA8IEFOVExSMzo6TGV4ZXIKKworICBhdF9leGl0IHsgTGV4ZXIubWFpbiggQVJHViApIH0gaWYgX19GSUxFX18gPT0gJDAKK2VuZAorIyAtIC0gLSAtIC0gLSBiZWdpbiBhY3Rpb24gQGxleGVyOjpmb290ZXIgLSAtIC0gLSAtIC0KKyMgR3JvdXBGaWxlLmcKKworCitlbmQgIyBtb2R1bGUgVGVtcGxhdGUKK2VuZCAjIG1vZHVsZSBBTlRMUjMKKworIyAtIC0gLSAtIC0gLSBlbmQgYWN0aW9uIEBsZXhlcjo6Zm9vdGVyIC0gLSAtIC0gLSAtIC0KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9ncm91cC1maWxlLXBhcnNlci5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9ncm91cC1maWxlLXBhcnNlci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdkMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RlbXBsYXRlL2dyb3VwLWZpbGUtcGFyc2VyLnJiCkBAIC0wLDAgKzEsNjY2IEBACisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIEdyb3VwRmlsZS5nCisjIAorIyBHZW5lcmF0ZWQgdXNpbmcgQU5UTFIgdmVyc2lvbjogMy4yLjEtU05BUFNIT1QgSnVuIDE4LCAyMDEwIDA1OjM4OjExCisjIFJ1YnkgcnVudGltZSBsaWJyYXJ5IHZlcnNpb246IDEuNy41CisjIElucHV0IGdyYW1tYXIgZmlsZTogR3JvdXBGaWxlLmcKKyMgR2VuZXJhdGVkIGF0OiAyMDEwLTA3LTAzIDIzOjE1OjM1CisjIAorCisjIH5+fj4gc3RhcnQgbG9hZCBwYXRoIHNldHVwCit0aGlzX2RpcmVjdG9yeSA9IEZpbGUuZXhwYW5kX3BhdGgoIEZpbGUuZGlybmFtZSggX19GSUxFX18gKSApCiskTE9BRF9QQVRILnVuc2hpZnQoIHRoaXNfZGlyZWN0b3J5ICkgdW5sZXNzICRMT0FEX1BBVEguaW5jbHVkZT8oIHRoaXNfZGlyZWN0b3J5ICkKKworYW50bHJfbG9hZF9mYWlsZWQgPSBwcm9jIGRvCisgIGxvYWRfcGF0aCA9ICRMT0FEX1BBVEgubWFwIHsgfGRpcnwgJyAgLSAnIDw8IGRpciB9LmpvaW4oICQvICkKKyAgcmFpc2UgTG9hZEVycm9yLCA8PC1FTkQuc3RyaXAhCisgIAorRmFpbGVkIHRvIGxvYWQgdGhlIEFOVExSMyBydW50aW1lIGxpYnJhcnkgKHZlcnNpb24gMS43LjUpOgorCitFbnN1cmUgdGhlIGxpYnJhcnkgaGFzIGJlZW4gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBpcyBhdmFpbGFibGUKK29uIHRoZSBsb2FkIHBhdGguIElmIHJ1YnlnZW1zIGlzIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSwgdGhpcyBjYW4KK2JlIGRvbmUgd2l0aCB0aGUgY29tbWFuZDoKKyAgCisgIGdlbSBpbnN0YWxsIGFudGxyMworCitDdXJyZW50IGxvYWQgcGF0aDoKKyN7IGxvYWRfcGF0aCB9CisKKyAgRU5ECitlbmQKKworZGVmaW5lZD8oIEFOVExSMyApIG9yIGJlZ2luCisgIAorICAjIDE6IHRyeSB0byBsb2FkIHRoZSBydWJ5IGFudGxyMyBydW50aW1lIGxpYnJhcnkgZnJvbSB0aGUgc3lzdGVtIHBhdGgKKyAgcmVxdWlyZSAnYW50bHIzJworICAKK3Jlc2N1ZSBMb2FkRXJyb3IKKyAgCisgICMgMjogdHJ5IHRvIGxvYWQgcnVieWdlbXMgaWYgaXQgaXNuJ3QgYWxyZWFkeSBsb2FkZWQKKyAgZGVmaW5lZD8oIEdlbSApIG9yIGJlZ2luCisgICAgcmVxdWlyZSAncnVieWdlbXMnCisgIHJlc2N1ZSBMb2FkRXJyb3IKKyAgICBhbnRscl9sb2FkX2ZhaWxlZC5jYWxsCisgIGVuZAorICAKKyAgIyAzOiB0cnkgdG8gYWN0aXZhdGUgdGhlIGFudGxyMyBnZW0KKyAgYmVnaW4KKyAgICBHZW0uYWN0aXZhdGUoICdhbnRscjMnLCAnfj4gMS43LjUnICkKKyAgcmVzY3VlIEdlbTo6TG9hZEVycm9yCisgICAgYW50bHJfbG9hZF9mYWlsZWQuY2FsbAorICBlbmQKKyAgCisgIHJlcXVpcmUgJ2FudGxyMycKKyAgCitlbmQKKyMgPH5+fiBlbmQgbG9hZCBwYXRoIHNldHVwCisKKyMgLSAtIC0gLSAtIC0gYmVnaW4gYWN0aW9uIEBwYXJzZXI6OmhlYWRlciAtIC0gLSAtIC0gLQorIyBHcm91cEZpbGUuZworCisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBUZW1wbGF0ZQorCisjIC0gLSAtIC0gLSAtIGVuZCBhY3Rpb24gQHBhcnNlcjo6aGVhZGVyIC0gLSAtIC0gLSAtIC0KKworCittb2R1bGUgR3JvdXBGaWxlCisgICMgVG9rZW5EYXRhIGRlZmluZXMgYWxsIG9mIHRoZSB0b2tlbiB0eXBlIGludGVnZXIgdmFsdWVzCisgICMgYXMgY29uc3RhbnRzLCB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGluIGFsbCAKKyAgIyBBTlRMUi1nZW5lcmF0ZWQgcmVjb2duaXplcnMuCisgIGNvbnN0X2RlZmluZWQ/KCA6VG9rZW5EYXRhICkgb3IgVG9rZW5EYXRhID0gQU5UTFIzOjpUb2tlblNjaGVtZS5uZXcKKworICBtb2R1bGUgVG9rZW5EYXRhCisKKyAgICAjIGRlZmluZSB0aGUgdG9rZW4gY29uc3RhbnRzCisgICAgZGVmaW5lX3Rva2VucyggOklEID0+IDUsIDpFT0YgPT4gLTEsIDpUX18xOSA9PiAxOSwgOlRfXzE2ID0+IDE2LCA6V1MgPT4gOSwgCisgICAgICAgICAgICAgICAgICAgOlRfXzE1ID0+IDE1LCA6VF9fMTggPT4gMTgsIDpUX18xNyA9PiAxNywgOlRfXzEyID0+IDEyLCAKKyAgICAgICAgICAgICAgICAgICA6VEVNUExBVEUgPT4gNiwgOlRfXzExID0+IDExLCA6VF9fMTQgPT4gMTQsIDpUX18xMyA9PiAxMywgCisgICAgICAgICAgICAgICAgICAgOlRfXzEwID0+IDEwLCA6Q09OU1RBTlQgPT4gNCwgOkNPTU1FTlQgPT4gOCwgOlNUUklORyA9PiA3ICkKKworICAgICMgcmVnaXN0ZXIgdGhlIHByb3BlciBodW1hbi1yZWFkYWJsZSBuYW1lIG9yIGxpdGVyYWwgdmFsdWUKKyAgICAjIGZvciBlYWNoIHRva2VuIHR5cGUKKyAgICAjCisgICAgIyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGFub255bW91cyB0b2tlbnMsIHdoaWNoIGFyZQorICAgICMgY3JlYXRlZCBmcm9tIGxpdGVyYWwgdmFsdWVzIGluIHRoZSBncmFtbWFyLCBkbyBub3QKKyAgICAjIGhhdmUgZGVzY3JpcHRpdmUgbmFtZXMKKyAgICByZWdpc3Rlcl9uYW1lcyggIkNPTlNUQU5UIiwgIklEIiwgIlRFTVBMQVRFIiwgIlNUUklORyIsICJDT01NRU5UIiwgIldTIiwgCisgICAgICAgICAgICAgICAgICAgICInZ3JvdXAnIiwgIic6OiciLCAiJzsnIiwgIic6Oj0nIiwgIicoJyIsICInKSciLCAiJywnIiwgCisgICAgICAgICAgICAgICAgICAgICInKiciLCAiJyYnIiwgIic9JyIgKQorICAgIAorICBlbmQKKworCisgIGNsYXNzIFBhcnNlciA8IEFOVExSMzo6UGFyc2VyCisgICAgQGdyYW1tYXJfaG9tZSA9IEdyb3VwRmlsZQorCisgICAgUlVMRV9NRVRIT0RTID0gWyA6Z3JvdXBfc3BlYywgOmdyb3VwX25hbWUsIDptZW1iZXIsIDpwYXJhbWV0ZXJfZGVjbGFyYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgOnBhcmFtZXRlcnMsIDpwYXJhbWV0ZXIgXS5mcmVlemUKKworCisgICAgaW5jbHVkZSBUb2tlbkRhdGEKKworICAgIGJlZ2luCisgICAgICBnZW5lcmF0ZWRfdXNpbmcoICJHcm91cEZpbGUuZyIsICIzLjIuMS1TTkFQU0hPVCBKdW4gMTgsIDIwMTAgMDU6Mzg6MTEiLCAiMS43LjUiICkKKyAgICByZXNjdWUgTm9NZXRob2RFcnJvciA9PiBlcnJvcgorICAgICAgIyBpZ25vcmUKKyAgICBlbmQKKworICAgIGRlZiBpbml0aWFsaXplKCBpbnB1dCwgb3B0aW9ucyA9IHt9ICkKKyAgICAgIHN1cGVyKCBpbnB1dCwgb3B0aW9ucyApCisKKworICAgIGVuZAorCisgICAgICBkZWYgZmV0Y2hfZ3JvdXAoIG5hbWVzcGFjZSwgbmFtZSApCisgICAgICAgIGlmIG5hbWVzcGFjZS5jb25zdF9kZWZpbmVkPyggbmFtZSApCisgICAgICAgICAgZ3JvdXAgPSBuYW1lc3BhY2UuY29uc3RfZ2V0KCBuYW1lICkKKyAgICAgICAgICB1bmxlc3MgZ3JvdXAuaXNfYT8oIEFOVExSMzo6VGVtcGxhdGU6Okdyb3VwICkKKyAgICAgICAgICAKKyAgICAgICAgICBlbmQKKyAgICAgICAgZWxzZQorICAgICAgICAgIGdyb3VwID0gQU5UTFIzOjpUZW1wbGF0ZTo6R3JvdXAubmV3CisgICAgICAgICAgbmFtZXNwYWNlLmNvbnN0X3NldCggbmFtZSwgZ3JvdXAgKQorICAgICAgICBlbmQKKyAgICAgICAgcmV0dXJuKCBncm91cCApCisgICAgICBlbmQKKyAgICAgIAorICAgICAgZGVmIHVuZXNjYXBlKCB0ZXh0ICkKKyAgICAgICAgdGV4dC5nc3ViKCAvXFwoPzooW2FiZWZucnN0dl0pfChbMC03XXszfSl8eChbMC05YS1mQS1GXXsyfSl8KC4pKS8gKSBkbworICAgICAgICAgIGlmICQxCisgICAgICAgICAgICBjYXNlICQxWyAwIF0KKyAgICAgICAgICAgIHdoZW4gP2EgdGhlbiAiXGEiCisgICAgICAgICAgICB3aGVuID9iIHRoZW4gIlxiIgorICAgICAgICAgICAgd2hlbiA/ZSB0aGVuICJcZSIKKyAgICAgICAgICAgIHdoZW4gP2YgdGhlbiAiXGYiCisgICAgICAgICAgICB3aGVuID9uIHRoZW4gIlxuIgorICAgICAgICAgICAgd2hlbiA/ciB0aGVuICJcciIKKyAgICAgICAgICAgIHdoZW4gP3MgdGhlbiAiXHMiCisgICAgICAgICAgICB3aGVuID90IHRoZW4gIlx0IgorICAgICAgICAgICAgd2hlbiA/diB0aGVuICJcdiIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVsc2lmICQyIHRoZW4gJDIudG9faSggOCApLmNocgorICAgICAgICAgIGVsc2lmICQzIHRoZW4gJDMudG9faSggMTYgKS5jaHIKKyAgICAgICAgICBlbHNpZiAkNCB0aGVuICQ0CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICAKKyAgICAgIGRlZiBleHRyYWN0X3RlbXBsYXRlKCB0b2tlbiApCisgICAgICAgIGNhc2UgdG9rZW4udHlwZQorICAgICAgICB3aGVuIFRFTVBMQVRFCisgICAgICAgICAgdG9rZW4udGV4dC5nc3ViKCAvXEE8PDxccj9cbj98XHI/XG4/Pj4+XFovLCAnJyApCisgICAgICAgIHdoZW4gU1RSSU5HCisgICAgICAgICAgdW5lc2NhcGUoIHRva2VuLnRleHRbIDEuLi4tMSBdICkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIAorICAgICAgZGVmIGdyb3VwKCBuYW1lc3BhY2UgPSA6Ok9iamVjdCApCisgICAgICAgIGdyb3VwX3NwZWMoIG5hbWVzcGFjZSApCisgICAgICBlbmQKKworICAgICMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gUnVsZXMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCisgICAgIyAKKyAgICAjIHBhcnNlciBydWxlIGdyb3VwX3NwZWMKKyAgICAjIAorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgICMgNzk6MTogZ3JvdXBfc3BlY1sgbmFtZXNwYWNlIF0gcmV0dXJucyBbIGdyb3VwIF0gOiAoIGdyb3VwX25hbWVbICRuYW1lc3BhY2UgXSB8ICkgKCBtZW1iZXJbICRncm91cCBdICkqIDsKKyAgICAjIAorICAgIGRlZiBncm91cF9zcGVjKCBuYW1lc3BhY2UgKQorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX2luKCBfX21ldGhvZF9fLCAxICkKKyAgICAgIGdyb3VwID0gbmlsCisgICAgICBncm91cF9uYW1lMSA9IG5pbAorCisgICAgICBiZWdpbgorICAgICAgICAjIGF0IGxpbmUgODA6NTogKCBncm91cF9uYW1lWyAkbmFtZXNwYWNlIF0gfCApICggbWVtYmVyWyAkZ3JvdXAgXSApKgorICAgICAgICAjIGF0IGxpbmUgODA6NTogKCBncm91cF9uYW1lWyAkbmFtZXNwYWNlIF0gfCApCisgICAgICAgIGFsdF8xID0gMgorICAgICAgICBsb29rXzFfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICBpZiAoIGxvb2tfMV8wID09IFRfXzEwICkKKyAgICAgICAgICBhbHRfMSA9IDEKKyAgICAgICAgZWxzaWYgKCBsb29rXzFfMCA9PSBFT0YgfHwgbG9va18xXzAgPT0gSUQgKQorICAgICAgICAgIGFsdF8xID0gMgorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgTm9WaWFibGVBbHRlcm5hdGl2ZSggIiIsIDEsIDAgKQorICAgICAgICBlbmQKKyAgICAgICAgY2FzZSBhbHRfMQorICAgICAgICB3aGVuIDEKKyAgICAgICAgICAjIGF0IGxpbmUgODA6NzogZ3JvdXBfbmFtZVsgJG5hbWVzcGFjZSBdCisgICAgICAgICAgQHN0YXRlLmZvbGxvd2luZy5wdXNoKCBUT0tFTlNfRk9MTE9XSU5HX2dyb3VwX25hbWVfSU5fZ3JvdXBfc3BlY184NSApCisgICAgICAgICAgZ3JvdXBfbmFtZTEgPSBncm91cF9uYW1lKCBuYW1lc3BhY2UgKQorICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucG9wCisgICAgICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgICAgIGdyb3VwID0gZ3JvdXBfbmFtZTEgCisgICAgICAgICAgIyA8LS0gYWN0aW9uCisKKyAgICAgICAgd2hlbiAyCisgICAgICAgICAgIyBhdCBsaW5lIDgxOjc6IAorICAgICAgICAgICMgLS0+IGFjdGlvbgorICAgICAgICAgICBncm91cCA9IEFOVExSMzo6VGVtcGxhdGU6Okdyb3VwLm5ldyAKKyAgICAgICAgICAjIDwtLSBhY3Rpb24KKworICAgICAgICBlbmQKKyAgICAgICAgIyBhdCBsaW5lIDgzOjU6ICggbWVtYmVyWyAkZ3JvdXAgXSApKgorICAgICAgICB3aGlsZSB0cnVlICMgZGVjaXNpb24gMgorICAgICAgICAgIGFsdF8yID0gMgorICAgICAgICAgIGxvb2tfMl8wID0gQGlucHV0LnBlZWsoIDEgKQorCisgICAgICAgICAgaWYgKCBsb29rXzJfMCA9PSBJRCApCisgICAgICAgICAgICBhbHRfMiA9IDEKKworICAgICAgICAgIGVuZAorICAgICAgICAgIGNhc2UgYWx0XzIKKyAgICAgICAgICB3aGVuIDEKKyAgICAgICAgICAgICMgYXQgbGluZSA4Mzo1OiBtZW1iZXJbICRncm91cCBdCisgICAgICAgICAgICBAc3RhdGUuZm9sbG93aW5nLnB1c2goIFRPS0VOU19GT0xMT1dJTkdfbWVtYmVyX0lOX2dyb3VwX3NwZWNfMTA4ICkKKyAgICAgICAgICAgIG1lbWJlciggZ3JvdXAgKQorICAgICAgICAgICAgQHN0YXRlLmZvbGxvd2luZy5wb3AKKworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrICMgb3V0IG9mIGxvb3AgZm9yIGRlY2lzaW9uIDIKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kICMgbG9vcCBmb3IgZGVjaXNpb24gMgorCisgICAgICByZXNjdWUgQU5UTFIzOjpFcnJvcjo6UmVjb2duaXRpb25FcnJvciA9PiByZQorICAgICAgICByZXBvcnRfZXJyb3IoIHJlICkKKyAgICAgICAgcmVjb3ZlciggcmUgKQorCisgICAgICBlbnN1cmUKKyAgICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCAxICkKKworICAgICAgZW5kCisgICAgICAKKyAgICAgIHJldHVybiBncm91cAorICAgIGVuZAorCisKKyAgICAjIAorICAgICMgcGFyc2VyIHJ1bGUgZ3JvdXBfbmFtZQorICAgICMgCisgICAgIyAoaW4gR3JvdXBGaWxlLmcpCisgICAgIyA4NjoxOiBncm91cF9uYW1lWyBuYW1lc3BhY2UgXSByZXR1cm5zIFsgZ3JvdXAgXSA6ICdncm91cCcgKG1vZD0gQ09OU1RBTlQgJzo6JyApKiBuYW1lPSBDT05TVEFOVCAoICc7JyApPyA7CisgICAgIyAKKyAgICBkZWYgZ3JvdXBfbmFtZSggbmFtZXNwYWNlICkKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgMiApCisgICAgICBncm91cCA9IG5pbAorICAgICAgbW9kID0gbmlsCisgICAgICBuYW1lID0gbmlsCisKKyAgICAgIGJlZ2luCisgICAgICAgICMgYXQgbGluZSA4Nzo1OiAnZ3JvdXAnIChtb2Q9IENPTlNUQU5UICc6OicgKSogbmFtZT0gQ09OU1RBTlQgKCAnOycgKT8KKyAgICAgICAgbWF0Y2goIFRfXzEwLCBUT0tFTlNfRk9MTE9XSU5HX1RfXzEwX0lOX2dyb3VwX25hbWVfMTI4ICkKKyAgICAgICAgIyBhdCBsaW5lIDg4OjU6IChtb2Q9IENPTlNUQU5UICc6OicgKSoKKyAgICAgICAgd2hpbGUgdHJ1ZSAjIGRlY2lzaW9uIDMKKyAgICAgICAgICBhbHRfMyA9IDIKKyAgICAgICAgICBsb29rXzNfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICAgIGlmICggbG9va18zXzAgPT0gQ09OU1RBTlQgKQorICAgICAgICAgICAgbG9va18zXzEgPSBAaW5wdXQucGVlayggMiApCisKKyAgICAgICAgICAgIGlmICggbG9va18zXzEgPT0gVF9fMTEgKQorICAgICAgICAgICAgICBhbHRfMyA9IDEKKworICAgICAgICAgICAgZW5kCisKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBjYXNlIGFsdF8zCisgICAgICAgICAgd2hlbiAxCisgICAgICAgICAgICAjIGF0IGxpbmUgODk6NzogbW9kPSBDT05TVEFOVCAnOjonCisgICAgICAgICAgICBtb2QgPSBtYXRjaCggQ09OU1RBTlQsIFRPS0VOU19GT0xMT1dJTkdfQ09OU1RBTlRfSU5fZ3JvdXBfbmFtZV8xNDQgKQorICAgICAgICAgICAgbWF0Y2goIFRfXzExLCBUT0tFTlNfRk9MTE9XSU5HX1RfXzExX0lOX2dyb3VwX25hbWVfMTQ2ICkKKyAgICAgICAgICAgICMgLS0+IGFjdGlvbgorICAgICAgICAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5jb25zdF9nZXQoIG1vZC50ZXh0ICkgCisgICAgICAgICAgICAjIDwtLSBhY3Rpb24KKworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrICMgb3V0IG9mIGxvb3AgZm9yIGRlY2lzaW9uIDMKKyAgICAgICAgICBlbmQKKyAgICAgICAgZW5kICMgbG9vcCBmb3IgZGVjaXNpb24gMworICAgICAgICBuYW1lID0gbWF0Y2goIENPTlNUQU5ULCBUT0tFTlNfRk9MTE9XSU5HX0NPTlNUQU5UX0lOX2dyb3VwX25hbWVfMTY5ICkKKyAgICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgICBncm91cCA9IGZldGNoX2dyb3VwKCBuYW1lc3BhY2UsIG5hbWUudGV4dCApIAorICAgICAgICAjIDwtLSBhY3Rpb24KKyAgICAgICAgIyBhdCBsaW5lIDkzOjU6ICggJzsnICk/CisgICAgICAgIGFsdF80ID0gMgorICAgICAgICBsb29rXzRfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICBpZiAoIGxvb2tfNF8wID09IFRfXzEyICkKKyAgICAgICAgICBhbHRfNCA9IDEKKyAgICAgICAgZW5kCisgICAgICAgIGNhc2UgYWx0XzQKKyAgICAgICAgd2hlbiAxCisgICAgICAgICAgIyBhdCBsaW5lIDkzOjU6ICc7JworICAgICAgICAgIG1hdGNoKCBUX18xMiwgVE9LRU5TX0ZPTExPV0lOR19UX18xMl9JTl9ncm91cF9uYW1lXzE3NyApCisKKyAgICAgICAgZW5kCisKKyAgICAgIHJlc2N1ZSBBTlRMUjM6OkVycm9yOjpSZWNvZ25pdGlvbkVycm9yID0+IHJlCisgICAgICAgIHJlcG9ydF9lcnJvciggcmUgKQorICAgICAgICByZWNvdmVyKCByZSApCisKKyAgICAgIGVuc3VyZQorICAgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICAgIyB0cmFjZV9vdXQoIF9fbWV0aG9kX18sIDIgKQorCisgICAgICBlbmQKKyAgICAgIAorICAgICAgcmV0dXJuIGdyb3VwCisgICAgZW5kCisKKworICAgICMgCisgICAgIyBwYXJzZXIgcnVsZSBtZW1iZXIKKyAgICAjIAorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgICMgOTY6MTogbWVtYmVyWyBncm91cCBdIDogbmFtZT0gSUQgKCBwYXJhbWV0ZXJfZGVjbGFyYXRpb24gKT8gJzo6PScgKGFsaWFzZWQ9IElEIHwgVEVNUExBVEUgfCBTVFJJTkcgKSA7CisgICAgIyAKKyAgICBkZWYgbWVtYmVyKCBncm91cCApCisgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICMgdHJhY2VfaW4oIF9fbWV0aG9kX18sIDMgKQorICAgICAgbmFtZSA9IG5pbAorICAgICAgYWxpYXNlZCA9IG5pbAorICAgICAgX19URU1QTEFURTNfXyA9IG5pbAorICAgICAgX19TVFJJTkc0X18gPSBuaWwKKyAgICAgIHBhcmFtZXRlcl9kZWNsYXJhdGlvbjIgPSBuaWwKKyAgICAgICMgLSAtIC0gLSBAaW5pdCBhY3Rpb24gLSAtIC0gLQorICAgICAgIHBhcmFtcyA9IG5pbCAKKworICAgICAgYmVnaW4KKyAgICAgICAgIyBhdCBsaW5lIDk4OjU6IG5hbWU9IElEICggcGFyYW1ldGVyX2RlY2xhcmF0aW9uICk/ICc6Oj0nIChhbGlhc2VkPSBJRCB8IFRFTVBMQVRFIHwgU1RSSU5HICkKKyAgICAgICAgbmFtZSA9IG1hdGNoKCBJRCwgVE9LRU5TX0ZPTExPV0lOR19JRF9JTl9tZW1iZXJfMTk5ICkKKyAgICAgICAgIyBhdCBsaW5lIDk4OjEzOiAoIHBhcmFtZXRlcl9kZWNsYXJhdGlvbiApPworICAgICAgICBhbHRfNSA9IDIKKyAgICAgICAgbG9va181XzAgPSBAaW5wdXQucGVlayggMSApCisKKyAgICAgICAgaWYgKCBsb29rXzVfMCA9PSBJRCB8fCBsb29rXzVfMCA9PSBUX18xNCB8fCBsb29rXzVfMC5iZXR3ZWVuPyggVF9fMTcsIFRfXzE4ICkgKQorICAgICAgICAgIGFsdF81ID0gMQorICAgICAgICBlbmQKKyAgICAgICAgY2FzZSBhbHRfNQorICAgICAgICB3aGVuIDEKKyAgICAgICAgICAjIGF0IGxpbmUgOTg6MTU6IHBhcmFtZXRlcl9kZWNsYXJhdGlvbgorICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucHVzaCggVE9LRU5TX0ZPTExPV0lOR19wYXJhbWV0ZXJfZGVjbGFyYXRpb25fSU5fbWVtYmVyXzIwMyApCisgICAgICAgICAgcGFyYW1ldGVyX2RlY2xhcmF0aW9uMiA9IHBhcmFtZXRlcl9kZWNsYXJhdGlvbgorICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucG9wCisgICAgICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtZXRlcl9kZWNsYXJhdGlvbjIgCisgICAgICAgICAgIyA8LS0gYWN0aW9uCisKKyAgICAgICAgZW5kCisgICAgICAgIG1hdGNoKCBUX18xMywgVE9LRU5TX0ZPTExPV0lOR19UX18xM19JTl9tZW1iZXJfMjEwICkKKyAgICAgICAgIyBhdCBsaW5lIDk5OjU6IChhbGlhc2VkPSBJRCB8IFRFTVBMQVRFIHwgU1RSSU5HICkKKyAgICAgICAgYWx0XzYgPSAzCisgICAgICAgIGNhc2UgbG9va182ID0gQGlucHV0LnBlZWsoIDEgKQorICAgICAgICB3aGVuIElEIHRoZW4gYWx0XzYgPSAxCisgICAgICAgIHdoZW4gVEVNUExBVEUgdGhlbiBhbHRfNiA9IDIKKyAgICAgICAgd2hlbiBTVFJJTkcgdGhlbiBhbHRfNiA9IDMKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIE5vVmlhYmxlQWx0ZXJuYXRpdmUoICIiLCA2LCAwICkKKyAgICAgICAgZW5kCisgICAgICAgIGNhc2UgYWx0XzYKKyAgICAgICAgd2hlbiAxCisgICAgICAgICAgIyBhdCBsaW5lIDk5Ojc6IGFsaWFzZWQ9IElECisgICAgICAgICAgYWxpYXNlZCA9IG1hdGNoKCBJRCwgVE9LRU5TX0ZPTExPV0lOR19JRF9JTl9tZW1iZXJfMjIwICkKKyAgICAgICAgICAjIC0tPiBhY3Rpb24KKyAgICAgICAgICAgZ3JvdXAuYWxpYXNfdGVtcGxhdGUoIG5hbWUudGV4dCwgYWxpYXNlZC50ZXh0ICkgCisgICAgICAgICAgIyA8LS0gYWN0aW9uCisKKyAgICAgICAgd2hlbiAyCisgICAgICAgICAgIyBhdCBsaW5lIDEwMDo3OiBURU1QTEFURQorICAgICAgICAgIF9fVEVNUExBVEUzX18gPSBtYXRjaCggVEVNUExBVEUsIFRPS0VOU19GT0xMT1dJTkdfVEVNUExBVEVfSU5fbWVtYmVyXzIzMCApCisgICAgICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgICAgIGdyb3VwLmRlZmluZV90ZW1wbGF0ZSggbmFtZS50ZXh0LCBleHRyYWN0X3RlbXBsYXRlKCBfX1RFTVBMQVRFM19fICksIHBhcmFtcyApIAorICAgICAgICAgICMgPC0tIGFjdGlvbgorCisgICAgICAgIHdoZW4gMworICAgICAgICAgICMgYXQgbGluZSAxMDE6NzogU1RSSU5HCisgICAgICAgICAgX19TVFJJTkc0X18gPSBtYXRjaCggU1RSSU5HLCBUT0tFTlNfRk9MTE9XSU5HX1NUUklOR19JTl9tZW1iZXJfMjQyICkKKyAgICAgICAgICAjIC0tPiBhY3Rpb24KKyAgICAgICAgICAgZ3JvdXAuZGVmaW5lX3RlbXBsYXRlKCBuYW1lLnRleHQsIGV4dHJhY3RfdGVtcGxhdGUoIF9fU1RSSU5HNF9fICksIHBhcmFtcyApIAorICAgICAgICAgICMgPC0tIGFjdGlvbgorCisgICAgICAgIGVuZAorCisgICAgICByZXNjdWUgQU5UTFIzOjpFcnJvcjo6UmVjb2duaXRpb25FcnJvciA9PiByZQorICAgICAgICByZXBvcnRfZXJyb3IoIHJlICkKKyAgICAgICAgcmVjb3ZlciggcmUgKQorCisgICAgICBlbnN1cmUKKyAgICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCAzICkKKworICAgICAgZW5kCisgICAgICAKKyAgICAgIHJldHVybiAKKyAgICBlbmQKKworCisgICAgIyAKKyAgICAjIHBhcnNlciBydWxlIHBhcmFtZXRlcl9kZWNsYXJhdGlvbgorICAgICMgCisgICAgIyAoaW4gR3JvdXBGaWxlLmcpCisgICAgIyAxMDU6MTogcGFyYW1ldGVyX2RlY2xhcmF0aW9uIHJldHVybnMgWyBsaXN0IF0gOiAoICcoJyAoIHBhcmFtZXRlcnMgKT8gJyknIHwgcGFyYW1ldGVycyApOworICAgICMgCisgICAgZGVmIHBhcmFtZXRlcl9kZWNsYXJhdGlvbgorICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAjIHRyYWNlX2luKCBfX21ldGhvZF9fLCA0ICkKKyAgICAgIGxpc3QgPSBuaWwKKyAgICAgIHBhcmFtZXRlcnM1ID0gbmlsCisgICAgICBwYXJhbWV0ZXJzNiA9IG5pbAorICAgICAgIyAtIC0gLSAtIEBpbml0IGFjdGlvbiAtIC0gLSAtCisgICAgICAgbGlzdCA9IG5pbCAKKworICAgICAgYmVnaW4KKyAgICAgICAgIyBhdCBsaW5lIDEwNzozOiAoICcoJyAoIHBhcmFtZXRlcnMgKT8gJyknIHwgcGFyYW1ldGVycyApCisgICAgICAgIGFsdF84ID0gMgorICAgICAgICBsb29rXzhfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICBpZiAoIGxvb2tfOF8wID09IFRfXzE0ICkKKyAgICAgICAgICBhbHRfOCA9IDEKKyAgICAgICAgZWxzaWYgKCBsb29rXzhfMCA9PSBJRCB8fCBsb29rXzhfMC5iZXR3ZWVuPyggVF9fMTcsIFRfXzE4ICkgKQorICAgICAgICAgIGFsdF84ID0gMgorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgTm9WaWFibGVBbHRlcm5hdGl2ZSggIiIsIDgsIDAgKQorICAgICAgICBlbmQKKyAgICAgICAgY2FzZSBhbHRfOAorICAgICAgICB3aGVuIDEKKyAgICAgICAgICAjIGF0IGxpbmUgMTA3OjU6ICcoJyAoIHBhcmFtZXRlcnMgKT8gJyknCisgICAgICAgICAgbWF0Y2goIFRfXzE0LCBUT0tFTlNfRk9MTE9XSU5HX1RfXzE0X0lOX3BhcmFtZXRlcl9kZWNsYXJhdGlvbl8yNzYgKQorICAgICAgICAgICMgYXQgbGluZSAxMDc6OTogKCBwYXJhbWV0ZXJzICk/CisgICAgICAgICAgYWx0XzcgPSAyCisgICAgICAgICAgbG9va183XzAgPSBAaW5wdXQucGVlayggMSApCisKKyAgICAgICAgICBpZiAoIGxvb2tfN18wID09IElEIHx8IGxvb2tfN18wLmJldHdlZW4/KCBUX18xNywgVF9fMTggKSApCisgICAgICAgICAgICBhbHRfNyA9IDEKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBjYXNlIGFsdF83CisgICAgICAgICAgd2hlbiAxCisgICAgICAgICAgICAjIGF0IGxpbmUgMTA3OjExOiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBAc3RhdGUuZm9sbG93aW5nLnB1c2goIFRPS0VOU19GT0xMT1dJTkdfcGFyYW1ldGVyc19JTl9wYXJhbWV0ZXJfZGVjbGFyYXRpb25fMjgwICkKKyAgICAgICAgICAgIHBhcmFtZXRlcnM1ID0gcGFyYW1ldGVycworICAgICAgICAgICAgQHN0YXRlLmZvbGxvd2luZy5wb3AKKyAgICAgICAgICAgICMgLS0+IGFjdGlvbgorICAgICAgICAgICAgIGxpc3QgPSBwYXJhbWV0ZXJzNSAKKyAgICAgICAgICAgICMgPC0tIGFjdGlvbgorCisgICAgICAgICAgZW5kCisgICAgICAgICAgbWF0Y2goIFRfXzE1LCBUT0tFTlNfRk9MTE9XSU5HX1RfXzE1X0lOX3BhcmFtZXRlcl9kZWNsYXJhdGlvbl8yODcgKQorCisgICAgICAgIHdoZW4gMgorICAgICAgICAgICMgYXQgbGluZSAxMDg6NTogcGFyYW1ldGVycworICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucHVzaCggVE9LRU5TX0ZPTExPV0lOR19wYXJhbWV0ZXJzX0lOX3BhcmFtZXRlcl9kZWNsYXJhdGlvbl8yOTMgKQorICAgICAgICAgIHBhcmFtZXRlcnM2ID0gcGFyYW1ldGVycworICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucG9wCisgICAgICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgICAgIGxpc3QgPSBwYXJhbWV0ZXJzNiAKKyAgICAgICAgICAjIDwtLSBhY3Rpb24KKworICAgICAgICBlbmQKKyAgICAgIHJlc2N1ZSBBTlRMUjM6OkVycm9yOjpSZWNvZ25pdGlvbkVycm9yID0+IHJlCisgICAgICAgIHJlcG9ydF9lcnJvciggcmUgKQorICAgICAgICByZWNvdmVyKCByZSApCisKKyAgICAgIGVuc3VyZQorICAgICAgICAjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyAgICAgICAgIyB0cmFjZV9vdXQoIF9fbWV0aG9kX18sIDQgKQorCisgICAgICBlbmQKKyAgICAgIAorICAgICAgcmV0dXJuIGxpc3QKKyAgICBlbmQKKworCisgICAgIyAKKyAgICAjIHBhcnNlciBydWxlIHBhcmFtZXRlcnMKKyAgICAjIAorICAgICMgKGluIEdyb3VwRmlsZS5nKQorICAgICMgMTExOjE6IHBhcmFtZXRlcnMgcmV0dXJucyBbIGxpc3QgXSA6IHBhcmFtZXRlclsgJGxpc3QgXSAoICcsJyBwYXJhbWV0ZXJbICRsaXN0IF0gKSogOworICAgICMgCisgICAgZGVmIHBhcmFtZXRlcnMKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgNSApCisgICAgICBsaXN0ID0gbmlsCisgICAgICAjIC0gLSAtIC0gQGluaXQgYWN0aW9uIC0gLSAtIC0KKyAgICAgICBsaXN0ID0gQU5UTFIzOjpUZW1wbGF0ZTo6UGFyYW1ldGVyTGlzdC5uZXcgCisKKyAgICAgIGJlZ2luCisgICAgICAgICMgYXQgbGluZSAxMTM6NTogcGFyYW1ldGVyWyAkbGlzdCBdICggJywnIHBhcmFtZXRlclsgJGxpc3QgXSApKgorICAgICAgICBAc3RhdGUuZm9sbG93aW5nLnB1c2goIFRPS0VOU19GT0xMT1dJTkdfcGFyYW1ldGVyX0lOX3BhcmFtZXRlcnNfMzE3ICkKKyAgICAgICAgcGFyYW1ldGVyKCBsaXN0ICkKKyAgICAgICAgQHN0YXRlLmZvbGxvd2luZy5wb3AKKyAgICAgICAgIyBhdCBsaW5lIDExMzoyNDogKCAnLCcgcGFyYW1ldGVyWyAkbGlzdCBdICkqCisgICAgICAgIHdoaWxlIHRydWUgIyBkZWNpc2lvbiA5CisgICAgICAgICAgYWx0XzkgPSAyCisgICAgICAgICAgbG9va185XzAgPSBAaW5wdXQucGVlayggMSApCisKKyAgICAgICAgICBpZiAoIGxvb2tfOV8wID09IFRfXzE2ICkKKyAgICAgICAgICAgIGFsdF85ID0gMQorCisgICAgICAgICAgZW5kCisgICAgICAgICAgY2FzZSBhbHRfOQorICAgICAgICAgIHdoZW4gMQorICAgICAgICAgICAgIyBhdCBsaW5lIDExMzoyNjogJywnIHBhcmFtZXRlclsgJGxpc3QgXQorICAgICAgICAgICAgbWF0Y2goIFRfXzE2LCBUT0tFTlNfRk9MTE9XSU5HX1RfXzE2X0lOX3BhcmFtZXRlcnNfMzIyICkKKyAgICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucHVzaCggVE9LRU5TX0ZPTExPV0lOR19wYXJhbWV0ZXJfSU5fcGFyYW1ldGVyc18zMjQgKQorICAgICAgICAgICAgcGFyYW1ldGVyKCBsaXN0ICkKKyAgICAgICAgICAgIEBzdGF0ZS5mb2xsb3dpbmcucG9wCisKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhayAjIG91dCBvZiBsb29wIGZvciBkZWNpc2lvbiA5CisgICAgICAgICAgZW5kCisgICAgICAgIGVuZCAjIGxvb3AgZm9yIGRlY2lzaW9uIDkKKworICAgICAgcmVzY3VlIEFOVExSMzo6RXJyb3I6OlJlY29nbml0aW9uRXJyb3IgPT4gcmUKKyAgICAgICAgcmVwb3J0X2Vycm9yKCByZSApCisgICAgICAgIHJlY292ZXIoIHJlICkKKworICAgICAgZW5zdXJlCisgICAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgICAjIHRyYWNlX291dCggX19tZXRob2RfXywgNSApCisKKyAgICAgIGVuZAorICAgICAgCisgICAgICByZXR1cm4gbGlzdAorICAgIGVuZAorCisKKyAgICAjIAorICAgICMgcGFyc2VyIHJ1bGUgcGFyYW1ldGVyCisgICAgIyAKKyAgICAjIChpbiBHcm91cEZpbGUuZykKKyAgICAjIDExNjoxOiBwYXJhbWV0ZXJbIHBhcmFtZXRlcnMgXSA6ICggJyonIG5hbWU9IElEIHwgJyYnIG5hbWU9IElEIHwgbmFtZT0gSUQgKCAnPScgdj0gU1RSSU5HICk/ICk7CisgICAgIyAKKyAgICBkZWYgcGFyYW1ldGVyKCBwYXJhbWV0ZXJzICkKKyAgICAgICMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworICAgICAgIyB0cmFjZV9pbiggX19tZXRob2RfXywgNiApCisgICAgICBuYW1lID0gbmlsCisgICAgICB2ID0gbmlsCisKKyAgICAgIGJlZ2luCisgICAgICAgICMgYXQgbGluZSAxMTc6MzogKCAnKicgbmFtZT0gSUQgfCAnJicgbmFtZT0gSUQgfCBuYW1lPSBJRCAoICc9JyB2PSBTVFJJTkcgKT8gKQorICAgICAgICBhbHRfMTEgPSAzCisgICAgICAgIGNhc2UgbG9va18xMSA9IEBpbnB1dC5wZWVrKCAxICkKKyAgICAgICAgd2hlbiBUX18xNyB0aGVuIGFsdF8xMSA9IDEKKyAgICAgICAgd2hlbiBUX18xOCB0aGVuIGFsdF8xMSA9IDIKKyAgICAgICAgd2hlbiBJRCB0aGVuIGFsdF8xMSA9IDMKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhaXNlIE5vVmlhYmxlQWx0ZXJuYXRpdmUoICIiLCAxMSwgMCApCisgICAgICAgIGVuZAorICAgICAgICBjYXNlIGFsdF8xMQorICAgICAgICB3aGVuIDEKKyAgICAgICAgICAjIGF0IGxpbmUgMTE3OjU6ICcqJyBuYW1lPSBJRAorICAgICAgICAgIG1hdGNoKCBUX18xNywgVE9LRU5TX0ZPTExPV0lOR19UX18xN19JTl9wYXJhbWV0ZXJfMzQyICkKKyAgICAgICAgICBuYW1lID0gbWF0Y2goIElELCBUT0tFTlNfRk9MTE9XSU5HX0lEX0lOX3BhcmFtZXRlcl8zNDYgKQorICAgICAgICAgICMgLS0+IGFjdGlvbgorICAgICAgICAgICBwYXJhbWV0ZXJzLnNwbGF0ID0gbmFtZS50ZXh0IAorICAgICAgICAgICMgPC0tIGFjdGlvbgorCisgICAgICAgIHdoZW4gMgorICAgICAgICAgICMgYXQgbGluZSAxMTg6NTogJyYnIG5hbWU9IElECisgICAgICAgICAgbWF0Y2goIFRfXzE4LCBUT0tFTlNfRk9MTE9XSU5HX1RfXzE4X0lOX3BhcmFtZXRlcl8zNTQgKQorICAgICAgICAgIG5hbWUgPSBtYXRjaCggSUQsIFRPS0VOU19GT0xMT1dJTkdfSURfSU5fcGFyYW1ldGVyXzM1OCApCisgICAgICAgICAgIyAtLT4gYWN0aW9uCisgICAgICAgICAgIHBhcmFtZXRlcnMuYmxvY2sgPSBuYW1lLnRleHQgCisgICAgICAgICAgIyA8LS0gYWN0aW9uCisKKyAgICAgICAgd2hlbiAzCisgICAgICAgICAgIyBhdCBsaW5lIDExOTo1OiBuYW1lPSBJRCAoICc9JyB2PSBTVFJJTkcgKT8KKyAgICAgICAgICBuYW1lID0gbWF0Y2goIElELCBUT0tFTlNfRk9MTE9XSU5HX0lEX0lOX3BhcmFtZXRlcl8zNjggKQorICAgICAgICAgICMgLS0+IGFjdGlvbgorICAgICAgICAgICBwYXJhbSA9IEFOVExSMzo6VGVtcGxhdGU6OlBhcmFtZXRlci5uZXcoIG5hbWUudGV4dCApIAorICAgICAgICAgICMgPC0tIGFjdGlvbgorICAgICAgICAgICMgYXQgbGluZSAxMjA6NTogKCAnPScgdj0gU1RSSU5HICk/CisgICAgICAgICAgYWx0XzEwID0gMgorICAgICAgICAgIGxvb2tfMTBfMCA9IEBpbnB1dC5wZWVrKCAxICkKKworICAgICAgICAgIGlmICggbG9va18xMF8wID09IFRfXzE5ICkKKyAgICAgICAgICAgIGFsdF8xMCA9IDEKKyAgICAgICAgICBlbmQKKyAgICAgICAgICBjYXNlIGFsdF8xMAorICAgICAgICAgIHdoZW4gMQorICAgICAgICAgICAgIyBhdCBsaW5lIDEyMDo3OiAnPScgdj0gU1RSSU5HCisgICAgICAgICAgICBtYXRjaCggVF9fMTksIFRPS0VOU19GT0xMT1dJTkdfVF9fMTlfSU5fcGFyYW1ldGVyXzM4MiApCisgICAgICAgICAgICB2ID0gbWF0Y2goIFNUUklORywgVE9LRU5TX0ZPTExPV0lOR19TVFJJTkdfSU5fcGFyYW1ldGVyXzM4NiApCisgICAgICAgICAgICAjIC0tPiBhY3Rpb24KKyAgICAgICAgICAgICBwYXJhbS5kZWZhdWx0ID0gdi50ZXh0IAorICAgICAgICAgICAgIyA8LS0gYWN0aW9uCisKKyAgICAgICAgICBlbmQKKyAgICAgICAgICAjIC0tPiBhY3Rpb24KKyAgICAgICAgICAgcGFyYW1ldGVycy5hZGQoIHBhcmFtICkgCisgICAgICAgICAgIyA8LS0gYWN0aW9uCisKKyAgICAgICAgZW5kCisgICAgICByZXNjdWUgQU5UTFIzOjpFcnJvcjo6UmVjb2duaXRpb25FcnJvciA9PiByZQorICAgICAgICByZXBvcnRfZXJyb3IoIHJlICkKKyAgICAgICAgcmVjb3ZlciggcmUgKQorCisgICAgICBlbnN1cmUKKyAgICAgICAgIyAtPiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBtYW51YWxseSBlbmFibGUgcnVsZSB0cmFjaW5nCisgICAgICAgICMgdHJhY2Vfb3V0KCBfX21ldGhvZF9fLCA2ICkKKworICAgICAgZW5kCisgICAgICAKKyAgICAgIHJldHVybiAKKyAgICBlbmQKKworCisKKyAgICBUT0tFTlNfRk9MTE9XSU5HX2dyb3VwX25hbWVfSU5fZ3JvdXBfc3BlY184NSA9IFNldFsgMSwgNSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19tZW1iZXJfSU5fZ3JvdXBfc3BlY18xMDggPSBTZXRbIDEsIDUgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfVF9fMTBfSU5fZ3JvdXBfbmFtZV8xMjggPSBTZXRbIDQgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfQ09OU1RBTlRfSU5fZ3JvdXBfbmFtZV8xNDQgPSBTZXRbIDExIF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX1RfXzExX0lOX2dyb3VwX25hbWVfMTQ2ID0gU2V0WyA0IF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX0NPTlNUQU5UX0lOX2dyb3VwX25hbWVfMTY5ID0gU2V0WyAxLCAxMiBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19UX18xMl9JTl9ncm91cF9uYW1lXzE3NyA9IFNldFsgMSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19JRF9JTl9tZW1iZXJfMTk5ID0gU2V0WyA1LCAxMywgMTQsIDE3LCAxOCBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19wYXJhbWV0ZXJfZGVjbGFyYXRpb25fSU5fbWVtYmVyXzIwMyA9IFNldFsgMTMgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfVF9fMTNfSU5fbWVtYmVyXzIxMCA9IFNldFsgNSwgNiwgNyBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19JRF9JTl9tZW1iZXJfMjIwID0gU2V0WyAxIF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX1RFTVBMQVRFX0lOX21lbWJlcl8yMzAgPSBTZXRbIDEgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfU1RSSU5HX0lOX21lbWJlcl8yNDIgPSBTZXRbIDEgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfVF9fMTRfSU5fcGFyYW1ldGVyX2RlY2xhcmF0aW9uXzI3NiA9IFNldFsgNSwgMTQsIDE1LCAxNywgMTggXQorICAgIFRPS0VOU19GT0xMT1dJTkdfcGFyYW1ldGVyc19JTl9wYXJhbWV0ZXJfZGVjbGFyYXRpb25fMjgwID0gU2V0WyAxNSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19UX18xNV9JTl9wYXJhbWV0ZXJfZGVjbGFyYXRpb25fMjg3ID0gU2V0WyAxIF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX3BhcmFtZXRlcnNfSU5fcGFyYW1ldGVyX2RlY2xhcmF0aW9uXzI5MyA9IFNldFsgMSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19wYXJhbWV0ZXJfSU5fcGFyYW1ldGVyc18zMTcgPSBTZXRbIDEsIDE2IF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX1RfXzE2X0lOX3BhcmFtZXRlcnNfMzIyID0gU2V0WyA1LCAxNCwgMTcsIDE4IF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX3BhcmFtZXRlcl9JTl9wYXJhbWV0ZXJzXzMyNCA9IFNldFsgMSwgMTYgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfVF9fMTdfSU5fcGFyYW1ldGVyXzM0MiA9IFNldFsgNSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19JRF9JTl9wYXJhbWV0ZXJfMzQ2ID0gU2V0WyAxIF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX1RfXzE4X0lOX3BhcmFtZXRlcl8zNTQgPSBTZXRbIDUgXQorICAgIFRPS0VOU19GT0xMT1dJTkdfSURfSU5fcGFyYW1ldGVyXzM1OCA9IFNldFsgMSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19JRF9JTl9wYXJhbWV0ZXJfMzY4ID0gU2V0WyAxLCAxOSBdCisgICAgVE9LRU5TX0ZPTExPV0lOR19UX18xOV9JTl9wYXJhbWV0ZXJfMzgyID0gU2V0WyA3IF0KKyAgICBUT0tFTlNfRk9MTE9XSU5HX1NUUklOR19JTl9wYXJhbWV0ZXJfMzg2ID0gU2V0WyAxIF0KKworICBlbmQgIyBjbGFzcyBQYXJzZXIgPCBBTlRMUjM6OlBhcnNlcgorCitlbmQKKyMgLSAtIC0gLSAtIC0gYmVnaW4gYWN0aW9uIEBwYXJzZXI6OmZvb3RlciAtIC0gLSAtIC0gLQorIyBHcm91cEZpbGUuZworCisKK2VuZCAjIG1vZHVsZSBUZW1wbGF0ZQorZW5kICMgbW9kdWxlIEFOVExSMworCisjIC0gLSAtIC0gLSAtIGVuZCBhY3Rpb24gQHBhcnNlcjo6Zm9vdGVyIC0gLSAtIC0gLSAtIC0KKworCitpZiBfX0ZJTEVfXyA9PSAkMCBhbmQgQVJHVi5maXJzdCAhPSAnLS0nCisgICMgLSAtIC0gLSAtIC0gYmVnaW4gYWN0aW9uIEBwYXJzZXI6Om1haW4gLSAtIC0gLSAtIC0KKyAgIyBHcm91cEZpbGUuZworCisKKyAgICBkZWZpbmVkPyggQU5UTFIzOjpUZW1wbGF0ZTo6R3JvdXBGaWxlOjpMZXhlciApIG9yIHJlcXVpcmUgJ2FudGxyMy90ZW1wbGF0ZS9ncm91cC1maWxlJworICAgIEFOVExSMzo6VGVtcGxhdGU6Okdyb3VwRmlsZTo6UGFyc2VyLm1haW4oIEFSR1YgKQorCisgICMgLSAtIC0gLSAtIC0gZW5kIGFjdGlvbiBAcGFyc2VyOjptYWluIC0gLSAtIC0gLSAtIC0KKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGVtcGxhdGUvZ3JvdXAtZmlsZS5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9ncm91cC1maWxlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGQ0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGVtcGxhdGUvZ3JvdXAtZmlsZS5yYgpAQCAtMCwwICsxLDIwIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKz1iZWdpbiAgICAgIDo6YWJvdXQ6OgorYXV0aG9yOiAgICAgS3lsZSBZZXR0ZXIgPGtjeTViQHlhaG9vLmNvbT4KK2NyZWF0ZWQgb246IE1hcmNoIDE5LCAyMDEwCitwdXJwb3NlOiAgICBMb2FkcyB0aGUgQU5UTFIgcmVjb2duaXRpb24gY29kZSBmb3IgQU5UTFIgVGVtcGxhdGUgR3JvdXAgZmlsZXMKKz1lbmQKKworcmVxdWlyZSAnYW50bHIzL3RlbXBsYXRlL2dyb3VwLWZpbGUtbGV4ZXInCityZXF1aXJlICdhbnRscjMvdGVtcGxhdGUvZ3JvdXAtZmlsZS1wYXJzZXInCisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBUZW1wbGF0ZQorY2xhc3MgR3JvdXAKKyAgTGV4ZXIgID0gR3JvdXBGaWxlOjpMZXhlcgorICBQYXJzZXIgPSBHcm91cEZpbGU6OlBhcnNlcgorZW5kCitlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RlbXBsYXRlL3BhcmFtZXRlci5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9wYXJhbWV0ZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzNDFjNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZW1wbGF0ZS9wYXJhbWV0ZXIucmIKQEAgLTAsMCArMSw1NiBAQAorIyEvdXNyL2Jpbi9ydWJ5CisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBUZW1wbGF0ZQorUGFyYW1ldGVyID0gU3RydWN0Lm5ldyggOm5hbWUsIDpkZWZhdWx0ICkKK2NsYXNzIFBhcmFtZXRlcgorICBkZWYgdG9fcworICAgIGlmIGJsb2NrIHRoZW4gIiYjeyBuYW1lIH0iCisgICAgZWxzaWYgc3BsYXQgdGhlbiAiKiN7IG5hbWUgfSIKKyAgICBlbHNpZiBkZWZhdWx0IHRoZW4gIiN7IG5hbWUgfSA9ICN7IGRlZmF1bHQgfSIKKyAgICBlbHNlIG5hbWUuZHVwCisgICAgZW5kCisgIGVuZAorZW5kCisKK2NsYXNzIFBhcmFtZXRlckxpc3QgPCA6OkFycmF5CisgIGF0dHJfYWNjZXNzb3IgOnNwbGF0LCA6YmxvY2sKKyAgCisgIGRlZiBzZWxmLmRlZmF1bHQKKyAgICBuZXcuYWRkKCA6dmFsdWVzICkgZG8gfCBwIHwKKyAgICAgIHAuZGVmYXVsdCA9ICd7fScKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgbmFtZXMKKyAgICBuYW1lcyA9IG1hcCB7IHwgcGFyYW0gfCBwYXJhbS5uYW1lLnRvX3MgfQorICAgIEBzcGxhdCBhbmQgbmFtZXMgPDwgQHNwbGF0LnRvX3MKKyAgICBAYmxvY2sgYW5kIG5hbWVzIDw8IEBibG9jay50b19zCisgICAgcmV0dXJuKCBuYW1lcyApCisgIGVuZAorICAKKyAgZGVmIGFkZCggbmFtZSwgZGVmYXVsdCA9IG5pbCApCisgICAgcGFyYW0gPQorICAgICAgY2FzZSBuYW1lCisgICAgICB3aGVuIFBhcmFtZXRlciB0aGVuIG5hbWUKKyAgICAgIGVsc2UgUGFyYW1ldGVyLm5ldyggbmFtZS50b19zICkKKyAgICAgIGVuZAorICAgIGlmIG9wdGlvbnMKKyAgICAgIGRlZmF1bHQgPSBvcHRpb25zWyA6ZGVmYXVsdCBdIGFuZCBwYXJhbS5kZWZhdWx0ID0gZGVmYXVsdAorICAgICAgcGFyYW0uc3BsYXQgPSBvcHRpb25zLmZldGNoKCA6c3BsYXQsIGZhbHNlICkKKyAgICAgIHBhcmFtLmJsb2NrID0gb3B0aW9ucy5mZXRjaCggOmJsb2NrLCBmYWxzZSApCisgICAgZW5kCisgICAgYmxvY2tfZ2l2ZW4/IGFuZCB5aWVsZCggcGFyYW0gKQorICAgIHB1c2goIHBhcmFtICkKKyAgICByZXR1cm4oIHNlbGYgKQorICBlbmQKKyAgCisgIGRlZiB0b19zCisgICAgc2lnbmF0dXJlID0gam9pbiggJywgJyApCisgICAgQHNwbGF0IGFuZCBzaWduYXR1cmUgPDwgIiwgKiIgPDwgQHNwbGF0LnRvX3MKKyAgICBAYmxvY2sgYW5kIHNpZ25hdHVyZSA8PCAiLCAmIiA8PCBAYmxvY2sudG9fcworICAgIHJldHVybiggc2lnbmF0dXJlICkKKyAgZW5kCitlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGVzdC9jYWxsLXN0YWNrLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3Rlc3QvY2FsbC1zdGFjay5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY1ZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3Rlc3QvY2FsbC1zdGFjay5yYgpAQCAtMCwwICsxLDU3IEBACisjIS91c3IvYmluL3J1YnkKKwordW5sZXNzIGRlZmluZWQ/IENhbGwKKyAgCitDYWxsID0gU3RydWN0Lm5ldyggOmZpbGUsIDpsaW5lLCA6bWV0aG9kICkKK2NsYXNzIENhbGwKKyAgCisgIGRlZiBzZWxmLnBhcnNlKCBjYWxsX3N0cmluZyApCisgICAgcGFydHMgPSBjYWxsX3N0cmluZy5zcGxpdCggJzonLCAzICkKKyAgICBmaWxlID0gcGFydHMuc2hpZnQKKyAgICBsaW5lID0gcGFydHMuc2hpZnQudG9faQorICAgIGlmIHBhcnRzLmVtcHR5PworICAgICAgICByZXR1cm4gQ2FsbC5uZXcoIGZpbGUsIGxpbmUgKQorICAgIGVsc2UKKyAgICAgICAgbXN0cmluZyA9IHBhcnRzLnNoaWZ0CisgICAgICAgIG1hdGNoID0gbXN0cmluZy5tYXRjaCggL2AoLispJy8gKQorICAgICAgICBtZXRob2QgPSBtYXRjaCA/IG1hdGNoWyAxIF0gOiBuaWwKKyAgICAgICAgcmV0dXJuIENhbGwubmV3KCBmaWxlLCBsaW5lLCBtZXRob2QgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBzZWxmLmNvbnZlcnRfYmFja3RyYWNlKCB0cmFjZSApCisgICAgdHJhY2UubWFwIHsgfGN8IHBhcnNlIGMgfQorICBlbmQKKyAgCisgIGRlZiBpcmI/CisgICAgc2VsZi5maWxlID09ICcoaXJiKScKKyAgZW5kCisgIAorICBkZWYgZV9zd2l0Y2g/CisgICAgc2VsZi5maWxlID09ICctZScKKyAgZW5kCisgIAorICBkZWYgdG9fcworICAgIHN0cmluZyA9ICclczolaScgJSBbIGZpbGUsIGxpbmUgXQorICAgIG1ldGhvZCBhbmQgc3RyaW5nIDw8ICI6aW4gYCVzJyIgJSBtZXRob2QKKyAgICByZXR1cm4oIHN0cmluZyApCisgIGVuZAorICAKKyAgZGVmIGluc3BlY3QKKyAgICB0b19zLmluc3BlY3QKKyAgZW5kCitlbmQKKworbW9kdWxlIEtlcm5lbAorICBkZWYgY2FsbF9zdGFjayggZGVwdGggPSAxICkKKyAgICBDYWxsLmNvbnZlcnRfYmFja3RyYWNlKCBjYWxsZXIoIGRlcHRoICsgMSApICkKKyAgZW5kCitlbmQKKworY2xhc3MgRXhjZXB0aW9uCisgIGRlZiBiYWNrdHJhY2UhCisgICAgQ2FsbC5jb252ZXJ0X2JhY2t0cmFjZSggYmFja3RyYWNlICkKKyAgZW5kCitlbmQKKworZW5kICMgdW5sZXNzIGRlZmluZWQ/IENhbGwKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZXN0L2NvcmUtZXh0ZW5zaW9ucy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZXN0L2NvcmUtZXh0ZW5zaW9ucy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2I5YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3Rlc3QvY29yZS1leHRlbnNpb25zLnJiCkBAIC0wLDAgKzEsMjY5IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK2NsYXNzIFN0cmluZworICBkZWYgLyggc3VicGF0aCApCisgICAgRmlsZS5qb2luKCBzZWxmLCBzdWJwYXRoLnRvX3MgKQorICBlbmQKKworICBkZWYgaGVyZV9pbmRlbnQoIGNociA9ICd8ICcgKQorICAgIGR1cC5oZXJlX2luZGVudCEoIGNociApCisgIGVuZAorCisgIGRlZiBoZXJlX2luZGVudCEoIGNociA9ICd8ICcgKQorICAgIGNociA9IFJlZ2V4cC5lc2NhcGUoIGNociApCisgICAgZXhwID0gUmVnZXhwLm5ldyggIl4gKiN7IGNociB9IiApCisgICAgc2VsZi5nc3ViISggZXhwLCcnICkKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKworICBkZWYgaGVyZV9mbG93KCBjaHIgPSAnfCAnICkKKyAgICBkdXAuaGVyZV9mbG93ISggY2hyICkKKyAgZW5kCisKKyAgZGVmIGhlcmVfZmxvdyEoIGNociA9ICd8ICcgKQorICAgIGhlcmVfaW5kZW50ISggY2hyICkuZ3N1YiEoIC9cblxzKy8sJyAnICkKKyAgICByZXR1cm4oIHNlbGYgKQorICBlbmQKKworICAjIEluZGVudCBsZWZ0IG9yIHJpZ2h0IGJ5IG4gc3BhY2VzLgorICAjIChUaGlzIHVzZWQgdG8gYmUgY2FsbGVkICN0YWIgYW5kIGFsaWFzZWQgYXMgI2luZGVudC4pCisgICMKKyAgIyAgQ1JFRElUOiBHYXZpbiBTaW5jbGFpcgorICAjICBDUkVESVQ6IFRyYW5zCisKKyAgZGVmIGluZGVudCggbiApCisgICAgaWYgbiA+PSAwCisgICAgICBnc3ViKCAvXi8sICcgJyAqIG4gKQorICAgIGVsc2UKKyAgICAgIGdzdWIoIC9eIHswLCN7IC1uIH19LywgIiIgKQorICAgIGVuZAorICBlbmQKKworICAjIE91dGRlbnQganVzdCBpbmRlbnRzIGEgbmVnYXRpdmUgbnVtYmVyIG9mIHNwYWNlcy4KKyAgIworICAjICBDUkVESVQ6IE5vYWggR2liYnMKKworICBkZWYgb3V0ZGVudCggbiApCisgICAgaW5kZW50KCAtbiApCisgIGVuZAorICAKKyAgIyBSZXR1cm5zIHRoZSBzaG9ydGVzdCBsZW5ndGggb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGZvciBhbGwgbm9uLWJsYW5rIGxpbmVzCisgICMKKyAgIyAgIG4gPSAlUSgKKyAgIyAgICAgYSA9IDMKKyAgIyAgICAgICBiID0gNAorICAjICAgKS5sZXZlbF9vZl9pbmRlbnQgICM9PiAyCisgICMKKyAgIyAgIENSRURJVDogS3lsZSBZZXR0ZXIKKyAgZGVmIGxldmVsX29mX2luZGVudAorICAgIHNlbGYuc2NhbiggL14gKig/PVxTKS8gKS5tYXAgeyB8c3BhY2V8IHNwYWNlLmxlbmd0aCB9Lm1pbiB8fCAwCisgIGVuZAorICAKKyAgZGVmIGZpeGVkX2luZGVudCggbiApCisgICAgc2VsZi5vdXRkZW50KCBzZWxmLmxldmVsX29mX2luZGVudCApLmluZGVudCggbiApCisgIGVuZAorICAKKyAgIyBQcm92aWRlcyBhIG1hcmdpbiBjb250cm9sbGVkIHN0cmluZy4KKyAgIworICAjICAgeCA9ICVReworICAjICAgICAgICAgfCBUaGlzCisgICMgICAgICAgICB8ICAgaXMKKyAgIyAgICAgICAgIHwgICAgIG1hcmdpbiBjb250cm9sbGVkIQorICAjICAgICAgICAgfS5tYXJnaW4KKyAgIworICAjCisgICMgICBOT1RFOiBUaGlzIG1heSBzdGlsbCBuZWVkIGEgYml0IG9mIHR3ZWFraW5nLgorICAjCisgICMgIENSRURJVDogVHJhbnMKKworICBkZWYgbWFyZ2luKCBuPTAgKQorICAgICNkID0gL1xBLipcblxzKiguKS8ubWF0Y2goIHNlbGYgKVsxXQorICAgICNkID0gL1xBXHMqKC4pLy5tYXRjaCggc2VsZilbMV0gdW5sZXNzIGQKKyAgICBkID0gKCAoIC9cQS4qXG5ccyooLikvLm1hdGNoKCBzZWxmICkgKSB8fAorICAgICAgICAoIC9cQVxzKiguKS8ubWF0Y2goIHNlbGYgKSApIClbIDEgXQorICAgIHJldHVybiAnJyB1bmxlc3MgZAorICAgIGlmIG4gPT0gMAorICAgICAgZ3N1YiggL1xuXHMqXFovLCcnICkuZ3N1YiggL15ccypbI3sgZCB9XS8sICcnICkKKyAgICBlbHNlCisgICAgICBnc3ViKCAvXG5ccypcWi8sJycgKS5nc3ViKCAvXlxzKlsjeyBkIH1dLywgJyAnICogbiApCisgICAgZW5kCisgIGVuZAorCisgICMgRXhwYW5kcyB0YWJzIHRvICtuKyBzcGFjZXMuICBOb24tZGVzdHJ1Y3RpdmUuICBJZiArbisgaXMgMCwgdGhlbiB0YWJzIGFyZQorICAjIHNpbXBseSByZW1vdmVkLiAgUmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiArbisgaXMgbmVnYXRpdmUuCisgICMKKyAgIyBUaGFua3MgdG8gR0dhcmFtdW5vIGZvciBhIG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobS4gIFZlcnkgbmljZS4KKyAgIworICAjICBDUkVESVQ6IEdhdmluIFNpbmNsYWlyCisgICMgIENSRURJVDogTm9haCBHaWJicworICAjICBDUkVESVQ6IEdHYXJhbXVubworCisgIGRlZiBleHBhbmRfdGFicyggbj04ICkKKyAgICBuID0gbi50b19pbnQKKyAgICByYWlzZSBBcmd1bWVudEVycm9yLCAibiBtdXN0IGJlID49IDAiIGlmIG4gPCAwCisgICAgcmV0dXJuIGdzdWIoIC9cdC8sICIiICkgaWYgbiA9PSAwCisgICAgcmV0dXJuIGdzdWIoIC9cdC8sICIgIiApIGlmIG4gPT0gMQorICAgIHN0ciA9IHNlbGYuZHVwCisgICAgd2hpbGUKKyAgICAgIHN0ci5nc3ViISggL14oW15cdFxuXSopKFx0KykvICkgeyB8ZnwKKyAgICAgICAgdmFsID0gKCBuICogJDIuc2l6ZSAtICggJDEuc2l6ZSAlIG4gKSApCisgICAgICAgICQxIDw8ICggJyAnICogdmFsICkKKyAgICAgIH0KKyAgICBlbmQKKyAgICBzdHIKKyAgZW5kCisKKworICAjIFRoZSByZXZlcnNlIG9mICtjYW1lbGNhc2UrLiBNYWtlcyBhbiB1bmRlcnNjb3JlZCBvZiBhIGNhbWVsY2FzZSBzdHJpbmcuCisgICMKKyAgIyBDaGFuZ2VzICc6OicgdG8gJy8nIHRvIGNvbnZlcnQgbmFtZXNwYWNlcyB0byBwYXRocy4KKyAgIworICAjIEV4YW1wbGVzCisgICMgICAiU25ha2VDYXNlIi5zbmFrZWNhc2UgICAgICAgICAgICM9PiAic25ha2VfY2FzZSIKKyAgIyAgICJTbmFrZS1DYXNlIi5zbmFrZWNhc2UgICAgICAgICAgIz0+ICJzbmFrZV9jYXNlIgorICAjICAgIlNuYWtlQ2FzZTo6RXJyb3JzIi51bmRlcnNjb3JlICAjPT4gInNuYWtlX2Nhc2UvZXJyb3JzIgorCisgIGRlZiBzbmFrZWNhc2UKKyAgICBnc3ViKCAvOjovLCAnLycgKS4gICMgTk9UIFNPIFNVUkUgQUJPVVQgVEhJUyAtVAorICAgIGdzdWIoIC8oW0EtWl0rKShbQS1aXVthLXpdKS8sJ1wxX1wyJyApLgorICAgIGdzdWIoIC8oW2EtelxkXSkoW0EtWl0pLywnXDFfXDInICkuCisgICAgdHIoICItIiwgIl8iICkuCisgICAgZG93bmNhc2UKKyAgZW5kCisgIAorZW5kCisKKworY2xhc3MgTW9kdWxlCisgICMgUmV0dXJucyB0aGUgbW9kdWxlJ3MgY29udGFpbmVyIG1vZHVsZS4KKyAgIworICAjICAgbW9kdWxlIEV4YW1wbGUKKyAgIyAgICAgY2xhc3MgRGVtbworICAjICAgICBlbmQKKyAgIyAgIGVuZAorICAjCisgICMgICBFeGFtcGxlOjpEZW1vLm1vZHNwYWNlICAgIz0+IEV4YW1wbGUKKyAgIworICAjIFNlZSBhbHNvIE1vZHVsZSNiYXNlbmFtZS4KKyAgIworICAjICAgQ1JFRElUOiBUcmFucworCisgIGRlZiBtb2RzcGFjZQorICAgIHNwYWNlID0gbmFtZVsgMC4uLiggbmFtZS5yaW5kZXgoICc6OicgKSB8fCAwICkgXQorICAgIHNwYWNlLmVtcHR5PyA/IE9iamVjdCA6IGV2YWwoIHNwYWNlICkKKyAgZW5kCitlbmQKKworbW9kdWxlIEtlcm5lbAorICBhdXRvbG9hZCA6VGVtcGZpbGUsICd0ZW1wZmlsZScKKyAgCisgIGRlZiBzY3JlZW5fd2lkdGgoIG91dD1TVERFUlIgKQorICAgIGRlZmF1bHRfd2lkdGggPSBFTlZbICdDT0xVTU5TJyBdIHx8IDgwCisgICAgdGlvY2d3aW5zeiA9IDB4NTQxMworICAgIGRhdGEgPSBbIDAsIDAsIDAsIDAgXS5wYWNrKCAiU1NTUyIgKQorICAgIGlmIG91dC5pb2N0bCggdGlvY2d3aW5zeiwgZGF0YSApID49IDAgdGhlbgorICAgICAgcm93cywgY29scywgeHBpeGVscywgeXBpeGVscyA9IGRhdGEudW5wYWNrKCAiU1NTUyIgKQorICAgICAgaWYgY29scyA+PSAwIHRoZW4gY29scyBlbHNlIGRlZmF1bHRfd2lkdGggZW5kCisgICAgZWxzZQorICAgICAgZGVmYXVsdF93aWR0aAorICAgIGVuZAorICByZXNjdWUgRXhjZXB0aW9uID0+IGUKKyAgICBkZWZhdWx0X3dpZHRoIHJlc2N1ZSAoIHJhaXNlIGUgKQorICBlbmQKK2VuZAorCisKK2NsYXNzIEZpbGUKKyAgCisgICMgZ2l2ZW4gc29tZSB0YXJnZXQgcGF0aCBzdHJpbmcsIGFuZCBhbiBvcHRpb25hbCByZWZlcmVuY2UgcGF0aAorICAjIChEaXIucHdkIGJ5IGRlZmF1bHQpLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcKKyAgIyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdGFyZ2V0IHBhdGggZnJvbSB0aGUgcmVmZXJlbmNlIHBhdGgKKyAgIyAKKyAgIyBFeGFtcGxlczoKKyAgIyAgICBGaWxlLnJlbGF0aXZlX3BhdGgoJ3JlbC9wYXRoJykgICAjID0+ICcuL3JlbC9wYXRoJworICAjICAgIEZpbGUucmVsYXRpdmVfcGF0aCgnL3NvbWUvYWJzL3BhdGgnLCAnL3NvbWUnKSAgIyA9PiAnLi9hYnMvcGF0aCcKKyAgIyAgICBGaWxlLnJlbGF0aXZlX3BhdGgoJy9zb21lL2ZpbGUudHh0JywgJy9zb21lL2Ficy9wYXRoJykgICMgPT4gJy4uLy4uL2ZpbGUudHh0JworICBkZWYgc2VsZi5yZWxhdGl2ZV9wYXRoKCB0YXJnZXQsIHJlZmVyZW5jZSA9IERpci5wd2QgKQorICAgIHBhaXIgPSBbIHRhcmdldCwgcmVmZXJlbmNlIF0ubWFwISBkbyB8cGF0aHwKKyAgICAgIEZpbGUuZXhwYW5kX3BhdGgoIHBhdGgudG9fcyApLnNwbGl0KCBGaWxlOjpTZXBhcmF0b3IgKS50YXAgZG8gfGxpc3R8CisgICAgICAgIGlmIGxpc3QuZW1wdHk/IHRoZW4gbGlzdCA8PCBTdHJpbmcubmV3KCBGaWxlOjpTZXBhcmF0b3IgKQorICAgICAgICBlbHNpZiBsaXN0LmZpcnN0LmVtcHR5PyB0aGVuIGxpc3QuZmlyc3QucmVwbGFjZSggRmlsZTo6U2VwYXJhdG9yICkKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICBlbmQKKworICAgIHRhcmdldF9saXN0LCByZWZlcmVuY2VfbGlzdCA9IHBhaXIKKyAgICB3aGlsZSB0YXJnZXRfbGlzdC5maXJzdCA9PSByZWZlcmVuY2VfbGlzdC5maXJzdAorICAgICAgdGFyZ2V0X2xpc3Quc2hpZnQKKyAgICAgIHJlZmVyZW5jZV9saXN0LnNoaWZ0IG9yIGJyZWFrCisgICAgZW5kCisgICAgCisgICAgcmVsYXRpdmVfbGlzdCA9IEFycmF5Lm5ldyggcmVmZXJlbmNlX2xpc3QubGVuZ3RoLCAnLi4nICkKKyAgICByZWxhdGl2ZV9saXN0LmVtcHR5PyBhbmQgcmVsYXRpdmVfbGlzdCA8PCAnLicKKyAgICByZWxhdGl2ZV9saXN0LmNvbmNhdCggdGFyZ2V0X2xpc3QgKS5jb21wYWN0IQorICAgIHJldHVybiByZWxhdGl2ZV9saXN0LmpvaW4oIEZpbGU6OlNlcGFyYXRvciApCisgIGVuZAorICAKK2VuZAorCitjbGFzcyBEaXIKKyAgZGVmaW5lZD8oIERPVFMgKSBvciBET1RTID0gJXcoLiAuLikuZnJlZXplCisgIGRlZiBzZWxmLmNoaWxkcmVuKCBkaXJlY3RvcnkgKQorICAgIGVudHJpZXMgPSBEaXIuZW50cmllcyggZGlyZWN0b3J5ICkgLSBET1RTCisgICAgZW50cmllcy5tYXAhIGRvIHxlbnRyeXwKKyAgICAgIEZpbGUuam9pbiggZGlyZWN0b3J5LCBlbnRyeSApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIHNlbGYubWtwYXRoKCBwYXRoICkKKyAgICAkVkVSQk9TRSBhbmQgJHN0ZGVyci5wdXRzKCAiSU5GTzogRGlyLm1rcGF0aCglcCkiICUgcGF0aCApCisgICAgdGVzdCggP2QsIHBhdGggKSBhbmQgcmV0dXJuKCBwYXRoICkKKyAgICBwYXJlbnQgPSBGaWxlLmRpcm5hbWUoIHBhdGggKQorICAgIHRlc3QoID9kLCBwYXJlbnQgKSBvciBta3BhdGgoIHBhcmVudCApCisgICAgRGlyLm1rZGlyKCBwYXRoICkKKyAgICByZXR1cm4oIHBhdGggKQorICBlbmQKKyAgCitlbmQKKworY2xhc3MgQXJyYXkKKworICAjIFBhZCBhbiBhcnJheSB3aXRoIGEgZ2l2ZW4gPHR0PnZhbHVlPC90dD4gdXB0byBhIGdpdmVuIDx0dD5sZW5ndGg8L3R0Pi4KKyAgIworICAjICAgWzAsMSwyXS5wYWQoNiwiYSIpICAjPT4gWzAsMSwyLCJhIiwiYSIsImEiXQorICAjCisgICMgSWYgPHR0Pmxlbmd0aDwvdHQ+IGlzIGEgbmVnYXRpdmUgbnVtYmVyIHBhZGRpbmcgd2lsbCBiZSBhZGRlZAorICAjIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LgorICAjCisgICMgICBbMCwxLDJdLnBhZCgtNiwiYSIpICAjPT4gWyJhIiwiYSIsImEiLDAsMSwyXQorICAjCisgICMgIENSRURJVDogUmljaGFyZCBMYXVnZXNlbgorCisgIGRlZiBwYWQoIGxlbiwgdmFsPW5pbCApCisgICAgcmV0dXJuIGR1cCBpZiBzZWxmLnNpemUgPj0gbGVuLmFicworICAgIGlmIGxlbiA8IDAKKyAgICAgIEFycmF5Lm5ldyggKCBsZW4rc2l6ZSApLmFicyx2YWwgKSArIHNlbGYKKyAgICBlbHNlCisgICAgICBzZWxmICsgQXJyYXkubmV3KCBsZW4tc2l6ZSx2YWwgKQorICAgIGVuZAorICBlbmQKKworICAjIExpa2UgI3BhZCBidXQgY2hhbmdlcyB0aGUgYXJyYXkgaW4gcGxhY2UuCisgICMKKyAgIyAgICBhID0gWzAsMSwyXQorICAjICAgIGEucGFkISg2LCJ4IikKKyAgIyAgICBhICAjPT4gWzAsMSwyLCJ4IiwieCIsIngiXQorICAjCisgICMgIENSRURJVDogUmljaGFyZCBMYXVnZXNlbgorCisgIGRlZiBwYWQhKCBsZW4sIHZhbD1uaWwgKQorICAgIHJldHVybiBzZWxmIGlmIHNlbGYuc2l6ZSA+PSBsZW4uYWJzCisgICAgaWYgbGVuIDwgMAorICAgICAgcmVwbGFjZSBBcnJheS5uZXcoICggbGVuK3NpemUgKS5hYnMsdmFsICkgKyBzZWxmCisgICAgZWxzZQorICAgICAgY29uY2F0IEFycmF5Lm5ldyggbGVuLXNpemUsdmFsICkKKyAgICBlbmQKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3Rlc3QvZnVuY3Rpb25hbC5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MWFjYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwucmIKQEAgLTAsMCArMSwyMzEgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzJworcmVxdWlyZSAnYW50bHIzL3Rlc3QvY29yZS1leHRlbnNpb25zJworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZ3JhbW1hcicKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2NhbGwtc3RhY2snCisKK3JlcXVpcmUgJ3Rlc3QvdW5pdCcKK3JlcXVpcmUgJ3NwZWMnCisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBUZXN0Cittb2R1bGUgTG9jYXRpb24KKyAgYXR0cl9hY2Nlc3NvciA6dGVzdF9wYXRoCisgIAorICBkZWYgdGVzdF9ncm91cAorICAgIEZpbGUuYmFzZW5hbWUoIHRlc3RfcGF0aCwgJy5yYicgKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2RpcmVjdG9yeQorICAgIEZpbGUuZGlybmFtZSggdGVzdF9wYXRoICkKKyAgZW5kCisgIAorICBkZWYgbG9jYWxfcGF0aCggKnBhcnRzICkKKyAgICBGaWxlLmpvaW4oIHRlc3RfZGlyZWN0b3J5LCAqcGFydHMgKQorICBlbmQKKyAgCisgIGRlZiBvdXRwdXRfZGlyZWN0b3J5KCBuYW1lID0gdGVzdF9ncm91cCApCisgICAgbG9jYWxfcGF0aCggbmFtZSApCisgIGVuZAorICAKK2VuZCAjIG1vZHVsZSBMb2NhdGlvbgorCittb2R1bGUgTmFtZVNwYWNlCisgIAorICAjCisgICMgaW1wb3J0KCBydWJ5X2ZpbGUgKSAgID0+IFsgbmV3IGNvbnN0YW50cywgLi4uIF0KKyAgIyBSZWFkIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBwYXRoIGdpdmVuIGJ5ICtydWJ5X2ZpbGUrIGFuZAorICAjIGV2YWx1YXRlIGl0IHdpdGhpbiB0aGUgY2xhc3MgYm9keS4gUmV0dXJuIG5ldyBjb25zdGFudHMKKyAgIyBjcmVhdGVkIGluIHRoZSBjbGFzcyBhZnRlciB0aGUgZXZhbHVhdGlvbi4KKyAgIyAKKyAgZGVmIGltcG9ydCggcnVieV9maWxlICkKKyAgICBjb25zdGFudHNfYmVmb3JlID0gY29uc3RhbnRzCisgICAgY2xhc3NfZXZhbCggRmlsZS5yZWFkKCBydWJ5X2ZpbGUgKSwgcnVieV9maWxlLCAxICkKKyAgICBjb25zdGFudHMgLSBjb25zdGFudHNfYmVmb3JlCisgIGVuZAorICAKKyAgZGVmIGltcG9ydF9ncmFtbWFyX3RhcmdldHMoIGdyYW1tYXIgKQorICAgIGZvciBmaWxlIGluIGdyYW1tYXIudGFyZ2V0X2ZpbGVzCisgICAgICBpbXBvcnQoIGZpbGUgKQorICAgIGVuZAorICBlbmQKK2VuZAorCittb2R1bGUgR3JhbW1hck1hbmFnZXIKKyAgaW5jbHVkZSBMb2NhdGlvbgorICBpbmNsdWRlIE5hbWVTcGFjZQorICAKKyAgREVGQVVMVF9DT01QSUxFX09QVElPTlMgPSB7fQorICAKKyAgZGVmIGFkZF9kZWZhdWx0X2NvbXBpbGVfb3B0aW9uKCBuYW1lLCB2YWx1ZSApCisgICAgREVGQVVMVF9DT01QSUxFX09QVElPTlNbIG5hbWUgXSA9IHZhbHVlCisgIGVuZAorICBtb2R1bGVfZnVuY3Rpb24gOmFkZF9kZWZhdWx0X2NvbXBpbGVfb3B0aW9uCisgIAorICBpZiBBTlRMUl9KQVIgPSBFTlZbICdBTlRMUl9KQVInIF0gfHwgQU5UTFIzLmFudGxyX2phcgorICAgIGFkZF9kZWZhdWx0X2NvbXBpbGVfb3B0aW9uKCA6YW50bHJfamFyLCBBTlRMUl9KQVIgKQorICAgIAorICAgIEdyYW1tYXIuZ2xvYmFsX2RlcGVuZGVuY3koIEFOVExSX0pBUiApCisgIGVuZAorICAKKyAgIworICAjIENvbXBpbGUgYW5kIGxvYWQgaW5saW5lIGdyYW1tYXJzIG9uIGRlbWFuZCB3aGVuIHRoZWlyIGNvbnN0YW50IG5hbWUKKyAgIyBpcyByZWZlcmVuY2VkIGluIHRoZSBjb2RlLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBjYXRjaCBiaWcgZXJyb3JzCisgICMgcXVpY2tseSBhcyB0ZXN0IGNhc2VzIGFyZSBydW4sIGluc3RlYWQgb2Ygd2FpdGluZyBhIGZldyBtaW51dGVzCisgICMgZm9yIGFsbCBncmFtbWFycyB0byBjb21waWxlLCBhbmQgdGhlbiBkaXNjb3ZlcmluZyB0aGVyZSdzIGEgYmlnIGR1bWIKKyAgIyBlcnJvciBydWluaW5nIG1vc3Qgb2YgdGhlIGdyYW1tYXJzLgorICAjIAorICBkZWYgY29uc3RfbWlzc2luZyggbmFtZSApCisgICAgaWYgZyA9IGdyYW1tYXJzWyBuYW1lLnRvX3MgXQorICAgICAgY29tcGlsZSggZyApCisgICAgICBncmFtbWFycy5kZWxldGUoIG5hbWUudG9fcyApCisgICAgICBjb25zdF9nZXQoIG5hbWUgKQorICAgIGVsc2lmIHN1cGVyY2xhc3MucmVzcG9uZF90bz8oIDpncmFtbWFycyApCisgICAgICBzdXBlcmNsYXNzLmNvbnN0X21pc3NpbmcoIG5hbWUgKQorICAgICAgIyBeLS0gZm9yIHNvbWUgcmVhc29uLCBpbiBydWJ5IDEuOSwgcnNwZWMgcnVucyBleGFtcGxlcyBhcyBpbnN0YW5jZXMgb2YKKyAgICAgICMgYW5vbnltb3VzIHN1YmNsYXNzZXMsIG9mIHRoZSBhY3R1YWwgdGVzdCBjbGFzcywgd2hpY2ggbWVzc2VzIHVwIHRoZQorICAgICAgIyBhc3N1bXB0aW9ucyBtYWRlIGluIHRoZSB0ZXN0IGNvZGUuIEdyYW1tYXJzIGFyZSBzdG9yZWQgaW4gQGdyYW1tYXJzIGJlbG9uZ2luZworICAgICAgIyB0byB0aGUgdGVzdCBjbGFzcywgc28gaW4gMS45LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBAZ3JhbW1hcnMgPSB7fQorICAgICAgIyBzaW5jZSBpdCdzIGEgc3ViY2xhc3MKKyAgICBlbHNlCisgICAgICBzdXBlcgorICAgIGVuZAorICBlbmQKKyAgCisgICMgCisgICMgQW4gaW5kZXggb2YgZ3JhbW1hciBmaWxlIG9iamVjdHMgY3JlYXRlZCBpbiB0aGUgdGVzdCBjbGFzcworICAjIChkZWZpbmVkIGlubGluZSBvciBsb2FkZWQgZnJvbSBhIGZpbGUpCisgICMgCisgIGRlZiBncmFtbWFycworICAgIEBncmFtbWFycyB8fD0ge30KKyAgZW5kCisgIAorICBkZWYgZ3JhbW1hcl9jb3VudAorICAgIGdyYW1tYXJzLmxlbmd0aAorICBlbmQKKyAgCisgIGRlZiBsb2FkX2dyYW1tYXIoIG5hbWUgKQorICAgIHBhdGggPSBsb2NhbF9wYXRoKCBuYW1lLnRvX3MgKQorICAgIHBhdGggPX4gL1wuZyQvIG9yIHBhdGggPDwgJy5nJworICAgIGdyYW1tYXIgPSBHcmFtbWFyLm5ldyggcGF0aCwgOm91dHB1dF9kaXJlY3RvcnkgPT4gb3V0cHV0X2RpcmVjdG9yeSApCisgICAgcmVnaXN0ZXJfZ3JhbW1hciggZ3JhbW1hciApCisgICAgcmV0dXJuIGdyYW1tYXIKKyAgZW5kCisgIAorICBkZWYgaW5saW5lX2dyYW1tYXIoIHNvdXJjZSwgb3B0aW9ucyA9IHt9ICkKKyAgICBjYWxsID0gY2FsbF9zdGFjay5maW5kIHsgfGNhbGx8IGNhbGwuZmlsZSAhPSBfX0ZJTEVfXyB9CisgICAgZ3JhbW1hciA9IEdyYW1tYXIuaW5saW5lIHNvdXJjZSwKKyAgICAgICAgICAgICAgICA6b3V0cHV0X2RpcmVjdG9yeSA9PiBvdXRwdXRfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgIDpmaWxlID0+ICggY2FsbC5maWxlIHJlc2N1ZSBuaWwgKSwKKyAgICAgICAgICAgICAgICA6bGluZSA9PiAoIGNhbGwubGluZSByZXNjdWUgbmlsICkKKyAgICByZWdpc3Rlcl9ncmFtbWFyKCBncmFtbWFyICkKKyAgICByZXR1cm4gZ3JhbW1hcgorICBlbmQKKyAgCisgIGRlZiBjb21waWxlX29wdGlvbnMoIGRlZmF1bHRzID0gbmlsICkKKyAgICBAY29tcGlsZV9vcHRpb25zIHx8PSBERUZBVUxUX0NPTVBJTEVfT1BUSU9OUy5jbG9uZQorICAgIEBjb21waWxlX29wdGlvbnMudXBkYXRlKCBkZWZhdWx0cyApIGlmIGRlZmF1bHRzCisgICAgcmV0dXJuIEBjb21waWxlX29wdGlvbnMKKyAgZW5kCisgIAorICBkZWYgY29tcGlsZSggZ3JhbW1hciwgb3B0aW9ucyA9IHt9ICkKKyAgICBncmFtbWFyLmNvbXBpbGUoIGNvbXBpbGVfb3B0aW9ucy5tZXJnZSggb3B0aW9ucyApICkKKyAgICBpbXBvcnRfZ3JhbW1hcl90YXJnZXRzKCBncmFtbWFyICkKKyAgICByZXR1cm4gZ3JhbW1hcgorICBlbmQKKyAgCitwcml2YXRlCisgIAorICBkZWYgcmVnaXN0ZXJfZ3JhbW1hciggZ3JhbW1hciApCisgICAgbmFtZSA9IGdyYW1tYXIubmFtZQorICAgIEBncmFtbWFycyB8fD0ge30KKyAgICAKKyAgICBpZiBjb25mbGljdCA9IEBncmFtbWFyc1sgbmFtZSBdIGFuZCBjb25mbGljdC5zb3VyY2UgIT0gZ3JhbW1hci5zb3VyY2UKKyAgICAgIG1lc3NhZ2UgPSAiTXVsdGlwbGUgZ3JhbW1hcnMgZXhpc3Qgd2l0aCB0aGUgbmFtZSBgYCN7IG5hbWUgfScnIgorICAgICAgcmFpc2UgTmFtZUVycm9yLCBtZXNzYWdlCisgICAgZWxzZQorICAgICAgQGdyYW1tYXJzWyBuYW1lIF0gPSBncmFtbWFyCisgICAgZW5kCisgIGVuZAorZW5kICMgbW9kdWxlIEdyYW1tYXJNYW5hZ2VyCisKK2NsYXNzIEZ1bmN0aW9uYWwgPCA6OlRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIGV4dGVuZCBHcmFtbWFyTWFuYWdlcgorICAKKyAgZGVmIHNlbGYuaW5oZXJpdGVkKCBrbGFzcyApCisgICAgc3VwZXIKKyAgICBrbGFzcy50ZXN0X3BhdGggPSBjYWxsX3N0YWNrWyAwIF0uZmlsZQorICBlbmQKKyAgCisgIGRlZiBsb2NhbF9wYXRoKCAqYXJncyApCisgICAgc2VsZi5jbGFzcy5sb2NhbF9wYXRoKCAqYXJncyApCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcGF0aAorICAgIHNlbGYuY2xhc3MudGVzdF9wYXRoCisgIGVuZAorICAKKyAgZGVmIG91dHB1dF9kaXJlY3RvcnkKKyAgICBzZWxmLmNsYXNzLm91dHB1dF9kaXJlY3RvcnkKKyAgZW5kCisgIAorICBkZWYgaW5saW5lX2dyYW1tYXIoIHNvdXJjZSApCisgICAgY2FsbCA9IGNhbGxfc3RhY2suZmluZCB7IHxjYWxsfCBjYWxsLmZpbGUgIT0gX19GSUxFX18gfQorICAgIGdyYW1tYXIgPSBHcmFtbWFyLmlubGluZSBzb3VyY2UsCisgICAgICAgICAgICAgICAgOm91dHB1dF9kaXJlY3RvcnkgPT4gb3V0cHV0X2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICA6ZmlsZSA9PiBjYWxsLmZpbGUsCisgICAgICAgICAgICAgICAgOmxpbmUgPT4gY2FsbC5saW5lCisgIGVuZAorICAKKyAgZGVmIGNvbXBpbGVfYW5kX2xvYWQoIGdyYW1tYXIsIG9wdGlvbnMgPSB7fSApCisgICAgc2VsZi5jbGFzcy5jb21waWxlKCBncmFtbWFyLCBvcHRpb25zICkKKyAgZW5kCitlbmQgIyBjbGFzcyBGdW5jdGlvbmFsCisKKworCittb2R1bGUgQ2FwdHVyZU91dHB1dAorICByZXF1aXJlICdzdHJpbmdpbycKKyAgZGVmIG91dHB1dF9idWZmZXIKKyAgICBkZWZpbmVkPyggQG91dHB1dF9idWZmZXIgKSBvciBAb3V0cHV0X2J1ZmZlciA9IFN0cmluZ0lPLm5ldyggJycgKQorICAgIEBvdXRwdXRfYnVmZmVyCisgIGVuZAorICAKKyAgZGVmIG91dHB1dAorICAgIG91dHB1dF9idWZmZXIuc3RyaW5nCisgIGVuZAorICAKKyAgZGVmIHNheSggKmFyZ3MgKQorICAgIG91dHB1dF9idWZmZXIucHV0cyggKmFyZ3MgKQorICBlbmQKKyAgCisgIGRlZiBjYXB0dXJlKCAqYXJncyApCisgICAgb3V0cHV0X2J1ZmZlci53cml0ZSggKmFyZ3MgKQorICBlbmQKK2VuZAorCittb2R1bGUgUmFpc2VFcnJvcnMKKyAgZGVmIGVtaXRfZXJyb3JfbWVzc2FnZSggbXNnICkKKyAgICAjIGRvIG5vdGhpbmcKKyAgZW5kCisgIAorICBkZWYgcmVwb3J0X2Vycm9yKCBlcnJvciApCisgICAgcmFpc2UgZXJyb3IKKyAgZW5kCitlbmQKKworbW9kdWxlIENvbGxlY3RFcnJvcnMKKyAgZGVmIHJlcG9ydGVkX2Vycm9ycworICAgIGRlZmluZWQ/KCBAcmVwb3J0ZWRfZXJyb3JzICkgb3IgQHJlcG9ydGVkX2Vycm9ycyA9IFtdCisgICAgcmV0dXJuIEByZXBvcnRlZF9lcnJvcnMKKyAgZW5kCisgIAorICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKCBtc2cgKQorICAgIHJlcG9ydGVkX2Vycm9ycyA8PCBtc2cKKyAgZW5kCitlbmQKKworZW5kICMgbW9kdWxlIFRlc3QKK2VuZCAjIG1vZHVsZSBBTlRMUjMKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90ZXN0L2dyYW1tYXIucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGVzdC9ncmFtbWFyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljOTMxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdGVzdC9ncmFtbWFyLnJiCkBAIC0wLDAgKzEsMzY3IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMycKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2NvcmUtZXh0ZW5zaW9ucycKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2NhbGwtc3RhY2snCisKK2lmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjkvCisgIHJlcXVpcmUgJ2RpZ2VzdC9tZDUnCisgIE1ENSA9IERpZ2VzdDo6TUQ1CitlbHNlCisgIHJlcXVpcmUgJ21kNScKK2VuZAorCittb2R1bGUgQU5UTFIzCittb2R1bGUgVGVzdAorbW9kdWxlIERlcGVuZGFudEZpbGUKKyAgYXR0cl9hY2Nlc3NvciA6cGF0aCwgOmZvcmNlCisgIGFsaWFzIGZvcmNlPyBmb3JjZQorICAKKyAgR0xPQkFMX0RFUEVOREVOQ0lFUyA9IFtdCisgIAorICBkZWYgZGVwZW5kZW5jaWVzCisgICAgQGRlcGVuZGVuY2llcyB8fD0gR0xPQkFMX0RFUEVOREVOQ0lFUy5jbG9uZQorICBlbmQKKyAgCisgIGRlZiBkZXBlbmRzX29uKCBwYXRoICkKKyAgICBwYXRoID0gRmlsZS5leHBhbmRfcGF0aCBwYXRoLnRvX3MKKyAgICBkZXBlbmRlbmNpZXMgPDwgcGF0aCBpZiB0ZXN0KCA/ZiwgcGF0aCApCisgICAgcmV0dXJuIHBhdGgKKyAgZW5kCisgIAorICBkZWYgc3RhbGU/CisgICAgZm9yY2UgYW5kIHJldHVybiggdHJ1ZSApCisgICAgdGFyZ2V0X2ZpbGVzLmFueT8gZG8gfHRhcmdldHwKKyAgICAgIG5vdCB0ZXN0KCA/ZiwgdGFyZ2V0ICkgb3IKKyAgICAgICAgZGVwZW5kZW5jaWVzLmFueT8geyB8ZGVwfCB0ZXN0KCA/PiwgZGVwLCB0YXJnZXQgKSB9CisgICAgZW5kCisgIGVuZAorZW5kICMgbW9kdWxlIERlcGVuZGFudEZpbGUKKworY2xhc3MgR3JhbW1hcgorICBpbmNsdWRlIERlcGVuZGFudEZpbGUKKworICBHUkFNTUFSX1RZUEVTID0gJXcobGV4ZXIgcGFyc2VyIHRyZWUgY29tYmluZWQpCisgIFRZUEVfVE9fQ0xBU1MgPSB7IAorICAgICdsZXhlcicgID0+ICdMZXhlcicsCisgICAgJ3BhcnNlcicgPT4gJ1BhcnNlcicsCisgICAgJ3RyZWUnICAgPT4gJ1RyZWVQYXJzZXInCisgIH0KKyAgQ0xBU1NfVE9fVFlQRSA9IFRZUEVfVE9fQ0xBU1MuaW52ZXJ0CisKKyAgZGVmIHNlbGYuZ2xvYmFsX2RlcGVuZGVuY3koIHBhdGggKQorICAgIHBhdGggPSBGaWxlLmV4cGFuZF9wYXRoIHBhdGgudG9fcworICAgIEdMT0JBTF9ERVBFTkRFTkNJRVMgPDwgcGF0aCBpZiB0ZXN0KCA/ZiwgcGF0aCApCisgICAgcmV0dXJuIHBhdGgKKyAgZW5kCisgIAorICBkZWYgc2VsZi5pbmxpbmUoIHNvdXJjZSwgKmFyZ3MgKQorICAgIElubGluZUdyYW1tYXIubmV3KCBzb3VyY2UsICphcmdzICkKKyAgZW5kCisgIAorICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIyMjIyMjIyMgQ09OU1RSVUNUT1IgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBkZWYgaW5pdGlhbGl6ZSggcGF0aCwgb3B0aW9ucyA9IHt9ICkKKyAgICBAcGF0aCA9IHBhdGgudG9fcworICAgIEBzb3VyY2UgPSBGaWxlLnJlYWQoIEBwYXRoICkKKyAgICBAb3V0cHV0X2RpcmVjdG9yeSA9IG9wdGlvbnMuZmV0Y2goIDpvdXRwdXRfZGlyZWN0b3J5LCAnLicgKQorICAgIEB2ZXJib3NlID0gb3B0aW9ucy5mZXRjaCggOnZlcmJvc2UsICRWRVJCT1NFICkKKyAgICBzdHVkeQorICAgIGJ1aWxkX2RlcGVuZGVuY2llcworICAgIAorICAgIHlpZWxkKCBzZWxmICkgaWYgYmxvY2tfZ2l2ZW4/CisgIGVuZAorICAKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIyMjIEFUVFJJQlVURVMgQU5EIEFUVFJJQlVURS1JU0ggTUVUSE9EUyAjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgYXR0cl9yZWFkZXIgOnR5cGUsIDpuYW1lLCA6c291cmNlCisgIGF0dHJfYWNjZXNzb3IgOm91dHB1dF9kaXJlY3RvcnksIDp2ZXJib3NlCisgIAorICBkZWYgbGV4ZXJfY2xhc3NfbmFtZQorICAgIHNlbGYubmFtZSArICI6OkxleGVyIgorICBlbmQKKyAgCisgIGRlZiBsZXhlcl9maWxlX25hbWUKKyAgICBpZiBsZXhlcj8gdGhlbiBiYXNlID0gbmFtZQorICAgIGVsc2lmIGNvbWJpbmVkPyB0aGVuIGJhc2UgPSBuYW1lICsgJ0xleGVyJworICAgIGVsc2UgcmV0dXJuKCBuaWwgKQorICAgIGVuZAorICAgIHJldHVybiggYmFzZSArICcucmInICkKKyAgZW5kCisgIAorICBkZWYgcGFyc2VyX2NsYXNzX25hbWUKKyAgICBuYW1lICsgIjo6UGFyc2VyIgorICBlbmQKKyAgCisgIGRlZiBwYXJzZXJfZmlsZV9uYW1lCisgICAgaWYgcGFyc2VyPyB0aGVuIGJhc2UgPSBuYW1lCisgICAgZWxzaWYgY29tYmluZWQ/IHRoZW4gYmFzZSA9IG5hbWUgKyAnUGFyc2VyJworICAgIGVsc2UgcmV0dXJuKCBuaWwgKQorICAgIGVuZAorICAgIHJldHVybiggYmFzZSArICcucmInICkKKyAgZW5kCisgIAorICBkZWYgdHJlZV9wYXJzZXJfY2xhc3NfbmFtZQorICAgIG5hbWUgKyAiOjpUcmVlUGFyc2VyIgorICBlbmQKKworICBkZWYgdHJlZV9wYXJzZXJfZmlsZV9uYW1lCisgICAgdHJlZT8gYW5kIG5hbWUgKyAnLnJiJworICBlbmQKKyAgCisgIGRlZiBoYXNfbGV4ZXI/CisgICAgQHR5cGUgPT0gJ2NvbWJpbmVkJyB8fCBAdHlwZSA9PSAnbGV4ZXInCisgIGVuZAorICAKKyAgZGVmIGhhc19wYXJzZXI/CisgICAgQHR5cGUgPT0gJ2NvbWJpbmVkJyB8fCBAdHlwZSA9PSAncGFyc2VyJworICBlbmQKKyAgCisgIGRlZiBsZXhlcj8KKyAgICBAdHlwZSA9PSAibGV4ZXIiCisgIGVuZAorICAKKyAgZGVmIHBhcnNlcj8KKyAgICBAdHlwZSA9PSAicGFyc2VyIgorICBlbmQKKyAgCisgIGRlZiB0cmVlPworICAgIEB0eXBlID09ICJ0cmVlIgorICBlbmQKKyAgCisgIGFsaWFzIGhhc190cmVlPyB0cmVlPworICAKKyAgZGVmIGNvbWJpbmVkPworICAgIEB0eXBlID09ICJjb21iaW5lZCIKKyAgZW5kCisgIAorICBkZWYgdGFyZ2V0X2ZpbGVzKCBpbmNsdWRlX2ltcG9ydHMgPSB0cnVlICkKKyAgICB0YXJnZXRzID0gW10KKyAgICAKKyAgICBmb3IgdGFyZ2V0X3R5cGUgaW4gJXcobGV4ZXIgcGFyc2VyIHRyZWVfcGFyc2VyKQorICAgICAgdGFyZ2V0X25hbWUgPSBzZWxmLnNlbmQoIDoiI3sgdGFyZ2V0X3R5cGUgfV9maWxlX25hbWUiICkgYW5kCisgICAgICAgIHRhcmdldHMucHVzaCggb3V0cHV0X2RpcmVjdG9yeSAvIHRhcmdldF9uYW1lICkKKyAgICBlbmQKKyAgICAKKyAgICB0YXJnZXRzLmNvbmNhdCggaW1wb3J0ZWRfdGFyZ2V0X2ZpbGVzICkgaWYgaW5jbHVkZV9pbXBvcnRzCisgICAgcmV0dXJuIHRhcmdldHMKKyAgZW5kCisgIAorICBkZWYgaW1wb3J0cworICAgIEBzb3VyY2Uuc2NhbiggL15ccyppbXBvcnRccysoXHcrKVxzKjsvICkuCisgICAgICB0YXAgeyB8bGlzdHwgbGlzdC5mbGF0dGVuISB9CisgIGVuZAorICAKKyAgZGVmIGltcG9ydGVkX3RhcmdldF9maWxlcworICAgIGltcG9ydHMubWFwISBkbyB8ZGVsZWdhdGV8CisgICAgICBvdXRwdXRfZGlyZWN0b3J5IC8gIiN7IEBuYW1lIH1fI3sgZGVsZWdhdGUgfS5yYiIKKyAgICBlbmQKKyAgZW5kCisKKyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMjIyMjIENPTU1BTkQgTUVUSE9EUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgZGVmIGNvbXBpbGUoIG9wdGlvbnMgPSB7fSApCisgICAgaWYgb3B0aW9uc1sgOmZvcmNlIF0gb3Igc3RhbGU/CisgICAgICBjb21waWxlISggb3B0aW9ucyApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGNvbXBpbGUhKCBvcHRpb25zID0ge30gKQorICAgIGNvbW1hbmQgPSBidWlsZF9jb21tYW5kKCBvcHRpb25zICkKKyAgICAKKyAgICBibGFiKCBjb21tYW5kICkKKyAgICBvdXRwdXQgPSBJTy5wb3BlbiggY29tbWFuZCApIGRvIHxwaXBlfAorICAgICAgcGlwZS5yZWFkCisgICAgZW5kCisgICAgCisgICAgY2FzZSBzdGF0dXMgPSAkPy5leGl0c3RhdHVzCisgICAgd2hlbiAwLCAxMzAKKyAgICAgIHBvc3RfY29tcGlsZSggb3B0aW9ucyApCisgICAgZWxzZSBjb21waWxhdGlvbl9mYWlsdXJlISggY29tbWFuZCwgc3RhdHVzLCBvdXRwdXQgKQorICAgIGVuZAorICAgIAorICAgIHJldHVybiB0YXJnZXRfZmlsZXMKKyAgZW5kCisgIAorICBkZWYgY2xlYW4hCisgICAgZGVsZXRlZCA9IFtdCisgICAgZm9yIHRhcmdldCBpbiB0YXJnZXRfZmlsZXMKKyAgICAgIGlmIHRlc3QoID9mLCB0YXJnZXQgKQorICAgICAgICBGaWxlLmRlbGV0ZSggdGFyZ2V0ICkKKyAgICAgICAgZGVsZXRlZCA8PCB0YXJnZXQKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJldHVybiBkZWxldGVkCisgIGVuZAorICAKKyAgZGVmIGluc3BlY3QKKyAgICBzcHJpbnRmKCAiZ3JhbW1hciAlcyAoJXMpIiwgQG5hbWUsIEBwYXRoICkKKyAgZW5kCisgIAorcHJpdmF0ZQorICAKKyAgZGVmIHBvc3RfY29tcGlsZSggb3B0aW9ucyApCisgICAgIyBkbyBub3RoaW5nIGZvciBub3cKKyAgZW5kCisgIAorICBkZWYgYmxhYiggc3RyaW5nLCAqYXJncyApCisgICAgJHN0ZGVyci5wcmludGYoIHN0cmluZyArICJcbiIsICphcmdzICkgaWYgQHZlcmJvc2UKKyAgZW5kCisgIAorICBkZWYgZGVmYXVsdF9hbnRscl9qYXIKKyAgICBFTlZbICdBTlRMUl9KQVInIF0gfHwgQU5UTFIzLmFudGxyX2phcgorICBlbmQKKyAgCisgIGRlZiBjb21waWxhdGlvbl9mYWlsdXJlISggY29tbWFuZCwgc3RhdHVzLCBvdXRwdXQgKQorICAgIGZvciBmIGluIHRhcmdldF9maWxlcworICAgICAgdGVzdCggP2YsIGYgKSBhbmQgRmlsZS5kZWxldGUoIGYgKQorICAgIGVuZAorICAgIHJhaXNlIENvbXBpbGF0aW9uRmFpbHVyZS5uZXcoIHNlbGYsIGNvbW1hbmQsIHN0YXR1cywgb3V0cHV0ICkKKyAgZW5kCisKKyAgZGVmIGJ1aWxkX2RlcGVuZGVuY2llcworICAgIGRlcGVuZHNfb24oIEBwYXRoICkKKyAgICAKKyAgICBpZiBAc291cmNlID1+IC90b2tlblZvY2FiXHMqPVxzKihcUyspXHMqOy8KKyAgICAgIGZvcmVpZ25fZ3JhbW1hcl9uYW1lID0gJDEKKyAgICAgIHRva2VuX2ZpbGUgPSBvdXRwdXRfZGlyZWN0b3J5IC8gZm9yZWlnbl9ncmFtbWFyX25hbWUgKyAnLnRva2VucycKKyAgICAgIGdyYW1tYXJfZmlsZSA9IEZpbGUuZGlybmFtZSggcGF0aCApIC8gZm9yZWlnbl9ncmFtbWFyX25hbWUgPDwgJy5nJworICAgICAgZGVwZW5kc19vbiggdG9rZW5fZmlsZSApCisgICAgICBkZXBlbmRzX29uKCBncmFtbWFyX2ZpbGUgKQorICAgIGVuZCAgICAKKyAgZW5kCisgIAorICBkZWYgc2hlbGxfZXNjYXBlKCB0b2tlbiApCisgICAgdG9rZW4gPSB0b2tlbi50b19zLmR1cAorICAgIHRva2VuLmVtcHR5PyBhbmQgcmV0dXJuICInJyIKKyAgICB0b2tlbi5nc3ViISggLyhbXkEtWmEtejAtOV9cLS4sOlwvQFxuXSkvbiwgJ1xcXDEnICkKKyAgICB0b2tlbi5nc3ViISggL1xuLywgIidcbiciICkKKyAgICByZXR1cm4gdG9rZW4KKyAgZW5kCisgIAorICBkZWYgYnVpbGRfY29tbWFuZCggb3B0aW9ucyApCisgICAgcGFydHMgPSAldyhqYXZhKQorICAgIGphcl9wYXRoID0gb3B0aW9ucy5mZXRjaCggOmFudGxyX2phciwgZGVmYXVsdF9hbnRscl9qYXIgKQorICAgIHBhcnRzLnB1c2goICctY3AnLCBqYXJfcGF0aCApCisgICAgcGFydHMgPDwgJ29yZy5hbnRsci5Ub29sJworICAgIHBhcnRzLnB1c2goICctZm8nLCBvdXRwdXRfZGlyZWN0b3J5ICkKKyAgICBvcHRpb25zWyA6cHJvZmlsZSBdIGFuZCBwYXJ0cyA8PCAnLXByb2ZpbGUnCisgICAgb3B0aW9uc1sgOmRlYnVnIF0gICBhbmQgcGFydHMgPDwgJy1kZWJ1ZycKKyAgICBvcHRpb25zWyA6dHJhY2UgXSAgIGFuZCBwYXJ0cyA8PCAnLXRyYWNlJworICAgIG9wdGlvbnNbIDpkZWJ1Z19zdCBdIGFuZCBwYXJ0cyA8PCAnLVhkYmdTVCcKKyAgICBwYXJ0cyA8PCBGaWxlLmV4cGFuZF9wYXRoKCBAcGF0aCApCisgICAgcGFydHMubWFwISB7IHxwYXJ0fCBzaGVsbF9lc2NhcGUoIHBhcnQgKSB9LmpvaW4oICcgJyApIDw8ICcgMj4mMScKKyAgZW5kCisgIAorICBkZWYgc3R1ZHkKKyAgICBAc291cmNlID1+IC9eXHMqKGxleGVyfHBhcnNlcnx0cmVlKT9ccypncmFtbWFyXHMqKFxTKylccyo7LyBvcgorICAgICAgcmFpc2UgR3JhbW1hcjo6Rm9ybWF0RXJyb3JbIHNvdXJjZSwgcGF0aCBdCisgICAgQG5hbWUgPSAkMgorICAgIEB0eXBlID0gJDEgfHwgJ2NvbWJpbmVkJworICBlbmQKK2VuZCAjIGNsYXNzIEdyYW1tYXIKKworY2xhc3MgR3JhbW1hcjo6SW5saW5lR3JhbW1hciA8IEdyYW1tYXIKKyAgYXR0cl9hY2Nlc3NvciA6aG9zdF9maWxlLCA6aG9zdF9saW5lCisgIAorICBkZWYgaW5pdGlhbGl6ZSggc291cmNlLCBvcHRpb25zID0ge30gKQorICAgIGhvc3QgPSBjYWxsX3N0YWNrLmZpbmQgeyB8Y2FsbHwgY2FsbC5maWxlICE9IF9fRklMRV9fIH0KKyAgICAKKyAgICBAaG9zdF9maWxlID0gRmlsZS5leHBhbmRfcGF0aCggb3B0aW9uc1sgOmZpbGUgXSB8fCBob3N0LmZpbGUgKQorICAgIEBob3N0X2xpbmUgPSAoIG9wdGlvbnNbIDpsaW5lIF0gfHwgaG9zdC5saW5lICkKKyAgICBAb3V0cHV0X2RpcmVjdG9yeSA9IG9wdGlvbnMuZmV0Y2goIDpvdXRwdXRfZGlyZWN0b3J5LCBGaWxlLmRpcm5hbWUoIEBob3N0X2ZpbGUgKSApCisgICAgQHZlcmJvc2UgPSBvcHRpb25zLmZldGNoKCA6dmVyYm9zZSwgJFZFUkJPU0UgKQorICAgIAorICAgIEBzb3VyY2UgPSBzb3VyY2UudG9fcy5maXhlZF9pbmRlbnQoIDAgKQorICAgIEBzb3VyY2Uuc3RyaXAhCisgICAgCisgICAgc3R1ZHkKKyAgICB3cml0ZV90b19kaXNrCisgICAgYnVpbGRfZGVwZW5kZW5jaWVzCisgICAgCisgICAgeWllbGQoIHNlbGYgKSBpZiBibG9ja19naXZlbj8KKyAgZW5kCisgIAorICBkZWYgb3V0cHV0X2RpcmVjdG9yeQorICAgIEBvdXRwdXRfZGlyZWN0b3J5IGFuZCByZXR1cm4gQG91dHB1dF9kaXJlY3RvcnkKKyAgICBGaWxlLmJhc2VuYW1lKCBAaG9zdF9maWxlICkKKyAgZW5kCisgIAorICBkZWYgcGF0aD0oIHYgKQorICAgIHByZXZpb3VzLCBAcGF0aCA9IEBwYXRoLCB2LnRvX3MKKyAgICBwcmV2aW91cyA9PSBAcGF0aCBvciB3cml0ZV90b19kaXNrCisgIGVuZAorICAKKyAgZGVmIGluc3BlY3QKKyAgICBzcHJpbnRmKCAnaW5saW5lIGdyYW1tYXIgJXMgKCVzOiVzKScsIG5hbWUsIEBob3N0X2ZpbGUsIEBob3N0X2xpbmUgKQorICBlbmQKKyAgCitwcml2YXRlCisgIAorICBkZWYgd3JpdGVfdG9fZGlzaworICAgIEBwYXRoIHx8PSBvdXRwdXRfZGlyZWN0b3J5IC8gQG5hbWUgKyAnLmcnCisgICAgdGVzdCggP2QsIG91dHB1dF9kaXJlY3RvcnkgKSBvciBEaXIubWtkaXIoIG91dHB1dF9kaXJlY3RvcnkgKQorICAgIHVubGVzcyB0ZXN0KCA/ZiwgQHBhdGggKSBhbmQgTUQ1LmRpZ2VzdCggQHNvdXJjZSApID09IE1ENS5kaWdlc3QoIEZpbGUucmVhZCggQHBhdGggKSApCisgICAgICBvcGVuKCBAcGF0aCwgJ3cnICkgeyB8ZnwgZi53cml0ZSggQHNvdXJjZSApIH0KKyAgICBlbmQKKyAgZW5kCitlbmQgIyBjbGFzcyBHcmFtbWFyOjpJbmxpbmVHcmFtbWFyCisKK2NsYXNzIEdyYW1tYXI6OkNvbXBpbGF0aW9uRmFpbHVyZSA8IFN0YW5kYXJkRXJyb3IKKyAgSkFWQV9UUkFDRSA9IC9eKG9yZ1wuKT9hbnRsclwuXFMrXChcUytcLmphdmE6XGQrXClccyovCisgIGF0dHJfcmVhZGVyIDpncmFtbWFyLCA6Y29tbWFuZCwgOnN0YXR1cywgOm91dHB1dAorICAKKyAgZGVmIGluaXRpYWxpemUoIGdyYW1tYXIsIGNvbW1hbmQsIHN0YXR1cywgb3V0cHV0ICkKKyAgICBAY29tbWFuZCA9IGNvbW1hbmQKKyAgICBAc3RhdHVzID0gc3RhdHVzCisgICAgQG91dHB1dCA9IG91dHB1dC5nc3ViKCBKQVZBX1RSQUNFLCAnJyApCisgICAgCisgICAgbWVzc2FnZSA9IDw8LUVORC5oZXJlX2luZGVudCEgJSBbIGNvbW1hbmQsIHN0YXR1cywgZ3JhbW1hciwgQG91dHB1dCBdCisgICAgfCBjb21tYW5kIGBgJXMnJyBmYWlsZWQgd2l0aCBzdGF0dXMgJXMKKyAgICB8ICVwCisgICAgfCB+IH4gfiBjb21tYW5kIG91dHB1dCB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+IH4gfiB+CisgICAgfCAlcworICAgIEVORAorICAgIAorICAgIHN1cGVyKCBtZXNzYWdlLmNob21wISB8fCBtZXNzYWdlICkKKyAgZW5kCitlbmQgIyBlcnJvciBHcmFtbWFyOjpDb21waWxhdGlvbkZhaWx1cmUKKworY2xhc3MgR3JhbW1hcjo6Rm9ybWF0RXJyb3IgPCBTdGFuZGFyZEVycm9yCisgIGF0dHJfcmVhZGVyIDpmaWxlLCA6c291cmNlCisgIAorICBkZWYgc2VsZi5bXSggKmFyZ3MgKQorICAgIG5ldyggKmFyZ3MgKQorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplKCBzb3VyY2UsIGZpbGUgPSBuaWwgKQorICAgIEBmaWxlID0gZmlsZQorICAgIEBzb3VyY2UgPSBzb3VyY2UKKyAgICBtZXNzYWdlID0gJycKKyAgICBpZiBmaWxlLm5pbD8gIyBpbmxpbmUKKyAgICAgIG1lc3NhZ2UgPDwgImJhZCBpbmxpbmUgZ3JhbW1hciBzb3VyY2U6XG4iCisgICAgICBtZXNzYWdlIDw8ICggIi0iICogODAgKSA8PCAiXG4iCisgICAgICBtZXNzYWdlIDw8IEBzb3VyY2UKKyAgICAgIG1lc3NhZ2VbIC0xIF0gPT0gP1xuIG9yIG1lc3NhZ2UgPDwgIlxuIgorICAgICAgbWVzc2FnZSA8PCAoICItIiAqIDgwICkgPDwgIlxuIgorICAgICAgbWVzc2FnZSA8PCAiY291bGQgbm90IGxvY2F0ZSBhIGdyYW1tYXIgbmFtZSBhbmQgdHlwZSBkZWNsYXJhdGlvbiBtYXRjaGluZ1xuIgorICAgICAgbWVzc2FnZSA8PCAiL15ccyoobGV4ZXJ8cGFyc2VyfHRyZWUpP1xzKmdyYW1tYXJccyooXFMrKVxzKjsvIgorICAgIGVsc2UKKyAgICAgIG1lc3NhZ2UgPDwgJ2JhZCBncmFtbWFyIHNvdXJjZSBpbiBmaWxlICVwJyAlIEBmaWxlCisgICAgICBtZXNzYWdlIDw8ICggIi0iICogODAgKSA8PCAiXG4iCisgICAgICBtZXNzYWdlIDw8IEBzb3VyY2UKKyAgICAgIG1lc3NhZ2VbIC0xIF0gPT0gP1xuIG9yIG1lc3NhZ2UgPDwgIlxuIgorICAgICAgbWVzc2FnZSA8PCAoICItIiAqIDgwICkgPDwgIlxuIgorICAgICAgbWVzc2FnZSA8PCAiY291bGQgbm90IGxvY2F0ZSBhIGdyYW1tYXIgbmFtZSBhbmQgdHlwZSBkZWNsYXJhdGlvbiBtYXRjaGluZ1xuIgorICAgICAgbWVzc2FnZSA8PCAiL15ccyoobGV4ZXJ8cGFyc2VyfHRyZWUpP1xzKmdyYW1tYXJccyooXFMrKVxzKjsvIgorICAgIGVuZAorICAgIHN1cGVyKCBtZXNzYWdlICkKKyAgZW5kCitlbmQgIyBlcnJvciBHcmFtbWFyOjpGb3JtYXRFcnJvcgorCitlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3Rva2VuLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3Rva2VuLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzllZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdG9rZW4ucmIKQEAgLTAsMCArMSw2NjEgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworPWJlZ2luIExJQ0VOU0UKKworW1RoZSAiQlNEIGxpY2VuY2UiXQorQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgS3lsZSBZZXR0ZXIKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKK0lNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKK09GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKK05PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCitUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis9ZW5kCisKK21vZHVsZSBBTlRMUjMKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlbgorCitBdCBhIG1pbmltdW0sIHRva2VucyBhcmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYmluZCB0b2dldGhlciBhIGNodW5rIG9mIHRleHQgYW5kCithIGNvcnJlc3BvbmRpbmcgdHlwZSBzeW1ib2wsIHdoaWNoIGNhdGVnb3JpemVzL2NoYXJhY3Rlcml6ZXMgdGhlIGNvbnRlbnQgb2YgdGhlCit0ZXh0LiBUb2tlbnMgYWxzbyB1c3VhbGx5IGNhcnJ5IGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGxvY2F0aW9uIGluIHRoZSBpbnB1dCwKK3N1Y2ggYXMgYWJzb2x1dGUgY2hhcmFjdGVyIGluZGV4LCBsaW5lIG51bWJlciwgYW5kIHBvc2l0aW9uIHdpdGhpbiB0aGUgbGluZSAob3IKK2NvbHVtbikuCisKK0Z1cnRoZXJtb3JlLCBBTlRMUiB0b2tlbnMgYXJlIGFzc2lnbmVkIGEgImNoYW5uZWwiIG51bWJlciwgYW4gZXh0cmEgZGVncmVlIG9mCitjYXRlZ29yaXphdGlvbiB0aGF0IGdyb3VwcyB0aGluZ3Mgb24gYSBsYXJnZXIgc2NhbGUuIFBhcnNlcnMgd2lsbCB1c3VhbGx5IGlnbm9yZQordG9rZW5zIHRoYXQgaGF2ZSBjaGFubmVsIHZhbHVlIDk5ICh0aGUgSElEREVOX0NIQU5ORUwpLCBzbyB5b3UgY2FuIGtlZXAgdGhpbmdzCitsaWtlIGNvbW1lbnQgYW5kIHdoaXRlIHNwYWNlIGh1ZGRsZWQgdG9nZXRoZXIgd2l0aCBuZWlnaGJvcmluZyB0b2tlbnMsCitlZmZlY3RpdmVseSBpZ25vcmluZyB0aGVtIHdpdGhvdXQgZGlzY2FyZGluZyB0aGVtLgorCitBTlRMUiB0b2tlbnMgYWxzbyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBzb3VyY2Ugc3RyZWFtIGZyb20gd2hpY2ggdGhleQorb3JpZ2luYXRlZC4gVG9rZW4gc3RyZWFtcyB3aWxsIGFsc28gcHJvdmlkZSBhbiBpbmRleCB2YWx1ZSBmb3IgdGhlIHRva2VuLCB3aGljaAoraW5kaWNhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9rZW4gcmVsYXRpdmUgdG8gb3RoZXIgdG9rZW5zIGluIHRoZSBzdHJlYW0sCitzdGFydGluZyBhdCB6ZXJvLiBGb3IgZXhhbXBsZSwgdGhlIDIybmQgdG9rZW4gcHVsbGVkIGZyb20gYSBsZXhlciBieQorQ29tbW9uVG9rZW5TdHJlYW0gd2lsbCBoYXZlIGluZGV4IHZhbHVlIDIxLgorCis9PSBUb2tlbiBhcyBhbiBJbnRlcmZhY2UKKworVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGEgdG9rZW4gaW1wbGVtZW50YXRpb24gKHNlZSBDb21tb25Ub2tlbikuIEFkZGl0aW9uYWxseSwKK3lvdSBtYXkgd3JpdGUgeW91ciBvd24gdG9rZW4gY2xhc3MgYXMgbG9uZyBhcyB5b3UgcHJvdmlkZSBtZXRob2RzIHRoYXQgZ2l2ZQorYWNjZXNzIHRvIHRoZSBhdHRyaWJ1dGVzIGV4cGVjdGVkIGJ5IGEgdG9rZW4uIEV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlIEFOVExSCitsaWJyYXJ5IHRyaWVzIHRvIHVzZSBkdWNrLXR5cGluZyB0ZWNobmlxdWVzIGluc3RlYWQgb2YgcHVyZSBvYmplY3Qtb3JpZW50ZWQgdHlwZQorY2hlY2tpbmcsIGl0J3MgYSBnb29kIGlkZWEgdG8gaW5jbHVkZSB0aGlzIEFOVExSMzo6VG9rZW4gaW50byB5b3VyIGN1c3RvbWl6ZWQKK3Rva2VuIGNsYXNzLgorCis9ZW5kCisKK21vZHVsZSBUb2tlbgorICBpbmNsdWRlIEFOVExSMzo6Q29uc3RhbnRzCisgIGluY2x1ZGUgQ29tcGFyYWJsZQorICAKKyAgIyB0aGUgdG9rZW4ncyBhc3NvY2lhdGVkIGNodW5rIG9mIHRleHQKKyAgYXR0cl9hY2Nlc3NvciA6dGV4dAorICAKKyAgIyB0aGUgaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuJ3MgdHlwZQorICBhdHRyX2FjY2Vzc29yIDp0eXBlCisgIAorICAjIHRoZSB0ZXh0J3Mgc3RhcnRpbmcgbGluZSBudW1iZXIgd2l0aGluIHRoZSBzb3VyY2UgKGluZGV4ZWQgc3RhcnRpbmcgYXQgMSkKKyAgYXR0cl9hY2Nlc3NvciA6bGluZQorICAKKyAgIyB0aGUgdGV4dCdzIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBsaW5lIHdpdGhpbiB0aGUgc291cmNlIChpbmRleGVkIHN0YXJ0aW5nIGF0IDApCisgIGF0dHJfYWNjZXNzb3IgOmNvbHVtbgorICAKKyAgIyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgY2hhbm5lbCB0byB3aGljaCB0aGUgdG9rZW4gaXMgYXNzaWduZWQKKyAgYXR0cl9hY2Nlc3NvciA6Y2hhbm5lbAorICAKKyAgIyB0aGUgaW5kZXggb2YgdGhlIHRva2VuIHdpdGggcmVzcGVjdCB0byBvdGhlciB0aGUgb3RoZXIgdG9rZW5zIHByb2R1Y2VkIGR1cmluZyBsZXhpbmcKKyAgYXR0cl9hY2Nlc3NvciA6aW5kZXgKKyAgCisgICMgYSByZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIHRoZSB0b2tlbiB3YXMgZXh0cmFjdGVkCisgIGF0dHJfYWNjZXNzb3IgOmlucHV0CisgIAorICAjIHRoZSBhYnNvbHV0ZSBjaGFyYWN0ZXIgaW5kZXggaW4gdGhlIGlucHV0IGF0IHdoaWNoIHRoZSB0ZXh0IHN0YXJ0cworICBhdHRyX2FjY2Vzc29yIDpzdGFydAorICAKKyAgIyB0aGUgYWJzb2x1dGUgY2hhcmFjdGVyIGluZGV4IGluIHRoZSBpbnB1dCBhdCB3aGljaCB0aGUgdGV4dCBlbmRzCisgIGF0dHJfYWNjZXNzb3IgOnN0b3AKKworICBhbGlhcyA6aW5wdXRfc3RyZWFtIDppbnB1dAorICBhbGlhcyA6aW5wdXRfc3RyZWFtPSA6aW5wdXQ9CisgIGFsaWFzIDp0b2tlbl9pbmRleCA6aW5kZXgKKyAgYWxpYXMgOnRva2VuX2luZGV4PSA6aW5kZXg9CisgIAorICAjCisgICMgVGhlIG1hdGNoIG9wZXJhdG9yIGhhcyBiZWVuIGltcGxlbWVudGVkIHRvIG1hdGNoIGFnYWluc3Qgc2V2ZXJhbCBkaWZmZXJlbnQKKyAgIyBhdHRyaWJ1dGVzIG9mIGEgdG9rZW4gZm9yIGNvbnZlbmllbmNlIGluIHF1aWNrIHNjcmlwdHMKKyAgIworICAjIEBleGFtcGxlIE1hdGNoIGFnYWluc3QgYW4gaW50ZWdlciB0b2tlbiB0eXBlIGNvbnN0YW50CisgICMgICB0b2tlbiA9fiBWQVJJQUJMRV9OQU1FICAgPT4gdHJ1ZS9mYWxzZQorICAjIEBleGFtcGxlIE1hdGNoIGFnYWluc3QgYSB0b2tlbiB0eXBlIG5hbWUgYXMgYSBTeW1ib2wKKyAgIyAgIHRva2VuID1+IDpGTE9BVCAgICAgICAgICA9PiB0cnVlL2ZhbHNlCisgICMgQGV4YW1wbGUgTWF0Y2ggdGhlIHRva2VuIHRleHQgYWdhaW5zdCBhIFJlZ3VsYXIgRXhwcmVzc2lvbgorICAjICAgdG9rZW4gPX4gL15AW2Etel9dXHcqJC9pCisgICMgQGV4YW1wbGUgQ29tcGFyZSB0aGUgdG9rZW4ncyB0ZXh0IHRvIGEgc3RyaW5nCisgICMgICB0b2tlbiA9fiAiY2xhc3MiCisgICMgCisgIGRlZiA9fiBvYmoKKyAgICBjYXNlIG9iagorICAgIHdoZW4gSW50ZWdlciB0aGVuIHR5cGUgPT0gb2JqCisgICAgd2hlbiBTeW1ib2wgdGhlbiBuYW1lID09IG9iai50b19zCisgICAgd2hlbiBSZWdleHAgdGhlbiBvYmogPX4gdGV4dAorICAgIHdoZW4gU3RyaW5nIHRoZW4gdGV4dCA9PSBvYmoKKyAgICBlbHNlIHN1cGVyCisgICAgZW5kCisgIGVuZAorICAKKyAgIworICAjIFRva2VucyBhcmUgY29tcGFyYWJsZSBieSB0aGVpciBzdHJlYW0gaW5kZXggdmFsdWVzCisgICMgCisgIGRlZiA8PT4gdGsyCisgICAgaW5kZXggPD0+IHRrMi5pbmRleAorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplX2NvcHkoIG9yaWcgKQorICAgIHNlbGYuaW5kZXggICA9IC0xCisgICAgc2VsZi50eXBlICAgID0gb3JpZy50eXBlCisgICAgc2VsZi5jaGFubmVsID0gb3JpZy5jaGFubmVsCisgICAgc2VsZi50ZXh0ICAgID0gb3JpZy50ZXh0LmNsb25lIGlmIG9yaWcudGV4dAorICAgIHNlbGYuc3RhcnQgICA9IG9yaWcuc3RhcnQKKyAgICBzZWxmLnN0b3AgICAgPSBvcmlnLnN0b3AKKyAgICBzZWxmLmxpbmUgICAgPSBvcmlnLmxpbmUKKyAgICBzZWxmLmNvbHVtbiAgPSBvcmlnLmNvbHVtbgorICAgIHNlbGYuaW5wdXQgICA9IG9yaWcuaW5wdXQKKyAgZW5kCisgIAorICBkZWYgY29uY3JldGU/CisgICAgaW5wdXQgJiYgc3RhcnQgJiYgc3RvcCA/IHRydWUgOiBmYWxzZQorICBlbmQKKyAgCisgIGRlZiBpbWFnaW5hcnk/CisgICAgaW5wdXQgJiYgc3RhcnQgJiYgc3RvcCA/IGZhbHNlIDogdHJ1ZQorICBlbmQKKyAgCisgIGRlZiBuYW1lCisgICAgdG9rZW5fbmFtZSggdHlwZSApCisgIGVuZAorICAKKyAgZGVmIHNvdXJjZV9uYW1lCisgICAgaSA9IGlucHV0IGFuZCBpLnNvdXJjZV9uYW1lCisgIGVuZAorICAKKyAgZGVmIGhpZGRlbj8KKyAgICBjaGFubmVsID09IEhJRERFTl9DSEFOTkVMCisgIGVuZAorICAKKyAgZGVmIHNvdXJjZV90ZXh0CisgICAgY29uY3JldGU/ID8gaW5wdXQuc3Vic3RyaW5nKCBzdGFydCwgc3RvcCApIDogdGV4dAorICBlbmQKKyAgCisgICMKKyAgIyBTZXRzIHRoZSB0b2tlbidzIGNoYW5uZWwgdmFsdWUgdG8gSElEREVOX0NIQU5ORUwKKyAgIyAKKyAgZGVmIGhpZGUhCisgICAgc2VsZi5jaGFubmVsID0gSElEREVOX0NIQU5ORUwKKyAgZW5kCisgIAorICBkZWYgaW5zcGVjdAorICAgIHRleHRfaW5zcGVjdCAgICA9IHRleHQgID8gIlsjeyB0ZXh0Lmluc3BlY3QgfV0gIiA6ICcgJworICAgIHRleHRfcG9zaXRpb24gICA9IGxpbmUgPiAwICA/ICJAIGxpbmUgI3sgbGluZSB9IGNvbCAjeyBjb2x1bW4gfSAiIDogJycKKyAgICBzdHJlYW1fcG9zaXRpb24gPSBzdGFydCA/ICIoI3sgcmFuZ2UuaW5zcGVjdCB9KSIgOiAnJworICAgIAorICAgIGZyb250ID0gIGluZGV4ID49IDAgPyAiI3sgaW5kZXggfSAiIDogJycKKyAgICByZXAgPSBmcm9udCA8PCBuYW1lIDw8IHRleHRfaW5zcGVjdCA8PAorICAgICAgICAgICAgICAgIHRleHRfcG9zaXRpb24gPDwgc3RyZWFtX3Bvc2l0aW9uCisgICAgcmVwLnN0cmlwIQorICAgIGNoYW5uZWwgPT0gREVGQVVMVF9DSEFOTkVMIG9yIHJlcCA8PCAiICgjeyBjaGFubmVsLnRvX3MgfSkiCisgICAgcmV0dXJuKCByZXAgKQorICBlbmQKKyAgCisgIGRlZiBwcmV0dHlfcHJpbnQoIHByaW50ZXIgKQorICAgIHByaW50ZXIudGV4dCggaW5zcGVjdCApCisgIGVuZAorICAKKyAgZGVmIHJhbmdlCisgICAgc3RhcnQuLnN0b3AgcmVzY3VlIG5pbAorICBlbmQKKyAgCisgIGRlZiB0b19pCisgICAgaW5kZXgudG9faQorICBlbmQKKyAgCisgIGRlZiB0b19zCisgICAgdGV4dC50b19zCisgIGVuZAorICAKK3ByaXZhdGUKKyAgCisgIGRlZiB0b2tlbl9uYW1lKCB0eXBlICkKKyAgICBCVUlMVF9JTl9UT0tFTl9OQU1FU1sgdHlwZSBdCisgIGVuZAorZW5kCisKK0NvbW1vblRva2VuID0gU3RydWN0Lm5ldyggOnR5cGUsIDpjaGFubmVsLCA6dGV4dCwgOmlucHV0LCA6c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgOnN0b3AsIDppbmRleCwgOmxpbmUsIDpjb2x1bW4gKQorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkNvbW1vblRva2VuCisKK1RoZSBiYXNlIGNsYXNzIGZvciB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgVG9rZW4uIEl0IGlzIGltcGxlbWVudGVkIGFzIGEKK3NpbXBsZSBTdHJ1Y3QgYXMgdG9rZW5zIGFyZSBiYXNpY2FsbHkgc2ltcGxlIGRhdGEgc3RydWN0dXJlcyBiaW5kaW5nIHRvZ2V0aGVyIGEKK2J1bmNoIG9mIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBhbmQgU3RydWN0cyBhcmUgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gYSBzdGFuZGFyZAorT2JqZWN0IHdpdGggYWNjZXNzb3IgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbi4KKworQnkgZGVmYXVsdCwgQU5UTFIgZ2VuZXJhdGVkIHJ1YnkgY29kZSB3aWxsIHByb3ZpZGUgYSBjdXN0b21pemVkIHN1YmNsYXNzIG9mCitDb21tb25Ub2tlbiB0byB0cmFjayB0b2tlbi10eXBlIG5hbWVzIGVmZmljaWVudGx5IGZvciBkZWJ1Z2dpbmcsIGluc3BlY3Rpb24sIGFuZAorZ2VuZXJhbCB1dGlsaXR5LiBUaHVzIGNvZGUgZ2VuZXJhdGVkIGZvciBhIHN0YW5kYXJkIGNvbWJvIGxleGVyLXBhcnNlciBncmFtbWFyCituYW1lZCBYWVogd2lsbCBoYXZlIGEgYmFzZSBtb2R1bGUgbmFtZWQgWFlaIGFuZCBhIGN1c3RvbWl6ZWQgQ29tbW9uVG9rZW4KK3N1YmNsYXNzIG5hbWVkIFhZWjo6VG9rZW4uCisKK0hlcmUgaXMgdGhlIHRva2VuIHN0cnVjdHVyZSBhdHRyaWJ1dGUgbGlzdCBpbiBvcmRlcjoKKworKiA8dHQ+dHlwZTwvdHQ+CisqIDx0dD5jaGFubmVsPC90dD4KKyogPHR0PnRleHQ8L3R0PgorKiA8dHQ+aW5wdXQ8L3R0PgorKiA8dHQ+c3RhcnQ8L3R0PgorKiA8dHQ+c3RvcDwvdHQ+CisqIDx0dD5pbmRleDwvdHQ+CisqIDx0dD5saW5lPC90dD4KKyogPHR0PmNvbHVtbjwvdHQ+CisKKz1lbmQKKworY2xhc3MgQ29tbW9uVG9rZW4KKyAgaW5jbHVkZSBUb2tlbgorICBERUZBVUxUX1ZBTFVFUyA9IHsgCisgICAgOmNoYW5uZWwgPT4gREVGQVVMVF9DSEFOTkVMLAorICAgIDppbmRleCAgID0+IC0xLAorICAgIDpsaW5lICAgID0+ICAwLAorICAgIDpjb2x1bW4gID0+IC0xCisgIH0uZnJlZXplCisgIAorICBkZWYgc2VsZi50b2tlbl9uYW1lKCB0eXBlICkKKyAgICBCVUlMVF9JTl9UT0tFTl9OQU1FU1sgdHlwZSBdCisgIGVuZAorICAKKyAgZGVmIHNlbGYuY3JlYXRlKCBmaWVsZHMgPSB7fSApCisgICAgZmllbGRzID0gREVGQVVMVF9WQUxVRVMubWVyZ2UoIGZpZWxkcyApCisgICAgYXJncyA9IG1lbWJlcnMubWFwIHsgfG5hbWV8IGZpZWxkc1sgbmFtZS50b19zeW0gXSB9CisgICAgbmV3KCAqYXJncyApCisgIGVuZAorICAKKyAgIyBhbGxvd3MgeW91IHRvIG1ha2UgYSBjb3B5IG9mIGEgdG9rZW4gd2l0aCBhIGRpZmZlcmVudCBjbGFzcworICBkZWYgc2VsZi5mcm9tX3Rva2VuKCB0b2tlbiApCisgICAgbmV3KCAKKyAgICAgIHRva2VuLnR5cGUsICB0b2tlbi5jaGFubmVsLCB0b2tlbi50ZXh0ID8gdG9rZW4udGV4dC5jbG9uZSA6IG5pbCwKKyAgICAgIHRva2VuLmlucHV0LCB0b2tlbi5zdGFydCwgICB0b2tlbi5zdG9wLCAtMSwgdG9rZW4ubGluZSwgdG9rZW4uY29sdW1uCisgICAgKQorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplKCB0eXBlID0gbmlsLCBjaGFubmVsID0gREVGQVVMVF9DSEFOTkVMLCB0ZXh0ID0gbmlsLAorICAgICAgICAgICAgICAgICBpbnB1dCA9IG5pbCwgc3RhcnQgPSBuaWwsIHN0b3AgPSBuaWwsIGluZGV4ID0gLTEsCisgICAgICAgICAgICAgICAgIGxpbmUgPSAwLCBjb2x1bW4gPSAtMSApCisgICAgc3VwZXIKKyAgICBibG9ja19naXZlbj8gYW5kIHlpZWxkKCBzZWxmICkKKyAgICBzZWxmLnRleHQubmlsPyAmJiBzZWxmLnN0YXJ0ICYmIHNlbGYuc3RvcCBhbmQKKyAgICAgIHNlbGYudGV4dCA9IHNlbGYuaW5wdXQuc3Vic3RyaW5nKCBzZWxmLnN0YXJ0LCBzZWxmLnN0b3AgKQorICBlbmQKKyAgCisgIGFsaWFzIDppbnB1dF9zdHJlYW0gOmlucHV0CisgIGFsaWFzIDppbnB1dF9zdHJlYW09IDppbnB1dD0KKyAgYWxpYXMgOnRva2VuX2luZGV4IDppbmRleAorICBhbGlhcyA6dG9rZW5faW5kZXg9IDppbmRleD0KK2VuZAorCittb2R1bGUgQ29uc3RhbnRzCisgIAorICAjIEVuZCBvZiBGaWxlIC8gRW5kIG9mIElucHV0IGNoYXJhY3RlciBhbmQgdG9rZW4gdHlwZQorICBFT0ZfVE9LRU4gPSBDb21tb25Ub2tlbi5uZXcoIEVPRiApLmZyZWV6ZQorICBJTlZBTElEX1RPS0VOID0gQ29tbW9uVG9rZW4ubmV3KCBJTlZBTElEX1RPS0VOX1RZUEUgKS5mcmVlemUKKyAgU0tJUF9UT0tFTiA9IENvbW1vblRva2VuLm5ldyggSU5WQUxJRF9UT0tFTl9UWVBFICkuZnJlZXplICAKK2VuZAorCisKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpUb2tlblNvdXJjZQorCitUb2tlblNvdXJjZSBpcyBhIHNpbXBsZSBtaXhpbiBtb2R1bGUgdGhhdCBkZW1hbmRzIGFuCitpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kICNuZXh0X3Rva2VuLiBJbiByZXR1cm4sIGl0CitkZWZpbmVzIG1ldGhvZHMgI25leHQgYW5kICNlYWNoLCB3aGljaCBwcm92aWRlIGJhc2ljCitpdGVyYXRvciBtZXRob2RzIGZvciB0b2tlbiBnZW5lcmF0b3JzLiBGdXJ0aGVybW9yZSwgaXQKK2luY2x1ZGVzIEVudW1lcmFibGUgdG8gcHJvdmlkZSB0aGUgc3RhbmRhcmQgUnVieSBpdGVyYXRpb24KK21ldGhvZHMgdG8gdG9rZW4gZ2VuZXJhdG9ycywgbGlrZSBsZXhlcnMuCisKKz1lbmQKKworbW9kdWxlIFRva2VuU291cmNlCisgIGluY2x1ZGUgQ29uc3RhbnRzCisgIGluY2x1ZGUgRW51bWVyYWJsZQorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgCisgIGFic3RyYWN0IDpuZXh0X3Rva2VuCisgIAorICBkZWYgbmV4dAorICAgIHRva2VuID0gbmV4dF90b2tlbigpCisgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbiBpZiB0b2tlbi5uaWw/IHx8IHRva2VuLnR5cGUgPT0gRU9GCisgICAgcmV0dXJuIHRva2VuCisgIGVuZAorICAKKyAgZGVmIGVhY2gKKyAgICBibG9ja19naXZlbj8gb3IgcmV0dXJuIGVudW1fZm9yKCA6ZWFjaCApCisgICAgd2hpbGUgdG9rZW4gPSBuZXh0X3Rva2VuIGFuZCB0b2tlbi50eXBlICE9IEVPRgorICAgICAgeWllbGQoIHRva2VuICkKKyAgICBlbmQKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKworICBkZWYgdG9fc3RyZWFtKCBvcHRpb25zID0ge30gKQorICAgIGlmIGJsb2NrX2dpdmVuPworICAgICAgQ29tbW9uVG9rZW5TdHJlYW0ubmV3KCBzZWxmLCBvcHRpb25zICkgeyB8IHQsIHN0cmVhbSB8IHlpZWxkKCB0LCBzdHJlYW0gKSB9CisgICAgZWxzZQorICAgICAgQ29tbW9uVG9rZW5TdHJlYW0ubmV3KCBzZWxmLCBvcHRpb25zICkKKyAgICBlbmQKKyAgZW5kCitlbmQKKworCis9YmVnaW4gcmRvYyBBTlRMUjM6OlRva2VuRmFjdG9yeQorCitUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBlbnRpdGllcyB0aHJvdWdob3V0IHRoZSBBTlRMUiBydW50aW1lIGxpYnJhcnkKK3RoYXQgbmVlZCB0byBjcmVhdGUgdG9rZW4gb2JqZWN0cyBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgYSBtaXhpbiB0aGF0IHByb3ZpZGVzCittZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgdG9rZW5zLgorCitJbmNsdWRpbmcgdGhpcyBtb2R1bGUgcHJvdmlkZXMgYSArdG9rZW5fY2xhc3MrIGF0dHJpYnV0ZS4gSW5zdGFuY2Ugb2YgdGhlCitpbmNsdWRpbmcgY2xhc3MgY2FuIGNyZWF0ZSB0b2tlbnMgdXNpbmcgdGhlIHRva2VuIGNsYXNzICh3aGljaCBkZWZhdWx0cyB0bworQU5UTFIzOjpDb21tb25Ub2tlbikuIFRva2VuIGNsYXNzZXMgYXJlIHByZXN1bWVkIHRvIGhhdmUgYW4gI2luaXRpYWxpemUgbWV0aG9kCit0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVycyBhbmQgdGhlIHRva2VuIG9iamVjdHMgYXJlIGV4cGVjdGVkIHRvCitoYXZlIHRoZSBzdGFuZGFyZCB0b2tlbiBhdHRyaWJ1dGVzIChzZWUgQU5UTFIzOjpUb2tlbikuCisKKz1lbmQKKworbW9kdWxlIFRva2VuRmFjdG9yeQorICBhdHRyX3dyaXRlciA6dG9rZW5fY2xhc3MKKyAgZGVmIHRva2VuX2NsYXNzCisgICAgQHRva2VuX2NsYXNzIHx8PSBiZWdpbgorICAgICAgc2VsZi5jbGFzcy50b2tlbl9jbGFzcyByZXNjdWUKKyAgICAgIHNlbGY6OlRva2VuIHJlc2N1ZQorICAgICAgQU5UTFIzOjpDb21tb25Ub2tlbgorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBjcmVhdGVfdG9rZW4oICphcmdzICkKKyAgICBpZiBibG9ja19naXZlbj8KKyAgICAgIHRva2VuX2NsYXNzLm5ldyggKmFyZ3MgKSBkbyB8KnRhcmdzfAorICAgICAgICB5aWVsZCggKnRhcmdzICkKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHRva2VuX2NsYXNzLm5ldyggKmFyZ3MgKQorICAgIGVuZAorICBlbmQKK2VuZAorCisKKz1iZWdpbiByZG9jIEFOVExSMzo6VG9rZW5TY2hlbWUKKworVG9rZW5TY2hlbWVzIGV4aXN0IHRvIGhhbmRsZSB0aGUgcHJvYmxlbSBvZiBkZWZpbmluZyB0b2tlbiB0eXBlcyBhcyBpbnRlZ2VyCit2YWx1ZXMgd2hpbGUgbWFpbnRhaW5pbmcgbWVhbmluZ2Z1bCB0ZXh0IG5hbWVzIGZvciB0aGUgdHlwZXMuIFRoZXkgYXJlCitkeW5hbWljYWxseSBkZWZpbmVkIG1vZHVsZXMgdGhhdCBtYXAgaW50ZWdlciB2YWx1ZXMgdG8gY29uc3RhbnRzIHdpdGggdG9rZW4tdHlwZQorbmFtZXMuCisKKy0tLQorCitGdW5kYW1lbnRhbGx5LCB0b2tlbnMgZXhpc3QgdG8gdGFrZSBhIGNodW5rIG9mIHRleHQgYW5kIGlkZW50aWZ5IGl0IGFzIGJlbG9uZ2luZwordG8gc29tZSBjYXRlZ29yeSwgbGlrZSAiVkFSSUFCTEUiIG9yICJJTlRFR0VSIi4gSW4gY29kZSwgdGhlIGNhdGVnb3J5IGlzCityZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyIC0tIHNvbWUgYXJiaXRyYXJ5IHZhbHVlIHRoYXQgQU5UTFIgd2lsbCBkZWNpZGUgdG8gdXNlCithcyBpdCBpcyBjcmVhdGluZyB0aGUgcmVjb2duaXplci4gVGhlIHB1cnBvc2Ugb2YgdXNpbmcgYW4gaW50ZWdlciAoaW5zdGVhZCBvZgorc2F5LCBhIHJ1Ynkgc3ltYm9sKSBpcyB0aGF0IEFOVExSJ3MgZGVjaXNpb24gbG9naWMgb2Z0ZW4gbmVlZHMgdG8gdGVzdCB3aGV0aGVyIGEKK3Rva2VuJ3MgdHlwZSBmYWxscyB3aXRoaW4gYSByYW5nZSwgd2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGggc3ltYm9scy4KKworVGhlIGRvd25zaWRlIG9mIHRva2VuIHR5cGVzIGJlaW5nIHJlcHJlc2VudGVkIGFzIGludGVnZXJzIGlzIHRoYXQgYSBkZXZlbG9wZXIKK25lZWRzIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlIHRoZSB1bmtub3duIHR5cGUgdmFsdWUgYnkgbmFtZSBpbiBhY3Rpb24gY29kZS4KK0Z1cnRoZXJtb3JlLCBjb2RlIHRoYXQgcmVmZXJlbmNlcyB0aGUgdHlwZSBieSBuYW1lIGFuZCB0b2tlbnMgdGhhdCBjYW4gYmUKK2luc3BlY3RlZCB3aXRoIG5hbWVzIGluIHBsYWNlIG9mIHR5cGUgdmFsdWVzIGFyZSBtb3JlIG1lYW5pbmdmdWwgdG8gYSBkZXZlbG9wZXIuCisKK1NpbmNlIEFOVExSIHJlcXVpcmVzIHRva2VuIHR5cGUgbmFtZXMgdG8gZm9sbG93IGNhcGl0YWwtbGV0dGVyIG5hbWluZworY29udmVudGlvbnMsIGRlZmluaW5nIHR5cGVzIGFzIG5hbWVkIGNvbnN0YW50cyBvZiB0aGUgcmVjb2duaXplciBjbGFzcyByZXNvbHZlcwordGhlIHByb2JsZW0gb2YgcmVmZXJlbmNpbmcgdHlwZSB2YWx1ZXMgYnkgbmFtZS4gVGh1cywgYSB0b2tlbiB0eXBlIGxpa2UKK2BgVkFSSUFCTEUnJyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBudW1iZXIgbGlrZSA1IGFuZCByZWZlcmVuY2VkIHdpdGhpbiBjb2RlIGJ5CisrVkFSSUFCTEUrLiBIb3dldmVyLCB3aGVuIGEgcmVjb2duaXplciBjcmVhdGVzIHRva2VucywgdGhlIG5hbWUgb2YgdGhlIHRva2VuJ3MKK3R5cGUgY2Fubm90IGJlIHNlZW4gd2l0aG91dCB1c2luZyB0aGUgZGF0YSBkZWZpbmVkIGluIHRoZSByZWNvZ25pemVyLgorCitPZiBjb3Vyc2UsIHRva2VucyBjb3VsZCBiZSBkZWZpbmVkIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSB0aGF0IGNvdWxkIGJlIHNwZWNpZmllZAord2hlbiB0b2tlbnMgYXJlIGNyZWF0ZWQuIEhvd2V2ZXIsIGRvaW5nIHNvIHdvdWxkIG1ha2UgdG9rZW5zIHRha2UgdXAgbW9yZSBzcGFjZQordGhhbiBuZWNlc3NhcnksIGFzIHdlbGwgYXMgbWFraW5nIGl0IGRpZmZpY3VsdCB0byBjaGFuZ2UgdGhlIHR5cGUgb2YgYSB0b2tlbgord2hpbGUgbWFpbnRhaW5pbmcgYSBjb3JyZWN0IG5hbWUgdmFsdWUuCisKK1Rva2VuU2NoZW1lcyBleGlzdCBhcyBhIHRlY2huaXF1ZSB0byBtYW5hZ2UgdG9rZW4gdHlwZSByZWZlcmVuY2luZyBhbmQgbmFtZQorZXh0cmFjdGlvbi4gVGhleToKKworMS4ga2VlcCB0b2tlbiB0eXBlIHJlZmVyZW5jZXMgY2xlYXIgYW5kIHVuZGVyc3RhbmRhYmxlIGluIHJlY29nbml6ZXIgY29kZQorMi4gcGVybWl0IGFjY2VzcyB0byBhIHRva2VuJ3MgdHlwZS1uYW1lIGluZGVwZW5kZW50bHkgb2YgcmVjb2duaXplciBvYmplY3RzCiszLiBhbGxvdyBtdWx0aXBsZSBjbGFzc2VzIHRvIHNoYXJlIHRoZSBzYW1lIHRva2VuIGluZm9ybWF0aW9uCisKKz09IEJ1aWxkaW5nIFRva2VuIFNjaGVtZXMKKworVG9rZW5TY2hlbWUgaXMgYSBzdWJjbGFzcyBvZiBNb2R1bGUuIFRodXMsIGl0IGhhcyB0aGUgbWV0aG9kCis8dHQ+VG9rZW5TY2hlbWUubmV3KHRrX2NsYXNzID0gbmlsKSB7IC4uLiBtb2R1bGUtbGV2ZWwgY29kZSAuLi59PC90dD4sIHdoaWNoCit3aWxsIGV2YWx1YXRlIHRoZSBibG9jayBpbiB0aGUgY29udGV4dCBvZiB0aGUgc2NoZW1lIChtb2R1bGUpLCBzaW1pbGFybHkgdG8KK01vZHVsZSNtb2R1bGVfZXZhbC4gQmVmb3JlIGV2YWx1YXRpbmcgdGhlIGJsb2NrLCA8dHQ+Lm5ldzwvdHQ+IHdpbGwgc2V0dXAgdGhlCittb2R1bGUgd2l0aCB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisKKzEuIGRlZmluZSBhIGN1c3RvbWl6ZWQgdG9rZW4gY2xhc3MgKG1vcmUgb24gdGhhdCBiZWxvdykKKzIuIGFkZCBhIG5ldyBjb25zdGFudCwgVE9LRU5fTkFNRVMsIHdoaWNoIGlzIGEgaGFzaCB0aGF0IG1hcHMgdHlwZXMgdG8gbmFtZXMKKzMuIGR5bmFtaWNhbGx5IHBvcHVsYXRlIHRoZSBuZXcgc2NoZW1lIG1vZHVsZSB3aXRoIGEgY291cGxlIGluc3RhbmNlIG1ldGhvZHMKKzQuIGluY2x1ZGUgQU5UTFIzOjpDb25zdGFudHMgaW4gdGhlIG5ldyBzY2hlbWUgbW9kdWxlCisKK0FzIFRva2VuU2NoZW1lIHRoZSBjbGFzcyBmdW5jdGlvbnMgYXMgYSBtZXRhY2xhc3MsIGZpZ3VyaW5nIG91dCBzb21lIG9mIHRoZQorc2NvcGluZyBiZWhhdmlvciBjYW4gYmUgbWlsZGx5IGNvbmZ1c2luZyBpZiB5b3UncmUgdHJ5aW5nIHRvIGdldCBhIGhhbmRsZSBvZiB0aGUKK2VudGl0eSBmb3IgeW91ciBvd24gcHVycG9zZXMuIFJlbWVtYmVyIHRoYXQgYWxsIG9mIHRoZSBpbnN0YW5jZSBtZXRob2RzIG9mCitUb2tlblNjaGVtZSBmdW5jdGlvbiBhcyBtb2R1bGUtbGV2ZWwgbWV0aG9kcyBvZiBUb2tlblNjaGVtZSBpbnN0YW5jZXMsIGFsYQorK2F0dHJfYWNjZXNzb3IrIGFuZCBmcmllbmRzLgorCis8dHQ+VG9rZW5TY2hlbWUjZGVmaW5lX3Rva2VuKG5hbWVfc3ltYm9sLCBpbnRfdmFsdWUpPC90dD4gYWRkcyBhIGNvbnN0YW50CitkZWZpbml0aW9uIDx0dD5uYW1lX3N5bWJvbDwvdHQ+IHdpdGggdGhlIHZhbHVlIDx0dD5pbnRfdmFsdWU8L3R0Pi4gSXQgaXMKK2Vzc2VudGlhbGx5IGxpa2UgPHR0Pk1vZHVsZSNjb25zdF9zZXQ8L3R0PiwgZXhjZXB0IGl0IGZvcmJpZHMgY29uc3RhbnQKK292ZXJ3cml0aW5nICh3aGljaCB3b3VsZCBtZXNzIHVwIHJlY29nbml6ZXIgY29kZSBmYWlybHkgYmFkbHkpIGFuZCBhZGRzIGFuCitpbnZlcnNlIHR5cGUtdG8tbmFtZSBtYXAgdG8gaXRzIG93biA8dHQ+VE9LRU5fTkFNRVM8L3R0PiB0YWJsZS4KKzx0dD5Ub2tlblNjaGVtZSNkZWZpbmVfdG9rZW5zPC90dD4gaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGRlZmluaW5nIG1hbnkKK3R5cGVzIHdpdGggYSBoYXNoIHBhaXJpbmcgbmFtZXMgdG8gdmFsdWVzLgorCis8dHQ+VG9rZW5TY2hlbWUjcmVnaXN0ZXJfbmFtZSh2YWx1ZSwgbmFtZV9zdHJpbmcpPC90dD4gc3BlY2lmaWVzIGEgY3VzdG9tCit0eXBlLXRvLW5hbWUgZGVmaW5pdGlvbi4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB0aGUgYW5vbnltb3VzIHRva2VucwordGhhdCBBTlRMUiBnZW5lcmF0ZXMgZm9yIGxpdGVyYWwgc3RyaW5ncyBpbiB0aGUgZ3JhbW1hciBzcGVjaWZpY2F0aW9uLiBGb3IKK2V4YW1wbGUsIGlmIHlvdSByZWZlciB0byB0aGUgbGl0ZXJhbCA8dHQ+Jz0nPC90dD4gaW4gc29tZSBwYXJzZXIgcnVsZSBpbiB5b3VyCitncmFtbWFyLCBBTlRMUiB3aWxsIGFkZCBhIGxleGVyIHJ1bGUgZm9yIHRoZSBsaXRlcmFsIGFuZCBnaXZlIHRoZSB0b2tlbiBhIG5hbWUKK2xpa2UgPHR0PlRfXzxpPng8L2k+PC90dD4sIHdoZXJlIDx0dD48aT54PC9pPjwvdHQ+IGlzIHRoZSB0eXBlJ3MgaW50ZWdlciB2YWx1ZS4KK1NpbmNlIHRoaXMgaXMgcHJldHR5IG1lYW5pbmdsZXNzIHRvIGEgZGV2ZWxvcGVyLCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgYWRkIGEKK3NwZWNpYWwgbmFtZSBkZWZpbml0aW9uIGZvciB0eXBlIHZhbHVlIDx0dD48aT54PC9pPjwvdHQ+IHdpdGggdGhlIHN0cmluZworPHR0PiInPSciPC90dD4uCisKKz09PSBTYW1wbGUgVG9rZW5TY2hlbWUgQ29uc3RydWN0aW9uCisKKyAgVG9rZW5EYXRhID0gQU5UTFIzOjpUb2tlblNjaGVtZS5uZXcgZG8KKyAgICBkZWZpbmVfdG9rZW5zKAorICAgICAgOklOVCAgPT4gNCwKKyAgICAgIDpJRCAgID0+IDYsCisgICAgICA6VF9fNSA9PiA1LAorICAgICAgOldTICAgPT4gNworICAgICkKKyAgICAKKyAgICAjIG5vdGUgdGhlIHNlbGY6OiBzY29waW5nIGJlbG93IGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0CisgICAgIyBydWJ5IGxleGljYWxseS1zY29wZXMgY29uc3RhbnQgbmFtZXMgaW5zdGVhZCBvZgorICAgICMgbG9va2luZyB1cCBpbiB0aGUgY3VycmVudCBzY29wZQorICAgIHJlZ2lzdGVyX25hbWUoc2VsZjo6VF9fNSwgIic9JyIpCisgIGVuZAorICAKKyAgVG9rZW5EYXRhOjpJRCAgICAgICAgICAgIyA9PiA2CisgIFRva2VuRGF0YTo6VF9fNSAgICAgICAgICMgPT4gNQorICBUb2tlbkRhdGEudG9rZW5fbmFtZSg0KSAjID0+ICdJTlQnCisgIFRva2VuRGF0YS50b2tlbl9uYW1lKDUpICMgPT4gIic9JyIKKyAgCisgIGNsYXNzIEFSZWNvZ25pemVyT3JTdWNoIDwgQU5UTFIzOjpQYXJzZXIKKyAgICBpbmNsdWRlIFRva2VuRGF0YQorICAgIElEICAgIyA9PiA2CisgIGVuZAorCis9PSBDdXN0b20gVG9rZW4gQ2xhc3NlcyBhbmQgUmVsYXRpb25zaGlwIHdpdGggVG9rZW5zCisKK1doZW4gYSBUb2tlblNjaGVtZSBpcyBjcmVhdGVkLCBpdCB3aWxsIGRlZmluZSBhIHN1YmNsYXNzIG9mIEFOVExSMzo6Q29tbW9uVG9rZW4KK2FuZCBhc3NpZ25lZCBpdCB0byB0aGUgY29uc3RhbnQgbmFtZSArVG9rZW4rLiBUaGlzIHRva2VuIGNsYXNzIHdpbGwgYm90aCBpbmNsdWRlCithbmQgZXh0ZW5kIHRoZSBzY2hlbWUgbW9kdWxlLiBTaW5jZSB0b2tlbiBzY2hlbWVzIGRlZmluZSB0aGUgcHJpdmF0ZSBpbnN0YW5jZQorbWV0aG9kIDx0dD50b2tlbl9uYW1lKHR5cGUpPC90dD4sIGluc3RhbmNlcyBvZiB0aGUgdG9rZW4gY2xhc3MgYXJlIG5vdyBhYmxlIHRvCitwcm92aWRlIHRoZWlyIHR5cGUgbmFtZXMuIFRoZSBUb2tlbiBtZXRob2QgPHR0Pm5hbWU8L3R0PiB1c2VzIHRoZQorPHR0PnRva2VuX25hbWU8L3R0PiBtZXRob2QgdG8gcHJvdmlkZSB0aGUgdHlwZSBuYW1lIGFzIGlmIGl0IHdlcmUgYSBzaW1wbGUKK2F0dHJpYnV0ZSB3aXRob3V0IHN0b3JpbmcgdGhlIG5hbWUgaXRzZWxmLgorCitXaGVuIGEgVG9rZW5TY2hlbWUgaXMgaW5jbHVkZWQgaW4gYSByZWNvZ25pemVyIGNsYXNzLCB0aGUgY2xhc3Mgd2lsbCBub3cgaGF2ZQordGhlIHRva2VuIHR5cGVzIGFzIG5hbWVkIGNvbnN0YW50cywgYSB0eXBlLXRvLW5hbWUgbWFwIGNvbnN0YW50ICtUT0tFTl9OQU1FUyssCithbmQgYSBncmFtbWFyLXNwZWNpZmljIHN1YmNsYXNzIG9mIEFOVExSMzo6Q29tbW9uVG9rZW4gYXNzaWduZWQgdG8gdGhlIGNvbnN0YW50CitUb2tlbi4gVGh1cywgd2hlbiByZWNvZ25pemVycyBuZWVkIHRvIG1hbnVmYWN0dXJlIHRva2VucywgaW5zdGVhZCBvZiB1c2luZyB0aGUKK2dlbmVyaWMgQ29tbW9uVG9rZW4gY2xhc3MsIHRoZXkgY2FuIGNyZWF0ZSB0b2tlbnMgdXNpbmcgdGhlIGN1c3RvbWl6ZWQgVG9rZW4KK2NsYXNzIHByb3ZpZGVkIGJ5IHRoZSB0b2tlbiBzY2hlbWUuCisKK0lmIHlvdSBuZWVkIHRvIHVzZSBhIHRva2VuIGNsYXNzIG90aGVyIHRoYW4gQ29tbW9uVG9rZW4sIHlvdSBjYW4gcGFzcyB0aGUgY2xhc3MKK2FzIGEgcGFyYW1ldGVyIHRvIFRva2VuU2NoZW1lLm5ldywgd2hpY2ggd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZQorZHluYW1pY2FsbHktY3JlYXRlZCBDb21tb25Ub2tlbiBzdWJjbGFzcy4KKworPWVuZAorCitjbGFzcyBUb2tlblNjaGVtZSA8IDo6TW9kdWxlCisgIGluY2x1ZGUgVG9rZW5GYWN0b3J5CisgIAorICBkZWYgc2VsZi5uZXcoIHRrX2NsYXNzID0gbmlsLCAmYm9keSApCisgICAgc3VwZXIoKSBkbworICAgICAgdGtfY2xhc3MgfHw9IENsYXNzLm5ldyggOjpBTlRMUjM6OkNvbW1vblRva2VuICkKKyAgICAgIHNlbGYudG9rZW5fY2xhc3MgPSB0a19jbGFzcworICAgICAgCisgICAgICBjb25zdF9zZXQoIDpUT0tFTl9OQU1FUywgOjpBTlRMUjM6OkNvbnN0YW50czo6QlVJTFRfSU5fVE9LRU5fTkFNRVMuY2xvbmUgKQorICAgICAgCisgICAgICBAdHlwZXMgID0gOjpBTlRMUjM6OkNvbnN0YW50czo6QlVJTFRfSU5fVE9LRU5fTkFNRVMuaW52ZXJ0CisgICAgICBAdW51c2VkID0gOjpBTlRMUjM6OkNvbnN0YW50czo6TUlOX1RPS0VOX1RZUEUKKyAgICAgIAorICAgICAgc2NoZW1lID0gc2VsZgorICAgICAgZGVmaW5lX21ldGhvZCggOnRva2VuX3NjaGVtZSApIHsgc2NoZW1lIH0KKyAgICAgIGRlZmluZV9tZXRob2QoIDp0b2tlbl9uYW1lcyApICB7IHNjaGVtZTo6VE9LRU5fTkFNRVMgfQorICAgICAgZGVmaW5lX21ldGhvZCggOnRva2VuX25hbWUgKSBkbyB8dHlwZXwKKyAgICAgICAgYmVnaW4KKyAgICAgICAgICB0b2tlbl9uYW1lc1sgdHlwZSBdIG9yIHN1cGVyCisgICAgICAgIHJlc2N1ZSBOb01ldGhvZEVycm9yCisgICAgICAgICAgOjpBTlRMUjM6OkNvbW1vblRva2VuLnRva2VuX25hbWUoIHR5cGUgKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgbW9kdWxlX2Z1bmN0aW9uIDp0b2tlbl9uYW1lLCA6dG9rZW5fbmFtZXMKKyAgICAgIAorICAgICAgaW5jbHVkZSBBTlRMUjM6OkNvbnN0YW50cworICAgICAgCisgICAgICBib2R5IGFuZCBtb2R1bGVfZXZhbCggJmJvZHkgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBzZWxmLmJ1aWxkKCAqdG9rZW5fbmFtZXMgKQorICAgIHRva2VuX25hbWVzID0gWyB0b2tlbl9uYW1lcyBdLmZsYXR0ZW4hCisgICAgdG9rZW5fbmFtZXMuY29tcGFjdCEKKyAgICB0b2tlbl9uYW1lcy51bmlxIQorICAgIHRrX2NsYXNzID0gQ2xhc3MgPT09IHRva2VuX25hbWVzLmZpcnN0ID8gdG9rZW5fbmFtZXMuc2hpZnQgOiBuaWwKKyAgICB2YWx1ZV9tYXBzLCBuYW1lcyA9IHRva2VuX25hbWVzLnBhcnRpdGlvbiB7IHxpfCBIYXNoID09PSBpIH0KKyAgICBuZXcoIHRrX2NsYXNzICkgZG8KKyAgICAgIGZvciB2YWx1ZV9tYXAgaW4gdmFsdWVfbWFwcworICAgICAgICBkZWZpbmVfdG9rZW5zKCB2YWx1ZV9tYXAgKQorICAgICAgZW5kCisgICAgICAKKyAgICAgIGZvciBuYW1lIGluIG5hbWVzCisgICAgICAgIGRlZmluZV90b2tlbiggbmFtZSApCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisgIAorICAKKyAgZGVmIGluY2x1ZGVkKCBtb2QgKQorICAgIHN1cGVyCisgICAgbW9kLmV4dGVuZCggc2VsZiApCisgIGVuZAorICBwcml2YXRlIDppbmNsdWRlZAorICAKKyAgYXR0cl9yZWFkZXIgOnVudXNlZCwgOnR5cGVzCisgIAorICBkZWYgZGVmaW5lX3Rva2VucyggdG9rZW5fbWFwID0ge30gKQorICAgIGZvciB0b2tlbl9uYW1lLCB0b2tlbl92YWx1ZSBpbiB0b2tlbl9tYXAKKyAgICAgIGRlZmluZV90b2tlbiggdG9rZW5fbmFtZSwgdG9rZW5fdmFsdWUgKQorICAgIGVuZAorICAgIHJldHVybiBzZWxmCisgIGVuZAorICAKKyAgZGVmIGRlZmluZV90b2tlbiggbmFtZSwgdmFsdWUgPSBuaWwgKQorICAgIG5hbWUgPSBuYW1lLnRvX3MKKyAgICAKKyAgICBpZiBjdXJyZW50X3ZhbHVlID0gQHR5cGVzWyBuYW1lIF0KKyAgICAgICMgdG9rZW4gdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQKKyAgICAgICMgcmFpc2UgYW4gZXJyb3IgdW5sZXNzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHZhbHVlCisgICAgICB2YWx1ZSB8fD0gY3VycmVudF92YWx1ZQorICAgICAgdW5sZXNzIGN1cnJlbnRfdmFsdWUgPT0gdmFsdWUKKyAgICAgICAgcmFpc2UgTmFtZUVycm9yLm5ldyggCisgICAgICAgICAgIm5ldyB0b2tlbiB0eXBlIGRlZmluaXRpb24gYGAjeyBuYW1lIH0gPSAjeyB2YWx1ZSB9JycgY29uZmxpY3RzICIgPDwKKyAgICAgICAgICAid2l0aCBleGlzdGluZyB0eXBlIGRlZmluaXRpb24gYGAjeyBuYW1lIH0gPSAjeyBjdXJyZW50X3ZhbHVlIH0nJyIsIG5hbWUKKyAgICAgICAgKQorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgdmFsdWUgfHw9IEB1bnVzZWQKKyAgICAgIGlmIG5hbWUgPX4gL15bQS1aXVx3KiQvCisgICAgICAgIGNvbnN0X3NldCggbmFtZSwgQHR5cGVzWyBuYW1lIF0gPSB2YWx1ZSApCisgICAgICBlbHNlCisgICAgICAgIGNvbnN0YW50ID0gIlRfXyN7IHZhbHVlIH0iCisgICAgICAgIGNvbnN0X3NldCggY29uc3RhbnQsIEB0eXBlc1sgY29uc3RhbnQgXSA9IHZhbHVlICkKKyAgICAgICAgQHR5cGVzWyBuYW1lIF0gPSB2YWx1ZQorICAgICAgZW5kCisgICAgICByZWdpc3Rlcl9uYW1lKCB2YWx1ZSwgbmFtZSApIHVubGVzcyBidWlsdF9pbl90eXBlPyggdmFsdWUgKQorICAgIGVuZAorICAgIAorICAgIHZhbHVlID49IEB1bnVzZWQgYW5kIEB1bnVzZWQgPSB2YWx1ZSArIDEKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKyAgCisgIGRlZiByZWdpc3Rlcl9uYW1lcyggKm5hbWVzICkKKyAgICBpZiBuYW1lcy5sZW5ndGggPT0gMSBhbmQgSGFzaCA9PT0gbmFtZXMuZmlyc3QKKyAgICAgIG5hbWVzLmZpcnN0LmVhY2ggZG8gfHZhbHVlLCBuYW1lfAorICAgICAgICByZWdpc3Rlcl9uYW1lKCB2YWx1ZSwgbmFtZSApCisgICAgICBlbmQKKyAgICBlbHNlCisgICAgICBuYW1lcy5lYWNoX3dpdGhfaW5kZXggZG8gfG5hbWUsIGl8CisgICAgICAgIHR5cGVfdmFsdWUgPSBDb25zdGFudHM6Ok1JTl9UT0tFTl9UWVBFICsgaQorICAgICAgICByZWdpc3Rlcl9uYW1lKCB0eXBlX3ZhbHVlLCBuYW1lICkKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiByZWdpc3Rlcl9uYW1lKCB0eXBlX3ZhbHVlLCBuYW1lICkKKyAgICBuYW1lID0gbmFtZS50b19zLmZyZWV6ZQorICAgIGlmIHRva2VuX25hbWVzLmhhc19rZXk/KCB0eXBlX3ZhbHVlICkKKyAgICAgIGN1cnJlbnRfbmFtZSA9IHRva2VuX25hbWVzWyB0eXBlX3ZhbHVlIF0KKyAgICAgIGN1cnJlbnRfbmFtZSA9PSBuYW1lIGFuZCByZXR1cm4gbmFtZQorICAgICAgCisgICAgICBpZiBjdXJyZW50X25hbWUgPT0gIlRfXyN7IHR5cGVfdmFsdWUgfSIKKyAgICAgICAgIyBvbmx5IGFuIGFub255bW91cyBuYW1lIGlzIHJlZ2lzdGVyZWQgLS0gdXBncmFkZSB0aGUgbmFtZSB0byB0aGUgZnVsbCBsaXRlcmFsIG5hbWUKKyAgICAgICAgdG9rZW5fbmFtZXNbIHR5cGVfdmFsdWUgXSA9IG5hbWUKKyAgICAgIGVsc2lmIG5hbWUgPT0gIlRfXyN7IHR5cGVfdmFsdWUgfSIKKyAgICAgICAgIyBpZ25vcmUgbmFtZSBkb3duZ3JhZGUgZnJvbSBsaXRlcmFsIHRvIGFub255bW91cyBjb25zdGFudAorICAgICAgICByZXR1cm4gY3VycmVudF9uYW1lCisgICAgICBlbHNlCisgICAgICAgIGVycm9yID0gTmFtZUVycm9yLm5ldyggCisgICAgICAgICAgImF0dGVtcHRlZCBhc3NpZ25tZW50IG9mIHRva2VuIHR5cGUgI3sgdHlwZV92YWx1ZSB9IiA8PAorICAgICAgICAgICIgdG8gbmFtZSAjeyBuYW1lIH0gY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgbmFtZSAjeyBjdXJyZW50X25hbWUgfSIsIG5hbWUKKyAgICAgICAgKQorICAgICAgICByYWlzZSBlcnJvcgorICAgICAgZW5kCisgICAgZWxzZQorICAgICAgdG9rZW5fbmFtZXNbIHR5cGVfdmFsdWUgXSA9IG5hbWUudG9fcy5mcmVlemUKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgYnVpbHRfaW5fdHlwZT8oIHR5cGVfdmFsdWUgKQorICAgIENvbnN0YW50czo6QlVJTFRfSU5fVE9LRU5fTkFNRVMuZmV0Y2goIHR5cGVfdmFsdWUsIGZhbHNlICkgYW5kIHRydWUKKyAgZW5kCisgIAorICBkZWYgdG9rZW5fZGVmaW5lZD8oIG5hbWVfb3JfdmFsdWUgKQorICAgIGNhc2UgdmFsdWUKKyAgICB3aGVuIEludGVnZXIgdGhlbiB0b2tlbl9uYW1lcy5oYXNfa2V5PyggbmFtZV9vcl92YWx1ZSApCisgICAgZWxzZSBjb25zdF9kZWZpbmVkPyggbmFtZV9vcl92YWx1ZS50b19zICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgW10oIG5hbWVfb3JfdmFsdWUgKQorICAgIGNhc2UgbmFtZV9vcl92YWx1ZQorICAgIHdoZW4gSW50ZWdlciB0aGVuIHRva2VuX25hbWVzLmZldGNoKCBuYW1lX29yX3ZhbHVlLCBuaWwgKQorICAgIGVsc2UgY29uc3RfZ2V0KCBuYW1lX29yX3ZhbHVlLnRvX3MgKSByZXNjdWUgdG9rZW5fbmFtZXMuaW5kZXgoIG5hbWVfb3JfdmFsdWUgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB0b2tlbl9jbGFzcworICAgIHNlbGY6OlRva2VuCisgIGVuZAorICAKKyAgZGVmIHRva2VuX2NsYXNzPSgga2xhc3MgKQorICAgIENsYXNzID09PSBrbGFzcyBvciByYWlzZSggVHlwZUVycm9yLCAidG9rZW5fY2xhc3MgbXVzdCBiZSBhIENsYXNzIiApCisgICAgVXRpbC5zaWxlbmNlX3dhcm5pbmdzIGRvCisgICAgICBrbGFzcyA8IHNlbGYgb3Iga2xhc3Muc2VuZCggOmluY2x1ZGUsIHNlbGYgKQorICAgICAgY29uc3Rfc2V0KCA6VG9rZW4sIGtsYXNzICkKKyAgICBlbmQKKyAgZW5kCisgIAorZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RyZWUucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdHJlZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVkZTMwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RyZWUucmIKQEAgLTAsMCArMSwxMzg0IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKz1iZWdpbiBMSUNFTlNFCisKK1tUaGUgIkJTRCBsaWNlbmNlIl0KK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEt5bGUgWWV0dGVyCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCitPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCitOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworPWVuZAorCityZXF1aXJlICdhbnRscjMnCisKK21vZHVsZSBBTlRMUjMKKyAgCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVAorCitOYW1lIHNwYWNlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbnRpdGllcyBwZXJ0YWluaW5nIHRvIHRyZWUgY29uc3RydWN0aW9uIGFuZAordHJlZSBwYXJzaW5nLgorCis9ZW5kCisKK21vZHVsZSBBU1QKKworYXV0b2xvYWQgOldpemFyZCwgJ2FudGxyMy90cmVlL3dpemFyZCcKK2F1dG9sb2FkIDpWaXNpdG9yLCAnYW50bHIzL3RyZWUvdmlzaXRvcicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVHJlZSBQYXJzZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6VHJlZVBhcnNlcgorCis9IFRyZWVQYXJzZXIKKworVHJlZVBhcnNlciBpcyB0aGUgZGVmYXVsdCBiYXNlIGNsYXNzIG9mIEFOVExSLWdlbmVyYXRlZCB0cmVlIHBhcnNlcnMuIFRoZSBjbGFzcwordGFpbG9ycyB0aGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSBSZWNvZ25pemVyIHRvIHRoZSB0YXNrIG9mIHRyZWUtcGF0dGVybgorcmVjb2duaXRpb24uCisKKz09IEFib3V0IFRyZWUgUGFyc2VycworCitBTlRMUiBnZW5lcmF0ZXMgdGhyZWUgYmFzaWMgdHlwZXMgb2YgcmVjb2duaXplcnM6CisqIGxleGVycworKiBwYXJzZXJzCisqIHRyZWUgcGFyc2VycworCitGdXJ0aGVybW9yZSwgaXQgaXMgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHNldmVyYWwgZGlmZmVyZW50IGZsYXZvcnMgb2YgcGFyc2VyLAoraW5jbHVkaW5nIHBhcnNlcnMgdGhhdCB0YWtlIHRva2VuIGlucHV0IGFuZCB1c2UgaXQgdG8gYnVpbGQgQWJzdHJhY3QgU3ludGF4CitUcmVlcyAoQVNUcyksIHRyZWUgc3RydWN0dXJlcyB0aGF0IHJlZmxlY3QgdGhlIGhpZ2gtbGV2ZWwgc3ludGFjdGljIGFuZCBzZW1hbnRpYworc3RydWN0dXJlcyBkZWZpbmVkIGJ5IHRoZSBsYW5ndWFnZS4KKworWW91IGNhbiB0YWtlIHRoZSBpbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgYnkgdGhlIEFTVCBhbmQgcHJvY2VzcyBpdCBkaXJlY3RseSBpbgorYSBwcm9ncmFtLiBIb3dldmVyLCBBTlRMUiBhbHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gY3JlYXRlIGEgcmVjb2duaXplciB3aGljaCBpcworY2FwYWJsZSBvZiB3YWxraW5nIHRocm91Z2ggdGhlIEFTVCwgdmVyaWZ5aW5nIGl0cyBzdHJ1Y3R1cmUgYW5kIHBlcmZvcm1pbmcKK2N1c3RvbSBhY3Rpb25zIGFsb25nIHRoZSB3YXkgLS0gdHJlZSBwYXJzZXJzLgorCitUcmVlIHBhcnNlcnMgYXJlIGNyZWF0ZWQgZnJvbSB0cmVlIGdyYW1tYXJzLiBBTlRMUi1nZW5lcmF0ZWQgdHJlZSBwYXJzZXJzCitjbG9zZWx5IG1pcnJvciB0aGUgZ2VuZXJhbCBzdHJ1Y3R1cmUgb2YgcmVndWxhciBwYXJzZXJzIGFuZCBsZXhlcnMuCisKK0ZvciBtb3JlIGluLWRlcHRoIGNvdmVyYWdlIG9mIHRoZSB0b3BpYywgY2hlY2sgb3V0IHRoZSBBTlRMUiBkb2N1bWVudGF0aW9uCisoaHR0cDovL3d3dy5hbnRsci5vcmcpLgorCis9PSBUaGUgVHJlZSBQYXJzZXIgQVBJCisKK0xpa2UgUGFyc2VyLCB0aGUgY2xhc3MgZG9lcyBub3Qgc3RyYXkgdG9vIGZhciBmcm9tIHRoZSBSZWNvZ25pemVyIEFQSS4KK01haW5seSwgaXQgY3VzdG9taXplcyBhIGZldyBtZXRob2RzIHNwZWNpZmljYWxseSB0byBkZWFsIHdpdGggdHJlZSBub2RlcworKGluc3RlYWQgb2YgYmFzaWMgdG9rZW5zKSwgYW5kIGFkZHMgc29tZSBoZWxwZXIgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRyZWVzLgorCitMaWtlIGFsbCBBTlRMUiByZWNvZ25pemVycywgdHJlZSBwYXJzZXJzIGNvbnRhaW5lZCBhIHNoYXJlZCBzdGF0ZSBzdHJ1Y3R1cmUgYW5kCithbiBpbnB1dCBzdHJlYW0sIHdoaWNoIHNob3VsZCBiZSBhIFRyZWVOb2RlU3RyZWFtLiBBTlRMUiBpbnRlbmRzIHRvIGtlZXAgaXRzCit0cmVlIGZlYXR1cmVzIGZsZXhpYmxlIGFuZCBjdXN0b21pemFibGUsIGFuZCB0aHVzIGl0IGRvZXMgbm90IG1ha2UgYW55Cithc3N1bXB0aW9ucyBhYm91dCB0aGUgY2xhc3Mgb2YgdGhlIGFjdHVhbCBub2RlcyBpdCBwcm9jZXNzZXMuIE9uZSBjb25zZXF1ZW5jZSBvZgordGhpcyBmbGV4aWJpbGl0eSBpcyB0aGF0IHRyZWUgcGFyc2VycyBhbHNvIHJlcXVpcmUgYW4gZXh0cmEgdHJlZSBhZGFwdG9yIG9iamVjdCwKK3RoZSBwdXJwb3NlIG9mIHdoaWNoIGlzIHRvIHByb3ZpZGUgYSBob21vZ2VuZW91cyBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIHRyZWUKK2NvbnN0cnVjdGlvbiBhbmQgYW5hbHlzaXMgb2YgeW91ciB0cmVlIG5vZGVzLgorCitTZWUgVHJlZSBhbmQgVHJlZUFkYXB0b3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKz1lbmQKKworY2xhc3MgVHJlZVBhcnNlciA8IFJlY29nbml6ZXIKKyAgZGVmIHNlbGYubWFpbiggYXJndiA9IEFSR1YsIG9wdGlvbnMgPSB7fSApCisgICAgaWYgOjpIYXNoID09PSBhcmd2IHRoZW4gYXJndiwgb3B0aW9ucyA9IEFSR1YsIGFyZ3YgZW5kCisgICAgbWFpbiA9IEFOVExSMzo6TWFpbjo6V2Fsa2VyTWFpbi5uZXcoIHNlbGYsIG9wdGlvbnMgKQorICAgIGJsb2NrX2dpdmVuPyA/IHlpZWxkKCBtYWluICkgOiBtYWluLmV4ZWN1dGUoIGFyZ3YgKQorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplKCBpbnB1dCwgb3B0aW9ucyA9IHt9ICkKKyAgICBzdXBlciggb3B0aW9ucyApCisgICAgQGlucHV0ID0gaW5wdXQKKyAgZW5kCisgIAorICBhbGlhcyB0cmVlX25vZGVfc3RyZWFtIGlucHV0CisgIGFsaWFzIHRyZWVfbm9kZV9zdHJlYW09IGlucHV0PQorICAKKyAgZGVmIHNvdXJjZV9uYW1lCisgICAgQGlucHV0LnNvdXJjZV9uYW1lCisgIGVuZAorICAKKyAgZGVmIG1pc3Npbmdfc3ltYm9sKCBlcnJvciwgZXhwZWN0ZWRfdG9rZW5fdHlwZSwgZm9sbG93ICkKKyAgICBuYW1lID0gdG9rZW5fbmFtZSggZXhwZWN0ZWRfdG9rZW5fdHlwZSApLnRvX3MKKyAgICB0ZXh0ID0gIjxtaXNzaW5nICIgPDwgbmFtZSA8PCAnPicKKyAgICB0ayA9IGNyZWF0ZV90b2tlbiBkbyB8dHwKKyAgICAgIHQudGV4dCA9IHRleHQKKyAgICAgIHQudHlwZSA9IGV4cGVjdGVkX3Rva2VuX3R5cGUKKyAgICBlbmQKKyAgICByZXR1cm4oIENvbW1vblRyZWUubmV3KCB0ayApICkKKyAgZW5kCisgIAorICBkZWYgbWF0Y2hfYW55KCBpZ25vcmUgPSBuaWwgKQorICAgIEBzdGF0ZS5lcnJvcl9yZWNvdmVyeSA9IGZhbHNlCisgICAgCisgICAgbG9vaywgYWRhcHRvciA9IEBpbnB1dC5sb29rLCBAaW5wdXQudHJlZV9hZGFwdG9yCisgICAgaWYgYWRhcHRvci5jaGlsZF9jb3VudCggbG9vayApID09IDAKKyAgICAgIEBpbnB1dC5jb25zdW1lCisgICAgICByZXR1cm4KKyAgICBlbmQKKyAgICAKKyAgICBsZXZlbCA9IDAKKyAgICB3aGlsZSB0eXBlID0gQGlucHV0LnBlZWsgYW5kIHR5cGUgIT0gRU9GCisgICAgICAjdG9rZW5fdHlwZSA9PSBFT0Ygb3IgKCB0b2tlbl90eXBlID09IFVQICYmIGxldmVsID09IDAgKQorICAgICAgQGlucHV0LmNvbnN1bWUKKyAgICAgIGNhc2UgdHlwZQorICAgICAgd2hlbiBET1dOIHRoZW4gbGV2ZWwgKz0gMQorICAgICAgd2hlbiBVUAorICAgICAgICBsZXZlbCAtPSAxCisgICAgICAgIGxldmVsLnplcm8/IGFuZCBicmVhaworICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIG1pc21hdGNoKCBpbnB1dCwgdHlwZSwgZm9sbG93ID0gbmlsICkKKyAgICByYWlzZSBNaXNtYXRjaGVkVHJlZU5vZGUubmV3KCB0eXBlLCBpbnB1dCApCisgIGVuZAorICAKKyAgZGVmIGVycm9yX2hlYWRlciggZSApCisgICAgPDwtRU5ELnN0cmlwIQorICAgICN7IGdyYW1tYXJfZmlsZV9uYW1lIH06IG5vZGUgZnJvbSAjeyAKKyAgICAgIGUuYXBwcm94aW1hdGVfbGluZV9pbmZvPyA/ICdhZnRlciAnIDogJycKKyAgICB9IGxpbmUgI3sgZS5saW5lIH06I3sgZS5jb2x1bW4gfQorICAgIEVORAorICBlbmQKKyAgCisgIGRlZiBlcnJvcl9tZXNzYWdlKCBlICkKKyAgICBhZGFwdG9yID0gZS5pbnB1dC5hZGFwdG9yCisgICAgZS50b2tlbiA9IGFkYXB0b3IudG9rZW4oIGUubm9kZSApCisgICAgZS50b2tlbiB8fD0gY3JlYXRlX3Rva2VuIGRvIHwgdG9rIHwKKyAgICAgIHRvay50eXBlID0gYWRhcHRvci50eXBlX29mKCBlLm5vZGUgKQorICAgICAgdG9rLnRleHQgPSBhZGFwdG9yLnRleHRfb2YoIGUubm9kZSApCisgICAgZW5kCisgICAgcmV0dXJuIHN1cGVyKCBlICkKKyAgZW5kCisgIAorICBkZWYgdHJhY2VfaW4oIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCApCisgICAgc3VwZXIoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCwgQGlucHV0Lmxvb2sgKQorICBlbmQKKyAgCisgIGRlZiB0cmFjZV9vdXQoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCApCisgICAgc3VwZXIoIHJ1bGVfbmFtZSwgcnVsZV9pbmRleCwgQGlucHV0Lmxvb2sgKQorICBlbmQKK2VuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUcmVlIE5vZGVzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpUcmVlCisKKz0gQU5UTFIgQWJzdHJhY3QgU3ludGF4IFRyZWVzCisKK0FzIEFOVExSIGlzIGNvbmNlcm5lZCwgYW4gQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFTVCkgbm9kZSBpcyBhbiBvYmplY3QgdGhhdAord3JhcHMgYSB0b2tlbiwgYSBsaXN0IG9mIGNoaWxkIHRyZWVzLCBhbmQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGVjdGl2ZQorc291cmNlIHRleHQgZW1ib2RpZWQgd2l0aGluIHRoZSB0cmVlIGFuZCBpdHMgY2hpbGRyZW4uCisKK1RoZSBUcmVlIG1vZHVsZSwgbGlrZSB0aGUgVG9rZW4gYW5kIFN0cmVhbSBtb2R1bGVzLCBlbXVsYXRlcyBhbiBhYnN0cmFjdCBiYXNlCitjbGFzcyBmb3IgQVNUIGNsYXNzZXM7IGl0IHNwZWNpZmllcyB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBleHBlY3RlZCBvZiBiYXNpYwordHJlZSBub2RlcyBhcyB3ZWxsIGFzIHRoZSBtZXRob2RzIHRyZWVzIG5lZWQgdG8gaW1wbGVtZW50LgorCis9PSBUZXJtaW5vbG9neQorCitXaGlsZSBtdWNoIG9mIHRoaXMgdGVybWlub2xvZ3kgaXMgcHJvYmFibHkgZmFtaWxpYXIgdG8gbW9zdCBkZXZlbG9wZXJzLCB0aGUKK2ZvbGxvd2luZyBicmllZiBnbG9zc2FyeSBpcyBpbnRlbmRlZCB0byBjbGFyaWZ5IHRlcm1pbm9sb2d5IHVzZWQgaW4gY29kZQordGhyb3VnaG91dCB0aGUgQVNUIGxpYnJhcnk6CisKK1twYXlsb2FkXSBlaXRoZXIgYSB0b2tlbiB2YWx1ZSBjb250YWluZWQgd2l0aGluIGEgbm9kZSBvciArbmlsKworW2ZsYXQgbGlzdCAobmlsIHRyZWUpXSBhIHRyZWUgbm9kZSB3aXRob3V0IGEgdG9rZW4gcGF5bG9hZCwgYnV0IHdpdGggbW9yZSAKKyAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBvbmUgY2hpbGRyZW4gLS0gZnVuY3Rpb25zIGxpa2UgYW4gYXJyYXkgb2YgCisgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgbm9kZXMKK1tyb290XSBhIHRvcC1sZXZlbCB0cmVlIG5vZGUsIGkuZS4gYSBub2RlIHRoYXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudAorW2xlYWZdIGEgbm9kZSB0aGF0IGRvZXMgbm90IGhhdmUgYW55IGNoaWxkcmVuCitbc2libGluZ3NdIGFsbCBvdGhlciBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBzb21lIG5vZGUKK1thbmNlc3RvcnNdIHRoZSBsaXN0IG9mIHN1Y2Nlc3NpdmUgcGFyZW50cyBmcm9tIGEgdHJlZSBub2RlIHRvIHRoZSByb290IG5vZGUKK1tlcnJvciBub2RlXSBhIHNwZWNpYWwgbm9kZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBlcnJvbmVvdXMgc2VyaWVzIG9mIHRva2VucworICAgICAgICAgICAgIGZyb20gYW4gaW5wdXQgc3RyZWFtCisKKz1lbmQKKworbW9kdWxlIFRyZWUKKyAgCisgICNhdHRyX2FjY2Vzc29yIDpwYXJlbnQKKyAgYXR0cl9hY2Nlc3NvciA6c3RhcnRfaW5kZXgKKyAgYXR0cl9hY2Nlc3NvciA6c3RvcF9pbmRleAorICBhdHRyX2FjY2Vzc29yIDpjaGlsZF9pbmRleAorICBhdHRyX3JlYWRlciA6dHlwZQorICBhdHRyX3JlYWRlciA6dGV4dAorICBhdHRyX3JlYWRlciA6bGluZQorICBhdHRyX3JlYWRlciA6Y29sdW1uCisgICNhdHRyX3JlYWRlciA6Y2hpbGRyZW4KKyAgYXR0cl9yZWFkZXIgOnRva2VuCisgIAorICAKKyAgZGVmIHJvb3Q/CisgICAgcGFyZW50Lm5pbD8KKyAgZW5kCisgIGFsaWFzIGRldGFjaGVkPyByb290PworICAKKyAgZGVmIHJvb3QKKyAgICBjdXJzb3IgPSBzZWxmCisgICAgdW50aWwgY3Vyc29yLnJvb3Q/CisgICAgICB5aWVsZCggcGFyZW50X25vZGUgPSBjdXJzb3IucGFyZW50ICkKKyAgICAgIGN1cnNvciA9IHBhcmVudF9ub2RlCisgICAgZW5kCisgICAgcmV0dXJuKCBjdXJzb3IgKQorICBlbmQKKyAgCisgICMKKyAgZGVmIGxlYWY/CisgICAgY2hpbGRyZW4ubmlsPyBvciBjaGlsZHJlbi5lbXB0eT8KKyAgZW5kCisgIAorICBkZWYgaGFzX2NoaWxkPyggbm9kZSApCisgICAgY2hpbGRyZW4gYW5kIGNoaWxkcmVuLmluY2x1ZGU/KCBub2RlICkKKyAgZW5kCisgIAorICBkZWYgZGVwdGgKKyAgICByb290PyA/IDAgOiBwYXJlbnQuZGVwdGggKyAxCisgIGVuZAorICAKKyAgZGVmIHNpYmxpbmdzCisgICAgcm9vdD8gYW5kIHJldHVybiBbXQorICAgIHBhcmVudC5jaGlsZHJlbi5yZWplY3QgeyB8IGMgfCBjLmVxdWFsPyggc2VsZiApIH0KKyAgZW5kCisgIAorICBkZWYgZWFjaF9hbmNlc3RvcgorICAgIGJsb2NrX2dpdmVuPyBvciByZXR1cm4oIGVudW1fZm9yKCA6ZWFjaF9hbmNlc3RvciApICkKKyAgICBjdXJzb3IgPSBzZWxmCisgICAgdW50aWwgY3Vyc29yLnJvb3Q/CisgICAgICB5aWVsZCggcGFyZW50X25vZGUgPSBjdXJzb3IucGFyZW50ICkKKyAgICAgIGN1cnNvciA9IHBhcmVudF9ub2RlCisgICAgZW5kCisgICAgcmV0dXJuKCBzZWxmICkKKyAgZW5kCisgIAorICBkZWYgYW5jZXN0b3JzCisgICAgZWFjaF9hbmNlc3Rvci50b19hCisgIGVuZAorICAKKyAgZGVmIHdhbGsKKyAgICBibG9ja19naXZlbj8gb3IgcmV0dXJuKCBlbnVtX2ZvciggOndhbGsgKSApCisgICAgc3RhY2sgPSBbXQorICAgIGN1cnNvciA9IHNlbGYKKyAgICB3aGlsZSB0cnVlCisgICAgICBiZWdpbgorICAgICAgICB5aWVsZCggY3Vyc29yICkKKyAgICAgICAgc3RhY2sucHVzaCggY3Vyc29yLmNoaWxkcmVuLmR1cCApIHVubGVzcyBjdXJzb3IuZW1wdHk/CisgICAgICByZXNjdWUgU3RvcEl0ZXJhdGlvbgorICAgICAgICAjIHNraXBzIGFkZGluZyBjaGlsZHJlbiB0byBwcnVuZSB0aGUgbm9kZQorICAgICAgZW5zdXJlCisgICAgICAgIGJyZWFrIGlmIHN0YWNrLmVtcHR5PworICAgICAgICBjdXJzb3IgPSBzdGFjay5sYXN0LnNoaWZ0CisgICAgICAgIHN0YWNrLnBvcCBpZiBzdGFjay5sYXN0LmVtcHR5PworICAgICAgZW5kCisgICAgZW5kCisgICAgcmV0dXJuIHNlbGYKKyAgZW5kCisgIAorZW5kCisKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpBU1Q6OkJhc2VUcmVlCisKK0EgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBBYnN0cmFjdCBTeW50YXggVHJlZSBOb2RlLiBJdCBtYWlubHkgZGVmaW5lcyB0aGUKK21ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoZSBwYXJlbnQtbm9kZS1jaGlsZHJlbgorcmVsYXRpb25zaGlwIHRoYXQgY2hhcmFjdGVyaXplIGEgdHJlZTsgaXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgbG9naWMgY29uY2VybmluZworYSBub2RlJ3MgdG9rZW4gPGk+cGF5bG9hZDwvaT4uCisKKz1lbmQKKworY2xhc3MgQmFzZVRyZWUgPCA6OkFycmF5CisgIGF0dHJfYWNjZXNzb3IgOnBhcmVudAorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgaW5jbHVkZSBUcmVlCisgIAorICBkZWYgaW5pdGlhbGl6ZSggbm9kZSA9IG5pbCApCisgICAgc3VwZXIoKQorICAgIEBwYXJlbnQgPSBuaWwKKyAgICBAY2hpbGRfaW5kZXggPSAwCisgIGVuZAorICAKKyAgZGVmIGNoaWxkcmVuKCkgc2VsZiBlbmQKKyAgCisgIGFsaWFzIGNoaWxkIGF0CisgIGFsaWFzIGNoaWxkX2NvdW50IGxlbmd0aAorICAKKyAgZGVmIGZpcnN0X3dpdGhfdHlwZSggdHJlZV90eXBlICkKKyAgICBmaW5kIHsgfCBjaGlsZCB8IGNoaWxkLnR5cGUgPT0gdHJlZV90eXBlIH0KKyAgZW5kCisgIAorICBkZWYgYWRkX2NoaWxkKCBjaGlsZF90cmVlICkKKyAgICBjaGlsZF90cmVlLm5pbD8gYW5kIHJldHVybgorICAgIGlmIGNoaWxkX3RyZWUuZmxhdF9saXN0PworICAgICAgc2VsZi5lcXVhbD8oIGNoaWxkX3RyZWUuY2hpbGRyZW4gKSBhbmQKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgImF0dGVtcHQgdG8gYWRkIGNoaWxkIGxpc3QgdG8gaXRzZWxmIgorICAgICAgY2hpbGRfdHJlZS5lYWNoX3dpdGhfaW5kZXggZG8gfCBjaGlsZCwgaW5kZXggfAorICAgICAgICBjaGlsZC5wYXJlbnQgPSBzZWxmCisgICAgICAgIGNoaWxkLmNoaWxkX2luZGV4ID0gbGVuZ3RoICsgaW5kZXgKKyAgICAgIGVuZAorICAgICAgY29uY2F0KCBjaGlsZF90cmVlICkKKyAgICBlbHNlCisgICAgICBjaGlsZF90cmVlLmNoaWxkX2luZGV4ID0gbGVuZ3RoCisgICAgICBjaGlsZF90cmVlLnBhcmVudCA9IHNlbGYKKyAgICAgIHNlbGYgPDwgY2hpbGRfdHJlZQorICAgIGVuZAorICAgIHJldHVybiggc2VsZiApCisgIGVuZAorICAKKyAgZGVmIGRldGFjaAorICAgIEBwYXJlbnQgPSBuaWwKKyAgICBAY2hpbGRfaW5kZXggPSAtMQorICAgIHJldHVybiggc2VsZiApCisgIGVuZAorICAKKyAgYWxpYXMgYWRkX2NoaWxkcmVuIGNvbmNhdAorICBhbGlhcyBlYWNoX2NoaWxkIGVhY2gKKyAgCisgIGRlZiBzZXRfY2hpbGQoIGluZGV4LCB0cmVlICkKKyAgICByZXR1cm4gaWYgdHJlZS5uaWw/CisgICAgdHJlZS5mbGF0X2xpc3Q/IGFuZCByYWlzZSBBcmd1bWVudEVycm9yLCAiQ2FuJ3Qgc2V0IHNpbmdsZSBjaGlsZCB0byBhIGxpc3QiCisgICAgdHJlZS5wYXJlbnQgPSBzZWxmCisgICAgdHJlZS5jaGlsZF9pbmRleCA9IGluZGV4CisgICAgc2VsZlsgaW5kZXggXSA9IHRyZWUKKyAgZW5kCisgIAorICBkZWYgZGVsZXRlX2NoaWxkKCBpbmRleCApCisgICAga2lsbGVkID0gZGVsZXRlX2F0KCBpbmRleCApIGFuZCBmcmVzaGVuKCBpbmRleCApCisgICAgcmV0dXJuIGtpbGxlZAorICBlbmQKKworICBkZWYgcmVwbGFjZV9jaGlsZHJlbiggc3RhcnQsIHN0b3AsIG5ld190cmVlICkKKyAgICBzdGFydCA+PSBsZW5ndGggb3Igc3RvcCA+PSBsZW5ndGggYW5kCisgICAgICByYWlzZSBJbmRleEVycm9yLCAoIDw8LUVORCApLmdzdWIhKCAvXlxzK1x8IC8sJycgKQorICAgICAgfCBpbmRpY2VzIHNwYW4gYmV5b25kIHRoZSBudW1iZXIgb2YgY2hpbGRyZW46CisgICAgICB8ICBjaGlsZHJlbi5sZW5ndGggPSAjeyBsZW5ndGggfQorICAgICAgfCAgc3RhcnQgPSAjeyBzdGFydF9pbmRleC5pbnNwZWN0IH0KKyAgICAgIHwgIHN0b3AgID0gI3sgc3RvcF9pbmRleC5pbnNwZWN0IH0KKyAgICAgIEVORAorICAgIG5ld19jaGlsZHJlbiA9IG5ld190cmVlLmZsYXRfbGlzdD8gPyBuZXdfdHJlZSA6IFsgbmV3X3RyZWUgXQorICAgIHNlbGZbIHN0YXJ0IC4uIHN0b3AgXSA9IG5ld19jaGlsZHJlbgorICAgIGZyZXNoZW4oIHN0YXJ0X2luZGV4ICkKKyAgICByZXR1cm4gc2VsZgorICBlbmQKKyAgCisgIGRlZiBmbGF0X2xpc3Q/CisgICAgZmFsc2UKKyAgZW5kCisgIAorICBkZWYgZnJlc2hlbiggb2Zmc2V0ID0gMCApCisgICAgZm9yIGkgaW4gb2Zmc2V0IC4uLiBsZW5ndGgKKyAgICAgIG5vZGUgPSBzZWxmWyBpIF0KKyAgICAgIG5vZGUuY2hpbGRfaW5kZXggPSBpCisgICAgICBub2RlLnBhcmVudCA9IHNlbGYKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgc2FuaXR5X2NoZWNrKCBwYXJlbnQgPSBuaWwsIGkgPSAtMSApCisgICAgcGFyZW50ID09IEBwYXJlbnQgb3IKKyAgICAgIHJhaXNlIFRyZWVJbmNvbnNpc3RlbmN5LmZhaWxlZF9wYXJlbnRfY2hlY2shKCBwYXJlbnQsIEBwYXJlbnQgKQorICAgIGkgPT0gQGNoaWxkX2luZGV4IG9yCisgICAgICByYWlzZSBUcmVlSW5jb25zaXN0ZW5jeS5mYWlsZWRfaW5kZXhfY2hlY2shKCBpLCBAY2hpbGRfaW5kZXggKQorICAgIGVhY2hfd2l0aF9pbmRleCBkbyB8IGNoaWxkLCBpbmRleCB8CisgICAgICBjaGlsZC5zYW5pdHlfY2hlY2soIHNlbGYsIGluZGV4ICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgaW5zcGVjdAorICAgIGVtcHR5PyBhbmQgcmV0dXJuIHRvX3MKKyAgICBidWZmZXIgPSAnJworICAgIGJ1ZmZlciA8PCAnKCcgPDwgdG9fcyA8PCAnICcgdW5sZXNzIGZsYXRfbGlzdD8KKyAgICBidWZmZXIgPDwgbWFwIHsgfCBjIHwgYy5pbnNwZWN0IH0uam9pbiggJyAnICkKKyAgICBidWZmZXIgPDwgJyknIHVubGVzcyBmbGF0X2xpc3Q/CisgICAgcmV0dXJuKCBidWZmZXIgKQorICBlbmQKKyAgCisgIGRlZiB3YWxrCisgICAgYmxvY2tfZ2l2ZW4/IG9yIHJldHVybiggZW51bV9mb3IoIDp3YWxrICkgKQorICAgIHN0YWNrID0gW10KKyAgICBjdXJzb3IgPSBzZWxmCisgICAgd2hpbGUgdHJ1ZQorICAgICAgYmVnaW4KKyAgICAgICAgeWllbGQoIGN1cnNvciApCisgICAgICAgIHN0YWNrLnB1c2goIEFycmF5WyAqY3Vyc29yIF0gKSB1bmxlc3MgY3Vyc29yLmVtcHR5PworICAgICAgcmVzY3VlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgIyBza2lwcyBhZGRpbmcgY2hpbGRyZW4gdG8gcHJ1bmUgdGhlIG5vZGUKKyAgICAgIGVuc3VyZQorICAgICAgICBicmVhayBpZiBzdGFjay5lbXB0eT8KKyAgICAgICAgY3Vyc29yID0gc3RhY2subGFzdC5zaGlmdAorICAgICAgICBzdGFjay5wb3AgaWYgc3RhY2subGFzdC5lbXB0eT8KKyAgICAgIGVuZAorICAgIGVuZAorICAgIHJldHVybiBzZWxmCisgIGVuZAorICAKKyAgZGVmIHBydW5lCisgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICBlbmQKKyAgCisgIGFic3RyYWN0IDp0b19zCisgICNwcm90ZWN0ZWQgOnNhbml0eV9jaGVjaywgOmZyZXNoZW4KKyAgCisgIGRlZiByb290PygpIEBwYXJlbnQubmlsPyBlbmQKKyAgYWxpYXMgbGVhZj8gZW1wdHk/CitlbmQKKworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZQorCitUaGUgZGVmYXVsdCBUcmVlIGNsYXNzIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgQU5UTFIgdHJlZS1yZWxhdGVkIGNvZGUuCisKK0EgQ29tbW9uVHJlZSBvYmplY3QgaXMgYSB0cmVlIG5vZGUgdGhhdCB3cmFwcyBhIHRva2VuIDxpPnBheWxvYWQ8L2k+IChvciBhICtuaWwrCit2YWx1ZSkgYW5kIGNvbnRhaW5zIHplcm8gb3IgbW9yZSBjaGlsZCB0cmVlIG5vZGVzLiBBZGRpdGlvbmFsbHksIGl0IHRyYWNrcworaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJhbmdlIG9mIGRhdGEgY29sbGVjdGl2ZWx5IHNwYW5uZWQgYnkgdGhlIHRyZWUgbm9kZTogCisKKyogdGhlIHRva2VuIHN0cmVhbSBzdGFydCBhbmQgc3RvcCBpbmRleGVzIG9mIHRva2VucyBjb250YWluZWQgdGhyb3VnaG91dCAKKyAgdGhlIHRyZWUgCisqIHRoYXQgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb25zIG9mIHRoZSBjaGFyYWN0ZXIgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggCisgIHRoZSB0b2tlbnMgd2VyZSBkZWZpbmVkCisKK1RyYWNraW5nIHRoaXMgaW5mb3JtYXRpb24gc2ltcGxpZmllcyB0YXNrcyBsaWtlIGV4dHJhY3RpbmcgYSBibG9jayBvZiBjb2RlIG9yCityZXdyaXRpbmcgdGhlIGlucHV0IHN0cmVhbS4gSG93ZXZlciwgZGVwZW5kaW5nIG9uIHRoZSBwdXJwb3NlIG9mIHRoZQorYXBwbGljYXRpb24sIGJ1aWxkaW5nIHRyZWVzIHdpdGggYWxsIG9mIHRoaXMgZXh0cmEgaW5mb3JtYXRpb24gbWF5IGJlCit1bm5lY2Vzc2FyeS4gSW4gc3VjaCBhIGNhc2UsIGEgbW9yZSBiYXJlLWJvbmVzIHRyZWUgY2xhc3MgY291bGQgYmUgd3JpdHRlbgorKG9wdGlvbmFsbHkgdXNpbmcgdGhlIEJhc2VUcmVlIGNsYXNzIG9yIHRoZSBUb2tlbiBtb2R1bGUpLiBEZWZpbmUgYSBjdXN0b21pemVkCitUcmVlQWRhcHRvciBjbGFzcyB0byBoYW5kbGUgdHJlZSBjb25zdHJ1Y3Rpb24gYW5kIG1hbmlwdWxhdGlvbiBmb3IgdGhlCitjdXN0b21pemVkIG5vZGUgY2xhc3MsIGFuZCByZWNvZ25pemVycyB3aWxsIGJlIGFibGUgdG8gYnVpbGQsIHJld3JpdGUsIGFuZCBwYXJzZQordGhlIGN1c3RvbWl6ZWQgbGlnaHRlci13ZWlnaHQgdHJlZXMuCisKKz1lbmQKKworY2xhc3MgQ29tbW9uVHJlZSA8IEJhc2VUcmVlCisgIGRlZiBpbml0aWFsaXplKCBwYXlsb2FkID0gbmlsICkKKyAgICBzdXBlcigpCisgICAgQHN0YXJ0X2luZGV4ID0gLTEKKyAgICBAc3RvcF9pbmRleCA9IC0xCisgICAgQGNoaWxkX2luZGV4ID0gLTEKKyAgICBjYXNlIHBheWxvYWQKKyAgICB3aGVuIENvbW1vblRyZWUgdGhlbiAgICMgY29weS1jb25zdHJ1Y3RvciBzdHlsZSBpbml0CisgICAgICBAdG9rZW4gICAgICAgPSBwYXlsb2FkLnRva2VuCisgICAgICBAc3RhcnRfaW5kZXggPSBwYXlsb2FkLnN0YXJ0X2luZGV4CisgICAgICBAc3RvcF9pbmRleCAgPSBwYXlsb2FkLnN0b3BfaW5kZXgKKyAgICB3aGVuIG5pbCwgVG9rZW4gdGhlbiBAdG9rZW4gPSBwYXlsb2FkCisgICAgZWxzZSByYWlzZSBBcmd1bWVudEVycm9yLAorICAgICAgIkludmFsaWQgYXJndW1lbnQgdHlwZTogJXMgKCVwKSIgJSBbIHBheWxvYWQuY2xhc3MsIHBheWxvYWQgXQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBpbml0aWFsaXplX2NvcHkoIG9yaWcgKQorICAgIHN1cGVyCisgICAgY2xlYXIKKyAgICBAcGFyZW50ID0gbmlsCisgIGVuZAorICAKKyAgZGVmIGNvcHlfbm9kZQorICAgIHJldHVybiBzZWxmLmNsYXNzLm5ldyggQHRva2VuICkKKyAgZW5kCisgIAorICBkZWYgZmxhdF9saXN0PworICAgIEB0b2tlbi5uaWw/CisgIGVuZAorICAKKyAgZGVmIHR5cGUKKyAgICBAdG9rZW4gPyBAdG9rZW4udHlwZSA6IDAKKyAgZW5kCisgIAorICBkZWYgdGV4dAorICAgIEB0b2tlbi50ZXh0IHJlc2N1ZSBuaWwKKyAgZW5kCisgIAorICBkZWYgbGluZQorICAgIGlmIEB0b2tlbi5uaWw/IG9yIEB0b2tlbi5saW5lID09IDAKKyAgICAgIHJldHVybiAoIGVtcHR5PyA/IDAgOiBmaXJzdC5saW5lICkKKyAgICBlbmQKKyAgICByZXR1cm4gQHRva2VuLmxpbmUKKyAgZW5kCisgIAorICBkZWYgY29sdW1uCisgICAgaWYgQHRva2VuLm5pbD8gb3IgQHRva2VuLmNvbHVtbiA9PSAtMQorICAgICAgcmV0dXJuKCBlbXB0eT8gPyAwIDogZmlyc3QuY29sdW1uICkKKyAgICBlbmQKKyAgICByZXR1cm4gQHRva2VuLmNvbHVtbgorICBlbmQKKyAgCisgIGRlZiBzdGFydF9pbmRleAorICAgIEBzdGFydF9pbmRleCA9PSAtMSBhbmQgQHRva2VuIGFuZCByZXR1cm4gQHRva2VuLmluZGV4CisgICAgcmV0dXJuIEBzdGFydF9pbmRleAorICBlbmQKKyAgCisgIGRlZiBzdG9wX2luZGV4CisgICAgQHN0b3BfaW5kZXggPT0gLTEgYW5kIEB0b2tlbiBhbmQgcmV0dXJuIEB0b2tlbi5pbmRleAorICAgIHJldHVybiBAc3RvcF9pbmRleAorICBlbmQKKyAgCisgIGFsaWFzIHRva2VuX3N0YXJ0X2luZGV4PSBzdGFydF9pbmRleD0KKyAgYWxpYXMgdG9rZW5fc3RvcF9pbmRleD0gc3RvcF9pbmRleD0KKyAgYWxpYXMgdG9rZW5fc3RhcnRfaW5kZXggc3RhcnRfaW5kZXgKKyAgYWxpYXMgdG9rZW5fc3RvcF9pbmRleCBzdG9wX2luZGV4CisgIAorICBkZWYgbmFtZQorICAgIEB0b2tlbi5uYW1lIHJlc2N1ZSAnSU5WQUxJRCcKKyAgZW5kCisgIAorICBkZWYgdG9rZW5fcmFuZ2UKKyAgICB1bmtub3duX2JvdW5kYXJpZXM/IGFuZCBpbmZlcl9ib3VuZGFyaWVzCisgICAgQHN0YXJ0X2luZGV4IC4uIEBzdG9wX2luZGV4CisgIGVuZAorICAKKyAgZGVmIHNvdXJjZV9yYW5nZQorICAgIHVua25vd25fYm91bmRhcmllcz8gYW5kIGluZmVyX2JvdW5kYXJpZXMKKyAgICB0b2tlbnMgPSBtYXAgZG8gfCBub2RlIHwKKyAgICAgIHRrID0gbm9kZS50b2tlbiBhbmQgdGsuaW5kZXggPj0gMCA/IHRrIDogbmlsCisgICAgZW5kCisgICAgdG9rZW5zLmNvbXBhY3QhCisgICAgZmlyc3QsIGxhc3QgPSB0b2tlbnMubWlubWF4X2J5IHsgfHR8IHQuaW5kZXggfQorICAgIGZpcnN0LnN0YXJ0IC4uIGxhc3Quc3RvcAorICBlbmQKKyAgCisgIGRlZiBpbmZlcl9ib3VuZGFyaWVzCisgICAgaWYgZW1wdHk/IGFuZCBAc3RhcnRfaW5kZXggPCAwIHx8IEBzdG9wX2luZGV4IDwgMAorICAgICAgQHN0YXJ0X2luZGV4ID0gQHN0b3BfaW5kZXggPSBAdG9rZW4uaW5kZXggcmVzY3VlIC0xCisgICAgICByZXR1cm4KKyAgICBlbmQKKyAgICBmb3IgY2hpbGQgaW4gc2VsZiBkbyBjaGlsZC5pbmZlcl9ib3VuZGFyaWVzIGVuZAorICAgIHJldHVybiBpZiBAc3RhcnRfaW5kZXggPj0gMCBhbmQgQHN0b3BfaW5kZXggPj0gMAorICAgIAorICAgIEBzdGFydF9pbmRleCA9IGZpcnN0LnN0YXJ0X2luZGV4CisgICAgQHN0b3BfaW5kZXggID0gbGFzdC5zdG9wX2luZGV4CisgICAgcmV0dXJuIG5pbAorICBlbmQKKyAgCisgIGRlZiB1bmtub3duX2JvdW5kYXJpZXM/CisgICAgQHN0YXJ0X2luZGV4IDwgMCBvciBAc3RvcF9pbmRleCA8IDAKKyAgZW5kCisgIAorICBkZWYgdG9fcworICAgIGZsYXRfbGlzdD8gPyAnbmlsJyA6IEB0b2tlbi50ZXh0LnRvX3MKKyAgZW5kCisgIAorICBkZWYgcHJldHR5X3ByaW50KCBwcmludGVyICkKKyAgICB0ZXh0ID0gQHRva2VuID8gQHRva2VuLnRleHQgOiAnbmlsJworICAgIHRleHQgPX4gL1xzKy8gYW5kCisgICAgICB0ZXh0ID0gdGV4dC5kdW1wCisgICAgCisgICAgaWYgZW1wdHk/CisgICAgICBwcmludGVyLnRleHQoIHRleHQgKQorICAgIGVsc2UKKyAgICAgIGVuZHBvaW50cyA9IEB0b2tlbiA/IFsgIigjeyB0ZXh0IH0iLCAnKScgXSA6IFsgJycsICcnIF0KKyAgICAgIHByaW50ZXIuZ3JvdXAoIDEsICplbmRwb2ludHMgKSBkbworICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZgorICAgICAgICAgIHByaW50ZXIuYnJlYWthYmxlCisgICAgICAgICAgcHJpbnRlci5wcCggY2hpbGQgKQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKyAgCitlbmQKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpBU1Q6OkNvbW1vbkVycm9yTm9kZQorCitSZXByZXNlbnRzIGEgc2VyaWVzIG9mIGVycm9uZW91cyB0b2tlbnMgZnJvbSBhIHRva2VuIHN0cmVhbSBpbnB1dAorCis9ZW5kCisKK2NsYXNzIENvbW1vbkVycm9yTm9kZSA8IENvbW1vblRyZWUKKyAgaW5jbHVkZSBBTlRMUjM6OkVycm9yCisgIGluY2x1ZGUgQU5UTFIzOjpDb25zdGFudHMKKyAgCisgIGF0dHJfYWNjZXNzb3IgOmlucHV0LCA6c3RhcnQsIDpzdG9wLCA6ZXJyb3IKKyAgCisgIGRlZiBpbml0aWFsaXplKCBpbnB1dCwgc3RhcnQsIHN0b3AsIGVycm9yICkKKyAgICBzdXBlciggbmlsICkKKyAgICBzdG9wID0gc3RhcnQgaWYgc3RvcC5uaWw/IG9yCisgICAgICAoIHN0b3AudG9rZW5faW5kZXggPCBzdGFydC50b2tlbl9pbmRleCBhbmQgc3RvcC50eXBlICE9IEVPRiApCisgICAgQGlucHV0ID0gaW5wdXQKKyAgICBAc3RhcnQgPSBzdGFydAorICAgIEBzdG9wID0gc3RvcAorICAgIEBlcnJvciA9IGVycm9yCisgIGVuZAorICAKKyAgZGVmIGZsYXRfbGlzdD8KKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCisgIAorICBkZWYgdHlwZQorICAgIElOVkFMSURfVE9LRU5fVFlQRQorICBlbmQKKyAgCisgIGRlZiB0ZXh0CisgICAgY2FzZSBAc3RhcnQKKyAgICB3aGVuIFRva2VuCisgICAgICBpID0gQHN0YXJ0LnRva2VuX2luZGV4CisgICAgICBqID0gKCBAc3RvcC50eXBlID09IEVPRiApID8gQGlucHV0LnNpemUgOiBAc3RvcC50b2tlbl9pbmRleAorICAgICAgQGlucHV0LnRvX3MoIGksIGogKSAgICAgICAgICAgICMgPC0gdGhlIGJhZCB0ZXh0CisgICAgd2hlbiBUcmVlCisgICAgICBAaW5wdXQudG9fcyggQHN0YXJ0LCBAc3RvcCApICAgIyA8LSB0aGUgYmFkIHRleHQKKyAgICBlbHNlCisgICAgICAiPHVua25vd24+IgorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB0b19zCisgICAgY2FzZSBAZXJyb3IKKyAgICB3aGVuIE1pc3NpbmdUb2tlbgorICAgICAgIjxtaXNzaW5nIHR5cGU6ICN7IEBlcnJvci5taXNzaW5nX3R5cGUgfT4iCisgICAgd2hlbiBVbndhbnRlZFRva2VuCisgICAgICAiPGV4dHJhbmVvdXM6ICN7IEBlcnJvci50b2tlbi5pbnNwZWN0IH0sIHJlc3luYyA9ICN7IHRleHQgfT4iCisgICAgd2hlbiBNaXNtYXRjaGVkVG9rZW4KKyAgICAgICI8bWlzbWF0Y2hlZCB0b2tlbjogI3sgQGVycm9yLnRva2VuLmluc3BlY3QgfSwgcmVzeW5jID0gI3sgdGV4dCB9PiIKKyAgICB3aGVuIE5vVmlhYmxlQWx0ZXJuYXRpdmUKKyAgICAgICI8dW5leHBlY3RlZDogI3sgQGVycm9yLnRva2VuLmluc3BlY3QgfSwgcmVzeW5jID0gI3sgdGV4dCB9PiIKKyAgICBlbHNlICI8ZXJyb3I6ICN7IHRleHQgfT4iCisgICAgZW5kCisgIGVuZAorICAKK2VuZAorCitDb25zdGFudHM6OklOVkFMSURfTk9ERSA9IENvbW1vblRyZWUubmV3KCBBTlRMUjM6OklOVkFMSURfVE9LRU4gKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFRyZWUgQWRhcHRvcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpUcmVlQWRhcHRvcgorCitTaW5jZSBhIHRyZWUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGEgbXVsdGl0dWRlIG9mIGZvcm1hdHMsIEFOVExSJ3MgdHJlZS1yZWxhdGVkCitjb2RlIG1hbmRhdGVzIHRoZSB1c2Ugb2YgVHJlZSBBZGFwdG9yIG9iamVjdHMgdG8gYnVpbGQgYW5kIG1hbmlwdWxhdGUgYW55IGFjdHVhbAordHJlZXMuIFVzaW5nIGFuIGFkYXB0b3Igb2JqZWN0IHBlcm1pdHMgYSBzaW5nbGUgcmVjb2duaXplciB0byB3b3JrIHdpdGggYW55CitudW1iZXIgb2YgZGlmZmVyZW50IHRyZWUgc3RydWN0dXJlcyB3aXRob3V0IGFkZGluZyByaWdpZCBpbnRlcmZhY2UgcmVxdWlyZW1lbnRzCitvbiBjdXN0b21pemVkIHRyZWUgc3RydWN0dXJlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlcHJlc2VudCB0cmVlcyB1c2luZworc2ltcGxlIGFycmF5cyBvZiBhcnJheXMsIHlvdSBqdXN0IG5lZWQgdG8gZGVzaWduIGFuIGFwcHJvcHJpYXRlIHRyZWUgYWRhcHRvciBhbmQKK3Byb3ZpZGUgaXQgdG8gdGhlIHBhcnNlci4KKworVHJlZSBhZGFwdG9ycyBhcmUgdGFza2VkIHdpdGg6CisKKyogY29weWluZyBhbmQgY3JlYXRpbmcgdHJlZSBub2RlcyBhbmQgdG9rZW5zCisqIGRlZmluaW5nIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGJldHdlZW4gbm9kZXMKKyogY2xlYW5pbmcgdXAgLyBub3JtYWxpemluZyBhIGZ1bGwgdHJlZSBzdHJ1Y3R1cmUgYWZ0ZXIgY29uc3RydWN0aW9uCisqIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIGF0dHJpYnV0ZXMgQU5UTFIgZXhwZWN0cyBvZiB0cmVlIG5vZGVzCisqIHByb3ZpZGluZyBub2RlIGFjY2VzcyBhbmQgaXRlcmF0aW9uCisKKz1lbmQKKworbW9kdWxlIFRyZWVBZGFwdG9yCisgIGluY2x1ZGUgVG9rZW5GYWN0b3J5CisgIGluY2x1ZGUgQ29uc3RhbnRzCisgIGluY2x1ZGUgRXJyb3IKKyAgCisgIGRlZiBhZGRfY2hpbGQoIHRyZWUsIGNoaWxkICkKKyAgICB0cmVlLmFkZF9jaGlsZCggY2hpbGQgKSBpZiB0cmVlIGFuZCBjaGlsZAorICBlbmQKKyAgCisgIGRlZiBjaGlsZF9jb3VudCggdHJlZSApCisgICAgdHJlZS5jaGlsZF9jb3VudAorICBlbmQKKyAgCisgIGRlZiBjaGlsZF9pbmRleCggdHJlZSApCisgICAgdHJlZS5jaGlsZF9pbmRleCByZXNjdWUgMAorICBlbmQKKyAgCisgIGRlZiBjaGlsZF9vZiggdHJlZSwgaW5kZXggKQorICAgIHRyZWUubmlsPyA/IG5pbCA6IHRyZWUuY2hpbGQoIGluZGV4ICkKKyAgZW5kCisgIAorICBkZWYgY29weV9ub2RlKCB0cmVlX25vZGUgKQorICAgIHRyZWVfbm9kZSBhbmQgdHJlZV9ub2RlLmR1cAorICBlbmQKKworICBkZWYgY29weV90cmVlKCB0cmVlLCBwYXJlbnQgPSBuaWwgKQorICAgIHRyZWUgb3IgcmV0dXJuIG5pbAorICAgIG5ld190cmVlID0gY29weV9ub2RlKCB0cmVlICkKKyAgICBzZXRfY2hpbGRfaW5kZXgoIG5ld190cmVlLCBjaGlsZF9pbmRleCggdHJlZSApICkKKyAgICBzZXRfcGFyZW50KCBuZXdfdHJlZSwgcGFyZW50ICkKKyAgICBlYWNoX2NoaWxkKCB0cmVlICkgZG8gfCBjaGlsZCB8CisgICAgICBuZXdfc3ViX3RyZWUgPSBjb3B5X3RyZWUoIGNoaWxkLCBuZXdfdHJlZSApCisgICAgICBhZGRfY2hpbGQoIG5ld190cmVlLCBuZXdfc3ViX3RyZWUgKQorICAgIGVuZAorICAgIHJldHVybiBuZXdfdHJlZQorICBlbmQKKyAgCisgIGRlZiBkZWxldGVfY2hpbGQoIHRyZWUsIGluZGV4ICkKKyAgICB0cmVlLmRlbGV0ZV9jaGlsZCggaW5kZXggKQorICBlbmQKKyAgCisgIAorICBkZWYgZWFjaF9jaGlsZCggdHJlZSApCisgICAgYmxvY2tfZ2l2ZW4/IG9yIHJldHVybiBlbnVtX2ZvciggOmVhY2hfY2hpbGQsIHRyZWUgKQorICAgIGZvciBpIGluIDAgLi4uIGNoaWxkX2NvdW50KCB0cmVlICkKKyAgICAgIHlpZWxkKCBjaGlsZF9vZiggdHJlZSwgaSApICkKKyAgICBlbmQKKyAgICByZXR1cm4gdHJlZQorICBlbmQKKyAgCisgIGRlZiBlYWNoX2FuY2VzdG9yKCB0cmVlLCBpbmNsdWRlX3RyZWUgPSB0cnVlICkKKyAgICBibG9ja19naXZlbj8gb3IgcmV0dXJuIGVudW1fZm9yKCA6ZWFjaF9hbmNlc3RvciwgdHJlZSwgaW5jbHVkZV90cmVlICkKKyAgICBpZiBpbmNsdWRlX3RyZWUKKyAgICAgIGJlZ2luIHlpZWxkKCB0cmVlICkgZW5kIHdoaWxlIHRyZWUgPSBwYXJlbnRfb2YoIHRyZWUgKQorICAgIGVsc2UKKyAgICAgIHdoaWxlIHRyZWUgPSBwYXJlbnRfb2YoIHRyZWUgKSBkbyB5aWVsZCggdHJlZSApIGVuZAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBmbGF0X2xpc3Q/KCB0cmVlICkKKyAgICB0cmVlLmZsYXRfbGlzdD8KKyAgZW5kCisgIAorICBkZWYgZW1wdHk/KCB0cmVlICkKKyAgICBjaGlsZF9jb3VudCggdHJlZSApLnplcm8/CisgIGVuZAorICAKKyAgZGVmIHBhcmVudCggdHJlZSApCisgICAgdHJlZS5wYXJlbnQKKyAgZW5kCisgIAorICBkZWYgcmVwbGFjZV9jaGlsZHJlbiggcGFyZW50LCBzdGFydCwgc3RvcCwgcmVwbGFjZW1lbnQgKQorICAgIHBhcmVudCBhbmQgcGFyZW50LnJlcGxhY2VfY2hpbGRyZW4oIHN0YXJ0LCBzdG9wLCByZXBsYWNlbWVudCApCisgIGVuZAorCisgIGRlZiBydWxlX3Bvc3RfcHJvY2Vzc2luZyggcm9vdCApCisgICAgaWYgcm9vdCBhbmQgcm9vdC5mbGF0X2xpc3Q/CisgICAgICBjYXNlIHJvb3QuY2hpbGRfY291bnQKKyAgICAgIHdoZW4gMCB0aGVuIHJvb3QgPSBuaWwKKyAgICAgIHdoZW4gMQorICAgICAgICByb290ID0gcm9vdC5jaGlsZCggMCApLmRldGFjaAorICAgICAgZW5kCisgICAgZW5kCisgICAgcmV0dXJuIHJvb3QKKyAgZW5kCisgIAorICBkZWYgc2V0X2NoaWxkX2luZGV4KCB0cmVlLCBpbmRleCApCisgICAgdHJlZS5jaGlsZF9pbmRleCA9IGluZGV4CisgIGVuZAorCisgIGRlZiBzZXRfcGFyZW50KCB0cmVlLCBwYXJlbnQgKQorICAgIHRyZWUucGFyZW50ID0gcGFyZW50CisgIGVuZAorICAKKyAgZGVmIHNldF90b2tlbl9ib3VuZGFyaWVzKCB0cmVlLCBzdGFydF90b2tlbiA9IG5pbCwgc3RvcF90b2tlbiA9IG5pbCApCisgICAgcmV0dXJuIHVubGVzcyB0cmVlCisgICAgc3RhcnQgPSBzdG9wID0gMAorICAgIHN0YXJ0X3Rva2VuIGFuZCBzdGFydCA9IHN0YXJ0X3Rva2VuLmluZGV4CisgICAgc3RvcF90b2tlbiAgYW5kIHN0b3AgID0gc3RvcF90b2tlbi5pbmRleAorICAgIHRyZWUuc3RhcnRfaW5kZXggPSBzdGFydAorICAgIHRyZWUuc3RvcF9pbmRleCA9IHN0b3AKKyAgICByZXR1cm4gdHJlZQorICBlbmQKKworICBkZWYgdGV4dF9vZiggdHJlZSApCisgICAgdHJlZS50ZXh0IHJlc2N1ZSBuaWwKKyAgZW5kCisKKyAgZGVmIHRva2VuKCB0cmVlICkKKyAgICBDb21tb25UcmVlID09PSB0cmVlID8gdHJlZS50b2tlbiA6IG5pbAorICBlbmQKKworICBkZWYgdG9rZW5fc3RhcnRfaW5kZXgoIHRyZWUgKQorICAgIHRyZWUgPyB0cmVlLnRva2VuX3N0YXJ0X2luZGV4IDogLTEKKyAgZW5kCisgIAorICBkZWYgdG9rZW5fc3RvcF9pbmRleCggdHJlZSApCisgICAgdHJlZSA/IHRyZWUudG9rZW5fc3RvcF9pbmRleCA6IC0xCisgIGVuZAorICAKKyAgZGVmIHR5cGVfbmFtZSggdHJlZSApCisgICAgdHJlZS5uYW1lIHJlc2N1ZSAnSU5WQUxJRCcKKyAgZW5kCisgIAorICBkZWYgdHlwZV9vZiggdHJlZSApCisgICAgdHJlZS50eXBlIHJlc2N1ZSBJTlZBTElEX1RPS0VOX1RZUEUKKyAgZW5kCisgIAorICBkZWYgdW5pcXVlX2lkKCBub2RlICkKKyAgICBub2RlLmhhc2gKKyAgZW5kCisgIAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpDb21tb25UcmVlQWRhcHRvcgorCitUaGUgZGVmYXVsdCB0cmVlIGFkYXB0b3IgdXNlZCBieSBBTlRMUi1nZW5lcmF0ZWQgdHJlZSBjb2RlLiBJdCwgb2YgY291cnNlLAorYnVpbGRzIGFuZCBtYW5pcHVsYXRlcyBDb21tb25UcmVlIG5vZGVzLgorCis9ZW5kCisKK2NsYXNzIENvbW1vblRyZWVBZGFwdG9yCisgIGV4dGVuZCBDbGFzc01hY3JvcworICBpbmNsdWRlIFRyZWVBZGFwdG9yCisgIGluY2x1ZGUgQU5UTFIzOjpDb25zdGFudHMKKyAgCisgIGRlZiBpbml0aWFsaXplKCB0b2tlbl9jbGFzcyA9IEFOVExSMzo6Q29tbW9uVG9rZW4gKQorICAgIEB0b2tlbl9jbGFzcyA9IHRva2VuX2NsYXNzCisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV9mbGF0X2xpc3QKKyAgICByZXR1cm4gY3JlYXRlX3dpdGhfcGF5bG9hZCggbmlsICkKKyAgZW5kCisgIGFsaWFzIGNyZWF0ZV9mbGF0X2xpc3QhIGNyZWF0ZV9mbGF0X2xpc3QKKyAgCisgIGRlZiBiZWNvbWVfcm9vdCggbmV3X3Jvb3QsIG9sZF9yb290ICkKKyAgICBuZXdfcm9vdCA9IGNyZWF0ZSggbmV3X3Jvb3QgKSBpZiBuZXdfcm9vdC5pc19hPyggVG9rZW4gKQorICAgIG9sZF9yb290IG9yIHJldHVybiggbmV3X3Jvb3QgKQorICAgIAorICAgIG5ld19yb290ID0gY3JlYXRlX3dpdGhfcGF5bG9hZCggbmV3X3Jvb3QgKSB1bmxlc3MgQ29tbW9uVHJlZSA9PT0gbmV3X3Jvb3QKKyAgICBpZiBuZXdfcm9vdC5mbGF0X2xpc3Q/CisgICAgICBjb3VudCA9IG5ld19yb290LmNoaWxkX2NvdW50CisgICAgICBpZiBjb3VudCA9PSAxCisgICAgICAgIG5ld19yb290ID0gbmV3X3Jvb3QuY2hpbGQoIDAgKQorICAgICAgZWxzaWYgY291bnQgPiAxCisgICAgICAgIHJhaXNlIFRyZWVJbmNvbnNpc3RlbmN5Lm11bHRpcGxlX3Jvb3RzIQorICAgICAgZW5kCisgICAgZW5kCisgICAgCisgICAgbmV3X3Jvb3QuYWRkX2NoaWxkKCBvbGRfcm9vdCApCisgICAgcmV0dXJuIG5ld19yb290CisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV9mcm9tX3Rva2VuKCB0b2tlbl90eXBlLCBmcm9tX3Rva2VuLCB0ZXh0ID0gbmlsICkKKyAgICBmcm9tX3Rva2VuID0gZnJvbV90b2tlbi5kdXAKKyAgICBmcm9tX3Rva2VuLnR5cGUgPSB0b2tlbl90eXBlCisgICAgZnJvbV90b2tlbi50ZXh0ID0gdGV4dC50b19zIGlmIHRleHQKKyAgICB0cmVlID0gY3JlYXRlX3dpdGhfcGF5bG9hZCggZnJvbV90b2tlbiApCisgICAgcmV0dXJuIHRyZWUKKyAgZW5kCisgIAorICBkZWYgY3JlYXRlX2Zyb21fdHlwZSggdG9rZW5fdHlwZSwgdGV4dCApCisgICAgZnJvbV90b2tlbiA9IGNyZWF0ZV90b2tlbiggdG9rZW5fdHlwZSwgREVGQVVMVF9DSEFOTkVMLCB0ZXh0ICkKKyAgICBjcmVhdGVfd2l0aF9wYXlsb2FkKCBmcm9tX3Rva2VuICkKKyAgZW5kCisgIAorICBkZWYgY3JlYXRlX2Vycm9yX25vZGUoIGlucHV0LCBzdGFydCwgc3RvcCwgZXhjICkKKyAgICBDb21tb25FcnJvck5vZGUubmV3KCBpbnB1dCwgc3RhcnQsIHN0b3AsIGV4YyApCisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV93aXRoX3BheWxvYWQoIHBheWxvYWQgKQorICAgIHJldHVybiBDb21tb25UcmVlLm5ldyggcGF5bG9hZCApCisgIGVuZAorCisgIGRlZiBjcmVhdGUoICphcmdzICkKKyAgICBuID0gYXJncy5sZW5ndGgKKyAgICBpZiBuID09IDEgYW5kIGFyZ3MuZmlyc3QuaXNfYT8oIFRva2VuICkgdGhlbiBjcmVhdGVfd2l0aF9wYXlsb2FkKCBhcmdzWyAwIF0gKQorICAgIGVsc2lmIG4gPT0gMiBhbmQgSW50ZWdlciA9PT0gYXJncy5maXJzdCBhbmQgU3RyaW5nID09PSBhcmdzWyAxIF0KKyAgICAgIGNyZWF0ZV9mcm9tX3R5cGUoICphcmdzICkKKyAgICBlbHNpZiBuID49IDIgYW5kIEludGVnZXIgPT09IGFyZ3MuZmlyc3QKKyAgICAgIGNyZWF0ZV9mcm9tX3Rva2VuKCAqYXJncyApCisgICAgZWxzZQorICAgICAgc2lnID0gYXJncy5tYXAgeyB8ZnwgZi5jbGFzcyB9LmpvaW4oICcsICcgKQorICAgICAgcmFpc2UgVHlwZUVycm9yLCAiTm8gY3JlYXRlIG1ldGhvZCB3aXRoIHRoaXMgc2lnbmF0dXJlIGZvdW5kOiAoI3sgc2lnIH0pIgorICAgIGVuZAorICBlbmQKKyAgCisgIGNyZWF0aW9uX21ldGhvZHMgPSAldygKKyAgICBjcmVhdGVfZnJvbV90b2tlbiBjcmVhdGVfZnJvbV90eXBlCisgICAgY3JlYXRlX2Vycm9yX25vZGUgY3JlYXRlX3dpdGhfcGF5bG9hZAorICAgIGNyZWF0ZQorICApCisgIAorICBmb3IgbWV0aG9kX25hbWUgaW4gY3JlYXRpb25fbWV0aG9kcworICAgIGJhbmdfbWV0aG9kID0gbWV0aG9kX25hbWUgKyAnIScKKyAgICBhbGlhc19tZXRob2QoIGJhbmdfbWV0aG9kLCBtZXRob2RfbmFtZSApCisgICAgZGVwcmVjYXRlKCBiYW5nX21ldGhvZCwgInVzZSBtZXRob2QgIyN7IG1ldGhvZF9uYW1lIH0gaW5zdGVhZCIgKQorICBlbmQKKyAgCisgIGRlZiBydWxlX3Bvc3RfcHJvY2Vzc2luZyggcm9vdCApCisgICAgaWYgcm9vdCBhbmQgcm9vdC5mbGF0X2xpc3Q/CisgICAgICBpZiByb290LmVtcHR5PyB0aGVuIHJvb3QgPSBuaWwKKyAgICAgIGVsc2lmIHJvb3QuY2hpbGRfY291bnQgPT0gMSB0aGVuIHJvb3QgPSByb290LmZpcnN0LmRldGFjaAorICAgICAgZW5kCisgICAgZW5kCisgICAgcmV0dXJuIHJvb3QKKyAgZW5kCisgIAorICBkZWYgZW1wdHk/KCB0cmVlICkKKyAgICB0cmVlLmVtcHR5PworICBlbmQKKyAgCisgIGRlZiBlYWNoX2NoaWxkKCB0cmVlICkKKyAgICBibG9ja19naXZlbj8gb3IgcmV0dXJuIGVudW1fZm9yKCA6ZWFjaF9jaGlsZCwgdHJlZSApCisgICAgdHJlZS5lYWNoIGRvIHwgY2hpbGQgfAorICAgICAgeWllbGQoIGNoaWxkICkKKyAgICBlbmQKKyAgZW5kCisgIAorZW5kCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBUcmVlIFN0cmVhbXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6VHJlZU5vZGVTdHJlYW0KKworVHJlZU5vZGVTdHJlYW1zIGZsYXR0ZW4gdHdvLWRpbWVuc2lvbmFsIHRyZWUgc3RydWN0dXJlcyBpbnRvIG9uZS1kaW1lbnNpb25hbAorc2VxdWVuY2VzLiBUaGV5IHByZXNlcnZlIHRoZSB0d28tZGltZW5zaW9uYWwgc3RydWN0dXJlIG9mIHRoZSB0cmVlIGJ5IGluc2VydGluZworc3BlY2lhbCArVVArIGFuZCArRE9XTisgbm9kZXMuCisKK0NvbnNpZGVyIGEgaHlwb3RoZXRpY2FsIHRyZWU6CisKKyAgW0FdCisgICArLS1bQl0KKyAgIHwgICArLS1bQ10KKyAgIHwgICBgLS1bRF0KKyAgIGAtLVtFXQorICAgICAgIGAtLVtGXQorCitBIHRyZWUgbm9kZSBzdHJlYW0gd291bGQgc2VyaWFsaXplIHRoZSB0cmVlIGludG8gdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKworICBBIERPV04gQiBET1dOIEMgRCBVUCBFIERPV04gRiBVUCBVUCBFT0YKKworT3RoZXIgdGhhbiBzZXJpYWxpemluZyBhIHRyZWUgaW50byBhIHNlcXVlbmNlIG9mIG5vZGVzLCBhIHRyZWUgbm9kZSBzdHJlYW0KK29wZXJhdGVzIHNpbWlsYXJseSB0byBvdGhlciBzdHJlYW1zLiBUaGV5IGFyZSBjb21tb25seSB1c2VkIGJ5IHRyZWUgcGFyc2VycyBhcwordGhlIG1haW4gZm9ybSBvZiBpbnB1dC4gI3BlZWssIGxpa2UgdG9rZW4gc3RyZWFtcywgcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdG9rZW4KK29mIHRoZSBuZXh0IG5vZGUuICNsb29rIHJldHVybnMgdGhlIG5leHQgZnVsbCB0cmVlIG5vZGUuCisKKz1lbmQKKworbW9kdWxlIFRyZWVOb2RlU3RyZWFtCisgIGV4dGVuZCBDbGFzc01hY3JvcworICBpbmNsdWRlIFN0cmVhbQorICBpbmNsdWRlIENvbnN0YW50cworICAKKyAgYWJzdHJhY3QgOmF0CisgIGFic3RyYWN0IDpsb29rCisgIGFic3RyYWN0IDp0cmVlX3NvdXJjZQorICBhYnN0cmFjdCA6dG9rZW5fc3RyZWFtCisgIGFic3RyYWN0IDp0cmVlX2FkYXB0b3IKKyAgYWJzdHJhY3QgOnVuaXF1ZV9uYXZpZ2F0aW9uX25vZGVzPQorICBhYnN0cmFjdCA6dG9fcworICBhYnN0cmFjdCA6cmVwbGFjZV9jaGlsZHJlbgorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbQorCitBbiBpbXBsZW1lbnRhdGlvbiBvZiBUcmVlTm9kZVN0cmVhbSB0YWlsZWQgZm9yIHN0cmVhbXMgYmFzZWQgb24gQ29tbW9uVHJlZQorb2JqZWN0cy4gQ29tbW9uVHJlZU5vZGVTdHJlYW1zIGFyZSB0aGUgZGVmYXVsdCBpbnB1dCBzdHJlYW1zIGZvciB0cmVlIHBhcnNlcnMuCisKKz1lbmQKKworY2xhc3MgQ29tbW9uVHJlZU5vZGVTdHJlYW0KKyAgaW5jbHVkZSBUcmVlTm9kZVN0cmVhbQorICAKKyAgYXR0cl9hY2Nlc3NvciA6dG9rZW5fc3RyZWFtCisgIGF0dHJfcmVhZGVyIDphZGFwdG9yLCA6cG9zaXRpb24KKyAgCisgIGRlZiBpbml0aWFsaXplKCAqYXJncyApCisgICAgb3B0aW9ucyA9IGFyZ3MubGFzdC5pc19hPyggOjpIYXNoICkgPyBhcmdzLnBvcCA6IHt9CisgICAgY2FzZSBuID0gYXJncy5sZW5ndGgKKyAgICB3aGVuIDEKKyAgICAgIEByb290ID0gYXJncy5maXJzdAorICAgICAgQHRva2VuX3N0cmVhbSA9IEBhZGFwdG9yID0gQG5vZGVzID0gQGRvd24gPSBAdXAgPSBAZW9mID0gbmlsCisgICAgd2hlbiAyCisgICAgICBAYWRhcHRvciwgQHJvb3QgPSBhcmdzCisgICAgICBAdG9rZW5fc3RyZWFtID0gQG5vZGVzID0gQGRvd24gPSBAdXAgPSBAZW9mID0gbmlsCisgICAgd2hlbiAzCisgICAgICBwYXJlbnQsIHN0YXJ0LCBzdG9wID0gKmFyZ3MKKyAgICAgIEBhZGFwdG9yID0gcGFyZW50LmFkYXB0b3IKKyAgICAgIEByb290ID0gcGFyZW50LnJvb3QKKyAgICAgIEBub2RlcyA9IHBhcmVudC5ub2Rlc1sgc3RhcnQgLi4uIHN0b3AgXQorICAgICAgQGRvd24gPSBwYXJlbnQuZG93bgorICAgICAgQHVwID0gcGFyZW50LnVwCisgICAgICBAZW9mID0gcGFyZW50LmVvZgorICAgICAgQHRva2VuX3N0cmVhbSA9IHBhcmVudC50b2tlbl9zdHJlYW0KKyAgICB3aGVuIDAKKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgwIGZvciAxKSIKKyAgICBlbHNlIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgjeyBuIH0gZm9yIDMpIgorICAgIGVuZAorICAgIEBhZGFwdG9yIHx8PSBvcHRpb25zLmZldGNoKCA6YWRhcHRvciApIHsgQ29tbW9uVHJlZUFkYXB0b3IubmV3IH0KKyAgICBAdG9rZW5fc3RyZWFtIHx8PSBvcHRpb25zWyA6dG9rZW5fc3RyZWFtIF0KKyAgICBAZG93biAgfHw9IG9wdGlvbnMuZmV0Y2goIDpkb3duICkgeyBAYWRhcHRvci5jcmVhdGVfZnJvbV90eXBlKCBET1dOLCAnRE9XTicgKSB9CisgICAgQHVwICAgIHx8PSBvcHRpb25zLmZldGNoKCA6dXAgKSAgIHsgQGFkYXB0b3IuY3JlYXRlX2Zyb21fdHlwZSggVVAsICdVUCcgKSB9CisgICAgQGVvZiAgIHx8PSBvcHRpb25zLmZldGNoKCA6ZW9mICkgIHsgQGFkYXB0b3IuY3JlYXRlX2Zyb21fdHlwZSggRU9GLCAnRU9GJyApIH0KKyAgICBAbm9kZXMgfHw9IFtdCisgICAgCisgICAgQHVuaXF1ZV9uYXZpZ2F0aW9uX25vZGVzID0gb3B0aW9ucy5mZXRjaCggOnVuaXF1ZV9uYXZpZ2F0aW9uX25vZGVzLCBmYWxzZSApCisgICAgQHBvc2l0aW9uID0gLTEKKyAgICBAbGFzdF9tYXJrZXIgPSBuaWwKKyAgICBAY2FsbHMgPSBbXQorICBlbmQKKyAgCisgIGRlZiBmaWxsX2J1ZmZlciggdHJlZSA9IEByb290ICkKKyAgICBAbm9kZXMgPDwgdHJlZSB1bmxlc3MgbmlsX3RyZWUgPSBAYWRhcHRvci5mbGF0X2xpc3Q/KCB0cmVlICkKKyAgICB1bmxlc3MgQGFkYXB0b3IuZW1wdHk/KCB0cmVlICkKKyAgICAgIGFkZF9uYXZpZ2F0aW9uX25vZGUoIERPV04gKSB1bmxlc3MgbmlsX3RyZWUKKyAgICAgIEBhZGFwdG9yLmVhY2hfY2hpbGQoIHRyZWUgKSB7IHwgYyB8IGZpbGxfYnVmZmVyKCBjICkgfQorICAgICAgYWRkX25hdmlnYXRpb25fbm9kZSggVVAgKSB1bmxlc3MgbmlsX3RyZWUKKyAgICBlbmQKKyAgICBAcG9zaXRpb24gPSAwIGlmIHRyZWUgPT0gQHJvb3QKKyAgICByZXR1cm4oIHNlbGYgKQorICBlbmQKKyAgCisgIGRlZiBub2RlX2luZGV4KCBub2RlICkKKyAgICBAcG9zaXRpb24gPT0gLTEgYW5kIGZpbGxfYnVmZmVyCisgICAgcmV0dXJuIEBub2Rlcy5pbmRleCggbm9kZSApCisgIGVuZAorICAKKyAgZGVmIGFkZF9uYXZpZ2F0aW9uX25vZGUoIHR5cGUgKQorICAgIG5hdmlnYXRpb25fbm9kZSA9CisgICAgICBjYXNlIHR5cGUKKyAgICAgIHdoZW4gRE9XTgorICAgICAgICBoYXNfdW5pcXVlX25hdmlnYXRpb25fbm9kZXM/ID8gQGFkYXB0b3IuY3JlYXRlX2Zyb21fdHlwZSggRE9XTiwgJ0RPV04nICkgOiBAZG93bgorICAgICAgZWxzZQorICAgICAgICBoYXNfdW5pcXVlX25hdmlnYXRpb25fbm9kZXM/ID8gQGFkYXB0b3IuY3JlYXRlX2Zyb21fdHlwZSggVVAsICdVUCcgKSA6IEB1cAorICAgICAgZW5kCisgICAgQG5vZGVzIDw8IG5hdmlnYXRpb25fbm9kZQorICBlbmQKKyAgCisgIGRlZiBhdCggaW5kZXggKQorICAgIEBwb3NpdGlvbiA9PSAtMSBhbmQgZmlsbF9idWZmZXIKKyAgICBAbm9kZXMuYXQoIGluZGV4ICkKKyAgZW5kCisgIAorICBkZWYgbG9vayggayA9IDEgKQorICAgIEBwb3NpdGlvbiA9PSAtMSBhbmQgZmlsbF9idWZmZXIKKyAgICBrID09IDAgYW5kIHJldHVybiBuaWwKKyAgICBrIDwgMCBhbmQgcmV0dXJuIHNlbGYubG9va19iZWhpbmQoIC1rICkKKyAgICAKKyAgICBhYnNvbHV0ZSA9IEBwb3NpdGlvbiArIGsgLSAxCisgICAgQG5vZGVzLmZldGNoKCBhYnNvbHV0ZSwgQGVvZiApCisgIGVuZAorICAKKyAgZGVmIGN1cnJlbnRfc3ltYm9sCisgICAgbG9vaworICBlbmQKKyAgCisgIGRlZiBsb29rX2JlaGluZCggayA9IDEgKQorICAgIGsgPT0gMCBhbmQgcmV0dXJuIG5pbAorICAgIGFic29sdXRlID0gQHBvc2l0aW9uIC0gaworICAgIHJldHVybiggYWJzb2x1dGUgPCAwID8gbmlsIDogQG5vZGVzLmZldGNoKCBhYnNvbHV0ZSwgQGVvZiApICkKKyAgZW5kCisgIAorICBkZWYgdHJlZV9zb3VyY2UKKyAgICBAcm9vdAorICBlbmQKKyAgCisgIGRlZiBzb3VyY2VfbmFtZQorICAgIHNlbGYudG9rZW5fc3RyZWFtLnNvdXJjZV9uYW1lCisgIGVuZAorICAKKyAgZGVmIHRyZWVfYWRhcHRvcgorICAgIEBhZGFwdG9yCisgIGVuZAorICAKKyAgZGVmIGhhc191bmlxdWVfbmF2aWdhdGlvbl9ub2Rlcz8KKyAgICByZXR1cm4gQHVuaXF1ZV9uYXZpZ2F0aW9uX25vZGVzCisgIGVuZAorICBhdHRyX3dyaXRlciA6dW5pcXVlX25hdmlnYXRpb25fbm9kZXMKKyAgCisgIGRlZiBjb25zdW1lCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIG5vZGUgPSBAbm9kZXMuZmV0Y2goIEBwb3NpdGlvbiwgQGVvZiApCisgICAgQHBvc2l0aW9uICs9IDEKKyAgICByZXR1cm4oIG5vZGUgKQorICBlbmQKKyAgCisgIGRlZiBwZWVrKCBpID0gMSApCisgICAgQGFkYXB0b3IudHlwZV9vZiBsb29rKCBpICkKKyAgZW5kCisgIAorICBhbGlhcyA+PiBwZWVrCisgIGRlZiA8PCggayApCisgICAgc2VsZiA+PiAtaworICBlbmQKKyAgCisgIGRlZiBtYXJrCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIEBsYXN0X21hcmtlciA9IEBwb3NpdGlvbgorICAgIHJldHVybiBAbGFzdF9tYXJrZXIKKyAgZW5kCisgIAorICBkZWYgcmVsZWFzZSggbWFya2VyID0gbmlsICkKKyAgICAjIGRvIG5vdGhpbmc/CisgIGVuZAorICAKKyAgYWxpYXMgaW5kZXggcG9zaXRpb24KKyAgCisgIGRlZiByZXdpbmQoIG1hcmtlciA9IEBsYXN0X21hcmtlciwgcmVsZWFzZSA9IHRydWUgKQorICAgIHNlZWsoIG1hcmtlciApCisgIGVuZAorCisgIGRlZiBzZWVrKCBpbmRleCApCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIEBwb3NpdGlvbiA9IGluZGV4CisgIGVuZAorICAKKyAgZGVmIHB1c2goIGluZGV4ICkKKyAgICBAY2FsbHMgPDwgQHBvc2l0aW9uCisgICAgc2VlayggaW5kZXggKQorICBlbmQKKyAgCisgIGRlZiBwb3AKKyAgICBwb3MgPSBAY2FsbHMucG9wIGFuZCBzZWVrKCBwb3MgKQorICAgIHJldHVybiBwb3MKKyAgZW5kCisgIAorICBkZWYgcmVzZXQKKyAgICBAcG9zaXRpb24gPSAwCisgICAgQGxhc3RfbWFya2VyID0gMAorICAgIEBjYWxscyA9IFtdCisgIGVuZAorICAKKyAgZGVmIHJlcGxhY2VfY2hpbGRyZW4oIHBhcmVudCwgc3RhcnQsIHN0b3AsIHJlcGxhY2VtZW50ICkKKyAgICBwYXJlbnQgYW5kIEBhZGFwdG9yLnJlcGxhY2VfY2hpbGRyZW4oIHBhcmVudCwgc3RhcnQsIHN0b3AsIHJlcGxhY2VtZW50ICkKKyAgZW5kCisgIAorICBkZWYgc2l6ZQorICAgIEBwb3NpdGlvbiA9PSAtMSBhbmQgZmlsbF9idWZmZXIKKyAgICByZXR1cm4gQG5vZGVzLmxlbmd0aAorICBlbmQKKyAgCisgIGRlZiBpbnNwZWN0CisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIEBub2Rlcy5tYXAgeyB8bmR8IEBhZGFwdG9yLnR5cGVfbmFtZSggbmQgKSB9LmpvaW4oICcgJyApCisgIGVuZAorICAKKyAgZGVmIGV4dHJhY3RfdGV4dCggc3RhcnQgPSBuaWwsIHN0b3AgPSBuaWwgKQorICAgIHN0YXJ0Lm5pbD8gfHwgc3RvcC5uaWw/IGFuZCByZXR1cm4gbmlsCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIAorICAgIGlmIEB0b2tlbl9zdHJlYW0KKyAgICAgIGZyb20gPSBAYWRhcHRvci50b2tlbl9zdGFydF9pbmRleCggc3RhcnQgKQorICAgICAgdG8gPSAKKyAgICAgICAgY2FzZSBAYWRhcHRvci50eXBlX29mKCBzdG9wICkKKyAgICAgICAgd2hlbiBVUCB0aGVuIEBhZGFwdG9yLnRva2VuX3N0b3BfaW5kZXgoIHN0YXJ0ICkKKyAgICAgICAgd2hlbiBFT0YgdGhlbiB0byA9IEBub2Rlcy5sZW5ndGggLSAyCisgICAgICAgIGVsc2UgQGFkYXB0b3IudG9rZW5fc3RvcF9pbmRleCggc3RvcCApCisgICAgICAgIGVuZAorICAgICAgcmV0dXJuIEB0b2tlbl9zdHJlYW0uZXh0cmFjdF90ZXh0KCBmcm9tLCB0byApCisgICAgZW5kCisgICAgCisgICAgYnVmZmVyID0gJycKKyAgICBmb3Igbm9kZSBpbiBAbm9kZXMKKyAgICAgIGlmIG5vZGUgPT0gc3RhcnQgLi4uIG5vZGUgPT0gc3RvcCAgIyA8LS0gaGV5IGxvb2ssIGl0J3MgdGhlIGZsaXAgZmxvcCBvcGVyYXRvcgorICAgICAgICBidWZmZXIgPDwgQGFkYXB0b3IudGV4dF9vZiggbm9kZSApICN8fCAnICcgPDwgQGFkYXB0b3IudHlwZV9vZiggbm9kZSApLnRvX3MgKQorICAgICAgZW5kCisgICAgZW5kCisgICAgcmV0dXJuKCBidWZmZXIgKQorICBlbmQKKyAgCisgIGRlZiBlYWNoCisgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorICAgIGJsb2NrX2dpdmVuPyBvciByZXR1cm4gZW51bV9mb3IoIDplYWNoICkKKyAgICBmb3Igbm9kZSBpbiBAbm9kZXMgZG8geWllbGQoIG5vZGUgKSBlbmQKKyAgICBzZWxmCisgIGVuZAorICAKKyAgaW5jbHVkZSBFbnVtZXJhYmxlCisgIAorICBkZWYgdG9fYQorICAgIHJldHVybiBAbm9kZXMuZHVwCisgIGVuZAorICAKKyAgZGVmIGV4dHJhY3RfdGV4dCggc3RhcnQgPSBuaWwsIHN0b3AgPSBuaWwgKQorICAgIEBwb3NpdGlvbiA9PSAtMSBhbmQgZmlsbF9idWZmZXIKKyAgICBzdGFydCB8fD0gQG5vZGVzLmZpcnN0CisgICAgc3RvcCAgfHw9IEBub2Rlcy5sYXN0CisgICAgCisgICAgaWYgQHRva2VuX3N0cmVhbQorICAgICAgY2FzZSBAYWRhcHRvci50eXBlX29mKCBzdG9wICkKKyAgICAgIHdoZW4gVVAKKyAgICAgICAgc3RvcF9pbmRleCA9IEBhZGFwdG9yLnRva2VuX3N0b3BfaW5kZXgoIHN0YXJ0ICkKKyAgICAgIHdoZW4gRU9GCisgICAgICAgIHJldHVybiBleHRyYWN0X3RleHQoIHN0YXJ0LCBAbm9kZXNbIC0gMiBdICkKKyAgICAgIGVsc2UKKyAgICAgICAgc3RvcF9pbmRleCA9IEBhZGFwdG9yLnRva2VuX3N0b3BfaW5kZXgoIHN0b3AgKQorICAgICAgZW5kCisgICAgICAKKyAgICAgIHN0YXJ0X2luZGV4ID0gQGFkYXB0b3IudG9rZW5fc3RhcnRfaW5kZXgoIHN0YXJ0ICkKKyAgICAgIHJldHVybiBAdG9rZW5fc3RyZWFtLmV4dHJhY3RfdGV4dCggc3RhcnRfaW5kZXgsIHN0b3BfaW5kZXggKQorICAgIGVsc2UKKyAgICAgIHN0YXJ0X2luZGV4ID0gQG5vZGVzLmluZGV4KCBzdGFydCApIHx8IEBub2Rlcy5sZW5ndGgKKyAgICAgIHN0b3BfaW5kZXggID0gQG5vZGVzLmluZGV4KCBzdG9wICkgIHx8IEBub2Rlcy5sZW5ndGgKKyAgICAgIHJldHVybiggCisgICAgICAgIEBub2Rlc1sgc3RhcnRfaW5kZXggLi4gc3RvcF9pbmRleCBdLm1hcCBkbyB8IG4gfAorICAgICAgICAgIEBhZGFwdG9yLnRleHRfb2YoIG4gKSBvciAiICIgKyBAYWRhcHRvci50eXBlX29mKCBuICkudG9fcworICAgICAgICBlbmQuam9pbiggJycgKQorICAgICAgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGFsaWFzIHRvX3MgZXh0cmFjdF90ZXh0CisgIAorI3ByaXZhdGUKKyMgIAorIyAgZGVmIGxpbmVhcl9ub2RlX2luZGV4KCBub2RlICkKKyMgICAgQHBvc2l0aW9uID09IC0xIGFuZCBmaWxsX2J1ZmZlcgorIyAgICBAbm9kZXMuZWFjaF93aXRoX2luZGV4IGRvIHxuLCBpfAorIyAgICAgIG5vZGUgPT0gbiBhbmQgcmV0dXJuKGkpCisjICAgIGVuZAorIyAgICByZXR1cm4gLTEKKyMgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0KKworU3BlY2lhbCB0eXBlIG9mIHN0cmVhbSB0aGF0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB0cmVlLWJ1aWxkaW5nIGFuZCB0cmVlLQorcmV3cml0aW5nIHBhcnNlcnMuCisKKz1lbmQKKworY2xhc3MgUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtICMgPCBBcnJheQorICBleHRlbmQgQ2xhc3NNYWNyb3MKKyAgaW5jbHVkZSBFcnJvcgorICAKKyAgZGVmIGluaXRpYWxpemUoIGFkYXB0b3IsIGVsZW1lbnRfZGVzY3JpcHRpb24sIGVsZW1lbnRzID0gbmlsICkKKyAgICBAY3Vyc29yID0gMAorICAgIEBzaW5nbGVfZWxlbWVudCA9IG5pbAorICAgIEBlbGVtZW50cyA9IG5pbAorICAgIEBkaXJ0eSA9IGZhbHNlCisgICAgQGVsZW1lbnRfZGVzY3JpcHRpb24gPSBlbGVtZW50X2Rlc2NyaXB0aW9uCisgICAgQGFkYXB0b3IgPSBhZGFwdG9yCisgICAgaWYgZWxlbWVudHMuaW5zdGFuY2Vfb2Y/KCBBcnJheSApCisgICAgICBAZWxlbWVudHMgPSBlbGVtZW50cworICAgIGVsc2UKKyAgICAgIGFkZCggZWxlbWVudHMgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiByZXNldAorICAgIEBjdXJzb3IgPSAwCisgICAgQGRpcnR5ID0gdHJ1ZQorICBlbmQKKyAgCisgIGRlZiBhZGQoIGVsICkKKyAgICByZXR1cm4oIG5pbCApIHVubGVzcyBlbAorICAgIGNhc2UKKyAgICB3aGVuICEgZWwgdGhlbiByZXR1cm4oIG5pbCApCisgICAgd2hlbiBAZWxlbWVudHMgdGhlbiBAZWxlbWVudHMgPDwgZWwKKyAgICB3aGVuIEBzaW5nbGVfZWxlbWVudC5uaWw/IHRoZW4gQHNpbmdsZV9lbGVtZW50ID0gZWwKKyAgICBlbHNlCisgICAgICBAZWxlbWVudHMgPSBbIEBzaW5nbGVfZWxlbWVudCwgZWwgXQorICAgICAgQHNpbmdsZV9lbGVtZW50ID0gbmlsCisgICAgICByZXR1cm4oIEBlbGVtZW50cyApCisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIG5leHRfdHJlZQorICAgIGlmIEBkaXJ0eSBvciBAY3Vyc29yID49IGxlbmd0aCAmJiBsZW5ndGggPT0gMQorICAgICAgcmV0dXJuIGR1cCggX19uZXh0X18gKQorICAgIGVuZAorICAgIF9fbmV4dF9fCisgIGVuZAorICAKKyAgYWJzdHJhY3QgOmR1cAorICAKKyAgZGVmIHRvX3RyZWUoIGVsICkKKyAgICByZXR1cm4gZWwKKyAgZW5kCisgIAorICBkZWYgaGFzX25leHQ/CisgICAgcmV0dXJuKCBAc2luZ2xlX2VsZW1lbnQgJiYgQGN1cnNvciA8IDEgb3IKKyAgICAgICAgICAgQGVsZW1lbnRzICYmIEBjdXJzb3IgPCBAZWxlbWVudHMubGVuZ3RoICkKKyAgZW5kCisgIAorICBkZWYgc2l6ZQorICAgIEBzaW5nbGVfZWxlbWVudCBhbmQgcmV0dXJuIDEKKyAgICBAZWxlbWVudHMgYW5kIHJldHVybiBAZWxlbWVudHMubGVuZ3RoCisgICAgcmV0dXJuIDAKKyAgZW5kCisgIAorICBhbGlhcyBsZW5ndGggc2l6ZQorICAKK3ByaXZhdGUKKyAgCisgIGRlZiBfX25leHRfXworICAgIGwgPSBsZW5ndGgKKyAgICBjYXNlCisgICAgd2hlbiBsLnplcm8/CisgICAgICByYWlzZSBFcnJvcjo6UmV3cml0ZUVtcHR5U3RyZWFtLm5ldyggQGVsZW1lbnRfZGVzY3JpcHRpb24gKQorICAgIHdoZW4gQGN1cnNvciA+PSBsCisgICAgICBsID09IDEgYW5kIHJldHVybiB0b190cmVlKCBAc2luZ2xlX2VsZW1lbnQgKQorICAgICAgcmFpc2UgUmV3cml0ZUNhcmRpbmFsaXR5RXJyb3IubmV3KCBAZWxlbWVudF9kZXNjcmlwdGlvbiApCisgICAgd2hlbiBAc2luZ2xlX2VsZW1lbnQKKyAgICAgIEBjdXJzb3IgKz0gMQorICAgICAgcmV0dXJuKCB0b190cmVlKCBAc2luZ2xlX2VsZW1lbnQgKSApCisgICAgZWxzZQorICAgICAgb3V0ID0gdG9fdHJlZSggQGVsZW1lbnRzLmF0KCBAY3Vyc29yICkgKQorICAgICAgQGN1cnNvciArPSAxCisgICAgICByZXR1cm4oIG91dCApCisgICAgZW5kCisgIGVuZAorZW5kCisKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpBU1Q6OlJld3JpdGVSdWxlVG9rZW5TdHJlYW0KKworU3BlY2lhbCB0eXBlIG9mIHN0cmVhbSB0aGF0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB0cmVlLWJ1aWxkaW5nIGFuZCB0cmVlLQorcmV3cml0aW5nIHBhcnNlcnMuCisKKz1lbmQKK2NsYXNzIFJld3JpdGVSdWxlVG9rZW5TdHJlYW0gPCBSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0KKyAgZGVmIG5leHRfbm9kZQorICAgIHJldHVybiBAYWRhcHRvci5jcmVhdGVfd2l0aF9wYXlsb2FkKCBfX25leHRfXyApCisgIGVuZAorICAKKyAgYWxpYXMgOm5leHQgOl9fbmV4dF9fCisgIHB1YmxpYyA6bmV4dAorICAKKyAgZGVmIGR1cCggZWwgKQorICAgIHJhaXNlIFR5cGVFcnJvciwgImR1cCBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgdG9rZW4gc3RyZWFtIgorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtCisKK1NwZWNpYWwgdHlwZSBvZiBzdHJlYW0gdGhhdCBpcyB1c2VkIGludGVybmFsbHkgYnkgdHJlZS1idWlsZGluZyBhbmQgdHJlZS0KK3Jld3JpdGluZyBwYXJzZXJzLgorCis9ZW5kCisKK2NsYXNzIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSA8IFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbQorICBkZWYgbmV4dF9ub2RlCisgICAgaWYgQGRpcnR5IG9yIEBjdXJzb3IgPj0gbGVuZ3RoICYmIGxlbmd0aCA9PSAxCisgICAgICByZXR1cm4gQGFkYXB0b3IuY29weV9ub2RlKCBfX25leHRfXyApCisgICAgZW5kCisgICAgcmV0dXJuIF9fbmV4dF9fCisgIGVuZAorICAKKyAgZGVmIGR1cCggZWwgKQorICAgIEBhZGFwdG9yLmNvcHlfdHJlZSggZWwgKQorICBlbmQKK2VuZAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6UmV3cml0ZVJ1bGVOb2RlU3RyZWFtCisKK1NwZWNpYWwgdHlwZSBvZiBzdHJlYW0gdGhhdCBpcyB1c2VkIGludGVybmFsbHkgYnkgdHJlZS1idWlsZGluZyBhbmQgdHJlZS0KK3Jld3JpdGluZyBwYXJzZXJzLgorCis9ZW5kCisKK2NsYXNzIFJld3JpdGVSdWxlTm9kZVN0cmVhbSA8IFJld3JpdGVSdWxlRWxlbWVudFN0cmVhbQorICBhbGlhcyBuZXh0X25vZGUgX19uZXh0X18KKyAgcHVibGljIDpuZXh0X25vZGUKKyAgZGVmIHRvX3RyZWUoIGVsICkKKyAgICBAYWRhcHRvci5jb3B5X25vZGUoIGVsICkKKyAgZW5kCisgIAorICBkZWYgZHVwKCBlbCApCisgICAgcmFpc2UgVHlwZUVycm9yLCAiZHVwIGNhbid0IGJlIGNhbGxlZCBmb3IgYSBub2RlIHN0cmVhbSIKKyAgZW5kCitlbmQKK2VuZAorCitpbmNsdWRlIEFTVAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdHJlZS9kZWJ1Zy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90cmVlL2RlYnVnLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWQ3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdHJlZS9kZWJ1Zy5yYgpAQCAtMCwwICsxLDE2NCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCittb2R1bGUgQU5UTFIzCittb2R1bGUgRGVidWcKKz1iZWdpbiByZG9jIEFOVExSMzo6RGVidWc6OlRyZWVBZGFwdG9yCisKK0FkZHMgZGVidWdnaW5nIGV2ZW50IGhvb2tzIHRvIFRyZWVBZGFwdG9yIG9iamVjdHMKKworPWVuZAorbW9kdWxlIFRyZWVBZGFwdG9yCisgIAorICBkZWYgc2VsZi53cmFwKCBhZGFwdG9yLCBkZWJ1Z19saXN0ZW5lciA9IG5pbCApCisgICAgYWRhcHRvci5leHRlbmQoIHNlbGYgKQorICAgIGFkYXB0b3IuZGVidWdfbGlzdGVuZXIgPSBkZWJ1Z19saXN0ZW5lcgorICAgIHJldHVybiggYWRhcHRvciApCisgIGVuZAorICAKKyAgYXR0cl9hY2Nlc3NvciA6ZGVidWdfbGlzdGVuZXIKKyAgCisgIGRlZiBjcmVhdGVfd2l0aF9wYXlsb2FkKCBwYXlsb2FkICkKKyAgICBub2RlID0gc3VwZXIKKyAgICBAZGVidWdfbGlzdGVuZXIuY3JlYXRlX25vZGUoIG5vZGUsIHBheWxvYWQgKQorICAgIHJldHVybiBub2RlCisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV9mcm9tX3Rva2VuKCB0b2tlbl90eXBlLCBmcm9tX3Rva2VuLCB0ZXh0ID0gbmlsICkKKyAgICBub2RlID0gc3VwZXIKKyAgICBAZGVidWdfbGlzdGVuZXIuY3JlYXRlX25vZGUoIG5vZGUgKQorICAgIHJldHVybiBub2RlCisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV9mcm9tX3R5cGUoIHRva2VuX3R5cGUsIHRleHQgKQorICAgIG5vZGUgPSBzdXBlcgorICAgIEBkZWJ1Z19saXN0ZW5lci5jcmVhdGVfbm9kZSggbm9kZSApCisgICAgcmV0dXJuIG5vZGUKKyAgZW5kCisgIAorICBkZWYgY3JlYXRlX2Vycm9yX25vZGUoIGlucHV0LCBzdGFydCwgc3RvcCwgZXhjICkKKyAgICBub2RlID0gc3VwZXIKKyAgICBub2RlLm5pbD8gb3IgQGRlYnVnX2xpc3RlbmVyLmVycm9yX25vZGUoIG5vZGUgKQorICAgIHJldHVybiBub2RlCisgIGVuZAorICAKKyAgZGVmIGNvcHlfdHJlZSggdHJlZSApCisgICAgdCA9IHN1cGVyCisgICAgc2ltdWxhdGVfdHJlZV9jb25zdHJ1Y3Rpb24oIHQgKQorICAgIHJldHVybiB0CisgIGVuZAorICAKKyAgZGVmIHNpbXVsYXRlX3RyZWVfY29uc3RydWN0aW9uKCB0cmVlICkKKyAgICBAZGVidWdfbGlzdGVuZXIuY3JlYXRlX25vZGUoIHRyZWUgKQorICAgIGNoaWxkX2NvdW50KCB0cmVlICkudGltZXMgZG8gfGl8CisgICAgICBjaGlsZCA9IHNlbGYuY2hpbGRfb2YoIHRyZWUsIGkgKQorICAgICAgc2ltdWxhdGVfdHJlZV9jb25zdHJ1Y3Rpb24oIGNoaWxkICkKKyAgICAgIEBkZWJ1Z19saXN0ZW5lci5hZGRfY2hpbGQoIHRyZWUsIGNoaWxkICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgY29weV9ub2RlKCB0cmVlX25vZGUgKQorICAgIGR1cGxpY2F0ZSA9IHN1cGVyCisgICAgQGRlYnVnX2xpc3RlbmVyLmNyZWF0ZV9ub2RlIGR1cGxpY2F0ZQorICAgIHJldHVybiBkdXBsaWNhdGUKKyAgZW5kCisgIAorICBkZWYgY3JlYXRlX2ZsYXRfbGlzdAorICAgIG5vZGUgPSBzdXBlcgorICAgIEBkZWJ1Z19saXN0ZW5lci5mbGF0X25vZGUoIG5vZGUgKQorICAgIHJldHVybiBub2RlCisgIGVuZAorICAKKyAgZGVmIGFkZF9jaGlsZCggdHJlZSwgY2hpbGQgKQorICAgIGNhc2UgY2hpbGQKKyAgICB3aGVuIFRva2VuCisgICAgICBub2RlID0gY3JlYXRlX3dpdGhfcGF5bG9hZCggY2hpbGQgKQorICAgICAgYWRkX2NoaWxkKCB0cmVlLCBub2RlICkKKyAgICBlbHNlCisgICAgICB0cmVlLm5pbD8gfHwgY2hpbGQubmlsPyBhbmQgcmV0dXJuCisgICAgICBzdXBlciggdHJlZSwgY2hpbGQgKQorICAgICAgQGRlYnVnX2xpc3RlbmVyLmFkZF9jaGlsZCggdHJlZSwgY2hpbGQgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBiZWNvbWVfcm9vdCggbmV3X3Jvb3QsIG9sZF9yb290ICkKKyAgICBjYXNlIG5ld19yb290CisgICAgd2hlbiBUb2tlbgorICAgICAgbiA9IGNyZWF0ZV93aXRoX3BheWxvYWQoIG5ld19yb290ICkKKyAgICAgIHN1cGVyKCBuLCBvbGRfcm9vdCApCisgICAgZWxzZQorICAgICAgbiA9IHN1cGVyKCBuZXdfcm9vdCwgb2xkX3Jvb3QgKQorICAgIGVuZAorICAgIEBkZWJ1Z19saXN0ZW5lci5iZWNvbWVfcm9vdCggbmV3X3Jvb3QsIG9sZF9yb290ICkKKyAgICByZXR1cm4gbgorICBlbmQKKyAgCisgIGRlZiBzZXRfdG9rZW5fYm91bmRhcmllcyggdHJlZSwgc3RhcnRfdG9rZW4sIHN0b3BfdG9rZW4gKQorICAgIHN1cGVyKCB0cmVlLCBzdGFydF90b2tlbiwgc3RvcF90b2tlbiApCisgICAgcmV0dXJuIHVubGVzcyB0cmVlICYmIHN0YXJ0X3Rva2VuICYmIHN0b3BfdG9rZW4KKyAgICBAZGVidWdfbGlzdGVuZXIuc2V0X3Rva2VuX2JvdW5kYXJpZXMoIHRyZWUsCisgICAgICBzdGFydF90b2tlbi50b2tlbl9pbmRleCwgc3RvcF90b2tlbi50b2tlbl9pbmRleCApCisgIGVuZAorZW5kCisKKz1iZWdpbiByZG9jIEFOVExSMzo6RGVidWc6OlRyZWVOb2RlU3RyZWFtCisKK0EgbW9kdWxlIHRoYXQgd3JhcHMgdG9rZW4gc3RyZWFtIG1ldGhvZHMgd2l0aCBkZWJ1Z2dpbmcgZXZlbnQgY29kZS4gQSBkZWJ1Z2dhYmxlCitwYXJzZXIgd2lsbCA8dHQ+ZXh0ZW5kPC90dD4gaXRzIGlucHV0IHN0cmVhbSB3aXRoIHRoaXMgbW9kdWxlIGlmIHRoZSBzdHJlYW0gaXMKK25vdCBhbHJlYWR5IGEgRGVidWc6OlRyZWVOb2RlU3RyZWFtLgorCis9ZW5kCitjbGFzcyBUcmVlTm9kZVN0cmVhbQorICAKKyAgZGVmIHNlbGYud3JhcCggc3RyZWFtLCBkZWJ1Z19saXN0ZW5lciA9IG5pbCApCisgICAgc3RyZWFtLmV4dGVuZCggc2VsZiApCisgICAgc3RyZWFtLmRlYnVnX2xpc3RlbmVyIHx8PSBkZWJ1Z19saXN0ZW5lcgorICBlbmQKKyAgYXR0cl9hY2Nlc3NvciA6ZGVidWdfbGlzdGVuZXIKKyAgCisgIGRlZiBjb25zdW1lCisgICAgbm9kZSA9IEBpbnB1dCA+PiAxCisgICAgc3VwZXIKKyAgICBAZGVidWdfbGlzdGVuZXIuY29uc3VtZV9ub2RlKCBub2RlICkKKyAgZW5kCisgIAorICBkZWYgbG9vayggaSA9IDEgKQorICAgIG5vZGUgPSBzdXBlcgorICAgIGlkID0gQGFkYXB0b3IudW5pcXVlX2lkKCBub2RlICkKKyAgICB0ZXh0ID0gQGFkYXB0b3IudGV4dF9vZiggbm9kZSApCisgICAgdHlwZSA9IEBhZGFwdG9yLnR5cGVfb2YoIG5vZGUgKQorICAgIEBkZWJ1Z19saXN0ZW5lci5sb29rKCBpLCBub2RlICkKKyAgICByZXR1cm4oIG5vZGUgKQorICBlbmQKKyAgCisgIGRlZiBwZWVrKCBpID0gMSApCisgICAgbm9kZSA9IHNlbGYgPj4gMQorICAgIGlkID0gQGFkYXB0b3IudW5pcXVlX2lkKCBub2RlICkKKyAgICB0ZXh0ID0gQGFkYXB0b3IudGV4dF9vZiggbm9kZSApCisgICAgdHlwZSA9IEBhZGFwdG9yLnR5cGVfb2YoIG5vZGUgKQorICAgIEBkZWJ1Z19saXN0ZW5lci5sb29rKCBpLCBub2RlICkKKyAgICByZXR1cm4oIHR5cGUgKQorICBlbmQKKyAgCisgIGRlZiBtYXJrCisgICAgQGxhc3RfbWFya2VyID0gc3VwZXIKKyAgICBAZGVidWdfbGlzdGVuZXIubWFyayggQGxhc3RfbWFya2VyICkKKyAgICByZXR1cm4oIEBsYXN0X21hcmtlciApCisgIGVuZAorICAKKyAgZGVmIHJld2luZCggbWFya2VyID0gbmlsICkKKyAgICBAZGVidWdfbGlzdGVuZXIucmV3aW5kKCBtYXJrZXIgKQorICAgIHN1cGVyKCBtYXJrZXIgfHwgQGxhc3RfbWFya2VyICkKKyAgZW5kCisKKz1iZWdpbiAgIFRoaXMgYWN0dWFsbHkgZGlmZmVycyB3aXRoIHJlc2V0IGluIENvbW1vblRyZWVOb2RlU3RyZWFtIC0tIHdoeSBpcyB0aGlzIG9uZSBibGFuaz8KKyAgZGVmIHJlc2V0CisgICAgIyBkbyBub3RoaW5nCisgIGVuZAorPWVuZAorCitlbmQKKworCitlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3RyZWUvdmlzaXRvci5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90cmVlL3Zpc2l0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ZjBiZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90cmVlL3Zpc2l0b3IucmIKQEAgLTAsMCArMSw4NCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCis9YmVnaW4gTElDRU5TRQorCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBLeWxlIFlldHRlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz1lbmQKKworbW9kdWxlIEFOVExSMworbW9kdWxlIEFTVAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6VmlzaXRvcgorCitBU1Q6OlZpc2l0b3IgaXMgYW4gZXh0cmEgdXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIHRyZWUgb2JqZWN0cy4gVmlzaXRvcgorb2JqZWN0cyBhcmUgc2ltaWxhciB0byBwbGFpbiB2YW5pbGxhIGl0ZXJhdG9ycywgYnV0IHByb3ZpZGUgdHdvIGFjdGlvbiBob29rcywKK2luc3RlYWQgYSBzdGFuZGFyZCBzaW5nbGUgaXRlcmF0aW9uIGJsb2NrLiBUaGUgPHR0PnZpc2l0KHRyZWUpPC90dD4gbWV0aG9kIHdhbGtzCit0aHJvdWdoIGVhY2ggbm9kZSBvZiB0aGUgdHJlZSAodG9wLWRvd24gbGVmdC10by1yaWdodCkuIElmICtwcmVfYWN0aW9uKyBpcworZGVmaW5lZCwgYSBub2RlIGlzIHlpZWxkZWQgdG8gdGhlIGJsb2NrIHdoZW4gaXQgaGFzIGJlZW4gaW5pdGlhbGx5IGVudGVyZWQuIElmCisrcG9zdF9hY3Rpb24rIGlzIGRlZmluZWQsIGEgbm9kZSBpcyB5aWVsZGVkIHRvIHRoZSBibG9jayBhZnRlciBhbGwgb2YgaXRzCitjaGlsZHJlbiBoYXZlIGJlZW4gdmlzaXRlZC4KKworPWVuZAorCitjbGFzcyBWaXNpdG9yCisgIGRlZiBpbml0aWFsaXplKCBhZGFwdG9yID0gbmlsICkKKyAgICBAYWRhcHRvciA9IGFkYXB0b3IgfHwgQ29tbW9uVHJlZUFkYXB0b3IubmV3KCkKKyAgICBAcHJlX2FjdGlvbiA9IG5pbAorICAgIEBwb3N0X2FjdGlvbiA9IG5pbAorICAgIGJsb2NrX2dpdmVuPyBhbmQgeWllbGQoIHNlbGYgKQorICBlbmQKKyAgCisgIGRlZiBwcmVfYWN0aW9uKCAmYmxvY2sgKQorICAgIGJsb2NrX2dpdmVuPyBhbmQgQHByZV9hY3Rpb24gPSBibG9jaworICAgIHJldHVybiBAcHJlX2FjdGlvbgorICBlbmQKKyAgCisgIGRlZiBwb3N0X2FjdGlvbiggJmJsb2NrICkKKyAgICBibG9ja19naXZlbj8gYW5kIEBwb3N0X2FjdGlvbiA9IGJsb2NrCisgICAgcmV0dXJuIEBwb3N0X2FjdGlvbgorICBlbmQKKyAgCisgIGRlZiB2aXNpdCggdHJlZSwgcHJlX2FjdGlvbiA9IG5pbCwgcG9zdF9hY3Rpb24gPSBuaWwgKQorICAgIGZsYXQgPSBAYWRhcHRvci5mbGF0X2xpc3Q/KCB0cmVlICkKKyAgICBiZWZvcmUgPSBwcmVfYWN0aW9uIHx8IEBwcmVfYWN0aW9uCisgICAgYWZ0ZXIgPSBwb3N0X2FjdGlvbiB8fCBAcG9zdF9hY3Rpb24KKyAgICAKKyAgICB0cmVlID0gYmVmb3JlLmNhbGwoIHRyZWUgKSB1bmxlc3MgYmVmb3JlLm5pbD8gb3IgZmxhdAorICAgIEBhZGFwdG9yLmNoaWxkX2NvdW50KCB0cmVlICkudGltZXMgZG8gfGluZGV4fAorICAgICAgY2hpbGQgPSBAYWRhcHRvci5jaGlsZF9vZiggdHJlZSwgaW5kZXggKQorICAgICAgdmlzaXQoIGNoaWxkLCBwcmVfYWN0aW9uLCBwb3N0X2FjdGlvbiApCisgICAgZW5kCisgICAgdHJlZSA9IGFmdGVyLmNhbGwoIHRyZWUgKSB1bmxlc3MgYWZ0ZXIubmlsPyBvciBmbGF0CisgICAgCisgICAgcmV0dXJuIHRyZWUKKyAgZW5kCitlbmQKK2VuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdHJlZS93aXphcmQucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdHJlZS93aXphcmQucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0MDliNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy90cmVlL3dpemFyZC5yYgpAQCAtMCwwICsxLDQ5MyBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCis9YmVnaW4gTElDRU5TRQorCitbVGhlICJCU0QgbGljZW5jZSJdCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBLeWxlIFlldHRlcgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKz1lbmQKKworcmVxdWlyZSAnYW50bHIzJworCittb2R1bGUgQU5UTFIzCittb2R1bGUgQVNUCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpXaXphcmQKKworQVNUOjpXaXphcmQgaXMgYW4gZXh0cmEgdXRpbGl0eSBjbGFzcyB0aGF0IGFsbG93cyBxdWljayBjcmVhdGlvbiBvZiBBU1Qgb2JqZWN0cwordXNpbmcgZGVmaW5pdGlvbnMgd3JpdGluZyBpbiBBTlRMUi1zdHlsZSB0cmVlIGRlZmluaXRpb24gc3ludGF4LiBJdCBjYW4gYWxzbworZGVmaW5lIDxpPnRyZWUgcGF0dGVybnM8L2k+LCBvYmplY3RzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBzaW1pbGFyIHRvIHJlZ3VsYXIKK2V4cHJlc3Npb25zLiBQYXR0ZXJucyBhbGxvdyBhIHNpbXBsZSBtZXRob2QgZm9yIHJlY3Vyc2l2ZWx5IHNlYXJjaGluZyB0aHJvdWdoIGFuCitBU1QgZm9yIGEgcGFydGljdWxhciBub2RlIHN0cnVjdHVyZS4gVGhlc2UgZmVhdHVyZXMgbWFrZSB0cmVlIHdpemFyZHMgdXNlZnVsCit3aGlsZSB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcgQVNUIGNvbnN0cnVjdGluZyBwYXJzZXJzIGFuZCB0cmVlIHBhcnNlcnMuIFRoaXMKK2xpYnJhcnkgaGFzIGJlZW4gcG9ydGVkIHRvIFJ1YnkgZGlyZWN0bHkgZnJvbSB0aGUgQU5UTFIgUHl0aG9uIHJ1bnRpbWUgQVBJLgorCitTZWUKK2h0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9+YWRtaW4vMjAwNy8wNy8wMi9FeHBsb3JpbmcrQ29uY2VwdCtvZitUcmVlV2l6YXJkCitmb3IgbW9yZSBiYWNrZ3JvdW5kIG9uIHRoZSBjb25jZXB0IG9mIGEgdHJlZSB3aXphcmQuCisKKz09IFVzYWdlCisKKyAgIyBzZXR0aW5nIHVwIGFuZCBjcmVhdGluZyBhIHRyZWUgd2l6YXJkCisgIHRva2VuX25hbWVzID0gQXJyYXkubmV3KDQsICcnKSArICV3KFZBUiBOVU1CRVIgRVEgUExVUyBNSU5VUyBNVUxUIERJVikKKyAgYWRhcHRvciAgICAgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZUFkYXB0b3IubmV3CisgIHdpemFyZCAgICAgID0gQU5UTFIzOjpBU1Q6OldpemFyZC5uZXcoYWRhcHRvciwgdG9rZW5fbmFtZXMpCisgIAorICAjIGJ1aWxkaW5nIHRyZWVzCisgIGxvbmVfbm9kZSA9IHdpemFyZC5jcmVhdGUgIlZBUlt4XSIgICAjID0+IHgKKyAgbG9uZV9ub2RlLnR5cGUgICAgICAgICAgICAgICAgICAgICAgICMgPT4gNCAgIyA9IFZBUgorICBsb25lX25vZGUudGV4dCAgICAgICAgICAgICAgICAgICAgICAgIyA9PiAieCIKKyAgCisgIGV4cHJlc3Npb25fbm9kZSA9IHdpemFyZC5jcmVhdGUgIihNSU5VUyBWQVIgTlVNQkVSKSIKKyAgICAjID0+IChNSU5VUyBWQVIgTlVNQkVSKQorICBzdGF0ZW1lbnRfbm9kZSA9IHdpemFyZC5jcmVhdGUgIihFUVs9XSBWQVJbeF0gKFBMVVNbK10gTlVNQkVSWzFdIE5VTUJFUlsyXSkpIiAKKyAgICAjID0+ICg9IHggKCsgMSAyKSkKKyAgZGVlcF9ub2RlID0gd2l6YXJkLmNyZWF0ZSg8PC1UUkVFKQorICAgIChNVUxUWypdIE5VTUJFUlsxXSAKKyAgICAgIChNSU5VU1stXSAKKyAgICAgICAgKE1VTFRbKl0gTlVNQkVSWzNdICAgIFZBUlt4XSkKKyAgICAgICAgKERJVlsvXSAgVkFSW3ldIE5VTUJFUlszLjE0XSkKKyAgICAgICAgKE1VTFRbKl0gTlVNQkVSWzRdICAgIFZBUlt6XSkKKyAgICAgICkKKyAgICApCisgIFRSRUUKKyAgICAjID0+ICgqIDEgKC0gKCogMyB4KSAoLyB5IDMuMTQpICgqIDQgeikpCisgIAorICBiYWRfdHJlZV9zeW50YXggPSB3aXphcmQuY3JlYXRlICIoKyAxIDIpIgorICAgICMgPT4gbmlsIC0gaW52YWxpZCBub2RlIG5hbWVzCisgIAorICAjIHRlc3Qgd2hldGhlciBhIHRyZWUgbWF0Y2hlcyBhIHBhdHRlcm4KKyAgd2l6YXJkLm1hdGNoKGV4cHJlc3Npb25fbm9kZSwgJyhNSU5VUyBWQVIgLiknKSAjID0+IHRydWUKKyAgd2l6YXJkLm1hdGNoKGxvbmVfbm9kZSwgJ05VTUJFUiBOVU1CRVInKSAgICAgICAjID0+IGZhbHNlCisgIAorICAjIGV4dHJhY3Qgbm9kZXMgbWF0Y2hpbmcgYSBwYXR0ZXJuCisgIHdpemFyZC5maW5kKHN0YXRlbWVudF9ub2RlLCAnKFBMVVMgLiAuKScpCisgICMgPT4gWygrIDEgMildCisgIHdpemFyZC5maW5kKGRlZXBfbm9kZSwgNCkgICMgd2hlcmUgNCBpcyB0aGUgdmFsdWUgb2YgdHlwZSBWQVIKKyAgIyA9PiBbeCwgeSwgel0KKyAgCisgICMgaXRlcmF0ZSB0aHJvdWdoIHRoZSB0cmVlIGFuZCBleHRyYWN0IG5vZGVzIHdpdGggcGF0dGVybiBsYWJlbHMKKyAgd2l6YXJkLnZpc2l0KGRlZXBfbm9kZSwgJyhNVUxUICVuOk5VTUJFUiAldjouKScpIGRvIHxub2RlLCBwYXJlbnQsIGxvY2FsX2luZGV4LCBsYWJlbHN8CisgICAgcHJpbnRmICJuID0gJXBcbiwgdiA9ICVwXG4iLCBsYWJlbHNbJ24nXSwgbGFiZWxzWyd2J10KKyAgZW5kCisgICAgIyA9PiBwcmludHMgb3V0OgorICAgICMgbiA9IDMsIHYgPSB4CisgICAgIyBuID0gNCwgdiA9IHoKKyAgCis9PSBUcmVlIENvbnN0cnVjdGlvbiBTeW50YXgKKyAgCisgIFNpbXBsZSBUb2tlbiBOb2RlOiAgICAgVEsKKyAgVG9rZW4gTm9kZSBXaXRoIFRleHQ6ICBUS1t0ZXh0XQorICBGbGF0IE5vZGUgTGlzdDogICAgICAgIChuaWwgVEsxIFRLMikKKyAgR2VuZXJhbCBOb2RlOiAgICAgICAgICAoUlQgVEsxIFRLMikKKyAgQ29tcGxleCBOZXN0ZWQgTm9kZTogICAoUlQgKFNVQjFbc29tZXRleHRdIFRLMSkgVEsyIChTVUIyIFRLMyBUSzRbbW9yZXRleHRdKSkKKworPT09IEFkZGl0aW9uYWwgU3ludGF4IGZvciBUcmVlIE1hdGNoaW5nIFBhdHRlcm5zCisKKyAgTWF0Y2ggQW55IFRva2VuIE5vZGU6ICAuCisgIExhYmVsIGEgTm9kZTogICAgICAgICAgJW5hbWU6VEsKKworPWVuZAorCitjbGFzcyBXaXphcmQKKyAgCisgIGluY2x1ZGUgQ29uc3RhbnRzCisgIGluY2x1ZGUgVXRpbAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6V2l6YXJkOjpQYXR0ZXJuTGV4ZXIKKworQSBjbGFzcyB0aGF0IGlzIHVzZWQgaW50ZXJuYWxseSBieSBBU1Q6OldpemFyZCB0byB0b2tlbml6ZSB0cmVlIHBhdHRlcm5zCisKKz1lbmQKKworICBjbGFzcyBQYXR0ZXJuTGV4ZXIKKyAgICBpbmNsdWRlIEFOVExSMzo6Q29uc3RhbnRzCisgICAgCisgICAgYXV0b2xvYWQgOlN0cmluZ1NjYW5uZXIsICdzdHJzY2FuJworICAgIAorICAgIFBBVFRFUk5TID0gWyAKKyAgICAgIFsgOnNwYWNlLCAvXHMrLyBdLAorICAgICAgWyA6aWRlbnRpZmllciwgL1thLXpfXVx3Ki9pIF0sCisgICAgICBbIDpvcGVuLCAvXCgvIF0sCisgICAgICBbIDpjbG9zZSwgL1wpLyBdLAorICAgICAgWyA6cGVyY2VudCwgLyUvIF0sCisgICAgICBbIDpjb2xvbiwgLzovIF0sCisgICAgICBbIDpkb3QsIC9cLi8gXSwKKyAgICAgIFsgOmFyZ3VtZW50LCAvXFsoKD86W15cW1xdXFxdfFxcXFt8XFxcXXxcXC4pKj8pXF0vIF0KKyAgICBdCisgICAgCisgICAgYXR0cl9yZWFkZXIgOnRleHQsIDplcnJvciwgOnBhdHRlcm4KKyAgICBkZWYgaW5pdGlhbGl6ZSggcGF0dGVybiApCisgICAgICBAcGF0dGVybiA9IHBhdHRlcm4udG9fcworICAgICAgQHNjYW5uZXIgPSBTdHJpbmdTY2FubmVyLm5ldyggcGF0dGVybiApCisgICAgICBAdGV4dCA9ICcnCisgICAgICBAZXJyb3IgPSBmYWxzZQorICAgIGVuZAorICAgIAorICAgIGRlZiBuZXh0X3Rva2VuCisgICAgICBiZWdpbgorICAgICAgICBAc2Nhbm5lci5lb3M/IGFuZCByZXR1cm4gRU9GCisgICAgICAgIAorICAgICAgICB0eXBlLCA9IFBBVFRFUk5TLmZpbmQgZG8gfHR5cGUsIHBhdHRlcm58CisgICAgICAgICAgQHNjYW5uZXIuc2NhbiggcGF0dGVybiApCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgY2FzZSB0eXBlCisgICAgICAgIHdoZW4gbmlsCisgICAgICAgICAgdHlwZSwgQHRleHQsIEBlcnJvciA9IEVPRiwgJycsIHRydWUKKyAgICAgICAgICBicmVhaworICAgICAgICB3aGVuIDppZGVudGlmaWVyIHRoZW4gQHRleHQgPSBAc2Nhbm5lci5tYXRjaGVkCisgICAgICAgIHdoZW4gOmFyZ3VtZW50CisgICAgICAgICAgIyByZW1vdmUgZXNjYXBlcyBmcm9tIFxdIHNlcXVlbmNlcyBpbiB0aGUgdGV4dCBhcmd1bWVudAorICAgICAgICAgICggQHRleHQgPSBAc2Nhbm5lclsgMSBdICkuZ3N1YiEoIC9cXCg/PVtcW1xdXSkvLCAnJyApCisgICAgICAgIGVuZAorICAgICAgZW5kIHdoaWxlIHR5cGUgPT0gOnNwYWNlCisgICAgICAKKyAgICAgIHJldHVybiB0eXBlCisgICAgZW5kCisgICAgCisgICAgYWxpYXMgZXJyb3I/IGVycm9yCisgIGVuZAorICAKKworPWJlZ2luIHJkb2MgQU5UTFIzOjpBU1Q6OldpemFyZDo6UGF0dGVybgorCitBIGNsYXNzIHRoYXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEFTVDo6V2l6YXJkIHRvIGNvbnN0cnVjdCBBU1QgdHJlZSBvYmplY3RzCitmcm9tIGEgdG9rZW5pemVkIHRyZWUgcGF0dGVybgorCis9ZW5kCisKKyAgY2xhc3MgUGF0dGVyblBhcnNlcgorICAgIGRlZiBzZWxmLnBhcnNlKCBwYXR0ZXJuLCB0b2tlbl9zY2hlbWUsIGFkYXB0b3IgKQorICAgICAgbGV4ZXIgPSBQYXR0ZXJuTGV4ZXIubmV3KCBwYXR0ZXJuICkKKyAgICAgIG5ldyggbGV4ZXIsIHRva2VuX3NjaGVtZSwgYWRhcHRvciApLnBhdHRlcm4KKyAgICBlbmQKKyAgICAKKyAgICBpbmNsdWRlIEFOVExSMzo6Q29uc3RhbnRzCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoIHRva2VuaXplciwgdG9rZW5fc2NoZW1lLCBhZGFwdG9yICkKKyAgICAgIEB0b2tlbml6ZXIgPSB0b2tlbml6ZXIKKyAgICAgIEB0b2tlbl9zY2hlbWUgPSB0b2tlbl9zY2hlbWUKKyAgICAgIEBhZGFwdG9yICAgPSBhZGFwdG9yCisgICAgICBAdG9rZW5fdHlwZSA9IHRva2VuaXplci5uZXh0X3Rva2VuCisgICAgZW5kCisgICAgCisgICAgZGVmIHBhdHRlcm4KKyAgICAgIGNhc2UgQHRva2VuX3R5cGUKKyAgICAgIHdoZW4gOm9wZW4gdGhlbiByZXR1cm4gcGFyc2VfdHJlZQorICAgICAgd2hlbiA6aWRlbnRpZmllcgorICAgICAgICBub2RlID0gcGFyc2Vfbm9kZQorICAgICAgICBAdG9rZW5fdHlwZSA9PSBFT0YgYW5kIHJldHVybiBub2RlCisgICAgICAgIHJldHVybiBuaWwKKyAgICAgIGVuZAorICAgICAgcmV0dXJuIG5pbAorICAgIGVuZAorICAgIAorICAgIENPTlRJTlVFX1RZUEVTID0gWyA6b3BlbiwgOmlkZW50aWZpZXIsIDpwZXJjZW50LCA6ZG90IF0KKyAgICAKKyAgICBkZWYgcGFyc2VfdHJlZQorICAgICAgQHRva2VuX3R5cGUgIT0gOm9wZW4gYW5kIHJldHVybiBuaWwKKyAgICAgIEB0b2tlbl90eXBlID0gQHRva2VuaXplci5uZXh0X3Rva2VuCisgICAgICByb290ID0gcGFyc2Vfbm9kZSBvciByZXR1cm4gbmlsCisgICAgICAKKyAgICAgIGxvb3AgZG8KKyAgICAgICAgY2FzZSBAdG9rZW5fdHlwZQorICAgICAgICB3aGVuIDpvcGVuCisgICAgICAgICAgc3VidHJlZSA9IHBhcnNlX3RyZWUKKyAgICAgICAgICBAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3QsIHN1YnRyZWUgKQorICAgICAgICB3aGVuIDppZGVudGlmaWVyLCA6cGVyY2VudCwgOmRvdAorICAgICAgICAgIGNoaWxkID0gcGFyc2Vfbm9kZSBvciByZXR1cm4gbmlsCisgICAgICAgICAgQGFkYXB0b3IuYWRkX2NoaWxkKCByb290LCBjaGlsZCApCisgICAgICAgIGVsc2UgYnJlYWsKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAgIEB0b2tlbl90eXBlID09IDpjbG9zZSBvciByZXR1cm4gbmlsCisgICAgICBAdG9rZW5fdHlwZSA9IEB0b2tlbml6ZXIubmV4dF90b2tlbgorICAgICAgcmV0dXJuIHJvb3QKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgcGFyc2Vfbm9kZQorICAgICAgbGFiZWwgPSBuaWwKKyAgICAgIGlmIEB0b2tlbl90eXBlID09IDpwZXJjZW50CisgICAgICAgICggQHRva2VuX3R5cGUgPSBAdG9rZW5pemVyLm5leHRfdG9rZW4gKSA9PSA6aWRlbnRpZmllciBvciByZXR1cm4gbmlsCisgICAgICAgIGxhYmVsID0gQHRva2VuaXplci50ZXh0CisgICAgICAgICggQHRva2VuX3R5cGUgPSBAdG9rZW5pemVyLm5leHRfdG9rZW4gKSA9PSA6Y29sb24gb3IgcmV0dXJuIG5pbAorICAgICAgICBAdG9rZW5fdHlwZSA9IEB0b2tlbml6ZXIubmV4dF90b2tlbgorICAgICAgZW5kCisgICAgICAKKyAgICAgIGlmIEB0b2tlbl90eXBlID09IDpkb3QKKyAgICAgICAgQHRva2VuX3R5cGUgPSBAdG9rZW5pemVyLm5leHRfdG9rZW4KKyAgICAgICAgd2lsZGNhcmRfcGF5bG9hZCA9IENvbW1vblRva2VuLmNyZWF0ZSggOnR5cGUgPT4gMCwgOnRleHQgPT4gJy4nICkKKyAgICAgICAgbm9kZSA9IFdpbGRjYXJkUGF0dGVybi5uZXcoIHdpbGRjYXJkX3BheWxvYWQgKQorICAgICAgICBsYWJlbCBhbmQgbm9kZS5sYWJlbCA9IGxhYmVsCisgICAgICAgIHJldHVybiBub2RlCisgICAgICBlbmQKKyAgICAgIAorICAgICAgQHRva2VuX3R5cGUgPT0gOmlkZW50aWZpZXIgb3IgcmV0dXJuIG5pbAorICAgICAgdG9rZW5fbmFtZSA9IEB0b2tlbml6ZXIudGV4dAorICAgICAgQHRva2VuX3R5cGUgPSBAdG9rZW5pemVyLm5leHRfdG9rZW4KKyAgICAgIHRva2VuX25hbWUgPT0gJ25pbCcgYW5kIHJldHVybiBAYWRhcHRvci5jcmVhdGVfZmxhdF9saXN0CisgICAgICAKKyAgICAgIHRleHQgPSB0b2tlbl9uYW1lCisgICAgICBhcmcgPSBuaWwKKyAgICAgIGlmIEB0b2tlbl90eXBlID09IDphcmd1bWVudAorICAgICAgICBhcmcgPSBAdG9rZW5pemVyLnRleHQKKyAgICAgICAgdGV4dCA9IGFyZworICAgICAgICBAdG9rZW5fdHlwZSA9IEB0b2tlbml6ZXIubmV4dF90b2tlbgorICAgICAgZW5kCisgICAgICAKKyAgICAgIG5vZGVfdHlwZSA9IEB0b2tlbl9zY2hlbWVbIHRva2VuX25hbWUgXSB8fCBJTlZBTElEX1RPS0VOX1RZUEUKKyAgICAgIG5vZGUgPSBAYWRhcHRvci5jcmVhdGVfZnJvbV90eXBlKCBub2RlX3R5cGUsIHRleHQgKQorICAgICAgCisgICAgICBpZiBQYXR0ZXJuID09PSBub2RlCisgICAgICAgIG5vZGUubGFiZWwsIG5vZGUuaGFzX3RleHRfYXJnID0gbGFiZWwsIGFyZworICAgICAgZW5kCisgICAgICByZXR1cm4gbm9kZQorICAgIGVuZAorICBlbmQKKyAgCisKKz1iZWdpbiByZG9jIEFOVExSMzo6QVNUOjpXaXphcmQ6OlBhdHRlcm4KKworQSBzaW1wbGUgdHJlZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIHNrZWxldGFsIHN0cnVjdHVyZSBvZiB0cmVlLiBJdCBpcyB1c2VkCit0byB2YWxpZGF0ZSB0cmVlIHN0cnVjdHVyZXMgYXMgd2VsbCBhcyB0byBleHRyYWN0IG5vZGVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCisKKz1lbmQKKworICBjbGFzcyBQYXR0ZXJuIDwgQ29tbW9uVHJlZQorICAgIGRlZiBzZWxmLnBhcnNlKCBwYXR0ZXJuX3N0ciwgc2NoZW1lICkKKyAgICAgIFBhdHRlcm5QYXJzZXIucGFyc2UoIAorICAgICAgICBwYXR0ZXJuX3N0ciwgc2NoZW1lLCBQYXR0ZXJuQWRhcHRvci5uZXcoIHNjaGVtZS50b2tlbl9jbGFzcyApCisgICAgICApCisgICAgZW5kCisgICAgCisgICAgYXR0cl9hY2Nlc3NvciA6bGFiZWwsIDpoYXNfdGV4dF9hcmcKKyAgICBhbGlhcyA6aGFzX3RleHRfYXJnPyA6aGFzX3RleHRfYXJnCisgICAgCisgICAgZGVmIGluaXRpYWxpemUoIHBheWxvYWQgKQorICAgICAgc3VwZXIoIHBheWxvYWQgKQorICAgICAgQGxhYmVsID0gbmlsCisgICAgICBAaGFzX3RleHRfYXJnID0gbmlsCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgIHByZWZpeCA9IEBsYWJlbCA/ICclJyA8PCBAbGFiZWwgPDwgJzonIDogJycKKyAgICAgIHJldHVybiggcHJlZml4IDw8IHN1cGVyICkKKyAgICBlbmQKKyAgZW5kCisgIAorPWJlZ2luIHJkb2MgQU5UTFIzOjpBU1Q6OldpemFyZDo6V2lsZGNhcmRQYXR0ZXJuCisKK0Egc2ltcGxlIHRyZWUgbm9kZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgb3BlcmF0aW9uICJtYXRjaCBhbnkgdHJlZSBub2RlIHR5cGUiIGluCithIHRyZWUgcGF0dGVybi4gVGhleSBhcmUgcmVwcmVzZW50ZWQgYnkgJy4nIGluIHRyZWUgcGF0dGVybiBzcGVjaWZpY2F0aW9ucy4KKworPWVuZAorICAKKyAgY2xhc3MgV2lsZGNhcmRQYXR0ZXJuIDwgUGF0dGVybjsgZW5kCisgIAorCis9YmVnaW4gcmRvYyBBTlRMUjM6OkFTVDo6V2l6YXJkOjpQYXR0ZXJuQWRhcHRvcgorCitBIGN1c3RvbWl6ZWQgVHJlZUFkYXB0b3IgdXNlZCBieSBBU1Q6OldpemFyZHMgdG8gYnVpbGQgdHJlZSBwYXR0ZXJucy4KKworPWVuZAorCisgIGNsYXNzIFBhdHRlcm5BZGFwdG9yIDwgQ29tbW9uVHJlZUFkYXB0b3IKKyAgICBkZWYgY3JlYXRlX3dpdGhfcGF5bG9hZCggcGF5bG9hZCApCisgICAgICByZXR1cm4gUGF0dGVybi5uZXcoIHBheWxvYWQgKQorICAgIGVuZAorICBlbmQKKworICBhdHRyX2FjY2Vzc29yIDp0b2tlbl9zY2hlbWUsIDphZGFwdG9yCisKKyAgZGVmIGluaXRpYWxpemUoIG9wdGlvbnMgPSB7fSApCisgICAgQHRva2VuX3NjaGVtZSA9IG9wdGlvbnMuZmV0Y2goIDp0b2tlbl9zY2hlbWUgKSBkbworICAgICAgVG9rZW5TY2hlbWUuYnVpbGQoIG9wdGlvbnNbIDp0b2tlbl9jbGFzcyBdLCBvcHRpb25zWyA6dG9rZW5zIF0gKQorICAgIGVuZAorICAgIEBhZGFwdG9yID0gb3B0aW9ucy5mZXRjaCggOmFkYXB0b3IgKSBkbworICAgICAgQ29tbW9uVHJlZUFkYXB0b3IubmV3KCBAdG9rZW5fc2NoZW1lLnRva2VuX2NsYXNzICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgY3JlYXRlKCBwYXR0ZXJuICkKKyAgICBQYXR0ZXJuUGFyc2VyLnBhcnNlKCBwYXR0ZXJuLCBAdG9rZW5fc2NoZW1lLCBAYWRhcHRvciApCisgIGVuZAorICAKKyAgZGVmIGluZGV4KCB0cmVlLCBtYXAgPSB7fSApCisgICAgdHJlZSBvciByZXR1cm4oIG1hcCApCisgICAgdHlwZSA9IEBhZGFwdG9yLnR5cGVfb2YoIHRyZWUgKQorICAgIGVsZW1lbnRzID0gbWFwWyB0eXBlIF0gfHw9IFtdCisgICAgZWxlbWVudHMgPDwgdHJlZQorICAgIEBhZGFwdG9yLmVhY2hfY2hpbGQoIHRyZWUgKSB7IHwgY2hpbGQgfCBpbmRleCggY2hpbGQsIG1hcCApIH0KKyAgICByZXR1cm4oIG1hcCApCisgIGVuZAorICAKKyAgZGVmIGZpbmQoIHRyZWUsIHdoYXQgKQorICAgIGNhc2Ugd2hhdAorICAgIHdoZW4gSW50ZWdlciB0aGVuIGZpbmRfdG9rZW5fdHlwZSggdHJlZSwgd2hhdCApCisgICAgd2hlbiBTdHJpbmcgIHRoZW4gZmluZF9wYXR0ZXJuKCB0cmVlLCB3aGF0ICkKKyAgICB3aGVuIFN5bWJvbCAgdGhlbiBmaW5kX3Rva2VuX3R5cGUoIHRyZWUsIEB0b2tlbl9zY2hlbWVbIHdoYXQgXSApCisgICAgZWxzZSByYWlzZSBBcmd1bWVudEVycm9yLCAic2VhcmNoIHN1YmplY3QgbXVzdCBiZSBhIHRva2VuIHR5cGUgKGludGVnZXIpIG9yIGEgc3RyaW5nIgorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiBmaW5kX3Rva2VuX3R5cGUoIHRyZWUsIHR5cGUgKQorICAgIG5vZGVzID0gW10KKyAgICB2aXNpdCggdHJlZSwgdHlwZSApIHsgfCB0LCB8IG5vZGVzIDw8IHQgfQorICAgIHJldHVybiBub2RlcworICBlbmQKKyAgCisgIGRlZiBmaW5kX3BhdHRlcm4oIHRyZWUsIHBhdHRlcm4gKQorICAgIHN1YnRyZWVzID0gW10KKyAgICB2aXNpdF9wYXR0ZXJuKCB0cmVlLCBwYXR0ZXJuICkgeyB8IHQsIHwgc3VidHJlZXMgPDwgdCB9CisgICAgcmV0dXJuKCBzdWJ0cmVlcyApCisgIGVuZAorICAKKyAgZGVmIHZpc2l0KCB0cmVlLCB3aGF0ID0gbmlsLCAmYmxvY2sgKQorICAgIGJsb2NrX2dpdmVuPyBvciByZXR1cm4gZW51bV9mb3IoIDp2aXNpdCwgdHJlZSwgd2hhdCApCisgICAgU3ltYm9sID09PSB3aGF0IGFuZCB3aGF0ID0gQHRva2VuX3NjaGVtZVsgd2hhdCBdCisgICAgY2FzZSB3aGF0CisgICAgd2hlbiBuaWwgdGhlbiB2aXNpdF9hbGwoIHRyZWUsICZibG9jayApCisgICAgd2hlbiBJbnRlZ2VyIHRoZW4gdmlzaXRfdHlwZSggdHJlZSwgbmlsLCB3aGF0LCAmYmxvY2sgKQorICAgIHdoZW4gU3RyaW5nICB0aGVuIHZpc2l0X3BhdHRlcm4oIHRyZWUsIHdoYXQsICZibG9jayApCisgICAgZWxzZSByYWlzZSggQXJndW1lbnRFcnJvciwgdGlkeSggPDwtJ0VORCcsIHRydWUgKSApCisgICAgICB8IFRoZSAnd2hhdCcgZmlsdGVyIGFyZ3VtZW50IG11c3QgYmUgYSB0cmVlCisgICAgICB8IHBhdHRlcm4gKFN0cmluZykgb3IgYSB0b2tlbiB0eXBlIChJbnRlZ2VyKQorICAgICAgfCAtLSBnb3QgI3sgd2hhdC5pbnNwZWN0IH0KKyAgICAgIEVORAorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB2aXNpdF9hbGwoIHRyZWUsIHBhcmVudCA9IG5pbCwgJmJsb2NrICkKKyAgICBpbmRleCA9IEBhZGFwdG9yLmNoaWxkX2luZGV4KCB0cmVlICkKKyAgICB5aWVsZCggdHJlZSwgcGFyZW50LCBpbmRleCwgbmlsICkKKyAgICBAYWRhcHRvci5lYWNoX2NoaWxkKCB0cmVlICkgZG8gfCBjaGlsZCB8CisgICAgICB2aXNpdF9hbGwoIGNoaWxkLCB0cmVlLCAmYmxvY2sgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB2aXNpdF90eXBlKCB0cmVlLCBwYXJlbnQsIHR5cGUsICZibG9jayApCisgICAgdHJlZS5uaWw/IGFuZCByZXR1cm4oIG5pbCApCisgICAgaW5kZXggPSBAYWRhcHRvci5jaGlsZF9pbmRleCggdHJlZSApCisgICAgQGFkYXB0b3IudHlwZV9vZiggdHJlZSApID09IHR5cGUgYW5kIHlpZWxkKCB0cmVlLCBwYXJlbnQsIGluZGV4LCBuaWwgKQorICAgIEBhZGFwdG9yLmVhY2hfY2hpbGQoIHRyZWUgKSBkbyB8IGNoaWxkIHwKKyAgICAgIHZpc2l0X3R5cGUoIGNoaWxkLCB0cmVlLCB0eXBlLCAmYmxvY2sgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGRlZiB2aXNpdF9wYXR0ZXJuKCB0cmVlLCBwYXR0ZXJuLCAmYmxvY2sgKQorICAgIHBhdHRlcm4gPSBQYXR0ZXJuLnBhcnNlKCBwYXR0ZXJuLCBAdG9rZW5fc2NoZW1lICkKKyAgICAKKyAgICBpZiBwYXR0ZXJuLm5pbD8gb3IgcGF0dGVybi5mbGF0X2xpc3Q/IG9yIHBhdHRlcm4uaXNfYT8oIFdpbGRjYXJkUGF0dGVybiApCisgICAgICByZXR1cm4oIG5pbCApCisgICAgZW5kCisgICAgCisgICAgdmlzaXQoIHRyZWUsIHBhdHRlcm4udHlwZSApIGRvIHwgdHJlZSwgcGFyZW50LCBjaGlsZF9pbmRleCwgbGFiZWxzIHwKKyAgICAgIGxhYmVscyA9IG1hdGNoISggdHJlZSwgcGF0dGVybiApIGFuZAorICAgICAgICB5aWVsZCggdHJlZSwgcGFyZW50LCBjaGlsZF9pbmRleCwgbGFiZWxzICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgbWF0Y2goIHRyZWUsIHBhdHRlcm4gKQorICAgIHBhdHRlcm4gPSBQYXR0ZXJuLnBhcnNlKCBwYXR0ZXJuLCBAdG9rZW5fc2NoZW1lICkKKyAgICAKKyAgICByZXR1cm4oIG1hdGNoISggdHJlZSwgcGF0dGVybiApICkKKyAgZW5kCisgIAorICBkZWYgbWF0Y2ghKCB0cmVlLCBwYXR0ZXJuLCBsYWJlbHMgPSB7fSApCisgICAgdHJlZS5uaWw/IHx8IHBhdHRlcm4ubmlsPyBhbmQgcmV0dXJuIGZhbHNlCisgICAgdW5sZXNzIHBhdHRlcm4uaXNfYT8gV2lsZGNhcmRQYXR0ZXJuCisgICAgICBAYWRhcHRvci50eXBlX29mKCB0cmVlICkgPT0gcGF0dGVybi50eXBlIG9yIHJldHVybiBmYWxzZQorICAgICAgcGF0dGVybi5oYXNfdGV4dF9hcmcgJiYgKCBAYWRhcHRvci50ZXh0X29mKCB0cmVlICkgIT0gcGF0dGVybi50ZXh0ICkgYW5kCisgICAgICAgIHJldHVybiBmYWxzZQorICAgIGVuZAorICAgIGxhYmVsc1sgcGF0dGVybi5sYWJlbCBdID0gdHJlZSBpZiBsYWJlbHMgJiYgcGF0dGVybi5sYWJlbAorICAgIAorICAgIG51bWJlcl9vZl9jaGlsZHJlbiA9IEBhZGFwdG9yLmNoaWxkX2NvdW50KCB0cmVlICkKKyAgICByZXR1cm4gZmFsc2UgdW5sZXNzIG51bWJlcl9vZl9jaGlsZHJlbiA9PSBwYXR0ZXJuLmNoaWxkX2NvdW50CisgICAgCisgICAgbnVtYmVyX29mX2NoaWxkcmVuLnRpbWVzIGRvIHxpbmRleHwKKyAgICAgIGFjdHVhbF9jaGlsZCA9IEBhZGFwdG9yLmNoaWxkX29mKCB0cmVlLCBpbmRleCApCisgICAgICBwYXR0ZXJuX2NoaWxkID0gcGF0dGVybi5jaGlsZCggaW5kZXggKQorICAgICAgCisgICAgICByZXR1cm4oIGZhbHNlICkgdW5sZXNzIG1hdGNoISggYWN0dWFsX2NoaWxkLCBwYXR0ZXJuX2NoaWxkLCBsYWJlbHMgKQorICAgIGVuZAorICAgIAorICAgIHJldHVybiBsYWJlbHMKKyAgZW5kCisgIAorICBkZWYgZXF1YWxzKCB0cmVlX2EsIHRyZWVfYiwgYWRhcHRvciA9IEBhZGFwdG9yICkKKyAgICB0cmVlX2EgJiYgdHJlZV9iIG9yIHJldHVybiggZmFsc2UgKQorICAgIAorICAgIGFkYXB0b3IudHlwZV9vZiggdHJlZV9hICkgPT0gYWRhcHRvci50eXBlX29mKCB0cmVlX2IgKSBvciByZXR1cm4gZmFsc2UKKyAgICBhZGFwdG9yLnRleHRfb2YoIHRyZWVfYSApID09IGFkYXB0b3IudGV4dF9vZiggdHJlZV9iICkgb3IgcmV0dXJuIGZhbHNlCisgICAgCisgICAgY2hpbGRfY291bnRfYSA9IGFkYXB0b3IuY2hpbGRfY291bnQoIHRyZWVfYSApCisgICAgY2hpbGRfY291bnRfYiA9IGFkYXB0b3IuY2hpbGRfY291bnQoIHRyZWVfYiApCisgICAgY2hpbGRfY291bnRfYSA9PSBjaGlsZF9jb3VudF9iIG9yIHJldHVybiBmYWxzZQorICAgIAorICAgIGNoaWxkX2NvdW50X2EudGltZXMgZG8gfCBpIHwKKyAgICAgIGNoaWxkX2EgPSBhZGFwdG9yLmNoaWxkX29mKCB0cmVlX2EsIGkgKQorICAgICAgY2hpbGRfYiA9IGFkYXB0b3IuY2hpbGRfb2YoIHRyZWVfYiwgaSApCisgICAgICBlcXVhbHMoIGNoaWxkX2EsIGNoaWxkX2IsIGFkYXB0b3IgKSBvciByZXR1cm4gZmFsc2UKKyAgICBlbmQKKyAgICByZXR1cm4gdHJ1ZQorICBlbmQKKyAgCisgIAorICBET1RfRE9UX1BBVFRFUk4gPSAvLipbXlwuXVxcLnsyfVteXC5dLiovCisgIERPVUJMRV9FVENfUEFUVEVSTiA9IC8uKlwuezN9XHMrXC57M30uKi8KKyAgCisgIGRlZiBpbl9jb250ZXh0PyggdHJlZSwgY29udGV4dCApCisgICAgY2FzZSBjb250ZXh0CisgICAgd2hlbiBET1RfRE9UX1BBVFRFUk4gdGhlbiByYWlzZSBBcmd1bWVudEVycm9yLCAiaW52YWxpZCBzeW50YXg6IC4uIgorICAgIHdoZW4gRE9VQkxFX0VUQ19QQVRURVJOIHRoZW4gcmFpc2UgQXJndW1lbnRFcnJvciwgImludmFsaWQgc3ludGF4OiAuLi4gLi4uIgorICAgIGVuZAorICAgIAorICAgIGNvbnRleHQgPSBjb250ZXh0LmdzdWIoIC8oW15cLlxzXSlcLnszfShbXlwuXSkvLCAnXDEgLi4uIFwyJyApCisgICAgY29udGV4dC5zdHJpcCEKKyAgICBub2RlcyA9IGNvbnRleHQuc3BsaXQoIC9ccysvICkKKyAgICAKKyAgICB3aGlsZSB0cmVlID0gQGFkYXB0b3IucGFyZW50KCB0cmVlICkgYW5kIG5vZGUgPSBub2Rlcy5wb3AKKyAgICAgIGlmIG5vZGUgPT0gJy4uLicKKyAgICAgICAgbm9kZSA9IG5vZGVzLnBvcCBvciByZXR1cm4oIHRydWUgKQorICAgICAgICB0cmVlID0gQGFkYXB0b3IuZWFjaF9hbmNlc3RvciggdHJlZSApLmZpbmQgZG8gfCB0IHwKKyAgICAgICAgICBAYWRhcHRvci50eXBlX25hbWUoIHQgKSA9PSBub2RlCisgICAgICAgIGVuZCBvciByZXR1cm4oIGZhbHNlICkKKyAgICAgIGVuZAorICAgICAgQGFkYXB0b3IudHlwZV9uYW1lKCB0cmVlICkgPT0gbm9kZSBvciByZXR1cm4oIGZhbHNlICkKKyAgICBlbmQKKyAgICAKKyAgICByZXR1cm4oIGZhbHNlICkgaWYgdHJlZS5uaWw/IGFuZCBub3Qgbm9kZXMuZW1wdHk/CisgICAgcmV0dXJuIHRydWUKKyAgZW5kCisgIAorICBwcml2YXRlIDptYXRjaCEKK2VuZAorZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy91dGlsLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS9saWIvYW50bHIzL3V0aWwucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE3ZjRlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy91dGlsLnJiCkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK21vZHVsZSBBTlRMUjMKK21vZHVsZSBVdGlsCisKK21vZHVsZV9mdW5jdGlvbgorICAKKyAgZGVmIHNuYWtlX2Nhc2UoIHN0ciApCisgICAgc3RyID0gc3RyLnRvX3MuZ3N1YiggLyhbQS1aXSspKFtBLVpdW2Etel0pLywnXDFfXDInICkKKyAgICBzdHIuZ3N1YiEoIC8oW2EtelxkXSkoW0EtWl0pLywnXDFfXDInICkKKyAgICBzdHIudHIhKCAiLSIsICJfIiApCisgICAgc3RyLmRvd25jYXNlIQorICAgIHN0cgorICBlbmQKKyAgCisgIGRlZiBwYXJzZV92ZXJzaW9uKCB2ZXJzaW9uX3N0cmluZyApCisgICAgdmVyc2lvbl9zdHJpbmcuc3BsaXQoICcuJyApLm1hcCEgZG8gfCBzZWdtZW50IHwKKyAgICAgIHNlZ21lbnQudG9faQorICAgIGVuZC5mcmVlemUKKyAgZW5kCisgIAorICBkZWYgdGlkeSggaGVyZV9kb2MsIGZsb3cgPSBmYWxzZSApCisgICAgaGVyZV9kb2MuZ3N1YiEoIC9eICpcfCA/LywgJycgKQorICAgIGlmIGZsb3cKKyAgICAgIGhlcmVfZG9jLnN0cmlwIQorICAgICAgaGVyZV9kb2MuZ3N1YiEoIC9ccysvLCAnICcgKQorICAgIGVuZAorICAgIHJldHVybiBoZXJlX2RvYworICBlbmQKKyAgCisgIGRlZiBzaWxlbmNlX3dhcm5pbmdzCisgICAgdmVyYm9zaXR5LCAkVkVSQk9TRSA9ICRWRVJCT1NFLCBuaWwKKyAgICByZXR1cm4geWllbGQKKyAgZW5zdXJlCisgICAgJFZFUkJPU0UgPSB2ZXJib3NpdHkKKyAgZW5kCisgIAorZW5kCisKK21vZHVsZSBDbGFzc01hY3JvcworCitwcml2YXRlCisgIAorICBkZWYgc2hhcmVkX2F0dHJpYnV0ZSggbmFtZSwgKmFkZGl0aW9uYWxfbWVtYmVycyApCisgICAgYXR0cl9yZWFkZXIgbmFtZQorICAgIAorICAgIGFkZGl0aW9uYWxfd3JpdGVycyA9IGFkZGl0aW9uYWxfbWVtYmVycy5pbmplY3QoICcnICkgZG8gfHNyYywgYXR0cnwKKyAgICAgIHNyYyA8PCAiQCN7IGF0dHIgfSA9IHZhbHVlIGlmIEAjeyBhdHRyIH1cbiIKKyAgICBlbmQKKyAgICAKKyAgICBmaWxlLCBsaW5lLCA9IGNhbGxlclsgMSBdLnNwbGl0KCAnOicsIDMgKQorICAgIGNsYXNzX2V2YWwoIDw8LUVORCwgZmlsZSwgbGluZS50b19pICkKKyAgICAgIGRlZiAjeyBuYW1lIH09IHZhbHVlCisgICAgICAgIEAjeyBuYW1lIH0gPSB2YWx1ZQorICAgICAgICAKKyAgICAgICAgZWFjaF9kZWxlZ2F0ZSBkbyB8ZGVsfAorICAgICAgICAgIGRlbC4jeyBuYW1lIH0gPSB2YWx1ZQorICAgICAgICBlbmQKKyAgICAgICAgCisgICAgICAgICN7IGFkZGl0aW9uYWxfd3JpdGVycyB9CisgICAgICBlbmQKKyAgICBFTkQKKyAgZW5kCisgIAorICBkZWYgYWJzdHJhY3QoIG5hbWUsIG1lc3NhZ2UgPSBuaWwgKQorICAgIG1lc3NhZ2UgfHw9ICJhYnN0cmFjdCBtZXRob2QgLS0gI3sgc2VsZi5jbGFzcyB9OjojeyBuYW1lIH0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIgorICAgIGZpbGUsIGxpbmUsID0gY2FsbGVyWyAxIF0uc3BsaXQoICc6JywgMyApCisgICAgY2xhc3NfZXZhbCggPDwtRU5ELCBmaWxlLCBsaW5lLnRvX2kgKQorICAgICAgZGVmICN7IG5hbWUgfSggKiApCisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgI3sgbWVzc2FnZS50b19zLmluc3BlY3QgfQorICAgICAgZW5kCisgICAgRU5ECisgIGVuZAorICAKKyAgZGVmIGRlcHJlY2F0ZSggbmFtZSwgZXh0cmFfbWVzc2FnZSA9IG5pbCApCisgICAgaGlkZGVuX25hbWUgPSAiZGVwcmVjYXRlZF8jeyBuYW1lIH0iCisgICAgbWV0aG9kX2RlZmluZWQ/KCBoaWRkZW5fbmFtZSApIGFuZCByZXR1cm4KKyAgICAKKyAgICBhbGlhc19tZXRob2QoIGhpZGRlbl9uYW1lLCBuYW1lICkKKyAgICBwcml2YXRlKCBoaWRkZW5fbmFtZSApCisgICAgCisgICAgbWVzc2FnZSA9ICJ3YXJuaW5nOiBtZXRob2QgI3sgc2VsZiB9IyN7IG5hbWUgfSBpcyBkZXByZWNhdGVkIgorICAgIGV4dHJhX21lc3NhZ2UgYW5kIG1lc3NhZ2UgPDwgJzsgJyA8PCBleHRyYV9tZXNzYWdlLnRvX3MKKyAgICAKKyAgICBjbGFzc19ldmFsKCA8PC1FTkQgKQorICAgICAgZGVmICN7IG5hbWUgfSggKmFyZ3MsICZibG9jayApCisgICAgICAgIHdhcm4oICN7IG1lc3NhZ2UuaW5zcGVjdCB9ICkKKyAgICAgICAgI3sgaGlkZGVuX25hbWUgfSggKmFyZ3MsICZibG9jayApCisgICAgICBlbmQKKyAgICBFTkQKKyAgZW5kCisgIAorICBkZWYgYWxpYXNfYWNjZXNzb3IoIGFsaWFzX25hbWUsIGF0dHJfbmFtZSApCisgICAgYWxpYXNfbWV0aG9kKCBhbGlhc19uYW1lLCBhdHRyX25hbWUgKQorICAgIGFsaWFzX21ldGhvZCggOiIjeyBhbGlhc19uYW1lIH09IiwgOiIjeyBhdHRyX25hbWUgfT0iICkKKyAgZW5kCisKK2VuZAorCitlbmQKKworY2xhc3MgSW50ZWdlcgorCisgICMgUmV0dXJucyB0aGUgbG93ZXIgb2Ygc2VsZiBvciB4LgorICAjCisgICMgICA0LmF0X2xlYXN0KDUpICAjPT4gNQorICAjICAgNi5hdF9sZWFzdCg1KSAgIz0+IDYKKyAgIworICAjICAgQ1JFRElUIEZsb3JpYW4gR3Jvc3MKKworICBkZWYgYXRfbGVhc3QoIHggKQorICAgICggc2VsZiA+PSB4ICkgPyBzZWxmIDogeAorICBlbmQKKworICAjIFJldHVybnMgdGhlIGdyZWF0ZXIgb2Ygc2VsZiBvciB4LgorICAjCisgICMgICA0LmF0X21vc3QoNSkgICM9PiA0CisgICMgICA2LmF0X21vc3QoNSkgICM9PiA1CisgICMKKyAgIyAgIENSRURJVCBGbG9yaWFuIEdyb3NzCisKKyAgZGVmIGF0X21vc3QoIHggKQorICAgICggc2VsZiA8PSB4ICkgPyBzZWxmIDogeAorICBlbmQKKworICAjIFJldHVybnMgc2VsZiBpZiBhYm92ZSB0aGUgZ2l2ZW4gbG93ZXIgYm91bmQsIG9yCisgICMgd2l0aGluIHRoZSBnaXZlbiBsb3dlciBhbmQgdXBwZXIgYm91bmRzLAorICAjIG90aGVyd2lzZSByZXR1cm5zIHRoZSB0aGUgYm91bmQgb2Ygd2hpY2ggdGhlCisgICMgdmFsdWUgZmFsbHMgb3V0c2lkZS4KKyAgIworICAjICAgNC5ib3VuZCgzKSAgICAjPT4gNAorICAjICAgNC5ib3VuZCg1KSAgICAjPT4gNQorICAjICAgNC5ib3VuZCgyLDcpICAjPT4gNAorICAjICAgOS5ib3VuZCgyLDcpICAjPT4gNworICAjICAgMS5ib3VuZCgyLDcpICAjPT4gMgorICAjCisgICMgICBDUkVESVQgVHJhbnMKKworICBkZWYgYm91bmQoIGxvd2VyLCB1cHBlcj1uaWwgKQorICAgIHJldHVybiBsb3dlciBpZiBzZWxmIDwgbG93ZXIKKyAgICByZXR1cm4gc2VsZiB1bmxlc3MgdXBwZXIKKyAgICByZXR1cm4gdXBwZXIgaWYgc2VsZiA+IHVwcGVyCisgICAgcmV0dXJuIHNlbGYKKyAgZW5kCisKK2VuZAorCisKK2NsYXNzIFJhbmdlCisgIGRlZiBjb3ZlcnM/KCByYW5nZSApCisgICAgcmFuZ2UuZmlyc3QgPj0gZmlyc3Qgb3IgcmV0dXJuIGZhbHNlCisgICAgaWYgZXhjbHVkZV9lbmQ/CisgICAgICByYW5nZS5leGNsdWRlX2VuZD8gPyBsYXN0ID49IHJhbmdlLmxhc3QgOiBsYXN0ID4gcmFuZ2UubGFzdAorICAgIGVsc2UKKyAgICAgIHJhbmdlLmV4Y2x1ZGVfZW5kPyA/IGxhc3Quc3VjYyA+PSByYW5nZS5sYXN0IDogbGFzdCA+PSByYW5nZS5sYXN0CisgICAgZW5kCisgIGVuZAorICAKKyAgZGVmIGNvdmVyZWRfYnk/KCByYW5nZSApCisgICAgcmFuZ2UuY292ZXJzPyggc2VsZiApCisgIGVuZAorICAKKyAgZGVmIG92ZXJsYXBzPyggcmFuZ2UgKQorICAgIHJhbmdlLmluY2x1ZGU/KCBmaXJzdCApIG9yIGluY2x1ZGU/KCByYW5nZS5maXJzdCApCisgIGVuZAorICAKKyAgZGVmIGRpc2pvaW50PyggcmFuZ2UgKQorICAgIG5vdCBvdmVybGFwcz8oIHJhbmdlICkKKyAgZW5kCisgIAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdmVyc2lvbi5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvbGliL2FudGxyMy92ZXJzaW9uLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjVlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L2xpYi9hbnRscjMvdmVyc2lvbi5yYgpAQCAtMCwwICsxLDI3IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK21vZHVsZSBBTlRMUjMKKyAgCisgICMgCisgICMgVGhlIHZlcnNpb24gb2YgdGhlIEFOVExSIHRvb2wgdXNlZCB3aGlsZSBkZXNpZ25pbmcgYW5kCisgICMgdGVzdGluZyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeQorICAjIAorICBBTlRMUl9NQUpPUl9WRVJTSU9OID0gMworICBBTlRMUl9NSU5PUl9WRVJTSU9OID0gMgorICBBTlRMUl9QQVRDSF9WRVJTSU9OID0gMQorICBBTlRMUl9WRVJTSU9OID0gWyBBTlRMUl9NQUpPUl9WRVJTSU9OLCBBTlRMUl9NSU5PUl9WRVJTSU9OLCBBTlRMUl9QQVRDSF9WRVJTSU9OIF0uZnJlZXplCisgIEFOVExSX1ZFUlNJT05fU1RSSU5HID0gQU5UTFJfVkVSU0lPTi5qb2luKCAnLicgKQorICBBTlRMUl9WRVJTSU9OX1NUUklORy5jaG9tcCEoICcuMCcgKSAgICMgdmVyc2lvbmluZyBkcm9wcyBtaW5vciB2ZXJzaW9uIGF0IDAKKyAgQU5UTFJfVkVSU0lPTl9TVFJJTkcuZnJlZXplCisgIAorICAjIAorICAjIFRoZSB2ZXJzaW9uIGRhdGEgZm9yIHRoZSBjdXJyZW50IHN0YXRlIHRoZSBsaWJyYXJ5IGl0c2VsZgorICAjIAorICBNQUpPUl9WRVJTSU9OID0gMQorICBNSU5PUl9WRVJTSU9OID0gOAorICBQQVRDSF9WRVJTSU9OID0gNQorICBWRVJTSU9OID0gWyBNQUpPUl9WRVJTSU9OLCBNSU5PUl9WRVJTSU9OLCBQQVRDSF9WRVJTSU9OIF0KKyAgVkVSU0lPTl9TVFJJTkcgPSBWRVJTSU9OLmpvaW4oICcuJyApLmZyZWV6ZQorICAKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS9yYWtlZmlsZSBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvcmFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1NzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvcmFrZWZpbGUKQEAgLTAsMCArMSw1OSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMnCityZXF1aXJlICdob2UnCisKK0hvZS5zcGVjICJhbnRscjMiIGRvCisgIHNlbGYudmVyc2lvbiA9IEFOVExSMzo6VkVSU0lPTl9TVFJJTkcKKyAgc2VsZi5ydWJ5Zm9yZ2VfbmFtZSA9ICJhbnRscjMiCisgIAorICBkZXZlbG9wZXIgIkt5bGUgWWV0dGVyIiwgImtjeTViQHlhaG9vLmNvbSIKKyAgCisgIHNwZWNfZXh0cmFzLnVwZGF0ZSgKKyAgICA6cmVxdWlyZWRfcnVieV92ZXJzaW9uID0+ICI+PSAxLjguNyIKKyAgKQorICAKKyAgc2VsZi50ZXN0X2dsb2JzID0gWworICAgICJ0ZXN0L3VuaXQvdGVzdC1kZmEucmIiLAorICAgICJ0ZXN0L3VuaXQvdGVzdC10cmVlLXdpemFyZC5yYiIsCisgICAgInRlc3QvdW5pdC90ZXN0LXN0cmVhbXMucmIiLAorICAgICJ0ZXN0L3VuaXQvdGVzdC1yZWNvZ25pemVycy5yYiIsCisgICAgInRlc3QvdW5pdC90ZXN0LXRyZWVzLnJiIiwKKyAgICAidGVzdC91bml0L3Rlc3QtZXhjZXB0aW9ucy5yYiIsCisgICAgInRlc3QvdW5pdC90ZXN0LXNjb3BlLnJiIiwKKyAgICAidGVzdC91bml0L3Rlc3Qtc2NoZW1lLnJiIiwKKyAgICAidGVzdC91bml0L3Rlc3QtdGVtcGxhdGUucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvZGVsZWdhdGlvbi9pbXBvcnQucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIveG1sLnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL2xleGVyL3Byb3BlcnRpZXMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvbnVhbmNlcy5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9sZXhlci9iYXNpYy5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9sZXhlci9maWx0ZXItbW9kZS5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9sZXhlci9zeW4tcHJlZC5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9kZWJ1Z2dpbmcvcnVsZS10cmFjaW5nLnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL2RlYnVnZ2luZy9wcm9maWxlLW1vZGUucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvZGVidWdnaW5nL2RlYnVnLW1vZGUucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9oZXRlcm8tbm9kZXMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9jb25zdHJ1Y3Rpb24ucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9yZXdyaXRlcy5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9hc3Qtb3V0cHV0L3RyZWUtcmV3cml0ZS5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9hc3Qtb3V0cHV0L2F1dG8tYXN0LnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL21haW4vbWFpbi1zY3JpcHRzLnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL3RyZWUtcGFyc2VyL2Jhc2ljLnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL3BhcnNlci9wcmVkaWNhdGVzLnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL3BhcnNlci9iYWNrdHJhY2tpbmcucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3Byb3BlcnRpZXMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL251YW5jZXMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3J1bGUtbWV0aG9kcy5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC9wYXJzZXIvYmFzaWMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2FjdGlvbnMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2NhbGMucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2xsLXN0YXIucmIiLAorICAgICJ0ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3Njb3Blcy5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC90ZW1wbGF0ZS1vdXRwdXQvdGVtcGxhdGUtb3V0cHV0LnJiIiwKKyAgICAidGVzdC9mdW5jdGlvbmFsL3Rva2VuLXJld3JpdGUvdmlhLXBhcnNlci5yYiIsCisgICAgInRlc3QvZnVuY3Rpb25hbC90b2tlbi1yZXdyaXRlL2Jhc2ljLnJiIgorICBdCisgIAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9hc3Qtb3V0cHV0L2F1dG8tYXN0LnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9hdXRvLWFzdC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTMzMWRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9hdXRvLWFzdC5yYgpAQCAtMCwwICsxLDc5MiBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0QXV0b0FTVCA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICAKKyAgZGVmIHBhcnNlKCBncmFtbWFyLCBydWxlLCBpbnB1dCwgZXhwZWN0X2Vycm9ycyA9IGZhbHNlICkKKyAgICBAZ3JhbW1hciA9IGlubGluZV9ncmFtbWFyKCBncmFtbWFyICkKKyAgICBjb21waWxlX2FuZF9sb2FkIEBncmFtbWFyCisgICAgZ3JhbW1hcl9tb2R1bGUgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCggQGdyYW1tYXIubmFtZSApCisgICAgCisgICAgZ3JhbW1hcl9tb2R1bGU6OkxleGVyLnNlbmQoIDppbmNsdWRlLCBBTlRMUjM6OlRlc3Q6OkNvbGxlY3RFcnJvcnMgKQorICAgIGdyYW1tYXJfbW9kdWxlOjpMZXhlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0ICkKKyAgICBncmFtbWFyX21vZHVsZTo6UGFyc2VyLnNlbmQoIDppbmNsdWRlLCBBTlRMUjM6OlRlc3Q6OkNvbGxlY3RFcnJvcnMgKQorICAgIGdyYW1tYXJfbW9kdWxlOjpQYXJzZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCApCisgICAgCisgICAgbGV4ZXIgID0gZ3JhbW1hcl9tb2R1bGU6OkxleGVyLm5ldyggaW5wdXQgKQorICAgIHBhcnNlciA9IGdyYW1tYXJfbW9kdWxlOjpQYXJzZXIubmV3KCBsZXhlciApCisgICAgCisgICAgciA9IHBhcnNlci5zZW5kKCBydWxlICkKKyAgICBwYXJzZXIucmVwb3J0ZWRfZXJyb3JzLnNob3VsZCBiZV9lbXB0eSB1bmxlc3MgZXhwZWN0X2Vycm9ycworICAgIHJlc3VsdCA9ICcnCisgICAgCisgICAgdW5sZXNzIHIubmlsPworICAgICAgcmVzdWx0ICs9IHIucmVzdWx0IGlmIHIucmVzcG9uZF90bz8oIDpyZXN1bHQgKQorICAgICAgcmVzdWx0ICs9IHIudHJlZS5pbnNwZWN0IGlmIHIudHJlZQorICAgIGVuZAorICAgIHJldHVybiggZXhwZWN0X2Vycm9ycyA/IFsgcmVzdWx0LCBwYXJzZXIucmVwb3J0ZWRfZXJyb3JzIF0gOiByZXN1bHQgKQorICBlbmQKKyAgCisgIGRlZiB0cmVlX3BhcnNlKCBncmFtbWFyLCB0cmVlX2dyYW1tYXIsIHJ1bGUsIHRyZWVfcnVsZSwgaW5wdXQgKQorICAgIEBncmFtbWFyID0gaW5saW5lX2dyYW1tYXIoIGdyYW1tYXIgKQorICAgIEB0cmVlX2dyYW1tYXIgPSBpbmxpbmVfZ3JhbW1hciggdHJlZV9ncmFtbWFyICkKKyAgICBjb21waWxlX2FuZF9sb2FkIEBncmFtbWFyCisgICAgY29tcGlsZV9hbmRfbG9hZCBAdHJlZV9ncmFtbWFyCisgICAgCisgICAgZ3JhbW1hcl9tb2R1bGUgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCggQGdyYW1tYXIubmFtZSApCisgICAgdHJlZV9ncmFtbWFyX21vZHVsZSA9IHNlbGYuY2xhc3MuY29uc3RfZ2V0KCBAdHJlZV9ncmFtbWFyLm5hbWUgKQorICAgIAorICAgIGdyYW1tYXJfbW9kdWxlOjpMZXhlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDb2xsZWN0RXJyb3JzICkKKyAgICBncmFtbWFyX21vZHVsZTo6TGV4ZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCApCisgICAgZ3JhbW1hcl9tb2R1bGU6OlBhcnNlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDb2xsZWN0RXJyb3JzICkKKyAgICBncmFtbWFyX21vZHVsZTo6UGFyc2VyLnNlbmQoIDppbmNsdWRlLCBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgKQorICAgIHRyZWVfZ3JhbW1hcl9tb2R1bGU6OlRyZWVQYXJzZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q29sbGVjdEVycm9ycyApCisgICAgdHJlZV9ncmFtbWFyX21vZHVsZTo6VHJlZVBhcnNlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0ICkKKyAgICAKKyAgICBsZXhlciAgPSBncmFtbWFyX21vZHVsZTo6TGV4ZXIubmV3KCBpbnB1dCApCisgICAgcGFyc2VyID0gZ3JhbW1hci5tb2R1bGU6OlBhcnNlci5uZXcoIGxleGVyICkKKyAgICByID0gcGFyc2VyLnNlbmQoIHJ1bGUgKQorICAgIG5vZGVzID0gQU5UTFIzOjpDb21tb25UcmVlTm9kZVN0cmVhbSggci50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSBwYXJzZXIuaW5wdXQKKyAgICB3YWxrZXIgPSB0cmVlX2dyYW1tYXJfbW9kdWxlOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHIgPSB3YWxrZXIuc2VuZCggdHJlZV9ydWxlICkKKyAgICAKKyAgICByZXR1cm4oIHIgPyByLnRyZWUuaW5zcGVjdCA6ICcnICkKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAnZmxhdCB0b2tlbiBsaXN0JyBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMgMzQnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5MaXN0OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fTsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhYmMgMzQnCisgIGVuZAorICAKKyAgZXhhbXBsZSAndG9rZW4gbGlzdCBpbiBhIHNpbmdsZS1hbHRlcm5hdGl2ZSBzdWJydWxlJyBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMgMzQnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5MaXN0SW5TaW5nbGVBbHRCbG9jazsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogKElEIElOVCkgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjIDM0JworICBlbmQKKyAgCisgIGV4YW1wbGUgInNpbXBsZSByb290IGF0IHRoZSBvdXRlciBsZXZlbCB2aWEgdGhlIGBeJyBvcGVyYXRvciIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjIDM0JyApCisgICAgICBncmFtbWFyIFNpbXBsZVJvb3RBdE91dGVyTGV2ZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEXiBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGFiYyAzNCknCisgIGVuZAorICAKKyAgZXhhbXBsZSAib3V0ZXItbGV2ZWwgcm9vdCBjaGFuZ2luZyB0b2tlbiBvcmRlciBmcm9tIHRoZSBgXicgb3BlcmF0b3IiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzM0IGFiYycgKQorICAgICAgZ3JhbW1hciBTaW1wbGVSb290QXRPdXRlckxldmVsUmV2ZXJzZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSU5UIElEXiA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoYWJjIDM0KScKKyAgZW5kCisgIAorICBleGFtcGxlICJsZWF2aW5nIG91dCB0b2tlbnMgdXNpbmcgdGhlIGAhJyBvcGVyYXRvciIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjIDM0IGRhZyA0NTMyJyApCisgICAgICBncmFtbWFyIEJhbmc7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEIElOVCEgSUQhIElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICAKKyAgICByZXN1bHQuc2hvdWxkID09ICdhYmMgNDUzMicKKyAgZW5kCisgIAorICBleGFtcGxlICJ0b2tlbnMgaW4gYCguLi4pPycgb3B0aW9uYWwgc3VicnVsZSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSAxIGInICkKKyAgICAgIGdyYW1tYXIgT3B0aW9uYWxUaGVuUm9vdDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogKCBJRCBJTlQgKT8gSUReIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhiIGEgMSknCisgIGVuZAorICAKKyAgZXhhbXBsZSAibGFiZWxlZCBsaXRlcmFsLXN0cmluZyByb290IHRva2VuIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICd2b2lkIGZvbzsnICkKKyAgICAgIGdyYW1tYXIgTGFiZWxlZFN0cmluZ1Jvb3Q7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IHY9J3ZvaWQnXiBJRCAnOycgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKHZvaWQgZm9vIDspJworICBlbmQKKyAgCisgIGV4YW1wbGUgJ3J1bGUgd2l0aCB0b2tlbiB3aWxkY2FyZCcgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAndm9pZCBmb287JyApCisgICAgICBncmFtbWFyIFdpbGRjYXJkOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB2PSd2b2lkJ14gLiAnOycgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKHZvaWQgZm9vIDspJworICBlbmQKKyAgCisgIGV4YW1wbGUgInRva2VuIHdpbGRjYXJkIGFzIHJvb3QgdmlhIHRoZSBgXicgb3BlcmF0b3IiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ3ZvaWQgZm9vOycgKQorICAgICAgZ3JhbW1hciBXaWxkY2FyZFJvb3Q7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IHY9J3ZvaWQnIC5eICc7JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoZm9vIHZvaWQgOyknCisgIGVuZAorICAKKyAgZXhhbXBsZSAibGFiZWxlZCB0b2tlbiB3aWxkY2FyZCBhcyByb290IHZpYSB0aGUgYF4nIG9wZXJhdG9yIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICd2b2lkIGZvbzsnICkKKyAgICAgIGdyYW1tYXIgV2lsZGNhcmRSb290V2l0aExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB2PSd2b2lkJyB4PS5eICc7JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoZm9vIHZvaWQgOyknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInRva2VuIHdpbGRjYXJkIGFzIHJvb3QgKHdpdGggbGlzdCBsYWJlbCkiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ3ZvaWQgZm9vOycgKQorICAgICAgZ3JhbW1hciBXaWxkY2FyZFJvb3RXaXRoTGlzdExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB2PSd2b2lkJyB4PS5eICc7JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGZvbyB2b2lkIDspJworICBlbmQKKyAgCisgIGV4YW1wbGUgInRyYXNoZWQgdG9rZW4gd2lsZGNhcmQiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ3ZvaWQgZm9vOycgKQorICAgICAgZ3JhbW1hciBXaWxkY2FyZEJhbmdXaXRoTGlzdExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB2PSd2b2lkJyB4PS4hICc7JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAndm9pZCA7JworICBlbmQKKyAgCisgIGV4YW1wbGUgIm11bHRpcGxlIG9jY3VyZW5jZXMgb2YgdGhlIGBeJyBvcGVyYXRvciBpbiBhIGxpc3Qgb2YgdG9rZW5zIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIDM0IGMnICkKKyAgICAgIGdyYW1tYXIgUm9vdFJvb3Q7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEXiBJTlReIElEIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoMzQgYSBjKScKKyAgZW5kCisgIAorICBleGFtcGxlICJhbm90aGVyIGNhc2Ugb2YgbXVsdGlwbGUgb2NjdXJlbmNlcyBvZiB0aGUgYF4nIG9wZXJhdG9yIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIDM0IGMnICkKKyAgICAgIGdyYW1tYXIgUm9vdFJvb3QyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCBJTlReIElEXiA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGMgKDM0IGEpKScKKyAgZW5kCisgIAorICBleGFtcGxlICJyb290LWhvaXN0IHVzaW5nIGBeJyBmcm9tIHdpdGhpbiBhICguLi4pKyBibG9jayIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSAzNCAqIGIgOSAqIGMnICkKKyAgICAgIGdyYW1tYXIgUm9vdFRoZW5Sb290SW5Mb29wOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRF4gKElOVCAnKideIElEKSsgOworICAgICAgSUQgIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoKiAoKiAoYSAzNCkgYiA5KSBjKScKKyAgZW5kCisgIAorICBleGFtcGxlICJuZXN0ZWQgc3VicnVsZXMgd2l0aG91dCBhbnkgQVNUIG9wcyByZXN1bHRpbmcgaW4gYSBmbGF0IGxpc3QiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ3ZvaWQgYSBiOycgKQorICAgICAgZ3JhbW1hciBOZXN0ZWRTdWJydWxlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiAndm9pZCcgKCh7CisgICAgICAjZG8gbm90aGluZworICAgICAgfSBJRHxJTlQpIElEIHwgJ251bGwnICkgJzsnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICd2b2lkIGEgYiA7JworICBlbmQKKyAgCisgIGV4YW1wbGUgImludm9raW5nIGFub3RoZXIgcnVsZSB3aXRob3V0IGFueSBBU1Qgb3BzLCByZXN1bHRpbmcgaW4gYSBmbGF0IGxpc3QiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2ludCBhJyApCisgICAgICBncmFtbWFyIEludm9rZVJ1bGU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSAgOiB0eXBlIElEIDsKKyAgICAgIHR5cGUgOiB7CisgICAgICAgICMgZG8gbm90aGluZworICAgICAgfSdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnaW50IGEnCisgIGVuZAorICAKKyAgZXhhbXBsZSAiaG9pc3RpbmcgdGhlIHJlc3VsdHMgb2YgYW5vdGhlciBydWxlIGFzIHJvb3QgdXNpbmcgdGhlIGBeJyBvcGVyYXRvciIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnaW50IGEnICkKKyAgICAgIGdyYW1tYXIgSW52b2tlUnVsZUFzUm9vdDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhICA6IHR5cGVeIElEIDsKKyAgICAgIHR5cGUgOiB7CisgICAgICAgICMgZG8gbm90aGluZworICAgICAgfSdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGludCBhKScKKyAgZW5kCisgIAorICBleGFtcGxlICJob2lzdGluZyBhbm90aGVyIHJ1bGUncyB0cnVlIGFzIHJvb3QgdXNpbmcgdGhlIGBeJyBvcGVyYXRvciAod2l0aCBhIGxhYmVsKSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnaW50IGEnICkKKyAgICAgIGdyYW1tYXIgSW52b2tlUnVsZUFzUm9vdFdpdGhMYWJlbDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhICA6IHg9dHlwZV4gSUQgOworICAgICAgdHlwZSA6IHsKKyAgICAgICAgIyBkbyBub3RoaW5nCisgICAgICB9J2ludCcgfCAnZmxvYXQnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoaW50IGEpJworICBlbmQKKyAgCisgIGV4YW1wbGUgImhvaXN0aW5nIGFub3RoZXIgcnVsZSdzIHJlc3VsdCB0cmVlIGFzIHJvb3QgdXNpbmcgdGhlIGBeJyBvcGVyYXRvciAod2l0aCBhIGxpc3QgKz0gbGFiZWwpIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdpbnQgYScgKQorICAgICAgZ3JhbW1hciBJbnZva2VSdWxlQXNSb290V2l0aExpc3RMYWJlbDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhICA6IHgrPXR5cGVeIElEIDsKKyAgICAgIHR5cGUgOiB7CisgICAgICAgICMgZG8gbm90aGluZworICAgICAgfSdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGludCBhKScKKyAgZW5kCisgIAorICBleGFtcGxlICJyb290LWhvaXN0IHZpYSBgXicgd2l0aGluIGEgKC4uLikqIGxvb3AgcmVzdWx0aW5nIGluIGEgZGVlcGx5LW5lc3RlZCB0cmVlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhK2IrYytkJyApCisgICAgICBncmFtbWFyIFJ1bGVSb290SW5Mb29wOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCAoJysnXiBJRCkqIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoKyAoKyAoKyBhIGIpIGMpIGQpJworICBlbmQKKyAgCisgIGV4YW1wbGUgImhvaXN0aW5nIGFub3RoZXIgcnVsZSdzIHJlc3VsdCB0cmVlIGFzIHJvb3QgZnJvbSB3aXRoaW4gYSAoLi4uKSogbG9vcCByZXN1bHRpbmcgaW4gYSBkZWVwbHkgbmVzdGVkIHRyZWUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2ErYitjLWQnICkKKyAgICAgIGdyYW1tYXIgUnVsZUludm9jYXRpb25SdWxlUm9vdEluTG9vcDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgKG9wXiBJRCkqIDsKKyAgICAgIG9wIDogeworICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIH0nKycgfCAnLScgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygtICgrICgrIGEgYikgYykgZCknCisgIGVuZAorICAKKyAgZXhhbXBsZSAidXNpbmcgdGFpbCByZWN1cnNpb24gdG8gYnVpbGQgZGVlcGx5LW5lc3RlZCBleHByZXNzaW9uIHRyZWVzIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOnMsICczIGV4cCA0IGV4cCA1JyApCisgICAgICBncmFtbWFyIFRhaWxSZWN1cnNpb247CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgcyA6IGEgOworICAgICAgYSA6IGF0b20gKCdleHAnXiBhKT8gOworICAgICAgYXRvbSA6IElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGV4cCAzIChleHAgNCA1KSknCisgIGVuZAorICAKKyAgZXhhbXBsZSAic2ltcGxlIHRva2VuIG5vZGUgZnJvbSBhIHRva2VuIHR5cGUgc2V0IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5TZXQ7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRHxJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjJworICBlbmQKKyAgCisgIGV4YW1wbGUgImhvaXN0aW5nIGEgdG9rZW4tdHlwZSBzZXQgdG9rZW4gYXMgcm9vdCB3aXRoIGBeJyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnK2FiYycgKQorICAgICAgZ3JhbW1hciBTZXRSb290OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiAoJysnIHwgJy0nKV4gSUQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygrIGFiYyknCisgIGVuZAorICAKKyAgZXhhbXBsZSAiaG9pc3RpbmcgYSB0b2tlbi10eXBlIHNldCB0b2tlbiBhcyByb290IHdpdGggYF4nICh3aXRoIGEgbGFiZWwpIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICcrYWJjJyApCisgICAgICBncmFtbWFyIFNldFJvb3RXaXRoTGFiZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6ICh4PSgnKycgfCAnLScpKV4gSUQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJysgYWJjJworICBlbmQKKyAgCisgIGV4YW1wbGUgImhvaXN0aW5nIGEgdG9rZW4tdHlwZSBzZXQgdG9rZW4gYXMgcm9vdCBmcm9tIHdpdGhpbiBhICguLi4pKiBsb29wIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhK2ItYycgKQorICAgICAgZ3JhbW1hciBTZXRBc1J1bGVSb290SW5Mb29wOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCAoKCcrJ3wnLScpXiBJRCkqIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoLSAoKyBhIGIpIGMpJworICBlbmQKKyAgCisgIGV4YW1wbGUgImFuIGB+JyBpbnZlcnRlZCB0b2tlbi10eXBlIHNldCBlbGVtZW50IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICczNCsyJyApCisgICAgICBncmFtbWFyIE5vdFNldDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogfklEICcrJyBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJzM0ICsgMicKKyAgZW5kCisgIAorICBleGFtcGxlICJhIGB+JyBpbnZlcnRlZCB0b2tlbi10eXBlIHNldCBpbiBhIHJ1bGUgKHdpdGggYSBsYWJlbCkiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzM0KzInICkKKyAgICAgIGdyYW1tYXIgTm90U2V0V2l0aExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB4PX5JRCAnKycgSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICczNCArIDInCisgIGVuZAorICAKKyAgZXhhbXBsZSAiYSBgficgaW52ZXJ0ZWQgdG9rZW4tdHlwZSBzZXQgZWxlbWVudCBpbiBhIHJ1bGUgKHdpdGggYSBsaXN0ICs9IGxhYmVsKSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnMzQrMicgKQorICAgICAgZ3JhbW1hciBOb3RTZXRXaXRoTGlzdExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB4PX5JRCAnKycgSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICczNCArIDInCisgIGVuZAorICAKKyAgZXhhbXBsZSAiYSBgficgaW52ZXJ0ZWQgdG9rZW4tdHlwZSBzZXQgZWxlbWVudCBob2lzdGVkIHRvIHJvb3QgdmlhIGBeJyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnMzQgNTUnICkKKyAgICAgIGdyYW1tYXIgTm90U2V0Um9vdDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogficrJ14gSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoMzQgNTUpJworICBlbmQKKyAgCisgIGV4YW1wbGUgImhvaXN0aW5nIGEgYH4nIGludmVydGVkIHRva2VuLXR5cGUgc2V0IHRvIHJvb3QgdXNpbmcgYF4nICh3aXRoIGxhYmVsKSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnMzQgNTUnICkKKyAgICAgIGdyYW1tYXIgTm90U2V0Um9vdFdpdGhMYWJlbDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhICAgOiB4PX4nKydeIElOVCA7CisgICAgICBJRCAgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygzNCA1NSknCisgIGVuZAorICAKKyAgZXhhbXBsZSAiaG9pc3RpbmcgYSBgficgaW52ZXJ0ZWQgdG9rZW4tdHlwZSBzZXQgdG8gcm9vdCB1c2luZyBgXicgKHdpdGggbGlzdCArPSBsYWJlbCkiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzM0IDU1JyApCisgICAgICBncmFtbWFyIE5vdFNldFJvb3RXaXRoTGlzdExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiB4Kz1+JysnXiBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKDM0IDU1KScKKyAgZW5kCisgIAorICBleGFtcGxlICJob2lzdGluZyBhIGB+JyBpbnZlcnRlZCB0b2tlbi10eXBlIHNldCB0byByb290IGZyb20gd2l0aGluIGEgKC4uLikqIGxvb3AiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzMrNCs1JyApCisgICAgICBncmFtbWFyIE5vdFNldFJ1bGVSb290SW5Mb29wOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJTlQgKH5JTlReIElOVCkqIDsKKyAgICAgIGJsb3J0IDogJysnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoKyAoKyAzIDQpIDUpJworICBlbmQKKyAgCisgIGV4YW1wbGUgIm11bHRpcGxlIHRva2VucyB3aXRoIHRoZSBzYW1lIGxhYmVsIGluIGEgcnVsZSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSBiJyApCisgICAgICBncmFtbWFyIFRva2VuTGFiZWxSZXVzZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiBpZD1JRCBpZD1JRCB7CisgICAgICAgICRyZXN1bHQgPSAiMm5kIGlkPVwlcywiIFwlICRpZC50ZXh0CisgICAgICB9IDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcybmQgaWQ9YixhIGInCisgIGVuZAorICAKKyAgZXhhbXBsZSAibXVsdGlwbGUgdG9rZW5zIHdpdGggdGhlIHNhbWUgbGFiZWwgaW4gYSBydWxlICh3aXRoIGEgYF4nIHJvb3QgaG9pc3QpIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgVG9rZW5MYWJlbFJldXNlMjsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIHJldHVybnMgW3Jlc3VsdF06IGlkPUlEIGlkPUlEXiB7JHJlc3VsdCA9ICIybmQgaWQ9I3skaWQudGV4dH0sIn0gOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJzJuZCBpZD1iLChiIGEpJworICBlbmQKKyAgCisgIGV4YW1wbGUgImV4dHJhIHRva2VuIGluIGEgc2ltcGxlIGRlY2xhcmF0aW9uIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6ZGVjbCwgJ2ludCAzNCB4PTE7JywgdHJ1ZSApCisgICAgICBncmFtbWFyIEV4dHJhVG9rZW5JblNpbXBsZURlY2w7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgZGVjbCA6IHR5cGVeIElEICc9JyEgSU5UICc7JyEgOworICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICJsaW5lIDE6NCBleHRyYW5lb3VzIGlucHV0IFwiMzRcIiBleHBlY3RpbmcgSUQiIF0KKyAgICByZXN1bHQuc2hvdWxkID09ICcoaW50IHggMSknCisgIGVuZAorICAKKyAgZXhhbXBsZSAibWlzc2luZyBJRCBpbiBhIHNpbXBsZSBkZWNsYXJhdGlvbiIgZG8KKyAgICByZXN1bHQsIGVycm9ycyA9IHBhcnNlKCA8PC0nRU5EJywgOmRlY2wsICdpbnQgPTE7JywgdHJ1ZSApCisgICAgICBncmFtbWFyIE1pc3NpbmdJREluU2ltcGxlRGVjbDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge0VYUFI7fQorICAgICAgZGVjbCA6IHR5cGVeIElEICc9JyEgSU5UICc7JyEgOworICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBlcnJvcnMuc2hvdWxkID09IFsgImxpbmUgMTo0IG1pc3NpbmcgSUQgYXQgXCI9XCIiIF0KKyAgICByZXN1bHQuc2hvdWxkID09ICcoaW50IDxtaXNzaW5nIElEPiAxKScKKyAgZW5kCisgIAorICBleGFtcGxlICJtaXNzaW5nIHRva2VuIG9mIGEgdG9rZW4tdHlwZSBzZXQgaW4gYSBzaW1wbGUgZGVjbGFyYXRpb24iIGRvCisgICAgcmVzdWx0LCBlcnJvcnMgPSBwYXJzZSggPDwtJ0VORCcsIDpkZWNsLCAneD0xOycsIHRydWUgKQorICAgICAgZ3JhbW1hciBNaXNzaW5nU2V0SW5TaW1wbGVEZWNsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7RVhQUjt9CisgICAgICBkZWNsIDogdHlwZV4gSUQgJz0nISBJTlQgJzsnISA7CisgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICBlcnJvcnMuc2hvdWxkID09IFsgImxpbmUgMTowIG1pc21hdGNoZWQgaW5wdXQgXCJ4XCIgZXhwZWN0aW5nIHNldCBuaWwiIF0KKyAgICByZXN1bHQuc2hvdWxkID09ICcoPGVycm9yOiB4PiB4IDEpJworICBlbmQKKyAgCisgIGV4YW1wbGUgIm1pc3NpbmcgSU5UIHRva2VuIHNpbXVsYXRlZCB3aXRoIGEgYDxtaXNzaW5nIElOVD4nIGVycm9yIG5vZGUiIGRvCisgICAgcmVzdWx0LCBlcnJvcnMgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjJywgdHJ1ZSApCisgICAgICBncmFtbWFyIE1pc3NpbmdUb2tlbkdpdmVzRXJyb3JOb2RlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCBJTlQgOyAvLyBmb2xsb3cgaXMgRU9GCisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICJsaW5lIDA6LTEgbWlzc2luZyBJTlQgYXQgXCI8RU9GPlwiIiBdCisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjIDxtaXNzaW5nIElOVD4nCisgIGVuZAorICAKKyAgZXhhbXBsZSAibWlzc2luZyB0b2tlbiBmcm9tIGludm9rZWQgcnVsZSByZXN1bHRzIGluIGVycm9yIG5vZGUgd2l0aCBhIHJlc3luYyBhdHRyaWJ1dGUiIGRvCisgICAgcmVzdWx0LCBlcnJvcnMgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjJywgdHJ1ZSApCisgICAgICBncmFtbWFyIE1pc3NpbmdUb2tlbkdpdmVzRXJyb3JOb2RlSW5JbnZva2VkUnVsZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogYiA7CisgICAgICBiIDogSUQgSU5UIDsgLy8gZm9sbG93IHNob3VsZCBzZWUgRU9GCisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICJsaW5lIDA6LTEgbWlzbWF0Y2hlZCBpbnB1dCBcIjxFT0Y+XCIgZXhwZWN0aW5nIElOVCIgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJzxtaXNtYXRjaGVkIHRva2VuOiA8RU9GPiwgcmVzeW5jID0gYWJjPicKKyAgZW5kCisgIAorICBleGFtcGxlICJleHRyYW5lb3VzIElEIHRva2VuIGRpc3BsYXlzIGVycm9yIGFuZCBpcyBpZ25vcmVkIGluIEFTVCBvdXRwdXQiIGRvCisgICAgcmVzdWx0LCBlcnJvcnMgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjIGljayAzNCcsIHRydWUgKQorICAgICAgZ3JhbW1hciBFeHRyYVRva2VuR2l2ZXNFcnJvck5vZGU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IGIgYyA7CisgICAgICBiIDogSUQgOworICAgICAgYyA6IElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICJsaW5lIDE6NCBleHRyYW5lb3VzIGlucHV0IFwiaWNrXCIgZXhwZWN0aW5nIElOVCIgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2FiYyAzNCcKKyAgZW5kCisgIAorICBleGFtcGxlICJtaXNzaW5nIElEIHRva2VuIHNpbXVsYXRlZCB3aXRoIGEgYDxtaXNzaW5nIElEPicgZXJyb3Igbm9kZSIgZG8KKyAgICByZXN1bHQsIGVycm9ycyA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICczNCcsIHRydWUgKQorICAgICAgZ3JhbW1hciBNaXNzaW5nRmlyc3RUb2tlbkdpdmVzRXJyb3JOb2RlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIGVycm9ycy5zaG91bGQgPT0gWyAibGluZSAxOjAgbWlzc2luZyBJRCBhdCBcIjM0XCIiIF0KKyAgICByZXN1bHQuc2hvdWxkID09ICc8bWlzc2luZyBJRD4gMzQnCisgIGVuZAorICAKKyAgZXhhbXBsZSAiYW5vdGhlciBjYXNlIHdoZXJlIGEgbWlzc2luZyBJRCB0b2tlbiBpcyBzaW11bGF0ZWQgd2l0aCBhIGA8bWlzc2luZyBJRD4nIGVycm9yIG5vZGUiIGRvCisgICAgcmVzdWx0LCBlcnJvcnMgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnMzQnLCB0cnVlICkKKyAgICAgIGdyYW1tYXIgTWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZTI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IGIgYyA7CisgICAgICBiIDogSUQgOworICAgICAgYyA6IElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICJsaW5lIDE6MCBtaXNzaW5nIElEIGF0IFwiMzRcIiIgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJzxtaXNzaW5nIElEPiAzNCcKKyAgZW5kCisgIAorICBleGFtcGxlICJubyB2aWFibGUgYWx0ZXJuYXRpdmUgZm9yIHJ1bGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUgYDx1bmV4cGVjdGVkOiAuLi4+JyBlcnJvciBub2RlIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJyonLCB0cnVlICkKKyAgICAgIGdyYW1tYXIgTm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogYiB8IGMgOworICAgICAgYiA6IElEIDsKKyAgICAgIGMgOiBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgUyA6ICcqJyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBlcnJvcnMuc2hvdWxkID09IFsgImxpbmUgMTowIG5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBpbnB1dCBcIipcIiIgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gIjx1bmV4cGVjdGVkOiAwIFNbXCIqXCJdIEAgbGluZSAxIGNvbCAwICgwLi4wKSwgcmVzeW5jID0gKj4iCisgIGVuZAorICAKKyAgZXhhbXBsZSAidG9rZW4gd2l0aCBhIGArPScgbGlzdCBsYWJlbCBob2lzdGVkIHRvIHJvb3Qgd2l0aCBgXiciIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5MaXN0TGFiZWxSdWxlUm9vdDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogaWQrPUlEXiA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYScKKyAgZW5kCisgIAorICBleGFtcGxlICJ0b2tlbiB3aXRoIGEgbGlzdCBgKz0nIGxhYmVsIHRyYXNoZWQgd2l0aCBgISciIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5MaXN0TGFiZWxCYW5nOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBpZCs9SUQhIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcnCisgIGVuZAorICAKKyAgZXhhbXBsZSAidXNpbmcgbGlzdCBgKz0nIGxhYmVscyB0byBjb2xsZWN0IHRyZWVzIG9mIGludm9rZWQgcnVsZXMiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgYicgKQorICAgICAgZ3JhbW1hciBSdWxlTGlzdExhYmVsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgcmV0dXJucyBbcmVzdWx0XTogeCs9YiB4Kz1iIHsKKyAgICAgIHQgPSAkeFsxXQorICAgICAgJHJlc3VsdCA9ICIybmQgeD0je3QuaW5zcGVjdH0sIgorICAgICAgfTsKKyAgICAgIGIgOiBJRDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcybmQgeD1iLGEgYicKKyAgZW5kCisgIAorICBleGFtcGxlICJ1c2luZyBhIGxpc3QgYCs9JyBsYWJlbCB0byBjb2xsZWN0IHRoZSB0cmVlcyBvZiBpbnZva2VkIHJ1bGVzIHdpdGhpbiBhICguLi4pKyBibG9jayIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSBiJyApCisgICAgICBncmFtbWFyIFJ1bGVMaXN0TGFiZWxSdWxlUm9vdDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiAoIHgrPWJeICkrIHsKKyAgICAgICRyZXN1bHQgPSAieD1cJXMsIiBcJSAkeFsxXS5pbnNwZWN0CisgICAgICB9IDsKKyAgICAgIGIgOiBJRDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICd4PShiIGEpLChiIGEpJworICBlbmQKKyAgCisgIGV4YW1wbGUgInRyYXNoaW5nIHRoZSB0cmVlIG9mIGFuIGludm9rZWQgcnVsZSB3aXRoIGAhJyB3aGlsZSBjb2xsZWN0aW5nIHRoZSB0cmVlIHdpdGggYSBsaXN0IGArPScgbGFiZWwiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgYicgKQorICAgICAgZ3JhbW1hciBSdWxlTGlzdExhYmVsQmFuZzsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiB4Kz1iISB4Kz1iIHsKKyAgICAgICRyZXN1bHQgPSAiMXN0IHg9I3skeFswXS5pbnNwZWN0fSwiCisgICAgICB9IDsKKyAgICAgIGIgOiBJRDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcxc3QgeD1hLGInCisgIGVuZAorICAKKyAgZXhhbXBsZSAiYSB3aG9sZSBidW5jaCBvZiBkaWZmZXJlbnQgZWxlbWVudHMiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgYiBiIGMgYyBkJyApCisgICAgICBncmFtbWFyIENvbXBsaWNhdGVkTWVsYW5nZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogQSBiPUIgYj1CIGMrPUMgYys9QyBEIHtzID0gJEQudGV4dH0gOworICAgICAgQSA6ICdhJyA7CisgICAgICBCIDogJ2InIDsKKyAgICAgIEMgOiAnYycgOworICAgICAgRCA6ICdkJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhIGIgYiBjIGMgZCcKKyAgZW5kCisgIAorICBleGFtcGxlICJydWxlIHJldHVybiB2YWx1ZXMgaW4gYWRkaXRpb24gdG8gQVNUIG91dHB1dCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjIDM0JyApCisgICAgICBncmFtbWFyIFJldHVyblZhbHVlV2l0aEFTVDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIHJldHVybnMgW3Jlc3VsdF0gOiBJRCBiIHsgJHJlc3VsdCA9ICRiLmkudG9fcyArICJcbiIgfSA7CisgICAgICBiIHJldHVybnMgW2ldIDogSU5UIHskaT0kSU5ULnRleHQudG9faX07CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAiMzRcbmFiYyAzNCIKKyAgZW5kCisgIAorICBleGFtcGxlICJhICguLi4pKyBsb29wIGNvbnRhaW5pbmcgYSB0b2tlbi10eXBlIHNldCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDpyLCAnYWJjIDM0IGQnICkKKyAgICAgIGdyYW1tYXIgU2V0TG9vcDsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7IH0KKyAgICAgIHIgOiAoSU5UfElEKSsgOyAKKyAgICAgIElEIDogJ2EnLi4neicgKyA7CisgICAgICBJTlQgOiAnMCcuLic5JyArOworICAgICAgV1M6ICgnICcgfCAnXG4nIHwgJ1x0JykrIHskY2hhbm5lbCA9IEhJRERFTjt9OworICAgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2FiYyAzNCBkJworICBlbmQKKyAgCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2FzdC1vdXRwdXQvY29uc3RydWN0aW9uLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9jb25zdHJ1Y3Rpb24ucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyNTM5MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2FzdC1vdXRwdXQvY29uc3RydWN0aW9uLnJiCkBAIC0wLDAgKzEsNTU0IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RBU1RDb25zdHJ1Y3RpbmdQYXJzZXIgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBjb21waWxlIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBBU1RCdWlsZGVyOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgICAgb3V0cHV0ID0gQVNUOworICAgIH0KKyAgICAKKyAgICB0b2tlbnMgeworICAgICAgICBWQVJERUY7CisgICAgICAgIEZMT0FUOworICAgICAgICBFWFBSOworICAgICAgICBCTE9DSzsKKyAgICAgICAgVkFSSUFCTEU7CisgICAgICAgIEZJRUxEOworICAgICAgICBDQUxMOworICAgICAgICBJTkRFWDsKKyAgICAgICAgRklFTERBQ0NFU1M7CisgICAgfQorICAgIAorICAgIEBpbml0IHsKKyAgICAgIEBmbGFnID0gZmFsc2UKKyAgICB9CisgICAgCisgICAgQG1lbWJlcnMgeworICAgICAgYXR0cl9hY2Nlc3NvciA6ZmxhZworICAgICAgCisgICAgICBkZWYgcmVwb3J0X2Vycm9yKGUpCisgICAgICAgICMgZG8gbm90aGluZworICAgICAgZW5kCisgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgcjEKKyAgICAgICAgOiBJTlQgKCcrJ14gSU5UKSoKKyAgICAgICAgOworICAgIAorICAgIHIyCisgICAgICAgIDogJ2Fzc2VydCdeIHg9ZXhwcmVzc2lvbiAoJzonISB5PWV4cHJlc3Npb24pPyAnOychCisgICAgICAgIDsKKyAgICAKKyAgICByMworICAgICAgICA6ICdpZideIGV4cHJlc3Npb24gczE9c3RhdGVtZW50ICgnZWxzZSchIHMyPXN0YXRlbWVudCk/CisgICAgICAgIDsKKyAgICAKKyAgICByNAorICAgICAgICA6ICd3aGlsZSdeIGV4cHJlc3Npb24gc3RhdGVtZW50CisgICAgICAgIDsKKyAgICAKKyAgICByNQorICAgICAgICA6ICdyZXR1cm4nXiBleHByZXNzaW9uPyAnOychCisgICAgICAgIDsKKyAgICAKKyAgICByNgorICAgICAgICA6IChJTlR8SUQpKworICAgICAgICA7CisgICAgCisgICAgcjcKKyAgICAgICAgOiBJTlQgLT4gCisgICAgICAgIDsKKyAgICAKKyAgICByOAorICAgICAgICA6ICd2YXInIElEICc6JyB0eXBlIC0+IF4oJ3ZhcicgdHlwZSBJRCkgCisgICAgICAgIDsKKyAgICAKKyAgICByOQorICAgICAgICA6IHR5cGUgSUQgJzsnIC0+IF4oVkFSREVGIHR5cGUgSUQpIAorICAgICAgICA7CisgICAgCisgICAgcjEwCisgICAgICAgIDogSU5UIC0+IHsgQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWUubmV3KEFOVExSMzo6Q29tbW9uVG9rZW4uY3JlYXRlKDp0eXBlID0+IEZMT0FULCA6dGV4dCA9PiAoJElOVC50ZXh0ICsgIi4wIikpKX0KKyAgICAgICAgOworICAgIAorICAgIHIxMQorICAgICAgICA6IGV4cHJlc3Npb24gLT4gXihFWFBSIGV4cHJlc3Npb24pCisgICAgICAgIHwgLT4gRVhQUgorICAgICAgICA7CisgICAgCisgICAgcjEyCisgICAgICAgIDogSUQgKCcsJyBJRCkqIC0+IElEKworICAgICAgICA7CisgICAgCisgICAgcjEzCisgICAgICAgIDogdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBJRCspCisgICAgICAgIDsKKyAgICAKKyAgICByMTQKKyAgICAgICAgOiAgIGV4cHJlc3Npb24/IHN0YXRlbWVudCogdHlwZSsKKyAgICAgICAgICAgIC0+IF4oRVhQUiBleHByZXNzaW9uPyBzdGF0ZW1lbnQqIHR5cGUrKQorICAgICAgICA7CisgICAgCisgICAgcjE1CisgICAgICAgIDogSU5UIC0+IElOVCBJTlQKKyAgICAgICAgOworICAgIAorICAgIHIxNgorICAgICAgICA6ICdpbnQnIElEICgnLCcgSUQpKiAtPiBeKCdpbnQnIElEKSsKKyAgICAgICAgOworICAgIAorICAgIHIxNworICAgICAgICA6ICdmb3InICcoJyBzdGFydD1zdGF0ZW1lbnQgJzsnIGV4cHJlc3Npb24gJzsnIG5leHQ9c3RhdGVtZW50ICcpJyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIC0+IF4oJ2ZvcicgJHN0YXJ0IGV4cHJlc3Npb24gJG5leHQgc3RhdGVtZW50KQorICAgICAgICA7CisgICAgCisgICAgcjE4CisgICAgICAgIDogdD0nZm9yJyAtPiBeKEJMT0NLKQorICAgICAgICA7CisgICAgCisgICAgcjE5CisgICAgICAgIDogdD0nZm9yJyAtPiBeKEJMT0NLWyR0XSkKKyAgICAgICAgOworICAgIAorICAgIHIyMAorICAgICAgICA6IHQ9J2ZvcicgLT4gXihCTE9DS1skdCwiRk9SIl0pCisgICAgICAgIDsKKyAgICAKKyAgICByMjEKKyAgICAgICAgOiB0PSdmb3InIC0+IEJMT0NLCisgICAgICAgIDsKKyAgICAKKyAgICByMjIKKyAgICAgICAgOiB0PSdmb3InIC0+IEJMT0NLWyR0XQorICAgICAgICA7CisgICAgCisgICAgcjIzCisgICAgICAgIDogdD0nZm9yJyAtPiBCTE9DS1skdCwiRk9SIl0KKyAgICAgICAgOworICAgIAorICAgIHIyNAorICAgICAgICA6IHI9c3RhdGVtZW50IGV4cHJlc3Npb24gLT4gXigkciBleHByZXNzaW9uKQorICAgICAgICA7CisgICAgCisgICAgcjI1CisgICAgICAgIDogcis9c3RhdGVtZW50ICgnLCcgcis9c3RhdGVtZW50KSsgZXhwcmVzc2lvbiAtPiBeKCRyIGV4cHJlc3Npb24pCisgICAgICAgIDsKKyAgICAKKyAgICByMjYKKyAgICAgICAgOiByKz1zdGF0ZW1lbnQgKCcsJyByKz1zdGF0ZW1lbnQpKyAtPiBeKEJMT0NLICRyKykKKyAgICAgICAgOworICAgIAorICAgIHIyNworICAgICAgICA6IHI9c3RhdGVtZW50IGV4cHJlc3Npb24gLT4gXigkciBeKCRyIGV4cHJlc3Npb24pKQorICAgICAgICA7CisgICAgCisgICAgcjI4CisgICAgICAgIDogKCdmb28yOGEnfCdmb28yOGInKSAtPgorICAgICAgICA7CisgICAgCisgICAgcjI5CisgICAgICAgIDogKHIrPXN0YXRlbWVudCkqIC0+IF4oQkxPQ0sgJHIrKQorICAgICAgICA7CisgICAgCisgICAgcjMwCisgICAgICAgIDogc3RhdGVtZW50KiAtPiBeKEJMT0NLIHN0YXRlbWVudD8pCisgICAgICAgIDsKKyAgICAKKyAgICByMzEKKyAgICAgICAgOiBtb2RpZmllciB0eXBlIElEICgnPScgZXhwcmVzc2lvbik/ICc7JworICAgICAgICAgICAgLT4ge0BmbGFnID09IDB9PyBeKFZBUkRFRiBJRCBtb2RpZmllciogdHlwZSBleHByZXNzaW9uPykKKyAgICAgICAgICAgIC0+IHtAZmxhZyA9PSAxfT8gXihWQVJJQUJMRSBJRCBtb2RpZmllciogdHlwZSBleHByZXNzaW9uPykKKyAgICAgICAgICAgIC0+ICAgICAgICAgICAgICAgICAgIF4oRklFTEQgSUQgbW9kaWZpZXIqIHR5cGUgZXhwcmVzc2lvbj8pCisgICAgICAgIDsKKyAgICAKKyAgICByMzJbd2hpY2hdCisgICAgICA6IElEIElOVCAtPiB7d2hpY2g9PTF9PyBJRAorICAgICAgICAgICAgICAgLT4ge3doaWNoPT0yfT8gSU5UCisgICAgICAgICAgICAgICAtPiAvLyB5aWVsZCBub3RoaW5nIGFzIGVsc2UtY2xhdXNlCisgICAgICA7CisgICAgCisgICAgcjMzCisgICAgICAgIDogICBtb2RpZmllcnMhIHN0YXRlbWVudAorICAgICAgICA7CisgICAgCisgICAgcjM0CisgICAgICAgIDogICBtb2RpZmllcnMhIHIzNGFbJG1vZGlmaWVycy50cmVlXQorICAgICAgICAvL3wgICBtb2RpZmllcnMhIHIzM2JbJG1vZGlmaWVycy50cmVlXQorICAgICAgICA7CisgICAgCisgICAgcjM0YVttb2RdCisgICAgICAgIDogICAnY2xhc3MnIElEICgnZXh0ZW5kcycgc3VwPXR5cGUpPworICAgICAgICAgICAgKCAnaW1wbGVtZW50cycgaSs9dHlwZSAoJywnIGkrPXR5cGUpKik/CisgICAgICAgICAgICAneycgc3RhdGVtZW50KiAnfScKKyAgICAgICAgICAgIC0+IF4oJ2NsYXNzJyBJRCB7JG1vZH0gXignZXh0ZW5kcycgJHN1cCk/IF4oJ2ltcGxlbWVudHMnICRpKyk/IHN0YXRlbWVudCogKQorICAgICAgICA7CisgICAgCisgICAgcjM1CisgICAgICAgIDogJ3snICdleHRlbmRzJyAoc3VwPXR5cGUpPyAnfScKKyAgICAgICAgICAgIC0+ICBeKCdleHRlbmRzJyAkc3VwKT8KKyAgICAgICAgOworICAgIAorICAgIHIzNgorICAgICAgICA6ICdpZicgJygnIGV4cHJlc3Npb24gJyknIHMxPXN0YXRlbWVudAorICAgICAgICAgICAgKCAnZWxzZScgczI9c3RhdGVtZW50IC0+IF4oJ2lmJyBeKEVYUFIgZXhwcmVzc2lvbikgJHMxICRzMikKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAtPiBeKCdpZicgXihFWFBSIGV4cHJlc3Npb24pICRzMSkKKyAgICAgICAgICAgICkKKyAgICAgICAgOworICAgIAorICAgIHIzNworICAgICAgICA6IChJTlQgLT4gSU5UKSAoJysnIGk9SU5UIC0+IF4oJysnICRyMzcgJGkpICkqIAorICAgICAgICA7CisgICAgCisgICAgcjM4CisgICAgICAgIDogSU5UICgnKydeIElOVCkqCisgICAgICAgIDsKKyAgICAKKyAgICByMzkKKyAgICAgICAgOiAocHJpbWFyeS0+cHJpbWFyeSkgLy8gc2V0IHJldHVybiB0cmVlIHRvIGp1c3QgcHJpbWFyeQorICAgICAgICAgICAgKCAnKCcgYXJnPWV4cHJlc3Npb24gJyknCisgICAgICAgICAgICAgICAgLT4gXihDQUxMICRyMzkgJGFyZykKKyAgICAgICAgICAgIHwgJ1snIGllPWV4cHJlc3Npb24gJ10nCisgICAgICAgICAgICAgICAgLT4gXihJTkRFWCAkcjM5ICRpZSkKKyAgICAgICAgICAgIHwgJy4nIHA9cHJpbWFyeQorICAgICAgICAgICAgICAgIC0+IF4oRklFTERBQ0NFU1MgJHIzOSAkcCkKKyAgICAgICAgICAgICkqCisgICAgICAgIDsKKyAgICAKKyAgICByNDAKKyAgICAgICAgOiAoSU5UIC0+IElOVCkgKCAoJysnIGkrPUlOVCkqIC0+IF4oJysnICRyNDAgJGkqKSApICc7JworICAgICAgICA7CisgICAgCisgICAgcjQxCisgICAgICAgIDogKElOVCAtPiBJTlQpICggKCcrJyBpPUlOVCkgLT4gXigkaSAkcjQxKSApKiAnOycKKyAgICAgICAgOworICAgIAorICAgIHI0MgorICAgICAgICA6IGlkcys9SUQgKCcsJyEgaWRzKz1JRCkqCisgICAgICAgIDsKKyAgICAKKyAgICByNDMgcmV0dXJucyBbcmVzXQorICAgICAgICA6IGlkcys9SUQhICgnLCchIGlkcys9SUQhKSogeyRyZXMgPSAkaWRzLm1hcCB7IHxpZHwgaWQudGV4dCB9fQorICAgICAgICA7CisgICAgCisgICAgcjQ0CisgICAgICAgIDogaWRzKz1JRF4gKCcsJyEgaWRzKz1JRF4pKgorICAgICAgICA7CisgICAgCisgICAgcjQ1CisgICAgICAgIDogcHJpbWFyeV4KKyAgICAgICAgOworICAgIAorICAgIHI0NiByZXR1cm5zIFtyZXNdCisgICAgICAgIDogaWRzKz1wcmltYXJ5ISAoJywnISBpZHMrPXByaW1hcnkhKSogeyRyZXMgPSAkaWRzLm1hcCB7IHxpZHwgaWQudGV4dCB9fQorICAgICAgICA7CisgICAgCisgICAgcjQ3CisgICAgICAgIDogaWRzKz1wcmltYXJ5ICgnLCchIGlkcys9cHJpbWFyeSkqCisgICAgICAgIDsKKyAgICAKKyAgICByNDgKKyAgICAgICAgOiBpZHMrPS4gKCcsJyEgaWRzKz0uKSoKKyAgICAgICAgOworICAgIAorICAgIHI0OQorICAgICAgICA6IC5eIElECisgICAgICAgIDsKKyAgICAKKyAgICByNTAKKyAgICAgICAgOiBJRCAKKyAgICAgICAgICAgIC0+IF4oe0FOVExSMzo6QVNUOjpDb21tb25UcmVlLm5ldyhBTlRMUjM6OkNvbW1vblRva2VuLmNyZWF0ZSg6dHlwZSA9PiBGTE9BVCwgOnRleHQgPT4gIjEuMCIpKX0gSUQpCisgICAgICAgIDsKKyAgICAKKyAgICAvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICAgICAgdG9rZW5MYWJlbFByb3BlcnR5UmVmX3RyZWUKKyAgICAqLworICAgIHI1MSByZXR1cm5zIFtyZXNdCisgICAgICAgIDogSUQgdD1JRCBJRAorICAgICAgICAgICAgeyAkcmVzID0gJHQudHJlZSB9CisgICAgICAgIDsKKyAgICAKKyAgICAvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICAgICAgcnVsZVByb3BlcnR5UmVmX3RyZWUKKyAgICAqLworICAgIHI1MiByZXR1cm5zIFtyZXNdCisgICAgQGFmdGVyIHsKKyAgICAgICAgJHJlcyA9ICR0cmVlCisgICAgfQorICAgICAgICA6IElECisgICAgICAgIDsKKyAgICAKKyAgICAvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICAgICAgcnVsZUxhYmVsUHJvcGVydHlSZWZfdHJlZQorICAgICovCisgICAgcjUzIHJldHVybnMgW3Jlc10KKyAgICAgICAgOiB0PXByaW1hcnkKKyAgICAgICAgICAgIHsgJHJlcyA9ICR0LnRyZWUgfQorICAgICAgICA7CisgICAgCisgICAgLyoqIHRlbXBsYXRlcyB0ZXN0ZWQ6CisgICAgICAgIHJ1bGVTZXRQcm9wZXJ0eVJlZl90cmVlCisgICAgKi8KKyAgICByNTQgcmV0dXJucyBbcmVzXQorICAgIEBhZnRlciB7CisgICAgICAgICR0cmVlID0gJHQudHJlZTsKKyAgICB9CisgICAgICAgIDogSUQgdD1leHByZXNzaW9uIElECisgICAgICAgIDsKKyAgICAKKyAgICAvKiogYmFja3RyYWNraW5nICovCisgICAgcjU1CisgICAgb3B0aW9ucyB7IGJhY2t0cmFjaz10cnVlOyBrPTE7IH0KKyAgICAgICAgOiAobW9kaWZpZXIrIElOVCk9PiBtb2RpZmllcisgZXhwcmVzc2lvbgorICAgICAgICB8IG1vZGlmaWVyKyBzdGF0ZW1lbnQKKyAgICAgICAgOworICAgIAorICAgIAorICAgIC8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgICAgICByZXdyaXRlVG9rZW5SZWYgd2l0aCBsZW4oYXJncyk+MAorICAgICovCisgICAgcjU2CisgICAgICAgIDogdD1JRCogLT4gSURbJHQsJ2ZvbyddCisgICAgICAgIDsKKyAgICAKKyAgICAvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICAgICAgcmV3cml0ZVRva2VuUmVmUm9vdCB3aXRoIGxlbihhcmdzKT4wCisgICAgKi8KKyAgICByNTcKKyAgICAgICAgOiB0PUlEKiAtPiBeKElEWyR0LCdmb28nXSkKKyAgICAgICAgOworICAgIAorICAgIC8qKiB0ZW1wbGF0ZXMgdGVzdGVkOgorICAgICAgICA/Pz8KKyAgICAqLworICAgIHI1OAorICAgICAgICA6ICh7Q29tbW9uVHJlZS5uZXcoQ29tbW9uVG9rZW4uY3JlYXRlKDp0eXBlID0+IEZMT0FULCA6dGV4dCA9PiAiMi4wIikpfSleCisgICAgICAgIDsKKyAgICAKKyAgICAvKiogdGVtcGxhdGVzIHRlc3RlZDoKKyAgICAgICAgcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmUm9vdAorICAgICovCisgICAgcjU5CisgICAgICAgIDogKHQrPUlEKSsgc3RhdGVtZW50IC0+IF4oJHQgc3RhdGVtZW50KSsKKyAgICAgICAgOworICAgIAorICAgIHByaW1hcnkKKyAgICAgICAgOiBJRAorICAgICAgICA7CisgICAgCisgICAgZXhwcmVzc2lvbgorICAgICAgICA6IHIxCisgICAgICAgIDsKKyAgICAKKyAgICBzdGF0ZW1lbnQKKyAgICAgICAgOiAnZm9vemUnCisgICAgICAgIHwgJ2Zvb3plMicKKyAgICAgICAgOworICAgIAorICAgIG1vZGlmaWVycworICAgICAgICA6IG1vZGlmaWVyKworICAgICAgICA7CisgICAgCisgICAgbW9kaWZpZXIKKyAgICAgICAgOiAncHVibGljJworICAgICAgICB8ICdwcml2YXRlJworICAgICAgICA7CisgICAgCisgICAgdHlwZQorICAgICAgICA6ICdpbnQnCisgICAgICAgIHwgJ2Jvb2wnCisgICAgICAgIDsKKyAgICAKKyAgICBJRCA6ICdhJy4uJ3onICsgOworICAgIElOVCA6ICcwJy4uJzknICs7CisgICAgV1M6ICgnICcgfCAnXG4nIHwgJ1x0JykrIHskY2hhbm5lbCA9IEhJRERFTjt9OworICBFTkQKKyAgCisgIGRlZiBzZWxmLmFzdF90ZXN0KCBvcHRzLCAmc3BlY2lhbF90ZXN0ICkKKyAgICBpbnB1dCA9IG9wdHNbIDppbnB1dCBdCisgICAgcnVsZSAgPSBvcHRzWyA6cnVsZSBdCisgICAgZXhwZWN0ZWRfdHJlZSA9IG9wdHNbIDphc3QgXQorICAgIGZsYWcgPSBvcHRzWyA6ZmxhZyBdCisgICAgYXJncyA9IG9wdHNbIDphcmd1bWVudHMgXSB8fCBbXQorICAgIG1lc3NhZ2UgPSBvcHRzWyA6bWVzc2FnZSBdIHx8IHJ1bGUudG9fcyAjInNob3VsZCBwYXJzZSAlcCB3aXRoIHJ1bGUgJXMgYW5kIG1ha2UgdHJlZSAlcyIgJSBbaW5wdXQsIHJ1bGUsIGV4cGVjdGVkX3RyZWVdCisgICAgCisgICAgZXhhbXBsZSggbWVzc2FnZSApIGRvCisgICAgICBsZXhlciA9IEFTVEJ1aWxkZXI6OkxleGVyLm5ldyggaW5wdXQgKQorICAgICAgcGFyc2VyID0gQVNUQnVpbGRlcjo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgICAgcGFyc2VyLmZsYWcgPSBmbGFnIHVubGVzcyBmbGFnLm5pbD8KKyAgICAgIHJlc3VsdCA9IHBhcnNlci5zZW5kKCBydWxlLCAqYXJncyApCisgICAgICBpZiBzcGVjaWFsX3Rlc3QgdGhlbiBpbnN0YW5jZV9leGVjKCByZXN1bHQsICZzcGVjaWFsX3Rlc3QgKQorICAgICAgZWxzaWYgZXhwZWN0ZWRfdHJlZSB0aGVuCisgICAgICAgIHJlc3VsdC50cmVlLmluc3BlY3Quc2hvdWxkID09IGV4cGVjdGVkX3RyZWUKKyAgICAgIGVsc2UgcmVzdWx0LnRyZWUuc2hvdWxkIGJlX25pbAorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIxICsgMiIsIDpydWxlID0+IDpyMSwgOmFzdCA9PiAiKCsgMSAyKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiYXNzZXJ0IDIrMyIsIDpydWxlID0+IDpyMiwgOmFzdCA9PiAiKGFzc2VydCAoKyAyIDMpKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiYXNzZXJ0IDIrMyA6IDUiLCA6cnVsZSA9PiA6cjIsIDphc3QgPT4gIihhc3NlcnQgKCsgMiAzKSA1KSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiaWYgMSBmb296ZSIsIDpydWxlID0+IDpyMywgOmFzdCA9PiAiKGlmIDEgZm9vemUpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJpZiAxIGZvb3plIGVsc2UgZm9vemUiLCA6cnVsZSA9PiA6cjMsIDphc3QgPT4gIihpZiAxIGZvb3plIGZvb3plKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAid2hpbGUgMiBmb296ZSIsIDpydWxlID0+IDpyNCwgOmFzdCA9PiAiKHdoaWxlIDIgZm9vemUpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJyZXR1cm47IiwgOnJ1bGUgPT4gOnI1LCA6YXN0ID0+ICJyZXR1cm4iCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gInJldHVybiAyKzM7IiwgOnJ1bGUgPT4gOnI1LCA6YXN0ID0+ICIocmV0dXJuICgrIDIgMykpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIzIiwgOnJ1bGUgPT4gOnI2LCA6YXN0ID0+ICIzIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIzIGEiLCA6cnVsZSA9PiA6cjYsIDphc3QgPT4gIjMgYSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiMyIsIDpydWxlID0+IDpyNywgOmFzdCA9PiBuaWwKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAidmFyIGZvbzpib29sIiwgOnJ1bGUgPT4gOnI4LCA6YXN0ID0+ICIodmFyIGJvb2wgZm9vKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiaW50IGZvbzsiLCA6cnVsZSA9PiA6cjksIDphc3QgPT4gIihWQVJERUYgaW50IGZvbykiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gIjEwIiwgOnJ1bGUgPT4gOnIxMCwgOmFzdCA9PiAiMTAuMCIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiMSsyIiwgOnJ1bGUgPT4gOnIxMSwgOmFzdCA9PiAiKEVYUFIgKCsgMSAyKSkiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gIiIsIDpydWxlID0+IDpyMTEsIDphc3QgPT4gIkVYUFIiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvbyIsIDpydWxlID0+IDpyMTIsIDphc3QgPT4gImZvbyIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZm9vLCBiYXIsIGdudXJ6IiwgOnJ1bGUgPT4gOnIxMiwgOmFzdCA9PiAiZm9vIGJhciBnbnVyeiIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiaW50IGZvbzsiLCA6cnVsZSA9PiA6cjEzLCA6YXN0ID0+ICIoaW50IGZvbykiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImJvb2wgZm9vLCBiYXIsIGdudXJ6OyIsIDpydWxlID0+IDpyMTMsIDphc3QgPT4gIihib29sIGZvbyBiYXIgZ251cnopIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIxKzIgaW50IiwgOnJ1bGUgPT4gOnIxNCwgOmFzdCA9PiAiKEVYUFIgKCsgMSAyKSBpbnQpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIxKzIgaW50IGJvb2wiLCA6cnVsZSA9PiA6cjE0LCA6YXN0ID0+ICIoRVhQUiAoKyAxIDIpIGludCBib29sKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiaW50IGJvb2wiLCA6cnVsZSA9PiA6cjE0LCA6YXN0ID0+ICIoRVhQUiBpbnQgYm9vbCkiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvb3plIGZvb3plIGludCBib29sIiwgOnJ1bGUgPT4gOnIxNCwgOmFzdCA9PiAiKEVYUFIgZm9vemUgZm9vemUgaW50IGJvb2wpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICI3KzkgZm9vemUgZm9vemUgaW50IGJvb2wiLCA6cnVsZSA9PiA6cjE0LCA6YXN0ID0+ICIoRVhQUiAoKyA3IDkpIGZvb3plIGZvb3plIGludCBib29sKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiNyIsIDpydWxlID0+IDpyMTUsIDphc3QgPT4gIjcgNyIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiaW50IGZvbyIsIDpydWxlID0+IDpyMTYsIDphc3QgPT4gIihpbnQgZm9vKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiaW50IGZvbywgYmFyLCBnbnVyeiIsIDpydWxlID0+IDpyMTYsIDphc3QgPT4gIihpbnQgZm9vKSAoaW50IGJhcikgKGludCBnbnVyeikiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvciAoIGZvb3plIDsgMSArIDIgOyBmb296ZSApIGZvb3plIiwgOnJ1bGUgPT4gOnIxNywgOmFzdCA9PiAiKGZvciBmb296ZSAoKyAxIDIpIGZvb3plIGZvb3plKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZm9yIiwgOnJ1bGUgPT4gOnIxOCwgOmFzdCA9PiAiQkxPQ0siCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvciIsIDpydWxlID0+IDpyMTksIDphc3QgPT4gImZvciIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZm9yIiwgOnJ1bGUgPT4gOnIyMCwgOmFzdCA9PiAiRk9SIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJmb3IiLCA6cnVsZSA9PiA6cjIxLCA6YXN0ID0+ICJCTE9DSyIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZm9yIiwgOnJ1bGUgPT4gOnIyMiwgOmFzdCA9PiAiZm9yIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJmb3IiLCA6cnVsZSA9PiA6cjIzLCA6YXN0ID0+ICJGT1IiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvb3plIDEgKyAyIiwgOnJ1bGUgPT4gOnIyNCwgOmFzdCA9PiAiKGZvb3plICgrIDEgMikpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJmb296ZSwgZm9vemUyIDEgKyAyIiwgOnJ1bGUgPT4gOnIyNSwgOmFzdCA9PiAiKGZvb3plICgrIDEgMikpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJmb296ZSwgZm9vemUyIiwgOnJ1bGUgPT4gOnIyNiwgOmFzdCA9PiAiKEJMT0NLIGZvb3plIGZvb3plMikiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvb3plIDEgKyAyIiwgOnJ1bGUgPT4gOnIyNywgOmFzdCA9PiAiKGZvb3plIChmb296ZSAoKyAxIDIpKSkiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gImZvbzI4YSIsIDpydWxlID0+IDpyMjgsIDphc3QgPT4gbmlsCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gInB1YmxpYyBpbnQgZ251cnogPSAxICsgMjsiLCA6cnVsZSA9PiA6cjMxLCA6YXN0ID0+ICIoVkFSREVGIGdudXJ6IHB1YmxpYyBpbnQgKCsgMSAyKSkiLCA6ZmxhZyA9PiAwCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gInB1YmxpYyBpbnQgZ251cnogPSAxICsgMjsiLCA6cnVsZSA9PiA6cjMxLCA6YXN0ID0+ICIoVkFSSUFCTEUgZ251cnogcHVibGljIGludCAoKyAxIDIpKSIsIDpmbGFnID0+IDEKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAicHVibGljIGludCBnbnVyeiA9IDEgKyAyOyIsIDpydWxlID0+IDpyMzEsIDphc3QgPT4gIihGSUVMRCBnbnVyeiBwdWJsaWMgaW50ICgrIDEgMikpIiwgOmZsYWcgPT4gMgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdnbnVyeiAzMicsIDpydWxlID0+IDpyMzIsIDphcmd1bWVudHMgPT4gWyAxIF0sIDpmbGFnID0+IDIsIDphc3QgPT4gJ2dudXJ6JworICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdnbnVyeiAzMicsIDpydWxlID0+IDpyMzIsIDphcmd1bWVudHMgPT4gWyAyIF0sIDpmbGFnID0+IDIsIDphc3QgPT4gJzMyJworICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdnbnVyeicsIDpydWxlID0+IDpyMzIsIDphcmd1bWVudHMgPT4gWyAzIF0sIDpmbGFnID0+IDIsIDphc3QgPT4gbmlsCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gInB1YmxpYyBwcml2YXRlIGZvb3plIiwgOnJ1bGUgPT4gOnIzMywgOmFzdCA9PiAiZm9vemUiCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gInB1YmxpYyBjbGFzcyBnbnVyeiB7IGZvb3plIGZvb3plMiB9IiwgOnJ1bGUgPT4gOnIzNCwgOmFzdCA9PiAiKGNsYXNzIGdudXJ6IHB1YmxpYyBmb296ZSBmb296ZTIpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJwdWJsaWMgY2xhc3MgZ251cnogZXh0ZW5kcyBib29sIGltcGxlbWVudHMgaW50LCBib29sIHsgZm9vemUgZm9vemUyIH0iLCA6cnVsZSA9PiA6cjM0LCA6YXN0ID0+ICIoY2xhc3MgZ251cnogcHVibGljIChleHRlbmRzIGJvb2wpIChpbXBsZW1lbnRzIGludCBib29sKSBmb296ZSBmb296ZTIpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJpZiAoIDEgKyAyICkgZm9vemUiLCA6cnVsZSA9PiA6cjM2LCA6YXN0ID0+ICIoaWYgKEVYUFIgKCsgMSAyKSkgZm9vemUpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIxICsgMiArIDMiLCA6cnVsZSA9PiA6cjM3LCA6YXN0ID0+ICIoKyAoKyAxIDIpIDMpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICIxICsgMiArIDMiLCA6cnVsZSA9PiA6cjM4LCA6YXN0ID0+ICIoKyAoKyAxIDIpIDMpIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJnbnVyelsxXSIsIDpydWxlID0+IDpyMzksIDphc3QgPT4gIihJTkRFWCBnbnVyeiAxKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZ251cnooMikiLCA6cnVsZSA9PiA6cjM5LCA6YXN0ID0+ICIoQ0FMTCBnbnVyeiAyKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZ251cnouZ25hcnoiLCA6cnVsZSA9PiA6cjM5LCA6YXN0ID0+ICIoRklFTERBQ0NFU1MgZ251cnogZ25hcnopIgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJnbnVyei5nbmFyei5nbm9yeiIsIDpydWxlID0+IDpyMzksIDphc3QgPT4gIihGSUVMREFDQ0VTUyAoRklFTERBQ0NFU1MgZ251cnogZ25hcnopIGdub3J6KSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiMSArIDIgKyAzOyIsIDpydWxlID0+IDpyNDAsIDphc3QgPT4gIigrIDEgMiAzKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiMSArIDIgKyAzOyIsIDpydWxlID0+IDpyNDEsIDphc3QgPT4gIigzICgyIDEpKSIKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAiZ251cnosIGduYXJ6LCBnbm9yeiIsIDpydWxlID0+IDpyNDIsIDphc3QgPT4gImdudXJ6IGduYXJ6IGdub3J6IgorICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICJnbnVyeiwgZ25hcnosIGdub3J6IiwgOnJ1bGUgPT4gOnI0MyBkbyB8cmVzdWx0fAorICAgIHJlc3VsdC50cmVlLnNob3VsZCBiZV9uaWwKKyAgICByZXN1bHQucmVzLnNob3VsZCA9PSAldyhnbnVyeiBnbmFyeiBnbm9yeikKKyAgZW5kCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gJ2dudXJ6LCBnbmFyeiwgZ25vcnonLCA6cnVsZSA9PiA6cjQ0LCA6YXN0ID0+ICcoZ25vcnogKGduYXJ6IGdudXJ6KSknCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gJ2dudXJ6JywgOnJ1bGUgPT4gOnI0NSwgOmFzdCA9PiAnZ251cnonCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gJ2dudXJ6LCBnbmFyeiwgZ25vcnonLCA6cnVsZSA9PiA6cjQ2IGRvIHxyZXN1bHR8CisgICAgcmVzdWx0LnRyZWUuc2hvdWxkIGJlX25pbAorICAgIHJlc3VsdC5yZXMuc2hvdWxkID09ICV3KGdudXJ6IGduYXJ6IGdub3J6KQorICBlbmQKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAnZ251cnosIGduYXJ6LCBnbm9yeicsIDpydWxlID0+IDpyNDcsIDphc3QgPT4gJ2dudXJ6IGduYXJ6IGdub3J6JworICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdnbnVyeiwgZ25hcnosIGdub3J6JywgOnJ1bGUgPT4gOnI0OCwgOmFzdCA9PiAnZ251cnogZ25hcnogZ25vcnonCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gJ2dudXJ6IGdub3J6JywgOnJ1bGUgPT4gOnI0OSwgOmFzdCA9PiAnKGdudXJ6IGdub3J6KScKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAnZ251cnonLCA6cnVsZSA9PiA6cjUwLCA6YXN0ID0+ICcoMS4wIGdudXJ6KScKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAnZ251cnphIGdudXJ6YiBnbnVyemMnLCA6cnVsZSA9PiA6cjUxIGRvIHxyZXN1bHR8CisgICAgcmVzdWx0LnJlcy5pbnNwZWN0LnNob3VsZCA9PSAnZ251cnpiJworICBlbmQKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAnZ251cnonLCA6cnVsZSA9PiA6cjUyLCA6YXN0ID0+ICdnbnVyeicKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAnZ251cnonLCA6cnVsZSA9PiA6cjUzLCA6YXN0ID0+ICdnbnVyeicKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAnZ251cnphIDEgKyAyIGdudXJ6YicsIDpydWxlID0+IDpyNTQsIDphc3QgPT4gJygrIDEgMiknCisgIAorICBhc3RfdGVzdCA6aW5wdXQgPT4gJ3B1YmxpYyBwcml2YXRlIDEgKyAyJywgOnJ1bGUgPT4gOnI1NSwgOmFzdCA9PiAncHVibGljIHByaXZhdGUgKCsgMSAyKScKKyAgCisgIGFzdF90ZXN0IDppbnB1dCA9PiAncHVibGljIGZvb3plJywgOnJ1bGUgPT4gOnI1NSwgOmFzdCA9PiAncHVibGljIGZvb3plJworICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdhIGIgYyBkJywgOnJ1bGUgPT4gOnI1NiwgOmFzdCA9PiAnZm9vJworICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdhIGIgYyBkJywgOnJ1bGUgPT4gOnI1NywgOmFzdCA9PiAnZm9vJworICAKKyAgYXN0X3Rlc3QgOmlucHV0ID0+ICdhIGIgYyBmb296ZScsIDpydWxlID0+IDpyNTksIDphc3QgPT4gJyhhIGZvb3plKSAoYiBmb296ZSkgKGMgZm9vemUpJworCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2FzdC1vdXRwdXQvaGV0ZXJvLW5vZGVzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9oZXRlcm8tbm9kZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2MjMzOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2FzdC1vdXRwdXQvaGV0ZXJvLW5vZGVzLnJiCkBAIC0wLDAgKzEsNzUxIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKKworY2xhc3MgVGVzdEhldGVyb2dlbmVvdXNOb2RlVHlwZXMgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgVlRva2VuOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBAbWVtYmVycyB7CisgICAgICBjbGFzcyBWIDwgQU5UTFIzOjpDb21tb25UcmVlCisgICAgICAgIGRlZiB0b19zCisgICAgICAgICAgcmV0dXJuIEB0b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICB9CisgICAgYSA6IElEPFY+IDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRva2VuV2l0aFF1YWxpZmllZFR5cGU7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIH0KKyAgICBhIDogSUQ8VG9rZW5XaXRoUXVhbGlmaWVkVHlwZS5QYXJzZXIuVj4gOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgVG9rZW5XaXRoTGFiZWw7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICBjbGFzcyBWIDwgQU5UTFIzOjpDb21tb25UcmVlCisgICAgICBkZWYgdG9fcworICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgZW5kCisgICAgZW5kCisgICAgfQorICAgIGEgOiB4PUlEPFY+IDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRva2VuV2l0aExpc3RMYWJlbDsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorICAgIGEgOiB4Kz1JRDxWPiA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBUb2tlblJvb3Q7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIAorICAgIH0KKyAgICBhIDogSUQ8Vj5eIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRva2VuUm9vdFdpdGhMaXN0TGFiZWw7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIAorICAgIH0KKyAgICBhIDogeCs9SUQ8Vj5eIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEZyb21TdHJpbmc7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIAorICAgIH0KKyAgICBhIDogJ2JlZ2luJzxWPiA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTdHJpbmdSb290OworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBAbWVtYmVycyB7CisgICAgICBjbGFzcyBWIDwgQU5UTFIzOjpDb21tb25UcmVlCisgICAgICAgIGRlZiB0b19zCisgICAgICAgICAgcmV0dXJuIEB0b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAKKyAgICB9CisgICAgYSA6ICdiZWdpbic8Vj5eIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJld3JpdGVUb2tlbjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgCisgICAgfQorICAgIGEgOiBJRCAtPiBJRDxWPiA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBSZXdyaXRlVG9rZW5XaXRoQXJnczsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgaW5pdGlhbGl6ZSgqYXJncykKKyAgICAgICAgICBjYXNlIGFyZ3MubGVuZ3RoCisgICAgICAgICAgd2hlbiA0CisgICAgICAgICAgICB0dHlwZSwgQHgsIEB5LCBAeiA9IGFyZ3MKKyAgICAgICAgICAgIHRva2VuID0gQU5UTFIzOjpDb21tb25Ub2tlbi5uZXcodHR5cGUsIG5pbCwgJycpCisgICAgICAgICAgd2hlbiAzCisgICAgICAgICAgICB0dHlwZSwgdG9rZW4sIEB4ID0gYXJncworICAgICAgICAgICAgQHkgPSBAeiA9IDAKKyAgICAgICAgICBlbHNlIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHM6ICN7YXJncy5sZW5ndGh9IGZvciAzLTQiCisgICAgICAgICAgZW5kCisgICAgICAgICAgc3VwZXIodG9rZW4pCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICAoQHRva2VuLnRleHQudG9fcyByZXNjdWUgJycpIDw8ICI8Vj47XCVkXCVkXCVkIiBcJSBbQHgsIEB5LCBAel0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAKKyAgICB9CisgICAgYSA6IElEIC0+IElEPFY+WzQyLDE5LDMwXSBJRDxWPlskSUQsOTldOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZVRva2VuUm9vdDsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgCisgICAgfQorICAgIGEgOiBJRCBJTlQgLT4gXihJRDxWPiBJTlQpIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrIDsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZVN0cmluZzsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgCisgICAgfQorICAgIGEgOiAnYmVnaW4nIC0+ICdiZWdpbic8Vj4gOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZVN0cmluZ1Jvb3Q7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIAorICAgIH0KKyAgICBhIDogJ2JlZ2luJyBJTlQgLT4gXignYmVnaW4nPFY+IElOVCkgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5JysgOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBSZXdyaXRlUnVsZVJlc3VsdHM7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIHRva2VucyB7TElTVDt9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBjbGFzcyBXIDwgQU5UTFIzOjpDb21tb25UcmVlCisgICAgICAgIGRlZiBpbml0aWFsaXplKHRvaywgdGV4dCkKKyAgICAgICAgICB0b2sudGV4dCA9IHRleHQKKyAgICAgICAgICBzdXBlcih0b2spCisgICAgICAgIGVuZAorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vz4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgCisgICAgfQorICAgIGEgOiBpZCAoJywnIGlkKSogLT4gXihMSVNUPFc+WyJMSVNUIl0gaWQrKTsKKyAgICBpZCA6IElEIC0+IElEPFY+OworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgQ29weVNlbWFudGljc1dpdGhIZXRlcm87CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIGR1cF9ub2RlCisgICAgICAgICAgcmV0dXJuIFYubmV3KHNlbGYpCisgICAgICAgIGVuZAorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorICAgIGEgOiB0eXBlIElEICgnLCcgSUQpKiAnOycgLT4gXih0eXBlIElEKSs7CisgICAgdHlwZSA6ICdpbnQnPFY+IDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgVHJlZVBhcnNlclJld3JpdGVGbGF0TGlzdDsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEIElOVDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlRmxhdExpc3RXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPVRyZWVQYXJzZXJSZXdyaXRlRmxhdExpc3Q7CisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY2xhc3MgVyA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vz4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorICAgIGEgOiBJRCBJTlQgLT4gSU5UPFY+IElEPFc+CisgICAgICA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlVHJlZTsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEIElOVDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlVHJlZVdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9VHJlZVBhcnNlclJld3JpdGVUcmVlOworICAgIH0KKyAgICBAbWVtYmVycyB7CisgICAgICBjbGFzcyBWIDwgQU5UTFIzOjpDb21tb25UcmVlCisgICAgICAgIGRlZiB0b19zCisgICAgICAgICAgcmV0dXJuIEB0b2tlbi50ZXh0ICsgIjxWPiIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICAKKyAgICAgIGNsYXNzIFcgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLnRleHQgKyAiPFc+IgorICAgICAgICBlbmQKKyAgICAgIGVuZCAgICAgIAorICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSU5UPFY+IElEPFc+KQorICAgICAgOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeTsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5V2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1UcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeTsKKyAgICB9CisgICAgdG9rZW5zIHsgUk9PVDsgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLm5hbWUgKyAiPFY+IgorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgIH0KKyAgICBhIDogSUQgLT4gUk9PVDxWPiBJRAorICAgICAgOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeVdpdGhBcmdzOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgVHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnlXaXRoQXJnc1dhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnlXaXRoQXJnczsKKyAgICB9CisgICAgdG9rZW5zIHsgUk9PVDsgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGNsYXNzIFYgPCBBTlRMUjM6OkNvbW1vblRyZWUKKyAgICAgICAgZGVmIGluaXRpYWxpemUodG9rZW5fdHlwZSwgeCkKKyAgICAgICAgICBzdXBlcih0b2tlbl90eXBlKQorICAgICAgICAgIEB4ID0geAorICAgICAgICBlbmQKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLm5hbWUgKyAiPFY+OyNAeCIKKyAgICAgICAgZW5kCisgICAgICBlbmQKKyAgICB9CisgICAgYSA6IElEIC0+IFJPT1Q8Vj5bNDJdIElECisgICAgICA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5Um9vdDsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5Um9vdFdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnlSb290OworICAgIH0KKyAgICB0b2tlbnMgeyBST09UOyB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4ubmFtZSArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorICAgIGEgOiBJRCAtPiBeKFJPT1Q8Vj4gSUQpCisgICAgICA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5RnJvbVJlYWw7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeUZyb21SZWFsV2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1UcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeUZyb21SZWFsOworICAgIH0KKyAgICB0b2tlbnMgeyBST09UOyB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgaW5pdGlhbGl6ZSh0b2tlbiwgdHJlZSA9IG5pbCkKKyAgICAgICAgICBpZiB0cmVlLm5pbD8gdGhlbiBzdXBlcih0b2tlbikKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzdXBlcih0cmVlKQorICAgICAgICAgICAgQHRva2VuID0gVG9rZW5EYXRhOjpUb2tlbi5mcm9tX3Rva2VuKEB0b2tlbikKKyAgICAgICAgICAgIEB0b2tlbi50eXBlID0gdG9rZW4udHlwZQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgICAgZGVmIHRvX3MKKyAgICAgICAgICByZXR1cm4gQHRva2VuLm5hbWUgKyAiPFY+QCIgKyBAdG9rZW4ubGluZS50b19zCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorICAgIGEgOiBJRCAtPiBST09UPFY+WyRJRF0KKyAgICAgIDsKKyAgRU5ECisKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgVHJlZVBhcnNlckF1dG9IZXRlcm9BU1Q7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCAnOycgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgVHJlZVBhcnNlckF1dG9IZXRlcm9BU1RXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPVRyZWVQYXJzZXJBdXRvSGV0ZXJvQVNUOworICAgIH0KKyAgICB0b2tlbnMgeyBST09UOyB9CisgICAgQG1lbWJlcnMgeworICAgICAgY2xhc3MgViA8IEFOVExSMzo6Q29tbW9uVHJlZQorICAgICAgICBkZWYgdG9fcworICAgICAgICAgIHJldHVybiBAdG9rZW4udGV4dCArICI8Vj4iCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIGEgOiBJRDxWPiAnOyc8Vj47CisgIEVORAorCisgIGRlZiBwYXJzZSggZ3JhbW1hcl9uYW1lLCBncmFtbWFyX3J1bGUsIGlucHV0ICkKKyAgICBncmFtbWFyX21vZHVsZSA9IHNlbGYuY2xhc3MuY29uc3RfZ2V0KCBncmFtbWFyX25hbWUudG9fcyApCisgICAgbGV4ZXIgID0gZ3JhbW1hcl9tb2R1bGU6OkxleGVyLm5ldyggaW5wdXQgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gZ3JhbW1hcl9tb2R1bGU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgciA9IHBhcnNlci5zZW5kKCBncmFtbWFyX3J1bGUgKQorICAgIAorICAgIHJldHVybiggci50cmVlLmluc3BlY3QgcmVzY3VlICcnICkKKyAgZW5kCisgIAorICBkZWYgdHJlZV9wYXJzZSggZ3JhbW1hcl9uYW1lLCBncmFtbWFyX3J1bGUsIHRyZWVfZ3JhbW1hcl9ydWxlLCBpbnB1dCApCisgICAgZ3JhbW1hcl9tb2R1bGUgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCggZ3JhbW1hcl9uYW1lLnRvX3MgKQorICAgIHRyZWVfZ3JhbW1hcl9tb2R1bGUgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCggZ3JhbW1hcl9uYW1lLnRvX3MgKyAnV2Fsa2VyJyApCisgICAgCisgICAgbGV4ZXIgID0gZ3JhbW1hcl9tb2R1bGU6OkxleGVyLm5ldyggaW5wdXQgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gZ3JhbW1hcl9tb2R1bGU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgciA9IHBhcnNlci5zZW5kKCBncmFtbWFyX3J1bGUgKQorICAgIAorICAgIG5vZGVzID0gQU5UTFIzOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHIudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgdHJlZV9wYXJzZXIgPSB0cmVlX2dyYW1tYXJfbW9kdWxlOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHIgPSB0cmVlX3BhcnNlci5zZW5kKCB0cmVlX2dyYW1tYXJfcnVsZSApCisgICAgCisgICAgcmV0dXJuKCByLnRyZWUuaW5zcGVjdCByZXNjdWUgJycgKQorICBlbmQKKworICBleGFtcGxlICJ2IHRva2VuIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA6VlRva2VuLCA6YSwgJ2EnICkKKyAgICByZXN1bHQuc2hvdWxkID09ICdhPFY+JworICBlbmQKKworCisgIGV4YW1wbGUgInRva2VuIHdpdGggcXVhbGlmaWVkIHR5cGUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDpUb2tlbldpdGhRdWFsaWZpZWRUeXBlLCA6YSwgJ2EnICkKKyAgICByZXN1bHQuc2hvdWxkID09ICdhPFY+JworICBlbmQKKworCisgIGV4YW1wbGUgInRva2VuIHdpdGggbGFiZWwiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDpUb2tlbldpdGhMYWJlbCwgOmEsICdhJyApCisgICAgcmVzdWx0LnNob3VsZCA9PSAnYTxWPicKKyAgZW5kCisKKworICBleGFtcGxlICJ0b2tlbiB3aXRoIGxpc3QgbGFiZWwiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDpUb2tlbldpdGhMaXN0TGFiZWwsIDphLCAnYScgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2E8Vj4nCisgIGVuZAorCisKKyAgZXhhbXBsZSAidG9rZW4gcm9vdCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggOlRva2VuUm9vdCwgOmEsICdhJyApCisgICAgcmVzdWx0LnNob3VsZCA9PSAnYTxWPicKKyAgZW5kCisKKworICBleGFtcGxlICJ0b2tlbiByb290IHdpdGggbGlzdCBsYWJlbCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggOlRva2VuUm9vdFdpdGhMaXN0TGFiZWwsIDphLCAnYScgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2E8Vj4nCisgIGVuZAorCisKKyAgZXhhbXBsZSAic3RyaW5nIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA6RnJvbVN0cmluZywgOmEsICdiZWdpbicgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2JlZ2luPFY+JworICBlbmQKKworCisgIGV4YW1wbGUgInN0cmluZyByb290IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA6U3RyaW5nUm9vdCwgOmEsICdiZWdpbicgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2JlZ2luPFY+JworICBlbmQKKworCisgIGV4YW1wbGUgInJld3JpdGUgdG9rZW4iIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDpSZXdyaXRlVG9rZW4sIDphLCAnYScgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2E8Vj4nCisgIGVuZAorCisKKyAgZXhhbXBsZSAicmV3cml0ZSB0b2tlbiB3aXRoIGFyZ3MiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDpSZXdyaXRlVG9rZW5XaXRoQXJncywgOmEsICdhJyApCisgICAgcmVzdWx0LnNob3VsZCA9PSAnPFY+OzQyMTkzMCBhPFY+Ozk5MDAnCisgIGVuZAorCisKKyAgZXhhbXBsZSAicmV3cml0ZSB0b2tlbiByb290IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA6UmV3cml0ZVRva2VuUm9vdCwgOmEsICdhIDInICkKKyAgICByZXN1bHQuc2hvdWxkID09ICcoYTxWPiAyKScKKyAgZW5kCisKKworICBleGFtcGxlICJyZXdyaXRlIHN0cmluZyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggOlJld3JpdGVTdHJpbmcsIDphLCAnYmVnaW4nICkKKyAgICByZXN1bHQuc2hvdWxkID09ICdiZWdpbjxWPicKKyAgZW5kCisKKworICBleGFtcGxlICJyZXdyaXRlIHN0cmluZyByb290IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA6UmV3cml0ZVN0cmluZ1Jvb3QsIDphLCAnYmVnaW4gMicgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhiZWdpbjxWPiAyKScKKyAgZW5kCisKKworICBleGFtcGxlICJyZXdyaXRlIHJ1bGUgcmVzdWx0cyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggOlJld3JpdGVSdWxlUmVzdWx0cywgOmEsICdhLGIsYycgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhMSVNUPFc+IGE8Vj4gYjxWPiBjPFY+KScKKyAgZW5kCisKKworICBleGFtcGxlICJjb3B5IHNlbWFudGljcyB3aXRoIGhldGVybyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggOkNvcHlTZW1hbnRpY3NXaXRoSGV0ZXJvLCA6YSwgJ2ludCBhLCBiLCBjOycgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhpbnQ8Vj4gYSkgKGludDxWPiBiKSAoaW50PFY+IGMpJworICBlbmQKKworCisgIGV4YW1wbGUgInRyZWUgcGFyc2VyIHJld3JpdGUgZmxhdCBsaXN0IiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyUmV3cml0ZUZsYXRMaXN0LCA6YSwgOmEsICdhYmMgMzQnICkKKyAgICByZXN1bHQuc2hvdWxkID09ICczNDxWPiBhYmM8Vz4nCisgIGVuZAorCisKKyAgZXhhbXBsZSAidHJlZSBwYXJzZXIgcmV3cml0ZSB0cmVlIiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyUmV3cml0ZVRyZWUsIDphLCA6YSwgJ2FiYyAzNCcgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJygzNDxWPiBhYmM8Vz4pJworICBlbmQKKworCisgIGV4YW1wbGUgInRyZWUgcGFyc2VyIHJld3JpdGUgaW1hZ2luYXJ5IiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeSwgOmEsIDphLCAnYWJjJyApCisgICAgcmVzdWx0LnNob3VsZCA9PSAnUk9PVDxWPiBhYmMnCisgIGVuZAorCisKKyAgZXhhbXBsZSAidHJlZSBwYXJzZXIgcmV3cml0ZSBpbWFnaW5hcnkgd2l0aCBhcmdzIiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeVdpdGhBcmdzLCA6YSwgOmEsICdhYmMnICkKKyAgICByZXN1bHQuc2hvdWxkID09ICdST09UPFY+OzQyIGFiYycKKyAgZW5kCisKKworICBleGFtcGxlICJ0cmVlIHBhcnNlciByZXdyaXRlIGltYWdpbmFyeSByb290IiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeVJvb3QsIDphLCA6YSwgJ2FiYycgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhST09UPFY+IGFiYyknCisgIGVuZAorCisKKyAgZXhhbXBsZSAidHJlZSBwYXJzZXIgcmV3cml0ZSBpbWFnaW5hcnkgZnJvbSByZWFsIiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeUZyb21SZWFsLCA6YSwgOmEsICdhYmMnICkKKyAgICByZXN1bHQuc2hvdWxkID09ICdST09UPFY+QDEnCisgIGVuZAorCisKKyAgZXhhbXBsZSAidHJlZSBwYXJzZXIgYXV0byBoZXRlcm8gYXN0IiBkbworICAgIHJlc3VsdCA9IHRyZWVfcGFyc2UoIDpUcmVlUGFyc2VyQXV0b0hldGVyb0FTVCwgOmEsIDphLCAnYWJjOycgKQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2FiYzxWPiA7PFY+JworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9hc3Qtb3V0cHV0L3Jld3JpdGVzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9yZXdyaXRlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzEyYjZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvYXN0LW91dHB1dC9yZXdyaXRlcy5yYgpAQCAtMCwwICsxLDEzMjYgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgVGVzdEFTVFZpYVJld3JpdGVSdWxlcyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGRlZiBwYXJzZSggZ3JhbW1hciwgcnVsZSwgaW5wdXQsIGV4cGVjdF9lcnJvcnMgPSBmYWxzZSApCisgICAgQGdyYW1tYXIgPSBpbmxpbmVfZ3JhbW1hciggZ3JhbW1hciApCisgICAgY29tcGlsZV9hbmRfbG9hZCBAZ3JhbW1hcgorICAgIGdyYW1tYXJfbW9kdWxlID0gc2VsZi5jbGFzcy5jb25zdF9nZXQoIEBncmFtbWFyLm5hbWUgKQorICAgIAorICAgIGdyYW1tYXJfbW9kdWxlOjpMZXhlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDb2xsZWN0RXJyb3JzICkKKyAgICBncmFtbWFyX21vZHVsZTo6TGV4ZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCApCisgICAgZ3JhbW1hcl9tb2R1bGU6OlBhcnNlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDb2xsZWN0RXJyb3JzICkKKyAgICBncmFtbWFyX21vZHVsZTo6UGFyc2VyLnNlbmQoIDppbmNsdWRlLCBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgKQorICAgIAorICAgIGxleGVyICA9IGdyYW1tYXJfbW9kdWxlOjpMZXhlci5uZXcoIGlucHV0ICkKKyAgICBwYXJzZXIgPSBncmFtbWFyX21vZHVsZTo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgIAorICAgIHIgPSBwYXJzZXIuc2VuZCggcnVsZSApCisgICAgcGFyc2VyLnJlcG9ydGVkX2Vycm9ycy5zaG91bGQgYmVfZW1wdHkgdW5sZXNzIGV4cGVjdF9lcnJvcnMKKyAgICByZXN1bHQgPSAnJworICAgIAorICAgIHVubGVzcyByLm5pbD8KKyAgICAgIHJlc3VsdCArPSByLnJlc3VsdCBpZiByLnJlc3BvbmRfdG8/KCA6cmVzdWx0ICkKKyAgICAgIHJlc3VsdCArPSByLnRyZWUuaW5zcGVjdCBpZiByLnRyZWUKKyAgICBlbmQKKyAgICByZXR1cm4oIGV4cGVjdF9lcnJvcnMgPyBbIHJlc3VsdCwgcGFyc2VyLnJlcG9ydGVkX2Vycm9ycyBdIDogcmVzdWx0ICkKKyAgZW5kCisgIAorICBkZWYgdHJlZV9wYXJzZSggZ3JhbW1hciwgdHJlZV9ncmFtbWFyLCBydWxlLCB0cmVlX3J1bGUsIGlucHV0ICkKKyAgICBAZ3JhbW1hciA9IGlubGluZV9ncmFtbWFyKCBncmFtbWFyICkKKyAgICBAdHJlZV9ncmFtbWFyID0gaW5saW5lX2dyYW1tYXIoIHRyZWVfZ3JhbW1hciApCisgICAgY29tcGlsZV9hbmRfbG9hZCBAZ3JhbW1hcgorICAgIGNvbXBpbGVfYW5kX2xvYWQgQHRyZWVfZ3JhbW1hcgorICAgIAorICAgIGdyYW1tYXJfbW9kdWxlID0gc2VsZi5jbGFzcy5jb25zdF9nZXQoIEBncmFtbWFyLm5hbWUgKQorICAgIHRyZWVfZ3JhbW1hcl9tb2R1bGUgPSBzZWxmLmNsYXNzLmNvbnN0X2dldCggQHRyZWVfZ3JhbW1hci5uYW1lICkKKyAgICAKKyAgICBncmFtbWFyX21vZHVsZTo6TGV4ZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q29sbGVjdEVycm9ycyApCisgICAgZ3JhbW1hcl9tb2R1bGU6OkxleGVyLnNlbmQoIDppbmNsdWRlLCBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgKQorICAgIGdyYW1tYXJfbW9kdWxlOjpQYXJzZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q29sbGVjdEVycm9ycyApCisgICAgZ3JhbW1hcl9tb2R1bGU6OlBhcnNlci5zZW5kKCA6aW5jbHVkZSwgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0ICkKKyAgICB0cmVlX2dyYW1tYXJfbW9kdWxlOjpUcmVlUGFyc2VyLnNlbmQoIDppbmNsdWRlLCBBTlRMUjM6OlRlc3Q6OkNvbGxlY3RFcnJvcnMgKQorICAgIHRyZWVfZ3JhbW1hcl9tb2R1bGU6OlRyZWVQYXJzZXIuc2VuZCggOmluY2x1ZGUsIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCApCisgICAgCisgICAgbGV4ZXIgID0gZ3JhbW1hcl9tb2R1bGU6OkxleGVyLm5ldyggaW5wdXQgKQorICAgIHBhcnNlciA9IGdyYW1tYXIubW9kdWxlOjpQYXJzZXIubmV3KCBsZXhlciApCisgICAgciA9IHBhcnNlci5zZW5kKCBydWxlICkKKyAgICBub2RlcyA9IEFOVExSMzo6Q29tbW9uVHJlZU5vZGVTdHJlYW0oIHIudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gcGFyc2VyLmlucHV0CisgICAgd2Fsa2VyID0gdHJlZV9ncmFtbWFyX21vZHVsZTo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByID0gd2Fsa2VyLnNlbmQoIHRyZWVfcnVsZSApCisgICAgCisgICAgcmV0dXJuKCByID8gci50cmVlLmluc3BlY3QgOiAnJyApCisgIGVuZAorICAKKyAgZXhhbXBsZSAiZGVsZXRlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMgMzQnICkKKyAgICAgIGdyYW1tYXIgRGVsZXRlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCBJTlQgLT4gOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzaW5nbGUgdG9rZW4iIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYycgKQorICAgICAgZ3JhbW1hciBTaW5nbGVUb2tlbjsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgLT4gSUQ7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzaW5nbGUgdG9rZW4gdG8gbmV3IG5vZGUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYycgKQorICAgICAgZ3JhbW1hciBTaW5nbGVUb2tlblRvTmV3Tm9kZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgLT4gSURbIngiXTsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICd4JworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzaW5nbGUgdG9rZW4gdG8gbmV3IG5vZGUgcm9vdCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjJyApCisgICAgICBncmFtbWFyIFNpbmdsZVRva2VuVG9OZXdOb2RlUm9vdDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgLT4gXihJRFsieCJdIElOVCk7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKHggSU5UKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAic2luZ2xlIHRva2VuIHRvIG5ldyBub2RlMiIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjJyApCisgICAgICBncmFtbWFyIFNpbmdsZVRva2VuVG9OZXdOb2RlMjsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgLT4gSURbIF07CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdJRCcKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAic2luZ2xlIGNoYXIgbGl0ZXJhbCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYycgKQorICAgICAgZ3JhbW1hciBTaW5nbGVDaGFyTGl0ZXJhbDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogJ2MnIC0+ICdjJzsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzaW5nbGUgc3RyaW5nIGxpdGVyYWwiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2ljaycgKQorICAgICAgZ3JhbW1hciBTaW5nbGVTdHJpbmdMaXRlcmFsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiAnaWNrJyAtPiAnaWNrJzsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdpY2snCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInNpbmdsZSBydWxlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMnICkKKyAgICAgIGdyYW1tYXIgU2luZ2xlUnVsZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogYiAtPiBiOworICAgICAgYiA6IElEIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhYmMnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJlb3JkZXIgdG9rZW5zIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMgMzQnICkKKyAgICAgIGdyYW1tYXIgUmVvcmRlclRva2VuczsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgSU5UIC0+IElOVCBJRDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICczNCBhYmMnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJlb3JkZXIgdG9rZW4gYW5kIHJ1bGUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYyAzNCcgKQorICAgICAgZ3JhbW1hciBSZW9yZGVyVG9rZW5BbmRSdWxlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBiIElOVCAtPiBJTlQgYjsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnMzQgYWJjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJ0b2tlbiB0cmVlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMgMzQnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5UcmVlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCBJTlQgLT4gXihJTlQgSUQpOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygzNCBhYmMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJ0b2tlbiB0cmVlIGFmdGVyIG90aGVyIHN0dWZmIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICd2b2lkIGFiYyAzNCcgKQorICAgICAgZ3JhbW1hciBUb2tlblRyZWVBZnRlck90aGVyU3R1ZmY7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6ICd2b2lkJyBJRCBJTlQgLT4gJ3ZvaWQnIF4oSU5UIElEKTsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICd2b2lkICgzNCBhYmMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJuZXN0ZWQgdG9rZW4gdHJlZSB3aXRoIG91dGVyIGxvb3AiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgMSBiIDInICkKKyAgICAgIGdyYW1tYXIgTmVzdGVkVG9rZW5UcmVlV2l0aE91dGVyTG9vcDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge0RVSDt9CisgICAgICBhIDogSUQgSU5UIElEIElOVCAtPiBeKCBEVUggSUQgXiggRFVIIElOVCkgKSsgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhEVUggYSAoRFVIIDEpKSAoRFVIIGIgKERVSCAyKSknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgIm9wdGlvbmFsIHNpbmdsZSB0b2tlbiIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjJyApCisgICAgICBncmFtbWFyIE9wdGlvbmFsU2luZ2xlVG9rZW47CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEIC0+IElEPyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjbG9zdXJlIHNpbmdsZSB0b2tlbiIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSBiJyApCisgICAgICBncmFtbWFyIENsb3N1cmVTaW5nbGVUb2tlbjsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgSUQgLT4gSUQqIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhIGInCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInBvc2l0aXZlIGNsb3N1cmUgc2luZ2xlIHRva2VuIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgUG9zaXRpdmVDbG9zdXJlU2luZ2xlVG9rZW47CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEIElEIC0+IElEKyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYSBiJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJvcHRpb25hbCBzaW5nbGUgcnVsZSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjJyApCisgICAgICBncmFtbWFyIE9wdGlvbmFsU2luZ2xlUnVsZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogYiAtPiBiPzsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjbG9zdXJlIHNpbmdsZSBydWxlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgQ2xvc3VyZVNpbmdsZVJ1bGU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IGIgYiAtPiBiKjsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYSBiJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjbG9zdXJlIG9mIGxhYmVsIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgQ2xvc3VyZU9mTGFiZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IHgrPWIgeCs9YiAtPiAkeCo7CisgICAgICBiIDogSUQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2EgYicKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAib3B0aW9uYWwgbGFiZWwgbm8gbGlzdCBsYWJlbCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYScgKQorICAgICAgZ3JhbW1hciBPcHRpb25hbExhYmVsTm9MaXN0TGFiZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6ICh4PUlEKT8gLT4gJHg/OworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2EnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInBvc2l0aXZlIGNsb3N1cmUgc2luZ2xlIHJ1bGUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgYicgKQorICAgICAgZ3JhbW1hciBQb3NpdGl2ZUNsb3N1cmVTaW5nbGVSdWxlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBiIGIgLT4gYis7CisgICAgICBiIDogSUQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2EgYicKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAic2luZ2xlIHByZWRpY2F0ZSB0IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhYmMnICkKKyAgICAgIGdyYW1tYXIgU2luZ2xlUHJlZGljYXRlVDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgLT4ge3RydWV9PyBJRCAtPiA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzaW5nbGUgcHJlZGljYXRlIGYiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYycgKQorICAgICAgZ3JhbW1hciBTaW5nbGVQcmVkaWNhdGVGOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCAtPiB7ZmFsc2V9PyBJRCAtPiA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJtdWx0aXBsZSBwcmVkaWNhdGUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgMicgKQorICAgICAgZ3JhbW1hciBNdWx0aXBsZVByZWRpY2F0ZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgSU5UIC0+IHtmYWxzZX0/IElECisgICAgICAgICAgICAgICAgIC0+IHt0cnVlfT8gSU5UCisgICAgICAgICAgICAgICAgIC0+IAorICAgICAgICA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnMicKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAibXVsdGlwbGUgcHJlZGljYXRlIHRyZWVzIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIDInICkKKyAgICAgIGdyYW1tYXIgTXVsdGlwbGVQcmVkaWNhdGVUcmVlczsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgSU5UIC0+IHtmYWxzZX0/IF4oSUQgSU5UKQorICAgICAgICAgICAgICAgICAtPiB7dHJ1ZX0/IF4oSU5UIElEKQorICAgICAgICAgICAgICAgICAtPiBJRAorICAgICAgICA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKDIgYSknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInNpbXBsZSB0cmVlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICctMzQnICkKKyAgICAgIGdyYW1tYXIgU2ltcGxlVHJlZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogb3AgSU5UIC0+IF4ob3AgSU5UKTsKKyAgICAgIG9wIDogJysnfCctJyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKC0gMzQpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzaW1wbGUgdHJlZTIiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJysgMzQnICkKKyAgICAgIGdyYW1tYXIgU2ltcGxlVHJlZTI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IG9wIElOVCAtPiBeKElOVCBvcCk7CisgICAgICBvcCA6ICcrJ3wnLScgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygzNCArKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAibmVzdGVkIHRyZWVzIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICd2YXIgYTppbnQ7IGI6ZmxvYXQ7JyApCisgICAgICBncmFtbWFyIE5lc3RlZFRyZWVzOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiAndmFyJyAoSUQgJzonIHR5cGUgJzsnKSsgLT4gXigndmFyJyBeKCc6JyBJRCB0eXBlKSspIDsKKyAgICAgIHR5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJyh2YXIgKDogYSBpbnQpICg6IGIgZmxvYXQpKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAiaW1hZ2luYXJ5IHRva2VuIGNvcHkiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EsYixjJyApCisgICAgICBncmFtbWFyIEltYWdpbmFyeVRva2VuQ29weTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge1ZBUjt9CisgICAgICBhIDogSUQgKCcsJyBJRCkqLT4gXihWQVIgSUQpKyA7CisgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoVkFSIGEpIChWQVIgYikgKFZBUiBjKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAidG9rZW4gdW5yZWZlcmVuY2VkIG9uIGxlZnQgYnV0IGRlZmluZWQiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EnICkKKyAgICAgIGdyYW1tYXIgVG9rZW5VbnJlZmVyZW5jZWRPbkxlZnRCdXREZWZpbmVkOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7VkFSO30KKyAgICAgIGEgOiBiIC0+IElEIDsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnSUQnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImltYWdpbmFyeSB0b2tlbiBjb3B5IHNldCB0ZXh0IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhLGIsYycgKQorICAgICAgZ3JhbW1hciBJbWFnaW5hcnlUb2tlbkNvcHlTZXRUZXh0OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7VkFSO30KKyAgICAgIGEgOiBJRCAoJywnIElEKSotPiBeKFZBUlsidmFyIl0gSUQpKyA7CisgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcodmFyIGEpICh2YXIgYikgKHZhciBjKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAiaW1hZ2luYXJ5IHRva2VuIG5vIGNvcHkgZnJvbSB0b2tlbiIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAne2EgYiBjfScgKQorICAgICAgZ3JhbW1hciBJbWFnaW5hcnlUb2tlbk5vQ29weUZyb21Ub2tlbjsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgIGEgOiBsYz0neycgSUQrICd9JyAtPiBeKEJMT0NLWyRsY10gSUQrKSA7CisgICAgICB0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoeyBhIGIgYyknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImltYWdpbmFyeSB0b2tlbiBubyBjb3B5IGZyb20gdG9rZW4gc2V0IHRleHQiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ3thIGIgY30nICkKKyAgICAgIGdyYW1tYXIgSW1hZ2luYXJ5VG9rZW5Ob0NvcHlGcm9tVG9rZW5TZXRUZXh0OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgYSA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjLCJibG9jayJdIElEKykgOworICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGJsb2NrIGEgYiBjKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAibWl4ZWQgcmV3cml0ZSBhbmQgYXV0byBhc3QiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgMSAyJyApCisgICAgICBncmFtbWFyIE1peGVkUmV3cml0ZUFuZEF1dG9BU1Q7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogYiBiXiA7IC8vIDJuZCBiIG1hdGNoZXMgb25seSBhbiBJTlQ7IGNhbiBtYWtlIGl0IHJvb3QKKyAgICAgIGIgOiBJRCBJTlQgLT4gSU5UIElECisgICAgICAgIHwgSU5UCisgICAgICAgIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygyIDEgYSknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInN1YnJ1bGUgd2l0aCByZXdyaXRlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIDEgMiAzJyApCisgICAgICBncmFtbWFyIFN1YnJ1bGVXaXRoUmV3cml0ZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgIGEgOiBiIGIgOworICAgICAgYiA6IChJRCBJTlQgLT4gSU5UIElEIHwgSU5UIElOVCAtPiBJTlQrICkKKyAgICAgICAgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJzEgYSAyIDMnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInN1YnJ1bGUgd2l0aCByZXdyaXRlMiIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnaW50IGE7IGludCBiPTM7JyApCisgICAgICBncmFtbWFyIFN1YnJ1bGVXaXRoUmV3cml0ZTI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtUWVBFO30KKyAgICAgIGEgOiBiIGIgOworICAgICAgYiA6ICdpbnQnCisgICAgICAgICAgKCBJRCAtPiBeKFRZUEUgJ2ludCcgSUQpCisgICAgICAgICAgfCBJRCAnPScgSU5UIC0+IF4oVFlQRSAnaW50JyBJRCBJTlQpCisgICAgICAgICAgKQorICAgICAgICAgICc7JworICAgICAgICA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKFRZUEUgaW50IGEpIChUWVBFIGludCBiIDMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJuZXN0ZWQgcmV3cml0ZSBzaHV0cyBvZmYgYXV0byBhc3QiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgYiBjIGQ7IDQyJyApCisgICAgICBncmFtbWFyIE5lc3RlZFJld3JpdGVTaHV0c09mZkF1dG9BU1Q7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogYiBiIDsKKyAgICAgIGIgOiBJRCAoIElEIChsYXN0PUlEIC0+ICRsYXN0KSsgKSAnOycgLy8gZ2V0IGxhc3QgSUQKKyAgICAgICAgfCBJTlQgLy8gc2hvdWxkIHN0aWxsIGdldCBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24KKyAgICAgICAgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2QgNDInCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJld3JpdGUgYWN0aW9ucyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnMycgKQorICAgICAgZ3JhbW1hciBSZXdyaXRlQWN0aW9uczsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogYXRvbSAtPiBeKHsgQGFkYXB0b3IuY3JlYXRlKCBJTlQsICI5IiApIH0gYXRvbSkgOworICAgICAgYXRvbSA6IElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKDkgMyknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJld3JpdGUgYWN0aW9uczIiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzMnICkKKyAgICAgIGdyYW1tYXIgUmV3cml0ZUFjdGlvbnMyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBhdG9tIC0+IHsgQGFkYXB0b3IuY3JlYXRlKCBJTlQsICI5IiApIH0gYXRvbSA7CisgICAgICBhdG9tIDogSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7ICRjaGFubmVsID0gSElEREVOIH0gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICc5IDMnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJlZiB0byBvbGQgdmFsdWUiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzMrNCs1JyApCisgICAgICBncmFtbWFyIFJlZlRvT2xkVmFsdWU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogKGF0b20gLT4gYXRvbSkgKG9wPScrJyByPWF0b20gLT4gXigkb3AgJGEgJHIpICkqIDsKKyAgICAgIGF0b20gOiBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygrICgrIDMgNCkgNSknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImNvcHkgc2VtYW50aWNzIGZvciBydWxlcyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnMycgKQorICAgICAgZ3JhbW1hciBDb3B5U2VtYW50aWNzRm9yUnVsZXM7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogYXRvbSAtPiBeKGF0b20gYXRvbSkgOyAvLyBOT1QgQ1lDTEUhIChkdXAgYXRvbSkKKyAgICAgIGF0b20gOiBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJygzIDMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjb3B5IHNlbWFudGljcyBmb3IgcnVsZXMyIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdpbnQgYSxiLGM7JyApCisgICAgICBncmFtbWFyIENvcHlTZW1hbnRpY3NGb3JSdWxlczI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgSUQpKyA7CisgICAgICB0eXBlIDogJ2ludCcgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhpbnQgYSkgKGludCBiKSAoaW50IGMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjb3B5IHNlbWFudGljcyBmb3IgcnVsZXMzIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdwdWJsaWMgaW50IGEsYixjOycgKQorICAgICAgZ3JhbW1hciBDb3B5U2VtYW50aWNzRm9yUnVsZXMzOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBtb2RpZmllcj8gdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBtb2RpZmllcj8gSUQpKyA7CisgICAgICB0eXBlIDogJ2ludCcgOworICAgICAgbW9kaWZpZXIgOiAncHVibGljJyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGludCBwdWJsaWMgYSkgKGludCBwdWJsaWMgYikgKGludCBwdWJsaWMgYyknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImNvcHkgc2VtYW50aWNzIGZvciBydWxlczMgZG91YmxlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdwdWJsaWMgaW50IGEsYixjOycgKQorICAgICAgZ3JhbW1hciBDb3B5U2VtYW50aWNzRm9yUnVsZXMzRG91YmxlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBtb2RpZmllcj8gdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBtb2RpZmllcj8gSUQpKyBeKHR5cGUgbW9kaWZpZXI/IElEKSsgOworICAgICAgdHlwZSA6ICdpbnQnIDsKKyAgICAgIG1vZGlmaWVyIDogJ3B1YmxpYycgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhpbnQgcHVibGljIGEpIChpbnQgcHVibGljIGIpIChpbnQgcHVibGljIGMpIChpbnQgcHVibGljIGEpIChpbnQgcHVibGljIGIpIChpbnQgcHVibGljIGMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjb3B5IHNlbWFudGljcyBmb3IgcnVsZXM0IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdwdWJsaWMgaW50IGEsYixjOycgKQorICAgICAgZ3JhbW1hciBDb3B5U2VtYW50aWNzRm9yUnVsZXM0OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7TU9EO30KKyAgICAgIGEgOiBtb2RpZmllcj8gdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBeKE1PRCBtb2RpZmllcik/IElEKSsgOworICAgICAgdHlwZSA6ICdpbnQnIDsKKyAgICAgIG1vZGlmaWVyIDogJ3B1YmxpYycgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhpbnQgKE1PRCBwdWJsaWMpIGEpIChpbnQgKE1PRCBwdWJsaWMpIGIpIChpbnQgKE1PRCBwdWJsaWMpIGMpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjb3B5IHNlbWFudGljcyBsaXN0cyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSxiLGM7JyApCisgICAgICBncmFtbWFyIENvcHlTZW1hbnRpY3NMaXN0czsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge01PRDt9CisgICAgICBhIDogSUQgKCcsJyBJRCkqICc7JyAtPiBJRCsgSUQrIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhIGIgYyBhIGIgYycKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAiY29weSBydWxlIGxhYmVsIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhJyApCisgICAgICBncmFtbWFyIENvcHlSdWxlTGFiZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogeD1iIC0+ICR4ICR4OworICAgICAgYiA6IElEIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhIGEnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImNvcHkgcnVsZSBsYWJlbDIiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EnICkKKyAgICAgIGdyYW1tYXIgQ29weVJ1bGVMYWJlbDI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogeD1iIC0+IF4oJHggJHgpOworICAgICAgYiA6IElEIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoYSBhKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAicXVldWVpbmcgb2YgdG9rZW5zIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdpbnQgYSxiLGM7JyApCisgICAgICBncmFtbWFyIFF1ZXVlaW5nT2ZUb2tlbnM7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6ICdpbnQnIElEICgnLCcgSUQpKiAnOycgLT4gXignaW50JyBJRCspIDsKKyAgICAgIG9wIDogJysnfCctJyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGludCBhIGIgYyknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImNvcHkgb2YgdG9rZW5zIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdpbnQgYTsnICkKKyAgICAgIGdyYW1tYXIgQ29weU9mVG9rZW5zOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiAnaW50JyBJRCAnOycgLT4gJ2ludCcgSUQgJ2ludCcgSUQgOworICAgICAgb3AgOiAnKyd8Jy0nIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdpbnQgYSBpbnQgYScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAidG9rZW4gY29weSBpbiBsb29wIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdpbnQgYSxiLGM7JyApCisgICAgICBncmFtbWFyIFRva2VuQ29weUluTG9vcDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogJ2ludCcgSUQgKCcsJyBJRCkqICc7JyAtPiBeKCdpbnQnIElEKSsgOworICAgICAgb3AgOiAnKyd8Jy0nIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcoaW50IGEpIChpbnQgYikgKGludCBjKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAidG9rZW4gY29weSBpbiBsb29wIGFnYWluc3QgdHdvIG90aGVycyIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnaW50IGE6MSxiOjIsYzozOycgKQorICAgICAgZ3JhbW1hciBUb2tlbkNvcHlJbkxvb3BBZ2FpbnN0VHdvT3RoZXJzOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiAnaW50JyBJRCAnOicgSU5UICgnLCcgSUQgJzonIElOVCkqICc7JyAtPiBeKCdpbnQnIElEIElOVCkrIDsKKyAgICAgIG9wIDogJysnfCctJyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnKGludCBhIDEpIChpbnQgYiAyKSAoaW50IGMgMyknCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgImxpc3QgcmVmZCBvbmUgYXQgYSB0aW1lIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGIgYycgKQorICAgICAgZ3JhbW1hciBMaXN0UmVmZE9uZUF0QVRpbWU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEKyAtPiBJRCBJRCBJRCA7IC8vIHdvcmtzIGlmIDMgaW5wdXQgSURzCisgICAgICBvcCA6ICcrJ3wnLScgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2EgYiBjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzcGxpdCBsaXN0IHdpdGggbGFiZWxzIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGIgYycgKQorICAgICAgZ3JhbW1hciBTcGxpdExpc3RXaXRoTGFiZWxzOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7VkFSO30KKyAgICAgIGEgOiBmaXJzdD1JRCBvdGhlcnMrPUlEKiAtPiAkZmlyc3QgVkFSICRvdGhlcnMrIDsKKyAgICAgIG9wIDogJysnfCctJyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYSBWQVIgYiBjJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjb21wbGljYXRlZCBtZWxhbmdlIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGEgYiBiIGIgYyBjIGMgZCcgKQorICAgICAgZ3JhbW1hciBDb21wbGljYXRlZE1lbGFuZ2U7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogQSBBIGI9QiBCIGI9QiBjKz1DIEMgYys9QyBEIHtzPSRELnRleHR9IC0+IEErIEIrIEMrIEQgOworICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBBIDogJ2EnIDsKKyAgICAgIEIgOiAnYicgOworICAgICAgQyA6ICdjJyA7CisgICAgICBEIDogJ2QnIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhIGEgYiBiIGIgYyBjIGMgZCcKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAicnVsZSBsYWJlbCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYScgKQorICAgICAgZ3JhbW1hciBSdWxlTGFiZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogeD1iIC0+ICR4OworICAgICAgYiA6IElEIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJhbWJpZ3VvdXMgcnVsZSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYWJjIDM0JyApCisgICAgICBncmFtbWFyIEFtYmlndW91c1J1bGU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEIGEgLT4gYSB8IElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQ6ICcwJy4uJzknKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnMzQnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJ1bGUgbGlzdCBsYWJlbCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSBiJyApCisgICAgICBncmFtbWFyIFJ1bGVMaXN0TGFiZWw7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogeCs9YiB4Kz1iIC0+ICR4KzsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYSBiJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJydWxlIGxpc3QgbGFiZWwyIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgUnVsZUxpc3RMYWJlbDI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogeCs9YiB4Kz1iIC0+ICR4ICR4KjsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYSBiJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJvcHRpb25hbCIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYScgKQorICAgICAgZ3JhbW1hciBPcHRpb25hbDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMge0JMT0NLO30KKyAgICAgIGEgOiB4PWIgKHk9Yik/IC0+ICR4ICR5PzsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAib3B0aW9uYWwyIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgT3B0aW9uYWwyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgYSA6IHg9SUQgKHk9Yik/IC0+ICR4ICR5PzsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYSBiJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJvcHRpb25hbDMiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2EgYicgKQorICAgICAgZ3JhbW1hciBPcHRpb25hbDM7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogeD1JRCAoeT1iKT8gLT4gKCR4ICR5KT87CisgICAgICBiIDogSUQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2EgYicKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAib3B0aW9uYWw0IiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOmEsICdhIGInICkKKyAgICAgIGdyYW1tYXIgT3B0aW9uYWw0OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgYSA6IHgrPUlEICh5PWIpPyAtPiAoJHggJHkpPzsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICdhIGInCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgIm9wdGlvbmFsNSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYScgKQorICAgICAgZ3JhbW1hciBPcHRpb25hbDU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICBhIDogSUQgLT4gSUQ/IDsgLy8gbWF0Y2ggYW4gSUQgdG8gb3B0aW9uYWwgSUQKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnYScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAiYXJiaXRyYXJ5IGV4cHIgdHlwZSIgZG8KKyAgICByZXN1bHQgPSBwYXJzZSggPDwtJ0VORCcsIDphLCAnYSBiJyApCisgICAgICBncmFtbWFyIEFyYml0cmFyeUV4cHJUeXBlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7QkxPQ0s7fQorICAgICAgYSA6IHgrPWIgeCs9YiAtPiB7QU5UTFIzOjpDb21tb25UcmVlLm5ldyhuaWwpfTsKKyAgICAgIGIgOiBJRCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgcmVzdWx0LnNob3VsZCA9PSAnJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzZXQiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzIgYSAzNCBkZScgKQorICAgICAgZ3JhbW1hciBTZXRUOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30gCisgICAgICBhOiAoSU5UfElEKSsgLT4gSU5UKyBJRCsgOworICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcyIDM0IGEgZGUnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInNldDIiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzInICkKKyAgICAgIGdyYW1tYXIgU2V0MjsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9IAorICAgICAgYTogKElOVHxJRCkgLT4gSU5UPyBJRD8gOworICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcyJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJzZXQgd2l0aCBsYWJlbCIgZG8KKyAgICB3YXJuKCAndGVzdCBTZXRXaXRoTGFiZWwgb2ZmaWNpYWxseSBicm9rZW4nICkKKyAgICAjcmVzdWx0ID0gcGFyc2UoPDwtJ0VORCcsIDphLCAnMicpCisgICAgIyAgZ3JhbW1hciBTZXRXaXRoTGFiZWw7CisgICAgIyAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30gCisgICAgIyAgYSA6IHg9KElOVHxJRCkgLT4gJHggOworICAgICMgIElOVDogJzAnLi4nOScrOworICAgICMgIElEIDogJ2EnLi4neicrOworICAgICMgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICMKKyAgICAjRU5ECisgICAgI3Jlc3VsdC5zaG91bGQgPT0gJzInCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgInJld3JpdGUgYWN0aW9uIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOnIsICcyNScgKQorICAgICAgZ3JhbW1hciBSZXdyaXRlQWN0aW9uOyAKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICB0b2tlbnMgeyBGTE9BVDsgfQorICAgICAgcgorICAgICAgICAgIDogSU5UIC0+IHsgQU5UTFIzOjpDb21tb25UcmVlLm5ldyggY3JlYXRlX3Rva2VuKCBGTE9BVCwgbmlsLCAiI3skSU5ULnRleHR9LjAiICkgKSB9CisgICAgICAgICAgOyAKKyAgICAgIElOVCA6ICcwJy4uJzknKzsgCisgICAgICBXUzogKCcgJyB8ICdcbicgfCAnXHQnKSsgeyRjaGFubmVsID0gSElEREVOO307CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJzI1LjAnCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgIm9wdGlvbmFsIHN1YnJ1bGUgd2l0aG91dCByZWFsIGVsZW1lbnRzIiBkbworICAgIHJlc3VsdCA9IHBhcnNlKCA8PC0nRU5EJywgOm1vZHVsbywgJ21vZHVsbyBhYmMgKHggeSAjKScgKQorICAgICAgZ3JhbW1hciBPcHRpb25hbFN1YnJ1bGVXaXRob3V0UmVhbEVsZW1lbnRzOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30gCisgICAgICB0b2tlbnMge1BBUk1TO30gCisgICAgICAKKyAgICAgIG1vZHVsbyAKKyAgICAgICA6ICdtb2R1bG8nIElEICgnKCcgcGFybXMrICcpJyk/IC0+IF4oJ21vZHVsbycgSUQgXihQQVJNUyBwYXJtcyspPykgCisgICAgICAgOyAKKyAgICAgIHBhcm1zIDogJyMnfElEOyAKKyAgICAgIElEIDogKCdhJy4uJ3onIHwgJ0EnLi4nWicpKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICByZXN1bHQuc2hvdWxkID09ICcobW9kdWxvIGFiYyAoUEFSTVMgeCB5ICMpKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAid2lsZGNhcmQiIGRvCisgICAgcmVzdWx0ID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYyAzNCcgKQorICAgICAgZ3JhbW1hciBXaWxkY2FyZDsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgYz0uIC0+ICRjOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIHJlc3VsdC5zaG91bGQgPT0gJzM0JworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJleHRyYSB0b2tlbiBpbiBzaW1wbGUgZGVjbCIgZG8KKyAgICByZXN1bHQsIGVycm9ycyA9IHBhcnNlKCA8PC0nRU5EJywgOmRlY2wsICdpbnQgMzQgeD0xOycsIHRydWUgKQorICAgICAgZ3JhbW1hciBFeHRyYVRva2VuSW5TaW1wbGVEZWNsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7RVhQUjt9CisgICAgICBkZWNsIDogdHlwZSBJRCAnPScgSU5UICc7JyAtPiBeKEVYUFIgdHlwZSBJRCBJTlQpIDsKKyAgICAgIHR5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIGVycm9ycy5zaG91bGQgPT0gWyAnbGluZSAxOjQgZXh0cmFuZW91cyBpbnB1dCAiMzQiIGV4cGVjdGluZyBJRCcgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhFWFBSIGludCB4IDEpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJtaXNzaW5nIGlkIGluIHNpbXBsZSBkZWNsIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6ZGVjbCwgJ2ludCA9MTsnLCB0cnVlICkKKyAgICAgIGdyYW1tYXIgTWlzc2luZ0lESW5TaW1wbGVEZWNsOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIHRva2VucyB7RVhQUjt9CisgICAgICBkZWNsIDogdHlwZSBJRCAnPScgSU5UICc7JyAtPiBeKEVYUFIgdHlwZSBJRCBJTlQpIDsKKyAgICAgIHR5cGUgOiAnaW50JyB8ICdmbG9hdCcgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIGVycm9ycy5zaG91bGQgPT0gWyAnbGluZSAxOjQgbWlzc2luZyBJRCBhdCAiPSInIF0KKyAgICByZXN1bHQuc2hvdWxkID09ICcoRVhQUiBpbnQgPG1pc3NpbmcgSUQ+IDEpJworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJtaXNzaW5nIHNldCBpbiBzaW1wbGUgZGVjbCIgZG8KKyAgICByZXN1bHQsIGVycm9ycyA9IHBhcnNlKCA8PC0nRU5EJywgOmRlY2wsICd4PTE7JywgdHJ1ZSApCisgICAgICBncmFtbWFyIE1pc3NpbmdTZXRJblNpbXBsZURlY2w7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgdG9rZW5zIHtFWFBSO30KKyAgICAgIGRlY2wgOiB0eXBlIElEICc9JyBJTlQgJzsnIC0+IF4oRVhQUiB0eXBlIElEIElOVCkgOworICAgICAgdHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICdsaW5lIDE6MCBtaXNtYXRjaGVkIGlucHV0ICJ4IiBleHBlY3Rpbmcgc2V0IG5pbCcgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJyhFWFBSIDxlcnJvcjogeD4geCAxKScKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAibWlzc2luZyB0b2tlbiBnaXZlcyBlcnJvciBub2RlIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYycsIHRydWUgKQorICAgICAgZ3JhbW1hciBNaXNzaW5nVG9rZW5HaXZlc0Vycm9yTm9kZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgSU5UIC0+IElEIElOVCA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgCisgICAgRU5ECisgICAgZXJyb3JzLnNob3VsZCA9PSBbICJsaW5lIDA6LTEgbWlzc2luZyBJTlQgYXQgXCI8RU9GPlwiIiBdCisgICAgcmVzdWx0LnNob3VsZCA9PSAnYWJjIDxtaXNzaW5nIElOVD4nCisgICAgI2VuZAorICBlbmQKKyAgCisgIAorICBleGFtcGxlICJleHRyYSB0b2tlbiBnaXZlcyBlcnJvciBub2RlIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJ2FiYyBpY2sgMzQnLCB0cnVlICkKKyAgICAgIGdyYW1tYXIgRXh0cmFUb2tlbkdpdmVzRXJyb3JOb2RlOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBiIGMgLT4gYiBjOworICAgICAgYiA6IElEIC0+IElEIDsKKyAgICAgIGMgOiBJTlQgLT4gSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICBlcnJvcnMuc2hvdWxkID09IFsgJ2xpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgImljayIgZXhwZWN0aW5nIElOVCcgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJ2FiYyAzNCcKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAibWlzc2luZyBmaXJzdCB0b2tlbiBnaXZlcyBlcnJvciBub2RlIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzM0JywgdHJ1ZSApCisgICAgICBncmFtbWFyIE1pc3NpbmdGaXJzdFRva2VuR2l2ZXNFcnJvck5vZGU7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgYSA6IElEIElOVCAtPiBJRCBJTlQgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIGVycm9ycy5zaG91bGQgPT0gWyAnbGluZSAxOjAgbWlzc2luZyBJRCBhdCAiMzQiJyBdCisgICAgcmVzdWx0LnNob3VsZCA9PSAnPG1pc3NpbmcgSUQ+IDM0JworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJtaXNzaW5nIGZpcnN0IHRva2VuIGdpdmVzIGVycm9yIG5vZGUyIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJzM0JywgdHJ1ZSApCisgICAgICBncmFtbWFyIE1pc3NpbmdGaXJzdFRva2VuR2l2ZXNFcnJvck5vZGUyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBiIGMgLT4gYiBjOworICAgICAgYiA6IElEIC0+IElEIDsKKyAgICAgIGMgOiBJTlQgLT4gSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAKKyAgICBFTkQKKyAgICBlcnJvcnMuc2hvdWxkID09IFsgJ2xpbmUgMTowIG1pc3NpbmcgSUQgYXQgIjM0IicgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJzxtaXNzaW5nIElEPiAzNCcKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAibm8gdmlhYmxlIGFsdCBnaXZlcyBlcnJvciBub2RlIiBkbworICAgIHJlc3VsdCwgZXJyb3JzID0gcGFyc2UoIDw8LSdFTkQnLCA6YSwgJyonLCB0cnVlICkKKyAgICAgIGdyYW1tYXIgTm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZTsKKyAgICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgICBhIDogYiAtPiBiIHwgYyAtPiBjOworICAgICAgYiA6IElEIC0+IElEIDsKKyAgICAgIGMgOiBJTlQgLT4gSU5UIDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIFMgOiAnKicgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIAorICAgIEVORAorICAgIGVycm9ycy5zaG91bGQgPT0gWyAnbGluZSAxOjAgbm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICIqIicgXQorICAgIHJlc3VsdC5zaG91bGQgPT0gJzx1bmV4cGVjdGVkOiAwIFNbIioiXSBAIGxpbmUgMSBjb2wgMCAoMC4uMCksIHJlc3luYyA9ICo+JworICBlbmQKKyAgCisgIAorICBleGFtcGxlICJjYXJkaW5hbGl0eSIgZG8KKyAgICBsYW1iZGEgZG8KKyAgICAgIHBhcnNlKCA8PC0nRU5EJywgOmEsICJhIGIgMyA0IDUiICkKKyAgICAgICAgZ3JhbW1hciBDYXJkaW5hbGl0eTsKKyAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgIGEgOiBJRCBJRCBJTlQgSU5UIElOVCAtPiAoSUQgSU5UKSs7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOyAKKyAgICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICBFTkQKKyAgICBlbmQuc2hvdWxkIHJhaXNlX2Vycm9yKCBBTlRMUjM6OkVycm9yOjpSZXdyaXRlQ2FyZGluYWxpdHlFcnJvciApCisgIGVuZAorICAKKyAgZXhhbXBsZSAiY2FyZGluYWxpdHkyIiBkbworICAgIGxhbWJkYSBkbworICAgICAgcGFyc2UoIDw8LSdFTkQnLCA6YSwgImEgYiIgKQorICAgICAgICBncmFtbWFyIENhcmRpbmFsaXR5MjsKKyAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgIGEgOiBJRCsgLT4gSUQgSUQgSUQgOyAvLyBvbmx5IDIgaW5wdXQgSURzCisgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgIEVORAorICAgIGVuZC5zaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6RXJyb3I6OlJld3JpdGVDYXJkaW5hbGl0eUVycm9yICkKKyAgZW5kCisgIAorICBleGFtcGxlICJjYXJkaW5hbGl0eTMiIGRvCisgICAgbGFtYmRhIGRvCisgICAgICBwYXJzZSggPDwtJ0VORCcsIDphLCAiMyIgKQorICAgICAgICBncmFtbWFyIENhcmRpbmFsaXR5MzsKKyAgICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICAgICAgdG9rZW5zIHtCTE9DSzt9CisgICAgICAgIGEgOiBJRD8gSU5UIC0+IElEIElOVCA7CisgICAgICAgIG9wIDogJysnfCctJyA7CisgICAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgIEVORAorICAgIGVuZC5zaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6RXJyb3I6OlJld3JpdGVFbXB0eVN0cmVhbSApCisgIGVuZAorICAKKyAgZXhhbXBsZSAibG9vcCBjYXJkaW5hbGl0eSIgZG8KKyAgICBsYW1iZGEgZG8KKyAgICAgIHBhcnNlKCA8PC0nRU5EJywgOmEsICIzIiApCisgICAgICAgIGdyYW1tYXIgTG9vcENhcmRpbmFsaXR5OworICAgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgICAgICBhIDogSUQ/IElOVCAtPiBJRCsgSU5UIDsKKyAgICAgICAgb3AgOiAnKyd8Jy0nIDsKKyAgICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgRU5ECisgICAgZW5kLnNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpFcnJvcjo6UmV3cml0ZUVhcmx5RXhpdCApCisgIGVuZAorCisKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9hc3Qtb3V0cHV0L3RyZWUtcmV3cml0ZS5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2FzdC1vdXRwdXQvdHJlZS1yZXdyaXRlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjA0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9hc3Qtb3V0cHV0L3RyZWUtcmV3cml0ZS5yYgpAQCAtMCwwICsxLDE2NjIgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworCitjbGFzcyBUZXN0QVNUUmV3cml0aW5nVHJlZVBhcnNlcnMgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEZsYXRMaXN0OworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCBJTlQ7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisgIAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBGbGF0TGlzdFdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICBvdXRwdXQ9QVNUOworICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICB0b2tlblZvY2FiPUZsYXRMaXN0OworICAgIH0KKyAgICAKKyAgICBhIDogSUQgSU5UIC0+IElOVCBJRDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFNpbXBsZVRyZWU7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFNpbXBsZVRyZWVXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPVNpbXBsZVRyZWU7CisgICAgfQorICAgIGEgOiBeKElEIElOVCkgLT4gXihJTlQgSUQpOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtRU5EICkKKyAgICBncmFtbWFyIENvbWJpbmVkUmV3cml0ZUFuZEF1dG87CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpIHwgSU5UIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LUVORCApCisgICAgdHJlZSBncmFtbWFyIENvbWJpbmVkUmV3cml0ZUFuZEF1dG9UcmVlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1Db21iaW5lZFJld3JpdGVBbmRBdXRvOworICAgIH0KKyAgICBhIDogXihJRCBJTlQpIC0+IF4oSU5UIElEKSB8IElOVDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF2b2lkRHVwOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIEF2b2lkRHVwV2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1Bdm9pZER1cDsKKyAgICB9CisgICAgYSA6IElEIC0+IF4oSUQgSUQpOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgTG9vcDsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEKyBJTlQrIC0+ICheKElEIElOVCkpKyA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgTG9vcFdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9TG9vcDsKKyAgICB9CisgICAgYSA6ICheKElEIElOVCkpKyAtPiBJTlQrIElEKzsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9EdXA7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgQXV0b0R1cFdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9QXV0b0R1cDsKKyAgICB9CisgICAgYSA6IElEOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgQXV0b0R1cFJ1bGU7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCBJTlQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIEF1dG9EdXBSdWxlV2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1BdXRvRHVwUnVsZTsKKyAgICB9CisgICAgYSA6IGIgYyA7CisgICAgYiA6IElEIDsKKyAgICBjIDogSU5UIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9XaWxkY2FyZDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7fQorICAgIGEgOiBJRCBJTlQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIEF1dG9XaWxkY2FyZFdhbGtlcjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPUF1dG9XaWxkY2FyZDt9CisgICAgYSA6IElEIC4gCisgICAgICA7CisgIEVORAorICAKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9XaWxkY2FyZDI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvV2lsZGNhcmQyV2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9QXV0b1dpbGRjYXJkMjt9CisgICAgYSA6IF4oSUQgLikgCisgICAgICA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBBdXRvV2lsZGNhcmRXaXRoTGFiZWw7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvV2lsZGNhcmRXaXRoTGFiZWxXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1BdXRvV2lsZGNhcmRXaXRoTGFiZWw7fQorICAgIGEgOiBJRCBjPS4gCisgICAgICA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBBdXRvV2lsZGNhcmRXaXRoTGlzdExhYmVsOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDt9CisgICAgYSA6IElEIElOVCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisgIAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvV2lsZGNhcmRXaXRoTGlzdExhYmVsV2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9QXV0b1dpbGRjYXJkV2l0aExpc3RMYWJlbDt9CisgICAgYSA6IElEIGMrPS4gCisgICAgICA7CisgIEVORAorICAKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9EdXBNdWx0aXBsZTsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEIElEIElOVDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvRHVwTXVsdGlwbGVXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPUF1dG9EdXBNdWx0aXBsZTsKKyAgICB9CisgICAgYSA6IElEIElEIElOVAorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgQXV0b0R1cFRyZWU7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIEF1dG9EdXBUcmVlV2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1BdXRvRHVwVHJlZTsKKyAgICB9CisgICAgYSA6IF4oSUQgSU5UKQorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgQXV0b0R1cFRyZWVXaXRoTGFiZWxzOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvRHVwVHJlZVdpdGhMYWJlbHNXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPUF1dG9EdXBUcmVlV2l0aExhYmVsczsKKyAgICB9CisgICAgYSA6IF4oeD1JRCB5PUlOVCkKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9EdXBUcmVlV2l0aExpc3RMYWJlbHM7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIEF1dG9EdXBUcmVlV2l0aExpc3RMYWJlbHNXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPUF1dG9EdXBUcmVlV2l0aExpc3RMYWJlbHM7CisgICAgfQorICAgIGEgOiBeKHgrPUlEIHkrPUlOVCkKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290OworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdFdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9QXV0b0R1cFRyZWVXaXRoUnVsZVJvb3Q7CisgICAgfQorICAgIGEgOiBeKGIgSU5UKSA7CisgICAgYiA6IElEIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGFiZWxzOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExhYmVsc1dhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9QXV0b0R1cFRyZWVXaXRoUnVsZVJvb3RBbmRMYWJlbHM7CisgICAgfQorICAgIGEgOiBeKHg9YiBJTlQpIDsKKyAgICBiIDogSUQgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgQXV0b0R1cFRyZWVXaXRoUnVsZVJvb3RBbmRMaXN0TGFiZWxzOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExpc3RMYWJlbHNXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPUF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGlzdExhYmVsczsKKyAgICB9CisgICAgYSA6IF4oeCs9YiB5Kz1jKSA7CisgICAgYiA6IElEIDsKKyAgICBjIDogSU5UIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIEF1dG9EdXBOZXN0ZWRUcmVlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogeD1JRCB5PUlEIElOVCAtPiBeKCR4IF4oJHkgSU5UKSk7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgQXV0b0R1cE5lc3RlZFRyZWVXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPUF1dG9EdXBOZXN0ZWRUcmVlOworICAgIH0KKyAgICBhIDogXihJRCBeKElEIElOVCkpCisgICAgICA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBEZWxldGU7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiBJRCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgRGVsZXRlV2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1EZWxldGU7CisgICAgfQorICAgIGEgOiBJRCAtPiAKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFNldE1hdGNoTm9SZXdyaXRlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBTZXRNYXRjaE5vUmV3cml0ZVdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9U2V0TWF0Y2hOb1Jld3JpdGU7CisgICAgfQorICAgIGEgOiBiIElOVDsKKyAgICBiIDogSUQgfCBJTlQ7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTZXRPcHRpb25hbE1hdGNoTm9SZXdyaXRlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBTZXRPcHRpb25hbE1hdGNoTm9SZXdyaXRlV2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1TZXRPcHRpb25hbE1hdGNoTm9SZXdyaXRlOworICAgIH0KKyAgICBhIDogKElEfElOVCk/IElOVCA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTZXRNYXRjaE5vUmV3cml0ZUxldmVsMjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IHg9SUQgSU5UIC0+IF4oJHggSU5UKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBTZXRNYXRjaE5vUmV3cml0ZUxldmVsMldhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9U2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDI7CisgICAgfQorICAgIGEgOiBeKElEIChJRCB8IElOVCkgKSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTZXRNYXRjaE5vUmV3cml0ZUxldmVsMlJvb3Q7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIGEgOiB4PUlEIElOVCAtPiBeKCR4IElOVCk7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgU2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDJSb290V2Fsa2VyOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1TZXRNYXRjaE5vUmV3cml0ZUxldmVsMlJvb3Q7CisgICAgfQorICAgIGEgOiBeKChJRCB8IElOVCkgSU5UKSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC1FTkQgKQorICAgIGdyYW1tYXIgUmV3cml0ZU1vZGVDb21iaW5lZFJld3JpdGVBbmRBdXRvOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSB8IElOVCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC1FTkQgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlTW9kZUNvbWJpbmVkUmV3cml0ZUFuZEF1dG9UcmVlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1SZXdyaXRlTW9kZUNvbWJpbmVkUmV3cml0ZUFuZEF1dG87CisgICAgICAgIHJld3JpdGU9dHJ1ZTsKKyAgICB9CisgICAgYSA6IF4oSUQgSU5UKSAtPiBeKElEWyJpY2siXSBJTlQpCisgICAgICB8IElOVCAvLyBsZWF2ZXMgaXQgYWxvbmUsIHJldHVybmluZyAkYS5zdGFydAorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZU1vZGVGbGF0VHJlZTsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IElEIElOVCB8IElOVCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgUmV3cml0ZU1vZGVGbGF0VHJlZVdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICBvdXRwdXQ9QVNUOworICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICB0b2tlblZvY2FiPVJld3JpdGVNb2RlRmxhdFRyZWU7CisgICAgICByZXdyaXRlPXRydWU7CisgICAgfQorICAgIHMgOiBJRCBhIDsKKyAgICBhIDogSU5UIC0+IElOVFsiMSJdCisgICAgICA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBSZXdyaXRlTW9kZUNoYWluUnVsZUZsYXRUcmVlOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCBJTlQgLT4gSUQgSU5UIHwgSU5UIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlTW9kZUNoYWluUnVsZUZsYXRUcmVlV2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVJld3JpdGVNb2RlQ2hhaW5SdWxlRmxhdFRyZWU7IHJld3JpdGU9dHJ1ZTt9CisgICAgcyA6IGEgOworICAgIGEgOiBiIDsKKyAgICBiIDogSUQgSU5UIC0+IElOVCBJRAorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWVXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlOyByZXdyaXRlPXRydWU7fQorICAgIHMgOiBhIDsKKyAgICBhIDogYiA7IC8vIGEudHJlZSBtdXN0IGJlY29tZSBiLnRyZWUKKyAgICBiIDogXihJRCBJTlQpIC0+IElOVAorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMldhbGtlcjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1SZXdyaXRlTW9kZUNoYWluUnVsZVRyZWUyOyByZXdyaXRlPXRydWU7fQorICAgIHRva2VucyB7IFg7IH0KKyAgICBzIDogYSogYiA7IC8vIG9ubHkgYiBjb250cmlidXRlcyB0byB0cmVlLCBidXQgaXQncyBhZnRlciBhKjsgcy50cmVlID0gYi50cmVlCisgICAgYSA6IFggOworICAgIGIgOiBeKElEIElOVCkgLT4gSU5UCisgICAgICA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWUzOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiAnYm9vJyBJRCBJTlQgLT4gJ2JvbycgXihJRCBJTlQpIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWUzV2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTM7IHJld3JpdGU9dHJ1ZTt9CisgICAgdG9rZW5zIHsgWDsgfQorICAgIHMgOiAnYm9vJyBhKiBiIDsgLy8gZG9uJ3QgcmVzZXQgcy50cmVlIHRvIGIudHJlZSBkdWUgdG8gJ2JvbycKKyAgICBhIDogWCA7CisgICAgYiA6IF4oSUQgSU5UKSAtPiBJTlQKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTQ7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDt9CisgICAgYSA6ICdib28nIElEIElOVCAtPiBeKCdib28nIF4oSUQgSU5UKSkgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTRXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNDsgcmV3cml0ZT10cnVlO30KKyAgICB0b2tlbnMgeyBYOyB9CisgICAgcyA6IF4oJ2JvbycgYSogYikgOyAvLyBkb24ndCByZXNldCBzLnRyZWUgdG8gYi50cmVlIGR1ZSB0byAnYm9vJworICAgIGEgOiBYIDsKKyAgICBiIDogXihJRCBJTlQpIC0+IElOVAorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNTsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogJ2JvbycgSUQgSU5UIC0+IF4oJ2JvbycgXihJRCBJTlQpKSA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNVdhbGtlcjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1SZXdyaXRlTW9kZUNoYWluUnVsZVRyZWU1OyByZXdyaXRlPXRydWU7fQorICAgIHRva2VucyB7IFg7IH0KKyAgICBzIDogXihhIGIpIDsgLy8gcy50cmVlIGlzIGEudHJlZQorICAgIGEgOiAnYm9vJyA7CisgICAgYiA6IF4oSUQgSU5UKSAtPiBJTlQKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWY7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDt9CisgICAgYSA6IElEIElOVCAtPiBJRCBJTlQgfCBJTlQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWZXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9UmV3cml0ZU9mUnVsZVJlZjsgcmV3cml0ZT10cnVlO30KKyAgICBzIDogYSAtPiBhIDsKKyAgICBhIDogSUQgSU5UIC0+IElEIElOVCA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBSZXdyaXRlT2ZSdWxlUmVmUm9vdDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIElOVCAtPiBeKElOVCBeKElEIElOVCkpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWZSb290V2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVJld3JpdGVPZlJ1bGVSZWZSb290OyByZXdyaXRlPXRydWU7fQorICAgIHMgOiBeKGEgXihJRCBJTlQpKSAtPiBhIDsKKyAgICBhIDogSU5UIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWZSb290TGFiZWxlZDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIElOVCAtPiBeKElOVCBeKElEIElOVCkpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWZSb290TGFiZWxlZFdhbGtlcjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1SZXdyaXRlT2ZSdWxlUmVmUm9vdExhYmVsZWQ7IHJld3JpdGU9dHJ1ZTt9CisgICAgcyA6IF4obGFiZWw9YSBeKElEIElOVCkpIC0+IGEgOworICAgIGEgOiBJTlQgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZU9mUnVsZVJlZlJvb3RMaXN0TGFiZWxlZDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIElOVCAtPiBeKElOVCBeKElEIElOVCkpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWZSb290TGlzdExhYmVsZWRXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9UmV3cml0ZU9mUnVsZVJlZlJvb3RMaXN0TGFiZWxlZDsgcmV3cml0ZT10cnVlO30KKyAgICBzIDogXihsYWJlbCs9YSBeKElEIElOVCkpIC0+IGEgOworICAgIGEgOiBJTlQgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmV3cml0ZU9mUnVsZVJlZkNoaWxkOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBeKElOVCBJTlQpKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlT2ZSdWxlUmVmQ2hpbGRXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9UmV3cml0ZU9mUnVsZVJlZkNoaWxkOyByZXdyaXRlPXRydWU7fQorICAgIHMgOiBeKElEIGEpIC0+IGEgOworICAgIGEgOiBeKElOVCBJTlQpIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJld3JpdGVPZlJ1bGVSZWZMYWJlbDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgXihJTlQgSU5UKSk7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgUmV3cml0ZU9mUnVsZVJlZkxhYmVsV2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVJld3JpdGVPZlJ1bGVSZWZMYWJlbDsgcmV3cml0ZT10cnVlO30KKyAgICBzIDogXihJRCBsYWJlbD1hKSAtPiBhIDsKKyAgICBhIDogXihJTlQgSU5UKSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBSZXdyaXRlT2ZSdWxlUmVmTGlzdExhYmVsOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBeKElOVCBJTlQpKTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlT2ZSdWxlUmVmTGlzdExhYmVsV2Fsa2VyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVJld3JpdGVPZlJ1bGVSZWZMaXN0TGFiZWw7IHJld3JpdGU9dHJ1ZTt9CisgICAgcyA6IF4oSUQgbGFiZWwrPWEpIC0+IGEgOworICAgIGEgOiBeKElOVCBJTlQpIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJld3JpdGVNb2RlV2l0aFByZWRpY2F0ZWRSZXdyaXRlczsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSURbInJvb3QiXSBeKElEIElOVCkpIHwgSU5UIC0+IF4oSURbInJvb3QiXSBJTlQpIDsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlTW9kZVdpdGhQcmVkaWNhdGVkUmV3cml0ZXNXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgb3V0cHV0PUFTVDsKKyAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgdG9rZW5Wb2NhYj1SZXdyaXRlTW9kZVdpdGhQcmVkaWNhdGVkUmV3cml0ZXM7CisgICAgICByZXdyaXRlPXRydWU7CisgICAgfQorICAgIHMgOiBeKElEIGEpIHsKKyAgICAgICMgc2VsZi5idWYgKz0gJHMuc3RhcnQuaW5zcGVjdAorICAgIH07CisgICAgYSA6IF4oSUQgSU5UKSAtPiB7dHJ1ZX0/IF4oSURbImljayJdIElOVCkKKyAgICAgICAgICAgICAgICAgIC0+IElOVAorICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgV2lsZGNhcmRTaW5nbGVOb2RlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSURbInJvb3QiXSBJTlQpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFdpbGRjYXJkU2luZ2xlTm9kZVdhbGtlcjsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICAgIHRva2VuVm9jYWI9V2lsZGNhcmRTaW5nbGVOb2RlOworICAgIH0KKyAgICBzIDogXihJRCBjPS4pIC0+ICRjCisgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgV2lsZGNhcmRVbmxhYmVsZWRTaW5nbGVOb2RlOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFdpbGRjYXJkVW5sYWJlbGVkU2luZ2xlTm9kZVdhbGtlcjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1XaWxkY2FyZFVubGFiZWxlZFNpbmdsZU5vZGU7fQorICAgIHMgOiBeKElEIC4pIC0+IElECisgICAgICA7CisgIEVORAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBXaWxkY2FyZExpc3RMYWJlbDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICBhIDogSU5UIElOVCBJTlQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorICAKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgV2lsZGNhcmRMaXN0TGFiZWxXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9V2lsZGNhcmRMaXN0TGFiZWw7fQorICAgIHMgOiAoYys9LikrIC0+ICRjKworICAgICAgOworICBFTkQKKyAgCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBXaWxkY2FyZExpc3RMYWJlbDI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fQorICAgIGEgIDogeD1JTlQgeT1JTlQgej1JTlQgLT4gXigkeCBeKCR5ICR6KSBeKCR5ICR6KSk7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisgIAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBXaWxkY2FyZExpc3RMYWJlbDJXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9V2lsZGNhcmRMaXN0TGFiZWwyOyByZXdyaXRlPXRydWU7fQorICAgIHMgOiBeKElOVCAoYys9LikrKSAtPiAkYysKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFdpbGRjYXJkR3JhYnNTdWJ0cmVlOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCB4PUlOVCB5PUlOVCB6PUlOVCAtPiBeKElEW1wicm9vdFwiXSBeKCR4ICR5ICR6KSk7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICB0cmVlIGdyYW1tYXIgV2lsZGNhcmRHcmFic1N1YnRyZWVXYWxrZXI7CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9V2lsZGNhcmRHcmFic1N1YnRyZWU7fQorICAgIHMgOiBeKElEIGM9LikgLT4gJGMKKyAgICAgIDsKKyAgRU5ECisgIAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgV2lsZGNhcmRHcmFic1N1YnRyZWUyOworICAgIG9wdGlvbnMge2xhbmd1YWdlPVJ1Ynk7IG91dHB1dD1BU1Q7fQorICAgIGEgOiBJRCB4PUlOVCB5PUlOVCB6PUlOVCAtPiBJRCBeKCR4ICR5ICR6KTsKKyAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKyAgCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgdHJlZSBncmFtbWFyIFdpbGRjYXJkR3JhYnNTdWJ0cmVlMldhbGtlcjsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1XaWxkY2FyZEdyYWJzU3VidHJlZTI7fQorICAgIHMgOiBJRCBjPS4gLT4gJGMKKyAgICAgIDsKKyAgRU5ECisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LUVORCApCisgICAgZ3JhbW1hciBDb21iaW5lZFJld3JpdGVBbmRBdXRvOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgIH0KKyAgICBhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSB8IElOVCA7CisgICAgSUQgOiAnYScuLid6JysgOworICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgIEVORAorICAKKyAgaW5saW5lX2dyYW1tYXIoIDw8LUVORCApCisgICAgdHJlZSBncmFtbWFyIENvbWJpbmVkUmV3cml0ZUFuZEF1dG9XYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPUNvbWJpbmVkUmV3cml0ZUFuZEF1dG87CisgICAgfQorICAgIGEgOiBeKElEIElOVCkgLT4gXihJTlQgSUQpIHwgSU5UOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtRU5EICkKKyAgICBncmFtbWFyIFJld3JpdGVNb2RlQ29tYmluZWRSZXdyaXRlQW5kQXV0bzsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICB9CisgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCkgfCBJTlQgOworICAgIElEIDogJ2EnLi4neicrIDsKKyAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICBFTkQKKyAgCisgIGlubGluZV9ncmFtbWFyKCA8PC1FTkQgKQorICAgIHRyZWUgZ3JhbW1hciBSZXdyaXRlTW9kZUNvbWJpbmVkUmV3cml0ZUFuZEF1dG9XYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgICB0b2tlblZvY2FiPVJld3JpdGVNb2RlQ29tYmluZWRSZXdyaXRlQW5kQXV0bzsKKyAgICAgICAgcmV3cml0ZT10cnVlOworICAgIH0KKyAgICBhIDogXihJRCBJTlQpIC0+IF4oSURbImljayJdIElOVCkKKyAgICAgIHwgSU5UIC8vIGxlYXZlcyBpdCBhbG9uZSwgcmV0dXJuaW5nICRhLnN0YXJ0CisgICAgICA7CisgIEVORAorICAKKyAgZXhhbXBsZSAiZmxhdCBsaXN0IiBkbworICAgIGxleGVyICA9IEZsYXRMaXN0OjpMZXhlci5uZXcoICJhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEZsYXRMaXN0OjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gRmxhdExpc3RXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIjM0IGFiYyIKKyAgZW5kCisKKyAgZXhhbXBsZSAic2ltcGxlIHRyZWUiIGRvCisgICAgbGV4ZXIgID0gU2ltcGxlVHJlZTo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBTaW1wbGVUcmVlOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gU2ltcGxlVHJlZVdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKDM0IGFiYykiCisgIGVuZAorCisgIGV4YW1wbGUgImNvbWJpbmVkIHJld3JpdGUgYW5kIGF1dG8iIGRvCisgICAgbGV4ZXIgID0gQ29tYmluZWRSZXdyaXRlQW5kQXV0bzo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBDb21iaW5lZFJld3JpdGVBbmRBdXRvOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gQ29tYmluZWRSZXdyaXRlQW5kQXV0b1dhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYS50cmVlCisgICAgcmVzdWx0Lmluc3BlY3Quc2hvdWxkID09ICcoMzQgYWJjKScKKyAgICBsZXhlciAgPSBDb21iaW5lZFJld3JpdGVBbmRBdXRvOjpMZXhlci5uZXcoICIzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gQ29tYmluZWRSZXdyaXRlQW5kQXV0bzo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IENvbWJpbmVkUmV3cml0ZUFuZEF1dG9XYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEudHJlZQorICAgIHJlc3VsdC5pbnNwZWN0LnNob3VsZCA9PSAnMzQnCisgIGVuZAorCisgIGV4YW1wbGUgImF2b2lkIGR1cCIgZG8KKyAgICBsZXhlciAgPSBBdm9pZER1cDo6TGV4ZXIubmV3KCAiYWJjIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdm9pZER1cDo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEF2b2lkRHVwV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5hCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoYWJjIGFiYykiCisgIGVuZAorICAKKyAgZXhhbXBsZSAibG9vcCIgZG8KKyAgICBsZXhlciAgPSBMb29wOjpMZXhlci5uZXcoICJhIGIgYyAzIDQgNSIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gTG9vcDo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IExvb3BXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIjMgNCA1IGEgYiBjIgorICBlbmQKKyAgCisgIGV4YW1wbGUgImF1dG8gZHVwIiBkbworICAgIGxleGVyICA9IEF1dG9EdXA6OkxleGVyLm5ldyggImFiYyIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gQXV0b0R1cDo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEF1dG9EdXBXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gImFiYyIKKyAgZW5kCisKKyAgZXhhbXBsZSAiYXV0byBkdXAgcnVsZSIgZG8KKyAgICBsZXhlciAgPSBBdXRvRHVwUnVsZTo6TGV4ZXIubmV3KCAiYSAxIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvRHVwUnVsZTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEF1dG9EdXBSdWxlV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5hCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICJhIDEiCisgIGVuZAorCisgIGV4YW1wbGUgImF1dG8gd2lsZGNhcmQiIGRvCisgICAgbGV4ZXIgID0gQXV0b1dpbGRjYXJkOjpMZXhlci5uZXcoICJhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEF1dG9XaWxkY2FyZDo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEF1dG9XaWxkY2FyZFdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiYWJjIDM0IgorICBlbmQKKworICBleGFtcGxlICJhdXRvIHdpbGRjYXJkMiIgZG8KKyAgICBsZXhlciAgPSBBdXRvV2lsZGNhcmQyOjpMZXhlci5uZXcoICJhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEF1dG9XaWxkY2FyZDI6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBdXRvV2lsZGNhcmQyV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5hCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoYWJjIDM0KSIKKyAgZW5kCisKKyAgZXhhbXBsZSAiYXV0byB3aWxkY2FyZCB3aXRoIGxhYmVsIiBkbworICAgIGxleGVyICA9IEF1dG9XaWxkY2FyZFdpdGhMYWJlbDo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvV2lsZGNhcmRXaXRoTGFiZWw6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBdXRvV2lsZGNhcmRXaXRoTGFiZWxXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gImFiYyAzNCIKKyAgZW5kCisKKyAgZXhhbXBsZSAiYXV0byB3aWxkY2FyZCB3aXRoIGxpc3QgbGFiZWwiIGRvCisgICAgbGV4ZXIgID0gQXV0b1dpbGRjYXJkV2l0aExpc3RMYWJlbDo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvV2lsZGNhcmRXaXRoTGlzdExhYmVsOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gQXV0b1dpbGRjYXJkV2l0aExpc3RMYWJlbFdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiYWJjIDM0IgorICBlbmQKKworICBleGFtcGxlICJhdXRvIGR1cCBtdWx0aXBsZSIgZG8KKyAgICBsZXhlciAgPSBBdXRvRHVwTXVsdGlwbGU6OkxleGVyLm5ldyggImEgYiAzIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvRHVwTXVsdGlwbGU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBdXRvRHVwTXVsdGlwbGVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gImEgYiAzIgorICBlbmQKKworICBleGFtcGxlICJhdXRvIGR1cCB0cmVlIiBkbworICAgIGxleGVyICA9IEF1dG9EdXBUcmVlOjpMZXhlci5uZXcoICJhIDMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEF1dG9EdXBUcmVlOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gQXV0b0R1cFRyZWVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIihhIDMpIgorICBlbmQKKworICBleGFtcGxlICJhdXRvIGR1cCB0cmVlIHdpdGggbGFiZWxzIiBkbworICAgIGxleGVyICA9IEF1dG9EdXBUcmVlV2l0aExhYmVsczo6TGV4ZXIubmV3KCAiYSAzIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvRHVwVHJlZVdpdGhMYWJlbHM6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBdXRvRHVwVHJlZVdpdGhMYWJlbHNXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIihhIDMpIgorICBlbmQKKworICBleGFtcGxlICJhdXRvIGR1cCB0cmVlIHdpdGggbGlzdCBsYWJlbHMiIGRvCisgICAgbGV4ZXIgID0gQXV0b0R1cFRyZWVXaXRoTGlzdExhYmVsczo6TGV4ZXIubmV3KCAiYSAzIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvRHVwVHJlZVdpdGhMaXN0TGFiZWxzOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gQXV0b0R1cFRyZWVXaXRoTGlzdExhYmVsc1dhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKGEgMykiCisgIGVuZAorCisgIGV4YW1wbGUgImF1dG8gZHVwIHRyZWUgd2l0aCBydWxlIHJvb3QiIGRvCisgICAgbGV4ZXIgID0gQXV0b0R1cFRyZWVXaXRoUnVsZVJvb3Q6OkxleGVyLm5ldyggImEgMyIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gQXV0b0R1cFRyZWVXaXRoUnVsZVJvb3Q6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdFdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKGEgMykiCisgIGVuZAorCisgIGV4YW1wbGUgImF1dG8gZHVwIHRyZWUgd2l0aCBydWxlIHJvb3QgYW5kIGxhYmVscyIgZG8KKyAgICBsZXhlciAgPSBBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExhYmVsczo6TGV4ZXIubmV3KCAiYSAzIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExhYmVsczo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGFiZWxzV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5hCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoYSAzKSIKKyAgZW5kCisKKyAgZXhhbXBsZSAiYXV0byBkdXAgdHJlZSB3aXRoIHJ1bGUgcm9vdCBhbmQgbGlzdCBsYWJlbHMiIGRvCisgICAgbGV4ZXIgID0gQXV0b0R1cFRyZWVXaXRoUnVsZVJvb3RBbmRMaXN0TGFiZWxzOjpMZXhlci5uZXcoICJhIDMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGlzdExhYmVsczo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEF1dG9EdXBUcmVlV2l0aFJ1bGVSb290QW5kTGlzdExhYmVsc1dhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKGEgMykiCisgIGVuZAorCisgIGV4YW1wbGUgImF1dG8gZHVwIG5lc3RlZCB0cmVlIiBkbworICAgIGxleGVyICA9IEF1dG9EdXBOZXN0ZWRUcmVlOjpMZXhlci5uZXcoICJhIGIgMyIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gQXV0b0R1cE5lc3RlZFRyZWU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBdXRvRHVwTmVzdGVkVHJlZVdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKGEgKGIgMykpIgorICBlbmQKKworICBleGFtcGxlICJkZWxldGUiIGRvCisgICAgbGV4ZXIgID0gRGVsZXRlOjpMZXhlci5uZXcoICJhYmMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IERlbGV0ZTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IERlbGV0ZVdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIuYQorICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiIgorICBlbmQKKworICBleGFtcGxlICJzZXQgbWF0Y2ggbm8gcmV3cml0ZSIgZG8KKyAgICBsZXhlciAgPSBTZXRNYXRjaE5vUmV3cml0ZTo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBTZXRNYXRjaE5vUmV3cml0ZTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFNldE1hdGNoTm9SZXdyaXRlV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5hCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICJhYmMgMzQiCisgIGVuZAorCisgIGV4YW1wbGUgInNldCBvcHRpb25hbCBtYXRjaCBubyByZXdyaXRlIiBkbworICAgIGxleGVyICA9IFNldE9wdGlvbmFsTWF0Y2hOb1Jld3JpdGU6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gU2V0T3B0aW9uYWxNYXRjaE5vUmV3cml0ZTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFNldE9wdGlvbmFsTWF0Y2hOb1Jld3JpdGVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gImFiYyAzNCIKKyAgZW5kCisKKyAgZXhhbXBsZSAic2V0IG1hdGNoIG5vIHJld3JpdGUgbGV2ZWwyIiBkbworICAgIGxleGVyICA9IFNldE1hdGNoTm9SZXdyaXRlTGV2ZWwyOjpMZXhlci5uZXcoICJhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFNldE1hdGNoTm9SZXdyaXRlTGV2ZWwyOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gU2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDJXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIihhYmMgMzQpIgorICBlbmQKKworICBleGFtcGxlICJzZXQgbWF0Y2ggbm8gcmV3cml0ZSBsZXZlbDIgcm9vdCIgZG8KKyAgICBsZXhlciAgPSBTZXRNYXRjaE5vUmV3cml0ZUxldmVsMlJvb3Q6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gU2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDJSb290OjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gU2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDJSb290V2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5hCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoYWJjIDM0KSIKKyAgZW5kCisKKyAgZXhhbXBsZSAicmV3cml0ZSBtb2RlIGNvbWJpbmVkIHJld3JpdGUgYW5kIGF1dG8iIGRvCisgICAgCisgICAgcGFyc2VyX3Rlc3QgPSBwcm9jIGRvIHxpbnB1dCwgZXhwZWN0ZWRfb3V0cHV0fAorICAgICAgbGV4ZXIgPSBSZXdyaXRlTW9kZUNvbWJpbmVkUmV3cml0ZUFuZEF1dG86OkxleGVyLm5ldyggaW5wdXQgKQorICAgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICAgIHBhcnNlciA9IFJld3JpdGVNb2RlQ29tYmluZWRSZXdyaXRlQW5kQXV0bzo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgICAgd2Fsa2VyID0gUmV3cml0ZU1vZGVDb21iaW5lZFJld3JpdGVBbmRBdXRvV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgICAgcmVzdWx0ID0gd2Fsa2VyLmEKKyAgICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgICAgc3RyZWUuc2hvdWxkID09IGV4cGVjdGVkX291dHB1dAorICAgIGVuZAorICAgIAorICAgIHBhcnNlcl90ZXN0WyAnYWJjIDM0JywgJyhpY2sgMzQpJyBdCisgICAgcGFyc2VyX3Rlc3RbICczNCcsICczNCcgXQorICBlbmQKKyAgCisgIGV4YW1wbGUgInJld3JpdGUgbW9kZSBmbGF0IHRyZWUiIGRvCisgICAgbGV4ZXIgID0gUmV3cml0ZU1vZGVGbGF0VHJlZTo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBSZXdyaXRlTW9kZUZsYXRUcmVlOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gUmV3cml0ZU1vZGVGbGF0VHJlZVdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiYWJjIDEiCisgIGVuZAorICAKKyAgZXhhbXBsZSAicmV3cml0ZSBtb2RlIGNoYWluIHJ1bGUgZmxhdCB0cmVlIiBkbworICAgIGxleGVyICA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlRmxhdFRyZWU6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVGbGF0VHJlZTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlRmxhdFRyZWVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIjM0IGFiYyIKKyAgZW5kCisKKyAgZXhhbXBsZSAicmV3cml0ZSBtb2RlIGNoYWluIHJ1bGUgdHJlZSIgZG8KKyAgICBsZXhlciAgPSBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWU6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5zCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIzNCIKKyAgZW5kCisKKyAgZXhhbXBsZSAicmV3cml0ZSBtb2RlIGNoYWluIHJ1bGUgdHJlZTIiIGRvCisgICAgbGV4ZXIgID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMjo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWUyOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMldhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiMzQiCisgIGVuZAorCisgIGV4YW1wbGUgInJld3JpdGUgbW9kZSBjaGFpbiBydWxlIHRyZWUzIiBkbworICAgIGxleGVyICA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTM6OkxleGVyLm5ldyggImJvbyBhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTM6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWUzV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5zCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICJib28gMzQiCisgIGVuZAorCisgIGV4YW1wbGUgInJld3JpdGUgbW9kZSBjaGFpbiBydWxlIHRyZWU0IiBkbworICAgIGxleGVyICA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTQ6OkxleGVyLm5ldyggImJvbyBhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTQ6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBSZXdyaXRlTW9kZUNoYWluUnVsZVRyZWU0V2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5zCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoYm9vIDM0KSIKKyAgZW5kCisKKyAgZXhhbXBsZSAicmV3cml0ZSBtb2RlIGNoYWluIHJ1bGUgdHJlZTUiIGRvCisgICAgbGV4ZXIgID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNTo6TGV4ZXIubmV3KCAiYm9vIGFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gUmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIihib28gMzQpIgorICBlbmQKKworICBleGFtcGxlICJyZXdyaXRlIG9mIHJ1bGUgcmVmIiBkbworICAgIGxleGVyICA9IFJld3JpdGVPZlJ1bGVSZWY6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gUmV3cml0ZU9mUnVsZVJlZjo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFJld3JpdGVPZlJ1bGVSZWZXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gImFiYyAzNCIKKyAgZW5kCisKKyAgZXhhbXBsZSAicmV3cml0ZSBvZiBydWxlIHJlZiByb290IiBkbworICAgIGxleGVyICA9IFJld3JpdGVPZlJ1bGVSZWZSb290OjpMZXhlci5uZXcoICJhYmMgMTIgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFJld3JpdGVPZlJ1bGVSZWZSb290OjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gUmV3cml0ZU9mUnVsZVJlZlJvb3RXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIigxMiAoYWJjIDM0KSkiCisgIGVuZAorCisgIGV4YW1wbGUgInJld3JpdGUgb2YgcnVsZSByZWYgcm9vdCBsYWJlbGVkIiBkbworICAgIGxleGVyICA9IFJld3JpdGVPZlJ1bGVSZWZSb290TGFiZWxlZDo6TGV4ZXIubmV3KCAiYWJjIDEyIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBSZXdyaXRlT2ZSdWxlUmVmUm9vdExhYmVsZWQ6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBSZXdyaXRlT2ZSdWxlUmVmUm9vdExhYmVsZWRXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIigxMiAoYWJjIDM0KSkiCisgIGVuZAorCisgIGV4YW1wbGUgInJld3JpdGUgb2YgcnVsZSByZWYgcm9vdCBsaXN0IGxhYmVsZWQiIGRvCisgICAgbGV4ZXIgID0gUmV3cml0ZU9mUnVsZVJlZlJvb3RMaXN0TGFiZWxlZDo6TGV4ZXIubmV3KCAiYWJjIDEyIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBSZXdyaXRlT2ZSdWxlUmVmUm9vdExpc3RMYWJlbGVkOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gUmV3cml0ZU9mUnVsZVJlZlJvb3RMaXN0TGFiZWxlZFdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKDEyIChhYmMgMzQpKSIKKyAgZW5kCisKKyAgZXhhbXBsZSAicmV3cml0ZSBvZiBydWxlIHJlZiBjaGlsZCIgZG8KKyAgICBsZXhlciAgPSBSZXdyaXRlT2ZSdWxlUmVmQ2hpbGQ6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gUmV3cml0ZU9mUnVsZVJlZkNoaWxkOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gUmV3cml0ZU9mUnVsZVJlZkNoaWxkV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5zCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoMzQgMzQpIgorICBlbmQKKworICBleGFtcGxlICJyZXdyaXRlIG9mIHJ1bGUgcmVmIGxhYmVsIiBkbworICAgIGxleGVyICA9IFJld3JpdGVPZlJ1bGVSZWZMYWJlbDo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBSZXdyaXRlT2ZSdWxlUmVmTGFiZWw6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBSZXdyaXRlT2ZSdWxlUmVmTGFiZWxXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIigzNCAzNCkiCisgIGVuZAorCisgIGV4YW1wbGUgInJld3JpdGUgb2YgcnVsZSByZWYgbGlzdCBsYWJlbCIgZG8KKyAgICBsZXhlciAgPSBSZXdyaXRlT2ZSdWxlUmVmTGlzdExhYmVsOjpMZXhlci5uZXcoICJhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFJld3JpdGVPZlJ1bGVSZWZMaXN0TGFiZWw6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBSZXdyaXRlT2ZSdWxlUmVmTGlzdExhYmVsV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5zCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICIoMzQgMzQpIgorICBlbmQKKyAgCisgIGV4YW1wbGUgInJld3JpdGUgbW9kZSB3aXRoIHByZWRpY2F0ZWQgcmV3cml0ZXMiIGRvCisgICAgbGV4ZXIgID0gUmV3cml0ZU1vZGVXaXRoUHJlZGljYXRlZFJld3JpdGVzOjpMZXhlci5uZXcoICJhYmMgMzQiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFJld3JpdGVNb2RlV2l0aFByZWRpY2F0ZWRSZXdyaXRlczo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFJld3JpdGVNb2RlV2l0aFByZWRpY2F0ZWRSZXdyaXRlc1dhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKHJvb3QgKGljayAzNCkpIgorICBlbmQKKyAgCisgIGV4YW1wbGUgIndpbGRjYXJkIHNpbmdsZSBub2RlIiBkbworICAgIGxleGVyICA9IFdpbGRjYXJkU2luZ2xlTm9kZTo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBXaWxkY2FyZFNpbmdsZU5vZGU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBXaWxkY2FyZFNpbmdsZU5vZGVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIjM0IgorICBlbmQKKyAgCisgIGV4YW1wbGUgIndpbGRjYXJkIHVubGFiZWxlZCBzaW5nbGUgbm9kZSIgZG8KKyAgICBsZXhlciAgPSBXaWxkY2FyZFVubGFiZWxlZFNpbmdsZU5vZGU6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gV2lsZGNhcmRVbmxhYmVsZWRTaW5nbGVOb2RlOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gV2lsZGNhcmRVbmxhYmVsZWRTaW5nbGVOb2RlV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHJlc3VsdCA9IHdhbGtlci5zCisgICAgc3RyZWUgPSByZXN1bHQudHJlZS5uaWw/ID8gJycgOiByZXN1bHQudHJlZS5pbnNwZWN0CisgICAgc3RyZWUuc2hvdWxkID09ICJhYmMiCisgIGVuZAorCisgIGV4YW1wbGUgIndpbGRjYXJkIGdyYWJzIHN1YnRyZWUiIGRvCisgICAgbGV4ZXIgID0gV2lsZGNhcmRHcmFic1N1YnRyZWU6OkxleGVyLm5ldyggImFiYyAxIDIgMyIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gV2lsZGNhcmRHcmFic1N1YnRyZWU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBXaWxkY2FyZEdyYWJzU3VidHJlZVdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKDEgMiAzKSIKKyAgZW5kCisKKyAgZXhhbXBsZSAid2lsZGNhcmQgZ3JhYnMgc3VidHJlZTIiIGRvCisgICAgbGV4ZXIgID0gV2lsZGNhcmRHcmFic1N1YnRyZWUyOjpMZXhlci5uZXcoICJhYmMgMSAyIDMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFdpbGRjYXJkR3JhYnNTdWJ0cmVlMjo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFdpbGRjYXJkR3JhYnNTdWJ0cmVlMldhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKDEgMiAzKSIKKyAgZW5kCisKKyAgZXhhbXBsZSAid2lsZGNhcmQgbGlzdCBsYWJlbCIgZG8KKyAgICBsZXhlciAgPSBXaWxkY2FyZExpc3RMYWJlbDo6TGV4ZXIubmV3KCAiMSAyIDMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFdpbGRjYXJkTGlzdExhYmVsOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gV2lsZGNhcmRMaXN0TGFiZWxXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgcmVzdWx0ID0gd2Fsa2VyLnMKKyAgICBzdHJlZSA9IHJlc3VsdC50cmVlLm5pbD8gPyAnJyA6IHJlc3VsdC50cmVlLmluc3BlY3QKKyAgICBzdHJlZS5zaG91bGQgPT0gIjEgMiAzIgorICBlbmQKKyAgCisgIGV4YW1wbGUgIndpbGRjYXJkIGxpc3QgbGFiZWwyIiBkbworICAgIGxleGVyICA9IFdpbGRjYXJkTGlzdExhYmVsMjo6TGV4ZXIubmV3KCAiMSAyIDMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IFdpbGRjYXJkTGlzdExhYmVsMjo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFdpbGRjYXJkTGlzdExhYmVsMldhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICByZXN1bHQgPSB3YWxrZXIucworICAgIHN0cmVlID0gcmVzdWx0LnRyZWUubmlsPyA/ICcnIDogcmVzdWx0LnRyZWUuaW5zcGVjdAorICAgIHN0cmVlLnNob3VsZCA9PSAiKDIgMykgKDIgMykiCisgIGVuZAorICAKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvZGVidWdnaW5nL2RlYnVnLW1vZGUucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9kZWJ1Z2dpbmcvZGVidWctbW9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGI5ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvZGVidWdnaW5nL2RlYnVnLW1vZGUucmIKQEAgLTAsMCArMSw2ODggQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzJworcmVxdWlyZSAnZmlsZXV0aWxzJworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKyNyZXF1aXJlICdhbnRscjMvdGVzdC9kaWZmJworCitjbGFzcyBBTlRMUkRlYnVnZ2VyIDwgVGhyZWFkCisgIHNlbGYuYWJvcnRfb25fZXhjZXB0aW9uID0gdHJ1ZQorICBhdHRyX2FjY2Vzc29yIDpldmVudHMsIDpzdWNjZXNzLCA6cG9ydAorICBpbmNsdWRlIFRpbWVvdXQKKyAgCisgIGRlZiBpbml0aWFsaXplKCBwb3J0ICkKKyAgICBAZXZlbnRzID0gW10KKyAgICBAc3VjY2VzcyA9IGZhbHNlCisgICAgQHBvcnQgPSBwb3J0CisgICAgCisgICAgc3VwZXIgZG8KKyAgICAgIHRpbWVvdXQoIDIgKSBkbworICAgICAgICBiZWdpbgorICAgICAgICAgIEBzb2NrZXQgPSBUQ1BTb2NrZXQub3BlbiggJ2xvY2FsaG9zdCcsIEBwb3J0ICkKKyAgICAgICAgICAjU29ja2V0Lm5ldyhTb2NrZXQ6OkFGX0lORVQsIFNvY2tldDo6U09DS19TVFJFQU0sIDApCisgICAgICAgICAgI0Bzb2NrZXQuY29ubmVjdCggU29ja2V0LnBhY2tfc29ja2FkZHJfaW4oQHBvcnQsICcxMjcuMC4wLjEnKSApCisgICAgICAgIHJlc2N1ZSBFcnJubzo6RUNPTk5SRUZVU0VEID0+IGVycm9yCisgICAgICAgICAgaWYgJFZFUkJPU0UKKyAgICAgICAgICAgICRzdGRlcnIucHJpbnRmKCAKKyAgICAgICAgICAgICAgICAiJXM6JXMgcmVjZWl2ZWQgY29ubmVjdGlvbiByZWZ1c2UgZXJyb3I6ICVwXG4iLAorICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgZXJyb3IKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgJHN0ZGVyci5wdXRzKCAic2xlZXBpbmcgZm9yIDAuMSBzZWNvbmRzIGJlZm9yZSByZXRyeWluZyIgKQorICAgICAgICAgIGVuZAorICAgICAgICAgIHNsZWVwKCAwLjAxICkKKyAgICAgICAgICByZXRyeQorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgCisgICAgICBAc29ja2V0LnJlYWRsaW5lLnN0cmlwLnNob3VsZCA9PSAnQU5UTFIgMicKKyAgICAgIEBzb2NrZXQucmVhZGxpbmUuc3RyaXAuc3RhcnRfd2l0aD8oICdncmFtbWFyICInICkuc2hvdWxkID09IHRydWUKKyAgICAgIGFjaworICAgICAgbG9vcCBkbworICAgICAgICBldmVudCA9IEBzb2NrZXQucmVhZGxpbmUuc3RyaXAKKyAgICAgICAgQGV2ZW50cyA8PCBldmVudC5zcGxpdCggIlx0IiApCisgICAgICAgIGFjaworICAgICAgICBicmVhayBpZiBldmVudCA9PSAndGVybWluYXRlJworICAgICAgZW5kCisgICAgICAKKyAgICAgIEBzb2NrZXQuY2xvc2UKKyAgICAgIEBzdWNjZXNzID0gdHJ1ZQorICAgIGVuZAorICAgIAorICBlbmQKKyAgCisgIGRlZiBhY2sKKyAgICBAc29ja2V0LndyaXRlKCAiQUNLXG4iICkKKyAgICBAc29ja2V0LmZsdXNoCisgIGVuZAorCitlbmQgIyBBTlRMUkRlYnVnZ2VyCisKK2NsYXNzIFRlc3REZWJ1Z0dyYW1tYXJzIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGNvbXBpbGVfb3B0aW9ucyA6ZGVidWcgPT4gdHJ1ZQorICAKKyAgI2luY2x1ZGUgQU5UTFIzOjpUZXN0OjpEaWZmCisgIAorICBkZWYgcGFyc2UoIGdyYW1tYXIsIHJ1bGUsIGlucHV0LCBvcHRpb25zID0ge30gKQorICAgIEBncmFtbWFyID0gaW5saW5lX2dyYW1tYXIoIGdyYW1tYXIgKQorICAgIEBncmFtbWFyLmNvbXBpbGUoIHNlbGYuY2xhc3MuY29tcGlsZV9vcHRpb25zICkKKyAgICBAZ3JhbW1hcl9wYXRoID0gRmlsZS5leHBhbmRfcGF0aCggQGdyYW1tYXIucGF0aCApCisgICAgZm9yIG91dHB1dF9maWxlIGluIEBncmFtbWFyLnRhcmdldF9maWxlcworICAgICAgc2VsZi5jbGFzcy5pbXBvcnQoIG91dHB1dF9maWxlICkKKyAgICBlbmQKKyAgICBncmFtbWFyX21vZHVsZSA9IHNlbGYuY2xhc3MuY29uc3RfZ2V0KCBAZ3JhbW1hci5uYW1lICkKKyAgICBsaXN0ZW5lciA9IG9wdGlvbnNbIDpsaXN0ZW5lciBdIG9yIGRlYnVnZ2VyID0gQU5UTFJEZWJ1Z2dlci5uZXcoIHBvcnQgPSA0OTEwMCApCisgICAgCisgICAgYmVnaW4KKyAgICAgIGxleGVyID0gZ3JhbW1hcl9tb2R1bGU6OkxleGVyLm5ldyggaW5wdXQgKQorICAgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICAgIG9wdGlvbnNbIDpkZWJ1Z19saXN0ZW5lciBdID0gbGlzdGVuZXIKKyAgICAgIHBhcnNlciA9IGdyYW1tYXJfbW9kdWxlOjpQYXJzZXIubmV3KCB0b2tlbnMsIG9wdGlvbnMgKQorICAgICAgcGFyc2VyLnNlbmQoIHJ1bGUgKQorICAgIGVuc3VyZQorICAgICAgaWYgbGlzdGVuZXIubmlsPworICAgICAgICBkZWJ1Z2dlci5qb2luCisgICAgICAgIHJldHVybiggZGVidWdnZXIgKQorICAgICAgZW5kCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnYmFzaWMgZGVidWctbW9kZSBwYXJzZXIgdXNpbmcgYSBSZWNvcmRFdmVudExpc3RlbmVyJyBkbworICAgIGdyYW1tYXIgPSAlcTwKKyAgICAgIGdyYW1tYXIgQmFzaWNQYXJzZXI7ICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgMQorICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTt9ICAgICAgICAgICAgICAgICAgLy8gbGluZSAyCisgICAgICBhIDogSUQgRU9GOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIDMKKyAgICAgIElEIDogJ2EnLi4neicrIDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgNAorICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgPgorICAgIGxpc3RlbmVyID0gQU5UTFIzOjpEZWJ1Zzo6UmVjb3JkRXZlbnRMaXN0ZW5lci5uZXcKKyAgICBwYXJzZSggZ3JhbW1hciwgOmEsICdhJywgOmxpc3RlbmVyID0+IGxpc3RlbmVyICkKKyAgICBsdF9ldmVudHMsIGZvdW5kID0gbGlzdGVuZXIuZXZlbnRzLnBhcnRpdGlvbiB7IHxldmVudHwgZXZlbnQuc3RhcnRfd2l0aD8oICIobG9vayk6ICIgKSB9CisgICAgbHRfZXZlbnRzLnNob3VsZF9ub3QgYmVfZW1wdHkKKyAgICAKKyAgICBleHBlY3RlZCA9IFsgIihlbnRlcl9ydWxlKTogcnVsZT1hIiwKKyAgICAgICAgICAgICAgICAiKGxvY2F0aW9uKTogbGluZT0zIHBvc2l0aW9uPTEiLAorICAgICAgICAgICAgICAgICIoZW50ZXJfYWx0ZXJuYXRpdmUpOiBudW1iZXI9MSIsCisgICAgICAgICAgICAgICAgIihsb2NhdGlvbik6IGxpbmU9MyBwb3NpdGlvbj01IiwKKyAgICAgICAgICAgICAgICAiKGxvY2F0aW9uKTogbGluZT0zIHBvc2l0aW9uPTgiLAorICAgICAgICAgICAgICAgICIobG9jYXRpb24pOiBsaW5lPTMgcG9zaXRpb249MTEiLAorICAgICAgICAgICAgICAgICIoZXhpdF9ydWxlKTogcnVsZT1hIiBdCisgICAgZm91bmQuc2hvdWxkID09IGV4cGVjdGVkCisgIGVuZAorICAKKyAgZXhhbXBsZSAnZGVidWctbW9kZSBwYXJzZXIgdXNpbmcgYSBzb2NrZXQgcHJveHkgdG8gdHJhbnNtaXQgZXZlbnRzJyBkbworICAgIGdyYW1tYXIgPSAlcTwKKyAgICAgIGdyYW1tYXIgU29ja2V0UHJveHk7ICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgMQorICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTt9ICAgICAgICAgICAgICAgLy8gbGluZSAyCisgICAgICBhIDogSUQgRU9GOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgMworICAgICAgSUQgOiAnYScuLid6JysgOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSA0CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICdhJyApCisgICAgZGVidWdnZXIuc3VjY2Vzcy5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdGVkID0gWyAKKyAgICAgIFsgJ2VudGVyX3J1bGUnLCBAZ3JhbW1hcl9wYXRoLCAnYScgXSwKKyAgICAgIFsgJ2xvY2F0aW9uJywgJzMnLCAnMScgXSwKKyAgICAgIFsgJ2VudGVyX2FsdGVybmF0aXZlJywgJzEnIF0sCisgICAgICBbICdsb2NhdGlvbicsICczJywgJzUnIF0sCisgICAgICBbICdsb29rJywgJzEnLCAnMCcsICc0JywgJ2RlZmF1bHQnLCAnMScsICcwJywgJyJhIicgXSwKKyAgICAgIFsgJ2xvb2snLCAnMScsICcwJywgJzQnLCAnZGVmYXVsdCcsICcxJywgJzAnLCAnImEiJyBdLAorICAgICAgWyAnY29uc3VtZV90b2tlbicsICcwJywgJzQnLCAnZGVmYXVsdCcsICcxJywgJzAnLCAnImEiJyBdLAorICAgICAgWyAnbG9jYXRpb24nLCAnMycsICc4JyBdLAorICAgICAgWyAnbG9vaycsICcxJywgJy0xJywgJy0xJywgJ2RlZmF1bHQnLCAnMCcsICctMScsICduaWwnIF0sCisgICAgICBbICdsb29rJywgJzEnLCAnLTEnLCAnLTEnLCAnZGVmYXVsdCcsICcwJywgJy0xJywgJ25pbCcgXSwKKyAgICAgIFsgJ2NvbnN1bWVfdG9rZW4nLCAnLTEnLCAnLTEnLCAnZGVmYXVsdCcsICcwJywgJy0xJywgJ25pbCcgXSwKKyAgICAgIFsgJ2xvY2F0aW9uJywgJzMnLCAnMTEnIF0sCisgICAgICBbICdleGl0X3J1bGUnLCBAZ3JhbW1hcl9wYXRoLCAnYScgXSwKKyAgICAgIFsgJ3Rlcm1pbmF0ZScgXQorICAgIF0KKyAgICAKKyAgICBkZWJ1Z2dlci5ldmVudHMuc2hvdWxkID09IGV4cGVjdGVkCisgIGVuZAorICAKKyAgZXhhbXBsZSAnZGVidWctbW9kZSBwYXJzZXIgZXZlbnRzIHRyaWdnZXJlZCBieSByZWNvZ25pdGlvbiBlcnJvcnMnIGRvCisgICAgZ3JhbW1hciA9ICVxPAorICAgICAgZ3JhbW1hciBSZWNvZ25pdGlvbkVycm9yOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGEgOiBJRCBFT0Y7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICJhIGIiICkKKyAgICBkZWJ1Z2dlci5zdWNjZXNzLnNob3VsZCBiZV90cnVlCisgICAgCisgICAgZXhwZWN0ZWQgPSBbIAorICAgICAgWyAiZW50ZXJfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiNSIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJjb25zdW1lX2hpZGRlbl90b2tlbiIsICIxIiwgIjUiLCAiaGlkZGVuIiwgIjEiLCAiMSIsICciICInIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjgiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMiIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIyIiwgIlwiYlwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjIiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMiIsICJcImJcIiIgXSwKKyAgICAgIFsgImxvb2siLCAiMiIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjIiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMiIsICJcImJcIiIgXSwKKyAgICAgIFsgImJlZ2luX3Jlc3luYyIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMiIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIyIiwgIlwiYlwiIiBdLAorICAgICAgWyAiZW5kX3Jlc3luYyIgXSwKKyAgICAgIFsgInJlY29nbml0aW9uX2V4Y2VwdGlvbiIsICJBTlRMUjM6OkVycm9yOjpVbndhbnRlZFRva2VuIiwgIjIiLCAiMSIsICIyIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxMSIgXSwKKyAgICAgIFsgImV4aXRfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAidGVybWluYXRlIiBdCisgICAgXQorICAgIGRlYnVnZ2VyLmV2ZW50cy5zaG91bGQgPT0gZXhwZWN0ZWQKKyAgZW5kCisgIAorICBleGFtcGxlICdkZWJ1Zy1tb2RlIHBhcnNlciBldmVudHMgdHJpZ2dlcmVkIGJ5IHNlbWFudGljIHByZWRpY2F0ZSBldmFsdWF0aW9uJyBkbworICAgIGdyYW1tYXIgPSAlcTwKKyAgICAgIGdyYW1tYXIgU2VtUHJlZDsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5OyB9CisgICAgICBhIDoge3RydWV9PyBJRCBFT0Y7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgCisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICJhIiApCisgICAgZGVidWdnZXIuc3VjY2Vzcy5zaG91bGQgYmVfdHJ1ZQorICAgIAorICAgIGV4cGVjdGVkID0gWyAKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjUiIF0sCisgICAgICBbICJzZW1hbnRpY19wcmVkaWNhdGUiLCAidHJ1ZSIsICcidHJ1ZSInIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjEzIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMTYiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiLTEiLCAiLTEiLCAiZGVmYXVsdCIsICIwIiwgIi0xIiwgIm5pbCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxOSIgXSwKKyAgICAgIFsgImV4aXRfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAidGVybWluYXRlIiBdCisgICAgXQorICAgIGRlYnVnZ2VyLmV2ZW50cy5zaG91bGQgPT0gZXhwZWN0ZWQKKyAgZW5kCisgIAorICBleGFtcGxlICdkZWJ1Zy1tb2RlIHBhcnNlciBldmVudHMgdHJpZ2dlcmVkIGJ5IHJlY29nbml6aW5nIGEgKC4uLikrIGJsb2NrJyBkbworICAgIGdyYW1tYXIgPSAlcTwKKyAgICAgIGdyYW1tYXIgUG9zaXRpdmVDbG9zdXJlQmxvY2s7CisgICAgICBvcHRpb25zIHsgbGFuZ3VhZ2U9UnVieTsgfQorICAgICAgYSA6IElEICggSUQgfCBJTlQgKSsgRU9GOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgID4KKyAgICAKKyAgICBkZWJ1Z2dlciA9IHBhcnNlKCBncmFtbWFyLCA6YSwgImEgMSBiIGMgMyIgKQorICAgIGRlYnVnZ2VyLnN1Y2Nlc3Muc2hvdWxkIGJlX3RydWUKKyAgICAKKyAgICBleHBlY3RlZCA9IFsgCisgICAgICBbICJlbnRlcl9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9hbHRlcm5hdGl2ZSIsICIxIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICI1IiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjEiLCAiNiIsICJoaWRkZW4iLCAiMSIsICIxIiwgJyIgIicgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImVudGVyX3N1YnJ1bGUiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMiIsICI1IiwgImRlZmF1bHQiLCAiMSIsICIyIiwgIlwiMVwiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIyIiwgIjUiLCAiZGVmYXVsdCIsICIxIiwgIjIiLCAiXCIxXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjIiLCAiNSIsICJkZWZhdWx0IiwgIjEiLCAiMiIsICJcIjFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjMiLCAiNiIsICJoaWRkZW4iLCAiMSIsICIzIiwgJyIgIicgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiNCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICI0IiwgIlwiYlwiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICI0IiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjQiLCAiXCJiXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjQiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiNCIsICJcImJcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjUiLCAiNiIsICJoaWRkZW4iLCAiMSIsICI1IiwgJyIgIicgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiNiIsICI0IiwgImRlZmF1bHQiLCAiMSIsICI2IiwgIlwiY1wiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICI2IiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjYiLCAiXCJjXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjYiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiNiIsICJcImNcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjciLCAiNiIsICJoaWRkZW4iLCAiMSIsICI3IiwgJyIgIicgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiOCIsICI1IiwgImRlZmF1bHQiLCAiMSIsICI4IiwgIlwiM1wiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICI4IiwgIjUiLCAiZGVmYXVsdCIsICIxIiwgIjgiLCAiXCIzXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjgiLCAiNSIsICJkZWZhdWx0IiwgIjEiLCAiOCIsICJcIjNcIiIgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiLTEiLCAiLTEiLCAiZGVmYXVsdCIsICIwIiwgIi0xIiwgIm5pbCIgXSwKKyAgICAgIFsgImV4aXRfZGVjaXNpb24iLCAiMSIgXSwKKyAgICAgIFsgImV4aXRfc3VicnVsZSIsICIxIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIyMiIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjI1IiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJ0ZXJtaW5hdGUiIF0KKyAgICBdCisgICAgCisgICAgZGVidWdnZXIuZXZlbnRzLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlYnVnLW1vZGUgcGFyc2VyIGV2ZW50cyB0cmlnZ2VyZWQgYnkgcmVjb2duaXppbmcgYSAoLi4uKSogYmxvY2snIGRvCisgICAgZ3JhbW1hciA9ICVxPAorICAgICAgZ3JhbW1hciBDbG9zdXJlQmxvY2s7CisgICAgICBvcHRpb25zIHsgbGFuZ3VhZ2U9UnVieTsgfQorICAgICAgYSA6IElEICggSUQgfCBJTlQgKSogRU9GOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgID4KKyAgICAKKyAgICBkZWJ1Z2dlciA9IHBhcnNlKCBncmFtbWFyLCA6YSwgImEgMSBiIGMgMyIgKQorICAgIGRlYnVnZ2VyLnN1Y2Nlc3Muc2hvdWxkIGJlX3RydWUKKyAgICAKKyAgICBleHBlY3RlZCA9IFsgCisgICAgICBbICJlbnRlcl9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9hbHRlcm5hdGl2ZSIsICIxIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICI1IiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjEiLCAiNiIsICJoaWRkZW4iLCAiMSIsICIxIiwgJyIgIicgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImVudGVyX3N1YnJ1bGUiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMiIsICI1IiwgImRlZmF1bHQiLCAiMSIsICIyIiwgIlwiMVwiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIyIiwgIjUiLCAiZGVmYXVsdCIsICIxIiwgIjIiLCAiXCIxXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjIiLCAiNSIsICJkZWZhdWx0IiwgIjEiLCAiMiIsICJcIjFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjMiLCAiNiIsICJoaWRkZW4iLCAiMSIsICIzIiwgJyIgIicgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiNCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICI0IiwgIlwiYlwiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICI0IiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjQiLCAiXCJiXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjQiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiNCIsICJcImJcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjUiLCAiNiIsICJoaWRkZW4iLCAiMSIsICI1IiwgJyIgIicgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiNiIsICI0IiwgImRlZmF1bHQiLCAiMSIsICI2IiwgIlwiY1wiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICI2IiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjYiLCAiXCJjXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjYiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiNiIsICJcImNcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfaGlkZGVuX3Rva2VuIiwgIjciLCAiNiIsICJoaWRkZW4iLCAiMSIsICI3IiwgJyIgIicgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiOCIsICI1IiwgImRlZmF1bHQiLCAiMSIsICI4IiwgIlwiM1wiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICI4IiwgIjUiLCAiZGVmYXVsdCIsICIxIiwgIjgiLCAiXCIzXCIiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIjgiLCAiNSIsICJkZWZhdWx0IiwgIjEiLCAiOCIsICJcIjNcIiIgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiLTEiLCAiLTEiLCAiZGVmYXVsdCIsICIwIiwgIi0xIiwgIm5pbCIgXSwKKyAgICAgIFsgImV4aXRfZGVjaXNpb24iLCAiMSIgXSwKKyAgICAgIFsgImV4aXRfc3VicnVsZSIsICIxIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIyMiIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjI1IiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJ0ZXJtaW5hdGUiIF0KKyAgICBdCisgICAgZGVidWdnZXIuZXZlbnRzLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlYnVnLW1vZGUgcGFyc2VyIGV2ZW50cyB0cmlnZ2VyZWQgYnkgYSBtaXNtYXRjaGVkIHNldCBlcnJvcicgZG8KKyAgICBncmFtbWFyID0gJXE8CisgICAgICBncmFtbWFyIE1pc21hdGNoZWRTZXRFcnJvcjsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5OyB9CisgICAgICBhIDogSUQgKCBJRCB8IElOVCApIEVPRjsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgCisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICJhIiApCisgICAgZGVidWdnZXIuc3VjY2Vzcy5zaG91bGQgYmVfdHJ1ZQorICAgIAorICAgIGV4cGVjdGVkID0gWyAKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjUiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICI4IiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiLTEiLCAiLTEiLCAiZGVmYXVsdCIsICIwIiwgIi0xIiwgIm5pbCIgXSwKKyAgICAgIFsgInJlY29nbml0aW9uX2V4Y2VwdGlvbiIsICJBTlRMUjM6OkVycm9yOjpNaXNtYXRjaGVkU2V0IiwgIjEiLCAiMCIsICItMSIgXSwKKyAgICAgIFsgInJlY29nbml0aW9uX2V4Y2VwdGlvbiIsICJBTlRMUjM6OkVycm9yOjpNaXNtYXRjaGVkU2V0IiwgIjEiLCAiMCIsICItMSIgXSwKKyAgICAgIFsgImJlZ2luX3Jlc3luYyIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAiZW5kX3Jlc3luYyIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMjQiIF0sCisgICAgICBbICJleGl0X3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYSIgXSwKKyAgICAgIFsgInRlcm1pbmF0ZSIgXQorICAgIF0KKyAgICAKKyAgICBkZWJ1Z2dlci5ldmVudHMuc2hvdWxkID09IGV4cGVjdGVkCisgIGVuZAorICAKKyAgZXhhbXBsZSAnZGVidWctbW9kZSBwYXJzZXIgYmxvY2stbG9jYXRpb24gZXZlbnRzIGZvciBzdWJydWxlcycgZG8KKyAgICBncmFtbWFyID0gJXE8CisgICAgICBncmFtbWFyIEJsb2NrOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGEgOiBJRCAoIGIgfCBjICkgRU9GOworICAgICAgYiA6IElEOworICAgICAgYyA6IElOVDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgCisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICJhIDEiICkKKyAgICBkZWJ1Z2dlci5zdWNjZXNzLnNob3VsZCBiZV90cnVlCisgICAgCisgICAgZXhwZWN0ZWQgPSBbIAorICAgICAgWyAiZW50ZXJfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiNSIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJjb25zdW1lX2hpZGRlbl90b2tlbiIsICIxIiwgIjYiLCAiaGlkZGVuIiwgIjEiLCAiMSIsICciICInIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjgiIF0sCisgICAgICBbICJlbnRlcl9zdWJydWxlIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjIiLCAiNSIsICJkZWZhdWx0IiwgIjEiLCAiMiIsICJcIjFcIiIgXSwKKyAgICAgIFsgImV4aXRfZGVjaXNpb24iLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjIiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjE0IiBdLAorICAgICAgWyAiZW50ZXJfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJjIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiNSIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjUiLCAiNSIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIyIiwgIjUiLCAiZGVmYXVsdCIsICIxIiwgIjIiLCAiXCIxXCIiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMiIsICI1IiwgImRlZmF1bHQiLCAiMSIsICIyIiwgIlwiMVwiIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICIyIiwgIjUiLCAiZGVmYXVsdCIsICIxIiwgIjIiLCAiXCIxXCIiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI1IiwgIjgiIF0sCisgICAgICBbICJleGl0X3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYyIgXSwKKyAgICAgIFsgImV4aXRfc3VicnVsZSIsICIxIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxOCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJjb25zdW1lX3Rva2VuIiwgIi0xIiwgIi0xIiwgImRlZmF1bHQiLCAiMCIsICItMSIsICJuaWwiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjIxIiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJ0ZXJtaW5hdGUiIF0KKyAgICBdCisgICAgZGVidWdnZXIuZXZlbnRzLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlYnVnLW1vZGUgcGFyc2VyIGV2ZW50cyB0cmlnZ2VyZWQgYnkgYSBubyB2aWFibGUgYWx0ZXJuYXRpdmUgZXJyb3InIGRvCisgICAgZ3JhbW1hciA9ICVxPAorICAgICAgZ3JhbW1hciBOb1ZpYWJsZUFsdDsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5OyB9CisgICAgICBhIDogSUQgKCBiIHwgYyApIEVPRjsKKyAgICAgIGIgOiBJRDsKKyAgICAgIGMgOiBJTlQ7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgQkFORyA6ICchJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgCisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICJhICEiICkKKyAgICBkZWJ1Z2dlci5zdWNjZXNzLnNob3VsZCBiZV90cnVlCisgICAgCisgICAgZXhwZWN0ZWQgPSBbIAorICAgICAgWyAiZW50ZXJfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiNSIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICIwIiwgIjQiLCAiZGVmYXVsdCIsICIxIiwgIjAiLCAiXCJhXCIiIF0sCisgICAgICBbICJjb25zdW1lX2hpZGRlbl90b2tlbiIsICIxIiwgIjciLCAiaGlkZGVuIiwgIjEiLCAiMSIsICciICInIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjgiIF0sCisgICAgICBbICJlbnRlcl9zdWJydWxlIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjIiLCAiNiIsICJkZWZhdWx0IiwgIjEiLCAiMiIsICJcIiFcIiIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIyIiwgIjYiLCAiZGVmYXVsdCIsICIxIiwgIjIiLCAiXCIhXCIiIF0sCisgICAgICBbICJyZWNvZ25pdGlvbl9leGNlcHRpb24iLCAiQU5UTFIzOjpFcnJvcjo6Tm9WaWFibGVBbHRlcm5hdGl2ZSIsICIyIiwgIjEiLCAiMiIgXSwKKyAgICAgIFsgImV4aXRfZGVjaXNpb24iLCAiMSIgXSwKKyAgICAgIFsgImV4aXRfc3VicnVsZSIsICIxIiBdLAorICAgICAgWyAicmVjb2duaXRpb25fZXhjZXB0aW9uIiwgIkFOVExSMzo6RXJyb3I6Ok5vVmlhYmxlQWx0ZXJuYXRpdmUiLCAiMiIsICIxIiwgIjIiIF0sCisgICAgICBbICJiZWdpbl9yZXN5bmMiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMiIsICI2IiwgImRlZmF1bHQiLCAiMSIsICIyIiwgIlwiIVwiIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICIyIiwgIjYiLCAiZGVmYXVsdCIsICIxIiwgIjIiLCAiXCIhXCIiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiLTEiLCAiLTEiLCAiZGVmYXVsdCIsICIwIiwgIi0xIiwgIm5pbCIgXSwKKyAgICAgIFsgImVuZF9yZXN5bmMiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjIxIiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJ0ZXJtaW5hdGUiIF0KKyAgICBdCisgICAgZGVidWdnZXIuZXZlbnRzLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlYnVnLW1vZGUgcGFyc2VyIGJsb2NrLWxvY2F0aW9uIGV2ZW50cyB0cmlnZ2VyZWQgYnkgcnVsZXMnIGRvCisgICAgZ3JhbW1hciA9ICVxPAorICAgICAgZ3JhbW1hciBSdWxlQmxvY2s7CisgICAgICBvcHRpb25zIHsgbGFuZ3VhZ2U9UnVieTsgfQorICAgICAgYSA6IGIgfCBjOworICAgICAgYiA6IElEOworICAgICAgYyA6IElOVDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICA+CisgICAgCisgICAgZGVidWdnZXIgPSBwYXJzZSggZ3JhbW1hciwgOmEsICIxIiApCisgICAgZGVidWdnZXIuc3VjY2Vzcy5zaG91bGQgYmVfdHJ1ZQorICAgIAorICAgIGV4cGVjdGVkID0gWyAKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI1IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiMVwiIiBdLAorICAgICAgWyAiZXhpdF9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMiIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiOSIgXSwKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYyIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjUiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI1IiwgIjUiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI1IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiMVwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNSIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcIjFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMCIsICI1IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiMVwiIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiNSIsICI4IiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImMiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjEwIiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJ0ZXJtaW5hdGUiIF0KKyAgICBdCisgICAgCisgICAgZGVidWdnZXIuZXZlbnRzLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlYnVnLW1vZGUgcGFyc2VyIGJsb2NrLWxvY2F0aW9uIGV2ZW50cyB0cmlnZ2VyZWQgYnkgc2luZ2xlLWFsdGVybmF0aXZlIHJ1bGVzJyBkbworICAgIGdyYW1tYXIgPSAlcTwKKyAgICAgIGdyYW1tYXIgUnVsZUJsb2NrU2luZ2xlQWx0OworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGEgOiBiOworICAgICAgYiA6IElEOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgID4KKyAgICAKKyAgICBkZWJ1Z2dlciA9IHBhcnNlKCBncmFtbWFyLCA6YSwgImEiICkKKyAgICBkZWJ1Z2dlci5zdWNjZXNzLnNob3VsZCBiZV90cnVlCisgICAgCisgICAgZXhwZWN0ZWQgPSBbIAorICAgICAgWyAiZW50ZXJfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxIiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiNSIgXSwKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYiIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjQiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI0IiwgIjUiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiNCIsICI3IiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImIiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjYiIF0sCisgICAgICBbICJleGl0X3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYSIgXSwKKyAgICAgIFsgInRlcm1pbmF0ZSIgXQorICAgIF0KKyAgICAKKyAgICBkZWJ1Z2dlci5ldmVudHMuc2hvdWxkID09IGV4cGVjdGVkCisgIGVuZAorICAKKyAgZXhhbXBsZSAnZGVidWctbW9kZSBwYXJzZXIgYmxvY2stbG9jYXRpb24gZXZlbnRzIHRyaWdnZXJlZCBieSBzaW5nbGUtYWx0ZXJuYXRpdmUgc3VicnVsZXMnIGRvCisgICAgZ3JhbW1hciA9ICVxPAorICAgICAgZ3JhbW1hciBCbG9ja1NpbmdsZUFsdDsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5OyB9CisgICAgICBhIDogKCBiICk7CisgICAgICBiIDogSUQ7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgPgorICAgIAorICAgIGRlYnVnZ2VyID0gcGFyc2UoIGdyYW1tYXIsIDphLCAiYSIgKQorICAgIGRlYnVnZ2VyLnN1Y2Nlc3Muc2hvdWxkIGJlX3RydWUKKyAgICAKKyAgICBleHBlY3RlZCA9IFsgCisgICAgICBbICJlbnRlcl9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9hbHRlcm5hdGl2ZSIsICIxIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICI1IiBdLAorICAgICAgWyAiZW50ZXJfYWx0ZXJuYXRpdmUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiNyIgXSwKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYiIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjQiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI0IiwgIjUiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiNCIsICI3IiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImIiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjEwIiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImEiIF0sCisgICAgICBbICJ0ZXJtaW5hdGUiIF0KKyAgICBdCisgICAgZGVidWdnZXIuZXZlbnRzLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlYnVnLW1vZGUgcGFyc2VyIGJsb2NrLWxvY2F0aW9uIGV2ZW50cyB0cmlnZ2VyZWQgYnkgaW52b2tpbmcgYSBjeWNsaWMgREZBIGZvciBwcmVkaWN0aW9uJyBkbworICAgIGdyYW1tYXIgPSAlcTwKKyAgICAgIGdyYW1tYXIgREZBOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGEgOiAoIGIgfCBjICkgRU9GOworICAgICAgYiA6IElEKiBJTlQ7CisgICAgICBjIDogSUQrIEJBTkc7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgQkFORyA6ICchJzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgID4KKyAgICAKKyAgICBkZWJ1Z2dlciA9IHBhcnNlKCBncmFtbWFyLCA6YSwgImEhIiApCisgICAgZGVidWdnZXIuc3VjY2Vzcy5zaG91bGQgYmVfdHJ1ZQorICAgIAorICAgIGV4cGVjdGVkID0gWyAKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICIzIiwgIjUiIF0sCisgICAgICBbICJlbnRlcl9zdWJydWxlIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9kZWNpc2lvbiIsICIxIiBdLAorICAgICAgWyAibWFyayIsICIwIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjEiLCAiNiIsICJkZWZhdWx0IiwgIjEiLCAiMSIsICJcIiFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMSIsICI2IiwgImRlZmF1bHQiLCAiMSIsICIxIiwgIlwiIVwiIiBdLAorICAgICAgWyAicmV3aW5kIiwgIjAiIF0sCisgICAgICBbICJleGl0X2RlY2lzaW9uIiwgIjEiIF0sCisgICAgICBbICJlbnRlcl9hbHRlcm5hdGl2ZSIsICIyIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxMSIgXSwKKyAgICAgIFsgImVudGVyX3J1bGUiLCBAZ3JhbW1hcl9wYXRoLCAiYyIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjUiLCAiMSIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI1IiwgIjUiIF0sCisgICAgICBbICJlbnRlcl9zdWJydWxlIiwgIjMiIF0sCisgICAgICBbICJlbnRlcl9kZWNpc2lvbiIsICIzIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImV4aXRfZGVjaXNpb24iLCAiMyIgXSwKKyAgICAgIFsgImVudGVyX2FsdGVybmF0aXZlIiwgIjEiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI1IiwgIjUiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAibG9vayIsICIxIiwgIjAiLCAiNCIsICJkZWZhdWx0IiwgIjEiLCAiMCIsICJcImFcIiIgXSwKKyAgICAgIFsgImNvbnN1bWVfdG9rZW4iLCAiMCIsICI0IiwgImRlZmF1bHQiLCAiMSIsICIwIiwgIlwiYVwiIiBdLAorICAgICAgWyAiZW50ZXJfZGVjaXNpb24iLCAiMyIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIxIiwgIjYiLCAiZGVmYXVsdCIsICIxIiwgIjEiLCAiXCIhXCIiIF0sCisgICAgICBbICJleGl0X2RlY2lzaW9uIiwgIjMiIF0sCisgICAgICBbICJleGl0X3N1YnJ1bGUiLCAiMyIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjUiLCAiOSIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICIxIiwgIjYiLCAiZGVmYXVsdCIsICIxIiwgIjEiLCAiXCIhXCIiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiMSIsICI2IiwgImRlZmF1bHQiLCAiMSIsICIxIiwgIlwiIVwiIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICIxIiwgIjYiLCAiZGVmYXVsdCIsICIxIiwgIjEiLCAiXCIhXCIiIF0sCisgICAgICBbICJsb2NhdGlvbiIsICI1IiwgIjEzIiBdLAorICAgICAgWyAiZXhpdF9ydWxlIiwgQGdyYW1tYXJfcGF0aCwgImMiIF0sCisgICAgICBbICJleGl0X3N1YnJ1bGUiLCAiMSIgXSwKKyAgICAgIFsgImxvY2F0aW9uIiwgIjMiLCAiMTUiIF0sCisgICAgICBbICJsb29rIiwgIjEiLCAiLTEiLCAiLTEiLCAiZGVmYXVsdCIsICIwIiwgIi0xIiwgIm5pbCIgXSwKKyAgICAgIFsgImxvb2siLCAiMSIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAiY29uc3VtZV90b2tlbiIsICItMSIsICItMSIsICJkZWZhdWx0IiwgIjAiLCAiLTEiLCAibmlsIiBdLAorICAgICAgWyAibG9jYXRpb24iLCAiMyIsICIxOCIgXSwKKyAgICAgIFsgImV4aXRfcnVsZSIsIEBncmFtbWFyX3BhdGgsICJhIiBdLAorICAgICAgWyAidGVybWluYXRlIiBdCisgICAgXQorICAgIGRlYnVnZ2VyLmV2ZW50cy5zaG91bGQgPT0gZXhwZWN0ZWQKKyAgZW5kCisgIAorICBleGFtcGxlICdkZWJ1Zy1tb2RlIEFTVC1idWlsZGluZyBwYXJzZXIgZXZlbnRzJyBkbworICAgIGdyYW1tYXIgPSAlcS8KKyAgICAgIGdyYW1tYXIgQmFzaWNBU1Q7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgIH0KKyAgICAgIGEgOiAoIGIgfCBjICkgRU9GITsKKyAgICAgIGIgOiBJRCogSU5UIC0+IF4oSU5UIElEKik7CisgICAgICBjIDogSUQrIEJBTkcgLT4gXihCQU5HIElEKyk7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5JysgOworICAgICAgQkFORyA6ICchJzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIC8KKyAgICBsaXN0ZW5lciA9IEFOVExSMzo6RGVidWc6OlJlY29yZEV2ZW50TGlzdGVuZXIubmV3CisgICAgcGFyc2UoIGdyYW1tYXIsIDphLCAiYSEiLCA6bGlzdGVuZXIgPT4gbGlzdGVuZXIgKQorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9kZWJ1Z2dpbmcvcHJvZmlsZS1tb2RlLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvZGVidWdnaW5nL3Byb2ZpbGUtbW9kZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZmNzYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvZGVidWdnaW5nL3Byb2ZpbGUtbW9kZS5yYgpAQCAtMCwwICsxLDE2NSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0UHJvZmlsZU1vZGUgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgY29tcGlsZV9vcHRpb25zIDpwcm9maWxlID0+IHRydWUKKyAgCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTaW1wbGVDOworICAgIAorICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAKKyAgICBwcm9ncmFtCisgICAgICAgIDogICBkZWNsYXJhdGlvbisKKyAgICAgICAgOworICAgIAorICAgIC8qKiBJbiB0aGlzIHJ1bGUsIHRoZSBmdW5jdGlvbkhlYWRlciBsZWZ0IHByZWZpeCBvbiB0aGUgbGFzdCB0d28KKyAgICAgKiAgYWx0ZXJuYXRpdmVzIGlzIG5vdCBMTChrKSBmb3IgYSBmaXhlZCBrLiAgSG93ZXZlciwgaXQgaXMKKyAgICAgKiAgTEwoKikuICBUaGUgTEwoKikgYWxnb3JpdGhtIHNpbXBseSBzY2FucyBhaGVhZCB1bnRpbCBpdCBzZWVzCisgICAgICogIGVpdGhlciB0aGUgJzsnIG9yIHRoZSAneycgb2YgdGhlIGJsb2NrIGFuZCB0aGVuIGl0IHBpY2tzCisgICAgICogIHRoZSBhcHByb3ByaWF0ZSBhbHRlcm5hdGl2ZS4gIExvb2toZWFkIGNhbiBiZSBhcmJpdHJhcmlseQorICAgICAqICBsb25nIGluIHRoZW9yeSwgYnV0IGlzIDw9MTAgaW4gbW9zdCBjYXNlcy4gIFdvcmtzIGdyZWF0LgorICAgICAqICBVc2UgQU5UTFJXb3JrcyB0byBzZWUgdGhlIGxvb2thaGVhZCB1c2UgKHN0ZXAgYnkgTG9jYXRpb24pCisgICAgICogIGFuZCBsb29rIGZvciBibHVlIHRva2VucyBpbiB0aGUgaW5wdXQgd2luZG93IHBhbmUuIDopCisgICAgICovCisgICAgZGVjbGFyYXRpb24KKyAgICAgICAgOiAgIHZhcmlhYmxlCisgICAgICAgIHwgICBmdW5jdGlvbkhlYWRlciAnOycKKyAgICAgICAgfCAgIGZ1bmN0aW9uSGVhZGVyIGJsb2NrCisgICAgICAgIDsKKyAgICAKKyAgICB2YXJpYWJsZQorICAgICAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICc7JworICAgICAgICA7CisgICAgCisgICAgZGVjbGFyYXRvcgorICAgICAgICA6ICAgSUQgCisgICAgICAgIDsKKyAgICAKKyAgICBmdW5jdGlvbkhlYWRlcgorICAgICAgICA6ICAgdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJworICAgICAgICA7CisgICAgCisgICAgZm9ybWFsUGFyYW1ldGVyCisgICAgICAgIDogICB0eXBlIGRlY2xhcmF0b3IgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgdHlwZQorICAgICAgICA6ICAgJ2ludCcgICAKKyAgICAgICAgfCAgICdjaGFyJyAgCisgICAgICAgIHwgICAndm9pZCcKKyAgICAgICAgfCAgIElEICAgICAgICAKKyAgICAgICAgOworICAgIAorICAgIGJsb2NrCisgICAgICAgIDogICAneycKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSoKKyAgICAgICAgICAgICAgICBzdGF0KgorICAgICAgICAgICAgJ30nCisgICAgICAgIDsKKyAgICAKKyAgICBzdGF0OiBmb3JTdGF0CisgICAgICAgIHwgZXhwciAnOycgICAgICAKKyAgICAgICAgfCBibG9jaworICAgICAgICB8IGFzc2lnblN0YXQgJzsnCisgICAgICAgIHwgJzsnCisgICAgICAgIDsKKyAgICAKKyAgICBmb3JTdGF0CisgICAgICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgYXNzaWduU3RhdAorICAgICAgICA6ICAgSUQgJz0nIGV4cHIgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgZXhwcjogICBjb25kRXhwcgorICAgICAgICA7CisgICAgCisgICAgY29uZEV4cHIKKyAgICAgICAgOiAgIGFleHByICggKCc9PScgfCAnPCcpIGFleHByICk/CisgICAgICAgIDsKKyAgICAKKyAgICBhZXhwcgorICAgICAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgICAgIDsKKyAgICAKKyAgICBhdG9tCisgICAgICAgIDogSUQgICAgICAKKyAgICAgICAgfCBJTlQgICAgICAKKyAgICAgICAgfCAnKCcgZXhwciAnKScKKyAgICAgICAgOyAKKyAgICAKKyAgICBJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgICAgICA7CisgICAgCisgICAgSU5UIDoJKCcwJy4uJzknKSsKKyAgICAgICAgOworICAgIAorICAgIFdTICA6ICAgKCAgICcgJworICAgICAgICAgICAgfCAgICdcdCcKKyAgICAgICAgICAgIHwgICAnXHInCisgICAgICAgICAgICB8ICAgJ1xuJworICAgICAgICAgICAgKSsKKyAgICAgICAgICAgIHsgJGNoYW5uZWw9SElEREVOOyB9CisgICAgICAgIDsKKyAgRU5ECisgIAorICBleGFtcGxlICdwcm9maWxlIG1vZGUgb3V0cHV0JyBkbworICAgIGlucHV0ID0gPDwtRU5ELmZpeGVkX2luZGVudCggMCApCisgICAgICBjaGFyIGM7CisgICAgICBpbnQgeDsKKyAgICAgIAorICAgICAgdm9pZCBiYXIoaW50IHgpOworICAgICAgCisgICAgICBpbnQgZm9vKGludCB5LCBjaGFyIGQpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaT0wOyBpPDM7IGk9aSsxKSB7CisgICAgICAgICAgeD0zOworICAgICAgICAgIHk9NTsKKyAgICAgICAgfQorICAgICAgfQorICAgIEVORAorICAgIAorICAgIGxleGVyID0gU2ltcGxlQzo6TGV4ZXIubmV3KCBpbnB1dCApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBTaW1wbGVDOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIHBhcnNlci5wcm9ncmFtCisgICAgCisgICAgcHJvZmlsZV9kYXRhID0gcGFyc2VyLnByb2ZpbGUKKyAgICBwcm9maWxlX2RhdGEucnVsZV9pbnZvY2F0aW9ucy5zaG91bGQgPT0gNjAKKyAgICBwcm9maWxlX2RhdGEuZ3Vlc3NpbmdfcnVsZV9pbnZvY2F0aW9ucy5zaG91bGQgPT0gMAorICAgIHByb2ZpbGVfZGF0YS5ydWxlX2ludm9jYXRpb25fZGVwdGguc2hvdWxkID09IDEyCisgICAgCisgICAgcHJvZmlsZV9kYXRhLmZpeGVkX2RlY2lzaW9ucy5zaG91bGQgPT0gNDAKKyAgICBmaXhlZF9kYXRhID0gcHJvZmlsZV9kYXRhLmZpeGVkX2xvb2tzCisgICAgZml4ZWRfZGF0YS5taW4uc2hvdWxkID09IDEKKyAgICBmaXhlZF9kYXRhLm1heC5zaG91bGQgPT0gMgorICAgIGZpeGVkX2RhdGEuYXZlcmFnZS5zaG91bGQgPT0gMS4wNzUKKyAgICBmaXhlZF9kYXRhLnN0YW5kYXJkX2RldmlhdGlvbi5zaG91bGQgPT0gMC4yNjY3NDY3ODI4MzY5MTg1NQorICAgIAorICAgIHByb2ZpbGVfZGF0YS5jeWNsaWNfZGVjaXNpb25zLnNob3VsZCA9PSA0CisgICAgY3ljbGljX2RhdGEgPSBwcm9maWxlX2RhdGEuY3ljbGljX2xvb2tzCisgICAgY3ljbGljX2RhdGEubWluLnNob3VsZCA9PSAzCisgICAgY3ljbGljX2RhdGEubWF4LnNob3VsZCA9PSAxMAorICAgIGN5Y2xpY19kYXRhLmF2ZXJhZ2Uuc2hvdWxkID09IDUuNzUKKyAgICBjeWNsaWNfZGF0YS5zdGFuZGFyZF9kZXZpYXRpb24uc2hvdWxkID09IDMuNDAzNDI5NjQyNzc3MDIyOAorICAgIAorICAgIHByb2ZpbGVfZGF0YS5zeW50YWN0aWNfcHJlZGljYXRlcy5zaG91bGQgPT0gMAorICAgIAorICAgIHByb2ZpbGVfZGF0YS5tZW1vaXphdGlvbl9jYWNoZV9lbnRyaWVzLnNob3VsZCA9PSAwCisgICAgcHJvZmlsZV9kYXRhLm1lbW9pemF0aW9uX2NhY2hlX2hpdHMuc2hvdWxkID09IDAKKyAgICBwcm9maWxlX2RhdGEubWVtb2l6YXRpb25fY2FjaGVfbWlzc2VzLnNob3VsZCA9PSAwCisgICAgCisgICAgcHJvZmlsZV9kYXRhLnNlbWFudGljX3ByZWRpY2F0ZXMuc2hvdWxkID09IDAKKyAgICBwcm9maWxlX2RhdGEudG9rZW5zLnNob3VsZCA9PSA3NworICAgIHByb2ZpbGVfZGF0YS5oaWRkZW5fdG9rZW5zLnNob3VsZCA9PSAyNAorICAgIHByb2ZpbGVfZGF0YS5jaGFyYWN0ZXJzX21hdGNoZWQuc2hvdWxkID09IDExOAorICAgIHByb2ZpbGVfZGF0YS5oaWRkZW5fY2hhcmFjdGVyc19tYXRjaGVkLnNob3VsZCA9PSA0MAorICAgIHByb2ZpbGVfZGF0YS5yZXBvcnRlZF9lcnJvcnMuc2hvdWxkID09IDAKKyAgZW5kCisgIAorICAKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvZGVidWdnaW5nL3J1bGUtdHJhY2luZy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2RlYnVnZ2luZy9ydWxlLXRyYWNpbmcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMzJkNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2RlYnVnZ2luZy9ydWxlLXRyYWNpbmcucmIKQEAgLTAsMCArMSw3MyBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0UnVsZVRyYWNpbmcgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgVHJhY2VkOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAcGFyc2VyOjppbml0IHsKKyAgICAgIEBzdGFjayA9IG5pbAorICAgICAgQHRyYWNlcyA9IFtdCisgICAgfQorICAgIAorICAgIEBwYXJzZXI6Om1lbWJlcnMgeworICAgICAgYXR0cl9hY2Nlc3NvciA6c3RhY2ssIDp0cmFjZXMKKyAgICAgIAorICAgICAgZGVmIHRyYWNlX2luKHJ1bGVfbmFtZSwgcnVsZV9pbmRleCkKKyAgICAgICAgQHRyYWNlcyA8PCAiPiN7cnVsZV9uYW1lfSIKKyAgICAgIGVuZAorICAgICAgCisgICAgICBkZWYgdHJhY2Vfb3V0KHJ1bGVfbmFtZSwgcnVsZV9pbmRleCkKKyAgICAgICAgQHRyYWNlcyA8PCAiPCN7cnVsZV9uYW1lfSIKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBAbGV4ZXI6OmluaXQgeworICAgICAgQHN0YWNrID0gbmlsCisgICAgICBAdHJhY2VzID0gW10KKyAgICB9CisgICAgCisgICAgQGxleGVyOjptZW1iZXJzIHsKKyAgICAgIGF0dHJfYWNjZXNzb3IgOnN0YWNrLCA6dHJhY2VzCisgICAgICAKKyAgICAgIGRlZiB0cmFjZV9pbihydWxlX25hbWUsIHJ1bGVfaW5kZXgpCisgICAgICAgIEB0cmFjZXMgPDwgIj4je3J1bGVfbmFtZX0iCisgICAgICBlbmQKKyAgICAgIAorICAgICAgZGVmIHRyYWNlX291dChydWxlX25hbWUsIHJ1bGVfaW5kZXgpCisgICAgICAgIEB0cmFjZXMgPDwgIjwje3J1bGVfbmFtZX0iCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgYTogJzwnICgoSU5UICcrJyk9PmJ8YykgJz4nOworICAgIGI6IGMgKCcrJyBjKSo7CisgICAgYzogSU5UIDsKKyAgICAKKyAgICBJTlQ6ICgnMCcuLic5JykrOworICAgIFdTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsKKyAgRU5ECisKKyAgY29tcGlsZV9vcHRpb25zIDp0cmFjZSA9PiB0cnVlCisgIAorICBleGFtcGxlICJzZXR0aW5nIHVwIHJ1bGUgdHJhY2luZyIgZG8KKyAgICBsZXhlciA9IFRyYWNlZDo6TGV4ZXIubmV3KCAnPCAxICsgMiArIDMgPicgKQorICAgIHBhcnNlciA9IFRyYWNlZDo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5hCisgICAgbGV4ZXIudHJhY2VzLnNob3VsZCA9PSBbIAorICAgICAgICAgICAgJz50X182IScsICc8dF9fNiEnLCAnPndzIScsICc8d3MhJywgJz5pbnQhJywgJzxpbnQhJywgJz53cyEnLCAnPHdzIScsCisgICAgICAgICAgICAnPnRfXzghJywgJzx0X184IScsICc+d3MhJywgJzx3cyEnLCAnPmludCEnLCAnPGludCEnLCAnPndzIScsICc8d3MhJywKKyAgICAgICAgICAgICc+dF9fOCEnLCAnPHRfXzghJywgJz53cyEnLCAnPHdzIScsICc+aW50IScsICc8aW50IScsICc+d3MhJywgJzx3cyEnLAorICAgICAgICAgICAgJz50X183IScsICc8dF9fNyEnCisgICAgXQorICAgIHBhcnNlci50cmFjZXMuc2hvdWxkID09IFsgCisgICAgICAnPmEnLCAnPnN5bnByZWQxX1RyYWNlZCcsICc8c3lucHJlZDFfVHJhY2VkJywKKyAgICAgICc+YicsICc+YycsICc8YycsICc+YycsICc8YycsICc+YycsICc8YycsICc8YicsICc8YScKKyAgICBdCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9kZWxlZ2F0aW9uL2ltcG9ydC5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2RlbGVnYXRpb24vaW1wb3J0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MTQ5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9kZWxlZ2F0aW9uL2ltcG9ydC5yYgpAQCAtMCwwICsxLDM3OSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0SW1wb3J0ZWRHcmFtbWFycyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICAKKyAgZGVmIGxvYWQoIGdyYW1tYXIgKQorICAgIGdyYW1tYXIuY29tcGlsZQorICAgICQ6LnVuc2hpZnQoIGdyYW1tYXIub3V0cHV0X2RpcmVjdG9yeSApIHVubGVzcyAkOi5pbmNsdWRlPyggZ3JhbW1hci5vdXRwdXRfZGlyZWN0b3J5ICkKKyAgICBmb3IgZmlsZSBpbiBncmFtbWFyLnRhcmdldF9maWxlcyggZmFsc2UgKQorICAgICAgcmVxdWlyZSBGaWxlLmJhc2VuYW1lKCBmaWxlLCAnLnJiJyApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnZGVsZWdhdG9yIGludm9rZXMgZGVsZWdhdGUgcnVsZScgZG8KKyAgICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgcGFyc2VyIGdyYW1tYXIgRElEUlNsYXZlOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgZGVmIGNhcHR1cmUodCkKKyAgICAgICAgICBAZGlkcl9tYXN0ZXIuY2FwdHVyZSh0KQorICAgICAgICBlbmQKKyAgICAgIH0KKyAgICAgIGEgOiBCIHsgY2FwdHVyZSgiUy5hIikgfSA7CisgICAgRU5ECisgICAgbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBESURSTWFzdGVyOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGltcG9ydCBESURSU2xhdmU7CisgICAgICAKKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgCisgICAgICBzIDogYSA7CisgICAgICBCIDogJ2InIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7IHNraXAoKSB9IDsKKyAgICBFTkQKKyAgICAKKyAgICBsZXhlciA9IERJRFJNYXN0ZXI6OkxleGVyLm5ldyggJ2InICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IERJRFJNYXN0ZXI6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgcGFyc2VyLnMKKyAgICBwYXJzZXIub3V0cHV0LnNob3VsZCA9PSAnUy5hJworICBlbmQKKyAgCisgIGV4YW1wbGUgJ2RlbGVnYXRvciBpbnZva2VzIGRlbGVnYXRlIHJ1bGUgd2l0aCBhcmdzJyBkbworICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBwYXJzZXIgZ3JhbW1hciBTbGF2ZTI7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgQG1lbWJlcnMgeworICAgICAgICBkZWYgY2FwdHVyZSh0KQorICAgICAgICAgIEBtYXN0ZXJfMi5jYXB0dXJlKHQpCisgICAgICAgIGVuZAorICAgICAgfQorICAgICAgYVt4XSByZXR1cm5zIFt5XSA6IEIge2NhcHR1cmUoIlMuYSIpOyAkeT0iMTAwMCI7fSA7CisgICAgRU5ECisgICAgbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBNYXN0ZXIyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTt9CisgICAgICBpbXBvcnQgU2xhdmUyOworICAgICAgCisgICAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0IH0KKyAgICAgIAorICAgICAgcyA6IGxhYmVsPWFbM10ge2NhcHR1cmUoJGxhYmVsLnkpfSA7CisgICAgICBCIDogJ2InIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2tpcH0gOworICAgIEVORAorICAgIGxleGVyID0gTWFzdGVyMjo6TGV4ZXIubmV3KCAnYicgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gTWFzdGVyMjo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICBwYXJzZXIucworICAgIHBhcnNlci5vdXRwdXQuc2hvdWxkID09ICdTLmExMDAwJworICBlbmQKKyAgCisgIGV4YW1wbGUgImRlbGVnYXRvciBhY2Nlc3NlcyBkZWxlZ2F0ZSBtZW1iZXJzIiBkbworICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBwYXJzZXIgZ3JhbW1hciBTbGF2ZTM7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgQG1lbWJlcnMgeworICAgICAgICBkZWYgY2FwdHVyZSh0KQorICAgICAgICAgIEBtYXN0ZXJfMy5jYXB0dXJlKHQpCisgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgZGVmIHdoYXRldnMKKyAgICAgICAgICBjYXB0dXJlKCJ3aGF0ZXZzIikKKyAgICAgICAgZW5kCisgICAgICB9CisgICAgICBhIDogQiA7CisgICAgRU5ECisgICAgbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBNYXN0ZXIzOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICB9CisgICAgICBpbXBvcnQgU2xhdmUzOworICAgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCB9CisgICAgICAKKyAgICAgIHMgOiAnYicge0BzbGF2ZV8zLndoYXRldnN9IDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2tpcCgpfSA7CisgICAgRU5ECisgICAgCisgICAgcGFyc2VyID0gTWFzdGVyMzo6UGFyc2VyLm5ldyggTWFzdGVyMzo6TGV4ZXIubmV3KCAnYicgKSApCisgICAgcGFyc2VyLnMKKyAgICBwYXJzZXIub3V0cHV0LnNob3VsZCA9PSAnd2hhdGV2cycKKyAgZW5kCisgIAorICBleGFtcGxlICJkZWxlZ2F0b3IgaW52b2tlcyBmaXJzdCB2ZXJzaW9uIG9mIGRlbGVnYXRlIHJ1bGUiIGRvCisgICAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHBhcnNlciBncmFtbWFyIFNsYXZlNEE7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgQG1lbWJlcnMgeworICAgICAgICBkZWYgY2FwdHVyZSh0KQorICAgICAgICAgIEBtYXN0ZXJfNC5jYXB0dXJlKHQpCisgICAgICAgIGVuZAorICAgICAgfQorICAgICAgYSA6IGIge2NhcHR1cmUoIlMuYSIpfSA7CisgICAgICBiIDogQiA7CisgICAgRU5ECisgICAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHBhcnNlciBncmFtbWFyIFNsYXZlNEI7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgIH0KKyAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgZGVmIGNhcHR1cmUodCkKKyAgICAgICAgICBAbWFzdGVyXzQuY2FwdHVyZSh0KQorICAgICAgICBlbmQKKyAgICAgIH0KKyAgICAgIGEgOiBCIHtjYXB0dXJlKCJULmEiKX0gOworICAgIEVORAorICAgIGxvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIGdyYW1tYXIgTWFzdGVyNDsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgaW1wb3J0IFNsYXZlNEEsIFNsYXZlNEI7CisgICAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0IH0KKyAgICAgIHMgOiBhIDsKKyAgICAgIEIgOiAnYicgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHtza2lwfSA7CisgICAgRU5ECisgICAgCisgICAgcGFyc2VyID0gTWFzdGVyNDo6UGFyc2VyLm5ldyggTWFzdGVyNDo6TGV4ZXIubmV3KCAnYicgKSApCisgICAgcGFyc2VyLnMKKyAgICBwYXJzZXIub3V0cHV0LnNob3VsZCA9PSAnUy5hJworICBlbmQKKyAgCisgIGV4YW1wbGUgImRlbGVnYXRlcyBzZWUgc2FtZSB0b2tlbiB0eXBlIiBkbworICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBwYXJzZXIgZ3JhbW1hciBTbGF2ZTVBOyAvLyBBLCBCLCBDIHRva2VuIHR5cGUgb3JkZXIKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgdG9rZW5zIHsgQTsgQjsgQzsgfQorICAgICAgQG1lbWJlcnMgeworICAgICAgICBkZWYgY2FwdHVyZSh0KQorICAgICAgICAgIEBtYXN0ZXJfNS5jYXB0dXJlKHQpCisgICAgICAgIGVuZAorICAgICAgfQorICAgICAgeCA6IEEge2NhcHR1cmUoIlMueCAiKX0gOworICAgIEVORAorICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBwYXJzZXIgZ3JhbW1hciBTbGF2ZTVCOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICB9CisgICAgICB0b2tlbnMgeyBDOyBCOyBBOyB9IC8vLyByZXZlcnNlIG9yZGVyCisgICAgICBAbWVtYmVycyB7CisgICAgICAgIGRlZiBjYXB0dXJlKHQpCisgICAgICAgICAgQG1hc3Rlcl81LmNhcHR1cmUodCkKKyAgICAgICAgZW5kCisgICAgICB9CisgICAgICB5IDogQSB7Y2FwdHVyZSgiVC55Iil9IDsKKyAgICBFTkQKKyAgICBsb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIE1hc3RlcjU7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgaW1wb3J0IFNsYXZlNUEsIFNsYXZlNUI7CisgICAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0IH0KKyAgICAgIHMgOiB4IHkgOyAvLyBtYXRjaGVzIEFBLCB3aGljaCBzaG91bGQgYmUgImFhIgorICAgICAgQiA6ICdiJyA7IC8vIGFub3RoZXIgb3JkZXI6IEIsIEEsIEMKKyAgICAgIEEgOiAnYScgOworICAgICAgQyA6ICdjJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykge3NraXB9IDsKKyAgICBFTkQKKyAgICAKKyAgICBsZXhlciA9IE1hc3RlcjU6OkxleGVyLm5ldyggJ2FhJyApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBNYXN0ZXI1OjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIHBhcnNlci5zCisgICAgcGFyc2VyLm91dHB1dC5zaG91bGQgPT0gJ1MueCBULnknCisgIGVuZAorICAKKyAgZXhhbXBsZSAiZGVsZWdhdG9yIHJ1bGUgb3ZlcnJpZGVzIGRlbGVnYXRlIiBkbworICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBwYXJzZXIgZ3JhbW1hciBTbGF2ZTY7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgQG1lbWJlcnMgeworICAgICAgICBkZWYgY2FwdHVyZSh0KQorICAgICAgICAgIEBtYXN0ZXJfNi5jYXB0dXJlKHQpCisgICAgICAgIGVuZAorICAgICAgfQorICAgICAgYSA6IGIge2NhcHR1cmUoIlMuYSIpfSA7CisgICAgICBiIDogQiA7CisgICAgRU5ECisgICAgbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBNYXN0ZXI2OworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGltcG9ydCBTbGF2ZTY7CisgICAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0IH0KKyAgICAgIGIgOiAnYid8J2MnIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2tpcH0gOworICAgIEVORAorICAgIAorICAgIHBhcnNlciA9IE1hc3RlcjY6OlBhcnNlci5uZXcoIE1hc3RlcjY6OkxleGVyLm5ldyggJ2MnICkgKQorICAgIHBhcnNlci5hCisgICAgcGFyc2VyLm91dHB1dC5zaG91bGQgPT0gJ1MuYScKKyAgZW5kCisgIAorICBleGFtcGxlICJsZXhlciBkZWxlZ2F0b3IgaW52b2tlcyBkZWxlZ2F0ZSBydWxlIiBkbworICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBsZXhlciBncmFtbWFyIFNsYXZlNzsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBAbWVtYmVycyB7CisgICAgICAgIGRlZiBjYXB0dXJlKHQpCisgICAgICAgICAgQG1hc3Rlcl83LmNhcHR1cmUodCkKKyAgICAgICAgZW5kCisgICAgICB9CisgICAgICBBIDogJ2EnIHtjYXB0dXJlKCJTLkEgIil9IDsKKyAgICAgIEMgOiAnYycgOworICAgIEVORAorICAgIGxvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIGxleGVyIGdyYW1tYXIgTWFzdGVyNzsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgfQorICAgICAgaW1wb3J0IFNsYXZlNzsKKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgQiA6ICdiJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykge3NraXB9IDsKKyAgICBFTkQKKyAgICAKKyAgICBsZXhlciA9IE1hc3Rlcjc6OkxleGVyLm5ldyggJ2FiYycgKQorICAgIGxleGVyLm1hcCB7IHx0a3wgbGV4ZXIuY2FwdHVyZSggdGsudGV4dCApIH0KKyAgICBsZXhlci5vdXRwdXQuc2hvdWxkID09ICdTLkEgYWJjJworICBlbmQKKyAgCisgIGV4YW1wbGUgImxleGVyIGRlbGVnYXRvciBydWxlIG92ZXJyaWRlcyBkZWxlZ2F0ZSIgZG8KKyAgICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgbGV4ZXIgZ3JhbW1hciBTbGF2ZTg7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O30KKyAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgZGVmIGNhcHR1cmUodCkKKyAgICAgICAgICBAbWFzdGVyXzguY2FwdHVyZSh0KQorICAgICAgICBlbmQKKyAgICAgIH0KKyAgICAgIEEgOiAnYScge2NhcHR1cmUoIlMuQSIpfSA7CisgICAgRU5ECisgICAgbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgbGV4ZXIgZ3JhbW1hciBNYXN0ZXI4OworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTt9CisgICAgICBpbXBvcnQgU2xhdmU4OworICAgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCB9CisgICAgICBBIDogJ2EnIHtjYXB0dXJlKCJNLkEgIil9IDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7c2tpcH0gOworICAgIEVORAorICAgIAorICAgIGxleGVyID0gTWFzdGVyODo6TGV4ZXIubmV3KCAnYScgKQorICAgIGxleGVyLm1hcCB7IHx0a3wgbGV4ZXIuY2FwdHVyZSggdGsudGV4dCApIH0KKyAgICBsZXhlci5vdXRwdXQuc2hvdWxkID09ICdNLkEgYScKKyAgZW5kCisKKyAgZXhhbXBsZSAiZGVsZWdhdG9yIHJ1bGUgd2l0aCBzeW50YWN0aWMgcHJlZGljYXRlcyIgZG8KKyAgICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgcGFyc2VyIGdyYW1tYXIgU2xhdmU5OworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIEBtZW1iZXJzIHsKKyAgICAgICAgZGVmIGNhcHR1cmUodCkKKyAgICAgICAgICBAbWFzdGVyXzkuY2FwdHVyZSh0KQorICAgICAgICBlbmQKKyAgICAgIH0KKyAgICAgIGEgOiBiIGM7CisgICAgICBjIDogKCdjJyAnYicpPT4gJ2MnICdiJyB7IGNhcHR1cmUoIihjYikiKSB9CisgICAgICAgIHwgKCdjJyAnYycpPT4gJ2MnCisgICAgICAgIDsKKyAgICBFTkQKKyAgICBsb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIE1hc3Rlcjk7CisgICAgICBvcHRpb25zIHsgbGFuZ3VhZ2U9UnVieTsgfQorICAgICAgaW1wb3J0IFNsYXZlOTsKKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYiA6ICgnYicgJ2InKT0+ICdiJyAnYicKKyAgICAgICAgfCAoJ2InICdjJyk9PiAnYicge2NhcHR1cmUoIihiYykiKX0KKyAgICAgICAgOworICAgICAgV1MgOiAoJyAnfCdcbicpIHtza2lwfSA7CisgICAgRU5ECisgICAgCisgICAgcGFyc2VyID0gTWFzdGVyOTo6UGFyc2VyLm5ldyggTWFzdGVyOTo6TGV4ZXIubmV3KCAnYmNiJyApICkKKyAgICBwYXJzZXIuYQorICAgIHBhcnNlci5vdXRwdXQuc2hvdWxkID09ICcoYmMpKGNiKScKKyAgZW5kCisgIAorICBleGFtcGxlICJsb3RzIG9mIGltcG9ydGVkIGxleGVycyIgZG8KKyAgICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgbGV4ZXIgZ3JhbW1hciBTbGF2ZU9mU2xhdmVzOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIAorICAgICAgSU5URUdFUjogKCcrJ3wnLScpPyBESUdJVFM7CisgICAgICBGTE9BVDogSU5URUdFUiAnLicgRElHSVRTICgoJ2UnfCdFJykgSU5URUdFUik/OworICAgICAgZnJhZ21lbnQgRElHSVRTOiAoJzAnLi4nOScpKzsKKyAgICBFTkQKKyAgICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgbGV4ZXIgZ3JhbW1hciBGaXJzdFNsYXZlOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIAorICAgICAgaW1wb3J0IFNsYXZlT2ZTbGF2ZXM7CisgICAgICAKKyAgICAgIElEOiAoJ0EnLi4nWicpKzsKKyAgICAgIE9QUzogJysnIHwgJy0nIHwgJyonIHwgJy8nOworICAgIEVORAorICAgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBsZXhlciBncmFtbWFyIFNlY29uZFNsYXZlOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIAorICAgICAgSU5UOiAoJzAnLi4nOScpKzsKKyAgICAgIElEOiAoJ2EnLi4neid8J0EnLi4nWid8J18nKSs7CisgICAgRU5ECisgICAgbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgbGV4ZXIgZ3JhbW1hciBNYXN0ZXJPZkFsbDsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5OyB9CisgICAgICAKKyAgICAgIGltcG9ydCBGaXJzdFNsYXZlLCBTZWNvbmRTbGF2ZTsKKyAgICAgIAorICAgICAgSUQ6ICgnYScuLid6J3wnQScuLidaJ3wnXycpKzsKKyAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWw9SElEREVOIH07CisgICAgRU5ECisgICAgCisgICAgTWFzdGVyT2ZBbGw6OkxleGVyLm1hc3Rlcl9ncmFtbWFycy5zaG91bGQgPT0gW10KKyAgICBNYXN0ZXJPZkFsbDo6TGV4ZXIuaW1wb3J0ZWRfZ3JhbW1hcnMuc2hvdWxkID09IFNldFsgOkZpcnN0U2xhdmUsIDpTZWNvbmRTbGF2ZSBdCisgICAgTWFzdGVyT2ZBbGw6OkxleGVyLm1hc3Rlci5zaG91bGQgYmVfbmlsCisgICAgCisgICAgTWFzdGVyT2ZBbGw6OkZpcnN0U2xhdmUubWFzdGVyX2dyYW1tYXJzLnNob3VsZCA9PSBbIDpNYXN0ZXJPZkFsbCBdCisgICAgTWFzdGVyT2ZBbGw6OkZpcnN0U2xhdmUuaW1wb3J0ZWRfZ3JhbW1hcnMuc2hvdWxkID09IFNldFsgOlNsYXZlT2ZTbGF2ZXMgXQorICAgIE1hc3Rlck9mQWxsOjpGaXJzdFNsYXZlLm1hc3Rlci5zaG91bGQgPT0gOk1hc3Rlck9mQWxsCisgICAgCisgICAgTWFzdGVyT2ZBbGw6OlNlY29uZFNsYXZlLm1hc3Rlcl9ncmFtbWFycy5zaG91bGQgPT0gWyA6TWFzdGVyT2ZBbGwgXQorICAgIE1hc3Rlck9mQWxsOjpTZWNvbmRTbGF2ZS5pbXBvcnRlZF9ncmFtbWFycy5zaG91bGQgPT0gU2V0WyBdCisgICAgTWFzdGVyT2ZBbGw6OlNlY29uZFNsYXZlLm1hc3Rlci5zaG91bGQgPT0gOk1hc3Rlck9mQWxsCisgICAgCisgICAgTWFzdGVyT2ZBbGw6OkZpcnN0U2xhdmU6OlNsYXZlT2ZTbGF2ZXMubWFzdGVyX2dyYW1tYXJzLnNob3VsZCA9PSBbIDpNYXN0ZXJPZkFsbCwgOkZpcnN0U2xhdmUgXQorICAgIE1hc3Rlck9mQWxsOjpGaXJzdFNsYXZlOjpTbGF2ZU9mU2xhdmVzLmltcG9ydGVkX2dyYW1tYXJzLnNob3VsZCA9PSBTZXRbIF0KKyAgICBNYXN0ZXJPZkFsbDo6Rmlyc3RTbGF2ZTo6U2xhdmVPZlNsYXZlcy5tYXN0ZXIuc2hvdWxkID09IDpGaXJzdFNsYXZlCisgICAgCisgICAgbWFzdGVyID0gTWFzdGVyT2ZBbGw6OkxleGVyLm5ldyggJ2JsYWggZGUgYmxhaCcgKQorICAgIG1hc3Rlci5zaG91bGQgcmVzcG9uZF90byA6Zmlyc3Rfc2xhdmUKKyAgICBtYXN0ZXIuc2hvdWxkIHJlc3BvbmRfdG8gOnNlY29uZF9zbGF2ZQorICAgIG1hc3Rlci5maXJzdF9zbGF2ZS5zaG91bGQgcmVzcG9uZF90byA6c2xhdmVfb2Zfc2xhdmVzCisgICAgbWFzdGVyLmZpcnN0X3NsYXZlLnNob3VsZCByZXNwb25kX3RvIDptYXN0ZXJfb2ZfYWxsCisgICAgbWFzdGVyLmZpcnN0X3NsYXZlLnNsYXZlX29mX3NsYXZlcy5zaG91bGQgcmVzcG9uZF90byA6Zmlyc3Rfc2xhdmUKKyAgICBtYXN0ZXIuZmlyc3Rfc2xhdmUuc2xhdmVfb2Zfc2xhdmVzLnNob3VsZCByZXNwb25kX3RvIDptYXN0ZXJfb2ZfYWxsCisgICAgZGVscyA9IG1hc3Rlci5lYWNoX2RlbGVnYXRlLm1hcCB7IHxkfCBkIH0KKyAgICBkZWxzLnNob3VsZCBoYXZlKCAyICkudGhpbmdzCisgICAgZGVscy5zaG91bGQgaW5jbHVkZSBtYXN0ZXIuZmlyc3Rfc2xhdmUKKyAgICBkZWxzLnNob3VsZCBpbmNsdWRlIG1hc3Rlci5zZWNvbmRfc2xhdmUKKyAgZW5kCisgIAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9iYXNpYy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2xleGVyL2Jhc2ljLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjAyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9iYXNpYy5yYgpAQCAtMCwwICsxLDU1OSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgTGV4ZXJUZXN0MDAxIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBaZXJvOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpSYWlzZUVycm9ycyB9CisgICAgCisgICAgWkVSTzogJzAnOworICBFTkQKKyAgCisgIGV4YW1wbGUgJShsZXhpbmcgJzAnKSBkbworICAgIGxleGVyID0gWmVybzo6TGV4ZXIubmV3KCAnMCcgKQorICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdaRVJPJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICc8RU9GPicKKyAgZW5kCisgIAorICBleGFtcGxlICUoaXRlcmF0aW5nIG92ZXIgdG9rZW5zKSBkbworICAgIGxleGVyID0gWmVybzo6TGV4ZXIubmV3KCAnMCcgKQorICAgIAorICAgIHRva2VuX3R5cGVzID0gbGV4ZXIubWFwIHsgfHRva2VufCB0b2tlbi5uYW1lIH0KKyAgICB0b2tlbl90eXBlcy5zaG91bGQgPT0gJXcoWkVSTykKKyAgZW5kCisKKyAgZXhhbXBsZSAibWlzbWF0Y2hlZCB0b2tlbiIgZG8KKyAgICBsZXhlciA9IFplcm86OkxleGVyLm5ldyggJzEnICkKKyAgICAKKyAgICBwcm9jIHsgCisgICAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB9LnNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpFcnJvcjo6TWlzbWF0Y2hlZFRva2VuICkgZG8gfGV8CisgICAgICBlLmV4cGVjdGluZy5zaG91bGQgPT0gJzAnCisgICAgICBlLnVuZXhwZWN0ZWRfdHlwZS5zaG91bGQgPT0gJzEnCisgICAgZW5kCisgIGVuZAorZW5kCisKK2NsYXNzIExleGVyVGVzdDAwMiA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgQmluYXJ5OworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpSYWlzZUVycm9ycyB9CisgICAgCisgICAgWkVSTzogJzAnOworICAgIE9ORTogJzEnOworICBFTkQKKyAgCisgIGV4YW1wbGUgImxleGluZyAnMDEnIiBkbworICAgIGxleGVyID0gQmluYXJ5OjpMZXhlci5uZXcoICcwMScgKQorICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdaRVJPJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdPTkUnCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJzxFT0Y+JworICBlbmQKKyAgCisgIGV4YW1wbGUgIm5vIG1hdGNoaW5nIHRva2VuIHJ1bGUiIGRvCisgICAgbGV4ZXIgPSBCaW5hcnk6OkxleGVyLm5ldyggJzInICkKKyAgICAKKyAgICBiID0gbGFtYmRhIHsgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuIH0KKyAgICBiLnNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpFcnJvcjo6Tm9WaWFibGVBbHRlcm5hdGl2ZSApIGRvIHxleGN8CisgICAgICBleGMudW5leHBlY3RlZF90eXBlLnNob3VsZCA9PSAnMicKKyAgICBlbmQKKyAgZW5kCisgIAorZW5kCisKK2NsYXNzIExleGVyVGVzdDAwMyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgQmluYXJ5Rm9vemU7CisgICAgb3B0aW9ucyB7CisgICAgICBsYW5ndWFnZSA9IFJ1Ynk7CisgICAgfQorICAgIAorICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OlJhaXNlRXJyb3JzIH0KKyAgICAKKyAgICBaRVJPOiAnMCc7CisgICAgT05FOiAgJzEnOworICAgIEZPT1pFOiAnZm9vemUnOworICBFTkQKKyAgCisgIGV4YW1wbGUgImxleGluZyAnMGZvb3plMSciIGRvCisgICAgbGV4ZXIgPSBCaW5hcnlGb296ZTo6TGV4ZXIubmV3KCAnMGZvb3plMScgKQorICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdaRVJPJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdGT09aRScKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnT05FJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICc8RU9GPicKKyAgZW5kCisgIAorICBleGFtcGxlICJubyB0b2tlbiBtYXRjaCIgZG8KKyAgICBsZXhlciA9IEJpbmFyeUZvb3plOjpMZXhlci5uZXcoICcyJyApCisgICAgCisgICAgcHJvYyB7IGxleGVyLm5leHRfdG9rZW4gfS4KKyAgICBzaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6RXJyb3I6Ok5vVmlhYmxlQWx0ZXJuYXRpdmUgKSBkbyB8ZXhjfAorICAgICAgZXhjLnVuZXhwZWN0ZWRfdHlwZS5zaG91bGQgPT0gJzInCisgICAgZW5kCisgIGVuZAorZW5kCisKKworY2xhc3MgTGV4ZXJUZXN0MDA0IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBGb29TdGFyOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpSYWlzZUVycm9ycyB9CisgICAgCisgICAgRk9POiAnZicgJ28nKjsKKyAgRU5ECisKKyAgZXhhbXBsZSAibGV4aW5nICdmZm9mb29mb29vJyIgZG8KKyAgICBsZXhlciA9IEZvb1N0YXI6OkxleGVyLm5ldyggJ2Zmb2Zvb2Zvb28nICkKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAwCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMAorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdGT08nCisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gJ2ZvJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAxCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMgorICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdGT08nCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDMKKyAgICB0b2tlbi5zdG9wLnNob3VsZCA9PSA1CisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gJ2ZvbycKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSA2CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gOQorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmb29vJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICc8RU9GPicKKyAgZW5kCisgIAorICBleGFtcGxlICJtaXNtYXRjaGVkIHRva2VuIiBkbworICAgIGxleGVyID0gRm9vU3Rhcjo6TGV4ZXIubmV3KCAnMicgKQorICAgIAorICAgIHByb2MgeyBsZXhlci5uZXh0X3Rva2VuIH0uCisgICAgc2hvdWxkIHJhaXNlX2Vycm9yKCBBTlRMUjM6OkVycm9yOjpNaXNtYXRjaGVkVG9rZW4gKSBkbyB8ZXhjfAorICAgICAgZXhjLmV4cGVjdGluZy5zaG91bGQgPT0gJ2YnCisgICAgICBleGMudW5leHBlY3RlZF90eXBlLnNob3VsZCA9PSAnMicKKyAgICBlbmQKKyAgZW5kCitlbmQKKworY2xhc3MgTGV4ZXJUZXN0MDA1IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBGb29QbHVzOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpSYWlzZUVycm9ycyB9CisgICAgCisgICAgRk9POiAnZicgJ28nKzsKKyAgRU5ECisgIAorICBleGFtcGxlICJsZXhpbmcgJ2ZvZm9vZm9vbyciIGRvCisgICAgbGV4ZXIgPSBGb29QbHVzOjpMZXhlci5uZXcoICdmb2Zvb2Zvb28nICkKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAwCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMQorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmbycKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmb28nCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDIKKyAgICB0b2tlbi5zdG9wLnNob3VsZCA9PSA0CisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ0ZPTycKKyAgICB0b2tlbi5zdGFydC5zaG91bGQgPT0gNQorICAgIHRva2VuLnN0b3Auc2hvdWxkID09IDgKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnZm9vbycKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnPEVPRj4nCisgIGVuZAorICAKKyAgZXhhbXBsZSAibWlzbWF0Y2hlZCB0b2tlbiIgZG8KKyAgICBsZXhlciA9IEZvb1BsdXM6OkxleGVyLm5ldyggJzInICkKKyAgICAKKyAgICBwcm9jIHsgbGV4ZXIubmV4dF90b2tlbiB9LgorICAgIHNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpFcnJvcjo6TWlzbWF0Y2hlZFRva2VuICkgZG8gfGV4Y3wKKyAgICAgIGV4Yy5leHBlY3Rpbmcuc2hvdWxkID09ICdmJworICAgICAgZXhjLnVuZXhwZWN0ZWRfdHlwZS5zaG91bGQgPT0gJzInCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAiZWFybHkgZXhpdCIgZG8KKyAgICBsZXhlciA9IEZvb1BsdXM6OkxleGVyLm5ldyggJ2YnICkKKyAgICAKKyAgICBwcm9jIHsgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuIH0uCisgICAgc2hvdWxkIHJhaXNlX2Vycm9yKCBBTlRMUjM6OkVycm9yOjpFYXJseUV4aXQgKSB7IHxleGN8CisgICAgICBleGMudW5leHBlY3RlZF90eXBlLnNob3VsZCA9PSBBTlRMUjM6OkNvbnN0YW50czo6RU9GCisgICAgfQorICBlbmQKKyAgCitlbmQKKworY2xhc3MgTGV4ZXJUZXN0MDA2IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBGb2FTdGFyOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpSYWlzZUVycm9ycyB9CisgICAgCisgICAgRk9POiAnZicgKCdvJyB8ICdhJykqOworICBFTkQKKyAgCisgIGV4YW1wbGUgImxleGluZyAnZm9mYWFvb2EnIiBkbworICAgIGxleGVyID0gRm9hU3Rhcjo6TGV4ZXIubmV3KCAnZm9mYWFvb2EnICkKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAwCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMQorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmbycKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmYWFvb2EnCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDIKKyAgICB0b2tlbi5zdG9wLnNob3VsZCA9PSA3CisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJzxFT0Y+JworICBlbmQKKyAgCisgIGV4YW1wbGUgIm1pc21hdGNoZWQgdG9rZW4iIGRvCisgICAgbGV4ZXIgPSBGb2FTdGFyOjpMZXhlci5uZXcoICdmb2ZvYW9vYW9hMicgKQorICAgIAorICAgIGxleGVyLm5leHRfdG9rZW4KKyAgICBsZXhlci5uZXh0X3Rva2VuCisgICAgcHJvYyB7IGxleGVyLm5leHRfdG9rZW4gfS4KKyAgICBzaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6RXJyb3I6Ok1pc21hdGNoZWRUb2tlbiApIGRvIHxleGN8CisgICAgICBleGMuZXhwZWN0aW5nLnNob3VsZCA9PSAnZicKKyAgICAgIGV4Yy51bmV4cGVjdGVkX3R5cGUuc2hvdWxkID09ICcyJworICAgICAgZXhjLmNvbHVtbi5zaG91bGQgPT0gMTAKKyAgICAgIGV4Yy5saW5lLnNob3VsZCA9PSAxCisgICAgZW5kCisgIGVuZAorZW5kCisKK2NsYXNzIExleGVyVGVzdDAwNyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgRm9hYjsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6UmFpc2VFcnJvcnMgfQorICAgIAorICAgIEZPTzogJ2YnICgnbycgfCAnYScgJ2InKykqOworICBFTkQKKyAgCisgIGV4YW1wbGUgImxleGluZyAnZm9mYWJhYmJvb2FiYiciIGRvCisgICAgbGV4ZXIgPSBGb2FiOjpMZXhlci5uZXcoICdmb2ZhYmFiYm9vYWJiJyApCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ0ZPTycKKyAgICB0b2tlbi5zdGFydC5zaG91bGQgPT0gMAorICAgIHRva2VuLnN0b3Auc2hvdWxkID09IDEKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnZm8nCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ0ZPTycKKyAgICB0b2tlbi5zdGFydC5zaG91bGQgPT0gMgorICAgIHRva2VuLnN0b3Auc2hvdWxkID09IDEyCisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gJ2ZhYmFiYm9vYWJiJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICc8RU9GPicKKyAgZW5kCisgIAorICBleGFtcGxlICJlYXJseSBleGl0IiBkbworICAgIGxleGVyID0gRm9hYjo6TGV4ZXIubmV3KCAnZm9hYm9hbycgKQorICAgIAorICAgIHByb2MgeyBsZXhlci5uZXh0X3Rva2VuIH0uCisgICAgc2hvdWxkIHJhaXNlX2Vycm9yKCBBTlRMUjM6OkVycm9yOjpFYXJseUV4aXQgKSBkbyB8ZXhjfAorICAgICAgZXhjLnVuZXhwZWN0ZWRfdHlwZS5zaG91bGQgPT0gJ28nCisgICAgICBleGMuY29sdW1uLnNob3VsZCA9PSA2CisgICAgICBleGMubGluZS5zaG91bGQgPT0gMQorICAgIGVuZAorICBlbmQKK2VuZAorCitjbGFzcyBMZXhlclRlc3QwMDggPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBsZXhlciBncmFtbWFyIEZhOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpSYWlzZUVycm9ycyB9CisgICAgCisgICAgRk9POiAnZicgJ2EnPzsKKyAgRU5ECisgIAorICBleGFtcGxlICJsZXhpbmcgJ2ZmYWYnIiBkbworICAgIGxleGVyID0gRmE6OkxleGVyLm5ldyggJ2ZmYWYnICkKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRk9PJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAwCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMAorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdGT08nCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDEKKyAgICB0b2tlbi5zdG9wLnNob3VsZCA9PSAyCisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gJ2ZhJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdGT08nCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDMKKyAgICB0b2tlbi5zdG9wLnNob3VsZCA9PSAzCisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gJ2YnCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJzxFT0Y+JworICBlbmQKKyAgCisgIGV4YW1wbGUgIm1pc21hdGNoZWQgdG9rZW4iIGRvCisgICAgbGV4ZXIgPSBGYTo6TGV4ZXIubmV3KCAnZmFmYicgKQorICAgIAorICAgIGxleGVyLm5leHRfdG9rZW4KKyAgICBsZXhlci5uZXh0X3Rva2VuCisgICAgcHJvYyB7IGxleGVyLm5leHRfdG9rZW4gfS4KKyAgICBzaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6RXJyb3I6Ok1pc21hdGNoZWRUb2tlbiApIGRvIHxleGN8CisgICAgICBleGMudW5leHBlY3RlZF90eXBlLnNob3VsZCA9PSAnYicKKyAgICAgIGV4Yy5jb2x1bW4uc2hvdWxkID09IDMKKyAgICAgIGV4Yy5saW5lLnNob3VsZCA9PSAxCisgICAgZW5kCisgIGVuZAorZW5kCisKKworY2xhc3MgTGV4ZXJUZXN0MDA5IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBEaWdpdDsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6UmFpc2VFcnJvcnMgfQorICAgIAorICAgIERJR0lUOiAnMCcgLi4gJzknOworICBFTkQKKyAgCisgIGV4YW1wbGUgImxleGluZyAnMDg1JyIgZG8KKyAgICBsZXhlciA9IERpZ2l0OjpMZXhlci5uZXcoICcwODUnICkKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnRElHSVQnCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDAKKyAgICB0b2tlbi5zdG9wLnNob3VsZCA9PSAwCisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gJzAnCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ0RJR0lUJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAxCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMQorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICc4JworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdESUdJVCcKKyAgICB0b2tlbi5zdGFydC5zaG91bGQgPT0gMgorICAgIHRva2VuLnN0b3Auc2hvdWxkID09IDIKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnNScKKyAgICAKKyAgICB0b2tlbiA9IGxleGVyLm5leHRfdG9rZW4KKyAgICB0b2tlbi5uYW1lLnNob3VsZCA9PSAnPEVPRj4nCisgIGVuZAorICAKKyAgZXhhbXBsZSAibWlzbWF0Y2hlZCByYW5nZSIgZG8KKyAgICBsZXhlciA9IERpZ2l0OjpMZXhlci5uZXcoICcyYScgKQorICAgIAorICAgIGxleGVyLm5leHRfdG9rZW4KKyAgICBwcm9jIHsgbGV4ZXIubmV4dF90b2tlbiB9LgorICAgIHNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpFcnJvcjo6TWlzbWF0Y2hlZFJhbmdlICkgZG8gfGV4Y3wKKyAgICAgIGV4Yy5taW4uc2hvdWxkID09ICcwJworICAgICAgZXhjLm1heC5zaG91bGQgPT0gJzknCisgICAgICBleGMudW5leHBlY3RlZF90eXBlLnNob3VsZCA9PSAnYScKKyAgICAgIGV4Yy5jb2x1bW4uc2hvdWxkID09IDEKKyAgICAgIGV4Yy5saW5lLnNob3VsZCA9PSAxCisgICAgZW5kCisgIGVuZAorZW5kCisKK2NsYXNzIExleGVyVGVzdDAxMCA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgSURzQW5kU3BhY2VzOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAgICAgCisgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6UmFpc2VFcnJvcnMgfQorICAgIAorICAgIElERU5USUZJRVI6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKjsKKyAgICBXUzogKCcgJyB8ICdcbicpKzsKKyAgRU5ECisKKyAgZXhhbXBsZSAibGV4aW5nICdmb29iYXIgX0FiOTggXG4gQTEyc2RmJyIgZG8KKyAgICBsZXhlciA9IElEc0FuZFNwYWNlczo6TGV4ZXIubmV3KCAiZm9vYmFyIF9BYjk4IFxuIEExMnNkZiIgKQorICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdJREVOVElGSUVSJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAwCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gNQorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmb29iYXInCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ1dTJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSA2CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gNgorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICcgJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdJREVOVElGSUVSJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSA3CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMTEKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnX0FiOTgnCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ1dTJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAxMgorICAgIHRva2VuLnN0b3Auc2hvdWxkID09IDE0CisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gIiBcbiAiCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ0lERU5USUZJRVInCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDE1CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMjAKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnQTEyc2RmJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICc8RU9GPicKKyAgZW5kCisgIAorICBleGFtcGxlICJjb250YWlucyBjaGFyYWN0ZXJzIHdpdGhvdXQgYSBtYXRjaGluZyB0b2tlbiBydWxlIiBkbworICAgIGxleGVyID0gSURzQW5kU3BhY2VzOjpMZXhlci5uZXcoICdhLWInICkKKyAgICAKKyAgICBsZXhlci5uZXh0X3Rva2VuCisgICAgcHJvYyB7IGxleGVyLm5leHRfdG9rZW4gfS4KKyAgICBzaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6RXJyb3I6Ok5vVmlhYmxlQWx0ZXJuYXRpdmUgKSBkbyB8ZXhjfAorICAgICAgZXhjLnVuZXhwZWN0ZWRfdHlwZS5zaG91bGQgPT0gJy0nCisgICAgICBleGMuY29sdW1uLnNob3VsZCA9PSAxCisgICAgICBleGMubGluZS5zaG91bGQgPT0gMQorICAgIGVuZAorICBlbmQKK2VuZAorCitjbGFzcyBMZXhlclRlc3QwMTEgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBsZXhlciBncmFtbWFyIElEc1dpdGhBY3Rpb247CisgICAgb3B0aW9ucyB7bGFuZ3VhZ2UgPSBSdWJ5O30KKyAgICAgICAgCisgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6UmFpc2VFcnJvcnMgfQorICAgIAorICAgIElERU5USUZJRVI6IAorICAgICAgICAgICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgCisgICAgICAgICAgICAoJ2EnLi4neicKKyAgICAgICAgICAgIHwnQScuLidaJworICAgICAgICAgICAgfCcwJy4uJzknCisgICAgICAgICAgICB8J18nIHsgXCRhY3Rpb25fdmFyID0gJ18nIH0KKyAgICAgICAgICAgICkqCisgICAgICAgIDsKKyAgICAKKyAgICBXUzogKCcgJyB8ICdcbicpKzsKKyAgRU5ECisgIAorICBleGFtcGxlICJsZXhpbmcgJ2Zvb2JhciBfQWI5OCBcbiBBMTJzZGYnIiBkbworICAgIGxleGVyID0gSURzV2l0aEFjdGlvbjo6TGV4ZXIubmV3KCAiZm9vYmFyIF9BYjk4IFxuIEExMnNkZiIgKQorICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdJREVOVElGSUVSJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAwCisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gNQorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICdmb29iYXInCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ1dTJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSA2CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gNgorICAgIHRva2VuLnRleHQuc2hvdWxkID09ICcgJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICdJREVOVElGSUVSJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSA3CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMTEKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnX0FiOTgnCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ1dTJworICAgIHRva2VuLnN0YXJ0LnNob3VsZCA9PSAxMgorICAgIHRva2VuLnN0b3Auc2hvdWxkID09IDE0CisgICAgdG9rZW4udGV4dC5zaG91bGQgPT0gIiBcbiAiCisgICAgCisgICAgdG9rZW4gPSBsZXhlci5uZXh0X3Rva2VuCisgICAgdG9rZW4ubmFtZS5zaG91bGQgPT0gJ0lERU5USUZJRVInCisgICAgdG9rZW4uc3RhcnQuc2hvdWxkID09IDE1CisgICAgdG9rZW4uc3RvcC5zaG91bGQgPT0gMjAKKyAgICB0b2tlbi50ZXh0LnNob3VsZCA9PSAnQTEyc2RmJworICAgIAorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICAgIHRva2VuLm5hbWUuc2hvdWxkID09ICc8RU9GPicKKyAgZW5kCisgIAorICBleGFtcGxlICJjb250YWlucyBjaGFyYWN0ZXJzIHdpdGhvdXQgYSBtYXRjaGluZyB0b2tlbiIgZG8KKyAgICBsZXhlciA9IElEc1dpdGhBY3Rpb246OkxleGVyLm5ldyggJ2EtYicgKQorICAgIAorICAgIGxleGVyLm5leHRfdG9rZW4KKyAgICBwcm9jIHsgbGV4ZXIubmV4dF90b2tlbiB9LgorICAgIHNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpFcnJvcjo6Tm9WaWFibGVBbHRlcm5hdGl2ZSApIGRvIHxleGN8CisgICAgICBleGMudW5leHBlY3RlZF90eXBlLnNob3VsZCA9PSAnLScKKyAgICAgIGV4Yy5jb2x1bW4uc2hvdWxkID09IDEKKyAgICAgIGV4Yy5saW5lLnNob3VsZCA9PSAxCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9maWx0ZXItbW9kZS5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2xleGVyL2ZpbHRlci1tb2RlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODBjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9maWx0ZXItbW9kZS5yYgpAQCAtMCwwICsxLDI0NCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0RmlsdGVyTW9kZSA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBGaWx0ZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICAgICAgZmlsdGVyPXRydWU7CisgICAgfQorICAgIAorICAgIElNUE9SVAorICAgICAgOiAgJ2ltcG9ydCcgV1MgUUlEU3RhciBXUz8gJzsnCisgICAgICA7CisgICAgICAKKyAgICBSRVRVUk4KKyAgICAgIDogICdyZXR1cm4nIC4qICc7JworICAgICAgOworICAgIAorICAgIENMQVNTCisgICAgICA6ICAnY2xhc3MnIFdTIElEIFdTPyAoJ2V4dGVuZHMnIFdTIFFJRCBXUz8pPworICAgICAgICAoJ2ltcGxlbWVudHMnIFdTIFFJRCBXUz8gKCcsJyBXUz8gUUlEIFdTPykqKT8gJ3snCisgICAgICA7CisgICAgICAKKyAgICBDT01NRU5UCisgICAgICAgIDogICAnLyonIC4qICcqLycKKyAgICAgICAgOworICAgIAorICAgIFNUUklORworICAgICAgICA6ICAnIicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OiBFU0MgfCAuKSogJyInCisgICAgICA7CisgICAgCisgICAgQ0hBUgorICAgICAgOiAgJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnXCcnCisgICAgICA7CisgICAgCisgICAgV1MgIDogICAoJyAnfCdcdCd8J1xuJykrCisgICAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIFFJRCA6ICBJRCAoJy4nIElEKSoKKyAgICAgIDsKKyAgICAgIAorICAgIC8qKiBRSUQgY2Fubm90IHNlZSBiZXlvbmQgZW5kIG9mIHRva2VuIHNvIHVzaW5nIFFJRCAnLionPyBzb21ld2hlcmUgd29uJ3QKKyAgICAgKiAgZXZlciBtYXRjaCBzaW5jZSBrPTEgbG9vayBpbiB0aGUgUUlEIGxvb3Agb2YgJy4nIHdpbGwgbWFrZSBpdCBsb29wLgorICAgICAqICBJIG1hZGUgdGhpcyBydWxlIHRvIGNvbXBlbnNhdGUuCisgICAgICovCisgICAgZnJhZ21lbnQKKyAgICBRSURTdGFyCisgICAgICA6ICBJRCAoJy4nIElEKSogJy4qJz8KKyAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIFRZUEU6ICAgUUlEICdbXSc/CisgICAgICAgIDsKKyAgICAgICAgCisgICAgZnJhZ21lbnQKKyAgICBBUkcgOiAgIFRZUEUgV1MgSUQKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50CisgICAgSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50CisgICAgRVNDICA6ICAnXFwnICgnIid8J1wnJ3wnXFwnKQorICAgICAgOworICBFTkQKKworICBleGFtcGxlICJza2lwcGluZyB0b2tlbnMgdGhhdCBhcmVuJ3QgaW1wb3J0YW50IHdpdGggZmlsdGVyIG1vZGUiIGRvCisgICAgaW5wdXQgPSA8PC1FTkQuZml4ZWRfaW5kZW50KCAwICkKKyAgICAgIGltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworICAgICAgCisgICAgICBwdWJsaWMgY2xhc3MgTWFpbiB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzW2ldKTsKKyAgICAgICAgICBGdXp6eUphdmEgbGV4ID0gbmV3IEZ1enp5SmF2YShpbnB1dCk7CisgICAgICAgICAgVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleCk7CisgICAgICAgICAgdG9rZW5zLnRvU3RyaW5nKCk7CisgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIEVORAorICAgIAorICAgIGxleGVyID0gRmlsdGVyOjpMZXhlci5uZXcoIGlucHV0ICkKKyAgICB0b2tlbnMgPSBsZXhlci5tYXAgeyB8dGt8IHRrIH0KKyAgZW5kCisgIAorCitlbmQKKworCitjbGFzcyBUZXN0RnV6enkgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgRnV6enk7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICAgICAgZmlsdGVyPXRydWU7CisgICAgfQorICAgIAorICAgIEBtZW1iZXJzIHsKKyAgICAgIGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0CisgICAgfQorICAgIAorICAgIElNUE9SVAorICAgICAgOiAgJ2ltcG9ydCcgV1MgbmFtZT1RSURTdGFyIFdTPyAnOycKKyAgICAgIDsKKyAgICAgIAorICAgIC8qKiBBdm9pZHMgaGF2aW5nICJyZXR1cm4gZm9vOyIgbWF0Y2ggYXMgYSBmaWVsZCAqLworICAgIFJFVFVSTgorICAgICAgOiAgJ3JldHVybicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9Oi4pKiAnOycKKyAgICAgIDsKKyAgICAKKyAgICBDTEFTUworICAgICAgOiAgJ2NsYXNzJyBXUyBuYW1lPUlEIFdTPyAoJ2V4dGVuZHMnIFdTIFFJRCBXUz8pPworICAgICAgICAoJ2ltcGxlbWVudHMnIFdTIFFJRCBXUz8gKCcsJyBXUz8gUUlEIFdTPykqKT8gJ3snCisgICAgICAgIHsgIAorICAgICAgICAgIHNheSgiZm91bmQgY2xhc3MgIiA8PCAkbmFtZS50ZXh0KSAgCisgICAgICAgIH0KKyAgICAgIDsKKyAgICAgIAorICAgIE1FVEhPRAorICAgICAgICA6ICAgVFlQRSBXUyBuYW1lPUlEIFdTPyAnKCcgKCBBUkcgV1M/ICgnLCcgV1M/IEFSRyBXUz8pKiApPyAnKScgV1M/IAorICAgICAgICAgICAoJ3Rocm93cycgV1MgUUlEIFdTPyAoJywnIFdTPyBRSUQgV1M/KSopPyAneycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2F5KCJmb3VuZCBtZXRob2QgIiA8PCAkbmFtZS50ZXh0KQorICAgICAgICAgICAgfQorICAgICAgICA7CisgICAgCisgICAgRklFTEQKKyAgICAgICAgOiAgIFRZUEUgV1MgbmFtZT1JRCAnW10nPyBXUz8gKCc7J3wnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNheSgiZm91bmQgdmFyICIgPDwgJG5hbWUudGV4dCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgOworICAgIAorICAgIFNUQVQ6ICAoJ2lmJ3wnd2hpbGUnfCdzd2l0Y2gnfCdmb3InKSBXUz8gJygnIDsKKyAgICAgIAorICAgIENBTEwKKyAgICAgICAgOiAgIG5hbWU9UUlEIFdTPyAnKCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2F5KCJmb3VuZCBjYWxsICIgPDwgJG5hbWUudGV4dCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgOworICAgIAorICAgIENPTU1FTlQKKyAgICAgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNheSgiZm91bmQgY29tbWVudCAiIDw8IHNlbGYudGV4dCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgOworICAgIAorICAgIFNMX0NPTU1FTlQKKyAgICAgICAgOiAgICcvLycgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnXG4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNheSgiZm91bmQgLy8gY29tbWVudCAiIDw8IHNlbGYudGV4dCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgOworICAgICAgCisgICAgU1RSSU5HCisgICAgICA6ICAnIicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OiBFU0MgfCAuKSogJyInCisgICAgICA7CisgICAgCisgICAgQ0hBUgorICAgICAgOiAgJ1wnJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IEVTQyB8IC4pKiAnXCcnCisgICAgICA7CisgICAgCisgICAgV1MgIDogICAoJyAnfCdcdCd8J1xuJykrCisgICAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIFFJRCA6ICBJRCAoJy4nIElEKSoKKyAgICAgIDsKKyAgICAgIAorICAgIC8qKiBRSUQgY2Fubm90IHNlZSBiZXlvbmQgZW5kIG9mIHRva2VuIHNvIHVzaW5nIFFJRCAnLionPyBzb21ld2hlcmUgd29uJ3QKKyAgICAgKiAgZXZlciBtYXRjaCBzaW5jZSBrPTEgbG9vayBpbiB0aGUgUUlEIGxvb3Agb2YgJy4nIHdpbGwgbWFrZSBpdCBsb29wLgorICAgICAqICBJIG1hZGUgdGhpcyBydWxlIHRvIGNvbXBlbnNhdGUuCisgICAgICovCisgICAgZnJhZ21lbnQKKyAgICBRSURTdGFyCisgICAgICA6ICBJRCAoJy4nIElEKSogJy4qJz8KKyAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIFRZUEU6ICAgUUlEICdbXSc/CisgICAgICAgIDsKKyAgICAgICAgCisgICAgZnJhZ21lbnQKKyAgICBBUkcgOiAgIFRZUEUgV1MgSUQKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50CisgICAgSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50CisgICAgRVNDICA6ICAnXFwnICgnIid8J1wnJ3wnXFwnKQorICAgICAgOworICBFTkQKKyAgCisgIGV4YW1wbGUgImZ1enp5IGxleGluZyB3aXRoIHRoZSBmaWx0ZXIgbW9kZSBvcHRpb24iIGRvCisgICAgaW5wdXQgPSA8PC1FTkQuZml4ZWRfaW5kZW50KCAwICkKKyAgICAgIGltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworICAgICAgCisgICAgICBwdWJsaWMgY2xhc3MgTWFpbiB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzW2ldKTsKKyAgICAgICAgICBGdXp6eUphdmEgbGV4ID0gbmV3IEZ1enp5SmF2YShpbnB1dCk7CisgICAgICAgICAgVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleCk7CisgICAgICAgICAgdG9rZW5zLnRvU3RyaW5nKCk7CisgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIEVORAorICAgIAorICAgIGV4cGVjdGVkX291dHB1dCA9IDw8LUVORC5maXhlZF9pbmRlbnQoIDAgKQorICAgICAgZm91bmQgY2xhc3MgTWFpbgorICAgICAgZm91bmQgbWV0aG9kIG1haW4KKyAgICAgIGZvdW5kIHZhciBpCisgICAgICBmb3VuZCB2YXIgaW5wdXQKKyAgICAgIGZvdW5kIGNhbGwgQU5UTFJGaWxlU3RyZWFtCisgICAgICBmb3VuZCB2YXIgbGV4CisgICAgICBmb3VuZCBjYWxsIEZ1enp5SmF2YQorICAgICAgZm91bmQgdmFyIHRva2VucworICAgICAgZm91bmQgY2FsbCBDb21tb25Ub2tlblN0cmVhbQorICAgICAgZm91bmQgY2FsbCB0b2tlbnMudG9TdHJpbmcKKyAgICAgIGZvdW5kIC8vIGNvbW1lbnQgLy9TeXN0ZW0ub3V0LnByaW50bG4odG9rZW5zKTsKKyAgICBFTkQKKyAgICAKKyAgICBsZXhlciA9IEZ1enp5OjpMZXhlci5uZXcoIGlucHV0ICkKKyAgICBsZXhlci5lYWNoIHsgfHRrfCB0ayB9CisgICAgbGV4ZXIub3V0cHV0LnNob3VsZCA9PSBleHBlY3RlZF9vdXRwdXQKKyAgZW5kCisKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9udWFuY2VzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvbnVhbmNlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY2YjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvbnVhbmNlcy5yYgpAQCAtMCwwICsxLDQ2IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RCdWc4MCA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgQnVnODA7CisgICAgb3B0aW9ucyB7IGxhbmd1YWdlID0gUnVieTsgfQorICAgICAKKyAgICBJRF9MSUtFCisgICAgICAgIDogJ2RlZmluZWQnIAorICAgICAgICB8IHtmYWxzZX0/IElkZW50aWZpZXIgCisgICAgICAgIHwgSWRlbnRpZmllciAKKyAgICAgICAgOyAKKyAgICAgCisgICAgZnJhZ21lbnQKKyAgICAvLyB3aXRoIGp1c3QgJ2EnLCBvdXRwdXQgY29tcGlsZXMKKyAgICBJZGVudGlmaWVyOiAnYScuLid6JysgOworICBFTkQKKyAgCisgIGV4YW1wbGUgInVtLi4uIHNvbWV0aGluZyIgZG8KKyAgICBsZXhlciA9IEJ1ZzgwOjpMZXhlci5uZXcoICdkZWZpbmVkJyApCisgICAgdG9rZW5zID0gbGV4ZXIuZWFjaCB7IHx0a3wgdGsgfQorICBlbmQKK2VuZAorCisKK2NsYXNzIFRlc3RFT0YgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgRW5kT2ZGaWxlOworICAgIAorICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBLRU5EOiBFT0Y7CisgICAgU1BBQ0U6ICcgJzsKKyAgRU5ECisgIAorICBleGFtcGxlICdyZWZlcmVuY2luZyBFT0YgaW4gYSBydWxlJyBkbworICAgIGxleGVyID0gRW5kT2ZGaWxlOjpMZXhlci5uZXcoICIgIiApCisgICAgdGtzID0gbGV4ZXIubWFwIHsgfHRrfCB0ayB9CisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9wcm9wZXJ0aWVzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvcHJvcGVydGllcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI3MjRkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvcHJvcGVydGllcy5yYgpAQCAtMCwwICsxLDEwMyBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0TGV4ZXJSdWxlUmVmZXJlbmNlIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBsZXhlciBncmFtbWFyIFJ1bGVQcm9wZXJ0eTsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQGxleGVyOjppbml0IHsKKyAgICAgIEBwcm9wZXJ0aWVzID0gW10KKyAgICB9CisgICAgQGxleGVyOjptZW1iZXJzIHsKKyAgICAgIGF0dHJfcmVhZGVyIDpwcm9wZXJ0aWVzCisgICAgfQorICAgIAorICAgIElERU5USUZJRVI6IAorICAgICAgICAgICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEBwcm9wZXJ0aWVzIDw8IFskdGV4dCwgJHR5cGUsICRsaW5lLCAkcG9zLCAkaW5kZXgsICRjaGFubmVsLCAkc3RhcnQsICRzdG9wXQorICAgICAgICAgICAgfQorICAgICAgICA7CisgICAgV1M6ICgnICcgfCAnXG4nKSs7CisgIEVORAorCisgIGV4YW1wbGUgInJlZmVyZW5jaW5nIGxleGVyIHJ1bGUgcHJvcGVydGllcyIgZG8KKyAgICBsZXhlciA9IFJ1bGVQcm9wZXJ0eTo6TGV4ZXIubmV3KCAiZm9vYmFyIF9hYjk4IFxuIEExMnNkZiIgKQorICAgIHRva2VucyA9IGxleGVyLm1hcCB7IHx0a3wgdGsgfQorICAgIAorICAgIGxleGVyLnByb3BlcnRpZXMuc2hvdWxkIGhhdmUoIDMgKS50aGluZ3MKKyAgICB0ZXh0LCB0eXBlLCBsaW5lLCBwb3MsIGluZGV4LCBjaGFubmVsLCBzdGFydCwgc3RvcCA9IGxleGVyLnByb3BlcnRpZXNbIDAgXQorICAgIHRleHQuc2hvdWxkID09ICdmb29iYXInCisgICAgdHlwZS5zaG91bGQgPT0gUnVsZVByb3BlcnR5OjpUb2tlbkRhdGE6OklERU5USUZJRVIKKyAgICBsaW5lLnNob3VsZCA9PSAxCisgICAgcG9zLnNob3VsZCA9PSAwCisgICAgaW5kZXguc2hvdWxkID09IC0xCisgICAgY2hhbm5lbC5zaG91bGQgPT0gQU5UTFIzOjpERUZBVUxUX0NIQU5ORUwKKyAgICBzdGFydC5zaG91bGQgPT0gMAorICAgIHN0b3Auc2hvdWxkID09IDUKKyAgICAKKyAgICB0ZXh0LCB0eXBlLCBsaW5lLCBwb3MsIGluZGV4LCBjaGFubmVsLCBzdGFydCwgc3RvcCA9IGxleGVyLnByb3BlcnRpZXNbIDEgXQorICAgIHRleHQuc2hvdWxkID09ICdfYWI5OCcKKyAgICB0eXBlLnNob3VsZCA9PSBSdWxlUHJvcGVydHk6OlRva2VuRGF0YTo6SURFTlRJRklFUgorICAgIGxpbmUuc2hvdWxkID09IDEKKyAgICBwb3Muc2hvdWxkID09IDcKKyAgICBpbmRleC5zaG91bGQgPT0gLTEKKyAgICBjaGFubmVsLnNob3VsZCA9PSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorICAgIHN0YXJ0LnNob3VsZCA9PSA3CisgICAgc3RvcC5zaG91bGQgPT0gMTEKKyAgICAKKyAgICBsZXhlci5wcm9wZXJ0aWVzLnNob3VsZCBoYXZlKCAzICkudGhpbmdzCisgICAgdGV4dCwgdHlwZSwgbGluZSwgcG9zLCBpbmRleCwgY2hhbm5lbCwgc3RhcnQsIHN0b3AgPSBsZXhlci5wcm9wZXJ0aWVzWyAyIF0KKyAgICB0ZXh0LnNob3VsZCA9PSAnQTEyc2RmJworICAgIHR5cGUuc2hvdWxkID09IFJ1bGVQcm9wZXJ0eTo6VG9rZW5EYXRhOjpJREVOVElGSUVSCisgICAgbGluZS5zaG91bGQgPT0gMgorICAgIHBvcy5zaG91bGQgPT0gMQorICAgIGluZGV4LnNob3VsZCA9PSAtMQorICAgIGNoYW5uZWwuc2hvdWxkID09IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisgICAgc3RhcnQuc2hvdWxkID09IDE1CisgICAgc3RvcC5zaG91bGQgPT0gMjAKKyAgZW5kCisKKworZW5kCisKK2NsYXNzIFRlc3RMZXhlclJ1bGVMYWJlbCA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgTGV4ZXJSdWxlTGFiZWw7CisgICAgb3B0aW9ucyB7CisgICAgICBsYW5ndWFnZSA9IFJ1Ynk7CisgICAgfQorICAgIAorICAgIEBtZW1iZXJzIHsgYXR0cl9yZWFkZXIgOnRva2VuX3RleHQgfQorICAgIAorICAgIEE6ICdhJy4uJ3onIFdTICcwJy4uJzknCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEB0b2tlbl90ZXh0ID0gJFdTLnRleHQKKyAgICAgICAgICAgIH0KKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50IFdTICA6CisgICAgICAgICAgICAoICAgJyAnCisgICAgICAgICAgICB8ICAgJ1x0JworICAgICAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICAgICAgfAknXHJcbicKKyAgICAgICAgICAgICAgICB8CSdccicKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApKworICAgICAgICAgICAgeyAkY2hhbm5lbCA9IEhJRERFTiB9CisgICAgICAgIDsKKyAgRU5ECisgIAorICBleGFtcGxlICJyZWZlcmVuY2luZyBvdGhlciB0b2tlbiBydWxlIHZhbHVlcyB3aXRoIGxhYmVscyIgZG8KKyAgICBsZXhlciA9IExleGVyUnVsZUxhYmVsOjpMZXhlci5uZXcgJ2EgIDInCisgICAgbGV4ZXIubmV4dF90b2tlbgorICAgIGxleGVyLnRva2VuX3RleHQuc2hvdWxkID09ICcgICcKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvc3luLXByZWQucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9sZXhlci9zeW4tcHJlZC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRhNTdhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIvc3luLXByZWQucmIKQEAgLTAsMCArMSwzMSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0U3ludGFjdGljUHJlZGljYXRlIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBTeW50YWN0aWNQcmVkaWNhdGVHYXRlOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBGT08KKyAgICAgIDogKCdhYicpPT4gQQorICAgICAgfCAoJ2FjJyk9PiBCCisgICAgICA7CisgICAgCisgICAgZnJhZ21lbnQKKyAgICBBOiAnYSc7CisgICAgCisgICAgZnJhZ21lbnQKKyAgICBCOiAnYSc7CisgIEVORAorCisgIGV4YW1wbGUgJ2dhdGluZyBzeW50YWN0aWMgcHJlZGljYXRlIHJ1bGUnIGRvCisgICAgbGV4ZXIgPSBTeW50YWN0aWNQcmVkaWNhdGVHYXRlOjpMZXhlci5uZXcoICdhYycgKQorICAgIHRva2VuID0gbGV4ZXIubmV4dF90b2tlbgorICBlbmQKKworCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2xleGVyL3htbC5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL2xleGVyL3htbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTljYWZlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvbGV4ZXIveG1sLnJiCkBAIC0wLDAgKzEsMjA2IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFhNTExleGVyVGVzdCA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGxleGVyIGdyYW1tYXIgWE1MOworICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAKKyAgICBAbWVtYmVycyB7CisgICAgICBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dAorICAgICAgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OlJhaXNlRXJyb3JzCisgICAgICAKKyAgICAgIGRlZiBxdW90ZSh0ZXh0KQorICAgICAgICB0ZXh0ID0gdGV4dC5nc3ViKC9cIi8sICdcXCInKQorICAgICAgICBcJSgiI3sgdGV4dCB9IikKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBET0NVTUVOVAorICAgICAgICA6ICBYTUxERUNMPyBXUz8gRE9DVFlQRT8gV1M/IEVMRU1FTlQgV1M/IAorICAgICAgICA7CisgICAgCisgICAgZnJhZ21lbnQgRE9DVFlQRQorICAgICAgICA6CisgICAgICAgICAgICAnPCFET0NUWVBFJyBXUyByb290RWxlbWVudE5hbWU9R0VORVJJQ19JRCAKKyAgICAgICAgICAgIHtzYXkoIlJPT1RFTEVNRU5UOiAiICsgJHJvb3RFbGVtZW50TmFtZS50ZXh0KX0KKyAgICAgICAgICAgIFdTCisgICAgICAgICAgICAoIAorICAgICAgICAgICAgICAgICggJ1NZU1RFTScgV1Mgc3lzMT1WQUxVRQorICAgICAgICAgICAge3NheSgiU1lTVEVNOiAiICsgJHN5czEudGV4dCl9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHwgJ1BVQkxJQycgV1MgcHViPVZBTFVFIFdTIHN5czI9VkFMVUUKKyAgICAgICAgICAgICAgICAgICAge3NheSgiUFVCTElDOiAiICsgJHB1Yi50ZXh0KX0KKyAgICAgICAgICAgICAgICAgICAge3NheSgiU1lTVEVNOiAiICsgJHN5czIudGV4dCl9ICAgCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICggV1MgKT8KKyAgICAgICAgICAgICk/CisgICAgICAgICAgICAoIGR0ZD1JTlRFUk5BTF9EVEQKKyAgICAgICAgICAgICAgICB7c2F5KCJJTlRFUk5BTCBEVEQ6ICIgKyAkZHRkLnRleHQpfQorICAgICAgICAgICAgKT8KKyAgICAgICAgJz4nCisgICAgICA7CisgICAgCisgICAgZnJhZ21lbnQgSU5URVJOQUxfRFREIDogJ1snIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnXScgOworICAgIAorICAgIGZyYWdtZW50IFBJIDoKKyAgICAgICAgICAgICc8PycgdGFyZ2V0PUdFTkVSSUNfSUQgV1M/IAorICAgICAgICAgICAgICB7c2F5KCJQSTogIiArICR0YXJnZXQudGV4dCl9CisgICAgICAgICAgICAoIEFUVFJJQlVURSBXUz8gKSogICc/PicKKyAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudCBYTUxERUNMIDoKKyAgICAgICAgICAgICc8PycgKCd4J3wnWCcpICgnbSd8J00nKSAoJ2wnfCdMJykgV1M/IAorICAgICAgICAgICAgICB7c2F5KCJYTUwgZGVjbGFyYXRpb24iKX0KKyAgICAgICAgICAgICggQVRUUklCVVRFIFdTPyApKiAgJz8+JworICAgICAgOworICAgIAorICAgIAorICAgIGZyYWdtZW50IEVMRU1FTlQKKyAgICAgICAgOiAoIFNUQVJUX1RBRworICAgICAgICAgICAgICAgIChFTEVNRU5UCisgICAgICAgICAgICAgICAgfCB0PVBDREFUQQorICAgICAgICAgICAgICAgICAgICB7c2F5KCJQQ0RBVEE6ICIgPDwgcXVvdGUoJHQudGV4dCkpfQorICAgICAgICAgICAgICAgIHwgdD1DREFUQQorICAgICAgICAgICAgICAgICAgICB7c2F5KCJDREFUQTogIiA8PCBxdW90ZSgkdC50ZXh0KSl9CisgICAgICAgICAgICAgICAgfCB0PUNPTU1FTlQKKyAgICAgICAgICAgICAgICAgICAge3NheSgiQ29tbWVudDogIiA8PCBxdW90ZSgkdC50ZXh0KSl9CisgICAgICAgICAgICAgICAgfCBwaT1QSQorICAgICAgICAgICAgICAgICkqCisgICAgICAgICAgICAgICAgRU5EX1RBRworICAgICAgICAgICAgfCBFTVBUWV9FTEVNRU5UCisgICAgICAgICAgICApCisgICAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudCBTVEFSVF9UQUcgCisgICAgICAgIDogJzwnIFdTPyBuYW1lPUdFTkVSSUNfSUQgV1M/CisgICAgICAgICAgICAgIHtzYXkoIlN0YXJ0IFRhZzogIiArICRuYW1lLnRleHQpfQorICAgICAgICAgICAgKCBBVFRSSUJVVEUgV1M/ICkqICc+JworICAgICAgICA7CisgICAgCisgICAgZnJhZ21lbnQgRU1QVFlfRUxFTUVOVCAKKyAgICAgICAgOiAnPCcgV1M/IG5hbWU9R0VORVJJQ19JRCBXUz8KKyAgICAgICAgICAgICAge3NheSgiRW1wdHkgRWxlbWVudDogIiArICRuYW1lLnRleHQpfQorICAgICAgICAgICAgKCBBVFRSSUJVVEUgV1M/ICkqICcvPicKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50IEFUVFJJQlVURSAKKyAgICAgICAgOiBuYW1lPUdFTkVSSUNfSUQgV1M/ICc9JyBXUz8gdmFsdWU9VkFMVUUKKyAgICAgICAgICAgIHtzYXkoIkF0dHI6ICIgKyAkbmFtZS50ZXh0ICsgIiA9ICIrICR2YWx1ZS50ZXh0KX0KKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50IEVORF9UQUcgCisgICAgICAgIDogJzwvJyBXUz8gbmFtZT1HRU5FUklDX0lEIFdTPyAnPicKKyAgICAgICAgICAgIHtzYXkoIkVuZCBUYWc6ICIgKyAkbmFtZS50ZXh0KX0KKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50IENPTU1FTlQKKyAgICAgIDoJJzwhLS0nIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnLS0+JworICAgICAgOworICAgIAorICAgIGZyYWdtZW50IENEQVRBCisgICAgICA6CSc8IVtDREFUQVsnIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnXV0+JworICAgICAgOworICAgIAorICAgIGZyYWdtZW50IFBDREFUQSA6ICh+JzwnKSsgOyAKKyAgICAKKyAgICBmcmFnbWVudCBWQUxVRSA6IAorICAgICAgICAgICAgKCAnXCInICh+J1wiJykqICdcIicKKyAgICAgICAgICAgIHwgJ1wnJyAofidcJycpKiAnXCcnCisgICAgICAgICAgICApCisgICAgICA7CisgICAgCisgICAgZnJhZ21lbnQgR0VORVJJQ19JRCAKKyAgICAgICAgOiAoIExFVFRFUiB8ICdfJyB8ICc6JykgCisgICAgICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiBMRVRURVIgfCAnMCcuLic5JyB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyApKgorICAgICAgOworICAgIAorICAgIGZyYWdtZW50IExFVFRFUgorICAgICAgOiAnYScuLid6JyAKKyAgICAgIHwgJ0EnLi4nWicKKyAgICAgIDsKKyAgICAKKyAgICBmcmFnbWVudCBXUyAgOgorICAgICAgICAgICAgKCAgICcgJworICAgICAgICAgICAgfCAgICdcdCcKKyAgICAgICAgICAgIHwgICggJ1xuJworICAgICAgICAgICAgICAgIHwJJ1xyXG4nCisgICAgICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKSsKKyAgICAgICAgOyAgICAKKyAgRU5ECisgIAorICBpdCAic2hvdWxkIGJlIHZhbGlkIiBkbworICAgIGxleGVyID0gWE1MOjpMZXhlci5uZXcoIDw8LSdFTkQnLmZpeGVkX2luZGVudCggMCApICkKKyAgICAgIDw/eG1sIHZlcnNpb249JzEuMCc/PgorICAgICAgPCFET0NUWVBFIGNvbXBvbmVudCBbCisgICAgICA8IUVMRU1FTlQgY29tcG9uZW50IChQQ0RBVEF8c3ViKSo+CisgICAgICA8IUFUVExJU1QgY29tcG9uZW50CisgICAgICAgICAgICAgICAgYXR0ciBDREFUQSAjSU1QTElFRAorICAgICAgICAgICAgICAgIGF0dHIyIENEQVRBICNJTVBMSUVECisgICAgICA+CisgICAgICA8IUVMTUVOVCBzdWIgRU1QVFk+CisgICAgICAKKyAgICAgIF0+CisgICAgICA8Y29tcG9uZW50IGF0dHI9InZhbCd1ZSIgYXR0cjI9J3ZhbCJ1ZSc+CisgICAgICA8IS0tIFRoaXMgaXMgYSBjb21tZW50IC0tPgorICAgICAgVGV4dAorICAgICAgPCFbQ0RBVEFbaHVodV1dPgorICAgICAgw7bDpMO8w58KKyAgICAgICZhbXA7CisgICAgICAmbHQ7CisgICAgICA8P3h0YWwgY3Vyc29yPScxMSc/PgorICAgICAgPHN1Yi8+CisgICAgICA8c3ViPjwvc3ViPgorICAgICAgPC9jb21wb25lbnQ+CisgICAgRU5ECisgICAgCisgICAgbGV4ZXIubWFwIHsgfHRrfCB0ayB9CisgICAgCisgICAgbGV4ZXIub3V0cHV0LnNob3VsZCA9PSA8PC0nRU5EJy5maXhlZF9pbmRlbnQoIDAgKQorICAgICAgWE1MIGRlY2xhcmF0aW9uCisgICAgICBBdHRyOiB2ZXJzaW9uID0gJzEuMCcKKyAgICAgIFJPT1RFTEVNRU5UOiBjb21wb25lbnQKKyAgICAgIElOVEVSTkFMIERURDogWworICAgICAgPCFFTEVNRU5UIGNvbXBvbmVudCAoUENEQVRBfHN1YikqPgorICAgICAgPCFBVFRMSVNUIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIGF0dHIgQ0RBVEEgI0lNUExJRUQKKyAgICAgICAgICAgICAgICBhdHRyMiBDREFUQSAjSU1QTElFRAorICAgICAgPgorICAgICAgPCFFTE1FTlQgc3ViIEVNUFRZPgorICAgICAgCisgICAgICBdCisgICAgICBTdGFydCBUYWc6IGNvbXBvbmVudAorICAgICAgQXR0cjogYXR0ciA9ICJ2YWwndWUiCisgICAgICBBdHRyOiBhdHRyMiA9ICd2YWwidWUnCisgICAgICBQQ0RBVEE6ICIKKyAgICAgICIKKyAgICAgIENvbW1lbnQ6ICI8IS0tIFRoaXMgaXMgYSBjb21tZW50IC0tPiIKKyAgICAgIFBDREFUQTogIgorICAgICAgVGV4dAorICAgICAgIgorICAgICAgQ0RBVEE6ICI8IVtDREFUQVtodWh1XV0+IgorICAgICAgUENEQVRBOiAiCisgICAgICDDtsOkw7zDnworICAgICAgJmFtcDsKKyAgICAgICZsdDsKKyAgICAgICIKKyAgICAgIFBJOiB4dGFsCisgICAgICBBdHRyOiBjdXJzb3IgPSAnMTEnCisgICAgICBQQ0RBVEE6ICIKKyAgICAgICIKKyAgICAgIEVtcHR5IEVsZW1lbnQ6IHN1YgorICAgICAgUENEQVRBOiAiCisgICAgICAiCisgICAgICBTdGFydCBUYWc6IHN1YgorICAgICAgRW5kIFRhZzogc3ViCisgICAgICBQQ0RBVEE6ICIKKyAgICAgICIKKyAgICAgIEVuZCBUYWc6IGNvbXBvbmVudAorICAgIEVORAorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9tYWluL21haW4tc2NyaXB0cy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL21haW4vbWFpbi1zY3JpcHRzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjA3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9tYWluL21haW4tc2NyaXB0cy5yYgpAQCAtMCwwICsxLDI0NSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMnCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitFTlYuZGVsZXRlKCAnUlVCWU9QVCcgKQorRU5WWyAnUlVCWUxJQicgXSA9IEFOVExSMy5saWJyYXJ5X3BhdGgKKworY2xhc3MgVGVzdE1haW5VdGlsaXR5IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIAorICBleGFtcGxlICdvdmVycmlkaW5nIHRoZSBidWlsdC1pbiBzY3JpcHQgYWN0aW9uIHVzaW5nIHRoZSBAbWFpbiBuYW1lZC1hY3Rpb24nIGRvCisgICAgZ3JhbW1hciA9IGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBsZXhlciBncmFtbWFyIE1haW5PdmVycmlkZTsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAgIAorICAgICAgQG1haW4geworICAgICAgICByYWlzZSggInRoZSBtYWluIGJsb2NrIHJhbiIgKQorICAgICAgfQorICAgICAgCisgICAgICBJRDogKCdhJy4uJ3onIHwgJ1x1MDBjMCcuLidcdTAwZmYnKSs7CisgICAgICBXUzogJyAnKyB7ICRjaGFubmVsID0gSElEREVOOyB9OworICAgIEVORAorICAgIAorICAgICMgd2hlbiB0aGlzIGdyYW1tYXIgaXMgY29tcGlsZWQgYW5kIHRoZSByZXN1bHRpbmcgcnVieSBmaWxlcworICAgICMgYXJlIGxvYWRlZCBhcyBhIGxpYnJhcnksIHRoZSBjdXN0b20gQG1haW4gYmxvY2sKKyAgICAjIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQKKyAgICBwcm9jIHsgY29tcGlsZV9hbmRfbG9hZCggZ3JhbW1hciApIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcgorICAgIAorICAgICMgdGhpcyBhc3NlcnRpb24gdmVyaWZpZXMgdGhhdCB0aGUgbWFpbiByZWdpb24gaXMgZXhlY3V0ZWQKKyAgICAjIHdoZW4gdGhlIHBhcnNlciBzY3JpcHQgaXMgcnVuIGRpcmVjdGx5CisgICAgbGV4ZXJfc2NyaXB0ID0gZ3JhbW1hci50YXJnZXRfZmlsZXMuZmlyc3QKKyAgICBvdXQgPSBgcnVieSAjeyBsZXhlcl9zY3JpcHQgfSAyPiYxYC5jaG9tcAorICAgIG91dC5zaG91bGQgPX4gL3RoZSBtYWluIGJsb2NrIHJhbi8KKyAgZW5kCisgIAorICBleGFtcGxlICd1c2luZyBMZXhlci5tYWluKCkgdG8gcnVuIHRoZSBidWlsdC1pbiBsZXhlciB1dGlsaXR5IHNjcmlwdCBvbiBhIHNvdXJjZSBmaWxlJyBkbworICAgIGlucHV0X3BhdGggPSBsb2NhbF9wYXRoKCAnaW5wdXQudHh0JyApCisgICAgb3BlbiggaW5wdXRfcGF0aCwgJ3cnICkgeyB8ZnwgZi53cml0ZSggInlhZGEgeWFkYSIgKSB9CisgICAgCisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgbGV4ZXIgZ3JhbW1hciBMZXhlck1haW5XaXRoU291cmNlRmlsZTsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAgIAorICAgICAgSUQ6ICdhJy4uJ3onKzsKKyAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgRU5ECisgICAgCisgICAgYmVnaW4KKyAgICAgIG91dHB1dCA9IFN0cmluZ0lPLm5ldworICAgICAgaW5wdXQgPSBGaWxlLm9wZW4oIGlucHV0X3BhdGggKQorICAgICAgTGV4ZXJNYWluV2l0aFNvdXJjZUZpbGU6OkxleGVyLm1haW4oIFtdLCA6aW5wdXQgPT4gaW5wdXQsIDpvdXRwdXQgPT4gb3V0cHV0ICkKKyAgICAgIAorICAgICAgb3V0X2xpbmVzID0gb3V0cHV0LnN0cmluZy5zcGxpdCggL1xuLyApCisgICAgICBvdXRfbGluZXMuc2hvdWxkIGhhdmUoIDMgKS50aGluZ3MKKyAgICBlbnN1cmUKKyAgICAgIEZpbGUuZGVsZXRlKCBpbnB1dF9wYXRoICkKKyAgICBlbmQKKyAgZW5kCisKKyAgZXhhbXBsZSAndXNpbmcgTGV4ZXIubWFpbiB0byBydW4gdGhlIGJ1aWx0LWluIGxleGVyIHV0aWxpdHkgc2NyaXB0IG9uIGlucHV0IGZyb20gJHN0ZGluJyBkbworICAgIGlucHV0ID0gU3RyaW5nSU8ubmV3KCAieWFkYSB5YWRhIiApICAgICMgPC0gdXNlZCB0byBzaW11bGF0ZSAkc3RkaW4KKyAgICBvdXRwdXQgPSBTdHJpbmdJTy5uZXcKKyAgICAKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBsZXhlciBncmFtbWFyIExleGVyTWFpbkZyb21TdGRJTzsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAgIAorICAgICAgSUQ6ICdhJy4uJ3onKzsKKyAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgRU5ECisgICAgCisgICAgTGV4ZXJNYWluRnJvbVN0ZElPOjpMZXhlci5tYWluKCBbXSwgOmlucHV0ID0+IGlucHV0LCA6b3V0cHV0ID0+IG91dHB1dCApCisgICAgbGluZXMgPSBvdXRwdXQuc3RyaW5nLnNwbGl0KCAvXG4vICkKKyAgICBsaW5lcy5zaG91bGQgaGF2ZSggMyApLnRoaW5ncworICBlbmQKKworICBleGFtcGxlICd1c2luZyBQYXJzZXIubWFpbiB0byBydW4gdGhlIGJ1aWx0LWluIHBhcnNlciBzY3JpcHQgdXRpbGl0eSB3aXRoIGEgY29tYm8gZ3JhbW1hcicgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIE1haW5Gb3JDb21iaW5lZDsKKyAgICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAgIHIgcmV0dXJucyBbcmVzXTogKElEKSsgRU9GIHsgJHJlcyA9ICR0ZXh0OyB9OworICAgICAgCisgICAgICBJRDogJ2EnLi4neicrOworICAgICAgV1M6ICcgJysgeyAkY2hhbm5lbCA9IEhJRERFTjsgfTsKKyAgICBFTkQKKyAgICAKKyAgICBvdXRwdXQgPSBTdHJpbmdJTy5uZXcKKyAgICBpbnB1dCA9IFN0cmluZ0lPLm5ldyggJ3lhZGEgeWFkYScgKQorICAgIAorICAgIE1haW5Gb3JDb21iaW5lZDo6UGFyc2VyLm1haW4oIAorICAgICAgICAldygtLXJ1bGUgciAtLWxleGVyLW5hbWUgTWFpbkZvckNvbWJpbmVkOjpMZXhlciksCisgICAgICAgIDppbnB1dCA9PiBpbnB1dCwgOm91dHB1dCA9PiBvdXRwdXQgKQorICAgIGxpbmVzID0gb3V0cHV0LnN0cmluZy5zcGxpdCggIlxuIiApCisgICAgbGluZXMuc2hvdWxkIGhhdmUoIDQgKS50aGluZ3MKKyAgZW5kCisgIAorICBleGFtcGxlICd1c2luZyBidWlsdC1pbiBtYWluIHRvIGluc3BlY3QgQVNUIGNvbnN0cnVjdGVkIGJ5IGFuIEFTVC1idWlsZGluZyBwYXJzZXInIGRvCisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBBU1RQYXJzZXJNYWluOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICAgICAgb3V0cHV0ID0gQVNUOworICAgICAgfQorICAgICAgcjogSUQgT1BeIElEIEVPRiE7CisgICAgICAKKyAgICAgIElEOiAnYScuLid6Jys7CisgICAgICBPUDogJysnOworICAgICAgV1M6ICcgJysgeyAkY2hhbm5lbCA9IEhJRERFTjsgfTsKKyAgICBFTkQKKyAgICAKKyAgICBvdXRwdXQgPSBTdHJpbmdJTy5uZXcKKyAgICBpbnB1dCAgPSBTdHJpbmdJTy5uZXcgJ3lhZGEgKyB5YWRhJworICAgIEFTVFBhcnNlck1haW46OlBhcnNlci5tYWluKCAKKyAgICAgICV3KC0tcnVsZSByIC0tbGV4ZXItbmFtZSBBU1RQYXJzZXJNYWluOjpMZXhlciksCisgICAgICA6aW5wdXQgPT4gaW5wdXQsIDpvdXRwdXQgPT4gb3V0cHV0ICkKKyAgICBvdXRwdXQgPSBvdXRwdXQuc3RyaW5nLnN0cmlwCisgICAgb3V0cHV0LnNob3VsZCA9PSAiKCsgeWFkYSB5YWRhKSIKKyAgZW5kCisgIAorICBleGFtcGxlICJ1c2luZyBhIHRyZWUgcGFyc2VyJ3MgYnVpbHQtaW4gbWFpbiIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIFRyZWVNYWluOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICAgICAgb3V0cHV0ID0gQVNUOworICAgICAgfQorICAgICAgCisgICAgICByOiBJRCBPUF4gSUQgRU9GITsKKyAgICAgIAorICAgICAgSUQ6ICdhJy4uJ3onKzsKKyAgICAgIE9QOiAnKyc7CisgICAgICBXUzogJyAnKyB7ICRjaGFubmVsID0gSElEREVOOyB9OworICAgIEVORAorICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHRyZWUgZ3JhbW1hciBUcmVlTWFpbldhbGtlcjsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1UcmVlTWFpbjsKKyAgICAgIH0KKyAgICAgIHIgcmV0dXJucyBbcmVzXTogXihPUCBhPUlEIGI9SUQpCisgICAgICAgIHsgJHJlcyA9ICJcJXMgXCVzIFwlcyIgXCUgWyRhLnRleHQsICRPUC50ZXh0LCAkYi50ZXh0XSB9CisgICAgICAgIDsKKyAgICBFTkQKKyAgICAKKyAgICBvdXRwdXQgPSBTdHJpbmdJTy5uZXcKKyAgICBpbnB1dCAgPSBTdHJpbmdJTy5uZXcgJ2ErYicKKyAgICAKKyAgICBUcmVlTWFpbldhbGtlcjo6VHJlZVBhcnNlci5tYWluKCAKKyAgICAgICV3KC0tcnVsZSByIC0tcGFyc2VyLW5hbWUgVHJlZU1haW46OlBhcnNlcgorICAgICAgICAgLS1wYXJzZXItcnVsZSByIC0tbGV4ZXItbmFtZSBUcmVlTWFpbjo6TGV4ZXIpLAorICAgICAgOmlucHV0ID0+IGlucHV0LCA6b3V0cHV0ID0+IG91dHB1dCApCisgICAgb3V0cHV0ID0gb3V0cHV0LnN0cmluZy5zdHJpcAorICAgIG91dHB1dC5zaG91bGQgPT0gJyJhICsgYiInCisgIGVuZAorICAKKyAgZXhhbXBsZSAidXNpbmcgYSB0cmVlIHBhcnNlcidzIGJ1aWx0LWluIG1haW4gdG8gaW5zcGVjdCBBU1QgcmV3cml0ZSBvdXRwdXQiIGRvCisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBUcmVlUmV3cml0ZU1haW47CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgICAgICBvdXRwdXQgPSBBU1Q7CisgICAgICB9CisgICAgICAKKyAgICAgIHI6IElEIE9QXiBJRCBFT0YhOworICAgICAgCisgICAgICBJRDogJ2EnLi4neicrOworICAgICAgT1A6ICcrJzsKKyAgICAgIFdTOiAnICcrIHsgJGNoYW5uZWwgPSBISURERU47IH07CisgICAgRU5ECisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgdHJlZSBncmFtbWFyIFRyZWVSZXdyaXRlTWFpbldhbGtlcjsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgdG9rZW5Wb2NhYj1UcmVlUmV3cml0ZU1haW47CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICB9CisgICAgICB0b2tlbnMgeyBBUkc7IH0KKyAgICAgIHI6IF4oT1AgYT1JRCBiPUlEKSAtPiBeKE9QIF4oQVJHIElEKSBeKEFSRyBJRCkpOworICAgIEVORAorICAgIAorICAgIG91dHB1dCA9IFN0cmluZ0lPLm5ldworICAgIGlucHV0ICA9IFN0cmluZ0lPLm5ldyAnYStiJworICAgIFRyZWVSZXdyaXRlTWFpbldhbGtlcjo6VHJlZVBhcnNlci5tYWluKCAKKyAgICAgICV3KC0tcnVsZSByIC0tcGFyc2VyLW5hbWUgVHJlZVJld3JpdGVNYWluOjpQYXJzZXIKKyAgICAgICAgIC0tcGFyc2VyLXJ1bGUgciAtLWxleGVyLW5hbWUgVHJlZVJld3JpdGVNYWluOjpMZXhlciksCisgICAgICA6aW5wdXQgPT4gaW5wdXQsIDpvdXRwdXQgPT4gb3V0cHV0CisgICAgKQorICAgIAorICAgIG91dHB1dCA9IG91dHB1dC5zdHJpbmcuc3RyaXAKKyAgICBvdXRwdXQuc2hvdWxkID09ICcoKyAoQVJHIGEpIChBUkcgYikpJworICBlbmQKKyAgCisgIGV4YW1wbGUgJ3VzaW5nIGJ1aWx0LWluIG1haW4gd2l0aCBhIGRlbGVnYXRpbmcgZ3JhbW1hcicgZG8KKyAgICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgcGFyc2VyIGdyYW1tYXIgTWFpblNsYXZlOworICAgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAgIGEgOiBCOworICAgIEVORAorICAgIG1hc3RlciA9IGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIE1haW5NYXN0ZXI7CisgICAgICBvcHRpb25zIHsgbGFuZ3VhZ2U9UnVieTsgfQorICAgICAgaW1wb3J0IE1haW5TbGF2ZTsKKyAgICAgIHMgcmV0dXJucyBbcmVzXTogYSB7ICRyZXMgPSAkYS50ZXh0IH07CisgICAgICBCIDogJ2InIDsgLy8gZGVmaW5lcyBCIGZyb20gaW5oZXJpdGVkIHRva2VuIHNwYWNlCisgICAgICBXUyA6ICgnICd8J1xuJykge3NraXB9IDsKKyAgICBFTkQKKyAgICBtYXN0ZXIuY29tcGlsZQorICAgIGZvciBmaWxlIGluIG1hc3Rlci50YXJnZXRfZmlsZXMKKyAgICAgIHJlcXVpcmUoIGZpbGUgKQorICAgIGVuZAorICAgIAorICAgIG91dHB1dCA9IFN0cmluZ0lPLm5ldworICAgIGlucHV0ID0gU3RyaW5nSU8ubmV3ICdiJworICAgIAorICAgIE1haW5NYXN0ZXI6OlBhcnNlci5tYWluKCAKKyAgICAgICV3KC0tcnVsZSBzIC0tbGV4ZXItbmFtZSBNYWluTWFzdGVyOjpMZXhlciksCisgICAgICA6aW5wdXQgPT4gaW5wdXQsIDpvdXRwdXQgPT4gb3V0cHV0ICkKKyAgICBvdXRwdXQgPSBvdXRwdXQuc3RyaW5nLnN0cmlwCisgICAgb3V0cHV0LnNob3VsZCA9PSAnYicuaW5zcGVjdAorICBlbmQKKworICAjdGVzdCA6TGV4ZXJFbmNvZGluZyBkbworICAjICBicm9rZW4hKCJOb24tQVNDSUkgZW5jb2RpbmdzIGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0IikKKyAgIyAgZ3JhbW1hciA9IGlubGluZV9ncmFtbWFyKDw8LSdFTkQnKQorICAjICAgIGxleGVyIGdyYW1tYXIgVDM7CisgICMgICAgb3B0aW9ucyB7CisgICMgICAgICBsYW5ndWFnZSA9IFJ1Ynk7CisgICMgICAgICB9CisgICMKKyAgIyAgICBJRDogKCdhJy4uJ3onIHwgJ1x1MDBjMCcuLidcdTAwZmYnKSs7CisgICMgICAgV1M6ICcgJysgeyAkY2hhbm5lbCA9IEhJRERFTjsgfTsKKyAgIyAgRU5ECisgICMgIGNvbXBpbGUgZ3JhbW1hcgorICAjICBpbnB1dCA9IFN0cmluZ0lPLm5ldygiZsO2w7YgYsOkciIpCisgICMgIG91dHB1dCA9IFN0cmluZ0lPLm5ldygnJykKKyAgIyAgbGV4ZXJfY2xhc3MubWFpbigldygtLWVuY29kaW5nIHV0Zi04KSwgOmlucHV0ID0+IGlucHV0LCA6b3V0cHV0ID0+IG91dHB1dCkKKyAgIyAgcHV0cyBvdXRwdXQuc3RyaW5nCisgICMgIGxpbmVzID0gb3V0cHV0LnN0cmluZy5zcGxpdCgvXG4vKQorICAjICBsaW5lcy5zaG91bGQgaGF2ZSgzKS50aGluZ3MKKyAgI2VuZAorCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9hY3Rpb25zLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2FjdGlvbnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3Y2Y1NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9hY3Rpb25zLnJiCkBAIC0wLDAgKzEsMjM4IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RBY3Rpb25zMSA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUGFyc2VyQWN0aW9uczsKKyAgICBvcHRpb25zIHsgbGFuZ3VhZ2UgPSBSdWJ5OyB9CisgICAgCisgICAgZGVjbGFyYXRpb24gcmV0dXJucyBbbmFtZV0KKyAgICAgICAgOiAgIGZ1bmN0aW9uSGVhZGVyICc7JworICAgICAgICAgICAgeyAkbmFtZSA9ICRmdW5jdGlvbkhlYWRlci5uYW1lIH0KKyAgICAgICAgOworICAgIAorICAgIGZ1bmN0aW9uSGVhZGVyIHJldHVybnMgW25hbWVdCisgICAgICAgIDogdHlwZSBpZD1JRAorICAgICAgICAgIHsgJG5hbWUgPSAkaWQudGV4dCB9CisgICAgICAgIDsKKyAgICAKKyAgICB0eXBlCisgICAgICAgIDogICAnaW50JworICAgICAgICB8ICAgJ2NoYXInCisgICAgICAgIHwgICAndm9pZCcKKyAgICAgICAgOworICAgIAorICAgIElEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgICAgIDsKKyAgICAKKyAgICBXUyAgOiAgICggICAnICcKKyAgICAgICAgICAgIHwgICAnXHQnCisgICAgICAgICAgICB8ICAgJ1xyJworICAgICAgICAgICAgfCAgICdcbicKKyAgICAgICAgICAgICkrCisgICAgICAgICAgICB7JGNoYW5uZWw9SElEREVOfQorICAgICAgICA7ICAgIAorICBFTkQKKyAgCisgIGV4YW1wbGUgInBhcnNlciBhY3Rpb24gZXhlY3V0aW9uIiBkbworICAgIGxleGVyID0gUGFyc2VyQWN0aW9uczo6TGV4ZXIubmV3ICJpbnQgZm9vOyIKKyAgICBwYXJzZXIgPSBQYXJzZXJBY3Rpb25zOjpQYXJzZXIubmV3IGxleGVyCisgICAgCisgICAgcGFyc2VyLmRlY2xhcmF0aW9uLnNob3VsZCA9PSAnZm9vJworICBlbmQKKyAgCitlbmQKKworCitjbGFzcyBUZXN0QWN0aW9uczIgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgQWxsS2luZHNPZkFjdGlvbnM7CisgICAgb3B0aW9ucyB7IGxhbmd1YWdlID0gUnVieTsgfQorICAgIAorICAgIEBwYXJzZXI6Om1lbWJlcnMgeworICAgICAgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQKKyAgICB9CisgICAgCisgICAgQGxleGVyOjptZW1iZXJzIHsKKyAgICAgIGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0CisgICAgfQorICAgIEBsZXhlcjo6aW5pdCB7IEBmb29iYXIgPSAnYXR0cmlidXRlJyB9CisgICAgCisgICAgcHJvZworICAgIEBpbml0ICB7IHNheSgnaW5pdCcpICB9CisgICAgQGFmdGVyIHsgc2F5KCdhZnRlcicpIH0KKyAgICAgIDogICBJREVOVElGSUVSIEVPRgorICAgICAgOworICAgICAgY2F0Y2ggWyBSZWNvZ25pdGlvbkVycm9yID0+IGV4YyBdIHsKKyAgICAgICAgc2F5KCdjYXRjaCcpCisgICAgICAgIHJhaXNlCisgICAgICB9CisgICAgICBmaW5hbGx5IHsgc2F5KCdmaW5hbGx5JykgfQorICAgIAorICAgIAorICAgIElERU5USUZJRVIKKyAgICAgICAgOiAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JzAnLi4nOSd8J18nKSoKKyAgICAgICAgICB7CisgICAgICAgICAgICAjIGEgY29tbWVudAorICAgICAgICAgICAgc2F5KCdhY3Rpb24nKQorICAgICAgICAgICAgc2F5KCdcJXAgXCVwIFwlcCBcJXAgXCVwIFwlcCBcJXAgXCVwJyBcJSBbJHRleHQsICR0eXBlLCAkbGluZSwgJHBvcywgJGluZGV4LCAkY2hhbm5lbCwgJHN0YXJ0LCAkc3RvcF0pCisgICAgICAgICAgICBzYXkoQGZvb2JhcikKKyAgICAgICAgICB9CisgICAgICAgIDsKKyAgICAKKyAgICBXUzogKCcgJyB8ICdcbicpKzsKKyAgRU5ECisKKworICBleGFtcGxlICJleGVjdXRpb24gb2Ygc3BlY2lhbCBuYW1lZCBhY3Rpb25zIiBkbworICAgIGxleGVyID0gQWxsS2luZHNPZkFjdGlvbnM6OkxleGVyLm5ldyggImZvb2JhciBfQWI5OCBcbiBBMTJzZGYiICkKKyAgICBwYXJzZXIgPSBBbGxLaW5kc09mQWN0aW9uczo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5wcm9nCisgICAgCisgICAgcGFyc2VyLm91dHB1dC5zaG91bGQgPT0gPDwtRU5ELmZpeGVkX2luZGVudCggMCApCisgICAgICBpbml0CisgICAgICBhZnRlcgorICAgICAgZmluYWxseQorICAgIEVORAorICAgIAorICAgIGxleGVyLm91dHB1dC5zaG91bGQgPT0gPDwtRU5ELmZpeGVkX2luZGVudCggMCApCisgICAgICBhY3Rpb24KKyAgICAgICJmb29iYXIiIDQgMSAwIC0xIDpkZWZhdWx0IDAgNQorICAgICAgYXR0cmlidXRlCisgICAgICBhY3Rpb24KKyAgICAgICJfQWI5OCIgNCAxIDcgLTEgOmRlZmF1bHQgNyAxMQorICAgICAgYXR0cmlidXRlCisgICAgICBhY3Rpb24KKyAgICAgICJBMTJzZGYiIDQgMiAxIC0xIDpkZWZhdWx0IDE1IDIwCisgICAgICBhdHRyaWJ1dGUKKyAgICBFTkQKKyAgZW5kCitlbmQKKworY2xhc3MgVGVzdEZpbmFsbHkgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgRmluYWxseTsKKyAgICAKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBwcm9nIHJldHVybnMgW2V2ZW50c10KKyAgICBAaW5pdCB7ZXZlbnRzID0gW119CisgICAgQGFmdGVyIHtldmVudHMgPDwgJ2FmdGVyJ30KKyAgICAgICAgOiAgIElEIHtyYWlzZSBSdW50aW1lRXJyb3J9CisgICAgICAgIDsKKyAgICAgICAgY2F0Y2ggW1J1bnRpbWVFcnJvcl0ge2V2ZW50cyA8PCAnY2F0Y2gnfQorICAgICAgICBmaW5hbGx5IHsgZXZlbnRzIDw8ICdmaW5hbGx5J30KKyAgICAKKyAgICBJRCAgOiAgICgnYScuLid6JykrCisgICAgICAgIDsKKyAgICAKKyAgICBXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPUhJRERFTn0KKyAgICAgICAgOworICBFTkQKKworICAKKyAgZXhhbXBsZSAib3JkZXIgb2YgY2F0Y2ggYW5kIGVuc3VyZSBjbGF1c2VzIiBkbworICAgIGxleGVyID0gRmluYWxseTo6TGV4ZXIubmV3KCAnZm9vYmFyJyApCisgICAgcGFyc2VyID0gRmluYWxseTo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5wcm9nLnNob3VsZCA9PSAldyhjYXRjaCBmaW5hbGx5KQorICBlbmQKKworZW5kCisKKworY2xhc3MgVGVzdEFjdGlvblNjb3BlcyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTcGVjaWFsQWN0aW9uU2NvcGVzOworICAgIG9wdGlvbnMgeyBsYW5ndWFnZT1SdWJ5OyB9CisgICAgCisgICAgQGFsbDo6aGVhZGVyIHsKKyAgICAgIFwkYWxsX2hlYWRlcl9maWxlcyB8fD0gW10KKyAgICAgIFwkYWxsX2hlYWRlcl9maWxlcyA8PCBGaWxlLmJhc2VuYW1lKCBfX0ZJTEVfXyApCisgICAgfQorICAgIAorICAgIEBhbGw6OmZvb3RlciB7CisgICAgICBcJGFsbF9mb290ZXJfZmlsZXMgfHw9IFtdCisgICAgICBcJGFsbF9mb290ZXJfZmlsZXMgPDwgRmlsZS5iYXNlbmFtZSggX19GSUxFX18gKQorICAgIH0KKyAgICAKKyAgICBAaGVhZGVyIHsKKyAgICAgIFwkaGVhZGVyX2xvY2F0aW9uID0gX19MSU5FX18KKyAgICAgIFwkaGVhZGVyX2NvbnRleHQgPSBzZWxmCisgICAgfQorICAgIAorICAgIEBmb290ZXIgeworICAgICAgXCRmb290ZXJfbG9jYXRpb24gPSBfX0xJTkVfXworICAgICAgXCRmb290ZXJfY29udGV4dCA9IHNlbGYKKyAgICB9CisgICAgCisgICAgQG1vZHVsZTo6aGVhZCB7CisgICAgICBcJG1vZHVsZV9oZWFkX2xvY2F0aW9uID0gX19MSU5FX18KKyAgICAgIFwkbW9kdWxlX2hlYWRfY29udGV4dCA9IHNlbGYKKyAgICAgIAorICAgICAgY2xhc3MgPDwgc2VsZgorICAgICAgICBhdHRyX2FjY2Vzc29yIDpoZWFkX3ZhcgorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIEBtb2R1bGU6OmZvb3QgeworICAgICAgXCRtb2R1bGVfZm9vdF9sb2NhdGlvbiA9IF9fTElORV9fCisgICAgICBcJG1vZHVsZV9mb290X2NvbnRleHQgID0gc2VsZgorICAgICAgCisgICAgICBGT09UX0NPTlNUID0gMQorICAgIH0KKyAgICAKKyAgICBAdG9rZW46OnNjaGVtZSB7CisgICAgICBcJHRva2VuX3NjaGVtZV9sb2NhdGlvbiA9IF9fTElORV9fCisgICAgICBcJHRva2VuX3NjaGVtZV9jb250ZXh0ID0gc2VsZgorICAgICAgCisgICAgICBTQ0hFTUVfQ09OU1QgPSAxCisgICAgfQorICAgIAorICAgIEB0b2tlbjo6bWVtYmVycyB7CisgICAgICBcJHRva2VuX21lbWJlcnNfbG9jYXRpb24gPSBfX0xJTkVfXworICAgICAgXCR0b2tlbl9tZW1iZXJzX2NvbnRleHQgID0gc2VsZgorICAgICAgCisgICAgICBkZWYgdmFsdWUKKyAgICAgICAgdGV4dC50b19pCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgQG1lbWJlcnMgeworICAgICAgXCRtZW1iZXJzX2xvY2F0aW9uID0gX19MSU5FX18KKyAgICB9CisgICAgCisgICAgbnVtcyByZXR1cm5zIFtkc106IGRpZ3MrPURJR0lUKworICAgICAgICAgICAgICAgICAgICAgICB7ICRkcyA9ICRkaWdzLm1hcCB7IHx0fCB0LnZhbHVlIH0gfTsKKyAgICAKKyAgICBESUdJVDogKCcwJy4uJzknKSs7CisgICAgV1M6ICgnICcgfCAnXHQnIHwgJ1xuJyB8ICdccicgfCAnXGYnKSsgeyAkY2hhbm5lbD1ISURERU47IH07CisgIEVORAorICAKKyAgZXhhbXBsZSAndmVyaWZ5aW5nIGFjdGlvbiBzY29wZSBiZWhhdmlvcicgZG8KKyAgICBsZXhlciA9IFNwZWNpYWxBY3Rpb25TY29wZXM6OkxleGVyLm5ldyggIjEwIDIwIDMwIDQwIDUwIiApCisgICAgcGFyc2VyID0gU3BlY2lhbEFjdGlvblNjb3Blczo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5udW1zLnNob3VsZCA9PSBbIDEwLCAyMCwgMzAsIDQwLCA1MCBdCisgIGVuZAorICAKKyAgZXhhbXBsZSAnc3BlY2lhbCBhY3Rpb24gc2NvcGUgbG9jYXRpb25zJyBkbworICAgICRhbGxfaGVhZGVyX2ZpbGVzLnNob3VsZCBpbmNsdWRlICJTcGVjaWFsQWN0aW9uU2NvcGVzTGV4ZXIucmIiCisgICAgJGFsbF9oZWFkZXJfZmlsZXMuc2hvdWxkIGluY2x1ZGUgIlNwZWNpYWxBY3Rpb25TY29wZXNQYXJzZXIucmIiCisgICAgJGFsbF9mb290ZXJfZmlsZXMuc2hvdWxkIGluY2x1ZGUgIlNwZWNpYWxBY3Rpb25TY29wZXNMZXhlci5yYiIKKyAgICAkYWxsX2Zvb3Rlcl9maWxlcy5zaG91bGQgaW5jbHVkZSAiU3BlY2lhbEFjdGlvblNjb3Blc1BhcnNlci5yYiIKKyAgICAKKyAgICAkaGVhZGVyX2xvY2F0aW9uLnNob3VsZCBiZSA8ICRtb2R1bGVfaGVhZF9sb2NhdGlvbgorICAgICRtb2R1bGVfaGVhZF9sb2NhdGlvbi5zaG91bGQgYmUgPCAkdG9rZW5fc2NoZW1lX2xvY2F0aW9uCisgICAgJHRva2VuX3NjaGVtZV9sb2NhdGlvbi5zaG91bGQgYmUgPCAkdG9rZW5fbWVtYmVyc19sb2NhdGlvbgorICAgICR0b2tlbl9tZW1iZXJzX2xvY2F0aW9uLnNob3VsZCBiZSA8ICRtZW1iZXJzX2xvY2F0aW9uCisgICAgJG1lbWJlcnNfbG9jYXRpb24uc2hvdWxkIGJlIDwgJG1vZHVsZV9mb290X2xvY2F0aW9uCisgICAgJG1vZHVsZV9mb290X2xvY2F0aW9uLnNob3VsZCBiZSA8ICRmb290ZXJfbG9jYXRpb24KKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2JhY2t0cmFja2luZy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9iYWNrdHJhY2tpbmcucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MDAxMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9iYWNrdHJhY2tpbmcucmIKQEAgLTAsMCArMSwyNDMgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgVGVzdEJhY2t0cmFja2luZyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBCYWNrdHJhY2s7CisgICAgb3B0aW9ucyB7CisJCQlsYW5ndWFnZSA9IFJ1Ynk7CisJCQliYWNrdHJhY2s9dHJ1ZTsKKwkJCW1lbW9pemU9dHJ1ZTsKKwkJCWs9MjsKKyAgICB9CisgICAgCisgICAgc2NvcGUgU3ltYm9scyB7CisgICAgCXR5cGVzOworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7CisgICAgICBkZWYgaXNfdHlwZV9uYW1lPyhuYW1lKQorICAgICAgICBAU3ltYm9sc19zdGFjay5yZXZlcnNlX2VhY2ggZG8gfHNjb3BlfAorICAgICAgICAgIHNjb3BlLnR5cGVzLmluY2x1ZGU/KG5hbWUpIGFuZCByZXR1cm4gdHJ1ZQorICAgICAgICBlbmQKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICBlbmQKKyAgICAgIAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlKQorICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIGVuZAorICAgICAgCisgICAgfQorICAgIAorICAgIHRyYW5zbGF0aW9uX3VuaXQKKyAgICBzY29wZSBTeW1ib2xzOyAvLyBlbnRpcmUgZmlsZSBpcyBhIHNjb3BlCisgICAgQGluaXQgeworICAgICAgJFN5bWJvbHM6OnR5cGVzID0gU2V0Lm5ldworICAgIH0KKyAgICAJOiBleHRlcm5hbF9kZWNsYXJhdGlvbisKKyAgICAJOworICAgIAorICAgIC8qKiBFaXRoZXIgYSBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGFueSBvdGhlciBraW5kIG9mIEMgZGVjbC9kZWYuCisgICAgICogIFRoZSBMTCgqKSBhbmFseXNpcyBhbGdvcml0aG0gZmFpbHMgdG8gZGVhbCB3aXRoIHRoaXMgZHVlIHRvCisgICAgICogIHJlY3Vyc2lvbiBpbiB0aGUgZGVjbGFyYXRvciBydWxlcy4gIEknbSBwdXR0aW5nIGluIGEKKyAgICAgKiAgbWFudWFsIHByZWRpY2F0ZSBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgYmFja3RyYWNrIG92ZXIKKyAgICAgKiAgdGhlIGVudGlyZSBmdW5jdGlvbi4gIEZ1cnRoZXIsIHlvdSBnZXQgYSBiZXR0ZXIgZXJyb3IKKyAgICAgKiAgYXMgZXJyb3JzIHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmIGRvbid0IG1ha2UgaXQgZmFpbAorICAgICAqICB0byBwcmVkaWN0IHRoYXQgaXQncyBhIGZ1bmN0aW9uLiAgV2VpcmQgZXJyb3JzIHByZXZpb3VzbHkuCisgICAgICogIFJlbWVtYmVyOiB0aGUgZ29hbCBpcyB0byBhdm9pZCBiYWNrdHJhY2sgbGlrZSB0aGUgcGxhZ3VlCisgICAgICogIGJlY2F1c2UgaXQgbWFrZXMgZGVidWdnaW5nLCBhY3Rpb25zLCBhbmQgZXJyb3JzIGhhcmRlci4KKyAgICAgKgorICAgICAqICBOb3RlIHRoYXQgaz0xIHJlc3VsdHMgaW4gYSBtdWNoIHNtYWxsZXIgcHJlZGljdG9yIGZvciB0aGUgCisgICAgICogIGZpeGVkIGxvb2s7IGs9MiBtYWRlIGEgZmV3IGV4dHJhIHRob3VzYW5kIGxpbmVzLiA7KQorICAgICAqICBJJ2xsIGhhdmUgdG8gb3B0aW1pemUgdGhhdCBpbiB0aGUgZnV0dXJlLgorICAgICAqLworICAgIGV4dGVybmFsX2RlY2xhcmF0aW9uCisgICAgb3B0aW9ucyB7az0xO30KKyAgICAJOiAoIGRlY2xhcmF0aW9uX3NwZWNpZmllcnM/IGRlY2xhcmF0b3IgZGVjbGFyYXRpb24qICd7JyApPT4gZnVuY3Rpb25fZGVmaW5pdGlvbgorICAgIAl8IGRlY2xhcmF0aW9uCisgICAgCTsKKyAgICAKKyAgICBmdW5jdGlvbl9kZWZpbml0aW9uCisgICAgc2NvcGUgU3ltYm9sczsgLy8gcHV0IHBhcmFtZXRlcnMgYW5kIGxvY2FscyBpbnRvIHNhbWUgc2NvcGUgZm9yIG5vdworICAgIEBpbml0IHsKKyAgICAgICRTeW1ib2xzOjp0eXBlcyA9IHNldCgpCisgICAgfQorICAgIAk6CWRlY2xhcmF0aW9uX3NwZWNpZmllcnM/IGRlY2xhcmF0b3IKKyAgICAJOworICAgIAorICAgIGRlY2xhcmF0aW9uCisgICAgc2NvcGUgeworICAgICAgaXNfdHlwZV9kZWY7CisgICAgfQorICAgIEBpbml0IHsKKyAgICAgICRkZWNsYXJhdGlvbjo6aXNfdHlwZV9kZWYgPSBmYWxzZQorICAgIH0KKyAgICAJOiAndHlwZWRlZicgZGVjbGFyYXRpb25fc3BlY2lmaWVycz8geyRkZWNsYXJhdGlvbjo6aXNfdHlwZV9kZWYgPSB0cnVlfQorICAgIAkgIGluaXRfZGVjbGFyYXRvcl9saXN0ICc7JyAvLyBzcGVjaWFsIGNhc2UsIGxvb2tpbmcgZm9yIHR5cGVkZWYJCisgICAgCXwgZGVjbGFyYXRpb25fc3BlY2lmaWVycyBpbml0X2RlY2xhcmF0b3JfbGlzdD8gJzsnCisgICAgCTsKKyAgICAKKyAgICBkZWNsYXJhdGlvbl9zcGVjaWZpZXJzCisgICAgCTogICAoICAgc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIKKyAgICAJCXwgICB0eXBlX3NwZWNpZmllcgorICAgICAgICAgICAgfCAgIHR5cGVfcXVhbGlmaWVyCisgICAgICAgICAgICApKworICAgIAk7CisgICAgCisgICAgaW5pdF9kZWNsYXJhdG9yX2xpc3QKKyAgICAJOiBpbml0X2RlY2xhcmF0b3IgKCcsJyBpbml0X2RlY2xhcmF0b3IpKgorICAgIAk7CisgICAgCisgICAgaW5pdF9kZWNsYXJhdG9yCisgICAgCTogZGVjbGFyYXRvciAvLygnPScgaW5pdGlhbGl6ZXIpPworICAgIAk7CisgICAgCisgICAgc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIKKyAgICAJOiAnZXh0ZXJuJworICAgIAl8ICdzdGF0aWMnCisgICAgCXwgJ2F1dG8nCisgICAgCXwgJ3JlZ2lzdGVyJworICAgIAk7CisgICAgCisgICAgdHlwZV9zcGVjaWZpZXIKKyAgICAJOiAndm9pZCcKKyAgICAJfCAnY2hhcicKKyAgICAJfCAnc2hvcnQnCisgICAgCXwgJ2ludCcKKyAgICAJfCAnbG9uZycKKyAgICAJfCAnZmxvYXQnCisgICAgCXwgJ2RvdWJsZScKKyAgICAJfCAnc2lnbmVkJworICAgIAl8ICd1bnNpZ25lZCcKKyAgICAJfCB0eXBlX2lkCisgICAgCTsKKyAgICAKKyAgICB0eXBlX2lkCisgICAgICAgIDogICB7IGlzX3R5cGVfbmFtZT8oQGlucHV0Lmxvb2soMSkudGV4dCl9PyBJREVOVElGSUVSCisgICAgICAgIDsKKyAgICAKKyAgICB0eXBlX3F1YWxpZmllcgorICAgIAk6ICdjb25zdCcKKyAgICAJfCAndm9sYXRpbGUnCisgICAgCTsKKyAgICAKKyAgICBkZWNsYXJhdG9yCisgICAgCTogcG9pbnRlcj8gZGlyZWN0X2RlY2xhcmF0b3IKKyAgICAJfCBwb2ludGVyCisgICAgCTsKKyAgICAKKyAgICBkaXJlY3RfZGVjbGFyYXRvcgorICAgIAk6ICAgKAlJREVOVElGSUVSCisgICAgCQkJeworICAgIAkJCWlmICRkZWNsYXJhdGlvbi5sZW5ndGggPiAwICYmICRkZWNsYXJhdGlvbjo6aXNfdHlwZV9kZWYKKwkJCQkJCSRTeW1ib2xzOjp0eXBlcy5hZGQoJElERU5USUZJRVIudGV4dCkKKwkJCQkJZW5kCisgICAgCQkJfQorICAgIAkJfAknKCcgZGVjbGFyYXRvciAnKScKKyAgICAJCSkKKyAgICAgICAgICAgIGRlY2xhcmF0b3Jfc3VmZml4KgorICAgIAk7CisgICAgCisgICAgZGVjbGFyYXRvcl9zdWZmaXgKKyAgICAJOiAgIC8qJ1snIGNvbnN0YW50X2V4cHJlc3Npb24gJ10nCisgICAgICAgIHwqLyAgICdbJyAnXScKKyAgICAgICAgfCAgICcoJyAnKScKKyAgICAJOworICAgIAorICAgIHBvaW50ZXIKKyAgICAJOiAnKicgdHlwZV9xdWFsaWZpZXIrIHBvaW50ZXI/CisgICAgCXwgJyonIHBvaW50ZXIKKyAgICAJfCAnKicKKyAgICAJOworICAgIAorICAgIElERU5USUZJRVIKKyAgICAJOglMRVRURVIgKExFVFRFUnwnMCcuLic5JykqCisgICAgCTsKKyAgICAJCisgICAgZnJhZ21lbnQKKyAgICBMRVRURVIKKyAgICAJOgknJCcKKyAgICAJfAknQScuLidaJworICAgIAl8CSdhJy4uJ3onCisgICAgCXwJJ18nCisgICAgCTsKKyAgICAKKyAgICBDSEFSQUNURVJfTElURVJBTAorICAgICAgICA6ICAgJ1wnJyAoIEVzY2FwZVNlcXVlbmNlIHwgfignXCcnfCdcXCcpICkgJ1wnJworICAgICAgICA7CisgICAgCisgICAgU1RSSU5HX0xJVEVSQUwKKyAgICAgICAgOiAgJyInICggRXNjYXBlU2VxdWVuY2UgfCB+KCdcXCd8JyInKSApKiAnIicKKyAgICAgICAgOworICAgIAorICAgIEhFWF9MSVRFUkFMIDogJzAnICgneCd8J1gnKSBIZXhEaWdpdCsgSW50ZWdlclR5cGVTdWZmaXg/IDsKKyAgICAKKyAgICBERUNJTUFMX0xJVEVSQUwgOiAoJzAnIHwgJzEnLi4nOScgJzAnLi4nOScqKSBJbnRlZ2VyVHlwZVN1ZmZpeD8gOworICAgIAorICAgIE9DVEFMX0xJVEVSQUwgOiAnMCcgKCcwJy4uJzcnKSsgSW50ZWdlclR5cGVTdWZmaXg/IDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIEhleERpZ2l0IDogKCcwJy4uJzknfCdhJy4uJ2YnfCdBJy4uJ0YnKSA7CisgICAgCisgICAgZnJhZ21lbnQKKyAgICBJbnRlZ2VyVHlwZVN1ZmZpeAorICAgIAk6CSgndSd8J1UnKT8gKCdsJ3wnTCcpCisgICAgCXwJKCd1J3wnVScpICAoJ2wnfCdMJyk/CisgICAgCTsKKyAgICAKKyAgICBGTE9BVElOR19QT0lOVF9MSVRFUkFMCisgICAgICAgIDogICAoJzAnLi4nOScpKyAnLicgKCcwJy4uJzknKSogRXhwb25lbnQ/IEZsb2F0VHlwZVN1ZmZpeD8KKyAgICAgICAgfCAgICcuJyAoJzAnLi4nOScpKyBFeHBvbmVudD8gRmxvYXRUeXBlU3VmZml4PworICAgICAgICB8ICAgKCcwJy4uJzknKSsgRXhwb25lbnQgRmxvYXRUeXBlU3VmZml4PworICAgICAgICB8ICAgKCcwJy4uJzknKSsgRXhwb25lbnQ/IEZsb2F0VHlwZVN1ZmZpeAorICAgIAk7CisgICAgCisgICAgZnJhZ21lbnQKKyAgICBFeHBvbmVudCA6ICgnZSd8J0UnKSAoJysnfCctJyk/ICgnMCcuLic5JykrIDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIEZsb2F0VHlwZVN1ZmZpeCA6ICgnZid8J0YnfCdkJ3wnRCcpIDsKKyAgICAKKyAgICBmcmFnbWVudAorICAgIEVzY2FwZVNlcXVlbmNlCisgICAgICAgIDogICAnXFwnICgnYid8J3QnfCduJ3wnZid8J3InfCdcIid8J1wnJ3wnXFwnKQorICAgICAgICB8ICAgT2N0YWxFc2NhcGUKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50CisgICAgT2N0YWxFc2NhcGUKKyAgICAgICAgOiAgICdcXCcgKCcwJy4uJzMnKSAoJzAnLi4nNycpICgnMCcuLic3JykKKyAgICAgICAgfCAgICdcXCcgKCcwJy4uJzcnKSAoJzAnLi4nNycpCisgICAgICAgIHwgICAnXFwnICgnMCcuLic3JykKKyAgICAgICAgOworICAgIAorICAgIGZyYWdtZW50CisgICAgVW5pY29kZUVzY2FwZQorICAgICAgICA6ICAgJ1xcJyAndScgSGV4RGlnaXQgSGV4RGlnaXQgSGV4RGlnaXQgSGV4RGlnaXQKKyAgICAgICAgOworICAgIAorICAgIFdTICA6ICAoJyAnfCdccid8J1x0J3wnXHUwMDBDJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30KKyAgICAgICAgOworICAgIAorICAgIENPTU1FTlQKKyAgICAgICAgOiAgICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4gKSogJyovJyB7JGNoYW5uZWw9SElEREVOO30KKyAgICAgICAgOworICAgIAorICAgIExJTkVfQ09NTUVOVAorICAgICAgICA6ICcvLycgfignXG4nfCdccicpKiAnXHInPyAnXG4nIHskY2hhbm5lbD1ISURERU47fQorICAgICAgICA7CisgICAgTElORV9DT01NQU5EIAorICAgICAgICA6ICcjJyB+KCdcbid8J1xyJykqICdccic/ICdcbicgeyRjaGFubmVsPUhJRERFTjt9CisgICAgICAgIDsKKyAgRU5ECisKKyAgZXhhbXBsZSAiZ3JhbW1hciB3aXRoIGJhY2t0cmFja2luZyBhbmQgbWVtb2l6YXRpb24iIGRvCisgICAgbGV4ZXIgPSBCYWNrdHJhY2s6OkxleGVyLm5ldyggJ2ludCBhOycgKQorICAgIHBhcnNlciA9IEJhY2t0cmFjazo6UGFyc2VyLm5ldyBsZXhlcgorICAgIGV2ZW50cyA9IHBhcnNlci50cmFuc2xhdGlvbl91bml0CisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9iYXNpYy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9iYXNpYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTJhNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2Jhc2ljLnJiCkBAIC0wLDAgKzEsMjgyIEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RQYXJzZXIwMDEgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIElkZW50aWZpZXJzOworICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAKKyAgICBAcGFyc2VyOjppbml0IHsKKyAgICAgIEBpZGVudGlmaWVycyA9IFtdCisgICAgICBAcmVwb3J0ZWRfZXJyb3JzID0gW10KKyAgICB9CisgICAgCisgICAgQHBhcnNlcjo6bWVtYmVycyB7CisgICAgICBhdHRyX3JlYWRlciA6cmVwb3J0ZWRfZXJyb3JzLCA6aWRlbnRpZmllcnMKKyAgICAgIAorICAgICAgZGVmIGZvdW5kX2lkZW50aWZpZXIobmFtZSkKKyAgICAgICAgICBAaWRlbnRpZmllcnMgPDwgbmFtZQorICAgICAgZW5kCisgICAgICAKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICBAcmVwb3J0ZWRfZXJyb3JzIDw8IG1zZworICAgICAgZW5kCisgICAgfQorICAgIAorICAgIGRvY3VtZW50OgorICAgICAgICAgICAgdD1JREVOVElGSUVSIHtmb3VuZF9pZGVudGlmaWVyKCR0LnRleHQpfQorICAgICAgICAgICAgOworICAgIAorICAgIElERU5USUZJRVI6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKjsKKyAgRU5ECisgIAorICBleGFtcGxlICJwYXJzaW5nICdibGFoX2RlX2JsYWgnIiBkbworICAgICMgdG8gYnVpbGQgYSBwYXJzZXIsIHRoaXMgaXMgdGhlIHN0YW5kYXJkIGNoYWluIG9mIGNhbGxzIHRvIHByZXBhcmUgdGhlIGlucHV0CisgICAgaW5wdXQgPSBBTlRMUjM6OlN0cmluZ1N0cmVhbS5uZXcoICdibGFoX2RlX2JsYWgnLCA6ZmlsZSA9PiAnYmxhaC50eHQnICkKKyAgICBsZXhlciAgPSBJZGVudGlmaWVyczo6TGV4ZXIubmV3KCBpbnB1dCApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBJZGVudGlmaWVyczo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICBwYXJzZXIuZG9jdW1lbnQKKyAgICAKKyAgICBwYXJzZXIucmVwb3J0ZWRfZXJyb3JzLnNob3VsZCBiZV9lbXB0eQorICAgIHBhcnNlci5pZGVudGlmaWVycy5zaG91bGQgPT0gJXcoYmxhaF9kZV9ibGFoKQorICBlbmQKKyAgCisgIGV4YW1wbGUgImVycm9yIGZyb20gZW1wdHkgaW5wdXQiIGRvCisgICAgIyBpZiB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgYSBjdXN0b21pemVkIHN0cmVhbSwgbGV4ZXJzIGFuZCBwYXJzZXJzIHdpbGwKKyAgICAjIGF1dG9tYXRpY2FsbHkgd3JhcCBpbnB1dCBpbiB0aGUgc3RhbmRhcmQgc3RyZWFtIGNsYXNzZXMKKyAgICBsZXhlciA9IElkZW50aWZpZXJzOjpMZXhlci5uZXcoICcnICkKKyAgICBwYXJzZXIgPSBJZGVudGlmaWVyczo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlci5kb2N1bWVudAorICAgIAorICAgIHBhcnNlci5yZXBvcnRlZF9lcnJvcnMuc2hvdWxkIGhhdmUoIDEgKS50aGluZworICBlbmQKKyAgCisgIGV4YW1wbGUgJ2F1dG9tYXRpYyBpbnB1dCB3cmFwcGluZycgZG8KKyAgICAjIGlmIHRoZSBwYXJzZXIgaXMgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgbGV4ZXIgY2xhc3MKKyAgICAjIHRvIHVzZSAodHlwaWNhbGx5IHdoZW4gaXQgY29tZXMgZnJvbSBhIGNvbWJpbmVkIGdyYW1tYXIpLAorICAgICMgYW5kIHlvdSBkb24ndCBuZWVkIHRvIGRvIGFueSBzcGVjaWFsIHRva2VuIHByb2Nlc3NpbmcKKyAgICAjIGJlZm9yZSBtYWtpbmcgYSBwYXJzZXIsIHRoaXMgaXMgYW4gZXh0cmEgc2hvcnRjdXQgZm9yCisgICAgIyBwYXJzZXIgY29uc3RydWN0aW9uCisgICAgcGFyc2VyID0gSWRlbnRpZmllcnM6OlBhcnNlci5uZXcoICdibGFoX2RlX2JsYWgnLCA6ZmlsZSA9PiAnYmxhaC50eHQnICkKKyAgICAKKyAgICBwYXJzZXIuZG9jdW1lbnQKKyAgICAKKyAgICBwYXJzZXIucmVwb3J0ZWRfZXJyb3JzLnNob3VsZCBiZV9lbXB0eQorICAgIHBhcnNlci5pZGVudGlmaWVycy5zaG91bGQgPT0gJXcoYmxhaF9kZV9ibGFoKQorICBlbmQKK2VuZAorCitjbGFzcyBUZXN0UGFyc2VyMDAyIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBTaW1wbGVMYW5ndWFnZTsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQHBhcnNlcjo6aW5pdCB7CisgICAgICBAZXZlbnRzID0gW10KKyAgICAgIEByZXBvcnRlZF9lcnJvcnMgPSBbXQorICAgIH0KKyAgICAKKyAgICBAcGFyc2VyOjptZW1iZXJzIHsKKyAgICAgIGF0dHJfcmVhZGVyIDpyZXBvcnRlZF9lcnJvcnMsIDpldmVudHMKKyAgICAgIAorICAgICAgZGVmIGVtaXRfZXJyb3JfbWVzc2FnZShtc2cpCisgICAgICAgIEByZXBvcnRlZF9lcnJvcnMgPDwgbXNnCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgZG9jdW1lbnQ6CisgICAgICAgICAgICAoIGRlY2xhcmF0aW9uCisgICAgICAgICAgICB8IGNhbGwKKyAgICAgICAgICAgICkqCisgICAgICAgICAgICBFT0YKKyAgICAgICAgOworICAgIAorICAgIGRlY2xhcmF0aW9uOgorICAgICAgICAgICAgJ3ZhcicgdD1JREVOVElGSUVSICc7JworICAgICAgICAgICAge0BldmVudHMgPDwgWydkZWNsJywgJHQudGV4dF19CisgICAgICAgIDsKKyAgICAKKyAgICBjYWxsOgorICAgICAgICAgICAgdD1JREVOVElGSUVSICcoJyAnKScgJzsnCisgICAgICAgICAgICB7QGV2ZW50cyA8PCBbJ2NhbGwnLCAkdC50ZXh0XX0KKyAgICAgICAgOworICAgIAorICAgIElERU5USUZJRVI6ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKjsKKyAgICBXUzogICgnICd8J1xyJ3wnXHQnfCdcbicpIHskY2hhbm5lbD1ISURERU47fTsKKyAgRU5ECisgIAorICAKKyAgZXhhbXBsZSAicGFyc2luZyBkZWNscyBhbmQgY2FsbHMiIGRvCisgICAgbGV4ZXIgID0gU2ltcGxlTGFuZ3VhZ2U6OkxleGVyLm5ldyggInZhciBmb29iYXI7IGduYXJ6KCk7IHZhciBibHVwcDsgZmx1cHAgKCApIDsiICkKKyAgICBwYXJzZXIgPSBTaW1wbGVMYW5ndWFnZTo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgIAorICAgIHBhcnNlci5kb2N1bWVudAorICAgIAorICAgIHBhcnNlci5yZXBvcnRlZF9lcnJvcnMuc2hvdWxkIGJlX2VtcHR5CisgICAgcGFyc2VyLmV2ZW50cy5zaG91bGQgPT0gWyAKKyAgICAgICV3KGRlY2wgZm9vYmFyKSwKKyAgICAgICV3KGNhbGwgZ25hcnopLAorICAgICAgJXcoZGVjbCBibHVwcCksCisgICAgICAldyhjYWxsIGZsdXBwKQorICAgIF0KKyAgZW5kCisgIAorICBleGFtcGxlICJiYWQgZGVjbGFyYXRpb24iIGRvCisgICAgbGV4ZXIgID0gU2ltcGxlTGFuZ3VhZ2U6OkxleGVyLm5ldyggJ3ZhcjsgZm9vKCknICkKKyAgICBwYXJzZXIgPSBTaW1wbGVMYW5ndWFnZTo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgIAorICAgIHBhcnNlci5kb2N1bWVudAorICAgIAorICAgIHBhcnNlci5yZXBvcnRlZF9lcnJvcnMuc2hvdWxkIGhhdmUoIDEgKS50aGluZworICAgIHBhcnNlci5ldmVudHMuc2hvdWxkIGJlX2VtcHR5CisgIGVuZAorICAKKyAgZXhhbXBsZSAiZXJyb3IgcmVjb3ZlcnkgdmlhIHRva2VuIGluc2VydGlvbiIgZG8KKyAgICBsZXhlciAgPSBTaW1wbGVMYW5ndWFnZTo6TGV4ZXIubmV3KCAnZ25hcnooOyBmbHVwcCgpOycgKQorICAgIHBhcnNlciA9IFNpbXBsZUxhbmd1YWdlOjpQYXJzZXIubmV3KCBsZXhlciApCisgICAgCisgICAgcGFyc2VyLmRvY3VtZW50CisgICAgCisgICAgcGFyc2VyLnJlcG9ydGVkX2Vycm9ycy5zaG91bGQgaGF2ZSggMSApLnRoaW5nCisgICAgcGFyc2VyLmV2ZW50cy5zaG91bGQgPT0gWyAKKyAgICAgICV3KGNhbGwgZ25hcnopLAorICAgICAgJXcoY2FsbCBmbHVwcCkKKyAgICBdCisgIGVuZAorICAKK2VuZAorCitjbGFzcyBUZXN0UGFyc2VyMDAzIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBNb3JlQ29tcGxpY2F0ZWQ7CisgICAgCisgICAgb3B0aW9ucyB7IGxhbmd1YWdlID0gUnVieTsgfQorICAgIAorICAgIEBpbml0IHsKKyAgICAgIEByZXBvcnRlZF9lcnJvcnMgPSBbXQorICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7CisgICAgICBhdHRyX3JlYWRlciA6cmVwb3J0ZWRfZXJyb3JzCisgICAgICAKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICBAcmVwb3J0ZWRfZXJyb3JzIDw8IG1zZworICAgICAgZW5kCisgICAgfQorICAgIAorICAgIHByb2dyYW0KKyAgICAgICAgOiAgIGRlY2xhcmF0aW9uKworICAgICAgICA7CisgICAgCisgICAgZGVjbGFyYXRpb24KKyAgICAgICAgOiAgIHZhcmlhYmxlCisgICAgICAgIHwgICBmdW5jdGlvbkhlYWRlciAnOycKKyAgICAgICAgfCAgIGZ1bmN0aW9uSGVhZGVyIGJsb2NrCisgICAgICAgIDsKKyAgICAKKyAgICB2YXJpYWJsZQorICAgICAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICc7JworICAgICAgICA7CisgICAgCisgICAgZGVjbGFyYXRvcgorICAgICAgICA6ICAgSUQgCisgICAgICAgIDsKKyAgICAKKyAgICBmdW5jdGlvbkhlYWRlcgorICAgICAgICA6ICAgdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJworICAgICAgICA7CisgICAgCisgICAgZm9ybWFsUGFyYW1ldGVyCisgICAgICAgIDogICB0eXBlIGRlY2xhcmF0b3IgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgdHlwZQorICAgICAgICA6ICAgJ2ludCcgICAKKyAgICAgICAgfCAgICdjaGFyJyAgCisgICAgICAgIHwgICAndm9pZCcKKyAgICAgICAgfCAgIElEICAgICAgICAKKyAgICAgICAgOworICAgIAorICAgIGJsb2NrCisgICAgICAgIDogICAneycKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSoKKyAgICAgICAgICAgICAgICBzdGF0KgorICAgICAgICAgICAgJ30nCisgICAgICAgIDsKKyAgICAKKyAgICBzdGF0OiBmb3JTdGF0CisgICAgICAgIHwgZXhwciAnOycgICAgICAKKyAgICAgICAgfCBibG9jaworICAgICAgICB8IGFzc2lnblN0YXQgJzsnCisgICAgICAgIHwgJzsnCisgICAgICAgIDsKKyAgICAKKyAgICBmb3JTdGF0CisgICAgICAgIDogICAnZm9yJyAnKCcgYXNzaWduU3RhdCAnOycgZXhwciAnOycgYXNzaWduU3RhdCAnKScgYmxvY2sgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgYXNzaWduU3RhdAorICAgICAgICA6ICAgSUQgJz0nIGV4cHIgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgZXhwcjogICBjb25kRXhwcgorICAgICAgICA7CisgICAgCisgICAgY29uZEV4cHIKKyAgICAgICAgOiAgIGFleHByICggKCc9PScgfCAnPCcpIGFleHByICk/CisgICAgICAgIDsKKyAgICAKKyAgICBhZXhwcgorICAgICAgICA6ICAgYXRvbSAoICcrJyBhdG9tICkqCisgICAgICAgIDsKKyAgICAKKyAgICBhdG9tCisgICAgICAgIDogSUQgICAgICAKKyAgICAgICAgfCBJTlQgICAgICAKKyAgICAgICAgfCAnKCcgZXhwciAnKScKKyAgICAgICAgOyAKKyAgICAKKyAgICBJRCAgOiAgICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnMCcuLic5J3wnXycpKgorICAgICAgICA7CisgICAgCisgICAgSU5UIDoJKCcwJy4uJzknKSsKKyAgICAgICAgOworICAgIAorICAgIFdTICA6ICAgKCAgICcgJworICAgICAgICAgICAgfCAgICdcdCcKKyAgICAgICAgICAgIHwgICAnXHInCisgICAgICAgICAgICB8ICAgJ1xuJworICAgICAgICAgICAgKSsKKyAgICAgICAgICAgIHskY2hhbm5lbD1ISURERU59CisgICAgICAgIDsgICAgCisgIEVORAorICAKKyAgZXhhbXBsZSAicGFyc2luZyAnaW50IGZvbzsnIiBkbworICAgIGxleGVyID0gTW9yZUNvbXBsaWNhdGVkOjpMZXhlci5uZXcgImludCBmb287IgorICAgIHBhcnNlciA9IE1vcmVDb21wbGljYXRlZDo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5wcm9ncmFtCisgICAgcGFyc2VyLnJlcG9ydGVkX2Vycm9ycy5zaG91bGQgYmVfZW1wdHkKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAiY2F0Y2hpbmcgYmFkbHkgZm9ybWVkIGlucHV0IiBkbworICAgIGxleGVyID0gTW9yZUNvbXBsaWNhdGVkOjpMZXhlci5uZXcgImludCBmb28oKSB7IDErMiB9IgorICAgIHBhcnNlciA9IE1vcmVDb21wbGljYXRlZDo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5wcm9ncmFtCisgICAgcGFyc2VyLnJlcG9ydGVkX2Vycm9ycy5zaG91bGQgaGF2ZSggMSApLnRoaW5nCisgIGVuZAorICAKKyAgZXhhbXBsZSAidHdvIGluc3RhbmNlcyBvZiBiYWRseSBmb3JtZWQgaW5wdXQiIGRvCisgICAgbGV4ZXIgPSBNb3JlQ29tcGxpY2F0ZWQ6OkxleGVyLm5ldyAiaW50IGZvbygpIHsgMSs7IDErMiB9IgorICAgIHBhcnNlciA9IE1vcmVDb21wbGljYXRlZDo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5wcm9ncmFtCisgICAgcGFyc2VyLnJlcG9ydGVkX2Vycm9ycy5zaG91bGQgaGF2ZSggMiApLnRoaW5ncworICBlbmQKKyAgCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9jYWxjLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2NhbGMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4NTc1YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9jYWxjLnJiCkBAIC0wLDAgKzEsOTggQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgVGVzdENhbGNQYXJzZXIgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRlc3RDYWxjOworICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAKKyAgICBAcGFyc2VyOjppbml0IHsKKyAgICAgIEByZXBvcnRlZF9lcnJvcnMgPSBbXQorICAgIH0KKyAgICAKKyAgICBAcGFyc2VyOjptZW1iZXJzIHsKKyAgICAgIGF0dHJfcmVhZGVyIDpyZXBvcnRlZF9lcnJvcnMKKyAgICAgIAorICAgICAgZGVmIGVtaXRfZXJyb3JfbWVzc2FnZShtc2cpCisgICAgICAgIEByZXBvcnRlZF9lcnJvcnMgPDwgbXNnCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgZXZhbHVhdGUgcmV0dXJucyBbcmVzdWx0XTogcj1leHByZXNzaW9uIHsgJHJlc3VsdCA9ICRyLnJlc3VsdCB9OworICAgIAorICAgIGV4cHJlc3Npb24gcmV0dXJucyBbcmVzdWx0XToKKyAgICAgICAgICAgICAgIHI9bXVsdCB7ICRyZXN1bHQgPSAkci5yZXN1bHQgfQorICAgICAgICAoCisgICAgICAgICAgJysnIHIyPW11bHQgeyAkcmVzdWx0ICs9ICRyMi5yZXN1bHQgfQorICAgICAgICB8ICctJyByMj1tdWx0IHsgJHJlc3VsdCAtPSAkcjIucmVzdWx0IH0KKyAgICAgICAgKSoKKyAgICAgICAgOworICAgIAorICAgIG11bHQgcmV0dXJucyBbcmVzdWx0XToKKyAgICAgICAgICAgICAgIHI9bG9nIHsgJHJlc3VsdCA9ICRyLnJlc3VsdCB9CisgICAgICAgICgKKyAgICAgICAgICAnKicgcjI9bG9nIHskcmVzdWx0ICo9ICRyMi5yZXN1bHR9CisgICAgICAgIHwgJy8nIHIyPWxvZyB7JHJlc3VsdCAvPSAkcjIucmVzdWx0fQorICAgICAgICB8ICclJyByMj1sb2cgeyRyZXN1bHQgXCU9ICRyMi5yZXN1bHR9CisgICAgICAgICkqCisgICAgICAgIDsKKyAgICAKKyAgICBsb2cgcmV0dXJucyBbcmVzdWx0XTogJ2xuJyByPWV4cCB7JHJlc3VsdCA9IE1hdGgubG9nKCRyLnJlc3VsdCl9CisgICAgICAgIHwgcj1leHAgeyRyZXN1bHQgPSAkci5yZXN1bHR9CisgICAgICAgIDsKKyAgICAKKyAgICBleHAgcmV0dXJucyBbcmVzdWx0XTogcj1hdG9tIHsgJHJlc3VsdCA9ICRyLnJlc3VsdCB9ICgnXicgcjI9YXRvbSB7ICRyZXN1bHQgKio9ICRyMi5yZXN1bHQgfSApPworICAgICAgICA7CisgICAgCisgICAgYXRvbSByZXR1cm5zIFtyZXN1bHRdOgorICAgICAgICBuPUlOVEVHRVIgeyRyZXN1bHQgPSBJbnRlZ2VyKCRuLnRleHQpfQorICAgICAgfCBuPURFQ0lNQUwgeyRyZXN1bHQgPSBGbG9hdCgkbi50ZXh0KX0gCisgICAgICB8ICcoJyByPWV4cHJlc3Npb24geyRyZXN1bHQgPSAkci5yZXN1bHR9ICcpJworICAgICAgfCAnUEknIHskcmVzdWx0ID0gTWF0aDo6UEl9CisgICAgICB8ICdFJyB7JHJlc3VsdCA9IE1hdGg6OkV9CisgICAgICA7CisgICAgCisgICAgSU5URUdFUjogRElHSVQrOworICAgIAorICAgIERFQ0lNQUw6IERJR0lUKyAnLicgRElHSVQrOworICAgIAorICAgIGZyYWdtZW50CisgICAgRElHSVQ6ICcwJy4uJzknOworICAgIAorICAgIFdTOiAoJyAnIHwgJ1xuJyB8ICdcdCcpKyB7JGNoYW5uZWwgPSBISURERU59OworICBFTkQKKyAgCisgIGRlZiBldmFsdWF0ZSggZXhwcmVzc2lvbiApCisgICAgbGV4ZXIgID0gVGVzdENhbGM6OkxleGVyLm5ldyggZXhwcmVzc2lvbiApCisgICAgcGFyc2VyID0gVGVzdENhbGM6OlBhcnNlci5uZXcgbGV4ZXIKKyAgICB2YWx1ZSA9IHBhcnNlci5ldmFsdWF0ZQorICAgIGVycm9ycyA9IHBhcnNlci5yZXBvcnRlZF9lcnJvcnMKKyAgICByZXR1cm4gWyB2YWx1ZSwgZXJyb3JzIF0KKyAgZW5kCisgIAorICB0ZXN0cyA9ICVbCisgICAgMSArIDIgICAgICAgICAgICA9IDMKKyAgICAxICsgMiAqIDMgICAgICAgID0gNworICAgIDEwIC8gMiAgICAgICAgICAgPSA1CisgICAgNiArIDIqKDMrMSkgLSA0ICA9IDEwCisgIF0uc3RyaXAhLnNwbGl0KCAvXG4vICkubWFwIHsgfGxpbmV8IAorICAgIGV4cHIsIHZhbCA9IGxpbmUuc3RyaXAuc3BsaXQoIC9ccys9XHMrLywgMiApCisgICAgWyBleHByLCBJbnRlZ2VyKCB2YWwgKSBdCisgIH0KKyAgCisgIHRlc3RzLmVhY2ggZG8gfGV4cHJlc3Npb24sIHRydWVfdmFsdWV8CisgICAgZXhhbXBsZSAic2hvdWxkIHBhcnNlICcjeyBleHByZXNzaW9uIH0nIiBkbworICAgICAgcGFyc2VyX3ZhbHVlLCBlcnJvcnMgPSBldmFsdWF0ZSggZXhwcmVzc2lvbiApCisgICAgICBwYXJzZXJfdmFsdWUuc2hvdWxkID09IHRydWVfdmFsdWUKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICJiYWRseSBmb3JtZWQgaW5wdXQiIGRvCisgICAgdmFsLCBlcnJvcnMgPSBldmFsdWF0ZSAiNiAtICgyKjEiCisgICAgCisgICAgZXJyb3JzLnNob3VsZCBoYXZlKCAxICkudGhpbmcKKyAgICBlcnJvcnMuZmlyc3Quc2hvdWxkID1+IC9taXNtYXRjaGVkLworICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2xsLXN0YXIucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvbGwtc3Rhci5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBjN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL2xsLXN0YXIucmIKQEAgLTAsMCArMSwxNDMgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgVGVzdExMU3RhclBhcnNlciA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgTExTdGFyOworICAgIAorICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICBAaGVhZGVyIHsgIHJlcXVpcmUgJ3N0cmluZ2lvJyB9CisgICAgQGluaXQgeyBAb3V0cHV0ID0gU3RyaW5nSU8ubmV3KCkgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGRlZiBvdXRwdXQKKyAgICAgICAgQG91dHB1dC5zdHJpbmcKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBwcm9ncmFtCisgICAgICAgIDogICBkZWNsYXJhdGlvbisKKyAgICAgICAgOworICAgIAorICAgIC8qKiBJbiB0aGlzIHJ1bGUsIHRoZSBmdW5jdGlvbkhlYWRlciBsZWZ0IHByZWZpeCBvbiB0aGUgbGFzdCB0d28KKyAgICAgKiAgYWx0ZXJuYXRpdmVzIGlzIG5vdCBMTChrKSBmb3IgYSBmaXhlZCBrLiAgSG93ZXZlciwgaXQgaXMKKyAgICAgKiAgTEwoKikuICBUaGUgTEwoKikgYWxnb3JpdGhtIHNpbXBseSBzY2FucyBhaGVhZCB1bnRpbCBpdCBzZWVzCisgICAgICogIGVpdGhlciB0aGUgJzsnIG9yIHRoZSAneycgb2YgdGhlIGJsb2NrIGFuZCB0aGVuIGl0IHBpY2tzCisgICAgICogIHRoZSBhcHByb3ByaWF0ZSBhbHRlcm5hdGl2ZS4gIExvb2toZWFkIGNhbiBiZSBhcmJpdHJhcmlseQorICAgICAqICBsb25nIGluIHRoZW9yeSwgYnV0IGlzIDw9MTAgaW4gbW9zdCBjYXNlcy4gIFdvcmtzIGdyZWF0LgorICAgICAqICBVc2UgQU5UTFJXb3JrcyB0byBzZWUgdGhlIGxvb2sgdXNlIChzdGVwIGJ5IExvY2F0aW9uKQorICAgICAqICBhbmQgbG9vayBmb3IgYmx1ZSB0b2tlbnMgaW4gdGhlIGlucHV0IHdpbmRvdyBwYW5lLiA6KQorICAgICAqLworICAgIGRlY2xhcmF0aW9uCisgICAgICAgIDogICB2YXJpYWJsZQorICAgICAgICB8ICAgZnVuY3Rpb25IZWFkZXIgJzsnCisgICAgICB7IEBvdXRwdXQucHV0cyggJGZ1bmN0aW9uSGVhZGVyLm5hbWUgKyAiIGlzIGEgZGVjbGFyYXRpb24iKSB9CisgICAgICAgIHwgICBmdW5jdGlvbkhlYWRlciBibG9jaworICAgICAgeyBAb3V0cHV0LnB1dHMoICRmdW5jdGlvbkhlYWRlci5uYW1lICsgIiBpcyBhIGRlZmluaXRpb24iKSB9CisgICAgICAgIDsKKyAgICAKKyAgICB2YXJpYWJsZQorICAgICAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICc7JworICAgICAgICA7CisgICAgCisgICAgZGVjbGFyYXRvcgorICAgICAgICA6ICAgSUQgCisgICAgICAgIDsKKyAgICAKKyAgICBmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtuYW1lXQorICAgICAgICA6ICAgdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJworICAgICAgeyRuYW1lID0gJElELnRleHR9CisgICAgICAgIDsKKyAgICAKKyAgICBmb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAgICAgICAgCisgICAgICAgIDsKKyAgICAKKyAgICB0eXBlCisgICAgICAgIDogICAnaW50JyAgIAorICAgICAgICB8ICAgJ2NoYXInICAKKyAgICAgICAgfCAgICd2b2lkJworICAgICAgICB8ICAgSUQgICAgICAgIAorICAgICAgICA7CisgICAgCisgICAgYmxvY2sKKyAgICAgICAgOiAgICd7JworICAgICAgICAgICAgICAgIHZhcmlhYmxlKgorICAgICAgICAgICAgICAgIHN0YXQqCisgICAgICAgICAgICAnfScKKyAgICAgICAgOworICAgIAorICAgIHN0YXQ6IGZvclN0YXQKKyAgICAgICAgfCBleHByICc7JyAgICAgIAorICAgICAgICB8IGJsb2NrCisgICAgICAgIHwgYXNzaWduU3RhdCAnOycKKyAgICAgICAgfCAnOycKKyAgICAgICAgOworICAgIAorICAgIGZvclN0YXQKKyAgICAgICAgOiAgICdmb3InICcoJyBhc3NpZ25TdGF0ICc7JyBleHByICc7JyBhc3NpZ25TdGF0ICcpJyBibG9jayAgICAgICAgCisgICAgICAgIDsKKyAgICAKKyAgICBhc3NpZ25TdGF0CisgICAgICAgIDogICBJRCAnPScgZXhwciAgICAgICAgCisgICAgICAgIDsKKyAgICAKKyAgICBleHByOiAgIGNvbmRFeHByCisgICAgICAgIDsKKyAgICAKKyAgICBjb25kRXhwcgorICAgICAgICA6ICAgYWV4cHIgKCAoJz09JyB8ICc8JykgYWV4cHIgKT8KKyAgICAgICAgOworICAgIAorICAgIGFleHByCisgICAgICAgIDogICBhdG9tICggJysnIGF0b20gKSoKKyAgICAgICAgOworICAgIAorICAgIGF0b20KKyAgICAgICAgOiBJRCAgICAgIAorICAgICAgICB8IElOVCAgICAgIAorICAgICAgICB8ICcoJyBleHByICcpJworICAgICAgICA7IAorICAgIAorICAgIElEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgICAgIDsKKyAgICAKKyAgICBJTlQgOgkoJzAnLi4nOScpKworICAgICAgICA7CisgICAgCisgICAgV1MgIDogICAoICAgJyAnCisgICAgICAgICAgICB8ICAgJ1x0JworICAgICAgICAgICAgfCAgICdccicKKyAgICAgICAgICAgIHwgICAnXG4nCisgICAgICAgICAgICApKworICAgICAgICAgICAgeyRjaGFubmVsPUhJRERFTn0KKyAgICAgICAgOworICBFTkQKKyAgCisgIAorICBleGFtcGxlICJwYXJzaW5nIHdpdGggYSBMTCgqKSBncmFtbWFyIiBkbworICAgIGxleGVyID0gTExTdGFyOjpMZXhlci5uZXcoIDw8LSdFTkQnLmZpeGVkX2luZGVudCggMCApICkKKyAgICAgIGNoYXIgYzsKKyAgICAgIGludCB4OworICAgICAgCisgICAgICB2b2lkIGJhcihpbnQgeCk7CisgICAgICAKKyAgICAgIGludCBmb28oaW50IHksIGNoYXIgZCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpPTA7IGk8MzsgaT1pKzEpIHsKKyAgICAgICAgICB4PTM7CisgICAgICAgICAgeT01OworICAgICAgICB9CisgICAgICB9CisgICAgRU5ECisgICAgcGFyc2VyID0gTExTdGFyOjpQYXJzZXIubmV3IGxleGVyCisgICAgCisgICAgcGFyc2VyLnByb2dyYW0KKyAgICBwYXJzZXIub3V0cHV0LnNob3VsZCA9PSA8PC0nRU5EJy5maXhlZF9pbmRlbnQoIDAgKQorICAgICAgYmFyIGlzIGEgZGVjbGFyYXRpb24KKyAgICAgIGZvbyBpcyBhIGRlZmluaXRpb24KKyAgICBFTkQKKyAgZW5kCisgIAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvbnVhbmNlcy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9udWFuY2VzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDRlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvbnVhbmNlcy5yYgpAQCAtMCwwICsxLDE2NCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0RW1wdHlBbHRlcm5hdGl2ZSA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBFbXB0eUFsdDsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgcgorICAgICAgOiBOQU1FIAorICAgICAgICAoIFdTKyBOQU1FCisgICAgICAgIHwgCisgICAgICAgICkKKyAgICAgICAgRU9GCisgICAgICA7CisgICAgCisgICAgTkFNRTogKCdhJy4uJ3onKSAoJ2EnLi4neicgfCAnMCcuLic5JykrOworICAgIE5VTUJFUjogKCcwJy4uJzknKSs7CisgICAgV1M6ICcgJys7CisgIEVORAorICAKKyAgZXhhbXBsZSAicnVsZSB3aXRoIGVtcHR5IGFsdGVybmF0aXZlIiBkbworICAgIGxleGVyID0gRW1wdHlBbHQ6OkxleGVyLm5ldyggJ2ZvbycgKQorICAgIHBhcnNlciA9IEVtcHR5QWx0OjpQYXJzZXIubmV3IGxleGVyCisgICAgZXZlbnRzID0gcGFyc2VyLnIKKyAgZW5kCisKK2VuZAorCitjbGFzcyBUZXN0U3VicnVsZVByZWRpY3Rpb24gPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgU3VicnVsZTsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQHBhcnNlcjo6bWVtYmVycyB7CisgICAgICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKG1zZykKKyAgICAgICAgIyBkbyBub3RoaW5nCisgICAgICBlbmQKKyAgICAgIGRlZiByZXBvcnRfZXJyb3IoZXJyb3IpCisgICAgICAgIHJhaXNlIGVycm9yCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgYTogJ0JFR0lOJyBiIFdTKyAnRU5EJzsKKyAgICBiOiAoIFdTKyAnQScgKSs7CisgICAgV1M6ICcgJzsKKyAgRU5ECisgIAorICBleGFtcGxlICJtYWtlIGNvcnJlY3QgcHJlZGljdGlvbnMgaW52b2x2aW5nIHN1YnJ1bGVzIiBkbworICAgIGxleGVyID0gU3VicnVsZTo6TGV4ZXIubmV3KCAnQkVHSU4gQSBFTkQnICkKKyAgICBwYXJzZXIgPSBTdWJydWxlOjpQYXJzZXIubmV3IGxleGVyCisgICAgZXZlbnRzID0gcGFyc2VyLmEKKyAgZW5kCisKK2VuZAorCisKK2NsYXNzIFRlc3RTcGVjaWFsU3RhdGVzIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFNwZWNpYWxTdGF0ZXM7CisgICAgb3B0aW9ucyB7IGxhbmd1YWdlID0gUnVieTsgfQorICAgIAorICAgIEBpbml0IHsgQGNvbmQgPSB0cnVlIH0KKyAgICAKKyAgICBAbWVtYmVycyB7CisgICAgICBhdHRyX2FjY2Vzc29yIDpjb25kCisgICAgICBkZWYgcmVjb3ZlcihyZSkKKyAgICAgICAgcmFpc2UgcmUKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICByCisgICAgICA6ICggeyBAY29uZCB9PyBOQU1FCisgICAgICAgIHwgeyFAY29uZCB9PyBOQU1FIFdTKyBOQU1FCisgICAgICAgICkKKyAgICAgICAgKCBXUysgTkFNRSApPworICAgICAgICBFT0YKKyAgICAgIDsKKyAgICAKKyAgICBOQU1FOiAoJ2EnLi4neicpICgnYScuLid6JyB8ICcwJy4uJzknKSs7CisgICAgTlVNQkVSOiAoJzAnLi4nOScpKzsKKyAgICBXUzogJyAnKzsKKyAgRU5ECisKKyAgZXhhbXBsZSAicGFyc2luZyAnZm9vJyIgZG8KKyAgICBsZXhlciAgPSBTcGVjaWFsU3RhdGVzOjpMZXhlci5uZXcgJ2ZvbycKKyAgICBwYXJzZXIgPSBTcGVjaWFsU3RhdGVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLnIKKyAgZW5kCisKKyAgZXhhbXBsZSAicGFyc2luZyAnZm9vIG5hbWUxJyIgIGRvCisgICAgbGV4ZXIgPSBTcGVjaWFsU3RhdGVzOjpMZXhlci5uZXcgJ2ZvbyBuYW1lMScKKyAgICBwYXJzZXIgPSBTcGVjaWFsU3RhdGVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLnIKKyAgZW5kCisKKyAgZXhhbXBsZSAicGFyc2luZyAnYmFyIG5hbWUxJyIgIGRvCisgICAgbGV4ZXIgPSBTcGVjaWFsU3RhdGVzOjpMZXhlci5uZXcgJ2JhciBuYW1lMScKKyAgICBwYXJzZXIgPSBTcGVjaWFsU3RhdGVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLmNvbmQgPSBmYWxzZQorICAgIHBhcnNlci5yCisgIGVuZAorCisgIGV4YW1wbGUgInBhcnNpbmcgJ2JhciBuYW1lMSBuYW1lMiciIGRvCisgICAgbGV4ZXIgPSBTcGVjaWFsU3RhdGVzOjpMZXhlci5uZXcgJ2JhciBuYW1lMSBuYW1lMicKKyAgICBwYXJzZXIgPSBTcGVjaWFsU3RhdGVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLmNvbmQgPSBmYWxzZQorICAgIHBhcnNlci5yCisgIGVuZAorZW5kCisKKworY2xhc3MgVGVzdERGQUJ1ZyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBERkFCdWc7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICAgICAgb3V0cHV0ID0gQVNUOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyB0aGlzIHJ1bGUgdXNlZCB0byBnZW5lcmF0ZSBhbiBpbmZpbml0ZSBsb29wIGluIERGQS5wcmVkaWN0CisgICAgcgorICAgIG9wdGlvbnMgeyBiYWNrdHJhY2s9dHJ1ZTsgfQorICAgICAgICA6IChtb2RpZmllcisgSU5UKT0+IG1vZGlmaWVyKyBleHByZXNzaW9uCisgICAgICAgIHwgbW9kaWZpZXIrIHN0YXRlbWVudAorICAgICAgICA7CisgICAgCisgICAgZXhwcmVzc2lvbgorICAgICAgICA6IElOVCAnKycgSU5UCisgICAgICAgIDsKKyAgICAKKyAgICBzdGF0ZW1lbnQKKyAgICAgICAgOiAnZm9vemUnCisgICAgICAgIHwgJ2Zvb3plMicKKyAgICAgICAgOworICAgIAorICAgIG1vZGlmaWVyCisgICAgICAgIDogJ3B1YmxpYycKKyAgICAgICAgfCAncHJpdmF0ZScKKyAgICAgICAgOworICAgIAorICAgIElEIDogJ2EnLi4neicgKyA7CisgICAgSU5UIDogJzAnLi4nOScgKzsKKyAgICBXUzogKCcgJyB8ICdcbicgfCAnXHQnKSsgeyRjaGFubmVsID0gSElEREVOO307CisgIEVORAorCisgIGV4YW1wbGUgInRlc3RpbmcgZm9yIERGQS1iYXNlZCBkZWNpc2lvbiBidWciIGRvCisgICAgbGV4ZXIgPSBERkFCdWc6OkxleGVyLm5ldyAncHVibGljIGZvb3plJworICAgIHBhcnNlciA9IERGQUJ1Zzo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5yCisgIGVuZAorICAKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3ByZWRpY2F0ZXMucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvcHJlZGljYXRlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRmYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3ByZWRpY2F0ZXMucmIKQEAgLTAsMCArMSwxMDIgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgVGVzdFByZWRpY2F0ZUhvaXN0IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFRlc3RIb2lzdDsKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICAvKiBXaXRoIHRoaXMgdHJ1ZSwgZW51bSBpcyBzZWVuIGFzIGEga2V5d29yZC4gIEZhbHNlLCBpdCdzIGFuIGlkZW50aWZpZXIgKi8KKyAgICBAcGFyc2VyOjppbml0IHsKKyAgICAgIEBlbmFibGVfZW51bSA9IGZhbHNlCisgICAgfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGF0dHJfYWNjZXNzb3IgOmVuYWJsZV9lbnVtCisgICAgfQorICAgIAorICAgIHN0YXQgcmV0dXJucyBbZW51bUlzXQorICAgICAgICA6IGlkZW50aWZpZXIgICAgeyRlbnVtSXMgPSAiSUQifQorICAgICAgICB8IGVudW1Bc0tleXdvcmQgeyRlbnVtSXMgPSAia2V5d29yZCJ9CisgICAgICAgIDsKKyAgICAKKyAgICBpZGVudGlmaWVyCisgICAgICAgIDogSUQKKyAgICAgICAgfCBlbnVtQXNJRAorICAgICAgICA7CisgICAgCisgICAgZW51bUFzS2V5d29yZCA6IHtAZW5hYmxlX2VudW19PyAnZW51bScgOworICAgIAorICAgIGVudW1Bc0lEIDogeyFAZW5hYmxlX2VudW19PyAnZW51bScgOworICAgIAorICAgIElEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgICAgIDsKKyAgICAKKyAgICBJTlQgOgkoJzAnLi4nOScpKworICAgICAgICA7CisgICAgCisgICAgV1MgIDogICAoICAgJyAnCisgICAgICAgICAgICB8ICAgJ1x0JworICAgICAgICAgICAgfCAgICdccicKKyAgICAgICAgICAgIHwgICAnXG4nCisgICAgICAgICAgICApKworICAgICAgICAgICAgeyRjaGFubmVsPUhJRERFTn0KKyAgICAgICAgOworICBFTkQKKyAgCisgIAorICBleGFtcGxlICInZW51bScgaXMgYSBrZXl3b3JkIiBkbworICAgIGxleGVyID0gVGVzdEhvaXN0OjpMZXhlci5uZXcgJ2VudW0nCisgICAgcGFyc2VyID0gVGVzdEhvaXN0OjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLmVuYWJsZV9lbnVtID0gdHJ1ZQorICAgIHBhcnNlci5zdGF0LnNob3VsZCA9PSAna2V5d29yZCcKKyAgZW5kCisgIAorICBleGFtcGxlICInZW51bScgaXMgYW4gSUQiIGRvCisgICAgbGV4ZXIgPSBUZXN0SG9pc3Q6OkxleGVyLm5ldyAnZW51bScKKyAgICBwYXJzZXIgPSBUZXN0SG9pc3Q6OlBhcnNlci5uZXcgbGV4ZXIKKyAgICBwYXJzZXIuZW5hYmxlX2VudW0gPSBmYWxzZQorICAgIHBhcnNlci5zdGF0LnNob3VsZCA9PSAnSUQnCisgIGVuZAorICAKK2VuZAorCisKK2NsYXNzIFRlc3RTeW50YWN0aWNQcmVkaWNhdGUgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgU3ludGFjdGljUHJlZGljYXRlOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAcGFyc2VyOjptZW1iZXJzIHsKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIGVuZAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlcnJvcikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBhOiAoKHMrIFApPT4gcysgYik/IEU7CisgICAgYjogUCAnZm9vJzsKKyAgICAKKyAgICBzOiBTOworICAgIAorICAgIAorICAgIFM6ICcgJzsKKyAgICBQOiAnKyc7CisgICAgRTogJz4nOworICBFTkQKKyAgCisgIGV4YW1wbGUgInJ1bGUgd2l0aCBzeW50YWN0aWMgcHJlZGljYXRlIiBkbworICAgIGxleGVyID0gU3ludGFjdGljUHJlZGljYXRlOjpMZXhlci5uZXcoICcgICArZm9vPicgKQorICAgIHBhcnNlciA9IFN5bnRhY3RpY1ByZWRpY2F0ZTo6UGFyc2VyLm5ldyBsZXhlcgorICAgIGV2ZW50cyA9IHBhcnNlci5hCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvcHJvcGVydGllcy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9wcm9wZXJ0aWVzLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYmI3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvcHJvcGVydGllcy5yYgpAQCAtMCwwICsxLDI0MiBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0UnVsZVByb3BlcnR5UmVmZXJlbmNlIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJ1bGVQcm9wZXJ0aWVzOworICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAKKyAgICBAcGFyc2VyOjptZW1iZXJzIHsKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIGVuZAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlcnJvcikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBAbGV4ZXI6Om1lbWJlcnMgeworICAgICAgZGVmIGVtaXRfZXJyb3JfbWVzc2FnZShtc2cpCisgICAgICAgICMgZG8gbm90aGluZworICAgICAgZW5kCisgICAgICBkZWYgcmVwb3J0X2Vycm9yKGVycm9yKQorICAgICAgICByYWlzZSBlcnJvcgorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIGEgcmV0dXJucyBbYmxhXQorICAgIEBhZnRlciB7ICRibGEgPSBbJHN0YXJ0LCAkc3RvcCwgJHRleHRdIH0KKyAgICAgICAgOiBBKworICAgICAgICA7CisgICAgCisgICAgQTogJ2EnLi4neic7CisgICAgCisgICAgV1M6ICcgJysgIHsgJGNoYW5uZWwgPSBISURERU4gfTsKKyAgRU5ECisgIAorICBleGFtcGxlICJhY2Nlc3NpbmcgcnVsZSBwcm9wZXJ0aWVzIiBkbworICAgIGxleGVyID0gUnVsZVByb3BlcnRpZXM6OkxleGVyLm5ldyggJyAgIGEgYSBhIGEgICcgKQorICAgIHBhcnNlciA9IFJ1bGVQcm9wZXJ0aWVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgc3RhcnQsIHN0b3AsIHRleHQgPSBwYXJzZXIuYS5ibGEKKyAgICAKKyAgICBzdGFydC5pbmRleC5zaG91bGQgPT0gMQorICAgIHN0b3AuaW5kZXguc2hvdWxkID09IDcKKyAgICB0ZXh0LnNob3VsZCA9PSAnYSBhIGEgYScKKyAgZW5kCisKKworZW5kCisKK2NsYXNzIFRlc3RMYWJlbHMgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgTGFiZWxzOworICAgIG9wdGlvbnMgeyBsYW5ndWFnZSA9IFJ1Ynk7IH0KKyAgICAKKyAgICBAcGFyc2VyOjptZW1iZXJzIHsKKyAgICAgIGRlZiByZWNvdmVyKGUpCisgICAgICAgIHJhaXNlIGUKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBAbGV4ZXI6Om1lbWJlcnMgeworICAgICAgZGVmIHJlY292ZXIoZSkKKyAgICAgICAgcmFpc2UgZQorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIGEgcmV0dXJucyBbbF0KKyAgICAgICAgOiBpZHMrPUEgKCAnLCcgaWRzKz0oQXxCKSApKiBDIEQgdz0uIGlkcys9LiBGIEVPRgorICAgICAgICAgICAgeyAkbCA9IFskaWRzLCAkd10gfQorICAgICAgICA7CisgICAgCisgICAgQTogJ2EnLi4neic7CisgICAgQjogJzAnLi4nOSc7CisgICAgQzogYT0nQScgeyAkYSB9OworICAgIEQ6IGE9J0ZPT0JBUicgeyAkYSB9OworICAgIEU6ICdHTlUnIGE9LiB7ICRhIH07CisgICAgRjogJ0JMQVJaJyBhPUVPRiB7ICRhIH07CisgICAgCisgICAgV1M6ICcgJysgIHsgJGNoYW5uZWwgPSBISURERU4gfTsKKyAgRU5ECisgIAorICBleGFtcGxlICJwYXJzaW5nICdhLCBiLCBjLCAxLCAyIEEgRk9PQkFSIEdOVTEgQSBCTEFSWiciIGRvCisgICAgbGV4ZXIgPSBMYWJlbHM6OkxleGVyLm5ldyAnYSwgYiwgYywgMSwgMiBBIEZPT0JBUiBHTlUxIEEgQkxBUlonCisgICAgcGFyc2VyID0gTGFiZWxzOjpQYXJzZXIubmV3IGxleGVyCisgICAgaWRzLCB3ID0gcGFyc2VyLmEKKyAgICAKKyAgICBpZHMuc2hvdWxkIGhhdmUoIDYgKS50aGluZ3MKKyAgICBpZHNbIDAgXS50ZXh0LnNob3VsZCA9PSAnYScKKyAgICBpZHNbIDEgXS50ZXh0LnNob3VsZCA9PSAnYicKKyAgICBpZHNbIDIgXS50ZXh0LnNob3VsZCA9PSAnYycKKyAgICBpZHNbIDMgXS50ZXh0LnNob3VsZCA9PSAnMScKKyAgICBpZHNbIDQgXS50ZXh0LnNob3VsZCA9PSAnMicKKyAgICBpZHNbIDUgXS50ZXh0LnNob3VsZCA9PSAnQScKKyAgICAKKyAgICB3LnRleHQuc2hvdWxkID09ICdHTlUxJworICBlbmQKKworCitlbmQKKworCitjbGFzcyBUZXN0VG9rZW5MYWJlbFJlZmVyZW5jZSA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBUb2tlbkxhYmVsczsKKyAgICBvcHRpb25zIHsKKyAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQHBhcnNlcjo6bWVtYmVycyB7CisgICAgICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKG1zZykKKyAgICAgICAgIyBkbyBub3RoaW5nCisgICAgICBlbmQKKyAgICAgIGRlZiByZXBvcnRfZXJyb3IoZXJyb3IpCisgICAgICAgIHJhaXNlIGVycm9yCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgQGxleGVyOjptZW1iZXJzIHsKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIGVuZAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlcnJvcikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBhIHJldHVybnMgWyR0a10KKyAgICAgIDogdD1BCisgICAgICAgICAgeworICAgICAgICAgICAgJHRrID0gWworICAgICAgICAgICAgICAkdC50ZXh0LAorICAgICAgICAgICAgICAkdC50eXBlLAorICAgICAgICAgICAgICAkdC5uYW1lLAorICAgICAgICAgICAgICAkdC5saW5lLAorICAgICAgICAgICAgICAkdC5wb3MsCisgICAgICAgICAgICAgICR0LmluZGV4LAorICAgICAgICAgICAgICAkdC5jaGFubmVsCisgICAgICAgICAgICBdCisgICAgICAgICAgfQorICAgICAgOworICAgIAorICAgIEE6ICdhJy4uJ3onOworICAgIAorICAgIFdTICA6CisgICAgICAgICAgICAoICAgJyAnCisgICAgICAgICAgICB8ICAgJ1x0JworICAgICAgICAgICAgfCAgKCAnXG4nCisgICAgICAgICAgICAgICAgfAknXHJcbicKKyAgICAgICAgICAgICAgICB8CSdccicKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApKworICAgICAgICAgICAgeyAkY2hhbm5lbCA9IEhJRERFTiB9CisgICAgICAgIDsKKyAgRU5ECisgIAorICBleGFtcGxlICJhY2Nlc3NpbmcgdG9rZW5zIHdpdGggbGFiZWxzIiBkbworICAgIGxleGVyID0gVG9rZW5MYWJlbHM6OkxleGVyLm5ldyggJyAgIGEnICkKKyAgICBwYXJzZXIgPSBUb2tlbkxhYmVsczo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHRrID0gcGFyc2VyLmEKKyAgICB0ay5zaG91bGQgPT0gWyAKKyAgICAgICdhJywgVG9rZW5MYWJlbHM6OlRva2VuRGF0YTo6QSwgJ0EnLAorICAgICAgMSwgMywgMSwgOmRlZmF1bHQKKyAgICBdCisgIGVuZAorCisKK2VuZAorCitjbGFzcyBUZXN0UnVsZUxhYmVsUmVmZXJlbmNlIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisKKyAgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICBncmFtbWFyIFJ1bGVMYWJlbFJlZmVyZW5jZTsKKyAgICBvcHRpb25zIHtsYW5ndWFnZSA9IFJ1Ynk7fQorICAgIAorICAgIEBwYXJzZXI6Om1lbWJlcnMgeworICAgICAgZGVmIGVtaXRfZXJyb3JfbWVzc2FnZShtc2cpCisgICAgICAgICMgZG8gbm90aGluZworICAgICAgZW5kCisgICAgICBkZWYgcmVwb3J0X2Vycm9yKGVycm9yKQorICAgICAgICByYWlzZSBlcnJvcgorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIEBsZXhlcjo6bWVtYmVycyB7CisgICAgICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKG1zZykKKyAgICAgICAgIyBkbyBub3RoaW5nCisgICAgICBlbmQKKyAgICAgIGRlZiByZXBvcnRfZXJyb3IoZXJyb3IpCisgICAgICAgIHJhaXNlIGVycm9yCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgYSByZXR1cm5zIFtibGFdOiB0PWIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkYmxhID0gWyR0LnN0YXJ0LCAkdC5zdG9wLCAkdC50ZXh0XQorICAgICAgICAgICAgfQorICAgICAgICA7CisgICAgCisgICAgYjogQSs7CisgICAgCisgICAgQTogJ2EnLi4neic7CisgICAgCisgICAgV1M6ICcgJysgIHsgJGNoYW5uZWwgPSBISURERU4gfTsKKyAgRU5ECisgIAorICBleGFtcGxlICJyZWZlcmVuY2luZyBydWxlIHByb3BlcnRpZXMgdXNpbmcgcnVsZSBsYWJlbHMiIGRvCisgICAgbGV4ZXIgPSBSdWxlTGFiZWxSZWZlcmVuY2U6OkxleGVyLm5ldyggJyAgIGEgYSBhIGEgICcgKQorICAgIHBhcnNlciA9IFJ1bGVMYWJlbFJlZmVyZW5jZTo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHN0YXJ0LCBzdG9wLCB0ZXh0ID0gcGFyc2VyLmEKKyAgICAKKyAgICBzdGFydC5pbmRleC5zaG91bGQgPT0gMQorICAgIHN0b3AuaW5kZXguc2hvdWxkID09IDcKKyAgICB0ZXh0LnNob3VsZCA9PSAnYSBhIGEgYScKKyAgZW5kCisKK2VuZAorCisKKworY2xhc3MgVGVzdFJlZmVyZW5jZURvZXNudFNldENoYW5uZWwgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUmVmZXJlbmNlU2V0Q2hhbm5lbDsKKyAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5O30KKyAgICBhIHJldHVybnMgW2Zvb106IEEgRU9GIHsgJGZvbyA9ICdcJXMsIGNoYW5uZWw9XCVwJyBcJSBbJEEudGV4dCwgJEEuY2hhbm5lbF07IH0gOworICAgIEEgOiAnLScgV1MgSSA7CisgICAgSSA6ICcwJy4uJzknKyA7CisgICAgV1M6ICcgJyB8ICdcdCc7CisgIEVORAorCisgIGV4YW1wbGUgJ3ZlcmlmeWluZyB0aGF0IGEgdG9rZW4gcmVmZXJlbmNlIGRvZXMgbm90IHNldCBpdHMgY2hhbm5lbCcgZG8KKyAgICBsZXhlciA9IFJlZmVyZW5jZVNldENoYW5uZWw6OkxleGVyLm5ldyggIi0gMzQiICkKKyAgICBwYXJzZXIgPSBSZWZlcmVuY2VTZXRDaGFubmVsOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLmEuc2hvdWxkID09ICItIDM0LCBjaGFubmVsPTpkZWZhdWx0IgorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC9wYXJzZXIvcnVsZS1tZXRob2RzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3J1bGUtbWV0aG9kcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTg5OGRkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3J1bGUtbWV0aG9kcy5yYgpAQCAtMCwwICsxLDEzMyBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0UGFyYW1ldGVycyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBQYXJhbWV0ZXJzOworICAgIG9wdGlvbnMgeworICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICBAcGFyc2VyOjptZW1iZXJzIHsKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIGVuZAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlcnJvcikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBAbGV4ZXI6Om1lbWJlcnMgeworICAgICAgZGVmIGVtaXRfZXJyb3JfbWVzc2FnZShtc2cpCisgICAgICAgICMgZG8gbm90aGluZworICAgICAgZW5kCisgICAgICBkZWYgcmVwb3J0X2Vycm9yKGVycm9yKQorICAgICAgICByYWlzZSBlcnJvcgorICAgICAgZW5kCisgICAgfQorICAgIAorICAgIGFbYXJnMSwgYXJnMl0gcmV0dXJucyBbbF0KKyAgICAgICAgOiBBKyBFT0YKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgbCA9IFskYXJnMSwgJGFyZzJdCisgICAgICAgICAgICAgICAgJGFyZzEgPSAiZ25hcnoiCisgICAgICAgICAgICB9CisgICAgICAgIDsKKyAgICAKKyAgICBBOiAnYScuLid6JzsKKyAgICAKKyAgICBXUzogJyAnKyAgeyAkY2hhbm5lbCA9IEhJRERFTiB9OworICBFTkQKKyAgCisgIGV4YW1wbGUgInJ1bGVzIHdpdGggbWV0aG9kIHBhcmFtZXRlcnMiIGRvCisgICAgbGV4ZXIgPSBQYXJhbWV0ZXJzOjpMZXhlci5uZXcoICdhIGEgYScgKQorICAgIHBhcnNlciA9IFBhcmFtZXRlcnM6OlBhcnNlci5uZXcgbGV4ZXIKKyAgICByID0gcGFyc2VyLmEoICdmb28nLCAnYmFyJyApCisgICAgci5zaG91bGQgPT0gJXcoZm9vIGJhcikKKyAgZW5kCisKK2VuZAorCisKK2NsYXNzIFRlc3RNdWx0aXBsZVJldHVyblZhbHVlcyA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBNdWx0aXBsZVJldHVyblZhbHVlczsKKyAgICBvcHRpb25zIHsgbGFuZ3VhZ2UgPSBSdWJ5OyB9CisgICAgQHBhcnNlcjo6bWVtYmVycyB7CisgICAgICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKG1zZykKKyAgICAgICAgIyBkbyBub3RoaW5nCisgICAgICBlbmQKKyAgICAgIGRlZiByZXBvcnRfZXJyb3IoZXJyb3IpCisgICAgICAgIHJhaXNlIGVycm9yCisgICAgICBlbmQKKyAgICB9CisgICAgCisgICAgQGxleGVyOjptZW1iZXJzIHsKKyAgICAgIGRlZiBlbWl0X2Vycm9yX21lc3NhZ2UobXNnKQorICAgICAgICAjIGRvIG5vdGhpbmcKKyAgICAgIGVuZAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlcnJvcikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBhIHJldHVybnMgW2ZvbywgYmFyXTogQQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRmb28gPSAiZm9vIjsKKyAgICAgICAgICAgICAgICAkYmFyID0gImJhciI7CisgICAgICAgICAgICB9CisgICAgICAgIDsKKyAgICAKKyAgICBBOiAnYScuLid6JzsKKyAgICAKKyAgICBXUyAgOgorICAgICAgICAgICAgKCAgICcgJworICAgICAgICAgICAgfCAgICdcdCcKKyAgICAgICAgICAgIHwgICggJ1xuJworICAgICAgICAgICAgICAgIHwJJ1xyXG4nCisgICAgICAgICAgICAgICAgfAknXHInCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKSsKKyAgICAgICAgICAgIHsgJGNoYW5uZWwgPSBISURERU4gfQorICAgICAgICA7CisgIEVORAorICAKKyAgZXhhbXBsZSAibXVsdGktdmFsdWVkIHJ1bGUgcmV0dXJuIHN0cnVjdHVyZXMiIGRvCisgICAgbGV4ZXIgPSBNdWx0aXBsZVJldHVyblZhbHVlczo6TGV4ZXIubmV3KCAnICAgYScgKQorICAgIHBhcnNlciA9IE11bHRpcGxlUmV0dXJuVmFsdWVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcmV0ID0gcGFyc2VyLmEKKyAgICAKKyAgICByZXQuZm9vLnNob3VsZCA9PSAnZm9vJworICAgIHJldC5iYXIuc2hvdWxkID09ICdiYXInCisgIGVuZAorICAKK2VuZAorCisKK2NsYXNzIFRlc3RSdWxlVmlzaWJpbGl0eSA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgUnVsZVZpc2liaWxpdHk7CisgICAgb3B0aW9ucyB7IGxhbmd1YWdlPVJ1Ynk7IH0KKyAgICAKKyAgICBwdWJsaWMgYTogSUQ7CisgICAgcHJpdmF0ZSBiOiBESUdJVDsKKyAgICBwcm90ZWN0ZWQgYzogSUQgRElHSVQ7CisgICAgCisgICAgRElHSVQ6ICgnMCcuLic5JykrOworICAgIElEOiAoJ2EnLi4neicgfCAnQScuLidaJykrOworICAgIFdTOiAoJyAnIHwgJ1x0JyB8ICdcbicgfCAnXHInIHwgJ1xmJykrIHsgJGNoYW5uZWw9SElEREVOOyB9OworICBFTkQKKyAgCisgIGV4YW1wbGUgJ3VzaW5nIHZpc2liaWxpdHkgbW9kaWZpZXJzIG9uIHJ1bGVzJyBkbworICAgIG1uYW1lID0gUlVCWV9WRVJTSU9OID1+IC9eMVwuOS8gPyBwcm9jIHsgfCBuIHwgbi50b19zeW0gfSA6IHByb2MgeyB8IG4gfCBuLnRvX3MgfQorICAgIAorICAgIFJ1bGVWaXNpYmlsaXR5OjpQYXJzZXIucHVibGljX2luc3RhbmNlX21ldGhvZHMuc2hvdWxkIGluY2x1ZGUoIG1uYW1lWyAnYScgXSApCisgICAgUnVsZVZpc2liaWxpdHk6OlBhcnNlci5wcm90ZWN0ZWRfaW5zdGFuY2VfbWV0aG9kcy5zaG91bGQgaW5jbHVkZSggbW5hbWVbICdjJyBdICkKKyAgICBSdWxlVmlzaWJpbGl0eTo6UGFyc2VyLnByaXZhdGVfaW5zdGFuY2VfbWV0aG9kcy5zaG91bGQgaW5jbHVkZSggbW5hbWVbICdiJyBdICkKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvcGFyc2VyL3Njb3Blcy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9zY29wZXMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjODdhNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3BhcnNlci9zY29wZXMucmIKQEAgLTAsMCArMSwyNzMgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzL3Rlc3QvZnVuY3Rpb25hbCcKKworY2xhc3MgVGVzdFNjb3BlczEgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgU2ltcGxlU2NvcGU7CisgICAgCisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgcHJvZworICAgIHNjb3BlIHsKKyAgICBuYW1lCisgICAgfQorICAgICAgICA6ICAgSUQgeyRwcm9nOjpuYW1lPSRJRC50ZXh0O30KKyAgICAgICAgOworICAgIAorICAgIElEICA6ICAgKCdhJy4uJ3onKSsKKyAgICAgICAgOworICAgIAorICAgIFdTICA6ICAgKCcgJ3wnXG4nfCdccicpKyB7JGNoYW5uZWw9SElEREVOfQorICAgICAgICA7CisgIEVORAorICAKKyAgZXhhbXBsZSAicGFyc2luZyAnZm9vYmFyJyIgZG8KKyAgICBsZXhlciA9IFNpbXBsZVNjb3BlOjpMZXhlci5uZXcoICdmb29iYXInICkKKyAgICBwYXJzZXIgPSBTaW1wbGVTY29wZTo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5wcm9nCisgIGVuZAorZW5kCisKK2NsYXNzIFRlc3RTY29wZXMyIDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgZ3JhbW1hciBMb3RzYVNjb3BlczsKKyAgICAKKyAgICBvcHRpb25zIHsKKyAgICAgICAgbGFuZ3VhZ2UgPSBSdWJ5OworICAgIH0KKyAgICAKKyAgICAvKiBnbG9iYWwgc2NvcGVzICovCisgICAgCisgICAgc2NvcGUgYVNjb3BlIHsKKyAgICAgIG5hbWVzOworICAgIH0KKyAgICAKKyAgICBAbWVtYmVycyB7CisgICAgICBkZWYgZW1pdF9lcnJvcl9tZXNzYWdlKG1zZykKKyAgICAgICAgIyBkbyBub3RoaW5nCisgICAgICBlbmQKKyAgICAgIAorICAgICAgZGVmIHJlcG9ydF9lcnJvcihlcnJvcikKKyAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBhCisgICAgc2NvcGUgYVNjb3BlOworICAgICAgICA6ICAgeyRhU2NvcGU6Om5hbWVzID0gW119IElEKgorICAgICAgICA7CisgICAgCisgICAgCisgICAgLyogcnVsZSBzY29wZXMsIGZyb20gdGhlIGJvb2ssIGZpbmFsIGJldGEsIHAuMTQ3ICovCisgICAgCisgICAgYlt2XQorICAgIHNjb3BlIHt4fQorICAgICAgICA6IHskYjo6eCA9IHY7fSBiMgorICAgICAgICA7CisgICAgCisgICAgYjIKKyAgICAgICAgOiBiMworICAgICAgICA7CisgICAgCisgICAgYjMgCisgICAgICAgIDogeyRiOjp4fT89PiBJRCAvLyBvbmx5IHZpc2libGUsIGlmIGIgd2FzIGNhbGxlZCB3aXRoIFRydWUKKyAgICAgICAgfCBOVU0KKyAgICAgICAgOworICAgIAorICAgIAorICAgIC8qIHJ1bGUgc2NvcGVzLCBmcm9tIHRoZSBib29rLCBmaW5hbCBiZXRhLCBwLjE0OCAqLworICAgIAorICAgIGMgcmV0dXJucyBbcmVzXQorICAgIHNjb3BlIHsKKyAgICAgICAgc3ltYm9scworICAgIH0KKyAgICBAaW5pdCB7CisgICAgICAgICRjOjpzeW1ib2xzID0gU2V0Lm5ldzsKKyAgICB9CisgICAgICAgIDogJ3snIGMxKiBjMisgJ30nCisgICAgICAgICAgICB7ICRyZXMgPSAkYzo6c3ltYm9sczsgfQorICAgICAgICA7CisgICAgCisgICAgYzEKKyAgICAgICAgOiAnaW50JyBJRCB7JGM6OnN5bWJvbHMuYWRkKCRJRC50ZXh0KX0gJzsnCisgICAgICAgIDsKKyAgICAKKyAgICBjMgorICAgICAgICA6IElEICc9JyBOVU0gJzsnCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJGM6OnN5bWJvbHMuaW5jbHVkZT8oJElELnRleHQpIG9yIHJhaXNlIFJ1bnRpbWVFcnJvciwgJElELnRleHQKKyAgICAgICAgICAgICB9CisgICAgICAgIDsKKyAgICAKKyAgICAvKiByZWN1cnNpdmUgcnVsZSBzY29wZXMsIGZyb20gdGhlIGJvb2ssIGZpbmFsIGJldGEsIHAuMTUwICovCisgICAgCisgICAgZCByZXR1cm5zIFtyZXNdCisgICAgc2NvcGUgeworICAgICAgICBzeW1ib2xzCisgICAgfQorICAgIEBpbml0IHsKKyAgICAgICAgJGQ6OnN5bWJvbHMgPSBTZXQubmV3CisgICAgfQorICAgICAgICA6ICd7JyBkMSogZDIqICd9JworICAgICAgICAgICAgeyAkcmVzID0gJGQ6OnN5bWJvbHM7IH0KKyAgICAgICAgOworICAgIAorICAgIGQxCisgICAgICAgIDogJ2ludCcgSUQgeyRkOjpzeW1ib2xzLmFkZCgkSUQudGV4dCl9ICc7JworICAgICAgICA7CisgICAgCisgICAgZDIKKyAgICAgICAgOiBJRCAnPScgTlVNICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXRjaCg6Zm91bmQpIGRvCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAoJGQubGVuZ3RoIC0gMSkuZG93bnRvKDApIGRvIHxzfAorICAgICAgICAgICAgICAgICAgJGRbc10uc3ltYm9scy5pbmNsdWRlPygkSUQudGV4dCkgYW5kIHRocm93KDpmb3VuZCkKKyAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgICAgICByYWlzZSAkSUQudGV4dAorICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfCBkCisgICAgICAgIDsKKyAgICAKKyAgICAvKiByZWN1cnNpdmUgcnVsZSBzY29wZXMsIGFjY2VzcyBib3R0b20tbW9zdCBzY29wZSAqLworICAgIAorICAgIGUgcmV0dXJucyBbcmVzXQorICAgIHNjb3BlIHsKKyAgICAgICAgYQorICAgIH0KKyAgICBAYWZ0ZXIgeworICAgICAgICAkcmVzID0gJGU6OmE7CisgICAgfQorICAgICAgICA6IE5VTSB7ICRlWzBdOjphID0gSW50ZWdlcigkTlVNLnRleHQpOyB9CisgICAgICAgIHwgJ3snIGUgJ30nCisgICAgICAgIDsKKyAgICAKKyAgICAKKyAgICAvKiByZWN1cnNpdmUgcnVsZSBzY29wZXMsIGFjY2VzcyB3aXRoIG5lZ2F0aXZlIGluZGV4ICovCisgICAgCisgICAgZiByZXR1cm5zIFtyZXNdCisgICAgc2NvcGUgeworICAgICAgICBhCisgICAgfQorICAgIEBhZnRlciB7CisgICAgICAgICRyZXMgPSAkZjo6YTsKKyAgICB9CisgICAgICAgIDogTlVNIHsgJGZbLTJdOjphID0gSW50ZWdlcigkTlVNLnRleHQpOyB9CisgICAgICAgIHwgJ3snIGYgJ30nCisgICAgICAgIDsKKyAgICAKKyAgICAKKyAgICAvKiB0b2tlbnMgKi8KKyAgICAKKyAgICBJRCAgOiAgICgnYScuLid6JykrCisgICAgICAgIDsKKyAgICAKKyAgICBOVU0gOiAgICgnMCcuLic5JykrCisgICAgICAgIDsKKyAgICAKKyAgICBXUyAgOiAgICgnICd8J1xuJ3wnXHInKSsgeyRjaGFubmVsPUhJRERFTn0KKyAgICAgICAgOworICBFTkQKKworICBleGFtcGxlICJwYXJzaW5nICdmb29iYXInIHdpdGggcnVsZSBhIiBkbworICAgIGxleGVyID0gTG90c2FTY29wZXM6OkxleGVyLm5ldyggImZvb2JhciIgKQorICAgIHBhcnNlciA9IExvdHNhU2NvcGVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLmEKKyAgZW5kCisgIAorICBleGFtcGxlICJmYWlsaW5nIHRvIHBhcnNlICdmb29iYXInIHdpdGggcnVsZSBiW2ZhbHNlXSIgZG8KKyAgICBsZXhlciA9IExvdHNhU2NvcGVzOjpMZXhlci5uZXcoICJmb29iYXIiICkKKyAgICBwYXJzZXIgPSBMb3RzYVNjb3Blczo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHByb2MgeyBwYXJzZXIuYiggZmFsc2UgKSB9LnNob3VsZCByYWlzZV9lcnJvciggQU5UTFIzOjpSZWNvZ25pdGlvbkVycm9yICkKKyAgZW5kCisgIAorICBleGFtcGxlICJwYXJzaW5nICdmb29iYXInIHdpdGggcnVsZSBiW3RydWVdIiBkbworICAgIGxleGVyID0gTG90c2FTY29wZXM6OkxleGVyLm5ldyggImZvb2JhciIgKQorICAgIHBhcnNlciA9IExvdHNhU2NvcGVzOjpQYXJzZXIubmV3IGxleGVyCisgICAgcGFyc2VyLmIoIHRydWUgKQorICBlbmQKKyAgCisgIGV4YW1wbGUgInBhcnNpbmcgYSBkZWNsIGJsb2NrIHdpdGggcnVsZSBjIiBkbworICAgIGxleGVyID0gTG90c2FTY29wZXM6OkxleGVyLm5ldyggPDwtRU5ELmhlcmVfaW5kZW50ISApCisgICAgfCB7CisgICAgfCAgICAgaW50IGk7CisgICAgfCAgICAgaW50IGo7CisgICAgfCAgICAgaSA9IDA7CisgICAgfCB9CisgICAgRU5ECisgICAgcGFyc2VyID0gTG90c2FTY29wZXM6OlBhcnNlci5uZXcgbGV4ZXIKKworICAgIHN5bWJvbHMgPSBwYXJzZXIuYworICAgIHN5bWJvbHMuc2hvdWxkIGhhdmUoIDIgKS50aGluZ3MKKyAgICBzeW1ib2xzLnNob3VsZCBpbmNsdWRlICdpJworICAgIHN5bWJvbHMuc2hvdWxkIGluY2x1ZGUgJ2onCisgIGVuZAorICAKKyAgZXhhbXBsZSAiZmFpbGluZyB0byBwYXJzZSB1bmRlY2xhcmVkIHN5bWJvbHMgd2l0aCBydWxlIGMiIGRvCisgICAgbGV4ZXIgPSBMb3RzYVNjb3Blczo6TGV4ZXIubmV3KCA8PC1FTkQuaGVyZV9pbmRlbnQhICkKKyAgICB8IHsKKyAgICB8ICAgICBpbnQgaTsKKyAgICB8ICAgICBpbnQgajsKKyAgICB8ICAgICBpID0gMDsKKyAgICB8ICAgICB4ID0gNDsKKyAgICB8IH0KKyAgICBFTkQKKyAgICBwYXJzZXIgPSBMb3RzYVNjb3Blczo6UGFyc2VyLm5ldyBsZXhlcgorCisgICAgcHJvYyB7IHBhcnNlci5jIH0uc2hvdWxkIHJhaXNlX2Vycm9yIFJ1bnRpbWVFcnJvciwgJ3gnCisgIGVuZAorICAKKyAgZXhhbXBsZSAicGFyc2luZyBuZXN0ZWQgZGVjbGFyYXRpb24gYmxvY2tzIiBkbworICAgIGxleGVyID0gTG90c2FTY29wZXM6OkxleGVyLm5ldyggPDwtRU5ELmhlcmVfaW5kZW50ISApCisgICAgfCB7CisgICAgfCAgICAgaW50IGk7CisgICAgfCAgICAgaW50IGo7CisgICAgfCAgICAgaSA9IDA7CisgICAgfCAgICAgeworICAgIHwgICAgICAgIGludCBpOworICAgIHwgICAgICAgIGludCB4OworICAgIHwgICAgICAgIHggPSA1OworICAgIHwgICAgIH0KKyAgICB8IH0KKyAgICBFTkQKKyAgICBwYXJzZXIgPSBMb3RzYVNjb3Blczo6UGFyc2VyLm5ldyBsZXhlcgorCisgICAgc3ltYm9scyA9IHBhcnNlci5kIAorICAgIHN5bWJvbHMuc2hvdWxkIGhhdmUoIDIgKS50aGluZ3MKKyAgICBzeW1ib2xzLnNob3VsZCBpbmNsdWRlICdpJworICAgIHN5bWJvbHMuc2hvdWxkIGluY2x1ZGUgJ2onCisgIGVuZAorICAKKyAgZXhhbXBsZSAicGFyc2luZyBhIGRlZXBseSBuZXN0ZWQgc2V0IG9mIGJsb2NrcyB3aXRoIHJ1bGUgZSIgZG8KKyAgICBsZXhlciA9IExvdHNhU2NvcGVzOjpMZXhlci5uZXcoIDw8LUVORC5oZXJlX2luZGVudCEgKQorICAgIHwgeyB7IHsgeyAxMiB9IH0gfSB9CisgICAgRU5ECisKKyAgICBwYXJzZXIgPSBMb3RzYVNjb3Blczo6UGFyc2VyLm5ldyBsZXhlcgorICAgIHBhcnNlci5lLnNob3VsZCA9PSAxMgorICBlbmQKKyAgCisgIGV4YW1wbGUgInBhcnNpbmcgYSBkZWVwbHkgbmVzdGVkIHNldCBvZiBibG9ja3Mgd2l0aCBydWxlIGYiIGRvCisgICAgbGV4ZXIgPSBMb3RzYVNjb3Blczo6TGV4ZXIubmV3KCA8PC1FTkQuaGVyZV9pbmRlbnQhICkKKyAgICB8IHsgeyB7IHsgMTIgfSB9IH0gfQorICAgIEVORAorCisgICAgcGFyc2VyID0gTG90c2FTY29wZXM6OlBhcnNlci5uZXcgbGV4ZXIKKyAgICBwYXJzZXIuZi5zaG91bGQgPT0gbmlsCisgIGVuZAorICAKKyAgZXhhbXBsZSAicGFyc2luZyBhIDItbGV2ZWwgbmVzdGVkIHNldCBvZiBibG9ja3Mgd2l0aCBydWxlIGYiIGRvCisgICAgbGV4ZXIgPSBMb3RzYVNjb3Blczo6TGV4ZXIubmV3KCA8PC1FTkQuaGVyZV9pbmRlbnQhICkKKyAgICB8IHsgeyAxMiB9IH0KKyAgICBFTkQKKyAgICBwYXJzZXIgPSBMb3RzYVNjb3Blczo6UGFyc2VyLm5ldyBsZXhlcgorCisgICAgcGFyc2VyLmYuc2hvdWxkID09IG5pbAorICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC90ZW1wbGF0ZS1vdXRwdXQvdGVtcGxhdGUtb3V0cHV0LnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvdGVtcGxhdGUtb3V0cHV0L3RlbXBsYXRlLW91dHB1dC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTE5MDAzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvdGVtcGxhdGUtb3V0cHV0L3RlbXBsYXRlLW91dHB1dC5yYgpAQCAtMCwwICsxLDQwNCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMvdGVzdC9mdW5jdGlvbmFsJworCitjbGFzcyBUZXN0VGVtcGxhdGVPdXRwdXQgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKyAgCisgIGRlZiBwYXJzZSggZ3JhbW1hciwgaW5wdXQsIG9wdGlvbnMgPSBuaWwgKQorICAgIEBncmFtbWFyID0gaW5saW5lX2dyYW1tYXIoIGdyYW1tYXIgKQorICAgIGNvbXBpbGVfYW5kX2xvYWQoIEBncmFtbWFyICkKKyAgICBncmFtbWFyX21vZHVsZSA9IHNlbGYuY2xhc3MuY29uc3RfZ2V0KCBAZ3JhbW1hci5uYW1lICkKKyAgICAKKyAgICBwYXJzZXJfb3B0aW9ucyA9IHt9CisgICAgaWYgb3B0aW9ucworICAgICAgcnVsZSA9IG9wdGlvbnMuZmV0Y2goIDpydWxlICkgeyBncmFtbWFyX21vZHVsZTo6UGFyc2VyLmRlZmF1bHRfcnVsZSB9CisgICAgICBncm91cCA9IG9wdGlvbnNbIDp0ZW1wbGF0ZXMgXSBhbmQgcGFyc2VyX29wdGlvbnNbIDp0ZW1wbGF0ZXMgXSA9IGdyb3VwCisgICAgZWxzZQorICAgICAgcnVsZSA9IGdyYW1tYXJfbW9kdWxlOjpQYXJzZXIuZGVmYXVsdF9ydWxlCisgICAgZW5kCisgICAgCisgICAgQGxleGVyICA9IGdyYW1tYXJfbW9kdWxlOjpMZXhlci5uZXcoIGlucHV0ICkKKyAgICBAcGFyc2VyID0gZ3JhbW1hcl9tb2R1bGU6OlBhcnNlci5uZXcoIEBsZXhlciwgcGFyc2VyX29wdGlvbnMgKQorICAgIAorICAgIG91dCA9IEBwYXJzZXIuc2VuZCggcnVsZSApLnRlbXBsYXRlCisgICAgcmV0dXJuKCBvdXQgPyBvdXQudG9fcyA6IG91dCApCisgIGVuZAorICAKKyAgZGVmIHBhcnNlX3RlbXBsYXRlcyggc291cmNlICkKKyAgICBBTlRMUjM6OlRlbXBsYXRlOjpHcm91cC5wYXJzZSggc291cmNlLmZpeGVkX2luZGVudCggMCApICkKKyAgZW5kCisgIAorICAKKyAgZXhhbXBsZSAnaW5saW5lIHRlbXBsYXRlcycgZG8KKyAgICB0ZXh0ID0gcGFyc2UoIDw8LSdFTkQnLCAiYWJjIDM0IiApCisgICAgICBncmFtbWFyIElubGluZVRlbXBsYXRlczsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZSA9IFJ1Ynk7CisgICAgICAgIG91dHB1dCA9IHRlbXBsYXRlOworICAgICAgfQorICAgICAgCisgICAgICBhIDogSUQgSU5UCisgICAgICAgIC0+IHRlbXBsYXRlKGlkPXskSUQudGV4dH0sIGludD17JElOVC50ZXh0fSkKKyAgICAgICAgICAgImlkPTwlPSBAaWQgJT4sIGludD08JT0gQGludCAlPiIKKyAgICAgIDsKKyAgICAgIAorICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICAKKyAgICB0ZXh0LnNob3VsZCA9PSAiaWQ9YWJjLCBpbnQ9MzQiCisgIGVuZAorICAKKyAgZXhhbXBsZSAnZXh0ZXJuYWwgdGVtcGxhdGUnIGRvCisgICAgdGVtcGxhdGVzID0gQU5UTFIzOjpUZW1wbGF0ZTo6R3JvdXAubmV3IGRvCisgICAgICBkZWZpbmVfdGVtcGxhdGUoIDpleHByLCA8PC0nRU5EJy5zdHJpcCApCisgICAgICAgIFs8JT0gQGFyZ3Muam9pbiggQG9wLnRvX3MgKSAlPl0KKyAgICAgIEVORAorICAgIGVuZAorICAgIAorICAgIHRleHQgPSBwYXJzZSggPDwtJ0VORCcsICdhICsgYicsIDp0ZW1wbGF0ZXMgPT4gdGVtcGxhdGVzICkKKyAgICAgIGdyYW1tYXIgRXh0ZXJuYWxUZW1wbGF0ZTsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZSA9IFJ1Ynk7CisgICAgICAgIG91dHB1dCA9IHRlbXBsYXRlOworICAgICAgfQorICAgICAgCisgICAgICBhIDogcis9YXJnIE9QIHIrPWFyZworICAgICAgICAtPiBleHByKCBvcD17JE9QLnRleHR9LCBhcmdzPXskcn0gKQorICAgICAgOworICAgICAgYXJnOiBJRCAtPiB0ZW1wbGF0ZSh0PXskSUQudGV4dH0pICI8JT0gQHQgJT4iOworICAgICAgCisgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgIE9QOiAnKyc7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICAKKyAgICB0ZXh0LnNob3VsZCA9PSAnW2ErYl0nCisgIGVuZAorCisgIGV4YW1wbGUgImVtcHR5IHRlbXBsYXRlIiBkbworICAgIHRleHQgPSBwYXJzZSggPDwtJ0VORCcsICdhYmMgMzQnICkKKyAgICAgIGdyYW1tYXIgRW1wdHlUZW1wbGF0ZTsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICB9CisgICAgICBhIDogSUQgSU5UCisgICAgICAgIC0+IAorICAgICAgOworICAgICAgCisgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgICAgCisgICAgRU5ECisgICAgdGV4dC5zaG91bGQgYmVfbmlsCisgIGVuZAorICAKKyAgZXhhbXBsZSAibGlzdCIgZG8KKyAgICB0ZXh0ID0gcGFyc2UoIDw8LSdFTkQnLCAiYWJjIGRlZiBnaGkiICkKKyAgICAgIGdyYW1tYXIgTGlzdDsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICB9CisgICAgICBhOiAocis9YikqIEVPRgorICAgICAgICAtPiB0ZW1wbGF0ZShyPXskcn0pICI8JT0gQHIuam9pbignLCcpICU+IgorICAgICAgOworICAgICAgCisgICAgICBiOiBJRAorICAgICAgICAtPiB0ZW1wbGF0ZSh0PXskSUQudGV4dH0pICI8JT0gQHQgJT4iCisgICAgICA7CisgICAgICAKKyAgICAgIElEIDogJ2EnLi4neicrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgdGV4dC5zaG91bGQgPT0gJ2FiYyxkZWYsZ2hpJworICBlbmQKKyAgCisgIGV4YW1wbGUgJ2FjdGlvbicgZG8KKyAgICB0ZXh0ID0gcGFyc2UoIDw8LSdFTkQnLCAiYWJjIiApCisgICAgICBncmFtbWFyIEFjdGlvbjsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICB9CisgICAgICBhOiBJRAorICAgICAgICAtPiB7IGNyZWF0ZV90ZW1wbGF0ZSggImhlbGxvIiApIH0KKyAgICAgIDsKKyAgICAgIAorICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICAKKyAgICB0ZXh0LnNob3VsZCA9PSAnaGVsbG8nCisgIGVuZAorICAKKyAgZXhhbXBsZSAidGVtcGxhdGUgZXhwcmVzc2lvbiBpbiBhY3Rpb24iIGRvCisgICAgdGV4dCA9IHBhcnNlKCA8PC0nRU5EJywgJ2FiYycgKQorICAgICAgZ3JhbW1hciBUZW1wbGF0ZUV4cHJlc3Npb25JbkFjdGlvbjsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICB9CisgICAgICBhOiBJRAorICAgICAgICB7ICRzdCA9ICV7ImhlbGxvIn0gfQorICAgICAgOworICAgICAgCisgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIHRleHQuc2hvdWxkID09ICdoZWxsbycKKyAgZW5kCisgIAorICAjZXhhbXBsZSAidGVtcGxhdGUgZXhwcmVzc2lvbiBpbiBhY3Rpb24yIiBkbworICAjICB0ZXh0ID0gcGFyc2UoIDw8LSdFTkQnLCAnYWJjJyApCisgICMgICAgZ3JhbW1hciBUZW1wbGF0ZUV4cHJlc3Npb25JbkFjdGlvbjI7CisgICMgICAgb3B0aW9ucyB7CisgICMgICAgICBsYW5ndWFnZT1SdWJ5OworICAjICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAjICAgIH0KKyAgIyAgICBhOiBJRAorICAjICAgICAgeworICAjICAgICAgICByZXMgPSAleyJoZWxsbyA8JT0gQGZvbyAlPiJ9CisgICMgICAgICAgICVyZXMuZm9vID0gIndvcmxkIjsKKyAgIyAgICAgIH0KKyAgIyAgICAgIC0+IHsgcmVzIH0KKyAgIyAgICA7CisgICMgICAgCisgICMgICAgSUQgOiAnYScuLid6Jys7CisgICMgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICMgIEVORAorICAjICAKKyAgIyAgdGV4dC5zaG91bGQgPT0gJ2hlbGxvIHdvcmxkJworICAjZW5kCisgIAorICBleGFtcGxlICJpbmRpcmVjdCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciIgZG8KKyAgICB0ZW1wbGF0ZXMgPSBBTlRMUjM6OlRlbXBsYXRlOjpHcm91cC5uZXcgZG8KKyAgICAgIGRlZmluZV90ZW1wbGF0ZSggOmV4cHIsIDw8LSdFTkQnLnN0cmlwICkKKyAgICAgICAgWzwlPSBAYXJncy5qb2luKCBAb3AudG9fcyApICU+XQorICAgICAgRU5ECisgICAgZW5kCisgICAgCisgICAgdGV4dCA9IHBhcnNlKCA8PC0nRU5EJywgJ2FiYycsIDp0ZW1wbGF0ZXMgPT4gdGVtcGxhdGVzICkKKyAgICAgIGdyYW1tYXIgSW5kaXJlY3RUZW1wbGF0ZUNvbnN0cnVjdG9yOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD10ZW1wbGF0ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgYTogSUQKKyAgICAgICAgeworICAgICAgICAgICRzdCA9ICUoeyJleHByIn0pKGFyZ3M9e1sxLCAyLCAzXX0sIG9wPXsiKyJ9KQorICAgICAgICB9CisgICAgICA7CisgICAgICAKKyAgICAgIElEIDogJ2EnLi4neicrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgCisgICAgdGV4dC5zaG91bGQgPT0gJ1sxKzIrM10nCisgIGVuZAorICAKKyAgZXhhbXBsZSAicHJlZGljYXRlcyIgZG8KKyAgICB0ZXh0ID0gcGFyc2UoIDw8LSdFTkQnLCAnYiAzNCcgKQorICAgICAgZ3JhbW1hciBQcmVkaWNhdGVzOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD10ZW1wbGF0ZTsKKyAgICAgIH0KKyAgICAgIGEgOiBJRCBJTlQKKyAgICAgICAgLT4geyRJRC50ZXh0PT0nYSd9PyB0ZW1wbGF0ZShpbnQ9eyRJTlQudGV4dH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkE6IDwlPSBAaW50ICU+IgorICAgICAgICAtPiB7JElELnRleHQ9PSdiJ30/IHRlbXBsYXRlKGludD17JElOVC50ZXh0fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjogPCU9IEBpbnQgJT4iCisgICAgICAgIC0+ICAgICAgICAgICAgICAgICAgdGVtcGxhdGUoaW50PXskSU5ULnRleHR9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOiA8JT0gQGludCAlPiIKKyAgICAgIDsKKyAgICAgIAorICAgICAgSUQgOiAnYScuLid6Jys7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICAKKyAgICB0ZXh0LnNob3VsZCA9PSAnQjogMzQnCisgIGVuZAorICAKKyAgZXhhbXBsZSAiYmFja3RyYWNraW5nIG1vZGUiIGRvCisgICAgdGV4dCA9IHBhcnNlKCA8PC0nRU5EJywgJ2FiYyAzNCcgKQorICAgICAgZ3JhbW1hciBCYWNrdHJhY2tpbmdNb2RlOworICAgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgIG91dHB1dD10ZW1wbGF0ZTsKKyAgICAgICAgYmFja3RyYWNrPXRydWU7CisgICAgICB9CisgICAgICBhIDogKElEIElOVCk9PiBJRCBJTlQKKyAgICAgICAgLT4gdGVtcGxhdGUoaWQ9eyRJRC50ZXh0fSwgaW50PXskSU5ULnRleHR9KQorICAgICAgICAgICAiaWQ9PCU9IEBpZCAlPiwgaW50PTwlPSBAaW50ICU+IgorICAgICAgOworICAgICAgCisgICAgICBJRCA6ICdhJy4uJ3onKzsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIAorICAgIHRleHQuc2hvdWxkID09ICJpZD1hYmMsIGludD0zNCIKKyAgZW5kCisgIAorICBleGFtcGxlICJyZXdyaXRlIiBkbworICAgIGlucHV0ID0gPDwtJ0VORCcuaGVyZV9pbmRlbnQhCisgICAgfCBpZiAoIGZvbyApIHsKKyAgICB8ICAgYiA9IC8qIGJsYSAqLyAyOworICAgIHwgICByZXR1cm4gMSAvKiBmb28gKi87CisgICAgfCB9CisgICAgfCAKKyAgICB8IC8qIGdudXJ6ICovCisgICAgfCByZXR1cm4gMTI7CisgICAgRU5ECisgICAgZXhwZWN0ZWQgPSA8PC0nRU5EJy5oZXJlX2luZGVudCEKKyAgICB8IGlmICggZm9vICkgeworICAgIHwgICBiID0gLyogYmxhICovIDI7CisgICAgfCAgIHJldHVybiBib29tKDEpIC8qIGZvbyAqLzsKKyAgICB8IH0KKyAgICB8IAorICAgIHwgLyogZ251cnogKi8KKyAgICB8IHJldHVybiBib29tKDEyKTsKKyAgICBFTkQKKyAgICAKKyAgICBwYXJzZSggPDwtJ0VORCcsIGlucHV0ICkKKyAgICAgIGdyYW1tYXIgUmV3cml0ZTsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9dGVtcGxhdGU7CisgICAgICAgIHJld3JpdGU9dHJ1ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcHJvZzogc3RhdCs7CisgICAgICAKKyAgICAgIHN0YXQKKyAgICAgICAgICA6ICdpZicgJygnIGV4cHIgJyknIHN0YXQKKyAgICAgICAgICB8ICdyZXR1cm4nIHJldHVybl9leHByICc7JworICAgICAgICAgIHwgJ3snIHN0YXQqICd9JworICAgICAgICAgIHwgSUQgJz0nIGV4cHIgJzsnCisgICAgICAgICAgOworICAgICAgCisgICAgICByZXR1cm5fZXhwcgorICAgICAgICAgIDogZXhwcgorICAgICAgICAgICAgLT4gdGVtcGxhdGUodD17JHRleHR9KSA8PGJvb20oPCU9IEB0ICU+KT4+CisgICAgICAgICAgOworICAgICAgICAgIAorICAgICAgZXhwcgorICAgICAgICAgIDogSUQKKyAgICAgICAgICB8IElOVAorICAgICAgICAgIDsKKyAgICAgICAgICAKKyAgICAgIElEOiAgJ2EnLi4neicrOworICAgICAgSU5UOiAnMCcuLic5Jys7CisgICAgICBXUzogKCcgJ3wnXG4nKSsgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICAgIENPTU1FTlQ6ICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLikqICcqLycgeyRjaGFubmVsID0gSElEREVOO30gOworICAgIEVORAorICAgIAorICAgIEBwYXJzZXIuaW5wdXQucmVuZGVyLnNob3VsZCA9PSBleHBlY3RlZAorICBlbmQKKyAgCisgIGV4YW1wbGUgInRyZWUgcmV3cml0ZSIgZG8KKyAgICBpbnB1dCA9IDw8LSdFTkQnLmhlcmVfaW5kZW50IQorICAgIHwgaWYgKCBmb28gKSB7CisgICAgfCAgIGIgPSAvKiBibGEgKi8gMjsKKyAgICB8ICAgcmV0dXJuIDEgLyogZm9vICovOworICAgIHwgfQorICAgIHwgCisgICAgfCAvKiBnbnVyeiAqLworICAgIHwgcmV0dXJuIDEyOworICAgIEVORAorICAgIGV4cGVjdGVkID0gPDwtJ0VORCcuaGVyZV9pbmRlbnQhCisgICAgfCBpZiAoIGZvbyApIHsKKyAgICB8ICAgYiA9IC8qIGJsYSAqLyAyOworICAgIHwgICByZXR1cm4gYm9vbSgxKSAvKiBmb28gKi87CisgICAgfCB9CisgICAgfCAKKyAgICB8IC8qIGdudXJ6ICovCisgICAgfCByZXR1cm4gYm9vbSgxMik7CisgICAgRU5ECisgICAgCisgICAgY29tcGlsZV9hbmRfbG9hZCggaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkgKQorICAgICAgZ3JhbW1hciBUcmVlUmV3cml0ZTsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgfQorICAgICAgCisgICAgICB0b2tlbnMgeworICAgICAgICBCTE9DSzsKKyAgICAgICAgQVNTSUdOOworICAgICAgfQorICAgICAgCisgICAgICBwcm9nOiBzdGF0KzsKKyAgICAgIAorICAgICAgc3RhdAorICAgICAgICAgIDogSUYgJygnIGU9ZXhwciAnKScgcz1zdGF0CisgICAgICAgICAgICAtPiBeKElGICRlICRzKQorICAgICAgICAgIHwgUkVUVVJOIGV4cHIgJzsnCisgICAgICAgICAgICAtPiBeKFJFVFVSTiBleHByKQorICAgICAgICAgIHwgJ3snIHN0YXQqICd9JworICAgICAgICAgICAgLT4gXihCTE9DSyBzdGF0KikKKyAgICAgICAgICB8IElEICc9JyBleHByICc7JworICAgICAgICAgICAgLT4gXihBU1NJR04gSUQgZXhwcikKKyAgICAgICAgICA7CisgICAgICAgICAgCisgICAgICBleHByCisgICAgICAgICAgOiBJRAorICAgICAgICAgIHwgSU5UCisgICAgICAgICAgOworICAgICAgCisgICAgICBJRjogJ2lmJzsKKyAgICAgIFJFVFVSTjogJ3JldHVybic7CisgICAgICBJRDogICdhJy4uJ3onKzsKKyAgICAgIElOVDogJzAnLi4nOScrOworICAgICAgV1M6ICgnICd8J1xuJykrIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgICBDT01NRU5UOiAnLyonIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnKi8nIHskY2hhbm5lbCA9IEhJRERFTjt9IDsKKyAgICBFTkQKKyAgICAKKyAgICBjb21waWxlX2FuZF9sb2FkKCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKSApCisgICAgICB0cmVlIGdyYW1tYXIgVHJlZVJld3JpdGVURzsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICB0b2tlblZvY2FiPVRyZWVSZXdyaXRlOworICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgICAgb3V0cHV0PXRlbXBsYXRlOworICAgICAgICByZXdyaXRlPXRydWU7CisgICAgICB9CisgICAgICAKKyAgICAgIHByb2c6IHN0YXQrOworICAgICAgCisgICAgICBzdGF0CisgICAgICAgICAgOiBeKElGIGV4cHIgc3RhdCkKKyAgICAgICAgICB8IF4oUkVUVVJOIHJldHVybl9leHByKSAgICAgICAgICAgICAgICAKKyAgICAgICAgICB8IF4oQkxPQ0sgc3RhdCopICAgICAgICAgICAgICAgIAorICAgICAgICAgIHwgXihBU1NJR04gSUQgZXhwcikKKyAgICAgICAgICA7CisgICAgICAKKyAgICAgIHJldHVybl9leHByCisgICAgICAgICAgOiBleHByCisgICAgICAgICAgICAtPiB0ZW1wbGF0ZSh0PXskdGV4dH0pIDw8Ym9vbSg8JT0gQHQgJT4pPj4KKyAgICAgICAgICA7CisgICAgICAKKyAgICAgIGV4cHIKKyAgICAgICAgICA6IElECisgICAgICAgICAgfCBJTlQKKyAgICAgICAgICA7CisgICAgRU5ECisgICAgCisgICAgbGV4ZXIgPSBUcmVlUmV3cml0ZTo6TGV4ZXIubmV3KCBpbnB1dCApCisgICAgdG9rZW5zID0gQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gVHJlZVJld3JpdGU6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgdHJlZSA9IHBhcnNlci5wcm9nLnRyZWUKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHRyZWVfcGFyc2VyID0gVHJlZVJld3JpdGVURzo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICB0cmVlX3BhcnNlci5wcm9nCisgICAgdG9rZW5zLnJlbmRlci5zaG91bGQgPT0gZXhwZWN0ZWQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3Rva2VuLXJld3JpdGUvYmFzaWMucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC90b2tlbi1yZXdyaXRlL2Jhc2ljLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDQ2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC90b2tlbi1yZXdyaXRlL2Jhc2ljLnJiCkBAIC0wLDAgKzEsMzE3IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RSZXdyaXRpbmdMZXhlck91dHB1dERpcmVjdGx5IDwgQU5UTFIzOjpUZXN0OjpGdW5jdGlvbmFsCisgIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgbGV4ZXIgZ3JhbW1hciBTaW1wbGVSZXdyaXRpbmc7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgQTogJ2EnOworICAgIEI6ICdiJzsKKyAgICBDOiAnYyc7CisgIEVORAorICAKKyAgZGVmIHJld3JpdGUoIGlucHV0LCBleHBlY3RlZCApCisgICAgbGV4ZXIgPSBTaW1wbGVSZXdyaXRpbmc6OkxleGVyLm5ldyggaW5wdXQgKQorICAgIHRva2VucyA9IEFOVExSMzo6VG9rZW5SZXdyaXRlU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHlpZWxkKCB0b2tlbnMgKQorICAgIHRva2Vucy5yZW5kZXIuc2hvdWxkID09IGV4cGVjdGVkCisgICAgcmV0dXJuKCB0b2tlbnMgKQorICBlbmQKKworICBleGFtcGxlICdpbnNlcnQgYmVmb3JlJyBkbworICAgIHJld3JpdGUoICdhYmMnLCAnMGFiYycgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDAsICcwJyApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnaW5zZXJ0IGFmdGVyIGxhc3QgaW5kZXgnIGRvCisgICAgcmV3cml0ZSggJ2FiYycsICdhYmN4JyApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0uaW5zZXJ0X2FmdGVyKCAyLCAneCcgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2luc2VydCBiZWZvcmUgYWZ0ZXIgbWlkZGxlIGluZGV4JyBkbworICAgIHJld3JpdGUoICdhYmMnLCAnYXhieGMnICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5pbnNlcnRfYmVmb3JlIDEsICd4JworICAgICAgc3RyZWFtLmluc2VydF9hZnRlciAxLCAneCcKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIGluZGV4IDAnIGRvCisgICAgcmV3cml0ZSggJ2FiYycsICd4YmMnICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAwLCAneCcgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ3JlcGxhY2UgbGFzdCBpbmRleCcgZG8KKyAgICByZXdyaXRlKCAnYWJjJywgJ2FieCcgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLnJlcGxhY2UgMiwgJ3gnCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAncmVwbGFjZSBsYXN0IGluZGV4JyBkbworICAgIHJld3JpdGUoICdhYmMnLCAnYWJ4JyApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0ucmVwbGFjZSggMiwgJ3gnICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIG1pZGRsZSBpbmRleCcgZG8KKyAgICByZXdyaXRlKCAnYWJjJywgJ2F4YycgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLnJlcGxhY2UgMSwgJ3gnCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAncmVwbGFjZSBtaWRkbGUgaW5kZXgnIGRvCisgICAgcmV3cml0ZSggJ2FiYycsICdheWMnICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5yZXBsYWNlIDEsICd4JworICAgICAgc3RyZWFtLnJlcGxhY2UgMSwgJ3knCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAncmVwbGFjZSBtaWRkbGUgaW5kZXggMSBpbnNlcnQgYmVmb3JlJyBkbworICAgIHJld3JpdGUoICdhYmMnLCAnX2F5YycgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUgMCwgJ18nCisgICAgICBzdHJlYW0ucmVwbGFjZSAxLCAneCcKKyAgICAgIHN0cmVhbS5yZXBsYWNlIDEsICd5JworICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ3JlcGxhY2UgdGhlbiBkZWxldGUgbWlkZGxlIGluZGV4JyBkbworICAgIHJld3JpdGUoICdhYmMnLCAnYWMnICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5yZXBsYWNlIDEsICd4JworICAgICAgc3RyZWFtLmRlbGV0ZSAxCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnaW5zZXJ0IHRoZW4gcmVwbGFjZSBzYW1lIGluZGV4JyBkbworICAgIHJld3JpdGUgJ2FiYycsICd4YmMnIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSAwLCAnMCcKKyAgICAgIHN0cmVhbS5yZXBsYWNlIDAsICd4JworICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2luc2VydCBtaWRkbGUgaW5kZXgnIGRvCisgICAgcmV3cml0ZSggImFiYyIsICJheXhiYyIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDEsICJ4IiApCisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMSwgInkiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdpbnNlcnQgdGhlbiByZXBsYWNlIGluZGV4MCcgZG8KKyAgICByZXdyaXRlKCAiYWJjIiwgInpiYyIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDAsICJ4IiApCisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMCwgInkiICkKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAwLCAieiIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ3JlcGxhY2UgdGhlbiBpbnNlcnQgYmVmb3JlIGxhc3QgaW5kZXgnIGRvCisgICAgcmV3cml0ZSggImFiYyIsICJhYnl4IiApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0ucmVwbGFjZSggMiwgIngiICkKKyAgICAgIHN0cmVhbS5pbnNlcnRfYmVmb3JlKCAyLCAieSIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2luc2VydCB0aGVuIHJlcGxhY2UgbGFzdCBpbmRleCcgZG8KKyAgICByZXdyaXRlKCAiYWJjIiwgImFieCIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDIsICJ5IiApCisgICAgICBzdHJlYW0ucmVwbGFjZSggMiwgIngiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIHRoZW4gaW5zZXJ0IGFmdGVyIGxhc3QgaW5kZXgnIGRvCisgICAgcmV3cml0ZSggImFiYyIsICJhYnh5IiApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0ucmVwbGFjZSggMiwgIngiICkKKyAgICAgIHN0cmVhbS5pbnNlcnRfYWZ0ZXIoIDIsICJ5IiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAncmVwbGFjZSByYW5nZSB0aGVuIGluc2VydCBhdCBsZWZ0IGVkZ2UnIGRvCisgICAgcmV3cml0ZSggImFiY2NjYmEiLCAiYWJ5eGJhIiApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0ucmVwbGFjZSggMiwgNCwgIngiICkKKyAgICAgIHN0cmVhbS5pbnNlcnRfYmVmb3JlKCAyLCAieSIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ3JlcGxhY2UgcmFuZ2UgdGhlbiBpbnNlcnQgYWZ0ZXIgcmlnaHQgZWRnZScgZG8KKyAgICByZXdyaXRlKCAiYWJjY2NiYSIsICJhYnh5YmEiICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAyLCA0LCAieCIgKQorICAgICAgc3RyZWFtLmluc2VydF9hZnRlciggNCwgInkiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIGFsbCcgZG8KKyAgICByZXdyaXRlKCAiYWJjY2NiYSIsICJ4IiApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0ucmVwbGFjZSggMCwgNiwgIngiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIHNpbmdsZSBtaWRkbGUgdGhlbiBvdmVybGFwcGluZyBzdXBlcnNldCcgZG8KKyAgICByZXdyaXRlKCAiYWJjYmEiLCAiZm9vYSIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLnJlcGxhY2UoIDIsIDIsICJ4eXoiICkKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAwLCAzLCAiZm9vIiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnY29tYmluZSBpbnNlcnRzJyBkbworICAgIHJld3JpdGUoICJhYmMiLCAieXhhYmMiICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5pbnNlcnRfYmVmb3JlKCAwLCAieCIgKQorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDAsICJ5IiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnY29tYmluZTMgaW5zZXJ0cycgZG8KKyAgICByZXdyaXRlKCAiYWJjIiwgInlhenhiYyIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDEsICJ4IiApCisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMCwgInkiICkKKyAgICAgIHN0cmVhbS5pbnNlcnRfYmVmb3JlKCAxLCAieiIgKQorICAgIGVuZAorICBlbmQKKyAgCisgIGV4YW1wbGUgJ2Rpc2pvaW50IGluc2VydHMnIGRvCisgICAgcmV3cml0ZSggImFiYyIsICJ6YXhieWMiICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5pbnNlcnRfYmVmb3JlKCAxLCAieCIgKQorICAgICAgc3RyZWFtLmluc2VydF9iZWZvcmUoIDIsICJ5IiApCisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMCwgInoiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdsZWF2ZSBhbG9uZSBkaXNqb2ludCBpbnNlcnQnIGRvCisgICAgcmV3cml0ZSggImFiY2MiLCAiYXhiZm9vIiApIGRvIHxzdHJlYW18CisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMSwgIngiICkKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAyLCAzLCAiZm9vIiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnbGVhdmUgYWxvbmUgZGlzam9pbnQgaW5zZXJ0MicgZG8KKyAgICByZXdyaXRlKCAiYWJjYyIsICJheGJmb28iICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAyLCAzLCAiZm9vIiApCisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMSwgIngiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdjb21iaW5lIGluc2VydCBvbiBsZWZ0IHdpdGggZGVsZXRlJyBkbworICAgIHJld3JpdGUoICJhYmMiLCAieiIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLmRlbGV0ZSggMCwgMiApCisgICAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSggMCwgInoiICkKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICdvdmVybGFwcGluZyByZXBsYWNlJyBkbworICAgIHJld3JpdGUoICJhYmNjIiwgImJhciIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLnJlcGxhY2UoIDEsIDIsICJmb28iICkKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAwLCAzLCAiYmFyIiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnb3ZlcmxhcHBpbmcgcmVwbGFjZTMnIGRvCisgICAgcmV3cml0ZSggImFiY2MiLCAiYmFyYyIgKSBkbyB8c3RyZWFtfAorICAgICAgc3RyZWFtLnJlcGxhY2UoIDEsIDIsICJmb28iICkKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAwLCAyLCAiYmFyIiApCisgICAgZW5kCisgIGVuZAorICAKKyAgZXhhbXBsZSAnb3ZlcmxhcHBpbmcgcmVwbGFjZSA0JyBkbworICAgIHJld3JpdGUoICJhYmNjIiwgImFiYXIiICkgZG8gfHN0cmVhbXwKKyAgICAgIHN0cmVhbS5yZXBsYWNlKCAxLCAyLCAiZm9vIiApCisgICAgICBzdHJlYW0ucmVwbGFjZSggMSwgMywgImJhciIgKQorICAgIGVuZAorICBlbmQKKworICBleGFtcGxlICdvdmVybGFwcGluZyByZXBsYWNlIDInIGRvCisgICAgbGV4ZXIgPSBTaW1wbGVSZXdyaXRpbmc6OkxleGVyLm5ldyggJ2FiY2MnICkKKyAgICBzdHJlYW0gPSBBTlRMUjM6OlRva2VuUmV3cml0ZVN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBzdHJlYW0ucmVwbGFjZSAwLCAzLCAnYmFyJworICAgIHN0cmVhbS5yZXBsYWNlIDEsIDIsICdmb28nCisgICAgCisgICAgbGFtYmRhIHsgc3RyZWFtLnJlbmRlciB9LgorICAgIHNob3VsZCByYWlzZV9lcnJvciB7IHxlcnJvcnwKKyAgICAgIGVycm9yLnRvX3Muc2hvdWxkID09ICVxPG9wZXJhdGlvbiAocmVwbGFjZSBAIDEuLjIgOiAiZm9vIikgb3ZlcmxhcHMgd2l0aCBwcmV2aW91cyBvcGVyYXRpb24gKHJlcGxhY2UgQCAwLi4zIDogImJhciIpPgorICAgIH0KKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIHJhbmdlIHRoZW4gaW5zZXJ0IGF0IHJpZ2h0IGVkZ2UnIGRvCisgICAgbGV4ZXIgPSBTaW1wbGVSZXdyaXRpbmc6OkxleGVyLm5ldyggJ2FiY2NjYmEnICkKKyAgICBzdHJlYW0gPSBBTlRMUjM6OlRva2VuUmV3cml0ZVN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBzdHJlYW0ucmVwbGFjZSAyLCA0LCAneCcKKyAgICBzdHJlYW0uaW5zZXJ0X2JlZm9yZSA0LCAneScKKyAgICBsYW1iZGEgeyBzdHJlYW0ucmVuZGVyIH0uCisgICAgc2hvdWxkIHJhaXNlX2Vycm9yIHsgfGVycm9yfAorICAgICAgZXJyb3IudG9fcy5zaG91bGQgPT0gJXE8b3BlcmF0aW9uIChpbnNlcnQtYmVmb3JlIEAgNCA6ICJ5Iikgb3ZlcmxhcHMgd2l0aCBwcmV2aW91cyBvcGVyYXRpb24gKHJlcGxhY2UgQCAyLi40IDogIngiKT4KKyAgICB9CisgIGVuZAorICAKKyAgZXhhbXBsZSAncmVwbGFjZSB0aGVuIHJlcGxhY2Ugc3VwZXJzZXQnIGRvCisgICAgbGV4ZXIgPSBTaW1wbGVSZXdyaXRpbmc6OkxleGVyLm5ldyggJ2FiY2NjYmEnICkKKyAgICBzdHJlYW0gPSBBTlRMUjM6OlRva2VuUmV3cml0ZVN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBzdHJlYW0ucmVwbGFjZSAyLCA0LCAneHl6JworICAgIHN0cmVhbS5yZXBsYWNlIDMsIDUsICdmb28nCisgICAgbGFtYmRhIHsgc3RyZWFtLnJlbmRlciB9LgorICAgIHNob3VsZCByYWlzZV9lcnJvciB7IHxlcnJvcnwKKyAgICAgIGVycm9yLnRvX3Muc2hvdWxkID09ICVxPG9wZXJhdGlvbiAocmVwbGFjZSBAIDMuLjUgOiAiZm9vIikgb3ZlcmxhcHMgd2l0aCBwcmV2aW91cyBvcGVyYXRpb24gKHJlcGxhY2UgQCAyLi40IDogInh5eiIpPgorICAgIH0KKyAgZW5kCisgIAorICBleGFtcGxlICdyZXBsYWNlIHRoZW4gcmVwbGFjZSBsb3dlciBpbmRleGVkIHN1cGVyc2V0JyBkbworICAgIGxleGVyID0gU2ltcGxlUmV3cml0aW5nOjpMZXhlci5uZXcoICdhYmNjY2JhJyApCisgICAgc3RyZWFtID0gQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW0ubmV3KCBsZXhlciApCisgICAgc3RyZWFtLnJlcGxhY2UgMiwgNCwgJ3h5eicKKyAgICBzdHJlYW0ucmVwbGFjZSAxLCAzLCAnZm9vJworICAgIGxhbWJkYSB7IHN0cmVhbS5yZW5kZXIgfS4KKyAgICBzaG91bGQgcmFpc2VfZXJyb3IgeyB8ZXJyb3J8CisgICAgICBlcnJvci50b19zLnNob3VsZCA9PSAlcTxvcGVyYXRpb24gKHJlcGxhY2UgQCAxLi4zIDogImZvbyIpIG92ZXJsYXBzIHdpdGggcHJldmlvdXMgb3BlcmF0aW9uIChyZXBsYWNlIEAgMi4uNCA6ICJ4eXoiKT4KKyAgICB9CisgIGVuZAorICAKK2VuZAorCitjbGFzcyBUZXN0UmV3cml0aW5nV2l0aFRva2VuU3RyZWFtMiA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtRU5EICkKKyAgICBsZXhlciBncmFtbWFyIFNpbXBsZVJld3JpdGluZzI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICB9CisgICAgCisgICAgSUQgOiAnYScuLid6Jys7CisgICAgSU5UIDogJzAnLi4nOScrOworICAgIFNFTUkgOiAnOyc7CisgICAgUExVUyA6ICcrJzsKKyAgICBNVUwgOiAnKic7CisgICAgQVNTSUdOIDogJz0nOworICAgIFdTIDogJyAnKzsKKyAgRU5ECisgIAorICBkZWYgcmV3cml0ZSggaW5wdXQgKQorICAgIGxleGVyID0gU2ltcGxlUmV3cml0aW5nMjo6TGV4ZXIubmV3KCBpbnB1dCApCisgICAgQU5UTFIzOjpUb2tlblJld3JpdGVTdHJlYW0ubmV3KCBsZXhlciApCisgIGVuZAorICAKKyAgZXhhbXBsZSAncmVuZGVyaW5nIG92ZXIgYSByYW5nZScgZG8KKyAgICBzdHJlYW0gPSByZXdyaXRlICd4ID0gMyAqIDA7JworICAgIHN0cmVhbS5yZXBsYWNlIDQsIDgsICcwJworICAgIHN0cmVhbS5vcmlnaW5hbF9zdHJpbmcuc2hvdWxkID09ICd4ID0gMyAqIDA7JworICAgIHN0cmVhbS5yZW5kZXIuc2hvdWxkID09ICd4ID0gMDsnCisgICAgc3RyZWFtLnJlbmRlciggMCwgOSApLnNob3VsZCA9PSAneCA9IDA7JworICAgIHN0cmVhbS5yZW5kZXIoIDQsIDggKS5zaG91bGQgPT0gJzAnCisgIGVuZAorICAKKyAgZXhhbXBsZSAnbW9yZSByZW5kZXJpbmcgb3ZlciBhIHJhbmdlJyBkbworICAgIHN0cmVhbSA9IHJld3JpdGUgJ3ggPSAzICogMCArIDIgKiAwOycKKyAgICBzdHJlYW0ub3JpZ2luYWxfc3RyaW5nLnNob3VsZCA9PSAneCA9IDMgKiAwICsgMiAqIDA7JworICAgIHN0cmVhbS5yZXBsYWNlIDQsIDgsICcwJworICAgIHN0cmVhbS5yZW5kZXIuc2hvdWxkID09ICd4ID0gMCArIDIgKiAwOycKKyAgICBzdHJlYW0ucmVuZGVyKCAwLCAxNyApLnNob3VsZCA9PSAneCA9IDAgKyAyICogMDsnCisgICAgc3RyZWFtLnJlbmRlciggNCwgOCApLnNob3VsZCAgPT0gJzAnCisgICAgc3RyZWFtLnJlbmRlciggMCwgOCApLnNob3VsZCAgPT0gJ3ggPSAwJworICAgIHN0cmVhbS5yZW5kZXIoIDEyLCAxNiApLnNob3VsZCA9PSAnMiAqIDAnCisgICAgc3RyZWFtLmluc2VydF9hZnRlciggMTcsICcvLyBjb21tZW50JyApCisgICAgc3RyZWFtLnJlbmRlciggMTIsIDE3ICkuc2hvdWxkID09ICcyICogMDsvLyBjb21tZW50JworICAgIHN0cmVhbS5yZW5kZXIoIDAsIDggKS5zaG91bGQgPT0gJ3ggPSAwJworICBlbmQKKworZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC90b2tlbi1yZXdyaXRlL3ZpYS1wYXJzZXIucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvZnVuY3Rpb25hbC90b2tlbi1yZXdyaXRlL3ZpYS1wYXJzZXIucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkMDc1OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3Rva2VuLXJld3JpdGUvdmlhLXBhcnNlci5yYgpAQCAtMCwwICsxLDk5IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RSZXdyaXRpbmdXaGlsZVBhcnNpbmcgPCBBTlRMUjM6OlRlc3Q6OkZ1bmN0aW9uYWwKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgVG9rZW5SZXdyaXRlczsKKyAgICBvcHRpb25zIHsgbGFuZ3VhZ2UgPSBSdWJ5OyB9CisgICAgCisgICAgcHJvZ3JhbQorICAgIEBhZnRlciB7CisgICAgICBAaW5wdXQuaW5zZXJ0X2JlZm9yZSgkc3RhcnQsInB1YmxpYyBjbGFzcyBXcmFwcGVyIHtcbiIpCisgICAgICBAaW5wdXQuaW5zZXJ0X2FmdGVyKCRzdG9wLCAiXG59XG4iKQorICAgIH0KKyAgICAgICAgOiAgIG1ldGhvZCsKKyAgICAgICAgOworICAgIAorICAgIG1ldGhvZAorICAgICAgICA6ICAgbT0nbWV0aG9kJyBJRCAnKCcgJyknIGJvZHkKKyAgICAgICAgICAgIHtAaW5wdXQucmVwbGFjZSgkbSwgInB1YmxpYyB2b2lkIik7fQorICAgICAgICA7IAorICAgIAorICAgIGJvZHkKKyAgICBzY29wZSB7CisgICAgICAgIGRlY2xzCisgICAgfQorICAgIEBpbml0IHsKKyAgICAgICAgJGJvZHk6OmRlY2xzID0gW10KKyAgICB9CisgICAgICAgIDogICBsY3VybHk9J3snIHN0YXQqICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgJGJvZHk6OmRlY2xzLnVuaXEhCisgICAgICAgICAgICBmb3IgaXQgaW4gJGJvZHk6OmRlY2xzCisgICAgICAgICAgICAgIEBpbnB1dC5pbnNlcnRfYWZ0ZXIoJGxjdXJseSwgIlxuaW50ICIraXQrIjsiKQorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICB9CisgICAgICAgIDsKKyAgICAKKyAgICBzdGF0OiAgIElEICc9JyBleHByICc7JyB7JGJvZHk6OmRlY2xzIDw8ICRJRC50ZXh0LnRvX3N9CisgICAgICAgIDsKKyAgICAKKyAgICBleHByOiAgIG11bCAoJysnIG11bCkqIAorICAgICAgICA7CisgICAgCisgICAgbXVsIDogICBhdG9tICgnKicgYXRvbSkqCisgICAgICAgIDsKKyAgICAKKyAgICBhdG9tOiAgIElECisgICAgICAgIHwgICBJTlQKKyAgICAgICAgOworICAgIAorICAgIElEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSsgOworICAgIAorICAgIElOVCA6ICAgKCcwJy4uJzknKSsgOworICAgIAorICAgIFdTICA6ICAgKCcgJ3wnXHQnfCdcbicpKyB7JGNoYW5uZWw9SElEREVOO30KKyAgICAgICAgOworICBFTkQKKworICBleGFtcGxlICd1c2luZyBhIFRva2VuUmV3cml0ZVN0cmVhbSB0byByZXdyaXRlIGlucHV0IHRleHQgd2hpbGUgcGFyc2luZycgZG8KKyAgICBpbnB1dCA9IDw8LUVORC5maXhlZF9pbmRlbnQoIDAgKQorICAgICAgbWV0aG9kIGZvbygpIHsKKyAgICAgICAgaSA9IDM7CisgICAgICAgIGsgPSBpOworICAgICAgICBpID0gayo0OworICAgICAgfQorICAgICAgCisgICAgICBtZXRob2QgYmFyKCkgeworICAgICAgICBqID0gaSoyOworICAgICAgfQorICAgIEVORAorICAgIGV4cGVjdGVkX291dHB1dCA9IDw8LUVORC5maXhlZF9pbmRlbnQoIDAgKS5zdHJpcCEKKyAgICAgIHB1YmxpYyBjbGFzcyBXcmFwcGVyIHsKKyAgICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKKyAgICAgIGludCBrOworICAgICAgaW50IGk7CisgICAgICAgIGkgPSAzOworICAgICAgICBrID0gaTsKKyAgICAgICAgaSA9IGsqNDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgcHVibGljIHZvaWQgYmFyKCkgeworICAgICAgaW50IGo7CisgICAgICAgIGogPSBpKjI7CisgICAgICB9CisgICAgICB9CisgICAgRU5ECisgICAgCisgICAgbGV4ZXIgPSBUb2tlblJld3JpdGVzOjpMZXhlci5uZXcoIGlucHV0ICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OlRva2VuUmV3cml0ZVN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBUb2tlblJld3JpdGVzOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIHBhcnNlci5wcm9ncmFtCisgICAgCisgICAgdG9rZW5zLnJlbmRlci5zdHJpcC5zaG91bGQgPT0gZXhwZWN0ZWRfb3V0cHV0CisgIGVuZAorCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3RyZWUtcGFyc2VyL2Jhc2ljLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L2Z1bmN0aW9uYWwvdHJlZS1wYXJzZXIvYmFzaWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC9mdW5jdGlvbmFsL3RyZWUtcGFyc2VyL2Jhc2ljLnJiCkBAIC0wLDAgKzEsNzQ5IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMy90ZXN0L2Z1bmN0aW9uYWwnCisKK2NsYXNzIFRlc3RUcmVlUGFyc2VyMSA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICAKKyAgZXhhbXBsZSAiZmxhdCBsaXN0IiBkbworICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIGdyYW1tYXIgRmxhdExpc3Q7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICB9CisgICAgICBhIDogSUQgSU5UOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgV1MgOiAoJyAnfCdcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgdHJlZSBncmFtbWFyIEZsYXRMaXN0V2Fsa2VyOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgIH0KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYSA6IElEIElOVAorICAgICAgICAgIHtzZWxmLmNhcHR1cmUoIlwlcywgXCVzIiBcJSBbJElELCAkSU5UXSl9CisgICAgICAgIDsKKyAgICBFTkQKKyAgICAKKyAgICBsZXhlciAgPSBGbGF0TGlzdDo6TGV4ZXIubmV3KCAiYWJjIDM0IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBGbGF0TGlzdDo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IEZsYXRMaXN0V2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHdhbGtlci5hCisgICAgd2Fsa2VyLm91dHB1dC5zaG91bGQgPT0gImFiYywgMzQiCisgIGVuZAorICAKKyAgZXhhbXBsZSAic2ltcGxlIHRyZWUiIGRvCisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBTaW1wbGVUcmVlOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgfQorICAgICAgYSA6IElEIElOVCAtPiBeKElEIElOVCk7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgdHJlZSBncmFtbWFyIFNpbXBsZVRyZWVXYWxrZXI7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgfQorICAgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCB9CisgICAgICAKKyAgICAgIGEgOiBeKElEIElOVCkKKyAgICAgICAgICB7Y2FwdHVyZSgnXCVzLCBcJXMnIFwlIFskSUQsICRJTlRdKX0KKyAgICAgICAgOworICAgIEVORAorICAgIGxleGVyICA9IFNpbXBsZVRyZWU6OkxleGVyLm5ldyggImFiYyAzNCIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gU2ltcGxlVHJlZTo6UGFyc2VyLm5ldyggdG9rZW5zICkKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIuYQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHRva2VucworICAgIHdhbGtlciA9IFNpbXBsZVRyZWVXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgd2Fsa2VyLmEKKyAgICB3YWxrZXIub3V0cHV0LnNob3VsZCA9PSAiYWJjLCAzNCIKKyAgZW5kCisgIAorICBleGFtcGxlICJmbGF0IHZzIHRyZWUgZGVjaXNpb24iIGRvCisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBGbGF0VnNUcmVlRGVjaXNpb247CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICB9CisgICAgICBhIDogYiBjIDsKKyAgICAgIGIgOiBJRCBJTlQgLT4gXihJRCBJTlQpOworICAgICAgYyA6IElEIElOVDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICB0cmVlIGdyYW1tYXIgRmxhdFZzVHJlZURlY2lzaW9uV2Fsa2VyOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgIH0KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgCisgICAgICBhIDogYiBiIDsKKyAgICAgIGIgOiBJRCBJTlQgICAge2NhcHR1cmUoIlwlcyBcJXNcbiIgXCUgWyRJRCwgJElOVF0pfQorICAgICAgICB8IF4oSUQgSU5UKSB7Y2FwdHVyZSgiXihcJXMgXCVzKSIgXCUgWyRJRCwgJElOVF0pfQorICAgICAgICA7CisgICAgRU5ECisgICAgbGV4ZXIgID0gRmxhdFZzVHJlZURlY2lzaW9uOjpMZXhlci5uZXcoICJhIDEgYiAyIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBGbGF0VnNUcmVlRGVjaXNpb246OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBGbGF0VnNUcmVlRGVjaXNpb25XYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgd2Fsa2VyLmEKKyAgICB3YWxrZXIub3V0cHV0LnNob3VsZCA9PSAiXihhIDEpYiAyXG4iCisgIGVuZAorICAKKyAgZXhhbXBsZSAiZmxhdCB2cyB0cmVlIGRlY2lzaW9uMiIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIEZsYXRWc1RyZWVEZWNpc2lvbjI7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICB9CisgICAgICBhIDogYiBjIDsKKyAgICAgIGIgOiBJRCBJTlQrIC0+IF4oSUQgSU5UKyk7CisgICAgICBjIDogSUQgSU5UKzsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHRyZWUgZ3JhbW1hciBGbGF0VnNUcmVlRGVjaXNpb24yV2Fsa2VyOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgIH0KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYSA6IGIgYiA7CisgICAgICBiIDogSUQgSU5UKyAgICB7c2F5KCIjeyRJRH0gI3skSU5UfSIpfQorICAgICAgICB8IF4oeD1JRCAoeT1JTlQpKykge2NhcHR1cmUoIl4oI3skeH0gI3skeX0pIil9CisgICAgICAgIDsKKyAgICBFTkQKKyAgICBsZXhlciAgPSBGbGF0VnNUcmVlRGVjaXNpb24yOjpMZXhlci5uZXcoICJhIDEgMiAzIGIgNCA1IiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBGbGF0VnNUcmVlRGVjaXNpb24yOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gRmxhdFZzVHJlZURlY2lzaW9uMldhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICB3YWxrZXIuYQorICAgIHdhbGtlci5vdXRwdXQuc2hvdWxkID09ICJeKGEgMyliIDVcbiIKKyAgZW5kCisgIAorICBleGFtcGxlICJjeWNsaWMgZGZhIGxvb2thaGVhZCIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIEN5Y2xpY0RGQUxvb2thaGVhZDsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgIH0KKyAgICAgIGEgOiBJRCBJTlQrIFBFUklPRDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFNFTUkgOiAnOycgOworICAgICAgUEVSSU9EIDogJy4nIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHRyZWUgZ3JhbW1hciBDeWNsaWNERkFMb29rYWhlYWRXYWxrZXI7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgfQorICAgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCB9CisgICAgICBhIDogSUQgSU5UKyBQRVJJT0Qge2NhcHR1cmUoImFsdCAxIil9CisgICAgICAgIHwgSUQgSU5UKyBTRU1JICAge2NhcHR1cmUoImFsdCAyIil9CisgICAgICAgIDsKKyAgICBFTkQKKyAgICBsZXhlciAgPSBDeWNsaWNERkFMb29rYWhlYWQ6OkxleGVyLm5ldyggImEgMSAyIDMuIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBDeWNsaWNERkFMb29rYWhlYWQ6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBDeWNsaWNERkFMb29rYWhlYWRXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgd2Fsa2VyLmEKKyAgICB3YWxrZXIub3V0cHV0LnNob3VsZCA9PSAiYWx0IDEiCisgIGVuZAorICAKKyAgZXhhbXBsZSAibnVsbGFibGUgY2hpbGQgbGlzdCIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIE51bGxhYmxlQ2hpbGRMaXN0OworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgfQorICAgICAgYSA6IElEIElOVD8gLT4gXihJRCBJTlQ/KTsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFdTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICB0cmVlIGdyYW1tYXIgTnVsbGFibGVDaGlsZExpc3RXYWxrZXI7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIEFTVExhYmVsVHlwZT1Db21tb25UcmVlOworICAgICAgfQorICAgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCB9CisgICAgICBhIDogXihJRCBJTlQ/KQorICAgICAgICAgIHtjYXB0dXJlKCRJRC50b19zKX0KKyAgICAgICAgOworICAgIEVORAorICAgIGxleGVyICA9IE51bGxhYmxlQ2hpbGRMaXN0OjpMZXhlci5uZXcoICJhYmMiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IE51bGxhYmxlQ2hpbGRMaXN0OjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gTnVsbGFibGVDaGlsZExpc3RXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgd2Fsa2VyLmEKKyAgICB3YWxrZXIub3V0cHV0LnNob3VsZCA9PSAiYWJjIgorICBlbmQKKyAgCisgIGV4YW1wbGUgIm51bGxhYmxlIGNoaWxkIGxpc3QyIiBkbworICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIGdyYW1tYXIgTnVsbGFibGVDaGlsZExpc3QyOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBvdXRwdXQ9QVNUOworICAgICAgfQorICAgICAgYSA6IElEIElOVD8gU0VNSSAtPiBeKElEIElOVD8pIFNFTUkgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgU0VNSSA6ICc7JyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICB0cmVlIGdyYW1tYXIgTnVsbGFibGVDaGlsZExpc3QyV2Fsa2VyOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgIH0KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYSA6IF4oSUQgSU5UPykgU0VNSQorICAgICAgICAgIHtjYXB0dXJlKCRJRC50b19zKX0KKyAgICAgICAgOworICAgIEVORAorICAgIGxleGVyICA9IE51bGxhYmxlQ2hpbGRMaXN0Mjo6TGV4ZXIubmV3KCAiYWJjOyIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gTnVsbGFibGVDaGlsZExpc3QyOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gTnVsbGFibGVDaGlsZExpc3QyV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHdhbGtlci5hCisgICAgd2Fsa2VyLm91dHB1dC5zaG91bGQgPT0gImFiYyIKKyAgZW5kCisgIAorICBleGFtcGxlICJudWxsYWJsZSBjaGlsZCBsaXN0MyIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIE51bGxhYmxlQ2hpbGRMaXN0MzsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgICAgb3V0cHV0PUFTVDsKKyAgICAgIH0KKyAgICAgIGEgOiB4PUlEIElOVD8gKHk9SUQpPyBTRU1JIC0+IF4oJHggSU5UPyAkeT8pIFNFTUkgOworICAgICAgSUQgOiAnYScuLid6JysgOworICAgICAgSU5UIDogJzAnLi4nOScrOworICAgICAgU0VNSSA6ICc7JyA7CisgICAgICBXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7CisgICAgRU5ECisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgdHJlZSBncmFtbWFyIE51bGxhYmxlQ2hpbGRMaXN0M1dhbGtlcjsKKyAgICAgIG9wdGlvbnMgeworICAgICAgICAgIGxhbmd1YWdlPVJ1Ynk7CisgICAgICAgICAgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7CisgICAgICB9CisgICAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0IH0KKyAgICAgIGEgOiBeKElEIElOVD8gYikgU0VNSQorICAgICAgICAgIHtzZWxmLmNhcHR1cmUoJElELnRvX3MgKyAiLCAiICsgJGIudGV4dC50b19zKX0KKyAgICAgICAgOworICAgICAgYiA6IElEPyA7CisgICAgRU5ECisgICAgbGV4ZXIgID0gTnVsbGFibGVDaGlsZExpc3QzOjpMZXhlci5uZXcoICJhYmMgZGVmOyIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gTnVsbGFibGVDaGlsZExpc3QzOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gTnVsbGFibGVDaGlsZExpc3QzV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHdhbGtlci5hCisgICAgd2Fsa2VyLm91dHB1dC5zaG91bGQgPT0gImFiYywgZGVmIgorICBlbmQKKyAgCisgIGV4YW1wbGUgImFjdGlvbnMgYWZ0ZXIgcm9vdCIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIEFjdGlvbnNBZnRlclJvb3Q7CisgICAgICBvcHRpb25zIHsKKyAgICAgICAgICBsYW5ndWFnZT1SdWJ5OworICAgICAgICAgIG91dHB1dD1BU1Q7CisgICAgICB9CisgICAgICBhIDogeD1JRCBJTlQ/IFNFTUkgLT4gXigkeCBJTlQ/KSA7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBTRU1JIDogJzsnIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHRyZWUgZ3JhbW1hciBBY3Rpb25zQWZ0ZXJSb290V2Fsa2VyOworICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgbGFuZ3VhZ2U9UnVieTsKKyAgICAgICAgICBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKKyAgICAgIH0KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYSBAaW5pdCB7eD0wfSA6IF4oSUQge3g9MX0ge3g9Mn0gSU5UPykKKyAgICAgICAgICB7c2F5KCAkSUQudG9fcyArICIsICIgKyB4LnRvX3MgKX0KKyAgICAgICAgOworICAgIEVORAorICAgIGxleGVyICA9IEFjdGlvbnNBZnRlclJvb3Q6OkxleGVyLm5ldyggImFiYzsiICkKKyAgICB0b2tlbnMgPSBBTlRMUjM6OkNvbW1vblRva2VuU3RyZWFtLm5ldyggbGV4ZXIgKQorICAgIHBhcnNlciA9IEFjdGlvbnNBZnRlclJvb3Q6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBBY3Rpb25zQWZ0ZXJSb290V2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHdhbGtlci5hCisgICAgd2Fsa2VyLm91dHB1dC5zaG91bGQgPT0gImFiYywgMlxuIgorICBlbmQKKyAgCisgIGV4YW1wbGUgIndpbGRjYXJkIGxvb2thaGVhZCIgZG8KKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICBncmFtbWFyIFdpbGRjYXJkTG9va2FoZWFkOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgJysnXiBJTlQ7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBTRU1JIDogJzsnIDsKKyAgICAgIFBFUklPRCA6ICcuJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICB0cmVlIGdyYW1tYXIgV2lsZGNhcmRMb29rYWhlYWRXYWxrZXI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyB0b2tlblZvY2FiPVdpbGRjYXJkTG9va2FoZWFkOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9CisgICAgICBAbWVtYmVycyB7IGluY2x1ZGUgQU5UTFIzOjpUZXN0OjpDYXB0dXJlT3V0cHV0IH0KKyAgICAgIGEgOiBeKCcrJyAuIElOVCkgeyBjYXB0dXJlKCJhbHQgMSIpIH0KKyAgICAgICAgOworICAgIEVORAorICAgIGxleGVyICA9IFdpbGRjYXJkTG9va2FoZWFkOjpMZXhlci5uZXcoICJhICsgMiIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gV2lsZGNhcmRMb29rYWhlYWQ6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBXaWxkY2FyZExvb2thaGVhZFdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICB3YWxrZXIuYQorICAgIHdhbGtlci5vdXRwdXQuc2hvdWxkID09ICJhbHQgMSIKKyAgZW5kCisgIAorICBleGFtcGxlICJ3aWxkY2FyZCBsb29rYWhlYWQyIiBkbworICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIGdyYW1tYXIgV2lsZGNhcmRMb29rYWhlYWQyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgJysnXiBJTlQ7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBTRU1JIDogJzsnIDsKKyAgICAgIFBFUklPRCA6ICcuJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICB0cmVlIGdyYW1tYXIgV2lsZGNhcmRMb29rYWhlYWQyV2Fsa2VyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgdG9rZW5Wb2NhYj1XaWxkY2FyZExvb2thaGVhZDI7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlO30KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYSA6IF4oJysnIC4gSU5UKSB7IGNhcHR1cmUoImFsdCAxIikgfQorICAgICAgICB8IF4oJysnIC4gLikgICB7IGNhcHR1cmUoImFsdCAyIikgfQorICAgICAgICA7CisgICAgRU5ECisgICAgbGV4ZXIgID0gV2lsZGNhcmRMb29rYWhlYWQyOjpMZXhlci5uZXcoICJhICsgMiIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gV2lsZGNhcmRMb29rYWhlYWQyOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gV2lsZGNhcmRMb29rYWhlYWQyV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHdhbGtlci5hCisgICAgd2Fsa2VyLm91dHB1dC5zaG91bGQgPT0gImFsdCAxIgorICBlbmQKKyAgCisgIGV4YW1wbGUgIndpbGRjYXJkIGxvb2thaGVhZDMiIGRvCisgICAgY29tcGlsZV9hbmRfbG9hZCBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgICAgZ3JhbW1hciBXaWxkY2FyZExvb2thaGVhZDM7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyBvdXRwdXQ9QVNUO30KKyAgICAgIGEgOiBJRCAnKydeIElOVDsKKyAgICAgIElEIDogJ2EnLi4neicrIDsKKyAgICAgIElOVCA6ICcwJy4uJzknKzsKKyAgICAgIFNFTUkgOiAnOycgOworICAgICAgUEVSSU9EIDogJy4nIDsKKyAgICAgIFdTIDogKCcgJ3wnXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOworICAgIEVORAorICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIHRyZWUgZ3JhbW1hciBXaWxkY2FyZExvb2thaGVhZDNXYWxrZXI7CisgICAgICBvcHRpb25zIHtsYW5ndWFnZT1SdWJ5OyB0b2tlblZvY2FiPVdpbGRjYXJkTG9va2FoZWFkMzsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fQorICAgICAgQG1lbWJlcnMgeyBpbmNsdWRlIEFOVExSMzo6VGVzdDo6Q2FwdHVyZU91dHB1dCB9CisgICAgICBhIDogXignKycgSUQgSU5UKSB7IGNhcHR1cmUoImFsdCAxIikgfQorICAgICAgICB8IF4oJysnIC4gLikgICB7IGNhcHR1cmUoImFsdCAyIikgfQorICAgICAgICA7CisgICAgRU5ECisgICAgbGV4ZXIgID0gV2lsZGNhcmRMb29rYWhlYWQzOjpMZXhlci5uZXcoICJhICsgMiIgKQorICAgIHRva2VucyA9IEFOVExSMzo6Q29tbW9uVG9rZW5TdHJlYW0ubmV3KCBsZXhlciApCisgICAgcGFyc2VyID0gV2lsZGNhcmRMb29rYWhlYWQzOjpQYXJzZXIubmV3KCB0b2tlbnMgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci5hCisgICAgbm9kZXMgPSBBTlRMUjM6OkFTVDo6Q29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KCByZXN1bHQudHJlZSApCisgICAgbm9kZXMudG9rZW5fc3RyZWFtID0gdG9rZW5zCisgICAgd2Fsa2VyID0gV2lsZGNhcmRMb29rYWhlYWQzV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHdhbGtlci5hCisgICAgd2Fsa2VyLm91dHB1dC5zaG91bGQgPT0gImFsdCAxIgorICBlbmQKKyAgCisgIGV4YW1wbGUgIndpbGRjYXJkIHBsdXMgbG9va2FoZWFkIiBkbworICAgIGNvbXBpbGVfYW5kX2xvYWQgaW5saW5lX2dyYW1tYXIoIDw8LSdFTkQnICkKKyAgICAgIGdyYW1tYXIgV2lsZGNhcmRQbHVzTG9va2FoZWFkOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgb3V0cHV0PUFTVDt9CisgICAgICBhIDogSUQgJysnXiBJTlQ7CisgICAgICBJRCA6ICdhJy4uJ3onKyA7CisgICAgICBJTlQgOiAnMCcuLic5Jys7CisgICAgICBTRU1JIDogJzsnIDsKKyAgICAgIFBFUklPRCA6ICcuJyA7CisgICAgICBXUyA6ICgnICd8J1xuJykgeyRjaGFubmVsPUhJRERFTjt9IDsKKyAgICBFTkQKKyAgICBjb21waWxlX2FuZF9sb2FkIGlubGluZV9ncmFtbWFyKCA8PC0nRU5EJyApCisgICAgICB0cmVlIGdyYW1tYXIgV2lsZGNhcmRQbHVzTG9va2FoZWFkV2Fsa2VyOworICAgICAgb3B0aW9ucyB7bGFuZ3VhZ2U9UnVieTsgdG9rZW5Wb2NhYj1XaWxkY2FyZFBsdXNMb29rYWhlYWQ7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlO30KKyAgICAgIEBtZW1iZXJzIHsgaW5jbHVkZSBBTlRMUjM6OlRlc3Q6OkNhcHR1cmVPdXRwdXQgfQorICAgICAgYSA6IF4oJysnIElOVCBJTlQgKSB7IGNhcHR1cmUoImFsdCAxIikgfQorICAgICAgICB8IF4oJysnIC4rKSAgIHsgY2FwdHVyZSgiYWx0IDIiKSB9CisgICAgICAgIDsKKyAgICBFTkQKKyAgICBsZXhlciAgPSBXaWxkY2FyZFBsdXNMb29rYWhlYWQ6OkxleGVyLm5ldyggImEgKyAyIiApCisgICAgdG9rZW5zID0gQU5UTFIzOjpDb21tb25Ub2tlblN0cmVhbS5uZXcoIGxleGVyICkKKyAgICBwYXJzZXIgPSBXaWxkY2FyZFBsdXNMb29rYWhlYWQ6OlBhcnNlci5uZXcoIHRva2VucyApCisgICAgCisgICAgcmVzdWx0ID0gcGFyc2VyLmEKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSB0b2tlbnMKKyAgICB3YWxrZXIgPSBXaWxkY2FyZFBsdXNMb29rYWhlYWRXYWxrZXI6OlRyZWVQYXJzZXIubmV3KCBub2RlcyApCisgICAgd2Fsa2VyLmEKKyAgICB3YWxrZXIub3V0cHV0LnNob3VsZCA9PSAiYWx0IDIiCisgIGVuZAorICAKK2VuZAorCisKK2NsYXNzIFRlc3RUcmVlUGFyc2VyMiA8IEFOVExSMzo6VGVzdDo6RnVuY3Rpb25hbAorICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIGdyYW1tYXIgR2VuZXJpY0xhbmd1YWdlOworICAgIG9wdGlvbnMgeworICAgICAgICBsYW5ndWFnZSA9IFJ1Ynk7CisgICAgICAgIG91dHB1dD1BU1Q7CisgICAgfQorICAgIAorICAgIHRva2VucyB7CisgICAgICAgIFZBUl9ERUY7CisgICAgICAgIEFSR19ERUY7CisgICAgICAgIEZVTkNfSERSOworICAgICAgICBGVU5DX0RFQ0w7CisgICAgICAgIEZVTkNfREVGOworICAgICAgICBCTE9DSzsKKyAgICB9CisgICAgCisgICAgcHJvZ3JhbQorICAgICAgICA6ICAgZGVjbGFyYXRpb24rCisgICAgICAgIDsKKyAgICAKKyAgICBkZWNsYXJhdGlvbgorICAgICAgICA6ICAgdmFyaWFibGUKKyAgICAgICAgfCAgIGZ1bmN0aW9uSGVhZGVyICc7JyAtPiBeKEZVTkNfREVDTCBmdW5jdGlvbkhlYWRlcikKKyAgICAgICAgfCAgIGZ1bmN0aW9uSGVhZGVyIGJsb2NrIC0+IF4oRlVOQ19ERUYgZnVuY3Rpb25IZWFkZXIgYmxvY2spCisgICAgICAgIDsKKyAgICAKKyAgICB2YXJpYWJsZQorICAgICAgICA6ICAgdHlwZSBkZWNsYXJhdG9yICc7JyAtPiBeKFZBUl9ERUYgdHlwZSBkZWNsYXJhdG9yKQorICAgICAgICA7CisgICAgCisgICAgZGVjbGFyYXRvcgorICAgICAgICA6ICAgSUQgCisgICAgICAgIDsKKyAgICAKKyAgICBmdW5jdGlvbkhlYWRlcgorICAgICAgICA6ICAgdHlwZSBJRCAnKCcgKCBmb3JtYWxQYXJhbWV0ZXIgKCAnLCcgZm9ybWFsUGFyYW1ldGVyICkqICk/ICcpJworICAgICAgICAgICAgLT4gXihGVU5DX0hEUiB0eXBlIElEIGZvcm1hbFBhcmFtZXRlcispCisgICAgICAgIDsKKyAgICAKKyAgICBmb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgOiAgIHR5cGUgZGVjbGFyYXRvciAtPiBeKEFSR19ERUYgdHlwZSBkZWNsYXJhdG9yKQorICAgICAgICA7CisgICAgCisgICAgdHlwZQorICAgICAgICA6ICAgJ2ludCcgICAKKyAgICAgICAgfCAgICdjaGFyJyAgCisgICAgICAgIHwgICAndm9pZCcKKyAgICAgICAgfCAgIElEICAgICAgICAKKyAgICAgICAgOworICAgIAorICAgIGJsb2NrCisgICAgICAgIDogICBsYz0neycKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSoKKyAgICAgICAgICAgICAgICBzdGF0KgorICAgICAgICAgICAgJ30nCisgICAgICAgICAgICAtPiBeKEJMT0NLWyRsYywiQkxPQ0siXSB2YXJpYWJsZSogc3RhdCopCisgICAgICAgIDsKKyAgICAKKyAgICBzdGF0OiBmb3JTdGF0CisgICAgICAgIHwgZXhwciAnOychCisgICAgICAgIHwgYmxvY2sKKyAgICAgICAgfCBhc3NpZ25TdGF0ICc7JyEKKyAgICAgICAgfCAnOychCisgICAgICAgIDsKKyAgICAKKyAgICBmb3JTdGF0CisgICAgICAgIDogICAnZm9yJyAnKCcgc3RhcnQ9YXNzaWduU3RhdCAnOycgZXhwciAnOycgbmV4dD1hc3NpZ25TdGF0ICcpJyBibG9jaworICAgICAgICAgICAgLT4gXignZm9yJyAkc3RhcnQgZXhwciAkbmV4dCBibG9jaykKKyAgICAgICAgOworICAgIAorICAgIGFzc2lnblN0YXQKKyAgICAgICAgOiAgIElEIEVRIGV4cHIgLT4gXihFUSBJRCBleHByKQorICAgICAgICA7CisgICAgCisgICAgZXhwcjogICBjb25kRXhwcgorICAgICAgICA7CisgICAgCisgICAgY29uZEV4cHIKKyAgICAgICAgOiAgIGFleHByICggKCc9PSdeIHwgJzwnXikgYWV4cHIgKT8KKyAgICAgICAgOworICAgIAorICAgIGFleHByCisgICAgICAgIDogICBhdG9tICggJysnXiBhdG9tICkqCisgICAgICAgIDsKKyAgICAKKyAgICBhdG9tCisgICAgICAgIDogSUQgICAgICAKKyAgICAgICAgfCBJTlQgICAgICAKKyAgICAgICAgfCAnKCcgZXhwciAnKScgLT4gZXhwcgorICAgICAgICA7IAorICAgIAorICAgIEZPUiA6ICdmb3InIDsKKyAgICBJTlRfVFlQRSA6ICdpbnQnIDsKKyAgICBDSEFSOiAnY2hhcic7CisgICAgVk9JRDogJ3ZvaWQnOworICAgIAorICAgIElEICA6ICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJykgKCdhJy4uJ3onfCdBJy4uJ1onfCcwJy4uJzknfCdfJykqCisgICAgICAgIDsKKyAgICAKKyAgICBJTlQgOgkoJzAnLi4nOScpKworICAgICAgICA7CisgICAgCisgICAgRVEgICA6ICc9JyA7CisgICAgRVFFUSA6ICc9PScgOworICAgIExUICAgOiAnPCcgOworICAgIFBMVVMgOiAnKycgOworICAgIAorICAgIFdTICA6ICAgKCAgICcgJworICAgICAgICAgICAgfCAgICdcdCcKKyAgICAgICAgICAgIHwgICAnXHInCisgICAgICAgICAgICB8ICAgJ1xuJworICAgICAgICAgICAgKSsKKyAgICAgICAgICAgIHsgJGNoYW5uZWw9SElEREVOIH0KKyAgICAgICAgOworICBFTkQKKworICBpbmxpbmVfZ3JhbW1hciggPDwtJ0VORCcgKQorICAgIHRyZWUgZ3JhbW1hciBHZW5lcmljTGFuZ3VhZ2VXYWxrZXI7CisgICAgb3B0aW9ucyB7CisgICAgICAgIGxhbmd1YWdlID0gUnVieTsKKyAgICAgICAgdG9rZW5Wb2NhYiA9IEdlbmVyaWNMYW5ndWFnZTsKKyAgICAgICAgQVNUTGFiZWxUeXBlID0gQ29tbW9uVHJlZTsKKyAgICB9CisgICAgCisgICAgQGluaXQgeyBAdHJhY2VzID0gW10gfQorICAgIEBtZW1iZXJzIHsKKyAgICAgIGF0dHJfcmVhZGVyIDp0cmFjZXMKKyAgICAgIAorICAgICAgZGVmIHRyYWNlX2luKHJ1bGVfbmFtZSwgcnVsZV9pbmRleCkKKyAgICAgICAgQHRyYWNlcyA8PCAiPiN7cnVsZV9uYW1lfSIKKyAgICAgIGVuZAorICAgICAgCisgICAgICBkZWYgdHJhY2Vfb3V0KHJ1bGVfbmFtZSwgcnVsZV9pbmRleCkKKyAgICAgICAgQHRyYWNlcyA8PCAiPCN7cnVsZV9uYW1lfSIKKyAgICAgIGVuZAorICAgIH0KKyAgICAKKyAgICBwcm9ncmFtCisgICAgICAgIDogICBkZWNsYXJhdGlvbisKKyAgICAgICAgOworICAgIAorICAgIGRlY2xhcmF0aW9uCisgICAgICAgIDogICB2YXJpYWJsZQorICAgICAgICB8ICAgXihGVU5DX0RFQ0wgZnVuY3Rpb25IZWFkZXIpCisgICAgICAgIHwgICBeKEZVTkNfREVGIGZ1bmN0aW9uSGVhZGVyIGJsb2NrKQorICAgICAgICA7CisgICAgCisgICAgdmFyaWFibGUgcmV0dXJucyBbcmVzXQorICAgICAgICA6ICAgXihWQVJfREVGIHR5cGUgZGVjbGFyYXRvcikKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgJHJlcyA9ICRkZWNsYXJhdG9yLnRleHQ7IAorICAgICAgICAgICAgfQorICAgICAgICA7CisgICAgCisgICAgZGVjbGFyYXRvcgorICAgICAgICA6ICAgSUQgCisgICAgICAgIDsKKyAgICAKKyAgICBmdW5jdGlvbkhlYWRlcgorICAgICAgICA6ICAgXihGVU5DX0hEUiB0eXBlIElEIGZvcm1hbFBhcmFtZXRlcispCisgICAgICAgIDsKKyAgICAKKyAgICBmb3JtYWxQYXJhbWV0ZXIKKyAgICAgICAgOiAgIF4oQVJHX0RFRiB0eXBlIGRlY2xhcmF0b3IpCisgICAgICAgIDsKKyAgICAKKyAgICB0eXBlCisgICAgICAgIDogICAnaW50JworICAgICAgICB8ICAgJ2NoYXInCisgICAgICAgIHwgICAndm9pZCcKKyAgICAgICAgfCAgIElEICAgICAgICAKKyAgICAgICAgOworICAgIAorICAgIGJsb2NrCisgICAgICAgIDogICBeKEJMT0NLIHZhcmlhYmxlKiBzdGF0KikKKyAgICAgICAgOworICAgIAorICAgIHN0YXQ6IGZvclN0YXQKKyAgICAgICAgfCBleHByCisgICAgICAgIHwgYmxvY2sKKyAgICAgICAgOworICAgIAorICAgIGZvclN0YXQKKyAgICAgICAgOiAgIF4oJ2ZvcicgZXhwciBleHByIGV4cHIgYmxvY2spCisgICAgICAgIDsKKyAgICAKKyAgICBleHByOiAgIF4oRVFFUSBleHByIGV4cHIpCisgICAgICAgIHwgICBeKExUIGV4cHIgZXhwcikKKyAgICAgICAgfCAgIF4oUExVUyBleHByIGV4cHIpCisgICAgICAgIHwgICBeKEVRIElEIGV4cHIpCisgICAgICAgIHwgICBhdG9tCisgICAgICAgIDsKKyAgICAKKyAgICBhdG9tCisgICAgICAgIDogSUQgICAgICAKKyAgICAgICAgfCBJTlQgICAgICAKKyAgICAgICAgOworICBFTkQKKyAgCisgIGNvbXBpbGVfb3B0aW9ucyA6dHJhY2UgPT4gdHJ1ZQorICAKKyAgZXhhbXBsZSAicHJvY2Vzc2luZyBBU1Qgb3V0cHV0IGZyb20gYSBwYXJzZXIgd2l0aCBhIHRyZWUgcGFyc2VyIiBkbworICAgIGlucHV0X3NvdXJjZSA9IDw8LUVORC5maXhlZF9pbmRlbnQoIDAgKQorICAgICAgY2hhciBjOworICAgICAgaW50IHg7CisgICAgICAKKyAgICAgIHZvaWQgYmFyKGludCB4KTsKKyAgICAgIAorICAgICAgaW50IGZvbyhpbnQgeSwgY2hhciBkKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGk9MDsgaTwzOyBpPWkrMSkgeworICAgICAgICAgIHg9MzsKKyAgICAgICAgICB5PTU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBFTkQKKyAgICAKKyAgICBsZXhlciA9IEdlbmVyaWNMYW5ndWFnZTo6TGV4ZXIubmV3KCBpbnB1dF9zb3VyY2UgKQorICAgIHBhcnNlciA9IEdlbmVyaWNMYW5ndWFnZTo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgIAorICAgIGV4cGVjdGVkX3RyZWUgPSA8PC1FTkQuc3RyaXAhLmdzdWIhKCAvXHMrLywgJyAnICkKKyAgICAgIChWQVJfREVGIGNoYXIgYykKKyAgICAgIChWQVJfREVGIGludCB4KQorICAgICAgKEZVTkNfREVDTCAoRlVOQ19IRFIgdm9pZCBiYXIgKEFSR19ERUYgaW50IHgpKSkKKyAgICAgIChGVU5DX0RFRgorICAgICAgICAoRlVOQ19IRFIgaW50IGZvbyAoQVJHX0RFRiBpbnQgeSkgKEFSR19ERUYgY2hhciBkKSkKKyAgICAgICAgKEJMT0NLCisgICAgICAgICAgKFZBUl9ERUYgaW50IGkpCisgICAgICAgICAgKGZvciAoPSBpIDApICg8IGkgMykgKD0gaSAoKyBpIDEpKQorICAgICAgICAgICAgKEJMT0NLICg9IHggMykgKD0geSA1KSkpKSkKKyAgICBFTkQKKyAgICAKKyAgICByZXN1bHQgPSBwYXJzZXIucHJvZ3JhbQorICAgIHJlc3VsdC50cmVlLmluc3BlY3Quc2hvdWxkID09IGV4cGVjdGVkX3RyZWUKKyAgICAKKyAgICBub2RlcyA9IEFOVExSMzo6QVNUOjpDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcoIHJlc3VsdC50cmVlICkKKyAgICBub2Rlcy50b2tlbl9zdHJlYW0gPSBwYXJzZXIuaW5wdXQKKyAgICB0cmVlX3BhcnNlciA9IEdlbmVyaWNMYW5ndWFnZVdhbGtlcjo6VHJlZVBhcnNlci5uZXcoIG5vZGVzICkKKyAgICAKKyAgICB0cmVlX3BhcnNlci5wcm9ncmFtCisgICAgdHJlZV9wYXJzZXIudHJhY2VzLnNob3VsZCA9PSAldygKKyAgICAgID5wcm9ncmFtICAgICAgICAgID5kZWNsYXJhdGlvbiAgICAgID52YXJpYWJsZSAgICAgICAgID50eXBlICAgICAgICAgICAKKyAgICAgIDx0eXBlICAgICAgICAgICAgID5kZWNsYXJhdG9yICAgICAgIDxkZWNsYXJhdG9yICAgICAgIDx2YXJpYWJsZSAgICAgICAKKyAgICAgIDxkZWNsYXJhdGlvbiAgICAgID5kZWNsYXJhdGlvbiAgICAgID52YXJpYWJsZSAgICAgICAgID50eXBlICAgICAgICAgICAKKyAgICAgIDx0eXBlICAgICAgICAgICAgID5kZWNsYXJhdG9yICAgICAgIDxkZWNsYXJhdG9yICAgICAgIDx2YXJpYWJsZSAgICAgICAKKyAgICAgIDxkZWNsYXJhdGlvbiAgICAgID5kZWNsYXJhdGlvbiAgICAgID5mdW5jdGlvbkhlYWRlciAgID50eXBlICAgICAgICAgICAKKyAgICAgIDx0eXBlICAgICAgICAgICAgID5mb3JtYWxQYXJhbWV0ZXIgID50eXBlICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAKKyAgICAgID5kZWNsYXJhdG9yICAgICAgIDxkZWNsYXJhdG9yICAgICAgIDxmb3JtYWxQYXJhbWV0ZXIgIDxmdW5jdGlvbkhlYWRlciAKKyAgICAgIDxkZWNsYXJhdGlvbiAgICAgID5kZWNsYXJhdGlvbiAgICAgID5mdW5jdGlvbkhlYWRlciAgID50eXBlICAgICAgICAgICAKKyAgICAgIDx0eXBlICAgICAgICAgICAgID5mb3JtYWxQYXJhbWV0ZXIgID50eXBlICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAKKyAgICAgID5kZWNsYXJhdG9yICAgICAgIDxkZWNsYXJhdG9yICAgICAgIDxmb3JtYWxQYXJhbWV0ZXIgID5mb3JtYWxQYXJhbWV0ZXIKKyAgICAgID50eXBlICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgID5kZWNsYXJhdG9yICAgICAgIDxkZWNsYXJhdG9yICAgICAKKyAgICAgIDxmb3JtYWxQYXJhbWV0ZXIgIDxmdW5jdGlvbkhlYWRlciAgID5ibG9jayAgICAgICAgICAgID52YXJpYWJsZSAgICAgICAKKyAgICAgID50eXBlICAgICAgICAgICAgIDx0eXBlICAgICAgICAgICAgID5kZWNsYXJhdG9yICAgICAgIDxkZWNsYXJhdG9yICAgICAKKyAgICAgIDx2YXJpYWJsZSAgICAgICAgID5zdGF0ICAgICAgICAgICAgID5mb3JTdGF0ICAgICAgICAgID5leHByICAgICAgICAgICAKKyAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAgIDxhdG9tICAgICAgICAgICAgIDxleHByICAgICAgICAgICAKKyAgICAgIDxleHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAKKyAgICAgIDxhdG9tICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAKKyAgICAgIDxhdG9tICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAKKyAgICAgID5leHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAgIDxhdG9tICAgICAgICAgICAKKyAgICAgIDxleHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAgIDxhdG9tICAgICAgICAgICAKKyAgICAgIDxleHByICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgID5ibG9jayAgICAgICAgICAKKyAgICAgID5zdGF0ICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAKKyAgICAgIDxhdG9tICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgIDxzdGF0ICAgICAgICAgICAKKyAgICAgID5zdGF0ICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5leHByICAgICAgICAgICAgID5hdG9tICAgICAgICAgICAKKyAgICAgIDxhdG9tICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgIDxleHByICAgICAgICAgICAgIDxzdGF0ICAgICAgICAgICAKKyAgICAgIDxibG9jayAgICAgICAgICAgIDxmb3JTdGF0ICAgICAgICAgIDxzdGF0ICAgICAgICAgICAgIDxibG9jayAgICAgICAgICAKKyAgICAgIDxkZWNsYXJhdGlvbiAgICAgIDxwcm9ncmFtICAgICAgICAKKyAgICApCisgIGVuZAorICAKKyAgZXhhbXBsZSAndHJlZSBwYXJzZXIgcnVsZSBsYWJlbCBwcm9wZXJ0eSByZWZlcmVuY2VzJyBkbworICAgIGlucHV0ID0gImNoYXIgYztcbiIKKyAgICBsZXhlciAgPSBHZW5lcmljTGFuZ3VhZ2U6OkxleGVyLm5ldyggImNoYXIgYztcbiIgKQorICAgIHBhcnNlciA9IEdlbmVyaWNMYW5ndWFnZTo6UGFyc2VyLm5ldyggbGV4ZXIgKQorICAgIAorICAgIHJlc3VsdCA9IHBhcnNlci52YXJpYWJsZQorICAgIG5vZGVzID0gQU5UTFIzOjpBU1Q6OkNvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcmVzdWx0LnRyZWUgKQorICAgIG5vZGVzLnRva2VuX3N0cmVhbSA9IHBhcnNlci5pbnB1dAorICAgIAorICAgIHRyZWVfcGFyc2VyID0gR2VuZXJpY0xhbmd1YWdlV2Fsa2VyOjpUcmVlUGFyc2VyLm5ldyggbm9kZXMgKQorICAgIHRyZWVfcGFyc2VyLnZhcmlhYmxlLnNob3VsZCA9PSAnYycKKyAgZW5kCisgIAorZW5kCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC9zYW1wbGUtaW5wdXQvZmlsZS1zdHJlYW0tMSBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3NhbXBsZS1pbnB1dC9maWxlLXN0cmVhbS0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDdlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC9zYW1wbGUtaW5wdXQvZmlsZS1zdHJlYW0tMQpAQCAtMCwwICsxLDIgQEAKK2ZvbworYmFyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvc2FtcGxlLWlucHV0L3RlbXBsYXRlLWdyb3VwIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvc2FtcGxlLWlucHV0L3RlbXBsYXRlLWdyb3VwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC9zYW1wbGUtaW5wdXQvdGVtcGxhdGUtZ3JvdXAKQEAgLTAsMCArMSwzOCBAQAorZ3JvdXAgU2FtcGxlCisKK2NsYXNzX2RlZmluaXRpb24gOjo9Cis8PDwKK2NsYXNzIDwlPSBAbmFtZSAlPjwlIGlmIEBzdXBlcmNsYXNzICU+IDwgPCU9IEBzdXBlcmNsYXNzICU+PCUgZW5kICU+CislIGlmIEBhdHRyaWJ1dGVzCisKKyUgZm9yIGF0dHIgaW4gQGF0dHJpYnV0ZXMgCis8JT0gYXR0cmlidXRlKCAqYXR0ciApLnRvX3MuY2hvbXAgJT4KKyUgZW5kCislIGVuZAorJSBpZiBAbWV0aG9kcworJSBmb3IgbWV0aG9kIGluICggQG1ldGhvZHMgfHwgW10gKQorPCU9IG1ldGhvZCggbWV0aG9kICkgJT4KKyUgZW5kCislIGVuZAorZW5kCis+Pj4KKworYXR0cmlidXRlKCBuYW1lLCBhY2Nlc3MgPSAncncnICkgOjo9Cis8PDwKKyUgY2FzZSBAYWNjZXNzLnRvX3MuZG93bmNhc2UKKyUgd2hlbiAncicKKyAgYXR0cl9yZWFkZXIgOjwlPSBAbmFtZSAlPgorJSB3aGVuICd3JworICBhdHRyX3dyaXRlciA6PCU9IEBuYW1lICU+CislIGVsc2UKKyAgYXR0cl9hY2Nlc3NvciA6PCU9IEBuYW1lICU+CislIGVuZAorPj4+CisKK21ldGhvZCA6Oj0KKzw8PAorICAKKyAgZGVmIDwlPSBAbmFtZSAlPjwlIGlmIEBhcmd1bWVudHMgYW5kIG5vdCBAYXJndW1lbnRzLmVtcHR5PyAlPiggPCU9IEBhcmd1bWVudHMuam9pbiggJywgJyApICU+ICk8JSBlbmQgJT4KKzwlPSBAYm9keS5nc3ViKCAvXi8sICcgICAgJyApICU+CisgIGVuZAorPj4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC9zYW1wbGUtaW5wdXQvdGVzdHN0cmVhbXMuaW5wdXQyIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvc2FtcGxlLWlucHV0L3Rlc3RzdHJlYW1zLmlucHV0MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWRjY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvc2FtcGxlLWlucHV0L3Rlc3RzdHJlYW1zLmlucHV0MgpAQCAtMCwwICsxLDIgQEAKK2ZvbworYsOkcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3QtZGZhLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1kZmEucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzNTMwNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3QtZGZhLnJiCkBAIC0wLDAgKzEsNTIgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzJworcmVxdWlyZSAndGVzdC91bml0JworcmVxdWlyZSAnc3BlYycKKworY2xhc3MgREZBU3ViY2xhc3MgPCBBTlRMUjM6OkRGQQorICBFT1QgPSBbMSwgMl0uZnJlZXplCisgIEVPRiA9IFszLCA0XS5mcmVlemUKKyAgTUFYID0gWzUsIDZdLmZyZWV6ZQorICBNSU4gPSBbNywgOF0uZnJlZXplCisgIEFDQ0VQVCA9IFs5LCAxMCwgMTFdLmZyZWV6ZQorICBTUEVDSUFMID0gWzEyXS5mcmVlemUKKyAgVFJBTlNJVElPTiA9IFsKKyAgICBbMTMsIDE0LCAxNSwgMTZdLmZyZWV6ZSwKKyAgICBbXS5mcmVlemUKKyAgXS5mcmVlemUKK2VuZAorCitjbGFzcyBUZXN0REZBIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgZGVmIHRlc3RfaW5pdAorICAgIGRmYSA9IERGQVN1YmNsYXNzLm5ldyhuaWwsIDEpCisgICAgZGZhLmVvdC5zaG91bGQgPT0gREZBU3ViY2xhc3M6OkVPVAorICAgIGRmYS5lb2Yuc2hvdWxkID09IERGQVN1YmNsYXNzOjpFT0YKKyAgICBkZmEubWF4LnNob3VsZCA9PSBERkFTdWJjbGFzczo6TUFYCisgICAgZGZhLm1pbi5zaG91bGQgPT0gREZBU3ViY2xhc3M6Ok1JTgorICAgIGRmYS5hY2NlcHQuc2hvdWxkID09IERGQVN1YmNsYXNzOjpBQ0NFUFQKKyAgICBkZmEuc3BlY2lhbC5zaG91bGQgPT0gREZBU3ViY2xhc3M6OlNQRUNJQUwKKyAgICBkZmEudHJhbnNpdGlvbi5zaG91bGQgPT0gREZBU3ViY2xhc3M6OlRSQU5TSVRJT04KKyAgZW5kCisgIAorICBkZWYgdGVzdF91bnBhY2sKKyAgICBwYWNrZWQgPSBbCisgICAgICAxLCAzLCAxLCA0LCAyLCAtMSwgMSwgNSwgMTgsIC0xLCAxLCAyLAorICAgICAgMjUsIC0xLCAxLCA2LCA2LCAtMSwgMjYsIDYsIDQsIC0xLCAxLCA2LAorICAgICAgMSwgLTEsIDI2LCA2CisgICAgXQorICAgIHVucGFja2VkID0gWworICAgICAgMywgNCwgLTEsIC0xLCA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgIDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgICAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCAtMSwgLTEsIC0xLCAtMSwgNiwgLTEsCisgICAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICAgICAgNiwgNiwgNiwgNiwgNgorICAgIF0KKyAgICAKKyAgICBBTlRMUjM6OkRGQS51bnBhY2soKnBhY2tlZCkuc2hvdWxkID09IHVucGFja2VkCisgIGVuZAorICAKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1leGNlcHRpb25zLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1leGNlcHRpb25zLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzdmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LWV4Y2VwdGlvbnMucmIKQEAgLTAsMCArMSw1NiBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMnCityZXF1aXJlICd0ZXN0L3VuaXQnCityZXF1aXJlICdzcGVjJworCitpbmNsdWRlIEFOVExSMzo6RXJyb3IKKworZGVzY3JpYmUoIEFOVExSMzo6RXJyb3IgKSBkbworICAKKyAgZXhhbXBsZSAicmFpc2luZyBhbiBBTlRMUiBidWcgZXhjZXB0aW9uIiBkbworICAgIHByb2MgeworICAgICAgQU5UTFIzLmJ1ZyEoICd3aGF0ZXZhJyApCisgICAgfS5zaG91bGQgcmFpc2VfZXJyb3IoIEFOVExSMzo6QnVnICkKKyAgZW5kCisgIAorICAKK2VuZAorCisjCisjY2xhc3MgVGVzdFJlY29nbml0aW9uRXJyb3IgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorIyAgZGVmIHRlc3RfaW5pdF9ub25lCisjICAgIFJlY29nbml0aW9uRXJyb3IubmV3KCkKKyMgIGVuZAorI2VuZAorIworI2NsYXNzIFRlc3RFYXJseUV4aXQgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorIyAgZGVmIHRlc3RfaW5pdF9ub25lCisjICAgIEVhcmx5RXhpdC5uZXcKKyMgIGVuZAorI2VuZAorIworI2NsYXNzIFRlc3RNaXNtYXRjaGVkTm90U2V0ICA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisjICBkZWYgdGVzdF9pbml0X25vbmUKKyMgICAgTWlzbWF0Y2hlZE5vdFNldC5uZXcKKyMgIGVuZAorI2VuZAorIworI2NsYXNzIFRlc3RNaXNtYXRjaGVkUmFuZ2UgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorIyAgZGVmIHRlc3RfaW5pdF9ub25lCisjICAgIE1pc21hdGNoZWRTZXQubmV3CisjICBlbmQKKyNlbmQKKyMKKyNjbGFzcyBUZXN0TWlzbWF0Y2hlZFRva2VuIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyMgIGRlZiB0ZXN0X2luaXRfbm9uZQorIyAgICBNaXNtYXRjaGVkVG9rZW4ubmV3CisjICBlbmQKKyNlbmQKKyMKKyNjbGFzcyBUZXN0Tm9WaWFibGVBbHRlcm5hdGl2ZSA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisjICBkZWYgdGVzdF9pbml0X25vbmUKKyMgICAgTm9WaWFibGVBbHRlcm5hdGl2ZS5uZXcKKyMgIGVuZAorI2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1yZWNvZ25pemVycy5yYiBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3QtcmVjb2duaXplcnMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5NTBjNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3QtcmVjb2duaXplcnMucmIKQEAgLTAsMCArMSw1NSBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMnCityZXF1aXJlICd0ZXN0L3VuaXQnCityZXF1aXJlICdzcGVjJworCitpbmNsdWRlIEFOVExSMworCitjbGFzcyBUZXN0VG9rZW5Tb3VyY2UgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBUcml2aWFsVG9rZW4gPSBTdHJ1Y3QubmV3KDp0eXBlKSBkbworICAgIGluY2x1ZGUgVG9rZW4KKyAgZW5kCisgIGNsYXNzIFRlc3RTb3VyY2UKKyAgICBpbmNsdWRlIFRva2VuU291cmNlCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEB0b2tlbnMgPSAoMS4uNCkubWFwIHsgfGl8IFRyaXZpYWxUb2tlbltpXSB9CisgICAgICBAdG9rZW5zIDw8IFRyaXZpYWxUb2tlbltFT0ZdCisgICAgZW5kCisgICAgCisgICAgZGVmIG5leHRfdG9rZW4KKyAgICAgIEB0b2tlbnMuc2hpZnQKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgdGVzdF9pdGVyYXRvcl9pbnRlcmZhY2UKKyAgICBzcmMgPSBUZXN0U291cmNlLm5ldworICAgIHRva2VucyA9IFtdCisgICAgc3JjLmVhY2ggZG8gfHRva2VufAorICAgICAgdG9rZW5zIDw8IHRva2VuLnR5cGUKKyAgICBlbmQKKyAgICB0b2tlbnMuc2hvdWxkID09IFsxLDIsMyw0XQorICBlbmQKKyAgCitlbmQKKworY2xhc3MgVGVzdExleGVyIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgY2xhc3MgVExleGVyIDwgTGV4ZXIKKyAgICBAYW50bHJfdmVyc2lvbiA9IEFOVExSMzo6QU5UTFJfVkVSU0lPTi5kdXAKKyAgZW5kCisgIGRlZiB0ZXN0X2luaXQKKyAgICBzdHJlYW0gPSBTdHJpbmdTdHJlYW0ubmV3KCdmb28nKQorICAgIFRMZXhlci5uZXcoc3RyZWFtKQorICBlbmQKK2VuZAorCitfX0VORF9fCit0ZXN0cmVjb2duaXplcnMucHkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExOIHwgU1RBVFVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0tLS0tLQorY2xhc3MgVGVzdEJhc2VSZWNvZ25pemVyKHVuaXR0ZXN0LlRlc3RDYXNlKSAgfCAwNyB8IFt4XQorICAgIGRlZiB0ZXN0R2V0UnVsZUludm9jYXRpb25TdGFjayhzZWxmKSAgICAgfCAxMCB8IFt4XQorY2xhc3MgVGVzdFRva2VuU291cmNlKHVuaXR0ZXN0LlRlc3RDYXNlKSAgICAgfCAyMCB8IFt4XQorICAgIGRlZiB0ZXN0SXRlcmF0b3JJbnRlcmZhY2Uoc2VsZikgICAgICAgICAgfCAyNCB8IFt4XQorY2xhc3MgVGVzdExleGVyKHVuaXR0ZXN0LlRlc3RDYXNlKSAgICAgICAgICAgfCA1NCB8IFt4XQorICAgIGRlZiB0ZXN0SW5pdChzZWxmKSAgICAgICAgICAgICAgICAgICAgICAgfCA1NiB8IFt4XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3Qtc2NoZW1lLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1zY2hlbWUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ODE3YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3Qtc2NoZW1lLnJiCkBAIC0wLDAgKzEsNjIgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKK3JlcXVpcmUgJ2FudGxyMycKK3JlcXVpcmUgJ3Rlc3QvdW5pdCcKK3JlcXVpcmUgJ3NwZWMnCisKK2luY2x1ZGUgQU5UTFIzCisKK2Rlc2NyaWJlIFRva2VuU2NoZW1lIGRvCisgIGJlZm9yZSBkbworICAgIEB0cyA9IFRva2VuU2NoZW1lLm5ldyBkbworICAgICAgZGVmaW5lX3Rva2Vucyg6QSA9PiA0LCA6QiA9PiA1LCA6VF9fNiA9PiA2KQorICAgICAgcmVnaXN0ZXJfbmFtZXMoJ0EnLCAnQicsICInKyciKQorICAgIGVuZAorICAgIEBhX2NsYXNzID0gQ2xhc3MubmV3IGRvCisgICAgICBjbGFzcyA8PCBzZWxmCisgICAgICAgIGF0dHJfYWNjZXNzb3IgOnRva2VuX3NjaGVtZQorICAgICAgZW5kCisgICAgZW5kCisgICAgQGFfY2xhc3Muc2VuZCg6aW5jbHVkZSwgQHRzKQorICAgIAorICAgIEBhbl9pbnN0YW5jZSA9IEBhX2NsYXNzLm5ldworICBlbmQKKyAgCisgIGV4YW1wbGUgInRva2VuIHNjaGVtZXMgZGVmaW5lIHRva2VucyBhcyBjb25zdGFudHMiIGRvCisgICAgQHRzOjpBLnNob3VsZCA9PSA0CisgICAgQHRzOjpCLnNob3VsZCA9PSA1CisgICAgQHRzOjpUX182LnNob3VsZCA9PSA2CisgICAgQHRzOjpFT0Yuc2hvdWxkID09IC0xCisgIGVuZAorICAKKyAgZXhhbXBsZSAidG9rZW4gc2NoZW1lcyB0cmFjayBodW1hbi1mcmllbmRseSB0b2tlbiBuYW1lcyIgZG8KKyAgICBAdHM6OlRPS0VOX05BTUVTLnNob3VsZCA9PSB7CisgICAgICAwID0+ICI8aW52YWxpZD4iLCAtMSA9PiAiPEVPRj4iLCAxID0+ICI8RU9SPiIsCisgICAgICAyID0+ICI8RE9XTj4iLCAzID0+ICI8VVA+IiwgNCA9PiAiQSIsCisgICAgICA1ID0+ICJCIiwgNiA9PiAiJysnIgorICAgIH0KKyAgICBAdHMudG9rZW5fbmFtZSg1KS5zaG91bGQgPT0gJ0InCisgICAgQHRzLnRva2VuX25hbWUoNikuc2hvdWxkID09ICInKyciCisgICAgQHRzLnRva2VuX25hbWUoLTEpLnNob3VsZCA9PSAnPEVPRj4nCisgICAgQHRzLnRva2VuX25hbWUoNykuc2hvdWxkID09ICc8VU5LTk9XTjogNz4nCisgIGVuZAorICAKKyAgCisgIGV4YW1wbGUgJ2NsYXNzLWxldmVsIHJlc3VsdHMgb2YgaW5jbHVkaW5nIGEgdG9rZW4gc2NoZW1lJyBkbworICAgICNAYV9jbGFzcy50b2tlbl9zY2hlbWUuc2hvdWxkID09IEB0cworICAgIAorICAgIEBhX2NsYXNzOjpBLnNob3VsZCA9PSA0CisgICAgQGFfY2xhc3M6OkIuc2hvdWxkID09IDUKKyAgICBAYV9jbGFzczo6VF9fNi5zaG91bGQgPT0gNgorICAgIEBhX2NsYXNzOjpFT0Yuc2hvdWxkID09IC0xCisgICAgCisgICAgQGFfY2xhc3Muc2VuZCg6dG9rZW5fbmFtZXMpLnNob3VsZCA9PSB7CisgICAgICAwID0+ICI8aW52YWxpZD4iLCAtMSA9PiAiPEVPRj4iLCAxID0+ICI8RU9SPiIsCisgICAgICAyID0+ICI8RE9XTj4iLCAzID0+ICI8VVA+IiwgNCA9PiAiQSIsCisgICAgICA1ID0+ICJCIiwgNiA9PiAiJysnIgorICAgIH0KKyAgZW5kCisgIAorICBleGFtcGxlICdpbnN0YW5jZS1sZXZlbCByZXN1bHRzIG9mIGluY2x1ZGluZyBhIHRva2VuIHNjaGVtZScgZG8KKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3Qtc2NvcGUucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXNjb3BlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTBiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXNjb3BlLnJiCkBAIC0wLDAgKzEsNDUgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzJworcmVxdWlyZSAndGVzdC91bml0JworcmVxdWlyZSAnc3BlYycKKworY2xhc3MgVGVzdERGQSA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIGRlZiBzZXR1cAorICAgIEBBID0gQU5UTFIzOjpTY29wZS5uZXcoIDphLCA6YiApCisgICAgQEIgPSBBTlRMUjM6OlNjb3BlLm5ldyggJ2NvdW50ID0gMycgKQorICAgIEBDID0gQU5UTFIzOjpTY29wZS5uZXcoICdhJywgJ2IgPSAwJywgJ2MgPSB7fScgKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X21lbWJlcnMKKyAgICBAQS5tZW1iZXJzLm1hcCggJjp0b19zICkuc2hvdWxkID09ICV3KCBhIGIgKQorICAgIEBCLm1lbWJlcnMubWFwKCAmOnRvX3MgKS5zaG91bGQgPT0gJXcoIGNvdW50ICkKKyAgICBAQy5tZW1iZXJzLm1hcCggJjp0b19zICkuc2hvdWxkID09ICV3KCBhIGIgYyApCisgIGVuZAorICAKKyAgZGVmIHRlc3RfZGVmYXVsdHNfd2l0aG91dF9hcmd1bWVudHMKKyAgICBAQS5uZXcudG9fYS5zaG91bGQgPT0gWyBuaWwsIG5pbCBdCisgICAgQEIubmV3LnRvX2Euc2hvdWxkID09IFsgMyBdCisgICAgQEMubmV3LnRvX2Euc2hvdWxkID09IFsgbmlsLCAwLCB7fSBdCisgIGVuZAorICAKKyAgZGVmIHRlc3RfQ19kZWZhdWx0c193aXRoX2FyZ3VtZW50cworICAgIGMgPSBAQy5uZXcoIE9iamVjdCApCisgICAgYy5hLnNob3VsZCA9PSBPYmplY3QKKyAgICBjLmIuc2hvdWxkID09IDAKKyAgICBjLmMuc2hvdWxkID09IHt9CisgIGVuZAorICAKKyAgZGVmIHRlc3RfQl9kZWZhdWx0c193aXRoX2FyZ3VtZW50cworICAgIGIgPSBAQi5uZXcoIDcwMDAgKQorICAgIGIuY291bnQuc2hvdWxkID09IDcwMDAKKyAgZW5kCisgIAorICBkZWYgdGVzdF9BX2RlZmF1bHRzX3dpdGhfYXJndW1lbnRzCisgICAgYSA9IEBBLm5ldyggImFwcGxlIiwgOm9yYW5nZSApCisgICAgYS5hLnNob3VsZCA9PSAnYXBwbGUnCisgICAgYS5iLnNob3VsZCA9PSA6b3JhbmdlCisgIGVuZAorICAKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1zdHJlYW1zLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC1zdHJlYW1zLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDMwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXN0cmVhbXMucmIKQEAgLTAsMCArMSw0NjAgQEAKKyMhL3Vzci9iaW4vcnVieQorIyBlbmNvZGluZzogdXRmLTgKKworcmVxdWlyZSAnYW50bHIzJworcmVxdWlyZSAndGVzdC91bml0JworcmVxdWlyZSAnc3BlYycKKworCitpbmNsdWRlIEFOVExSMworCitjbGFzcyBUZXN0U3RyaW5nU3RyZWFtIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgZGVmIHNldHVwCisgICAgQHN0cmVhbSA9IFN0cmluZ1N0cmVhbS5uZXcoICJvaFxuaGV5IVxuIiApCisgIGVuZAorICAKKyAgZGVmIHRlc3Rfc2l6ZQorICAgIEBzdHJlYW0uc2l6ZS5zaG91bGQgPT0gOAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2luZGV4CisgICAgQHN0cmVhbS5pbmRleC5zaG91bGQgPT0gMAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2NvbnN1bWUKKyAgICBAc3RyZWFtLmNvbnN1bWUgIyBvCisgICAgQHN0cmVhbS5pbmRleC5zaG91bGQgPT0gMQorICAgIEBzdHJlYW0uY29sdW1uLnNob3VsZCA9PSAxCisgICAgQHN0cmVhbS5saW5lLnNob3VsZCA9PSAxCisgICAgCisgICAgQHN0cmVhbS5jb25zdW1lICAjIGgKKyAgICBAc3RyZWFtLmluZGV4LnNob3VsZCA9PSAyCisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDIKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDEKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUgIyBcbgorICAgIEBzdHJlYW0uaW5kZXguc2hvdWxkID09IDMKKyAgICBAc3RyZWFtLmNvbHVtbi5zaG91bGQgPT0gMAorICAgIEBzdHJlYW0ubGluZS5zaG91bGQgPT0gMgorICAgIAorICAgIEBzdHJlYW0uY29uc3VtZSAjICBoCisgICAgQHN0cmVhbS5pbmRleC5zaG91bGQgPT0gNAorICAgIEBzdHJlYW0uY29sdW1uLnNob3VsZCA9PSAxCisgICAgQHN0cmVhbS5saW5lLnNob3VsZCA9PSAyCisgICAgCisgICAgQHN0cmVhbS5jb25zdW1lICMgZQorICAgIEBzdHJlYW0uaW5kZXguc2hvdWxkID09IDUKKyAgICBAc3RyZWFtLmNvbHVtbi5zaG91bGQgPT0gMgorICAgIEBzdHJlYW0ubGluZS5zaG91bGQgPT0gMgorICAgIAorICAgIEBzdHJlYW0uY29uc3VtZSAjIHkKKyAgICBAc3RyZWFtLmluZGV4LnNob3VsZCA9PSA2CisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDMKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDIKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUgIyAhCisgICAgQHN0cmVhbS5pbmRleC5zaG91bGQgPT0gNworICAgIEBzdHJlYW0uY29sdW1uLnNob3VsZCA9PSA0CisgICAgQHN0cmVhbS5saW5lLnNob3VsZCA9PSAyCisgICAgCisgICAgQHN0cmVhbS5jb25zdW1lICMgXG4KKyAgICBAc3RyZWFtLmluZGV4LnNob3VsZCA9PSA4CisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDAKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDMKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUgIyBFT0YKKyAgICBAc3RyZWFtLmluZGV4LnNob3VsZCA9PSA4CisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDAKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDMKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUgIyBFT0YKKyAgICBAc3RyZWFtLmluZGV4LnNob3VsZCA9PSA4CisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDAKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDMKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXNldAorICAgIDIudGltZXMgeyBAc3RyZWFtLmNvbnN1bWUgfQorICAgIEBzdHJlYW0ucmVzZXQKKyAgICBAc3RyZWFtLmluZGV4LnNob3VsZCA9PSAwCisgICAgQHN0cmVhbS5saW5lLnNob3VsZCA9PSAxCisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDAKKyAgICBAc3RyZWFtLnBlZWsoMSkuc2hvdWxkID09ID9vLm9yZAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2xvb2sKKyAgICBAc3RyZWFtLmxvb2soMSkuc2hvdWxkID09ICdvJworICAgIEBzdHJlYW0ubG9vaygyKS5zaG91bGQgPT0gJ2gnCisgICAgQHN0cmVhbS5sb29rKDMpLnNob3VsZCA9PSAiXG4iCisgICAgQHN0cmVhbS5wZWVrKDEpLnNob3VsZCA9PSA/by5vcmQKKyAgICBAc3RyZWFtLnBlZWsoMikuc2hvdWxkID09ID9oLm9yZAorICAgIEBzdHJlYW0ucGVlaygzKS5zaG91bGQgPT0gP1xuLm9yZAorICAgIAorICAgIDYudGltZXMgeyBAc3RyZWFtLmNvbnN1bWUgfQorICAgIEBzdHJlYW0ubG9vaygxKS5zaG91bGQgPT0gJyEnCisgICAgQHN0cmVhbS5sb29rKDIpLnNob3VsZCA9PSAiXG4iCisgICAgQHN0cmVhbS5sb29rKDMpLnNob3VsZCBiZV9uaWwKKyAgICBAc3RyZWFtLnBlZWsoMSkuc2hvdWxkID09ID8hLm9yZAorICAgIEBzdHJlYW0ucGVlaygyKS5zaG91bGQgPT0gP1xuLm9yZAorICAgIEBzdHJlYW0ucGVlaygzKS5zaG91bGQgPT0gRU9GCisgIGVuZAorICAKKyAgZGVmIHRlc3Rfc3Vic3RyaW5nCisgICAgQHN0cmVhbS5zdWJzdHJpbmcoMCwwKS5zaG91bGQgPT0gJ28nCisgICAgQHN0cmVhbS5zdWJzdHJpbmcoMCwxKS5zaG91bGQgPT0gJ29oJworICAgIEBzdHJlYW0uc3Vic3RyaW5nKDAsOCkuc2hvdWxkID09ICJvaFxuaGV5IVxuIgorICAgIEBzdHJlYW0uc3Vic3RyaW5nKDMsNikuc2hvdWxkID09ICJoZXkhIgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3NlZWtfZm9yd2FyZAorICAgIEBzdHJlYW0uc2VlaygzKQorICAgIEBzdHJlYW0uaW5kZXguc2hvdWxkID09IDMKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDIKKyAgICBAc3RyZWFtLmNvbHVtbi5zaG91bGQgPT0gMAorICAgIEBzdHJlYW0ucGVlaygxKS5zaG91bGQgPT0gP2gub3JkCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbWFyaworICAgIEBzdHJlYW0uc2Vlayg0KQorICAgIG1hcmtlciA9IEBzdHJlYW0ubWFyaworICAgIG1hcmtlci5zaG91bGQgPT0gMQorICAgIAorICAgIDIudGltZXMgeyBAc3RyZWFtLmNvbnN1bWUgfQorICAgIG1hcmtlciA9IEBzdHJlYW0ubWFyaworICAgIAorICAgIG1hcmtlci5zaG91bGQgPT0gMgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3JlbGVhc2VfbGFzdAorICAgIEBzdHJlYW0uc2Vlayg0KQorICAgIG1hcmtlcjEgPSBAc3RyZWFtLm1hcmsKKyAgICAKKyAgICAyLnRpbWVzIHsgQHN0cmVhbS5jb25zdW1lIH0KKyAgICBtYXJrZXIyID0gQHN0cmVhbS5tYXJrCisgICAgCisgICAgQHN0cmVhbS5yZWxlYXNlCisgICAgQHN0cmVhbS5tYXJrX2RlcHRoLnNob3VsZCA9PSAyCisgICAgQHN0cmVhbS5yZWxlYXNlCisgICAgQHN0cmVhbS5tYXJrX2RlcHRoLnNob3VsZCA9PSAxCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcmVsZWFzZV9uZXN0ZWQKKyAgICBAc3RyZWFtLnNlZWsoNCkKKyAgICBtYXJrZXIxID0gQHN0cmVhbS5tYXJrKCkKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUoKQorICAgIG1hcmtlcjIgPSBAc3RyZWFtLm1hcmsoKQorICAgIAorICAgIEBzdHJlYW0uY29uc3VtZSgpCisgICAgbWFya2VyMyA9IEBzdHJlYW0ubWFyaygpCisgICAgCisgICAgQHN0cmVhbS5yZWxlYXNlKG1hcmtlcjIpCisgICAgQHN0cmVhbS5tYXJrX2RlcHRoLnNob3VsZCA9PSAyCisKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXdpbmRfbGFzdAorICAgIEBzdHJlYW0uc2Vlayg0KQorCisgICAgbWFya2VyID0gQHN0cmVhbS5tYXJrCisgICAgQHN0cmVhbS5jb25zdW1lCisgICAgQHN0cmVhbS5jb25zdW1lCisKKyAgICBAc3RyZWFtLnJld2luZAorICAgIEBzdHJlYW0ubWFya19kZXB0aC5zaG91bGQgPT0gMQorICAgIEBzdHJlYW0uaW5kZXguc2hvdWxkID09IDQKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDIKKyAgICBAc3RyZWFtLmNvbHVtbi5zaG91bGQgPT0gMQorICAgIEBzdHJlYW0ucGVlaygxKS5zaG91bGQgPT0gP2Uub3JkCisgICAgCisgIGVuZAorCisgIGRlZiB0ZXN0X3Rocm91Z2gKKyAgICBAc3RyZWFtLnRocm91Z2goIDIgKS5zaG91bGQgPT0gJ29oJworICAgIEBzdHJlYW0udGhyb3VnaCggLTIgKS5zaG91bGQgPT0gJycKKyAgICBAc3RyZWFtLnNlZWsoIDUgKQorICAgIEBzdHJlYW0udGhyb3VnaCggMCApLnNob3VsZCA9PSAnJworICAgIEBzdHJlYW0udGhyb3VnaCggMSApLnNob3VsZCA9PSAneScKKyAgICBAc3RyZWFtLnRocm91Z2goIC0yICkuc2hvdWxkID09ICdoZScKKyAgICBAc3RyZWFtLnRocm91Z2goIDUgKS5zaG91bGQgPT0gInkhXG4iCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcmV3aW5kX25lc3RlZAorICAgIEBzdHJlYW0uc2Vlayg0KQorICAgIG1hcmtlcjEgPSBAc3RyZWFtLm1hcmsoKQorICAgIAorICAgIEBzdHJlYW0uY29uc3VtZQorICAgIG1hcmtlcjIgPSBAc3RyZWFtLm1hcmsKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUKKyAgICBtYXJrZXIzID0gQHN0cmVhbS5tYXJrCisgICAgCisgICAgQHN0cmVhbS5yZXdpbmQobWFya2VyMikKKyAgICBAc3RyZWFtLm1hcmtfZGVwdGguc2hvdWxkID09IDIKKyAgICBAc3RyZWFtLmluZGV4KCkuc2hvdWxkID09IDUKKyAgICBAc3RyZWFtLmxpbmUuc2hvdWxkID09IDIKKyAgICBAc3RyZWFtLmNvbHVtbi5zaG91bGQgPT0gMgorICAgIEBzdHJlYW0ucGVlaygxKS5zaG91bGQgPT0gP3kub3JkICAgIAorICBlbmQKK2VuZAorCitjbGFzcyBUZXN0RmlsZVN0cmVhbSA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIAorICAKKyAgZGVmIHRlc3Rfbm9fZW5jb2RpbmcKKyAgICAKKyAgICBwYXRoID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICdzYW1wbGUtaW5wdXQvZmlsZS1zdHJlYW0tMScpCisgICAgQHN0cmVhbSA9IEZpbGVTdHJlYW0ubmV3KHBhdGgpCisgICAgCisgICAgQHN0cmVhbS5zZWVrKDQpCisgICAgbWFya2VyMSA9IEBzdHJlYW0ubWFyaygpCisgICAgCisgICAgQHN0cmVhbS5jb25zdW1lKCkKKyAgICBtYXJrZXIyID0gQHN0cmVhbS5tYXJrKCkKKyAgICAKKyAgICBAc3RyZWFtLmNvbnN1bWUoKQorICAgIG1hcmtlcjMgPSBAc3RyZWFtLm1hcmsoKQorICAgIAorICAgIEBzdHJlYW0ucmV3aW5kKG1hcmtlcjIpCisgICAgQHN0cmVhbS5pbmRleCgpLnNob3VsZCA9PSA1CisgICAgQHN0cmVhbS5saW5lLnNob3VsZCA9PSAyCisgICAgQHN0cmVhbS5jb2x1bW4uc2hvdWxkID09IDEKKyAgICBAc3RyZWFtLm1hcmtfZGVwdGguc2hvdWxkID09IDIKKyAgICBAc3RyZWFtLmxvb2soMSkuc2hvdWxkID09ICdhJworICAgIEBzdHJlYW0ucGVlaygxKS5zaG91bGQgPT0gP2Eub3JkCisgIGVuZAorICAKKyAgZGVmIHRlc3RfZW5jb2RlZAorICAgIAorICBlbmQKK2VuZAorCitjbGFzcyBUZXN0SW5wdXRTdHJlYW0gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBkZWYgdGVzdF9ub19lbmNvZGluZworICAgIAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2VuY29kZWQKKyAgICAKKyAgZW5kCitlbmQKKworY2xhc3MgVGVzdENvbW1vblRva2VuU3RyZWFtIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgY2xhc3MgTW9ja1NvdXJjZQorICAgIGluY2x1ZGUgQU5UTFIzOjpUb2tlblNvdXJjZQorICAgIGF0dHJfYWNjZXNzb3IgOnRva2VucworICAgIGRlZiBpbml0aWFsaXplCisgICAgICBAdG9rZW5zID0gW10KKyAgICBlbmQKKyAgICBkZWYgbmV4dF90b2tlbgorICAgICAgQHRva2Vucy5zaGlmdAorICAgIGVuZAorICBlbmQKKyAgCisgICMgdnZ2dnZ2dnYgdGVzdHMgdnZ2dnZ2dnZ2CisgIGRlZiB0ZXN0X2luaXQKKyAgICBAc291cmNlID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc3RyZWFtID0gQ29tbW9uVG9rZW5TdHJlYW0ubmV3KCBAc291cmNlICkKKyAgICBAc3RyZWFtLnBvc2l0aW9uLnNob3VsZCA9PSAwCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcmVidWlsZAorICAgIEBzb3VyY2UxID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc291cmNlMiA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZTIudG9rZW5zIDw8IG5ld190b2tlbiggMTAsIDpjaGFubmVsID0+IEFOVExSMzo6SElEREVOICkgPDwgbmV3X3Rva2VuKCAxMSApCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyggQHNvdXJjZTEgKQorICAgIAorICAgIEBzdHJlYW0ucG9zaXRpb24uc2hvdWxkID09IDAKKyAgICBAc3RyZWFtLnRva2Vucy5sZW5ndGguc2hvdWxkID09IDAKKyAgICAKKyAgICBAc3RyZWFtLnJlYnVpbGQoIEBzb3VyY2UyICkKKyAgICBAc3RyZWFtLnRva2VuX3NvdXJjZS5zaG91bGQgPT0gQHNvdXJjZTIKKyAgICBAc3RyZWFtLnBvc2l0aW9uLnNob3VsZCA9PSAxCisgICAgQHN0cmVhbS50b2tlbnMuc2hvdWxkIGhhdmUoIDIgKS50aGluZ3MKKyAgZW5kCisgIAorICBkZWYgdGVzdF9sb29rX2VtcHR5X3NvdXJjZQorICAgIEBzb3VyY2UgPSBNb2NrU291cmNlLm5ldworICAgIEBzdHJlYW0gPSBDb21tb25Ub2tlblN0cmVhbS5uZXcoQHNvdXJjZSkKKyAgICBAc3RyZWFtLmxvb2suc2hvdWxkID09IEFOVExSMzo6RU9GX1RPS0VOCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbG9vazEKKyAgICBAc291cmNlID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc291cmNlLnRva2VucyA8PCBuZXdfdG9rZW4oMTIpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSAxMgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2xvb2sxX3dpdGhfaGlkZGVuCisgICAgIyBGSVgKKyAgICBAc291cmNlID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc291cmNlLnRva2VucyA8PCBuZXdfdG9rZW4oMTIsIDpjaGFubmVsID0+IEFOVExSMzo6SElEREVOX0NIQU5ORUwpIDw8CisgICAgICBuZXdfdG9rZW4oMTMpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSAxMworICBlbmQKKyAgCisgIGRlZiB0ZXN0X2xvb2syX2JleW9uZF9lbmQKKyAgICBAc291cmNlID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc291cmNlLnRva2VucyA8PCBuZXdfdG9rZW4oMTIpIDw8CisgICAgICBuZXdfdG9rZW4oMTMsIDpjaGFubmVsID0+IEFOVExSMzo6SElEREVOX0NIQU5ORUwpCisgICAgCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0ubG9vaygyKS50eXBlLnNob3VsZCA9PSBFT0YKKyAgZW5kCisgIAorICBkZWYgdGVzdF9sb29rX25lZ2F0aXZlCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEyKSA8PCBuZXdfdG9rZW4oMTMpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0uY29uc3VtZQorICAgIAorICAgIEBzdHJlYW0ubG9vaygtMSkudHlwZS5zaG91bGQgPT0gMTIKKyAgZW5kCisgIAorICBkZWYgdGVzdF9sYjEKKyAgICBAc291cmNlID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc291cmNlLnRva2VucyA8PCBuZXdfdG9rZW4oMTIpIDw8IG5ld190b2tlbigxMykKKyAgICBAc3RyZWFtID0gQ29tbW9uVG9rZW5TdHJlYW0ubmV3KEBzb3VyY2UpCisgICAgCisgICAgQHN0cmVhbS5jb25zdW1lCisgICAgQHN0cmVhbS5sb29rKC0xKS50eXBlLnNob3VsZCA9PSAxMgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2xvb2tfemVybworICAgICMgRklYCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEyKSA8PCBuZXdfdG9rZW4oMTMpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0ubG9vaygwKS5zaG91bGQgPT0gbmlsCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbGJfYmV5b25kX2JlZ2luCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEwKSA8PAorICAgICAgbmV3X3Rva2VuKDExLCA6Y2hhbm5lbCA9PiBISURERU5fQ0hBTk5FTCkgPDwKKyAgICAgIG5ld190b2tlbigxMiwgOmNoYW5uZWwgPT4gSElEREVOX0NIQU5ORUwpIDw8CisgICAgICBuZXdfdG9rZW4oMTMpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIAorICAgIEBzdHJlYW0ubG9vaygtMSkuc2hvdWxkID09IG5pbAorICAgIDIudGltZXMgeyBAc3RyZWFtLmNvbnN1bWUgfQorICAgIEBzdHJlYW0ubG9vaygtMykuc2hvdWxkID09IG5pbAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2ZpbGxfYnVmZmVyCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEyKSA8PCBuZXdfdG9rZW4oMTMpIDw8ICBuZXdfdG9rZW4oMTQpIDw8IG5ld190b2tlbihFT0YpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIAorICAgIEBzdHJlYW0uaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAdG9rZW5zKS5sZW5ndGguc2hvdWxkID09IDMKKyAgICBAc3RyZWFtLnRva2Vuc1swXS50eXBlLnNob3VsZCA9PSAxMgorICAgIEBzdHJlYW0udG9rZW5zWzFdLnR5cGUuc2hvdWxkID09IDEzCisgICAgQHN0cmVhbS50b2tlbnNbMl0udHlwZS5zaG91bGQgPT0gMTQKKyAgZW5kCisgIAorICBkZWYgdGVzdF9jb25zdW1lCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEyKSA8PCBuZXdfdG9rZW4oMTMpIDw8IG5ld190b2tlbihFT0YpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0ucGVlay5zaG91bGQgPT0gMTIKKyAgICBAc3RyZWFtLmNvbnN1bWUKKyAgICBAc3RyZWFtLnBlZWsuc2hvdWxkID09IDEzCisgICAgQHN0cmVhbS5jb25zdW1lCisgICAgQHN0cmVhbS5wZWVrLnNob3VsZCA9PSBFT0YKKyAgICBAc3RyZWFtLmNvbnN1bWUKKyAgICBAc3RyZWFtLnBlZWsuc2hvdWxkID09IEVPRgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3NlZWsKKyAgICBAc291cmNlID0gTW9ja1NvdXJjZS5uZXcKKyAgICBAc291cmNlLnRva2VucyA8PCBuZXdfdG9rZW4oMTIpIDw8IG5ld190b2tlbigxMykgPDwgbmV3X3Rva2VuKEVPRikKKyAgICBAc3RyZWFtID0gQ29tbW9uVG9rZW5TdHJlYW0ubmV3KEBzb3VyY2UpCisgICAgCisgICAgQHN0cmVhbS5wZWVrKDEpLnNob3VsZCA9PSAxMgorICAgIEBzdHJlYW0uc2VlaygyKS5wZWVrLnNob3VsZCA9PSBFT0YKKyAgICBAc3RyZWFtLnNlZWsoMCkucGVlay5zaG91bGQgPT0gMTIKKyAgICBAc3RyZWFtLnNlZWsoLTMpLnBvc2l0aW9uLnNob3VsZCA9PSAwCisgICAgQHN0cmVhbS5zZWVrKDEwKS5wb3NpdGlvbi5zaG91bGQgPT0gMgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X21hcmtfcmV3aW5kCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEyKSA8PCBuZXdfdG9rZW4oMTMpIDw8IG5ld190b2tlbihFT0YpCisgICAgQHN0cmVhbSA9IENvbW1vblRva2VuU3RyZWFtLm5ldyhAc291cmNlKQorICAgIEBzdHJlYW0uY29uc3VtZQorICAgIG1hcmtlciA9IEBzdHJlYW0ubWFyaworICAgIEBzdHJlYW0uY29uc3VtZQorICAgIEBzdHJlYW0ucmV3aW5kKG1hcmtlcikKKyAgICBAc3RyZWFtLnBlZWsoMSkuc2hvdWxkID09IDEzCisgIGVuZAorICAKKyAgZGVmIHRlc3RfdG9fc3RyaW5nCisgICAgQHNvdXJjZSA9IE1vY2tTb3VyY2UubmV3CisgICAgQHNvdXJjZS50b2tlbnMgPDwgbmV3X3Rva2VuKDEyLCAnZm9vJykgPDwKKyAgICAgIG5ld190b2tlbigxMywgJ2JhcicpIDw8IG5ld190b2tlbigxNCwgJ2dudXJ6JykgPDwKKyAgICAgIG5ld190b2tlbigxNSwgJ2JsYXJ6JykKKyAgICBAc3RyZWFtID0gQ29tbW9uVG9rZW5TdHJlYW0ubmV3KEBzb3VyY2UpCisgICAgQHN0cmVhbS50b19zLnNob3VsZCA9PSAiZm9vYmFyZ251cnpibGFyeiIKKyAgICBAc3RyZWFtLnRvX3MoMSwyKS5zaG91bGQgPT0gJ2JhcmdudXJ6JworICAgIEBzdHJlYW0udG9fcyhAc3RyZWFtWzFdLCBAc3RyZWFtWy0yXSkuc2hvdWxkID09ICdiYXJnbnVyeicKKyAgZW5kCisKKyAgZGVmIG5ld190b2tlbih0eXBlLCBvcHRzID0ge30pCisgICAgZmllbGRzID0ge30KKyAgICBjYXNlIHR5cGUKKyAgICB3aGVuIEhhc2ggdGhlbiBmaWVsZHMudXBkYXRlKHR5cGUpCisgICAgZWxzZQorICAgICAgZmllbGRzWzp0eXBlXSA9IHR5cGUKKyAgICBlbmQKKyAgICBjYXNlIG9wdHMKKyAgICB3aGVuIEhhc2ggdGhlbiBmaWVsZHMudXBkYXRlKG9wdHMpCisgICAgd2hlbiBTdHJpbmcgdGhlbiBmaWVsZHNbOnRleHRdID0gb3B0cworICAgIGVuZAorICAgIENvbW1vblRva2VuLmNyZWF0ZShmaWVsZHMpCisgIGVuZAorICAKK2VuZAorCisKK19fRU5EX18KK3Rlc3RzdHJlYW1zLnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExOICB8IFNUQVRVUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLQorY2xhc3MgVGVzdFN0cmluZ1N0cmVhbSh1bml0dGVzdC5UZXN0Q2FzZSkgICAgIHwgMDA5IHwgW3hdCisgIGRlZiB0ZXN0U2l6ZShzZWxmKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMTIgfCBbeF0KKyAgZGVmIHRlc3RJbmRleChzZWxmKSAgICAgICAgICAgICAgICAgICAgICAgICB8IDAyMCB8IFt4XQorICBkZWYgdGVzdENvbnN1bWUoc2VsZikgICAgICAgICAgICAgICAgICAgICAgIHwgMDI4IHwgW3hdCisgIGRlZiB0ZXN0UmVzZXQoc2VsZikgICAgICAgICAgICAgICAgICAgICAgICAgfCAwNzkgfCBbeF0KKyAgZGVmIHRlc3RMQShzZWxmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA5NCB8IFt4XQorICBkZWYgdGVzdFN1YnN0cmluZyhzZWxmKSAgICAgICAgICAgICAgICAgICAgIHwgMTExIHwgW3hdCisgIGRlZiB0ZXN0U2Vla0ZvcndhcmQoc2VsZikgICAgICAgICAgICAgICAgICAgfCAxMjIgfCBbeF0KKyAgZGVmIHRlc3RNYXJrKHNlbGYpICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1MCB8IFt4XQorICBkZWYgdGVzdFJlbGVhc2VMYXN0KHNlbGYpICAgICAgICAgICAgICAgICAgIHwgMTY3IHwgW3hdCisgIGRlZiB0ZXN0UmVsZWFzZU5lc3RlZChzZWxmKSAgICAgICAgICAgICAgICAgfCAxODYgfCBbeF0KKyAgZGVmIHRlc3RSZXdpbmRMYXN0KHNlbGYpICAgICAgICAgICAgICAgICAgICB8IDIwNCB8IFt4XQorICBkZWYgdGVzdFJld2luZE5lc3RlZChzZWxmKSAgICAgICAgICAgICAgICAgIHwgMjIzIHwgW3hdCitjbGFzcyBUZXN0RmlsZVN0cmVhbSh1bml0dGVzdC5UZXN0Q2FzZSkgICAgICAgfCAyNDUgfCBbb10KKyAgZGVmIHRlc3ROb0VuY29kaW5nKHNlbGYpICAgICAgICAgICAgICAgICAgICB8IDI0OSB8IFt4XQorICBkZWYgdGVzdEVuY29kZWQoc2VsZikgICAgICAgICAgICAgICAgICAgICAgIHwgMjcyIHwgWyBdCitjbGFzcyBUZXN0SW5wdXRTdHJlYW0odW5pdHRlc3QuVGVzdENhc2UpICAgICAgfCAyOTYgfCBbIF0KKyAgZGVmIHRlc3ROb0VuY29kaW5nKHNlbGYpICAgICAgICAgICAgICAgICAgICB8IDI5OSB8IFsgXQorICBkZWYgdGVzdEVuY29kZWQoc2VsZikgICAgICAgICAgICAgICAgICAgICAgIHwgMzIyIHwgWyBdCitjbGFzcyBUZXN0Q29tbW9uVG9rZW5TdHJlYW0odW5pdHRlc3QuVGVzdENhc2UpfCAzNDUgfCBbIF0KKyAgZGVmIHNldFVwKHNlbGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM0OCB8IFt4XQorICBkZWYgdGVzdEluaXQoc2VsZikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzY5IHwgW3hdCisgIGRlZiB0ZXN0U2V0VG9rZW5Tb3VyY2Uoc2VsZikgICAgICAgICAgICAgICAgfCAzNzYgfCBbeF0KKyAgZGVmIHRlc3RMVEVtcHR5U291cmNlKHNlbGYpICAgICAgICAgICAgICAgICB8IDM4NSB8IFt4XQorICBkZWYgdGVzdExUMShzZWxmKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzk0IHwgW3hdCisgIGRlZiB0ZXN0TFQxV2l0aEhpZGRlbihzZWxmKSAgICAgICAgICAgICAgICAgfCA0MDcgfCBbeF0KKyAgZGVmIHRlc3RMVDJCZXlvbmRFbmQoc2VsZikgICAgICAgICAgICAgICAgICB8IDQyNCB8IFt4XQorICBkZWYgdGVzdExUTmVnYXRpdmUoc2VsZikgICAgICAgICAgICAgICAgICAgIHwgNDQyIHwgW3hdCisgIGRlZiB0ZXN0TEIxKHNlbGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0NjEgfCBbeF0KKyAgZGVmIHRlc3RMVFplcm8oc2VsZikgICAgICAgICAgICAgICAgICAgICAgICB8IDQ3OSB8IFt4XQorICBkZWYgdGVzdExCQmV5b25kQmVnaW4oc2VsZikgICAgICAgICAgICAgICAgIHwgNDk2IHwgW3hdCisgIGRlZiB0ZXN0RmlsbEJ1ZmZlcihzZWxmKSAgICAgICAgICAgICAgICAgICAgfCA1MjMgfCBbeF0KKyAgZGVmIHRlc3RDb25zdW1lKHNlbGYpICAgICAgICAgICAgICAgICAgICAgICB8IDU1MSB8IFt4XQorICBkZWYgdGVzdFNlZWsoc2VsZikgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTc5IHwgW3hdCisgIGRlZiB0ZXN0TWFya1Jld2luZChzZWxmKSAgICAgICAgICAgICAgICAgICAgfCA2MDQgfCBbeF0KKyAgZGVmIHRlc3RUb1N0cmluZyhzZWxmKSAgICAgICAgICAgICAgICAgICAgICB8IDYzMSB8IFt4XQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXRlbXBsYXRlLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC10ZW1wbGF0ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjljN2MwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC10ZW1wbGF0ZS5yYgpAQCAtMCwwICsxLDI1MCBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdzcGVjJworcmVxdWlyZSAnYW50bHIzL3RlbXBsYXRlJworcmVxdWlyZSAnYW50bHIzL3V0aWwnCisKK2luY2x1ZGUgQU5UTFIzCitNZXRob2REZXNjcmlwdGlvbiA9IFN0cnVjdC5uZXcoIDpuYW1lLCA6Ym9keSwgOmFyZ3VtZW50cyApCitURU1QTEFURV9OQU1FUyA9ICV3KCBtZXRob2QgY2xhc3NfZGVmaW5pdGlvbiBhdHRyaWJ1dGUgKQorU0FNUExFX0dST1VQX0ZJTEUgPSBGaWxlLmpvaW4oCisgIEZpbGUuZGlybmFtZSggX19GSUxFX18gKSwgJ3NhbXBsZS1pbnB1dCcsICd0ZW1wbGF0ZS1ncm91cCcKKykKKworZGVzY3JpYmUgVGVtcGxhdGU6OkNvbnRleHQgZG8KKyAgZXhhbXBsZSAiY3JlYXRpbmcgYW4gZW1wdHkgY29udGV4dCIgZG8KKyAgICBjb250ZXh0ID0gVGVtcGxhdGU6OkNvbnRleHQubmV3CisgICAgY29udGV4dC5pbnN0YW5jZV92YXJpYWJsZXMuc2hvdWxkIGJlX2VtcHR5CisgIGVuZAorICAKKyAgZXhhbXBsZSAiY3JlYXRpbmcgYSBjb250ZXh0IHdpdGggYSB2YXJpYWJsZSBtYXAiIGRvCisgICAgY29udGV4dCA9IFRlbXBsYXRlOjpDb250ZXh0Lm5ldygKKyAgICAgIDphID0+IDEsIDpiID0+IDIKKyAgICApCisgICAgCisgICAgdmFycyA9IGNvbnRleHQuaW5zdGFuY2VfdmFyaWFibGVzLm1hcCB7IHwgaSB8IGkudG9fcyB9CisgICAgdmFycy5zaG91bGQgaW5jbHVkZSggJ0BhJyApCisgICAgdmFycy5zaG91bGQgaW5jbHVkZSggJ0BiJyApCisgICAgCisgICAgY29udGV4dC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoICdAYScgKS5zaG91bGQgPT0gMQorICAgIGNvbnRleHQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KCAnQGInICkuc2hvdWxkID09IDIKKyAgZW5kCisgIAorICBleGFtcGxlICJmZXRjaGluZyB2YXJpYWJsZSB2YWx1ZXMgZnJvbSBbXSIgZG8KKyAgICBjb250ZXh0ID0gVGVtcGxhdGU6OkNvbnRleHQubmV3KAorICAgICAgOmEgPT4gMSwgOmIgPT4gMgorICAgICkKKyAgICAKKyAgICBjb250ZXh0WyA6YSBdLnNob3VsZCA9PSAxCisgICAgY29udGV4dFsgJ2EnIF0uc2hvdWxkID09IDEKKyAgICBjb250ZXh0WyA6YiBdLnNob3VsZCA9PSAyCisgICAgY29udGV4dFsgJ2InIF0uc2hvdWxkID09IDIKKyAgZW5kCisgIAorICBleGFtcGxlICJkZWZpbmluZyB2YXJpYWJsZXMgd2l0aCBbXT0iIGRvCisgICAgY29udGV4dCA9IFRlbXBsYXRlOjpDb250ZXh0Lm5ldyggOmEgPT4gMyApCisgICAgY29udGV4dFsgOmEgXSA9IDEKKyAgICBjb250ZXh0WyAnYicgXSA9IDIKKyAgICAKKyAgICBjb250ZXh0Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCggJ0BhJyApLnNob3VsZCA9PSAxCisgICAgY29udGV4dC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoICdAYicgKS5zaG91bGQgPT0gMgorICBlbmQKKyAgCisgIGV4YW1wbGUgInVzaW5nIG1ldGhvZCBtaXNzaW5nIHRvIGFzc2lnbiB2YWx1ZXMiIGRvCisgICAgY29udGV4dCA9IFRlbXBsYXRlOjpDb250ZXh0Lm5ldyggOmEgPT4gMyApCisgICAgY29udGV4dC5hID0gMQorICAgIGNvbnRleHQuYiA9IDIKKyAgICAKKyAgICBjb250ZXh0Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCggJ0BhJyApLnNob3VsZCA9PSAxCisgICAgY29udGV4dC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoICdAYicgKS5zaG91bGQgPT0gMgorICBlbmQKKyAgCisgIGV4YW1wbGUgInVzaW5nIG1ldGhvZCBtaXNzaW5nIHRvIGdldCB2YXJpYWJsZSB2YWx1ZXMiIGRvCisgICAgY29udGV4dCA9IFRlbXBsYXRlOjpDb250ZXh0Lm5ldyggOmEgPT4gMSwgOmIgPT4gMikKKyAgICAKKyAgICBjb250ZXh0LmEuc2hvdWxkID09IDEKKyAgICBjb250ZXh0LmIuc2hvdWxkID09IDIKKyAgZW5kCisgIAorZW5kCisKKworc2hhcmVkX2V4YW1wbGVzX2ZvciAidGVtcGxhdGUgZ3JvdXBzIiBkbworICBpbmNsdWRlIEFOVExSMzo6VXRpbAorICAKKyAgZXhhbXBsZSAidGVtcGxhdGUgZGVmaW5pdGlvbnMiIGRvCisgICAgdGVtcGxhdGVzID0gQGdyb3VwLnRlbXBsYXRlcworICAgIHRlbXBsYXRlcy5zaG91bGRfbm90IGJlX2VtcHR5CisgICAgdGVtcGxhdGVzLnNob3VsZCBlcXVhbCBAZ3JvdXA6OlRFTVBMQVRFUworICAgIAorICAgIG5hbWVzID0gdGVtcGxhdGVzLmtleXMKKyAgICAKKyAgICBuYW1lcy5zaG91bGQgaGF2ZSgzKS50aGluZ3MKKyAgICBmb3IgdGVtcGxhdGVfbmFtZSBpbiBURU1QTEFURV9OQU1FUworICAgICAgbmFtZXMuc2hvdWxkIGluY2x1ZGUgdGVtcGxhdGVfbmFtZQorICAgICAgdGVtcGxhdGVfY2xhc3MgPSB0ZW1wbGF0ZXNbIHRlbXBsYXRlX25hbWUgXQorICAgICAgdGVtcGxhdGVfY2xhc3Muc2hvdWxkIGJlX2Ffa2luZF9vZiBDbGFzcworICAgICAgdGVtcGxhdGVfY2xhc3Muc3VwZXJjbGFzcy5zaG91bGQgZXF1YWwgVGVtcGxhdGU6OkNvbnRleHQKKyAgICAgIHRlbXBsYXRlX2NsYXNzLnNob3VsZCBiZSA8IEBncm91cCAjIGl0IHNob3VsZCBpbmNsdWRlIHRoZSBncm91cCBtb2R1bGUKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICJ0ZW1wbGF0ZV9kZWZpbmVkPyggbmFtZSApIHNob3VsZCB2ZXJpZnkgd2hldGhlciBhIHRlbXBsYXRlIGlzIGRlZmluZWQgaW4gYSBncm91cCIgZG8KKyAgICBmb3IgbmFtZSBpbiBURU1QTEFURV9OQU1FUworICAgICAgQGdyb3VwLnRlbXBsYXRlX2RlZmluZWQ/KCBuYW1lICkuc2hvdWxkIGJlX3RydWUKKyAgICAgIEBncm91cC50ZW1wbGF0ZV9kZWZpbmVkPyggbmFtZS50b19zICkuc2hvdWxkIGJlX3RydWUKKyAgICBlbmQKKyAgICAKKyAgICBAZ3JvdXAudGVtcGxhdGVfZGVmaW5lZD8oIDpzb21ldGhpbmdfZWxzZSApLnNob3VsZCBiZV9mYWxzZQorICBlbmQKKyAgCisgIGV4YW1wbGUgInRlbXBsYXRlIG1ldGhvZCBkZWZpbml0aW9ucyIgZG8KKyAgICBmb3IgbmFtZSBpbiBURU1QTEFURV9OQU1FUworICAgICAgQGdyb3VwLnNob3VsZCByZXNwb25kX3RvKCBuYW1lICkKKyAgICAgIEBncm91cC5zaG91bGQgcmVzcG9uZF90byggIiN7IG5hbWUgfSEiICkKKyAgICAgIGlmIFJVQllfVkVSU0lPTiA9fiAvXjFcLjkvCisgICAgICAgIEBncm91cC5wcml2YXRlX2luc3RhbmNlX21ldGhvZHMuc2hvdWxkIGluY2x1ZGUgbmFtZS50b19zeW0KKyAgICAgICAgQGdyb3VwLnByaXZhdGVfaW5zdGFuY2VfbWV0aG9kcy5zaG91bGQgaW5jbHVkZSA6IiN7IG5hbWUgfSEiCisgICAgICBlbHNlCisgICAgICAgIEBncm91cC5wcml2YXRlX2luc3RhbmNlX21ldGhvZHMuc2hvdWxkIGluY2x1ZGUgbmFtZS50b19zCisgICAgICAgIEBncm91cC5wcml2YXRlX2luc3RhbmNlX21ldGhvZHMuc2hvdWxkIGluY2x1ZGUgIiN7IG5hbWUgfSEiCisgICAgICBlbmQKKyAgICBlbmQKKyAgZW5kCisgIAorICBleGFtcGxlICJ0ZW1wbGF0ZSBtZXRob2Qgb3BlcmF0aW9uIiBkbworICAgIHZhbHVlID0gQGdyb3VwLmNsYXNzX2RlZmluaXRpb24KKyAgICB2YWx1ZS5zaG91bGQgYmVfYV9raW5kX29mIFRlbXBsYXRlOjpDb250ZXh0CisgICAgCisgICAgdmFsdWUgPSBAZ3JvdXAuY2xhc3NfZGVmaW5pdGlvbiEKKyAgICB2YWx1ZS5zaG91bGQgYmVfYV9raW5kX29mIFN0cmluZworICAgIAorICAgIHZhbHVlID0gQGdyb3VwLmF0dHJpYnV0ZSggOm5hbWUgPT4gJ2EnICkKKyAgICB2YWx1ZS5zaG91bGQgYmVfYV9raW5kX29mIFRlbXBsYXRlOjpDb250ZXh0CisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIFRlbXBsYXRlOjpHcm91cCwgImR5bmFtaWMgdGVtcGxhdGUgZGVmaW5pdGlvbiIgZG8KKyAgaW5jbHVkZSBBTlRMUjM6OlV0aWwKKyAgCisgIGJlZm9yZSA6ZWFjaCBkbworICAgIEBncm91cCA9IFRlbXBsYXRlOjpHcm91cC5uZXcgZG8KKyAgICAgIGV4dGVuZCBBTlRMUjM6OlV0aWwKKyAgICAgIGRlZmluZV90ZW1wbGF0ZSggOmNsYXNzX2RlZmluaXRpb24sIHRpZHkoIDw8LSdFTkQnLmNob21wICkgKQorICAgICAgfCBjbGFzcyA8JT0gQG5hbWUgJT48JSBpZiBAc3VwZXJjbGFzcyAlPiA8IDwlPSBAc3VwZXJjbGFzcyAlPjwlIGVuZCAlPgorICAgICAgfCAlIGlmIEBhdHRyaWJ1dGVzCisgICAgICB8IAorICAgICAgfCAlIGZvciBhdHRyLCBhY2Nlc3MgaW4gQGF0dHJpYnV0ZXMgCisgICAgICB8IDwlPSBhdHRyaWJ1dGUoIDpuYW1lID0+IGF0dHIsIDphY2Nlc3MgPT4gKCBhY2Nlc3MgfHwgJ3J3JyApICkudG9fcy5jaG9tcCAlPgorICAgICAgfCAlIGVuZAorICAgICAgfCAlIGVuZAorICAgICAgfCAlIGlmIEBtZXRob2RzCisgICAgICB8ICUgZm9yIG1ldGhvZCBpbiAoIEBtZXRob2RzIHx8IFtdICkKKyAgICAgIHwgPCU9IG1ldGhvZCggbWV0aG9kICkgJT4KKyAgICAgIHwgJSBlbmQKKyAgICAgIHwgJSBlbmQKKyAgICAgIHwgZW5kCisgICAgICBFTkQKKyAgICAgIAorICAgICAgZGVmaW5lX3RlbXBsYXRlKCA6YXR0cmlidXRlLCB0aWR5KCA8PC0nRU5EJy5jaG9tcCApICkKKyAgICAgIHwgJSBjYXNlIEBhY2Nlc3MudG9fcy5kb3duY2FzZQorICAgICAgfCAlIHdoZW4gJ3InCisgICAgICB8ICAgYXR0cl9yZWFkZXIgOjwlPSBAbmFtZSAlPgorICAgICAgfCAlIHdoZW4gJ3cnCisgICAgICB8ICAgYXR0cl93cml0ZXIgOjwlPSBAbmFtZSAlPgorICAgICAgfCAlIGVsc2UKKyAgICAgIHwgICBhdHRyX2FjY2Vzc29yIDo8JT0gQG5hbWUgJT4KKyAgICAgIHwgJSBlbmQKKyAgICAgIEVORAorICAgICAgCisgICAgICBkZWZpbmVfdGVtcGxhdGUoIDptZXRob2QsIHRpZHkoIDw8LSdFTkQnLmNob21wICkgKQorICAgICAgfCAgIAorICAgICAgfCAgIGRlZiA8JT0gQG5hbWUgJT48JSBpZiBAYXJndW1lbnRzIGFuZCBub3QgQGFyZ3VtZW50cy5lbXB0eT8gJT4oIDwlPSBAYXJndW1lbnRzLmpvaW4oICcsICcgKSAlPiApPCUgZW5kICU+CisgICAgICB8IDwlPSBAYm9keS5nc3ViKCAvXi8sICcgICAgJyApICU+CisgICAgICB8ICAgZW5kCisgICAgICBFTkQKKyAgICBlbmQKKyAgZW5kCisgIAorICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgInRlbXBsYXRlIGdyb3VwcyIKKyAgCisgIGV4YW1wbGUgInRlbXBsYXRlIG9iamVjdCBzdHJpbmcgcmVuZGVyaW5nIiBkbworICAgIGF0dHJpYnV0ZXMgPSBbCisgICAgICAldyggZmFtaWx5ICksCisgICAgICAldyggbmFtZSByICkKKyAgICBdCisgICAgICAgICAgCisgICAgbWV0aG9kcyA9IFsKKyAgICAgIE1ldGhvZERlc2NyaXB0aW9uLm5ldyggJ2VhdCcsICVxW3B1dHMoICJhdGUgJXMgJXMiICUgWyBudW1iZXIsIEBuYW1lIF0gKV0sICV3KCBudW1iZXIgKSApLAorICAgICAgTWV0aG9kRGVzY3JpcHRpb24ubmV3KCA6dG9fcywgJ0BuYW1lLnRvX3MuZHVwJyApCisgICAgXQorICAgIAorICAgIHZlZ2V0YWJsZSA9IEBncm91cC5jbGFzc19kZWZpbml0aW9uKAorICAgICAgOm5hbWUgPT4gJ1ZlZ2V0YWJsZScsCisgICAgICA6c3VwZXJjbGFzcyA9PiAnRm9vZCcsCisgICAgICA6YXR0cmlidXRlcyA9PiBhdHRyaWJ1dGVzLAorICAgICAgOm1ldGhvZHMgPT4gbWV0aG9kcworICAgICkKKyAgICAKKyAgICB2ZWdldGFibGUudG9fcy5zaG91bGQgPT0gdGlkeSggPDwtRU5ELmNob21wICkKKyAgICB8IGNsYXNzIFZlZ2V0YWJsZSA8IEZvb2QKKyAgICB8CisgICAgfCAgIGF0dHJfYWNjZXNzb3IgOmZhbWlseQorICAgIHwgICBhdHRyX3JlYWRlciA6bmFtZQorICAgIHwgICAKKyAgICB8ICAgZGVmIGVhdCggbnVtYmVyICkKKyAgICB8ICAgICBwdXRzKCAiYXRlICVzICVzIiAlIFsgbnVtYmVyLCBAbmFtZSBdICkKKyAgICB8ICAgZW5kCisgICAgfCAgIAorICAgIHwgICBkZWYgdG9fcworICAgIHwgICAgIEBuYW1lLnRvX3MuZHVwCisgICAgfCAgIGVuZAorICAgIHwgZW5kCisgICAgRU5ECisgIGVuZAorZW5kCisKK2Rlc2NyaWJlIFRlbXBsYXRlOjpHcm91cCwgImxvYWRpbmcgYSB0ZW1wbGF0ZSBkZWZpbml0aW9uIGZpbGUiIGRvCisgIAorICBiZWZvcmUgOmVhY2ggZG8KKyAgICBAZ3JvdXAgPSBUZW1wbGF0ZTo6R3JvdXAubG9hZCggU0FNUExFX0dST1VQX0ZJTEUgKQorICBlbmQKKyAgCisgIGl0X3Nob3VsZF9iZWhhdmVfbGlrZSAidGVtcGxhdGUgZ3JvdXBzIgorICAKKyAgZXhhbXBsZSAidGVtcGxhdGUgb2JqZWN0IHN0cmluZyByZW5kZXJpbmciIGRvCisgICAgYXR0cmlidXRlcyA9IFsKKyAgICAgICV3KCBmYW1pbHkgKSwKKyAgICAgICV3KCBuYW1lIHIgKQorICAgIF0KKyAgICAgICAgICAKKyAgICBtZXRob2RzID0gWworICAgICAgTWV0aG9kRGVzY3JpcHRpb24ubmV3KCAnZWF0JywgJXFbcHV0cyggImF0ZSAlcyAlcyIgJSBbIG51bWJlciwgQG5hbWUgXSApXSwgJXcoIG51bWJlciApICksCisgICAgICBNZXRob2REZXNjcmlwdGlvbi5uZXcoIDp0b19zLCAnQG5hbWUudG9fcy5kdXAnICkKKyAgICBdCisgICAgCisgICAgdmVnZXRhYmxlID0gQGdyb3VwLmNsYXNzX2RlZmluaXRpb24oCisgICAgICA6bmFtZSA9PiAnVmVnZXRhYmxlJywKKyAgICAgIDpzdXBlcmNsYXNzID0+ICdGb29kJywKKyAgICAgIDphdHRyaWJ1dGVzID0+IGF0dHJpYnV0ZXMsCisgICAgICA6bWV0aG9kcyA9PiBtZXRob2RzCisgICAgKQorICAgIAorICAgIHZlZ2V0YWJsZS50b19zLnNob3VsZCA9PSB0aWR5KCA8PC1FTkQuY2hvbXAgKQorICAgIHwgY2xhc3MgVmVnZXRhYmxlIDwgRm9vZAorICAgIHwKKyAgICB8ICAgYXR0cl9hY2Nlc3NvciA6ZmFtaWx5CisgICAgfCAgIGF0dHJfcmVhZGVyIDpuYW1lCisgICAgfCAgIAorICAgIHwgICBkZWYgZWF0KCBudW1iZXIgKQorICAgIHwgICAgIHB1dHMoICJhdGUgJXMgJXMiICUgWyBudW1iZXIsIEBuYW1lIF0gKQorICAgIHwgICBlbmQKKyAgICB8ICAgCisgICAgfCAgIGRlZiB0b19zCisgICAgfCAgICAgQG5hbWUudG9fcy5kdXAKKyAgICB8ICAgZW5kCisgICAgfCBlbmQKKyAgICBFTkQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC9ydW50aW1lL1J1YnkvdGVzdC91bml0L3Rlc3QtdHJlZS13aXphcmQucmIgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXRyZWUtd2l6YXJkLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODk4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXRyZWUtd2l6YXJkLnJiCkBAIC0wLDAgKzEsNDk0IEBACisjIS91c3IvYmluL3J1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKK3JlcXVpcmUgJ2FudGxyMycKK3JlcXVpcmUgJ2FudGxyMy90cmVlL3dpemFyZCcKK3JlcXVpcmUgJ3Rlc3QvdW5pdCcKK3JlcXVpcmUgJ3NwZWMnCisKK2luY2x1ZGUgQU5UTFIzCitpbmNsdWRlIEFOVExSMzo6QVNUCisKK2NsYXNzIFRlc3RQYXR0ZXJuTGV4ZXIgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICAKKyAgIyB2dnZ2dnZ2diB0ZXN0cyB2dnZ2dnZ2dnYKKyAgCisgIGRlZiB0ZXN0X29wZW4KKyAgICBsZXhlciA9IFdpemFyZDo6UGF0dGVybkxleGVyLm5ldyggJygnICkKKyAgICB0eXBlID0gbGV4ZXIubmV4dF90b2tlbgorICAgIGFzc2VydF9lcXVhbCggdHlwZSwgOm9wZW4gKQorICAgIGFzc2VydF9lcXVhbCggbGV4ZXIudGV4dCwgJycgKQorICAgIGFzc2VydF9lcXVhbCggbGV4ZXIuZXJyb3IsIGZhbHNlICkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9jbG9zZQorICAgIGxleGVyID0gV2l6YXJkOjpQYXR0ZXJuTGV4ZXIubmV3KCcpJykKKyAgICB0eXBlID0gbGV4ZXIubmV4dF90b2tlbgorICAgIGFzc2VydF9lcXVhbCh0eXBlLCA6Y2xvc2UpCisgICAgYXNzZXJ0X2VxdWFsKGxleGVyLnRleHQsICcnKQorICAgIGFzc2VydF9lcXVhbChsZXhlci5lcnJvciwgZmFsc2UpCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcGVyY2VudAorICAgIGxleGVyID0gV2l6YXJkOjpQYXR0ZXJuTGV4ZXIubmV3KCclJykKKyAgICB0eXBlID0gbGV4ZXIubmV4dF90b2tlbgorICAgIGFzc2VydF9lcXVhbCh0eXBlLCA6cGVyY2VudCkKKyAgICBhc3NlcnRfZXF1YWwobGV4ZXIudGV4dCwgJycpCisgICAgYXNzZXJ0X2VxdWFsKGxleGVyLmVycm9yLCBmYWxzZSkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9kb3QKKyAgICBsZXhlciA9IFdpemFyZDo6UGF0dGVybkxleGVyLm5ldygnLicpCisgICAgdHlwZSA9IGxleGVyLm5leHRfdG9rZW4KKyAgICBhc3NlcnRfZXF1YWwodHlwZSwgOmRvdCkKKyAgICBhc3NlcnRfZXF1YWwobGV4ZXIudGV4dCwgJycpCisgICAgYXNzZXJ0X2VxdWFsKGxleGVyLmVycm9yLCBmYWxzZSkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9lb2YKKyAgICBsZXhlciA9IFdpemFyZDo6UGF0dGVybkxleGVyLm5ldygiIFxuIFxyIFx0ICIpCisgICAgdHlwZSA9IGxleGVyLm5leHRfdG9rZW4KKyAgICBhc3NlcnRfZXF1YWwodHlwZSwgRU9GKQorICAgIGFzc2VydF9lcXVhbChsZXhlci50ZXh0LCAnJykKKyAgICBhc3NlcnRfZXF1YWwobGV4ZXIuZXJyb3IsIGZhbHNlKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2lkCisgICAgbGV4ZXIgPSBXaXphcmQ6OlBhdHRlcm5MZXhlci5uZXcoJ19fd2hhdGV2ZXJfMV9fJykKKyAgICB0eXBlID0gbGV4ZXIubmV4dF90b2tlbgorICAgIGFzc2VydF9lcXVhbCg6aWRlbnRpZmllciwgdHlwZSkKKyAgICBhc3NlcnRfZXF1YWwoJ19fd2hhdGV2ZXJfMV9fJywgbGV4ZXIudGV4dCkKKyAgICBhc3NlcnQoICEobGV4ZXIuZXJyb3IpICkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9hcmcKKyAgICBsZXhlciA9IFdpemFyZDo6UGF0dGVybkxleGVyLm5ldygnWyBcXWJsYVxuXScpCisgICAgdHlwZSA9IGxleGVyLm5leHRfdG9rZW4KKyAgICBhc3NlcnRfZXF1YWwodHlwZSwgOmFyZ3VtZW50KQorICAgIGFzc2VydF9lcXVhbCgnIF1ibGFcbicsIGxleGVyLnRleHQpCisgICAgYXNzZXJ0KCAhKGxleGVyLmVycm9yKSApCisgIGVuZAorICAKKyAgZGVmIHRlc3RfZXJyb3IKKyAgICBsZXhlciA9IFdpemFyZDo6UGF0dGVybkxleGVyLm5ldygiMSIpCisgICAgdHlwZSA9IGxleGVyLm5leHRfdG9rZW4KKyAgICBhc3NlcnRfZXF1YWwodHlwZSwgRU9GKQorICAgIGFzc2VydF9lcXVhbChsZXhlci50ZXh0LCAnJykKKyAgICBhc3NlcnRfZXF1YWwobGV4ZXIuZXJyb3IsIHRydWUpCisgIGVuZAorICAKK2VuZAorCisKK2NsYXNzIFRlc3RQYXR0ZXJuUGFyc2VyIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgVG9rZW5zID0gVG9rZW5TY2hlbWUuYnVpbGQgJXcoQSBCIEMgRCBFIElEIFZBUikKKyAgaW5jbHVkZSBUb2tlbnMKKyAgCisgIGRlZiBzZXR1cAorICAgIEBhZGFwdG9yID0gQ29tbW9uVHJlZUFkYXB0b3IubmV3KCBUb2tlbnMudG9rZW5fY2xhc3MgKQorICAgIEBwYXR0ZXJuX2FkYXB0b3IgPSBXaXphcmQ6OlBhdHRlcm5BZGFwdG9yLm5ldyggVG9rZW5zLnRva2VuX2NsYXNzICkKKyAgICBAd2l6YXJkID0gV2l6YXJkLm5ldyggOmFkYXB0b3IgPT4gQGFkYXB0b3IsIDp0b2tlbl9zY2hlbWUgPT4gVG9rZW5zICkKKyAgZW5kCisgIAorICAjIHZ2dnZ2dnZ2IHRlc3RzIHZ2dnZ2dnZ2dgorICBkZWYgdGVzdF9zaW5nbGVfbm9kZQorICAgIHRyZWUgPSBXaXphcmQ6OlBhdHRlcm5QYXJzZXIucGFyc2UoICdJRCcsIFRva2VucywgQGFkYXB0b3IgKQorICAgIAorICAgIGFzc2VydF9pbnN0YW5jZV9vZihDb21tb25UcmVlLCB0cmVlKQorICAgIGFzc2VydF9lcXVhbCggSUQsIHRyZWUudHlwZSApCisgICAgYXNzZXJ0X2VxdWFsKCAnSUQnLCB0cmVlLnRleHQgKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3NpbmdsZV9ub2RlX3dpdGhfYXJnCisgICAgdHJlZSA9IFdpemFyZDo6UGF0dGVyblBhcnNlci5wYXJzZSggJ0lEW2Zvb10nLCBUb2tlbnMsIEBhZGFwdG9yICkKKyAgICAKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YoIENvbW1vblRyZWUsIHRyZWUgKQorICAgIGFzc2VydF9lcXVhbCggSUQsIHRyZWUudHlwZSApCisgICAgYXNzZXJ0X2VxdWFsKCAnZm9vJywgdHJlZS50ZXh0ICkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9zaW5nbGVfbGV2ZWxfdHJlZQorICAgIHRyZWUgPSBXaXphcmQ6OlBhdHRlcm5QYXJzZXIucGFyc2UoICcoQSBCKScsIFRva2VucywgQGFkYXB0b3IgKQorICAgIAorICAgIGFzc2VydF9pbnN0YW5jZV9vZiggQ29tbW9uVHJlZSwgdHJlZSApCisgICAgYXNzZXJ0X2VxdWFsKEEsIHRyZWUudHlwZSkKKyAgICBhc3NlcnRfZXF1YWwoJ0EnLCB0cmVlLnRleHQpCisgICAgYXNzZXJ0X2VxdWFsKHRyZWUuY2hpbGRfY291bnQsIDEpCisgICAgYXNzZXJ0X2VxdWFsKHRyZWUuY2hpbGQoMCkudHlwZSwgQikKKyAgICBhc3NlcnRfZXF1YWwodHJlZS5jaGlsZCgwKS50ZXh0LCAnQicpCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbmlsCisgICAgdHJlZSA9IFdpemFyZDo6UGF0dGVyblBhcnNlci5wYXJzZSggJ25pbCcsIFRva2VucywgQGFkYXB0b3IgKQorICAgIAorICAgIGFzc2VydF9pbnN0YW5jZV9vZihDb21tb25UcmVlLCB0cmVlKQorICAgIGFzc2VydF9lcXVhbCgwLCB0cmVlLnR5cGUpCisgICAgYXNzZXJ0X25pbCB0cmVlLnRleHQKKyAgZW5kCisgIAorICBkZWYgdGVzdF93aWxkY2FyZAorICAgIHRyZWUgPSBXaXphcmQ6OlBhdHRlcm5QYXJzZXIucGFyc2UoICcoLiknLCBUb2tlbnMsIEBhZGFwdG9yICkKKyAgICBhc3NlcnRfaW5zdGFuY2Vfb2YoIFdpemFyZDo6V2lsZGNhcmRQYXR0ZXJuLCB0cmVlICkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9sYWJlbAorICAgIHRyZWUgPSBXaXphcmQ6OlBhdHRlcm5QYXJzZXIucGFyc2UoICcoJWE6QSknLCBUb2tlbnMsIEBwYXR0ZXJuX2FkYXB0b3IgKQorICAgIGFzc2VydF9pbnN0YW5jZV9vZihXaXphcmQ6OlBhdHRlcm4sIHRyZWUpCisgICAgYXNzZXJ0X2VxdWFsKCdhJywgdHJlZS5sYWJlbCkKKyAgZW5kCisgIAorICBkZWYgdGVzdF9lcnJvcl8xCisgICAgdHJlZSA9IFdpemFyZDo6UGF0dGVyblBhcnNlci5wYXJzZSggJyknLCBUb2tlbnMsIEBhZGFwdG9yICkKKyAgICBhc3NlcnRfbmlsIHRyZWUKKyAgZW5kCisgIAorICBkZWYgdGVzdF9lcnJvcl8yCisgICAgdHJlZSA9IFdpemFyZDo6UGF0dGVyblBhcnNlci5wYXJzZSggJygpJywgVG9rZW5zLCBAYWRhcHRvciApCisgICAgYXNzZXJ0X25pbCB0cmVlCisgIGVuZAorICAKKyAgZGVmIHRlc3RfZXJyb3JfMworICAgIHRyZWUgPSBXaXphcmQ6OlBhdHRlcm5QYXJzZXIucGFyc2UoICcoQSBdKScsIFRva2VucywgQGFkYXB0b3IgKQorICAgIGFzc2VydF9uaWwgdHJlZQorICBlbmQKKyAgCitlbmQKKworCitjbGFzcyBUZXN0VHJlZVdpemFyZCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIFRva2VucyA9IFRva2VuU2NoZW1lLmJ1aWxkICV3KEEgQiBDIEQgRSBJRCBWQVIpCisgIGluY2x1ZGUgVG9rZW5zCisKKyAgZGVmIHNldHVwCisgICAgQGFkYXB0b3IgPSBDb21tb25UcmVlQWRhcHRvci5uZXcoIFRva2Vucy50b2tlbl9jbGFzcyApCisgICAgQHdpemFyZCA9IFdpemFyZC5uZXcoIDphZGFwdG9yID0+IEBhZGFwdG9yLCA6dG9rZW5fc2NoZW1lID0+IFRva2VucyApCisgIGVuZAorICAKKyAgZGVmIGNyZWF0ZV93aXphcmQoIHRva2VucyApCisgICAgV2l6YXJkLm5ldyggOnRva2VucyA9PiB0b2tlbnMgKQorICBlbmQKKyAgCisgICMgdnZ2dnZ2dnYgdGVzdHMgdnZ2dnZ2dnZ2CisgIGRlZiB0ZXN0X2luaXQKKyAgICBAd2l6YXJkID0gV2l6YXJkLm5ldyggOnRva2VucyA9PiAldyhBIEIpLCA6YWRhcHRvciA9PiBAYWRhcHRvciApCisgICAgCisgICAgYXNzZXJ0X2VxdWFsKCBAd2l6YXJkLmFkYXB0b3IsIEBhZGFwdG9yICkKKyAgICBhc3NlcnRfa2luZF9vZiggQU5UTFIzOjpUb2tlblNjaGVtZSwgQHdpemFyZC50b2tlbl9zY2hlbWUgKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3NpbmdsZV9ub2RlCisgICAgdCA9IEB3aXphcmQuY3JlYXRlKCJJRCIpCisgICAgYXNzZXJ0X2VxdWFsKHQuaW5zcGVjdCwgJ0lEJykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9zaW5nbGVfbm9kZV93aXRoX2FyZworICAgIHQgPSBAd2l6YXJkLmNyZWF0ZSgiSURbZm9vXSIpCisgICAgCisgICAgYXNzZXJ0X2VxdWFsKHQuaW5zcGVjdCwgJ2ZvbycpCisgIGVuZAorICAKKyAgZGVmIHRlc3Rfc2luZ2xlX25vZGVfdHJlZQorICAgIHQgPSBAd2l6YXJkLmNyZWF0ZSgiKEEpIikKKyAgICBhc3NlcnRfZXF1YWwodC5pbnNwZWN0LCAnQScpCisgIGVuZAorICAKKyAgZGVmIHRlc3Rfc2luZ2xlX2xldmVsX3RyZWUKKyAgICB0ID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQyBEKSIpCisgICAgYXNzZXJ0X2VxdWFsKHQuaW5zcGVjdCwgJyhBIEIgQyBEKScpCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbGlzdF90cmVlCisgICAgdCA9IEB3aXphcmQuY3JlYXRlKCIobmlsIEEgQiBDKSIpCisgICAgYXNzZXJ0X2VxdWFsKHQuaW5zcGVjdCwgJ0EgQiBDJykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9pbnZhbGlkX2xpc3RfdHJlZQorICAgIHQgPSBAd2l6YXJkLmNyZWF0ZSgiQSBCIEMiKQorICAgIGFzc2VydF9uaWwgdAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2RvdWJsZV9sZXZlbF90cmVlCisgICAgdCA9IEB3aXphcmQuY3JlYXRlKCIoQSAoQiBDKSAoQiBEKSBFKSIpCisgICAgYXNzZXJ0X2VxdWFsKHQuaW5zcGVjdCwgIihBIChCIEMpIChCIEQpIEUpIikKKyAgZW5kCisgIAorICBTSU1QTElGWV9NQVAgPSBsYW1iZGEgZG8gfGltYXB8CisgICAgSGFzaFsKKyAgICAgIGltYXAubWFwIHsgfHR5cGUsIG5vZGVzfCBbdHlwZSwgbm9kZXMubWFwIHsgfG58IG4udG9fcyB9XSB9CisgICAgXQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3NpbmdsZV9ub2RlX2luZGV4CisgICAgdHJlZSA9IEB3aXphcmQuY3JlYXRlKCJJRCIpCisgICAgaW5kZXhfbWFwID0gU0lNUExJRllfTUFQW0B3aXphcmQuaW5kZXgodHJlZSldCisgICAgCisgICAgYXNzZXJ0X2VxdWFsKGluZGV4X21hcCwgSUQgPT4gJXcoSUQpKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9ub19yZXBlYXRzX2luZGV4CisgICAgdHJlZSA9IEB3aXphcmQuY3JlYXRlKCIoQSBCIEMgRCkiKQorICAgIGluZGV4X21hcCA9IFNJTVBMSUZZX01BUFtAd2l6YXJkLmluZGV4KHRyZWUpXQorICAgIAorICAgIGFzc2VydF9lcXVhbChpbmRleF9tYXAsCisgICAgICAgIEQgPT4gJXcoRCksIEIgPT4gJXcoQiksCisgICAgICAgIEMgPT4gJXcoQyksIEEgPT4gJXcoQSkKKyAgICApCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcmVwZWF0c19pbmRleAorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpCisgICAgaW5kZXhfbWFwID0gU0lNUExJRllfTUFQW0B3aXphcmQuaW5kZXgodHJlZSldCisgICAgCisgICAgYXNzZXJ0X2VxdWFsKGluZGV4X21hcCwKKyAgICAgICAgRCA9PiAldyhEIEQpLCBCID0+ICV3KEIgQiBCKSwKKyAgICAgICAgQyA9PiAldyhDKSwgQSA9PiAldyhBIEEpCisgICAgKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9ub19yZXBlYXRzX3Zpc2l0CisgICAgdHJlZSA9IEB3aXphcmQuY3JlYXRlKCIoQSBCIEMgRCkiKQorICAgIAorICAgIGVsZW1lbnRzID0gW10KKyAgICBAd2l6YXJkLnZpc2l0KCB0cmVlLCBCICkgZG8gfG5vZGUsIHBhcmVudCwgY2hpbGRfaW5kZXgsIGxhYmVsc3wKKyAgICAgIGVsZW1lbnRzIDw8IG5vZGUudG9fcworICAgIGVuZAorICAgIAorICAgIGFzc2VydF9lcXVhbCggJXcoQiksIGVsZW1lbnRzICkKKyAgZW5kCisgIAorICAKKyAgZGVmIHRlc3Rfbm9fcmVwZWF0c192aXNpdDIKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgKEEgQyBCKSBCIEQgRCkiKQorICAgIAorICAgIGVsZW1lbnRzID0gW10KKyAgICBAd2l6YXJkLnZpc2l0KCB0cmVlLCBDICkgZG8gfG5vZGUsIHBhcmVudCwgY2hpbGRfaW5kZXgsIGxhYmVsc3wKKyAgICAgIGVsZW1lbnRzIDw8IG5vZGUudG9fcworICAgIGVuZAorICAgIAorICAgIGFzc2VydF9lcXVhbCgldyhDKSwgZWxlbWVudHMpCisgIGVuZAorICAKKyAgCisgIGRlZiB0ZXN0X3JlcGVhdHNfdmlzaXQKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgKEEgQyBCKSBCIEQgRCkiKQorICAgIAorICAgIGVsZW1lbnRzID0gW10KKyAgICBAd2l6YXJkLnZpc2l0KCB0cmVlLCBCICkgZG8gfG5vZGUsIHBhcmVudCwgY2hpbGRfaW5kZXgsIGxhYmVsc3wKKyAgICAgIGVsZW1lbnRzIDw8IG5vZGUudG9fcworICAgIGVuZAorICAgIAorICAgIGFzc2VydF9lcXVhbCgldyhCIEIgQiksIGVsZW1lbnRzKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9yZXBlYXRzX3Zpc2l0MgorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpCisgICAgCisgICAgZWxlbWVudHMgPSBbXQorICAgIEB3aXphcmQudmlzaXQoIHRyZWUsIEEgKSBkbyB8bm9kZSwgcGFyZW50LCBjaGlsZF9pbmRleCwgbGFiZWxzfAorICAgICAgZWxlbWVudHMgPDwgbm9kZS50b19zCisgICAgZW5kCisgICAgCisgICAgYXNzZXJ0X2VxdWFsKCV3KEEgQSksIGVsZW1lbnRzKQorICBlbmQKKyAgCisgIGRlZiBjb250ZXh0KG5vZGUsIHBhcmVudCwgaW5kZXgpCisgICAgJyVzQCVzWyVkXScgJSBbbm9kZS50b19zLCAocGFyZW50IHx8ICduaWwnKS50b19zLCBpbmRleF0KKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBlYXRzX3Zpc2l0X3dpdGhfY29udGV4dAorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpCisgICAgCisgICAgZWxlbWVudHMgPSBbXQorICAgIEB3aXphcmQudmlzaXQoIHRyZWUsIEIgKSBkbyB8bm9kZSwgcGFyZW50LCBjaGlsZF9pbmRleCwgbGFiZWxzfAorICAgICAgZWxlbWVudHMgPDwgY29udGV4dChub2RlLCBwYXJlbnQsIGNoaWxkX2luZGV4KQorICAgIGVuZAorICAgIAorICAgIGFzc2VydF9lcXVhbChbJ0JAQVswXScsICdCQEFbMV0nLCAnQkBBWzJdJ10sIGVsZW1lbnRzKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9yZXBlYXRzX3Zpc2l0X3dpdGhfbnVsbF9wYXJlbnRfYW5kX2NvbnRleHQKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgKEEgQyBCKSBCIEQgRCkiKQorICAgIAorICAgIGVsZW1lbnRzID0gW10KKyAgICBAd2l6YXJkLnZpc2l0KCB0cmVlLCBBICkgZG8gfG5vZGUsIHBhcmVudCwgY2hpbGRfaW5kZXgsIGxhYmVsc3wKKyAgICAgIGVsZW1lbnRzIDw8IGNvbnRleHQobm9kZSwgcGFyZW50LCBjaGlsZF9pbmRleCkKKyAgICBlbmQKKyAgICAKKyAgICBhc3NlcnRfZXF1YWwoWydBQG5pbFstMV0nLCAnQUBBWzFdJ10sIGVsZW1lbnRzKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X3Zpc2l0X3BhdHRlcm4KKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQyAoQSBCKSBEKSIpCisgICAgCisgICAgZWxlbWVudHMgPSBbXQorICAgIEB3aXphcmQudmlzaXQodHJlZSwgJyhBIEIpJykgZG8gfG5vZGUsIHBhcmVudCwgY2hpbGRfaW5kZXgsIGxhYmVsc3wKKyAgICAgIGVsZW1lbnRzIDw8IG5vZGUudG9fcworICAgIGVuZAorICAgIAorICAgIGFzc2VydF9lcXVhbCgldyhBKSwgZWxlbWVudHMpCisgIGVuZAorICAKKyAgCisgIGRlZiB0ZXN0X3Zpc2l0X3BhdHRlcm5fbXVsdGlwbGUKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQyAoQSBCKSAoRCAoQSBCKSkpIikKKyAgICAKKyAgICBlbGVtZW50cyA9IFtdCisgICAgQHdpemFyZC52aXNpdCh0cmVlLCAnKEEgQiknKSBkbyB8bm9kZSwgcGFyZW50LCBjaGlsZF9pbmRleCwgbGFiZWxzfAorICAgICAgZWxlbWVudHMgPDwgY29udGV4dChub2RlLCBwYXJlbnQsIGNoaWxkX2luZGV4KQorICAgIGVuZAorICAgIAorICAgIGFzc2VydF9lcXVhbCggJXcoQUBBWzJdIEFARFswXSkgLCBlbGVtZW50cyApCisgIGVuZAorICAKKyAgZGVmIGxhYmVsZWRfY29udGV4dChub2RlLCBwYXJlbnQsIGluZGV4LCBsYWJlbHMsICpuYW1lcykKKyAgICBzdWZmaXggPSBuYW1lcy5tYXAgeyB8bnwgbGFiZWxzW25dLnRvX3MgfS5qb2luKCcmJykKKyAgICAnJXNAJXNbJWRdJXMnICUgW25vZGUudG9fcywgKHBhcmVudCB8fCAnbmlsJykudG9fcywgaW5kZXgsIHN1ZmZpeF0KKyAgZW5kCisgICAgCisgIGRlZiB0ZXN0X3Zpc2l0X3BhdHRlcm5fbXVsdGlwbGVfd2l0aF9sYWJlbHMKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQyAoQVtmb29dIEJbYmFyXSkgKEQgKEFbYmlnXSBCW2RvZ10pKSkiKQorICAgIAorICAgIGVsZW1lbnRzID0gW10KKyAgICBAd2l6YXJkLnZpc2l0KHRyZWUsICcoJWE6QSAlYjpCKScpIGRvIHxub2RlLCBwYXJlbnQsIGNoaWxkX2luZGV4LCBsYWJlbHN8CisgICAgICBlbGVtZW50cyA8PCBsYWJlbGVkX2NvbnRleHQobm9kZSwgcGFyZW50LCBjaGlsZF9pbmRleCwgbGFiZWxzLCAnYScsICdiJykKKyAgICBlbmQKKyAgICAKKyAgICBhc3NlcnRfZXF1YWwoIFsnZm9vQEFbMl1mb28mYmFyJywgJ2JpZ0BEWzBdYmlnJmRvZyddICwgZWxlbWVudHMgKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9tYXRjaAorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiBDKSIpCisgICAgYXNzZXJ0IEB3aXphcmQubWF0Y2godHJlZSwgIihBIEIgQykiKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X21hdGNoX3NpbmdsZV9ub2RlCisgICAgdHJlZSA9IEB3aXphcmQuY3JlYXRlKCdBJykKKyAgICBhc3NlcnQgQHdpemFyZC5tYXRjaCh0cmVlLCAnQScpCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbWF0Y2hfc2luZ2xlX25vZGVfZmFpbHMKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoJ0EnKQorICAgIGFzc2VydCggIShAd2l6YXJkLm1hdGNoKHRyZWUsICdCJykpICkKKyAgZW5kCisgIAorICAKKyAgZGVmIHRlc3RfbWF0Y2hfZmxhdF90cmVlCisgICAgdHJlZSA9IEB3aXphcmQuY3JlYXRlKCcobmlsIEEgQiBDKScpCisgICAgYXNzZXJ0IEB3aXphcmQubWF0Y2godHJlZSwgJyhuaWwgQSBCIEMpJykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9tYXRjaF9mbGF0X3RyZWVfZmFpbHMKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoJyhuaWwgQSBCIEMpJykKKyAgICBhc3NlcnQoICEoQHdpemFyZC5tYXRjaCh0cmVlLCAnKG5pbCBBIEIpJykpICkKKyAgZW5kCisKKyAgZGVmIHRlc3RfbWF0Y2hfZmxhdF90cmVlX2ZhaWxzMgorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgnKG5pbCBBIEIgQyknKQorICAgIGFzc2VydCggIShAd2l6YXJkLm1hdGNoKHRyZWUsICcobmlsIEEgQiBBKScpKSApCisgIGVuZAorICAKKyAgZGVmIHRlc3Rfd2lsZGNhcmQKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoJyhBIEIgQyknKQorICAgIGFzc2VydCBAd2l6YXJkLm1hdGNoKHRyZWUsICcoQSAuIC4pJykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9tYXRjaF93aXRoX3RleHQKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoJyhBIEJbZm9vXSBDW2Jhcl0pJykKKyAgICBhc3NlcnQgQHdpemFyZC5tYXRjaCh0cmVlLCAnKEEgQltmb29dIEMpJykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9tYXRjaF93aXRoX3RleHRfZmFpbHMKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoJyhBIEIgQyknKQorICAgIGFzc2VydCggIShAd2l6YXJkLm1hdGNoKHRyZWUsICcoQVtmb29dIEIgQyknKSkgKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X21hdGNoX2xhYmVscworICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgnKEEgQiBDKScpCisgICAgbGFiZWxzID0gQHdpemFyZC5tYXRjaCggdHJlZSwgJyglYTpBICViOkIgJWM6QyknICkKKyAgICAKKyAgICBhc3NlcnRfZXF1YWwoJ0EnLCBsYWJlbHNbJ2EnXS50b19zKQorICAgIGFzc2VydF9lcXVhbCgnQicsIGxhYmVsc1snYiddLnRvX3MpCisgICAgYXNzZXJ0X2VxdWFsKCdDJywgbGFiZWxzWydjJ10udG9fcykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9tYXRjaF93aXRoX3dpbGRjYXJkX2xhYmVscworICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgnKEEgQiBDKScpCisgICAgbGFiZWxzID0gQHdpemFyZC5tYXRjaCh0cmVlLCAnKEEgJWI6LiAlYzouKScpCisgICAgYXNzZXJ0X2tpbmRfb2YoIEhhc2gsIGxhYmVscyApCisgICAgYXNzZXJ0X2VxdWFsKCdCJywgbGFiZWxzWydiJ10udG9fcykKKyAgICBhc3NlcnRfZXF1YWwoJ0MnLCBsYWJlbHNbJ2MnXS50b19zKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9tYXRjaF9sYWJlbHNfYW5kX3Rlc3RfdGV4dAorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgnKEEgQltmb29dIEMpJykKKyAgICBsYWJlbHMgPSBAd2l6YXJkLm1hdGNoKCB0cmVlLCAnKCVhOkEgJWI6Qltmb29dICVjOkMpJyApCisgICAgYXNzZXJ0X2tpbmRfb2YoIEhhc2gsIGxhYmVscyApCisgICAgYXNzZXJ0X2VxdWFsKCdBJywgbGFiZWxzWydhJ10udG9fcykKKyAgICBhc3NlcnRfZXF1YWwoJ2ZvbycsIGxhYmVsc1snYiddLnRvX3MpCisgICAgYXNzZXJ0X2VxdWFsKCdDJywgbGFiZWxzWydjJ10udG9fcykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9tYXRjaF9sYWJlbHNfaW5fbmVzdGVkX3RyZWUKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoJyhBIChCIEMpIChEIEUpKScpCisgICAgbGFiZWxzID0gQHdpemFyZC5tYXRjaCggdHJlZSwgJyglYTpBICglYjpCICVjOkMpICglZDpEICVlOkUpKScgKQorICAgIGFzc2VydF9raW5kX29mKCBIYXNoLCBsYWJlbHMgKQorICAgIGFzc2VydF9lcXVhbCgnQScsIGxhYmVsc1snYSddLnRvX3MpCisgICAgYXNzZXJ0X2VxdWFsKCdCJywgbGFiZWxzWydiJ10udG9fcykKKyAgICBhc3NlcnRfZXF1YWwoJ0MnLCBsYWJlbHNbJ2MnXS50b19zKQorICAgIGFzc2VydF9lcXVhbCgnRCcsIGxhYmVsc1snZCddLnRvX3MpCisgICAgYXNzZXJ0X2VxdWFsKCdFJywgbGFiZWxzWydlJ10udG9fcykKKyAgZW5kCisgIAorICAKKyAgZGVmIHRlc3RfZXF1YWxzCisgICAgdHJlZTEgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiBDKSIpCisgICAgdHJlZTIgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiBDKSIpCisgICAgYXNzZXJ0IEB3aXphcmQuZXF1YWxzKHRyZWUxLCB0cmVlMikKKyAgZW5kCisgIAorICAKKyAgZGVmIHRlc3RfZXF1YWxzX3dpdGhfdGV4dAorICAgIHRyZWUxID0gQHdpemFyZC5jcmVhdGUoIihBIEJbZm9vXSBDKSIpCisgICAgdHJlZTIgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQltmb29dIEMpIikKKyAgICBhc3NlcnQgQHdpemFyZC5lcXVhbHModHJlZTEsIHRyZWUyKQorICBlbmQKKyAgCisgIAorICBkZWYgdGVzdF9lcXVhbHNfd2l0aF9taXNtYXRjaGVkX3RleHQKKyAgICB0cmVlMSA9IEB3aXphcmQuY3JlYXRlKCIoQSBCW2Zvb10gQykiKQorICAgIHRyZWUyID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQykiKQorICAgIGFzc2VydCggIShAd2l6YXJkLmVxdWFscyh0cmVlMSwgdHJlZTIpKSApCisgIGVuZAorICAKKyAgCisgIGRlZiB0ZXN0X2VxdWFsc193aXRoX21pc21hdGNoZWRfbGlzdAorICAgIHRyZWUxID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQykiKQorICAgIHRyZWUyID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQSkiKQorICAgIGFzc2VydCggIShAd2l6YXJkLmVxdWFscyh0cmVlMSwgdHJlZTIpKSApCisgIGVuZAorICAKKyAgZGVmIHRlc3RfZXF1YWxzX3dpdGhfbWlzbWF0Y2hlZF9saXN0X2xlbmd0aAorICAgIHRyZWUxID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQykiKQorICAgIHRyZWUyID0gQHdpemFyZC5jcmVhdGUoIihBIEIpIikKKyAgICBhc3NlcnQoICEoQHdpemFyZC5lcXVhbHModHJlZTEsIHRyZWUyKSkgKQorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2ZpbmRfcGF0dGVybgorICAgIHRyZWUgPSBAd2l6YXJkLmNyZWF0ZSgiKEEgQiBDIChBW2Zvb10gQltiYXJdKSAoRCAoQVtiaWddIEJbZG9nXSkpKSIpCisgICAgc3VidHJlZXMgPSBAd2l6YXJkLmZpbmQodHJlZSwgIihBIEIpIikubWFwIHsgfHR8IHQudG9fcyB9CisgICAgYXNzZXJ0X2VxdWFsKCV3KGZvbyBiaWcpLCBzdWJ0cmVlcykKKyAgZW5kCisgIAorICBkZWYgdGVzdF9maW5kX3Rva2VuX3R5cGUKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoIihBIEIgQyAoQVtmb29dIEJbYmFyXSkgKEQgKEFbYmlnXSBCW2RvZ10pKSkiKQorICAgIHN1YnRyZWVzID0gQHdpemFyZC5maW5kKCB0cmVlLCBBICkubWFwIHsgfHR8IHQudG9fcyB9CisgICAgYXNzZXJ0X2VxdWFsKCV3KEEgZm9vIGJpZyksIHN1YnRyZWVzKQorICBlbmQKK2VuZAorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvcnVudGltZS9SdWJ5L3Rlc3QvdW5pdC90ZXN0LXRyZWVzLnJiIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC10cmVlcy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgxY2JlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3J1bnRpbWUvUnVieS90ZXN0L3VuaXQvdGVzdC10cmVlcy5yYgpAQCAtMCwwICsxLDg0MyBAQAorIyEvdXNyL2Jpbi9ydWJ5CisjIGVuY29kaW5nOiB1dGYtOAorCityZXF1aXJlICdhbnRscjMnCityZXF1aXJlICd0ZXN0L3VuaXQnCityZXF1aXJlICdzcGVjJworCitpbmNsdWRlIEFOVExSMworaW5jbHVkZSBBTlRMUjM6OkFTVAorCitjbGFzcyBUZXN0VHJlZU5vZGVTdHJlYW0gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBkZWYgc2V0dXAKKyAgICBAYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yLm5ldworICBlbmQKKyAgCisgIGRlZiBuZXdfc3RyZWFtKHQpCisgICAgQ29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KHQpCisgIGVuZAorICAKKyAgZGVmIHRlc3Rfc2luZ2xlX25vZGUKKyAgICB0ID0gQ29tbW9uVHJlZS5uZXcoQ29tbW9uVG9rZW4ubmV3IHsgfHR8IHQudHlwZSA9IDEwMSB9KQorICAgIHN0cmVhbSA9IG5ld19zdHJlYW0odCkKKyAgICBleHBlY3RpbmcgPSAnMTAxJworICAgIAorICAgIGZvdW5kID0gbm9kZXNfb25seV9zdHJpbmcoc3RyZWFtKQorICAgIAorICAgIGZvdW5kLnNob3VsZCA9PSBleHBlY3RpbmcKKyAgICAKKyAgICBleHBlY3RpbmcgPSAnPFVOS05PV046IDEwMT4nCisgICAgZm91bmQgPSBzdHJlYW0uaW5zcGVjdAorICAgIAorICAgIGZvdW5kLnNob3VsZCA9PSBleHBlY3RpbmcKKyAgZW5kCisgIAorICBkZWYgdGVzdF90d29fY2hpbGRyZW5fb2ZfbmlsX3Jvb3QKKyAgICB2ID0gQ2xhc3MubmV3KENvbW1vblRyZWUpIGRvCisgICAgICBkZWYgaW5pdGlhbGl6ZSh0b2tlbiA9IG5pbCwgdHlwZSA9IG5pbCwgeCA9IG5pbCkKKyAgICAgICAgQHggPSB4CisgICAgICAgIHN1cGVyKHRva2VuIHx8IChDb21tb25Ub2tlbi5uZXcgeyB8dHwgdC50eXBlID0gdHlwZSB9IGlmIHR5cGUpKQorICAgICAgZW5kCisgICAgICBkZWYgdG9fcworICAgICAgICAoQHRva2VuLnRleHQgcmVzY3VlICcnKSArICc8Vj4nCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICByb290XzAgPSBAYWRhcHRvci5jcmVhdGVfZmxhdF9saXN0CisgICAgdCA9IHYubmV3KG5pbCwgMTAxLCAyKQorICAgIHUgPSB2Lm5ldyBDb21tb25Ub2tlbi5jcmVhdGUoOnR5cGUgPT4gMTAyLCA6dGV4dCA9PiAnMTAyJykKKyAgICBAYWRhcHRvci5hZGRfY2hpbGQocm9vdF8wLCB0KQorICAgIEBhZGFwdG9yLmFkZF9jaGlsZChyb290XzAsIHUpCisgICAgCisgICAgYXNzZXJ0KHJvb3RfMC5wYXJlbnQubmlsPykKKyAgICByb290XzAuY2hpbGRfaW5kZXguc2hvdWxkID09IC0xCisgICAgdC5jaGlsZF9pbmRleC5zaG91bGQgPT0gMAorICAgIHUuY2hpbGRfaW5kZXguc2hvdWxkID09IDEKKyAgICAKKyAgZW5kCisgIAorICBkZWYgdGVzdF80X25vZGVzCisgICAgdCA9IENvbW1vblRyZWUubmV3IENvbW1vblRva2VuWzEwMV0KKyAgICB0LmFkZF9jaGlsZCggQ29tbW9uVHJlZS5uZXcgQ29tbW9uVG9rZW5bMTAyXSApCisgICAgdC5jaGlsZCgwKS5hZGRfY2hpbGQoQ29tbW9uVHJlZS5uZXcgQ29tbW9uVG9rZW5bMTAzXSkKKyAgICB0LmFkZF9jaGlsZChDb21tb25UcmVlLm5ldyBDb21tb25Ub2tlblsxMDRdKQorICAgIAorICAgIHN0cmVhbSA9IG5ld19zdHJlYW0odCkKKworICAgIGV4cGVjdGluZyA9ICIxMDEgMTAyIDEwMyAxMDQiCisgICAgZm91bmQgPSBub2Rlc19vbmx5X3N0cmluZyhzdHJlYW0pCisgICAgZm91bmQuc2hvdWxkID09IGV4cGVjdGluZworICAgIAorICAgIGV4cGVjdGluZyA9ICI8VU5LTk9XTjogMTAxPiA8RE9XTj4gPFVOS05PV046IDEwMj4gPERPV04+IDxVTktOT1dOOiAxMDM+IDxVUD4gPFVOS05PV046IDEwND4gPFVQPiIKKyAgICBmb3VuZCA9IHN0cmVhbS5pbnNwZWN0CisgICAgZm91bmQuc2hvdWxkID09IGV4cGVjdGluZworICBlbmQKKyAgCisgIGRlZiB0ZXN0X2xpc3QKKyAgICByb290ID0gQ29tbW9uVHJlZS5uZXcobmlsKQorICAgIHQgPSBDb21tb25UcmVlLm5ldyBDb21tb25Ub2tlblsxMDFdCisgICAgdC5hZGRfY2hpbGQgQ29tbW9uVHJlZS5uZXcoQ29tbW9uVG9rZW5bMTAyXSkKKyAgICB0LmNoaWxkKDApLmFkZF9jaGlsZChDb21tb25UcmVlLm5ldyhDb21tb25Ub2tlblsxMDNdKSkKKyAgICB0LmFkZF9jaGlsZChDb21tb25UcmVlLm5ldyhDb21tb25Ub2tlblsxMDRdKSkKKyAgICAKKyAgICB1ID0gQ29tbW9uVHJlZS5uZXcgQ29tbW9uVG9rZW5bMTA1XQorICAgIAorICAgIHJvb3QuYWRkX2NoaWxkKHQpCisgICAgcm9vdC5hZGRfY2hpbGQodSkKKyAgICAKKyAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcocm9vdCkKKyAgICAKKyAgICBleHBlY3RpbmcgPSAnMTAxIDEwMiAxMDMgMTA0IDEwNScKKyAgICBmb3VuZCA9IG5vZGVzX29ubHlfc3RyaW5nKHN0cmVhbSkKKyAgICBmb3VuZC5zaG91bGQgPT0gZXhwZWN0aW5nCisgICAgCisgICAgZXhwZWN0aW5nID0gIjxVTktOT1dOOiAxMDE+IDxET1dOPiA8VU5LTk9XTjogMTAyPiA8RE9XTj4gPFVOS05PV046IDEwMz4gPFVQPiA8VU5LTk9XTjogMTA0PiA8VVA+IDxVTktOT1dOOiAxMDU+IgorICAgIGZvdW5kID0gc3RyZWFtLmluc3BlY3QKKyAgICBmb3VuZC5zaG91bGQgPT0gZXhwZWN0aW5nCisgIGVuZAorICAKKyAgZGVmIHRlc3RfZmxhdF9saXN0CisgICAgcm9vdCA9IENvbW1vblRyZWUubmV3KG5pbCkKKyAgICAKKyAgICByb290LmFkZF9jaGlsZCBDb21tb25UcmVlLm5ldyhDb21tb25Ub2tlblsxMDFdKQorICAgIHJvb3QuYWRkX2NoaWxkKENvbW1vblRyZWUubmV3KENvbW1vblRva2VuWzEwMl0pKQorICAgIHJvb3QuYWRkX2NoaWxkKENvbW1vblRyZWUubmV3KENvbW1vblRva2VuWzEwM10pKQorICAgIAorICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyggcm9vdCApCisgICAgCisgICAgZXhwZWN0aW5nID0gJzEwMSAxMDIgMTAzJworICAgIGZvdW5kID0gbm9kZXNfb25seV9zdHJpbmcoc3RyZWFtKQorICAgIGZvdW5kLnNob3VsZCA9PSBleHBlY3RpbmcKKyAgICAKKyAgICBleHBlY3RpbmcgPSAnPFVOS05PV046IDEwMT4gPFVOS05PV046IDEwMj4gPFVOS05PV046IDEwMz4nCisgICAgZm91bmQgPSBzdHJlYW0uaW5zcGVjdAorICAgIGZvdW5kLnNob3VsZCA9PSBleHBlY3RpbmcKKyAgZW5kCisgIAorICBkZWYgdGVzdF9saXN0X3dpdGhfb25lX25vZGUKKyAgICByb290ID0gQ29tbW9uVHJlZS5uZXcobmlsKQorICAgIAorICAgIHJvb3QuYWRkX2NoaWxkKENvbW1vblRyZWUubmV3KENvbW1vblRva2VuWzEwMV0pKQorICAgIAorICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyhyb290KQorICAgIAorICAgIGV4cGVjdGluZyA9ICcxMDEnCisgICAgZm91bmQgPSBub2Rlc19vbmx5X3N0cmluZyhzdHJlYW0pCisgICAgZm91bmQuc2hvdWxkID09IGV4cGVjdGluZworICAgIAorICAgIGV4cGVjdGluZyA9ICI8VU5LTk9XTjogMTAxPiIKKyAgICBmb3VuZCA9IHN0cmVhbS5pbnNwZWN0CisgICAgZm91bmQuc2hvdWxkID09IGV4cGVjdGluZworICBlbmQKKyAgCisgIGRlZiB0ZXN0X2Ffb3Zlcl9iCisgICAgdCA9IENvbW1vblRyZWUubmV3KENvbW1vblRva2VuWzEwMV0pCisgICAgdC5hZGRfY2hpbGQoQ29tbW9uVHJlZS5uZXcoQ29tbW9uVG9rZW5bMTAyXSkpCisgICAgCisgICAgc3RyZWFtID0gbmV3X3N0cmVhbSh0KQorICAgIGV4cGVjdGluZyA9ICcxMDEgMTAyJworICAgIGZvdW5kID0gbm9kZXNfb25seV9zdHJpbmcoc3RyZWFtKQorICAgIGZvdW5kLnNob3VsZCA9PSBleHBlY3RpbmcKKyAgICAKKyAgICBleHBlY3RpbmcgPSAnPFVOS05PV046IDEwMT4gPERPV04+IDxVTktOT1dOOiAxMDI+IDxVUD4nCisgICAgZm91bmQgPSBzdHJlYW0uaW5zcGVjdAorICAgIGZvdW5kLnNob3VsZCA9PSBleHBlY3RpbmcKKyAgZW5kCisgIAorICBkZWYgdGVzdF9MVAorICAgICMgXigxMDEgXigxMDIgMTAzKSAxMDQpCisgICAgdCA9IENvbW1vblRyZWUubmV3IENvbW1vblRva2VuWzEwMV0KKyAgICB0LmFkZF9jaGlsZCBDb21tb25UcmVlLm5ldyhDb21tb25Ub2tlblsxMDJdKQorICAgIHQuY2hpbGQoMCkuYWRkX2NoaWxkKENvbW1vblRyZWUubmV3KENvbW1vblRva2VuWzEwM10pKQorICAgIHQuYWRkX2NoaWxkKENvbW1vblRyZWUubmV3KENvbW1vblRva2VuWzEwNF0pKQorICAgIAorICAgIHN0cmVhbSA9IG5ld19zdHJlYW0odCkKKyAgICBbMTAxLCBET1dOLCAxMDIsIERPV04sIDEwMywgVVAsIDEwNCwgVVAsIEVPRl0uZWFjaF93aXRoX2luZGV4IGRvIHx0eXBlLCBpbmRleHwKKyAgICAgIHN0cmVhbS5sb29rKGluZGV4ICsgMSkudHlwZS5zaG91bGQgPT0gdHlwZQorICAgIGVuZAorICAgIHN0cmVhbS5sb29rKDEwMCkudHlwZS5zaG91bGQgPT0gRU9GCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbWFya19yZXdpbmRfZW50aXJlCisgICAgIyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSkgMTA0IDEwNSkKKyAgICByMCA9IG5ld19ub2RlIG5ld190b2tlbigxMDEpCisgICAgcjEgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTAyKQorICAgIHIwLmFkZF9jaGlsZChyMSkKKyAgICByMS5hZGRfY2hpbGQobmV3X25vZGUgbmV3X3Rva2VuKDEwMykpCisgICAgcjIgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTA2KQorICAgIHIyLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNyApCisgICAgcjEuYWRkX2NoaWxkIHIyCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA0ICkKKyAgICByMC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDUgKQorICAgIAorICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyhyMCkKKyAgICBtID0gc3RyZWFtLm1hcmsKKyAgICAxMy50aW1lcyB7IHN0cmVhbS5sb29rKDEpOyBzdHJlYW0uY29uc3VtZSB9ICMgY29uc3VtZSB1bnRpbCBlbmQKKyAgICAKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSBFT0YKKyAgICBzdHJlYW0ubG9vaygtMSkudHlwZS5zaG91bGQgPT0gVVAKKyAgICBzdHJlYW0ucmV3aW5kKG0pCisgICAgCisgICAgMTMudGltZXMgeyBzdHJlYW0ubG9vaygxKTsgc3RyZWFtLmNvbnN1bWUgfSAjIGNvbnN1bWUgdW50aWwgZW5kCisgICAgCisgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gRU9GCisgICAgc3RyZWFtLmxvb2soLTEpLnR5cGUuc2hvdWxkID09IFVQCisgIGVuZAorICAKKyAgZGVmIHRlc3RfbWFya19yZXdpbmRfaW5fbWlkZGxlCisgICAgIyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSkgMTA0IDEwNSkKKyAgICByMCA9IG5ld19ub2RlIG5ld190b2tlbigxMDEpCisgICAgcjEgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTAyKQorICAgIHIwLmFkZF9jaGlsZCByMQorICAgIHIxLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMyApCisgICAgcjIgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTA2KQorICAgIHIyLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNyApCisgICAgcjEuYWRkX2NoaWxkIHIyCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA0ICkKKyAgICByMC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDUgKQorICAgIAorICAgIHN0cmVhbSA9IENvbW1vblRyZWVOb2RlU3RyZWFtLm5ldyhyMCkKKyAgICA3LnRpbWVzIHsgc3RyZWFtLmNvbnN1bWUgfQorICAgIAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwNworICAgIG0gPSBzdHJlYW0ubWFyaworICAgIDQudGltZXMgeyBzdHJlYW0uY29uc3VtZSB9CisgICAgc3RyZWFtLnJld2luZChtKQorICAgIAorICAgIFsxMDcsIFVQLCBVUCwgMTA0XS5lYWNoIGRvIHx2YWx8CisgICAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSB2YWwKKyAgICAgIHN0cmVhbS5jb25zdW1lCisgICAgZW5kCisgICAgIyBwYXN0IHJld2luZCBwb3NpdGlvbiBub3cKKyAgICBbMTA1LCBVUF0uZWFjaCBkbyB8dmFsfAorICAgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gdmFsCisgICAgICBzdHJlYW0uY29uc3VtZQorICAgIGVuZAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IEVPRgorICAgIHN0cmVhbS5sb29rKC0xKS50eXBlLnNob3VsZCA9PSBVUAorICBlbmQKKyAgCisgIGRlZiB0ZXN0X21hcmtfcmV3aW5kX25lc3RlZAorICAgICMgXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykpIDEwNCAxMDUpCisgICAgcjAgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTAxKQorICAgIHIxID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwMikKKyAgICByMC5hZGRfY2hpbGQgcjEKKyAgICByMS5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKQorICAgIHIyID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwNikKKyAgICByMi5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDcgKQorICAgIHIxLmFkZF9jaGlsZCByMgorICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNCApCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA1ICkKKyAgICAKKyAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcocjApCisgICAgbSA9IHN0cmVhbS5tYXJrCisgICAgMi50aW1lcyB7IHN0cmVhbS5jb25zdW1lIH0KKyAgICBtMiA9IHN0cmVhbS5tYXJrCisgICAgNC50aW1lcyB7IHN0cmVhbS5jb25zdW1lIH0KKyAgICBzdHJlYW0ucmV3aW5kKG0yKQorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwMgorICAgIHN0cmVhbS5jb25zdW1lCisgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gRE9XTgorICAgIHN0cmVhbS5jb25zdW1lCisgICAgCisgICAgc3RyZWFtLnJld2luZChtKQorICAgIFsxMDEsIERPV04sIDEwMl0uZWFjaCBkbyB8dmFsfAorICAgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gdmFsCisgICAgICBzdHJlYW0uY29uc3VtZQorICAgIGVuZAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IERPV04KKyAgZW5kCisgIAorICBkZWYgdGVzdF9zZWVrCisgICAgIyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisgICAgIyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgICAgIyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVUCBVUCAxMDQgMTA1IFVQIEVPRgorCisgICAgcjAgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTAxKQorICAgIHIxID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwMikKKyAgICByMC5hZGRfY2hpbGQgcjEKKyAgICByMS5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKQorICAgIHIyID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwNikKKyAgICByMi5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDcgKQorICAgIHIxLmFkZF9jaGlsZCByMgorICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNCApCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA1ICkKKyAgICAKKyAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcocjApCisgICAgMy50aW1lcyB7IHN0cmVhbS5jb25zdW1lIH0KKyAgICBzdHJlYW0uc2Vlayg3KQorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwNworICAgIDMudGltZXMgeyBzdHJlYW0uY29uc3VtZSB9CisgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gMTA0CisgIGVuZAorICAKKyAgZGVmIHRlc3Rfc2Vla19mcm9tX3N0YXJ0CisgICAgcjAgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTAxKQorICAgIHIxID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwMikKKyAgICByMC5hZGRfY2hpbGQgcjEKKyAgICByMS5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKQorICAgIHIyID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwNikKKyAgICByMi5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDcgKQorICAgIHIxLmFkZF9jaGlsZCByMgorICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNCApCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA1ICkKKyAgICAKKyAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcocjApCisgICAgc3RyZWFtLnNlZWsoNykKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSAxMDcKKyAgICAzLnRpbWVzIHsgc3RyZWFtLmNvbnN1bWUgfQorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwNAorICBlbmQKKyAgCisgIGRlZiBub2Rlc19vbmx5X3N0cmluZyhub2RlcykKKyAgICBidWZmZXIgPSBbXQorICAgIG5vZGVzLnNpemUudGltZXMgZG8gfGluZGV4fAorICAgICAgdCA9IG5vZGVzLmxvb2soaW5kZXggKyAxKQorICAgICAgdHlwZSA9IG5vZGVzLnRyZWVfYWRhcHRvci50eXBlX29mKHQpCisgICAgICBidWZmZXIgPDwgdHlwZS50b19zIHVubGVzcyB0eXBlID09IERPV04gb3IgdHlwZSA9PSBVUAorICAgIGVuZAorICAgIHJldHVybiBidWZmZXIuam9pbignICcpCisgIGVuZAorICAKKyAgZGVmIG5ld190b2tlbih0eXBlLCBvcHRzID0ge30pCisgICAgb3B0c1s6dHlwZV0gPSB0eXBlCisgICAgQ29tbW9uVG9rZW4uY3JlYXRlKG9wdHMpCisgIGVuZAorICBkZWYgbmV3X25vZGUodG9rZW4pCisgICAgQ29tbW9uVHJlZS5uZXcodG9rZW4pCisgIGVuZAorCisKK2VuZAorCitjbGFzcyBUZXN0Q29tbW9uVHJlZU5vZGVTdHJlYW0gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBkZWYgc2V0dXAKKyAgICAjIGJlZm9yZS1lYWNoLXRlc3QgY29kZQorICBlbmQKKyAgZGVmIHRlYXJkb3duCisgICAgIyBhZnRlci1lYWNoLXRlc3QgY29kZQorICBlbmQKKyAgCisgICMgdnZ2dnZ2dnYgdGVzdHMgdnZ2dnZ2dnZ2CisgIAorICBkZWYgdGVzdF9wdXNoX3BvcAorICAgIHIwID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwMSkKKyAgICByMSA9IG5ld19ub2RlIG5ld190b2tlbigxMDIpCisgICAgcjEuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkKKyAgICByMC5hZGRfY2hpbGQgcjEKKyAgICByMiA9IG5ld19ub2RlIG5ld190b2tlbigxMDQpCisgICAgcjIuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA1ICkKKyAgICByMC5hZGRfY2hpbGQgcjIKKyAgICByMyA9IG5ld19ub2RlIG5ld190b2tlbigxMDYpCisgICAgcjMuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA3ICkKKyAgICByMC5hZGRfY2hpbGQgcjMKKyAgICByMC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDggKQorICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwOSApCisgICAgCisgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KHIwKQorICAgIGV4cGVjdGluZyA9ICc8VU5LTk9XTjogMTAxPiA8RE9XTj4gPFVOS05PV046IDEwMj4gPERPV04+IDxVTktOT1dOOiAxMDM+IDxVUD4gPFVOS05PV046IDEwND4gJyArCisgICAgICAgICAgICAgICAgJzxET1dOPiA8VU5LTk9XTjogMTA1PiA8VVA+IDxVTktOT1dOOiAxMDY+IDxET1dOPiA8VU5LTk9XTjogMTA3PiA8VVA+ICcgKworICAgICAgICAgICAgICAgICc8VU5LTk9XTjogMTA4PiA8VU5LTk9XTjogMTA5PiA8VVA+JworICAgIGZvdW5kID0gc3RyZWFtLmluc3BlY3QKKyAgICBmb3VuZC5zaG91bGQgPT0gZXhwZWN0aW5nCisgICAgCisgICAgaW5kZXhfb2ZfMTAyID0gMgorICAgIGluZGV4X29mXzEwNyA9IDEyCisgICAgaW5kZXhfb2ZfMTA3LnRpbWVzIHsgc3RyZWFtLmNvbnN1bWUgfQorICAgIAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwNworICAgIHN0cmVhbS5wdXNoKGluZGV4X29mXzEwMikKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSAxMDIKKyAgICBzdHJlYW0uY29uc3VtZQorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IERPV04KKyAgICBzdHJlYW0uY29uc3VtZQorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwMworICAgIHN0cmVhbS5jb25zdW1lCisgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gVVAKKyAgICBzdHJlYW0ucG9wCisgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gMTA3CisgIGVuZAorICAKKyAgZGVmIHRlc3RfbmVzdGVkX3B1c2hfcG9wCisgICAgcjAgPSBuZXdfbm9kZSBuZXdfdG9rZW4oMTAxKQorICAgIHIxID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwMikKKyAgICByMS5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKQorICAgIHIwLmFkZF9jaGlsZCByMQorICAgIHIyID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwNCkKKyAgICByMi5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDUgKQorICAgIHIwLmFkZF9jaGlsZCByMgorICAgIHIzID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwNikKKyAgICByMy5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDcgKQorICAgIHIwLmFkZF9jaGlsZCByMworICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwOCApCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA5ICkKKyAgICAKKyAgICBzdHJlYW0gPSBDb21tb25UcmVlTm9kZVN0cmVhbS5uZXcocjApCisgICAgCisgICAgaW5kZXhfb2ZfMTAyID0gMgorICAgIGluZGV4X29mXzEwNyA9IDEyCisgICAgCisgICAgaW5kZXhfb2ZfMTA3LnRpbWVzIHsgc3RyZWFtLmNvbnN1bWUgfQorICAgIAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IDEwNworICAgIHN0cmVhbS5wdXNoKGluZGV4X29mXzEwMikKKyAgICBbMTAyLCBET1dOLCAxMDNdLmVhY2ggZG8gfHZhbHwKKyAgICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IHZhbAorICAgICAgc3RyZWFtLmNvbnN1bWUKKyAgICBlbmQKKyAgICAKKyAgICBpbmRleF9vZl8xMDQgPSA2CisgICAgc3RyZWFtLnB1c2goaW5kZXhfb2ZfMTA0KQorICAgIFsxMDQsRE9XTiwxMDVdLmVhY2ggZG8gfHZhbHwKKyAgICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IHZhbAorICAgICAgc3RyZWFtLmNvbnN1bWUKKyAgICBlbmQKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSBVUAorICAgIHN0cmVhbS5wb3AKKyAgICAKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSBVUAorICAgIHN0cmVhbS5wb3AKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSAxMDcKKyAgZW5kCisgIAorICBkZWYgdGVzdF9wdXNoX3BvcF9mcm9tX2VvZgorICAgIHIwID0gbmV3X25vZGUgbmV3X3Rva2VuKDEwMSkKKyAgICByMSA9IG5ld19ub2RlIG5ld190b2tlbigxMDIpCisgICAgcjEuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkKKyAgICByMC5hZGRfY2hpbGQgcjEKKyAgICByMiA9IG5ld19ub2RlIG5ld190b2tlbigxMDQpCisgICAgcjIuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA1ICkKKyAgICByMC5hZGRfY2hpbGQgcjIKKyAgICByMyA9IG5ld19ub2RlIG5ld190b2tlbigxMDYpCisgICAgcjMuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA3ICkKKyAgICByMC5hZGRfY2hpbGQgcjMKKyAgICByMC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDggKQorICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwOSApCisgICAgCisgICAgc3RyZWFtID0gQ29tbW9uVHJlZU5vZGVTdHJlYW0ubmV3KHIwKQorICAgIHN0cmVhbS5jb25zdW1lIHVudGlsIHN0cmVhbS5wZWVrKDEpID09IEVPRgorICAgIAorICAgIGluZGV4X29mXzEwMiA9IDIKKyAgICBpbmRleF9vZl8xMDQgPSA2CisgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gRU9GCisgICAgCisgICAgc3RyZWFtLnB1c2goaW5kZXhfb2ZfMTAyKQorICAgIFsxMDIsIERPV04sIDEwM10uZWFjaCBkbyB8dmFsfAorICAgICAgc3RyZWFtLmxvb2soMSkudHlwZS5zaG91bGQgPT0gdmFsCisgICAgICBzdHJlYW0uY29uc3VtZQorICAgIGVuZAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IFVQCisgICAgCisgICAgc3RyZWFtLnBvcAorICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IEVPRgorICAgIAorICAgIHN0cmVhbS5wdXNoKGluZGV4X29mXzEwNCkKKyAgICBbMTA0LCBET1dOLCAxMDVdLmVhY2ggZG8gfHZhbHwKKyAgICAgIHN0cmVhbS5sb29rKDEpLnR5cGUuc2hvdWxkID09IHZhbAorICAgICAgc3RyZWFtLmNvbnN1bWUKKyAgICBlbmQKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSBVUAorICAgIAorICAgIHN0cmVhbS5wb3AKKyAgICBzdHJlYW0ubG9vaygxKS50eXBlLnNob3VsZCA9PSBFT0YKKyAgZW5kCisgIAorICAKKyAgZGVmIG5ld190b2tlbih0eXBlLCBvcHRzID0ge30pCisgICAgb3B0c1s6dHlwZV0gPSB0eXBlCisgICAgQ29tbW9uVG9rZW4uY3JlYXRlKG9wdHMpCisgIGVuZAorICBkZWYgbmV3X25vZGUodG9rZW4pCisgICAgQ29tbW9uVHJlZS5uZXcodG9rZW4pCisgIGVuZAorZW5kCisKKworY2xhc3MgVGVzdENvbW1vblRyZWUgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBkZWYgc2V0dXAKKyAgICBAYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yLm5ldworICBlbmQKKyAgZGVmIHRlYXJkb3duCisgICAgIyBhZnRlci1lYWNoLXRlc3QgY29kZQorICBlbmQKKyAgCisgICMgdnZ2dnZ2dnYgdGVzdHMgdnZ2dnZ2dnZ2CisgIAorICBkZWYgdGVzdF9zaW5nbGVfbm9kZQorICAgIHQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMSApCisgICAgYXNzZXJ0X25pbCB0LnBhcmVudAorICAgIHQuY2hpbGRfaW5kZXguc2hvdWxkID09IC0xCisgIGVuZAorICAKKyAgZGVmIHRlc3RfNF9ub2RlcworICAgICMgXigxMDEgXigxMDIgMTAzKSAxMDQpCisgICAgcjAgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMSApCisgICAgcjAuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAyICkKKyAgICByMC5jaGlsZCgwKS5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKQorICAgIHIwLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNCApCisgICAgCisgICAgYXNzZXJ0X25pbCByMC5wYXJlbnQKKyAgICByMC5jaGlsZF9pbmRleC5zaG91bGQgPT0gLTEKKyAgZW5kCisgIAorICBkZWYgdGVzdF9saXN0CisgICAgIyBeKG5pbCAxMDEgMTAyIDEwMykKKyAgICByMCA9IENvbW1vblRyZWUubmV3KG5pbCkKKyAgICBjMCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAxICkKKyAgICByMC5hZGRfY2hpbGQgYzAKKyAgICBjMSA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAyICkKKyAgICByMC5hZGRfY2hpbGQgYzEKKyAgICBjMiA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkKKyAgICByMC5hZGRfY2hpbGQgYzIKKyAgICAKKyAgICBhc3NlcnRfbmlsIHIwLnBhcmVudAorICAgIHIwLmNoaWxkX2luZGV4LnNob3VsZCA9PSAtMQorICAgIGMwLnBhcmVudC5zaG91bGQgPT0gcjAKKyAgICBjMC5jaGlsZF9pbmRleC5zaG91bGQgPT0gMAorICAgIGMxLnBhcmVudC5zaG91bGQgPT0gcjAKKyAgICBjMS5jaGlsZF9pbmRleC5zaG91bGQgPT0gMQorICAgIGMyLnBhcmVudC5zaG91bGQgPT0gcjAKKyAgICBjMi5jaGlsZF9pbmRleC5zaG91bGQgPT0gMgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2xpc3QyCisgICAgIyBeKG5pbCAxMDEgMTAyIDEwMykKKyAgICByb290ID0gbmV3X25vZGUoIG5ld190b2tlbiA1ICkKKyAgICByMCA9IENvbW1vblRyZWUubmV3KG5pbCkKKyAgICBjMCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAxICkKKyAgICByMC5hZGRfY2hpbGQgYzAKKyAgICBjMSA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAyICkKKyAgICByMC5hZGRfY2hpbGQgYzEKKyAgICBjMiA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkKKyAgICByMC5hZGRfY2hpbGQgYzIKKyAgICAKKyAgICByb290LmFkZF9jaGlsZCByMAorICAgIAorICAgIGFzc2VydF9uaWwgcm9vdC5wYXJlbnQKKyAgICByb290LmNoaWxkX2luZGV4LnNob3VsZCA9PSAtMQorICAgIGMwLnBhcmVudC5zaG91bGQgPT0gcm9vdAorICAgIGMwLmNoaWxkX2luZGV4LnNob3VsZCA9PSAwCisgICAgYzEucGFyZW50LnNob3VsZCA9PSByb290ICAgICAgICAgICAgIyBub3RlIC0tIGFjdHVhbCBweXRob24gdGVzdHMgYWxsIHVzZSBjMCBoZXJlLCB3aGljaCBpIHRoaW5rIG1pZ2h0IGJlIHdyb25nCisgICAgYzEuY2hpbGRfaW5kZXguc2hvdWxkID09IDEKKyAgICBjMi5wYXJlbnQuc2hvdWxkID09IHJvb3QgICAgICAgICAgICAjIG5vdGUgLS0gYWN0dWFsIHB5dGhvbiB0ZXN0cyBhbGwgdXNlIGMwIGhlcmUsIHdoaWNoIGkgdGhpbmsgbWlnaHQgYmUgd3JvbmcKKyAgICBjMi5jaGlsZF9pbmRleC5zaG91bGQgPT0gMgorICBlbmQKKyAgCisgIGRlZiB0ZXN0X2FkZF9saXN0X3RvX2V4aXN0X2NoaWxkcmVuCisgICAgcm9vdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gNSApCisgICAgcm9vdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA2ICkKKyAgICAKKyAgICByMCA9IENvbW1vblRyZWUubmV3KG5pbCkKKyAgICBjMCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAxICkKKyAgICByMC5hZGRfY2hpbGQgYzAKKyAgICBjMSA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAyICkKKyAgICByMC5hZGRfY2hpbGQgYzEKKyAgICBjMiA9IG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkKKyAgICByMC5hZGRfY2hpbGQgYzIKKyAgICAjIF4obmlsIGMwPTEwMSBjMT0xMDIgYzI9MTAzKQorICAgIAorICAgIHJvb3QuYWRkX2NoaWxkKHIwKQorICAgIAorICAgIGFzc2VydF9uaWwgcm9vdC5wYXJlbnQKKyAgICByb290LmNoaWxkX2luZGV4LnNob3VsZCA9PSAtMQorICAgIGMwLnBhcmVudC5zaG91bGQgPT0gcm9vdAorICAgIGMwLmNoaWxkX2luZGV4LnNob3VsZCA9PSAxCisgICAgYzEucGFyZW50LnNob3VsZCA9PSByb290CisgICAgYzEuY2hpbGRfaW5kZXguc2hvdWxkID09IDIKKyAgICBjMi5wYXJlbnQuc2hvdWxkID09IHJvb3QKKyAgICBjMi5jaGlsZF9pbmRleC5zaG91bGQgPT0gMworICBlbmQKKyAgCisgIGRlZiB0ZXN0X2NvcHlfdHJlZQorICAgIHIwID0gbmV3X25vZGUoIG5ld190b2tlbiAxMDEgKQorICAgIHIxID0gbmV3X25vZGUoIG5ld190b2tlbiAxMDIgKQorICAgIHIyID0gbmV3X25vZGUoIG5ld190b2tlbiAxMDYgKQorICAgIHIwLmFkZF9jaGlsZCggcjEgKQorICAgIHIxLmFkZF9jaGlsZCggbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKSApCisgICAgcjIuYWRkX2NoaWxkKCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwNyApICkKKyAgICByMS5hZGRfY2hpbGQoIHIyICkKKyAgICByMC5hZGRfY2hpbGQoIG5ld19ub2RlKCBuZXdfdG9rZW4gMTA0ICkgKQorICAgIHIwLmFkZF9jaGlsZCggbmV3X25vZGUoIG5ld190b2tlbiAxMDUgKSApCisgICAgCisgICAgZHVwID0gQGFkYXB0b3IuY29weV90cmVlKCByMCApCisgICAgYXNzZXJ0X25pbCBkdXAucGFyZW50CisgICAgZHVwLmNoaWxkX2luZGV4LnNob3VsZCA9PSAtMQorICAgIGR1cC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9iZWNvbWVfcm9vdAorICAgIG5ld19yb290ID0gbmV3X25vZGUoIG5ld190b2tlbiA1ICkKKyAgICAKKyAgICBvbGRfcm9vdCA9IG5ld19ub2RlIG5pbAorICAgIG9sZF9yb290LmFkZF9jaGlsZCggbmV3X25vZGUoIG5ld190b2tlbiAxMDEgKSApCisgICAgb2xkX3Jvb3QuYWRkX2NoaWxkKCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMiApICkKKyAgICBvbGRfcm9vdC5hZGRfY2hpbGQoIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkgKQorICAgIAorICAgIEBhZGFwdG9yLmJlY29tZV9yb290KG5ld19yb290LCBvbGRfcm9vdCkKKyAgICBuZXdfcm9vdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9iZWNvbWVfcm9vdDIKKyAgICBuZXdfcm9vdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gNSApCisgICAgCisgICAgb2xkX3Jvb3QgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMSApCisgICAgb2xkX3Jvb3QuYWRkX2NoaWxkKCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMiApICkKKyAgICBvbGRfcm9vdC5hZGRfY2hpbGQoIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkgKQorICAgIAorICAgIEBhZGFwdG9yLmJlY29tZV9yb290KG5ld19yb290LCBvbGRfcm9vdCkKKyAgICBuZXdfcm9vdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9iZWNvbWVfcm9vdDMKKyAgICBuZXdfcm9vdCA9IG5ld19ub2RlIG5pbAorICAgIG5ld19yb290LmFkZF9jaGlsZCggbmV3X25vZGUoIG5ld190b2tlbiA1ICkgKQorICAgIAorICAgIG9sZF9yb290ID0gbmV3X25vZGUgbmlsCisgICAgb2xkX3Jvb3QuYWRkX2NoaWxkKCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMSApICkKKyAgICBvbGRfcm9vdC5hZGRfY2hpbGQoIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAyICkgKQorICAgIG9sZF9yb290LmFkZF9jaGlsZCggbmV3X25vZGUoIG5ld190b2tlbiAxMDMgKSApCisgICAgCisgICAgQGFkYXB0b3IuYmVjb21lX3Jvb3QobmV3X3Jvb3QsIG9sZF9yb290KQorICAgIG5ld19yb290LnNhbml0eV9jaGVjaworICBlbmQKKyAgCisgIGRlZiB0ZXN0X2JlY29tZV9yb290NQorICAgIG5ld19yb290ID0gbmV3X25vZGUgbmlsCisgICAgbmV3X3Jvb3QuYWRkX2NoaWxkKCBuZXdfbm9kZSggbmV3X3Rva2VuIDUgKSApCisgICAgCisgICAgb2xkX3Jvb3QgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMSApCisgICAgb2xkX3Jvb3QuYWRkX2NoaWxkKCBuZXdfbm9kZSggbmV3X3Rva2VuIDEwMiApICkKKyAgICBvbGRfcm9vdC5hZGRfY2hpbGQoIG5ld19ub2RlKCBuZXdfdG9rZW4gMTAzICkgKQorICAgIAorICAgIEBhZGFwdG9yLmJlY29tZV9yb290KG5ld19yb290LCBvbGRfcm9vdCkKKyAgICBuZXdfcm9vdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9iZWNvbWVfcm9vdDYKKyAgICByb290XzAgPSBAYWRhcHRvci5jcmVhdGVfZmxhdF9saXN0CisgICAgcm9vdF8xID0gQGFkYXB0b3IuY3JlYXRlX2ZsYXRfbGlzdAorICAgIHJvb3RfMSA9IEBhZGFwdG9yLmJlY29tZV9yb290KCBuZXdfbm9kZSggbmV3X3Rva2VuIDUgKSwgcm9vdF8xICkKKyAgICAKKyAgICBAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfMSwgbmV3X25vZGUoIG5ld190b2tlbiA2ICkgKQorICAgIEBhZGFwdG9yLmFkZF9jaGlsZCggcm9vdF8wLCByb290XzEgKQorICAgIHJvb3RfMC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBsYWNlX3dpdGhfbm9fY2hpbGRyZW4KKyAgICB0ID0gbmV3X25vZGUoIG5ld190b2tlbiAxMDEgKQorICAgIG5ld19jaGlsZCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gNSApCisgICAgZXJyb3IgPSBmYWxzZQorICAgIGFzc2VydF9yYWlzZShJbmRleEVycm9yKSBkbworICAgICAgdC5yZXBsYWNlX2NoaWxkcmVuKDAsIDAsIG5ld19jaGlsZCkKKyAgICBlbmQKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBsYWNlX3dpdGhfb25lX2NoaWxkcmVuCisgICAgdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdhJyApCisgICAgYzAgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYicgKQorICAgIHQuYWRkX2NoaWxkKGMwKQorICAgIAorICAgIG5ld19jaGlsZCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdjJyApCisgICAgdC5yZXBsYWNlX2NoaWxkcmVuKDAsMCxuZXdfY2hpbGQpCisgICAgCisgICAgdC5pbnNwZWN0LnNob3VsZCA9PSAnKGEgYyknCisgICAgdC5zYW5pdHlfY2hlY2sKKworICBlbmQKKyAgZGVmIHRlc3RfcmVwbGFjZV9pbl9taWRkbGUKKyAgICB0ID0gbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2EnICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYicgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdjJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2QnICkKKyAgICAKKyAgICBuZXdfY2hpbGQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAneCcgKQorICAgIHQucmVwbGFjZV9jaGlsZHJlbigxLCAxLCBuZXdfY2hpbGQpCisgICAgdC5pbnNwZWN0LnNob3VsZCA9PSAnKGEgYiB4IGQpJworICAgIHQuc2FuaXR5X2NoZWNrCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcmVwbGFjZV9hdF9sZWZ0CisgICAgdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdhJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2InICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYycgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdkJyApCisgICAgCisgICAgbmV3X2NoaWxkID0gbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ3gnICkKKyAgICB0LnJlcGxhY2VfY2hpbGRyZW4oMCwgMCwgbmV3X2NoaWxkKQorICAgIHQuaW5zcGVjdC5zaG91bGQgPT0gJyhhIHggYyBkKScKKyAgICB0LnNhbml0eV9jaGVjaworICBlbmQKKyAgCisgIGRlZiB0ZXN0X3JlcGxhY2VfYXRfbGVmdAorICAgIHQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYScgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdiJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2MnICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnZCcgKQorICAgIAorICAgIG5ld19jaGlsZCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICd4JyApCisgICAgdC5yZXBsYWNlX2NoaWxkcmVuKDIsIDIsIG5ld19jaGlsZCkKKyAgICB0Lmluc3BlY3Quc2hvdWxkID09ICcoYSBiIGMgeCknCisgICAgdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBsYWNlX29uZV93aXRoX3R3b19hdF9sZWZ0CisgICAgdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdhJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2InICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYycgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdkJyApCisgICAgCisgICAgbmV3X2NoaWxkcmVuID0gQGFkYXB0b3IuY3JlYXRlX2ZsYXRfbGlzdAorICAgIG5ld19jaGlsZHJlbi5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ3gnICkKKyAgICBuZXdfY2hpbGRyZW4uYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICd5JyApCisgICAgCisgICAgdC5yZXBsYWNlX2NoaWxkcmVuKDAsIDAsIG5ld19jaGlsZHJlbikKKyAgICB0Lmluc3BlY3Quc2hvdWxkID09ICcoYSB4IHkgYyBkKScKKyAgICB0LnNhbml0eV9jaGVjaworICBlbmQKKyAgCisgIGRlZiB0ZXN0X3JlcGxhY2Vfb25lX3dpdGhfdHdvX2F0X3JpZ2h0CisgICAgdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdhJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2InICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYycgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdkJyApCisgICAgCisgICAgbmV3X2NoaWxkcmVuID0gQGFkYXB0b3IuY3JlYXRlX2ZsYXRfbGlzdAorICAgIG5ld19jaGlsZHJlbi5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ3gnICkKKyAgICBuZXdfY2hpbGRyZW4uYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICd5JyApCisgICAgCisgICAgdC5yZXBsYWNlX2NoaWxkcmVuKDIsIDIsIG5ld19jaGlsZHJlbikKKyAgICB0Lmluc3BlY3Quc2hvdWxkID09ICcoYSBiIGMgeCB5KScKKyAgICB0LnNhbml0eV9jaGVjaworICBlbmQKKyAgCisgIGRlZiB0ZXN0X3JlcGxhY2Vfb25lX3dpdGhfdHdvX2luX21pZGRsZQorICAgIHQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYScgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdiJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2MnICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnZCcgKQorICAgIAorICAgIG5ld19jaGlsZHJlbiA9IEBhZGFwdG9yLmNyZWF0ZV9mbGF0X2xpc3QKKyAgICBuZXdfY2hpbGRyZW4uYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICd4JyApCisgICAgbmV3X2NoaWxkcmVuLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAneScgKQorICAgIAorICAgIHQucmVwbGFjZV9jaGlsZHJlbigxLCAxLCBuZXdfY2hpbGRyZW4pCisgICAgdC5pbnNwZWN0LnNob3VsZCA9PSAnKGEgYiB4IHkgZCknCisgICAgdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBsYWNlX3R3b193aXRoX29uZV9hdF9sZWZ0CisgICAgdCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdhJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2InICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYycgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdkJyApCisgICAgCisgICAgbmV3X2NoaWxkID0gbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ3gnICkKKyAgICAKKyAgICB0LnJlcGxhY2VfY2hpbGRyZW4oMCwgMSwgbmV3X2NoaWxkKQorICAgIHQuaW5zcGVjdC5zaG91bGQgPT0gJyhhIHggZCknCisgICAgdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBsYWNlX3R3b193aXRoX29uZV9hdF9yaWdodAorICAgIHQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYScgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdiJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2MnICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnZCcgKQorICAgIAorICAgIG5ld19jaGlsZCA9IG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICd4JyApCisgICAgCisgICAgdC5yZXBsYWNlX2NoaWxkcmVuKDEsIDIsIG5ld19jaGlsZCkKKyAgICB0Lmluc3BlY3Quc2hvdWxkID09ICcoYSBiIHgpJworICAgIHQuc2FuaXR5X2NoZWNrCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcmVwbGFjZV9hbGxfd2l0aF9vbmUKKyAgICB0ID0gbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2EnICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYicgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdjJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2QnICkKKyAgICAKKyAgICBuZXdfY2hpbGQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAneCcgKQorICAgIAorICAgIHQucmVwbGFjZV9jaGlsZHJlbigwLCAyLCBuZXdfY2hpbGQpCisgICAgdC5pbnNwZWN0LnNob3VsZCA9PSAnKGEgeCknCisgICAgdC5zYW5pdHlfY2hlY2sKKyAgZW5kCisgIAorICBkZWYgdGVzdF9yZXBsYWNlX2FsbF93aXRoX3R3bworICAgIHQgPSBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnYScgKQorICAgIHQuYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICdiJyApCisgICAgdC5hZGRfY2hpbGQgbmV3X25vZGUoIG5ld190b2tlbiA5OSwgOnRleHQgPT4gJ2MnICkKKyAgICB0LmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAnZCcgKQorICAgIAorICAgIG5ld19jaGlsZHJlbiA9IEBhZGFwdG9yLmNyZWF0ZV9mbGF0X2xpc3QKKyAgICBuZXdfY2hpbGRyZW4uYWRkX2NoaWxkIG5ld19ub2RlKCBuZXdfdG9rZW4gOTksIDp0ZXh0ID0+ICd4JyApCisgICAgbmV3X2NoaWxkcmVuLmFkZF9jaGlsZCBuZXdfbm9kZSggbmV3X3Rva2VuIDk5LCA6dGV4dCA9PiAneScgKQorICAgIAorICAgIHQucmVwbGFjZV9jaGlsZHJlbigwLCAxLCBuZXdfY2hpbGRyZW4pCisgICAgdC5pbnNwZWN0LnNob3VsZCA9PSAnKGEgeCB5IGQpJworICAgIHQuc2FuaXR5X2NoZWNrCisgIGVuZAorICAKKyAgZGVmIG5ld190b2tlbih0eXBlLCBvcHRzID0ge30pCisgICAgb3B0c1s6dHlwZV0gPSB0eXBlCisgICAgQ29tbW9uVG9rZW4uY3JlYXRlKG9wdHMpCisgIGVuZAorICBkZWYgbmV3X25vZGUodG9rZW4pCisgICAgQ29tbW9uVHJlZS5uZXcodG9rZW4pCisgIGVuZAorZW5kCisKKworY2xhc3MgVGVzdFRyZWVDb250ZXh0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgVE9LRU5fTkFNRVMgPSAldygKKyAgICA8aW52YWxpZD4gPEVPUj4gPERPV04+IDxVUD4gVkVDIEFTU0lHTiBQUklOVAorICAgIFBMVVMgTVVMVCBET1QgSUQgSU5UIFdTICdbJyAnLCcgJ10nCisgICkKKyAgVG9rZW5zID0gVG9rZW5TY2hlbWUuYnVpbGQoIFRPS0VOX05BTUVTICkKKyAgCisgIGRlZiBzZXR1cAorICAgIEB3aXphcmQgPSBXaXphcmQubmV3KCA6dG9rZW5fc2NoZW1lID0+IFRva2VucyApCisgIGVuZAorICAKKyAgZGVmIHRlYXJkb3duCisgICAgIyBhZnRlci1lYWNoLXRlc3QgY29kZQorICBlbmQKKyAgCisgICMgdnZ2dnZ2dnYgdGVzdHMgdnZ2dnZ2dnZ2CisgIAorICBkZWYgdGVzdF9zaW1wbGVfcGFyZW50CisgICAgdHJlZSA9IEB3aXphcmQuY3JlYXRlKAorICAgICAgIihuaWwgKEFTU0lHTiBJRFt4XSBJTlRbM10pIChQUklOVCAoTVVMVCBJRFt4XSAoVkVDIElOVFsxXSBJTlRbMl0gSU5UWzNdKSkpKSIKKyAgICApCisgICAgbGFiZWxzID0gQHdpemFyZC5tYXRjaCggdHJlZSwKKyAgICAgICIobmlsIChBU1NJR04gSURbeF0gSU5UWzNdKSAoUFJJTlQgKE1VTFQgSUQgKFZFQyBJTlQgJXg6SU5UIElOVCkpKSkiCisgICAgKQorICAgIAorICAgIGFzc2VydF9raW5kX29mKCBIYXNoLCBsYWJlbHMgKQorICAgIEB3aXphcmQuaW5fY29udGV4dD8oIGxhYmVscy5mZXRjaCggJ3gnICksICdWRUMnICkuc2hvdWxkIGJlX3RydWUKKyAgZW5kCisgIAorICBkZWYgdGVzdF9ub19wYXJlbnQKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoCisgICAgICAnKFBSSU5UIChNVUxUIElEW3hdIChWRUMgSU5UWzFdIElOVFsyXSBJTlRbM10pKSknCisgICAgKQorICAgIAorICAgIGxhYmVscyA9IEB3aXphcmQubWF0Y2goIHRyZWUsICIoJXg6UFJJTlQgKE1VTFQgSUQgKFZFQyBJTlQgSU5UIElOVCkpKSIgKQorICAgIGFzc2VydF9raW5kX29mKCBIYXNoLCBsYWJlbHMgKQorICAgIEB3aXphcmQuaW5fY29udGV4dD8oIGxhYmVscy5mZXRjaCggJ3gnICksICdWRUMnICkuc2hvdWxkIGJlX2ZhbHNlCisgIGVuZAorICAKKyAgZGVmIHRlc3RfcGFyZW50X3dpdGhfd2lsZGNhcmQKKyAgICB0cmVlID0gQHdpemFyZC5jcmVhdGUoCisgICAgICAiKG5pbCAoQVNTSUdOIElEW3hdIElOVFszXSkgKFBSSU5UIChNVUxUIElEW3hdIChWRUMgSU5UWzFdIElOVFsyXSBJTlRbM10pKSkpIgorICAgICkKKyAgICAKKyAgICBsYWJlbHMgPSBAd2l6YXJkLm1hdGNoKCB0cmVlLAorICAgICAgIihuaWwgKEFTU0lHTiBJRFt4XSBJTlRbM10pIChQUklOVCAoTVVMVCBJRCAoVkVDIElOVCAleDpJTlQgSU5UKSkpKSIKKyAgICApCisgICAgYXNzZXJ0X2tpbmRfb2YoIEhhc2gsIGxhYmVscyApCisgICAgbm9kZSA9IGxhYmVscy5mZXRjaCggJ3gnICkKKyAgICBAd2l6YXJkLmluX2NvbnRleHQ/KCBub2RlLCAnVkVDIC4uLicgKS5zaG91bGQgYmVfdHJ1ZQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvQ0hBTkdFUy50eHQgYi9hbnRsci0zLjQvdG9vbC9DSEFOR0VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzQxNWYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvQ0hBTkdFUy50eHQKQEAgLTAsMCArMSwzNDkzIEBACitBTlRMUiAzLjQgUmVsZWFzZQorSnVseSAxOCwgMjAxMQorCitUZXJlbmNlIFBhcnIsIHBhcnJ0IGF0IGNzIHVzZmNhIGVkdQorQU5UTFIgcHJvamVjdCBsZWFkIGFuZCBzdXByZW1lIGRpY3RhdG9yIGZvciBsaWZlCitVbml2ZXJzaXR5IG9mIFNhbiBGcmFuY2lzY28KKworQ0hBTkdFUworCitKdWx5IDE4LCAyMDExIC0tIHJlbGVhc2UgMy40CisKKyogQWRkZWQgdHJlZSBtZXRob2QgaW5zZXJ0Q2hpbGQoaW50IGksIE9iamVjdCB0KS4KKworSnVseSAxNCwgMjAxMQorCisqIEFkZGVkIEJhZXNUcmVlLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXNEZWVwbHkoKSB0byByZWN1cnNpdmVseQorICB3YWxrIHRyZWUgYW5kIHNldCBwdHJzLgorCitKdWx5IDYsIDIwMTEKKworKiByZXNldCgpIGZvciB0b2tlbiBzdHJlYW0gZGlkbid0IHNraXAgaW5pdGlhbCBvZmYtY2hhbm5lbCB0b2tlbnMuCisKK0p1bHkgNSwgMjAxMQorCisqIFNhbSBmaXhlcyByYXJlIGluZmluaXRlIGxvb3AgdXBvbiBlcnJvciBpbiBuZXh0VG9rZW4oKS4KKyogcmV3cml0ZXMgd2VyZW4ndCBwdWxsZWQgZnJvbSBzeW50YWN0aWMgcHJlZGljYXRlcy4KKworSnVuZSAyOSwgMjAxMQorCisqIFNhbSBub3RpY2VkIENvbW1vblRva2VuLmdldFRleHQoKSBjYWNoZWQgc3Vic3RyaW5nIHB1bGxlZCBmcm9tIGlucHV0LCB3aGljaAorICBkZWZlYXRlZCBwdXJwb3NlIG9mIHBvaW50aW5nIGludG8gaW5wdXQgY2hhciBhcnJheS4gIEFsdGVyZWQgdG8gbm90IGNhY2hlLgorICBTaG91bGQgcmVkdWNlIG1lbW9yeSBmb290cHJpbnQuCisKK0p1bmUgMjQsIDIwMTEKKworKiBlbXB0eSBhbHRzIHdpdGggYWN0aW9ucyBkaWRuJ3QgaGF2ZSBFUFNJTE9OIGR1bW15IGFsdCBub2RlLgorCitKdW5lIDE5LCAyMDExCisKKyogVWRvIG5vdGljZWQgdGhhdCBQYXJzZXIuZ2V0TWlzc2luZ1N5bWJvbCgpIGRpZG4ndCBzZXQgaW52ZW50ZWQgdG9rZW4ncyBpbnB1dAorCitKdW5lIDgsIDIwMTEKKworKiBBZGRlZCBpbkNvbnRleHQoU3RyaW5nIGNvbnRleHQpIGJhY2sgaW50byBUcmVlUGFyc2VyLgorCitBcHJpbCAyMSwgMjAxMQorCisqIFVwZGF0ZWQgZm9yIFNUIHY0LjAuMiAoc2V0dGluZyBpdGVyYXRlQWNyb3NzVmFsdWVzID0gdHJ1ZSBhcyBpbnN0YW5jZSB2YXIpCisqIE5lZWRlZCB0aHJvd3MgY29uZGl0aW9uIGZvciBkZWxlZ2F0ZWRSdWxlcy4KKworQXByaWwgMjAsIDIwMTEgKFNhbSBIYXJ3ZWxsKQorCisqIEltcGxlbWVudCB0aGUgJ3Rocm93c1NwZWMnIGZlYXR1cmUgb2YgcGFyc2VyIHJ1bGVzIGZvciB0aGUgSmF2YSB0YXJnZXQKKyogSW1wcm92ZSBhbGdvcml0aG0gZm9yIFNlbWFudGljQ29udGV4dCBCb29sZWFuIHByZWRpY2F0ZSByZWR1Y3Rpb24KKworQXByaWwgMTMsIDIwMTEKKworKiBVbm1hbmdsZWQgcmVnaW9uIG5hbWVzIGluIFNUVml6IGhpZWFyY2h5IHRyZWUgZGlzcGxheS4KKyogUmVtb3ZlZCBjb252ZXJzaW9uIHRpbWVvdXQgdGhpbmcgYWdhaW4KKworQXByaWwgMTEsIDIwMTEKKworKiBBZGRlZCBvcHRpb24gLVhjb252ZXJzaW9udGltZW91dCBiYWNrIGluLiAgVHVybnMgb3V0IHdlIGhpdCBORkEgY29udmVyc2lvbgorICB0aW1lIGxhbmRtaW5lIG9jY2FzaW9uYWxseSB3aXRoIGh1Z2UgZ3JhbW1hcnM7IGZhaWxzIG92ZXIgdG8gYmFja3RyYWNraW5nCisgIChpZiB0dXJuZWQgb24pIGlmIGl0IGNhbid0IG1ha2UgREZBLgorCitNYXJjaCAyOSAtIEFwcmlsIDEwLCAyMDExCisKKyogVXNlcyBTVCB2NCBub3chISEgIE1hc3NpdmUgY2hhbmdlLiAgT25seSB1cGRhdGVkIEphdmEgdGFyZ2V0IHNvIGZhci4KKyAgUmlwcGVkIG91dCBTVCB2MyB1c2FnZSB0byByZW1vdmUgaW5kaXJlY3QgZGVwZW5kZW5jeSBvbiBBTlRMUiB2Mi4KKworTWFyY2ggMjgsIDIwMTEKKworKiBTYW0gSGFyd2VsbCBwb3J0ZWQgYWxsIHYyIGdyYW1tYXJzIHRvIHYzIQorCitNYXJjaCAzLCAyMDExCisKKyogbGVmdC1yZWN1cnNpb24gcGF0dGVybiBvZmYgdW50aWwgYWxsIHRhcmdldHMgY2F0Y2ggdXAKKworKiBBTlRMUkNvcmUuc3RpIG5vIGxvbmdlciB1c2VkOyByZW1vdmVkIGZyb20gYWxsIHRhcmdldHMuCisKKyogQWRkaW5nIHR5cGUsIHRleHQgdGVybWluYWwgb3B0aW9ucworCisqIFJlcGxhY2VkIGhldGVybyBhcmcgd2l0aCB0ZXJtaW5hbE9wdGlvbnMgYXJnIGluIGFsbCB0ZW1wbGF0ZXMgdGhhdCByZWZlcmVuY2UgaGV0ZXJvCisgICh0aGlzIGlzIHRoZSBjbGFzcyBuYW1lIC8gbm9kZSB0eXBlIHVzZWQgZm9yIFRPS0VOPE5PREVUWVBFPiByZWZlcmVuY2VzCisgIGluIGdyYW1tYXIpLiAgV2lkZXNwcmVhZCBidXQgdHJpdmlhbCBjaGFuZ2VzIHRvIGFsbCB0YXJnZXRzLiAgaGV0ZXJvIGlzCisgIG5vdyB0ZXJtaW5hbE9wdGlvbnMubm9kZS4gIENhbiBhbHNvIGdldCB0ZXJtaW5hbE9wdGlvbnMudHlwZSBhbmQKKyAgdGVybWluYWxPcHRpb25zLnRleHQgZnJvbSBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMuCisKKyogRml4ZWQgbWlzcGVsbGluZyBvZiBsaWNlbnNlIGluIEJTRCBsaWNlbnNlIGhlYWRlcnMKKworTWFyY2ggMywgMjAxMQorCisqIEFkZCB0cmVlLCBnZXRUcmVlKCkgdG8gUGFyc2VyUnVsZVJldHVyblNjb3BlIHRvIGRvIGF3YXkgd2l0aCBzcGVjaWZpYyBvbmVzIGxpa2U6CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyByZXdyaXRlX3RlbXBsYXRlX2FyZ3NfcmV0dXJuIGV4dGVuZHMgUGFyc2VyUnVsZVJldHVyblNjb3BlIHsKKyAgICAgICAgQ29tbW9uVHJlZSB0cmVlOworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9CisgICAgfTsKKyAgUmVtb3ZlZCB0aGVzZSBzcGVjaWFsIGNsYXNzZXMgaWYgaXQncyBqdXN0IEFTVDsga2VlcCBpZiB0aGV5IGhhdmUgZGVmaW5lZCAicmV0dXJucyIKKyAgdmFsdWVzCisKK0ZlYnJ1YXJ5IDI2LCAyMDExCisKKyogQWxsIGZpbmFsbHkge30gaGF2ZSBjb21tZW50IG5vdyB0byBzdXBwcmVzcyB3YXJuaW5nLgorCisqIHJlbW92ZWQgOyBmcm9tIHs7fSBibGFuayBtZXRob2QKKworKiBBZGRlZCBAU3VwcHJlc3NXYXJuaW5ncyh7ImFsbCJ9KSB0byBmcm9udCBvZiBlYWNoCisgIGdlbmVyYXRlZCBjbGFzcy4KKworKiAtcHJpbnQgd2Fzbid0IGFsd2F5cyBzaG93aW5nIF4gYW5kICEgaW4gZ3JhbW1hcgorCisqIEFkZGVkIGphdmEtbGVmdC1yZWN1ci9KYXZhLmcgZXhhbXBsZS4KKworKiBsZWZ0LXJlY3Vyc2lvbiBwYXR0ZXJuIGRldGVjdGlvbiBoYW5kbGVzIGJhY2t0cmFja2luZyBtb2RlIG5vdworCitGZWJydWFyeSAyNSwgMjAxMQorCisqIC1YbWF4aW5saW5lZGZhc3RhdGVzIHdlbnQgdG8gNjAgZnJvbSAxMCBmb3IgZm9yY2luZyBwcmVkaWN0aW9uIGluIGxlZnQtCisgIHJlY3Vyc2l2ZSBleHByZXNzaW9uIHJ1bGVzIHRvIHN0YXkgaW4gcnVsZTsgcHJlZHMgdXNlIGEgcGFyYW1ldGVyLgorCisqIHRyZWVzIGtub3cgd2hlcmUgdGhleSBjYW1lIGZyb20gbm93IHN0YXJ0Li5zdG9wIHRva2VuczsgdG9kbzogdXNlIGZvciBiZXR0ZXIgZXJyIGhhbmRsaW5nLgorCisqIEdvdCBpbW1lZGlhdGUgbGVmdC1yZWN1cnNpb24gd29ya2luZyBmb3IgcnVsZXMuIEFkZGVkIFRlc3RMZWZ0UmVjdXJzaW9uLmphdmEKKworRmVicnVhcnkgMjEsIDIwMTEKKworKiBGaXhlZCBodHRwOi8vd3d3LmFudGxyLm9yZy9qaXJhL2Jyb3dzZS9BTlRMUi00MzcgdGhhbmtzIHRvIFZsYWRpc2xhdiBLdXprb2tvdi4KKyAgYWRkZWQgdW5pdCB0ZXN0LgorCitGZWJydWFyeSAxNywgMjAxMQorCisqIEFkZCAtbGFuZ3VhZ2UgTCBvcHRpb24gdG8gb3ZlcnJpZGUgbGFuZ3VhZ2U9TCBvcHRpb24gaW4gZ3JhbW1hci4gIFNhbWUKKyAgZ3JhbW1hciBjYW4geWllbGQgbXVsdGlwbGUgcGFyc2VycyBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzIG5vdy4KKworRmVicnVhcnkgMTAsIDIwMTEKKworKiBBZGRlZCBtZXRob2QgdG8gZ2VuZXJhdGVkIEphdmEgY29kZSB0byByZXR1cm4gdGhlIGFycmF5IG9mIGRlbGVnYXRlczsgZS5nLiwKKyAgICBpbXBvcnQgU3ViMSwgU3ViMjsKKyAgeWllbGRzOgorCisgICAgcHVibGljIFBhcnNlcltdIGdldERlbGVnYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJzZXJbXSB7Z1N1YjEsIGdTdWIyfTsKKyAgICB9CisKK0phbnVhcnkgMjUsIDIwMTEKKworKiBJbXByb3ZlIGVycm9yIG1lc3NhZ2VzIGZvciBubyB2aWFibGUgYWx0IHBhcnNlIGV4Y2VwdGlvbnMKKworSmFudWFyeSAyMCwgMjAxMQorCisqIFRva2VuUmV3cml0ZVN0cmVhbSBoYWQgZGVhZCBjb2RlOyBhbHNvIHVwZGF0ZWQgaW5zZXJ0QmVmb3JlIGZvbGxvd2VkIGJ5CisgIHJlcGxhY2Ugb3IgZGVsZXRlLiAgSWYgaW5wdXQgaXMgYWJjIGFuZCBJIGRpZCBpbnNlcnRCZWZvcmUoMiwieSIpLCB3aGVyZQorICAnYycgaXMgaW5kZXggMiwgdGhlbiBkaWQgZGVsZXRlIG9mIDIgcHJldmlvdXNseSBkZWZpbmVkIGZ1bmN0aW9uYWxpdHkKKyAgd2FzIHRvIGlnbm9yZSB0aGUgaW5zZXJ0LiB0aGF0J3Mgd2VpcmQ7IGZpeGVkIHRvIGtlZXAgaW5zZXJ0LiAgQWxzbworICBEZWxldGUgc3BlY2lhbCBjYXNlIG9mIHJlcGxhY2UgKHRleHQ9PW51bGwpOgorICAJICBELmktai51IEQueC15LnYJfCBib3VuZGFyaWVzIG92ZXJsYXAgPT4gY29tYmluZSB0byBtYXgobWluKS4ubWF4KHJpZ2h0KQorCitEZWNlbWJlciAxMiwgMjAxMAorCisqIFNlbmQgY291bGRCYWNrdHJhY2sgbm93IHRvIGVudGVyRGVjaXNpb24gaW4gZGVidWcgcHJvdG9jb2wKKworRGVjZW1iZXIgNCwgMjAxMAorCisqIFRyZWVXaXphcmQgY3RvciBuZWVkZWQgYSBkZWZhdWx0IHRyZWUgYWRhcGF0b3IuCisKK05vdmVtYmVyIDI5LCAyMDEwIC0tIEFOVExSIHYzLjMKKworTm92ZW1iZXIgMjMsIDIwMTAKKworKiBDb2RlR2VuZXJhdG9yLmxvYWRMYW5ndWFnZVRhcmdldCBpcyBub3cgc3RhdGljIGFuZCBhdmFpbGFibGUgdG8gbG9hZAorICB0YXJnZXRzIHNvIHdlIGNhbiBhc2sgdGhlbSBxdWVzdGlvbnMgZHVyaW5nIGFuYWx5c2lzLgorCisqIEZpeGVkIGFuZCBhZGRlZCB1bml0IHRlc3QKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy9qaXJhL2Jyb3dzZS9BTlRMUi0zNzAKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy9qaXJhL2Jyb3dzZS9BTlRMUi0zNzUKKworTm92ZW1iZXIgMjMsIDIwMTAKKworKiBBZGRlZCBzb3VyY2UgbmFtZSB0byBzeW50YXggZXJyb3IgbXNncworCitPY3RvYmVyIDIwLCAyMDEwCisKK0FkZGVkIGJvb2xlYW4gY291bGRCYWNrdHJhY2sgdG8gZW50ZXJEZWNpc2lvbiBpbiBkYmcgaW50ZXJmYWNlLiBCcmVha3MgQVcKK2ludGVyZmFjZSBhbmQgb3RoZXIgdG9vbHMhIFtCUkVBS1MgQkFDS1dBUkQgQ09NUEFUSUJJTElUWV0KKworT2N0b2JlciAxNywgMjAxMAorCisqIE1pc3NpbmcgLXRyYWNlIGluIGhlbHAgbXNnCisKK05vdmVtYmVyIDIyLCAyMDEwCisKKyogQWRkZWQgR3JhbW1hckFTVDogcHVibGljIGludCBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKSB7IHJldHVybiBnZXRDb2x1bW4oKS0xOyB9CisgIGFuZCBHcmFtbWFyLmdldEhhc0RlbGVnYXRlcygpIGZvciBDIyBndXlzCisKK09jdG9iZXIgMTYsIDIwMTAKKworKiBEb2Vzbid0IHdyaXRlIHByb2ZpbGUgZGF0YSB0byBmaWxlIGFueW1vcmU7IGVtaXRzIGRlY2lzaW9uIGRhdGEgdG8gc3RkZXJyCisKK09jdG9iZXIgMTQsIDIwMTAKKworKiBNYWtlIE9yZGVyZWRIYXNoU2V0IGhhdmUgZGV0ZXJtaW5pc3RpYyBpdGVyYXRpb24KKworSnVseSAyMCwgMjAxMAorCisqIGdyZWVkeT10cnVlIG9wdGlvbiBzaHV0cyBvZmYgbm9uZGV0ZXJtaW5pc20gd2FybmluZy4KKworKiBjb2RlIGdlbiBmb3IgQVNUIGFuZCAtcHJvZmlsZSBkaWRuJ3QgY29tcGlsZS4gaGFkIHVzZWxlc3MgbGluZToKKworICAgICAgICAgICAgIHByb3h5LnNldFRyZWVBZGFwdG9yKGFkYXApOworCisKK0p1bHkgMTcsIDIwMTAKKworKiBSZW1vdmVkIGNvbnZlcnNpb24gdGltZW91dCBmYWlsc2FmZTsgbm8gbG9uZ2VyIG5lZWRlZC4KKworKiBTdGF0cyB1cGRhdGVkIHRvIGJlIGNvcnJlY3QgZm9yIC1yZXBvcnQuCisKK0p1bmUgMTAsIDIwMTAKKworKiBhZGRlZCB0b0FycmF5IGluIE9yZGVyZWRIYXNoU2V0IHRvIG1ha2UgYWRkQWxsIGNhbGxzIGdldCBzYW1lIG9yZGVyIGZvciBERkEgZWRnZXMgYW5kIHBvc3NpYmx5IGNvZGUgZ2VuIGluIHNvbWUgYXJlYXMuCisKK0p1bmUgNSwgMjAxMAorCisqIEFkZGVkIC1Yc2F2ZWxleGVyCisKK01heSAyNCwgMjAxMAorCisqIGxleGVyU3RyaW5nUmVmIHdhcyBtaXNzaW5nIGVsZW1lbnRJbmRleCBhdHRyaWJ1dGUuIGk9J2ltcG9ydCcgZGlkbid0IHdvcmsKKyAgaW4gbGV4ZXIuICBBbHRlcmVkIGFsbCB0YXJnZXQgc3RnIGZpbGVzLiAgU2V0IGluIGNvZGVnZW4uZworCisqIG91dHB1dD1BU1QsIHJld3JpdGU9dHJ1ZSBmb3IgdHJlZSByZXdyaXRlcnMgYnJva2VuLiBuZXh0Tm9kZSBmb3Igc3VidHJlZQorICBzdHJlYW1zIGRpZG4ndCBkdXAgbm9kZSwgaXQgZ2F2ZSB3aG9sZSB0cmVlIGJhY2suCisKK01hcmNoIDE3LCAyMDEwCisKKyogQWRkZWQgTWFjaGluZVByb2JlIGNsYXNzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGhpZ2hsaWdodCBhbWJpZyBwYXRocyBpbgorICBncmFtbWFyLiAgTW9yZSBhY2N1cmF0ZSB0aGFuIERlY2lzaW9uUHJvYmU7IHJldHJvZml0dGVkIGZyb20gdjQuCisKK0ZlYnJ1YXJ5IDIwLCAyMDEwCisKKyogYWRkZWQgcmFuZ2UgdG8gVG9rZW5TdHJlYW0gYW5kIGltcGxlbWVudG9yczoKKyAgICAvKiogSG93IGZhciBhaGVhZCBoYXMgdGhlIHN0cmVhbSBiZWVuIGFza2VkIHRvIGxvb2s/ICBUaGUgcmV0dXJuCisgICAgICogIHZhbHVlIGlzIGEgdmFsaWQgaW5kZXggZnJvbSAwLi5uLTEuCisgICAgICovCisgICAgaW50IHJhbmdlKCk7CisKKyogYWRkZWQgbmV3IG1ldGhvZCB0byBnZXQgc3Vic2V0IG9mIHRva2VucyB0byBidWZmZXJlZCB0b2tlbiBzdHJlYW1zOgorCXB1YmxpYyBMaXN0IGdldChpbnQgc3RhcnQsIGludCBzdG9wKTsKKworRmVicnVhcnkgMTUsIDIwMTAKKworKiBSZWZzIHRvIG90aGVyIHRva2VucyBpbiBhIGxleGVyIHJ1bGUgZGlkbid0IGdldCBpdHMgbGluZS9jaGFycG9zIHJpZ2h0LgorICBhbHRlcmVkIEphdmEuc3RnLgorCitKYW51YXJ5IDMxLCAyMDEwCisKKyogQ3JlYXRpbmcgdG9rZW4gZnJvbSBhbm90aGVyIHRva2VuIGRpZG4ndCBjb3B5IGlucHV0IHN0cmVhbSBpbiBDb21tb25Ub2tlbi4KKyAgbWFrZXMgc2Vuc2UgdG8gY29weSB0b287IGkgZG9uJ3QgdGhpbmsgYW55Ym9keSByZWxpZXMgb24gaXQgYmVpbmcgbnVsbCBhZnRlcgorICBhIGNvcHkuIFdlIG1pZ2h0IHdhbnQgdG8ga25vdyB3aGVyZSB0b2tlbiBjYW1lIGZyb20uCisKK0phbnVhcnkgMjYsIDIwMDkKKworKiBUcmVlUGFyc2VyLmdldE1pc3NpbmdTeW1ib2woKSB1c2UgQ29tbW9uVHJlZSBpbnN0ZWFkIG9mIHVzaW5nCisgIGFkYXB0b3IuY3JlYXRlKCkKKworRGVjZW1iZXIgOCwgMjAwOQorCisqIEluc3RlYWQgb2Ygc2hhcmluZyBUb2tlbi5FT0ZfVE9LRU4sIEknbSBub3cgY3JlYXRpbmcgRU9GIHRva2VucyBzbyBJIGNhbiBzZXQgdGhlIGNoYXIgcG9zaXRpb24gZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy4KKworRGVjZW1iZXIgNSwgMjAwOQorCisqIEZpeGVkIGJ1ZyBpbiBUcmVlVmlzaXRvciB3aGVuIHJld3JpdGVzIGFsdGVyZWQgbnVtYmVyIG9mIGNoaWxkcmVuLiBUaGFua3MgdG8gQ2hyaXMgRGlHaWFuby4KKworKiBhZGRlZCBuZXcgYnVmZmVyZWQgb24tZGVtYW5kIHN0cmVhbXM6IEJ1ZmZlcmVkVG9rZW5TdHJlYW0uIFJlbmFtZWQgQ29tbW9uVG9rZW5TdHJlYW0gdG8gTGVnYWN5Q29tbW9uVG9rZW5TdHJlYW0gYW5kIG1hZGUgbmV3IG9uZSBhcyBzdWJjbGFzcyBvZiBCdWZmZXJlZFRva2VuU3RyZWFtLgorCitOb3ZlbWJlciAzLCAyMDA5CisKKyogQWRkZWQgb3JnLmFudGxyLnJ1bnRpbWUuVW5idWZmZXJlZFRva2VuU3RyZWFtLiBXYXMgdHJpdmlhbCBhbmQgd29ya3MhCisKK05vdmVtYmVyIDEsIDIwMDkKKworKiBDb3VsZG4ndCBwcm9wZXJseSByZXVzZSBwYXJzZXIgc3RhdGU7IGN0b3IgcmVzZXQgdGhlIHN0YXRlOyBmaXhlZC4KKwlQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkKKworKiBMb29rYWhlYWRTdHJlYW08VD4gdXNlZCBzb21lIGhhcmRjb2RlZCBPYmplY3QgcmV0dXJuIHR5cGVzIGZvciBMVCwgZXRjLi4uCisgIHVzZXMgVCBub3cuCisKK1NlcHRlbWJlciAyMywgMjAwOSAtLSBBTlRMUiB2My4yCisKK1NlcHRlbWJlciAyMSwgMjAwOSBbSmltIElkbGVdCisKKyogQWRkZWQgbmV3IG9wdGlvbnMgZm9yIHRvb2wgaW52b2NhdGlvbiB0byBjb250cm9sIHRoZSBwb2ludHMgYXQgd2hpY2ggdGhlIGNvZGUKKyAgZ2VuZXJhdG9yIHRlbGxzIHRoZSB0YXJnZXQgY29kZSB0byB1c2UgaXRzIGVxdWl2YWxlbnQgb2Ygc3dpdGNoKCkgaW5zdGVhZCBvZgorICBpbmxpbmUgaWZzLgorICAgICAgLVhtYXhzd2l0Y2hjYXNlbGFiZWxzIG0gZG9uJ3QgZ2VuZXJhdGUgc3dpdGNoKCkgc3RhdGVtZW50cyBmb3IgZGZhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnZ2VyICB0aGFuIG0gWzMwMF0KKyAgICAgIC1YbWluc3dpdGNoYWx0cyBtICAgICAgIGRvbid0IGdlbmVyYXRlIHN3aXRjaCgpIHN0YXRlbWVudHMgZm9yIGRmYXMgc21hbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBtIFszXQorKiBVcGdyYWRlZCAtWCBoZWxwIG91dHB1dCB0byBpbmNsdWRlIG5ldyBvcHRpbnMgYW5kIHByb3ZpZGUgdGhlIGRlZmF1bHQKKyAgc2V0dGluZ3MsIGFzIHdlbGwgYXMgcHJvdmlkZSB1bml0cyBmb3IgdGhvc2Ugc2V0dGluZ3MgdGhhdCBuZWVkIHRoZW0uCisKKyogQ2hhbmdlIHRoZSBDIFRhcmdldCB0byBvdmVyaWRlIHRoZSBkZWFmdWx0cyBmb3IgdGhlIG5ldyBzZXR0aW5ncyB0bworICBnZW5lcmF0ZSB0aGUgbW9zdCBvcHRpbWl6YWJsZSBDIGNvZGUgZnJvbSB0aGUgbW9kZXJuIEMgY29tcGlsZXIgcG9pbnQgb2YKKyAgdmlldy4gVGhpcyBpcyBlc3NlbnRpYWxseSB0byBhbHdheXMgdXNlIHN3dGljaCBzdGF0ZW1lbnRzIHVubGVzcyB0aGVyZQorICBpcyBhYnNvbHV0ZWx5IG5vIG90aGVyIG9wdGlvbi4gQyBkZWZhdWx0cyBhcmUgdG8gdXNlIDEgZm9yIG1pbmltdW0gYW5kCisgIDMwMDAgZm9yIG1heGltdW0gbnVtYmVyIG9mIGFsdHMgdGhhdCB0cmlnZ2VyIHN3aXRjaCgpLiBUaGlzIHJlc3VsdHMgaW4KKyAgb2JqZWN0IGNvZGUgdGhhdCBpcyAzMCUgc21hbGxlciBhbmQgdXAgdG8gMjAlIGZhc3Rlci4KKworQXByaWwgMjMsIDIwMDkKKworKiBBZGRlZCByZXNldCB0byBUcmVlTm9kZVN0cmVhbSBpbnRlcmZhY2UuCisKK0FwcmlsIDIyLCAyMDA5CisKKyogRml4ZWQgQU5UTFItMzc0LiAgV2FzIGNhdXNlZCBieSBtb3ZlZCBvZiBncmFtbWFycy4gJWZvbygpIHN0dWZmIGRpZG4ndCB3b3JrCisKK0FwcmlsIDksIDIwMDkKKworKiAuZyBhbmQgLmczIGZpbGUgZXh0ZW5zaW9ucyB3b3JrIGFnYWluLgorKiBpbnRyb2R1Y2VkIGJ1ZyBpbiAzLjEuMzogZ2l2ZXMgZXhjZXB0aW9uIG5vdCBlcnJvciBtc2cgdXBvbgorICBtaXNzaW5nIC5nIGZpbGUKKworTWFyY2ggMjYsIDIwMDkKKworKiBNYWRlIGN0b3IgaW4gVHJlZVJld3JpdGVyIGFuZCBUcmVlRmlsdGVyIGNhbGwgdGhpcyBub3Qgc3VwZXIuCisKK01hcmNoIDIxLCAyMDA5CisKKyogQWRkZWQgY3RvciB0byBSZWNvZ25pemVyU2hhcmVkU3RhdGUgdG8gYWxsb3cgY2xvbmluZyBpdC4KKworTWFyY2ggMTcsIDIwMDkgLS0gQU5UTFIgdjMuMS4zCisKKyogaW1wcm92ZWQgQU5UTFJ2My5nIHRvIGhhbmRsZSA8Li4uPiBlbGVtZW50IG9wdGlvbnMKKworTWFyY2ggMTUsIDIwMDkKKworKiBGaXhlZCBBTlRMUi0zODkuIFN0cmlwIGRpZG4ndCBpZ25vcmUgb3B0aW9ucyBpbiBzdWJydWxlczsgYWxzbyBzZWVtZWQKKyAgdG8gZGVtYW5kIHN0ZGluLgorCitNYXJjaCAxNSwgMjAwOQorCisqIEFOVExSIGFsd2F5cyBzb3J0cyBpbmNvbWluZyBncmFtbWFyIGxpc3QgYnkgZGVwZW5kZW5jeS4gIEZvciBleGFtcGxlLAorICBJZiBXLmcgZGVwZW5kcyBvbiB0b2tlbnMgZnJvbSBQLmcgdGhlbiBQLmcgaXMgZG9uZSBmaXJzdCBldmVuIGlmCisgIFcuZyBtZW50aW9uZWQgZmlyc3Qgb24gY29tbWFuZCBsaW5lLiAgSXQgZG9lcyBub3QgaWdub3JlIGFueSBmaWxlcyB5b3UKKyAgc3BlY2lmeSB0aGUgY29tbWFuZGxpbmUuICBJZiB5b3UgZG8gKi5nIGFuZCB0aGF0IGluY2x1ZGVzIHNvbWUKKyAgaW1wb3J0ZWQgZ3JhbW1hcnMsIGl0IHdpbGwgcnVuIGFudGxyIG9uIHRoZW0uCisKKyogLW1ha2Ugb3B0aW9uIHByZXZlbnRzIEFOVExSIGZyb20gcnVubmluZyBvbiBQLmcgaWYgUCBvbGRlciB0aGFuCisgIGdlbmVyYXRlZCBmaWxlcy4KKworKiBBZGRlZCBvcmcuYW50bHIudG9vbC5HcmFtbWFyU3BlbHVua2VyIHRvIGJ1aWxkIGEgZmFzdGVyIGRlcGVuZGVuY3kKKyAgY2hlY2tlciAod2hhdCBncmFtbWFycyBkZXBlbmQgb24gZXRjLi4uKS4gIFRvdGFsbHkgaW5kZXBlbmRlbnQgb2YgYW55CisgIEFOVExSIGNvZGU7IGVhc3kgdG8gcHVsbCBpbnRvIG90aGVyIHRvb2xzLgorCisqIEFkZGVkIG9yZy5hbnRsci5taXNjLkdyYXBoLCBhIGdlbmVyYWwgZ3JhcGggd2l0aCBub2RlcworICBjb250YWluaW5nIGFuIE9iamVjdCBwYXlsb2FkLiBJdCBrbm93cyBob3cgdG8gZG8gYSB0b3BvbG9naWNhbCBzb3J0CisgIG9uIHRoZSBub2Rlcy4KKworTWFyY2ggMTAsIDIwMDkKKworKiBBZGRlZCBhc3NvY2lhdGl2aXR5IHRva2VuIG9wdGlvbiB0byBzdXBwb3J0IHVwY29taW5nIHNwZWNpYWwgZXhwcmVzc2lvbgorICBwYXJzaW5nLiBBZGRlZCBydWxlIG9wdGlvbiBzdHJhdGVneT1wcmVjZWRlbmNlIGFsc28KKworTWFyY2ggMSwgMjAwOQorCisqIENoYW5nZWQgQU5UTFJXb3JrcyBkZWJ1ZyBwb3J0IGZyb20gNDkxNTMgdG8gNDkxMDAuICBBcHBhcmVudGx5IHdlIGNoYW5nZSB0aGUgcG9ydCBpbgorICBBTlRMUldvcmtzIHRvIDQ5MTAwIGluIDEuMiBidXQgZm9yZ290IHRvIGRvIHNvIGluIHRoZSBBTlRMUiB0YXJnZXRzLgorCitTVEFSVCBDSEFOR0VTIEZPUiBUUkVFIEZJTFRFUiBNT0RFIChwdWxsZWQgZnJvbSBkZXYgYnJhbmNoKQorCitUaGlzIGZlYXR1cmUgd2lsbCBiZSBhbm5vdW5jZWQgaW4gMy4yLCBidXQgSSBhbSBpbnRlZ3JhdGluZyBmcm9tIG15IGRldmVsb3BtZW50IGJyYW5jaCBub3cgaW50byB0aGUgbWFpbmxpbmUgc28gdGFyZ2V0IGRldmVsb3BlcnMgaGF2ZSBhIGNoYW5jZSB0byBpbXBsZW1lbnQuIFdlIG1pZ2h0IHJlbGVhc2UgMy4xLjMgYnVnIGZpeCByZWxlYXNlIGJlZm9yZSAzLjIuCisKKyogQ29tbW9uVHJlZU5vZGVTdHJlYW0gLT4gQnVmZmVyZWRUcmVlTm9kZVN0cmVhbS4gIE5vdywKKyAgQ29tbW9uVHJlZU5vZGVTdHJlYW0gaXMgY29tcGxldGVseSB1bmJ1ZmZlcmVkIHVubGVzcyB5b3UgYXJlCisgIGJhY2t0cmFja2luZy4gIE5vIGxvbmdlciBtYWtpbmcgYSBsaXN0IG9mIGFsbCBub2RlcyBiZWZvcmUgdHJlZSBwYXJzaW5nLgorCisqIEFkZGVkIHRyZWUgZ3JhbW1hciBmaWx0ZXI9dHJ1ZSBtb2RlLgorCisgIEFsdGVyZWQgdGVtcGxhdGVzOgorCUphdmEuc3RnOiBhZGRlZCBmaWx0ZXJNb2RlIHRvIGdlbmVyaWNQYXJzZXIgYW5kIHRyZWVQYXJzZXIuCisJVGhpcyByZXF1aXJlZCBhIGNoYW5nZSB0byBBTlRMUkNvcmUuc3RpCisJRGVmaW5lZCBhIGRlZmF1bHQgcGFyYW1ldGVyIGluIHRyZWVQYXJzZXIgdG8gc2V0IHRoZSBzdXBlcmNsYXNzCisJdG8gVHJlZUZpbHRlciBmb3IgdHJlZSBncmFtbWFyIHdpdGggZmlsdGVyPXRydWUuIEl0IHNldHMKKwlzdXBlcmNsYXNzIHRvIFRyZWVSZXdyaXRlciBpZiBmaWx0ZXI9dHJ1ZSBhbmQgb3V0cHV0PUFTVC4KKyAgT3RoZXIgdGhlbSB0aGF0LCBJIG9ubHkgaGFkIHRvIGNoYW5nZSBBTlRMUiBpdHNlbGYgYSBsaXR0bGUgYml0LgorICBNYWRlIGZpbHRlciBtb2RlIHZhbGlkIGZvciB0cmVlIGdyYW1tYXJzIGFuZCBoYXZlIGl0IGF1dG9tYXRpY2FsbHkgc2V0CisgIHRoZSBuZWNlc3NhcnkgZWxlbWVudHM6IEBzeW5wcmVkZ2F0ZSwgYmFja3RyYWNrPXRydWUsIHJld3JpdGU9dHJ1ZQorICAoaWYgb3V0cHV0PUFTVCkuICBBZGRlZCBlcnJvciBtZXNzYWdlIGZvciBkZXRlY3RpbmcgY29uZmxpY3RpbmcKKyAgb3B0aW9ucy4KKworKiBBZGRlZCBtaXNjLkZhc3RRdWV1ZSBhbmQgVGVzdEZhc3RRdWV1ZToKKyAgQSBxdWV1ZSB0aGF0IGNhbiBkZXF1ZXVlIGFuZCBnZXQoaSkgaW4gTygxKSBhbmQgZ3JvdyBhcmJpdHJhcmlseSBsYXJnZS4KKyAgQSBsaW5rZWQgbGlzdCBpcyBmYXN0IGF0IGRlcXVldWUgYnV0IHNsb3cgYXQgZ2V0KGkpLiAgQW4gYXJyYXkgaXMKKyAgdGhlIHJldmVyc2UuICBUaGlzIGlzIE8oMSkgZm9yIGJvdGggb3BlcmF0aW9ucy4KKworKiBBZGRlZCB0cmVlLlRyZWVJdGVyYXRvciwgYSBnZW5lcmF0b3IgdGhhdCB3YWxrcyBhIGRvdWJseSBsaW5rZWQgdHJlZS4KKyAgVGhlIG5vZGVzIG11c3Qga25vdyB3aGF0IGluZGV4IHRoZXkgYXJlLiBJdCdzIGFuIEl0ZXJhdG9yIGJ1dAorICByZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkLiBSZXR1cm5zIG5hdmlnYXRpb24gbm9kZXMgYWx3YXlzOgorICBVUCwgRE9XTiwgRU9GLgorCisqIEFkZGVkIG1pc2MuTG9va2FoZWFkU3RyZWFtOiBBIGxvb2thaGVhZCBxdWV1ZSB0aGF0IGtub3dzIGhvdworICB0byBtYXJrL3JlbGVhc2UgbG9jYXRpb25zIGluIHRoZSBidWZmZXIgZm9yIGJhY2t0cmFja2luZyBwdXJwb3Nlcy4KKyAgSSBob3BlIHRvIHVzZSBmb3IgYm90aCB0cmVlIG5vZGVzIGFuZCB0b2tlbnMuICBKdXN0IGltcGxlbWVudAorICBuZXh0RWxlbWVudCgpIHRvIHNheSBob3cgdG8gZ2V0IG5leHQgbm9kZSBvciB0b2tlbi4KKworRU5EIENIQU5HRVMgRk9SIFRSRUUgRklMVEVSIE1PREUKKworRmVicnVhcnkgMjMsIDIwMDkgLS0gQU5UTFIgdjMuMS4yCisKK0ZlYnJ1YXJ5IDE4LCAyMDA5CisKKyogQWRkZWQgb3JnLmFudGxyLnRvb2wuU3RyaXAgKHJlYWRzIGZyb20gZmlsZSBhcmcgb3Igc3RkaW4sIGVtaXRzIHRvIHN0ZG91dCkKKyAgdG8gc3RyaXAgYWN0aW9ucyBmcm9tIGEgZ3JhbW1hci4KKworRmVicnVhcnkgNCwgMjAwOQorCisqIEFkZGVkIENvbW1vblRyZWUuc2V0VW5rbm93blRva2VuQm91bmRhcmllcygpLiAgU29tZXRpbWVzIHdlIGJ1aWxkIHRyZWVzCisgIGluIGEgZ3JhbW1hciBhbmQgc29tZSBvZiB0aGUgdG9rZW4gYm91bmRhcmllcyBhcmUgbm90IHNldCBwcm9wZXJseS4KKyAgVGhpcyBvbmx5IG1hdHRlcnMgaWYgeW91IHdhbnQgdG8gcHJpbnQgb3V0IHRoZSBvcmlnaW5hbCB0ZXh0IGFzc29jaWF0ZWQKKyAgd2l0aCBhIHN1YnRyZWUuICBDaGVjayB0aGlzIG91dCBydWxlOgorCisJcG9zdGZpeEV4cHJlc3Npb24KKwkgICAgOiAgIHByaW1hcnkgKCcuJ14gSUQpKgorCSAgICA7CisKKyAgRm9yIGEuYi5jLCB3ZSBnZXQgYSAnLicgdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSB0b2tlbiBib3VuZGFyaWVzIHNldC4KKyAgQU5UTFIgb25seSBzZXRzIHRva2VuIGJvdW5kYXJpZXMgZm9yIHN1YnRyZWVzIHJldHVybmVkIGZyb20gYSBydWxlLgorICBTTywgdGhlIG92ZXJhbGwgJy4nIG9wZXJhdG9yIGhhcyB0aGUgdG9rZW4gYm91bmRhcmllcyBzZXQgZnJvbSAnYScKKyAgdG8gJ2MnIHRva2VucywgYnV0IHRoZSBsb3dlciAnLicgc3VidHJlZSBkb2VzIG5vdCBnZXQgdGhlIGJvdW5kYXJpZXMKKyAgc2V0ICh0aGV5IGFyZSAtMSwtMSkuICBDYWxsaW5nIHNldFVua25vd25Ub2tlbkJvdW5kYXJpZXMoKSBvbgorICB0aGUgcmV0dXJuZWQgdHJlZSBzZXRzIHRoZSBib3VuZGFyaWVzIGFwcHJvcHJpYXRlbHkgYWNjb3JkaW5nIHRvIHRoZQorICBjaGlsZHJlbidzIHRva2VuIGJvdW5kYXJpZXMuCisKK0phbnVhcnkgMjIsIDIwMDkKKworKiBmaXhlZCB0byBiZSBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsgaW4gYWRkTGlzdGVuZXIoKSBvZiBEZWJ1Z0V2ZW50SHViLmphdmEKKworSmFudWFyeSAyMCwgMjAwOQorCisqIFJlbW92ZWQgcnVudGltZSBtZXRob2Q6IG1pc21hdGNoIGluIEJhc2VSZWNvZ25pemVyIGFuZCBUcmVlUGFyc2VyLiAgU2VlbXMKKyAgdG8gYmUgdW51c2VkLiAgSGFkIHRvIG92ZXJyaWRlIG1ldGhvZCByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbigpIGluCisgIFRyZWVQYXJzZXIgdG8gZ2V0IHJpZCBvZiBzaW5nbGUgdG9rZW4gaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiBmb3IKKyAgdHJlZSBwYXJzaW5nIGJlY2F1c2UgaXQgbWFrZXMgbm8gc2Vuc2Ugd2l0aCBhbGwgb2YgdGhlIHVwLWFuZC1kb3duIG5vZGVzLgorCisqIENoYW5nZWQgSklSQSBwb3J0IG51bWJlciBmcm9tIDg4ODggdG8gbm8gcG9ydCBzcGVjIChha2EgcG9ydCA4MCkgYW5kIGFsbAorICByZWZzIHRvIGl0IGluIHRoaXMgZmlsZS4KKworKiBDaGFuZ2VkIEJhc2VUcmVlIHRvIFRyZWUgdHlwZWNhc2UgaW4gZ2V0Q2hpbGQgYW5kIHRvU3RyaW5nVHJlZSgpIGFuZAorICBkZWxldGVDaGlsZCgpIHRvIG1ha2UgbW9yZSBnZW5lcmljLgorCitEZWNlbWJlciAxNiwgMjAwOAorCisqIEFkZGVkIC12ZXJib3NlIGNtZC1saW5lIG9wdGlvbiBhbmQgdHVybmVkIG9mZiBzdGFuZGFyZCBoZWFkZXIKKyAgYW5kIGxpc3Qgb2YgcmVhZCBmaWxlcy4gIFNpbGVudCBub3cgd2l0aG91dCAtdmVyYm9zZS4KKworTm92ZW1iZXIgMjQsIDIwMDgKKworKiBudWxsLXB0ciBwcm90ZWN0ZWQgZ2V0UGFyZW50IGFuZCBhIGZldyBvdGhlcnMuCisKKyogQWRkZWQgbmV3IGN0b3IgdG8gQ29tbW9uVHJlZU5vZGVTdHJlYW0gZm9yIHdhbGtpbmcgc3VidHJlZXMuICBBdm9pZHMKKyAgaGF2aW5nIHRvIG1ha2UgbmV3IHNlcmlhbGl6ZWQgc3RyZWFtIGFzIGl0IGNhbiByZXVzZSBvdmVyYWxsIG5vZGUgc3RyZWFtCisgIGJ1ZmZlci4KKworTm92ZW1iZXIgMjAsIDIwMDgKKworKiBVcGRhdGVkIEJhc2VUZXN0IHRvIGlzb2xhdGUgdGVzdHMgYmV0dGVyLgorCitOb3ZlbWJlciAxNywgMjAwOAorCisqIEJhc2VUcmVlQWRhcHRvci5nZXRUeXBlKCkgd2FzIGhvc2VkOyBhbHdheXMgZ2F2ZSAwLiAgVGhhbmtzIHRvIFNhbSBIYXJ3ZWxsLgorCitOb3ZlbWJlciA4LCAyMDA4CisKKyogQWRkZWQgbWV0aG9kcyB0byBCYXNlUmVjb2duaXplcjoKKyAgcHVibGljIHZvaWQgc2V0QmFja3RyYWNraW5nTGV2ZWwoaW50IG4pIHsgc3RhdGUuYmFja3RyYWNraW5nID0gbjsgfQorICAvKiogUmV0dXJuIHdoZXRoZXIgb3Igbm90IGEgYmFja3RyYWNraW5nIGF0dGVtcHQgZmFpbGVkLiAqLworICBwdWJsaWMgYm9vbGVhbiBmYWlsZWQoKSB7IHJldHVybiBzdGF0ZS5mYWlsZWQ7IH0KKworTm92ZW1iZXIgNSwgMjAwOAorCisqIFR3ZWFrZWQgdHJhY2VJbi9PdXQgdG8gc2F5ICJmYWlsL3N1Y2NlZWRlZCIKKworKiBCdWcgaW4gY29kZSBnZW4gZm9yIHRyZWUgZ3JhbW1hciB3aWxkY2FyZCBsaXN0IGxhYmVsIHgrPS4KKworKiBVc2Ugb2YgYmFja3RyYWNrPXRydWUgYW55d2hlcmUgaW4gZ3JhbW1hciBjYXVzZXMgYmFja3RyYWNraW5nIHNlbnNpdGl2ZQorICBjb2RlIHRvIGJlIGdlbmVyYXRlZC4gIEFjdGlvbnMgYXJlIGdhdGVkIGV0Yy4uLiAgUHJldmlvdXNseSwgdGhhdCBvbmx5CisgIGhhcHBlbmVkIHdoZW4gYSBzeW50YWN0aWMgcHJlZGljYXRlIGFwcGVhcmVkIGluIGEgREZBLiAgQnV0LCB3ZSBuZWVkCisgIHRvIGdhdGUgYWN0aW9ucyB3aGVuIGJhY2t0cmFja2luZyBvcHRpb24gaXMgc2V0IGV2ZW4gaWYgbm8gZGVjaXNpb24KKyAgaXMgZ2VuZXJhdGVkIHRvIHN1cHBvcnQgZmlsdGVyaW5nIG9mIHRyZWVzLgorCitPY3RvYmVyIDI1LCAyMDA4CisKKyogRml4ZWQgZGVidWcgZXZlbnQgc29ja2V0IHByb3RvY29sIHRvIGFsbG93IHNwYWNlcyBpbiBmaWxlbmFtZXMuCisKKyogQWRkZWQgVHJlZVZpc2l0b3IgYW5kIFRyZWVWaXNpdG9yQWN0aW9uIHRvIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuCisKK09jdG9iZXIgMjIsIDIwMDgKKworKiBBZGRlZCBpbkNvbnRleHQoKSB0byBUcmVlUGFyc2VyLiAgVmVyeSB1c2VmdWwgZm9yIHByZWRpY2F0aW5nCisgIHRyZWUgZ3JhbW1hciBwcm9kdWN0aW9ucyBhY2NvcmRpbmcgdG8gY29udGV4dCAodGhlaXIgcGFyZW50IGxpc3QpLgorICBBZGRlZCBuZXcgVGVzdFRyZWVDb250ZXh0IHVuaXQgdGVzdHMgKDE1KS4KKworICAgIC8qKiBDaGVjayBpZiBjdXJyZW50IG5vZGUgaW4gaW5wdXQgaGFzIGEgY29udGV4dC4gIENvbnRleHQgbWVhbnMgc2VxdWVuY2UKKyAgICAgKiAgb2Ygbm9kZXMgdG93YXJkcyByb290IG9mIHRyZWUuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHNheSBjb250ZXh0CisgICAgICogIGlzICJNVUxUIiB3aGljaCBtZWFucyBteSBwYXJlbnQgbXVzdCBiZSBNVUxULiAgIkNMQVNTIFZBUkRFRiIgc2F5cworICAgICAqICBjdXJyZW50IG5vZGUgbXVzdCBiZSBjaGlsZCBvZiBhIFZBUkRFRiBhbmQgd2hvc2UgcGFyZW50IGlzIGEgQ0xBU1Mgbm9kZS4KKyAgICAgKiAgWW91IGNhbiB1c2UgIi4uLiIgdG8gbWVhbiB6ZXJvLW9yLW1vcmUgbm9kZXMuICAiTUVUSE9EIC4uLiBWQVJERUYiCisgICAgICogIG1lYW5zIG15IHBhcmVudCBpcyBWQVJERUYgYW5kIHNvbWV3aGVyZSBhYm92ZSB0aGF0IGlzIGEgTUVUSE9EIG5vZGUuCisgICAgICogIFRoZSBmaXJzdCBub2RlIGluIHRoZSBjb250ZXh0IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgcm9vdC4gIFRoZSBjb250ZXh0CisgICAgICogIG1hdGNoZXIgc3RvcHMgbWF0Y2hpbmcgYW5kIHJldHVybnMgdHJ1ZSB3aGVuIGl0IHJ1bnMgb3V0IG9mIGNvbnRleHQuCisgICAgICogIFRoZXJlIGlzIG5vIHdheSB0byBmb3JjZSB0aGUgZmlyc3Qgbm9kZSB0byBiZSB0aGUgcm9vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpbkNvbnRleHQoU3RyaW5nIGNvbnRleHQpIHsuLi59CisKKyogQWRkZWQgMyBtZXRob2RzIHRvIFRyZWUgaW50ZXJmYWNlIFtCUkVBS1MgQkFDS1dBUkQgQ09NUEFUSUJJTElUWV0KKworICAgIC8qKiBJcyB0aGVyZSBpcyBhIG5vZGUgYWJvdmUgd2l0aCB0b2tlbiB0eXBlIHR0eXBlPyAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0FuY2VzdG9yKGludCB0dHlwZSk7CisKKyAgICAvKiogV2FsayB1cHdhcmRzIGFuZCBnZXQgZmlyc3QgYW5jZXN0b3Igd2l0aCB0aGlzIHRva2VuIHR5cGUuICovCisgICAgcHVibGljIFRyZWUgZ2V0QW5jZXN0b3IoaW50IHR0eXBlKTsKKworICAgIC8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKKyAgICAgKiAgbGlzdCBpcyB0aGUgcm9vdCBhbmQgdGhlIGxhc3QgaXMgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0QW5jZXN0b3JzKCk7CisKK09jdG9iZXIgMjEsIDIwMDgKKworKiBVcGRhdGVkIHVuaXQgdGVzdHMgdG8gYmUgY29ycmVjdCBmb3IgXHVGRkZFLT5cdUZGRkYgY2hhbmdlCisKKyogTWFkZSAuIGluIHRyZWUgZ3JhbW1hciBsb29rIGxpa2UgXiguIC4qKSB0byBhbmFseXNpcywgdGhvdWdoIF4oLiBmb28pCisgIGlzIGlsbGVnYWwgKGNhbid0IGhhdmUgLiBhdCByb290KS4gV2lsZGNhcmQgaXMgc3VidHJlZSBvciBub2RlLgorICBGaXhlZCBidWdzOgorICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL2Jyb3dzZS9BTlRMUi0yNDgKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItMzQ0CisKK09jdG9iZXIgMSwgMjAwOCAtLSBBTlRMUiB2My4xLjEKKworU2VwdGVtYmVyIDgsIDIwMDgKKworKiBMYWJlbHMgb24gdG9rZW5zLCBydWxlcyBjYXJyeSBpbnRvIHN5bnByZWRzIG5vdyBzbyBzZW1hbnRpYyBwcmVkaWNhdGVzIHdvcmsuCisgIFRoaXMgZGlkbid0IHdvcmsgc2luY2UgbGFiZWxzIHdlcmUgc3RyaXBwZWQgaW4gdGhlIHN5bnByZWQgYW5kIHRoZXkgd2VyZW4ndAorICBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgbWV0aG9kLgorCisgIGEgOiB4PUEgej1hIHskeC50ZXh0LmVxdWFscygkei50ZXh0KX0/IEEKKyAgICB8IHk9QSBhIEEgQQorICAgIDsKKworU2VwdGVtYmVyIDMsIDIwMDgKKworKiBNYWRlIGEgUkVWIHN0YXRpYyB2YXJpYWJsZSBpbiBUb29sIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSB0aGUgcmV2IGZvcgorICBkYWlseSBidWlsZHMuCisKKyogTWFkZSBcdUZGRkYgYSB2YWxpZCBjaGFyYWN0ZXIuIFRva2VuIHR5cGVzIGFyZSAzMi1iaXQgY2xlYW4gdXNpbmcgLTEKKyAgbm90IDB4MDAwMEZGRkYgYXMgLTEgc28gaXQgc2hvdWxkIGJlIG9rYXkuICBMYWJlbC5qYXZhOgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9DSEFSX1ZBTFVFID0gJ1x1MDAwMCc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NIQVJfVkFMVUUgPSAnXHVGRkZGJzsKKworQXVndXN0IDMwLCAyMDA4CisKKyogQ2hhbmdlZCBtZXNzYWdlcyBpbiBlbi5zdGcgc28gdGhhdCBUT0tFTl9OT05ERVRFUk1JTklTTSBjb3JyZWN0bHkKKyAgaW5kaWNhdGVzIHdoZW4gYWN0aW9ucyBoaWQgc2VtYW50aWMgcHJlZGljYXRlcy4KKworQXVndXN0IDE1LCAyMDA4CisKKyogVHdlYWtlZCBidWlsZCBwcm9wZXJ0aWVzIGFuZCBidWlsZC54bWwKKworQXVndXN0IDEzLCAyMDA4CisKKyogRml4ZWQgQU5UTFItMzE0OyAzLjEgaW50cm9kdWNlZCBhIHByb2JsZW0gd2l0aCBsaXN0IGxhYmVscyArPQorCitBdWd1c3QgMTIsIDIwMDggLS0gQU5UTFIgdjMuMQorCisqIEFkZGVkIEphdmFTY3JpcHQgdGFyZ2V0CisKK0F1Z3VzdCA3LCAyMDA4CisKKyogYW4gTkZBIHRhcmdldCBvZiBFT0YgcHJlZGljYXRlIHRyYW5zaXRpb24gaW4gREZBIGNhdXNlIGFuIGV4Y2VwdGlvbiBpbgorICBnZXRQcmVkaWNhdGVzUGVyTm9uRGV0ZXJtaW5pc3RpY0FsdCgpLgorCisqIEtheSBSb2Vwa2UgZm91bmQgYSBuYXN0eSBidWcgd2hlbiBkZWJ1Z2dpbmcgQVNULWNvbnN0cnVjdGluZworICBjb21wb3NpdGUgcmVjb2duaXplcnMuICBJZiB0aGUgaW5wdXQgc3RhdGUgd2FzIG51bGwgdG8gdGhlIGNvbnN0cnVjdG9yLAorICBzdXBlciBjbGFzcyBjb25zdHJ1Y3RvciBjcmVhdGVkIGEgbmV3IHBhcnNlciBzdGF0ZSBvYmplY3QuCisgIExhdGVyLCB0aG91Z2ggd2UgcGFzc2VkIHRoZSBhcmd1bWVudCBzdGF0ZSBub3QgdGhpcy5zdGF0ZQorICB0byB0aGUgZGVsZWdhdGUgY29uc3RydWN0b3JzLCBmb3JjaW5nIHRoZW0gdG8gc2hhcmUgYSBkaWZmZXJlbnQKKyAgc3RhdGUgb2JqZWN0cyEgIENoYW5nZWQgc3RhdGUgdG8gdGhpcy5zdGF0ZSBpbiBEYmcuc3RnIGNvbnN0cnVjdG9ycy4KKworKiBBY2suIG1lc3NlZCB1cCBkZWJ1Zy9BU1QuICBIYXZlIHRvIHNldCBwcm94eSdzIHRyZWUgYWRhcHRvcjsgaXQncworICBhIGNpcmN1bGFyIHJlZi4gIEp1c3QgYW4gQVNURGJnLnN0ZyBjaGFuZ2UuCisKK0F1Z3VzdCA0LCAyMDA4CisKKyogc3VwZXJDbGFzcyB3b3JrcyBub3cgZm9yIGxleGVycworCisqIE1hZGUgR3JhbW1hci5kZWZpbmVOYW1lZEFjdGlvbiBwcm9wb2dhdGUgaGVhZGVyIGFjdGlvbnMgZG93biB0byBhbGwKKyAgZGVsZWdhdGVzIGlmIHJvb3QgZ3JhbW1hcjsgcmVnYXJkbGVzcyBvZiBsZXhlci9wYXJzZXIgc2NvcGUuCisKKyogUmVqaWdnZXJlZCBBU1QgdGVtcGxhdGVzIHRvIHByb3BvZ2F0ZSBjaGFuZ2VzIHRvIHRyZWUgYWRhcHRvcgorICBmb3IgZGVsZWdhdGUgZ3JhbW1hcnMuIEZpeGVzIEFOVExSLTMwMgorCitBdWd1c3QgNCwgMjAwOAorCisqIEZPTExPVyBzZXQgY29tcHV0YXRpb25zIGFsdGVyZWQgY29uc3RhbnQgRk9MTE9XIGJpdCBzZXRzLgorCisqIEFkZGVkICguLi4pIGFyZSBhbGwgcHJlZGljYXRlIGV2YWx1YXRpb25zLgorCisqIEV4dHJhIGluaXQgY29kZSBmb3IgdHJlZSBwYXJzZXIgbm9ucmV3cml0ZSBtb2RlIHJlbW92ZWQuCisKKyogQWRkZWQgZW1wdHkgY2hpbGQgbGlzdCBjaGVjayBpbiBiZWNvbWVSb290CisKK0F1Z3VzdCAzLCAyMDA4CisKKyogV2FzIHVzaW5nIFJ1bGVSZXR1cm5TY29wZSBub3QgUnVsZW5hbWVfcmV0dXJuIGZvciBsaXN0IGxhYmVscyBpbiB0cmVlCisgIHBhcnNlci4KKworKiBEaWRuJ3Qgc2V0IF9sYXN0IGluIHRyZWUgcGFyc2VyIGZvciBydWxlIHJlZiB0cmFjayBzdHVmZiAocmV3cml0ZT10cnVlKQorCitBdWd1c3QgMiwgMjAwOAorCisqIEJlbmphbWluIGZvdW5kIGFub3RoZXIgcmV3cml0ZSBlbmdpbmUgYnVnLgorCitKdWx5IDMwLCAyMDA4CisKKyogQ29tbW9uVHJlZU5vZGVTdHJlYW0gLyBDb21tb25Ub2tlblN0cmVhbSBkaWQgbm90IHJlc2V0IHByb3Blcmx5LgorCitKdWx5IDI5LCAyMDA4CisKKyogRml4ZWQgYW5vdGhlciBidWcgaW4gVG9rZW5SZXdyaXRlU3RyZWFtOyBkaWRuJ3QgbGlrZSBpbnNlcnRzIGFmdGVyIGVuZC4KKworSnVseSAyOCwgMjAwOAorCisqIEZpeGVkIGJ1ZyBpbiBUb2tlblJld3JpdGVTdHJlYW0udG9TdHJpbmcoc3RhcnQsc3RvcCk7IGl0IGlnbm9yZWQKKyAgcGFyYW1ldGVycy4gOykKKworSnVseSAxNywgMjAwOAorCisqIGFsbG93IHF1YWxpZmllZCB0eXBlIG5hbWVzIGluIGhldGVybyA8Li4uPiBvcHRpb25zIGxpa2UgVDxhLmIuYy5Ob2RlPgorCitKdWx5IDUsIDIwMDgKKworKiB0cmVlTGV2ZWwgbm90IHNldCBmb3Igc2V0QmxvY2sgYWx0czsgYWRkZWQgdW5pdCB0ZXN0CisKK0p1bHkgMywgMjAwOAorCisqIEZpeGVkIEFOVExSLTI2Ny4gcGFyc2UgdHJlZSBhZGRlZCBub2RlcyBkdXJpbmcgYmFja3RyYWNraW5nIGFuZAorICBjeWNsaWMgREZBcy4gIHRyYWNrcyBoaWRkZW4gdG9rZW5zIHRvbyBub3cuIEFkZGVkIHRvSW5wdXRTdHJpbmcoKSB0bworICBnZXQgdGV4dCBiYWNrIGluY2x1ZGluZyBoaWRkZW4gdG9rZW5zLiAgU2hvd3MgPGVwc2lsb24+IGZvciBydWxlcworICB0aGF0IG1hdGNoIG5vdGhpbmcuCisKK0p1bmUgMjYsIDIwMDgKKworKiBBZGRlZCBnUGFyZW50IHB0ciB0aGF0IHBvaW50cyB0byBpbW1lZGlhdGUgcGFyZW50IGdyYW1tYXIuIEUuZy4sCisgICAgLy8gZGVsZWdhdG9ycworICAgIHB1YmxpYyBNUGFyc2VyIGdNOworICAgIHB1YmxpYyBNX1MgZ1M7CisgICAgcHVibGljIE1fUyBnUGFyZW50ID0gZ1M7IC8vIE5FVworCisqIEdyYW1tYXIgaW1wb3J0cyBkaWRuJ3Qgc2V0IGFsbCB0aGUgZGVsZWdhdGUgcG9pbnRlcnMuLi5sb3RzIG9mIGltcG9ydGVkCisgIGdyYW1tYXJzIHdvdWxkIGNhdXNlIGEgbnVsbCBwdHIgZXhjZXB0aW9uLiAgRml4ZXMgQU5UTFItMjkyLgorCitKdW5lIDI1LCAyMDA4CisKKyogTGlzdCBsYWJlbHMgaW4gdHJlZSBjb25zdHJ1Y3Rpb24gZGlkbid0IGFsd2F5cyB0cmFjayB0aGUgdHJlZTsgc29tZXRpbWVzCisgIGhhZCBhIHJ1bGUgcmVzdWx0IHN0cnVjdHVyZS4KKworSnVuZSA0LCAyMDA4CisKKyogSW1wcm92ZWQgdW5pdCB0ZXN0aW5nIHNvIHRoYXQgZWFjaCB0ZXN0IHN1aXRlIGV4ZWN1dGVzIGFuZCBidWlsZHMgZ3JhbW1hcnMKKyAgaW4gYSBzZXBhcmF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHRoZXkgY2FuIGV4ZWN1dGUgY29uY3VycmVudGx5LgorICBBbHNvIHNlZW0gdG8gYmUgYSBwcm9ibGVtIHdpdGggbXkgY2xhc3MgcGF0aCBkdXJpbmcgZXhlY3V0aW9uLiBNb3ZlZAorICB0bXBkaXIgZm9yIGFoZWFkIG9mIHN0YW5kYXJkIENMQVNTUEFUSC4KKworKiBCeSB2aXJ0dWUgb2YgYW4gaW1wcm92ZW1lbnQgdG8gU3RyaW5nVGVtcGxhdGUsIG91dHB1dCBuZXdsaW5lcworICBpbiBnZW5lcmF0ZWQgZmlsZXMgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgdG8gd2hhdGV2ZXIgeW91ciBob3N0IHVzZXMuCisKK0p1bmUgMywgMjAwOAorCisqIFJlc3RyaWN0IGxlZ2FsaXR5IG9mIGdyYW1tYXIgb3B0aW9uczsgZm9yIGV4YW1wbGUgeW91IGNhbm5vdCB1c2Ugb3V0cHV0IG9wdGlvbgorICBpbiBsZXhlciBhbnltb3JlLgorCitKdW5lIDIsIDIwMDgKKworKiBUaHJvdyBpbGxlZ2FsIGFyZyBleGNlcHRpb24gdXBvbiBpbnZhbGlkIFRva2VuUmV3cml0ZVN0cmVhbSBvcHMuIFJld3JvdGUKKyAgY29yZSBvZiBlbmdpbmUuICBTbGlnaHRseSBkaWZmZXJlbnQgb3BlcmF0aW9uLiAgQWRkZWQgbWFueSBtb3JlIHVuaXQgdGVzdHMuCisKKzMuMWIxIC0gTWF5IDIwLCAyMDA4CisKK01heSAxMSwgMjAwOAorCisqIHJld3JpdGU9dHJ1ZSwgb3V0cHV0PUFTVCBmb3IgdHJlZSBncmFtbWFyIHdhcyBub3Qgd29ya2luZy4gIEFsdGVyZWQgdHJlZXMgd2VyZSBub3QKKyAgcHJvcGFnYXRlZCBiYWNrIHVwIHRoZSBydWxlIHJlZmVyZW5jZSBjaGFpbi4gIFJlcXVpcmVkIGEgbnVtYmVyIG9mIG1vZHMgdG8KKyAgQVNUVHJlZVBhcnNlci5zdGcuICBBZGRlZCB1bml0IHRlc3RzLgorCitNYXkgMTAsIDIwMDgKKworKiBbQkFDS1dBUkQgSU5DT01QQVRJQkxFIGlmIHlvdSBvdmVycmlkZSBtYXRjaCgpXQorICBJIGhhZCB0dXJuZWQgb2ZmIHNpbmdsZSB0b2tlbiBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIGJlY2F1c2UgSSBjb3VsZCBub3QgZmlndXJlCisgIG91dCBob3cgdG8gd29yayB3aXRoIHRyZWVzIGFuZCBhY3Rpb25zLiBGaWd1cmUgdGhhdCBvdXQgYW5kIHNvIEkgdHVybmVkIGl0IGJhY2sgb24uCisgIG1hdGNoKCkgcmV0dXJucyBPYmplY3QgbWF0Y2hlZCBub3cgKHBhcnNlciwgdHJlZSBwYXJzZXIpIHNvIHdlIGNhbiBzZXQgbGFiZWxzCisgIG9uIHRva2VuIHJlZnMgcHJvcGVybHkgYWZ0ZXIgc2luZ2xlIHRva2VuIGlucy9kZWwgZXJyb3IgcmVjb3ZlcnkuICBBbGxvd3MgYWN0aW9ucworICBhbmQgdHJlZSBjb25zdHJ1Y3Rpb24gdG8gcHJvY2VlZCBub3JtYWxseSBldmVuIHRob3VnaCB3ZSByZWNvdmVyIGluIHRoZSBtaWRkbGUgb2YKKyAgYW4gYWx0ZXJuYXRpdmUuICBBZGRlZCBtZXRob2RzIGZvciBjb25qdXJpbmcgdXAgbWlzc2luZyBzeW1ib2xzOiBnZXRNaXNzaW5nU3ltYm9sKCkuCisKKyogcmVmYWN0b3JlZCBCYXNlUmVjb2duaXplciBlcnJvciBoYW5kbGluZyByb3V0aW5lcworCisqIFNpbmdsZSB0b2tlbiBlcnJvciByZWNvdmVyeSB3YXMgbm90IHByb3Blcmx5IHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gRU9GLgorCisqIEFOVExSIG5vIGxvbmdlciB0cmllcyB0byByZWNvdmVyIGluIHRyZWUgcGFyc2VycyBpbmxpbmUgdXNpbmcgc2luZ2xlIG5vZGUgZGVsZXRpb24gb3IgaW5zZXJ0aW9uOyB0aHJvdyBleGNlcHRpb24uICBUcmVlcyBzaG91bGQgYmUgd2VsbCBmb3JtZWQgYXMgdGhleSBhcmUgbm90IGNyZWF0ZWQgYnkgdXNlcnMuCisKKyogQWRkZWQgZW1wdHkgY29uc3RydWN0b3JzIHRvIHRoZSBleGNlcHRpb24gY2xhc3NlcyB0aGF0IGRpZCBub3QgaGF2ZSB0aGVtIHNvIHRoYXQgQU5UTFJXb3JrcyBjYW4gY3JlYXRlIHRoZSBleGNlcHRpb25zLgorCisqIE1hZGUgZGVidWcgdHJlZSBhZGFwdG9yIGRlYWwgd2l0aCB0b2tlbnMgY29uanVyZWQgdXAgZHVyaW5nIGVycm9yIHJlY292ZXJ5LgorCisqIFJlbW92ZWQgZXh0cmEgbG9jYXRpb24oKSBkZWJ1ZyBlbGVtZW50IHRoYXQgd2FzIGVtaXR0ZWQuCisKK01heSA4LCAyMDA4CisKKyogQU5UTFIgZGlkbid0IHVwZGF0ZSBsaW5lL2NvbCB0byBERkEgbWFwIGZvciBBVy4KKworTWF5IDYtNywgMjAwOAorCisqIEluc3VmZmljaWVudGx5IGNvdmVyZWQgKHdpdGggc2VtYW50aWMgcHJlZGljYXRlcykgYWx0IHdhcm5pbmdzIGFyZSBub3cgZW1pdHRlZCBiZWZvcmUKKyAgbm9uZGV0ZXJtaW5pc21zIHNvIGl0J3MgY2xlYXIgdGhlIG5vbmRldGVybWluaXNtIGlzIGEgcmVzdWx0IG9mIGluc3VmZmljaWVudCBwcmVkcy4KKworKiBJbXByb3ZlZCBpbnN1ZmZpY2llbnRseSBjb3ZlcmVkIGFsdCB3YXJuaW5ncyBmcm9tOgorICAgIHdhcm5pbmcoMjAzKTogVC5nOjI6MzogVGhlIGZvbGxvd2luZyBhbHRlcm5hdGl2ZXMgYXJlIGluc3VmZmljaWVudGx5IGNvdmVyZWQgd2l0aCBwcmVkaWNhdGVzOiAxCisgIHRvOgorICAgIHdhcm5pbmcoMjAzKTogVC5nOjI6MzogSW5wdXQgQiBpcyBpbnN1ZmZpY2llbnRseSBjb3ZlcmVkIHdpdGggcHJlZGljYXRlcyBhdCBsb2NhCit0aW9uczogYWx0IDE6IGxpbmUgMzoxNSwgYWx0IDI6IGxpbmUgMjo5CisKKyogSW1wcm92ZWQgbm9uZGV0ZXJtaW5pc20gd2FybmluZyB0byBoYXZlOgorICBTZW1hbnRpYyBwcmVkaWNhdGVzIHdlcmUgcHJlc2VudCBidXQgd2VyZSBoaWRkZW4gYnkgYWN0aW9ucy4KK3BhcnNlciBncmFtbWFyIFU7CithIDogKEEgQik/IDsKK2IgOiBYIGEge3AxfT8gQSBCIHwgWSBhIHthMX0ge3AyfT8gQSBCIHwgWiBhIDsKKworVG8gY3JlYXRlIHRoZSBwcmVkaWN0aW9uIERGQSBmb3IgdGhlIG9wdGlvbmFsIHN1YiBydWxlIGluICdhJywgQU5UTFIgbXVzdCBmaW5kIGFsbCByZWZlcmVuY2VzIHRvICdhJyB0byBkZXRlcm1pbmUgd2hhdCBjYW4gZm9sbG93LiBBIEIgY2FuIGZvbGxvdyAnYScgaW4gdGhlIGZpcnN0IHR3byBhbHRzIHJ1bGUgJ2InLiAgIFRvIHJlc29sdmUgdGhlIGNvbmZsaWN0IGJldHdlZW4gbWF0Y2hpbmcgQSBCIGltbWVkaWF0ZWx5IGluIHRoZSBzdWIgcnVsZSBhbmQgZXhpdGluZyBydWxlICdhJyB0byBtYXRjaCBpdCBpbiAnYicsIEFOVExSIGxvb2tzIGZvciBwcmVkaWNhdGVzLiBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gcHJlZGljYXRlcyB0aGF0IGluZGljYXRlIHRoZSBzZW1hbnRpYyBjb250ZXh0IGluIHdoaWNoIHRoZSBzdXJyb3VuZGluZyBhbHRlcm5hdGl2ZXMgYXJlIHZhbGlkLiBUaGUgcHJvYmxlbSBpcyB0aGF0IG9uZSBvZiB0aGUgcHJlZGljYXRlcyBpcyBoaWRkZW4gYnkgYW4gYWN0aW9uLiBJdCB0b29rIG1lIDEuNSBkYXlzLCBidXQgSSd2ZSBmaW5hbGx5IGhhdmUgZ290dGVuIEFOVExSIHRvIHByb3Blcmx5IHRyYWNrIHRoZSBpbnN1ZmZpY2llbnRseSBjb3ZlcmVkIGFsdGVybmF0aXZlcy4gRnVydGhlciwgSSBoYXZlIGdvdHRlbiBpdCB0byB0ZWxsIHlvdSBwcmVjaXNlbHkgd2hlcmUgdGhlIHVuY292ZXJlZCBwcmVkaWNhdGVzIGFyZSBldmVuIGlmIHRoZXkgYXJlIHNpbXBseSBoaWRkZW4gYnkgYWN0aW9ucy4gSSBoYXZlIGFsc28gdXBkYXRlZCBhbGwgb2YgdGhlIG5vbmRldGVybWluaXNtIHdhcm5pbmdzIHNvIHRoYXQgaXQgdGVsbHMgeW91IGlmIHRoZXJlIHdhcyBhIHByZWRpY2F0ZSBidXQgb25lIGhpZGRlbiBieSBhbiBhY3Rpb24gKHRoaXMgY291bGQgYmUgYSBzZXBhcmF0ZSBjb25kaXRpb24gZnJvbSBpbnN1ZmZpY2llbnRseSBjb3ZlcmVkIHByZWRpY2F0ZXMpLiBoZXJlIGFyZSB5b3VyIG1lc3NhZ2VzIGZyb20gQU5UTFI6CisKK0FOVExSIFBhcnNlciBHZW5lcmF0b3IgIFZlcnNpb24gMy4xYjEgKD8/KSAgMTk4OS0yMDA3Cit3YXJuaW5nKDIwMyk6IFUuZzoyOjU6IElucHV0IHN1Y2ggYXMgIkEgQiIgaXMgaW5zdWZmaWNpZW50bHkgY292ZXJlZCB3aXRoIHByZWRpY2F0ZXMgYXQgbG9jYXRpb25zOiBhbHQgMjogbGluZSAzOjM4IGF0IEIKK1NlbWFudGljIHByZWRpY2F0ZXMgd2VyZSBwcmVzZW50IGJ1dCB3ZXJlIGhpZGRlbiBieSBhY3Rpb25zLgord2FybmluZygyMDApOiBVLmc6Mjo1OiBEZWNpc2lvbiBjYW4gbWF0Y2ggaW5wdXQgc3VjaCBhcyAiQSBCIiB1c2luZyBtdWx0aXBsZSBhbHRlcm5hdGl2ZXM6IDEsIDIKK0FzIGEgcmVzdWx0LCBhbHRlcm5hdGl2ZShzKSAyIHdlcmUgZGlzYWJsZWQgZm9yIHRoYXQgaW5wdXQKK1NlbWFudGljIHByZWRpY2F0ZXMgd2VyZSBwcmVzZW50IGJ1dCB3ZXJlIGhpZGRlbiBieSBhY3Rpb25zLgorCisqIEZpeGVkIGlzc3VlIHdoZXJlCityNDEKKyAgIDogKElOVCAtPiBJTlQpICggKCcrJyBpPUlOVCkgLT4gXigkaSAkcjQxKSApKiAnOycKKyAgIDsKK3N0aWxsIHdhcm5lZCBhYm91dCAkcjQxIGJlaW5nIGFtYmlnLgorCisqIGFjdGlvbnMgYXJlIG5vdyBhZGRlZCB0byB0aGUgTkZBLgorCisqIEZpeGVkIEFOVExSLTIyMi4gIEFOVExSIG5vdyBpZ25vcmVzIHByZWRzIGFmdGVyIGFjdGlvbnMuCisKK01heSA1LCAyMDA4CisKKyogRml4ZWQgQU5UTFItMjM1IGJ5IGJhY2tpbmcgb3V0IGEgY2hhbmdlIGZyb20gMTItMzEtMDcuCisKKyogRml4ZWQgQU5UTFItMjQ5OyBJIGluY2x1ZGUgc2VtYW50aWMgY29udGV4dCBhZ2FpbiBpbiBjbG9zdXJlIGJ1c3kgc2lnbmFsLgorCitNYXkgMywgMjAwOAorCisqIEZpeGVkIEFOVExSLTIwOC4gIExvb2tzIGluIGxpYnJhcnkgb3IgaW4gLW8gb3V0cHV0IHBhdGguICBhbnRsciAtbyBmb28gVC5nIFUuZyB3aGVyZSBVIG5lZWRzIFQudG9rZW5zIHdvbid0IHdvcmsgdW5sZXNzIHdlIGxvb2sgaW4gZm9vIHRvby4gIGZpeGVkLgorCisqIFJlZmFjdG9yZWQgYXNzaWduLnR5cGVzLmcgdG8gbW92ZSBtZXRob2RzIHRvIGEgY2xhc3MgY2FsbGVkIEFzc2lnblRva2VuVHlwZXNCZWhhdmlvci4KKworKiBGaXhlZCBBTlRMUi0yMDcuICBMZXhlcnMgaW1wb3J0aW5nIHZvY2FicyBkaWRuJ3Qgc2VlICc7Jz00IHR5cGUgYWxpYXNlcyBpbiAudG9rZW5zLgorCisqIEZpeGVkIEFOVExSLTIyOC4gIENvdWxkbid0IHVzZSB3aWxkY2FyZCBpbiBhbHRzIHdpdGggQVNUIHJld3JpdGVzLgorCitNYXkgMiwgMjAwOAorCisqIEZpeGVkIEFOVExSLTIzMDsgY2FuIHVzZSBcJyBub3cgaW4gYWN0aW9uLgorCisqIFNjb3BlIGF0dHJpYnV0ZXMgbm8gbG9uZ2VyIGhhdmUgYSBzdGFjayBkZXB0aCBjaGVjayBvbiBmcm9udC4gIElmIHlvdSByZWYgJHI6OmEgd2hlbiByIGhhcyBub3QgaW52b2tlZCB5b3UsIHRoZW4geW91IGdldCBhbiBleGNlcHRpb24gbm90IGEgZGVmYXVsdCB2YWx1ZS4gIEJhY2sgdG8gdGhlIHdheSAzLjAuMSB3b3JrZWQuCisKKyogJGNoYW5uZWwgd2FzIGEgZ2xvYmFsIHZhcmlhYmxlIGluIDMuMC4xIHVubGlrZSAkdHlwZSB3aGljaCBkaWQgbm90IGFmZmVjdCBhbiBpbnZva2luZyBsZXhlciBydWxlLiAgTm93IGl0J3MgbG9jYWwgdG9vLiAgT25seSAkdHlwZSBhbmQgJGNoYW5uZWwgYXJlIGV2ZXIgc2V0IHdpdGggcmVndWxhcml0eS4gIFNldHRpbmcgdGhvc2Ugc2hvdWxkIG5vdCBhZmZlY3QgYW4gaW52b2tpbmcgbGV4ZXIgcnVsZSBhcyBpbiB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrOgorCisgIFggOiBJRCBXUz8gJz0nIElEIDsgIC8vIHJlc3VsdCBpcyBYIG9uIG5vcm1hbCBjaGFubmVsCisgIFdTIDogJyAnKyB7JGNoYW5uZWwgPSBISURERU47IH0gOworCisgIFNUUklORyA6ICciJyAoRVNDfC4pKiAnIicgOyAgLy8gcmVzdWx0IGlzIFNUUklORyBub3QgRVNDCisKKyAgRkxPQVQgOiBJTlQgJy4nIElOVD8gOyAvLyBzaG91bGQgYmUgRkxPQVQKKyAgSU5UIDogRGlnaXQrIDsKKyAgZnJhZ21lbnQKKyAgRGlnaXQgOiAnMCcuLic5JyA7CisKKyogRml4ZWQgYnVnIGluIGludGVycHJldGVyIHJlZ2FyZGluZyAoLi4uKSogbG9vcHMKKworTWF5IDEsIDIwMDgKKworKiBGaXhlZCBBTlRMUi0yMDIuICBUaGVzZSBub3cgZ2l2ZSB3YXJuaW5ncyBhYm91dCBhbWJpZyByZWYgdG8gJGEuCisgICAgYSA6IElEIGEgLT4gJGEgfCBJTlQgOworICBhbmQKKyAgICBhIDogQSBhIHskYS50ZXh0fSB8IEIgOworCitBcHJpbCAzMCwgMjAwOAorCisqIEZpeGVkIEFOVExSLTIzNy4gdXBkYXRlZCAtZGVwZW5kIHRvIGtub3cgYWJvdXQgaW1wb3J0ZWQgZ3JhbW1hcnMuCiskIGphdmEgb3JnLmFudGxyLlRvb2wgLWRlcGVuZCAtbGliIGZvbyBULmcKKyAgQU5UTFIgUGFyc2VyIEdlbmVyYXRvciAgVmVyc2lvbiAzLjFiMSAoPz8pICAxOTg5LTIwMDcKKyAgVC5nOiBmb28vSmF2YS5nCisgIFRQYXJzZXIuamF2YSA6IFQuZworICBULnRva2VucyA6IFQuZworICBUTGV4ZXIuamF2YSA6IFQuZworICBUX0phdmEgOiBULmcKKworQXByaWwgMjksIDIwMDgKKworKiBGaXhlZCBBTlRMUi0yMTc7IHNjb3BlIEEsQixDOyBkaWRuJ3Qgd29yaworCisqIEZpeGVkIEFOVExSLTIyNDsgISBvciBeIG9uIGl0ZW0gaW4gYWx0IHdpdGggcmV3cml0ZSBnYXZlIGV4Y2VwdGlvbgorCisqIEFkZGVkIHRva2VuIG9wdGlvbnMgdG8gdGVybWluYWxzOiBJRDxub2RlPVY7IGZvbz0iQmlnIGJvYiI+IGV0Yy4uLgorICBub2RlIGlzIGRlZmF1bHQgc28geW91IGNhbiBkbyBJRDxWPiBmb3IgaGV0ZXJvIHRyZWUgdHlwZXMuIG1vc3QgY29tbW9uLgorCitBcHJpbCAxNywgMjAwOAorCisqIFVzZSBkZWZhdWx0IG1zZyBpZiB1bmtub3duIHJlY29nIHR5cGUgaW4gZ2V0RXJyb3JNZXNzYWdlKCk6CisJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOworCitBcHJpbCAxNCwgMjAwOAorCisqICV4LnkgPSBmb287IHdhcyBub3Qgd29ya2luZyBpbiBAbWVtYmVycyBzZWN0aW9uCisKK01hcmNoIDI5LCAyMDA4CisKKyogSW1wb3J0IGNvdWxkbid0IGhhbmRsZSBBIGltcG9ydHMgQiBpbXBvcnRzIEMuCisKK01hcmNoIDI3LCAyMDA4CisKKyogQWRkZWQgZ2V0L3NldElucHV0U3RyZWFtIHRvIFRva2VuIGludGVyZmFjZSBhbmQgYWZmZWN0ZWQgY2xhc3Nlcy4KKworRmVicnVhcnkgMjYsIDIwMDgKKworKiBtYWRlIGZpbGxCdWZmZXIgcHVibGljIGluIENvbW1vblRyZWVOb2RlU3RyZWFtIHNvIHdlIGNhbiBhZGQgdHJlZXMKKyAgdG8gc3RyZWFtIGZvciBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlcnMuCisKK0ZlYnJ1YXJ5IDE0LCAyMDA4CisKKyogRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbiB3aGVyZSB0cmVlIGxldmVsIDAgd2FzIHVzZWQKKyAgbm8gbWF0dGVyIHdoYXQgdG8gcmV3cml0ZSB0cmVlcyBpbiB0cmVlIGdyYW1tYXJzLiBhZGRlZCB1bml0IHRlc3QKKworKiBGaXhlZCBBTlRMUi0yMjEuIGV4Y2VwdGlvbnMgd2VyZSBnZW5lcmF0ZWQgd2hlbiB1c2luZworICBBU1QgY29uc3RydWN0aW9uIG9wZXJhdG9ycyBhbmQgbm8gb3V0cHV0PUFTVCBvcHRpb24uCisKK0ZlYnJ1YXJ5IDEzLCAyMDA4CisKKyogSW1wcm92ZWQgZXJyb3IgbXNncyBmb3IgdW5yZWFjaGFibGUgYWx0cyBhbmQgdG9rZW5zLgorCitGZWJydWFyeSAxMS0xMiwgMjAwOAorCisqIEZpeGVkIEFOVExSLTIxOS4KKyAgSXQgbG9va3MgbGlrZSB0aGUgQVNUIGNvbnN0cnVjdGlvbiBjb2RlIGZvciBzZXRzIHdhcyB0b3RhbGx5IG1lc3NlZCB1cC4KKyAgVGhpcyB3YXMgZm9yIG5vdCBvbmx5IHRoZSBuZXcgdHJlZSBwYXJzZXIgQVNUIGNvbnN0cnVjdGlvbiwgYnV0IGFsc28KKyAgdGhlIHJlZ3VsYXIgdHJlZSBjb25zdHJ1Y3Rpb24gZm9yIHBhcnNlcnMuIEkgaGFkIHRvIGludHJvZHVjZSB0ZW1wbGF0ZXMKKyAgaW4gdGhlIEFTVFRyZWVQYXJzZXIuc3RnIGZpbGUgdG8gZGVhbCB3aXRoIHRoaXMuIGFkZGVkIHVuaXQgdGVzdHM6CisgIFRlc3RUcmVlR3JhbW1hclJld3JpdGVBU1QudGVzdFNldE1hdGNoTm9SZXdyaXRlKCksCisgIHRlc3RTZXRNYXRjaE5vUmV3cml0ZUxldmVsMigpLCB0ZXN0U2V0TWF0Y2hOb1Jld3JpdGVMZXZlbDJSb290KCkuCisgIEhhZCB0byBhZGQgdGVtcGxhdGUgbWF0Y2hSdWxlQmxvY2tTZXQoKQorICB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSByZWd1bGFyIHNldCBpbiBvbmUgdGhhdCBpcyBhbiBlbnRpcmUgcnVsZS4KKyAgSWYgaXQgaXMgYW4gZW50aXJlIHJ1bGUsIGl0IGhhcyB0byBzZXQgdGhlIHJldHVybiB2YWx1ZSwgcmV0dmFsLnRyZWUuCisKKyogRml4ZWQgQU5UTFItMjIwLgorICBNYWRlIFRyZWVBZGFwdG9yIGR1cE5vZGUgYW5kIGR1cFRyZWUgZXZlbnRzIGVtaXQgZGVidWdnaW5nIGV2ZW50cworICBzbyBBVyBjb3VsZCBzZWUgdHJlZSBub2RlIGR1cGxpY2F0aW9ucy4KKworRmVicnVhcnkgNCwgMjAwOAorCisqIEJBQ0tXQVJEIElOQ09NUEFUSUJJTElUWQorICBBZGRlZCBnZXRTb3VyY2VOYW1lIHRvIEludFN0cmVhbSBhbmQgVG9rZW5Tb3VyY2UgaW50ZXJmYWNlcyBhbmQgYWxzbyB0aGUKKyAgQmFzZVJlY29nbml6ZXIuICBIYXZlIHRvIGtub3cgd2hlcmUgY2hhciBjb21lIGZyb20gZm9yIGVycm9yIG1lc3NhZ2VzLgorICBXaWRlc3ByZWFkIGNoYW5nZSwgYnV0IGEgdHJpdmlhbCBvbmUuCisKK0phbnVhcnkgMTcsIDIwMDgKKworKiBJbnRlcnByZXRlciB0aHJvd3MgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIG5vdyB3aGVuIGl0IHNlZXMgYSBwcmVkaWNhdGU7CisgIGJlZm9yZSBpdCB3YXMgc2lsZW50bHkgZmFpbGluZy4gIEknbGwgbWFrZSBpdCB3b3JrIG9uZSBvZiB0aGVzZSBkYXlzLiA7KQorCitKYW51YXJ5IDEyLCAyMDA4CisKKyogQ29weSBjdG9yIG5vdCBjb3B5aW5nIHN0YXJ0IGFuZCBzdG9wIGZvciBjb21tb24gdG9rZW4uIEZpeGVzIEFOVExSLTIxMgorCisqIFJlbW92ZWQgc2luZ2xlIHRva2VuIGluc2VydGlvbiBhbmQgZGVsZXRpb24gZm9yIHRva2Vucywgc2V0cy4KKyAgUmVxdWlyZWQgYSBjaGFuZ2UgdG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgbWF0Y2hTZXQoKSB0ZW1wbGF0ZQorICBhbmQgYSB0d2VhayBpbnNpZGUgdGhlIEJhc2VSZWNvZ25pemVyLiAgVG8gZW5nYWdlIHRoaXMgYWdhaW4gaXMgZWFzeSwKKyAganVzdCBvdmVycmlkZSBtaXNtYXRjaCgpIHRvIGNhbGwgbWlzbWF0Y2hSZWNvdmVyKCkuIEkgY2hhbmdlZCBpdCB0byBzaW1wbHkKKyAgdGhyb3cgYW4gZXhjZXB0aW9uLgorCisqIEFkZGVkIHN5bnRheEVycm9yIHJlY29nbml6ZXIgc3RhdGUgdmFyIHNvIHlvdSBjYW4gZWFzaWx5IHRlbGwgaWYKKyAgYSByZWNvZ25pemVyIGZhaWxlZC4gIEFkZGVkIGdldE51bWJlck9mU3ludGF4RXJyb3JzKCkgdG8gcmVjb2duaXplcnMuCisKKyogQWRkZWQgZG9jIGZvciB0aGUgZXJyb3Igbm9kZSBzdHVmZjoKKyAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9UcmVlK2NvbnN0cnVjdGlvbgorCisqIEZpeGVkIEFOVExSLTE5MworCisqIEFkZGVkIHJlY29nbml6ZXIgbWV0aG9kcyB0byBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IGN1cnJlbnQgbWlzbWF0Y2hlZAorICB0b2tlbiBlcnJvci4gIFVzZWZ1bCBub3cgc2luY2UgaSBkb24ndCBhdXRvbWF0aWNhbGx5IHJlY292ZXIgaW5saW5lCisgIHRvIHN1Y2ggZXJyb3JzIChJIHRocm93IGV4Y2VwdGlvbik6CisJbWlzbWF0Y2hJc1Vud2FudGVkVG9rZW4oSW50U3RyZWFtIGlucHV0LCBpbnQgdHR5cGUpCisJbWlzbWF0Y2hJc01pc3NpbmdUb2tlbihJbnRTdHJlYW0gaW5wdXQsIEJpdFNldCBmb2xsb3cpCisKKyogQWRkZWQgVW53YW50ZWRUb2tlbkV4Y2VwdGlvbiBhbmQgTWlzc2luZ1Rva2VuRXhjZXB0aW9uIHRvIG1ha2UKKyAgbWF0Y2goKSBwcm9ibGVtcyBtb3JlIHByZWNpc2UgaW4gY2FzZSB5b3Ugd2FudCB0byBjYXRjaCBkaWZmZXJlbnRseS4KKyAgVXBkYXRlZCBnZXRFcnJvck1lc3NhZ2UoKSB0byBiZSBtb3JlIHByZWNpc2UuICBTYXlzOgorCisJbGluZSAyOjkgbWlzc2luZyBFUSBhdCAnMCcKKworICBub3cgaW5zdGVhZCBvZgorCisJbGluZSAyOjkgbWlzbWF0Y2hlZCBpbnB1dCAnMCcgZXhwZWN0aW5nIEVRCisKKyAgSW5wdXQgIng9OSA5OyIgZ2l2ZXMKKworCWxpbmUgMzo4IGV4dHJhbmVvdXMgaW5wdXQgJzknIGV4cGVjdGluZyAnOycKKworICBXaGVuIHZlcnkgY29uZnVzZWQsICJ4PTkgZm9yOyIsIHlvdSBzdGlsbCBnZXQgb2xkIG1pc21hdGNoZWQgbWVzc2FnZToKKworCWxpbmUgMzo4IGV4dHJhbmVvdXMgaW5wdXQgJ2ZvcicgZXhwZWN0aW5nICc7JworCWxpbmUgMzoxMSBtaXNtYXRjaGVkIGlucHV0ICc7JyBleHBlY3RpbmcgJygnCisKKyogQWRkZWQgdW5pdCB0ZXN0cyB0byBUZXN0QXV0b0FTVCBhbmQgY29waWVkIHRvIFRlc3RSZXdyaXRlQVNUIHdpdGgKKyAgc3VpdGFibGUgcmV3cml0ZXMgdG8gZW5zdXJlIGJhc2ljIGVycm9yIG5vZGUgaW5zZXJ0aW9uIHdvcmtzLgorCitKYW51YXJ5IDExLCAyMDA4CisKKyogQWRkaW5nIGVycm9yTm9kZSB0byBUcmVlQWRhcHRvciBhbmQgdmFyaW91cyBkZWJ1ZworICBldmVudHMvbGlzdGVuZXJzLiAgSGFkIHRvIGFkZCBuZXcgY2xhc3MgcnVudGltZS50cmVlLkNvbW1vbkVycm9yTm9kZQorICB0byBob2xkIGFsbCB0aGUgZ29vZGllczogaW5wdXQgc3RyZWFtLCBzdGFydC9zdG9wIG9iamVjdHMuCisKKyogVHdlYWtlZCBDb21tb25UcmVlLmdldFR5cGUoKSB0byByZXR1cm4gSU5WQUxJRF9UT0tFTl9UWVBFCisgIGluc3RlYWQgb2YgbGl0ZXJhbCAwIChzYW1lIHRoaW5nIGF0IG1vbWVudCB0aG91Z2gpLgorCisqIFVwZGF0ZWQgQU5UTFJXb3JrcyB0byBzaG93IGVycm9yIG5vZGVzIGluIHRyZWUgYXMgbXVjaCBhcyBJIGNvdWxkOyBKZWFuCisgIHdpbGwgZ2V0IHRvIHJlc3Qgb2YgaXQuCisKK0phbnVhcnkgOS0xMCwgMjAwOAorCisqIENvbnRpbnVlZCB3b3JrIG9uIGRlYnVnZ2luZy9wcm9maWxpbmcgY29tcG9zaXRlIGdyYW1tYXJzLgorCisqIFVwZGF0ZWQgZGVidWcgcHJvdG9jb2wgZm9yIGRlYnVnZ2luZyBjb21wb3NpdGUgZ3JhbW1hcnMuICBlbnRlci9leGl0CisgIHJ1bGUgbmVlZHMgZ3JhbW1hciB0byBrbm93IHdoZW4gdG8gZmxpcCBkaXNwbGF5IGluIEFXLgorCisqIEZpeGVkIEFOVExSLTIwOS4gIEFOVExSIGNvbnN1bWVkIDIgbm90IDEgY2hhciB0byByZWNvdmVyIGluIGxleGVyLgorCisqIEFkZGVkIHR3byBmYXFzIGluc3RlYWQgb2YgbWFraW5nIGNoYW5nZXMgdG8gYW50bHIgcnVudGltZSBhYm91dAorICBsZXhlciBlcnJvciBoYW5kbGluZzoKKyAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9wYWdlcy92aWV3cGFnZS5hY3Rpb24/cGFnZUlkPTUzNDEyMzAKKyAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9wYWdlcy92aWV3cGFnZS5hY3Rpb24/cGFnZUlkPTUzNDEyMTcKKworSmFudWFyeSAxLTgsIDIwMDgKKworKiBNYWtpbmcgZGVidWdnaW5nL3Byb2ZpbGluZyB3b3JrIHdpdGggY29tcG9zaXRlIGdyYW1tYXJzLgorCisqIFVwZGF0ZWQgQU5UTFJXb3JrcyBzbyBpdCB3b3JrcyBzdGlsbCBmb3Igbm9uY29tcG9zaXRlIGdyYW1tYXJzLgorCisqIHR3byBuZXcgZXhhbXBsZXM6IGltcG9ydCBhbmQgY29tcG9zaXRlLWphdmEgKHRoZSBqYXZhIGV4YW1wbGUgZ3JhbW1hcgorICBicm9rZW4gdXAgaW50byBtdWx0aXBsZSBwaWVjZXMgdXNpbmcgaW1wb3J0KS4KKworKiBXb3JrZWQgb24gY29tcG9zaXRlIGdyYW1tYXJzLiAgSGFkIHRvIHJlZmFjdG9yIGEgbG90IG9mIGNvZGUgdG8gbWFrZQorICBBTlRMUiBkZWFsIHdpdGggb25lIG1ldGEgZ3JhbW1hciBtYWRlIHVwIG9mIG11bHRpcGxlIGdyYW1tYXJzLiAgSQorICB0aG91Z2h0IEkgaGFkIGl0IHNvcnQgb2Ygd29ya2luZyBiYWNrIGluIEF1Z3VzdC4gIFllcywgYnV0IGJhcmVseS4gTG90cworICBvZiB3b3JrIHRvIGRvIGl0IHNlZW1lZC4gIExvdHMgb2YgY2xlYW4gdXAgd29yay4gIE1hbnkgbmV3IHVuaXQgdGVzdHMKKyAgaW4gVGVzdENvbXBvc2l0ZUdyYW1tYXJzLiAgSGFkIHRvIGFkZCBuZXcgZXJyb3IgbWVzc2FnZXMgd2FybmluZyBhYm91dAorICBjb25mbGljdGluZyB0b2tlbnMgaW5oZXJpdGVkIGZyb20gbXVsdGlwbGUgZ3JhbW1hcnMgZXRjLi4uCisKKyAgICBUT0tFTl9BTElBU19DT05GTElDVChhcmcsYXJnMikgOjo9CisgICAgICAiY2Fubm90IGFsaWFzIDxhcmc+OyBzdHJpbmcgYWxyZWFkeSBhc3NpZ25lZCB0byA8YXJnMj4iCisgICAgVE9LRU5fQUxJQVNfUkVBU1NJR05NRU5UKGFyZyxhcmcyKSA6Oj0KKyAgICAgICJjYW5ub3QgYWxpYXMgPGFyZz47IHRva2VuIG5hbWUgYWxyZWFkeSBhc3NpZ25lZCB0byA8YXJnMj4iCisgICAgVE9LRU5fVk9DQUJfSU5fREVMRUdBVEUoYXJnLGFyZzIpIDo6PQorICAgICAgInRva2VuVm9jYWIgb3B0aW9uIGlnbm9yZWQgaW4gaW1wb3J0ZWQgZ3JhbW1hciA8YXJnPiIKKyAgICBJTlZBTElEX0lNUE9SVChhcmcsYXJnMikgOjo9CisgICAgICAiPGFyZy5ncmFtbWFyVHlwZVN0cmluZz4gZ3JhbW1hciA8YXJnLm5hbWU+IGNhbm5vdCBpbXBvcnQgPGFyZzIuZ3JhbW1hclR5cGVTdHJpbmc+IGdyYW1tYXIgPGFyZzIubmFtZT4iCisgICAgSU1QT1JURURfVE9LRU5TX1JVTEVfRU1QVFkoYXJnLGFyZzIpIDo6PQorICAgICAgIm5vIGxleGVyIHJ1bGVzIGNvbnRyaWJ1dGVkIHRvIDxhcmc+IGZyb20gaW1wb3J0ZWQgZ3JhbW1hciA8YXJnMj4iCisgICAgSU1QT1JUX05BTUVfQ0xBU0goYXJnLGFyZzIpIDo6PQorICAgICAgImNvbWJpbmVkIGdyYW1tYXIgPGFyZy5uYW1lPiBhbmQgaW1wb3J0ZWQgPGFyZzIuZ3JhbW1hclR5cGVTdHJpbmc+IGdyYW1tYXIgPGFyZzIubmFtZT4gYm90aCBnZW5lcmF0ZSA8YXJnMi5yZWNvZ25pemVyTmFtZT47IGltcG9ydCBpZ25vcmVkIgorCisgIFRoaXMgc3R1ZmYgZ290IHJlYWxseSByZWFsbHkgY29tcGxpY2F0ZWQuICBTeW50YWN0aWMgcHJlZGljYXRlIG5hbWVzIGV2ZW4KKyAgaGFkIHRvIGJlIHNjb3BlZCBwZXIgZ3JhbW1hciBzbyB0aGV5IGRvbid0IGNvbmZsaWN0LgorCisqIFdoZW4gdXNpbmcgc3VicnVsZXMgbGlrZSAoYXRvbS0+YXRvbSkgdG8gc2V0IHJlc3VsdCB0cmVlLCBpdCB3YXMgbm90CisgIHByb3Blcmx5IHNldHRpbmcgcmVzdWx0IChlYXJseSBlbm91Z2gpLiAgRnV0dXJlIGNvZGUgZ290IG51bGwgZm9yCisgICRydWxlLnRyZWUuCisKK0RlY2VtYmVyIDMxLCAyMDA3CisKKyogQWRkZWQgdGhlIHN0YXJ0IG9mIGEgc2VtYW50aWMgcHJlZGljYXRlIGNvbXB1dGF0aW9uIGZvciBMTCgxKSB0bworICBzb2x2ZSBhIHByb2JsZW0gd2l0aCBzbG93IGdyYW1tYXIgYW5hbHlzaXMgZXZlbiB3aXRoIGs9MSBkdWUgdG8KKyAgcHJlZGljYXRlcy4gIFRoZW4gSSByZWFsaXplZCB0aGUgcHJvYmxlbSB3aXRoIHRoYXQgZ3JhbW1hciB3YXMKKyAgZWxzZXdoZXJlLiAgU2VtYW50aWMgY29udGV4dCByZWFsbHkgc2hvdWxkbid0IGJlIHVzZWQgd2hlbgorICBwcmV2ZW50aW5nIGNsb3N1cmUgcmVjb21wdXRhdGlvbiAoTWF5IDIwMDggSSBkaXNjb3ZlcmVkIEkgd2FzCisgIHdyb25nLS15b3UgZG8gbmVlZCBpdCkuICBUaGUgcHJlZGljYXRlcyBiZWNhbWUgaHVnZSBldmVuIHRob3VnaCB0aGUKKyAgcmVkdWNlZCB2YWx1ZSB3b3VsZCBiZSBubyBkaWZmZXJlbnQuICBUaGUgYW5hbHl6ZXIgc2VlbXMgZmFzdGVyIG5vdworICB0aGF0IEkgYW0gbm90IHRlc3RpbmcgcHJlZGljYXRlIHZhbHVlcyBhbGwgdGhlIHRpbWUuICBGdXJ0aGVyIGl0IG1heQorICB0ZXJtaW5hdGUgc29vbmVyIGp1c3QgZHVlIHRvIHJlZHVjZWQgY2xvc3VyZSByZWN1cnNpb24uCisKKyogTW92ZWQgRklSU1QvRk9MTE9XIGNvbXB1dGF0aW9ucyB0byBhIHNlcGFyYXRlIGNsYXNzIExMMUFuYWx5emVyIHRvCisgIHRpZHkgdXAuCisKKyogQU5UTFIgbGV4ZXIgYWxsb3dlZCBvY3RhbCBlc2NhcGVzLCBidXQgdGhleSBkaWRuJ3Qgd29yay4gOykgIFJhdGhlciB0aGFuCisgIGZpeCwgSSdtIHJlbW92aW5nLiAgVXNlICdcdXh4eHgnIHRvIGdldCBldmVuIDggYml0IGNoYXIgdmFsdWVzOiBcdTAweHguCisKK0RlY2VtYmVyIDI5LCAyMDA3CisKKyogRml4ZWQgQU5UTFItMjA2LiBJIHdhc24ndCBhdm9pZGluZyBhbmFseXppbmcgZGVjaXNpb25zIGluCisgIGxlZnQtcmVjdXJzaXZlIHJ1bGVzLgorCisqIEhhZCB0byBhZGQgaGV0ZXJvIGFyZyB0byBhbGwgdG9rZW5SZWYqKCkgdGVtcGxhdGVzLiAgQWRkZWQgX2xhc3QKKyAgbG9jYWwgdmFyIHRvIHRyYWNrIGxhc3QgY2hpbGQgc28gd2UgY2FuIGRvIHJlcGxhY2VDaGlsZHJlbigpIGR1cmluZworICBBU1QgcmV3cml0ZSBtb2RlIGZvciB0cmVlIGdyYW1tYXJzLiAgU2hvdWxkIGJlIHVzZWZ1bCBsYXRlciBmb3IgLnRleHQKKyAgcHJvcGVydHkuICBBY2ssIGhldGVybyBhcmcgaXMgb24gbG90cyBvZiB0ZW1wbGF0ZXMuIDooICBNb3ZlZAorICBydWxlQ2xlYW5VcCgpIHRlbXBsYXRlIGludG8gQVNUVHJlZVBhcnNlciBhbmQgQVNUUGFyc2VyIGdyb3Vwcy4KKworKiBhZGRlZCBub1Jld3JpdGUoKSB0ZW1wbGF0ZSAodG8gSmF2YS5zdGcpIHNvIHdlIGNhbiBpbnNlcnQgY29kZSBkdXJpbmcKKyAgcmV3cml0ZSBtb2RlIHRvIHJldHVybiBvcmlnaW5hbCB0cmVlIGlmIG5vIHJld3JpdGUuICBNaWdodCBiZSB1c2VmdWwKKyAgZm9yIHRva2VuIHJld3JpdGVzIGxhdGVyLiAgRm9yIHRlbXBsYXRlcyB0b28/CisKKyogSGFkIHRvIGFkZCBpZiAhcmV3cml0ZU1vZGUgYXJvdW5kIHRyZWUgY29uc3RydWN0aW9uIGluIHRyZWUgcGFyc2VyCisgIHRlbXBsYXRlcy4KKworKiBIYXJhbGQgTXVsbGVyIHBvaW50ZWQgb3V0IHRoYXQgd2UgbmVlZCB0byB1c2UgPGluaXRWYWx1ZShhdHRyLnR5cGUpPgorICBpbiBvdXIgdGVzdHMgZm9yIG51bGwgdG9rZW4vcnVsZSBwcm9wZXJ0eSByZWZlcmVuY2VzLiBGb3IgaW50IHR5cGVzCisgIHdlIG5lZWQgMCBub3QgbnVsbC4gKHAhPW51bGw/cC5saW5lOjApLiAgQ2hhbmdlZCBzY29wZUF0dHJpYnV0ZVJlZiwKKyAgcnVsZUxhYmVsUmVmLiAgQWxzbyBjaGFuZ2VkIHRoZSBrbm93biB0eXBlZCBhdHRyaWJ1dGVzIGxpa2UKKyAgbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9saW5lIHRvIHlpZWxkIDAgdXBvbiBudWxsIHJ1bGUgcmVmIHRvCisgIGJlIGNvbnNpc3RlbnQgd2l0aCBjYXNlIHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgdHlwZS4gIEZpeGVzIEFOVExSLTE5NS4KKyAgQWRkZWQgdGVzdFR5cGVPZkd1YXJkZWRBdHRyaWJ1dGVSZWZJc0NvcnJlY3QgdGVzdCBhbmQgcmVzZXQgZXhwZWN0ZWQKKyAgb3V0cHV0IGZvciAxMyB0ZXN0cyB0aGF0IG5vdyAiZmFpbCIuCisKK0RlY2VtYmVyIDI4LCAyMDA3CisKKyogYWRkZWQgcG9seWRpZmYgZXhhbXBsZSAoSmF2YSB0YXJnZXQpCisKKyogYWRkZWQgImludCIgcHJvcGVydHkgZm9yIHRva2VuIGFuZCBsZXhlciBydWxlIHJlZnMuICBzdXBlciBjb252ZW5pZW50LiBFLmcuLAorICBhIDogYj1JTlQge2ludCB4ID0gJGIuaW50O30gOworCitEZWNlbWJlciAyNywgMjAwNworCisqIENoYW5nZWQgLVhub2lubGluZWRmYSB0byAtWG1heGlubGluZWRmYXN0YXRlcyBtIHdoZXJlIG0gaXMKKyAgbWF4aW11bSBudW1iZXIgb2Ygc3RhdGVzIGEgREZBIGNhbiBoYXZlIGJlZm9yZSBBTlRMUiBhdm9pZHMKKyAgaW5saW5pbmcgaXQuICBJbnN0ZWFkLCB5b3UgZ2V0IGEgdGFibGUtYmFzZWQgREZBLiAgVGhpcworICBhZmZlY3RpdmVseSBhdm9pZHMgc29tZSBhY3ljbGljIERGQSB0aGF0IHN0aWxsIGhhdmUgbWFueSBzdGF0ZXMKKyAgd2l0aCBtdWx0aXBsZSBpbmNpZGVudCBlZGdlcy4gIFRoZSBjb21iaW5hdG9yaWFsIGV4cGxvc2lvbiBzbWFja3MKKyAgb2YgaW5maW5pdGUgbG9vcC4gIEZpeGVzIEFOVExSLTEzMC4KKworKiBbLi4uXSBhcmUgYWxsb3dlZCBpbiBhcmdzIG5vdyBidXQgXSBtdXN0IGJlIGVzY2FwZWQgYXMgXF0uIEUuZy4sCisgIGFbU3RyaW5nW1xdIGljaywgaW50IGldIDogLi4uIDsKKyAgQW5kIGNhbGxpbmcgYSBydWxlOiBmb29beFtpXF0sIDM0XQorICBGaXhlcyBBTlRMUi0xNDAuCisKKyogRml4ZWQgQU5UTFItMTA1LiAgVGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tQU5UTFJTdHJpbmdMaXRlcmFsKCkKKyAgZXNjYXBlZCAiIHRoYXQgd2VyZSBhbHJlYWR5IGVzY2FwZWQuCisKKyogdGFyZ2V0J3MgY2FuIG5vdyBzcGVjaWZ5IGhvdyB0byBlbmNvZGUgaW50IGFzIGNoYXIgZXNjYXBlLiAgTW92ZWQKKyAgREZBLmVuY29kZUludEFzQ2hhckVzY2FwZSB0byBUYXJnZXQuCisKKyogQnVnIGluIHJ1bnRpbWUuREZBLiAgSWYgYSBzcGVjaWFsIHN0YXRlIChvbmUgd2l0aCBwcmVkaWNhdGUpIGZhaWxlZCwgaXQKKyAgdHJpZWQgdG8gY29udGludWUgKGNhdXNpbmcgb3V0IG9mIHJhbmdlIGV4Y2VwdGlvbiBkdWUgdG8gc3RhdGUgPSAtMSkKKyAgaW5zdGVhZCBvZiByZXBvcnRpbmcgZXJyb3IuCisKKyogSWYgLWRmYSB3aXRoIGNvbWJpbmVkIGdyYW1tYXIgVC5nLCBidWlsZHMgVC5kZWMtKi5kb3QgYW5kIFRMZXhlci5kZWMtKi5kb3QKKworKiBGaXggQU5UTFItMTY1LgorICBHZW5lcmF0ZSBUUGFyc2VyLmphdmEgYW5kIFRMZXhlci5qYXZhIGZyb20gVC5nIGlmIGNvbWJpbmVkLCBlbHNlCisgIHVzZSBULmphdmEgYXMgb3V0cHV0IHJlZ2FyZGxlc3Mgb2YgdHlwZS4KKyAgQkFDS1dBUkQgSU5DT01QQVRJQklMSVRZIHNpbmNlIGZpbGUgbmFtZXMgY2hhbmdlLgorICBJIGNoYW5nZWQgdGhlIGV4YW1wbGVzLXYzL2phdmEgdG8gYmUgY29uc2lzdGVudC4gIFJlcXVpcmVkIFhNTC5nIC0+CisgIFhNTExleGVyLmphdmEgYW5kIGZ1enp5L01haW4uamF2YSBjaGFuZ2UuCisKKyogRml4IEFOVExSLTE2OS4gIERlbGV0ZXMgdG1wIGxleGVyIGdyYW1tYXIgZmlsZS4KKworRGVjZW1iZXIgMjUsIDIwMDcKKworKiBGaXhlZCBBTlRMUi0xMTEuICBNb3JlIHVuaXQgdGVzdHMgaW4gVGVzdEF0dHJpYnV0ZXMuCisKK0RlY2VtYmVyIDI1LCAyMDA3CisKKyogRGFuZ2xpbmcgc3RhdGVzICgiZGVjaXNpb24gY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYWx0ZXJuYXRpdmVzCisgIGZvciBhdCBsZWFzdCBvbmUgaW5wdXQgc2VxdWVuY2UiKSBpcyBub3cgYW4gZXJyb3Igbm90IGEgd2FybmluZy4KKworKiBBZGRlZCBzYW1wbGUgaW5wdXQgc2VxdWVuY2UgdGhhdCBsZWFkcyB0byBkYW5nbGluZyBERkEgc3RhdGUsIG9uZQorICB0aGF0IGNhbm5vdCByZWFjaCBhbiBhY2NlcHQgc3RhdGUuICBBTlRMUiByYW4gaW50byBhIGNhc2Ugd2hlcmUKKyAgdGhlIHNhbWUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBtdWx0aXBsZSBsb2NhdGlvbnMgaW4gdGhlIE5GQQorICAoYW5kIHNvIG5vdCBub25kZXRlcm1pbmlzdGljKSwgYnV0IGFuYWx5c2lzIHJhbiBvdXQgb2YgZnVydGhlcgorICBORkEgc3RhdGVzIHRvIGxvb2sgZm9yIG1vcmUgaW5wdXQuICBDb21tb25seSBhdCBFT0YgdGFyZ2V0IHN0YXRlcy4KKyAgTm93IHNheXM6CisKKyAgZXJyb3IoMjAyKTogQ1MuZzoyNDg6OTU6IHRoZSBkZWNpc2lvbiBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbHRlcm5hdGl2ZShzKSAxLDIgZm9yIGlucHV0IHN1Y2ggYXMgIkRPVCBJREVOVElGSUVSIEVPRiIKKworICBBbHNvIGZpeGVkIGJ1ZyB3aGVyZSBkYW5nbGluZyBzdGF0ZXMgZGlkIG5vdCByZXNvbHZlIHRvIHN0b3Agc3RhdGVzLgorCisqIEZpeGVkIEFOVExSLTEyMworCitEZWNlbWJlciAxNy0yMSwgMjAwNworCisqIGs9MSBkb2Vzbid0IHByZXZlbnQgYmFja3RyYWNraW5nIGFueW1vcmUgYXMgaW4KKyAgKG9wdGlvbnMge2s9MTt9OidlbHNlJyBzdGF0ZW1lbnQpPworICBpZiBiYWNrdHJhY2s9dHJ1ZSBmb3Igb3ZlcmFsbCBncmFtbWFyLiAgU2V0IHRvIGZhbHNlIGluIHN1YnJ1bGUuCisKKyogT3B0aW1pemVkIHRoZSBhbmFseXNpcyBlbmdpbmUgZm9yIExMKDEpLiAgRG9lc24ndCBhdHRlbXB0IExMKCopIHVubGVzcworICBMTCgxKSBmYWlscy4gIElmIG5vdCBMTCgxKSBidXQgYXV0b2JhY2t0cmFja2luZyBidXQgbm8gb3RoZXIga2luZCBvZgorICBwcmVkaWNhdGUsIGl0IGFsc28gYXZvaWRzIExMKCopLiAgVGhpcyBpcyBvbmx5IGltcG9ydGFudCBmb3IgcmVhbGx5CisgIGJpZyA0MDAwIGxpbmUgZ3JhbW1hcnMgZXRjLi4uCisKKyogTG90cyBvZiBjb2RlIGNsZWFuIHVwCisKK0RlY2VtYmVyIDE2LCAyMDA3CisKKyogWWV0IG1vcmUgS2F5IHBhaXIgcHJvZ3JhbW1pbmcuICBTYXZlZCB5ZXQgbW9yZSBSQU07IDE1JSBieQorICB3YWNraW5nIE5GQSBjb25maWd1cmF0aW9ucyBldGMgaW4gZWFjaCBERkEgc3RhdGUgYWZ0ZXIgREZBIGNvbnN0cnVjdGlvbi4KKworKiBPdmVyYWxsIHdlIGRyb3AgZnJvbSAybTQ5cyB0byAxbTExcyBmb3IgYSBodWdlIDQwMDAgbGluZSBUU1FMIGdyYW1tYXIKKyAgd2l0aCBrPSouICBPbmx5IG5lZWRzIC1YY29udmVyc2lvbnRpbWVvdXQgMjAwMCBub3cgbm90CisgIC1YY29udmVyc2lvbnRpbWVvdXQgNTAwMCB0b28uICBXaXRoIGs9MSwgaXQncyAxbTMwcyBkb3duIHRvIDQwcy4KKworRGVjZW1iZXIgMTUsIDIwMDcKKworKiBXb3JraW5nIHdpdGggS2F5IFJvZXBrZSwgd2UgZ290IGFib3V0IDE1JSBzcGVlZCBpbXByb3ZlbWVudCBpbgorICBvdmVyYWxsIEFOVExSIGV4ZWMgdGltZS4gIE1lbW9yeSBmb290cHJpbnQgc2VlbXMgdG8gYmUgYWJvdXQgNTAlCisgIHNtYWxsZXIuCisKK0RlY2VtYmVyIDEzLTE0LCAyMDA3CisKKyogSSBhYm9ydCBlbnRpcmUgREZBIGNvbnN0cnVjdGlvbiBub3cgd2hlbiBJIHNlZSByZWN1cnNpb24gaW4gPiAxIGFsdC4KKyAgRGVjaXNpb24gaXMgbm9uLUxMKCopIGV2ZW4gaWYgc29tZSBwaWVjZXMgYXJlIExMKCopLiAgU2FmZXIgdG8gYmFpbAorICBvdXQgYW5kIHRyeSB3aXRoIGZpeGVkIGsuICBJZiB1c2VyIHNldCBmaXhlZCBrIHRoZW4gaXQgY29udGludWVzIGJlY2F1c2UKKyAgYW5hbHlzaXMgd2lsbCBldmVudHVhbGx5IHRlcm1pbmF0ZSBmb3Igc3VyZS4gIElmIGEgcHJlZCBpcyBlbmNvdW50ZXJlZAorICBhbmQgaz0qIGFuZCBpdCdzIG5vbi1MTCgqKSwgaXQgYWJvcnRzIGFuZCByZXRyaWVzIGF0IGs9MSBidXQgZG9lcyBOT1QKKyAgZW1pdCBhbiBlcnJvci4KKworKiBEZWNpZGVkIHRoYXQgcmVjdXJzaW9uIG92ZXJmbG93IHdoaWxlIGNvbXB1dGluZyBhIGxvb2thaGVhZCBERkEgaXMKKyAgc2VyaW91cyBlbm91Z2ggdGhhdCBJIHNob3VsZCBiYWlsIG91dCBvZiBlbnRpcmUgREZBIGNvbXB1dGF0aW9uLgorICBQcmV2aW91c2x5IGFuYWx5c2lzIHRyaWVkIHRvIGtlZXAgZ29pbmcgYW5kIG1hZGUgdGhlIHJ1bGVzIGFib3V0CisgIGhvdyBhbmFseXNpcyB3b3JrZWQgbW9yZSBjb21wbGljYXRlZC4gIEJldHRlciB0byBzaW1wbHkgYWJvcnQgd2hlbgorICBkZWNpc2lvbiBjYW4ndCBiZSBjb21wdXRlZCB3aXRoIGN1cnJlbnQgbWF4IHN0YWNrICgtWG0gb3B0aW9uKS4KKyAgVXNlciBjYW4gYWRqdXN0IG9yIGFkZCBwcmVkaWNhdGUgZXRjLi4uICBUaGlzIGlzIG5vdyBhbiBlcnJvcgorICBub3QgYSB3YXJuaW5nLgorCisqIFJlY3Vyc2lvbiBvdmVyZmxvdyBhbmQgdW5yZWFjaGFibGUgYWx0IGlzIG5vdyBhIGZhdGFsIGVycm9yOyBubyBjb2RlIGdlbi4KKyAgVGhlIGRlY2lzaW9uIHdpbGwgbGl0ZXJhbGx5IG5vdCB3b3JrLgorCisqIENsZWFuZWQgdXAgaG93IERGQSBjb25zdHJ1Y3Rpb24vYW5hbHlzaXMgYWJvcnRzIGR1ZSB0byBub24tTEwoKikgYW5kCisgIG92ZXJmbG93IGV0Yy4uLiAgVGhyb3dzIGV4Y2VwdGlvbnMgbm93LCB3aGljaCBjbGVhbnMgdXAgYSBidW5jaCBvZiBJRgorICBjaGVja3MgZXRjLi4uICBWZXJ5IG5pY2Ugbm93LiBFeGNlcHRpb25zOgorCWFuYWx5c2lzL0FuYWx5c2lzUmVjdXJzaW9uT3ZlcmZsb3dFeGNlcHRpb24uamF2YQorCWFuYWx5c2lzL0FuYWx5c2lzVGltZW91dEV4Y2VwdGlvbi5qYXZhCisJYW5hbHlzaXMvTm9uTExTdGFyRGVjaXNpb25FeGNlcHRpb24uamF2YQorCisqIEVycm9yTWFuYWdlci5ncmFtbWFyV2FybmluZygpIGNvdW50ZWQgdGhlbSBhcyBlcnJvcnMgbm90IHdhcm5pbmdzLgorCisqIFVucmVhY2hhYmxlIGFsdCB3YXJuaW5ncyBhcmUgbm93IGVycm9ycy4KKworKiBUaGUgdXBzaG90IG9mIHRoZXNlIGNoYW5nZXMgaXMgdGhhdCBJIGZpeGVkIEFOVExSLTE3OCBhbmQgZGlkCisgIGxvdHMgb2YgcmVmYWN0b3Jpbmcgb2YgY29kZSBoYW5kbGluZyBhbmFseXNpcyBmYWlsdXJlLgorCitEZWNlbWJlciAxMSwgMjAwNworCisqIENvdWxkIG5vdCBkZWFsIHdpdGggc3BhY2VzLCBvZGRseSBlbm91Z2ggaW4gYXJnIGxpc3RzOgorCWdyYW1tYXIgQmFkOworCWEgOiBBIGJbImZvbyIsICRBLnRleHRdIDsKKwliW1N0cmluZyB4LCBTdHJpbmcgeV0gOiBDIDsKKworT2N0b2JlciAyOCwgMjAwNworCisqIE1hZGUgQU5UTFIgZW1pdCBhIGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gaXQgY2Fubm90IHdyaXRlIHRoZQorICBpbXBsaWNpdCBsZXhlciBmaWxlIGZyb20gYSBjb21iaW5lZCBncmFtbWFyLiBVc2VkIHRvIHNheSAiY2Fubm90IG9wZW4KKyAgZmlsZSIsIG5vdyBzYXlzICJjYW5ub3Qgd3JpdGUgZmlsZSIgYW5kIGdpdmVzIGJhY2t0cmFjZS4KKworU2VwdGVtYmVyIDE1LCAyMDA3CisKK2FkZCBnZXRDaGFyU3RyZWFtIHRvIExleGVyLgorCitTZXB0ZW1iZXIgMTAsIDIwMDcKKworKiBBZGRlZCB7ey4uLn19IGZvcmNlZCBhY3Rpb24gZXhlY3V0ZWQgZXZlbiBkdXJpbmcgYmFja3RyYWNraW5nLgorCitTZXB0ZW1iZXIgOSwgMjAwNworCisqIHI9J3N0cmluZycgaW4gbGV4ZXIgZ290IGEgZHVwbGljYXRlIGxhYmVsIGRlZmluaXRpb24uCisKK0F1Z3VzdCAyMSwgMjAwNworCisqICRzY29wZTo6dmFyaWFibGUgcmVmcyBub3cgY2hlY2sgZm9yIGVtcHR5IHN0YWNrIHNvIHRoYXQgZXhwciA9PSBudWxsIGlmCisgICRzY29wZSBoYXMgYW4gZW1wdHkgc3RhY2suIFdvcmtzIGZvciAkc2NvcGVbLi4uXTo6dmFyaWFibGUgdG9vLiAgTmljZSEKKworQXVndXN0IDIwLCAyMDA3CisKKyogQWRkZWQgcmVzZXQoKSB0byBDb21tb25UcmVlTm9kZVN0cmVhbSwgdG9rZW4gc3RyZWFtIHRvbworCisqIE1hZGUgcmVmcyB0byBydWxlL3Rva2VuIHByb3BlcnRpZXMgdXNlID86IHRvIGF2b2lkIG51bGwgcHRyIGV4Y2VwdGlvbi4KKyAgJGxhYmVsLnN0IG5vdyBpcyBsYWJlbCE9bnVsbD9sYWJlbC5zdDpudWxsLiAgVXBkYXRlZCBUZXN0QXR0cmlidXRlcy4KKyAgVGhpcyBpcyB1c2VmdWwgbm90IG9ubHkgZm9yIG9wdGlvbmFsIHJ1bGUvdG9rZW4gcmVmcywgYnV0IGFsc28gZHVyaW5nCisgIGVycm9yIHJlY292ZXJ5LiAgSWYgSUQgaXMgbm90IG1hdGNoZWQsICRJRC50ZXh0IHdvbid0IGNhdXNlIGEgbnVsbCBwdHIuCisKK0F1Z3VzdCAyMCwgMjAwNworKglGaXhlZCBBTlRMUi0xNzc6IGhhc2hDb2RlL2VxdWFscyBub3QgY29uc2lzdGVudCBmb3IgbGFiZWwKKwlGaXhlZCBidWcgd2hlcmUgUnVsZSB3YXMgY29tcGFyZWQgdG8gc3RyaW5nOyBpbnRyb2R1Y2VkIGZyb20gZGV2IGJyYW5jaAorCitBdWd1c3QgMTUsIDIwMDcgLS0gR290IHJvdWdoIGRyYWZ0IG9mIHRoZSBncmFtbWFyIGltcG9ydCB3b3JraW5nLgorICAgICAgICAgICAgICAgICAgIFN1Ym1pdCB0byBkZXYgYW5kIHRoZW4gaW50ZWdyYXRlIGludG8gbWFpbmxpbmUuCisKKwlBbGwgZmlsZSBjaGFuZ2VzL2FkZGl0aW9uczoKKworCVJFQURNRS50eHQJIyBlZGl0CisJQ0hBTkdFUy50eHQJIyBhZGQKKwkgIEZhY3RvcmVkIG91dCB0aGUgY2hhbmdlcyBmcm9tIHRoZSByZWFkbWUuCisKKwlydW50aW1lL0phdmEvc3JjL29yZy9hbnRsci9ydW50aW1lL0Jhc2VSZWNvZ25pemVyLmphdmEJIyBlZGl0CisJcnVudGltZS9KYXZhL3NyYy9vcmcvYW50bHIvcnVudGltZS9ERkEuamF2YQkjIGVkaXQKKwlydW50aW1lL0phdmEvc3JjL29yZy9hbnRsci9ydW50aW1lL0xleGVyLmphdmEJIyBlZGl0CisJcnVudGltZS9KYXZhL3NyYy9vcmcvYW50bHIvcnVudGltZS9QYXJzZXIuamF2YQkjIGVkaXQKKwlydW50aW1lL0phdmEvc3JjL29yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnUGFyc2VyLmphdmEJIyBlZGl0CisJcnVudGltZS9KYXZhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXJzZXIuamF2YQkjIGVkaXQKKwkgIEZhY3RvcmVkIHN0YXRlIGZpZWxkcyBpbnRvIFJlY29nbml6ZXJTaGFyZWRTdGF0ZQorCSAgb2JqZWN0LiBZb3Ugd2lsbCBzZWUgYSBsb3Qgb2YgdGhpbmdzIGxpa2UKKyAgICAgICAgICAgIHN0YXRlLmVycm9yUmVjb3ZlcnkgPSBmYWxzZTsKKwlydW50aW1lL0phdmEvc3JjL29yZy9hbnRsci9ydW50aW1lL1JlY29nbml6ZXJTaGFyZWRTdGF0ZS5qYXZhCSMgYWRkCisgICAgICAgICAgU2hhcmVzIGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcyBpbmNsdWRpbmcgbGV4ZXIgZXZlbiB0aG91Z2gKKwkgIHRoZXNlIGFyZSBzdXBlcmZsdW91cyB0byBwYXJzZXJzIGFuZCB0cmVlIHBhcnNlcnMuICBUaGVyZQorCSAgd2FzIGEgY2FzdGluZyBpc3N1ZSB0aGF0IEkgY291bGQgbm90IHJlc29sdmUuCisKKwlzcmMvb3JnL2FudGxyL1Rvb2wuamF2YQkjIGVkaXQKKwkgIEJyb2tlIGEgcGFydCBHcmFtbWFyLnNldEdyYW1tYXJDb250ZW50KCkgaW50bworCSAgcGFyc2VBbmRCdWlsZEFTVCgpIGFuZCBhbmFseXplR3JhbW1hcigpIHRvIG1ha2UgdGhlIGdyYW1tYXIKKwkgIGltcG9ydCB3b3JrLiBJIG5lZWRlZCB0byBiZSBhYmxlIHRvIGxvb2sgYXQgdGhlIHRyZWVzIGZvcgorCSAgaW1wb3J0ZWQgZ3JhbW1hcnMgYmVmb3JlIGFuYWx5emluZyB0aGVtIGFuZCBidWlsZGluZyBERkEuIEFkZGVkCisJICB1c2Ugb2YgdGhlIENvbXBvc2l0ZUdyYW1tYXIgb2JqZWN0IGFuZCBoYW5kbGluZyBvZiBtdWx0aXBsZQorCSAgZGVsZWdhdGUgZ3JhbW1hcnMuIENoYW5nZWQgZGVjaXNpb24gREZBIERPVCBmaWxlIG5hbWVzIHRvCisJICBpbmNsdWRlIHRoZSBncmFtbWFyIG5hbWUuCisKKwlzcmMvb3JnL2FudGxyL2FuYWx5c2lzL0RGQS5qYXZhCSMgZWRpdAorCSAgSnVzdCB0d2Vha2VkIHRvIHVzZSBnZW5lcmljcywgdXBkYXRlZCBhIGNvbW1lbnQuCisKKwlzcmMvb3JnL2FudGxyL2FuYWx5c2lzL0RlY2lzaW9uUHJvYmUuamF2YQkjIGVkaXQKKwkgIEp1c3QgdHdlYWtlZCB0byB1c2UgZ2VuZXJpY3MuCisKKwlzcmMvb3JnL2FudGxyL2FuYWx5c2lzL05GQS5qYXZhCSMgZWRpdAorCSAgTkZBIG5vdyBzcGFuIG11bHRpcGxlIGdyYW1tYXJzIGFuZCBzbyBJIG1vdmVkIHRoZSBORkFzIHN0YXRlCisJICB0cmFja2luZyB0byB0aGUgY29tcG9zaXRlIGdyYW1tYXIgb2JqZWN0LgorCisJc3JjL29yZy9hbnRsci9hbmFseXNpcy9ORkFTdGF0ZS5qYXZhCSMgZWRpdAorCSAgQWRkZWQgc29tZSBudWxsIGNoZWNraW5nIGFuZCBtYWRlIGEgZmllbGQgcHVibGljLgorCisJc3JjL29yZy9hbnRsci9hbmFseXNpcy9ORkFUb0RGQUNvbnZlcnRlci5qYXZhCSMgZWRpdAorCSAgQ2hhbmdlZCBhIG1ldGhvZCBjYWxsIHRvIGRpcmVjdGx5IGFjY2VzcyBhIGZpZWxkLgorCisJc3JjL29yZy9hbnRsci9hbmFseXNpcy9SdWxlQ2xvc3VyZVRyYW5zaXRpb24uamF2YQkjIGVkaXQKKwkgIEluc3RlYWQgb2YgdXNpbmcgYSBydWxlIGluZGV4LCB3aGljaCBkb2VzIG5vdCBzcGFuIG11bHRpcGxlCisJICBncmFtbWFycywgdGhlIHRyYW5zaXRpb24gb2JqZWN0IG5vdyBhdHRyYWN0cyBhIHBvaW50ZXIgdG8KKwkgIHRoZSBhY3R1YWwgUnVsZSBkZWZpbml0aW9uIG9iamVjdC4KKworCXNyYy9vcmcvYW50bHIvYW5hbHlzaXMvU2VtYW50aWNDb250ZXh0LmphdmEJIyBlZGl0CisJICBUd2Vha2VkIHRvIHVzZSBhIGZpZWxkIGluc3RlYWQgb2YgYSBtZXRob2QKKworCXNyYy9vcmcvYW50bHIvY29kZWdlbi9BY3Rpb25UcmFuc2xhdG9yLmcJIyBlZGl0CisJc3JjL29yZy9hbnRsci9jb2RlZ2VuL0FjdGlvblRyYW5zbGF0b3JMZXhlci5qYXZhCSMgZWRpdAorCSAgVHdlYWtlZCB0byB1c2UgbmV3IHJ1bnRpbWUgYW5kIHRoZXkgY2hhbmdlZCBtZXRob2QgbmFtZS4KKworCXNyYy9vcmcvYW50bHIvY29kZWdlbi9Db2RlR2VuZXJhdG9yLmphdmEJIyBlZGl0CisJICBUd2Vha2VkIGNvbW1lbnRzLgorCisJc3JjL29yZy9hbnRsci9jb2RlZ2VuL2NvZGVnZW4uZwkjIGVkaXQKKwkgIEFkZGVkIGltcG9ydCBncmFtbWFyIHN5bnRheCBhbmQgYWx0ZXJlZCBydWxlIGF0b20gdG8gcGFzcyBhCisJICBzY29wZSBhcm91bmQgc28gdGhhdCBncmFtbWFyLnJ1bGUgd29ya3MuICBDYXV0aW9uIHRoaXMKKwkgIGZlYXR1cmUgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEFOVExSIGFuZCBpcyBub3QgbWVhbnQgdG8gYmUKKwkgIHVzZWQgYnkgdXNlcnMgYXQgdGhpcyBwb2ludC4KKworCXNyYy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQU5UTFJDb3JlLnN0aQkjIGVkaXQKKwkgIEFkZGVkIHNjb3BlIHRvIGFsbCBydWxlcmVmIHRlbXBsYXRlIGludGVyZmFjZXMuCisKKwlzcmMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvSmF2YS5zdGcJIyBlZGl0CisJICBHcmFtbWFycyBjYW4gbm93IGltcG9ydCBvdGhlciBncmFtbWFycywgd2hpY2ggSSBpbXBsZW1lbnRlZAorCSAgdXNpbmcgYSBkZWxlZ2F0aW9uIHBvaW50ZXIgdG8gdGhlIG90aGVyIGdyYW1tYXIocykuIFNvIGlmCisJICBncmFtbWFyIEEgaW1wb3J0cyBncmFtbWFycyBCIGFuZCBDLCB0aGVuIHRoZSBnZW5lcmF0ZWQKKwkgIHJlY29nbml6ZXIgZm9yIEEgbXVzdCBoYXZlIGRlbGVnYXRpb24gcG9pbnRlcnMgdG8gQlBhcnNlcgorCSAgYW5kIENQYXJzZXIgb2JqZWN0cy4gVGhlc2UgYXJlIG5vdyBmaWVsZHM6CisKKwkgICAgLy8gZGVsZWdhdGVzCisJICAgIDxncmFtbWFyLmRlbGVnYXRlczoKKwkgICAgIHtnfHB1YmxpYyA8Zy5uYW1lPkxleGVyIDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworICAgICAgICAgIEFsc28sIEIgYW5kIEMgbXVzdCBoYXZlIGJhY2sgcG9pbnRlcnMgdG8gdGhlIGRlbGVnYXRvciBzbworICAgICAgICAgIHRoYXQgdGhleSBjYW4gcmVmZXIgdG8gcnVsZXMgdGhhdCBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4KKyAgICAgICAgICBUaGlzIGlzIGEgbWVjaGFuaXNtIGFraW4gdG8gc3RhdGljIGluaGVyaXRhbmNlOgorCisJICAgIC8vIGRlbGVnYXRvcnMKKwkgICAgPGdyYW1tYXIuZGVsZWdhdG9yczoKKwkgICAgIHtnfHB1YmxpYyA8Zy5uYW1lPkxleGVyIDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworCSAgVGhpcyBmaWxlIGFsc28gaGFzIGEgbG90IG9mIGNoYW5nZXMgc28gdGhhdCBzdGF0ZSB2YXJpYWJsZXMKKwkgIG5vdyBhcmUgc3RhdGUuYmFja3RyYWNraW5nIGluc3RlYWQgb2YgdGhlIGltcGxpZWQKKwkgIHRoaXMuYmFja3RyYWNraW5nLgorCisJICBUaGUgZmlsZSBhbHNvIHJlZmVycyB0byBncmFtbWFyLmRlbGVnYXRlZFJ1bGVzIGF0dHJpYnV0ZQorCSAgd2hpY2ggaXMgdGhlIGxpc3Qgb2YgUnVsZSBvYmplY3RzIGZvciB3aGljaCB5b3UgbXVzdAorCSAgZ2VuZXJhdGUgbWFudWFsIGRlbGVnYXRpb24uICBUaGlzIGFtb3VudHMgdG8gYSBzdHViIHdoZXJlYnkKKwkgIHJ1bGUgZm9vJ3MgbWV0aG9kIGZvbygpIHNpbXBseSBjYWxscyBYLmZvbygpIGlmIGZvbyBpcyBub3QKKwkgIGRlZmluZWQgaW5zaWRlIHRoZSBkZWxlZ2F0b3IuCisKKwkgIFlvdSB3aWxsIG5vdGljZSB0aGF0IHRoZSBydWxlcmVmIHRlbXBsYXRlcyBub3cgdGFrZSBhIHNjb3BlCisJICBzbyB0aGF0IEkgY2FuIGhhdmUgaW1wbGljaXQgcnVsZSBUb2tlbnMgcmVmZXJyZWQgdG8KKwkgIGRlbGVnYXRlLlRva2VucyBydWxlIGluIGEgZGVsZWdhdGUgZ3JhbW1hci4gIFRoaXMgaXMgdGhlIHdheQorCSAgSSBkbyBsZXhlciBncmFtbWFyIGltcG9ydHMuCisKKwkgIEkgYWRkZWQgYSB0ZW1wbGF0ZSBjYWxsZWQgZGVsZWdhdGVOYW1lIHdoaWNoIHVzZXMgdGhlCisJICBncmFtbWFyIG5hbWUgdG8gY29tcHV0ZSBhIGRlbGVnYXRlIG5hbWUgaWYgdGhlIHVzZXIgZG9lcyBub3QKKwkgIHNwZWNpZnkgYSBsYWJlbCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudCBzdWNoIGFzOgorCisJICBpbXBvcnQgeD1YOworCisJICBPaCwgbm90ZSB0aGF0IHJ1bGUgcmVmZXJlbmNlIHRlbXBsYXRlcyBhbGwgcmVjZWl2ZSBhIFJ1bGUKKwkgIG9iamVjdCBub3cgaW5zdGVhZCBvZiB0aGUgc2ltcGxlIHJ1bGUgbmFtZSBhcyB0aGUgJ3J1bGUnCisJICBhdHRyaWJ1dGUuICBZb3Ugd2lsbCBzZWUgbWUgZG9pbmcgPHJ1bGUubmFtZT4gaW5zdGVhZCBvZgorCSAgPG5hbWU+IG5vdy4KKworCXNyYy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9EYmcuc3RnCSMgZWRpdAorCSAgQ2hhbmdlcyBtaXJyb3JpbmcgdGhlIGNvbnN0cnVjdG9yIGFuZCBmaWVsZCBzdHVmZiBmcm9tCisJICBKYXZhLnN0Zy4gUGFydCBvZiB0aGlzIGlzIGEgY3V0IGFuZCBwYXN0ZSBiZWNhdXNlIG9mIGEgYnVnCisJICBpbiBTVC4KKworCXNyYy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9BU1Quc3RnCSMgZWRpdAorCXNyYy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9BU1RQYXJzZXIuc3RnCSMgZWRpdAorCXNyYy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9BU1RUcmVlUGFyc2VyLnN0ZwkjIGVkaXQKKwkgIEp1c3QgYWRkZWQgdGhlIHNjb3BlIGF0dHJpYnV0ZS4KKworCXNyYy9vcmcvYW50bHIvdGVzdC9CYXNlVGVzdC5qYXZhCSMgZWRpdAorCSAgQWRkZWQgZnVuY3Rpb25hbGl0eSB0byBzdXBwb3J0IHRlc3RpbmcgY29tcG9zaXRlIGdyYW1tYXJzLgorCSAgICBleGVjTGV4ZXIoKQorCisJc3JjL29yZy9hbnRsci90ZXN0L1Rlc3RBdHRyaWJ1dGVzLmphdmEJIyBlZGl0CisJICBUd2VhayB0byBkZWFsIHdpdGggc2hhcmVkIHJlY29nbml6ZXIgc3RhdGUuCisKKwlzcmMvb3JnL2FudGxyL3Rlc3QvVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmEJIyBhZGQKKwkgIFN0YXJ0IG9mIG15IHVuaXQgdGVzdHMuCisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvQ29tcG9zaXRlR3JhbW1hci5qYXZhCSMgYWRkCisJc3JjL29yZy9hbnRsci90b29sL0NvbXBvc2l0ZUdyYW1tYXJUcmVlLmphdmEJIyBhZGQKKwkgIFRyYWNrcyBtYWluIGdyYW1tYXIgYW5kIGFsbCBkZWxlZ2F0ZSBncmFtbWFycy4gVHJhY2tzIHVuaXF1ZQorCSAgTkZBIHN0YXRlIG51bWJlcnMgYW5kIHVuaXF1ZSB0b2tlbiB0eXBlcy4gVGhpcyBrZWVwcyBhIHRyZWUKKwkgIG9mIGdyYW1tYXJzIGNvbXB1dGVkIGZyb20gdGhlIGltcG9ydC9kZWxlZ2F0aW9uIGNoYWluLiBXaGVuCisJICB5b3Ugd2FudCB0byBsb29rIHVwIGEgcnVsZSwgaXQgc3RhcnRzIGF0IHRoZSByb290IG9mIHRoZQorCSAgdHJlZSBhbmQgZG9lcyBhIHByZS1vcmRlciBzZWFyY2ggdG8gZmluZCB0aGUgcnVsZS4KKworCXNyYy9vcmcvYW50bHIvdG9vbC9BY3Rpb25BbmFseXNpcy5nCSMgZWRpdAorCXNyYy9vcmcvYW50bHIvdG9vbC9BY3Rpb25BbmFseXNpc0xleGVyLmphdmEJIyBlZGl0CisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvQXR0cmlidXRlU2NvcGUuamF2YQkjIGVkaXQKKwkgIFVwZGF0ZWQgdG8gdXNlIGdlbmVyaWNzIGluIG9uZSBwbGFjZS4KKworCXNyYy9vcmcvYW50bHIvdG9vbC9ET1RHZW5lcmF0b3IuamF2YQkjIGVkaXQKKwkgIFVwZGF0ZWQgdG8gaW5kaWNhdGUgd2hlbiBub25sb2NhbCBydWxlcyBhcmUgcmVmZXJlbmNlZC4KKworCXNyYy9vcmcvYW50bHIvdG9vbC9FcnJvck1hbmFnZXIuamF2YQkjIGVkaXQKKwkgIEFkZGVkIHNvbWUgZXJyb3IgbWVzc2FnZXMgZm9yIGltcG9ydCBncmFtbWFyczsgSSBuZWVkIG1vcmUuCisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvRkFTZXJpYWxpemVyLmphdmEJIyBlZGl0CisJICBUd2Vha2VkIHRvIHVzZSBhIGZpZWxkIG5vdCBtZXRob2QuCisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvR3JhbW1hci5qYXZhCSMgZWRpdAorCSAgVGhpcyBpcyB3aGVyZSBtb3N0IG9mIHRoZSBtZWF0IGlzIGZvciB0aGUgZ3JhbW1hciBpbXBvcnQKKwkgIHN0dWZmIGFzIHlvdSBjYW4gaW1hZ2luZS4gIEkgZmFjdG9yZWQgb3V0IHRoZSB0b2tlbiB0eXBlCisJICB0cmFja2luZyBpbnRvIHRoZSBDb21wb3NpdGVHcmFtbWFyIG9iamVjdC4gSSBhZGRlZCBjb2RlIHRvCisJICB0aGUgYWRkQXJ0aWZpY2lhbE1hdGNoVG9rZW5zUnVsZSBtZXRob2Qgc28gdGhhdCBpdCBpbmNsdWRlcworCSAgcmVmZXJlbmNlcyB0byBhbGwgZGVsZWdhdGUgbGV4ZXIgVG9rZW5zIHJ1bGVzLiBBbHRlcmVkIHRoZQorCSAgcnVsZSBsb29rdXAgc3R1ZmYgc28gdGhhdCBpdCBrbm93cyBhYm91dCBkZWxlZ2F0ZSBncmFtbWFycy4KKworCXNyYy9vcmcvYW50bHIvdG9vbC9HcmFtbWFyQVNULmphdmEJIyBlZGl0CisJc3JjL29yZy9hbnRsci90b29sL0dyYW1tYXJBbmFseXNpc0Fib3J0ZWRNZXNzYWdlLmphdmEJIyBlZGl0CisJc3JjL29yZy9hbnRsci90b29sL0dyYW1tYXJSZXBvcnQuamF2YQkjIGVkaXQKKwlzcmMvb3JnL2FudGxyL3Rvb2wvTm9uUmVndWxhckRlY2lzaW9uTWVzc2FnZS5qYXZhCSMgZWRpdAorCSAgTWFkZSBlbmNsb3NpbmcgcnVsZSB2aXNpYmxlIGFzIGZpZWxkLgorCisJc3JjL29yZy9hbnRsci90b29sL0dyYW1tYXJTYW5pdHkuamF2YQkjIGVkaXQKKwkgIEdlbmVyYWwgY2xlYW51cCBhbmQgYWRkaXRpb24gb2YgZ2VuZXJpY3MuCisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvSW50ZXJwcmV0ZXIuamF2YQkjIGVkaXQKKwkgIFJlZmVyZW5jZSBmaWVsZHMgaW5zdGVhZCBvZiBtZXRob2RzLgorCisJc3JjL29yZy9hbnRsci90b29sL05GQUZhY3RvcnkuamF2YQkjIGVkaXQKKwkgIEdlbmVyYWwgY2xlYW51cCBhbmQgdXNlIG9mIFJ1bGUgb2JqZWN0IGluc3RlYWQgb2YgcnVsZQorCSAgaW5kZXguCisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvTmFtZVNwYWNlQ2hlY2tlci5qYXZhCSMgZWRpdAorCSAgQSBsaXR0bGUgYml0IG9mIGNsZWFudXAgYW5kIGNoYW5nZXMgdG8gdXNlIGVpdGhlciB0aGUgbG9jYWwKKwkgIG9yIGdsb2JhbGx5IHZpc2libGUgcnVsZS4gQWRkZWQgY29kZSB0byBjaGVjayB0aGF0IHNjb3BlcworCSAgYXJlIHZhbGlkIG9uIHNjb3BlZCBydWxlIHJlZmVyZW5jZXMuIGFnYWluIHRoaXMgaXMgYW4KKwkgIGludGVybmFsIGZlYXR1cmUsIG5vdCB0byBiZSB1c2VkIGJ5IHVzZXJzLgorCisJc3JjL29yZy9hbnRsci90b29sL1JhbmRvbVBocmFzZS5qYXZhCSMgZWRpdAorCSAgVHdlYWtlZC4KKworCXNyYy9vcmcvYW50bHIvdG9vbC9SdWxlLmphdmEJIyBlZGl0CisJICBBZGRlZCBmaWVsZCBpbXBvcnRlZC4gUmVtb3ZlZCBzb21lIHVudXNlZCBtZXRob2RzIGJ5CisJICBjb21tZW50aW5nIHRoZW0gb3V0LiBNYWRlIHRvU3RyaW5nKCkgbW9yZSBleHByZXNzaXZlLgorCisJc3JjL29yZy9hbnRsci90b29sL2FudGxyLmcJIyBlZGl0CisJc3JjL29yZy9hbnRsci90b29sL2FudGxyLnByaW50LmcJIyBlZGl0CisJc3JjL29yZy9hbnRsci90b29sL2Fzc2lnbi50eXBlcy5nCSMgZWRpdAorCXNyYy9vcmcvYW50bHIvdG9vbC9idWlsZG5mYS5nCSMgZWRpdAorCXNyYy9vcmcvYW50bHIvdG9vbC9kZWZpbmUuZwkjIGVkaXQKKwkgIEFkZGVkIHN5bnRheCBmb3IgaW1wb3J0IHN0YXRlbWVudC4gIGFzc2lnbi50eXBlcy5nIGlzIHRoZQorCSAgZ3JhbW1hciB0aGF0IGludm9rZXMgR3JhbW1hci5pbXBvcnRHcmFtbWFyKCkuCisKKwlzcmMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL21lc3NhZ2VzL2xhbmd1YWdlcy9lbi5zdGcJIyBlZGl0CisJICBBZGRlZCBlcnJvciBtZXNzYWdlcy4KKworCUFkZGVkCisKKwlDSEFOR0VTLnR4dAorCXJ1bnRpbWUvSmF2YS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUmVjb2duaXplclNoYXJlZFN0YXRlLmphdmEKKwlzcmMvb3JnL2FudGxyL3Rlc3QvVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmEKKwlzcmMvb3JnL2FudGxyL3Rvb2wvQ29tcG9zaXRlR3JhbW1hci5qYXZhCisJc3JjL29yZy9hbnRsci90b29sL0NvbXBvc2l0ZUdyYW1tYXJUcmVlLmphdmEKKworMy4wLjEgLSBBdWd1c3QgMTMsIDIwMDcKKworW1NlZSB0YXJnZXQgcGFnZXMgb24gdGhlIHdpa2kgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIG5vbi1KYXZhIHRhcmdldHNdCisKK0F1Z3VzdCA3LCAyMDA3CisKKyogYWRkZWQgZXNjYXBpbmcgb2YgZG91YmxlIHF1b3RlcyBpbiBET1RUcmVlR2VuZXJhdG9yCisKK0p1bHkgMjIsIDIwMDcKKworKiBmaXhlZCBkeW5hbWljIHNjb3BlIGltcGxlbWVudGF0aW9uIGluIGxleGVycy4gVGhleSB3ZXJlIG5vdCBjcmVhdGluZyBuZXcgc2NvcGUKKyAgZW50cmllcyBvbiB0aGUgc3RhY2suICBVbnN1cHBvcnRlZCBmZWF0dXJlIQorCitKdWx5IDMwLCAyMDA3CisKKyogZmxvYXQgcmV0dXJuIHZhbHVlcyB3ZXJlIGluaXRhbGl6ZWQgdG8gMC4wIG5vdCAwLjBmIGluIGphdmEuCisKK0p1bHkgMjgsIDIwMDcKKworKiBTYW0gRWxsaXMgcG9pbnRzIG91dCBhbiBpbml0IHZhciBidWcgaW4gQU5UTFJSZWFkZXJTdHJlYW0uCisKK0p1bHkgMjcsIDIwMDcgKGRvbmUgaW4gZGV2IGJyYW5jaCkKKworKiBNb3ZlZCB0b2tlbiB0eXBlIGluZGV4IHN0dWZmIGZyb20gQ29tbW9uVHJlZU5vZGVTdHJlYW0gdG8gVHJlZVdpemFyZAorCisqIEFkZGVkIGdldENoaWxkcmVuIHRvIEJhc2VUcmVlLgorCisqIEFkZGVkIGhldGVyb2dlbmVvdXMgdHJlZSBmdW5jdGlvbmFsaXR5OyByZXdyaXRlIGZvciBwYXJzZXIvdHJlZSBwYXJzZXIKKyAgYW5kIGF1dG8gQVNUIGNvbnN0ci4gZm9yIHBhcnNlci4KKworCW9yZy9hbnRsci9ydW50aW1lL3RyZWUvUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtLmphdmEKKwlvcmcvYW50bHIvcnVudGltZS90cmVlL1Jld3JpdGVSdWxlTm9kZVN0cmVhbS5qYXZhCisJb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9SZXdyaXRlUnVsZVRva2VuU3RyZWFtLmphdmEKKwkJUmVuYW1lZCBtZXRob2QgbmV4dCgpIGFuZCByZS1mYWN0b3IgdGhpbmdzIHRvIGhhdmUgbW9yZQorCQlzcGVjaWZpYyBtZXRob2RzOiBuZXh0VG9rZW4sIG5leHROb2RlLCBuZXh0VHJlZS4KKworCWNvZGVnZW4vY29kZWdlbi5nCisJCVVwZGF0ZWQgdG8gaW5jbHVkZSBuZXcgPE5vZGVUeXBlPiBBU1Qgc3RydWN0dXJlIGZvcgorCQl0b2tlbiByZWZlcmVuY2VzLiAgUHVzaGVkIGhlcmV0byBhdHRyaWJ1dGUgaW50bworCQlhbGwgdG9rZW5SZWYqIHRlbXBsYXRlcy4KKwljb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0FTVC5zdGcKKwkJRmFjdG9yZWQgb3V0IGEgZmV3IHRlbXBsYXRlczoKKwkJCWNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLGhldGVybyxhcmdzKQorCQkJY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbixoZXRlcm8sYXJncykKKwkJQ29udmVydGVkIGEgbG90IG9mIHN0cmVhbSBuZXh0KCkgY2FsbHMgdG8gbW9yZSBzcGVjaWZpYworCQkJbmV4dFRva2VuLCBuZXh0Tm9kZSwgbmV4dFRyZWUgcGVyIGFib3ZlLgorCWNvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNUUGFyc2VyLnN0ZworCQlBZGRlZCBjcmVhdGVOb2RlRnJvbVRva2VuIHRlbXBsYXRlIGFuZCByZS1mYWN0b3JlZCBjcmVhdGlvbgorCQlzaXRlcyB0byB1c2UgdGhhdCB0ZW1wbGF0ZS4gIEFkZGVkIGhldGVybyBhdHRyaWJ1dGUuCisJY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9BU1RUcmVlUGFyc2VyLnN0ZworCQlBZGRlZCBjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50IHRlbXBsYXRlIGFuZCByZS1mYWN0b3JlZC4KKworCXRlc3QvVGVzdEhldGVyb0FTVC5qYXZhCisJCU5ldyBmaWxlLiBVbml0IHRlc3RzIHRvIHRlc3QgbmV3IGhldGVybyB0cmVlIGNvbnN0cnVjdGlvbi4KKwl0ZXN0L1Rlc3RSZXdyaXRlQVNULmphdmEKKwkJRml4ZWQgdGVzdC4gIE5pbCBzaW5nbGUtbm9kZSB0cmVlcyBubyBsb25nZXIgcmV0dXJuIG5pbDsKKwkJVGhleSByZXR1cm4gbnVsbC4KKworCXRvb2wvRXJyb3JNYW5hZ2VyLmphdmEKKwl0b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9sYW5ndWFnZXMvZW4uc3RnCisJCUFkZGVkIGVycm9yIG1lc3NhZ2U6CisJCUhFVEVST19JTExFR0FMX0lOX1JFV1JJVEVfQUxUKGFyZykgOjo9CisJCSAgImFsdHMgd2l0aCByZXdyaXRlcyBjYW4ndCB1c2UgaGV0ZXJvZ2VuZW91cyB0eXBlcyBsZWZ0IG9mIC0+IgorCisJdG9vbC9hbnRsci5nCisJdG9vbC9hbnRsci5wcmludC5nCisJdG9vbC9hc3NpZ24udHlwZXMuZworCXRvb2wvYnVpbGRuZmEuZworCXRvb2wvZGVmaW5lLmcKKwkJQWRkZWQgc3ludGF4IGZvciA8Tm9kZVR5cGU+IHRvIHRva2VuIHJlZmVyZW5jZXMuCisJCUFsdGVyZWQgQVNUIHN0cnVjdHVyZSByaXBwbGVkIHRocm91Z2ggZGlmZmVyZW50IHBoYXNlcy4KKworSnVseSAyNCwgMjAwNworCisqIERlbGV0ZWQgRG91YmxlTGlua1RyZWUuamF2YTsgQ29tbW9uVHJlZSBkb2VzIHRoYXQgbm93LgorCitKdWx5IDIzLCAyMDA3CisKKyogdGVtcGxhdGUgZ3JvdXAgb3V0cHV0RmlsZTsgY2hhbmdlZCByZXdyaXRlIGFyZyB0byByZXdyaXRlTW9kZS4KKworKiBhZGRlZCByZXdyaXRlIG1vZGUgZm9yIHRyZWUgcGFyc2VyIGJ1aWxkIEFTVC4KKworSnVseSAyMiwgMjAwNworCisqIEtheSBmaXhlZCBkeW5hbWljIHNjb3BlIGltcGxlbWVudGF0aW9uIGluIGxleGVycy4gVGhleSB3ZXJlIG5vdAorICBjcmVhdGluZyBuZXcgc2NvcGUgZW50cmllcyBvbiB0aGUgc3RhY2suICBUaGlzIGlzIGFuIFVOU1VQUE9SVEVEIGZlYXR1cmUuCisKKyogYWRkZWQgZ2V0UGFyZW50IGFuZCBnZXRDaGlsZEluZGV4IHRvIFRyZWVBZGFwdG9yLiAgQWRkZWQKKyAgaW1wbGVtZW50YXRpb24gdG8gQ29tbW9uVHJlZS4gIEl0J3MganVzdCB0b28gdXNlZnVsIGhhdmluZyB0aG9zZQorICBwYXJlbnQgYW5kIGNoaWxkIGluZGV4ZXMgYXZhaWxhYmxlIGZvciByZXdyaXRpbmcgZXRjLi4uICBJIHRyaWVkIDJ4CisgIHRvIG1ha2UgYW4gaW1wbGVtZW50YXRpb24gb2YgdHJlZSByZXdyaXRpbmcgdy9vIHRoaXMgYW5kIHRoZQorICBjb25zdHJhaW50cyBqdXN0IG1hZGUgaXQgdG9vIGV4cGVuc2l2ZSBhbmQgY29tcGxpY2F0ZWQuICBIYXZlIHRvCisgIHVwZGF0ZSBhZGFwdG9ycyB0byBzZXQgcGFyZW50LCBjaGlsZCBpbmRleCB2YWx1ZXMuICBVcGRhdGVkIFRyZWUKKyAgaW50ZXJmYWNlIGFuZCBCYXNlVHJlZSBhbHNvLiAgU2hvdWxkIG9ubHkgYWZmZWN0IHRhcmdldCBkZXZlbG9wZXJzCisgIG5vdCB1c2Vycy4gIFdlbGwsIHVubGVzcyB0aGV5IGltcGwgVHJlZS4KKworKiBkdXBOb2RlICh2aWEgY3Rvcikgb2YgQ29tbW9uVHJlZSBkaWRuJ3QgY29weSBzdGFydC9zdG9wIHRva2VuIGluZGV4ZXMuCisKK1RBUkdFVCBERVZFTE9QRVJTIFdBUk5JTkcgLS0gQVNULnN0ZyBzcGxpdCB3aXRoIHNvbWUgZnVuY3Rpb25hbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2luZyBpbnRvIEFTVFBhcnNlci5zdGcgdGhlbiBJIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFRyZWVQYXJzZXIuc3RnLiAgQ29kZUdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWVzIG5ldyBzdWJncm91cHMgZXhpc3QuCisKK0p1bHkgMjAsIDIwMDcKKworKiBBZGRlZCBBU1QgY29uc3RydWN0aW9uIGZvciB0cmVlIHBhcnNlcnMgaW5jbHVkaW5nIC0+IHJld3JpdGUgcnVsZXMuCisgIFJld3JpdGUgbW9kZSAocmV3cml0ZT10cnVlKSBhbHRlcnMgdGhlIHRyZWUgaW4gcGxhY2UgcmF0aGVyIHRoYW4KKyAgY29uc3RydWN0aW5nIGEgd2hvbGUgbmV3IHRyZWUuICBJbXBsZW1lbnRhdGlvbiBub3RlczoKKworICBvcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWUuamF2YQorCUFkZCBtZXRob2RzIGZvciBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IGZ1bmN0aW9uYWxpdHkuCisJQWxzbyBhZGRlZCBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkgd2hpY2ggeW91IGNhbiB1c2UKKwl0byBlbnN1cmUgdGhhdCBhbGwgZG91YmxlIGxpbmtpbmcgaXMgc2V0IHVwIHJpZ2h0IGFmdGVyIHlvdQorCW1hbmlwdWxhdGUgdGhlIHRyZWUgbWFudWFsbHkuICBUaGUgc2V0Q2hpbGQgcHJldGVlbnMgZXRjLiBkbworCXRoZSBwcm9wZXIgdGhpbmcgc28geW91IHNob3VsZG4ndCBuZWVkIHRoaXMuCisJQWRkZWQgcmVwbGFjZUNoaWxkcmVuKCkgdG8gc3VwcG9ydCB0cmVlIHJld3JpdGUgbW9kZSBpbiB0cmVlIHBhcnNlcnMKKyAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZS5qYXZhCisJVXBkYXRlZCB0byBzZXQgcGFyZW50IGFuZCBjaGlsZCBpbmRleCBzdHVmZi4gIEFkZGVkIHJlcGxhY2VDaGlsZHJlbgorCW1ldGhvZCBldGMuLi4gIEl0IHN0aWxsIG9ubHkgaGFzIGEgbGlzdCBvZiBjaGlsZHJlbiBhcyBzb2xlIGZpZWxkCisgICAgIAlidXQgY2FsbHMgbWV0aG9kcyB0aGF0IHN1YmNsYXNzZXMgY2FuIGNob29zZSB0byBpbXBsZW1lbnQgc3VjaCBhcworCUNvbW1vblRyZWUuCisgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZS5qYXZhCisJQWRkZWQgcGFyZW50IGFuZCBjaGlsZEluZGV4IGZpZWxkcyB0byBkb3VibHkgbGluay4KKyAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9UcmVlQWRhcHRvci5qYXZhCisJQWRkZWQgbWV0aG9kcyBmb3IgbmV3IHBhcmVudCBhbmQgY2hpbGQgaW5kZXggZnVuY3Rpb25hbGl0eS4KKwlBbHNvIGFkZGVkIG1ldGhvZCBmb3IgcmV3cml0ZSBtb2RlIGluIHRyZWUgcGFyc2VyczoKKwlyZXBsYWNlQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9wQ2hpbGRJbmRleCwgT2JqZWN0IHQpOworCUFkZGVkIHNldENoaWxkIGFuZCBkZWxldGVDaGlsZCBtZXRob2RzCisgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvQmFzZVRyZWVBZGFwdG9yLmphdmEKKwlNb3ZlZCBkdXBUcmVlIGhlcmUgZnJvbSBCYXNlVHJlZS4KKwlVcGRhdGVkIHJ1bGVQb3N0UHJvY2Vzc2luZyB0byBkZWFsIHdpdGggcGFyZW50IGFuZCBjaGlsZCBpbmRleC4KKwlBZGRlZCBzZXRDaGlsZCBhbmQgZGVsZXRlQ2hpbGQgaW1wbGVtZW50YXRpb25zCisgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvQ29tbW9uVHJlZUFkYXB0b3IuamF2YQorCUFkZGVkIG1ldGhvZHMgdG8gZGVhbCB3aXRoIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IGZvciBhIG5vZGUuCisKKyAgb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlTm9kZVN0cmVhbS5qYXZhCisJUmVtb3ZlZCB0b2tlbiB0eXBlIGluZGV4IGFuZCBtZXRob2QgZmlsbFJldmVyc2VJbmRleCBldGMuLi4KKwlQcm9iYWJseSB3aWxsIG1vdmUgaW50byB0aGUgdHJlZSB3aXphcmQgaW4gdGhlIGZ1dHVyZS4KKwlDaGFuZ2VkIGNhbGwvc2VlayBzdGFjayBpbXBsZW1lbnRhdGlvbiB0byB1c2UgSW50QXJyYXkKKwlBZGRlZCByZXBsYWNlQ2hpbGRyZW4gaW50ZXJmYWNlLgorICBvcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVOb2RlU3RyZWFtLmphdmEKKwlBZGRlZCByZXBsYWNlQ2hpbGRyZW4uCisgIG9yZy9hbnRsci9ydW50aW1lL3RyZWUvVW5CdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmEKKwlBZGRlZCByZXBsYWNlQ2hpbGRyZW4gbWV0aG9kIGJ1dCBubyBpbXBsZW1lbnRhdGlvbgorCisgIGNvZGVnZW4vdGVtcGxhdGVzL0FOVExSQ29yZS5zdGkKKwlDaGFuZ2VkIHJld3JpdGUgdG8gYSBiZXR0ZXIgbmFtZTogcmV3cml0ZU1vZGUKKwlBZGRlZCB0cmVlIGxldmVsIGFyZ3VtZW50IHRvIGFsdCwgdHJlZSBzbyB0aGF0IGF1dG8gQVNUCisgICAgICAgIGNvbnN0cnVjdGlvbiBjYW4gb2NjdXIgd2hpbGUgcmVjb2duaXppbmcgaW4gdHJlZSBwYXJzZXJzLgorCisgIGNvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNULnN0ZworCVNwbGl0IHRlbXBsYXRlIGdyb3VwOiBhZGRlZCB0d28gc3ViY2xhc3NlcyB0byBoYW5kbGUgZGlmZmVyZW50CisJZnVuY3Rpb25hbGl0eSBmb3Igbm9ybWFsIHBhcnNpbmcgYW5kIHRyZWUgcGFyc2luZyArIEFTVAorCWNvbnN0cnVjdGlvbi4gIFRyZWUgcGFyc2VycyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGR1cCB0cmVlCisJbm90IGNvbnN0cnVjdCBhbm90aGVyLiAgQWRkZWQgQVNUUGFyc2VyLnN0ZyBhbmQKKwlBU1RUcmVlUGFyc2VyLnN0ZyB0byBoYW5kbGUgYXV0byBBU1QgY29uc3RydWN0aW9uIGR1cmluZworCXJlY29nbml0aW9uIGZvciB0aGUgdHdvIGRpZmZlcmVudCBwYXJzZXIgdHlwZXMuICBJIGp1c3QgY29waWVkCisJdGhlIHRva2VuLCBydWxlLCBzZXQsIHdpbGRjYXJkIHRlbXBsYXRlcyB0byB0aGUgc3ViY2xhc3Nlcy4KKwlUaGUgcmV3cml0ZSB0ZW1wbGF0ZXMgYXJlIHN0aWxsIGluIEFTVC5zdGcuIEkgZmFjdG9yZWQgb3V0IHRoZQorCW5vZGUgY3JlYXRpb24gc28gdGhhdCB0aGUgc2FtZSByZXdyaXRlIHRlbXBsYXRlcyBjYW4gYmUgdXNlZAorCWZvciBib3RoIHBhcnNpbmcgYW5kIHRyZWUgcGFyc2luZy4KKworICBjb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0FTVFBhcnNlci5zdGcKKwlUaGUgdGVtcGxhdGVzIG5lZWRlZCB0byBidWlsZCB0cmVlcyB3aXRoIGF1dG8gY29uc3RydWN0aW9uCisJZHVyaW5nIHBhcnNpbmcuCisgIGNvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNUVHJlZVBhcnNlci5zdGcKKwlUaGUgdGVtcGxhdGVzIG5lZWRlZCB0byBidWlsZCB0cmVlcyB3aXRoIGF1dG8gY29uc3RydWN0aW9uCisJZHVyaW5nIHRyZWUgcGFyc2luZy4KKyAgY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9KYXZhLnN0ZworCWdlbmVyaWNQYXJzZXIgbm93IGhhcyByZXdyaXRlRWxlbWVudFR5cGUgKE5vdGUgb3IgVG9rZW4pIHNvCisJdGhhdCB0aGUgcmV3cml0ZSBzdHJlYW1zIGtub3cgd2hhdCBraW5kIG9mIGVsZW1lbnRzIGFyZSBpbnNpZGUKKwlkdXJpbmcgcmV3cml0ZSBydWxlIHRyZWUgY29uc3RydWN0aW9uLgorICBjb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL1NULnN0ZworCXJld3JpdGUgYXR0cmlidXRlIG5hbWUgY2hhbmdlIHRvIHJld3JpdGVNb2RlCisKKyAgb3JnL2FudGxyL3J1bnRpbWUvZGVidWcvRGVidWdUcmVlQWRhcHRvci5qYXZhCisgIG9yZy9hbnRsci9ydW50aW1lL2RlYnVnL0RlYnVnVHJlZU5vZGVTdHJlYW0uamF2YQorCVVwZGF0ZWQgdG8gaGFuZGxlIG5ldyBpbnRlcmZhY2VzCisKKyAgdGVzdC9CYXNlVGVzdC5qYXZhCisJQWRkZWQgdGVzdCByaWcgdXBkYXRlIHRvIGhhbmRsZSBBU1QgY29uc3RydWN0aW9uIGJ5IHRyZWUgcGFyc2Vycy4KKwlBbGwgdHJlZSBjb25zdHJ1Y3Rpb24gcnVucyBhdXRvbWF0aWNhbGx5IHRlc3Qgc2FuaXR5IG9mIHBhcmVudAorCWFuZCBjaGlsZCBpbmRleGVzLgorICB0ZXN0L1Rlc3RUcmVlR3JhbW1hclJld3JpdGVBU1QuamF2YQorICB0ZXN0L1Rlc3RUcmVlTm9kZVN0cmVhbS5qYXZhCisgIHRlc3QvVGVzdFRyZWVzLmphdmEKKwluZXcgZmlsZTsgdGVzdHMgdGhlIG5ldyBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IHN0dWZmIGluIHRyZWVzLgorCitKdWx5IDE5LCAyMDA3CisKKyogaW1wbGVtZW50ZWQgbmV3IHVuaXF1ZSBJRDsgR0Mgd2FzIGNhdXNpbmcgbm9uIHVuaXF1ZSBoYXNoIGNvZGVzLiAgRGVidWdnaW5nCisgIHRyZWUgZ3JhbW1hcnMgd2FzIG1lc3NpbmcgdXAuCisKKyogZ290IHRyZWUgcmV3cml0ZXMgd29ya2luZyBpbiB0cmVlIGdyYW1tYXJzLiAgSXQgYnVpbGRzIGEgY29tcGxldGVseSBuZXcKKyAgdHJlZSBmcm9tIG9sZCB0cmVlOyBpLmUuLCB5b3UgZ2V0IHR3byB0cmVlcyBpbiBtZW1vcnkuICBXL28gYSByZXdyaXRlCisgIHJ1bGUsIHRoZSBpbnB1dCBmb3IgdGhhdCBydWxlIGlzIGR1cGxpY2F0ZWQgYW5kIHJldHVybmVkLiAtPiB3L28gZWxlbWVudHMKKyAgdG8gdGhlIHJpZ2h0IG1lYW5zIGRvbid0IHJldHVybiBhbnl0aGluZzsgaS5lLiwgZGVsZXRlLiAgT29vcHMuLi53YXkKKyAgaGFyZGVyIHRoYW4gSSB0aG91Z2h0LiAgUmVhbCBpbXBsZW1lbnRhdGlvbiBub3RlcyBhYm92ZS4KKworSU5DT01QQVRJQklMSVRZIFdBUk5JTkcgLS0gdGVtcGxhdGVzIGhhdmUgY2hhbmdlZDsgbXVzdCByZWdlbiBvdXRwdXQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hcnMuICBSdW50aW1lIGxpYnJhcmllcyBoYXZlIGFsc28gY2hhbmdlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZSBoYXMgY2hhbmdlZCBhbHNvLgorCitKdWx5IDE3LCAyMDA3CisKKyogQWRkZWQgbGluZS9jaGFycG9zaXRpb24gdG8gbm9kZSBzb2NrZXQgZXZlbnRzIGFuZCBldmVudCBkdW1wIHNvCisgIHdlIGhhdmUgbW9yZSBpbmZvIGR1cmluZyB0cmVlIHBhcnNpbmcuICBPbmx5IHdvcmtzIGlmIHlvdXIKKyAgdHJlZSBhZGFwdG9yIHJldHVybnMgYSB2YWx1ZSBUb2tlbiBvYmplY3QgZnJvbSBnZXRUb2tlbih0cmVlbm9kZSkKKyAgd2l0aCBsaW5lL2NvbCBzZXQuICBSZWZhY3RvcmVkIGNvbnN1bWVOb2RlL0xOIHRvIHVzZSBkZXNlcmlhbGl6ZU5vZGUoKS4KKworKiBGaXhlZCBtaXNtYXRjaGVkIHRyZWUgbm9kZSBleGNlcHRpb25zOyBmb3IgaW1hZ2luYXJ5IG5vZGVzLCBpdCBzYWlkCisgICJtaXNzaW5nIG51bGwiLiAgTm93IHByaW50cyB0aGUgdG9rZW4gdHlwZSB3ZSBmb3VuZC4KKworKiBDbGVhbmVkIHVwIGV4Y2VwdGlvbiBzdHVmZi4gTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uIHdhcyBzZXR0aW5nCisgIGxpbmUvY29sLCBidXQgb25seSBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBzaG91bGQgZG8gdGhhdC4KKworKiBJZiBpbWFnaW5hcnkgdG9rZW4gZ2V0cyBhIG1pc21hdGNoLCB0aGVyZSBpcyBubyBsaW5lIGluZm8uICBTZWFyY2gKKyAgYmFja3dhcmRzIGluIHN0cmVhbSBpZiBpbnB1dCBub2RlIHN0cmVhbSBzdXBwb3J0cyB0byBmaW5kIGxhc3QKKyAgbm9kZSB3aXRoIGdvb2QgbGluZS9jb2wgaW5mby4gRS5nLiwKKworQU5UTFJ2M1RyZWUuZzogbm9kZSBmcm9tIGFmdGVyIGxpbmUgMTU2OjcyIG1pc21hdGNoZWQgdHJlZSBub2RlOiBFT0EgZXhwZWN0aW5nIDxVUD4KKworICB3aGljaCB1c2VkIHRvIGJlOgorCitBTlRMUnYzVHJlZS5nOiBub2RlIGZyb20gbGluZSAwOjAgbWlzbWF0Y2hlZCB0cmVlIG5vZGU6IG51bGwgZXhwZWN0aW5nIDxVUD4KKworKiBtaXNtYXRjaGVkIHRyZWUgbm9kZSBleGNlcHRpb25zIHdlcmUgbm90IHNlbnQgdG8gdGhlIGRlYnVnIGV2ZW50IHN0cmVhbS4KKyAgRHVlIHRvIGEgdHlwZSBiZWluZyBzbGlnaHRseSBkaWZmZXJlbnQgb24gcmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oKQorICBpbiBEZWJ1Z1RyZWVQYXJzZXIuICBXYXMgY2FsbGluZyBCYXNlUmVjb2duaXplciB2ZXJzaW9uIG5vdCBzdWJjbGFzcy4KKyAgTm93IHdlIGdldDoKKworICA5NDU5OiAgIFJlY29nbml0aW9uIGV4Y2VwdGlvbiBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24oMCE9MCkKKworKiBMaXN0IGxhYmVscyB3ZXJlIG5vdCBhbGxvd2VkIGFzIHJvb3Qgbm9kZXMgaW4gdHJlZSByZXdyaXRlcyBsaWtlCisgIF4oJGxpc3RsYWJlbCAuLi4pLiAgSGFkIHRvIGFkZCBhIHRlbXBsYXRlIHRvIEFTVC5zdGc6CisKKyAgLyoqIEdlbiBeKCRsYWJlbCAuLi4pIHdoZXJlIGxhYmVsKz0uLi4gKi8KKyAgcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmUm9vdCA6Oj0gcmV3cml0ZVRva2VuTGFiZWxSZWZSb290CisKKworSnVseSAxNiwgMjAwNworCisqIGZpeGVkIG5leHROb2RlIGluIFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSB3YXMgZHVwJ2luZyB0b28gbXVjaCwKKyAgc2NyZXdpbmcgdXAgZGVidWcgZXZlbnQgc3RyZWFtLiAgQWxzbyB0aGVyZSB3YXMgYSBidWcgaW4gaG93CisgIHRoZSByZXdyaXRlIHRyZWUgc3RyZWFtIHN0dWZmIGRlY2lkZWQgdG8gZHVwIG5vZGVzLgorCisqIGZpeGVkIGJ1ZyBpbiBMVCBmb3IgdHJlZSBwYXJzaW5nOyB0ZXh0IHdhcyBub3QgdHJhbnNtaXR0ZWQgcHJvcGVybHk7CisgIG9ubHkgc2luZ2xlIHdvcmRzIHdvcmtlZC4KKworKiBtYWRlIGRlY2lzaW9uIGZvciBydWxlIHB1dCBsaW5lL2NvbCBvbiBjb2xvbiBub3QgZmlyc3QgdG9rZW4gb2YgZmlyc3QgYWx0LgorCisqIHJlbW90ZSBQcm94eVRva2VuIG5vdyBlbWl0cyB0b2tlbiBpbmRleCBmb3IgZWFzaWVyIGRlYnVnZ2luZyB3aGVuIGxvb2tpbmcKKyAgYXQgQVcncyBldmVudCBzdHJlYW0uICBGb3IgZXhhbXBsZSwgdGhlIEA1IGhlcmUgaXMgdGhlIHRva2VuIGluZGV4OgorCisgIDMxCUNvbnN1bWUgaGlkZGVuIFsgLzw2ND4sY2hhbm5lbD05OSwzMDo3LCBANV0KKworKiBzYW1lIGlzIHRydWUgZm9yIGNvbnN1bWUgbm9kZXMgbm93OgorCisgIDI1NTg2CUNvbnN1bWUgbm9kZSBbJyknLywgPDQ0PiwgNDcxMjA0MCxAMTc0OV0JMjUKKworICBXaGVuIGRlYnVnZ2luZyB0cmVlIHBhcnNlcnMsIGl0IGhlbHBzIHRvIHRyYWNrIGVycm9ycyB3aGVuIHlvdSBrbm93CisgIHdoYXQgY29ycmVzcG9uZGluZyBpbnB1dCBzeW1ib2wgY3JlYXRlZCB0aGlzIHRyZWUgbm9kZS4KKworKiBDaGFuZ2VkIGRlYnVnIGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdHJlZXMgcXVpdGUgYSBiaXQuICBQYXNzZXMgbm9kZXMgYXJvdW5kCisgIG5vdyByYXRoZXIgdGhhbiB0ZXh0LCB0eXBlLCB1bmlxdWUgSURzIGV0Yy4uLiAgTW9zdGx5IGFmZmVjdHMgaW50ZXJuYWwgc3R1ZmYuCisgIFRhcmdldCBkZXZlbG9wZXJzIHdpbGwgaGF2ZSBzb21lIHdvcmsgaW4gdGhlaXIgcnVudGltZSB0byBkbyB0byBtYXRjaAorICB0aGlzIGNoYW5nZS4gOiggIEJVVCwgdGhlcmUgaXMgb25seSBhIHNsaWdodCB0d2VhayBpbiB0aGUgRGJnLnN0ZworICBhbmQgQVNURGJnLnN0ZyB0ZW1wbGF0ZXMuCisgIEludGVyZmFjZSBqdXN0IGRpZG4ndCBtYWtlIHNlbnNlIGFzIGlzLiAgSWYgeW91IHR1cm4gb24gZGVidWdnaW5nLCBhbmQKKyAgd2FudCB0byB0cmFjayBhIG5vZGUgY3JlYXRpb24sIHlvdSB3YW50IHRoZSBub2RlIHBvaW50ZXIgbm90IGl0cyBJRCwKKyAgdGV4dCwgZXRjLi4uCisgIEFkZGVkIFByb3h5VHJlZSBmb3IgcGFzc2luZyBhY3Jvc3Mgc29ja2V0LiAgSGFzIGxpbmUvY2hhcnBvcyBhbmQgdG9rZW5JbmRleAorCitKdWx5IDE1LCAyMDA3CisKKyogYWRkZWQgbnVsbCBwdHIgcHJvdGVjdGlvbiBpbiBDb21tb25UcmVlQWRhcHRvci4KKworSnVseSAxNCwgMjAwNworCisqIG51bGwgY2hpbGQgaW4gVHJlZUFkYXB0b3IgZG9lcyBub3RoaW5nIG5vdy4gIENoYW5nZWQgaW50ZXJmYWNlIGFuZAorICBpbXBsZW1lbnRhdGlvbi4gIENoYW5nZWQgRGVidWdUcmVlQWRhcHRvciB0byBub3QgZmlyZSBldmVudHMgb24gbnVsbCBhZGQKKyAgYXMgd2VsbC4KKworSnVseSAxMiwgMjAwNworCisqIGFkZGVkIGdldCBtZXRob2QgZm9yIHRoZSBsaW5lL2NvbCB0byBERkEgbWFwIGluIEdyYW1tYXIuamF2YQorCitKdWx5IDcsIDIwMDcKKworKiBmaXhlZCB3cm9uZyBvcmRlciBvZiB0ZXN0IGZvciBleGNlcHRpb25zIGluIExleGVyLmdldEVycm9yTWVzc2FnZSgpCisKK0p1bmUgMjgsIDIwMDcKKworKiBBZGRlZCBhYmlsaXR5IHRvIHNldCB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgZGVidWcgcGFyc2VyLgorCitKdW5lIDUsIDIwMDcKKworKiBDaGFuZ2VkIChoaWRkZW4pIG9wdGlvbiAtdmVyYm9zZSB0byAtWG5mYXN0YXRlczsgdGhpcyBqdXN0IHByaW50cyBvdXQgdGhlIE5GQSBzdGF0ZXMgYWxvbmcgZWFjaCBub25kZXRlcm1pbmlzdGljIHBhdGggZm9yIG5vbmRldGVybWluaXNtIHdhcm5pbmdzLgorCitNYXkgMTgsIDIwMDcKKworKiB0aGVyZSB3ZXJlIHNvbWUgZGVwZW5kZW5jaWVzIHdpdGggb3JnLmFudGxyLiogdGhhdCBJIHJlbW92ZWQgZnJvbQorICBvcmcuYW50bHIucnVudGltZS4qCisKKzMuMCBmaW5hbCAtIE1heSAxNywgMjAwNworCitNYXkgMTQsIDIwMDcKKworKiBBdXRvIGJhY2t0cmFja2luZyBkaWRuJ3Qgd29yayB3aXRoICEgYW5kIF4gc3VmZml4ZXMgb24gZmlyc3QgZWxlbWVudAorICBvZiBhbiBhbHQuCisKKyogQXV0byBiYWNrdHJhY2tpbmcgZGlkbid0IHdvcmsgd2l0aCBhbiBhY3Rpb24gYXMgZmlyc3QgZWxlbWVudC4KKworTWF5IDEwLCAyMDA3CisKKyogdHVybiBvZmYgdGhlIHdhcm5pbmcgYWJvdXQgbm8gbG9jYWwgbWVzc2FnZXM6Cisgbm8gc3VjaCBsb2NhbGUgZmlsZSBvcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvbGFuZ3VhZ2VzL3J1LnN0ZyByZXRyeWluZyB3aXRoIEVuZ2xpc2ggbG9jYWxlCisKK01heSA1LCAyMDA3CisKKyogbW92aW5nIG9yZy5hbnRsci5ydW50aW1lIHRvIHJ1bnRpbWUvSmF2YS9zcmMvb3JnLy4uLiBPdGhlciB0YXJnZXQKKyAgc291cmNlIC8gbGlicyBhcmUgdW5kZXIgcnVudGltZS90YXJnZXRuYW1lLgorCitNYXkgNCwgMjAwNworCisqIFlvdSBjb3VsZCBub3QgdXNlIGFyZ3VtZW50cyBvbiBhIHRva2VuIHJlZmVyZW5jZSB0aGF0IHdhcyBhIHJvdXRlIGluIGEKKyAgdHJlZSByZXdyaXRlIHJ1bGUgbGlrZSAtPiBeKElEW2FyZ3NdIC4uLikuCisKK01heSAzLCAyMDA3CisKKyogRml4ZWQgQU5UTFItODIuICBBY3Rpb25zIGFmdGVyIHRoZSByb290IHdlcmUgY29uc2lkZXJlZCBwYXJ0IG9mCisgIGFuIG9wdGlvbmFsIGNoaWxkLiAgVGhleSB3ZXJlIG5vdCBhbHdheXMgZXhlY3V0ZWQuICBSZXF1aXJlZCBhIGNoYW5nZQorICB0byB0aGUgQU5UTFJDb3JlLnN0aSBpbnRlcmZhY2UgZm9yIHRyZWUoKSB0ZW1wbGF0ZS4KKworTWF5IDIsIDIwMDcKKworKiBGaXhlZCBBTlRMUi0xMTcuIFdhc24ndCBidWlsZGluZyBkZWNpc2lvbnMgcHJvcGVybHkgZm9yIHN1YnJ1bGVzIGluCisgIHN5bnRhY3RpYyBwcmVkaWNhdGVzLgorCitBcHJpbCAyMiwgMjAwNworCisqIE1hZGUgYnVpbGQueG1sIHJlZiBhbGwgamFycyBpbiBhbnRsciBsaWIuICBUaGFua3MgdG8gTWlndWVsIFBpbmcuCisKKyogRml4ZWQgQU5UTFItMTEKKworKiBOb3cgbGFiZWxzIG9uIHJhbmdlcyBhbmQgc3VjaCBpbiBsZXhlciB3b3JrIHByb3Blcmx5LgorCisqIEFjdGlvbkFuYWx5c2lzTGV4ZXIgd2FzIGluIHdyb25nIHBhY2thZ2UuCisKK0FwcmlsIDIxLCAyMDA3CisKKyogUHVzaGluZyBhIGh1Z2UgdXBkYXRlIHRoYXQgZml4ZXM6CisJaHR0cDovL3d3dy5hbnRsci5vcmcvYnJvd3NlL0FOVExSLTExMgorCWh0dHA6Ly93d3cuYW50bHIub3JnL2Jyb3dzZS9BTlRMUi0xMTAKKwlodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItMTA5CisJaHR0cDovL3d3dy5hbnRsci5vcmcvYnJvd3NlL0FOVExSLTEwMworCWh0dHA6Ly93d3cuYW50bHIub3JnL2Jyb3dzZS9BTlRMUi05NworCWh0dHA6Ly93d3cuYW50bHIub3JnL2Jyb3dzZS9BTlRMUi0xMTMKKwlodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItNjYKKwlodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItOTgKKwlodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItMjQKKwlodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItMTE0CisJaHR0cDovL3d3dy5hbnRsci5vcmcvYnJvd3NlL0FOVExSLTUKKwlodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItNgorCisgIEJhc2ljYWxseSwgSSBndXR0ZWQgdGhlIHdheSBBU1QgcmV3cml0ZXMgd29yay4gIE1VQ0ggYmV0dGVyLgorCisqIEZpeGVkIGxvdHMgb2YgbGl0dGxlIGxhYmVsIGlzc3VlcyBpbiB0aGUgbGV4ZXIuICBDb3VsZG4ndCBkbyB4Kz1JRAorICBpbiBsZXhlciwgZm9yIGV4YW1wbGUuICBGaXhlZCBBTlRMUi0xMTQsIEFOVExSLTExMgorCisqIElzb2xhdGVkIEVPVCB0cmFuc2l0aW9uIGluIGxleGVyIGdlbmVyYXRlZCBkYW5nbGluZyBlbHNlIGNsYXVzZS4KKyAgRml4ZWQgQU5UTFItMTEzLgorCitBcHJpbCAxNywgMjAwNworCisqIEZpeGVkIGEgbWFqb3IgcHJvYmxlbSB3aXRoIGdhdGVkIHNlbWFudGljIHByZWRpY2F0ZXMuICBBZGRlZCBtb3JlCisgIHVuaXQgdGVzdHMuCisKKyogRml4ZWQgYnVnIGluIGN5Y2xpYyBERkEgd2l0aCBzeW50YWN0aWMgcHJlZGljYXRlcy4gIFdhc24ndCByZXdpbmRpbmcKKyAgcHJvcGVybHkuICBGdXJ0aGVyLCBtYXJrKCkgaW4gdG9rZW4gc3RyZWFtIGRpZCBub3QgZmlsbCBidWZmZXIgc28KKyAgd2hlbiB5b3UgcmV3b3VuZCBiYWNrIHRvIGxhc3QgbWFya2VyIGluZGV4IHdhcyAtMSBub3QgMC4gIEF0IHNhbWUgdGltZQorICBJIGZpeGVkIEFOVExSLTEwMy4gIFN5biBwcmVkcyBldmFsdWF0ZWQgb25seSBvbmNlIG5vdy4KKworKiBBbHRlcmVkIGNvZGUgZ2VuIGZpbGUgd3JpdGluZyBzbyBpdCB3cml0ZXMgZGlyZWN0bHkgdG8gYSBmaWxlCisgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBiaWcgc3RyaW5nIGFuZCB0aGVuIHdyaXRpbmcgdGhhdCBvdXQuICBTaG91bGQKKyAgYmUgZmFzdGVyIGFuZCBtdWNoIGxlc3MgbWVtb3J5IGludGVuc2l2ZS4KKworKiBGaXhlZCBzbyBhbnRsciB3cml0ZXMgZmlsZXMgdG8gY29ycmVjdCBsb2NhdGlvbiBhZ2Fpbi4gIFNlZToKKworaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9wYWdlcy92aWV3cGFnZS5hY3Rpb24/cGFnZUlkPTE4NjIKKworMy4wYjcgLSBBcHJpbCAxMiwgMjAwNworCitBcHJpbCAxMCwgMjAwNworCisqIEFsbG93cyAtPiB7Li4ufSBhY3Rpb25zIG5vdyB3aGVuIGJ1aWxkaW5nIEFTVHMuICBGaXhlZCBBTlRMUi0xNC4KKworKiBBbGxvd3MgISBvbiBzZXRzIGFuZCB3aWxkY2FyZCBub3cgZHVyaW5nIG91dHB1dD1BU1Qgb3B0aW9uLiBGaXhlZCBBTlRMUi0xNy4KKworKiBGaXhlZCBBTlRMUi05MiBidWcuICBDb3VsZG4ndCB1c2Ugc2V0cyB3aXRoIC0+IHRyZWUgY29uc3RydWN0aW9uLgorCisqIE5vIGxleGVyIHJ1bGUgZm9yIGEgdG9rZW4gdHlwZSBpcyBub3cgYSB3YXJuaW5nLgorCisqIEZpeGVkIHNldCBsYWJlbHMgaW4gbGV4ZXI7IEFOVExSLTYwIGJ1ZworCisqIEZpeGVkIHByb2JsZW0gd2l0aCBkdXBsaWNhdGUgc3RhdGUgdmFyaWFibGUgZGVmaW5pdGlvbnMgaW4gc3dpdGNoLWNhc2UKKworQXByaWwgOSwgMjAwNworCisqIEdhdGVkIHByZWRpY2F0ZXMgZGlkbid0IHdvcmsgcHJvcGVybHkgaW4gY3ljbGljIERGQS4KKworQXByaWwgNywgMjAwNworCisqIENvdWxkbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBzZXQgcGVyIHJ1bGUgaXQgc2VlbXMuICBGaXhlZC4KKworQXByaWwgMywgMjAwNworCisqIEZpeCBhIHByb2JsZW0gaW4gbXkgdW51c2VkIGxhYmVsIG9wdGltaXphdGlvbi4gIEFkZGVkIG5ldworICBwYXNzIG92ZXIgYWN0aW9ucyB0byBleGFtaW5lIHRoZW0uCisKKyogUnVsZVJldHVyblNjb3BlIGhhcyBtZXRob2QgYmFjazoKKyAgLyoqIEhhcyBhIHZhbHVlIHBvdGVudGlhbGx5IGlmIG91dHB1dD10ZW1wbGF0ZTsgRG9uJ3QgdXNlIFN0cmluZ1RlbXBsYXRlCisgICAqICB0eXBlIGFzIGl0IHRoZW4gY2F1c2VzIGEgZGVwZW5kZW5jeSB3aXRoIFNUIGxpYi4KKyAgICovCisgIHB1YmxpYyBPYmplY3QgZ2V0VGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CisKK01hcmNoIDMwLCAyMDA3CisKKyogRml4ZWQgQU5UTFItOC4gIExhYmVscyB0byBydWxlcyB3L28gcmV0dXJuIHZhbHVlcyBjYXVzZWQgY29tcGlsZSBlcnJvcnMuCisKKyogRml4ZWQgQU5UTFItODk7IHNlbWFudGljIHByZWRpY2F0ZXMgaW4gbGV4ZXIgc29tZXRpbWVzCisgIGNhdXNlZCBleGNlcHRpb24gaW4gY29kZSBnZW4uCisKKyogRml4ZWQgQU5UTFItMzY7IHJlbW92ZSBydW50aW1lIGRlcGVuZGVuY3kgd2l0aCBTVAorCitNYXJjaCAyOSwgMjAwNworCisqIE92ZXIgbGFzdCBmZXcgZGF5cywgSSd2ZSBndXR0ZWQgaG93IEFOVExSIGhhbmRsZXMgc2V0cyBvZiBjaGFycyBvcgorICB0b2tlbnMuICBJIGNsZWFuZWQgdXAgYSBsb3Qgb2Ygc3R1ZmYgaW4gdGhlIGdyYW1tYXJzIGFuZCBhZGRlZCBsb3RzCisgIG9mIHVuaXQgdGVzdHMuCisKK01hcmNoIDI2LCAyMDA3CisKKyogQ29tbW9uVHJlZU5vZGVTdHJlYW0gZGlkbid0IHB1c2ggY29ycmVjdGx5OyBjb3VsZG4ndCBoYW5kbGUgdmVyeQorICBkZWVwbHkgbmVzdGVkIHRyZWVzLgorCisqIEZpeGVkIGJ1ZyB0aGF0IEUgOiAnYScgJ2InIDsgbWFkZSBFIGJlIHNlZW4gYXMgYW4gYWxpYXMgb2YgJ2EnLgorCitNYXJjaCAyMiwgMjAwNworCisqIFdvcmtpbmcgd2l0aCBFZ29yIFVzaGFrb3YgZnJvbSBTdW4gT3B0aW1pemF0aW9uIC8gTmV0QmVhbnMgdGVhbSBJCisgIG1hZGUgYWxsIHRoZSBKYXZhIGxleGVyIHRyYW5zaXRpb24gdGFibGVzIHN0YXRpYyB3L28gc2NyZXdpbmcgdXAKKyAgYWJpbGl0eSB0byByZWZlcmVuY2Ugc2VtYW50aWMgcHJlZGljYXRlcyBldGMuLi4gIE9ubHkgY2hhbmdlZCBKYXZhLnN0ZworCisqIGNhY2hlZCB0ZXh0IHN0cmluZyBpbiBDb21tb25Ub2tlbi5nZXRUZXh0KCk7IHNhdmVzIG9uIHJlcGVhdGVkIGNhbGxzOworICBKYXZhIG1vZGUuCisKKyogbWFkZSBhbGwgZ2VuZXJhdGVkIG1ldGhvZHMgZmluYWw7IHNhdmVzIGEgZmV3IHBlcmNlbnQgc3BlZWQgYWNjb3JkaW5nIHRvCisgIEVnb3IgVXNoYWtvdiAoSmF2YSBvbmx5KS4KKworKiByZW1vdmVkIG1vc3QgYXNzaWdubWVudHMgZnJvbSBlYWNoIGxleGVyIHJ1bGUgYW5kIGV2ZW4gdGhlIExleGVyLmVtaXQoKQorICBjYWxsISAgQWxsIGRvbmUgaW4gbmV4dFRva2VuIG5vdy4gIFNhdmVzIG9uIGNvZGUgZ2VuIHNpemUgYW5kIGEgd2VlIGJpdCBvZgorICBleGVjdXRpb24gc3BlZWQgcHJvYmFibHkuICBWYXJpYWJsZXMgYmVjYW1lIGZpZWxkczogdHlwZSwgY2hhbm5lbCwgbGluZSwKKyAgZXRjLi4uIE5vdyBlbWl0KCkgbmVlZHMgbm8gYXJncyBldmVuLiAgQWdhaW4sIEVnb3IgaGVscGVkIG9uIHRoaXMuCisKK01hcmNoIDE3LCAyMDA3CisKKyogSm9uYXRoYW4gRGVLbG90eiB1cGRhdGVkIEMjIHRlbXBsYXRlcyB0byBiZSAzLjBiNiBjdXJyZW50CisKK01hcmNoIDE0LCAyMDA3CisKKyogTWFudWFsbHktc3BlY2lmaWVkICguLi4pPT4gZm9yY2UgYmFja3RyYWNraW5nIGV2YWwgb2YgdGhhdCBwcmVkaWNhdGUuCisgIGJhY2t0cmFja2luZz10cnVlIG1vZGUgZG9lcyBub3QgaG93ZXZlci4gIEFkZGVkIHVuaXQgdGVzdC4KKworTWFyY2ggMTQsIDIwMDcKKworKiBGaXhlZCBidWcgaW4gbGV4ZXIgd2hlcmUgflQgZGlkbid0IGNvbXB1dGUgdGhlIHNldCBmcm9tIHJ1bGUgVC4KKworKiBBZGRlZCAtWG5vaW5saW5lZGZhIG1ha2UgYWxsIERGQSB3aXRoIHRhYmxlczsgbm8gaW5saW5lIHByZWRpY3Rpb24gd2l0aCBJRnMKKworKiBGaXhlZCBodHRwOi8vd3d3LmFudGxyLm9yZy9icm93c2UvQU5UTFItODAuCisgIFNlbSBwcmVkIHN0YXRlcyBkaWRuJ3QgZGVmaW5lIGxvb2thaGVhZCB2YXJzLgorCisqIEZpeGVkIGh0dHA6Ly93d3cuYW50bHIub3JnL2Jyb3dzZS9BTlRMUi05MS4KKyAgV2hlbiBmb3JjaW5nIHNvbWUgYWN5Y2xpYyBERkEgdG8gYmUgc3RhdGUgdGFibGVzLCB0aGV5IGJyb2tlLgorICBGb3JjaW5nIGFsbCBERkEgdG8gYmUgc3RhdGUgdGFibGVzIHNob3VsZCBnaXZlIHNhbWUgcmVzdWx0cy4KKworTWFyY2ggMTIsIDIwMDcKKworKiBzZXRUb2tlblNvdXJjZSBpbiBDb21tb25Ub2tlblN0cmVhbSBkaWRuJ3QgY2xlYXIgdG9rZW5zIGxpc3QuCisgIHNldENoYXJTdHJlYW0gY2FsbHMgcmVzZXQgaW4gTGV4ZXIuCisKKyogQWx0ZXJlZCAtZGVwZW5kLiAgTm8gbG9uZ2VyIHByaW50aW5nIGdyYW1tYXIgZmlsZXMgZm9yIG11bHRpcGxlIGlucHV0CisgIGZpbGVzIHdpdGggLWRlcGVuZC4gIERvZXNuJ3Qgc2hvdyBUX18uZyB0ZW1wIGZpbGUgYW55bW9yZS4gQWRkZWQKKyAgVExleGVyLnRva2Vucy4gIEFkZGVkIC5oIGZpbGVzIGlmIGRlZmluZWQuCisKK0ZlYnJ1YXJ5IDExLCAyMDA3CisKKyogQWRkZWQgLWRlcGVuZCBjb21tYW5kLWxpbmUgb3B0aW9uIHRoYXQsIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBmaWxlcywKKyAgaXQgc2hvd3MgeW91IHdoYXQgZmlsZXMgdGhlIGlucHV0IGdyYW1tYXIocykgZGVwZW5kIG9uIGFuZCB3aGF0IGZpbGVzCisgIHRoZXkgZ2VuZXJhdGUuIEZvciBjb21iaW5lZCBncmFtbWFyIFQuZzoKKworICAkIGphdmEgb3JnLmFudGxyLlRvb2wgLWRlcGVuZCBULmcKKworICBZb3UgZ2V0OgorCisgIFRQYXJzZXIuamF2YSA6IFQuZworICBULnRva2VucyA6IFQuZworICBUX18uZyA6IFQuZworCisgIE5vdywgYXNzdW1pbmcgVS5nIGlzIGEgdHJlZSBncmFtbWFyIHJlZidkIFQncyB0b2tlbnM6CisKKyAgJCBqYXZhIG9yZy5hbnRsci5Ub29sIC1kZXBlbmQgVC5nIFUuZworCisgIFRQYXJzZXIuamF2YSA6IFQuZworICBULnRva2VucyA6IFQuZworICBUX18uZyA6IFQuZworICBVLmc6IFQudG9rZW5zCisgIFUuamF2YSA6IFUuZworICBVLnRva2VucyA6IFUuZworCisgIEhhbmRsZXMgc3BhY2VzIGJ5IGVzY2FwaW5nIHRoZW0uICBQYXlzIGF0dGVudGlvbiB0byAtbywgLWZvIGFuZCAtbGliLgorICBEaXIgJ3ggeScgaXMgYSB2YWxpZCBkaXIgaW4gY3VycmVudCBkaXIuCisKKyAgJCBqYXZhIG9yZy5hbnRsci5Ub29sIC1kZXBlbmQgLWxpYiAvdXNyL2xvY2FsL2xpYiAtbyAneCB5JyBULmcgVS5nCisgIHhcIHkvVFBhcnNlci5qYXZhIDogVC5nCisgIHhcIHkvVC50b2tlbnMgOiBULmcKKyAgeFwgeS9UX18uZyA6IFQuZworICBVLmc6IC91c3IvbG9jYWwvbGliL1QudG9rZW5zCisgIHhcIHkvVS5qYXZhIDogVS5nCisgIHhcIHkvVS50b2tlbnMgOiBVLmcKKworICBZb3UgaGF2ZSBBUEkgYWNjZXNzIHZpYSBvcmcuYW50bHIudG9vbC5CdWlsZERlcGVuZGVuY3lHZW5lcmF0b3IgY2xhc3M6CisgIGdldEdlbmVyYXRlZEZpbGVMaXN0KCksIGdldERlcGVuZGVuY2llc0ZpbGVMaXN0KCkuICBZb3UgY2FuIGFsc28gYWNjZXNzCisgIHRoZSBvdXRwdXQgdGVtcGxhdGU6IGdldERlcGVuZGVuY2llcygpLiAgVGhlIGZpbGUKKyAgb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RlcGVuZC5zdGcgY29udGFpbnMgdGhlIHRlbXBsYXRlLiAgWW91IGNhbgorICBtb2RpZnkgYXMgeW91IHdhbnQuICBGaWxlIG9iamVjdHMgZ28gaW4gc28geW91IGNhbiBwbGF5IHdpdGggcGF0aCBldGMuLi4KKworRmVicnVhcnkgMTAsIDIwMDcKKworKiBubyBtb3JlIC5nbCBmaWxlcyBnZW5lcmF0ZWQuICBBbGwgLmcgYWxsIHRoZSB0aW1lLgorCisqIGNoYW5nZWQgQGZpbmFsbHkgdG8gYmUgQGFmdGVyIGFuZCBhZGRlZCBhIGZpbmFsbHkgY2xhdXNlIHRvIHRoZQorICBleGNlcHRpb24gc3R1ZmYuICBJIGFsc28gcmVtb3ZlZCB0aGUgc3VwZXJmbHVvdXMgImV4Y2VwdGlvbiIKKyAga2V5d29yZC4gIEhlcmUncyB3aGF0IHRoZSBuZXcgc3ludGF4IGxvb2tzIGxpa2U6CisKKyAgYQorICBAYWZ0ZXIgeyBTeXN0ZW0ub3V0LnByaW50bG4oImljayIpOyB9CisgICAgOiAnYScKKyAgICA7CisgICAgY2F0Y2hbUmVjb2duaXRpb25FeGNlcHRpb24gZV0geyBTeXN0ZW0ub3V0LnByaW50bG4oImZvbyIpOyB9CisgICAgY2F0Y2hbSU9FeGNlcHRpb24gZV0geyBTeXN0ZW0ub3V0LnByaW50bG4oImlvIik7IH0KKyAgICBmaW5hbGx5IHsgU3lzdGVtLm91dC5wcmludGxuKCJmb29iYXIiKTsgfQorCisgIEBhZnRlciBleGVjdXRlcyBhZnRlciBib29ra2VlcGluZyB0byBzZXQgJHJ1bGUuc3RvcCwgJHJ1bGUudHJlZSBidXQKKyAgYmVmb3JlIHNjb3BlcyBwb3AgYW5kIGFueSBtZW1vaXphdGlvbiBoYXBwZW5zLiAgRHluYW1pYyBzY29wZXMgYW5kCisgIG1lbW9pemF0aW9uIGFyZSBzdGlsbCBpbiBnZW5lcmF0ZWQgZmluYWxseSBibG9jayBiZWNhdXNlIHRoZXkgbXVzdAorICBleGVjIGV2ZW4gaWYgZXJyb3IgaW4gcnVsZS4gIFRoZSBAYWZ0ZXIgYWN0aW9uIGFuZCB0cmVlIHNldHRpbmcKKyAgc3R1ZmYgY2FuIHRlY2huaWNhbGx5IGJlIHNraXBwZWQgdXBvbiBzeW50YXggZXJyb3IgaW4gcnVsZS4gIFtMYXRlcgorICB3ZSBtaWdodCBhZGQgc29tZXRoaW5nIHRvIGZpbmFsbHkgdG8gc3RpY2sgYW4gRVJST1IgdG9rZW4gaW4gdGhlCisgIHRyZWUgYW5kIHNldCB0aGUgcmV0dXJuIHZhbHVlLl0gIFNlcXVlbmNlIGdvZXM6IHNldCAkc3RvcCwgJHRyZWUgKGlmCisgIGFueSksIEBhZnRlciAoaWYgYW55KSwgcG9wIHNjb3BlcyAoaWYgYW55KSwgbWVtb2l6ZSAoaWYgbmVlZGVkKSwKKyAgZ3JhbW1hciBmaW5hbGx5IGNsYXVzZS4gIExhc3QgMyBhcmUgaW4gZ2VuZXJhdGVkIGNvZGUncyBmaW5hbGx5CisgIGNsYXVzZS4KKworMy4wYjYgLSBKYW51YXJ5IDMxLCAyMDA3CisKK0phbnVhcnkgMzAsIDIwMDcKKworKiBGaXhlZCBidWcgaW4gSW50ZXJ2YWxTZXQuYW5kOiBpdCByZXR1cm5lZCB0aGUgc2FtZSBlbXB0eSBzZXQgYWxsIHRoZSB0aW1lCisgIHJhdGhlciB0aGFuIG5ldyBlbXB0eSBzZXQuICBDb2RlIGFsdGVyZWQgdGhlIHNhbWUgZW1wdHkgc2V0LgorCisqIE1hZGUgYW5hbHlzaXMgdGVybWluYXRlIGZhc3RlciB1cG9uIGEgZGVjaXNpb24gdGhhdCB0YWtlcyB0b28gbG9uZzsKKyAgaXQgc2VlbWVkIHRvIGtlZXAgZG9pbmcgd29yayBmb3IgYSB3aGlsZS4gIFJlZmFjdG9yZWQgc29tZSBuYW1lcworICBhbmQgdXBkYXRlZCBjb21tZW50cy4gIEFsc28gbWFkZSBpdCB0ZXJtaW5hdGUgd2hlbiBpdCByZWFsaXplcyBpdCdzCisgIG5vbi1MTCgqKSBkdWUgdG8gcmVjdXJzaW9uLiAganVzdCBhZGRlZCB0ZXJtaW5hdGUgY29uZGl0aW9ucyB0byBsb29wCisgIGluIGNvbnZlcnQoKS4KKworKiBTb21ldGltZXMgZmF0YWwgbm9uLUxMKCopIG1lc3NhZ2VzIGRpZG4ndCBhcHBlYXI7IGluc3RlYWQgeW91IGdvdAorICAiYW50bHIgY291bGRuJ3QgYW5hbHl6ZSIsIHdoaWNoIGlzIGFjdHVhbGx5IHVudHJ1ZS4gIEkgaGFkIHRoZQorICBvcmRlciBvZiBzb21lIHByaW50cyB3cm9uZyBpbiB0aGUgRGVjaXNpb25Qcm9iZS4KKworKiBUaGUgY29kZSBnZW5lcmF0b3IgaW5jb3JyZWN0bHkgZGV0ZWN0ZWQgd2hlbiBpdCBjb3VsZCB1c2UgYSBmaXhlZCwKKyAgYWN5Y2xpYyBpbmxpbmUgREZBIChpLmUuLCB1c2luZyBhbiBJRikuICBVcG9uIG5vbi1MTCgqKSBkZWNpc2lvbnMKKyAgd2l0aCBwcmVkaWNhdGVzLCBhbmFseXNpcyBtYWRlIGN5Y2xpYyBERkEuICBCdXQgdGhpcyBzdG9wcworICB0aGUgY29tcHV0YXRpb24gZGV0ZWN0aW5nIHdoZXRoZXIgdGhleSBhcmUgY3ljbGljLiAgSSBqdXN0IGFkZGVkCisgIGEgcHJvdGVjdGlvbiBpbiBmcm9udCBvZiB0aGUgYWN5Y2xpYyBERkEgZ2VuZXJhdG9yIHRvIGF2b2lkIGlmCisgIG5vbi1MTCgqKS4gIFVwZGF0ZWQgY29tbWVudHMuCisKK0phbnVhcnkgMjMsIDIwMDcKKworKiBNYWRlIHRyZWUgbm9kZSBzdHJlYW1zIHVzZSBhZGFwdG9yIHRvIGNyZWF0ZSBuYXZpZ2F0aW9uIG5vZGVzLgorICBUaGFua3MgdG8gRW1vbmQgUGFwZWdhYWlqLgorCitKYW51YXJ5IDIyLCAyMDA3CisKKyogQWRkZWQgbGV4ZXIgcnVsZSBwcm9wZXJ0aWVzOiBzdGFydCwgc3RvcAorCitKYW51YXJ5IDEsIDIwMDcKKworKiBhbmFseXNpcyBmYWlsc2FmZSBpcyBiYWNrIG9uOyBpZiBhIGRlY2lzaW9uIHRha2VzIHRvbyBsb25nLCBpdCBiYWlscyBvdXQKKyAgYW5kIHVzZXMgaz0xCisKK0phbnVhcnkgMSwgMjAwNworCisqICs9IGxhYmVscyBmb3IgcnVsZXMgb25seSB3b3JrIGZvciBvdXRwdXQgb3B0aW9uOyBwcmV2aW91c2x5IGVsZW1lbnRzCisgIG9mIGxpc3Qgd2VyZSB0aGUgcmV0dXJuIHZhbHVlIHN0cnVjdHMsIGJ1dCBhcmUgbm93IGVpdGhlciB0aGUgdHJlZSBvcgorICBTdHJpbmdUZW1wbGF0ZSByZXR1cm4gdmFsdWUuICBZb3UgY2FuIGxhYmVsIGRpZmZlcmVudCBydWxlcyBub3cKKyAgeCs9YSB4Kz1iLgorCitEZWNlbWJlciAzMCwgMjAwNgorCisqIEFsbG93IFwiIHRvIHdvcmsgY29ycmVjdGx5IGluICIuLi4iIHRlbXBsYXRlLgorCitEZWNlbWJlciAyOCwgMjAwNgorCisqIGVycm9ycyB0aGF0IGFyZSBub3cgd2FybmluZ3M6IG1pc3NpbmcgQVNUIGxhYmVsIHR5cGUgaW4gdHJlZXMuCisgIEFsc28gIm5vIHN0YXJ0IHJ1bGUgZGV0ZWN0ZWQiIGlzIHdhcm5pbmcuCisKKyogdHJlZSBncmFtbWFycyBhbHNvIGNhbiBkbyByZXdyaXRlPXRydWUgZm9yIG91dHB1dD10ZW1wbGF0ZS4KKyAgT25seSB3b3JrcyBmb3IgYWx0cyB3aXRoIHNpbmdsZSBub2RlIG9yIHRyZWUgYXMgYWx0IGVsZW1lbnRzLgorICBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSAkdGV4dCBpbiBhIHRyZWUgZ3JhbW1hciBvciBkbyByZXdyaXRlPXRydWUKKyAgZm9yIHRlbXBsYXRlcywgeW91IG11c3QgdXNlIGluIHlvdXIgbWFpbjoKKworICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOworCisqIFlvdSBnZXQgYSB3YXJuaW5nIGZvciB0cmVlIGdyYW1tYXJzIHRoYXQgZG8gcmV3cml0ZT10cnVlIGFuZAorICBvdXRwdXQ9dGVtcGxhdGUgYW5kIGhhdmUgLT4gZm9yIGFsdHMgdGhhdCBhcmUgbm90IHNpbXBsZSBub2RlcworICBvciBzaW1wbGUgdHJlZXMuICBuZXcgdW5pdCB0ZXN0cyBpbiBUZXN0UmV3cml0ZVRlbXBsYXRlcyBhdCBlbmQuCisKK0RlY2VtYmVyIDI3LCAyMDA2CisKKyogRXJyb3IgbWVzc2FnZSBhcHBlYXJzIHdoZW4geW91IHVzZSAtPiBpbiB0cmVlIGdyYW1tYXIgd2l0aAorICBvdXRwdXQ9dGVtcGxhdGUgYW5kIHJld3JpdGU9dHJ1ZSBmb3IgYWx0IHRoYXQgaXMgbm90IHNpbXBsZQorICBub2RlIG9yIHRyZWUgcmVmLgorCisqIG5vIG1vcmUgJHN0b3AgYXR0cmlidXRlIGZvciB0cmVlIHBhcnNlcnM7IG1lYW5pbmdsZXNzL3VzZWxlc3MuCisgIFJlbW92ZWQgZnJvbSBUcmVlUnVsZVJldHVyblNjb3BlIGFsc28uCisKKyogcnVsZSB0ZXh0IGF0dHJpYnV0ZSBpbiB0cmVlIHBhcnNlciBtdXN0IHB1bGwgZnJvbSB0b2tlbiBidWZmZXIuCisgIE1ha2VzIG5vIHNlbnNlIG90aGVyd2lzZS4gIGFkZGVkIGdldFRva2VuU3RyZWFtIHRvIFRyZWVOb2RlU3RyZWFtCisgIHNvIHJ1bGUgJHRleHQgYXR0ciB3b3Jrcy4gIENvbW1vblRyZWVOb2RlU3RyZWFtIGV0Yy4uLiBub3cgbGV0CisgIHlvdSBzZXQgdGhlIHRva2VuIHN0cmVhbSBzbyB5b3UgY2FuIGFjY2VzcyBsYXRlciBmcm9tIHRyZWUgcGFyc2VyLgorICAkdGV4dCBpcyBub3Qgd2VsbC1kZWZpbmVkIGZvciBydWxlcyBsaWtlCisKKyAgICAgc2xpc3QgOiBzdGF0KyA7CisKKyAgYmVjYXVzZSBzdGF0IGlzIG5vdCBhIHNpbmdsZSBub2RlIG5vciByb290ZWQgd2l0aCBhIHNpbmdsZSBub2RlLgorICAkc2xpc3QudGV4dCB3aWxsIGdldCBvbmx5IGZpcnN0IHN0YXQuICBJIG5lZWQgdG8gYWRkIGEgd2FybmluZyBhYm91dAorICB0aGlzLi4uCisKKyogRml4ZWQgaHR0cDovL3d3dy5hbnRsci5vcmcvYnJvd3NlL0FOVExSLTc2IGZvciBKYXZhLgorICBFbmhhbmNlZCBUb2tlblJld3JpdGVTdHJlYW0gc28gaXQgYWNjZXB0cyBhbnkgb2JqZWN0OyBjb252ZXJ0cworICB0byBzdHJpbmcgYXQgbGFzdCBzZWNvbmQuICBBbGxvd3MgeW91IHRvIHJld3JpdGUgd2l0aCBTdHJpbmdUZW1wbGF0ZQorICB0ZW1wbGF0ZXMgbm93IDopCisKKyogYWRkZWQgcmV3cml0ZSBvcHRpb24gdGhhdCBtYWtlcyAtPiB0ZW1wbGF0ZSByZXdyaXRlcyBkbyByZXBsYWNlIG9wcyBmb3IKKyAgVG9rZW5SZXdyaXRlU3RyZWFtIGlucHV0IHN0cmVhbS4gIEluIG91dHB1dD10ZW1wbGF0ZSBhbmQgcmV3cml0ZT10cnVlIG1vZGUKKyAgc2FtZSBhcyBiZWZvcmUgJ2NlcHQgdGhhdCB0aGUgcGFyc2VyIGRvZXMKKworICAgICgoVG9rZW5SZXdyaXRlU3RyZWFtKWlucHV0KS5yZXBsYWNlKAorCSAgICAgICgoVG9rZW4pcmV0dmFsLnN0YXJ0KS5nZXRUb2tlbkluZGV4KCksCisJICAgICAgaW5wdXQuTFQoLTEpLmdldFRva2VuSW5kZXgoKSwKKwkgICAgICByZXR2YWwuc3QpOworCisgIGFmdGVyIGVhY2ggcmV3cml0ZSBzbyB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXMgYWx0ZXJlZC4gIExhdGVyIHJlZnMgdG8KKyAgJHRleHQgd2lsbCBoYXZlIHJld3JpdGVzLiAgSGVyZSdzIGEgc2FtcGxlIHRlc3QgcHJvZ3JhbSBmb3IgZ3JhbW1hciBSZXcuCisKKyAgICAgICAgRmlsZVJlYWRlciBncm91cEZpbGVSID0gbmV3IEZpbGVSZWFkZXIoIlJldy5zdGciKTsKKyAgICAgICAgU3RyaW5nVGVtcGxhdGVHcm91cCB0ZW1wbGF0ZXMgPSBuZXcgU3RyaW5nVGVtcGxhdGVHcm91cChncm91cEZpbGVSKTsKKyAgICAgICAgQU5UTFJJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUklucHV0U3RyZWFtKFN5c3RlbS5pbik7CisgICAgICAgIFJld0xleGVyIGxleGVyID0gbmV3IFJld0xleGVyKGlucHV0KTsKKyAgICAgICAgVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4ZXIpOworICAgICAgICBSZXdQYXJzZXIgcGFyc2VyID0gbmV3IFJld1BhcnNlcih0b2tlbnMpOworICAgICAgICBwYXJzZXIuc2V0VGVtcGxhdGVMaWIodGVtcGxhdGVzKTsKKyAgICAgICAgcGFyc2VyLnByb2dyYW0oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRva2Vucy50b1N0cmluZygpKTsKKyAgICAgICAgZ3JvdXBGaWxlUi5jbG9zZSgpOworCitEZWNlbWJlciAyNiwgMjAwNgorCisqIEJhc2VUcmVlLmR1cFRyZWUgZGlkbid0IGR1cCByZWN1cnNpdmVseS4KKworRGVjZW1iZXIgMjQsIDIwMDYKKworKiBDbGVhbmVkIHVwIHNvbWUgY29tbWVudHMgYW5kIHJlbW92ZWQgZmllbGQgdHJlZU5vZGUKKyAgZnJvbSBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24gY2xhc3MuICBJdCBpcyAibm9kZSIgaW4KKyAgUmVjb2duaXRpb25FeGNlcHRpb24uCisKKyogQ2hhbmdlZCB0eXBlIGZyb20gT2JqZWN0IHRvIEJpdFNldCBmb3IgZXhwZWN0aW5nIGZpZWxkcyBpbgorICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIGFuZCBNaXNtYXRjaGVkTm90U2V0RXhjZXB0aW9uCisKKyogQ2xlYW5lZCB1cCBlcnJvciBwcmludGluZyBpbiBsZXhlcnMgYW5kIHRoZSBtZXNzYWdlcyB0aGF0IGl0IGNyZWF0ZXMuCisKKyogQWRkZWQgdGhpcyB0byBUcmVlQWRhcHRvcjoKKwkvKiogUmV0dXJuIHRoZSB0b2tlbiBvYmplY3QgZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIGNyZWF0ZWQuCisJICogIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2UuCisJICogIFRoZSBlcnJvciBkaXNwbGF5IHJvdXRpbmUgaW4gQmFzZVJlY29nbml6ZXIgbmVlZHMgdG8KKwkgKiAgZGlzcGxheSB3aGVyZSB0aGUgaW5wdXQgdGhlIGVycm9yIG9jY3VycmVkLiBJZiB5b3VyCisJICogIHRyZWUgb2YgbGltaXRhdGlvbiBkb2VzIG5vdCBzdG9yZSBpbmZvcm1hdGlvbiB0aGF0IGNhbgorCSAqICBsZWFkIHlvdSB0byB0aGUgdG9rZW4sIHlvdSBjYW4gY3JlYXRlIGEgdG9rZW4gZmlsbGVkIHdpdGgKKwkgKiAgdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGFuZCBwYXNzIHRoYXQgYmFjay4gIFNlZQorCSAqICBCYXNlUmVjb2duaXplci5nZXRFcnJvck1lc3NhZ2UoKS4KKwkgKi8KKwlwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oT2JqZWN0IHQpOworCitEZWNlbWJlciAyMywgMjAwNgorCisqIG1hZGUgQmFzZVJlY29nbml6ZXIuZGlzcGxheVJlY29nbml0aW9uRXJyb3Igbm9uc3RhdGljIHNvIHBlb3BsZSBjYW4KKyAgb3ZlcnJpZGUgaXQuIE5vdCBzdXJlIHdoeSBpdCB3YXMgc3RhdGljIGJlZm9yZS4KKworKiBSZW1vdmVkIHN0YXRlL2RlY2lzaW9uIG1lc3NhZ2UgdGhhdCBjb21lcyBvdXQgb2Ygbm8KKyAgdmlhYmxlIGFsdGVybmF0aXZlIGV4Y2VwdGlvbnMsIGFzIHRoYXQgd2FzIHRvbyBtdWNoLgorICByZW1vdmVkIHRoZSBkZWNpc2lvbiBudW1iZXIgZnJvbSB0aGUgZWFybHkgZXhpdCBleGNlcHRpb24KKyAgYWxzby4gIER1cmluZyBkZXZlbG9wbWVudCwgeW91IGNhbiBzaW1wbHkgb3ZlcnJpZGUKKyAgZGlzcGxheVJlY29nbml0aW9uRXJyb3IgZnJvbSBCYXNlUmVjb2duaXplciB0byBhZGQgdGhlIHN0dWZmCisgIGJhY2sgaW4gaWYgeW91IHdhbnQuCisKKyogbWFkZSBvdXRwdXQgZ28gdG8gYW4gb3V0cHV0IG1ldGhvZCB5b3UgY2FuIG92ZXJyaWRlOiBlbWl0RXJyb3JNZXNzYWdlKCkKKworKiBnZW5lcmFsIGNsZWFudXAgb2YgdGhlIGVycm9yIGVtaXR0aW5nIGNvZGUgaW4gQmFzZVJlY29nbml6ZXIuICBMb3RzCisgIG1vcmUgc3R1ZmYgeW91IGNhbiBvdmVycmlkZTogZ2V0RXJyb3JIZWFkZXIsIGdldFRva2VuRXJyb3JEaXNwbGF5LAorICBlbWl0RXJyb3JNZXNzYWdlLCBnZXRFcnJvck1lc3NhZ2UuCisKK0RlY2VtYmVyIDIyLCAyMDA2CisKKyogQWx0ZXJlZCBUcmVlLlBhcnNlci5tYXRjaEFueSgpIHNvIHRoYXQgaXQgc2tpcHMgZW50aXJlIHRyZWVzIGlmCisgIG5vZGUgaGFzIGNoaWxkcmVuIG90aGVyd2lzZSBza2lwcyBvbmUgbm9kZS4gIE5vdyB0aGlzIHdvcmtzIHRvCisgIHNraXAgZW50aXJlIGJvZHkgb2YgZnVuY3Rpb24gaWYgc2luZ2xlLXJvb3RlZCBzdWJ0cmVlOgorICBeKEZVTkMgbmFtZT1JRCBhcmc9SUQgLikKKworKiBBZGRlZCAicmV2ZXJzZSBpbmRleCIgZnJvbSBub2RlIHRvIHN0cmVhbSBpbmRleC4gIE92ZXJyaWRlCisgIGZpbGxSZXZlcnNlSW5kZXgoKSBpbiBDb21tb25UcmVlTm9kZVN0cmVhbSBpZiB5b3Ugd2FudCB0byBjaGFuZ2UuCisgIFVzZSBnZXROb2RlSW5kZXgobm9kZSkgdG8gZmluZCBzdHJlYW0gaW5kZXggZm9yIGEgc3BlY2lmaWMgdHJlZSBub2RlLgorICBTZWUgZ2V0Tm9kZUluZGV4KCksIHJldmVyc2VJbmRleChTZXQgdG9rZW5UeXBlcyksCisgIHJldmVyc2VJbmRleChpbnQgdG9rZW5UeXBlKSwgZmlsbFJldmVyc2VJbmRleCgpLiAgVGhlIGluZGV4aW5nCisgIGNvc3RzIHRpbWUgYW5kIG1lbW9yeSB0byBmaWxsLCBidXQgcHVsbGluZyBzdHVmZiBvdXQgd2lsbCBiZSBsb3RzCisgIGZhc3RlciBhcyBpdCBjYW4ganVtcCBmcm9tIGEgbm9kZSBwdHIgc3RyYWlnaHQgdG8gYSBzdHJlYW0gaW5kZXguCisKKyogQWRkZWQgVHJlZU5vZGVTdHJlYW0uZ2V0KGluZGV4KSB0byBtYWtlIGl0IGVhc2llciBmb3IgaW50ZXJwcmV0ZXJzIHRvCisgIGp1bXAgYXJvdW5kIGluIHRyZWUgbm9kZSBzdHJlYW0uCisKKyogTmV3IENvbW1vblRyZWVOb2RlU3RyZWFtIGJ1ZmZlcnMgYWxsIG5vZGVzIGluIHN0cmVhbSBmb3IgZmFzdCBqdW1waW5nCisgIGFyb3VuZC4gIEl0IG5vdyBoYXMgcHVzaC9wb3AgbWV0aG9kcyB0byBpbnZva2Ugb3RoZXIgbG9jYXRpb25zIGluCisgIHRoZSBzdHJlYW0gZm9yIGJ1aWxkaW5nIGludGVycHJldGVycy4KKworKiBNb3ZlZCBDb21tb25UcmVlTm9kZVN0cmVhbSB0byBVbkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gYW5kIHJlbW92ZWQKKyAgSXRlcmF0b3IgaW1wbGVtZW50YXRpb24uICBtb3ZlZCB0b05vZGVzT25seVN0cmluZygpIHRvIFRlc3RUcmVlTm9kZVN0cmVhbQorCisqIFtCUkVBS1MgQU5ZIFRSRUUgSU1QTEVNRU5UQVRJT05dCisgIG1hZGUgQ29tbW9uVHJlZU5vZGVTdHJlYW0gd29yayB3aXRoIGFueSB0cmVlIG5vZGUgdHlwZS4gIFRyZWVBZGFwdG9yCisgIG5vdyBpbXBsZW1lbnRzIGlzTmlsIHNvIG11c3QgYWRkOyB0cml2aWFsLCBidXQgZG9lcyBicmVhayBiYWNrCisgIGNvbXBhdGliaWxpdHkuCisKK0RlY2VtYmVyIDE3LCAyMDA2CisKKyogQWRkZWQgdHJhY2VJbi9PdXQgbWV0aG9kcyB0byByZWNvZ25pemVycyBzbyB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdGhlbTsKKyAgcHJldmlvdXNseSB0aGV5IHdlcmUgaW4tbGluZSBwcmludCBzdGF0ZW1lbnRzLiBUaGUgbWVzc2FnZSBoYXMgYWxzbworICBiZWVuIHNsaWdodGx5IGltcHJvdmVkLgorCisqIEZhY3RvcmVkIEJ1aWxkUGFyc2VUcmVlIGludG8gZGVidWcgcGFja2FnZTsgY2xlYW5lZCBzdHVmZiB1cC4gRml4ZWQKKyAgdW5pdCB0ZXN0cy4KKworRGVjZW1iZXIgMTUsIDIwMDYKKworKiBbQlJFQUtTIEFOWSBUUkVFIElNUExFTUVOVEFUSU9OXQorICBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7IG5lZWRlZCB0byBhZGQgZ2V0L3NldCBmb3IgdG9rZW4gc3RhcnQvc3RvcAorICBpbmRleCBzbyBDb21tb25UcmVlQWRhcHRvciBjYW4gYXNzdW1lIFRyZWUgaW50ZXJmYWNlIG5vdCBDb21tb25UcmVlCisgIGltcGxlbWVudGF0aW9uLiAgT3RoZXJ3aXNlLCBubyB3YXkgdG8gY3JlYXRlIHlvdXIgb3duIG5vZGVzIHRoYXQgc2F0aXNmeQorICBUcmVlIGJlY2F1c2UgQ29tbW9uVHJlZUFkYXB0b3Igd2FzIGRvaW5nCisKKwlwdWJsaWMgaW50IGdldFRva2VuU3RhcnRJbmRleChPYmplY3QgdCkgeworCQlyZXR1cm4gKChDb21tb25UcmVlKXQpLnN0YXJ0SW5kZXg7CisJfQorCisgIEFkZGVkIHRvIFRyZWU6CisKKwkvKiogIFdoYXQgaXMgdGhlIHNtYWxsZXN0IHRva2VuIGluZGV4IChpbmRleGluZyBmcm9tIDApIGZvciB0aGlzIG5vZGUKKwkgKiAgIGFuZCBpdHMgY2hpbGRyZW4/CisJICovCisJaW50IGdldFRva2VuU3RhcnRJbmRleCgpOworCisJdm9pZCBzZXRUb2tlblN0YXJ0SW5kZXgoaW50IGluZGV4KTsKKworCS8qKiAgV2hhdCBpcyB0aGUgbGFyZ2VzdCB0b2tlbiBpbmRleCAoaW5kZXhpbmcgZnJvbSAwKSBmb3IgdGhpcyBub2RlCisJICogICBhbmQgaXRzIGNoaWxkcmVuPworCSAqLworCWludCBnZXRUb2tlblN0b3BJbmRleCgpOworCisJdm9pZCBzZXRUb2tlblN0b3BJbmRleChpbnQgaW5kZXgpOworCitEZWNlbWJlciAxMywgMjAwNgorCisqIEFkZGVkIG9yZy5hbnRsci5ydW50aW1lLnRyZWUuRE9UVHJlZUdlbmVyYXRvciBzbyB5b3UgY2FuIGdlbmVyYXRlIERPVAorICBkaWFncmFtcyBlYXNpbHkgZnJvbSB0cmVlcy4KKworCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJJbnB1dFN0cmVhbShTeXN0ZW0uaW4pOworCVRMZXhlciBsZXggPSBuZXcgVExleGVyKGlucHV0KTsKKwlDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTsKKwlUUGFyc2VyIHBhcnNlciA9IG5ldyBUUGFyc2VyKHRva2Vucyk7CisJVFBhcnNlci5lX3JldHVybiByID0gcGFyc2VyLmUoKTsKKwlUcmVlIHQgPSAoVHJlZSlyLnRyZWU7CisJU3lzdGVtLm91dC5wcmludGxuKHQudG9TdHJpbmdUcmVlKCkpOworCURPVFRyZWVHZW5lcmF0b3IgZ2VuID0gbmV3IERPVFRyZWVHZW5lcmF0b3IoKTsKKwlTdHJpbmdUZW1wbGF0ZSBzdCA9IGdlbi50b0RPVCh0KTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oc3QpOworCisqIENoYW5nZWQgdGhlIHdheSBtYXJrKCkvcmV3aW5kKCkgd29yayBpbiBDb21tb25UcmVlTm9kZSBzdHJlYW0gdG8gbWlycm9yCisgIG1vcmUgZmxleGlibGUgc29sdXRpb24gaW4gQU5UTFJTdHJpbmdTdHJlYW0uICBGb3Jnb3QgdG8gc2V0IGxhc3RNYXJrZXIKKyAgYW55d2F5LiAgTm93IHlvdSBjYW4gcmV3aW5kIHRvIG5vbi1tb3N0LXJlY2VudCBtYXJrZXIuCisKK0RlY2VtYmVyIDEyLCAyMDA2CisKKyogVGVtcCBsZXhlciBub3cgZW5kIGluIC5nbCAoVF9fLmdsLCBmb3IgZXhhbXBsZSkKKworKiBUcmVlUGFyc2VyIHN1ZmZpeCBubyBsb25nZXIgZ2VuZXJhdGVkIGZvciB0cmVlIGdyYW1tYXJzCisKKyogRGVmaW5lZCByZXNldCBmb3IgbGV4ZXIsIHBhcnNlciwgdHJlZSBwYXJzZXI7IHJld2luZHMgdGhlIGlucHV0IHN0cmVhbSBhbHNvCisKK0RlY2VtYmVyIDEwLCAyMDA2CisKKyogTWFkZSBHcmFtbWFyLmFib3J0TkZBVG9ERkFDb252ZXJzaW9uKCkgYWJvcnQgaW4gbWlkZGxlIG9mIGEgREZBLgorCitEZWNlbWJlciA5LCAyMDA2CisKKyogZml4ZWQgYnVnIGluIE9yZGVyZWRIYXNoU2V0LmFkZCgpLiAgSXQgZGlkbid0IHRyYWNrIGVsZW1lbnRzIGNvcnJlY3RseS4KKworRGVjZW1iZXIgNiwgMjAwNgorCisqIHVwZGF0ZWQgYnVpbGQueG1sIGZvciBmdXR1cmUgQW50IGNvbXBhdGliaWxpdHksIHRoYW5rcyB0byBNYXR0IEJlbnNvbi4KKworKiB2YXJpb3VzIHRlc3RzIGluIFRlc3RSZXdyaXRlVGVtcGxhdGUgYW5kIFRlc3RTeW50YWN0aWNQcmVkaWNhdGVFdmFsdWF0aW9uCisgIHdlcmUgdXNpbmcgdGhlIG9sZCAnY2hhbm5lbCcgdnMuIG5ldyAnJGNoYW5uZWwnIG5vdGF0aW9uLgorICBUZXN0SW50ZXJwcmV0ZWRQYXJzaW5nIGRpZG4ndCBwaWNrIHVwIGFuIGVhcmxpZXIgY2hhbmdlIHRvIENvbW1vblRva2VuLgorICBSZXBvcnRlZCBieSBNYXR0IEJlbnNvbi4KKworKiBmaXhlZCBwbGF0Zm9ybSBkZXBlbmRlbnQgdGVzdCBmYWlsdXJlcyBpbiBUZXN0VGVtcGxhdGVzLCBzdXBwbGllZCBieSBNYXR0CisgIEJlbnNvbi4KKworTm92ZW1iZXIgMjksIDIwMDYKKworKiAgb3B0aW1pemVkIHNlbWFudGljIHByZWRpY2F0ZSBldmFsdWF0aW9uIHNvIHRoYXQgcHx8IXAgeWllbGRzIHRydWUuCisKK05vdmVtYmVyIDIyLCAyMDA2CisKKyogZml4ZWQgYnVnIHRoYXQgcHJldmVudGVkIHZhciA9ICRydWxlLnNvbWVfcmV0dmFsIGZyb20gd29ya2luZyBpbiBhbnl0aGluZworICBidXQgdGhlIGZpcnN0IGFsdGVybmF0aXZlIG9mIGEgcnVsZSBvciBzdWJydWxlLgorCisqIGF0dHJpYnV0ZSBuYW1lcyBjb250YWluaW5nIGRpZ2l0cyB3ZXJlIG5vdCBhbGxvd2VkLCB0aGlzIGlzIG5vdyBmaXhlZCwKKyAgYWxsb3dpbmcgYXR0cmlidXRlcyBsaWtlICduYW1lMScgYnV0IG5vdCAnMW5hbWUxJy4KKworTm92ZW1iZXIgMTksIDIwMDYKKworKiBSZW1vdmVkIExlZnRSZWN1cnNpb25NZXNzYWdlIGFuZCBhcHBhcmF0dXMgYmVjYXVzZSBpdCBzZWVtcyB0aGF0IEkgY2hlY2sKKyAgZm9yIGxlZnQgcmVjdXJzaW9uIHVwZnJvbnQgYmVmb3JlIGFuYWx5c2lzIGFuZCBldmVyeXRoaW5nIGdldHMgc3BlY2lmaWVkIGFzCisgIHJlY3Vyc2lvbiBjeWNsZXMgYXQgdGhpcyBwb2ludC4KKworTm92ZW1iZXIgMTYsIDIwMDYKKworKiBUb2tlblJld3JpdGVTdHJlYW0ucmVwbGFjZSB3YXMgbm90IHBhc3NpbmcgcHJvZ3JhbU5hbWUgdG8gbmV4dCBtZXRob2QuCisKK05vdmVtYmVyIDE1LCAyMDA2CisKKyogdXBkYXRlZCBET1QgZmlsZXMgZm9yIERGQSBnZW5lcmF0aW9uIHRvIG1ha2Ugc21hbGxlciBjaXJjbGVzLgorCisqIG1hZGUgZXBzaWxvbiBlZGdlcyBpdGFsaWNzIGluIHRoZSBORkEgZGlhZ3JhbXMuCisKKzMuMGI1IC0gTm92ZW1iZXIgMTUsIDIwMDYKKworVGhlIGJpZ2dlc3QgdGhpbmcgaXMgdGhhdCB5b3VyIGdyYW1tYXIgZmlsZSBuYW1lcyBtdXN0IG1hdGNoIHRoZSBncmFtbWFyIG5hbWUKK2luc2lkZSAoeW91ciBnZW5lcmF0ZWQgY2xhc3MgbmFtZXMgd2lsbCBhbHNvIGJlIGRpZmZlcmVudCkgYW5kIHdlIHVzZQorJGNoYW5uZWw9SElEREVOIG5vdyBpbnN0ZWFkIG9mIGNoYW5uZWw9OTkgaW5zaWRlIGxleGVyIGFjdGlvbnMuCitTaG91bGQgYmUgY29tcGF0aWJsZSBvdGhlciB0aGFuIHRoYXQuICAgUGxlYXNlIGxvb2sgYXQgY29tcGxldGUgbGlzdCBvZgorY2hhbmdlcy4KKworTm92ZW1iZXIgMTQsIDIwMDYKKworKiBGb3JjZSB0b2tlbiBpbmRleCB0byBiZSAtMSBmb3IgQ29tbW9uSW5kZXggaW4gY2FzZSBub3Qgc2V0LgorCitOb3ZlbWJlciAxMSwgMjAwNgorCisqIGdldFVuaXF1ZUlEIGZvciBUcmVlQWRhcHRvciBub3cgdXNlcyBpZGVudGl0eUhhc2hDb2RlIGluc3RlYWQgb2YgaGFzaENvZGUuCisKK05vdmVtYmVyIDEwLCAyMDA2CisKKyogTm8gZ3JhbW1hciBub25kZXRlcm1pbmlzbSB3YXJuaW5nIG5vdyB3aGVuIHdpbGRjYXJkICcuJyBpcyBmaW5hbCBhbHQuCisgIEV4YW1wbGVzOgorCisJYSA6IEEgfCBCIHwgLiA7CisKKwlBIDogJ2EnCisJICB8IC4KKwkgIDsKKworCVNMX0NPTU1FTlQKKwkgICAgOiAnLy8nIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4pKiAnXHInPyAnXG4nCisJICAgIDsKKworCVNMX0NPTU1FTlQyCisJICAgIDogJy8vJyAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAneCd8LikqICdccic/ICdcbicKKwkgICAgOworCisKK05vdmVtYmVyIDgsIDIwMDYKKworKiBTeW50YWN0aWMgcHJlZGljYXRlcyBkaWQgbm90IGdldCBob2lzdGluZyBwcm9wZXJseSB1cG9uIG5vbi1MTCgqKSBkZWNpc2lvbi4gIE90aGVyIGhvaXN0aW5nIGlzc3VlcyBmaXhlZC4gIENsZWFuZWQgdXAgY29kZS4KKworKiBSZW1vdmVkIGZhaWxzYWZlIHRoYXQgY2hlY2sgdG8gc2VlIGlmIEknbSBzcGVuZGluZyB0b28gbXVjaCB0aW1lIG9uIGEgc2luZ2xlIERGQTsgSSBkb24ndCB0aGluayB3ZSBuZWVkIGl0IGFueW1vcmUuCisKK05vdmVtYmVyIDMsIDIwMDYKKworKiAkdGV4dCwgJGxpbmUsIGV0Yy4uLiB3ZXJlIG5vdCB3b3JraW5nIGluIGFzc2lnbm1lbnRzLiBGaXhlZCBhbmQgYWRkZWQKKyAgdGVzdCBjYXNlLgorCisqICRsYWJlbC50ZXh0IHRyYW5zbGF0ZWQgdG8gbGFiZWwuZ2V0VGV4dCBpbiBsZXhlciBldmVuIGlmIGxhYmVsIHdhcyBvbiBhIGNoYXIKKworTm92ZW1iZXIgMiwgMjAwNgorCisqIEFkZGVkIGVycm9yIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHdoYXQgdGhlIEFTVCB0eXBlIGlzOyBhY3Rpb25zIGluIHRyZWUKKyAgZ3JhbW1hciB3b24ndCB3b3JrIHdpdGhvdXQgaXQuCisKKyAgJCBjYXQgeC5nCisgIHRyZWUgZ3JhbW1hciB4OworICBhIDogSUQge1N0cmluZyBzID0gJElELnRleHQ7fSA7CisKKyAgQU5UTFIgUGFyc2VyIEdlbmVyYXRvciAgIEVhcmx5IEFjY2VzcyBWZXJzaW9uIDMuMGI1ICg/PywgMjAwNikgIDE5ODktMjAwNgorICBlcnJvcjogeC5nOjA6MDogKDE1MikgdHJlZSBncmFtbWFyIHggaGFzIG5vIEFTVExhYmVsVHlwZSBvcHRpb24KKworTm92ZW1iZXIgMSwgMjAwNgorCisqICR0ZXh0LCAkbGluZSwgZXRjLi4uIHdlcmUgbm90IHdvcmtpbmcgcHJvcGVybHkgd2l0aGluIGxleGVyIHJ1bGUuCisKK09jdG9iZXIgMzIsIDIwMDYKKworKiBGaW5hbGx5IGFjdGlvbnMgbm93IGV4ZWN1dGUgYmVmb3JlIGR5bmFtaWMgc2NvcGVzIGFyZSBwb3BwZWQgaXQgaW4gdGhlCisgIHJ1bGUuIFByZXZpb3VzbHkgd2FzIG5vdCBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIHJ1bGVzIHNjb3BlZCB2YXJpYWJsZXMKKyAgaW4gYSBmaW5hbGx5IGFjdGlvbi4KKworT2N0b2JlciAyOSwgMjAwNgorCisqIEFsdGVyZWQgQWN0aW9uVHJhbnNsYXRvciB0byBlbWl0IGVycm9ycyBvbiBzZXR0aW5nIHJlYWQtb25seSBhdHRyaWJ1dGVzCisgIHN1Y2ggYXMgJHN0YXJ0LCAkc3RvcCwgJHRleHQgaW4gYSBydWxlLiBBbHNvIGZvcmJpZCBzZXR0aW5nIGFueSBhdHRyaWJ1dGVzCisgIGluIHJ1bGVzL3Rva2VucyByZWZlcmVuY2VkIGJ5IGEgbGFiZWwgb3IgbmFtZS4KKyAgU2V0dGluZyBkeW5hbWljIHNjb3BlcydzIGF0dHJpYnV0ZXMgYW5kIHlvdXIgb3duIHBhcmFtZXRlciBhdHRyaWJ1dGVzCisgIGlzIGxlZ2FsLgorCitPY3RvYmVyIDI3LCAyMDA2CisKKyogQWx0ZXJlZCBob3cgQU5UTFIgZmlndXJlcyBvdXQgd2hhdCBkZWNpc2lvbiBpcyBhc3NvY2lhdGVkIHdpdGggd2hpY2gKKyAgYmxvY2sgb2YgZ3JhbW1hci4gIE1ha2VzIEFOVExSV29ya3MgY29ycmVjdGx5IGZpbmQgREZBIGZvciBhIGJsb2NrLgorCitPY3RvYmVyIDI2LCAyMDA2CisKKyogRml4ZWQgYnVnIHdoZXJlIEVPVCB0cmFuc2l0aW9ucyBsZWQgdG8gbm8gTkZBIGNvbmZpZ3MgaW4gYSBERkEgc3RhdGUsCisgIHlpZWxkaW5nIGFuIGVycm9yIGluIERGQSB0YWJsZSBnZW5lcmF0aW9uLgorCisqIHJlbmFtZWQgYWN0aW9uLmcgdG8gQWN0aW9uVHJhbnNsYXRvci5nCisgIHRoZSBBY3Rpb25UcmFuc2xhdG9yIGNsYXNzIGlzIG5vdyBjYWxsZWQgQWN0aW9uVHJhbnNsYXRvckxleGVyLCBhcyBBTlRMUgorICBnZW5lcmF0ZXMgdGhpcyBjbGFzc25hbWUgbm93LiBGaXhlZCByZXN0IG9mIGNvZGViYXNlIGFjY29yZGluZ2x5LgorCisqIGFkZGVkIHJ1bGVzIHJlY29nbml6aW5nIHNldHRpbmcgb2Ygc2NvcGVzJyBhdHRyaWJ1dGVzIHRvIEFjdGlvblRyYW5zbGF0b3IuZworICB0aGUgT2JqZWN0aXZlIEMgdGFyZ2V0IG5lZWRlZCBhY2Nlc3MgdG8gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudAorICBpbiBvcmRlciB0byBnZW5lcmF0ZSBjb3JyZWN0IGNvZGUKKworKiBjaGFuZ2VkIEFOVExSQ29yZS5zdGkgdG8gcmVmbGVjdCB0aGUgbmV3IG1hbmRhdG9yeSB0ZW1wbGF0ZXMgdG8gc3VwcG9ydCB0aGUgYWJvdmUKKyAgbmFtZWx5OiBzY29wZVNldEF0dHJpYnV0ZVJlZiwgcmV0dXJuU2V0QXR0cmlidXRlUmVmIGFuZCB0aGUgcnVsZVNldFByb3BlcnR5UmVmXyoKKyAgdGVtcGxhdGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgcnVsZVNldFByb3BlcnR5UmVmX3RleHQuIHdlIGNhbm5vdCBzZXQgdGhpcyBhdHRyaWJ1dGUKKworT2N0b2JlciAxOSwgMjAwNgorCisqIEZpeGVkIDIgYnVncyBpbiBERkEgY29udmVyc2lvbiB0aGF0IGNhdXNlZCBleGNlcHRpb25zLgorICBhbHRlcmVkIGZ1bmN0aW9uYWxpdHkgb2YgZ2V0TWluRWxlbWVudCBzbyBpdCBpZ25vcmVzIGVsZW1lbnRzPDAuCisKK09jdG9iZXIgMTgsIDIwMDYKKworKiBtb3ZlZCByZXNldFN0YXRlTnVtYmVyc1RvQmVDb250aWd1b3VzKCkgdG8gYWZ0ZXIgaXNzdWluZyBvZiB3YXJuaW5nczsKKyAgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhhdCByb3V0aW5lIHNob3VsZCBtYWtlIG1vcmUgc2Vuc2UgYXMgaXNzdWVzCisgIHdpdGggZGVjaXNpb24gd2lsbCBhcHBlYXIgZmlyc3QuCisKKyogZml4ZWQgY3V0L3Bhc3RlIGJ1ZyBJIGludHJvZHVjZWQgd2hlbiBmaXhlZCBFT0YgaW4gbWluL21heAorICBidWcuIFByZXZlbnRlZCBDIGdyYW1tYXIgZnJvbSB3b3JraW5nIGJyaWVmbHkuCisKK09jdG9iZXIgMTcsIDIwMDYKKworKiBSZW1vdmVkIGEgZmFpbHNhZmUgdGhhdCBzZWVtcyB0byBiZSB1bm5lY2Vzc2FyeSB0aGF0IGVuc3VyZSBERkEgZGlkbid0CisgIGdldCB0b28gYmlnLiAgSXQgd2FzIHJlc3VsdGluZyBpbiBzb21lIGZhaWx1cmVzIGluIGNvZGUgZ2VuZXJhdGlvbiB0aGF0CisgIGxlZCBtZSBvbiBxdWl0ZSBhIHN0cmFuZ2UgZGVidWdnaW5nIHRyaXAuCisKK09jdG9iZXIgMTYsIDIwMDYKKworKiBVc2UgY2hhbm5lbD1ISURERU4gbm90IGNoYW5uZWw9OTkgdG8gcHV0IHRva2VucyBvbiBoaWRkZW4gY2hhbm5lbC4KKworT2N0b2JlciAxMiwgMjAwNgorCisqIEFOVExSIG5vdyBoYXMgYSBjdXN0b21pemFibGUgbWVzc2FnZSBmb3JtYXQgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MsCisgIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGZ1bGZpbGwgcmVxdWlyZW1lbnRzIGJ5IElERXMgYW5kIHN1Y2guCisgIFRoZSBmb3JtYXQgdG8gYmUgdXNlZCBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgJy1tZXNzYWdlLWZvcm1hdCBuYW1lJworICBjb21tYW5kIGxpbmUgc3dpdGNoLiBUaGUgZGVmYXVsdCBmb3IgbmFtZSBpcyAnYW50bHInLCBhbHNvIGF2YWlsYWJsZQorICBhdCB0aGUgbW9tZW50IGlzICdnbnUnLiBUaGlzIGlzIGRvbmUgdmlhIFN0cmluZ1RlbXBsYXRlLCBmb3IgZGV0YWlscworICBvbiB0aGUgcmVxdWlyZW1lbnRzIGxvb2sgaW4gb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL21lc3NhZ2VzL2Zvcm1hdHMvCisKKyogbGluZSBudW1iZXJzIGZvciBsZXhlcnMgaW4gY29tYmluZWQgZ3JhbW1hcnMgYXJlIG5vdyByZXBvcnRlZCBjb3JyZWN0bHkuCisKK1NlcHRlbWJlciAyOSwgMjAwNgorCisqIEFOVExSUmVhZGVyU3RyZWFtIGltcHJvcGVybHkgY2hlY2tlZCBmb3IgZW5kIG9mIGlucHV0LgorCitTZXB0ZW1iZXIgMjgsIDIwMDYKKworKiBGb3IgQU5UTFJTdHJpbmdTdHJlYW0sIExBKC0xKSB3YXMgb2ZmIGJ5IG9uZS4uLmdhdmUgeW91IExBKC0yKS4KKworMy4wYjQgLSBBdWd1c3QgMjQsIDIwMDYKKworKiBlcnJvciB3aGVuIG5vIHJ1bGVzIGluIGdyYW1tYXIuICBkb2Vzbid0IGNyYXNoIG5vdy4KKworKiBUb2tlbiBpcyBub3cgYW4gaW50ZXJmYWNlLgorCisqIHJlbW92ZSBkZXBlbmRlbmNlIG9uIG5vbiBydW50aW1lIGNsYXNzZXMgaW4gcnVudGltZSBwYWNrYWdlLgorCisqIGZpbGVuYW1lIGFuZCBncmFtbWFyIG5hbWUgbXVzdCBiZSBzYW1lIEZvbyBpbiBGb28uZy4gIEdlbmVyYXRlcyBGb29QYXJzZXIsCisgIEZvb0xleGVyLCAuLi4gIENvbWJpbmVkIGdyYW1tYXIgRm9vIGdlbmVyYXRlcyBGb28kTGV4ZXIuZyB3aGljaCBnZW5lcmF0ZXMKKyAgRm9vTGV4ZXIuamF2YS4gIHRyZWUgZ3JhbW1hcnMgZ2VuZXJhdGUgRm9vVHJlZVBhcnNlci5qYXZhCisKK0F1Z3VzdCAyNCwgMjAwNgorCisqIGFkZGVkIEMjIHRhcmdldCB0byBsaWIsIGNvZGVnZW4sIHRlbXBsYXRlcworCitBdWd1c3QgMTEsIDIwMDYKKworKiBhZGRlZCB0cmVlIGFyZyB0byBuYXZpZ2F0aW9uIG1ldGhvZHMgaW4gdHJlZWFkYXB0b3IKKworQXVndXN0IDA3LCAyMDA2CisKKyogZml4ZWQgYnVnIHJlbGF0ZWQgdG8gKGF8KSsgb24gZW5kIG9mIGxleGVyIHJ1bGVzLiAgY3Jhc2hlZCBpbnN0ZWFkCisgIG9mIHdhcm5pbmcuCisKKyogYWRkZWQgd2FybmluZyB0aGF0IGludGVycHJldGVyIGRvZXNuJ3QgZG8gc3lucHJlZHMgeWV0CisKKyogYWxsb3cgZGlmZmVyZW50IHNvdXJjZSBvZiBjbGFzc2xvYWRlcjoKK0NsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKK2lmICggY2w9PW51bGwgKSB7CisgICAgY2wgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKK30KKworCitKdWx5IDI2LCAyMDA2CisKKyogY29tcHJlc3NlZCBERkEgZWRnZSB0YWJsZXMgc2lnbmlmaWNhbnRseS4gIEFsbCBlZGdlIHRhYmxlcyBhcmUKKyAgdW5pcXVlLiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBjYW4gcmV1c2UgYXJyYXlzLiAgTG9vayBsaWtlIHRoaXMgbm93OgorCisgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREZBMzBfdHJhbnNpdGlvbjAgPQorICAgICAJbmV3IHNob3J0W10geyA0NiwgNDYsIC0xLCA0NiwgNDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLC4uLn07CisgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERGQTMwX3RyYW5zaXRpb24xID0KKyAgICAgCW5ldyBzaG9ydFtdIHsgMjEgfTsKKyAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXVtdIERGQTMwX3RyYW5zaXRpb24gPSB7CisgICAgIAkgIERGQTMwX3RyYW5zaXRpb24wLAorICAgICAJICBERkEzMF90cmFuc2l0aW9uMCwKKyAgICAgCSAgREZBMzBfdHJhbnNpdGlvbjEsCisgICAgIAkgIC4uLgorICAgICAgfTsKKworKiBJZiB5b3UgZGVmaW5lZCBib3RoIGEgbGFiZWwgbGlrZSBFUSBhbmQgJz0nLCBzb21ldGltZXMgdGhlICc9JyB3YXMKKyAgdXNlZCBpbnN0ZWFkIG9mIHRoZSBFUSBsYWJlbC4KKworKiBtYWRlIGhlYWRlckZpbGUgdGVtcGxhdGUgaGF2ZSBzYW1lIGFyZyBsaXN0IGFzIG91dHB1dEZpbGUgZm9yIGNvbnNpc3RlbmN5CisKKyogb3V0cHV0RmlsZSwgbGV4ZXIsIGdlbmVyaWNQYXJzZXIsIHBhcnNlciwgdHJlZVBhcnNlciB0ZW1wbGF0ZXMKKyAgcmVmZXJlbmNlIGN5Y2xpY0RGQXMgYXR0cmlidXRlIHdoaWNoIHdhcyBubyBsb25nZXIgdXNlZCBhZnRlciBJCisgIHN0YXJ0ZWQgdGhlIG5ldyB0YWJsZS1iYXNlZCBERkEuICBJIG1hZGUgY3ljbGljREZBRGVzY3JpcHRvcnMKKyAgYXJndW1lbnQgdG8gb3V0cHV0RmlsZSBhbmQgaGVhZGVyRmlsZSAob25seSkuICBJIHRoaW5rIHRoaXMgaXMKKyAgY29ycmVjdCBhcyBvbmx5IE9PIGxhbmd1YWdlcyB3aWxsIHdhbnQgdGhlIERGQSBpbiB0aGUgcmVjb2duaXplci4KKyAgQXQgdGhlIHRvcCBsZXZlbCwgQyBhbmQgZnJpZW5kcyBjYW4gdXNlIGl0LiAgQ2hhbmdlZCBuYW1lIHRvIHVzZQorICBjeWNsaWNERkFzIGFnYWluIGFzIGl0J3MgYSBiZXR0ZXIgbmFtZSBwcm9iYWJseS4gIFJlbW92ZWQgcGFyYW1ldGVyCisgIGZyb20gdGhlIGxleGVyLCAuLi4gIEZvciBleGFtcGxlLCBteSBwYXJzZXIgdGVtcGxhdGUgc2F5cyB0aGlzIG5vdzoKKworICAgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCisqIG1hZGUgYWxsIHRva2VuIHJlZiB0b2tlbiB0eXBlcyBnbyB0aHJ1IGNvZGUgZ2VuJ3MKKyAgZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbCgpCisKKyogbm8gbW9yZSBjb21wdXRpbmcgREZBIHRyYW5zaXRpb24gdGFibGVzIGZvciBhY3ljbGljIERGQS4KKworSnVseSAyNSwgMjAwNgorCisqIGZpeGVkIGEgcGxhY2Ugd2hlcmUgSSB3YXMgYWRkaW5nIHN5biBwcmVkaWNhdGVzIGludG8gcmV3cml0ZSBzdHVmZi4KKworKiB0dXJuZWQgb2ZmIGludmFsaWQgdG9rZW4gaW5kZXggd2FybmluZyBpbiBBVyBzdXBwb3J0OyBoYWQgYSBwcm9ibGVtLgorCisqIGJhZCBsb2NhdGlvbiBldmVudCBnZW5lcmF0ZWQgd2l0aCAtZGVidWcgZm9yIHN5bnByZWRzIGluIGF1dG9iYWNrdHJhY2sgbW9kZS4KKworSnVseSAyNCwgMjAwNgorCisqIGNoYW5nZWQgcnVudGltZS5ERkEgc28gdGhhdCBpdCB0cmVhdHMgYWxsIGNoYXJzIGFuZCB0b2tlbiB0eXBlcyBhcworICBjaGFyICh1bnNpZ25lZCAxNiBiaXQgaW50KS4gIC0xIGJlY29tZXMgJ1x1RkZGRicgdGhlbiBvciA2NTUzNS4KKworKiBjaGFuZ2VkIE1BWF9TVEFURV9UUkFOU0lUSU9OU19GT1JfVEFCTEUgdG8gYmUgNjU1MzQgYnkgZGVmYXVsdAorICBub3cuIFRoaXMgbWVhbnMgdGhhdCBhbGwgc3RhdGVzIGNhbiB1c2UgYSB0YWJsZSB0byBkbyB0cmFuc2l0aW9ucy4KKworKiB3YXMgbm90IG1ha2luZyBzeW5wcmVkcyBvbiAoQykqIHR5cGUgbG9vcHMgd2l0aCBiYWNrdHJhY2s9dHJ1ZQorCisqIHdhcyBjb3B5aW5nIHRyZWUgc3R1ZmYgYW5kIGFjdGlvbnMgaW50byBzeW5wcmVkcyB3aXRoIGJhY2t0cmFjaz10cnVlCisKKyogd2FzIG1ha2luZyBzeW5wcmVkcyBvbiBldmVuIHNpbmdsZSBhbHQgcnVsZXMgLyBibG9ja3Mgd2l0aCBiYWNrdHJhY2s9dHJ1ZQorCiszLjBiMyAtIEp1bHkgMjEsIDIwMDYKKworKiBBTlRMUiBmYWlscyB0byBhbmFseXplIGNvbXBsZXggZGVjaXNpb25zIG11Y2ggbGVzcyBmcmVxdWVudGx5LiAgSXQKKyAgdHVybnMgb3V0IHRoYXQgdGhlIHNldCBvZiBkZWNpc2lvbnMgZm9yIHdoaWNoIEFOVExSIGZhaWxzICh0aW1lcworICBvdXQpIGlzIHRoZSBzYW1lIHNldCAoc28gZmFyKSBvZiBub24tTEwoKikgZGVjaXNpb25zLiAgTW9yZXZlciwgSSdtCisgIGFibGUgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uIHF1aWNrbHkgYW5kIHJlcG9ydCByYXRoZXIgdGhhbiB0aW1pbmcKKyAgb3V0LiBFcnJvcnMgbG9vayBsaWtlOgorCisgIGphdmEuZzo0Njg6MjM6IFtmYXRhbF0gcnVsZSBjb25jcmV0ZURpbWVuc2lvbnMgaGFzIG5vbi1MTCgqKQorICAgIGRlY2lzaW9uIGR1ZSB0byByZWN1cnNpdmUgcnVsZSBpbnZvY2F0aW9ucyBpbiBhbHRzIDEsMi4gIFJlc29sdmUKKyAgICBieSBsZWZ0LWZhY3RvcmluZyBvciB1c2luZyBzeW50YWN0aWMgcHJlZGljYXRlcyB3aXRoIGZpeGVkIGsKKyAgICBsb29rYWhlYWQgb3IgdXNlIGJhY2t0cmFjaz10cnVlIG9wdGlvbi4KKworICBUaGlzIG1lc3NhZ2Ugb25seSBhcHBlYXJzIHdoZW4gaz0qLgorCisqIFNob3J0ZW5lZCBubyB2aWFibGUgYWx0IG1lc3NhZ2VzIHRvIG5vdCBpbmNsdWRlIGRlY2lzaW9uCisgIGRlc2NyaXB0aW9uOgorCitbY29tcGlsYXRpb25Vbml0LCBkZWNsYXJhdGlvbl06IGxpbmUgODo4IGRlY2lzaW9uPTw8Njc6MTogZGVjbGFyYXRpb24KKzogKCAoIGZpZWxkRGVjbGFyYXRpb24gKT0+IGZpZWxkRGVjbGFyYXRpb24gfCAoIG1ldGhvZERlY2xhcmF0aW9uICk9PgorbWV0aG9kRGVjbGFyYXRpb24gfCAoIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24gKT0+Citjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgKCBjbGFzc0RlY2xhcmF0aW9uICk9PiBjbGFzc0RlY2xhcmF0aW9uIHwgKAoraW50ZXJmYWNlRGVjbGFyYXRpb24gKT0+IGludGVyZmFjZURlY2xhcmF0aW9uIHwgKCBibG9ja0RlY2xhcmF0aW9uICk9PgorYmxvY2tEZWNsYXJhdGlvbiB8IGVtcHR5RGVjbGFyYXRpb24gKTs+PiBzdGF0ZSAzIChkZWNpc2lvbj0xNCkgbm8KK3ZpYWJsZSBhbHQ7IHRva2VuPVtAMSwxODQ6MTg3PSdqYXZhJyw8MTIyPiw4OjhdCisKKyAgdG9vIGxvbmcgYW5kIGhhcmQgdG8gcmVhZC4KKworSnVseSAxOSwgMjAwNgorCisqIENvZGUgZ2VuIGJ1Zzogc3RhdGVzIHdpdGggbm8gZW1hbmF0aW5nIGVkZ2VzIHdlcmUgaWdub3JlZCBieSBTVC4KKyAgTm93IGFuIGVtcHR5IGxpc3QgaXMgdXNlZC4KKworKiBBZGRlZCBncmFtbWFyIHBhcmFtZXRlciB0byByZWNvZ25pemVyIHRlbXBsYXRlcyBzbyB0aGV5IGNhbiBhY2Nlc3MKKyAgcHJvcGVydGllcyBsaWtlIGdldE5hbWUoKSwgLi4uCisKK0p1bHkgMTAsIDIwMDYKKworKiBGaXhlZCB0aGUgZ2F0ZWQgcHJlZCBtZXJnZWQgc3RhdGUgYnVnLiAgQWRkZWQgdW5pdCB0ZXN0LgorCisqIGFkZGVkIG5ldyBtZXRob2QgdG8gVGFyZ2V0OiBnZXRUb2tlblR5cGVBc1RhcmdldExhYmVsKCkKKworSnVseSA3LCAyMDA2CisKKyogSSB3YXMgZG9pbmcgYW4gQU5EIGluc3RlYWQgb2YgT1IgaW4gdGhlIGdhdGVkIHByZWRpY2F0ZSBzdHVmZi4KKyAgVGhhbmtzIHRvIFN0ZXBoZW4gS291IQorCisqIFJlZHVjZSBvcCBmb3IgY29tYmluaW5nIHByZWRpY2F0ZXMgd2FzIGluc2FuZWx5IHNsb3cgc29tZXRpbWVzIGFuZAorICBkaWRuJ3QgYWN0dWFsbHkgd29yayB3ZWxsLiAgTm93IGl0J3MgZmFzdCBhbmQgd29ya3MuCisKKyogVGhlcmUgaXMgYSBidWcgaW4gbWVyZ2luZyBvZiBERkEgc3RvcCBzdGF0ZXMgcmVsYXRlZCB0byBnYXRlZAorICBwcmVkcy4uLnR1cm5lZCBpdCBvZmYgZm9yIG5vdy4KKworMy4wYjIgLSBKdWx5IDUsIDIwMDYKKworSnVseSA1LCAyMDA2CisKKyogdG9rZW4gZW1pc3Npb24gbm90IHByb3Blcmx5IHByb3RlY3RlZCBpbiBsZXhlciBmaWx0ZXIgbW9kZS4KKworKiBFT1QsIEVPVCBERkEgc3RhdGUgdHJhbnNpdGlvbiB0YWJsZXMgc2hvdWxkIGJlIGluaXQnZCB0byAtMSAob25seQorICB3YXMgZG9pbmcgdGhpcyBmb3IgY29tcHJlc3NlZCB0YWJsZXMpLiAgRml4ZWQuCisKKyogaW4gdHJhY2UgbW9kZSwgZXhpdCBtZXRob2Qgbm90IHNob3duIGZvciBtZW1vaXplZCBydWxlcworCisqIGFkZGVkIC1YbWF4ZGZhZWRnZXMgdG8gYWxsb3cgeW91IHRvIGluY3JlYXNlIG51bWJlciBvZiBlZGdlcyBhbGxvd2VkCisgIGZvciBhIHNpbmdsZSBERkEgc3RhdGUgYmVmb3JlIGl0IGJlY29tZXMgInNwZWNpYWwiIGFuZCBjYW4ndCBmaXQgaW4KKyAgYSBzaW1wbGUgdGFibGUuCisKKyogQnVnIGluIHRhYmxlcy4gIFNob3J0IGFyZSBzaWduZWQgc28gbWluL21heCB0YWJsZXMgZm9yIERGQSBhcmUgbm93CisgIGNoYXJbXS4gIEJpemFycmUuCisKK0p1bHkgMywgMjAwNgorCisqIEFkZGVkIGEgbWV0aG9kIHRvIHJlc2V0IHRoZSB0b29sIGVycm9yIHN0YXRlIGZvciBjdXJyZW50IHRocmVhZC4KKyAgU2VlIEVycm9yTWFuYWdlci5qYXZhCisKKyogW0dvdCB0aGlzIHdvcmtpbmcgcHJvcGVybHkgdG9kYXldIGJhY2t0cmFjayBtb2RlIHRoYXQgbGV0J3MgeW91IHR5cGUKKyAgaW4gYW55IG9sZCBjcmFwIGFuZCBBTlRMUiB3aWxsIGJhY2t0cmFjayBpZiBpdCBjYW4ndCBmaWd1cmUgb3V0IHdoYXQKKyAgeW91IG1lYW50LiAgTm8gZXJyb3JzIGFyZSByZXBvcnRlZCBieSBhbnRsciBkdXJpbmcgYW5hbHlzaXMuICBJdAorICBpbXBsaWNpdGx5IGFkZHMgYSBzeW4gcHJlZCBpbiBmcm9udCBvZiBldmVyeSBwcm9kdWN0aW9uLCB1c2luZyB0aGVtCisgIG9ubHkgaWYgc3RhdGljIGdyYW1tYXIgTEwoKikgYW5hbHlzaXMgZmFpbHMuICBTeW4gcHJlZCBjb2RlIGlzIG5vdAorICBnZW5lcmF0ZWQgaWYgdGhlIHByZWQgaXMgbm90IHVzZWQgaW4gYSBkZWNpc2lvbi4KKworICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgcmFwaWQgcHJvdG90eXBpbmcgbW9kZS4KKworKiBBZGRlZCBiYWNrdHJhY2tpbmcgcmVwb3J0IHRvIHRoZSAtcmVwb3J0IG9wdGlvbgorCisqIEFkZGVkIE5GQS0+REZBIGNvbnZlcnNpb24gZWFybHkgdGVybWluYXRpb24gcmVwb3J0IHRvIHRoZSAtcmVwb3J0IG9wdGlvbgorCisqIEFkZGVkIGdyYW1tYXIgbGV2ZWwgayBhbmQgYmFja3RyYWNrIG9wdGlvbnMgdG8gLXJlcG9ydAorCisqIEFkZGVkIGEgZG96ZW4gdW5pdCB0ZXN0cyB0byB0ZXN0IGF1dG9iYWNrdHJhY2sgTkZBIGNvbnN0cnVjdGlvbi4KKworKiBJZiB5b3UgYXJlIHVzaW5nIGZpbHRlciBtb2RlLCB5b3UgbXVzdCBtYW51YWxseSB1c2Ugb3B0aW9uCisgIG1lbW9pemU9dHJ1ZSBub3cuCisKK0p1bHkgMiwgMjAwNgorCisqIEFkZGVkIGs9KiBvcHRpb24gc28geW91IGNhbiBzZXQgaz0yLCBmb3IgZXhhbXBsZSwgb24gd2hvbGUgZ3JhbW1hciwKKyAgYnV0IGFuIGluZGl2aWR1YWwgZGVjaXNpb24gY2FuIGJlIExMKCopLgorCisqIG1lbW9pemUgb3B0aW9uIGZvciBncmFtbWFycywgcnVsZXMsIGJsb2Nrcy4gIFJlbW92ZSAtbm9tZW1vIGNtZC1saW5lIG9wdGlvbgorCisqIGJ1dCBpbiBET1QgZ2VuZXJhdG9yIGZvciBERkE7IGZpeGVkLgorCisqIHJ1bnRpbWUuREZBIHJlcG9ydGVkIGVycm9ycyBldmVuIHdoZW4gYmFja3RyYWNraW5nCisKK0p1bHkgMSwgMjAwNgorCisqIEFkZGVkIC1YIG9wdGlvbiBsaXN0IHRvIGhlbHAKKworKiBTeW4gcHJlZHMgd2VyZSBiZWluZyBob2lzdGVkIGludG8gb3RoZXIgcnVsZXMsIGNhdXNpbmcgbG90cyBvZiBleHRyYQorICBiYWNrdHJhY2tpbmcuCisKK0p1bmUgMjksIDIwMDYKKworKiB1bm5lY2Vzc2FyeSBmaWxlcyByZW1vdmVkIGR1cmluZyBidWlsZC4KKworKiBNYXR0IEJlbnNvbiB1cGRhdGVkIGJ1aWxkLnhtbAorCisqIERldGVjdGluZyB1c2Ugb2Ygc3lucHJlZHMgaW4gYW5hbHlzaXMgbm93IGluc3RlYWQgb2YgY29kZWdlbi4gIEluCisgIHRoaXMgd2F5LCBJIGNhbiBhdm9pZCBhbmFseXppbmcgZGVjaXNpb25zIGluIHN5bnByZWRzIGZvciBzeW5wcmVkcworICBub3QgdXNlZCBpbiBhIERGQSBmb3IgYSByZWFsIHJ1bGUuICBUaGlzIGlzIHVzZWQgdG8gb3B0aW1pemUgdGhpbmdzCisgIGZvciBiYWNrdHJhY2sgb3B0aW9uLgorCisqIENvZGUgZ2VuIG11c3QgYWRkIF9mcmFnbWVudCBvciB3aGF0ZXZlciB0byBlbmQgb2YgcHJlZCBuYW1lIGluCisgIHRlbXBsYXRlIHN5bnByZWRSdWxlIHRvIGF2b2lkIGhhdmluZyBBTlRMUiBrbm93IGFueXRoaW5nIGFib3V0CisgIG1ldGhvZCBuYW1lcy4KKworKiBBZGRlZCAtSWRiZ1NUIG9wdGlvbiB0byBlbWl0IFNUIGRlbGltaXRlcnMgYXQgc3RhcnQvc3RvcCBvZiBhbGwKKyAgdGVtcGxhdGVzIHNwaXQgb3V0LgorCitKdW5lIDI4LCAyMDA2CisKKyogVHdlYWtlZCBtZXNzYWdlIHdoZW4gQU5UTFIgY2Fubm90IGhhbmRsZSBhbmFseXNpcy4KKworMy4wYjEgLSBKdW5lIDI3LCAyMDA2CisKK0p1bmUgMjQsIDIwMDYKKworKiBzeW4gcHJlZHMgbm8gbG9uZ2VyIGdlbmVyYXRlIGxpdHRsZSBzdGF0aWMgY2xhc3NlczsgdGhleSBhbHNvIGRvbid0CisgIGdlbmVyYXRlIGEgd2hvbGUgYnVuY2ggb2YgZXh0cmEgY3JhcCBpbiB0aGUgcnVsZXMgYnVpbHQgdG8gdGVzdCBzeW4KKyAgcHJlZHMuICBSZW1vdmVkIEdyYW1tYXJGcmFnbWVudFBvaW50ZXIgY2xhc3MgZnJvbSBydW50aW1lLgorCitKdW5lIDIzLTI0LCAyMDA2CisKKyogYWRkZWQgb3V0cHV0IG9wdGlvbiB0byAtcmVwb3J0IG91dHB1dC4KKworKiBhZGRlZCBwcm9maWxpbmcgaW5mbzoKKyAgTnVtYmVyIG9mIHJ1bGUgaW52b2NhdGlvbnMgaW4gImd1ZXNzaW5nIiBtb2RlCisgIG51bWJlciBvZiBydWxlIG1lbW9pemF0aW9uIGNhY2hlIGhpdHMKKyAgbnVtYmVyIG9mIHJ1bGUgbWVtb2l6YXRpb24gY2FjaGUgbWlzc2VzCisKKyogbWFkZSBERkEgRE9UIGRpYWdyYW1zIGdvIGxlZnQgdG8gcmlnaHQgbm90IHRvcCB0byBib3R0b20KKworKiBJIHRyeSB0byByZWN1cnNpdmUgb3ZlcmZsb3cgc3RhdGVzIG5vdyBieSByZXNvbHZpbmcgdGhlc2Ugc3RhdGVzCisgIHdpdGggc2VtYW50aWMvc3ludGFjdGljIHByZWRpY2F0ZXMgaWYgdGhleSBleGlzdC4gIFRoZSBERkEgaXMgdGhlbgorICBkZXRlcm1pbmlzdGljIHJhdGhlciB0aGFuIHNpbXBseSByZXNvbHZpbmcgYnkgY2hvb3NpbmcgZmlyc3QKKyAgbm9uZGV0ZXJtaW5pc3RpYyBhbHQuICBJIHVzZWQgdG8gZ2VuZXJhdGVkIGVycm9yczoKKworfi90bXAgJCBqYXZhIG9yZy5hbnRsci5Ub29sIC1kZmEgdC5nCitBTlRMUiBQYXJzZXIgR2VuZXJhdG9yICAgRWFybHkgQWNjZXNzIFZlcnNpb24gMy4wYjIgKEp1bHkgNSwgMjAwNikgIDE5ODktMjAwNgordC5nOjI6NTogQWx0ZXJuYXRpdmUgMTogYWZ0ZXIgbWF0Y2hpbmcgaW5wdXQgc3VjaCBhcyBBIEEgQSBBIEEgZGVjaXNpb24gY2Fubm90IHByZWRpY3Qgd2hhdCBjb21lcyBuZXh0IGR1ZSB0byByZWN1cnNpb24gb3ZlcmZsb3cgdG8gYiBmcm9tIGIKK3QuZzoyOjU6IEFsdGVybmF0aXZlIDI6IGFmdGVyIG1hdGNoaW5nIGlucHV0IHN1Y2ggYXMgQSBBIEEgQSBBIGRlY2lzaW9uIGNhbm5vdCBwcmVkaWN0IHdoYXQgY29tZXMgbmV4dCBkdWUgdG8gcmVjdXJzaW9uIG92ZXJmbG93IHRvIGIgZnJvbSBiCisKKyAgTm93LCBJIHVzZXMgcHJlZGljYXRlcyBpZiBhdmFpbGFibGUgYW5kIGVtaXRzIG5vIHdhcm5pbmdzLgorCisqIG1hZGUgc2VtIHByZWRzIHNoYXJlIGFjY2VwdCBzdGF0ZXMuICBQcmV2aW91c2x5LCBtdWx0aXBsZSBwcmVkcyBpbiBhCitkZWNpc2lvbiBmb3JrZWQgbmV3IGFjY2VwdHMgZWFjaCB0aW1lIGZvciBlYWNoIG5vbmRldCBzdGF0ZS4KKworSnVuZSAxOSwgMjAwNgorCisqIE5lZWQgcGFyZW5zIGFyb3VuZCB0aGUgcHJlZGljdGlvbiBleHByZXNzaW9ucyBpbiB0ZW1wbGF0ZXMuCisKKyogUmVmZXJlbmNpbmcgJElELnRleHQgaW4gYW4gYWN0aW9uIGZvcmNlZCBiYWQgY29kZSBnZW4gaW4gbGV4ZXIgcnVsZSBJRC4KKworKiBGaXhlZCBhIGJ1ZyBpbiBob3cgcHJlZGljYXRlcyBhcmUgY29sbGVjdGVkLiAgVGhlIGRlZmluaXRpb24gb2YKKyAgImxhc3QgcHJlZGljYXRlZCBhbHRlcm5hdGl2ZSIgd2FzIGluY29ycmVjdCBpbiB0aGUgYW5hbHlzaXMuICBGdXJ0aGVyLAorICBnYXRlZCBwcmVkaWNhdGVzIGluY29ycmVjdGx5IG1pc3NlZCBhIGNhc2Ugd2hlcmUgYW4gZWRnZSBzaG91bGQgYmVjb21lCisgIHRydWUgKGEgdGF1dG9sb2d5KS4KKworKiBSZW1vdmVkIGFuIHVubmVjZXNzYXJ5IGlucHV0LmNvbnN1bWUoKSByZWZlcmVuY2UgaW4gdGhlIHJ1bnRpbWUvREZBIGNsYXNzLgorCitKdW5lIDE0LCAyMDA2CisKKyogLT4gKCRydWxlbGFiZWwpPyBkaWRuJ3QgZ2VuZXJhdGUgcHJvcGVyIGNvZGUgZm9yIEFTVHMuCisKKyogYnVnIGluIGNvZGUgZ2VuIChkaWQgbm90IGNvbXBpbGUpCithIDogSUQgLT4gSUQKKyAgfCBJRCAtPiBJRAorICA7CitQcm9ibGVtIGlzIHJlcGVhdGVkIHJlZiB0byBJRCBmcm9tIGxlZnQgc2lkZS4gIEp1ZXJnZW4gcG9pbnRlZCB0aGlzIG91dC4KKworKiB1c2Ugb2YgdG9rZW5Wb2NhYiB3aXRoIG1pc3NpbmcgZmlsZSB5aWVsZGVkIGV4Y2VwdGlvbgorCisqIChBfEIpPT4gZm9vIHlpZWxkZWQgYW4gZXhjZXB0aW9uIGFzIChBfEIpIGlzIGEgc2V0IG5vdCBhIGJsb2NrLiBGaXhlZC4KKworKiBEaWRuJ3Qgc2V0IElEMT0gYW5kIElOVDE9IGZvciB0aGlzIGFsdDoKKyAgfCBeKElEIElOVCsge1N5c3RlbS5vdXQucHJpbnQoXCJeKFwiKyRJRCtcIiBcIiskSU5UK1wiKVwiKTt9KQorCisqIEZpeGVkIHNvIHJlcGVhdGVkIGRhbmdsaW5nIHN0YXRlIGVycm9ycyBvbmx5IG9jY3VyIG9uY2UgbGlrZToKK3QuZzo0OjE3OiB0aGUgZGVjaXNpb24gY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYWx0ZXJuYXRpdmUocykgMiwxIGZvciBhdCBsZWFzdCBvbmUgaW5wdXQgc2VxdWVuY2UKKworKiB0cmFja2luZyBvZiBydWxlIGVsZW1lbnRzIHdhcyBvbiAobWFraW5nIGxpc3QgZGVmcyBhdCBzdGFydCBvZgorICBtZXRob2QpIHdpdGggdGVtcGxhdGVzIGluc3RlYWQgb2YganVzdCB3aXRoIEFTVHMuICBUdXJuZWQgb2ZmLgorCisqIERvZXNuJ3QgY3Jhc2ggd2hlbiB5b3UgZ2l2ZSBpdCBhIG1pc3NpbmcgZmlsZSBub3cuCisKKyogLXJlcG9ydDogYWRkIG91dHB1dCBpbmZvOiBob3cgbWFueSBMTCgxKSBkZWNpc2lvbnMuCisKK0p1bmUgMTMsIDIwMDYKKworKiBeKFJPT1QgSUQ/KSBEaWRuJ3Qgd29yazsgbm9yIGRpZCBhbnkgb3RoZXIgbnVsbGFibGUgY2hpbGQgbGlzdCBzdWNoIGFzCisgIF4oUk9PVCBJRCogSU5UPykuICBOb3csIEkgY2hlY2sgdG8gc2VlIGlmIGNoaWxkIGxpc3QgaXMgbnVsbGFibGUgdXNpbmcKKyAgR3JhbW1hci5MT09LKCkgYW5kLCBpZiBzbywgSSBnZW5lcmF0ZSBhbiAiSUYgbG9va2FoZWFkIGlzIERPV04iIGdhdGUKKyAgYXJvdW5kIHRoZSBjaGlsZCBsaXN0IHNvIHRoZSB3aG9sZSB0aGluZyBpcyBvcHRpb25hbC4KKworKiBGaXhlZCBhIGJ1ZyBpbiBMT09LIHRoYXQgbWFkZSBpdCBub3QgbG9vayB0aHJvdWdoIG51bGxhYmxlIHJ1bGVzLgorCisqIFVzaW5nIEFTVCBzdWZmaXhlcyBvciAtPiByZXdyaXRlIHN5bnRheCBub3cgZ2l2ZXMgYW4gZXJyb3Igdy9vIGEgZ3JhbW1hcgorICBvdXRwdXQgb3B0aW9uLiAgVXNlZCB0byBjcmFzaCA7KQorCisqIFJlZmVyZW5jZXMgdG8gRU9GIGVuZGVkIHVwIHdpdGggaW1wcm9wZXIgLTEgcmVmcyBpbnN0ZWFkIG9mIEVPRiBpbiBvdXRwdXQuCisKKyogZGlkbid0IHdhcm4gb2YgYW1iaWcgcmVmIHRvICRleHByIGluIHJld3JpdGU7IGZpeGVkLgorbGlzdAorICAgICA6CSdbJyBleHByICdmb3InIHR5cGUgSUQgJ2luJyBleHByICddJworCS0+IGNvbXByZWhlbnNpb24oZXhwcj17JGV4cHIuc3R9LHR5cGU9e30sbGlzdD17fSxpPXt9KQorCTsKKworSnVuZSAxMiwgMjAwNgorCisqIEVPRiB3b3JrcyBpbiB0aGUgcGFyc2VyIGFzIGEgdG9rZW4gbmFtZS4KKworKiBSdWxlIGI6KEEgQj8pKjsgZGlkbid0IGRpc3BsYXkgcHJvcGVybHkgaW4gQVcgZHVlIHRvIHRoZSB3YXkgQU5UTFIKKyAgZ2VuZXJhdGVkIE5GQS4KKworKiAic2NvcGUgeDsiIGluIGEgcnVsZSBmb3IgdW5rbm93biB4IGdpdmVzIG5vIGVycm9yLiAgRml4ZWQuICBBZGRlZCB1bml0IHRlc3QuCisKKyogTGFiZWwgdHlwZSBmb3IgcmVmcyB0byBzdGFydC9zdG9wIGluIHRyZWUgcGFyc2VyIGFuZCBvdGhlciBwYXJzZXJzIHdlcmUKKyAgbm90IHVzZWQuICBMb3RzIG9mIGNhc3RpbmcuICBJY2suIEZpeGVkLgorCisqIGNvdWxkbid0IHJlZmVyIHRvICR0b2tlbmxhYmVsIGluIGlzb2xhdGlvbjsgYnV0IG5lZWQgc28gd2UgY2FuIHRlc3QgaWYKKyAgc29tZXRoaW5nIHdhcyBtYXRjaGVkLiAgRml4ZWQuCisKKyogTG90cyBvZiBsaXR0bGUgYnVncyBmaXhlZCBpbiAkeC55LCAlLi4uIHRyYW5zbGF0aW9uIGR1ZSB0byBuZXcKKyAgYWN0aW9uIHRyYW5zbGF0b3IuCisKKyogSW1wcm9wZXJseSB0cmFja2luZyBibG9jayBuZXN0aW5nIGxldmVsOyByZXN1bHQgd2FzIHRoYXQgeW91IGNvdWxkbid0CisgIHNlZSAkSUQgaW4gYWN0aW9uIG9mIHJ1bGUgImEgOiBBKyB8IElEIHtUb2tlbiB0ID0gJElEO30gfCBDIDsiCisKKyogYSA6IElEIElEIHskSUQudGV4dDt9IDsgZGlkIG5vdCBnZXQgYSB3YXJuaW5nIGFib3V0IGFtYmlndW91cyAkSUQgcmVmLgorCisqIE5vIGVycm9yIHdhcyBmb3VuZCBvbiAkQ09NTUVOVC50ZXh0OgorCitDT01NRU5UCisgICAgOiAgICcvKicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9IDogLiApKiAnKi8nCisgICAgICAgIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIG1ldGhvZCAiKyRDT01NRU5ULnRleHQpO30KKyAgICA7CisKKyAgJGVuY2xvc2luZ2xleGVycnVsZSBzY29wZSBkb2VzIG5vdCBleGlzdC4gIFVzZSB0ZXh0IG9yIHNldFRleHQoKSBoZXJlLgorCitKdW5lIDExLCAyMDA2CisKKyogU2luZ2xlIHJldHVybiB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIG5vdyB0byBkZWZhdWx0IG9yIHRvIHlvdXIgc3BlYy4KKworKiBjbGVhbmVkIHVwIGlucHV0IHN0cmVhbSBzdHVmZi4gIEFkZGVkIEFOVExSUmVhZGVyU3RyZWFtLCBBTlRMUklucHV0U3RyZWFtCisgIGFuZCByZWZhY3RvcmVkLiAgWW91IGNhbiBzcGVjaWZ5IGVuY29kaW5ncyBub3cgb24gQU5UTFJGaWxlU3RyZWFtIChhbmQKKyAgQU5UTFJJbnB1dFN0cmVhbSkgbm93LgorCisqIFlvdSBjYW4gc2V0IHRleHQgbG9jYWwgdmFyIG5vdyBpbiBhIGxleGVyIHJ1bGUgYW5kIHRva2VuIGdldHMgdGhhdCB0ZXh0LgorICBzdGFydC9zdG9wIGluZGV4ZXMgYXJlIHN0aWxsIHNldCBmb3IgdGhlIHRva2VuLgorCisqIENoYW5nZWQgbGV4ZXIgc2xpZ2h0bHkuICBDYWxsaW5nIGEgbm9uZnJhZ21lbnQgcnVsZSBmcm9tIGEKKyAgbm9uZnJhZ21lbnQgcnVsZSBkb2VzIG5vdCBzZXQgdGhlIG92ZXJhbGwgdG9rZW4uCisKK0p1bmUgMTAsIDIwMDYKKworKiBGaXhlZCBidWcgd2hlcmUgdW5uZWNlc3NhcnkgZXNjYXBlcyB5aWVsZCBjaGFyPT0wIGxpa2UgJ1x7Jy4KKworKiBGaXhlZCBhbmFseXNpcyBidWcuICBUaGlzIGdyYW1tYXIgZGlkbid0IHJlcG9ydCBhIHJlY3Vyc2lvbiB3YXJuaW5nOgoreCAgIDogeSBYCisgICAgfCB5IFkKKyAgICA7Cit5ICAgOiBMIHkgUgorICAgIHwgQgorICAgIDsKKyAgVGhlIERGQVN0YXRlLmVxdWFscygpIG1ldGhvZCB3YXMgbWVzc2VkIHVwLgorCisqIEFkZGVkIEBzeW5wcmVkZ2F0ZSB7Li4ufSBhY3Rpb24gc28geW91IGNhbiB0ZWxsIEFOVExSIGhvdyB0byBnYXRlIGFjdGlvbnMKKyAgaW4vb3V0IGR1cmluZyBzeW50YWN0aWMgcHJlZGljYXRlIGV2YWx1YXRpb24uCisKKyogRnV6enkgcGFyc2luZyBzaG91bGQgYmUgbW9yZSBlZmZpY2llbnQuICBJdCBzaG91bGQgYmFja3RyYWNrIG92ZXIgYSBydWxlCisgIGFuZCB0aGVuIHJld2luZCBhbmQgZG8gaXQgYWdhaW4gIndpdGggZmVlbGluZyIgdG8gZXhlYyBhY3Rpb25zLiAgSXQgd2FzCisgIGFjdHVhbGx5IGRvaW5nIGl0IDN4IG5vdCAyeC4KKworSnVuZSA5LCAyMDA2CisKKyogR3V0dGVkIGFuZCByZWJ1aWx0IHRoZSBhY3Rpb24gdHJhbnNsYXRvciBmb3IgJHgueSwgJHg6OnksIC4uLgorICBVc2VzIEFOVExSIHYzIG5vdyBmb3IgdGhlIGZpcnN0IHRpbWUgaW5zaWRlIHYzIHNvdXJjZS4gOikKKyAgQWN0aW9uVHJhbnNsYXRvci5qYXZhCisKKyogRml4ZWQgYSBidWcgd2hlcmUgcmVmZXJlbmNpbmcgYSByZXR1cm4gdmFsdWUgb24gYSBydWxlIGRpZG4ndCB3b3JrCisgIGJlY2F1c2UgbGF0ZXIgYSByZWYgdG8gdGhhdCBydWxlJ3MgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzIGRpZG4ndAorICBwcm9wZXJseSBmb3JjZSBhIHJldHVybiB2YWx1ZSBzdHJ1Y3QgdG8gYmUgYnVpbHQuICBBZGRlZCB1bml0IHRlc3QuCisKK0p1bmUgNiwgMjAwNgorCisqIE5ldyBERkEgbWVjaGFuaXNtcy4gIEN5Y2xpYyBERkEgYXJlIGltcGxlbWVudGVkIGFzIHN0YXRlIHRhYmxlcywKKyAgZW5jb2RlZCB2aWEgc3RyaW5ncyBhcyBqYXZhIGNhbm5vdCBoYW5kbGUgbGFyZ2Ugc3RhdGljIGFycmF5cyA6KAorICBTdGF0ZXMgd2l0aCBlZGdlcyBlbWFuYXRpbmcgdGhhdCBoYXZlIHByZWRpY2F0ZXMgYXJlIHNwZWNpYWxseQorICB0cmVhdGVkLiAgQSBtZXRob2QgaXMgZ2VuZXJhdGVkIHRvIGRvIHRoZXNlIHN0YXRlcy4gIFRoZSBERkEKKyAgc2ltdWxhdGlvbiByb3V0aW5lIHVzZXMgdGhlICJzcGVjaWFsIiBhcnJheSB0byBmaWd1cmUgb3V0IGlmIHRoZQorICBzdGF0ZSBpcyBzcGVjaWFsLiAgU2VlIE1hcmNoIDI1LCAyMDA2IGVudHJ5IGZvciBkZXNjcmlwdGlvbjoKKyAgaHR0cDovL3d3dy5hbnRsci5vcmcvYmxvZy9hbnRscjMvY29kZWdlbi50bWwuICBhbmFseXNpcy5ERkEgbm93IGhhcworICBhbGwgdGhlIHN0YXRlIHRhYmxlcyBnZW5lcmF0ZWQgZm9yIGNvZGUgZ2VuLiAgQ3ljbGljQ29kZUdlbmVyYXRvci5qYXZhCisgIGRpc2FwcGVhcmVkIGFzIGl0J3MgdW5uZWVkZWQgY29kZS4gOikKKworKiBJbnRlcm5hbCBnZW5lcmFsIGNsZWFuIHVwIG9mIHRoZSBERkEuc3RhdGVzIHZzIHVuaXF1ZVN0YXRlcyB0aGluZy4KKyAgRml4ZWQgbG9va2FoZWFkIGRlY2lzaW9ucyBubyBsb25nZXIgZmlsbCB1bmlxdWVTdGF0ZXMuICBXYXN0ZSBvZgorICB0aW1lLiAgQWxzbyBub3RlZCB0aGF0IHdoZW4gYWRkaW5nIHNlbSBwcmVkIGVkZ2VzLCBJIGRpZG4ndCBjaGVjaworICBmb3Igc3RhdGUgcmV1c2UuICBGaXhlZC4KKworSnVuZSA0LCAyMDA2CisKKyogV2hlbiByZXNvbHZpbmcgYW1iaWcgREZBIHN0YXRlcyBwcmVkaWNhdGVzLCBJIGRpZCBub3QgYWRkIHRoZSBuZXcgc3RhdGVzCisgIHRvIHRoZSBsaXN0IG9mIHVuaXF1ZSBERkEgc3RhdGVzLiAgTm8gb2JzZXJ2YWJsZSBlZmZlY3Qgb24gb3V0cHV0IGV4Y2VwdAorICB0aGF0IERGQSBzdGF0ZSBudW1iZXJzIHdlcmUgbm90IGFsd2F5cyBjb250aWd1b3VzIGZvciBwcmVkaWNhdGVkIGRlY2lzaW9ucy4KKyAgSSBuZWVkZWQgdGhpcyBmaXggZm9yIG5ldyBERkEgdGFibGVzLgorCiszLjBlYTEwIC0gSnVuZSAyLCAyMDA2CisKK0p1bmUgMiwgMjAwNgorCisqIEltcHJvdmVkIGdyYW1tYXIgc3RhdHMgYW5kIGFkZGVkIHN5bnRhY3RpYyBwcmVkIHRyYWNraW5nLgorCitKdW5lIDEsIDIwMDYKKworKiBEdWUgdG8gYSB0eXBlIG1pc21hdGNoLCB0aGUgRGVidWdQYXJzZXIucmVjb3ZlckZyb21NaXNtYXRjaGVkVG9rZW4oKQorICBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuICBEZWJ1ZyBldmVudHMgZm9yIG1pc21hdGNoZWQgdG9rZW4gZXJyb3IKKyAgbm90aWZpY2F0aW9uIHdlcmUgbm90IHNlbnQgdG8gQU5UTFJXb3JrcyBwcm9iYWJseQorCisqIEFkZGVkIGdldEJhY2t0cmFja2luZ0xldmVsKCkgZm9yIGFueSByZWNvZ25pemVyOyBuZWVkZWQgZm9yIHByb2ZpbGVyLgorCisqIE9ubHkgd3JpdGVzIHByb2ZpbGluZyBkYXRhIGZvciBhbnRsciBncmFtbWFyIGFuYWx5c2lzIHdpdGggLXByb2ZpbGUgc2V0CisKKyogTWFqb3IgdXBkYXRlIGFuZCBidWcgZml4IHRvIChydW50aW1lKSBQcm9maWxlci4KKworTWF5IDI3LCAyMDA2CisKKyogQWRkZWQgTGV4ZXIuc2tpcCgpIHRvIGZvcmNlIGxleGVyIHRvIGlnbm9yZSBjdXJyZW50IHRva2VuIGFuZCBsb29rIGZvcgorICBhbm90aGVyOyBubyB0b2tlbiBpcyBjcmVhdGVkIGZvciBjdXJyZW50IHJ1bGUgYW5kIGlzIG5vdCBwYXNzZWQgb24gdG8KKyAgcGFyc2VyIChvciBvdGhlciBjb25zdW1lciBvZiB0aGUgbGV4ZXIpLgorCisqIFBhcnNlcnMgYXJlIG11Y2ggZmFzdGVyIG5vdy4gIEkgcmVtb3ZlZCB1c2Ugb2YgamF2YS51dGlsLlN0YWNrIGZvciBwdXNoaW5nCisgIGZvbGxvdyBzZXRzIGFuZCB1c2UgYSBoYXJkY29kZWQgYXJyYXkgc3RhY2sgaW5zdGVhZC4gIERyb3BwZWQgZnJvbQorICA1OTAwbXMgdG8gMzkwMG1zIGZvciBwYXJzZStsZXggdGltZSBwYXJzaW5nIGVudGlyZSBqYXZhIDEuNC4yIHNvdXJjZS4gIExleAorICB0aW1lIGFsb25lIHdhcyBhYm91dCAxNTAwbXMuICBKdXN0IGxvb2tpbmcgYXQgcGFyc2UgdGltZSwgd2UgZ2V0IGFib3V0IDJ4CisgIHNwZWVkIGltcHJvdmVtZW50LiA6KQorCitNYXkgMjYsIDIwMDYKKworKiBGaXhlZCBORkEgY29uc3RydWN0aW9uIHNvIGl0IGdlbmVyYXRlcyBORkEgZm9yIChBKikqIHN1Y2ggdGhhdCBBTlRMUldvcmtzCisgIGNhbiBkaXNwbGF5IGl0IHByb3Blcmx5LgorCitNYXkgMjUsIDIwMDYKKworKiBhZGRlZCBhYm9ydCBtZXRob2QgdG8gR3JhbW1hciBzbyBBVyBjYW4gdGVybWluYXRlIHRoZSBjb252ZXJzaW9uIGlmIGl0J3MKKyAgdGFraW5nIHRvbyBsb25nLgorCitNYXkgMjQsIDIwMDYKKworKiBhZGRlZCBtZXRob2QgdG8gZ2V0IGxlZnQgcmVjdXJzaXZlIHJ1bGVzIGZyb20gZ3JhbW1hciB3aXRob3V0IGRvaW5nIGZ1bGwKKyAgZ3JhbW1hciBhbmFseXNpcy4KKworKiBhbmFseXNpcywgY29kZSBnZW4gbm90IGF0dGVtcHRlZCBpZiBzZXJpb3VzIGVycm9yIChsaWtlCisgIGxlZnQtcmVjdXJzaW9uIG9yIG1pc3NpbmcgcnVsZSBkZWZpbml0aW9uKSBvY2N1cnJlZCB3aGlsZSByZWFkaW5nCisgIHRoZSBncmFtbWFyIGluIGFuZCBkZWZpbmluZyBzeW1ib2xzLgorCisqIGFkZGVkIGFtYXppbmcgb3B0aW1pemF0aW9uOyByZWR1Y2VzIGFuYWx5c2lzIHRpbWUgYnkgOTAlIGZvciBqYXZhCisgIGdyYW1tYXI7IHNpbXBsZSBJRiBzdGF0ZW1lbnQgYWRkaXRpb24hCisKKzMuMGVhOSAtIE1heSAyMCwgMjAwNgorCisqIGFkZGVkIGdsb2JhbCBrIHZhbHVlIGZvciBncmFtbWFyIHRvIGxpbWl0IGxvb2thaGVhZCBmb3IgYWxsIGRlY2lzaW9ucyB1bmxlc3MKK292ZXJyaWRkZW4gaW4gYSBwYXJ0aWN1bGFyIGRlY2lzaW9uLgorCisqIGFkZGVkIGZhaWxzYWZlIHNvIHRoYXQgYW55IGRlY2lzaW9uIHRha2luZyBsb25nZXIgdGhhbiAyIHNlY29uZHMgdG8gY3JlYXRlCit0aGUgREZBIHdpbGwgZmFsbCBiYWNrIG9uIGs9MS4gIFVzZSAtSW1heHRpbWVmb3JERkEgbiAoaW4gbXMpIHRvIHNldCB0aGUgdGltZS4KKworKiBhZGRlZCBhbiBvcHRpb24gKHR1cm5lZCBvZmYgZm9yIG5vdykgdG8gdXNlIG11bHRpcGxlIHRocmVhZHMgdG8KK3BlcmZvcm0gZ3JhbW1hciBhbmFseXNpcy4gIE5vdCBtdWNoIGhlbHAgb24gYSAyLUNQVSBjb21wdXRlciBhcworZ2FyYmFnZSBjb2xsZWN0aW9uIHNlZW1zIHRvIHBlZyB0aGUgMm5kIENQVSBhbHJlYWR5LiA6KCBHb3R0YSB3YWl0IGZvcgorYSA0IENQVSBib3ggOykKKworKiBzd2l0Y2hlZCBmcm9tICNzcmMgdG8gLy8gJEFOVExSIHNyYyBkaXJlY3RpdmUuCisKKyogQ29tbW9uVG9rZW5TdHJlYW0uZ2V0VG9rZW5zKCkgbG9va2VkIHBhc3QgZW5kIG9mIGJ1ZmZlciBzb21ldGltZXMuIGZpeGVkLgorCisqIHVuaWNvZGUgbGl0ZXJhbHMgZGlkbid0IHJlYWxseSB3b3JrIGluIERPVCBvdXRwdXQgYW5kIGdlbmVyYXRlZCBjb2RlLiBmaXhlZC4KKworKiBmaXhlZCB0aGUgdW5pdCB0ZXN0IHJpZyBzbyBpdCBjb21waWxlcyBuaWNlbHkgd2l0aCBKYXZhIDEuNQorCisqIEFkZGVkIGFudCBidWlsZC54bWwgZmlsZSAocmVhZHMgYnVpbGQucHJvcGVydGllcyBmaWxlKQorCisqIHByZWRpY2F0ZXMgc29tZXRpbWVzIGZhaWxlZCB0byBjb21waWxlL2V2YWwgcHJvcGVybHkgZHVlIHRvIG1pc3NpbmcgKC4uLikKKyAgaW4gSUYgZXhwcmVzc2lvbnMuICBGb3JjZWQgKC4uKQorCisqICguLi4pPyB3aXRoIG9ubHkgb25lIGFsdCB3ZXJlIG5vdCBvcHRpbWl6ZWQuICBXYXM6CisKKyAgICAgICAgLy8gdC5nOjQ6NzogKCBCICk/CisgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICBpZiAoIExBMV8wPT1CICkgeworICAgICAgICAgICAgYWx0MT0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBMQTFfMD09LTEgKSB7CisgICAgICAgICAgICBhbHQxPTI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjQ6NzogKCBCICk/IiwgMSwgMCwgaW5wdXQpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorCitpcyBub3c6CisKKyAgICAgICAgLy8gdC5nOjQ6NzogKCBCICk/CisgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworICAgICAgICBpZiAoIExBMV8wPT1CICkgeworICAgICAgICAgICAgYWx0MT0xOworICAgICAgICB9CisKKyAgU21hbGxlciwgZmFzdGVyIGFuZCBtb3JlIHJlYWRhYmxlLgorCisqIEFsbG93IG1hbnVhbCBpbml0IG9mIHJldHVybiB2YWx1ZXMgbm93OgorICBmdW5jdGlvbkhlYWRlciByZXR1cm5zIFtpbnQgeD0zKjQsIGNoYXIgKCpmKSgpPW51bGxdIDogLi4uIDsKKworKiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIERGQXMgdGhhdCBmaXhlZCBhIGNvZGVnZW4gYnVnIHdpdGggcnVsZXMgaW4gbGV4ZXI6CisgICBFUQkJCSA6ICc9JyA7CisgICBBU1NJR05PUAkJIDogJz0nIHwgJys9JyA7CisgIEVRIGlzIGEgc3Vic2V0IG9mIG90aGVyIHJ1bGUuICBJdCBkaWQgbm90IGdpdmVuIGFuIGVycm9yIHdoaWNoIGlzCisgIGNvcnJlY3QsIGJ1dCBnZW5lcmF0ZWQgYmFkIGNvZGUuCisKKyogQU5UTFIgd2FzIHNlbmRpbmcgY29sdW1uIG5vdCBjaGFyIHBvc2l0aW9uIHRvIEFOVExSV29ya3MuCisKKyogQnVnIGZpeDogbG9jYXRpb24gMCwgMCBlbWl0dGVkIGZvciBzeW5wcmVkcyBhbmQgZW1wdHkgYWx0cy4KKworKiBkZWJ1Z2dpbmcgZXZlbnQgaGFuZHNoYWtlIGhvdyBzZW5kcyBncmFtbWFyIGZpbGUgbmFtZS4gIEFkZGVkIGdldEdyYW1tYXJGaWxlTmFtZSgpIHRvIHJlY29nbml6ZXJzLiAgSmF2YS5zdGcgZ2VuZXJhdGVzIGl0OgorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiPGZpbGVOYW1lPiI7IH0KKworKiB0cmVlIHBhcnNlcnMgY2FuIGRvIGFyYml0cmFyeSBsb29rYWhlYWQgbm93IGluY2x1ZGluZyBiYWNrdHJhY2tpbmcuICBJCisgIHVwZGF0ZWQgQ29tbW9uVHJlZU5vZGVTdHJlYW0uCisKKyogYWRkZWQgZXZlbnRzIGZvciBkZWJ1Z2dpbmcgdHJlZSBwYXJzZXJzOgorCisJLyoqIElucHV0IGZvciBhIHRyZWUgcGFyc2VyIGlzIGFuIEFTVCwgYnV0IHdlIGtub3cgbm90aGluZyBmb3Igc3VyZQorCSAqICBhYm91dCBhIG5vZGUgZXhjZXB0IGl0cyB0eXBlIGFuZCB0ZXh0IChvYnRhaW5lZCBmcm9tIHRoZSBhZGFwdG9yKS4KKwkgKiAgVGhpcyBpcyB0aGUgYW5hbG9nIG9mIHRoZSBjb25zdW1lVG9rZW4gbWV0aG9kLiAgQWdhaW4sIHRoZSBJRCBpcworCSAqICB0aGUgaGFzaENvZGUgdXN1YWxseSBvZiB0aGUgbm9kZSBzbyBpdCBvbmx5IHdvcmtzIGlmIGhhc2hDb2RlIGlzCisJICogIG5vdCBpbXBsZW1lbnRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25zdW1lTm9kZShpbnQgSUQsIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSk7CisKKwkvKiogVGhlIHRyZWUgcGFyc2VyIGxvb2tlZCBhaGVhZCAqLworCXB1YmxpYyB2b2lkIExUKGludCBpLCBpbnQgSUQsIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSk7CisKKwkvKiogVGhlIHRyZWUgcGFyc2VyIGhhcyBwb3BwZWQgYmFjayB1cCBmcm9tIHRoZSBjaGlsZCBsaXN0IHRvIHRoZQorCSAqICByb290IG5vZGUuCisJICovCisJcHVibGljIHZvaWQgZ29VcCgpOworCisJLyoqIFRoZSB0cmVlIHBhcnNlciBoYXMgZGVzY2VuZGVkIHRvIHRoZSBmaXJzdCBjaGlsZCBvZiBhIHRoZSBjdXJyZW50CisJICogIHJvb3Qgbm9kZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBnb0Rvd24oKTsKKworKiBBZGRlZCBEZWJ1Z1RyZWVOb2RlU3RyZWFtIGFuZCBEZWJ1Z1RyZWVQYXJzZXIgY2xhc3NlcworCisqIEFkZGVkIGN0b3IgYmVjYXVzZSB0aGUgZGVidWcgdHJlZSBub2RlIHN0cmVhbSB3aWxsIG5lZWQgdG8gYXNrIHF1ZXNpdG9ucyBhYm91dCBub2RlcyBhbmQgc2luY2UgIG5vZGVzIGFyZSBqdXN0IE9iamVjdCwgaXQgbmVlZHMgYW4gYWRhcHRvciB0byBkZWNvZGUgdGhlIG5vZGVzIGFuZCBnZXQgdGV4dC90eXBlIGluZm8gZm9yIHRoZSBkZWJ1Z2dlci4KKworcHVibGljIENvbW1vblRyZWVOb2RlU3RyZWFtKFRyZWVBZGFwdG9yIGFkYXB0b3IsIFRyZWUgdHJlZSk7CisKKyogYWRkZWQgZ2V0dGVyIHRvIFRyZWVOb2RlU3RyZWFtOgorCXB1YmxpYyBUcmVlQWRhcHRvciBnZXRUcmVlQWRhcHRvcigpOworCisqIEltcGxlbWVudGVkIGdldFRleHQvZ2V0VHlwZSBpbiBDb21tb25UcmVlQWRhcHRvci4KKworKiBBZGRlZCBUcmFjZURlYnVnRXZlbnRMaXN0ZW5lciB0aGF0IGNhbiBkdW1wIGFsbCBldmVudHMgdG8gc3Rkb3V0LgorCisqIEkgYnJva2UgZG93biBhbmQgbWFrZSBUcmVlIGltcGxlbWVudCBnZXRUZXh0CisKKyogdHJlZSByZXdyaXRlcyBub3cgZ2VuIGxvY2F0aW9uIGRlYnVnIGV2ZW50cy4KKworKiBhZGRlZCBBU1QgZGVidWcgZXZlbnRzIHRvIGxpc3RlbmVyOyBhZGRlZCBibGFuayBsaXN0ZW5lciBmb3IgY29udmVuaWVuY2UKKworKiB1cGRhdGVkIGRlYnVnIGV2ZW50cyB0byBzZW5kIGJlZ2luL2VuZCBiYWNrdHJhY2sgZXZlbnRzIGZvciBkZWJ1Z2dpbmcKKworKiB3aXRoIGEgOiAoYi0+YikgKCcrJyBiIC0+IF4oUExVUyAkYSBiKSkqIDsgeW91IGdldCBiWzBdIGVhY2ggdGltZSBhcworICB0aGVyZSBpcyBubyBsb29wIGluIHJld3JpdGUgcnVsZSBpdHNlbGYuICBOZWVkIHRvIGtub3cgY29udGV4dCB0aGF0CisgIHRoZSAtPiBpcyBpbnNpZGUgdGhlIHJ1bGUgYW5kIGhlbmNlIGIgbWVhbnMgbGFzdCB2YWx1ZSBvZiBiIG5vdCBhbGwKKyAgdmFsdWVzLgorCisqIEJ1ZyBpbiBUb2tlblJld3JpdGVTdHJlYW07IG9wcyBhdCBpbmRleGVzIDwgc3RhcnQgaW5kZXggYmxvY2tlZCBwcm9wZXIgb3AuCisKKyogQWN0aW9ucyBpbiBTVCByZXdyaXRlcyAiLT4gKHskb3B9KSgpIiB3ZXJlIG5vdCB0cmFuc2xhdGVkCisKKyogQWRkZWQgbmV3IGFjdGlvbiBuYW1lOgorCitAcnVsZWNhdGNoIHsKK2NhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICByZWNvdmVyKGlucHV0LHJlKTsKK30KK2NhdGNoIChUaHJvd2FibGUgdCkgeworICAgIFN5c3RlbS5lcnIucHJpbnRsbih0KTsKK30KK30KK092ZXJyaWRlcyBydWxlIGNhdGNoIHN0dWZmLgorCisqIElzb2xhdGVkICQgcmVmcyBjYXVzZWQgZXhjZXB0aW9uCisKKzMuMGVhOCAtIE1hcmNoIDExLCAyMDA2CisKKyogYWRkZWQgQGZpbmFsbHkgey4uLn0gYWN0aW9uIGxpa2UgQGluaXQgZm9yIHJ1bGVzLiAgRXhlY3V0ZXMgaW4KKyAgZmluYWxseSBibG9jayAoamF2YSB0YXJnZXQpIGFmdGVyIGFsbCBvdGhlciBzdHVmZiBsaWtlIHJ1bGUgbWVtb2l6YXRpb24uCisgIE5vIGNvZGUgY2hhbmdlcyBuZWVkczsgU1QganVzdCByZWZzIGEgbmV3IGFjdGlvbjoKKyAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmZpbmFsbHk+CisKKyogaGlkZW91cyBidWcgZml4ZWQ6IFBMVVM9JysnIGRpZG4ndCByZXN1bHQgaW4gJysnIHJ1bGUgaW4gbGV4ZXIKKworKiBUb2tlblJld3JpdGVTdHJlYW0gZGlkbid0IGRvIHRvU3RyaW5nKCkgcmlnaHQgd2hlbiBubyByZXdyaXRlcyBoYWQgYmVlbiBkb25lLgorCisqIGxleGVyIGVycm9ycyBpbiBpbnRlcnByZXRlciB3ZXJlIG5vdCBwcmludGVkIHByb3Blcmx5CisKKyogYml0c2V0cyBhcmUgZHVtcGVkIGluIGhleCBub3QgZGVjaW1hbCBub3cgZm9yIEZPTExPVyBzZXRzCisKKyogLyogZXBzaWxvbiAqLyBpcyBub3QgcHJpbnRlZCBub3cgd2hlbiBwcmludGluZyBvdXQgZ3JhbW1hcnMgd2l0aCBlbXB0eSBhbHRzCisKKyogRml4ZWQgYW5vdGhlciBidWcgaW4gdHJlZSByZXdyaXRlIHN0dWZmIHdoZXJlIGl0IHdhcyBjaGVja2luZyB0aGF0IGVsZW1lbnRzCisgIGhhZCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gIFN0cmFuZ2UuLi5jb21tZW50ZWQgb3V0IGZvciBub3cgdG8gc2VlIGlmIEkgY2FuIHJlbWVtYmVyIHdoYXQncyB1cC4KKworKiBUcmVlIHJld3JpdGVzIGhhZCBwcm9ibGVtcyB3aGVuIHlvdSBkaWRuJ3QgaGF2ZSB4Kz1GT08gdmFyaWFibGVzLiAgUnVsZXMKKyAgbGlrZSB0aGlzIHdvcmsgbm93OgorCisgIGEgOiAoeD1JRCk/IHk9SUQgLT4gKCR4ICR5KT87CisKKyogZmlsdGVyPXRydWUgZm9yIGxleGVycyB0dXJucyBvbiBrPTEgYW5kIGJhY2t0cmFja2luZyBmb3IgZXZlcnkgdG9rZW4KKyAgYWx0ZXJuYXRpdmUuICBQdXQgdGhlIHJ1bGVzIGluIHByaW9yaXR5IG9yZGVyLgorCisqIGFkZGVkIGdldExpbmUoKSBldGMuLi4gdG8gVHJlZSB0byBzdXBwb3J0IGJldHRlciBlcnJvciByZXBvcnRpbmcgZm9yCisgIHRyZWVzLiAgQWRkZWQgTWlzbWF0Y2hlZFRyZWVOb2RlRXhjZXB0aW9uLgorCisqICR0ZW1wbGF0ZXM6OmZvbygpIGlzIGdvbmUuICBhZGRlZCAlIGFzIHNwZWNpYWwgdGVtcGxhdGUgc3ltYm9sLgorICAlZm9vKGE9e30sYj17fSwuLi4pIGN0b3IgKGV2ZW4gc2hvcnRlciB0aGFuICR0ZW1wbGF0ZXM6OmZvbyguLi4pKQorICAlKHtuYW1lLWV4cHJ9KShhPXt9LC4uLikgaW5kaXJlY3QgdGVtcGxhdGUgY3RvciByZWZlcmVuY2UKKworICBUaGUgYWJvdmUgYXJlIHBhcnNlZCBieSBhbnRsci5nIGFuZCB0cmFuc2xhdGVkIGJ5IGNvZGVnZW4uZworICBUaGUgZm9sbG93aW5nIGFyZSBwYXJzZWQgbWFudWFsbHkgaGVyZToKKworICAle3N0cmluZy1leHByfSBhbm9ueW1vdXMgdGVtcGxhdGUgZnJvbSBzdHJpbmcgZXhwcgorICAle2V4cHJ9LnkgPSB6OyB0ZW1wbGF0ZSBhdHRyaWJ1dGUgeSBvZiBTdHJpbmdUZW1wbGF0ZS10eXBlZCBleHByIHRvIHoKKyAgJXgueSA9IHo7IHNldCB0ZW1wbGF0ZSBhdHRyaWJ1dGUgeSBvZiB4IChhbHdheXMgc2V0IG5ldmVyIGdldCBhdHRyKQorICAgICAgICAgICAgdG8geiBbbGFuZ3VhZ2VzIGxpa2UgcHl0aG9uIHdpdGhvdXQgJzsnIG11c3Qgc3RpbGwgdXNlIHRoZQorICAgICAgICAgICAgJzsnIHdoaWNoIHRoZSBjb2RlIGdlbmVyYXRvciBpcyBmcmVlIHRvIHJlbW92ZSBkdXJpbmcgY29kZSBnZW5dCisKKyogLT4gKHtleHByfSkoYT17fSwuLi4pIG5vdGF0aW9uIGZvciBpbmRpcmVjdCB0ZW1wbGF0ZSByZXdyaXRlLgorICBleHByIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZS4KKworKiAkeFtpXTo6eSBhbmQgJHhbLWldOjp5IG5vdGF0aW9uIGZvciBhY2Nlc3NzaW5nIGFic29sdXRlIHNjb3BlIHN0YWNrCisgIGluZGV4ZXMgYW5kIHJlbGF0aXZlIG5lZ2F0aXZlIHNjb3Blcy4gICR4Wy0xXTo6eSBpcyB0aGUgeSBhdHRyaWJ1dGUKKyAgb2YgdGhlIHByZXZpb3VzIHNjb3BlIChzdGFjayB0b3AgLSAxKS4KKworKiBmaWx0ZXI9dHJ1ZSBtb2RlIGZvciBsZXhlcnM7IGNhbiBkbyB0aGlzIG5vdy4uLnVwb24gbWlzbWF0Y2gsIGp1c3QKKyAgY29uc3VtZXMgYSBjaGFyIGFuZCB0cmllcyBhZ2FpbjoKK2xleGVyIGdyYW1tYXIgRnV6enlKYXZhOworb3B0aW9ucyB7ZmlsdGVyPXRydWU7fQorCitGSUVMRAorICAgIDogICBUWVBFIFdTPyBuYW1lPUlEIFdTPyAoJzsnfCc9JykKKyAgICAgICAge1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgdmFyICIrJG5hbWUudGV4dCk7fQorICAgIDsKKworKiByZWZhY3RvcmVkIGNoYXIgc3RyZWFtcyBzbyBBTlRMUkZpbGVTdHJlYW0gaXMgbm93IGEgc3ViY2xhc3Mgb2YKKyAgQU5UTFJTdHJpbmdTdHJlYW0uCisKKyogY2hhciBzdHJlYW1zIGZvciBsZXhlciBub3cgYWxsb3dlZCBuZXN0ZWQgYmFja3RyYWNraW5nIGluIGxleGVyLgorCisqIGFkZGVkIFRva2VuTGFiZWxUeXBlIGZvciBsZXhlci9wYXJzZXIgZm9yIGFsbCB0b2tlbiBsYWJlbHMKKworKiBsaW5lIG51bWJlcnMgZm9yIGVycm9yIG1lc3NhZ2VzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkgaW4gYW50bHIuZworICBmb3Igc3RyaW5ncywgY2hhciBsaXRlcmFscyBhbmQgPDwuLi4+PgorCisqIGluaXQgYWN0aW9uIGluIGxleGVyIHJ1bGVzIHdhcyBiZWZvcmUgdGhlIHR5cGUsc3RhcnQsbGluZSwuLi4gZGVjbHMuCisKKyogVHJlZSBncmFtbWFycyBjYW4gbm93IHNwZWNpZnkgb3V0cHV0OyBJJ3ZlIG9ubHkgdGVzdGVkIG91dHB1dD10ZW1wbGF0CisgIHRob3VnaC4KKworKiBZb3UgY2FuIHJlZmVyZW5jZSBFT0Ygbm93IGluIHRoZSBwYXJzZXIgYW5kIGxleGVyLiAgSXQncyBqdXN0IHRva2VuIHR5cGUKKyAgb3IgY2hhciB2YWx1ZSAtMS4KKworKiBCdWcgZml4OiAkSUQgcmVmcyBpbiB0aGUgKmxleGVyKiB3ZXJlIGFsbCBtZXNzZWQgdXAuICBDbGVhbmVkIHVwIHRoZQorICBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUuLi4KKworKiBCdWcgZml4OiAuc3Qgbm90IGZvdW5kIGluIHJ1bGUgcmVmIHdoZW4gcnVsZSBoYXMgc2NvcGU6CitmaWVsZAorc2NvcGUgeworCVN0cmluZ1RlbXBsYXRlIGZ1bmNEZWY7Cit9CisgICAgOiAgIC4uLgorCXskZmllbGQ6OmZ1bmNEZWYgPSAkZmllbGQuc3Q7fQorICAgIDsKK2l0IGdldHMgZmllbGRfc3RhY2suc3QgaW5zdGVhZAorCisqIHJldHVybiBpbiBiYWNrdHJhY2tpbmcgbXVzdCByZXR1cm4gcmV0dmFsIG9yIG51bGwgaWYgcmV0dXJuIHZhbHVlLgorCisqICRwcm9wZXJ0eSB3aXRoaW4gYSBydWxlIG5vdyB3b3JrcyBsaWtlICR0ZXh0LCAkc3QsIC4uLgorCisqIEFTVC9UZW1wbGF0ZSBSZXdyaXRlcyB3ZXJlIG5vdCBnYXRlZCBieSBiYWNrdHJhY2tpbmc9PTAgc28gdGhleQorICBleGVjdXRlZCBldmVuIHdoZW4gZ3Vlc3NpbmcuICBBdXRvIEFTVCBjb25zdHJ1Y3Rpb24gaXMgbm93IGdhdGVkIGFsc28uCisKKyogQ29tbW9uVG9rZW5TdHJlYW0gd2FzIHNvbWVob3cgcmV0dXJuaW5nIHRva2VucyBub3QgdGV4dCBpbiB0b1N0cmluZygpCisKKyogYWRkZWQgdXNlZnVsIG1ldGhvZHMgdG8gcnVudGltZS5CaXRTZXQgYW5kIGFsc28gdG8gQ29tbW9uVG9rZW4gc28geW91IGNhbgorICB1cGRhdGUgdGhlIHRleHQuICBBZGRlZCBuaWNlIFRva2VuIHN0cmVhbSBtZXRob2Q6CisKKyAgLyoqIEdpdmVuIGEgc3RhcnQgYW5kIHN0b3AgaW5kZXgsIHJldHVybiBhIExpc3Qgb2YgYWxsIHRva2VucyBpbgorICAgKiAgdGhlIHRva2VuIHR5cGUgQml0U2V0LiAgUmV0dXJuIG51bGwgaWYgbm8gdG9rZW5zIHdlcmUgZm91bmQuICBUaGlzCisgICAqICBtZXRob2QgbG9va3MgYXQgYm90aCBvbiBhbmQgb2ZmIGNoYW5uZWwgdG9rZW5zLgorICAgKi8KKyAgcHVibGljIExpc3QgZ2V0VG9rZW5zKGludCBzdGFydCwgaW50IHN0b3AsIEJpdFNldCB0eXBlcyk7CisKKyogbGl0ZXJhbHMgYXJlIG5vdyBwYXNzZWQgaW4gdGhlIC50b2tlbnMgZmlsZXMgc28geW91IGNhbiByZWYgdGhlbSBpbgorICB0cmVlIHBhcnNlcywgZm9yIGV4YW1wbGUuCisKKyogYWRkZWQgYmFzaWMgZXhjZXB0aW9uIGhhbmRsaW5nOyBubyBsYWJlbHMsIGp1c3QgZ2VuZXJhbCBjYXRjaGVzOgorCithIDogezt9QSB8IEIgOworICAgICAgICBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBjYXRjaFtSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZV0geworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNvZyBlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaFtFeGNlcHRpb24gZV0geworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciIpOworICAgICAgICAgICAgICAgIH0KKworKiBBZGRlZCBtZXRob2QgdG8gVG9rZW5TdHJlYW06CisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVG9rZW4gc3RhcnQsIFRva2VuIHN0b3ApOworCisqIGFudGxyIGdlbmVyYXRlcyAjc3JjIGxpbmVzIGluIGxleGVyIGdyYW1tYXJzIGdlbmVyYXRlZCBmcm9tIGNvbWJpbmVkIGdyYW1tYXJzCisgIHNvIGVycm9yIG1lc3NhZ2VzIHJlZmVyIHRvIG9yaWdpbmFsIGZpbGUuCisKKyogbGV4ZXJzIGdlbmVyYXRlZCBmcm9tIGNvbWJpbmVkIGdyYW1tYXJzIG5vdyB1c2Ugb3JpZ2luYWxseSBmb3JtYXR0aW5nLgorCisqIHByZWRpY2F0ZXMgaGF2ZSAkeC55IHN0dWZmIHRyYW5zbGF0ZWQgbm93LiAgV2FybmluZzogcHJlZGljYXRlcyBtaWdodCBiZQorICBob2lzdGVkIG91dCBvZiBjb250ZXh0LgorCisqIHJldHVybiB2YWx1ZXMgaW4gcmV0dXJuIHZhbCBzdHJ1Y3RzIGFyZSBub3cgcHVibGljLgorCisqIG91dHB1dD10ZW1wbGF0ZSB3aXRoIHJldHVybiB2YWx1ZXMgb24gcnVsZXMgd2FzIGJyb2tlbi4gIEkgYXNzdW1lIHJldHVybiB2YWx1ZXMgd2l0aCBBU1RzIHdhcyBicm9rZW4gdG9vLiAgRml4ZWQuCisKKzMuMGVhNyAtIERlY2VtYmVyIDE0LCAyMDA1CisKKyogQWRkZWQgLXByaW50IG9wdGlvbiB0byBwcmludCBvdXQgZ3JhbW1hciB3L28gYWN0aW9ucworCisqIFJlbmFtZWQgQmFzZVBhcnNlciB0byBiZSBCYXNlUmVjb2duaXplciBhbmQgZXZlbiBtYWRlIExleGVyIGRlcml2ZSBmcm9tCisgIHRoaXM7IG5pY2UgYXMgaXQgbm93IHNoYXJlcyBiYWNrdHJhY2tpbmcgc3VwcG9ydCBjb2RlLgorCisqIEFkZGVkIHN5bnRhY3RpYyBwcmVkaWNhdGVzICguLi4pPT4uICBTZWUgRGVjZW1iZXIgNCwgMjAwNSBlbnRyeToKKworICBodHRwOi8vd3d3LmFudGxyLm9yZy9ibG9nL2FudGxyMy9sb29rYWhlYWQudG1sCisKKyAgTm90ZSB0aGF0IHdlIGhhdmUgYSBuZXcgb3B0aW9uIGZvciB0dXJuaW5nIG9mZiBydWxlIG1lbW9pemF0aW9uIGR1cmluZworICBiYWNrdHJhY2tpbmc6CisKKyAgLW5vbWVtbyAgICAgICAgd2hlbiBiYWNrdHJhY2tpbmcgZG9uJ3QgZ2VuZXJhdGUgbWVtb2l6YXRpb24gY29kZQorCisqIFByZWRpY2F0ZXMgYXJlIG5vdyB0ZXN0ZWQgaW4gb3JkZXIgdGhhdCB5b3Ugc3BlY2lmeSB0aGUgYWx0cy4gIElmIHlvdQorICBsZWF2ZSB0aGUgbGFzdCBhbHQgIm5ha2VkIiAody9vIHByZWQpLCBpdCB3aWxsIGFzc3VtZSBhIHRydWUgcHJlZCByYXRoZXIKKyAgdGhhbiB1bmlvbiBvZiBvdGhlciBwcmVkcy4KKworKiBBZGRlZCBnYXRlZCBwcmVkaWNhdGVzICJ7cH0/PT4iIHRoYXQgbGl0ZXJhbGx5IHR1cm4gb2ZmIGEgcHJvZHVjdGlvbiB3aGVyZWFzCitkaXNhbWJpZ3VhdGluZyBwcmVkaWNhdGVzIGFyZSBvbmx5IGhvaXN0ZWQgaW50byB0aGUgcHJlZGljdG9yIHdoZW4gc3ludGF4IGFsb25lCitpcyBub3Qgc3VmZmljaWVudCB0byB1bmlxdWVseSBwcmVkaWN0IGFsdGVybmF0aXZlcy4KKworQSA6IHtwfT8gID0+ICJhIiA7CitCIDogeyFwfT8gPT4gKCJhInwiYiIpKyA7CisKKyogYnVnIGZpeGVkIHJlbGF0ZWQgdG8gcHJlZGljYXRlcyBpbiBwcmVkaWN0b3IKK2xleGVyIGdyYW1tYXIgdzsKK0EgOiB7cH0/ICJhIiA7CitCIDogeyFwfT8gKCJhInwiYiIpKyA7CitERkEgaXMgY29ycmVjdC4gIEEgc3RhdGUgc3BsaXRzIGZvciBpbnB1dCAiYSIgb24gdGhlIHByZWQuCitHZW5lcmF0ZWQgY29kZSB0aG91Z2ggd2FzIGhvc2VkLiAgTm8gcHJlZCB0ZXN0cyBpbiBwcmVkaWN0aW9uIGNvZGUhCitJIGFkZGVkIHRlc3RMZXhlclByZWRzKCkgYW5kIG90aGVycyBpbiBUZXN0U2VtYW50aWNQcmVkaWNhdGVFdmFsdWF0aW9uLmphdmEKKworKiBhZGRlZCBleGVjQWN0aW9uIHRlbXBsYXRlIGluIGNhc2Ugd2Ugd2FudCB0byBkbyBzb21ldGhpbmcgaW4gZnJvbnQgb2YKKyAgZWFjaCBhY3Rpb24gZXhlY3V0aW9uIG9yIHNvbWV0aGluZy4KKworKiBsZWZ0LXJlY3Vyc2l2ZSBjeWNsZXMgZnJvbSBydWxlcyB3L28gZGVjaXNpb25zIHdlcmUgbm90IGRldGVjdGVkLgorCisqIHVuZGVmaW5lZCBsZXhlciBydWxlcyB3ZXJlIG5vdCBhbm5vdW5jZWQhIGZpeGVkLgorCisqIHVucmVhY2hhYmxlIG1lc3NhZ2VzIGZvciBUb2tlbnMgcnVsZSBub3cgaW5kaWNhdGUgcnVsZSBuYW1lIG5vdCBhbHQuIEUuZy4sCisKKyAgUnVieS5sZXhlci5nOjI0OjE6IFRoZSBmb2xsb3dpbmcgdG9rZW4gZGVmaW5pdGlvbnMgYXJlIHVucmVhY2hhYmxlOiBJVkFSCisKKyogbm9uZGV0ZXJtaW5pc20gd2FybmluZ3MgaW1wcm92ZWQgZm9yIFRva2VucyBydWxlOgorCitSdWJ5LmxleGVyLmc6MTA6MTogTXVsdGlwbGUgdG9rZW4gcnVsZXMgY2FuIG1hdGNoIGlucHV0IHN1Y2ggYXMgIiIwIi4uIjkiIjogSU5ULCBGTE9BVAorQXMgYSByZXN1bHQsIHRva2VucyhzKSBGTE9BVCB3ZXJlIGRpc2FibGVkIGZvciB0aGF0IGlucHV0CisKKworKiBET1QgZGlhZ3JhbXMgZGlkbid0IHNob3cgZXNjYXBlZCBjaGFyIHByb3Blcmx5LgorCisqIENoYXIvc3RyaW5nIGxpdGVyYWxzIGFyZSBub3cgYWxsICdhYmMnIG5vdCAiYWJjIi4KKworKiBhY3Rpb24gc3ludGF4IGNoYW5nZWQgIkBzY29wZTo6YWN0aW9ubmFtZSB7YWN0aW9ufSIgd2hlcmUgc2NvcGUgZGVmYXVsdHMKKyAgdG8gInBhcnNlciIgaWYgcGFyc2VyIGdyYW1tYXIgb3IgY29tYmluZWQgZ3JhbW1hciwgImxleGVyIiBpZiBsZXhlciBncmFtbWFyLAorICBhbmQgInRyZWVwYXJzZXIiIGlmIHRyZWUgZ3JhbW1hci4gIFRoZSBjb2RlIGdlbmVyYXRpb24gdGFyZ2V0cyBkZWNpZGUKKyAgd2hhdCBzY29wZXMgYXJlIGF2YWlsYWJsZS4gIEVhY2ggInNjb3BlIiB5aWVsZHMgYSBoYXNodGFibGUgZm9yIHVzZSBpbgorICB0aGUgb3V0cHV0IHRlbXBsYXRlcy4gIFRoZSBzY29wZXMgZnVsbCBvZiBhY3Rpb25zIGFyZSBzZW50IHRvIGFsbCBvdXRwdXQKKyAgZmlsZSB0ZW1wbGF0ZXMgKGN1cnJlbnRseSBoZWFkZXJGaWxlIGFuZCBvdXRwdXRGaWxlKSBhcyBhdHRyaWJ1dGUgYWN0aW9ucy4KKyAgVGhlbiB5b3UgY2FuIHJlZmVyZW5jZSA8YWN0aW9ucy5zY29wZT4gdG8gZ2V0IHRoZSBtYXAgb2YgYWN0aW9ucyBhc3NvY2lhdGVkCisgIHdpdGggc2NvcGUgYW5kIDxhY3Rpb25zLnBhcnNlci5oZWFkZXI+IHRvIGdldCB0aGUgcGFyc2VyJ3MgaGVhZGVyIGFjdGlvbgorICBmb3IgZXhhbXBsZS4gIFRoaXMgc2hvdWxkIGJlIHZlcnkgZmxleGlibGUuICBUaGUgdGFyZ2V0IHNob3VsZCBvbmx5IGhhdmUKKyAgdG8gZGVmaW5lIHdoaWNoIHNjb3BlcyBhcmUgdmFsaWQsIGJ1dCB0aGUgYWN0aW9uIG5hbWVzIHNob3VsZCBiZSB2YXJpYWJsZQorICBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlY29tcGlsZSBBTlRMUiB0byBhZGQgYWN0aW9ucyB0byBjb2RlIGdlbiB0ZW1wbGF0ZXMuCisKKyAgZ3JhbW1hciBUOworICBvcHRpb25zIHtsYW5ndWFnZT1KYXZhO30KKyAgQGhlYWRlciB7IHBhY2thZ2UgZm9vOyB9CisgIEBwYXJzZXI6OnN0dWZmIHsgaW50IGk7IH0gLy8gbmFtZXMgd2l0aGluIHNjb3BlIG5vdCBjaGVja2VkOyB0YXJnZXQgZGVwZW5kZW50CisgIEBtZW1iZXJzIHsgaW50IGk7IH0KKyAgQGxleGVyOjpoZWFkZXIge2hlYWR9CisgIEBsZXhlcjo6bWVtYmVycyB7IGludCBqOyB9CisgIEBoZWFkZXJmaWxlOjpibG9ydCB7Li4ufSAvLyBlcnJvcjogdGhpcyB0YXJnZXQgZG9lc24ndCBoYXZlIGhlYWRlcmZpbGUKKyAgQHRyZWVwYXJzZXI6Om1lbWJlcnMgey4uLn0gLy8gZXJyb3I6IHRoaXMgaXMgbm90IGEgdHJlZSBwYXJzZXIKKyAgYQorICBAaW5pdCB7aW50IGk7fQorICAgIDogSUQKKyAgICA7CisgIElEIDogJ2EnLi4neic7CisKKyAgRm9yIG5vdywgdGhlIEphdmEgdGFyZ2V0IHVzZXMgbWVtYmVycyBhbmQgaGVhZGVyIGFzIGEgdmFsaWQgbmFtZS4gIFdpdGhpbiBhCisgIHJ1bGUsIHRoZSBpbml0IGFjdGlvbiBuYW1lIGlzIHZhbGlkLgorCisqIGNoYW5nZWQgJGR5bmFtaWNzY29wZS52YWx1ZSB0byAkZHluYW1pY3Njb3BlOjp2YWx1ZSBldmVuIGlmIHZhbHVlIGlzIGRlZmluZWQKKyAgaW4gc2FtZSBydWxlIHN1Y2ggYXMgJGZ1bmN0aW9uOjpuYW1lIHdoZXJlIHJ1bGUgZnVuY3Rpb24gZGVmaW5lcyBuYW1lLgorCisqICRkeW5hbWljc2NvcGUgZ2V0cyB5b3UgdGhlIHN0YWNrCisKKyogcnVsZSBzY29wZXMgZ28gbGlrZSB0aGlzIG5vdzoKKworICBydWxlCisgIHNjb3BlIHsuLi59CisgIHNjb3BlIHNsaXN0LFN5bWJvbHM7CisgIAk6IC4uLgorCTsKKworKiBDcmVhdGVkIFJ1bGVSZXR1cm5TY29wZSBhcyBhIGdlbmVyaWMgcnVsZSByZXR1cm4gdmFsdWUuICBNYWtlcyBpdCBlYXNpZXIKKyAgdG8gZG8gdGhpczoKKyAgICBSdWxlUmV0dXJuU2NvcGUgciA9IHBhcnNlci5wcm9ncmFtKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKHIuZ2V0VGVtcGxhdGUoKS50b1N0cmluZygpKTsKKworKiAkdGVtcGxhdGUsICR0cmVlLCAkc3RhcnQsIGV0Yy4uLgorCisqICRyLnggaW4gY3VycmVudCBydWxlLiAgJHIgaXMgaWdub3JlZCBhcyBmdWxseS1xdWFsaWZpZWQgbmFtZS4gJHIuc3RhcnQgd29ya3MgdG9vCisKKyogYWRkZWQgd2FybmluZyBhYm91dCAkciByZWZlcnJpbmcgdG8gYm90aCByZXR1cm4gdmFsdWUgb2YgcnVsZSBhbmQgZHluYW1pYyBzY29wZSBvZiBydWxlCisKKyogaW50ZWdyYXRlZCBTdHJpbmdUZW1wbGF0ZSBpbiBhIHZlcnkgc2ltcGxlIG1hbm5lcgorCitTeW50YXg6CistPiB0ZW1wbGF0ZShhcmdsaXN0KSAiLi4uIgorLT4gdGVtcGxhdGUoYXJnbGlzdCkgPDwuLi4+PgorLT4gbmFtZWRUZW1wbGF0ZShhcmdsaXN0KQorLT4ge2ZyZWUgZXhwcmVzc2lvbn0KKy0+IC8vIGVtcHR5CisKK1ByZWRpY2F0ZSBzeW50YXg6CithIDogQSBCIC0+IHtwMX0/IGZvbyhhPXskQS50ZXh0fSkKKyAgICAgICAgLT4ge3AyfT8gZm9vKGE9eyRCLnRleHR9KQorICAgICAgICAtPiAvLyByZXR1cm4gbm90aGluZworCitBbiBhcmcgbGlzdCBpcyBqdXN0IGEgbGlzdCBvZiB0ZW1wbGF0ZSBhdHRyaWJ1dGUgYXNzaWdubWVudHMgdG8gYWN0aW9ucyBpbiBjdXJsaWVzLgorCitUaGVyZSBpcyBhIHNldFRlbXBsYXRlTGliKCkgbWV0aG9kIGZvciB5b3UgdG8gdXNlIHdpdGggbmFtZWQgdGVtcGxhdGUgcmV3cml0ZXMuCisKK1VzZSBhIG5ldyBvcHRpb246CisKK2dyYW1tYXIgdDsKK29wdGlvbnMge291dHB1dD10ZW1wbGF0ZTt9CisuLi4KKworVGhpcyBhbGwgc2hvdWxkIHdvcmsgZm9yIHRyZWUgZ3JhbW1hcnMgdG9vLCBidXQgSSdtIHN0aWxsIHRlc3RpbmcuCisKKyogZml4ZWQgYnVncyB3aGVyZSBzdHJpbmdzIHdlcmUgaW1wcm9wZXJseSBlc2NhcGVkIGluIGV4Y2VwdGlvbnMsIGNvbW1lbnRzLCBldGMuLiAgRm9yIGV4YW1wbGUsIG5ld2xpbmVzIGNhbWUgb3V0IGFzIG5ld2xpbmVzIG5vdCB0aGUgZXNjYXBlZCB2ZXJzaW9uCisKKzMuMGVhNiAtIE5vdmVtYmVyIDEzLCAyMDA1CisKKyogdHVybmVkIG9mZiAtZGVidWcvLXByb2ZpbGUsIHdoaWNoIHdhcyBvbiBieSBkZWZhdWx0CisKKyogY29tcGxldGVseSByZWZhY3RvcmVkIHRoZSBvdXRwdXQgdGVtcGxhdGVzOyBhZGRlZCBzb21lIG1pc3NpbmcgdGVtcGxhdGVzLgorCisqIGRyYW1hdGljYWxseSBpbXByb3ZlZCBpbmZpbml0ZSByZWN1cnNpb24gZXJyb3IgbWVzc2FnZXMgKGFjdHVhbGx5CisgIGxlZnQtcmVjdXJzaW9uIG5ldmVyIGV2ZW4gd2FzIHByaW50ZWQgb3V0IGJlZm9yZSkuCisKKyogd2Fzbid0IHByaW50aW5nIGRhbmdsaW5nIHN0YXRlIG1lc3NhZ2VzIHdoZW4gaXQgcmVhbmFseXplcyB3aXRoIGs9MS4KKworKiBmaXhlZCBhIG5hc3R5IGJ1ZyBpbiB0aGUgYW5hbHlzaXMgZW5naW5lIGRlYWxpbmcgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24uCisgIFNwZW50IGFsbCBkYXkgdGhpbmtpbmcgYWJvdXQgaXQgYW5kIGNsZWFuZWQgdXAgdGhlIGNvZGUgZHJhbWF0aWNhbGx5LgorICBCdWcgZml4ZWQgYW5kIHNvZnR3YXJlIGlzIG1vcmUgcG93ZXJmdWwgYW5kIEkgdW5kZXJzdGFuZCBpdCBiZXR0ZXIhIDopCisKKyogaW1wcm92ZWQgdmVyYm9zZSBERkEgbm9kZXM7IG9yZ2FuaXplZCBieSBhbHQKKworKiBnb3QgbXVjaCBiZXR0ZXIgcmFuZG9tIHBocmFzZSBnZW5lcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisKKyAkIGphdmEgb3JnLmFudGxyLnRvb2wuUmFuZG9tUGhyYXNlIHNpbXBsZS5nIHByb2dyYW0KKyBpbnQgS3RjZG4gJzsnIG1ldGhvZCB3aCAnKCcgJyknICd7JyByZXR1cm4gNSAnOycgJ30nCisKKyogZW1wdHkgcnVsZXMgbGlrZSAiYSA6IDsiIGdlbmVyYXRlZCBjb2RlIHRoYXQgZGlkbid0IGNvbXBpbGUgZHVlIHRvCisgIHRyeS9jYXRjaCBmb3IgUmVjb2duaXRpb25FeGNlcHRpb24uICBHZW5lcmF0ZWQgY29kZSBjb3VsZG4ndCBwb3NzaWJseQorICB0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KKworKiB3aGVuIHByaW50aW5nIG91dCBhIGdyYW1tYXIsIHN1Y2ggYXMgaW4gY29tbWVudHMgaW4gZ2VuZXJhdGVkIGNvZGUsCisgIEFOVExSIGRpZG4ndCBwcmludCBhc3Qgc3VmZml4IHN0dWZmIGJhY2sgb3V0IGZvciBsaXRlcmFscy4KKworKiBUaGlzIG5ldmVyIGV4aXRlZCBsb29wOgorICBEQVRBIDogKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OiAuKiAnXG4nICkqICdcbicgJy4nIDsKKyAgYW5kIG5vdyBpdCB3b3JrcyBkdWUgdG8gbmV3IGRlZmF1bHQgbm9uZ3JlZWR5IC4qICBBbHNvIHRoaXMgd29ya3M6CisgIERBVEEgOiAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306IC4qICdcbicgKSogJy4nIDsKKworKiBEb3Qgc3RhciAiLioiIHN5bnRheCBkaWRuJ3Qgd29yazsgaW4gbGV4ZXIgaXQgaXMgbm9uZ3JlZWR5IGJ5CisgIGRlZmF1bHQuICBJbiBwYXJzZXIgaXQgaXMgb24gZ3JlZWR5IGJ1dCBhbHNvIGs9MSBieSBkZWZhdWx0LiAgQWRkZWQKKyAgdW5pdCB0ZXN0cy4gIEFkZGVkIGJsb2cgZW50cnkgdG8gZGVzY3JpYmUuCisKKyogflQgd2hlcmUgVCBpcyB0aGUgb25seSB0b2tlbiB5aWVsZGVkIGFuIGVtcHR5IHNldCBidXQgbm8gZXJyb3IKKworKiBVc2VkIHRvIGdlbmVyYXRlIHVucmVhY2hhYmxlIG1lc3NhZ2UgaGVyZToKKworICBwYXJzZXIgZ3JhbW1hciB0OworICBhIDogSUQgYQorICAgIHwgSUQKKyAgICA7CisKKyAgei5nOjM6MTE6IFRoZSBmb2xsb3dpbmcgYWx0ZXJuYXRpdmVzIGFyZSB1bnJlYWNoYWJsZTogMgorCisgIEluIGZhY3QgaXQgc2hvdWxkIHJlYWxseSBiZSBhbiBlcnJvcjsgbm93IGl0IGdlbmVyYXRlczoKKworICBubyBzdGFydCBydWxlIGluIGdyYW1tYXIgdCAobm8gcnVsZSBjYW4gb2J2aW91c2x5IGJlIGZvbGxvd2VkIGJ5IEVPRikKKworICBQZXIgbmV4dCBjaGFuZ2UgaXRlbSwgQU5UTFIgY2Fubm90IGtub3cgdGhhdCBFT0YgZm9sbG93cyBydWxlICdhJy4KKworKiBhZGRlZCBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCBBTlRMUiBjYW4ndCBmaWd1cmUgb3V0IHdoYXQgeW91cgorICBzdGFydCBydWxlIGlzLiAgUmVxdWlyZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgY29kZSBpbiBzb21lIGNhc2VzLgorCisqIHZhbGlkYXRpbmcgc2VtYW50aWMgcHJlZGljYXRlcyBub3cgd29yayAoaWYgdGhleSBhcmUgZmFsc2UsIHRoZXkKKyAgdGhyb3cgYSBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uCisKKyogdHdvIGhpZGVvdXMgYnVnIGZpeGVzIGluIHRoZSBJbnRlcnZhbFNldCwgd2hpY2ggbWFkZSBhbmFseXNpcyBnbyB3cm9uZworICBpbiBhIGZldyBjYXNlcy4gIFRoYW5rcyB0byBPbGl2ZXIgWmVpZ2VybWFubiBmb3IgZmluZGluZyBsb3RzIG9mIGJ1Z3MKKyAgYW5kIG1ha2luZyBzdWdnZXN0ZWQgZml4ZXMgKGluY2x1ZGluZyB0aGUgbmV4dCB0d28gaXRlbXMpIQorCisqIGN5Y2xpYyBERkFzIGFyZSBub3cgbm9uc3RhdGljIGFuZCBoZW5jZSBjYW4gYWNjZXNzIGluc3RhbmNlIHZhcmlhYmxlcworCisqIGxhYmVscyBhcmUgbm93IGFsbG93ZWQgb24gbGV4aWNhbCBlbGVtZW50cyAoaW4gdGhlIGxleGVyKQorCisqIGFkZGVkIHNvbWUgaW50ZXJuYWwgZGVidWdnaW5nIG9wdGlvbnMKKworKiB+J2EnKiBhbmQgfignYScpKiB3ZXJlIG5vdCB3b3JraW5nIHByb3Blcmx5OyByZWZhY3RvcmVkIGFudGxyLmcgZ3JhbW1hcgorCiszLjBlYTUgLSBKdWx5IDUsIDIwMDUKKworKiBVc2luZyAnXG4nIGluIGEgcGFyc2VyIGdyYW1tYXIgcmVzdWx0ZWQgaW4gYSBub25lc2NhcGVkIHZlcnNpb24gb2YgJ1xuJyBpbiB0aGUgdG9rZW4gbmFtZXMgdGFibGUgbWFraW5nIGNvbXBpbGF0aW9uIGZhaWwuICBJIGZpeGVkIHRoaXMgYnkgcmVvcmdhbml6aW5nL2NsZWFuaW5nIHVwIHBvcnRpb24gb2YgQU5UTFIgdGhhdCBkZWFscyB3aXRoIGxpdGVyYWxzLiAgU2VlIGNvbW1lbnQgb3JnLmFudGxyLmNvZGVnZW4uVGFyZ2V0LgorCisqIFRhcmdldC5nZXRNYXhDaGFyVmFsdWUoKSBkaWQgbm90IHVzZSB0aGUgYXBwcm9wcmlhdGUgbWF4IHZhbHVlIGNvbnN0YW50LgorCisqIEFMTENIQVIgd2FzIGEgY29uc3RhbnQgd2hlbiBpdCBzaG91bGQgdXNlIHRoZSBUYXJnZXQgbWF4IHZhbHVlIGRlZi4gIHNldCBjb21wbGVtZW50IGZvciB3aWxkY2FyZCBhbHNvIGRpZG4ndCB1c2UgdGhlIFRhcmdldCBkZWYuICBHZW5lcmFsbHkgY2xlYW5lZCB1cCB0aGUgbWF4IGNoYXIgdmFsdWUgc3R1ZmYuCisKKyogQ29kZSBnZW4gZGlkbid0IGRlYWwgd2l0aCBBU1RMYWJlbFR5cGUgcHJvcGVybHkuLi5JIHRoaW5rIGV2ZW4gdGhlIDMuMGVhNyBleGFtcGxlIHRyZWUgcGFyc2VyIHdhcyBicm9rZW4hIDooCisKKyogQWRkZWQgYSBmZXcgbW9yZSB1bml0IHRlc3RzIGRlYWxpbmcgd2l0aCBlc2NhcGVkIGxpdGVyYWxzCisKKzMuMGVhNCAtIEp1bmUgMjksIDIwMDUKKworKiB0cmVlIHBhcnNlcnMgd29yazsgYWRkZWQgQ29tbW9uVHJlZU5vZGVTdHJlYW0uICBTZWUgc2ltcGxlY1RyZWVQYXJzZXIKKyAgZXhhbXBsZSBpbiBleGFtcGxlcy12MyB0YXJiYWxsLgorCisqIGFkZGVkIHN1cGVyQ2xhc3MgYW5kIEFTVExhYmVsVHlwZSBvcHRpb25zCisKKyogcmVmYWN0b3JlZCBQYXJzZXIgdG8gaGF2ZSBhIEJhc2VQYXJzZXIgYW5kIGFkZGVkIFRyZWVQYXJzZXIKKworKiBidWcgZml4OiBhY3Rpb25zIGJlaW5nIGR1bXBlZCBpbiBkZXNjcmlwdGlvbiBzdHJpbmdzOyBjb21waWxlIGVycm9ycworICByZXN1bHRlZAorCiszLjBlYTMgLSBKdW5lIDIzLCAyMDA1CisKK0VuaGFuY2VtZW50cworCisqIEF1dG9tYXRpYyB0cmVlIGNvbnN0cnVjdGlvbiBvcGVyYXRvcnMgYXJlIGluOiAhIF4gXl4KKworKiBUcmVlIGNvbnN0cnVjdGlvbiByZXdyaXRlIHJ1bGVzIGFyZSBpbgorCS0+IHtwcmVkMX0/IHJld3JpdGUxCisJLT4ge3ByZWQyfT8gcmV3cml0ZTIKKwkuLi4KKwktPiByZXdyaXRlTgorCisgIFRoZSByZXdyaXRlIHJ1bGVzIG1heSBiZSBlbGVtZW50cyBsaWtlIElELCBleHByLCAkbGFiZWwsIHtub2RlIGV4cHJ9CisgIGFuZCB0cmVlcyBeKCA8cm9vdD4gPGNoaWxkcmVuPiApLiAgWW91IGhhdmUgaGF2ZSAoLi4uKT8sICguLi4pKiwgKC4uLikrCisgIHN1YnJ1bGVzIGFzIHdlbGwuCisKKyAgWW91IG1heSBoYXZlIHJld3JpdGVzIGluIHN1YnJ1bGVzIG5vdCBqdXN0IGF0IG91dGVyIGxldmVsIG9mIHJ1bGUsIGJ1dAorICBhbnkgLT4gcmV3cml0ZSBmb3JjZXMgYXV0byBBU1QgY29uc3RydWN0aW9uIG9mZiBmb3IgdGhhdCBhbHRlcm5hdGl2ZQorICBvZiB0aGF0IHJ1bGUuCisKKyAgVG8gYXZvaWQgY3ljbGVzLCBjb3B5IHNlbWFudGljcyBhcmUgdXNlZDoKKworICByIDogSU5UIC0+IElOVCBJTlQgOworCisgIG1lYW5zIG1ha2UgdHdvIG5ldyBub2RlcyBmcm9tIHRoZSBzYW1lIElOVCB0b2tlbi4KKworICBSZXBlYXRlZCByZWZlcmVuY2VzIHRvIGEgcnVsZSBlbGVtZW50IGltcGxpZXMgYSBjb3B5IGZvciBhdCBsZWFzdCBvbmUKKyAgdHJlZToKKworICBhIDogYXRvbSAtPiBeKGF0b20gYXRvbSkgOyAvLyBOT1QgQ1lDTEUhIChkdXAgYXRvbSB0cmVlKQorCisqICRydWxlTGFiZWwudHJlZSByZWZlcnMgdG8gdHJlZSBjcmVhdGVkIGJ5IG1hdGNoaW5nIHRoZSBsYWJlbGVkIGVsZW1lbnQuCisKKyogQSBkZXNjcmlwdGlvbiBvZiB0aGUgYmxvY2tzL2FsdHMgaXMgZ2VuZXJhdGVkIGFzIGEgY29tbWVudCBpbiBvdXRwdXQgY29kZQorCisqIEEgdGltZXN0YW1wIC8gc2lnbmF0dXJlIGlzIHB1dCBhdCB0b3Agb2YgZWFjaCBnZW5lcmF0ZWQgY29kZSBmaWxlCisKKzMuMGVhMiAtIEp1bmUgMTIsIDIwMDUKKworQnVnIGZpeGVzCisKKyogU29tZSBlcnJvciBtZXNzYWdlcyB3ZXJlIG1pc3NpbmcgdGhlIHN0YWNrVHJhY2UgcGFyYW1ldGVyCisKKyogUmVtb3ZlZCB0aGUgZmlsZSBsb2NraW5nIG1lY2hhbmlzbSBhcyBpdCdzIG5vdCBjcm9zcyBwbGF0Zm9ybQorCisqIFNvbWUgYWJzb2x1dGUgdnMgcmVsYXRpdmUgcGF0aCBuYW1lIHByb2JsZW1zIHdpdGggd3JpdGluZyBvdXRwdXQKKyAgZmlsZXMuICBSdWxlcyBhcmUgbm93IG1vcmUgY29uY3JldGUuICAtbyBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZQorICAvLyAtbyAvdG1wIC92YXIvbGliL3QuZyA9PiAvdG1wL1QuamF2YQorICAvLyAtbyBzdWJkaXIvb3V0cHV0IC91c3IvbGliL3QuZyA9PiBzdWJkaXIvb3V0cHV0L1QuamF2YQorICAvLyAtbyAuIC91c3IvbGliL3QuZyA9PiAuL1QuamF2YQorICAvLyAtbyAvdG1wIHN1YmRpci90LmcgPT4gL3RtcC9zdWJkaXIvdC5nCisgIC8vIElmIHRoZXkgZGlkbid0IHNwZWNpZnkgYSAtbyBkaXIgc28ganVzdCB3cml0ZSB0byBsb2NhdGlvbgorICAvLyB3aGVyZSBncmFtbWFyIGlzLCBhYnNvbHV0ZSBvciByZWxhdGl2ZQorCisqIGRvZXMgZXJyb3IgY2hlY2tpbmcgb24gdW5rbm93biBvcHRpb24gbmFtZXMgbm93CisKKyogVXNpbmcganVzdCBsYW5ndWFnZSBjb2RlIG5vdCBsb2NhbGUgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZSBmaWxlLiAgSS5lLiwKKyAgdGhlIGRlZmF1bHQgKGFuZCBmb3IgYW55IEVuZ2xpc2ggc3BlYWtpbmcgbG9jYWxlKSBpcyBlbi5zdGcgbm90IGVuX1VTLnN0ZworICBhbnltb3JlLgorCisqIFRoZSBlcnJvciBtYW5hZ2VyIG5vdyBhc2tzIHRoZSBUb29sIHRvIHBhbmljIHJhdGhlciB0aGFuIHNpbXBseSBkb2luZworICBhIFN5c3RlbS5leGl0KCkuCisKKyogTG90cyBvZiByZWZhY3RvcmluZyBjb25jZXJuaW5nIGdyYW1tYXIsIHJ1bGUsIHN1YnJ1bGUgb3B0aW9ucy4gIE5vdworICBkZXRlY3RzIGludmFsaWQgb3B0aW9ucy4KKworMy4wZWExIC0gSnVuZSAxLCAyMDA1CisKK0luaXRpYWwgZWFybHkgYWNjZXNzIHJlbGVhc2UKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL0xJQ0VOU0UudHh0IGIvYW50bHItMy40L3Rvb2wvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjYzk3MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjYgQEAKK1tUaGUgIkJTRCBsaWNlbnNlIl0KK0NvcHlyaWdodCAoYykgMjAxIFRlcmVuY2UgUGFycgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9SRUFETUUudHh0IGIvYW50bHItMy40L3Rvb2wvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVlMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvUkVBRE1FLnR4dApAQCAtMCwwICsxLDEzOSBAQAorQU5UTFIgdjMuNAorSnVseSAxOCwgMjAxMQorCitUZXJlbmNlIFBhcnIsIHBhcnJ0IGF0IGNzIHVzZmNhIGVkdQorQU5UTFIgcHJvamVjdCBsZWFkIGFuZCBzdXByZW1lIGRpY3RhdG9yIGZvciBsaWZlCitVbml2ZXJzaXR5IG9mIFNhbiBGcmFuY2lzY28KKworSU5UUk9EVUNUSU9OCisKK1dlbGNvbWUgdG8gQU5UTFIgdjMhICBBTlRMUiAoQU5vdGhlciBUb29sIGZvciBMYW5ndWFnZSBSZWNvZ25pdGlvbikgaXMKK2EgbGFuZ3VhZ2UgdG9vbCB0aGF0IHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBjb25zdHJ1Y3RpbmcKK3JlY29nbml6ZXJzLCBpbnRlcnByZXRlcnMsIGNvbXBpbGVycywgYW5kIHRyYW5zbGF0b3JzIGZyb20gZ3JhbW1hdGljYWwKK2Rlc2NyaXB0aW9ucyBjb250YWluaW5nIGFjdGlvbnMgaW4gYSB2YXJpZXR5IG9mIHRhcmdldAorbGFuZ3VhZ2VzLiBBTlRMUiBwcm92aWRlcyBleGNlbGxlbnQgc3VwcG9ydCBmb3IgdHJlZSBjb25zdHJ1Y3Rpb24sCit0cmVlIHdhbGtpbmcsIHRyYW5zbGF0aW9uLCBlcnJvciByZWNvdmVyeSwgYW5kIGVycm9yIHJlcG9ydGluZy4gSSd2ZQorYmVlbiB3b3JraW5nIG9uIHBhcnNlciBnZW5lcmF0b3JzIGZvciAyMCB5ZWFycyBhbmQgb24gdGhpcyBwYXJ0aWN1bGFyCit2ZXJzaW9uIG9mIEFOVExSIGZvciA3IHllYXJzLgorCitZb3Ugc2hvdWxkIHVzZSB2MyBpbiBjb25qdW5jdGlvbiB3aXRoIEFOVExSV29ya3M6CisKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy93b3Jrcy9pbmRleC5odG1sCisKK2FuZCBnVW5pdCAoZ3JhbW1hciB1bml0IHRlc3RpbmcgdG9vbCBpbmNsdWRlZCBpbiBkaXN0cmlidXRpb24pOgorCisgICAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9nVW5pdCstK0dyYW1tYXIrVW5pdCtUZXN0aW5nCisKK1RoZSBib29rIHdpbGwgYWxzbyBoZWxwIHlvdSBhIGdyZWF0IGRlYWwgKHByaW50ZWQgTWF5IDE1LCAyMDA3KTsgeW91CitjYW4gYWxzbyBidXkgdGhlIFBERjoKKworICAgIGh0dHA6Ly93d3cucHJhZ21hdGljcHJvZ3JhbW1lci5jb20vdGl0bGVzL3RwYW50bHIvaW5kZXguaHRtbAorCisybmQgYm9vaywgTGFuZ3VhZ2UgSW1wbGVtZW50YXRpb24gUGF0dGVybnM6CisKKyAgICBodHRwOi8vcHJhZ3Byb2cuY29tL3RpdGxlcy90cGRzbC9sYW5ndWFnZS1pbXBsZW1lbnRhdGlvbi1wYXR0ZXJucworCitTZWUgdGhlIGdldHRpbmcgc3RhcnRlZCBkb2N1bWVudDoKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvRkFRKy0rR2V0dGluZytTdGFydGVkCisKK1lvdSBhbHNvIGhhdmUgdGhlIGV4YW1wbGVzIHBsdXMgdGhlIHNvdXJjZSB0byBndWlkZSB5b3UuCisKK1NlZSB0aGUgd2lraSBGQVE6CisKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy93aWtpL2Rpc3BsYXkvQU5UTFIzL0FOVExSK3YzK0ZBUQorCithbmQgZ2VuZXJhbCBkb2Mgcm9vdDoKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvQU5UTFIrMytXaWtpK0hvbWUKKworUGxlYXNlIGhlbHAgYWRkL3VwZGF0ZSBGQVEgZW50cmllcy4KKworSWYgYWxsIGVsc2UgZmFpbHMsIHlvdSBjYW4gYnV5IHN1cHBvcnQgb3IgYXNrIHRoZSBhbnRsci1pbnRlcmVzdCBsaXN0OgorCisgICAgaHR0cDovL3d3dy5hbnRsci5vcmcvc3VwcG9ydC5odG1sCisKK1BlciB0aGUgbGljZW5zZSBpbiBMSUNFTlNFLnR4dCwgdGhpcyBzb2Z0d2FyZSBpcyBub3QgZ3VhcmFudGVlZCB0bword29yayBhbmQgbWlnaHQgZXZlbiBkZXN0cm95IGFsbCBsaWZlIG9uIHRoaXMgcGxhbmV0OgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKK0lORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCitTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKK1NUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFWEFNUExFUworCitBTlRMUiB2MyBzYW1wbGUgZ3JhbW1hcnM6CisKKyAgICBodHRwOi8vd3d3LmFudGxyLm9yZy9kb3dubG9hZC9leGFtcGxlcy12My50YXIuZ3oKKworRXhhbXBsZXMgZnJvbSBMYW5ndWFnZSBJbXBsZW1lbnRhdGlvbiBQYXR0ZXJuczoKKworICAgIGh0dHA6Ly93d3cucHJhZ3Byb2cuY29tL3RpdGxlcy90cGRzbC9zb3VyY2VfY29kZQorCitBbHNvIGNoZWNrIG91dCBNYW50cmEgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgZm9yIGEgcHJvdG90eXBlICh3b3JrIGluCitwcm9ncmVzcykgdXNpbmcgdjM6CisKKyAgICBodHRwOi8vd3d3Lmxpbmd1YW1hbnRyYS5vcmcvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdCBpcyBBTlRMUj8KKworQU5UTFIgc3RhbmRzIGZvciAoQU4pb3RoZXIgKFQpb29sIGZvciAoTClhbmd1YWdlIChSKWVjb2duaXRpb24KK2FuZCBnZW5lcmF0ZXMgTEwoKikgcmVjdXJzaXZlLWRlc2NlbnQgcGFyc2Vycy4gQU5UTFIgaXMgYSBsYW5ndWFnZSB0b29sCit0aGF0IHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBjb25zdHJ1Y3RpbmcgcmVjb2duaXplcnMsIGNvbXBpbGVycywgYW5kCit0cmFuc2xhdG9ycyBmcm9tIGdyYW1tYXRpY2FsIGRlc2NyaXB0aW9ucyBjb250YWluaW5nIGFjdGlvbnMuCitUYXJnZXQgbGFuZ3VhZ2UgbGlzdDoKKworaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9Db2RlK0dlbmVyYXRpb24rVGFyZ2V0cworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hvdyBpcyBBTlRMUiB2MyBkaWZmZXJlbnQgdGhhbiBBTlRMUiB2Mj8KKworU2VlICJXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gQU5UTFIgdjIgYW5kIHYzPyIKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvcGFnZXMvdmlld3BhZ2UuYWN0aW9uP3BhZ2VJZD03MTkKKworU2VlIG1pZ3JhdGlvbiBndWlkZToKKworICAgIGh0dHA6Ly93d3cuYW50bHIub3JnL3dpa2kvZGlzcGxheS9BTlRMUjMvTWlncmF0aW5nK2Zyb20rQU5UTFIrMit0bytBTlRMUiszCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSG93IGRvIEkgaW5zdGFsbCB0aGlzIGRhbW4gdGhpbmc/CisKK0p1c3QgdW50YXIgYW50bHItMy40LnRhci5neiBhbmQgeW91J2xsIGdldDoKKworYW50bHItMy40L0JVSUxELnR4dAorYW50bHItMy40L2FudGxyMy1tYXZlbi1wbHVnaW4KK2FudGxyLTMuNC9hbnRscmphci54bWwKK2FudGxyLTMuNC9hbnRscnNvdXJjZXMueG1sCithbnRsci0zLjQvZ3VuaXQKK2FudGxyLTMuNC9ndW5pdC1tYXZlbi1wbHVnaW4KK2FudGxyLTMuNC9wb20ueG1sCithbnRsci0zLjQvcnVudGltZQorYW50bHItMy40L3Rvb2wKK2FudGxyLTMuNC9saWIKKworVGhpcyBpcyB0aGUgc291cmNlIGFuZCBqYXZhIGJpbmFyaWVzLiAgWW91IGNvdWxkIGdyYWIgdGhlCithbnRsci0zLjQtY29tcGxldGUuamFyIGZpbGUgZnJvbSB0aGUgd2Vic2l0ZSwgYnV0IGl0J3MgaW4gbGliIGRpci4KK0l0IGhhcyBhbGwgb2YgdGhlIGphcnMgeW91IG5lZWQgY29tYmluZWQgaW50byBvbmUuIFRoZW4geW91IG5lZWQgdG8KK2FkZCBhbnRsci0zLjQtY29tcGxldGUuamFyIHRvIHlvdXIgQ0xBU1NQQVRIIG9yIGFkZAordG8gYXJnIGxpc3Q7IGUuZy4sIG9uIHVuaXg6CisKKyQgamF2YSAtY3AgIi91c3IvbG9jYWwvbGliL2FudGxyLTMuNC1jb21wbGV0ZS5qYXI6JENMQVNTUEFUSCIgb3JnLmFudGxyLlRvb2wgVGVzdC5nCisKK1BsZWFzZSBzZWUgdGhlIEZBUQorCisgICAgaHR0cDovL3d3dy5hbnRsci5vcmcvd2lraS9kaXNwbGF5L0FOVExSMy9BTlRMUit2MytGQVEKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL2FudGxyLmNvbmZpZyBiL2FudGxyLTMuNC90b29sL2FudGxyLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvYW50bHIuY29uZmlnCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9wb20ueG1sIGIvYW50bHItMy40L3Rvb2wvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGMzODcxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvcG9tLnhtbApAQCAtMCwwICsxLDExOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+YW50bHI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5BTlRMUiBHcmFtbWFyIFRvb2wgdiAzLjQ8L25hbWU+CisgICAgPHVybD5odHRwOi8vYW50bHIub3JnPC91cmw+CisKKworICA8IS0tCisKKyAgICBJbmhlcml0IGZyb20gdGhlIEFOVExSIG1hc3RlciBwb20sIHdoaWNoIHRlbGxzIHVzIHdoYXQKKyAgICB2ZXJzaW9uIHdlIGFyZSBhbmQgYWxsb3dzIHVzIHRvIGluaGVyaXQgZGVwZW5kZW5jaWVzCisgICAgYW5kIHNvIG9uLgorCisgICAgLS0+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbnRsci1tYXN0ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICAKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnViZXI8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT51YmVyPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICAKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRsci1ydW50aW1lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC44LjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+U1Q0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC4wLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIAorICAgIDwvZGVwZW5kZW5jaWVzPgorICA8IS0tCisKKyAgICBUZWxsIE1hdmVuIHdoaWNoIG90aGVyIGFydGlmYWN0cyB3ZSBuZWVkIGluIG9yZGVyIHRvCisgICAgYnVpbGQsIHJ1biBhbmQgdGVzdCB0aGUgQU5UTFIgVG9vbC4gVGhlIEFOVExSIFRvb2wgdXNlcyBlYXJsaWVyIHZlcnNpb25zCisgICAgb2YgQU5UTFIgYXQgcnVudGltZSAoZm9yIHRoZSBtb21lbnQpLCB1c2VzIHRoZSBjdXJyZW50CisgICAgcmVsZWFzZWQgdmVyc2lvbiBvZiBBTlRMUiBTdHJpbmcgdGVtcGxhdGUsIGJ1dCBvYnZpb3VzbHkgaXMKKyAgICByZWxpYW50IG9uIHRoZSBsYXRlc3Qgc25hcHNob3Qgb2YgdGhlIHJ1bnRpbWUsIHdoaWNoIHdpbGwgZWl0aGVyIGJlCisgICAgdGFrZW4gZnJvbSB0aGUgYW50bHItc25hcHNob3QgcmVwb3NpdG9yeSwgb3IgeW91ciBsb2NhbCAubTIKKyAgICByZXBvc2l0b3J5IGlmIHlvdSBidWlsdCBhbmQgaW5zdGFsbGVkIHRoYXQgbG9jYWxseS4KKworICAgIC0tPgorCisKKyAgICA8YnVpbGQ+CisKKyAgICAgICAgPGRlZmF1bHRHb2FsPmluc3RhbGw8L2RlZmF1bHRHb2FsPgorCisgICAgICAgIDxwbHVnaW5zPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGxpYkRpcmVjdG9yeT50YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvYW50bHIvb3JnL2FudGxyL2dyYW1tYXIvdjM8L2xpYkRpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YW50bHI8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+anNyMTQ8L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworCisgICAgICAgICAgICAKKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9BTlRMUi5nIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0FOVExSLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0ZTYwYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9BTlRMUi5nCkBAIC0wLDAgKzEsMTM1MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIEdyYW1tYXIgY29udmVyc2lvbiB0byBBTlRMUiB2MzoKKyBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworCWRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIFJlYWQgaW4gYW4gQU5UTFIgZ3JhbW1hciBhbmQgYnVpbGQgYW4gQVNULiAgVHJ5IG5vdCB0byBkbworICogIGFueSBhY3Rpb25zLCBqdXN0IGJ1aWxkIHRoZSB0cmVlLgorICoKKyAqICBUaGUgcGhhc2VzIGFyZToKKyAqCisgKgkJYW50bHIuZyAodGhpcyBmaWxlKQorICoJCWFzc2lnbi50eXBlcy5nCisgKgkJZGVmaW5lLmcKKyAqCQlidWlsZG5mYS5nCisgKgkJYW50bHIucHJpbnQuZyAob3B0aW9uYWwpCisgKgkJY29kZWdlbi5nCisgKgorICogIFRlcmVuY2UgUGFycgorICogIFVuaXZlcnNpdHkgb2YgU2FuIEZyYW5jaXNjbworICogIDIwMDUKKyAqLworCitncmFtbWFyIEFOVExSOworCitvcHRpb25zCit7CisJb3V0cHV0PUFTVDsKKwlBU1RMYWJlbFR5cGU9R3JhbW1hckFTVDsKK30KKwordG9rZW5zCit7CisJLy9PUFRJT05TPSdvcHRpb25zJzsKKwkvL1RPS0VOUz0ndG9rZW5zJzsKKwlMRVhFUj0nbGV4ZXInOworCVBBUlNFUj0ncGFyc2VyJzsKKwlDQVRDSD0nY2F0Y2gnOworCUZJTkFMTFk9J2ZpbmFsbHknOworCUdSQU1NQVI9J2dyYW1tYXInOworCVBSSVZBVEU9J3ByaXZhdGUnOworCVBST1RFQ1RFRD0ncHJvdGVjdGVkJzsKKwlQVUJMSUM9J3B1YmxpYyc7CisJUkVUVVJOUz0ncmV0dXJucyc7CisJVEhST1dTPSd0aHJvd3MnOworCVRSRUU9J3RyZWUnOworCisJUlVMRTsKKwlQUkVDX1JVTEU7CisJUkVDVVJTSVZFX1JVTEVfUkVGOyAvLyBmbGlwIHJlY3Vyc2l2ZSBSVUxFX1JFRiB0byBSRUNVUlNJVkVfUlVMRV9SRUYgaW4gcHJlYyBydWxlcworCUJMT0NLOworCU9QVElPTkFMOworCUNMT1NVUkU7CisJUE9TSVRJVkVfQ0xPU1VSRTsKKwlTWU5QUkVEOworCVJBTkdFOworCUNIQVJfUkFOR0U7CisJRVBTSUxPTjsKKwlBTFQ7CisJRU9SOworCUVPQjsKKwlFT0E7IC8vIGVuZCBvZiBhbHQKKwlJRDsKKwlBUkc7CisJQVJHTElTVDsKKwlSRVQ7CisJTEVYRVJfR1JBTU1BUjsKKwlQQVJTRVJfR1JBTU1BUjsKKwlUUkVFX0dSQU1NQVI7CisJQ09NQklORURfR1JBTU1BUjsKKwlJTklUQUNUSU9OOworCUZPUkNFRF9BQ1RJT047IC8vIHt7Li4ufX0gYWx3YXlzIGV4ZWMgZXZlbiBkdXJpbmcgc3luIHByZWRzCisJTEFCRUw7IC8vICR4IHVzZWQgaW4gcmV3cml0ZSBydWxlcworCVRFTVBMQVRFOworCVNDT1BFPSdzY29wZSc7CisJSU1QT1JUPSdpbXBvcnQnOworCUdBVEVEX1NFTVBSRUQ7IC8vIHtwfT8gPT4KKwlTWU5fU0VNUFJFRDsgLy8gKC4uLikgPT4gICBpdCdzIGEgbWFudWFsbHktc3BlY2lmaWVkIHN5bnByZWQgY29udmVydGVkIHRvIHNlbXByZWQKKwlCQUNLVFJBQ0tfU0VNUFJFRDsgLy8gYXV0byBiYWNrdHJhY2tpbmcgbW9kZSBzeW4gcHJlZCBjb252ZXJ0ZWQgdG8gc2VtcHJlZAorCUZSQUdNRU5UPSdmcmFnbWVudCc7CisJRE9UOworCVJFV1JJVEVTOworfQorCitAbGV4ZXI6OmhlYWRlciB7CitwYWNrYWdlIG9yZy5hbnRsci5ncmFtbWFyLnYzOworaW1wb3J0IG9yZy5hbnRsci50b29sLkVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworfQorCitAcGFyc2VyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3JhbW1hci52MzsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5FcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyQVNUOworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludFNldDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5SdWxlOworfQorCitAbGV4ZXI6Om1lbWJlcnMgeworcHVibGljIGJvb2xlYW4gaGFzQVNUT3BlcmF0b3IgPSBmYWxzZTsKK3ByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOworCitwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgIHJldHVybiBmaWxlTmFtZTsKK30KKworcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIHZhbHVlKSB7CisgICAgZmlsZU5hbWUgPSB2YWx1ZTsKK30KK30KKworQHBhcnNlcjo6bWVtYmVycyB7Citwcm90ZWN0ZWQgU3RyaW5nIGN1cnJlbnRSdWxlTmFtZSA9IG51bGw7Citwcm90ZWN0ZWQgR3JhbW1hckFTVCBjdXJyZW50QmxvY2tBU1QgPSBudWxsOworcHJvdGVjdGVkIGJvb2xlYW4gYXRUcmVlUm9vdDsgLy8gYXJlIHdlIG1hdGNoaW5nIGEgdHJlZSByb290IGluIHRyZWUgZ3JhbW1hcj8KKworcHVibGljIHN0YXRpYyBBTlRMUlBhcnNlciBjcmVhdGVQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQpIHsKKyAgICBBTlRMUlBhcnNlciBwYXJzZXIgPSBuZXcgQU5UTFJQYXJzZXIoaW5wdXQpOworICAgIHBhcnNlci5hZGFwdG9yID0gbmV3IGdyYW1tYXJfQWRhcHRvcihwYXJzZXIpOworICAgIHJldHVybiBwYXJzZXI7Cit9CisKK3ByaXZhdGUgc3RhdGljIGNsYXNzIEdyYW1tYXJBU1RFcnJvck5vZGUgZXh0ZW5kcyBHcmFtbWFyQVNUIHsKKyAgICBwdWJsaWMgSW50U3RyZWFtIGlucHV0OworICAgIHB1YmxpYyBUb2tlbiBzdGFydDsKKyAgICBwdWJsaWMgVG9rZW4gc3RvcDsKKyAgICBwdWJsaWMgUmVjb2duaXRpb25FeGNlcHRpb24gdHJhcHBlZEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBHcmFtbWFyQVNURXJyb3JOb2RlKFRva2VuU3RyZWFtIGlucHV0LCBUb2tlbiBzdGFydCwgVG9rZW4gc3RvcCwgUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICBzdXBlcihzdG9wKTsKKyAgICAgICAgLy9Db25zb2xlLk91dC5Xcml0ZUxpbmUoICJzdGFydDogIiArIHN0YXJ0ICsgIiwgc3RvcDogIiArIHN0b3AgKTsKKyAgICAgICAgaWYgKCBzdG9wID09IG51bGwgfHwKKyAgICAgICAgICAgICAoIHN0b3AuZ2V0VG9rZW5JbmRleCgpIDwgc3RhcnQuZ2V0VG9rZW5JbmRleCgpICYmCisgICAgICAgICAgICAgIHN0b3AuZ2V0VHlwZSgpICE9IFRva2VuLkVPRikgKSB7CisgICAgICAgICAgICAvLyBzb21ldGltZXMgcmVzeW5jIGRvZXMgbm90IGNvbnN1bWUgYSB0b2tlbiAod2hlbiBMVCgxKSBpcworICAgICAgICAgICAgLy8gaW4gZm9sbG93IHNldC4gIFNvLCBzdG9wIHdpbGwgYmUgMSB0byBsZWZ0IHRvIHN0YXJ0LiBhZGp1c3QuCisgICAgICAgICAgICAvLyBBbHNvIGhhbmRsZSBjYXNlIHdoZXJlIHN0YXJ0IGlzIHRoZSBmaXJzdCB0b2tlbiBhbmQgbm8gdG9rZW4KKyAgICAgICAgICAgIC8vIGlzIGNvbnN1bWVkIGR1cmluZyByZWNvdmVyeTsgTFQoLTEpIHdpbGwgcmV0dXJuIG51bGwuCisgICAgICAgICAgICBzdG9wID0gc3RhcnQ7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIHRoaXMuc3RvcCA9IHN0b3A7CisgICAgICAgIHRoaXMudHJhcHBlZEV4Y2VwdGlvbiA9IGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNOaWwoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKKyAgICB7CisgICAgICAgIFN0cmluZyBiYWRUZXh0ID0gbnVsbDsKKyAgICAgICAgaWYgKHN0YXJ0IGluc3RhbmNlb2YgVG9rZW4pIHsKKyAgICAgICAgICAgIGludCBpID0gKChUb2tlbilzdGFydCkuZ2V0VG9rZW5JbmRleCgpOworICAgICAgICAgICAgaW50IGogPSAoKFRva2VuKXN0b3ApLmdldFRva2VuSW5kZXgoKTsKKyAgICAgICAgICAgIGlmICgoKFRva2VuKXN0b3ApLmdldFR5cGUoKSA9PSBUb2tlbi5FT0YpIHsKKyAgICAgICAgICAgICAgICBqID0gKChUb2tlblN0cmVhbSlpbnB1dCkuc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFkVGV4dCA9ICgoVG9rZW5TdHJlYW0paW5wdXQpLnRvU3RyaW5nKGksIGopOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0IGluc3RhbmNlb2YgVHJlZSkgeworICAgICAgICAgICAgYmFkVGV4dCA9ICgoVHJlZU5vZGVTdHJlYW0paW5wdXQpLnRvU3RyaW5nKHN0YXJ0LCBzdG9wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBlb3BsZSBzaG91bGQgc3ViY2xhc3MgaWYgdGhleSBhbHRlciB0aGUgdHJlZSB0eXBlIHNvIHRoaXMKKyAgICAgICAgICAgIC8vIG5leHQgb25lIGlzIGZvciBzdXJlIGNvcnJlY3QuCisgICAgICAgICAgICBiYWRUZXh0ID0gIjx1bmtub3duPiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhZFRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFOyB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB2YWx1ZSkgeyB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICh0cmFwcGVkRXhjZXB0aW9uIGluc3RhbmNlb2YgTWlzc2luZ1Rva2VuRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIjxtaXNzaW5nIHR5cGU6ICIgKworICAgICAgICAgICAgICAgICAgICggKE1pc3NpbmdUb2tlbkV4Y2VwdGlvbil0cmFwcGVkRXhjZXB0aW9uICkuZ2V0TWlzc2luZ1R5cGUoKSArCisgICAgICAgICAgICAgICAgICAgIj4iOworICAgICAgICB9IGVsc2UgaWYgKHRyYXBwZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBVbndhbnRlZFRva2VuRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gIjxleHRyYW5lb3VzOiAiICsKKyAgICAgICAgICAgICAgICAgICAoIChVbndhbnRlZFRva2VuRXhjZXB0aW9uKXRyYXBwZWRFeGNlcHRpb24gKS5nZXRVbmV4cGVjdGVkVG9rZW4oKSArCisgICAgICAgICAgICAgICAgICAgIiwgcmVzeW5jPSIgKyBnZXRUZXh0KCkgKyAiPiI7CisgICAgICAgIH0gZWxzZSBpZiAodHJhcHBlZEV4Y2VwdGlvbiBpbnN0YW5jZW9mIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuICI8bWlzbWF0Y2hlZCB0b2tlbjogIiArIHRyYXBwZWRFeGNlcHRpb24udG9rZW4gKyAiLCByZXN5bmM9IiArIGdldFRleHQoKSArICI+IjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFwcGVkRXhjZXB0aW9uIGluc3RhbmNlb2YgTm9WaWFibGVBbHRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAiPHVuZXhwZWN0ZWQ6ICIgKyB0cmFwcGVkRXhjZXB0aW9uLnRva2VuICsKKyAgICAgICAgICAgICAgICAgICAiLCByZXN5bmM9IiArIGdldFRleHQoKSArICI+IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIjxlcnJvcjogIiArIGdldFRleHQoKSArICI+IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjbGFzcyBncmFtbWFyX0FkYXB0b3IgZXh0ZW5kcyBDb21tb25UcmVlQWRhcHRvciB7CisgICAgQU5UTFJQYXJzZXIgX291dGVyOworCisgICAgcHVibGljIGdyYW1tYXJfQWRhcHRvcihBTlRMUlBhcnNlciBvdXRlcikgeworICAgICAgICBfb3V0ZXIgPSBvdXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZShUb2tlbiBwYXlsb2FkKSB7CisgICAgICAgIEdyYW1tYXJBU1QgdCA9IG5ldyBHcmFtbWFyQVNUKCBwYXlsb2FkICk7CisgICAgICAgIGlmIChfb3V0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHQuZW5jbG9zaW5nUnVsZU5hbWUgPSBfb3V0ZXIuY3VycmVudFJ1bGVOYW1lOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGVycm9yTm9kZShUb2tlblN0cmVhbSBpbnB1dCwgVG9rZW4gc3RhcnQsIFRva2VuIHN0b3AsIFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgR3JhbW1hckFTVCB0ID0gbmV3IEdyYW1tYXJBU1RFcnJvck5vZGUoaW5wdXQsIHN0YXJ0LCBzdG9wLCBlKTsKKyAgICAgICAgaWYgKF9vdXRlciAhPSBudWxsKQorICAgICAgICAgICAgdC5lbmNsb3NpbmdSdWxlTmFtZSA9IF9vdXRlci5jdXJyZW50UnVsZU5hbWU7CisgICAgICAgIHJldHVybiB0OworICAgIH0KK30KKworcHJpdmF0ZSBHcmFtbWFyIGdyYW1tYXI7Citwcml2YXRlIGludCBncmFtbWFyVHlwZTsKK3ByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOworCitwdWJsaWMgR3JhbW1hciBnZXRHcmFtbWFyKCkgeworICAgIHJldHVybiBncmFtbWFyOworfQorCitwdWJsaWMgdm9pZCBzZXRHcmFtbWFyKEdyYW1tYXIgdmFsdWUpIHsKKyAgICBncmFtbWFyID0gdmFsdWU7Cit9CisKK3B1YmxpYyBpbnQgZ2V0R3JhbW1hclR5cGUoKSB7CisgICAgcmV0dXJuIGdyYW1tYXJUeXBlOworfQorCitwdWJsaWMgdm9pZCBzZXRHcmFtbWFyVHlwZShpbnQgdmFsdWUpIHsKKyAgICBncmFtbWFyVHlwZSA9IHZhbHVlOworfQorCitwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgIHJldHVybiBmaWxlTmFtZTsKK30KKworcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIHZhbHVlKSB7CisgICAgZmlsZU5hbWUgPSB2YWx1ZTsKK30KKworcHJpdmF0ZSBmaW5hbCBpbnQgTEEoaW50IGkpIHsgcmV0dXJuIGlucHV0LkxBKCBpICk7IH0KKworcHJpdmF0ZSBmaW5hbCBUb2tlbiBMVChpbnQgaykgeyByZXR1cm4gaW5wdXQuTFQoIGsgKTsgfQorCisvKnBhcnRpYWwgdm9pZCBjcmVhdGVUcmVlQWRhcHRvcihyZWYgSVRyZWVBZGFwdG9yIGFkYXB0b3IpCit7CisgICAgYWRhcHRvciA9IG5ldyBncmFtbWFyX0FkYXB0b3IodGhpcyk7Cit9Ki8KKworcHJvdGVjdGVkIEdyYW1tYXJBU1Qgc2V0VG9CbG9ja1dpdGhTZXQoR3JhbW1hckFTVCBiKSB7CisgICAgLyoKKyAgICAgKiBhbHQgPSBeKEFMVFsiQUxUIl0ge2J9IEVPQVsiRU9BIl0pCisgICAgICogcHJlZml4V2l0aFN5bnByZWQoIGFsdCApCisgICAgICogcmV0dXJuIF4oQkxPQ0tbIkJMT0NLIl0ge2FsdH0gRU9CWyI8ZW5kLW9mLWJsb2NrPiJdKQorICAgICAqLworICAgIEdyYW1tYXJBU1QgYWx0ID0gKEdyYW1tYXJBU1QpYWRhcHRvci5jcmVhdGUoQUxULCAiQUxUIik7CisgICAgYWRhcHRvci5hZGRDaGlsZChhbHQsIGIpOworICAgIGFkYXB0b3IuYWRkQ2hpbGQoYWx0LCBhZGFwdG9yLmNyZWF0ZShFT0EsICI8ZW5kLW9mLWFsdD4iKSk7CisKKyAgICBwcmVmaXhXaXRoU3luUHJlZChhbHQpOworCisgICAgR3JhbW1hckFTVCBibG9jayA9IChHcmFtbWFyQVNUKWFkYXB0b3IuY3JlYXRlKEJMT0NLLCBiLmdldFRva2VuKCksICJCTE9DSyIpOworICAgIGFkYXB0b3IuYWRkQ2hpbGQoYmxvY2ssIGFsdCk7CisgICAgYWRhcHRvci5hZGRDaGlsZChhbHQsIGFkYXB0b3IuY3JlYXRlKEVPQiwgIjxlbmQtb2YtYmxvY2s+IikpOworCisgICAgcmV0dXJuIGJsb2NrOworfQorCisvKiogQ3JlYXRlIGEgY29weSBvZiB0aGUgYWx0IGFuZCBtYWtlIGl0IGludG8gYSBCTE9DSzsgYWxsIGFjdGlvbnMsCisgKiAgbGFiZWxzLCB0cmVlIG9wZXJhdG9ycywgcmV3cml0ZXMgYXJlIHJlbW92ZWQuCisgKi8KK3Byb3RlY3RlZCBHcmFtbWFyQVNUIGNyZWF0ZUJsb2NrRnJvbUR1cEFsdChHcmFtbWFyQVNUIGFsdCkgeworICAgIC8qCisgICAgICogXihCTE9DS1siQkxPQ0siXSB7R3JhbW1hckFTVC5kdXBUcmVlTm9BY3Rpb25zKGFsdCl9IEVPQlsiPGVuZC1vZi1ibG9jaz4iXSkKKyAgICAgKi8KKyAgICBHcmFtbWFyQVNUIG5hbHQgPSBHcmFtbWFyQVNULmR1cFRyZWVOb0FjdGlvbnMoYWx0LCBudWxsKTsKKworICAgIEdyYW1tYXJBU1QgYmxvY2sgPSAoR3JhbW1hckFTVClhZGFwdG9yLmNyZWF0ZShCTE9DSywgYWx0LmdldFRva2VuKCksICJCTE9DSyIpOworICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGJsb2NrLCBuYWx0ICk7CisgICAgYWRhcHRvci5hZGRDaGlsZCggYmxvY2ssIGFkYXB0b3IuY3JlYXRlKCBFT0IsICI8ZW5kLW9mLWJsb2NrPiIgKSApOworCisgICAgcmV0dXJuIGJsb2NrOworfQorCisvKiogUmV3cml0ZSBhbHQgdG8gaGF2ZSBhIHN5bnByZWQgYXMgZmlyc3QgZWxlbWVudDsKKyAqICAoeHh4KT0+eHh4CisgKiAgYnV0IG9ubHkgaWYgdGhleSBkaWRuJ3Qgc3BlY2lmeSBvbmUgbWFudWFsbHkuCisgKi8KK3Byb3RlY3RlZCB2b2lkIHByZWZpeFdpdGhTeW5QcmVkKCBHcmFtbWFyQVNUIGFsdCApIHsKKyAgICAvLyBpZiB0aGV5IHdhbnQgYmFja3RyYWNraW5nIGFuZCBpdCdzIG5vdCBhIGxleGVyIHJ1bGUgaW4gY29tYmluZWQgZ3JhbW1hcgorICAgIFN0cmluZyBhdXRvQmFja3RyYWNrID0gKFN0cmluZylncmFtbWFyLmdldEJsb2NrT3B0aW9uKCBjdXJyZW50QmxvY2tBU1QsICJiYWNrdHJhY2siICk7CisgICAgaWYgKCBhdXRvQmFja3RyYWNrID09IG51bGwgKQorICAgIHsKKyAgICAgICAgYXV0b0JhY2t0cmFjayA9IChTdHJpbmcpZ3JhbW1hci5nZXRPcHRpb24oICJiYWNrdHJhY2siICk7CisgICAgfQorICAgIGlmICggYXV0b0JhY2t0cmFjayAhPSBudWxsICYmIGF1dG9CYWNrdHJhY2suZXF1YWxzKCAidHJ1ZSIgKSAmJgorICAgICAgICAgISggZ3JhbW1hclR5cGUgPT0gR3JhbW1hci5DT01CSU5FRCAmJgorICAgICAgICAgUnVsZS5nZXRSdWxlVHlwZShjdXJyZW50UnVsZU5hbWUpID09IEdyYW1tYXIuTEVYRVIpICYmCisgICAgICAgICBhbHQuZ2V0Q2hpbGQoIDAgKS5nZXRUeXBlKCkgIT0gU1lOX1NFTVBSRUQgKQorICAgIHsKKyAgICAgICAgLy8gZHVwbGljYXRlIGFsdCBhbmQgbWFrZSBhIHN5bnByZWQgYmxvY2sgYXJvdW5kIHRoYXQgZHVwJ2QgYWx0CisgICAgICAgIEdyYW1tYXJBU1Qgc3lucHJlZEJsb2NrQVNUID0gY3JlYXRlQmxvY2tGcm9tRHVwQWx0KCBhbHQgKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBCQUNLVFJBQ0tfU0VNUFJFRCBub2RlIGFzIGlmIHVzZXIgaGFkIHR5cGVkIHRoaXMgaW4KKyAgICAgICAgLy8gRWZmZWN0aXZlbHkgd2UgcmVwbGFjZSAoeHh4KT0+eHh4IHdpdGgge3N5bnByZWR4eHh9PyB4eHgKKyAgICAgICAgR3JhbW1hckFTVCBzeW5wcmVkQVNUID0gY3JlYXRlU3luU2VtUHJlZEZyb21CbG9jayggc3lucHJlZEJsb2NrQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tUUkFDS19TRU1QUkVEICk7CisKKyAgICAgICAgLy8gaW5zZXJ0IEJBQ0tUUkFDS19TRU1QUkVEIGFzIGZpcnN0IGVsZW1lbnQgb2YgYWx0CisgICAgICAgIC8vc3lucHJlZEFTVC5nZXRMYXN0U2libGluZygpLnNldE5leHRTaWJsaW5nKCBhbHQuZ2V0Rmlyc3RDaGlsZCgpICk7CisgICAgICAgIC8vc3lucHJlZEFTVC5hZGRDaGlsZCggYWx0LmdldEZpcnN0Q2hpbGQoKSApOworICAgICAgICAvL2FsdC5zZXRGaXJzdENoaWxkKCBzeW5wcmVkQVNUICk7CisgICAgICAgIEdyYW1tYXJBU1RbXSBjaGlsZHJlbiA9IGFsdC5nZXRDaGlsZHJlbkFzQXJyYXkoKTsKKyAgICAgICAgYWRhcHRvci5zZXRDaGlsZCggYWx0LCAwLCBzeW5wcmVkQVNUICk7CisgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMSApCisgICAgICAgICAgICAgICAgYWRhcHRvci5zZXRDaGlsZCggYWx0LCBpICsgMSwgY2hpbGRyZW5baV0gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGFwdG9yLmFkZENoaWxkKCBhbHQsIGNoaWxkcmVuW2ldICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Byb3RlY3RlZCBHcmFtbWFyQVNUIGNyZWF0ZVN5blNlbVByZWRGcm9tQmxvY2soIEdyYW1tYXJBU1Qgc3lucHJlZEJsb2NrQVNULCBpbnQgc3lucHJlZFRva2VuVHlwZSApIHsKKyAgICAvLyBhZGQgZ3JhbW1hciBmcmFnbWVudCB0byBhIGxpc3Qgc28gd2UgY2FuIG1ha2UgZmFrZSBydWxlcyBmb3IgdGhlbSBsYXRlci4KKyAgICBTdHJpbmcgcHJlZE5hbWUgPSBncmFtbWFyLmRlZmluZVN5bnRhY3RpY1ByZWRpY2F0ZSggc3lucHJlZEJsb2NrQVNULCBjdXJyZW50UnVsZU5hbWUgKTsKKyAgICAvLyBjb252ZXJ0IChhbHBoYSk9PiBpbnRvIHtzeW5wcmVkTn0/IHdoZXJlIE4gaXMgc29tZSBwcmVkIGNvdW50CisgICAgLy8gZHVyaW5nIGNvZGUgZ2VuIHdlIGNvbnZlcnQgdG8gZnVuY3Rpb24gY2FsbCB3aXRoIHRlbXBsYXRlcworICAgIFN0cmluZyBzeW5wcmVkaW52b2tlID0gcHJlZE5hbWU7CisgICAgR3JhbW1hckFTVCBwID0gKEdyYW1tYXJBU1QpYWRhcHRvci5jcmVhdGUoIHN5bnByZWRUb2tlblR5cGUsIHN5bnByZWRpbnZva2UgKTsKKyAgICAvLyB0cmFjayBob3cgbWFueSBkZWNpc2lvbnMgaGF2ZSBzeW5wcmVkcworICAgIGdyYW1tYXIuYmxvY2tzV2l0aFN5blByZWRzLmFkZCggY3VycmVudEJsb2NrQVNUICk7CisgICAgcmV0dXJuIHA7Cit9CisKK3B1YmxpYyBzdGF0aWMgR3JhbW1hckFTVCBjcmVhdGVTaW1wbGVSdWxlQVNUKCBTdHJpbmcgbmFtZSwgR3JhbW1hckFTVCBibG9jaywgYm9vbGVhbiBmcmFnbWVudCApIHsKKyAgICBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IGdyYW1tYXJfQWRhcHRvcihudWxsKTsKKworICAgIEdyYW1tYXJBU1QgbW9kaWZpZXIgPSBudWxsOworICAgIGlmICggZnJhZ21lbnQgKQorICAgIHsKKyAgICAgICAgbW9kaWZpZXIgPSAoR3JhbW1hckFTVClhZGFwdG9yLmNyZWF0ZSggRlJBR01FTlQsICJmcmFnbWVudCIgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEVPQkFTVCA9IGJsb2NrLmdldExhc3RDaGlsZCgpCisgICAgICogXihSVUxFW2Jsb2NrLCJydWxlIl0gSURbIm5hbWUiXSB7bW9kaWZpZXJ9IEFSR1siQVJHIl0gUkVUWyJSRVQiXSBTQ09QRVsic2NvcGUiXSB7YmxvY2t9IEVPUltFT0JBU1QsIjxlbmQtb2YtcnVsZT4iXSkKKyAgICAgKi8KKyAgICBHcmFtbWFyQVNUIHJ1bGUgPSAoR3JhbW1hckFTVClhZGFwdG9yLmNyZWF0ZSggUlVMRSwgYmxvY2suZ2V0VG9rZW4oKSwgInJ1bGUiICk7CisKKyAgICBhZGFwdG9yLmFkZENoaWxkKCBydWxlLCBhZGFwdG9yLmNyZWF0ZSggSUQsIG5hbWUgKSApOworICAgIGlmICggbW9kaWZpZXIgIT0gbnVsbCApCisgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQoIHJ1bGUsIG1vZGlmaWVyICk7CisgICAgYWRhcHRvci5hZGRDaGlsZCggcnVsZSwgYWRhcHRvci5jcmVhdGUoIEFSRywgIkFSRyIgKSApOworICAgIGFkYXB0b3IuYWRkQ2hpbGQoIHJ1bGUsIGFkYXB0b3IuY3JlYXRlKCBSRVQsICJSRVQiICkgKTsKKyAgICBhZGFwdG9yLmFkZENoaWxkKCBydWxlLCBhZGFwdG9yLmNyZWF0ZSggU0NPUEUsICJzY29wZSIgKSApOworICAgIGFkYXB0b3IuYWRkQ2hpbGQoIHJ1bGUsIGJsb2NrICk7CisgICAgYWRhcHRvci5hZGRDaGlsZCggcnVsZSwgYWRhcHRvci5jcmVhdGUoIEVPUiwgYmxvY2suZ2V0TGFzdENoaWxkKCkuZ2V0VG9rZW4oKSwgIjxlbmQtb2YtcnVsZT4iICkgKTsKKworICAgIHJldHVybiBydWxlOworfQorCitAT3ZlcnJpZGUKK3B1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KQoreworICAgIC8vVG9rZW4gdG9rZW4gPSBudWxsOworICAgIC8vdHJ5CisgICAgLy97CisgICAgLy8gICAgdG9rZW4gPSBMVCggMSApOworICAgIC8vfQorICAgIC8vY2F0Y2ggKCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB0c2UgKQorICAgIC8veworICAgIC8vICAgIEVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCAiY2FuJ3QgZ2V0IHRva2VuPz8/IiwgdHNlICk7CisgICAgLy99CisgICAgVG9rZW4gdG9rZW4gPSBleC50b2tlbjsKKyAgICBFcnJvck1hbmFnZXIuc3ludGF4RXJyb3IoCisgICAgICAgIEVycm9yTWFuYWdlci5NU0dfU1lOVEFYX0VSUk9SLAorICAgICAgICBncmFtbWFyLAorICAgICAgICB0b2tlbiwKKyAgICAgICAgImFudGxyOiAiICsgZXgudG9TdHJpbmcoKSwKKyAgICAgICAgZXggKTsKK30KKworcHVibGljIHZvaWQgY2xlYW51cCggR3JhbW1hckFTVCByb290ICkKK3sKKyAgICBpZiAoIGdyYW1tYXJUeXBlID09IEdyYW1tYXIuTEVYRVIgKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGZpbHRlciA9IChTdHJpbmcpZ3JhbW1hci5nZXRPcHRpb24oICJmaWx0ZXIiICk7CisgICAgICAgIEdyYW1tYXJBU1QgdG9rZW5zUnVsZUFTVCA9CisgICAgICAgICAgICBncmFtbWFyLmFkZEFydGlmaWNpYWxNYXRjaFRva2Vuc1J1bGUoCisgICAgICAgICAgICAgICAgcm9vdCwKKyAgICAgICAgICAgICAgICBncmFtbWFyLmxleGVyUnVsZU5hbWVzSW5Db21iaW5lZCwKKyAgICAgICAgICAgICAgICBncmFtbWFyLmdldERlbGVnYXRlTmFtZXMoKSwKKyAgICAgICAgICAgICAgICBmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuZXF1YWxzKCAidHJ1ZSIgKSApOworICAgIH0KK30KK30KKworcHVibGljCitncmFtbWFyXyFbR3JhbW1hciBnXQorQGluaXQKK3sKKwl0aGlzLmdyYW1tYXIgPSBnOworCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0czsKK30KK0BhZnRlcgoreworCWNsZWFudXAoICR0cmVlICk7Cit9CisJOgkvL2hkcjpoZWFkZXJTcGVjCisJCSggQUNUSU9OICk/CisJCSggY210PURPQ19DT01NRU5UICApPworCQlncj1ncmFtbWFyVHlwZSBnaWQ9aWQge2dyYW1tYXIuc2V0TmFtZSgkZ2lkLnRleHQpO30gU0VNSQorCQkoCW9wdGlvbnNTcGVjIHtvcHRzID0gJG9wdGlvbnNTcGVjLm9wdHM7IGdyYW1tYXIuc2V0T3B0aW9ucyhvcHRzLCAkb3B0aW9uc1NwZWMuc3RhcnQpO30KKwkJKT8KKwkJKGlnPWRlbGVnYXRlR3JhbW1hcnMpPworCQkodHM9dG9rZW5zU3BlYyk/CisJCXNjb3Blcz1hdHRyU2NvcGVzCisJCShhPWFjdGlvbnMpPworCQlyPXJ1bGVzCisJCUVPRgorCQktPiBeKCRnciAkZ2lkICRjbXQ/IG9wdGlvbnNTcGVjPyAkaWc/ICR0cz8gJHNjb3Blcz8gJGE/ICRyKQorCTsKKworZ3JhbW1hclR5cGUKKwk6CSgJJ2xleGVyJyAgZ3I9J2dyYW1tYXInIHtncmFtbWFyVHlwZT1HcmFtbWFyLkxFWEVSOyBncmFtbWFyLnR5cGUgPSBHcmFtbWFyLkxFWEVSO30gICAgICAgLy8gcHVyZSBsZXhlcgorCQkJLT4gTEVYRVJfR1JBTU1BUlskZ3JdCisJCXwJJ3BhcnNlcicgZ3I9J2dyYW1tYXInIHtncmFtbWFyVHlwZT1HcmFtbWFyLlBBUlNFUjsgZ3JhbW1hci50eXBlID0gR3JhbW1hci5QQVJTRVI7fSAgICAgLy8gcHVyZSBwYXJzZXIKKwkJCS0+IFBBUlNFUl9HUkFNTUFSWyRncl0KKwkJfAkndHJlZScgICBncj0nZ3JhbW1hcicge2dyYW1tYXJUeXBlPUdyYW1tYXIuVFJFRV9QQVJTRVI7IGdyYW1tYXIudHlwZSA9IEdyYW1tYXIuVFJFRV9QQVJTRVI7fSAgLy8gYSB0cmVlIHBhcnNlcgorCQkJLT4gVFJFRV9HUkFNTUFSWyRncl0KKwkJfAkJCSBncj0nZ3JhbW1hcicge2dyYW1tYXJUeXBlPUdyYW1tYXIuQ09NQklORUQ7IGdyYW1tYXIudHlwZSA9IEdyYW1tYXIuQ09NQklORUQ7fSAvLyBtZXJnZWQgcGFyc2VyL2xleGVyCisJCQktPiBDT01CSU5FRF9HUkFNTUFSWyRncl0KKwkJKQorCTsKKworYWN0aW9ucworCToJKGFjdGlvbikrCisJOworCisvKiogTWF0Y2ggc3R1ZmYgbGlrZSBAcGFyc2VyOjptZW1iZXJzIHtpbnQgaTt9ICovCithY3Rpb24KKwk6CUFNUEVSU0FORF4gKGFjdGlvblNjb3BlTmFtZSBDT0xPTiEgQ09MT04hKT8gaWQgQUNUSU9OCisJOworCisvKiogU29tZXRpbWVzIHRoZSBzY29wZSBuYW1lcyB3aWxsIGNvbGxpZGUgd2l0aCBrZXl3b3JkczsgYWxsb3cgdGhlbSBhcworICogIGlkcyBmb3IgYWN0aW9uIHNjb3Blcy4KKyAqLworYWN0aW9uU2NvcGVOYW1lCisJOglpZAorCXwJbD0nbGV4ZXInCisJCS0+IElEWyRsXQorCXwJcD0ncGFyc2VyJworCQktPiBJRFskcF0KKwk7CisKK29wdGlvbnNTcGVjIHJldHVybnMgW01hcDxTdHJpbmcsIE9iamVjdD4gb3B0cz1uZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKV0KKwk6CU9QVElPTlNeIChvcHRpb25bJG9wdHNdIFNFTUkhKSsgUkNVUkxZIQorCTsKKworb3B0aW9uW01hcDxTdHJpbmcsIE9iamVjdD4gb3B0c10KKwk6CWlkIEFTU0lHTl4gb3B0aW9uVmFsdWUKKwkJeworCQkJJG9wdHMucHV0KCRpZC50ZXh0LCAkb3B0aW9uVmFsdWUudmFsdWUpOworCQl9CisJOworCitvcHRpb25WYWx1ZSByZXR1cm5zIFtPYmplY3QgdmFsdWUgPSBudWxsXQorCToJeD1pZAkJCSB7JHZhbHVlID0gJHgudGV4dDt9CisJfAlzPVNUUklOR19MSVRFUkFMIHtTdHJpbmcgdnMgPSAkcy50ZXh0OworCQkJCQkJICAvLyByZW1vdmUgdGhlIHF1b3RlczoKKwkJCQkJCSAgJHZhbHVlPXZzLnN1YnN0cmluZygxLHZzLmxlbmd0aCgpLTEpO30KKwl8CWM9Q0hBUl9MSVRFUkFMICAge1N0cmluZyB2cyA9ICRjLnRleHQ7CisJCQkJCQkgIC8vIHJlbW92ZSB0aGUgcXVvdGVzOgorCQkJCQkJICAkdmFsdWU9dnMuc3Vic3RyaW5nKDEsdnMubGVuZ3RoKCktMSk7fQorCXwJaT1JTlQgICAgICAgICAgICB7JHZhbHVlID0gSW50ZWdlci5wYXJzZUludCgkaS50ZXh0KTt9CisJfAlzcz1TVEFSCQkJIHskdmFsdWUgPSAiKiI7fSAvLyB1c2VkIGZvciBrPSoKKwkJLT4gU1RSSU5HX0xJVEVSQUxbJHNzXQorLy8JfAljczpjaGFyU2V0ICAgICAgIHt2YWx1ZSA9ICNjczt9IC8vIHJldHVybiBzZXQgQVNUIGluIHRoaXMgY2FzZQorCTsKKworZGVsZWdhdGVHcmFtbWFycworCToJJ2ltcG9ydCdeIGRlbGVnYXRlR3JhbW1hciAoQ09NTUEhIGRlbGVnYXRlR3JhbW1hcikqIFNFTUkhCisJOworCitkZWxlZ2F0ZUdyYW1tYXIKKwk6CWxhYj1pZCBBU1NJR05eIGc9aWQge2dyYW1tYXIuaW1wb3J0R3JhbW1hcigkZy50cmVlLCAkbGFiLnRleHQpO30KKwl8CWcyPWlkICAgICAgICAgICAgICAge2dyYW1tYXIuaW1wb3J0R3JhbW1hcigkZzIudHJlZSxudWxsKTt9CisJOworCit0b2tlbnNTcGVjCisJOglUT0tFTlNeCisJCQl0b2tlblNwZWMqCisJCVJDVVJMWSEKKwk7CisKK3Rva2VuU3BlYworCToJVE9LRU5fUkVGICggQVNTSUdOXiAoU1RSSU5HX0xJVEVSQUx8Q0hBUl9MSVRFUkFMKSApPyBTRU1JIQorCTsKKworYXR0clNjb3BlcworCToJKGF0dHJTY29wZSkqCisJOworCithdHRyU2NvcGUKKwk6CSdzY29wZSdeIGlkIHJ1bGVBY3Rpb25zPyBBQ1RJT04KKwk7CisKK3J1bGVzCisJOgkoCXJ1bGUKKwkJKSsKKwk7CisKK3B1YmxpYworcnVsZQorQGluaXQKK3sKKwlHcmFtbWFyQVNUIGVvYj1udWxsOworCUNvbW1vblRva2VuIHN0YXJ0ID0gKENvbW1vblRva2VuKUxUKDEpOworCWludCBzdGFydExpbmUgPSBMVCgxKS5nZXRMaW5lKCk7Cit9CisJOgorCSgJKAlkPURPQ19DT01NRU5UCisJCSk/CisJCSgJcDE9J3Byb3RlY3RlZCcJLy97bW9kaWZpZXI9JHAxLnRyZWU7fQorCQl8CXAyPSdwdWJsaWMnCQkvL3ttb2RpZmllcj0kcDIudHJlZTt9CisJCXwJcDM9J3ByaXZhdGUnCS8ve21vZGlmaWVyPSRwMy50cmVlO30KKwkJfAlwND0nZnJhZ21lbnQnCS8ve21vZGlmaWVyPSRwNC50cmVlO30KKwkJKT8KKwkJcnVsZU5hbWU9aWQKKwkJeworCQkJY3VycmVudFJ1bGVOYW1lPSRydWxlTmFtZS50ZXh0OworCQkJaWYgKCBncmFtbWFyVHlwZT09R3JhbW1hci5MRVhFUiAmJiAkcDQ9PW51bGwgKQorCQkJCWdyYW1tYXIubGV4ZXJSdWxlTmFtZXNJbkNvbWJpbmVkLmFkZChjdXJyZW50UnVsZU5hbWUpOworCQl9CisJCSggQkFORyApPworCQkoIGFhPUFSR19BQ1RJT04gKT8KKwkJKCAncmV0dXJucycgcnQ9QVJHX0FDVElPTiAgKT8KKwkJKCB0aHJvd3NTcGVjICk/CisJCSggb3B0aW9uc1NwZWMgKT8KKwkJc2NvcGVzPXJ1bGVTY29wZVNwZWMKKwkJKHJ1bGVBY3Rpb25zKT8KKwkJQ09MT04KKwkJcnVsZUFsdExpc3RbJG9wdGlvbnNTcGVjLm9wdHNdCisJCVNFTUkKKwkJKCBleD1leGNlcHRpb25Hcm91cCApPworCQktPgleKAlSVUxFWyRydWxlTmFtZS5zdGFydCwgInJ1bGUiXQorCQkJCSRydWxlTmFtZQorCQkJCS8vIHRoZSBtb2RpZmllciB3aWxsIGJlIDAgb3Igb25lIG9mIHRoZSBtb2RpZmllcnM6CisJCQkJJHAxPyAkcDI/ICRwMz8gJHA0PworCQkJCV4oQVJHWyJBUkciXSAkYWE/KQorCQkJCV4oUkVUWyJSRVQiXSAkcnQ/KQorCQkJCXRocm93c1NwZWM/CisJCQkJb3B0aW9uc1NwZWM/CisJCQkJJHNjb3BlcworCQkJCXJ1bGVBY3Rpb25zPworCQkJCXJ1bGVBbHRMaXN0CisJCQkJJGV4PworCQkJCUVPUlskU0VNSSwiPGVuZC1vZi1ydWxlPiJdKQorCSkKKwl7CisJCSR0cmVlLnNldFRyZWVFbmNsb3NpbmdSdWxlTmFtZURlZXBseShjdXJyZW50UnVsZU5hbWUpOworCQkoKEdyYW1tYXJBU1QpJHRyZWUuZ2V0Q2hpbGQoMCkpLnNldEJsb2NrT3B0aW9ucygkb3B0aW9uc1NwZWMub3B0cyk7CisJfQorCTsKKworcnVsZUFjdGlvbnMKKwk6CShydWxlQWN0aW9uKSsKKwk7CisKKy8qKiBNYXRjaCBzdHVmZiBsaWtlIEBpbml0IHtpbnQgaTt9ICovCitydWxlQWN0aW9uCisJOglBTVBFUlNBTkReIGlkIEFDVElPTgorCTsKKwordGhyb3dzU3BlYworCToJJ3Rocm93cydeIGlkICggQ09NTUEhIGlkICkqCisJOworCitydWxlU2NvcGVTcGVjCisJOgkoICdzY29wZScgcnVsZUFjdGlvbnM/IEFDVElPTiApPworCQkoICdzY29wZScgaWRMaXN0IFNFTUkgKSoKKwkJLT4gXihTQ09QRVskc3RhcnQsInNjb3BlIl0gcnVsZUFjdGlvbnM/IEFDVElPTj8gaWRMaXN0KikKKwk7CisKK3J1bGVBbHRMaXN0W01hcDxTdHJpbmcsIE9iamVjdD4gb3B0c10KK0Bpbml0Cit7CisJR3JhbW1hckFTVCBibGtSb290ID0gbnVsbDsKKwlHcmFtbWFyQVNUIHNhdmUgPSBjdXJyZW50QmxvY2tBU1Q7Cit9CisJOgkoIC0+IEJMT0NLW2lucHV0LkxUKC0xKSwiQkxPQ0siXSApCisJCXsKKwkJCWJsa1Jvb3QgPSAoR3JhbW1hckFTVCkkdHJlZS5nZXRDaGlsZCgwKTsKKwkJCWJsa1Jvb3Quc2V0QmxvY2tPcHRpb25zKCRvcHRzKTsKKwkJCWN1cnJlbnRCbG9ja0FTVCA9IGJsa1Jvb3Q7CisJCX0KKwkJKAlhMT1hbHRlcm5hdGl2ZSByMT1yZXdyaXRlCisJCQl7aWYgKExBKDEpPT1PUnx8KExBKDIpPT1RVUVTVElPTnx8TEEoMik9PVBMVVN8fExBKDIpPT1TVEFSKSkgcHJlZml4V2l0aFN5blByZWQoJGExLnRyZWUpO30KKwkJCS0+ICRhMSAkcjE/CisJCSkKKwkJKAkoCU9SIGEyPWFsdGVybmF0aXZlIHIyPXJld3JpdGUKKwkJCQl7aWYgKExBKDEpPT1PUnx8KExBKDIpPT1RVUVTVElPTnx8TEEoMik9PVBMVVN8fExBKDIpPT1TVEFSKSkgcHJlZml4V2l0aFN5blByZWQoJGEyLnRyZWUpO30KKwkJCQktPiAkcnVsZUFsdExpc3QgJGEyICRyMj8KKwkJCSkrCisJCXwKKwkJKQorCQktPiBeKHtibGtSb290fSAkcnVsZUFsdExpc3QgRU9CWyI8ZW5kLW9mLWJsb2NrPiJdKQorCTsKK2ZpbmFsbHkgeyBjdXJyZW50QmxvY2tBU1QgPSBzYXZlOyB9CisKKy8qKiBCdWlsZCAjKEJMT0NLICggIyhBTFQgLi4uKSBFT0IgKSsgKSAqLworYmxvY2sKK0Bpbml0Cit7CisJR3JhbW1hckFTVCBzYXZlID0gY3VycmVudEJsb2NrQVNUOworfQorCToJKAlscD1MUEFSRU4KKwkJCS0+IEJMT0NLWyRscCwiQkxPQ0siXQorCQkpCisJCXtjdXJyZW50QmxvY2tBU1QgPSAoR3JhbW1hckFTVCkkdHJlZS5nZXRDaGlsZCgwKTt9CisJCSgKKwkJCS8vIDJuZCBhbHQgYW5kIG9wdGlvbmFsIGJyYW5jaCBhbWJpZyBkdWUgdG8KKwkJCS8vIGxpbmVhciBhcHByb3ggTEwoMikgaXNzdWUuICBDT0xPTiBBQ1RJT04KKwkJCS8vIG1hdGNoZWQgY29ycmVjdGx5IGluIDJuZCBhbHQuCisJCQkob3B0aW9uc1NwZWMgeygoR3JhbW1hckFTVCkkdHJlZS5nZXRDaGlsZCgwKSkuc2V0T3B0aW9ucyhncmFtbWFyLCRvcHRpb25zU3BlYy5vcHRzKTt9KT8KKwkJCSggcnVsZUFjdGlvbnMgKT8KKwkJCUNPTE9OCisJCXwJQUNUSU9OIENPTE9OCisJCSk/CisKKwkJYT1hbHRlcm5hdGl2ZSByPXJld3JpdGUKKwkJeworCQkJc3RyZWFtX2FsdGVybmF0aXZlLmFkZCggJHIudHJlZSApOworCQkJaWYgKCBMQSgxKT09T1IgfHwgKExBKDIpPT1RVUVTVElPTnx8TEEoMik9PVBMVVN8fExBKDIpPT1TVEFSKSApCisJCQkJcHJlZml4V2l0aFN5blByZWQoJGEudHJlZSk7CisJCX0KKwkJKAlPUiBhPWFsdGVybmF0aXZlIHI9cmV3cml0ZQorCQkJeworCQkJCXN0cmVhbV9hbHRlcm5hdGl2ZS5hZGQoICRyLnRyZWUgKTsKKwkJCQlpZiAoTEEoMSk9PU9SfHwoTEEoMik9PVFVRVNUSU9OfHxMQSgyKT09UExVU3x8TEEoMik9PVNUQVIpKQorCQkJCQlwcmVmaXhXaXRoU3luUHJlZCgkYS50cmVlKTsKKwkJCX0KKwkJKSoKKworCQlycD1SUEFSRU4KKwkJLT4gXigkYmxvY2sgb3B0aW9uc1NwZWM/IHJ1bGVBY3Rpb25zPyBBQ1RJT04/IGFsdGVybmF0aXZlKyBFT0JbJHJwLCI8ZW5kLW9mLWJsb2NrPiJdKQorCTsKK2ZpbmFsbHkgeyBjdXJyZW50QmxvY2tBU1QgPSBzYXZlOyB9CisKKy8vIEFMVCBhbmQgRU9BIGhhdmUgaW5kZXhlcyB0cmFja2luZyBzdGFydC9zdG9wIG9mIGVudGlyZSBhbHQKK2FsdGVybmF0aXZlCisJOgllbGVtZW50KworCQktPiBeKEFMVFskc3RhcnQsIkFMVCJdIGVsZW1lbnQrIEVPQVtpbnB1dC5MVCgtMSksIjxlbmQtb2YtYWx0PiJdKQorCXwJLy8gZXBzaWxvbiBhbHQKKwkJLT4gXihBTFRbJHN0YXJ0LCJBTFQiXSBFUFNJTE9OW2lucHV0LkxUKC0xKSwiZXBzaWxvbiJdIEVPQVtpbnB1dC5MVCgtMSksIjxlbmQtb2YtYWx0PiJdKQorCTsKKworZXhjZXB0aW9uR3JvdXAKKwk6CWV4Y2VwdGlvbkhhbmRsZXIrIGZpbmFsbHlDbGF1c2U/CisJfAlmaW5hbGx5Q2xhdXNlCisJOworCitleGNlcHRpb25IYW5kbGVyCisJOgknY2F0Y2gnXiBBUkdfQUNUSU9OIEFDVElPTgorCTsKKworZmluYWxseUNsYXVzZQorCToJJ2ZpbmFsbHknXiBBQ1RJT04KKwk7CisKK2VsZW1lbnQKKwk6CWVsZW1lbnROb09wdGlvblNwZWMKKwk7CisKK2VsZW1lbnROb09wdGlvblNwZWMKK0Bpbml0Cit7CisJSW50U2V0IGVsZW1lbnRzPW51bGw7Cit9CisJOgkoCSgJaWQgKEFTU0lHTl58UExVU19BU1NJR05eKSAoYXRvbXxibG9jaykKKwkJCSkKKwkJCSgJc3ViPWVibmZTdWZmaXhbcm9vdF8wLGZhbHNlXSEge3Jvb3RfMCA9ICRzdWIudHJlZTt9CisJCQkpPworCQl8CWE9YXRvbQorCQkJKAlzdWIyPWVibmZTdWZmaXhbJGEudHJlZSxmYWxzZV0hIHtyb290XzA9JHN1YjIudHJlZTt9CisJCQkpPworCQl8CWVibmYKKwkJfAlGT1JDRURfQUNUSU9OCisJCXwJQUNUSU9OCisJCXwJcD1TRU1QUkVEICggSU1QTElFUyEgeyRwLnNldFR5cGUoR0FURURfU0VNUFJFRCk7fSApPworCQkJeworCQkJZ3JhbW1hci5ibG9ja3NXaXRoU2VtUHJlZHMuYWRkKGN1cnJlbnRCbG9ja0FTVCk7CisJCQl9CisJCXwJdDM9dHJlZV8KKwkJKQorCTsKKworYXRvbQorCToJcmFuZ2UgKFJPT1RefEJBTkdeKT8KKwl8CSgKKwkJCS8vIGdyYW1tYXIucnVsZSBidXQgZW5zdXJlIG5vIHNwYWNlcy4gIkEgLiBCIiBpcyBub3QgYSBxdWFsaWZpZWQgcmVmCisJCQkvLyBXZSBkbyBoZXJlIHJhdGhlciB0aGFuIGxleGVyIHNvIHdlIGNhbiBidWlsZCBhIHRyZWUKKwkJCSh7TFQoMSkuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkrTFQoMSkuZ2V0VGV4dCgpLmxlbmd0aCgpPT1MVCgyKS5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSYmCisJCQkgTFQoMikuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkrMT09TFQoMykuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCl9PyBpZCBXSUxEQ0FSRCAodGVybWluYWx8cnVsZXJlZikpID0+CisJCQlpZCB3PVdJTERDQVJEXiAodGVybWluYWx8cnVsZXJlZikgeyR3LnNldFR5cGUoRE9UKTt9CisJCXwJdGVybWluYWwKKwkJfAlydWxlcmVmCisJCSkKKwl8CW5vdFNldCAoUk9PVF58QkFOR14pPworCTsKKworcnVsZXJlZgorCToJUlVMRV9SRUZeIEFSR19BQ1RJT04/IChST09UXnxCQU5HXik/CisJOworCitub3RTZXQKKwk6CU5PVF4KKwkJKAlub3RUZXJtaW5hbAorCQl8CWJsb2NrCisJCSkKKwk7CisKK3RyZWVSb290CitAaW5pdHthdFRyZWVSb290PXRydWU7fQorQGFmdGVye2F0VHJlZVJvb3Q9ZmFsc2U7fQorCToJaWQgKEFTU0lHTl58UExVU19BU1NJR05eKSAoYXRvbXxibG9jaykKKwl8CWF0b20KKwl8CWJsb2NrCisJOworCit0cmVlXworCToJVFJFRV9CRUdJTl4KKwkJdHJlZVJvb3QgZWxlbWVudCsKKwkJUlBBUkVOIQorCTsKKworLyoqIG1hdGNoZXMgRU5CRiBibG9ja3MgKGFuZCBzZXRzIHZpYSBibG9jayBydWxlKSAqLworZWJuZgorCToJYmxvY2sKKwkJKAlRVUVTVElPTgorCQkJLT4gXihPUFRJT05BTFskc3RhcnQsIj8iXSBibG9jaykKKwkJfAlTVEFSCisJCQktPiBeKENMT1NVUkVbJHN0YXJ0LCIqIl0gYmxvY2spCisJCXwJUExVUworCQkJLT4gXihQT1NJVElWRV9DTE9TVVJFWyRzdGFydCwiKyJdIGJsb2NrKQorCQl8CUlNUExJRVMgLy8gc3ludGFjdGljIHByZWRpY2F0ZQorCQkJLy8gaWdub3JlIGZvciBsZXhlciBydWxlcyBpbiBjb21iaW5lZAorCQkJLT4ge2dyYW1tYXJUeXBlID09IEdyYW1tYXIuQ09NQklORUQgJiYgUnVsZS5nZXRSdWxlVHlwZShjdXJyZW50UnVsZU5hbWUpID09IEdyYW1tYXIuTEVYRVJ9PyBeKFNZTlBSRURbJHN0YXJ0LCI9PiJdIGJsb2NrKQorCQkJLy8gY3JlYXRlIG1hbnVhbGx5IHNwZWNpZmllZCAoLi4uKT0+IHByZWRpY2F0ZTsgY29udmVydCB0byBzZW1wcmVkCisJCQktPiB7Y3JlYXRlU3luU2VtUHJlZEZyb21CbG9jaygkYmxvY2sudHJlZSwgU1lOX1NFTVBSRUQpfQorCQl8CVJPT1QKKwkJCS0+IF4oUk9PVCBibG9jaykKKwkJfAlCQU5HCisJCQktPiBeKEJBTkcgYmxvY2spCisJCXwKKwkJCS0+IGJsb2NrCisJCSkKKwk7CisKK3JhbmdlCisJOgljMT1DSEFSX0xJVEVSQUwgUkFOR0UgYzI9Q0hBUl9MSVRFUkFMCisJCS0+IF4oQ0hBUl9SQU5HRVskYzEsIi4uIl0gJGMxICRjMikKKwk7CisKK3Rlcm1pbmFsCisJOgljbD1DSEFSX0xJVEVSQUxeICggZWxlbWVudE9wdGlvbnNbJGNsLnRyZWVdISApPyAoUk9PVF58QkFOR14pPworCisJfAl0cj1UT0tFTl9SRUZeCisJCSggZWxlbWVudE9wdGlvbnNbJHRyLnRyZWVdISApPworCQkoIEFSR19BQ1RJT04gKT8gLy8gQXJncyBhcmUgb25seSB2YWxpZCBmb3IgbGV4ZXIgcnVsZXMKKwkJKFJPT1RefEJBTkdeKT8KKworCXwJc2w9U1RSSU5HX0xJVEVSQUxeICggZWxlbWVudE9wdGlvbnNbJHNsLnRyZWVdISApPyAoUk9PVF58QkFOR14pPworCisJfAl3aT1XSUxEQ0FSRCAoUk9PVF58QkFOR14pPworCQl7CisJCQlpZiAoIGF0VHJlZVJvb3QgKQorCQkJeworCQkJCUVycm9yTWFuYWdlci5zeW50YXhFcnJvcigKKwkJCQkJRXJyb3JNYW5hZ2VyLk1TR19XSUxEQ0FSRF9BU19ST09ULGdyYW1tYXIsJHdpLG51bGwsbnVsbCk7CisJCQl9CisJCX0KKwk7CisKK2VsZW1lbnRPcHRpb25zW0dyYW1tYXJBU1QgdGVybWluYWxBU1RdCisJOglPUEVOX0VMRU1FTlRfT1BUSU9OXiBkZWZhdWx0Tm9kZU9wdGlvblt0ZXJtaW5hbEFTVF0gQ0xPU0VfRUxFTUVOVF9PUFRJT04hCisJfAlPUEVOX0VMRU1FTlRfT1BUSU9OXiBlbGVtZW50T3B0aW9uW3Rlcm1pbmFsQVNUXSAoU0VNSSEgZWxlbWVudE9wdGlvblt0ZXJtaW5hbEFTVF0pKiBDTE9TRV9FTEVNRU5UX09QVElPTiEKKwk7CisKK2RlZmF1bHROb2RlT3B0aW9uW0dyYW1tYXJBU1QgdGVybWluYWxBU1RdCisJOgllbGVtZW50T3B0aW9uSWQKKwkJe3Rlcm1pbmFsQVNULnNldFRlcm1pbmFsT3B0aW9uKGdyYW1tYXIsR3JhbW1hci5kZWZhdWx0VG9rZW5PcHRpb24sJGVsZW1lbnRPcHRpb25JZC5xaWQpO30KKwk7CisKK2VsZW1lbnRPcHRpb25bR3JhbW1hckFTVCB0ZXJtaW5hbEFTVF0KKwk6CWlkIEFTU0lHTl4KKwkJKAllbGVtZW50T3B0aW9uSWQKKwkJCXt0ZXJtaW5hbEFTVC5zZXRUZXJtaW5hbE9wdGlvbihncmFtbWFyLCRpZC50ZXh0LCRlbGVtZW50T3B0aW9uSWQucWlkKTt9CisJCXwJKHQ9U1RSSU5HX0xJVEVSQUx8dD1ET1VCTEVfUVVPVEVfU1RSSU5HX0xJVEVSQUx8dD1ET1VCTEVfQU5HTEVfU1RSSU5HX0xJVEVSQUwpCisJCQl7dGVybWluYWxBU1Quc2V0VGVybWluYWxPcHRpb24oZ3JhbW1hciwkaWQudGV4dCwkdC50ZXh0KTt9CisJCSkKKwk7CisKK2VsZW1lbnRPcHRpb25JZCByZXR1cm5zIFtTdHJpbmcgcWlkXQorQGluaXR7U3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTt9CisJOglpPWlkIHtidWYuYXBwZW5kKCRpLnRleHQpO30gKCcuJyBpPWlkIHtidWYuYXBwZW5kKCIuIiArICRpLnRleHQpO30pKgorCQl7JHFpZCA9IGJ1Zi50b1N0cmluZygpO30KKwk7CisKK2VibmZTdWZmaXhbR3JhbW1hckFTVCBlbGVtQVNULCBib29sZWFuIGluUmV3cml0ZV0KK0Bpbml0Cit7CitHcmFtbWFyQVNUIGJsa1Jvb3Q9bnVsbDsKK0dyYW1tYXJBU1QgYWx0PW51bGw7CitHcmFtbWFyQVNUIHNhdmUgPSBjdXJyZW50QmxvY2tBU1Q7Cit9CitAYWZ0ZXIKK3sKK2N1cnJlbnRCbG9ja0FTVCA9IHNhdmU7Cit9CisJOgkoCS0+IEJMT0NLWyRlbGVtQVNULmdldFRva2VuKCksICJCTE9DSyJdCisJCSkKKwkJeyBibGtSb290ID0gKEdyYW1tYXJBU1QpJHRyZWUuZ2V0Q2hpbGQoMCk7IGN1cnJlbnRCbG9ja0FTVCA9IGJsa1Jvb3Q7IH0KKwkJKAkvLyBjcmVhdGUgYWx0CisJCQktPiBeKEFMVFskZWxlbUFTVC5nZXRUb2tlbigpLCAiQUxUIl0geyRlbGVtQVNUfSBFT0FbIjxlbmQtb2YtYWx0PiJdKQorCQkpCisJCXsKKwkJCWFsdCA9IChHcmFtbWFyQVNUKSR0cmVlLmdldENoaWxkKDApOworCQkJaWYgKCAhaW5SZXdyaXRlICkKKwkJCQlwcmVmaXhXaXRoU3luUHJlZChhbHQpOworCQl9CisJCSgJUVVFU1RJT04KKwkJCS0+IE9QVElPTkFMWyRlbGVtQVNULmdldFRva2VuKCksIj8iXQorCQl8CVNUQVIKKwkJCS0+IENMT1NVUkVbJGVsZW1BU1QuZ2V0VG9rZW4oKSwiKiJdCisJCXwJUExVUworCQkJLT4gUE9TSVRJVkVfQ0xPU1VSRVskZWxlbUFTVC5nZXRUb2tlbigpLCIrIl0KKwkJKQorCQktPiBeKCRlYm5mU3VmZml4IF4oe2Jsa1Jvb3R9IHthbHR9IEVPQlskZWxlbUFTVC5nZXRUb2tlbigpLCAiPGVuZC1vZi1ibG9jaz4iXSkpCisJOworCitub3RUZXJtaW5hbAorCToJQ0hBUl9MSVRFUkFMCisJfAlUT0tFTl9SRUYKKwl8CVNUUklOR19MSVRFUkFMCisJOworCitpZExpc3QKKwk6CWlkIChDT01NQSEgaWQpKgorCTsKKworaWQKKwk6CVRPS0VOX1JFRgorCQktPiBJRFskVE9LRU5fUkVGXQorCXwJUlVMRV9SRUYKKwkJLT4gSURbJFJVTEVfUkVGXQorCTsKKworLy8gUiBFIFcgUiBJIFQgRSAgUyBZIE4gVCBBIFgKKworcmV3cml0ZQorCToJcmV3cml0ZV93aXRoX3NlbXByZWQqCisJCVJFV1JJVEUgcmV3cml0ZV9hbHRlcm5hdGl2ZQorCQktPiBeKFJFV1JJVEVTIHJld3JpdGVfd2l0aF9zZW1wcmVkKiBeKFJFV1JJVEUgcmV3cml0ZV9hbHRlcm5hdGl2ZSkpCisJfAorCTsKKworcmV3cml0ZV93aXRoX3NlbXByZWQKKwk6CVJFV1JJVEVeIFNFTVBSRUQgcmV3cml0ZV9hbHRlcm5hdGl2ZQorCTsKKworcmV3cml0ZV9ibG9jaworCToJTFBBUkVOCisJCXJld3JpdGVfYWx0ZXJuYXRpdmUKKwkJUlBBUkVOCisJCS0+IF4oQkxPQ0tbJExQQVJFTiwiQkxPQ0siXSByZXdyaXRlX2FsdGVybmF0aXZlIEVPQlskUlBBUkVOLCI8ZW5kLW9mLWJsb2NrPiJdKQorCTsKKworcmV3cml0ZV9hbHRlcm5hdGl2ZQorb3B0aW9uc3trPTE7fQorCToJe2dyYW1tYXIuYnVpbGRUZW1wbGF0ZSgpfT8gPT4gcmV3cml0ZV90ZW1wbGF0ZQorCisJfAl7Z3JhbW1hci5idWlsZEFTVCgpfT8gPT4gKCByZXdyaXRlX2VsZW1lbnQgKSsKKwkJLT4geyFzdHJlYW1fcmV3cml0ZV9lbGVtZW50Lmhhc05leHQoKX0/IF4oQUxUW0xUKDEpLCJBTFQiXSBFUFNJTE9OWyJlcHNpbG9uIl0gRU9BWyI8ZW5kLW9mLWFsdD4iXSkKKwkJLT4gXihBTFRbTFQoMSksIkFMVCJdIHJld3JpdGVfZWxlbWVudCsgRU9BWyI8ZW5kLW9mLWFsdD4iXSkKKworCXwKKwkJLT4gXihBTFRbTFQoMSksIkFMVCJdIEVQU0lMT05bImVwc2lsb24iXSBFT0FbIjxlbmQtb2YtYWx0PiJdKQorCXwJe2dyYW1tYXIuYnVpbGRBU1QoKX0/IEVUQworCTsKKworcmV3cml0ZV9lbGVtZW50CisJOgkoCXQ9cmV3cml0ZV9hdG9tCisJCQktPiAkdAorCQkpCisJCSgJc3VicnVsZT1lYm5mU3VmZml4WyR0LnRyZWUsdHJ1ZV0KKwkJCS0+ICRzdWJydWxlCisJCSk/CisJfAlyZXdyaXRlX2VibmYKKwl8CSgJdHI9cmV3cml0ZV90cmVlCisJCQktPiAkdHIKKwkJKQorCQkoCXN1YnJ1bGU9ZWJuZlN1ZmZpeFskdHIudHJlZSx0cnVlXQorCQkJLT4gJHN1YnJ1bGUKKwkJKT8KKwk7CisKK3Jld3JpdGVfYXRvbQorCToJdHI9VE9LRU5fUkVGXiBlbGVtZW50T3B0aW9uc1skdHIudHJlZV0hPyBBUkdfQUNUSU9OPyAvLyBmb3IgaW1hZ2luYXJ5IG5vZGVzCisJfAlSVUxFX1JFRgorCXwJY2w9Q0hBUl9MSVRFUkFMIGVsZW1lbnRPcHRpb25zWyRjbC50cmVlXSE/CisJfAlzbD1TVFJJTkdfTElURVJBTCBlbGVtZW50T3B0aW9uc1skc2wudHJlZV0hPworCXwJRE9MTEFSISBsYWJlbCAvLyByZWZlcmVuY2UgdG8gYSBsYWJlbCBpbiBhIHJld3JpdGUgcnVsZQorCXwJQUNUSU9OCisJOworCitsYWJlbAorCToJVE9LRU5fUkVGIC0+IExBQkVMWyRUT0tFTl9SRUZdCisJfAlSVUxFX1JFRiAtPiBMQUJFTFskUlVMRV9SRUZdCisJOworCityZXdyaXRlX2VibmYKKwk6CWI9cmV3cml0ZV9ibG9jaworCQkoCVFVRVNUSU9OCisJCQktPiBeKE9QVElPTkFMWyRiLnN0YXJ0LCI/Il0gJGIpCisJCXwJU1RBUgorCQkJLT4gXihDTE9TVVJFWyRiLnN0YXJ0LCIqIl0gJGIpCisJCXwJUExVUworCQkJLT4gXihQT1NJVElWRV9DTE9TVVJFWyRiLnN0YXJ0LCIrIl0gJGIpCisJCSkKKwk7CisKK3Jld3JpdGVfdHJlZQorCToJVFJFRV9CRUdJTl4KKwkJCXJld3JpdGVfYXRvbSByZXdyaXRlX2VsZW1lbnQqCisJCVJQQVJFTiEKKwk7CisKKy8qKiBCdWlsZCBhIHRyZWUgZm9yIGEgdGVtcGxhdGUgcmV3cml0ZToKKwkgIF4oVEVNUExBVEUgKElEfEFDVElPTikgXihBUkdMSVNUIF4oQVJHIElEIEFDVElPTikgLi4uKSApCisJd2hlcmUgQVJHTElTVCBpcyBhbHdheXMgdGhlcmUgZXZlbiBpZiBubyBhcmdzIGV4aXN0LgorCUlEIGNhbiBiZSAidGVtcGxhdGUiIGtleXdvcmQuICBJZiBmaXJzdCBjaGlsZCBpcyBBQ1RJT04gdGhlbiBpdCdzCisJYW4gaW5kaXJlY3QgdGVtcGxhdGUgcmVmCisKKwktPiBmb28oYT17Li4ufSwgYj17Li4ufSkKKwktPiAoe3N0cmluZy1lfSkoYT17Li4ufSwgYj17Li4ufSkgIC8vIGUgZXZhbHVhdGVzIHRvIHRlbXBsYXRlIG5hbWUKKwktPiB7JXskSUQudGV4dH19IC8vIGNyZWF0ZSBsaXRlcmFsIHRlbXBsYXRlIGZyb20gc3RyaW5nIChkb25lIGluIEFjdGlvblRyYW5zbGF0b3IpCisJLT4ge3N0LWV4cHJ9IC8vIHN0LWV4cHIgZXZhbHVhdGVzIHRvIFNUCisgKi8KK3B1YmxpYworcmV3cml0ZV90ZW1wbGF0ZQorb3B0aW9uc3trPTE7fQorCToJLy8gLT4gdGVtcGxhdGUoYT17Li4ufSwuLi4pICIuLi4iCisJCXtMVCgxKS5nZXRUZXh0KCkuZXF1YWxzKCJ0ZW1wbGF0ZSIpfT8gPT4gLy8gaW5saW5lCisJCSgJcmV3cml0ZV90ZW1wbGF0ZV9oZWFkCisJCQktPiByZXdyaXRlX3RlbXBsYXRlX2hlYWQKKwkJKQorCQkoIHN0PURPVUJMRV9RVU9URV9TVFJJTkdfTElURVJBTCB8IHN0PURPVUJMRV9BTkdMRV9TVFJJTkdfTElURVJBTCApCisJCXsgYWRhcHRvci5hZGRDaGlsZCggJHRyZWUuZ2V0Q2hpbGQoMCksIGFkYXB0b3IuY3JlYXRlKCRzdCkgKTsgfQorCisJfAkvLyAtPiBmb28oYT17Li4ufSwgLi4uKQorCQlyZXdyaXRlX3RlbXBsYXRlX2hlYWQKKworCXwJLy8gLT4gKHtleHByfSkoYT17Li4ufSwgLi4uKQorCQlyZXdyaXRlX2luZGlyZWN0X3RlbXBsYXRlX2hlYWQKKworCXwJLy8gLT4gey4uLn0KKwkJQUNUSU9OCisJOworCisvKiogLT4gZm9vKGE9ey4uLn0sIC4uLikgKi8KK3Jld3JpdGVfdGVtcGxhdGVfaGVhZAorCToJaWQgbHA9TFBBUkVOCisJCXJld3JpdGVfdGVtcGxhdGVfYXJncworCQlSUEFSRU4KKwkJLT4gXihURU1QTEFURVskbHAsIlRFTVBMQVRFIl0gaWQgcmV3cml0ZV90ZW1wbGF0ZV9hcmdzKQorCTsKKworLyoqIC0+ICh7ZXhwcn0pKGE9ey4uLn0sIC4uLikgKi8KK3Jld3JpdGVfaW5kaXJlY3RfdGVtcGxhdGVfaGVhZAorCToJbHA9TFBBUkVOCisJCUFDVElPTgorCQlSUEFSRU4KKwkJTFBBUkVOIHJld3JpdGVfdGVtcGxhdGVfYXJncyBSUEFSRU4KKwkJLT4gXihURU1QTEFURVskbHAsIlRFTVBMQVRFIl0gQUNUSU9OIHJld3JpdGVfdGVtcGxhdGVfYXJncykKKwk7CisKK3Jld3JpdGVfdGVtcGxhdGVfYXJncworCToJcmV3cml0ZV90ZW1wbGF0ZV9hcmcgKENPTU1BIHJld3JpdGVfdGVtcGxhdGVfYXJnKSoKKwkJLT4gXihBUkdMSVNUWyJBUkdMSVNUIl0gcmV3cml0ZV90ZW1wbGF0ZV9hcmcrKQorCXwKKwkJLT4gQVJHTElTVFsiQVJHTElTVCJdCisJOworCityZXdyaXRlX3RlbXBsYXRlX2FyZworCToJaWQgYT1BU1NJR04gQUNUSU9OCisJCS0+IF4oQVJHWyRhLCJBUkciXSBpZCBBQ1RJT04pCisJOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMIEUgWCBFIFIKKworLy8gZ2V0IHJpZCBvZiB3YXJuaW5nczoKK2ZyYWdtZW50IFNUUklOR19MSVRFUkFMIDogOworZnJhZ21lbnQgRk9SQ0VEX0FDVElPTiA6IDsKK2ZyYWdtZW50IERPQ19DT01NRU5UIDogOworZnJhZ21lbnQgU0VNUFJFRCA6IDsKKworV1MKKwk6CSgJJyAnCisJCXwJJ1x0JworCQl8CSgnXHInKT8gJ1xuJworCQkpCisJCXsgJGNoYW5uZWwgPSBISURERU47IH0KKwk7CisKK0NPTU1FTlQKK0Bpbml0e0xpc3Q8SW50ZWdlcj4gdHlwZSA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKSB7eyBhZGQoMCk7IH19O30KKwk6CSggU0xfQ09NTUVOVCB8IE1MX0NPTU1FTlRbdHlwZV0geyR0eXBlID0gdHlwZS5nZXQoMCk7fSApCisJCXsKKwkJCWlmICggJHR5cGUgIT0gRE9DX0NPTU1FTlQgKQorCQkJCSRjaGFubmVsID0gSElEREVOOworCQl9CisJOworCitmcmFnbWVudAorU0xfQ09NTUVOVAorCToJJy8vJworCQkoCSgnICRBTlRMUicpID0+ICcgJEFOVExSICcgU1JDICgoJ1xyJyk/ICdcbicpPyAvLyBzcmMgZGlyZWN0aXZlCisJCXwJfignXHInfCdcbicpKiAoKCdccicpPyAnXG4nKT8KKwkJKQorCTsKKworZnJhZ21lbnQKK01MX0NPTU1FTlRbTGlzdDxJbnRlZ2VyPiB0eXBlXQorCToJJy8qJworCQl7JHR5cGUuc2V0KDAsIChpbnB1dC5MQSgxKSA9PSAnKicgJiYgaW5wdXQuTEEoMikgIT0gJy8nKSA/IERPQ19DT01NRU5UIDogTUxfQ09NTUVOVCk7fQorCQkuKgorCQknKi8nCisJOworCitPUEVOX0VMRU1FTlRfT1BUSU9OCisJOgknPCcKKwk7CisKK0NMT1NFX0VMRU1FTlRfT1BUSU9OCisJOgknPicKKwk7CisKK0FNUEVSU0FORCA6ICdAJzsKKworQ09NTUEgOiAnLCc7CisKK1FVRVNUSU9OIDoJJz8nIDsKKworVFJFRV9CRUdJTiA6ICdeKCcgOworCitMUEFSRU46CScoJyA7CisKK1JQQVJFTjoJJyknIDsKKworQ09MT04gOgknOicgOworCitTVEFSOgknKicgOworCitQTFVTOgknKycgOworCitBU1NJR04gOiAnPScgOworCitQTFVTX0FTU0lHTiA6ICcrPScgOworCitJTVBMSUVTIDogJz0+JyA7CisKK1JFV1JJVEUgOiAnLT4nIDsKKworU0VNSToJJzsnIDsKKworUk9PVCA6ICdeJyB7aGFzQVNUT3BlcmF0b3I9dHJ1ZTt9IDsKKworQkFORyA6ICchJyB7aGFzQVNUT3BlcmF0b3I9dHJ1ZTt9IDsKKworT1IJOgknfCcgOworCitXSUxEQ0FSRCA6ICcuJyA7CisKK0VUQyA6ICcuLi4nIDsKKworUkFOR0UgOiAnLi4nIDsKKworTk9UIDoJJ34nIDsKKworUkNVUkxZOgknfScJOworCitET0xMQVIgOiAnJCcgOworCitTVFJBWV9CUkFDS0VUCisJOgknXScKKwkJeworCQkJRXJyb3JNYW5hZ2VyLnN5bnRheEVycm9yKAorCQkJCUVycm9yTWFuYWdlci5NU0dfU1lOVEFYX0VSUk9SLAorCQkJCW51bGwsCisJCQkJc3RhdGUudG9rZW4sCisJCQkJImFudGxyOiBkYW5nbGluZyAnXSc/IG1ha2Ugc3VyZSB0byBlc2NhcGUgd2l0aCBcXF0iLAorCQkJCW51bGwpOworCQl9CisJOworCitDSEFSX0xJVEVSQUwKKwk6CSdcJycKKwkJKAlFU0MKKwkJfAl+KCdcXCd8J1wnJykKKwkJKSoKKwkJJ1wnJworCQl7CisJCQlTdHJpbmdCdWZmZXIgcyA9IEdyYW1tYXIuZ2V0VW5lc2NhcGVkU3RyaW5nRnJvbUdyYW1tYXJTdHJpbmdMaXRlcmFsKCR0ZXh0KTsKKwkJCWlmICggcy5sZW5ndGgoKSA+IDEgKQorCQkJeworCQkJCSR0eXBlID0gU1RSSU5HX0xJVEVSQUw7CisJCQl9CisJCX0KKwk7CisKK0RPVUJMRV9RVU9URV9TVFJJTkdfTElURVJBTAorQGluaXQKK3sKKwlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworfQorCToJJyInCQkJCQkJCXtidWlsZGVyLmFwcGVuZCgnIicpO30KKwkJKAkoJ1xcXCInKSA9PiAnXFwnICciJwl7YnVpbGRlci5hcHBlbmQoJyInKTt9CisJCXwJJ1xcJyBjPX4nIicJCQkJe2J1aWxkZXIuYXBwZW5kKCJcXCIgKyAoY2hhcikkYyk7fQorCQl8CWM9fignXFwnfCciJykJCQl7YnVpbGRlci5hcHBlbmQoKGNoYXIpJGMpO30KKwkJKSoKKwkJJyInCQkJCQkJCXtidWlsZGVyLmFwcGVuZCgnIicpO30KKwkJeworCQkJc2V0VGV4dChidWlsZGVyLnRvU3RyaW5nKCkpOworCQl9CisJOworCitET1VCTEVfQU5HTEVfU1RSSU5HX0xJVEVSQUwKKwk6CSc8PCcgLiogJz4+JworCTsKKworZnJhZ21lbnQKK0VTQworCToJJ1xcJworCQkoCS8vIGR1ZSB0byB0aGUgd2F5IEVTQyBpcyB1c2VkLCB3ZSBkb24ndCBuZWVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciBpbiBkaWZmZXJlbnQgd2F5cworCQkJLyonbicKKwkJfAkncicKKwkJfAkndCcKKwkJfAknYicKKwkJfAknZicKKwkJfAknIicKKwkJfAknXCcnCisJCXwJJ1xcJworCQl8CSc+JworCQl8CSd1JyBYRElHSVQgWERJR0lUIFhESUdJVCBYRElHSVQKKwkJfCovCS4gLy8gdW5rbm93biwgbGVhdmUgYXMgaXQgaXMKKwkJKQorCTsKKworZnJhZ21lbnQKK0RJR0lUCisJOgknMCcuLic5JworCTsKKworZnJhZ21lbnQKK1hESUdJVAorCToJJzAnIC4uICc5JworCXwJJ2EnIC4uICdmJworCXwJJ0EnIC4uICdGJworCTsKKworSU5UCisJOgkoJzAnLi4nOScpKworCTsKKworQVJHX0FDVElPTgorQGluaXQgeworCUxpc3Q8U3RyaW5nPiB0ZXh0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkge3sgYWRkKG51bGwpOyB9fTsKK30KKwk6CSdbJworCQlORVNURURfQVJHX0FDVElPTlt0ZXh0XQorCQknXScKKwkJe3NldFRleHQodGV4dC5nZXQoMCkpO30KKwk7CisKK2ZyYWdtZW50CitORVNURURfQVJHX0FDVElPTltMaXN0PFN0cmluZz4gdGV4dF0KK0Bpbml0IHsKKwkkdGV4dC5zZXQoMCwgIiIpOworCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Cit9CisJOgkoCSgnXFxdJykgPT4gJ1xcJyAnXScJCXtidWlsZGVyLmFwcGVuZCgiXSIpO30KKwkJfAknXFwnIGM9fignXScpCQkJe2J1aWxkZXIuYXBwZW5kKCJcXCIgKyAoY2hhcikkYyk7fQorCQl8CUFDVElPTl9TVFJJTkdfTElURVJBTAl7YnVpbGRlci5hcHBlbmQoJEFDVElPTl9TVFJJTkdfTElURVJBTC50ZXh0KTt9CisJCXwJQUNUSU9OX0NIQVJfTElURVJBTAkJe2J1aWxkZXIuYXBwZW5kKCRBQ1RJT05fQ0hBUl9MSVRFUkFMLnRleHQpO30KKwkJfAljPX4oJ1xcJ3wnIid8J1wnJ3wnXScpCXtidWlsZGVyLmFwcGVuZCgoY2hhcikkYyk7fQorCQkpKgorCQl7CisJCQkkdGV4dC5zZXQoMCwgYnVpbGRlci50b1N0cmluZygpKTsKKwkJfQorCTsKKworQUNUSU9OCitAaW5pdAoreworCWludCBhY3Rpb25MaW5lID0gZ2V0TGluZSgpOworCWludCBhY3Rpb25Db2x1bW4gPSBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKK30KKwk6CU5FU1RFRF9BQ1RJT04KKwkJKCc/JyB7JHR5cGUgPSBTRU1QUkVEO30pPworCQl7CisJCQlTdHJpbmcgYWN0aW9uID0gJHRleHQ7CisJCQlpbnQgbiA9IDE7IC8vIG51bSBkZWxpbWl0ZXIgY2hhcnMKKwkJCWlmICggYWN0aW9uLnN0YXJ0c1dpdGgoInt7IikgJiYgYWN0aW9uLmVuZHNXaXRoKCJ9fSIpICkKKwkJCXsKKwkJCQkkdHlwZSA9IEZPUkNFRF9BQ1RJT047CisJCQkJbiA9IDI7CisJCQl9CisJCQlhY3Rpb24gPSBhY3Rpb24uc3Vic3RyaW5nKG4sYWN0aW9uLmxlbmd0aCgpLW4gLSAoJHR5cGU9PVNFTVBSRUQgPyAxIDogMCkpOworCQkJc2V0VGV4dChhY3Rpb24pOworCQl9CisJOworCitmcmFnbWVudAorTkVTVEVEX0FDVElPTgorCToJJ3snCisJCSgJTkVTVEVEX0FDVElPTgorCQl8CUFDVElPTl9DSEFSX0xJVEVSQUwKKwkJfAkoJy8vJyB8ICcvKicpID0+IENPTU1FTlQKKwkJfAlBQ1RJT05fU1RSSU5HX0xJVEVSQUwKKwkJfAlBQ1RJT05fRVNDCisJCXwJfigneyd8J1wnJ3wnIid8J1xcJ3wnfScpCisJCSkqCisJCSd9JworCTsKKworZnJhZ21lbnQKK0FDVElPTl9DSEFSX0xJVEVSQUwKKwk6CSdcJycKKwkJKAlBQ1RJT05fRVNDCisJCXwJfignXFwnfCdcJycpCisJCSkqCisJCSdcJycKKwk7CisKK2ZyYWdtZW50CitBQ1RJT05fU1RSSU5HX0xJVEVSQUwKKwk6CSciJworCQkoCUFDVElPTl9FU0MKKwkJfAl+KCdcXCd8JyInKQorCQkpKgorCQknIicKKwk7CisKK2ZyYWdtZW50CitBQ1RJT05fRVNDCisJOgknXFxcJycKKwl8CSdcXFwiJworCXwJJ1xcJyB+KCdcJyd8JyInKQorCTsKKworVE9LRU5fUkVGCisJOgknQScuLidaJworCQkoCSdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JworCQkpKgorCTsKKworVE9LRU5TCisJOgkndG9rZW5zJyBXU19MT09QICd7JworCTsKKworT1BUSU9OUworCToJJ29wdGlvbnMnIFdTX0xPT1AgJ3snCisJOworCisvLyB3ZSBnZXQgYSB3YXJuaW5nIGhlcmUgd2hlbiBsb29raW5nIGZvciBvcHRpb25zICd7JywgYnV0IGl0IHdvcmtzIHJpZ2h0CitSVUxFX1JFRgorQGluaXQKK3sKKwlpbnQgdD0wOworfQorCToJJ2EnLi4neicgKCdhJy4uJ3onIHwgJ0EnLi4nWicgfCAnXycgfCAnMCcuLic5JykqCisJOworCitmcmFnbWVudAorV1NfTE9PUAorCToJKAlXUworCQl8CUNPTU1FTlQKKwkJKSoKKwk7CisKK2ZyYWdtZW50CitXU19PUFQKKwk6CShXUyk/CisJOworCisvKiogUmVzZXQgdGhlIGZpbGUgYW5kIGxpbmUgaW5mb3JtYXRpb247IHVzZWZ1bCB3aGVuIHRoZSBncmFtbWFyCisgKiAgaGFzIGJlZW4gZ2VuZXJhdGVkIHNvIHRoYXQgZXJyb3JzIGFyZSBzaG93biByZWxhdGl2ZSB0byB0aGUKKyAqICBvcmlnaW5hbCBmaWxlIGxpa2UgdGhlIG9sZCBDIHByZXByb2Nlc3NvciB1c2VkIHRvIGRvLgorICovCitmcmFnbWVudAorU1JDCisJOgknc3JjJyAnICcgZmlsZT1BQ1RJT05fU1RSSU5HX0xJVEVSQUwgJyAnIGxpbmU9SU5UCisJCXsKKwkJCXNldEZpbGVOYW1lKCRmaWxlLnRleHQuc3Vic3RyaW5nKDEsJGZpbGUudGV4dC5sZW5ndGgoKS0xKSk7CisJCQlpbnB1dC5zZXRMaW5lKEludGVnZXIucGFyc2VJbnQoJGxpbmUudGV4dCkgLSAxKTsgIC8vIC0xIGJlY2F1c2UgU0xfQ09NTUVOVCB3aWxsIGluY3JlbWVudCB0aGUgbGluZSBuby4gS1IKKwkJfQorCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9BTlRMUlRyZWVQcmludGVyLmcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQU5UTFJUcmVlUHJpbnRlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmJmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQU5UTFJUcmVlUHJpbnRlci5nCkBAIC0wLDAgKzEsNDU4IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgR3JhbW1hciBjb252ZXJzaW9uIHRvIEFOVExSIHYzOgorIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisJZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogUHJpbnQgb3V0IGEgZ3JhbW1hciAobm8gcHJldHR5IHByaW50aW5nKS4KKyAqCisgKiAgVGVyZW5jZSBQYXJyCisgKiAgVW5pdmVyc2l0eSBvZiBTYW4gRnJhbmNpc2NvCisgKiAgQXVndXN0IDE5LCAyMDAzCisgKi8KK3RyZWUgZ3JhbW1hciBBTlRMUlRyZWVQcmludGVyOworCitvcHRpb25zCit7CisJdG9rZW5Wb2NhYiA9IEFOVExSOworCUFTVExhYmVsVHlwZSA9IEdyYW1tYXJBU1Q7Cit9CisKK0BoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3JhbW1hci52MzsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Cit9CisKK0BtZW1iZXJzIHsKK3Byb3RlY3RlZCBHcmFtbWFyIGdyYW1tYXI7Citwcm90ZWN0ZWQgYm9vbGVhbiBzaG93QWN0aW9uczsKK3Byb3RlY3RlZCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKDMwMCk7CisKK3ByaXZhdGUgQU5UTFJUcmVlUHJpbnRlci5ibG9ja19yZXR1cm4gYmxvY2soR3JhbW1hckFTVCB0LCBib29sZWFuIGZvcmNlUGFyZW5zKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgIEFOVExSVHJlZVByaW50ZXIgb3RoZXIgPSBuZXcgQU5UTFJUcmVlUHJpbnRlcihuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0odCkpOworICAgIG90aGVyLmJ1ZiA9IGJ1ZjsKKyAgICByZXR1cm4gb3RoZXIuYmxvY2soZm9yY2VQYXJlbnMpOworfQorCitwdWJsaWMgZmluYWwgaW50IGNvdW50QWx0c0ZvckJsb2NrKEdyYW1tYXJBU1QgdCkgeworICAgIGludCBuID0gMDsKKyAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCB0LmdldENoaWxkQ291bnQoKTsgaSsrICkKKyAgICB7CisgICAgICAgIGlmICggdC5nZXRDaGlsZChpKS5nZXRUeXBlKCkgPT0gQUxUICkKKyAgICAgICAgICAgIG4rKzsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworcHVibGljIHZvaWQgb3V0KFN0cmluZyBzKSB7CisgICAgYnVmLmFwcGVuZChzKTsKK30KKworQE92ZXJyaWRlCitwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworICAgIFRva2VuIHRva2VuID0gbnVsbDsKKyAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pIHsKKyAgICAgICAgdG9rZW4gPSAoKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbilleCkudG9rZW47CisgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIE5vVmlhYmxlQWx0RXhjZXB0aW9uKSB7CisgICAgICAgIHRva2VuID0gKChOb1ZpYWJsZUFsdEV4Y2VwdGlvbilleCkudG9rZW47CisgICAgfQorCisgICAgRXJyb3JNYW5hZ2VyLnN5bnRheEVycm9yKAorICAgICAgICBFcnJvck1hbmFnZXIuTVNHX1NZTlRBWF9FUlJPUiwKKyAgICAgICAgZ3JhbW1hciwKKyAgICAgICAgdG9rZW4sCisgICAgICAgICJhbnRsci5wcmludDogIiArIGV4LnRvU3RyaW5nKCksCisgICAgICAgIGV4ICk7Cit9CisKKy8qKiBOb3JtYWxpemUgYSBncmFtbWFyIHByaW50IG91dCBieSByZW1vdmluZyBhbGwgZG91YmxlIHNwYWNlcworICogIGFuZCB0cmFpbGluZy9iZWdpbm5pbmcgc3R1ZmYuICBGT3IgZXhhbXBsZSwgY29udmVydAorICoKKyAqICAoIEEgIHwgIEIgIHwgIEMgKSoKKyAqCisgKiAgdG8KKyAqCisgKiAgKCBBIHwgQiB8IEMgKSoKKyAqLworcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBnKSB7CisgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihnLCAiICIsIGZhbHNlKTsKKyAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHdoaWxlICggc3QuaGFzTW9yZVRva2VucygpICkgeworICAgICAgICBTdHJpbmcgdyA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICBidWYuYXBwZW5kKHcpOworICAgICAgICBidWYuYXBwZW5kKCIgIik7CisgICAgfQorICAgIHJldHVybiBidWYudG9TdHJpbmcoKS50cmltKCk7Cit9Cit9CisKKy8qKiBDYWxsIHRoaXMgdG8gZmlndXJlIG91dCBob3cgdG8gcHJpbnQgKi8KK3B1YmxpYwordG9TdHJpbmdbR3JhbW1hciBnLCBib29sZWFuIHNob3dBY3Rpb25zXSByZXR1cm5zIFtTdHJpbmcgcz1udWxsXQorQGluaXQgeworCWdyYW1tYXIgPSBnOworCXRoaXMuc2hvd0FjdGlvbnMgPSBzaG93QWN0aW9uczsKK30KKwk6CSgJZ3JhbW1hcl8KKwkJfAlydWxlCisJCXwJYWx0ZXJuYXRpdmUKKwkJfAllbGVtZW50CisJCXwJc2luZ2xlX3Jld3JpdGUKKwkJfAlyZXdyaXRlCisJCXwJRU9SIC8ve3M9IkVPUiI7fQorCQkpCisJCXtyZXR1cm4gbm9ybWFsaXplKGJ1Zi50b1N0cmluZygpKTt9CisJOworCisvLyAtLS0tLS0tLS0tLS0tLQorCitncmFtbWFyXworCToJXiggTEVYRVJfR1JBTU1BUiBncmFtbWFyU3BlY1sibGV4ZXIgIiBdICkKKwl8CV4oIFBBUlNFUl9HUkFNTUFSIGdyYW1tYXJTcGVjWyJwYXJzZXIgIl0gKQorCXwJXiggVFJFRV9HUkFNTUFSIGdyYW1tYXJTcGVjWyJ0cmVlICJdICkKKwl8CV4oIENPTUJJTkVEX0dSQU1NQVIgZ3JhbW1hclNwZWNbIiJdICkKKwk7CisKK2F0dHJTY29wZQorCToJXiggJ3Njb3BlJyBJRCBydWxlQWN0aW9uKiBBQ1RJT04gKQorCTsKKworZ3JhbW1hclNwZWNbU3RyaW5nIGd0eXBlXQorCToJaWQ9SUQge291dChndHlwZSsiZ3JhbW1hciAiKyRpZC50ZXh0KTt9CisJCShjbXQ9RE9DX0NPTU1FTlQge291dCgkY210LnRleHQrIlxuIik7fSApPworCQkob3B0aW9uc1NwZWMpPyB7b3V0KCI7XG4iKTt9CisJCShkZWxlZ2F0ZUdyYW1tYXJzKT8KKwkJKHRva2Vuc1NwZWMpPworCQkoYXR0clNjb3BlKSoKKwkJKGFjdGlvbnMpPworCQlydWxlcworCTsKKworYWN0aW9ucworCToJKCBhY3Rpb24gKSsKKwk7CisKK2FjdGlvbgorQGluaXQgeworCVN0cmluZyBzY29wZT1udWxsLCBuYW1lPW51bGw7CisJU3RyaW5nIGFjdGlvbj1udWxsOworfQorCToJXigJQU1QRVJTQU5EIGlkMT1JRAorCQkJKAlpZDI9SUQgYTE9QUNUSU9OCisJCQkJe3Njb3BlPSRpZDEudGV4dDsgbmFtZT0kYTEudGV4dDsgYWN0aW9uPSRhMS50ZXh0O30KKwkJCXwJYTI9QUNUSU9OCisJCQkJe3Njb3BlPW51bGw7IG5hbWU9JGlkMS50ZXh0OyBhY3Rpb249JGEyLnRleHQ7fQorCQkJKQorCQkpCisJCXsKKwkJCWlmICggc2hvd0FjdGlvbnMgKQorCQkJeworCQkJCW91dCgiQCIrKHNjb3BlIT1udWxsP3Njb3BlKyI6OiI6IiIpK25hbWUrYWN0aW9uKTsKKwkJCX0KKwkJfQorCTsKKworb3B0aW9uc1NwZWMKKwk6CV4oCU9QVElPTlMge291dCgiIG9wdGlvbnMgeyIpO30KKwkJCShvcHRpb24ge291dCgiOyAiKTt9KSsKKwkJCXtvdXQoIn0gIik7fQorCQkpCisJOworCitvcHRpb24KKwk6CV4oIEFTU0lHTiBpZD1JRCB7b3V0KCRpZC50ZXh0KyI9Iik7fSBvcHRpb25WYWx1ZSApCisJOworCitvcHRpb25WYWx1ZQorCToJaWQ9SUQgICAgICAgICAgICB7b3V0KCRpZC50ZXh0KTt9CisJfAlzPVNUUklOR19MSVRFUkFMIHtvdXQoJHMudGV4dCk7fQorCXwJYz1DSEFSX0xJVEVSQUwgICB7b3V0KCRjLnRleHQpO30KKwl8CWk9SU5UICAgICAgICAgICAge291dCgkaS50ZXh0KTt9CisvLwl8ICAgY2hhclNldAorCTsKKworLyoKK2NoYXJTZXQKKwk6ICAgIyggQ0hBUlNFVCBjaGFyU2V0RWxlbWVudCApCisJOworCitjaGFyU2V0RWxlbWVudAorCTogICBjOkNIQVJfTElURVJBTCB7b3V0KCNjLmdldFRleHQoKSk7fQorCXwgICAjKCBPUiBjMTpDSEFSX0xJVEVSQUwgYzI6Q0hBUl9MSVRFUkFMICkKKwl8ICAgIyggUkFOR0UgYzM6Q0hBUl9MSVRFUkFMIGM0OkNIQVJfTElURVJBTCApCisJOworKi8KKworZGVsZWdhdGVHcmFtbWFycworCToJXiggJ2ltcG9ydCcgKCBeKEFTU0lHTiBJRCBJRCkgfCBJRCApKyApCisJOworCit0b2tlbnNTcGVjCisJOgleKFRPS0VOUyB0b2tlblNwZWMqKQorCTsKKwordG9rZW5TcGVjCisJOglUT0tFTl9SRUYKKwl8CV4oIEFTU0lHTiBUT0tFTl9SRUYgKFNUUklOR19MSVRFUkFMfENIQVJfTElURVJBTCkgKQorCTsKKworcnVsZXMKKwk6CSggcnVsZSB8IHByZWNSdWxlICkrCisJOworCitydWxlCisJOgleKAlSVUxFIGlkPUlECisJCQkobW9kaWZpZXIpPworCQkJe291dCgkaWQudGV4dCk7fQorCQkJXihBUkcgKGFyZz1BUkdfQUNUSU9OIHtvdXQoIlsiKyRhcmcudGV4dCsiXSIpO30gKT8gKQorCQkJXihSRVQgKHJldD1BUkdfQUNUSU9OIHtvdXQoIiByZXR1cm5zIFsiKyRyZXQudGV4dCsiXSIpO30gKT8gKQorCQkJKHRocm93c1NwZWMpPworCQkJKG9wdGlvbnNTcGVjKT8KKwkJCShydWxlU2NvcGVTcGVjKT8KKwkJCShydWxlQWN0aW9uKSoKKwkJCXtvdXQoIiA6Iik7fQorCQkJeworCQkJCWlmICggaW5wdXQuTEEoNSkgPT0gTk9UIHx8IGlucHV0LkxBKDUpID09IEFTU0lHTiApCisJCQkJCW91dCgiICIpOworCQkJfQorCQkJYj1ibG9ja1tmYWxzZV0KKwkJCShleGNlcHRpb25Hcm91cCk/CisJCQlFT1Ige291dCgiO1xuIik7fQorCQkpCisJOworCitwcmVjUnVsZQorCToJXigJUFJFQ19SVUxFIGlkPUlECisJCQkobW9kaWZpZXIpPworCQkJe291dCgkaWQudGV4dCk7fQorCQkJXihBUkcgKGFyZz1BUkdfQUNUSU9OIHtvdXQoIlsiKyRhcmcudGV4dCsiXSIpO30gKT8gKQorCQkJXihSRVQgKHJldD1BUkdfQUNUSU9OIHtvdXQoIiByZXR1cm5zIFsiKyRyZXQudGV4dCsiXSIpO30gKT8gKQorCQkJKHRocm93c1NwZWMpPworCQkJKG9wdGlvbnNTcGVjKT8KKwkJCShydWxlU2NvcGVTcGVjKT8KKwkJCShydWxlQWN0aW9uKSoKKwkJCXtvdXQoIiA6Iik7fQorCQkJeworCQkJCWlmICggaW5wdXQuTEEoNSkgPT0gTk9UIHx8IGlucHV0LkxBKDUpID09IEFTU0lHTiApCisJCQkJCW91dCgiICIpOworCQkJfQorCQkJYj1ibG9ja1tmYWxzZV0KKwkJCShleGNlcHRpb25Hcm91cCk/CisJCQlFT1Ige291dCgiO1xuIik7fQorCQkpCisJOworCitydWxlQWN0aW9uCisJOgleKEFNUEVSU0FORCBpZD1JRCBhPUFDVElPTiApCisJCXtpZiAoIHNob3dBY3Rpb25zICkgb3V0KCJAIiskaWQudGV4dCsieyIrJGEudGV4dCsifSIpO30KKwk7CisKK21vZGlmaWVyCitAaW5pdAore291dCgkbW9kaWZpZXIuc3RhcnQuZ2V0VGV4dCgpKTsgb3V0KCIgIik7fQorCToJJ3Byb3RlY3RlZCcKKwl8CSdwdWJsaWMnCisJfAkncHJpdmF0ZScKKwl8CSdmcmFnbWVudCcKKwk7CisKK3Rocm93c1NwZWMKKwk6CV4oJ3Rocm93cycgSUQrKQorCTsKKworcnVsZVNjb3BlU3BlYworCToJXiggJ3Njb3BlJyBydWxlQWN0aW9uKiAoQUNUSU9OKT8gKCBJRCApKiApCisJOworCitibG9ja1tib29sZWFuIGZvcmNlUGFyZW5zXQorQGluaXQKK3sKK2ludCBudW1BbHRzID0gY291bnRBbHRzRm9yQmxvY2soJHN0YXJ0KTsKK30KKwk6CV4oCUJMT0NLCisJCQl7CisJCQkJaWYgKCBmb3JjZVBhcmVuc3x8bnVtQWx0cz4xICkKKwkJCQl7CisJCQkJCS8vZm9yICggQW50bHIuUnVudGltZS5UcmVlLlRyZWUgcGFyZW50ID0gJHN0YXJ0LmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0VHlwZSgpICE9IFJVTEU7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSApCisJCQkJCS8veworCQkJCQkvLwlpZiAoIHBhcmVudC5nZXRUeXBlKCkgPT0gQkxPQ0sgJiYgY291bnRBbHRzRm9yQmxvY2soKEdyYW1tYXJBU1QpcGFyZW50KSA+IDEgKQorCQkJCQkvLwl7CisJCQkJCS8vCQlvdXQoIiAiKTsKKwkJCQkJLy8JCWJyZWFrOworCQkJCQkvLwl9CisJCQkJCS8vfQorCQkJCQlvdXQoIiAoIik7CisJCQkJfQorCQkJfQorCQkJKG9wdGlvbnNTcGVjIHtvdXQoIiA6Iik7fSApPworCQkJYWx0ZXJuYXRpdmUgcmV3cml0ZSAoIHtvdXQoInwiKTt9IGFsdGVybmF0aXZlIHJld3JpdGUgKSoKKwkJCUVPQiAgIHtpZiAoIGZvcmNlUGFyZW5zfHxudW1BbHRzPjEgKSBvdXQoIikiKTt9CisJCSApCisJOworCithbHRlcm5hdGl2ZQorCToJXiggQUxUIGVsZW1lbnQqIEVPQSApCisJOworCitleGNlcHRpb25Hcm91cAorCToJKCBleGNlcHRpb25IYW5kbGVyICkrIChmaW5hbGx5Q2xhdXNlKT8KKwl8CWZpbmFsbHlDbGF1c2UKKwk7CisKK2V4Y2VwdGlvbkhhbmRsZXIKKwk6CV4oJ2NhdGNoJyBBUkdfQUNUSU9OIEFDVElPTikKKwk7CisKK2ZpbmFsbHlDbGF1c2UKKwk6CV4oJ2ZpbmFsbHknIEFDVElPTikKKwk7CisKK3Jld3JpdGUKKwk6CV4oUkVXUklURVMgc2luZ2xlX3Jld3JpdGUrKQorCXwJUkVXUklURVMKKwl8CisJOworCitzaW5nbGVfcmV3cml0ZQorCToJXigJUkVXUklURSB7b3V0KCIgLT4iKTt9CisJCQkoCVNFTVBSRUQge291dCgiIHsiKyRTRU1QUkVELnRleHQrIn0/Iik7fQorCQkJKT8KKwkJCSgJYWx0ZXJuYXRpdmUKKwkJCXwJcmV3cml0ZV90ZW1wbGF0ZQorCQkJfAlFVEMge291dCgiLi4uIik7fQorCQkJfAlBQ1RJT04ge291dCgiIHsiKyRBQ1RJT04udGV4dCsifSIpO30KKwkJCSkKKwkJKQorCTsKKworcmV3cml0ZV90ZW1wbGF0ZQorCToJXigJVEVNUExBVEUKKwkJCSgJaWQ9SUQge291dCgiICIrJGlkLnRleHQpO30KKwkJCXwJaW5kPUFDVElPTiB7b3V0KCIgKHsiKyRpbmQudGV4dCsifSkiKTt9CisJCQkpCisJCQleKAlBUkdMSVNUCisJCQkJe291dCgiKCIpO30KKwkJCQkoCV4oCUFSRyBhcmc9SUQge291dCgkYXJnLnRleHQrIj0iKTt9CisJCQkJCQlhPUFDVElPTiAgIHtvdXQoJGEudGV4dCk7fQorCQkJCQkpCisJCQkJKSoKKwkJCQl7b3V0KCIpIik7fQorCQkJKQorCQkJKAlET1VCTEVfUVVPVEVfU1RSSU5HX0xJVEVSQUwge291dCgiICIrJERPVUJMRV9RVU9URV9TVFJJTkdfTElURVJBTC50ZXh0KTt9CisJCQl8CURPVUJMRV9BTkdMRV9TVFJJTkdfTElURVJBTCB7b3V0KCIgIiskRE9VQkxFX0FOR0xFX1NUUklOR19MSVRFUkFMLnRleHQpO30KKwkJCSk/CisJCSkKKwk7CisKK2VsZW1lbnQKKwk6CV4oUk9PVCBlbGVtZW50KSB7b3V0KCJeIik7fQorCXwJXihCQU5HIGVsZW1lbnQpIHtvdXQoIiEiKTt9CisJfAlhdG9tCisJfAleKE5PVCB7b3V0KCJ+Iik7fSBlbGVtZW50KQorCXwJXihSQU5HRSBhdG9tIHtvdXQoIi4uIik7fSBhdG9tKQorCXwJXihDSEFSX1JBTkdFIGF0b20ge291dCgiLi4iKTt9IGF0b20pCisJfAleKEFTU0lHTiBpZD1JRCB7b3V0KCRpZC50ZXh0KyI9Iik7fSBlbGVtZW50KQorCXwJXihQTFVTX0FTU0lHTiBpZDI9SUQge291dCgkaWQyLnRleHQrIis9Iik7fSBlbGVtZW50KQorCXwJZWJuZgorCXwJdHJlZV8KKwl8CV4oIFNZTlBSRUQgYmxvY2tbdHJ1ZV0gKSB7b3V0KCI9PiIpO30KKwl8CWE9QUNUSU9OICB7aWYgKCBzaG93QWN0aW9ucyApIHtvdXQoInsiKTsgb3V0KCRhLnRleHQpOyBvdXQoIn0iKTt9fQorCXwJYTI9Rk9SQ0VEX0FDVElPTiAge2lmICggc2hvd0FjdGlvbnMgKSB7b3V0KCJ7eyIpOyBvdXQoJGEyLnRleHQpOyBvdXQoIn19Iik7fX0KKwl8CXByZWQ9U0VNUFJFRAorCQl7CisJCQlpZiAoIHNob3dBY3Rpb25zICkKKwkJCXsKKwkJCQlvdXQoInsiKTsKKwkJCQlvdXQoJHByZWQudGV4dCk7CisJCQkJb3V0KCJ9PyIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW91dCgiey4uLn0/Iik7CisJCQl9CisJCX0KKwl8CXNwcmVkPVNZTl9TRU1QUkVECisJCXsKKwkJCVN0cmluZyBuYW1lID0gJHNwcmVkLnRleHQ7CisJCQlHcmFtbWFyQVNUIHByZWRBU1Q9Z3JhbW1hci5nZXRTeW50YWN0aWNQcmVkaWNhdGUobmFtZSk7CisJCQlibG9jayhwcmVkQVNULCB0cnVlKTsKKwkJCW91dCgiPT4iKTsKKwkJfQorCXwJXihCQUNLVFJBQ0tfU0VNUFJFRCAuKikgLy8gZG9uJ3QgcHJpbnQgYW55dGhpbmcgKGF1dG8gYmFja3RyYWNrIHN0dWZmKQorCXwJZ3ByZWQ9R0FURURfU0VNUFJFRAorCQl7CisJCWlmICggc2hvd0FjdGlvbnMgKSB7b3V0KCJ7Iik7IG91dCgkZ3ByZWQudGV4dCk7IG91dCgifT8gPT4iKTt9CisJCWVsc2Uge291dCgiey4uLn0/ID0+Iik7fQorCQl9CisJfAlFUFNJTE9OCisJOworCitlYm5mCisJOglibG9ja1t0cnVlXSB7b3V0KCIgIik7fQorCXwJXiggT1BUSU9OQUwgYmxvY2tbdHJ1ZV0gKSB7b3V0KCI/ICIpO30KKwl8CV4oIENMT1NVUkUgYmxvY2tbdHJ1ZV0gKSAge291dCgiKiAiKTt9CisJfAleKCBQT1NJVElWRV9DTE9TVVJFIGJsb2NrW3RydWVdICkge291dCgiKyAiKTt9CisJOworCit0cmVlXworCToJXihUUkVFX0JFR0lOIHtvdXQoIiBeKCIpO30gZWxlbWVudCAoZWxlbWVudCkqIHtvdXQoIikgIik7fSApCisJOworCithdG9tCitAaW5pdAore291dCgiICIpO30KKwk6CSgJXigJUlVMRV9SRUYJCXtvdXQoJHN0YXJ0LnRvU3RyaW5nKCkpO30KKwkJCQkocmFyZz1BUkdfQUNUSU9OCXtvdXQoIlsiKyRyYXJnLnRvU3RyaW5nKCkrIl0iKTt9KT8KKwkJCQkoYXN0X3N1ZmZpeCk/CisJCQkpCisJCXwJXigJVE9LRU5fUkVGCQl7b3V0KCRzdGFydC50b1N0cmluZygpKTt9CisJCQkJKHRhcmc9QVJHX0FDVElPTgl7b3V0KCJbIiskdGFyZy50b1N0cmluZygpKyJdIik7fSApPworCQkJCShhc3Rfc3VmZml4KT8KKwkJCSkKKwkJfAleKAlDSEFSX0xJVEVSQUwJe291dCgkc3RhcnQudG9TdHJpbmcoKSk7fQorCQkJCShhc3Rfc3VmZml4KT8KKwkJCSkKKwkJfAleKAlTVFJJTkdfTElURVJBTAl7b3V0KCRzdGFydC50b1N0cmluZygpKTt9CisJCQkJKGFzdF9zdWZmaXgpPworCQkJKQorCQl8CV4oCVdJTERDQVJECQl7b3V0KCRzdGFydC50b1N0cmluZygpKTt9CisJCQkJKGFzdF9zdWZmaXgpPworCQkJKQorCQkpCisJCXtvdXQoIiAiKTt9CisJfAlMQUJFTCB7b3V0KCIgJCIrJExBQkVMLnRleHQpO30gLy8gdXNlZCBpbiAtPiByZXdyaXRlcworCXwJXihET1QgSUQge291dCgkSUQudGV4dCsiLiIpO30gYXRvbSkgLy8gc2NvcGUgb3ZlcnJpZGUgb24gcnVsZQorCTsKKworYXN0X3N1ZmZpeAorCToJUk9PVCB7b3V0KCJeIik7fQorCXwJQkFORyAge291dCgiISIpO30KKwk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQU5UTFJ2My5nIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0FOVExSdjMuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZjZmEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0FOVExSdjMuZwpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworLyoqIEFOVExSIHYzIGdyYW1tYXIgd3JpdHRlbiBpbiBBTlRMUiB2MyB3aXRoIEFTVCBjb25zdHJ1Y3Rpb24gKi8KK2dyYW1tYXIgQU5UTFJ2MzsKKworb3B0aW9ucyB7CisJb3V0cHV0PUFTVDsKKwlBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsKK30KKwordG9rZW5zIHsKKwlET0NfQ09NTUVOVDsKKwlQQVJTRVI7CQorICAgIExFWEVSOworICAgIFJVTEU7CisgICAgQkxPQ0s7CisgICAgT1BUSU9OQUw7CisgICAgQ0xPU1VSRTsKKyAgICBQT1NJVElWRV9DTE9TVVJFOworICAgIFNZTlBSRUQ7CisgICAgUkFOR0U7CisgICAgQ0hBUl9SQU5HRTsKKyAgICBFUFNJTE9OOworICAgIEFMVDsKKyAgICBFT1I7CisgICAgRU9COworICAgIEVPQTsgLy8gZW5kIG9mIGFsdAorICAgIElEOworICAgIEFSRzsKKyAgICBBUkdMSVNUOworICAgIFJFVD0ncmV0dXJucyc7CisgICAgTEVYRVJfR1JBTU1BUjsKKyAgICBQQVJTRVJfR1JBTU1BUjsKKyAgICBUUkVFX0dSQU1NQVI7CisgICAgQ09NQklORURfR1JBTU1BUjsKKyAgICBMQUJFTDsgLy8gJHggdXNlZCBpbiByZXdyaXRlIHJ1bGVzCisgICAgVEVNUExBVEU7CisgICAgU0NPUEU9J3Njb3BlJzsKKyAgICBTRU1QUkVEOworICAgIEdBVEVEX1NFTVBSRUQ7IC8vIHtwfT8gPT4KKyAgICBTWU5fU0VNUFJFRDsgLy8gKC4uLikgPT4gICBpdCdzIGEgbWFudWFsbHktc3BlY2lmaWVkIHN5bnByZWQgY29udmVydGVkIHRvIHNlbXByZWQKKyAgICBCQUNLVFJBQ0tfU0VNUFJFRDsgLy8gYXV0byBiYWNrdHJhY2tpbmcgbW9kZSBzeW4gcHJlZCBjb252ZXJ0ZWQgdG8gc2VtcHJlZAorICAgIEZSQUdNRU5UPSdmcmFnbWVudCc7CisgICAgVFJFRV9CRUdJTj0nXignOworICAgIFJPT1Q9J14nOworICAgIEJBTkc9JyEnOworICAgIFJBTkdFPScuLic7CisgICAgUkVXUklURT0nLT4nOworICAgIEFUPSdAJzsKKyAgICBMQUJFTF9BU1NJR049Jz0nOworICAgIExJU1RfTEFCRUxfQVNTSUdOPScrPSc7Cit9CisKK0BwYXJzZXI6OmhlYWRlcgoreworICAgIHBhY2thZ2Ugb3JnLmFudGxyLmdyYW1tYXIudjM7Cit9CitAbGV4ZXI6OmhlYWRlcgoreworICAgIHBhY2thZ2Ugb3JnLmFudGxyLmdyYW1tYXIudjM7Cit9CisKK0BtZW1iZXJzIHsKKwlpbnQgZ3R5cGU7Cit9CisKK2dyYW1tYXJEZWYKKyAgICA6ICAgRE9DX0NPTU1FTlQ/CisgICAgCSgJJ2xleGVyJyAge2d0eXBlPUxFWEVSX0dSQU1NQVI7fSAgICAvLyBwdXJlIGxleGVyCisgICAgCXwgICAncGFyc2VyJyB7Z3R5cGU9UEFSU0VSX0dSQU1NQVI7fSAgIC8vIHB1cmUgcGFyc2VyCisgICAgCXwgICAndHJlZScgICB7Z3R5cGU9VFJFRV9HUkFNTUFSO30gICAgIC8vIGEgdHJlZSBwYXJzZXIKKyAgICAJfAkJICAgICB7Z3R5cGU9Q09NQklORURfR1JBTU1BUjt9IC8vIG1lcmdlZCBwYXJzZXIvbGV4ZXIKKyAgICAJKQorICAgIAlnPSdncmFtbWFyJyBpZCAnOycgb3B0aW9uc1NwZWM/IHRva2Vuc1NwZWM/IGF0dHJTY29wZSogYWN0aW9uKgorICAgIAlydWxlKworICAgIAlFT0YKKyAgICAJLT4gXigge2FkYXB0b3IuY3JlYXRlKGd0eXBlLCRnKX0KKyAgICAJCSAgaWQgRE9DX0NPTU1FTlQ/IG9wdGlvbnNTcGVjPyB0b2tlbnNTcGVjPyBhdHRyU2NvcGUqIGFjdGlvbiogcnVsZSsKKyAgICAJCSkKKyAgICA7CisKK3Rva2Vuc1NwZWMKKwk6CVRPS0VOUyB0b2tlblNwZWMrICd9JyAtPiBeKFRPS0VOUyB0b2tlblNwZWMrKQorCTsKKwordG9rZW5TcGVjCisJOglUT0tFTl9SRUYKKwkJKAknPScgKGxpdD1TVFJJTkdfTElURVJBTHxsaXQ9Q0hBUl9MSVRFUkFMKQktPiBeKCc9JyBUT0tFTl9SRUYgJGxpdCkKKwkJfAkJCQkJCQkJCQkJCS0+IFRPS0VOX1JFRgorCQkpCisJCSc7JworCTsKKworYXR0clNjb3BlCisJOgknc2NvcGUnIGlkIEFDVElPTiAtPiBeKCdzY29wZScgaWQgQUNUSU9OKQorCTsKKworLyoqIE1hdGNoIHN0dWZmIGxpa2UgQHBhcnNlcjo6bWVtYmVycyB7aW50IGk7fSAqLworYWN0aW9uCisJOgknQCcgKGFjdGlvblNjb3BlTmFtZSAnOjonKT8gaWQgQUNUSU9OIC0+IF4oJ0AnIGFjdGlvblNjb3BlTmFtZT8gaWQgQUNUSU9OKQorCTsKKworLyoqIFNvbWV0aW1lcyB0aGUgc2NvcGUgbmFtZXMgd2lsbCBjb2xsaWRlIHdpdGgga2V5d29yZHM7IGFsbG93IHRoZW0gYXMKKyAqICBpZHMgZm9yIGFjdGlvbiBzY29wZXMuCisgKi8KK2FjdGlvblNjb3BlTmFtZQorCToJaWQKKwl8CWw9J2xleGVyJwktPiBJRFskbF0KKyAgICB8ICAgcD0ncGFyc2VyJwktPiBJRFskcF0KKwk7CisKK29wdGlvbnNTcGVjCisJOglPUFRJT05TIChvcHRpb24gJzsnKSsgJ30nIC0+IF4oT1BUSU9OUyBvcHRpb24rKQorCTsKKworb3B0aW9uCisgICAgOiAgIGlkICc9JyBvcHRpb25WYWx1ZSAtPiBeKCc9JyBpZCBvcHRpb25WYWx1ZSkKKyAJOworIAkKK29wdGlvblZhbHVlCisgICAgOiAgIHFpZAorICAgIHwgICBTVFJJTkdfTElURVJBTAorICAgIHwgICBDSEFSX0xJVEVSQUwKKyAgICB8ICAgSU5UCisgICAgfAlzPScqJyAtPiBTVFJJTkdfTElURVJBTFskc10gIC8vIHVzZWQgZm9yIGs9KgorICAgIDsKKworcnVsZQorc2NvcGUgeworCVN0cmluZyBuYW1lOworfQorCToJRE9DX0NPTU1FTlQ/CisJCSggbW9kaWZpZXI9KCdwcm90ZWN0ZWQnfCdwdWJsaWMnfCdwcml2YXRlJ3wnZnJhZ21lbnQnKSApPworCQlpZCB7JHJ1bGU6Om5hbWUgPSAkaWQudGV4dDt9CisJCSchJz8KKwkJKCBhcmc9QVJHX0FDVElPTiApPworCQkoICdyZXR1cm5zJyBydD1BUkdfQUNUSU9OICApPworCQl0aHJvd3NTcGVjPyBvcHRpb25zU3BlYz8gcnVsZVNjb3BlU3BlYz8gcnVsZUFjdGlvbioKKwkJJzonCWFsdExpc3QJJzsnCisJCWV4Y2VwdGlvbkdyb3VwPworCSAgICAtPiBeKCBSVUxFIGlkIHttb2RpZmllciE9bnVsbD9hZGFwdG9yLmNyZWF0ZShtb2RpZmllcik6bnVsbH0gXihBUkdbJGFyZ10gJGFyZyk/IF4oJ3JldHVybnMnICRydCk/CisJICAgIAkgIHRocm93c1NwZWM/IG9wdGlvbnNTcGVjPyBydWxlU2NvcGVTcGVjPyBydWxlQWN0aW9uKgorCSAgICAJICBhbHRMaXN0CisJICAgIAkgIGV4Y2VwdGlvbkdyb3VwPworCSAgICAJICBFT1JbIkVPUiJdCisJICAgIAkpCisJOworCisvKiogTWF0Y2ggc3R1ZmYgbGlrZSBAaW5pdCB7aW50IGk7fSAqLworcnVsZUFjdGlvbgorCToJJ0AnIGlkIEFDVElPTiAtPiBeKCdAJyBpZCBBQ1RJT04pCisJOworCit0aHJvd3NTcGVjCisJOgkndGhyb3dzJyBpZCAoICcsJyBpZCApKiAtPiBeKCd0aHJvd3MnIGlkKykKKwk7CisKK3J1bGVTY29wZVNwZWMKKwk6CSdzY29wZScgQUNUSU9OIC0+IF4oJ3Njb3BlJyBBQ1RJT04pCisJfAknc2NvcGUnIGlkICgnLCcgaWQpKiAnOycgLT4gXignc2NvcGUnIGlkKykKKwl8CSdzY29wZScgQUNUSU9OCisJCSdzY29wZScgaWQgKCcsJyBpZCkqICc7JworCQktPiBeKCdzY29wZScgQUNUSU9OIGlkKyApCisJOworCitibG9jaworICAgIDogICBscD0nKCcKKwkJKCAob3B0cz1vcHRpb25zU3BlYyk/ICc6JyApPworCQlhbHRwYWlyICggJ3wnIGFsdHBhaXIgKSoKKyAgICAgICAgcnA9JyknCisgICAgICAgIC0+IF4oIEJMT0NLWyRscCwiQkxPQ0siXSBvcHRpb25zU3BlYz8gYWx0cGFpcisgRU9CWyRycCwiRU9CIl0gKQorICAgIDsKKworYWx0cGFpciA6IGFsdGVybmF0aXZlIHJld3JpdGUgOworCithbHRMaXN0CitAaW5pdCB7CisJLy8gbXVzdCBjcmVhdGUgcm9vdCBtYW51YWxseSBhcyBpdCdzIHVzZWQgYnkgaW52b2tlZCBydWxlcyBpbiByZWFsIGFudGxyIHRvb2wuCisJLy8gbGVhdmUgaGVyZSB0byBkZW1vbnN0cmF0ZSB1c2Ugb2Ygey4uLn0gaW4gcmV3cml0ZSBydWxlCisJLy8gaXQncyByZWFsbHkgQkxPQ0tbZmlyc3RUb2tlbiwiQkxPQ0siXTsgc2V0IGxpbmUvY29sIHRvIHByZXZpb3VzICggb3IgOiB0b2tlbi4KKyAgICBDb21tb25UcmVlIGJsa1Jvb3QgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLmNyZWF0ZShCTE9DSyxpbnB1dC5MVCgtMSksIkJMT0NLIik7Cit9CisgICAgOiAgIGFsdHBhaXIgKCAnfCcgYWx0cGFpciApKiAtPiBeKCB7YmxrUm9vdH0gYWx0cGFpcisgRU9CWyJFT0IiXSApCisgICAgOworCithbHRlcm5hdGl2ZQorQGluaXQgeworCVRva2VuIGZpcnN0VG9rZW4gPSBpbnB1dC5MVCgxKTsKKwlUb2tlbiBwcmV2VG9rZW4gPSBpbnB1dC5MVCgtMSk7IC8vIGVpdGhlciA6IG9yIHwgSSB0aGluaworfQorICAgIDogICBlbGVtZW50KyAtPiBeKEFMVFtmaXJzdFRva2VuLCJBTFQiXSBlbGVtZW50KyBFT0FbIkVPQSJdKQorICAgIHwgICAtPiBeKEFMVFtwcmV2VG9rZW4sIkFMVCJdIEVQU0lMT05bcHJldlRva2VuLCJFUFNJTE9OIl0gRU9BWyJFT0EiXSkKKyAgICA7CisKK2V4Y2VwdGlvbkdyb3VwCisJOgkoIGV4Y2VwdGlvbkhhbmRsZXIgKSsgKCBmaW5hbGx5Q2xhdXNlICk/CisJfAlmaW5hbGx5Q2xhdXNlCisgICAgOworCitleGNlcHRpb25IYW5kbGVyCisgICAgOiAgICAnY2F0Y2gnIEFSR19BQ1RJT04gQUNUSU9OIC0+IF4oJ2NhdGNoJyBBUkdfQUNUSU9OIEFDVElPTikKKyAgICA7CisKK2ZpbmFsbHlDbGF1c2UKKyAgICA6ICAgICdmaW5hbGx5JyBBQ1RJT04gLT4gXignZmluYWxseScgQUNUSU9OKQorICAgIDsKKworZWxlbWVudAorCToJaWQgKGxhYmVsT3A9Jz0nfGxhYmVsT3A9Jys9JykgYXRvbQorCQkoCWVibmZTdWZmaXgJLT4gXiggZWJuZlN1ZmZpeCBeKEJMT0NLWyJCTE9DSyJdIF4oQUxUWyJBTFQiXSBeKCRsYWJlbE9wIGlkIGF0b20pIEVPQVsiRU9BIl0pIEVPQlsiRU9CIl0pKQorCQl8CQkJCS0+IF4oJGxhYmVsT3AgaWQgYXRvbSkKKwkJKQorCXwJaWQgKGxhYmVsT3A9Jz0nfGxhYmVsT3A9Jys9JykgYmxvY2sKKwkJKAllYm5mU3VmZml4CS0+IF4oIGVibmZTdWZmaXggXihCTE9DS1siQkxPQ0siXSBeKEFMVFsiQUxUIl0gXigkbGFiZWxPcCBpZCBibG9jaykgRU9BWyJFT0EiXSkgRU9CWyJFT0IiXSkpCisJCXwJCQkJLT4gXigkbGFiZWxPcCBpZCBibG9jaykKKwkJKQorCXwJYXRvbQorCQkoCWVibmZTdWZmaXgJLT4gXiggZWJuZlN1ZmZpeCBeKEJMT0NLWyJCTE9DSyJdIF4oQUxUWyJBTFQiXSBhdG9tIEVPQVsiRU9BIl0pIEVPQlsiRU9CIl0pICkKKwkJfAkJCQktPiBhdG9tCisJCSkKKwl8CWVibmYKKwl8ICAgQUNUSU9OCisJfCAgIFNFTVBSRUQgKCBnPSc9PicgLT4gR0FURURfU0VNUFJFRFskZ10gfCAtPiBTRU1QUkVEICkKKwl8ICAgdHJlZVNwZWMKKwkJKAllYm5mU3VmZml4CS0+IF4oIGVibmZTdWZmaXggXihCTE9DS1siQkxPQ0siXSBeKEFMVFsiQUxUIl0gdHJlZVNwZWMgRU9BWyJFT0EiXSkgRU9CWyJFT0IiXSkgKQorCQl8CQkJCS0+IHRyZWVTcGVjCisJCSkKKwk7CisKK2F0b206ICAgdGVybWluYWwKKwl8CXJhbmdlIAorCQkoCShvcD0nXid8b3A9JyEnKQktPiBeKCRvcCByYW5nZSkKKwkJfAkJCQkJLT4gcmFuZ2UKKwkJKQorICAgIHwJbm90U2V0CisJCSgJKG9wPSdeJ3xvcD0nIScpCS0+IF4oJG9wIG5vdFNldCkKKwkJfAkJCQkJLT4gbm90U2V0CisJCSkKKyAgICB8ICAgUlVMRV9SRUYgQVJHX0FDVElPTj8KKwkJKAkob3A9J14nfG9wPSchJykJLT4gXigkb3AgUlVMRV9SRUYgQVJHX0FDVElPTj8pCisJCXwJCQkJCS0+IF4oUlVMRV9SRUYgQVJHX0FDVElPTj8pCisJCSkKKyAgICA7CisKK25vdFNldAorCToJJ34nCisJCSgJbm90VGVybWluYWwgZWxlbWVudE9wdGlvbnM/CS0+IF4oJ34nIG5vdFRlcm1pbmFsIGVsZW1lbnRPcHRpb25zPykKKwkJfAlibG9jayBlbGVtZW50T3B0aW9ucz8JCS0+IF4oJ34nIGJsb2NrIGVsZW1lbnRPcHRpb25zPykKKwkJKQorCTsKKworbm90VGVybWluYWwKKwk6ICAgQ0hBUl9MSVRFUkFMCisJfAlUT0tFTl9SRUYKKwl8CVNUUklOR19MSVRFUkFMCisJOworCQorZWxlbWVudE9wdGlvbnMKKwk6CSc8JyBxaWQgJz4nCQkJCQkgLT4gXihPUFRJT05TIHFpZCkKKwl8CSc8JyBvcHRpb24gKCc7JyBvcHRpb24pKiAnPicgLT4gXihPUFRJT05TIG9wdGlvbispCisJOworCitlbGVtZW50T3B0aW9uCisJOglpZCAnPScgb3B0aW9uVmFsdWUgLT4gXignPScgaWQgb3B0aW9uVmFsdWUpCisJOworCQordHJlZVNwZWMKKwk6CSdeKCcgZWxlbWVudCAoIGVsZW1lbnQgKSsgJyknIC0+IF4oVFJFRV9CRUdJTiBlbGVtZW50KykKKwk7CisKK3JhbmdlIQorCToJYzE9Q0hBUl9MSVRFUkFMIFJBTkdFIGMyPUNIQVJfTElURVJBTCBlbGVtZW50T3B0aW9ucz8KKwkJLT4gXihDSEFSX1JBTkdFWyRjMSwiLi4iXSAkYzEgJGMyIGVsZW1lbnRPcHRpb25zPykKKwk7CisKK3Rlcm1pbmFsCisgICAgOiAgICgJQ0hBUl9MSVRFUkFMIGVsZW1lbnRPcHRpb25zPyAgICAJICAtPiBeKENIQVJfTElURVJBTCBlbGVtZW50T3B0aW9ucz8pCisJICAgIAkvLyBBcmdzIGFyZSBvbmx5IHZhbGlkIGZvciBsZXhlciBydWxlcworCQl8ICAgVE9LRU5fUkVGIEFSR19BQ1RJT04/IGVsZW1lbnRPcHRpb25zPyAtPiBeKFRPS0VOX1JFRiBBUkdfQUNUSU9OPyBlbGVtZW50T3B0aW9ucz8pCisJCXwgICBTVFJJTkdfTElURVJBTCBlbGVtZW50T3B0aW9ucz8JCSAgLT4gXihTVFJJTkdfTElURVJBTCBlbGVtZW50T3B0aW9ucz8pCisJCXwgICAnLicgZWxlbWVudE9wdGlvbnM/CQkgCQkJICAtPiBeKCcuJyBlbGVtZW50T3B0aW9ucz8pCisJCSkKKwkJKAknXicJCQkJCQkJLT4gXignXicgJHRlcm1pbmFsKQorCQl8CSchJyAJCQkJCQktPiBeKCchJyAkdGVybWluYWwpCisJCSk/CisJOworCisvKiogTWF0Y2hlcyBFTkJGIGJsb2NrcyAoYW5kIHRva2VuIHNldHMgdmlhIGJsb2NrIHJ1bGUpICovCitlYm5mCitAaW5pdCB7CisgICAgVG9rZW4gZmlyc3RUb2tlbiA9IGlucHV0LkxUKDEpOworfQorQGFmdGVyIHsKKwkkZWJuZi50cmVlLmdldFRva2VuKCkuc2V0TGluZShmaXJzdFRva2VuLmdldExpbmUoKSk7CisJJGVibmYudHJlZS5nZXRUb2tlbigpLnNldENoYXJQb3NpdGlvbkluTGluZShmaXJzdFRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpKTsKK30KKwk6CWJsb2NrCisJCSgJb3A9Jz8nCS0+IF4oT1BUSU9OQUxbb3BdIGJsb2NrKQorCQl8CW9wPScqJwktPiBeKENMT1NVUkVbb3BdIGJsb2NrKQorCQl8CW9wPScrJwktPiBeKFBPU0lUSVZFX0NMT1NVUkVbb3BdIGJsb2NrKQorCQl8ICAgJz0+JwkvLyBzeW50YWN0aWMgcHJlZGljYXRlCisJCQkJCS0+IHtndHlwZT09Q09NQklORURfR1JBTU1BUiAmJgorCQkJCQkgICAgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKCRydWxlOjpuYW1lLmNoYXJBdCgwKSl9PworCQkJCQkgICAvLyBpZiBsZXhlciBydWxlIGluIGNvbWJpbmVkLCBsZWF2ZSBhcyBwcmVkIGZvciBsZXhlcgorCQkJCQkgICBeKFNZTlBSRURbIj0+Il0gYmxvY2spCisJCQkJCS8vIGluIHJlYWwgYW50bHIgdG9vbCwgdGV4dCBmb3IgU1lOX1NFTVBSRUQgaXMgcHJlZG5hbWUKKwkJCQkJLT4gU1lOX1NFTVBSRUQKKyAgICAgICAgfAkJCS0+IGJsb2NrCisJCSkKKwk7CisKK2VibmZTdWZmaXgKK0Bpbml0IHsKKwlUb2tlbiBvcCA9IGlucHV0LkxUKDEpOworfQorCToJJz8nCS0+IE9QVElPTkFMW29wXQorICAJfAknKicgLT4gQ0xPU1VSRVtvcF0KKyAgIAl8CScrJyAtPiBQT1NJVElWRV9DTE9TVVJFW29wXQorCTsKKwkKKworCisvLyBSIEUgVyBSIEkgVCBFICBTIFkgTiBUIEEgWAorCityZXdyaXRlCitAaW5pdCB7CisJVG9rZW4gZmlyc3RUb2tlbiA9IGlucHV0LkxUKDEpOworfQorCToJKHJldys9Jy0+JyBwcmVkcys9U0VNUFJFRCBwcmVkaWNhdGVkKz1yZXdyaXRlX2FsdGVybmF0aXZlKSoKKwkJcmV3Mj0nLT4nIGxhc3Q9cmV3cml0ZV9hbHRlcm5hdGl2ZQorICAgICAgICAtPiBeKCRyZXcgJHByZWRzICRwcmVkaWNhdGVkKSogXigkcmV3MiAkbGFzdCkKKwl8CisJOworCityZXdyaXRlX2FsdGVybmF0aXZlCitvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9CisJOglyZXdyaXRlX3RlbXBsYXRlCisJfAlyZXdyaXRlX3RyZWVfYWx0ZXJuYXRpdmUKKyAgIAl8ICAgLyogZW1wdHkgcmV3cml0ZSAqLyAtPiBeKEFMVFsiQUxUIl0gRVBTSUxPTlsiRVBTSUxPTiJdIEVPQVsiRU9BIl0pCisJOworCQorcmV3cml0ZV90cmVlX2Jsb2NrCisgICAgOiAgIGxwPScoJyByZXdyaXRlX3RyZWVfYWx0ZXJuYXRpdmUgJyknCisgICAgCS0+IF4oQkxPQ0tbJGxwLCJCTE9DSyJdIHJld3JpdGVfdHJlZV9hbHRlcm5hdGl2ZSBFT0JbJGxwLCJFT0IiXSkKKyAgICA7CisKK3Jld3JpdGVfdHJlZV9hbHRlcm5hdGl2ZQorICAgIDoJcmV3cml0ZV90cmVlX2VsZW1lbnQrIC0+IF4oQUxUWyJBTFQiXSByZXdyaXRlX3RyZWVfZWxlbWVudCsgRU9BWyJFT0EiXSkKKyAgICA7CisKK3Jld3JpdGVfdHJlZV9lbGVtZW50CisJOglyZXdyaXRlX3RyZWVfYXRvbQorCXwJcmV3cml0ZV90cmVlX2F0b20gZWJuZlN1ZmZpeAorCQktPiBeKCBlYm5mU3VmZml4IF4oQkxPQ0tbIkJMT0NLIl0gXihBTFRbIkFMVCJdIHJld3JpdGVfdHJlZV9hdG9tIEVPQVsiRU9BIl0pIEVPQlsiRU9CIl0pKQorCXwgICByZXdyaXRlX3RyZWUKKwkJKAllYm5mU3VmZml4CisJCQktPiBeKGVibmZTdWZmaXggXihCTE9DS1siQkxPQ0siXSBeKEFMVFsiQUxUIl0gcmV3cml0ZV90cmVlIEVPQVsiRU9BIl0pIEVPQlsiRU9CIl0pKQorCQl8CS0+IHJld3JpdGVfdHJlZQorCQkpCisJfCAgIHJld3JpdGVfdHJlZV9lYm5mCisJOworCityZXdyaXRlX3RyZWVfYXRvbQorICAgIDogICBDSEFSX0xJVEVSQUwKKwl8ICAgVE9LRU5fUkVGIEFSR19BQ1RJT04/IC0+IF4oVE9LRU5fUkVGIEFSR19BQ1RJT04/KSAvLyBmb3IgaW1hZ2luYXJ5IG5vZGVzCisgICAgfCAgIFJVTEVfUkVGCisJfCAgIFNUUklOR19MSVRFUkFMCisJfCAgIGQ9JyQnIGlkIC0+IExBQkVMWyRkLCRpZC50ZXh0XSAvLyByZWZlcmVuY2UgdG8gYSBsYWJlbCBpbiBhIHJld3JpdGUgcnVsZQorCXwJQUNUSU9OCisJOworCityZXdyaXRlX3RyZWVfZWJuZgorQGluaXQgeworICAgIFRva2VuIGZpcnN0VG9rZW4gPSBpbnB1dC5MVCgxKTsKK30KK0BhZnRlciB7CisJJHJld3JpdGVfdHJlZV9lYm5mLnRyZWUuZ2V0VG9rZW4oKS5zZXRMaW5lKGZpcnN0VG9rZW4uZ2V0TGluZSgpKTsKKwkkcmV3cml0ZV90cmVlX2VibmYudHJlZS5nZXRUb2tlbigpLnNldENoYXJQb3NpdGlvbkluTGluZShmaXJzdFRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpKTsKK30KKwk6CXJld3JpdGVfdHJlZV9ibG9jayBlYm5mU3VmZml4IC0+IF4oZWJuZlN1ZmZpeCByZXdyaXRlX3RyZWVfYmxvY2spCisJOworCQorcmV3cml0ZV90cmVlCisJOgknXignIHJld3JpdGVfdHJlZV9hdG9tIHJld3JpdGVfdHJlZV9lbGVtZW50KiAnKScKKwkJLT4gXihUUkVFX0JFR0lOIHJld3JpdGVfdHJlZV9hdG9tIHJld3JpdGVfdHJlZV9lbGVtZW50KiApCisJOworCisvKiogQnVpbGQgYSB0cmVlIGZvciBhIHRlbXBsYXRlIHJld3JpdGU6CisgICAgICBeKFRFTVBMQVRFIChJRHxBQ1RJT04pIF4oQVJHTElTVCBeKEFSRyBJRCBBQ1RJT04pIC4uLikgKQorICAgIHdoZXJlIEFSR0xJU1QgaXMgYWx3YXlzIHRoZXJlIGV2ZW4gaWYgbm8gYXJncyBleGlzdC4KKyAgICBJRCBjYW4gYmUgInRlbXBsYXRlIiBrZXl3b3JkLiAgSWYgZmlyc3QgY2hpbGQgaXMgQUNUSU9OIHRoZW4gaXQncworICAgIGFuIGluZGlyZWN0IHRlbXBsYXRlIHJlZgorCisgICAgLT4gZm9vKGE9ey4uLn0sIGI9ey4uLn0pCisgICAgLT4gKHtzdHJpbmctZX0pKGE9ey4uLn0sIGI9ey4uLn0pICAvLyBlIGV2YWx1YXRlcyB0byB0ZW1wbGF0ZSBuYW1lCisgICAgLT4geyV7JElELnRleHR9fSAvLyBjcmVhdGUgbGl0ZXJhbCB0ZW1wbGF0ZSBmcm9tIHN0cmluZyAoZG9uZSBpbiBBY3Rpb25UcmFuc2xhdG9yKQorCS0+IHtzdC1leHByfSAvLyBzdC1leHByIGV2YWx1YXRlcyB0byBTVAorICovCityZXdyaXRlX3RlbXBsYXRlCisJOiAgIC8vIC0+IHRlbXBsYXRlKGE9ey4uLn0sLi4uKSAiLi4uIiAgICBpbmxpbmUgdGVtcGxhdGUKKwkJaWQgbHA9JygnIHJld3JpdGVfdGVtcGxhdGVfYXJncwknKScKKwkJKCBzdHI9RE9VQkxFX1FVT1RFX1NUUklOR19MSVRFUkFMIHwgc3RyPURPVUJMRV9BTkdMRV9TVFJJTkdfTElURVJBTCApCisJCS0+IF4oVEVNUExBVEVbJGxwLCJURU1QTEFURSJdIGlkIHJld3JpdGVfdGVtcGxhdGVfYXJncyAkc3RyKQorCisJfAkvLyAtPiBmb28oYT17Li4ufSwgLi4uKQorCQlyZXdyaXRlX3RlbXBsYXRlX3JlZgorCisJfAkvLyAtPiAoe2V4cHJ9KShhPXsuLi59LCAuLi4pCisJCXJld3JpdGVfaW5kaXJlY3RfdGVtcGxhdGVfaGVhZAorCisJfAkvLyAtPiB7Li4ufQorCQlBQ1RJT04KKwk7CisKKy8qKiAtPiBmb28oYT17Li4ufSwgLi4uKSAqLworcmV3cml0ZV90ZW1wbGF0ZV9yZWYKKwk6CWlkIGxwPScoJyByZXdyaXRlX3RlbXBsYXRlX2FyZ3MJJyknCisJCS0+IF4oVEVNUExBVEVbJGxwLCJURU1QTEFURSJdIGlkIHJld3JpdGVfdGVtcGxhdGVfYXJncykKKwk7CisKKy8qKiAtPiAoe2V4cHJ9KShhPXsuLi59LCAuLi4pICovCityZXdyaXRlX2luZGlyZWN0X3RlbXBsYXRlX2hlYWQKKwk6CWxwPScoJyBBQ1RJT04gJyknICcoJyByZXdyaXRlX3RlbXBsYXRlX2FyZ3MgJyknCisJCS0+IF4oVEVNUExBVEVbJGxwLCJURU1QTEFURSJdIEFDVElPTiByZXdyaXRlX3RlbXBsYXRlX2FyZ3MpCisJOworCityZXdyaXRlX3RlbXBsYXRlX2FyZ3MKKwk6CXJld3JpdGVfdGVtcGxhdGVfYXJnICgnLCcgcmV3cml0ZV90ZW1wbGF0ZV9hcmcpKgorCQktPiBeKEFSR0xJU1QgcmV3cml0ZV90ZW1wbGF0ZV9hcmcrKQorCXwJLT4gQVJHTElTVAorCTsKKworcmV3cml0ZV90ZW1wbGF0ZV9hcmcKKwk6ICAgaWQgJz0nIEFDVElPTiAtPiBeKEFSR1skaWQuc3RhcnRdIGlkIEFDVElPTikKKwk7CisKK3FpZCA6CWlkICgnLicgaWQpKiA7CisJCitpZAk6CVRPS0VOX1JFRiAtPiBJRFskVE9LRU5fUkVGXQorCXwJUlVMRV9SRUYgIC0+IElEWyRSVUxFX1JFRl0KKwk7CisKKy8vIEwgRSBYIEkgQyBBIEwgICBSIFUgTCBFIFMKKworU0xfQ09NTUVOVAorIAk6CScvLycKKyAJIAkoCScgJEFOVExSICcgU1JDIC8vIHNyYyBkaXJlY3RpdmUKKyAJCXwJfignXHInfCdcbicpKgorCQkpCisJCSdccic/ICdcbicKKwkJeyRjaGFubmVsPUhJRERFTjt9CisJOworCitNTF9DT01NRU5UCisJOgknLyonIHtpZiAoaW5wdXQuTEEoMSk9PScqJykgJHR5cGU9RE9DX0NPTU1FTlQ7IGVsc2UgJGNoYW5uZWw9SElEREVOO30gLiogJyovJworCTsKKworQ0hBUl9MSVRFUkFMCisJOgknXCcnIExJVEVSQUxfQ0hBUiAnXCcnCisJOworCitTVFJJTkdfTElURVJBTAorCToJJ1wnJyBMSVRFUkFMX0NIQVIgTElURVJBTF9DSEFSKiAnXCcnCisJOworCitmcmFnbWVudAorTElURVJBTF9DSEFSCisJOglFU0MKKwl8CX4oJ1wnJ3wnXFwnKQorCTsKKworRE9VQkxFX1FVT1RFX1NUUklOR19MSVRFUkFMCisJOgknIicgKEVTQyB8IH4oJ1xcJ3wnIicpKSogJyInCisJOworCitET1VCTEVfQU5HTEVfU1RSSU5HX0xJVEVSQUwKKwk6CSc8PCcgLiogJz4+JworCTsKKworZnJhZ21lbnQKK0VTQwk6CSdcXCcKKwkJKAknbicKKwkJfAkncicKKwkJfAkndCcKKwkJfAknYicKKwkJfAknZicKKwkJfAknIicKKwkJfAknXCcnCisJCXwJJ1xcJworCQl8CSc+JworCQl8CSd1JyBYRElHSVQgWERJR0lUIFhESUdJVCBYRElHSVQKKwkJfAkuIC8vIHVua25vd24sIGxlYXZlIGFzIGl0IGlzCisJCSkKKwk7CisKK2ZyYWdtZW50CitYRElHSVQgOgorCQknMCcgLi4gJzknCisJfAknYScgLi4gJ2YnCisJfAknQScgLi4gJ0YnCisJOworCitJTlQJOgknMCcuLic5JysKKwk7CisKK0FSR19BQ1RJT04KKwk6CU5FU1RFRF9BUkdfQUNUSU9OCisJOworCitmcmFnbWVudAorTkVTVEVEX0FSR19BQ1RJT04gOgorCSdbJworCSgJb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyBrPTE7fQorCToJTkVTVEVEX0FSR19BQ1RJT04KKwl8CUFDVElPTl9TVFJJTkdfTElURVJBTAorCXwJQUNUSU9OX0NIQVJfTElURVJBTAorCXwJLgorCSkqCisJJ10nCisJLy97c2V0VGV4dChnZXRUZXh0KCkuc3Vic3RyaW5nKDEsIGdldFRleHQoKS5sZW5ndGgoKS0xKSk7fQorCTsKKworQUNUSU9OCisJOglORVNURURfQUNUSU9OICggJz8nIHskdHlwZSA9IFNFTVBSRUQ7fSApPworCTsKKworZnJhZ21lbnQKK05FU1RFRF9BQ1RJT04gOgorCSd7JworCSgJb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyBrPTI7fQorCToJTkVTVEVEX0FDVElPTgorCXwJU0xfQ09NTUVOVAorCXwJTUxfQ09NTUVOVAorCXwJQUNUSU9OX1NUUklOR19MSVRFUkFMCisJfAlBQ1RJT05fQ0hBUl9MSVRFUkFMCisJfAkuCisJKSoKKwknfScKKyAgIDsKKworZnJhZ21lbnQKK0FDVElPTl9DSEFSX0xJVEVSQUwKKwk6CSdcJycgKEFDVElPTl9FU0N8fignXFwnfCdcJycpKSAnXCcnCisJOworCitmcmFnbWVudAorQUNUSU9OX1NUUklOR19MSVRFUkFMCisJOgknIicgKEFDVElPTl9FU0N8fignXFwnfCciJykpKiAnIicKKwk7CisKK2ZyYWdtZW50CitBQ1RJT05fRVNDCisJOgknXFxcJycKKwl8CSdcXCcgJyInIC8vIEFOVExSIGRvZXNuJ3QgbGlrZTogJ1xcIicKKwl8CSdcXCcgfignXCcnfCciJykKKwk7CisKK1RPS0VOX1JFRgorCToJJ0EnLi4nWicgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisJOworCitSVUxFX1JFRgorCToJJ2EnLi4neicgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5JykqCisJOworCisvKiogTWF0Y2ggdGhlIHN0YXJ0IG9mIGFuIG9wdGlvbnMgc2VjdGlvbi4gIERvbid0IGFsbG93IG5vcm1hbAorICogIGFjdGlvbiBwcm9jZXNzaW5nIG9uIHRoZSB7Li4ufSBhcyBpdCdzIG5vdCBhIGFjdGlvbi4KKyAqLworT1BUSU9OUworCToJJ29wdGlvbnMnIFdTX0xPT1AgJ3snCisJOworCQorVE9LRU5TCisJOgkndG9rZW5zJyBXU19MT09QICd7JworCTsKKworLyoqIFJlc2V0IHRoZSBmaWxlIGFuZCBsaW5lIGluZm9ybWF0aW9uOyB1c2VmdWwgd2hlbiB0aGUgZ3JhbW1hcgorICogIGhhcyBiZWVuIGdlbmVyYXRlZCBzbyB0aGF0IGVycm9ycyBhcmUgc2hvd24gcmVsYXRpdmUgdG8gdGhlCisgKiAgb3JpZ2luYWwgZmlsZSBsaWtlIHRoZSBvbGQgQyBwcmVwcm9jZXNzb3IgdXNlZCB0byBkby4KKyAqLworZnJhZ21lbnQKK1NSQwk6CSdzcmMnICcgJyBmaWxlPUFDVElPTl9TVFJJTkdfTElURVJBTCAnICcgbGluZT1JTlQKKwk7CisKK1dTCToJKAknICcKKwkJfAknXHQnCisJCXwJJ1xyJz8gJ1xuJworCQkpKworCQl7JGNoYW5uZWw9SElEREVOO30KKwk7CisKK2ZyYWdtZW50CitXU19MT09QCisJOgkoCVdTCisJCXwJU0xfQ09NTUVOVAorCQl8CU1MX0NPTU1FTlQKKwkJKSoKKwk7CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9BTlRMUnYzVHJlZS5nIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0FOVExSdjNUcmVlLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiMDNkMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9BTlRMUnYzVHJlZS5nCkBAIC0wLDAgKzEsMjYxIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qKiBBTlRMUiB2MyB0cmVlIGdyYW1tYXIgdG8gd2FsayB0cmVlcyBjcmVhdGVkIGJ5IEFOVExSdjMuZyAqLwordHJlZSBncmFtbWFyIEFOVExSdjNUcmVlOworCitvcHRpb25zIHsKKwl0b2tlblZvY2FiID0gQU5UTFJ2MzsKKwlBU1RMYWJlbFR5cGUgPSBDb21tb25UcmVlOworfQorCitAaGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmFudGxyLmdyYW1tYXIudjM7Cit9CisKK2dyYW1tYXJEZWYKKyAgICA6ICAgXiggZ3JhbW1hclR5cGUgSUQgRE9DX0NPTU1FTlQ/IG9wdGlvbnNTcGVjPyB0b2tlbnNTcGVjPyBhdHRyU2NvcGUqIGFjdGlvbiogcnVsZSsgKQorICAgIDsKKworZ3JhbW1hclR5cGUKKwk6CUxFWEVSX0dSQU1NQVIKKyAgICB8CVBBUlNFUl9HUkFNTUFSCisgICAgfAlUUkVFX0dSQU1NQVIKKyAgICB8CUNPTUJJTkVEX0dSQU1NQVIKKyAgICA7CisKK3Rva2Vuc1NwZWMKKwk6CV4oVE9LRU5TIHRva2VuU3BlYyspCisJOworCit0b2tlblNwZWMKKwk6CV4oJz0nIFRPS0VOX1JFRiBTVFJJTkdfTElURVJBTCkKKwl8CV4oJz0nIFRPS0VOX1JFRiBDSEFSX0xJVEVSQUwpCisJfAlUT0tFTl9SRUYKKwk7CisKK2F0dHJTY29wZQorCToJXignc2NvcGUnIElEIEFDVElPTikKKwk7CisKK2FjdGlvbgorCToJXignQCcgSUQgSUQgQUNUSU9OKQorCXwJXignQCcgSUQgQUNUSU9OKQorCTsKKworb3B0aW9uc1NwZWMKKwk6CV4oT1BUSU9OUyBvcHRpb24rKQorCTsKKworb3B0aW9uCisgICAgOiAgIHFpZCAvLyBvbmx5IGFsbG93ZWQgaW4gZWxlbWVudCBvcHRpb25zCisgICAgfAleKCc9JyBJRCBvcHRpb25WYWx1ZSkKKyAJOworIAkKK29wdGlvblZhbHVlCisgICAgOiAgIElECisgICAgfCAgIFNUUklOR19MSVRFUkFMCisgICAgfCAgIENIQVJfTElURVJBTAorICAgIHwgICBJTlQKKyAgICA7CisKK3J1bGUKKwk6CV4oIFJVTEUgSUQgbW9kaWZpZXI/ICheKEFSRyBBUkdfQUNUSU9OKSk/ICheKFJFVCBBUkdfQUNUSU9OKSk/CisJICAgICAgIHRocm93c1NwZWM/IG9wdGlvbnNTcGVjPyBydWxlU2NvcGVTcGVjPyBydWxlQWN0aW9uKgorCSAgICAgICBhbHRMaXN0CisJICAgICAgIGV4Y2VwdGlvbkdyb3VwPyBFT1IKKwkgICAgICkKKwk7CisKK21vZGlmaWVyCisJOgkncHJvdGVjdGVkJ3wncHVibGljJ3wncHJpdmF0ZSd8J2ZyYWdtZW50JworCTsKKworLyoqIE1hdGNoIHN0dWZmIGxpa2UgQGluaXQge2ludCBpO30gKi8KK3J1bGVBY3Rpb24KKwk6CV4oJ0AnIElEIEFDVElPTikKKwk7CisKK3Rocm93c1NwZWMKKwk6CV4oJ3Rocm93cycgSUQrKQorCTsKKworcnVsZVNjb3BlU3BlYworCToJXignc2NvcGUnIEFDVElPTikKKwl8CV4oJ3Njb3BlJyBBQ1RJT04gSUQrKQorCXwJXignc2NvcGUnIElEKykKKwk7CisKK2Jsb2NrCisgICAgOiAgIF4oIEJMT0NLIG9wdGlvbnNTcGVjPyAoYWx0ZXJuYXRpdmUgcmV3cml0ZSkrIEVPQiApCisgICAgOworCithbHRMaXN0CisgICAgOiAgIF4oIEJMT0NLIChhbHRlcm5hdGl2ZSByZXdyaXRlKSsgRU9CICkKKyAgICA7CisKK2FsdGVybmF0aXZlCisgICAgOiAgIF4oQUxUIGVsZW1lbnQrIEVPQSkKKyAgICB8ICAgXihBTFQgRVBTSUxPTiBFT0EpCisgICAgOworCitleGNlcHRpb25Hcm91cAorCToJZXhjZXB0aW9uSGFuZGxlcisgZmluYWxseUNsYXVzZT8KKwl8CWZpbmFsbHlDbGF1c2UKKyAgICA7CisKK2V4Y2VwdGlvbkhhbmRsZXIKKyAgICA6ICAgIF4oJ2NhdGNoJyBBUkdfQUNUSU9OIEFDVElPTikKKyAgICA7CisKK2ZpbmFsbHlDbGF1c2UKKyAgICA6ICAgIF4oJ2ZpbmFsbHknIEFDVElPTikKKyAgICA7CisKK2VsZW1lbnQKKwk6CV4oKCc9J3wnKz0nKSBJRCBibG9jaykKKwl8CV4oKCc9J3wnKz0nKSBJRCBhdG9tKQorCXwJYXRvbQorCXwJZWJuZgorCXwgICBBQ1RJT04KKwl8ICAgU0VNUFJFRAorCXwJR0FURURfU0VNUFJFRAorCXwgICBeKFRSRUVfQkVHSU4gZWxlbWVudCspCisJOworCithdG9tOiAgIF4oKCdeJ3wnIScpIGF0b20pCisJfAleKENIQVJfUkFOR0UgQ0hBUl9MSVRFUkFMIENIQVJfTElURVJBTCBvcHRpb25zU3BlYz8pCisJfAleKCd+JyBub3RUZXJtaW5hbCBvcHRpb25zU3BlYz8pCisJfAleKCd+JyBibG9jayBvcHRpb25zU3BlYz8pCisgICAgfAleKFJVTEVfUkVGIEFSR19BQ1RJT04pCisgICAgfAlSVUxFX1JFRgorICAgIHwgICBDSEFSX0xJVEVSQUwKKyAgICB8ICAgXihDSEFSX0xJVEVSQUwgb3B0aW9uc1NwZWMpCisgICAgfAlUT0tFTl9SRUYKKyAgICB8CV4oVE9LRU5fUkVGIG9wdGlvbnNTcGVjKQorICAgIHwJXihUT0tFTl9SRUYgQVJHX0FDVElPTiBvcHRpb25zU3BlYykKKyAgICB8CV4oVE9LRU5fUkVGIEFSR19BQ1RJT04pCisgICAgfAlTVFJJTkdfTElURVJBTAorICAgIHwJXihTVFJJTkdfTElURVJBTCBvcHRpb25zU3BlYykKKyAgICB8CScuJworICAgIHwJXignLicgb3B0aW9uc1NwZWM/KQorICAgIDsKKworLyoqIE1hdGNoZXMgRU5CRiBibG9ja3MgKGFuZCB0b2tlbiBzZXRzIHZpYSBibG9jayBydWxlKSAqLworZWJuZgorCToJXihTWU5QUkVEIGJsb2NrKQorCXwJXihPUFRJT05BTCBibG9jaykKKyAgCXwJXihDTE9TVVJFIGJsb2NrKQorICAgCXwJXihQT1NJVElWRV9DTE9TVVJFIGJsb2NrKQorCXwJU1lOX1NFTVBSRUQKKwl8CWJsb2NrCisJOworCitub3RUZXJtaW5hbAorCTogICBDSEFSX0xJVEVSQUwKKwl8CVRPS0VOX1JFRgorCXwJU1RSSU5HX0xJVEVSQUwKKwk7CisJCQorLy8gUiBFIFcgUiBJIFQgRSAgUyBZIE4gVCBBIFgKKworcmV3cml0ZQorCToJKF4oJy0+JyBTRU1QUkVEIHJld3JpdGVfYWx0ZXJuYXRpdmUpKSogXignLT4nIHJld3JpdGVfYWx0ZXJuYXRpdmUpCisJfAorCTsKKworcmV3cml0ZV9hbHRlcm5hdGl2ZQorCToJcmV3cml0ZV90ZW1wbGF0ZQorCXwJcmV3cml0ZV90cmVlX2FsdGVybmF0aXZlCisgICAJfCAgIF4oQUxUIEVQU0lMT04gRU9BKQorCTsKKwkKK3Jld3JpdGVfdHJlZV9ibG9jaworICAgIDogICBeKEJMT0NLIHJld3JpdGVfdHJlZV9hbHRlcm5hdGl2ZSBFT0IpCisgICAgOworCityZXdyaXRlX3RyZWVfYWx0ZXJuYXRpdmUKKyAgICA6CV4oQUxUIHJld3JpdGVfdHJlZV9lbGVtZW50KyBFT0EpCisgICAgOworCityZXdyaXRlX3RyZWVfZWxlbWVudAorCToJcmV3cml0ZV90cmVlX2F0b20KKwl8CXJld3JpdGVfdHJlZQorCXwgICByZXdyaXRlX3RyZWVfYmxvY2sKKwl8ICAgcmV3cml0ZV90cmVlX2VibmYKKwk7CisKK3Jld3JpdGVfdHJlZV9hdG9tCisgICAgOiAgIENIQVJfTElURVJBTAorCXwgICBUT0tFTl9SRUYKKwl8ICAgXihUT0tFTl9SRUYgQVJHX0FDVElPTikgLy8gZm9yIGltYWdpbmFyeSBub2RlcworICAgIHwgICBSVUxFX1JFRgorCXwgICBTVFJJTkdfTElURVJBTAorCXwgICBMQUJFTAorCXwJQUNUSU9OCisJOworCityZXdyaXRlX3RyZWVfZWJuZgorCToJXihPUFRJT05BTCByZXdyaXRlX3RyZWVfYmxvY2spCisgIAl8CV4oQ0xPU1VSRSByZXdyaXRlX3RyZWVfYmxvY2spCisgICAJfAleKFBPU0lUSVZFX0NMT1NVUkUgcmV3cml0ZV90cmVlX2Jsb2NrKQorCTsKKwkKK3Jld3JpdGVfdHJlZQorCToJXihUUkVFX0JFR0lOIHJld3JpdGVfdHJlZV9hdG9tIHJld3JpdGVfdHJlZV9lbGVtZW50KiApCisJOworCityZXdyaXRlX3RlbXBsYXRlCisJOiAgIF4oIFRFTVBMQVRFIElEIHJld3JpdGVfdGVtcGxhdGVfYXJncworCQkgICAoRE9VQkxFX1FVT1RFX1NUUklOR19MSVRFUkFMIHwgRE9VQkxFX0FOR0xFX1NUUklOR19MSVRFUkFMKQorCQkgKQorCXwJcmV3cml0ZV90ZW1wbGF0ZV9yZWYKKwl8CXJld3JpdGVfaW5kaXJlY3RfdGVtcGxhdGVfaGVhZAorCXwJQUNUSU9OCisJOworCisvKiogZm9vKGE9ey4uLn0sIC4uLikgKi8KK3Jld3JpdGVfdGVtcGxhdGVfcmVmCisJOgleKFRFTVBMQVRFIElEIHJld3JpdGVfdGVtcGxhdGVfYXJncykKKwk7CisKKy8qKiAoe2V4cHJ9KShhPXsuLi59LCAuLi4pICovCityZXdyaXRlX2luZGlyZWN0X3RlbXBsYXRlX2hlYWQKKwk6CV4oVEVNUExBVEUgQUNUSU9OIHJld3JpdGVfdGVtcGxhdGVfYXJncykKKwk7CisKK3Jld3JpdGVfdGVtcGxhdGVfYXJncworCToJXihBUkdMSVNUIHJld3JpdGVfdGVtcGxhdGVfYXJnKykKKwl8CUFSR0xJU1QKKwk7CisKK3Jld3JpdGVfdGVtcGxhdGVfYXJnCisJOiAgIF4oQVJHIElEIEFDVElPTikKKwk7CisKK3FpZAk6CUlEICgnLicgSUQpKiA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQWN0aW9uQW5hbHlzaXMuZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9BY3Rpb25BbmFseXNpcy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQWN0aW9uQW5hbHlzaXMuZwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogV2UgbmVlZCB0byBzZXQgUnVsZS5yZWZlcmVuY2VkUHJlZGVmaW5lZFJ1bGVBdHRyaWJ1dGVzIGJlZm9yZQorICogIGNvZGUgZ2VuZXJhdGlvbi4gIFRoaXMgZmlsdGVyIGxvb2tzIGF0IGFuIGFjdGlvbiBpbiBjb250ZXh0IG9mCisgKiAgaXRzIHJ1bGUgYW5kIG91dGVyIGFsdGVybmF0aXZlIG51bWJlciBhbmQgZmlndXJlcyBvdXQgd2hpY2gKKyAqICBydWxlcyBoYXZlIHByZWRlZmluZWQgcHJlZnMgcmVmZXJlbmNlZC4gIEkgbmVlZCB0aGlzIHNvIEkgY2FuCisgKiAgcmVtb3ZlIHVudXN1ZWQgbGFiZWxzLiAgVGhpcyBhbHNvIHRyYWNrcywgZm9yIGxhYmVsZWQgcnVsZXMsCisgKiAgd2hpY2ggYXJlIHJlZmVyZW5jZWQgYnkgYWN0aW9ucy4KKyAqLworbGV4ZXIgZ3JhbW1hciBBY3Rpb25BbmFseXNpczsKK29wdGlvbnMgeworICBmaWx0ZXI9dHJ1ZTsgIC8vIHRyeSBhbGwgbm9uLWZyYWdtZW50IHJ1bGVzIGluIG9yZGVyIHNwZWNpZmllZAorfQorCitAaGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmFudGxyLmdyYW1tYXIudjM7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworfQorCitAbWVtYmVycyB7CitSdWxlIGVuY2xvc2luZ1J1bGU7CitHcmFtbWFyIGdyYW1tYXI7CitUb2tlbiBhY3Rpb25Ub2tlbjsKK2ludCBvdXRlckFsdE51bSA9IDA7CisKKwlwdWJsaWMgQWN0aW9uQW5hbHlzaXMoR3JhbW1hciBncmFtbWFyLCBTdHJpbmcgcnVsZU5hbWUsIEdyYW1tYXJBU1QgYWN0aW9uQVNUKQorCXsKKwkJdGhpcyhuZXcgQU5UTFJTdHJpbmdTdHJlYW0oYWN0aW9uQVNULnRva2VuLmdldFRleHQoKSkpOworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCSAgICB0aGlzLmVuY2xvc2luZ1J1bGUgPSBncmFtbWFyLmdldExvY2FsbHlEZWZpbmVkUnVsZShydWxlTmFtZSk7CisJICAgIHRoaXMuYWN0aW9uVG9rZW4gPSBhY3Rpb25BU1QudG9rZW47CisJICAgIHRoaXMub3V0ZXJBbHROdW0gPSBhY3Rpb25BU1Qub3V0ZXJBbHROdW07CisJfQorCitwdWJsaWMgdm9pZCBhbmFseXplKCkgeworCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjXG5hY3Rpb249IithY3Rpb25Ub2tlbik7CisJVG9rZW4gdDsKKwlkbyB7CisJCXQgPSBuZXh0VG9rZW4oKTsKKwl9IHdoaWxlICggdC5nZXRUeXBlKCkhPSBUb2tlbi5FT0YgKTsKK30KK30KKworLyoqCSR4LnkJeCBpcyBlbmNsb3NpbmcgcnVsZSBvciBydWxlIHJlZiBvciBydWxlIGxhYmVsCisgKgkJCXkgaXMgYSByZXR1cm4gdmFsdWUsIHBhcmFtZXRlciwgb3IgcHJlZGVmaW5lZCBwcm9wZXJ0eS4KKyAqLworWF9ZIDoJJyQnIHg9SUQgJy4nIHk9SUQge2VuY2xvc2luZ1J1bGUhPW51bGx9PworCQl7CisJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gbnVsbDsKKwkJU3RyaW5nIHJlZmRSdWxlTmFtZSA9IG51bGw7CisJCWlmICggJHgudGV4dC5lcXVhbHMoZW5jbG9zaW5nUnVsZS5uYW1lKSApIHsKKwkJCS8vIHJlZiB0byBlbmNsb3NpbmcgcnVsZS4KKwkJCXJlZmRSdWxlTmFtZSA9ICR4LnRleHQ7CisJCQlzY29wZSA9IGVuY2xvc2luZ1J1bGUuZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZSgkeS50ZXh0KTsKKwkJfQorCQllbHNlIGlmICggZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoJHgudGV4dCkhPW51bGwgKSB7CisJCQkvLyByZWYgdG8gcnVsZSBsYWJlbAorCQkJR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIHBhaXIgPSBlbmNsb3NpbmdSdWxlLmdldFJ1bGVMYWJlbCgkeC50ZXh0KTsKKwkJCXBhaXIuYWN0aW9uUmVmZXJlbmNlc0xhYmVsID0gdHJ1ZTsKKwkJCXJlZmRSdWxlTmFtZSA9IHBhaXIucmVmZXJlbmNlZFJ1bGVOYW1lOworCQkJUnVsZSByZWZkUnVsZSA9IGdyYW1tYXIuZ2V0UnVsZShyZWZkUnVsZU5hbWUpOworCQkJaWYgKCByZWZkUnVsZSE9bnVsbCApIHsKKwkJCQlzY29wZSA9IHJlZmRSdWxlLmdldExvY2FsQXR0cmlidXRlU2NvcGUoJHkudGV4dCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIGVuY2xvc2luZ1J1bGUuZ2V0UnVsZVJlZnNJbkFsdCh4LmdldFRleHQoKSwgb3V0ZXJBbHROdW0pIT1udWxsICkgeworCQkJLy8gcmVmIHRvIHJ1bGUgcmVmZXJlbmNlZCBpbiB0aGlzIGFsdAorCQkJcmVmZFJ1bGVOYW1lID0gJHgudGV4dDsKKwkJCVJ1bGUgcmVmZFJ1bGUgPSBncmFtbWFyLmdldFJ1bGUocmVmZFJ1bGVOYW1lKTsKKwkJCWlmICggcmVmZFJ1bGUhPW51bGwgKSB7CisJCQkJc2NvcGUgPSByZWZkUnVsZS5nZXRMb2NhbEF0dHJpYnV0ZVNjb3BlKCR5LnRleHQpOworCQkJfQorCQl9CisJCWlmICggc2NvcGUhPW51bGwgJiYKKwkJCSAoc2NvcGUuaXNQcmVkZWZpbmVkUnVsZVNjb3BlfHxzY29wZS5pc1ByZWRlZmluZWRMZXhlclJ1bGVTY29wZSkgKQorCQl7CisJCQlncmFtbWFyLnJlZmVyZW5jZVJ1bGVMYWJlbFByZWRlZmluZWRBdHRyaWJ1dGUocmVmZFJ1bGVOYW1lKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZWZlcmVuY2VSdWxlTGFiZWxQcmVkZWZpbmVkQXR0cmlidXRlIGZvciAiK3JlZmRSdWxlTmFtZSk7CisJCX0KKwkJfQorCTsKKworLyoqICR4CXggaXMgYW4gaXNvbGF0ZWQgcnVsZSBsYWJlbC4gIEp1c3QgcmVjb3JkIHRoYXQgdGhlIGxhYmVsIHdhcyByZWZlcmVuY2VkICovCitYCToJJyQnIHg9SUQge2VuY2xvc2luZ1J1bGUhPW51bGwgJiYgZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoJHgudGV4dCkhPW51bGx9PworCQl7CisJCQlHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIgcGFpciA9IGVuY2xvc2luZ1J1bGUuZ2V0UnVsZUxhYmVsKCR4LnRleHQpOworCQkJcGFpci5hY3Rpb25SZWZlcmVuY2VzTGFiZWwgPSB0cnVlOworCQl9CisJOworCQorLyoqICR5CXkgaXMgYSByZXR1cm4gdmFsdWUsIHBhcmFtZXRlciwgb3IgcHJlZGVmaW5lZCBwcm9wZXJ0eSBvZiBjdXJyZW50IHJ1bGUgKi8KK1kJOgknJCcgSUQge2VuY2xvc2luZ1J1bGUhPW51bGwgJiYgZW5jbG9zaW5nUnVsZS5nZXRMb2NhbEF0dHJpYnV0ZVNjb3BlKCRJRC50ZXh0KSE9bnVsbH0/CisJCXsKKwkJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gZW5jbG9zaW5nUnVsZS5nZXRMb2NhbEF0dHJpYnV0ZVNjb3BlKCRJRC50ZXh0KTsKKwkJCWlmICggc2NvcGUhPW51bGwgJiYKKwkJCQkgKHNjb3BlLmlzUHJlZGVmaW5lZFJ1bGVTY29wZXx8c2NvcGUuaXNQcmVkZWZpbmVkTGV4ZXJSdWxlU2NvcGUpICkKKwkJCXsKKwkJCQlncmFtbWFyLnJlZmVyZW5jZVJ1bGVMYWJlbFByZWRlZmluZWRBdHRyaWJ1dGUoZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicmVmZXJlbmNlUnVsZUxhYmVsUHJlZGVmaW5lZEF0dHJpYnV0ZSBmb3IgIiskSUQudGV4dCk7CisJCQl9CisJCX0KKwk7CisJCitmcmFnbWVudAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICA7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQWN0aW9uVHJhbnNsYXRvci5nIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0FjdGlvblRyYW5zbGF0b3IuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNhOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0FjdGlvblRyYW5zbGF0b3IuZwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworbGV4ZXIgZ3JhbW1hciBBY3Rpb25UcmFuc2xhdG9yOworb3B0aW9ucyB7CisgIGZpbHRlcj10cnVlOyAgLy8gdHJ5IGFsbCBub24tZnJhZ21lbnQgcnVsZXMgaW4gb3JkZXIgc3BlY2lmaWVkCisgIC8vIG91dHB1dD10ZW1wbGF0ZTsgIFRPRE86IGNhbiB3ZSBtYWtlIHRva2VucyByZXR1cm4gdGVtcGxhdGVzIHNvbWVob3c/Cit9CisKK0BoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3JhbW1hci52MzsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLio7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CisKK30KKworQG1lbWJlcnMgeworcHVibGljIExpc3QgY2h1bmtzID0gbmV3IEFycmF5TGlzdCgpOworUnVsZSBlbmNsb3NpbmdSdWxlOworaW50IG91dGVyQWx0TnVtOworR3JhbW1hciBncmFtbWFyOworQ29kZUdlbmVyYXRvciBnZW5lcmF0b3I7CitUb2tlbiBhY3Rpb25Ub2tlbjsKKworCXB1YmxpYyBBY3Rpb25UcmFuc2xhdG9yKENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorCQkJCQkJCQkgU3RyaW5nIHJ1bGVOYW1lLAorCQkJCQkJCQkgR3JhbW1hckFTVCBhY3Rpb25BU1QpCisJeworCQl0aGlzKG5ldyBBTlRMUlN0cmluZ1N0cmVhbShhY3Rpb25BU1QudG9rZW4uZ2V0VGV4dCgpKSk7CisJCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworCQl0aGlzLmdyYW1tYXIgPSBnZW5lcmF0b3IuZ3JhbW1hcjsKKwkgICAgdGhpcy5lbmNsb3NpbmdSdWxlID0gZ3JhbW1hci5nZXRMb2NhbGx5RGVmaW5lZFJ1bGUocnVsZU5hbWUpOworCSAgICB0aGlzLmFjdGlvblRva2VuID0gYWN0aW9uQVNULnRva2VuOworCSAgICB0aGlzLm91dGVyQWx0TnVtID0gYWN0aW9uQVNULm91dGVyQWx0TnVtOworCX0KKworCXB1YmxpYyBBY3Rpb25UcmFuc2xhdG9yKENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorCQkJCQkJCQkgU3RyaW5nIHJ1bGVOYW1lLAorCQkJCQkJCQkgVG9rZW4gYWN0aW9uVG9rZW4sCisJCQkJCQkJCSBpbnQgb3V0ZXJBbHROdW0pCisJeworCQl0aGlzKG5ldyBBTlRMUlN0cmluZ1N0cmVhbShhY3Rpb25Ub2tlbi5nZXRUZXh0KCkpKTsKKwkJdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisJCWdyYW1tYXIgPSBnZW5lcmF0b3IuZ3JhbW1hcjsKKwkgICAgdGhpcy5lbmNsb3NpbmdSdWxlID0gZ3JhbW1hci5nZXRSdWxlKHJ1bGVOYW1lKTsKKwkgICAgdGhpcy5hY3Rpb25Ub2tlbiA9IGFjdGlvblRva2VuOworCQl0aGlzLm91dGVyQWx0TnVtID0gb3V0ZXJBbHROdW07CisJfQorCisvKiogUmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzIGFuZCBTVCBvYmplY3RzIHRoYXQKKyAqICByZXByZXNlbnQgdGhlIHRyYW5zbGF0ZWQgYWN0aW9uLgorICovCitwdWJsaWMgTGlzdCB0cmFuc2xhdGVUb0NodW5rcygpIHsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiMjI1xuYWN0aW9uPSIrYWN0aW9uKTsKKwlUb2tlbiB0OworCWRvIHsKKwkJdCA9IG5leHRUb2tlbigpOworCX0gd2hpbGUgKCB0LmdldFR5cGUoKSE9IFRva2VuLkVPRiApOworCXJldHVybiBjaHVua3M7Cit9CisKK3B1YmxpYyBTdHJpbmcgdHJhbnNsYXRlKCkgeworCUxpc3QgdGhlQ2h1bmtzID0gdHJhbnNsYXRlVG9DaHVua3MoKTsKKwkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2h1bmtzPSIrYS5jaHVua3MpOworCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVDaHVua3Muc2l6ZSgpOyBpKyspIHsKKwkJT2JqZWN0IG8gPSAoT2JqZWN0KSB0aGVDaHVua3MuZ2V0KGkpOworCQlpZiAoIG8gaW5zdGFuY2VvZiBTVCApIGJ1Zi5hcHBlbmQoKChTVClvKS5yZW5kZXIoKSk7CisJCWVsc2UgYnVmLmFwcGVuZChvKTsKKwl9CisJLy9TeXN0ZW0ub3V0LnByaW50bG4oInRyYW5zbGF0ZWQ6ICIrYnVmLnRvU3RyaW5nKCkpOworCXJldHVybiBidWYudG9TdHJpbmcoKTsKK30KKworcHVibGljIExpc3QgdHJhbnNsYXRlQWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKKwlTdHJpbmcgcm5hbWUgPSBudWxsOworCWlmICggZW5jbG9zaW5nUnVsZSE9bnVsbCApIHsKKwkJcm5hbWUgPSBlbmNsb3NpbmdSdWxlLm5hbWU7CisJfQorCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkJCQkJICBybmFtZSwKKwkJCQkJCQkJICBuZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksb3V0ZXJBbHROdW0pOworICAgIHJldHVybiB0cmFuc2xhdG9yLnRyYW5zbGF0ZVRvQ2h1bmtzKCk7Cit9CisKK3B1YmxpYyBib29sZWFuIGlzVG9rZW5SZWZJbkFsdChTdHJpbmcgaWQpIHsKKyAgICByZXR1cm4gZW5jbG9zaW5nUnVsZS5nZXRUb2tlblJlZnNJbkFsdChpZCwgb3V0ZXJBbHROdW0pIT1udWxsOworfQorcHVibGljIGJvb2xlYW4gaXNSdWxlUmVmSW5BbHQoU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIGVuY2xvc2luZ1J1bGUuZ2V0UnVsZVJlZnNJbkFsdChpZCwgb3V0ZXJBbHROdW0pIT1udWxsOworfQorcHVibGljIEdyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBnZXRFbGVtZW50TGFiZWwoU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIGVuY2xvc2luZ1J1bGUuZ2V0TGFiZWwoaWQpOworfQorCitwdWJsaWMgdm9pZCBjaGVja0VsZW1lbnRSZWZVbmlxdWVuZXNzKFN0cmluZyByZWYsIGJvb2xlYW4gaXNUb2tlbikgeworCQlMaXN0IHJlZnMgPSBudWxsOworCQlpZiAoIGlzVG9rZW4gKSB7CisJCSAgICByZWZzID0gZW5jbG9zaW5nUnVsZS5nZXRUb2tlblJlZnNJbkFsdChyZWYsIG91dGVyQWx0TnVtKTsKKwkJfQorCQllbHNlIHsKKwkJICAgIHJlZnMgPSBlbmNsb3NpbmdSdWxlLmdldFJ1bGVSZWZzSW5BbHQocmVmLCBvdXRlckFsdE51bSk7CisJCX0KKwkJaWYgKCByZWZzIT1udWxsICYmIHJlZnMuc2l6ZSgpPjEgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfTk9OVU5JUVVFX1JFRiwKKwkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkgIHJlZik7CisJCX0KK30KKworLyoqIEZvciBcJHJ1bGVsYWJlbC5uYW1lLCByZXR1cm4gdGhlIEF0dHJpYnV0ZSBmb3VuZCBmb3IgbmFtZS4gIEl0CisgKiAgd2lsbCBiZSBhIHByZWRlZmluZWQgcHJvcGVydHkgb3IgYSByZXR1cm4gdmFsdWUuCisgKi8KK3B1YmxpYyBBdHRyaWJ1dGUgZ2V0UnVsZUxhYmVsQXR0cmlidXRlKFN0cmluZyBydWxlTmFtZSwgU3RyaW5nIGF0dHJOYW1lKSB7CisJUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKHJ1bGVOYW1lKTsKKwlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IHIuZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZShhdHRyTmFtZSk7CisJaWYgKCBzY29wZSE9bnVsbCAmJiAhc2NvcGUuaXNQYXJhbWV0ZXJTY29wZSApIHsKKwkJcmV0dXJuIHNjb3BlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7CisJfQorCXJldHVybiBudWxsOworfQorCitBdHRyaWJ1dGVTY29wZSByZXNvbHZlRHluYW1pY1Njb3BlKFN0cmluZyBzY29wZU5hbWUpIHsKKwlpZiAoIGdyYW1tYXIuZ2V0R2xvYmFsU2NvcGUoc2NvcGVOYW1lKSE9bnVsbCApIHsKKwkJcmV0dXJuIGdyYW1tYXIuZ2V0R2xvYmFsU2NvcGUoc2NvcGVOYW1lKTsKKwl9CisJUnVsZSBzY29wZVJ1bGUgPSBncmFtbWFyLmdldFJ1bGUoc2NvcGVOYW1lKTsKKwlpZiAoIHNjb3BlUnVsZSE9bnVsbCApIHsKKwkJcmV0dXJuIHNjb3BlUnVsZS5ydWxlU2NvcGU7CisJfQorCXJldHVybiBudWxsOyAvLyBub3QgYSB2YWxpZCBkeW5hbWljIHNjb3BlCit9CisKK3Byb3RlY3RlZCBTVCB0ZW1wbGF0ZShTdHJpbmcgbmFtZSkgeworCVNUIHN0ID0gZ2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLmdldEluc3RhbmNlT2YobmFtZSk7CisJY2h1bmtzLmFkZChzdCk7CisJcmV0dXJuIHN0OworfQorCisKK30KKworLyoqCSR4LnkJeCBpcyBlbmNsb3NpbmcgcnVsZSwgeSBpcyBhIHJldHVybiB2YWx1ZSwgcGFyYW1ldGVyLCBvcgorICogCQkJcHJlZGVmaW5lZCBwcm9wZXJ0eS4KKyAqCisgKiAJCQlyW2ludCBpXSByZXR1cm5zIFtpbnQgal0KKyAqIAkJCQk6CXskci5pLCAkci5qLCAkci5zdGFydCwgJHIuc3RvcCwgJHIuc3QsICRyLnRyZWV9CisgKiAJCQkJOworICovCitTRVRfRU5DTE9TSU5HX1JVTEVfU0NPUEVfQVRUUgorCToJJyQnIHg9SUQgJy4nIHk9SUQgV1M/ICc9JyBleHByPUFUVFJfVkFMVUVfRVhQUiAnOycKKwkJCQkJCQl7ZW5jbG9zaW5nUnVsZSE9bnVsbCAmJgorCSAgICAgICAgICAgICAgICAgICAgICAgICAkeC50ZXh0LmVxdWFscyhlbmNsb3NpbmdSdWxlLm5hbWUpICYmCisJICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ1J1bGUuZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZSgkeS50ZXh0KSE9bnVsbH0/CisJCS8ve1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgXCRydWxlLmF0dHIiKTt9CisJCXsKKwkJU1Qgc3QgPSBudWxsOworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IGVuY2xvc2luZ1J1bGUuZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZSgkeS50ZXh0KTsKKwkJaWYgKCBzY29wZS5pc1ByZWRlZmluZWRSdWxlU2NvcGUgKSB7CisJCQlpZiAoICR5LnRleHQuZXF1YWxzKCJzdCIpIHx8ICR5LnRleHQuZXF1YWxzKCJ0cmVlIikgKSB7CisJCQkJc3QgPSB0ZW1wbGF0ZSgicnVsZVNldFByb3BlcnR5UmVmXyIrJHkudGV4dCk7CisJCQkJZ3JhbW1hci5yZWZlcmVuY2VSdWxlTGFiZWxQcmVkZWZpbmVkQXR0cmlidXRlKCR4LnRleHQpOworCQkJCXN0LmFkZCgic2NvcGUiLCAkeC50ZXh0KTsKKwkJCQlzdC5hZGQoImF0dHIiLCAkeS50ZXh0KTsKKwkJCQlzdC5hZGQoImV4cHIiLCB0cmFuc2xhdGVBY3Rpb24oJGV4cHIudGV4dCkpOworCQkJfSBlbHNlIHsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfV1JJVEVfVE9fUkVBRE9OTFlfQVRUUiwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCQkgICR4LnRleHQsCisJCQkJCQkJCQkJICAkeS50ZXh0KTsKKwkJCX0KKwkJfQorCSAgICBlbHNlIGlmICggc2NvcGUuaXNQcmVkZWZpbmVkTGV4ZXJSdWxlU2NvcGUgKSB7CisJICAgIAkvLyB0aGlzIGlzIGEgYmV0dGVyIG1lc3NhZ2UgdG8gZW1pdCB0aGFuIHRoZSBwcmV2aW91cyBvbmUuLi4KKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19XUklURV9UT19SRUFET05MWV9BVFRSLAorCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCSAgJHgudGV4dCwKKwkJCQkJCQkJCSAgJHkudGV4dCk7CisJICAgIH0KKwkJZWxzZSBpZiAoIHNjb3BlLmlzUGFyYW1ldGVyU2NvcGUgKSB7CisJCQlzdCA9IHRlbXBsYXRlKCJwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYiKTsKKwkJCXN0LmFkZCgiYXR0ciIsIHNjb3BlLmdldEF0dHJpYnV0ZSgkeS50ZXh0KSk7CisJCQlzdC5hZGQoImV4cHIiLCB0cmFuc2xhdGVBY3Rpb24oJGV4cHIudGV4dCkpOworCQl9CisJCWVsc2UgeyAvLyBtdXN0IGJlIHJldHVybiB2YWx1ZQorCQkJc3QgPSB0ZW1wbGF0ZSgicmV0dXJuU2V0QXR0cmlidXRlUmVmIik7CisJCQlzdC5hZGQoInJ1bGVEZXNjcmlwdG9yIiwgZW5jbG9zaW5nUnVsZSk7CisJCQlzdC5hZGQoImF0dHIiLCBzY29wZS5nZXRBdHRyaWJ1dGUoJHkudGV4dCkpOworCQkJc3QuYWRkKCJleHByIiwgdHJhbnNsYXRlQWN0aW9uKCRleHByLnRleHQpKTsKKwkJfQorCQl9CisJOworRU5DTE9TSU5HX1JVTEVfU0NPUEVfQVRUUgorCToJJyQnIHg9SUQgJy4nIHk9SUQJe2VuY2xvc2luZ1J1bGUhPW51bGwgJiYKKwkgICAgICAgICAgICAgICAgICAgICAgICAgJHgudGV4dC5lcXVhbHMoZW5jbG9zaW5nUnVsZS5uYW1lKSAmJgorCSAgICAgICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdSdWxlLmdldExvY2FsQXR0cmlidXRlU2NvcGUoJHkudGV4dCkhPW51bGx9PworCQkvL3tTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwkcnVsZS5hdHRyIik7fQorCQl7CisJCWlmICggaXNSdWxlUmVmSW5BbHQoJHgudGV4dCkgICkgeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1JVTEVfUkVGX0FNQklHX1dJVEhfUlVMRV9JTl9BTFQsCisJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJICAkeC50ZXh0KTsKKwkJfQorCQlTVCBzdCA9IG51bGw7CisJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gZW5jbG9zaW5nUnVsZS5nZXRMb2NhbEF0dHJpYnV0ZVNjb3BlKCR5LnRleHQpOworCQlpZiAoIHNjb3BlLmlzUHJlZGVmaW5lZFJ1bGVTY29wZSApIHsKKwkJCXN0ID0gdGVtcGxhdGUoInJ1bGVQcm9wZXJ0eVJlZl8iKyR5LnRleHQpOworCQkJZ3JhbW1hci5yZWZlcmVuY2VSdWxlTGFiZWxQcmVkZWZpbmVkQXR0cmlidXRlKCR4LnRleHQpOworCQkJc3QuYWRkKCJzY29wZSIsICR4LnRleHQpOworCQkJc3QuYWRkKCJhdHRyIiwgJHkudGV4dCk7CisJCX0KKwkgICAgZWxzZSBpZiAoIHNjb3BlLmlzUHJlZGVmaW5lZExleGVyUnVsZVNjb3BlICkgeworCSAgICAJLy8gcGVyaGFwcyBub3QgdGhlIG1vc3QgcHJlY2lzZSBlcnJvciBtZXNzYWdlIHRvIHVzZSwgYnV0Li4uCisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfUlVMRV9IQVNfTk9fQVJHUywKKwkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkgICR4LnRleHQpOworCSAgICB9CisJCWVsc2UgaWYgKCBzY29wZS5pc1BhcmFtZXRlclNjb3BlICkgeworCQkJc3QgPSB0ZW1wbGF0ZSgicGFyYW1ldGVyQXR0cmlidXRlUmVmIik7CisJCQlzdC5hZGQoImF0dHIiLCBzY29wZS5nZXRBdHRyaWJ1dGUoJHkudGV4dCkpOworCQl9CisJCWVsc2UgeyAvLyBtdXN0IGJlIHJldHVybiB2YWx1ZQorCQkJc3QgPSB0ZW1wbGF0ZSgicmV0dXJuQXR0cmlidXRlUmVmIik7CisJCQlzdC5hZGQoInJ1bGVEZXNjcmlwdG9yIiwgZW5jbG9zaW5nUnVsZSk7CisJCQlzdC5hZGQoImF0dHIiLCBzY29wZS5nZXRBdHRyaWJ1dGUoJHkudGV4dCkpOworCQl9CisJCX0KKwk7CisKKy8qKiBTZXR0aW5nICR0b2tlbmxhYmVsLmF0dHIgb3IgJHRva2VucmVmLmF0dHIgd2hlcmUgYXR0ciBpcyBwcmVkZWZpbmVkIHByb3BlcnR5IG9mIGEgdG9rZW4gaXMgYW4gZXJyb3IuICovCitTRVRfVE9LRU5fU0NPUEVfQVRUUgorCToJJyQnIHg9SUQgJy4nIHk9SUQgV1M/ICc9JworCQkJCQkJCSB7ZW5jbG9zaW5nUnVsZSE9bnVsbCAmJiBpbnB1dC5MQSgxKSE9Jz0nICYmCisJICAgICAgICAgICAgICAgICAgICAgICAgIChlbmNsb3NpbmdSdWxlLmdldFRva2VuTGFiZWwoJHgudGV4dCkhPW51bGx8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUb2tlblJlZkluQWx0KCR4LnRleHQpKSAmJgorCSAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVTY29wZS50b2tlblNjb3BlLmdldEF0dHJpYnV0ZSgkeS50ZXh0KSE9bnVsbH0/CisJCS8ve1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgXCR0b2tlbmxhYmVsLmF0dHIgb3IgXCR0b2tlbnJlZi5hdHRyIik7fQorCQl7CisJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19XUklURV9UT19SRUFET05MWV9BVFRSLAorCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCSAgJHgudGV4dCwKKwkJCQkJCQkJICAkeS50ZXh0KTsKKwkJfQorCTsKKworLyoqICR0b2tlbmxhYmVsLmF0dHIgb3IgJHRva2VucmVmLmF0dHIgd2hlcmUgYXR0ciBpcyBwcmVkZWZpbmVkIHByb3BlcnR5IG9mIGEgdG9rZW4uCisgKiAgSWYgaW4gbGV4ZXIgZ3JhbW1hciwgb25seSB0cmFuc2xhdGUgZm9yIHN0cmluZ3MgYW5kIHRva2VucyAocnVsZSByZWZzKQorICovCitUT0tFTl9TQ09QRV9BVFRSCisJOgknJCcgeD1JRCAnLicgeT1JRAl7ZW5jbG9zaW5nUnVsZSE9bnVsbCAmJgorCSAgICAgICAgICAgICAgICAgICAgICAgICAoZW5jbG9zaW5nUnVsZS5nZXRUb2tlbkxhYmVsKCR4LnRleHQpIT1udWxsfHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVG9rZW5SZWZJbkFsdCgkeC50ZXh0KSkgJiYKKwkgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlU2NvcGUudG9rZW5TY29wZS5nZXRBdHRyaWJ1dGUoJHkudGV4dCkhPW51bGwgJiYKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50TGFiZWwoJHgudGV4dCkuZWxlbWVudFJlZi50b2tlbi5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlRPS0VOX1JFRiB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50TGFiZWwoJHgudGV4dCkuZWxlbWVudFJlZi50b2tlbi5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlNUUklOR19MSVRFUkFMKX0/CisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwkdG9rZW5sYWJlbC5hdHRyIG9yIFwkdG9rZW5yZWYuYXR0ciIpO30KKwkJeworCQlTdHJpbmcgbGFiZWwgPSAkeC50ZXh0OworCQlpZiAoIGVuY2xvc2luZ1J1bGUuZ2V0VG9rZW5MYWJlbCgkeC50ZXh0KT09bnVsbCApIHsKKwkJCS8vIFwkdG9rZW5yZWYuYXR0ciAgZ290dGEgZ2V0IG9sZCBsYWJlbCBvciBjb21wdXRlIG5ldyBvbmUKKwkJCWNoZWNrRWxlbWVudFJlZlVuaXF1ZW5lc3MoJHgudGV4dCwgdHJ1ZSk7CisJCQlsYWJlbCA9IGVuY2xvc2luZ1J1bGUuZ2V0RWxlbWVudExhYmVsKCR4LnRleHQsIG91dGVyQWx0TnVtLCBnZW5lcmF0b3IpOworCQkJaWYgKCBsYWJlbD09bnVsbCApIHsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfRk9SV0FSRF9FTEVNRU5UX1JFRiwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCQkgICJcJCIrJHgudGV4dCsiLiIrJHkudGV4dCk7CisJCQkJbGFiZWwgPSAkeC50ZXh0OworCQkJfQorCQl9CisJCVNUIHN0ID0gdGVtcGxhdGUoInRva2VuTGFiZWxQcm9wZXJ0eVJlZl8iKyR5LnRleHQpOworCQlzdC5hZGQoInNjb3BlIiwgbGFiZWwpOworCQlzdC5hZGQoImF0dHIiLCBBdHRyaWJ1dGVTY29wZS50b2tlblNjb3BlLmdldEF0dHJpYnV0ZSgkeS50ZXh0KSk7CisJCX0KKwk7CisKKy8qKiBTZXR0aW5nICRydWxlbGFiZWwuYXR0ciBvciAkcnVsZXJlZi5hdHRyIHdoZXJlIGF0dHIgaXMgYSBwcmVkZWZpbmVkIHByb3BlcnR5IGlzIGFuIGVycm9yCisgKiAgVGhpcyBtdXN0IGFsc28gZmFpbCwgaWYgd2UgdHJ5IHRvIGFjY2VzcyBhIGxvY2FsIGF0dHJpYnV0ZSdzIGZpZWxkLCBsaWtlICR0cmVlLnNjb3BlID0gbG9jYWxPYmplY3QKKyAqICBUaGF0IG11c3QgYmUgaGFuZGxlZCBieSBMT0NBTF9BVFRSIGJlbG93LiBBTlRMUiBvbmx5IGNvbmNlcm5zIGl0c2VsZiB3aXRoIHRoZSB0b3AtbGV2ZWwgc2NvcGUKKyAqICBhdHRyaWJ1dGVzIGRlY2xhcmVkIGluIHNjb3BlIHt9IG9yIHBhcmFtZXRlcnMsIHJldHVybiB2YWx1ZXMgYW5kIHRoZSBsaWtlLgorICovCitTRVRfUlVMRV9TQ09QRV9BVFRSCitAaW5pdCB7CitHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIgcGFpcj1udWxsOworU3RyaW5nIHJlZmRSdWxlTmFtZT1udWxsOworfQorCToJJyQnIHg9SUQgJy4nIHk9SUQgV1M/ICc9JyB7ZW5jbG9zaW5nUnVsZSE9bnVsbCAmJiBpbnB1dC5MQSgxKSE9Jz0nfT8KKwkJeworCQlwYWlyID0gZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoJHgudGV4dCk7CisJCXJlZmRSdWxlTmFtZSA9ICR4LnRleHQ7CisJCWlmICggcGFpciE9bnVsbCApIHsKKwkJCXJlZmRSdWxlTmFtZSA9IHBhaXIucmVmZXJlbmNlZFJ1bGVOYW1lOworCQl9CisJCX0KKwkJLy8gc3VwZXJjb21wbGljYXRlZCBiZWNhdXNlIEkgY2FuJ3QgZXhlYyB0aGUgYWJvdmUgYWN0aW9uLgorCQkvLyBUaGlzIGFzc2VydHMgdGhhdCBpZiBpdCdzIGEgbGFiZWwgb3IgYSByZWYgdG8gYSBydWxlIHByb2NlZWQgYnV0IG9ubHkgaWYgdGhlIGF0dHJpYnV0ZQorCQkvLyBpcyB2YWxpZCBmb3IgdGhhdCBydWxlJ3Mgc2NvcGUKKwkJeyhlbmNsb3NpbmdSdWxlLmdldFJ1bGVMYWJlbCgkeC50ZXh0KSE9bnVsbCB8fCBpc1J1bGVSZWZJbkFsdCgkeC50ZXh0KSkgJiYKKwkgICAgICBnZXRSdWxlTGFiZWxBdHRyaWJ1dGUoZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoJHgudGV4dCkhPW51bGw/ZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoJHgudGV4dCkucmVmZXJlbmNlZFJ1bGVOYW1lOiR4LnRleHQsJHkudGV4dCkhPW51bGx9PworCQkvL3tTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHNldCBcJHJ1bGVsYWJlbC5hdHRyIG9yIFwkcnVsZXJlZi5hdHRyOiAiKyR4LnRleHQrIi4iKyR5LnRleHQpO30KKwkJeworCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfV1JJVEVfVE9fUkVBRE9OTFlfQVRUUiwKKwkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkgICR4LnRleHQsCisJCQkJCQkJCSAgJHkudGV4dCk7CisJCX0KKwk7CisKKy8qKiAkcnVsZWxhYmVsLmF0dHIgb3IgJHJ1bGVyZWYuYXR0ciB3aGVyZSBhdHRyIGlzIGEgcHJlZGVmaW5lZCBwcm9wZXJ0eSovCitSVUxFX1NDT1BFX0FUVFIKK0Bpbml0IHsKK0dyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBwYWlyPW51bGw7CitTdHJpbmcgcmVmZFJ1bGVOYW1lPW51bGw7Cit9CisJOgknJCcgeD1JRCAnLicgeT1JRCB7ZW5jbG9zaW5nUnVsZSE9bnVsbH0/CisJCXsKKwkJcGFpciA9IGVuY2xvc2luZ1J1bGUuZ2V0UnVsZUxhYmVsKCR4LnRleHQpOworCQlyZWZkUnVsZU5hbWUgPSAkeC50ZXh0OworCQlpZiAoIHBhaXIhPW51bGwgKSB7CisJCQlyZWZkUnVsZU5hbWUgPSBwYWlyLnJlZmVyZW5jZWRSdWxlTmFtZTsKKwkJfQorCQl9CisJCS8vIHN1cGVyY29tcGxpY2F0ZWQgYmVjYXVzZSBJIGNhbid0IGV4ZWMgdGhlIGFib3ZlIGFjdGlvbi4KKwkJLy8gVGhpcyBhc3NlcnRzIHRoYXQgaWYgaXQncyBhIGxhYmVsIG9yIGEgcmVmIHRvIGEgcnVsZSBwcm9jZWVkIGJ1dCBvbmx5IGlmIHRoZSBhdHRyaWJ1dGUKKwkJLy8gaXMgdmFsaWQgZm9yIHRoYXQgcnVsZSdzIHNjb3BlCisJCXsoZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoJHgudGV4dCkhPW51bGwgfHwgaXNSdWxlUmVmSW5BbHQoJHgudGV4dCkpICYmCisJICAgICAgZ2V0UnVsZUxhYmVsQXR0cmlidXRlKGVuY2xvc2luZ1J1bGUuZ2V0UnVsZUxhYmVsKCR4LnRleHQpIT1udWxsP2VuY2xvc2luZ1J1bGUuZ2V0UnVsZUxhYmVsKCR4LnRleHQpLnJlZmVyZW5jZWRSdWxlTmFtZTokeC50ZXh0LCR5LnRleHQpIT1udWxsfT8KKwkJLy97U3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBcJHJ1bGVsYWJlbC5hdHRyIG9yIFwkcnVsZXJlZi5hdHRyOiAiKyR4LnRleHQrIi4iKyR5LnRleHQpO30KKwkJeworCQlTdHJpbmcgbGFiZWwgPSAkeC50ZXh0OworCQlpZiAoIHBhaXI9PW51bGwgKSB7CisJCQkvLyBcJHJ1bGVyZWYuYXR0ciAgZ290dGEgZ2V0IG9sZCBsYWJlbCBvciBjb21wdXRlIG5ldyBvbmUKKwkJCWNoZWNrRWxlbWVudFJlZlVuaXF1ZW5lc3MoJHgudGV4dCwgZmFsc2UpOworCQkJbGFiZWwgPSBlbmNsb3NpbmdSdWxlLmdldEVsZW1lbnRMYWJlbCgkeC50ZXh0LCBvdXRlckFsdE51bSwgZ2VuZXJhdG9yKTsKKwkJCWlmICggbGFiZWw9PW51bGwgKSB7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0ZPUldBUkRfRUxFTUVOVF9SRUYsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJICAiXCQiKyR4LnRleHQrIi4iKyR5LnRleHQpOworCQkJCWxhYmVsID0gJHgudGV4dDsKKwkJCX0KKwkJfQorCQlTVCBzdDsKKwkJUnVsZSByZWZkUnVsZSA9IGdyYW1tYXIuZ2V0UnVsZShyZWZkUnVsZU5hbWUpOworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IHJlZmRSdWxlLmdldExvY2FsQXR0cmlidXRlU2NvcGUoJHkudGV4dCk7CisJCWlmICggc2NvcGUuaXNQcmVkZWZpbmVkUnVsZVNjb3BlICkgeworCQkJc3QgPSB0ZW1wbGF0ZSgicnVsZUxhYmVsUHJvcGVydHlSZWZfIiskeS50ZXh0KTsKKwkJCWdyYW1tYXIucmVmZXJlbmNlUnVsZUxhYmVsUHJlZGVmaW5lZEF0dHJpYnV0ZShyZWZkUnVsZU5hbWUpOworCQkJc3QuYWRkKCJzY29wZSIsIGxhYmVsKTsKKwkJCXN0LmFkZCgiYXR0ciIsICR5LnRleHQpOworCQl9CisJCWVsc2UgaWYgKCBzY29wZS5pc1ByZWRlZmluZWRMZXhlclJ1bGVTY29wZSApIHsKKwkJCXN0ID0gdGVtcGxhdGUoImxleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfIiskeS50ZXh0KTsKKwkJCWdyYW1tYXIucmVmZXJlbmNlUnVsZUxhYmVsUHJlZGVmaW5lZEF0dHJpYnV0ZShyZWZkUnVsZU5hbWUpOworCQkJc3QuYWRkKCJzY29wZSIsIGxhYmVsKTsKKwkJCXN0LmFkZCgiYXR0ciIsICR5LnRleHQpOworCQl9CisJCWVsc2UgaWYgKCBzY29wZS5pc1BhcmFtZXRlclNjb3BlICkgeworCQkJLy8gVE9ETzogZXJyb3IhCisJCX0KKwkJZWxzZSB7CisJCQlzdCA9IHRlbXBsYXRlKCJydWxlTGFiZWxSZWYiKTsKKwkJCXN0LmFkZCgicmVmZXJlbmNlZFJ1bGUiLCByZWZkUnVsZSk7CisJCQlzdC5hZGQoInNjb3BlIiwgbGFiZWwpOworCQkJc3QuYWRkKCJhdHRyIiwgc2NvcGUuZ2V0QXR0cmlidXRlKCR5LnRleHQpKTsKKwkJfQorCQl9CisJOworCisKKy8qKiAkbGFiZWwJZWl0aGVyIGEgdG9rZW4gbGFiZWwgb3IgdG9rZW4vcnVsZSBsaXN0IGxhYmVsIGxpa2UgbGFiZWwrPWV4cHIgKi8KK0xBQkVMX1JFRgorCToJJyQnIElEIHtlbmNsb3NpbmdSdWxlIT1udWxsICYmCisJICAgICAgICAgICAgZ2V0RWxlbWVudExhYmVsKCRJRC50ZXh0KSE9bnVsbCAmJgorCQkgICAgICAgIGVuY2xvc2luZ1J1bGUuZ2V0UnVsZUxhYmVsKCRJRC50ZXh0KT09bnVsbH0/CisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwkbGFiZWwiKTt9CisJCXsKKwkJU1Qgc3Q7CisJCUdyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBwYWlyID0gZ2V0RWxlbWVudExhYmVsKCRJRC50ZXh0KTsKKwkJaWYgKCBwYWlyLnR5cGU9PUdyYW1tYXIuUlVMRV9MSVNUX0xBQkVMIHx8CisgICAgICAgICAgICAgcGFpci50eXBlPT1HcmFtbWFyLlRPS0VOX0xJU1RfTEFCRUwgfHwKKyAgICAgICAgICAgICBwYWlyLnR5cGU9PUdyYW1tYXIuV0lMRENBUkRfVFJFRV9MSVNUX0xBQkVMICkKKyAgICAgICAgeworCQkJc3QgPSB0ZW1wbGF0ZSgibGlzdExhYmVsUmVmIik7CisJCX0KKwkJZWxzZSB7CisJCQlzdCA9IHRlbXBsYXRlKCJ0b2tlbkxhYmVsUmVmIik7CisJCX0KKwkJc3QuYWRkKCJsYWJlbCIsICRJRC50ZXh0KTsKKwkJfQorCTsKKworLyoqICR0b2tlbnJlZiBpbiBhIG5vbi1sZXhlciBncmFtbWFyICovCitJU09MQVRFRF9UT0tFTl9SRUYKKwk6CSckJyBJRAl7Z3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICYmIGVuY2xvc2luZ1J1bGUhPW51bGwgJiYgaXNUb2tlblJlZkluQWx0KCRJRC50ZXh0KX0/CisJCS8ve1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgXCR0b2tlbnJlZiIpO30KKwkJeworCQlTdHJpbmcgbGFiZWwgPSBlbmNsb3NpbmdSdWxlLmdldEVsZW1lbnRMYWJlbCgkSUQudGV4dCwgb3V0ZXJBbHROdW0sIGdlbmVyYXRvcik7CisJCWNoZWNrRWxlbWVudFJlZlVuaXF1ZW5lc3MoJElELnRleHQsIHRydWUpOworCQlpZiAoIGxhYmVsPT1udWxsICkgeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0ZPUldBUkRfRUxFTUVOVF9SRUYsCisJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJICAkSUQudGV4dCk7CisJCX0KKwkJZWxzZSB7CisJCQlTVCBzdCA9IHRlbXBsYXRlKCJ0b2tlbkxhYmVsUmVmIik7CisJCQlzdC5hZGQoImxhYmVsIiwgbGFiZWwpOworCQl9CisJCX0KKwk7CisKKy8qKiAkbGV4ZXJydWxlcmVmIGZyb20gd2l0aGluIHRoZSBsZXhlciAqLworSVNPTEFURURfTEVYRVJfUlVMRV9SRUYKKwk6CSckJyBJRAl7Z3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSICYmCisJICAgICAgICAgICAgIGVuY2xvc2luZ1J1bGUhPW51bGwgJiYKKwkgICAgICAgICAgICAgaXNSdWxlUmVmSW5BbHQoJElELnRleHQpfT8KKwkJLy97U3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBcJGxleGVycnVsZXJlZiIpO30KKwkJeworCQlTdHJpbmcgbGFiZWwgPSBlbmNsb3NpbmdSdWxlLmdldEVsZW1lbnRMYWJlbCgkSUQudGV4dCwgb3V0ZXJBbHROdW0sIGdlbmVyYXRvcik7CisJCWNoZWNrRWxlbWVudFJlZlVuaXF1ZW5lc3MoJElELnRleHQsIGZhbHNlKTsKKwkJaWYgKCBsYWJlbD09bnVsbCApIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19GT1JXQVJEX0VMRU1FTlRfUkVGLAorCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCSAgJElELnRleHQpOworCQl9CisJCWVsc2UgeworCQkJU1Qgc3QgPSB0ZW1wbGF0ZSgibGV4ZXJSdWxlTGFiZWwiKTsKKwkJCXN0LmFkZCgibGFiZWwiLCBsYWJlbCk7CisJCX0KKwkJfQorCTsKKworLyoqICAkeSAJcmV0dXJuIHZhbHVlLCBwYXJhbWV0ZXIsIHByZWRlZmluZWQgcnVsZSBwcm9wZXJ0eSwgb3IgdG9rZW4vcnVsZQorICogICAgICAgICAgcmVmZXJlbmNlIHdpdGhpbiBlbmNsb3NpbmcgcnVsZSdzIG91dGVybW9zdCBhbHQuCisgKiAgICAgICAgICB5IG11c3QgYmUgYSAibG9jYWwiIHJlZmVyZW5jZTsgaS5lLiwgaXQgbXVzdCBiZSByZWZlcnJpbmcgdG8KKyAqICAgICAgICAgIHNvbWV0aGluZyBkZWZpbmVkIHdpdGhpbiB0aGUgZW5jbG9zaW5nIHJ1bGUuCisgKgorICogCQkJcltpbnQgaV0gcmV0dXJucyBbaW50IGpdCisgKiAJCQkJOgl7JGksICRqLCAkc3RhcnQsICRzdG9wLCAkc3QsICR0cmVlfQorICogICAgICAgICAgICAgIDsKKyAqCisgKglUT0RPOiB0aGlzIG1pZ2h0IGdldCB0aGUgZHluYW1pYyBzY29wZSdzIGVsZW1lbnRzIHRvby4hISEhISEhISEKKyAqLworU0VUX0xPQ0FMX0FUVFIKKwk6CSckJyBJRCBXUz8gJz0nIGV4cHI9QVRUUl9WQUxVRV9FWFBSICc7JyB7ZW5jbG9zaW5nUnVsZSE9bnVsbAorCQkJCQkJCQkJCQkJCSYmIGVuY2xvc2luZ1J1bGUuZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZSgkSUQudGV4dCkhPW51bGwKKwkJCQkJCQkJCQkJCQkmJiAhZW5jbG9zaW5nUnVsZS5nZXRMb2NhbEF0dHJpYnV0ZVNjb3BlKCRJRC50ZXh0KS5pc1ByZWRlZmluZWRMZXhlclJ1bGVTY29wZX0/CisJCS8ve1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgc2V0IFwkbG9jYWxhdHRyIik7fQorCQl7CisJCVNUIHN0OworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IGVuY2xvc2luZ1J1bGUuZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZSgkSUQudGV4dCk7CisJCWlmICggc2NvcGUuaXNQcmVkZWZpbmVkUnVsZVNjb3BlICkgeworCQkJaWYgKCRJRC50ZXh0LmVxdWFscygidHJlZSIpIHx8ICRJRC50ZXh0LmVxdWFscygic3QiKSkgeworCQkJCXN0ID0gdGVtcGxhdGUoInJ1bGVTZXRQcm9wZXJ0eVJlZl8iKyRJRC50ZXh0KTsKKwkJCQlncmFtbWFyLnJlZmVyZW5jZVJ1bGVMYWJlbFByZWRlZmluZWRBdHRyaWJ1dGUoZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCQlzdC5hZGQoInNjb3BlIiwgZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCQlzdC5hZGQoImF0dHIiLCAkSUQudGV4dCk7CisJCQkJc3QuYWRkKCJleHByIiwgdHJhbnNsYXRlQWN0aW9uKCRleHByLnRleHQpKTsKKwkJCX0gZWxzZSB7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1dSSVRFX1RPX1JFQURPTkxZX0FUVFIsCisJCQkJCQkJCQkJIGdyYW1tYXIsCisJCQkJCQkJCQkJIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCSAkSUQudGV4dCwKKwkJCQkJCQkJCQkgIiIpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzY29wZS5pc1BhcmFtZXRlclNjb3BlICkgeworCQkJc3QgPSB0ZW1wbGF0ZSgicGFyYW1ldGVyU2V0QXR0cmlidXRlUmVmIik7CisJCQlzdC5hZGQoImF0dHIiLCBzY29wZS5nZXRBdHRyaWJ1dGUoJElELnRleHQpKTsKKwkJCXN0LmFkZCgiZXhwciIsIHRyYW5zbGF0ZUFjdGlvbigkZXhwci50ZXh0KSk7CisJCX0KKwkJZWxzZSB7CisJCQlzdCA9IHRlbXBsYXRlKCJyZXR1cm5TZXRBdHRyaWJ1dGVSZWYiKTsKKwkJCXN0LmFkZCgicnVsZURlc2NyaXB0b3IiLCBlbmNsb3NpbmdSdWxlKTsKKwkJCXN0LmFkZCgiYXR0ciIsIHNjb3BlLmdldEF0dHJpYnV0ZSgkSUQudGV4dCkpOworCQkJc3QuYWRkKCJleHByIiwgdHJhbnNsYXRlQWN0aW9uKCRleHByLnRleHQpKTsKKwkJCX0KKwkJfQorCTsKK0xPQ0FMX0FUVFIKKwk6CSckJyBJRCB7ZW5jbG9zaW5nUnVsZSE9bnVsbCAmJiBlbmNsb3NpbmdSdWxlLmdldExvY2FsQXR0cmlidXRlU2NvcGUoJElELnRleHQpIT1udWxsfT8KKwkJLy97U3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBcJGxvY2FsYXR0ciIpO30KKwkJeworCQlTVCBzdDsKKwkJQXR0cmlidXRlU2NvcGUgc2NvcGUgPSBlbmNsb3NpbmdSdWxlLmdldExvY2FsQXR0cmlidXRlU2NvcGUoJElELnRleHQpOworCQlpZiAoIHNjb3BlLmlzUHJlZGVmaW5lZFJ1bGVTY29wZSApIHsKKwkJCXN0ID0gdGVtcGxhdGUoInJ1bGVQcm9wZXJ0eVJlZl8iKyRJRC50ZXh0KTsKKwkJCWdyYW1tYXIucmVmZXJlbmNlUnVsZUxhYmVsUHJlZGVmaW5lZEF0dHJpYnV0ZShlbmNsb3NpbmdSdWxlLm5hbWUpOworCQkJc3QuYWRkKCJzY29wZSIsIGVuY2xvc2luZ1J1bGUubmFtZSk7CisJCQlzdC5hZGQoImF0dHIiLCAkSUQudGV4dCk7CisJCX0KKwkJZWxzZSBpZiAoIHNjb3BlLmlzUHJlZGVmaW5lZExleGVyUnVsZVNjb3BlICkgeworCQkJc3QgPSB0ZW1wbGF0ZSgibGV4ZXJSdWxlUHJvcGVydHlSZWZfIiskSUQudGV4dCk7CisJCQlzdC5hZGQoInNjb3BlIiwgZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCXN0LmFkZCgiYXR0ciIsICRJRC50ZXh0KTsKKwkJfQorCQllbHNlIGlmICggc2NvcGUuaXNQYXJhbWV0ZXJTY29wZSApIHsKKwkJCXN0ID0gdGVtcGxhdGUoInBhcmFtZXRlckF0dHJpYnV0ZVJlZiIpOworCQkJc3QuYWRkKCJhdHRyIiwgc2NvcGUuZ2V0QXR0cmlidXRlKCRJRC50ZXh0KSk7CisJCX0KKwkJZWxzZSB7CisJCQlzdCA9IHRlbXBsYXRlKCJyZXR1cm5BdHRyaWJ1dGVSZWYiKTsKKwkJCXN0LmFkZCgicnVsZURlc2NyaXB0b3IiLCBlbmNsb3NpbmdSdWxlKTsKKwkJCXN0LmFkZCgiYXR0ciIsIHNjb3BlLmdldEF0dHJpYnV0ZSgkSUQudGV4dCkpOworCQl9CisJCX0KKwk7CisKKy8qKgkkeDo6eQl0aGUgb25seSB3YXkgdG8gYWNjZXNzIHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiBhIGR5bmFtaWMgc2NvcGUKKyAqIAkJCXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgeW91IGFyZSBpbiB0aGUgZGVmaW5pbmcgcnVsZS4KKyAqCisgKiAJCQlzY29wZSBTeW1ib2xzIHsgTGlzdCBuYW1lczsgfQorICogCQkJcgorICogCQkJc2NvcGUge2ludCBpO30KKyAqIAkJCXNjb3BlIFN5bWJvbHM7CisgKiAJCQkJOgl7JHI6Omk9Mzt9IHMgeyRTeW1ib2xzOjpuYW1lczt9CisgKiAJCQkJOworICogCQkJcwk6CXskcjo6aTsgJFN5bWJvbHM6Om5hbWVzO30KKyAqIAkJCQk7CisgKi8KK1NFVF9EWU5BTUlDX1NDT1BFX0FUVFIKKwk6CSckJyB4PUlEICc6OicgeT1JRCBXUz8gJz0nIGV4cHI9QVRUUl9WQUxVRV9FWFBSICc7JworCQkJCQkJICAge3Jlc29sdmVEeW5hbWljU2NvcGUoJHgudGV4dCkhPW51bGwgJiYKKwkJCQkJCSAgICAgcmVzb2x2ZUR5bmFtaWNTY29wZSgkeC50ZXh0KS5nZXRBdHRyaWJ1dGUoJHkudGV4dCkhPW51bGx9PworCQkvL3tTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHNldCBcJHNjb3BlOjphdHRyICIrICR4LnRleHQgKyAiOjoiICsgJHkudGV4dCArICIgdG8gIiArICRleHByLnRleHQpO30KKwkJeworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IHJlc29sdmVEeW5hbWljU2NvcGUoJHgudGV4dCk7CisJCWlmICggc2NvcGUhPW51bGwgKSB7CisJCQlTVCBzdCA9IHRlbXBsYXRlKCJzY29wZVNldEF0dHJpYnV0ZVJlZiIpOworCQkJc3QuYWRkKCJzY29wZSIsICR4LnRleHQpOworCQkJc3QuYWRkKCJhdHRyIiwgIHNjb3BlLmdldEF0dHJpYnV0ZSgkeS50ZXh0KSk7CisJCQlzdC5hZGQoImV4cHIiLCAgdHJhbnNsYXRlQWN0aW9uKCRleHByLnRleHQpKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIGVycm9yOiBpbnZhbGlkIGR5bmFtaWMgYXR0cmlidXRlCisJCX0KKwkJfQorCTsKKworRFlOQU1JQ19TQ09QRV9BVFRSCisJOgknJCcgeD1JRCAnOjonIHk9SUQKKwkJCQkJCSAgIHtyZXNvbHZlRHluYW1pY1Njb3BlKCR4LnRleHQpIT1udWxsICYmCisJCQkJCQkgICAgIHJlc29sdmVEeW5hbWljU2NvcGUoJHgudGV4dCkuZ2V0QXR0cmlidXRlKCR5LnRleHQpIT1udWxsfT8KKwkJLy97U3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBcJHNjb3BlOjphdHRyICIrICR4LnRleHQgKyAiOjoiICsgJHkudGV4dCk7fQorCQl7CisJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gcmVzb2x2ZUR5bmFtaWNTY29wZSgkeC50ZXh0KTsKKwkJaWYgKCBzY29wZSE9bnVsbCApIHsKKwkJCVNUIHN0ID0gdGVtcGxhdGUoInNjb3BlQXR0cmlidXRlUmVmIik7CisJCQlzdC5hZGQoInNjb3BlIiwgJHgudGV4dCk7CisJCQlzdC5hZGQoImF0dHIiLCAgc2NvcGUuZ2V0QXR0cmlidXRlKCR5LnRleHQpKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIGVycm9yOiBpbnZhbGlkIGR5bmFtaWMgYXR0cmlidXRlCisJCX0KKwkJfQorCTsKKworCitFUlJPUl9TQ09QRURfWFkKKwk6CSckJyB4PUlEICc6OicgeT1JRAorCQl7CisJCWNodW5rcy5hZGQoZ2V0VGV4dCgpKTsKKwkJZ2VuZXJhdG9yLmlzc3VlSW52YWxpZFNjb3BlRXJyb3IoJHgudGV4dCwkeS50ZXh0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdSdWxlLGFjdGlvblRva2VuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckFsdE51bSk7CQkKKwkJfQorCTsKKwkKKy8qKgkJVG8gYWNjZXNzIGRlZXBlciAodGhhbiB0b3Agb2Ygc3RhY2spIHNjb3BlcywgdXNlIHRoZSBub3RhdGlvbjoKKyAqCisgKiAJCSR4Wy0xXTo6eSBwcmV2aW91cyAoanVzdCB1bmRlciB0b3Agb2Ygc3RhY2spCisgKiAJCSR4Wy1pXTo6eSB0b3Agb2Ygc3RhY2sgLSBpIHdoZXJlIHRoZSAnLScgTVVTVCBCRSBQUkVTRU5UOworICogCQkJCSAgaS5lLiwgaSBjYW5ub3Qgc2ltcGx5IGJlIG5lZ2F0aXZlIHdpdGhvdXQgdGhlICctJyBzaWduIQorICogCQkkeFtpXTo6eSAgYWJzb2x1dGUgaW5kZXggaSAoMC4uc2l6ZS0xKQorICogCQkkeFswXTo6eSAgaXMgdGhlIGFic29sdXRlIDAgaW5kZXhlZCBlbGVtZW50IChib3R0b20gb2YgdGhlIHN0YWNrKQorICovCitEWU5BTUlDX05FR0FUSVZFX0lOREVYRURfU0NPUEVfQVRUUgorCToJJyQnIHg9SUQgJ1snICctJyBleHByPVNDT1BFX0lOREVYX0VYUFIgJ10nICc6OicgeT1JRAorCQkvLyB7U3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBcJHNjb3BlWy0uLi5dOjphdHRyIik7fQorCQl7CisJCVNUIHN0ID0gdGVtcGxhdGUoInNjb3BlQXR0cmlidXRlUmVmIik7CisJCXN0LmFkZCgic2NvcGUiLCAgICAkeC50ZXh0KTsKKwkJc3QuYWRkKCJhdHRyIiwgICAgIHJlc29sdmVEeW5hbWljU2NvcGUoJHgudGV4dCkuZ2V0QXR0cmlidXRlKCR5LnRleHQpKTsKKwkJc3QuYWRkKCJuZWdJbmRleCIsICRleHByLnRleHQpOworCQl9CQkKKwk7CisKK0RZTkFNSUNfQUJTT0xVVEVfSU5ERVhFRF9TQ09QRV9BVFRSCisJOgknJCcgeD1JRCAnWycgZXhwcj1TQ09QRV9JTkRFWF9FWFBSICddJyAnOjonIHk9SUQgCisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwkc2NvcGVbLi4uXTo6YXR0ciIpO30KKwkJeworCQlTVCBzdCA9IHRlbXBsYXRlKCJzY29wZUF0dHJpYnV0ZVJlZiIpOworCQlzdC5hZGQoInNjb3BlIiwgJHgudGV4dCk7CisJCXN0LmFkZCgiYXR0ciIsICByZXNvbHZlRHluYW1pY1Njb3BlKCR4LnRleHQpLmdldEF0dHJpYnV0ZSgkeS50ZXh0KSk7CisJCXN0LmFkZCgiaW5kZXgiLCAkZXhwci50ZXh0KTsKKwkJfQkJCisJOworCitmcmFnbWVudAorU0NPUEVfSU5ERVhfRVhQUgorCToJKH4nXScpKworCTsKKwkKKy8qKiAkcgkJeSBpcyBhIHJ1bGUncyBkeW5hbWljIHNjb3BlIG9yIGEgZ2xvYmFsIHNoYXJlZCBzY29wZS4KKyAqIAkJCUlzb2xhdGVkICRydWxlbmFtZSBpcyBub3QgYWxsb3dlZCB1bmxlc3MgaXQgaGFzIGEgZHluYW1pYyBzY29wZSAqYW5kKgorICogCQkJdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHRvIHJ1bGVuYW1lIGluIHRoZSBlbmNsb3NpbmcgYWx0ZXJuYXRpdmUsCisgKiAJCQl3aGljaCB3b3VsZCBiZSBhbWJpZ3VvdXMuICBTZWUgVGVzdEF0dHJpYnV0ZXMudGVzdEFtYmlndW91c1J1bGVSZWYoKQorICovCitJU09MQVRFRF9EWU5BTUlDX1NDT1BFCisJOgknJCcgSUQge3Jlc29sdmVEeW5hbWljU2NvcGUoJElELnRleHQpIT1udWxsfT8KKwkJLy8ge1N5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgaXNvbGF0ZWQgXCRzY29wZSB3aGVyZSBzY29wZSBpcyBhIGR5bmFtaWMgc2NvcGUiKTt9CisJCXsKKwkJU1Qgc3QgPSB0ZW1wbGF0ZSgiaXNvbGF0ZWREeW5hbWljU2NvcGVSZWYiKTsKKwkJc3QuYWRkKCJzY29wZSIsICRJRC50ZXh0KTsKKwkJfQkJCisJOworCQorLy8gYW50bHIuZyB0aGVuIGNvZGVnZW4uZyBkb2VzIHRoZXNlIGZpcnN0IHR3byBjdXJyZW50bHkuCisvLyBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSB0aGF0IGNvZGUuCisKKy8qKiAlZm9vKGE9e30sYj17fSwuLi4pIGN0b3IgKi8KK1RFTVBMQVRFX0lOU1RBTkNFCisJOgknJScgSUQgJygnICggV1M/IEFSRyAoJywnIFdTPyBBUkcpKiBXUz8gKT8gJyknCisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwlZm9vKGFyZ3MpIik7fQorCQl7CisJCVN0cmluZyBhY3Rpb24gPSBnZXRUZXh0KCkuc3Vic3RyaW5nKDEsZ2V0VGV4dCgpLmxlbmd0aCgpKTsKKwkJU3RyaW5nIHJ1bGVOYW1lID0gIjxvdXRzaWRlLW9mLXJ1bGU+IjsKKwkJaWYgKCBlbmNsb3NpbmdSdWxlIT1udWxsICkgeworCQkJcnVsZU5hbWUgPSBlbmNsb3NpbmdSdWxlLm5hbWU7CisJCX0KKwkJU1Qgc3QgPQorCQkJZ2VuZXJhdG9yLnRyYW5zbGF0ZVRlbXBsYXRlQ29uc3RydWN0b3IocnVsZU5hbWUsCisJCQkJCQkJCQkJCQkgICBvdXRlckFsdE51bSwKKwkJCQkJCQkJCQkJCSAgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCQkJICAgYWN0aW9uKTsKKwkJaWYgKCBzdCE9bnVsbCApIHsKKwkJCWNodW5rcy5hZGQoc3QpOworCQl9CisJCX0KKwk7CisKKy8qKiAlKHtuYW1lLWV4cHJ9KShhPXt9LC4uLikgaW5kaXJlY3QgdGVtcGxhdGUgY3RvciByZWZlcmVuY2UgKi8KK0lORElSRUNUX1RFTVBMQVRFX0lOU1RBTkNFCisJOgknJScgJygnIEFDVElPTiAnKScgJygnICggV1M/IEFSRyAoJywnIFdTPyBBUkcpKiBXUz8gKT8gJyknCisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwlKHsuLi59KShhcmdzKSIpO30KKwkJeworCQlTdHJpbmcgYWN0aW9uID0gZ2V0VGV4dCgpLnN1YnN0cmluZygxLGdldFRleHQoKS5sZW5ndGgoKSk7CisJCVNUIHN0ID0KKwkJCWdlbmVyYXRvci50cmFuc2xhdGVUZW1wbGF0ZUNvbnN0cnVjdG9yKGVuY2xvc2luZ1J1bGUubmFtZSwKKwkJCQkJCQkJCQkJCSAgIG91dGVyQWx0TnVtLAorCQkJCQkJCQkJCQkJICAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJCQkgICBhY3Rpb24pOworCQljaHVua3MuYWRkKHN0KTsKKwkJfQorCTsKKworZnJhZ21lbnQKK0FSRwk6CUlEICc9JyBBQ1RJT04KKwk7CisKKy8qKgkle2V4cHJ9LnkgPSB6OyB0ZW1wbGF0ZSBhdHRyaWJ1dGUgeSBvZiBTVC10eXBlZCBleHByIHRvIHogKi8KK1NFVF9FWFBSX0FUVFJJQlVURQorCToJJyUnIGE9QUNUSU9OICcuJyBJRCBXUz8gJz0nIGV4cHI9QVRUUl9WQUxVRV9FWFBSICc7JworCQkvLyB7U3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBcJXtleHByfS55ID0gejsiKTt9CisJCXsKKwkJU1Qgc3QgPSB0ZW1wbGF0ZSgiYWN0aW9uU2V0QXR0cmlidXRlIik7CisJCVN0cmluZyBhY3Rpb24gPSAkYS50ZXh0OworCQlhY3Rpb24gPSBhY3Rpb24uc3Vic3RyaW5nKDEsYWN0aW9uLmxlbmd0aCgpLTEpOyAvLyBzdHVmZiBpbnNpZGUgey4uLn0KKwkJc3QuYWRkKCJzdCIsIHRyYW5zbGF0ZUFjdGlvbihhY3Rpb24pKTsKKwkJc3QuYWRkKCJhdHRyTmFtZSIsICRJRC50ZXh0KTsKKwkJc3QuYWRkKCJleHByIiwgdHJhbnNsYXRlQWN0aW9uKCRleHByLnRleHQpKTsKKwkJfQorCTsKKwkKKy8qICAgICV4LnkgPSB6OyBzZXQgdGVtcGxhdGUgYXR0cmlidXRlIHkgb2YgeCAoYWx3YXlzIHNldCBuZXZlciBnZXQgYXR0cikKKyAqICAgICAgICAgICAgICB0byB6IFtsYW5ndWFnZXMgbGlrZSBweXRob24gd2l0aG91dCAnOycgbXVzdCBzdGlsbCB1c2UgdGhlCisgKiAgICAgICAgICAgICAgJzsnIHdoaWNoIHRoZSBjb2RlIGdlbmVyYXRvciBpcyBmcmVlIHRvIHJlbW92ZSBkdXJpbmcgY29kZSBnZW5dCisgKi8KK1NFVF9BVFRSSUJVVEUKKwk6CSclJyB4PUlEICcuJyB5PUlEIFdTPyAnPScgZXhwcj1BVFRSX1ZBTFVFX0VYUFIgJzsnCisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwleC55ID0gejsiKTt9CisJCXsKKwkJU1Qgc3QgPSB0ZW1wbGF0ZSgiYWN0aW9uU2V0QXR0cmlidXRlIik7CisJCXN0LmFkZCgic3QiLCAkeC50ZXh0KTsKKwkJc3QuYWRkKCJhdHRyTmFtZSIsICR5LnRleHQpOworCQlzdC5hZGQoImV4cHIiLCB0cmFuc2xhdGVBY3Rpb24oJGV4cHIudGV4dCkpOworCQl9CisJOworCisvKiogRG9uJ3QgYWxsb3cgYW4gPSBhcyBmaXJzdCBjaGFyIHRvIHByZXZlbnQgJHggPT0gMzsga2luZCBvZiBzdHVmZi4gKi8KK2ZyYWdtZW50CitBVFRSX1ZBTFVFX0VYUFIKKwk6CX4nPScgKH4nOycpKgorCTsKKwkKKy8qKiAle3N0cmluZy1leHByfSBhbm9ueW1vdXMgdGVtcGxhdGUgZnJvbSBzdHJpbmcgZXhwciAqLworVEVNUExBVEVfRVhQUgorCToJJyUnIGE9QUNUSU9OCisJCS8vIHtTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIFwle2V4cHJ9Iik7fQorCQl7CisJCVNUIHN0ID0gdGVtcGxhdGUoImFjdGlvblN0cmluZ0NvbnN0cnVjdG9yIik7CisJCVN0cmluZyBhY3Rpb24gPSAkYS50ZXh0OworCQlhY3Rpb24gPSBhY3Rpb24uc3Vic3RyaW5nKDEsYWN0aW9uLmxlbmd0aCgpLTEpOyAvLyBzdHVmZiBpbnNpZGUgey4uLn0KKwkJc3QuYWRkKCJzdHJpbmdFeHByIiwgdHJhbnNsYXRlQWN0aW9uKGFjdGlvbikpOworCQl9CisJOworCQorZnJhZ21lbnQKK0FDVElPTgorCToJJ3snIChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTouKSogJ30nCisJOworCQorRVNDIDogICAnXFwnICckJyB7Y2h1bmtzLmFkZCgiXCQiKTt9CisJfAknXFwnICclJyB7Y2h1bmtzLmFkZCgiXCUiKTt9CisJfAknXFwnIH4oJyQnfCclJykge2NodW5rcy5hZGQoZ2V0VGV4dCgpKTt9CisgICAgOyAgICAgICAKKworRVJST1JfWFkKKwk6CSckJyB4PUlEICcuJyB5PUlECisJCXsKKwkJY2h1bmtzLmFkZChnZXRUZXh0KCkpOworCQlnZW5lcmF0b3IuaXNzdWVJbnZhbGlkQXR0cmlidXRlRXJyb3IoJHgudGV4dCwkeS50ZXh0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nUnVsZSxhY3Rpb25Ub2tlbiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyQWx0TnVtKTsKKwkJfQorCTsKKwkKK0VSUk9SX1gKKwk6CSckJyB4PUlECisJCXsKKwkJY2h1bmtzLmFkZChnZXRUZXh0KCkpOworCQlnZW5lcmF0b3IuaXNzdWVJbnZhbGlkQXR0cmlidXRlRXJyb3IoJHgudGV4dCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ1J1bGUsYWN0aW9uVG9rZW4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckFsdE51bSk7CisJCX0KKwk7CisJCitVTktOT1dOX1NZTlRBWAorCToJJyQnCisJCXsKKwkJY2h1bmtzLmFkZChnZXRUZXh0KCkpOworCQkvLyBzaG91bGRuJ3QgbmVlZCBhbiBlcnJvciBoZXJlLiAgSnVzdCBhY2NlcHQgXCQgaWYgaXQgZG9lc24ndCBsb29rIGxpa2UgYW55dGhpbmcKKwkJfQorCXwJJyUnIChJRHwnLid8JygnfCcpJ3wnLCd8J3snfCd9J3wnIicpKgorCQl7CisJCWNodW5rcy5hZGQoZ2V0VGV4dCgpKTsKKwkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0lOVkFMSURfVEVNUExBVEVfQUNUSU9OLAorCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCSAgZ2V0VGV4dCgpKTsKKwkJfQorCTsKKworVEVYVDoJfignJCd8JyUnfCdcXCcpKyB7Y2h1bmtzLmFkZChnZXRUZXh0KCkpO30KKwk7CisJCitmcmFnbWVudAorSUQgIDogICAoJ2EnLi4neid8J0EnLi4nWid8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoKKyAgICA7CisKK2ZyYWdtZW50CitJTlQgOgknMCcuLic5JysKKwk7CisKK2ZyYWdtZW50CitXUwk6CSgnICd8J1x0J3wnXG4nfCdccicpKworCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9Bc3NpZ25Ub2tlblR5cGVzV2Fsa2VyLmcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQXNzaWduVG9rZW5UeXBlc1dhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzVjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQXNzaWduVG9rZW5UeXBlc1dhbGtlci5nCkBAIC0wLDAgKzEsNDAyIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgR3JhbW1hciBjb252ZXJzaW9uIHRvIEFOVExSIHYzOgorIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisJZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogW1dhcm5pbmc6IFRKUCBzYXlzIHRoYXQgdGhpcyBpcyBwcm9iYWJseSBvdXQgb2YgZGF0ZSBhcyBvZiAxMS8xOS8yMDA1LAorICogICBidXQgc2luY2UgaXQncyBwcm9iYWJseSBzdGlsbCB1c2VmdWwsIEknbGwgbGVhdmUgaW4uICBEb24ndCBoYXZlIGVuZXJneQorICogICB0byB1cGRhdGUgYXQgdGhlIG1vbWVudC5dCisgKgorICogIENvbXB1dGUgdGhlIHRva2VuIHR5cGVzIGZvciBhbGwgbGl0ZXJhbHMgYW5kIHJ1bGVzIGV0Yy4uICBUaGVyZSBhcmUKKyAqICBhIGZldyBkaWZmZXJlbnQgY2FzZXMgdG8gY29uc2lkZXIgZm9yIGdyYW1tYXIgdHlwZXMgYW5kIGEgZmV3IHNpdHVhdGlvbnMKKyAqICB3aXRoaW4uCisgKgorICogIENBU0UgMSA6IHB1cmUgcGFyc2VyIGdyYW1tYXIKKyAqCWEpIEFueSByZWZlcmVuY2UgdG8gYSB0b2tlbiBnZXRzIGEgdG9rZW4gdHlwZS4KKyAqICBiKSBUaGUgdG9rZW5zIHNlY3Rpb24gbWF5IGFsaWFzIGEgdG9rZW4gbmFtZSB0byBhIHN0cmluZyBvciBjaGFyCisgKgorICogIENBU0UgMiA6IHB1cmUgbGV4ZXIgZ3JhbW1hcgorICogIGEpIEltcG9ydCB0b2tlbiB2b2NhYnVsYXJ5IGlmIGF2YWlsYWJsZS4gU2V0IHRva2VuIHR5cGVzIGZvciBhbnkgbmV3IHRva2VucworICogICAgIHRvIHZhbHVlcyBhYm92ZSBsYXN0IGltcG9ydGVkIHRva2VuIHR5cGUKKyAqICBiKSB0b2tlbiBydWxlIGRlZmluaXRpb25zIGdldCB0b2tlbiB0eXBlcyBpZiBub3QgYWxyZWFkeSBkZWZpbmVkCisgKiAgYykgbGl0ZXJhbHMgZG8gTk9UIGdldCB0b2tlbiB0eXBlcworICoKKyAqICBDQVNFIDMgOiBtZXJnZWQgcGFyc2VyIC8gbGV4ZXIgZ3JhbW1hcgorICoJYSkgQW55IGNoYXIgb3Igc3RyaW5nIGxpdGVyYWwgZ2V0cyBhIHRva2VuIHR5cGUgaW4gYSBwYXJzZXIgcnVsZQorICogIGIpIEFueSByZWZlcmVuY2UgdG8gYSB0b2tlbiBnZXRzIGEgdG9rZW4gdHlwZSBpZiBub3QgcmVmZXJlbmNpbmcKKyAqICAgICBhIGZyYWdtZW50IGxleGVyIHJ1bGUKKyAqICBjKSBUaGUgdG9rZW5zIHNlY3Rpb24gbWF5IGFsaWFzIGEgdG9rZW4gbmFtZSB0byBhIHN0cmluZyBvciBjaGFyCisgKiAgICAgd2hpY2ggbXVzdCBhZGQgYSBydWxlIHRvIHRoZSBsZXhlcgorICogIGQpIHRva2VuIHJ1bGUgZGVmaW5pdGlvbnMgZ2V0IHRva2VuIHR5cGVzIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQKKyAqICBlKSB0b2tlbiBydWxlIGRlZmluaXRpb25zIG1heSBhbHNvIGFsaWFzIGEgdG9rZW4gbmFtZSB0byBhIGxpdGVyYWwuCisgKiAgICAgRS5nLiwgUnVsZSAnRk9SIDogImZvciI7JyB3aWxsIGFsaWFzIEZPUiB0byAiZm9yIiBpbiB0aGUgc2Vuc2UgdGhhdAorICogICAgIHJlZmVyZW5jZXMgdG8gZWl0aGVyIGluIHRoZSBwYXJzZXIgZ3JhbW1hciB3aWxsIHlpZWxkIHRoZSB0b2tlbiB0eXBlCisgKgorICogIFdoYXQgdGhpcyBwYXNzIGRvZXM6CisgKgorICogIDAuIENvbGxlY3RzIGJhc2ljIGluZm8gYWJvdXQgdGhlIGdyYW1tYXIgbGlrZSBncmFtbWFyIG5hbWUgYW5kIHR5cGU7CisgKiAgICAgT2gsIEkgaGF2ZSBnbyBnZXQgdGhlIG9wdGlvbnMgaW4gY2FzZSB0aGV5IGFmZmVjdCB0aGUgdG9rZW4gdHlwZXMuCisgKiAgICAgRS5nLiwgdG9rZW5Wb2NhYiBvcHRpb24uCisgKiAgICAgSW1wb3J0cyBhbnkgdG9rZW4gdm9jYWIgbmFtZS90eXBlIHBhaXJzIGludG8gYSBsb2NhbCBoYXNodGFibGUuCisgKiAgMS4gRmluZHMgYSBsaXN0IG9mIGFsbCBsaXRlcmFscyBhbmQgdG9rZW4gbmFtZXMuCisgKiAgMi4gRmluZHMgYSBsaXN0IG9mIGFsbCB0b2tlbiBuYW1lIHJ1bGUgZGVmaW5pdGlvbnM7CisgKiAgICAgbm8gdG9rZW4gcnVsZXMgaW1wbGllcyBwdXJlIHBhcnNlci4KKyAqICAzLiBGaW5kcyBhIGxpc3Qgb2YgYWxsIHNpbXBsZSB0b2tlbiBydWxlIGRlZnMgb2YgZm9ybSAiPE5BTUU+IDogPGxpdGVyYWw+OyIKKyAqICAgICBhbmQgYWxpYXNlcyB0aGVtLgorICogIDQuIFdhbGtzIHRva2VuIG5hbWVzIHRhYmxlIGFuZCBhc3NpZ24gdHlwZXMgdG8gYW55IHVuYXNzaWduZWQKKyAqICA1LiBXYWxrcyBhbGlhc2VzIGFuZCBhc3NpZ24gdHlwZXMgdG8gcmVmZXJlbmNlZCBsaXRlcmFscworICogIDYuIFdhbGtzIGxpdGVyYWxzLCBhc3NpZ25pbmcgdHlwZXMgaWYgdW50eXBlZAorICogIDQuIEluZm9ybXMgdGhlIEdyYW1tYXIgb2JqZWN0IG9mIHRoZSB0eXBlIGRlZmluaXRpb25zIHN1Y2ggYXM6CisgKiAgICAgZy5kZWZpbmVUb2tlbig8Y2hhcmxpdGVyYWw+LCB0dHlwZSk7CisgKiAgICAgZy5kZWZpbmVUb2tlbig8c3RyaW5nbGl0ZXJhbD4sIHR0eXBlKTsKKyAqICAgICBnLmRlZmluZVRva2VuKDx0b2tlbklEPiwgdHR5cGUpOworICogICAgIHdoZXJlIHNvbWUgb2YgdGhlIHR0eXBlIHZhbHVlcyB3aWxsIGJlIHRoZSBzYW1lIGZvciBhbGlhc2VzIHRva2Vucy4KKyAqLwordHJlZSBncmFtbWFyIEFzc2lnblRva2VuVHlwZXNXYWxrZXI7CisKK29wdGlvbnMKK3sKKwl0b2tlblZvY2FiID0gQU5UTFI7CisJQVNUTGFiZWxUeXBlID0gR3JhbW1hckFTVDsKK30KKworQGhlYWRlciB7CitwYWNrYWdlIG9yZy5hbnRsci5ncmFtbWFyLnYzOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuKjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0OworfQorCitAbWVtYmVycyB7Citwcm90ZWN0ZWQgR3JhbW1hciBncmFtbWFyOworcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50UnVsZU5hbWU7CisKK3Byb3RlY3RlZCBzdGF0aWMgR3JhbW1hckFTVCBzdHJpbmdBbGlhczsKK3Byb3RlY3RlZCBzdGF0aWMgR3JhbW1hckFTVCBjaGFyQWxpYXM7Citwcm90ZWN0ZWQgc3RhdGljIEdyYW1tYXJBU1Qgc3RyaW5nQWxpYXMyOworcHJvdGVjdGVkIHN0YXRpYyBHcmFtbWFyQVNUIGNoYXJBbGlhczI7CisKK0BPdmVycmlkZQorcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpCit7CisgICAgVG9rZW4gdG9rZW4gPSBudWxsOworICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbikgeworICAgICAgICB0b2tlbiA9ICgoTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKWV4KS50b2tlbjsKKyAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgTm9WaWFibGVBbHRFeGNlcHRpb24pIHsKKyAgICAgICAgdG9rZW4gPSAoKE5vVmlhYmxlQWx0RXhjZXB0aW9uKWV4KS50b2tlbjsKKyAgICB9CisKKyAgICBFcnJvck1hbmFnZXIuc3ludGF4RXJyb3IoCisgICAgICAgIEVycm9yTWFuYWdlci5NU0dfU1lOVEFYX0VSUk9SLAorICAgICAgICBncmFtbWFyLAorICAgICAgICB0b2tlbiwKKyAgICAgICAgImFzc2lnbi50eXBlczogIiArIGV4LnRvU3RyaW5nKCksCisgICAgICAgIGV4KTsKK30KKworcHJvdGVjdGVkIHZvaWQgaW5pdEFTVFBhdHRlcm5zKCkKK3sKKyAgICBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IEFOVExSUGFyc2VyLmdyYW1tYXJfQWRhcHRvcihudWxsKTsKKworICAgIC8qCisgICAgICogc3RyaW5nQWxpYXMgPSBeKEJMT0NLW10gXihBTFRbXSBTVFJJTkdfTElURVJBTFtdIEVPQVtdKSBFT0JbXSkKKyAgICAgKi8KKyAgICBzdHJpbmdBbGlhcyA9IChHcmFtbWFyQVNUKWFkYXB0b3IuY3JlYXRlKCBCTE9DSywgIkJMT0NLIiApOworICAgIHsKKyAgICAgICAgR3JhbW1hckFTVCBhbHQgPSAoR3JhbW1hckFTVClhZGFwdG9yLmNyZWF0ZSggQUxULCAiQUxUIiApOworICAgICAgICBhZGFwdG9yLmFkZENoaWxkKCBhbHQsIGFkYXB0b3IuY3JlYXRlKCBTVFJJTkdfTElURVJBTCwgIlNUUklOR19MSVRFUkFMIiApICk7CisgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGFsdCwgYWRhcHRvci5jcmVhdGUoIEVPQSwgIkVPQSIgKSApOworICAgICAgICBhZGFwdG9yLmFkZENoaWxkKCBzdHJpbmdBbGlhcywgYWx0ICk7CisgICAgfQorICAgIGFkYXB0b3IuYWRkQ2hpbGQoIHN0cmluZ0FsaWFzLCBhZGFwdG9yLmNyZWF0ZSggRU9CLCAiRU9CIiApICk7CisKKyAgICAvKgorICAgICAqIGNoYXJBbGlhcyA9IF4oQkxPQ0tbXSBeKEFMVFtdIENIQVJfTElURVJBTFtdIEVPQVtdKSBFT0JbXSkKKyAgICAgKi8KKyAgICBjaGFyQWxpYXMgPSAoR3JhbW1hckFTVClhZGFwdG9yLmNyZWF0ZSggQkxPQ0ssICJCTE9DSyIgKTsKKyAgICB7CisgICAgICAgIEdyYW1tYXJBU1QgYWx0ID0gKEdyYW1tYXJBU1QpYWRhcHRvci5jcmVhdGUoIEFMVCwgIkFMVCIgKTsKKyAgICAgICAgYWRhcHRvci5hZGRDaGlsZCggYWx0LCBhZGFwdG9yLmNyZWF0ZSggQ0hBUl9MSVRFUkFMLCAiQ0hBUl9MSVRFUkFMIiApICk7CisgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGFsdCwgYWRhcHRvci5jcmVhdGUoIEVPQSwgIkVPQSIgKSApOworICAgICAgICBhZGFwdG9yLmFkZENoaWxkKCBjaGFyQWxpYXMsIGFsdCApOworICAgIH0KKyAgICBhZGFwdG9yLmFkZENoaWxkKCBjaGFyQWxpYXMsIGFkYXB0b3IuY3JlYXRlKCBFT0IsICJFT0IiICkgKTsKKworICAgIC8qCisgICAgICogc3RyaW5nQWxpYXMyID0gXihCTE9DS1tdIF4oQUxUW10gU1RSSU5HX0xJVEVSQUxbXSBBQ1RJT05bXSBFT0FbXSkgRU9CW10pCisgICAgICovCisgICAgc3RyaW5nQWxpYXMyID0gKEdyYW1tYXJBU1QpYWRhcHRvci5jcmVhdGUoIEJMT0NLLCAiQkxPQ0siICk7CisgICAgeworICAgICAgICBHcmFtbWFyQVNUIGFsdCA9IChHcmFtbWFyQVNUKWFkYXB0b3IuY3JlYXRlKCBBTFQsICJBTFQiICk7CisgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGFsdCwgYWRhcHRvci5jcmVhdGUoIFNUUklOR19MSVRFUkFMLCAiU1RSSU5HX0xJVEVSQUwiICkgKTsKKyAgICAgICAgYWRhcHRvci5hZGRDaGlsZCggYWx0LCBhZGFwdG9yLmNyZWF0ZSggQUNUSU9OLCAiQUNUSU9OIiApICk7CisgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGFsdCwgYWRhcHRvci5jcmVhdGUoIEVPQSwgIkVPQSIgKSApOworICAgICAgICBhZGFwdG9yLmFkZENoaWxkKCBzdHJpbmdBbGlhczIsIGFsdCApOworICAgIH0KKyAgICBhZGFwdG9yLmFkZENoaWxkKCBzdHJpbmdBbGlhczIsIGFkYXB0b3IuY3JlYXRlKCBFT0IsICJFT0IiICkgKTsKKworICAgIC8qCisgICAgICogY2hhckFsaWFzID0gXihCTE9DS1tdIF4oQUxUW10gQ0hBUl9MSVRFUkFMW10gQUNUSU9OW10gRU9BW10pIEVPQltdKQorICAgICAqLworICAgIGNoYXJBbGlhczIgPSAoR3JhbW1hckFTVClhZGFwdG9yLmNyZWF0ZSggQkxPQ0ssICJCTE9DSyIgKTsKKyAgICB7CisgICAgICAgIEdyYW1tYXJBU1QgYWx0ID0gKEdyYW1tYXJBU1QpYWRhcHRvci5jcmVhdGUoIEFMVCwgIkFMVCIgKTsKKyAgICAgICAgYWRhcHRvci5hZGRDaGlsZCggYWx0LCBhZGFwdG9yLmNyZWF0ZSggQ0hBUl9MSVRFUkFMLCAiQ0hBUl9MSVRFUkFMIiApICk7CisgICAgICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGFsdCwgYWRhcHRvci5jcmVhdGUoIEFDVElPTiwgIkFDVElPTiIgKSApOworICAgICAgICBhZGFwdG9yLmFkZENoaWxkKCBhbHQsIGFkYXB0b3IuY3JlYXRlKCBFT0EsICJFT0EiICkgKTsKKyAgICAgICAgYWRhcHRvci5hZGRDaGlsZCggY2hhckFsaWFzMiwgYWx0ICk7CisgICAgfQorICAgIGFkYXB0b3IuYWRkQ2hpbGQoIGNoYXJBbGlhczIsIGFkYXB0b3IuY3JlYXRlKCBFT0IsICJFT0IiICkgKTsKK30KKworLy8gQmVoYXZpb3IgbW92ZWQgdG8gQXNzaWduVG9rZW5UeXBlc0JlaGF2aW9yCitwcm90ZWN0ZWQgdm9pZCB0cmFja1N0cmluZyhHcmFtbWFyQVNUIHQpIHt9Citwcm90ZWN0ZWQgdm9pZCB0cmFja1Rva2VuKCBHcmFtbWFyQVNUIHQgKSB7fQorcHJvdGVjdGVkIHZvaWQgdHJhY2tUb2tlblJ1bGUoIEdyYW1tYXJBU1QgdCwgR3JhbW1hckFTVCBtb2RpZmllciwgR3JhbW1hckFTVCBibG9jayApIHt9Citwcm90ZWN0ZWQgdm9pZCBhbGlhcyggR3JhbW1hckFTVCB0LCBHcmFtbWFyQVNUIHMgKSB7fQorcHVibGljIHZvaWQgZGVmaW5lVG9rZW5zKCBHcmFtbWFyIHJvb3QgKSB7fQorcHJvdGVjdGVkIHZvaWQgZGVmaW5lU3RyaW5nTGl0ZXJhbHNGcm9tRGVsZWdhdGVzKCkge30KK3Byb3RlY3RlZCB2b2lkIGFzc2lnblN0cmluZ1R5cGVzKCBHcmFtbWFyIHJvb3QgKSB7fQorcHJvdGVjdGVkIHZvaWQgYWxpYXNUb2tlbklEc0FuZExpdGVyYWxzKCBHcmFtbWFyIHJvb3QgKSB7fQorcHJvdGVjdGVkIHZvaWQgYXNzaWduVG9rZW5JRFR5cGVzKCBHcmFtbWFyIHJvb3QgKSB7fQorcHJvdGVjdGVkIHZvaWQgZGVmaW5lVG9rZW5OYW1lc0FuZExpdGVyYWxzSW5HcmFtbWFyKCBHcmFtbWFyIHJvb3QgKSB7fQorcHJvdGVjdGVkIHZvaWQgaW5pdCggR3JhbW1hciByb290ICkge30KK30KKworcHVibGljCitncmFtbWFyX1tHcmFtbWFyIGddCitAaW5pdAoreworCWlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDAgKQorCQlpbml0KCRnKTsKK30KKwk6CSgJXiggTEVYRVJfR1JBTU1BUiAJICBncmFtbWFyU3BlYyApCisJCXwJXiggUEFSU0VSX0dSQU1NQVIgICBncmFtbWFyU3BlYyApCisJCXwJXiggVFJFRV9HUkFNTUFSICAgICBncmFtbWFyU3BlYyApCisJCXwJXiggQ09NQklORURfR1JBTU1BUiBncmFtbWFyU3BlYyApCisJCSkKKwk7CisKK2dyYW1tYXJTcGVjCisJOglpZD1JRAorCQkoY210PURPQ19DT01NRU5UKT8KKwkJKG9wdGlvbnNTcGVjKT8KKwkJKGRlbGVnYXRlR3JhbW1hcnMpPworCQkodG9rZW5zU3BlYyk/CisJCShhdHRyU2NvcGUpKgorCQkoIF4oQU1QRVJTQU5EIC4qKSApKiAvLyBza2lwIGFjdGlvbnMKKwkJcnVsZXMKKwk7CisKK2F0dHJTY29wZQorCToJXiggJ3Njb3BlJyBJRCAoIF4oQU1QRVJTQU5EIC4qKSApKiBBQ1RJT04gKQorCTsKKworb3B0aW9uc1NwZWMgcmV0dXJucyBbTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCldCisJOgleKCBPUFRJT05TIChvcHRpb25bJG9wdHNdKSsgKQorCTsKKworb3B0aW9uW01hcDxPYmplY3QsIE9iamVjdD4gb3B0c10KKwk6CV4oIEFTU0lHTiBJRCBvcHRpb25WYWx1ZSApCisJCXsKKwkJCVN0cmluZyBrZXkgPSAkSUQudGV4dDsKKwkJCSRvcHRzLnB1dChrZXksICRvcHRpb25WYWx1ZS52YWx1ZSk7CisJCQkvLyBjaGVjayBmb3IgZ3JhbW1hci1sZXZlbCBvcHRpb24gdG8gaW1wb3J0IHZvY2FidWxhcnkKKwkJCWlmICggY3VycmVudFJ1bGVOYW1lPT1udWxsICYmIGtleS5lcXVhbHMoInRva2VuVm9jYWIiKSApCisJCQl7CisJCQkJZ3JhbW1hci5pbXBvcnRUb2tlblZvY2FidWxhcnkoJElELChTdHJpbmcpJG9wdGlvblZhbHVlLnZhbHVlKTsKKwkJCX0KKwkJfQorCTsKKworb3B0aW9uVmFsdWUgcmV0dXJucyBbT2JqZWN0IHZhbHVlPW51bGxdCitAaW5pdAoreworCWlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDAgKQorCQkkdmFsdWUgPSAkc3RhcnQuZ2V0VGV4dCgpOworfQorCToJSUQKKwl8CVNUUklOR19MSVRFUkFMCisJfAlDSEFSX0xJVEVSQUwKKwl8CUlOVAorCQl7JHZhbHVlID0gSW50ZWdlci5wYXJzZUludCgkSU5ULnRleHQpO30KKy8vICB8ICAgY3M9Y2hhclNldCAgICAgICB7JHZhbHVlID0gJGNzO30gLy8gcmV0dXJuIHNldCBBU1QgaW4gdGhpcyBjYXNlCisJOworCitjaGFyU2V0CisJOgleKCBDSEFSU0VUIGNoYXJTZXRFbGVtZW50ICkKKwk7CisKK2NoYXJTZXRFbGVtZW50CisJOglDSEFSX0xJVEVSQUwKKwl8CV4oIE9SIENIQVJfTElURVJBTCBDSEFSX0xJVEVSQUwgKQorCXwJXiggUkFOR0UgQ0hBUl9MSVRFUkFMIENIQVJfTElURVJBTCApCisJOworCitkZWxlZ2F0ZUdyYW1tYXJzCisJOgleKAknaW1wb3J0JworCQkJKAleKEFTU0lHTiBJRCBJRCkKKwkJCXwJSUQKKwkJCSkrCisJCSkKKwk7CisKK3Rva2Vuc1NwZWMKKwk6CV4oVE9LRU5TIHRva2VuU3BlYyopCisJOworCit0b2tlblNwZWMKKwk6CXQ9VE9LRU5fUkVGICAgICAgICAgICAge3RyYWNrVG9rZW4oJHQpO30KKwl8CV4oCUFTU0lHTgorCQkJdDI9VE9LRU5fUkVGICAgICAgIHt0cmFja1Rva2VuKCR0Mik7fQorCQkJKCBzPVNUUklOR19MSVRFUkFMIHt0cmFja1N0cmluZygkcyk7IGFsaWFzKCR0Miwkcyk7fQorCQkJfCBjPUNIQVJfTElURVJBTCAgIHt0cmFja1N0cmluZygkYyk7IGFsaWFzKCR0MiwkYyk7fQorCQkJKQorCQkpCisJOworCitydWxlcworCToJcnVsZSsKKwk7CisKK3J1bGUKKwk6CV4oUlVMRSBydWxlQm9keSkKKwl8CV4oUFJFQ19SVUxFIHJ1bGVCb2R5KQorCTsKKworcnVsZUJvZHkKKwk6CWlkPUlEIHtjdXJyZW50UnVsZU5hbWU9JGlkLnRleHQ7fQorCQkobT1tb2RpZmllcik/CisJCV4oQVJHIChBUkdfQUNUSU9OKT8pCisJCV4oUkVUIChBUkdfQUNUSU9OKT8pCisJCSh0aHJvd3NTcGVjKT8KKwkJKG9wdGlvbnNTcGVjKT8KKwkJKHJ1bGVTY29wZVNwZWMpPworCQkoIF4oQU1QRVJTQU5EIC4qKSApKgorCQliPWJsb2NrCisJCShleGNlcHRpb25Hcm91cCk/CisJCUVPUgorCQl7dHJhY2tUb2tlblJ1bGUoJGlkLCRtLnN0YXJ0LCRiLnN0YXJ0KTt9CisJOworCittb2RpZmllcgorCToJJ3Byb3RlY3RlZCcKKwl8CSdwdWJsaWMnCisJfAkncHJpdmF0ZScKKwl8CSdmcmFnbWVudCcKKwk7CisKK3Rocm93c1NwZWMKKwk6CV4oJ3Rocm93cycgSUQrKQorCTsKKworcnVsZVNjb3BlU3BlYworCToJXiggJ3Njb3BlJyAoIF4oQU1QRVJTQU5EIC4qKSApKiAoQUNUSU9OKT8gKCBJRCApKiApCisJOworCitibG9jaworCToJXigJQkxPQ0sKKwkJCShvcHRpb25zU3BlYyk/CisJCQkoIGFsdGVybmF0aXZlIHJld3JpdGUgKSsKKwkJCUVPQgorCQkpCisJOworCithbHRlcm5hdGl2ZQorCToJXiggQUxUIChlbGVtZW50KSsgRU9BICkKKwk7CisKK2V4Y2VwdGlvbkdyb3VwCisJOgkoIGV4Y2VwdGlvbkhhbmRsZXIgKSsgKGZpbmFsbHlDbGF1c2UpPworCXwJZmluYWxseUNsYXVzZQorCTsKKworZXhjZXB0aW9uSGFuZGxlcgorCToJXignY2F0Y2gnIEFSR19BQ1RJT04gQUNUSU9OKQorCTsKKworZmluYWxseUNsYXVzZQorCToJXignZmluYWxseScgQUNUSU9OKQorCTsKKworcmV3cml0ZQorCToJXihSRVdSSVRFUyAoIF4oUkVXUklURSAuKikgKSogKQorCXwKKwk7CisKK2VsZW1lbnQKKwk6CV4oUk9PVCBlbGVtZW50KQorCXwJXihCQU5HIGVsZW1lbnQpCisJfAlhdG9tCisJfAleKE5PVCBlbGVtZW50KQorCXwJXihSQU5HRSBhdG9tIGF0b20pCisJfAleKENIQVJfUkFOR0UgYXRvbSBhdG9tKQorCXwJXihBU1NJR04gSUQgZWxlbWVudCkKKwl8CV4oUExVU19BU1NJR04gSUQgZWxlbWVudCkKKwl8CWVibmYKKwl8CXRyZWVfCisJfAleKCBTWU5QUkVEIGJsb2NrICkKKwl8CUZPUkNFRF9BQ1RJT04KKwl8CUFDVElPTgorCXwJU0VNUFJFRAorCXwJU1lOX1NFTVBSRUQKKwl8CV4oQkFDS1RSQUNLX1NFTVBSRUQgLiopCisJfAlHQVRFRF9TRU1QUkVECisJfAlFUFNJTE9OCisJOworCitlYm5mCisJOglibG9jaworCXwJXiggT1BUSU9OQUwgYmxvY2sgKQorCXwJXiggQ0xPU1VSRSBibG9jayApCisJfAleKCBQT1NJVElWRV9DTE9TVVJFIGJsb2NrICkKKwk7CisKK3RyZWVfCisJOgleKFRSRUVfQkVHSU4gZWxlbWVudCspCisJOworCithdG9tCisJOgleKCBSVUxFX1JFRiAoQVJHX0FDVElPTik/ICkKKwl8CV4oIHQ9VE9LRU5fUkVGIChBUkdfQUNUSU9OICk/ICkge3RyYWNrVG9rZW4oJHQpO30KKwl8CWM9Q0hBUl9MSVRFUkFMICAge3RyYWNrU3RyaW5nKCRjKTt9CisJfAlzPVNUUklOR19MSVRFUkFMIHt0cmFja1N0cmluZygkcyk7fQorCXwJV0lMRENBUkQKKwl8CV4oRE9UIElEIGF0b20pIC8vIHNjb3BlIG92ZXJyaWRlIG9uIHJ1bGUKKwk7CisKK2FzdF9zdWZmaXgKKwk6CVJPT1QKKwl8CUJBTkcKKwk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQ29kZUdlblRyZWVXYWxrZXIuZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9Db2RlR2VuVHJlZVdhbGtlci5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTU4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvQ29kZUdlblRyZWVXYWxrZXIuZwpAQCAtMCwwICsxLDE2MDggQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgR3JhbW1hciBjb252ZXJzaW9uIHRvIEFOVExSIHYzOgorIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisJZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogV2FsayBhIGdyYW1tYXIgYW5kIGdlbmVyYXRlIGNvZGUgYnkgZ3JhZHVhbGx5IGJ1aWxkaW5nIHVwCisgKiAgYSBiaWdnZXIgYW5kIGJpZ2dlciBTVC4KKyAqCisgKiAgVGVyZW5jZSBQYXJyCisgKiAgVW5pdmVyc2l0eSBvZiBTYW4gRnJhbmNpc2NvCisgKiAgSnVuZSAxNSwgMjAwNAorICovCit0cmVlIGdyYW1tYXIgQ29kZUdlblRyZWVXYWxrZXI7CisKK29wdGlvbnMgeworCXRva2VuVm9jYWIgPSBBTlRMUjsKKwlBU1RMYWJlbFR5cGU9R3JhbW1hckFTVDsKK30KKworQGhlYWRlciB7CitwYWNrYWdlIG9yZy5hbnRsci5ncmFtbWFyLnYzOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuKjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldDsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5ERkE7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVEdyb3VwOworfQorCitAbWVtYmVycyB7Citwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSVUxFX0JMT0NLX05FU1RJTkdfTEVWRUwgPSAwOworcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgT1VURVJfUkVXUklURV9ORVNUSU5HX0xFVkVMID0gMDsKKworcHJpdmF0ZSBTdHJpbmcgY3VycmVudFJ1bGVOYW1lID0gbnVsbDsKK3Byb3RlY3RlZCBpbnQgYmxvY2tOZXN0aW5nTGV2ZWwgPSAwOworcHJvdGVjdGVkIGludCByZXdyaXRlQmxvY2tOZXN0aW5nTGV2ZWwgPSAwOworcHJpdmF0ZSBpbnQgb3V0ZXJBbHROdW0gPSAwOworcHJvdGVjdGVkIFNUIGN1cnJlbnRCbG9ja1NUID0gbnVsbDsKK3Byb3RlY3RlZCBib29sZWFuIGN1cnJlbnRBbHRIYXNBU1RSZXdyaXRlID0gZmFsc2U7Citwcm90ZWN0ZWQgaW50IHJld3JpdGVUcmVlTmVzdGluZ0xldmVsID0gMDsKK3Byb3RlY3RlZCBIYXNoU2V0PE9iamVjdD4gcmV3cml0ZVJ1bGVSZWZzID0gbnVsbDsKKworcHVibGljIFN0cmluZyBnZXRDdXJyZW50UnVsZU5hbWUoKSB7CisgICAgcmV0dXJuIGN1cnJlbnRSdWxlTmFtZTsKK30KKworcHVibGljIHZvaWQgc2V0Q3VycmVudFJ1bGVOYW1lKFN0cmluZyB2YWx1ZSkgeworICAgIGN1cnJlbnRSdWxlTmFtZSA9IHZhbHVlOworfQorCitwdWJsaWMgaW50IGdldE91dGVyQWx0TnVtKCkgeworICAgIHJldHVybiBvdXRlckFsdE51bTsKK30KKworcHVibGljIHZvaWQgc2V0T3V0ZXJBbHROdW0oaW50IHZhbHVlKSB7CisgICAgb3V0ZXJBbHROdW0gPSB2YWx1ZTsKK30KKworQE92ZXJyaWRlCitwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworICAgIFRva2VuIHRva2VuID0gbnVsbDsKKyAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pIHsKKyAgICAgICAgdG9rZW4gPSAoKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbilleCkudG9rZW47CisgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIE5vVmlhYmxlQWx0RXhjZXB0aW9uKSB7CisgICAgICAgIHRva2VuID0gKChOb1ZpYWJsZUFsdEV4Y2VwdGlvbilleCkudG9rZW47CisgICAgfQorCisgICAgRXJyb3JNYW5hZ2VyLnN5bnRheEVycm9yKAorICAgICAgICBFcnJvck1hbmFnZXIuTVNHX1NZTlRBWF9FUlJPUiwKKyAgICAgICAgZ3JhbW1hciwKKyAgICAgICAgdG9rZW4sCisgICAgICAgICJjb2RlZ2VuOiAiICsgZXgudG9TdHJpbmcoKSwKKyAgICAgICAgZXggKTsKK30KKworcHVibGljIGZpbmFsIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIHMpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvZGVnZW46IGVycm9yOiAiICsgcyk7Cit9CisKK3Byb3RlY3RlZCBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvcjsKK3Byb3RlY3RlZCBHcmFtbWFyIGdyYW1tYXI7Citwcm90ZWN0ZWQgU1RHcm91cCB0ZW1wbGF0ZXM7CisKKy8qKiBUaGUgb3ZlcmFsbCBsZXhlci9wYXJzZXIgdGVtcGxhdGU7IHNpbXVsYXRlIGR5bmFtaWNhbGx5IHNjb3BlZAorICogIGF0dHJpYnV0ZXMgYnkgbWFraW5nIHRoaXMgYW4gaW5zdGFuY2UgdmFyIG9mIHRoZSB3YWxrZXIuCisgKi8KK3Byb3RlY3RlZCBTVCByZWNvZ25pemVyU1Q7CisKK3Byb3RlY3RlZCBTVCBvdXRwdXRGaWxlU1Q7Citwcm90ZWN0ZWQgU1QgaGVhZGVyRmlsZVNUOworCitwcm90ZWN0ZWQgU3RyaW5nIG91dHB1dE9wdGlvbiA9ICIiOworCitwcm90ZWN0ZWQgZmluYWwgU1QgZ2V0V2lsZGNhcmRTVChHcmFtbWFyQVNUIGVsZW1lbnRBU1QsIEdyYW1tYXJBU1QgYXN0X3N1ZmZpeCwgU3RyaW5nIGxhYmVsKSB7CisgICAgU3RyaW5nIG5hbWUgPSAid2lsZGNhcmQiOworICAgIGlmIChncmFtbWFyLnR5cGUgPT0gR3JhbW1hci5MRVhFUikgeworICAgICAgICBuYW1lID0gIndpbGRjYXJkQ2hhciI7CisgICAgfQorICAgIHJldHVybiBnZXRUb2tlbkVsZW1lbnRTVChuYW1lLCBuYW1lLCBlbGVtZW50QVNULCBhc3Rfc3VmZml4LCBsYWJlbCk7Cit9CisKK3Byb3RlY3RlZCBmaW5hbCBTVCBnZXRSdWxlRWxlbWVudFNUKCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBydWxlVGFyZ2V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW1tYXJBU1QgZWxlbWVudEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW1tYXJBU1QgYXN0X3N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCApIHsKKwlSdWxlIHIgPSBncmFtbWFyLmdldFJ1bGUoIGN1cnJlbnRSdWxlTmFtZSApOworCVN0cmluZyBzdWZmaXggPSBnZXRTVFN1ZmZpeChlbGVtZW50QVNULCBhc3Rfc3VmZml4LCBsYWJlbCk7CisJaWYgKCAhci5pc1N5blByZWQgKSB7CisJCW5hbWUgKz0gc3VmZml4OworCX0KKwkvLyBpZiB3ZSdyZSBidWlsZGluZyB0cmVlcyBhbmQgdGhlcmUgaXMgbm8gbGFiZWwsIGdlbiBhIGxhYmVsCisJLy8gdW5sZXNzIHdlJ3JlIGluIGEgc3lucHJlZCBydWxlLgorCWlmICggKCBncmFtbWFyLmJ1aWxkQVNUKCkgfHwgc3VmZml4Lmxlbmd0aCgpID4gMCApICYmIGxhYmVsID09IG51bGwgJiYKKwkJICggciA9PSBudWxsIHx8ICFyLmlzU3luUHJlZCApICkgeworCQkvLyB3ZSB3aWxsIG5lZWQgYSBsYWJlbCB0byBkbyB0aGUgQVNUIG9yIHRyYWNraW5nLCBtYWtlIG9uZQorCQlsYWJlbCA9IGdlbmVyYXRvci5jcmVhdGVVbmlxdWVMYWJlbCggcnVsZVRhcmdldE5hbWUgKTsKKwkJQ29tbW9uVG9rZW4gbGFiZWxUb2sgPSBuZXcgQ29tbW9uVG9rZW4oIEFOVExSUGFyc2VyLklELCBsYWJlbCApOworCQlncmFtbWFyLmRlZmluZVJ1bGVSZWZMYWJlbCggY3VycmVudFJ1bGVOYW1lLCBsYWJlbFRvaywgZWxlbWVudEFTVCApOworCX0KKworCVNUIGVsZW1lbnRTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCBuYW1lICk7CisJaWYgKCBsYWJlbCAhPSBudWxsICkgeworCQllbGVtZW50U1QuYWRkKCAibGFiZWwiLCBsYWJlbCApOworCX0KKworCisJcmV0dXJuIGVsZW1lbnRTVDsKK30KKworcHJvdGVjdGVkIGZpbmFsIFNUIGdldFRva2VuRWxlbWVudFNUKCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbW1hckFTVCBlbGVtZW50QVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW1tYXJBU1QgYXN0X3N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwgKSB7CisgICAgYm9vbGVhbiB0cnlVbmNoZWNrZWQgPSBmYWxzZTsKKyAgICBpZiAobmFtZSA9PSAibWF0Y2hTZXQiICYmIGVsZW1lbnRBU1QuZW5jbG9zaW5nUnVsZU5hbWUgIT0gbnVsbCAmJiBlbGVtZW50QVNULmVuY2xvc2luZ1J1bGVOYW1lLmxlbmd0aCgpID4gMCAmJiBSdWxlLmdldFJ1bGVUeXBlKGVsZW1lbnRBU1QuZW5jbG9zaW5nUnVsZU5hbWUpID09IEdyYW1tYXIuTEVYRVIpCisgICAgeworICAgICAgICBpZiAoICggZWxlbWVudEFTVC5nZXRQYXJlbnQoKS5nZXRUeXBlKCkgPT0gQU5UTFJMZXhlci5BTFQgJiYgZWxlbWVudEFTVC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRUeXBlKCkgPT0gUlVMRSAmJiBlbGVtZW50QVNULmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldENoaWxkQ291bnQoKSA9PSAyICkKKyAgICAgICAgICAgIHx8ICggZWxlbWVudEFTVC5nZXRQYXJlbnQoKS5nZXRUeXBlKCkgPT0gQU5UTFJMZXhlci5OT1QgJiYgZWxlbWVudEFTVC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRUeXBlKCkgPT0gUlVMRSAmJiBlbGVtZW50QVNULmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldENoaWxkQ291bnQoKSA9PSAyICkgKSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgYWx0IGF0IHRoZSBzdGFydCBvZiB0aGUgcnVsZSBuZWVkcyB0byBiZSBjaGVja2VkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnlVbmNoZWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIHN1ZmZpeCA9IGdldFNUU3VmZml4KCBlbGVtZW50QVNULCBhc3Rfc3VmZml4LCBsYWJlbCApOworICAgIC8vIGlmIHdlJ3JlIGJ1aWxkaW5nIHRyZWVzIGFuZCB0aGVyZSBpcyBubyBsYWJlbCwgZ2VuIGEgbGFiZWwKKyAgICAvLyB1bmxlc3Mgd2UncmUgaW4gYSBzeW5wcmVkIHJ1bGUuCisgICAgUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKCBjdXJyZW50UnVsZU5hbWUgKTsKKyAgICBpZiAoICggZ3JhbW1hci5idWlsZEFTVCgpIHx8IHN1ZmZpeC5sZW5ndGgoKSA+IDAgKSAmJiBsYWJlbCA9PSBudWxsICYmCisgICAgICAgICAoIHIgPT0gbnVsbCB8fCAhci5pc1N5blByZWQgKSApCisgICAgeworICAgICAgICBsYWJlbCA9IGdlbmVyYXRvci5jcmVhdGVVbmlxdWVMYWJlbCggZWxlbWVudE5hbWUgKTsKKyAgICAgICAgQ29tbW9uVG9rZW4gbGFiZWxUb2sgPSBuZXcgQ29tbW9uVG9rZW4oIEFOVExSUGFyc2VyLklELCBsYWJlbCApOworICAgICAgICBncmFtbWFyLmRlZmluZVRva2VuUmVmTGFiZWwoIGN1cnJlbnRSdWxlTmFtZSwgbGFiZWxUb2ssIGVsZW1lbnRBU1QgKTsKKyAgICB9CisKKyAgICBTVCBlbGVtZW50U1QgPSBudWxsOworICAgIGlmICggdHJ5VW5jaGVja2VkICYmIHRlbXBsYXRlcy5pc0RlZmluZWQoIG5hbWUgKyAiVW5jaGVja2VkIiArIHN1ZmZpeCApICkKKyAgICAgICAgZWxlbWVudFNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoIG5hbWUgKyAiVW5jaGVja2VkIiArIHN1ZmZpeCApOworICAgIGlmICggZWxlbWVudFNUID09IG51bGwgKQorICAgICAgICBlbGVtZW50U1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZiggbmFtZSArIHN1ZmZpeCApOworCisgICAgaWYgKCBsYWJlbCAhPSBudWxsICkKKyAgICB7CisgICAgICAgIGVsZW1lbnRTVC5hZGQoICJsYWJlbCIsIGxhYmVsICk7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50U1Q7Cit9CisKK3B1YmxpYyBmaW5hbCBib29sZWFuIGlzTGlzdExhYmVsKFN0cmluZyBsYWJlbCkgeworICAgIGJvb2xlYW4gaGFzTGlzdExhYmVsID0gZmFsc2U7CisgICAgaWYgKCBsYWJlbCAhPSBudWxsICkgeworICAgICAgICBSdWxlIHIgPSBncmFtbWFyLmdldFJ1bGUoIGN1cnJlbnRSdWxlTmFtZSApOworICAgICAgICAvL1N0cmluZyBzdE5hbWUgPSBudWxsOworICAgICAgICBpZiAoIHIgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEdyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBwYWlyID0gci5nZXRMYWJlbCggbGFiZWwgKTsKKyAgICAgICAgICAgIGlmICggcGFpciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICggcGFpci50eXBlID09IEdyYW1tYXIuVE9LRU5fTElTVF9MQUJFTCB8fAorICAgICAgICAgICAgICAgICAgcGFpci50eXBlID09IEdyYW1tYXIuUlVMRV9MSVNUX0xBQkVMIHx8CisgICAgICAgICAgICAgICAgICBwYWlyLnR5cGUgPT0gR3JhbW1hci5XSUxEQ0FSRF9UUkVFX0xJU1RfTEFCRUwgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzTGlzdExhYmVsID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzTGlzdExhYmVsOworfQorCisvKiogUmV0dXJuIGEgbm9uLWVtcHR5IHRlbXBsYXRlIG5hbWUgc3VmZml4IGlmIHRoZSB0b2tlbiBpcyB0byBiZQorICogIHRyYWNrZWQsIGFkZGVkIHRvIGEgdHJlZSwgb3IgYm90aC4KKyAqLworcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRTVFN1ZmZpeChHcmFtbWFyQVNUIGVsZW1lbnRBU1QsIEdyYW1tYXJBU1QgYXN0X3N1ZmZpeCwgU3RyaW5nIGxhYmVsKSB7CisgICAgaWYgKCBncmFtbWFyLnR5cGUgPT0gR3JhbW1hci5MRVhFUiApCisgICAgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIC8vIGhhbmRsZSBsaXN0IGxhYmVsIHN0dWZmOyBtYWtlIGVsZW1lbnQgdXNlICJUcmFjayIKKworICAgIFN0cmluZyBvcGVyYXRvclBhcnQgPSAiIjsKKyAgICBTdHJpbmcgcmV3cml0ZVBhcnQgPSAiIjsKKyAgICBTdHJpbmcgbGlzdExhYmVsUGFydCA9ICIiOworICAgIFJ1bGUgcnVsZURlc2NyID0gZ3JhbW1hci5nZXRSdWxlKCBjdXJyZW50UnVsZU5hbWUgKTsKKyAgICBpZiAoIGFzdF9zdWZmaXggIT0gbnVsbCAmJiAhcnVsZURlc2NyLmlzU3luUHJlZCApCisgICAgeworICAgICAgICBpZiAoIGFzdF9zdWZmaXguZ2V0VHlwZSgpID09IEFOVExSUGFyc2VyLlJPT1QgKQorICAgICAgICB7CisgICAgICAgICAgICBvcGVyYXRvclBhcnQgPSAiUnVsZVJvb3QiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBhc3Rfc3VmZml4LmdldFR5cGUoKSA9PSBBTlRMUlBhcnNlci5CQU5HICkKKyAgICAgICAgeworICAgICAgICAgICAgb3BlcmF0b3JQYXJ0ID0gIkJhbmciOworICAgICAgICB9CisgICAgfQorICAgIGlmICggY3VycmVudEFsdEhhc0FTVFJld3JpdGUgJiYgZWxlbWVudEFTVC5nZXRUeXBlKCkgIT0gV0lMRENBUkQgKQorICAgIHsKKyAgICAgICAgcmV3cml0ZVBhcnQgPSAiVHJhY2siOworICAgIH0KKyAgICBpZiAoIGlzTGlzdExhYmVsKCBsYWJlbCApICkKKyAgICB7CisgICAgICAgIGxpc3RMYWJlbFBhcnQgPSAiQW5kTGlzdExhYmVsIjsKKyAgICB9CisgICAgU3RyaW5nIFNUc3VmZml4ID0gb3BlcmF0b3JQYXJ0ICsgcmV3cml0ZVBhcnQgKyBsaXN0TGFiZWxQYXJ0OworICAgIC8vSlN5c3RlbS5Ab3V0LnByaW50bG4oInN1ZmZpeCA9ICIrU1RzdWZmaXgpOworCisgICAgcmV0dXJuIFNUc3VmZml4OworfQorCisvKiogQ29udmVydCByZXdyaXRlIEFTVCBsaXN0cyB0byB0YXJnZXQgbGFiZWxzIGxpc3QgKi8KK3Byb3RlY3RlZCBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0VG9rZW5UeXBlc0FzVGFyZ2V0TGFiZWxzKENvbGxlY3Rpb248R3JhbW1hckFTVD4gcmVmcykKK3sKKyAgICBpZiAoIHJlZnMgPT0gbnVsbCB8fCByZWZzLnNpemUoKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICBMaXN0PFN0cmluZz4gbGFiZWxzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCByZWZzLnNpemUoKSApOworICAgIGZvciAoIEdyYW1tYXJBU1QgdCA6IHJlZnMgKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGxhYmVsOworICAgICAgICBpZiAoIHQuZ2V0VHlwZSgpID09IEFOVExSUGFyc2VyLlJVTEVfUkVGIHx8IHQuZ2V0VHlwZSgpID09IEFOVExSUGFyc2VyLlRPS0VOX1JFRiB8fCB0LmdldFR5cGUoKSA9PSBBTlRMUlBhcnNlci5MQUJFTCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFiZWwgPSB0LmdldFRleHQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG11c3QgYmUgY2hhciBvciBTdHJpbmcgbGl0ZXJhbAorICAgICAgICAgICAgbGFiZWwgPSBnZW5lcmF0b3IuZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbChncmFtbWFyLmdldFRva2VuVHlwZSh0LmdldFRleHQoKSkpOworICAgICAgICB9CisgICAgICAgIGxhYmVscy5hZGQoIGxhYmVsICk7CisgICAgfQorICAgIHJldHVybiBsYWJlbHM7Cit9CisKK3B1YmxpYyBmaW5hbCB2b2lkIGluaXQoIEdyYW1tYXIgZyApIHsKKyAgICB0aGlzLmdyYW1tYXIgPSBnOworICAgIHRoaXMuZ2VuZXJhdG9yID0gZ3JhbW1hci5nZXRDb2RlR2VuZXJhdG9yKCk7CisgICAgdGhpcy50ZW1wbGF0ZXMgPSBnZW5lcmF0b3IuZ2V0VGVtcGxhdGVzKCk7Cit9Cit9CisKK3B1YmxpYworZ3JhbW1hcl9bR3JhbW1hciBnLAorCQlTVCByZWNvZ25pemVyU1QsCisJCVNUIG91dHB1dEZpbGVTVCwKKwkJU1QgaGVhZGVyRmlsZVNUXQorQGluaXQKK3sKKwlpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAwICkKKwl7CisJCWluaXQoZyk7CisJCXRoaXMucmVjb2duaXplclNUID0gcmVjb2duaXplclNUOworCQl0aGlzLm91dHB1dEZpbGVTVCA9IG91dHB1dEZpbGVTVDsKKwkJdGhpcy5oZWFkZXJGaWxlU1QgPSBoZWFkZXJGaWxlU1Q7CisJCVN0cmluZyBzdXBlckNsYXNzID0gKFN0cmluZylnLmdldE9wdGlvbigic3VwZXJDbGFzcyIpOworCQlvdXRwdXRPcHRpb24gPSAoU3RyaW5nKWcuZ2V0T3B0aW9uKCJvdXRwdXQiKTsKKwkJaWYgKCBzdXBlckNsYXNzIT1udWxsICkgcmVjb2duaXplclNULmFkZCgic3VwZXJDbGFzcyIsIHN1cGVyQ2xhc3MpOworCQlpZiAoIGcudHlwZSE9R3JhbW1hci5MRVhFUiApIHsKKwkJICAgIE9iamVjdCBsdCA9IGcuZ2V0T3B0aW9uKCJBU1RMYWJlbFR5cGUiKTsKKwkJCWlmICggbHQhPW51bGwgKSByZWNvZ25pemVyU1QuYWRkKCJBU1RMYWJlbFR5cGUiLCBsdCk7CisJCX0KKwkJaWYgKCBnLnR5cGU9PUdyYW1tYXIuVFJFRV9QQVJTRVIgJiYgZy5nZXRPcHRpb24oIkFTVExhYmVsVHlwZSIpPT1udWxsICkgeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJXYXJuaW5nKEVycm9yTWFuYWdlci5NU0dfTUlTU0lOR19BU1RfVFlQRV9JTl9UUkVFX0dSQU1NQVIsCisJCQkJCQkJCQkgICBnLAorCQkJCQkJCQkJICAgbnVsbCwKKwkJCQkJCQkJCSAgIGcubmFtZSk7CisJCX0KKwkJaWYgKCBnLnR5cGUhPUdyYW1tYXIuVFJFRV9QQVJTRVIgKSB7CisJCSAgICBPYmplY3QgbHQgPSBnLmdldE9wdGlvbigiVG9rZW5MYWJlbFR5cGUiKTsKKwkJCWlmICggbHQhPW51bGwgKSByZWNvZ25pemVyU1QuYWRkKCJsYWJlbFR5cGUiLCBsdCk7CisJCX0KKwkJJHJlY29nbml6ZXJTVC5hZGQoIm51bVJ1bGVzIiwgZ3JhbW1hci5nZXRSdWxlcygpLnNpemUoKSk7CisJCSRvdXRwdXRGaWxlU1QuYWRkKCJudW1SdWxlcyIsIGdyYW1tYXIuZ2V0UnVsZXMoKS5zaXplKCkpOworCQkkaGVhZGVyRmlsZVNULmFkZCgibnVtUnVsZXMiLCBncmFtbWFyLmdldFJ1bGVzKCkuc2l6ZSgpKTsKKwl9Cit9CisJOgkoCV4oIExFWEVSX0dSQU1NQVIgZ3JhbW1hclNwZWMgKQorCQl8CV4oIFBBUlNFUl9HUkFNTUFSIGdyYW1tYXJTcGVjICkKKwkJfAleKCBUUkVFX0dSQU1NQVIgZ3JhbW1hclNwZWMgKQorCQl8CV4oIENPTUJJTkVEX0dSQU1NQVIgZ3JhbW1hclNwZWMgKQorCQkpCisJOworCithdHRyU2NvcGUKKwk6CV4oICdzY29wZScgSUQgKCBeKEFNUEVSU0FORCAuKikgKSogQUNUSU9OICkKKwk7CisKK2dyYW1tYXJTcGVjCisJOiAgIG5hbWU9SUQKKwkJKAljbXQ9RE9DX0NPTU1FTlQKKwkJCXsKKwkJCQlvdXRwdXRGaWxlU1QuYWRkKCJkb2NDb21tZW50IiwgJGNtdC50ZXh0KTsKKwkJCQloZWFkZXJGaWxlU1QuYWRkKCJkb2NDb21tZW50IiwgJGNtdC50ZXh0KTsKKwkJCX0KKwkJKT8KKwkJeworCQkJcmVjb2duaXplclNULmFkZCgibmFtZSIsIGdyYW1tYXIuZ2V0UmVjb2duaXplck5hbWUoKSk7CisJCQlvdXRwdXRGaWxlU1QuYWRkKCJuYW1lIiwgZ3JhbW1hci5nZXRSZWNvZ25pemVyTmFtZSgpKTsKKwkJCWhlYWRlckZpbGVTVC5hZGQoIm5hbWUiLCBncmFtbWFyLmdldFJlY29nbml6ZXJOYW1lKCkpOworCQkJcmVjb2duaXplclNULmFkZCgic2NvcGVzIiwgZ3JhbW1hci5nZXRHbG9iYWxTY29wZXMoKSk7CisJCQloZWFkZXJGaWxlU1QuYWRkKCJzY29wZXMiLCBncmFtbWFyLmdldEdsb2JhbFNjb3BlcygpKTsKKwkJfQorCQkoIF4oT1BUSU9OUyAuKikgKT8KKwkJKCBeKElNUE9SVCAuKikgKT8KKwkJKCBeKFRPS0VOUyAuKikgKT8KKwkJKGF0dHJTY29wZSkqCisJCSggXihBTVBFUlNBTkQgLiopICkqCisJCXJ1bGVzW3JlY29nbml6ZXJTVF0KKwk7CisKK3J1bGVzW1NUIHJlY29nbml6ZXJTVF0KK0Bpbml0Cit7CisJU3RyaW5nIHJ1bGVOYW1lID0gKChHcmFtbWFyQVNUKWlucHV0LkxUKDEpKS5nZXRDaGlsZCgwKS5nZXRUZXh0KCk7CisJYm9vbGVhbiBnZW5lcmF0ZWQgPSBncmFtbWFyLmdlbmVyYXRlTWV0aG9kRm9yUnVsZShydWxlTmFtZSk7Cit9CisJOgkoCSgJb3B0aW9ucyB7az0xO30gOgorCQkJCXtnZW5lcmF0ZWR9PyA9PgorCQkJCXJTVD1ydWxlCisJCQkJeworCQkJCQlpZiAoICRyU1QuY29kZSAhPSBudWxsICkKKwkJCQkJeworCQkJCQkJcmVjb2duaXplclNULmFkZCgicnVsZXMiLCAkclNULmNvZGUpOworCQkJCQkJb3V0cHV0RmlsZVNULmFkZCgicnVsZXMiLCAkclNULmNvZGUpOworCQkJCQkJaGVhZGVyRmlsZVNULmFkZCgicnVsZXMiLCAkclNULmNvZGUpOworCQkJCQl9CisJCQkJfQorCQkJfAleKFJVTEUgLiopCisJCQl8CV4oUFJFQ19SVUxFIC4qKSAvLyBpZ25vcmUKKwkJCSkKKwkJCXt7CisJCQkJaWYgKCBpbnB1dC5MQSgxKSA9PSBSVUxFICkKKwkJCQl7CisJCQkJCXJ1bGVOYW1lID0gKChHcmFtbWFyQVNUKWlucHV0LkxUKDEpKS5nZXRDaGlsZCgwKS5nZXRUZXh0KCk7CisJCQkJCS8vU3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnLkFzc2VydCggcnVsZU5hbWUgPT0gKChHcmFtbWFyQVNUKWlucHV0LkxUKDEpKS5lbmNsb3NpbmdSdWxlTmFtZSApOworCQkJCQlnZW5lcmF0ZWQgPSBncmFtbWFyLmdlbmVyYXRlTWV0aG9kRm9yUnVsZShydWxlTmFtZSk7CisJCQkJfQorCQkJfX0KKwkJKSsKKwk7CisKK3J1bGUgcmV0dXJucyBbU1QgY29kZT1udWxsXQorQGluaXQKK3sKKwlTdHJpbmcgaW5pdEFjdGlvbiA9IG51bGw7CisJLy8gZ2V0IHRoZSBkZmEgZm9yIHRoZSBCTE9DSworCUdyYW1tYXJBU1QgYmxvY2syPShHcmFtbWFyQVNUKSRzdGFydC5nZXRGaXJzdENoaWxkV2l0aFR5cGUoQkxPQ0spOworCW9yZy5hbnRsci5hbmFseXNpcy5ERkEgZGZhID0gYmxvY2syLmdldExvb2thaGVhZERGQSgpOworCS8vIGluaXQgYmxvY2tOZXN0aW5nTGV2ZWwgc28gaXQncyBibG9jayBsZXZlbCBSVUxFX0JMT0NLX05FU1RJTkdfTEVWRUwKKwkvLyBmb3IgYWx0cyBvZiBydWxlCisJYmxvY2tOZXN0aW5nTGV2ZWwgPSBSVUxFX0JMT0NLX05FU1RJTkdfTEVWRUwtMTsKKwlSdWxlIHJ1bGVEZXNjciA9IGdyYW1tYXIuZ2V0UnVsZSgkc3RhcnQuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpKTsKKwljdXJyZW50UnVsZU5hbWUgPSAkc3RhcnQuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpOworCisJLy8gRm9yIHN5biBwcmVkcywgd2UgZG9uJ3Qgd2FudCBhbnkgQVNUIGNvZGUgZXRjLi4uIGluIHRoZXJlLgorCS8vIFNhdmUgb2xkIHRlbXBsYXRlcyBwdHIgYW5kIHJlc3RvcmUgbGF0ZXIuICBCYXNlIHRlbXBsYXRlcyBpbmNsdWRlIERiZy4KKwlTVEdyb3VwIHNhdmVHcm91cCA9IHRlbXBsYXRlczsKKwlpZiAoIHJ1bGVEZXNjci5pc1N5blByZWQgKQorCXsKKwkJdGVtcGxhdGVzID0gZ2VuZXJhdG9yLmdldEJhc2VUZW1wbGF0ZXMoKTsKKwl9CisKKwlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsKK30KKwk6CV4oCVJVTEUgaWQ9SUQKKwkJCXthc3NlcnQgY3VycmVudFJ1bGVOYW1lID09ICRpZC50ZXh0O30KKwkJCShtb2Q9bW9kaWZpZXIpPworCQkJXihBUkcgKEFSR19BQ1RJT04pPykKKwkJCV4oUkVUIChBUkdfQUNUSU9OKT8pCisJCQkodGhyb3dzU3BlYyk/CisJCQkoIF4oT1BUSU9OUyAuKikgKT8KKwkJCShydWxlU2NvcGVTcGVjKT8KKwkJCSggXihBTVBFUlNBTkQgLiopICkqCisJCQliPWJsb2NrWyJydWxlQmxvY2siLCBkZmFdCisJCQl7CisJCQkJZGVzY3JpcHRpb24gPQorCQkJCQlncmFtbWFyLmdyYW1tYXJUcmVlVG9TdHJpbmcoKEdyYW1tYXJBU1QpJHN0YXJ0LmdldEZpcnN0Q2hpbGRXaXRoVHlwZShCTE9DSyksCisJCQkJCQkJCQkJCQlmYWxzZSk7CisJCQkJZGVzY3JpcHRpb24gPQorCQkJCQlnZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGRlc2NyaXB0aW9uKTsKKwkJCQkkYi5jb2RlLmFkZCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisJCQkJLy8gZG8gbm90IGdlbmVyYXRlIGxleGVyIHJ1bGVzIGluIGNvbWJpbmVkIGdyYW1tYXIKKwkJCQlTdHJpbmcgc3ROYW1lID0gbnVsbDsKKwkJCQlpZiAoIHJ1bGVEZXNjci5pc1N5blByZWQgKQorCQkJCXsKKwkJCQkJc3ROYW1lID0gInN5bnByZWRSdWxlIjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQkJeworCQkJCQlpZiAoIGN1cnJlbnRSdWxlTmFtZS5lcXVhbHMoR3JhbW1hci5BUlRJRklDSUFMX1RPS0VOU19SVUxFTkFNRSkgKQorCQkJCQl7CisJCQkJCQlzdE5hbWUgPSAidG9rZW5zUnVsZSI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlzdE5hbWUgPSAibGV4ZXJSdWxlIjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoICEoZ3JhbW1hci50eXBlPT1HcmFtbWFyLkNPTUJJTkVEICYmCisJCQkJCQkgUnVsZS5nZXRSdWxlVHlwZShjdXJyZW50UnVsZU5hbWUpID09IEdyYW1tYXIuTEVYRVIpICkKKwkJCQkJeworCQkJCQkJc3ROYW1lID0gInJ1bGUiOworCQkJCQl9CisJCQkJfQorCQkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2Yoc3ROYW1lKTsKKwkJCQlpZiAoICRjb2RlLmdldE5hbWUoKS5lcXVhbHMoIi9ydWxlIikgKQorCQkJCXsKKwkJCQkJJGNvZGUuYWRkKCJlbXB0eVJ1bGUiLCBncmFtbWFyLmlzRW1wdHlSdWxlKGJsb2NrMikpOworCQkJCX0KKwkJCQkkY29kZS5hZGQoInJ1bGVEZXNjcmlwdG9yIiwgcnVsZURlc2NyKTsKKwkJCQlTdHJpbmcgbWVtbyA9IChTdHJpbmcpZ3JhbW1hci5nZXRCbG9ja09wdGlvbigkc3RhcnQsIm1lbW9pemUiKTsKKwkJCQlpZiAoIG1lbW89PW51bGwgKQorCQkJCXsKKwkJCQkJbWVtbyA9IChTdHJpbmcpZ3JhbW1hci5nZXRPcHRpb24oIm1lbW9pemUiKTsKKwkJCQl9CisJCQkJaWYgKCBtZW1vIT1udWxsICYmIG1lbW8uZXF1YWxzKCJ0cnVlIikgJiYKKwkJCQkJIChzdE5hbWUuZXF1YWxzKCJydWxlIil8fHN0TmFtZS5lcXVhbHMoImxleGVyUnVsZSIpKSApCisJCQkJeworCQkJCQkkY29kZS5hZGQoIm1lbW9pemUiLCBtZW1vIT1udWxsICYmIG1lbW8uZXF1YWxzKCJ0cnVlIikpOworCQkJCX0KKwkJCX0KKworCQkJKGV4Y2VwdGlvbkdyb3VwWyRjb2RlXSk/CisJCQlFT1IKKwkJKQorCQl7CisJCQlpZiAoICRjb2RlIT1udWxsICkKKwkJCXsKKwkJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQkJeworCQkJCQlib29sZWFuIG5ha2VkID0KKwkJCQkJCWN1cnJlbnRSdWxlTmFtZS5lcXVhbHMoR3JhbW1hci5BUlRJRklDSUFMX1RPS0VOU19SVUxFTkFNRSkgfHwKKwkJCQkJCSgkbW9kLnN0YXJ0IT1udWxsJiYkbW9kLnN0YXJ0LmdldFRleHQoKS5lcXVhbHMoR3JhbW1hci5GUkFHTUVOVF9SVUxFX01PRElGSUVSKSk7CisJCQkJCSRjb2RlLmFkZCgibmFrZWRCbG9jayIsIG5ha2VkKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZGVzY3JpcHRpb24gPSBncmFtbWFyLmdyYW1tYXJUcmVlVG9TdHJpbmcoJHN0YXJ0LGZhbHNlKTsKKwkJCQkJZGVzY3JpcHRpb24gPSBnZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGRlc2NyaXB0aW9uKTsKKwkJCQkJJGNvZGUuYWRkKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJCQl9CisJCQkJUnVsZSB0aGVSdWxlID0gZ3JhbW1hci5nZXRSdWxlKGN1cnJlbnRSdWxlTmFtZSk7CisJCQkJZ2VuZXJhdG9yLnRyYW5zbGF0ZUFjdGlvbkF0dHJpYnV0ZVJlZmVyZW5jZXNGb3JTaW5nbGVTY29wZSgKKwkJCQkJdGhlUnVsZSwKKwkJCQkJdGhlUnVsZS5nZXRBY3Rpb25zKCkKKwkJCQkpOworCQkJCSRjb2RlLmFkZCgicnVsZU5hbWUiLCBjdXJyZW50UnVsZU5hbWUpOworCQkJCSRjb2RlLmFkZCgiYmxvY2siLCAkYi5jb2RlKTsKKwkJCQlpZiAoIGluaXRBY3Rpb24hPW51bGwgKQorCQkJCXsKKwkJCQkJJGNvZGUuYWRkKCJpbml0QWN0aW9uIiwgaW5pdEFjdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJOworZmluYWxseSB7IHRlbXBsYXRlcyA9IHNhdmVHcm91cDsgfQorCittb2RpZmllcgorCToJJ3Byb3RlY3RlZCcKKwl8CSdwdWJsaWMnCisJfAkncHJpdmF0ZScKKwl8CSdmcmFnbWVudCcKKwk7CisKK3Rocm93c1NwZWMKKwk6CV4oJ3Rocm93cycgSUQrKQorCTsKKworcnVsZVNjb3BlU3BlYworCToJXiggJ3Njb3BlJyAoIF4oQU1QRVJTQU5EIC4qKSApKiAoQUNUSU9OKT8gKCBJRCApKiApCisJOworCitibG9ja1tTdHJpbmcgYmxvY2tUZW1wbGF0ZU5hbWUsIG9yZy5hbnRsci5hbmFseXNpcy5ERkEgZGZhXQorCSByZXR1cm5zIFtTVCBjb2RlPW51bGxdCitvcHRpb25zIHsgaz0xOyB9CitAaW5pdAoreworCWludCBhbHROdW0gPSAwOworCisJYmxvY2tOZXN0aW5nTGV2ZWwrKzsKKwlpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAwICkKKwl7CisJCVNUIGRlY2lzaW9uID0gbnVsbDsKKwkJaWYgKCAkZGZhICE9IG51bGwgKQorCQl7CisJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCRibG9ja1RlbXBsYXRlTmFtZSk7CisJCQlkZWNpc2lvbiA9IGdlbmVyYXRvci5nZW5Mb29rYWhlYWREZWNpc2lvbihyZWNvZ25pemVyU1QsJGRmYSk7CisJCQkkY29kZS5hZGQoImRlY2lzaW9uIiwgZGVjaXNpb24pOworCQkJJGNvZGUuYWRkKCJkZWNpc2lvbk51bWJlciIsICRkZmEuZ2V0RGVjaXNpb25OdW1iZXIoKSk7CisJCQkkY29kZS5hZGQoIm1heEsiLCRkZmEuZ2V0TWF4TG9va2FoZWFkRGVwdGgoKSk7CisJCQkkY29kZS5hZGQoIm1heEFsdCIsJGRmYS5nZXROdW1iZXJPZkFsdHMoKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCRibG9ja1RlbXBsYXRlTmFtZSsiU2luZ2xlQWx0Iik7CisJCX0KKwkJJGNvZGUuYWRkKCJibG9ja0xldmVsIiwgYmxvY2tOZXN0aW5nTGV2ZWwpOworCQkkY29kZS5hZGQoImVuY2xvc2luZ0Jsb2NrTGV2ZWwiLCBibG9ja05lc3RpbmdMZXZlbC0xKTsKKwkJYWx0TnVtID0gMTsKKwkJaWYgKCB0aGlzLmJsb2NrTmVzdGluZ0xldmVsPT1SVUxFX0JMT0NLX05FU1RJTkdfTEVWRUwgKSB7CisJCQl0aGlzLm91dGVyQWx0TnVtPTE7CisJCX0KKwl9Cit9CisJOgl7JHN0YXJ0LmdldFNldFZhbHVlKCkhPW51bGx9PyA9PiBzZXRCbG9jaworCQl7CisJCQkkY29kZS5hZGQoImFsdHMiLCRzZXRCbG9jay5jb2RlKTsKKwkJfQorCisJfAleKCAgQkxPQ0sKKwkJCSggXihPUFRJT05TIC4qKSApPyAvLyBpZ25vcmUKKwkJCSggYWx0PWFsdGVybmF0aXZlIHJldz1yZXdyaXRlCisJCQkJeworCQkJCQlpZiAoIHRoaXMuYmxvY2tOZXN0aW5nTGV2ZWw9PVJVTEVfQkxPQ0tfTkVTVElOR19MRVZFTCApCisJCQkJCXsKKwkJCQkJCXRoaXMub3V0ZXJBbHROdW0rKzsKKwkJCQkJfQorCQkJCQkvLyBhZGQgdGhlIHJld3JpdGUgY29kZSBhcyBqdXN0IGFub3RoZXIgZWxlbWVudCBpbiB0aGUgYWx0IDopCisJCQkJCS8vICh1bmxlc3MgaXQncyBhICIgLT4gLi4uIiByZXdyaXRlCisJCQkJCS8vICggLT4gLi4uICkKKwkJCQkJR3JhbW1hckFTVCBmaXJzdFJld3JpdGVBU1QgPSAoR3JhbW1hckFTVCkkcmV3LnN0YXJ0LmZpbmRGaXJzdFR5cGUoUkVXUklURSk7CisJCQkJCWJvb2xlYW4gZXRjID0KKwkJCQkJCSRyZXcuc3RhcnQuZ2V0VHlwZSgpPT1SRVdSSVRFUyAmJgorCQkJCQkJZmlyc3RSZXdyaXRlQVNULmdldENoaWxkKDApIT1udWxsICYmCisJCQkJCQlmaXJzdFJld3JpdGVBU1QuZ2V0Q2hpbGQoMCkuZ2V0VHlwZSgpPT1FVEM7CisJCQkJCWlmICggJHJldy5jb2RlIT1udWxsICYmICFldGMgKQorCQkJCQl7CisJCQkJCQkkYWx0LmNvZGUuYWRkKCJyZXciLCAkcmV3LmNvZGUpOworCQkJCQl9CisJCQkJCS8vIGFkZCB0aGlzIGFsdCB0byB0aGUgbGlzdCBvZiBhbHRzIGZvciB0aGlzIGJsb2NrCisJCQkJCSRjb2RlLmFkZCgiYWx0cyIsJGFsdC5jb2RlKTsKKwkJCQkJJGFsdC5jb2RlLmFkZCgiYWx0TnVtIiwgYWx0TnVtKTsKKwkJCQkJJGFsdC5jb2RlLmFkZCgib3V0ZXJBbHQiLCBibG9ja05lc3RpbmdMZXZlbD09UlVMRV9CTE9DS19ORVNUSU5HX0xFVkVMKTsKKwkJCQkJYWx0TnVtKys7CisJCQkJfQorCQkJKSsKKwkJCUVPQgorCQkgKQorCTsKK2ZpbmFsbHkgeyBibG9ja05lc3RpbmdMZXZlbC0tOyB9CisKK3NldEJsb2NrIHJldHVybnMgW1NUIGNvZGU9bnVsbF0KK0Bpbml0Cit7CisJU1Qgc2V0Y29kZSA9IG51bGw7CisJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCApCisJeworCQlpZiAoIGJsb2NrTmVzdGluZ0xldmVsPT1SVUxFX0JMT0NLX05FU1RJTkdfTEVWRUwgJiYgZ3JhbW1hci5idWlsZEFTVCgpICkKKwkJeworCQkJUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKGN1cnJlbnRSdWxlTmFtZSk7CisJCQljdXJyZW50QWx0SGFzQVNUUmV3cml0ZSA9IHIuaGFzUmV3cml0ZShvdXRlckFsdE51bSk7CisJCQlpZiAoIGN1cnJlbnRBbHRIYXNBU1RSZXdyaXRlICkKKwkJCXsKKwkJCQlyLnRyYWNrVG9rZW5SZWZlcmVuY2VJbkFsdCgkc3RhcnQsIG91dGVyQWx0TnVtKTsKKwkJCX0KKwkJfQorCX0KK30KKwk6CV4ocz1CTE9DSyAuKikKKwkJeworCQkJaW50IGkgPSAoKENvbW1vblRva2VuKSRzLmdldFRva2VuKCkpLmdldFRva2VuSW5kZXgoKTsKKwkJCWlmICggYmxvY2tOZXN0aW5nTGV2ZWw9PVJVTEVfQkxPQ0tfTkVTVElOR19MRVZFTCApCisJCQl7CisJCQkJc2V0Y29kZSA9IGdldFRva2VuRWxlbWVudFNUKCJtYXRjaFJ1bGVCbG9ja1NldCIsICJzZXQiLCAkcywgbnVsbCwgbnVsbCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2V0Y29kZSA9IGdldFRva2VuRWxlbWVudFNUKCJtYXRjaFNldCIsICJzZXQiLCAkcywgbnVsbCwgbnVsbCk7CisJCQl9CisJCQlzZXRjb2RlLmFkZCgiZWxlbWVudEluZGV4IiwgaSk7CisJCQkvL2lmICggZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICkKKwkJCS8veworCQkJLy8JZ2VuZXJhdG9yLmdlbmVyYXRlTG9jYWxGT0xMT1coJHMsInNldCIsY3VycmVudFJ1bGVOYW1lLGkpOworCQkJLy99CisJCQlzZXRjb2RlLmFkZCgicyIsCisJCQkJZ2VuZXJhdG9yLmdlblNldEV4cHIodGVtcGxhdGVzLCRzLmdldFNldFZhbHVlKCksMSxmYWxzZSkpOworCQkJU1QgYWx0Y29kZT10ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigiYWx0Iik7CisJCQlhbHRjb2RlLmFkZEFnZ3IoImVsZW1lbnRzLntlbCxsaW5lLHBvc30iLAorCQkJCQkJCQkgc2V0Y29kZSwKKwkJCQkJCQkJICRzLmdldExpbmUoKSwKKwkJCQkJCQkJICRzLmdldENoYXJQb3NpdGlvbkluTGluZSgpICsgMQorCQkJCQkJCQkpOworCQkJYWx0Y29kZS5hZGQoImFsdE51bSIsIDEpOworCQkJYWx0Y29kZS5hZGQoIm91dGVyQWx0IiwgYmxvY2tOZXN0aW5nTGV2ZWw9PVJVTEVfQkxPQ0tfTkVTVElOR19MRVZFTCk7CisJCQlpZiAoICFjdXJyZW50QWx0SGFzQVNUUmV3cml0ZSAmJiBncmFtbWFyLmJ1aWxkQVNUKCkgKQorCQkJeworCQkJCWFsdGNvZGUuYWRkKCJhdXRvQVNUIiwgdHJ1ZSk7CisJCQl9CisJCQlhbHRjb2RlLmFkZCgidHJlZUxldmVsIiwgcmV3cml0ZVRyZWVOZXN0aW5nTGV2ZWwpOworCQkJJGNvZGUgPSBhbHRjb2RlOworCQl9CisJOworCitzZXRBbHRlcm5hdGl2ZQorCToJXihBTFQgc2V0RWxlbWVudCsgRU9BKQorCTsKKworZXhjZXB0aW9uR3JvdXBbU1QgcnVsZVNUXQorCToJKCBleGNlcHRpb25IYW5kbGVyWyRydWxlU1RdICkrIChmaW5hbGx5Q2xhdXNlWyRydWxlU1RdKT8KKwl8CWZpbmFsbHlDbGF1c2VbJHJ1bGVTVF0KKwk7CisKK2V4Y2VwdGlvbkhhbmRsZXJbU1QgcnVsZVNUXQorCToJXignY2F0Y2gnIEFSR19BQ1RJT04gQUNUSU9OKQorCQl7CisJCQlMaXN0IGNodW5rcyA9IGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRBQ1RJT04pOworCQkJJHJ1bGVTVC5hZGRBZ2dyKCJleGNlcHRpb25zLntkZWNsLGFjdGlvbn0iLCRBUkdfQUNUSU9OLnRleHQsY2h1bmtzKTsKKwkJfQorCTsKKworZmluYWxseUNsYXVzZVtTVCBydWxlU1RdCisJOgleKCdmaW5hbGx5JyBBQ1RJT04pCisJCXsKKwkJCUxpc3QgY2h1bmtzID0gZ2VuZXJhdG9yLnRyYW5zbGF0ZUFjdGlvbihjdXJyZW50UnVsZU5hbWUsJEFDVElPTik7CisJCQkkcnVsZVNULmFkZCgiZmluYWxseSIsY2h1bmtzKTsKKwkJfQorCTsKKworYWx0ZXJuYXRpdmUgcmV0dXJucyBbU1QgY29kZV0KK0Bpbml0Cit7CisJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCApCisJeworCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJhbHQiKTsKKwkJaWYgKCBibG9ja05lc3RpbmdMZXZlbD09UlVMRV9CTE9DS19ORVNUSU5HX0xFVkVMICYmIGdyYW1tYXIuYnVpbGRBU1QoKSApCisJCXsKKwkJCVJ1bGUgciA9IGdyYW1tYXIuZ2V0UnVsZShjdXJyZW50UnVsZU5hbWUpOworCQkJY3VycmVudEFsdEhhc0FTVFJld3JpdGUgPSByLmhhc1Jld3JpdGUob3V0ZXJBbHROdW0pOworCQl9CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKTsKKwkJZGVzY3JpcHRpb24gPSBnZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGRlc2NyaXB0aW9uKTsKKwkJJGNvZGUuYWRkKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJJGNvZGUuYWRkKCJ0cmVlTGV2ZWwiLCByZXdyaXRlVHJlZU5lc3RpbmdMZXZlbCk7CisJCWlmICggIWN1cnJlbnRBbHRIYXNBU1RSZXdyaXRlICYmIGdyYW1tYXIuYnVpbGRBU1QoKSApCisJCXsKKwkJCSRjb2RlLmFkZCgiYXV0b0FTVCIsIHRydWUpOworCQl9CisJfQorfQorCToJXigJYT1BTFQKKwkJCSgKKwkJCQllPWVsZW1lbnRbbnVsbCxudWxsXQorCQkJCXsKKwkJCQkJaWYgKGUgIT0gbnVsbCAmJiBlLmNvZGUgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJJGNvZGUuYWRkQWdncigiZWxlbWVudHMue2VsLGxpbmUscG9zfSIsCisJCQkJCQkJCQkJICAkZS5jb2RlLAorCQkJCQkJCQkJCSAgJGUuc3RhcnQuZ2V0TGluZSgpLAorCQkJCQkJCQkJCSAgJGUuc3RhcnQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkgKyAxCisJCQkJCQkJCQkJICk7CisJCQkJCX0KKwkJCQl9CisJCQkpKworCQkJRU9BCisJCSkKKwk7CisKK2VsZW1lbnRbR3JhbW1hckFTVCBsYWJlbCwgR3JhbW1hckFTVCBhc3RTdWZmaXhdIHJldHVybnMgW1NUIGNvZGU9bnVsbF0KK29wdGlvbnMgeyBrPTE7IH0KK0Bpbml0Cit7CisJSW50U2V0IGVsZW1lbnRzPW51bGw7CisJR3JhbW1hckFTVCBhc3QgPSBudWxsOworfQorCToJXihST09UIGU9ZWxlbWVudFtsYWJlbCwkUk9PVF0pCisJCXsgJGNvZGUgPSAkZS5jb2RlOyB9CisKKwl8CV4oQkFORyBlPWVsZW1lbnRbbGFiZWwsJEJBTkddKQorCQl7ICRjb2RlID0gJGUuY29kZTsgfQorCisJfAleKCBuPU5PVCBub3RFbGVtZW50WyRuLCAkbGFiZWwsICRhc3RTdWZmaXhdICkKKwkJeyAkY29kZSA9ICRub3RFbGVtZW50LmNvZGU7IH0KKworCXwJXiggQVNTSUdOIGFsYWJlbD1JRCBlPWVsZW1lbnRbJGFsYWJlbCwkYXN0U3VmZml4XSApCisJCXsgJGNvZGUgPSAkZS5jb2RlOyB9CisKKwl8CV4oIFBMVVNfQVNTSUdOIGxhYmVsMj1JRCBlPWVsZW1lbnRbJGxhYmVsMiwkYXN0U3VmZml4XSApCisJCXsgJGNvZGUgPSAkZS5jb2RlOyB9CisKKwl8CV4oQ0hBUl9SQU5HRSBhPUNIQVJfTElURVJBTCBiPUNIQVJfTElURVJBTCkKKwkJeworCQkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigiY2hhclJhbmdlUmVmIik7CisJCQlTdHJpbmcgbG93ID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRDaGFyTGl0ZXJhbEZyb21BTlRMUkNoYXJMaXRlcmFsKGdlbmVyYXRvciwkYS50ZXh0KTsKKwkJCVN0cmluZyBoaWdoID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRDaGFyTGl0ZXJhbEZyb21BTlRMUkNoYXJMaXRlcmFsKGdlbmVyYXRvciwkYi50ZXh0KTsKKwkJCSRjb2RlLmFkZCgiYSIsIGxvdyk7CisJCQkkY29kZS5hZGQoImIiLCBoaWdoKTsKKwkJCWlmICggbGFiZWwhPW51bGwgKQorCQkJeworCQkJCSRjb2RlLmFkZCgibGFiZWwiLCAkbGFiZWwuZ2V0VGV4dCgpKTsKKwkJCX0KKwkJfQorCisJfAkoeygoR3JhbW1hckFTVClpbnB1dC5MVCgxKSkuZ2V0U2V0VmFsdWUoKT09bnVsbH0/IChCTE9DS3xPUFRJT05BTHxDTE9TVVJFfFBPU0lUSVZFX0NMT1NVUkUpKSA9PiAvKnskc3RhcnQuZ2V0U2V0VmFsdWUoKT09bnVsbH0/Ki8gZWJuZgorCQl7ICRjb2RlID0gJGVibmYuY29kZTsgfQorCisJfAlhdG9tW251bGwsICRsYWJlbCwgJGFzdFN1ZmZpeF0KKwkJeyAkY29kZSA9ICRhdG9tLmNvZGU7IH0KKworCXwJdHJlZV8KKwkJeyAkY29kZSA9ICR0cmVlXy5jb2RlOyB9CisKKwl8CWVsZW1lbnRfYWN0aW9uCisJCXsgJGNvZGUgPSAkZWxlbWVudF9hY3Rpb24uY29kZTsgfQorCisJfCAgIChzcD1TRU1QUkVEfHNwPUdBVEVEX1NFTVBSRUQpCisJCXsKKwkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInZhbGlkYXRlU2VtYW50aWNQcmVkaWNhdGUiKTsKKwkJCSRjb2RlLmFkZCgicHJlZCIsIGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRzcCkpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZygkc3AudGV4dCk7CisJCQkkY29kZS5hZGQoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworCQl9CisKKwl8CVNZTl9TRU1QUkVEIC8vIHVzZWQgb25seSBpbiBsb29rYWhlYWQ7IGRvbid0IGdlbmVyYXRlIHZhbGlkYXRpbmcgcHJlZAorCisJfAleKFNZTlBSRUQgLiopCisKKwl8CV4oQkFDS1RSQUNLX1NFTVBSRUQgLiopCisKKwl8ICAgRVBTSUxPTgorCTsKKworZWxlbWVudF9hY3Rpb24gcmV0dXJucyBbU1QgY29kZT1udWxsXQorCToJYWN0PUFDVElPTgorCQl7CisJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJleGVjQWN0aW9uIik7CisJCQkkY29kZS5hZGQoImFjdGlvbiIsIGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRhY3QpKTsKKwkJfQorCXwJYWN0Mj1GT1JDRURfQUNUSU9OCisJCXsKKwkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImV4ZWNGb3JjZWRBY3Rpb24iKTsKKwkJCSRjb2RlLmFkZCgiYWN0aW9uIiwgZ2VuZXJhdG9yLnRyYW5zbGF0ZUFjdGlvbihjdXJyZW50UnVsZU5hbWUsJGFjdDIpKTsKKwkJfQorCTsKKworbm90RWxlbWVudFtHcmFtbWFyQVNUIG4sIEdyYW1tYXJBU1QgbGFiZWwsIEdyYW1tYXJBU1QgYXN0U3VmZml4XSByZXR1cm5zIFtTVCBjb2RlPW51bGxdCitAaW5pdAoreworCUludFNldCBlbGVtZW50cz1udWxsOworCVN0cmluZyBsYWJlbFRleHQgPSBudWxsOworCWlmICggbGFiZWwhPW51bGwgKQorCXsKKwkJbGFiZWxUZXh0ID0gbGFiZWwuZ2V0VGV4dCgpOworCX0KK30KKwk6CSgJYXNzaWduX2M9Q0hBUl9MSVRFUkFMCisJCQl7CisJCQkJaW50IHR0eXBlPTA7CisJCQkJaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKQorCQkJCXsKKwkJCQkJdHR5cGUgPSBHcmFtbWFyLmdldENoYXJWYWx1ZUZyb21HcmFtbWFyQ2hhckxpdGVyYWwoJGFzc2lnbl9jLnRleHQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0dHlwZSA9IGdyYW1tYXIuZ2V0VG9rZW5UeXBlKCRhc3NpZ25fYy50ZXh0KTsKKwkJCQl9CisJCQkJZWxlbWVudHMgPSBncmFtbWFyLmNvbXBsZW1lbnQodHR5cGUpOworCQkJfQorCQl8CWFzc2lnbl9zPVNUUklOR19MSVRFUkFMCisJCQl7CisJCQkJaW50IHR0eXBlPTA7CisJCQkJaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKQorCQkJCXsKKwkJCQkJLy8gVE9ETzogZXJyb3IhCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUoJGFzc2lnbl9zLnRleHQpOworCQkJCX0KKwkJCQllbGVtZW50cyA9IGdyYW1tYXIuY29tcGxlbWVudCh0dHlwZSk7CisJCQl9CisJCXwJYXNzaWduX3Q9VE9LRU5fUkVGCisJCQl7CisJCQkJaW50IHR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUoJGFzc2lnbl90LnRleHQpOworCQkJCWVsZW1lbnRzID0gZ3JhbW1hci5jb21wbGVtZW50KHR0eXBlKTsKKwkJCX0KKwkJfAleKGFzc2lnbl9zdD1CTE9DSyAuKikKKwkJCXsKKwkJCQllbGVtZW50cyA9ICRhc3NpZ25fc3QuZ2V0U2V0VmFsdWUoKTsKKwkJCQllbGVtZW50cyA9IGdyYW1tYXIuY29tcGxlbWVudChlbGVtZW50cyk7CisJCQl9CisJCSkKKwkJeworCQkJJGNvZGUgPSBnZXRUb2tlbkVsZW1lbnRTVCgibWF0Y2hTZXQiLAorCQkJCQkJCQkJICJzZXQiLAorCQkJCQkJCQkJIChHcmFtbWFyQVNUKSRuLmdldENoaWxkKDApLAorCQkJCQkJCQkJIGFzdFN1ZmZpeCwKKwkJCQkJCQkJCSBsYWJlbFRleHQpOworCQkJJGNvZGUuYWRkKCJzIixnZW5lcmF0b3IuZ2VuU2V0RXhwcih0ZW1wbGF0ZXMsZWxlbWVudHMsMSxmYWxzZSkpOworCQkJaW50IGkgPSAoKENvbW1vblRva2VuKW4uZ2V0VG9rZW4oKSkuZ2V0VG9rZW5JbmRleCgpOworCQkJJGNvZGUuYWRkKCJlbGVtZW50SW5kZXgiLCBpKTsKKwkJCWlmICggZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICkKKwkJCXsKKwkJCQlnZW5lcmF0b3IuZ2VuZXJhdGVMb2NhbEZPTExPVyhuLCJzZXQiLGN1cnJlbnRSdWxlTmFtZSxpKTsKKwkJCX0KKwkJfQorCTsKKworZWJuZiByZXR1cm5zIFtTVCBjb2RlPW51bGxdCitAaW5pdAoreworCW9yZy5hbnRsci5hbmFseXNpcy5ERkEgZGZhPW51bGw7CisJR3JhbW1hckFTVCBiID0gKEdyYW1tYXJBU1QpJHN0YXJ0LmdldENoaWxkKDApOworCUdyYW1tYXJBU1QgZW9iID0gKEdyYW1tYXJBU1QpYi5nZXRMYXN0Q2hpbGQoKTsgLy8gbG9vcHMgd2lsbCB1c2UgRU9CIERGQQorfQorCToJKAl7IGRmYSA9ICRzdGFydC5nZXRMb29rYWhlYWRERkEoKTsgfQorCQkJYmxrPWJsb2NrWyJibG9jayIsIGRmYV0KKwkJCXsgJGNvZGUgPSAkYmxrLmNvZGU7IH0KKwkJfAl7IGRmYSA9ICRzdGFydC5nZXRMb29rYWhlYWRERkEoKTsgfQorCQkJXiggT1BUSU9OQUwgYmxrPWJsb2NrWyJvcHRpb25hbEJsb2NrIiwgZGZhXSApCisJCQl7ICRjb2RlID0gJGJsay5jb2RlOyB9CisJCXwJeyBkZmEgPSBlb2IuZ2V0TG9va2FoZWFkREZBKCk7IH0KKwkJCV4oIENMT1NVUkUgYmxrPWJsb2NrWyJjbG9zdXJlQmxvY2siLCBkZmFdICkKKwkJCXsgJGNvZGUgPSAkYmxrLmNvZGU7IH0KKwkJfAl7IGRmYSA9IGVvYi5nZXRMb29rYWhlYWRERkEoKTsgfQorCQkJXiggUE9TSVRJVkVfQ0xPU1VSRSBibGs9YmxvY2tbInBvc2l0aXZlQ2xvc3VyZUJsb2NrIiwgZGZhXSApCisJCQl7ICRjb2RlID0gJGJsay5jb2RlOyB9CisJCSkKKwkJeworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ3JhbW1hci5ncmFtbWFyVHJlZVRvU3RyaW5nKCRzdGFydCwgZmFsc2UpOworCQkJZGVzY3JpcHRpb24gPSBnZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGRlc2NyaXB0aW9uKTsKKwkJCSRjb2RlLmFkZCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisJCX0KKwk7CisKK3RyZWVfIHJldHVybnMgW1NUIGNvZGVdCitAaW5pdAoreworCXJld3JpdGVUcmVlTmVzdGluZ0xldmVsKys7CisJR3JhbW1hckFTVCByb290U3VmZml4ID0gbnVsbDsKKwlpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAwICkKKwl7CisJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInRyZWUiKTsKKwkJTkZBU3RhdGUgYWZ0ZXJET1dOID0gKE5GQVN0YXRlKSRzdGFydC5ORkFUcmVlRG93blN0YXRlLnRyYW5zaXRpb24oMCkudGFyZ2V0OworCQlMb29rYWhlYWRTZXQgcyA9IGdyYW1tYXIuTE9PSyhhZnRlckRPV04pOworCQlpZiAoIHMubWVtYmVyKExhYmVsLlVQKSApIHsKKwkJCS8vIG51bGxhYmxlIGNoaWxkIGxpc3QgaWYgd2UgY2FuIHNlZSB0aGUgVVAgYXMgdGhlIG5leHQgdG9rZW4KKwkJCS8vIHdlIG5lZWQgYW4gImlmICggaW5wdXQuTEEoMSk9PVRva2VuLkRPV04gKSIgZ2F0ZSBhcm91bmQKKwkJCS8vIHRoZSBjaGlsZCBsaXN0LgorCQkJJGNvZGUuYWRkKCJudWxsYWJsZUNoaWxkTGlzdCIsICJ0cnVlIik7CisJCX0KKwkJJGNvZGUuYWRkKCJlbmNsb3NpbmdUcmVlTGV2ZWwiLCByZXdyaXRlVHJlZU5lc3RpbmdMZXZlbC0xKTsKKwkJJGNvZGUuYWRkKCJ0cmVlTGV2ZWwiLCByZXdyaXRlVHJlZU5lc3RpbmdMZXZlbCk7CisJCVJ1bGUgciA9IGdyYW1tYXIuZ2V0UnVsZShjdXJyZW50UnVsZU5hbWUpOworCQlpZiAoIGdyYW1tYXIuYnVpbGRBU1QoKSAmJiAhci5oYXNSZXdyaXRlKG91dGVyQWx0TnVtKSApIHsKKwkJCXJvb3RTdWZmaXggPSBuZXcgR3JhbW1hckFTVChST09ULCJST09UIik7CisJCX0KKwl9Cit9CisJOgleKAlUUkVFX0JFR0lOCisJCQllbD1lbGVtZW50W251bGwscm9vdFN1ZmZpeF0KKwkJCXsKKwkJCQkkY29kZS5hZGRBZ2dyKCJyb290LntlbCxsaW5lLHBvc30iLAorCQkJCQkJCQkgICRlbC5jb2RlLAorCQkJCQkJCQkgICRlbC5zdGFydC5nZXRMaW5lKCksCisJCQkJCQkJCSAgJGVsLnN0YXJ0LmdldENoYXJQb3NpdGlvbkluTGluZSgpICsgMQorCQkJCQkJCQkgICk7CisJCQl9CisJCQkvLyBwdXNoIGFsbCB0aGUgaW1tZWRpYXRlbHktZm9sbG93aW5nIGFjdGlvbnMgb3V0IGJlZm9yZSBjaGlsZHJlbgorCQkJLy8gc28gYWN0aW9ucyBhcmVuJ3QgZ3VhcmRlZCBieSB0aGUgImlmIChpbnB1dC5MQSgxKT09VG9rZW4uRE9XTikiCisJCQkvLyBndWFyZCBpbiBnZW5lcmF0ZWQgY29kZS4KKwkJCSgJKGVsZW1lbnRfYWN0aW9uKSA9PgorCQkJCWFjdD1lbGVtZW50X2FjdGlvbgorCQkJCXsKKwkJCQkJJGNvZGUuYWRkQWdncigiYWN0aW9uc0FmdGVyUm9vdC57ZWwsbGluZSxwb3N9IiwKKwkJCQkJCQkJCSAgJGFjdC5jb2RlLAorCQkJCQkJCQkJICAkYWN0LnN0YXJ0LmdldExpbmUoKSwKKwkJCQkJCQkJCSAgJGFjdC5zdGFydC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSArIDEKKwkJCQkJCQkJCSk7CisJCQkJfQorCQkJKSoKKwkJCSgJIGVsPWVsZW1lbnRbbnVsbCxudWxsXQorCQkJCSB7CisJCQkJICRjb2RlLmFkZEFnZ3IoImNoaWxkcmVuLntlbCxsaW5lLHBvc30iLAorCQkJCQkJCQkgICRlbC5jb2RlLAorCQkJCQkJCQkgICRlbC5zdGFydC5nZXRMaW5lKCksCisJCQkJCQkJCSAgJGVsLnN0YXJ0LmdldENoYXJQb3NpdGlvbkluTGluZSgpICsgMQorCQkJCQkJCQkgICk7CisJCQkJIH0KKwkJCSkqCisJCSkKKwk7CitmaW5hbGx5IHsgcmV3cml0ZVRyZWVOZXN0aW5nTGV2ZWwtLTsgfQorCithdG9tW0dyYW1tYXJBU1Qgc2NvcGUsIEdyYW1tYXJBU1QgbGFiZWwsIEdyYW1tYXJBU1QgYXN0U3VmZml4XQorCXJldHVybnMgW1NUIGNvZGU9bnVsbF0KK0Bpbml0Cit7CisJU3RyaW5nIGxhYmVsVGV4dD1udWxsOworCWlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDAgKQorCXsKKwkJaWYgKCBsYWJlbCE9bnVsbCApCisJCXsKKwkJCWxhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsKKwkJfQorCQlpZiAoIGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiAmJgorCQkJICgkc3RhcnQuZ2V0VHlwZSgpPT1SVUxFX1JFRnx8JHN0YXJ0LmdldFR5cGUoKT09VE9LRU5fUkVGfHwKKwkJCSAgJHN0YXJ0LmdldFR5cGUoKT09Q0hBUl9MSVRFUkFMfHwkc3RhcnQuZ2V0VHlwZSgpPT1TVFJJTkdfTElURVJBTCkgKQorCQl7CisJCQlSdWxlIGVuY1J1bGUgPSBncmFtbWFyLmdldFJ1bGUoKChHcmFtbWFyQVNUKSRzdGFydCkuZW5jbG9zaW5nUnVsZU5hbWUpOworCQkJaWYgKCBlbmNSdWxlIT1udWxsICYmIGVuY1J1bGUuaGFzUmV3cml0ZShvdXRlckFsdE51bSkgJiYgYXN0U3VmZml4IT1udWxsICkKKwkJCXsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfQVNUX09QX0lOX0FMVF9XSVRIX1JFV1JJVEUsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgKChHcmFtbWFyQVNUKSRzdGFydCkuZ2V0VG9rZW4oKSwKKwkJCQkJCQkJCQkgICgoR3JhbW1hckFTVCkkc3RhcnQpLmVuY2xvc2luZ1J1bGVOYW1lLAorCQkJCQkJCQkJCSAgb3V0ZXJBbHROdW0pOworCQkJCWFzdFN1ZmZpeCA9IG51bGw7CisJCQl9CisJCX0KKwl9Cit9CisJOiAgIF4oIHI9UlVMRV9SRUYgKHJhcmc9QVJHX0FDVElPTik/ICkKKwkJeworCQkJZ3JhbW1hci5jaGVja1J1bGVSZWZlcmVuY2Uoc2NvcGUsICRyLCAkcmFyZywgY3VycmVudFJ1bGVOYW1lKTsKKwkJCVN0cmluZyBzY29wZU5hbWUgPSBudWxsOworCQkJaWYgKCBzY29wZSE9bnVsbCApIHsKKwkJCQlzY29wZU5hbWUgPSBzY29wZS5nZXRUZXh0KCk7CisJCQl9CisJCQlSdWxlIHJkZWYgPSBncmFtbWFyLmdldFJ1bGUoc2NvcGVOYW1lLCAkci50ZXh0KTsKKwkJCS8vIGRvbid0IGluc2VydCBsYWJlbD1yKCkgaWYgJGxhYmVsLmF0dHIgbm90IHVzZWQsIG5vIHJldCB2YWx1ZSwgLi4uCisJCQlpZiAoICFyZGVmLmdldEhhc1JldHVyblZhbHVlKCkgKSB7CisJCQkJbGFiZWxUZXh0ID0gbnVsbDsKKwkJCX0KKwkJCSRjb2RlID0gZ2V0UnVsZUVsZW1lbnRTVCgicnVsZVJlZiIsICRyLnRleHQsICRyLCBhc3RTdWZmaXgsIGxhYmVsVGV4dCk7CisJCQkkY29kZS5hZGQoInJ1bGUiLCByZGVmKTsKKwkJCWlmICggc2NvcGUhPW51bGwgKSB7IC8vIHNjb3BlZCBydWxlIHJlZgorCQkJCUdyYW1tYXIgc2NvcGVHID0gZ3JhbW1hci5jb21wb3NpdGUuZ2V0R3JhbW1hcihzY29wZS5nZXRUZXh0KCkpOworCQkJCSRjb2RlLmFkZCgic2NvcGUiLCBzY29wZUcpOworCQkJfQorCQkJZWxzZSBpZiAoIHJkZWYuZ3JhbW1hciAhPSB0aGlzLmdyYW1tYXIgKSB7IC8vIG5vbmxvY2FsCisJCQkJLy8gaWYgcnVsZSBkZWZpbml0aW9uIGlzIG5vdCBpbiB0aGlzIGdyYW1tYXIsIGl0J3Mgbm9ubG9jYWwKKwkJCQlMaXN0PEdyYW1tYXI+IHJkZWZEZWxlZ2F0ZXMgPSByZGVmLmdyYW1tYXIuZ2V0RGVsZWdhdGVzKCk7CisJCQkJaWYgKCByZGVmRGVsZWdhdGVzLmNvbnRhaW5zKHRoaXMuZ3JhbW1hcikgKSB7CisJCQkJCSRjb2RlLmFkZCgic2NvcGUiLCByZGVmLmdyYW1tYXIpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gZGVmaW5pbmcgZ3JhbW1hciBpcyBub3QgYSBkZWxlZ2F0ZSwgc2NvcGUgYWxsIHRoZQorCQkJCQkvLyBiYWNrIHRvIHJvb3QsIHdoaWNoIGhhcyBkZWxlZ2F0ZSBtZXRob2RzIGZvciBhbGwKKwkJCQkJLy8gcnVsZXMuICBEb24ndCB1c2Ugc2NvcGUgaWYgd2UgYXJlIHJvb3QuCisJCQkJCWlmICggdGhpcy5ncmFtbWFyICE9IHJkZWYuZ3JhbW1hci5jb21wb3NpdGUuZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QuZ3JhbW1hciApIHsKKwkJCQkJCSRjb2RlLmFkZCgic2NvcGUiLAorCQkJCQkJCQkJCSAgcmRlZi5ncmFtbWFyLmNvbXBvc2l0ZS5kZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5ncmFtbWFyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKCAkcmFyZyE9bnVsbCApIHsKKwkJCQlMaXN0IGFyZ3MgPSBnZW5lcmF0b3IudHJhbnNsYXRlQWN0aW9uKGN1cnJlbnRSdWxlTmFtZSwkcmFyZyk7CisJCQkJJGNvZGUuYWRkKCJhcmdzIiwgYXJncyk7CisJCQl9CisJCQlpbnQgaSA9ICgoQ29tbW9uVG9rZW4pci5nZXRUb2tlbigpKS5nZXRUb2tlbkluZGV4KCk7CisJCQkkY29kZS5hZGQoImVsZW1lbnRJbmRleCIsIGkpOworCQkJZ2VuZXJhdG9yLmdlbmVyYXRlTG9jYWxGT0xMT1coJHIsJHIudGV4dCxjdXJyZW50UnVsZU5hbWUsaSk7CisJCQkkci5jb2RlID0gJGNvZGU7CisJCX0KKworCXwJXiggdD1UT0tFTl9SRUYgKHRhcmc9QVJHX0FDVElPTik/ICkKKwkJeworCQkJaWYgKCBjdXJyZW50QWx0SGFzQVNUUmV3cml0ZSAmJiAkdC50ZXJtaW5hbE9wdGlvbnMhPW51bGwgJiYKKwkJCQkkdC50ZXJtaW5hbE9wdGlvbnMuZ2V0KEdyYW1tYXIuZGVmYXVsdFRva2VuT3B0aW9uKSE9bnVsbCApCisJCQl7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0hFVEVST19JTExFR0FMX0lOX1JFV1JJVEVfQUxULAorCQkJCQkJCQkJCWdyYW1tYXIsCisJCQkJCQkJCQkJKChHcmFtbWFyQVNUKSgkdCkpLmdldFRva2VuKCksCisJCQkJCQkJCQkJJHQudGV4dCk7CisJCQl9CisJCQlncmFtbWFyLmNoZWNrUnVsZVJlZmVyZW5jZShzY29wZSwgJHQsICR0YXJnLCBjdXJyZW50UnVsZU5hbWUpOworCQkJaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCWlmICggZ3JhbW1hci5nZXRUb2tlblR5cGUoJHQudGV4dCk9PUxhYmVsLkVPRiApCisJCQkJeworCQkJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJsZXhlck1hdGNoRU9GIik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImxleGVyUnVsZVJlZiIpOworCQkJCQlpZiAoIGlzTGlzdExhYmVsKGxhYmVsVGV4dCkgKQorCQkJCQl7CisJCQkJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJsZXhlclJ1bGVSZWZBbmRMaXN0TGFiZWwiKTsKKwkJCQkJfQorCQkJCQlTdHJpbmcgc2NvcGVOYW1lID0gbnVsbDsKKwkJCQkJaWYgKCBzY29wZSE9bnVsbCApCisJCQkJCXsKKwkJCQkJCXNjb3BlTmFtZSA9IHNjb3BlLmdldFRleHQoKTsKKwkJCQkJfQorCQkJCQlSdWxlIHJkZWYyID0gZ3JhbW1hci5nZXRSdWxlKHNjb3BlTmFtZSwgJHQudGV4dCk7CisJCQkJCSRjb2RlLmFkZCgicnVsZSIsIHJkZWYyKTsKKwkJCQkJaWYgKCBzY29wZSE9bnVsbCApCisJCQkJCXsgLy8gc2NvcGVkIHJ1bGUgcmVmCisJCQkJCQlHcmFtbWFyIHNjb3BlRyA9IGdyYW1tYXIuY29tcG9zaXRlLmdldEdyYW1tYXIoc2NvcGUuZ2V0VGV4dCgpKTsKKwkJCQkJCSRjb2RlLmFkZCgic2NvcGUiLCBzY29wZUcpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKCByZGVmMi5ncmFtbWFyICE9IHRoaXMuZ3JhbW1hciApCisJCQkJCXsgLy8gbm9ubG9jYWwKKwkJCQkJCS8vIGlmIHJ1bGUgZGVmaW5pdGlvbiBpcyBub3QgaW4gdGhpcyBncmFtbWFyLCBpdCdzIG5vbmxvY2FsCisJCQkJCQkkY29kZS5hZGQoInNjb3BlIiwgcmRlZjIuZ3JhbW1hcik7CisJCQkJCX0KKwkJCQkJaWYgKCAkdGFyZyE9bnVsbCApCisJCQkJCXsKKwkJCQkJCUxpc3QgYXJncyA9IGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCR0YXJnKTsKKwkJCQkJCSRjb2RlLmFkZCgiYXJncyIsIGFyZ3MpOworCQkJCQl9CisJCQkJfQorCQkJCWludCBpID0gKChDb21tb25Ub2tlbikkdC5nZXRUb2tlbigpKS5nZXRUb2tlbkluZGV4KCk7CisJCQkJJGNvZGUuYWRkKCJlbGVtZW50SW5kZXgiLCBpKTsKKwkJCQlpZiAoIGxhYmVsIT1udWxsICkKKwkJCQkJJGNvZGUuYWRkKCJsYWJlbCIsIGxhYmVsVGV4dCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJJGNvZGUgPSBnZXRUb2tlbkVsZW1lbnRTVCgidG9rZW5SZWYiLCAkdC50ZXh0LCAkdCwgYXN0U3VmZml4LCBsYWJlbFRleHQpOworCQkJCVN0cmluZyB0b2tlbkxhYmVsID0KKwkJCQkJZ2VuZXJhdG9yLmdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwoZ3JhbW1hci5nZXRUb2tlblR5cGUodC5nZXRUZXh0KCkpKTsKKwkJCQkkY29kZS5hZGQoInRva2VuIix0b2tlbkxhYmVsKTsKKwkJCQlpZiAoICFjdXJyZW50QWx0SGFzQVNUUmV3cml0ZSAmJiAkdC50ZXJtaW5hbE9wdGlvbnMhPW51bGwgKQorCQkJCXsKKwkJCQkJJGNvZGUuYWRkKCJ0ZXJtaW5hbE9wdGlvbnMiLCAkdC50ZXJtaW5hbE9wdGlvbnMpOworCQkJCX0KKwkJCQlpbnQgaSA9ICgoQ29tbW9uVG9rZW4pJHQuZ2V0VG9rZW4oKSkuZ2V0VG9rZW5JbmRleCgpOworCQkJCSRjb2RlLmFkZCgiZWxlbWVudEluZGV4IiwgaSk7CisJCQkJZ2VuZXJhdG9yLmdlbmVyYXRlTG9jYWxGT0xMT1coJHQsdG9rZW5MYWJlbCxjdXJyZW50UnVsZU5hbWUsaSk7CisJCQl9CisJCQkkdC5jb2RlID0gJGNvZGU7CisJCX0KKworCXwJYz1DSEFSX0xJVEVSQUwKKwkJeworCQkJaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImNoYXJSZWYiKTsKKwkJCQkkY29kZS5hZGQoImNoYXIiLAorCQkJCSAgIGdlbmVyYXRvci50YXJnZXQuZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbChnZW5lcmF0b3IsJGMudGV4dCkpOworCQkJCWlmICggbGFiZWwhPW51bGwgKQorCQkJCXsKKwkJCQkJJGNvZGUuYWRkKCJsYWJlbCIsIGxhYmVsVGV4dCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7IC8vIGVsc2UgaXQncyBhIHRva2VuIHR5cGUgcmVmZXJlbmNlCisJCQkJJGNvZGUgPSBnZXRUb2tlbkVsZW1lbnRTVCgidG9rZW5SZWYiLCAiY2hhcl9saXRlcmFsIiwgJGMsIGFzdFN1ZmZpeCwgbGFiZWxUZXh0KTsKKwkJCQlTdHJpbmcgdG9rZW5MYWJlbCA9IGdlbmVyYXRvci5nZXRUb2tlblR5cGVBc1RhcmdldExhYmVsKGdyYW1tYXIuZ2V0VG9rZW5UeXBlKCRjLnRleHQpKTsKKwkJCQkkY29kZS5hZGQoInRva2VuIix0b2tlbkxhYmVsKTsKKwkJCQlpZiAoICRjLnRlcm1pbmFsT3B0aW9ucyE9bnVsbCApIHsKKwkJCQkJJGNvZGUuYWRkKCJ0ZXJtaW5hbE9wdGlvbnMiLCRjLnRlcm1pbmFsT3B0aW9ucyk7CisJCQkJfQorCQkJCWludCBpID0gKChDb21tb25Ub2tlbikkYy5nZXRUb2tlbigpKS5nZXRUb2tlbkluZGV4KCk7CisJCQkJJGNvZGUuYWRkKCJlbGVtZW50SW5kZXgiLCBpKTsKKwkJCQlnZW5lcmF0b3IuZ2VuZXJhdGVMb2NhbEZPTExPVygkYyx0b2tlbkxhYmVsLGN1cnJlbnRSdWxlTmFtZSxpKTsKKwkJCX0KKwkJfQorCisJfAlzPVNUUklOR19MSVRFUkFMCisJCXsKKwkJCWludCBpID0gKChDb21tb25Ub2tlbikkcy5nZXRUb2tlbigpKS5nZXRUb2tlbkluZGV4KCk7CisJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQl7CisJCQkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigibGV4ZXJTdHJpbmdSZWYiKTsKKwkJCQkkY29kZS5hZGQoInN0cmluZyIsCisJCQkJCWdlbmVyYXRvci50YXJnZXQuZ2V0VGFyZ2V0U3RyaW5nTGl0ZXJhbEZyb21BTlRMUlN0cmluZ0xpdGVyYWwoZ2VuZXJhdG9yLCRzLnRleHQpKTsKKwkJCQkkY29kZS5hZGQoImVsZW1lbnRJbmRleCIsIGkpOworCQkJCWlmICggbGFiZWwhPW51bGwgKQorCQkJCXsKKwkJCQkJJGNvZGUuYWRkKCJsYWJlbCIsIGxhYmVsVGV4dCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIGVsc2UgaXQncyBhIHRva2VuIHR5cGUgcmVmZXJlbmNlCisJCQkJJGNvZGUgPSBnZXRUb2tlbkVsZW1lbnRTVCgidG9rZW5SZWYiLCAic3RyaW5nX2xpdGVyYWwiLCAkcywgYXN0U3VmZml4LCBsYWJlbFRleHQpOworCQkJCVN0cmluZyB0b2tlbkxhYmVsID0KKwkJCQkJZ2VuZXJhdG9yLmdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwoZ3JhbW1hci5nZXRUb2tlblR5cGUoJHMudGV4dCkpOworCQkJCSRjb2RlLmFkZCgidG9rZW4iLHRva2VuTGFiZWwpOworCQkJCWlmICggJHMudGVybWluYWxPcHRpb25zIT1udWxsICkKKwkJCQl7CisJCQkJCSRjb2RlLmFkZCgidGVybWluYWxPcHRpb25zIiwkcy50ZXJtaW5hbE9wdGlvbnMpOworCQkJCX0KKwkJCQkkY29kZS5hZGQoImVsZW1lbnRJbmRleCIsIGkpOworCQkJCWdlbmVyYXRvci5nZW5lcmF0ZUxvY2FsRk9MTE9XKCRzLHRva2VuTGFiZWwsY3VycmVudFJ1bGVOYW1lLGkpOworCQkJfQorCQl9CisKKwl8CXc9V0lMRENBUkQKKwkJeworCQkJJGNvZGUgPSBnZXRXaWxkY2FyZFNUKCR3LGFzdFN1ZmZpeCxsYWJlbFRleHQpOworCQkJJGNvZGUuYWRkKCJlbGVtZW50SW5kZXgiLCAoKENvbW1vblRva2VuKSR3LmdldFRva2VuKCkpLmdldFRva2VuSW5kZXgoKSk7CisJCX0KKworCXwJXihET1QgSUQgYT1hdG9tWyRJRCwgbGFiZWwsIGFzdFN1ZmZpeF0pIC8vIHNjb3BlIG92ZXJyaWRlIG9uIHJ1bGUgb3IgdG9rZW4KKwkJeyAkY29kZSA9ICRhLmNvZGU7IH0KKworCXwJc2V0W2xhYmVsLGFzdFN1ZmZpeF0KKwkJeyAkY29kZSA9ICRzZXQuY29kZTsgfQorCTsKKworYXN0X3N1ZmZpeAorCToJUk9PVAorCXwJQkFORworCTsKKworc2V0W0dyYW1tYXJBU1QgbGFiZWwsIEdyYW1tYXJBU1QgYXN0U3VmZml4XSByZXR1cm5zIFtTVCBjb2RlPW51bGxdCitAaW5pdAoreworCVN0cmluZyBsYWJlbFRleHQ9bnVsbDsKKwlpZiAoICRsYWJlbCE9bnVsbCApCisJeworCQlsYWJlbFRleHQgPSAkbGFiZWwuZ2V0VGV4dCgpOworCX0KK30KKwk6CV4ocz1CTE9DSyAuKikgLy8gb25seSBjYXJlIHRoYXQgaXQncyBhIEJMT0NLIHdpdGggc2V0VmFsdWUhPW51bGwKKwkJeworCQkJJGNvZGUgPSBnZXRUb2tlbkVsZW1lbnRTVCgibWF0Y2hTZXQiLCAic2V0IiwgJHMsIGFzdFN1ZmZpeCwgbGFiZWxUZXh0KTsKKwkJCWludCBpID0gKChDb21tb25Ub2tlbikkcy5nZXRUb2tlbigpKS5nZXRUb2tlbkluZGV4KCk7CisJCQkkY29kZS5hZGQoImVsZW1lbnRJbmRleCIsIGkpOworCQkJaWYgKCBncmFtbWFyLnR5cGUhPUdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCWdlbmVyYXRvci5nZW5lcmF0ZUxvY2FsRk9MTE9XKCRzLCJzZXQiLGN1cnJlbnRSdWxlTmFtZSxpKTsKKwkJCX0KKwkJCSRjb2RlLmFkZCgicyIsIGdlbmVyYXRvci5nZW5TZXRFeHByKHRlbXBsYXRlcywkcy5nZXRTZXRWYWx1ZSgpLDEsZmFsc2UpKTsKKwkJfQorCTsKKworc2V0RWxlbWVudAorCToJQ0hBUl9MSVRFUkFMCisJfAlUT0tFTl9SRUYKKwl8CVNUUklOR19MSVRFUkFMCisJfAleKENIQVJfUkFOR0UgQ0hBUl9MSVRFUkFMIENIQVJfTElURVJBTCkKKwk7CisKKy8vIFJFV1JJVEUgc3R1ZmYKKworcmV3cml0ZSByZXR1cm5zIFtTVCBjb2RlPW51bGxdCitAaW5pdAoreworCWlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDAgKQorCXsKKwkJaWYgKCAkc3RhcnQuZ2V0VHlwZSgpPT1SRVdSSVRFUyApCisJCXsKKwkJCWlmICggZ2VuZXJhdG9yLmdyYW1tYXIuYnVpbGRUZW1wbGF0ZSgpICkKKwkJCXsKKwkJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZXdyaXRlVGVtcGxhdGUiKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZXdyaXRlQ29kZSIpOworCQkJCSRjb2RlLmFkZCgidHJlZUxldmVsIiwgT1VURVJfUkVXUklURV9ORVNUSU5HX0xFVkVMKTsKKwkJCQkkY29kZS5hZGQoInJld3JpdGVCbG9ja0xldmVsIiwgT1VURVJfUkVXUklURV9ORVNUSU5HX0xFVkVMKTsKKwkJCQkkY29kZS5hZGQoInJlZmVyZW5jZWRFbGVtZW50c0RlZXAiLAorCQkJCQkJCQkgIGdldFRva2VuVHlwZXNBc1RhcmdldExhYmVscygkc3RhcnQucmV3cml0ZVJlZnNEZWVwKSk7CisJCQkJU2V0PFN0cmluZz4gdG9rZW5MYWJlbHMgPQorCQkJCQlncmFtbWFyLmdldExhYmVscygkc3RhcnQucmV3cml0ZVJlZnNEZWVwLCBHcmFtbWFyLlRPS0VOX0xBQkVMKTsKKwkJCQlTZXQ8U3RyaW5nPiB0b2tlbkxpc3RMYWJlbHMgPQorCQkJCQlncmFtbWFyLmdldExhYmVscygkc3RhcnQucmV3cml0ZVJlZnNEZWVwLCBHcmFtbWFyLlRPS0VOX0xJU1RfTEFCRUwpOworCQkJCVNldDxTdHJpbmc+IHJ1bGVMYWJlbHMgPQorCQkJCQlncmFtbWFyLmdldExhYmVscygkc3RhcnQucmV3cml0ZVJlZnNEZWVwLCBHcmFtbWFyLlJVTEVfTEFCRUwpOworCQkJCVNldDxTdHJpbmc+IHJ1bGVMaXN0TGFiZWxzID0KKwkJCQkJZ3JhbW1hci5nZXRMYWJlbHMoJHN0YXJ0LnJld3JpdGVSZWZzRGVlcCwgR3JhbW1hci5SVUxFX0xJU1RfTEFCRUwpOworCQkJCVNldDxTdHJpbmc+IHdpbGRjYXJkTGFiZWxzID0KKwkJCQkJZ3JhbW1hci5nZXRMYWJlbHMoJHN0YXJ0LnJld3JpdGVSZWZzRGVlcCwgR3JhbW1hci5XSUxEQ0FSRF9UUkVFX0xBQkVMKTsKKwkJCQlTZXQ8U3RyaW5nPiB3aWxkY2FyZExpc3RMYWJlbHMgPQorCQkJCQlncmFtbWFyLmdldExhYmVscygkc3RhcnQucmV3cml0ZVJlZnNEZWVwLCBHcmFtbWFyLldJTERDQVJEX1RSRUVfTElTVF9MQUJFTCk7CisJCQkJLy8ganVzdCBpbiBjYXNlIHRoZXkgcmVmICRyIGZvciAicHJldmlvdXMgdmFsdWUiLCBtYWtlIGEgc3RyZWFtCisJCQkJLy8gZnJvbSByZXR2YWwudHJlZQorCQkJCVNUIHJldHZhbFNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInByZXZSdWxlUm9vdFJlZiIpOworCQkJCXJ1bGVMYWJlbHMuYWRkKHJldHZhbFNULnJlbmRlcigpKTsKKwkJCQkkY29kZS5hZGQoInJlZmVyZW5jZWRUb2tlbkxhYmVscyIsIHRva2VuTGFiZWxzKTsKKwkJCQkkY29kZS5hZGQoInJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHMiLCB0b2tlbkxpc3RMYWJlbHMpOworCQkJCSRjb2RlLmFkZCgicmVmZXJlbmNlZFJ1bGVMYWJlbHMiLCBydWxlTGFiZWxzKTsKKwkJCQkkY29kZS5hZGQoInJlZmVyZW5jZWRSdWxlTGlzdExhYmVscyIsIHJ1bGVMaXN0TGFiZWxzKTsKKwkJCQkkY29kZS5hZGQoInJlZmVyZW5jZWRXaWxkY2FyZExhYmVscyIsIHdpbGRjYXJkTGFiZWxzKTsKKwkJCQkkY29kZS5hZGQoInJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHMiLCB3aWxkY2FyZExpc3RMYWJlbHMpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoIm5vUmV3cml0ZSIpOworCQkJCSRjb2RlLmFkZCgidHJlZUxldmVsIiwgT1VURVJfUkVXUklURV9ORVNUSU5HX0xFVkVMKTsKKwkJCQkkY29kZS5hZGQoInJld3JpdGVCbG9ja0xldmVsIiwgT1VURVJfUkVXUklURV9ORVNUSU5HX0xFVkVMKTsKKwkJfQorCX0KK30KKwk6CV4oCVJFV1JJVEVTCisJCQkoCisJCQkJe3Jld3JpdGVSdWxlUmVmcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTt9CisJCQkJXiggcj1SRVdSSVRFIChwcmVkPVNFTVBSRUQpPyBhbHQ9cmV3cml0ZV9hbHRlcm5hdGl2ZSkKKwkJCQl7CisJCQkJCXJld3JpdGVCbG9ja05lc3RpbmdMZXZlbCA9IE9VVEVSX1JFV1JJVEVfTkVTVElOR19MRVZFTDsKKwkJCQkJTGlzdCBwcmVkQ2h1bmtzID0gbnVsbDsKKwkJCQkJaWYgKCAkcHJlZCE9bnVsbCApCisJCQkJCXsKKwkJCQkJCS8vcHJlZFRleHQgPSAjcHJlZC5nZXRUZXh0KCk7CisJCQkJCQlwcmVkQ2h1bmtzID0gZ2VuZXJhdG9yLnRyYW5zbGF0ZUFjdGlvbihjdXJyZW50UnVsZU5hbWUsJHByZWQpOworCQkJCQl9CisJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9CisJCQkJCQlncmFtbWFyLmdyYW1tYXJUcmVlVG9TdHJpbmcoJHIsZmFsc2UpOworCQkJCQlkZXNjcmlwdGlvbiA9IGdlbmVyYXRvci50YXJnZXQuZ2V0VGFyZ2V0U3RyaW5nTGl0ZXJhbEZyb21TdHJpbmcoZGVzY3JpcHRpb24pOworCQkJCQkkY29kZS5hZGRBZ2dyKCJhbHRzLntwcmVkLGFsdCxkZXNjcmlwdGlvbn0iLAorCQkJCQkJCQkJICBwcmVkQ2h1bmtzLAorCQkJCQkJCQkJICBhbHQsCisJCQkJCQkJCQkgIGRlc2NyaXB0aW9uKTsKKwkJCQkJcHJlZD1udWxsOworCQkJCX0KKwkJCSkqCisJCSkKKwl8CisJOworCityZXdyaXRlX2Jsb2NrW1N0cmluZyBibG9ja1RlbXBsYXRlTmFtZV0gcmV0dXJucyBbU1QgY29kZT1udWxsXQorQGluaXQKK3sKKwlyZXdyaXRlQmxvY2tOZXN0aW5nTGV2ZWwrKzsKKwlTVCBzYXZlX2N1cnJlbnRCbG9ja1NUID0gY3VycmVudEJsb2NrU1Q7CisJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCApCisJeworCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKGJsb2NrVGVtcGxhdGVOYW1lKTsKKwkJY3VycmVudEJsb2NrU1QgPSAkY29kZTsKKwkJJGNvZGUuYWRkKCJyZXdyaXRlQmxvY2tMZXZlbCIsIHJld3JpdGVCbG9ja05lc3RpbmdMZXZlbCk7CisJfQorfQorCToJXigJQkxPQ0sKKwkJCXsKKwkJCQljdXJyZW50QmxvY2tTVC5hZGQoInJlZmVyZW5jZWRFbGVtZW50c0RlZXAiLAorCQkJCQlnZXRUb2tlblR5cGVzQXNUYXJnZXRMYWJlbHMoJEJMT0NLLnJld3JpdGVSZWZzRGVlcCkpOworCQkJCWN1cnJlbnRCbG9ja1NULmFkZCgicmVmZXJlbmNlZEVsZW1lbnRzIiwKKwkJCQkJZ2V0VG9rZW5UeXBlc0FzVGFyZ2V0TGFiZWxzKCRCTE9DSy5yZXdyaXRlUmVmc1NoYWxsb3cpKTsKKwkJCX0KKwkJCWFsdD1yZXdyaXRlX2FsdGVybmF0aXZlCisJCQlFT0IKKwkJKQorCQl7CisJCQkkY29kZS5hZGQoImFsdCIsICRhbHQuY29kZSk7CisJCX0KKwk7CitmaW5hbGx5IHsgcmV3cml0ZUJsb2NrTmVzdGluZ0xldmVsLS07IGN1cnJlbnRCbG9ja1NUID0gc2F2ZV9jdXJyZW50QmxvY2tTVDsgfQorCityZXdyaXRlX2FsdGVybmF0aXZlIHJldHVybnMgW1NUIGNvZGU9bnVsbF0KKwk6CXtnZW5lcmF0b3IuZ3JhbW1hci5idWlsZEFTVCgpfT8KKwkJXigJYT1BTFQgeyRjb2RlPXRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZXdyaXRlRWxlbWVudExpc3QiKTt9CisJCQkoCSgKKwkJCQkJZWw9cmV3cml0ZV9lbGVtZW50CisJCQkJCXskY29kZS5hZGRBZ2dyKCJlbGVtZW50cy57ZWwsbGluZSxwb3N9IiwKKwkJCQkJCQkJCQkkZWwuY29kZSwKKwkJCQkJCQkJCQkkZWwuc3RhcnQuZ2V0TGluZSgpLAorCQkJCQkJCQkJCSRlbC5zdGFydC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSArIDEKKwkJCQkJCQkJCQkpOworCQkJCQl9CisJCQkJKSsKKwkJCXwJRVBTSUxPTgorCQkJCXskY29kZS5hZGRBZ2dyKCJlbGVtZW50cy57ZWwsbGluZSxwb3N9IiwKKwkJCQkJCQkJICAgdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJld3JpdGVFbXB0eUFsdCIpLAorCQkJCQkJCQkgICAkYS5nZXRMaW5lKCksCisJCQkJCQkJCSAgICRhLmdldENoYXJQb3NpdGlvbkluTGluZSgpICsgMQorCQkJCQkJCQkgICApOworCQkJCX0KKwkJCSkKKwkJCUVPQQorCQkgKQorCisJfAl7Z2VuZXJhdG9yLmdyYW1tYXIuYnVpbGRUZW1wbGF0ZSgpfT8gcmV3cml0ZV90ZW1wbGF0ZQorCQl7ICRjb2RlID0gJHJld3JpdGVfdGVtcGxhdGUuY29kZTsgfQorCisJfAkvLyByZXByb2R1Y2Ugc2FtZSBpbnB1dCAob25seSBBU1QgYXQgbW9tZW50KQorCQlFVEMKKwk7CisKK3Jld3JpdGVfZWxlbWVudCByZXR1cm5zIFtTVCBjb2RlPW51bGxdCitAaW5pdAoreworCUludFNldCBlbGVtZW50cz1udWxsOworCUdyYW1tYXJBU1QgYXN0ID0gbnVsbDsKK30KKwk6CXJld3JpdGVfYXRvbVtmYWxzZV0KKwkJeyAkY29kZSA9ICRyZXdyaXRlX2F0b20uY29kZTsgfQorCXwJcmV3cml0ZV9lYm5mCisJCXsgJGNvZGUgPSAkcmV3cml0ZV9lYm5mLmNvZGU7IH0KKwl8CXJld3JpdGVfdHJlZQorCQl7ICRjb2RlID0gJHJld3JpdGVfdHJlZS5jb2RlOyB9CisJOworCityZXdyaXRlX2VibmYgcmV0dXJucyBbU1QgY29kZT1udWxsXQorCToJXiggT1BUSU9OQUwgcmV3cml0ZV9ibG9ja1sicmV3cml0ZU9wdGlvbmFsQmxvY2siXSApCisJCXsgJGNvZGUgPSAkcmV3cml0ZV9ibG9jay5jb2RlOyB9CisJCXsKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKTsKKwkJCWRlc2NyaXB0aW9uID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhkZXNjcmlwdGlvbik7CisJCQkkY29kZS5hZGQoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworCQl9CisJfAleKCBDTE9TVVJFIHJld3JpdGVfYmxvY2tbInJld3JpdGVDbG9zdXJlQmxvY2siXSApCisJCXsgJGNvZGUgPSAkcmV3cml0ZV9ibG9jay5jb2RlOyB9CisJCXsKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKTsKKwkJCWRlc2NyaXB0aW9uID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhkZXNjcmlwdGlvbik7CisJCQkkY29kZS5hZGQoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworCQl9CisJfAleKCBQT1NJVElWRV9DTE9TVVJFIHJld3JpdGVfYmxvY2tbInJld3JpdGVQb3NpdGl2ZUNsb3N1cmVCbG9jayJdICkKKwkJeyAkY29kZSA9ICRyZXdyaXRlX2Jsb2NrLmNvZGU7IH0KKwkJeworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ3JhbW1hci5ncmFtbWFyVHJlZVRvU3RyaW5nKCRzdGFydCwgZmFsc2UpOworCQkJZGVzY3JpcHRpb24gPSBnZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGRlc2NyaXB0aW9uKTsKKwkJCSRjb2RlLmFkZCgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisJCX0KKwk7CisKK3Jld3JpdGVfdHJlZSByZXR1cm5zIFtTVCBjb2RlXQorQGluaXQKK3sKKwlyZXdyaXRlVHJlZU5lc3RpbmdMZXZlbCsrOworCWlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDAgKQorCXsKKwkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmV3cml0ZVRyZWUiKTsKKwkJJGNvZGUuYWRkKCJ0cmVlTGV2ZWwiLCByZXdyaXRlVHJlZU5lc3RpbmdMZXZlbCk7CisJCSRjb2RlLmFkZCgiZW5jbG9zaW5nVHJlZUxldmVsIiwgcmV3cml0ZVRyZWVOZXN0aW5nTGV2ZWwtMSk7CisJfQorfQorCToJXigJVFJFRV9CRUdJTgorCQkJcj1yZXdyaXRlX2F0b21bdHJ1ZV0KKwkJCXsKKwkJCQkkY29kZS5hZGRBZ2dyKCJyb290LntlbCxsaW5lLHBvc30iLAorCQkJCQkJCQkgICAkci5jb2RlLAorCQkJCQkJCQkgICAkci5zdGFydC5nZXRMaW5lKCksCisJCQkJCQkJCSAgICRyLnN0YXJ0LmdldENoYXJQb3NpdGlvbkluTGluZSgpICsgMQorCQkJCQkJCQkgICk7CisJCQl9CisJCQkoCisJCQkgIGVsPXJld3JpdGVfZWxlbWVudAorCQkJICB7CisJCQkJJGNvZGUuYWRkQWdncigiY2hpbGRyZW4ue2VsLGxpbmUscG9zfSIsCisJCQkJCQkJCQkkZWwuY29kZSwKKwkJCQkJCQkJCSRlbC5zdGFydC5nZXRMaW5lKCksCisJCQkJCQkJCQkkZWwuc3RhcnQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkgKyAxCisJCQkJCQkJCQkpOworCQkJICB9CisJCQkpKgorCQkpCisJCXsKKwkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKTsKKwkJCWRlc2NyaXB0aW9uID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhkZXNjcmlwdGlvbik7CisJCQkkY29kZS5hZGQoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworCQl9CisJOworZmluYWxseSB7IHJld3JpdGVUcmVlTmVzdGluZ0xldmVsLS07IH0KKworcmV3cml0ZV9hdG9tW2Jvb2xlYW4gaXNSb290XSByZXR1cm5zIFtTVCBjb2RlPW51bGxdCisJOiAgIHI9UlVMRV9SRUYKKwkJeworCQkJU3RyaW5nIHJ1bGVSZWZOYW1lID0gJHIudGV4dDsKKwkJCVN0cmluZyBzdE5hbWUgPSAicmV3cml0ZVJ1bGVSZWYiOworCQkJaWYgKCBpc1Jvb3QgKQorCQkJeworCQkJCXN0TmFtZSArPSAiUm9vdCI7CisJCQl9CisJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKHN0TmFtZSk7CisJCQkkY29kZS5hZGQoInJ1bGUiLCBydWxlUmVmTmFtZSk7CisJCQlpZiAoIGdyYW1tYXIuZ2V0UnVsZShydWxlUmVmTmFtZSk9PW51bGwgKQorCQkJeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19VTkRFRklORURfUlVMRV9SRUYsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgKChHcmFtbWFyQVNUKSgkcikpLmdldFRva2VuKCksCisJCQkJCQkJCQkJICBydWxlUmVmTmFtZSk7CisJCQkJJGNvZGUgPSBuZXcgU1QoIiIpOyAvLyBibGFuazsgbm8gY29kZSBnZW4KKwkJCX0KKwkJCWVsc2UgaWYgKCBncmFtbWFyLmdldFJ1bGUoY3VycmVudFJ1bGVOYW1lKQorCQkJCQkJIC5nZXRSdWxlUmVmc0luQWx0KHJ1bGVSZWZOYW1lLG91dGVyQWx0TnVtKT09bnVsbCApCisJCQl7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1JFV1JJVEVfRUxFTUVOVF9OT1RfUFJFU0VOVF9PTl9MSFMsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgKChHcmFtbWFyQVNUKSgkcikpLmdldFRva2VuKCksCisJCQkJCQkJCQkJICBydWxlUmVmTmFtZSk7CisJCQkJJGNvZGUgPSBuZXcgU1QoIiIpOyAvLyBibGFuazsgbm8gY29kZSBnZW4KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyB0cmFjayBhbGwgcnVsZSByZWZzIGFzIHdlIG11c3QgY29weSAybmQgcmVmIHRvIHJ1bGUgYW5kIGJleW9uZAorCQkJCWlmICggIXJld3JpdGVSdWxlUmVmcy5jb250YWlucyhydWxlUmVmTmFtZSkgKQorCQkJCXsKKwkJCQkJcmV3cml0ZVJ1bGVSZWZzLmFkZChydWxlUmVmTmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwl8CisJCSgJXih0az1UT0tFTl9SRUYgKGFyZz1BUkdfQUNUSU9OKT8pCisJCXwJY2w9Q0hBUl9MSVRFUkFMCisJCXwJc2w9U1RSSU5HX0xJVEVSQUwKKwkJKQorCQl7CisJCQlHcmFtbWFyQVNUIHRlcm0gPSAkdGs7CisJCQlpZiAodGVybSA9PSBudWxsKSB0ZXJtID0gJGNsOworCQkJaWYgKHRlcm0gPT0gbnVsbCkgdGVybSA9ICRzbDsKKwkJCVN0cmluZyB0b2tlbk5hbWUgPSAkc3RhcnQuZ2V0VG9rZW4oKS5nZXRUZXh0KCk7CisJCQlTdHJpbmcgc3ROYW1lID0gInJld3JpdGVUb2tlblJlZiI7CisJCQlSdWxlIHJ1bGUgPSBncmFtbWFyLmdldFJ1bGUoY3VycmVudFJ1bGVOYW1lKTsKKwkJCUNvbGxlY3Rpb248U3RyaW5nPiB0b2tlblJlZnNJbkFsdCA9IHJ1bGUuZ2V0VG9rZW5SZWZzSW5BbHQob3V0ZXJBbHROdW0pOworCQkJYm9vbGVhbiBjcmVhdGVOZXdOb2RlID0gIXRva2VuUmVmc0luQWx0LmNvbnRhaW5zKHRva2VuTmFtZSkgfHwgJGFyZyE9bnVsbDsKKwkJCWlmICggY3JlYXRlTmV3Tm9kZSApCisJCQl7CisJCQkJc3ROYW1lID0gInJld3JpdGVJbWFnaW5hcnlUb2tlblJlZiI7CisJCQl9CisJCQlpZiAoIGlzUm9vdCApCisJCQl7CisJCQkJc3ROYW1lICs9ICJSb290IjsKKwkJCX0KKwkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2Yoc3ROYW1lKTsKKwkJCSRjb2RlLmFkZCgidGVybWluYWxPcHRpb25zIix0ZXJtLnRlcm1pbmFsT3B0aW9ucyk7CisJCQlpZiAoICRhcmchPW51bGwgKQorCQkJeworCQkJCUxpc3QgYXJncyA9IGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRhcmcpOworCQkJCSRjb2RlLmFkZCgiYXJncyIsIGFyZ3MpOworCQkJfQorCQkJJGNvZGUuYWRkKCJlbGVtZW50SW5kZXgiLCAoKENvbW1vblRva2VuKSRzdGFydC5nZXRUb2tlbigpKS5nZXRUb2tlbkluZGV4KCkpOworCQkJaW50IHR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUodG9rZW5OYW1lKTsKKwkJCVN0cmluZyB0b2sgPSBnZW5lcmF0b3IuZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbCh0dHlwZSk7CisJCQkkY29kZS5hZGQoInRva2VuIiwgdG9rKTsKKwkJCWlmICggZ3JhbW1hci5nZXRUb2tlblR5cGUodG9rZW5OYW1lKT09TGFiZWwuSU5WQUxJRCApCisJCQl7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1VOREVGSU5FRF9UT0tFTl9SRUZfSU5fUkVXUklURSwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICAoKEdyYW1tYXJBU1QpKCRzdGFydCkpLmdldFRva2VuKCksCisJCQkJCQkJCQkJICB0b2tlbk5hbWUpOworCQkJCSRjb2RlID0gbmV3IFNUKCIiKTsgLy8gYmxhbms7IG5vIGNvZGUgZ2VuCisJCQl9CisJCX0KKworCXwJTEFCRUwKKwkJeworCQkJU3RyaW5nIGxhYmVsTmFtZSA9ICRMQUJFTC50ZXh0OworCQkJUnVsZSBydWxlID0gZ3JhbW1hci5nZXRSdWxlKGN1cnJlbnRSdWxlTmFtZSk7CisJCQlHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIgcGFpciA9IHJ1bGUuZ2V0TGFiZWwobGFiZWxOYW1lKTsKKwkJCWlmICggbGFiZWxOYW1lLmVxdWFscyhjdXJyZW50UnVsZU5hbWUpICkKKwkJCXsKKwkJCQkvLyBzcGVjaWFsIGNhc2U7IHJlZiB0byBvbGQgdmFsdWUgdmlhICQgcnVsZQorCQkJCWlmICggcnVsZS5oYXNSZXdyaXRlKG91dGVyQWx0TnVtKSAmJgorCQkJCQkgcnVsZS5nZXRSdWxlUmVmc0luQWx0KG91dGVyQWx0TnVtKS5jb250YWlucyhsYWJlbE5hbWUpICkKKwkJCQl7CisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19SVUxFX1JFRl9BTUJJR19XSVRIX1JVTEVfSU5fQUxULAorCQkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJCSAgKChHcmFtbWFyQVNUKSgkTEFCRUwpKS5nZXRUb2tlbigpLAorCQkJCQkJCQkJCQkgIGxhYmVsTmFtZSk7CisJCQkJfQorCQkJCVNUIGxhYmVsU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicHJldlJ1bGVSb290UmVmIik7CisJCQkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmV3cml0ZVJ1bGVMYWJlbFJlZiIrKGlzUm9vdD8iUm9vdCI6IiIpKTsKKwkJCQkkY29kZS5hZGQoImxhYmVsIiwgbGFiZWxTVCk7CisJCQl9CisJCQllbHNlIGlmICggcGFpcj09bnVsbCApCisJCQl7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1VOREVGSU5FRF9MQUJFTF9SRUZfSU5fUkVXUklURSwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICAoKEdyYW1tYXJBU1QpKCRMQUJFTCkpLmdldFRva2VuKCksCisJCQkJCQkJCQkJICBsYWJlbE5hbWUpOworCQkJCSRjb2RlID0gbmV3IFNUKCIiKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlTdHJpbmcgc3ROYW1lID0gbnVsbDsKKwkJCQlzd2l0Y2ggKCBwYWlyLnR5cGUgKQorCQkJCXsKKwkJCQljYXNlIEdyYW1tYXIuVE9LRU5fTEFCRUwgOgorCQkJCQlzdE5hbWUgPSAicmV3cml0ZVRva2VuTGFiZWxSZWYiOworCQkJCQlicmVhazsKKwkJCQljYXNlIEdyYW1tYXIuV0lMRENBUkRfVFJFRV9MQUJFTCA6CisJCQkJCXN0TmFtZSA9ICJyZXdyaXRlV2lsZGNhcmRMYWJlbFJlZiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgR3JhbW1hci5XSUxEQ0FSRF9UUkVFX0xJU1RfTEFCRUw6CisJCQkJCXN0TmFtZSA9ICJyZXdyaXRlUnVsZUxpc3RMYWJlbFJlZiI7IC8vIGFjdHMgbGlrZSBydWxlIHJlZiBsaXN0IGZvciByZWYKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBHcmFtbWFyLlJVTEVfTEFCRUwgOgorCQkJCQlzdE5hbWUgPSAicmV3cml0ZVJ1bGVMYWJlbFJlZiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgR3JhbW1hci5UT0tFTl9MSVNUX0xBQkVMIDoKKwkJCQkJc3ROYW1lID0gInJld3JpdGVUb2tlbkxpc3RMYWJlbFJlZiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgR3JhbW1hci5SVUxFX0xJU1RfTEFCRUwgOgorCQkJCQlzdE5hbWUgPSAicmV3cml0ZVJ1bGVMaXN0TGFiZWxSZWYiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCBpc1Jvb3QgKQorCQkJCXsKKwkJCQkJc3ROYW1lICs9ICJSb290IjsKKwkJCQl9CisJCQkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZihzdE5hbWUpOworCQkJCSRjb2RlLmFkZCgibGFiZWwiLCBsYWJlbE5hbWUpOworCQkJfQorCQl9CisKKwl8CUFDVElPTgorCQl7CisJCQkvLyBhY3Rpb25zIGluIHJld3JpdGUgcnVsZXMgeWllbGQgYSB0cmVlIG9iamVjdAorCQkJU3RyaW5nIGFjdFRleHQgPSAkQUNUSU9OLnRleHQ7CisJCQlMaXN0IGNodW5rcyA9IGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRBQ1RJT04pOworCQkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmV3cml0ZU5vZGVBY3Rpb24iKyhpc1Jvb3Q/IlJvb3QiOiIiKSk7CisJCQkkY29kZS5hZGQoImFjdGlvbiIsIGNodW5rcyk7CisJCX0KKwk7CisKK3B1YmxpYworcmV3cml0ZV90ZW1wbGF0ZSByZXR1cm5zIFtTVCBjb2RlPW51bGxdCisJOgleKCBBTFQgRVBTSUxPTiBFT0EgKSB7JGNvZGU9dGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJld3JpdGVFbXB0eVRlbXBsYXRlIik7fQorCXwJXigJVEVNUExBVEUgKGlkPUlEfGluZD1BQ1RJT04pCisJCQl7CisJCQkJaWYgKCAkaWQhPW51bGwgJiYgJGlkLnRleHQuZXF1YWxzKCJ0ZW1wbGF0ZSIpICkKKwkJCQl7CisJCQkJCQkkY29kZSA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZXdyaXRlSW5saW5lVGVtcGxhdGUiKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoICRpZCE9bnVsbCApCisJCQkJeworCQkJCQkJJGNvZGUgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmV3cml0ZUV4dGVybmFsVGVtcGxhdGUiKTsKKwkJCQkJCSRjb2RlLmFkZCgibmFtZSIsICRpZC50ZXh0KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoICRpbmQhPW51bGwgKQorCQkJCXsgLy8gbXVzdCBiZSBcJSh7ZXhwcn0pKGFyZ3MpCisJCQkJCSRjb2RlID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJld3JpdGVJbmRpcmVjdFRlbXBsYXRlIik7CisJCQkJCUxpc3QgY2h1bmtzPWdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRpbmQpOworCQkJCQkkY29kZS5hZGQoImV4cHIiLCBjaHVua3MpOworCQkJCX0KKwkJCX0KKwkJCV4oCUFSR0xJU1QKKwkJCQkoCV4oIEFSRyBhcmc9SUQgYT1BQ1RJT04KKwkJCQkJeworCQkJCQkJLy8gbXVzdCBzZXQgYWx0IG51bSBoZXJlIHJhdGhlciB0aGFuIGluIGRlZmluZS5nCisJCQkJCQkvLyBiZWNhdXNlIGFjdGlvbnMgbGlrZSBcJWZvbyhuYW1lPXtcJElELnRleHR9KSBhcmVuJ3QKKwkJCQkJCS8vIGJyb2tlbiB1cCB5ZXQgaW50byB0cmVlcy4KKwkJCQkJCSRhLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCQkJCUxpc3QgY2h1bmtzID0gZ2VuZXJhdG9yLnRyYW5zbGF0ZUFjdGlvbihjdXJyZW50UnVsZU5hbWUsJGEpOworCQkJCQkJJGNvZGUuYWRkQWdncigiYXJncy57bmFtZSx2YWx1ZX0iLCAkYXJnLnRleHQsIGNodW5rcyk7CisJCQkJCX0KKwkJCQkJKQorCQkJCSkqCisJCQkpCisJCQkoCURPVUJMRV9RVU9URV9TVFJJTkdfTElURVJBTAorCQkJCXsKKwkJCQkJU3RyaW5nIHNsID0gJERPVUJMRV9RVU9URV9TVFJJTkdfTElURVJBTC50ZXh0OworCQkJCQlTdHJpbmcgdCA9IHNsLnN1YnN0cmluZyggMSwgc2wubGVuZ3RoKCkgLSAxICk7IC8vIHN0cmlwIHF1b3RlcworCQkJCQl0ID0gZ2VuZXJhdG9yLnRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyh0KTsKKwkJCQkJJGNvZGUuYWRkKCJ0ZW1wbGF0ZSIsdCk7CisJCQkJfQorCQkJfAlET1VCTEVfQU5HTEVfU1RSSU5HX0xJVEVSQUwKKwkJCQl7CisJCQkJCVN0cmluZyBzbCA9ICRET1VCTEVfQU5HTEVfU1RSSU5HX0xJVEVSQUwudGV4dDsKKwkJCQkJU3RyaW5nIHQgPSBzbC5zdWJzdHJpbmcoIDIsIHNsLmxlbmd0aCgpIC0gMiApOyAvLyBzdHJpcCBkb3VibGUgYW5nbGUgcXVvdGVzCisJCQkJCXQgPSBnZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKHQpOworCQkJCQkkY29kZS5hZGQoInRlbXBsYXRlIix0KTsKKwkJCQl9CisJCQkpPworCQkpCisKKwl8CWFjdD1BQ1RJT04KKwkJeworCQkJLy8gc2V0IGFsdCBudW0gZm9yIHNhbWUgcmVhc29uIGFzIEFSR0xJU1QgYWJvdmUKKwkJCSRhY3Qub3V0ZXJBbHROdW0gPSB0aGlzLm91dGVyQWx0TnVtOworCQkJJGNvZGU9dGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJld3JpdGVBY3Rpb24iKTsKKwkJCSRjb2RlLmFkZCgiYWN0aW9uIiwKKwkJCQkJCQkgIGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24oY3VycmVudFJ1bGVOYW1lLCRhY3QpKTsKKwkJfQorCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9EZWZpbmVHcmFtbWFySXRlbXNXYWxrZXIuZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9EZWZpbmVHcmFtbWFySXRlbXNXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDdiYThiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0RlZmluZUdyYW1tYXJJdGVtc1dhbGtlci5nCkBAIC0wLDAgKzEsNzAwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgR3JhbW1hciBjb252ZXJzaW9uIHRvIEFOVExSIHYzOgorIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisJZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLwordHJlZSBncmFtbWFyIERlZmluZUdyYW1tYXJJdGVtc1dhbGtlcjsKKworb3B0aW9ucyB7CisJdG9rZW5Wb2NhYiA9IEFOVExSOworCUFTVExhYmVsVHlwZSA9IEdyYW1tYXJBU1Q7Cit9CisKK3Njb3BlIEF0dHJpYnV0ZVNjb3BlQWN0aW9ucyB7CisJSGFzaE1hcDxHcmFtbWFyQVNULCBHcmFtbWFyQVNUPiBhY3Rpb25zOworfQorCitAaGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmFudGxyLmdyYW1tYXIudjM7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworfQorCitAbWVtYmVycyB7Citwcm90ZWN0ZWQgR3JhbW1hciBncmFtbWFyOworcHJvdGVjdGVkIEdyYW1tYXJBU1Qgcm9vdDsKK3Byb3RlY3RlZCBTdHJpbmcgY3VycmVudFJ1bGVOYW1lOworcHJvdGVjdGVkIEdyYW1tYXJBU1QgY3VycmVudFJld3JpdGVCbG9jazsKK3Byb3RlY3RlZCBHcmFtbWFyQVNUIGN1cnJlbnRSZXdyaXRlUnVsZTsKK3Byb3RlY3RlZCBpbnQgb3V0ZXJBbHROdW0gPSAwOworcHJvdGVjdGVkIGludCBibG9ja0xldmVsID0gMDsKKworcHVibGljIGZpbmFsIGludCBjb3VudEFsdHNGb3JSdWxlKCBDb21tb25UcmVlIHQgKSB7CisgICAgQ29tbW9uVHJlZSBibG9jayA9IChDb21tb25UcmVlKXQuZ2V0Rmlyc3RDaGlsZFdpdGhUeXBlKEJMT0NLKTsKKyAgICBpbnQgYWx0Q291bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2suZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgaWYgKGJsb2NrLmdldENoaWxkKGkpLmdldFR5cGUoKSA9PSBBTFQpCisgICAgICAgICAgICBhbHRDb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gYWx0Q291bnQ7Cit9CisKK3Byb3RlY3RlZCBmaW5hbCB2b2lkIGZpbmlzaCgpIHsKKyAgICB0cmltR3JhbW1hcigpOworfQorCisvKiogUmVtb3ZlIGFueSBsZXhlciBydWxlcyBmcm9tIGEgQ09NQklORUQ7IGFscmVhZHkgcGFzc2VkIHRvIGxleGVyICovCitwcm90ZWN0ZWQgZmluYWwgdm9pZCB0cmltR3JhbW1hcigpIHsKKyAgICBpZiAoIGdyYW1tYXIudHlwZSAhPSBHcmFtbWFyLkNPTUJJTkVEICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGZvcm0gaXMgKGhlYWRlciAuLi4gKSAoIGdyYW1tYXIgSUQgKHNjb3BlIC4uLikgLi4uICggcnVsZSAuLi4gKSAoIHJ1bGUgLi4uICkgLi4uICkKKyAgICBHcmFtbWFyQVNUIHAgPSByb290OworICAgIC8vIGZpbmQgdGhlIGdyYW1tYXIgc3BlYworICAgIHdoaWxlICggIXAuZ2V0VGV4dCgpLmVxdWFscyggImdyYW1tYXIiICkgKSB7CisgICAgICAgIHAgPSAoR3JhbW1hckFTVClwLmdldE5leHRTaWJsaW5nKCk7CisgICAgfQorICAgIGZvciAoIGludCBpID0gMDsgaSA8IHAuZ2V0Q2hpbGRDb3VudCgpOyBpKysgKSB7CisgICAgICAgIGlmICggcC5nZXRDaGlsZCggaSApLmdldFR5cGUoKSAhPSBSVUxFICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFN0cmluZyBydWxlTmFtZSA9IHAuZ2V0Q2hpbGQoaSkuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpOworICAgICAgICAvL0NvbnNvbGUuT3V0LldyaXRlTGluZSggInJ1bGUgIiArIHJ1bGVOYW1lICsgIiBwcmV2PSIgKyBwcmV2LmdldFRleHQoKSApOworICAgICAgICBpZiAoUnVsZS5nZXRSdWxlVHlwZShydWxlTmFtZSkgPT0gR3JhbW1hci5MRVhFUikgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGxleGVyIHJ1bGUKKyAgICAgICAgICAgIHAuZGVsZXRlQ2hpbGQoIGkgKTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL0NvbnNvbGUuT3V0LldyaXRlTGluZSggInJvb3QgYWZ0ZXIgcmVtb3ZhbCBpczogIiArIHJvb3QuVG9TdHJpbmdMaXN0KCkgKTsKK30KKworcHJvdGVjdGVkIGZpbmFsIHZvaWQgdHJhY2tJbmxpbmVBY3Rpb24oIEdyYW1tYXJBU1QgYWN0aW9uQVNUICkgeworICAgIFJ1bGUgciA9IGdyYW1tYXIuZ2V0UnVsZSggY3VycmVudFJ1bGVOYW1lICk7CisgICAgaWYgKCByICE9IG51bGwgKSB7CisgICAgICAgIHIudHJhY2tJbmxpbmVBY3Rpb24oIGFjdGlvbkFTVCApOworICAgIH0KK30KK30KKworcHVibGljCitncmFtbWFyX1tHcmFtbWFyIGddCitAaW5pdAoreworZ3JhbW1hciA9ICRnOworcm9vdCA9ICRzdGFydDsKK30KK0BhZnRlcgoreworZmluaXNoKCk7Cit9CisJOgleKCBMRVhFUl9HUkFNTUFSCXtncmFtbWFyLnR5cGUgPSBHcmFtbWFyLkxFWEVSO30gCQlncmFtbWFyU3BlYyApCisJfAleKCBQQVJTRVJfR1JBTU1BUgl7Z3JhbW1hci50eXBlID0gR3JhbW1hci5QQVJTRVI7fQkJZ3JhbW1hclNwZWMgKQorCXwJXiggVFJFRV9HUkFNTUFSCQl7Z3JhbW1hci50eXBlID0gR3JhbW1hci5UUkVFX1BBUlNFUjt9CWdyYW1tYXJTcGVjICkKKwl8CV4oIENPTUJJTkVEX0dSQU1NQVIJe2dyYW1tYXIudHlwZSA9IEdyYW1tYXIuQ09NQklORUQ7fQkJZ3JhbW1hclNwZWMgKQorCTsKKworYXR0clNjb3BlCitzY29wZSBBdHRyaWJ1dGVTY29wZUFjdGlvbnM7CitAaW5pdAoreworCSRBdHRyaWJ1dGVTY29wZUFjdGlvbnM6OmFjdGlvbnMgPSBuZXcgSGFzaE1hcDxHcmFtbWFyQVNULCBHcmFtbWFyQVNUPigpOworfQorCToJXiggJ3Njb3BlJyBuYW1lPUlEIGF0dHJTY29wZUFjdGlvbiogYXR0cnM9QUNUSU9OICkKKwkJeworCQkJQXR0cmlidXRlU2NvcGUgc2NvcGUgPSBncmFtbWFyLmRlZmluZUdsb2JhbFNjb3BlKCRuYW1lLnRleHQsJGF0dHJzLmdldFRva2VuKCkpOworCQkJc2NvcGUuaXNEeW5hbWljR2xvYmFsU2NvcGUgPSB0cnVlOworCQkJc2NvcGUuYWRkQXR0cmlidXRlcygkYXR0cnMudGV4dCwgJzsnKTsKKwkJCWZvciAoR3JhbW1hckFTVCBhY3Rpb24gOiAkQXR0cmlidXRlU2NvcGVBY3Rpb25zOjphY3Rpb25zLmtleVNldCgpKQorCQkJCXNjb3BlLmRlZmluZU5hbWVkQWN0aW9uKGFjdGlvbiwgJEF0dHJpYnV0ZVNjb3BlQWN0aW9uczo6YWN0aW9ucy5nZXQoYWN0aW9uKSk7CisJCX0KKwk7CisKK2F0dHJTY29wZUFjdGlvbgorCToJXihBTVBFUlNBTkQgSUQgQUNUSU9OKQorCQl7CisJCQkkQXR0cmlidXRlU2NvcGVBY3Rpb25zOjphY3Rpb25zLnB1dCggJElELCAkQUNUSU9OICk7CisJCX0KKwk7CisKK2dyYW1tYXJTcGVjCisJOglpZD1JRAorCQkoY210PURPQ19DT01NRU5UKT8KKwkJKCBvcHRpb25zU3BlYyApPworCQkoZGVsZWdhdGVHcmFtbWFycyk/CisJCSh0b2tlbnNTcGVjKT8KKwkJKGF0dHJTY29wZSkqCisJCShhY3Rpb25zKT8KKwkJcnVsZXMKKwk7CisKK2FjdGlvbnMKKwk6CSggYWN0aW9uICkrCisJOworCithY3Rpb24KK0Bpbml0Cit7CisJU3RyaW5nIHNjb3BlPW51bGw7CisJR3JhbW1hckFTVCBuYW1lQVNUPW51bGwsIGFjdGlvbkFTVD1udWxsOworfQorCToJXihhbXA9QU1QRVJTQU5EIGlkMT1JRAorCQkJKCBpZDI9SUQgYTE9QUNUSU9OCisJCQkgIHtzY29wZT0kaWQxLnRleHQ7IG5hbWVBU1Q9JGlkMjsgYWN0aW9uQVNUPSRhMTt9CisJCQl8IGEyPUFDVElPTgorCQkJICB7c2NvcGU9bnVsbDsgbmFtZUFTVD0kaWQxOyBhY3Rpb25BU1Q9JGEyO30KKwkJCSkKKwkJICkKKwkJIHsKKwkJIGdyYW1tYXIuZGVmaW5lTmFtZWRBY3Rpb24oJGFtcCxzY29wZSxuYW1lQVNULGFjdGlvbkFTVCk7CisJCSB9CisJOworCitvcHRpb25zU3BlYworCToJXihPUFRJT05TIC4qKQorCTsKKworZGVsZWdhdGVHcmFtbWFycworCToJXiggJ2ltcG9ydCcgKCBeKEFTU0lHTiBJRCBJRCkgfCBJRCApKyApCisJOworCit0b2tlbnNTcGVjCisJOgleKFRPS0VOUyB0b2tlblNwZWMqKQorCTsKKwordG9rZW5TcGVjCisJOgl0PVRPS0VOX1JFRgorCXwJXigJQVNTSUdOCisJCQlUT0tFTl9SRUYKKwkJCSgJU1RSSU5HX0xJVEVSQUwKKwkJCXwJQ0hBUl9MSVRFUkFMCisJCQkpCisJCSApCisJOworCitydWxlcworCToJKHJ1bGUgfCBeKFBSRUNfUlVMRSAuKikpKworCTsKKworcnVsZQorQGluaXQKK3sKKwlTdHJpbmcgbmFtZT1udWxsOworCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0cz1udWxsOworCVJ1bGUgciA9IG51bGw7Cit9CisJOgkJXiggUlVMRSBpZD1JRCB7b3B0cyA9ICRSVUxFLmdldEJsb2NrT3B0aW9ucygpO30KKwkJCShtb2RpZmllcik/CisJCQleKCBBUkcgKGFyZ3M9QVJHX0FDVElPTik/ICkKKwkJCV4oIFJFVCAocmV0PUFSR19BQ1RJT04pPyApCisJCQkodGhyb3dzU3BlYyk/CisJCQkob3B0aW9uc1NwZWMpPworCQkJeworCQkJCW5hbWUgPSAkaWQudGV4dDsKKwkJCQljdXJyZW50UnVsZU5hbWUgPSBuYW1lOworCQkJCWlmICggUnVsZS5nZXRSdWxlVHlwZShuYW1lKSA9PSBHcmFtbWFyLkxFWEVSICYmIGdyYW1tYXIudHlwZT09R3JhbW1hci5DT01CSU5FRCApCisJCQkJeworCQkJCQkvLyBhIG1lcmdlZCBncmFtbWFyIHNwZWMsIHRyYWNrIGxleGVyIHJ1bGVzIGFuZCBzZW5kIHRvIGFub3RoZXIgZ3JhbW1hcgorCQkJCQlncmFtbWFyLmRlZmluZUxleGVyUnVsZUZvdW5kSW5QYXJzZXIoJGlkLmdldFRva2VuKCksICRzdGFydCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWludCBudW1BbHRzID0gY291bnRBbHRzRm9yUnVsZSgkc3RhcnQpOworCQkJCQlncmFtbWFyLmRlZmluZVJ1bGUoJGlkLmdldFRva2VuKCksICRtb2RpZmllci5tb2QsIG9wdHMsICRzdGFydCwgJGFyZ3MsIG51bUFsdHMpOworCQkJCQlyID0gZ3JhbW1hci5nZXRSdWxlKG5hbWUpOworCQkJCQlpZiAoICRhcmdzIT1udWxsICkKKwkJCQkJeworCQkJCQkJci5wYXJhbWV0ZXJTY29wZSA9IGdyYW1tYXIuY3JlYXRlUGFyYW1ldGVyU2NvcGUobmFtZSwkYXJncy5nZXRUb2tlbigpKTsKKwkJCQkJCXIucGFyYW1ldGVyU2NvcGUuYWRkQXR0cmlidXRlcygkYXJncy50ZXh0LCAnLCcpOworCQkJCQl9CisJCQkJCWlmICggJHJldCE9bnVsbCApCisJCQkJCXsKKwkJCQkJCXIucmV0dXJuU2NvcGUgPSBncmFtbWFyLmNyZWF0ZVJldHVyblNjb3BlKG5hbWUsJHJldC5nZXRUb2tlbigpKTsKKwkJCQkJCXIucmV0dXJuU2NvcGUuYWRkQXR0cmlidXRlcygkcmV0LnRleHQsICcsJyk7CisJCQkJCX0KKwkJCQkJaWYgKCAkdGhyb3dzU3BlYy5leGNlcHRpb25zICE9IG51bGwgKQorCQkJCQl7CisJCQkJCQlmb3IgKFN0cmluZyBleGNlcHRpb24gOiAkdGhyb3dzU3BlYy5leGNlcHRpb25zKQorCQkJCQkJCXIudGhyb3dzU3BlYy5hZGQoIGV4Y2VwdGlvbiApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJKHJ1bGVTY29wZVNwZWNbcl0pPworCQkJKHJ1bGVBY3Rpb25bcl0pKgorCQkJeyB0aGlzLmJsb2NrTGV2ZWw9MDsgfQorCQkJYj1ibG9jaworCQkJKGV4Y2VwdGlvbkdyb3VwKT8KKwkJCUVPUgorCQkJeworCQkJCS8vIGNvcHkgcnVsZSBvcHRpb25zIGludG8gdGhlIGJsb2NrIEFTVCwgd2hpY2ggaXMgd2hlcmUKKwkJCQkvLyB0aGUgYW5hbHlzaXMgd2lsbCBsb29rIGZvciBrIG9wdGlvbiBldGMuLi4KKwkJCQkkYi5zdGFydC5zZXRCbG9ja09wdGlvbnMob3B0cyk7CisJCQl9CisJCSkKKwk7CisKK3J1bGVBY3Rpb25bUnVsZSByXQorCToJXihhbXA9QU1QRVJTQU5EIGlkPUlEIGE9QUNUSU9OICkge2lmIChyIT1udWxsKSByLmRlZmluZU5hbWVkQWN0aW9uKCRhbXAsJGlkLCRhKTt9CisJOworCittb2RpZmllciByZXR1cm5zIFtTdHJpbmcgbW9kXQorQGluaXQKK3sKKwkkbW9kID0gJHN0YXJ0LmdldFRva2VuKCkuZ2V0VGV4dCgpOworfQorCToJJ3Byb3RlY3RlZCcKKwl8CSdwdWJsaWMnCisJfAkncHJpdmF0ZScKKwl8CSdmcmFnbWVudCcKKwk7CisKK3Rocm93c1NwZWMgcmV0dXJucyBbSGFzaFNldDxTdHJpbmc+IGV4Y2VwdGlvbnNdCitAaW5pdAoreworCSRleGNlcHRpb25zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworfQorCToJXigndGhyb3dzJyAoSUQgeyRleGNlcHRpb25zLmFkZCgkSUQudGV4dCk7fSkrICkKKwk7CisKK3J1bGVTY29wZVNwZWNbUnVsZSByXQorc2NvcGUgQXR0cmlidXRlU2NvcGVBY3Rpb25zOworQGluaXQKK3sKKwkkQXR0cmlidXRlU2NvcGVBY3Rpb25zOjphY3Rpb25zID0gbmV3IEhhc2hNYXA8R3JhbW1hckFTVCwgR3JhbW1hckFTVD4oKTsKK30KKwk6CV4oCSdzY29wZScKKwkJCSgJYXR0clNjb3BlQWN0aW9uKiBhdHRycz1BQ1RJT04KKwkJCQl7CisJCQkJCXIucnVsZVNjb3BlID0gZ3JhbW1hci5jcmVhdGVSdWxlU2NvcGUoci5uYW1lLCRhdHRycy5nZXRUb2tlbigpKTsKKwkJCQkJci5ydWxlU2NvcGUuaXNEeW5hbWljUnVsZVNjb3BlID0gdHJ1ZTsKKwkJCQkJci5ydWxlU2NvcGUuYWRkQXR0cmlidXRlcygkYXR0cnMudGV4dCwgJzsnKTsKKwkJCQkJZm9yIChHcmFtbWFyQVNUIGFjdGlvbiA6ICRBdHRyaWJ1dGVTY29wZUFjdGlvbnM6OmFjdGlvbnMua2V5U2V0KCkpCisJCQkJCQlyLnJ1bGVTY29wZS5kZWZpbmVOYW1lZEFjdGlvbihhY3Rpb24sICRBdHRyaWJ1dGVTY29wZUFjdGlvbnM6OmFjdGlvbnMuZ2V0KGFjdGlvbikpOworCQkJCX0KKwkJCSk/CisJCQkoCXVzZXM9SUQKKwkJCQl7CisJCQkJCWlmICggZ3JhbW1hci5nZXRHbG9iYWxTY29wZSgkdXNlcy50ZXh0KT09bnVsbCApIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1VOS05PV05fRFlOQU1JQ19TQ09QRSwKKwkJCQkJZ3JhbW1hciwKKwkJCQkJJHVzZXMuZ2V0VG9rZW4oKSwKKwkJCQkJJHVzZXMudGV4dCk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCWlmICggci51c2VTY29wZXM9PW51bGwgKSB7ci51c2VTY29wZXM9bmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7fQorCQkJCQlyLnVzZVNjb3Blcy5hZGQoJHVzZXMudGV4dCk7CisJCQkJCX0KKwkJCQl9CisJCQkpKgorCQkpCisJOworCitibG9jaworQGluaXQKK3sKKwkvLyBtdXN0IHJ1biBkdXJpbmcgYmFja3RyYWNraW5nCisJdGhpcy5ibG9ja0xldmVsKys7CisJaWYgKCBibG9ja0xldmVsID09IDEgKQorCQl0aGlzLm91dGVyQWx0TnVtPTE7Cit9CisJOgleKAlCTE9DSworCQkJKG9wdGlvbnNTcGVjKT8KKwkJCShibG9ja0FjdGlvbikqCisJCQkoCWFsdGVybmF0aXZlIHJld3JpdGUKKwkJCQl7eworCQkJCQlpZiAoIHRoaXMuYmxvY2tMZXZlbCA9PSAxICkKKwkJCQkJCXRoaXMub3V0ZXJBbHROdW0rKzsKKwkJCQl9fQorCQkJKSsKKwkJCUVPQgorCQkgKQorCTsKK2ZpbmFsbHkgeyBibG9ja0xldmVsLS07IH0KKworLy8gVE9ETzogdGhpcyBkb2VzIG5vdGhpbmcgbm93ISBzdWJydWxlcyBjYW5ub3QgaGF2ZSBpbml0IGFjdGlvbnMuIDooCitibG9ja0FjdGlvbgorCToJXihhbXA9QU1QRVJTQU5EIGlkPUlEIGE9QUNUSU9OICkgLy8ge3IuZGVmaW5lQWN0aW9uKCNhbXAsI2lkLCNhKTt9CisJOworCithbHRlcm5hdGl2ZQorLy9AaW5pdAorLy97CisvLwlpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAwICkKKy8vCXsKKy8vCQlpZiAoIGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiAmJiBncmFtbWFyLkdldE9wdGlvbigib3V0cHV0IikhPW51bGwgJiYgYmxvY2tMZXZlbD09MSApCisvLwkJeworLy8JCQlHcmFtbWFyQVNUIGFSZXdyaXRlTm9kZSA9ICRzdGFydC5GaW5kRmlyc3RUeXBlKFJFV1JJVEUpOyAvLyBhbHQgaXRzZWxmIGhhcyByZXdyaXRlPworLy8JCQlHcmFtbWFyQVNUIHJld3JpdGVBU1QgPSAoR3JhbW1hckFTVCkkc3RhcnQuUGFyZW50LmdldENoaWxkKCRzdGFydC5DaGlsZEluZGV4ICsgMSk7CisvLwkJCS8vIHdlIGhhdmUgYSByZXdyaXRlIGlmIGFsdCB1c2VzIGl0IGluc2lkZSBzdWJydWxlIG9yIHRoaXMgYWx0IGhhcyBvbmUKKy8vCQkJLy8gYnV0IGRvbid0IGNvdW50IC0+IC4uLiByZXdyaXRlcywgd2hpY2ggbWVhbiAiZG8gZGVmYXVsdCBhdXRvIGNvbnN0cnVjdGlvbiIKKy8vCQkJaWYgKCBhUmV3cml0ZU5vZGUhPW51bGx8fAorLy8JCQkJIChmaXJzdFJld3JpdGVBU1QhPW51bGwgJiYKKy8vCQkJCSAgZmlyc3RSZXdyaXRlQVNULmdldFR5cGUoKT09UkVXUklURSAmJgorLy8JCQkJICBmaXJzdFJld3JpdGVBU1QuZ2V0Q2hpbGQoMCkhPW51bGwgJiYKKy8vCQkJCSAgZmlyc3RSZXdyaXRlQVNULmdldENoaWxkKDApLmdldFR5cGUoKSE9RVRDKSApCisvLwkJCXsKKy8vCQkJCVJ1bGUgciA9IGdyYW1tYXIuZ2V0UnVsZShjdXJyZW50UnVsZU5hbWUpOworLy8JCQkJci5UcmFja0FsdHNXaXRoUmV3cml0ZXMoJHN0YXJ0LHRoaXMub3V0ZXJBbHROdW0pOworLy8JCQl9CisvLwkJfQorLy8JfQorLy99CisJOgleKCBBTFQgKGVsZW1lbnQpKyBFT0EgKQorCTsKKworZXhjZXB0aW9uR3JvdXAKKwk6CSggZXhjZXB0aW9uSGFuZGxlciApKyAoZmluYWxseUNsYXVzZSk/CisJfAlmaW5hbGx5Q2xhdXNlCisJOworCitleGNlcHRpb25IYW5kbGVyCisJOiAgIF4oJ2NhdGNoJyBBUkdfQUNUSU9OIEFDVElPTikge3RyYWNrSW5saW5lQWN0aW9uKCRBQ1RJT04pO30KKwk7CisKK2ZpbmFsbHlDbGF1c2UKKwk6ICAgIF4oJ2ZpbmFsbHknIEFDVElPTikge3RyYWNrSW5saW5lQWN0aW9uKCRBQ1RJT04pO30KKwk7CisKK2VsZW1lbnQKKwk6ICAgXihST09UIGVsZW1lbnQpCisJfCAgIF4oQkFORyBlbGVtZW50KQorCXwgICBhdG9tW251bGxdCisJfCAgIF4oTk9UIGVsZW1lbnQpCisJfCAgIF4oUkFOR0UgYXRvbVtudWxsXSBhdG9tW251bGxdKQorCXwgICBeKENIQVJfUkFOR0UgYXRvbVtudWxsXSBhdG9tW251bGxdKQorCXwJXigJQVNTSUdOIGlkPUlEIGVsPWVsZW1lbnQpCisJCQl7CisJCQkJR3JhbW1hckFTVCBlID0gJGVsLnN0YXJ0OworCQkJCWlmICggZS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlJPT1QgfHwgZS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkJBTkcgKQorCQkJCXsKKwkJCQkJZSA9IChHcmFtbWFyQVNUKWUuZ2V0Q2hpbGQoMCk7CisJCQkJfQorCQkJCWlmICggZS5nZXRUeXBlKCk9PVJVTEVfUkVGKQorCQkJCXsKKwkJCQkJZ3JhbW1hci5kZWZpbmVSdWxlUmVmTGFiZWwoY3VycmVudFJ1bGVOYW1lLCRpZC5nZXRUb2tlbigpLGUpOworCQkJCX0KKwkJCQllbHNlIGlmICggZS5nZXRUeXBlKCk9PVdJTERDQVJEICYmIGdyYW1tYXIudHlwZT09R3JhbW1hci5UUkVFX1BBUlNFUiApCisJCQkJeworCQkJCQlncmFtbWFyLmRlZmluZVdpbGRjYXJkVHJlZUxhYmVsKGN1cnJlbnRSdWxlTmFtZSwkaWQuZ2V0VG9rZW4oKSxlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZ3JhbW1hci5kZWZpbmVUb2tlblJlZkxhYmVsKGN1cnJlbnRSdWxlTmFtZSwkaWQuZ2V0VG9rZW4oKSxlKTsKKwkJCQl9CisJCQl9CisJfAleKAlQTFVTX0FTU0lHTiBpZDI9SUQgYTI9ZWxlbWVudAorCQkJeworCQkJCUdyYW1tYXJBU1QgYSA9ICRhMi5zdGFydDsKKwkJCQlpZiAoIGEuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5ST09UIHx8IGEuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5CQU5HICkKKwkJCQl7CisJCQkJCWEgPSAoR3JhbW1hckFTVClhLmdldENoaWxkKDApOworCQkJCX0KKwkJCQlpZiAoIGEuZ2V0VHlwZSgpPT1SVUxFX1JFRiApCisJCQkJeworCQkJCQlncmFtbWFyLmRlZmluZVJ1bGVMaXN0TGFiZWwoY3VycmVudFJ1bGVOYW1lLCRpZDIuZ2V0VG9rZW4oKSxhKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIGEuZ2V0VHlwZSgpID09IFdJTERDQVJEICYmIGdyYW1tYXIudHlwZSA9PSBHcmFtbWFyLlRSRUVfUEFSU0VSICkKKwkJCQl7CisJCQkJCWdyYW1tYXIuZGVmaW5lV2lsZGNhcmRUcmVlTGlzdExhYmVsKCBjdXJyZW50UnVsZU5hbWUsICRpZDIuZ2V0VG9rZW4oKSwgYSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlncmFtbWFyLmRlZmluZVRva2VuTGlzdExhYmVsKGN1cnJlbnRSdWxlTmFtZSwkaWQyLmdldFRva2VuKCksYSk7CisJCQkJfQorCQkJfQorCQkgKQorCXwgICBlYm5mCisJfCAgIHRyZWVfCisJfCAgIF4oIFNZTlBSRUQgYmxvY2sgKQorCXwgICBhY3Q9QUNUSU9OCisJCXsKKwkJCSRhY3Qub3V0ZXJBbHROdW0gPSB0aGlzLm91dGVyQWx0TnVtOworCQkJdHJhY2tJbmxpbmVBY3Rpb24oJGFjdCk7CisJCX0KKwl8ICAgYWN0Mj1GT1JDRURfQUNUSU9OCisJCXsKKwkJCSRhY3QyLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCXRyYWNrSW5saW5lQWN0aW9uKCRhY3QyKTsKKwkJfQorCXwgICBTRU1QUkVECisJCXsKKwkJCSRTRU1QUkVELm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCXRyYWNrSW5saW5lQWN0aW9uKCRTRU1QUkVEKTsKKwkJfQorCXwgICBTWU5fU0VNUFJFRAorCXwgICBeKEJBQ0tUUkFDS19TRU1QUkVEIC4qKQorCXwgICBHQVRFRF9TRU1QUkVECisJCXsKKwkJCSRHQVRFRF9TRU1QUkVELm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCXRyYWNrSW5saW5lQWN0aW9uKCRHQVRFRF9TRU1QUkVEKTsKKwkJfQorCXwgICBFUFNJTE9OIAorCTsKKworZWJuZgorCToJKGRvdExvb3ApID0+IGRvdExvb3AgLy8gLiogb3IgLisKKwl8CWJsb2NrCisJfAleKCBPUFRJT05BTCBibG9jayApCisJfAleKCBDTE9TVVJFIGJsb2NrICkKKwl8CV4oIFBPU0lUSVZFX0NMT1NVUkUgYmxvY2sgKQorCTsKKworLyoqIFRyYWNrIHRoZSAuKiBhbmQgLisgaWRpb21zIGFuZCBtYWtlIHRoZW0gbm9uZ3JlZWR5IGJ5IGRlZmF1bHQuCisgKi8KK2RvdExvb3AKKwk6CSgJXiggQ0xPU1VSRSBkb3RCbG9jayApCisJCXwJXiggUE9TSVRJVkVfQ0xPU1VSRSBkb3RCbG9jayApCisJCSkKKwkJeworCQkJR3JhbW1hckFTVCBibG9jayA9IChHcmFtbWFyQVNUKSRzdGFydC5nZXRDaGlsZCgwKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJb3B0cy5wdXQoImdyZWVkeSIsICJmYWxzZSIpOworCQkJaWYgKCBncmFtbWFyLnR5cGUhPUdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCS8vIHBhcnNlciBncmFtbWFycyBhc3N1bWUgaz0xIGZvciAuKiBsb29wcworCQkJCS8vIG90aGVyd2lzZSB0aGV5IChhbmFseXNpcz8pIGxvb2sgdGlsIEVPRiEKKwkJCQlvcHRzLnB1dCgiayIsIDEpOworCQkJfQorCQkJYmxvY2suc2V0T3B0aW9ucyhncmFtbWFyLG9wdHMpOworCQl9CisJOworCitkb3RCbG9jaworCToJXiggQkxPQ0sgXiggQUxUIFdJTERDQVJEIEVPQSApIEVPQiApCisJOworCit0cmVlXworCToJXihUUkVFX0JFR0lOIGVsZW1lbnQrKQorCTsKKworYXRvbVtHcmFtbWFyQVNUIHNjb3BlX10KKwk6CV4oIHJyPVJVTEVfUkVGIChyYXJnPUFSR19BQ1RJT04pPyApCisJCXsKKwkJCWdyYW1tYXIuYWx0UmVmZXJlbmNlc1J1bGUoIGN1cnJlbnRSdWxlTmFtZSwgJHNjb3BlXywgJHJyLCB0aGlzLm91dGVyQWx0TnVtICk7CisJCQlpZiAoICRyYXJnICE9IG51bGwgKQorCQkJeworCQkJCSRyYXJnLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCQl0cmFja0lubGluZUFjdGlvbigkcmFyZyk7CisJCQl9CisJCX0KKwl8CV4oIHQ9VE9LRU5fUkVGICh0YXJnPUFSR19BQ1RJT04gKT8gKQorCQl7CisJCQlpZiAoICR0YXJnICE9IG51bGwgKQorCQkJeworCQkJCSR0YXJnLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCQl0cmFja0lubGluZUFjdGlvbigkdGFyZyk7CisJCQl9CisJCQlpZiAoIGdyYW1tYXIudHlwZSA9PSBHcmFtbWFyLkxFWEVSICkKKwkJCXsKKwkJCQlncmFtbWFyLmFsdFJlZmVyZW5jZXNSdWxlKCBjdXJyZW50UnVsZU5hbWUsICRzY29wZV8sICR0LCB0aGlzLm91dGVyQWx0TnVtICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZ3JhbW1hci5hbHRSZWZlcmVuY2VzVG9rZW5JRCggY3VycmVudFJ1bGVOYW1lLCAkdCwgdGhpcy5vdXRlckFsdE51bSApOworCQkJfQorCQl9CisJfAljPUNIQVJfTElURVJBTAorCQl7CisJCQlpZiAoIGdyYW1tYXIudHlwZSAhPSBHcmFtbWFyLkxFWEVSICkKKwkJCXsKKwkJCQlSdWxlIHJ1bGUgPSBncmFtbWFyLmdldFJ1bGUoY3VycmVudFJ1bGVOYW1lKTsKKwkJCQlpZiAoIHJ1bGUgIT0gbnVsbCApCisJCQkJCXJ1bGUudHJhY2tUb2tlblJlZmVyZW5jZUluQWx0KCRjLCBvdXRlckFsdE51bSk7CisJCQl9CisJCX0KKwl8CXM9U1RSSU5HX0xJVEVSQUwgCisJCXsKKwkJCWlmICggZ3JhbW1hci50eXBlICE9IEdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCVJ1bGUgcnVsZSA9IGdyYW1tYXIuZ2V0UnVsZShjdXJyZW50UnVsZU5hbWUpOworCQkJCWlmICggcnVsZSE9bnVsbCApCisJCQkJCXJ1bGUudHJhY2tUb2tlblJlZmVyZW5jZUluQWx0KCRzLCBvdXRlckFsdE51bSk7CisJCQl9CisJCX0KKwl8CVdJTERDQVJECisJfAleKERPVCBJRCBhdG9tWyRJRF0pIC8vIHNjb3BlIG92ZXJyaWRlIG9uIHJ1bGUKKwk7CisKK2FzdF9zdWZmaXgKKwk6CVJPT1QKKwl8CUJBTkcKKwk7CisKK3Jld3JpdGUKK0Bpbml0Cit7CisJLy8gdHJhY2sgdG9wIGxldmVsIFJFV1JJVEVTIG5vZGUsIHN0b3JlIHN0dWZmIHRoZXJlCisJY3VycmVudFJld3JpdGVSdWxlID0gJHN0YXJ0OyAvLyBoYXMgdG8gZXhlY3V0ZSBkdXJpbmcgYmFja3RyYWNraW5nCisJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCApCisJeworCQlpZiAoIGdyYW1tYXIuYnVpbGRBU1QoKSApCisJCQljdXJyZW50UmV3cml0ZVJ1bGUucmV3cml0ZVJlZnNEZWVwID0gbmV3IEhhc2hTZXQ8R3JhbW1hckFTVD4oKTsKKwl9Cit9CisJOgleKAlSRVdSSVRFUworCQkJKAleKCBSRVdSSVRFIChwcmVkPVNFTVBSRUQpPyByZXdyaXRlX2FsdGVybmF0aXZlICkKKwkJCQl7CisJCQkJCWlmICggJHByZWQgIT0gbnVsbCApCisJCQkJCXsKKwkJCQkJCSRwcmVkLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCQkJCXRyYWNrSW5saW5lQWN0aW9uKCRwcmVkKTsKKwkJCQkJfQorCQkJCX0KKwkJCSkqCisJCSkKKwkJLy97U3lzdGVtLm91dC5wcmludGxuKCItPiByZWZzID0gIitjdXJyZW50UmV3cml0ZVJ1bGUucmV3cml0ZVJlZnNEZWVwKTt9CisJfAorCTsKKworcmV3cml0ZV9ibG9jaworQGluaXQKK3sKKwlHcmFtbWFyQVNUIGVuY2xvc2luZ0Jsb2NrID0gY3VycmVudFJld3JpdGVCbG9jazsKKwlpZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAwICkKKwl7CisJCS8vIGRvbid0IGRvIGlmIGd1ZXNzaW5nCisJCWN1cnJlbnRSZXdyaXRlQmxvY2s9JHN0YXJ0OyAvLyBwdHMgdG8gQkxPQ0sgbm9kZQorCQljdXJyZW50UmV3cml0ZUJsb2NrLnJld3JpdGVSZWZzU2hhbGxvdyA9IG5ldyBIYXNoU2V0PEdyYW1tYXJBU1Q+KCk7CisJCWN1cnJlbnRSZXdyaXRlQmxvY2sucmV3cml0ZVJlZnNEZWVwID0gbmV3IEhhc2hTZXQ8R3JhbW1hckFTVD4oKTsKKwl9Cit9CisJOiAgIF4oIEJMT0NLIHJld3JpdGVfYWx0ZXJuYXRpdmUgRU9CICkKKwkJLy97U3lzdGVtLm91dC5wcmludGxuKCJhdG9tcz0iK2N1cnJlbnRSZXdyaXRlQmxvY2sucmV3cml0ZVJlZnMpO30KKwkJeworCQkJLy8gY29weSB0aGUgZWxlbWVudCByZWZzIGluIHRoaXMgYmxvY2sgdG8gdGhlIHN1cnJvdW5kaW5nIGJsb2NrCisJCQlpZiAoIGVuY2xvc2luZ0Jsb2NrICE9IG51bGwgKQorCQkJeworCQkJCWZvciAoR3JhbW1hckFTVCBpdGVtIDogY3VycmVudFJld3JpdGVCbG9jay5yZXdyaXRlUmVmc1NoYWxsb3cpCisJCQkJCWVuY2xvc2luZ0Jsb2NrLnJld3JpdGVSZWZzRGVlcC5hZGQoIGl0ZW0gKTsKKwkJCX0KKwkJCS8vY3VycmVudFJld3JpdGVCbG9jayA9IGVuY2xvc2luZ0Jsb2NrOyAvLyByZXN0b3JlIG9sZCBCTE9DSyBwdHIKKwkJfQorCTsKK2ZpbmFsbHkgeyBjdXJyZW50UmV3cml0ZUJsb2NrID0gZW5jbG9zaW5nQmxvY2s7IH0KKworcmV3cml0ZV9hbHRlcm5hdGl2ZQorCToJe2dyYW1tYXIuYnVpbGRBU1QoKX0/ID0+IF4oIGE9QUxUICggKCByZXdyaXRlX2VsZW1lbnQgKSsgfCBFUFNJTE9OICkgRU9BICkKKwl8CXtncmFtbWFyLmJ1aWxkVGVtcGxhdGUoKX0/ID0+IHJld3JpdGVfdGVtcGxhdGUKKwl8CUVUQyB7dGhpcy5ibG9ja0xldmVsPT0xfT8gLy8gb25seSB2YWxpZCBhcyBvdXRlcm1vc3QgcmV3cml0ZQorCTsKKworcmV3cml0ZV9lbGVtZW50CisJOglyZXdyaXRlX2F0b20KKwl8CXJld3JpdGVfZWJuZgorCXwJcmV3cml0ZV90cmVlCisJOworCityZXdyaXRlX2VibmYKKwk6CV4oIE9QVElPTkFMIHJld3JpdGVfYmxvY2sgKQorCXwJXiggQ0xPU1VSRSByZXdyaXRlX2Jsb2NrICkKKwl8CV4oIFBPU0lUSVZFX0NMT1NVUkUgcmV3cml0ZV9ibG9jayApCisJOworCityZXdyaXRlX3RyZWUKKwk6ICAgXigJVFJFRV9CRUdJTiByZXdyaXRlX2F0b20gKCByZXdyaXRlX2VsZW1lbnQgKSogKQorCTsKKworcmV3cml0ZV9hdG9tCitAaW5pdAoreworCWlmICggc3RhdGUuYmFja3RyYWNraW5nID09IDAgKQorCXsKKwkJUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKGN1cnJlbnRSdWxlTmFtZSk7CisJCVNldCB0b2tlblJlZnNJbkFsdCA9IHIuZ2V0VG9rZW5SZWZzSW5BbHQob3V0ZXJBbHROdW0pOworCQlib29sZWFuIGltYWdpbmFyeSA9CisJCQkkc3RhcnQuZ2V0VHlwZSgpPT1UT0tFTl9SRUYgJiYKKwkJCSF0b2tlblJlZnNJbkFsdC5jb250YWlucygkc3RhcnQuZ2V0VGV4dCgpKTsKKwkJaWYgKCAhaW1hZ2luYXJ5ICYmIGdyYW1tYXIuYnVpbGRBU1QoKSAmJgorCQkJICgkc3RhcnQuZ2V0VHlwZSgpPT1SVUxFX1JFRiB8fAorCQkJICAkc3RhcnQuZ2V0VHlwZSgpPT1MQUJFTCB8fAorCQkJICAkc3RhcnQuZ2V0VHlwZSgpPT1UT0tFTl9SRUYgfHwKKwkJCSAgJHN0YXJ0LmdldFR5cGUoKT09Q0hBUl9MSVRFUkFMIHx8CisJCQkgICRzdGFydC5nZXRUeXBlKCk9PVNUUklOR19MSVRFUkFMKSApCisJCXsKKwkJCS8vIHRyYWNrIHBlciBibG9jayBhbmQgZm9yIGVudGlyZSByZXdyaXRlIHJ1bGUKKwkJCWlmICggY3VycmVudFJld3JpdGVCbG9jayE9bnVsbCApCisJCQl7CisJCQkJY3VycmVudFJld3JpdGVCbG9jay5yZXdyaXRlUmVmc1NoYWxsb3cuYWRkKCRzdGFydCk7CisJCQkJY3VycmVudFJld3JpdGVCbG9jay5yZXdyaXRlUmVmc0RlZXAuYWRkKCRzdGFydCk7CisJCQl9CisKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgIiskc3RhcnQuZ2V0VGV4dCgpKyIgdG8gIitjdXJyZW50UmV3cml0ZVJ1bGUuZ2V0VGV4dCgpKTsKKwkJCWN1cnJlbnRSZXdyaXRlUnVsZS5yZXdyaXRlUmVmc0RlZXAuYWRkKCRzdGFydCk7CisJCX0KKwl9Cit9CisJOglSVUxFX1JFRiAKKwl8CSgJXigJVE9LRU5fUkVGCisJCQkJKAlBUkdfQUNUSU9OCisJCQkJCXsKKwkJCQkJCSRBUkdfQUNUSU9OLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCQkJCXRyYWNrSW5saW5lQWN0aW9uKCRBUkdfQUNUSU9OKTsKKwkJCQkJfQorCQkJCSk/CisJCQkpCisJCXwJQ0hBUl9MSVRFUkFMCisJCXwJU1RSSU5HX0xJVEVSQUwKKwkJKQorCXwJTEFCRUwKKwl8CUFDVElPTgorCQl7CisJCQkkQUNUSU9OLm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCXRyYWNrSW5saW5lQWN0aW9uKCRBQ1RJT04pOworCQl9CisJOworCityZXdyaXRlX3RlbXBsYXRlCisJOgleKAlBTFQgRVBTSUxPTiBFT0EgKQorCXwJXigJVEVNUExBVEUgKGlkPUlEfGluZD1BQ1RJT04pCisJCQleKCBBUkdMSVNUCisJCQkJKAleKCBBUkcgYXJnPUlEIGE9QUNUSU9OICkKKwkJCQkJeworCQkJCQkJJGEub3V0ZXJBbHROdW0gPSB0aGlzLm91dGVyQWx0TnVtOworCQkJCQkJdHJhY2tJbmxpbmVBY3Rpb24oJGEpOworCQkJCQl9CisJCQkJKSoKKwkJCSkKKwkJCXsKKwkJCQlpZiAoICRpbmQhPW51bGwgKQorCQkJCXsKKwkJCQkJJGluZC5vdXRlckFsdE51bSA9IHRoaXMub3V0ZXJBbHROdW07CisJCQkJCXRyYWNrSW5saW5lQWN0aW9uKCRpbmQpOworCQkJCX0KKwkJCX0KKwkJCSgJRE9VQkxFX1FVT1RFX1NUUklOR19MSVRFUkFMCisJCQl8CURPVUJMRV9BTkdMRV9TVFJJTkdfTElURVJBTAorCQkJKT8KKwkJKQorCXwJYWN0PUFDVElPTgorCQl7CisJCQkkYWN0Lm91dGVyQWx0TnVtID0gdGhpcy5vdXRlckFsdE51bTsKKwkJCXRyYWNrSW5saW5lQWN0aW9uKCRhY3QpOworCQl9CisJOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0xlZnRSZWN1cnNpdmVSdWxlV2Fsa2VyLmcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9hbnRscjMvb3JnL2FudGxyL2dyYW1tYXIvdjMvTGVmdFJlY3Vyc2l2ZVJ1bGVXYWxrZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzdiZDEyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL0xlZnRSZWN1cnNpdmVSdWxlV2Fsa2VyLmcKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEdyYW1tYXIgY29udmVyc2lvbiB0byBBTlRMUiB2MzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKiBGaW5kIGxlZnQtcmVjdXJzaXZlIHJ1bGVzICovCit0cmVlIGdyYW1tYXIgTGVmdFJlY3Vyc2l2ZVJ1bGVXYWxrZXI7CisKK29wdGlvbnMgeworCXRva2VuVm9jYWI9QU5UTFI7CisgICAgQVNUTGFiZWxUeXBlPUdyYW1tYXJBU1Q7Cit9CisKK0BoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3JhbW1hci52MzsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy4qOworaW1wb3J0IG9yZy5hbnRsci5taXNjLio7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuKjsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldDsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5ERkE7Cit9CisKK0BtZW1iZXJzIHsKK3Byb3RlY3RlZCBHcmFtbWFyIGdyYW1tYXI7Citwcml2YXRlIFN0cmluZyBydWxlTmFtZTsKK3ByaXZhdGUgaW50IG91dGVyQWx0OyAvLyB3aGljaCBvdXRlciBhbHQgb2YgcnVsZT8KK3B1YmxpYyBpbnQgbnVtQWx0czsgIC8vIGhvdyBtYW55IGFsdHMgZm9yIHRoaXMgcnVsZSB0b3RhbD8KKworQE92ZXJyaWRlCitwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkKK3sKKyAgICBUb2tlbiB0b2tlbiA9IG51bGw7CisgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgdG9rZW4gPSAoKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbilleCkudG9rZW47CisgICAgfQorICAgIGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgTm9WaWFibGVBbHRFeGNlcHRpb24pCisgICAgeworICAgICAgICB0b2tlbiA9ICgoTm9WaWFibGVBbHRFeGNlcHRpb24pZXgpLnRva2VuOworICAgIH0KKworICAgIEVycm9yTWFuYWdlci5zeW50YXhFcnJvcigKKyAgICAgICAgRXJyb3JNYW5hZ2VyLk1TR19TWU5UQVhfRVJST1IsCisgICAgICAgIGdyYW1tYXIsCisgICAgICAgIHRva2VuLAorICAgICAgICAiYXNzaWduLnR5cGVzOiAiICsgZXgudG9TdHJpbmcoKSwKKyAgICAgICAgZXgpOworfQorCitwdWJsaWMgdm9pZCBzZXRUb2tlblByZWMoR3JhbW1hckFTVCB0LCBpbnQgYWx0KSB7fQorcHVibGljIHZvaWQgYmluYXJ5QWx0KEdyYW1tYXJBU1QgYWx0VHJlZSwgR3JhbW1hckFTVCByZXdyaXRlVHJlZSwgaW50IGFsdCkge30KK3B1YmxpYyB2b2lkIHRlcm5hcnlBbHQoR3JhbW1hckFTVCBhbHRUcmVlLCBHcmFtbWFyQVNUIHJld3JpdGVUcmVlLCBpbnQgYWx0KSB7fQorcHVibGljIHZvaWQgcHJlZml4QWx0KEdyYW1tYXJBU1QgYWx0VHJlZSwgR3JhbW1hckFTVCByZXdyaXRlVHJlZSwgaW50IGFsdCkge30KK3B1YmxpYyB2b2lkIHN1ZmZpeEFsdChHcmFtbWFyQVNUIGFsdFRyZWUsIEdyYW1tYXJBU1QgcmV3cml0ZVRyZWUsIGludCBhbHQpIHt9CitwdWJsaWMgdm9pZCBvdGhlckFsdChHcmFtbWFyQVNUIGFsdFRyZWUsIEdyYW1tYXJBU1QgcmV3cml0ZVRyZWUsIGludCBhbHQpIHt9CitwdWJsaWMgdm9pZCBzZXRSZXR1cm5WYWx1ZXMoR3JhbW1hckFTVCB0KSB7fQorfQorCitvcHRpb25zU3BlYworCToJXihPUFRJT05TIG9wdGlvbispCisJOworCitvcHRpb24KKwk6CV4oQVNTSUdOIElEIG9wdGlvblZhbHVlKQorCTsKKworb3B0aW9uVmFsdWUKKwk6CUlECisJfAlTVFJJTkdfTElURVJBTAorCXwJQ0hBUl9MSVRFUkFMCisJfAlJTlQKKwk7CisKK2NoYXJTZXRFbGVtZW50CisJOglDSEFSX0xJVEVSQUwKKwl8CV4oT1IgQ0hBUl9MSVRFUkFMIENIQVJfTElURVJBTCkKKwl8CV4oUkFOR0UgQ0hBUl9MSVRFUkFMIENIQVJfTElURVJBTCkKKwk7CisKK3B1YmxpYworcmVjX3J1bGVbR3JhbW1hciBnXSByZXR1cm5zIFtib29sZWFuIGlzTGVmdFJlY10KK0Bpbml0Cit7CisJZ3JhbW1hciA9IGc7CisJb3V0ZXJBbHQgPSAxOworfQorCToJXigJcj1SVUxFIGlkPUlEIHtydWxlTmFtZT0kaWQuZ2V0VGV4dCgpO30KKwkJCW1vZGlmaWVyPworCQkJXihBUkcgQVJHX0FDVElPTj8pCisJCQleKFJFVCBBUkdfQUNUSU9OPykKKwkJCW9wdGlvbnNTcGVjPworCQkJcnVsZVNjb3BlU3BlYz8KKwkJCSheKEFNUEVSU0FORCAuKikpKgorCQkJcnVsZUJsb2NrIHskaXNMZWZ0UmVjID0gJHJ1bGVCbG9jay5pc0xlZnRSZWM7fQorCQkJZXhjZXB0aW9uR3JvdXA/CisJCQlFT1IKKwkJKQorCQl7aWYgKCRydWxlQmxvY2suaXNMZWZ0UmVjKSAkci5zZXRUeXBlKFBSRUNfUlVMRSk7fQorCTsKKworbW9kaWZpZXIKKwk6CSdwcm90ZWN0ZWQnCisJfAkncHVibGljJworCXwJJ3ByaXZhdGUnCisJfAknZnJhZ21lbnQnCisJOworCitydWxlU2NvcGVTcGVjCisgCToJXignc2NvcGUnIEFDVElPTj8gSUQqKQorIAk7CisKK3J1bGVCbG9jayByZXR1cm5zIFtib29sZWFuIGlzTGVmdFJlY10KK0Bpbml0e2Jvb2xlYW4gbHI9ZmFsc2U7IHRoaXMubnVtQWx0cyA9ICRzdGFydC5nZXRDaGlsZENvdW50KCk7fQorCToJXigJQkxPQ0sKKwkJCW9wdGlvbnNTcGVjPworCQkJKAlvdXRlckFsdGVybmF0aXZlCisJCQkJe2lmICgkb3V0ZXJBbHRlcm5hdGl2ZS5pc0xlZnRSZWMpICRpc0xlZnRSZWMgPSB0cnVlO30KKwkJCQlyZXdyaXRlPworCQkJCXtvdXRlckFsdCsrO30KKwkJCSkrCisJCQlFT0IKKwkJKQorCTsKKworYmxvY2sKKyAgICA6ICAgXiggIEJMT0NLCisgICAgICAgICAgICBvcHRpb25zU3BlYz8KKyAgICAgICAgICAgICggXihBTFQgZWxlbWVudCsgRU9BKSByZXdyaXRlPyApKworICAgICAgICAgICAgRU9CICAgCisgICAgICAgICApCisgICAgOworCisvKiogQW4gYWx0IGlzIGVpdGhlciBwcmVmaXgsIHN1ZmZpeCwgYmluYXJ5LCBvciB0ZXJuYXJ5IG9wZXJhdGlvbiBvciAib3RoZXIiICovCitvdXRlckFsdGVybmF0aXZlIHJldHVybnMgW2Jvb2xlYW4gaXNMZWZ0UmVjXQorQGluaXQKK3sKK0dyYW1tYXJBU1QgcmV3PShHcmFtbWFyQVNUKSRzdGFydC5nZXROZXh0U2libGluZygpOworaWYgKHJldy5nZXRUeXBlKCkgIT0gUkVXUklURVMpCisJcmV3ID0gbnVsbDsKK30KKyAgICA6ICAgKGJpbmFyeU11bHRpcGxlT3ApPT4gYmluYXJ5TXVsdGlwbGVPcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YmluYXJ5QWx0KCRzdGFydCwgcmV3LCBvdXRlckFsdCk7ICRpc0xlZnRSZWM9dHJ1ZTt9CisgICAgfCAgIChiaW5hcnkpPT4gICAgICAgICAgIGJpbmFyeSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2JpbmFyeUFsdCgkc3RhcnQsIHJldywgb3V0ZXJBbHQpOyAkaXNMZWZ0UmVjPXRydWU7fQorICAgIHwgICAodGVybmFyeSk9PiAgICAgICAgICB0ZXJuYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0ZXJuYXJ5QWx0KCRzdGFydCwgcmV3LCBvdXRlckFsdCk7ICRpc0xlZnRSZWM9dHJ1ZTt9CisgICAgfCAgIChwcmVmaXgpPT4gICAgICAgICAgIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cHJlZml4QWx0KCRzdGFydCwgcmV3LCBvdXRlckFsdCk7fQorICAgIHwgICAoc3VmZml4KT0+ICAgICAgICAgICBzdWZmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1ZmZpeEFsdCgkc3RhcnQsIHJldywgb3V0ZXJBbHQpOyAkaXNMZWZ0UmVjPXRydWU7fQorICAgIHwgICBeKEFMVCBlbGVtZW50KyBFT0EpIC8vICJvdGhlciIgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3RoZXJBbHQoJHN0YXJ0LCByZXcsIG91dGVyQWx0KTt9CisgICAgOworCitiaW5hcnkKKwk6CV4oIEFMVCAoXihCQUNLVFJBQ0tfU0VNUFJFRCAuKikpPyByZWN1cnNlTm9MYWJlbCBvcD10b2tlbiByZWN1cnNlIEVPQSApIHtzZXRUb2tlblByZWMoJG9wLnQsIG91dGVyQWx0KTt9CisJOworCitiaW5hcnlNdWx0aXBsZU9wCisJOgleKCBBTFQgKF4oQkFDS1RSQUNLX1NFTVBSRUQgLiopKT8gcmVjdXJzZU5vTGFiZWwgXiggQkxPQ0sgKCBeKCBBTFQgb3A9dG9rZW4gRU9BIHtzZXRUb2tlblByZWMoJG9wLnQsIG91dGVyQWx0KTt9ICkgKSsgRU9CICkgcmVjdXJzZSBFT0EgKQorCTsKKwordGVybmFyeQorCToJXiggQUxUICheKEJBQ0tUUkFDS19TRU1QUkVEIC4qKSk/IHJlY3Vyc2VOb0xhYmVsIG9wPXRva2VuIHJlY3Vyc2UgdG9rZW4gcmVjdXJzZSBFT0EgKSB7c2V0VG9rZW5QcmVjKCRvcC50LCBvdXRlckFsdCk7fQorCTsKKworcHJlZml4IDogXiggQUxUICheKEJBQ0tUUkFDS19TRU1QUkVEIC4qKSk/IHtzZXRUb2tlblByZWMoKEdyYW1tYXJBU1QpaW5wdXQuTFQoMSksIG91dGVyQWx0KTt9ICh7ISgoQ29tbW9uVHJlZSlpbnB1dC5MVCgxKSkuZ2V0VGV4dCgpLmVxdWFscyhydWxlTmFtZSl9PyBlbGVtZW50KSsgcmVjdXJzZSBFT0EgKSA7CisKK3N1ZmZpeCA6IF4oIEFMVCAoXihCQUNLVFJBQ0tfU0VNUFJFRCAuKikpPyByZWN1cnNlTm9MYWJlbCB7c2V0VG9rZW5QcmVjKChHcmFtbWFyQVNUKWlucHV0LkxUKDEpLCBvdXRlckFsdCk7fSBlbGVtZW50KyAgRU9BICkgOworCityZWN1cnNlCisJOgleKEFTU0lHTiBJRCByZWN1cnNlTm9MYWJlbCkKKwl8CV4oUExVU19BU1NJR04gSUQgcmVjdXJzZU5vTGFiZWwpCisJfAlyZWN1cnNlTm9MYWJlbAorCTsKKworcmVjdXJzZU5vTGFiZWwgOiB7KChDb21tb25UcmVlKWlucHV0LkxUKDEpKS5nZXRUZXh0KCkuZXF1YWxzKHJ1bGVOYW1lKX0/IFJVTEVfUkVGOworCisvKgorZWxlbWVudE5vdFJlY3Vyc2l2ZVJ1bGUKKyAgICA6ICAge190LmZpbmRGaXJzdFR5cGUoUlVMRV9SRUYpIT1udWxsICYmIF90LmZpbmRGaXJzdFR5cGUoUlVMRV9SRUYpLmdldFRleHQoKS5lcXVhbHMocnVsZU5hbWUpfT8KKyAgICAgICAgZTplbGVtZW50CisgICAgOworKi8KKwordG9rZW4gcmV0dXJucyBbR3JhbW1hckFTVCB0PW51bGxdCisJOgleKEFTU0lHTiBJRCBzPXRva2VuIHskdCA9ICRzLnQ7fSkKKwl8CV4oUExVU19BU1NJR04gSUQgcz10b2tlbiB7JHQgPSAkcy50O30pCisJfAleKFJPT1Qgcz10b2tlbiB7JHQgPSAkcy50O30pCisJfAleKEJBTkcgcz10b2tlbiB7JHQgPSAkcy50O30pCisJfAlhPUNIQVJfTElURVJBTCAgICAgIHskdCA9ICRhO30KKwl8CWI9U1RSSU5HX0xJVEVSQUwgICAgeyR0ID0gJGI7fQorCXwJYz1UT0tFTl9SRUYgICAgICAgICB7JHQgPSAkYzt9CisJOworCitleGNlcHRpb25Hcm91cAorCToJZXhjZXB0aW9uSGFuZGxlcisgZmluYWxseUNsYXVzZT8KKwl8CWZpbmFsbHlDbGF1c2UKKyAgICA7CisKK2V4Y2VwdGlvbkhhbmRsZXIKKwk6CV4oJ2NhdGNoJyBBUkdfQUNUSU9OIEFDVElPTikKKwk7CisKK2ZpbmFsbHlDbGF1c2UKKwk6CV4oJ2ZpbmFsbHknIEFDVElPTikKKwk7CisKK3Jld3JpdGUKKwk6CV4oUkVXUklURVMgKCBeKCBSRVdSSVRFIFNFTVBSRUQ/ICheKEFMVCAuKil8XihURU1QTEFURSAuKil8QUNUSU9OfEVUQykgKSApKiApCisJOworCitlbGVtZW50CisJOgleKFJPT1QgZWxlbWVudCkKKwl8CV4oQkFORyBlbGVtZW50KQorCXwJYXRvbQorCXwJXihOT1QgZWxlbWVudCkKKwl8CV4oUkFOR0UgYXRvbSBhdG9tKQorCXwJXihBU1NJR04gSUQgZWxlbWVudCkKKwl8CV4oUExVU19BU1NJR04gSUQgZWxlbWVudCkKKwl8CWVibmYKKwl8CXRyZWVfCisJfAleKFNZTlBSRUQgYmxvY2spIAorCXwJRk9SQ0VEX0FDVElPTgorCXwJQUNUSU9OCisJfAlTRU1QUkVECisJfAlTWU5fU0VNUFJFRAorCXwJQkFDS1RSQUNLX1NFTVBSRUQKKwl8CUdBVEVEX1NFTVBSRUQKKwl8CUVQU0lMT04gCisJOworCitlYm5mOiAgIGJsb2NrCisgICAgfCAgIF4oIE9QVElPTkFMIGJsb2NrICkgCisgICAgfCAgIF4oIENMT1NVUkUgYmxvY2sgKSAgCisgICAgfCAgIF4oIFBPU0lUSVZFX0NMT1NVUkUgYmxvY2sgKSAKKyAgICA7CisKK3RyZWVfCisJOgleKFRSRUVfQkVHSU4gZWxlbWVudCspCisJOworCithdG9tCisJOgleKFJVTEVfUkVGIEFSR19BQ1RJT04/KQorCXwJXihUT0tFTl9SRUYgQVJHX0FDVElPTj8pCisJfAlDSEFSX0xJVEVSQUwKKwl8CVNUUklOR19MSVRFUkFMCisJfAlXSUxEQ0FSRAorCXwJXihET1QgSUQgYXRvbSkgLy8gc2NvcGUgb3ZlcnJpZGUgb24gcnVsZQorCTsKKworYXN0X3N1ZmZpeAorCToJUk9PVAorCXwJQkFORworCTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9UcmVlVG9ORkFDb252ZXJ0ZXIuZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2FudGxyMy9vcmcvYW50bHIvZ3JhbW1hci92My9UcmVlVG9ORkFDb252ZXJ0ZXIuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjIwNmVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vYW50bHIzL29yZy9hbnRsci9ncmFtbWFyL3YzL1RyZWVUb05GQUNvbnZlcnRlci5nCkBAIC0wLDAgKzEsODU1IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgR3JhbW1hciBjb252ZXJzaW9uIHRvIEFOVExSIHYzOgorIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisJZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogQnVpbGQgYW4gTkZBIGZyb20gYSB0cmVlIHJlcHJlc2VudGluZyBhbiBBTlRMUiBncmFtbWFyLiAqLwordHJlZSBncmFtbWFyIFRyZWVUb05GQUNvbnZlcnRlcjsKKworb3B0aW9ucyB7CisJdG9rZW5Wb2NhYiA9IEFOVExSOworCUFTVExhYmVsVHlwZSA9IEdyYW1tYXJBU1Q7Cit9CisKK0BoZWFkZXIgeworcGFja2FnZSBvcmcuYW50bHIuZ3JhbW1hci52MzsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy4qOworaW1wb3J0IG9yZy5hbnRsci5taXNjLio7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuKjsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldDsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5ERkE7Cit9CisKK0BtZW1iZXJzIHsKKy8qKiBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIG5vZGVzIGFuZCBzdWJtYWNoaW5lcyAqLworcHJvdGVjdGVkIE5GQUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisKKy8qKiBXaGljaCBORkEgb2JqZWN0IGFyZSB3ZSBmaWxsaW5nIGluPyAqLworcHJvdGVjdGVkIE5GQSBuZmEgPSBudWxsOworCisvKiogV2hpY2ggZ3JhbW1hciBhcmUgd2UgY29udmVydGluZyBhbiBORkEgZm9yPyAqLworcHJvdGVjdGVkIEdyYW1tYXIgZ3JhbW1hciA9IG51bGw7CisKK3Byb3RlY3RlZCBTdHJpbmcgY3VycmVudFJ1bGVOYW1lID0gbnVsbDsKKworcHJvdGVjdGVkIGludCBvdXRlckFsdE51bSA9IDA7Citwcm90ZWN0ZWQgaW50IGJsb2NrTGV2ZWwgPSAwOworCitwcm90ZWN0ZWQgaW50IGluVGVzdCA9IDA7CisKK3B1YmxpYyBUcmVlVG9ORkFDb252ZXJ0ZXIoVHJlZU5vZGVTdHJlYW0gaW5wdXQsIEdyYW1tYXIgZywgTkZBIG5mYSwgTkZBRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgdGhpcyhpbnB1dCk7CisgICAgdGhpcy5ncmFtbWFyID0gZzsKKyAgICB0aGlzLm5mYSA9IG5mYTsKKyAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworfQorCitwdWJsaWMgZmluYWwgSW50U2V0IHNldFJ1bGUoR3JhbW1hckFTVCB0KSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgIFRyZWVUb05GQUNvbnZlcnRlciBvdGhlciA9IG5ldyBUcmVlVG9ORkFDb252ZXJ0ZXIoIG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSggdCApLCBncmFtbWFyLCBuZmEsIGZhY3RvcnkgKTsKKworICAgIG90aGVyLmN1cnJlbnRSdWxlTmFtZSA9IGN1cnJlbnRSdWxlTmFtZTsKKyAgICBvdGhlci5vdXRlckFsdE51bSA9IG91dGVyQWx0TnVtOworICAgIG90aGVyLmJsb2NrTGV2ZWwgPSBibG9ja0xldmVsOworCisgICAgcmV0dXJuIG90aGVyLnNldFJ1bGUoKTsKK30KKworcHVibGljIGZpbmFsIGludCB0ZXN0QmxvY2tBc1NldCggR3JhbW1hckFTVCB0ICkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICBSdWxlIHIgPSBncmFtbWFyLmdldExvY2FsbHlEZWZpbmVkUnVsZSggY3VycmVudFJ1bGVOYW1lICk7CisgICAgaWYgKCByLmhhc1Jld3JpdGUoIG91dGVyQWx0TnVtICkgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBUcmVlVG9ORkFDb252ZXJ0ZXIgb3RoZXIgPSBuZXcgVHJlZVRvTkZBQ29udmVydGVyKCBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oIHQgKSwgZ3JhbW1hciwgbmZhLCBmYWN0b3J5ICk7CisKKyAgICBvdGhlci5zdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICBvdGhlci5jdXJyZW50UnVsZU5hbWUgPSBjdXJyZW50UnVsZU5hbWU7CisgICAgb3RoZXIub3V0ZXJBbHROdW0gPSBvdXRlckFsdE51bTsKKyAgICBvdGhlci5ibG9ja0xldmVsID0gYmxvY2tMZXZlbDsKKworICAgIGludCByZXN1bHQgPSBvdGhlci50ZXN0QmxvY2tBc1NldCgpOworICAgIGlmICggb3RoZXIuc3RhdGUuZmFpbGVkICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworcHVibGljIGZpbmFsIGludCB0ZXN0U2V0UnVsZSggR3JhbW1hckFTVCB0ICkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICBUcmVlVG9ORkFDb252ZXJ0ZXIgb3RoZXIgPSBuZXcgVHJlZVRvTkZBQ29udmVydGVyKCBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oIHQgKSwgZ3JhbW1hciwgbmZhLCBmYWN0b3J5ICk7CisKKyAgICBvdGhlci5zdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICBvdGhlci5jdXJyZW50UnVsZU5hbWUgPSBjdXJyZW50UnVsZU5hbWU7CisgICAgb3RoZXIub3V0ZXJBbHROdW0gPSBvdXRlckFsdE51bTsKKyAgICBvdGhlci5ibG9ja0xldmVsID0gYmxvY2tMZXZlbDsKKworICAgIGludCByZXN1bHQgPSBvdGhlci50ZXN0U2V0UnVsZSgpOworICAgIGlmICggb3RoZXIuc3RhdGUuZmFpbGVkICkKKyAgICAgICAgc3RhdGUuZmFpbGVkID0gdHJ1ZTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGFkZEZvbGxvd1RyYW5zaXRpb24oIFN0cmluZyBydWxlTmFtZSwgTkZBU3RhdGUgZm9sbG93aW5nICkgeworICAgIC8vU3lzdGVtLkNvbnNvbGUuT3V0LldyaXRlTGluZSggImFkZGluZyBmb2xsb3cgbGluayB0byBydWxlICIgKyBydWxlTmFtZSApOworICAgIC8vIGZpbmQgbGFzdCBsaW5rIGluIEZPTExPVyBjaGFpbiBlbWFuYXRpbmcgZnJvbSBydWxlCisgICAgUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKCBydWxlTmFtZSApOworICAgIE5GQVN0YXRlIGVuZCA9IHIuc3RvcFN0YXRlOworICAgIHdoaWxlICggZW5kLnRyYW5zaXRpb24oIDEgKSAhPSBudWxsICkKKyAgICB7CisgICAgICAgIGVuZCA9IChORkFTdGF0ZSllbmQudHJhbnNpdGlvbiggMSApLnRhcmdldDsKKyAgICB9CisgICAgaWYgKCBlbmQudHJhbnNpdGlvbiggMCApICE9IG51bGwgKQorICAgIHsKKyAgICAgICAgLy8gYWxyZWFkeSBwb2ludHMgdG8gYSBmb2xsb3dpbmcgbm9kZQorICAgICAgICAvLyBnb3R0YSBhZGQgYW5vdGhlciBub2RlIHRvIGtlZXAgZWRnZXMgdG8gYSBtYXggb2YgMgorICAgICAgICBORkFTdGF0ZSBuID0gZmFjdG9yeS5uZXdTdGF0ZSgpOworICAgICAgICBUcmFuc2l0aW9uIGUgPSBuZXcgVHJhbnNpdGlvbiggTGFiZWwuRVBTSUxPTiwgbiApOworICAgICAgICBlbmQuYWRkVHJhbnNpdGlvbiggZSApOworICAgICAgICBlbmQgPSBuOworICAgIH0KKyAgICBUcmFuc2l0aW9uIGZvbGxvd0VkZ2UgPSBuZXcgVHJhbnNpdGlvbiggTGFiZWwuRVBTSUxPTiwgZm9sbG93aW5nICk7CisgICAgZW5kLmFkZFRyYW5zaXRpb24oIGZvbGxvd0VkZ2UgKTsKK30KKworcHJvdGVjdGVkIHZvaWQgZmluaXNoKCkgeworICAgIGludCBudW1FbnRyeVBvaW50cyA9IGZhY3RvcnkuYnVpbGRfRU9GU3RhdGVzKCBncmFtbWFyLmdldFJ1bGVzKCkgKTsKKyAgICBpZiAoIG51bUVudHJ5UG9pbnRzID09IDAgKQorICAgIHsKKyAgICAgICAgRXJyb3JNYW5hZ2VyLmdyYW1tYXJXYXJuaW5nKCBFcnJvck1hbmFnZXIuTVNHX05PX0dSQU1NQVJfU1RBUlRfUlVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hci5uYW1lICk7CisgICAgfQorfQorCitAT3ZlcnJpZGUKK3B1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgaWYgKCBpblRlc3QgPiAwICkKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleCk7CisKKyAgICBUb2tlbiB0b2tlbiA9IG51bGw7CisgICAgaWYgKCBleCBpbnN0YW5jZW9mIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiApCisgICAgeworICAgICAgICB0b2tlbiA9ICggKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbilleCApLnRva2VuOworICAgIH0KKyAgICBlbHNlIGlmICggZXggaW5zdGFuY2VvZiBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiApCisgICAgeworICAgICAgICB0b2tlbiA9ICggKE5vVmlhYmxlQWx0RXhjZXB0aW9uKWV4ICkudG9rZW47CisgICAgfQorCisgICAgRXJyb3JNYW5hZ2VyLnN5bnRheEVycm9yKAorICAgICAgICBFcnJvck1hbmFnZXIuTVNHX1NZTlRBWF9FUlJPUiwKKyAgICAgICAgZ3JhbW1hciwKKyAgICAgICAgdG9rZW4sCisgICAgICAgICJidWlsZG5mYTogIiArIGV4LnRvU3RyaW5nKCksCisgICAgICAgIGV4ICk7Cit9CisKK3ByaXZhdGUgYm9vbGVhbiBoYXNFbGVtZW50T3B0aW9ucyhHcmFtbWFyQVNUIG5vZGUpIHsKKyAgICBpZiAobm9kZSA9PSBudWxsKQorICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5vZGUiKTsKKyAgICByZXR1cm4gbm9kZS50ZXJtaW5hbE9wdGlvbnMgIT0gbnVsbCAmJiBub2RlLnRlcm1pbmFsT3B0aW9ucy5zaXplKCkgPiAwOworfQorfQorCitwdWJsaWMKK2dyYW1tYXJfCitAYWZ0ZXIKK3sKKwlmaW5pc2goKTsKK30KKwk6CSgJXiggTEVYRVJfR1JBTU1BUiBncmFtbWFyU3BlYyApCisJCXwJXiggUEFSU0VSX0dSQU1NQVIgZ3JhbW1hclNwZWMgKQorCQl8CV4oIFRSRUVfR1JBTU1BUiBncmFtbWFyU3BlYyApCisJCXwJXiggQ09NQklORURfR1JBTU1BUiBncmFtbWFyU3BlYyApCisJCSkKKwk7CisKK2F0dHJTY29wZQorCToJXiggJ3Njb3BlJyBJRCAoIF4oQU1QRVJTQU5EIC4qKSApKiBBQ1RJT04gKQorCTsKKworZ3JhbW1hclNwZWMKKwk6CUlECisJCShjbXQ9RE9DX0NPTU1FTlQpPworCQkoIF4oT1BUSU9OUyAuKikgKT8KKwkJKCBeKElNUE9SVCAuKikgKT8KKwkJKCBeKFRPS0VOUyAuKikgKT8KKwkJKGF0dHJTY29wZSkqCisJCSggXihBTVBFUlNBTkQgLiopICkqIC8vIHNraXAgYWN0aW9ucworCQlydWxlcworCTsKKworcnVsZXMKKwk6CShydWxlIHwgXihQUkVDX1JVTEUgLiopKSsKKwk7CisKK3J1bGUKKwk6CV4oCVJVTEUgaWQ9SUQKKwkJCXsKKwkJCQljdXJyZW50UnVsZU5hbWUgPSAkaWQudGV4dDsKKwkJCQlmYWN0b3J5LnNldEN1cnJlbnRSdWxlKGdyYW1tYXIuZ2V0TG9jYWxseURlZmluZWRSdWxlKGN1cnJlbnRSdWxlTmFtZSkpOworCQkJfQorCQkJKG1vZGlmaWVyKT8KKwkJCV4oQVJHIChBUkdfQUNUSU9OKT8pCisJCQleKFJFVCAoQVJHX0FDVElPTik/KQorCQkJKHRocm93c1NwZWMpPworCQkJKCBeKE9QVElPTlMgLiopICk/CisJCQkoIHJ1bGVTY29wZVNwZWMgKT8KKwkJCSggXihBTVBFUlNBTkQgLiopICkqCisJCQliPWJsb2NrCisJCQkoZXhjZXB0aW9uR3JvdXApPworCQkJRU9SCisJCQl7CisJCQkJU3RhdGVDbHVzdGVyIGcgPSAkYi5nOworCQkJCWlmICgkYi5zdGFydC5nZXRTZXRWYWx1ZSgpICE9IG51bGwpCisJCQkJeworCQkJCQkvLyBpZiBibG9jayBjb21lcyBiYWNrIGFzIGEgc2V0IG5vdCBCTE9DSywgbWFrZSBpdAorCQkJCQkvLyBhIHNpbmdsZSBBTFQgYmxvY2sKKwkJCQkJZyA9IGZhY3RvcnkuYnVpbGRfQWx0ZXJuYXRpdmVCbG9ja0Zyb21TZXQoZyk7CisJCQkJfQorCQkJCWlmIChSdWxlLmdldFJ1bGVUeXBlKGN1cnJlbnRSdWxlTmFtZSkgPT0gR3JhbW1hci5QQVJTRVIgfHwgZ3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSKQorCQkJCXsKKwkJCQkJLy8gYXR0YWNoIHN0YXJ0IG5vZGUgdG8gYmxvY2sgZm9yIHRoaXMgcnVsZQorCQkJCQlSdWxlIHRoaXNSID0gZ3JhbW1hci5nZXRMb2NhbGx5RGVmaW5lZFJ1bGUoY3VycmVudFJ1bGVOYW1lKTsKKwkJCQkJTkZBU3RhdGUgc3RhcnQgPSB0aGlzUi5zdGFydFN0YXRlOworCQkJCQlzdGFydC5hc3NvY2lhdGVkQVNUTm9kZSA9ICRpZDsKKwkJCQkJc3RhcnQuYWRkVHJhbnNpdGlvbihuZXcgVHJhbnNpdGlvbihMYWJlbC5FUFNJTE9OLCBnLmxlZnQpKTsKKworCQkJCQkvLyB0cmFjayBkZWNpc2lvbiBpZiA+IDEgYWx0cworCQkJCQlpZiAoIGdyYW1tYXIuZ2V0TnVtYmVyT2ZBbHRzRm9yRGVjaXNpb25ORkEoZy5sZWZ0KT4xICkKKwkJCQkJeworCQkJCQkJZy5sZWZ0LnNldERlc2NyaXB0aW9uKGdyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKSk7CisJCQkJCQlnLmxlZnQuc2V0RGVjaXNpb25BU1ROb2RlKCRiLnN0YXJ0KTsKKwkJCQkJCWludCBkID0gZ3JhbW1hci5hc3NpZ25EZWNpc2lvbk51bWJlciggZy5sZWZ0ICk7CisJCQkJCQlncmFtbWFyLnNldERlY2lzaW9uTkZBKCBkLCBnLmxlZnQgKTsKKwkJCQkJCWdyYW1tYXIuc2V0RGVjaXNpb25CbG9ja0FTVChkLCAkYi5zdGFydCk7CisJCQkJCX0KKworCQkJCQkvLyBob29rIHRvIGVuZCBvZiBydWxlIG5vZGUKKwkJCQkJTkZBU3RhdGUgZW5kID0gdGhpc1Iuc3RvcFN0YXRlOworCQkJCQlnLnJpZ2h0LmFkZFRyYW5zaXRpb24obmV3IFRyYW5zaXRpb24oTGFiZWwuRVBTSUxPTixlbmQpKTsKKwkJCQl9CisJCQl9CisJCSkKKwk7CisKK21vZGlmaWVyCisJOgkncHJvdGVjdGVkJworCXwJJ3B1YmxpYycKKwl8CSdwcml2YXRlJworCXwJJ2ZyYWdtZW50JworCTsKKwordGhyb3dzU3BlYworCToJXigndGhyb3dzJyBJRCspCisJOworCitydWxlU2NvcGVTcGVjCisJOgleKCAnc2NvcGUnICggXihBTVBFUlNBTkQgLiopICkqIChBQ1RJT04pPyAoIElEICkqICkKKwk7CisKK2Jsb2NrIHJldHVybnMgW1N0YXRlQ2x1c3RlciBnID0gbnVsbF0KK0Bpbml0Cit7CisJTGlzdDxTdGF0ZUNsdXN0ZXI+IGFsdHMgPSBuZXcgQXJyYXlMaXN0PFN0YXRlQ2x1c3Rlcj4oKTsKKwl0aGlzLmJsb2NrTGV2ZWwrKzsKKwlpZiAoIHRoaXMuYmxvY2tMZXZlbD09MSApCisJCXRoaXMub3V0ZXJBbHROdW09MTsKK30KKwk6CXtncmFtbWFyLmlzVmFsaWRTZXQodGhpcywkc3RhcnQpICYmCisJCSAhY3VycmVudFJ1bGVOYW1lLmVxdWFscyhHcmFtbWFyLkFSVElGSUNJQUxfVE9LRU5TX1JVTEVOQU1FKX0/ID0+CisJCXNldCB7JGcgPSAkc2V0Lmc7fQorCisJfAleKAlCTE9DSyAoIF4oT1BUSU9OUyAuKikgKT8KKwkJCSgJYT1hbHRlcm5hdGl2ZSByZXdyaXRlCisJCQkJeworCQkJCQlhbHRzLmFkZCgkYS5nKTsKKwkJCQl9CisJCQkJe3sKKwkJCQkJaWYgKCBibG9ja0xldmVsID09IDEgKQorCQkJCQkJb3V0ZXJBbHROdW0rKzsKKwkJCQl9fQorCQkJKSsKKwkJCUVPQgorCQkpCisJCXskZyA9IGZhY3RvcnkuYnVpbGRfQWx0ZXJuYXRpdmVCbG9jayhhbHRzKTt9CisJOworZmluYWxseSB7IGJsb2NrTGV2ZWwtLTsgfQorCithbHRlcm5hdGl2ZSByZXR1cm5zIFtTdGF0ZUNsdXN0ZXIgZz1udWxsXQorCToJXiggQUxUIChlPWVsZW1lbnQgeyRnID0gZmFjdG9yeS5idWlsZF9BQigkZywkZS5nKTt9ICkrIEVPQSApCisJCXsKKwkJCWlmICgkZz09bnVsbCkgeyAvLyBpZiBhbHQgd2FzIGEgbGlzdCBvZiBhY3Rpb25zIG9yIHdoYXRldmVyCisJCQkJJGcgPSBmYWN0b3J5LmJ1aWxkX0Vwc2lsb24oKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWZhY3Rvcnkub3B0aW1pemVBbHRlcm5hdGl2ZSgkZyk7CisJCQl9CisJCX0KKwk7CisKK2V4Y2VwdGlvbkdyb3VwCisJOgkoIGV4Y2VwdGlvbkhhbmRsZXIgKSsgKGZpbmFsbHlDbGF1c2UpPworCXwJZmluYWxseUNsYXVzZQorCTsKKworZXhjZXB0aW9uSGFuZGxlcgorCTogICAgXignY2F0Y2gnIEFSR19BQ1RJT04gQUNUSU9OKQorCTsKKworZmluYWxseUNsYXVzZQorCTogICAgXignZmluYWxseScgQUNUSU9OKQorCTsKKworcmV3cml0ZQorCToJXigJUkVXUklURVMKKwkJCSgKKwkJCQl7CisJCQkJCWlmICggZ3JhbW1hci5nZXRPcHRpb24oIm91dHB1dCIpPT1udWxsICkKKwkJCQkJeworCQkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1JFV1JJVEVfT1JfT1BfV0lUSF9OT19PVVRQVVRfT1BUSU9OLAorCQkJCQkJCQkJCQkJICBncmFtbWFyLCAkc3RhcnQuZ2V0VG9rZW4oKSwgY3VycmVudFJ1bGVOYW1lKTsKKwkJCQkJfQorCQkJCX0KKwkJCQleKFJFV1JJVEUgLiopCisJCQkpKgorCQkpCisJfAorCTsKKworZWxlbWVudCByZXR1cm5zIFtTdGF0ZUNsdXN0ZXIgZz1udWxsXQorCTogICBeKFJPT1QgZT1lbGVtZW50IHskZyA9ICRlLmc7fSkKKwl8ICAgXihCQU5HIGU9ZWxlbWVudCB7JGcgPSAkZS5nO30pCisJfAleKEFTU0lHTiBJRCBlPWVsZW1lbnQgeyRnID0gJGUuZzt9KQorCXwJXihQTFVTX0FTU0lHTiBJRCBlPWVsZW1lbnQgeyRnID0gJGUuZzt9KQorCXwgICBeKFJBTkdFIGE9YXRvbVtudWxsXSBiPWF0b21bbnVsbF0pCisJCXskZyA9IGZhY3RvcnkuYnVpbGRfUmFuZ2UoZ3JhbW1hci5nZXRUb2tlblR5cGUoJGEudGV4dCksCisJCQkJCQkJCSBncmFtbWFyLmdldFRva2VuVHlwZSgkYi50ZXh0KSk7fQorCXwgICBeKENIQVJfUkFOR0UgYzE9Q0hBUl9MSVRFUkFMIGMyPUNIQVJfTElURVJBTCkKKwkJeworCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApIHsKKwkJCSRnID0gZmFjdG9yeS5idWlsZF9DaGFyUmFuZ2UoJGMxLnRleHQsICRjMi50ZXh0KTsKKwkJfQorCQl9CisJfCAgIGF0b21fb3Jfbm90YXRvbSB7JGcgPSAkYXRvbV9vcl9ub3RhdG9tLmc7fQorCXwgICBlYm5mIHskZyA9ICRlYm5mLmc7fQorCXwgICB0cmVlXyB7JGcgPSAkdHJlZV8uZzt9CisJfCAgIF4oIFNZTlBSRUQgYmxvY2sgKQorCXwgICBBQ1RJT04geyRnID0gZmFjdG9yeS5idWlsZF9BY3Rpb24oJEFDVElPTik7fQorCXwgICBGT1JDRURfQUNUSU9OIHskZyA9IGZhY3RvcnkuYnVpbGRfQWN0aW9uKCRGT1JDRURfQUNUSU9OKTt9CisJfCAgIHByZWQ9U0VNUFJFRCB7JGcgPSBmYWN0b3J5LmJ1aWxkX1NlbWFudGljUHJlZGljYXRlKCRwcmVkKTt9CisJfCAgIHNwcmVkPVNZTl9TRU1QUkVEIHskZyA9IGZhY3RvcnkuYnVpbGRfU2VtYW50aWNQcmVkaWNhdGUoJHNwcmVkKTt9CisJfCAgIF4oYnByZWQ9QkFDS1RSQUNLX1NFTVBSRUQgLiopIHskZyA9IGZhY3RvcnkuYnVpbGRfU2VtYW50aWNQcmVkaWNhdGUoJGJwcmVkKTt9CisJfCAgIGdwcmVkPUdBVEVEX1NFTVBSRUQgeyRnID0gZmFjdG9yeS5idWlsZF9TZW1hbnRpY1ByZWRpY2F0ZSgkZ3ByZWQpO30KKwl8ICAgRVBTSUxPTiB7JGcgPSBmYWN0b3J5LmJ1aWxkX0Vwc2lsb24oKTt9CisJOworCitlYm5mIHJldHVybnMgW1N0YXRlQ2x1c3RlciBnPW51bGxdCitAaW5pdAoreworCUdyYW1tYXJBU1QgYmxrID0gJHN0YXJ0OworCWlmIChibGsuZ2V0VHlwZSgpICE9IEJMT0NLKSB7CisJCWJsayA9IChHcmFtbWFyQVNUKWJsay5nZXRDaGlsZCgwKTsKKwl9CisJR3JhbW1hckFTVCBlb2IgPSBibGsuZ2V0TGFzdENoaWxkKCk7Cit9CisJOgl7Z3JhbW1hci5pc1ZhbGlkU2V0KHRoaXMsJHN0YXJ0KX0/ID0+IHNldCB7JGcgPSAkc2V0Lmc7fQorCisJfAliPWJsb2NrCisJCXsKKwkJCS8vIHRyYWNrIGRlY2lzaW9uIGlmID4gMSBhbHRzCisJCQlpZiAoIGdyYW1tYXIuZ2V0TnVtYmVyT2ZBbHRzRm9yRGVjaXNpb25ORkEoJGIuZy5sZWZ0KT4xICkKKwkJCXsKKwkJCQkkYi5nLmxlZnQuc2V0RGVzY3JpcHRpb24oZ3JhbW1hci5ncmFtbWFyVHJlZVRvU3RyaW5nKGJsaywgZmFsc2UpKTsKKwkJCQkkYi5nLmxlZnQuc2V0RGVjaXNpb25BU1ROb2RlKGJsayk7CisJCQkJaW50IGQgPSBncmFtbWFyLmFzc2lnbkRlY2lzaW9uTnVtYmVyKCAkYi5nLmxlZnQgKTsKKwkJCQlncmFtbWFyLnNldERlY2lzaW9uTkZBKCBkLCAkYi5nLmxlZnQgKTsKKwkJCQlncmFtbWFyLnNldERlY2lzaW9uQmxvY2tBU1QoZCwgYmxrKTsKKwkJCX0KKwkJCSRnID0gJGIuZzsKKwkJfQorCXwJXiggT1BUSU9OQUwgYj1ibG9jayApCisJCXsKKwkJCVN0YXRlQ2x1c3RlciBiZyA9ICRiLmc7CisJCQlpZiAoIGJsay5nZXRTZXRWYWx1ZSgpIT1udWxsICkKKwkJCXsKKwkJCQkvLyBpZiBibG9jayBjb21lcyBiYWNrIFNFVCBub3QgQkxPQ0ssIG1ha2UgaXQKKwkJCQkvLyBhIHNpbmdsZSBBTFQgYmxvY2sKKwkJCQliZyA9IGZhY3RvcnkuYnVpbGRfQWx0ZXJuYXRpdmVCbG9ja0Zyb21TZXQoYmcpOworCQkJfQorCQkJJGcgPSBmYWN0b3J5LmJ1aWxkX0FvcHRpb25hbChiZyk7CisJCQkkZy5sZWZ0LnNldERlc2NyaXB0aW9uKGdyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKSk7CisJCQkvLyB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIGFsdCBldmVuIGlmIGJsb2NrIGhhcyBqdXN0IDEgYWx0CisJCQlpbnQgZCA9IGdyYW1tYXIuYXNzaWduRGVjaXNpb25OdW1iZXIoICRnLmxlZnQgKTsKKwkJCWdyYW1tYXIuc2V0RGVjaXNpb25ORkEoZCwgJGcubGVmdCk7CisJCQlncmFtbWFyLnNldERlY2lzaW9uQmxvY2tBU1QoZCwgYmxrKTsKKwkJCSRnLmxlZnQuc2V0RGVjaXNpb25BU1ROb2RlKCRzdGFydCk7CisJCX0KKwl8CV4oIENMT1NVUkUgYj1ibG9jayApCisJCXsKKwkJCVN0YXRlQ2x1c3RlciBiZyA9ICRiLmc7CisJCQlpZiAoIGJsay5nZXRTZXRWYWx1ZSgpIT1udWxsICkKKwkJCXsKKwkJCQliZyA9IGZhY3RvcnkuYnVpbGRfQWx0ZXJuYXRpdmVCbG9ja0Zyb21TZXQoYmcpOworCQkJfQorCQkJJGcgPSBmYWN0b3J5LmJ1aWxkX0FzdGFyKGJnKTsKKwkJCS8vIHRyYWNrIHRoZSBsb29wIGJhY2sgLyBleGl0IGRlY2lzaW9uIHBvaW50CisJCQliZy5yaWdodC5zZXREZXNjcmlwdGlvbigiKCkqIGxvb3BiYWNrIG9mICIrZ3JhbW1hci5ncmFtbWFyVHJlZVRvU3RyaW5nKCRzdGFydCwgZmFsc2UpKTsKKwkJCWludCBkID0gZ3JhbW1hci5hc3NpZ25EZWNpc2lvbk51bWJlciggYmcucmlnaHQgKTsKKwkJCWdyYW1tYXIuc2V0RGVjaXNpb25ORkEoZCwgYmcucmlnaHQpOworCQkJZ3JhbW1hci5zZXREZWNpc2lvbkJsb2NrQVNUKGQsIGJsayk7CisJCQliZy5yaWdodC5zZXREZWNpc2lvbkFTVE5vZGUoZW9iKTsKKwkJCS8vIG1ha2UgYmxvY2sgZW50cnkgc3RhdGUgYWxzbyBoYXZlIHNhbWUgZGVjaXNpb24gZm9yIGludGVycHJldGluZyBncmFtbWFyCisJCQlORkFTdGF0ZSBhbHRCbG9ja1N0YXRlID0gKE5GQVN0YXRlKSRnLmxlZnQudHJhbnNpdGlvbigwKS50YXJnZXQ7CisJCQlhbHRCbG9ja1N0YXRlLnNldERlY2lzaW9uQVNUTm9kZSgkc3RhcnQpOworCQkJYWx0QmxvY2tTdGF0ZS5zZXREZWNpc2lvbk51bWJlcihkKTsKKwkJCSRnLmxlZnQuc2V0RGVjaXNpb25OdW1iZXIoZCk7IC8vIHRoaXMgaXMgdGhlIGJ5cGFzcyBkZWNpc2lvbiAoMiBhbHRzKQorCQkJJGcubGVmdC5zZXREZWNpc2lvbkFTVE5vZGUoJHN0YXJ0KTsKKwkJfQorCXwJXiggUE9TSVRJVkVfQ0xPU1VSRSBiPWJsb2NrICkKKwkJeworCQkJU3RhdGVDbHVzdGVyIGJnID0gJGIuZzsKKwkJCWlmICggYmxrLmdldFNldFZhbHVlKCkhPW51bGwgKQorCQkJeworCQkJCWJnID0gZmFjdG9yeS5idWlsZF9BbHRlcm5hdGl2ZUJsb2NrRnJvbVNldChiZyk7CisJCQl9CisJCQkkZyA9IGZhY3RvcnkuYnVpbGRfQXBsdXMoYmcpOworCQkJLy8gZG9uJ3QgbWFrZSBhIGRlY2lzaW9uIG9uIGxlZnQgZWRnZSwgY2FuIHJldXNlIGxvb3AgZW5kIGRlY2lzaW9uCisJCQkvLyB0cmFjayB0aGUgbG9vcCBiYWNrIC8gZXhpdCBkZWNpc2lvbiBwb2ludAorCQkJYmcucmlnaHQuc2V0RGVzY3JpcHRpb24oIigpKyBsb29wYmFjayBvZiAiK2dyYW1tYXIuZ3JhbW1hclRyZWVUb1N0cmluZygkc3RhcnQsIGZhbHNlKSk7CisJCQlpbnQgZCA9IGdyYW1tYXIuYXNzaWduRGVjaXNpb25OdW1iZXIoIGJnLnJpZ2h0ICk7CisJCQlncmFtbWFyLnNldERlY2lzaW9uTkZBKGQsIGJnLnJpZ2h0KTsKKwkJCWdyYW1tYXIuc2V0RGVjaXNpb25CbG9ja0FTVChkLCBibGspOworCQkJYmcucmlnaHQuc2V0RGVjaXNpb25BU1ROb2RlKGVvYik7CisJCQkvLyBtYWtlIGJsb2NrIGVudHJ5IHN0YXRlIGFsc28gaGF2ZSBzYW1lIGRlY2lzaW9uIGZvciBpbnRlcnByZXRpbmcgZ3JhbW1hcgorCQkJTkZBU3RhdGUgYWx0QmxvY2tTdGF0ZSA9IChORkFTdGF0ZSkkZy5sZWZ0LnRyYW5zaXRpb24oMCkudGFyZ2V0OworCQkJYWx0QmxvY2tTdGF0ZS5zZXREZWNpc2lvbkFTVE5vZGUoJHN0YXJ0KTsKKwkJCWFsdEJsb2NrU3RhdGUuc2V0RGVjaXNpb25OdW1iZXIoZCk7CisJCX0KKwk7CisKK3RyZWVfIHJldHVybnMgW1N0YXRlQ2x1c3RlciBnPW51bGxdCitAaW5pdAoreworCVN0YXRlQ2x1c3RlciBkb3duPW51bGwsIHVwPW51bGw7Cit9CisJOgleKAlUUkVFX0JFR0lOCisJCQllPWVsZW1lbnQgeyAkZyA9ICRlLmc7IH0KKwkJCXsKKwkJCQlkb3duID0gZmFjdG9yeS5idWlsZF9BdG9tKExhYmVsLkRPV04sICRlLnN0YXJ0KTsKKwkJCQkvLyBUT0RPIHNldCBmb2xsb3dpbmcgc3RhdGVzIGZvciBpbWFnaW5hcnkgbm9kZXM/CisJCQkJLy9lbC5mb2xsb3dpbmdORkFTdGF0ZSA9IGRvd24ucmlnaHQ7CisJCQkJJGcgPSBmYWN0b3J5LmJ1aWxkX0FCKCRnLGRvd24pOworCQkJfQorCQkJKCBlPWVsZW1lbnQgeyRnID0gZmFjdG9yeS5idWlsZF9BQigkZywkZS5nKTt9ICkqCisJCQl7CisJCQkJdXAgPSBmYWN0b3J5LmJ1aWxkX0F0b20oTGFiZWwuVVAsICRlLnN0YXJ0KTsKKwkJCQkvL2VsLmZvbGxvd2luZ05GQVN0YXRlID0gdXAucmlnaHQ7CisJCQkJJGcgPSBmYWN0b3J5LmJ1aWxkX0FCKCRnLHVwKTsKKwkJCQkvLyB0cmVlIHJvb3RzIHBvaW50IGF0IHJpZ2h0IGVkZ2Ugb2YgRE9XTiBmb3IgTE9PSyBjb21wdXRhdGlvbiBsYXRlcgorCQkJCSRzdGFydC5ORkFUcmVlRG93blN0YXRlID0gZG93bi5sZWZ0OworCQkJfQorCQkpCisJOworCithdG9tX29yX25vdGF0b20gcmV0dXJucyBbU3RhdGVDbHVzdGVyIGc9bnVsbF0KKwk6CWF0b21bbnVsbF0geyRnID0gJGF0b20uZzt9CisJfAleKAluPU5PVAorCQkJKAljPUNIQVJfTElURVJBTCAoYXN0MT1hc3Rfc3VmZml4KT8KKwkJCQl7CisJCQkJCWludCB0dHlwZT0wOworCQkJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQkJCXsKKwkJCQkJCXR0eXBlID0gR3JhbW1hci5nZXRDaGFyVmFsdWVGcm9tR3JhbW1hckNoYXJMaXRlcmFsKCRjLnRleHQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdHR5cGUgPSBncmFtbWFyLmdldFRva2VuVHlwZSgkYy50ZXh0KTsKKwkJCQkJfQorCQkJCQlJbnRTZXQgbm90QXRvbSA9IGdyYW1tYXIuY29tcGxlbWVudCh0dHlwZSk7CisJCQkJCWlmICggbm90QXRvbS5pc05pbCgpICkKKwkJCQkJeworCQkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcigKKwkJCQkJCQlFcnJvck1hbmFnZXIuTVNHX0VNUFRZX0NPTVBMRU1FTlQsCisJCQkJCQkJZ3JhbW1hciwKKwkJCQkJCQkkYy5nZXRUb2tlbigpLAorCQkJCQkJCSRjLnRleHQpOworCQkJCQl9CisJCQkJCSRnPWZhY3RvcnkuYnVpbGRfU2V0KG5vdEF0b20sJG4pOworCQkJCX0KKwkJCXwJdD1UT0tFTl9SRUYgKGFzdDM9YXN0X3N1ZmZpeCk/CisJCQkJeworCQkJCQlpbnQgdHR5cGU9MDsKKwkJCQkJSW50U2V0IG5vdEF0b20gPSBudWxsOworCQkJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQkJCXsKKwkJCQkJCW5vdEF0b20gPSBncmFtbWFyLmdldFNldEZyb21SdWxlKHRoaXMsJHQudGV4dCk7CisJCQkJCQlpZiAoIG5vdEF0b209PW51bGwgKQorCQkJCQkJeworCQkJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQkJCUVycm9yTWFuYWdlci5NU0dfUlVMRV9JTlZBTElEX1NFVCwKKwkJCQkJCQkJZ3JhbW1hciwKKwkJCQkJCQkJJHQuZ2V0VG9rZW4oKSwKKwkJCQkJCQkJJHQudGV4dCk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJbm90QXRvbSA9IGdyYW1tYXIuY29tcGxlbWVudChub3RBdG9tKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUoJHQudGV4dCk7CisJCQkJCQlub3RBdG9tID0gZ3JhbW1hci5jb21wbGVtZW50KHR0eXBlKTsKKwkJCQkJfQorCQkJCQlpZiAoIG5vdEF0b209PW51bGwgfHwgbm90QXRvbS5pc05pbCgpICkKKwkJCQkJeworCQkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcigKKwkJCQkJCQlFcnJvck1hbmFnZXIuTVNHX0VNUFRZX0NPTVBMRU1FTlQsCisJCQkJCQkJZ3JhbW1hciwKKwkJCQkJCQkkdC5nZXRUb2tlbigpLAorCQkJCQkJCSR0LnRleHQpOworCQkJCQl9CisJCQkJCSRnPWZhY3RvcnkuYnVpbGRfU2V0KG5vdEF0b20sJG4pOworCQkJCX0KKwkJCXwJc2V0IHskZyA9ICRzZXQuZzt9CisJCQkJeworCQkJCQlHcmFtbWFyQVNUIHN0Tm9kZSA9IChHcmFtbWFyQVNUKSRuLmdldENoaWxkKDApOworCQkJCQkvL0ludFNldCBub3RTZXQgPSBncmFtbWFyLmNvbXBsZW1lbnQoc3ROb2RlLmdldFNldFZhbHVlKCkpOworCQkJCQkvLyBsZXQgY29kZSBnZW5lcmF0b3IgY29tcGxlbWVudCB0aGUgc2V0cworCQkJCQlJbnRTZXQgcyA9IHN0Tm9kZS5nZXRTZXRWYWx1ZSgpOworCQkJCQlzdE5vZGUuc2V0U2V0VmFsdWUocyk7CisJCQkJCS8vIGxldCBjb2RlIGdlbiBkbyB0aGUgY29tcGxlbWVudCBhZ2FpbjsgaGVyZSB3ZSBjb21wdXRlCisJCQkJCS8vIGZvciBORkEgY29uc3RydWN0aW9uCisJCQkJCXMgPSBncmFtbWFyLmNvbXBsZW1lbnQocyk7CisJCQkJCWlmICggcy5pc05pbCgpICkKKwkJCQkJeworCQkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcigKKwkJCQkJCQlFcnJvck1hbmFnZXIuTVNHX0VNUFRZX0NPTVBMRU1FTlQsCisJCQkJCQkJZ3JhbW1hciwKKwkJCQkJCQkkbi5nZXRUb2tlbigpKTsKKwkJCQkJfQorCQkJCQkkZz1mYWN0b3J5LmJ1aWxkX1NldChzLCRuKTsKKwkJCQl9CisJCQkpCisJCQl7JG4uZm9sbG93aW5nTkZBU3RhdGUgPSAkZy5yaWdodDt9CisJCSkKKwk7CisKK2F0b21bU3RyaW5nIHNjb3BlTmFtZV0gcmV0dXJucyBbU3RhdGVDbHVzdGVyIGc9bnVsbF0KKwk6CV4oIHI9UlVMRV9SRUYgKHJhcmc9QVJHX0FDVElPTik/IChhczE9YXN0X3N1ZmZpeCk/ICkKKwkJeworCQkJTkZBU3RhdGUgc3RhcnQgPSBncmFtbWFyLmdldFJ1bGVTdGFydFN0YXRlKHNjb3BlTmFtZSwkci50ZXh0KTsKKwkJCWlmICggc3RhcnQhPW51bGwgKQorCQkJeworCQkJCVJ1bGUgcnIgPSBncmFtbWFyLmdldFJ1bGUoc2NvcGVOYW1lLCRyLnRleHQpOworCQkJCSRnID0gZmFjdG9yeS5idWlsZF9SdWxlUmVmKHJyLCBzdGFydCk7CisJCQkJci5mb2xsb3dpbmdORkFTdGF0ZSA9ICRnLnJpZ2h0OworCQkJCXIuTkZBU3RhcnRTdGF0ZSA9ICRnLmxlZnQ7CisJCQkJaWYgKCAkZy5sZWZ0LnRyYW5zaXRpb24oMCkgaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24KKwkJCQkJJiYgZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICkKKwkJCQl7CisJCQkJCWFkZEZvbGxvd1RyYW5zaXRpb24oJHIudGV4dCwgJGcucmlnaHQpOworCQkJCX0KKwkJCQkvLyBlbHNlIHJ1bGUgcmVmIGdvdCBpbmxpbmVkIHRvIGEgc2V0CisJCQl9CisJCX0KKworCXwJXiggdD1UT0tFTl9SRUYgICh0YXJnPUFSR19BQ1RJT04pPyAoYXMyPWFzdF9zdWZmaXgpPyApCisJCXsKKwkJCWlmICggZ3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSICkKKwkJCXsKKwkJCQlORkFTdGF0ZSBzdGFydCA9IGdyYW1tYXIuZ2V0UnVsZVN0YXJ0U3RhdGUoc2NvcGVOYW1lLCR0LnRleHQpOworCQkJCWlmICggc3RhcnQhPW51bGwgKQorCQkJCXsKKwkJCQkJUnVsZSByciA9IGdyYW1tYXIuZ2V0UnVsZShzY29wZU5hbWUsdC5nZXRUZXh0KCkpOworCQkJCQkkZyA9IGZhY3RvcnkuYnVpbGRfUnVsZVJlZihyciwgc3RhcnQpOworCQkJCQl0Lk5GQVN0YXJ0U3RhdGUgPSAkZy5sZWZ0OworCQkJCQkvLyBkb24ndCBhZGQgRk9MTE9XIHRyYW5zaXRpb25zIGluIHRoZSBsZXhlcjsKKwkJCQkJLy8gb25seSBleGFjdCBjb250ZXh0IHNob3VsZCBiZSB1c2VkLgorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkkZyA9IGZhY3RvcnkuYnVpbGRfQXRvbSh0KTsKKwkJCQl0LmZvbGxvd2luZ05GQVN0YXRlID0gJGcucmlnaHQ7CisJCQl9CisJCX0KKworCXwJXiggYz1DSEFSX0xJVEVSQUwgIChhczM9YXN0X3N1ZmZpeCk/ICkKKwkJeworCQkJaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCSRnID0gZmFjdG9yeS5idWlsZF9DaGFyTGl0ZXJhbEF0b20oYyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJJGcgPSBmYWN0b3J5LmJ1aWxkX0F0b20oYyk7CisJCQkJYy5mb2xsb3dpbmdORkFTdGF0ZSA9ICRnLnJpZ2h0OworCQkJfQorCQl9CisKKwl8CV4oIHM9U1RSSU5HX0xJVEVSQUwgIChhczQ9YXN0X3N1ZmZpeCk/ICkKKwkJeworCQkJaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKQorCQkJeworCQkJCSRnID0gZmFjdG9yeS5idWlsZF9TdHJpbmdMaXRlcmFsQXRvbShzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkkZyA9IGZhY3RvcnkuYnVpbGRfQXRvbShzKTsKKwkJCQlzLmZvbGxvd2luZ05GQVN0YXRlID0gJGcucmlnaHQ7CisJCQl9CisJCX0KKworCXwJXigJdz1XSUxEQ0FSRCAoYXM1PWFzdF9zdWZmaXgpPyApCisJCQl7CisJCQkJaWYgKCBuZmEuZ3JhbW1hci50eXBlID09IEdyYW1tYXIuVFJFRV9QQVJTRVIKKwkJCQkJJiYgKHcuZ2V0Q2hpbGRJbmRleCgpID4gMCB8fCB3LmdldFBhcmVudCgpLmdldENoaWxkKDEpLmdldFR5cGUoKSA9PSBFT0EpICkKKwkJCQl7CisJCQkJCSRnID0gZmFjdG9yeS5idWlsZF9XaWxkY2FyZFRyZWUoICR3ICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSRnID0gZmFjdG9yeS5idWlsZF9XaWxkY2FyZCggJHcgKTsKKwkJCQl9CisJCQl9CisKKwl8CV4oIERPVCBzY29wZV89SUQgYT1hdG9tWyRzY29wZV8udGV4dF0geyRnID0gJGEuZzt9ICkgLy8gc2NvcGUgb3ZlcnJpZGUKKwk7CisKK2FzdF9zdWZmaXgKKwk6CVJPT1QKKwl8CUJBTkcKKwk7CisKK3NldCByZXR1cm5zIFtTdGF0ZUNsdXN0ZXIgZz1udWxsXQorQGluaXQKK3sKKwlJbnRTZXQgZWxlbWVudHM9bmV3IEludGVydmFsU2V0KCk7CisJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCApCisJCSRzdGFydC5zZXRTZXRWYWx1ZShlbGVtZW50cyk7IC8vIHRyYWNrIHNldCBmb3IgdXNlIGJ5IGNvZGUgZ2VuCit9CisJOgleKCBiPUJMT0NLCisJCSAgICheKEFMVCAoIF4oQkFDS1RSQUNLX1NFTVBSRUQgLiopICk/IHNldEVsZW1lbnRbZWxlbWVudHNdIEVPQSkpKworCQkgICBFT0IKKwkJICkKKwkJeworCQkkZyA9IGZhY3RvcnkuYnVpbGRfU2V0KGVsZW1lbnRzLCRiKTsKKwkJJGIuZm9sbG93aW5nTkZBU3RhdGUgPSAkZy5yaWdodDsKKwkJJGIuc2V0U2V0VmFsdWUoZWxlbWVudHMpOyAvLyB0cmFjayBzZXQgdmFsdWUgb2YgdGhpcyBibG9jaworCQl9CisJCS8ve1N5c3RlbS5vdXQucHJpbnRsbigic2V0IGVsZW1lbnRzPSIrZWxlbWVudHMudG9TdHJpbmcoZ3JhbW1hcikpO30KKwk7CisKK3NldFJ1bGUgcmV0dXJucyBbSW50U2V0IGVsZW1lbnRzPW5ldyBJbnRlcnZhbFNldCgpXQorQGluaXQKK3sKKwlJbnRTZXQgcz1udWxsOworfQorCToJXiggUlVMRSBpZD1JRCAobW9kaWZpZXIpPyBBUkcgUkVUICggXihPUFRJT05TIC4qKSApPyAoIHJ1bGVTY29wZVNwZWMgKT8KKwkJCSggXihBTVBFUlNBTkQgLiopICkqCisJCQleKCBCTE9DSyAoIF4oT1BUSU9OUyAuKikgKT8KKwkJCSAgICggXihBTFQgKEJBQ0tUUkFDS19TRU1QUkVEKT8gc2V0RWxlbWVudFtlbGVtZW50c10gRU9BKSApKworCQkJICAgRU9CCisJCQkgKQorCQkJKGV4Y2VwdGlvbkdyb3VwKT8KKwkJCUVPUgorCQkgKQorCTsKK2NhdGNoW1JlY29nbml0aW9uRXhjZXB0aW9uIHJlXSB7IHRocm93IHJlOyB9CisKK3NldEVsZW1lbnRbSW50U2V0IGVsZW1lbnRzXQorQGluaXQKK3sKKwlpbnQgdHR5cGU7CisJSW50U2V0IG5zPW51bGw7Cit9CisJOgljPUNIQVJfTElURVJBTAorCQl7CisJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQl7CisJCQkJdHR5cGUgPSBHcmFtbWFyLmdldENoYXJWYWx1ZUZyb21HcmFtbWFyQ2hhckxpdGVyYWwoJGMudGV4dCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdHR5cGUgPSBncmFtbWFyLmdldFRva2VuVHlwZSgkYy50ZXh0KTsKKwkJCX0KKwkJCWlmICggZWxlbWVudHMubWVtYmVyKHR0eXBlKSApCisJCQl7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcigKKwkJCQkJRXJyb3JNYW5hZ2VyLk1TR19EVVBMSUNBVEVfU0VUX0VOVFJZLAorCQkJCQlncmFtbWFyLAorCQkJCQkkYy5nZXRUb2tlbigpLAorCQkJCQkkYy50ZXh0KTsKKwkJCX0KKwkJCWVsZW1lbnRzLmFkZCh0dHlwZSk7CisJCX0KKwl8CXQ9VE9LRU5fUkVGCisJCXsKKwkJCWlmICggZ3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSICkKKwkJCXsKKwkJCQkvLyByZWN1cnNpdmVseSB3aWxsIGludm9rZSB0aGlzIHJ1bGUgdG8gbWF0Y2ggZWxlbWVudHMgaW4gdGFyZ2V0IHJ1bGUgcmVmCisJCQkJSW50U2V0IHJ1bGVTZXQgPSBncmFtbWFyLmdldFNldEZyb21SdWxlKHRoaXMsJHQudGV4dCk7CisJCQkJaWYgKCBydWxlU2V0PT1udWxsICkKKwkJCQl7CisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX1JVTEVfSU5WQUxJRF9TRVQsCisJCQkJCQlncmFtbWFyLAorCQkJCQkJJHQuZ2V0VG9rZW4oKSwKKwkJCQkJCSR0LnRleHQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQllbGVtZW50cy5hZGRBbGwocnVsZVNldCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUoJHQudGV4dCk7CisJCQkJaWYgKCBlbGVtZW50cy5tZW1iZXIodHR5cGUpICkKKwkJCQl7CisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX0RVUExJQ0FURV9TRVRfRU5UUlksCisJCQkJCQlncmFtbWFyLAorCQkJCQkJJHQuZ2V0VG9rZW4oKSwKKwkJCQkJCSR0LnRleHQpOworCQkJCX0KKwkJCQllbGVtZW50cy5hZGQodHR5cGUpOworCQkJfQorCQl9CisKKwl8CXM9U1RSSU5HX0xJVEVSQUwKKwkJeworCQkJdHR5cGUgPSBncmFtbWFyLmdldFRva2VuVHlwZSgkcy50ZXh0KTsKKwkJCWlmICggZWxlbWVudHMubWVtYmVyKHR0eXBlKSApCisJCQl7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcigKKwkJCQkJRXJyb3JNYW5hZ2VyLk1TR19EVVBMSUNBVEVfU0VUX0VOVFJZLAorCQkJCQlncmFtbWFyLAorCQkJCQkkcy5nZXRUb2tlbigpLAorCQkJCQkkcy50ZXh0KTsKKwkJCX0KKwkJCWVsZW1lbnRzLmFkZCh0dHlwZSk7CisJCX0KKwl8CV4oQ0hBUl9SQU5HRSBjMT1DSEFSX0xJVEVSQUwgYzI9Q0hBUl9MSVRFUkFMKQorCQl7CisJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApCisJCQl7CisJCQkJaW50IGEgPSBHcmFtbWFyLmdldENoYXJWYWx1ZUZyb21HcmFtbWFyQ2hhckxpdGVyYWwoJGMxLnRleHQpOworCQkJCWludCBiID0gR3JhbW1hci5nZXRDaGFyVmFsdWVGcm9tR3JhbW1hckNoYXJMaXRlcmFsKCRjMi50ZXh0KTsKKwkJCQllbGVtZW50cy5hZGRBbGwoSW50ZXJ2YWxTZXQub2YoYSxiKSk7CisJCQl9CisJCX0KKworCXwJZ3NldD1zZXQKKwkJeworCQkJVHJhbnNpdGlvbiBzZXRUcmFucyA9ICRnc2V0LmcubGVmdC50cmFuc2l0aW9uKDApOworCQkJZWxlbWVudHMuYWRkQWxsKHNldFRyYW5zLmxhYmVsLmdldFNldCgpKTsKKwkJfQorCisJfAleKAlOT1Qge25zPW5ldyBJbnRlcnZhbFNldCgpO30KKwkJCXNldEVsZW1lbnRbbnNdCisJCQl7CisJCQkJSW50U2V0IG5vdCA9IGdyYW1tYXIuY29tcGxlbWVudChucyk7CisJCQkJZWxlbWVudHMuYWRkQWxsKG5vdCk7CisJCQl9CisJCSkKKwk7CisKKy8qKiBDaGVjayB0byBzZWUgaWYgdGhpcyBibG9jayBjYW4gYmUgYSBzZXQuICBDYW4ndCBoYXZlIGFjdGlvbnMKKyAqICBldGMuLi4gIEFsc28gY2FuJ3QgYmUgaW4gYSBydWxlIHdpdGggYSByZXdyaXRlIGFzIHdlIG5lZWQKKyAqICB0byB0cmFjayB3aGF0J3MgaW5zaWRlIHNldCBmb3IgdXNlIGluIHJld3JpdGUuCisgKgorICogIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGhlbHBlciBmdW5jdGlvbiBpbiBUcmVlVG9ORkFDb252ZXJ0ZXJIZWxwZXIuY3MKKyAqICBhbmQgZnJvbSB0aGUgcnVsZSB0ZXN0U2V0RWxlbWVudCBiZWxvdy4KKyAqLwordGVzdEJsb2NrQXNTZXQgcmV0dXJucyBbaW50IGFsdHM9MF0KK29wdGlvbnMgeyBiYWNrdHJhY2sgPSB0cnVlOyB9CitAaW5pdAoreworCWluVGVzdCsrOworfQorCToJXigJQkxPQ0sKKwkJCSgJXihBTFQgKEJBQ0tUUkFDS19TRU1QUkVEKT8gdGVzdFNldEVsZW1lbnQge3skYWx0cyArPSAkdGVzdFNldEVsZW1lbnQuYWx0czt9fSBFT0EpCisJCQkpKworCQkJRU9CCisJCSkKKwk7CitjYXRjaFtSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZV0geyB0aHJvdyByZTsgfQorZmluYWxseSB7IGluVGVzdC0tOyB9CisKK3Rlc3RTZXRSdWxlIHJldHVybnMgW2ludCBhbHRzPTBdCitAaW5pdAoreworCWluVGVzdCsrOworfQorCToJXigJUlVMRSBpZD1JRCAobW9kaWZpZXIpPyBBUkcgUkVUICggXihPUFRJT05TIC4qKSApPyAoIHJ1bGVTY29wZVNwZWMgKT8KKwkJCSggXihBTVBFUlNBTkQgLiopICkqCisJCQleKAlCTE9DSworCQkJCSgJXihBTFQgKEJBQ0tUUkFDS19TRU1QUkVEKT8gdGVzdFNldEVsZW1lbnQge3skYWx0cyArPSAkdGVzdFNldEVsZW1lbnQuYWx0czt9fSBFT0EpCisJCQkJKSsKKwkJCQlFT0IKKwkJCSkKKwkJCShleGNlcHRpb25Hcm91cCk/CisJCQlFT1IKKwkJKQorCTsKK2NhdGNoW1JlY29nbml0aW9uRXhjZXB0aW9uIHJlXSB7IHRocm93IHJlOyB9CitmaW5hbGx5IHsgaW5UZXN0LS07IH0KKworLyoqIE1hdGNoIGp1c3QgYW4gZWxlbWVudDsgbm8gYXN0IHN1ZmZpeCBldGMuLiAqLwordGVzdFNldEVsZW1lbnQgcmV0dXJucyBbaW50IGFsdHM9MV0KKwk6CWM9Q0hBUl9MSVRFUkFMIHshaGFzRWxlbWVudE9wdGlvbnMoJGMpfT8KKwl8CXQ9VE9LRU5fUkVGIHshaGFzRWxlbWVudE9wdGlvbnMoJHQpfT8KKwkJe3sKKwkJCWlmICggZ3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSICkKKwkJCXsKKwkJCQlSdWxlIHJ1bGUgPSBncmFtbWFyLmdldFJ1bGUoJHQudGV4dCk7CisJCQkJaWYgKCBydWxlPT1udWxsICkKKwkJCQl7CisJCQkJCS8vdGhyb3cgbmV3IFJlY29nbml0aW9uRXhjZXB0aW9uKCJpbnZhbGlkIHJ1bGUiKTsKKwkJCQkJdGhyb3cgbmV3IFJlY29nbml0aW9uRXhjZXB0aW9uKCk7CisJCQkJfQorCQkJCS8vIHJlY3Vyc2l2ZWx5IHdpbGwgaW52b2tlIHRoaXMgcnVsZSB0byBtYXRjaCBlbGVtZW50cyBpbiB0YXJnZXQgcnVsZSByZWYKKwkJCQkkYWx0cyArPSB0ZXN0U2V0UnVsZShydWxlLnRyZWUpOworCQkJfQorCQl9fQorCXwgICB7Z3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSfT8gPT4gcz1TVFJJTkdfTElURVJBTAorCXwJXihDSEFSX1JBTkdFIGMxPUNIQVJfTElURVJBTCBjMj1DSEFSX0xJVEVSQUwpCisJCXt7ICRhbHRzID0gSW50ZXJ2YWxTZXQub2YoIEdyYW1tYXIuZ2V0Q2hhclZhbHVlRnJvbUdyYW1tYXJDaGFyTGl0ZXJhbCgkYzEudGV4dCksIEdyYW1tYXIuZ2V0Q2hhclZhbHVlRnJvbUdyYW1tYXJDaGFyTGl0ZXJhbCgkYzIudGV4dCkgKS5zaXplKCk7IH19CisJfCAgIHRlc3RCbG9ja0FzU2V0CisJCXt7ICRhbHRzID0gJHRlc3RCbG9ja0FzU2V0LmFsdHM7IH19CisJfCAgIF4oIE5PVCB0c2U9dGVzdFNldEVsZW1lbnQgKQorCQl7eyAkYWx0cyA9IGdyYW1tYXIuZ2V0VG9rZW5UeXBlcygpLnNpemUoKSAtICR0c2UuYWx0czsgfX0KKwk7CitjYXRjaFtSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZV0geyB0aHJvdyByZTsgfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvVG9vbC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzZiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9Ub29sLmphdmEKQEAgLTAsMCArMSwxMzkwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5HcmFwaDsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5taXNjLlN0YXRzOworaW1wb3J0IG9yZy5hbnRsci50b29sLio7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXA7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBUaGUgbWFpbiBBTlRMUiBlbnRyeSBwb2ludC4gIFJlYWQgYSBncmFtbWFyIGFuZCBnZW5lcmF0ZSBhIHBhcnNlci4gKi8KK3B1YmxpYyBjbGFzcyBUb29sIHsKKworICAgIHB1YmxpYyBmaW5hbCBQcm9wZXJ0aWVzIGFudGxyU2V0dGluZ3MgPSBuZXcgUHJvcGVydGllcygpOworICAgIHB1YmxpYyBTdHJpbmcgVkVSU0lPTiA9ICIzLjQiOworICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIke3Byb2plY3QudmVyc2lvbn0iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSU5JVElBTElaRURfRElSID0gIjx1bnNldC1kaXI+IjsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBncmFtbWFyRmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlX05GQV9kb3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVfREZBX2RvdCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9ICIuIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZU91dHB1dERpciA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGlucHV0RGlyZWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnRHcmFtbWFyRGlyZWN0b3J5OworICAgIHByaXZhdGUgU3RyaW5nIGdyYW1tYXJPdXRwdXREaXJlY3Rvcnk7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhdmVJbnB1dERpciA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGxpYkRpcmVjdG9yeSA9ICIuIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhY2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHJvZmlsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiByZXBvcnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHJpbnRHcmFtbWFyID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGRlcGVuZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZUFsbEZpbGVzVG9PdXRwdXREaXIgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9yY2VSZWxhdGl2ZU91dHB1dCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBib29sZWFuIGRlbGV0ZVRlbXBMZXhlciA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKyAgICAvKiogRG9uJ3QgcHJvY2VzcyBncmFtbWFyIGZpbGUgaWYgZ2VuZXJhdGVkIGZpbGVzIGFyZSBuZXdlciB0aGFuIGdyYW1tYXIgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWFrZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzaG93QmFubmVyID0gdHJ1ZTsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4aXROb3cgPSBmYWxzZTsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJldHVybl9kb250X2V4aXQgPSBmYWxzZTsKKworCisJcHVibGljIFN0cmluZyBmb3JjZWRMYW5ndWFnZU9wdGlvbjsgLy8gLWxhbmd1YWdlIEwgb24gY29tbWFuZCBsaW5lCisKKyAgICAvLyBUaGUgaW50ZXJuYWwgb3B0aW9ucyBhcmUgZm9yIG15IHVzZSBvbiB0aGUgY29tbWFuZCBsaW5lIGR1cmluZyBkZXYKKyAgICAvLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnRlcm5hbE9wdGlvbl9QcmludEdyYW1tYXJUcmVlID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludGVybmFsT3B0aW9uX1ByaW50REZBID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludGVybmFsT3B0aW9uX1Nob3dORkFDb25maWdzSW5ERkEgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJuYWxPcHRpb25fd2F0Y2hORkFDb252ZXJzaW9uID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgZGVwZW5kZW5jeSBnZW5lcmF0b3JzIHRoYXQgYXJlIGFjY3VtdWxhdGVkIGFhYWFzIChhbmQgaWYpIHRoZQorICAgICAqIHRvb2wgaXMgcmVxdWlyZWQgdG8gc29ydCB0aGUgcHJvdmlkZWQgZ3JhbW1hcnMgaW50byBidWlsZCBkZXBlbmRlbmN5IG9yZGVyLgorICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBCdWlsZERlcGVuZGVuY3lHZW5lcmF0b3I+IGJ1aWxkRGVwZW5kZW5jeUdlbmVyYXRvcnM7CisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRvb2wgYW50bHIgPSBuZXcgVG9vbChhcmdzKTsKKworICAgICAgICBpZiAoIWV4aXROb3cpIHsKKyAgICAgICAgICAgIGFudGxyLnByb2Nlc3MoKTsKKwkJCWlmICggcmV0dXJuX2RvbnRfZXhpdCApIHJldHVybjsKKyAgICAgICAgICAgIGlmIChFcnJvck1hbmFnZXIuZ2V0TnVtRXJyb3JzKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIHByb3BlcnRpZXMgZmlsZSBvcmcvYW50bHIvYW50bHIucHJvcGVydGllcyBhbmQgcG9wdWxhdGUgYW55CisgICAgICogdmFyaWFibGVzIHRoYXQgbXVzdCBiZSBpbml0aWFsaXplZCBmcm9tIGl0LCBzdWNoIGFzIHRoZSB2ZXJzaW9uIG9mIEFOVExSLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkUmVzb3VyY2VzKCkgeworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgIGluID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImFudGxyLnByb3BlcnRpZXMiKTsKKworICAgICAgICAvLyBJZiB3ZSBmb3VuZCB0aGUgcmVzb3VyY2UsIHRoZW4gbG9hZCBpdCwgb3RoZXJ3aXNlIHJldmVydCB0byB0aGUKKyAgICAgICAgLy8gZGVmYXVsdHMuCisgICAgICAgIC8vCisgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlc291cmNlcyBpbnRvIHRoZSBtYXAKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGFudGxyU2V0dGluZ3MubG9hZChpbik7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgYW55IHZhcmlhYmxlcyB0aGF0IHdlIG5lZWQgdG8gcG9wdWxhdGUgZnJvbSB0aGUgcmVzb3VyY2VzCisgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgIFZFUlNJT04gPSBhbnRsclNldHRpbmdzLmdldFByb3BlcnR5KCJhbnRsci52ZXJzaW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcsIGp1c3QgbGVhdmUgdGhlIGRlZmF1bHRzIGluIHBsYWNlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVG9vbCgpIHsKKyAgICAgICAgbG9hZFJlc291cmNlcygpOworICAgIH0KKworICAgIHB1YmxpYyBUb29sKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbG9hZFJlc291cmNlcygpOworCisgICAgICAgIC8vIFNldCBhbGwgdGhlIG9wdGlvbnMgYW5kIHBpY2sgdXAgYWxsIHRoZSBuYW1lZCBncmFtbWFyIGZpbGVzCisgICAgICAgIHByb2Nlc3NBcmdzKGFyZ3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKKworICAgICAgICBpZiAoaXNWZXJib3NlKCkpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5pbmZvKCJBTlRMUiBQYXJzZXIgR2VuZXJhdG9yICBWZXJzaW9uICIgKyBWRVJTSU9OKTsKKyAgICAgICAgICAgIHNob3dCYW5uZXIgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgaGVscCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItbyIpIHx8IGFyZ3NbaV0uZXF1YWxzKCItZm8iKSkgeworICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1pc3Npbmcgb3V0cHV0IGRpcmVjdG9yeSB3aXRoIC1mby8tbyBvcHRpb247IGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1mbyIpKSB7IC8vIGZvcmNlIG91dHB1dCBpbnRvIGRpcgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9yY2VBbGxGaWxlc1RvT3V0cHV0RGlyKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5ID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERpcmVjdG9yeS5lbmRzV2l0aCgiLyIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkuZW5kc1dpdGgoIlxcIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5LnN1YnN0cmluZygwLCBnZXRPdXRwdXREaXJlY3RvcnkoKS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZU91dHB1dERpciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXREaXIuZXhpc3RzKCkgJiYgIW91dERpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19PVVRQVVRfRElSX0lTX0ZJTEUsIG91dHB1dERpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRMaWJEaXJlY3RvcnkoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkJCWVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItbGliIikpIHsKKwkJCQlpZiAoaSArIDEgPj0gYXJncy5sZW5ndGgpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJtaXNzaW5nIGxpYnJhcnkgZGlyZWN0b3J5IHdpdGggLWxpYiBvcHRpb247IGlnbm9yaW5nIik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpKys7CisJCQkJCXNldExpYkRpcmVjdG9yeShhcmdzW2ldKTsKKwkJCQkJaWYgKGdldExpYnJhcnlEaXJlY3RvcnkoKS5lbmRzV2l0aCgiLyIpIHx8CisJCQkJCQlnZXRMaWJyYXJ5RGlyZWN0b3J5KCkuZW5kc1dpdGgoIlxcIikpIHsKKwkJCQkJCXNldExpYkRpcmVjdG9yeShnZXRMaWJyYXJ5RGlyZWN0b3J5KCkuc3Vic3RyaW5nKDAsIGdldExpYnJhcnlEaXJlY3RvcnkoKS5sZW5ndGgoKSAtIDEpKTsKKwkJCQkJfQorCQkJCQlGaWxlIG91dERpciA9IG5ldyBGaWxlKGdldExpYnJhcnlEaXJlY3RvcnkoKSk7CisJCQkJCWlmICghb3V0RGlyLmV4aXN0cygpKSB7CisJCQkJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19ESVJfTk9UX0ZPVU5ELCBnZXRMaWJyYXJ5RGlyZWN0b3J5KCkpOworCQkJCQkJc2V0TGliRGlyZWN0b3J5KCIuIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWxhbmd1YWdlIikpIHsKKwkJCQlpZiAoaSArIDEgPj0gYXJncy5sZW5ndGgpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJtaXNzaW5nIGxhbmd1YWdlIG5hbWU7IGlnbm9yaW5nIik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpKys7CisJCQkJCWZvcmNlZExhbmd1YWdlT3B0aW9uID0gYXJnc1tpXTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW5mYSIpKSB7CisgICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVfTkZBX2RvdCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItZGZhIikpIHsKKyAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZV9ERkFfZG90KHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1kZWJ1ZyIpKSB7CisgICAgICAgICAgICAgICAgc2V0RGVidWcodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXRyYWNlIikpIHsKKyAgICAgICAgICAgICAgICBzZXRUcmFjZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcmVwb3J0IikpIHsKKyAgICAgICAgICAgICAgICBzZXRSZXBvcnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXByb2ZpbGUiKSkgeworICAgICAgICAgICAgICAgIHNldFByb2ZpbGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXByaW50IikpIHsKKyAgICAgICAgICAgICAgICBzZXRQcmludEdyYW1tYXIodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWRlcGVuZCIpKSB7CisgICAgICAgICAgICAgICAgc2V0RGVwZW5kKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi12ZXJib3NlIikpIHsKKyAgICAgICAgICAgICAgICBzZXRWZXJib3NlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi12ZXJzaW9uIikpIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgZXhpdE5vdyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW1ha2UiKSkgeworICAgICAgICAgICAgICAgIHNldE1ha2UodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW1lc3NhZ2UtZm9ybWF0IikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSArIDEgPj0gYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJtaXNzaW5nIG91dHB1dCBmb3JtYXQgd2l0aCAtbWVzc2FnZS1mb3JtYXQgb3B0aW9uOyB1c2luZyBkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIEVycm9yTWFuYWdlci5zZXRGb3JtYXQoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YZ3J0cmVlIikpIHsKKyAgICAgICAgICAgICAgICBpbnRlcm5hbE9wdGlvbl9QcmludEdyYW1tYXJUcmVlID0gdHJ1ZTsgLy8gcHJpbnQgZ3JhbW1hciB0cmVlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVhkZmEiKSkgeworICAgICAgICAgICAgICAgIGludGVybmFsT3B0aW9uX1ByaW50REZBID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG5vcHJ1bmUiKSkgeworICAgICAgICAgICAgICAgIERGQU9wdGltaXplci5QUlVORV9FQk5GX0VYSVRfQlJBTkNIRVMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG5vY29sbGFwc2UiKSkgeworICAgICAgICAgICAgICAgIERGQU9wdGltaXplci5DT0xMQVBTRV9BTExfUEFSQUxMRUxfRURHRVMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWGRiZ2NvbnZlcnNpb24iKSkgeworICAgICAgICAgICAgICAgIE5GQVRvREZBQ29udmVydGVyLmRlYnVnID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG11bHRpdGhyZWFkZWQiKSkgeworICAgICAgICAgICAgICAgIE5GQVRvREZBQ29udmVydGVyLlNJTkdMRV9USFJFQURFRF9ORkFfQ09OVkVSU0lPTiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1Ybm9tZXJnZXN0b3BzdGF0ZXMiKSkgeworICAgICAgICAgICAgICAgIERGQU9wdGltaXplci5NRVJHRV9TVE9QX1NUQVRFUyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YZGZhdmVyYm9zZSIpKSB7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxPcHRpb25fU2hvd05GQUNvbmZpZ3NJbkRGQSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVh3YXRjaGNvbnZlcnNpb24iKSkgeworICAgICAgICAgICAgICAgIGludGVybmFsT3B0aW9uX3dhdGNoTkZBQ29udmVyc2lvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVhkYmdTVCIpKSB7CisgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvci5MQVVOQ0hfU1RfSU5TUEVDVE9SID0gdHJ1ZTsKKwkJCQlTVEdyb3VwLnRyYWNrQ3JlYXRpb25FdmVudHMgPSB0cnVlOworCQkJCXJldHVybl9kb250X2V4aXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YbWF4aW5saW5lZGZhc3RhdGVzIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSArIDEgPj0gYXJncy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJtaXNzaW5nIG1heCBpbmxpbmUgZGZhIHN0YXRlcyAtWG1heGlubGluZWRmYXN0YXRlcyBvcHRpb247IGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IuTUFYX0FDWUNMSUNfREZBX1NUQVRFU19JTkxJTkUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG1heHN3aXRjaGNhc2VsYWJlbHMiKSkgeworICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1pc3NpbmcgbWF4IHN3aXRjaCBjYXNlIGxhYmVscyAtWG1heHN3aXRjaGNhc2VsYWJlbHMgb3B0aW9uOyBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yLk1BWF9TV0lUQ0hfQ0FTRV9MQUJFTFMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG1pbnN3aXRjaGFsdHMiKSkgeworICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1pc3NpbmcgbWluIHN3aXRjaCBhbHRlcm5hdGl2ZXMgLVhtaW5zd2l0Y2hhbHRzIG9wdGlvbjsgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvci5NSU5fU1dJVENIX0FMVFMgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItWG0iKSkgeworICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1pc3NpbmcgbWF4IHJlY3Vyc2lvbiB3aXRoIC1YbSBvcHRpb247IGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIE5GQUNvbnRleHQuTUFYX1NBTUVfUlVMRV9JTlZPQ0FUSU9OU19QRVJfTkZBX0NPTkZJR19TVEFDSyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YbWF4ZGZhZWRnZXMiKSkgeworICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1pc3NpbmcgbWF4IG51bWJlciBvZiBlZGdlcyB3aXRoIC1YbWF4ZGZhZWRnZXMgb3B0aW9uOyBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBERkEuTUFYX1NUQVRFX1RSQU5TSVRJT05TX0ZPUl9UQUJMRSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YY29udmVyc2lvbnRpbWVvdXQiKSkgeworICAgICAgICAgICAgICAgIGlmIChpICsgMSA+PSBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1pc3NpbmcgbWF4IHRpbWUgaW4gbXMgLVhjb252ZXJzaW9udGltZW91dCBvcHRpb247IGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIERGQS5NQVhfVElNRV9QRVJfREZBX0NSRUFUSU9OID0gSW50ZWdlci5wYXJzZUludChhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQllbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVhuZmFzdGF0ZXMiKSkgeworCQkJCURlY2lzaW9uUHJvYmUudmVyYm9zZSA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLVhzYXZlbGV4ZXIiKSkgeworCQkJCWRlbGV0ZVRlbXBMZXhlciA9IGZhbHNlOworCQkJfQorICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1YIikpIHsKKyAgICAgICAgICAgICAgICBYaGVscCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uY2hhckF0KDApICE9ICctJykgeworICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIHRoZSBncmFtbWFyIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgYWRkR3JhbW1hckZpbGUoYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckludmFsaWRBcmd1bWVudHMoU3RyaW5nW10gYXJncywgQml0U2V0IGNtZExpbmVBcmdWYWxpZCkgeworICAgIC8vIGNoZWNrIGZvciBpbnZhbGlkIGNvbW1hbmQgbGluZSBhcmdzCisgICAgZm9yIChpbnQgYSA9IDA7IGEgPCBhcmdzLmxlbmd0aDsgYSsrKSB7CisgICAgaWYgKCFjbWRMaW5lQXJnVmFsaWQubWVtYmVyKGEpKSB7CisgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbnZhbGlkIGNvbW1hbmQtbGluZSBhcmd1bWVudDogIiArIGFyZ3NbYV0gKyAiOyBpZ25vcmVkIik7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBsaXN0IG9mIG91dHB1dEZpbGVzIGFsbCBleGlzdCwgYW5kIGhhdmUKKyAgICAgKiBsYXN0LW1vZGlmaWVkIHRpbWVzdGFtcHMgd2hpY2ggYXJlIGxhdGVyIHRoYW4gdGhlIGxhc3QtbW9kaWZpZWQKKyAgICAgKiB0aW1lc3RhbXAgb2YgYWxsIHRoZSBncmFtbWFyIGZpbGVzIGludm9sdmVkIGluIGJ1aWxkIHRoZSBvdXRwdXQKKyAgICAgKiAoaW1wb3J0cyBtdXN0IGJlIGNoZWNrZWQpLiBJZiB0aGVzZSBjb25kaXRpb25zIGhvbGQsIHRoZSBtZXRob2QKKyAgICAgKiByZXR1cm5zIGZhbHNlLCBvdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncmFtbWFyRmlsZU5hbWUgVGhlIGdyYW1tYXIgZmlsZSB3ZSBhcmUgY2hlY2tpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBidWlsZFJlcXVpcmVkKFN0cmluZyBncmFtbWFyRmlsZU5hbWUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQnVpbGREZXBlbmRlbmN5R2VuZXJhdG9yIGJkID0KKyAgICAgICAgICAgIG5ldyBCdWlsZERlcGVuZGVuY3lHZW5lcmF0b3IodGhpcywgZ3JhbW1hckZpbGVOYW1lKTsKKworICAgICAgICBMaXN0PEZpbGU+IG91dHB1dEZpbGVzID0gYmQuZ2V0R2VuZXJhdGVkRmlsZUxpc3QoKTsKKyAgICAgICAgTGlzdDxGaWxlPiBpbnB1dEZpbGVzID0gYmQuZ2V0RGVwZW5kZW5jaWVzRmlsZUxpc3QoKTsKKyAgICAgICAgLy8gTm90ZSB0aGF0IGlucHV0IGRpcmVjdG9yeSBtdXN0IGJlIHNldCB0byB1c2UgYnVpbGRSZXF1aXJlZAorICAgICAgICBGaWxlIGdyYW1tYXJGaWxlOworICAgICAgICBpZiAoaGF2ZUlucHV0RGlyKSB7CisgICAgICAgICAgICBncmFtbWFyRmlsZSA9IG5ldyBGaWxlKGlucHV0RGlyZWN0b3J5LCBncmFtbWFyRmlsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ3JhbW1hckZpbGUgPSBuZXcgRmlsZShncmFtbWFyRmlsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIGxvbmcgZ3JhbW1hckxhc3RNb2RpZmllZCA9IGdyYW1tYXJGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICBmb3IgKEZpbGUgb3V0cHV0RmlsZSA6IG91dHB1dEZpbGVzKSB7CisgICAgICAgICAgICBpZiAoIW91dHB1dEZpbGUuZXhpc3RzKCkgfHwgZ3JhbW1hckxhc3RNb2RpZmllZCA+IG91dHB1dEZpbGUubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBPbmUgb2YgdGhlIG91dHB1dCBmaWxlcyBkb2VzIG5vdCBleGlzdCBvciBpcyBvdXQgb2YgZGF0ZSwgc28gd2UgbXVzdCBidWlsZCBpdAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2hlY2sgYWxsIG9mIHRoZSBpbXBvcnRlZCBncmFtbWFycyBhbmQgc2VlIGlmIGFueSBvZiB0aGVzZSBhcmUgeW91bmdlcgorICAgICAgICAgICAgLy8gdGhhbiBhbnkgb2YgdGhlIG91dHB1dCBmaWxlcy4KKyAgICAgICAgICAgIGlmIChpbnB1dEZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEZpbGUgaW5wdXRGaWxlIDogaW5wdXRGaWxlcykgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEZpbGUubGFzdE1vZGlmaWVkKCkgPiBvdXRwdXRGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmUgb2YgdGhlIGltcG9ydGVkIGdyYW1tYXIgZmlsZXMgaGFzIGJlZW4gdXBkYXRlZCBzbyB3ZSBtdXN0IGJ1aWxkCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNWZXJib3NlKCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR3JhbW1hciAiICsgZ3JhbW1hckZpbGUgKyAiIGlzIHVwIHRvIGRhdGUgLSBidWlsZCBza2lwcGVkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7CisgICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uV2hlbldyaXRpbmdMZXhlckZpbGUgPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nIGxleGVyR3JhbW1hckZpbGVOYW1lID0gbnVsbDsJCS8vIG5lY2Vzc2FyeSBhdCB0aGlzIHNjb3BlIHRvIGhhdmUgYWNjZXNzIGluIHRoZSBjYXRjaCBiZWxvdworCisgICAgICAgIC8vIEhhdmUgdG8gYmUgdHJpY2t5IGhlcmUgd2hlbiBNYXZlbiBvciBidWlsZCB0b29scyBjYWxsIGluIGFuZCBtdXN0IG5ldyBUb29sKCkKKyAgICAgICAgLy8gYmVmb3JlIHNldHRpbmcgb3B0aW9ucy4gVGhlIGJhbm5lciB3b24ndCBkaXNwbGF5IHRoYXQgd2F5IQorICAgICAgICBpZiAoaXNWZXJib3NlKCkgJiYgc2hvd0Jhbm5lcikgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmluZm8oIkFOVExSIFBhcnNlciBHZW5lcmF0b3IgIFZlcnNpb24gIiArIFZFUlNJT04pOworICAgICAgICAgICAgc2hvd0Jhbm5lciA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvcnRHcmFtbWFyRmlsZXMoKTsgLy8gdXBkYXRlIGdyYW1tYXJGaWxlTmFtZXMKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0lOVEVSTkFMX0VSUk9SLGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFcnJvciBlKSB7CisgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19JTlRFUk5BTF9FUlJPUiwgZSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFN0cmluZyBncmFtbWFyRmlsZU5hbWUgOiBncmFtbWFyRmlsZU5hbWVzKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gbWFrZSBtb2RlICh0byBzdXBwb3J0IGJ1aWxkIHRvb2xzIGxpa2UgTWF2ZW4pIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIGZpbGUgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCB0aGVuIHdlIGRvIG5vdCBidWlsZCBpdCAoYW5kIGluIHZlcmJvc2UgbW9kZQorICAgICAgICAgICAgLy8gd2Ugd2lsbCBzYXkgc28pLgorICAgICAgICAgICAgaWYgKG1ha2UpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICFidWlsZFJlcXVpcmVkKGdyYW1tYXJGaWxlTmFtZSkgKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0lOVEVSTkFMX0VSUk9SLGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzVmVyYm9zZSgpICYmICFpc0RlcGVuZCgpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdyYW1tYXJGaWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChpc0RlcGVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1aWxkRGVwZW5kZW5jeUdlbmVyYXRvciBkZXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1aWxkRGVwZW5kZW5jeUdlbmVyYXRvcih0aGlzLCBncmFtbWFyRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICBMaXN0IG91dHB1dEZpbGVzID0gZGVwLmdldEdlbmVyYXRlZEZpbGVMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIExpc3QgZGVwZW5kZW50cyA9IGRlcC5nZXREZXBlbmRlbmNpZXNGaWxlTGlzdCgpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dDogIitvdXRwdXRGaWxlcyk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGVwZW5kZW50czogIitkZXBlbmRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkZXAuZ2V0RGVwZW5kZW5jaWVzKCkucmVuZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBHcmFtbWFyIHJvb3RHcmFtbWFyID0gZ2V0Um9vdEdyYW1tYXIoZ3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBub3cgaGF2ZSBhbGwgZ3JhbW1hcnMgcmVhZCBpbiBhcyBBU1RzCisgICAgICAgICAgICAgICAgLy8gKGkuZS4sIHJvb3QgYW5kIGFsbCBkZWxlZ2F0ZXMpCisJCQkJcm9vdEdyYW1tYXIuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKwkJCQkvL3Jvb3RHcmFtbWFyLmNvbXBvc2l0ZS50cmFuc2xhdGVMZWZ0UmVjdXJzaXZlUnVsZXMoKTsKKwkJCQlyb290R3JhbW1hci5hZGRSdWxlc0ZvclN5bnRhY3RpY1ByZWRpY2F0ZXMoKTsKKwkJCQlyb290R3JhbW1hci5jb21wb3NpdGUuZGVmaW5lR3JhbW1hclN5bWJvbHMoKTsKKyAgICAgICAgICAgICAgICByb290R3JhbW1hci5jb21wb3NpdGUuY3JlYXRlTkZBcygpOworCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVSZWNvZ25pemVyKHJvb3RHcmFtbWFyKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1ByaW50R3JhbW1hcigpKSB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RHcmFtbWFyLnByaW50R3JhbW1hcihTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNSZXBvcnQoKSkgeworCQkJCQlHcmFtbWFyUmVwb3J0MiBncmVwb3J0ID0gbmV3IEdyYW1tYXJSZXBvcnQyKHJvb3RHcmFtbWFyKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludChncmVwb3J0LnRvU3RyaW5nKCkpOworLy8gICAgICAgICAgICAgICAgICAgIEdyYW1tYXJSZXBvcnQgZ3JlcG9ydCA9IG5ldyBHcmFtbWFyUmVwb3J0KHJvb3RHcmFtbWFyKTsKKy8vICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ3JlcG9ydC50b1N0cmluZygpKTsKKy8vICAgICAgICAgICAgICAgICAgICAvLyBwcmludCBvdXQgYSBiYWNrdHJhY2tpbmcgcmVwb3J0IHRvbyAodGhhdCBpcyBub3QgZW5jb2RlZCBpbnRvIGxvZykKKy8vICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ3JlcG9ydC5nZXRCYWNrdHJhY2tpbmdSZXBvcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc1Byb2ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBHcmFtbWFyUmVwb3J0IGdyZXBvcnQgPSBuZXcgR3JhbW1hclJlcG9ydChyb290R3JhbW1hcik7CisgICAgICAgICAgICAgICAgICAgIFN0YXRzLndyaXRlUmVwb3J0KEdyYW1tYXJSZXBvcnQuR1JBTU1BUl9TVEFUU19GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcG9ydC50b05vdGlmeVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBub3cgaGFuZGxlIHRoZSBsZXhlciBpZiBvbmUgd2FzIGNyZWF0ZWQgZm9yIGEgbWVyZ2VkIHNwZWMKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGV4ZXJHcmFtbWFyU3RyID0gcm9vdEdyYW1tYXIuZ2V0TGV4ZXJHcmFtbWFyKCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImxleGVyIHJvb3RHcmFtbWFyOlxuIitsZXhlckdyYW1tYXJTdHIpOworICAgICAgICAgICAgICAgIGlmIChyb290R3JhbW1hci50eXBlID09IEdyYW1tYXIuQ09NQklORUQgJiYgbGV4ZXJHcmFtbWFyU3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV4ZXJHcmFtbWFyRmlsZU5hbWUgPSByb290R3JhbW1hci5nZXRJbXBsaWNpdGx5R2VuZXJhdGVkTGV4ZXJGaWxlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVyIHcgPSBnZXRPdXRwdXRGaWxlKHJvb3RHcmFtbWFyLCBsZXhlckdyYW1tYXJGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3LndyaXRlKGxleGVyR3JhbW1hclN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICB3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgZGlmZmVyZW50IGVycm9yIG1lc3NhZ2Ugd2hlbiBjcmVhdGluZyB0aGUgaW1wbGljaXQgbGV4ZXIgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1ZSB0byB3cml0ZSBwZXJtaXNzaW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25XaGVuV3JpdGluZ0xleGVyRmlsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKGxleGVyR3JhbW1hclN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBHcmFtbWFyIGxleGVyR3JhbW1hciA9IG5ldyBHcmFtbWFyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGV4ZXJHcmFtbWFyLmNvbXBvc2l0ZS53YXRjaE5GQUNvbnZlcnNpb24gPSBpbnRlcm5hbE9wdGlvbl93YXRjaE5GQUNvbnZlcnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICBsZXhlckdyYW1tYXIuaW1wbGljaXRMZXhlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2xleGVyR3JhbW1hci5zZXRUb29sKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBsZXhlckdyYW1tYXJGdWxsRmlsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZ2V0RmlsZURpcmVjdG9yeShsZXhlckdyYW1tYXJGaWxlTmFtZSksIGxleGVyR3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxleGVyR3JhbW1hci5zZXRGaWxlTmFtZShsZXhlckdyYW1tYXJGdWxsRmlsZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGV4ZXJHcmFtbWFyLmltcG9ydFRva2VuVm9jYWJ1bGFyeShyb290R3JhbW1hcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXhlckdyYW1tYXIucGFyc2VBbmRCdWlsZEFTVChzcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxleGVyR3JhbW1hci5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCQkJCQkJbGV4ZXJHcmFtbWFyLmFkZFJ1bGVzRm9yU3ludGFjdGljUHJlZGljYXRlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgbGV4ZXJHcmFtbWFyLmNvbXBvc2l0ZS5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworICAgICAgICAgICAgICAgICAgICAgICAgbGV4ZXJHcmFtbWFyLmNvbXBvc2l0ZS5jcmVhdGVORkFzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUmVjb2duaXplcihsZXhlckdyYW1tYXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNsZWFuIHVwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlVGVtcExleGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBnZXRPdXRwdXREaXJlY3RvcnkobGV4ZXJHcmFtbWFyRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dERpciwgbGV4ZXJHcmFtbWFyRmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25XaGVuV3JpdGluZ0xleGVyRmlsZSkgeworICAgICAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfV1JJVEVfRklMRSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfT1BFTl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19JTlRFUk5BTF9FUlJPUiwgZ3JhbW1hckZpbGVOYW1lLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZXM9IisgSW50ZXJ2YWwuY3JlYXRlcyk7CisgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaGl0cz0iKyBJbnRlcnZhbC5oaXRzKTsKKyAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaXNzZXM9IisgSW50ZXJ2YWwubWlzc2VzKTsKKyAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvdXRPZlJhbmdlPSIrIEludGVydmFsLm91dE9mUmFuZ2UpOworICAgICAgICAgICB9CisgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc29ydEdyYW1tYXJGaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJHcmFtbWFyIG5hbWVzICIrZ2V0R3JhbW1hckZpbGVOYW1lcygpKTsKKyAgICAgICAgR3JhcGggZyA9IG5ldyBHcmFwaCgpOworICAgICAgICBMaXN0PFN0cmluZz4gbWlzc2luZ0ZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGdmaWxlIDogZ3JhbW1hckZpbGVOYW1lcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBHcmFtbWFyU3BlbHVua2VyIGdyYW1tYXIgPSBuZXcgR3JhbW1hclNwZWx1bmtlcihpbnB1dERpcmVjdG9yeSwgZ2ZpbGUpOworICAgICAgICAgICAgICAgIGdyYW1tYXIucGFyc2UoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdm9jYWJOYW1lID0gZ3JhbW1hci5nZXRUb2tlblZvY2FiKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGdyYW1tYXJOYW1lID0gZ3JhbW1hci5nZXRHcmFtbWFyTmFtZSgpOworICAgICAgICAgICAgICAgIC8vIE1ha2UgYWxsIGdyYW1tYXJzIGRlcGVuZCBvbiBhbnkgdG9rZW5Wb2NhYiBvcHRpb25zCisgICAgICAgICAgICAgICAgaWYgKCB2b2NhYk5hbWUhPW51bGwgKSBnLmFkZEVkZ2UoZ2ZpbGUsIHZvY2FiTmFtZStDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OKTsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIGFsbCBnZW5lcmF0ZWQgdG9rZW5zIGZpbGVzIGRlcGVuZCBvbiB0aGVpciBncmFtbWFycworICAgICAgICAgICAgICAgIGcuYWRkRWRnZShncmFtbWFyTmFtZStDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OLCBnZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfT1BFTl9GSUxFLCBnZmlsZSk7CisgICAgICAgICAgICAgICAgbWlzc2luZ0ZpbGVzLmFkZChnZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxPYmplY3Q+IHNvcnRlZCA9IGcuc29ydCgpOworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigic29ydGVkPSIrc29ydGVkKTsKKyAgICAgICAgZ3JhbW1hckZpbGVOYW1lcy5jbGVhcigpOyAvLyB3aXBlIHNvIHdlIGNhbiBnaXZlIG5ldyBvcmRlcmVkIGxpc3QKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBmID0gKFN0cmluZylzb3J0ZWQuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCBtaXNzaW5nRmlsZXMuY29udGFpbnMoZikgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICggIShmLmVuZHNXaXRoKCIuZyIpIHx8IGYuZW5kc1dpdGgoIi5nMyIpKSApIGNvbnRpbnVlOworICAgICAgICAgICAgZ3JhbW1hckZpbGVOYW1lcy5hZGQoZik7CisgICAgICAgIH0KKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBncmFtbWFycz0iK2dyYW1tYXJGaWxlTmFtZXMpOworICAgIH0KKworICAgIC8qKiBHZXQgYSBncmFtbWFyIG1lbnRpb25lZCBvbiB0aGUgY29tbWFuZC1saW5lIGFuZCBhbnkgZGVsZWdhdGVzICovCisgICAgcHVibGljIEdyYW1tYXIgZ2V0Um9vdEdyYW1tYXIoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvL1NULnNldExpbnRNb2RlKHRydWUpOworICAgICAgICAvLyBncmFtbWFycyBtZW50aW9uZWQgb24gY29tbWFuZCBsaW5lIGFyZSBlaXRoZXIgcm9vdHMgb3Igc2luZ2xlIGdyYW1tYXJzLgorICAgICAgICAvLyBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb21wb3NpdGUgaW4gY2FzZSBpdCdzIGdvdCBkZWxlZ2F0ZXM7IGV2ZW4KKyAgICAgICAgLy8gc2luZ2xlIGdyYW1tYXIgbmVlZHMgaXQgdG8gZ2V0IHRva2VuIHR5cGVzLgorICAgICAgICBDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisgICAgICAgIEdyYW1tYXIgZ3JhbW1hciA9IG5ldyBHcmFtbWFyKHRoaXMsIGdyYW1tYXJGaWxlTmFtZSwgY29tcG9zaXRlKTsKKyAgICAgICAgY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGdyYW1tYXIpOworICAgICAgICBGaWxlUmVhZGVyIGZyID0gbnVsbDsKKyAgICAgICAgRmlsZSBmID0gbnVsbDsKKworICAgICAgICBpZiAoaGF2ZUlucHV0RGlyKSB7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoaW5wdXREaXJlY3RvcnksIGdyYW1tYXJGaWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoZ3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGdyYW1tYXIgYXMgaWYgd2UgaW1wb3J0IGZpbGVzLCB3ZSBjYW4gdGhlbgorICAgICAgICAvLyBzZWFyY2ggZm9yIGltcG9ydHMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIG9yaWdpbmFsIGdyYW1tYXIgYXMgd2VsbCBhcyBpbgorICAgICAgICAvLyB0aGUgbGliIGRpcmVjdG9yeS4KKyAgICAgICAgLy8KKyAgICAgICAgcGFyZW50R3JhbW1hckRpcmVjdG9yeSA9IGYuZ2V0UGFyZW50KCk7CisKKyAgICAgICAgaWYgKGdyYW1tYXJGaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IC0xKSB7CisgICAgICAgICAgICBncmFtbWFyT3V0cHV0RGlyZWN0b3J5ID0gIi4iOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ3JhbW1hck91dHB1dERpcmVjdG9yeSA9IGdyYW1tYXJGaWxlTmFtZS5zdWJzdHJpbmcoMCwgZ3JhbW1hckZpbGVOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikpOworICAgICAgICB9CisgICAgICAgIGZyID0gbmV3IEZpbGVSZWFkZXIoZik7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKyAgICAgICAgZ3JhbW1hci5wYXJzZUFuZEJ1aWxkQVNUKGJyKTsKKyAgICAgICAgY29tcG9zaXRlLndhdGNoTkZBQ29udmVyc2lvbiA9IGludGVybmFsT3B0aW9uX3dhdGNoTkZBQ29udmVyc2lvbjsKKyAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgZnIuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIGdyYW1tYXI7CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBORkEsIERGQSBhbmQgZ2VuZXJhdGUgY29kZSBmb3IgZ3JhbW1hci4KKyAgICAgKiAgQ3JlYXRlIE5GQSBmb3IgYW55IGRlbGVnYXRlcyBmaXJzdC4gIE9uY2UgYWxsIE5GQSBhcmUgY3JlYXRlZCwKKyAgICAgKiAgaXQncyBvayB0byBjcmVhdGUgREZBLCB3aGljaCBtdXN0IGNoZWNrIGZvciBsZWZ0LXJlY3Vyc2lvbi4gIFRoYXQgY2hlY2sKKyAgICAgKiAgaXMgZG9uZSBieSB3YWxraW5nIHRoZSBmdWxsIE5GQSwgd2hpY2ggdGhlcmVmb3JlIG11c3QgYmUgY29tcGxldGUuCisgICAgICogIEFmdGVyIGFsbCBORkEsIGNvbWVzIERGQSBjb252ZXJzaW9uIGZvciByb290IGdyYW1tYXIgdGhlbiBjb2RlIGdlbiBmb3IKKyAgICAgKiAgcm9vdCBncmFtbWFyLiAgREZBIGFuZCBjb2RlIGdlbiBmb3IgZGVsZWdhdGVzIGNvbWVzIG5leHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVSZWNvZ25pemVyKEdyYW1tYXIgZ3JhbW1hcikgeworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSAoU3RyaW5nKSBncmFtbWFyLmdldE9wdGlvbigibGFuZ3VhZ2UiKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IodGhpcywgZ3JhbW1hciwgbGFuZ3VhZ2UpOworICAgICAgICAgICAgZ3JhbW1hci5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisgICAgICAgICAgICBnZW5lcmF0b3Iuc2V0RGVidWcoaXNEZWJ1ZygpKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5zZXRQcm9maWxlKGlzUHJvZmlsZSgpKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5zZXRUcmFjZShpc1RyYWNlKCkpOworCisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBORkEgZWFybHkgaW4gY2FzZSBvZiBjcmFzaCBsYXRlciAoZm9yIGRlYnVnZ2luZykKKyAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlX05GQV9kb3QoKSkgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlTkZBcyhncmFtbWFyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gR0VORVJBVEUgQ09ERQorICAgICAgICAgICAgZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGVfREZBX2RvdCgpKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVERkFzKGdyYW1tYXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PEdyYW1tYXI+IGRlbGVnYXRlcyA9IGdyYW1tYXIuZ2V0RGlyZWN0RGVsZWdhdGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgZGVsZWdhdGVzICE9IG51bGwgJiYgaSA8IGRlbGVnYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEdyYW1tYXIgZGVsZWdhdGUgPSAoR3JhbW1hcikgZGVsZWdhdGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGUgIT0gZ3JhbW1hcikgeyAvLyBhbHJlYWR5IHByb2Nlc3NpbmcgdGhpcyBvbmUKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVSZWNvZ25pemVyKGRlbGVnYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZURGQXMoR3JhbW1hciBnKSB7CisgICAgICAgIGZvciAoaW50IGQgPSAxOyBkIDw9IGcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKTsgZCsrKSB7CisgICAgICAgICAgICBERkEgZGZhID0gZy5nZXRMb29rYWhlYWRERkEoZCk7CisgICAgICAgICAgICBpZiAoZGZhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbm90IHRoZXJlIGZvciBzb21lIHJlYXNvbiwgaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBET1RHZW5lcmF0b3IgZG90R2VuZXJhdG9yID0gbmV3IERPVEdlbmVyYXRvcihnKTsKKyAgICAgICAgICAgIFN0cmluZyBkb3QgPSBkb3RHZW5lcmF0b3IuZ2V0RE9UKGRmYS5zdGFydFN0YXRlKTsKKyAgICAgICAgICAgIFN0cmluZyBkb3RGaWxlTmFtZSA9IGcubmFtZSArICIuIiArICJkZWMtIiArIGQ7CisgICAgICAgICAgICBpZiAoZy5pbXBsaWNpdExleGVyKSB7CisgICAgICAgICAgICAgICAgZG90RmlsZU5hbWUgPSBnLm5hbWUgKyBHcmFtbWFyLmdyYW1tYXJUeXBlVG9GaWxlTmFtZVN1ZmZpeFtnLnR5cGVdICsgIi4iICsgImRlYy0iICsgZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVET1RGaWxlKGcsIGRvdEZpbGVOYW1lLCBkb3QpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX0dFTl9ET1RfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZU5GQXMoR3JhbW1hciBnKSB7CisgICAgICAgIERPVEdlbmVyYXRvciBkb3RHZW5lcmF0b3IgPSBuZXcgRE9UR2VuZXJhdG9yKGcpOworICAgICAgICBDb2xsZWN0aW9uIHJ1bGVzID0gZy5nZXRBbGxJbXBvcnRlZFJ1bGVzKCk7CisgICAgICAgIHJ1bGVzLmFkZEFsbChnLmdldFJ1bGVzKCkpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcnVsZXMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJ1bGUgciA9IChSdWxlKSBpdHIubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG90ID0gZG90R2VuZXJhdG9yLmdldERPVChyLnN0YXJ0U3RhdGUpOworICAgICAgICAgICAgICAgIGlmIChkb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZURPVEZpbGUoZywgciwgZG90KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfV1JJVEVfRklMRSwgaW9lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRE9URmlsZShHcmFtbWFyIGcsIFJ1bGUgciwgU3RyaW5nIGRvdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVET1RGaWxlKGcsIHIuZ3JhbW1hci5uYW1lICsgIi4iICsgci5uYW1lLCBkb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRE9URmlsZShHcmFtbWFyIGcsIFN0cmluZyBuYW1lLCBTdHJpbmcgZG90KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXcml0ZXIgZncgPSBnZXRPdXRwdXRGaWxlKGcsIG5hbWUgKyAiLmRvdCIpOworICAgICAgICBmdy53cml0ZShkb3QpOworICAgICAgICBmdy5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyc2lvbigpIHsKKyAgICAgICAgRXJyb3JNYW5hZ2VyLmluZm8oIkFOVExSIFBhcnNlciBHZW5lcmF0b3IgIFZlcnNpb24gIiArIG5ldyBUb29sKCkuVkVSU0lPTik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoZWxwKCkgeworICAgICAgICBFcnJvck1hbmFnZXIuaW5mbygiQU5UTFIgUGFyc2VyIEdlbmVyYXRvciAgVmVyc2lvbiAiICsgbmV3IFRvb2woKS5WRVJTSU9OKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJ1c2FnZTogamF2YSBvcmcuYW50bHIuVG9vbCBbYXJnc10gZmlsZS5nIFtmaWxlMi5nIGZpbGUzLmcgLi4uXSIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLW8gb3V0cHV0RGlyICAgICAgICAgIHNwZWNpZnkgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSBhbGwgb3V0cHV0IGlzIGdlbmVyYXRlZCIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWZvIG91dHB1dERpciAgICAgICAgIHNhbWUgYXMgLW8gYnV0IGZvcmNlIGV2ZW4gZmlsZXMgd2l0aCByZWxhdGl2ZSBwYXRocyB0byBkaXIiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1saWIgZGlyICAgICAgICAgICAgICBzcGVjaWZ5IGxvY2F0aW9uIG9mIHRva2VuIGZpbGVzIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtZGVwZW5kICAgICAgICAgICAgICAgZ2VuZXJhdGUgZmlsZSBkZXBlbmRlbmNpZXMiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1yZXBvcnQgICAgICAgICAgICAgICBwcmludCBvdXQgYSByZXBvcnQgYWJvdXQgdGhlIGdyYW1tYXIocykgcHJvY2Vzc2VkIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtcHJpbnQgICAgICAgICAgICAgICAgcHJpbnQgb3V0IHRoZSBncmFtbWFyIHdpdGhvdXQgYWN0aW9ucyIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWRlYnVnICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgcGFyc2VyIHRoYXQgZW1pdHMgZGVidWdnaW5nIGV2ZW50cyIpOworCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLXByb2ZpbGUgICAgICAgICAgICAgIGdlbmVyYXRlIGEgcGFyc2VyIHRoYXQgY29tcHV0ZXMgcHJvZmlsaW5nIGluZm9ybWF0aW9uIik7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiICAtdHJhY2UgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYSByZWNvZ25pemVyIHRoYXQgdHJhY2VzIHJ1bGUgZW50cnkvZXhpdCIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLW5mYSAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGFuIE5GQSBmb3IgZWFjaCBydWxlIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtZGZhICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYSBERkEgZm9yIGVhY2ggZGVjaXNpb24gcG9pbnQiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1tZXNzYWdlLWZvcm1hdCBuYW1lICBzcGVjaWZ5IG91dHB1dCBzdHlsZSBmb3IgbWVzc2FnZXMiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC12ZXJib3NlICAgICAgICAgICAgICBnZW5lcmF0ZSBBTlRMUiB2ZXJzaW9uIGFuZCBvdGhlciBpbmZvcm1hdGlvbiIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLW1ha2UgICAgICAgICAgICAgICAgIG9ubHkgYnVpbGQgaWYgZ2VuZXJhdGVkIGZpbGVzIG9sZGVyIHRoYW4gZ3JhbW1hciIpOworCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLXZlcnNpb24gICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIEFOVExSIGFuZCBleGl0LiIpOworCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWxhbmd1YWdlIEwgICAgICAgICAgIG92ZXJyaWRlIGxhbmd1YWdlIGdyYW1tYXIgb3B0aW9uOyBnZW5lcmF0ZSBMIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtWCAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBleHRlbmRlZCBhcmd1bWVudCBsaXN0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBYaGVscCgpIHsKKyAgICAgICAgRXJyb3JNYW5hZ2VyLmluZm8oIkFOVExSIFBhcnNlciBHZW5lcmF0b3IgIFZlcnNpb24gIiArIG5ldyBUb29sKCkuVkVSU0lPTik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtWGdydHJlZSAgICAgICAgICAgICAgICBwcmludCB0aGUgZ3JhbW1hciBBU1QiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YZGZhICAgICAgICAgICAgICAgICAgIHByaW50IERGQSBhcyB0ZXh0ICIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLVhub3BydW5lICAgICAgICAgICAgICAgdGVzdCBsb29rYWhlYWQgYWdhaW5zdCBFQk5GIGJsb2NrIGV4aXQgYnJhbmNoZXMiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1Ybm9jb2xsYXBzZSAgICAgICAgICAgIGNvbGxhcHNlIGluY2lkZW50IGVkZ2VzIGludG8gREZBIHN0YXRlcyIpOworCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLVhkYmdjb252ZXJzaW9uICAgICAgICAgZHVtcCBsb3RzIG9mIGluZm8gZHVyaW5nIE5GQSBjb252ZXJzaW9uIik7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiICAtWGNvbnZlcnNpb250aW1lb3V0ICAgICB1c2UgdG8gcmVzdHJpY3QgTkZBIGNvbnZlcnNpb24gZXhwb25lbnRpYWxpdHkiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YbXVsdGl0aHJlYWRlZCAgICAgICAgIHJ1biB0aGUgYW5hbHlzaXMgaW4gMiB0aHJlYWRzIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtWG5vbWVyZ2VzdG9wc3RhdGVzICAgICBkbyBub3QgbWVyZ2Ugc3RvcCBzdGF0ZXMiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YZGZhdmVyYm9zZSAgICAgICAgICAgIGdlbmVyYXRlIERGQSBzdGF0ZXMgaW4gRE9UIHdpdGggTkZBIGNvbmZpZ3MiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1Yd2F0Y2hjb252ZXJzaW9uICAgICAgIHByaW50IGEgbWVzc2FnZSBmb3IgZWFjaCBORkEgYmVmb3JlIGNvbnZlcnRpbmciKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YZGJnU1QgICAgICAgICAgICAgICAgIHB1dCB0YWdzIGF0IHN0YXJ0L3N0b3Agb2YgYWxsIHRlbXBsYXRlcyBpbiBvdXRwdXQiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YbmZhc3RhdGVzICAgICAgICAgICAgIGZvciBub25kZXRlcm1pbmlzbXMsIGxpc3QgTkZBIHN0YXRlcyBmb3IgZWFjaCBwYXRoIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtWG0gbSAgICAgICAgICAgICAgICAgICBtYXggbnVtYmVyIG9mIHJ1bGUgaW52b2NhdGlvbnMgZHVyaW5nIGNvbnZlcnNpb24gICAgICAgICAgIFsiICsgTkZBQ29udGV4dC5NQVhfU0FNRV9SVUxFX0lOVk9DQVRJT05TX1BFUl9ORkFfQ09ORklHX1NUQUNLICsgIl0iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YbWF4ZGZhZWRnZXMgbSAgICAgICAgIG1heCBcImNvbWZvcnRhYmxlXCIgbnVtYmVyIG9mIGVkZ2VzIGZvciBzaW5nbGUgREZBIHN0YXRlICAgICBbIiArIERGQS5NQVhfU1RBVEVfVFJBTlNJVElPTlNfRk9SX1RBQkxFICsgIl0iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1YbWF4aW5saW5lZGZhc3RhdGVzIG0gIG1heCBERkEgc3RhdGVzIGJlZm9yZSB0YWJsZSB1c2VkIHJhdGhlciB0aGFuIGlubGluaW5nICAgICAgWyIgKyBDb2RlR2VuZXJhdG9yLk1BRFNJX0RFRkFVTFQgKyJdIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAtWG1heHN3aXRjaGNhc2VsYWJlbHMgbSBkb24ndCBnZW5lcmF0ZSBzd2l0Y2goKSBzdGF0ZW1lbnRzIGZvciBkZmFzIGJpZ2dlciAgdGhhbiBtIFsiICsgQ29kZUdlbmVyYXRvci5NU0NMX0RFRkFVTFQgKyJdIik7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiICAtWG1pbnN3aXRjaGFsdHMgbSAgICAgICBkb24ndCBnZW5lcmF0ZSBzd2l0Y2goKSBzdGF0ZW1lbnRzIGZvciBkZmFzIHNtYWxsZXIgdGhhbiBtIFsiICsgQ29kZUdlbmVyYXRvci5NU0FfREVGQVVMVCArICJdIik7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiICAtWHNhdmVsZXhlciAgICAgICAgICAgICBkb24ndCBkZWxldGUgdGVtcG9yYXJ5IGxleGVycyBnZW5lcmF0ZWQgZnJvbSBjb21iaW5lZCBncmFtbWFycyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGhyZXNob2xkIG9mIGNhc2UgbGFiZWxzIGJleW9uZCB3aGljaCBBTlRMUiB3aWxsIG5vdCBpbnN0cnVjdCB0aGUgdGFyZ2V0IHRlbXBsYXRlCisgICAgICogdG8gZ2VuZXJhdGUgc3dpdGNoKCkgeyBjYXNlIHh4eDogLi4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4U3dpdGNoQ2FzZUxhYmVscyBNYXhpbXVtIG51bWJlciBvZiBjYXNlIGxhYmxlcyB0aGF0IEFOVExSIHNob3VsZCBhbGxvdyB0aGUgdGFyZ2V0IGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTd2l0Y2hDYXNlTGFiZWxzKGludCBtYXhTd2l0Y2hDYXNlTGFiZWxzKSB7CisgICAgICAgIENvZGVHZW5lcmF0b3IuTUFYX1NXSVRDSF9DQVNFX0xBQkVMUyA9IG1heFN3aXRjaENhc2VMYWJlbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aHJlc2hvbGQgb2YgdGhlIG51bWJlciBhbHRzLCBiZWxvdyB3aGljaCBBTlRMUiB3aWxsIG5vdCBpbnN0cnVjdCB0aGUgdGFyZ2V0CisgICAgICogdGVtcGxhdGUgdG8gdXNlIGEgc3dpdGNoIHN0YXRlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW5Td2l0Y2hBbHRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBhbHRzIHJlcXVpcmVkIHRvIHVzZSBhIHN3aXRjaCBzdGFlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1pblN3aXRjaEFsdHMoaW50IG1pblN3aXRjaEFsdHMpIHsKKyAgICAgICAgQ29kZUdlbmVyYXRvci5NSU5fU1dJVENIX0FMVFMgPSBtaW5Td2l0Y2hBbHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYXRpb24gKGJhc2UgZGlyZWN0b3J5KSB3aGVyZSBvdXRwdXQgZmlsZXMgc2hvdWxkIGJlIHByb2R1Y2VkCisgICAgICogYnkgdGhlIEFOVExSIHRvb2wuCisgICAgICogQHBhcmFtIG91dHB1dERpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeShTdHJpbmcgb3V0cHV0RGlyZWN0b3J5KSB7CisgICAgICAgIGhhdmVPdXRwdXREaXIgPSB0cnVlOworICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IGJ1aWxkIHRvb2xzIHRvIGZvcmNlIHRoZSBvdXRwdXQgZmlsZXMgdG8gYWx3YXlzIGJlCisgICAgICogcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb3V0cHV0IGRpcmVjdG9yeSwgZXZlbiB0aG91Z2ggdGhlIHRvb2wKKyAgICAgKiBoYWQgdG8gc2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIGFuIGFic29sdXRlIHBhdGggYXMgaXQKKyAgICAgKiBjYW5ub3QgcmVseSBvbiB0aGUgd29ya2lnbiBkaXJlY3RvcnkgbGlrZSBjb21tYW5kIGxpbmUgaW52b2NhdGlvbgorICAgICAqIGNhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JjZVJlbGF0aXZlT3V0cHV0IHRydWUgaWYgb3V0cHV0IGZpbGVzIGhvdWxkIGFsd2F5cyBiZSByZWxhdGl2ZSB0byBiYXNlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZVJlbGF0aXZlT3V0cHV0KGJvb2xlYW4gZm9yY2VSZWxhdGl2ZU91dHB1dCkgeworICAgICAgICB0aGlzLmZvcmNlUmVsYXRpdmVPdXRwdXQgPSBmb3JjZVJlbGF0aXZlT3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBsb2NhdGlvbiBvZiBpbnB1dCBmaWxlcy4gTm9ybWFsbHkgKHdoZW4gdGhlIHRvb2wgaXMKKyAgICAgKiBpbnZva2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZSksIHRoZSBpbnB1dERpcmVjdG9yeSBpcyBub3Qgc2V0LCBidXQKKyAgICAgKiBmb3IgYnVpbGQgdG9vbHMgc3VjaCBhcyBNYXZlbiwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGxvY2F0ZSB0aGUgaW5wdXQKKyAgICAgKiBmaWxlcyByZWxhdGl2ZSB0byB0aGUgYmFzZSwgYXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGNvdWxkIGJlIGFueXdoZXJlIGFuZAorICAgICAqIGNoYW5naW5nIHdvcmtpZyBkaXJlY3RvcmllcyBpcyBub3QgYSB2YWxpZCBjb25jZXB0IGZvciBKVk1zIGJlY2F1c2Ugb2YgdGhyZWFkaW5nIGFuZAorICAgICAqIHNvIG9uLiBTZXR0aW5nIHRoZSBkaXJlY3RvcnkganVzdCBtZWFucyB0aGF0IHRoZSBnZXRGaWxlRGlyZWN0b3J5KCkgbWV0aG9kIHdpbGwKKyAgICAgKiB0cnkgdG8gb3BlbiBmaWxlcyByZWxhdGl2ZSB0byB0aGlzIGlucHV0IGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dERpcmVjdG9yeSBJbnB1dCBzb3VyY2UgYmFzZSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dERpcmVjdG9yeShTdHJpbmcgaW5wdXREaXJlY3RvcnkpIHsKKyAgICAgICAgdGhpcy5pbnB1dERpcmVjdG9yeSA9IGlucHV0RGlyZWN0b3J5OworICAgICAgICBoYXZlSW5wdXREaXIgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGFsbCBjb2RlIGdlbmVyYXRvcnMgdG8gY3JlYXRlIG5ldyBvdXRwdXQKKyAgICAgKiAgZmlsZXMuIElmIHRoZSBvdXRwdXREaXIgc2V0IGJ5IC1vIGlzIG5vdCBwcmVzZW50IGl0IHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKiAgVGhlIGZpbmFsIGZpbGVuYW1lIGlzIHNlbnNpdGl2ZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeSBhbmQKKyAgICAgKiAgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZ3JhbW1hciBmaWxlIHdhcyBmb3VuZC4gIElmIC1vIGlzIC90bXAKKyAgICAgKiAgYW5kIHRoZSBvcmlnaW5hbCBncmFtbWFyIGZpbGUgd2FzIGZvby90LmcgdGhlbiBvdXRwdXQgZmlsZXMKKyAgICAgKiAgZ28gaW4gL3RtcC9mb28uCisgICAgICoKKyAgICAgKiAgVGhlIG91dHB1dCBkaXIgLW8gc3BlYyB0YWtlcyBwcmVjZWRlbmNlIGlmIGl0J3MgYWJzb2x1dGUuCisgICAgICogIEUuZy4sIGlmIHRoZSBncmFtbWFyIGZpbGUgZGlyIGlzIGFic29sdXRlIHRoZSBvdXRwdXQgZGlyIGlzIGdpdmVuCisgICAgICogIHByZWNlbmRlbmNlLiAiLW8gL3RtcCAvdXNyL2xpYi90LmciIHJlc3VsdHMgaW4gIi90bXAvVC5qYXZhIiBhcworICAgICAqICBvdXRwdXQgKGFzc3VtaW5nIHQuZyBob2xkcyBULmphdmEpLgorICAgICAqCisgICAgICogIElmIG5vIC1vIGlzIHNwZWNpZmllZCwgdGhlbiBqdXN0IHdyaXRlIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlCisgICAgICogIGdyYW1tYXIgZmlsZSB3YXMgZm91bmQuCisgICAgICoKKyAgICAgKiAgSWYgb3V0cHV0RGlyZWN0b3J5PT1udWxsIHRoZW4gd3JpdGUgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFdyaXRlciBnZXRPdXRwdXRGaWxlKEdyYW1tYXIgZywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0T3V0cHV0RGlyZWN0b3J5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBvdXRwdXQgZGlyZWN0b3J5IGlzIGEgZnVuY3Rpb24gb2Ygd2hlcmUgdGhlIGdyYW1tYXIgZmlsZSBsaXZlcworICAgICAgICAvLyBmb3Igc3ViZGlyL1QuZywgeW91IGdldCBzdWJkaXIgaGVyZS4gIFdlbGwsIGRlcGVuZHMgb24gLW8gZXRjLi4uCisgICAgICAgIC8vIEJ1dCwgaWYgdGhpcyBpcyBhIC50b2tlbnMgZmlsZSwgdGhlbiB3ZSBmb3JjZSB0aGUgb3V0cHV0IHRvCisgICAgICAgIC8vIGJlIHRoZSBiYXNlIG91dHB1dCBkaXJlY3RvcnkgKG9yIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZXJlIGlzIG5vdCBhIC1vKQorICAgICAgICAvLworICAgICAgICBGaWxlIG91dHB1dERpcjsKKyAgICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKENvZGVHZW5lcmF0b3IuVk9DQUJfRklMRV9FWFRFTlNJT04pKSB7CisgICAgICAgICAgICBpZiAoaGF2ZU91dHB1dERpcikgeworICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKGdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKCIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvdXRwdXREaXIgPSBnZXRPdXRwdXREaXJlY3RvcnkoZy5nZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXIsIGZpbGVOYW1lKTsKKworICAgICAgICBpZiAoIW91dHB1dERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpOworICAgICAgICB9CisgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihvdXRwdXRGaWxlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhdGlvbiB3aGVyZSBBTlRMUiB3aWxsIGdlbmVyYXRlIG91dHB1dCBmaWxlcyBmb3IgYSBnaXZlbiBmaWxlLiBUaGlzIGlzIGEKKyAgICAgKiBiYXNlIGRpcmVjdG9yeSBhbmQgb3V0cHV0IGZpbGVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gaGVyZSBpbiBzb21lIGNhc2VzCisgICAgICogc3VjaCBhcyB3aGVuIC1vIG9wdGlvbiBpcyB1c2VkIGFuZCBpbnB1dCBmaWxlcyBhcmUgZ2l2ZW4gcmVsYXRpdmUKKyAgICAgKiB0byB0aGUgaW5wdXQgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVOYW1lV2l0aFBhdGggcGF0aCB0byBpbnB1dCBzb3VyY2UKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBmaWxlTmFtZVdpdGhQYXRoKSB7CisKKyAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBuZXcgRmlsZShnZXRPdXRwdXREaXJlY3RvcnkoKSk7CisgICAgICAgIFN0cmluZyBmaWxlRGlyZWN0b3J5OworCisgICAgICAgIC8vIFNvbWUgZmlsZXMgYXJlIGdpdmVuIHRvIHVzIHdpdGhvdXQgYSBQQVRIIGJ1dCBzaG91bGQgc2hvdWxkCisgICAgICAgIC8vIHN0aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgaW4gdGhlIHJlbGF0aXZlIHBhdGggb2YKKyAgICAgICAgLy8gdGhlIG91dHB1dCBkaXJlY3RvcnkuIFRoZSBmaWxlIGRpcmVjdG9yeSBpcyBlaXRoZXIgdGhlIHNldCBvZiBzdWIgZGlyZWN0b3JpZXMKKyAgICAgICAgLy8gb3IganVzdCBvciB0aGUgcmVsYXRpdmUgcGF0aCByZWNvcmRlZCBmb3IgdGhlIHBhcmVudCBncmFtbWFyLiBUaGlzIG1lYW5zCisgICAgICAgIC8vIHRoYXQgd2hlbiB3ZSB3cml0ZSB0aGUgdG9rZW5zIGZpbGVzLCBvciB0aGUgLmphdmEgZmlsZXMgZm9yIGltcG9ydGVkIGdyYW1tYXJzCisgICAgICAgIC8vIHRhaHQgd2Ugd2lsbCB3cml0ZSB0aGVtIGluIHRoZSBjb3JyZWN0IHBsYWNlLgorICAgICAgICAvLworICAgICAgICBpZiAoZmlsZU5hbWVXaXRoUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IC0xKSB7CisKKyAgICAgICAgICAgIC8vIE5vIHBhdGggaXMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgbmFtZSwgc28gbWFrZSB0aGUgZmlsZQorICAgICAgICAgICAgLy8gZGlyZWN0b3J5IHRoZSBzYW1lIGFzIHRoZSBwYXJlbnQgZ3JhbW1hciAod2hpY2ggbWlnaHQgc2l0bGwgYmUganVzdCAiIgorICAgICAgICAgICAgLy8gYnV0IHdoZW4gaXQgaXMgbm90LCB3ZSB3aWxsIHdyaXRlIHRoZSBmaWxlIGluIHRoZSBjb3JyZWN0IHBsYWNlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGZpbGVEaXJlY3RvcnkgPSBncmFtbWFyT3V0cHV0RGlyZWN0b3J5OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaWxlRGlyZWN0b3J5ID0gZmlsZU5hbWVXaXRoUGF0aC5zdWJzdHJpbmcoMCwgZmlsZU5hbWVXaXRoUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGF2ZU91dHB1dERpcikgeworICAgICAgICAgICAgLy8gLW8gL3RtcCAvdmFyL2xpYi90LmcgPT4gL3RtcC9ULmphdmEKKyAgICAgICAgICAgIC8vIC1vIHN1YmRpci9vdXRwdXQgL3Vzci9saWIvdC5nID0+IHN1YmRpci9vdXRwdXQvVC5qYXZhCisgICAgICAgICAgICAvLyAtbyAuIC91c3IvbGliL3QuZyA9PiAuL1QuamF2YQorICAgICAgICAgICAgaWYgKChmaWxlRGlyZWN0b3J5ICE9IG51bGwgJiYgIWZvcmNlUmVsYXRpdmVPdXRwdXQpICYmCisgICAgICAgICAgICAgICAgKG5ldyBGaWxlKGZpbGVEaXJlY3RvcnkpLmlzQWJzb2x1dGUoKSB8fAorICAgICAgICAgICAgICAgICBmaWxlRGlyZWN0b3J5LnN0YXJ0c1dpdGgoIn4iKSkgfHwgLy8gaXNBYnNvbHV0ZSBkb2Vzbid0IGNvdW50IHRoaXMgOigKKyAgICAgICAgICAgICAgICBpc0ZvcmNlQWxsRmlsZXNUb091dHB1dERpcigpKSB7CisgICAgICAgICAgICAgICAgLy8gc29tZWJvZHkgc2V0IHRoZSBkaXIsIGl0IHRha2VzIHByZWNlbmRlbmNlOyB3cml0ZSBuZXcgZmlsZSB0aGVyZQorICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKGdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIC1vIC90bXAgc3ViZGlyL3QuZyA9PiAvdG1wL3N1YmRpci90LmcKKyAgICAgICAgICAgICAgICBpZiAoZmlsZURpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKGdldE91dHB1dERpcmVjdG9yeSgpLCBmaWxlRGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKGdldE91dHB1dERpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyB0aGV5IGRpZG4ndCBzcGVjaWZ5IGEgLW8gZGlyIHNvIGp1c3Qgd3JpdGUgdG8gbG9jYXRpb24KKyAgICAgICAgICAgIC8vIHdoZXJlIGdyYW1tYXIgaXMsIGFic29sdXRlIG9yIHJlbGF0aXZlLCB0aGlzIHdpbGwgb25seSBoYXBwZW4KKyAgICAgICAgICAgIC8vIHdpdGggY29tbWFuZCBsaW5lIGludm9jYXRpb24gYXMgYnVpbGQgdG9vbHMgd2lsbCBhbHdheXMKKyAgICAgICAgICAgIC8vIHN1cHBseSBhbiBvdXRwdXQgZGlyZWN0b3J5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKGZpbGVEaXJlY3RvcnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRwdXREaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZSBhIGZpbGUgZnJvbSB0aGUgLWxpYiBkaXIuICBJbXBvcnRlZCBncmFtbWFycyBhbmQgLnRva2VucyBmaWxlcworICAgICAqCisgICAgICogSWYgd2UgZG8gbm90IGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnksIHRoZW4gd2UgdHJ5CisgICAgICogdGhlIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hdGluZyBncmFtbWFyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVOYW1lIGlucHV0IG5hbWUgd2UgYXJlIGxvb2tpbmcgZm9yCisgICAgICogQHJldHVybiBQYXRoIHRvIGZpbGUgdGhhdCB3ZSB0aGluayBzaHVvbGQgYmUgdGhlIGltcG9ydCBmaWxlCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBGaXJzdCwgc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBmaWxlIGluIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeQorICAgICAgICAvLworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnZXRMaWJyYXJ5RGlyZWN0b3J5KCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKKworICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworCisgICAgICAgICAgICAvLyBGb3VuZCBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICByZXR1cm4gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5lZWQgdG8gYXNzdW1lIGl0IGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIHRoZSBpbnB1dCBmaWxlLiBOb3RlIHRoYXQKKyAgICAgICAgLy8gdGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBleHRlcm5hbCBidWlsZCB0b29scyBhbmQgd2hlbiB0aGUgaW5wdXQgZ3JhbW1hcgorICAgICAgICAvLyB3YXMgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5ICh3b3JraW5nIGRpcmVjdG9yeSBpZiB1c2luZworICAgICAgICAvLyB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAvLworICAgICAgICByZXR1cm4gcGFyZW50R3JhbW1hckRpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqIFJldHVybiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZSBmb3IgdGhpcyBncmFtbWFyLgorICAgICAqICBub3JtYWxseSB0aGlzIGlzIGEgcmVsYXRpdmUgcGF0aCBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5LiAgUGVvcGxlIHdpbGwKKyAgICAgKiAgb2Z0ZW4gZG8gImphdmEgb3JnLmFudGxyLlRvb2wgZ3JhbW1hcnMvKi5nMyIgIFNvIHRoZSBmaWxlIHdpbGwgYmUKKyAgICAgKiAgImdyYW1tYXJzL2Zvby5nMyIgZXRjLi4uICBUaGlzIG1ldGhvZCByZXR1cm5zICJncmFtbWFycyIuCisgICAgICoKKyAgICAgKiAgSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgc3BlY2lmaWMgaW5wdXQgZGlyZWN0b3J5IGFzIGEgYmFzZSwgdGhlbgorICAgICAqICB3ZSBtdXN0IGZpbmQgdGhlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeSwgdW5sZXNzIHRoZQorICAgICAqICBmaWxlIG5hbWUgaXMgZ2l2ZW4gdG8gdXMgaW4gYWJzb2x1dGUgdGVybXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlRGlyZWN0b3J5KFN0cmluZyBmaWxlTmFtZSkgeworCisgICAgICAgIEZpbGUgZjsKKyAgICAgICAgaWYgKGhhdmVJbnB1dERpciAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgIGYgPSBuZXcgRmlsZShpbnB1dERpcmVjdG9yeSwgZmlsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAvLyBBbmQgYXNrIEphdmEgd2hhdCB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhpcyBsb2NhdGlvbiBpcworICAgICAgICAvLworICAgICAgICByZXR1cm4gZi5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJuIGEgRmlsZSBkZXNjcmlwdG9yIGZvciB2b2NhYiBmaWxlLiAgTG9vayBpbiBsaWJyYXJ5IG9yCisgICAgICogIGluIC1vIG91dHB1dCBwYXRoLiAgYW50bHIgLW8gZm9vIFQuZyBVLmcgd2hlcmUgVSBuZWVkcyBULnRva2VucworICAgICAqICB3b24ndCB3b3JrIHVubGVzcyB3ZSBsb29rIGluIGZvbyB0b28uIElmIHdlIGRvIG5vdCBmaW5kIHRoZQorICAgICAqICBmaWxlIGluIHRoZSBsaWIgZGlyZWN0b3J5IHRoZW4gbXVzdCBhc3N1bWUgdGhhdCB0aGUgLnRva2VucyBmaWxlCisgICAgICogIGlzIGdvaW5nIHRvIGJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoaXMgYnVpbGQgYW5kIHdlIGhhdmUgZGVmaW5lZAorICAgICAqICAudG9rZW5zIGZpbGVzIHNvIHRoYXQgdGhleSBBTFdBWVMgYXJlIGdlbmVyYXRlZCBpbiB0aGUgYmFzZSBvdXRwdXQKKyAgICAgKiAgZGlyZWN0b3J5LCB3aGljaCBtZWFucyB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBjb21tYW5kIGxpbmUgdG9vbCBpZiB0aGVyZQorICAgICAqICB3YXMgbm8gb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0SW1wb3J0ZWRWb2NhYkZpbGUoU3RyaW5nIHZvY2FiTmFtZSkgeworCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGdldExpYnJhcnlEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICB2b2NhYk5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OKTsKKyAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgZGlkIG5vdCBmaW5kIHRoZSB2b2NhYiBmaWxlIGluIHRoZSBsaWIgZGlyZWN0b3J5LCBzbyB3ZSBuZWVkCisgICAgICAgIC8vIHRvIGxvb2sgZm9yIGl0IGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdoaWNoIGlzIHdoZXJlIC50b2tlbnMKKyAgICAgICAgLy8gZmlsZXMgYXJlIGdlbmVyYXRlZCAoaW4gdGhlIGJhc2UsIG5vdCByZWxhdGl2ZSB0byB0aGUgaW5wdXQKKyAgICAgICAgLy8gbG9jYXRpb24uKQorICAgICAgICAvLworICAgICAgICBpZiAoaGF2ZU91dHB1dERpcikgeworICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGdldE91dHB1dERpcmVjdG9yeSgpLCB2b2NhYk5hbWUgKyBDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGYgPSBuZXcgRmlsZSh2b2NhYk5hbWUgKyBDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZjsKKyAgICB9CisKKyAgICAvKiogSWYgdGhlIHRvb2wgbmVlZHMgdG8gcGFuaWMvZXhpdCwgaG93IGRvIHdlIGRvIHRoYXQ/CisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFuaWMoKSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQU5UTFIgcGFuaWMiKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJuIGEgdGltZSBzdGFtcCBzdHJpbmcgYWNjdXJhdGUgdG8gc2VjOiB5eXl5LW1tLWRkIGhoOm1tOnNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudFRpbWVTdGFtcCgpIHsKKyAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsZW5kYXIgPSBuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgIGludCB5ID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOworICAgICAgICBpbnQgbSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgKyAxOyAvLyB6ZXJvLWJhc2VkIGZvciBtb250aHMKKyAgICAgICAgaW50IGQgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICAgICAgaW50IGggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOworICAgICAgICBpbnQgbWluID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7CisgICAgICAgIGludCBzZWMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKKyAgICAgICAgU3RyaW5nIHN5ID0gU3RyaW5nLnZhbHVlT2YoeSk7CisgICAgICAgIFN0cmluZyBzbSA9IG0gPCAxMCA/ICIwIiArIG0gOiBTdHJpbmcudmFsdWVPZihtKTsKKyAgICAgICAgU3RyaW5nIHNkID0gZCA8IDEwID8gIjAiICsgZCA6IFN0cmluZy52YWx1ZU9mKGQpOworICAgICAgICBTdHJpbmcgc2ggPSBoIDwgMTAgPyAiMCIgKyBoIDogU3RyaW5nLnZhbHVlT2YoaCk7CisgICAgICAgIFN0cmluZyBzbWluID0gbWluIDwgMTAgPyAiMCIgKyBtaW4gOiBTdHJpbmcudmFsdWVPZihtaW4pOworICAgICAgICBTdHJpbmcgc3NlYyA9IHNlYyA8IDEwID8gIjAiICsgc2VjIDogU3RyaW5nLnZhbHVlT2Yoc2VjKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQoc3kpLmFwcGVuZCgiLSIpLmFwcGVuZChzbSkuYXBwZW5kKCItIikuYXBwZW5kKHNkKS5hcHBlbmQoIiAiKS5hcHBlbmQoc2gpLmFwcGVuZCgiOiIpLmFwcGVuZChzbWluKS5hcHBlbmQoIjoiKS5hcHBlbmQoc3NlYykudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBMaXN0IG9mIGFsbCBncmFtbWFyIGZpbGUgbmFtZXMgdGhhdCB0aGUgQU5UTFIgdG9vbCB3aWxsCisgICAgICogcHJvY2VzcyBvciBoYXMgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZ3JhbW1hckZpbGVOYW1lcworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JhbW1hckZpbGVOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGdyYW1tYXJGaWxlTmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgQU5UTFIgaGFzIGduZXJhdGVkIG9yIHdpbGwgZ2VuZXJhdGUgYSBkZXNjcmlwdGlvbiBvZgorICAgICAqIGFsbCB0aGUgTkZBcyBpbiA8YSBocmVmPSJodHRwOi8vd3d3LmdyYXBodml6Lm9yZyI+RG90IGZvcm1hdDwvYT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRlX05GQV9kb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlX05GQV9kb3QoKSB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZV9ORkFfZG90OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIEFOVExSIGhhcyBnZW5lcmF0ZWQgb3Igd2lsbCBnZW5lcmF0ZSBhIGRlc2NyaXB0aW9uIG9mCisgICAgICogYWxsIHRoZSBORkFzIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnIj5Eb3QgZm9ybWF0PC9hPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVfREZBX2RvdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVfREZBX2RvdCgpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlX0RGQV9kb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQYXRoIHRvIHRoZSBiYXNlIG91dHB1dCBkaXJlY3RvcnksIHdoZXJlIEFOVExSCisgICAgICogd2lsbCBnZW5lcmF0ZSBhbGwgdGhlIG91dHB1dCBmaWxlcyBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdGFyZ2V0IGFzCisgICAgICogd2VsbCBhcyBhbnkgYW5jaWxsYXJ5IGZpbGVzIHN1Y2ggYXMgLnRva2VucyB2b2NhYiBmaWxlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG91dHB1dCBEaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBBTlRMUiB3aWxsIHNlYXJjaCBmb3IgYW5jaWxsYXJ5CisgICAgICogZmlsZXMgc3VjaCBhcyAudG9rZW5zIHZvY2FiIGZpbGVzIGFuZCBpbXBvcnRlZCBncmFtbWFyIGZpbGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGliIERpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeURpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGxpYkRpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSBpZiBBTlRMUiBoYXMgZ2VuZXJhdGVkLCBvciB3aWxsIGdlbmVyYXRlIGEgZGVidWcgdmVyc2lvbiBvZiB0aGUKKyAgICAgKiByZWNvZ25pemVyLiBEZWJ1ZyB2ZXJzaW9ucyBvZiBhIHBhcnNlciBjb21tdW5pY2F0ZSB3aXRoIGEgZGVidWdnZXIgc3VjaAorICAgICAqIGFzIHRoYXQgY29udGFpbmVkIGluIEFOVExSV29ya3MgYW5kIGF0IHN0YXJ0IHVwIHdpbGwgJ2hhbmcnIHdhaXRpbmcgZm9yCisgICAgICogYSBjb25uZWN0aW9uIG9uIGFuIElQIHBvcnQgKDQ5MTAwIGJ5IGRlZmF1bHQpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVidWcgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7CisgICAgICAgIHJldHVybiBkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIEFOVExSIGhhcyBnZW5lcmF0ZWQsIG9yIHdpbGwgZ2VuZXJhdGUgYSB2ZXJzaW9uIG9mIHRoZQorICAgICAqIHJlY29nbml6ZXIgdGhhdCBwcmludHMgdHJhY2UgbWVzc2FnZXMgb24gZW50cnkgYW5kIGV4aXQgb2YgZWFjaCBydWxlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdHJhY2UgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVHJhY2UoKSB7CisgICAgICAgIHJldHVybiB0cmFjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBTlRMUiBoYXMgZ2VuZXJhdGVkIG9yIHdpbGwgZ2VuZXJhdGUgYSB2ZXJzaW9uIG9mIHRoZQorICAgICAqIHJlY29nbml6ZXIgdGhhdCBnYXRoZXJzIHN0YXRpc3RpY3MgYWJvdXQgaXRzIGV4ZWN1dGlvbiwgd2hpY2ggaXQgcHJpbnRzIHdoZW4KKyAgICAgKiBpdCB0ZXJtaW5hdGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvZmlsZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJvZmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgQU5UTFIgaGFzIGdlbmVyYXRlZCBvciB3aWxsIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHZhcmlvdXMKKyAgICAgKiBlbGVtZW50cyBvZiB0aGUgZ3JhbW1hciBhbmFseXNpcywgb25jZSBpdCBpdCBoYXMgZmluaXNoZWQgYW5hbHl6aW5nIGEgZ3JhbW1hcgorICAgICAqIGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXBvcnQgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVwb3J0KCkgeworICAgICAgICByZXR1cm4gcmVwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIEFOVExSIGhhcyBwcmludGVkLCBvciB3aWxsIHByaW50LCBhIHZlcnNpb24gb2YgdGhlIGlucHV0IGdyYW1tYXIKKyAgICAgKiBmaWxlKHMpIHRoYXQgaXMgc3RyaXBwZWQgb2YgYW55IGFjdGlvbiBjb2RlIGVtYmVkZGVkIHdpdGhpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByaW50R3JhbW1hciBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmludEdyYW1tYXIoKSB7CisgICAgICAgIHJldHVybiBwcmludEdyYW1tYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgQU5UTFIgaGFzIHN1cHBsaWVkLCBvciB3aWxsIHN1cHBseSwgYSBsaXN0IG9mIGFsbCB0aGUgdGhpbmdzCisgICAgICogdGhhdCB0aGUgaW5wdXQgZ3JhbW1hciBkZXBlbmRzIHVwb24gYW5kIGFsbCB0aGUgdGhpbmdzIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQKKyAgICAgKiB3aGVuIHRoYXQgZ3JhbW1hciBpcyBzdWNjZXNzZnVsbHkgYW5hbHl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXBlbmQgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVwZW5kKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIEFOVExSIHdpbGwgZm9yY2UgYWxsIGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBldmVuCisgICAgICogaWYgdGhlIGlucHV0IGZpbGVzIGhhdmUgcmVsYXRpdmUgcGF0aHMgZnJvbSB0aGUgaW5wdXQgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZm9yY2VBbGxGaWxlc1RvT3V0cHV0RGlyIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlQWxsRmlsZXNUb091dHB1dERpcigpIHsKKyAgICAgICAgcmV0dXJuIGZvcmNlQWxsRmlsZXNUb091dHB1dERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBTlRMUiB3aWxsIGJlIHZlcmJvc2Ugd2hlbiBhbmFseXppbmcgZ3JhbW1hciBmaWxlcywgc3VjaCBhcworICAgICAqIGRpc3BsYXlpbmcgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyBpdCBpcyBnZW5lcmF0aW5nIGFuZCBzaW1pbGFyIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmVyYm9zZSBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIGNvbnZlcnNpb24gdGltZW91dCBvbiBERkEgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERGQSBjcmVhdGlvbiB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29udmVyc2lvblRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBERkEuTUFYX1RJTUVfUEVSX0RGQV9DUkVBVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIG1lc3NhZ2UgZm9ybWF0IGRlc2NyaXB0b3IKKyAgICAgKiBAcmV0dXJuIEN1cnJlbnQgbWVzc2FnZSBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBFcnJvck1hbmFnZXIuZ2V0TWVzc2FnZUZvcm1hdCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVycm9ycyB0aGF0IHRoZSBhbmFseXNpcy9wcm9jZXNzaW5nIHRocmV3IHVwLgorICAgICAqIEByZXR1cm4gRXJyb3IgY291bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUVycm9ycygpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yTWFuYWdlci5nZXROdW1FcnJvcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB0b29sIHdpbGwgYW5hbHl6ZSB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBwcm92aWRlZCBncmFtbWFyCisgICAgICogZmlsZSBsaXN0IGFuZCBlbnN1cmUgdGhhdCBncmFtbWFycyB3aXRoIGRlcGVuZGVuY2llcyBhcmUgYnVpbHQKKyAgICAgKiBhZnRlciBhbnkgb2YgdGhlIG90aGVyIGdyYW1hbXJzIGluIHRoZSBsaXN0IHRoYXQgdGhleSBhcmUgZGVwZW5kZW50IG9uLiBTZXR0aW5nCisgICAgICogdGhpcyBvcHRpb24gYWxzbyBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQgYW55IGdyYW1tYXJzIHRoYXQgYXJlIGluY2x1ZGVzIGZvciBvdGhlcgorICAgICAqIGdyYW1tYXJzIGluIHRoZSBsaXN0IGFyZSBleGNsdWRlZCBmcm9tIGluZGl2aWR1YWwgYW5hbHlzaXMsIHdoaWNoIGFsbG93cyB0aGUgY2FsbGVyCisgICAgICogdG8gaW52b2tlIHRoZSB0b29sIHZpYSBvcmcuYW50bHIudG9vbCAtbWFrZSAqLmcgYW5kIG5vdCB3b3JyeSBhYm91dCB0aGUgaW5jbHVzaW9uCisgICAgICogb2YgZ3JhbW1hcnMgdGhhdCBhcmUganVzdCBpbmNsdWRlcyBmb3Igb3RoZXIgZ3JhbW1hcnMgb3Igd2hhdCBvcmRlciB0aGUgZ3JhbW1hcnMKKyAgICAgKiBhcHBlYXIgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIFRoaXMgb3B0aW9uIHdhcyBjb2RlZCB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciB0b29sIGludGVncmF0aW9uIChzdWNoIGFzIE1hdmVuKSBidXQKKyAgICAgKiBtYXkgYWxzbyBiZSB1c2VmdWwgYXQgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdG9vbCBpcyBjdXJyZW50bHkgY29uZmlndXJlZCB0byBhbmFseXplIGFuZCBzb3J0IGdyYW1tYXIgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TWFrZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ha2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGZvcm1hdCB0byBvbmUgb2YgQU5UTFIsIGdudSwgdnMyMDA1CisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUZvcm1hdChTdHJpbmcgZm9ybWF0KSB7CisgICAgICAgIEVycm9yTWFuYWdlci5zZXRGb3JtYXQoZm9ybWF0KTsKKyAgICB9CisKKyAgICAvKiogUHJvdmlkZSB0aGUgTGlzdCBvZiBhbGwgZ3JhbW1hciBmaWxlIG5hbWVzIHRoYXQgdGhlIEFOVExSIHRvb2wgc2hvdWxkIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JhbW1hckZpbGVOYW1lcyBUaGUgbGlzdCBvZiBncmFtbWFyIGZpbGVzIHRvIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyRmlsZU5hbWVzKExpc3Q8U3RyaW5nPiBncmFtbWFyRmlsZU5hbWVzKSB7CisgICAgICAgIHRoaXMuZ3JhbW1hckZpbGVOYW1lcyA9IGdyYW1tYXJGaWxlTmFtZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkR3JhbW1hckZpbGUoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSkgeworICAgICAgICBpZiAoIWdyYW1tYXJGaWxlTmFtZXMuY29udGFpbnMoZ3JhbW1hckZpbGVOYW1lKSkgeworICAgICAgICAgICAgZ3JhbW1hckZpbGVOYW1lcy5hZGQoZ3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgQU5UTFIgc2hvdWxkIGdlbmVyYXRlIGEgZGVzY3JpcHRpb24gb2YKKyAgICAgKiBhbGwgdGhlIE5GQXMgaW4gPGEgaHJlZj0iaHR0cDovL3d3dy5ncmFwaHZpei5vcmciPkRvdCBmb3JtYXQ8L2E+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVfTkZBX2RvdCBUcnVlIHRvIGdlbmVyYXRlIGRvdCBkZXNjcmlwdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZV9ORkFfZG90KGJvb2xlYW4gZ2VuZXJhdGVfTkZBX2RvdCkgeworICAgICAgICB0aGlzLmdlbmVyYXRlX05GQV9kb3QgPSBnZW5lcmF0ZV9ORkFfZG90OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIEFOVExSIHNob3VsZCBnZW5lcmF0ZSBhIGRlc2NyaXB0aW9uIG9mCisgICAgICogYWxsIHRoZSBORkFzIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnIj5Eb3QgZm9ybWF0PC9hPgorICAgICAqCisgICAgICogQHBhcmFtIGdlbmVyYXRlX0RGQV9kb3QgVHJ1ZSB0byBnZW5lcmF0ZSBkb3QgZGVzY3JpcHRpb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVfREZBX2RvdChib29sZWFuIGdlbmVyYXRlX0RGQV9kb3QpIHsKKyAgICAgICAgdGhpcy5nZW5lcmF0ZV9ERkFfZG90ID0gZ2VuZXJhdGVfREZBX2RvdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFBhdGggdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBBTlRMUiB3aWxsIHNlYXJjaCBmb3IgYW5jaWxsYXJ5CisgICAgICogZmlsZXMgc3VjaCBhcyAudG9rZW5zIHZvY2FiIGZpbGVzIGFuZCBpbXBvcnRlZCBncmFtbWFyIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpYkRpcmVjdG9yeSB0aGUgbGliRGlyZWN0b3J5IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpYkRpcmVjdG9yeShTdHJpbmcgbGliRGlyZWN0b3J5KSB7CisgICAgICAgIHRoaXMubGliRGlyZWN0b3J5ID0gbGliRGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgQU5UTFIgc2hvdWxkIGdlbmVyYXRlIGEgZGVidWcgdmVyc2lvbiBvZiB0aGUKKyAgICAgKiByZWNvZ25pemVyLiBEZWJ1ZyB2ZXJzaW9ucyBvZiBhIHBhcnNlciBjb21tdW5pY2F0ZSB3aXRoIGEgZGVidWdnZXIgc3VjaAorICAgICAqIGFzIHRoYXQgY29udGFpbmVkIGluIEFOVExSV29ya3MgYW5kIGF0IHN0YXJ0IHVwIHdpbGwgJ2hhbmcnIHdhaXRpbmcgZm9yCisgICAgICogYSBjb25uZWN0aW9uIG9uIGFuIElQIHBvcnQgKDQ5MTAwIGJ5IGRlZmF1bHQpLgorICAgICAqCisgICAgICogQHBhcmFtIGRlYnVnIHRydWUgdG8gZ2VuZXJhdGUgYSBkZWJ1ZyBtb2RlIHBhcnNlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgQU5UTFIgc2hvdWxkIGdlbmVyYXRlIGEgdmVyc2lvbiBvZiB0aGUKKyAgICAgKiByZWNvZ25pemVyIHRoYXQgcHJpbnRzIHRyYWNlIG1lc3NhZ2VzIG9uIGVudHJ5IGFuZCBleGl0IG9mIGVhY2ggcnVsZQorICAgICAqCisgICAgICogQHBhcmFtIHRyYWNlIHRydWUgdG8gZ2VuZXJhdGUgYSB0cmFjaW5nIHBhcnNlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNlKGJvb2xlYW4gdHJhY2UpIHsKKyAgICAgICAgdGhpcy50cmFjZSA9IHRyYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgQU5UTFIgc2hvdWxkIGdlbmVyYXRlIGEgdmVyc2lvbiBvZiB0aGUKKyAgICAgKiByZWNvZ25pemVyIHRoYXQgZ2F0aGVycyBzdGF0aXN0aWNzIGFib3V0IGl0cyBleGVjdXRpb24sIHdoaWNoIGl0IHByaW50cyB3aGVuCisgICAgICogaXQgdGVybWluYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9maWxlIHRydWUgdG8gZ2VuZXJhdGUgYSBwcm9maWxpbmcgcGFyc2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvZmlsZShib29sZWFuIHByb2ZpbGUpIHsKKyAgICAgICAgdGhpcy5wcm9maWxlID0gcHJvZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIEFOVExSIHNob3VsZCBnZW5lcmF0ZSBhIHJlcG9ydCBvZiB2YXJpb3VzCisgICAgICogZWxlbWVudHMgb2YgdGhlIGdyYW1tYXIgYW5hbHlzaXMsIG9uY2UgaXQgaXQgaGFzIGZpbmlzaGVkIGFuYWx5emluZyBhIGdyYW1tYXIKKyAgICAgKiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcG9ydCB0cnVlIHRvIGdlbmVyYXRlIHRoZSBhbmFseXNpcyByZXBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBvcnQoYm9vbGVhbiByZXBvcnQpIHsKKyAgICAgICAgdGhpcy5yZXBvcnQgPSByZXBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgd2hldGhlciBBTlRMUiBzaG91bGQgcHJpbnQgYSB2ZXJzaW9uIG9mIHRoZSBpbnB1dCBncmFtbWFyCisgICAgICogZmlsZShzKSB0aGF0IGlzIHN0cmlwcGVkIG9mIGFueSBhY3Rpb24gY29kZSBlbWJlZGRlZCB3aXRoaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbnRHcmFtbWFyIHRydWUgdG8gZ2VuZXJhdGUgYSBzdHJpcHBlZCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbnRHcmFtbWFyKGJvb2xlYW4gcHJpbnRHcmFtbWFyKSB7CisgICAgICAgIHRoaXMucHJpbnRHcmFtbWFyID0gcHJpbnRHcmFtbWFyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgQU5UTFIgc2hvdWxkIHN1cHBseSBhIGxpc3Qgb2YgYWxsIHRoZSB0aGluZ3MKKyAgICAgKiB0aGF0IHRoZSBpbnB1dCBncmFtbWFyIGRlcGVuZHMgdXBvbiBhbmQgYWxsIHRoZSB0aGluZ3MgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZAorICAgICAqIHdoZW4gdGhhdCBncmFtYW1yIGlzIHN1Y2Nlc3NmdWxseSBhbmFseXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXBlbmQgdHJ1ZSB0byBnZXQgZGVwZW5kcyBzZXQgcmF0aGVyIHRoYW4gcHJvY2VzcyB0aGUgZ3JhbW1hcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcGVuZChib29sZWFuIGRlcGVuZCkgeworICAgICAgICB0aGlzLmRlcGVuZCA9IGRlcGVuZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBBTlRMUiB3aWxsIGZvcmNlIGFsbCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeSwgZXZlbgorICAgICAqIGlmIHRoZSBpbnB1dCBmaWxlcyBoYXZlIHJlbGF0aXZlIHBhdGhzIGZyb20gdGhlIGlucHV0IGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JjZUFsbEZpbGVzVG9PdXRwdXREaXIgdHJ1ZSB0byBmb3JjZSBmaWxlcyB0byBvdXRwdXQgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9yY2VBbGxGaWxlc1RvT3V0cHV0RGlyKGJvb2xlYW4gZm9yY2VBbGxGaWxlc1RvT3V0cHV0RGlyKSB7CisgICAgICAgIHRoaXMuZm9yY2VBbGxGaWxlc1RvT3V0cHV0RGlyID0gZm9yY2VBbGxGaWxlc1RvT3V0cHV0RGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHdoZXRoZXIgQU5UTFIgc2hvdWxkIGJlIHZlcmJvc2Ugd2hlbiBhbmFseXppbmcgZ3JhbW1hciBmaWxlcywgc3VjaCBhcworICAgICAqIGRpc3BsYXlpbmcgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyBpdCBpcyBnZW5lcmF0aW5nIGFuZCBzaW1pbGFyIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZlcmJvc2UgdHJ1ZSB0byBiZSB2ZXJib3NlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSB0b29sIHNob3VsZCBhbmFseXplIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHByb3ZpZGVkIGdyYW1tYXIKKyAgICAgKiBmaWxlIGxpc3QgYW5kIGVuc3VyZSB0aGF0IHRoZSBncmFtbWFycyB3aXRoIGRlcGVuZGVuY2llcyBhcmUgYnVpbHQKKyAgICAgKiBhZnRlciBhbnkgb2YgdGhlIG90aGVyIGdyYW1hbXJzIGluIHRoZSBsaXN0IHRoYXQgdGhleSBhcmUgZGVwZW5kZW50IG9uLiBTZXR0aW5nCisgICAgICogdGhpcyBvcHRpb24gYWxzbyBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQgYW55IGdyYW1tYXJzIHRoYXQgYXJlIGluY2x1ZGVzIGZvciBvdGhlcgorICAgICAqIGdyYW1tYXJzIGluIHRoZSBsaXN0IGFyZSBleGNsdWRlZCBmcm9tIGluZGl2aWR1YWwgYW5hbHlzaXMsIHdoaWNoIGFsbG93cyB0aGUgY2FsbGVyCisgICAgICogdG8gaW52b2tlIHRoZSB0b29sIHZpYSBvcmcuYW50bHIudG9vbCAtbWFrZSAqLmcgYW5kIG5vdCB3b3JyeSBhYm91dCB0aGUgaW5jbHVzaW9uCisgICAgICogb2YgZ3JhbW1hcnMgdGhhdCBhcmUganVzdCBpbmNsdWRlcyBmb3Igb3RoZXIgZ3JhbW1hcnMgb3Igd2hhdCBvcmRlciB0aGUgZ3JhbW1hcnMKKyAgICAgKiBhcHBlYXIgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIFRoaXMgb3B0aW9uIHdhcyBjb2RlZCB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciB0b29sIGludGVncmF0aW9uIChzdWNoIGFzIE1hdmVuKSBidXQKKyAgICAgKiBtYXkgYWxzbyBiZSB1c2VmdWwgYXQgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYWtlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFrZShib29sZWFuIG1ha2UpIHsKKyAgICAgICAgdGhpcy5tYWtlID0gbWFrZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0FjdGlvbkxhYmVsLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9BY3Rpb25MYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTAyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9BY3Rpb25MYWJlbC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXJBU1Q7CisKK3B1YmxpYyBjbGFzcyBBY3Rpb25MYWJlbCBleHRlbmRzIExhYmVsIHsKKwlwdWJsaWMgR3JhbW1hckFTVCBhY3Rpb25BU1Q7CisJCisJcHVibGljIEFjdGlvbkxhYmVsKEdyYW1tYXJBU1QgYWN0aW9uQVNUKSB7CisJCXN1cGVyKEFDVElPTik7CisJCXRoaXMuYWN0aW9uQVNUID0gYWN0aW9uQVNUOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRXBzaWxvbigpIHsKKwkJcmV0dXJuIHRydWU7IC8vIHdlIGFyZSB0byBiZSBpZ25vcmVkIGJ5IGFuYWx5c2lzICdjZXB0IGZvciBwcmVkaWNhdGVzCisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBY3Rpb24oKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAieyIrYWN0aW9uQVNUKyJ9IjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKEdyYW1tYXIgZykgeworCQlyZXR1cm4gdG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9BbmFseXNpc1JlY3Vyc2lvbk92ZXJmbG93RXhjZXB0aW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9BbmFseXNpc1JlY3Vyc2lvbk92ZXJmbG93RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmMDY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0FuYWx5c2lzUmVjdXJzaW9uT3ZlcmZsb3dFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCisvKiogQW4gTkZBIGNvbmZpZ3VyYXRpb24gY29udGV4dCBzdGFjayBvdmVyZmxvd2VkLiAqLworcHVibGljIGNsYXNzIEFuYWx5c2lzUmVjdXJzaW9uT3ZlcmZsb3dFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwlwdWJsaWMgREZBU3RhdGUgb3ZmU3RhdGU7CisJcHVibGljIE5GQUNvbmZpZ3VyYXRpb24gcHJvcG9zZWRORkFDb25maWd1cmF0aW9uOworCXB1YmxpYyBBbmFseXNpc1JlY3Vyc2lvbk92ZXJmbG93RXhjZXB0aW9uKERGQVN0YXRlIG92ZlN0YXRlLAorCQkJCQkJCQkJCQkgIE5GQUNvbmZpZ3VyYXRpb24gcHJvcG9zZWRORkFDb25maWd1cmF0aW9uKQorCXsKKwkJdGhpcy5vdmZTdGF0ZSA9IG92ZlN0YXRlOworCQl0aGlzLnByb3Bvc2VkTkZBQ29uZmlndXJhdGlvbiA9IHByb3Bvc2VkTkZBQ29uZmlndXJhdGlvbjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9BbmFseXNpc1RpbWVvdXRFeGNlcHRpb24uamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0FuYWx5c2lzVGltZW91dEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGRlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9BbmFseXNpc1RpbWVvdXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCisvKiogQW5hbHlzaXMgdG9vayB0b28gbG9uZzsgYmFpbCBvdXQgb2YgZW50aXJlIERGQSBjb25zdHJ1Y3Rpb24uICovCitwdWJsaWMgY2xhc3MgQW5hbHlzaXNUaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJcHVibGljIERGQSBhYm9ydGVkREZBOworCXB1YmxpYyBBbmFseXNpc1RpbWVvdXRFeGNlcHRpb24oREZBIGFib3J0ZWRERkEpIHsKKwkJdGhpcy5hYm9ydGVkREZBID0gYWJvcnRlZERGQTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ERkEuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0RGQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NmFjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ERkEuamF2YQpAQCAtMCwwICsxLDExNjcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIuY29kZWdlbi5Db2RlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludFNldDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5JbnRlcnZhbFNldDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5VdGlsczsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5JbnRTdHJlYW07CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5hbnRsci50b29sLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqIEEgREZBIChjb252ZXJ0ZWQgZnJvbSBhIGdyYW1tYXIncyBORkEpLgorICogIERGQXMgYXJlIHVzZWQgYXMgcHJlZGljdGlvbiBtYWNoaW5lIGZvciBhbHRlcm5hdGl2ZSBibG9ja3MgaW4gYWxsIGtpbmRzCisgKiAgb2YgcmVjb2duaXplcnMgKGxleGVycywgcGFyc2VycywgdHJlZSB3YWxrZXJzKS4KKyAqLworcHVibGljIGNsYXNzIERGQSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBQ0hBQkxFX1VOS05PV04gPSAtMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFDSEFCTEVfQlVTWSA9IC0xOyAvLyBpbiBwcm9jZXNzIG9mIGNvbXB1dGluZworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQUNIQUJMRV9OTyA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBQ0hBQkxFX1lFUyA9IDE7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDWUNMSUNfVU5LTk9XTiA9IC0yOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENZQ0xJQ19CVVNZID0gLTE7IC8vIGluIHByb2Nlc3Mgb2YgY29tcHV0aW5nCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1lDTElDX0RPTkUgPSAwOworCQorCS8qKiBQcmV2ZW50IGV4cGxvc2lvbiBvZiBERkEgc3RhdGVzIGR1cmluZyBjb252ZXJzaW9uLiBUaGUgbWF4IG51bWJlcgorCSAqICBvZiBzdGF0ZXMgcGVyIGFsdCBpbiBhIHNpbmdsZSBkZWNpc2lvbidzIERGQS4KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1RBVEVTX1BFUl9BTFRfSU5fREZBID0gNDUwOworCSAqLworCisJLyoqIFNldCB0byAwIHRvIG5vdCB0ZXJtaW5hdGUgZWFybHkgKHRpbWUgaW4gbXMpICovCisJcHVibGljIHN0YXRpYyBpbnQgTUFYX1RJTUVfUEVSX0RGQV9DUkVBVElPTiA9IDEqMTAwMDsKKworCS8qKiBIb3cgbWFueSBlZGdlcyBjYW4gZWFjaCBERkEgc3RhdGUgaGF2ZSBiZWZvcmUgYSAic3BlY2lhbCIgc3RhdGUKKwkgKiAgaXMgY3JlYXRlZCB0aGF0IHVzZXMgSUYgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiBhIHRhYmxlPworCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IE1BWF9TVEFURV9UUkFOU0lUSU9OU19GT1JfVEFCTEUgPSA2NTUzNDsKKworCS8qKiBXaGF0J3MgdGhlIHN0YXJ0IHN0YXRlIGZvciB0aGlzIERGQT8gKi8KKyAgICBwdWJsaWMgREZBU3RhdGUgc3RhcnRTdGF0ZTsKKworCS8qKiBUaGlzIERGQSBpcyBiZWluZyBidWlsdCBmb3Igd2hpY2ggZGVjaXNpb24/ICovCisJcHVibGljIGludCBkZWNpc2lvbk51bWJlciA9IDA7CisKKyAgICAvKiogRnJvbSB3aGF0IE5GQVN0YXRlIGRpZCB3ZSBjcmVhdGUgdGhlIERGQT8gKi8KKyAgICBwdWJsaWMgTkZBU3RhdGUgZGVjaXNpb25ORkFTdGFydFN0YXRlOworCisJLyoqIFRoZSBwcmludGFibGUgZ3JhbW1hciBmcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBERkEgKi8KKwlwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJLyoqIEEgc2V0IG9mIGFsbCB1bmlxdWVseS1udW1iZXJlZCBERkEgc3RhdGVzLiAgTWFwcyBoYXNoIG9mIERGQVN0YXRlCisgICAgICogIHRvIHRoZSBhY3R1YWwgREZBU3RhdGUgb2JqZWN0LiAgV2UgdXNlIHRoaXMgdG8gZGV0ZWN0CisgICAgICogIGV4aXN0aW5nIERGQSBzdGF0ZXMuICBNYXA8REZBU3RhdGUsREZBU3RhdGU+LiAgVXNlIE1hcCBzbworCSAqICB3ZSBjYW4gZ2V0IG9sZCBzdGF0ZSBiYWNrIChTZXQgb25seSBhbGxvd3MgeW91IHRvIHNlZSBpZiBpdCdzIHRoZXJlKS4KKwkgKiAgTm90IHVzZWQgZHVyaW5nIGZpeGVkIGsgbG9va2FoZWFkIGFzIGl0J3MgYSB3YXN0ZSB0byBmaWxsIGl0IHdpdGgKKwkgKiAgYSBkdXAgb2Ygc3RhdGVzIGFycmF5LgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXA8REZBU3RhdGUsIERGQVN0YXRlPiB1bmlxdWVTdGF0ZXMgPSBuZXcgSGFzaE1hcDxERkFTdGF0ZSwgREZBU3RhdGU+KCk7CisKKwkvKiogTWFwcyB0aGUgc3RhdGUgbnVtYmVyIHRvIHRoZSBhY3R1YWwgREZBU3RhdGUuICBVc2UgYSBWZWN0b3IgYXMgaXQKKwkgKiAgZ3Jvd3MgYXV0b21hdGljYWxseSB3aGVuIEkgc2V0IHRoZSBpdGggZWxlbWVudC4gIFRoaXMgY29udGFpbnMgYWxsCisJICogIHN0YXRlcywgYnV0IHRoZSBzdGF0ZXMgYXJlIG5vdCB1bmlxdWUuICBzMyBtaWdodCBiZSBzYW1lIGFzIHMxIHNvCisJICogIHMzIC0+IHMxIGluIHRoaXMgdGFibGUuICBUaGlzIGlzIGhvdyBjeWNsZXMgb2NjdXIuICBJZiBmaXhlZCBrLAorCSAqICB0aGVuIHRoZXNlIHN0YXRlcyB3aWxsIGFsbCBiZSB1bmlxdWUgYXMgc3RhdGVzW2ldIGFsd2F5cyBwb2ludHMKKwkgKiAgYXQgc3RhdGUgaSB3aGVuIG5vIGN5Y2xlcyBleGlzdC4KKwkgKgorCSAqICBUaGlzIGlzIG1hbmFnZWQgaW4gcGFyYWxsZWwgd2l0aCB1bmlxdWVTdGF0ZXMgYW5kIHNpbXBseSBwcm92aWRlcworCSAqICBhIHdheSB0byBnbyBmcm9tIHN0YXRlIG51bWJlciB0byBERkFTdGF0ZSByYXRoZXIgdGhhbiB2aWEgYQorCSAqICBoYXNoIGxvb2t1cC4KKwkgKi8KKwlwcm90ZWN0ZWQgVmVjdG9yPERGQVN0YXRlPiBzdGF0ZXMgPSBuZXcgVmVjdG9yPERGQVN0YXRlPigpOworCisJLyoqIFVuaXF1ZSBzdGF0ZSBudW1iZXJzIHBlciBERkEgKi8KKwlwcm90ZWN0ZWQgaW50IHN0YXRlQ291bnRlciA9IDA7CisKKwkvKiogY291bnQgb25seSBuZXcgc3RhdGVzIG5vdCBzdGF0ZXMgdGhhdCB3ZXJlIHJlamVjdGVkIGFzIGFscmVhZHkgcHJlc2VudCAqLworCXByb3RlY3RlZCBpbnQgbnVtYmVyT2ZTdGF0ZXMgPSAwOworCisJLyoqIFVzZXIgc3BlY2lmaWVkIG1heCBmaXhlZCBsb29rYWhlYWQuICBJZiAwLCBub3RoaW5nIHNwZWNpZmllZC4gIC0xCisJICogIGltcGxpZXMgd2UgaGF2ZSBub3QgbG9va2VkIGF0IHRoZSBvcHRpb25zIHRhYmxlIHlldCB0byBzZXQgay4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHVzZXJfayA9IC0xOworCisJLyoqIFdoaWxlIGJ1aWxkaW5nIHRoZSBERkEsIHRyYWNrIG1heCBsb29rYWhlYWQgZGVwdGggaWYgbm90IGN5Y2xpYyAqLworCXByb3RlY3RlZCBpbnQgbWF4X2sgPSAtMTsKKworICAgIC8qKiBJcyB0aGlzIERGQSByZWR1Y2VkPyAgSS5lLiwgY2FuIGFsbCBzdGF0ZXMgbGVhZCB0byBhbiBhY2NlcHQgc3RhdGU/ICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVkdWNlZCA9IHRydWU7CisKKyAgICAvKiogQXJlIHRoZXJlIGFueSBsb29wcyBpbiB0aGlzIERGQT8KKwkgKiAgQ29tcHV0ZWQgYnkgZG9lc1N0YXRlUmVhY2hBY2NlcHRTdGF0ZSgpCisJICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3ljbGljID0gZmFsc2U7CisKKwkvKiogVHJhY2sgd2hldGhlciB0aGlzIERGQSBoYXMgYXQgbGVhc3Qgb25lIHNlbS9zeW4gcHJlZCBlbmNvdW50ZXJlZAorCSAqICBkdXJpbmcgYSBjbG9zdXJlIG9wZXJhdGlvbi4gIFRoaXMgaXMgdXNlZnVsIGZvciBkZWNpZGluZyB3aGV0aGVyCisJICogIHRvIHJldHJ5IGEgbm9uLUxMKCopIHdpdGggaz0xLiAgSWYgbm8gcHJlZCwgaXQgd2lsbCBub3Qgd29yayB3L28KKwkgKiAgYSBwcmVkIHNvIGRvbid0IGJvdGhlci4gIEl0IHdvdWxkIGp1c3QgZ2l2ZSBhbm90aGVyIGVycm9yIG1lc3NhZ2UuCisJICovCisJcHVibGljIGJvb2xlYW4gcHJlZGljYXRlVmlzaWJsZSA9IGZhbHNlOworCisJcHVibGljIGJvb2xlYW4gaGFzUHJlZGljYXRlQmxvY2tlZEJ5QWN0aW9uID0gZmFsc2U7CisKKwkvKiogRWFjaCBhbHQgaW4gYW4gTkZBIGRlcml2ZWQgZnJvbSBhIGdyYW1tYXIgbXVzdCBoYXZlIGEgREZBIHN0YXRlIHRoYXQKKyAgICAgKiAgcHJlZGljdHMgaXQgbGVzdCB0aGUgcGFyc2VyIG5vdCBrbm93IHdoYXQgdG8gZG8uICBOb25kZXRlcm1pbmlzbXMgY2FuCisgICAgICogIGxlYWQgdG8gdGhpcyBzaXR1YXRpb24gKGFzc3VtaW5nIG5vIHNlbWFudGljIHByZWRpY2F0ZXMgY2FuIHJlc29sdmUKKyAgICAgKiAgdGhlIHByb2JsZW0pIGFuZCB3aGVuIGZvciBzb21lIHJlYXNvbiwgSSBjYW5ub3QgY29tcHV0ZSB0aGUgbG9va2FoZWFkCisgICAgICogICh3aGljaCBtaWdodCBhcmlzZSBmcm9tIGFuIGVycm9yIGluIHRoZSBhbGdvcml0aG0gb3IgZnJvbQorICAgICAqICBsZWZ0LXJlY3Vyc2lvbiBldGMuLi4pLiAgVGhpcyBsaXN0IHN0YXJ0cyBvdXQgd2l0aCBhbGwgYWx0cyBjb250YWluZWQKKyAgICAgKiAgYW5kIHRoZW4gaW4gbWV0aG9kIGRvZXNTdGF0ZVJlYWNoQWNjZXB0U3RhdGUoKSBJIHJlbW92ZSB0aGUgYWx0cyBJCisgICAgICogIGtub3cgdG8gYmUgdW5pcXVlbHkgcHJlZGljdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0PEludGVnZXI+IHVucmVhY2hhYmxlQWx0czsKKworCXByb3RlY3RlZCBpbnQgbkFsdHMgPSAwOworCisJLyoqIFdlIG9ubHkgd2FudCBvbmUgYWNjZXB0IHN0YXRlIHBlciBwcmVkaWN0ZWQgYWx0OyB0cmFjayBoZXJlICovCisJcHJvdGVjdGVkIERGQVN0YXRlW10gYWx0VG9BY2NlcHRTdGF0ZTsKKworCS8qKiBUcmFjayB3aGV0aGVyIGFuIGFsdCBkaXNjb3ZlcnMgcmVjdXJzaW9uIGZvciBlYWNoIGFsdCBkdXJpbmcKKwkgKiAgTkZBIHRvIERGQSBjb252ZXJzaW9uOyA+MSBhbHQgd2l0aCByZWN1cnNpb24gaW1wbGllcyBub25yZWd1bGFyLgorCSAqLworCXB1YmxpYyBJbnRTZXQgcmVjdXJzaXZlQWx0U2V0ID0gbmV3IEludGVydmFsU2V0KCk7CisKKwkvKiogV2hpY2ggTkZBIGFyZSB3ZSBjb252ZXJ0aW5nICh3ZWxsLCB3aGljaCBwaWVjZSBvZiB0aGUgTkZBKT8gKi8KKyAgICBwdWJsaWMgTkZBIG5mYTsKKworCXByb3RlY3RlZCBORkFUb0RGQUNvbnZlcnRlciBuZmFDb252ZXJ0ZXI7CisKKwkvKiogVGhpcyBwcm9iZSB0ZWxscyB5b3UgYSBsb3QgYWJvdXQgYSBkZWNpc2lvbiBhbmQgaXMgdXNlZnVsIGV2ZW4KKwkgKiAgd2hlbiB0aGVyZSBpcyBubyBlcnJvciBzdWNoIGFzIHdoZW4gYSBzeW50YWN0aWMgbm9uZGV0ZXJtaW5pc20KKwkgKiAgaXMgc29sdmVkIHZpYSBzZW1hbnRpYyBwcmVkaWNhdGVzLiAgUGVyaGFwcyBhIEdVSSB3b3VsZCB3YW50CisJICogIHRoZSBhYmlsaXR5IHRvIHNob3cgdGhhdC4KKwkgKi8KKwlwdWJsaWMgRGVjaXNpb25Qcm9iZSBwcm9iZSA9IG5ldyBEZWNpc2lvblByb2JlKHRoaXMpOworCisJLyoqIFRyYWNrIGFic29sdXRlIHRpbWUgb2YgdGhlIGNvbnZlcnNpb24gc28gd2UgY2FuIGhhdmUgYSBmYWlsc2FmZToKKwkgKiAgaWYgaXQgdGFrZXMgdG9vIGxvbmcsIHRoZW4gdGVybWluYXRlLiAgQXNzdW1lIGJ1Z3MgYXJlIGluIHRoZQorCSAqICBhbmFseXNpcyBlbmdpbmUuCisJICovCisJLy9wcm90ZWN0ZWQgbG9uZyBjb252ZXJzaW9uU3RhcnRUaW1lOworCisJLyoqIE1hcCBhbiBlZGdlIHRyYW5zaXRpb24gdGFibGUgdG8gYSB1bmlxdWUgc2V0IG51bWJlcjsgb3JkZXJlZCBzbworCSAqICB3ZSBjYW4gcHVzaCBpbnRvIHRoZSBvdXRwdXQgdGVtcGxhdGUgYXMgYW4gb3JkZXJlZCBsaXN0IG9mIHNldHMKKwkgKiAgYW5kIHRoZW4gcmVmIHRoZW0gZnJvbSB3aXRoaW4gdGhlIHRyYW5zaXRpb25bXVtdIHRhYmxlLiAgTGlrZSB0aGlzCisJICogIGZvciBDIyB0YXJnZXQ6CisJICogICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREZBMzBfdHJhbnNpdGlvbjAgPQorCSAqICAgICAJbmV3IHNob3J0W10geyA0NiwgNDYsIC0xLCA0NiwgNDYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLC4uLn07CisJICogICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERGQTMwX3RyYW5zaXRpb24xID0KKwkgKiAgICAgCW5ldyBzaG9ydFtdIHsgMjEgfTsKKwkgKiAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXVtdIERGQTMwX3RyYW5zaXRpb24gPSB7CisJICogICAgIAkgIERGQTMwX3RyYW5zaXRpb24wLAorCSAqICAgICAJICBERkEzMF90cmFuc2l0aW9uMCwKKwkgKiAgICAgCSAgREZBMzBfdHJhbnNpdGlvbjEsCisJICogICAgIAkgIC4uLgorCSAqICAgICAgfTsKKwkgKi8KKwlwdWJsaWMgTWFwIGVkZ2VUcmFuc2l0aW9uQ2xhc3NNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworCisJLyoqIFRoZSB1bmlxdWUgZWRnZSB0cmFuc2l0aW9uIGNsYXNzIG51bWJlcjsgZXZlcnkgdGltZSB3ZSBzZWUgYSBuZXcKKwkgKiAgc2V0IG9mIGVkZ2VzIGVtYW5hdGluZyBmcm9tIGEgc3RhdGUsIHdlIG51bWJlciBpdCBzbyB3ZSBjYW4gcmV1c2UKKwkgKiAgaWYgaXQncyBldmVyeSBzZWVuIGFnYWluIGZvciBhbm90aGVyIHN0YXRlLiAgRm9yIEphdmEgZ3JhbW1hciwKKwkgKiAgc29tZSBvZiB0aGUgYmlnIGVkZ2UgdHJhbnNpdGlvbiB0YWJsZXMgYXJlIHNlZW4gYWJvdXQgNTcgdGltZXMuCisJICovCisJcHJvdGVjdGVkIGludCBlZGdlVHJhbnNpdGlvbkNsYXNzID0wOworCisJLyogVGhpcyBERkEgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHRyYW5zaXRpb25bc3RhdGVdW2NoYXJdIHRhYmxlIGFuZAorCSAqIHRoZSBmb2xsb3dpbmcgdGFibGVzIGFyZSBmaWxsZWQgYnkgY3JlYXRlU3RhdGVUYWJsZXMgdXBvbiByZXF1ZXN0LgorCSAqIFRoZXNlIGFyZSBpbmplY3RlZCBpbnRvIHRoZSB0ZW1wbGF0ZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbi4KKwkgKiBTZWUgTWFyY2ggMjUsIDIwMDYgZW50cnkgZm9yIGRlc2NyaXB0aW9uOgorCSAqICAgaHR0cDovL3d3dy5hbnRsci5vcmcvYmxvZy9hbnRscjMvY29kZWdlbi50bWwKKwkgKiBPZnRlbiB1c2luZyBWZWN0b3IgYXMgY2FuJ3Qgc2V0IGl0aCBwb3NpdGlvbiBpbiBhIExpc3QgYW5kIGhhdmUKKwkgKiBpdCBleHRlbmQgbGlzdCBzaXplOyBiaXphcnJlLgorCSAqLworCisJLyoqIExpc3Qgb2Ygc3BlY2lhbCBERkFTdGF0ZSBvYmplY3RzICovCisJcHVibGljIExpc3Qgc3BlY2lhbFN0YXRlczsKKwkvKiogTGlzdCBvZiBTVCBmb3Igc3BlY2lhbCBzdGF0ZXMuICovCisJcHVibGljIExpc3Qgc3BlY2lhbFN0YXRlU1RzOworCXB1YmxpYyBWZWN0b3IgYWNjZXB0OworCXB1YmxpYyBWZWN0b3IgZW90OworCXB1YmxpYyBWZWN0b3IgZW9mOworCXB1YmxpYyBWZWN0b3IgbWluOworCXB1YmxpYyBWZWN0b3IgbWF4OworCXB1YmxpYyBWZWN0b3Igc3BlY2lhbDsKKwlwdWJsaWMgVmVjdG9yIHRyYW5zaXRpb247CisJLyoqIGp1c3QgdGhlIFZlY3RvcjxJbnRlZ2VyPiBpbmRpY2F0aW5nIHdoaWNoIHVuaXF1ZSBlZGdlIHRhYmxlIGlzIGF0CisJICogIHBvc2l0aW9uIGkuCisJICovCisJcHVibGljIFZlY3RvciB0cmFuc2l0aW9uRWRnZVRhYmxlczsgLy8gbm90IHVzZWQgYnkgamF2YSB5ZXQKKwlwcm90ZWN0ZWQgaW50IHVuaXF1ZUNvbXByZXNzZWRTcGVjaWFsU3RhdGVOdW0gPSAwOworCisJLyoqIFdoaWNoIGdlbmVyYXRvciB0byB1c2UgaWYgd2UncmUgYnVpbGRpbmcgc3RhdGUgdGFibGVzICovCisJcHJvdGVjdGVkIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKKworCXByb3RlY3RlZCBERkEoKSB7O30KKworCXB1YmxpYyBERkEoaW50IGRlY2lzaW9uTnVtYmVyLCBORkFTdGF0ZSBkZWNpc2lvblN0YXJ0U3RhdGUpIHsKKwkJdGhpcy5kZWNpc2lvbk51bWJlciA9IGRlY2lzaW9uTnVtYmVyOworICAgICAgICB0aGlzLmRlY2lzaW9uTkZBU3RhcnRTdGF0ZSA9IGRlY2lzaW9uU3RhcnRTdGF0ZTsKKyAgICAgICAgbmZhID0gZGVjaXNpb25TdGFydFN0YXRlLm5mYTsKKyAgICAgICAgbkFsdHMgPSBuZmEuZ3JhbW1hci5nZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShkZWNpc2lvblN0YXJ0U3RhdGUpOworICAgICAgICAvL3NldE9wdGlvbnMoIG5mYS5ncmFtbWFyLmdldERlY2lzaW9uT3B0aW9ucyhnZXREZWNpc2lvbk51bWJlcigpKSApOworICAgICAgICBpbml0QWx0UmVsYXRlZEluZm8oKTsKKworCQkvL2xvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbmZhQ29udmVydGVyID0gbmV3IE5GQVRvREZBQ29udmVydGVyKHRoaXMpOworCQl0cnkgeworCQkJbmZhQ29udmVydGVyLmNvbnZlcnQoKTsKKworCQkJLy8gZmlndXJlIG91dCBpZiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBkZWNpc2lvbgorCQkJdmVyaWZ5KCk7CisKKwkJCWlmICggIXByb2JlLmlzRGV0ZXJtaW5pc3RpYygpIHx8IHByb2JlLmFuYWx5c2lzT3ZlcmZsb3dlZCgpICkgeworCQkJCXByb2JlLmlzc3VlV2FybmluZ3MoKTsKKwkJCX0KKworCQkJLy8gbXVzdCBiZSBhZnRlciB2ZXJpZnkgYXMgaXQgY29tcHV0ZXMgY3ljbGljLCBuZWVkZWQgYnkgdGhpcyByb3V0aW5lCisJCQkvLyBzaG91bGQgYmUgYWZ0ZXIgd2FybmluZ3MgYmVjYXVzZSBlYXJseSB0ZXJtaW5hdGlvbiBvciBzb21ldGhpbmcKKwkJCS8vIHdpbGwgbm90IGFsbG93IHRoZSByZXNldCB0byBvcGVyYXRlIHByb3Blcmx5IGluIHNvbWUgY2FzZXMuCisJCQlyZXNldFN0YXRlTnVtYmVyc1RvQmVDb250aWd1b3VzKCk7CisKKwkJCS8vbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidmVyaWZ5IGNvc3Q6ICIrKGludCkoc3RvcC1zdGFydCkrIiBtcyIpOworCQl9CisvLwkJY2F0Y2ggKEFuYWx5c2lzVGltZW91dEV4Y2VwdGlvbiBhdCkgeworLy8JCQlwcm9iZS5yZXBvcnRBbmFseXNpc1RpbWVvdXQoKTsKKy8vCQkJaWYgKCAhb2tUb1JldHJ5REZBV2l0aEsxKCkgKSB7CisvLwkJCQlwcm9iZS5pc3N1ZVdhcm5pbmdzKCk7CisvLwkJCX0KKy8vCQl9CisJCWNhdGNoIChOb25MTFN0YXJEZWNpc2lvbkV4Y2VwdGlvbiBub25MTCkgeworCQkJcHJvYmUucmVwb3J0Tm9uTExTdGFyRGVjaXNpb24odGhpcyk7CisJCQkvLyA+MSBhbHQgcmVjdXJzZXMsIGs9KiBhbmQgbm8gYXV0byBiYWNrdHJhY2sgbm9yIG1hbnVhbCBzZW0vc3luCisJCQlpZiAoICFva1RvUmV0cnlERkFXaXRoSzEoKSApIHsKKwkJCQlwcm9iZS5pc3N1ZVdhcm5pbmdzKCk7CisJCQl9CisJCX0KKyAgICB9CisKKwkvKiogV2FsayBhbGwgc3RhdGVzIGFuZCByZXNldCB0aGVpciBudW1iZXJzIHRvIGJlIGEgY29udGlndW91cyBzZXF1ZW5jZQorCSAqICBvZiBpbnRlZ2VycyBzdGFydGluZyBmcm9tIDAuICBPbmx5IGN5Y2xpYyBERkEgY2FuIGhhdmUgdW51c2VkIHBvc2l0aW9ucworCSAqICBpbiBzdGF0ZXMgbGlzdC4gIFN0YXRlIGkgbWlnaHQgYmUgaWRlbnRpY2FsIHRvIGEgcHJldmlvdXMgc3RhdGUgaiBhbmQKKwkgKiAgd2lsbCByZXN1bHQgaW4gc3RhdGVzW2ldID09IHN0YXRlc1tqXS4gIFdlIGRvbid0IHdhbnQgdG8gd2FzdGUgYSBzdGF0ZQorCSAqICBudW1iZXIgb24gdGhpcy4gIFVzZWZ1bCBtb3N0bHkgZm9yIGNvZGUgZ2VuZXJhdGlvbiBpbiB0YWJsZXMuCisJICoKKwkgKiAgQXQgdGhlIHN0YXJ0IG9mIHRoaXMgcm91dGluZSwgc3RhdGVzW2ldLnN0YXRlTnVtYmVyIDw9IGkgYnkgZGVmaW5pdGlvbi4KKwkgKiAgSWYgc3RhdGVzWzUwXS5zdGF0ZU51bWJlciBpcyA1MCB0aGVuIGEgY3ljbGUgZHVyaW5nIGNvbnZlcnNpb24gbWF5CisJICogIHRyeSB0byBhZGQgc3RhdGUgMTAzLCBidXQgd2UgZmluZCB0aGF0IGFuIGlkZW50aWNhbCBERkEgc3RhdGUsIG5hbWVkCisJICogIDUwLCBhbHJlYWR5IGV4aXN0cywgaGVuY2UsIHN0YXRlc1sxMDNdPT1zdGF0ZXNbNTBdIGFuZCBib3RoIGhhdmUKKwkgKiAgc3RhdGVOdW1iZXIgNTAgYXMgdGhleSBwb2ludCBhdCBzYW1lIG9iamVjdC4gIEFmdGVyd2FyZHMsIHRoZSBzZXQKKwkgKiAgb2Ygc3RhdGUgbnVtYmVycyBmcm9tIGFsbCBzdGF0ZXMgc2hvdWxkIHJlcHJlc2VudCBhIGNvbnRpZ3VvdXMgcmFuZ2UKKwkgKiAgZnJvbSAwLi5uLTEgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBzdGF0ZXMuCisJICovCisJcHVibGljIHZvaWQgcmVzZXRTdGF0ZU51bWJlcnNUb0JlQ29udGlndW91cygpIHsKKwkJaWYgKCBnZXRVc2VyTWF4TG9va2FoZWFkKCk+MCApIHsKKwkJCS8vIGFsbCBudW1iZXJzIGFyZSB1bmlxdWUgYWxyZWFkeTsgbm8gc3RhdGVzIGFyZSB0aHJvd24gb3V0LgorCQkJcmV0dXJuOworCQl9CisKKyAgICAgICAgLy8gd2FsayBsaXN0IG9mIERGQVN0YXRlIG9iamVjdHMgYnkgc3RhdGUgbnVtYmVyLAorCQkvLyBzZXR0aW5nIHN0YXRlIG51bWJlcnMgdG8gMC4ubi0xCisJCWludCBzbnVtPTA7CisJCWZvciAoaW50IGkgPSAwOyBpIDw9IGdldE1heFN0YXRlTnVtYmVyKCk7IGkrKykgeworCQkJREZBU3RhdGUgcyA9IGdldFN0YXRlKGkpOworICAgICAgICAgICAgLy8gc29tZSBzdGF0ZXMgYXJlIHVudXNlZCBhZnRlciBjcmVhdGlvbiBtb3N0IGNvbW1vbmx5IGR1ZSB0byBjeWNsZXMKKyAgICAgICAgICAgIC8vIG9yIGNvbmZsaWN0IHJlc29sdXRpb24uCisgICAgICAgICAgICBpZiAoIHM9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisJCQkvLyBzdGF0ZSBpIGlzIG1hcHBlZCB0byBERkFTdGF0ZSB3aXRoIHN0YXRlIG51bWJlciBzZXQgdG8gaSBvcmlnaW5hbGx5CisJCQkvLyBzbyBpZiBpdCdzIGxlc3MgdGhhbiBpLCB0aGVuIHdlIHJlbnVtYmVyZWQgaXQgYWxyZWFkeTsgdGhhdAorCQkJLy8gaGFwcGVucyB3aGVuIHN0YXRlcyBoYXZlIGJlZW4gbWVyZ2VkIG9yIGN5Y2xlcyBvY2N1cnJlZCBJIHRoaW5rLgorCQkJLy8gc3RhdGVzWzUwXSB3aWxsIHBvaW50IHRvIERGQVN0YXRlIHdpdGggczUwIGluIGl0IGJ1dAorCQkJLy8gc3RhdGVzWzEwM10gbWlnaHQgYWxzbyBwb2ludCBhdCB0aGlzIHNhbWUgREZBU3RhdGUuICBTaW5jZQorCQkJLy8gNTAgPCAxMDMgdGhlbiBpdCdzIGFscmVhZHkgYmVlbiByZW51bWJlcmVkIGFzIGl0IHBvaW50cyBkb3dud2FyZHMuCisJCQlib29sZWFuIGFscmVhZHlSZW51bWJlcmVkID0gcy5zdGF0ZU51bWJlcjxpOworCQkJaWYgKCAhYWxyZWFkeVJlbnVtYmVyZWQgKSB7CisJCQkJLy8gc3RhdGUgaSBpcyBhIHZhbGlkIHN0YXRlLCByZXNldCBpdCdzIHN0YXRlIG51bWJlcgorCQkJCXMuc3RhdGVOdW1iZXIgPSBzbnVtOyAvLyByZXdyaXRlIHN0YXRlIG51bWJlcnMgdG8gYmUgMC4ubi0xCisJCQkJc251bSsrOworCQkJfQorCQl9CisgICAgICAgIGlmICggc251bSE9Z2V0TnVtYmVyT2ZTdGF0ZXMoKSApIHsKKwkJCUVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCJERkEgIitkZWNpc2lvbk51bWJlcisiOiAiKworCQkJCWRlY2lzaW9uTkZBU3RhcnRTdGF0ZS5nZXREZXNjcmlwdGlvbigpKyIgbnVtIHVuaXF1ZSBzdGF0ZXMgIitnZXROdW1iZXJPZlN0YXRlcygpKworCQkJCSIhPSBudW0gcmVudW1iZXJlZCBzdGF0ZXMgIitzbnVtKTsKKwkJfQorCX0KKworCS8vIEpBVkEtU1BFQ0lGSUMgQWNjZXNzb3JzISEhISEgIEl0IGlzIHNvIGltcG9zc2libGUgdG8gZ2V0IGFycmF5cworCS8vIG9yIGV2ZW4gY29uc2lzdGVudGx5IGZvcm1hdHRlZCBzdHJpbmdzIGFjY2VwdGFibGUgdG8gamF2YSB0aGF0CisJLy8gSSBhbSBmb3JjZWQgdG8gYnVpbGQgdGhlIGluZGl2aWR1YWwgY2hhciBlbGVtZW50cyBoZXJlCisKKwlwdWJsaWMgTGlzdCBnZXRKYXZhQ29tcHJlc3NlZEFjY2VwdCgpIHsgcmV0dXJuIGdldFJ1bkxlbmd0aEVuY29kaW5nKGFjY2VwdCk7IH0KKwlwdWJsaWMgTGlzdCBnZXRKYXZhQ29tcHJlc3NlZEVPVCgpIHsgcmV0dXJuIGdldFJ1bkxlbmd0aEVuY29kaW5nKGVvdCk7IH0KKwlwdWJsaWMgTGlzdCBnZXRKYXZhQ29tcHJlc3NlZEVPRigpIHsgcmV0dXJuIGdldFJ1bkxlbmd0aEVuY29kaW5nKGVvZik7IH0KKwlwdWJsaWMgTGlzdCBnZXRKYXZhQ29tcHJlc3NlZE1pbigpIHsgcmV0dXJuIGdldFJ1bkxlbmd0aEVuY29kaW5nKG1pbik7IH0KKwlwdWJsaWMgTGlzdCBnZXRKYXZhQ29tcHJlc3NlZE1heCgpIHsgcmV0dXJuIGdldFJ1bkxlbmd0aEVuY29kaW5nKG1heCk7IH0KKwlwdWJsaWMgTGlzdCBnZXRKYXZhQ29tcHJlc3NlZFNwZWNpYWwoKSB7IHJldHVybiBnZXRSdW5MZW5ndGhFbmNvZGluZyhzcGVjaWFsKTsgfQorCXB1YmxpYyBMaXN0IGdldEphdmFDb21wcmVzc2VkVHJhbnNpdGlvbigpIHsKKwkJaWYgKCB0cmFuc2l0aW9uPT1udWxsIHx8IHRyYW5zaXRpb24uc2l6ZSgpPT0wICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJTGlzdCBlbmNvZGVkID0gbmV3IEFycmF5TGlzdCh0cmFuc2l0aW9uLnNpemUoKSk7CisJCS8vIHdhbGsgVmVjdG9yPFZlY3RvcjxGb3JtYXR0ZWRJbnRlZ2VyPj4gd2hpY2ggaXMgdGhlIHRyYW5zaXRpb25bXVtdIHRhYmxlCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNpdGlvbi5zaXplKCk7IGkrKykgeworCQkJVmVjdG9yIHRyYW5zaXRpb25zRm9yU3RhdGUgPSAoVmVjdG9yKSB0cmFuc2l0aW9uLmVsZW1lbnRBdChpKTsKKwkJCWVuY29kZWQuYWRkKGdldFJ1bkxlbmd0aEVuY29kaW5nKHRyYW5zaXRpb25zRm9yU3RhdGUpKTsKKwkJfQorCQlyZXR1cm4gZW5jb2RlZDsKKwl9CisKKwkvKiogQ29tcHJlc3MgdGhlIGluY29taW5nIGRhdGEgbGlzdCBzbyB0aGF0IHJ1bnMgb2Ygc2FtZSBudW1iZXIgYXJlCisJICogIGVuY29kZWQgYXMgbnVtYmVyLHZhbHVlIHBhaXIgc2VxdWVuY2VzLiAgMyAtMSAtMSAtMSAyOCBpcyBlbmNvZGVkCisJICogIGFzIDEgMyAzIC0xIDEgMjguICBJIGFtIHByZXR0eSBzdXJlIHRoaXMgaXMgdGhlIGxvc3NsZXNzIGNvbXByZXNzaW9uCisJICogIHRoYXQgR0lGIGZpbGVzIHVzZS4gIFRyYW5zaXRpb24gdGFibGVzIGFyZSBoZWF2aWx5IGNvbXByZXNzZWQgYnkKKwkgKiAgdGhpcyB0ZWNobmlxdWUuICBJIGdvdCB0aGUgaWRlYSBmcm9tIEpGbGV4IGh0dHA6Ly9qZmxleC5kZS8KKwkgKgorCSAqICBSZXR1cm4gTGlzdDxTdHJpbmc+IHdoZXJlIGVhY2ggc3RyaW5nIGlzIGVpdGhlciBceHl6IGZvciA4Yml0IGNoYXIKKwkgKiAgYW5kIFx1RkZGRiBmb3IgMTZiaXQuICBIaWRlb3VzIGFuZCBzcGVjaWZpYyB0byBKYXZhLCBidXQgaXQgaXMgdGhlCisJICogIG9ubHkgdGFyZ2V0IGJhZCBlbm91Z2ggdG8gbmVlZCBpdC4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRSdW5MZW5ndGhFbmNvZGluZyhMaXN0IGRhdGEpIHsKKwkJaWYgKCBkYXRhPT1udWxsIHx8IGRhdGEuc2l6ZSgpPT0wICkgeworCQkJLy8gZm9yIHN0YXRlcyB3aXRoIG5vIHRyYW5zaXRpb25zIHdlIHdhbnQgYW4gZW1wdHkgc3RyaW5nICIiCisJCQkvLyB0byBob2xkIGl0cyBwbGFjZSBpbiB0aGUgdHJhbnNpdGlvbnMgYXJyYXkuCisJCQlMaXN0IGVtcHR5ID0gbmV3IEFycmF5TGlzdCgpOworCQkJZW1wdHkuYWRkKCIiKTsKKwkJCXJldHVybiBlbXB0eTsKKwkJfQorCQlpbnQgc2l6ZSA9IE1hdGgubWF4KDIsZGF0YS5zaXplKCkvMik7CisJCUxpc3QgZW5jb2RlZCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7IC8vIGd1ZXNzIGF0IHNpemUKKwkJLy8gc2NhbiB2YWx1ZXMgbG9va2luZyBmb3IgcnVucworCQlpbnQgaSA9IDA7CisJCUludGVnZXIgZW1wdHlWYWx1ZSA9IFV0aWxzLmludGVnZXIoLTEpOworCQl3aGlsZSAoIGkgPCBkYXRhLnNpemUoKSApIHsKKwkJCUludGVnZXIgSSA9IChJbnRlZ2VyKWRhdGEuZ2V0KGkpOworCQkJaWYgKCBJPT1udWxsICkgeworCQkJCUkgPSBlbXB0eVZhbHVlOworCQkJfQorCQkJLy8gY291bnQgaG93IG1hbnkgdiB0aGVyZSBhcmU/CisJCQlpbnQgbiA9IDA7CisJCQlmb3IgKGludCBqID0gaTsgaiA8IGRhdGEuc2l6ZSgpOyBqKyspIHsKKwkJCQlJbnRlZ2VyIHYgPSAoSW50ZWdlcilkYXRhLmdldChqKTsKKwkJCQlpZiAoIHY9PW51bGwgKSB7CisJCQkJCXYgPSBlbXB0eVZhbHVlOworCQkJCX0KKwkJCQlpZiAoIEkuZXF1YWxzKHYpICkgeworCQkJCQluKys7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQllbmNvZGVkLmFkZChnZW5lcmF0b3IudGFyZ2V0LmVuY29kZUludEFzQ2hhckVzY2FwZSgoY2hhciluKSk7CisJCQllbmNvZGVkLmFkZChnZW5lcmF0b3IudGFyZ2V0LmVuY29kZUludEFzQ2hhckVzY2FwZSgoY2hhcilJLmludFZhbHVlKCkpKTsKKwkJCWkrPW47CisJCX0KKwkJcmV0dXJuIGVuY29kZWQ7CisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlU3RhdGVUYWJsZXMoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZVRhYmxlczpcbiIrdGhpcyk7CisJCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOworCQlkZXNjcmlwdGlvbiA9IGdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpLmdldERlc2NyaXB0aW9uKCk7CisJCWRlc2NyaXB0aW9uID0KKwkJCWdlbmVyYXRvci50YXJnZXQuZ2V0VGFyZ2V0U3RyaW5nTGl0ZXJhbEZyb21TdHJpbmcoZGVzY3JpcHRpb24pOworCisJCS8vIGNyZWF0ZSBhbGwgdGhlIHRhYmxlcworCQlzcGVjaWFsID0gbmV3IFZlY3Rvcih0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOyAvLyBWZWN0b3I8c2hvcnQ+CisJCXNwZWNpYWwuc2V0U2l6ZSh0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOworCQlzcGVjaWFsU3RhdGVzID0gbmV3IEFycmF5TGlzdCgpOwkJCQkvLyBMaXN0PERGQVN0YXRlPgorCQlzcGVjaWFsU3RhdGVTVHMgPSBuZXcgQXJyYXlMaXN0KCk7CQkJCS8vIExpc3Q8U1Q+CisJCWFjY2VwdCA9IG5ldyBWZWN0b3IodGhpcy5nZXROdW1iZXJPZlN0YXRlcygpKTsgLy8gVmVjdG9yPGludD4KKwkJYWNjZXB0LnNldFNpemUodGhpcy5nZXROdW1iZXJPZlN0YXRlcygpKTsKKwkJZW90ID0gbmV3IFZlY3Rvcih0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOyAvLyBWZWN0b3I8aW50PgorCQllb3Quc2V0U2l6ZSh0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOworCQllb2YgPSBuZXcgVmVjdG9yKHRoaXMuZ2V0TnVtYmVyT2ZTdGF0ZXMoKSk7IC8vIFZlY3RvcjxpbnQ+CisJCWVvZi5zZXRTaXplKHRoaXMuZ2V0TnVtYmVyT2ZTdGF0ZXMoKSk7CisJCW1pbiA9IG5ldyBWZWN0b3IodGhpcy5nZXROdW1iZXJPZlN0YXRlcygpKTsgLy8gVmVjdG9yPGludD4KKwkJbWluLnNldFNpemUodGhpcy5nZXROdW1iZXJPZlN0YXRlcygpKTsKKwkJbWF4ID0gbmV3IFZlY3Rvcih0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOyAvLyBWZWN0b3I8aW50PgorCQltYXguc2V0U2l6ZSh0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOworCQl0cmFuc2l0aW9uID0gbmV3IFZlY3Rvcih0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOyAvLyBWZWN0b3I8VmVjdG9yPGludD4+CisJCXRyYW5zaXRpb24uc2V0U2l6ZSh0aGlzLmdldE51bWJlck9mU3RhdGVzKCkpOworCQl0cmFuc2l0aW9uRWRnZVRhYmxlcyA9IG5ldyBWZWN0b3IodGhpcy5nZXROdW1iZXJPZlN0YXRlcygpKTsgLy8gVmVjdG9yPFZlY3RvcjxpbnQ+PgorCQl0cmFuc2l0aW9uRWRnZVRhYmxlcy5zZXRTaXplKHRoaXMuZ2V0TnVtYmVyT2ZTdGF0ZXMoKSk7CisKKwkJLy8gZm9yIGVhY2ggc3RhdGUgaW4gdGhlIERGQSwgZmlsbCByZWxldmFudCB0YWJsZXMuCisJCUl0ZXJhdG9yIGl0ID0gbnVsbDsKKwkJaWYgKCBnZXRVc2VyTWF4TG9va2FoZWFkKCk+MCApIHsKKwkJCWl0ID0gc3RhdGVzLml0ZXJhdG9yKCk7CisJCX0KKwkJZWxzZSB7CisJCQlpdCA9IGdldFVuaXF1ZVN0YXRlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCX0KKwkJd2hpbGUgKCBpdC5oYXNOZXh0KCkgKSB7CisJCQlERkFTdGF0ZSBzID0gKERGQVN0YXRlKWl0Lm5leHQoKTsKKwkJCWlmICggcz09bnVsbCApIHsKKwkJCQkvLyBpZ25vcmUgbnVsbCBzdGF0ZXM7IHNvbWUgYWN5bGljIERGQSBzZWUgdGhpcyBjb25kaXRpb24KKwkJCQkvLyB3aGVuIGlubGluaW5nIERGQSAoZHVlIHRvIGxhY2tpbmcgb2YgZXhpdCBicmFuY2ggcHJ1bmluZz8pCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIHMuaXNBY2NlcHRTdGF0ZSgpICkgeworCQkJCS8vIGNhbid0IGNvbXB1dGUgbWluLG1heCxzcGVjaWFsLHRyYW5zaXRpb24gb24gYWNjZXB0cworCQkJCWFjY2VwdC5zZXQocy5zdGF0ZU51bWJlciwKKwkJCQkJCSAgIFV0aWxzLmludGVnZXIocy5nZXRVbmlxdWVseVByZWRpY3RlZEFsdCgpKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQljcmVhdGVNaW5NYXhUYWJsZXMocyk7CisJCQkJY3JlYXRlVHJhbnNpdGlvblRhYmxlRW50cnlGb3JTdGF0ZShzKTsKKwkJCQljcmVhdGVTcGVjaWFsVGFibGUocyk7CisJCQkJY3JlYXRlRU9UQW5kRU9GVGFibGVzKHMpOworCQkJfQorCQl9CisKKwkJLy8gbm93IHRoYXQgd2UgaGF2ZSBjb21wdXRlZCBsaXN0IG9mIHNwZWNpYWxTdGF0ZXMsIGdlbiBjb2RlIGZvciAnZW0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFsU3RhdGVzLnNpemUoKTsgaSsrKSB7CisJCQlERkFTdGF0ZSBzcyA9IChERkFTdGF0ZSkgc3BlY2lhbFN0YXRlcy5nZXQoaSk7CisJCQlTVCBzdGF0ZVNUID0KKwkJCQlnZW5lcmF0b3IuZ2VuZXJhdGVTcGVjaWFsU3RhdGUoc3MpOworCQkJc3BlY2lhbFN0YXRlU1RzLmFkZChzdGF0ZVNUKTsKKwkJfQorCisJCS8vIGNoZWNrIHRoYXQgdGhlIHRhYmxlcyBhcmUgbm90IG1lc3NlZCB1cCBieSBlbmNvZGUvZGVjb2RlCisJCS8qCisJCXRlc3RFbmNvZGVEZWNvZGUobWluKTsKKwkJdGVzdEVuY29kZURlY29kZShtYXgpOworCQl0ZXN0RW5jb2RlRGVjb2RlKGFjY2VwdCk7CisJCXRlc3RFbmNvZGVEZWNvZGUoc3BlY2lhbCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigibWluPSIrbWluKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJtYXg9IittYXgpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oImVvdD0iK2VvdCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiZW9mPSIrZW9mKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQ9IithY2NlcHQpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInNwZWNpYWw9IitzcGVjaWFsKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJ0cmFuc2l0aW9uPSIrdHJhbnNpdGlvbik7CisJCSovCisJfQorCisJLyoKKwlwcml2YXRlIHZvaWQgdGVzdEVuY29kZURlY29kZShMaXN0IGRhdGEpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJkYXRhPSIrZGF0YSk7CisJCUxpc3QgZW5jb2RlZCA9IGdldFJ1bkxlbmd0aEVuY29kaW5nKGRhdGEpOworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWQuc2l6ZSgpOyBpKyspIHsKKwkJCVN0cmluZyBJID0gKFN0cmluZyllbmNvZGVkLmdldChpKTsKKwkJCWludCB2ID0gMDsKKwkJCWlmICggSS5zdGFydHNXaXRoKCJcXHUiKSApIHsKKwkJCQl2ID0gSW50ZWdlci5wYXJzZUludChJLnN1YnN0cmluZygyLEkubGVuZ3RoKCkpLCAxNik7CisJCQl9CisJCQllbHNlIHsKKwkJCQl2ID0gSW50ZWdlci5wYXJzZUludChJLnN1YnN0cmluZygxLEkubGVuZ3RoKCkpLCA4KTsKKwkJCX0KKwkJCWJ1Zi5hcHBlbmQoKGNoYXIpdik7CisJCX0KKwkJU3RyaW5nIGVuY29kZWRTID0gYnVmLnRvU3RyaW5nKCk7CisJCXNob3J0W10gZGVjb2RlZCA9IG9yZy5hbnRsci5ydW50aW1lLkRGQS51bnBhY2tFbmNvZGVkU3RyaW5nKGVuY29kZWRTKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImRlY29kZWQ6Iik7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7IGkrKykgeworCQkJc2hvcnQgeCA9IGRlY29kZWRbaV07CisJCQlpZiAoIHghPSgoSW50ZWdlcilkYXRhLmdldChpKSkuaW50VmFsdWUoKSApIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oInByb2JsZW0gd2l0aCBlbmNvZGluZyIpOworCQkJfQorCQkJLy9TeXN0ZW0ub3V0LnByaW50KCIsICIreCk7CisJCX0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oKTsKKwl9CisJKi8KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1pbk1heFRhYmxlcyhERkFTdGF0ZSBzKSB7CisJCWludCBzbWluID0gTGFiZWwuTUFYX0NIQVJfVkFMVUUgKyAxOworCQlpbnQgc21heCA9IExhYmVsLk1JTl9BVE9NX1ZBTFVFIC0gMTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaisrKSB7CisJCQlUcmFuc2l0aW9uIGVkZ2UgPSAoVHJhbnNpdGlvbikgcy50cmFuc2l0aW9uKGopOworCQkJTGFiZWwgbGFiZWwgPSBlZGdlLmxhYmVsOworCQkJaWYgKCBsYWJlbC5pc0F0b20oKSApIHsKKwkJCQlpZiAoIGxhYmVsLmdldEF0b20oKT49TGFiZWwuTUlOX0NIQVJfVkFMVUUgKSB7CisJCQkJCWlmICggbGFiZWwuZ2V0QXRvbSgpPHNtaW4gKSB7CisJCQkJCQlzbWluID0gbGFiZWwuZ2V0QXRvbSgpOworCQkJCQl9CisJCQkJCWlmICggbGFiZWwuZ2V0QXRvbSgpPnNtYXggKSB7CisJCQkJCQlzbWF4ID0gbGFiZWwuZ2V0QXRvbSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoIGxhYmVsLmlzU2V0KCkgKSB7CisJCQkJSW50ZXJ2YWxTZXQgbGFiZWxzID0gKEludGVydmFsU2V0KWxhYmVsLmdldFNldCgpOworCQkJCWludCBsbWluID0gbGFiZWxzLmdldE1pbkVsZW1lbnQoKTsKKwkJCQkvLyBpZiB2YWxpZCBjaGFyIChkb24ndCBkbyBFT0YpIGFuZCBsZXNzIHRoYW4gY3VycmVudCBtaW4KKwkJCQlpZiAoIGxtaW48c21pbiAmJiBsbWluPj1MYWJlbC5NSU5fQ0hBUl9WQUxVRSApIHsKKwkJCQkJc21pbiA9IGxhYmVscy5nZXRNaW5FbGVtZW50KCk7CisJCQkJfQorCQkJCWlmICggbGFiZWxzLmdldE1heEVsZW1lbnQoKT5zbWF4ICkgeworCQkJCQlzbWF4ID0gbGFiZWxzLmdldE1heEVsZW1lbnQoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIHNtYXg8MCApIHsKKwkJCS8vIG11c3QgYmUgcHJlZGljYXRlcyBvciBwdXJlIEVPVCB0cmFuc2l0aW9uOyBqdXN0IHplcm8gb3V0IG1pbiwgbWF4CisJCQlzbWluID0gTGFiZWwuTUlOX0NIQVJfVkFMVUU7CisJCQlzbWF4ID0gTGFiZWwuTUlOX0NIQVJfVkFMVUU7CisJCX0KKworCQltaW4uc2V0KHMuc3RhdGVOdW1iZXIsIFV0aWxzLmludGVnZXIoKGNoYXIpc21pbikpOworCQltYXguc2V0KHMuc3RhdGVOdW1iZXIsIFV0aWxzLmludGVnZXIoKGNoYXIpc21heCkpOworCisJCWlmICggc21heDwwIHx8IHNtaW4+TGFiZWwuTUFYX0NIQVJfVkFMVUUgfHwgc21pbjwwICkgeworCQkJRXJyb3JNYW5hZ2VyLmludGVybmFsRXJyb3IoIm1lc3NlZCB1cDogbWluPSIrbWluKyIsIG1heD0iK21heCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmFuc2l0aW9uVGFibGVFbnRyeUZvclN0YXRlKERGQVN0YXRlIHMpIHsKKwkJLyoKKwkJU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVUcmFuc2l0aW9uVGFibGVFbnRyeUZvclN0YXRlIHMiK3Muc3RhdGVOdW1iZXIrCisJCQkiIGRlYyAiK3MuZGZhLmRlY2lzaW9uTnVtYmVyKyIgY3ljbGljPSIrcy5kZmEuaXNDeWNsaWMoKSk7CisJCQkqLworCQlpbnQgc21heCA9ICgoSW50ZWdlciltYXguZ2V0KHMuc3RhdGVOdW1iZXIpKS5pbnRWYWx1ZSgpOworCQlpbnQgc21pbiA9ICgoSW50ZWdlciltaW4uZ2V0KHMuc3RhdGVOdW1iZXIpKS5pbnRWYWx1ZSgpOworCisJCVZlY3RvciBzdGF0ZVRyYW5zaXRpb25zID0gbmV3IFZlY3RvcihzbWF4LXNtaW4rMSk7CisJCXN0YXRlVHJhbnNpdGlvbnMuc2V0U2l6ZShzbWF4LXNtaW4rMSk7CisJCXRyYW5zaXRpb24uc2V0KHMuc3RhdGVOdW1iZXIsIHN0YXRlVHJhbnNpdGlvbnMpOworCQlmb3IgKGludCBqID0gMDsgaiA8IHMuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBqKyspIHsKKwkJCVRyYW5zaXRpb24gZWRnZSA9IChUcmFuc2l0aW9uKSBzLnRyYW5zaXRpb24oaik7CisJCQlMYWJlbCBsYWJlbCA9IGVkZ2UubGFiZWw7CisJCQlpZiAoIGxhYmVsLmlzQXRvbSgpICYmIGxhYmVsLmdldEF0b20oKT49TGFiZWwuTUlOX0NIQVJfVkFMVUUgKSB7CisJCQkJaW50IGxhYmVsSW5kZXggPSBsYWJlbC5nZXRBdG9tKCktc21pbjsgLy8gb2Zmc2V0IGZyb20gMAorCQkJCXN0YXRlVHJhbnNpdGlvbnMuc2V0KGxhYmVsSW5kZXgsCisJCQkJCQkJCQkgVXRpbHMuaW50ZWdlcihlZGdlLnRhcmdldC5zdGF0ZU51bWJlcikpOworCQkJfQorCQkJZWxzZSBpZiAoIGxhYmVsLmlzU2V0KCkgKSB7CisJCQkJSW50ZXJ2YWxTZXQgbGFiZWxzID0gKEludGVydmFsU2V0KWxhYmVsLmdldFNldCgpOworCQkJCWludFtdIGF0b21zID0gbGFiZWxzLnRvQXJyYXkoKTsKKwkJCQlmb3IgKGludCBhID0gMDsgYSA8IGF0b21zLmxlbmd0aDsgYSsrKSB7CisJCQkJCS8vIHNldCB0aGUgdHJhbnNpdGlvbiBpZiB0aGUgbGFiZWwgaXMgdmFsaWQgKGRvbid0IGRvIEVPRikKKwkJCQkJaWYgKCBhdG9tc1thXT49TGFiZWwuTUlOX0NIQVJfVkFMVUUgKSB7CisJCQkJCQlpbnQgbGFiZWxJbmRleCA9IGF0b21zW2FdLXNtaW47IC8vIG9mZnNldCBmcm9tIDAKKwkJCQkJCXN0YXRlVHJhbnNpdGlvbnMuc2V0KGxhYmVsSW5kZXgsCisJCQkJCQkJCQkJCSBVdGlscy5pbnRlZ2VyKGVkZ2UudGFyZ2V0LnN0YXRlTnVtYmVyKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gdHJhY2sgdW5pcXVlIHN0YXRlIHRyYW5zaXRpb24gdGFibGVzIHNvIHdlIGNhbiByZXVzZQorCQlJbnRlZ2VyIGVkZ2VDbGFzcyA9IChJbnRlZ2VyKWVkZ2VUcmFuc2l0aW9uQ2xhc3NNYXAuZ2V0KHN0YXRlVHJhbnNpdGlvbnMpOworCQlpZiAoIGVkZ2VDbGFzcyE9bnVsbCApIHsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ3ZSd2ZSBzZWVuIHRoaXMgYXJyYXkgYmVmb3JlOyBzaXplPSIrc3RhdGVUcmFuc2l0aW9ucy5zaXplKCkpOworCQkJdHJhbnNpdGlvbkVkZ2VUYWJsZXMuc2V0KHMuc3RhdGVOdW1iZXIsIGVkZ2VDbGFzcyk7CisJCX0KKwkJZWxzZSB7CisJCQllZGdlQ2xhc3MgPSBVdGlscy5pbnRlZ2VyKGVkZ2VUcmFuc2l0aW9uQ2xhc3MpOworCQkJdHJhbnNpdGlvbkVkZ2VUYWJsZXMuc2V0KHMuc3RhdGVOdW1iZXIsIGVkZ2VDbGFzcyk7CisJCQllZGdlVHJhbnNpdGlvbkNsYXNzTWFwLnB1dChzdGF0ZVRyYW5zaXRpb25zLCBlZGdlQ2xhc3MpOworCQkJZWRnZVRyYW5zaXRpb25DbGFzcysrOworCQl9CisJfQorCisJLyoqIFNldCB1cCB0aGUgRU9UIGFuZCBFT0YgdGFibGVzOyB3ZSBjYW5ub3QgcHV0IC0xIG1pbi9tYXggdmFsdWVzIHNvCisJICogIHdlIG5lZWQgYW5vdGhlciB3YXkgdG8gdGVzdCB0aGF0IGluIHRoZSBERkEgdHJhbnNpdGlvbiBmdW5jdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFT1RBbmRFT0ZUYWJsZXMoREZBU3RhdGUgcykgeworCQlmb3IgKGludCBqID0gMDsgaiA8IHMuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBqKyspIHsKKwkJCVRyYW5zaXRpb24gZWRnZSA9IChUcmFuc2l0aW9uKSBzLnRyYW5zaXRpb24oaik7CisJCQlMYWJlbCBsYWJlbCA9IGVkZ2UubGFiZWw7CisJCQlpZiAoIGxhYmVsLmlzQXRvbSgpICkgeworCQkJCWlmICggbGFiZWwuZ2V0QXRvbSgpPT1MYWJlbC5FT1QgKSB7CisJCQkJCS8vIGVvdFtzXSBwb2ludHMgdG8gYWNjZXB0IHN0YXRlCisJCQkJCWVvdC5zZXQocy5zdGF0ZU51bWJlciwgVXRpbHMuaW50ZWdlcihlZGdlLnRhcmdldC5zdGF0ZU51bWJlcikpOworCQkJCX0KKwkJCQllbHNlIGlmICggbGFiZWwuZ2V0QXRvbSgpPT1MYWJlbC5FT0YgKSB7CisJCQkJCS8vIGVvZltzXSBwb2ludHMgdG8gYWNjZXB0IHN0YXRlCisJCQkJCWVvZi5zZXQocy5zdGF0ZU51bWJlciwgVXRpbHMuaW50ZWdlcihlZGdlLnRhcmdldC5zdGF0ZU51bWJlcikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKCBsYWJlbC5pc1NldCgpICkgeworCQkJCUludGVydmFsU2V0IGxhYmVscyA9IChJbnRlcnZhbFNldClsYWJlbC5nZXRTZXQoKTsKKwkJCQlpbnRbXSBhdG9tcyA9IGxhYmVscy50b0FycmF5KCk7CisJCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBhdG9tcy5sZW5ndGg7IGErKykgeworCQkJCQlpZiAoIGF0b21zW2FdPT1MYWJlbC5FT1QgKSB7CisJCQkJCQkvLyBlb3Rbc10gcG9pbnRzIHRvIGFjY2VwdCBzdGF0ZQorCQkJCQkJZW90LnNldChzLnN0YXRlTnVtYmVyLCBVdGlscy5pbnRlZ2VyKGVkZ2UudGFyZ2V0LnN0YXRlTnVtYmVyKSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoIGF0b21zW2FdPT1MYWJlbC5FT0YgKSB7CisJCQkJCQllb2Yuc2V0KHMuc3RhdGVOdW1iZXIsIFV0aWxzLmludGVnZXIoZWRnZS50YXJnZXQuc3RhdGVOdW1iZXIpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwZWNpYWxUYWJsZShERkFTdGF0ZSBzKSB7CisJCS8vIG51bWJlciBhbGwgc3BlY2lhbCBzdGF0ZXMgZnJvbSAwLi4ubi0xIGluc3RlYWQgb2YgdGhlaXIgdXN1YWwgbnVtYmVycworCQlib29sZWFuIGhhc1NlbVByZWQgPSBmYWxzZTsKKworCQkvLyBUT0RPIHRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gY2FuR2VuZXJhdGVTd2l0Y2guICBSZWZhY3RvciB0byBzaGFyZQorCQlmb3IgKGludCBqID0gMDsgaiA8IHMuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBqKyspIHsKKwkJCVRyYW5zaXRpb24gZWRnZSA9IChUcmFuc2l0aW9uKSBzLnRyYW5zaXRpb24oaik7CisJCQlMYWJlbCBsYWJlbCA9IGVkZ2UubGFiZWw7CisJCQkvLyBjYW4ndCBkbyBhIHN3aXRjaCBpZiB0aGUgZWRnZXMgaGF2ZSBwcmVkcyBvciBhcmUgZ29pbmcgdG8KKwkJCS8vIHJlcXVpcmUgZ2F0ZWQgcHJlZGljYXRlcworCQkJaWYgKCBsYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCkgfHwKKwkJCQkgKChERkFTdGF0ZSllZGdlLnRhcmdldCkuZ2V0R2F0ZWRQcmVkaWNhdGVzSW5ORkFDb25maWd1cmF0aW9ucygpIT1udWxsKQorCQkJeworCQkJCWhhc1NlbVByZWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIGlmIGhhcyBwcmVkIG9yIHRvbyBiaWcgZm9yIHRhYmxlLCBtYWtlIGl0IHNwZWNpYWwKKwkJaW50IHNtYXggPSAoKEludGVnZXIpbWF4LmdldChzLnN0YXRlTnVtYmVyKSkuaW50VmFsdWUoKTsKKwkJaW50IHNtaW4gPSAoKEludGVnZXIpbWluLmdldChzLnN0YXRlTnVtYmVyKSkuaW50VmFsdWUoKTsKKwkJaWYgKCBoYXNTZW1QcmVkIHx8IHNtYXgtc21pbj5NQVhfU1RBVEVfVFJBTlNJVElPTlNfRk9SX1RBQkxFICkgeworCQkJc3BlY2lhbC5zZXQocy5zdGF0ZU51bWJlciwKKwkJCQkJCVV0aWxzLmludGVnZXIodW5pcXVlQ29tcHJlc3NlZFNwZWNpYWxTdGF0ZU51bSkpOworCQkJdW5pcXVlQ29tcHJlc3NlZFNwZWNpYWxTdGF0ZU51bSsrOworCQkJc3BlY2lhbFN0YXRlcy5hZGQocyk7CisJCX0KKwkJZWxzZSB7CisJCQlzcGVjaWFsLnNldChzLnN0YXRlTnVtYmVyLCBVdGlscy5pbnRlZ2VyKC0xKSk7IC8vIG5vdCBzcGVjaWFsCisJCX0KKwl9CisKKwlwdWJsaWMgaW50IHByZWRpY3QoSW50U3RyZWFtIGlucHV0KSB7CisJCUludGVycHJldGVyIGludGVycCA9IG5ldyBJbnRlcnByZXRlcihuZmEuZ3JhbW1hciwgaW5wdXQpOworCQlyZXR1cm4gaW50ZXJwLnByZWRpY3QodGhpcyk7CisJfQorCisJLyoqIEFkZCBhIG5ldyBERkEgc3RhdGUgdG8gdGhpcyBERkEgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KKyAgICAgKiAgVG8gZm9yY2UgYW4gYWN5Y2xpYywgZml4ZWQgbWF4aW11bSBkZXB0aCBERkEsIGp1c3QgYWx3YXlzCisJICogIHJldHVybiB0aGUgaW5jb21pbmcgc3RhdGUuICBCeSBub3QgcmV1c2luZyBvbGQgc3RhdGVzLAorCSAqICBubyBjeWNsZXMgY2FuIGJlIGNyZWF0ZWQuICBJZiB3ZSdyZSBkb2luZyBmaXhlZCBrIGxvb2thaGVhZAorCSAqICBkb24ndCB1cGRhdGVkIHVuaXF1ZVN0YXRlcywganVzdCByZXR1cm4gaW5jb21pbmcgc3RhdGUsIHdoaWNoCisJICogIGluZGljYXRlcyBpdCdzIGEgbmV3IHN0YXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBERkFTdGF0ZSBhZGRTdGF0ZShERkFTdGF0ZSBkKSB7CisJCWlmICggZ2V0VXNlck1heExvb2thaGVhZCgpPjAgKSB7CisJCQlyZXR1cm4gZDsKKwkJfQorCQkvLyBkb2VzIGEgREZBIHN0YXRlIGV4aXN0IGFscmVhZHkgd2l0aCBldmVyeXRoaW5nIHRoZSBzYW1lCisJCS8vIGV4Y2VwdCBpdHMgc3RhdGUgbnVtYmVyPworCQlERkFTdGF0ZSBleGlzdGluZyA9IChERkFTdGF0ZSl1bmlxdWVTdGF0ZXMuZ2V0KGQpOworCQlpZiAoIGV4aXN0aW5nICE9IG51bGwgKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGF0ZSAiK2Quc3RhdGVOdW1iZXIrIiBleGlzdHMgYXMgc3RhdGUgIisKKyAgICAgICAgICAgICAgICBleGlzdGluZy5zdGF0ZU51bWJlcik7CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8vIGFscmVhZHkgdGhlcmUuLi5nZXQgdGhlIGV4aXN0aW5nIERGQSBzdGF0ZQorCQkJcmV0dXJuIGV4aXN0aW5nOworCQl9CisKKwkJLy8gaWYgbm90IHRoZXJlLCB0aGVuIGFkZCBuZXcgc3RhdGUuCisJCXVuaXF1ZVN0YXRlcy5wdXQoZCxkKTsKKyAgICAgICAgbnVtYmVyT2ZTdGF0ZXMrKzsKKwkJcmV0dXJuIGQ7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlU3RhdGUoREZBU3RhdGUgZCkgeworCQlERkFTdGF0ZSBpdCA9IChERkFTdGF0ZSl1bmlxdWVTdGF0ZXMucmVtb3ZlKGQpOworCQlpZiAoIGl0IT1udWxsICkgeworCQkJbnVtYmVyT2ZTdGF0ZXMtLTsKKwkJfQorCX0KKworCXB1YmxpYyBNYXA8REZBU3RhdGUsIERGQVN0YXRlPiBnZXRVbmlxdWVTdGF0ZXMoKSB7CisJCXJldHVybiB1bmlxdWVTdGF0ZXM7CisJfQorCisJLyoqIFdoYXQgaXMgdGhlIG1heCBzdGF0ZSBudW1iZXIgZXZlciBjcmVhdGVkPyAgVGhpcyBtYXkgYmUgYmV5b25kCisJICogIGdldE51bWJlck9mU3RhdGVzKCkuCisJICovCisJcHVibGljIGludCBnZXRNYXhTdGF0ZU51bWJlcigpIHsKKwkJcmV0dXJuIHN0YXRlcy5zaXplKCktMTsKKwl9CisKKwlwdWJsaWMgREZBU3RhdGUgZ2V0U3RhdGUoaW50IHN0YXRlTnVtYmVyKSB7CisJCXJldHVybiAoREZBU3RhdGUpc3RhdGVzLmdldChzdGF0ZU51bWJlcik7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3RhdGUoaW50IHN0YXRlTnVtYmVyLCBERkFTdGF0ZSBkKSB7CisJCXN0YXRlcy5zZXQoc3RhdGVOdW1iZXIsIGQpOworCX0KKworCS8qKiBJcyB0aGUgREZBIHJlZHVjZWQ/ICBJLmUuLCBkb2VzIGV2ZXJ5IHN0YXRlIGhhdmUgYSBwYXRoIHRvIGFuIGFjY2VwdAorICAgICAqICBzdGF0ZT8gIElmIG5vdCwgZG9uJ3QgZGVsZXRlIGFzIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IgaW5kaWNhdGluZworICAgICAqICB3aGljaCBwYXRocyBhcmUgImRlYWQgZW5kcyIuICBBbHNvIHRyYWNrcyBsaXN0IG9mIGFsdHMgd2l0aCBubyBhY2NlcHQKKyAgICAgKiAgc3RhdGUgaW4gdGhlIERGQS4gIE11c3QgY2FsbCB2ZXJpZnkoKSBmaXJzdCBiZWZvcmUgdGhpcyBtYWtlcyBzZW5zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZHVjZWQoKSB7CisgICAgICAgIHJldHVybiByZWR1Y2VkOworICAgIH0KKworICAgIC8qKiBJcyB0aGlzIERGQSBjeWNsaWM/ICBUaGF0IGlzLCBhcmUgdGhlcmUgYW55IGxvb3BzPyAgSWYgbm90LCB0aGVuCisgICAgICogIHRoZSBERkEgaXMgZXNzZW50aWFsbHkgYW4gTEwoaykgcHJlZGljdG9yIGZvciBzb21lIGZpeGVkLCBtYXggayB2YWx1ZS4KKyAgICAgKiAgV2UgY2FuIGJ1aWxkIGEgc2VyaWVzIG9mIG5lc3RlZCBJRiBzdGF0ZW1lbnRzIHRvIG1hdGNoIHRoaXMuICBJbiB0aGUKKyAgICAgKiAgcHJlc2VuY2Ugb2YgY3ljbGVzLCB3ZSBuZWVkIHRvIGJ1aWxkIGEgZ2VuZXJhbCBERkEgYW5kIGludGVycHJldCBpdAorICAgICAqICB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFsdGVybmF0aXZlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0N5Y2xpYygpIHsKKyAgICAgICAgcmV0dXJuIGN5Y2xpYyAmJiBnZXRVc2VyTWF4TG9va2FoZWFkKCk9PTA7CisgICAgfQorCisJcHVibGljIGJvb2xlYW4gaXNDbGFzc2ljREZBKCkgeworCQlyZXR1cm4gIWlzQ3ljbGljKCkgJiYKKwkJCSAgICFuZmEuZ3JhbW1hci5kZWNpc2lvbnNXaG9zZURGQXNVc2VzU2VtUHJlZHMuY29udGFpbnModGhpcykgJiYKKwkJCSAgICFuZmEuZ3JhbW1hci5kZWNpc2lvbnNXaG9zZURGQXNVc2VzU3luUHJlZHMuY29udGFpbnModGhpcyk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuSW5saW5lRGVjaXNpb24oKSB7CisJCXJldHVybiAhaXNDeWNsaWMoKSAmJgorCQkgICAgIXByb2JlLmlzTm9uTExTdGFyRGVjaXNpb24oKSAmJgorCQkJZ2V0TnVtYmVyT2ZTdGF0ZXMoKSA8IENvZGVHZW5lcmF0b3IuTUFYX0FDWUNMSUNfREZBX1NUQVRFU19JTkxJTkU7CisJfQorCisJLyoqIElzIHRoaXMgREZBIGRlcml2ZWQgZnJvbSB0aGUgTkZBIGZvciB0aGUgVG9rZW5zIHJ1bGU/ICovCisJcHVibGljIGJvb2xlYW4gaXNUb2tlbnNSdWxlRGVjaXNpb24oKSB7CisJCWlmICggbmZhLmdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlORkFTdGF0ZSBuZmFTdGFydCA9IGdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpOworCQlSdWxlIHIgPSBuZmEuZ3JhbW1hci5nZXRMb2NhbGx5RGVmaW5lZFJ1bGUoR3JhbW1hci5BUlRJRklDSUFMX1RPS0VOU19SVUxFTkFNRSk7CisJCU5GQVN0YXRlIFRva2Vuc1J1bGVTdGFydCA9IHIuc3RhcnRTdGF0ZTsKKwkJTkZBU3RhdGUgVG9rZW5zRGVjaXNpb25TdGFydCA9CisJCQkoTkZBU3RhdGUpVG9rZW5zUnVsZVN0YXJ0LnRyYW5zaXRpb25bMF0udGFyZ2V0OworCQlyZXR1cm4gbmZhU3RhcnQgPT0gVG9rZW5zRGVjaXNpb25TdGFydDsKKwl9CisKKwkvKiogVGhlIHVzZXIgbWF5IHNwZWNpZnkgYSBtYXgsIGFjeWNsaWMgbG9va2FoZWFkIGZvciBhbnkgZGVjaXNpb24uICBObworCSAqICBERkEgY3ljbGVzIGFyZSBjcmVhdGVkIHdoZW4gdGhpcyB2YWx1ZSwgaywgaXMgZ3JlYXRlciB0aGFuIDAuCisJICogIElmIHRoaXMgZGVjaXNpb24gaGFzIG5vIGsgbG9va2FoZWFkIHNwZWNpZmllZCwgdGhlbiB0cnkgdGhlIGdyYW1tYXIuCisJICovCisJcHVibGljIGludCBnZXRVc2VyTWF4TG9va2FoZWFkKCkgeworCQlpZiAoIHVzZXJfaz49MCApIHsgLy8gY2FjaGUgZm9yIHNwZWVkCisJCQlyZXR1cm4gdXNlcl9rOworCQl9CisJCXVzZXJfayA9IG5mYS5ncmFtbWFyLmdldFVzZXJNYXhMb29rYWhlYWQoZGVjaXNpb25OdW1iZXIpOworCQlyZXR1cm4gdXNlcl9rOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldEF1dG9CYWNrdHJhY2tNb2RlKCkgeworCQlyZXR1cm4gbmZhLmdyYW1tYXIuZ2V0QXV0b0JhY2t0cmFja01vZGUoZGVjaXNpb25OdW1iZXIpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFVzZXJNYXhMb29rYWhlYWQoaW50IGspIHsKKwkJdGhpcy51c2VyX2sgPSBrOworCX0KKworCS8qKiBSZXR1cm4gayBpZiBkZWNpc2lvbiBpcyBMTChrKSBmb3Igc29tZSBrIGVsc2UgcmV0dXJuIG1heCBpbnQKKyAgICAgKi8KKwlwdWJsaWMgaW50IGdldE1heExvb2thaGVhZERlcHRoKCkgeworCQlpZiAoIGhhc0N5Y2xlKCkgKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisJCS8vIGNvbXB1dGUgdG8gYmUgc3VyZQorCQlyZXR1cm4gX2dldE1heExvb2thaGVhZERlcHRoKHN0YXJ0U3RhdGUsIDApOworCX0KKworCWludCBfZ2V0TWF4TG9va2FoZWFkRGVwdGgoREZBU3RhdGUgZCwgaW50IGRlcHRoKSB7CisJCS8vIG5vdCBjeWNsaWM7IGRvbid0IHdvcnJ5IGFib3V0IHRlcm1pbmF0aW9uCisJCS8vIGZhaWwgaWYgcHJlZCBlZGdlLgorCQlpbnQgbWF4ID0gZGVwdGg7CisJCWZvciAoaW50IGk9MDsgaTxkLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIHQgPSBkLnRyYW5zaXRpb24oaSk7CisvLwkJCWlmICggdC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisJCQlpZiAoICF0LmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCQkvLyBpZiBwdXJlIHByZWQgbm90IGdhdGVkLCBpdCBtdXN0IHRhcmdldCBzdG9wIHN0YXRlOyBkb24ndCBjb3VudAorCQkJCURGQVN0YXRlIGVkZ2VUYXJnZXQgPSAoREZBU3RhdGUpdC50YXJnZXQ7CisJCQkJaW50IG0gPSBfZ2V0TWF4TG9va2FoZWFkRGVwdGgoZWRnZVRhcmdldCwgZGVwdGgrMSk7CisJCQkJbWF4ID0gTWF0aC5tYXgobWF4LCBtKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbWF4OworCX0KKworCS8qKiBDb3VudCBhbGwgZGlzYW1iaWd1YXRpbmcgc3luIHByZWRzIChpZ25vcmUgc3lucHJlZCB0ZXN0cworCSAqICBmb3IgZ2F0ZWQgZWRnZXMsIHdoaWNoIG9jY3VyIGZvciBub25hbWJpZyBpbnB1dCBzZXF1ZW5jZXMpLgorCSAqICBFLmcuLAorCSAqICB4ICA6IChYKT0+IChYfFkpXG4iICsKKwkgKiAgICAgfCBYXG4iICsKKwkgKiAgICAgOworCSAqCisJICogIGdpdmVzCisJICogCisJICogLnMwLVgtPi5zMQorCSAqIC5zMC1ZJiZ7c3lucHJlZDFfdH0/LT46czI9PjEKKwkgKiAuczEte3N5bnByZWQxX3R9Py0+OnMyPT4xCisJICogLnMxLXt0cnVlfT8tPjpzMz0+MgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1N5blByZWQoKSB7CisJCWJvb2xlYW4gaGFzID0gX2hhc1N5blByZWQoc3RhcnRTdGF0ZSwgbmV3IEhhc2hTZXQ8REZBU3RhdGU+KCkpOworLy8JCWlmICggIWhhcyApIHsKKy8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBzeW5wcmVkIGluIGRlYyAiK2RlY2lzaW9uTnVtYmVyKTsKKy8vCQkJRkFTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRkFTZXJpYWxpemVyKG5mYS5ncmFtbWFyKTsKKy8vCQkJU3RyaW5nIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHN0YXJ0U3RhdGUpOworLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKKy8vCQl9CisJCXJldHVybiBoYXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gZ2V0SGFzU3luUHJlZCgpIHsgcmV0dXJuIGhhc1N5blByZWQoKTsgfSAvLyBmb3IgU1QJCisKKwlib29sZWFuIF9oYXNTeW5QcmVkKERGQVN0YXRlIGQsIFNldDxERkFTdGF0ZT4gYnVzeSkgeworCQlidXN5LmFkZChkKTsKKwkJZm9yIChpbnQgaT0wOyBpPGQuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBpKyspIHsKKwkJCVRyYW5zaXRpb24gdCA9IGQudHJhbnNpdGlvbihpKTsKKwkJCWlmICggdC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQkJU2VtYW50aWNDb250ZXh0IGN0eCA9IHQubGFiZWwuZ2V0U2VtYW50aWNDb250ZXh0KCk7CisvLwkJCQlpZiAoIGN0eC50b1N0cmluZygpLmluZGV4T2YoInN5bnByZWQiKT49MCApIHsKKy8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImhhcyBwcmVkICIrY3R4LnRvU3RyaW5nKCkrIiAiK2N0eC5pc1N5bnRhY3RpY1ByZWRpY2F0ZSgpKTsKKy8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKChTZW1hbnRpY0NvbnRleHQuUHJlZGljYXRlKWN0eCkucHJlZGljYXRlQVNULnRva2VuKTsKKy8vCQkJCX0KKwkJCQlpZiAoIGN0eC5pc1N5bnRhY3RpY1ByZWRpY2F0ZSgpICkgcmV0dXJuIHRydWU7CisJCQl9CisJCQlERkFTdGF0ZSBlZGdlVGFyZ2V0ID0gKERGQVN0YXRlKXQudGFyZ2V0OworCQkJaWYgKCAhYnVzeS5jb250YWlucyhlZGdlVGFyZ2V0KSAmJiBfaGFzU3luUHJlZChlZGdlVGFyZ2V0LCBidXN5KSApIHJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1NlbVByZWQoKSB7IC8vIGhhcyB1c2VyLWRlZmluZWQgc2VtcHJlZAorCQlib29sZWFuIGhhcyA9IF9oYXNTZW1QcmVkKHN0YXJ0U3RhdGUsIG5ldyBIYXNoU2V0PERGQVN0YXRlPigpKTsKKwkJcmV0dXJuIGhhczsKKwl9CisKKwlib29sZWFuIF9oYXNTZW1QcmVkKERGQVN0YXRlIGQsIFNldDxERkFTdGF0ZT4gYnVzeSkgeworCQlidXN5LmFkZChkKTsKKwkJZm9yIChpbnQgaT0wOyBpPGQuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBpKyspIHsKKwkJCVRyYW5zaXRpb24gdCA9IGQudHJhbnNpdGlvbihpKTsKKwkJCWlmICggdC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQkJU2VtYW50aWNDb250ZXh0IGN0eCA9IHQubGFiZWwuZ2V0U2VtYW50aWNDb250ZXh0KCk7CisJCQkJaWYgKCBjdHguaGFzVXNlclNlbWFudGljUHJlZGljYXRlKCkgKSByZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCURGQVN0YXRlIGVkZ2VUYXJnZXQgPSAoREZBU3RhdGUpdC50YXJnZXQ7CisJCQlpZiAoICFidXN5LmNvbnRhaW5zKGVkZ2VUYXJnZXQpICYmIF9oYXNTZW1QcmVkKGVkZ2VUYXJnZXQsIGJ1c3kpICkgcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqIENvbXB1dGUgY3ljbGljIHcvbyByZWx5aW5nIG9uIHN0YXRlIGNvbXB1dGVkIGR1cmluZyBhbmFseXNpcy4ganVzdCBjaGVjay4gKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNDeWNsZSgpIHsKKwkJYm9vbGVhbiBjeWNsaWMgPSBfaGFzQ3ljbGUoc3RhcnRTdGF0ZSwgbmV3IEhhc2hNYXA8REZBU3RhdGUsIEludGVnZXI+KCkpOworCQlyZXR1cm4gY3ljbGljOworCX0KKworCWJvb2xlYW4gX2hhc0N5Y2xlKERGQVN0YXRlIGQsIE1hcDxERkFTdGF0ZSwgSW50ZWdlcj4gYnVzeSkgeworCQlidXN5LnB1dChkLCBDWUNMSUNfQlVTWSk7CisJCWZvciAoaW50IGk9MDsgaTxkLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIHQgPSBkLnRyYW5zaXRpb24oaSk7CisJCQlERkFTdGF0ZSB0YXJnZXQgPSAoREZBU3RhdGUpdC50YXJnZXQ7CisJCQlpbnQgY29uZCA9IENZQ0xJQ19VTktOT1dOOworCQkJaWYgKCBidXN5LmdldCh0YXJnZXQpIT1udWxsICkgY29uZCA9IGJ1c3kuZ2V0KHRhcmdldCk7CisJCQlpZiAoIGNvbmQ9PUNZQ0xJQ19CVVNZICkgcmV0dXJuIHRydWU7CisJCQlpZiAoIGNvbmQhPUNZQ0xJQ19ET05FICYmIF9oYXNDeWNsZSh0YXJnZXQsIGJ1c3kpICkgcmV0dXJuIHRydWU7CisJCX0KKwkJYnVzeS5wdXQoZCwgQ1lDTElDX0RPTkUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisKKyAgICAvKiogUmV0dXJuIGEgbGlzdCBvZiBJbnRlZ2VyIGFsdCBudW1iZXJzIGZvciB3aGljaCBubyBsb29rYWhlYWQgY291bGQKKyAgICAgKiAgYmUgY29tcHV0ZWQgb3IgZm9yIHdoaWNoIG5vIHNpbmdsZSBERkEgYWNjZXB0IHN0YXRlIHByZWRpY3RzIHRob3NlCisgICAgICogIGFsdHMuICBNdXN0IGNhbGwgdmVyaWZ5KCkgZmlyc3QgYmVmb3JlIHRoaXMgbWFrZXMgc2Vuc2UuCisgICAgICovCisgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0VW5yZWFjaGFibGVBbHRzKCkgeworICAgICAgICByZXR1cm4gdW5yZWFjaGFibGVBbHRzOworICAgIH0KKworCS8qKiBPbmNlIHRoaXMgREZBIGhhcyBiZWVuIGJ1aWx0LCBuZWVkIHRvIHZlcmlmeSB0aGF0OgorCSAqCisJICogIDEuIGl0J3MgcmVkdWNlZAorCSAqICAyLiBhbGwgYWx0cyBoYXZlIGFuIGFjY2VwdCBzdGF0ZQorCSAqCisJICogIEVsc2V3aGVyZSwgaW4gdGhlIE5GQSBjb252ZXJ0ZXIsIHdlIG5lZWQgdG8gdmVyaWZ5IHRoYXQ6CisJICoKKwkgKiAgMy4gYWx0cyBpIGFuZCBqIGhhdmUgZGlzam9pbnQgbG9va2FoZWFkIGlmIG5vIHNlbSBwcmVkcworCSAqICA0LiBpZiBzZW0gcHJlZHMsIG5vbmRldGVybWluaXN0aWMgYWx0cyBtdXN0IGJlIHN1ZmZpY2llbnRseSBjb3ZlcmVkCisJICoKKwkgKiAgVGhpcyBpcyBhdm9pZGVkIGlmIGFuYWx5c2lzIGJhaWxzIG91dCBmb3IgYW55IHJlYXNvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisJCWRvZXNTdGF0ZVJlYWNoQWNjZXB0U3RhdGUoc3RhcnRTdGF0ZSk7CisJfQorCisgICAgLyoqIGZpZ3VyZSBvdXQgaWYgdGhpcyBzdGF0ZSBldmVudHVhbGx5IHJlYWNoZXMgYW4gYWNjZXB0IHN0YXRlIGFuZAorICAgICAqICBtb2RpZnkgdGhlIGluc3RhbmNlIHZhcmlhYmxlICdyZWR1Y2VkJyB0byBpbmRpY2F0ZSBpZiB3ZSBmaW5kCisgICAgICogIGF0IGxlYXN0IG9uZSBzdGF0ZSB0aGF0IGNhbm5vdCByZWFjaCBhbiBhY2NlcHQgc3RhdGUuICBUaGlzIGltcGxpZXMKKyAgICAgKiAgdGhhdCB0aGUgb3ZlcmFsbCBERkEgaXMgbm90IHJlZHVjZWQuICBUaGlzIGFsZ29yaXRobSBzaG91bGQgYmUKKyAgICAgKiAgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgREZBIHN0YXRlcy4KKyAgICAgKgorICAgICAqICBUaGUgYWxnb3JpdGhtIGFsc28gdHJhY2tzIHdoaWNoIGFsdGVybmF0aXZlcyBoYXZlIG5vIGFjY2VwdCBzdGF0ZSwKKyAgICAgKiAgaW5kaWNhdGluZyBhIG5vbmRldGVybWluaXNtLgorCSAqCisJICogIEFsc28gY29tcHV0ZXMgd2hldGhlciB0aGUgREZBIGlzIGN5Y2xpYy4KKwkgKgorICAgICAqICBUT0RPOiBJIGNhbGwgZ2V0VW5pcXVlbHlQcmVkaWNhdGVkQWx0IHRvbyBtdWNoOyBjYWNoZSBwcmVkaWN0ZWQgYWx0CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9lc1N0YXRlUmVhY2hBY2NlcHRTdGF0ZShERkFTdGF0ZSBkKSB7CisJCWlmICggZC5pc0FjY2VwdFN0YXRlKCkgKSB7CisgICAgICAgICAgICAvLyBhY2NlcHQgc3RhdGVzIGhhdmUgbm8gZWRnZXMgZW1hbmF0aW5nIGZyb20gdGhlbSBzbyB3ZSBjYW4gcmV0dXJuCisgICAgICAgICAgICBkLnNldEFjY2VwdFN0YXRlUmVhY2hhYmxlKFJFQUNIQUJMRV9ZRVMpOworICAgICAgICAgICAgLy8gdGhpcyBhbHQgaXMgdW5pcXVlbHkgcHJlZGljdGVkLCByZW1vdmUgZnJvbSBub25kZXRlcm1pbmlzdGljIGxpc3QKKyAgICAgICAgICAgIGludCBwcmVkaWN0cyA9IGQuZ2V0VW5pcXVlbHlQcmVkaWN0ZWRBbHQoKTsKKyAgICAgICAgICAgIHVucmVhY2hhYmxlQWx0cy5yZW1vdmUoVXRpbHMuaW50ZWdlcihwcmVkaWN0cykpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdm9pZCBpbmZpbml0ZSBsb29wcworICAgICAgICBkLnNldEFjY2VwdFN0YXRlUmVhY2hhYmxlKFJFQUNIQUJMRV9CVVNZKTsKKworICAgICAgICBib29sZWFuIGFuRWRnZVJlYWNoZXNBY2NlcHRTdGF0ZSA9IGZhbHNlOworICAgICAgICAvLyBWaXNpdCBldmVyeSB0cmFuc2l0aW9uLCB0cmFjayBpZiBhdCBsZWFzdCBvbmUgZWRnZSByZWFjaGVzIHN0b3Agc3RhdGUKKwkJLy8gQ2Fubm90IHRlcm1pbmF0ZSB3aGVuIHdlIGtub3cgdGhpcyBzdGF0ZSByZWFjaGVzIHN0b3Agc3RhdGUgc2luY2UKKwkJLy8gYWxsIHRyYW5zaXRpb25zIG11c3QgYmUgdHJhdmVyc2VkIHRvIHNldCBzdGF0dXMgb2YgZWFjaCBERkEgc3RhdGUuCisJCWZvciAoaW50IGk9MDsgaTxkLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisgICAgICAgICAgICBUcmFuc2l0aW9uIHQgPSBkLnRyYW5zaXRpb24oaSk7CisgICAgICAgICAgICBERkFTdGF0ZSBlZGdlVGFyZ2V0ID0gKERGQVN0YXRlKXQudGFyZ2V0OworICAgICAgICAgICAgaW50IHRhcmdldFN0YXR1cyA9IGVkZ2VUYXJnZXQuZ2V0QWNjZXB0U3RhdGVSZWFjaGFibGUoKTsKKyAgICAgICAgICAgIGlmICggdGFyZ2V0U3RhdHVzPT1SRUFDSEFCTEVfQlVTWSApIHsgLy8gYXZvaWQgY3ljbGVzOyB0aGV5IHNheSBub3RoaW5nCisgICAgICAgICAgICAgICAgY3ljbGljID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdGFyZ2V0U3RhdHVzPT1SRUFDSEFCTEVfWUVTICkgeyAvLyBhdm9pZCB1bm5lY2Vzc2FyeSB3b3JrCisgICAgICAgICAgICAgICAgYW5FZGdlUmVhY2hlc0FjY2VwdFN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdGFyZ2V0U3RhdHVzPT1SRUFDSEFCTEVfTk8gKSB7ICAvLyBhdm9pZCB1bm5lY2Vzc2FyeSB3b3JrCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisJCQkvLyB0YXJnZXQgbXVzdCBiZSBSRUFDSEFCTEVfVU5LTk9XTiAoaS5lLiwgdW52aXNpdGVkKQorICAgICAgICAgICAgaWYgKCBkb2VzU3RhdGVSZWFjaEFjY2VwdFN0YXRlKGVkZ2VUYXJnZXQpICkgeworICAgICAgICAgICAgICAgIGFuRWRnZVJlYWNoZXNBY2NlcHRTdGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBrZWVwIGxvb2tpbmcgc28gZG9uJ3QgYnJlYWsgbG9vcAorICAgICAgICAgICAgICAgIC8vIG11c3QgY292ZXIgYWxsIHN0YXRlcyBldmVuIGlmIHdlIGZpbmQgYSBwYXRoIGZvciB0aGlzIHN0YXRlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhbkVkZ2VSZWFjaGVzQWNjZXB0U3RhdGUgKSB7CisgICAgICAgICAgICBkLnNldEFjY2VwdFN0YXRlUmVhY2hhYmxlKFJFQUNIQUJMRV9ZRVMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZC5zZXRBY2NlcHRTdGF0ZVJlYWNoYWJsZShSRUFDSEFCTEVfTk8pOworCQkJcmVkdWNlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbkVkZ2VSZWFjaGVzQWNjZXB0U3RhdGU7CisgICAgfQorCisJLyoqIFdhbGsgYWxsIGFjY2VwdCBzdGF0ZXMgYW5kIGZpbmQgdGhlIG1hbnVhbGx5LXNwZWNpZmllZCBzeW5wcmVkcy4KKwkgKiAgR2F0ZWQgcHJlZHMgYXJlIG5vdCBhbHdheXMgaG9pc3RlZAorCSAqICBJIHVzZWQgdG8gZG8gdGhpcyBpbiB0aGUgY29kZSBnZW5lcmF0b3IsIGJ1dCB0aGF0IGlzIHRvbyBsYXRlLgorCSAqICBUaGlzIGNvbnZlcnRlciB0cmllcyB0byBhdm9pZCBjb21wdXRpbmcgREZBIGZvciBkZWNpc2lvbnMgaW4KKwkgKiAgc3ludGFjdGljIHByZWRpY2F0ZXMgdGhhdCBhcmUgbm90IGV2ZXIgdXNlZCBzdWNoIGFzIHRob3NlCisJICogIGNyZWF0ZWQgYnkgYXV0b2JhY2t0cmFjayBtb2RlLgorCSAqLworCXB1YmxpYyB2b2lkIGZpbmRBbGxHYXRlZFN5blByZWRzVXNlZEluREZBQWNjZXB0U3RhdGVzKCkgeworCQlpbnQgbkFsdHMgPSBnZXROdW1iZXJPZkFsdHMoKTsKKwkJZm9yIChpbnQgaT0xOyBpPD1uQWx0czsgaSsrKSB7CisJCQlERkFTdGF0ZSBhID0gZ2V0QWNjZXB0U3RhdGUoaSk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWx0ICIraSsiOiAiK2EpOworCQkJaWYgKCBhIT1udWxsICkgeworCQkJCVNldCBzeW5wcmVkcyA9IGEuZ2V0R2F0ZWRTeW50YWN0aWNQcmVkaWNhdGVzSW5ORkFDb25maWd1cmF0aW9ucygpOworCQkJCWlmICggc3lucHJlZHMhPW51bGwgKSB7CisJCQkJCS8vIGFkZCBhbGwgdGhlIHByZWRpY2F0ZXMgd2UgZmluZCAoc2hvdWxkIGJlIGp1c3Qgb25lLCByaWdodD8pCisJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzeW5wcmVkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQkJCQlTZW1hbnRpY0NvbnRleHQgc2VtY3R4ID0gKFNlbWFudGljQ29udGV4dCkgaXQubmV4dCgpOworCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeW5wcmVkczogIitzZW1jdHgpOworCQkJCQkJbmZhLmdyYW1tYXIuc3luUHJlZFVzZWRJbkRGQSh0aGlzLCBzZW1jdHgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIE5GQVN0YXRlIGdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlY2lzaW9uTkZBU3RhcnRTdGF0ZTsKKyAgICB9CisKKwlwdWJsaWMgREZBU3RhdGUgZ2V0QWNjZXB0U3RhdGUoaW50IGFsdCkgeworCQlyZXR1cm4gYWx0VG9BY2NlcHRTdGF0ZVthbHRdOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjY2VwdFN0YXRlKGludCBhbHQsIERGQVN0YXRlIGFjY2VwdFN0YXRlKSB7CisJCWFsdFRvQWNjZXB0U3RhdGVbYWx0XSA9IGFjY2VwdFN0YXRlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwlwdWJsaWMgaW50IGdldERlY2lzaW9uTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gZGVjaXNpb25ORkFTdGFydFN0YXRlLmdldERlY2lzaW9uTnVtYmVyKCk7CisgICAgfQorCisJLyoqIElmIHRoaXMgREZBIGZhaWxlZCB0byBmaW5pc2ggZHVyaW5nIGNvbnN0cnVjdGlvbiwgd2UgbWlnaHQgYmUKKwkgKiAgYWJsZSB0byByZXRyeSB3aXRoIGs9MSBidXQgd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgaXQgd2lsbAorCSAqICBwb3RlbnRpYWxseSBzdWNjZWVkLiAgQ2FuIG9ubHkgc3VjY2VlZCBpZiB0aGVyZSBpcyBhIHByZWRpY2F0ZQorCSAqICB0byByZXNvbHZlIHRoZSBpc3N1ZS4gIERvbid0IHRyeSBpZiBrPTEgYWxyZWFkeSBhcyBpdCB3b3VsZAorCSAqICBjeWNsZSBmb3JldmVyLiAgVGltZW91dCBjYW4gcmV0cnkgd2l0aCBrPTEgZXZlbiBpZiBubyBwcmVkaWNhdGUKKwkgKiAgaWYgayE9MS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBva1RvUmV0cnlERkFXaXRoSzEoKSB7CisJCWJvb2xlYW4gbm9uTExTdGFyT3JPdmVyZmxvd0FuZFByZWRpY2F0ZVZpc2libGUgPQorCQkJKHByb2JlLmlzTm9uTExTdGFyRGVjaXNpb24oKXx8cHJvYmUuYW5hbHlzaXNPdmVyZmxvd2VkKCkpICYmCisJCSAgICBwcmVkaWNhdGVWaXNpYmxlOyAvLyBhdXRvIGJhY2t0cmFjayBvciBtYW51YWwgc2VtL3N5bgorCQlyZXR1cm4gZ2V0VXNlck1heExvb2thaGVhZCgpIT0xICYmCisJCQkgbm9uTExTdGFyT3JPdmVyZmxvd0FuZFByZWRpY2F0ZVZpc2libGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSZWFzb25Gb3JGYWlsdXJlKCkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpZiAoIHByb2JlLmlzTm9uTExTdGFyRGVjaXNpb24oKSApIHsKKwkJCWJ1Zi5hcHBlbmQoIm5vbi1MTCgqKSIpOworCQkJaWYgKCBwcmVkaWNhdGVWaXNpYmxlICkgeworCQkJCWJ1Zi5hcHBlbmQoIiAmJiBwcmVkaWNhdGUgdmlzaWJsZSIpOworCQkJfQorCQl9CisJCWlmICggcHJvYmUuYW5hbHlzaXNPdmVyZmxvd2VkKCkgKSB7CisJCQlidWYuYXBwZW5kKCJyZWN1cnNpb24gb3ZlcmZsb3ciKTsKKwkJCWlmICggcHJlZGljYXRlVmlzaWJsZSApIHsKKwkJCQlidWYuYXBwZW5kKCIgJiYgcHJlZGljYXRlIHZpc2libGUiKTsKKwkJCX0KKwkJfQorCQlidWYuYXBwZW5kKCJcbiIpOworCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJLyoqIFdoYXQgR3JhbW1hckFTVCBub2RlIChkZXJpdmVkIGZyb20gdGhlIGdyYW1tYXIpIGlzIHRoaXMgREZBCisgICAgICogIGFzc29jaWF0ZWQgd2l0aD8gIEl0IHdpbGwgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGEgYmxvY2sgb3IKKyAgICAgKiAgdGhlIGxvb3AgYmFjayBvZiBhICguLi4pKyBibG9jayBldGMuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3JhbW1hckFTVCBnZXREZWNpc2lvbkFTVE5vZGUoKSB7CisgICAgICAgIHJldHVybiBkZWNpc2lvbk5GQVN0YXJ0U3RhdGUuYXNzb2NpYXRlZEFTVE5vZGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNHcmVlZHkoKSB7CisJCUdyYW1tYXJBU1QgYmxvY2tBU1QgPSBuZmEuZ3JhbW1hci5nZXREZWNpc2lvbkJsb2NrQVNUKGRlY2lzaW9uTnVtYmVyKTsKKwkJT2JqZWN0IHYgPSBuZmEuZ3JhbW1hci5nZXRCbG9ja09wdGlvbihibG9ja0FTVCwiZ3JlZWR5Iik7CisJCWlmICggdiE9bnVsbCAmJiB2LmVxdWFscygiZmFsc2UiKSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworCX0KKworICAgIHB1YmxpYyBERkFTdGF0ZSBuZXdTdGF0ZSgpIHsKKyAgICAgICAgREZBU3RhdGUgbiA9IG5ldyBERkFTdGF0ZSh0aGlzKTsKKyAgICAgICAgbi5zdGF0ZU51bWJlciA9IHN0YXRlQ291bnRlcjsKKyAgICAgICAgc3RhdGVDb3VudGVyKys7CisJCXN0YXRlcy5zZXRTaXplKG4uc3RhdGVOdW1iZXIrMSk7CisJCXN0YXRlcy5zZXQobi5zdGF0ZU51bWJlciwgbik7IC8vIHRyYWNrIHN0YXRlIG51bSB0byBzdGF0ZQorICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKwlwdWJsaWMgaW50IGdldE51bWJlck9mU3RhdGVzKCkgeworCQlpZiAoIGdldFVzZXJNYXhMb29rYWhlYWQoKT4wICkgeworCQkJLy8gaWYgdXNpbmcgZml4ZWQgbG9va2FoZWFkIHRoZW4gdW5pcXVlU2V0cyBub3Qgc2V0CisJCQlyZXR1cm4gc3RhdGVzLnNpemUoKTsKKwkJfQorCQlyZXR1cm4gbnVtYmVyT2ZTdGF0ZXM7CisJfQorCisJcHVibGljIGludCBnZXROdW1iZXJPZkFsdHMoKSB7CisJCXJldHVybiBuQWx0czsKKwl9CisKKy8vCXB1YmxpYyBib29sZWFuIGFuYWx5c2lzVGltZWRPdXQoKSB7CisvLwkJcmV0dXJuIHByb2JlLmFuYWx5c2lzVGltZWRPdXQoKTsKKy8vCX0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXRBbHRSZWxhdGVkSW5mbygpIHsKKyAgICAgICAgdW5yZWFjaGFibGVBbHRzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbkFsdHM7IGkrKykgeworICAgICAgICAgICAgdW5yZWFjaGFibGVBbHRzLmFkZChVdGlscy5pbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorCQlhbHRUb0FjY2VwdFN0YXRlID0gbmV3IERGQVN0YXRlW25BbHRzKzFdOworICAgIH0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCUZBU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEZBU2VyaWFsaXplcihuZmEuZ3JhbW1hcik7CisJCWlmICggc3RhcnRTdGF0ZT09bnVsbCApIHsKKwkJCXJldHVybiAiIjsKKwkJfQorCQlyZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoc3RhcnRTdGF0ZSwgZmFsc2UpOworCX0KKworCS8qKiBFT1QgKGVuZCBvZiB0b2tlbikgaXMgYSBsYWJlbCB0aGF0IGluZGljYXRlcyB3aGVuIHRoZSBERkEgY29udmVyc2lvbgorCSAqICBhbGdvcml0aG0gd291bGQgImZhbGwgb2ZmIHRoZSBlbmQgb2YgYSBsZXhlciBydWxlIi4gIEl0IG5vcm1hbGx5CisJICogIG1lYW5zIHRoZSBkZWZhdWx0IGNsYXVzZS4gIFNvIGZvciAoJ2EnLi4neicpKyB5b3Ugd291bGQgc2VlIGEgREZBCisJICogIHdpdGggYSBzdGF0ZSB0aGF0IGhhcyBhLi56IGFuZCBFT1QgZW1hbmF0aW5nIGZyb20gaXQuICBhLi56IHdvdWxkCisJICogIGp1bXAgdG8gYSBzdGF0ZSBwcmVkaWN0aW5nIGFsdCAxIGFuZCBFT1Qgd291bGQganVtcCB0byBhIHN0YXRlCisJICogIHByZWRpY3RpbmcgYWx0IDIgKHRoZSBleGl0IGxvb3AgYnJhbmNoKS4gIEVPVCBpbXBsaWVzIGFueXRoaW5nIG90aGVyCisJICogIHRoYW4gYS4uei4gIElmIGZvciBzb21lIHJlYXNvbiwgdGhlIHNldCBpcyAiYWxsIGNoYXIiIHN1Y2ggYXMgd2l0aAorCSAqICB0aGUgd2lsZGNhcmQgJy4nLCB0aGVuIEVPVCBjYW5ub3QgbWF0Y2ggYW55dGhpbmcuICBGb3IgZXhhbXBsZSwKKwkgKgorCSAqICAgICBCTE9DSyA6ICd7JyAoLikqICd9JworCSAqCisJICogIGNvbnN1bWVzIGFsbCBjaGFyIHVudGlsIEVPRiB3aGVuIGdyZWVkeT10cnVlLiAgV2hlbiBhbGwgZWRnZXMgYXJlCisJICogIGNvbWJpbmVkIGZvciB0aGUgREZBIHN0YXRlIGFmdGVyIG1hdGNoaW5nICd9JywgeW91IHdpbGwgZmluZCB0aGF0CisJICogIGl0IGlzIGFsbCBjaGFyLiAgVGhlIEVPVCB0cmFuc2l0aW9uIGhhcyBub3RoaW5nIHRvIG1hdGNoIGFuZCBpcworCSAqICB1bnJlYWNoYWJsZS4gIFRoZSBmaW5kTmV3REZBU3RhdGVzQW5kQWRkREZBVHJhbnNpdGlvbnMoKSBtZXRob2QKKwkgKiAgbXVzdCBrbm93IHRvIGlnbm9yZSB0aGUgRU9ULCBzbyB3ZSBzaW1wbHkgcmVtb3ZlIGl0IGZyb20gdGhlCisJICogIHJlYWNoYWJsZSBsYWJlbHMuICBMYXRlciBhbmFseXNpcyB3aWxsIGZpbmQgdGhhdCB0aGUgZXhpdCBicmFuY2gKKwkgKiAgaXMgbm90IHByZWRpY3RlZCBieSBhbnl0aGluZy4gIEZvciBncmVlZHk9ZmFsc2UsIHdlIGxlYXZlIG9ubHkKKwkgKiAgdGhlIEVPVCBsYWJlbCBpbmRpY2F0aW5nIHRoYXQgdGhlIERGQSBzaG91bGQgc3RvcCBpbW1lZGlhdGVseQorCSAqICBhbmQgcHJlZGljdCB0aGUgZXhpdCBicmFuY2guIFRoZSByZWFjaGFibGUgbGFiZWxzIGFyZSBvZnRlbiBhCisJICogIHNldCBvZiBkaXNqb2ludCB2YWx1ZXMgbGlrZTogWzxFT1Q+LCA0MiwgezAuLjQxLCA0My4uNjU1MzR9XQorCSAqICBkdWUgdG8gREZBIGNvbnZlcnNpb24gc28gbXVzdCBjb25zdHJ1Y3QgYSBwdXJlIHNldCB0byBzZWUgaWYKKwkgKiAgaXQgaXMgc2FtZSBhcyBMYWJlbC5BTExDSEFSLgorCSAqCisJICogIE9ubHkgZG8gdGhpcyBmb3IgTGV4ZXJzLgorCSAqCisJICogIElmIEVPVCBjb2V4aXN0cyB3aXRoIEFMTENIQVI6CisJICogIDEuIElmIG5vdCBncmVlZHksIG1vZGlmeSB0aGUgbGFiZWxzIHBhcmFtZXRlciB0byBiZSBFT1QKKwkgKiAgMi4gSWYgZ3JlZWR5LCByZW1vdmUgRU9UIGZyb20gdGhlIGxhYmVscyBzZXQKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZWFjaGFibGVMYWJlbHNFT1RDb2V4aXN0c1dpdGhBbGxDaGFyKE9yZGVyZWRIYXNoU2V0IGxhYmVscykKKwl7CisJCUxhYmVsIGVvdCA9IG5ldyBMYWJlbChMYWJlbC5FT1QpOworCQlpZiAoICFsYWJlbHMuY29udGFpbnNLZXkoZW90KSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyBjb250YWlucyBFT1QiKTsKKwkJYm9vbGVhbiBjb250YWluc0FsbENoYXIgPSBmYWxzZTsKKwkJSW50ZXJ2YWxTZXQgY29tcGxldGVWb2NhYiA9IG5ldyBJbnRlcnZhbFNldCgpOworCQlpbnQgbiA9IGxhYmVscy5zaXplKCk7CisJCWZvciAoaW50IGk9MDsgaTxuOyBpKyspIHsKKwkJCUxhYmVsIHJsID0gKExhYmVsKWxhYmVscy5nZXQoaSk7CisJCQlpZiAoICFybC5lcXVhbHMoZW90KSApIHsKKwkJCQljb21wbGV0ZVZvY2FiLmFkZEFsbChybC5nZXRTZXQoKSk7CisJCQl9CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZVZvY2FiPSIrY29tcGxldGVWb2NhYik7CisJCWlmICggY29tcGxldGVWb2NhYi5lcXVhbHMoTGFiZWwuQUxMQ0hBUikgKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFsbCBjaGFyIik7CisJCQljb250YWluc0FsbENoYXIgPSB0cnVlOworCQl9CisJCXJldHVybiBjb250YWluc0FsbENoYXI7CisJfQorCSAqLworfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ERkFPcHRpbWl6ZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0RGQU9wdGltaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZTgyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ERkFPcHRpbWl6ZXIuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5hbmFseXNpczsKKworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKiogQSBtb2R1bGUgdG8gcGVyZm9ybSBvcHRpbWl6YXRpb25zIG9uIERGQXMuCisgKgorICogIEkgY291bGQgbW9yZSBlYXNpbHkgKGFuZCBtb3JlIHF1aWNrbHkpIGRvIHNvbWUgb3B0aW1pemF0aW9ucyAoc3VjaCBhcworICogIFBSVU5FX0VCTkZfRVhJVF9CUkFOQ0hFUykgZHVyaW5nIERGQSBjb25zdHJ1Y3Rpb24sIGJ1dCB0aGVuIGl0CisgKiAgbWVzc2VzIHVwIHRoZSBkZXRlcm1pbmlzbSBjaGVja2luZy4gIEZvciBleGFtcGxlLCBpdCBsb29rcyBsaWtlCisgKiAgbG9vcCBleGl0IGJyYW5jaGVzIGFyZSB1bnJlYWNoYWJsZSBpZiB5b3UgcHJ1bmUgZXhpdCBicmFuY2hlcworICogIGR1cmluZyBERkEgY29uc3RydWN0aW9uIGFuZCBiZWZvcmUgZGV0ZXJtaW5pc20gY2hlY2tzLgorICoKKyAqICBJbiBnZW5lcmFsLCBBTlRMUidzIE5GQS0+REZBLT5jb2RlZ2VuIHBpcGVsaW5lIHNlZW1zIHZlcnkgcm9idXN0CisgKiAgdG8gbWUgd2hpY2ggSSBhdHRyaWJ1dGUgdG8gYSB1bmlmb3JtIGFuZCBjb25zaXN0ZW50IHNldCBvZiBkYXRhCisgKiAgc3RydWN0dXJlcy4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBJIHdhbnQgdG8gInNheSIvaW1wbGVtZW50LCBJIGRvIHNvCisgKiAgd2l0aGluIHRoZSBjb25maW5lcyBvZiwgZm9yIGV4YW1wbGUsIGEgREZBLiAgVGhlIGNvZGUgZ2VuZXJhdG9yCisgKiAgY2FuIHRoZW4ganVzdCBnZW5lcmF0ZSBjb2RlLS1pdCBkb2Vzbid0IGhhdmUgdG8gZG8gbXVjaCB0aGlua2luZy4KKyAqICBQdXR0aW5nIG9wdGltaXphdGlvbnMgaW4gdGhlIGNvZGUgZ2VuIGNvZGUgcmVhbGx5IHN0YXJ0cyB0byBtYWtlCisgKiAgaXQgYSBzcGFnZXR0aSBmYWN0b3J5ICh1aCBvaCwgbm93IEknbSBodW5ncnkhKS4gIFRoZSBwaXBlbGluZSBpcworICogIHZlcnkgdGVzdGFibGU7IGVhY2ggc3RhZ2UgaGFzIHdlbGwgZGVmaW5lZCBpbnB1dC9vdXRwdXQgcGFpcnMuCisgKgorICogICMjIyBPcHRpbWl6YXRpb246IFBSVU5FX0VCTkZfRVhJVF9CUkFOQ0hFUworICoKKyAqICBUaGVyZSBpcyBubyBuZWVkIHRvIHRlc3QgRUJORiBibG9jayBleGl0IGJyYW5jaGVzLiAgTm90IG9ubHkgaXMgaXQKKyAqICBhbiB1bm5lZWRlZCBjb21wdXRhdGlvbiwgYnV0IGNvdW50ZXItaW50dWl0aXZlbHksIHlvdSBhY3R1YWxseSBnZXQKKyAqICBiZXR0ZXIgZXJyb3JzLiBZb3UgY2FuIHJlcG9ydCBhbiBlcnJvciBhdCB0aGUgbWlzc2luZyBvciBleHRyYQorICogIHRva2VuIHJhdGhlciB0aGFuIGFzIHNvb24gYXMgeW91J3ZlIGZpZ3VyZWQgb3V0IHlvdSB3aWxsIGZhaWwuCisgKgorICogIEltYWdpbmUgb3B0aW9uYWwgYmxvY2sgIiggRE9UIENMQVNTICk/IFNFTUkiLiAgQU5UTFIgZ2VuZXJhdGVzOgorICoKKyAqICBpbnQgYWx0PTA7CisgKiAgaWYgKCBpbnB1dC5MQSgxKT09RE9UICkgeworICogICAgICBhbHQ9MTsKKyAqICB9CisgKiAgZWxzZSBpZiAoIGlucHV0LkxBKDEpPT1TRU1JICkgeworICogICAgICBhbHQ9MjsKKyAqICB9CisgKgorICogIENsZWFybHksIHNpbmNlIFBhcnNlci5tYXRjaCgpIHdpbGwgdWx0aW1hdGVseSBmaW5kIHRoZSBlcnJvciwgd2UKKyAqICBkbyBub3Qgd2FudCB0byByZXBvcnQgYW4gZXJyb3Igbm9yIGRvIHdlIHdhbnQgdG8gYm90aGVyIHRlc3RpbmcKKyAqICBsb29rYWhlYWQgYWdhaW5zdCB3aGF0IGZvbGxvd3MgdGhlICguLi4pPyAgV2Ugd2FudCB0byBnZW5lcmF0ZQorICogIHNpbXBseSAic2hvdWxkIEkgZW50ZXIgdGhlIHN1YnJ1bGU/IjoKKyAqCisgKiAgaW50IGFsdD0yOworICogIGlmICggaW5wdXQuTEEoMSk9PURPVCApIHsKKyAqICAgICAgYWx0PTE7CisgKiAgfQorICoKKyAqICBOT1RFIDEuIEdyZWVkeSBsb29wcyBjYW5ub3QgYmUgb3B0aW1pemVkIGluIHRoaXMgd2F5LiAgRm9yIGV4YW1wbGUsCisgKiAgIihncmVlZHk9ZmFsc2U6J3gnfC4pKiAnXG4nIi4gIFlvdSBzcGVjaWZpY2FsbHkgbmVlZCB0aGUgZXhpdCBicmFuY2gKKyAqICB0byB0ZWxsIHlvdSB3aGVuIHRvIHRlcm1pbmF0ZSB0aGUgbG9vcCBhcyB0aGUgc2FtZSBpbnB1dCBhY3R1YWxseQorICogIHByZWRpY3RzIG9uZSBvZiB0aGUgYWx0cyAoaS5lLiwgc3RheWluZyBpbiB0aGUgbG9vcCkuCisgKgorICogIE5PVEUgMi4gIEkgZG8gbm90IG9wdGltaXplIGN5Y2xpYyBERkFzIGF0IHRoZSBtb21lbnQgYXMgaXQgZG9lc24ndAorICogIHNlZW0gdG8gd29yay4gOykgIEknbGwgaGF2ZSB0byBpbnZlc3RpZ2F0ZSBsYXRlciB0byBzZWUgd2hhdCB3b3JrIEkKKyAqICBjYW4gZG8gb24gY3ljbGljIERGQXMgdG8gbWFrZSB0aGVtIGhhdmUgZmV3ZXIgZWRnZXMuICBNaWdodCBoYXZlCisgKiAgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIEVPVCB0b2tlbi4KKyAqCisgKiAgIyMjIFBSVU5FX1NVUEVSRkxVT1VTX0VPVF9FREdFUworICoKKyAqICBXaGVuIGEgdG9rZW4gaXMgYSBzdWJzZXQgb2YgYW5vdGhlciBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgcnVsZXMsIEFOVExSCisgKiAgcXVpZXRseSBhc3N1bWVzIHRoZSBmaXJzdCB0b2tlbiB0byByZXNvbHZlIHRoZSBhbWJpZ3VpdHkuCisgKgorICogIEVRCQkJOiAnPScgOworICogIEFTU0lHTk9QCTogJz0nIHwgJys9JyA7CisgKgorICogIEl0IGNhbiB5aWVsZCBzdGF0ZXMgdGhhdCBoYXZlIG9ubHkgYSBzaW5nbGUgZWRnZSBvbiBFT1QgdG8gYW4gYWNjZXB0CisgKiAgc3RhdGUuICBUaGlzIGlzIGEgd2FzdGUgYW5kIG1lc3NlcyB1cCBteSBjb2RlIGdlbmVyYXRpb24uIDspICBJZgorICogIFRva2VucyBydWxlIERGQSBnb2VzCisgKgorICogCQlzMCAtJz0nLT4gczMgLUVPVC0+IHM1IChhY2NlcHQpCisgKgorICogIHRoZW4gczUgc2hvdWxkIGJlIHBydW5lZCBhbmQgczMgc2hvdWxkIGJlIG1hZGUgYW4gYWNjZXB0LiAgRG8gTk9UIGRvIHRoaXMKKyAqICBmb3Iga2V5d29yZCB2ZXJzdXMgSUQgYXMgdGhlIHN0YXRlIHdpdGggRU9UIGVkZ2UgZW1hbmF0aW5nIGZyb20gaXQgd2lsbAorICogIGFsc28gaGF2ZSBhbm90aGVyIGVkZ2UuCisgKgorICogICMjIyBPcHRpbWl6YXRpb246IENPTExBUFNFX0FMTF9JTkNJREVOVF9FREdFUworICoKKyAqICBEb25lIGR1cmluZyBERkEgY29uc3RydWN0aW9uLiAgU2VlIG1ldGhvZCBhZGRUcmFuc2l0aW9uKCkgaW4KKyAqICBORkFUb0RGQUNvbnZlcnRlci4KKyAqCisgKiAgIyMjIE9wdGltaXphdGlvbjogTUVSR0VfU1RPUF9TVEFURVMKKyAqCisgKiAgRG9uZSBkdXJpbmcgREZBIGNvbnN0cnVjdGlvbi4gIFNlZSBhZGRERkFTdGF0ZSgpIGluIE5GQVRvREZBQ29udmVydGVyLgorICovCitwdWJsaWMgY2xhc3MgREZBT3B0aW1pemVyIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUFJVTkVfRUJORl9FWElUX0JSQU5DSEVTID0gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUFJVTkVfVE9LRU5TX1JVTEVfU1VQRVJGTFVPVVNfRU9UX0VER0VTID0gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gQ09MTEFQU0VfQUxMX1BBUkFMTEVMX0VER0VTID0gdHJ1ZTsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gTUVSR0VfU1RPUF9TVEFURVMgPSB0cnVlOworCisJLyoqIFVzZWQgYnkgREZBIHN0YXRlIG1hY2hpbmUgZ2VuZXJhdG9yIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbgorCSAqICByZXN1bHRpbmcgZnJvbSBjeWNsZXMgaW50IHRoZSBERkEuICBUaGlzIGlzIGEgc2V0IG9mIGludCBzdGF0ZSAjcy4KKwkgKiAgVGhpcyBpcyBhIHNpZGUtZWZmZWN0IG9mIGNhbGxpbmcgb3B0aW1pemU7IGNhbid0IGNsZWFyIGFmdGVyIHVzZQorCSAqICBiZWNhdXNlIGNvZGUgZ2VuIG5lZWRzIGl0LgorCSAqLworCXByb3RlY3RlZCBTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICBwcm90ZWN0ZWQgR3JhbW1hciBncmFtbWFyOworCisgICAgcHVibGljIERGQU9wdGltaXplcihHcmFtbWFyIGdyYW1tYXIpIHsKKwkJdGhpcy5ncmFtbWFyID0gZ3JhbW1hcjsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBvcHRpbWl6ZSgpIHsKKwkJLy8gb3B0aW1pemUgZWFjaCBERkEgaW4gdGhpcyBncmFtbWFyCisJCWZvciAoaW50IGRlY2lzaW9uTnVtYmVyPTE7CisJCQkgZGVjaXNpb25OdW1iZXI8PWdyYW1tYXIuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKTsKKwkJCSBkZWNpc2lvbk51bWJlcisrKQorCQl7CisJCQlERkEgZGZhID0gZ3JhbW1hci5nZXRMb29rYWhlYWRERkEoZGVjaXNpb25OdW1iZXIpOworCQkJb3B0aW1pemUoZGZhKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIG9wdGltaXplKERGQSBkZmEpIHsKKwkJaWYgKCBkZmE9PW51bGwgKSB7CisJCQlyZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KKwkJfQorCQkvKgorCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9wdGltaXplIERGQSAiK2RmYS5kZWNpc2lvbk5GQVN0YXJ0U3RhdGUuZGVjaXNpb25OdW1iZXIrCisJCQkJCQkgICAiIG51bSBzdGF0ZXM9IitkZmEuZ2V0TnVtYmVyT2ZTdGF0ZXMoKSk7CisJCSovCisJCS8vbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlpZiAoIFBSVU5FX0VCTkZfRVhJVF9CUkFOQ0hFUyAmJiBkZmEuY2FuSW5saW5lRGVjaXNpb24oKSApIHsKKwkJCXZpc2l0ZWQuY2xlYXIoKTsKKwkJCWludCBkZWNpc2lvblR5cGUgPQorCQkJCWRmYS5nZXRORkFEZWNpc2lvblN0YXJ0U3RhdGUoKS5kZWNpc2lvblN0YXRlVHlwZTsKKwkJCWlmICggZGZhLmlzR3JlZWR5KCkgJiYKKwkJCQkgKGRlY2lzaW9uVHlwZT09TkZBU3RhdGUuT1BUSU9OQUxfQkxPQ0tfU1RBUlQgfHwKKwkJCQkgZGVjaXNpb25UeXBlPT1ORkFTdGF0ZS5MT09QQkFDSykgKQorCQkJeworCQkJCW9wdGltaXplRXhpdEJyYW5jaGVzKGRmYS5zdGFydFN0YXRlKTsKKwkJCX0KKwkJfQorCQkvLyBJZiB0aGUgVG9rZW5zIHJ1bGUgaGFzIHN5bnRhY3RpY2FsbHkgYW1iaWd1b3VzIHJ1bGVzLCB0cnkgdG8gcHJ1bmUKKwkJaWYgKCBQUlVORV9UT0tFTlNfUlVMRV9TVVBFUkZMVU9VU19FT1RfRURHRVMgJiYKKwkJCSBkZmEuaXNUb2tlbnNSdWxlRGVjaXNpb24oKSAmJgorCQkJIGRmYS5wcm9iZS5zdGF0ZVRvU3ludGFjdGljYWxseUFtYmlndW91c1Rva2Vuc1J1bGVBbHRzTWFwLnNpemUoKT4wICkKKwkJeworCQkJdmlzaXRlZC5jbGVhcigpOworCQkJb3B0aW1pemVFT1RCcmFuY2hlcyhkZmEuc3RhcnRTdGF0ZSk7CisJCX0KKworCQkvKiBhY2suLi5jb2RlIGdlbiBuZWVkcyB0aGlzLCBjYW5ub3Qgb3B0aW1pemUKKwkJdmlzaXRlZC5jbGVhcigpOworCQl1bmxpbmtVbm5lZWRlZFN0YXRlRGF0YShkZmEuc3RhcnRTdGF0ZSk7CisJCSovCisJCS8vbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJtaW5pbWl6ZWQgaW4gIisoaW50KShzdG9wLXN0YXJ0KSsiIG1zIik7CisgICAgfQorCisJcHJvdGVjdGVkIHZvaWQgb3B0aW1pemVFeGl0QnJhbmNoZXMoREZBU3RhdGUgZCkgeworCQlJbnRlZ2VyIHNJID0gVXRpbHMuaW50ZWdlcihkLnN0YXRlTnVtYmVyKTsKKwkJaWYgKCB2aXNpdGVkLmNvbnRhaW5zKHNJKSApIHsKKwkJCXJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkCisJCX0KKwkJdmlzaXRlZC5hZGQoc0kpOworCQlpbnQgbkFsdHMgPSBkLmRmYS5nZXROdW1iZXJPZkFsdHMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIGVkZ2UgPSAoVHJhbnNpdGlvbikgZC50cmFuc2l0aW9uKGkpOworCQkJREZBU3RhdGUgZWRnZVRhcmdldCA9ICgoREZBU3RhdGUpZWRnZS50YXJnZXQpOworCQkJLyoKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihkLnN0YXRlTnVtYmVyKyItIisKKwkJCQkJCQkgICBlZGdlLmxhYmVsLnRvU3RyaW5nKGQuZGZhLm5mYS5ncmFtbWFyKSsiLT4iKworCQkJCQkJCSAgIGVkZ2VUYXJnZXQuc3RhdGVOdW1iZXIpOworCQkJKi8KKwkJCS8vIGlmIHRhcmdldCBpcyBhbiBhY2NlcHQgc3RhdGUgYW5kIHRoYXQgYWx0IGlzIHRoZSBleGl0IGFsdAorCQkJaWYgKCBlZGdlVGFyZ2V0LmlzQWNjZXB0U3RhdGUoKSAmJgorCQkJCWVkZ2VUYXJnZXQuZ2V0VW5pcXVlbHlQcmVkaWN0ZWRBbHQoKT09bkFsdHMpCisJCQl7CisJCQkJLyoKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImlnbm9yaW5nIHRyYW5zaXRpb24gIitpKyIgdG8gbWF4IGFsdCAiKworCQkJCQlkLmRmYS5nZXROdW1iZXJPZkFsdHMoKSk7CisJCQkJKi8KKwkJCQlkLnJlbW92ZVRyYW5zaXRpb24oaSk7CisJCQkJaS0tOyAvLyBiYWNrIHVwIG9uZSBzbyB0aGF0IGkrKyBvZiBsb29wIGl0ZXJhdGlvbiBzdGF5cyB3aXRoaW4gYm91bmRzCisJCQl9CisJCQlvcHRpbWl6ZUV4aXRCcmFuY2hlcyhlZGdlVGFyZ2V0KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIG9wdGltaXplRU9UQnJhbmNoZXMoREZBU3RhdGUgZCkgeworCQlJbnRlZ2VyIHNJID0gVXRpbHMuaW50ZWdlcihkLnN0YXRlTnVtYmVyKTsKKwkJaWYgKCB2aXNpdGVkLmNvbnRhaW5zKHNJKSApIHsKKwkJCXJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkCisJCX0KKwkJdmlzaXRlZC5hZGQoc0kpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGQuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBpKyspIHsKKwkJCVRyYW5zaXRpb24gZWRnZSA9IChUcmFuc2l0aW9uKSBkLnRyYW5zaXRpb24oaSk7CisJCQlERkFTdGF0ZSBlZGdlVGFyZ2V0ID0gKChERkFTdGF0ZSllZGdlLnRhcmdldCk7CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKGQuc3RhdGVOdW1iZXIrIi0iKworCQkJCQkJCSAgIGVkZ2UubGFiZWwudG9TdHJpbmcoZC5kZmEubmZhLmdyYW1tYXIpKyItPiIrCisJCQkJCQkJICAgZWRnZVRhcmdldC5zdGF0ZU51bWJlcik7CisJCQkqLworCQkJLy8gaWYgb25seSBvbmUgZWRnZSBjb21pbmcgb3V0LCBpdCBpcyBFT1QsIGFuZCB0YXJnZXQgaXMgYWNjZXB0IHBydW5lCisJCQlpZiAoIFBSVU5FX1RPS0VOU19SVUxFX1NVUEVSRkxVT1VTX0VPVF9FREdFUyAmJgorCQkJCWVkZ2VUYXJnZXQuaXNBY2NlcHRTdGF0ZSgpICYmCisJCQkJZC5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk9PTEgJiYKKwkJCQllZGdlLmxhYmVsLmlzQXRvbSgpICYmCisJCQkJZWRnZS5sYWJlbC5nZXRBdG9tKCk9PUxhYmVsLkVPVCApCisJCQl7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInN0YXRlICIrZCsiIGNhbiBiZSBwcnVuZWQiKTsKKwkJCQkvLyByZW1vdmUgdGhlIHN1cGVyZmx1b3VzIEVPVCBlZGdlCisJCQkJZC5yZW1vdmVUcmFuc2l0aW9uKGkpOworCQkJCWQuc2V0QWNjZXB0U3RhdGUodHJ1ZSk7IC8vIG1ha2UgaXQgYW4gYWNjZXB0IHN0YXRlCisJCQkJLy8gZm9yY2UgaXQgdG8gdW5pcXVlbHkgcHJlZGljdCB0aGUgb3JpZ2luYWxseSBwcmVkaWN0ZWQgc3RhdGUKKwkJCQlkLmNhY2hlZFVuaXF1ZWx5UHJlZGljYXRlZEFsdCA9CisJCQkJCWVkZ2VUYXJnZXQuZ2V0VW5pcXVlbHlQcmVkaWN0ZWRBbHQoKTsKKwkJCQlpLS07IC8vIGJhY2sgdXAgb25lIHNvIHRoYXQgaSsrIG9mIGxvb3AgaXRlcmF0aW9uIHN0YXlzIHdpdGhpbiBib3VuZHMKKwkJCX0KKwkJCW9wdGltaXplRU9UQnJhbmNoZXMoZWRnZVRhcmdldCk7CisJCX0KKwl9CisKKwkvKiogV2FsayBERkEgc3RhdGVzLCB1bmxpbmtpbmcgdGhlIG5mYSBjb25maWdzIGFuZCB3aGF0ZXZlciBlbHNlIEkKKwkgKiAgY2FuIHRvIHJlZHVjZSBtZW1vcnkgZm9vdHByaW50LgorCXByb3RlY3RlZCB2b2lkIHVubGlua1VubmVlZGVkU3RhdGVEYXRhKERGQVN0YXRlIGQpIHsKKwkJSW50ZWdlciBzSSA9IFV0aWxzLmludGVnZXIoZC5zdGF0ZU51bWJlcik7CisJCWlmICggdmlzaXRlZC5jb250YWlucyhzSSkgKSB7CisJCQlyZXR1cm47IC8vIGFscmVhZHkgdmlzaXRlZAorCQl9CisJCXZpc2l0ZWQuYWRkKHNJKTsKKwkJZC5uZmFDb25maWd1cmF0aW9ucyA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZC5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGkrKykgeworCQkJVHJhbnNpdGlvbiBlZGdlID0gKFRyYW5zaXRpb24pIGQudHJhbnNpdGlvbihpKTsKKwkJCURGQVN0YXRlIGVkZ2VUYXJnZXQgPSAoKERGQVN0YXRlKWVkZ2UudGFyZ2V0KTsKKwkJCXVubGlua1VubmVlZGVkU3RhdGVEYXRhKGVkZ2VUYXJnZXQpOworCQl9CisJfQorCSAqLworCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ERkFTdGF0ZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvREZBU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTFhNzAzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvREZBU3RhdGUuamF2YQpAQCAtMCwwICsxLDc3NiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5hbmFseXNpczsKKworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludFNldDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5NdWx0aU1hcDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5PcmRlcmVkSGFzaFNldDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5VdGlsczsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBBIERGQSBzdGF0ZSByZXByZXNlbnRzIGEgc2V0IG9mIHBvc3NpYmxlIE5GQSBjb25maWd1cmF0aW9ucy4KKyAqICBBcyBBaG8sIFNldGhpLCBVbGxtYW4gcC4gMTE3IHNheXMgIlRoZSBERkEgdXNlcyBpdHMgc3RhdGUKKyAqICB0byBrZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBzdGF0ZXMgdGhlIE5GQSBjYW4gYmUgaW4gYWZ0ZXIKKyAqICByZWFkaW5nIGVhY2ggaW5wdXQgc3ltYm9sLiAgVGhhdCBpcyB0byBzYXksIGFmdGVyIHJlYWRpbmcKKyAqICBpbnB1dCBhMWEyLi5hbiwgdGhlIERGQSBpcyBpbiBhIHN0YXRlIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAqICBzdWJzZXQgVCBvZiB0aGUgc3RhdGVzIG9mIHRoZSBORkEgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdGhlCisgKiAgTkZBJ3Mgc3RhcnQgc3RhdGUgYWxvbmcgc29tZSBwYXRoIGxhYmVsZWQgYTFhMi4uYW4uIgorICogIEluIGNvbnZlbnRpb25hbCBORkEtPkRGQSBjb252ZXJzaW9uLCB0aGVyZWZvcmUsIHRoZSBzdWJzZXQgVAorICogIHdvdWxkIGJlIGEgYml0c2V0IHJlcHJlc2VudGluZyB0aGUgc2V0IG9mIHN0YXRlcyB0aGUKKyAqICBORkEgY291bGQgYmUgaW4uICBXZSBuZWVkIHRvIHRyYWNrIHRoZSBhbHQgcHJlZGljdGVkIGJ5IGVhY2gKKyAqICBzdGF0ZSBhcyB3ZWxsLCBob3dldmVyLiAgTW9yZSBpbXBvcnRhbnRseSwgd2UgbmVlZCB0byBtYWludGFpbgorICogIGEgc3RhY2sgb2Ygc3RhdGVzLCB0cmFja2luZyB0aGUgY2xvc3VyZSBvcGVyYXRpb25zIGFzIHRoZXkKKyAqICBqdW1wIGZyb20gcnVsZSB0byBydWxlLCBlbXVsYXRpbmcgcnVsZSBpbnZvY2F0aW9ucyAobWV0aG9kIGNhbGxzKS4KKyAqICBSZWNhbGwgdGhhdCBORkFzIGRvIG5vdCBub3JtYWxseSBoYXZlIGEgc3RhY2sgbGlrZSBhIHB1c2hkb3duLW1hY2hpbmUKKyAqICBzbyBJIGhhdmUgdG8gYWRkIG9uZSB0byBzaW11bGF0ZSB0aGUgcHJvcGVyIGxvb2thaGVhZCBzZXF1ZW5jZXMgZm9yCisgKiAgdGhlIHVuZGVybHlpbmcgTEwgZ3JhbW1hciBmcm9tIHdoaWNoIHRoZSBORkEgd2FzIGRlcml2ZWQuCisgKgorICogIEkgdXNlIGEgbGlzdCBvZiBORkFDb25maWd1cmF0aW9uIG9iamVjdHMuICBBbiBORkFDb25maWd1cmF0aW9uCisgKiAgaXMgYm90aCBhIHN0YXRlIChhbGEgbm9ybWFsIGNvbnZlcnNpb24pIGFuZCBhbiBORkFDb250ZXh0IGRlc2NyaWJpbmcKKyAqICB0aGUgY2hhaW4gb2YgcnVsZXMgKGlmIGFueSkgZm9sbG93ZWQgdG8gYXJyaXZlIGF0IHRoYXQgc3RhdGUuICBUaGVyZQorICogIGlzIGFsc28gdGhlIHNlbWFudGljIGNvbnRleHQsIHdoaWNoIGlzIHRoZSAic2V0IiBvZiBwcmVkaWNhdGVzIGZvdW5kCisgKiAgb24gdGhlIHBhdGggdG8gdGhpcyBjb25maWd1cmF0aW9uLgorICoKKyAqICBBIERGQSBzdGF0ZSBtYXkgaGF2ZSBtdWx0aXBsZSByZWZlcmVuY2VzIHRvIGEgcGFydGljdWxhciBzdGF0ZSwKKyAqICBidXQgd2l0aCBkaWZmZXJlbnQgTkZBQ29udGV4dHMgKHdpdGggc2FtZSBvciBkaWZmZXJlbnQgYWx0cykKKyAqICBtZWFuaW5nIHRoYXQgc3RhdGUgd2FzIHJlYWNoZWQgdmlhIGEgZGlmZmVyZW50IHNldCBvZiBydWxlIGludm9jYXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgREZBU3RhdGUgZXh0ZW5kcyBTdGF0ZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9OVU1fVFJBTlNJVElPTlMgPSA0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRURJQ1RFRF9BTFRfVU5TRVQgPSBORkEuSU5WQUxJRF9BTFRfTlVNQkVSLTE7CisKKyAgICAvKiogV2UgYXJlIHBhcnQgb2Ygd2hhdCBERkE/ICBVc2UgdGhpcyByZWYgdG8gZ2V0IGFjY2VzcyB0byB0aGUKKyAgICAgKiAgY29udGV4dCB0cmVlcyBmb3IgYW4gYWx0LgorICAgICAqLworICAgIHB1YmxpYyBERkEgZGZhOworCisgICAgLyoqIFRyYWNrIHRoZSB0cmFuc2l0aW9ucyBlbWFuYXRpbmcgZnJvbSB0aGlzIERGQSBzdGF0ZS4gIFRoZSBMaXN0CisgICAgICogIGVsZW1lbnRzIGFyZSBUcmFuc2l0aW9uIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3Q8VHJhbnNpdGlvbj4gdHJhbnNpdGlvbnMgPQorCQluZXcgQXJyYXlMaXN0PFRyYW5zaXRpb24+KElOSVRJQUxfTlVNX1RSQU5TSVRJT05TKTsKKworCS8qKiBXaGVuIGRvaW5nIGFuIGFjeWNsaWMgREZBLCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgbG9va2FoZWFkIHN5bWJvbHMKKwkgKiAgY29uc3VtZWQgdG8gcmVhY2ggdGhpcyBzdGF0ZS4gIFRoaXMgdmFsdWUgbWF5IGJlIG5vbnplcm8gZm9yIG1vc3QKKwkgKiAgZGZhIHN0YXRlcywgYnV0IGl0IGlzIG9ubHkgYSB2YWxpZCB2YWx1ZSBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkCisJICogIGEgbWF4IGZpeGVkIGxvb2thaGVhZC4KKwkgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGs7CisKKyAgICAvKiogVGhlIE5GQS0+REZBIGFsZ29yaXRobSBtYXkgdGVybWluYXRlIGxlYXZpbmcgc29tZSBzdGF0ZXMKKyAgICAgKiAgd2l0aG91dCBhIHBhdGggdG8gYW4gYWNjZXB0IHN0YXRlLCBpbXBseWluZyB0aGF0IHVwb24gY2VydGFpbgorICAgICAqICBpbnB1dCwgdGhlIGRlY2lzaW9uIGlzIG5vdCBkZXRlcm1pbmlzdGljLS1ubyBkZWNpc2lvbiBhYm91dAorICAgICAqICBwcmVkaWN0aW5nIGEgdW5pcXVlIGFsdGVybmF0aXZlIGNhbiBiZSBtYWRlLiAgUmVjYWxsIHRoYXQgYW4KKyAgICAgKiAgYWNjZXB0IHN0YXRlIGlzIG9uZSBpbiB3aGljaCBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBpcyBwcmVkaWN0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBhY2NlcHRTdGF0ZVJlYWNoYWJsZSA9IERGQS5SRUFDSEFCTEVfVU5LTk9XTjsKKworICAgIC8qKiBSYXRoZXIgdGhhbiByZWNoZWNrIGV2ZXJ5IE5GQSBjb25maWd1cmF0aW9uIGluIGEgREZBIHN0YXRlIChhZnRlcgorICAgICAqICByZXNvbHZpbmcpIGluIGZpbmROZXdERkFTdGF0ZXNBbmRBZGRERkFUcmFuc2l0aW9ucyBqdXN0IGNoZWNrCisgICAgICogIHRoaXMgYm9vbGVhbi4gIFNhdmVzIGEgbGluZWFyIHdhbGsgcGVyaGFwcyBERkEgc3RhdGUgY3JlYXRpb24uCisgICAgICogIEV2ZXJ5IGxpdHRsZSBiaXQgaGVscHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzb2x2ZWRXaXRoUHJlZGljYXRlcyA9IGZhbHNlOworCisJLyoqIElmIGEgY2xvc3VyZSBvcGVyYXRpb24gZmluZHMgdGhhdCB3ZSB0cmllZCB0byBpbnZva2UgdGhlIHNhbWUKKwkgKiAgcnVsZSB0b28gbWFueSB0aW1lcyAoc3RhY2sgd291bGQgZ3JvdyBiZXlvbmQgYSB0aHJlc2hvbGQpLCBpdAorCSAqICBtYXJrcyB0aGUgc3RhdGUgaGFzIGFib3J0ZWQgYW5kIG5vdGlmaWVzIHRoZSBEZWNpc2lvblByb2JlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGFib3J0ZWREdWVUb1JlY3Vyc2lvbk92ZXJmbG93ID0gZmFsc2U7CisKKwkvKiogSWYgd2UgZGV0ZWN0IHJlY3Vyc2lvbiBvbiBtb3JlIHRoYW4gb25lIGFsdCwgZGVjaXNpb24gaXMgbm9uLUxMKCopLAorCSAqICBidXQgdHJ5IHRvIGlzb2xhdGUgaXQgdG8gb25seSB0aG9zZSBzdGF0ZXMgd2hvc2UgY2xvc3VyZSBvcGVyYXRpb25zCisJICogIGRldGVjdCByZWN1cnNpb24uICBUaGVyZSBtYXkgYmUgb3RoZXIgYWx0cyB0aGF0IGFyZSBjb29sOgorCSAqCisJICogIGEgOiByZWN1ciAnLicKKwkgKiAgICB8IHJlY3VyICc7JworCSAqICAgIHwgWCBZICAvLyBMTCgyKSBkZWNpc2lvbjsgZG9uJ3QgYWJvcnQgYW5kIHVzZSBrPTEgcGx1cyBiYWNrdHJhY2tpbmcKKwkgKiAgICB8IFggWgorCSAqICAgIDsKKwkgKgorCSAqICAxMi8xMy8yMDA3OiBBY3R1YWxseSB0aGlzIGhhcyBjYXVzZWQgcHJvYmxlbXMuICBJZiBrPSosIG11c3QgdGVybWluYXRlCisJICogIGFuZCB0aHJvdyBvdXQgZW50aXJlIERGQTsgcmV0cnkgd2l0aCBrPTEuICBTaW5jZSByZWN1cnNpdmUsIGRvIG5vdAorCSAqICBhdHRlbXB0IG1vcmUgY2xvc3VyZSBvcHMgYXMgaXQgbWF5IHRha2UgZm9yZXZlci4gIEV4Y2VwdGlvbiB0aHJvd24KKwkgKiAgbm93IGFuZCB3ZSBzaW1wbHkgcmVwb3J0IHRoZSBwcm9ibGVtLiAgSWYgc3lucHJlZHMgZXhpc3QsIEknbGwgcmV0cnkKKwkgKiAgd2l0aCBrPTEuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gYWJvcnRlZER1ZVRvTXVsdGlwbGVSZWN1cnNpdmVBbHRzID0gZmFsc2U7CisKKwkvKiogQnVpbGQgdXAgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBzdGF0ZSBhcyBORkEgY29uZmlndXJhdGlvbnMKKyAgICAgKiAgYXJlIGFkZGVkIGFzIGl0J3MgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjYWNoZWRIYXNoQ29kZTsKKworCXByb3RlY3RlZCBpbnQgY2FjaGVkVW5pcXVlbHlQcmVkaWNhdGVkQWx0ID0gUFJFRElDVEVEX0FMVF9VTlNFVDsKKworCXB1YmxpYyBpbnQgbWluQWx0SW5Db25maWd1cmF0aW9ucz1JbnRlZ2VyLk1BWF9WQUxVRTsKKworCXB1YmxpYyBib29sZWFuIGF0TGVhc3RPbmVDb25maWd1cmF0aW9uSGFzQVByZWRpY2F0ZSA9IGZhbHNlOworCisJLyoqIFRoZSBzZXQgb2YgTkZBIGNvbmZpZ3VyYXRpb25zIChzdGF0ZSxhbHQsY29udGV4dCkgZm9yIHRoaXMgREZBIHN0YXRlICovCisgICAgcHVibGljIE9yZGVyZWRIYXNoU2V0PE5GQUNvbmZpZ3VyYXRpb24+IG5mYUNvbmZpZ3VyYXRpb25zID0KKwkJbmV3IE9yZGVyZWRIYXNoU2V0PE5GQUNvbmZpZ3VyYXRpb24+KCk7CisKKwlwdWJsaWMgTGlzdDxORkFDb25maWd1cmF0aW9uPiBjb25maWd1cmF0aW9uc1dpdGhMYWJlbGVkRWRnZXMgPQorCQluZXcgQXJyYXlMaXN0PE5GQUNvbmZpZ3VyYXRpb24+KCk7CisKKwkvKiogVXNlZCB0byBwcmV2ZW50IHRoZSBjbG9zdXJlIG9wZXJhdGlvbiBmcm9tIGxvb3BpbmcgdG8gaXRzZWxmIGFuZAorICAgICAqICBoZW5jZSBsb29waW5nIGZvcmV2ZXIuICBTZW5zaXRpdmUgdG8gdGhlIE5GQSBzdGF0ZSwgdGhlIGFsdCwgYW5kCisgICAgICogIHRoZSBzdGFjayBjb250ZXh0LiAgVGhpcyBqdXN0IHRoZSBuZmEgY29uZmlnIHNldCBiZWNhdXNlIHdlIHdhbnQgdG8KKwkgKiAgcHJldmVudCBjbG9zdXJlcyBvbmx5IG9uIHN0YXRlcyBjb250cmlidXRlZCBieSBjbG9zdXJlIG5vdCByZWFjaAorCSAqICBvcGVyYXRpb25zLgorCSAqCisJICogIFR3byBjb25maWd1cmF0aW9ucyBpZGVudGljYWwgaW5jbHVkaW5nIHNlbWFudGljIGNvbnRleHQgYXJlCisJICogIGNvbnNpZGVyZWQgdGhlIHNhbWUgY2xvc3VyZSBjb21wdXRhdGlvbi4gIEBzZWUgTkZBVG9ERkFDb252ZXJ0ZXIuY2xvc3VyZUJ1c3koKS4KKyAgICAgKi8KKwlwcm90ZWN0ZWQgU2V0PE5GQUNvbmZpZ3VyYXRpb24+IGNsb3N1cmVCdXN5ID0gbmV3IEhhc2hTZXQ8TkZBQ29uZmlndXJhdGlvbj4oKTsKKworCS8qKiBBcyB0aGlzIHN0YXRlIGlzIGNvbnN0cnVjdGVkIChpLmUuLCBhcyBORkEgc3RhdGVzIGFyZSBhZGRlZCksIHdlCisgICAgICogIGNhbiBlYXNpbHkgY2hlY2sgZm9yIG5vbi1lcHNpbG9uIHRyYW5zaXRpb25zIGJlY2F1c2UgdGhlIG9ubHkKKyAgICAgKiAgdHJhbnNpdGlvbiB0aGF0IGNvdWxkIGJlIGEgdmFsaWQgbGFiZWwgaXMgdHJhbnNpdGlvbigwKS4gIFdoZW4gd2UKKyAgICAgKiAgcHJvY2VzcyB0aGlzIG5vZGUgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSB0byB3YWxrIGFsbCBzdGF0ZXMgbG9va2luZworICAgICAqICBmb3IgYWxsIHBvc3NpYmxlIHRyYW5zaXRpb25zLiAgVGhhdCBpcyBvZiB0aGUgb3JkZXI6IHNpemUobGFiZWwgc3BhY2UpCisgICAgICogIHRpbWVzIHNpemUobmZhIHN0YXRlcyksIHdoaWNoIGNhbiBiZSBwcmV0dHkgZGFtbiBiaWcuICBJdCdzIGJldHRlcgorICAgICAqICB0byBzaW1wbHkgdHJhY2sgcG9zc2libGUgbGFiZWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBPcmRlcmVkSGFzaFNldDxMYWJlbD4gcmVhY2hhYmxlTGFiZWxzOworCisgICAgcHVibGljIERGQVN0YXRlKERGQSBkZmEpIHsKKyAgICAgICAgdGhpcy5kZmEgPSBkZmE7CisgICAgfQorCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vbmZhQ29uZmlndXJhdGlvbnMgPSBudWxsOyAvLyBnZXRHYXRlZFByZWRpY2F0ZXNJbk5GQUNvbmZpZ3VyYXRpb25zIG5lZWRzCisJCWNvbmZpZ3VyYXRpb25zV2l0aExhYmVsZWRFZGdlcyA9IG51bGw7CisJCWNsb3N1cmVCdXN5ID0gbnVsbDsKKwkJcmVhY2hhYmxlTGFiZWxzID0gbnVsbDsKKwl9CisKKwlwdWJsaWMgVHJhbnNpdGlvbiB0cmFuc2l0aW9uKGludCBpKSB7CisgICAgICAgIHJldHVybiAoVHJhbnNpdGlvbil0cmFuc2l0aW9ucy5nZXQoaSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZlRyYW5zaXRpb25zKCkgeworICAgICAgICByZXR1cm4gdHJhbnNpdGlvbnMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRyYW5zaXRpb24oVHJhbnNpdGlvbiB0KSB7CisgICAgICAgIHRyYW5zaXRpb25zLmFkZCh0KTsKKyAgICB9CisKKwkvKiogQWRkIGEgdHJhbnNpdGlvbiBmcm9tIHRoaXMgc3RhdGUgdG8gdGFyZ2V0IHdpdGggbGFiZWwuICBSZXR1cm4KKwkgKiAgdGhlIHRyYW5zaXRpb24gbnVtYmVyIGZyb20gMC4ubi0xLgorCSAqLworICAgIHB1YmxpYyBpbnQgYWRkVHJhbnNpdGlvbihERkFTdGF0ZSB0YXJnZXQsIExhYmVsIGxhYmVsKSB7CisJCXRyYW5zaXRpb25zLmFkZCggbmV3IFRyYW5zaXRpb24obGFiZWwsIHRhcmdldCkgKTsKKwkJcmV0dXJuIHRyYW5zaXRpb25zLnNpemUoKS0xOworICAgIH0KKworICAgIHB1YmxpYyBUcmFuc2l0aW9uIGdldFRyYW5zaXRpb24oaW50IHRyYW5zKSB7CisgICAgICAgIHJldHVybiB0cmFuc2l0aW9ucy5nZXQodHJhbnMpOworICAgIH0KKworCXB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zaXRpb24oaW50IHRyYW5zKSB7CisJCXRyYW5zaXRpb25zLnJlbW92ZSh0cmFucyk7CisJfQorCisgICAgLyoqIEFkZCBhbiBORkEgY29uZmlndXJhdGlvbiB0byB0aGlzIERGQSBub2RlLiAgQWRkIHVuaXF1ZWx5CisgICAgICogIGFuIE5GQSBzdGF0ZS9hbHQvc3ludGFjdGljJnNlbWFudGljIGNvbnRleHQgKGNoYWluIG9mIGludm9raW5nIHN0YXRlKHMpCisgICAgICogIGFuZCBzZW1hbnRpYyBwcmVkaWNhdGUgY29udGV4dHMpLgorICAgICAqCisgICAgICogIEkgZG9uJ3Qgc2VlIGhvdyB0aGVyZSBjb3VsZCBiZSB0d28gY29uZmlndXJhdGlvbnMgd2l0aCBzYW1lCisgICAgICogIHN0YXRlfGFsdHxzeW5DdHggYW5kIGRpZmZlcmVudCBzZW1hbnRpYyBjb250ZXh0cyBiZWNhdXNlIHRoZQorICAgICAqICBzZW1hbnRpYyBjb250ZXh0cyBhcmUgY29tcHV0ZWQgYWxvbmcgdGhlIHBhdGggdG8gYSBwYXJ0aWN1bGFyIHN0YXRlCisgICAgICogIHNvIHRob3NlIHR3byBjb25maWd1cmF0aW9ucyB3b3VsZCBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgcHJlZGljYXRlLgorICAgICAqICBOb25ldGhlbGVzcywgdGhlIGFkZGl0aW9uIG9mIGNvbmZpZ3VyYXRpb25zIGlzIHVuaXF1ZSBvbiBhbGwKKyAgICAgKiAgY29uZmlndXJhdGlvbiBpbmZvLiAgSSBndWVzcyBJJ20gc2F5aW5nIHRoYXQgc3ludGFjdGljIGNvbnRleHQKKyAgICAgKiAgaW1wbGllcyBzZW1hbnRpYyBjb250ZXh0IGFzIHRoZSBsYXR0ZXIgaXMgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqICBmb3JtZXIuCisgICAgICoKKyAgICAgKiAgQXMgd2UgYWRkIGNvbmZpZ3VyYXRpb25zIHRvIHRoaXMgREZBIHN0YXRlLCB0cmFjayB0aGUgc2V0IG9mIGFsbCBwb3NzaWJsZQorICAgICAqICB0cmFuc2l0aW9uIGxhYmVscyBzbyB3ZSBjYW4gc2ltcGx5IHdhbGsgaXQgbGF0ZXIgcmF0aGVyIHRoYW4gZG9pbmcgYQorICAgICAqICBsb29wIG92ZXIgYWxsIHBvc3NpYmxlIGxhYmVscyBpbiB0aGUgTkZBLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5GQUNvbmZpZ3VyYXRpb24oTkZBU3RhdGUgc3RhdGUsIE5GQUNvbmZpZ3VyYXRpb24gYykgeworCQlpZiAoIG5mYUNvbmZpZ3VyYXRpb25zLmNvbnRhaW5zKGMpICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbmZhQ29uZmlndXJhdGlvbnMuYWRkKGMpOworCisJCS8vIHRyYWNrIG1pbiBhbHQgcmF0aGVyIHRoYW4gY29tcHV0ZSBsYXRlcgorCQlpZiAoIGMuYWx0IDwgbWluQWx0SW5Db25maWd1cmF0aW9ucyApIHsKKwkJCW1pbkFsdEluQ29uZmlndXJhdGlvbnMgPSBjLmFsdDsKKwkJfQorCisJCWlmICggYy5zZW1hbnRpY0NvbnRleHQhPVNlbWFudGljQ29udGV4dC5FTVBUWV9TRU1BTlRJQ19DT05URVhUICkgeworCQkJYXRMZWFzdE9uZUNvbmZpZ3VyYXRpb25IYXNBUHJlZGljYXRlID0gdHJ1ZTsKKwkJfQorCisJCS8vIHVwZGF0ZSBoYXNoQ29kZTsgZm9yIHNvbWUgcmVhc29uIHVzaW5nIGNvbnRleHQuaGFzaENvZGUoKSBhbHNvCisgICAgICAgIC8vIG1ha2VzIHRoZSBHQyB0YWtlIGxpa2UgNzAlIG9mIHRoZSBDUFUgYW5kIGlzIHNsb3chCisgICAgICAgIGNhY2hlZEhhc2hDb2RlICs9IGMuc3RhdGUgKyBjLmFsdDsKKworCQkvLyB1cGRhdGUgcmVhY2hhYmxlTGFiZWxzCisJCS8vIFdlJ3JlIGFkZGluZyBhbiBORkEgc3RhdGU7IGNoZWNrIHRvIHNlZSBpZiBpdCBoYXMgYSBub24tZXBzaWxvbiBlZGdlCisJCWlmICggc3RhdGUudHJhbnNpdGlvblswXSAhPSBudWxsICkgeworCQkJTGFiZWwgbGFiZWwgPSBzdGF0ZS50cmFuc2l0aW9uWzBdLmxhYmVsOworCQkJaWYgKCAhKGxhYmVsLmlzRXBzaWxvbigpfHxsYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCkpICkgeworCQkJCS8vIHRoaXMgTkZBIHN0YXRlIGhhcyBhIG5vbi1lcHNpbG9uIGVkZ2UsIHRyYWNrIGZvciBmYXN0CisJCQkJLy8gd2Fsa2luZyBsYXRlciB3aGVuIHdlIGRvIHJlYWNoIG9uIHRoaXMgREZBIHN0YXRlIHdlJ3JlCisJCQkJLy8gYnVpbGRpbmcuCisJCQkJY29uZmlndXJhdGlvbnNXaXRoTGFiZWxlZEVkZ2VzLmFkZChjKTsKKwkJCQlpZiAoIHN0YXRlLnRyYW5zaXRpb25bMV0gPT1udWxsICkgeworCQkJCQkvLyBsYXRlciB3ZSBjYW4gY2hlY2sgdGhpcyB0byBpZ25vcmUgby1BLT5vIHN0YXRlcyBpbiBjbG9zdXJlCisJCQkJCWMuc2luZ2xlQXRvbVRyYW5zaXRpb25FbWFuYXRpbmcgPSB0cnVlOworCQkJCX0KKwkJCQlhZGRSZWFjaGFibGVMYWJlbChsYWJlbCk7CisJCQl9CisJCX0KKyAgICB9CisKKwlwdWJsaWMgTkZBQ29uZmlndXJhdGlvbiBhZGRORkFDb25maWd1cmF0aW9uKE5GQVN0YXRlIHN0YXRlLAorCQkJCQkJCQkJCQkJaW50IGFsdCwKKwkJCQkJCQkJCQkJCU5GQUNvbnRleHQgY29udGV4dCwKKwkJCQkJCQkJCQkJCVNlbWFudGljQ29udGV4dCBzZW1hbnRpY0NvbnRleHQpCisJeworCQlORkFDb25maWd1cmF0aW9uIGMgPSBuZXcgTkZBQ29uZmlndXJhdGlvbihzdGF0ZS5zdGF0ZU51bWJlciwKKwkJCQkJCQkJCQkJCSAgYWx0LAorCQkJCQkJCQkJCQkJICBjb250ZXh0LAorCQkJCQkJCQkJCQkJICBzZW1hbnRpY0NvbnRleHQpOworCQlhZGRORkFDb25maWd1cmF0aW9uKHN0YXRlLCBjKTsKKwkJcmV0dXJuIGM7CisJfQorCisJLyoqIEFkZCBsYWJlbCB1bmlxdWVseSBhbmQgZGlzam9pbnRseTsgaW50ZXJzZWN0aW9uIHdpdGgKKyAgICAgKiAgYW5vdGhlciBzZXQgb3IgaW50L2NoYXIgZm9yY2VzIGJyZWFraW5nIHVwIHRoZSBzZXQocykuCisgICAgICoKKyAgICAgKiAgRXhhbXBsZSwgaWYgcmVhY2hhYmxlIGxpc3Qgb2YgbGFiZWxzIGlzIFthLi56LCB7ayw5fSwgMC4uOV0sCisgICAgICogIHRoZSBkaXNqb2ludCBsaXN0IHdpbGwgYmUgW3thLi5qLGwuLnp9LCBrLCA5LCAwLi44XS4KKyAgICAgKgorICAgICAqICBBcyB3ZSBhZGQgTkZBIGNvbmZpZ3VyYXRpb25zIHRvIGEgREZBIHN0YXRlLCB3ZSBtaWdodCBhcyB3ZWxsIHRyYWNrCisgICAgICogIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIHRyYW5zaXRpb24gbGFiZWxzIHRvIG1ha2UgdGhlIERGQSBjb252ZXJzaW9uCisgICAgICogIG1vcmUgZWZmaWNpZW50LiAgVy9vIHRoZSByZWFjaGFibGUgbGFiZWxzLCB3ZSdkIG5lZWQgdG8gY2hlY2sgdGhlCisgICAgICogIHdob2xlIHZvY2FidWxhcnkgc3BhY2UgKGNvdWxkIGJlIDAuLlx1RkZGRikhICBUaGUgcHJvYmxlbSBpcyB0aGF0CisgICAgICogIGxhYmVscyBjYW4gYmUgc2V0cywgd2hpY2ggbWF5IG92ZXJsYXAgd2l0aCBpbnQgbGFiZWxzIG9yIG90aGVyIHNldHMuCisgICAgICogIEFzIHdlIG5lZWQgYSBkZXRlcm1pbmlzdGljIHNldCBvZiB0cmFuc2l0aW9ucyBmcm9tIGFueQorICAgICAqICBzdGF0ZSBpbiB0aGUgREZBLCB3ZSBtdXN0IG1ha2UgdGhlIHJlYWNoYWJsZSBsYWJlbHMgc2V0IGRpc2pvaW50LgorICAgICAqICBUaGlzIG9wZXJhdGlvbiBhbW91bnRzIHRvIGZpbmRpbmcgdGhlIGNoYXJhY3RlciBjbGFzc2VzIGZvciB0aGlzCisgICAgICogIERGQSBzdGF0ZSB3aGVyZWFzIHdpdGggdG9vbHMgbGlrZSBmbGV4LCB0aGF0IG5lZWQgdG8gZ2VuZXJhdGUgYQorICAgICAqICBob21vZ2VuZW91cyBERkEsIG11c3QgY29tcHV0ZSBjaGFyIGNsYXNzZXMgYWNyb3NzIGFsbCBzdGF0ZXMuCisgICAgICogIFdlIGFyZSBnb2luZyB0byBnZW5lcmF0ZSBERkFzIHdpdGggaGV0ZXJvZ2VuZW91cyBzdGF0ZXMgc28gd2UKKyAgICAgKiAgb25seSBjYXJlIHRoYXQgdGhlIHNldCBvZiB0cmFuc2l0aW9ucyBvdXQgb2YgYSBzaW5nbGUgc3RhdGUgYXJlCisgICAgICogIHVuaXF1ZS4gOikKKyAgICAgKgorICAgICAqICBUaGUgaWRlYSBmb3IgYWRkaW5nIGEgbmV3IHNldCwgdCwgaXMgdG8gbG9vayBmb3Igb3ZlcmxhcCB3aXRoIHRoZQorICAgICAqICBlbGVtZW50cyBvZiBleGlzdGluZyBsaXN0IHMuICBVcG9uIG92ZXJsYXAsIHJlcGxhY2UKKyAgICAgKiAgZXhpc3Rpbmcgc2V0IHNbaV0gd2l0aCB0d28gbmV3IGRpc2pvaW50IHNldHMsIHNbaV0tdCBhbmQgc1tpXSZ0LgorICAgICAqICAoaWYgc1tpXS10IGlzIG5pbCwgZG9uJ3QgYWRkKS4gIFRoZSByZW1haW5kZXIgaXMgdC1zW2ldLCB3aGljaCBpcworICAgICAqICB3aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgc2V0IG1pbnVzIHdoYXQgd2FzIGFscmVhZHkgdGhlcmUuICBUaGUKKyAgICAgKiAgcmVtYWluZGVyIG11c3QgdGhlbiBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBpKzEuLm4gZWxlbWVudHMgaW4gcworICAgICAqICBsb29raW5nIGZvciBhbm90aGVyIGNvbGxpc2lvbi4gIEVhY2ggY29sbGlzaW9uIHJlc3VsdHMgaW4gYSBzbWFsbGVyCisgICAgICogIGFuZCBzbWFsbGVyIHJlbWFpbmRlci4gIFN0b3Agd2hlbiB5b3UgcnVuIG91dCBvZiBzIGVsZW1lbnRzIG9yCisgICAgICogIHJlbWFpbmRlciBnb2VzIHRvIG5pbC4gIElmIHJlbWFpbmRlciBpcyBub24gbmlsIHdoZW4geW91IHJ1biBvdXQgb2YKKyAgICAgKiAgcyBlbGVtZW50cywgdGhlbiBhZGQgcmVtYWluZGVyIHRvIHRoZSBlbmQuCisgICAgICoKKyAgICAgKiAgU2luZ2xlIGVsZW1lbnQgbGFiZWxzIGFyZSB0cmVhdGVkIGFzIHNldHMgdG8gbWFrZSB0aGUgY29kZSB1bmlmb3JtLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFJlYWNoYWJsZUxhYmVsKExhYmVsIGxhYmVsKSB7CisJCWlmICggcmVhY2hhYmxlTGFiZWxzPT1udWxsICkgeworCQkJcmVhY2hhYmxlTGFiZWxzID0gbmV3IE9yZGVyZWRIYXNoU2V0PExhYmVsPigpOworCQl9CisJCS8qCisJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkUmVhY2hhYmxlTGFiZWwgdG8gc3RhdGUgIitkZmEuZGVjaXNpb25OdW1iZXIrIi4iK3N0YXRlTnVtYmVyKyI6ICIrbGFiZWwuZ2V0U2V0KCkudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhcnQgb2YgYWRkIHRvIHN0YXRlICIrZGZhLmRlY2lzaW9uTnVtYmVyKyIuIitzdGF0ZU51bWJlcisiOiAiICsKKwkJCQkicmVhY2hhYmxlTGFiZWxzPSIrcmVhY2hhYmxlTGFiZWxzLnRvU3RyaW5nKCkpOworCQkJCSovCisJCWlmICggcmVhY2hhYmxlTGFiZWxzLmNvbnRhaW5zKGxhYmVsKSApIHsgLy8gZXhhY3QgbGFiZWwgcHJlc2VudAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEludFNldCB0ID0gbGFiZWwuZ2V0U2V0KCk7CisgICAgICAgIEludFNldCByZW1haW5kZXIgPSB0OyAvLyByZW1haW5kZXIgc3RhcnRzIG91dCBhcyB3aG9sZSBzZXQgdG8gYWRkCisgICAgICAgIGludCBuID0gcmVhY2hhYmxlTGFiZWxzLnNpemUoKTsgLy8gb25seSBsb29rIGF0IGluaXRpYWwgZWxlbWVudHMKKyAgICAgICAgLy8gd2FsayB0aGUgZXhpc3RpbmcgbGlzdCBsb29raW5nIGZvciB0aGUgY29sbGlzaW9uCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxuOyBpKyspIHsKKwkJCUxhYmVsIHJsID0gcmVhY2hhYmxlTGFiZWxzLmdldChpKTsKKyAgICAgICAgICAgIC8qCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBhcmluZyBbIitpKyJdOiAiK2xhYmVsLnRvU3RyaW5nKGRmYS5uZmEuZ3JhbW1hcikrIiAmICIrCisgICAgICAgICAgICAgICAgICAgIHJsLnRvU3RyaW5nKGRmYS5uZmEuZ3JhbW1hcikrIj0iKworICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24udG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSk7CisgICAgICAgICAgICAqLworCQkJaWYgKCAhTGFiZWwuaW50ZXJzZWN0KGxhYmVsLCBybCkgKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsYWJlbCsiIGNvbGxpZGVzIHdpdGggIitybCk7CisKKwkJCS8vIEZvciBhbnkgKHNfaSwgdCkgd2l0aCBzX2kmdCE9bmlsIHJlcGxhY2Ugd2l0aCAoc19pLXQsIHNfaSZ0KQorICAgICAgICAgICAgLy8gKGlnbm9yaW5nIHNfaS10IGlmIG5pbDsgZG9uJ3QgcHV0IGluIGxpc3QpCisKKyAgICAgICAgICAgIC8vIFJlcGxhY2UgZXhpc3Rpbmcgc19pIHdpdGggaW50ZXJzZWN0aW9uIHNpbmNlIHdlCisgICAgICAgICAgICAvLyBrbm93IHRoYXQgd2lsbCBhbHdheXMgYmUgYSBub24gbmlsIGNoYXJhY3RlciBjbGFzcworCQkJSW50U2V0IHNfaSA9IHJsLmdldFNldCgpOworCQkJSW50U2V0IGludGVyc2VjdGlvbiA9IHNfaS5hbmQodCk7CisgICAgICAgICAgICByZWFjaGFibGVMYWJlbHMuc2V0KGksIG5ldyBMYWJlbChpbnRlcnNlY3Rpb24pKTsKKworICAgICAgICAgICAgLy8gQ29tcHV0ZSBzX2ktdCB0byBzZWUgd2hhdCBpcyBpbiBjdXJyZW50IHNldCBhbmQgbm90IGluIGluY29taW5nCisgICAgICAgICAgICBJbnRTZXQgZXhpc3RpbmdNaW51c05ld0VsZW1lbnRzID0gc19pLnN1YnRyYWN0KHQpOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oc19pKyItIit0KyI9IitleGlzdGluZ01pbnVzTmV3RWxlbWVudHMpOworICAgICAgICAgICAgaWYgKCAhZXhpc3RpbmdNaW51c05ld0VsZW1lbnRzLmlzTmlsKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBuZXcgY2hhcmFjdGVyIGNsYXNzLCBhZGQgdG8gdGhlIGVuZCAoZG9lc24ndCBhZmZlY3QKKyAgICAgICAgICAgICAgICAvLyBvdXRlciBsb29wIGR1cmF0aW9uIGR1ZSB0byBuIGNvbXB1dGF0aW9uIGEgcHJpb3JpLgorICAgICAgICAgICAgICAgIExhYmVsIG5ld0xhYmVsID0gbmV3IExhYmVsKGV4aXN0aW5nTWludXNOZXdFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgcmVhY2hhYmxlTGFiZWxzLmFkZChuZXdMYWJlbCk7CisgICAgICAgICAgICB9CisKKwkJCS8qCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFmdGVyIGNvbGxpc2lvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICJyZWFjaGFibGVMYWJlbHM9IityZWFjaGFibGVMYWJlbHMudG9TdHJpbmcoKSk7CisJCQkJCSovCisKKyAgICAgICAgICAgIC8vIGFueXRoaW5nIGxlZnQgdG8gYWRkIHRvIHRoZSByZWFjaGFibGVMYWJlbHM/CisgICAgICAgICAgICByZW1haW5kZXIgPSB0LnN1YnRyYWN0KHNfaSk7CisgICAgICAgICAgICBpZiAoIHJlbWFpbmRlci5pc05pbCgpICkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBub3RoaW5nIGxlZnQgdG8gYWRkIHRvIHNldC4gIGRvbmUhCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHQgPSByZW1haW5kZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhcmVtYWluZGVyLmlzTmlsKCkgKSB7CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWZvcmUgYWRkIHJlbWFpbmRlciB0byBzdGF0ZSAiK2RmYS5kZWNpc2lvbk51bWJlcisiLiIrc3RhdGVOdW1iZXIrIjogIiArCisJCQkJCSJyZWFjaGFibGVMYWJlbHM9IityZWFjaGFibGVMYWJlbHMudG9TdHJpbmcoKSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBzdGF0ZSAiK2RmYS5kZWNpc2lvbk51bWJlcisiLiIrc3RhdGVOdW1iZXIrIjogIityZW1haW5kZXIudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSk7CisgICAgICAgICAgICAqLworCQkJTGFiZWwgbmV3TGFiZWwgPSBuZXcgTGFiZWwocmVtYWluZGVyKTsKKyAgICAgICAgICAgIHJlYWNoYWJsZUxhYmVscy5hZGQobmV3TGFiZWwpOworICAgICAgICB9CisJCS8qCisJCVN5c3RlbS5vdXQucHJpbnRsbigiI0VORCBvZiBhZGQgdG8gc3RhdGUgIitkZmEuZGVjaXNpb25OdW1iZXIrIi4iK3N0YXRlTnVtYmVyKyI6ICIgKworCQkJCSJyZWFjaGFibGVMYWJlbHM9IityZWFjaGFibGVMYWJlbHMudG9TdHJpbmcoKSk7CisJCQkJKi8KKyAgICB9CisKKyAgICBwdWJsaWMgT3JkZXJlZEhhc2hTZXQgZ2V0UmVhY2hhYmxlTGFiZWxzKCkgeworICAgICAgICByZXR1cm4gcmVhY2hhYmxlTGFiZWxzOworICAgIH0KKworCXB1YmxpYyB2b2lkIHNldE5GQUNvbmZpZ3VyYXRpb25zKE9yZGVyZWRIYXNoU2V0PE5GQUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3MpIHsKKwkJdGhpcy5uZmFDb25maWd1cmF0aW9ucyA9IGNvbmZpZ3M7CisJfQorCisgICAgLyoqIEEgZGVjZW50IGhhc2ggZm9yIGEgREZBIHN0YXRlIGlzIHRoZSBzdW0gb2YgdGhlIE5GQSBzdGF0ZS9hbHQgcGFpcnMuCisgICAgICogIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGFkZCBERkFTdGF0ZSBvYmplY3RzIHRvIHRoZSBERkEuc3RhdGVzIE1hcCBhbmQKKyAgICAgKiAgd2hlbiB3ZSBjb21wYXJlIERGQSBzdGF0ZXMuICBDb21wdXRlZCBpbiBhZGRORkFDb25maWd1cmF0aW9uKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlpZiAoIGNhY2hlZEhhc2hDb2RlPT0wICkgeworCQkJLy8gTEwoMSkgYWxnb3JpdGhtIGRvZXNuJ3QgdXNlIE5GQSBjb25maWd1cmF0aW9ucywgd2hpY2gKKwkJCS8vIGR5bmFtaWNhbGx5IGNvbXB1dGUgaGFzaGNvZGU7IG11c3QgaGF2ZSBzb21ldGhpbmc7IHVzZSBzdXBlcgorCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisJCX0KKwkJcmV0dXJuIGNhY2hlZEhhc2hDb2RlOworICAgIH0KKworICAgIC8qKiBUd28gREZBU3RhdGVzIGFyZSBlcXVhbCBpZiB0aGVpciBORkEgY29uZmlndXJhdGlvbiBzZXRzIGFyZSB0aGUKKwkgKiAgc2FtZS4gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZWUgaWYgYSBERkEgc3RhdGUgYWxyZWFkeSBleGlzdHMuCisJICoKKyAgICAgKiAgQmVjYXVzZSB0aGUgbnVtYmVyIG9mIGFsdGVybmF0aXZlcyBhbmQgbnVtYmVyIG9mIE5GQSBjb25maWd1cmF0aW9ucyBhcmUKKyAgICAgKiAgZmluaXRlLCB0aGVyZSBpcyBhIGZpbml0ZSBudW1iZXIgb2YgREZBIHN0YXRlcyB0aGF0IGNhbiBiZSBwcm9jZXNzZWQuCisgICAgICogIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHNob3cgdGhhdCB0aGUgYWxnb3JpdGhtIHRlcm1pbmF0ZXMuCisJICoKKwkgKiAgQ2Fubm90IHRlc3QgdGhlIERGQSBzdGF0ZSBudW1iZXJzIGhlcmUgYmVjYXVzZSBpbiBERkEuYWRkU3RhdGUgd2UgbmVlZAorCSAqICB0byBrbm93IGlmIGFueSBvdGhlciBzdGF0ZSBleGlzdHMgdGhhdCBoYXMgdGhpcyBleGFjdCBzZXQgb2YgTkZBCisJICogIGNvbmZpZ3VyYXRpb25zLiAgVGhlIERGQVN0YXRlIHN0YXRlIG51bWJlciBpcyBpcnJlbGV2YW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQkvLyBjb21wYXJlIHNldCBvZiBORkEgY29uZmlndXJhdGlvbnMgaW4gdGhpcyBzZXQgd2l0aCBvdGhlcgorICAgICAgICBERkFTdGF0ZSBvdGhlciA9IChERkFTdGF0ZSlvOworCQlyZXR1cm4gdGhpcy5uZmFDb25maWd1cmF0aW9ucy5lcXVhbHMob3RoZXIubmZhQ29uZmlndXJhdGlvbnMpOworCX0KKworICAgIC8qKiBXYWxrIGVhY2ggY29uZmlndXJhdGlvbiBhbmQgaWYgdGhleSBhcmUgYWxsIHRoZSBzYW1lIGFsdCwgcmV0dXJuCisgICAgICogIHRoYXQgYWx0IGVsc2UgcmV0dXJuIE5GQS5JTlZBTElEX0FMVF9OVU1CRVIuICBJZ25vcmUgcmVzb2x2ZWQKKyAgICAgKiAgY29uZmlndXJhdGlvbnMsIGJ1dCBkb24ndCBpZ25vcmUgcmVzb2x2ZVdpdGhQcmVkaWNhdGUgY29uZmlncworICAgICAqICBiZWNhdXNlIHRoaXMgc3RhdGUgc2hvdWxkIG5vdCBiZSBhbiBhY2NlcHQgc3RhdGUuICBXZSBuZWVkIHRvIGFkZAorICAgICAqICB0aGlzIHRvIHRoZSB3b3JrIGxpc3QgYW5kIHRoZW4gaGF2ZSBzZW1hbnRpYyBwcmVkaWNhdGUgZWRnZXMKKyAgICAgKiAgZW1hbmF0aW5nIGZyb20gaXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRVbmlxdWVseVByZWRpY3RlZEFsdCgpIHsKKwkJaWYgKCBjYWNoZWRVbmlxdWVseVByZWRpY2F0ZWRBbHQhPVBSRURJQ1RFRF9BTFRfVU5TRVQgKSB7CisJCQlyZXR1cm4gY2FjaGVkVW5pcXVlbHlQcmVkaWNhdGVkQWx0OworCQl9CisgICAgICAgIGludCBhbHQgPSBORkEuSU5WQUxJRF9BTFRfTlVNQkVSOworCQlpbnQgbnVtQ29uZmlncyA9IG5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCU5GQUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChORkFDb25maWd1cmF0aW9uKSBuZmFDb25maWd1cmF0aW9ucy5nZXQoaSk7CisJCQkvLyBpZ25vcmUgYW55dGhpbmcgd2UgcmVzb2x2ZWQ7IHByZWRpY2F0ZXMgd2lsbCBzdGlsbCByZXN1bHQKKwkJCS8vIGluIHRyYW5zaXRpb25zIG91dCBvZiB0aGlzIHN0YXRlLCBzbyBtdXN0IGNvdW50IHRob3NlCisJCQkvLyBjb25maWd1cmF0aW9uczsgaS5lLiwgZG9uJ3QgaWdub3JlIHJlc29sdmVXaXRoUHJlZGljYXRlIGNvbmZpZ3MKKwkJCWlmICggY29uZmlndXJhdGlvbi5yZXNvbHZlZCApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICggYWx0PT1ORkEuSU5WQUxJRF9BTFRfTlVNQkVSICkgeworCQkJCWFsdCA9IGNvbmZpZ3VyYXRpb24uYWx0OyAvLyBmb3VuZCBmaXJzdCBub25yZXNvbHZlZCBhbHQKKwkJCX0KKwkJCWVsc2UgaWYgKCBjb25maWd1cmF0aW9uLmFsdCE9YWx0ICkgeworCQkJCXJldHVybiBORkEuSU5WQUxJRF9BTFRfTlVNQkVSOworCQkJfQorCQl9CisJCXRoaXMuY2FjaGVkVW5pcXVlbHlQcmVkaWNhdGVkQWx0ID0gYWx0OworICAgICAgICByZXR1cm4gYWx0OworICAgIH0KKworCS8qKiBSZXR1cm4gdGhlIHVuaXF1ZWx5IG1lbnRpb25lZCBhbHQgZnJvbSB0aGUgTkZBIGNvbmZpZ3VyYXRpb25zOworCSAqICBJZ25vcmUgdGhlIHJlc29sdmVkIGJpdCBldGMuLi4gIFJldHVybiBJTlZBTElEX0FMVF9OVU1CRVIKKwkgKiAgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhbHQgbWVudGlvbmVkLgorCSAqLyAKKwlwdWJsaWMgaW50IGdldFVuaXF1ZUFsdCgpIHsKKwkJaW50IGFsdCA9IE5GQS5JTlZBTElEX0FMVF9OVU1CRVI7CisJCWludCBudW1Db25maWdzID0gbmZhQ29uZmlndXJhdGlvbnMuc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworCQkJTkZBQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKE5GQUNvbmZpZ3VyYXRpb24pIG5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCWlmICggYWx0PT1ORkEuSU5WQUxJRF9BTFRfTlVNQkVSICkgeworCQkJCWFsdCA9IGNvbmZpZ3VyYXRpb24uYWx0OyAvLyBmb3VuZCBmaXJzdCBhbHQKKwkJCX0KKwkJCWVsc2UgaWYgKCBjb25maWd1cmF0aW9uLmFsdCE9YWx0ICkgeworCQkJCXJldHVybiBORkEuSU5WQUxJRF9BTFRfTlVNQkVSOworCQkJfQorCQl9CisJCXJldHVybiBhbHQ7CisJfQorCisJLyoqIFdoZW4gbW9yZSB0aGFuIG9uZSBhbHRlcm5hdGl2ZSBjYW4gbWF0Y2ggdGhlIHNhbWUgaW5wdXQsIHRoZSBmaXJzdAorCSAqICBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4gdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QuICBUaGUgb3RoZXIgYWx0cworCSAqICBhcmUgInR1cm5lZCBvZmYiIGJ5IHNldHRpbmcgdGhlICJyZXNvbHZlZCIgZmxhZyBpbiB0aGUgTkZBCisJICogIGNvbmZpZ3VyYXRpb25zLiAgUmV0dXJuIHRoZSBzZXQgb2YgZGlzYWJsZWQgYWx0ZXJuYXRpdmVzLiAgRm9yCisJICoKKwkgKiAgYSA6IEEgfCBBIHwgQSA7CisJICoKKwkgKiAgdGhpcyBtZXRob2QgcmV0dXJucyB7MiwzfSBhcyBkaXNhYmxlZC4gIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0CisJICogIHRoZSBhbHRlcm5hdGl2ZSBpcyB0b3RhbGx5IHVucmVhY2hhYmxlLCBpdCBqdXN0IG1lYW5zIHRoYXQgZm9yIHRoaXMKKwkgKiAgREZBIHN0YXRlLCB0aGF0IGFsdCBpcyBkaXNhYmxlZC4gIFRoZXJlIG1heSBiZSBvdGhlciBhY2NlcHQgc3RhdGVzCisJICogIGZvciB0aGF0IGFsdC4KKwkgKi8KKwlwdWJsaWMgU2V0IGdldERpc2FibGVkQWx0ZXJuYXRpdmVzKCkgeworCQlTZXQgZGlzYWJsZWQgPSBuZXcgTGlua2VkSGFzaFNldCgpOworCQlpbnQgbnVtQ29uZmlncyA9IG5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCU5GQUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChORkFDb25maWd1cmF0aW9uKSBuZmFDb25maWd1cmF0aW9ucy5nZXQoaSk7CisJCQlpZiAoIGNvbmZpZ3VyYXRpb24ucmVzb2x2ZWQgKSB7CisJCQkJZGlzYWJsZWQuYWRkKFV0aWxzLmludGVnZXIoY29uZmlndXJhdGlvbi5hbHQpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGlzYWJsZWQ7CisJfQorCisJcHJvdGVjdGVkIFNldCBnZXROb25EZXRlcm1pbmlzdGljQWx0cygpIHsKKwkJaW50IHVzZXJfayA9IGRmYS5nZXRVc2VyTWF4TG9va2FoZWFkKCk7CisJCWlmICggdXNlcl9rPjAgJiYgdXNlcl9rPT1rICkgeworCQkJLy8gaWYgZml4ZWQgbG9va2FoZWFkLCB0aGVuIG1vcmUgdGhhbiAxIGFsdCBpcyBhIG5vbmRldGVybWluaXNtCisJCQkvLyBpZiB3ZSBoYXZlIGhpdCB0aGUgbWF4IGxvb2thaGVhZAorCQkJcmV0dXJuIGdldEFsdFNldCgpOworCQl9CisJCWVsc2UgaWYgKCBhYm9ydGVkRHVlVG9NdWx0aXBsZVJlY3Vyc2l2ZUFsdHMgfHwgYWJvcnRlZER1ZVRvUmVjdXJzaW9uT3ZlcmZsb3cgKSB7CisJCQkvLyBpZiB3ZSBoYWQgdG8gYWJvcnQgZm9yIG5vbi1MTCgqKSBzdGF0ZSBhc3N1bWUgYWxsIGFsdHMgYXJlIGEgcHJvYmxlbQorCQkJcmV0dXJuIGdldEFsdFNldCgpOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIGdldENvbmZsaWN0aW5nQWx0cygpOworCQl9CisJfQorCisgICAgLyoqIFdhbGsgZWFjaCBORkEgY29uZmlndXJhdGlvbiBpbiB0aGlzIERGQSBzdGF0ZSBsb29raW5nIGZvciBhIGNvbmZsaWN0CisgICAgICogIHdoZXJlIChzfGl8Y3R4KSBhbmQgKHN8anxjdHgpIGV4aXN0LCBpbmRpY2F0aW5nIHRoYXQgc3RhdGUgcyB3aXRoCisgICAgICogIGNvbnRleHQgY29uZmxpY3RpbmcgY3R4IHByZWRpY3RzIGFsdHMgaSBhbmQgai4gIFJldHVybiBhbiBJbnRlZ2VyIHNldAorCSAqICBvZiB0aGUgYWx0ZXJuYXRpdmUgbnVtYmVycyB0aGF0IGNvbmZsaWN0LiAgVHdvIGNvbnRleHRzIGNvbmZsaWN0IGlmCisJICogIHRoZXkgYXJlIGVxdWFsIG9yIG9uZSBpcyBhIHN0YWNrIHN1ZmZpeCBvZiB0aGUgb3RoZXIgb3Igb25lIGlzCisJICogIHRoZSBlbXB0eSBjb250ZXh0LgorCSAqCisgICAgICogIFVzZSBhIGhhc2ggdGFibGUgdG8gcmVjb3JkIHRoZSBsaXN0cyBvZiBjb25maWdzIGZvciBlYWNoIHN0YXRlCisJICogIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkLiAgV2UgbmVlZCBvbmx5IGNvbnNpZGVyIHN0YXRlcyBmb3Igd2hpY2gKKwkgKiAgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uLiAgVGhlIGNvbmZpZ3VyYXRpb25zJyBwcmVkaWN0ZWQKKwkgKiAgYWx0IG11c3QgYmUgZGlmZmVyZW50IG9yIG11c3QgaGF2ZSBkaWZmZXJlbnQgY29udGV4dHMgdG8gYXZvaWQgYQorCSAqICBjb25mbGljdC4KKwkgKgorCSAqICBEb24ndCByZXBvcnQgY29uZmxpY3RzIGZvciBERkEgc3RhdGVzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBUb2tlbnMKKwkgKiAgcnVsZSBORkEgc3RhdGVzOyB0aGV5IHdpbGwgYmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgdGhlIGZpcnN0IHJ1bGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldDxJbnRlZ2VyPiBnZXRDb25mbGljdGluZ0FsdHMoKSB7CisJCS8vIFRPRE8gdGhpcyBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXM6IGNhY2hlIHJlc3VsdD8KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldE5vbmRldEFsdHMgZm9yIERGQSBzdGF0ZSAiK3N0YXRlTnVtYmVyKTsKKyAJCVNldDxJbnRlZ2VyPiBub25kZXRlcm1pbmlzdGljQWx0cyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisKKwkJLy8gSWYgb25seSAxIE5GQSBjb25mIHRoZW4gbm8gd2F5IGl0IGNhbiBiZSBub25kZXRlcm1pbmlzdGljOworCQkvLyBzYXZlIHRoZSBvdmVyaGVhZC4gIFRoZXJlIGFyZSBtYW55IG8tYS0+byBORkEgdHJhbnNpdGlvbnMKKwkJLy8gYW5kIHNvIHdlIHNhdmUgYSBoYXNoIG1hcCBhbmQgaXRlcmF0b3IgY3JlYXRpb24gZm9yIGVhY2gKKwkJLy8gc3RhdGUuCisJCWludCBudW1Db25maWdzID0gbmZhQ29uZmlndXJhdGlvbnMuc2l6ZSgpOworCQlpZiAoIG51bUNvbmZpZ3MgPD0xICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBGaXJzdCBnZXQgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zIGZvciBlYWNoIHN0YXRlLgorCQkvLyBNb3N0IG9mIHRoZSB0aW1lLCBlYWNoIHN0YXRlIHdpbGwgaGF2ZSBvbmUgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9uLgorCQlNdWx0aU1hcDxJbnRlZ2VyLCBORkFDb25maWd1cmF0aW9uPiBzdGF0ZVRvQ29uZmlnTGlzdE1hcCA9CisJCQluZXcgTXVsdGlNYXA8SW50ZWdlciwgTkZBQ29uZmlndXJhdGlvbj4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCU5GQUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChORkFDb25maWd1cmF0aW9uKSBuZmFDb25maWd1cmF0aW9ucy5nZXQoaSk7CisJCQlJbnRlZ2VyIHN0YXRlSSA9IFV0aWxzLmludGVnZXIoY29uZmlndXJhdGlvbi5zdGF0ZSk7CisJCQlzdGF0ZVRvQ29uZmlnTGlzdE1hcC5tYXAoc3RhdGVJLCBjb25maWd1cmF0aW9uKTsKKwkJfQorCQkvLyBwb3RlbnRpYWwgY29uZmxpY3RzIGFyZSBzdGF0ZXMgd2l0aCA+IDEgY29uZmlndXJhdGlvbiBhbmQgZGlmZiBhbHRzCisJCVNldCBzdGF0ZXMgPSBzdGF0ZVRvQ29uZmlnTGlzdE1hcC5rZXlTZXQoKTsKKwkJaW50IG51bVBvdGVudGlhbENvbmZsaWN0cyA9IDA7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBzdGF0ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJSW50ZWdlciBzdGF0ZUkgPSAoSW50ZWdlcikgaXQubmV4dCgpOworCQkJYm9vbGVhbiB0aGlzU3RhdGVIYXNQb3RlbnRpYWxQcm9ibGVtID0gZmFsc2U7CisJCQlMaXN0IGNvbmZpZ3NGb3JTdGF0ZSA9IChMaXN0KXN0YXRlVG9Db25maWdMaXN0TWFwLmdldChzdGF0ZUkpOworCQkJaW50IGFsdD0wOworCQkJaW50IG51bUNvbmZpZ3NGb3JTdGF0ZSA9IGNvbmZpZ3NGb3JTdGF0ZS5zaXplKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3NGb3JTdGF0ZSAmJiBudW1Db25maWdzRm9yU3RhdGU+MSA7IGkrKykgeworCQkJCU5GQUNvbmZpZ3VyYXRpb24gYyA9IChORkFDb25maWd1cmF0aW9uKSBjb25maWdzRm9yU3RhdGUuZ2V0KGkpOworCQkJCWlmICggYWx0PT0wICkgeworCQkJCQlhbHQgPSBjLmFsdDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIGMuYWx0IT1hbHQgKSB7CisJCQkJCS8qCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicG90ZW50aWFsIGNvbmZsaWN0IGluIHN0YXRlICIrc3RhdGVJKworCQkJCQkJCQkJICAgIiBjb25maWdzOiAiK2NvbmZpZ3NGb3JTdGF0ZSk7CisJCQkJCSovCisJCQkJCS8vIDExLzI4LzIwMDU6IGRvbid0IHJlcG9ydCBjbG9zdXJlcyB0aGF0IHBpbmNoIGJhY2sKKwkJCQkJLy8gdG9nZXRoZXIgaW4gVG9rZW5zIHJ1bGUuICBXZSB3YW50IHRvIHNpbGVudGx5IHJlc29sdmUKKwkJCQkJLy8gdG8gdGhlIGZpcnN0IHRva2VuIGRlZmluaXRpb24gYWxhIGxleC9mbGV4IGJ5IGlnbm9yaW5nCisJCQkJCS8vIHRoZXNlIGNvbmZsaWN0cy4KKwkJCQkJLy8gQWxzbyB0aGlzIGVuc3VyZXMgdGhhdCBsZXhlcnMgbG9vayBmb3IgbW9yZSBhbmQgbW9yZQorCQkJCQkvLyBjaGFyYWN0ZXJzIChsb25nZXN0IG1hdGNoKSBiZWZvcmUgcmVzb3J0aW5nIHRvIHByZWRpY2F0ZXMuCisJCQkJCS8vIFRlc3RTZW1hbnRpY1ByZWRpY2F0ZXMudGVzdExleGVyTWF0Y2hlc0xvbmdlc3RUaGVuVGVzdFByZWQoKQorCQkJCQkvLyBmb3IgZXhhbXBsZSB3b3VsZCB0ZXJtaW5hdGUgYXQgc3RhdGUgczEgYW5kIHRlc3QgcHJlZGljYXRlCisJCQkJCS8vIG1lYW5pbmcgaW5wdXQgImFiIiB3b3VsZCB0ZXN0IHByZWRzIHRvIGRlY2lkZSB3aGF0IHRvCisJCQkJCS8vIGRvIGJ1dCBpdCBzaG91bGQgbWF0Y2ggcnVsZSBDIHcvbyB0ZXN0aW5nIHByZWRzLgorCQkJCQlpZiAoIGRmYS5uZmEuZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSIHx8CisJCQkJCQkgIWRmYS5kZWNpc2lvbk5GQVN0YXJ0U3RhdGUuZW5jbG9zaW5nUnVsZS5uYW1lLmVxdWFscyhHcmFtbWFyLkFSVElGSUNJQUxfVE9LRU5TX1JVTEVOQU1FKSApCisJCQkJCXsKKwkJCQkJCW51bVBvdGVudGlhbENvbmZsaWN0cysrOworCQkJCQkJdGhpc1N0YXRlSGFzUG90ZW50aWFsUHJvYmxlbSA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAoICF0aGlzU3RhdGVIYXNQb3RlbnRpYWxQcm9ibGVtICkgeworCQkJCS8vIHJlbW92ZSBORkEgc3RhdGUncyBjb25maWd1cmF0aW9ucyBmcm9tCisJCQkJLy8gZnVydGhlciBjaGVja2luZzsgbm8gaXNzdWVzIHdpdGggaXQKKwkJCQkvLyAoY2FuJ3QgcmVtb3ZlIGFzIGl0J3MgY29uY3VycmVudCBtb2RpZmljYXRpb247IHNldCB0byBudWxsKQorCQkJCXN0YXRlVG9Db25maWdMaXN0TWFwLnB1dChzdGF0ZUksIG51bGwpOworCQkJfQorCQl9CisKKwkJLy8gYSBmYXN0IGNoZWNrIGZvciBwb3RlbnRpYWwgaXNzdWVzOyBtb3N0IHN0YXRlcyBoYXZlIG5vbmUKKwkJaWYgKCBudW1Qb3RlbnRpYWxDb25mbGljdHM9PTAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIHdlIGhhdmUgYSBwb3RlbnRpYWwgcHJvYmxlbSwgc28gbm93IGdvIHRocm91Z2ggY29uZmlnIGxpc3RzIGFnYWluCisJCS8vIGxvb2tpbmcgZm9yIGRpZmZlcmVudCBhbHRzIChvbmx5IHN0YXRlcyB3aXRoIHBvdGVudGlhbCBpc3N1ZXMKKwkJLy8gYXJlIGxlZnQgaW4gdGhlIHN0YXRlcyBzZXQpLiAgTm93IHdlIHdpbGwgY2hlY2sgY29udGV4dC4KKwkJLy8gRm9yIGV4YW1wbGUsIHRoZSBsaXN0IG9mIGNvbmZpZ3MgZm9yIE5GQSBzdGF0ZSAzIGluIHNvbWUgREZBCisJCS8vIHN0YXRlIG1pZ2h0IGJlOgorCQkvLyAgIFszfDJ8WzI4IDE4ICRdLCAzfDF8WzI4ICRdLCAzfDEsIDN8Ml0KKwkJLy8gSSB3YW50IHRvIGNyZWF0ZSBhIG1hcCBmcm9tIGNvbnRleHQgdG8gYWx0cyBsb29raW5nIGZvciBvdmVybGFwOgorCQkvLyAgIFsyOCAxOCAkXSAtPiAyCisJCS8vICAgWzI4ICRdIC0+IDEKKwkJLy8gICBbJF0gLT4gMSwyCisJCS8vIEluZGVlZCBhIGNvbmZsaWN0IGV4aXN0cyBhcyBzYW1lIHN0YXRlIDMsIHNhbWUgY29udGV4dCBbJF0sIHByZWRpY3RzCisJCS8vIGFsdHMgMSBhbmQgMi4KKwkJLy8gd2FsayBlYWNoIHN0YXRlIHdpdGggcG90ZW50aWFsIGNvbmZsaWN0aW5nIGNvbmZpZ3VyYXRpb25zCisJCWZvciAoSXRlcmF0b3IgaXQgPSBzdGF0ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJSW50ZWdlciBzdGF0ZUkgPSAoSW50ZWdlcikgaXQubmV4dCgpOworCQkJTGlzdCBjb25maWdzRm9yU3RhdGUgPSAoTGlzdClzdGF0ZVRvQ29uZmlnTGlzdE1hcC5nZXQoc3RhdGVJKTsKKwkJCS8vIGNvbXBhcmUgZWFjaCBjb25maWd1cmF0aW9uIHBhaXIgcywgdCB0byBlbnN1cmU6CisJCQkvLyBzLmN0eCBkaWZmZXJlbnQgdGhhbiB0LmN0eCBpZiBzLmFsdCAhPSB0LmFsdAorCQkJaW50IG51bUNvbmZpZ3NGb3JTdGF0ZSA9IDA7CisJCQlpZiAoIGNvbmZpZ3NGb3JTdGF0ZSE9bnVsbCApIHsKKwkJCQludW1Db25maWdzRm9yU3RhdGUgPSBjb25maWdzRm9yU3RhdGUuc2l6ZSgpOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzRm9yU3RhdGU7IGkrKykgeworCQkJCU5GQUNvbmZpZ3VyYXRpb24gcyA9IChORkFDb25maWd1cmF0aW9uKSBjb25maWdzRm9yU3RhdGUuZ2V0KGkpOworCQkJCWZvciAoaW50IGogPSBpKzE7IGogPCBudW1Db25maWdzRm9yU3RhdGU7IGorKykgeworCQkJCQlORkFDb25maWd1cmF0aW9uIHQgPSAoTkZBQ29uZmlndXJhdGlvbiljb25maWdzRm9yU3RhdGUuZ2V0KGopOworCQkJCQkvLyBjb25mbGljdHMgbWVhbnMgcy5jdHg9PXQuY3R4IG9yIHMuY3R4IGlzIGEgc3RhY2sKKwkJCQkJLy8gc3VmZml4IG9mIHQuY3R4IG9yIHZpY2UgdmVyc2EgKGlmIGFsdHMgZGlmZmVyKS4KKwkJCQkJLy8gQWxzbyBhIGNvbmZsaWN0IGlmIHMuY3R4IG9yIHQuY3R4IGlzIGVtcHR5CisJCQkJCWlmICggcy5hbHQgIT0gdC5hbHQgJiYgcy5jb250ZXh0LmNvbmZsaWN0c1dpdGgodC5jb250ZXh0KSApIHsKKwkJCQkJCW5vbmRldGVybWluaXN0aWNBbHRzLmFkZChVdGlscy5pbnRlZ2VyKHMuYWx0KSk7CisJCQkJCQlub25kZXRlcm1pbmlzdGljQWx0cy5hZGQoVXRpbHMuaW50ZWdlcih0LmFsdCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCBub25kZXRlcm1pbmlzdGljQWx0cy5zaXplKCk9PTAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorICAgICAgICByZXR1cm4gbm9uZGV0ZXJtaW5pc3RpY0FsdHM7CisgICAgfQorCisJLyoqIEdldCB0aGUgc2V0IG9mIGFsbCBhbHRzIG1lbnRpb25lZCBieSBhbGwgTkZBIGNvbmZpZ3VyYXRpb25zIGluIHRoaXMKKwkgKiAgREZBIHN0YXRlLgorCSAqLworCXB1YmxpYyBTZXQgZ2V0QWx0U2V0KCkgeworCQlpbnQgbnVtQ29uZmlncyA9IG5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJU2V0IGFsdHMgPSBuZXcgSGFzaFNldCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworCQkJTkZBQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKE5GQUNvbmZpZ3VyYXRpb24pIG5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCWFsdHMuYWRkKFV0aWxzLmludGVnZXIoY29uZmlndXJhdGlvbi5hbHQpKTsKKwkJfQorCQlpZiAoIGFsdHMuc2l6ZSgpPT0wICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGFsdHM7CisJfQorCisJcHVibGljIFNldCBnZXRHYXRlZFN5bnRhY3RpY1ByZWRpY2F0ZXNJbk5GQUNvbmZpZ3VyYXRpb25zKCkgeworCQlpbnQgbnVtQ29uZmlncyA9IG5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJU2V0PFNlbWFudGljQ29udGV4dD4gc3lucHJlZHMgPSBuZXcgSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisJCQlORkFDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoTkZBQ29uZmlndXJhdGlvbikgbmZhQ29uZmlndXJhdGlvbnMuZ2V0KGkpOworCQkJU2VtYW50aWNDb250ZXh0IGdhdGVkUHJlZEV4cHIgPQorCQkJCWNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0LmdldEdhdGVkUHJlZGljYXRlQ29udGV4dCgpOworCQkJLy8gaWYgdGhpcyBpcyBhIG1hbnVhbCBzeW4gcHJlZCAoZ2F0ZWQgYW5kIHN5biBwcmVkKSwgYWRkCisJCQlpZiAoIGdhdGVkUHJlZEV4cHIhPW51bGwgJiYKKwkJCQkgY29uZmlndXJhdGlvbi5zZW1hbnRpY0NvbnRleHQuaXNTeW50YWN0aWNQcmVkaWNhdGUoKSApCisJCQl7CisJCQkJc3lucHJlZHMuYWRkKGNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0KTsKKwkJCX0KKwkJfQorCQlpZiAoIHN5bnByZWRzLnNpemUoKT09MCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBzeW5wcmVkczsKKwl9CisKKwkvKiogRm9yIGdhdGVkIHByb2R1Y3Rpb25zLCB3ZSBuZWVkIGFuIE9SJ2QgbGlzdCBvZiBhbGwgcHJlZGljYXRlcyBmb3IgdGhlCisJICogIHRhcmdldCBvZiBhbiBlZGdlIHNvIHdlIGNhbiBnYXRlIHRoZSBlZGdlIGJhc2VkIHVwb24gdGhlIHByZWRpY2F0ZXMKKwkgKiAgYXNzb2NpYXRlZCB3aXRoIHRha2luZyB0aGF0IHBhdGggKGlmIGFueSkuCisJICoKKwkgKiAgRm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLCB3ZSBvbmx5IHdhbnQgdG8gZ2VuZXJhdGUgcHJlZGljYXRlCisJICogIGV2YWx1YXRpb25zIGFzIGl0IHRyYW5zaXRpb25zIHRvIGFuIGFjY2VwdCBzdGF0ZTsgd2FzdGUgdG8KKwkgKiAgZG8gaXQgZWFybGllci4gIFNvLCBvbmx5IGFkZCBnYXRlZCBwcmVkcyBkZXJpdmVkIGZyb20gbWFudWFsbHktCisJICogIHNwZWNpZmllZCBzeW50YWN0aWMgcHJlZGljYXRlcyBpZiB0aGlzIGlzIGFuIGFjY2VwdCBzdGF0ZS4KKwkgKgorCSAqICBBbHNvLCBzaW5jZSBjb25maWd1cmF0aW9ucyB3L28gZ2F0ZWQgcHJlZGljYXRlcyBhcmUgbGlrZSB0cnVlCisJICogIGdhdGVkIHByZWRpY2F0ZXMsIGZpbmRpbmcgYSBjb25maWd1cmF0aW9uIHdob3NlIGFsdCBoYXMgbm8gZ2F0ZWQKKwkgKiAgcHJlZGljYXRlIGltcGxpZXMgd2Ugc2hvdWxkIGV2YWx1YXRlIHRoZSBwcmVkaWNhdGUgdG8gdHJ1ZS4gVGhpcworCSAqICBtZWFucyB0aGUgd2hvbGUgZWRnZSBoYXMgdG8gYmUgdW5nYXRlZC4gQ29uc2lkZXI6CisJICoKKwkgKgkgWCA6ICgnYScgfCB7cH0/PT4gJ2EnKQorCSAqCSAgIHwgJ2EnICdiJworCSAqCSAgIDsKKwkgKgorCSAqICBIZXJlLCB5b3UgJ2EnIGdldHMgeW91IGZyb20gczAgdG8gczEgYnV0IHlvdSBjYW4ndCB0ZXN0IHAgYmVjYXVzZQorCSAqICBwbGFpbiAnYScgaXMgb2suICBJdCdzIGFsc28gb2sgZm9yIHN0YXJ0aW5nIGFsdCAyLiAgSGVuY2UsIHlvdSBjYW4ndAorCSAqICB0ZXN0IHAuICBFdmVuIG9uIHRoZSBlZGdlIGdvaW5nIHRvIGFjY2VwdCBzdGF0ZSBmb3IgYWx0IDEgb2YgWCwgeW91CisJICogIGNhbid0IHRlc3QgcC4gIFlvdSBjYW4gZ2V0IHRvIHRoZSBzYW1lIHBsYWNlIHdpdGggYW5kIHcvbyB0aGUgY29udGV4dC4KKwkgKiAgVGhlcmVmb3JlLCBpdCBpcyBuZXZlciBvayB0byB0ZXN0IHAgaW4gdGhpcyBzaXR1YXRpb24uIAorCSAqCisJICogIFRPRE86IGNhY2hlIHRoaXMgYXMgaXQncyBjYWxsZWQgYSBsb3Q7IG9yIGF0IGxlYXN0IHNldCBiaXQgaWYgPjEgcHJlc2VudCBpbiBzdGF0ZQorCSAqLworCXB1YmxpYyBTZW1hbnRpY0NvbnRleHQgZ2V0R2F0ZWRQcmVkaWNhdGVzSW5ORkFDb25maWd1cmF0aW9ucygpIHsKKwkJU2VtYW50aWNDb250ZXh0IHVuaW9uT2ZQcmVkaWNhdGVzRnJvbUFsbEFsdHMgPSBudWxsOworCQlpbnQgbnVtQ29uZmlncyA9IG5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCU5GQUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChORkFDb25maWd1cmF0aW9uKSBuZmFDb25maWd1cmF0aW9ucy5nZXQoaSk7CisJCQlTZW1hbnRpY0NvbnRleHQgZ2F0ZWRQcmVkRXhwciA9CisJCQkJY29uZmlndXJhdGlvbi5zZW1hbnRpY0NvbnRleHQuZ2V0R2F0ZWRQcmVkaWNhdGVDb250ZXh0KCk7CisJCQlpZiAoIGdhdGVkUHJlZEV4cHI9PW51bGwgKSB7CisJCQkJLy8gaWYgd2UgZXZlciBmaW5kIGEgY29uZmlndXJhdGlvbiB3L28gYSBnYXRlZCBwcmVkaWNhdGUKKwkJCQkvLyAoZXZlbiBpZiBpdCdzIGEgbm9uZ2F0ZWQgcHJlZGljYXRlKSwgd2UgY2Fubm90IGdhdGUKKwkJCQkvLyB0aGUgaW5kaWRlbnQgZWRnZXMuCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQllbHNlIGlmICggYWNjZXB0U3RhdGUgfHwgIWNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0LmlzU3ludGFjdGljUHJlZGljYXRlKCkgKSB7CisJCQkJLy8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgZ2F0ZWQgcHJlZGljYXRlIGFuZCwgZHVlIHRvIGVsc2VpZiwKKwkJCQkvLyB3ZSBrbm93IGl0J3MgYW4gYWNjZXB0IG9yIG5vdCBhIHN5biBwcmVkLiAgSW4gdGhpcyBjYXNlLAorCQkJCS8vIGl0J3Mgc2FmZSB0byBhZGQgdGhlIGdhdGVkIHByZWRpY2F0ZSB0byB0aGUgdW5pb24uICBXZQorCQkJCS8vIG9ubHkgd2FudCB0byBhZGQgc3luIHByZWRzIGlmIGl0J3MgYW4gYWNjZXB0IHN0YXRlLiAgT3RoZXIKKwkJCQkvLyBnYXRlZCBwcmVkcyBjYW4gYmUgdXNlZCB3aXRoIGVkZ2VzIGxlYWRpbmcgdG8gYWNjZXB0IHN0YXRlcy4KKwkJCQlpZiAoIHVuaW9uT2ZQcmVkaWNhdGVzRnJvbUFsbEFsdHM9PW51bGwgKSB7CisJCQkJCXVuaW9uT2ZQcmVkaWNhdGVzRnJvbUFsbEFsdHMgPSBnYXRlZFByZWRFeHByOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJdW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyA9CisJCQkJCQlTZW1hbnRpY0NvbnRleHQub3IodW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyxnYXRlZFByZWRFeHByKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCB1bmlvbk9mUHJlZGljYXRlc0Zyb21BbGxBbHRzIGluc3RhbmNlb2YgU2VtYW50aWNDb250ZXh0LlRydWVQcmVkaWNhdGUgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0czsKKwl9CisKKyAgICAvKiogSXMgYW4gYWNjZXB0IHN0YXRlIHJlYWNoYWJsZSBmcm9tIHRoaXMgc3RhdGU/ICovCisgICAgcHVibGljIGludCBnZXRBY2NlcHRTdGF0ZVJlYWNoYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGFjY2VwdFN0YXRlUmVhY2hhYmxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2VwdFN0YXRlUmVhY2hhYmxlKGludCBhY2NlcHRTdGF0ZVJlYWNoYWJsZSkgeworICAgICAgICB0aGlzLmFjY2VwdFN0YXRlUmVhY2hhYmxlID0gYWNjZXB0U3RhdGVSZWFjaGFibGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzKCkgeworICAgICAgICByZXR1cm4gcmVzb2x2ZWRXaXRoUHJlZGljYXRlczsKKyAgICB9CisKKyAgICAvKiogUHJpbnQgYWxsIE5GQSBzdGF0ZXMgcGx1cyB3aGF0IGFsdHMgdGhleSBwcmVkaWN0ICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZChzdGF0ZU51bWJlcisiOnsiKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZmFDb25maWd1cmF0aW9ucy5zaXplKCk7IGkrKykgeworCQkJTkZBQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKE5GQUNvbmZpZ3VyYXRpb24pIG5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCWlmICggaT4wICkgeworCQkJCWJ1Zi5hcHBlbmQoIiwgIik7CisJCQl9CisJCQlidWYuYXBwZW5kKGNvbmZpZ3VyYXRpb24pOworCQl9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworCXB1YmxpYyBpbnQgZ2V0TG9va2FoZWFkRGVwdGgoKSB7CisJCXJldHVybiBrOworCX0KKworCXB1YmxpYyB2b2lkIHNldExvb2thaGVhZERlcHRoKGludCBrKSB7CisJCXRoaXMuayA9IGs7CisJCWlmICggayA+IGRmYS5tYXhfayApIHsgLy8gdHJhY2sgbWF4IGsgZm9yIGVudGlyZSBERkEKKwkJCWRmYS5tYXhfayA9IGs7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0RlY2lzaW9uUHJvYmUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0RlY2lzaW9uUHJvYmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRkMzkzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvRGVjaXNpb25Qcm9iZS5qYXZhCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuTXVsdGlNYXA7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hckFTVDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKiogQ29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGlzIHdyb25nIHdpdGggYSBkZWNpc2lvbiBhcworICogIGRpc2NvdmVyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIERGQSBwcmVkaWN0b3IuCisgKgorICogIFRoZSBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgZHVyaW5nIE5GQS0+REZBIGNvbnZlcnNpb24gYW5kLCB3aGlsZQorICogIHNvbWUgb2YgdGhpcyBpcyBhdmFpbGFibGUgZWxzZXdoZXJlLCBpdCBpcyBuaWNlIHRvIGhhdmUgaXQgYWxsIHRyYWNrZWQKKyAqICBpbiBvbmUgc3BvdCBzbyBhIGdyZWF0IGVycm9yIG1lc3NhZ2UgY2FuIGJlIGVhc2lseSBoYWQuICBJIGFsc28gbGlrZQorICogIHRoZSBmYWN0IHRoYXQgdGhpcyBvYmplY3QgdHJhY2tzIGl0IGFsbCBmb3IgbGF0ZXIgcGVydXNpbmcgdG8gbWFrZSBhbgorICogIGV4Y2VsbGVudCBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgbG90cyBvZiBpbXByZWNpc2Ugb24tdGhlLWZseSB3YXJuaW5ncworICogIChkdXJpbmcgY29udmVyc2lvbikuCisgKgorICogIEEgZGVjaXNpb24gbm9ybWFsbHkgb25seSBoYXMgb25lIHByb2JsZW07IGUuZy4sIHNvbWUgaW5wdXQgc2VxdWVuY2UKKyAqICBjYW4gYmUgbWF0Y2hlZCBieSBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMuICBVbmZvcnR1bmF0ZWx5LCBzb21lIGRlY2lzaW9ucworICogIHN1Y2ggYXMKKyAqCisgKiAgYSA6ICggQSB8IEIgKSB8ICggQSB8IEIgKSB8IEEgOworICoKKyAqICBoYXZlIG11bHRpcGxlIHByb2JsZW1zLiAgU28gaW4gZ2VuZXJhbCwgeW91IHNob3VsZCBhcHByb2FjaCBhIGRlY2lzaW9uCisgKiAgYXMgaGF2aW5nIG11bHRpcGxlIGZsYXdzIGVhY2ggb25lIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYSBERkFTdGF0ZS4KKyAqICBGb3IgZXhhbXBsZSwgc3RhdGVzV2l0aFN5bnRhY3RpY2FsbHlBbWJpZ3VvdXNBbHRzU2V0IHRyYWNrcyB0aGUgc2V0IG9mCisgKiAgYWxsIERGQVN0YXRlcyB3aGVyZSBBTlRMUiBoYXMgZGlzY292ZXJlZCBhIHByb2JsZW0uICBSZWNhbGwgdGhhdCBhIGRlY2lzaW9uCisgKiAgaXMgcmVwcmVzZW50ZWQgaW50ZXJuYWxsIHdpdGggYSBERkEgY29tcHJpc2VkIG9mIG11bHRpcGxlIHN0YXRlcywgZWFjaCBvZgorICogIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGhhdmUgcHJvYmxlbXMuCisgKgorICogIEJlY2F1c2Ugb2YgdGhpcywgeW91IG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoaXMgbGlzdCBvZiBERkEgc3RhdGVzLiAgWW91J2xsCisgKiAgbm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uYWwgbWV0aG9kcyBsaWtlCisgKiAgZ2V0U2FtcGxlTm9uRGV0ZXJtaW5pc3RpY0lucHV0U2VxdWVuY2UoKSByZXF1aXJlIGEgREZBU3RhdGUuICBUaGlzIHN0YXRlCisgKiAgd2lsbCBiZSBvbmUgb2YgdGhlIGl0ZXJhdGVkIHN0YXRlcyBmcm9tIHN0YXRlVG9TeW50YWN0aWNhbGx5QW1iaWd1b3VzQWx0c1NldC4KKyAqCisgKiAgVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkIHNhZmUgZHVlIHRvIHNoYXJlZCB1c2Ugb2YgdmlzaXRlZCBtYXBzIGV0Yy4uLgorICogIE9ubHkgb25lIHRocmVhZCBzaG91bGQgcmVhbGx5IG5lZWQgdG8gYWNjZXNzIG9uZSBEZWNpc2lvblByb2JlIGFueXdheS4KKyAqLworcHVibGljIGNsYXNzIERlY2lzaW9uUHJvYmUgeworCXB1YmxpYyBERkEgZGZhOworCisJLyoqIFRyYWNrIGFsbCBERkEgc3RhdGVzIHdpdGggbm9uZGV0ZXJtaW5pc3RpYyBhbHRlcm5hdGl2ZXMuCisJICogIEJ5IHJlYWNoaW5nIHRoZSBzYW1lIERGQSBzdGF0ZSwgYSBwYXRoIHRocm91Z2ggdGhlIE5GQSBmb3Igc29tZSBpbnB1dAorCSAqICBpcyBhYmxlIHRvIHJlYWNoIHRoZSBzYW1lIE5GQSBzdGF0ZSBieSBzdGFydGluZyBhdCBtb3JlIHRoYW4gb25lCisJICogIGFsdGVybmF0aXZlJ3MgbGVmdCBlZGdlLiAgVGhvdWdoLCBsYXRlciwgd2UgbWF5IGZpbmQgdGhhdCBwcmVkaWNhdGVzCisJICogIHJlc29sdmUgdGhlIGlzc3VlLCBidXQgdHJhY2sgaW5mbyBhbnl3YXkuCisJICogIE5vdGUgdGhhdCBmcm9tIHRoZSBERkEgc3RhdGUsIHlvdSBjYW4gYXNrIGZvcgorCSAqICB3aGljaCBhbHRzIGFyZSBub25kZXRlcm1pbmlzdGljLgorCSAqLworCXByb3RlY3RlZCBTZXQ8REZBU3RhdGU+IHN0YXRlc1dpdGhTeW50YWN0aWNhbGx5QW1iaWd1b3VzQWx0c1NldCA9IG5ldyBIYXNoU2V0PERGQVN0YXRlPigpOworCisJLyoqIFRyYWNrIGp1c3QgbGlrZSBzdGF0ZVRvU3ludGFjdGljYWxseUFtYmlndW91c0FsdHNNYXAsIGJ1dCBvbmx5CisJICogIGZvciBub25kZXRlcm1pbmlzbXMgdGhhdCBhcmlzZSBpbiB0aGUgVG9rZW5zIHJ1bGUgc3VjaCBhcyBrZXl3b3JkIHZzCisJICogIElEIHJ1bGUuICBUaGUgc3RhdGUgbWFwcyB0byB0aGUgbGlzdCBvZiBUb2tlbnMgcnVsZSBhbHRzIHRoYXQgYXJlCisJICogIGluIGNvbmZsaWN0LgorCSAqLworCXByb3RlY3RlZCBNYXA8REZBU3RhdGUsIFNldDxJbnRlZ2VyPj4gc3RhdGVUb1N5bnRhY3RpY2FsbHlBbWJpZ3VvdXNUb2tlbnNSdWxlQWx0c01hcCA9CisJCW5ldyBIYXNoTWFwPERGQVN0YXRlLCBTZXQ8SW50ZWdlcj4+KCk7CisKKwkvKiogV2FzIGEgc3ludGFjdGljIGFtYmlndWl0eSByZXNvbHZlZCB3aXRoIHByZWRpY2F0ZXM/ICBBbnkgREZBCisJICogIHN0YXRlIHRoYXQgcHJlZGljdHMgbW9yZSB0aGFuIG9uZSBhbHRlcm5hdGl2ZSwgbXVzdCBiZSByZXNvbHZlZAorCSAqICB3aXRoIHByZWRpY2F0ZXMgb3IgaXQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyLgorCSAqLworCXByb3RlY3RlZCBTZXQ8REZBU3RhdGU+IHN0YXRlc1Jlc29sdmVkV2l0aFNlbWFudGljUHJlZGljYXRlc1NldCA9IG5ldyBIYXNoU2V0PERGQVN0YXRlPigpOworCisJLyoqIFRyYWNrIHRoZSBwcmVkaWNhdGVzIGZvciBlYWNoIGFsdCBwZXIgREZBIHN0YXRlOworCSAqICBtb3JlIHRoYW4gb25lIERGQSBzdGF0ZSBtaWdodCBoYXZlIHN5bnRhY3RpY2FsbHkgYW1iaWcgYWx0IHByZWRpY3Rpb24uCisJICogIE1hcHMgREZBIHN0YXRlIHRvIGFub3RoZXIgbWFwLCBtYXBwaW5nIGFsdCBudW1iZXIgdG8gYQorCSAqICBTZW1hbnRpY0NvbnRleHQgKHByZWQocykgdG8gZXhlY3V0ZSB0byByZXNvbHZlIHN5bnRhY3RpYyBhbWJpZ3VpdHkpLgorCSAqLworCXByb3RlY3RlZCBNYXA8REZBU3RhdGUsIE1hcDxJbnRlZ2VyLFNlbWFudGljQ29udGV4dD4+IHN0YXRlVG9BbHRTZXRXaXRoU2VtYW50aWNQcmVkaWNhdGVzTWFwID0KKwkJbmV3IEhhc2hNYXA8REZBU3RhdGUsIE1hcDxJbnRlZ2VyLFNlbWFudGljQ29udGV4dD4+KCk7CisKKwkvKiogVHJhY2tzIGFsdHMgaW5zdWZmaWNpZW50bHkgY292ZXJlZC4KKwkgKiAgRm9yIGV4YW1wbGUsIHAxfHx0cnVlIGdldHMgcmVkdWNlZCB0byB0cnVlIGFuZCBzbyBsZWF2ZXMKKwkgKiAgd2hvbGUgYWx0IHVuY292ZXJlZC4gIFRoaXMgbWFwcyBERkEgc3RhdGUgdG8gdGhlIHNldCBvZiBhbHRzCisJICovCisJcHJvdGVjdGVkIE1hcDxERkFTdGF0ZSxNYXA8SW50ZWdlciwgU2V0PFRva2VuPj4+IHN0YXRlVG9JbmNvbXBsZXRlbHlDb3ZlcmVkQWx0c01hcCA9CisJCW5ldyBIYXNoTWFwPERGQVN0YXRlLE1hcDxJbnRlZ2VyLCBTZXQ8VG9rZW4+Pj4oKTsKKworCS8qKiBUaGUgc2V0IG9mIHN0YXRlcyB3L28gZW1hbmF0aW5nIGVkZ2VzIGFuZCB3L28gcmVzb2x2aW5nIHNlbSBwcmVkcy4gKi8KKwlwcm90ZWN0ZWQgU2V0PERGQVN0YXRlPiBkYW5nbGluZ1N0YXRlcyA9IG5ldyBIYXNoU2V0PERGQVN0YXRlPigpOworCisJLyoqIFRoZSBvdmVyYWxsIGxpc3Qgb2YgYWx0cyB3aXRoaW4gdGhlIGRlY2lzaW9uIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUKKwkgKiAgY29uZmxpY3RpbmcgaW5wdXQgc2VxdWVuY2UuCisJICovCisJcHJvdGVjdGVkIFNldDxJbnRlZ2VyPiBhbHRzV2l0aFByb2JsZW0gPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworCisJLyoqIElmIGRlY2lzaW9uIHdpdGggPiAxIGFsdCBoYXMgcmVjdXJzaW9uIGluID4gMSBhbHQsIGl0J3MgKGxpa2VseSkgbm9ucmVndWxhcgorCSAqICBsb29rYWhlYWQuICBUaGUgZGVjaXNpb24gY2Fubm90IGJlIG1hZGUgd2l0aCBhIERGQS4KKwkgKiAgdGhlIGFsdHMgYXJlIHN0b3JlZCBpbiBhbHRzV2l0aFByb2JsZW0uCisJICovCisJcHVibGljIGJvb2xlYW4gbm9uTExTdGFyRGVjaXNpb24gPSBmYWxzZTsKKworCS8qKiBSZWN1cnNpb24gaXMgbGltaXRlZCB0byBhIHBhcnRpY3VsYXIgZGVwdGguICBJZiB0aGF0IGxpbWl0IGlzIGV4Y2VlZGVkCisJICogIHRoZSBwcm9wb3NlZCBuZXcgTkZBQ29uZmlndXJhdGlvbiBpcyByZWNvcmRlZCBmb3IgdGhlIGFzc29jaWF0ZWQgREZBIHN0YXRlLgorCSAqLworCXByb3RlY3RlZCBNdWx0aU1hcDxJbnRlZ2VyLCBORkFDb25maWd1cmF0aW9uPiBzdGF0ZVRvUmVjdXJzaW9uT3ZlcmZsb3dDb25maWd1cmF0aW9uc01hcCA9CisJCW5ldyBNdWx0aU1hcDxJbnRlZ2VyLCBORkFDb25maWd1cmF0aW9uPigpOworCS8qCisJcHJvdGVjdGVkIE1hcDxJbnRlZ2VyLCBMaXN0PE5GQUNvbmZpZ3VyYXRpb24+PiBzdGF0ZVRvUmVjdXJzaW9uT3ZlcmZsb3dDb25maWd1cmF0aW9uc01hcCA9CisJCW5ldyBIYXNoTWFwPEludGVnZXIsIExpc3Q8TkZBQ29uZmlndXJhdGlvbj4+KCk7CisJCSovCisKKwkvKiogTGVmdCByZWN1cnNpb24gZGlzY292ZXJlZC4gIFRoZSBwcm9wb3NlZCBuZXcgTkZBQ29uZmlndXJhdGlvbgorCSAqICBpcyByZWNvcmRlZCBmb3IgdGhlIGFzc29jaWF0ZWQgREZBIHN0YXRlLgorCXByb3RlY3RlZCBNYXA8SW50ZWdlcixMaXN0PE5GQUNvbmZpZ3VyYXRpb24+PiBzdGF0ZVRvTGVmdFJlY3Vyc2l2ZUNvbmZpZ3VyYXRpb25zTWFwID0KKwkJbmV3IEhhc2hNYXA8SW50ZWdlcixMaXN0PE5GQUNvbmZpZ3VyYXRpb24+PigpOworCSAqLworCisJLyoqIERpZCBBTlRMUiBoYXZlIHRvIHRlcm1pbmF0ZSBlYXJseSBvbiB0aGUgYW5hbHlzaXMgb2YgdGhpcyBkZWNpc2lvbj8gKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0aW1lZE91dCA9IGZhbHNlOworCisJLyoqIFVzZWQgdG8gZmluZCBwYXRocyB0aHJvdWdoIHN5bnRhY3RpY2FsbHkgYW1iaWd1b3VzIERGQS4gSWYgd2UndmUKKwkgKiAgc2VlbiBzdGF0ZW1lbnQgbnVtYmVyIGJlZm9yZSwgd2hhdCBkaWQgd2UgbGVhcm4/CisJICovCisJcHJvdGVjdGVkIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBzdGF0ZVJlYWNoYWJsZTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFDSEFCTEVfQlVTWSA9IFV0aWxzLmludGVnZXIoLTEpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFDSEFCTEVfTk8gPSBVdGlscy5pbnRlZ2VyKDApOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFDSEFCTEVfWUVTID0gVXRpbHMuaW50ZWdlcigxKTsKKworCS8qKiBVc2VkIHdoaWxlIGZpbmRpbmcgYSBwYXRoIHRocm91Z2ggYW4gTkZBIHdob3NlIGVkZ2UgbGFiZWxzIG1hdGNoCisJICogIGFuIGlucHV0IHNlcXVlbmNlLiAgVHJhY2tzIHRoZSBpbnB1dCBwb3NpdGlvbgorCSAqICB3ZSB3ZXJlIGF0IHRoZSBsYXN0IHRpbWUgYXQgdGhpcyBub2RlLiAgSWYgc2FtZSBpbnB1dCBwb3NpdGlvbiwgdGhlbgorCSAqICB3ZSdkIGhhdmUgcmVhY2hlZCBzYW1lIHN0YXRlIHdpdGhvdXQgY29uc3VtaW5nIGlucHV0Li4ucHJvYmFibHkgYW4KKwkgKiAgaW5maW5pdGUgbG9vcC4gIFN0b3AuICBTZXQ8U3RyaW5nPi4gIFRoZSBzdHJpbmdzIGxvb2sgbGlrZQorCSAqICBzdGF0ZU51bWJlcl9sYWJlbEluZGV4LgorCSAqLworCXByb3RlY3RlZCBTZXQ8U3RyaW5nPiBzdGF0ZXNWaXNpdGVkQXRJbnB1dERlcHRoOworCisJcHJvdGVjdGVkIFNldDxJbnRlZ2VyPiBzdGF0ZXNWaXNpdGVkRHVyaW5nU2FtcGxlU2VxdWVuY2U7CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCisJcHVibGljIERlY2lzaW9uUHJvYmUoREZBIGRmYSkgeworCQl0aGlzLmRmYSA9IGRmYTsKKwl9CisKKwkvLyBJIE4gRiBPIFIgTSBBIFQgSSBPIE4gIEEgQiBPIFUgVCAgRCBFIEMgSSBTIEkgTyBOCisKKwkvKiogUmV0dXJuIGEgc3RyaW5nIGxpa2UgIjM6MjI6ICggQSB7O30gfCBCICkiIHRoYXQgZGVzY3JpYmVzIHRoaXMKKwkgKiAgZGVjaXNpb24uCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRmYS5nZXRORkFEZWNpc2lvblN0YXJ0U3RhdGUoKS5nZXREZXNjcmlwdGlvbigpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVkdWNlZCgpIHsKKwkJcmV0dXJuIGRmYS5pc1JlZHVjZWQoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0N5Y2xpYygpIHsKKwkJcmV0dXJuIGRmYS5pc0N5Y2xpYygpOworCX0KKworCS8qKiBJZiBubyBzdGF0ZXMgYXJlIGRlYWQtZW5kcywgbm8gYWx0cyBhcmUgdW5yZWFjaGFibGUsIHRoZXJlIGFyZQorCSAqICBubyBub25kZXRlcm1pbmlzbXMgdW5yZXNvbHZlZCBieSBzeW4gcHJlZHMsIGFsbCBpcyBvayB3aXRoIGRlY2lzaW9uLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGV0ZXJtaW5pc3RpYygpIHsKKwkJaWYgKCBkYW5nbGluZ1N0YXRlcy5zaXplKCk9PTAgJiYKKwkJCSBzdGF0ZXNXaXRoU3ludGFjdGljYWxseUFtYmlndW91c0FsdHNTZXQuc2l6ZSgpPT0wICYmCisJCQkgZGZhLmdldFVucmVhY2hhYmxlQWx0cygpLnNpemUoKT09MCApCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYgKCBzdGF0ZXNXaXRoU3ludGFjdGljYWxseUFtYmlndW91c0FsdHNTZXQuc2l6ZSgpPjAgKSB7CisJCQlJdGVyYXRvciBpdCA9CisJCQkJc3RhdGVzV2l0aFN5bnRhY3RpY2FsbHlBbWJpZ3VvdXNBbHRzU2V0Lml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoCWl0Lmhhc05leHQoKSApIHsKKwkJCQlERkFTdGF0ZSBkID0gKERGQVN0YXRlKSBpdC5uZXh0KCk7CisJCQkJaWYgKCAhc3RhdGVzUmVzb2x2ZWRXaXRoU2VtYW50aWNQcmVkaWNhdGVzU2V0LmNvbnRhaW5zKGQpICkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQkJLy8gbm8gc3ludGFjdGljYWxseSBhbWJpZyBhbHRzIHdlcmUgbGVmdCB1bnJlc29sdmVkIGJ5IHByZWRpY2F0ZXMKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiogRGlkIHRoZSBhbmFseXNpcyBjb21wbGV0ZSBpdCdzIHdvcms/ICovCisvLwlwdWJsaWMgYm9vbGVhbiBhbmFseXNpc1RpbWVkT3V0KCkgeworLy8JCXJldHVybiB0aW1lZE91dDsKKy8vCX0KKworCS8qKiBUb29rIHRvbyBsb25nIHRvIGFuYWx5emUgYSBERkEgKi8KKwlwdWJsaWMgYm9vbGVhbiBhbmFseXNpc092ZXJmbG93ZWQoKSB7CisJCXJldHVybiBzdGF0ZVRvUmVjdXJzaW9uT3ZlcmZsb3dDb25maWd1cmF0aW9uc01hcC5zaXplKCk+MDsKKwl9CisKKwkvKiogRm91bmQgcmVjdXJzaW9uIGluID4gMSBhbHQgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc05vbkxMU3RhckRlY2lzaW9uKCkgeworCQlyZXR1cm4gbm9uTExTdGFyRGVjaXNpb247CisJfQorCisJLyoqIEhvdyBtYW55IHN0YXRlcyBkb2VzIHRoZSBERkEgcHJlZGljdG9yIGhhdmU/ICovCisJcHVibGljIGludCBnZXROdW1iZXJPZlN0YXRlcygpIHsKKwkJcmV0dXJuIGRmYS5nZXROdW1iZXJPZlN0YXRlcygpOworCX0KKworCS8qKiBHZXQgYSBsaXN0IG9mIGFsbCB1bnJlYWNoYWJsZSBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgZGVjaXNpb24uICBUaGVyZQorCSAqICBtYXkgYmUgbXVsdGlwbGUgYWx0ZXJuYXRpdmVzIHdpdGggYW1iaWd1b3VzIGlucHV0IHNlcXVlbmNlcywgYnV0IHRoaXMKKwkgKiAgaXMgdGhlIG92ZXJhbGwgbGlzdCBvZiB1bnJlYWNoYWJsZSBhbHRlcm5hdGl2ZXMgKGVpdGhlciBkdWUgdG8KKwkgKiAgY29uZmxpY3QgcmVzb2x1dGlvbiBvciBhbHRzIHcvbyBhY2NlcHQgc3RhdGVzKS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRVbnJlYWNoYWJsZUFsdHMoKSB7CisJCXJldHVybiBkZmEuZ2V0VW5yZWFjaGFibGVBbHRzKCk7CisJfQorCisJLyoqIHJldHVybiBzZXQgb2Ygc3RhdGVzIHcvbyBlbWFuYXRpbmcgZWRnZXMgYW5kIHcvbyByZXNvbHZpbmcgc2VtIHByZWRzLgorCSAqICBUaGVzZSBzdGF0ZXMgY29tZSBhYm91dCBiZWNhdXNlIHRoZSBhbmFseXNpcyBhbGdvcml0aG0gaGFkIHRvCisJICogIHRlcm1pbmF0ZSBlYXJseSB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gZm9yIGV4YW1wbGUgKGR1ZSB0bworCSAqICBsZWZ0IHJlY3Vyc2lvbiBwZXJoYXBzKS4KKwkgKi8KKwlwdWJsaWMgU2V0IGdldERhbmdsaW5nU3RhdGVzKCkgeworCQlyZXR1cm4gZGFuZ2xpbmdTdGF0ZXM7CisJfQorCisgICAgcHVibGljIFNldCBnZXROb25EZXRlcm1pbmlzdGljQWx0cygpIHsKKyAgICAgICAgcmV0dXJuIGFsdHNXaXRoUHJvYmxlbTsKKwl9CisKKwkvKiogUmV0dXJuIHRoZSBzb3J0ZWQgbGlzdCBvZiBhbHRzIHRoYXQgY29uZmxpY3Qgd2l0aGluIGEgc2luZ2xlIHN0YXRlLgorCSAqICBOb3RlIHRoYXQgcHJlZGljYXRlcyBtYXkgcmVzb2x2ZSB0aGUgY29uZmxpY3QuCisJICovCisJcHVibGljIExpc3QgZ2V0Tm9uRGV0ZXJtaW5pc3RpY0FsdHNGb3JTdGF0ZShERkFTdGF0ZSB0YXJnZXRTdGF0ZSkgeworCQlTZXQgbm9uZGV0QWx0cyA9IHRhcmdldFN0YXRlLmdldE5vbkRldGVybWluaXN0aWNBbHRzKCk7CisJCWlmICggbm9uZGV0QWx0cz09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUxpc3Qgc29ydGVkID0gbmV3IExpbmtlZExpc3QoKTsKKwkJc29ydGVkLmFkZEFsbChub25kZXRBbHRzKTsKKwkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQpOyAvLyBtYWtlIHN1cmUgaXQncyAxLCAyLCAuLi4KKwkJcmV0dXJuIHNvcnRlZDsKKwl9CisKKwkvKiogUmV0dXJuIGFsbCBERkEgc3RhdGVzIGluIHRoaXMgREZBIHRoYXQgaGF2ZSBORkEgY29uZmlndXJhdGlvbnMgdGhhdAorCSAqICBjb25mbGljdC4gIFlvdSBtdXN0IHJlcG9ydCBhIHByb2JsZW0gZm9yIGVhY2ggc3RhdGUgaW4gdGhpcyBzZXQKKwkgKiAgYmVjYXVzZSBlYWNoIHN0YXRlIHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgaW5wdXQgc2VxdWVuY2UuCisJICovCisJcHVibGljIFNldCBnZXRERkFTdGF0ZXNXaXRoU3ludGFjdGljYWxseUFtYmlndW91c0FsdHMoKSB7CisJCXJldHVybiBzdGF0ZXNXaXRoU3ludGFjdGljYWxseUFtYmlndW91c0FsdHNTZXQ7CisJfQorCisJLyoqIFdoaWNoIGFsdHMgd2VyZSBzcGVjaWZpY2FsbHkgdHVybmVkIG9mZiB0byByZXNvbHZlIG5vbmRldGVybWluaXNtcz8KKwkgKiAgVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgdW5yZWFjaGFibGUgYWx0cy4gIERpc2FibGVkIGRvZXNuJ3QgbWVhbiB0aGF0CisJICogIHRoZSBhbHRlcm5hdGl2ZSBpcyB0b3RhbGx5IHVucmVhY2hhYmxlIG5lY2Vzc2FyaWx5LCBpdCBqdXN0IG1lYW5zCisJICogIHRoYXQgZm9yIHRoaXMgREZBIHN0YXRlLCB0aGF0IGFsdCBpcyBkaXNhYmxlZC4gIFRoZXJlIG1heSBiZSBvdGhlcgorCSAqICBhY2NlcHQgc3RhdGVzIGZvciB0aGF0IGFsdCB0aGF0IG1ha2UgYW4gYWx0IHJlYWNoYWJsZS4KKwkgKi8KKwlwdWJsaWMgU2V0IGdldERpc2FibGVkQWx0ZXJuYXRpdmVzKERGQVN0YXRlIGQpIHsKKwkJcmV0dXJuIGQuZ2V0RGlzYWJsZWRBbHRlcm5hdGl2ZXMoKTsKKwl9CisKKwkvKiogSWYgYSByZWN1cnNpb24gb3ZlcmZsb3cgaXMgcmVzb2x2ZSB3aXRoIHByZWRpY2F0ZXMsIHRoZW4gd2UgbmVlZAorCSAqICB0byBzaHV0IG9mZiB0aGUgd2FybmluZyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVSZWN1cnNpdmVPdmVyZmxvd1N0YXRlKERGQVN0YXRlIGQpIHsKKwkJSW50ZWdlciBzdGF0ZUkgPSBVdGlscy5pbnRlZ2VyKGQuc3RhdGVOdW1iZXIpOworCQlzdGF0ZVRvUmVjdXJzaW9uT3ZlcmZsb3dDb25maWd1cmF0aW9uc01hcC5yZW1vdmUoc3RhdGVJKTsKKwl9CisKKwkvKiogUmV0dXJuIGEgTGlzdDxMYWJlbD4gaW5kaWNhdGluZyBhbiBpbnB1dCBzZXF1ZW5jZSB0aGF0IGNhbiBiZSBtYXRjaGVkCisJICogIGZyb20gdGhlIHN0YXJ0IHN0YXRlIG9mIHRoZSBERkEgdG8gdGhlIHRhcmdldFN0YXRlICh3aGljaCBpcyBrbm93bgorCSAqICB0byBoYXZlIGEgcHJvYmxlbSkuCisJICovCisJcHVibGljIExpc3Q8TGFiZWw+IGdldFNhbXBsZU5vbkRldGVybWluaXN0aWNJbnB1dFNlcXVlbmNlKERGQVN0YXRlIHRhcmdldFN0YXRlKSB7CisJCVNldCBkZmFTdGF0ZXMgPSBnZXRERkFQYXRoU3RhdGVzVG9UYXJnZXQodGFyZ2V0U3RhdGUpOworCQlzdGF0ZXNWaXNpdGVkRHVyaW5nU2FtcGxlU2VxdWVuY2UgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworCQlMaXN0PExhYmVsPiBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0PExhYmVsPigpOyAvLyBtYXkgYWNjZXNzIGl0aCBlbGVtZW50OyB1c2UgYXJyYXkKKwkJaWYgKCBkZmE9PW51bGwgfHwgZGZhLnN0YXJ0U3RhdGU9PW51bGwgKSB7CisJCQlyZXR1cm4gbGFiZWxzOworCQl9CisJCWdldFNhbXBsZUlucHV0U2VxdWVuY2VVc2luZ1N0YXRlU2V0KGRmYS5zdGFydFN0YXRlLAorCQkJCQkJCQkJCQl0YXJnZXRTdGF0ZSwKKwkJCQkJCQkJCQkJZGZhU3RhdGVzLAorCQkJCQkJCQkJCQlsYWJlbHMpOworCQlyZXR1cm4gbGFiZWxzOworCX0KKworCS8qKiBHaXZlbiBMaXN0PExhYmVsPiwgcmV0dXJuIGEgU3RyaW5nIHdpdGggYSB1c2VmdWwgcmVwcmVzZW50YXRpb24KKwkgKiAgb2YgdGhlIGFzc29jaWF0ZWQgaW5wdXQgc3RyaW5nLiAgT25lIGNvdWxkIHNob3cgc29tZXRoaW5nIGRpZmZlcmVudAorCSAqICBmb3IgbGV4ZXJzIGFuZCBwYXJzZXJzLCBmb3IgZXhhbXBsZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElucHV0U2VxdWVuY2VEaXNwbGF5KExpc3QgbGFiZWxzKSB7CisgICAgICAgIEdyYW1tYXIgZyA9IGRmYS5uZmEuZ3JhbW1hcjsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGxhYmVscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlMYWJlbCBsYWJlbCA9IChMYWJlbCkgaXQubmV4dCgpOworCQkJYnVmLmFwcGVuZChsYWJlbC50b1N0cmluZyhnKSk7CisJCQlpZiAoIGl0Lmhhc05leHQoKSAmJiBnLnR5cGUhPUdyYW1tYXIuTEVYRVIgKSB7CisJCQkJYnVmLmFwcGVuZCgnICcpOworCQkJfQorCQl9CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKyAgICAvKiogR2l2ZW4gYW4gYWx0ZXJuYXRpdmUgYXNzb2NpYXRlZCB3aXRoIGEgbm9uZGV0ZXJtaW5pc3RpYyBERkEgc3RhdGUsCisJICogIGZpbmQgdGhlIHBhdGggb2YgTkZBIHN0YXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVscyBzZXF1ZW5jZS4KKwkgKiAgVXNlZnVsIHRyYWNpbmcgd2hlcmUgaW4gdGhlIE5GQSwgYSBzaW5nbGUgaW5wdXQgc2VxdWVuY2UgY2FuIGJlCisJICogIG1hdGNoZWQuICBGb3IgZGlmZmVyZW50IGFsdHMsIHlvdSBzaG91bGQgZ2V0IGRpZmZlcmVudCBORkEgcGF0aHMuCisJICoKKwkgKiAgVGhlIGZpcnN0IE5GQSBzdGF0ZSBmb3IgYWxsIE5GQSBwYXRocyB3aWxsIGJlIHRoZSBzYW1lOiB0aGUgc3RhcnRpbmcKKwkgKiAgTkZBIHN0YXRlIG9mIHRoZSBmaXJzdCBub25kZXRlcm1pbmlzdGljIGFsdC4gIEltYWdpbmUgKEF8QnxBfEEpOgorCSAqCisJICogCTUtPjktQS0+bworCSAqICB8CisJICogIDYtPjEwLUItPm8KKwkgKiAgfAorCSAqICA3LT4xMS1BLT5vCisJICogIHwKKwkgKiAgOC0+MTItQS0+bworCSAqCisJICogIFRoZXJlIGFyZSAzIG5vbmRldGVybWluaXN0aWMgYWx0cy4gIFRoZSBwYXRocyBzaG91bGQgYmU6CisJICogIDUgOSAuLi4KKwkgKiAgNSA2IDcgMTEgLi4uCisJICogIDUgNiA3IDggMTIgLi4uCisJICoKKwkgKiAgVGhlIE5GQSBwYXRoIG1hdGNoaW5nIHRoZSBzYW1wbGUgaW5wdXQgc2VxdWVuY2UgKGxhYmVscykgaXMgY29tcHV0ZWQKKwkgKiAgdXNpbmcgc3RhdGVzIDksIDExLCBhbmQgMTIgcmF0aGVyIHRoYW4gNSwgNywgOCBiZWNhdXNlIHN0YXRlIDUsIGZvcgorCSAqICBleGFtcGxlIGNhbiBnZXQgdG8gYWxsIGFtYmlnIHBhdGhzLiAgTXVzdCBpc29sYXRlIGZvciBlYWNoIGFsdCAoaGVuY2UsCisJICogIHRoZSBleHRyYSBzdGF0ZSBiZWdpbm5pbmcgZWFjaCBhbHQgaW4gbXkgTkZBIHN0cnVjdHVyZXMpLiAgSGVyZSwKKwkgKiAgZmlyc3RBbHQ9MS4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRORkFQYXRoU3RhdGVzRm9yQWx0KGludCBmaXJzdEFsdCwKKwkJCQkJCQkJCSAgIGludCBhbHQsCisJCQkJCQkJCQkgICBMaXN0IGxhYmVscykKKwl7CisJCU5GQVN0YXRlIG5mYVN0YXJ0ID0gZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpOworCQlMaXN0IHBhdGggPSBuZXcgTGlua2VkTGlzdCgpOworCQkvLyBmaXJzdCBhZGQgYWxsIE5GQSBzdGF0ZXMgbGVhZGluZyB1cCB0byBhbHRTdGFydCBzdGF0ZQorCQlmb3IgKGludCBhPWZpcnN0QWx0OyBhPD1hbHQ7IGErKykgeworCQkJTkZBU3RhdGUgcyA9CisJCQkJZGZhLm5mYS5ncmFtbWFyLmdldE5GQVN0YXRlRm9yQWx0T2ZEZWNpc2lvbihuZmFTdGFydCxhKTsKKwkJCXBhdGguYWRkKHMpOworCQl9CisKKwkJLy8gYWRkIGZpcnN0IHN0YXRlIG9mIGFjdHVhbCBhbHQKKwkJTkZBU3RhdGUgYWx0U3RhcnQgPSBkZmEubmZhLmdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKG5mYVN0YXJ0LGFsdCk7CisJCU5GQVN0YXRlIGlzb2xhdGVkQWx0U3RhcnQgPSAoTkZBU3RhdGUpYWx0U3RhcnQudHJhbnNpdGlvblswXS50YXJnZXQ7CisJCXBhdGguYWRkKGlzb2xhdGVkQWx0U3RhcnQpOworCisJCS8vIGFkZCB0aGUgYWN0dWFsIHBhdGggbm93CisJCXN0YXRlc1Zpc2l0ZWRBdElucHV0RGVwdGggPSBuZXcgSGFzaFNldCgpOworCQlnZXRORkFQYXRoKGlzb2xhdGVkQWx0U3RhcnQsCisJCQkJICAgMCwKKwkJCQkgICBsYWJlbHMsCisJCQkJICAgcGF0aCk7CisgICAgICAgIHJldHVybiBwYXRoOworCX0KKworCS8qKiBFYWNoIHN0YXRlIGluIHRoZSBERkEgcmVwcmVzZW50cyBhIGRpZmZlcmVudCBpbnB1dCBzZXF1ZW5jZSBmb3IgYW4KKwkgKiAgYWx0IG9mIHRoZSBkZWNpc2lvbi4gIEdpdmVuIGEgREZBIHN0YXRlLCB3aGF0IGlzIHRoZSBzZW1hbnRpYworCSAqICBwcmVkaWNhdGUgY29udGV4dCBmb3IgYSBwYXJ0aWN1bGFyIGFsdC4KKwkgKi8KKyAgICBwdWJsaWMgU2VtYW50aWNDb250ZXh0IGdldFNlbWFudGljQ29udGV4dEZvckFsdChERkFTdGF0ZSBkLCBpbnQgYWx0KSB7CisJCU1hcCBhbHRUb1ByZWRNYXAgPSAoTWFwKXN0YXRlVG9BbHRTZXRXaXRoU2VtYW50aWNQcmVkaWNhdGVzTWFwLmdldChkKTsKKwkJaWYgKCBhbHRUb1ByZWRNYXA9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gKFNlbWFudGljQ29udGV4dClhbHRUb1ByZWRNYXAuZ2V0KFV0aWxzLmludGVnZXIoYWx0KSk7CisJfQorCisJLyoqIEF0IGxlYXN0IG9uZSBhbHQgcmVmcyBhIHNlbSBvciBzeW4gcHJlZCAqLworCXB1YmxpYyBib29sZWFuIGhhc1ByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIHN0YXRlVG9BbHRTZXRXaXRoU2VtYW50aWNQcmVkaWNhdGVzTWFwLnNpemUoKT4wOworCX0KKworCXB1YmxpYyBTZXQgZ2V0Tm9uZGV0ZXJtaW5pc3RpY1N0YXRlc1Jlc29sdmVkV2l0aFNlbWFudGljUHJlZGljYXRlKCkgeworCQlyZXR1cm4gc3RhdGVzUmVzb2x2ZWRXaXRoU2VtYW50aWNQcmVkaWNhdGVzU2V0OworCX0KKworCS8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsdHMgd2hvc2UgcHJlZGljYXRlIGNvbnRleHQgd2FzIGluc3VmZmljaWVudCB0bworCSAqICByZXNvbHZlIGEgbm9uZGV0ZXJtaW5pc20gZm9yIHN0YXRlIGQuCisJICovCisJcHVibGljIE1hcDxJbnRlZ2VyLCBTZXQ8VG9rZW4+PiBnZXRJbmNvbXBsZXRlbHlDb3ZlcmVkQWx0cyhERkFTdGF0ZSBkKSB7CisJCXJldHVybiBzdGF0ZVRvSW5jb21wbGV0ZWx5Q292ZXJlZEFsdHNNYXAuZ2V0KGQpOworCX0KKworCXB1YmxpYyB2b2lkIGlzc3VlV2FybmluZ3MoKSB7CisJCS8vIE5PTlJFR1VMQVIgRFVFIFRPIFJFQ1VSU0lPTiA+IDEgQUxUUworCQkvLyBJc3N1ZSB0aGlzIGJlZm9yZSBhYm9ydGVkIGFuYWx5c2lzLCB3aGljaCBtaWdodCBhbHNvIG9jY3VyCisJCS8vIGlmIHdlIHRha2UgdG9vIGxvbmcgdG8gdGVybWluYXRlCisJCWlmICggbm9uTExTdGFyRGVjaXNpb24gJiYgIWRmYS5nZXRBdXRvQmFja3RyYWNrTW9kZSgpICkgeworCQkJRXJyb3JNYW5hZ2VyLm5vbkxMU3RhckRlY2lzaW9uKHRoaXMpOworCQl9CisKKwkJaXNzdWVSZWN1cnNpb25XYXJuaW5ncygpOworCisJCS8vIGdlbmVyYXRlIGEgc2VwYXJhdGUgbWVzc2FnZSBmb3IgZWFjaCBwcm9ibGVtIHN0YXRlIGluIERGQQorCQlTZXQgcmVzb2x2ZWRTdGF0ZXMgPSBnZXROb25kZXRlcm1pbmlzdGljU3RhdGVzUmVzb2x2ZWRXaXRoU2VtYW50aWNQcmVkaWNhdGUoKTsKKwkJU2V0IHByb2JsZW1TdGF0ZXMgPSBnZXRERkFTdGF0ZXNXaXRoU3ludGFjdGljYWxseUFtYmlndW91c0FsdHMoKTsKKwkJaWYgKCBwcm9ibGVtU3RhdGVzLnNpemUoKT4wICkgeworCQkJSXRlcmF0b3IgaXQgPQorCQkJCXByb2JsZW1TdGF0ZXMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlICgJaXQuaGFzTmV4dCgpICYmICFkZmEubmZhLmdyYW1tYXIuTkZBVG9ERkFDb252ZXJzaW9uRXh0ZXJuYWxseUFib3J0ZWQoKSApIHsKKwkJCQlERkFTdGF0ZSBkID0gKERGQVN0YXRlKSBpdC5uZXh0KCk7CisJCQkJTWFwPEludGVnZXIsIFNldDxUb2tlbj4+IGluc3VmZmljaWVudEFsdFRvTG9jYXRpb25zID0gZ2V0SW5jb21wbGV0ZWx5Q292ZXJlZEFsdHMoZCk7CisJCQkJaWYgKCBpbnN1ZmZpY2llbnRBbHRUb0xvY2F0aW9ucyE9bnVsbCAmJiBpbnN1ZmZpY2llbnRBbHRUb0xvY2F0aW9ucy5zaXplKCk+MCApIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLmluc3VmZmljaWVudFByZWRpY2F0ZXModGhpcyxkLGluc3VmZmljaWVudEFsdFRvTG9jYXRpb25zKTsKKwkJCQl9CisJCQkJLy8gZG9uJ3QgcmVwb3J0IHByb2JsZW0gaWYgcmVzb2x2ZWQKKwkJCQlpZiAoIHJlc29sdmVkU3RhdGVzPT1udWxsIHx8ICFyZXNvbHZlZFN0YXRlcy5jb250YWlucyhkKSApIHsKKwkJCQkJLy8gZmlyc3Qgc3RyaXAgbGFzdCBhbHQgZnJvbSBkaXNhYmxlQWx0cyBpZiBpdCdzIHdpbGRjYXJkCisJCQkJCS8vIHRoZW4gZG9uJ3QgcHJpbnQgZXJyb3IgaWYgbm8gbW9yZSBkaXNhYmxlIGFsdHMKKwkJCQkJU2V0IGRpc2FibGVkQWx0cyA9IGdldERpc2FibGVkQWx0ZXJuYXRpdmVzKGQpOworCQkJCQlzdHJpcFdpbGRDYXJkQWx0cyhkaXNhYmxlZEFsdHMpOworCQkJCQlpZiAoIGRpc2FibGVkQWx0cy5zaXplKCk+MCApIHsKKwkJCQkJCS8vIG5vbmRldGVybWluaXNtOyBzYW1lIGlucHV0IHByZWRpY3RzIG11bHRpcGxlIGFsdHMuCisJCQkJCQkvLyBidXQgZG9uJ3QgZW1pdCBlcnJvciBpZiBncmVlZHk9dHJ1ZSBleHBsaWNpdGx5IHNldAorCQkJCQkJYm9vbGVhbiBleHBsaWNpdGx5R3JlZWR5ID0gZmFsc2U7CisJCQkJCQlHcmFtbWFyQVNUIGJsb2NrQVNUID0KKwkJCQkJCQlkLmRmYS5uZmEuZ3JhbW1hci5nZXREZWNpc2lvbkJsb2NrQVNUKGQuZGZhLmRlY2lzaW9uTnVtYmVyKTsKKwkJCQkJCWlmICggYmxvY2tBU1QhPW51bGwgKSB7CisJCQkJCQkJU3RyaW5nIGdyZWVkeVMgPSAoU3RyaW5nKWJsb2NrQVNULmdldEJsb2NrT3B0aW9uKCJncmVlZHkiKTsKKwkJCQkJCQlpZiAoIGdyZWVkeVMhPW51bGwgJiYgZ3JlZWR5Uy5lcXVhbHMoInRydWUiKSApIGV4cGxpY2l0bHlHcmVlZHkgPSB0cnVlOworCQkJCQkJfQorCQkJCQkJaWYgKCAhZXhwbGljaXRseUdyZWVkeSkgRXJyb3JNYW5hZ2VyLm5vbmRldGVybWluaXNtKHRoaXMsZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlTZXQgZGFuZ2xpbmdTdGF0ZXMgPSBnZXREYW5nbGluZ1N0YXRlcygpOworCQlpZiAoIGRhbmdsaW5nU3RhdGVzLnNpemUoKT4wICkgeworCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIm5vIGVtYW5hdGluZyBlZGdlcyBmb3Igc3RhdGVzOiAiK2RhbmdsaW5nU3RhdGVzKTsKKwkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYW5nbGluZ1N0YXRlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQkJREZBU3RhdGUgZCA9IChERkFTdGF0ZSkgaXQubmV4dCgpOworCQkJCUVycm9yTWFuYWdlci5kYW5nbGluZ1N0YXRlKHRoaXMsZCk7CisJCQl9CisJCX0KKworCQlpZiAoICFub25MTFN0YXJEZWNpc2lvbiApIHsKKwkJCUxpc3Q8SW50ZWdlcj4gdW5yZWFjaGFibGVBbHRzID0gZGZhLmdldFVucmVhY2hhYmxlQWx0cygpOworCQkJaWYgKCB1bnJlYWNoYWJsZUFsdHMhPW51bGwgJiYgdW5yZWFjaGFibGVBbHRzLnNpemUoKT4wICkgeworCQkJCS8vIGdpdmUgZGlmZmVyZW50IG1zZyBpZiBpdCdzIGFuIGVtcHR5IFRva2VucyBydWxlIGZyb20gZGVsZWdhdGUKKwkJCQlib29sZWFuIGlzSW5oZXJpdGVkVG9rZW5zUnVsZSA9IGZhbHNlOworCQkJCWlmICggZGZhLmlzVG9rZW5zUnVsZURlY2lzaW9uKCkgKSB7CisJCQkJCWZvciAoSW50ZWdlciBhbHRJIDogdW5yZWFjaGFibGVBbHRzKSB7CisJCQkJCQlHcmFtbWFyQVNUIGRlY0FTVCA9IGRmYS5nZXREZWNpc2lvbkFTVE5vZGUoKTsKKwkJCQkJCUdyYW1tYXJBU1QgYWx0QVNUID0gKEdyYW1tYXJBU1QpZGVjQVNULmdldENoaWxkKGFsdEktMSk7CisJCQkJCQlHcmFtbWFyQVNUIGRlbGVnYXRlZFRva2Vuc0FsdCA9CisJCQkJCQkJKEdyYW1tYXJBU1QpYWx0QVNULmdldEZpcnN0Q2hpbGRXaXRoVHlwZShBTlRMUlBhcnNlci5ET1QpOworCQkJCQkJaWYgKCBkZWxlZ2F0ZWRUb2tlbnNBbHQgIT1udWxsICkgeworCQkJCQkJCWlzSW5oZXJpdGVkVG9rZW5zUnVsZSA9IHRydWU7CisJCQkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJXYXJuaW5nKEVycm9yTWFuYWdlci5NU0dfSU1QT1JURURfVE9LRU5TX1JVTEVfRU1QVFksCisJCQkJCQkJCQkJCQkJCWRmYS5uZmEuZ3JhbW1hciwKKwkJCQkJCQkJCQkJCQkJbnVsbCwKKwkJCQkJCQkJCQkJCQkJZGZhLm5mYS5ncmFtbWFyLm5hbWUsCisJCQkJCQkJCQkJCQkJCWRlbGVnYXRlZFRva2Vuc0FsdC5nZXRDaGlsZCgwKS5nZXRUZXh0KCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICggaXNJbmhlcml0ZWRUb2tlbnNSdWxlICkgeworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLnVucmVhY2hhYmxlQWx0cyh0aGlzLHVucmVhY2hhYmxlQWx0cyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqIEdldCB0aGUgbGFzdCBkaXNhYmxlZCBhbHQgbnVtYmVyIGFuZCBjaGVjayBpbiB0aGUgZ3JhbW1hciB0byBzZWUKKwkgKiAgaWYgdGhhdCBhbHQgaXMgYSBzaW1wbGUgd2lsZGNhcmQuICBJZiBzbywgdHJlYXQgbGlrZSBhbiBlbHNlIGNsYXVzZQorCSAqICBhbmQgZG9uJ3QgZW1pdCB0aGUgZXJyb3IuICBTdHJpcCBvdXQgdGhlIGxhc3QgYWx0IGlmIGl0J3Mgd2lsZGNhcmQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc3RyaXBXaWxkQ2FyZEFsdHMoU2V0IGRpc2FibGVkQWx0cykgeworCQlMaXN0IHNvcnRlZERpc2FibGVBbHRzID0gbmV3IEFycmF5TGlzdChkaXNhYmxlZEFsdHMpOworCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZERpc2FibGVBbHRzKTsKKwkJSW50ZWdlciBsYXN0QWx0ID0KKwkJCShJbnRlZ2VyKXNvcnRlZERpc2FibGVBbHRzLmdldChzb3J0ZWREaXNhYmxlQWx0cy5zaXplKCktMSk7CisJCUdyYW1tYXJBU1QgYmxvY2tBU1QgPQorCQkJZGZhLm5mYS5ncmFtbWFyLmdldERlY2lzaW9uQmxvY2tBU1QoZGZhLmRlY2lzaW9uTnVtYmVyKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImJsb2NrIHdpdGggZXJyb3IgPSAiK2Jsb2NrQVNULnRvU3RyaW5nVHJlZSgpKTsKKwkJR3JhbW1hckFTVCBsYXN0QWx0QVNUID0gbnVsbDsKKwkJaWYgKCBibG9ja0FTVC5nZXRDaGlsZCgwKS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLk9QVElPTlMgKSB7CisJCQkvLyBpZiBvcHRpb25zLCBza2lwIGZpcnN0IGNoaWxkOiAoIG9wdGlvbnMgeyAoID0gZ3JlZWR5IGZhbHNlICkgKQorCQkJbGFzdEFsdEFTVCA9IChHcmFtbWFyQVNUKWJsb2NrQVNULmdldENoaWxkKGxhc3RBbHQuaW50VmFsdWUoKSk7CisJCX0KKwkJZWxzZSB7CisJCQlsYXN0QWx0QVNUID0gKEdyYW1tYXJBU1QpYmxvY2tBU1QuZ2V0Q2hpbGQobGFzdEFsdC5pbnRWYWx1ZSgpLTEpOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsYXN0IGFsdCBpcyAiK2xhc3RBbHRBU1QudG9TdHJpbmdUcmVlKCkpOworCQkvLyBpZiBsYXN0IGFsdCBsb29rcyBsaWtlICggQUxUIC4gPGVuZC1vZi1hbHQ+ICkgdGhlbiB3aWxkY2FyZAorCQkvLyBBdm9pZCBsb29raW5nIGF0IG9wdGlvbmFsIGJsb2NrcyBldGMuLi4gdGhhdCBoYXZlIGxhc3QgYWx0CisJCS8vIGFzIHRoZSBFT0I6CisJCS8vICggQkxPQ0sgKCBBTFQgJ2Vsc2UnIHN0YXRlbWVudCA8ZW5kLW9mLWFsdD4gKSA8ZW5kLW9mLWJsb2NrPiApCisJCWlmICggbGFzdEFsdEFTVC5nZXRUeXBlKCkhPUFOVExSUGFyc2VyLkVPQiAmJgorCQkJIGxhc3RBbHRBU1QuZ2V0Q2hpbGQoMCkuZ2V0VHlwZSgpPT0gQU5UTFJQYXJzZXIuV0lMRENBUkQgJiYKKwkJCSBsYXN0QWx0QVNULmdldENoaWxkKDEpLmdldFR5cGUoKT09IEFOVExSUGFyc2VyLkVPQSApCisJCXsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ3aWxkY2FyZCIpOworCQkJZGlzYWJsZWRBbHRzLnJlbW92ZShsYXN0QWx0KTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGlzc3VlUmVjdXJzaW9uV2FybmluZ3MoKSB7CisJCS8vIFJFQ1VSU0lPTiBPVkVSRkxPVworCQlTZXQgZGZhU3RhdGVzV2l0aFJlY3Vyc2lvblByb2JsZW1zID0KKwkJCXN0YXRlVG9SZWN1cnNpb25PdmVyZmxvd0NvbmZpZ3VyYXRpb25zTWFwLmtleVNldCgpOworCQkvLyBub3cgd2FsayB0cnVseSB1bmlxdWUgKHVuYWxpYXNlZCkgbGlzdCBvZiBkZmEgc3RhdGVzIHdpdGggaW5mIHJlY3VyCisJCS8vIEdvYWw6IGNyZWF0ZSBhIG1hcCBmcm9tIGFsdCB0byBtYXA8dGFyZ2V0LExpc3Q8Y2FsbHNpdGVzPj4KKwkJLy8gTWFwPE1hcDxTdHJpbmcgdGFyZ2V0LCBMaXN0PE5GQVN0YXRlIGNhbGwgc2l0ZXM+PgorCQlNYXAgYWx0VG9UYXJnZXRUb0NhbGxTaXRlc01hcCA9IG5ldyBIYXNoTWFwKCk7CisJCS8vIHRyYWNrIGEgc2luZ2xlIHByb2JsZW0gREZBIHN0YXRlIGZvciBlYWNoIGFsdAorCQlNYXAgYWx0VG9ERkFTdGF0ZSA9IG5ldyBIYXNoTWFwKCk7CisJCWNvbXB1dGVBbHRUb1Byb2JsZW1NYXBzKGRmYVN0YXRlc1dpdGhSZWN1cnNpb25Qcm9ibGVtcywKKwkJCQkJCQkJc3RhdGVUb1JlY3Vyc2lvbk92ZXJmbG93Q29uZmlndXJhdGlvbnNNYXAsCisJCQkJCQkJCWFsdFRvVGFyZ2V0VG9DYWxsU2l0ZXNNYXAsIC8vIG91dHB1dCBwYXJhbQorCQkJCQkJCQlhbHRUb0RGQVN0YXRlKTsgICAgICAgICAgICAvLyBvdXRwdXQgcGFyYW0KKworCQkvLyB3YWxrIGVhY2ggYWx0IHdpdGggcmVjdXJzaW9uIG92ZXJmbG93IHByb2JsZW1zIGFuZCBnZW5lcmF0ZSBlcnJvcgorCQlTZXQgYWx0cyA9IGFsdFRvVGFyZ2V0VG9DYWxsU2l0ZXNNYXAua2V5U2V0KCk7CisJCUxpc3Qgc29ydGVkQWx0cyA9IG5ldyBBcnJheUxpc3QoYWx0cyk7CisJCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkQWx0cyk7CisJCWZvciAoSXRlcmF0b3IgYWx0c0l0ID0gc29ydGVkQWx0cy5pdGVyYXRvcigpOyBhbHRzSXQuaGFzTmV4dCgpOykgeworCQkJSW50ZWdlciBhbHRJID0gKEludGVnZXIpIGFsdHNJdC5uZXh0KCk7CisJCQlNYXAgdGFyZ2V0VG9DYWxsU2l0ZU1hcCA9CisJCQkJKE1hcClhbHRUb1RhcmdldFRvQ2FsbFNpdGVzTWFwLmdldChhbHRJKTsKKwkJCVNldCB0YXJnZXRSdWxlcyA9IHRhcmdldFRvQ2FsbFNpdGVNYXAua2V5U2V0KCk7CisJCQlDb2xsZWN0aW9uIGNhbGxTaXRlU3RhdGVzID0gdGFyZ2V0VG9DYWxsU2l0ZU1hcC52YWx1ZXMoKTsKKwkJCURGQVN0YXRlIHNhbXBsZUJhZFN0YXRlID0gKERGQVN0YXRlKWFsdFRvREZBU3RhdGUuZ2V0KGFsdEkpOworCQkJRXJyb3JNYW5hZ2VyLnJlY3Vyc2lvbk92ZXJmbG93KHRoaXMsCisJCQkJCQkJCQkJICAgc2FtcGxlQmFkU3RhdGUsCisJCQkJCQkJCQkJICAgYWx0SS5pbnRWYWx1ZSgpLAorCQkJCQkJCQkJCSAgIHRhcmdldFJ1bGVzLAorCQkJCQkJCQkJCSAgIGNhbGxTaXRlU3RhdGVzKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb21wdXRlQWx0VG9Qcm9ibGVtTWFwcyhTZXQgZGZhU3RhdGVzVW5hbGlhc2VkLAorCQkJCQkJCQkJCSBNYXAgY29uZmlndXJhdGlvbnNNYXAsCisJCQkJCQkJCQkJIE1hcCBhbHRUb1RhcmdldFRvQ2FsbFNpdGVzTWFwLAorCQkJCQkJCQkJCSBNYXAgYWx0VG9ERkFTdGF0ZSkKKwl7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBkZmFTdGF0ZXNVbmFsaWFzZWQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJSW50ZWdlciBzdGF0ZUkgPSAoSW50ZWdlcikgaXQubmV4dCgpOworCQkJLy8gd2FsayB0aGlzIERGQSdzIGNvbmZpZyBsaXN0CisJCQlMaXN0IGNvbmZpZ3MgPSAoTGlzdCljb25maWd1cmF0aW9uc01hcC5nZXQoc3RhdGVJKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5zaXplKCk7IGkrKykgeworCQkJCU5GQUNvbmZpZ3VyYXRpb24gYyA9IChORkFDb25maWd1cmF0aW9uKSBjb25maWdzLmdldChpKTsKKwkJCQlORkFTdGF0ZSBydWxlSW52b2NhdGlvblN0YXRlID0gZGZhLm5mYS5nZXRTdGF0ZShjLnN0YXRlKTsKKwkJCQlUcmFuc2l0aW9uIHRyYW5zaXRpb24wID0gcnVsZUludm9jYXRpb25TdGF0ZS50cmFuc2l0aW9uWzBdOworCQkJCVJ1bGVDbG9zdXJlVHJhbnNpdGlvbiByZWYgPSAoUnVsZUNsb3N1cmVUcmFuc2l0aW9uKXRyYW5zaXRpb24wOworCQkJCVN0cmluZyB0YXJnZXRSdWxlID0gKChORkFTdGF0ZSkgcmVmLnRhcmdldCkuZW5jbG9zaW5nUnVsZS5uYW1lOworCQkJCUludGVnZXIgYWx0SSA9IFV0aWxzLmludGVnZXIoYy5hbHQpOworCQkJCU1hcCB0YXJnZXRUb0NhbGxTaXRlTWFwID0KKwkJCQkJKE1hcClhbHRUb1RhcmdldFRvQ2FsbFNpdGVzTWFwLmdldChhbHRJKTsKKwkJCQlpZiAoIHRhcmdldFRvQ2FsbFNpdGVNYXA9PW51bGwgKSB7CisJCQkJCXRhcmdldFRvQ2FsbFNpdGVNYXAgPSBuZXcgSGFzaE1hcCgpOworCQkJCQlhbHRUb1RhcmdldFRvQ2FsbFNpdGVzTWFwLnB1dChhbHRJLCB0YXJnZXRUb0NhbGxTaXRlTWFwKTsKKwkJCQl9CisJCQkJU2V0IGNhbGxTaXRlcyA9CisJCQkJCShIYXNoU2V0KXRhcmdldFRvQ2FsbFNpdGVNYXAuZ2V0KHRhcmdldFJ1bGUpOworCQkJCWlmICggY2FsbFNpdGVzPT1udWxsICkgeworCQkJCQljYWxsU2l0ZXMgPSBuZXcgSGFzaFNldCgpOworCQkJCQl0YXJnZXRUb0NhbGxTaXRlTWFwLnB1dCh0YXJnZXRSdWxlLCBjYWxsU2l0ZXMpOworCQkJCX0KKwkJCQljYWxsU2l0ZXMuYWRkKHJ1bGVJbnZvY2F0aW9uU3RhdGUpOworCQkJCS8vIHRyYWNrIG9uZSBwcm9ibGVtIERGQSBzdGF0ZSBwZXIgYWx0CisJCQkJaWYgKCBhbHRUb0RGQVN0YXRlLmdldChhbHRJKT09bnVsbCApIHsKKwkJCQkJREZBU3RhdGUgc2FtcGxlQmFkU3RhdGUgPSBkZmEuZ2V0U3RhdGUoc3RhdGVJLmludFZhbHVlKCkpOworCQkJCQlhbHRUb0RGQVN0YXRlLnB1dChhbHRJLCBzYW1wbGVCYWRTdGF0ZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBTZXQgZ2V0VW5hbGlhc2VkREZBU3RhdGVTZXQoU2V0IGRmYVN0YXRlc1dpdGhSZWN1cnNpb25Qcm9ibGVtcykgeworCQlTZXQgZGZhU3RhdGVzVW5hbGlhc2VkID0gbmV3IEhhc2hTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGRmYVN0YXRlc1dpdGhSZWN1cnNpb25Qcm9ibGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlJbnRlZ2VyIHN0YXRlSSA9IChJbnRlZ2VyKSBpdC5uZXh0KCk7CisJCQlERkFTdGF0ZSBkID0gZGZhLmdldFN0YXRlKHN0YXRlSS5pbnRWYWx1ZSgpKTsKKwkJCWRmYVN0YXRlc1VuYWxpYXNlZC5hZGQoVXRpbHMuaW50ZWdlcihkLnN0YXRlTnVtYmVyKSk7CisJCX0KKwkJcmV0dXJuIGRmYVN0YXRlc1VuYWxpYXNlZDsKKwl9CisKKworCS8vIFQgUiBBIEMgSyBJIE4gRyAgTSBFIFQgSCBPIEQgUworCisgICAgLyoqIFJlcG9ydCB0aGUgZmFjdCB0aGF0IERGQSBzdGF0ZSBkIGlzIG5vdCBhIHN0YXRlIHJlc29sdmVkIHdpdGgKKyAgICAgKiAgcHJlZGljYXRlcyBhbmQgeWV0IGl0IGhhcyBubyBlbWFuYXRpbmcgZWRnZXMuICBVc3VhbGx5IHRoaXMKKyAgICAgKiAgaXMgYSByZXN1bHQgb2YgdGhlIGNsb3N1cmUvcmVhY2ggb3BlcmF0aW9ucyBiZWluZyB1bmFibGUgdG8gcHJvY2VlZAorICAgICAqLworCXB1YmxpYyB2b2lkIHJlcG9ydERhbmdsaW5nU3RhdGUoREZBU3RhdGUgZCkgeworCQlkYW5nbGluZ1N0YXRlcy5hZGQoZCk7CisJfQorCisvLwlwdWJsaWMgdm9pZCByZXBvcnRBbmFseXNpc1RpbWVvdXQoKSB7CisvLwkJdGltZWRPdXQgPSB0cnVlOworLy8JCWRmYS5uZmEuZ3JhbW1hci5zZXRPZkRGQVdob3NlQW5hbHlzaXNUaW1lZE91dC5hZGQoZGZhKTsKKy8vCX0KKworCS8qKiBSZXBvcnQgdGhhdCBhdCBsZWFzdCAyIGFsdHMgaGF2ZSByZWN1cnNpdmUgY29uc3RydWN0cy4gIFRoZXJlIGlzCisJICogIG5vIHdheSB0byBidWlsZCBhIERGQSBzbyB3ZSB0ZXJtaW5hdGVkLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydE5vbkxMU3RhckRlY2lzaW9uKERGQSBkZmEpIHsKKwkJLyoKKwkJU3lzdGVtLm91dC5wcmludGxuKCJub24tTEwoKikgREZBICIrZGZhLmRlY2lzaW9uTnVtYmVyKyIsIGFsdHM6ICIrCisJCQkJCQkgICBkZmEucmVjdXJzaXZlQWx0U2V0LnRvTGlzdCgpKTsKKwkJCQkJCSAgICovCisJCW5vbkxMU3RhckRlY2lzaW9uID0gdHJ1ZTsKKwkJZGZhLm5mYS5ncmFtbWFyLm51bU5vbkxMU3RhcisrOworCQlhbHRzV2l0aFByb2JsZW0uYWRkQWxsKGRmYS5yZWN1cnNpdmVBbHRTZXQudG9MaXN0KCkpOworCX0KKworCXB1YmxpYyB2b2lkIHJlcG9ydFJlY3Vyc2lvbk92ZXJmbG93KERGQVN0YXRlIGQsCisJCQkJCQkJCQkJTkZBQ29uZmlndXJhdGlvbiByZWN1cnNpb25ORkFDb25maWd1cmF0aW9uKQorCXsKKwkJLy8gdHJhY2sgdGhlIHN0YXRlIG51bWJlciByYXRoZXIgdGhhbiB0aGUgc3RhdGUgYXMgZCB3aWxsIGNoYW5nZQorCQkvLyBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzOyBoYXNoIHdvdWxkbid0IHJldHVybiBhbnkgdmFsdWUKKworCQkvLyBsZWZ0LXJlY3Vyc2lvbiBpcyBkZXRlY3RlZCBpbiBzdGFydCBzdGF0ZS4gIFNpbmNlIHdlIGNhbid0CisJCS8vIGNhbGwgcmVzb2x2ZU5vbmRldGVybWluaXNtKCkgb24gdGhlIHN0YXJ0IHN0YXRlIChpdCB3b3VsZAorCQkvLyBub3QgbG9vayBrPTEgdG8gZ2V0IG1pbiBzaW5nbGUgdG9rZW4gbG9va2FoZWFkKSwgd2UgbXVzdAorCQkvLyBwcmV2ZW50IGVycm9ycyBkZXJpdmVkIGZyb20gdGhpcyBzdGF0ZS4gIEF2b2lkIHN0YXJ0IHN0YXRlCisJCWlmICggZC5zdGF0ZU51bWJlciA+IDAgKSB7CisJCQlJbnRlZ2VyIHN0YXRlSSA9IFV0aWxzLmludGVnZXIoZC5zdGF0ZU51bWJlcik7CisJCQlzdGF0ZVRvUmVjdXJzaW9uT3ZlcmZsb3dDb25maWd1cmF0aW9uc01hcC5tYXAoc3RhdGVJLCByZWN1cnNpb25ORkFDb25maWd1cmF0aW9uKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJlcG9ydE5vbmRldGVybWluaXNtKERGQVN0YXRlIGQsIFNldDxJbnRlZ2VyPiBub25kZXRlcm1pbmlzdGljQWx0cykgeworCQlhbHRzV2l0aFByb2JsZW0uYWRkQWxsKG5vbmRldGVybWluaXN0aWNBbHRzKTsgLy8gdHJhY2sgb3ZlcmFsbCBsaXN0CisJCXN0YXRlc1dpdGhTeW50YWN0aWNhbGx5QW1iaWd1b3VzQWx0c1NldC5hZGQoZCk7CisJCWRmYS5uZmEuZ3JhbW1hci5zZXRPZk5vbmRldGVybWluaXN0aWNEZWNpc2lvbk51bWJlcnMuYWRkKAorCQkJVXRpbHMuaW50ZWdlcihkZmEuZ2V0RGVjaXNpb25OdW1iZXIoKSkKKwkJKTsKKwl9CisKKwkvKiogQ3VycmVudGx5IHRoZSBhbmFseXNpcyByZXBvcnRzIGlzc3VlcyBiZXR3ZWVuIHRva2VuIGRlZmluaXRpb25zLCBidXQKKwkgKiAgd2UgZG9uJ3QgcHJpbnQgb3V0IHdhcm5pbmdzIGluIGZhdm9yIG9mIGp1c3QgcGlja2luZyB0aGUgZmlyc3QgdG9rZW4KKwkgKiAgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgZ3JhbW1hciBhbGEgbGV4L2ZsZXguCisJICovCisJcHVibGljIHZvaWQgcmVwb3J0TGV4ZXJSdWxlTm9uZGV0ZXJtaW5pc20oREZBU3RhdGUgZCwgU2V0PEludGVnZXI+IG5vbmRldGVybWluaXN0aWNBbHRzKSB7CisJCXN0YXRlVG9TeW50YWN0aWNhbGx5QW1iaWd1b3VzVG9rZW5zUnVsZUFsdHNNYXAucHV0KGQsbm9uZGV0ZXJtaW5pc3RpY0FsdHMpOworCX0KKworCXB1YmxpYyB2b2lkIHJlcG9ydE5vbmRldGVybWluaXNtUmVzb2x2ZWRXaXRoU2VtYW50aWNQcmVkaWNhdGUoREZBU3RhdGUgZCkgeworCQkvLyBGaXJzdCwgcHJldmVudCBhIHJlY3Vyc2lvbiB3YXJuaW5nIG9uIHRoaXMgc3RhdGUgZHVlIHRvCisJCS8vIHByZWQgcmVzb2x1dGlvbgorCQlpZiAoIGQuYWJvcnRlZER1ZVRvUmVjdXJzaW9uT3ZlcmZsb3cgKSB7CisJCQlkLmRmYS5wcm9iZS5yZW1vdmVSZWN1cnNpdmVPdmVyZmxvd1N0YXRlKGQpOworCQl9CisJCXN0YXRlc1Jlc29sdmVkV2l0aFNlbWFudGljUHJlZGljYXRlc1NldC5hZGQoZCk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZXNvbHZlZCB3aXRoIHByZWQ6ICIrZCk7CisJCWRmYS5uZmEuZ3JhbW1hci5zZXRPZk5vbmRldGVybWluaXN0aWNEZWNpc2lvbk51bWJlcnNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzLmFkZCgKKwkJCVV0aWxzLmludGVnZXIoZGZhLmdldERlY2lzaW9uTnVtYmVyKCkpCisJCSk7CisJfQorCisJLyoqIFJlcG9ydCB0aGUgbGlzdCBvZiBwcmVkaWNhdGVzIGZvdW5kIGZvciBlYWNoIGFsdGVybmF0aXZlOyBjb3B5CisJICogIHRoZSBsaXN0IGJlY2F1c2UgdGhpcyBzZXQgZ2V0cyBhbHRlcmVkIGxhdGVyIGJ5IHRoZSBtZXRob2QKKwkgKiAgdHJ5VG9SZXNvbHZlV2l0aFNlbWFudGljUHJlZGljYXRlcygpIHdoaWxlIGZsYWdnaW5nIE5GQSBjb25maWd1cmF0aW9ucworCSAqICBpbiBkIGFzIHJlc29sdmVkLgorCSAqLworCXB1YmxpYyB2b2lkIHJlcG9ydEFsdFByZWRpY2F0ZUNvbnRleHQoREZBU3RhdGUgZCwgTWFwIGFsdFByZWRpY2F0ZUNvbnRleHQpIHsKKwkJTWFwIGNvcHkgPSBuZXcgSGFzaE1hcCgpOworCQljb3B5LnB1dEFsbChhbHRQcmVkaWNhdGVDb250ZXh0KTsKKwkJc3RhdGVUb0FsdFNldFdpdGhTZW1hbnRpY1ByZWRpY2F0ZXNNYXAucHV0KGQsY29weSk7CisJfQorCisJcHVibGljIHZvaWQgcmVwb3J0SW5jb21wbGV0ZWx5Q292ZXJlZEFsdHMoREZBU3RhdGUgZCwKKwkJCQkJCQkJCQkJICBNYXA8SW50ZWdlciwgU2V0PFRva2VuPj4gYWx0VG9Mb2NhdGlvbnNSZWFjaGFibGVXaXRob3V0UHJlZGljYXRlKQorCXsKKwkJc3RhdGVUb0luY29tcGxldGVseUNvdmVyZWRBbHRzTWFwLnB1dChkLCBhbHRUb0xvY2F0aW9uc1JlYWNoYWJsZVdpdGhvdXRQcmVkaWNhdGUpOworCX0KKworCS8vIFMgVSBQIFAgTyBSIFQKKworCS8qKiBHaXZlbiBhIHN0YXJ0IHN0YXRlIGFuZCBhIHRhcmdldCBzdGF0ZSwgcmV0dXJuIHRydWUgaWYgc3RhcnQgY2FuIHJlYWNoCisJICogIHRhcmdldCBzdGF0ZS4gIEFsc28sIGNvbXB1dGUgdGhlIHNldCBvZiBERkEgc3RhdGVzCisJICogIHRoYXQgYXJlIG9uIGEgcGF0aCBmcm9tIHN0YXJ0IHRvIHRhcmdldDsgcmV0dXJuIGluIHN0YXRlcyBwYXJhbWV0ZXIuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVhY2hlc1N0YXRlKERGQVN0YXRlIHN0YXJ0U3RhdGUsCisJCQkJCQkJCSAgIERGQVN0YXRlIHRhcmdldFN0YXRlLAorCQkJCQkJCQkgICBTZXQgc3RhdGVzKSB7CisJCWlmICggc3RhcnRTdGF0ZT09dGFyZ2V0U3RhdGUgKSB7CisJCQlzdGF0ZXMuYWRkKHRhcmdldFN0YXRlKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCB0YXJnZXQgREZBIHN0YXRlICIrdGFyZ2V0U3RhdGUuZ2V0U3RhdGVOdW1iZXIoKSk7CisJCQlzdGF0ZVJlYWNoYWJsZS5wdXQoc3RhcnRTdGF0ZS5zdGF0ZU51bWJlciwgUkVBQ0hBQkxFX1lFUyk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCURGQVN0YXRlIHMgPSBzdGFydFN0YXRlOworCQkvLyBhdm9pZCBpbmZpbml0ZSBsb29wcworCQlzdGF0ZVJlYWNoYWJsZS5wdXQocy5zdGF0ZU51bWJlciwgUkVBQ0hBQkxFX0JVU1kpOworCisJCS8vIGxvb2sgZm9yIGEgcGF0aCB0byB0YXJnZXRTdGF0ZSBhbW9uZyB0cmFuc2l0aW9ucyBmb3IgdGhpcyBzdGF0ZQorCQkvLyBzdG9wIHdoZW4geW91IGZpbmQgdGhlIGZpcnN0IG9uZTsgSSdtIHByZXR0eSBzdXJlIHRoZXJlIGlzCisJCS8vIGF0IG1vc3Qgb25lIHBhdGggdG8gYW55IERGQSBzdGF0ZSB3aXRoIGNvbmZsaWN0aW5nIHByZWRpY3Rpb25zCisJCWZvciAoaW50IGk9MDsgaTxzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIHQgPSBzLnRyYW5zaXRpb24oaSk7CisJCQlERkFTdGF0ZSBlZGdlVGFyZ2V0ID0gKERGQVN0YXRlKXQudGFyZ2V0OworCQkJSW50ZWdlciB0YXJnZXRTdGF0dXMgPSBzdGF0ZVJlYWNoYWJsZS5nZXQoZWRnZVRhcmdldC5zdGF0ZU51bWJlcik7CisJCQlpZiAoIHRhcmdldFN0YXR1cz09UkVBQ0hBQkxFX0JVU1kgKSB7IC8vIGF2b2lkIGN5Y2xlczsgdGhleSBzYXkgbm90aGluZworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCB0YXJnZXRTdGF0dXM9PVJFQUNIQUJMRV9ZRVMgKSB7IC8vIHJldHVybiBzdWNjZXNzIQorCQkJCXN0YXRlUmVhY2hhYmxlLnB1dChzLnN0YXRlTnVtYmVyLCBSRUFDSEFCTEVfWUVTKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWlmICggdGFyZ2V0U3RhdHVzPT1SRUFDSEFCTEVfTk8gKSB7IC8vIHRyeSBhbm90aGVyIHRyYW5zaXRpb24KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIGlmIG51bGwsIHRhcmdldCBtdXN0IGJlIFJFQUNIQUJMRV9VTktOT1dOIChpLmUuLCB1bnZpc2l0ZWQpCisJCQlpZiAoIHJlYWNoZXNTdGF0ZShlZGdlVGFyZ2V0LCB0YXJnZXRTdGF0ZSwgc3RhdGVzKSApIHsKKwkJCQlzdGF0ZXMuYWRkKHMpOworCQkJCXN0YXRlUmVhY2hhYmxlLnB1dChzLnN0YXRlTnVtYmVyLCBSRUFDSEFCTEVfWUVTKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXN0YXRlUmVhY2hhYmxlLnB1dChzLnN0YXRlTnVtYmVyLCBSRUFDSEFCTEVfTk8pOworCQlyZXR1cm4gZmFsc2U7IC8vIG5vIHBhdGggdG8gdGFyZ2V0U3RhdGUgZm91bmQuCisJfQorCisJcHJvdGVjdGVkIFNldCBnZXRERkFQYXRoU3RhdGVzVG9UYXJnZXQoREZBU3RhdGUgdGFyZ2V0U3RhdGUpIHsKKwkJU2V0IGRmYVN0YXRlcyA9IG5ldyBIYXNoU2V0KCk7CisJCXN0YXRlUmVhY2hhYmxlID0gbmV3IEhhc2hNYXAoKTsKKwkJaWYgKCBkZmE9PW51bGwgfHwgZGZhLnN0YXJ0U3RhdGU9PW51bGwgKSB7CisJCQlyZXR1cm4gZGZhU3RhdGVzOworCQl9CisJCWJvb2xlYW4gcmVhY2hlcyA9IHJlYWNoZXNTdGF0ZShkZmEuc3RhcnRTdGF0ZSwgdGFyZ2V0U3RhdGUsIGRmYVN0YXRlcyk7CisJCXJldHVybiBkZmFTdGF0ZXM7CisJfQorCisJLyoqIEdpdmVuIGEgc3RhcnQgc3RhdGUgYW5kIGEgZmluYWwgc3RhdGUsIGZpbmQgYSBsaXN0IG9mIGVkZ2UgbGFiZWxzCisJICogIGJldHdlZW4gdGhlIHR3byBpZ25vcmluZyBlcHNpbG9uLiAgTGltaXQgeW91ciBzY2FuIHRvIGEgc2V0IG9mIHN0YXRlcworCSAqICBwYXNzZWQgaW4uICBUaGlzIGlzIHVzZWQgdG8gc2hvdyBhIHNhbXBsZSBpbnB1dCBzZXF1ZW5jZSB0aGF0IGlzCisJICogIG5vbmRldGVybWluaXN0aWMgd2l0aCByZXNwZWN0IHRvIHRoaXMgZGVjaXNpb24uICBSZXR1cm4gTGlzdDxMYWJlbD4gYXMKKwkgKiAgYSBwYXJhbWV0ZXIuICBUaGUgaW5jb21pbmcgc3RhdGVzIHNldCBtdXN0IGJlIGFsbCBzdGF0ZXMgdGhhdCBsZWFkCisJICogIGZyb20gc3RhcnRTdGF0ZSB0byB0YXJnZXRTdGF0ZSBhbmQgbm8gb3RoZXJzIHNvIHRoaXMgYWxnb3JpdGhtIGRvZXNuJ3QKKwkgKiAgdGFrZSBhIHBhdGggdGhhdCBldmVudHVhbGx5IGxlYWRzIHRvIGEgc3RhdGUgb3RoZXIgdGhhbiB0YXJnZXRTdGF0ZS4KKwkgKiAgRG9uJ3QgZm9sbG93IGxvb3BzLCBsZWFkaW5nIHRvIHNob3J0IChwb3NzaWJseSBzaG9ydGVzdCkgcGF0aC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBnZXRTYW1wbGVJbnB1dFNlcXVlbmNlVXNpbmdTdGF0ZVNldChTdGF0ZSBzdGFydFN0YXRlLAorCQkJCQkJCQkJCQkJCSAgIFN0YXRlIHRhcmdldFN0YXRlLAorCQkJCQkJCQkJCQkJCSAgIFNldCBzdGF0ZXMsCisJCQkJCQkJCQkJCQkJICAgTGlzdDxMYWJlbD4gbGFiZWxzKQorCXsKKwkJc3RhdGVzVmlzaXRlZER1cmluZ1NhbXBsZVNlcXVlbmNlLmFkZChzdGFydFN0YXRlLnN0YXRlTnVtYmVyKTsKKworCQkvLyBwaWNrIHRoZSBmaXJzdCBlZGdlIGluIHN0YXRlcyBhcyB0aGUgb25lIHRvIHRyYXZlcnNlCisJCWZvciAoaW50IGk9MDsgaTxzdGFydFN0YXRlLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIHQgPSBzdGFydFN0YXRlLnRyYW5zaXRpb24oaSk7CisJCQlERkFTdGF0ZSBlZGdlVGFyZ2V0ID0gKERGQVN0YXRlKXQudGFyZ2V0OworCQkJaWYgKCBzdGF0ZXMuY29udGFpbnMoZWRnZVRhcmdldCkgJiYKKwkJCQkgIXN0YXRlc1Zpc2l0ZWREdXJpbmdTYW1wbGVTZXF1ZW5jZS5jb250YWlucyhlZGdlVGFyZ2V0LnN0YXRlTnVtYmVyKSApCisJCQl7CisJCQkJbGFiZWxzLmFkZCh0LmxhYmVsKTsgLy8gdHJhdmVyc2UgZWRnZSBhbmQgdHJhY2sgbGFiZWwKKwkJCQlpZiAoIGVkZ2VUYXJnZXQhPXRhcmdldFN0YXRlICkgeworCQkJCQkvLyBnZXQgbW9yZSBsYWJlbHMgaWYgbm90IGF0IHRhcmdldAorCQkJCQlnZXRTYW1wbGVJbnB1dFNlcXVlbmNlVXNpbmdTdGF0ZVNldChlZGdlVGFyZ2V0LAorCQkJCQkJCQkJCQkJCQl0YXJnZXRTdGF0ZSwKKwkJCQkJCQkJCQkJCQkJc3RhdGVzLAorCQkJCQkJCQkJCQkJCQlsYWJlbHMpOworCQkJCX0KKwkJCQkvLyBkb25lIHdpdGggdGhpcyBERkEgc3RhdGUgYXMgd2UndmUgZm91bmQgYSBnb29kIHBhdGggdG8gdGFyZ2V0CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWxhYmVscy5hZGQobmV3IExhYmVsKExhYmVsLkVQU0lMT04pKTsgLy8gaW5kaWNhdGUgbm8gaW5wdXQgZm91bmQKKwkJLy8gdGhpcyBoYXBwZW5zIG9uIGEgOiB7cDF9PyBhIHwgQSA7CisJCS8vRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX0NPTVBVVEVfU0FNUExFX0lOUFVUX1NFUSk7CisJfQorCisJLyoqIEdpdmVuIGEgc2FtcGxlIGlucHV0IHNlcXVlbmNlLCB5b3UgdXN1YWxseSB3b3VsZCBsaWtlIHRvIGtub3cgdGhlCisJICogIHBhdGggdGFrZW4gdGhyb3VnaCB0aGUgTkZBLiAgUmV0dXJuIHRoZSBsaXN0IG9mIE5GQSBzdGF0ZXMgdmlzaXRlZAorCSAqICB3aGlsZSBtYXRjaGluZyBhIGxpc3Qgb2YgbGFiZWxzLiAgVGhpcyBjYW5ub3QgdXNlIHRoZSB1c3VhbAorCSAqICBpbnRlcnByZXRlciwgd2hpY2ggZG9lcyBhIGRldGVybWluaXN0aWMgd2Fsay4gIFdlIG5lZWQgdG8gYmUgYWJsZSB0bworCSAqICB0YWtlIHBhdGhzIHRoYXQgYXJlIHR1cm5lZCBvZmYgZHVyaW5nIG5vbmRldGVybWluaXNtIHJlc29sdXRpb24uIFNvLAorCSAqICBqdXN0IGRvIGEgZGVwdGgtZmlyc3Qgd2FsayB0cmF2ZXJzaW5nIGVkZ2VzIGxhYmVsZWQgd2l0aCB0aGUgY3VycmVudAorCSAqICBsYWJlbC4gIFJldHVybiB0cnVlIGlmIGEgcGF0aCB3YXMgZm91bmQgZW1hbmF0aW5nIGZyb20gc3RhdGUgcy4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRORkFQYXRoKE5GQVN0YXRlIHMsICAgICAvLyBzdGFydGluZyB3aGVyZT8KKwkJCQkJCQkJIGludCBsYWJlbEluZGV4LCAvLyAwLi5sYWJlbHMuc2l6ZSgpLTEKKwkJCQkJCQkJIExpc3QgbGFiZWxzLCAgICAvLyBpbnB1dCBzZXF1ZW5jZQorCQkJCQkJCQkgTGlzdCBwYXRoKSAgICAgIC8vIG91dHB1dCBsaXN0IG9mIE5GQSBzdGF0ZXMKKwl7CisJCS8vIHRyYWNrIGEgdmlzaXQgdG8gc3RhdGUgcyBhdCBpbnB1dCBpbmRleCBsYWJlbEluZGV4IGlmIG5vdCBzZWVuCisJCVN0cmluZyB0aGlzU3RhdGVLZXkgPSBnZXRTdGF0ZUxhYmVsSW5kZXhLZXkocy5zdGF0ZU51bWJlcixsYWJlbEluZGV4KTsKKwkJaWYgKCBzdGF0ZXNWaXNpdGVkQXRJbnB1dERlcHRoLmNvbnRhaW5zKHRoaXNTdGF0ZUtleSkgKSB7CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKCIjIyMgYWxyZWFkeSB2aXNpdGVkICIrcy5zdGF0ZU51bWJlcisiIHByZXZpb3VzbHkgYXQgaW5kZXggIisKKwkJCQkJCSAgIGxhYmVsSW5kZXgpOworCQkJKi8KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlzdGF0ZXNWaXNpdGVkQXRJbnB1dERlcHRoLmFkZCh0aGlzU3RhdGVLZXkpOworCisJCS8qCisJCVN5c3RlbS5vdXQucHJpbnRsbigiZW50ZXIgc3RhdGUgIitzLnN0YXRlTnVtYmVyKyIgdmlzaXRlZCBzdGF0ZXM6ICIrCisJCQkJCQkgICBzdGF0ZXNWaXNpdGVkQXRJbnB1dERlcHRoKTsKKyAgICAgICAgKi8KKworCQkvLyBwaWNrIHRoZSBmaXJzdCBlZGdlIHdob3NlIHRhcmdldCBpcyBpbiBzdGF0ZXMgYW5kIHdob3NlCisJCS8vIGxhYmVsIGlzIGxhYmVsc1tsYWJlbEluZGV4XQorCQlmb3IgKGludCBpPTA7IGk8cy5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGkrKykgeworCQkJVHJhbnNpdGlvbiB0ID0gcy50cmFuc2l0aW9uW2ldOworCQkJTkZBU3RhdGUgZWRnZVRhcmdldCA9IChORkFTdGF0ZSl0LnRhcmdldDsKKwkJCUxhYmVsIGxhYmVsID0gKExhYmVsKWxhYmVscy5nZXQobGFiZWxJbmRleCk7CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKHMuc3RhdGVOdW1iZXIrIi0iKworCQkJCQkJCSAgIHQubGFiZWwudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSsiLT4iKworCQkJCQkJCSAgIGVkZ2VUYXJnZXQuc3RhdGVOdW1iZXIrIiA9PSIrCisJCQkJCQkJICAgbGFiZWwudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSsiPyIpOworCQkJKi8KKwkJCWlmICggdC5sYWJlbC5pc0Vwc2lsb24oKSB8fCB0LmxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCQkvLyBub25kZXRlcm1pbmlzdGljYWxseSBiYWNrdHJhY2sgZG93biBlcHNpbG9uIGVkZ2VzCisJCQkJcGF0aC5hZGQoZWRnZVRhcmdldCk7CisJCQkJYm9vbGVhbiBmb3VuZCA9CisJCQkJCWdldE5GQVBhdGgoZWRnZVRhcmdldCwgbGFiZWxJbmRleCwgbGFiZWxzLCBwYXRoKTsKKwkJCQlpZiAoIGZvdW5kICkgeworCQkJCQlzdGF0ZXNWaXNpdGVkQXRJbnB1dERlcHRoLnJlbW92ZSh0aGlzU3RhdGVLZXkpOworCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gcmV0dXJuIHRvICJjYWxsaW5nIiBzdGF0ZQorCQkJCX0KKwkJCQlwYXRoLnJlbW92ZShwYXRoLnNpemUoKS0xKTsgLy8gcmVtb3ZlOyBkaWRuJ3Qgd29yayBvdXQKKwkJCQljb250aW51ZTsgLy8gbG9vayBhdCB0aGUgbmV4dCBlZGdlCisJCQl9CisJCQlpZiAoIHQubGFiZWwubWF0Y2hlcyhsYWJlbCkgKSB7CisJCQkJcGF0aC5hZGQoZWRnZVRhcmdldCk7CisJCQkJLyoKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIGxhYmVsICIrCisJCQkJCQkJCSAgIHQubGFiZWwudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSsKKwkJCQkJCQkJICAgIiBhdCBzdGF0ZSAiK3Muc3RhdGVOdW1iZXIrIjsgbGFiZWxJbmRleD0iK2xhYmVsSW5kZXgpOworCQkJCSovCisJCQkJaWYgKCBsYWJlbEluZGV4PT1sYWJlbHMuc2l6ZSgpLTEgKSB7CisJCQkJCS8vIGZvdW5kIGxhc3QgbGFiZWw7IGRvbmUhCisJCQkJCXN0YXRlc1Zpc2l0ZWRBdElucHV0RGVwdGgucmVtb3ZlKHRoaXNTdGF0ZUtleSk7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQkvLyBvdGhlcndpc2UgdHJ5IHRvIG1hdGNoIHJlbWFpbmluZyBpbnB1dAorCQkJCWJvb2xlYW4gZm91bmQgPQorCQkJCQlnZXRORkFQYXRoKGVkZ2VUYXJnZXQsIGxhYmVsSW5kZXgrMSwgbGFiZWxzLCBwYXRoKTsKKwkJCQlpZiAoIGZvdW5kICkgeworCQkJCQlzdGF0ZXNWaXNpdGVkQXRJbnB1dERlcHRoLnJlbW92ZSh0aGlzU3RhdGVLZXkpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJLyoKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImJhY2t0cmFjazsgcGF0aCBmcm9tICIrcy5zdGF0ZU51bWJlcisiLT4iKworCQkJCQkJCQkgICB0LmxhYmVsLnRvU3RyaW5nKGRmYS5uZmEuZ3JhbW1hcikrIiBkaWRuJ3Qgd29yayIpOworCQkJCSovCisJCQkJcGF0aC5yZW1vdmUocGF0aC5zaXplKCktMSk7IC8vIHJlbW92ZTsgZGlkbid0IHdvcmsgb3V0CisJCQkJY29udGludWU7IC8vIGtlZXAgbG9va2luZyBmb3IgYSBwYXRoIGZvciBsYWJlbHMKKwkJCX0KKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibm8gZXBzaWxvbiBvciBtYXRjaGluZyBlZGdlOyByZW1vdmluZyAiK3RoaXNTdGF0ZUtleSk7CisJCS8vIG5vIGVkZ2Ugd2FzIGZvdW5kIG1hdGNoaW5nIGxhYmVsOyBpcyBvaywgc29tZSBzdGF0ZSB3aWxsIGhhdmUgaXQKKwkJc3RhdGVzVmlzaXRlZEF0SW5wdXREZXB0aC5yZW1vdmUodGhpc1N0YXRlS2V5KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RhdGVMYWJlbEluZGV4S2V5KGludCBzLCBpbnQgaSkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKHMpOworCQlidWYuYXBwZW5kKCdfJyk7CisJCWJ1Zi5hcHBlbmQoaSk7CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogRnJvbSBhbiBhbHQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhcnRpZmljaWFsIFRva2VucyBydWxlLCByZXR1cm4KKwkgKiAgdGhlIG5hbWUgb2YgdGhlIHRva2VuIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgYWx0LgorCSAqLyAKKwlwdWJsaWMgU3RyaW5nIGdldFRva2VuTmFtZUZvclRva2Vuc1J1bGVBbHQoaW50IGFsdCkgeworCQlORkFTdGF0ZSBkZWNpc2lvblN0YXRlID0gZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpOworCQlORkFTdGF0ZSBhbHRTdGF0ZSA9CisJCQlkZmEubmZhLmdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKGRlY2lzaW9uU3RhdGUsYWx0KTsKKwkJTkZBU3RhdGUgZGVjaXNpb25MZWZ0ID0gKE5GQVN0YXRlKWFsdFN0YXRlLnRyYW5zaXRpb25bMF0udGFyZ2V0OworCQlSdWxlQ2xvc3VyZVRyYW5zaXRpb24gcnVsZUNhbGxFZGdlID0KKwkJCShSdWxlQ2xvc3VyZVRyYW5zaXRpb24pZGVjaXNpb25MZWZ0LnRyYW5zaXRpb25bMF07CisJCU5GQVN0YXRlIHJ1bGVTdGFydFN0YXRlID0gKE5GQVN0YXRlKXJ1bGVDYWxsRWRnZS50YXJnZXQ7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhbHQgPSAiK2RlY2lzaW9uTGVmdC5nZXRFbmNsb3NpbmdSdWxlKCkpOworCQlyZXR1cm4gcnVsZVN0YXJ0U3RhdGUuZW5jbG9zaW5nUnVsZS5uYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzdGF0ZVRvUmVjdXJzaW9uT3ZlcmZsb3dDb25maWd1cmF0aW9uc01hcC5jbGVhcigpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xMMUFuYWx5emVyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9MTDFBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZjQ0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9MTDFBbmFseXplci5qYXZhCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50U2V0OworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludGVydmFsU2V0OworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuUnVsZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCisgKiBVc2VyOiBwYXJydAorICogRGF0ZTogRGVjIDMxLCAyMDA3CisgKiBUaW1lOiAxOjMxOjE2IFBNCisgKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBMTDFBbmFseXplciB7CisJLyoqCTAJaWYgd2UgaGl0IGVuZCBvZiBydWxlIGFuZCBpbnZva2VyIHNob3VsZCBrZWVwIGdvaW5nIChlcHNpbG9uKSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEVDVF9QUkVEX0VPUiA9IDA7CisJLyoqCTEJaWYgd2UgZm91bmQgYSBub25hdXRvYmFja3RyYWNraW5nIHByZWQgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRFQ1RfUFJFRF9GT1VORCA9IDE7CisJLyoqCTIJaWYgd2UgZGlkbid0IGZpbmQgc3VjaCBhIHByZWQgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRFQ1RfUFJFRF9OT1RfRk9VTkQgPSAyOworCisJcHVibGljIEdyYW1tYXIgZ3JhbW1hcjsKKworCS8qKiBVc2VkIGR1cmluZyBMT09LIHRvIGRldGVjdCBjb21wdXRhdGlvbiBjeWNsZXMgKi8KKwlwcm90ZWN0ZWQgU2V0PE5GQVN0YXRlPiBsb29rQnVzeSA9IG5ldyBIYXNoU2V0PE5GQVN0YXRlPigpOworCisJcHVibGljIE1hcDxORkFTdGF0ZSwgTG9va2FoZWFkU2V0PiBGSVJTVENhY2hlID0gbmV3IEhhc2hNYXA8TkZBU3RhdGUsIExvb2thaGVhZFNldD4oKTsKKwlwdWJsaWMgTWFwPFJ1bGUsIExvb2thaGVhZFNldD4gRk9MTE9XQ2FjaGUgPSBuZXcgSGFzaE1hcDxSdWxlLCBMb29rYWhlYWRTZXQ+KCk7CisKKwlwdWJsaWMgTEwxQW5hbHl6ZXIoR3JhbW1hciBncmFtbWFyKSB7CisJCXRoaXMuZ3JhbW1hciA9IGdyYW1tYXI7CisJfQorCisJLyoKKwlwdWJsaWMgdm9pZCBjb21wdXRlUnVsZUZJUlNUU2V0cygpIHsKKwkJaWYgKCBnZXROdW1iZXJPZkRlY2lzaW9ucygpPT0wICkgeworCQkJY3JlYXRlTkZBcygpOworCQl9CisJCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRSdWxlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVJ1bGUgciA9IChSdWxlKWl0Lm5leHQoKTsKKwkJCWlmICggci5pc1N5blByZWQgKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlMb29rYWhlYWRTZXQgcyA9IEZJUlNUKHIpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJGSVJTVCgiK3IubmFtZSsiKT0iK3MpOworCQl9CisJfQorCSovCisKKwkvKgorCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRPdmVycmlkZGVuUnVsZXNXaXRoRGlmZmVyZW50RklSU1QoKSB7CisJCS8vIHdhbGsgZXZlcnkgcnVsZSBpbiB0aGlzIGdyYW1tYXIgYW5kIGNvbXBhcmUgRklSU1Qgc2V0IHdpdGgKKwkJLy8gdGhvc2UgaW4gaW1wb3J0ZWQgZ3JhbW1hcnMuCisJCVNldDxTdHJpbmc+IHJ1bGVzID0gbmV3IEhhc2hTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGdldFJ1bGVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJUnVsZSByID0gKFJ1bGUpaXQubmV4dCgpOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oci5uYW1lKyIgRklSU1Q9IityLkZJUlNUKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVzLnNpemUoKTsgaSsrKSB7CisJCQkJR3JhbW1hciBnID0gZGVsZWdhdGVzLmdldChpKTsKKwkJCQlSdWxlIGltcG9ydGVkUnVsZSA9IGcuZ2V0UnVsZShyLm5hbWUpOworCQkJCWlmICggaW1wb3J0ZWRSdWxlICE9IG51bGwgKSB7IC8vIGV4aXN0cyBpbiBpbXBvcnRlZCBncmFtbWFyCisJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihyLm5hbWUrIiBleGlzdHMgaW4gaW1wb3J0ZWQgZ3JhbW1hcjogRklSU1Q9IitpbXBvcnRlZFJ1bGUuRklSU1QpOworCQkJCQlpZiAoICFyLkZJUlNULmVxdWFscyhpbXBvcnRlZFJ1bGUuRklSU1QpICkgeworCQkJCQkJcnVsZXMuYWRkKHIubmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJ1bGVzOworCX0KKworCXB1YmxpYyBTZXQ8UnVsZT4gZ2V0SW1wb3J0ZWRSdWxlc1NlbnNpdGl2ZVRvT3ZlcnJpZGRlblJ1bGVzRHVlVG9MT09LKCkgeworCQlTZXQ8U3RyaW5nPiBkaWZmRklSU1RzID0gZ2V0T3ZlcnJpZGRlblJ1bGVzV2l0aERpZmZlcmVudEZJUlNUKCk7CisJCVNldDxSdWxlPiBydWxlcyA9IG5ldyBIYXNoU2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBkaWZmRklSU1RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyByID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWxlZ2F0ZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQlHcmFtbWFyIGcgPSBkZWxlZ2F0ZXMuZ2V0KGkpOworCQkJCVNldDxSdWxlPiBjYWxsZXJzID0gZy5ydWxlU2Vuc2l0aXZpdHkuZ2V0KHIpOworCQkJCS8vIHNvbWVib2R5IGludm9rZXMgcnVsZSB3aG9zZSBGSVJTVCBjaGFuZ2VkIGluIHN1YmdyYW1tYXI/CisJCQkJaWYgKCBjYWxsZXJzIT1udWxsICkgeworCQkJCQlydWxlcy5hZGRBbGwoY2FsbGVycyk7CisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGcubmFtZSsiIHJ1bGVzICIrY2FsbGVycysiIHNlbnNpdGl2ZSB0byAiK3IrIjsgZHVwICdlbSIpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcnVsZXM7CisJfQorKi8KKworCS8qCisJcHVibGljIExvb2thaGVhZFNldCBMT09LKFJ1bGUgcikgeworCQlpZiAoIHIuRklSU1Q9PW51bGwgKSB7CisJCQlyLkZJUlNUID0gRklSU1Qoci5zdGFydFN0YXRlKTsKKwkJfQorCQlyZXR1cm4gci5GSVJTVDsKKwl9CisqLworCisJLyoqIEZyb20gYW4gTkZBIHN0YXRlLCBzLCBmaW5kIHRoZSBzZXQgb2YgYWxsIGxhYmVscyByZWFjaGFibGUgZnJvbSBzLgorCSAqICBVc2VkIHRvIGNvbXB1dGUgZm9sbG93IHNldHMgZm9yIGVycm9yIHJlY292ZXJ5LiAgTmV2ZXIgY29tcHV0ZXMKKwkgKiAgYSBGT0xMT1cgb3BlcmF0aW9uLiAgRklSU1Qgc3RvcHMgYXQgZW5kIG9mIHJ1bGVzLCByZXR1cm5pbmcgRU9SLCB1bmxlc3MKKwkgKiAgaW52b2tlZCBmcm9tIGFub3RoZXIgcnVsZS4gIEkuZS4sIHJvdXRpbmUgcHJvcGVybHkgaGFuZGxlcworCSAqCisJICogICAgIGEgOiBiIEEgOworCSAqCisJICogIHdoZXJlIGIgaXMgbnVsbGFibGUuCisJICoKKwkgKiAgV2UgcmVjb3JkIHdpdGggRU9SX1RPS0VOX1RZUEUgaWYgd2UgaGl0IHRoZSBlbmQgb2YgYSBydWxlIHNvIHdlIGNhbgorCSAqICBrbm93IGF0IHJ1bnRpbWUgKHdoZW4gdGhlc2Ugc2V0cyBhcmUgdXNlZCkgdG8gc3RhcnQgd2Fsa2luZyB1cCB0aGUKKwkgKiAgZm9sbG93IGNoYWluIHRvIGNvbXB1dGUgdGhlIHJlYWwsIGNvcnJlY3QgZm9sbG93IHNldCAoYXMgb3Bwb3NlZCB0bworCSAqICB0aGUgRk9MTE9XLCB3aGljaCBpcyBhIHN1cGVyc2V0KS4KKwkgKgorCSAqICBUaGlzIHJvdXRpbmUgd2lsbCBvbmx5IGJlIHVzZWQgb24gcGFyc2VyIGFuZCB0cmVlIHBhcnNlciBncmFtbWFycy4KKwkgKi8KKwlwdWJsaWMgTG9va2FoZWFkU2V0IEZJUlNUKE5GQVN0YXRlIHMpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIj4gRklSU1QoIitzLmVuY2xvc2luZ1J1bGUubmFtZSsiKSBpbiBydWxlICIrcy5lbmNsb3NpbmdSdWxlKTsKKwkJbG9va0J1c3kuY2xlYXIoKTsKKwkJTG9va2FoZWFkU2V0IGxvb2sgPSBfRklSU1QocywgZmFsc2UpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiPCBGSVJTVCgiK3MuZW5jbG9zaW5nUnVsZS5uYW1lKyIpIGluIHJ1bGUgIitzLmVuY2xvc2luZ1J1bGUrIj0iK2xvb2sudG9TdHJpbmcodGhpcy5ncmFtbWFyKSk7CisJCXJldHVybiBsb29rOworCX0KKworCXB1YmxpYyBMb29rYWhlYWRTZXQgRk9MTE9XKFJ1bGUgcikgeworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiPiBGT0xMT1coIityLm5hbWUrIikgaW4gcnVsZSAiK3Iuc3RhcnRTdGF0ZS5lbmNsb3NpbmdSdWxlKTsKKwkJTG9va2FoZWFkU2V0IGYgPSBGT0xMT1dDYWNoZS5nZXQocik7CisJCWlmICggZiE9bnVsbCApIHsKKwkJCXJldHVybiBmOworCQl9CisJCWYgPSBfRklSU1Qoci5zdG9wU3RhdGUsIHRydWUpOworCQlGT0xMT1dDYWNoZS5wdXQociwgZik7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCI8IEZPTExPVygiK3IrIikgaW4gcnVsZSAiK3Iuc3RhcnRTdGF0ZS5lbmNsb3NpbmdSdWxlKyI9IitmLnRvU3RyaW5nKHRoaXMuZ3JhbW1hcikpOworCQlyZXR1cm4gZjsKKwl9CisKKwlwdWJsaWMgTG9va2FoZWFkU2V0IExPT0soTkZBU3RhdGUgcykgeworCQlpZiAoIE5GQVRvREZBQ29udmVydGVyLmRlYnVnICkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCI+IExPT0soIitzKyIpIik7CisJCX0KKwkJbG9va0J1c3kuY2xlYXIoKTsKKwkJTG9va2FoZWFkU2V0IGxvb2sgPSBfRklSU1QocywgdHJ1ZSk7CisJCS8vIEZPTExPVyBtYWtlcyBubyBzZW5zZSAoYXQgdGhlIG1vbWVudCEpIGZvciBsZXhpY2FsIHJ1bGVzLgorCQlpZiAoIGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiAmJiBsb29rLm1lbWJlcihMYWJlbC5FT1JfVE9LRU5fVFlQRSkgKSB7CisJCQkvLyBhdm9pZCBhbHRlcmluZyBGSVJTVCByZXNldCBhcyBpdCBpcyBjYWNoZWQKKwkJCUxvb2thaGVhZFNldCBmID0gRk9MTE9XKHMuZW5jbG9zaW5nUnVsZSk7CisJCQlmLm9ySW5QbGFjZShsb29rKTsKKwkJCWYucmVtb3ZlKExhYmVsLkVPUl9UT0tFTl9UWVBFKTsKKwkJCWxvb2sgPSBmOworCQkJLy9sb29rLm9ySW5QbGFjZShGT0xMT1cocy5lbmNsb3NpbmdSdWxlKSk7CisJCX0KKwkJZWxzZSBpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiAmJiBsb29rLm1lbWJlcihMYWJlbC5FT1QpICkgeworCQkJLy8gaWYgdGhpcyBoYXMgRU9ULCBsb29rYWhlYWQgaXMgYWxsIGNoYXIgKGFsbCBjaGFyIGNhbiBmb2xsb3cgcnVsZSkKKwkJCS8vbG9vayA9IG5ldyBMb29rYWhlYWRTZXQoTGFiZWwuRU9UKTsKKwkJCWxvb2sgPSBuZXcgTG9va2FoZWFkU2V0KEludGVydmFsU2V0LkNPTVBMRVRFX1NFVCk7CisJCX0KKwkJaWYgKCBORkFUb0RGQUNvbnZlcnRlci5kZWJ1ZyApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiPCBMT09LKCIrcysiKT0iK2xvb2sudG9TdHJpbmcoZ3JhbW1hcikpOworCQl9CisJCXJldHVybiBsb29rOworCX0KKworCXByb3RlY3RlZCBMb29rYWhlYWRTZXQgX0ZJUlNUKE5GQVN0YXRlIHMsIGJvb2xlYW4gY2hhc2VGb2xsb3dUcmFuc2l0aW9ucykgeworCQkvKgorCQlTeXN0ZW0ub3V0LnByaW50bG4oIl9MT09LKCIrcysiKSBpbiBydWxlICIrcy5lbmNsb3NpbmdSdWxlKTsKKwkJaWYgKCBzLnRyYW5zaXRpb25bMF0gaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24gKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImdvIHRvIHJ1bGUgIisoKE5GQVN0YXRlKXMudHJhbnNpdGlvblswXS50YXJnZXQpLmVuY2xvc2luZ1J1bGUpOworCQl9CisJCSovCisJCWlmICggIWNoYXNlRm9sbG93VHJhbnNpdGlvbnMgJiYgcy5pc0FjY2VwdFN0YXRlKCkgKSB7CisJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApIHsKKwkJCQkvLyBGT0xMT1cgbWFrZXMgbm8gc2Vuc2UgKGF0IHRoZSBtb21lbnQhKSBmb3IgbGV4aWNhbCBydWxlcy4KKwkJCQkvLyBhc3N1bWUgYWxsIGNoYXIgY2FuIGZvbGxvdworCQkJCXJldHVybiBuZXcgTG9va2FoZWFkU2V0KEludGVydmFsU2V0LkNPTVBMRVRFX1NFVCk7CisJCQl9CisJCQlyZXR1cm4gbmV3IExvb2thaGVhZFNldChMYWJlbC5FT1JfVE9LRU5fVFlQRSk7CisJCX0KKworCQlpZiAoIGxvb2tCdXN5LmNvbnRhaW5zKHMpICkgeworCQkJLy8gcmV0dXJuIGEgY29weSBvZiBhbiBlbXB0eSBzZXQ7IHdlIG1heSBtb2RpZnkgc2V0IGlubGluZQorCQkJcmV0dXJuIG5ldyBMb29rYWhlYWRTZXQoKTsKKwkJfQorCQlsb29rQnVzeS5hZGQocyk7CisKKwkJVHJhbnNpdGlvbiB0cmFuc2l0aW9uMCA9IHMudHJhbnNpdGlvblswXTsKKwkJaWYgKCB0cmFuc2l0aW9uMD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJaWYgKCB0cmFuc2l0aW9uMC5sYWJlbC5pc0F0b20oKSApIHsKKwkJCWludCBhdG9tID0gdHJhbnNpdGlvbjAubGFiZWwuZ2V0QXRvbSgpOworCQkJcmV0dXJuIG5ldyBMb29rYWhlYWRTZXQoYXRvbSk7CisJCX0KKwkJaWYgKCB0cmFuc2l0aW9uMC5sYWJlbC5pc1NldCgpICkgeworCQkJSW50U2V0IHNsID0gdHJhbnNpdGlvbjAubGFiZWwuZ2V0U2V0KCk7CisJCQlyZXR1cm4gbmV3IExvb2thaGVhZFNldChzbCk7CisJCX0KKworCQkvLyBjb21wdXRlIEZJUlNUIG9mIHRyYW5zaXRpb24gMAorCQlMb29rYWhlYWRTZXQgdHNldCA9IG51bGw7CisJCS8vIGlmIHRyYW5zaXRpb24gMCBpcyBhIHJ1bGUgY2FsbCBhbmQgd2UgZG9uJ3Qgd2FudCBGT0xMT1csIGNoZWNrIGNhY2hlCisJCWlmICggIWNoYXNlRm9sbG93VHJhbnNpdGlvbnMgJiYgdHJhbnNpdGlvbjAgaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24gKSB7CisJCQl0c2V0ID0gRklSU1RDYWNoZS5nZXQoKE5GQVN0YXRlKXRyYW5zaXRpb24wLnRhcmdldCk7CisJCX0KKworCQkvLyBpZiBub3QgaW4gY2FjaGUsIG11c3QgY29tcHV0ZQorCQlpZiAoIHRzZXQ9PW51bGwgKSB7CisJCQl0c2V0ID0gX0ZJUlNUKChORkFTdGF0ZSl0cmFuc2l0aW9uMC50YXJnZXQsIGNoYXNlRm9sbG93VHJhbnNpdGlvbnMpOworCQkJLy8gc2F2ZSBGSVJTVCBjYWNoZSBmb3IgdHJhbnNpdGlvbiAwIGlmIHJ1bGUgY2FsbAorCQkJaWYgKCAhY2hhc2VGb2xsb3dUcmFuc2l0aW9ucyAmJiB0cmFuc2l0aW9uMCBpbnN0YW5jZW9mIFJ1bGVDbG9zdXJlVHJhbnNpdGlvbiApIHsKKwkJCQlGSVJTVENhY2hlLnB1dCgoTkZBU3RhdGUpdHJhbnNpdGlvbjAudGFyZ2V0LCB0c2V0KTsKKwkJCX0KKwkJfQorCisgICAgICAgIExvb2thaGVhZFNldCB0c2V0Q2FjaGVkID0gdHNldDsgLy8gdHNldCBpcyBzdG9yZWQgaW4gY2FjaGUuIFdlIGNhbid0IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZQorCisJCS8vIGRpZCB3ZSBmYWxsIG9mZiB0aGUgZW5kPworCQlpZiAoIGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiAmJiB0c2V0Lm1lbWJlcihMYWJlbC5FT1JfVE9LRU5fVFlQRSkgKSB7CisJCQlpZiAoIHRyYW5zaXRpb24wIGluc3RhbmNlb2YgUnVsZUNsb3N1cmVUcmFuc2l0aW9uICkgeworCQkJCS8vIHdlIGNhbGxlZCBhIHJ1bGUgdGhhdCBmb3VuZCB0aGUgZW5kIG9mIHRoZSBydWxlLgorCQkJCS8vIFRoYXQgbWVhbnMgdGhlIHJ1bGUgaXMgbnVsbGFibGUgYW5kIHdlIG5lZWQgdG8KKwkJCQkvLyBrZWVwIGxvb2tpbmcgYXQgd2hhdCBmb2xsb3dzIHRoZSBydWxlIHJlZi4gIEUuZy4sCisJCQkJLy8gYSA6IGIgQSA7IHdoZXJlIGIgaXMgbnVsbGFibGUgbWVhbnMgdGhhdCBMT09LKGEpCisJCQkJLy8gc2hvdWxkIGluY2x1ZGUgQS4KKwkJCQlSdWxlQ2xvc3VyZVRyYW5zaXRpb24gcnVsZUludm9jYXRpb25UcmFucyA9CisJCQkJCShSdWxlQ2xvc3VyZVRyYW5zaXRpb24pdHJhbnNpdGlvbjA7CisJCQkJLy8gcmVtb3ZlIHRoZSBFT1IgYW5kIGdldCB3aGF0IGZvbGxvd3MKKwkJCQkvL3RzZXQucmVtb3ZlKExhYmVsLkVPUl9UT0tFTl9UWVBFKTsKKwkJCQlORkFTdGF0ZSBmb2xsb3dpbmcgPSAoTkZBU3RhdGUpIHJ1bGVJbnZvY2F0aW9uVHJhbnMuZm9sbG93U3RhdGU7CisJCQkJTG9va2FoZWFkU2V0IGZzZXQgPQlfRklSU1QoZm9sbG93aW5nLCBjaGFzZUZvbGxvd1RyYW5zaXRpb25zKTsKKwkJCQlmc2V0Lm9ySW5QbGFjZSh0c2V0KTsgLy8gdHNldCBjYWNoZWQ7IG9yIGludG8gbmV3IHNldAorCQkJCWZzZXQucmVtb3ZlKExhYmVsLkVPUl9UT0tFTl9UWVBFKTsKKwkJCQl0c2V0ID0gZnNldDsKKwkJCX0KKwkJfQorCisJCVRyYW5zaXRpb24gdHJhbnNpdGlvbjEgPSBzLnRyYW5zaXRpb25bMV07CisJCWlmICggdHJhbnNpdGlvbjEhPW51bGwgKSB7CisJCQlMb29rYWhlYWRTZXQgdHNldDEgPQorCQkJCV9GSVJTVCgoTkZBU3RhdGUpdHJhbnNpdGlvbjEudGFyZ2V0LCBjaGFzZUZvbGxvd1RyYW5zaXRpb25zKTsKKwkJCXRzZXQxLm9ySW5QbGFjZSh0c2V0KTsKKwkJCXRzZXQgPSB0c2V0MTsKKwkJfQorCisJCS8vIG5ldmVyIHJldHVybiBhIGNhY2hlZCBzZXQ7IGNsb25lCisJCXJldHVybiB0c2V0PT10c2V0Q2FjaGVkID8gbmV3IExvb2thaGVhZFNldCh0c2V0KSA6IHRzZXQ7CisJfQorCisJLyoqIElzIHRoZXJlIGEgbm9uLXN5bi1wcmVkIHByZWRpY2F0ZSB2aXNpYmxlIGZyb20gcyB0aGF0IGlzIG5vdCBpbgorCSAqICB0aGUgcnVsZSBlbmNsb3Npbmcgcz8gIFRoaXMgYWNjb3VudHMgZm9yIG1vc3QgcHJlZGljYXRlIHNpdHVhdGlvbnMKKwkgKiAgYW5kIGxldHMgQU5UTFIgZG8gYSBzaW1wbGUgTEwoMSkrcHJlZCBjb21wdXRhdGlvbi4KKwkgKgorCSAqICBUT0RPOiB3aGF0IGFib3V0IGdhdGVkIHZzIHJlZ3VsYXIgcHJlZHM/CisJICovCisJcHVibGljIGJvb2xlYW4gZGV0ZWN0Q29uZm91bmRpbmdQcmVkaWNhdGVzKE5GQVN0YXRlIHMpIHsKKwkJbG9va0J1c3kuY2xlYXIoKTsKKwkJUnVsZSByID0gcy5lbmNsb3NpbmdSdWxlOworCQlyZXR1cm4gX2RldGVjdENvbmZvdW5kaW5nUHJlZGljYXRlcyhzLCByLCBmYWxzZSkgPT0gREVURUNUX1BSRURfRk9VTkQ7CisJfQorCisJcHJvdGVjdGVkIGludCBfZGV0ZWN0Q29uZm91bmRpbmdQcmVkaWNhdGVzKE5GQVN0YXRlIHMsCisJCQkJCQkJCQkJCSAgIFJ1bGUgZW5jbG9zaW5nUnVsZSwKKwkJCQkJCQkJCQkJICAgYm9vbGVhbiBjaGFzZUZvbGxvd1RyYW5zaXRpb25zKQorCXsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIl9kZXRlY3ROb25BdXRvYmFja3RyYWNrUHJlZGljYXRlcygiK3MrIikiKTsKKwkJaWYgKCAhY2hhc2VGb2xsb3dUcmFuc2l0aW9ucyAmJiBzLmlzQWNjZXB0U3RhdGUoKSApIHsKKwkJCWlmICggZ3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSICkgeworCQkJCS8vIEZPTExPVyBtYWtlcyBubyBzZW5zZSAoYXQgdGhlIG1vbWVudCEpIGZvciBsZXhpY2FsIHJ1bGVzLgorCQkJCS8vIGFzc3VtZSBhbGwgY2hhciBjYW4gZm9sbG93CisJCQkJcmV0dXJuIERFVEVDVF9QUkVEX05PVF9GT1VORDsKKwkJCX0KKwkJCXJldHVybiBERVRFQ1RfUFJFRF9FT1I7CisJCX0KKworCQlpZiAoIGxvb2tCdXN5LmNvbnRhaW5zKHMpICkgeworCQkJLy8gcmV0dXJuIGEgY29weSBvZiBhbiBlbXB0eSBzZXQ7IHdlIG1heSBtb2RpZnkgc2V0IGlubGluZQorCQkJcmV0dXJuIERFVEVDVF9QUkVEX05PVF9GT1VORDsKKwkJfQorCQlsb29rQnVzeS5hZGQocyk7CisKKwkJVHJhbnNpdGlvbiB0cmFuc2l0aW9uMCA9IHMudHJhbnNpdGlvblswXTsKKwkJaWYgKCB0cmFuc2l0aW9uMD09bnVsbCApIHsKKwkJCXJldHVybiBERVRFQ1RfUFJFRF9OT1RfRk9VTkQ7CisJCX0KKworCQlpZiAoICEodHJhbnNpdGlvbjAubGFiZWwuaXNTZW1hbnRpY1ByZWRpY2F0ZSgpfHwKKwkJCSAgIHRyYW5zaXRpb24wLmxhYmVsLmlzRXBzaWxvbigpKSApIHsKKwkJCXJldHVybiBERVRFQ1RfUFJFRF9OT1RfRk9VTkQ7CisJCX0KKworCQlpZiAoIHRyYW5zaXRpb24wLmxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJwcmVkICIrdHJhbnNpdGlvbjAubGFiZWwpOworCQkJU2VtYW50aWNDb250ZXh0IGN0eCA9IHRyYW5zaXRpb24wLmxhYmVsLmdldFNlbWFudGljQ29udGV4dCgpOworCQkJU2VtYW50aWNDb250ZXh0LlByZWRpY2F0ZSBwID0gKFNlbWFudGljQ29udGV4dC5QcmVkaWNhdGUpY3R4OworCQkJaWYgKCBwLnByZWRpY2F0ZUFTVC5nZXRUeXBlKCkgIT0gQU5UTFJQYXJzZXIuQkFDS1RSQUNLX1NFTVBSRUQgKSB7CisJCQkJcmV0dXJuIERFVEVDVF9QUkVEX0ZPVU5EOworCQkJfQorCQl9CisJCQorCQkvKgorCQlpZiAoIHRyYW5zaXRpb24wLmxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigicHJlZCAiK3RyYW5zaXRpb24wLmxhYmVsKTsKKwkJCVNlbWFudGljQ29udGV4dCBjdHggPSB0cmFuc2l0aW9uMC5sYWJlbC5nZXRTZW1hbnRpY0NvbnRleHQoKTsKKwkJCVNlbWFudGljQ29udGV4dC5QcmVkaWNhdGUgcCA9IChTZW1hbnRpY0NvbnRleHQuUHJlZGljYXRlKWN0eDsKKwkJCS8vIGlmIGEgbm9uLXN5bi1wcmVkIGZvdW5kIG5vdCBpbiBlbmNsb3NpbmdSdWxlLCBzYXkgd2UgZm91bmQgb25lCisJCQlpZiAoIHAucHJlZGljYXRlQVNULmdldFR5cGUoKSAhPSBBTlRMUlBhcnNlci5CQUNLVFJBQ0tfU0VNUFJFRCAmJgorCQkJCSAhcC5wcmVkaWNhdGVBU1QuZW5jbG9zaW5nUnVsZU5hbWUuZXF1YWxzKGVuY2xvc2luZ1J1bGUubmFtZSkgKQorCQkJeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcHJlZCAiK3ArIiBub3QgaW4gIitlbmNsb3NpbmdSdWxlLm5hbWUpOworCQkJCXJldHVybiBERVRFQ1RfUFJFRF9GT1VORDsKKwkJCX0KKwkJfQorCQkqLworCisJCWludCByZXN1bHQgPSBfZGV0ZWN0Q29uZm91bmRpbmdQcmVkaWNhdGVzKChORkFTdGF0ZSl0cmFuc2l0aW9uMC50YXJnZXQsCisJCQkJCQkJCQkJCQkgIGVuY2xvc2luZ1J1bGUsCisJCQkJCQkJCQkJCQkgIGNoYXNlRm9sbG93VHJhbnNpdGlvbnMpOworCQlpZiAoIHJlc3VsdCA9PSBERVRFQ1RfUFJFRF9GT1VORCApIHsKKwkJCXJldHVybiBERVRFQ1RfUFJFRF9GT1VORDsKKwkJfQorCisJCWlmICggcmVzdWx0ID09IERFVEVDVF9QUkVEX0VPUiApIHsKKwkJCWlmICggdHJhbnNpdGlvbjAgaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24gKSB7CisJCQkJLy8gd2UgY2FsbGVkIGEgcnVsZSB0aGF0IGZvdW5kIHRoZSBlbmQgb2YgdGhlIHJ1bGUuCisJCQkJLy8gVGhhdCBtZWFucyB0aGUgcnVsZSBpcyBudWxsYWJsZSBhbmQgd2UgbmVlZCB0bworCQkJCS8vIGtlZXAgbG9va2luZyBhdCB3aGF0IGZvbGxvd3MgdGhlIHJ1bGUgcmVmLiAgRS5nLiwKKwkJCQkvLyBhIDogYiBBIDsgd2hlcmUgYiBpcyBudWxsYWJsZSBtZWFucyB0aGF0IExPT0soYSkKKwkJCQkvLyBzaG91bGQgaW5jbHVkZSBBLgorCQkJCVJ1bGVDbG9zdXJlVHJhbnNpdGlvbiBydWxlSW52b2NhdGlvblRyYW5zID0KKwkJCQkJKFJ1bGVDbG9zdXJlVHJhbnNpdGlvbil0cmFuc2l0aW9uMDsKKwkJCQlORkFTdGF0ZSBmb2xsb3dpbmcgPSAoTkZBU3RhdGUpIHJ1bGVJbnZvY2F0aW9uVHJhbnMuZm9sbG93U3RhdGU7CisJCQkJaW50IGFmdGVyUnVsZVJlc3VsdCA9CisJCQkJCV9kZXRlY3RDb25mb3VuZGluZ1ByZWRpY2F0ZXMoZm9sbG93aW5nLAorCQkJCQkJCQkJCQkJIGVuY2xvc2luZ1J1bGUsCisJCQkJCQkJCQkJCQkgY2hhc2VGb2xsb3dUcmFuc2l0aW9ucyk7CisJCQkJaWYgKCBhZnRlclJ1bGVSZXN1bHQgPT0gREVURUNUX1BSRURfRk9VTkQgKSB7CisJCQkJCXJldHVybiBERVRFQ1RfUFJFRF9GT1VORDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlUcmFuc2l0aW9uIHRyYW5zaXRpb24xID0gcy50cmFuc2l0aW9uWzFdOworCQlpZiAoIHRyYW5zaXRpb24xIT1udWxsICkgeworCQkJaW50IHQxUmVzdWx0ID0KKwkJCQlfZGV0ZWN0Q29uZm91bmRpbmdQcmVkaWNhdGVzKChORkFTdGF0ZSl0cmFuc2l0aW9uMS50YXJnZXQsCisJCQkJCQkJCQkJCSBlbmNsb3NpbmdSdWxlLAorCQkJCQkJCQkJCQkgY2hhc2VGb2xsb3dUcmFuc2l0aW9ucyk7CisJCQlpZiAoIHQxUmVzdWx0ID09IERFVEVDVF9QUkVEX0ZPVU5EICkgeworCQkJCXJldHVybiBERVRFQ1RfUFJFRF9GT1VORDsKKwkJCX0KKwkJfQorCisJCXJldHVybiBERVRFQ1RfUFJFRF9OT1RfRk9VTkQ7CisJfQorCisJLyoqIFJldHVybiBwcmVkaWNhdGUgZXhwcmVzc2lvbiBmb3VuZCB2aWEgZXBzaWxvbiBlZGdlcyBmcm9tIHMuICBEbworCSAqICBub3QgbG9vayBpbnRvIG90aGVyIHJ1bGVzIGZvciBub3cuICBEbyBzb21ldGhpbmcgc2ltcGxlLiAgSW5jbHVkZQorCSAqICBiYWNrdHJhY2tpbmcgc3lucHJlZHMuCisJICovCisJcHVibGljIFNlbWFudGljQ29udGV4dCBnZXRQcmVkaWNhdGVzKE5GQVN0YXRlIGFsdFN0YXJ0U3RhdGUpIHsKKwkJbG9va0J1c3kuY2xlYXIoKTsKKwkJcmV0dXJuIF9nZXRQcmVkaWNhdGVzKGFsdFN0YXJ0U3RhdGUsIGFsdFN0YXJ0U3RhdGUpOworCX0KKworCXByb3RlY3RlZCBTZW1hbnRpY0NvbnRleHQgX2dldFByZWRpY2F0ZXMoTkZBU3RhdGUgcywgTkZBU3RhdGUgYWx0U3RhcnRTdGF0ZSkgeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiX2dldFByZWRpY2F0ZXMoIitzKyIpIik7CisJCWlmICggcy5pc0FjY2VwdFN0YXRlKCkgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGF2b2lkIGluZmluaXRlIGxvb3BzIGZyb20gKC4uKSogZXRjLi4uCisJCWlmICggbG9va0J1c3kuY29udGFpbnMocykgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlsb29rQnVzeS5hZGQocyk7CisKKwkJVHJhbnNpdGlvbiB0cmFuc2l0aW9uMCA9IHMudHJhbnNpdGlvblswXTsKKwkJLy8gbm8gdHJhbnNpdGlvbnMKKwkJaWYgKCB0cmFuc2l0aW9uMD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLy8gbm90IGEgcHJlZGljYXRlIGFuZCBub3QgZXZlbiBhbiBlcHNpbG9uCisJCWlmICggISh0cmFuc2l0aW9uMC5sYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCl8fAorCQkJICAgdHJhbnNpdGlvbjAubGFiZWwuaXNFcHNpbG9uKCkpICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlTZW1hbnRpY0NvbnRleHQgcCA9IG51bGw7CisJCVNlbWFudGljQ29udGV4dCBwMCA9IG51bGw7CisJCVNlbWFudGljQ29udGV4dCBwMSA9IG51bGw7CisJCWlmICggdHJhbnNpdGlvbjAubGFiZWwuaXNTZW1hbnRpY1ByZWRpY2F0ZSgpICkgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInByZWQgIit0cmFuc2l0aW9uMC5sYWJlbCk7CisJCQlwID0gdHJhbnNpdGlvbjAubGFiZWwuZ2V0U2VtYW50aWNDb250ZXh0KCk7CisJCQkvLyBpZ25vcmUgYmFja3RyYWNraW5nIHByZWRzIG5vdCBvbiBsZWZ0IGVkZ2UgZm9yIHRoaXMgZGVjaXNpb24KKwkJCWlmICggKChTZW1hbnRpY0NvbnRleHQuUHJlZGljYXRlKXApLnByZWRpY2F0ZUFTVC5nZXRUeXBlKCkgPT0KKwkJCQkgIEFOVExSUGFyc2VyLkJBQ0tUUkFDS19TRU1QUkVEICAmJgorCQkJCSBzID09IGFsdFN0YXJ0U3RhdGUudHJhbnNpdGlvblswXS50YXJnZXQgKQorCQkJeworCQkJCXAgPSBudWxsOyAvLyBkb24ndCBjb3VudAorCQkJfQorCQl9CisKKwkJLy8gZ2V0IHByZWRzIGZyb20gYmV5b25kIHRoaXMgc3RhdGUKKwkJcDAgPSBfZ2V0UHJlZGljYXRlcygoTkZBU3RhdGUpdHJhbnNpdGlvbjAudGFyZ2V0LCBhbHRTdGFydFN0YXRlKTsKKworCQkvLyBnZXQgcHJlZHMgZnJvbSBvdGhlciB0cmFuc2l0aW9uCisJCVRyYW5zaXRpb24gdHJhbnNpdGlvbjEgPSBzLnRyYW5zaXRpb25bMV07CisJCWlmICggdHJhbnNpdGlvbjEhPW51bGwgKSB7CisJCQlwMSA9IF9nZXRQcmVkaWNhdGVzKChORkFTdGF0ZSl0cmFuc2l0aW9uMS50YXJnZXQsIGFsdFN0YXJ0U3RhdGUpOworCQl9CisKKwkJLy8gam9pbiB0aGlzJmZvbGxvd2luZy1yaWdodHxmb2xsb3dpbmctZG93bgorCQlyZXR1cm4gU2VtYW50aWNDb250ZXh0LmFuZChwLFNlbWFudGljQ29udGV4dC5vcihwMCxwMSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xMMURGQS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTEwxREZBLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmNjc1OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xMMURGQS5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50ZXJ2YWxTZXQ7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuTXVsdGlNYXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogQSBzcGVjaWFsIERGQSB0aGF0IGlzIGV4YWN0bHkgTEwoMSkgb3IgTEwoMSkgd2l0aCBiYWNrdHJhY2tpbmcgbW9kZQorICogIHByZWRpY2F0ZXMgdG8gcmVzb2x2ZSBlZGdlIHNldCBjb2xsaXNpb25zLgorICovCitwdWJsaWMgY2xhc3MgTEwxREZBIGV4dGVuZHMgREZBIHsKKwkvKiogRnJvbSBsaXN0IG9mIGxvb2thaGVhZCBzZXRzIChvbmUgcGVyIGFsdCBpbiBkZWNpc2lvbiksIGNyZWF0ZQorCSAqICBhbiBMTCgxKSBERkEuICBPbmUgZWRnZSBwZXIgc2V0LgorCSAqCisJICogIHMwLXthbHQxfS0+Om89PjEKKwkgKiAgfCBcCisJICogIHwgIC17YWx0Mn0tPjpvPT4yCisJICogIHwKKwkgKiAgLi4uCisJICovCisJcHVibGljIExMMURGQShpbnQgZGVjaXNpb25OdW1iZXIsIE5GQVN0YXRlIGRlY2lzaW9uU3RhcnRTdGF0ZSwgTG9va2FoZWFkU2V0W10gYWx0TG9vaykgeworCQlERkFTdGF0ZSBzMCA9IG5ld1N0YXRlKCk7CisJCXN0YXJ0U3RhdGUgPSBzMDsKKwkJbmZhID0gZGVjaXNpb25TdGFydFN0YXRlLm5mYTsKKwkJbkFsdHMgPSBuZmEuZ3JhbW1hci5nZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShkZWNpc2lvblN0YXJ0U3RhdGUpOworCQl0aGlzLmRlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisJCXRoaXMuZGVjaXNpb25ORkFTdGFydFN0YXRlID0gZGVjaXNpb25TdGFydFN0YXRlOworCQlpbml0QWx0UmVsYXRlZEluZm8oKTsKKwkJdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJZm9yIChpbnQgYWx0PTE7IGFsdDxhbHRMb29rLmxlbmd0aDsgYWx0KyspIHsKKwkJCURGQVN0YXRlIGFjY2VwdEFsdFN0YXRlID0gbmV3U3RhdGUoKTsKKwkJCWFjY2VwdEFsdFN0YXRlLmFjY2VwdFN0YXRlID0gdHJ1ZTsKKwkJCXNldEFjY2VwdFN0YXRlKGFsdCwgYWNjZXB0QWx0U3RhdGUpOworCQkJYWNjZXB0QWx0U3RhdGUuayA9IDE7CisJCQlhY2NlcHRBbHRTdGF0ZS5jYWNoZWRVbmlxdWVseVByZWRpY2F0ZWRBbHQgPSBhbHQ7CisJCQlMYWJlbCBlID0gZ2V0TGFiZWxGb3JTZXQoYWx0TG9va1thbHRdLnRva2VuVHlwZVNldCk7CisJCQlzMC5hZGRUcmFuc2l0aW9uKGFjY2VwdEFsdFN0YXRlLCBlKTsKKwkJfQorCX0KKworCS8qKiBGcm9tIGEgc2V0IG9mIGVkZ2VzZXQtPmxpc3Qtb2YtYWx0cyBtYXBwaW5ncywgY3JlYXRlIGEgREZBCisJICogIHRoYXQgdXNlcyBzeW4gcHJlZHMgZm9yIGFsbCB8bGlzdC1vZi1hbHRzfD4xLgorCSAqLworCXB1YmxpYyBMTDFERkEoaW50IGRlY2lzaW9uTnVtYmVyLAorCQkJCSAgTkZBU3RhdGUgZGVjaXNpb25TdGFydFN0YXRlLAorCQkJCSAgTXVsdGlNYXA8SW50ZXJ2YWxTZXQsIEludGVnZXI+IGVkZ2VNYXApCisJeworCQlERkFTdGF0ZSBzMCA9IG5ld1N0YXRlKCk7CisJCXN0YXJ0U3RhdGUgPSBzMDsKKwkJbmZhID0gZGVjaXNpb25TdGFydFN0YXRlLm5mYTsKKwkJbkFsdHMgPSBuZmEuZ3JhbW1hci5nZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShkZWNpc2lvblN0YXJ0U3RhdGUpOworCQl0aGlzLmRlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisJCXRoaXMuZGVjaXNpb25ORkFTdGFydFN0YXRlID0gZGVjaXNpb25TdGFydFN0YXRlOworCQlpbml0QWx0UmVsYXRlZEluZm8oKTsKKwkJdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGVkZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJSW50ZXJ2YWxTZXQgZWRnZSA9IChJbnRlcnZhbFNldClpdC5uZXh0KCk7CisJCQlMaXN0PEludGVnZXI+IGFsdHMgPSBlZGdlTWFwLmdldChlZGdlKTsKKwkJCUNvbGxlY3Rpb25zLnNvcnQoYWx0cyk7IC8vIG1ha2Ugc3VyZSBhbHRzIGFyZSBhdHRlbXB0ZWQgaW4gb3JkZXIKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKGVkZ2UrIiAtPiAiK2FsdHMpOworCQkJREZBU3RhdGUgcyA9IG5ld1N0YXRlKCk7CisJCQlzLmsgPSAxOworCQkJTGFiZWwgZSA9IGdldExhYmVsRm9yU2V0KGVkZ2UpOworCQkJczAuYWRkVHJhbnNpdGlvbihzLCBlKTsKKwkJCWlmICggYWx0cy5zaXplKCk9PTEgKSB7CisJCQkJcy5hY2NlcHRTdGF0ZSA9IHRydWU7CisJCQkJaW50IGFsdCA9IGFsdHMuZ2V0KDApOworCQkJCXNldEFjY2VwdFN0YXRlKGFsdCwgcyk7CisJCQkJcy5jYWNoZWRVbmlxdWVseVByZWRpY2F0ZWRBbHQgPSBhbHQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyByZXNvbHZlIHdpdGggc3ludGFjdGljIHByZWRpY2F0ZXMuICBBZGQgZWRnZXMgZnJvbQorCQkJCS8vIHN0YXRlIHMgdGhhdCB0ZXN0IHByZWRpY2F0ZXMuCisJCQkJcy5yZXNvbHZlZFdpdGhQcmVkaWNhdGVzID0gdHJ1ZTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsdHMuc2l6ZSgpOyBpKyspIHsKKwkJCQkJaW50IGFsdCA9IChpbnQpYWx0cy5nZXQoaSk7CisJCQkJCXMuY2FjaGVkVW5pcXVlbHlQcmVkaWNhdGVkQWx0ID0JTkZBLklOVkFMSURfQUxUX05VTUJFUjsKKwkJCQkJREZBU3RhdGUgcHJlZERGQVRhcmdldCA9IGdldEFjY2VwdFN0YXRlKGFsdCk7CisJCQkJCWlmICggcHJlZERGQVRhcmdldD09bnVsbCApIHsKKwkJCQkJCXByZWRERkFUYXJnZXQgPSBuZXdTdGF0ZSgpOyAvLyBjcmVhdGUgaWYgbm90IHRoZXJlLgorCQkJCQkJcHJlZERGQVRhcmdldC5hY2NlcHRTdGF0ZSA9IHRydWU7CisJCQkJCQlwcmVkREZBVGFyZ2V0LmNhY2hlZFVuaXF1ZWx5UHJlZGljYXRlZEFsdCA9CWFsdDsKKwkJCQkJCXNldEFjY2VwdFN0YXRlKGFsdCwgcHJlZERGQVRhcmdldCk7CisJCQkJCX0KKwkJCQkJLy8gYWRkIGEgdHJhbnNpdGlvbiB0byBwcmVkIHRhcmdldCBmcm9tIGQKKwkJCQkJLyoKKwkJCQkJaW50IHdhbGtBbHQgPQorCQkJCQkJZGVjaXNpb25TdGFydFN0YXRlLnRyYW5zbGF0ZURpc3BsYXlBbHRUb1dhbGtBbHQoYWx0KTsKKwkJCQkJTkZBU3RhdGUgYWx0TGVmdEVkZ2UgPSBuZmEuZ3JhbW1hci5nZXRORkFTdGF0ZUZvckFsdE9mRGVjaXNpb24oZGVjaXNpb25TdGFydFN0YXRlLCB3YWxrQWx0KTsKKwkJCQkJTkZBU3RhdGUgYWx0U3RhcnRTdGF0ZSA9IChORkFTdGF0ZSlhbHRMZWZ0RWRnZS50cmFuc2l0aW9uWzBdLnRhcmdldDsKKwkJCQkJU2VtYW50aWNDb250ZXh0IGN0eCA9IG5mYS5ncmFtbWFyLmxsMUFuYWx5emVyLmdldFByZWRpY2F0ZXMoYWx0U3RhcnRTdGF0ZSk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VtIGN0eCA9ICIrY3R4KTsKKwkJCQkJaWYgKCBjdHggPT0gbnVsbCApIHsKKwkJCQkJCWN0eCA9IG5ldyBTZW1hbnRpY0NvbnRleHQuVHJ1ZVByZWRpY2F0ZSgpOworCQkJCQl9CisJCQkJCXMuYWRkVHJhbnNpdGlvbihwcmVkREZBVGFyZ2V0LCBuZXcgTGFiZWwoY3R4KSk7CisJCQkJCSovCisJCQkJCVNlbWFudGljQ29udGV4dC5QcmVkaWNhdGUgc3lucHJlZCA9CisJCQkJCQlnZXRTeW5QcmVkRm9yQWx0KGRlY2lzaW9uU3RhcnRTdGF0ZSwgYWx0KTsKKwkJCQkJaWYgKCBzeW5wcmVkID09IG51bGwgKSB7CisJCQkJCQlzeW5wcmVkID0gbmV3IFNlbWFudGljQ29udGV4dC5UcnVlUHJlZGljYXRlKCk7CisJCQkJCX0KKwkJCQkJcy5hZGRUcmFuc2l0aW9uKHByZWRERkFUYXJnZXQsIG5ldyBQcmVkaWNhdGVMYWJlbChzeW5wcmVkKSk7CisJCQkJfQorCQkJfQorCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJkZmEgZm9yIHByZWRzPVxuIit0aGlzKTsKKwl9CisKKwlwcm90ZWN0ZWQgTGFiZWwgZ2V0TGFiZWxGb3JTZXQoSW50ZXJ2YWxTZXQgZWRnZVNldCkgeworCQlMYWJlbCBlID0gbnVsbDsKKwkJaW50IGF0b20gPSBlZGdlU2V0LmdldFNpbmdsZUVsZW1lbnQoKTsKKwkJaWYgKCBhdG9tICE9IExhYmVsLklOVkFMSUQgKSB7CisJCQllID0gbmV3IExhYmVsKGF0b20pOworCQl9CisJCWVsc2UgeworCQkJZSA9IG5ldyBMYWJlbChlZGdlU2V0KTsKKwkJfQorCQlyZXR1cm4gZTsKKwl9CisKKwlwcm90ZWN0ZWQgU2VtYW50aWNDb250ZXh0LlByZWRpY2F0ZSBnZXRTeW5QcmVkRm9yQWx0KE5GQVN0YXRlIGRlY2lzaW9uU3RhcnRTdGF0ZSwKKwkJCQkJCQkJCQkJCQkJIGludCBhbHQpCisJeworCQlpbnQgd2Fsa0FsdCA9CisJCQlkZWNpc2lvblN0YXJ0U3RhdGUudHJhbnNsYXRlRGlzcGxheUFsdFRvV2Fsa0FsdChhbHQpOworCQlORkFTdGF0ZSBhbHRMZWZ0RWRnZSA9CisJCQluZmEuZ3JhbW1hci5nZXRORkFTdGF0ZUZvckFsdE9mRGVjaXNpb24oZGVjaXNpb25TdGFydFN0YXRlLCB3YWxrQWx0KTsKKwkJTkZBU3RhdGUgYWx0U3RhcnRTdGF0ZSA9IChORkFTdGF0ZSlhbHRMZWZ0RWRnZS50cmFuc2l0aW9uWzBdLnRhcmdldDsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFsdCAiK2FsdCsiIHN0YXJ0IHN0YXRlID0gIithbHRTdGFydFN0YXRlLnN0YXRlTnVtYmVyKTsKKwkJaWYgKCBhbHRTdGFydFN0YXRlLnRyYW5zaXRpb25bMF0uaXNTZW1hbnRpY1ByZWRpY2F0ZSgpICkgeworCQkJU2VtYW50aWNDb250ZXh0IGN0eCA9IGFsdFN0YXJ0U3RhdGUudHJhbnNpdGlvblswXS5sYWJlbC5nZXRTZW1hbnRpY0NvbnRleHQoKTsKKwkJCWlmICggY3R4LmlzU3ludGFjdGljUHJlZGljYXRlKCkgKSB7CisJCQkJU2VtYW50aWNDb250ZXh0LlByZWRpY2F0ZSBwID0gKFNlbWFudGljQ29udGV4dC5QcmVkaWNhdGUpY3R4OworCQkJCWlmICggcC5wcmVkaWNhdGVBU1QuZ2V0VHlwZSgpID09IEFOVExSUGFyc2VyLkJBQ0tUUkFDS19TRU1QUkVEICkgeworCQkJCQkvKgorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInN5biBwcmVkIGZvciBhbHQgIit3YWxrQWx0KyIgIisKKwkJCQkJCQkJCSAgICgoU2VtYW50aWNDb250ZXh0LlByZWRpY2F0ZSlhbHRTdGFydFN0YXRlLnRyYW5zaXRpb25bMF0ubGFiZWwuZ2V0U2VtYW50aWNDb250ZXh0KCkpLnByZWRpY2F0ZUFTVCk7CisJCQkJCSovCisJCQkJCWlmICggY3R4LmlzU3ludGFjdGljUHJlZGljYXRlKCkgKSB7CisJCQkJCQluZmEuZ3JhbW1hci5zeW5QcmVkVXNlZEluREZBKHRoaXMsIGN0eCk7CisJCQkJCX0KKwkJCQkJcmV0dXJuIChTZW1hbnRpY0NvbnRleHQuUHJlZGljYXRlKWFsdFN0YXJ0U3RhdGUudHJhbnNpdGlvblswXS5sYWJlbC5nZXRTZW1hbnRpY0NvbnRleHQoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTGFiZWwuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E4YTk3NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xhYmVsLmphdmEKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5JbnRTZXQ7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50ZXJ2YWxTZXQ7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKKworLyoqIEEgc3RhdGUgbWFjaGluZSB0cmFuc2l0aW9uIGxhYmVsLiAgQSBsYWJlbCBjYW4gYmUgZWl0aGVyIGEgc2ltcGxlCisgKiAgbGFiZWwgc3VjaCBhcyBhIHRva2VuIG9yIGNoYXJhY3Rlci4gIEEgbGFiZWwgY2FuIGJlIGEgc2V0IG9mIGNoYXIgb3IKKyAqICB0b2tlbnMuICBJdCBjYW4gYmUgYW4gZXBzaWxvbiB0cmFuc2l0aW9uLiAgSXQgY2FuIGJlIGEgc2VtYW50aWMgcHJlZGljYXRlCisgKiAgKHdoaWNoIGFzc3VtZXMgYW4gZXBzaWxvbiB0cmFuc2l0aW9uKSBvciBhIHRyZWUgb2YgcHJlZGljYXRlcyAoaW4gYSBERkEpLgorICogIFNwZWNpYWwgbGFiZWwgdHlwZXMgaGF2ZSB0byBiZSA8IDAgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBjaGFyLgorICovCitwdWJsaWMgY2xhc3MgTGFiZWwgaW1wbGVtZW50cyBDb21wYXJhYmxlLCBDbG9uZWFibGUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSUQgPSAtNzsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTiA9IC02OworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVQU0lMT04gPSAtNTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVQU0lMT05fU1RSID0gIjxFUFNJTE9OPiI7CisKKyAgICAvKiogbGFiZWwgaXMgYSBzZW1hbnRpYyBwcmVkaWNhdGU7IGltcGxpZXMgbGFiZWwgaXMgZXBzaWxvbiBhbHNvICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VNUFJFRCA9IC00OworCisgICAgLyoqIGxhYmVsIGlzIGEgc2V0IG9mIHRva2VucyBvciBjaGFyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VUID0gLTM7CisKKyAgICAvKiogRW5kIG9mIFRva2VuIGlzIGxpa2UgRU9GIGZvciBsZXhlciBydWxlcy4gIEl0IGltcGxpZXMgdGhhdCBubyBtb3JlCisgICAgICogIGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZSBhbmQgdGhhdCBORkEgY29udmVyc2lvbiBzaG91bGQgdGVybWluYXRlCisgICAgICogIGZvciB0aGlzIHBhdGguICBGb3IgZXhhbXBsZQorICAgICAqCisgICAgICogIEEgOiAnYScgJ2InIHwgJ2EnIDsKKyAgICAgKgorICAgICAqICB5aWVsZHMgYSBERkEgcHJlZGljdG9yOgorICAgICAqCisgICAgICogIG8tYS0+by1iLT4xICAgcHJlZGljdCBhbHQgMQorICAgICAqICAgICAgIHwKKyAgICAgKiAgICAgICB8LUVPVC0+byBwcmVkaWN0IGFsdCAyCisgICAgICoKKyAgICAgKiAgVG8gZ2VuZXJhdGUgY29kZSBmb3IgRU9ULCB0cmVhdCBpdCBhcyB0aGUgImRlZmF1bHQiIHBhdGgsIHdoaWNoCisgICAgICogIGltcGxpZXMgdGhlcmUgaXMgbm8gd2F5IHRvIG1pc21hdGNoIGEgY2hhciBmb3IgdGhlIHN0YXRlIGZyb20KKyAgICAgKiAgd2hpY2ggdGhlIEVPVCBlbWFuYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT1QgPSAtMjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRiA9IC0xOworCisJLyoqIFdlIGhhdmUgbGFiZWxzIGxpa2UgRVBTSUxPTiB0aGF0IGFyZSBiZWxvdyAwOyBpdCdzIGhhcmQgdG8KKwkgKiAgc3RvcmUgdGhlbSBpbiBhbiBhcnJheSB3aXRoIG5lZ2F0aXZlIGluZGV4IHNvIHVzZSB0aGlzCisJICogIGNvbnN0YW50IGFzIGFuIGluZGV4IHNoaWZ0IHdoZW4gYWNjZXNzaW5nIGFycmF5cyBiYXNlZCB1cG9uCisJICogIHRva2VuIHR5cGUuICBJZiByZWFsIHRva2VuIHR5cGUgaXMgaSwgdGhlbiBhcnJheSBpbmRleCB3b3VsZCBiZQorCSAqICBOVU1fRkFVWF9MQUJFTFMgKyBpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9GQVVYX0xBQkVMUyA9IC1JTlZBTElEOworCisgICAgLyoqIEFueXRoaW5nIGF0IHRoaXMgdmFsdWUgb3IgbGFyZ2VyIGNhbiBiZSBjb25zaWRlcmVkIGEgc2ltcGxlIGF0b20gaW50CisgICAgICogIGZvciBlYXN5IGNvbXBhcmlzb24gZHVyaW5nIGFuYWx5c2lzIG9ubHk7IGZhdXggbGFiZWxzIGFyZSBub3QgdXNlZAorCSAqICBkdXJpbmcgcGFyc2UgdGltZSBmb3IgcmVhbCB0b2tlbiB0eXBlcyBvciBjaGFyIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQVRPTV9WQUxVRSA9IEVPVDsKKworICAgIC8vIFRPRE86IGlzIDAgYSB2YWxpZCB1bmljb2RlIGNoYXI/IG1heCBpcyBGRkZGIC0xLCByaWdodD8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQ0hBUl9WQUxVRSA9ICdcdTAwMDAnOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSX1ZBTFVFID0gJ1x1RkZGRic7CisKKwkvKiogRW5kIG9mIHJ1bGUgdG9rZW4gdHlwZTsgaW1hZ2luYXJ5IHRva2VuIHR5cGUgdXNlZCBvbmx5IGZvcgorCSAqICBsb2NhbCwgcGFydGlhbCBGT0xMT1cgc2V0cyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsb2NhbCBGT0xMT1cKKwkgKiAgaGl0IHRoZSBlbmQgb2YgcnVsZS4gIER1cmluZyBlcnJvciByZWNvdmVyeSwgdGhlIGxvY2FsIEZPTExPVworCSAqICBvZiBhIHRva2VuIHJlZmVyZW5jZSBtYXkgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJ1bGUgYW5kIGhhdmUKKwkgKiAgdG8gdXNlIEZPTExPVyhydWxlKS4gIEkgaGF2ZSB0byBqdXN0IHNoaWZ0IHRoZSB0b2tlbiB0eXBlcyB0byAyLi5uCisJICogIHJhdGhlciB0aGFuIDEuLm4gdG8gYWNjb21tb2RhdGUgdGhpcyBpbWFnaW5hcnkgdG9rZW4gaW4gbXkgYml0c2V0cy4KKwkgKiAgSWYgSSBkaWRuJ3QgdXNlIGEgYml0c2V0IGltcGxlbWVudGF0aW9uIGZvciBydW50aW1lIHNldHMsIEkgd291bGRuJ3QKKwkgKiAgbmVlZCB0aGlzLiAgRU9GIGlzIGFub3RoZXIgY2FuZGlkYXRlIGZvciBhIHJ1biB0aW1lIHRva2VuIHR5cGUgZm9yCisJICogIHBhcnNlcnMuICBGb2xsb3cgc2V0cyBhcmUgbm90IGNvbXB1dGVkIGZvciBsZXhlcnMgc28gd2UgZG8gbm90IGhhdmUKKwkgKiAgdGhpcyBpc3N1ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT1JfVE9LRU5fVFlQRSA9CisJCW9yZy5hbnRsci5ydW50aW1lLlRva2VuLkVPUl9UT0tFTl9UWVBFOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9XTiA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRPV047CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVAgPSBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5VUDsKKworICAgIC8qKiB0b2tlbnMgYW5kIGNoYXIgcmFuZ2Ugb3ZlcmxhcDsgdG9rZW5zIGFyZSBNSU5fVE9LRU5fVFlQRS4ubiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9UT0tFTl9UWVBFID0KKwkJb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uTUlOX1RPS0VOX1RZUEU7CisKKyAgICAvKiogVGhlIHdpbGRjYXJkICcuJyBjaGFyIGF0b20gaW1wbGllcyBhbGwgdmFsaWQgY2hhcmFjdGVycz09VU5JQ09ERSAqLworICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBJbnRTZXQgQUxMQ0hBUiA9IEludGVydmFsU2V0Lm9mKE1JTl9DSEFSX1ZBTFVFLE1BWF9DSEFSX1ZBTFVFKTsKKworICAgIC8qKiBUaGUgdG9rZW4gdHlwZSBvciBjaGFyYWN0ZXIgdmFsdWU7IG9yLCBzaWduaWZpZXMgc3BlY2lhbCBsYWJlbC4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxhYmVsOworCisgICAgLyoqIEEgc2V0IG9mIHRva2VuIHR5cGVzIG9yIGNoYXJhY3RlciBjb2RlcyBpZiBsYWJlbD09U0VUICovCisJLy8gVE9ETzogdHJ5IEludGVydmFsU2V0IGZvciBldmVyeXRoaW5nCisgICAgcHJvdGVjdGVkIEludFNldCBsYWJlbFNldDsKKworICAgIHB1YmxpYyBMYWJlbChpbnQgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKworICAgIC8qKiBNYWtlIGEgc2V0IGxhYmVsICovCisgICAgcHVibGljIExhYmVsKEludFNldCBsYWJlbFNldCkgeworCQlpZiAoIGxhYmVsU2V0PT1udWxsICkgeworCQkJdGhpcy5sYWJlbCA9IFNFVDsKKwkJCXRoaXMubGFiZWxTZXQgPSBJbnRlcnZhbFNldC5vZihJTlZBTElEKTsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgc2luZ2xlQXRvbSA9IGxhYmVsU2V0LmdldFNpbmdsZUVsZW1lbnQoKTsKKyAgICAgICAgaWYgKCBzaW5nbGVBdG9tIT1JTlZBTElEICkgeworICAgICAgICAgICAgLy8gY29udmVydCBiYWNrIHRvIGEgc2luZ2xlIGF0b21pYyBlbGVtZW50IGlmIHxsYWJlbFNldHw9PTEKKyAgICAgICAgICAgIGxhYmVsID0gc2luZ2xlQXRvbTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmxhYmVsID0gU0VUOworICAgICAgICB0aGlzLmxhYmVsU2V0ID0gbGFiZWxTZXQ7CisgICAgfQorCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJTGFiZWwgbDsKKwkJdHJ5IHsKKwkJCWwgPSAoTGFiZWwpc3VwZXIuY2xvbmUoKTsKKwkJCWwubGFiZWwgPSB0aGlzLmxhYmVsOworICAgICAgICAgICAgbC5sYWJlbFNldCA9IG5ldyBJbnRlcnZhbFNldCgpOworCQkJbC5sYWJlbFNldC5hZGRBbGwodGhpcy5sYWJlbFNldCk7CisJCX0KKwkJY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7CisJCX0KKwkJcmV0dXJuIGw7CisJfQorCisJcHVibGljIHZvaWQgYWRkKExhYmVsIGEpIHsKKwkJaWYgKCBpc0F0b20oKSApIHsKKwkJCWxhYmVsU2V0ID0gSW50ZXJ2YWxTZXQub2YobGFiZWwpOworCQkJbGFiZWw9U0VUOworCQkJaWYgKCBhLmlzQXRvbSgpICkgeworCQkJCWxhYmVsU2V0LmFkZChhLmdldEF0b20oKSk7CisJCQl9CisJCQllbHNlIGlmICggYS5pc1NldCgpICkgeworCQkJCWxhYmVsU2V0LmFkZEFsbChhLmdldFNldCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbid0IGFkZCBlbGVtZW50IHRvIExhYmVsIG9mIHR5cGUgIitsYWJlbCk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCBpc1NldCgpICkgeworCQkJaWYgKCBhLmlzQXRvbSgpICkgeworCQkJCWxhYmVsU2V0LmFkZChhLmdldEF0b20oKSk7CisJCQl9CisJCQllbHNlIGlmICggYS5pc1NldCgpICkgeworCQkJCWxhYmVsU2V0LmFkZEFsbChhLmdldFNldCgpKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbid0IGFkZCBlbGVtZW50IHRvIExhYmVsIG9mIHR5cGUgIitsYWJlbCk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2FuJ3QgYWRkIGVsZW1lbnQgdG8gTGFiZWwgb2YgdHlwZSAiK2xhYmVsKTsKKwl9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0b20oKSB7CisgICAgICAgIHJldHVybiBsYWJlbD49TUlOX0FUT01fVkFMVUU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFcHNpbG9uKCkgeworICAgICAgICByZXR1cm4gbGFiZWw9PUVQU0lMT047CisgICAgfQorCisJcHVibGljIGJvb2xlYW4gaXNTZW1hbnRpY1ByZWRpY2F0ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQWN0aW9uKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoKSB7CisgICAgICAgIHJldHVybiBsYWJlbD09U0VUOworICAgIH0KKworICAgIC8qKiByZXR1cm4gdGhlIHNpbmdsZSBhdG9tIGxhYmVsIG9yIElOVkFMSUQgaWYgbm90IGEgc2luZ2xlIGF0b20gKi8KKyAgICBwdWJsaWMgaW50IGdldEF0b20oKSB7CisgICAgICAgIGlmICggaXNBdG9tKCkgKSB7CisgICAgICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSUQ7CisgICAgfQorCisgICAgcHVibGljIEludFNldCBnZXRTZXQoKSB7CisgICAgICAgIGlmICggbGFiZWwhPVNFVCApIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgc2luZ2xlIGVsZW1lbnQgdG8gYSBzZXQgaWYgdGhleSBhc2sgZm9yIGl0LgorICAgICAgICAgICAgcmV0dXJuIEludGVydmFsU2V0Lm9mKGxhYmVsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFiZWxTZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2V0KEludFNldCBzZXQpIHsKKyAgICAgICAgbGFiZWw9U0VUOworICAgICAgICBsYWJlbFNldCA9IHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VtYW50aWNDb250ZXh0IGdldFNlbWFudGljQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhpbnQgYXRvbSkgeworCQlpZiAoIGxhYmVsPT1hdG9tICkgeworCQkJcmV0dXJuIHRydWU7IC8vIGhhbmRsZSB0aGUgc2luZ2xlIGF0b20gY2FzZSBlZmZpY2llbnRseQorCQl9CisJCWlmICggaXNTZXQoKSApIHsKKwkJCXJldHVybiBsYWJlbFNldC5tZW1iZXIoYXRvbSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoSW50U2V0IHNldCkgeworCQlpZiAoIGlzQXRvbSgpICkgeworCQkJcmV0dXJuIHNldC5tZW1iZXIoZ2V0QXRvbSgpKTsKKwkJfQorCQlpZiAoIGlzU2V0KCkgKSB7CisJCQkvLyBtYXRjaGVzIGlmIGludGVyc2VjdGlvbiBub24tbmlsCisJCQlyZXR1cm4gIWdldFNldCgpLmFuZChzZXQpLmlzTmlsKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCisJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhMYWJlbCBvdGhlcikgeworCQlpZiAoIG90aGVyLmlzU2V0KCkgKSB7CisJCQlyZXR1cm4gbWF0Y2hlcyhvdGhlci5nZXRTZXQoKSk7CisJCX0KKwkJaWYgKCBvdGhlci5pc0F0b20oKSApIHsKKwkJCXJldHVybiBtYXRjaGVzKG90aGVyLmdldEF0b20oKSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGlmIChsYWJlbD09U0VUKSB7CisgICAgICAgICAgICByZXR1cm4gbGFiZWxTZXQuaGFzaENvZGUoKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBsYWJlbDsKKwkJfQorCX0KKworCS8vIFRPRE86IGRvIHdlIGNhcmUgYWJvdXQgY29tcGFyaW5nIHNldCB7QX0gd2l0aCBhdG9tIEE/IERvZXNuJ3Qgbm93LgorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAoIG89PW51bGwgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCB0aGlzID09IG8gKSB7CisJCQlyZXR1cm4gdHJ1ZTsgLy8gZXF1YWxzIGlmIHNhbWUgb2JqZWN0CisJCX0KKwkJLy8gbGFiZWxzIG11c3QgYmUgdGhlIHNhbWUgZXZlbiBpZiBlcHNpbG9uIG9yIHNldCBvciBzZW1wcmVkIGV0Yy4uLgorICAgICAgICBpZiAoIGxhYmVsIT0oKExhYmVsKW8pLmxhYmVsICkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisJCWlmICggbGFiZWw9PVNFVCApIHsKKwkJCXJldHVybiB0aGlzLmxhYmVsU2V0LmVxdWFscygoKExhYmVsKW8pLmxhYmVsU2V0KTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsgIC8vIGxhYmVsIHZhbHVlcyBhcmUgc2FtZSwgc28gdHJ1ZQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxhYmVsLSgoTGFiZWwpbykubGFiZWw7CisgICAgfQorCisgICAgLyoqIFByZWRpY2F0ZXMgYXJlIGxpc3RzIG9mIEFTVCBub2RlcyBmcm9tIHRoZSBORkEgY3JlYXRlZCBmcm9tIHRoZQorICAgICAqICBncmFtbWFyLCBidXQgdGhlIHNhbWUgcHJlZGljYXRlIGNvdWxkIGJlIGN1dC9wYXN0ZSBpbnRvIG11bHRpcGxlCisgICAgICogIHBsYWNlcyBpbiB0aGUgZ3JhbW1hci4gIEkgbXVzdCBjb21wYXJlIHRoZSB0ZXh0IG9mIGFsbCB0aGUKKyAgICAgKiAgcHJlZGljYXRlcyB0byB0cnVseSBhbnN3ZXIgd2hldGhlciB7cDEscDJ9IC5lcXVhbHMge3AxLHAyfS4KKyAgICAgKiAgVW5mb3J0dW5hdGVseSwgSSBjYW5ub3QgcmVseSBvbiB0aGUgQVNULmVxdWFscygpIHRvIHdvcmsgcHJvcGVybHkKKyAgICAgKiAgc28gSSBtdXN0IGRvIGEgYnJ1dGUgZm9yY2UgTyhuXjIpIG5lc3RlZCB0cmF2ZXJzYWwgb2YgdGhlIFNldAorICAgICAqICBkb2luZyBhIFN0cmluZyBjb21wYXJlLgorICAgICAqCisgICAgICogIEF0IHRoaXMgcG9pbnQsIExhYmVscyBhcmUgbm90IGNvbXBhcmVkIGZvciBlcXVhbHMgd2hlbiB0aGV5IGFyZQorICAgICAqICBwcmVkaWNhdGVzLCBidXQgaGVyZSdzIHRoZSBjb2RlIGZvciBmdXR1cmUgdXNlLgorICAgICAqLworICAgIC8qCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlZGljYXRlc0VxdWFscyhTZXQgb3RoZXJzKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzZW1hbnRpY0NvbnRleHQuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBBU1QgcHJlZEFTVCA9IChBU1QpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgSXRlcmF0b3IgaW5uZXIgPSBzZW1hbnRpY0NvbnRleHQuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpbm5lci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBBU1Qgb3RoZXJQcmVkQVNUID0gKEFTVCkgaW5uZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmICggIXByZWRBU1QuZ2V0VGV4dCgpLmVxdWFscyhvdGhlclByZWRBU1QuZ2V0VGV4dCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgICAqLworCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgc3dpdGNoIChsYWJlbCkgeworICAgICAgICAgICAgY2FzZSBTRVQgOgorICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbFNldC50b1N0cmluZygpOworICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGxhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoR3JhbW1hciBnKSB7CisgICAgICAgIHN3aXRjaCAobGFiZWwpIHsKKyAgICAgICAgICAgIGNhc2UgU0VUIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxTZXQudG9TdHJpbmcoZyk7CisgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZy5nZXRUb2tlbkRpc3BsYXlOYW1lKGxhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgcHVibGljIFN0cmluZyBwcmVkaWNhdGVzVG9TdHJpbmcoKSB7CisgICAgICAgIGlmICggc2VtYW50aWNDb250ZXh0PT1ORkFDb25maWd1cmF0aW9uLkRFRkFVTFRfQ0xBVVNFX1NFTUFOVElDX0NPTlRFWFQgKSB7CisgICAgICAgICAgICByZXR1cm4gIiFvdGhlciBwcmVkcyI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHNlbWFudGljQ29udGV4dC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEFTVCBwcmVkQVNUID0gKEFTVCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKHByZWRBU1QuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIGlmICggaXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiJiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisgICAgKi8KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbnRlcnNlY3QoTGFiZWwgbGFiZWwsIExhYmVsIGVkZ2VMYWJlbCkgeworCQlib29sZWFuIGhhc0ludGVyc2VjdGlvbiA9IGZhbHNlOworCQlib29sZWFuIGxhYmVsSXNTZXQgPSBsYWJlbC5pc1NldCgpOworCQlib29sZWFuIGVkZ2VJc1NldCA9IGVkZ2VMYWJlbC5pc1NldCgpOworCQlpZiAoICFsYWJlbElzU2V0ICYmICFlZGdlSXNTZXQgJiYgZWRnZUxhYmVsLmxhYmVsPT1sYWJlbC5sYWJlbCApIHsKKwkJCWhhc0ludGVyc2VjdGlvbiA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiAoIGxhYmVsSXNTZXQgJiYgZWRnZUlzU2V0ICYmCisJCQkJICAhZWRnZUxhYmVsLmdldFNldCgpLmFuZChsYWJlbC5nZXRTZXQoKSkuaXNOaWwoKSApIHsKKwkJCWhhc0ludGVyc2VjdGlvbiA9IHRydWU7CisJCX0KKwkJZWxzZSBpZiAoIGxhYmVsSXNTZXQgJiYgIWVkZ2VJc1NldCAmJgorCQkJCSAgbGFiZWwuZ2V0U2V0KCkubWVtYmVyKGVkZ2VMYWJlbC5sYWJlbCkgKSB7CisJCQloYXNJbnRlcnNlY3Rpb24gPSB0cnVlOworCQl9CisJCWVsc2UgaWYgKCAhbGFiZWxJc1NldCAmJiBlZGdlSXNTZXQgJiYKKwkJCQkgIGVkZ2VMYWJlbC5nZXRTZXQoKS5tZW1iZXIobGFiZWwubGFiZWwpICkgeworCQkJaGFzSW50ZXJzZWN0aW9uID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gaGFzSW50ZXJzZWN0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xvb2thaGVhZFNldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTG9va2FoZWFkU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNWNjOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL0xvb2thaGVhZFNldC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50U2V0OworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludGVydmFsU2V0OworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKKy8qKiBBbiBMTCgxKSBsb29rYWhlYWQgc2V0OyBjb250YWlucyBhIHNldCBvZiB0b2tlbiB0eXBlcyBhbmQgYSAiaGFzRU9GIgorICogIGNvbmRpdGlvbiB3aGVuIHRoZSBzZXQgY29udGFpbnMgRU9GLiAgU2luY2UgRU9GIGlzIC0xIGV2ZXJ5d2hlcmUgYW5kIC0xCisgKiAgY2Fubm90IGJlIHN0b3JlZCBpbiBteSBCaXRTZXQsIEkgc2V0IGEgY29uZGl0aW9uIGhlcmUuICBUaGVyZSBtYXkgYmUgb3RoZXIKKyAqICByZWFzb25zIGluIHRoZSBmdXR1cmUgdG8gYWJzdHJhY3QgYSBMb29rYWhlYWRTZXQgb3ZlciBhIHJhdyBCaXRTZXQuCisgKi8KK3B1YmxpYyBjbGFzcyBMb29rYWhlYWRTZXQgeworCXB1YmxpYyBJbnRlcnZhbFNldCB0b2tlblR5cGVTZXQ7CisKKwlwdWJsaWMgTG9va2FoZWFkU2V0KCkgeworCQl0b2tlblR5cGVTZXQgPSBuZXcgSW50ZXJ2YWxTZXQoKTsKKwl9CisKKwlwdWJsaWMgTG9va2FoZWFkU2V0KEludFNldCBzKSB7CisJCXRoaXMoKTsKKwkJdG9rZW5UeXBlU2V0LmFkZEFsbChzKTsKKwl9CisKKwlwdWJsaWMgTG9va2FoZWFkU2V0KGludCBhdG9tKSB7CisJCXRva2VuVHlwZVNldCA9IEludGVydmFsU2V0Lm9mKGF0b20pOworCX0KKworICAgIHB1YmxpYyBMb29rYWhlYWRTZXQoTG9va2FoZWFkU2V0IG90aGVyKSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgdGhpcy50b2tlblR5cGVTZXQuYWRkQWxsKG90aGVyLnRva2VuVHlwZVNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3JJblBsYWNlKExvb2thaGVhZFNldCBvdGhlcikgeworCQl0aGlzLnRva2VuVHlwZVNldC5hZGRBbGwob3RoZXIudG9rZW5UeXBlU2V0KTsKKwl9CisKKwlwdWJsaWMgTG9va2FoZWFkU2V0IG9yKExvb2thaGVhZFNldCBvdGhlcikgeworCQlyZXR1cm4gbmV3IExvb2thaGVhZFNldCh0b2tlblR5cGVTZXQub3Iob3RoZXIudG9rZW5UeXBlU2V0KSk7CisJfQorCisJcHVibGljIExvb2thaGVhZFNldCBzdWJ0cmFjdChMb29rYWhlYWRTZXQgb3RoZXIpIHsKKwkJcmV0dXJuIG5ldyBMb29rYWhlYWRTZXQodGhpcy50b2tlblR5cGVTZXQuc3VidHJhY3Qob3RoZXIudG9rZW5UeXBlU2V0KSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbWVtYmVyKGludCBhKSB7CisJCXJldHVybiB0b2tlblR5cGVTZXQubWVtYmVyKGEpOworCX0KKworCXB1YmxpYyBMb29rYWhlYWRTZXQgaW50ZXJzZWN0aW9uKExvb2thaGVhZFNldCBzKSB7CisJCUludFNldCBpID0gdGhpcy50b2tlblR5cGVTZXQuYW5kKHMudG9rZW5UeXBlU2V0KTsKKwkJTG9va2FoZWFkU2V0IGludGVyc2VjdGlvbiA9IG5ldyBMb29rYWhlYWRTZXQoaSk7CisJCXJldHVybiBpbnRlcnNlY3Rpb247CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNOaWwoKSB7CisJCXJldHVybiB0b2tlblR5cGVTZXQuaXNOaWwoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGEpIHsKKwkJdG9rZW5UeXBlU2V0ID0gKEludGVydmFsU2V0KXRva2VuVHlwZVNldC5zdWJ0cmFjdChJbnRlcnZhbFNldC5vZihhKSk7CisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHRva2VuVHlwZVNldC5oYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJcmV0dXJuIHRva2VuVHlwZVNldC5lcXVhbHMoKChMb29rYWhlYWRTZXQpb3RoZXIpLnRva2VuVHlwZVNldCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhHcmFtbWFyIGcpIHsKKwkJaWYgKCB0b2tlblR5cGVTZXQ9PW51bGwgKSB7CisJCQlyZXR1cm4gIiI7CisJCX0KKwkJU3RyaW5nIHIgPSB0b2tlblR5cGVTZXQudG9TdHJpbmcoZyk7CisJCXJldHVybiByOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiB0b1N0cmluZyhudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9NYWNoaW5lUHJvYmUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL01hY2hpbmVQcm9iZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZGEyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9NYWNoaW5lUHJvYmUuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50U2V0OworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBNYWNoaW5lUHJvYmUgeworCURGQSBkZmE7CisKKwlwdWJsaWMgTWFjaGluZVByb2JlKERGQSBkZmEpIHsKKwkJdGhpcy5kZmEgPSBkZmE7CisJfQorCisJTGlzdDxERkFTdGF0ZT4gZ2V0QW55REZBUGF0aFRvVGFyZ2V0KERGQVN0YXRlIHRhcmdldFN0YXRlKSB7CisJCVNldDxERkFTdGF0ZT4gdmlzaXRlZCA9IG5ldyBIYXNoU2V0PERGQVN0YXRlPigpOworCQlyZXR1cm4gZ2V0QW55REZBUGF0aFRvVGFyZ2V0KGRmYS5zdGFydFN0YXRlLCB0YXJnZXRTdGF0ZSwgdmlzaXRlZCk7CisJfQorCisJcHVibGljIExpc3Q8REZBU3RhdGU+IGdldEFueURGQVBhdGhUb1RhcmdldChERkFTdGF0ZSBzdGFydFN0YXRlLAorCQkJREZBU3RhdGUgdGFyZ2V0U3RhdGUsIFNldDxERkFTdGF0ZT4gdmlzaXRlZCkgeworCQlMaXN0PERGQVN0YXRlPiBkZmFTdGF0ZXMgPSBuZXcgQXJyYXlMaXN0PERGQVN0YXRlPigpOworCQl2aXNpdGVkLmFkZChzdGFydFN0YXRlKTsKKwkJaWYgKHN0YXJ0U3RhdGUuZXF1YWxzKHRhcmdldFN0YXRlKSkgeworCQkJZGZhU3RhdGVzLmFkZCh0YXJnZXRTdGF0ZSk7CisJCQlyZXR1cm4gZGZhU3RhdGVzOworCQl9CisJCS8vIGZvciAoRWRnZSBlIDogc3RhcnRTdGF0ZS5lZGdlcykgeyAvLyB3YWxrIGVkZ2VzIGxvb2tpbmcgZm9yIHZhbGlkCisJCS8vIHBhdGgKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFydFN0YXRlLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIGUgPSBzdGFydFN0YXRlLmdldFRyYW5zaXRpb24oaSk7CisJCQlpZiAoIXZpc2l0ZWQuY29udGFpbnMoZS50YXJnZXQpKSB7CisJCQkJTGlzdDxERkFTdGF0ZT4gcGF0aCA9IGdldEFueURGQVBhdGhUb1RhcmdldCgKKwkJCQkJCShERkFTdGF0ZSkgZS50YXJnZXQsIHRhcmdldFN0YXRlLCB2aXNpdGVkKTsKKwkJCQlpZiAocGF0aCAhPSBudWxsKSB7IC8vIGZvdW5kIHBhdGgsIHdlJ3JlIGRvbmUKKwkJCQkJZGZhU3RhdGVzLmFkZChzdGFydFN0YXRlKTsKKwkJCQkJZGZhU3RhdGVzLmFkZEFsbChwYXRoKTsKKwkJCQkJcmV0dXJuIGRmYVN0YXRlczsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqIFJldHVybiBhIGxpc3Qgb2YgZWRnZSBsYWJlbHMgZnJvbSBzdGFydCBzdGF0ZSB0byB0YXJnZXRTdGF0ZS4gKi8KKwlwdWJsaWMgTGlzdDxJbnRTZXQ+IGdldEVkZ2VMYWJlbHMoREZBU3RhdGUgdGFyZ2V0U3RhdGUpIHsKKwkJTGlzdDxERkFTdGF0ZT4gZGZhU3RhdGVzID0gZ2V0QW55REZBUGF0aFRvVGFyZ2V0KHRhcmdldFN0YXRlKTsKKwkJTGlzdDxJbnRTZXQ+IGxhYmVscyA9IG5ldyBBcnJheUxpc3Q8SW50U2V0PigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRmYVN0YXRlcy5zaXplKCkgLSAxOyBpKyspIHsKKwkJCURGQVN0YXRlIGQgPSBkZmFTdGF0ZXMuZ2V0KGkpOworCQkJREZBU3RhdGUgbmV4dFN0YXRlID0gZGZhU3RhdGVzLmdldChpICsgMSk7CisJCQkvLyB3YWxrIGxvb2tpbmcgZm9yIGVkZ2Ugd2hvc2UgdGFyZ2V0IGlzIG5leHQgZGZhIHN0YXRlCisJCQlmb3IgKGludCBqID0gMDsgaiA8IGQuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBqKyspIHsKKwkJCQlUcmFuc2l0aW9uIGUgPSBkLmdldFRyYW5zaXRpb24oaik7CisJCQkJaWYgKGUudGFyZ2V0LnN0YXRlTnVtYmVyID09IG5leHRTdGF0ZS5zdGF0ZU51bWJlcikgeworCQkJCQlsYWJlbHMuYWRkKGUubGFiZWwuZ2V0U2V0KCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbGFiZWxzOworCX0KKworCS8qKgorCSAqIEdpdmVuIExpc3Q8SW50U2V0PiwgcmV0dXJuIGEgU3RyaW5nIHdpdGggYSB1c2VmdWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCisJICogYXNzb2NpYXRlZCBpbnB1dCBzdHJpbmcuIE9uZSBjb3VsZCBzaG93IHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIGxleGVycworCSAqIGFuZCBwYXJzZXJzLCBmb3IgZXhhbXBsZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElucHV0U2VxdWVuY2VEaXNwbGF5KEdyYW1tYXIgZywgTGlzdDxJbnRTZXQ+IGxhYmVscykgeworCQlMaXN0PFN0cmluZz4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoSW50U2V0IGxhYmVsIDogbGFiZWxzKQorCQkJdG9rZW5zLmFkZChsYWJlbC50b1N0cmluZyhnKSk7CisJCXJldHVybiB0b2tlbnMudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBHaXZlbiBhbiBhbHRlcm5hdGl2ZSBhc3NvY2lhdGVkIHdpdGggYSBERkEgc3RhdGUsIHJldHVybiB0aGUgbGlzdCBvZgorCSAqIHRva2VucyAoZnJvbSBncmFtbWFyKSBhc3NvY2lhdGVkIHdpdGggcGF0aCB0aHJvdWdoIE5GQSBmb2xsb3dpbmcgdGhlCisJICogbGFiZWxzIHNlcXVlbmNlLiBUaGUgbmZhU3RhdGVzIGdpdmVzIHRoZSBzZXQgb2YgTkZBIHN0YXRlcyBhc3NvY2lhdGVkCisJICogd2l0aCBhbHQgdGhhdCB0YWtlIHVzIGZyb20gc3RhcnQgdG8gc3RvcC4gT25lIG9mIHRoZSBORkEgc3RhdGVzIGluCisJICogbmZhU3RhdGVzW2ldIHdpbGwgaGF2ZSBhbiBlZGdlIGludGVyc2VjdGluZyB3aXRoIGxhYmVsc1tpXS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUb2tlbj4gZ2V0R3JhbW1hckxvY2F0aW9uc0ZvcklucHV0U2VxdWVuY2UoCisJCQlMaXN0PFNldDxORkFTdGF0ZT4+IG5mYVN0YXRlcywgTGlzdDxJbnRTZXQ+IGxhYmVscykgeworCQlMaXN0PFRva2VuPiB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PFRva2VuPigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5mYVN0YXRlcy5zaXplKCkgLSAxOyBpKyspIHsKKwkJCVNldDxORkFTdGF0ZT4gY3VyID0gbmZhU3RhdGVzLmdldChpKTsKKwkJCVNldDxORkFTdGF0ZT4gbmV4dCA9IG5mYVN0YXRlcy5nZXQoaSArIDEpOworCQkJSW50U2V0IGxhYmVsID0gbGFiZWxzLmdldChpKTsKKwkJCS8vIGZpbmQgTkZBIHN0YXRlIHdpdGggZWRnZSB3aG9zZSBsYWJlbCBtYXRjaGVzIGxhYmVsc1tpXQorCQkJbmZhQ29uZmlnTG9vcDogCisJCQkKKwkJCWZvciAoTkZBU3RhdGUgcCA6IGN1cikgeworCQkJCS8vIHdhbGsgcCdzIHRyYW5zaXRpb25zLCBsb29raW5nIGZvciBsYWJlbAorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcC5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGorKykgeworCQkJCQlUcmFuc2l0aW9uIHQgPSBwLnRyYW5zaXRpb24oaik7CisJCQkJCWlmICghdC5pc0Vwc2lsb24oKSAmJiAhdC5sYWJlbC5nZXRTZXQoKS5hbmQobGFiZWwpLmlzTmlsKCkKKwkJCQkJCQkmJiBuZXh0LmNvbnRhaW5zKHQudGFyZ2V0KSkgeworCQkJCQkJaWYgKHAuYXNzb2NpYXRlZEFTVE5vZGUgIT0gbnVsbCkgeworCQkJCQkJCVRva2VuIG9sZHRva2VuID0gcC5hc3NvY2lhdGVkQVNUTm9kZS50b2tlbjsKKwkJCQkJCQlDb21tb25Ub2tlbiB0b2tlbiA9IG5ldyBDb21tb25Ub2tlbihvbGR0b2tlbgorCQkJCQkJCQkJLmdldFR5cGUoKSwgb2xkdG9rZW4uZ2V0VGV4dCgpKTsKKwkJCQkJCQl0b2tlbi5zZXRMaW5lKG9sZHRva2VuLmdldExpbmUoKSk7CisJCQkJCQkJdG9rZW4uc2V0Q2hhclBvc2l0aW9uSW5MaW5lKG9sZHRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpKTsKKwkJCQkJCQl0b2tlbnMuYWRkKHRva2VuKTsKKwkJCQkJCQlicmVhayBuZmFDb25maWdMb29wOyAvLyBmb3VuZCBwYXRoLCBtb3ZlIHRvIG5leHQKKwkJCQkJCQkJCQkJCQkvLyBORkFTdGF0ZSBzZXQKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdG9rZW5zOworCX0KKworCS8vIC8qKiBVc2VkIHRvIGZpbmQgcGF0aHMgdGhyb3VnaCBzeW50YWN0aWNhbGx5IGFtYmlndW91cyBERkEuIElmIHdlJ3ZlCisJLy8gKiBzZWVuIHN0YXRlbWVudCBudW1iZXIgYmVmb3JlLCB3aGF0IGRpZCB3ZSBsZWFybj8KKwkvLyAqLworCS8vIHByb3RlY3RlZCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gc3RhdGVSZWFjaGFibGU7CisJLy8KKwkvLyBwdWJsaWMgTWFwPERGQVN0YXRlLCBTZXQ8REZBU3RhdGU+PiBnZXRSZWFjaFNldHMoQ29sbGVjdGlvbjxERkFTdGF0ZT4KKwkvLyB0YXJnZXRzKSB7CisJLy8gTWFwPERGQVN0YXRlLCBTZXQ8REZBU3RhdGU+PiByZWFjaGVzID0gbmV3IEhhc2hNYXA8REZBU3RhdGUsCisJLy8gU2V0PERGQVN0YXRlPj4oKTsKKwkvLyAvLyB0YXJnZXRzIGNhbiByZWFjaCB0aGVtc2VsdmVzCisJLy8gZm9yIChmaW5hbCBERkFTdGF0ZSBkIDogdGFyZ2V0cykgeworCS8vIHJlYWNoZXMucHV0KGQsbmV3IEhhc2hTZXQ8REZBU3RhdGU+KCkge3thZGQoZCk7fX0pOworCS8vIH0KKwkvLworCS8vIGJvb2xlYW4gY2hhbmdlZCA9IHRydWU7CisJLy8gd2hpbGUgKCBjaGFuZ2VkICkgeworCS8vIGNoYW5nZWQgPSBmYWxzZTsKKwkvLyBmb3IgKERGQVN0YXRlIGQgOiBkZmEuc3RhdGVzLnZhbHVlcygpKSB7CisJLy8gaWYgKCBkLmdldE51bWJlck9mRWRnZXMoKT09MCApIGNvbnRpbnVlOworCS8vIFNldDxERkFTdGF0ZT4gciA9IHJlYWNoZXMuZ2V0KGQpOworCS8vIGlmICggcj09bnVsbCApIHsKKwkvLyByID0gbmV3IEhhc2hTZXQ8REZBU3RhdGU+KCk7CisJLy8gcmVhY2hlcy5wdXQoZCwgcik7CisJLy8gfQorCS8vIGludCBiZWZvcmUgPSByLnNpemUoKTsKKwkvLyAvLyBhZGQgYWxsIHJlYWNoZXMgZnJvbSBhbGwgZWRnZSB0YXJnZXRzCisJLy8gZm9yIChFZGdlIGUgOiBkLmVkZ2VzKSB7CisJLy8gLy9pZiAoIHRhcmdldHMuY29udGFpbnMoZS50YXJnZXQpICkgci5hZGQoZS50YXJnZXQpOworCS8vIHIuYWRkQWxsKCByZWFjaGVzLmdldChlLnRhcmdldCkgKTsKKwkvLyB9CisJLy8gaW50IGFmdGVyID0gci5zaXplKCk7CisJLy8gaWYgKCBhZnRlcj5iZWZvcmUpIGNoYW5nZWQgPSB0cnVlOworCS8vIH0KKwkvLyB9CisJLy8gcmV0dXJuIHJlYWNoZXM7CisJLy8gfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ORkEuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTBiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ORkEuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5ORkFGYWN0b3J5OworCisvKiogQW4gTkZBIChjb2xsZWN0aW9uIG9mIE5GQVN0YXRlcykgY29uc3RydWN0ZWQgZnJvbSBhIGdyYW1tYXIuICBUaGlzCisgKiAgTkZBIGlzIG9uZSBiaWcgbWFjaGluZSBmb3IgZW50aXJlIGdyYW1tYXIuICBEZWNpc2lvbiBwb2ludHMgYXJlIHJlY29yZGVkCisgKiAgYnkgdGhlIEdyYW1tYXIgb2JqZWN0IHNvIHdlIGNhbiwgZm9yIGV4YW1wbGUsIGNvbnZlcnQgdG8gREZBIG9yIHNpbXVsYXRlCisgKiAgdGhlIE5GQSAoaW50ZXJwcmV0IGEgZGVjaXNpb24pLgorICovCitwdWJsaWMgY2xhc3MgTkZBIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FMVF9OVU1CRVIgPSAtMTsKKworICAgIC8qKiBUaGlzIE5GQSByZXByZXNlbnRzIHdoaWNoIGdyYW1tYXI/ICovCisgICAgcHVibGljIEdyYW1tYXIgZ3JhbW1hcjsKKwkKKwkvKiogV2hpY2ggZmFjdG9yeSBjcmVhdGVkIHRoaXMgTkZBPyAqLworICAgIHByb3RlY3RlZCBORkFGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCisJcHVibGljIGJvb2xlYW4gY29tcGxldGU7CisKKwlwdWJsaWMgTkZBKEdyYW1tYXIgZykgeworICAgICAgICB0aGlzLmdyYW1tYXIgPSBnOworICAgIH0KKworCXB1YmxpYyBpbnQgZ2V0TmV3TkZBU3RhdGVOdW1iZXIoKSB7CisJCXJldHVybiBncmFtbWFyLmNvbXBvc2l0ZS5nZXROZXdORkFTdGF0ZU51bWJlcigpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFN0YXRlKE5GQVN0YXRlIHN0YXRlKSB7CisJCWdyYW1tYXIuY29tcG9zaXRlLmFkZFN0YXRlKHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTkZBU3RhdGUgZ2V0U3RhdGUoaW50IHMpIHsKKwkJcmV0dXJuIGdyYW1tYXIuY29tcG9zaXRlLmdldFN0YXRlKHMpOworICAgIH0KKworICAgIHB1YmxpYyBORkFGYWN0b3J5IGdldEZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnkoTkZBRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ORkFDb25maWd1cmF0aW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9ORkFDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmM2QzOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQUNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5hbmFseXNpczsKKworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworCisvKiogQW4gTkZBIHN0YXRlLCBwcmVkaWN0ZWQgYWx0LCBhbmQgc3ludGFjdGljL3NlbWFudGljIGNvbnRleHQuCisgKiAgVGhlIHN5bnRhY3RpYyBjb250ZXh0IGlzIGEgcG9pbnRlciBpbnRvIHRoZSBydWxlIGludm9jYXRpb24KKyAqICBjaGFpbiB1c2VkIHRvIGFycml2ZSBhdCB0aGUgc3RhdGUuICBUaGUgc2VtYW50aWMgY29udGV4dCBpcworICogIHRoZSB1bm9yZGVyZWQgc2V0IHNlbWFudGljIHByZWRpY2F0ZXMgZW5jb3VudGVyZWQgYmVmb3JlIHJlYWNoaW5nCisgKiAgYW4gTkZBIHN0YXRlLgorICovCitwdWJsaWMgY2xhc3MgTkZBQ29uZmlndXJhdGlvbiB7CisgICAgLyoqIFRoZSBORkEgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiAqLworICAgIHB1YmxpYyBpbnQgc3RhdGU7CisKKyAgICAvKiogV2hhdCBhbHQgaXMgcHJlZGljdGVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiAqLworICAgIHB1YmxpYyBpbnQgYWx0OworCisgICAgLyoqIFdoYXQgaXMgdGhlIHN0YWNrIG9mIHJ1bGUgaW52b2NhdGlvbnMgdGhhdCBnb3QgdXMgdG8gc3RhdGU/ICovCisgICAgcHVibGljIE5GQUNvbnRleHQgY29udGV4dDsKKworICAgIC8qKiBUaGUgc2V0IG9mIHNlbWFudGljIHByZWRpY2F0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTkZBCisgICAgICogIGNvbmZpZ3VyYXRpb24uICBUaGUgcHJlZGljYXRlcyB3ZXJlIGZvdW5kIG9uIHRoZSB3YXkgdG8KKyAgICAgKiAgdGhlIGFzc29jaWF0ZWQgTkZBIHN0YXRlIGluIHRoaXMgc3ludGFjdGljIGNvbnRleHQuCisgICAgICogIFNldDxBU1Q+OiB0cmFjayBub2RlcyBpbiBncmFtbWFyIGNvbnRhaW5pbmcgdGhlIHByZWRpY2F0ZQorICAgICAqICBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIHN1Y2ggKG5pY2UgdG8ga25vdyB3aGVyZSB0aGUgcHJlZGljYXRlCisgICAgICogIGNhbWUgZnJvbSBpbiBjYXNlIG9mIGR1cGxpY2F0ZXMgZXRjLi4uKS4gIEJ5IHVzaW5nIGEgc2V0LAorICAgICAqICB0aGUgZXF1YWxzKCkgbWV0aG9kIHdpbGwgY29ycmVjdGx5IHNob3cge3ByZWQxLHByZWQyfSBhcyBlcXVhbHMoKQorICAgICAqICB0byB7cHJlZDIscHJlZDF9LgorICAgICAqLworICAgIHB1YmxpYyBTZW1hbnRpY0NvbnRleHQgc2VtYW50aWNDb250ZXh0ID0gU2VtYW50aWNDb250ZXh0LkVNUFRZX1NFTUFOVElDX0NPTlRFWFQ7CisKKyAgICAvKiogSW5kaWNhdGUgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gcmVzb2x2ZWQgYW5kIG5vIGZ1cnRoZXIKKyAgICAgKiAgREZBIHByb2Nlc3Npbmcgc2hvdWxkIG9jY3VyIHdpdGggaXQuICBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkCisgICAgICogIGFzIGFuICJpZ25vcmUiIGJpdCBzbyB0aGF0IHVwb24gYSBzZXQgb2Ygbm9uZGV0ZXJtaW5pc3RpYyBjb25maWd1cmF0aW9ucworICAgICAqICBzdWNoIGFzIChzfDIpIGFuZCAoc3wzKSwgSSBjYW4gc2V0IChzfDMpIHRvIHJlc29sdmVkPXRydWUgKGFuZCBhbnkKKyAgICAgKiAgb3RoZXIgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggYWx0IDMpLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlc29sdmVkOworCisgICAgLyoqIFRoaXMgYml0IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBzZW1hbnRpYyBwcmVkaWNhdGUgd2lsbCBiZQorICAgICAqICB1c2VkIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LiAgTWV0aG9kCisgICAgICogIERGQS5maW5kTmV3REZBU3RhdGVzQW5kQWRkREZBVHJhbnNpdGlvbnMgd2lsbCBhZGQgZWRnZXMgZm9yCisgICAgICogIHRoZSBwcmVkaWNhdGVzIGFmdGVyIGl0IHBlcmZvcm1zIHRoZSByZWFjaCBvcGVyYXRpb24uICBUaGUKKyAgICAgKiAgbm9uZGV0ZXJtaW5pc20gcmVzb2x2ZXIgc2V0cyB0aGlzIHdoZW4gaXQgZmluZHMgYSBzZXQgb2YKKyAgICAgKiAgbm9uZGV0ZXJtaW5pc3RpYyBjb25maWd1cmF0aW9ucyAoYXMgaXQgZG9lcyBmb3IgInJlc29sdmVkIiBmaWVsZCkKKyAgICAgKiAgdGhhdCBoYXZlIGVub3VnaCBwcmVkaWNhdGVzIHRvIHJlc29sdmUgdGhlIGNvbmZsaXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzb2x2ZVdpdGhQcmVkaWNhdGU7CisKKyAgICAvKiogTG90cyBvZiBORkEgc3RhdGVzIGhhdmUgb25seSBlcHNpbG9uIGVkZ2VzICgxIG9yIDIpLiAgV2UgY2FuCisgICAgICogIHNhZmVseSBjb25zaWRlciBvbmx5IG4+MCBkdXJpbmcgY2xvc3VyZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG51bWJlckVwc2lsb25UcmFuc2l0aW9uc0VtYW5hdGluZ0Zyb21TdGF0ZTsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhhdCB0aGUgTkZBIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KKyAgICAgKiAgaGFzIGV4YWN0bHkgb25lIHRyYW5zaXRpb24gYW5kIGl0J3MgYW4gYXRvbSAobm90IGVwc2lsb24gZXRjLi4uKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaW5nbGVBdG9tVHJhbnNpdGlvbkVtYW5hdGluZzsKKworCS8vcHJvdGVjdGVkIGJvb2xlYW4gYWRkZWREdXJpbmdDbG9zdXJlID0gdHJ1ZTsKKworCXB1YmxpYyBORkFDb25maWd1cmF0aW9uKGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQUNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hbnRpY0NvbnRleHQgc2VtYW50aWNDb250ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICB0aGlzLmFsdCA9IGFsdDsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5zZW1hbnRpY0NvbnRleHQgPSBzZW1hbnRpY0NvbnRleHQ7CisgICAgfQorCisgICAgLyoqIEFuIE5GQSBjb25maWd1cmF0aW9uIGlzIGVxdWFsIHRvIGFub3RoZXIgaWYgYm90aCBoYXZlCisgICAgICogIHRoZSBzYW1lIHN0YXRlLCB0aGUgcHJlZGljdCB0aGUgc2FtZSBhbHRlcm5hdGl2ZSwgYW5kCisgICAgICogIHN5bnRhY3RpYy9zZW1hbnRpYyBjb250ZXh0cyBhcmUgdGhlIHNhbWUuICBJIGRvbid0IHRoaW5rCisgICAgICogIHRoZSBzdGF0ZXxhbHR8Y3R4IGNvdWxkIGJlIHRoZSBzYW1lIGFuZCBoYXZlIHR3byBkaWZmZXJlbnQKKyAgICAgKiAgc2VtYW50aWMgY29udGV4dHMsIGJ1dCBtaWdodCBhcyB3ZWxsIGRlZmluZSBlcXVhbHMgdG8gYmUKKyAgICAgKiAgZXZlcnl0aGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYgKCBvPT1udWxsICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisgICAgICAgIE5GQUNvbmZpZ3VyYXRpb24gb3RoZXIgPSAoTkZBQ29uZmlndXJhdGlvbilvOworICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZT09b3RoZXIuc3RhdGUgJiYKKyAgICAgICAgICAgICAgIHRoaXMuYWx0PT1vdGhlci5hbHQgJiYKKyAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5lcXVhbHMob3RoZXIuY29udGV4dCkmJgorICAgICAgICAgICAgICAgdGhpcy5zZW1hbnRpY0NvbnRleHQuZXF1YWxzKG90aGVyLnNlbWFudGljQ29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGggPSBzdGF0ZSArIGFsdCArIGNvbnRleHQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHRvU3RyaW5nKHRydWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBzaG93QWx0KSB7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWJ1Zi5hcHBlbmQoc3RhdGUpOworCQlpZiAoIHNob3dBbHQgKSB7CisJCQlidWYuYXBwZW5kKCJ8Iik7CisJCQlidWYuYXBwZW5kKGFsdCk7CisJCX0KKwkJaWYgKCBjb250ZXh0LnBhcmVudCE9bnVsbCApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzZW1hbnRpY0NvbnRleHQhPW51bGwgJiYKKyAgICAgICAgICAgICBzZW1hbnRpY0NvbnRleHQhPVNlbWFudGljQ29udGV4dC5FTVBUWV9TRU1BTlRJQ19DT05URVhUICkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgifCIpOworCQkJU3RyaW5nIGVzY1F1b3RlID0gVXRpbHMucmVwbGFjZShzZW1hbnRpY0NvbnRleHQudG9TdHJpbmcoKSwgIlwiIiwgIlxcXCIiKTsKKwkJCWJ1Zi5hcHBlbmQoZXNjUXVvdGUpOworICAgICAgICB9CisgICAgICAgIGlmICggcmVzb2x2ZWQgKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ8cmVzb2x2ZWQiKTsKKyAgICAgICAgfQorCQlpZiAoIHJlc29sdmVXaXRoUHJlZGljYXRlICkgeworCQkJYnVmLmFwcGVuZCgifHJlc29sdmVXaXRoUHJlZGljYXRlIik7CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQUNvbnRleHQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZlYzQyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTkZBQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCisvKiogQSB0cmVlIG5vZGUgZm9yIHRyYWNraW5nIHRoZSBjYWxsIGNoYWlucyBmb3IgTkZBcyB0aGF0IGludm9rZQorICogIG90aGVyIE5GQXMuICBUaGVzZSB0cmVlcyBvbmx5IGhhdmUgdG8gcG9pbnQgdXB3YXJkcyB0byB0aGVpciBwYXJlbnRzCisgKiAgc28gd2UgY2FuIHdhbGsgYmFjayB1cCB0aGUgdHJlZSAoaS5lLiwgcG9wIHN0dWZmIG9mZiB0aGUgc3RhY2spLiAgV2UKKyAqICBuZXZlciB3YWxrIGZyb20gc3RhY2sgZG93biBkb3duIHRocm91Z2ggdGhlIGNoaWxkcmVuLgorICoKKyAqICBFYWNoIGFsdCBwcmVkaWN0ZWQgaW4gYSBkZWNpc2lvbiBoYXMgaXRzIG93biBjb250ZXh0IHRyZWUsCisgKiAgcmVwcmVzZW50aW5nIGFsbCBwb3NzaWJsZSByZXR1cm4gbm9kZXMuICBUaGUgaW5pdGlhbCBzdGFjayBoYXMKKyAqICBFT0YgKCIkIikgaW4gaXQuICBTbywgZm9yIG0gYWx0ZXJuYXRpdmUgcHJvZHVjdGlvbnMsIHRoZSBsb29rYWhlYWQKKyAqICBERkEgd2lsbCBoYXZlIG0gTkZBQ29udGV4dCB0cmVlcy4KKyAqCisgKiAgVG8gInB1c2giIGEgbmV3IGNvbnRleHQsIGp1c3QgZG8gIm5ldyBORkFDb250ZXh0KGNvbnRleHQtcGFyZW50LCBzdGF0ZSkiCisgKiAgd2hpY2ggd2lsbCBhZGQgaXRzZWxmIHRvIHRoZSBwYXJlbnQuICBUaGUgcm9vdCBpcyBORkFDb250ZXh0KG51bGwsIG51bGwpLgorICoKKyAqICBUaGUgY29tcGxldGUgY29udGV4dCBmb3IgYW4gTkZBIGNvbmZpZ3VyYXRpb24gaXMgdGhlIHNldCBvZiBpbnZva2luZyBzdGF0ZXMKKyAqICBvbiB0aGUgcGF0aCBmcm9tIHRoaXMgbm9kZSB0aHJ1IHRoZSBwYXJlbnQgcG9pbnRlcnMgdG8gdGhlIHJvb3QuCisgKi8KK3B1YmxpYyBjbGFzcyBORkFDb250ZXh0IHsKKwkvKiogVGhpcyBpcyBzaW1pbGFyIHRvIEJlcm11ZGV6J3MgbSBjb25zdGFudCBpbiBoaXMgTEFSKG0pIHdoZXJlCisJICogIHlvdSBib3VuZCB0aGUgc3RhY2sgc28geW91ciBzdGF0ZXMgZG9uJ3QgZXhwbG9kZS4gIFRoZSBtYWluIGRpZmZlcmVuY2UKKwkgKiAgaXMgdGhhdCBJIGJvdW5kIG9ubHkgcmVjdXJzaW9uIG9uIHRoZSBzdGFjaywgbm90IHRoZSBzaW1wbGUgc3RhY2sgc2l6ZS4KKwkgKiAgVGhpcyBsb29zZXIgY29uc3RyYWludCB3aWxsIGxldCB0aGUgY29udmVyc2lvbiByb2FtIGZ1cnRoZXIgdG8gZmluZAorCSAqICBsb29rYWhlYWQgdG8gcmVzb2x2ZSBhIGRlY2lzaW9uLgorCSAqCisJICogIEJlcm11ZGV6J3MgbSBvcGVyYXRlcyBkaWZmZXJlbnRseSBhcyBpdCBpcyBoaXMgTFIgc3RhY2sgZGVwdGgKKwkgKiAgSSdtIHByZXR0eSBzdXJlIGl0IHRoZXJlZm9yZSBpbmNsdWRlcyBhbGwgc3RhY2sgc3ltYm9scy4gIEhlcmUgSQorCSAqICByZXN0cmljdCB0aGUgc2l6ZSBvZiBhbiBORkEgY29uZmlndXJhdGlvbiB0byBiZSBmaW5pdGUgYmVjYXVzZSBhCisJICogIHN0YWNrIGNvbXBvbmVudCBtYXkgbWVudGlvbiB0aGUgc2FtZSBORkEgaW52b2NhdGlvbiBzdGF0ZSBhdAorCSAqICBtb3N0IG0gdGltZXMuICBIZW5jZSwgdGhlIG51bWJlciBvZiBERkEgc3RhdGVzIHdpbGwgbm90IGdyb3cgZm9yZXZlci4KKwkgKiAgV2l0aCByZWN1cnNpdmUgcnVsZXMgbGlrZQorCSAqCisJICogICAgZSA6ICcoJyBlICcpJyB8IElOVCA7CisJICoKKwkgKiAgeW91IGNvdWxkIGNoYXNlIHlvdXIgdGFpbCBmb3JldmVyIGlmIHNvbWVib2R5IHNhaWQgInMgOiBlICcuJyB8IGUgJzsnIDsiCisJICogIFRoaXMgY29uc3RhbnQgcHJldmVudHMgbmV3IHN0YXRlcyBmcm9tIGJlaW5nIGNyZWF0ZWQgYWZ0ZXIgYSBzdGFjayBnZXRzCisJICogICJ0b28gYmlnIi4gIEFjdHVhbGx5ICgxMi8xNC8yMDA3KSBJIHJlYWxpemUgdGhhdCB0aGlzIGV4YW1wbGUgaXMKKwkgKiAgdHJhcHBlZCBieSB0aGUgbm9uLUxMKCopIGRldGVjdG9yIGZvciByZWN1cnNpb24gaW4gPiAxIGFsdC4gIEhlcmUgaXMKKwkgKiAgYW4gZXhhbXBsZSB0aGF0IHRyaXBzIHN0YWNrIG92ZXJmbG93OgorCSAqCisJICoJICBzIDogYSBZIHwgQSBBIEEgQSBBIFggOyAvLyBmb3JjZSByZWN1cnNpb24gcGFzdCBtPTQKKwkgKgkgIGEgOiBBIGEgfCBROworCSAqCisJICogIElmIHRoYXQgd2VyZToKKwkgKgorCSAqCSAgcyA6IGEgWSB8IEErIFggOworCSAqCisJICogIGl0IGNvdWxkIGxvb3AgZm9yZXZlci4KKwkgKgorCSAqICBJbWFnaW5lIGRvaW5nIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIG9uIHRoZSBlIERGQS4uLmFzIHlvdSBjaGFzZSBhbiBpbnB1dAorCSAqICBzZXF1ZW5jZSB5b3UgY2FuIHJlY3Vyc2UgdG8gc2FtZSBydWxlIHN1Y2ggYXMgZSBhYm92ZS4gIFlvdSdkIGhhdmUgYQorCSAqICBjaGFpbiBvZiAoKCgoLiAgV2hlbiB5b3UgZ2V0IGRvIHNvbWUgcG9pbnQsIHlvdSBoYXZlIHRvIGdpdmUgdXAuICBUaGUKKwkgKiAgc3RhdGVzIGluIHRoZSBjaGFpbiB3aWxsIGhhdmUgbG9uZ2VyIGFuZCBsb25nZXIgTkZBIGNvbmZpZyBzdGFja3MuCisJICogIE11c3QgbGltaXQgc2l6ZS4KKwkgKgorCSAqICBtYXg9MCBpbXBsaWVzIHlvdSBjYW5ub3QgZXZlciBqdW1wIHRvIGFub3RoZXIgcnVsZSBkdXJpbmcgY2xvc3VyZS4KKwkgKiAgbWF4PTEgaW1wbGllcyB5b3UgY2FuIG1ha2UgYXMgbWFueSBjYWxscyBhcyB5b3Ugd2FudC0teW91IGp1c3QKKwkgKiAgICAgICAgY2FuJ3QgZXZlciB2aXNpdCBhIHN0YXRlIHRoYXQgaXMgb24geW91ciBydWxlIGludm9jYXRpb24gc3RhY2suCisJICogCQkgIEkuZS4sIHlvdSBjYW5ub3QgZXZlciByZWN1cnNlLgorCSAqICBtYXg9MiBpbXBsaWVzIHlvdSBhcmUgYWJsZSB0byByZWN1cnNlIG9uY2UgKGkuZS4sIGNhbGwgYSBydWxlIHR3aWNlCisJICogIAkgIGZyb20gdGhlIHNhbWUgcGxhY2UpLgorCSAqCisJICogIFRoaXMgdHJhY2tzIHJlY3Vyc2lvbiB0byBhIHJ1bGUgc3BlY2lmaWMgdG8gYW4gaW52b2NhdGlvbiBzaXRlIQorCSAqICBJdCBkb2VzIG5vdCBkZXRlY3QgbXVsdGlwbGUgY2FsbHMgdG8gYSBydWxlIGZyb20gZGlmZmVyZW50IHJ1bGUKKwkgKiAgaW52b2NhdGlvbiBzdGF0ZXMuICBXZSBhcmUgZ3VhcmFudGVlZCB0byB0ZXJtaW5hdGUgYmVjYXVzZSB0aGUKKwkgKiAgc3RhY2sgY2FuIG9ubHkgZ3JvdyBhcyBiaWcgYXMgdGhlIG51bWJlciBvZiBORkEgc3RhdGVzICogbWF4LgorCSAqCisJICogIEkgbm90aWNlZCB0aGF0IHRoZSBKYXZhIGdyYW1tYXIgZGlkbid0IHdvcmsgd2l0aCBtYXg9MSwgYnV0IGRpZCB3aXRoCisJICogIG1heD00LiAgTGV0J3Mgc2V0IHRvIDQuIFJlY3Vyc2lvbiBpcyBzb21ldGltZXMgbmVlZGVkIHRvIHJlc29sdmUgc29tZQorCSAqICBmaXhlZCBsb29rYWhlYWQgZGVjaXNpb25zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IE1BWF9TQU1FX1JVTEVfSU5WT0NBVElPTlNfUEVSX05GQV9DT05GSUdfU1RBQ0sgPSA0OworCisgICAgcHVibGljIE5GQUNvbnRleHQgcGFyZW50OworCisgICAgLyoqIFRoZSBORkEgc3RhdGUgdGhhdCBpbnZva2VkIGFub3RoZXIgcnVsZSdzIHN0YXJ0IHN0YXRlIGlzIHJlY29yZGVkCisgICAgICogIG9uIHRoZSBydWxlIGludm9jYXRpb24gY29udGV4dCBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgTkZBU3RhdGUgaW52b2tpbmdTdGF0ZTsKKworICAgIC8qKiBDb21wdXRpbmcgdGhlIGhhc2hDb2RlIGlzIHZlcnkgZXhwZW5zaXZlIGFuZCBjbG9zdXJlQnVzeSgpCisgICAgICogIHVzZXMgaXQgdG8gdHJhY2sgd2hlbiBpdCdzIHNlZW4gYSBzdGF0ZXxjdHggYmVmb3JlIHRvIGF2b2lkCisgICAgICogIGluZmluaXRlIGxvb3BzLiAgQXMgd2UgYWRkIG5ldyBjb250ZXh0cywgcmVjb3JkIHRoZSBoYXNoIGNvZGUKKyAgICAgKiAgYXMgdGhpcy5pbnZva2luZ1N0YXRlICsgcGFyZW50LmNhY2hlZEhhc2hDb2RlLiAgQXZvaWRzIHdhbGtpbmcKKyAgICAgKiAgdXAgdGhlIHRyZWUgZm9yIGV2ZXJ5IGhhc2hDb2RlKCkuICBOb3RlIHRoYXQgdGhpcyBjYWNoaW5nIHdvcmtzCisgICAgICogIGJlY2F1c2UgYSBjb250ZXh0IGlzIGEgbW9ub3RvbmljYWxseSBncm93aW5nIHRyZWUgb2YgY29udGV4dCBub2RlcworICAgICAqICBhbmQgbm90aGluZyBvbiB0aGUgc3RhY2sgaXMgZXZlciBtb2RpZmllZC4uLmN0eCBqdXN0IGdyb3dzCisgICAgICogIG9yIHNocmlua3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjYWNoZWRIYXNoQ29kZTsKKworICAgIHB1YmxpYyBORkFDb250ZXh0KE5GQUNvbnRleHQgcGFyZW50LCBORkFTdGF0ZSBpbnZva2luZ1N0YXRlKSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICB0aGlzLmludm9raW5nU3RhdGUgPSBpbnZva2luZ1N0YXRlOworICAgICAgICBpZiAoIGludm9raW5nU3RhdGUhPW51bGwgKSB7CisgICAgICAgICAgICB0aGlzLmNhY2hlZEhhc2hDb2RlID0gaW52b2tpbmdTdGF0ZS5zdGF0ZU51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBhcmVudCE9bnVsbCApIHsKKyAgICAgICAgICAgIHRoaXMuY2FjaGVkSGFzaENvZGUgKz0gcGFyZW50LmNhY2hlZEhhc2hDb2RlOworICAgICAgICB9CisgICAgfQorCisJLyoqIFR3byBjb250ZXh0cyBhcmUgZXF1YWxzKCkgaWYgYm90aCBoYXZlCisJICogIHNhbWUgY2FsbCBzdGFjazsgd2FsayB1cHdhcmRzIHRvIHRoZSByb290LgorCSAqICBSZWNhbGwgdGhhdCB0aGUgcm9vdCBzZW50aW5lbCBub2RlIGhhcyBubyBpbnZva2luZ1N0YXRlcyBhbmQgbm8gcGFyZW50LgorCSAqICBOb3RlIHRoYXQgeW91IG1heSBiZSBjb21wYXJpbmcgY29udGV4dHMgaW4gZGlmZmVyZW50IGFsdCB0cmVlcy4KKwkgKgorCSAqICBUaGUgaGFzaENvZGUgaXMgbm93IGNoZWFwIGFzIGl0J3MgY29tcHV0ZWQgb25jZSB1cG9uIGVhY2ggY29udGV4dAorCSAqICBwdXNoIG9uIHRoZSBzdGFjay4gIFVzZSBpdCB0byBtYWtlIGVxdWFscygpIG1vcmUgZWZmaWNpZW50LgorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlORkFDb250ZXh0IG90aGVyID0gKChORkFDb250ZXh0KW8pOworCQlpZiAoIHRoaXMuY2FjaGVkSGFzaENvZGUgIT0gb3RoZXIuY2FjaGVkSGFzaENvZGUgKSB7CisJCQlyZXR1cm4gZmFsc2U7IC8vIGNhbid0IGJlIHNhbWUgaWYgaGFzaCBpcyBkaWZmZXJlbnQKKwkJfQorCQlpZiAoIHRoaXM9PW90aGVyICkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb21wYXJpbmcgIit0aGlzKyIgd2l0aCAiK290aGVyKTsKKwkJTkZBQ29udGV4dCBzcCA9IHRoaXM7CisJCXdoaWxlICggc3AucGFyZW50IT1udWxsICYmIG90aGVyLnBhcmVudCE9bnVsbCApIHsKKwkJCWlmICggc3AuaW52b2tpbmdTdGF0ZSAhPSBvdGhlci5pbnZva2luZ1N0YXRlICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXNwID0gc3AucGFyZW50OworCQkJb3RoZXIgPSBvdGhlci5wYXJlbnQ7CisJCX0KKwkJaWYgKCAhKHNwLnBhcmVudD09bnVsbCAmJiBvdGhlci5wYXJlbnQ9PW51bGwpICkgeworCQkJcmV0dXJuIGZhbHNlOyAvLyBib3RoIHBvaW50ZXJzIG11c3QgYmUgYXQgdGhlaXIgcm9vdHMgYWZ0ZXIgd2FsaworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKiBUd28gY29udGV4dHMgY29uZmxpY3QoKSBpZiB0aGV5IGFyZSBlcXVhbHMoKSBvciBvbmUgaXMgYSBzdGFjayBzdWZmaXgKKwkgKiAgb2YgdGhlIG90aGVyLiAgRm9yIGV4YW1wbGUsIGNvbnRleHRzIFsyMSAxMiAkXSBhbmQgWzIxIDkgJF0gZG8gbm90CisJICogIGNvbmZsaWN0LCBidXQgWzIxICRdIGFuZCBbMjEgMTIgJF0gZG8gY29uZmxpY3QuICBOb3RlIHRoYXQgSSBzaG91bGQKKwkgKiAgcHJvYmFibHkgbm90IHNob3cgdGhlICQgaW4gdGhpcyBjYXNlLiAgVGhlcmUgaXMgYSBkdW1teSBub2RlIGZvciBlYWNoCisJICogIHN0YWNrIHRoYXQganVzdCBtZWFucyBlbXB0eTsgJCBpcyBhIG1hcmtlciB0aGF0J3MgYWxsLgorCSAqCisJICogIFRoaXMgaXMgdXNlZCBpbiByZWxhdGlvbiB0byBjaGVja2luZyBjb25mbGljdHMgYXNzb2NpYXRlZCB3aXRoIGEKKwkgKiAgc2luZ2xlIE5GQSBzdGF0ZSdzIGNvbmZpZ3VyYXRpb25zIHdpdGhpbiBhIHNpbmdsZSBERkEgc3RhdGUuCisJICogIElmIHRoZXJlIGFyZSBjb25maWd1cmF0aW9ucyBzIGFuZCB0IHdpdGhpbiBhIERGQSBzdGF0ZSBzdWNoIHRoYXQKKwkgKiAgcy5zdGF0ZT10LnN0YXRlICYmIHMuYWx0ICE9IHQuYWx0ICYmIHMuY3R4IGNvbmZsaWN0cyB0LmN0eCB0aGVuCisJICogIHRoZSBERkEgc3RhdGUgcHJlZGljdHMgbW9yZSB0aGFuIGEgc2luZ2xlIGFsdC0taXQncyBub25kZXRlcm1pbmlzdGljLgorCSAqICBUd28gY29udGV4dHMgY29uZmxpY3QgaWYgdGhleSBhcmUgdGhlIHNhbWUgb3IgaWYgb25lIGlzIGEgc3VmZml4CisJICogIG9mIHRoZSBvdGhlci4KKwkgKgorCSAqICBXaGVuIGNvbXBhcmluZyBjb250ZXh0cywgaWYgb25lIGNvbnRleHQgaGFzIGEgc3RhY2sgYW5kIHRoZSBvdGhlcgorCSAqICBkb2VzIG5vdCB0aGVuIHRoZXkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgY29udGV4dC4gIFRoZSBvbmx5CisJICogIHdheSBmb3IgYW4gTkZBIHN0YXRlIHAgdG8gaGF2ZSBhbiBlbXB0eSBjb250ZXh0IGFuZCBhIG5vbmVtcHR5IGNvbnRleHQKKwkgKiAgaXMgdGhlIGNhc2Ugd2hlbiBjbG9zdXJlIGZhbGxzIG9mZiBlbmQgb2YgcnVsZSB3aXRob3V0IGEgY2FsbCBzdGFjaworCSAqICBhbmQgcmUtZW50ZXJzIHRoZSBydWxlIHdpdGggYSBjb250ZXh0LiAgVGhpcyByZXNvbHZlcyB0aGUgaXNzdWUgSQorCSAqICBkaXNjdXNzZWQgd2l0aCBTcmlyYW0gU3Jpbml2YXNhbiBGZWIgMjgsIDIwMDUgYWJvdXQgbm90IHRlcm1pbmF0aW5nCisJICogIGZhc3QgZW5vdWdoIHVwb24gbm9uZGV0ZXJtaW5pc20uCisJICovCisJcHVibGljIGJvb2xlYW4gY29uZmxpY3RzV2l0aChORkFDb250ZXh0IG90aGVyKSB7CisJCXJldHVybiB0aGlzLnN1ZmZpeChvdGhlcik7IC8vIHx8IHRoaXMuZXF1YWxzKG90aGVyKTsKKwl9CisKKwkvKiogWyRdIHN1ZmZpeCBhbnkgY29udGV4dAorCSAqICBbMjEgJF0gc3VmZml4IFsyMSAxMiAkXQorCSAqICBbMjEgMTIgJF0gc3VmZml4IFsyMSAkXQorCSAqICBbMjEgMTggJF0gc3VmZml4IFsyMSAxOCAxMiA5ICRdCisJICogIFsyMSAxOCAxMiA5ICRdIHN1ZmZpeCBbMjEgMTggJF0KKwkgKiAgWzIxIDEyICRdIG5vdCBzdWZmaXggWzIxIDkgJF0KKwkgKgorCSAqICBFeGFtcGxlICJbMjEgJF0gc3VmZml4IFsyMSAxMiAkXSIgbWVhbnM6IHJ1bGUgciBpbnZva2VkIGN1cnJlbnQgcnVsZQorCSAqICBmcm9tIHN0YXRlIDIxLiAgUnVsZSBzIGludm9rZWQgcnVsZSByIGZyb20gc3RhdGUgMTIgd2hpY2ggdGhlbiBpbnZva2VkCisJICogIGN1cnJlbnQgcnVsZSBhbHNvIHZpYSBzdGF0ZSAyMS4gIFdoaWxlIHRoZSBjb250ZXh0IHByaW9yIHRvIHN0YXRlIDIxCisJICogIGlzIGRpZmZlcmVudCwgdGhlIGZhY3QgdGhhdCBib3RoIGNvbnRleHRzIGVtYW5hdGUgZnJvbSBzdGF0ZSAyMSBpbXBsaWVzCisJICogIHRoYXQgdGhleSBhcmUgbm93IGdvaW5nIHRvIHRyYWNrIHBlcmZlY3RseSB0b2dldGhlci4gIE9uY2UgdGhleQorCSAqICBjb252ZXJnZWQgb24gc3RhdGUgMjEsIHRoZXJlIGlzIG5vIHdheSB0aGV5IGNhbiBzZXBhcmF0ZS4gIEluIG90aGVyCisJICogIHdvcmRzLCB0aGUgcHJpb3Igc3RhY2sgc3RhdGUgaXMgbm90IGNvbnN1bHRlZCB3aGVuIGNvbXB1dGluZyB3aGVyZSB0bworCSAqICBnbyBpbiB0aGUgY2xvc3VyZSBvcGVyYXRpb24uICA/JCBhbmQgPz8kIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIHN0YWNrLgorCSAqICBJZiA/IGlzIHBvcHBlZCBvZmYgdGhlbiAkIGFuZCA/JCByZW1haW47IHRoZXkgYXJlIG5vdyBhbiBlbXB0eSBhbmQKKwkgKiAgbm9uZW1wdHkgY29udGV4dCBjb21wYXJpc29uLiAgU28sIGlmIG9uZSBzdGFjayBpcyBhIHN1ZmZpeCBvZgorCSAqICBhbm90aGVyLCB0aGVuIGl0IHdpbGwgc3RpbGwgZGVnZW5lcmF0ZSB0byB0aGUgc2ltcGxlIGVtcHR5IHN0YWNrCisJICogIGNvbXBhcmlzb24gY2FzZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzdWZmaXgoTkZBQ29udGV4dCBvdGhlcikgeworCQlORkFDb250ZXh0IHNwID0gdGhpczsKKwkJLy8gaWYgb25lIG9mIHRoZSBjb250ZXh0cyBpcyBlbXB0eSwgaXQgbmV2ZXIgZW50ZXJzIGxvb3AgYW5kIHJldHVybnMgdHJ1ZQorCQl3aGlsZSAoIHNwLnBhcmVudCE9bnVsbCAmJiBvdGhlci5wYXJlbnQhPW51bGwgKSB7CisJCQlpZiAoIHNwLmludm9raW5nU3RhdGUgIT0gb3RoZXIuaW52b2tpbmdTdGF0ZSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlzcCA9IHNwLnBhcmVudDsKKwkJCW90aGVyID0gb3RoZXIucGFyZW50OworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdWZmaXgiKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisgICAgLyoqIFdhbGsgdXB3YXJkcyB0byB0aGUgcm9vdCBvZiB0aGUgY2FsbCBzdGFjayBjb250ZXh0IGxvb2tpbmcKKyAgICAgKiAgZm9yIGEgcGFydGljdWxhciBpbnZva2luZyBzdGF0ZS4KKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgc3RhdGUpIHsKKyAgICAgICAgTkZBQ29udGV4dCBzcCA9IHRoaXM7CisJCWludCBuID0gMDsgLy8gdHJhY2sgcmVjdXJzaXZlIGludm9jYXRpb25zIG9mIHN0YXRlCisJCVN5c3RlbS5vdXQucHJpbnRsbigidGhpcy5jb250ZXh0IGlzICIrc3ApOworCQl3aGlsZSAoIHNwLnBhcmVudCE9bnVsbCApIHsKKyAgICAgICAgICAgIGlmICggc3AuaW52b2tpbmdTdGF0ZS5zdGF0ZU51bWJlciA9PSBzdGF0ZSApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwID0gc3AucGFyZW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisJICovCisKKwkvKiogR2l2ZW4gYW4gTkZBIHN0YXRlIG51bWJlciwgaG93IG1hbnkgdGltZXMgaGFzIHRoZSBORkEtdG8tREZBCisJICogIGNvbnZlcnNpb24gcHVzaGVkIHRoYXQgc3RhdGUgb24gdGhlIHN0YWNrPyAgSW4gb3RoZXIgd29yZHMsCisJICogIHRoZSBORkEgc3RhdGUgbXVzdCBiZSBhIHJ1bGUgaW52b2NhdGlvbiBzdGF0ZSBhbmQgdGhpcyBtZXRob2QKKwkgKiAgdGVsbHMgeW91IGhvdyBtYW55IHRpbWVzIHlvdSd2ZSBiZWVuIHRvIHRoaXMgc3RhdGUuICBJZiBub25lLAorCSAqICB0aGVuIHlvdSBoYXZlIG5vdCBjYWxsZWQgdGhlIHRhcmdldCBydWxlIGZyb20gdGhpcyBzdGF0ZSBiZWZvcmUKKwkgKiAgKHRob3VnaCBhbm90aGVyIE5GQSBzdGF0ZSBjb3VsZCBoYXZlIGNhbGxlZCB0aGF0IHRhcmdldCBydWxlKS4KKwkgKiAgSWYgbj0xLCB0aGVuIHlvdSd2ZSBiZWVuIHRvIHRoaXMgc3RhdGUgYmVmb3JlIGR1cmluZyB0aGlzCisJICogIERGQSBjb25zdHJ1Y3Rpb24gYW5kIGFyZSBnb2luZyB0byBpbnZva2UgdGhhdCBydWxlIGFnYWluLgorCSAqCisJICogIE5vdGUgdGhhdCBtYW55IE5GQSBzdGF0ZXMgY2FuIGludm9rZSBydWxlIHIsIGJ1dCB3ZSBpZ25vcmUgcmVjdXJzaW9uCisJICogIHVubGVzcyB5b3UgaGl0IHRoZSBzYW1lIHJ1bGUgaW52b2NhdGlvbiBzdGF0ZSBhZ2Fpbi4KKwkgKi8KKwlwdWJsaWMgaW50IHJlY3Vyc2lvbkRlcHRoRW1hbmF0aW5nRnJvbVN0YXRlKGludCBzdGF0ZSkgeworCQlORkFDb250ZXh0IHNwID0gdGhpczsKKwkJaW50IG4gPSAwOyAvLyB0cmFjayByZWN1cnNpdmUgaW52b2NhdGlvbnMgb2YgdGFyZ2V0IGZyb20gdGhpcyBzdGF0ZQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidGhpcy5jb250ZXh0IGlzICIrc3ApOworCQl3aGlsZSAoIHNwLnBhcmVudCE9bnVsbCApIHsKKwkJCWlmICggc3AuaW52b2tpbmdTdGF0ZS5zdGF0ZU51bWJlciA9PSBzdGF0ZSApIHsKKwkJCQluKys7CisJCQl9CisJCQlzcCA9IHNwLnBhcmVudDsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY2FjaGVkSGFzaENvZGU7CisgICAgICAgIC8qCisgICAgICAgIGludCBoID0gMDsKKyAgICAgICAgTkZBQ29udGV4dCBzcCA9IHRoaXM7CisgICAgICAgIHdoaWxlICggc3AucGFyZW50IT1udWxsICkgeworICAgICAgICAgICAgaCArPSBzcC5pbnZva2luZ1N0YXRlLmdldFN0YXRlTnVtYmVyKCk7CisgICAgICAgICAgICBzcCA9IHNwLnBhcmVudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgKi8KKyAgICB9CisKKwkvKiogQSBjb250ZXh0IGlzIGVtcHR5IGlmIHRoZXJlIGlzIG5vIHBhcmVudDsgbWVhbmluZyBub2JvZHkgcHVzaGVkCisJICogIGFueXRoaW5nIG9uIHRoZSBjYWxsIHN0YWNrLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisJCXJldHVybiBwYXJlbnQ9PW51bGw7CisJfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgTkZBQ29udGV4dCBzcCA9IHRoaXM7CisgICAgICAgIGJ1Zi5hcHBlbmQoIlsiKTsKKyAgICAgICAgd2hpbGUgKCBzcC5wYXJlbnQhPW51bGwgKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHNwLmludm9raW5nU3RhdGUuc3RhdGVOdW1iZXIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiICIpOworICAgICAgICAgICAgc3AgPSBzcC5wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiJF0iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQUNvbnZlcnNpb25UaHJlYWQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQUNvbnZlcnNpb25UaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY2ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTkZBQ29udmVyc2lvblRocmVhZC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5CYXJyaWVyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkVycm9yTWFuYWdlcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworCisvKiogQ29udmVydCBhbGwgZGVjaXNpb25zIGkuLmogaW5jbHVzaXZlIGluIGEgdGhyZWFkICovCitwdWJsaWMgY2xhc3MgTkZBQ29udmVyc2lvblRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKwlHcmFtbWFyIGdyYW1tYXI7CisJaW50IGksIGo7CisJQmFycmllciBiYXJyaWVyOworCXB1YmxpYyBORkFDb252ZXJzaW9uVGhyZWFkKEdyYW1tYXIgZ3JhbW1hciwKKwkJCQkJCQkgICBCYXJyaWVyIGJhcnJpZXIsCisJCQkJCQkJICAgaW50IGksCisJCQkJCQkJICAgaW50IGopCisJeworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCQl0aGlzLmJhcnJpZXIgPSBiYXJyaWVyOworCQl0aGlzLmkgPSBpOworCQl0aGlzLmogPSBqOworCX0KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWZvciAoaW50IGRlY2lzaW9uPWk7IGRlY2lzaW9uPD1qOyBkZWNpc2lvbisrKSB7CisJCQlORkFTdGF0ZSBkZWNpc2lvblN0YXJ0U3RhdGUgPSBncmFtbWFyLmdldERlY2lzaW9uTkZBU3RhcnRTdGF0ZShkZWNpc2lvbik7CisJCQlpZiAoIGRlY2lzaW9uU3RhcnRTdGF0ZS5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk+MSApIHsKKwkJCQlncmFtbWFyLmNyZWF0ZUxvb2thaGVhZERGQShkZWNpc2lvbix0cnVlKTsKKwkJCX0KKwkJfQorCQkvLyBub3cgd2FpdCBmb3Igb3RoZXJzIHRvIGZpbmlzaAorCQl0cnkgeworCQkJYmFycmllci53YWl0Rm9yUmVsZWFzZSgpOworCQl9CisJCWNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCJ3aGF0IHRoZSBoZWxsPyBERkEgaW50ZXJydXB0dXMiLCBlKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTkZBU3RhdGUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMTM2NQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQVN0YXRlLmphdmEKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5FcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hckFTVDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5SdWxlOworCisvKiogQSBzdGF0ZSB3aXRoaW4gYW4gTkZBLiBBdCBtb3N0IDIgdHJhbnNpdGlvbnMgZW1hbmF0ZSBmcm9tIGFueSBORkEgc3RhdGUuICovCitwdWJsaWMgY2xhc3MgTkZBU3RhdGUgZXh0ZW5kcyBTdGF0ZSB7CisJLy8gSSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gTkZBIGRlY2lzaW9uIHN0YXRlcyBmb3IgKC4uLikqIGFuZCAoLi4uKSsKKwkvLyBkdXJpbmcgTkZBIGludGVycHJldGF0aW9uLgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPT1BCQUNLID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTE9DS19TVEFSVCA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUxfQkxPQ0tfU1RBUlQgPSAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZUEFTUyA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfRURHRV9PRl9CTE9DSyA9IDU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfVFJBTlNJVElPTlMgPSAyOworCisJLyoqIEhvdyBtYW55IHRyYW5zaXRpb25zOyAwLCAxLCBvciAyIHRyYW5zaXRpb25zICovCisJaW50IG51bVRyYW5zaXRpb25zID0gMDsKKwlwdWJsaWMgVHJhbnNpdGlvbltdIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbltNQVhfVFJBTlNJVElPTlNdOworCisJLyoqIEZvciBvLUEtPm8gdHlwZSBORkEgdHJhbml0aW9ucywgcmVjb3JkIHRoZSBsYWJlbCB0aGF0IGxlYWRzIHRvIHRoaXMKKwkgKiAgc3RhdGUuICBVc2VmdWwgZm9yIGNyZWF0aW5nIHJpY2ggZXJyb3IgbWVzc2FnZXMgd2hlbiB3ZSBmaW5kCisJICogIGluc3VmZmljaWVudGx5ICh3aXRoIHByZWRzKSBjb3ZlcmVkIHN0YXRlcy4KKwkgKi8KKwlwdWJsaWMgTGFiZWwgaW5jaWRlbnRFZGdlTGFiZWw7CisKKwkvKiogV2hpY2ggTkZBIGFyZSB3ZSBpbj8gKi8KKwlwdWJsaWMgTkZBIG5mYSA9IG51bGw7CisKKwkvKiogV2hhdCdzIGl0cyBkZWNpc2lvbiBudW1iZXIgZnJvbSAxLi5uPyAqLworCXByb3RlY3RlZCBpbnQgZGVjaXNpb25OdW1iZXIgPSAwOworCisJLyoqIFN1YnJ1bGVzICguLi4pKiBhbmQgKC4uLikrIGhhdmUgbW9yZSB0aGFuIG9uZSBkZWNpc2lvbiBwb2ludCBpbgorCSAqICB0aGUgTkZBIGNyZWF0ZWQgZm9yIHRoZW0uICBUaGV5IGJvdGggaGF2ZSBhIGxvb3AtZXhpdC1vci1zdGF5LWluCisJICogIGRlY2lzaW9uIG5vZGUgKHRoZSBsb29wIGJhY2sgbm9kZSkuICBUaGV5IGJvdGggaGF2ZSBhIG5vcm1hbAorCSAqICBhbHRlcm5hdGl2ZSBibG9jayBkZWNpc2lvbiBub2RlIGF0IHRoZSBsZWZ0IGVkZ2UuICBUaGUgKC4uLikqIGlzCisJICogIHdvcnNlIGFzIGl0IGV2ZW4gaGFzIGEgYnlwYXNzIGRlY2lzaW9uICgyIGFsdHM6IHN0YXkgaW4gb3IgYnlwYXNzKQorCSAqICBub2RlIGF0IHRoZSBleHRyZW1lIGxlZnQgZWRnZS4gIFRoaXMgaXMgbm90IGhvdyB0aGV5IGdldCBnZW5lcmF0ZWQKKwkgKiAgaW4gY29kZSBhcyBhIHdoaWxlLWxvb3Agb3Igd2hhdGV2ZXIgZGVhbHMgbmljZWx5IHdpdGggZWl0aGVyLiAgRm9yCisJICogIGVycm9yIG1lc3NhZ2VzICh3aGVyZSBJIG5lZWQgdG8gcHJpbnQgdGhlIG5vbmRldGVybWluaXN0aWMgYWx0cykKKwkgKiAgYW5kIGZvciBpbnRlcnByZXRhdGlvbiwgSSBuZWVkIHRvIHVzZSB0aGUgc2luZ2xlIERGQSB0aGF0IGlzIGNyZWF0ZWQKKwkgKiAgKGZvciBlZmZpY2llbmN5KSBidXQgaW50ZXJwcmV0IHRoZSByZXN1bHRzIGRpZmZlcmVudGx5IGRlcGVuZGluZworCSAqICBvbiB3aGljaCBvZiB0aGUgMiBvciAzIGRlY2lzaW9uIHN0YXRlcyB1c2VzIHRoZSBERkEuICBGb3IgZXhhbXBsZSwKKwkgKiAgdGhlIERGQSB3aWxsIGFsd2F5cyByZXBvcnQgYWx0IG4rMSBhcyB0aGUgZXhpdCBicmFuY2ggZm9yIG4gcmVhbAorCSAqICBhbHRzLCBzbyBJIG5lZWQgdG8gdHJhbnNsYXRlIHRoYXQgZGVwZW5kaW5nIG9uIHRoZSBkZWNpc2lvbiBzdGF0ZS4KKwkgKgorCSAqICBJZiBkZWNpc2lvbk51bWJlcj4wIHRoZW4gdGhpcyB2YXIgdGVsbHMgeW91IHdoYXQga2luZCBvZiBkZWNpc2lvbgorCSAqICBzdGF0ZSBpdCBpcy4KKwkgKi8KKwlwdWJsaWMgaW50IGRlY2lzaW9uU3RhdGVUeXBlOworCisJLyoqIFdoYXQgcnVsZSBkbyB3ZSBsaXZlIGluPyAqLworCXB1YmxpYyBSdWxlIGVuY2xvc2luZ1J1bGU7CisKKwkvKiogRHVyaW5nIGRlYnVnZ2luZyBhbmQgZm9yIG5vbmRldGVybWluaXNtIHdhcm5pbmdzLCBpdCdzIHVzZWZ1bAorCSAqICB0byBrbm93IHdoYXQgcmVsYXRpb25zaGlwIHRoaXMgbm9kZSBoYXMgdG8gdGhlIG9yaWdpbmFsIGdyYW1tYXIuCisJICogIEZvciBleGFtcGxlLCAic3RhcnQgb2YgYWx0IDEgb2YgcnVsZSBhIi4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJLyoqIEFzc29jaWF0ZSB0aGlzIE5GQVN0YXRlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgR3JhbW1hckFTVCBub2RlCisJICogIGZyb20gd2hpY2ggdGhpcyBub2RlIHdhcyBjcmVhdGVkLiAgVGhpcyBpcyB1c2VmdWwgbm90IG9ubHkgZm9yCisJICogIGFzc29jaWF0aW5nIHRoZSBldmVudHVhbCBsb29rYWhlYWQgREZBIHdpdGggdGhlIGFzc29jaWF0ZWQKKwkgKiAgR3JhbW1hciBwb3NpdGlvbiwgYnV0IGFsc28gZm9yIHByb3ZpZGluZyB1c2VycyB3aXRoCisJICogIG5vbmRldGVybWluaXNtIHdhcm5pbmdzLiAgTWFpbmx5IHVzZWQgYnkgZGVjaXNpb24gc3RhdGVzIHRvCisJICogIHJlcG9ydCBsaW5lOmNvbCBpbmZvLiAgQ291bGQgYWxzbyBiZSB1c2VkIHRvIHRyYWNrIGxpbmU6Y29sCisJICogIGZvciBlbGVtZW50cyBzdWNoIGFzIHRva2VuIHJlZnMuCisJICovCisJcHVibGljIEdyYW1tYXJBU1QgYXNzb2NpYXRlZEFTVE5vZGU7CisKKwkvKiogSXMgdGhpcyBzdGF0ZSB0aGUgc29sZSB0YXJnZXQgb2YgYW4gRU9UIHRyYW5zaXRpb24/ICovCisJcHJvdGVjdGVkIGJvb2xlYW4gRU9UVGFyZ2V0U3RhdGUgPSBmYWxzZTsKKworCS8qKiBKZWFuIEJvdmV0IG5lZWRzIGluIHRoZSBHVUkgdG8ga25vdyB3aGljaCBzdGF0ZSBwYWlycyBjb3JyZXNwb25kCisJICogIHRvIHRoZSBzdGFydC9zdG9wIG9mIGEgYmxvY2suCisJICAqLworCXB1YmxpYyBpbnQgZW5kT2ZCbG9ja1N0YXRlTnVtYmVyID0gU3RhdGUuSU5WQUxJRF9TVEFURV9OVU1CRVI7CisKKwlwdWJsaWMgTkZBU3RhdGUoTkZBIG5mYSkgeworCQl0aGlzLm5mYSA9IG5mYTsKKwl9CisKKwlwdWJsaWMgaW50IGdldE51bWJlck9mVHJhbnNpdGlvbnMoKSB7CisJCXJldHVybiBudW1UcmFuc2l0aW9uczsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRUcmFuc2l0aW9uKFRyYW5zaXRpb24gZSkgeworCQlpZiAoIGU9PW51bGwgKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgY2FuJ3QgYWRkIGEgbnVsbCB0cmFuc2l0aW9uIik7CQkJCisJCX0KKwkJaWYgKCBudW1UcmFuc2l0aW9ucz50cmFuc2l0aW9uLmxlbmd0aCApIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBjYW4gb25seSBoYXZlICIrdHJhbnNpdGlvbi5sZW5ndGgrIiB0cmFuc2l0aW9ucyIpOworCQl9CisJCWlmICggZSE9bnVsbCApIHsKKwkJCXRyYW5zaXRpb25bbnVtVHJhbnNpdGlvbnNdID0gZTsKKwkJCW51bVRyYW5zaXRpb25zKys7CisJCQkvLyBTZXQgdGhlICJiYWNrIHBvaW50ZXIiIG9mIHRoZSB0YXJnZXQgc3RhdGUgc28gdGhhdCBpdAorCQkJLy8ga25vd3MgYWJvdXQgdGhlIGxhYmVsIG9mIHRoZSBpbmNvbWluZyBlZGdlLgorCQkJTGFiZWwgbGFiZWwgPSBlLmxhYmVsOworCQkJaWYgKCBsYWJlbC5pc0F0b20oKSB8fCBsYWJlbC5pc1NldCgpICkgeworCQkJCWlmICggKChORkFTdGF0ZSllLnRhcmdldCkuaW5jaWRlbnRFZGdlTGFiZWwhPW51bGwgKSB7CisJCQkJCUVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCJDbG9iYmVyZWQgaW5jaWRlbnQgZWRnZSIpOworCQkJCX0KKwkJCQkoKE5GQVN0YXRlKWUudGFyZ2V0KS5pbmNpZGVudEVkZ2VMYWJlbCA9IGUubGFiZWw7CisJCQl9CisJCX0KKwl9CisKKwkvKiogVXNlZCBkdXJpbmcgb3B0aW1pemF0aW9uIHRvIHJlc2V0IGEgc3RhdGUgdG8gaGF2ZSB0aGUgKHNpbmdsZSkKKwkgKiAgdHJhbnNpdGlvbiBhbm90aGVyIHN0YXRlIGhhcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFuc2l0aW9uMChUcmFuc2l0aW9uIGUpIHsKKwkJaWYgKCBlPT1udWxsICkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWW91IGNhbid0IHVzZSBhIHNvbGl0YXJ5IG51bGwgdHJhbnNpdGlvbiIpOworCQl9CisJCXRyYW5zaXRpb25bMF0gPSBlOworCQl0cmFuc2l0aW9uWzFdID0gbnVsbDsKKwkJbnVtVHJhbnNpdGlvbnMgPSAxOworCX0KKworCXB1YmxpYyBUcmFuc2l0aW9uIHRyYW5zaXRpb24oaW50IGkpIHsKKwkJcmV0dXJuIHRyYW5zaXRpb25baV07CisJfQorCisJLyoqIFRoZSBERkEgZGVjaXNpb24gZm9yIHRoaXMgTkZBIGRlY2lzaW9uIHN0YXRlIGFsd2F5cyBoYXMKKwkgKiAgYW4gZXhpdCBwYXRoIGZvciBsb29wcyBhcyBuKzEgZm9yIG4gYWx0cyBpbiB0aGUgbG9vcC4KKwkgKiAgVGhhdCBpcyByZWFsbHkgdXNlZnVsIGZvciBkaXNwbGF5aW5nIG5vbmRldGVybWluaXN0aWMgYWx0cworCSAqICBhbmQgc28gb24sIGJ1dCBmb3Igd2Fsa2luZyB0aGUgTkZBIHRvIGdldCBhIHNlcXVlbmNlIG9mIGVkZ2UKKwkgKiAgbGFiZWxzIG9yIGZvciBhY3R1YWxseSBwYXJzaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgcmVhbCBhbHQKKwkgKiAgbnVtYmVyLiAgVGhlIHJlYWwgYWx0IG51bWJlciBmb3IgZXhpdGluZyBhIGxvb3AgaXMgYWx3YXlzIDEKKwkgKiAgYXMgdHJhbnNpdGlvbiAwIHBvaW50cyBhdCB0aGUgZXhpdCBicmFuY2ggKHdlIGNvbXB1dGUgREZBcworCSAqICBhbHdheXMgZm9yIGxvb3BzIGF0IHRoZSBsb29wYmFjayBzdGF0ZSkuCisJICoKKwkgKiAgRm9yIHdhbGtpbmcvcGFyc2luZyB0aGUgbG9vcGJhY2sgc3RhdGU6CisJICogCQkxIDIgMyBkaXNwbGF5IGFsdCAoZm9yIGh1bWFuIGNvbnN1bXB0aW9uKQorCSAqIAkJMiAzIDEgd2FsayBhbHQKKwkgKgorCSAqICBGb3Igd2Fsa2luZyB0aGUgYmxvY2sgc3RhcnQ6CisJICogCQkxIDIgMyBkaXNwbGF5IGFsdAorCSAqIAkJMSAyIDMKKwkgKgorCSAqICBGb3Igd2Fsa2luZyB0aGUgYnlwYXNzIHN0YXRlIG9mIGEgKC4uLikqIGxvb3A6CisJICogCQkxIDIgMyBkaXNwbGF5IGFsdAorCSAqIAkJMSAxIDIgYWxsIGJsb2NrIGFsdHMgbWFwIHRvIGVudGVyaW5nIGxvb3AgZXhpdCBtZWFucyB0YWtlIGJ5cGFzcworCSAqCisJICogIE5vbiBsb29wIEVCTkYgZG8gbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZDsgdGhleSBhcmUgaWdub3JlZCBieQorCSAqICB0aGlzIG1ldGhvZCBhcyBkZWNpc2lvblN0YXRlVHlwZT09MC4KKwkgKgorCSAqICBSZXR1cm4gc2FtZSBhbHQgaWYgd2UgY2FuJ3QgdHJhbnNsYXRlLgorCSAqLworCXB1YmxpYyBpbnQgdHJhbnNsYXRlRGlzcGxheUFsdFRvV2Fsa0FsdChpbnQgZGlzcGxheUFsdCkgeworCQlORkFTdGF0ZSBuZmFTdGFydCA9IHRoaXM7CisJCWlmICggZGVjaXNpb25OdW1iZXI9PTAgfHwgZGVjaXNpb25TdGF0ZVR5cGU9PTAgKSB7CisJCQlyZXR1cm4gZGlzcGxheUFsdDsKKwkJfQorCQlpbnQgd2Fsa0FsdCA9IDA7CisJCS8vIGZpbmQgdGhlIE5GQSBsb29wYmFjayBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBERkEKKwkJLy8gYW5kIGNvdW50IG51bWJlciBvZiBhbHRzIChhbGwgYWx0IG51bWJlcnMgYXJlIGNvbXB1dGVkCisJCS8vIGJhc2VkIHVwb24gdGhlIGxvb3BiYWNrJ3MgTkZBIHN0YXRlLgorCQkvKgorCQlERkEgZGZhID0gbmZhLmdyYW1tYXIuZ2V0TG9va2FoZWFkREZBKGRlY2lzaW9uTnVtYmVyKTsKKwkJaWYgKCBkZmE9PW51bGwgKSB7CisJCQlFcnJvck1hbmFnZXIuaW50ZXJuYWxFcnJvcigiY2FuJ3QgZ2V0IERGQSBmb3IgZGVjaXNpb24gIitkZWNpc2lvbk51bWJlcik7CisJCX0KKwkJKi8KKwkJaW50IG5BbHRzID0gbmZhLmdyYW1tYXIuZ2V0TnVtYmVyT2ZBbHRzRm9yRGVjaXNpb25ORkEobmZhU3RhcnQpOworCQlzd2l0Y2ggKCBuZmFTdGFydC5kZWNpc2lvblN0YXRlVHlwZSApIHsKKwkJCWNhc2UgTE9PUEJBQ0sgOgorCQkJCXdhbGtBbHQgPSBkaXNwbGF5QWx0ICUgbkFsdHMgKyAxOyAvLyByb3RhdGUgcmlnaHQgbW9kIDEuLjMKKwkJCQlicmVhazsKKwkJCWNhc2UgQkxPQ0tfU1RBUlQgOgorCQkJY2FzZSBPUFRJT05BTF9CTE9DS19TVEFSVCA6CisJCQkJd2Fsa0FsdCA9IGRpc3BsYXlBbHQ7IC8vIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uCisJCQkJYnJlYWs7CisJCQljYXNlIEJZUEFTUyA6CisJCQkJaWYgKCBkaXNwbGF5QWx0ID09IG5BbHRzICkgeworCQkJCQl3YWxrQWx0ID0gMjsgLy8gYnlwYXNzCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl3YWxrQWx0ID0gMTsgLy8gYW55IG5vbiBleGl0IGJyYW5jaCBhbHQgcHJlZGljdHMgZW50ZXJpbmcKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHdhbGtBbHQ7CisJfQorCisJLy8gU2V0dGVyL0dldHRlcnMKKworCS8qKiBXaGF0IEFTVCBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE5GQVN0YXRlPyAgV2hlbiB5b3UKKwkgKiAgc2V0IHRoZSBBU1Qgbm9kZSwgSSBzZXQgdGhlIG5vZGUgdG8gcG9pbnQgYmFjayB0byB0aGlzIE5GQSBzdGF0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWNpc2lvbkFTVE5vZGUoR3JhbW1hckFTVCBkZWNpc2lvbkFTVE5vZGUpIHsKKwkJZGVjaXNpb25BU1ROb2RlLnNldE5GQVN0YXJ0U3RhdGUodGhpcyk7CisJCXRoaXMuYXNzb2NpYXRlZEFTVE5vZGUgPSBkZWNpc2lvbkFTVE5vZGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJcHVibGljIGludCBnZXREZWNpc2lvbk51bWJlcigpIHsKKwkJcmV0dXJuIGRlY2lzaW9uTnVtYmVyOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlY2lzaW9uTnVtYmVyKGludCBkZWNpc2lvbk51bWJlcikgeworCQl0aGlzLmRlY2lzaW9uTnVtYmVyID0gZGVjaXNpb25OdW1iZXI7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNFT1RUYXJnZXRTdGF0ZSgpIHsKKwkJcmV0dXJuIEVPVFRhcmdldFN0YXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEVPVFRhcmdldFN0YXRlKGJvb2xlYW4gZW90KSB7CisJCUVPVFRhcmdldFN0YXRlID0gZW90OworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGVjaXNpb25TdGF0ZSgpIHsKKwkJcmV0dXJuIGRlY2lzaW9uU3RhdGVUeXBlPjA7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRlTnVtYmVyKTsKKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvTkZBVG9ERkFDb252ZXJ0ZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQVRvREZBQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzYWIyYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05GQVRvREZBQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxNzM5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCitpbXBvcnQgb3JnLmFudGxyLm1pc2MuT3JkZXJlZEhhc2hTZXQ7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuRXJyb3JNYW5hZ2VyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBDb2RlIHRoYXQgZW1ib2RpZXMgdGhlIE5GQSBjb252ZXJzaW9uIHRvIERGQS4gQSBuZXcgb2JqZWN0IGlzIG5lZWRlZAorICogIHBlciBERkEgKGFsc28gcmVxdWlyZWQgZm9yIHRocmVhZCBzYWZldHkgaWYgbXVsdGlwbGUgY29udmVyc2lvbnMKKyAqICBsYXVuY2hlZCkuCisgKi8KK3B1YmxpYyBjbGFzcyBORkFUb0RGQUNvbnZlcnRlciB7CisJLyoqIEEgbGlzdCBvZiBERkEgc3RhdGVzIHdlIHN0aWxsIG5lZWQgdG8gcHJvY2VzcyBkdXJpbmcgTkZBIGNvbnZlcnNpb24gKi8KKwlwcm90ZWN0ZWQgTGlzdCB3b3JrID0gbmV3IExpbmtlZExpc3QoKTsKKworCS8qKiBXaGlsZSBjb252ZXJ0aW5nIE5GQSwgd2UgbXVzdCB0cmFjayBzdGF0ZXMgdGhhdAorCSAqICByZWZlcmVuY2Ugb3RoZXIgcnVsZSdzIE5GQXMgc28gd2Uga25vdyB3aGF0IHRvIGRvCisJICogIGF0IHRoZSBlbmQgb2YgYSBydWxlLiAgV2UgbmVlZCB0byBrbm93IHdoYXQgY29udGV4dCBpbnZva2VkCisJICogIHRoaXMgcnVsZSBzbyB3ZSBjYW4ga25vdyB3aGVyZSB0byBjb250aW51ZSBsb29raW5nIGZvciBORkEKKwkgKiAgc3RhdGVzLiAgSSdtIHRyYWNraW5nIGEgY29udGV4dCB0cmVlIChyZWNvcmQgb2YgcnVsZSBpbnZvY2F0aW9uCisJICogIHN0YWNrIHRyYWNlKSBmb3IgZWFjaCBhbHRlcm5hdGl2ZSB0aGF0IGNvdWxkIGJlIHByZWRpY3RlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgTkZBQ29udGV4dFtdIGNvbnRleHRUcmVlczsKKworCS8qKiBXZSBhcmUgY29udmVydGluZyB3aGljaCBERkE/ICovCisJcHJvdGVjdGVkIERGQSBkZmE7CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworCS8qKiBTaG91bGQgQU5UTFIgbGF1bmNoIG11bHRpcGxlIHRocmVhZHMgdG8gY29udmVydCBORkFzIHRvIERGQXM/CisJICogIFdpdGggYSAyLUNQVSBib3gsIEkgbm90ZSB0aGF0IGl0J3MgYWJvdXQgdGhlIHNhbWUgc2luZ2xlIG9yCisJICogIG11bHRpdGhyZWFkZWQuICBCb3RoIENQVSBtZXRlcnMgYXJlIGdvaW5nIGV2ZW4gd2hlbiBzaW5nbGUtdGhyZWFkZWQKKwkgKiAgc28gSSBhc3N1bWUgdGhlIEdDIGlzIGtpbGxpbmcgdXMuICBDb3VsZCBiZSB0aGUgY29tcGlsZXIuICBXaGVuIEkKKwkgKiAgcnVuIGphdmEgLVhpbnQgbW9kZSwgSSBnZXQgYWJvdXQgMTUlIHNwZWVkIGltcHJvdmVtZW50IHdpdGggbXVsdGlwbGUKKwkgKiAgdGhyZWFkcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gU0lOR0xFX1RIUkVBREVEX05GQV9DT05WRVJTSU9OID0gdHJ1ZTsKKworCXByb3RlY3RlZCBib29sZWFuIGNvbXB1dGluZ1N0YXJ0U3RhdGUgPSBmYWxzZTsKKworCXB1YmxpYyBORkFUb0RGQUNvbnZlcnRlcihERkEgZGZhKSB7CisJCXRoaXMuZGZhID0gZGZhOworCQlpbnQgbkFsdHMgPSBkZmEuZ2V0TnVtYmVyT2ZBbHRzKCk7CisJCWluaXRDb250ZXh0VHJlZXMobkFsdHMpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbnZlcnQoKSB7CisJCS8vZGZhLmNvbnZlcnNpb25TdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkvLyBjcmVhdGUgdGhlIERGQSBzdGFydCBzdGF0ZQorCQlkZmEuc3RhcnRTdGF0ZSA9IGNvbXB1dGVTdGFydFN0YXRlKCk7CisKKwkJLy8gd2hpbGUgbW9yZSBERkEgc3RhdGVzIHRvIGNoZWNrLCBwcm9jZXNzIHRoZW0KKwkJd2hpbGUgKCB3b3JrLnNpemUoKT4wICYmCisJCQkJIWRmYS5uZmEuZ3JhbW1hci5ORkFUb0RGQUNvbnZlcnNpb25FeHRlcm5hbGx5QWJvcnRlZCgpICkKKwkJeworCQkJREZBU3RhdGUgZCA9IChERkFTdGF0ZSkgd29yay5nZXQoMCk7CisJCQlpZiAoIGRmYS5uZmEuZ3JhbW1hci5jb21wb3NpdGUud2F0Y2hORkFDb252ZXJzaW9uICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29udmVydCBERkEgc3RhdGUgIitkLnN0YXRlTnVtYmVyKworCQkJCQkJCQkgICAiICgiK2QubmZhQ29uZmlndXJhdGlvbnMuc2l6ZSgpKyIgbmZhIHN0YXRlcykiKTsKKwkJCX0KKwkJCWludCBrID0gZGZhLmdldFVzZXJNYXhMb29rYWhlYWQoKTsKKwkJCWlmICggaz4wICYmIGs9PWQuZ2V0TG9va2FoZWFkRGVwdGgoKSApIHsKKwkJCQkvLyB3ZSd2ZSBoaXQgbWF4IGxvb2thaGVhZCwgbWFrZSB0aGlzIGEgc3RvcCBzdGF0ZQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdG9wIHN0YXRlIEBrPSIraysiICh0ZXJtaW5hdGVkIGVhcmx5KSIpOworCQkJCS8qCisJCQkJTGlzdDxMYWJlbD4gc2FtcGxlSW5wdXRMYWJlbHMgPSBkLmRmYS5wcm9iZS5nZXRTYW1wbGVOb25EZXRlcm1pbmlzdGljSW5wdXRTZXF1ZW5jZShkKTsKKwkJCQlTdHJpbmcgaW5wdXQgPSBkLmRmYS5wcm9iZS5nZXRJbnB1dFNlcXVlbmNlRGlzcGxheShzYW1wbGVJbnB1dExhYmVscyk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYW1wbGUgaW5wdXQ6ICIraW5wdXQpOworCQkJCSAqLworCQkJCXJlc29sdmVOb25EZXRlcm1pbmlzbXMoZCk7CisJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gYWRkIGFueSBzZW1hbnRpYyBwcmVkaWNhdGUgdHJhbnNpdGlvbnMKKwkJCQlpZiAoIGQuaXNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzKCkgKSB7CisJCQkJCWFkZFByZWRpY2F0ZVRyYW5zaXRpb25zKGQpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZC5zZXRBY2NlcHRTdGF0ZSh0cnVlKTsgLy8gbXVzdCBjb252ZXJ0IHRvIGFjY2VwdCBzdGF0ZSBhdCBrCisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJZmluZE5ld0RGQVN0YXRlc0FuZEFkZERGQVRyYW5zaXRpb25zKGQpOworCQkJfQorCQkJd29yay5yZW1vdmUoMCk7IC8vIGRvbmUgd2l0aCBpdDsgcmVtb3ZlIGZyb20gd29yayBsaXN0CisJCX0KKworCQkvLyBGaW5kIGFsbCBtYW51YWwgc3luIHByZWRzIChnYXRlZCkuICBUaGVzZSBhcmUgbm90IGRpc2NvdmVyZWQKKwkJLy8gaW4gdHJ5VG9SZXNvbHZlV2l0aFNlbWFudGljUHJlZGljYXRlcyBiZWNhdXNlIHRoZXkgYXJlIGltcGxpY2l0bHkKKwkJLy8gYWRkZWQgdG8gZXZlcnkgZWRnZSBieSBjb2RlIGdlbiwgRE9UIGdlbmVyYXRpb24gZXRjLi4uCisJCWRmYS5maW5kQWxsR2F0ZWRTeW5QcmVkc1VzZWRJbkRGQUFjY2VwdFN0YXRlcygpOworCX0KKworCS8qKiBGcm9tIHRoaXMgZmlyc3QgTkZBIHN0YXRlIG9mIGEgZGVjaXNpb24sIGNyZWF0ZSBhIERGQS4KKwkgKiAgV2FsayBlYWNoIGFsdCBpbiBkZWNpc2lvbiBhbmQgY29tcHV0ZSBjbG9zdXJlIGZyb20gdGhlIHN0YXJ0IG9mIHRoYXQKKwkgKiAgcnVsZSwgbWFraW5nIHN1cmUgdGhhdCB0aGUgY2xvc3VyZSBkb2VzIG5vdCBpbmNsdWRlIG90aGVyIGFsdHMgd2l0aGluCisJICogIHRoYXQgc2FtZSBkZWNpc2lvbi4gIFRoZSBpZGVhIGlzIHRvIGFzc29jaWF0ZSBhIHNwZWNpZmljIGFsdCBudW1iZXIKKwkgKiAgd2l0aCB0aGUgc3RhcnRpbmcgY2xvc3VyZSBzbyB3ZSBjYW4gdHJhY2UgdGhlIGFsdCBudW1iZXIgZm9yIGFsbCBzdGF0ZXMKKwkgKiAgZGVyaXZlZCBmcm9tIHRoaXMuICBBdCBhIHN0b3Agc3RhdGUgaW4gdGhlIERGQSwgd2UgY2FuIHJldHVybiB0aGlzIGFsdAorCSAqICBudW1iZXIsIGluZGljYXRpbmcgd2hpY2ggYWx0IGlzIHByZWRpY3RlZC4KKwkgKgorCSAqICBJZiB0aGlzIERGQSBpcyBkZXJpdmVkIGZyb20gYW4gbG9vcCBiYWNrIE5GQSBzdGF0ZSwgdGhlbiB0aGUgZmlyc3QKKwkgKiAgdHJhbnNpdGlvbiBpcyBhY3R1YWxseSB0aGUgZXhpdCBicmFuY2ggb2YgdGhlIGxvb3AuICBSYXRoZXIgdGhhbiBtYWtlCisJICogIHRoaXMgYWx0ZXJuYXRpdmUgb25lLCBsZXQncyBtYWtlIHRoaXMgYWx0IG4rMSB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YKKwkgKiAgYWx0cyBpbiB0aGlzIGJsb2NrLiAgVGhpcyBpcyBuaWNlIHRvIGtlZXAgdGhlIGFsdHMgb2YgdGhlIGJsb2NrIDEuLm47CisJICogIGhlbHBzIHdpdGggZXJyb3IgbWVzc2FnZXMuCisJICoKKwkgKiAgSSBoYW5kbGUgbm9uZ3JlZWR5IGluIGZpbmROZXdERkFTdGF0ZXNBbmRBZGRERkFUcmFuc2l0aW9ucworCSAqICB3aGVuIG5vbmdyZWVkeSBhbmQgRU9UIHRyYW5zaXRpb24uICBNYWtlIHN0YXRlIHdpdGggRU9UIGVtYW5hdGluZworCSAqICBmcm9tIGl0IHRoZSBhY2NlcHQgc3RhdGUuCisJICovCisJcHJvdGVjdGVkIERGQVN0YXRlIGNvbXB1dGVTdGFydFN0YXRlKCkgeworCQlORkFTdGF0ZSBhbHQgPSBkZmEuZGVjaXNpb25ORkFTdGFydFN0YXRlOworCQlERkFTdGF0ZSBzdGFydFN0YXRlID0gZGZhLm5ld1N0YXRlKCk7CisJCWNvbXB1dGluZ1N0YXJ0U3RhdGUgPSB0cnVlOworCQlpbnQgaSA9IDA7CisJCWludCBhbHROdW0gPSAxOworCQl3aGlsZSAoIGFsdCE9bnVsbCApIHsKKwkJCS8vIGZpbmQgdGhlIHNldCBvZiBORkEgc3RhdGVzIHJlYWNoYWJsZSB3aXRob3V0IGNvbnN1bWluZworCQkJLy8gYW55IGlucHV0IHN5bWJvbHMgZm9yIGVhY2ggYWx0LiAgS2VlcCBhZGRpbmcgdG8gc2FtZQorCQkJLy8gb3ZlcmFsbCBjbG9zdXJlIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlIERGQSBzdGFydCBzdGF0ZSwKKwkJCS8vIGJ1dCB0cmFjayB0aGUgYWx0IG51bWJlcgorCQkJTkZBQ29udGV4dCBpbml0aWFsQ29udGV4dCA9IGNvbnRleHRUcmVlc1tpXTsKKwkJCS8vIGlmIGZpcnN0IGFsdCBpcyBkZXJpdmVkIGZyb20gbG9vcGJhY2svZXhpdCBicmFuY2ggb2YgbG9vcCwKKwkJCS8vIG1ha2UgYWx0PW4rMSBmb3IgbiBhbHRzIGluc3RlYWQgb2YgMQorCQkJaWYgKCBpPT0wICYmCisJCQkJIGRmYS5nZXRORkFEZWNpc2lvblN0YXJ0U3RhdGUoKS5kZWNpc2lvblN0YXRlVHlwZT09TkZBU3RhdGUuTE9PUEJBQ0sgKQorCQkJeworCQkJCWludCBudW1BbHRzSW5jbHVkaW5nRXhpdEJyYW5jaCA9IGRmYS5uZmEuZ3JhbW1hcgorCQkJCQkuZ2V0TnVtYmVyT2ZBbHRzRm9yRGVjaXNpb25ORkEoZGZhLmRlY2lzaW9uTkZBU3RhcnRTdGF0ZSk7CisJCQkJYWx0TnVtID0gbnVtQWx0c0luY2x1ZGluZ0V4aXRCcmFuY2g7CisJCQkJY2xvc3VyZSgoTkZBU3RhdGUpYWx0LnRyYW5zaXRpb25bMF0udGFyZ2V0LAorCQkJCQkJYWx0TnVtLAorCQkJCQkJaW5pdGlhbENvbnRleHQsCisJCQkJCQlTZW1hbnRpY0NvbnRleHQuRU1QVFlfU0VNQU5USUNfQ09OVEVYVCwKKwkJCQkJCXN0YXJ0U3RhdGUsCisJCQkJCQl0cnVlCisJCQkJKTsKKwkJCQlhbHROdW0gPSAxOyAvLyBtYWtlIG5leHQgYWx0IHRoZSBmaXJzdAorCQkJfQorCQkJZWxzZSB7CisJCQkJY2xvc3VyZSgoTkZBU3RhdGUpYWx0LnRyYW5zaXRpb25bMF0udGFyZ2V0LAorCQkJCQkJYWx0TnVtLAorCQkJCQkJaW5pdGlhbENvbnRleHQsCisJCQkJCQlTZW1hbnRpY0NvbnRleHQuRU1QVFlfU0VNQU5USUNfQ09OVEVYVCwKKwkJCQkJCXN0YXJ0U3RhdGUsCisJCQkJCQl0cnVlCisJCQkJKTsKKwkJCQlhbHROdW0rKzsKKwkJCX0KKwkJCWkrKzsKKworCQkJLy8gbW92ZSB0byBuZXh0IGFsdGVybmF0aXZlCisJCQlpZiAoIGFsdC50cmFuc2l0aW9uWzFdID09bnVsbCApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFsdCA9IChORkFTdGF0ZSlhbHQudHJhbnNpdGlvblsxXS50YXJnZXQ7CisJCX0KKworCQkvLyBub3cgREZBIHN0YXJ0IHN0YXRlIGhhcyB0aGUgY29tcGxldGUgY2xvc3VyZSBmb3IgdGhlIGRlY2lzaW9uCisJCS8vIGJ1dCB3ZSBoYXZlIHRyYWNrZWQgd2hpY2ggYWx0IGlzIGFzc29jaWF0ZWQgd2l0aCB3aGljaAorCQkvLyBORkEgc3RhdGVzLgorCQlkZmEuYWRkU3RhdGUoc3RhcnRTdGF0ZSk7IC8vIG1ha2Ugc3VyZSBkZmEga25vd3MgYWJvdXQgdGhpcyBzdGF0ZQorCQl3b3JrLmFkZChzdGFydFN0YXRlKTsKKwkJY29tcHV0aW5nU3RhcnRTdGF0ZSA9IGZhbHNlOworCQlyZXR1cm4gc3RhcnRTdGF0ZTsKKwl9CisKKwkvKiogRnJvbSB0aGlzIG5vZGUsIGFkZCBhIGQtLWEtLT50IHRyYW5zaXRpb24gZm9yIGFsbAorCSAqICBsYWJlbHMgJ2EnIHdoZXJlIHQgaXMgYSBERkEgbm9kZSBjcmVhdGVkCisJICogIGZyb20gdGhlIHNldCBvZiBORkEgc3RhdGVzIHJlYWNoYWJsZSBmcm9tIGFueSBORkEKKwkgKiAgc3RhdGUgaW4gREZBIHN0YXRlIGQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZmluZE5ld0RGQVN0YXRlc0FuZEFkZERGQVRyYW5zaXRpb25zKERGQVN0YXRlIGQpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIndvcmsgb24gREZBIHN0YXRlICIrZCk7CisJCU9yZGVyZWRIYXNoU2V0IGxhYmVscyA9IGQuZ2V0UmVhY2hhYmxlTGFiZWxzKCk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZWFjaGFibGUgbGFiZWxzPSIrbGFiZWxzKTsKKworCQkvKgorCQlTeXN0ZW0ub3V0LnByaW50bG4oInxyZWFjaGFibGV8L3xuZmFjb25maWdzfD0iKworCQkJCWxhYmVscy5zaXplKCkrIi8iK2QuZ2V0TkZBQ29uZmlndXJhdGlvbnMoKS5zaXplKCkrIj0iKworCQkJCWxhYmVscy5zaXplKCkvKGZsb2F0KWQuZ2V0TkZBQ29uZmlndXJhdGlvbnMoKS5zaXplKCkpOworCQkqLworCisJCS8vIG5vcm1hbGx5IEVPVCBpcyB0aGUgImRlZmF1bHQiIGNsYXVzZSBhbmQgZGVjaXNpb25zIGp1c3QKKwkJLy8gY2hvb3NlIHRoYXQgbGFzdCBjbGF1c2Ugd2hlbiBub3RoaW5nIGVsc2UgbWF0Y2hlcy4gIERGQSBjb252ZXJzaW9uCisJCS8vIGNvbnRpbnVlcyBzZWFyY2hpbmcgZm9yIGEgdW5pcXVlIHNlcXVlbmNlIHRoYXQgcHJlZGljdHMgdGhlCisJCS8vIHZhcmlvdXMgYWx0cyBvciB1bnRpbCBpdCBmaW5kcyBFT1QuICBTbyB0aGlzIHJ1bGUKKwkJLy8KKwkJLy8gRFVIIDogKCd4J3wneScpKiAieHkhIjsKKwkJLy8KKwkJLy8gZG9lcyBub3QgbmVlZCBhIGdyZWVkeSBpbmRpY2F0b3IuICBUaGUgZm9sbG93aW5nIHJ1bGUgd29ya3MgZmluZSB0b28KKwkJLy8KKwkJLy8gQSA6ICgneCcpKyA7CisJCS8vCisJCS8vIFdoZW4gdGhlIGZvbGxvdyBicmFuY2ggY291bGQgbWF0Y2ggd2hhdCBpcyBpbiB0aGUgbG9vcCwgYnkgZGVmYXVsdCwKKwkJLy8gdGhlIG5vbmRldGVybWluaXNtIGlzIHJlc29sdmVkIGluIGZhdm9yIG9mIHRoZSBsb29wLiAgWW91IGRvbid0CisJCS8vIGdldCBhIHdhcm5pbmcgYmVjYXVzZSB0aGUgb25seSB3YXkgdG8gZ2V0IHRoaXMgY29uZGl0aW9uIGlzIGlmCisJCS8vIHRoZSBERkEgY29udmVyc2lvbiBoaXRzIHRoZSBlbmQgb2YgdGhlIHRva2VuLiAgSW4gdGhhdCBjYXNlLAorCQkvLyB3ZSdyZSBub3QgKnN1cmUqIHdoYXQgd2lsbCBoYXBwZW4gbmV4dCwgYnV0IGl0IGNvdWxkIGJlIGFueXRoaW5nLgorCQkvLyBBbnl3YXksIEVPVCBpcyB0aGUgZGVmYXVsdCBjYXNlIHdoaWNoIG1lYW5zIGl0IHdpbGwgbmV2ZXIgYmUgbWF0Y2hlZAorCQkvLyBhcyByZXNvbHV0aW9uIGdvZXMgdG8gdGhlIGxvd2VzdCBhbHQgbnVtYmVyLiAgRXhpdCBicmFuY2hlcyBhcmUKKwkJLy8gYWx3YXlzIGFsdCBuKzEgZm9yIG4gYWx0cyBpbiBhIGJsb2NrLgorCQkvLworCQkvLyBXaGVuIGEgbG9vcCBpcyBub25ncmVlZHkgYW5kIHdlIGZpbmQgYW4gRU9UIHRyYW5zaXRpb24sIHRoZSBERkEKKwkJLy8gc3RhdGUgc2hvdWxkIGJlY29tZSBhbiBhY2NlcHQgc3RhdGUsIHByZWRpY3RpbmcgZXhpdCBvZiBsb29wLiAgSXQncworCQkvLyBqdXN0IHJldmVyc2luZyB0aGUgcmVzb2x1dGlvbiBvZiBhbWJpZ3VpdHkuCisJCS8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGRvbmUgaW4gdGhlIHJlc29sdmVBbWJpZyBtZXRob2Q/CisJCUxhYmVsIEVPVExhYmVsID0gbmV3IExhYmVsKExhYmVsLkVPVCk7CisJCWJvb2xlYW4gY29udGFpbnNFT1QgPSBsYWJlbHMhPW51bGwgJiYgbGFiZWxzLmNvbnRhaW5zKEVPVExhYmVsKTsKKwkJaWYgKCAhZGZhLmlzR3JlZWR5KCkgJiYgY29udGFpbnNFT1QgKSB7CisJCQljb252ZXJ0VG9FT1RBY2NlcHRTdGF0ZShkKTsKKwkJCXJldHVybjsgLy8gbm8gbW9yZSB3b3JrIHRvIGRvIG9uIHRoaXMgYWNjZXB0IHN0YXRlCisJCX0KKworCQkvLyBpZiBpbiBmaWx0ZXIgbW9kZSBmb3IgbGV4ZXIsIHdhbnQgdG8gbWF0Y2ggc2hvcnRlc3Qgbm90IGxvbmdlc3QKKwkJLy8gc3RyaW5nIHNvIGlmIHdlIHNlZSBhbiBFT1QgZWRnZSBlbWFuYXRpbmcgZnJvbSB0aGlzIHN0YXRlLCB0aGVuCisJCS8vIGNvbnZlcnQgdGhpcyBzdGF0ZSB0byBhbiBhY2NlcHQgc3RhdGUuICBUaGlzIG9ubHkgY291bnRzIGZvcgorCQkvLyBUaGUgVG9rZW5zIHJ1bGUgYXMgYWxsIG90aGVyIGRlY2lzaW9ucyBtdXN0IGNvbnRpbnVlIHRvIGxvb2sgZm9yCisJCS8vIGxvbmdlc3QgbWF0Y2guCisJCS8vIFtUYWtpbmcgYmFjayBvdXQgYSBmZXcgZGF5cyBsYXRlciBvbiBKYW4gMTcsIDIwMDYuICBUaGlzIGNvdWxkCisJCS8vICBiZSBhbiBvcHRpb24gZm9yIHRoZSBmdXR1cmUsIGJ1dCB0aGlzIHdhcyB3cm9uZyBzb2x1aW9uIGZvcgorCQkvLyAgZmlsdGVyaW5nLl0KKwkJLyoKKwkJaWYgKCBkZmEubmZhLmdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiAmJiBjb250YWluc0VPVCApIHsKKwkJCVN0cmluZyBmaWx0ZXJPcHRpb24gPSAoU3RyaW5nKWRmYS5uZmEuZ3JhbW1hci5nZXRPcHRpb24oImZpbHRlciIpOworCQkJYm9vbGVhbiBmaWx0ZXJNb2RlID0gZmlsdGVyT3B0aW9uIT1udWxsICYmIGZpbHRlck9wdGlvbi5lcXVhbHMoInRydWUiKTsKKwkJCWlmICggZmlsdGVyTW9kZSAmJiBkLmRmYS5pc1Rva2Vuc1J1bGVEZWNpc2lvbigpICkgeworCQkJCURGQVN0YXRlIHQgPSByZWFjaChkLCBFT1RMYWJlbCk7CisJCQkJaWYgKCB0LmdldE5GQUNvbmZpZ3VyYXRpb25zKCkuc2l6ZSgpPjAgKSB7CisJCQkJCWNvbnZlcnRUb0VPVEFjY2VwdFN0YXRlKGQpOworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic3RhdGUgIitkKyIgaGFzIEVPVCB0YXJnZXQgIit0LnN0YXRlTnVtYmVyKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQkqLworCisJCWludCBudW1iZXJPZkVkZ2VzRW1hbmF0aW5nID0gMDsKKwkJTWFwIHRhcmdldFRvTGFiZWxNYXAgPSBuZXcgSGFzaE1hcCgpOworCQkvLyBmb3IgZWFjaCBsYWJlbCB0aGF0IGNvdWxkIHBvc3NpYmx5IGVtYW5hdGUgZnJvbSBORkFTdGF0ZXMgb2YgZAorCQlpbnQgbnVtTGFiZWxzID0gMDsKKwkJaWYgKCBsYWJlbHMhPW51bGwgKSB7CisJCQludW1MYWJlbHMgPSBsYWJlbHMuc2l6ZSgpOworCQl9CisJCWZvciAoaW50IGk9MDsgaTxudW1MYWJlbHM7IGkrKykgeworCQkJTGFiZWwgbGFiZWwgPSAoTGFiZWwpbGFiZWxzLmdldChpKTsKKwkJCURGQVN0YXRlIHQgPSByZWFjaChkLCBsYWJlbCk7CisJCQlpZiAoIGRlYnVnICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiREZBIHN0YXRlIGFmdGVyIHJlYWNoICIrbGFiZWwrIiAiK2QrIi0iICsKKwkJCQkJCQkJICAgbGFiZWwudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSsiLT4iK3QpOworCQkJfQorCQkJaWYgKCB0PT1udWxsICkgeworCQkJCS8vIG5vdGhpbmcgd2FzIHJlYWNoZWQgYnkgbGFiZWwgZHVlIHRvIGNvbmZsaWN0IHJlc29sdXRpb24KKwkJCQkvLyBFT1QgYWxzbyBzZWVtcyB0byBiZSBpbiBoZXJlIG9jY2FzaW9uYWxseSBwcm9iYWJseSBkdWUKKwkJCQkvLyB0byBhbiBlbmQtb2YtcnVsZSBzdGF0ZSBzZWVpbmcgaXQgZXZlbiB0aG91Z2ggd2UnbGwgcG9wCisJCQkJLy8gYW4gaW52b2tpbmcgc3RhdGUgb2ZmIHRoZSBzdGF0ZTsgZG9uJ3QgYm90aGVyIHRvIGNvbmZsaWN0CisJCQkJLy8gYXMgdGhpcyBsYWJlbHMgc2V0IGlzIGEgY292ZXJpbmcgYXBwcm94aW1hdGlvbiBvbmx5LgorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImRmYS5rPSIrZGZhLmdldFVzZXJNYXhMb29rYWhlYWQoKSk7CisJCQlpZiAoIHQuZ2V0VW5pcXVlQWx0KCk9PU5GQS5JTlZBTElEX0FMVF9OVU1CRVIgKSB7CisJCQkJLy8gT25seSBjb21wdXRlIGNsb3N1cmUgaWYgYSB1bmlxdWUgYWx0IG51bWJlciBpcyBub3Qga25vd24uCisJCQkJLy8gSWYgYSB1bmlxdWUgYWx0ZXJuYXRpdmUgaXMgbWVudGlvbmVkIGFtb25nIGFsbCBORkEKKwkJCQkvLyBjb25maWd1cmF0aW9ucyB0aGVuIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIG5lZWRpbmcgdG8gbG9vaworCQkJCS8vIGJleW9uZCB0aGlzIHN0YXRlOyBhbHNvIG5vIHBvc3NpYmlsaXR5IG9mIGEgbm9uZGV0ZXJtaW5pc20uCisJCQkJLy8gVGhpcyBvcHRpbWl6YXRpb24gTWF5IDIyLCAyMDA2IGp1c3QgZHJvcHBlZCAtWGludCB0aW1lCisJCQkJLy8gZm9yIGFuYWx5c2lzIG9mIEphdmEgZ3JhbW1hciBmcm9tIDExLjVzIHRvIDJzISAgV293LgorCQkJCWNsb3N1cmUodCk7ICAvLyBhZGQgYW55IE5GQSBzdGF0ZXMgcmVhY2hhYmxlIHZpYSBlcHNpbG9uCisJCQl9CisKKwkJCS8qCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRGQSBzdGF0ZSBhZnRlciBjbG9zdXJlICIrZCsiLSIrCisJCQkJCQkJICAgbGFiZWwudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSsKKwkJCQkJCQkgICAiLT4iK3QpOworCQkJCQkJCSAgICovCisKKwkJCS8vIGFkZCBpZiBub3QgaW4gREZBIHlldCBhbmQgdGhlbiBtYWtlIGQtbGFiZWwtPnQKKwkJCURGQVN0YXRlIHRhcmdldFN0YXRlID0gYWRkREZBU3RhdGVUb1dvcmtMaXN0KHQpOworCisJCQludW1iZXJPZkVkZ2VzRW1hbmF0aW5nICs9CisJCQkJYWRkVHJhbnNpdGlvbihkLCBsYWJlbCwgdGFyZ2V0U3RhdGUsIHRhcmdldFRvTGFiZWxNYXApOworCisJCQkvLyBsb29rYWhlYWQgb2YgdGFyZ2V0IG11c3QgYmUgb25lIGxhcmdlciB0aGFuIGQncyBrCisJCQkvLyBXZSBhcmUgcG9zc2libHkgc2V0dGluZyB0aGUgZGVwdGggb2YgYSBwcmUtZXhpc3Rpbmcgc3RhdGUKKwkJCS8vIHRoYXQgaXMgZXF1YWwgdG8gb25lIHdlIGp1c3QgY29tcHV0ZWQuLi5ub3Qgc3VyZSBpZiB0aGF0J3MKKwkJCS8vIG9rLgorCQkJdGFyZ2V0U3RhdGUuc2V0TG9va2FoZWFkRGVwdGgoZC5nZXRMb29rYWhlYWREZXB0aCgpICsgMSk7CisJCX0KKworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiREZBIGFmdGVyIHJlYWNoIC8gY2xvc3VyZXM6XG4iK2RmYSk7CisJCWlmICggIWQuaXNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzKCkgJiYgbnVtYmVyT2ZFZGdlc0VtYW5hdGluZz09MCApIHsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJkYW5nbGluZyBERkEgc3RhdGUgIitkKyJcbkFmdGVyIHJlYWNoIC8gY2xvc3VyZXM6XG4iK2RmYSk7CisJCQkvLyBUT0RPOiBjYW4gZml4ZWQgbG9va2FoZWFkIGhpdCBhIGRhbmdsaW5nIHN0YXRlIGNhc2U/CisJCQkvLyBUT0RPOiB5ZXMsIHdpdGggbGVmdCByZWN1cnNpb24KKwkJCS8vU3lzdGVtLmVyci5wcmludGxuKCJkYW5nbGluZyBzdGF0ZSBhbHRzOiAiK2QuZ2V0QWx0U2V0KCkpOworCQkJZGZhLnByb2JlLnJlcG9ydERhbmdsaW5nU3RhdGUoZCk7CisJCQkvLyB0dXJuIG9mZiBhbGwgY29uZmlndXJhdGlvbnMgZXhjZXB0IGZvciB0aG9zZSBhc3NvY2lhdGVkIHdpdGgKKwkJCS8vIG1pbiBhbHQgbnVtYmVyOyBzb21lYm9keSBoYXMgdG8gd2luIGVsc2Ugc29tZSBpbnB1dCB3aWxsIG5vdAorCQkJLy8gcHJlZGljdCBhbnkgYWx0LgorCQkJaW50IG1pbkFsdCA9IHJlc29sdmVCeVBpY2tpbmdNaW5BbHQoZCwgbnVsbCk7CisJCQkvLyBmb3JjZSBpdCB0byBiZSBhbiBhY2NlcHQgc3RhdGUKKwkJCS8vIGRvbid0IGNhbGwgY29udmVydFRvQWNjZXB0U3RhdGUoKSB3aGljaCBtZXJnZXMgc3RvcCBzdGF0ZXMuCisJCQkvLyBvdGhlciBzdGF0ZXMgcG9pbnQgYXQgdXM7IGRvbid0IHdhbnQgdGhlbSBwb2ludGluZyB0byBkZWFkIHN0YXRlcworCQkJZC5zZXRBY2NlcHRTdGF0ZSh0cnVlKTsgLy8gbWlnaHQgYmUgYWRkaW5nIG5ldyBhY2NlcHQgc3RhdGUgZm9yIGFsdAorCQkJZGZhLnNldEFjY2VwdFN0YXRlKG1pbkFsdCwgZCk7CisJCQkvL2NvbnZlcnRUb0FjY2VwdFN0YXRlKGQsIG1pbkFsdCk7IC8vIGZvcmNlIGl0IHRvIGJlIGFuIGFjY2VwdCBzdGF0ZQorCQl9CisKKwkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gYWRkIGFueSBzZW1hbnRpYyBwcmVkaWNhdGUgdHJhbnNpdGlvbnMKKwkJLy8gbWlnaHQgaGF2ZSBib3RoIHRva2VuIGFuZCBwcmVkaWNhdGVkIGVkZ2VzIGZyb20gZAorCQlpZiAoIGQuaXNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzKCkgKSB7CisJCQlhZGRQcmVkaWNhdGVUcmFuc2l0aW9ucyhkKTsKKwkJfQorCX0KKworCS8qKiBBZGQgYSB0cmFuc2l0aW9uIGZyb20gc3RhdGUgZCB0byB0YXJnZXRTdGF0ZSB3aXRoIGxhYmVsIGluIG5vcm1hbCBjYXNlLgorCSAqICBpZiBDT0xMQVBTRV9BTExfSU5DSURFTlRfRURHRVMsIGhvd2V2ZXIsIHRyeSB0byBtZXJnZSBhbGwgZWRnZXMgZnJvbQorCSAqICBkIHRvIHRhcmdldFN0YXRlOyB0aGlzIG1lYW5zIG1lcmdpbmcgdGhlaXIgbGFiZWxzLiAgQW5vdGhlciBvcHRpbWl6YXRpb24KKwkgKiAgaXMgdG8gcmVkdWNlIHRvIGEgc2luZ2xlIEVPVCBlZGdlIGFueSBzZXQgb2YgZWRnZXMgZnJvbSBkIHRvIHRhcmdldFN0YXRlCisJICogIHdoZXJlIHRoZXJlIGV4aXN0cyBhbiBFT1Qgc3RhdGUuICBFT1QgaXMgbGlrZSB0aGUgd2lsZGNhcmQgc28gZG9uJ3QKKwkgKiAgYm90aGVyIHRvIHRlc3QgYW55IG90aGVyIGVkZ2VzLiAgRXhhbXBsZToKKwkgKgorCSAqICBOVU1fSU5UCisJICogICAgOiAnMScuLic5JyAoJzAnLi4nOScpKiAoJ2wnfCdMJyk/CisgICAgICogICAgfCAnMCcgKCd4J3wnWCcpICgnMCcuLic5J3wnYScuLidmJ3wnQScuLidGJykrICgnbCd8J0wnKT8KKyAgICAgKiAgICB8ICcwJyAoJzAnLi4nNycpKiAoJ2wnfCdMJyk/CisJICogICAgOworCSAqCisJICogIFRoZSBub3JtYWwgZGVjaXNpb24gdG8gcHJlZGljdCBhbHRzIDEsIDIsIDMgaXM6CisJICoKKwkgKiAgaWYgKCAoaW5wdXQuTEEoMSk+PScxJyAmJiBpbnB1dC5MQSgxKTw9JzknKSApIHsKKyAgICAgKiAgICAgICBhbHQ3PTE7CisgICAgICogIH0KKyAgICAgKiAgZWxzZSBpZiAoIGlucHV0LkxBKDEpPT0nMCcgKSB7CisgICAgICogICAgICBpZiAoIGlucHV0LkxBKDIpPT0nWCd8fGlucHV0LkxBKDIpPT0neCcgKSB7CisgICAgICogICAgICAgICAgYWx0Nz0yOworICAgICAqICAgICAgfQorICAgICAqICAgICAgZWxzZSBpZiAoIChpbnB1dC5MQSgyKT49JzAnICYmIGlucHV0LkxBKDIpPD0nNycpICkgeworICAgICAqICAgICAgICAgICBhbHQ3PTM7CisgICAgICogICAgICB9CisgICAgICogICAgICBlbHNlIGlmICggaW5wdXQuTEEoMik9PSdMJ3x8aW5wdXQuTEEoMik9PSdsJyApIHsKKyAgICAgKiAgICAgICAgICAgYWx0Nz0zOworICAgICAqICAgICAgfQorICAgICAqICAgICAgZWxzZSB7CisgICAgICogICAgICAgICAgIGFsdDc9MzsKKyAgICAgKiAgICAgIH0KKyAgICAgKiAgfQorICAgICAqICBlbHNlIGVycm9yCisJICoKKyAgICAgKiAgQ2xlYXJseSwgYWx0IDMgaXMgcHJlZGljdGVkIHdpdGggZXh0cmEgd29yayBzaW5jZSBpdCB0ZXN0cyAwLi43CisJICogIGFuZCBbbExdIGJlZm9yZSBmaW5hbGx5IHJlYWxpemluZyB0aGF0IGFueSBjaGFyYWN0ZXIgaXMgYWN0dWFsbHkKKwkgKiAgb2sgYXQgaz0yLgorCSAqCisJICogIEEgYmV0dGVyIGRlY2lzaW9uIGlzIGFzIGZvbGxvd3M6CisgICAgICoKKwkgKiAgaWYgKCAoaW5wdXQuTEEoMSk+PScxJyAmJiBpbnB1dC5MQSgxKTw9JzknKSApIHsKKwkgKiAgICAgIGFsdDc9MTsKKwkgKiAgfQorCSAqICBlbHNlIGlmICggaW5wdXQuTEEoMSk9PScwJyApIHsKKwkgKiAgICAgIGlmICggaW5wdXQuTEEoMik9PSdYJ3x8aW5wdXQuTEEoMik9PSd4JyApIHsKKwkgKiAgICAgICAgICBhbHQ3PTI7CisJICogICAgICB9CisJICogICAgICBlbHNlIHsKKwkgKiAgICAgICAgICBhbHQ3PTM7CisJICogICAgICB9CisJICogIH0KKwkgKgorCSAqICBUaGUgREZBIG9yaWdpbmFsbHkgaGFzIDMgZWRnZXMgZ29pbmcgdG8gdGhlIHN0YXRlIHRoZSBwcmVkaWN0cyBhbHQgMywKKwkgKiAgYnV0IHVwb24gc2VlaW5nIHRoZSBFT1QgZWRnZSAodGhlICJlbHNlIi1jbGF1c2UpLCB0aGlzIG1ldGhvZAorCSAqICByZXBsYWNlcyB0aGUgb2xkIG1lcmdlZCBsYWJlbCAod2hpY2ggd291bGQgaGF2ZSAoMC4uN3xsfEwpKSB3aXRoIEVPVC4KKwkgKiAgVGhlIGNvZGUgZ2VuZXJhdG9yIHRoZW4gbGVhdmVzIGFsdCAzIHByZWRpY3RlZCB3aXRoIGEgc2ltcGxlIGVsc2UtCisJICogIGNsYXVzZS4gOikKKwkgKgorCSAqICBUaGUgb25seSB0aW1lIHRoZSBFT1Qgb3B0aW1pemF0aW9uIG1ha2VzIG5vIHNlbnNlIGlzIGluIHRoZSBUb2tlbnMKKwkgKiAgcnVsZS4gIFdlIHdhbnQgRU9UIHRvIHRydWx5IG1lYW4geW91IGhhdmUgbWF0Y2hlZCBhbiBlbnRpcmUgdG9rZW4KKwkgKiAgc28gZG9uJ3QgYm90aGVyIGFjdHVhbGx5IHJld2luZGluZyB0byBleGVjdXRlIHRoYXQgcnVsZSB1bmxlc3MgdGhlcmUKKwkgKiAgYXJlIGFjdGlvbnMgaW4gdGhhdCBydWxlLiAgRm9yIG5vdywgc2luY2UgSSBhbSBub3QgcHJldmVudGluZworCSAqICBiYWNrdHJhY2tpbmcgZnJvbSBUb2tlbnMgcnVsZSwgSSB3aWxsIHNpbXBseSBhbGxvdyB0aGUgb3B0aW1pemF0aW9uLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgaW50IGFkZFRyYW5zaXRpb24oREZBU3RhdGUgZCwKKwkJCQkJCQkJCSAgIExhYmVsIGxhYmVsLAorCQkJCQkJCQkJICAgREZBU3RhdGUgdGFyZ2V0U3RhdGUsCisJCQkJCQkJCQkgICBNYXAgdGFyZ2V0VG9MYWJlbE1hcCkKKwl7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKGQuc3RhdGVOdW1iZXIrIi0iK2xhYmVsLnRvU3RyaW5nKGRmYS5uZmEuZ3JhbW1hcikrIi0+Iit0YXJnZXRTdGF0ZS5zdGF0ZU51bWJlcik7CisJCWludCBuID0gMDsKKwkJaWYgKCBERkFPcHRpbWl6ZXIuQ09MTEFQU0VfQUxMX1BBUkFMTEVMX0VER0VTICkgeworCQkJLy8gdHJhY2sgd2hpY2ggdGFyZ2V0cyB3ZSd2ZSBoaXQKKwkJCUludGVnZXIgdEkgPSBVdGlscy5pbnRlZ2VyKHRhcmdldFN0YXRlLnN0YXRlTnVtYmVyKTsKKwkJCVRyYW5zaXRpb24gb2xkVHJhbnNpdGlvbiA9IChUcmFuc2l0aW9uKXRhcmdldFRvTGFiZWxNYXAuZ2V0KHRJKTsKKwkJCWlmICggb2xkVHJhbnNpdGlvbiE9bnVsbCApIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZXh0cmEgdHJhbnNpdGlvbiB0byAiK3RJKyIgdXBvbiAiK2xhYmVsLnRvU3RyaW5nKGRmYS5uZmEuZ3JhbW1hcikpOworCQkJCS8vIGFscmVhZHkgc2VlbiBzdGF0ZSBkIHRvIHRhcmdldCB0cmFuc2l0aW9uLCBqdXN0IGFkZCBsYWJlbAorCQkJCS8vIHRvIG9sZCBsYWJlbCB1bmxlc3MgRU9UCisJCQkJaWYgKCBsYWJlbC5nZXRBdG9tKCk9PUxhYmVsLkVPVCApIHsKKwkJCQkJLy8gbWVyZ2Ugd2l0aCBFT1QgbWVhbnMgb2xkIGVkZ2UgY2FuIGdvIGF3YXkKKwkJCQkJb2xkVHJhbnNpdGlvbi5sYWJlbCA9IG5ldyBMYWJlbChMYWJlbC5FT1QpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLy8gZG9uJ3QgYWRkIGFueXRoaW5nIHRvIEVPVCwgaXQncyBlc3NlbnRpYWxseSB0aGUgd2lsZGNhcmQKKwkJCQkJaWYgKCBvbGRUcmFuc2l0aW9uLmxhYmVsLmdldEF0b20oKSE9TGFiZWwuRU9UICkgeworCQkJCQkJLy8gb2ssIG5vdCBFT1QsIGFkZCBpbiB0aGlzIGxhYmVsIHRvIG9sZCBsYWJlbAorCQkJCQkJb2xkVHJhbnNpdGlvbi5sYWJlbC5hZGQobGFiZWwpOworCQkJCQl9CisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsYWJlbCB1cGRhdGVkIHRvIGJlICIrb2xkVHJhbnNpdGlvbi5sYWJlbC50b1N0cmluZyhkZmEubmZhLmdyYW1tYXIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBtYWtlIGEgdHJhbnNpdGlvbiBmcm9tIGQgdG8gdCB1cG9uICdhJworCQkJCW4gPSAxOworCQkJCWxhYmVsID0gKExhYmVsKWxhYmVsLmNsb25lKCk7IC8vIGNsb25lIGluIGNhc2Ugd2UgYWx0ZXIgbGF0ZXIKKwkJCQlpbnQgdHJhbnNpdGlvbkluZGV4ID0gZC5hZGRUcmFuc2l0aW9uKHRhcmdldFN0YXRlLCBsYWJlbCk7CisJCQkJVHJhbnNpdGlvbiB0cmFucyA9IGQuZ2V0VHJhbnNpdGlvbih0cmFuc2l0aW9uSW5kZXgpOworCQkJCS8vIHRyYWNrIHRhcmdldC90cmFuc2l0aW9uIHBhaXJzCisJCQkJdGFyZ2V0VG9MYWJlbE1hcC5wdXQodEksIHRyYW5zKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCW4gPSAxOworCQkJZC5hZGRUcmFuc2l0aW9uKHRhcmdldFN0YXRlLCBsYWJlbCk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJLyoqIEZvciBhbGwgTkZBIHN0YXRlcyAoY29uZmlndXJhdGlvbnMpIG1lcmdlZCBpbiBkLAorCSAqICBjb21wdXRlIHRoZSBlcHNpbG9uIGNsb3N1cmU7IHRoYXQgaXMsIGZpbmQgYWxsIE5GQSBzdGF0ZXMgcmVhY2hhYmxlCisJICogIGZyb20gdGhlIE5GQSBzdGF0ZXMgaW4gZCB2aWEgcHVyZWx5IGVwc2lsb24gdHJhbnNpdGlvbnMuCisJICovCisJcHVibGljIHZvaWQgY2xvc3VyZShERkFTdGF0ZSBkKSB7CisJCWlmICggZGVidWcgKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNsb3N1cmUoIitkKyIpIik7CisJCX0KKworCQlMaXN0PE5GQUNvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE5GQUNvbmZpZ3VyYXRpb24+KCk7CisJCS8vIEJlY2F1c2Ugd2UgYXJlIGFkZGluZyB0byB0aGUgY29uZmlndXJhdGlvbnMgaW4gY2xvc3VyZQorCQkvLyBtdXN0IGNsb25lIGluaXRpYWwgbGlzdCBzbyB3ZSBrbm93IHdoZW4gdG8gc3RvcCBkb2luZyBjbG9zdXJlCisJCWNvbmZpZ3MuYWRkQWxsKGQubmZhQ29uZmlndXJhdGlvbnMpOworCQkvLyBmb3IgZWFjaCBORkEgY29uZmlndXJhdGlvbiBpbiBkIChhYm9ydCBpZiB3ZSBkZXRlY3Qgbm9uLUxMKCopIHN0YXRlKQorCQlpbnQgbnVtQ29uZmlncyA9IGNvbmZpZ3Muc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworCQkJTkZBQ29uZmlndXJhdGlvbiBjID0gKE5GQUNvbmZpZ3VyYXRpb24pY29uZmlncy5nZXQoaSk7CisJCQlpZiAoIGMuc2luZ2xlQXRvbVRyYW5zaXRpb25FbWFuYXRpbmcgKSB7CisJCQkJY29udGludWU7IC8vIGlnbm9yZSBORkEgc3RhdGVzIHcvbyBlcHNpbG9uIHRyYW5zaXRpb25zCisJCQl9CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ28gZG8gcmVhY2ggZm9yIE5GQSBzdGF0ZSAiK2Muc3RhdGUpOworCQkJLy8gZmlndXJlIG91dCByZWFjaGFibGUgTkZBIHN0YXRlcyBmcm9tIGVhY2ggb2YgZCdzIG5mYSBzdGF0ZXMKKwkJCS8vIHZpYSBlcHNpbG9uIHRyYW5zaXRpb25zLgorCQkJLy8gRmlsbCBjb25maWdzSW5DbG9zdXJlIHJhdGhlciB0aGFuIGFsdGVyaW5nIGQgY29uZmlncyBpbmxpbmUKKwkJCWNsb3N1cmUoZGZhLm5mYS5nZXRTdGF0ZShjLnN0YXRlKSwKKwkJCQkJYy5hbHQsCisJCQkJCWMuY29udGV4dCwKKwkJCQkJYy5zZW1hbnRpY0NvbnRleHQsCisJCQkJCWQsCisJCQkJCWZhbHNlKTsKKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWZ0ZXIgY2xvc3VyZSBkPSIrZCk7CisJCWQuY2xvc3VyZUJ1c3kgPSBudWxsOyAvLyB3YWNrIGFsbCB0aGF0IG1lbW9yeSB1c2VkIGR1cmluZyBjbG9zdXJlCisJfQorCisJLyoqIFdoZXJlIGNhbiB3ZSBnZXQgZnJvbSBORkEgc3RhdGUgcCB0cmF2ZXJzaW5nIG9ubHkgZXBzaWxvbiB0cmFuc2l0aW9ucz8KKwkgKiAgQWRkIG5ldyBORkEgc3RhdGVzICsgY29udGV4dCB0byBERkEgc3RhdGUgZC4gIEFsc28gYWRkIHNlbWFudGljCisJICogIHByZWRpY2F0ZXMgdG8gc2VtYW50aWMgY29udGV4dCBpZiBjb2xsZWN0UHJlZGljYXRlcyBpcyBzZXQuICBXZSBvbmx5CisJICogIGNvbGxlY3QgcHJlZGljYXRlcyBhdCBob2lzdGluZyBkZXB0aCAwLCBtZWFuaW5nIGJlZm9yZSBhbnkgdG9rZW4vY2hhcgorCSAqICBoYXZlIGJlZW4gcmVjb2duaXplZC4gIFRoaXMgY29ycmVzcG9uZHMsIGR1cmluZyBhbmFseXNpcywgdG8gdGhlCisJICogIGluaXRpYWwgREZBIHN0YXJ0IHN0YXRlIGNvbnN0cnVjdGlvbiBjbG9zdXJlKCkgaW52b2NhdGlvbi4KKwkgKgorCSAqICBUaGVyZSBhcmUgZm91ciBjYXNlcyBvZiBpbnRlcmVzdCAodGhlIGxhc3QgYmVpbmcgdGhlIHVzdWFsIHRyYW5zaXRpb24pOgorCSAqCisJICogICAxLiBUcmF2ZXJzZSBhbiBlZGdlIHRoYXQgdGFrZXMgdXMgdG8gdGhlIHN0YXJ0IHN0YXRlIG9mIGFub3RoZXIKKwkgKiAgICAgIHJ1bGUsIHIuICBXZSBtdXN0IHB1c2ggdGhpcyBzdGF0ZSBzbyB0aGF0IGlmIHRoZSBERkEKKwkgKiAgICAgIGNvbnZlcnNpb24gaGl0cyB0aGUgZW5kIG9mIHJ1bGUgciwgdGhlbiBpdCBrbm93cyB0byBjb250aW51ZQorCSAqICAgICAgdGhlIGNvbnZlcnNpb24gYXQgc3RhdGUgZm9sbG93aW5nIHN0YXRlIHRoYXQgImludm9rZWQiIHIuIEJ5CisJICogICAgICBjb25zdHJ1Y3Rpb24sIHRoZXJlIGlzIGEgc2luZ2xlIHRyYW5zaXRpb24gZW1hbmF0aW5nIGZyb20gYSBydWxlCisJICogICAgICByZWYgbm9kZS4KKwkgKgorCSAqICAgMi4gUmVhY2ggYW4gTkZBIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIG9mIGEgcnVsZSwgciwgaW4gdGhlCisJICogICAgICBncmFtbWFyIGZyb20gd2hpY2ggaXQgd2FzIGJ1aWx0LiAgV2UgbXVzdCBhZGQgYW4gaW1wbGljaXQgKGkuZS4sCisJICogICAgICBkb24ndCBhY3R1YWxseSBhZGQgYW4gZXBzaWxvbiB0cmFuc2l0aW9uKSBlcHNpbG9uIHRyYW5zaXRpb24KKwkgKiAgICAgIGZyb20gcidzIGVuZCBzdGF0ZSB0byB0aGUgTkZBIHN0YXRlIGZvbGxvd2luZyB0aGUgTkZBIHN0YXRlCisJICogICAgICB0aGF0IHRyYW5zaXRpb25lZCB0byBydWxlIHIncyBzdGFydCBzdGF0ZS4gIEJlY2F1c2UgdGhlcmUgYXJlCisJICogICAgICBtYW55IHN0YXRlcyB0aGF0IGNvdWxkIHJlYWNoIHIsIHRoZSBjb250ZXh0IGZvciBhIHJ1bGUgaW52b2NhdGlvbgorCSAqICAgICAgaXMgcGFydCBvZiBhIGNhbGwgdHJlZSBub3QgYSBzaW1wbGUgc3RhY2suICBXaGVuIHdlIGZhbGwgb2ZmIGVuZAorCSAqICAgICAgb2YgcnVsZSwgInBvcCIgYSBzdGF0ZSBvZmYgdGhlIGNhbGwgdHJlZSBhbmQgYWRkIHRoYXQgc3RhdGUncworCSAqICAgICAgImZvbGxvd2luZyIgbm9kZSB0byBkJ3MgTkZBIGNvbmZpZ3VyYXRpb24gbGlzdC4gIFRoZSBjb250ZXh0CisJICogICAgICBmb3IgdGhpcyBuZXcgYWRkaXRpb24gd2lsbCBiZSB0aGUgbmV3ICJzdGFjayB0b3AiIGluIHRoZSBjYWxsIHRyZWUuCisJICoKKwkgKiAgIDMuIExpa2UgY2FzZSAyLCB3ZSByZWFjaCBhbiBORkEgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgb2YgYQorCSAqICAgICAgcnVsZSwgciwgaW4gdGhlIGdyYW1tYXIgZnJvbSB3aGljaCBORkEgd2FzIGJ1aWx0LiAgSW4gdGhpcyBjYXNlLAorCSAqICAgICAgaG93ZXZlciwgd2UgcmVhbGl6ZSB0aGF0IGR1cmluZyB0aGlzIE5GQS0+REZBIGNvbnZlcnNpb24sIG5vIHN0YXRlCisJICogICAgICBpbnZva2VkIHRoZSBjdXJyZW50IHJ1bGUncyBORkEuICBUaGVyZSBpcyBubyBjaG9pY2UgYnV0IHRvIGFkZAorCSAqICAgICAgYWxsIE5GQSBzdGF0ZXMgdGhhdCBmb2xsb3cgcmVmZXJlbmNlcyB0byByJ3Mgc3RhcnQgc3RhdGUuICBUaGlzIGlzCisJICogICAgICBhbmFsb2dvdXMgdG8gY29tcHV0aW5nIHRoZSBGT0xMT1cocikgaW4gdGhlIExMKGspIHdvcmxkLiAgQnkKKwkgKiAgICAgIGNvbnN0cnVjdGlvbiwgZXZlbiBydWxlIHN0b3Agc3RhdGUgaGFzIGEgY2hhaW4gb2Ygbm9kZXMgZW1hbmF0aW5nCisJICogICAgICBmcm9tIGl0IHRoYXQgcG9pbnRzIHRvIGV2ZXJ5IHBvc3NpYmxlIGZvbGxvd2luZyBub2RlLiAgVGhpcyBjYXNlCisJICogICAgICBpcyBjb252ZW5pZW50bHkgaGFuZGxlZCB0aGVuIGJ5IHRoZSA0dGggY2FzZS4KKwkgKgorCSAqICAgNC4gTm9ybWFsIGNhc2UuICBJZiBwIGNhbiByZWFjaCBhbm90aGVyIE5GQSBzdGF0ZSBxLCB0aGVuIGFkZAorCSAqICAgICAgcSB0byBkJ3MgY29uZmlndXJhdGlvbiBsaXN0LCBjb3B5aW5nIHAncyBjb250ZXh0IGZvciBxJ3MgY29udGV4dC4KKwkgKiAgICAgIElmIHRoZXJlIGlzIGEgc2VtYW50aWMgcHJlZGljYXRlIG9uIHRoZSB0cmFuc2l0aW9uLCB0aGVuIEFORCBpdAorCSAqICAgICAgd2l0aCBhbnkgZXhpc3Rpbmcgc2VtYW50aWMgY29udGV4dC4KKwkgKgorCSAqICAgQ3VycmVudCBzdGF0ZSBwIGlzIGFsd2F5cyBhZGRlZCB0byBkJ3MgY29uZmlndXJhdGlvbiBsaXN0IGFzIGl0J3MgcGFydAorCSAqICAgb2YgdGhlIGNsb3N1cmUgYXMgd2VsbC4KKwkgKgorCSAqICBXaGVuIGlzIGEgY2xvc3VyZSBvcGVyYXRpb24gaW4gYSBjeWNsZSBjb25kaXRpb24/ICBXaGlsZSBpdCBpcworCSAqICB2ZXJ5IHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUgTkZBIHN0YXRlIG1lbnRpb25lZCB0d2ljZQorCSAqICB3aXRoaW4gdGhlIHNhbWUgREZBIHN0YXRlLCB0aGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgdGhhdAorCSAqICB3b3VsZCBsZWFkIHRvIG5vbnRlcm1pbmF0aW9uIG9mIGNsb3N1cmUgb3BlcmF0aW9uOgorCSAqCisJICogIG8gICBXaGVuZXZlciBjbG9zdXJlIHJlYWNoZXMgYSBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSBzYW1lIHN0YXRlCisJICogICAgICB3aXRoIHNhbWUgb3IgYSBzdWZmaXggY29udGV4dCBhbHJlYWR5IGV4aXN0cy4gIFRoaXMgY2F0Y2hlcworCSAqICAgICAgdGhlIElGLVRIRU4tRUxTRSB0YWlsIHJlY3Vyc2lvbiBjeWNsZSBhbmQgdGhpbmdzIGxpa2UKKwkgKgorCSAqICAgICAgYSA6IEEgYSB8IEIgOworCSAqCisJICogICAgICB0aGUgY29udGV4dCB3aWxsIGJlICQgKGVtcHR5IHN0YWNrKS4KKwkgKgorCSAqICAgICAgV2UgaGF2ZSB0byBjaGVjaworCSAqICAgICAgbGFyZ2VyIGNvbnRleHQgc3RhY2tzIGJlY2F1c2Ugb2YgKC4uLikrIGxvb3BzLiAgRm9yCisJICogICAgICBleGFtcGxlLCB0aGUgY29udGV4dCBvZiBhICguLi4pKyBjYW4gYmUgbm9uZW1wdHkgaWYgdGhlCisJICogICAgICBzdXJyb3VuZGluZyBydWxlIGlzIGludm9rZWQgYnkgYW5vdGhlciBydWxlOgorCSAqCisJICogICAgICBhIDogYiBBIHwgWCA7CisJICogICAgICBiIDogKEJ8KSsgOyAgLy8gbm9uZGV0ZXJtaW5pc3RpYyBieSB0aGUgd2F5CisJICoKKwkgKiAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSAoQnwpKyBsb29wIGlzICJpbnZva2VkIGZyb20gaXRlbQorCSAqICAgICAgYSA6IC4gYiBBIDsiIGFuZCB0aGVuIHRoZSBlbXB0eSBhbHQgb2YgdGhlIGxvb3AgY2FuIHJlYWNoIGJhY2sKKwkgKiAgICAgIHRvIGl0c2VsZi4gIFRoZSBjb250ZXh0IHN0YWNrIHdpbGwgaGF2ZSBvbmUgInJldHVybgorCSAqICAgICAgYWRkcmVzcyIgZWxlbWVudCBhbmQgc28gd2UgbXVzdCBjaGVjayBmb3Igc2FtZSBzdGF0ZSwgc2FtZQorCSAqICAgICAgY29udGV4dCBmb3IgYXJiaXRyYXJ5IGNvbnRleHQgc3RhY2tzLgorCSAqCisJICogICAgICBJZGVhOiBJZiB3ZSd2ZSBzZWVuIHRoaXMgY29uZmlndXJhdGlvbiBiZWZvcmUgZHVyaW5nIGNsb3N1cmUsIHN0b3AuCisJICogICAgICBXZSBhbHNvIG5lZWQgdG8gYXZvaWQgcmVhY2hpbmcgc2FtZSBzdGF0ZSB3aXRoIGNvbmZsaWN0aW5nIGNvbnRleHQuCisJICogICAgICBVbHRpbWF0ZWx5IGFuYWx5c2lzIHdvdWxkIHN0b3AgYW5kIHdlJ2QgZmluZCB0aGUgY29uZmxpY3QsIGJ1dCB3ZQorCSAqICAgICAgc2hvdWxkIHN0b3AgdGhlIGNvbXB1dGF0aW9uLiAgUHJldmlvdXNseSBJIG9ubHkgY2hlY2tlZCBmb3IKKwkgKiAgICAgIGV4YWN0IGNvbmZpZy4gIE5lZWQgdG8gY2hlY2sgZm9yIHNhbWUgc3RhdGUsIHN1ZmZpeCBjb250ZXh0CisJICogCQlub3QganVzdCBleGFjdCBjb250ZXh0LgorCSAqCisJICogIG8gICBXaGVuZXZlciBjbG9zdXJlIHJlYWNoZXMgYSBjb25maWd1cmF0aW9uIHdoZXJlIHN0YXRlIHAKKwkgKiAgICAgIGlzIHByZXNlbnQgaW4gaXRzIG93biBjb250ZXh0IHN0YWNrLiAgVGhpcyBtZWFucyB0aGF0CisJICogICAgICBwIGlzIGEgcnVsZSBpbnZvY2F0aW9uIHN0YXRlIGFuZCB0aGUgdGFyZ2V0IHJ1bGUgaGFzCisJICogICAgICBiZWVuIGNhbGxlZCBiZWZvcmUuICBORkFDb250ZXh0Lk1BWF9SRUNVUlNJVkVfSU5WT0NBVElPTlMKKwkgKiAgICAgIChTZWUgdGhlIGNvbW1lbnQgdGhlcmUgYWxzbykgZGV0ZXJtaW5lcyBob3cgbWFueSB0aW1lcworCSAqICAgICAgaXQncyBwb3NzaWJsZSB0byByZWN1cnNlOyBjbGVhcmx5IHdlIGNhbm5vdCByZWN1cnNlIGZvcmV2ZXIuCisJICogICAgICBTb21lIGdyYW1tYXJzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBhY3R1YWxseSByZXF1aXJlIGF0CisJICogICAgICBsZWFzdCBvbmUgcmVjdXJzaXZlIGNhbGwgdG8gY29ycmVjdGx5IGNvbXB1dGUgdGhlIGxvb2thaGVhZDoKKwkgKgorCSAqICAgICAgYSA6IEwgSUQgUgorCSAqICAgICAgICB8IGIKKwkgKiAgICAgICAgOworCSAqICAgICAgYiA6IElECisJICogICAgICAgIHwgTCBhIFIKKwkgKiAgICAgICAgOworCSAqCisJICogICAgICBJbnB1dCBMIElEIFIgaXMgYW1iaWd1b3VzIGJ1dCB0byBmaWd1cmUgdGhpcyBvdXQsIEFOVExSCisJICogICAgICBuZWVkcyB0byBnbyBhLT5iLT5hLT5iIHRvIGZpbmQgdGhlIEwgSUQgc2VxdWVuY2UuCisJICoKKwkgKiAgICAgIERvIG5vdCBhbGxvdyBjbG9zdXJlIHRvIGFkZCBhIGNvbmZpZ3VyYXRpb24gdGhhdCB3b3VsZAorCSAqICAgICAgYWxsb3cgdG9vIG11Y2ggcmVjdXJzaW9uLgorCSAqCisJICogICAgICBUaGlzIGNhc2UgYWxzbyBjYXRjaGVzIGluZmluaXRlIGxlZnQgcmVjdXJzaW9uLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3N1cmUoTkZBU3RhdGUgcCwKKwkJCQkJCWludCBhbHQsCisJCQkJCQlORkFDb250ZXh0IGNvbnRleHQsCisJCQkJCQlTZW1hbnRpY0NvbnRleHQgc2VtYW50aWNDb250ZXh0LAorCQkJCQkJREZBU3RhdGUgZCwKKwkJCQkJCWJvb2xlYW4gY29sbGVjdFByZWRpY2F0ZXMpCisJeworCQlpZiAoIGRlYnVnICl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNsb3N1cmUgYXQgIitwLmVuY2xvc2luZ1J1bGUubmFtZSsiIHN0YXRlICIrcC5zdGF0ZU51bWJlcisifCIrCisJCQkJCQkJICAgYWx0KyIgZmlsbGluZyBERkEgc3RhdGUgIitkLnN0YXRlTnVtYmVyKyIgd2l0aCBjb250ZXh0ICIrY29udGV4dAorCQkJCQkJCSAgICk7CisJCX0KKworLy8JCWlmICggREZBLk1BWF9USU1FX1BFUl9ERkFfQ1JFQVRJT04+MCAmJgorLy8JCQkgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkLmRmYS5jb252ZXJzaW9uU3RhcnRUaW1lID49CisvLwkJCSBERkEuTUFYX1RJTUVfUEVSX0RGQV9DUkVBVElPTiApCisvLwkJeworLy8JCQkvLyBiYWlsIHdheSBvdXQ7IHdlJ3ZlIGJsb3duIHVwIHNvbWVob3cKKy8vCQkJdGhyb3cgbmV3IEFuYWx5c2lzVGltZW91dEV4Y2VwdGlvbihkLmRmYSk7CisvLwkJfQorCisJCU5GQUNvbmZpZ3VyYXRpb24gcHJvcG9zZWRORkFDb25maWd1cmF0aW9uID0KKwkJCQluZXcgTkZBQ29uZmlndXJhdGlvbihwLnN0YXRlTnVtYmVyLAorCQkJCQkJYWx0LAorCQkJCQkJY29udGV4dCwKKwkJCQkJCXNlbWFudGljQ29udGV4dCk7CisKKwkJLy8gQXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uCisJCWlmICggY2xvc3VyZUlzQnVzeShkLCBwcm9wb3NlZE5GQUNvbmZpZ3VyYXRpb24pICkgeworCQkJaWYgKCBkZWJ1ZyApIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImF2b2lkIHZpc2l0aW5nIGV4YWN0IGNsb3N1cmUgY29tcHV0YXRpb24gTkZBIGNvbmZpZzogIisKKwkJCQkJCQkJICAgcHJvcG9zZWRORkFDb25maWd1cmF0aW9uKyIgaW4gIitwLmVuY2xvc2luZ1J1bGUubmFtZSk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdGF0ZSBpcyAiK2QuZGZhLmRlY2lzaW9uTnVtYmVyKyIuIitkLnN0YXRlTnVtYmVyKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCS8vIHNldCBjbG9zdXJlIHRvIGJlIGJ1c3kgZm9yIHRoaXMgTkZBIGNvbmZpZ3VyYXRpb24KKwkJZC5jbG9zdXJlQnVzeS5hZGQocHJvcG9zZWRORkFDb25maWd1cmF0aW9uKTsKKworCQkvLyBwIGl0c2VsZiBpcyBhbHdheXMgaW4gY2xvc3VyZQorCQlkLmFkZE5GQUNvbmZpZ3VyYXRpb24ocCwgcHJvcG9zZWRORkFDb25maWd1cmF0aW9uKTsKKworCQkvLyBDYXNlIDE6IGFyZSB3ZSBhIHJlZmVyZW5jZSB0byBhbm90aGVyIHJ1bGU/CisJCVRyYW5zaXRpb24gdHJhbnNpdGlvbjAgPSBwLnRyYW5zaXRpb25bMF07CisJCWlmICggdHJhbnNpdGlvbjAgaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24gKSB7CisJCQlpbnQgZGVwdGggPSBjb250ZXh0LnJlY3Vyc2lvbkRlcHRoRW1hbmF0aW5nRnJvbVN0YXRlKHAuc3RhdGVOdW1iZXIpOworCQkJLy8gRGV0ZWN0IHJlY3Vyc2lvbiBieSBtb3JlIHRoYW4gYSBzaW5nbGUgYWx0LCB3aGljaCBpbmRpY2F0ZXMKKwkJCS8vIHRoYXQgdGhlIGRlY2lzaW9uJ3MgbG9va2FoZWFkIGxhbmd1YWdlIGlzIHBvdGVudGlhbGx5IG5vbi1yZWd1bGFyOyB0ZXJtaW5hdGUKKwkJCWlmICggZGVwdGggPT0gMSAmJiBkLmRmYS5nZXRVc2VyTWF4TG9va2FoZWFkKCk9PTAgKSB7IC8vIGs9KiBvbmx5CisJCQkJZC5kZmEucmVjdXJzaXZlQWx0U2V0LmFkZChhbHQpOyAvLyBpbmRpY2F0ZSB0aGF0IHRoaXMgYWx0IGlzIHJlY3Vyc2l2ZQorCQkJCWlmICggZC5kZmEucmVjdXJzaXZlQWx0U2V0LnNpemUoKT4xICkgeworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicmVjdXJzaXZlIGFsdHM6ICIrZC5kZmEucmVjdXJzaXZlQWx0U2V0LnRvU3RyaW5nKCkpOworCQkJCQlkLmFib3J0ZWREdWVUb011bHRpcGxlUmVjdXJzaXZlQWx0cyA9IHRydWU7CisJCQkJCXRocm93IG5ldyBOb25MTFN0YXJEZWNpc2lvbkV4Y2VwdGlvbihkLmRmYSk7CisJCQkJfQorCQkJCS8qCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhbHQgIithbHQrIiBpbiBydWxlICIrcC5lbmNsb3NpbmdSdWxlKyIgZGVjICIrZC5kZmEuZGVjaXNpb25OdW1iZXIrCisJCQkJCSIgY3R4OiAiK2NvbnRleHQpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZD0iK2QpOworCQkJCSovCisJCQl9CisJCQkvLyBEZXRlY3QgYW4gYXR0ZW1wdCB0byByZWN1cnNlIHRvbyBoaWdoCisJCQkvLyBpZiB0aGlzIGNvbnRleHQgaGFzIGhpdCB0aGUgbWF4IHJlY3Vyc2lvbnMgZm9yIHAuc3RhdGVOdW1iZXIsCisJCQkvLyBkb24ndCBhbGxvdyBpdCB0byBlbnRlciBwLnN0YXRlTnVtYmVyIGFnYWluCisJCQlpZiAoIGRlcHRoID49IE5GQUNvbnRleHQuTUFYX1NBTUVfUlVMRV9JTlZPQ0FUSU9OU19QRVJfTkZBX0NPTkZJR19TVEFDSyApIHsKKwkJCQkvKgorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT1ZGIHN0YXRlICIrZCk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm9wb3NlZCAiK3Byb3Bvc2VkTkZBQ29uZmlndXJhdGlvbik7CisJCQkJKi8KKwkJCQlkLmFib3J0ZWREdWVUb1JlY3Vyc2lvbk92ZXJmbG93ID0gdHJ1ZTsKKwkJCQlkLmRmYS5wcm9iZS5yZXBvcnRSZWN1cnNpb25PdmVyZmxvdyhkLCBwcm9wb3NlZE5GQUNvbmZpZ3VyYXRpb24pOworCQkJCWlmICggZGVidWcgKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYW5hbHlzaXMgb3ZlcmZsb3cgaW4gY2xvc3VyZSgiK2Quc3RhdGVOdW1iZXIrIikiKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBvdGhlcndpc2UsIGl0J3MgY29vbCB0byAocmUpZW50ZXIgdGFyZ2V0IG9mIHRoaXMgcnVsZSByZWYKKwkJCVJ1bGVDbG9zdXJlVHJhbnNpdGlvbiByZWYgPSAoUnVsZUNsb3N1cmVUcmFuc2l0aW9uKXRyYW5zaXRpb24wOworCQkJLy8gZmlyc3QgY3JlYXRlIGEgbmV3IGNvbnRleHQgYW5kIHB1c2ggb250byBjYWxsIHRyZWUsCisJCQkvLyByZWNvcmRpbmcgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgaW52b2tpbmcgYSBydWxlIGFuZAorCQkJLy8gZnJvbSB3aGljaCBzdGF0ZSAoY2FzZSAyIGJlbG93IHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgc3RhdGUKKwkJCS8vIHZpYSB0aGUgUnVsZUNsb3N1cmVUcmFuc2l0aW9uIGVtYW5hdGluZyBmcm9tIHRoZSBpbnZva2luZyBzdGF0ZQorCQkJLy8gcHVzaGVkIG9uIHRoZSBzdGFjaykuCisJCQkvLyBSZXNldCB0aGUgY29udGV4dCB0byByZWZsZWN0IHRoZSBmYWN0IHdlIGludm9rZWQgcnVsZQorCQkJTkZBQ29udGV4dCBuZXdDb250ZXh0ID0gbmV3IE5GQUNvbnRleHQoY29udGV4dCwgcCk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaW52b2tpbmcgcnVsZSAiK3JlZi5ydWxlLm5hbWUpOworCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29udGV4dD0iK2NvbnRleHQpOworCQkJLy8gdHJhdmVyc2UgZXBzaWxvbiBlZGdlIHRvIG5ldyBydWxlCisJCQlORkFTdGF0ZSBydWxlVGFyZ2V0ID0gKE5GQVN0YXRlKXJlZi50YXJnZXQ7CisJCQljbG9zdXJlKHJ1bGVUYXJnZXQsIGFsdCwgbmV3Q29udGV4dCwgc2VtYW50aWNDb250ZXh0LCBkLCBjb2xsZWN0UHJlZGljYXRlcyk7CisJCX0KKwkJLy8gQ2FzZSAyOiBlbmQgb2YgcnVsZSBzdGF0ZSwgY29udGV4dCAoaS5lLiwgYW4gaW52b2tlcikgZXhpc3RzCisJCWVsc2UgaWYgKCBwLmlzQWNjZXB0U3RhdGUoKSAmJiBjb250ZXh0LnBhcmVudCE9bnVsbCApIHsKKwkJCU5GQVN0YXRlIHdoaWNoU3RhdGVJbnZva2VkUnVsZSA9IGNvbnRleHQuaW52b2tpbmdTdGF0ZTsKKwkJCVJ1bGVDbG9zdXJlVHJhbnNpdGlvbiBlZGdlVG9SdWxlID0KKwkJCQkoUnVsZUNsb3N1cmVUcmFuc2l0aW9uKXdoaWNoU3RhdGVJbnZva2VkUnVsZS50cmFuc2l0aW9uWzBdOworCQkJTkZBU3RhdGUgY29udGludWVTdGF0ZSA9IGVkZ2VUb1J1bGUuZm9sbG93U3RhdGU7CisJCQlORkFDb250ZXh0IG5ld0NvbnRleHQgPSBjb250ZXh0LnBhcmVudDsgLy8gInBvcCIgaW52b2tpbmcgc3RhdGUKKwkJCWNsb3N1cmUoY29udGludWVTdGF0ZSwgYWx0LCBuZXdDb250ZXh0LCBzZW1hbnRpY0NvbnRleHQsIGQsIGNvbGxlY3RQcmVkaWNhdGVzKTsKKwkJfQorCQkvLyBDYXNlIDM6IGVuZCBvZiBydWxlIHN0YXRlLCBub2JvZHkgaW52b2tlZCB0aGlzIHJ1bGUgKG5vIGNvbnRleHQpCisJCS8vICAgIEZhbGwgdGhydSB0byBiZSBoYW5kbGVkIGJ5IGNhc2UgNCBhdXRvbWFnaWNhbGx5LgorCQkvLyBDYXNlIDQ6IG9yZGluYXJ5IE5GQS0+REZBIGNvbnZlcnNpb24gY2FzZTogc2ltcGxlIGVwc2lsb24gdHJhbnNpdGlvbgorCQllbHNlIHsKKwkJCS8vIHJlY3Vyc2UgZG93biBhbnkgZXBzaWxvbiB0cmFuc2l0aW9ucworCQkJaWYgKCB0cmFuc2l0aW9uMCE9bnVsbCAmJiB0cmFuc2l0aW9uMC5pc0Vwc2lsb24oKSApIHsKKwkJCQlib29sZWFuIGNvbGxlY3RQcmVkaWNhdGVzQWZ0ZXJBY3Rpb24gPSBjb2xsZWN0UHJlZGljYXRlczsKKwkJCQlpZiAoIHRyYW5zaXRpb24wLmlzQWN0aW9uKCkgJiYgY29sbGVjdFByZWRpY2F0ZXMgKSB7CisJCQkJCWNvbGxlY3RQcmVkaWNhdGVzQWZ0ZXJBY3Rpb24gPSBmYWxzZTsKKwkJCQkJLyoKKwkJCQkJaWYgKCBjb21wdXRpbmdTdGFydFN0YXRlICkgeworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBhY3Rpb24gZHVyaW5nIHByZWRpY3Rpb24gY2xvc3VyZSAiKygoQWN0aW9uTGFiZWwpdHJhbnNpdGlvbjAubGFiZWwpLmFjdGlvbkFTVC50b2tlbik7CisJCQkJCX0KKwkJCQkJICovCisJCQkJfQorCQkJCWNsb3N1cmUoKE5GQVN0YXRlKXRyYW5zaXRpb24wLnRhcmdldCwKKwkJCQkJCWFsdCwKKwkJCQkJCWNvbnRleHQsCisJCQkJCQlzZW1hbnRpY0NvbnRleHQsCisJCQkJCQlkLAorCQkJCQkJY29sbGVjdFByZWRpY2F0ZXNBZnRlckFjdGlvbgorCQkJCSk7CisJCQl9CisJCQllbHNlIGlmICggdHJhbnNpdGlvbjAhPW51bGwgJiYgdHJhbnNpdGlvbjAuaXNTZW1hbnRpY1ByZWRpY2F0ZSgpICkgeworICAgICAgICAgICAgICAgIFNlbWFudGljQ29udGV4dCBsYWJlbENvbnRleHQgPSB0cmFuc2l0aW9uMC5sYWJlbC5nZXRTZW1hbnRpY0NvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIGNvbXB1dGluZ1N0YXJ0U3RhdGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggY29sbGVjdFByZWRpY2F0ZXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGluZGljYXRlIHdlIGNhbiBzZWUgYSBwcmVkaWNhdGUgaWYgd2UncmUgY29sbGVjdGluZyBwcmVkcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ291bGQgYmUgY29tcHV0aW5nIHN0YXJ0IHN0YXRlICYgc2VlbiBhbiBhY3Rpb24gYmVmb3JlIHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAgICBkZmEucHJlZGljYXRlVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YXRlIGhhcyBhIHByZWQsIGJ1dCB3ZSBjYW4ndCBzZWUgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBkZmEuaGFzUHJlZGljYXRlQmxvY2tlZEJ5QWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcHJlZCBkdXJpbmcgcHJlZGljdGlvbiBidXQgYmxvY2tlZCBieSBhY3Rpb24gZm91bmQgcHJldmlvdXNseSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGNsb3N1cmUgaGVyZSB0b28sIGJ1dCBhZGQgdGhlIHNlbSBwcmVkIHRvIGN0eAorICAgICAgICAgICAgICAgIFNlbWFudGljQ29udGV4dCBuZXdTZW1hbnRpY0NvbnRleHQgPSBzZW1hbnRpY0NvbnRleHQ7CisgICAgICAgICAgICAgICAgaWYgKCBjb2xsZWN0UHJlZGljYXRlcyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQU5EIHRoZSBwcmV2aW91cyBzZW1hbnRpYyBjb250ZXh0IHdpdGggbmV3IHByZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGhvaXN0IHN5biBwcmVkcyBmcm9tIG90aGVyIHJ1bGVzOyBvbmx5IGdldCBpZiBpbgorICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyBzdGF0ZSdzIHJ1bGUgKGkuZS4sIGNvbnRleHQgaXMgZW1wdHkpCisgICAgICAgICAgICAgICAgICAgIGludCB3YWxrQWx0ID0KKwkJCQkJCWRmYS5kZWNpc2lvbk5GQVN0YXJ0U3RhdGUudHJhbnNsYXRlRGlzcGxheUFsdFRvV2Fsa0FsdChhbHQpOworCQkJCQlORkFTdGF0ZSBhbHRMZWZ0RWRnZSA9CisJCQkJCQlkZmEubmZhLmdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKGRmYS5kZWNpc2lvbk5GQVN0YXJ0U3RhdGUsd2Fsa0FsdCk7CisJCQkJCS8qCisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhdGUgIitwLnN0YXRlTnVtYmVyKyIgYWx0ICIrYWx0KyIgd2Fsa0FsdCAiK3dhbGtBbHQrIiB0cmFucyB0byAiK3RyYW5zaXRpb24wLnRhcmdldCk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiREZBIHN0YXJ0IHN0YXRlICIrZGZhLmRlY2lzaW9uTkZBU3RhcnRTdGF0ZS5zdGF0ZU51bWJlcik7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWx0IGxlZnQgZWRnZSAiK2FsdExlZnRFZGdlLnN0YXRlTnVtYmVyKworCQkJCQkJIiwgZXBzaWxvbiB0YXJnZXQgIisKKwkJCQkJCWFsdExlZnRFZGdlLnRyYW5zaXRpb24oMCkudGFyZ2V0LnN0YXRlTnVtYmVyKTsKKwkJCQkJKi8KKwkJCQkJaWYgKCAhbGFiZWxDb250ZXh0LmlzU3ludGFjdGljUHJlZGljYXRlKCkgfHwKKwkJCQkJCSBwPT1hbHRMZWZ0RWRnZS50cmFuc2l0aW9uWzBdLnRhcmdldCApCisJCQkJCXsKKwkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCImIitsYWJlbENvbnRleHQrIiBlbmNsb3NpbmdSdWxlPSIrcC5lbmNsb3NpbmdSdWxlKTsKKwkJCQkJCW5ld1NlbWFudGljQ29udGV4dCA9CisJCQkJCQkJU2VtYW50aWNDb250ZXh0LmFuZChzZW1hbnRpY0NvbnRleHQsIGxhYmVsQ29udGV4dCk7CisJCQkJCX0KKwkJCQl9CisJCQkJY2xvc3VyZSgoTkZBU3RhdGUpdHJhbnNpdGlvbjAudGFyZ2V0LAorCQkJCQkJYWx0LAorCQkJCQkJY29udGV4dCwKKwkJCQkJCW5ld1NlbWFudGljQ29udGV4dCwKKwkJCQkJCWQsCisJCQkJCQljb2xsZWN0UHJlZGljYXRlcyk7CisJCQl9CisJCQlUcmFuc2l0aW9uIHRyYW5zaXRpb24xID0gcC50cmFuc2l0aW9uWzFdOworCQkJaWYgKCB0cmFuc2l0aW9uMSE9bnVsbCAmJiB0cmFuc2l0aW9uMS5pc0Vwc2lsb24oKSApIHsKKwkJCQljbG9zdXJlKChORkFTdGF0ZSl0cmFuc2l0aW9uMS50YXJnZXQsCisJCQkJCQlhbHQsCisJCQkJCQljb250ZXh0LAorCQkJCQkJc2VtYW50aWNDb250ZXh0LAorCQkJCQkJZCwKKwkJCQkJCWNvbGxlY3RQcmVkaWNhdGVzKTsKKwkJCX0KKwkJfQorCisJCS8vIGRvbid0IHJlbW92ZSAiYnVzeSIgZmxhZyBhcyB3ZSB3YW50IHRvIHByZXZlbnQgYWxsCisJCS8vIHJlZmVyZW5jZXMgdG8gc2FtZSBjb25maWcgb2Ygc3RhdGV8YWx0fGN0eHxzZW1DdHggZXZlbgorCQkvLyBpZiByZXN1bHRpbmcgZnJvbSBhbm90aGVyIE5GQSBzdGF0ZQorCX0KKworCS8qKiBBIGNsb3N1cmUgb3BlcmF0aW9uIHNob3VsZCBhYm9ydCBpZiB0aGF0IGNvbXB1dGF0aW9uIGhhcyBhbHJlYWR5CisJICogIGJlZW4gZG9uZSBvciBhIGNvbXB1dGF0aW9uIHdpdGggYSBjb25mbGljdGluZyBjb250ZXh0IGhhcyBhbHJlYWR5CisJICogIGJlZW4gZG9uZS4gIElmIHByb3Bvc2VkIE5GQSBjb25maWcncyBzdGF0ZSBhbmQgYWx0IGFyZSB0aGUgc2FtZQorCSAqICB0aGVyZSBpcyBwb3RlbnRpYWxseSBhIHByb2JsZW0uICBJZiB0aGUgc3RhY2sgY29udGV4dCBpcyBpZGVudGljYWwKKwkgKiAgdGhlbiBjbGVhcmx5IHRoZSBleGFjdCBzYW1lIGNvbXB1dGF0aW9uIGlzIHByb3Bvc2VkLiAgSWYgYSBjb250ZXh0CisJICogIGlzIGEgc3VmZml4IG9mIHRoZSBvdGhlciwgdGhlbiBhZ2FpbiB0aGUgY29tcHV0YXRpb24gaXMgaW4gYW4KKwkgKiAgaWRlbnRpY2FsIGNvbnRleHQuICA/JCBhbmQgPz8kIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIHN0YWNrLgorCSAqICBXZSBjb3VsZCB3YWxrIGNvbmZpZ3VyYXRpb25zIGxpbmVhcmx5IGRvaW5nIHRoZSBjb21wYXJpc29uIGluc3RlYWQKKwkgKiAgb2YgYSBzZXQgZm9yIGV4YWN0IG1hdGNoZXMgYnV0IGl0J3MgbXVjaCBzbG93ZXIgYmVjYXVzZSB5b3UgY2FuJ3QKKwkgKiAgZG8gYSBTZXQgbG9va3VwLiAgSSB1c2UgZXhhY3QgbWF0Y2ggYXMgQU5UTFIKKwkgKiAgYWx3YXlzIGRldGVjdCB0aGUgY29uZmxpY3QgbGF0ZXIgd2hlbiBjaGVja2luZyBmb3IgY29udGV4dCBzdWZmaXhlcy4uLgorCSAqICBJIGNoZWNrIGZvciBsZWZ0LXJlY3Vyc2l2ZSBzdHVmZiBhbmQgdGVybWluYXRlIGJlZm9yZSBhbmFseXNpcyB0bworCSAqICBhdm9pZCBuZWVkIHRvIGRvIHRoaXMgbW9yZSBleHBlbnNpdmUgY29tcHV0YXRpb24uCisJICoKKwkgKiAgMTItMzEtMjAwNzogSSBoYWQgdG8gdXNlIHRoZSBsb29wIGFnYWluIHJhdGhlciB0aGFuIHNpbXBsZQorCSAqICBjbG9zdXJlQnVzeS5jb250YWlucyhwcm9wb3NlZE5GQUNvbmZpZ3VyYXRpb24pIGxvb2t1cC4gIFRoZQorCSAqICBzZW1hbnRpYyBjb250ZXh0IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCB3aGVuIGRldGVybWluaW5nIGlmCisJICogIGEgY2xvc3VyZSBvcGVyYXRpb24gaXMgYnVzeS4gIEkgc2F3IGEgRk9MTE9XIGNsb3N1cmUgb3BlcmF0aW9uCisJICogIHNwaW4gdW50aWwgdGltZSBvdXQgYmVjYXVzZSB0aGUgcHJlZGljYXRlIGNvbnRleHQga2VwdCBpbmNyZWFzaW5nCisJICogIGluIHNpemUgZXZlbiB0aG91Z2ggaXQncyBzYW1lIGJvb2xlYW4gdmFsdWUuICBUaGlzIHNlZW1zIGZhc3RlciBhbHNvCisJICogIGJlY2F1c2UgSSdtIG5vdCBkb2luZyBTdHJpbmcuZXF1YWxzIG9uIHRoZSBwcmVkcyBhbGwgdGhlIHRpbWUuCisJICoKKwkgKiAgMDUtMDUtMjAwODogSG1tLi4ud2VsbCwgaSB0aGluayBpdCB3YXMgYSBtaXN0YWtlIHRvIHJlbW92ZSB0aGUgc2VtCisJICogIGN0eCBjaGVjayBiZWxvdy4uLmFkZGluZyBiYWNrIGluLiAgQ29pbmNpZGVzIHdpdGggcmVwb3J0IG9mIEFOVExSCisJICogIGdldHRpbmcgc3VwZXIgc2xvdzogaHR0cDovL3d3dy5hbnRsci5vcmc6ODg4OC9icm93c2UvQU5UTFItMjM1CisJICogIFRoaXMgY291bGQgYmUgYmVjYXVzZSBpdCBkb2Vzbid0IHByb3Blcmx5IGNvbXB1dGUgdGhlbiByZXNvbHZlCisJICogIGEgcHJlZGljYXRlIGV4cHJlc3Npb24uICBTZWVtcyB0byBmaXggdW5pdCB0ZXN0OgorCSAqICBUZXN0U2VtYW50aWNQcmVkaWNhdGVzLnRlc3RTZW1hbnRpY0NvbnRleHRQcmV2ZW50c0Vhcmx5VGVybWluYXRpb25PZkNsb3N1cmUoKQorCSAqICBDaGFuZ2luZyBiYWNrIHRvIFNldCBmcm9tIExpc3QuICBDaGFuZ2VkIGEgbGFyZ2UgZ3JhbW1hciBmcm9tIDggbWludXRlcworCSAqICB0byAxMSBzZWNvbmRzLiAgQ29vbC4gIENsb3NpbmcgQU5UTFItMjM1LgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbG9zdXJlSXNCdXN5KERGQVN0YXRlIGQsCisJCQkJCQkJCQkJTkZBQ29uZmlndXJhdGlvbiBwcm9wb3NlZE5GQUNvbmZpZ3VyYXRpb24pCisJeworCQlyZXR1cm4gZC5jbG9zdXJlQnVzeS5jb250YWlucyhwcm9wb3NlZE5GQUNvbmZpZ3VyYXRpb24pOworLyoKKwkJaW50IG51bUNvbmZpZ3MgPSBkLmNsb3N1cmVCdXN5LnNpemUoKTsKKwkJLy8gQ2hlY2sgZXBzaWxvbiBjeWNsZSAoc2FtZSBzdGF0ZSwgc2FtZSBhbHQsIHNhbWUgY29udGV4dCkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCU5GQUNvbmZpZ3VyYXRpb24gYyA9IChORkFDb25maWd1cmF0aW9uKSBkLmNsb3N1cmVCdXN5LmdldChpKTsKKwkJCWlmICggcHJvcG9zZWRORkFDb25maWd1cmF0aW9uLnN0YXRlPT1jLnN0YXRlICYmCisJCQkJIHByb3Bvc2VkTkZBQ29uZmlndXJhdGlvbi5hbHQ9PWMuYWx0ICYmCisJCQkJIHByb3Bvc2VkTkZBQ29uZmlndXJhdGlvbi5zZW1hbnRpY0NvbnRleHQuZXF1YWxzKGMuc2VtYW50aWNDb250ZXh0KSAmJgorCQkJCSBwcm9wb3NlZE5GQUNvbmZpZ3VyYXRpb24uY29udGV4dC5zdWZmaXgoYy5jb250ZXh0KSApCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCQkqLworCX0KKworCS8qKiBHaXZlbiB0aGUgc2V0IG9mIE5GQSBzdGF0ZXMgaW4gREZBIHN0YXRlIGQsIGZpbmQgYWxsIE5GQSBzdGF0ZXMKKwkgKiAgcmVhY2hhYmxlIHRyYXZlcnNpbmcgbGFiZWwgYXJjcy4gIEJ5IGRlZmluaXRpb24sIHRoZXJlIGNhbiBiZQorCSAqICBvbmx5IG9uZSBERkEgc3RhdGUgcmVhY2hhYmxlIGJ5IGFuIGF0b20gZnJvbSBERkEgc3RhdGUgZCBzbyB3ZSBtdXN0CisJICogIGZpbmQgYW5kIG1lcmdlIGFsbCBORkEgc3RhdGVzIHJlYWNoYWJsZSB2aWEgbGFiZWwuICBSZXR1cm4gYSBuZXcKKwkgKiAgREZBU3RhdGUgdGhhdCBoYXMgYWxsIG9mIHRob3NlIE5GQSBzdGF0ZXMgd2l0aCB0aGVpciBjb250ZXh0IChpLmUuLAorCSAqICB3aGljaCBhbHQgZG8gdGhleSBwcmVkaWN0IGFuZCB3aGVyZSB0byByZXR1cm4gdG8gaWYgdGhleSBmYWxsIG9mZgorCSAqICBlbmQgb2YgYSBydWxlKS4KKwkgKgorCSAqICBCZWNhdXNlIHdlIGNhbm5vdCBqdW1wIHRvIGFub3RoZXIgcnVsZSBub3IgZmFsbCBvZmYgdGhlIGVuZCBvZiBhIHJ1bGUKKwkgKiAgdmlhIGEgbm9uLWVwc2lsb24gdHJhbnNpdGlvbiwgTkZBIHN0YXRlcyByZWFjaGFibGUgZnJvbSBkIGhhdmUgdGhlCisJICogIHNhbWUgY29uZmlndXJhdGlvbiBhcyB0aGUgTkZBIHN0YXRlIGluIGQuICBTbyBpZiBORkEgc3RhdGUgNyBpbiBkJ3MKKwkgKiAgY29uZmlndXJhdGlvbnMgY2FuIHJlYWNoIE5GQSBzdGF0ZSAxMyB0aGVuIDEzIHdpbGwgYmUgYWRkZWQgdG8gdGhlCisJICogIG5ldyBERkFTdGF0ZSAobGFiZWxERkFUYXJnZXQpIHdpdGggdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBzdGF0ZQorCSAqICA3IGhhZC4KKwkgKgorCSAqICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzZWUgRU9UIHRyYW5zaXRpb25zIG9mZiB0aGUgZW5kIG9mIHRva2VuIHJ1bGUKKwkgKiAgYWNjZXB0IHN0YXRlcyBpZiB0aGUgcnVsZSB3YXMgaW52b2tlZCBieSBzb21lYm9keS4KKwkgKi8KKwlwdWJsaWMgREZBU3RhdGUgcmVhY2goREZBU3RhdGUgZCwgTGFiZWwgbGFiZWwpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJlYWNoICIrbGFiZWwudG9TdHJpbmcoZGZhLm5mYS5ncmFtbWFyKSsiIGZyb20gIitkLnN0YXRlTnVtYmVyKTsKKwkJREZBU3RhdGUgbGFiZWxERkFUYXJnZXQgPSBkZmEubmV3U3RhdGUoKTsKKworCQkvLyBmb3IgZWFjaCBORkEgc3RhdGUgaW4gZCB3aXRoIGEgbGFiZWxlZCBlZGdlLAorCQkvLyBhZGQgaW4gdGFyZ2V0IHN0YXRlcyBmb3IgbGFiZWwKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNpemUoZC5zdGF0ZT0iK2Quc3RhdGVOdW1iZXIrIik9IitkLm5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKSk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzaXplKGxhYmVsZWQgZWRnZSBzdGF0ZXMpPSIrZC5jb25maWd1cmF0aW9uc1dpdGhMYWJlbGVkRWRnZXMuc2l6ZSgpKTsKKwkJTGlzdDxORkFDb25maWd1cmF0aW9uPiBjb25maWdzID0gZC5jb25maWd1cmF0aW9uc1dpdGhMYWJlbGVkRWRnZXM7CisJCWludCBudW1Db25maWdzID0gY29uZmlncy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisJCQlORkFDb25maWd1cmF0aW9uIGMgPSBjb25maWdzLmdldChpKTsKKwkJCWlmICggYy5yZXNvbHZlZCB8fCBjLnJlc29sdmVXaXRoUHJlZGljYXRlICkgeworCQkJCWNvbnRpbnVlOyAvLyB0aGUgY29uZmxpY3QgcmVzb2x2ZXIgaW5kaWNhdGVzIHdlIG11c3QgbGVhdmUgYWxvbmUKKwkJCX0KKwkJCU5GQVN0YXRlIHAgPSBkZmEubmZhLmdldFN0YXRlKGMuc3RhdGUpOworCQkJLy8gYnkgZGVzaWduIG9mIHRoZSBncmFtbWFyLT5ORkEgY29udmVyc2lvbiwgb25seSB0cmFuc2l0aW9uIDAKKwkJCS8vIG1heSBoYXZlIGEgbm9uLWVwc2lsb24gZWRnZS4KKwkJCVRyYW5zaXRpb24gZWRnZSA9IHAudHJhbnNpdGlvblswXTsKKwkJCWlmICggZWRnZT09bnVsbCB8fCAhYy5zaW5nbGVBdG9tVHJhbnNpdGlvbkVtYW5hdGluZyApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUxhYmVsIGVkZ2VMYWJlbCA9IGVkZ2UubGFiZWw7CisKKwkJCS8vIFNQRUNJQUwgQ0FTRQorCQkJLy8gaWYgaXQncyBhbiBFT1QgdHJhbnNpdGlvbiBvbiBlbmQgb2YgbGV4ZXIgcnVsZSwgYnV0IGNvbnRleHQKKwkJCS8vIHN0YWNrIGlzIG5vdCBlbXB0eSwgdGhlbiBkb24ndCBzZWUgdGhlIEVPVDsgdGhlIGNsb3N1cmUKKwkJCS8vIHdpbGwgaGF2ZSBhZGRlZCBpbiB0aGUgcHJvcGVyIHN0YXRlcyBmb2xsb3dpbmcgdGhlIHJlZmVyZW5jZQorCQkJLy8gdG8gdGhpcyBydWxlIGluIHRoZSBpbnZva2luZyBydWxlLiAgSW4gb3RoZXIgd29yZHMsIGlmCisJCQkvLyBzb21lYm9keSBjYWxsZWQgdGhpcyBydWxlLCBkb24ndCBzZWUgdGhlIEVPVCBlbWFuYXRpbmcgZnJvbQorCQkJLy8gdGhpcyBhY2NlcHQgc3RhdGUuCisJCQlpZiAoIGMuY29udGV4dC5wYXJlbnQhPW51bGwgJiYgZWRnZUxhYmVsLmxhYmVsPT1MYWJlbC5FT1QgKQl7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIExhYmVscyBub3QgdW5pcXVlIGF0IHRoaXMgcG9pbnQgKG5vdCB1bnRpbCBhZGRSZWFjaGFibGVMYWJlbHMpCisJCQkvLyBzbyB0cnkgc2ltcGxlIGludCBsYWJlbCBtYXRjaCBiZWZvcmUgZ2VuZXJhbCBzZXQgaW50ZXJzZWN0aW9uCisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY29tcGFyaW5nICIrZWRnZUxhYmVsKyIgd2l0aCAiK2xhYmVsKTsKKwkJCWlmICggTGFiZWwuaW50ZXJzZWN0KGxhYmVsLCBlZGdlTGFiZWwpICkgeworCQkJCS8vIGZvdW5kIGEgdHJhbnNpdGlvbiB3aXRoIGxhYmVsOworCQkJCS8vIGFkZCBORkEgdGFyZ2V0IHRvIChwb3RlbnRpYWxseSkgbmV3IERGQSBzdGF0ZQorCQkJCU5GQUNvbmZpZ3VyYXRpb24gbmV3QyA9IGxhYmVsREZBVGFyZ2V0LmFkZE5GQUNvbmZpZ3VyYXRpb24oCisJCQkJCShORkFTdGF0ZSllZGdlLnRhcmdldCwKKwkJCQkJYy5hbHQsCisJCQkJCWMuY29udGV4dCwKKwkJCQkJYy5zZW1hbnRpY0NvbnRleHQpOworCQkJfQorCQl9CisJCWlmICggbGFiZWxERkFUYXJnZXQubmZhQ29uZmlndXJhdGlvbnMuc2l6ZSgpPT0wICkgeworCQkJLy8ga2lsbDsgaXQncyBlbXB0eQorCQkJZGZhLnNldFN0YXRlKGxhYmVsREZBVGFyZ2V0LnN0YXRlTnVtYmVyLCBudWxsKTsKKwkJCWxhYmVsREZBVGFyZ2V0ID0gbnVsbDsKKwkJfQorICAgICAgICByZXR1cm4gbGFiZWxERkFUYXJnZXQ7CisJfQorCisJLyoqIFdhbGsgdGhlIGNvbmZpZ3VyYXRpb25zIG9mIHRoaXMgREZBIHN0YXRlIGQgbG9va2luZyBmb3IgdGhlCisJICogIGNvbmZpZ3VyYXRpb24sIGMsIHRoYXQgaGFzIGEgdHJhbnNpdGlvbiBvbiBFT1QuICBTdGF0ZSBkIHNob3VsZAorCSAqICBiZSBjb252ZXJ0ZWQgdG8gYW4gYWNjZXB0IHN0YXRlIHByZWRpY3RpbmcgdGhlIGMuYWx0LiAgQmxhc3QKKwkgKiAgZCdzIGN1cnJlbnQgY29uZmlndXJhdGlvbiBzZXQgYW5kIG1ha2UgaXQganVzdCBoYXZlIGNvbmZpZyBjLgorCSAqCisJICogIFRPRE86IGNhbiB0aGVyZSBiZSBtb3JlIHRoYW4gb25lIGNvbmZpZyB3aXRoIEVPVCB0cmFuc2l0aW9uPworCSAqICBUaGF0IHdvdWxkIG1lYW4gdGhhdCB0d28gTkZBIGNvbmZpZ3VyYXRpb25zIGNvdWxkIHJlYWNoIHRoZQorCSAqICBlbmQgb2YgdGhlIHRva2VuIHdpdGggcG9zc2libHkgZGlmZmVyZW50IHByZWRpY3RlZCBhbHRzLgorCSAqICBTZWVtcyBsaWtlIHRoYXQgd291bGQgYmUgcmFyZSBvciBpbXBvc3NpYmxlLiAgUGVyaGFwcyBjb252ZXJ0CisJICogIHRoaXMgcm91dGluZSB0byBmaW5kIGFsbCBzdWNoIGNvbmZpZ3MgYW5kIGdpdmUgZXJyb3IgaWYgPjEuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29udmVydFRvRU9UQWNjZXB0U3RhdGUoREZBU3RhdGUgZCkgeworCQlMYWJlbCBlb3QgPSBuZXcgTGFiZWwoTGFiZWwuRU9UKTsKKwkJaW50IG51bUNvbmZpZ3MgPSBkLm5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCU5GQUNvbmZpZ3VyYXRpb24gYyA9IChORkFDb25maWd1cmF0aW9uKWQubmZhQ29uZmlndXJhdGlvbnMuZ2V0KGkpOworCQkJaWYgKCBjLnJlc29sdmVkIHx8IGMucmVzb2x2ZVdpdGhQcmVkaWNhdGUgKSB7CisJCQkJY29udGludWU7IC8vIHRoZSBjb25mbGljdCByZXNvbHZlciBpbmRpY2F0ZXMgd2UgbXVzdCBsZWF2ZSBhbG9uZQorCQkJfQorCQkJTkZBU3RhdGUgcCA9IGRmYS5uZmEuZ2V0U3RhdGUoYy5zdGF0ZSk7CisJCQlUcmFuc2l0aW9uIGVkZ2UgPSBwLnRyYW5zaXRpb25bMF07CisJCQlMYWJlbCBlZGdlTGFiZWwgPSBlZGdlLmxhYmVsOworCQkJaWYgKCBlZGdlTGFiZWwuZXF1YWxzKGVvdCkgKSB7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZyB3aXRoIEVPVDogIitjKTsKKwkJCQlkLnNldEFjY2VwdFN0YXRlKHRydWUpOworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJkIGdvZXMgZnJvbSAiK2QpOworCQkJCWQubmZhQ29uZmlndXJhdGlvbnMuY2xlYXIoKTsKKwkJCQlkLmFkZE5GQUNvbmZpZ3VyYXRpb24ocCxjLmFsdCxjLmNvbnRleHQsYy5zZW1hbnRpY0NvbnRleHQpOworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ0byAiK2QpOworCQkJCXJldHVybjsgLy8gYXNzdW1lIG9ubHkgb25lIEVPVCB0cmFuc2l0aW9uCisJCQl9CisJCX0KKwl9CisKKwkvKiogQWRkIGEgbmV3IERGQSBzdGF0ZSB0byB0aGUgREZBIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCisgICAgICogIElmIHRoZSBERkEgc3RhdGUgdW5pcXVlbHkgcHJlZGljdHMgYSBzaW5nbGUgYWx0ZXJuYXRpdmUsIGl0CisgICAgICogIGJlY29tZXMgYSBzdG9wIHN0YXRlOyBkb24ndCBhZGQgdG8gd29yayBsaXN0LiAgRnVydGhlciwgaWYKKyAgICAgKiAgdGhlcmUgZXhpc3RzIGFuIE5GQSBzdGF0ZSBwcmVkaWN0ZWQgYnkgPiAxIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMKKyAgICAgKiAgYW5kIHdpdGggdGhlIHNhbWUgc3luIGFuZCBzZW0gY29udGV4dCwgdGhlIERGQSBpcyBub25kZXRlcm1pbmlzdGljIGZvcgorICAgICAqICBhdCBsZWFzdCBvbmUgaW5wdXQgc2VxdWVuY2UgcmVhY2hpbmcgdGhhdCBORkEgc3RhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIERGQVN0YXRlIGFkZERGQVN0YXRlVG9Xb3JrTGlzdChERkFTdGF0ZSBkKSB7CisgICAgICAgIERGQVN0YXRlIGV4aXN0aW5nU3RhdGUgPSBkZmEuYWRkU3RhdGUoZCk7CisJCWlmICggZCAhPSBleGlzdGluZ1N0YXRlICkgeworCQkJLy8gYWxyZWFkeSB0aGVyZS4uLnVzZS9yZXR1cm4gdGhlIGV4aXN0aW5nIERGQSBzdGF0ZS4KKwkJCS8vIEJ1dCBhbHNvIHNldCB0aGUgc3RhdGVzW2Quc3RhdGVOdW1iZXJdIHRvIHRoZSBleGlzdGluZworCQkJLy8gREZBIHN0YXRlIGJlY2F1c2UgdGhlIGNsb3N1cmVJc0J1c3kgbXVzdCByZXBvcnQKKwkJCS8vIGluZmluaXRlIHJlY3Vyc2lvbiBvbiBhIHN0YXRlIGJlZm9yZSBpdCBrbm93cworCQkJLy8gd2hldGhlciBvciBub3QgdGhlIHN0YXRlIHdpbGwgYWxyZWFkeSBiZQorCQkJLy8gZm91bmQgYWZ0ZXIgY2xvc3VyZSBvbiBpdCBmaW5pc2hlcy4gIEl0IGNvdWxkIGJlCisJCQkvLyByZWZlcnJpbmcgdG8gYSBzdGF0ZSB0aGF0IHdpbGwgdWx0aW1hdGVseSBub3QgbWFrZSBpdAorCQkJLy8gaW50byB0aGUgcmVhY2hhYmxlIHN0YXRlIHNwYWNlIGFuZCB0aGUgZXJyb3IKKwkJCS8vIHJlcG9ydGluZyBtdXN0IGJlIGFibGUgdG8gY29tcHV0ZSB0aGUgcGF0aCBmcm9tCisJCQkvLyBzdGFydCB0byB0aGUgZXJyb3Igc3RhdGUgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24KKwkJCWRmYS5zZXRTdGF0ZShkLnN0YXRlTnVtYmVyLCBleGlzdGluZ1N0YXRlKTsKKwkJCXJldHVybiBleGlzdGluZ1N0YXRlOworCQl9CisKKwkJLy8gaWYgbm90IHRoZXJlLCB0aGVuIGV4YW1pbmUgbmV3IHN0YXRlLgorCisJCS8vIHJlc29sdmUgc3ludGFjdGljIGNvbmZsaWN0cyBieSBjaG9vc2luZyBhIHNpbmdsZSBhbHQgb3IKKyAgICAgICAgLy8gYnkgdXNpbmcgc2VtYW50aWMgcHJlZGljYXRlcyBpZiBwcmVzZW50LgorICAgICAgICByZXNvbHZlTm9uRGV0ZXJtaW5pc21zKGQpOworCisgICAgICAgIC8vIElmIGRldGVybWluaXN0aWMsIGRvbid0IGFkZCB0aGlzIHN0YXRlOyBpdCdzIGFuIGFjY2VwdCBzdGF0ZQorICAgICAgICAvLyBKdXN0IHJldHVybiBhcyBhIHZhbGlkIERGQSBzdGF0ZQorCQlpbnQgYWx0ID0gZC5nZXRVbmlxdWVseVByZWRpY3RlZEFsdCgpOworCQlpZiAoIGFsdCE9TkZBLklOVkFMSURfQUxUX05VTUJFUiApIHsgLy8gdW5pcXVlbHkgcHJlZGljdHMgYW4gYWx0PworCQkJZCA9IGNvbnZlcnRUb0FjY2VwdFN0YXRlKGQsIGFsdCk7CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKCJjb252ZXJ0IHRvIGFjY2VwdDsgREZBICIrZC5kZmEuZGVjaXNpb25OdW1iZXIrIiBzdGF0ZSAiK2Quc3RhdGVOdW1iZXIrIiB1bmlxdWVseSBwcmVkaWN0cyBhbHQgIisKKwkJCQlkLmdldFVuaXF1ZWx5UHJlZGljdGVkQWx0KCkpOworCQkJCSovCisJCX0KKwkJZWxzZSB7CisgICAgICAgICAgICAvLyB1bnJlc29sdmVkLCBhZGQgdG8gd29yayBsaXN0IHRvIGNvbnRpbnVlIE5GQSBjb252ZXJzaW9uCisgICAgICAgICAgICB3b3JrLmFkZChkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisKKwlwcm90ZWN0ZWQgREZBU3RhdGUgY29udmVydFRvQWNjZXB0U3RhdGUoREZBU3RhdGUgZCwgaW50IGFsdCkgeworCQkvLyBvbmx5IG1lcmdlIHN0b3Agc3RhdGVzIGlmIHRoZXkgYXJlIGRldGVybWluaXN0aWMgYW5kIG5vCisJCS8vIHJlY3Vyc2lvbiBwcm9ibGVtcyBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgZ2F0ZWQgcHJlZAorCQkvLyBjb250ZXh0IQorCQkvLyBMYXRlciwgdGhlIGVycm9yIHJlcG9ydGluZyBtYXkgd2FudCB0byB0cmFjZSB0aGUgcGF0aCBmcm9tCisJCS8vIHRoZSBzdGFydCBzdGF0ZSB0byB0aGUgbm9uZGV0IHN0YXRlCisJCWlmICggREZBT3B0aW1pemVyLk1FUkdFX1NUT1BfU1RBVEVTICYmCisJCQlkLmdldE5vbkRldGVybWluaXN0aWNBbHRzKCk9PW51bGwgJiYKKwkJCSFkLmFib3J0ZWREdWVUb1JlY3Vyc2lvbk92ZXJmbG93ICYmCisJCQkhZC5hYm9ydGVkRHVlVG9NdWx0aXBsZVJlY3Vyc2l2ZUFsdHMgKQorCQl7CisJCQkvLyBjaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFjY2VwdCBzdGF0ZSBmb3IgdGhpcyBhbHQKKwkJCS8vIFttdXN0IGRvIHRoaXMgYWZ0ZXIgd2UgcmVzb2x2ZSBub25kZXRlcm1pbmlzbXMgaW4gZ2VuZXJhbF0KKwkJCURGQVN0YXRlIGFjY2VwdFN0YXRlRm9yQWx0ID0gZGZhLmdldEFjY2VwdFN0YXRlKGFsdCk7CisJCQlpZiAoIGFjY2VwdFN0YXRlRm9yQWx0IT1udWxsICkgeworCQkJCS8vIHdlIGFscmVhZHkgaGF2ZSBhbiBhY2NlcHQgc3RhdGUgZm9yIGFsdDsKKwkJCQkvLyBBcmUgdGhlaXIgZ2F0ZSBzZW0gcHJlZCBjb250ZXh0cyB0aGUgc2FtZT8KKwkJCQkvLyBGb3Igbm93IHdlIGFzc3VtZSBhIGJyYWluZGVhZCB2ZXJzaW9uOiBib3RoIG11c3Qgbm90CisJCQkJLy8gaGF2ZSBnYXRlZCBwcmVkcyBvciBzaGFyZSBleGFjdGx5IHNhbWUgc2luZ2xlIGdhdGVkIHByZWQuCisJCQkJLy8gVGhlIGVxdWFscygpIG1ldGhvZCBpcyBvbmx5IGRlZmluZWQgb24gUHJlZGljYXRlIGNvbnRleHRzIG5vdAorCQkJCS8vIE9SIGV0Yy4uLgorCQkJCVNlbWFudGljQ29udGV4dCBnYXRlZFByZWRzID0gZC5nZXRHYXRlZFByZWRpY2F0ZXNJbk5GQUNvbmZpZ3VyYXRpb25zKCk7CisJCQkJU2VtYW50aWNDb250ZXh0IGV4aXN0aW5nU3RhdGVHYXRlZFByZWRzID0KKwkJCQkJYWNjZXB0U3RhdGVGb3JBbHQuZ2V0R2F0ZWRQcmVkaWNhdGVzSW5ORkFDb25maWd1cmF0aW9ucygpOworCQkJCWlmICggKGdhdGVkUHJlZHM9PW51bGwgJiYgZXhpc3RpbmdTdGF0ZUdhdGVkUHJlZHM9PW51bGwpIHx8CisJCQkJICAgICAoKGdhdGVkUHJlZHMhPW51bGwgJiYgZXhpc3RpbmdTdGF0ZUdhdGVkUHJlZHMhPW51bGwpICYmCisJCQkJCSAgZ2F0ZWRQcmVkcy5lcXVhbHMoZXhpc3RpbmdTdGF0ZUdhdGVkUHJlZHMpKSApCisJCQkJeworCQkJCQkvLyBtYWtlIHRoaXMgZC5zdGF0ZW51bWJlciBwb2ludCBhdCBvbGQgREZBIHN0YXRlCisJCQkJCWRmYS5zZXRTdGF0ZShkLnN0YXRlTnVtYmVyLCBhY2NlcHRTdGF0ZUZvckFsdCk7CisJCQkJCWRmYS5yZW1vdmVTdGF0ZShkKTsgICAgLy8gcmVtb3ZlIHRoaXMgc3RhdGUgZnJvbSB1bmlxdWUgREZBIHN0YXRlIHNldAorCQkJCQlkID0gYWNjZXB0U3RhdGVGb3JBbHQ7IC8vIHVzZSBvbGQgYWNjZXB0IHN0YXRlOyB0aHJvdyB0aGlzIG9uZSBvdXQKKwkJCQkJcmV0dXJuIGQ7CisJCQkJfQorCQkJCS8vIGVsc2UgY29uc2lkZXIgaXQgYSBuZXcgYWNjZXB0IHN0YXRlOyBmYWxsIHRocm91Z2guCisJCQl9CisJCX0KKwkJZC5zZXRBY2NlcHRTdGF0ZSh0cnVlKTsgLy8gbmV3IGFjY2VwdCBzdGF0ZSBmb3IgYWx0CisJCWRmYS5zZXRBY2NlcHRTdGF0ZShhbHQsIGQpOworCQlyZXR1cm4gZDsKKwl9CisKKwkvKiogSWYgPiAxIE5GQSBjb25maWd1cmF0aW9ucyB3aXRoaW4gdGhpcyBERkEgc3RhdGUgaGF2ZSBpZGVudGljYWwKKwkgKiAgTkZBIHN0YXRlIGFuZCBjb250ZXh0LCBidXQgZGlmZmVyIGluIHRoZWlyIHByZWRpY3RlZAorCSAqICBUT0RPIHVwZGF0ZSBmb3IgbmV3IGNvbnRleHQgc3VmZml4IHN0dWZmIDMtOS0yMDA1CisJICogIGFsdGVybmF0aXZlIHRoZW4gYSBzaW5nbGUgaW5wdXQgc2VxdWVuY2UgcHJlZGljdHMgbXVsdGlwbGUgYWx0cy4KKwkgKiAgVGhlIE5GQSBkZWNpc2lvbiBpcyB0aGVyZWZvcmUgc3ludGFjdGljYWxseSBpbmRpc3Rpbmd1aXNoYWJsZQorCSAqICBmcm9tIHRoZSBsZWZ0IGVkZ2UgdXBvbiBhdCBsZWFzdCBvbmUgaW5wdXQgc2VxdWVuY2UuICBXZSBtYXkKKwkgKiAgdGVybWluYXRlIHRoZSBORkEgdG8gREZBIGNvbnZlcnNpb24gZm9yIHRoZXNlIHBhdGhzIHNpbmNlIG5vCisJICogIHBhdGhzIGVtYW5hdGluZyBmcm9tIHRob3NlIE5GQSBzdGF0ZXMgY2FuIHBvc3NpYmx5IHNlcGFyYXRlCisJICogIHRoZXNlIGNvbmpvaW5lZCB0d2lucyBvbmNlIGludGVyd2luZWQgdG8gbWFrZSB0aGluZ3MKKwkgKiAgZGV0ZXJtaW5pc3RpYyAodW5sZXNzIHRoZXJlIGFyZSBzZW1hbnRpYyBwcmVkaWNhdGVzOyBzZWUgYmVsb3cpLgorCSAqCisJICogIFVwb24gYSBub25kZXRlcm1pbmlzdGljIHNldCBvZiBORkEgY29uZmlndXJhdGlvbnMsIHdlIHNob3VsZAorCSAqICByZXBvcnQgYSBwcm9ibGVtIHRvIHRoZSBncmFtbWFyIGRlc2lnbmVyIGFuZCByZXNvbHZlIHRoZSBpc3N1ZQorCSAqICBieSBhcmliaXRyYXJpbHkgcGlja2luZyB0aGUgZmlyc3QgYWx0ZXJuYXRpdmUgKHRoaXMgdXN1YWxseQorCSAqICBlbmRzIHVwIHByb2R1Y2luZyB0aGUgbW9zdCBuYXR1cmFsIGJlaGF2aW9yKS4gIFBpY2sgdGhlIGxvd2VzdAorCSAqICBhbHQgbnVtYmVyIGFuZCBqdXN0IHR1cm4gb2ZmIGFsbCBORkEgY29uZmlndXJhdGlvbnMKKwkgKiAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdGhlciBhbHRzLiBSYXRoZXIgdGhhbiByZW1vdmUgY29uZmxpY3RpbmcKKwkgKiAgTkZBIGNvbmZpZ3VyYXRpb25zLCBJIHNldCB0aGUgInJlc29sdmVkIiBiaXQgc28gdGhhdCBmdXR1cmUKKwkgKiAgY29tcHV0YXRpb25zIHdpbGwgaWdub3JlIHRoZW0uICBJbiB0aGlzIHdheSwgd2UgbWFpbnRhaW4gdGhlCisJICogIGNvbXBsZXRlIERGQSBzdGF0ZSB3aXRoIGFsbCBpdHMgY29uZmlndXJhdGlvbnMsIGJ1dCBwcmV2ZW50CisJICogIGZ1dHVyZSBERkEgY29udmVyc2lvbiBvcGVyYXRpb25zIGZyb20gcHVyc3VpbmcgdW5kZXNpcmFibGUKKwkgKiAgcGF0aHMuICBSZW1lbWJlciB0aGF0IHdlIHdhbnQgdG8gdGVybWluYXRlIERGQSBjb252ZXJzaW9uIGFzCisJICogIHNvb24gYXMgd2Uga25vdyB0aGUgZGVjaXNpb24gaXMgZGV0ZXJtaW5pc3RpYyAqb3IqCisJICogIG5vbmRldGVybWluaXN0aWMuCisJICoKKwkgKiAgW0JUVywgSSBoYXZlIGNvbnZpbmNlZCBteXNlbGYgdGhhdCB0aGVyZSBjYW4gYmUgYXQgbW9zdCBvbmUKKwkgKiAgc2V0IG9mIG5vbmRldGVybWluaXN0aWMgY29uZmlndXJhdGlvbnMgaW4gYSBERkEgc3RhdGUuICBPbmx5IE5GQQorCSAqICBjb25maWd1cmF0aW9ucyBhcmlzaW5nIGZyb20gdGhlIHNhbWUgaW5wdXQgc2VxdWVuY2UgY2FuIGFwcGVhcgorCSAqICBpbiBhIERGQSBzdGF0ZS4gIFRoZXJlIGlzIG5vIHdheSB0byBoYXZlIGFub3RoZXIgY29tcGxldGUgc2V0CisJICogIG9mIG5vbmRldGVybWluaXN0aWMgTkZBIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgYW5vdGhlciBpbnB1dAorCSAqICBzZXF1ZW5jZSwgd2hpY2ggd291bGQgcmVhY2ggYSBkaWZmZXJlbnQgREZBIHN0YXRlLiAgVGhlcmVmb3JlLAorCSAqICB0aGUgdHdvIG5vbmRldGVybWluaXN0aWMgTkZBIGNvbmZpZ3VyYXRpb24gc2V0cyBjYW5ub3QgY29sbGlkZQorCSAqICBpbiB0aGUgc2FtZSBERkEgc3RhdGUuXQorCSAqCisJICogIENvbnNpZGVyIERGQSBzdGF0ZSB7KHN8MSksKHN8MiksKHN8MyksKHR8MyksKHZ8NCl9IHdoZXJlIChzfGEpCisJICogIGlzIHN0YXRlICdzJyBhbmQgYWx0ZXJuYXRpdmUgJ2EnLiAgSGVyZSwgY29uZmlndXJhdGlvbiBzZXQKKwkgKiAgeyhzfDEpLChzfDIpLChzfDMpfSBwcmVkaWN0cyAzIGRpZmZlcmVudCBhbHRzLiAgQ29uZmlndXJhdGlvbnMKKwkgKiAgKHN8MikgYW5kIChzfDMpIGFyZSAicmVzb2x2ZWQiLCBsZWF2aW5nIHsoc3wxKSwodHwzKSwodnw0KX0gYXMKKwkgKiAgaXRlbXMgdGhhdCBtdXN0IHN0aWxsIGJlIGNvbnNpZGVyZWQgYnkgdGhlIERGQSBjb252ZXJzaW9uCisJICogIGFsZ29yaXRobSBpbiBERkEuZmluZE5ld0RGQVN0YXRlc0FuZEFkZERGQVRyYW5zaXRpb25zKCkuCisJICoKKwkgKiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBncmFtbWFyIHdoZXJlIGFsdHMgMSBhbmQgMiBhcmUgbm8KKwkgKiAgcHJvYmxlbSBiZWNhdXNlIG9mIHRoZSAybmQgbG9va2FoZWFkIHN5bWJvbC4gIEFsdHMgMyBhbmQgNCBhcmUKKwkgKiAgaWRlbnRpY2FsIGFuZCB3aWxsIHRoZXJlZm9yZSByZWFjaCB0aGUgcnVsZSBlbmQgTkZBIHN0YXRlIGJ1dAorCSAqICBwcmVkaWN0aW5nIDIgZGlmZmVyZW50IGFsdHMgKG5vIGFtb3VudCBvZiBmdXR1cmUgbG9va2FoZWFkCisJICogIHdpbGwgcmVuZGVyIHRoZW0gZGV0ZXJtaW5pc3RpYy9zZXBhcmFibGUpOgorCSAqCisJICogIGEgOiBBIEIKKwkgKiAgICB8IEEgQworCSAqICAgIHwgQQorCSAqICAgIHwgQQorCSAqICAgIDsKKwkgKgorCSAqICBIZXJlIGlzIGEgKHNsaWdodGx5IHJlZHVjZWQpIE5GQSBvZiB0aGlzIGdyYW1tYXI6CisJICoKKwkgKiAgKDEpLUEtPigyKS1CLT4oZW5kKS1FT0YtPig4KQorCSAqICAgfCAgICAgICAgICAgICAgXgorCSAqICAoMiktQS0+KDMpLUMtLS0tfAorCSAqICAgfCAgICAgICAgICAgICAgXgorCSAqICAoNCktQS0+KDUpLS0tLS0tfAorCSAqICAgfCAgICAgICAgICAgICAgXgorCSAqICAoNiktQS0+KDcpLS0tLS0tfAorCSAqCisJICogIHdoZXJlIChuKSBpcyBORkEgc3RhdGUgbi4gIFRvIGJlZ2luIERGQSBjb252ZXJzaW9uLCB0aGUgc3RhcnQKKwkgKiAgc3RhdGUgaXMgY3JlYXRlZDoKKwkgKgorCSAqICB7KDF8MSksKDJ8MiksKDR8MyksKDZ8NCl9CisJICoKKwkgKiAgVXBvbiBBLCBhbGwgTkZBIGNvbmZpZ3VyYXRpb25zIGxlYWQgdG8gbmV3IE5GQSBzdGF0ZXMgeWllbGRpbmcKKwkgKiAgbmV3IERGQSBzdGF0ZToKKwkgKgorCSAqICB7KDJ8MSksKDN8MiksKDV8MyksKDd8NCksKGVuZHwzKSwoZW5kfDQpfQorCSAqCisJICogIHdoZXJlIHRoZSBjb25maWd1cmF0aW9ucyB3aXRoIHN0YXRlIGVuZCBpbiB0aGVtIGFyZSBhZGRlZAorCSAqICBkdXJpbmcgdGhlIGVwc2lsb24gY2xvc3VyZSBvcGVyYXRpb24uICBTdGF0ZSBlbmQgcHJlZGljdHMgYm90aAorCSAqICBhbHRzIDMgYW5kIDQuICBBbiBlcnJvciBpcyByZXBvcnRlZCwgdGhlIGxhdHRlciBjb25maWd1cmF0aW9uIGlzCisJICogIGZsYWdnZWQgYXMgcmVzb2x2ZWQgbGVhdmluZyB0aGUgREZBIHN0YXRlIGFzOgorCSAqCisJICogIHsoMnwxKSwoM3wyKSwoNXwzKSwoN3w0fHJlc29sdmVkKSwoZW5kfDMpLChlbmR8NHxyZXNvbHZlZCl9CisJICoKKwkgKiAgQXMgTkZBIGNvbmZpZ3VyYXRpb25zIGFyZSBhZGRlZCB0byBhIERGQSBzdGF0ZSBkdXJpbmcgaXRzCisJICogIGNvbnN0cnVjdGlvbiwgdGhlIHJlYWNoYWJsZSBzZXQgb2YgbGFiZWxzIGlzIGNvbXB1dGVkLiAgSGVyZQorCSAqICByZWFjaGFibGUgaXMge0IsQyxFT0Z9IGJlY2F1c2UgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIE5GQSBzdGF0ZQorCSAqICBpbiB0aGUgREZBIHN0YXRlIHRoYXQgY2FuIHRyYW5zaXRpb24gdXBvbiB0aG9zZSBzeW1ib2xzLgorCSAqCisJICogIFRoZSBmaW5hbCBERkEgbG9va3MgbGlrZToKKwkgKgorCSAqICB7KDF8MSksKDJ8MiksKDR8MyksKDZ8NCl9CisJICogICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgdgorCSAqICB7KDJ8MSksKDN8MiksKDV8MyksKDd8NCksKGVuZHwzKSwoZW5kfDQpfSAtQi0+IChlbmR8MSkKKwkgKiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAgICAgIC0tLS1FT0YtPiAoOCwzKQorCSAqICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgIHYKKwkgKiAgICAgICAgICAgKGVuZHwyKQorCSAqCisJICogIFVwb24gQUIsIGFsdCAxIGlzIHByZWRpY3RlZC4gIFVwb24gQUMsIGFsdCAyIGlzIHByZWRpY3RlZC4KKwkgKiAgVXBvbiBBIEVPRiwgYWx0IDMgaXMgcHJlZGljdGVkLiAgQWx0IDQgaXMgbm90IGEgdmlhYmxlCisJICogIGFsdGVybmF0aXZlLgorCSAqCisJICogIFRoZSBhbGdvcml0aG0gaXMgZXNzZW50aWFsbHkgdG8gd2FsayBhbGwgdGhlIGNvbmZpZ3VyYXRpb25zCisJICogIGxvb2tpbmcgZm9yIGEgY29uZmxpY3Qgb2YgdGhlIGZvcm0gKHN8aSkgYW5kIChzfGopIGZvciBpIT1qLgorCSAqICBVc2UgYSBoYXNoIHRhYmxlIHRvIHRyYWNrIHN0YXRlK2NvbnRleHQgcGFpcnMgZm9yIGNvbGxpc2lvbnMKKwkgKiAgc28gdGhhdCB3ZSBoYXZlIE8obikgdG8gd2FsayB0aGUgbiBjb25maWd1cmF0aW9ucyBsb29raW5nIGZvcgorCSAqICBhIGNvbmZsaWN0LiAgVXBvbiBldmVyeSBjb25mbGljdCwgdHJhY2sgdGhlIGFsdCBudW1iZXIgc28KKwkgKiAgd2UgaGF2ZSBhIGxpc3Qgb2YgYWxsIG5vbmRldGVybWluaXN0aWNhbGx5IHByZWRpY3RlZCBhbHRzLiBBbHNvCisJICogIHRyYWNrIHRoZSBtaW5pbXVtIGFsdC4gIE5leHQgZ28gYmFjayBvdmVyIHRoZSBjb25maWd1cmF0aW9ucywgc2V0dGluZworCSAqICB0aGUgInJlc29sdmVkIiBiaXQgZm9yIGFueSB0aGF0IGhhdmUgYW4gYWx0IHRoYXQgaXMgYSBtZW1iZXIgb2YKKwkgKiAgdGhlIG5vbmRldGVybWluaXN0aWMgc2V0LiAgVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHJlbW92ZSBhbnkgYWx0cworCSAqICBidXQgdGhlIG9uZSB3ZSB3YW50IGZyb20gZnV0dXJlIGNvbnNpZGVyYXRpb24uCisJICoKKwkgKiAgU2VlIHJlc29sdmVXaXRoU2VtYW50aWNQcmVkaWNhdGVzKCkKKwkgKgorCSAqICBBTUJJR1VPVVMgVE9LRU5TCisJICoKKwkgKiAgV2l0aCBrZXl3b3JkcyBhbmQgSUQgdG9rZW5zLCB0aGVyZSBpcyBhbiBpbmhlcml0IGFtYmlndWl0eSBpbiB0aGF0CisJICogICJpbnQiIGNhbiBiZSBtYXRjaGVkIGJ5IElEIGFsc28uICBFYWNoIGxleGVyIHJ1bGUgaGFzIGFuIEVPVAorCSAqICB0cmFuc2l0aW9uIGVtYW5hdGluZyBmcm9tIGl0IHdoaWNoIGlzIHVzZWQgd2hlbmV2ZXIgdGhlIGVuZCBvZgorCSAqICBhIHJ1bGUgaXMgcmVhY2hlZCBhbmQgYW5vdGhlciB0b2tlbiBydWxlIGRpZCBub3QgaW52b2tlIGl0LiAgRU9UCisJICogIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuIGJlIHNlZW4gbmV4dC4gIElmIHR3byBydWxlcyBhcmUgaWRlbnRpY2FsCisJICogIGxpa2UgImludCIgYW5kICJpbnQiIHRoZW4gdGhlIDJuZCBkZWYgaXMgdW5yZWFjaGFibGUgYW5kIHlvdSdsbCBnZXQKKwkgKiAgYSB3YXJuaW5nLiAgV2UgcHJldmVudCBhIHdhcm5pbmcgdGhvdWdoIGZvciB0aGUga2V5d29yZC9JRCBpc3N1ZSBhcworCSAqICBJRCBpcyBzdGlsbCByZWFjaGFibGUuICBUaGlzIGNhbiBiZSBhIGJpdCB3ZWlyZC4gICcrJyBydWxlIHRoZW4gYQorCSAqICAnKyd8Jys9JyBydWxlIHdpbGwgZmFpbCB0byBtYXRjaCAnKycgZm9yIHRoZSAybmQgcnVsZS4KKwkgKgorCSAqICBJZiBhbGwgTkZBIHN0YXRlcyBpbiB0aGlzIERGQSBzdGF0ZSBhcmUgdGFyZ2V0cyBvZiBFT1QgdHJhbnNpdGlvbnMsCisJICogIChhbmQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzdGF0ZSBwbHVzIG5vIHVuaXF1ZSBhbHQgaXMgcHJlZGljdGVkKQorCSAqICB0aGVuIERGQSBjb252ZXJzaW9uIHdpbGwgbGVhdmUgdGhpcyBzdGF0ZSBhcyBhIGRlYWQgc3RhdGUgYXMgbm90aGluZworCSAqICBjYW4gYmUgcmVhY2hlZCBmcm9tIHRoaXMgc3RhdGUuICBUbyByZXNvbHZlIHRoZSBhbWJpZ3VpdHksIGp1c3QgZG8KKwkgKiAgd2hhdCBmbGV4IGFuZCBmcmllbmRzIGRvOiBwaWNrIHRoZSBmaXJzdCBydWxlIChhbHQgaW4gdGhpcyBjYXNlKSB0bworCSAqICB3aW4uICBUaGlzIG1lYW5zIHlvdSBzaG91bGQgcHV0IGtleXdvcmRzIGJlZm9yZSB0aGUgSUQgcnVsZS4KKwkgKiAgSWYgdGhlIERGQSBzdGF0ZSBoYXMgb25seSBvbmUgTkZBIHN0YXRlIHRoZW4gdGhlcmUgaXMgbm8gaXNzdWU6CisJICogIGl0IHVuaXF1ZWx5IHByZWRpY3RzIG9uZSBhbHQuIDopICBQcm9ibGVtCisJICogIHN0YXRlcyB3aWxsIGxvb2sgbGlrZSB0aGlzIGR1cmluZyBjb252ZXJzaW9uOgorCSAqCisJICogIERGQSAxOns5fDEsIDE5fDIsIDE0fDMsIDIwfDIsIDIzfDIsIDI0fDIsIC4uLn0tPEVPVD4tPjU6ezQxfDMsIDQyfDJ9CisJICoKKwkgKiAgV29yc2UsIHdoZW4geW91IGhhdmUgdHdvIGlkZW50aWNhbCBsaXRlcmFsIHJ1bGVzLCB5b3Ugd2lsbCBzZWUgMyBhbHRzCisJICogIGluIHRoZSBFT1Qgc3RhdGUgKG9uZSBmb3IgSUQgYW5kIG9uZSBlYWNoIGZvciB0aGUgaWRlbnRpY2FsIHJ1bGVzKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNvbHZlTm9uRGV0ZXJtaW5pc21zKERGQVN0YXRlIGQpIHsKKwkJaWYgKCBkZWJ1ZyApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZU5vbkRldGVybWluaXNtcyAiK2QudG9TdHJpbmcoKSk7CisJCX0KKwkJYm9vbGVhbiBjb25mbGljdGluZ0xleGVyUnVsZXMgPSBmYWxzZTsKKwkJU2V0IG5vbmRldGVybWluaXN0aWNBbHRzID0gZC5nZXROb25EZXRlcm1pbmlzdGljQWx0cygpOworCQlpZiAoIGRlYnVnICYmIG5vbmRldGVybWluaXN0aWNBbHRzIT1udWxsICkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJub25kZXQgYWx0cz0iK25vbmRldGVybWluaXN0aWNBbHRzKTsKKwkJfQorCisJCS8vIENIRUNLIEZPUiBBTUJJR1VPVVMgRU9UIChpZiB8YWxsQWx0c3w+MSBhbmQgRU9UIHN0YXRlLCByZXNvbHZlKQorCQkvLyBncmFiIGFueSBjb25maWcgdG8gc2VlIGlmIEVPVCBzdGF0ZTsgYW55IG90aGVyIGNvbmZpZ3MgbXVzdAorCQkvLyB0cmFuc2l0aW9uIG9uIEVPVCB0byBnZXQgdG8gdGhpcyBERkEgc3RhdGUgYXMgd2VsbCBzbyBhbGwKKwkJLy8gc3RhdGVzIGluIGQgbXVzdCBiZSB0YXJnZXRzIG9mIEVPVC4gIFRoZXNlIGFyZSB0aGUgZW5kIHN0YXRlcworCQkvLyBjcmVhdGVkIGluIE5GQUZhY3RvcnkuYnVpbGRfRU9GU3RhdGUKKwkJTkZBQ29uZmlndXJhdGlvbiBhbnlDb25maWcgPSBkLm5mYUNvbmZpZ3VyYXRpb25zLmdldCgwKTsKKwkJTkZBU3RhdGUgYW55U3RhdGUgPSBkZmEubmZhLmdldFN0YXRlKGFueUNvbmZpZy5zdGF0ZSk7CisKKwkJLy8gaWYgZCBpcyB0YXJnZXQgb2YgRU9UIGFuZCBtb3JlIHRoYW4gb25lIHByZWRpY3RlZCBhbHQKKwkJLy8gaW5kaWNhdGUgdGhhdCBkIGlzIG5vbmRldGVybWluaXN0aWMgb24gYWxsIGFsdHMgb3RoZXJ3aXNlCisJCS8vIGl0IGxvb2tzIGxpa2Ugc3RhdGUgaGFzIG5vIHByb2JsZW0KKwkJaWYgKCBhbnlTdGF0ZS5pc0VPVFRhcmdldFN0YXRlKCkgKSB7CisJCQlTZXQgYWxsQWx0cyA9IGQuZ2V0QWx0U2V0KCk7CisJCQkvLyBpcyBtb3JlIHRoYW4gMSBhbHQgcHJlZGljdGVkPworCQkJaWYgKCBhbGxBbHRzIT1udWxsICYmIGFsbEFsdHMuc2l6ZSgpPjEgKSB7CisJCQkJbm9uZGV0ZXJtaW5pc3RpY0FsdHMgPSBhbGxBbHRzOworCQkJCS8vIHRyYWNrIFRva2VucyBydWxlIGlzc3VlcyBkaWZmZXJlbnRseSB0aGFuIG90aGVyIGRlY2lzaW9ucworCQkJCWlmICggZC5kZmEuaXNUb2tlbnNSdWxlRGVjaXNpb24oKSApIHsKKwkJCQkJZGZhLnByb2JlLnJlcG9ydExleGVyUnVsZU5vbmRldGVybWluaXNtKGQsYWxsQWx0cyk7CisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJUb2tlbnMgcnVsZSBERkEgc3RhdGUgIitkKyIgbm9uZGV0ZXJtaW5pc3RpYyIpOworCQkJCQljb25mbGljdGluZ0xleGVyUnVsZXMgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIGlmIG5vIHByb2JsZW1zIHJldHVybiB1bmxlc3Mgd2UgYWJvcnRlZCB3b3JrIG9uIGQgdG8gYXZvaWQgaW5mIHJlY3Vyc2lvbgorCQlpZiAoICFkLmFib3J0ZWREdWVUb1JlY3Vyc2lvbk92ZXJmbG93ICYmIG5vbmRldGVybWluaXN0aWNBbHRzPT1udWxsICkgeworCQkJcmV0dXJuOyAvLyBubyBwcm9ibGVtcywgcmV0dXJuCisJCX0KKworCQkvLyBpZiB3ZSdyZSBub3QgYSBjb25mbGljdGluZyBsZXhlciBydWxlIGFuZCB3ZSBkaWRuJ3QgYWJvcnQsIHJlcG9ydCBhbWJpZworCQkvLyBXZSBzaG91bGQgZ2V0IGEgcmVwb3J0IGZvciBhYm9ydCBzbyBkb24ndCBnaXZlIGFub3RoZXIKKwkJaWYgKCAhZC5hYm9ydGVkRHVlVG9SZWN1cnNpb25PdmVyZmxvdyAmJiAhY29uZmxpY3RpbmdMZXhlclJ1bGVzICkgeworCQkJLy8gVE9ETzogd2l0aCBrPXggb3B0aW9uIHNldCwgdGhpcyBpcyBjYWxsZWQgdHdpY2UgZm9yIHNhbWUgc3RhdGUKKwkJCWRmYS5wcm9iZS5yZXBvcnROb25kZXRlcm1pbmlzbShkLCBub25kZXRlcm1pbmlzdGljQWx0cyk7CisJCQkvLyBUT0RPOiBob3cgdG8gdHVybiBvZmYgd2hlbiBpdCdzIG9ubHkgdGhlIEZPTExPVyB0aGF0IGlzCisJCQkvLyBjb25mbGljdGluZy4gIFRoaXMgdXNlZCB0byBzaHV0IG9mZiBldmVuIGFsdHMgaSxqIDwgbgorCQkJLy8gY29uZmxpY3Qgd2FybmluZ3MuIDooCisJCX0KKworCQkvLyBBVFRFTVBUIFRPIFJFU09MVkUgV0lUSCBTRU1BTlRJQyBQUkVESUNBVEVTCisJCWJvb2xlYW4gcmVzb2x2ZWQgPQorCQkJdHJ5VG9SZXNvbHZlV2l0aFNlbWFudGljUHJlZGljYXRlcyhkLCBub25kZXRlcm1pbmlzdGljQWx0cyk7CisJCWlmICggcmVzb2x2ZWQgKSB7CisJCQlpZiAoIGRlYnVnICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZWQgREZBIHN0YXRlICIrZC5zdGF0ZU51bWJlcisiIHdpdGggcHJlZCIpOworCQkJfQorCQkJZC5yZXNvbHZlZFdpdGhQcmVkaWNhdGVzID0gdHJ1ZTsKKwkJCWRmYS5wcm9iZS5yZXBvcnROb25kZXRlcm1pbmlzbVJlc29sdmVkV2l0aFNlbWFudGljUHJlZGljYXRlKGQpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gUkVTT0xWRSBTWU5UQUNUSUMgQ09ORkxJQ1QgQlkgUkVNT1ZJTkcgQUxMIEJVVCBPTkUgQUxUCisJCXJlc29sdmVCeUNob29zaW5nRmlyc3RBbHQoZCwgbm9uZGV0ZXJtaW5pc3RpY0FsdHMpOworCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdGF0ZSAiK2Quc3RhdGVOdW1iZXIrIiByZXNvbHZlZCB0byBhbHQgIit3aW5uaW5nQWx0KTsKKwl9CisKKwlwcm90ZWN0ZWQgaW50IHJlc29sdmVCeUNob29zaW5nRmlyc3RBbHQoREZBU3RhdGUgZCwgU2V0IG5vbmRldGVybWluaXN0aWNBbHRzKSB7CisJCWludCB3aW5uaW5nQWx0ID0gMDsKKwkJaWYgKCBkZmEuaXNHcmVlZHkoKSApIHsKKwkJCXdpbm5pbmdBbHQgPSByZXNvbHZlQnlQaWNraW5nTWluQWx0KGQsbm9uZGV0ZXJtaW5pc3RpY0FsdHMpOworCQl9CisJCWVsc2UgeworCQkJLy8gSWYgbm9uZ3JlZWR5LCB0aGUgZXhpdCBhbHQgc2hvdXQgd2luLCBidXQgb25seSBpZiBpdCdzCisJCQkvLyBpbnZvbHZlZCBpbiB0aGUgbm9uZGV0ZXJtaW5pc20hCisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNvbHZpbmcgZXhpdCBhbHQgZm9yIGRlY2lzaW9uPSIrCisJCQkJZGZhLmRlY2lzaW9uTnVtYmVyKyIgc3RhdGU9IitkKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigibm9uZGV0PSIrbm9uZGV0ZXJtaW5pc3RpY0FsdHMpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0IGFsdCAiK2V4aXRBbHQpOworCQkJKi8KKwkJCWludCBleGl0QWx0ID0gZGZhLmdldE51bWJlck9mQWx0cygpOworCQkJaWYgKCBub25kZXRlcm1pbmlzdGljQWx0cy5jb250YWlucyhVdGlscy5pbnRlZ2VyKGV4aXRBbHQpKSApIHsKKwkJCQkvLyBpZiBub25ncmVlZHkgYW5kIGV4aXQgYWx0IGlzIG9uZSBvZiB0aG9zZSBub25kZXRlcm1pbmlzdGljIGFsdHMKKwkJCQkvLyBwcmVkaWN0ZWQsIHJlc29sdmUgaW4gZmF2b3Igb2Ygd2hhdCBmb2xsb3dzIGJsb2NrCisJCQkJd2lubmluZ0FsdCA9IHJlc29sdmVCeVBpY2tpbmdFeGl0QWx0KGQsbm9uZGV0ZXJtaW5pc3RpY0FsdHMpOworCQkJfQorCQkJZWxzZSB7CisJCQkJd2lubmluZ0FsdCA9IHJlc29sdmVCeVBpY2tpbmdNaW5BbHQoZCxub25kZXRlcm1pbmlzdGljQWx0cyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHdpbm5pbmdBbHQ7CisJfQorCisJLyoqIFR1cm4gb2ZmIGFsbCBjb25maWd1cmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogIHNldCBvZiBpbmNvbWluZyBub25kZXRlcm1pbmlzdGljIGFsdHMgZXhjZXB0IHRoZSBtaW4gYWx0IG51bWJlci4KKwkgKiAgVGhlcmUgbWF5IGJlIG1hbnkgYWx0cyBhbW9uZyB0aGUgY29uZmlndXJhdGlvbnMgYnV0IG9ubHkgdHVybiBvZmYKKwkgKiAgdGhlIG9uZXMgd2l0aCBwcm9ibGVtcyAob3RoZXIgdGhhbiB0aGUgbWluIGFsdCBvZiBjb3Vyc2UpLgorCSAqCisJICogIElmIG5vbmRldGVybWluaXN0aWNBbHRzIGlzIG51bGwgdGhlbiB0dXJuIG9mZiBhbGwgY29uZmlncyAnY2VwdCB0aG9zZQorCSAqICBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbmltdW0gYWx0LgorCSAqCisJICogIFJldHVybiB0aGUgbWluIGFsdCBmb3VuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IHJlc29sdmVCeVBpY2tpbmdNaW5BbHQoREZBU3RhdGUgZCwgU2V0IG5vbmRldGVybWluaXN0aWNBbHRzKSB7CisJCWludCBtaW4gPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkJaWYgKCBub25kZXRlcm1pbmlzdGljQWx0cyE9bnVsbCApIHsKKwkJCW1pbiA9IGdldE1pbkFsdChub25kZXRlcm1pbmlzdGljQWx0cyk7CisJCX0KKwkJZWxzZSB7CisJCQltaW4gPSBkLm1pbkFsdEluQ29uZmlndXJhdGlvbnM7CisJCX0KKworCQl0dXJuT2ZmT3RoZXJBbHRzKGQsIG1pbiwgbm9uZGV0ZXJtaW5pc3RpY0FsdHMpOworCisJCXJldHVybiBtaW47CisJfQorCisJLyoqIFJlc29sdmUgc3RhdGUgZCBieSBjaG9vc2luZyBleGl0IGFsdCwgd2hpY2ggaXMgc2FtZSB2YWx1ZSBhcyB0aGUKKwkgKiAgbnVtYmVyIG9mIGFsdGVybmF0aXZlcy4gIFJldHVybiB0aGF0IGV4aXQgYWx0LgorCSAqLworCXByb3RlY3RlZCBpbnQgcmVzb2x2ZUJ5UGlja2luZ0V4aXRBbHQoREZBU3RhdGUgZCwgU2V0IG5vbmRldGVybWluaXN0aWNBbHRzKSB7CisJCWludCBleGl0QWx0ID0gZGZhLmdldE51bWJlck9mQWx0cygpOworCQl0dXJuT2ZmT3RoZXJBbHRzKGQsIGV4aXRBbHQsIG5vbmRldGVybWluaXN0aWNBbHRzKTsKKwkJcmV0dXJuIGV4aXRBbHQ7CisJfQorCisJLyoqIHR1cm4gb2ZmIGFsbCBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoIGFsdHMgb3RoZXIgdGhhbiB0aGUgZ29vZCBvbmUKKwkgKiAgKGFzIGxvbmcgYXMgdGhleSBhcmUgb25lIG9mIHRoZSBub25kZXRlcm1pbmlzdGljIG9uZXMpCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHR1cm5PZmZPdGhlckFsdHMoREZBU3RhdGUgZCwgaW50IG1pbiwgU2V0PEludGVnZXI+IG5vbmRldGVybWluaXN0aWNBbHRzKSB7CisJCWludCBudW1Db25maWdzID0gZC5uZmFDb25maWd1cmF0aW9ucy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisJCQlORkFDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoTkZBQ29uZmlndXJhdGlvbilkLm5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCWlmICggY29uZmlndXJhdGlvbi5hbHQhPW1pbiApIHsKKwkJCQlpZiAoIG5vbmRldGVybWluaXN0aWNBbHRzPT1udWxsIHx8CisJCQkJCSBub25kZXRlcm1pbmlzdGljQWx0cy5jb250YWlucyhVdGlscy5pbnRlZ2VyKGNvbmZpZ3VyYXRpb24uYWx0KSkgKQorCQkJCXsKKwkJCQkJY29uZmlndXJhdGlvbi5yZXNvbHZlZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0TWluQWx0KFNldDxJbnRlZ2VyPiBub25kZXRlcm1pbmlzdGljQWx0cykgeworCQlpbnQgbWluID0gSW50ZWdlci5NQVhfVkFMVUU7CisJCWZvciAoSW50ZWdlciBhbHRJIDogbm9uZGV0ZXJtaW5pc3RpY0FsdHMpIHsKKwkJCWludCBhbHQgPSBhbHRJLmludFZhbHVlKCk7CisJCQlpZiAoIGFsdCA8IG1pbiApIHsKKwkJCQltaW4gPSBhbHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1pbjsKKwl9CisKKwkvKiogU2VlIGlmIGEgc2V0IG9mIG5vbmRldGVybWluaXN0aWMgYWx0ZXJuYXRpdmVzIGNhbiBiZSBkaXNhbWJpZ3VhdGVkCisJICogIHdpdGggdGhlIHNlbWFudGljIHByZWRpY2F0ZSBjb250ZXh0cyBvZiB0aGUgYWx0ZXJuYXRpdmVzLgorCSAqCisJICogIFdpdGhvdXQgc2VtYW50aWMgcHJlZGljYXRlcywgc3ludGFjdGljIGNvbmZsaWN0cyBhcmUgcmVzb2x2ZWQKKwkgKiAgYnkgc2ltcGx5IGNob29zaW5nIHRoZSBmaXJzdCB2aWFibGUgYWx0ZXJuYXRpdmUuICBJbiB0aGUKKwkgKiAgcHJlc2VuY2Ugb2Ygc2VtYW50aWMgcHJlZGljYXRlcywgeW91IGNhbiByZXNvbHZlIHRoZSBpc3N1ZSBieQorCSAqICBldmFsdWF0aW5nIGJvb2xlYW4gZXhwcmVzc2lvbnMgYXQgcnVuIHRpbWUuICBEdXJpbmcgYW5hbHlzaXMsCisJICogIHRoaXMgYW1vdW50cyB0byBzdXBwcmVzc2luZyBncmFtbWFyIGVycm9yIG1lc3NhZ2VzIHRvIHRoZQorCSAqICBkZXZlbG9wZXIuICBORkEgY29uZmlndXJhdGlvbnMgYXJlIGFsd2F5cyBtYXJrZWQgYXMgInRvIGJlCisJICogIHJlc29sdmVkIHdpdGggcHJlZGljYXRlcyIgc28gdGhhdAorCSAqICBERkEuZmluZE5ld0RGQVN0YXRlc0FuZEFkZERGQVRyYW5zaXRpb25zKCkgd2lsbCBrbm93IHRvIGlnbm9yZQorCSAqICB0aGVzZSBjb25maWd1cmF0aW9ucyBhbmQgYWRkIHByZWRpY2F0ZSB0cmFuc2l0aW9ucyB0byB0aGUgREZBCisJICogIGFmdGVyIGFkZGluZyB0b2tlbi9jaGFyIGxhYmVscy4KKwkgKgorCSAqICBEdXJpbmcgYW5hbHlzaXMsIHdlIGNhbiBzaW1wbHkgbWFrZSBzdXJlIHRoYXQgZm9yIG4KKwkgKiAgYW1iaWd1b3VzbHkgcHJlZGljdGVkIGFsdGVybmF0aXZlcyB0aGVyZSBhcmUgYXQgbGVhc3Qgbi0xCisJICogIHVuaXF1ZSBwcmVkaWNhdGUgc2V0cy4gIFRoZSBudGggYWx0ZXJuYXRpdmUgY2FuIGJlIHByZWRpY3RlZAorCSAqICB3aXRoICJub3QiIHRoZSAib3IiIG9mIGFsbCBvdGhlciBwcmVkaWNhdGVzLiAgTkZBIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQKKwkgKiAgcHJlZGljYXRlcyBhcmUgYXNzdW1lZCB0byBoYXZlIHRoZSBkZWZhdWx0IHByZWRpY2F0ZSBvZgorCSAqICAidHJ1ZSIgZnJvbSBhIHVzZXIgcG9pbnQgb2Ygdmlldy4gIFdoZW4gdHJ1ZSBpcyBjb21iaW5lZCB2aWEgfHwgd2l0aAorCSAqICBhbm90aGVyIHByZWRpY2F0ZSwgdGhlIHByZWRpY2F0ZSBpcyBhIHRhdXRvbG9neSBhbmQgbXVzdCBiZSByZW1vdmVkCisJICogIGZyb20gY29uc2lkZXJhdGlvbiBmb3IgZGlzYW1iaWd1YXRpb246CisJICoKKwkgKiAgYSA6IGIgfCBCIDsgLy8gaG9pc3RpbmcgcDF8fHRydWUgb3V0IG9mIHJ1bGUgYiwgeWllbGRzIG5vIHByZWRpY2F0ZQorCSAqICBiIDoge3AxfT8gQiB8IEIgOworCSAqCisJICogIFRoaXMgaXMgZG9uZSBkb3duIGluIGdldFByZWRpY2F0ZXNQZXJOb25EZXRlcm1pbmlzdGljQWx0KCkuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdHJ5VG9SZXNvbHZlV2l0aFNlbWFudGljUHJlZGljYXRlcyhERkFTdGF0ZSBkLAorCQkJCQkJCQkJCQkJCQkgU2V0IG5vbmRldGVybWluaXN0aWNBbHRzKQorCXsKKwkJTWFwPEludGVnZXIsIFNlbWFudGljQ29udGV4dD4gYWx0VG9QcmVkTWFwID0KKwkJCQlnZXRQcmVkaWNhdGVzUGVyTm9uRGV0ZXJtaW5pc3RpY0FsdChkLCBub25kZXRlcm1pbmlzdGljQWx0cyk7CisKKwkJaWYgKCBhbHRUb1ByZWRNYXAuc2l6ZSgpPT0wICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm5vbmRldGVybWluaXN0aWMgYWx0cyB3aXRoIHByZWRpY2F0ZXM6ICIrYWx0VG9QcmVkTWFwKTsKKwkJZGZhLnByb2JlLnJlcG9ydEFsdFByZWRpY2F0ZUNvbnRleHQoZCwgYWx0VG9QcmVkTWFwKTsKKworCQlpZiAoIG5vbmRldGVybWluaXN0aWNBbHRzLnNpemUoKS1hbHRUb1ByZWRNYXAuc2l6ZSgpPjEgKSB7CisJCQkvLyB0b28gZmV3IHByZWRpY2F0ZXMgdG8gcmVzb2x2ZTsganVzdCByZXR1cm4KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIEhhbmRsZSBjYXNlIHdoZXJlIDEgcHJlZGljYXRlIGlzIG1pc3NpbmcKKwkJLy8gQ2FzZSAxLiBTZW1hbnRpYyBwcmVkaWNhdGVzCisJCS8vIElmIHRoZSBtaXNzaW5nIHByZWQgaXMgb24gbnRoIGFsdCwgISh1bmlvbiBvZiBvdGhlciBwcmVkcyk9PXRydWUKKwkJLy8gc28gd2UgY2FuIGF2b2lkIHRoYXQgY29tcHV0YXRpb24uICBJZiBuYWtlZCBhbHQgaXMgaXRoLCB0aGVuIG11c3QKKwkJLy8gdGVzdCBpdCB3aXRoICEodW5pb24pIHNpbmNlIHNlbWFudGljIHByZWRpY2F0ZWQgYWx0cyBhcmUgb3JkZXIKKwkJLy8gaW5kZXBlbmRlbnQKKwkJLy8gQ2FzZSAyOiBTeW50YWN0aWMgcHJlZGljYXRlcworCQkvLyBUaGUgbmFrZWQgYWx0IGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIHRydWUgYXMgdGhlIG9yZGVyIG9mCisJCS8vIGFsdHMgaXMgdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UuICBUaGUgbmFrZWQgYWx0IHdpbGwgYmUgYSB0YXV0b2xvZ3kKKwkJLy8gYW55d2F5IGFzIGl0J3MgISh1bmlvbiBvZiBvdGhlciBwcmVkcykuICBUaGlzIGltcGxpZXMKKwkJLy8gdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIG5vdmlhYmxlIGFsdCBmb3Igc3lucHJlZCBlZGdlcworCQkvLyBlbWFuYXRpbmcgZnJvbSBhIERGQSBzdGF0ZS4KKwkJaWYgKCBhbHRUb1ByZWRNYXAuc2l6ZSgpPT1ub25kZXRlcm1pbmlzdGljQWx0cy5zaXplKCktMSApIHsKKwkJCS8vIGlmIHRoZXJlIGFyZSBuLTEgcHJlZGljYXRlcyBmb3IgbiBub25kZXRlcm1pbmlzdGljIGFsdHMsIGNhbiBmaXgKKwkJCW9yZy5hbnRsci5taXNjLkJpdFNldCBuZFNldCA9IG9yZy5hbnRsci5taXNjLkJpdFNldC5vZihub25kZXRlcm1pbmlzdGljQWx0cyk7CisJCQlvcmcuYW50bHIubWlzYy5CaXRTZXQgcHJlZFNldCA9IG9yZy5hbnRsci5taXNjLkJpdFNldC5vZihhbHRUb1ByZWRNYXApOworCQkJaW50IG5ha2VkQWx0ID0gbmRTZXQuc3VidHJhY3QocHJlZFNldCkuZ2V0U2luZ2xlRWxlbWVudCgpOworCQkJU2VtYW50aWNDb250ZXh0IG5ha2VkQWx0UHJlZCA9IG51bGw7CisJCQlpZiAoIG5ha2VkQWx0ID09IG1heChub25kZXRlcm1pbmlzdGljQWx0cykgKSB7CisJCQkJLy8gdGhlIG5ha2VkIGFsdCBpcyB0aGUgbGFzdCBub25kZXQgYWx0IGFuZCB3aWxsIGJlIHRoZSBkZWZhdWx0IGNsYXVzZQorCQkJCW5ha2VkQWx0UHJlZCA9IG5ldyBTZW1hbnRpY0NvbnRleHQuVHJ1ZVByZWRpY2F0ZSgpOworCQkJfQorCQkJZWxzZSB7CisJCQkJLy8gcHJldGVuZCBuYWtlZCBhbHRlcm5hdGl2ZSBpcyBjb3ZlcmVkIHdpdGggISh1bmlvbiBvdGhlciBwcmVkcykKKwkJCQkvLyB1bmxlc3Mgb25lIG9mIHByZWRzIGZyb20gb3RoZXIgYWx0cyBpcyBhIG1hbnVhbGx5IHNwZWNpZmllZCBzeW5wcmVkCisJCQkJLy8gc2luY2UgdGhvc2UgaGF2ZSBwcmVjZWRlbmNlIHNhbWUgYXMgYWx0IG9yZGVyLiAgTWlzc2luZyBzeW5wcmVkCisJCQkJLy8gaXMgdHJ1ZSBzbyB0aGF0IGFsdCB3aW5zIChvciBpcyBhdCBsZWFzdCBhdHRlbXB0ZWQpLgorCQkJCS8vIE5vdGU6IGNhbid0IG1pc3MgYW55IHByZWRzIG9uIGFsdHMgKGNhbid0IGJlIGhlcmUpIGlmIGF1dG8gYmFja3RyYWNrCisJCQkJLy8gc2luY2UgaXQgcHJlZml4ZXMgYWxsLgorCQkJCS8vIEluIExMKCopIHBhcGVyLCBpJ2xsIGp1c3QgaGF2ZSBhbGdvcml0aG0gZW1pdCB3YXJuaW5nIGFib3V0IHVuY292ZXJlZAorCQkJCS8vIHByZWQKKwkJCQlTZW1hbnRpY0NvbnRleHQgdW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyA9CisJCQkJCWdldFVuaW9uT2ZQcmVkaWNhdGVzKGFsdFRvUHJlZE1hcCk7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFsbCBwcmVkaWNhdGVzICIrdW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyk7CisJCQkJaWYgKCB1bmlvbk9mUHJlZGljYXRlc0Zyb21BbGxBbHRzLmlzU3ludGFjdGljUHJlZGljYXRlKCkgKSB7CisJCQkJCW5ha2VkQWx0UHJlZCA9IG5ldyBTZW1hbnRpY0NvbnRleHQuVHJ1ZVByZWRpY2F0ZSgpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbmFrZWRBbHRQcmVkID0KKwkJCQkJCVNlbWFudGljQ29udGV4dC5ub3QodW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyk7CisJCQkJfQorCQkJfQorCisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY292ZXJpbmcgbmFrZWQgYWx0PSIrbmFrZWRBbHQrIiB3aXRoICIrbmFrZWRBbHRQcmVkKTsKKworCQkJYWx0VG9QcmVkTWFwLnB1dChVdGlscy5pbnRlZ2VyKG5ha2VkQWx0KSwgbmFrZWRBbHRQcmVkKTsKKwkJCS8vIHNldCBhbGwgY29uZmlnIHdpdGggYWx0PW5ha2VkQWx0IHRvIGhhdmUgdGhlIGNvbXB1dGVkIHByZWRpY2F0ZQorCQkJaW50IG51bUNvbmZpZ3MgPSBkLm5mYUNvbmZpZ3VyYXRpb25zLnNpemUoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7IC8vIFRPRE86IEkgZG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBkbyB0aGlzOyBhbHRUb1ByZWRNYXAgaGFzIGl0CisJCQkgLy83LzI3LzEwICB0aGVvaywgSSByZW1vdmVkIGl0IGFuZCBpdCBzdGlsbCBzZWVtcyB0byB3b3JrIHdpdGggZXZlcnl0aGluZzsgbGVhdmUgaW4gYW55d2F5IGp1c3QgaW4gY2FzZQorCQkJCU5GQUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChORkFDb25maWd1cmF0aW9uKWQubmZhQ29uZmlndXJhdGlvbnMuZ2V0KGkpOworCQkJCWlmICggY29uZmlndXJhdGlvbi5hbHQgPT0gbmFrZWRBbHQgKSB7CisJCQkJCWNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0ID0gbmFrZWRBbHRQcmVkOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICggYWx0VG9QcmVkTWFwLnNpemUoKT09bm9uZGV0ZXJtaW5pc3RpY0FsdHMuc2l6ZSgpICkgeworCQkJLy8gUkVTT0xWRSBDT05GTElDVCBieSBwaWNraW5nIG9uZSBORkEgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBhbHQKKwkJCS8vIGFuZCBzZXR0aW5nIGl0cyByZXNvbHZlZFdpdGhQcmVkaWNhdGUgZmxhZworCQkJLy8gRmlyc3QsIHByZXZlbnQgYSByZWN1cnNpb24gd2FybmluZyBvbiB0aGlzIHN0YXRlIGR1ZSB0bworCQkJLy8gcHJlZCByZXNvbHV0aW9uCisJCQlpZiAoIGQuYWJvcnRlZER1ZVRvUmVjdXJzaW9uT3ZlcmZsb3cgKSB7CisJCQkJZC5kZmEucHJvYmUucmVtb3ZlUmVjdXJzaXZlT3ZlcmZsb3dTdGF0ZShkKTsKKwkJCX0KKwkJCWludCBudW1Db25maWdzID0gZC5uZmFDb25maWd1cmF0aW9ucy5zaXplKCk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicHJlZCBtYXA9IithbHRUb1ByZWRNYXApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db25maWdzOyBpKyspIHsKKwkJCQlORkFDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoTkZBQ29uZmlndXJhdGlvbilkLm5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCQlTZW1hbnRpY0NvbnRleHQgc2VtQ3R4ID0gKFNlbWFudGljQ29udGV4dCkKKwkJCQkJCWFsdFRvUHJlZE1hcC5nZXQoVXRpbHMuaW50ZWdlcihjb25maWd1cmF0aW9uLmFsdCkpOworCQkJCWlmICggc2VtQ3R4IT1udWxsICkgeworCQkJCQkvLyByZXNvbHZlIChmaXJzdCBmb3VuZCkgd2l0aCBwcmVkCisJCQkJCS8vIGFuZCByZW1vdmUgYWx0IGZyb20gcHJvYmxlbSBsaXN0CisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjPSIrY29uZmlndXJhdGlvbik7CisJCQkJCWNvbmZpZ3VyYXRpb24ucmVzb2x2ZVdpdGhQcmVkaWNhdGUgPSB0cnVlOworCQkJCQkvLyBhbHRUb1ByZWRNYXAgaGFzIHByZWRzIGZyb20gYWxsIGFsdHM7IHN0b3JlIGludG8gImFubm9pbnRlZCIgY29uZmlnCisJCQkJCWNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0ID0gc2VtQ3R4OyAvLyByZXNldCB0byBjb21iaW5lZAorCQkJCQlhbHRUb1ByZWRNYXAucmVtb3ZlKFV0aWxzLmludGVnZXIoY29uZmlndXJhdGlvbi5hbHQpKTsKKworCQkJCQkvLyBub3RpZnkgZ3JhbW1hciB0aGF0IHdlJ3ZlIHVzZWQgdGhlIHByZWRzIGNvbnRhaW5lZCBpbiBzZW1DdHgKKwkJCQkJaWYgKCBzZW1DdHguaXNTeW50YWN0aWNQcmVkaWNhdGUoKSApIHsKKwkJCQkJCWRmYS5uZmEuZ3JhbW1hci5zeW5QcmVkVXNlZEluREZBKGRmYSwgc2VtQ3R4KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmICggbm9uZGV0ZXJtaW5pc3RpY0FsdHMuY29udGFpbnMoVXRpbHMuaW50ZWdlcihjb25maWd1cmF0aW9uLmFsdCkpICkgeworCQkJCQkvLyByZXNvbHZlIGFsbCBjb25maWd1cmF0aW9ucyBmb3Igbm9uZGV0ZXJtaW5pc3RpYyBhbHRzCisJCQkJCS8vIGZvciB3aGljaCB0aGVyZSBpcyBubyBwcmVkaWNhdGUgY29udGV4dCBieSB0dXJuaW5nIGl0IG9mZgorCQkJCQljb25maWd1cmF0aW9uLnJlc29sdmVkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsgIC8vIGNvdWxkbid0IGZpeCB0aGUgcHJvYmxlbSB3aXRoIHByZWRpY2F0ZXMKKwl9CisKKwkvKiogUmV0dXJuIGEgbWFwcGluZyBmcm9tIG5vbmRldGVybWluaXN0YyBhbHQgdG8gY29tYmluZWQgbGlzdCBvZiBwcmVkaWNhdGVzLgorCSAqICBJZiBib3RoIChzfGl8c2VtQ3R4MSkgYW5kICh0fGl8c2VtQ3R4MikgZXhpc3QsIHRoZW4gdGhlIHByb3BlciBwcmVkaWNhdGUKKwkgKiAgZm9yIGFsdCBpIGlzIHNlbUN0eDF8fHNlbUN0eDIgYmVjYXVzZSB5b3UgaGF2ZSBhcnJpdmVkIGF0IHRoaXMgc2luZ2xlCisJICogIERGQSBzdGF0ZSB2aWEgdHdvIE5GQSBwYXRocywgYm90aCBvZiB3aGljaCBoYXZlIHNlbWFudGljIHByZWRpY2F0ZXMuCisJICogIFdlIGlnbm9yZSBkZXRlcm1pbmlzdGljIGFsdHMgYmVjYXVzZSBzeW50YXggYWxvbmUgaXMgc3VmZmljaWVudAorCSAqICB0byBwcmVkaWN0IHRob3NlLiAgRG8gbm90IGluY2x1ZGUgdGhlaXIgcHJlZGljYXRlcy4KKwkgKgorCSAqICBBbHRzIHdpdGggbm8gcHJlZGljYXRlIGFyZSBhc3N1bWVkIHRvIGhhdmUge3RydWV9PyBwcmVkLgorCSAqCisJICogIFdoZW4gY29tYmluaW5nIHZpYSB8fCB3aXRoICJ0cnVlIiwgYWxsIHByZWRpY2F0ZXMgYXJlIHJlbW92ZWQgZnJvbQorCSAqICBjb25zaWRlcmF0aW9uIHNpbmNlIHRoZSBleHByZXNzaW9uIHdpbGwgYWx3YXlzIGJlIHRydWUgYW5kIGhlbmNlCisJICogIG5vdCB0ZWxsIHVzIGhvdyB0byByZXNvbHZlIGFueXRoaW5nLiAgU28sIGlmIGFueSBORkEgY29uZmlndXJhdGlvbgorCSAqICBpbiB0aGlzIERGQSBzdGF0ZSBkb2VzIG5vdCBoYXZlIGEgc2VtYW50aWMgY29udGV4dCwgdGhlIGFsdCBjYW5ub3QKKwkgKiAgYmUgcmVzb2x2ZWQgd2l0aCBhIHByZWRpY2F0ZS4KKwkgKgorCSAqICBJZiBub25udWxsLCBpbmNpZGVudEVkZ2VMYWJlbCB0ZWxscyB1cyB3aGF0IE5GQSB0cmFuc2l0aW9uIGxhYmVsCisJICogIHdlIGRpZCBhIHJlYWNoIG9uIHRvIGNvbXB1dGUgc3RhdGUgZC4gIGQgbWF5IGhhdmUgaW5zdWZmaWNpZW50CisJICogIHByZWRzLCBzbyB3ZSByZWFsbHkgd2FudCB0aGlzIGZvciB0aGUgZXJyb3IgbWVzc2FnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPEludGVnZXIsIFNlbWFudGljQ29udGV4dD4gZ2V0UHJlZGljYXRlc1Blck5vbkRldGVybWluaXN0aWNBbHQoREZBU3RhdGUgZCwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJU2V0IG5vbmRldGVybWluaXN0aWNBbHRzKQorCXsKKwkJLy8gbWFwIGFsdCB0byBjb21iaW5lZCBTZW1hbnRpY0NvbnRleHQKKwkJTWFwPEludGVnZXIsIFNlbWFudGljQ29udGV4dD4gYWx0VG9QcmVkaWNhdGVDb250ZXh0TWFwID0KKwkJCW5ldyBIYXNoTWFwPEludGVnZXIsIFNlbWFudGljQ29udGV4dD4oKTsKKwkJLy8gaW5pdCB0aGUgYWx0IHRvIHByZWRpY2F0ZSBzZXQgbWFwCisJCU1hcDxJbnRlZ2VyLCBPcmRlcmVkSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+PiBhbHRUb1NldE9mQ29udGV4dHNNYXAgPQorCQkJbmV3IEhhc2hNYXA8SW50ZWdlciwgT3JkZXJlZEhhc2hTZXQ8U2VtYW50aWNDb250ZXh0Pj4oKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IG5vbmRldGVybWluaXN0aWNBbHRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCUludGVnZXIgYWx0SSA9IChJbnRlZ2VyKSBpdC5uZXh0KCk7CisJCQlhbHRUb1NldE9mQ29udGV4dHNNYXAucHV0KGFsdEksIG5ldyBPcmRlcmVkSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+KCkpOworCQl9CisKKwkJLyoKKwkJTGlzdDxMYWJlbD4gc2FtcGxlSW5wdXRMYWJlbHMgPSBkLmRmYS5wcm9iZS5nZXRTYW1wbGVOb25EZXRlcm1pbmlzdGljSW5wdXRTZXF1ZW5jZShkKTsKKwkJU3RyaW5nIGlucHV0ID0gZC5kZmEucHJvYmUuZ2V0SW5wdXRTZXF1ZW5jZURpc3BsYXkoc2FtcGxlSW5wdXRMYWJlbHMpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhbXBsZSBpbnB1dDogIitpbnB1dCk7CisJCSovCisKKwkJLy8gZm9yIGVhY2ggY29uZmlndXJhdGlvbiwgY3JlYXRlIGEgdW5pcXVlIHNldCBvZiBwcmVkaWNhdGVzCisJCS8vIEFsc28sIHRyYWNrIHRoZSBhbHRzIHdpdGggYXQgbGVhc3Qgb25lIHVuY292ZXJlZCBjb25maWd1cmF0aW9uCisJCS8vIChvbmUgdy9vIGEgcHJlZGljYXRlKTsgdHJhY2tzIHRhdXRvbG9naWVzIGxpa2UgcDF8fHRydWUKKwkJTWFwPEludGVnZXIsIFNldDxUb2tlbj4+IGFsdFRvTG9jYXRpb25zUmVhY2hhYmxlV2l0aG91dFByZWRpY2F0ZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFNldDxUb2tlbj4+KCk7CisJCVNldDxJbnRlZ2VyPiBub25kZXRBbHRzV2l0aFVuY292ZXJlZENvbmZpZ3VyYXRpb24gPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uZmlncz0iK2QubmZhQ29uZmlndXJhdGlvbnMpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uZmlncyB3aXRoIHByZWRzPyIrZC5hdExlYXN0T25lQ29uZmlndXJhdGlvbkhhc0FQcmVkaWNhdGUpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uZmlncyB3aXRoIHByZWRzPSIrZC5jb25maWd1cmF0aW9uc1dpdGhQcmVkaWNhdGVFZGdlcyk7CisJCWludCBudW1Db25maWdzID0gZC5uZmFDb25maWd1cmF0aW9ucy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisJCQlORkFDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoTkZBQ29uZmlndXJhdGlvbilkLm5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCUludGVnZXIgYWx0SSA9IFV0aWxzLmludGVnZXIoY29uZmlndXJhdGlvbi5hbHQpOworCQkJLy8gaWYgYWx0IGlzIG5vbmRldGVybWluaXN0aWMsIGNvbWJpbmUgaXRzIHByZWRpY2F0ZXMKKwkJCWlmICggbm9uZGV0ZXJtaW5pc3RpY0FsdHMuY29udGFpbnMoYWx0SSkgKSB7CisJCQkJLy8gaWYgdGhlcmUgaXMgYSBwcmVkaWNhdGUgZm9yIHRoaXMgTkZBIGNvbmZpZ3VyYXRpb24sIE9SIGluCisJCQkJaWYgKCBjb25maWd1cmF0aW9uLnNlbWFudGljQ29udGV4dCAhPQorCQkJCQkgU2VtYW50aWNDb250ZXh0LkVNUFRZX1NFTUFOVElDX0NPTlRFWFQgKQorCQkJCXsKKwkJCQkJU2V0PFNlbWFudGljQ29udGV4dD4gcHJlZFNldCA9IGFsdFRvU2V0T2ZDb250ZXh0c01hcC5nZXQoYWx0SSk7CisJCQkJCXByZWRTZXQuYWRkKGNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0KTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCS8vIGlmIG5vIHByZWRpY2F0ZSwgYnV0IGl0J3MgcGFydCBvZiBub25kZXRlcm1pbmlzdGljIGFsdAorCQkJCQkvLyB0aGVuIGF0IGxlYXN0IG9uZSBwYXRoIGV4aXN0cyBub3QgY292ZXJlZCBieSBhIHByZWRpY2F0ZS4KKwkJCQkJLy8gbXVzdCByZW1vdmUgcHJlZGljYXRlIGZvciB0aGlzIGFsdDsgdHJhY2sgaW5jb21wbGV0ZSBhbHRzCisJCQkJCW5vbmRldEFsdHNXaXRoVW5jb3ZlcmVkQ29uZmlndXJhdGlvbi5hZGQoYWx0SSk7CisJCQkJCS8qCisJCQkJCU5GQVN0YXRlIHMgPSBkZmEubmZhLmdldFN0YXRlKGNvbmZpZ3VyYXRpb24uc3RhdGUpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiMjI1xuZGVjICIrZGZhLmRlY2lzaW9uTnVtYmVyKyIgYWx0ICIrY29uZmlndXJhdGlvbi5hbHQrCisJCQkJCQkJCQkgICAiIGVuY2xvc2luZyBydWxlIGZvciBuZmEgc3RhdGUgbm90IGNvdmVyZWQgIisKKwkJCQkJCQkJCSAgIHMuZW5jbG9zaW5nUnVsZSk7CisJCQkJCWlmICggcy5hc3NvY2lhdGVkQVNUTm9kZSE9bnVsbCApIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW49IitzLmFzc29jaWF0ZWRBU1ROb2RlLnRva2VuKTsKKwkJCQkJfQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5mYSBzdGF0ZT0iK3MpOworCisJCQkJCWlmICggcy5pbmNpZGVudEVkZ2VMYWJlbCE9bnVsbCAmJiBMYWJlbC5pbnRlcnNlY3QoaW5jaWRlbnRFZGdlTGFiZWwsIHMuaW5jaWRlbnRFZGdlTGFiZWwpICkgeworCQkJCQkJU2V0PFRva2VuPiBsb2NhdGlvbnMgPSBhbHRUb0xvY2F0aW9uc1JlYWNoYWJsZVdpdGhvdXRQcmVkaWNhdGUuZ2V0KGFsdEkpOworCQkJCQkJaWYgKCBsb2NhdGlvbnM9PW51bGwgKSB7CisJCQkJCQkJbG9jYXRpb25zID0gbmV3IEhhc2hTZXQ8VG9rZW4+KCk7CisJCQkJCQkJYWx0VG9Mb2NhdGlvbnNSZWFjaGFibGVXaXRob3V0UHJlZGljYXRlLnB1dChhbHRJLCBsb2NhdGlvbnMpOworCQkJCQkJfQorCQkJCQkJbG9jYXRpb25zLmFkZChzLmFzc29jaWF0ZWRBU1ROb2RlLnRva2VuKTsKKwkJCQkJfQorCQkJCQkqLworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEZvciBlYWNoIGFsdCwgT1IgdG9nZXRoZXIgYWxsIHVuaXF1ZSBwcmVkaWNhdGVzIGFzc29jaWF0ZWQgd2l0aAorCQkvLyBhbGwgY29uZmlndXJhdGlvbnMKKwkJLy8gQWxzbywgdHJhY2sgdGhlIGxpc3Qgb2YgaW5jb21wbGV0ZWx5IGNvdmVyZWQgYWx0czogdGhvc2UgYWx0cworCQkvLyB3aXRoIGF0IGxlYXN0IDEgcHJlZGljYXRlIGFuZCBhdCBsZWFzdCBvbmUgY29uZmlndXJhdGlvbiB3L28gYQorCQkvLyBwcmVkaWNhdGUuIFdlIHdhbnQgdGhpcyBpbiBvcmRlciB0byByZXBvcnQgdG8gdGhlIGRlY2lzaW9uIHByb2JlLgorCQlMaXN0PEludGVnZXI+IGluY29tcGxldGVseUNvdmVyZWRBbHRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbm9uZGV0ZXJtaW5pc3RpY0FsdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJSW50ZWdlciBhbHRJID0gKEludGVnZXIpIGl0Lm5leHQoKTsKKwkJCVNldDxTZW1hbnRpY0NvbnRleHQ+IGNvbnRleHRzRm9yVGhpc0FsdCA9IGFsdFRvU2V0T2ZDb250ZXh0c01hcC5nZXQoYWx0SSk7CisJCQlpZiAoIG5vbmRldEFsdHNXaXRoVW5jb3ZlcmVkQ29uZmlndXJhdGlvbi5jb250YWlucyhhbHRJKSApIHsgLy8gPj0gMSBjb25maWcgaGFzIG5vIGN0eAorCQkJCWlmICggY29udGV4dHNGb3JUaGlzQWx0LnNpemUoKT4wICkgeyAgICAvLyAmJiBhdCBsZWFzdCBvbmUgcHJlZAorCQkJCQlpbmNvbXBsZXRlbHlDb3ZlcmVkQWx0cy5hZGQoYWx0SSk7ICAvLyB0aGlzIGFsdCBpbmNvbXBsZXRlZCBjb3ZlcmVkCisJCQkJfQorCQkJCWNvbnRpbnVlOyAvLyBkb24ndCBpbmNsdWRlIGF0IGxlYXN0IDEgY29uZmlnIGhhcyBubyBjdHgKKwkJCX0KKwkJCVNlbWFudGljQ29udGV4dCBjb21iaW5lZENvbnRleHQgPSBudWxsOworCQkJZm9yIChJdGVyYXRvciBpdHJTZXQgPSBjb250ZXh0c0ZvclRoaXNBbHQuaXRlcmF0b3IoKTsgaXRyU2V0Lmhhc05leHQoKTspIHsKKwkJCQlTZW1hbnRpY0NvbnRleHQgY3R4ID0gKFNlbWFudGljQ29udGV4dCkgaXRyU2V0Lm5leHQoKTsKKwkJCQljb21iaW5lZENvbnRleHQgPQorCQkJCQkJU2VtYW50aWNDb250ZXh0Lm9yKGNvbWJpbmVkQ29udGV4dCxjdHgpOworCQkJfQorCQkJYWx0VG9QcmVkaWNhdGVDb250ZXh0TWFwLnB1dChhbHRJLCBjb21iaW5lZENvbnRleHQpOworCQl9CisKKwkJaWYgKCBpbmNvbXBsZXRlbHlDb3ZlcmVkQWx0cy5zaXplKCk+MCApIHsKKwkJCS8qCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb2IgaW4gZGVjICIrZGZhLmRlY2lzaW9uTnVtYmVyKyIgc3RhdGU9IitkKTsKKwkJCUZBU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEZBU2VyaWFsaXplcihkZmEubmZhLmdyYW1tYXIpOworCQkJU3RyaW5nIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGRmYS5zdGFydFN0YXRlKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGZhOiAiK3Jlc3VsdCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluY29tcGxldGUgYWx0czogIitpbmNvbXBsZXRlbHlDb3ZlcmVkQWx0cyk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vbmRldD0iK25vbmRldGVybWluaXN0aWNBbHRzKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigibm9uZGV0QWx0c1dpdGhVbmNvdmVyZWRDb25maWd1cmF0aW9uPSIrIG5vbmRldEFsdHNXaXRoVW5jb3ZlcmVkQ29uZmlndXJhdGlvbik7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFsdFRvQ3R4TWFwPSIrYWx0VG9TZXRPZkNvbnRleHRzTWFwKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWx0VG9QcmVkaWNhdGVDb250ZXh0TWFwPSIrYWx0VG9QcmVkaWNhdGVDb250ZXh0TWFwKTsKKwkJCSovCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworCQkJCU5GQUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChORkFDb25maWd1cmF0aW9uKWQubmZhQ29uZmlndXJhdGlvbnMuZ2V0KGkpOworCQkJCUludGVnZXIgYWx0SSA9IFV0aWxzLmludGVnZXIoY29uZmlndXJhdGlvbi5hbHQpOworCQkJCWlmICggaW5jb21wbGV0ZWx5Q292ZXJlZEFsdHMuY29udGFpbnMoYWx0SSkgJiYKKwkJCQkJIGNvbmZpZ3VyYXRpb24uc2VtYW50aWNDb250ZXh0ID09IFNlbWFudGljQ29udGV4dC5FTVBUWV9TRU1BTlRJQ19DT05URVhUICkKKwkJCQl7CisJCQkJCU5GQVN0YXRlIHMgPSBkZmEubmZhLmdldFN0YXRlKGNvbmZpZ3VyYXRpb24uc3RhdGUpOworCQkJCQkvKgorCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJub25kZXQgY29uZmlnIHcvbyBjb250ZXh0ICIrY29uZmlndXJhdGlvbisKKwkJCQkJCQkJCSAiIGluY2lkZW50ICIrKHMuaW5jaWRlbnRFZGdlTGFiZWwhPW51bGw/cy5pbmNpZGVudEVkZ2VMYWJlbC50b1N0cmluZyhkZmEubmZhLmdyYW1tYXIpOm51bGwpKTsKKwkJCQkJaWYgKCBzLmFzc29jaWF0ZWRBU1ROb2RlIT1udWxsICkgeworCQkJCQkJU3lzdGVtLm91dC5wcmludCgiIHRva2VuPSIrcy5hc3NvY2lhdGVkQVNUTm9kZS50b2tlbik7CisJCQkJCX0KKwkJCQkJZWxzZSBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJCQkJKi8KKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byByZXBvcnQgZ2V0dGluZyB0byBhbiBORkEgc3RhdGUgd2l0aCBhbgorICAgICAgICAgICAgICAgICAgICAvLyBpbmNvbWluZyBsYWJlbCwgdW5sZXNzIGl0J3MgRU9GLCB3L28gYSBwcmVkaWNhdGUuCisgICAgICAgICAgICAgICAgICAgIGlmICggcy5pbmNpZGVudEVkZ2VMYWJlbCE9bnVsbCAmJiBzLmluY2lkZW50RWRnZUxhYmVsLmxhYmVsICE9IExhYmVsLkVPRiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcy5hc3NvY2lhdGVkQVNUTm9kZT09bnVsbCB8fCBzLmFzc29jaWF0ZWRBU1ROb2RlLnRva2VuPT1udWxsICkgeworCQkJCQkJCUVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCJubyBBU1QvdG9rZW4gZm9yIG5vbmVwc2lsb24gdGFyZ2V0IHcvbyBwcmVkaWNhdGUiKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeworCQkJCQkJCVNldDxUb2tlbj4gbG9jYXRpb25zID0gYWx0VG9Mb2NhdGlvbnNSZWFjaGFibGVXaXRob3V0UHJlZGljYXRlLmdldChhbHRJKTsKKwkJCQkJCQlpZiAoIGxvY2F0aW9ucz09bnVsbCApIHsKKwkJCQkJCQkJbG9jYXRpb25zID0gbmV3IEhhc2hTZXQ8VG9rZW4+KCk7CisJCQkJCQkJCWFsdFRvTG9jYXRpb25zUmVhY2hhYmxlV2l0aG91dFByZWRpY2F0ZS5wdXQoYWx0SSwgbG9jYXRpb25zKTsKKwkJCQkJCQl9CisJCQkJCQkJbG9jYXRpb25zLmFkZChzLmFzc29jaWF0ZWRBU1ROb2RlLnRva2VuKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWRmYS5wcm9iZS5yZXBvcnRJbmNvbXBsZXRlbHlDb3ZlcmVkQWx0cyhkLAorCQkJCQkJCQkJCQkJCWFsdFRvTG9jYXRpb25zUmVhY2hhYmxlV2l0aG91dFByZWRpY2F0ZSk7CisJCX0KKworCQlyZXR1cm4gYWx0VG9QcmVkaWNhdGVDb250ZXh0TWFwOworCX0KKworCS8qKiBPUiB0b2dldGhlciBhbGwgcHJlZGljYXRlcyBmcm9tIHRoZSBhbHRzLiAgTm90ZSB0aGF0IHRoZSBwcmVkaWNhdGUKKwkgKiAgZm9yIGFuIGFsdCBjb3VsZCBpdHNlbGYgYmUgYSBjb21iaW5hdGlvbiBvZiBwcmVkaWNhdGVzLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgU2VtYW50aWNDb250ZXh0IGdldFVuaW9uT2ZQcmVkaWNhdGVzKE1hcCBhbHRUb1ByZWRNYXApIHsKKwkJSXRlcmF0b3IgaXRlcjsKKwkJU2VtYW50aWNDb250ZXh0IHVuaW9uT2ZQcmVkaWNhdGVzRnJvbUFsbEFsdHMgPSBudWxsOworCQlpdGVyID0gYWx0VG9QcmVkTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlICggaXRlci5oYXNOZXh0KCkgKSB7CisJCQlTZW1hbnRpY0NvbnRleHQgc2VtQ3R4ID0gKFNlbWFudGljQ29udGV4dClpdGVyLm5leHQoKTsKKwkJCWlmICggdW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cz09bnVsbCApIHsKKwkJCQl1bmlvbk9mUHJlZGljYXRlc0Zyb21BbGxBbHRzID0gc2VtQ3R4OworCQkJfQorCQkJZWxzZSB7CisJCQkJdW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyA9CisJCQkJCQlTZW1hbnRpY0NvbnRleHQub3IodW5pb25PZlByZWRpY2F0ZXNGcm9tQWxsQWx0cyxzZW1DdHgpOworCQkJfQorCQl9CisJCXJldHVybiB1bmlvbk9mUHJlZGljYXRlc0Zyb21BbGxBbHRzOworCX0KKworCS8qKiBmb3IgZWFjaCBORkEgY29uZmlnIGluIGQsIGxvb2sgZm9yICJwcmVkaWNhdGUgcmVxdWlyZWQiIHNpZ24gc2V0CisJICogIGR1cmluZyBub25kZXRlcm1pbmlzbSByZXNvbHV0aW9uLgorCSAqCisJICogIEFkZCB0aGUgcHJlZGljYXRlIGVkZ2VzIHNvcnRlZCBieSB0aGUgYWx0ZXJuYXRpdmUgbnVtYmVyOyBJJ20gZmFpcmx5CisJICogIHN1cmUgdGhhdCBJIGNvdWxkIHdhbGsgdGhlIGNvbmZpZ3MgYmFja3dhcmRzIHNvIHRoZXkgYXJlIGFkZGVkIHRvCisJICogIHRoZSBwcmVkREZBVGFyZ2V0IGluIHRoZSByaWdodCBvcmRlciwgYnV0IGl0J3MgYmVzdCB0byBtYWtlIHN1cmUuCisJICogIFByZWRpY2F0ZXMgc3VjY2VlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgc3BlY2lmZWQuICBBbHQgaSB3aW5zCisJICogIG92ZXIgYWx0IGkrMSBpZiBib3RoIHByZWRpY2F0ZXMgYXJlIHRydWUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJlZGljYXRlVHJhbnNpdGlvbnMoREZBU3RhdGUgZCkgeworCQlMaXN0IGNvbmZpZ3NXaXRoUHJlZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCS8vIGdldCBhIGxpc3Qgb2YgYWxsIGNvbmZpZ3Mgd2l0aCBwcmVkaWNhdGVzCisJCWludCBudW1Db25maWdzID0gZC5uZmFDb25maWd1cmF0aW9ucy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisJCQlORkFDb25maWd1cmF0aW9uIGMgPSAoTkZBQ29uZmlndXJhdGlvbilkLm5mYUNvbmZpZ3VyYXRpb25zLmdldChpKTsKKwkJCWlmICggYy5yZXNvbHZlV2l0aFByZWRpY2F0ZSApIHsKKwkJCQljb25maWdzV2l0aFByZWRzLmFkZChjKTsKKwkJCX0KKwkJfQorCQkvLyBTb3J0IGFzY2VuZGluZyBhY2NvcmRpbmcgdG8gYWx0OyBhbHQgaSBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBpKzEKKwkJQ29sbGVjdGlvbnMuc29ydChjb25maWdzV2l0aFByZWRzLAorCQkJIG5ldyBDb21wYXJhdG9yKCkgeworCQkJCSBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisJCQkJCSBORkFDb25maWd1cmF0aW9uIGNhID0gKE5GQUNvbmZpZ3VyYXRpb24pYTsKKwkJCQkJIE5GQUNvbmZpZ3VyYXRpb24gY2IgPSAoTkZBQ29uZmlndXJhdGlvbiliOworCQkJCQkgaWYgKCBjYS5hbHQgPCBjYi5hbHQgKSByZXR1cm4gLTE7CisJCQkJCSBlbHNlIGlmICggY2EuYWx0ID4gY2IuYWx0ICkgcmV0dXJuIDE7CisJCQkJCSByZXR1cm4gMDsKKwkJCQkgfQorCQkJIH0pOworCQlMaXN0IHByZWRDb25maWdzU29ydGVkQnlBbHQgPSBjb25maWdzV2l0aFByZWRzOworCQkvLyBOb3csIHdlIGNhbiBhZGQgZWRnZXMgZW1hbmF0aW5nIGZyb20gZCBmb3IgdGhlc2UgcHJlZHMgaW4gcmlnaHQgb3JkZXIKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVkQ29uZmlnc1NvcnRlZEJ5QWx0LnNpemUoKTsgaSsrKSB7CisJCQlORkFDb25maWd1cmF0aW9uIGMgPSAoTkZBQ29uZmlndXJhdGlvbilwcmVkQ29uZmlnc1NvcnRlZEJ5QWx0LmdldChpKTsKKwkJCURGQVN0YXRlIHByZWRERkFUYXJnZXQgPSBkLmRmYS5nZXRBY2NlcHRTdGF0ZShjLmFsdCk7CisJCQlpZiAoIHByZWRERkFUYXJnZXQ9PW51bGwgKSB7CisJCQkJcHJlZERGQVRhcmdldCA9IGRmYS5uZXdTdGF0ZSgpOyAvLyBjcmVhdGUgaWYgbm90IHRoZXJlLgorCQkJCS8vIGNyZWF0ZSBhIG5ldyBERkEgc3RhdGUgdGhhdCBpcyBhIHRhcmdldCBvZiB0aGUgcHJlZGljYXRlIGZyb20gZAorCQkJCXByZWRERkFUYXJnZXQuYWRkTkZBQ29uZmlndXJhdGlvbihkZmEubmZhLmdldFN0YXRlKGMuc3RhdGUpLAorCQkJCQkJCQkJCQkJICBjLmFsdCwKKwkJCQkJCQkJCQkJCSAgYy5jb250ZXh0LAorCQkJCQkJCQkJCQkJICBjLnNlbWFudGljQ29udGV4dCk7CisJCQkJcHJlZERGQVRhcmdldC5zZXRBY2NlcHRTdGF0ZSh0cnVlKTsKKwkJCQlkZmEuc2V0QWNjZXB0U3RhdGUoYy5hbHQsIHByZWRERkFUYXJnZXQpOworCQkJCURGQVN0YXRlIGV4aXN0aW5nU3RhdGUgPSBkZmEuYWRkU3RhdGUocHJlZERGQVRhcmdldCk7CisJCQkJaWYgKCBwcmVkREZBVGFyZ2V0ICE9IGV4aXN0aW5nU3RhdGUgKSB7CisJCQkJCS8vIGFscmVhZHkgdGhlcmUuLi51c2UvcmV0dXJuIHRoZSBleGlzdGluZyBERkEgc3RhdGUgdGhhdAorCQkJCQkvLyBpcyBhIHRhcmdldCBvZiB0aGlzIHByZWRpY2F0ZS4gIE1ha2UgdGhpcyBzdGF0ZSBudW1iZXIKKwkJCQkJLy8gcG9pbnQgYXQgdGhlIGV4aXN0aW5nIHN0YXRlCisJCQkJCWRmYS5zZXRTdGF0ZShwcmVkREZBVGFyZ2V0LnN0YXRlTnVtYmVyLCBleGlzdGluZ1N0YXRlKTsKKwkJCQkJcHJlZERGQVRhcmdldCA9IGV4aXN0aW5nU3RhdGU7CisJCQkJfQorCQkJfQorCQkJLy8gYWRkIGEgdHJhbnNpdGlvbiB0byBwcmVkIHRhcmdldCBmcm9tIGQKKwkJCWQuYWRkVHJhbnNpdGlvbihwcmVkREZBVGFyZ2V0LCBuZXcgUHJlZGljYXRlTGFiZWwoYy5zZW1hbnRpY0NvbnRleHQpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0VHJlZXMoaW50IG51bWJlck9mQWx0cykgeworICAgICAgICBjb250ZXh0VHJlZXMgPSBuZXcgTkZBQ29udGV4dFtudW1iZXJPZkFsdHNdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRUcmVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IGFsdCA9IGkrMTsKKyAgICAgICAgICAgIC8vIGFkZCBhIGR1bW15IHJvb3Qgbm9kZSBzbyB0aGF0IGFuIE5GQSBjb25maWd1cmF0aW9uIGNhbgorICAgICAgICAgICAgLy8gYWx3YXlzIHBvaW50IGF0IGFuIE5GQUNvbnRleHQuICBJZiBhIGNvbnRleHQgcmVmZXJzIHRvIHRoaXMKKyAgICAgICAgICAgIC8vIG5vZGUgdGhlbiBpdCBpbXBsaWVzIHRoZXJlIGlzIG5vIGNhbGwgc3RhY2sgZm9yCisgICAgICAgICAgICAvLyB0aGF0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGNvbnRleHRUcmVlc1tpXSA9IG5ldyBORkFDb250ZXh0KG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisJcHVibGljIHN0YXRpYyBpbnQgbWF4KFNldCBzKSB7CisJCWlmICggcz09bnVsbCApIHsKKwkJCXJldHVybiBJbnRlZ2VyLk1JTl9WQUxVRTsKKwkJfQorCQlpbnQgaSA9IDA7CisJCWludCBtID0gMDsKKwkJZm9yIChJdGVyYXRvciBpdCA9IHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJaSsrOworCQkJSW50ZWdlciBJID0gKEludGVnZXIpIGl0Lm5leHQoKTsKKwkJCWlmICggaT09MSApIHsgLy8gaW5pdCBtIHdpdGggZmlyc3QgdmFsdWUKKwkJCQltID0gSS5pbnRWYWx1ZSgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCBJLmludFZhbHVlKCk+bSApIHsKKwkJCQltID0gSS5pbnRWYWx1ZSgpOworCQkJfQorCQl9CisJCXJldHVybiBtOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL05vbkxMU3RhckRlY2lzaW9uRXhjZXB0aW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9Ob25MTFN0YXJEZWNpc2lvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWI0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9Ob25MTFN0YXJEZWNpc2lvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKKy8qKiBVc2VkIHRvIGFib3J0IERGQSBjb25zdHJ1Y3Rpb24gd2hlbiB3ZSBmaW5kIG5vbi1MTCgqKSBkZWNpc2lvbjsgaS5lLiwKKyAqICBhIGRlY2lzaW9uIHRoYXQgaGFzIHJlY3Vyc2lvbiBpbiBtb3JlIHRoYW4gYSBzaW5nbGUgYWx0LgorICovCitwdWJsaWMgY2xhc3MgTm9uTExTdGFyRGVjaXNpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKwlwdWJsaWMgREZBIGFib3J0ZWRERkE7CisJcHVibGljIE5vbkxMU3RhckRlY2lzaW9uRXhjZXB0aW9uKERGQSBhYm9ydGVkREZBKSB7CisJCXRoaXMuYWJvcnRlZERGQSA9IGFib3J0ZWRERkE7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvUHJlZGljYXRlTGFiZWwuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1ByZWRpY2F0ZUxhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1MmY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1ByZWRpY2F0ZUxhYmVsLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5hbmFseXNpczsKKworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hckFTVDsKKworcHVibGljIGNsYXNzIFByZWRpY2F0ZUxhYmVsIGV4dGVuZHMgTGFiZWwgeworCS8qKiBBIHRyZWUgb2Ygc2VtYW50aWMgcHJlZGljYXRlcyBmcm9tIHRoZSBncmFtbWFyIEFTVCBpZiBsYWJlbD09U0VNUFJFRC4KKwkgKiAgSW4gdGhlIE5GQSwgbGFiZWxzIHdpbGwgYWx3YXlzIGJlIGV4YWN0bHkgb25lIHByZWRpY2F0ZSwgYnV0IHRoZSBERkEKKwkgKiAgbWF5IGhhdmUgdG8gY29tYmluZSBhIGJ1bmNoIG9mIHRoZW0gYXMgaXQgY29sbGVjdHMgcHJlZGljYXRlcyBmcm9tCisJICogIG11bHRpcGxlIE5GQSBjb25maWd1cmF0aW9ucyBpbnRvIGEgc2luZ2xlIERGQSBzdGF0ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgU2VtYW50aWNDb250ZXh0IHNlbWFudGljQ29udGV4dDsKKwkKKwkvKiogTWFrZSBhIHNlbWFudGljIHByZWRpY2F0ZSBsYWJlbCAqLworCXB1YmxpYyBQcmVkaWNhdGVMYWJlbChHcmFtbWFyQVNUIHByZWRpY2F0ZUFTVE5vZGUpIHsKKwkJc3VwZXIoU0VNUFJFRCk7CisJCXRoaXMuc2VtYW50aWNDb250ZXh0ID0gbmV3IFNlbWFudGljQ29udGV4dC5QcmVkaWNhdGUocHJlZGljYXRlQVNUTm9kZSk7CisJfQorCisJLyoqIE1ha2UgYSBzZW1hbnRpYyBwcmVkaWNhdGVzIGxhYmVsICovCisJcHVibGljIFByZWRpY2F0ZUxhYmVsKFNlbWFudGljQ29udGV4dCBzZW1DdHgpIHsKKwkJc3VwZXIoU0VNUFJFRCk7CisJCXRoaXMuc2VtYW50aWNDb250ZXh0ID0gc2VtQ3R4OworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBzZW1hbnRpY0NvbnRleHQuaGFzaENvZGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYgKCBvPT1udWxsICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICggdGhpcyA9PSBvICkgeworCQkJcmV0dXJuIHRydWU7IC8vIGVxdWFscyBpZiBzYW1lIG9iamVjdAorCQl9CisJCWlmICggIShvIGluc3RhbmNlb2YgUHJlZGljYXRlTGFiZWwpICkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBzZW1hbnRpY0NvbnRleHQuZXF1YWxzKCgoUHJlZGljYXRlTGFiZWwpbykuc2VtYW50aWNDb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NlbWFudGljUHJlZGljYXRlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgU2VtYW50aWNDb250ZXh0IGdldFNlbWFudGljQ29udGV4dCgpIHsKKwkJcmV0dXJuIHNlbWFudGljQ29udGV4dDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gInsiK3NlbWFudGljQ29udGV4dCsifT8iOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoR3JhbW1hciBnKSB7CisJCXJldHVybiB0b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1J1bGVDbG9zdXJlVHJhbnNpdGlvbi5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvUnVsZUNsb3N1cmVUcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0OWRiNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1J1bGVDbG9zdXJlVHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5SdWxlOworCisvKiogQSB0cmFuc2l0aW9uIHVzZWQgdG8gcmVmZXJlbmNlIGFub3RoZXIgcnVsZS4gIEl0IHRyYWNrcyB0d28gdGFyZ2V0cworICogIHJlYWxseTogdGhlIGFjdHVhbCB0cmFuc2l0aW9uIHRhcmdldCBhbmQgdGhlIHN0YXRlIGZvbGxvd2luZyB0aGUKKyAqICBzdGF0ZSB0aGF0IHJlZmVycyB0byB0aGUgb3RoZXIgcnVsZS4gIENvbnZlcnNpb24gb2YgYW4gTkZBIHRoYXQKKyAqICBmYWxscyBvZmYgdGhlIGVuZCBvZiBhIHJ1bGUgd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQgd2hvIGludm9rZWQKKyAqICB0aGF0IHJ1bGUgYmVjYXVzZSBvZiB0aGVzZSBzcGVjaWFsIHRyYW5zaXRpb25zLgorICovCitwdWJsaWMgY2xhc3MgUnVsZUNsb3N1cmVUcmFuc2l0aW9uIGV4dGVuZHMgVHJhbnNpdGlvbiB7CisJLyoqIFB0ciB0byB0aGUgcnVsZSBkZWZpbml0aW9uIG9iamVjdCBmb3IgdGhpcyBydWxlIHJlZiAqLworCXB1YmxpYyBSdWxlIHJ1bGU7CisKKwkvKiogV2hhdCBub2RlIHRvIGJlZ2luIGNvbXB1dGF0aW9ucyBmb2xsb3dpbmcgcmVmIHRvIHJ1bGUgKi8KKyAgICBwdWJsaWMgTkZBU3RhdGUgZm9sbG93U3RhdGU7CisKKyAgICBwdWJsaWMgUnVsZUNsb3N1cmVUcmFuc2l0aW9uKFJ1bGUgcnVsZSwKKwkJCQkJCQkJIE5GQVN0YXRlIHJ1bGVTdGFydCwKKwkJCQkJCQkJIE5GQVN0YXRlIGZvbGxvd1N0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIoTGFiZWwuRVBTSUxPTiwgcnVsZVN0YXJ0KTsKKyAgICAgICAgdGhpcy5ydWxlID0gcnVsZTsKKyAgICAgICAgdGhpcy5mb2xsb3dTdGF0ZSA9IGZvbGxvd1N0YXRlOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvU2VtYW50aWNDb250ZXh0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9TZW1hbnRpY0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODJkZTMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvU2VtYW50aWNDb250ZXh0LmphdmEKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIuYW5hbHlzaXM7CisKK2ltcG9ydCBvcmcuYW50bHIuY29kZWdlbi5Db2RlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFOVExSUGFyc2VyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hckFTVDsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqIEEgYmluYXJ5IHRyZWUgc3RydWN0dXJlIHVzZWQgdG8gcmVjb3JkIHRoZSBzZW1hbnRpYyBjb250ZXh0IGluIHdoaWNoCisgKiAgYW4gTkZBIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQuICBJdCdzIGVpdGhlciBhIHNpbmdsZSBwcmVkaWNhdGUgb3IKKyAqICBhIHRyZWUgcmVwcmVzZW50aW5nIGFuIG9wZXJhdGlvbiB0cmVlIHN1Y2ggYXM6IHAxJiZwMiBvciBwMXx8cDIuCisgKgorICogIEZvciBORkEgby1wMS0+by1wMi0+bywgY3JlYXRlIHRyZWUgQU5EKHAxLHAyKS4KKyAqICBGb3IgTkZBICgxKS1wMS0+KDIpCisgKiAgICAgICAgICAgfCAgICAgICBeCisgKiAgICAgICAgICAgfCAgICAgICB8CisgKiAgICAgICAgICAoMyktcDItLS0tCisgKiAgd2Ugd2lsbCBoYXZlIHRvIGNvbWJpbmUgcDEgYW5kIHAyIGludG8gREZBIHN0YXRlIGFzIHdlIHdpbGwgYmUKKyAqICBhZGRpbmcgTkZBIGNvbmZpZ3VyYXRpb25zIGZvciBzdGF0ZSAyIHdpdGggdHdvIHByZWRpY2F0ZXMgcDEscDIuCisgKiAgU28sIHNldCBjb250ZXh0IGZvciBjb21iaW5lZCBORkEgY29uZmlnIGZvciBzdGF0ZSAyOiBPUihwMSxwMikuCisgKgorICogIEkgaGF2ZSBzY29wZWQgdGhlIEFORCwgTk9ULCBPUiwgYW5kIFByZWRpY2F0ZSBzdWJjbGFzc2VzIG9mCisgKiAgU2VtYW50aWNDb250ZXh0IHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyBvdXRlciBjbGFzcy4KKyAqCisgKiAgSnVseSA3LCAyMDA2OiBUSlAgYWx0ZXJlZCBPUiB0byBiZSBzZXQgb2Ygb3BlcmFuZHMuIHRoZSBCaW5hcnkgdHJlZQorICogIG1hZGUgaXQgcmVhbGx5IGhhcmQgdG8gcmVkdWNlIGNvbXBsaWNhdGVkIHx8IHNlcXVlbmNlcyB0byB0aGVpciBtaW5pbXVtLgorICogIEdvdCBodWdlIHJlcGVhdGVkIHx8IGNvbmRpdGlvbnMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZW1hbnRpY0NvbnRleHQgeworCS8qKiBDcmVhdGUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2VtYW50aWMgY29udGV4dCBzaGFyZWQgYW1vbmcgYWxsCisJICogIE5GQUNvbmZpZ3VyYXRpb25zIHRoYXQgZG8gbm90IGhhdmUgYW4gYWN0dWFsIHNlbWFudGljIGNvbnRleHQuCisJICogIFRoaXMgcHJldmVudHMgbG90cyBvZiBpZiE9bnVsbCB0eXBlIGNoZWNrcyBhbGwgb3ZlcjsgaXQgcmVwcmVzZW50cworCSAqICBqdXN0IGFuIGVtcHR5IHNldCBvZiBwcmVkaWNhdGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VtYW50aWNDb250ZXh0IEVNUFRZX1NFTUFOVElDX0NPTlRFWFQgPSBuZXcgUHJlZGljYXRlKFByZWRpY2F0ZS5JTlZBTElEX1BSRURfVkFMVUUpOworCisJLyoqIEdpdmVuIGEgc2VtYW50aWMgY29udGV4dCBleHByZXNzaW9uIHRyZWUsIHJldHVybiBhIHRyZWUgd2l0aCBhbGwKKwkgKiAgbm9uZ2F0ZWQgcHJlZGljYXRlcyBzZXQgdG8gdHJ1ZSBhbmQgdGhlbiByZWR1Y2VkLiAgU28gcCYmKHF8fHIpIHdvdWxkCisJICogIHJldHVybiBwJiZyIGlmIHEgaXMgbm9uZ2F0ZWQgYnV0IHAgYW5kIHIgYXJlIGdhdGVkLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBTZW1hbnRpY0NvbnRleHQgZ2V0R2F0ZWRQcmVkaWNhdGVDb250ZXh0KCk7CisKKwkvKiogR2VuZXJhdGUgYW4gZXhwcmVzc2lvbiB0aGF0IHdpbGwgZXZhbHVhdGUgdGhlIHNlbWFudGljIGNvbnRleHQsCisJICogIGdpdmVuIGEgc2V0IG9mIG91dHB1dCB0ZW1wbGF0ZXMuCisJICovCisJcHVibGljIGFic3RyYWN0IFNUIGdlbkV4cHIoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkJICAgU1RHcm91cCB0ZW1wbGF0ZXMsCisJCQkJCQkJCQkJICAgREZBIGRmYSk7CisKKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNVc2VyU2VtYW50aWNQcmVkaWNhdGUoKTsgLy8gdXNlci1zcGVjaWZpZWQgc2VtcHJlZCB7fT8gb3Ige30/PT4KKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1N5bnRhY3RpY1ByZWRpY2F0ZSgpOworCisJLyoqIE5vdGlmeSB0aGUgaW5kaWNhdGVkIGdyYW1tYXIgb2YgYW55IHN5biBwcmVkcyB1c2VkIHdpdGhpbiB0aGlzIGNvbnRleHQgKi8KKwlwdWJsaWMgdm9pZCB0cmFja1VzZU9mU3ludGFjdGljUHJlZGljYXRlcyhHcmFtbWFyIGcpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByZWRpY2F0ZSBleHRlbmRzIFNlbWFudGljQ29udGV4dCB7CisJCS8qKiBUaGUgQVNUIG5vZGUgaW4gdHJlZSBjcmVhdGVkIGZyb20gdGhlIGdyYW1tYXIgaG9sZGluZyB0aGUgcHJlZGljYXRlICovCisJCXB1YmxpYyBHcmFtbWFyQVNUIHByZWRpY2F0ZUFTVDsKKworCQkvKiogSXMgdGhpcyBhIHsuLi59Pz0+IGdhdGluZyBwcmVkaWNhdGUgb3IgYSBub3JtYWwgZGlzYW1iaWd1YXRpbmcgey4ufT8KKwkJICogIElmIGFueSBwcmVkaWNhdGUgaW4gZXhwcmVzc2lvbiBpcyBnYXRlZCwgdGhlbiBleHByZXNzaW9uIGlzIGNvbnNpZGVyZWQKKwkJICogIGdhdGVkLgorCQkgKgorCQkgKiAgVGhlIHNpbXBsZSBQcmVkaWNhdGUgb2JqZWN0J3MgcHJlZGljYXRlIEFTVCdzIHR5cGUgaXMgdXNlZCB0byBzZXQKKwkJICogIGdhdGVkIHRvIHRydWUgaWYgdHlwZT09R0FURURfU0VNUFJFRC4KKwkJICovCisJCXByb3RlY3RlZCBib29sZWFuIGdhdGVkID0gZmFsc2U7CisKKwkJLyoqIHN5bnRhY3RpYyBwcmVkaWNhdGVzIGFyZSBjb252ZXJ0ZWQgdG8gc2VtYW50aWMgcHJlZGljYXRlcworCQkgKiAgYnV0IHN5bnByZWRzIGFyZSBnZW5lcmF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkuCisJCSAqLworCQlwcm90ZWN0ZWQgYm9vbGVhbiBzeW5wcmVkID0gZmFsc2U7CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QUkVEX1ZBTFVFID0gLTI7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBTFNFX1BSRUQgPSAwOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVFX1BSRUQgPSB+MDsKKworCQkvKiogc29tZXRpbWVzIHByZWRpY2F0ZXMgYXJlIGtub3duIHRvIGJlIHRydWUgb3IgZmFsc2U7IHdlIG5lZWQKKwkJICogIGEgd2F5IHRvIHJlcHJlc2VudCB0aGlzIHdpdGhvdXQgcmVzb3J0aW5nIHRvIGEgdGFyZ2V0IGxhbmd1YWdlCisJCSAqICB2YWx1ZSBsaWtlIHRydWUgb3IgVFJVRS4KKwkJICovCisJCXByb3RlY3RlZCBpbnQgY29uc3RhbnRWYWx1ZSA9IElOVkFMSURfUFJFRF9WQUxVRTsKKworCQlwdWJsaWMgUHJlZGljYXRlKGludCBjb25zdGFudFZhbHVlKSB7CisJCQlwcmVkaWNhdGVBU1QgPSBuZXcgR3JhbW1hckFTVCgpOworCQkJdGhpcy5jb25zdGFudFZhbHVlPWNvbnN0YW50VmFsdWU7CisJCX0KKworCQlwdWJsaWMgUHJlZGljYXRlKEdyYW1tYXJBU1QgcHJlZGljYXRlKSB7CisJCQl0aGlzLnByZWRpY2F0ZUFTVCA9IHByZWRpY2F0ZTsKKwkJCXRoaXMuZ2F0ZWQgPQorCQkJCXByZWRpY2F0ZS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkdBVEVEX1NFTVBSRUQgfHwKKwkJCQlwcmVkaWNhdGUuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5TWU5fU0VNUFJFRCA7CisJCQl0aGlzLnN5bnByZWQgPQorCQkJCXByZWRpY2F0ZS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlNZTl9TRU1QUkVEIHx8CisJCQkJcHJlZGljYXRlLmdldFR5cGUoKT09QU5UTFJQYXJzZXIuQkFDS1RSQUNLX1NFTVBSRUQ7CisJCX0KKworCQlwdWJsaWMgUHJlZGljYXRlKFByZWRpY2F0ZSBwKSB7CisJCQl0aGlzLnByZWRpY2F0ZUFTVCA9IHAucHJlZGljYXRlQVNUOworCQkJdGhpcy5nYXRlZCA9IHAuZ2F0ZWQ7CisJCQl0aGlzLnN5bnByZWQgPSBwLnN5bnByZWQ7CisJCQl0aGlzLmNvbnN0YW50VmFsdWUgPSBwLmNvbnN0YW50VmFsdWU7CisJCX0KKworCQkvKiogVHdvIHByZWRpY2F0ZXMgYXJlIHRoZSBzYW1lIGlmIHRoZXkgYXJlIGxpdGVyYWxseSB0aGUgc2FtZQorCQkgKiAgdGV4dCByYXRoZXIgdGhhbiBzYW1lIG5vZGUgaW4gdGhlIGdyYW1tYXIncyBBU1QuCisJCSAqICBPciwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlLCByZXR1cm4gZXF1YWwuCisJCSAqICBBcyBvZiBKdWx5IDIwMDYgSSdtIG5vdCBzdXJlIHRoZXNlIGFyZSBuZWVkZWQuCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJCWlmICggIShvIGluc3RhbmNlb2YgUHJlZGljYXRlKSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCVByZWRpY2F0ZSBvdGhlciA9IChQcmVkaWNhdGUpbzsKKwkJCWlmICh0aGlzLmNvbnN0YW50VmFsdWUgIT0gb3RoZXIuY29uc3RhbnRWYWx1ZSl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpZiAodGhpcy5jb25zdGFudFZhbHVlICE9IElOVkFMSURfUFJFRF9WQUxVRSl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCXJldHVybiBwcmVkaWNhdGVBU1QuZ2V0VGV4dCgpLmVxdWFscyhvdGhlci5wcmVkaWNhdGVBU1QuZ2V0VGV4dCgpKTsKKwkJfQorCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQlpZiAoY29uc3RhbnRWYWx1ZSAhPSBJTlZBTElEX1BSRURfVkFMVUUpeworCQkJCXJldHVybiBjb25zdGFudFZhbHVlOworCQkJfQorCisJCQlpZiAoIHByZWRpY2F0ZUFTVCA9PW51bGwgKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCXJldHVybiBwcmVkaWNhdGVBU1QuZ2V0VGV4dCgpLmhhc2hDb2RlKCk7CisJCX0KKworCQlwdWJsaWMgU1QgZ2VuRXhwcihDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKwkJCQkJCQkJCSAgU1RHcm91cCB0ZW1wbGF0ZXMsCisJCQkJCQkJCQkgIERGQSBkZmEpCisJCXsKKwkJCVNUIGVTVCA9IG51bGw7CisJCQlpZiAoIHRlbXBsYXRlcyE9bnVsbCApIHsKKwkJCQlpZiAoIHN5bnByZWQgKSB7CisJCQkJCWVTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJldmFsU3luUHJlZGljYXRlIik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQllU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigiZXZhbFByZWRpY2F0ZSIpOworCQkJCQlnZW5lcmF0b3IuZ3JhbW1hci5kZWNpc2lvbnNXaG9zZURGQXNVc2VzU2VtUHJlZHMuYWRkKGRmYSk7CisJCQkJfQorCQkJCVN0cmluZyBwcmVkRW5jbG9zaW5nUnVsZU5hbWUgPSBwcmVkaWNhdGVBU1QuZW5jbG9zaW5nUnVsZU5hbWU7CisJCQkJLyoKKwkJCQlTdHJpbmcgZGVjaXNpb25FbmNsb3NpbmdSdWxlTmFtZSA9CisJCQkJCWRmYS5nZXRORkFEZWNpc2lvblN0YXJ0U3RhdGUoKS5nZXRFbmNsb3NpbmdSdWxlKCk7CisJCQkJLy8gaWYgdGhlc2UgcnVsZW5hbWVzIGFyZSBkaWZmLCB0aGVuIHByZWQgd2FzIGhvaXN0ZWQgb3V0IG9mIHJ1bGUKKwkJCQkvLyBDdXJyZW50bHkgSSBkb24ndCB3YXJuIHlvdSBhYm91dCB0aGlzIGFzIGl0IGNvdWxkIGJlIGFubm95aW5nLgorCQkJCS8vIEkgZG8gdGhlIHRyYW5zbGF0aW9uIGFueXdheS4KKwkJCQkqLworCQkJCS8vZVNULmFkZCgicHJlZCIsIHRoaXMudG9TdHJpbmcoKSk7CisJCQkJaWYgKCBnZW5lcmF0b3IhPW51bGwgKSB7CisJCQkJCWVTVC5hZGQoInByZWQiLAorCQkJCQkJCQkJIGdlbmVyYXRvci50cmFuc2xhdGVBY3Rpb24ocHJlZEVuY2xvc2luZ1J1bGVOYW1lLHByZWRpY2F0ZUFTVCkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCWVTVCA9IG5ldyBTVCgiPHByZWQ+Iik7CisJCQkJZVNULmFkZCgicHJlZCIsIHRoaXMudG9TdHJpbmcoKSk7CisJCQkJcmV0dXJuIGVTVDsKKwkJCX0KKwkJCWlmICggZ2VuZXJhdG9yIT1udWxsICkgeworCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9CisJCQkJCWdlbmVyYXRvci50YXJnZXQuZ2V0VGFyZ2V0U3RyaW5nTGl0ZXJhbEZyb21TdHJpbmcodGhpcy50b1N0cmluZygpKTsKKwkJCQllU1QuYWRkKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJCX0KKwkJCXJldHVybiBlU1Q7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFNlbWFudGljQ29udGV4dCBnZXRHYXRlZFByZWRpY2F0ZUNvbnRleHQoKSB7CisJCQlpZiAoIGdhdGVkICkgeworCQkJCXJldHVybiB0aGlzOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaGFzVXNlclNlbWFudGljUHJlZGljYXRlKCkgeyAvLyB1c2VyLXNwZWNpZmllZCBzZW1wcmVkCisJCQlyZXR1cm4gcHJlZGljYXRlQVNUICE9bnVsbCAmJgorCQkJCSAgICggcHJlZGljYXRlQVNULmdldFR5cGUoKT09QU5UTFJQYXJzZXIuR0FURURfU0VNUFJFRCB8fAorCQkJCQkgcHJlZGljYXRlQVNULmdldFR5cGUoKT09QU5UTFJQYXJzZXIuU0VNUFJFRCApOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzU3ludGFjdGljUHJlZGljYXRlKCkgeworCQkJcmV0dXJuIHByZWRpY2F0ZUFTVCAhPW51bGwgJiYKKwkJCQkoIHByZWRpY2F0ZUFTVC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlNZTl9TRU1QUkVEIHx8CisJCQkJICBwcmVkaWNhdGVBU1QuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5CQUNLVFJBQ0tfU0VNUFJFRCApOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHRyYWNrVXNlT2ZTeW50YWN0aWNQcmVkaWNhdGVzKEdyYW1tYXIgZykgeworCQkJaWYgKCBzeW5wcmVkICkgeworCQkJCWcuc3luUHJlZE5hbWVzVXNlZEluREZBLmFkZChwcmVkaWNhdGVBU1QuZ2V0VGV4dCgpKTsKKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJaWYgKCBwcmVkaWNhdGVBU1QgPT1udWxsICkgeworCQkJCXJldHVybiAiPG5vcHJlZD4iOworCQkJfQorCQkJcmV0dXJuIHByZWRpY2F0ZUFTVC5nZXRUZXh0KCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFRydWVQcmVkaWNhdGUgZXh0ZW5kcyBQcmVkaWNhdGUgeworCQlwdWJsaWMgVHJ1ZVByZWRpY2F0ZSgpIHsKKwkJCXN1cGVyKFRSVUVfUFJFRCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFNUIGdlbkV4cHIoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkgIFNUR3JvdXAgdGVtcGxhdGVzLAorCQkJCQkJCQkJICBERkEgZGZhKQorCQl7CisJCQlpZiAoIHRlbXBsYXRlcyE9bnVsbCApIHsKKwkJCQlyZXR1cm4gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInRydWVfdmFsdWUiKTsKKwkJCX0KKwkJCXJldHVybiBuZXcgU1QoInRydWUiKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNVc2VyU2VtYW50aWNQcmVkaWNhdGUoKSB7CisJCQlyZXR1cm4gZmFsc2U7IC8vIG5vdCB1c2VyIHNwZWNpZmllZC4KKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJ0cnVlIjsgLy8gbm90IHVzZWQgZm9yIGNvZGUgZ2VuLCBqdXN0IERPVCBhbmQgcHJpbnQgb3V0cworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBGYWxzZVByZWRpY2F0ZSBleHRlbmRzIFByZWRpY2F0ZSB7CisJCXB1YmxpYyBGYWxzZVByZWRpY2F0ZSgpIHsKKwkJCXN1cGVyKEZBTFNFX1BSRUQpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTVCBnZW5FeHByKENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorCQkJCQkJCQkJICBTVEdyb3VwIHRlbXBsYXRlcywKKwkJCQkJCQkJCSAgREZBIGRmYSkKKwkJeworCQkJaWYgKCB0ZW1wbGF0ZXMhPW51bGwgKSB7CisJCQkJcmV0dXJuIHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJmYWxzZSIpOworCQkJfQorCQkJcmV0dXJuIG5ldyBTVCgiZmFsc2UiKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNVc2VyU2VtYW50aWNQcmVkaWNhdGUoKSB7CisJCQlyZXR1cm4gZmFsc2U7IC8vIG5vdCB1c2VyIHNwZWNpZmllZC4KKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJmYWxzZSI7IC8vIG5vdCB1c2VkIGZvciBjb2RlIGdlbiwganVzdCBET1QgYW5kIHByaW50IG91dHMKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29tbXV0YXRpdmVQcmVkaWNhdGUgZXh0ZW5kcyBTZW1hbnRpY0NvbnRleHQgeworCQlwcm90ZWN0ZWQgZmluYWwgU2V0PFNlbWFudGljQ29udGV4dD4gb3BlcmFuZHMgPSBuZXcgSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+KCk7CisJCXByb3RlY3RlZCBpbnQgaGFzaGNvZGU7CisKKwkJcHVibGljIENvbW11dGF0aXZlUHJlZGljYXRlKFNlbWFudGljQ29udGV4dCBhLCBTZW1hbnRpY0NvbnRleHQgYikgeworCQkJaWYgKGEuZ2V0Q2xhc3MoKSA9PSB0aGlzLmdldENsYXNzKCkpeworCQkJCUNvbW11dGF0aXZlUHJlZGljYXRlIHByZWRpY2F0ZSA9IChDb21tdXRhdGl2ZVByZWRpY2F0ZSlhOworCQkJCW9wZXJhbmRzLmFkZEFsbChwcmVkaWNhdGUub3BlcmFuZHMpOworCQkJfSBlbHNlIHsKKwkJCQlvcGVyYW5kcy5hZGQoYSk7CisJCQl9CisKKwkJCWlmIChiLmdldENsYXNzKCkgPT0gdGhpcy5nZXRDbGFzcygpKXsKKwkJCQlDb21tdXRhdGl2ZVByZWRpY2F0ZSBwcmVkaWNhdGUgPSAoQ29tbXV0YXRpdmVQcmVkaWNhdGUpYjsKKwkJCQlvcGVyYW5kcy5hZGRBbGwocHJlZGljYXRlLm9wZXJhbmRzKTsKKwkJCX0gZWxzZSB7CisJCQkJb3BlcmFuZHMuYWRkKGIpOworCQkJfQorCisJCQloYXNoY29kZSA9IGNhbGN1bGF0ZUhhc2hDb2RlKCk7CisJCX0KKworCQlwdWJsaWMgQ29tbXV0YXRpdmVQcmVkaWNhdGUoSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+IGNvbnRleHRzKXsKKwkJCWZvciAoU2VtYW50aWNDb250ZXh0IGNvbnRleHQgOiBjb250ZXh0cyl7CisJCQkJaWYgKGNvbnRleHQuZ2V0Q2xhc3MoKSA9PSB0aGlzLmdldENsYXNzKCkpeworCQkJCQlDb21tdXRhdGl2ZVByZWRpY2F0ZSBwcmVkaWNhdGUgPSAoQ29tbXV0YXRpdmVQcmVkaWNhdGUpY29udGV4dDsKKwkJCQkJb3BlcmFuZHMuYWRkQWxsKHByZWRpY2F0ZS5vcGVyYW5kcyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3BlcmFuZHMuYWRkKGNvbnRleHQpOworCQkJCX0KKwkJCX0KKworCQkJaGFzaGNvZGUgPSBjYWxjdWxhdGVIYXNoQ29kZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTZW1hbnRpY0NvbnRleHQgZ2V0R2F0ZWRQcmVkaWNhdGVDb250ZXh0KCkgeworCQkJU2VtYW50aWNDb250ZXh0IHJlc3VsdCA9IG51bGw7CisJCQlmb3IgKFNlbWFudGljQ29udGV4dCBzZW1jdHggOiBvcGVyYW5kcykgeworCQkJCVNlbWFudGljQ29udGV4dCBnYXRlZFByZWQgPSBzZW1jdHguZ2V0R2F0ZWRQcmVkaWNhdGVDb250ZXh0KCk7CisJCQkJaWYgKCBnYXRlZFByZWQhPW51bGwgKSB7CisJCQkJCXJlc3VsdCA9IGNvbWJpbmVQcmVkaWNhdGVzKHJlc3VsdCwgZ2F0ZWRQcmVkKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGhhc1VzZXJTZW1hbnRpY1ByZWRpY2F0ZSgpIHsKKwkJCWZvciAoU2VtYW50aWNDb250ZXh0IHNlbWN0eCA6IG9wZXJhbmRzKSB7CisJCQkJaWYgKCBzZW1jdHguaGFzVXNlclNlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc1N5bnRhY3RpY1ByZWRpY2F0ZSgpIHsKKwkJCWZvciAoU2VtYW50aWNDb250ZXh0IHNlbWN0eCA6IG9wZXJhbmRzKSB7CisJCQkJaWYgKCBzZW1jdHguaXNTeW50YWN0aWNQcmVkaWNhdGUoKSApIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHRyYWNrVXNlT2ZTeW50YWN0aWNQcmVkaWNhdGVzKEdyYW1tYXIgZykgeworCQkJZm9yIChTZW1hbnRpY0NvbnRleHQgc2VtY3R4IDogb3BlcmFuZHMpIHsKKwkJCQlzZW1jdHgudHJhY2tVc2VPZlN5bnRhY3RpY1ByZWRpY2F0ZXMoZyk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJCWlmICh0aGlzID09IG9iaikKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQkJaWYgKG9iai5nZXRDbGFzcygpID09IHRoaXMuZ2V0Q2xhc3MoKSkgeworCQkJCUNvbW11dGF0aXZlUHJlZGljYXRlIGNvbW11dGF0aXZlID0gKENvbW11dGF0aXZlUHJlZGljYXRlKW9iajsKKwkJCQlTZXQ8U2VtYW50aWNDb250ZXh0PiBvdGhlck9wZXJhbmRzID0gY29tbXV0YXRpdmUub3BlcmFuZHM7CisJCQkJaWYgKG9wZXJhbmRzLnNpemUoKSAhPSBvdGhlck9wZXJhbmRzLnNpemUoKSkKKwkJCQkJcmV0dXJuIGZhbHNlOworCisJCQkJcmV0dXJuIG9wZXJhbmRzLmNvbnRhaW5zQWxsKG90aGVyT3BlcmFuZHMpOworCQkJfQorCisJCQlpZiAob2JqIGluc3RhbmNlb2YgTk9UKQorCQkJeworCQkJCU5PVCBub3QgPSAoTk9UKW9iajsKKwkJCQlpZiAobm90LmN0eCBpbnN0YW5jZW9mIENvbW11dGF0aXZlUHJlZGljYXRlICYmIG5vdC5jdHguZ2V0Q2xhc3MoKSAhPSB0aGlzLmdldENsYXNzKCkpIHsKKwkJCQkJU2V0PFNlbWFudGljQ29udGV4dD4gb3RoZXJPcGVyYW5kcyA9ICgoQ29tbXV0YXRpdmVQcmVkaWNhdGUpbm90LmN0eCkub3BlcmFuZHM7CisJCQkJCWlmIChvcGVyYW5kcy5zaXplKCkgIT0gb3RoZXJPcGVyYW5kcy5zaXplKCkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCQkJQXJyYXlMaXN0PFNlbWFudGljQ29udGV4dD4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8U2VtYW50aWNDb250ZXh0PihvcGVyYW5kcy5zaXplKCkpOworCQkJCQlmb3IgKFNlbWFudGljQ29udGV4dCBjb250ZXh0IDogb3RoZXJPcGVyYW5kcykgeworCQkJCQkJdGVtcC5hZGQobm90KGNvbnRleHQpKTsKKwkJCQkJfQorCisJCQkJCXJldHVybiBvcGVyYW5kcy5jb250YWluc0FsbCh0ZW1wKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCl7CisJCQlyZXR1cm4gaGFzaGNvZGU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlidWYuYXBwZW5kKCIoIik7CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKFNlbWFudGljQ29udGV4dCBzZW1jdHggOiBvcGVyYW5kcykgeworCQkJCWlmICggaT4wICkgeworCQkJCQlidWYuYXBwZW5kKGdldE9wZXJhbmRTdHJpbmcoKSk7CisJCQkJfQorCQkJCWJ1Zi5hcHBlbmQoc2VtY3R4LnRvU3RyaW5nKCkpOworCQkJCWkrKzsKKwkJCX0KKwkJCWJ1Zi5hcHBlbmQoIikiKTsKKwkJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwkJfQorCisJCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0T3BlcmFuZFN0cmluZygpOworCisJCXB1YmxpYyBhYnN0cmFjdCBTZW1hbnRpY0NvbnRleHQgY29tYmluZVByZWRpY2F0ZXMoU2VtYW50aWNDb250ZXh0IGxlZnQsIFNlbWFudGljQ29udGV4dCByaWdodCk7CisKKwkJcHVibGljIGFic3RyYWN0IGludCBjYWxjdWxhdGVIYXNoQ29kZSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgQU5EIGV4dGVuZHMgQ29tbXV0YXRpdmVQcmVkaWNhdGUgeworCQlwdWJsaWMgQU5EKFNlbWFudGljQ29udGV4dCBhLCBTZW1hbnRpY0NvbnRleHQgYikgeworCQkJc3VwZXIoYSxiKTsKKwkJfQorCisJCXB1YmxpYyBBTkQoSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+IGNvbnRleHRzKSB7CisJCQlzdXBlcihjb250ZXh0cyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFNUIGdlbkV4cHIoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkgIFNUR3JvdXAgdGVtcGxhdGVzLAorCQkJCQkJCQkJICBERkEgZGZhKQorCQl7CisJCQlTVCByZXN1bHQgPSBudWxsOworCQkJZm9yIChTZW1hbnRpY0NvbnRleHQgb3BlcmFuZCA6IG9wZXJhbmRzKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBvcGVyYW5kLmdlbkV4cHIoZ2VuZXJhdG9yLCB0ZW1wbGF0ZXMsIGRmYSk7CisKKwkJCQlTVCBlU1QgPSBudWxsOworCQkJCWlmICggdGVtcGxhdGVzIT1udWxsICkgeworCQkJCQllU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigiYW5kUHJlZGljYXRlcyIpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZVNUID0gbmV3IFNUKCIoPGxlZnQ+JiY8cmlnaHQ+KSIpOworCQkJCX0KKwkJCQllU1QuYWRkKCJsZWZ0IiwgcmVzdWx0KTsKKwkJCQllU1QuYWRkKCJyaWdodCIsIG9wZXJhbmQuZ2VuRXhwcihnZW5lcmF0b3IsdGVtcGxhdGVzLGRmYSkpOworCQkJCXJlc3VsdCA9IGVTVDsKKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIGdldE9wZXJhbmRTdHJpbmcoKSB7CisJCQlyZXR1cm4gIiYmIjsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU2VtYW50aWNDb250ZXh0IGNvbWJpbmVQcmVkaWNhdGVzKFNlbWFudGljQ29udGV4dCBsZWZ0LCBTZW1hbnRpY0NvbnRleHQgcmlnaHQpIHsKKwkJCXJldHVybiBTZW1hbnRpY0NvbnRleHQuYW5kKGxlZnQsIHJpZ2h0KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGNhbGN1bGF0ZUhhc2hDb2RlKCkgeworCQkJaW50IGhhc2hjb2RlID0gMDsKKwkJCWZvciAoU2VtYW50aWNDb250ZXh0IGNvbnRleHQgOiBvcGVyYW5kcykgeworCQkJCWhhc2hjb2RlID0gaGFzaGNvZGUgXiBjb250ZXh0Lmhhc2hDb2RlKCk7CisJCQl9CisKKwkJCXJldHVybiBoYXNoY29kZTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgT1IgZXh0ZW5kcyBDb21tdXRhdGl2ZVByZWRpY2F0ZSB7CisJCXB1YmxpYyBPUihTZW1hbnRpY0NvbnRleHQgYSwgU2VtYW50aWNDb250ZXh0IGIpIHsKKwkJCXN1cGVyKGEsYik7CisJCX0KKworCQlwdWJsaWMgT1IoSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+IGNvbnRleHRzKSB7CisJCQlzdXBlcihjb250ZXh0cyk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFNUIGdlbkV4cHIoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkgIFNUR3JvdXAgdGVtcGxhdGVzLAorCQkJCQkJCQkJICBERkEgZGZhKQorCQl7CisJCQlTVCBlU1QgPSBudWxsOworCQkJaWYgKCB0ZW1wbGF0ZXMhPW51bGwgKSB7CisJCQkJZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoIm9yUHJlZGljYXRlcyIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJZVNUID0gbmV3IFNUKCIoPGZpcnN0KG9wZXJhbmRzKT48cmVzdChvcGVyYW5kcyk6e28gfCB8fDxvPn0+KSIpOworCQkJfQorCQkJZm9yIChTZW1hbnRpY0NvbnRleHQgc2VtY3R4IDogb3BlcmFuZHMpIHsKKwkJCQllU1QuYWRkKCJvcGVyYW5kcyIsIHNlbWN0eC5nZW5FeHByKGdlbmVyYXRvcix0ZW1wbGF0ZXMsZGZhKSk7CisJCQl9CisJCQlyZXR1cm4gZVNUOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmFuZFN0cmluZygpIHsKKwkJCXJldHVybiAifHwiOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTZW1hbnRpY0NvbnRleHQgY29tYmluZVByZWRpY2F0ZXMoU2VtYW50aWNDb250ZXh0IGxlZnQsIFNlbWFudGljQ29udGV4dCByaWdodCkgeworCQkJcmV0dXJuIFNlbWFudGljQ29udGV4dC5vcihsZWZ0LCByaWdodCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBjYWxjdWxhdGVIYXNoQ29kZSgpIHsKKwkJCWludCBoYXNoY29kZSA9IDA7CisJCQlmb3IgKFNlbWFudGljQ29udGV4dCBjb250ZXh0IDogb3BlcmFuZHMpIHsKKwkJCQloYXNoY29kZSA9IH5oYXNoY29kZSBeIGNvbnRleHQuaGFzaENvZGUoKTsKKwkJCX0KKworCQkJcmV0dXJuIGhhc2hjb2RlOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBOT1QgZXh0ZW5kcyBTZW1hbnRpY0NvbnRleHQgeworCQlwcm90ZWN0ZWQgU2VtYW50aWNDb250ZXh0IGN0eDsKKwkJcHVibGljIE5PVChTZW1hbnRpY0NvbnRleHQgY3R4KSB7CisJCQl0aGlzLmN0eCA9IGN0eDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU1QgZ2VuRXhwcihDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKwkJCQkJCQkJCSAgU1RHcm91cCB0ZW1wbGF0ZXMsCisJCQkJCQkJCQkgIERGQSBkZmEpCisJCXsKKwkJCVNUIGVTVCA9IG51bGw7CisJCQlpZiAoIHRlbXBsYXRlcyE9bnVsbCApIHsKKwkJCQllU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigibm90UHJlZGljYXRlIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQllU1QgPSBuZXcgU1QoIiEoPHByZWQ+KSIpOworCQkJfQorCQkJZVNULmFkZCgicHJlZCIsIGN0eC5nZW5FeHByKGdlbmVyYXRvcix0ZW1wbGF0ZXMsZGZhKSk7CisJCQlyZXR1cm4gZVNUOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTZW1hbnRpY0NvbnRleHQgZ2V0R2F0ZWRQcmVkaWNhdGVDb250ZXh0KCkgeworCQkJU2VtYW50aWNDb250ZXh0IHAgPSBjdHguZ2V0R2F0ZWRQcmVkaWNhdGVDb250ZXh0KCk7CisJCQlpZiAoIHA9PW51bGwgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gbmV3IE5PVChwKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNVc2VyU2VtYW50aWNQcmVkaWNhdGUoKSB7CisJCQlyZXR1cm4gY3R4Lmhhc1VzZXJTZW1hbnRpY1ByZWRpY2F0ZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzU3ludGFjdGljUHJlZGljYXRlKCkgeworCQkJcmV0dXJuIGN0eC5pc1N5bnRhY3RpY1ByZWRpY2F0ZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHRyYWNrVXNlT2ZTeW50YWN0aWNQcmVkaWNhdGVzKEdyYW1tYXIgZykgeworCQkJY3R4LnRyYWNrVXNlT2ZTeW50YWN0aWNQcmVkaWNhdGVzKGcpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCQlpZiAoICEob2JqZWN0IGluc3RhbmNlb2YgTk9UKSApIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdGhpcy5jdHguZXF1YWxzKCgoTk9UKW9iamVjdCkuY3R4KTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIH5jdHguaGFzaENvZGUoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICIhKCIrY3R4KyIpIjsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgU2VtYW50aWNDb250ZXh0IGFuZChTZW1hbnRpY0NvbnRleHQgYSwgU2VtYW50aWNDb250ZXh0IGIpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFORDogIithKyImJiIrYik7CisJCVNlbWFudGljQ29udGV4dFtdIHRlcm1zID0gZmFjdG9yT3IoYSwgYik7CisJCVNlbWFudGljQ29udGV4dCBjb21tb25UZXJtcyA9IHRlcm1zWzBdOworCQlhID0gdGVybXNbMV07CisJCWIgPSB0ZXJtc1syXTsKKworCQlib29sZWFuIGZhY3RvcmVkID0gY29tbW9uVGVybXMgIT0gbnVsbCAmJiBjb21tb25UZXJtcyAhPSBFTVBUWV9TRU1BTlRJQ19DT05URVhUICYmICEoY29tbW9uVGVybXMgaW5zdGFuY2VvZiBUcnVlUHJlZGljYXRlKTsKKwkJaWYgKGZhY3RvcmVkKSB7CisJCQlyZXR1cm4gb3IoY29tbW9uVGVybXMsIGFuZChhLCBiKSk7CisJCX0KKwkJCisJCS8vU3lzdGVtLkNvbnNvbGUuT3V0LldyaXRlTGluZSggIkFORDogIiArIGEgKyAiJiYiICsgYiApOworCQlpZiAoYSBpbnN0YW5jZW9mIEZhbHNlUHJlZGljYXRlIHx8IGIgaW5zdGFuY2VvZiBGYWxzZVByZWRpY2F0ZSkKKwkJCXJldHVybiBuZXcgRmFsc2VQcmVkaWNhdGUoKTsKKworCQlpZiAoIGE9PUVNUFRZX1NFTUFOVElDX0NPTlRFWFQgfHwgYT09bnVsbCApIHsKKwkJCXJldHVybiBiOworCQl9CisJCWlmICggYj09RU1QVFlfU0VNQU5USUNfQ09OVEVYVCB8fCBiPT1udWxsICkgeworCQkJcmV0dXJuIGE7CisJCX0KKworCQlpZiAoYSBpbnN0YW5jZW9mIFRydWVQcmVkaWNhdGUpCisJCQlyZXR1cm4gYjsKKworCQlpZiAoYiBpbnN0YW5jZW9mIFRydWVQcmVkaWNhdGUpCisJCQlyZXR1cm4gYTsKKworCQkvLy8vIEZhY3RvcmluZyB0YWtlcyBjYXJlIG9mIHRoaXMgY2FzZQorCQkvL2lmIChhLkVxdWFscyhiKSkKKwkJLy8gICAgcmV0dXJuIGE7CisKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiMjIGhhdmUgdG8gQU5EIik7CisJCXJldHVybiBuZXcgQU5EKGEsYik7CisJfQorCisJcHVibGljIHN0YXRpYyBTZW1hbnRpY0NvbnRleHQgb3IoU2VtYW50aWNDb250ZXh0IGEsIFNlbWFudGljQ29udGV4dCBiKSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJPUjogIithKyJ8fCIrYik7CisJCVNlbWFudGljQ29udGV4dFtdIHRlcm1zID0gZmFjdG9yQW5kKGEsIGIpOworCQlTZW1hbnRpY0NvbnRleHQgY29tbW9uVGVybXMgPSB0ZXJtc1swXTsKKwkJYSA9IHRlcm1zWzFdOworCQliID0gdGVybXNbMl07CisJCWJvb2xlYW4gZmFjdG9yZWQgPSBjb21tb25UZXJtcyAhPSBudWxsICYmIGNvbW1vblRlcm1zICE9IEVNUFRZX1NFTUFOVElDX0NPTlRFWFQgJiYgIShjb21tb25UZXJtcyBpbnN0YW5jZW9mIEZhbHNlUHJlZGljYXRlKTsKKwkJaWYgKGZhY3RvcmVkKSB7CisJCQlyZXR1cm4gYW5kKGNvbW1vblRlcm1zLCBvcihhLCBiKSk7CisJCX0KKworCQlpZiAoIGE9PUVNUFRZX1NFTUFOVElDX0NPTlRFWFQgfHwgYT09bnVsbCB8fCBhIGluc3RhbmNlb2YgRmFsc2VQcmVkaWNhdGUgKSB7CisJCQlyZXR1cm4gYjsKKwkJfQorCisJCWlmICggYj09RU1QVFlfU0VNQU5USUNfQ09OVEVYVCB8fCBiPT1udWxsIHx8IGIgaW5zdGFuY2VvZiBGYWxzZVByZWRpY2F0ZSApIHsKKwkJCXJldHVybiBhOworCQl9CisKKwkJaWYgKCBhIGluc3RhbmNlb2YgVHJ1ZVByZWRpY2F0ZSB8fCBiIGluc3RhbmNlb2YgVHJ1ZVByZWRpY2F0ZSB8fCBjb21tb25UZXJtcyBpbnN0YW5jZW9mIFRydWVQcmVkaWNhdGUgKSB7CisJCQlyZXR1cm4gbmV3IFRydWVQcmVkaWNhdGUoKTsKKwkJfQorCisJCS8vLy8gRmFjdG9yaW5nIHRha2VzIGNhcmUgb2YgdGhpcyBjYXNlCisJCS8vaWYgKGEuZXF1YWxzKGIpKQorCQkvLyAgICByZXR1cm4gYTsKKworCQlpZiAoIGEgaW5zdGFuY2VvZiBOT1QgKSB7CisJCQlOT1QgbiA9IChOT1QpYTsKKwkJCS8vIGNoZWNrIGZvciAhcHx8cAorCQkJaWYgKCBuLmN0eC5lcXVhbHMoYikgKSB7CisJCQkJcmV0dXJuIG5ldyBUcnVlUHJlZGljYXRlKCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIGIgaW5zdGFuY2VvZiBOT1QgKSB7CisJCQlOT1QgbiA9IChOT1QpYjsKKwkJCS8vIGNoZWNrIGZvciBwfHwhcAorCQkJaWYgKCBuLmN0eC5lcXVhbHMoYSkgKSB7CisJCQkJcmV0dXJuIG5ldyBUcnVlUHJlZGljYXRlKCk7CisJCQl9CisJCX0KKworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIyMgaGF2ZSB0byBPUiIpOworCQlPUiByZXN1bHQgPSBuZXcgT1IoYSxiKTsKKwkJaWYgKHJlc3VsdC5vcGVyYW5kcy5zaXplKCkgPT0gMSkKKwkJCXJldHVybiByZXN1bHQub3BlcmFuZHMuaXRlcmF0b3IoKS5uZXh0KCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNlbWFudGljQ29udGV4dCBub3QoU2VtYW50aWNDb250ZXh0IGEpIHsKKwkJaWYgKGEgaW5zdGFuY2VvZiBOT1QpIHsKKwkJCXJldHVybiAoKE5PVClhKS5jdHg7CisJCX0KKworCQlpZiAoYSBpbnN0YW5jZW9mIFRydWVQcmVkaWNhdGUpCisJCQlyZXR1cm4gbmV3IEZhbHNlUHJlZGljYXRlKCk7CisJCWVsc2UgaWYgKGEgaW5zdGFuY2VvZiBGYWxzZVByZWRpY2F0ZSkKKwkJCXJldHVybiBuZXcgVHJ1ZVByZWRpY2F0ZSgpOworCisJCXJldHVybiBuZXcgTk9UKGEpOworCX0KKworCS8vIEZhY3RvciBzbyAoYSAmJiBiKSA9PSAocmVzdWx0ICYmIGEgJiYgYikKKwlwdWJsaWMgc3RhdGljIFNlbWFudGljQ29udGV4dFtdIGZhY3RvckFuZChTZW1hbnRpY0NvbnRleHQgYSwgU2VtYW50aWNDb250ZXh0IGIpCisJeworCQlpZiAoYSA9PSBFTVBUWV9TRU1BTlRJQ19DT05URVhUIHx8IGEgPT0gbnVsbCB8fCBhIGluc3RhbmNlb2YgRmFsc2VQcmVkaWNhdGUpCisJCQlyZXR1cm4gbmV3IFNlbWFudGljQ29udGV4dFtdIHsgRU1QVFlfU0VNQU5USUNfQ09OVEVYVCwgYSwgYiB9OworCQlpZiAoYiA9PSBFTVBUWV9TRU1BTlRJQ19DT05URVhUIHx8IGIgPT0gbnVsbCB8fCBiIGluc3RhbmNlb2YgRmFsc2VQcmVkaWNhdGUpCisJCQlyZXR1cm4gbmV3IFNlbWFudGljQ29udGV4dFtdIHsgRU1QVFlfU0VNQU5USUNfQ09OVEVYVCwgYSwgYiB9OworCisJCWlmIChhIGluc3RhbmNlb2YgVHJ1ZVByZWRpY2F0ZSB8fCBiIGluc3RhbmNlb2YgVHJ1ZVByZWRpY2F0ZSkKKwkJeworCQkJcmV0dXJuIG5ldyBTZW1hbnRpY0NvbnRleHRbXSB7IG5ldyBUcnVlUHJlZGljYXRlKCksIEVNUFRZX1NFTUFOVElDX0NPTlRFWFQsIEVNUFRZX1NFTUFOVElDX0NPTlRFWFQgfTsKKwkJfQorCisJCUhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PiBvcHNBID0gbmV3IEhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PihnZXRBbmRPcGVyYW5kcyhhKSk7CisJCUhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PiBvcHNCID0gbmV3IEhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PihnZXRBbmRPcGVyYW5kcyhiKSk7CisKKwkJSGFzaFNldDxTZW1hbnRpY0NvbnRleHQ+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFNlbWFudGljQ29udGV4dD4ob3BzQSk7CisJCXJlc3VsdC5yZXRhaW5BbGwob3BzQik7CisJCWlmIChyZXN1bHQuc2l6ZSgpID09IDApCisJCQlyZXR1cm4gbmV3IFNlbWFudGljQ29udGV4dFtdIHsgRU1QVFlfU0VNQU5USUNfQ09OVEVYVCwgYSwgYiB9OworCisJCW9wc0EucmVtb3ZlQWxsKHJlc3VsdCk7CisJCWlmIChvcHNBLnNpemUoKSA9PSAwKQorCQkJYSA9IG5ldyBUcnVlUHJlZGljYXRlKCk7CisJCWVsc2UgaWYgKG9wc0Euc2l6ZSgpID09IDEpCisJCQlhID0gb3BzQS5pdGVyYXRvcigpLm5leHQoKTsKKwkJZWxzZQorCQkJYSA9IG5ldyBBTkQob3BzQSk7CisKKwkJb3BzQi5yZW1vdmVBbGwocmVzdWx0KTsKKwkJaWYgKG9wc0Iuc2l6ZSgpID09IDApCisJCQliID0gbmV3IFRydWVQcmVkaWNhdGUoKTsKKwkJZWxzZSBpZiAob3BzQi5zaXplKCkgPT0gMSkKKwkJCWIgPSBvcHNCLml0ZXJhdG9yKCkubmV4dCgpOworCQllbHNlCisJCQliID0gbmV3IEFORChvcHNCKTsKKworCQlpZiAocmVzdWx0LnNpemUoKSA9PSAxKQorCQkJcmV0dXJuIG5ldyBTZW1hbnRpY0NvbnRleHRbXSB7IHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKSwgYSwgYiB9OworCisJCXJldHVybiBuZXcgU2VtYW50aWNDb250ZXh0W10geyBuZXcgQU5EKHJlc3VsdCksIGEsIGIgfTsKKwl9CisKKwkvLyBGYWN0b3Igc28gKGEgfHwgYikgPT0gKHJlc3VsdCB8fCBhIHx8IGIpCisJcHVibGljIHN0YXRpYyBTZW1hbnRpY0NvbnRleHRbXSBmYWN0b3JPcihTZW1hbnRpY0NvbnRleHQgYSwgU2VtYW50aWNDb250ZXh0IGIpCisJeworCQlIYXNoU2V0PFNlbWFudGljQ29udGV4dD4gb3BzQSA9IG5ldyBIYXNoU2V0PFNlbWFudGljQ29udGV4dD4oZ2V0T3JPcGVyYW5kcyhhKSk7CisJCUhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PiBvcHNCID0gbmV3IEhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PihnZXRPck9wZXJhbmRzKGIpKTsKKworCQlIYXNoU2V0PFNlbWFudGljQ29udGV4dD4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U2VtYW50aWNDb250ZXh0PihvcHNBKTsKKwkJcmVzdWx0LnJldGFpbkFsbChvcHNCKTsKKwkJaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkKKwkJCXJldHVybiBuZXcgU2VtYW50aWNDb250ZXh0W10geyBFTVBUWV9TRU1BTlRJQ19DT05URVhULCBhLCBiIH07CisKKwkJb3BzQS5yZW1vdmVBbGwocmVzdWx0KTsKKwkJaWYgKG9wc0Euc2l6ZSgpID09IDApCisJCQlhID0gbmV3IEZhbHNlUHJlZGljYXRlKCk7CisJCWVsc2UgaWYgKG9wc0Euc2l6ZSgpID09IDEpCisJCQlhID0gb3BzQS5pdGVyYXRvcigpLm5leHQoKTsKKwkJZWxzZQorCQkJYSA9IG5ldyBPUihvcHNBKTsKKworCQlvcHNCLnJlbW92ZUFsbChyZXN1bHQpOworCQlpZiAob3BzQi5zaXplKCkgPT0gMCkKKwkJCWIgPSBuZXcgRmFsc2VQcmVkaWNhdGUoKTsKKwkJZWxzZSBpZiAob3BzQi5zaXplKCkgPT0gMSkKKwkJCWIgPSBvcHNCLml0ZXJhdG9yKCkubmV4dCgpOworCQllbHNlCisJCQliID0gbmV3IE9SKG9wc0IpOworCisJCWlmIChyZXN1bHQuc2l6ZSgpID09IDEpCisJCQlyZXR1cm4gbmV3IFNlbWFudGljQ29udGV4dFtdIHsgcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpLCBhLCBiIH07CisKKwkJcmV0dXJuIG5ldyBTZW1hbnRpY0NvbnRleHRbXSB7IG5ldyBPUihyZXN1bHQpLCBhLCBiIH07CisJfQorCisJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFNlbWFudGljQ29udGV4dD4gZ2V0QW5kT3BlcmFuZHMoU2VtYW50aWNDb250ZXh0IGNvbnRleHQpCisJeworCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFORCkKKwkJCXJldHVybiAoKEFORCljb250ZXh0KS5vcGVyYW5kczsKKworCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIE5PVCkgeworCQkJQ29sbGVjdGlvbjxTZW1hbnRpY0NvbnRleHQ+IG9wZXJhbmRzID0gZ2V0T3JPcGVyYW5kcygoKE5PVCljb250ZXh0KS5jdHgpOworCQkJTGlzdDxTZW1hbnRpY0NvbnRleHQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U2VtYW50aWNDb250ZXh0PihvcGVyYW5kcy5zaXplKCkpOworCQkJZm9yIChTZW1hbnRpY0NvbnRleHQgb3BlcmFuZCA6IG9wZXJhbmRzKSB7CisJCQkJcmVzdWx0LmFkZChub3Qob3BlcmFuZCkpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCUFycmF5TGlzdDxTZW1hbnRpY0NvbnRleHQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U2VtYW50aWNDb250ZXh0PigpOworCQlyZXN1bHQuYWRkKGNvbnRleHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTZW1hbnRpY0NvbnRleHQ+IGdldE9yT3BlcmFuZHMoU2VtYW50aWNDb250ZXh0IGNvbnRleHQpCisJeworCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIE9SKQorCQkJcmV0dXJuICgoT1IpY29udGV4dCkub3BlcmFuZHM7CisKKwkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBOT1QpIHsKKwkJCUNvbGxlY3Rpb248U2VtYW50aWNDb250ZXh0PiBvcGVyYW5kcyA9IGdldEFuZE9wZXJhbmRzKCgoTk9UKWNvbnRleHQpLmN0eCk7CisJCQlMaXN0PFNlbWFudGljQ29udGV4dD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTZW1hbnRpY0NvbnRleHQ+KG9wZXJhbmRzLnNpemUoKSk7CisJCQlmb3IgKFNlbWFudGljQ29udGV4dCBvcGVyYW5kIDogb3BlcmFuZHMpIHsKKwkJCQlyZXN1bHQuYWRkKG5vdChvcGVyYW5kKSk7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJQXJyYXlMaXN0PFNlbWFudGljQ29udGV4dD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTZW1hbnRpY0NvbnRleHQ+KCk7CisJCXJlc3VsdC5hZGQoY29udGV4dCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvU3RhdGUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3M2Q3NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1N0YXRlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5hbmFseXNpczsKKworLyoqIEEgZ2VuZXJpYyBzdGF0ZSBtYWNoaW5lIHN0YXRlLiAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1NUQVRFX05VTUJFUiA9IC0xOworCisgICAgcHVibGljIGludCBzdGF0ZU51bWJlciA9IElOVkFMSURfU1RBVEVfTlVNQkVSOworCisgICAgLyoqIEFuIGFjY2VwdCBzdGF0ZSBpcyBhbiBlbmQgb2YgcnVsZSBzdGF0ZSBmb3IgbGV4ZXJzIGFuZAorICAgICAqICBwYXJzZXIgZ3JhbW1hciBydWxlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRTdGF0ZSA9IGZhbHNlOworCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRUcmFuc2l0aW9uKFRyYW5zaXRpb24gZSk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgVHJhbnNpdGlvbiB0cmFuc2l0aW9uKGludCBpKTsKKworCXB1YmxpYyBib29sZWFuIGlzQWNjZXB0U3RhdGUoKSB7CisJCXJldHVybiBhY2NlcHRTdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBY2NlcHRTdGF0ZShib29sZWFuIGFjY2VwdFN0YXRlKSB7CisJCXRoaXMuYWNjZXB0U3RhdGUgPSBhY2NlcHRTdGF0ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9TdGF0ZUNsdXN0ZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2FuYWx5c2lzL1N0YXRlQ2x1c3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjg0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9TdGF0ZUNsdXN0ZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmFuYWx5c2lzOworCisvKiogQSBDbHVzdGVyIG9iamVjdCBwb2ludHMgdG8gdGhlIGxlZnQvcmlnaHQgKHN0YXJ0IGFuZCBlbmQpIHN0YXRlcyBvZiBhCisgKiAgc3RhdGUgbWFjaGluZS4gIFVzZWQgdG8gYnVpbGQgTkZBcy4KKyAqLworcHVibGljIGNsYXNzIFN0YXRlQ2x1c3RlciB7CisgICAgcHVibGljIE5GQVN0YXRlIGxlZnQ7CisgICAgcHVibGljIE5GQVN0YXRlIHJpZ2h0OworCisgICAgcHVibGljIFN0YXRlQ2x1c3RlcihORkFTdGF0ZSBsZWZ0LCBORkFTdGF0ZSByaWdodCkgeworICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvVHJhbnNpdGlvbi5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvYW5hbHlzaXMvVHJhbnNpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZGY1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9hbmFseXNpcy9UcmFuc2l0aW9uLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5hbmFseXNpczsKKworLyoqIEEgZ2VuZXJpYyB0cmFuc2l0aW9uIGJldHdlZW4gYW55IHR3byBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gIEl0IGRlZmluZXMKKyAqICBzb21lIHNwZWNpYWwgbGFiZWxzIHRoYXQgaW5kaWNhdGUgdGhpbmdzIGxpa2UgZXBzaWxvbiB0cmFuc2l0aW9ucyBhbmQKKyAqICB0aGF0IHRoZSBsYWJlbCBpcyBhY3R1YWxseSBhIHNldCBvZiBsYWJlbHMgb3IgYSBzZW1hbnRpYyBwcmVkaWNhdGUuCisgKiAgVGhpcyBpcyBhIG9uZSB3YXkgbGluay4gIEl0IGVtYW5hdGVzIGZyb20gYSBzdGF0ZSAodXN1YWxseSB2aWEgYSBsaXN0IG9mCisgKiAgdHJhbnNpdGlvbnMpIGFuZCBoYXMgYSBsYWJlbC90YXJnZXQgcGFpci4gIEkgaGF2ZSBhYnN0cmFjdGVkIHRoZSBub3Rpb24KKyAqICBvZiBhIExhYmVsIHRvIGhhbmRsZSB0aGUgdmFyaW91cyBraW5kcyBvZiB0aGluZ3MgaXQgY2FuIGJlLgorICovCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworICAgIC8qKiBXaGF0IGxhYmVsIG11c3QgYmUgY29uc3VtZWQgdG8gdHJhbnNpdGlvbiB0byB0YXJnZXQgKi8KKyAgICBwdWJsaWMgTGFiZWwgbGFiZWw7CisKKyAgICAvKiogVGhlIHRhcmdldCBvZiB0aGlzIHRyYW5zaXRpb24gKi8KKyAgICBwdWJsaWMgU3RhdGUgdGFyZ2V0OworCisgICAgcHVibGljIFRyYW5zaXRpb24oTGFiZWwgbGFiZWwsIFN0YXRlIHRhcmdldCkgeworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIHB1YmxpYyBUcmFuc2l0aW9uKGludCBsYWJlbCwgU3RhdGUgdGFyZ2V0KSB7CisgICAgICAgIHRoaXMubGFiZWwgPSBuZXcgTGFiZWwobGFiZWwpOworICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKKyAgICB9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Vwc2lsb24oKSB7CisJCXJldHVybiBsYWJlbC5pc0Vwc2lsb24oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbigpIHsKKwkJcmV0dXJuIGxhYmVsLmlzQWN0aW9uKCk7CisJfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTZW1hbnRpY1ByZWRpY2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbGFiZWwuaGFzaENvZGUoKSArIHRhcmdldC5zdGF0ZU51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgVHJhbnNpdGlvbiBvdGhlciA9IChUcmFuc2l0aW9uKW87CisgICAgICAgIHJldHVybiB0aGlzLmxhYmVsLmVxdWFscyhvdGhlci5sYWJlbCkgJiYKKyAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmVxdWFscyhvdGhlci50YXJnZXQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisgICAgICAgIFRyYW5zaXRpb24gb3RoZXIgPSAoVHJhbnNpdGlvbilvOworICAgICAgICByZXR1cm4gdGhpcy5sYWJlbC5jb21wYXJlVG8ob3RoZXIubGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBsYWJlbCsiLT4iK3RhcmdldC5zdGF0ZU51bWJlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0FDeWNsaWNERkFDb2RlR2VuZXJhdG9yLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0FDeWNsaWNERkFDb2RlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNWZkMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2NvZGVnZW4vQUN5Y2xpY0RGQUNvZGVHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVEdyb3VwOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBBQ3ljbGljREZBQ29kZUdlbmVyYXRvciB7CisJcHJvdGVjdGVkIENvZGVHZW5lcmF0b3IgcGFyZW50R2VuZXJhdG9yOworCisJcHVibGljIEFDeWNsaWNERkFDb2RlR2VuZXJhdG9yKENvZGVHZW5lcmF0b3IgcGFyZW50KSB7CisJCXRoaXMucGFyZW50R2VuZXJhdG9yID0gcGFyZW50OworCX0KKworCXB1YmxpYyBTVCBnZW5GaXhlZExvb2thaGVhZERlY2lzaW9uKFNUR3JvdXAgdGVtcGxhdGVzLAorCQkJCQkJCQkJCQkJCURGQSBkZmEpCisJeworCQlyZXR1cm4gd2Fsa0ZpeGVkREZBR2VuZXJhdGluZ1N0YXRlTWFjaGluZSh0ZW1wbGF0ZXMsIGRmYSwgZGZhLnN0YXJ0U3RhdGUsIDEpOworCX0KKworCXByb3RlY3RlZCBTVCB3YWxrRml4ZWRERkFHZW5lcmF0aW5nU3RhdGVNYWNoaW5lKAorCQkJU1RHcm91cCB0ZW1wbGF0ZXMsCisJCQlERkEgZGZhLAorCQkJREZBU3RhdGUgcywKKwkJCWludCBrKQorCXsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIndhbGsgIitzLnN0YXRlTnVtYmVyKyIgaW4gZGZhIGZvciBkZWNpc2lvbiAiK2RmYS5kZWNpc2lvbk51bWJlcik7CisJCWlmICggcy5pc0FjY2VwdFN0YXRlKCkgKSB7CisJCQlTVCBkZmFTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJkZmFBY2NlcHRTdGF0ZSIpOworCQkJZGZhU1QuYWRkKCJhbHQiLCBVdGlscy5pbnRlZ2VyKHMuZ2V0VW5pcXVlbHlQcmVkaWN0ZWRBbHQoKSkpOworCQkJcmV0dXJuIGRmYVNUOworCQl9CisKKwkJLy8gdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGZvciBnZW5lcmF0aW5nIGEgc3RhdGUgYW5kIGl0cyBlZGdlcworCQkvLyBjYW4gYmUgYW4gaWYtdGhlbi1lbHNlIHN0cnVjdHVyZSBvciBhIHN3aXRjaAorCQlTdHJpbmcgZGZhU3RhdGVOYW1lID0gImRmYVN0YXRlIjsKKwkJU3RyaW5nIGRmYUxvb3BiYWNrU3RhdGVOYW1lID0gImRmYUxvb3BiYWNrU3RhdGUiOworCQlTdHJpbmcgZGZhT3B0aW9uYWxCbG9ja1N0YXRlTmFtZSA9ICJkZmFPcHRpb25hbEJsb2NrU3RhdGUiOworCQlTdHJpbmcgZGZhRWRnZU5hbWUgPSAiZGZhRWRnZSI7CisJCWlmICggcGFyZW50R2VuZXJhdG9yLmNhbkdlbmVyYXRlU3dpdGNoKHMpICkgeworCQkJZGZhU3RhdGVOYW1lID0gImRmYVN0YXRlU3dpdGNoIjsKKwkJCWRmYUxvb3BiYWNrU3RhdGVOYW1lID0gImRmYUxvb3BiYWNrU3RhdGVTd2l0Y2giOworCQkJZGZhT3B0aW9uYWxCbG9ja1N0YXRlTmFtZSA9ICJkZmFPcHRpb25hbEJsb2NrU3RhdGVTd2l0Y2giOworCQkJZGZhRWRnZU5hbWUgPSAiZGZhRWRnZVN3aXRjaCI7CisJCX0KKworCQlTVCBkZmFTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKGRmYVN0YXRlTmFtZSk7CisJCWlmICggZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpLmRlY2lzaW9uU3RhdGVUeXBlPT1ORkFTdGF0ZS5MT09QQkFDSyApIHsKKwkJCWRmYVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoZGZhTG9vcGJhY2tTdGF0ZU5hbWUpOworCQl9CisJCWVsc2UgaWYgKCBkZmEuZ2V0TkZBRGVjaXNpb25TdGFydFN0YXRlKCkuZGVjaXNpb25TdGF0ZVR5cGU9PU5GQVN0YXRlLk9QVElPTkFMX0JMT0NLX1NUQVJUICkgeworCQkJZGZhU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZihkZmFPcHRpb25hbEJsb2NrU3RhdGVOYW1lKTsKKwkJfQorCQlkZmFTVC5hZGQoImsiLCBVdGlscy5pbnRlZ2VyKGspKTsKKwkJZGZhU1QuYWRkKCJzdGF0ZU51bWJlciIsIFV0aWxzLmludGVnZXIocy5zdGF0ZU51bWJlcikpOworCQlkZmFTVC5hZGQoInNlbVByZWRTdGF0ZSIsCisJCQkJCQkgICBCb29sZWFuLnZhbHVlT2Yocy5pc1Jlc29sdmVkV2l0aFByZWRpY2F0ZXMoKSkpOworCQkvKgorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBkZmEuZ2V0TkZBRGVjaXNpb25TdGFydFN0YXRlKCkuZ2V0RGVzY3JpcHRpb24oKTsKKwkJZGVzY3JpcHRpb24gPSBwYXJlbnRHZW5lcmF0b3IudGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGRlc2NyaXB0aW9uKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRGQTogIitkZXNjcmlwdGlvbisiIGFzc29jaWF0ZWQgd2l0aCBBU1QgIitkZmEuZ2V0TkZBRGVjaXNpb25TdGFydFN0YXRlKCkpOworCQlpZiAoIGRlc2NyaXB0aW9uIT1udWxsICkgeworCQkJZGZhU1QuYWRkKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJfQorCQkqLworCQlpbnQgRU9UUHJlZGljdHMgPSBORkEuSU5WQUxJRF9BTFRfTlVNQkVSOworCQlERkFTdGF0ZSBFT1RUYXJnZXQgPSBudWxsOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiREZBIHN0YXRlICIrcy5zdGF0ZU51bWJlcik7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGkrKykgeworCQkJVHJhbnNpdGlvbiBlZGdlID0gKFRyYW5zaXRpb24pIHMudHJhbnNpdGlvbihpKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJlZGdlICIrcy5zdGF0ZU51bWJlcisiLSIrZWRnZS5sYWJlbC50b1N0cmluZygpKyItPiIrZWRnZS50YXJnZXQuc3RhdGVOdW1iZXIpOworCQkJaWYgKCBlZGdlLmxhYmVsLmdldEF0b20oKT09TGFiZWwuRU9UICkgeworCQkJCS8vIGRvbid0IGdlbmVyYXRlIGEgcmVhbCBlZGdlIGZvciBFT1Q7IHRyYWNrIGFsdCBFT1QgcHJlZGljdHMKKwkJCQkvLyBnZW5lcmF0ZSB0aGF0IHByZWRpY3Rpb24gaW4gdGhlIGVsc2UgY2xhdXNlIGFzIGRlZmF1bHQgY2FzZQorCQkJCUVPVFRhcmdldCA9IChERkFTdGF0ZSllZGdlLnRhcmdldDsKKwkJCQlFT1RQcmVkaWN0cyA9IEVPVFRhcmdldC5nZXRVbmlxdWVseVByZWRpY3RlZEFsdCgpOworCQkJCS8qCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJERkEgcyIrcy5zdGF0ZU51bWJlcisiIEVPVCBnb2VzIHRvIHMiKworCQkJCQkJCQkgICBlZGdlLnRhcmdldC5zdGF0ZU51bWJlcisiIHByZWRpY2F0ZXMgYWx0ICIrCisJCQkJCQkJCSAgIEVPVFByZWRpY3RzKTsKKwkJCQkqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJU1QgZWRnZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoZGZhRWRnZU5hbWUpOworCQkJLy8gSWYgdGhlIHRlbXBsYXRlIHdhbnRzIGFsbCB0aGUgbGFiZWwgdmFsdWVzIGRlbGluZWF0ZWQsIGRvIHRoYXQKKwkJCWlmICggZWRnZVNULmltcGwuZm9ybWFsQXJndW1lbnRzLmdldCgibGFiZWxzIikhPW51bGwgKSB7CisJCQkJTGlzdCBsYWJlbHMgPSBlZGdlLmxhYmVsLmdldFNldCgpLnRvTGlzdCgpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGFiZWxzLnNpemUoKTsgaisrKSB7CisJCQkJCUludGVnZXIgdkkgPSAoSW50ZWdlcikgbGFiZWxzLmdldChqKTsKKwkJCQkJU3RyaW5nIGxhYmVsID0KKwkJCQkJCXBhcmVudEdlbmVyYXRvci5nZXRUb2tlblR5cGVBc1RhcmdldExhYmVsKHZJLmludFZhbHVlKCkpOworCQkJCQlsYWJlbHMuc2V0KGosIGxhYmVsKTsgLy8gcmV3cml0ZSBMaXN0IGVsZW1lbnQgdG8gYmUgbmFtZQorCQkJCX0KKwkJCQllZGdlU1QuYWRkKCJsYWJlbHMiLCBsYWJlbHMpOworCQkJfQorCQkJZWxzZSB7IC8vIGVsc2UgY3JlYXRlIGFuIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgKHRoZSBnZW5lcmFsIGNhc2UpCisJCQkJZWRnZVNULmFkZCgibGFiZWxFeHByIiwKKwkJCQkJCQkJCXBhcmVudEdlbmVyYXRvci5nZW5MYWJlbEV4cHIodGVtcGxhdGVzLGVkZ2UsaykpOworCQkJfQorCisJCQkvLyBzdGljayBpbiBhbnkgZ2F0ZWQgcHJlZGljYXRlcyBmb3IgYW55IGVkZ2UgaWYgbm90IGFscmVhZHkgYSBwcmVkCisJCQlpZiAoICFlZGdlLmxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCQlERkFTdGF0ZSB0YXJnZXQgPSAoREZBU3RhdGUpZWRnZS50YXJnZXQ7CisJCQkJU2VtYW50aWNDb250ZXh0IHByZWRzID0KKwkJCQkJdGFyZ2V0LmdldEdhdGVkUHJlZGljYXRlc0luTkZBQ29uZmlndXJhdGlvbnMoKTsKKwkJCQlpZiAoIHByZWRzIT1udWxsICkgeworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicHJlZHM9Iit0YXJnZXQuZ2V0R2F0ZWRQcmVkaWNhdGVzSW5ORkFDb25maWd1cmF0aW9ucygpKTsKKwkJCQkJU1QgcHJlZFNUID0gcHJlZHMuZ2VuRXhwcihwYXJlbnRHZW5lcmF0b3IsCisJCQkJCQkJCQkJCQkJCSAgcGFyZW50R2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLAorCQkJCQkJCQkJCQkJCQkgIGRmYSk7CisJCQkJCWVkZ2VTVC5hZGQoInByZWRpY2F0ZXMiLCBwcmVkU1QpOworCQkJCX0KKwkJCX0KKworCQkJU1QgdGFyZ2V0U1QgPQorCQkJCXdhbGtGaXhlZERGQUdlbmVyYXRpbmdTdGF0ZU1hY2hpbmUodGVtcGxhdGVzLAorCQkJCQkJCQkJCQkJICAgZGZhLAorCQkJCQkJCQkJCQkJICAgKERGQVN0YXRlKWVkZ2UudGFyZ2V0LAorCQkJCQkJCQkJCQkJICAgaysxKTsKKwkJCWVkZ2VTVC5hZGQoInRhcmdldFN0YXRlIiwgdGFyZ2V0U1QpOworCQkJZGZhU1QuYWRkKCJlZGdlcyIsIGVkZ2VTVCk7CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKCJiYWNrIHRvIERGQSAiKworCQkJCQkJCSAgIGRmYS5kZWNpc2lvbk51bWJlcisiLiIrcy5zdGF0ZU51bWJlcik7CisJCQkJCQkJICAgKi8KKwkJfQorCisJCS8vIEhBTkRMRSBFT1QgRURHRQorCQlpZiAoIEVPVFByZWRpY3RzIT1ORkEuSU5WQUxJRF9BTFRfTlVNQkVSICkgeworCQkJLy8gRU9UIHVuaXF1ZSBwcmVkaWN0cyBhbiBhbHQKKwkJCWRmYVNULmFkZCgiZW90UHJlZGljdHNBbHQiLCBVdGlscy5pbnRlZ2VyKEVPVFByZWRpY3RzKSk7CisJCX0KKwkJZWxzZSBpZiAoIEVPVFRhcmdldCE9bnVsbCAmJiBFT1RUYXJnZXQuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpPjAgKSB7CisJCQkvLyBFT1Qgc3RhdGUgaGFzIHRyYW5zaXRpb25zIHNvIG11c3Qgc3BsaXQgb24gcHJlZGljYXRlcy4KKwkJCS8vIEdlbmVyYXRlIHByZWRpY2F0ZSBlbHNlLWlmIGNsYXVzZXMgYW5kIHRoZW4gZ2VuZXJhdGUKKwkJCS8vIE5vVmlhYmxlQWx0IGV4Y2VwdGlvbiBhcyBlbHNlIGNsYXVzZS4KKwkJCS8vIE5vdGU6IHRoZXNlIHByZWRpY2F0ZXMgZW1hbmF0ZSBmcm9tIHRoZSBFT1QgdGFyZ2V0IHN0YXRlCisJCQkvLyByYXRoZXIgdGhhbiB0aGUgY3VycmVudCBERkFTdGF0ZSBzIHNvIHRoZSBlcnJvciBtZXNzYWdlCisJCQkvLyBtaWdodCBiZSBzbGlnaHRseSBtaXNsZWFkaW5nIGlmIHlvdSBhcmUgbG9va2luZyBhdCB0aGUKKwkJCS8vIHN0YXRlIG51bWJlci4gIFByZWRpY2F0ZXMgZW1hbmF0aW5nIGZyb20gRU9UIHRhcmdldHMgYXJlCisJCQkvLyBob2lzdGVkIHVwIHRvIHRoZSBzdGF0ZSB0aGF0IGhhcyB0aGUgRU9UIGVkZ2UuCisJCQlmb3IgKGludCBpID0gMDsgaSA8IEVPVFRhcmdldC5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGkrKykgeworCQkJCVRyYW5zaXRpb24gcHJlZEVkZ2UgPSAoVHJhbnNpdGlvbilFT1RUYXJnZXQudHJhbnNpdGlvbihpKTsKKwkJCQlTVCBlZGdlU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZihkZmFFZGdlTmFtZSk7CisJCQkJZWRnZVNULmFkZCgibGFiZWxFeHByIiwKKwkJCQkJCQkJCXBhcmVudEdlbmVyYXRvci5nZW5TZW1hbnRpY1ByZWRpY2F0ZUV4cHIodGVtcGxhdGVzLHByZWRFZGdlKSk7CisJCQkJLy8gdGhlIHRhcmdldCBtdXN0IGJlIGFuIGFjY2VwdCBzdGF0ZQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJFT1QgZWRnZSIpOworCQkJCVNUIHRhcmdldFNUID0KKwkJCQkJd2Fsa0ZpeGVkREZBR2VuZXJhdGluZ1N0YXRlTWFjaGluZSh0ZW1wbGF0ZXMsCisJCQkJCQkJCQkJCQkJICAgZGZhLAorCQkJCQkJCQkJCQkJCSAgIChERkFTdGF0ZSlwcmVkRWRnZS50YXJnZXQsCisJCQkJCQkJCQkJCQkJICAgaysxKTsKKwkJCQllZGdlU1QuYWRkKCJ0YXJnZXRTdGF0ZSIsIHRhcmdldFNUKTsKKwkJCQlkZmFTVC5hZGQoImVkZ2VzIiwgZWRnZVNUKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGZhU1Q7CisJfQorfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0FjdGlvblNjcmlwdFRhcmdldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9BY3Rpb25TY3JpcHRUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI5NDNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9BY3Rpb25TY3JpcHRUYXJnZXQuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKK3B1YmxpYyBjbGFzcyBBY3Rpb25TY3JpcHRUYXJnZXQgZXh0ZW5kcyBUYXJnZXQgeworCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRDaGFyTGl0ZXJhbEZyb21BTlRMUkNoYXJMaXRlcmFsKAorICAgICAgICAgICAgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCkgeworCisgICAgICAgIGludCBjID0gR3JhbW1hci5nZXRDaGFyVmFsdWVGcm9tR3JhbW1hckNoYXJMaXRlcmFsKGxpdGVyYWwpOworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoYyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUb2tlblR5cGVBc1RhcmdldExhYmVsKENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHR5cGUpIHsKKyAgICAgICAgLy8gdXNlIGludHMgZm9yIHByZWRlZmluZWQgdHlwZXM7CisgICAgICAgIC8vIDxpbnZhbGlkPiA8RU9SPiA8RE9XTj4gPFVQPgorICAgICAgICBpZiAodHR5cGUgPj0gMCAmJiB0dHlwZSA8PSAzKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZW5lcmF0b3IuZ3JhbW1hci5nZXRUb2tlbkRpc3BsYXlOYW1lKHR0eXBlKTsKKworICAgICAgICAvLyBJZiBuYW1lIGlzIGEgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0b2tlbiB0eXBlIGluc3RlYWQKKyAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09ICdcJycpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0dHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY3Rpb25TY3JpcHQgZG9lc24ndCBzdXBwb3J0IFVuaWNvZGUgU3RyaW5nIGxpdGVyYWxzIHRoYXQgYXJlIGNvbnNpZGVyZWQgImlsbGVnYWwiCisgICAgICogb3IgYXJlIGluIHRoZSBzdXJyb2dhdGUgcGFpciByYW5nZXMuICBGb3IgZXhhbXBsZSAiL3VmZmZmIiB3aWxsIG5vdCBlbmNvZGUgcHJvcGVybHkKKyAgICAgKiBub3Igd2lsbCAiL3VkODAwIi4gIFRvIGtlZXAgdGhpbmdzIGFzIGNvbXBhY3QgYXMgcG9zc2libGUgd2UgdXNlIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmcKKyAgICAgKiBpZiB0aGUgaW50IGlzIGJlbG93IDI1NSwgd2UgZW5jb2RlIGFzIGhleCBsaXRlcmFsCisgICAgICogSWYgdGhlIGludCBpcyBiZXR3ZWVuIDI1NSBhbmQgMHg3ZmZmIHdlIHVzZSBhIHNpbmdsZSB1bmljb2RlIGxpdGVyYWwgd2l0aCB0aGUgdmFsdWUKKyAgICAgKiBJZiB0aGUgaW50IGlzIGFib3ZlIDB4N2ZmZiwgd2UgdXNlIGEgdW5pY29kZSBsaXRlcmFsIG9mIDB4ODBoaCwgd2hlcmUgaGggaXMgdGhlIGhpZ2gtb3JkZXIKKyAgICAgKiBiaXRzIGZvbGxvd2VkIGJ5IFx4bGwgd2hlcmUgbGwgaXMgdGhlIGxvd2VyIG9yZGVyIGJpdHMgb2YgYSAxNi1iaXQgbnVtYmVyLgorICAgICAqCisgICAgICogSWRlYWxseSB0aGlzIHNob3VsZCBiZSBpbXByb3ZlZCBhdCBhIGZ1dHVyZSBkYXRlLiAgVGhlIG1vc3Qgb3B0aW1hbCB3YXkgdG8gZW5jb2RlIHRoaXMKKyAgICAgKiBtYXkgYmUgYSBjb21wcmVzc2VkIEFNRiBlbmNvZGluZyB0aGF0IGlzIGVtYmVkZGVkIHVzaW5nIGFuIEVtYmVkIHRhZyBpbiBBY3Rpb25TY3JpcHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZUludEFzQ2hhckVzY2FwZShpbnQgdikgeworICAgICAgICAvLyBlbmNvZGUgYXMgaGV4CisgICAgICAgIGlmICggdjw9MjU1ICkgeworCQkJcmV0dXJuICJcXHgiKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHZ8MHgxMDApLnN1YnN0cmluZygxLDMpOworCQl9CisgICAgICAgIGlmICh2IDw9IDB4N2ZmZikgeworICAgICAgICAgICAgU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcodnwweDEwMDAwKS5zdWJzdHJpbmcoMSw1KTsKKwkJICAgIHJldHVybiAiXFx1IitoZXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYgPiAweGZmZmYpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogY2hhcmFjdGVyIGxpdGVyYWwgb3V0IG9mIHJhbmdlIGZvciBBY3Rpb25TY3JpcHQgdGFyZ2V0ICIgKyB2KTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiXFx1ODAiKTsKKyAgICAgICAgYnVmLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKCh2ID4+IDgpIHwgMHgxMDApLnN1YnN0cmluZygxLCAzKSk7IC8vIGhpZ2ggLSBvcmRlciBiaXRzCisgICAgICAgIGJ1Zi5hcHBlbmQoIlxceCIpOworICAgICAgICBidWYuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKHYgJiAweGZmKSB8IDB4MTAwKS5zdWJzdHJpbmcoMSwgMykpOyAvLyBsb3cgLW9yZGVyIGJpdHMKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKiBDb252ZXJ0IGxvbmcgdG8gdHdvIDMyLWJpdCBudW1iZXJzIHNlcGFydGVkIGJ5IGEgY29tbWEuCisgICAgICogIEFjdGlvblNjcmlwdCBkb2VzIG5vdCBzdXBwb3J0IDY0LWJpdCBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGJyZWFrCisgICAgICogIHRoZSBudW1iZXIgaW50byB0d28gMzItYml0IGxpdGVyYWxzIHRvIGdpdmUgdG8gdGhlIEJpdC4gIEEgbnVtYmVyIGxpa2UKKyAgICAgKiAgMHhISEhISEhISExMTExMTExMIGlzIGJyb2tlbiBpbnRvIHRoZSBmb2xsb3dpbmcgc3RyaW5nOgorICAgICAqICAiMHhMTExMTExMTCwgMHhISEhISEhISCIKKwkgKiAgTm90ZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0cyBhcmUgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBoaWdoIG9yZGVyIGJpdHMuCisgICAgICogIFRoaXMgaXMgdG8gbWF0Y2ggaG93IHRoZSBCaXRTZXQgY29uc3RydWN0b3Igd29ya3MsIHdoZXJlIHRoZSBiaXRzIGFyZQorICAgICAqICBwYXNzZWQgaW4gaW4gMzItYml0IGNodW5rcyB3aXRoIGxvdy1vcmRlciBiaXRzIGNvbWluZyBmaXJzdC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldDY0Qml0U3RyaW5nRnJvbVZhbHVlKGxvbmcgd29yZCkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigyMik7IC8vIGVub3VnaCBmb3IgdGhlIHR3byAiMHgiLCAiLCIgYW5kICIgIgorCQlidWYuYXBwZW5kKCIweCIpOworICAgICAgICB3cml0ZUhleFdpdGhQYWRkaW5nKGJ1ZiwgSW50ZWdlci50b0hleFN0cmluZygoaW50KSh3b3JkICYgMHgwMDAwMDAwMGZmZmZmZmZmTCkpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAweCIpOworICAgICAgICB3cml0ZUhleFdpdGhQYWRkaW5nKGJ1ZiwgSW50ZWdlci50b0hleFN0cmluZygoaW50KSh3b3JkID4+IDMyKSkpOworCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVIZXhXaXRoUGFkZGluZyhTdHJpbmdCdWZmZXIgYnVmLCBTdHJpbmcgZGlnaXRzKSB7CisgICAgICAgZGlnaXRzID0gZGlnaXRzLnRvVXBwZXJDYXNlKCk7CisJCWludCBwYWRkaW5nID0gOCAtIGRpZ2l0cy5sZW5ndGgoKTsKKwkJLy8gcGFkIGxlZnQgd2l0aCB6ZXJvcworCQlmb3IgKGludCBpPTE7IGk8PXBhZGRpbmc7IGkrKykgeworCQkJYnVmLmFwcGVuZCgnMCcpOworCQl9CisJCWJ1Zi5hcHBlbmQoZGlnaXRzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU1QgY2hvb3NlV2hlcmVDeWNsaWNERkFzR28oVG9vbCB0b29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbW1hciBncmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVCByZWNvZ25pemVyU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUIGN5Y2xpY0RGQVNUKSB7CisgICAgICAgIHJldHVybiByZWNvZ25pemVyU1Q7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NQUFRhcmdldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9DUFBUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk2MmUwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9DUFBUYXJnZXQuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVEdyb3VwOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ1BQVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKKwkKKwlwdWJsaWMgU3RyaW5nIGVzY2FwZUNoYXIoIGludCBjICkgeworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNQUFRhcmdldC5lc2NhcGVDaGFyKCIrYysiKSIpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXG4nIDogcmV0dXJuICJcXG4iOworCQljYXNlICdcdCcgOiByZXR1cm4gIlxcdCI7CisJCWNhc2UgJ1xyJyA6IHJldHVybiAiXFxyIjsKKwkJY2FzZSAnXFwnIDogcmV0dXJuICJcXFxcIjsKKwkJY2FzZSAnXCcnIDogcmV0dXJuICJcXCciOworCQljYXNlICciJyA6ICByZXR1cm4gIlxcXCIiOworCQlkZWZhdWx0IDoKKwkJCWlmICggYyA8ICcgJyB8fCBjID4gMTI2ICkKKwkJCXsKKwkJCQlpZiAoYyA+IDI1NSkKKwkJCQl7CisJCQkJCVN0cmluZyBzID0gSW50ZWdlci50b1N0cmluZyhjLDE2KTsKKwkJCQkJLy8gcHV0IGxlYWRpbmcgemVyb2VzIGluIGZyb250IG9mIHRoZSB0aGluZy4uCisJCQkJCXdoaWxlKCBzLmxlbmd0aCgpIDwgNCApCisJCQkJCQlzID0gJzAnICsgczsKKwkJCQkJcmV0dXJuICJcXHUiICsgczsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXJldHVybiAiXFwiICsgSW50ZWdlci50b1N0cmluZyhjLDgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoY2hhciljKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKiBDb252ZXJ0cyBhIFN0cmluZyBpbnRvIGEgcmVwcmVzZW50YXRpb24gdGhhdCBjYW4gYmUgdXNlIGFzIGEgbGl0ZXJhbAorCSAqIHdoZW4gc3Vycm91bmRlZCBieSBkb3VibGUtcXVvdGVzLgorCSAqCisJICogVXNlZCBmb3IgZXNjYXBpbmcgc2VtYW50aWMgcHJlZGljYXRlIHN0cmluZ3MgZm9yIGV4Y2VwdGlvbnMuCisJICoKKwkgKiBAcGFyYW0gcyBUaGUgU3RyaW5nIHRvIGJlIGNoYW5nZWQgaW50byBhIGxpdGVyYWwKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGVzY2FwZVN0cmluZyhTdHJpbmcgcykKKwl7CisJCVN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisJCQlyZXR2YWwuYXBwZW5kKGVzY2FwZUNoYXIocy5jaGFyQXQoaSkpKTsKKwkJfQorCisJCXJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBnZW5SZWNvZ25pemVySGVhZGVyRmlsZShUb29sIHRvb2wsCisJCQkJCQkJCQkJICAgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkJICAgR3JhbW1hciBncmFtbWFyLAorCQkJCQkJCQkJCSAgIFNUIGhlYWRlckZpbGVTVCwKKwkJCQkJCQkJCQkgICBTdHJpbmcgZXh0TmFtZSkKKwkJdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlnZW5lcmF0b3Iud3JpdGUoaGVhZGVyRmlsZVNULCBncmFtbWFyLm5hbWUrZXh0TmFtZSk7CisJfQorCisJLyoqIENvbnZlcnQgZnJvbSBhbiBBTlRMUiBjaGFyIGxpdGVyYWwgZm91bmQgaW4gYSBncmFtbWFyIGZpbGUgdG8KKwkgKiAgYW4gZXF1aXZhbGVudCBjaGFyIGxpdGVyYWwgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEZvciBKYXZhLCB0aGlzCisJICogIGlzIHRoZSBpZGVudGlmeSB0cmFuc2xhdGlvbjsgaS5lLiwgJ1xuJyAtPiAnXG4nLiAgTW9zdCBsYW5ndWFnZXMKKwkgKiAgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGlzIDEtdG8tMSBtYXBwaW5nLiAgRXhwZWN0IHNpbmdsZSBxdW90ZXMKKwkgKiAgYXJvdW5kIHRoZSBpbmNvbWluZyBsaXRlcmFsLgorCSAqICBEZXBlbmRpbmcgb24gdGhlIGNoYXJ2b2NhYnVsYXJ5IHRoZSBjaGFybGl0ZXJhbCBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBhICdMJworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbCggQ29kZUdlbmVyYXRvciBjb2RlZ2VuLCBTdHJpbmcgbGl0ZXJhbCkgeworCQlpbnQgYyA9IEdyYW1tYXIuZ2V0Q2hhclZhbHVlRnJvbUdyYW1tYXJDaGFyTGl0ZXJhbChsaXRlcmFsKTsKKwkJU3RyaW5nIHByZWZpeCA9ICInIjsKKwkJaWYoIGNvZGVnZW4uZ3JhbW1hci5nZXRNYXhDaGFyVmFsdWUoKSA+IDI1NSApCisJCQlwcmVmaXggPSAiTCciOworCQllbHNlIGlmKCAoYyAmIDB4ODApICE9IDAgKQkvLyBpZiBpbiBjaGFyIG1vZGUgcHJldmVudCBzaWduIGV4dGVuc2lvbnMKKwkJCXJldHVybiAiIitjOworCQlyZXR1cm4gcHJlZml4K2VzY2FwZUNoYXIoYykrIiciOworCX0KKworCS8qKiBDb252ZXJ0IGZyb20gYW4gQU5UTFIgc3RyaW5nIGxpdGVyYWwgZm91bmQgaW4gYSBncmFtbWFyIGZpbGUgdG8KKwkgKiAgYW4gZXF1aXZhbGVudCBzdHJpbmcgbGl0ZXJhbCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgRm9yIEphdmEsIHRoaXMKKwkgKiAgaXMgdGhlIGlkZW50aWZ5IHRyYW5zbGF0aW9uOyBpLmUuLCAiXCJcbiIgLT4gIlwiXG4iLiAgTW9zdCBsYW5ndWFnZXMKKwkgKiAgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGlzIDEtdG8tMSBtYXBwaW5nLiAgRXhwZWN0IGRvdWJsZSBxdW90ZXMgCisJICogIGFyb3VuZCB0aGUgaW5jb21pbmcgbGl0ZXJhbC4KKwkgKiAgRGVwZW5kaW5nIG9uIHRoZSBjaGFydm9jYWJ1bGFyeSB0aGUgc3RyaW5nIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIGEgJ0wnCisJICovCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbUFOVExSU3RyaW5nTGl0ZXJhbCggQ29kZUdlbmVyYXRvciBjb2RlZ2VuLCBTdHJpbmcgbGl0ZXJhbCkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gR3JhbW1hci5nZXRVbmVzY2FwZWRTdHJpbmdGcm9tR3JhbW1hclN0cmluZ0xpdGVyYWwobGl0ZXJhbCk7CisJCVN0cmluZyBwcmVmaXggPSAiXCIiOworCQlpZiggY29kZWdlbi5ncmFtbWFyLmdldE1heENoYXJWYWx1ZSgpID4gMjU1ICkKKwkJCXByZWZpeCA9ICJMXCIiOworCQlyZXR1cm4gcHJlZml4K2VzY2FwZVN0cmluZyhidWYudG9TdHJpbmcoKSkrIlwiIjsKKwl9CisJLyoqIENoYXJhY3RlciBjb25zdGFudHMgZ2V0IHRydW5jYXRlZCB0byB0aGlzIHZhbHVlLgorCSAqIFRPRE86IFRoaXMgc2hvdWxkIGJlIGRlcml2ZWQgZnJvbSB0aGUgY2hhclZvY2FidWxhcnkuIERlcGVuZGluZyBvbiBpdAorCSAqIGJlaW5nIDI1NSBvciAweEZGRkYgdGhlIHRlbXBsYXRlcyBzaG91bGQgZ2VuZXJhdGUgbm9ybWFsIGNoYXJhY3RlcgorCSAqIGNvbnN0YW50cyBvciBtdWx0aWJ5dGUgb25lcy4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heENoYXJWYWx1ZSggQ29kZUdlbmVyYXRvciBjb2RlZ2VuICkgeworCQlpbnQgbWF4dmFsID0gMjU1OyAvLyBjb2RlZ2VuLmdyYW1tYXIuZ2V0Pz8/PygpOworCQlpZiAoIG1heHZhbCA8PSAyNTUgKQorCQkJcmV0dXJuIDI1NTsKKwkJZWxzZQorCQkJcmV0dXJuIG1heHZhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NTaGFycDJUYXJnZXQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2NvZGVnZW4vQ1NoYXJwMlRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDcyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NTaGFycDJUYXJnZXQuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBDU2hhcnAyVGFyZ2V0IGV4dGVuZHMgQ1NoYXJwM1RhcmdldAoreworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9DU2hhcnAzVGFyZ2V0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NTaGFycDNUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWZlZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9DU2hhcnAzVGFyZ2V0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIFNhbSBIYXJ3ZWxsLCBQaXhlbCBNaW5lLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIuY29kZWdlbjsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LkF0dHJpYnV0ZVJlbmRlcmVyOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgQ1NoYXJwM1RhcmdldCBleHRlbmRzIFRhcmdldCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IF9sYW5ndWFnZUtleXdvcmRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpCisgICAgICAgIHt7CisgICAgICAgICAgICBhZGQoImFic3RyYWN0Iik7IGFkZCgiZXZlbnQiKTsgYWRkKCJuZXciKTsgYWRkKCJzdHJ1Y3QiKTsKKyAgICAgICAgICAgIGFkZCgiYXMiKTsgYWRkKCJleHBsaWNpdCIpOyBhZGQoIm51bGwiKTsgYWRkKCJzd2l0Y2giKTsKKyAgICAgICAgICAgIGFkZCgiYmFzZSIpOyBhZGQoImV4dGVybiIpOyBhZGQoIm9iamVjdCIpOyBhZGQoInRoaXMiKTsKKyAgICAgICAgICAgIGFkZCgiYm9vbCIpOyBhZGQoImZhbHNlIik7IGFkZCgib3BlcmF0b3IiKTsgYWRkKCJ0aHJvdyIpOworICAgICAgICAgICAgYWRkKCJicmVhayIpOyBhZGQoImZpbmFsbHkiKTsgYWRkKCJvdXQiKTsgYWRkKCJ0cnVlIik7CisgICAgICAgICAgICBhZGQoImJ5dGUiKTsgYWRkKCJmaXhlZCIpOyBhZGQoIm92ZXJyaWRlIik7IGFkZCgidHJ5Iik7CisgICAgICAgICAgICBhZGQoImNhc2UiKTsgYWRkKCJmbG9hdCIpOyBhZGQoInBhcmFtcyIpOyBhZGQoInR5cGVvZiIpOworICAgICAgICAgICAgYWRkKCJjYXRjaCIpOyBhZGQoImZvciIpOyBhZGQoInByaXZhdGUiKTsgYWRkKCJ1aW50Iik7CisgICAgICAgICAgICBhZGQoImNoYXIiKTsgYWRkKCJmb3JlYWNoIik7IGFkZCgicHJvdGVjdGVkIik7IGFkZCgidWxvbmciKTsKKyAgICAgICAgICAgIGFkZCgiY2hlY2tlZCIpOyBhZGQoImdvdG8iKTsgYWRkKCJwdWJsaWMiKTsgYWRkKCJ1bmNoZWNrZWQiKTsKKyAgICAgICAgICAgIGFkZCgiY2xhc3MiKTsgYWRkKCJpZiIpOyBhZGQoInJlYWRvbmx5Iik7IGFkZCgidW5zYWZlIik7CisgICAgICAgICAgICBhZGQoImNvbnN0Iik7IGFkZCgiaW1wbGljaXQiKTsgYWRkKCJyZWYiKTsgYWRkKCJ1c2hvcnQiKTsKKyAgICAgICAgICAgIGFkZCgiY29udGludWUiKTsgYWRkKCJpbiIpOyBhZGQoInJldHVybiIpOyBhZGQoInVzaW5nIik7CisgICAgICAgICAgICBhZGQoImRlY2ltYWwiKTsgYWRkKCJpbnQiKTsgYWRkKCJzYnl0ZSIpOyBhZGQoInZpcnR1YWwiKTsKKyAgICAgICAgICAgIGFkZCgiZGVmYXVsdCIpOyBhZGQoImludGVyZmFjZSIpOyBhZGQoInNlYWxlZCIpOyBhZGQoInZvbGF0aWxlIik7CisgICAgICAgICAgICBhZGQoImRlbGVnYXRlIik7IGFkZCgiaW50ZXJuYWwiKTsgYWRkKCJzaG9ydCIpOyBhZGQoInZvaWQiKTsKKyAgICAgICAgICAgIGFkZCgiZG8iKTsgYWRkKCJpcyIpOyBhZGQoInNpemVvZiIpOyBhZGQoIndoaWxlIik7CisgICAgICAgICAgICBhZGQoImRvdWJsZSIpOyBhZGQoImxvY2siKTsgYWRkKCJzdGFja2FsbG9jIik7CisgICAgICAgICAgICBhZGQoImVsc2UiKTsgYWRkKCJsb25nIik7IGFkZCgic3RhdGljIik7CisgICAgICAgICAgICBhZGQoImVudW0iKTsgYWRkKCJuYW1lc3BhY2UiKTsgYWRkKCJzdHJpbmciKTsKKyAgICAgICAgfX07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZUludEFzQ2hhckVzY2FwZShpbnQgdikgeworICAgICAgICByZXR1cm4gIlxceCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHYpLnRvVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQ2NEJpdFN0cmluZ0Zyb21WYWx1ZShsb25nIHdvcmQpIHsKKyAgICAgICAgcmV0dXJuICIweCIgKyBMb25nLnRvSGV4U3RyaW5nKHdvcmQpLnRvVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuUmVjb2duaXplckZpbGUoVG9vbCB0b29sLCBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwgR3JhbW1hciBncmFtbWFyLCBTVCBvdXRwdXRGaWxlU1QpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFncmFtbWFyLmdldEdyYW1tYXJJc1Jvb3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgR3JhbW1hciByb290R3JhbW1hciA9IGdyYW1tYXIuY29tcG9zaXRlLmdldFJvb3RHcmFtbWFyKCk7CisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uU2NvcGUgPSBncmFtbWFyLmdldERlZmF1bHRBY3Rpb25TY29wZShncmFtbWFyLnR5cGUpOworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhY3Rpb25zID0gcm9vdEdyYW1tYXIuZ2V0QWN0aW9ucygpLmdldChhY3Rpb25TY29wZSk7CisgICAgICAgICAgICBPYmplY3Qgcm9vdE5hbWVzcGFjZSA9IGFjdGlvbnMgIT0gbnVsbCA/IGFjdGlvbnMuZ2V0KCJuYW1lc3BhY2UiKSA6IG51bGw7CisgICAgICAgICAgICBpZiAoYWN0aW9ucyAhPSBudWxsICYmIHJvb3ROYW1lc3BhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3Rpb25zID0gZ3JhbW1hci5nZXRBY3Rpb25zKCkuZ2V0KGFjdGlvblNjb3BlKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgICAgICAgICBncmFtbWFyLmdldEFjdGlvbnMoKS5wdXQoYWN0aW9uU2NvcGUsIGFjdGlvbnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFjdGlvbnMucHV0KCJuYW1lc3BhY2UiLCByb290TmFtZXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRvci5nZXRUZW1wbGF0ZXMoKS5yZWdpc3RlclJlbmRlcmVyKFN0cmluZy5jbGFzcywgbmV3IFN0cmluZ1JlbmRlcmVyKGdlbmVyYXRvciwgdGhpcykpOworICAgICAgICBzdXBlci5nZW5SZWNvZ25pemVyRmlsZSh0b29sLCBnZW5lcmF0b3IsIGdyYW1tYXIsIG91dHB1dEZpbGVTVCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdSZW5kZXJlciBpbXBsZW1lbnRzIEF0dHJpYnV0ZVJlbmRlcmVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENvZGVHZW5lcmF0b3IgX2dlbmVyYXRvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDU2hhcnAzVGFyZ2V0IF90YXJnZXQ7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1JlbmRlcmVyKENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLCBDU2hhcnAzVGFyZ2V0IHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgX2dlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgICAgICAgICAgIF90YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvYmosIFN0cmluZyBmb3JtYXROYW1lLCBMb2NhbGUgbG9jYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKW9iajsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IGZvcm1hdE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgICAgIGlmIChmb3JtYXROYW1lLmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgICAgIGlmIChfbGFuZ3VhZ2VLZXl3b3Jkcy5jb250YWlucyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQCIgKyB2YWx1ZTsKKworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0TmFtZS5lcXVhbHMoImNhcCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b1VwcGVyQ2FzZSh2YWx1ZS5jaGFyQXQoMCkpICsgdmFsdWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXROYW1lLmVxdWFscygic3RyaW5nIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3RhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyh2YWx1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGZvcm1hdCBuYW1lOiAnIiArIGZvcm1hdE5hbWUgKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NUYXJnZXQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2NvZGVnZW4vQ1RhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTExYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NUYXJnZXQuamF2YQpAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKKworICAgIEFycmF5TGlzdCBzdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuUmVjb2duaXplckZpbGUoVG9vbCB0b29sLAorICAgICAgICAgICAgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisgICAgICAgICAgICBHcmFtbWFyIGdyYW1tYXIsCisgICAgICAgICAgICBTVCBvdXRwdXRGaWxlU1QpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEJlZm9yZSB3ZSB3cml0ZSB0aGlzLCBhbmQgY2F1c2UgaXQgdG8gZ2VuZXJhdGUgaXRzIHN0cmluZywKKyAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgYWxsIHRoZSBzdHJpbmcgbGl0ZXJhbHMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbWF0Y2gKKyAgICAgICAgLy8KKyAgICAgICAgb3V0cHV0RmlsZVNULmFkZCgibGl0ZXJhbHMiLCBzdHJpbmdzKTsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJGaWxlTmFtZShncmFtbWFyLm5hbWUsIGdyYW1tYXIudHlwZSk7CisgICAgICAgIGdlbmVyYXRvci53cml0ZShvdXRwdXRGaWxlU1QsIGZpbGVOYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5SZWNvZ25pemVySGVhZGVyRmlsZShUb29sIHRvb2wsCisgICAgICAgICAgICBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICAgICAgICAgIEdyYW1tYXIgZ3JhbW1hciwKKyAgICAgICAgICAgIFNUIGhlYWRlckZpbGVTVCwKKyAgICAgICAgICAgIFN0cmluZyBleHROYW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUGljayB1cCB0aGUgZmlsZSBuYW1lIHdlIGFyZSBnZW5lcmF0aW5nLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhCisgICAgICAgIC8vIGEgZmlsZSBzdWZmaXhlZCB3aXRoIC5jLCBzbyB3ZSBtdXN0IHN1YnN0cmluZyBhbmQgYWRkIHRoZSBleHROYW1lCisgICAgICAgIC8vIHRvIGl0IGFzIHdlIGNhbm5vdCBhc3NpZ24gaW50byBzdHJpbmdzIGluIEphdmEuCisgICAgICAgIC8vLworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBnZW5lcmF0b3IuZ2V0UmVjb2duaXplckZpbGVOYW1lKGdyYW1tYXIubmFtZSwgZ3JhbW1hci50eXBlKTsKKyAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSAyKSArIGV4dE5hbWU7CisKKyAgICAgICAgZ2VuZXJhdG9yLndyaXRlKGhlYWRlckZpbGVTVCwgZmlsZU5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTVCBjaG9vc2VXaGVyZUN5Y2xpY0RGQXNHbyhUb29sIHRvb2wsCisgICAgICAgICAgICBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICAgICAgICAgIEdyYW1tYXIgZ3JhbW1hciwKKyAgICAgICAgICAgIFNUIHJlY29nbml6ZXJTVCwKKyAgICAgICAgICAgIFNUIGN5Y2xpY0RGQVNUKSB7CisgICAgICAgIHJldHVybiByZWNvZ25pemVyU1Q7CisgICAgfQorCisgICAgLyoqIElzIHNjb3BlIGluIEBzY29wZTo6bmFtZSB7YWN0aW9ufSB2YWxpZCBmb3IgdGhpcyBraW5kIG9mIGdyYW1tYXI/CisgICAgICogIFRhcmdldHMgbGlrZSBDKysgbWF5IHdhbnQgdG8gYWxsb3cgbmV3IHNjb3BlcyBsaWtlIGhlYWRlcmZpbGUgb3IKKyAgICAgKiAgc29tZSBzdWNoLiAgVGhlIGFjdGlvbiBuYW1lcyB0aGVtc2VsdmVzIGFyZSBub3QgcG9saWNlZCBhdCB0aGUKKyAgICAgKiAgbW9tZW50IHNvIHRhcmdldHMgY2FuIGFkZCB0ZW1wbGF0ZSBhY3Rpb25zIHcvbyBoYXZpbmcgdG8gcmVjb21waWxlCisgICAgICogIEFOVExSLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRBY3Rpb25TY29wZShpbnQgZ3JhbW1hclR5cGUsIFN0cmluZyBzY29wZSkgeworICAgICAgICBzd2l0Y2ggKGdyYW1tYXJUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEdyYW1tYXIuTEVYRVI6CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygibGV4ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygiaGVhZGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5lcXVhbHMoImluY2x1ZGVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5lcXVhbHMoInByZWluY2x1ZGVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5lcXVhbHMoIm92ZXJyaWRlcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR3JhbW1hci5QQVJTRVI6CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygicGFyc2VyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5lcXVhbHMoImhlYWRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJpbmNsdWRlcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJwcmVpbmNsdWRlcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJvdmVycmlkZXMiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdyYW1tYXIuQ09NQklORUQ6CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygicGFyc2VyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5lcXVhbHMoImxleGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzY29wZS5lcXVhbHMoImhlYWRlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJpbmNsdWRlcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJwcmVpbmNsdWRlcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJvdmVycmlkZXMiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdyYW1tYXIuVFJFRV9QQVJTRVI6CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygidHJlZXBhcnNlciIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKCJoZWFkZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygiaW5jbHVkZXMiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygicHJlaW5jbHVkZXMiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscygib3ZlcnJpZGVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldENoYXJMaXRlcmFsRnJvbUFOVExSQ2hhckxpdGVyYWwoCisgICAgICAgICAgICBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICAgICAgICAgIFN0cmluZyBsaXRlcmFsKSB7CisKKyAgICAgICAgaWYgKGxpdGVyYWwuc3RhcnRzV2l0aCgiJ1xcdSIpKSB7CisgICAgICAgICAgICBsaXRlcmFsID0gIjB4IiArIGxpdGVyYWwuc3Vic3RyaW5nKDMsIDcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGMgPSBsaXRlcmFsLmNoYXJBdCgxKTsKKworICAgICAgICAgICAgaWYgKGMgPCAzMiB8fCBjID4gMTI3KSB7CisgICAgICAgICAgICAgICAgbGl0ZXJhbCA9ICIweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpdGVyYWw7CisgICAgfQorCisgICAgLyoqIENvbnZlcnQgZnJvbSBhbiBBTlRMUiBzdHJpbmcgbGl0ZXJhbCBmb3VuZCBpbiBhIGdyYW1tYXIgZmlsZSB0bworICAgICAqICBhbiBlcXVpdmFsZW50IHN0cmluZyBsaXRlcmFsIGluIHRoZSBDIHRhcmdldC4KKyAgICAgKiAgQmVjYXVzZSB3ZSBtdXN0IHN1cHBvcnQgVW5pY29kZSBjaGFyYWN0ZXIgc2V0cyBhbmQgaGF2ZSBjaG9zZW4KKyAgICAgKiAgdG8gaGF2ZSB0aGUgbGV4ZXIgbWF0Y2ggVVRGMzIgY2hhcmFjdGVycywgdGhlbiB3ZSBtdXN0IGVuY29kZQorICAgICAqICBzdHJpbmcgbWF0Y2hlcyB0byB1c2UgMzIgYml0IGNoYXJhY3RlciBhcnJheXMuIEhlcmUgdGhlbiB3ZQorICAgICAqICBtdXN0IHByb2R1Y2UgdGhlIEMgYXJyYXkgYW5kIGNhdGVyIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUKKyAgICAgKiAgbGV4ZXIgaGFzIGJlZW4gZW5jb2RlZCB3aXRoIGEgc3RyaW5nIHN1Y2ggYXMgJ3h5elxuJywKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tQU5UTFJTdHJpbmdMaXRlcmFsKAorICAgICAgICAgICAgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCkgeworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIFN0cmluZyBieXRlczsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBidWYuYXBwZW5kKCJ7ICIpOworCisgICAgICAgIC8vIFdlIG5lZWQgb3QgbG9zZSBhbnkgZXNjYXBlZCBjaGFyYWN0ZXJzIG9mIHRoZSBmb3JtIFx4IGFuZCBqdXN0CisgICAgICAgIC8vIHJlcGxhY2UgdGhlbSB3aXRoIHRoZWlyIGFjdHVhbCB2YWx1ZXMgYXMgd2VsbCBhcyBsb3NlIHRoZSBzdXJyb3VuZGluZworICAgICAgICAvLyBxdW90ZSBtYXJrcy4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaXRlcmFsLmxlbmd0aCgpIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIweCIpOworCisgICAgICAgICAgICBpZiAobGl0ZXJhbC5jaGFyQXQoaSkgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGkrKzsgLy8gQXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlciwgdGhpcyB3aWxsIGp1c3QgeWllbGQKKyAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIHN0cmluZ3MgaWYgbm90LCB3aGljaCBpcyB3aGF0IHRoZSBpbnB1dCB3b3VsZCBiZSBvZiBjb3Vyc2UgLSBpbnZhbGlkCisgICAgICAgICAgICAgICAgc3dpdGNoIChsaXRlcmFsLmNoYXJBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnVSc6CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGxpdGVyYWwuc3Vic3RyaW5nKGkgKyAxLCBpICsgNSkpOyAgLy8gQWxyZWFkeSBhIGhleCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gbmV4dCBzdHJpbmcvY2hhci9lc2NhcGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiMEEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdSJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiMEQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiMDkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdCJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiMDgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdGJzoKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiMEMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgd2hhdCBpdCBpcyEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKGludCkgbGl0ZXJhbC5jaGFyQXQoaSkpLnRvVXBwZXJDYXNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKGludCkgbGl0ZXJhbC5jaGFyQXQoaSkpLnRvVXBwZXJDYXNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIgQU5UTFIzX1NUUklOR19URVJNSU5BVE9SfSIpOworCisgICAgICAgIGJ5dGVzID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIGluZGV4ID0gc3RyaW5ncy5pbmRleE9mKGJ5dGVzKTsKKworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHN0cmluZ3MuYWRkKGJ5dGVzKTsKKyAgICAgICAgICAgIGluZGV4ID0gc3RyaW5ncy5pbmRleE9mKGJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHJyZWYgPSAibGl0XyIgKyBTdHJpbmcudmFsdWVPZihpbmRleCArIDEpOworCisgICAgICAgIHJldHVybiBzdHJyZWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSBzdGFuZGFyZCBncmFtbWFyIGFuYWx5c2lzIHNvIHdlIGNhbiBwcmVwYXJlIHRoZSBhbmFseXNlcgorICAgICAqIGEgbGl0dGxlIGRpZmZlcmVudGx5IGZyb20gdGhlIG90aGVyIHRhcmdldHMuCisgICAgICoKKyAgICAgKiBJbiBwYXJ0aWN1bGFyIHdlIHdhbnQgdG8gaW5mbHVlbmNlIHRoZSB3YXkgdGhlIGNvZGUgZ2VuZXJhdG9yIG1ha2VzIGFzc3VtcHRpb25zIGFib3V0CisgICAgICogc3dpdGNocyB2cyBpZnMsIHZzIHRhYmxlIGRyaXZlbiBERkFzLiBJbiBnZW5lcmFsLCBDIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0aGF0CisgICAgICogaGFzIHRoZSBtaW5pbXVtIHVzZSBvZiB0YWJsZXMsIGFuZCB0aGEgbWV4aW11bSB1c2Ugb2YgbGFyZ2Ugc3dpdGNoIHN0YXRlbWVudHMuIFRoaXMKKyAgICAgKiBhbGxvd3MgdGhlIG9wdGltaXplcnMgdG8gZ2VuZXJhdGUgdmVyeSBlZmZpY2llbnQgY29kZSwgaXQgY2FuIHJlZHVjZSBvYmplY3QgY29kZSBzaXplCisgICAgICogYnkgYWJvdXQgMzAlIGFuZCBnaXZlIGFib3V0IGEgMjAlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG92ZXIgbm90IGRvaW5nIHRoaXMuIEhlbmNlLAorICAgICAqIGZvciB0aGUgQyB0YXJnZXQgb25seSwgd2UgY2hhbmdlIHRoZSBkZWZhdWx0cyBoZXJlLCBidXQgb25seSBpZiB0aGV5IGFyZSBzdGlsbCBzZXQgdG8gdGhlCisgICAgICogZGVmYXVsdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdG9yIEFuIGluc3RhbmNlIG9mIHRoZSBnZW5lcmljIGNvZGUgZ2VuZXJhdG9yIGNsYXNzLgorICAgICAqIEBwYXJhbSBncmFtbWFyIFRoZSBncmFtbWFyIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBhbmFseXppbmcKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtR3JhbW1hckFuYWx5c2lzKENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLCBHcmFtbWFyIGdyYW1tYXIpIHsKKworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1heGltdW0gaW5saW5lIERGQSBzdGF0ZXMgaXMgc3RpbGwgc2V0IHRvCisgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNpemUuIElmIGl0IGlzIHRoZW4gd2hhY2sgaXQgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIG1heGltdW0gdGhhdAorICAgICAgICAvLyB3ZSBjYW4gc2Vuc2libHkgZ2V0IGF3YXkgd2l0aC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKENvZGVHZW5lcmF0b3IuTUFYX0FDWUNMSUNfREZBX1NUQVRFU19JTkxJTkUgPT0gQ29kZUdlbmVyYXRvci5NQVhfQUNZQ0xJQ19ERkFfU1RBVEVTX0lOTElORSApIHsKKworICAgICAgICAgICAgQ29kZUdlbmVyYXRvci5NQVhfQUNZQ0xJQ19ERkFfU1RBVEVTX0lOTElORSA9IDY1NTM1OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYXhpbXVtIHN3aXRjaCBzaXplIGlzIHN0aWxsIHNldCB0byB0aGUgZGVmYXVsdAorICAgICAgICAvLyBhbmQgYnJpbmcgaXQgdXAgbXVjaCBoaWdoZXIgaWYgaXQgaXMuIE1vZGVybiBDIGNvbXBpbGVycyBjYW4gaGFuZGxlCisgICAgICAgIC8vIG11Y2ggYmlnZ2VyIHN3aXRjaCBzdGF0ZW1lbnRzIHRoYW4gc2F5IEphdmEgY2FuIGFuZCBpZiBhbnlvbmUgZmluZHMgYSBjb21waWxlcgorICAgICAgICAvLyB0aGF0IGNhbm5vdCBkZWFsIHdpdGggc3VjaCBiaWcgc3dpdGNoZXMsIGFsbCB0aGUgbmVlZCBkbyBpcyBnZW5lcmF0ZSB0aGUKKyAgICAgICAgLy8gY29kZSB3aXRoIGEgcmVkdWNlZCAtWG1heHN3aXRjaGNhc2VsYWJlbHMgbm5uCisgICAgICAgIC8vCisgICAgICAgIGlmICAoQ29kZUdlbmVyYXRvci5NQVhfU1dJVENIX0NBU0VfTEFCRUxTID09IENvZGVHZW5lcmF0b3IuTVNDTF9ERUZBVUxUKSB7CisKKyAgICAgICAgICAgIENvZGVHZW5lcmF0b3IuTUFYX1NXSVRDSF9DQVNFX0xBQkVMUyA9IDMwMDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBjb25zaWRlcmVkIGEgbWltaW51bSBmb3IgdXNpbmcKKyAgICAgICAgLy8gYSBzd2l0Y2ggaXMgc3RpbGwgYXQgdGhlIGRlZmF1bHQuIEJlY2F1c2UgYSBzd2l0Y2ggaXMgc3RpbGwgZ2VuZXJhbGx5IGZhc3RlciB0aGFuCisgICAgICAgIC8vIGFuIGlmIGV2ZW4gd2l0aCBzbWFsbCBzZXRzLCBhbmQgZ2l2ZW4gdGhhdCB0aGUgb3B0aW1pemVyIHdpbGwgZG8gdGhlIGJlc3QgdGhpbmcgd2l0aCBpdAorICAgICAgICAvLyBhbnl3YXksIHRoZW4gd2Ugc2ltcGx5IHdhbnQgdG8gZ2VuZXJhdGUgYSBzd2l0Y2ggZm9yIGFueSBudW1iZXIgb2Ygc3RhdGVzLgorICAgICAgICAvLworICAgICAgICBpZiAoQ29kZUdlbmVyYXRvci5NSU5fU1dJVENIX0FMVFMgPT0gQ29kZUdlbmVyYXRvci5NU0FfREVGQVVMVCkgeworCisgICAgICAgICAgICBDb2RlR2VuZXJhdG9yLk1JTl9TV0lUQ0hfQUxUUyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgd2UgYWxsb3cgdGhlIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gZG8gd2hhdGV2ZXIgaXQgZmVlbHMgaXQKKyAgICAgICAgLy8gbXVzdCBkby4KKyAgICAgICAgLy8KKyAgICAgICAgc3VwZXIucGVyZm9ybUdyYW1tYXJBbmFseXNpcyhnZW5lcmF0b3IsIGdyYW1tYXIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9Db2RlR2VuZXJhdG9yLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0NvZGVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZiMWZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9Db2RlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxMzIwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmNvZGVnZW47CisKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkE7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJMZXhlcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3JhbW1hci52My5BTlRMUlBhcnNlcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3JhbW1hci52My5BY3Rpb25UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkNvZGVHZW5UcmVlV2Fsa2VyOworaW1wb3J0IG9yZy5hbnRsci5taXNjLkJpdFNldDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy4qOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC4qOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqIEFOVExSJ3MgY29kZSBnZW5lcmF0b3IuCisgKgorICogIEdlbmVyYXRlIHJlY29nbml6ZXJzIGRlcml2ZWQgZnJvbSBncmFtbWFycy4gIExhbmd1YWdlIGluZGVwZW5kZW5jZQorICogIGFjaGlldmVkIHRocm91Z2ggdGhlIHVzZSBvZiBTVEdyb3VwIG9iamVjdHMuICBBbGwgb3V0cHV0CisgKiAgc3RyaW5ncyBhcmUgY29tcGxldGVseSBlbmNhcHN1bGF0ZWQgaW4gdGhlIGdyb3VwIGZpbGVzIHN1Y2ggYXMgSmF2YS5zdGcuCisgKiAgU29tZSBjb21wdXRhdGlvbnMgYXJlIGRvbmUgdGhhdCBhcmUgdW51c2VkIGJ5IGEgcGFydGljdWxhciBsYW5ndWFnZS4KKyAqICBUaGlzIGdlbmVyYXRvciBqdXN0IGNvbXB1dGVzIGFuZCBzZXRzIHRoZSB2YWx1ZXMgaW50byB0aGUgdGVtcGxhdGVzOworICogIHRoZSB0ZW1wbGF0ZXMgYXJlIGZyZWUgdG8gdXNlIG9yIG5vdCB1c2UgdGhlIGluZm9ybWF0aW9uLgorICoKKyAqICBUbyBtYWtlIGEgbmV3IGNvZGUgZ2VuZXJhdGlvbiB0YXJnZXQsIGRlZmluZSBYLnN0ZyBmb3IgbGFuZ3VhZ2UgWAorICogIGJ5IGNvcHlpbmcgZnJvbSBleGlzdGluZyBZLnN0ZyBtb3N0IGNsb3NlbHkgcmVsZWF0ZWQgdG8geW91ciBsYW5ndWFnZTsKKyAqICBlLmcuLCB0byBkbyBDU2hhcnAuc3RnIGNvcHkgSmF2YS5zdGcuICBUaGUgdGVtcGxhdGUgZ3JvdXAgZmlsZSBoYXMgYQorICogIGJ1bmNoIG9mIHRlbXBsYXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLiAgWW91IGNhbiBhZGQKKyAqICBhIG5ldyB0YXJnZXQgdy9vIGV2ZW4gcmVjb21waWxpbmcgQU5UTFIgaXRzZWxmLiAgVGhlIGxhbmd1YWdlPVggb3B0aW9uCisgKiAgaW4gYSBncmFtbWFyIGZpbGUgZGljdGF0ZXMgd2hpY2ggdGVtcGxhdGVzIGdldCBsb2FkZWQvdXNlZC4KKyAqCisgKiAgU29tZSBsYW5ndWFnZSBsaWtlIEMgbmVlZCBib3RoIHBhcnNlciBmaWxlcyBhbmQgaGVhZGVyIGZpbGVzLiAgSmF2YSBuZWVkcworICogIHRvIGhhdmUgYSBzZXBhcmF0ZSBmaWxlIGZvciB0aGUgY3ljbGljIERGQSBhcyBBTlRMUiBnZW5lcmF0ZXMgYnl0ZWNvZGVzCisgKiAgZGlyZWN0bHkgKHdoaWNoIGNhbm5vdCBiZSBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlciBKYXZhIGZpbGUpLiAgVG8gZmFjaWxpdGF0ZQorICogIHRoaXMsCisgKgorICogY3ljbGljIGNhbiBiZSBpbiBzYW1lIGZpbGUsIGJ1dCBoZWFkZXIsIG91dHB1dCBtdXN0IGJlIHNlYXJwYXRlLiAgcmVjb2duaXplcgorICogIGlzIGluIG91dHB0dWZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2RlR2VuZXJhdG9yIHsKKwkvKiogV2hlbiBnZW5lcmF0aW5nIFNXSVRDSCBzdGF0ZW1lbnRzLCBzb21lIHRhcmdldHMgbWlnaHQgbmVlZCB0byBsaW1pdAorCSAqICB0aGUgc2l6ZSAoYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGNhc2UgbGFiZWxzKS4gIEdlbmVyYWxseSwgdGhpcworCSAqICBsaW1pdCB3aWxsIGJlIGhpdCBvbmx5IGZvciBsZXhlcnMgd2hlcmUgd2lsZGNhcmQgaW4gYSBVTklDT0RFCisJICogIHZvY2FidWxhcnkgZW52aXJvbm1lbnQgd291bGQgZ2VuZXJhdGUgYSBTV0lUQ0ggd2l0aCA2NTAwMCBsYWJlbHMuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTVNDTF9ERUZBVUxUID0gMzAwOworCXB1YmxpYyBzdGF0aWMgaW50IE1BWF9TV0lUQ0hfQ0FTRV9MQUJFTFMgPSBNU0NMX0RFRkFVTFQ7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTVNBX0RFRkFVTFQgPSAzOworCXB1YmxpYyBzdGF0aWMgaW50IE1JTl9TV0lUQ0hfQUxUUyA9IE1TQV9ERUZBVUxUOworCXB1YmxpYyBib29sZWFuIEdFTkVSQVRFX1NXSVRDSEVTX1dIRU5fUE9TU0lCTEUgPSB0cnVlOworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBMQVVOQ0hfU1RfSU5TUEVDVE9SID0gZmFsc2U7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUFEU0lfREVGQVVMVCA9IDYwOyAvLyBkbyBsb3RzIG9mIHN0YXRlcyBpbmxpbmUgKG5lZWRlZCBmb3IgZXhwcmVzc2lvbiBydWxlcykKKwlwdWJsaWMgc3RhdGljIGludCBNQVhfQUNZQ0xJQ19ERkFfU1RBVEVTX0lOTElORSA9IE1BRFNJX0RFRkFVTFQ7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc3BhdGhUZW1wbGF0ZVJvb3REaXJlY3RvcnlOYW1lID0KKwkJIm9yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcyI7CisKKwkvKiogV2hpY2ggZ3JhbW1hciBhcmUgd2UgZ2VuZXJhdGluZyBjb2RlIGZvcj8gIEVhY2ggZ2VuZXJhdG9yCisJICogIGlzIGF0dGFjaGVkIHRvIGEgc3BlY2lmaWMgZ3JhbW1hci4KKwkgKi8KKwlwdWJsaWMgR3JhbW1hciBncmFtbWFyOworCisJLyoqIFdoYXQgbGFuZ3VhZ2UgYXJlIHdlIGdlbmVyYXRpbmc/ICovCisJcHJvdGVjdGVkIFN0cmluZyBsYW5ndWFnZTsKKworCS8qKiBUaGUgdGFyZ2V0IHNwZWNpZmllcyBob3cgdG8gd3JpdGUgb3V0IGZpbGVzIGFuZCBkbyBvdGhlciBsYW5ndWFnZQorCSAqICBzcGVjaWZpYyBhY3Rpb25zLgorCSAqLworCXB1YmxpYyBUYXJnZXQgdGFyZ2V0ID0gbnVsbDsKKworCS8qKiBXaGVyZSBhcmUgdGhlIHRlbXBsYXRlcyB0aGlzIGdlbmVyYXRvciBzaG91bGQgdXNlIHRvIGdlbmVyYXRlIGNvZGU/ICovCisJcHJvdGVjdGVkIFNUR3JvdXAgdGVtcGxhdGVzOworCisJLyoqIFRoZSBiYXNpYyBvdXRwdXQgdGVtcGxhdGVzIHdpdGhvdXQgQVNUIG9yIHRlbXBsYXRlcyBzdHVmZjsgdGhpcyB3aWxsIGJlCisJICogIHRoZSB0ZW1wbGF0ZXMgbG9hZGVkIGZvciB0aGUgbGFuZ3VhZ2Ugc3VjaCBhcyBKYXZhLnN0ZyAqYW5kKiB0aGUgRGJnCisJICogIHN0dWZmIGlmIHR1cm5lZCBvbi4gIFRoaXMgaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBzeW50YWN0aWMgcHJlZGljYXRlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgU1RHcm91cCBiYXNlVGVtcGxhdGVzOworCisJcHJvdGVjdGVkIFNUIHJlY29nbml6ZXJTVDsKKwlwcm90ZWN0ZWQgU1Qgb3V0cHV0RmlsZVNUOworCXByb3RlY3RlZCBTVCBoZWFkZXJGaWxlU1Q7CisKKwkvKiogVXNlZCB0byBjcmVhdGUgdW5pcXVlIGxhYmVscyAqLworCXByb3RlY3RlZCBpbnQgdW5pcXVlTGFiZWxOdW1iZXIgPSAxOworCisJLyoqIEEgcmVmZXJlbmNlIHRvIHRoZSBBTlRMUiB0b29sIHNvIHdlIGNhbiBsZWFybiBhYm91dCBvdXRwdXQgZGlyZWN0b3JpZXMKKwkgKiAgYW5kIHN1Y2guCisJICovCisJcHJvdGVjdGVkIFRvb2wgdG9vbDsKKworCS8qKiBHZW5lcmF0ZSBkZWJ1Z2dpbmcgZXZlbnQgbWV0aG9kIGNhbGxzICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7CisKKwkvKiogQ3JlYXRlIGEgVHJhY2VyIG9iamVjdCBhbmQgbWFrZSB0aGUgcmVjb2duaXplciBpbnZva2UgdGhpcy4gKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFjZTsKKworCS8qKiBUcmFjayBydW50aW1lIHBhcnNpbmcgaW5mb3JtYXRpb24gYWJvdXQgZGVjaXNpb25zIGV0Yy4uLgorCSAqICBUaGlzIHJlcXVpcmVzIHRoZSBkZWJ1Z2dpbmcgZXZlbnQgbWVjaGFuaXNtIHRvIHdvcmsuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvZmlsZTsKKworCXByb3RlY3RlZCBpbnQgbGluZVdpZHRoID0gNzI7CisKKwkvKiogSSBoYXZlIGZhY3RvcmVkIG91dCB0aGUgZ2VuZXJhdGlvbiBvZiBhY3ljbGljIERGQXMgdG8gc2VwYXJhdGUgY2xhc3MgKi8KKwlwdWJsaWMgQUN5Y2xpY0RGQUNvZGVHZW5lcmF0b3IgYWN5Y2xpY0RGQUdlbmVyYXRvciA9CisJCW5ldyBBQ3ljbGljREZBQ29kZUdlbmVyYXRvcih0aGlzKTsKKworCS8qKiBJIGhhdmUgZmFjdG9yZWQgb3V0IHRoZSBnZW5lcmF0aW9uIG9mIGN5Y2xpYyBERkFzIHRvIHNlcGFyYXRlIGNsYXNzICovCisJLyoKKwlwdWJsaWMgQ3ljbGljREZBQ29kZUdlbmVyYXRvciBjeWNsaWNERkFHZW5lcmF0b3IgPQorCQluZXcgQ3ljbGljREZBQ29kZUdlbmVyYXRvcih0aGlzKTsKKwkJKi8KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPQ0FCX0ZJTEVfRVhURU5TSU9OID0gIi50b2tlbnMiOworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIHZvY2FiRmlsZVBhdHRlcm4gPQorCQkiPHRva2Vuczp7aXR8PGl0Lm5hbWU+PTxpdC50eXBlPlxufT4iICsKKwkJIjxsaXRlcmFsczp7aXR8PGl0Lm5hbWU+PTxpdC50eXBlPlxufT4iOworCisJcHVibGljIENvZGVHZW5lcmF0b3IoVG9vbCB0b29sLCBHcmFtbWFyIGdyYW1tYXIsIFN0cmluZyBsYW5ndWFnZSkgeworCQl0aGlzLnRvb2wgPSB0b29sOworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCQl0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisJCXRhcmdldCA9IGxvYWRMYW5ndWFnZVRhcmdldChsYW5ndWFnZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBUYXJnZXQgbG9hZExhbmd1YWdlVGFyZ2V0KFN0cmluZyBsYW5ndWFnZSkgeworCQlUYXJnZXQgdGFyZ2V0ID0gbnVsbDsKKwkJU3RyaW5nIHRhcmdldE5hbWUgPSAib3JnLmFudGxyLmNvZGVnZW4uIitsYW5ndWFnZSsiVGFyZ2V0IjsKKwkJdHJ5IHsKKwkJCUNsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKHRhcmdldE5hbWUpOworCQkJdGFyZ2V0ID0gKFRhcmdldCljLm5ld0luc3RhbmNlKCk7CisJCX0KKwkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworCQkJdGFyZ2V0ID0gbmV3IFRhcmdldCgpOyAvLyB1c2UgZGVmYXVsdAorCQl9CisJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfQ1JFQVRFX1RBUkdFVF9HRU5FUkFUT1IsCisJCQkJCQkJICAgdGFyZ2V0TmFtZSwKKwkJCQkJCQkgICBpZSk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gY25mZSkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX0NSRUFURV9UQVJHRVRfR0VORVJBVE9SLAorCQkJCQkJCSAgIHRhcmdldE5hbWUsCisJCQkJCQkJICAgY25mZSk7CisJCX0KKwkJcmV0dXJuIHRhcmdldDsKKwl9CisKKwkvKiogbG9hZCB0aGUgbWFpbiBsYW5ndWFnZS5zdGcgdGVtcGxhdGUgZ3JvdXAgZmlsZSAqLworCXB1YmxpYyB2b2lkIGxvYWRUZW1wbGF0ZXMoU3RyaW5nIGxhbmd1YWdlKSB7CisJCVN0cmluZyBsYW5nRGlyID0gY2xhc3NwYXRoVGVtcGxhdGVSb290RGlyZWN0b3J5TmFtZSsiLyIrbGFuZ3VhZ2U7CisJCVNUR3JvdXAgY29yZVRlbXBsYXRlcyA9IG5ldyBTVEdyb3VwRmlsZShsYW5nRGlyKyIvIitsYW5ndWFnZSsiLnN0ZyIpOworCisJCWJhc2VUZW1wbGF0ZXMgPSBjb3JlVGVtcGxhdGVzOworCQlpZiAoIGNvcmVUZW1wbGF0ZXMgPT1udWxsICkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfTUlTU0lOR19DT0RFX0dFTl9URU1QTEFURVMsCisJCQkJCQkJICAgbGFuZ3VhZ2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gZHluYW1pY2FsbHkgYWRkIHN1Ymdyb3VwcyB0aGF0IGFjdCBsaWtlIGZpbHRlcnMgdG8gYXBwbHkgdG8KKwkJLy8gdGhlaXIgc3VwZXJncm91cC4gIEUuZy4sIEphdmE6RGJnOkFTVDpBU1RQYXJzZXI6OkFTVERiZy4KKwkJU3RyaW5nIG91dHB1dE9wdGlvbiA9IChTdHJpbmcpZ3JhbW1hci5nZXRPcHRpb24oIm91dHB1dCIpOworCQlpZiAoIG91dHB1dE9wdGlvbiE9bnVsbCAmJiBvdXRwdXRPcHRpb24uZXF1YWxzKCJBU1QiKSApIHsKKwkJCWlmICggZGVidWcgJiYgZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICkgeworCQkJCVNUR3JvdXAgZGJnVGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9EYmcuc3RnIik7CisJCQkJZGJnVGVtcGxhdGVzLmltcG9ydFRlbXBsYXRlcyhjb3JlVGVtcGxhdGVzKTsKKwkJCQliYXNlVGVtcGxhdGVzID0gZGJnVGVtcGxhdGVzOworCQkJCVNUR3JvdXAgYXN0VGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9BU1Quc3RnIik7CisJCQkJYXN0VGVtcGxhdGVzLmltcG9ydFRlbXBsYXRlcyhkYmdUZW1wbGF0ZXMpOworCQkJCVNUR3JvdXAgYXN0UGFyc2VyVGVtcGxhdGVzID0gYXN0VGVtcGxhdGVzOworCQkJCWlmICggZ3JhbW1hci50eXBlPT1HcmFtbWFyLlRSRUVfUEFSU0VSICkgeworCQkJCQlhc3RQYXJzZXJUZW1wbGF0ZXMgPSBuZXcgU1RHcm91cEZpbGUobGFuZ0RpcisiL0FTVFRyZWVQYXJzZXIuc3RnIik7CisJCQkJCWFzdFBhcnNlclRlbXBsYXRlcy5pbXBvcnRUZW1wbGF0ZXMoYXN0VGVtcGxhdGVzKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWFzdFBhcnNlclRlbXBsYXRlcyA9IG5ldyBTVEdyb3VwRmlsZShsYW5nRGlyKyIvQVNUUGFyc2VyLnN0ZyIpOworCQkJCQlhc3RQYXJzZXJUZW1wbGF0ZXMuaW1wb3J0VGVtcGxhdGVzKGFzdFRlbXBsYXRlcyk7CisJCQkJfQorCQkJCVNUR3JvdXAgYXN0RGJnVGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9BU1REYmcuc3RnIik7CisJCQkJYXN0RGJnVGVtcGxhdGVzLmltcG9ydFRlbXBsYXRlcyhhc3RQYXJzZXJUZW1wbGF0ZXMpOworCQkJCXRlbXBsYXRlcyA9IGFzdERiZ1RlbXBsYXRlczsKKwkJCQlkYmdUZW1wbGF0ZXMuaXRlcmF0ZUFjcm9zc1ZhbHVlcyA9IHRydWU7IC8vIFNUIHYzIGNvbXBhdGliaWxpdHkgd2l0aCBNYXBzCisJCQkJYXN0RGJnVGVtcGxhdGVzLml0ZXJhdGVBY3Jvc3NWYWx1ZXMgPSB0cnVlOworCQkJCWFzdFBhcnNlclRlbXBsYXRlcy5pdGVyYXRlQWNyb3NzVmFsdWVzID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVNUR3JvdXAgYXN0VGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9BU1Quc3RnIik7CisJCQkJYXN0VGVtcGxhdGVzLmltcG9ydFRlbXBsYXRlcyhjb3JlVGVtcGxhdGVzKTsKKwkJCQlTVEdyb3VwIGFzdFBhcnNlclRlbXBsYXRlcyA9IGFzdFRlbXBsYXRlczsKKwkJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5UUkVFX1BBUlNFUiApIHsKKwkJCQkJYXN0UGFyc2VyVGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9BU1RUcmVlUGFyc2VyLnN0ZyIpOworCQkJCQlhc3RQYXJzZXJUZW1wbGF0ZXMuaW1wb3J0VGVtcGxhdGVzKGFzdFRlbXBsYXRlcyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlhc3RQYXJzZXJUZW1wbGF0ZXMgPSBuZXcgU1RHcm91cEZpbGUobGFuZ0RpcisiL0FTVFBhcnNlci5zdGciKTsKKwkJCQkJYXN0UGFyc2VyVGVtcGxhdGVzLmltcG9ydFRlbXBsYXRlcyhhc3RUZW1wbGF0ZXMpOworCQkJCX0KKwkJCQl0ZW1wbGF0ZXMgPSBhc3RQYXJzZXJUZW1wbGF0ZXM7CisJCQkJYXN0VGVtcGxhdGVzLml0ZXJhdGVBY3Jvc3NWYWx1ZXMgPSB0cnVlOyAvLyBTVCB2MyBjb21wYXRpYmlsaXR5IHdpdGggTWFwcworCQkJCWFzdFBhcnNlclRlbXBsYXRlcy5pdGVyYXRlQWNyb3NzVmFsdWVzID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggb3V0cHV0T3B0aW9uIT1udWxsICYmIG91dHB1dE9wdGlvbi5lcXVhbHMoInRlbXBsYXRlIikgKSB7CisJCQlpZiAoIGRlYnVnICYmIGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiApIHsKKwkJCQlTVEdyb3VwIGRiZ1RlbXBsYXRlcyA9IG5ldyBTVEdyb3VwRmlsZShsYW5nRGlyKyIvRGJnLnN0ZyIpOworCQkJCWRiZ1RlbXBsYXRlcy5pbXBvcnRUZW1wbGF0ZXMoY29yZVRlbXBsYXRlcyk7CisJCQkJYmFzZVRlbXBsYXRlcyA9IGRiZ1RlbXBsYXRlczsKKwkJCQlTVEdyb3VwIHN0VGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9TVC5zdGciKTsKKwkJCQlzdFRlbXBsYXRlcy5pbXBvcnRUZW1wbGF0ZXMoZGJnVGVtcGxhdGVzKTsKKwkJCQl0ZW1wbGF0ZXMgPSBzdFRlbXBsYXRlczsKKwkJCQlkYmdUZW1wbGF0ZXMuaXRlcmF0ZUFjcm9zc1ZhbHVlcyA9IHRydWU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTVEdyb3VwIHN0VGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9TVC5zdGciKTsKKwkJCQlzdFRlbXBsYXRlcy5pbXBvcnRUZW1wbGF0ZXMoY29yZVRlbXBsYXRlcyk7CisJCQkJdGVtcGxhdGVzID0gc3RUZW1wbGF0ZXM7CisJCQl9CisJCQl0ZW1wbGF0ZXMuaXRlcmF0ZUFjcm9zc1ZhbHVlcyA9IHRydWU7IC8vIFNUIHYzIGNvbXBhdGliaWxpdHkgd2l0aCBNYXBzCisJCX0KKwkJZWxzZSBpZiAoIGRlYnVnICYmIGdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiApIHsKKwkJCVNUR3JvdXAgZGJnVGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGxhbmdEaXIrIi9EYmcuc3RnIik7CisJCQlkYmdUZW1wbGF0ZXMuaW1wb3J0VGVtcGxhdGVzKGNvcmVUZW1wbGF0ZXMpOworCQkJdGVtcGxhdGVzID0gZGJnVGVtcGxhdGVzOworCQkJYmFzZVRlbXBsYXRlcyA9IHRlbXBsYXRlczsKKwkJCWJhc2VUZW1wbGF0ZXMuaXRlcmF0ZUFjcm9zc1ZhbHVlcyA9IHRydWU7IC8vIFNUIHYzIGNvbXBhdGliaWxpdHkgd2l0aCBNYXBzCisJCX0KKwkJZWxzZSB7CisJCQl0ZW1wbGF0ZXMgPSBjb3JlVGVtcGxhdGVzOworCQkJY29yZVRlbXBsYXRlcy5pdGVyYXRlQWNyb3NzVmFsdWVzID0gdHJ1ZTsgLy8gU1QgdjMgY29tcGF0aWJpbGl0eSB3aXRoIE1hcHMKKwkJfQorCX0KKworCS8qKiBHaXZlbiB0aGUgZ3JhbW1hciB0byB3aGljaCB3ZSBhcmUgYXR0YWNoZWQsIHdhbGsgdGhlIEFTVCBhc3NvY2lhdGVkCisJICogIHdpdGggdGhhdCBncmFtbWFyIHRvIGNyZWF0ZSBORkFzLiAgVGhlbiBjcmVhdGUgdGhlIERGQXMgZm9yIGFsbAorCSAqICBkZWNpc2lvbiBwb2ludHMgaW4gdGhlIGdyYW1tYXIgYnkgY29udmVydGluZyB0aGUgTkZBcyB0byBERkFzLgorCSAqICBGaW5hbGx5LCB3YWxrIHRoZSBBU1QgYWdhaW4gdG8gZ2VuZXJhdGUgY29kZS4KKwkgKgorCSAqICBFaXRoZXIgMSBvciAyIGZpbGVzIGFyZSB3cml0dGVuOgorCSAqCisJICogCQlyZWNvZ25pemVyOiB0aGUgbWFpbiBwYXJzZXIvbGV4ZXIvdHJlZXdhbGtlciBpdGVtCisJICogCQloZWFkZXIgZmlsZTogbGFuZ3VhZ2UgbGlrZSBDL0MrKyBuZWVkIGV4dGVybiBkZWZpbml0aW9ucworCSAqCisJICogIFRoZSB0YXJnZXQsIHN1Y2ggYXMgSmF2YVRhcmdldCwgZGljdGF0ZXMgd2hpY2ggZmlsZXMgZ2V0IHdyaXR0ZW4uCisJICovCisJcHVibGljIFNUIGdlblJlY29nbml6ZXIoKSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCIjIyMgZ2VuZXJhdGUgIitncmFtbWFyLm5hbWUrIiByZWNvZ25pemVyIik7CisJCS8vIExPQUQgT1VUUFVUIFRFTVBMQVRFUworCQlsb2FkVGVtcGxhdGVzKGxhbmd1YWdlKTsKKwkJaWYgKCB0ZW1wbGF0ZXM9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIENSRUFURSBORkEgRlJPTSBHUkFNTUFSLCBDUkVBVEUgREZBIEZST00gTkZBCisJCWlmICggRXJyb3JNYW5hZ2VyLmRvTm90QXR0ZW1wdEFuYWx5c2lzKCkgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQl0YXJnZXQucGVyZm9ybUdyYW1tYXJBbmFseXNpcyh0aGlzLCBncmFtbWFyKTsKKworCisJCS8vIHNvbWUgZ3JhbW1hciBhbmFseXNpcyBlcnJvcnMgd2lsbCBub3QgeWllbGQgcmVsaWFibGUgREZBCisJCWlmICggRXJyb3JNYW5hZ2VyLmRvTm90QXR0ZW1wdENvZGVHZW4oKSApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLy8gT1BUSU1JWkUgREZBCisJCURGQU9wdGltaXplciBvcHRpbWl6ZXIgPSBuZXcgREZBT3B0aW1pemVyKGdyYW1tYXIpOworCQlvcHRpbWl6ZXIub3B0aW1pemUoKTsKKworCQkvLyBPVVRQVVQgRklMRSAoY29udGFpbnMgcmVjb2duaXplclNUKQorCQlvdXRwdXRGaWxlU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigib3V0cHV0RmlsZSIpOworCisJCS8vIEhFQURFUiBGSUxFCisJCWlmICggdGVtcGxhdGVzLmlzRGVmaW5lZCgiaGVhZGVyRmlsZSIpICkgeworCQkJaGVhZGVyRmlsZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImhlYWRlckZpbGUiKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIGNyZWF0ZSBhIGR1bW15IHRvIGF2b2lkIG51bGwtY2hlY2tzIGFsbCBvdmVyIGNvZGUgZ2VuZXJhdG9yCisJCQloZWFkZXJGaWxlU1QgPSBuZXcgU1QodGVtcGxhdGVzLCJ4eXoiKTsKKwkJCWhlYWRlckZpbGVTVC5hZGQoImN5Y2xpY0RGQXMiLCAoT2JqZWN0KW51bGwpOyAvLyBpdCBub3JtYWxseSBzZWVzIHRoaXMgZnJvbSBvdXRwdXRGaWxlCisJCQkvL2hlYWRlckZpbGVTVC5pbXBsLm5hbWUgPSAiZHVtbXktaGVhZGVyLWZpbGUiOworCQl9CisKKwkJYm9vbGVhbiBmaWx0ZXJNb2RlID0gZ3JhbW1hci5nZXRPcHRpb24oImZpbHRlciIpIT1udWxsICYmCisJCQkJCQkJICBncmFtbWFyLmdldE9wdGlvbigiZmlsdGVyIikuZXF1YWxzKCJ0cnVlIik7CisgICAgICAgIGJvb2xlYW4gY2FuQmFja3RyYWNrID0gZ3JhbW1hci5nZXRTeW50YWN0aWNQcmVkaWNhdGVzKCkhPW51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyLmNvbXBvc2l0ZS5nZXRSb290R3JhbW1hcigpLmF0TGVhc3RPbmVCYWNrdHJhY2tPcHRpb24gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNb2RlOworCisgICAgICAgIC8vIFRPRE86IG1vdmUgdGhpcyBkb3duIGZ1cnRoZXIgYmVjYXVzZSBnZW5lcmF0aW5nIHRoZSByZWNvZ25pemVyCisJCS8vIGFsdGVycyB0aGUgbW9kZWwgd2l0aCBpbmZvIG9uIHdobyB1c2VzIHByZWRlZmluZWQgcHJvcGVydGllcyBldGMuLi4KKwkJLy8gVGhlIGFjdGlvbnMgaGVyZSBtaWdodCByZWZlciB0byBzb21ldGhpbmcuCisKKwkJLy8gVGhlIG9ubHkgdHdvIHBvc3NpYmxlIG91dHB1dCBmaWxlcyBhcmUgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQuCisJCS8vIFZlcmlmeSBhY3Rpb24gc2NvcGVzIGFyZSBvayBmb3IgdGFyZ2V0IGFuZCBkdW1wIGFjdGlvbnMgaW50byBvdXRwdXQKKwkJLy8gVGVtcGxhdGVzIGNhbiBzYXkgPGFjdGlvbnMucGFyc2VyLmhlYWRlcj4gZm9yIGV4YW1wbGUuCisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IGFjdGlvbnMgPSBncmFtbWFyLmdldEFjdGlvbnMoKTsKKwkJdmVyaWZ5QWN0aW9uU2NvcGVzT2tGb3JUYXJnZXQoYWN0aW9ucyk7CisJCS8vIHRyYW5zbGF0ZSAkeDo6eSByZWZlcmVuY2VzCisJCXRyYW5zbGF0ZUFjdGlvbkF0dHJpYnV0ZVJlZmVyZW5jZXMoYWN0aW9ucyk7CisKKyAgICAgICAgU1QgZ2F0ZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImFjdGlvbkdhdGUiKTsKKyAgICAgICAgaWYgKCBmaWx0ZXJNb2RlICkgeworICAgICAgICAgICAgLy8gaWYgZmlsdGVyaW5nLCB3ZSBuZWVkIHRvIHNldCBhY3Rpb25zIHRvIGV4ZWN1dGUgYXQgYmFja3RyYWNraW5nCisgICAgICAgICAgICAvLyBsZXZlbCAxIG5vdCAwLgorICAgICAgICAgICAgZ2F0ZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImZpbHRlcmluZ0FjdGlvbkdhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBncmFtbWFyLnNldFN5blByZWRHYXRlSWZOb3RBbHJlYWR5KGdhdGVTVCk7CisKKyAgICAgICAgaGVhZGVyRmlsZVNULmFkZCgiYWN0aW9ucyIsIGFjdGlvbnMpOworCQlvdXRwdXRGaWxlU1QuYWRkKCJhY3Rpb25zIiwgYWN0aW9ucyk7CisKKwkJaGVhZGVyRmlsZVNULmFkZCgiYnVpbGRUZW1wbGF0ZSIsIG5ldyBCb29sZWFuKGdyYW1tYXIuYnVpbGRUZW1wbGF0ZSgpKSk7CisJCW91dHB1dEZpbGVTVC5hZGQoImJ1aWxkVGVtcGxhdGUiLCBuZXcgQm9vbGVhbihncmFtbWFyLmJ1aWxkVGVtcGxhdGUoKSkpOworCQloZWFkZXJGaWxlU1QuYWRkKCJidWlsZEFTVCIsIG5ldyBCb29sZWFuKGdyYW1tYXIuYnVpbGRBU1QoKSkpOworCQlvdXRwdXRGaWxlU1QuYWRkKCJidWlsZEFTVCIsIG5ldyBCb29sZWFuKGdyYW1tYXIuYnVpbGRBU1QoKSkpOworCisJCW91dHB1dEZpbGVTVC5hZGQoInJld3JpdGVNb2RlIiwgQm9vbGVhbi52YWx1ZU9mKGdyYW1tYXIucmV3cml0ZU1vZGUoKSkpOworCQloZWFkZXJGaWxlU1QuYWRkKCJyZXdyaXRlTW9kZSIsIEJvb2xlYW4udmFsdWVPZihncmFtbWFyLnJld3JpdGVNb2RlKCkpKTsKKworCQlvdXRwdXRGaWxlU1QuYWRkKCJiYWNrdHJhY2tpbmciLCBCb29sZWFuLnZhbHVlT2YoY2FuQmFja3RyYWNrKSk7CisJCWhlYWRlckZpbGVTVC5hZGQoImJhY2t0cmFja2luZyIsIEJvb2xlYW4udmFsdWVPZihjYW5CYWNrdHJhY2spKTsKKwkJLy8gdHVybiBvbiBtZW1vaXplIGF0dHJpYnV0ZSBhdCBncmFtbWFyIGxldmVsIHNvIHdlIGNhbiBjcmVhdGUgcnVsZU1lbW8uCisJCS8vIGVhY2ggcnVsZSBoYXMgbWVtb2l6ZSBhdHRyIHRoYXQgaGlkZXMgdGhpcyBvbmUsIGluZGljYXRpbmcgd2hldGhlcgorCQkvLyBpdCBuZWVkcyB0byBzYXZlIHJlc3VsdHMKKwkJU3RyaW5nIG1lbW9pemUgPSAoU3RyaW5nKWdyYW1tYXIuZ2V0T3B0aW9uKCJtZW1vaXplIik7CisJCW91dHB1dEZpbGVTVC5hZGQoIm1lbW9pemUiLAorCQkJCQkJIChncmFtbWFyLmF0TGVhc3RPbmVSdWxlTWVtb2l6ZXMgfHwKKwkJCQkJCSAgQm9vbGVhbi52YWx1ZU9mKG1lbW9pemUgIT0gbnVsbCAmJiBtZW1vaXplLmVxdWFscygidHJ1ZSIpKSAmJgorCQkJCQkJICBjYW5CYWNrdHJhY2spKTsKKwkJaGVhZGVyRmlsZVNULmFkZCgibWVtb2l6ZSIsCisJCQkJCQkgKGdyYW1tYXIuYXRMZWFzdE9uZVJ1bGVNZW1vaXplcyB8fAorCQkJCQkJICBCb29sZWFuLnZhbHVlT2YobWVtb2l6ZSAhPSBudWxsICYmIG1lbW9pemUuZXF1YWxzKCJ0cnVlIikpICYmCisJCQkJCQkgIGNhbkJhY2t0cmFjaykpOworCisKKwkJb3V0cHV0RmlsZVNULmFkZCgidHJhY2UiLCBCb29sZWFuLnZhbHVlT2YodHJhY2UpKTsKKwkJaGVhZGVyRmlsZVNULmFkZCgidHJhY2UiLCBCb29sZWFuLnZhbHVlT2YodHJhY2UpKTsKKworCQlvdXRwdXRGaWxlU1QuYWRkKCJwcm9maWxlIiwgQm9vbGVhbi52YWx1ZU9mKHByb2ZpbGUpKTsKKwkJaGVhZGVyRmlsZVNULmFkZCgicHJvZmlsZSIsIEJvb2xlYW4udmFsdWVPZihwcm9maWxlKSk7CisKKwkJLy8gUkVDT0dOSVpFUgorCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApIHsKKwkJCXJlY29nbml6ZXJTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJsZXhlciIpOworCQkJb3V0cHV0RmlsZVNULmFkZCgiTEVYRVIiLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOworCQkJaGVhZGVyRmlsZVNULmFkZCgiTEVYRVIiLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOworCQkJcmVjb2duaXplclNULmFkZCgiZmlsdGVyTW9kZSIsCisJCQkJCQkJIEJvb2xlYW4udmFsdWVPZihmaWx0ZXJNb2RlKSk7CisJCX0KKwkJZWxzZSBpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5QQVJTRVIgfHwKKwkJCWdyYW1tYXIudHlwZT09R3JhbW1hci5DT01CSU5FRCApCisJCXsKKwkJCXJlY29nbml6ZXJTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJwYXJzZXIiKTsKKwkJCW91dHB1dEZpbGVTVC5hZGQoIlBBUlNFUiIsIEJvb2xlYW4udmFsdWVPZih0cnVlKSk7CisJCQloZWFkZXJGaWxlU1QuYWRkKCJQQVJTRVIiLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOworCQl9CisJCWVsc2UgeworCQkJcmVjb2duaXplclNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInRyZWVQYXJzZXIiKTsKKwkJCW91dHB1dEZpbGVTVC5hZGQoIlRSRUVfUEFSU0VSIiwgQm9vbGVhbi52YWx1ZU9mKHRydWUpKTsKKwkJCWhlYWRlckZpbGVTVC5hZGQoIlRSRUVfUEFSU0VSIiwgQm9vbGVhbi52YWx1ZU9mKHRydWUpKTsKKyAgICAgICAgICAgIHJlY29nbml6ZXJTVC5hZGQoImZpbHRlck1vZGUiLAorCQkJCQkJCSBCb29sZWFuLnZhbHVlT2YoZmlsdGVyTW9kZSkpOworCQl9CisJCW91dHB1dEZpbGVTVC5hZGQoInJlY29nbml6ZXIiLCByZWNvZ25pemVyU1QpOworCQloZWFkZXJGaWxlU1QuYWRkKCJyZWNvZ25pemVyIiwgcmVjb2duaXplclNUKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgiYWN0aW9uU2NvcGUiLAorCQkJCQkJIGdyYW1tYXIuZ2V0RGVmYXVsdEFjdGlvblNjb3BlKGdyYW1tYXIudHlwZSkpOworCQloZWFkZXJGaWxlU1QuYWRkKCJhY3Rpb25TY29wZSIsCisJCQkJCQkgZ3JhbW1hci5nZXREZWZhdWx0QWN0aW9uU2NvcGUoZ3JhbW1hci50eXBlKSk7CisKKwkJU3RyaW5nIHRhcmdldEFwcHJvcHJpYXRlRmlsZU5hbWVTdHJpbmcgPQorCQkJdGFyZ2V0LmdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tU3RyaW5nKGdyYW1tYXIuZ2V0RmlsZU5hbWUoKSk7CisJCW91dHB1dEZpbGVTVC5hZGQoImZpbGVOYW1lIiwgdGFyZ2V0QXBwcm9wcmlhdGVGaWxlTmFtZVN0cmluZyk7CisJCWhlYWRlckZpbGVTVC5hZGQoImZpbGVOYW1lIiwgdGFyZ2V0QXBwcm9wcmlhdGVGaWxlTmFtZVN0cmluZyk7CisJCW91dHB1dEZpbGVTVC5hZGQoIkFOVExSVmVyc2lvbiIsIHRvb2wuVkVSU0lPTik7CisJCWhlYWRlckZpbGVTVC5hZGQoIkFOVExSVmVyc2lvbiIsIHRvb2wuVkVSU0lPTik7CisJCW91dHB1dEZpbGVTVC5hZGQoImdlbmVyYXRlZFRpbWVzdGFtcCIsIFRvb2wuZ2V0Q3VycmVudFRpbWVTdGFtcCgpKTsKKwkJaGVhZGVyRmlsZVNULmFkZCgiZ2VuZXJhdGVkVGltZXN0YW1wIiwgVG9vbC5nZXRDdXJyZW50VGltZVN0YW1wKCkpOworCisJCS8vIEdFTkVSQVRFIFJFQ09HTklaRVIKKwkJLy8gV2FsayB0aGUgQVNUIGhvbGRpbmcgdGhlIGlucHV0IGdyYW1tYXIsIHRoaXMgdGltZSBnZW5lcmF0aW5nIGNvZGUKKwkJLy8gRGVjaXNpb25zIGFyZSBnZW5lcmF0ZWQgYnkgdXNpbmcgdGhlIHByZWNvbXB1dGVkIERGQXMKKwkJLy8gRmlsbCBpbiB0aGUgdmFyaW91cyB0ZW1wbGF0ZXMgd2l0aCBkYXRhCisJCUNvZGVHZW5UcmVlV2Fsa2VyIGdlbiA9IG5ldyBDb2RlR2VuVHJlZVdhbGtlcihuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oZ3JhbW1hci5nZXRHcmFtbWFyVHJlZSgpKSk7CisJCXRyeSB7CisJCQlnZW4uZ3JhbW1hcl8oCisJCQkJCQlncmFtbWFyLAorCQkJCQkJcmVjb2duaXplclNULAorCQkJCQkJb3V0cHV0RmlsZVNULAorCQkJCQkJaGVhZGVyRmlsZVNUKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0JBRF9BU1RfU1RSVUNUVVJFLAorCQkJCQkJCSAgIHJlKTsKKwkJfQorCisJCWdlblRva2VuVHlwZUNvbnN0YW50cyhyZWNvZ25pemVyU1QpOworCQlnZW5Ub2tlblR5cGVDb25zdGFudHMob3V0cHV0RmlsZVNUKTsKKwkJZ2VuVG9rZW5UeXBlQ29uc3RhbnRzKGhlYWRlckZpbGVTVCk7CisKKwkJaWYgKCBncmFtbWFyLnR5cGUhPUdyYW1tYXIuTEVYRVIgKSB7CisJCQlnZW5Ub2tlblR5cGVOYW1lcyhyZWNvZ25pemVyU1QpOworCQkJZ2VuVG9rZW5UeXBlTmFtZXMob3V0cHV0RmlsZVNUKTsKKwkJCWdlblRva2VuVHlwZU5hbWVzKGhlYWRlckZpbGVTVCk7CisJCX0KKworCQkvLyBOb3cgdGhhdCB3ZSBrbm93IHdoYXQgc3lucHJlZHMgYXJlIHVzZWQsIHdlIGNhbiBzZXQgaW50byB0ZW1wbGF0ZQorCQlTZXQgc3lucHJlZE5hbWVzID0gbnVsbDsKKwkJaWYgKCBncmFtbWFyLnN5blByZWROYW1lc1VzZWRJbkRGQS5zaXplKCk+MCApIHsKKwkJCXN5bnByZWROYW1lcyA9IGdyYW1tYXIuc3luUHJlZE5hbWVzVXNlZEluREZBOworCQl9CisJCW91dHB1dEZpbGVTVC5hZGQoInN5bnByZWRzIiwgc3lucHJlZE5hbWVzKTsKKwkJaGVhZGVyRmlsZVNULmFkZCgic3lucHJlZHMiLCBzeW5wcmVkTmFtZXMpOworCisJCS8vIGFsbCByZWNvZ25pemVycyBjYW4gc2VlIEdyYW1tYXIgb2JqZWN0CisJCXJlY29nbml6ZXJTVC5hZGQoImdyYW1tYXIiLCBncmFtbWFyKTsKKworCQlpZiAoTEFVTkNIX1NUX0lOU1BFQ1RPUikgeworCQkJb3V0cHV0RmlsZVNULmluc3BlY3QoKTsKKwkJCWlmICggdGVtcGxhdGVzLmlzRGVmaW5lZCgiaGVhZGVyRmlsZSIpICkgaGVhZGVyRmlsZVNULmluc3BlY3QoKTsKKwkJfQorCisJCS8vIFdSSVRFIEZJTEVTCisJCXRyeSB7CisJCQl0YXJnZXQuZ2VuUmVjb2duaXplckZpbGUodG9vbCx0aGlzLGdyYW1tYXIsb3V0cHV0RmlsZVNUKTsKKwkJCWlmICggdGVtcGxhdGVzLmlzRGVmaW5lZCgiaGVhZGVyRmlsZSIpICkgeworCQkJCVNUIGV4dFNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImhlYWRlckZpbGVFeHRlbnNpb24iKTsKKwkJCQl0YXJnZXQuZ2VuUmVjb2duaXplckhlYWRlckZpbGUodG9vbCx0aGlzLGdyYW1tYXIsaGVhZGVyRmlsZVNULGV4dFNULnJlbmRlcigpKTsKKwkJCX0KKwkJCS8vIHdyaXRlIG91dCB0aGUgdm9jYWIgaW50ZXJjaGFuZ2UgZmlsZTsgdXNlZCBieSBhbnRsciwKKwkJCS8vIGRvZXMgbm90IGNoYW5nZSBwZXIgdGFyZ2V0CisJCQlTVCB0b2tlblZvY2FiU2VyaWFsaXphdGlvbiA9IGdlblRva2VuVm9jYWJPdXRwdXQoKTsKKwkJCVN0cmluZyB2b2NhYkZpbGVOYW1lID0gZ2V0Vm9jYWJGaWxlTmFtZSgpOworCQkJaWYgKCB2b2NhYkZpbGVOYW1lIT1udWxsICkgeworCQkJCXdyaXRlKHRva2VuVm9jYWJTZXJpYWxpemF0aW9uLCB2b2NhYkZpbGVOYW1lKTsKKwkJCX0KKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKG91dHB1dEZpbGVTVC5nZXRET1RGb3JEZXBlbmRlbmN5R3JhcGgoZmFsc2UpKTsKKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfV1JJVEVfRklMRSwgaW9lKTsKKwkJfQorCQkvKgorCQlTeXN0ZW0ub3V0LnByaW50bG4oIm51bSBvYmoucHJvcCByZWZzOiAiKyBBU1RFeHByLnRvdGFsT2JqUHJvcFJlZnMpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIm51bSByZWZsZWN0aW9uIGxvb2t1cHM6ICIrIEFTVEV4cHIudG90YWxSZWZsZWN0aW9uTG9va3Vwcyk7CisJCSovCisKKwkJcmV0dXJuIG91dHB1dEZpbGVTVDsKKwl9CisKKwkvKiogU29tZSB0YXJnZXRzIHdpbGwgaGF2ZSBzb21lIGV4dHJhIHNjb3BlcyBsaWtlIEMrKyBtYXkgaGF2ZQorCSAqICAnQGhlYWRlcmZpbGU6bmFtZSB7YWN0aW9ufScgb3Igc29tZXRoaW5nLiAgTWFrZSBzdXJlIHRoZQorCSAqICB0YXJnZXQgbGlrZXMgdGhlIHNjb3BlcyBpbiBhY3Rpb24gdGFibGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWN0aW9uU2NvcGVzT2tGb3JUYXJnZXQoTWFwIGFjdGlvbnMpIHsKKwkJU2V0IGFjdGlvblNjb3BlS2V5U2V0ID0gYWN0aW9ucy5rZXlTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IGFjdGlvblNjb3BlS2V5U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyBzY29wZSA9IChTdHJpbmcpaXQubmV4dCgpOworCQkJaWYgKCAhdGFyZ2V0LmlzVmFsaWRBY3Rpb25TY29wZShncmFtbWFyLnR5cGUsIHNjb3BlKSApIHsKKwkJCQkvLyBnZXQgYW55IGFjdGlvbiBmcm9tIHRoZSBzY29wZSB0byBnZXQgZXJyb3IgbG9jYXRpb24KKwkJCQlNYXAgc2NvcGVBY3Rpb25zID0gKE1hcClhY3Rpb25zLmdldChzY29wZSk7CisJCQkJR3JhbW1hckFTVCBhY3Rpb25BU1QgPQorCQkJCQkoR3JhbW1hckFTVClzY29wZUFjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcigKKwkJCQkJRXJyb3JNYW5hZ2VyLk1TR19JTlZBTElEX0FDVElPTl9TQ09QRSxncmFtbWFyLAorCQkJCQlhY3Rpb25BU1QuZ2V0VG9rZW4oKSxzY29wZSwKKwkJCQkJZ3JhbW1hci5nZXRHcmFtbWFyVHlwZVN0cmluZygpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKiBBY3Rpb25zIG1heSByZWZlcmVuY2UgJHg6OnkgYXR0cmlidXRlcywgY2FsbCB0cmFuc2xhdGVBY3Rpb24gb24KKwkgKiAgZWFjaCBhY3Rpb24gYW5kIHJlcGxhY2UgdGhhdCBhY3Rpb24gaW4gdGhlIE1hcC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVBY3Rpb25BdHRyaWJ1dGVSZWZlcmVuY2VzKE1hcCBhY3Rpb25zKSB7CisJCVNldCBhY3Rpb25TY29wZUtleVNldCA9IGFjdGlvbnMua2V5U2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBhY3Rpb25TY29wZUtleVNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgc2NvcGUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKKwkJCU1hcCBzY29wZUFjdGlvbnMgPSAoTWFwKWFjdGlvbnMuZ2V0KHNjb3BlKTsKKwkJCXRyYW5zbGF0ZUFjdGlvbkF0dHJpYnV0ZVJlZmVyZW5jZXNGb3JTaW5nbGVTY29wZShudWxsLHNjb3BlQWN0aW9ucyk7CisJCX0KKwl9CisKKwkvKiogVXNlIGZvciB0cmFuc2xhdGluZyBydWxlIEBpbml0ey4uLn0gYWN0aW9ucyB0aGF0IGhhdmUgbm8gc2NvcGUgKi8KKwlwdWJsaWMgdm9pZCB0cmFuc2xhdGVBY3Rpb25BdHRyaWJ1dGVSZWZlcmVuY2VzRm9yU2luZ2xlU2NvcGUoCisJCVJ1bGUgciwKKwkJTWFwIHNjb3BlQWN0aW9ucykKKwl7CisJCVN0cmluZyBydWxlTmFtZT1udWxsOworCQlpZiAoIHIhPW51bGwgKSB7CisJCQlydWxlTmFtZSA9IHIubmFtZTsKKwkJfQorCQlTZXQgYWN0aW9uTmFtZVNldCA9IHNjb3BlQWN0aW9ucy5rZXlTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBuYW1lSVQgPSBhY3Rpb25OYW1lU2V0Lml0ZXJhdG9yKCk7IG5hbWVJVC5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVJVC5uZXh0KCk7CisJCQlHcmFtbWFyQVNUIGFjdGlvbkFTVCA9IChHcmFtbWFyQVNUKXNjb3BlQWN0aW9ucy5nZXQobmFtZSk7CisJCQlMaXN0IGNodW5rcyA9IHRyYW5zbGF0ZUFjdGlvbihydWxlTmFtZSxhY3Rpb25BU1QpOworCQkJc2NvcGVBY3Rpb25zLnB1dChuYW1lLCBjaHVua3MpOyAvLyByZXBsYWNlIHdpdGggdHJhbnNsYXRpb24KKwkJfQorCX0KKworCS8qKiBFcnJvciByZWNvdmVyeSBpbiBBTlRMUiByZWNvZ25pemVycy4KKwkgKgorCSAqICBCYXNlZCB1cG9uIG9yaWdpbmFsIGlkZWFzOgorCSAqCisJICogIEFsZ29yaXRobXMgKyBEYXRhIFN0cnVjdHVyZXMgPSBQcm9ncmFtcyBieSBOaWtsYXVzIFdpcnRoCisJICoKKwkgKiAgYW5kCisJICoKKwkgKiAgQSBub3RlIG9uIGVycm9yIHJlY292ZXJ5IGluIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlcnM6CisJICogIGh0dHA6Ly9wb3J0YWwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9OTQ3OTAyLjk0NzkwNQorCSAqCisJICogIExhdGVyLCBKb3NlZiBHcm9zY2ggaGFkIHNvbWUgZ29vZCBpZGVhczoKKwkgKiAgRWZmaWNpZW50IGFuZCBDb21mb3J0YWJsZSBFcnJvciBSZWNvdmVyeSBpbiBSZWN1cnNpdmUgRGVzY2VudCBQYXJzZXJzOgorCSAqICBmdHA6Ly93d3cuY29jb2xhYi5jb20vcHJvZHVjdHMvY29ja3RhaWwvZG9jYTQucHMvZWxsLnBzLnppcAorCSAqCisJICogIExpa2UgR3Jvc2NoIEkgaW1wbGVtZW50ZWQgbG9jYWwgRk9MTE9XIHNldHMgdGhhdCBhcmUgY29tYmluZWQgYXQgcnVuLXRpbWUKKwkgKiAgdXBvbiBlcnJvciB0byBhdm9pZCBwYXJzaW5nIG92ZXJoZWFkLgorCSAqLworCXB1YmxpYyB2b2lkIGdlbmVyYXRlTG9jYWxGT0xMT1coR3JhbW1hckFTVCByZWZlcmVuY2VkRWxlbWVudE5vZGUsCisJCQkJCQkJCQlTdHJpbmcgcmVmZXJlbmNlZEVsZW1lbnROYW1lLAorCQkJCQkJCQkJU3RyaW5nIGVuY2xvc2luZ1J1bGVOYW1lLAorCQkJCQkJCQkJaW50IGVsZW1lbnRJbmRleCkKKwl7CisJCS8qCisJCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcHV0ZSBGT0xMT1cgIitncmFtbWFyLm5hbWUrIi4iK3JlZmVyZW5jZWRFbGVtZW50Tm9kZS50b1N0cmluZygpKworCQkJCQkJICIgZm9yICIrcmVmZXJlbmNlZEVsZW1lbnROYW1lKyIjIitlbGVtZW50SW5kZXggKyIgaW4gIisKKwkJCQkJCSBlbmNsb3NpbmdSdWxlTmFtZSsKKwkJCQkJCSAiIGxpbmU9IityZWZlcmVuY2VkRWxlbWVudE5vZGUuZ2V0TGluZSgpKTsKKwkJCQkJCSAqLworCQlORkFTdGF0ZSBmb2xsb3dpbmdORkFTdGF0ZSA9IHJlZmVyZW5jZWRFbGVtZW50Tm9kZS5mb2xsb3dpbmdORkFTdGF0ZTsKKwkJTG9va2FoZWFkU2V0IGZvbGxvdyA9IG51bGw7CisJCWlmICggZm9sbG93aW5nTkZBU3RhdGUhPW51bGwgKSB7CisJCQkvLyBjb21wdXRlIGZvbGxvdyBmb3IgdGhpcyBlbGVtZW50IGFuZCwgYXMgc2lkZS1lZmZlY3QsIHRyYWNrCisJCQkvLyB0aGUgcnVsZSBMT09LIHNlbnNpdGl2aXR5LgorCQkJZm9sbG93ID0gZ3JhbW1hci5GSVJTVChmb2xsb3dpbmdORkFTdGF0ZSk7CisJCX0KKworCQlpZiAoIGZvbGxvdz09bnVsbCApIHsKKwkJCUVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCJubyBmb2xsb3cgc3RhdGUgb3IgY2Fubm90IGNvbXB1dGUgZm9sbG93Iik7CisJCQlmb2xsb3cgPSBuZXcgTG9va2FoZWFkU2V0KCk7CisJCX0KKwkJaWYgKCBmb2xsb3cubWVtYmVyKExhYmVsLkVPRikgKSB7CisJCQkvLyBUT0RPOiBjYW4gd2UganVzdCByZW1vdmU/ICBTZWVtcyBuZWVkZWQgaGVyZToKKwkJCS8vIGNvbXBpbGF0aW9uX3VuaXQgOiBnbG9iYWxfc3RhdGVtZW50KiBFT0YKKwkJCS8vIEFjdHVhbGx5IGkgZ3Vlc3Mgd2UgcmVzeW5jIHRvIEVPRiByZWdhcmRsZXNzCisJCQlmb2xsb3cucmVtb3ZlKExhYmVsLkVPRik7CisJCX0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiAiK2ZvbGxvdyk7CisKKyAgICAgICAgTGlzdCB0b2tlblR5cGVMaXN0ID0gbnVsbDsKKyAgICAgICAgbG9uZ1tdIHdvcmRzID0gbnVsbDsKKwkJaWYgKCBmb2xsb3cudG9rZW5UeXBlU2V0PT1udWxsICkgeworCQkJd29yZHMgPSBuZXcgbG9uZ1sxXTsKKyAgICAgICAgICAgIHRva2VuVHlwZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIH0KKwkJZWxzZSB7CisJCQlCaXRTZXQgYml0cyA9IEJpdFNldC5vZihmb2xsb3cudG9rZW5UeXBlU2V0KTsKKwkJCXdvcmRzID0gYml0cy50b1BhY2tlZEFycmF5KCk7CisgICAgICAgICAgICB0b2tlblR5cGVMaXN0ID0gZm9sbG93LnRva2VuVHlwZVNldC50b0xpc3QoKTsKKyAgICAgICAgfQorCQkvLyB1c2UgdGhlIHRhcmdldCB0byBjb252ZXJ0IHRvIGhleCBzdHJpbmdzICh0eXBpY2FsbHkpCisJCVN0cmluZ1tdIHdvcmRTdHJpbmdzID0gbmV3IFN0cmluZ1t3b3Jkcy5sZW5ndGhdOworCQlmb3IgKGludCBqID0gMDsgaiA8IHdvcmRzLmxlbmd0aDsgaisrKSB7CisJCQlsb25nIHcgPSB3b3Jkc1tqXTsKKwkJCXdvcmRTdHJpbmdzW2pdID0gdGFyZ2V0LmdldFRhcmdldDY0Qml0U3RyaW5nRnJvbVZhbHVlKHcpOworCQl9CisJCXJlY29nbml6ZXJTVC5hZGRBZ2dyKCJiaXRzZXRzLntuYW1lLGluTmFtZSxiaXRzLHRva2VuVHlwZXMsdG9rZW5JbmRleH0iLAorCQkJCQkJCSByZWZlcmVuY2VkRWxlbWVudE5hbWUsCisJCQkJCQkJIGVuY2xvc2luZ1J1bGVOYW1lLAorCQkJCQkJCSB3b3JkU3RyaW5ncywKKwkJCQkJCQkgdG9rZW5UeXBlTGlzdCwKKwkJCQkJCQkgVXRpbHMuaW50ZWdlcihlbGVtZW50SW5kZXgpKTsKKwkJb3V0cHV0RmlsZVNULmFkZEFnZ3IoImJpdHNldHMue25hbWUsaW5OYW1lLGJpdHMsdG9rZW5UeXBlcyx0b2tlbkluZGV4fSIsCisJCQkJCQkJIHJlZmVyZW5jZWRFbGVtZW50TmFtZSwKKwkJCQkJCQkgZW5jbG9zaW5nUnVsZU5hbWUsCisJCQkJCQkJIHdvcmRTdHJpbmdzLAorCQkJCQkJCSB0b2tlblR5cGVMaXN0LAorCQkJCQkJCSBVdGlscy5pbnRlZ2VyKGVsZW1lbnRJbmRleCkpOworCQloZWFkZXJGaWxlU1QuYWRkQWdncigiYml0c2V0cy57bmFtZSxpbk5hbWUsYml0cyx0b2tlblR5cGVzLHRva2VuSW5kZXh9IiwKKwkJCQkJCQkgcmVmZXJlbmNlZEVsZW1lbnROYW1lLAorCQkJCQkJCSBlbmNsb3NpbmdSdWxlTmFtZSwKKwkJCQkJCQkgd29yZFN0cmluZ3MsCisJCQkJCQkJIHRva2VuVHlwZUxpc3QsCisJCQkJCQkJIFV0aWxzLmludGVnZXIoZWxlbWVudEluZGV4KSk7CisJfQorCisJLy8gTCBPIE8gSyBBIEggRSBBIEQgIEQgRSBDIEkgUyBJIE8gTiAgRyBFIE4gRSBSIEEgVCBJIE8gTgorCisJLyoqIEdlbmVyYXRlIGNvZGUgdGhhdCBjb21wdXRlcyB0aGUgcHJlZGljdGVkIGFsdCBnaXZlbiBhIERGQS4gIFRoZQorCSAqICByZWNvZ25pemVyU1QgY2FuIGJlIGVpdGhlciB0aGUgbWFpbiBnZW5lcmF0ZWQgcmVjb2duaXplclRlbXBsYXRlCisJICogIGZvciBzdG9yYWdlIGluIHRoZSBtYWluIHBhcnNlciBmaWxlIG9yIGEgc2VwYXJhdGUgZmlsZS4gIEl0J3MgdXAgdG8KKwkgKiAgdGhlIGNvZGUgdGhhdCB1bHRpbWF0ZWx5IGludm9rZXMgdGhlIGNvZGVnZW4uZyBncmFtbWFyIHJ1bGUuCisJICoKKwkgKiAgUmVnYXJkbGVzcywgdGhlIG91dHB1dCBmaWxlIGFuZCBoZWFkZXIgZmlsZSBnZXQgYSBjb3B5IG9mIHRoZSBERkFzLgorCSAqLworCXB1YmxpYyBTVCBnZW5Mb29rYWhlYWREZWNpc2lvbihTVCByZWNvZ25pemVyU1QsCisJCQkJCQkJCSAgIERGQSBkZmEpCisJeworCQlTVCBkZWNpc2lvblNUOworCQkvLyBJZiB3ZSBhcmUgZG9pbmcgaW5saW5lIERGQSBhbmQgdGhpcyBvbmUgaXMgYWN5Y2xpYyBhbmQgTEwoKikKKwkJLy8gSSBoYXZlIHRvIGNoZWNrIGZvciBpcy1ub24tTEwoKikgYmVjYXVzZSBpZiBub24tTEwoKikgdGhlIGN5Y2xpYworCQkvLyBjaGVjayBpcyBub3QgZG9uZSBieSBERkEudmVyaWZ5KCk7IHRoYXQgaXMsIHZlcmlmeSgpIGF2b2lkcworCQkvLyBkb2VzU3RhdGVSZWFjaEFjY2VwdFN0YXRlKCkgaWYgbm9uLUxMKCopCisJCWlmICggZGZhLmNhbklubGluZURlY2lzaW9uKCkgKSB7CisJCQlkZWNpc2lvblNUID0KKwkJCQlhY3ljbGljREZBR2VuZXJhdG9yLmdlbkZpeGVkTG9va2FoZWFkRGVjaXNpb24oZ2V0VGVtcGxhdGVzKCksIGRmYSk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBnZW5lcmF0ZSBhbnkga2luZCBvZiBERkEgaGVyZSAoY3ljbGljIG9yIGFjeWNsaWMpCisJCQlkZmEuY3JlYXRlU3RhdGVUYWJsZXModGhpcyk7CisJCQlvdXRwdXRGaWxlU1QuYWRkKCJjeWNsaWNERkFzIiwgZGZhKTsKKwkJCWhlYWRlckZpbGVTVC5hZGQoImN5Y2xpY0RGQXMiLCBkZmEpOworCQkJZGVjaXNpb25TVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJkZmFEZWNpc2lvbiIpOworCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpLmdldERlc2NyaXB0aW9uKCk7CisJCQlkZXNjcmlwdGlvbiA9IHRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhkZXNjcmlwdGlvbik7CisJCQlpZiAoIGRlc2NyaXB0aW9uIT1udWxsICkgeworCQkJCWRlY2lzaW9uU1QuYWRkKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKwkJCX0KKwkJCWRlY2lzaW9uU1QuYWRkKCJkZWNpc2lvbk51bWJlciIsCisJCQkJCQkgICBVdGlscy5pbnRlZ2VyKGRmYS5nZXREZWNpc2lvbk51bWJlcigpKSk7CisJCX0KKwkJcmV0dXJuIGRlY2lzaW9uU1Q7CisJfQorCisJLyoqIEEgc3BlY2lhbCBzdGF0ZSBpcyBodWdlICh0b28gYmlnIGZvciBzdGF0ZSB0YWJsZXMpIG9yIGhhcyBhIHByZWRpY2F0ZWQKKwkgKiAgZWRnZS4gIEdlbmVyYXRlIGEgc2ltcGxlIGlmLXRoZW4tZWxzZS4gIENhbm5vdCBiZSBhbiBhY2NlcHQgc3RhdGUgYXMKKwkgKiAgdGhleSBoYXZlIG5vIGVtYW5hdGluZyBlZGdlcy4gIERvbid0IHdvcnJ5IGFib3V0IHN3aXRjaCB2cyBpZi10aGVuLWVsc2UKKwkgKiAgYmVjYXVzZSBpZiB5b3UgZ2V0IGhlcmUsIHRoZSBzdGF0ZSBpcyBzdXBlciBjb21wbGljYXRlZCBhbmQgbmVlZHMgYW4KKwkgKiAgaWYtdGhlbi1lbHNlLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBuZXcgREZBIHNjaGVtZSBjcmVhdGVkIEp1bmUgMjAwNi4KKwkgKi8KKwlwdWJsaWMgU1QgZ2VuZXJhdGVTcGVjaWFsU3RhdGUoREZBU3RhdGUgcykgeworCQlTVCBzdGF0ZVNUOworCQlzdGF0ZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImN5Y2xpY0RGQVN0YXRlIik7CisJCXN0YXRlU1QuYWRkKCJuZWVkRXJyb3JDbGF1c2UiLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOworCQlzdGF0ZVNULmFkZCgic2VtUHJlZFN0YXRlIiwKKwkJCQkJQm9vbGVhbi52YWx1ZU9mKHMuaXNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzKCkpKTsKKwkJc3RhdGVTVC5hZGQoInN0YXRlTnVtYmVyIiwgcy5zdGF0ZU51bWJlcik7CisJCXN0YXRlU1QuYWRkKCJkZWNpc2lvbk51bWJlciIsIHMuZGZhLmRlY2lzaW9uTnVtYmVyKTsKKworCQlib29sZWFuIGZvdW5kR2F0ZWRQcmVkID0gZmFsc2U7CisJCVNUIGVvdFNUID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIGVkZ2UgPSAoVHJhbnNpdGlvbikgcy50cmFuc2l0aW9uKGkpOworCQkJU1QgZWRnZVNUOworCQkJaWYgKCBlZGdlLmxhYmVsLmdldEF0b20oKT09TGFiZWwuRU9UICkgeworCQkJCS8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgY2xhdXNlOyBoYXMgdG8gaGVsZCB1bnRpbCBsYXN0CisJCQkJZWRnZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImVvdERGQUVkZ2UiKTsKKwkJCQlzdGF0ZVNULnJlbW92ZSgibmVlZEVycm9yQ2xhdXNlIik7CisJCQkJZW90U1QgPSBlZGdlU1Q7CisJCQl9CisJCQllbHNlIHsKKwkJCQllZGdlU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigiY3ljbGljREZBRWRnZSIpOworCQkJCVNUIGV4cHJTVCA9CisJCQkJCWdlbkxhYmVsRXhwcih0ZW1wbGF0ZXMsZWRnZSwxKTsKKwkJCQllZGdlU1QuYWRkKCJsYWJlbEV4cHIiLCBleHByU1QpOworCQkJfQorCQkJZWRnZVNULmFkZCgiZWRnZU51bWJlciIsIFV0aWxzLmludGVnZXIoaSArIDEpKTsKKwkJCWVkZ2VTVC5hZGQoInRhcmdldFN0YXRlTnVtYmVyIiwKKwkJCQkJICAgVXRpbHMuaW50ZWdlcihlZGdlLnRhcmdldC5zdGF0ZU51bWJlcikpOworCQkJLy8gc3RpY2sgaW4gYW55IGdhdGVkIHByZWRpY2F0ZXMgZm9yIGFueSBlZGdlIGlmIG5vdCBhbHJlYWR5IGEgcHJlZAorCQkJaWYgKCAhZWRnZS5sYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQkJREZBU3RhdGUgdCA9IChERkFTdGF0ZSllZGdlLnRhcmdldDsKKwkJCQlTZW1hbnRpY0NvbnRleHQgcHJlZHMgPQl0LmdldEdhdGVkUHJlZGljYXRlc0luTkZBQ29uZmlndXJhdGlvbnMoKTsKKwkJCQlpZiAoIHByZWRzIT1udWxsICkgeworCQkJCQlmb3VuZEdhdGVkUHJlZCA9IHRydWU7CisJCQkJCVNUIHByZWRTVCA9IHByZWRzLmdlbkV4cHIodGhpcywKKwkJCQkJCQkJCQkJCQkJICBnZXRUZW1wbGF0ZXMoKSwKKwkJCQkJCQkJCQkJCQkJICB0LmRmYSk7CisJCQkJCWVkZ2VTVC5hZGQoInByZWRpY2F0ZXMiLCBwcmVkU1QucmVuZGVyKCkpOworCQkJCX0KKwkJCX0KKwkJCWlmICggZWRnZS5sYWJlbC5nZXRBdG9tKCkhPUxhYmVsLkVPVCApIHsKKwkJCQlzdGF0ZVNULmFkZCgiZWRnZXMiLCBlZGdlU1QpOworCQkJfQorCQl9CisJCWlmICggZm91bmRHYXRlZFByZWQgKSB7CisJCQkvLyBzdGF0ZSBoYXMgPj0gMSBlZGdlIHdpdGggYSBnYXRlZCBwcmVkIChzeW4gb3Igc2VtKQorCQkJLy8gbXVzdCByZXdpbmQgaW5wdXQgZmlyc3QsIHNldCBmbGFnLgorCQkJc3RhdGVTVC5hZGQoInNlbVByZWRTdGF0ZSIsIG5ldyBCb29sZWFuKGZvdW5kR2F0ZWRQcmVkKSk7CisJCX0KKwkJaWYgKCBlb3RTVCE9bnVsbCApIHsKKwkJCXN0YXRlU1QuYWRkKCJlZGdlcyIsIGVvdFNUKTsKKwkJfQorCQlyZXR1cm4gc3RhdGVTVDsKKwl9CisKKwkvKiogR2VuZXJhdGUgYW4gZXhwcmVzc2lvbiBmb3IgdHJhdmVyc2luZyBhbiBlZGdlLiAqLworCXByb3RlY3RlZCBTVCBnZW5MYWJlbEV4cHIoU1RHcm91cCB0ZW1wbGF0ZXMsCisJCQkJCQkJCQkJICBUcmFuc2l0aW9uIGVkZ2UsCisJCQkJCQkJCQkJICBpbnQgaykKKwl7CisJCUxhYmVsIGxhYmVsID0gZWRnZS5sYWJlbDsKKwkJaWYgKCBsYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQlyZXR1cm4gZ2VuU2VtYW50aWNQcmVkaWNhdGVFeHByKHRlbXBsYXRlcywgZWRnZSk7CisJCX0KKwkJaWYgKCBsYWJlbC5pc1NldCgpICkgeworCQkJcmV0dXJuIGdlblNldEV4cHIodGVtcGxhdGVzLCBsYWJlbC5nZXRTZXQoKSwgaywgdHJ1ZSk7CisJCX0KKwkJLy8gbXVzdCBiZSBzaW1wbGUgbGFiZWwKKwkJU1QgZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoImxvb2thaGVhZFRlc3QiKTsKKwkJZVNULmFkZCgiYXRvbSIsIGdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwobGFiZWwuZ2V0QXRvbSgpKSk7CisJCWVTVC5hZGQoImF0b21Bc0ludCIsIFV0aWxzLmludGVnZXIobGFiZWwuZ2V0QXRvbSgpKSk7CisJCWVTVC5hZGQoImsiLCBVdGlscy5pbnRlZ2VyKGspKTsKKwkJcmV0dXJuIGVTVDsKKwl9CisKKwlwcm90ZWN0ZWQgU1QgZ2VuU2VtYW50aWNQcmVkaWNhdGVFeHByKFNUR3JvdXAgdGVtcGxhdGVzLAorCQkJCQkJCQkJCQkJCSAgVHJhbnNpdGlvbiBlZGdlKQorCXsKKwkJREZBIGRmYSA9ICgoREZBU3RhdGUpZWRnZS50YXJnZXQpLmRmYTsgLy8gd2hpY2ggREZBIGFyZSB3ZSBpbgorCQlMYWJlbCBsYWJlbCA9IGVkZ2UubGFiZWw7CisJCVNlbWFudGljQ29udGV4dCBzZW1DdHggPSBsYWJlbC5nZXRTZW1hbnRpY0NvbnRleHQoKTsKKwkJcmV0dXJuIHNlbUN0eC5nZW5FeHByKHRoaXMsdGVtcGxhdGVzLGRmYSk7CisJfQorCisJLyoqIEZvciBpbnRlcnZhbHMgc3VjaCBhcyBbMy4uMywgMzAuLjM1XSwgZ2VuZXJhdGUgYW4gZXhwcmVzc2lvbiB0aGF0CisJICogIHRlc3RzIHRoZSBsb29rYWhlYWQgc2ltaWxhciB0byBMQSgxKT09MyB8fCAoTEEoMSk+PTMwJiZMQSgxKTw9MzUpCisJICovCisJcHVibGljIFNUIGdlblNldEV4cHIoU1RHcm91cCB0ZW1wbGF0ZXMsCisJCQkJCQkJCQkgSW50U2V0IHNldCwKKwkJCQkJCQkJCSBpbnQgaywKKwkJCQkJCQkJCSBib29sZWFuIHBhcnRPZkRGQSkKKwl7CisJCWlmICggIShzZXQgaW5zdGFuY2VvZiBJbnRlcnZhbFNldCkgKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmFibGUgdG8gZ2VuZXJhdGUgZXhwcmVzc2lvbnMgZm9yIG5vbiBJbnRlcnZhbFNldCBvYmplY3RzIik7CisJCX0KKwkJSW50ZXJ2YWxTZXQgaXNldCA9IChJbnRlcnZhbFNldClzZXQ7CisJCWlmICggaXNldC5nZXRJbnRlcnZhbHMoKT09bnVsbCB8fCBpc2V0LmdldEludGVydmFscygpLnNpemUoKT09MCApIHsKKwkJCVNUIGVtcHR5U1QgPSBuZXcgU1QodGVtcGxhdGVzLCAiIik7CisJCQllbXB0eVNULmltcGwubmFtZSA9ICJlbXB0eS1zZXQtZXhwciI7CisJCQlyZXR1cm4gZW1wdHlTVDsKKwkJfQorCQlTdHJpbmcgdGVzdFNUTmFtZSA9ICJsb29rYWhlYWRUZXN0IjsKKwkJU3RyaW5nIHRlc3RSYW5nZVNUTmFtZSA9ICJsb29rYWhlYWRSYW5nZVRlc3QiOworCQlpZiAoICFwYXJ0T2ZERkEgKSB7CisJCQl0ZXN0U1ROYW1lID0gImlzb2xhdGVkTG9va2FoZWFkVGVzdCI7CisJCQl0ZXN0UmFuZ2VTVE5hbWUgPSAiaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QiOworCQl9CisJCVNUIHNldFNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInNldFRlc3QiKTsKKwkJSXRlcmF0b3IgaXRlciA9IGlzZXQuZ2V0SW50ZXJ2YWxzKCkuaXRlcmF0b3IoKTsKKwkJaW50IHJhbmdlTnVtYmVyID0gMTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlJbnRlcnZhbCBJID0gKEludGVydmFsKSBpdGVyLm5leHQoKTsKKwkJCWludCBhID0gSS5hOworCQkJaW50IGIgPSBJLmI7CisJCQlTVCBlU1Q7CisJCQlpZiAoIGE9PWIgKSB7CisJCQkJZVNUID0gdGVtcGxhdGVzLmdldEluc3RhbmNlT2YodGVzdFNUTmFtZSk7CisJCQkJZVNULmFkZCgiYXRvbSIsIGdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwoYSkpOworCQkJCWVTVC5hZGQoImF0b21Bc0ludCIsIFV0aWxzLmludGVnZXIoYSkpOworCQkJCS8vZVNULmFkZCgiayIsVXRpbHMuaW50ZWdlcihrKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQllU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZih0ZXN0UmFuZ2VTVE5hbWUpOworCQkJCWVTVC5hZGQoImxvd2VyIiwgZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbChhKSk7CisJCQkJZVNULmFkZCgibG93ZXJBc0ludCIsIFV0aWxzLmludGVnZXIoYSkpOworCQkJCWVTVC5hZGQoInVwcGVyIiwgZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbChiKSk7CisJCQkJZVNULmFkZCgidXBwZXJBc0ludCIsIFV0aWxzLmludGVnZXIoYikpOworCQkJCWVTVC5hZGQoInJhbmdlTnVtYmVyIiwgVXRpbHMuaW50ZWdlcihyYW5nZU51bWJlcikpOworCQkJfQorCQkJZVNULmFkZCgiayIsIFV0aWxzLmludGVnZXIoaykpOworCQkJc2V0U1QuYWRkKCJyYW5nZXMiLCBlU1QpOworCQkJcmFuZ2VOdW1iZXIrKzsKKwkJfQorCQlyZXR1cm4gc2V0U1Q7CisJfQorCisJLy8gVCBPIEsgRSBOICBEIEUgRiBJIE4gSSBUIEkgTyBOICBHIEUgTiBFIFIgQSBUIEkgTyBOCisKKwkvKiogU2V0IGF0dHJpYnV0ZXMgdG9rZW5zIGFuZCBsaXRlcmFscyBhdHRyaWJ1dGVzIGluIHRoZSBpbmNvbWluZworCSAqICBjb2RlIHRlbXBsYXRlLiAgVGhpcyBpcyBub3QgdGhlIHRva2VuIHZvY2FiIGludGVyY2hhbmdlIGZpbGUsIGJ1dAorCSAqICByYXRoZXIgYSBsaXN0IG9mIHRva2VuIHR5cGUgSUQgbmVlZGVkIGJ5IHRoZSByZWNvZ25pemVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGdlblRva2VuVHlwZUNvbnN0YW50cyhTVCBjb2RlKSB7CisJCS8vIG1ha2UgY29uc3RhbnRzIGZvciB0aGUgdG9rZW4gdHlwZXMKKwkJSXRlcmF0b3IgdG9rZW5JRHMgPSBncmFtbWFyLmdldFRva2VuSURzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKHRva2VuSURzLmhhc05leHQoKSkgeworCQkJU3RyaW5nIHRva2VuSUQgPSAoU3RyaW5nKSB0b2tlbklEcy5uZXh0KCk7CisJCQlpbnQgdG9rZW5UeXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUodG9rZW5JRCk7CisJCQlpZiAoIHRva2VuVHlwZT09TGFiZWwuRU9GIHx8CisJCQkJIHRva2VuVHlwZT49TGFiZWwuTUlOX1RPS0VOX1RZUEUgKQorCQkJeworCQkJCS8vIGRvbid0IGRvIEZBVVggbGFiZWxzICdjZXB0IEVPRgorCQkJCWNvZGUuYWRkQWdncigidG9rZW5zLntuYW1lLHR5cGV9IiwgdG9rZW5JRCwgVXRpbHMuaW50ZWdlcih0b2tlblR5cGUpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKiBHZW5lcmF0ZSBhIHRva2VuIG5hbWVzIHRhYmxlIHRoYXQgbWFwcyB0b2tlbiB0eXBlIHRvIGEgcHJpbnRhYmxlCisJICogIG5hbWU6IGVpdGhlciB0aGUgbGFiZWwgbGlrZSBJTlQgb3IgdGhlIGxpdGVyYWwgbGlrZSAiYmVnaW4iLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGdlblRva2VuVHlwZU5hbWVzKFNUIGNvZGUpIHsKKwkJZm9yIChpbnQgdD1MYWJlbC5NSU5fVE9LRU5fVFlQRTsgdDw9Z3JhbW1hci5nZXRNYXhUb2tlblR5cGUoKTsgdCsrKSB7CisJCQlTdHJpbmcgdG9rZW5OYW1lID0gZ3JhbW1hci5nZXRUb2tlbkRpc3BsYXlOYW1lKHQpOworCQkJaWYgKCB0b2tlbk5hbWUhPW51bGwgKSB7CisJCQkJdG9rZW5OYW1lPXRhcmdldC5nZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyh0b2tlbk5hbWUsIHRydWUpOworCQkJCWNvZGUuYWRkKCJ0b2tlbk5hbWVzIiwgdG9rZW5OYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKiBHZXQgYSBtZWFuaW5nZnVsIG5hbWUgZm9yIGEgdG9rZW4gdHlwZSB1c2VmdWwgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KKwkgKiAgTGl0ZXJhbHMgd2l0aG91dCBhc3NvY2lhdGVkIG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIHN0cmluZyBlcXVpdmFsZW50CisJICogIG9mIHRoZWlyIGludGVnZXIgdmFsdWVzLiBVc2VkIHRvIGdlbmVyYXRlIHg9PUlEIGFuZCB4PT0zNCB0eXBlIGNvbXBhcmlzb25zCisJICogIGV0Yy4uLiAgRXNzZW50aWFsbHkgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBtb3N0IG9idmlvdXMgd2F5IHRvIHJlZmVyCisJICogIHRvIGEgdG9rZW4gdHlwZSBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBJZiBpbiB0aGUgbGV4ZXIsIHJldHVybiB0aGUKKwkgKiAgY2hhciBsaXRlcmFsIHRyYW5zbGF0ZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEZvciBleGFtcGxlLCB0dHlwZT0xMAorCSAqICB3aWxsIHlpZWxkICdcbicgZnJvbSB0aGUgZ2V0VG9rZW5EaXNwbGF5TmFtZSBtZXRob2QuICBUaGF0IG11c3QKKwkgKiAgYmUgY29udmVydGVkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzIGxpdGVyYWxzLiAgRm9yIG1vc3QgQy1kZXJpdmVkCisJICogIGxhbmd1YWdlcyBubyB0cmFuc2xhdGlvbiBpcyBuZWVkZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRUb2tlblR5cGVBc1RhcmdldExhYmVsKGludCB0dHlwZSkgeworCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApIHsKKwkJCVN0cmluZyBuYW1lID0gZ3JhbW1hci5nZXRUb2tlbkRpc3BsYXlOYW1lKHR0eXBlKTsKKwkJCXJldHVybiB0YXJnZXQuZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbCh0aGlzLG5hbWUpOworCQl9CisJCXJldHVybiB0YXJnZXQuZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbCh0aGlzLHR0eXBlKTsKKwl9CisKKwkvKiogR2VuZXJhdGUgYSB0b2tlbiB2b2NhYiBmaWxlIHdpdGggYWxsIHRoZSB0b2tlbiBuYW1lcy90eXBlcy4gIEZvciBleGFtcGxlOgorCSAqICBJRD03CisJICogIEZPUj04CisJICogICdmb3InPTgKKwkgKgorCSAqICBUaGlzIGlzIGluZGVwZW5kZW50IG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2U7IHVzZWQgYnkgYW50bHIgaW50ZXJuYWxseQorCSAqLworCXByb3RlY3RlZCBTVCBnZW5Ub2tlblZvY2FiT3V0cHV0KCkgeworCQlTVCB2b2NhYkZpbGVTVCA9IG5ldyBTVCh2b2NhYkZpbGVQYXR0ZXJuKTsKKwkJdm9jYWJGaWxlU1QuYWRkKCJsaXRlcmFscyIsKE9iamVjdCludWxsKTsgLy8gImRlZmluZSIgbGl0ZXJhbHMgYXJnCisJCXZvY2FiRmlsZVNULmFkZCgidG9rZW5zIiwoT2JqZWN0KW51bGwpOworCQl2b2NhYkZpbGVTVC5pbXBsLm5hbWUgPSAidm9jYWItZmlsZSI7CisJCS8vIG1ha2UgY29uc3RhbnRzIGZvciB0aGUgdG9rZW4gbmFtZXMKKwkJSXRlcmF0b3IgdG9rZW5JRHMgPSBncmFtbWFyLmdldFRva2VuSURzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKHRva2VuSURzLmhhc05leHQoKSkgeworCQkJU3RyaW5nIHRva2VuSUQgPSAoU3RyaW5nKSB0b2tlbklEcy5uZXh0KCk7CisJCQlpbnQgdG9rZW5UeXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUodG9rZW5JRCk7CisJCQlpZiAoIHRva2VuVHlwZT49TGFiZWwuTUlOX1RPS0VOX1RZUEUgKSB7CisJCQkJdm9jYWJGaWxlU1QuYWRkQWdncigidG9rZW5zLntuYW1lLHR5cGV9IiwgdG9rZW5JRCwgVXRpbHMuaW50ZWdlcih0b2tlblR5cGUpKTsKKwkJCX0KKwkJfQorCisJCS8vIG5vdyBkdW1wIHRoZSBzdHJpbmdzCisJCUl0ZXJhdG9yIGxpdGVyYWxzID0gZ3JhbW1hci5nZXRTdHJpbmdMaXRlcmFscygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChsaXRlcmFscy5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBsaXRlcmFsID0gKFN0cmluZykgbGl0ZXJhbHMubmV4dCgpOworCQkJaW50IHRva2VuVHlwZSA9IGdyYW1tYXIuZ2V0VG9rZW5UeXBlKGxpdGVyYWwpOworCQkJaWYgKCB0b2tlblR5cGU+PUxhYmVsLk1JTl9UT0tFTl9UWVBFICkgeworCQkJCXZvY2FiRmlsZVNULmFkZEFnZ3IoInRva2Vucy57bmFtZSx0eXBlfSIsIGxpdGVyYWwsIFV0aWxzLmludGVnZXIodG9rZW5UeXBlKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdm9jYWJGaWxlU1Q7CisJfQorCisJcHVibGljIExpc3QgdHJhbnNsYXRlQWN0aW9uKFN0cmluZyBydWxlTmFtZSwKKwkJCQkJCQkJR3JhbW1hckFTVCBhY3Rpb25UcmVlKQorCXsKKwkJaWYgKCBhY3Rpb25UcmVlLmdldFR5cGUoKT09QU5UTFJQYXJzZXIuQVJHX0FDVElPTiApIHsKKwkJCXJldHVybiB0cmFuc2xhdGVBcmdBY3Rpb24ocnVsZU5hbWUsIGFjdGlvblRyZWUpOworCQl9CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKHRoaXMscnVsZU5hbWUsYWN0aW9uVHJlZSk7CisJCUxpc3QgY2h1bmtzID0gdHJhbnNsYXRvci50cmFuc2xhdGVUb0NodW5rcygpOworCQljaHVua3MgPSB0YXJnZXQucG9zdFByb2Nlc3NBY3Rpb24oY2h1bmtzLCBhY3Rpb25UcmVlLnRva2VuKTsKKwkJcmV0dXJuIGNodW5rczsKKwl9CisKKwkvKiogVHJhbnNsYXRlIGFuIGFjdGlvbiBsaWtlIFszLCJmb28iLGFbM11dIGFuZCByZXR1cm4gYSBMaXN0IG9mIHRoZQorCSAqICB0cmFuc2xhdGVkIGFjdGlvbnMuICBCZWNhdXNlIGFjdGlvbnMgYXJlIHRoZW1zZWx2ZXMgdHJhbnNsYXRlZCB0byBhIGxpc3QKKwkgKiAgb2YgY2h1bmtzLCBtdXN0IGNhdCB0b2dldGhlciBpbnRvIGEgU1Q+LiAgRG9uJ3QgdHJhbnNsYXRlCisJICogIHRvIHN0cmluZ3MgZWFybHkgYXMgd2UgbmVlZCB0byBldmFsIHRlbXBsYXRlcyBpbiBjb250ZXh0LgorCSAqLworCXB1YmxpYyBMaXN0PFNUPiB0cmFuc2xhdGVBcmdBY3Rpb24oU3RyaW5nIHJ1bGVOYW1lLAorCQkJCQkJCQkJCSAgIEdyYW1tYXJBU1QgYWN0aW9uVHJlZSkKKwl7CisJCVN0cmluZyBhY3Rpb25UZXh0ID0gYWN0aW9uVHJlZS50b2tlbi5nZXRUZXh0KCk7CisJCUxpc3Q8U3RyaW5nPiBhcmdzID0gZ2V0TGlzdE9mQXJndW1lbnRzRnJvbUFjdGlvbihhY3Rpb25UZXh0LCcsJyk7CisJCUxpc3Q8U1Q+IHRyYW5zbGF0ZWRBcmdzID0gbmV3IEFycmF5TGlzdDxTVD4oKTsKKwkJZm9yIChTdHJpbmcgYXJnIDogYXJncykgeworCQkJaWYgKCBhcmchPW51bGwgKSB7CisJCQkJVG9rZW4gYWN0aW9uVG9rZW4gPQorCQkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFyZyk7CisJCQkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IodGhpcyxydWxlTmFtZSwKKwkJCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCQkJICBhY3Rpb25UcmVlLm91dGVyQWx0TnVtKTsKKwkJCQlMaXN0IGNodW5rcyA9IHRyYW5zbGF0b3IudHJhbnNsYXRlVG9DaHVua3MoKTsKKwkJCQljaHVua3MgPSB0YXJnZXQucG9zdFByb2Nlc3NBY3Rpb24oY2h1bmtzLCBhY3Rpb25Ub2tlbik7CisJCQkJU1QgY2F0U1QgPSBuZXcgU1QodGVtcGxhdGVzLCAiPGNodW5rcz4iKTsKKwkJCQljYXRTVC5hZGQoImNodW5rcyIsIGNodW5rcyk7CisJCQkJdHJhbnNsYXRlZEFyZ3MuYWRkKGNhdFNUKTsKKwkJCX0KKwkJfQorCQlpZiAoIHRyYW5zbGF0ZWRBcmdzLnNpemUoKT09MCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0cmFuc2xhdGVkQXJnczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMaXN0T2ZBcmd1bWVudHNGcm9tQWN0aW9uKFN0cmluZyBhY3Rpb25UZXh0LAorCQkJCQkJCQkJCQkJCQkJaW50IHNlcGFyYXRvckNoYXIpCisJeworCQlMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlnZXRMaXN0T2ZBcmd1bWVudHNGcm9tQWN0aW9uKGFjdGlvblRleHQsIDAsIC0xLCBzZXBhcmF0b3JDaGFyLCBhcmdzKTsKKwkJcmV0dXJuIGFyZ3M7CisJfQorCisJLyoqIEdpdmVuIGFuIGFyZyBhY3Rpb24gbGlrZQorCSAqCisJICogIFt4LCAoKmEpLmZvbygyMSwzMyksIDMuMisxLCAnXG4nLAorCSAqICAiYSxvb1xuaWNrIiwge2JsLCAiZmRraiJlY2t9LCBbImNhdFxuLCIsIHgsIDQzXV0KKwkgKgorCSAqICBjb252ZXJ0IHRvIGEgbGlzdCBvZiBhcmd1bWVudHMuICBBbGxvdyBuZXN0ZWQgc3F1YXJlIGJyYWNrZXRzIGV0Yy4uLgorCSAqICBTZXQgc2VwYXJhdG9yQ2hhciB0byAnOycgb3IgJywnIG9yIHdoYXRldmVyIHlvdSB3YW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IGdldExpc3RPZkFyZ3VtZW50c0Zyb21BY3Rpb24oU3RyaW5nIGFjdGlvblRleHQsCisJCQkJCQkJCQkJCQkgICBpbnQgc3RhcnQsCisJCQkJCQkJCQkJCQkgICBpbnQgdGFyZ2V0Q2hhciwKKwkJCQkJCQkJCQkJCSAgIGludCBzZXBhcmF0b3JDaGFyLAorCQkJCQkJCQkJCQkJICAgTGlzdDxTdHJpbmc+IGFyZ3MpCisJeworCQlpZiAoIGFjdGlvblRleHQ9PW51bGwgKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYWN0aW9uVGV4dCA9IGFjdGlvblRleHQucmVwbGFjZUFsbCgiLy8uKlxuIiwgIiIpOworCQlpbnQgbiA9IGFjdGlvblRleHQubGVuZ3RoKCk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhY3Rpb25UZXh0QCIrc3RhcnQrIi0+IisoY2hhcil0YXJnZXRDaGFyKyI9IithY3Rpb25UZXh0LnN1YnN0cmluZyhzdGFydCxuKSk7CisJCWludCBwID0gc3RhcnQ7CisJCWludCBsYXN0ID0gcDsKKwkJd2hpbGUgKCBwPG4gJiYgYWN0aW9uVGV4dC5jaGFyQXQocCkhPXRhcmdldENoYXIgKSB7CisJCQlpbnQgYyA9IGFjdGlvblRleHQuY2hhckF0KHApOworCQkJc3dpdGNoICggYyApIHsKKwkJCQljYXNlICdcJycgOgorCQkJCQlwKys7CisJCQkJCXdoaWxlICggcDxuICYmIGFjdGlvblRleHQuY2hhckF0KHApIT0nXCcnICkgeworCQkJCQkJaWYgKCBhY3Rpb25UZXh0LmNoYXJBdChwKT09J1xcJyAmJiAocCsxKTxuICYmCisJCQkJCQkJIGFjdGlvblRleHQuY2hhckF0KHArMSk9PSdcJycgKQorCQkJCQkJeworCQkJCQkJCXArKzsgLy8gc2tpcCBlc2NhcGVkIHF1b3RlCisJCQkJCQl9CisJCQkJCQlwKys7CisJCQkJCX0KKwkJCQkJcCsrOworCQkJCQlicmVhazsKKwkJCQljYXNlICciJyA6CisJCQkJCXArKzsKKwkJCQkJd2hpbGUgKCBwPG4gJiYgYWN0aW9uVGV4dC5jaGFyQXQocCkhPSdcIicgKSB7CisJCQkJCQlpZiAoIGFjdGlvblRleHQuY2hhckF0KHApPT0nXFwnICYmIChwKzEpPG4gJiYKKwkJCQkJCQkgYWN0aW9uVGV4dC5jaGFyQXQocCsxKT09J1wiJyApCisJCQkJCQl7CisJCQkJCQkJcCsrOyAvLyBza2lwIGVzY2FwZWQgcXVvdGUKKwkJCQkJCX0KKwkJCQkJCXArKzsKKwkJCQkJfQorCQkJCQlwKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJygnIDoKKwkJCQkJcCA9IGdldExpc3RPZkFyZ3VtZW50c0Zyb21BY3Rpb24oYWN0aW9uVGV4dCxwKzEsJyknLHNlcGFyYXRvckNoYXIsYXJncyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3snIDoKKwkJCQkJcCA9IGdldExpc3RPZkFyZ3VtZW50c0Zyb21BY3Rpb24oYWN0aW9uVGV4dCxwKzEsJ30nLHNlcGFyYXRvckNoYXIsYXJncyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzwnIDoKKwkJCQkJaWYgKCBhY3Rpb25UZXh0LmluZGV4T2YoJz4nLHArMSk+PXAgKSB7CisJCQkJCQkvLyBkbyB3ZSBzZWUgYSBtYXRjaGluZyAnPicgYWhlYWQ/ICBpZiBzbywgaG9wZSBpdCdzIGEgZ2VuZXJpYworCQkJCQkJLy8gYW5kIG5vdCBsZXNzIGZvbGxvd2VkIGJ5IGV4cHIgd2l0aCBncmVhdGVyIHRoYW4KKwkJCQkJCXAgPSBnZXRMaXN0T2ZBcmd1bWVudHNGcm9tQWN0aW9uKGFjdGlvblRleHQscCsxLCc+JyxzZXBhcmF0b3JDaGFyLGFyZ3MpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJcCsrOyAvLyB0cmVhdCBhcyBub3JtYWwgY2hhcgorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1snIDoKKwkJCQkJcCA9IGdldExpc3RPZkFyZ3VtZW50c0Zyb21BY3Rpb24oYWN0aW9uVGV4dCxwKzEsJ10nLHNlcGFyYXRvckNoYXIsYXJncyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlpZiAoIGM9PXNlcGFyYXRvckNoYXIgJiYgdGFyZ2V0Q2hhcj09LTEgKSB7CisJCQkJCQlTdHJpbmcgYXJnID0gYWN0aW9uVGV4dC5zdWJzdHJpbmcobGFzdCwgcCk7CisJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYXJnPSIrYXJnKTsKKwkJCQkJCWFyZ3MuYWRkKGFyZy50cmltKCkpOworCQkJCQkJbGFzdCA9IHArMTsKKwkJCQkJfQorCQkJCQlwKys7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICggdGFyZ2V0Q2hhcj09LTEgJiYgcDw9biApIHsKKwkJCVN0cmluZyBhcmcgPSBhY3Rpb25UZXh0LnN1YnN0cmluZyhsYXN0LCBwKS50cmltKCk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYXJnPSIrYXJnKTsKKwkJCWlmICggYXJnLmxlbmd0aCgpPjAgKSB7CisJCQkJYXJncy5hZGQoYXJnLnRyaW0oKSk7CisJCQl9CisJCX0KKwkJcCsrOworCQlyZXR1cm4gcDsKKwl9CisKKwkvKiogR2l2ZW4gYSB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBhY3Rpb24gbGlrZSAlZm9vKGE9ey4uLn0pIGluCisJICogIGFuIGFjdGlvbiwgdHJhbnNsYXRlIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0ZSBjb25zdHJ1Y3RvcgorCSAqICBmcm9tIHRoZSB0ZW1wbGF0ZUxpYi4gVGhpcyB0cmFuc2xhdGVzIGEgKnBpZWNlKiBvZiB0aGUgYWN0aW9uLgorCSAqLworCXB1YmxpYyBTVCB0cmFuc2xhdGVUZW1wbGF0ZUNvbnN0cnVjdG9yKFN0cmluZyBydWxlTmFtZSwKKwkJCQkJCQkJCQkJCQkgICBpbnQgb3V0ZXJBbHROdW0sCisJCQkJCQkJCQkJCQkJICAgVG9rZW4gYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJCQkJICAgU3RyaW5nIHRlbXBsYXRlQWN0aW9uVGV4dCkKKwl7CisJCS8vIGZpcnN0LCBwYXJzZSB3aXRoIGFudGxyLmcKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInRyYW5zbGF0ZSB0ZW1wbGF0ZTogIit0ZW1wbGF0ZUFjdGlvblRleHQpOworCQlBTlRMUkxleGVyIGxleGVyID0gbmV3IEFOVExSTGV4ZXIobmV3IEFOVExSU3RyaW5nU3RyZWFtKHRlbXBsYXRlQWN0aW9uVGV4dCkpOworCQlsZXhlci5zZXRGaWxlTmFtZShncmFtbWFyLmdldEZpbGVOYW1lKCkpOworCQlBTlRMUlBhcnNlciBwYXJzZXIgPSBBTlRMUlBhcnNlci5jcmVhdGVQYXJzZXIobmV3IENvbW1vblRva2VuU3RyZWFtKGxleGVyKSk7CisJCXBhcnNlci5zZXRGaWxlTmFtZShncmFtbWFyLmdldEZpbGVOYW1lKCkpOworCQlBTlRMUlBhcnNlci5yZXdyaXRlX3RlbXBsYXRlX3JldHVybiBwYXJzZVJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlwYXJzZVJlc3VsdCA9IHBhcnNlci5yZXdyaXRlX3RlbXBsYXRlKCk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfSU5WQUxJRF9URU1QTEFURV9BQ1RJT04sCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJICB0ZW1wbGF0ZUFjdGlvblRleHQpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gdHNlKSB7CisJCQlFcnJvck1hbmFnZXIuaW50ZXJuYWxFcnJvcigiY2FuJ3QgcGFyc2UgdGVtcGxhdGUgYWN0aW9uIix0c2UpOworCQl9CisJCUdyYW1tYXJBU1QgcmV3cml0ZVRyZWUgPSAoR3JhbW1hckFTVClwYXJzZVJlc3VsdC5nZXRUcmVlKCk7CisKKwkJLy8gdGhlbiB0cmFuc2xhdGUgdmlhIGNvZGVnZW4uZworCQlDb2RlR2VuVHJlZVdhbGtlciBnZW4gPSBuZXcgQ29kZUdlblRyZWVXYWxrZXIobmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHJld3JpdGVUcmVlKSk7CisJCWdlbi5pbml0KGdyYW1tYXIpOworCQlnZW4uc2V0Q3VycmVudFJ1bGVOYW1lKHJ1bGVOYW1lKTsKKwkJZ2VuLnNldE91dGVyQWx0TnVtKG91dGVyQWx0TnVtKTsKKwkJU1Qgc3QgPSBudWxsOworCQl0cnkgeworCQkJc3QgPSBnZW4ucmV3cml0ZV90ZW1wbGF0ZSgpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQkFEX0FTVF9TVFJVQ1RVUkUsCisJCQkJCQkJICAgcmUpOworCQl9CisJCXJldHVybiBzdDsKKwl9CisKKworCXB1YmxpYyB2b2lkIGlzc3VlSW52YWxpZFNjb3BlRXJyb3IoU3RyaW5nIHgsCisJCQkJCQkJCQkgICBTdHJpbmcgeSwKKwkJCQkJCQkJCSAgIFJ1bGUgZW5jbG9zaW5nUnVsZSwKKwkJCQkJCQkJCSAgIFRva2VuIGFjdGlvblRva2VuLAorCQkJCQkJCQkJICAgaW50IG91dGVyQWx0TnVtKQorCXsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImVycm9yICQiK3grIjo6Iit5KTsKKwkJUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKHgpOworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IGdyYW1tYXIuZ2V0R2xvYmFsU2NvcGUoeCk7CisJCWlmICggc2NvcGU9PW51bGwgKSB7CisJCQlpZiAoIHIhPW51bGwgKSB7CisJCQkJc2NvcGUgPSByLnJ1bGVTY29wZTsgLy8gaWYgbm90IGdsb2JhbCwgbWlnaHQgYmUgcnVsZSBzY29wZQorCQkJfQorCQl9CisJCWlmICggc2NvcGU9PW51bGwgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfVU5LTk9XTl9EWU5BTUlDX1NDT1BFLAorCQkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCSAgeCk7CisJCX0KKwkJZWxzZSBpZiAoIHNjb3BlLmdldEF0dHJpYnV0ZSh5KT09bnVsbCApIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19VTktOT1dOX0RZTkFNSUNfU0NPUEVfQVRUUklCVVRFLAorCQkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCSAgeCwKKwkJCQkJCQkJCQkgIHkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgaXNzdWVJbnZhbGlkQXR0cmlidXRlRXJyb3IoU3RyaW5nIHgsCisJCQkJCQkJCQkJICAgU3RyaW5nIHksCisJCQkJCQkJCQkJICAgUnVsZSBlbmNsb3NpbmdSdWxlLAorCQkJCQkJCQkJCSAgIFRva2VuIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCSAgIGludCBvdXRlckFsdE51bSkKKwl7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciAkIit4KyIuIit5KTsKKwkJaWYgKCBlbmNsb3NpbmdSdWxlPT1udWxsICkgeworCQkJLy8gYWN0aW9uIG5vdCBpbiBhIHJ1bGUKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19BVFRSSUJVVEVfUkVGX05PVF9JTl9SVUxFLAorCQkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCSAgeCwKKwkJCQkJCQkJCQkgIHkpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gYWN0aW9uIGlzIGluIGEgcnVsZQorCQlHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIgbGFiZWwgPSBlbmNsb3NpbmdSdWxlLmdldFJ1bGVMYWJlbCh4KTsKKworCQlpZiAoIGxhYmVsIT1udWxsIHx8IGVuY2xvc2luZ1J1bGUuZ2V0UnVsZVJlZnNJbkFsdCh4LCBvdXRlckFsdE51bSkhPW51bGwgKSB7CisJCQkvLyAkcnVsZWxhYmVsLmF0dHIgb3IgJHJ1bGVyZWYuYXR0cjsgbXVzdCBiZSB1bmtub3duIGF0dHIKKwkJCVN0cmluZyByZWZkUnVsZU5hbWUgPSB4OworCQkJaWYgKCBsYWJlbCE9bnVsbCApIHsKKwkJCQlyZWZkUnVsZU5hbWUgPSBlbmNsb3NpbmdSdWxlLmdldFJ1bGVMYWJlbCh4KS5yZWZlcmVuY2VkUnVsZU5hbWU7CisJCQl9CisJCQlSdWxlIHJlZmRSdWxlID0gZ3JhbW1hci5nZXRSdWxlKHJlZmRSdWxlTmFtZSk7CisJCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IHJlZmRSdWxlLmdldEF0dHJpYnV0ZVNjb3BlKHkpOworCQkJaWYgKCBzY29wZT09bnVsbCApIHsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfVU5LTk9XTl9SVUxFX0FUVFJJQlVURSwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCQkgIHJlZmRSdWxlTmFtZSwKKwkJCQkJCQkJCQkgIHkpOworCQkJfQorCQkJZWxzZSBpZiAoIHNjb3BlLmlzUGFyYW1ldGVyU2NvcGUgKSB7CisJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0lOVkFMSURfUlVMRV9QQVJBTUVURVJfUkVGLAorCQkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJCSAgcmVmZFJ1bGVOYW1lLAorCQkJCQkJCQkJCSAgeSk7CisJCQl9CisJCQllbHNlIGlmICggc2NvcGUuaXNEeW5hbWljUnVsZVNjb3BlICkgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19JTlZBTElEX1JVTEVfU0NPUEVfQVRUUklCVVRFX1JFRiwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCQkgIHJlZmRSdWxlTmFtZSwKKwkJCQkJCQkJCQkgIHkpOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgdm9pZCBpc3N1ZUludmFsaWRBdHRyaWJ1dGVFcnJvcihTdHJpbmcgeCwKKwkJCQkJCQkJCQkgICBSdWxlIGVuY2xvc2luZ1J1bGUsCisJCQkJCQkJCQkJICAgVG9rZW4gYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJICAgaW50IG91dGVyQWx0TnVtKQorCXsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImVycm9yICQiK3gpOworCQlpZiAoIGVuY2xvc2luZ1J1bGU9PW51bGwgKSB7CisJCQkvLyBhY3Rpb24gbm90IGluIGEgcnVsZQorCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0FUVFJJQlVURV9SRUZfTk9UX0lOX1JVTEUsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJICB4KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGFjdGlvbiBpcyBpbiBhIHJ1bGUKKwkJR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIGxhYmVsID0gZW5jbG9zaW5nUnVsZS5nZXRSdWxlTGFiZWwoeCk7CisJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gZW5jbG9zaW5nUnVsZS5nZXRBdHRyaWJ1dGVTY29wZSh4KTsKKworCQlpZiAoIGxhYmVsIT1udWxsIHx8CisJCQkgZW5jbG9zaW5nUnVsZS5nZXRSdWxlUmVmc0luQWx0KHgsIG91dGVyQWx0TnVtKSE9bnVsbCB8fAorCQkJIGVuY2xvc2luZ1J1bGUubmFtZS5lcXVhbHMoeCkgKQorCQl7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfSVNPTEFURURfUlVMRV9TQ09QRSwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICBhY3Rpb25Ub2tlbiwKKwkJCQkJCQkJCQkgIHgpOworCQl9CisJCWVsc2UgaWYgKCBzY29wZSE9bnVsbCAmJiBzY29wZS5pc0R5bmFtaWNSdWxlU2NvcGUgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfSVNPTEFURURfUlVMRV9BVFRSSUJVVEUsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgYWN0aW9uVG9rZW4sCisJCQkJCQkJCQkJICB4KTsKKwkJfQorCQllbHNlIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19VTktOT1dOX1NJTVBMRV9BVFRSSUJVVEUsCisJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkgIGFjdGlvblRva2VuLAorCQkJCQkJCQkJICB4KTsKKwkJfQorCX0KKworCS8vIE0gSSBTIEMKKworCXB1YmxpYyBTVEdyb3VwIGdldFRlbXBsYXRlcygpIHsKKwkJcmV0dXJuIHRlbXBsYXRlczsKKwl9CisKKwlwdWJsaWMgU1RHcm91cCBnZXRCYXNlVGVtcGxhdGVzKCkgeworCQlyZXR1cm4gYmFzZVRlbXBsYXRlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGRlYnVnKSB7CisJCXRoaXMuZGVidWcgPSBkZWJ1ZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUcmFjZShib29sZWFuIHRyYWNlKSB7CisJCXRoaXMudHJhY2UgPSB0cmFjZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9maWxlKGJvb2xlYW4gcHJvZmlsZSkgeworCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOworCQlpZiAoIHByb2ZpbGUgKSB7CisJCQlzZXREZWJ1Zyh0cnVlKTsgLy8gcmVxdWlyZXMgZGVidWcgZXZlbnRzCisJCX0KKwl9CisKKwlwdWJsaWMgU1QgZ2V0UmVjb2duaXplclNUKCkgeworCQlyZXR1cm4gb3V0cHV0RmlsZVNUOworCX0KKworCS8qKiBHZW5lcmF0ZSBUUGFyc2VyLmphdmEgYW5kIFRMZXhlci5qYXZhIGZyb20gVC5nIGlmIGNvbWJpbmVkLCBlbHNlCisJICogIGp1c3QgdXNlIFQuamF2YSBhcyBvdXRwdXQgcmVnYXJkbGVzcyBvZiB0eXBlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVjb2duaXplckZpbGVOYW1lKFN0cmluZyBuYW1lLCBpbnQgdHlwZSkgeworCQlTVCBleHRTVCA9IHRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJjb2RlRmlsZUV4dGVuc2lvbiIpOworCQlTdHJpbmcgcmVjb2duaXplck5hbWUgPSBncmFtbWFyLmdldFJlY29nbml6ZXJOYW1lKCk7CisJCXJldHVybiByZWNvZ25pemVyTmFtZStleHRTVC5yZW5kZXIoKTsKKwkJLyoKKwkJU3RyaW5nIHN1ZmZpeCA9ICIiOworCQlpZiAoIHR5cGU9PUdyYW1tYXIuQ09NQklORUQgfHwKKwkJCSAodHlwZT09R3JhbW1hci5MRVhFUiAmJiAhZ3JhbW1hci5pbXBsaWNpdExleGVyKSApCisJCXsKKwkJCXN1ZmZpeCA9IEdyYW1tYXIuZ3JhbW1hclR5cGVUb0ZpbGVOYW1lU3VmZml4W3R5cGVdOworCQl9CisJCXJldHVybiBuYW1lK3N1ZmZpeCtleHRTVC50b1N0cmluZygpOworCQkqLworCX0KKworCS8qKiBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSB2b2NhYiBmaWxlIGdlbmVyYXRlZCBmb3IgdGhpcyBncmFtbWFyPworCSAqICBSZXR1cm5zIG51bGwgaWYgbm8gLnRva2VucyBmaWxlIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRWb2NhYkZpbGVOYW1lKCkgeworCQlpZiAoIGdyYW1tYXIuaXNCdWlsdEZyb21TdHJpbmcoKSApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBncmFtbWFyLm5hbWUrVk9DQUJfRklMRV9FWFRFTlNJT047CisJfQorCisJcHVibGljIHZvaWQgd3JpdGUoU1QgY29kZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvL2xvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJV3JpdGVyIHcgPSB0b29sLmdldE91dHB1dEZpbGUoZ3JhbW1hciwgZmlsZU5hbWUpOworCQkvLyBXcml0ZSB0aGUgb3V0cHV0IHRvIGEgU3RyaW5nV3JpdGVyCisJCVNUV3JpdGVyIHdyID0gbmV3IEF1dG9JbmRlbnRXcml0ZXIodyk7CisJCXdyLnNldExpbmVXaWR0aChsaW5lV2lkdGgpOworCQljb2RlLndyaXRlKHdyKTsKKwkJdy5jbG9zZSgpOworCQkvL2xvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicmVuZGVyIHRpbWUgZm9yICIrZmlsZU5hbWUrIjogIisoaW50KShzdG9wLXN0YXJ0KSsibXMiKTsKKwl9CisKKwkvKiogWW91IGNhbiBnZW5lcmF0ZSBhIHN3aXRjaCByYXRoZXIgdGhhbiBpZi10aGVuLWVsc2UgZm9yIGEgREZBIHN0YXRlCisJICogIGlmIHRoZXJlIGFyZSBubyBzZW1hbnRpYyBwcmVkaWNhdGVzIGFuZCB0aGUgbnVtYmVyIG9mIGVkZ2UgbGFiZWwKKwkgKiAgdmFsdWVzIGlzIHNtYWxsIGVub3VnaDsgZS5nLiwgZG9uJ3QgZ2VuZXJhdGUgYSBzd2l0Y2ggZm9yIGEgc3RhdGUKKwkgKiAgY29udGFpbmluZyBhbiBlZGdlIGxhYmVsIHN1Y2ggYXMgMjAuLjUyMzMwICh0aGUgcmVzdWx0aW5nIGJ5dGUgY29kZXMKKwkgKiAgd291bGQgb3ZlcmZsb3cgdGhlIG1ldGhvZCA2NWsgbGltaXQgcHJvYmFibHkpLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNhbkdlbmVyYXRlU3dpdGNoKERGQVN0YXRlIHMpIHsKKwkJaWYgKCAhR0VORVJBVEVfU1dJVENIRVNfV0hFTl9QT1NTSUJMRSApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpbnQgc2l6ZSA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGkrKykgeworCQkJVHJhbnNpdGlvbiBlZGdlID0gKFRyYW5zaXRpb24pIHMudHJhbnNpdGlvbihpKTsKKwkJCWlmICggZWRnZS5sYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJLy8gY2FuJ3QgZG8gYSBzd2l0Y2ggaWYgdGhlIGVkZ2VzIGFyZSBnb2luZyB0byByZXF1aXJlIHByZWRpY2F0ZXMKKwkJCWlmICggZWRnZS5sYWJlbC5nZXRBdG9tKCk9PUxhYmVsLkVPVCApIHsKKwkJCQlpbnQgRU9UUHJlZGljdHMgPSAoKERGQVN0YXRlKWVkZ2UudGFyZ2V0KS5nZXRVbmlxdWVseVByZWRpY3RlZEFsdCgpOworCQkJCWlmICggRU9UUHJlZGljdHM9PU5GQS5JTlZBTElEX0FMVF9OVU1CRVIgKSB7CisJCQkJCS8vIEVPVCB0YXJnZXQgaGFzIHRvIGJlIGEgcHJlZGljYXRlIHRoZW47IG5vIHVuaXF1ZSBhbHQKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCS8vIGlmIHRhcmdldCBpcyBhIHN0YXRlIHdpdGggZ2F0ZWQgcHJlZHMsIHdlIG5lZWQgdG8gdXNlIHByZWRzIG9uCisJCQkvLyB0aGlzIGVkZ2UgdGhlbiB0byByZWFjaCBpdC4KKwkJCWlmICggKChERkFTdGF0ZSllZGdlLnRhcmdldCkuZ2V0R2F0ZWRQcmVkaWNhdGVzSW5ORkFDb25maWd1cmF0aW9ucygpIT1udWxsICkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXNpemUgKz0gZWRnZS5sYWJlbC5nZXRTZXQoKS5zaXplKCk7CisJCX0KKwkJaWYgKCBzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTxNSU5fU1dJVENIX0FMVFMgfHwKKwkJCSBzaXplPk1BWF9TV0lUQ0hfQ0FTRV9MQUJFTFMgKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqIENyZWF0ZSBhIGxhYmVsIHRvIHRyYWNrIGEgdG9rZW4gLyBydWxlIHJlZmVyZW5jZSdzIHJlc3VsdC4KKwkgKiAgVGVjaG5pY2FsbHksIHRoaXMgaXMgYSBwbGFjZSB3aGVyZSBJIGJyZWFrIG1vZGVsLXZpZXcgc2VwYXJhdGlvbgorCSAqICBhcyBJIGFtIGNyZWF0aW5nIGEgdmFyaWFibGUgbmFtZSB0aGF0IGNvdWxkIGJlIGludmFsaWQgaW4gYQorCSAqICB0YXJnZXQgbGFuZ3VhZ2UsIGhvd2V2ZXIsIGxhYmVsIDo6PSA8SUQ+PElOVD4gaXMgcHJvYmFibHkgb2sgaW4KKwkgKiAgYWxsIGxhbmd1YWdlcyB3ZSBjYXJlIGFib3V0LgorCSAqLworCXB1YmxpYyBTdHJpbmcgY3JlYXRlVW5pcXVlTGFiZWwoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoKQorCQkJLmFwcGVuZChuYW1lKS5hcHBlbmQodW5pcXVlTGFiZWxOdW1iZXIrKykudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0RlbHBoaVRhcmdldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9EZWxwaGlUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGJiODE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9EZWxwaGlUYXJnZXQuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworCitwdWJsaWMgY2xhc3MgRGVscGhpVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IAoreworICBwdWJsaWMgRGVscGhpVGFyZ2V0KCkgeyAKKyAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1xuJ10gPSAiJyMxMCciOyAgICAKKyAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1xyJ10gPSAiJyMxMyciOyAgICAKKyAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1x0J10gPSAiJyM5JyI7ICAgCisgICAgdGFyZ2V0Q2hhclZhbHVlRXNjYXBlWydcYiddID0gIlxcYiI7ICAgIAorICAgIHRhcmdldENoYXJWYWx1ZUVzY2FwZVsnXGYnXSA9ICJcXGYiOyAgICAKKyAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1xcJ10gPSAiXFwiOyAgIAorICAgIHRhcmdldENoYXJWYWx1ZUVzY2FwZVsnXCcnXSA9ICInJyI7ICAgCisgICAgdGFyZ2V0Q2hhclZhbHVlRXNjYXBlWyciJ10gPSAiJyI7CisgIH0gCisKKyAgcHJvdGVjdGVkIFNUIGNob29zZVdoZXJlQ3ljbGljREZBc0dvKFRvb2wgdG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbW1hciBncmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QgcmVjb2duaXplclNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1QgY3ljbGljREZBU1QpCisgIHsKKyAgICByZXR1cm4gcmVjb2duaXplclNUOworICB9CisKKyAgcHVibGljIFN0cmluZyBlbmNvZGVJbnRBc0NoYXJFc2NhcGUoaW50IHYpCisgIHsKKyAgICBpZiAodiA8PSAxMjcpCisgICAgeworICAgICAgU3RyaW5nIGhleDEgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHYgfCAweDEwMDAwKS5zdWJzdHJpbmcoMywgNSk7CisgICAgICByZXR1cm4gIicjJCIgKyBoZXgxICsgIiciOworICAgIH0KKyAgICBTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyh2IHwgMHgxMDAwMCkuc3Vic3RyaW5nKDEsIDUpOworICAgIHJldHVybiAiJyMkIiArIGhleCArICInIjsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRDaGFyTGl0ZXJhbEZyb21BTlRMUkNoYXJMaXRlcmFsKAorICAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorICAgIFN0cmluZyBsaXRlcmFsKQorICB7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBpbnQgYyA9IEdyYW1tYXIuZ2V0Q2hhclZhbHVlRnJvbUdyYW1tYXJDaGFyTGl0ZXJhbChsaXRlcmFsKTsKKyAgICBpZiAoIGM8TGFiZWwuTUlOX0NIQVJfVkFMVUUgKSB7CisgICAgICByZXR1cm4gIjAiOworICAgIH0KKyAgICAvLyBub3JtYWwgY2hhcgorICAgIGJ1Zi5hcHBlbmQoYyk7CisKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgIH0gCisKKyAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhTdHJpbmcgcywgYm9vbGVhbiBxdW90ZWQpIHsKKyAgICBpZiAoIHM9PW51bGwgKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBpZiAoIHF1b3RlZCApIHsKKyAgICAgIGJ1Zi5hcHBlbmQoJ1wnJyk7CisgICAgfQorICAgIGZvciAoaW50IGk9MDsgaTxzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGludCBjID0gcy5jaGFyQXQoaSk7CisgICAgICBpZiAoIGMhPSciJyAmJiAvLyBkb24ndCBlc2NhcGUgZG91YmxlIHF1b3RlcyBpbiBzdHJpbmdzIGZvciBEZWxwaGkKKyAgICAgICAgIGM8dGFyZ2V0Q2hhclZhbHVlRXNjYXBlLmxlbmd0aCAmJgorICAgICAgICAgdGFyZ2V0Q2hhclZhbHVlRXNjYXBlW2NdIT1udWxsICkKKyAgICAgIHsKKyAgICAgICAgYnVmLmFwcGVuZCh0YXJnZXRDaGFyVmFsdWVFc2NhcGVbY10pOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpYyk7CisgICAgICB9CisgICAgICBpZiAoKGkgJiAxMjcpID09IDEyNykKKyAgICAgIHsKKyAgICAgICAgLy8gQ29uY2F0ZW5hdGUgc3RyaW5nIGxpdGVyYWxzIGJlY2F1c2UgRGVscGhpIGRvZXNuJ3Qgc3VwcG9ydCBsaXRlcmFscyBvdmVyIDI1NSBjaGFyYWN0ZXJzLAorICAgICAgICAvLyBhbmQgdGhlIGNvZGUgZWRpdG9yIGRvZXNuJ3Qgc3VwcG9ydCBsaW5lcyBvdmVyIDEwMjMgY2hhcmFjdGVycworICAgICAgICBidWYuYXBwZW5kKCJcJyArIFxyXG4gIFwnIik7CisgICAgICB9CisgICAgfQorICAgIGlmICggcXVvdGVkICkgeworICAgICAgYnVmLmFwcGVuZCgnXCcnKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbUFOVExSU3RyaW5nTGl0ZXJhbCgKKyAgICBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICBTdHJpbmcgbGl0ZXJhbCkKKyAgeworICAgIGxpdGVyYWwgPSBVdGlscy5yZXBsYWNlKGxpdGVyYWwsIlxcXCciLCInJyIpOyAvLyBcJyB0byAnIHRvIG5vcm1hbGl6ZQorICAgIGxpdGVyYWwgPSBVdGlscy5yZXBsYWNlKGxpdGVyYWwsIlxcclxcbiIsIicjMTMjMTAnIik7IAorICAgIGxpdGVyYWwgPSBVdGlscy5yZXBsYWNlKGxpdGVyYWwsIlxcciIsIicjMTMnIik7IAorICAgIGxpdGVyYWwgPSBVdGlscy5yZXBsYWNlKGxpdGVyYWwsIlxcbiIsIicjMTAnIik7IAorICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxpdGVyYWwpOworICAgIGJ1Zi5zZXRDaGFyQXQoMCwnXCcnKTsKKyAgICBidWYuc2V0Q2hhckF0KGxpdGVyYWwubGVuZ3RoKCktMSwnXCcnKTsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgIH0KKyAgIAorICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldDY0Qml0U3RyaW5nRnJvbVZhbHVlKGxvbmcgd29yZCkgeworICAgIGludCBudW1IZXhEaWdpdHMgPSA4KjI7CisgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobnVtSGV4RGlnaXRzKzIpOworICAgIGJ1Zi5hcHBlbmQoIiQiKTsKKyAgICBTdHJpbmcgZGlnaXRzID0gTG9uZy50b0hleFN0cmluZyh3b3JkKTsKKyAgICBkaWdpdHMgPSBkaWdpdHMudG9VcHBlckNhc2UoKTsKKyAgICBpbnQgcGFkZGluZyA9IG51bUhleERpZ2l0cyAtIGRpZ2l0cy5sZW5ndGgoKTsKKyAgICAvLyBwYWQgbGVmdCB3aXRoIHplcm9zCisgICAgZm9yIChpbnQgaT0xOyBpPD1wYWRkaW5nOyBpKyspIHsKKyAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKKyAgICB9CisgICAgYnVmLmFwcGVuZChkaWdpdHMpOworICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9KYXZhU2NyaXB0VGFyZ2V0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0phdmFTY3JpcHRUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMWU0ZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9KYXZhU2NyaXB0VGFyZ2V0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmNvZGVnZW47CisKK3B1YmxpYyBjbGFzcyBKYXZhU2NyaXB0VGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKKyAgICAvKiogQ29udmVydCBhbiBpbnQgdG8gYSBKYXZhU2NyaXB0IFVuaWNvZGUgY2hhcmFjdGVyIGxpdGVyYWwuCisgICAgICoKKyAgICAgKiAgVGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBzcGVjIChFQ01BLTI2MikgZG9lc24ndCBwcm92aWRlIGZvciBvY3RhbAorICAgICAqICBub3RhdGlvbiBpbiBTdHJpbmcgbGl0ZXJhbHMsIGFsdGhvdWdoIHNvbWUgaW1wbGVtZW50YXRpb25zIHN1cHBvcnQgaXQuCisgICAgICogIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgcGFyZW50IGNsYXNzIHNvIHRoYXQgY2hhcmFjdGVycyB3aWxsIGFsd2F5cworICAgICAqICBiZSBlbmNvZGVkIGFzIFVuaWNvZGUgbGl0ZXJhbHMgKGUuZy4gXHUwMDExKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZUludEFzQ2hhckVzY2FwZShpbnQgdikgeworICAgICAgICBTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyh2fDB4MTAwMDApLnN1YnN0cmluZygxLDUpOworICAgICAgICByZXR1cm4gIlxcdSIraGV4OworICAgIH0KKworICAgIC8qKiBDb252ZXJ0IGxvbmcgdG8gdHdvIDMyLWJpdCBudW1iZXJzIHNlcGFydGVkIGJ5IGEgY29tbWEuCisgICAgICogIEphdmFTY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCA2NC1iaXQgbnVtYmVycywgc28gd2UgbmVlZCB0byBicmVhaworICAgICAqICB0aGUgbnVtYmVyIGludG8gdHdvIDMyLWJpdCBsaXRlcmFscyB0byBnaXZlIHRvIHRoZSBCaXQuICBBIG51bWJlciBsaWtlCisgICAgICogIDB4SEhISEhISEhMTExMTExMTCBpcyBicm9rZW4gaW50byB0aGUgZm9sbG93aW5nIHN0cmluZzoKKyAgICAgKiAgIjB4TExMTExMTEwsIDB4SEhISEhISEgiCisgICAgICogIE5vdGUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgYXJlIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgaGlnaCBvcmRlciBiaXRzLgorICAgICAqICBUaGlzIGlzIHRvIG1hdGNoIGhvdyB0aGUgQml0U2V0IGNvbnN0cnVjdG9yIHdvcmtzLCB3aGVyZSB0aGUgYml0cyBhcmUKKyAgICAgKiAgcGFzc2VkIGluIGluIDMyLWJpdCBjaHVua3Mgd2l0aCBsb3ctb3JkZXIgYml0cyBjb21pbmcgZmlyc3QuCisgICAgICoKKyAgICAgKiAgTm90ZTogc3RvbGUgdGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBmcm9tIHRoZSBBY3Rpb25TY3JpcHQgdGFyZ2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0NjRCaXRTdHJpbmdGcm9tVmFsdWUobG9uZyB3b3JkKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDIyKTsgLy8gZW5vdWdoIGZvciB0aGUgdHdvICIweCIsICIsIiBhbmQgIiAiCisgICAgICAgIGJ1Zi5hcHBlbmQoIjB4Iik7CisgICAgICAgIHdyaXRlSGV4V2l0aFBhZGRpbmcoYnVmLCBJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpKHdvcmQgJiAweDAwMDAwMDAwZmZmZmZmZmZMKSkpOworICAgICAgICBidWYuYXBwZW5kKCIsIDB4Iik7CisgICAgICAgIHdyaXRlSGV4V2l0aFBhZGRpbmcoYnVmLCBJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpKHdvcmQgPj4gMzIpKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZUhleFdpdGhQYWRkaW5nKFN0cmluZ0J1ZmZlciBidWYsIFN0cmluZyBkaWdpdHMpIHsKKyAgICAgICAgZGlnaXRzID0gZGlnaXRzLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIGludCBwYWRkaW5nID0gOCAtIGRpZ2l0cy5sZW5ndGgoKTsKKyAgICAgICAgLy8gcGFkIGxlZnQgd2l0aCB6ZXJvcworICAgICAgICBmb3IgKGludCBpPTE7IGk8PXBhZGRpbmc7IGkrKykgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgnMCcpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoZGlnaXRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0phdmFUYXJnZXQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL2NvZGVnZW4vSmF2YVRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzdhODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL0phdmFUYXJnZXQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmNvZGVnZW47CisKK2ltcG9ydCBvcmcuYW50bHIuVG9vbDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworaW1wb3J0IG9yZy5hbnRsci50b29sLlJ1bGU7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIEphdmFUYXJnZXQgZXh0ZW5kcyBUYXJnZXQgeworCXByb3RlY3RlZCBTVCBjaG9vc2VXaGVyZUN5Y2xpY0RGQXNHbyhUb29sIHRvb2wsCisJCQkJCQkJCQkJIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorCQkJCQkJCQkJCSBHcmFtbWFyIGdyYW1tYXIsCisJCQkJCQkJCQkJIFNUIHJlY29nbml6ZXJTVCwKKwkJCQkJCQkJCQkgU1QgY3ljbGljREZBU1QpCisJeworCQlyZXR1cm4gcmVjb2duaXplclNUOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1HcmFtbWFyQW5hbHlzaXMoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsIEdyYW1tYXIgZ3JhbW1hcikgeworCQlzdXBlci5wZXJmb3JtR3JhbW1hckFuYWx5c2lzKGdlbmVyYXRvciwgZ3JhbW1hcik7CisJCWZvciAoUnVsZSBydWxlIDogZ3JhbW1hci5nZXRSdWxlcygpKSB7CisJCQlydWxlLnRocm93c1NwZWMuYWRkKCJSZWNvZ25pdGlvbkV4Y2VwdGlvbiIpOworCQl9CisJCVNldDxSdWxlPiBkZWxlZ2F0ZWRSdWxlcyA9IGdyYW1tYXIuZ2V0RGVsZWdhdGVkUnVsZXMoKTsKKwkJaWYgKCBkZWxlZ2F0ZWRSdWxlcyE9bnVsbCApIHsKKwkJCWZvciAoUnVsZSBydWxlIDogZGVsZWdhdGVkUnVsZXMpIHsKKwkJCQlydWxlLnRocm93c1NwZWMuYWRkKCJSZWNvZ25pdGlvbkV4Y2VwdGlvbiIpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9PYmpDVGFyZ2V0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL09iakNUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU1NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9PYmpDVGFyZ2V0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFyciBhbmQgQWxhbiBDb25kaXQKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYgS2F5IFJvZXBrZSAoT2JqZWN0aXZlLUMgcnVudGltZSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLmNvZGVnZW47CisKK2ltcG9ydCBvcmcuYW50bHIuVG9vbDsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5VdGlsczsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBPYmpDVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHsKKwlwcm90ZWN0ZWQgdm9pZCBnZW5SZWNvZ25pemVySGVhZGVyRmlsZShUb29sIHRvb2wsCisJCQkJCQkJCQkJICAgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkJICAgR3JhbW1hciBncmFtbWFyLAorCQkJCQkJCQkJCSAgIFNUIGhlYWRlckZpbGVTVCwKKwkJCQkJCQkJCQkgICBTdHJpbmcgZXh0TmFtZSkKKwl0aHJvd3MgSU9FeGNlcHRpb24KKwl7CisJCWdlbmVyYXRvci53cml0ZShoZWFkZXJGaWxlU1QsIGdyYW1tYXIubmFtZSArIEdyYW1tYXIuZ3JhbW1hclR5cGVUb0ZpbGVOYW1lU3VmZml4W2dyYW1tYXIudHlwZV0gKyBleHROYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldENoYXJMaXRlcmFsRnJvbUFOVExSQ2hhckxpdGVyYWwoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCQkJCQkJCQkJCQkJCSAgIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJaWYgIChsaXRlcmFsLnN0YXJ0c1dpdGgoIidcXHUiKSApIHsKKwkJCWxpdGVyYWwgPSAiMHgiICtsaXRlcmFsLnN1YnN0cmluZygzLCA3KTsKKwkJfSBlbHNlCXsKKwkJCWludCBjID0gbGl0ZXJhbC5jaGFyQXQoMSk7IC8vIFRKUAorCQkJaWYgIChjIDwgMzIgfHwgYyA+IDEyNykgeworCQkJCWxpdGVyYWwgID0gICIweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqIENvbnZlcnQgZnJvbSBhbiBBTlRMUiBzdHJpbmcgbGl0ZXJhbCBmb3VuZCBpbiBhIGdyYW1tYXIgZmlsZSB0bworCSogIGFuIGVxdWl2YWxlbnQgc3RyaW5nIGxpdGVyYWwgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEZvciBKYXZhLCB0aGlzCisJKiAgaXMgdGhlIHRyYW5zbGF0aW9uICdhXG4iJyAtPiAiYVxuXCIiLiAgRXhwZWN0IHNpbmdsZSBxdW90ZXMKKwkqICBhcm91bmQgdGhlIGluY29taW5nIGxpdGVyYWwuICBKdXN0IGZsaXAgdGhlIHF1b3RlcyBhbmQgcmVwbGFjZQorCSogIGRvdWJsZSBxdW90ZXMgd2l0aCBcIgorCSovCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbUFOVExSU3RyaW5nTGl0ZXJhbChDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKwkJCQkJCQkJCQkJCQkJCSAgIFN0cmluZyBsaXRlcmFsKQorCXsKKwkJbGl0ZXJhbCA9IFV0aWxzLnJlcGxhY2UobGl0ZXJhbCwiXCIiLCJcXFwiIik7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxpdGVyYWwpOworCQlidWYuc2V0Q2hhckF0KDAsJyInKTsKKwkJYnVmLnNldENoYXJBdChsaXRlcmFsLmxlbmd0aCgpLTEsJyInKTsKKwkJYnVmLmluc2VydCgwLCdAJyk7CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogSWYgd2UgaGF2ZSBhIGxhYmVsLCBwcmVmaXggaXQgd2l0aCB0aGUgcmVjb2duaXplcidzIG5hbWUgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsIGludCB0dHlwZSkgeworCQlTdHJpbmcgbmFtZSA9IGdlbmVyYXRvci5ncmFtbWFyLmdldFRva2VuRGlzcGxheU5hbWUodHR5cGUpOworCQkvLyBJZiBuYW1lIGlzIGEgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0b2tlbiB0eXBlIGluc3RlYWQKKwkJaWYgKCBuYW1lLmNoYXJBdCgwKT09J1wnJyApIHsKKwkJCXJldHVybiBTdHJpbmcudmFsdWVPZih0dHlwZSk7CisJCX0KKwkJcmV0dXJuIG5hbWU7CisJCS8vcmV0dXJuIGdlbmVyYXRvci5ncmFtbWFyLm5hbWUgKyBHcmFtbWFyLmdyYW1tYXJUeXBlVG9GaWxlTmFtZVN1ZmZpeFtnZW5lcmF0b3IuZ3JhbW1hci50eXBlXSArICJfIiArIG5hbWU7CisJCS8vcmV0dXJuIHN1cGVyLmdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwoZ2VuZXJhdG9yLCB0dHlwZSk7CisJCS8vcmV0dXJuIHRoaXMuZ2V0VG9rZW5UZXh0QW5kVHlwZUFzVGFyZ2V0TGFiZWwoZ2VuZXJhdG9yLCBudWxsLCB0dHlwZSk7CisJfQorCisJLyoqIFRhcmdldCBtdXN0IGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGxhYmVscyB1c2VkIGZvciB0b2tlbiB0eXBlcy4gU29tZXRpbWVzIGFsc28gZGVwZW5kcyBvbiB0aGUgdG9rZW4gdGV4dC4qLworCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5UZXh0QW5kVHlwZUFzVGFyZ2V0TGFiZWwoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsIFN0cmluZyB0ZXh0LCBpbnQgdG9rZW5UeXBlKSB7CisJCVN0cmluZyBuYW1lID0gZ2VuZXJhdG9yLmdyYW1tYXIuZ2V0VG9rZW5EaXNwbGF5TmFtZSh0b2tlblR5cGUpOworCQkvLyBJZiBuYW1lIGlzIGEgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0b2tlbiB0eXBlIGluc3RlYWQKKwkJaWYgKCBuYW1lLmNoYXJBdCgwKT09J1wnJyApIHsKKwkJCXJldHVybiBTdHJpbmcudmFsdWVPZih0b2tlblR5cGUpOworCQl9CisJCVN0cmluZyB0ZXh0RXF1aXZhbGVudCA9IHRleHQgPT0gbnVsbCA/IG5hbWUgOiB0ZXh0OworCQlpZiAodGV4dEVxdWl2YWxlbnQuY2hhckF0KDApID49ICcwJyAmJiB0ZXh0RXF1aXZhbGVudC5jaGFyQXQoMCkgPD0gJzknKSB7CisJCQlyZXR1cm4gdGV4dEVxdWl2YWxlbnQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZ2VuZXJhdG9yLmdyYW1tYXIubmFtZSArIEdyYW1tYXIuZ3JhbW1hclR5cGVUb0ZpbGVOYW1lU3VmZml4W2dlbmVyYXRvci5ncmFtbWFyLnR5cGVdICsgIl8iICsgdGV4dEVxdWl2YWxlbnQ7CisJCX0KKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9QZXJsNVRhcmdldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9QZXJsNVRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTZlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL1Blcmw1VGFyZ2V0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci50b29sLkF0dHJpYnV0ZVNjb3BlOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuUnVsZUxhYmVsU2NvcGU7CisKK3B1YmxpYyBjbGFzcyBQZXJsNVRhcmdldCBleHRlbmRzIFRhcmdldCB7CisgICAgcHVibGljIFBlcmw1VGFyZ2V0KCkgeworICAgICAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJyQnXSA9ICJcXCQiOworICAgICAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ0AnXSA9ICJcXEAiOworICAgICAgICB0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJyUnXSA9ICJcXCUiOworICAgICAgICBBdHRyaWJ1dGVTY29wZS50b2tlblNjb3BlLmFkZEF0dHJpYnV0ZSgic2VsZiIsIG51bGwpOworICAgICAgICBSdWxlTGFiZWxTY29wZS5wcmVkZWZpbmVkTGV4ZXJSdWxlUHJvcGVydGllc1Njb3BlLmFkZEF0dHJpYnV0ZSgic2VsZiIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbChmaW5hbCBDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpdGVyYWwpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOworCisgICAgICAgIGZpbmFsIGludCBjID0gR3JhbW1hci5nZXRDaGFyVmFsdWVGcm9tR3JhbW1hckNoYXJMaXRlcmFsKGxpdGVyYWwpOworICAgICAgICBpZiAoYyA8IExhYmVsLk1JTl9DSEFSX1ZBTFVFKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcXHh7MDAwMH0iKTsKKyAgICAgICAgfSBlbHNlIGlmIChjIDwgdGFyZ2V0Q2hhclZhbHVlRXNjYXBlLmxlbmd0aCAmJgorICAgICAgICAgICAgICAgIHRhcmdldENoYXJWYWx1ZUVzY2FwZVtjXSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHRhcmdldENoYXJWYWx1ZUVzY2FwZVtjXSk7CisgICAgICAgIH0gZWxzZSBpZiAoQ2hhcmFjdGVyLlVuaWNvZGVCbG9jay5vZigoY2hhcikgYykgPT0KKyAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLkJBU0lDX0xBVElOICYmCisgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0lTT0NvbnRyb2woKGNoYXIpIGMpKSB7CisgICAgICAgICAgICAvLyBub3JtYWwgY2hhcgorICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBtdXN0IGJlIHNvbWV0aGluZyB1bnByaW50YWJsZS4uLnVzZSBcXHVYWFhYCisgICAgICAgICAgICAvLyB0dXJuIG9uIHRoZSBiaXQgYWJvdmUgbWF4ICJcXHVGRkZGIiB2YWx1ZSBzbyB0aGF0IHdlIHBhZCB3aXRoIHplcm9zCisgICAgICAgICAgICAvLyB0aGVuIG9ubHkgdGFrZSBsYXN0IDQgZGlnaXRzCisgICAgICAgICAgICBTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhjIHwgMHgxMDAwMCkudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMSwgNSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcXHh7Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGhleCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmLmluZGV4T2YoIlxcIikgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgZm9yIGludGVycG9sYXRpb24sIHVzZSBzaW5nbGUgcXVvdGVzCisgICAgICAgICAgICBidWYuaW5zZXJ0KDAsICdcJycpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5lZWQgc3RyaW5nIGludGVycG9sYXRpb24KKyAgICAgICAgICAgIGJ1Zi5pbnNlcnQoMCwgJ1wiJyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCdcIicpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlSW50QXNDaGFyRXNjYXBlKGZpbmFsIGludCB2KSB7CisgICAgICAgIGZpbmFsIGludCBpbnRWYWx1ZTsKKyAgICAgICAgaWYgKCh2ICYgMHg4MDAwKSA9PSAwKSB7CisgICAgICAgICAgICBpbnRWYWx1ZSA9IHY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRWYWx1ZSA9IC0oMHgxMDAwMCAtIHYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGludFZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL1B5dGhvblRhcmdldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9QeXRob25UYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg3ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9QeXRob25UYXJnZXQuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisKK1BsZWFzZSBleGN1c2UgbXkgb2J2aW91cyBsYWNrIG9mIEphdmEgZXhwZXJpZW5jZS4gVGhlIGNvZGUgaGVyZSBpcyBwcm9iYWJseQorZnVsbCBvZiBXVEZzIC0gdGhvdWdoIElNSE8gSmF2YSBpcyB0aGUgUmVhbCBXVEYoVE0pIGhlcmUuLi4KKworICovCisKK3BhY2thZ2Ugb3JnLmFudGxyLmNvZGVnZW47CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFB5dGhvblRhcmdldCBleHRlbmRzIFRhcmdldCB7CisgICAgLyoqIFRhcmdldCBtdXN0IGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGxhYmVscyB1c2VkIGZvciB0b2tlbiB0eXBlcyAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbChDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKwkJCQkJICAgIGludCB0dHlwZSkgeworCS8vIHVzZSBpbnRzIGZvciBwcmVkZWZpbmVkIHR5cGVzOworCS8vIDxpbnZhbGlkPiA8RU9SPiA8RE9XTj4gPFVQPgorCWlmICggdHR5cGUgPj0gMCAmJiB0dHlwZSA8PSAzICkgeworCSAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodHR5cGUpOworCX0KKworCVN0cmluZyBuYW1lID0gZ2VuZXJhdG9yLmdyYW1tYXIuZ2V0VG9rZW5EaXNwbGF5TmFtZSh0dHlwZSk7CisKKwkvLyBJZiBuYW1lIGlzIGEgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0b2tlbiB0eXBlIGluc3RlYWQKKwlpZiAoIG5hbWUuY2hhckF0KDApPT0nXCcnICkgeworCSAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodHR5cGUpOworCX0KKworCXJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbCgKKyAgICAgICAgICAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorICAgICAgICAgICAgU3RyaW5nIGxpdGVyYWwpIHsKKwlpbnQgYyA9IEdyYW1tYXIuZ2V0Q2hhclZhbHVlRnJvbUdyYW1tYXJDaGFyTGl0ZXJhbChsaXRlcmFsKTsKKwlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IHNwbGl0TGluZXMoU3RyaW5nIHRleHQpIHsKKwkJQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWludCBpZHggPSAwOworCisJCXdoaWxlICggdHJ1ZSApIHsKKwkJCWludCBlb2wgPSB0ZXh0LmluZGV4T2YoIlxuIiwgaWR4KTsKKwkJCWlmICggZW9sID09IC0xICkgeworCQkJCWwuYWRkKHRleHQuc3Vic3RyaW5nKGlkeCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSB7CisJCQkJbC5hZGQodGV4dC5zdWJzdHJpbmcoaWR4LCBlb2wrMSkpOworCQkJCWlkeCA9IGVvbCsxOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGw7CisgICAgfQorCisgICAgcHVibGljIExpc3QgcG9zdFByb2Nlc3NBY3Rpb24oTGlzdCBjaHVua3MsIFRva2VuIGFjdGlvblRva2VuKSB7CisJCS8qIFRPRE8KKwkJICAgLSBjaGVjayBmb3IgYW5kIHJlcG9ydCBUQUIgdXNhZ2UKKwkJICovCisKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuKioqIEFjdGlvbiBhdCAiICsgYWN0aW9uVG9rZW4uZ2V0TGluZSgpICsgIjoiICsgYWN0aW9uVG9rZW4uZ2V0Q29sdW1uKCkpOworCisJCS8qIEZpcnN0IEkgY3JlYXRlIGEgbmV3IGxpc3Qgb2YgY2h1bmtzLiBTdHJpbmcgY2h1bmtzIGFyZSBzcGxpdHRlZCBpbnRvCisJCSAgIGxpbmVzIGFuZCBzb21lIHdoaXRlc3BhY2UgbXkgYmUgYWRkZWQgYXQgdGhlIGJlZ2lubmluZy4KKworCQkgICBBcyBhIHJlc3VsdCBJIGdldCBhIGxpc3Qgb2YgY2h1bmtzCisJCSAgIC0gd2hlcmUgdGhlIGZpcnN0IGxpbmUgc3RhcnRzIGF0IGNvbHVtbiAwCisJCSAgIC0gd2hlcmUgZXZlcnkgTEYgaXMgYXQgdGhlIGVuZCBvZiBhIHN0cmluZyBjaHVuaworCQkqLworCisJCUxpc3QgbkNodW5rcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaHVua3Muc2l6ZSgpOyBpKyspIHsKKwkJCU9iamVjdCBjaHVuayA9IGNodW5rcy5nZXQoaSk7CisKKwkJCWlmICggY2h1bmsgaW5zdGFuY2VvZiBTdHJpbmcgKSB7CisJCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWNodW5rcy5nZXQoaSk7CisJCQkJaWYgKCBuQ2h1bmtzLnNpemUoKSA9PSAwICYmIGFjdGlvblRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpID49IDAgKSB7CisJCQkJCS8vIGZpcnN0IGNodW5rIGFuZCBzb21lICd2aXJ0dWFsJyBXUyBhdCBiZWdpbm5pbmcKKwkJCQkJLy8gcHJlcGVuZCB0byB0aGlzIGNodW5rCisKKwkJCQkJU3RyaW5nIHdzID0gIiI7CisJCQkJCWZvciAoIGludCBqID0gMCA7IGogPCBhY3Rpb25Ub2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSA7IGorKyApIHsKKwkJCQkJCXdzICs9ICIgIjsKKwkJCQkJfQorCQkJCQl0ZXh0ID0gd3MgKyB0ZXh0OworCQkJCX0KKworCQkJCUxpc3QgcGFydHMgPSBzcGxpdExpbmVzKHRleHQpOworCQkJCWZvciAoIGludCBqID0gMCA7IGogPCBwYXJ0cy5zaXplKCkgOyBqKysgKSB7CisJCQkJCWNodW5rID0gcGFydHMuZ2V0KGopOworCQkJCQluQ2h1bmtzLmFkZChjaHVuayk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKCBuQ2h1bmtzLnNpemUoKSA9PSAwICYmIGFjdGlvblRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpID49IDAgKSB7CisJCQkJCS8vIGZpcnN0IGNodW5rIGFuZCBzb21lICd2aXJ0dWFsJyBXUyBhdCBiZWdpbm5pbmcKKwkJCQkJLy8gYWRkIGFzIGEgY2h1bmsgb2YgaXRzIG93bgorCisJCQkJCVN0cmluZyB3cyA9ICIiOworCQkJCQlmb3IgKCBpbnQgaiA9IDAgOyBqIDw9IGFjdGlvblRva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpIDsgaisrICkgeworCQkJCQkJd3MgKz0gIiAiOworCQkJCQl9CisJCQkJCW5DaHVua3MuYWRkKHdzKTsKKwkJCQl9CisKKwkJCQluQ2h1bmtzLmFkZChjaHVuayk7CisJCQl9CisJCX0KKworCQlpbnQgbGluZU5vID0gYWN0aW9uVG9rZW4uZ2V0TGluZSgpOworCQlpbnQgY29sID0gMDsKKworCQkvLyBzdHJpcCB0cmFpbGluZyBlbXB0eSBsaW5lcworCQlpbnQgbGFzdENodW5rID0gbkNodW5rcy5zaXplKCkgLSAxOworCQl3aGlsZSAoIGxhc3RDaHVuayA+IDAKKwkJCQkmJiBuQ2h1bmtzLmdldChsYXN0Q2h1bmspIGluc3RhbmNlb2YgU3RyaW5nCisJCQkJJiYgKChTdHJpbmcpbkNodW5rcy5nZXQobGFzdENodW5rKSkudHJpbSgpLmxlbmd0aCgpID09IDAgKQorCQkJbGFzdENodW5rLS07CisKKwkJLy8gc3RyaW5nIGxlYWRpbmcgZW1wdHkgbGluZXMKKwkJaW50IGZpcnN0Q2h1bmsgPSAwOworCQl3aGlsZSAoIGZpcnN0Q2h1bmsgPD0gbGFzdENodW5rCisJCQkJJiYgbkNodW5rcy5nZXQoZmlyc3RDaHVuaykgaW5zdGFuY2VvZiBTdHJpbmcKKwkJCQkmJiAoKFN0cmluZyluQ2h1bmtzLmdldChmaXJzdENodW5rKSkudHJpbSgpLmxlbmd0aCgpID09IDAKKwkJCQkmJiAoKFN0cmluZyluQ2h1bmtzLmdldChmaXJzdENodW5rKSkuZW5kc1dpdGgoIlxuIikgKSB7CisJCQlsaW5lTm8rKzsKKwkJCWZpcnN0Q2h1bmsrKzsKKwkJfQorCisJCWludCBpbmRlbnQgPSAtMTsKKwkJZm9yICggaW50IGkgPSBmaXJzdENodW5rIDsgaSA8PSBsYXN0Q2h1bmsgOyBpKysgKSB7CisJCQlPYmplY3QgY2h1bmsgPSBuQ2h1bmtzLmdldChpKTsKKworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obGluZU5vICsgIjoiICsgY29sICsgIiAiICsgcXVvdGUoY2h1bmsudG9TdHJpbmcoKSkpOworCisJCQlpZiAoIGNodW5rIGluc3RhbmNlb2YgU3RyaW5nICkgeworCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZyljaHVuazsKKworCQkJCWlmICggY29sID09IDAgKSB7CisJCQkJCWlmICggaW5kZW50ID09IC0xICkgeworCQkJCQkJLy8gZmlyc3Qgbm9uLWJsYW5rIGxpbmUKKwkJCQkJCS8vIGNvdW50IG51bWJlciBvZiBsZWFkaW5nIHdoaXRlc3BhY2VzCisKKwkJCQkJCWluZGVudCA9IDA7CisJCQkJCQlmb3IgKCBpbnQgaiA9IDA7IGogPCB0ZXh0Lmxlbmd0aCgpOyBqKysgKSB7CisJCQkJCQkJaWYgKCAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChqKSkgKQorCQkJCQkJCQlicmVhazsKKwkJCQorCQkJCQkJCWluZGVudCsrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKCB0ZXh0Lmxlbmd0aCgpID49IGluZGVudCApIHsKKwkJCQkJCWludCBqOworCQkJCQkJZm9yICggaiA9IDA7IGogPCBpbmRlbnQgOyBqKysgKSB7CisJCQkJCQkJaWYgKCAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChqKSkgKSB7CisJCQkJCQkJCS8vIHNob3VsZCBkbyByZWFsIGVycm9yIHJlcG9ydGluZyBoZXJlLi4uCisJCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogYmFkbHkgaW5kZW50ZWQgbGluZSAiICsgbGluZU5vICsgIiBpbiBhY3Rpb246Iik7CisJCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbih0ZXh0KTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQluQ2h1bmtzLnNldChpLCB0ZXh0LnN1YnN0cmluZyhqKSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoIHRleHQudHJpbSgpLmxlbmd0aCgpID4gMCApIHsKKwkJCQkJCS8vIHNob3VsZCBkbyByZWFsIGVycm9yIHJlcG9ydGluZyBoZXJlLi4uCisJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIldhcm5pbmc6IGJhZGx5IGluZGVudGVkIGxpbmUgIiArIGxpbmVObyArICIgaW4gYWN0aW9uOiIpOworCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKHRleHQpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCB0ZXh0LmVuZHNXaXRoKCJcbiIpICkgeworCQkJCQlsaW5lTm8rKzsKKwkJCQkJY29sID0gMDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWNvbCArPSB0ZXh0Lmxlbmd0aCgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIG5vdCByZWFsbHkgY29ycmVjdCwgYnV0IGFsbCBJIG5lZWQgaXMgY29sIHRvIGluY3JlbWVudC4uLgorCQkJCWNvbCArPSAxOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG5DaHVua3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9SdWJ5VGFyZ2V0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL1J1YnlUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA2ZDAxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9SdWJ5VGFyZ2V0LmphdmEKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAxMCBLeWxlIFlldHRlcgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIuY29kZWdlbjsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LkF0dHJpYnV0ZVJlbmRlcmVyOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1RHcm91cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBSdWJ5VGFyZ2V0IGV4dGVuZHMgVGFyZ2V0Cit7CisgICAgLyoqIEEgc2V0IG9mIHJ1Ynkga2V5d29yZHMgd2hpY2ggYXJlIHVzZWQgdG8gZXNjYXBlIGxhYmVscyBhbmQgbWV0aG9kIG5hbWVzCisgICAgICogIHdoaWNoIHdpbGwgY2F1c2UgcGFyc2UgZXJyb3JzIGluIHRoZSBydWJ5IHNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IHJ1YnlLZXl3b3JkcyA9CisgICAgbmV3IEhhc2hTZXQoKSB7CisgICAgICAgIHsKKyAgICAgICAgCWFkZCggImFsaWFzIiApOyAgICAgYWRkKCAiRU5EIiApOyAgICAgYWRkKCAicmV0cnkiICk7CisgICAgICAgIAlhZGQoICJhbmQiICk7ICAgICAgIGFkZCggImVuc3VyZSIgKTsgIGFkZCggInJldHVybiIgKTsKKyAgICAgICAgCWFkZCggIkJFR0lOIiApOyAgICAgYWRkKCAiZmFsc2UiICk7ICAgYWRkKCAic2VsZiIgKTsKKyAgICAgICAgCWFkZCggImJlZ2luIiApOyAgICAgYWRkKCAiZm9yIiApOyAgICAgYWRkKCAic3VwZXIiICk7CisgICAgICAgIAlhZGQoICJicmVhayIgKTsgICAgIGFkZCggImlmIiApOyAgICAgIGFkZCggInRoZW4iICk7CisgICAgICAgIAlhZGQoICJjYXNlIiApOyAgICAgIGFkZCggImluIiApOyAgICAgIGFkZCggInRydWUiICk7CisgICAgICAgIAlhZGQoICJjbGFzcyIgKTsgICAgIGFkZCggIm1vZHVsZSIgKTsgIGFkZCggInVuZGVmIiApOworICAgICAgICAJYWRkKCAiZGVmIiApOyAgICAgICBhZGQoICJuZXh0IiApOyAgICBhZGQoICJ1bmxlc3MiICk7CisgICAgICAgIAlhZGQoICJkZWZpbmVkPyIgKTsgIGFkZCggIm5pbCIgKTsgICAgIGFkZCggInVudGlsIiApOworICAgICAgICAJYWRkKCAiZG8iICk7ICAgICAgICBhZGQoICJub3QiICk7ICAgICBhZGQoICJ3aGVuIiApOworICAgICAgICAJYWRkKCAiZWxzZSIgKTsgICAgICBhZGQoICJvciIgKTsgICAgICBhZGQoICJ3aGlsZSIgKTsKKyAgICAgICAgCWFkZCggImVsc2lmIiApOyAgICAgYWRkKCAicmVkbyIgKTsgICAgYWRkKCAieWllbGQiICk7CisgICAgICAgIAlhZGQoICJlbmQiICk7ICAgICAgIGFkZCggInJlc2N1ZSIgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHNoYXJlZEFjdGlvbkJsb2NrcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKworICAgIHB1YmxpYyBjbGFzcyBSdWJ5UmVuZGVyZXIgaW1wbGVtZW50cyBBdHRyaWJ1dGVSZW5kZXJlcgorICAgIHsKKyAgICAJcHJvdGVjdGVkIFN0cmluZ1tdIHJ1YnlDaGFyVmFsdWVFc2NhcGUgPSBuZXcgU3RyaW5nWzI1Nl07CisKKyAgICAJcHVibGljIFJ1YnlSZW5kZXJlcigpIHsKKyAgICAJCWZvciAoIGludCBpID0gMDsgaSA8IDE2OyBpKysgKSB7CisgICAgCQkJcnVieUNoYXJWYWx1ZUVzY2FwZVsgaSBdID0gIlxceDAiICsgSW50ZWdlci50b0hleFN0cmluZyggaSApOworICAgIAkJfQorICAgIAkJZm9yICggaW50IGkgPSAxNjsgaSA8IDMyOyBpKysgKSB7CisgICAgCQkJcnVieUNoYXJWYWx1ZUVzY2FwZVsgaSBdID0gIlxceCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKCBpICk7CisgICAgCQl9CisgICAgCQlmb3IgKCBjaGFyIGkgPSAzMjsgaSA8IDEyNzsgaSsrICkgeworICAgIAkJCXJ1YnlDaGFyVmFsdWVFc2NhcGVbIGkgXSA9IENoYXJhY3Rlci50b1N0cmluZyggaSApOworICAgIAkJfQorICAgIAkJZm9yICggaW50IGkgPSAxMjc7IGkgPCAyNTY7IGkrKyApIHsKKyAgICAJCQlydWJ5Q2hhclZhbHVlRXNjYXBlWyBpIF0gPSAiXFx4IiArIEludGVnZXIudG9IZXhTdHJpbmcoIGkgKTsKKyAgICAJCX0KKworICAgIAkJcnVieUNoYXJWYWx1ZUVzY2FwZVsnXG4nXSA9ICJcXG4iOworICAgIAkJcnVieUNoYXJWYWx1ZUVzY2FwZVsnXHInXSA9ICJcXHIiOworICAgIAkJcnVieUNoYXJWYWx1ZUVzY2FwZVsnXHQnXSA9ICJcXHQiOworICAgIAkJcnVieUNoYXJWYWx1ZUVzY2FwZVsnXGInXSA9ICJcXGIiOworICAgIAkJcnVieUNoYXJWYWx1ZUVzY2FwZVsnXGYnXSA9ICJcXGYiOworICAgIAkJcnVieUNoYXJWYWx1ZUVzY2FwZVsnXFwnXSA9ICJcXFxcIjsKKyAgICAJCXJ1YnlDaGFyVmFsdWVFc2NhcGVbJyInXSA9ICJcXFwiIjsKKyAgICAJfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoIE9iamVjdCBvLCBTdHJpbmcgZm9ybWF0TmFtZSwgTG9jYWxlIGxvY2FsZSApIHsKKwkJCWlmICggZm9ybWF0TmFtZT09bnVsbCApIHsKKwkJCQlyZXR1cm4gby50b1N0cmluZygpOworCQkJfQorCQkJCisgICAgICAgICAgICBTdHJpbmcgaWRTdHJpbmcgPSBvLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIGlmICggaWRTdHJpbmcuaXNFbXB0eSgpICkgcmV0dXJuIGlkU3RyaW5nOworCisgICAgICAgICAgICBpZiAoIGZvcm1hdE5hbWUuZXF1YWxzKCAic25ha2VjYXNlIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBzbmFrZWNhc2UoIGlkU3RyaW5nICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmb3JtYXROYW1lLmVxdWFscyggImNhbWVsY2FzZSIgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxjYXNlKCBpZFN0cmluZyApOworICAgICAgICAgICAgfSBlbHNlIGlmICggZm9ybWF0TmFtZS5lcXVhbHMoICJzdWJjYW1lbGNhc2UiICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1YmNhbWVsY2FzZSggaWRTdHJpbmcgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGZvcm1hdE5hbWUuZXF1YWxzKCAiY29uc3RhbnQiICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0YW50Y2FzZSggaWRTdHJpbmcgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGZvcm1hdE5hbWUuZXF1YWxzKCAicGxhdGZvcm0iICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXRmb3JtKCBpZFN0cmluZyApOworICAgICAgICAgICAgfSBlbHNlIGlmICggZm9ybWF0TmFtZS5lcXVhbHMoICJsZXhlclJ1bGUiICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxleGVyUnVsZSggaWRTdHJpbmcgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGZvcm1hdE5hbWUuZXF1YWxzKCAiY29uc3RhbnRQYXRoIiApICkgeworICAgICAgICAgICAgCXJldHVybiBjb25zdGFudFBhdGgoIGlkU3RyaW5nICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmb3JtYXROYW1lLmVxdWFscyggInJ1YnlTdHJpbmciICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1YnlTdHJpbmcoIGlkU3RyaW5nICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmb3JtYXROYW1lLmVxdWFscyggImxhYmVsIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbCggaWRTdHJpbmcgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIGZvcm1hdE5hbWUuZXF1YWxzKCAic3ltYm9sIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2woIGlkU3RyaW5nICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJVbnN1cHBvcnRlZCBmb3JtYXQgbmFtZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBnaXZlbiBhbiBpbnB1dCBzdHJpbmcsIHdoaWNoIGlzIHByZXN1bWVkCisgICAgICAgICAqIHRvIGNvbnRhaW4gYSB3b3JkLCB3aGljaCBtYXkgcG90ZW50aWFsbHkgYmUgY2FtZWxjYXNlZCwKKyAgICAgICAgICogYW5kIGNvbnZlcnQgaXQgdG8gc25ha2VfY2FzZSB1bmRlcnNjb3JlIHN0eWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBhbGdvcml0aG0gLS0KKyAgICAgICAgICogICBpdGVyYXRlIHRocm91Z2ggdGhlIHN0cmluZyB3aXRoIGEgc2xpZGluZyB3aW5kb3cgMyBjaGFycyB3aWRlCisgICAgICAgICAqCisgICAgICAgICAqIGV4YW1wbGUgLS0gYUdVSVdoYXROb3QKKyAgICAgICAgICogICBjICAgYysxIGMrMiAgYWN0aW9uCisgICAgICAgICAqICAgYSAgIEcgICAgICAgIDw8ICdhJyA8PCAnXycgIC8vIGEgbG93ZXItdXBwZXIgd29yZCBlZGdlCisgICAgICAgICAqICAgRyAgIFUgICBJICAgIDw8ICdnJworICAgICAgICAgKiAgIFUgICBJICAgVyAgICA8PCAndycKKyAgICAgICAgICogICBJICAgVyAgIGggICAgPDwgJ2knIDw8ICdfJyAgLy8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIGFuIGFjcm9ueW0gcnVuIG9mIHVwcGVycworICAgICAgICAgKiAgIFcgICBoICAgICAgICA8PCAndycKKyAgICAgICAgICogICAuLi4gYW5kIHNvIG9uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBzbmFrZWNhc2UoIFN0cmluZyB2YWx1ZSApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0X2J1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBpbnQgbCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgaW50IGNsaWZmID0gbCAtIDE7CisgICAgICAgICAgICBjaGFyIGN1cjsKKyAgICAgICAgICAgIGNoYXIgbmV4dDsKKyAgICAgICAgICAgIGNoYXIgcGVlazsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZS5pc0VtcHR5KCkgKSByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICBpZiAoIGwgPT0gMSApIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBjbGlmZjsgaSsrICkgeworICAgICAgICAgICAgICAgIGN1ciAgPSB2YWx1ZS5jaGFyQXQoIGkgKTsKKyAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUuY2hhckF0KCBpICsgMSApOworCisgICAgICAgICAgICAgICAgaWYgKCBDaGFyYWN0ZXIuaXNMZXR0ZXIoIGN1ciApICkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCBjdXIgKSApOworCisgICAgICAgICAgICAgICAgICAgIGlmICggQ2hhcmFjdGVyLmlzRGlnaXQoIG5leHQgKSB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKCBuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggJ18nICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZSggY3VyICkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKCBuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBjYW1lbGNhc2Ugd29yZCBlZGdlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggJ18nICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICggaSA8IGNsaWZmIC0gMSApICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSggY3VyICkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKCBuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXIgaXMgcGFydCBvZiBhbiBhY3JvbnltCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlZWsgPSB2YWx1ZS5jaGFyQXQoIGkgKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIENoYXJhY3Rlci5pc0xvd2VyQ2FzZSggcGVlayApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG5leHQgaXMgdGhlIHN0YXJ0IG9mIHdvcmQgKGluZGljYXRlZCB3aGVuIHBlZWsgaXMgbG93ZXJjYXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBhY3JvbnltIG11c3QgYmUgY29tcGxldGVkIGJ5IGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlci5hcHBlbmQoICdfJyApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggQ2hhcmFjdGVyLmlzRGlnaXQoIGN1ciApICkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggY3VyICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggQ2hhcmFjdGVyLmlzTGV0dGVyKCBuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggJ18nICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKCBjdXIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXIuYXBwZW5kKCBjdXIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyICA9IHZhbHVlLmNoYXJBdCggY2xpZmYgKTsKKyAgICAgICAgICAgIGlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKCBjdXIgKSApIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCBjdXIgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gb3V0cHV0X2J1ZmZlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29uc3RhbnRjYXNlKCBTdHJpbmcgdmFsdWUgKSB7CisgICAgICAgICAgICByZXR1cm4gc25ha2VjYXNlKCB2YWx1ZSApLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBwbGF0Zm9ybSggU3RyaW5nIHZhbHVlICkgeworICAgICAgICAgICAgcmV0dXJuICggIl9fIiArIHZhbHVlICsgIl9fIiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3ltYm9sKCBTdHJpbmcgdmFsdWUgKSB7CisgICAgICAgICAgICBpZiAoIHZhbHVlLm1hdGNoZXMoICJbYS16QS1aX11cXHcqW1xcP1xcIVxcPV0/IiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiAoICI6IiArIHZhbHVlICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAoICIlcygiICsgdmFsdWUgKyAiKSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxleGVyUnVsZSggU3RyaW5nIHZhbHVlICkgeworCQkJCQkgIC8vIFN5c3RlbS5vdXQucHJpbnQoICJsZXhlclJ1bGUoIFwiIiArIHZhbHVlICsgIlwiKSA9PiAiICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlLmVxdWFscyggIlRva2VucyIgKSApIHsKKwkJCQkJCQkgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggIlwidG9rZW4hXCIiICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0b2tlbiEiOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQkJCQkgIC8vIFN0cmluZyByZXN1bHQgPSBzbmFrZWNhc2UoIHZhbHVlICkgKyAiISI7CisJCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbiggIlwiIiArIHJlc3VsdCArICJcIiIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCBzbmFrZWNhc2UoIHZhbHVlICkgKyAiISIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbnN0YW50UGF0aCggU3RyaW5nIHZhbHVlICkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoICJcXC4iLCAiOjoiICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBydWJ5U3RyaW5nKCBTdHJpbmcgdmFsdWUgKSB7CisgICAgICAgIAlTdHJpbmdCdWlsZGVyIG91dHB1dF9idWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAJaW50IGxlbiA9IHZhbHVlLmxlbmd0aCgpOworCisgICAgICAgIAlvdXRwdXRfYnVmZmVyLmFwcGVuZCggJyInICk7CisgICAgICAgIAlmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgCQlvdXRwdXRfYnVmZmVyLmFwcGVuZCggcnVieUNoYXJWYWx1ZUVzY2FwZVsgdmFsdWUuY2hhckF0KCBpICkgXSApOworICAgICAgICAJfQorICAgICAgICAJb3V0cHV0X2J1ZmZlci5hcHBlbmQoICciJyApOworICAgICAgICAJcmV0dXJuIG91dHB1dF9idWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNhbWVsY2FzZSggU3RyaW5nIHZhbHVlICkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXRfYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGludCBjbGlmZiA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgY2hhciBjdXI7CisgICAgICAgICAgICBjaGFyIG5leHQ7CisgICAgICAgICAgICBib29sZWFuIGF0X2VkZ2UgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoIHZhbHVlLmlzRW1wdHkoKSApIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIGlmICggY2xpZmYgPT0gMSApIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBjbGlmZjsgaSsrICkgeworICAgICAgICAgICAgICAgIGN1ciAgPSB2YWx1ZS5jaGFyQXQoIGkgKTsKKworICAgICAgICAgICAgICAgIGlmICggQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSggY3VyICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGF0X2VkZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBjdXIgPT0gJ18nICkgeworICAgICAgICAgICAgICAgICAgICBhdF9lZGdlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggQ2hhcmFjdGVyLmlzRGlnaXQoIGN1ciApICkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggY3VyICk7CisgICAgICAgICAgICAgICAgICAgIGF0X2VkZ2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGF0X2VkZ2UgKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXIuYXBwZW5kKCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoIGN1ciApICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggQ2hhcmFjdGVyLmlzTGV0dGVyKCBjdXIgKSApIGF0X2VkZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyLmFwcGVuZCggY3VyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gb3V0cHV0X2J1ZmZlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWwoIFN0cmluZyB2YWx1ZSApIHsKKyAgICAgICAgICAgIGlmICggcnVieUtleXdvcmRzLmNvbnRhaW5zKCB2YWx1ZSApICkgeworICAgICAgICAgICAgICAgIHJldHVybiBwbGF0Zm9ybSggdmFsdWUgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSggdmFsdWUuY2hhckF0KCAwICkgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCAhdmFsdWUuZXF1YWxzKCAiRklMRSIgKSApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoICF2YWx1ZS5lcXVhbHMoICJMSU5FIiApICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXRmb3JtKCB2YWx1ZSApOworICAgICAgICAgICAgfSBlbHNlIGlmICggdmFsdWUuZXF1YWxzKCAiRklMRSIgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIl9GSUxFXyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB2YWx1ZS5lcXVhbHMoICJMSU5FIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiAiX0xJTkVfIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3ViY2FtZWxjYXNlKCBTdHJpbmcgdmFsdWUgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGNhbWVsY2FzZSggdmFsdWUgKTsKKyAgICAgICAgICAgIGlmICggdmFsdWUuaXNFbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICBDaGFyYWN0ZXIgaGVhZCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSggdmFsdWUuY2hhckF0KCAwICkgKTsKKyAgICAgICAgICAgIFN0cmluZyB0YWlsID0gdmFsdWUuc3Vic3RyaW5nKCAxICk7CisgICAgICAgICAgICByZXR1cm4gaGVhZC50b1N0cmluZygpLmNvbmNhdCggdGFpbCApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZ2VuUmVjb2duaXplckZpbGUoCisgICAgCQlUb29sIHRvb2wsCisgICAgCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKyAgICAJCUdyYW1tYXIgZ3JhbW1hciwKKyAgICAJCVNUIG91dHB1dEZpbGVTVAorICAgICkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvKgorICAgICAgICAgICAgQmVsb3cgaXMgYW4gZXhwZXJpbWVudGFsIGF0dGVtcHQgYXQgcHJvdmlkaW5nIGEgZmV3IG5hbWVkIGFjdGlvbiBibG9ja3MKKyAgICAgICAgICAgIHRoYXQgYXJlIHByaW50ZWQgaW4gYm90aCBsZXhlciBhbmQgcGFyc2VyIGZpbGVzIGZyb20gY29tYmluZWQgZ3JhbW1hcnMuCisgICAgICAgICAgICBBTlRMUiBhcHBlYXJzIHRvIGZpcnN0IGdlbmVyYXRlIGEgcGFyc2VyLCB0aGVuIGdlbmVyYXRlIGFuIGluZGVwZW5kZW50IGxleGVyLAorICAgICAgICAgICAgYW5kIHRoZW4gZ2VuZXJhdGUgY29kZSBmcm9tIHRoYXQuIEl0IGtlZXBzIHRoZSBjb21iby9wYXJzZXIgZ3JhbW1hciBvYmplY3QKKyAgICAgICAgICAgIGFuZCB0aGUgbGV4ZXIgZ3JhbW1hciBvYmplY3QsIGFzIHdlbGwgYXMgdGhlaXIgcmVzcGVjdGl2ZSBjb2RlIGdlbmVyYXRvciBhbmQKKyAgICAgICAgICAgIHRhcmdldCBpbnN0YW5jZXMsIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQuIFNvLCB3aGlsZSBhIGJpdCBoYWNrLWlzaCwgdGhpcyBpcworICAgICAgICAgICAgYSBzb2x1dGlvbiB0aGF0IHNob3VsZCB3b3JrIHdpdGhvdXQgaGF2aW5nIHRvIG1vZGlmeSBUZXJyZW5jZSBQYXJyJ3MKKyAgICAgICAgICAgIGNvcmUgdG9vbCBjb2RlLgorCisgICAgICAgICAgICAtIHNoYXJlZEFjdGlvbkJsb2NrcyBpcyBhIGNsYXNzIHZhcmlhYmxlIGNvbnRhaW5pbmcgYSBoYXNoIG1hcAorICAgICAgICAgICAgLSBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIGNvbWJvIGdyYW1tYXIsIGFuZCB0aGUgYWN0aW9uIG1hcAorICAgICAgICAgICAgICBpbiB0aGUgZ3JhbW1hciBjb250YWlucyBhbiBlbnRyeSBmb3IgdGhlIG5hbWVkIHNjb3BlICJhbGwiLAorICAgICAgICAgICAgICBhZGQgYW4gZW50cnkgdG8gc2hhcmVkQWN0aW9uQmxvY2tzIG1hcHBpbmcgdGhlIGdyYW1tYXIgbmFtZSB0bworICAgICAgICAgICAgICB0aGUgImFsbCIgYWN0aW9uIG1hcC4KKyAgICAgICAgICAgIC0gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggYW4gYGltcGxpY2l0IGxleGVyJworICAgICAgICAgICAgICAob25lIHRoYXQncyBleHRyYWN0ZWQgZnJvbSBhIGNvbWJvIGdyYW1tYXIpLCBjaGVjayB0byBzZWUgaWYKKyAgICAgICAgICAgICAgdGhlcmUncyBhbiBlbnRyeSBpbiBzaGFyZWRBY3Rpb25CbG9ja3MgZm9yIHRoZSBsZXhlcidzIGdyYW1tYXIgbmFtZS4KKyAgICAgICAgICAgIC0gaWYgdGhlcmUgaXMgYW4gYWN0aW9uIG1hcCBlbnRyeSwgcGxhY2UgaXQgaW4gdGhlIGxleGVyJ3MgYWN0aW9uIG1hcAorICAgICAgICAgICAgLSB0aGUgcmVjb2duaXplckZpbGUgdGVtcGxhdGUgaGFzIGNvZGUgdG8gcGxhY2UgdGhlCisgICAgICAgICAgICAgICJhbGwiIGFjdGlvbnMgYXBwcm9wcmlhdGVseQorCisgICAgICAgICAgICBwcm9ibGVtczoKKyAgICAgICAgICAgICAgLSBUaGlzIHNvbHV0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcGFyc2VyIHdpbGwgYmUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBsZXhlci4gSWYgdGhhdCBjaGFuZ2VzIGF0IHNvbWUgcG9pbnQsIHRoaXMgd2lsbAorICAgICAgICAgICAgICAgIG5vdCB3b3JrLgorICAgICAgICAgICAgICAtIEkgaGF2ZSBub3QgaW52ZXN0aWdhdGVkIGhvdyB0aGlzIHdvcmtzIHdpdGggZGVsZWdhdGlvbiB5ZXQKKworICAgICAgICAgICAgS3lsZSBZZXR0ZXIgLSBNYXJjaCAyNSwgMjAxMAorICAgICAgICAqLworCisgICAgICAgIGlmICggZ3JhbW1hci50eXBlID09IEdyYW1tYXIuQ09NQklORUQgKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhY3Rpb25zID0gZ3JhbW1hci5nZXRBY3Rpb25zKCk7CisgICAgICAgICAgICBpZiAoIGFjdGlvbnMuY29udGFpbnNLZXkoICJhbGwiICkgKSB7CisgICAgICAgICAgICAgICAgc2hhcmVkQWN0aW9uQmxvY2tzLnB1dCggZ3JhbW1hci5uYW1lLCBhY3Rpb25zLmdldCggImFsbCIgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCBncmFtbWFyLmltcGxpY2l0TGV4ZXIgKSB7CisgICAgICAgICAgICBpZiAoIHNoYXJlZEFjdGlvbkJsb2Nrcy5jb250YWluc0tleSggZ3JhbW1hci5uYW1lICkgKSB7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWN0aW9ucyA9IGdyYW1tYXIuZ2V0QWN0aW9ucygpOworICAgICAgICAgICAgICAgIGFjdGlvbnMucHV0KCAiYWxsIiwgc2hhcmVkQWN0aW9uQmxvY2tzLmdldCggZ3JhbW1hci5uYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNUR3JvdXAgZ3JvdXAgPSBnZW5lcmF0b3IuZ2V0VGVtcGxhdGVzKCk7CisgICAgICAgIFJ1YnlSZW5kZXJlciByZW5kZXJlciA9IG5ldyBSdWJ5UmVuZGVyZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdyb3VwLnJlZ2lzdGVyUmVuZGVyZXIoIENsYXNzLmZvck5hbWUoICJqYXZhLmxhbmcuU3RyaW5nIiApLCByZW5kZXJlciApOworICAgICAgICB9IGNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0uZXJyICk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0KKyAgICAgICAgICAgIGdlbmVyYXRvci5nZXRSZWNvZ25pemVyRmlsZU5hbWUoIGdyYW1tYXIubmFtZSwgZ3JhbW1hci50eXBlICk7CisgICAgICAgIGdlbmVyYXRvci53cml0ZSggb3V0cHV0RmlsZVNULCBmaWxlTmFtZSApOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbCgKKyAgICAgICAgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisgICAgICAgIFN0cmluZyBsaXRlcmFsCisgICAgKQorICAgIHsKKyAgICAgICAgaW50IGNvZGVfcG9pbnQgPSAwOworICAgICAgICBsaXRlcmFsID0gbGl0ZXJhbC5zdWJzdHJpbmcoIDEsIGxpdGVyYWwubGVuZ3RoKCkgLSAxICk7CisKKyAgICAgICAgaWYgKCBsaXRlcmFsLmNoYXJBdCggMCApID09ICdcXCcgKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCBsaXRlcmFsLmNoYXJBdCggMSApICkgeworICAgICAgICAgICAgICAgIGNhc2UgICAgJ1xcJzoKKyAgICAgICAgICAgICAgICBjYXNlICAgICciJzoKKyAgICAgICAgICAgICAgICBjYXNlICAgICdcJyc6CisgICAgICAgICAgICAgICAgICAgIGNvZGVfcG9pbnQgPSBsaXRlcmFsLmNvZGVQb2ludEF0KCAxICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgICAgJ24nOgorICAgICAgICAgICAgICAgICAgICBjb2RlX3BvaW50ID0gMTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgICAgJ3InOgorICAgICAgICAgICAgICAgICAgICBjb2RlX3BvaW50ID0gMTM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgICAgJ3QnOgorICAgICAgICAgICAgICAgICAgICBjb2RlX3BvaW50ID0gOTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAgICAnYic6CisgICAgICAgICAgICAgICAgICAgIGNvZGVfcG9pbnQgPSA4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICAgICdmJzoKKyAgICAgICAgICAgICAgICAgICAgY29kZV9wb2ludCA9IDEyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICAgICd1JzogICAgLy8gQXNzdW1lIHVubm5uCisgICAgICAgICAgICAgICAgICAgIGNvZGVfcG9pbnQgPSBJbnRlZ2VyLnBhcnNlSW50KCBsaXRlcmFsLnN1YnN0cmluZyggMiApLCAxNiApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIxOiBoZXkgeW91IGRpZG4ndCBhY2NvdW50IGZvciB0aGlzOiBcIiIgKyBsaXRlcmFsICsgIlwiIiApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICggbGl0ZXJhbC5sZW5ndGgoKSA9PSAxICkgeworICAgICAgICAgICAgY29kZV9wb2ludCA9IGxpdGVyYWwuY29kZVBvaW50QXQoIDAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIjI6IGhleSB5b3UgZGlkbid0IGFjY291bnQgZm9yIHRoaXM6IFwiIiArIGxpdGVyYWwgKyAiXCIiICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCAiMHgiICsgSW50ZWdlci50b0hleFN0cmluZyggY29kZV9wb2ludCApICk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhDaGFyVmFsdWUoIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yICkKKyAgICB7CisgICAgICAgIC8vIFZlcnNpb25zIGJlZm9yZSAxLjkgZG8gbm90IHN1cHBvcnQgdW5pY29kZQorICAgICAgICByZXR1cm4gMHhGRjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuVHlwZUFzVGFyZ2V0TGFiZWwoIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLCBpbnQgdHR5cGUgKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZW5lcmF0b3IuZ3JhbW1hci5nZXRUb2tlbkRpc3BsYXlOYW1lKCB0dHlwZSApOworICAgICAgICAvLyBJZiBuYW1lIGlzIGEgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0b2tlbiB0eXBlIGluc3RlYWQKKyAgICAgICAgaWYgKCBuYW1lLmNoYXJBdCggMCApPT0nXCcnICkgeworICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5ncmFtbWFyLmNvbXB1dGVUb2tlbk5hbWVGcm9tTGl0ZXJhbCggdHR5cGUsIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkQWN0aW9uU2NvcGUoIGludCBncmFtbWFyVHlwZSwgU3RyaW5nIHNjb3BlICkgeworICAgICAgICBpZiAoIHNjb3BlLmVxdWFscyggImFsbCIgKSApICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICggc2NvcGUuZXF1YWxzKCAidG9rZW4iICkgKSAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBzY29wZS5lcXVhbHMoICJtb2R1bGUiICkgKSAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHNjb3BlLmVxdWFscyggIm92ZXJyaWRlcyIgKSApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICggZ3JhbW1hclR5cGUgKSB7CisgICAgICAgIGNhc2UgR3JhbW1hci5MRVhFUjoKKyAgICAgICAgICAgIGlmICggc2NvcGUuZXF1YWxzKCAibGV4ZXIiICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHcmFtbWFyLlBBUlNFUjoKKyAgICAgICAgICAgIGlmICggc2NvcGUuZXF1YWxzKCAicGFyc2VyIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR3JhbW1hci5DT01CSU5FRDoKKyAgICAgICAgICAgIGlmICggc2NvcGUuZXF1YWxzKCAicGFyc2VyIiApICkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzY29wZS5lcXVhbHMoICJsZXhlciIgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdyYW1tYXIuVFJFRV9QQVJTRVI6CisgICAgICAgICAgICBpZiAoIHNjb3BlLmVxdWFscyggInRyZWVwYXJzZXIiICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVJbnRBc0NoYXJFc2NhcGUoIGZpbmFsIGludCB2ICkgeworICAgICAgICBmaW5hbCBpbnQgaW50VmFsdWU7CisKKyAgICAgICAgaWYgKCB2ID09IDY1NTM1ICkgeworICAgICAgICAgICAgaW50VmFsdWUgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludFZhbHVlID0gdjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZiggaW50VmFsdWUgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9jb2RlZ2VuL1RhcmdldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9UYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhkZDdmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvY29kZWdlbi9UYXJnZXQuamF2YQpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5jb2RlZ2VuOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIFRoZSBjb2RlIGdlbmVyYXRvciBmb3IgQU5UTFIgY2FuIHVzdWFsbHkgYmUgcmV0YXJnZXRlZCBqdXN0IGJ5IHByb3ZpZGluZworICogIGEgbmV3IFguc3RnIGZpbGUgZm9yIGxhbmd1YWdlIFgsIGhvd2V2ZXIsIHNvbWV0aW1lcyB0aGUgZmlsZXMgdGhhdCBtdXN0CisgKiAgYmUgZ2VuZXJhdGVkIHZhcnkgZW5vdWdoIHRoYXQgc29tZSBYLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQuCisgKiAgRm9yIGV4YW1wbGUsIGluIEMsIHlvdSBtdXN0IGdlbmVyYXRlIGhlYWRlciBmaWxlcyB3aGVyZWFzIGluIEphdmEgeW91IGRvIG5vdC4KKyAqICBPdGhlciBsYW5ndWFnZXMgbWF5IHdhbnQgdG8ga2VlcCBERkEgc2VwYXJhdGUgZnJvbSB0aGUgbWFpbgorICogIGdlbmVyYXRlZCByZWNvZ25pemVyIGZpbGUuCisgKgorICogIFRoZSBub3Rpb24gb2YgYSBDb2RlIEdlbmVyYXRvciB0YXJnZXQgYWJzdHJhY3RzIG91dCB0aGUgY3JlYXRpb24KKyAqICBvZiB0aGUgdmFyaW91cyBmaWxlcy4gIEFzIG5ldyBsYW5ndWFnZSB0YXJnZXRzIGdldCBhZGRlZCB0byB0aGUgQU5UTFIKKyAqICBzeXN0ZW0sIHRoaXMgdGFyZ2V0IGNsYXNzIG1heSBoYXZlIHRvIGJlIGFsdGVyZWQgdG8gaGFuZGxlIG1vcmUKKyAqICBmdW5jdGlvbmFsaXR5LiAgRXZlbnR1YWxseSwganVzdCBhYm91dCBhbGwgbGFuZ3VhZ2UgZ2VuZXJhdGlvbiBpc3N1ZXMKKyAqICB3aWxsIGJlIGV4cHJlc3NpYmxlIGluIHRlcm1zIG9mIHRoZXNlIG1ldGhvZHMuCisgKgorICogIElmIG9yZy5hbnRsci5jb2RlZ2VuLlhUYXJnZXQgY2xhc3MgZXhpc3RzLCBpdCBpcyB1c2VkIGVsc2UKKyAqICBUYXJnZXQgYmFzZSBjbGFzcyBpcyB1c2VkLiAgSSBhbSB1c2luZyBhIHN1cGVyY2xhc3MgcmF0aGVyIHRoYW4gYW4KKyAqICBpbnRlcmZhY2UgZm9yIHRoaXMgdGFyZ2V0IGNvbmNlcHQgYmVjYXVzZSBJIGNhbiBhZGQgZnVuY3Rpb25hbGl0eQorICogIGxhdGVyIHdpdGhvdXQgYnJlYWtpbmcgcHJldmlvdXNseSB3cml0dGVuIHRhcmdldHMgKGV4dHJhIGludGVyZmFjZQorICogIG1ldGhvZHMgd291bGQgZm9yY2UgYWRkaW5nIGR1bW15IGZ1bmN0aW9ucyB0byBhbGwgY29kZSBnZW5lcmF0b3IKKyAqICB0YXJnZXQgY2xhc3NlcykuCisgKgorICovCitwdWJsaWMgY2xhc3MgVGFyZ2V0IHsKKworCS8qKiBGb3IgcHVyZSBzdHJpbmdzIG9mIEphdmEgMTYtYml0IHVuaWNvZGUgY2hhciwgaG93IGNhbiB3ZSBkaXNwbGF5CisJICogIGl0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYXMgYSBsaXRlcmFsLiAgVXNlZnVsIGZvciBkdW1waW5nCisJICogIHByZWRpY2F0ZXMgYW5kIHN1Y2ggdGhhdCBtYXkgcmVmZXIgdG8gY2hhcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQKKwkgKiAgd2hlbiByZXByZXNlbnRlZCBhcyBzdHJpbmdzLiAgQWxzbywgdGVtcGxhdGVzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbworCSAqICB0aGF0IHRoZSB0YXJnZXQgbGFuZ3VhZ2UgY2FuIGhvbGQgdGhlbSBhcyBhIHN0cmluZy4KKwkgKgorCSAqICBJIGhhdmUgZGVmaW5lZCAodmlhIHRoZSBjb25zdHJ1Y3RvcikgdGhlIHNldCBvZiB0eXBpY2FsIGVzY2FwZXMsCisJICogIGJ1dCB5b3VyIFRhcmdldCBzdWJjbGFzcyBpcyBmcmVlIHRvIGFsdGVyIHRoZSB0cmFuc2xhdGVkIGNoYXJzIG9yCisJICogIGFkZCBtb3JlIGRlZmluaXRpb25zLiAgVGhpcyBpcyBub25zdGF0aWMgc28gZWFjaCB0YXJnZXQgY2FuIGhhdmUKKwkgKiAgYSBkaWZmZXJlbnQgc2V0IGluIG1lbW9yeSBhdCBzYW1lIHRpbWUuCisJICovCisJcHJvdGVjdGVkIFN0cmluZ1tdIHRhcmdldENoYXJWYWx1ZUVzY2FwZSA9IG5ldyBTdHJpbmdbMjU1XTsKKworCXB1YmxpYyBUYXJnZXQoKSB7CisJCXRhcmdldENoYXJWYWx1ZUVzY2FwZVsnXG4nXSA9ICJcXG4iOworCQl0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1xyJ10gPSAiXFxyIjsKKwkJdGFyZ2V0Q2hhclZhbHVlRXNjYXBlWydcdCddID0gIlxcdCI7CisJCXRhcmdldENoYXJWYWx1ZUVzY2FwZVsnXGInXSA9ICJcXGIiOworCQl0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1xmJ10gPSAiXFxmIjsKKwkJdGFyZ2V0Q2hhclZhbHVlRXNjYXBlWydcXCddID0gIlxcXFwiOworCQl0YXJnZXRDaGFyVmFsdWVFc2NhcGVbJ1wnJ10gPSAiXFwnIjsKKwkJdGFyZ2V0Q2hhclZhbHVlRXNjYXBlWyciJ10gPSAiXFxcIiI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZ2VuUmVjb2duaXplckZpbGUoVG9vbCB0b29sLAorCQkJCQkJCQkJIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorCQkJCQkJCQkJIEdyYW1tYXIgZ3JhbW1hciwKKwkJCQkJCQkJCSBTVCBvdXRwdXRGaWxlU1QpCisJCXRocm93cyBJT0V4Y2VwdGlvbgorCXsKKwkJU3RyaW5nIGZpbGVOYW1lID0KKwkJCWdlbmVyYXRvci5nZXRSZWNvZ25pemVyRmlsZU5hbWUoZ3JhbW1hci5uYW1lLCBncmFtbWFyLnR5cGUpOworCQlnZW5lcmF0b3Iud3JpdGUob3V0cHV0RmlsZVNULCBmaWxlTmFtZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZ2VuUmVjb2duaXplckhlYWRlckZpbGUoVG9vbCB0b29sLAorCQkJCQkJCQkJCSAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yLAorCQkJCQkJCQkJCSAgIEdyYW1tYXIgZ3JhbW1hciwKKwkJCQkJCQkJCQkgICBTVCBoZWFkZXJGaWxlU1QsCisJCQkJCQkJCQkJICAgU3RyaW5nIGV4dE5hbWUpIC8vIGUuZy4sICIuaCIKKwkJdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQkvLyBubyBoZWFkZXIgZmlsZSBieSBkZWZhdWx0CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUdyYW1tYXJBbmFseXNpcyhDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKwkJCQkJCQkJCQkgIEdyYW1tYXIgZ3JhbW1hcikKKwl7CisJCS8vIEJ1aWxkIE5GQXMgZnJvbSB0aGUgZ3JhbW1hciBBU1QKKwkJZ3JhbW1hci5idWlsZE5GQSgpOworCisJCS8vIENyZWF0ZSB0aGUgREZBIHByZWRpY3RvcnMgZm9yIGVhY2ggZGVjaXNpb24KKwkJZ3JhbW1hci5jcmVhdGVMb29rYWhlYWRERkFzKCk7CisJfQorCisJLyoqIElzIHNjb3BlIGluIEBzY29wZTo6bmFtZSB7YWN0aW9ufSB2YWxpZCBmb3IgdGhpcyBraW5kIG9mIGdyYW1tYXI/CisJICogIFRhcmdldHMgbGlrZSBDKysgbWF5IHdhbnQgdG8gYWxsb3cgbmV3IHNjb3BlcyBsaWtlIGhlYWRlcmZpbGUgb3IKKwkgKiAgc29tZSBzdWNoLiAgVGhlIGFjdGlvbiBuYW1lcyB0aGVtc2VsdmVzIGFyZSBub3QgcG9saWNlZCBhdCB0aGUKKwkgKiAgbW9tZW50IHNvIHRhcmdldHMgY2FuIGFkZCB0ZW1wbGF0ZSBhY3Rpb25zIHcvbyBoYXZpbmcgdG8gcmVjb21waWxlCisJICogIEFOVExSLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVmFsaWRBY3Rpb25TY29wZShpbnQgZ3JhbW1hclR5cGUsIFN0cmluZyBzY29wZSkgeworCQlzd2l0Y2ggKGdyYW1tYXJUeXBlKSB7CisJCQljYXNlIEdyYW1tYXIuTEVYRVIgOgorCQkJCWlmICggc2NvcGUuZXF1YWxzKCJsZXhlciIpICkge3JldHVybiB0cnVlO30KKwkJCQlicmVhazsKKwkJCWNhc2UgR3JhbW1hci5QQVJTRVIgOgorCQkJCWlmICggc2NvcGUuZXF1YWxzKCJwYXJzZXIiKSApIHtyZXR1cm4gdHJ1ZTt9CisJCQkJYnJlYWs7CisJCQljYXNlIEdyYW1tYXIuQ09NQklORUQgOgorCQkJCWlmICggc2NvcGUuZXF1YWxzKCJwYXJzZXIiKSApIHtyZXR1cm4gdHJ1ZTt9CisJCQkJaWYgKCBzY29wZS5lcXVhbHMoImxleGVyIikgKSB7cmV0dXJuIHRydWU7fQorCQkJCWJyZWFrOworCQkJY2FzZSBHcmFtbWFyLlRSRUVfUEFSU0VSIDoKKwkJCQlpZiAoIHNjb3BlLmVxdWFscygidHJlZXBhcnNlciIpICkge3JldHVybiB0cnVlO30KKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqIFRhcmdldCBtdXN0IGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGxhYmVscyB1c2VkIGZvciB0b2tlbiB0eXBlcyAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbChDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwgaW50IHR0eXBlKSB7CisJCVN0cmluZyBuYW1lID0gZ2VuZXJhdG9yLmdyYW1tYXIuZ2V0VG9rZW5EaXNwbGF5TmFtZSh0dHlwZSk7CisJCS8vIElmIG5hbWUgaXMgYSBsaXRlcmFsLCByZXR1cm4gdGhlIHRva2VuIHR5cGUgaW5zdGVhZAorCQlpZiAoIG5hbWUuY2hhckF0KDApPT0nXCcnICkgeworCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHR0eXBlKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKiogQ29udmVydCBmcm9tIGFuIEFOVExSIGNoYXIgbGl0ZXJhbCBmb3VuZCBpbiBhIGdyYW1tYXIgZmlsZSB0bworCSAqICBhbiBlcXVpdmFsZW50IGNoYXIgbGl0ZXJhbCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgRm9yIG1vc3QKKwkgKiAgbGFuZ3VhZ2VzLCB0aGlzIG1lYW5zIGxlYXZpbmcgJ3gnIGFzICd4Jy4gIEFjdHVhbGx5LCB3ZSBuZWVkCisJICogIHRvIGVzY2FwZSAnXHUwMDBBJyBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGNvbnZlcnRlZCB0byBcbiBieQorCSAqICB0aGUgY29tcGlsZXIuICBDb252ZXJ0IHRoZSBsaXRlcmFsIHRvIHRoZSBjaGFyIHZhbHVlIGFuZCB0aGVuCisJICogIHRvIGFuIGFwcHJvcHJpYXRlIHRhcmdldCBjaGFyIGxpdGVyYWwuCisJICoKKwkgKiAgRXhwZWN0IHNpbmdsZSBxdW90ZXMgYXJvdW5kIHRoZSBpbmNvbWluZyBsaXRlcmFsLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2hhckxpdGVyYWxGcm9tQU5UTFJDaGFyTGl0ZXJhbCgKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IsCisJCVN0cmluZyBsaXRlcmFsKQorCXsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmLmFwcGVuZCgnXCcnKTsKKwkJaW50IGMgPSBHcmFtbWFyLmdldENoYXJWYWx1ZUZyb21HcmFtbWFyQ2hhckxpdGVyYWwobGl0ZXJhbCk7CisJCWlmICggYzxMYWJlbC5NSU5fQ0hBUl9WQUxVRSApIHsKKwkJCXJldHVybiAiJ1x1MDAwMCciOworCQl9CisJCWlmICggYzx0YXJnZXRDaGFyVmFsdWVFc2NhcGUubGVuZ3RoICYmCisJCQkgdGFyZ2V0Q2hhclZhbHVlRXNjYXBlW2NdIT1udWxsICkKKwkJeworCQkJYnVmLmFwcGVuZCh0YXJnZXRDaGFyVmFsdWVFc2NhcGVbY10pOworCQl9CisJCWVsc2UgaWYgKCBDaGFyYWN0ZXIuVW5pY29kZUJsb2NrLm9mKChjaGFyKWMpPT0KKwkJCQkgIENoYXJhY3Rlci5Vbmljb2RlQmxvY2suQkFTSUNfTEFUSU4gJiYKKwkJCQkgICFDaGFyYWN0ZXIuaXNJU09Db250cm9sKChjaGFyKWMpICkKKwkJeworCQkJLy8gbm9ybWFsIGNoYXIKKwkJCWJ1Zi5hcHBlbmQoKGNoYXIpYyk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBtdXN0IGJlIHNvbWV0aGluZyB1bnByaW50YWJsZS4uLnVzZSBcXHVYWFhYCisJCQkvLyB0dXJuIG9uIHRoZSBiaXQgYWJvdmUgbWF4ICJcXHVGRkZGIiB2YWx1ZSBzbyB0aGF0IHdlIHBhZCB3aXRoIHplcm9zCisJCQkvLyB0aGVuIG9ubHkgdGFrZSBsYXN0IDQgZGlnaXRzCisJCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhjfDB4MTAwMDApLnRvVXBwZXJDYXNlKCkuc3Vic3RyaW5nKDEsNSk7CisJCQlidWYuYXBwZW5kKCJcXHUiKTsKKwkJCWJ1Zi5hcHBlbmQoaGV4KTsKKwkJfQorCisJCWJ1Zi5hcHBlbmQoJ1wnJyk7CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogQ29udmVydCBmcm9tIGFuIEFOVExSIHN0cmluZyBsaXRlcmFsIGZvdW5kIGluIGEgZ3JhbW1hciBmaWxlIHRvCisJICogIGFuIGVxdWl2YWxlbnQgc3RyaW5nIGxpdGVyYWwgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEZvciBKYXZhLCB0aGlzCisJICogIGlzIHRoZSB0cmFuc2xhdGlvbiAnYVxuIicgLT4gImFcblwiIi4gIEV4cGVjdCBzaW5nbGUgcXVvdGVzCisJICogIGFyb3VuZCB0aGUgaW5jb21pbmcgbGl0ZXJhbC4gIEp1c3QgZmxpcCB0aGUgcXVvdGVzIGFuZCByZXBsYWNlCisJICogIGRvdWJsZSBxdW90ZXMgd2l0aCBcIgorICAgICAqIAorICAgICAqICBOb3RlIHRoYXQgd2UgaGF2ZSBkZWNpZGVkIHRvIGFsbG93IHBvZXBsZSB0byB1c2UgJ1wiJyB3aXRob3V0CisgICAgICogIHBlbmFsdHksIHNvIHdlIG11c3QgYnVpbGQgdGhlIHRhcmdldCBzdHJpbmcgaW4gYSBsb29wIGFzIFV0aWxzLnJlcGxhZQorICAgICAqICBjYW5ub3QgaGFuZGxlIGJvdGggXCIgYW5kICIgd2l0aG91dCBhIGxvdCBvZiBtZXNzaW5nIGFyb3VuZC4KKyAgICAgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFN0cmluZ0xpdGVyYWxGcm9tQU5UTFJTdHJpbmdMaXRlcmFsKAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciwKKwkJU3RyaW5nIGxpdGVyYWwpCisJeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGlzID0gbmV3IFN0cmluZ0J1ZmZlcihsaXRlcmFsKTsKKyAgICAgICAgCisgICAgICAgIC8vIE9wZW5pbmcgcXVvdGUKKyAgICAgICAgLy8KKyAgICAgICAgc2IuYXBwZW5kKCciJyk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGlzLmxlbmd0aCgpIC0xOyBpKyspIHsKKyAgICAgICAgICAgIGlmICAoaXMuY2hhckF0KGkpID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAvLyBBbnl0aGluZyBlc2NhcGVkIGlzIHdoYXQgaXQgaXMhIFdlIGFzc3VtZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gcGVvcGxlIGtub3cgaG93IHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGNvcnJlY3RseS4gSG93ZXZlcgorICAgICAgICAgICAgICAgIC8vIHdlIGNhdGNoIGFueXRoaW5nIHRoYXQgZG9lcyBub3QgbmVlZCBhbiBlc2NhcGUgaW4gSmF2YSAod2hpY2gKKyAgICAgICAgICAgICAgICAvLyBpcyB3aGF0IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlYWxpbmcgd2l0aCBhbmQgcmVtb3ZlIAorICAgICAgICAgICAgICAgIC8vIHRoZSBlc2NhcGUuIFRoZSBDIHRhcmdldCBkb2VzIHRoaXMgZm9yIGluc3RhbmNlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgc3dpdGNoIChpcy5jaGFyQXQoaSsxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHRocm91Z2ggYW55IGVzY2FwZXMgdGhhdCBKYXZhIGFsc28gbmVlZHMKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAgICAnIic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgICAgJ24nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICAgICdyJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAgICAndCc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgICAgJ2InOgorICAgICAgICAgICAgICAgICAgICBjYXNlICAgICdmJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAgICAnXFwnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICAgICd1JzogICAgLy8gQXNzdW1lIHVubm5uCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xcJyk7ICAgIC8vIFBhc3MgdGhlIGVzY2FwZSB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZXNjYXBlIGJ5IHZpcnR1ZSBvZiBub3QgYWRkaW5nIGl0IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRodXMgXCcgYmVjb21lcyAnIGFuZCBzbyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBHbyBwYXN0IHRoZSBcIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBDaHJhY3RlcnMgdGhhdCBkb24ndCBuZWVkIFwgaW4gQU5UTFIgJ3N0cmluZ3MnIGJ1dCBkbyBpbiBKYXZhCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAoaXMuY2hhckF0KGkpID09ICciJykgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGVzY2FwZSAiIGluIEphdmEKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCBpbiB0aGUgbmV4dCBjaGFyYWN0ZXIsIHdoaWNoIG1heSBoYXZlIGJlZW4gZXNjYXBlZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNiLmFwcGVuZChpcy5jaGFyQXQoaSkpOyAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBBcHBlbmQgY2xvc2luZyAiIGFuZCByZXR1cm4KKyAgICAgICAgLy8KKyAgICAgICAgc2IuYXBwZW5kKCciJyk7CisgICAgICAgIAorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogR2l2ZW4gYSByYW5kb20gc3RyaW5nIG9mIEphdmEgdW5pY29kZSBjaGFycywgcmV0dXJuIGEgbmV3IHN0cmluZyB3aXRoCisJICogIG9wdGlvbmFsbHkgYXBwcm9wcmlhdGUgcXVvdGUgY2hhcmFjdGVycyBmb3IgdGFyZ2V0IGxhbmd1YWdlIGFuZCBwb3NzaWJseQorCSAqICB3aXRoIHNvbWUgZXNjYXBlZCBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBpbmNvbWluZyBzdHJpbmcgaGFzCisJICogIGFjdHVhbCBuZXdsaW5lIGNoYXJhY3RlcnMsIHRoZSBvdXRwdXQgb2YgdGhpcyBtZXRob2Qgd291bGQgY29udmVydCB0aGVtCisJICogIHRvIHRoZSB0d28gY2hhciBzZXF1ZW5jZSBcbiBmb3IgSmF2YSwgQywgQysrLCAuLi4gIFRoZSBuZXcgc3RyaW5nIGhhcworCSAqICBkb3VibGUtcXVvdGVzIGFyb3VuZCBpdCBhcyB3ZWxsLiAgRXhhbXBsZSBTdHJpbmcgaW4gbWVtb3J5OgorCSAqCisJICogICAgIGEiW25ld2xpbmVjaGFyXWInY1tjYXJyaWFnZXJldHVybmNoYXJdZFt0YWJdZVxmCisJICoKKwkgKiAgd291bGQgYmUgY29udmVydGVkIHRvIHRoZSB2YWxpZCBKYXZhIHM6CisJICoKKwkgKiAgICAgImFcIlxuYidjXHJkXHRlXFxmIgorCSAqCisJICogIG9yCisJICoKKwkgKiAgICAgYVwiXG5iJ2NccmRcdGVcXGYKKwkgKgorCSAqICBkZXBlbmRpbmcgb24gdGhlIHF1b3RlZCBhcmcuCisJICovCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhTdHJpbmcgcywgYm9vbGVhbiBxdW90ZWQpIHsKKwkJaWYgKCBzPT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpZiAoIHF1b3RlZCApIHsKKwkJCWJ1Zi5hcHBlbmQoJyInKTsKKwkJfQorCQlmb3IgKGludCBpPTA7IGk8cy5sZW5ndGgoKTsgaSsrKSB7CisJCQlpbnQgYyA9IHMuY2hhckF0KGkpOworCQkJaWYgKCBjIT0nXCcnICYmIC8vIGRvbid0IGVzY2FwZSBzaW5nbGUgcXVvdGVzIGluIHN0cmluZ3MgZm9yIGphdmEKKwkJCQkgYzx0YXJnZXRDaGFyVmFsdWVFc2NhcGUubGVuZ3RoICYmCisJCQkJIHRhcmdldENoYXJWYWx1ZUVzY2FwZVtjXSE9bnVsbCApCisJCQl7CisJCQkJYnVmLmFwcGVuZCh0YXJnZXRDaGFyVmFsdWVFc2NhcGVbY10pOworCQkJfQorCQkJZWxzZSB7CisJCQkJYnVmLmFwcGVuZCgoY2hhciljKTsKKwkJCX0KKwkJfQorCQlpZiAoIHF1b3RlZCApIHsKKwkJCWJ1Zi5hcHBlbmQoJyInKTsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXRTdHJpbmdMaXRlcmFsRnJvbVN0cmluZyhTdHJpbmcgcykgeworCQlyZXR1cm4gZ2V0VGFyZ2V0U3RyaW5nTGl0ZXJhbEZyb21TdHJpbmcocywgZmFsc2UpOworCX0KKworCS8qKiBDb252ZXJ0IGxvbmcgdG8gMHhOTk5OTk5OTk5OTk5OTk5OIGJ5IGRlZmF1bHQgZm9yIHNwaXR0aW5nIG91dAorCSAqICB3aXRoIGJpdHNldHMuICBJLmUuLCBjb252ZXJ0IGJ5dGVzIHRvIGhleCBzdHJpbmcuCisJICovCisJcHVibGljIFN0cmluZyBnZXRUYXJnZXQ2NEJpdFN0cmluZ0Zyb21WYWx1ZShsb25nIHdvcmQpIHsKKwkJaW50IG51bUhleERpZ2l0cyA9IDgqMjsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobnVtSGV4RGlnaXRzKzIpOworCQlidWYuYXBwZW5kKCIweCIpOworCQlTdHJpbmcgZGlnaXRzID0gTG9uZy50b0hleFN0cmluZyh3b3JkKTsKKwkJZGlnaXRzID0gZGlnaXRzLnRvVXBwZXJDYXNlKCk7CisJCWludCBwYWRkaW5nID0gbnVtSGV4RGlnaXRzIC0gZGlnaXRzLmxlbmd0aCgpOworCQkvLyBwYWQgbGVmdCB3aXRoIHplcm9zCisJCWZvciAoaW50IGk9MTsgaTw9cGFkZGluZzsgaSsrKSB7CisJCQlidWYuYXBwZW5kKCcwJyk7CisJCX0KKwkJYnVmLmFwcGVuZChkaWdpdHMpOworCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFN0cmluZyBlbmNvZGVJbnRBc0NoYXJFc2NhcGUoaW50IHYpIHsKKwkJaWYgKCB2PD0xMjcgKSB7CisJCQlyZXR1cm4gIlxcIitJbnRlZ2VyLnRvT2N0YWxTdHJpbmcodik7CisJCX0KKwkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcodnwweDEwMDAwKS5zdWJzdHJpbmcoMSw1KTsKKwkJcmV0dXJuICJcXHUiK2hleDsKKwl9CisKKwkvKiogU29tZSB0YXJnZXRzIG9ubHkgc3VwcG9ydCBBU0NJSSBvciA4LWJpdCBjaGFycy9zdHJpbmdzLiAgRm9yIGV4YW1wbGUsCisJICogIEMrKyB3aWxsIHByb2JhYmx5IHdhbnQgdG8gcmV0dXJuIDB4RkYgaGVyZS4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heENoYXJWYWx1ZShDb2RlR2VuZXJhdG9yIGdlbmVyYXRvcikgeworCQlyZXR1cm4gTGFiZWwuTUFYX0NIQVJfVkFMVUU7CisJfQorCisJLyoqIEdpdmUgdGFyZ2V0IGEgY2hhbmNlIHRvIGRvIHNvbWUgcG9zdHByb2Nlc3Npbmcgb24gYWN0aW9ucy4KKwkgKiAgUHl0aG9uIGZvciBleGFtcGxlIHdpbGwgaGF2ZSB0byBmaXggdGhlIGluZGVudGlvbi4KKwkgKi8KKwlwdWJsaWMgTGlzdCBwb3N0UHJvY2Vzc0FjdGlvbihMaXN0IGNodW5rcywgVG9rZW4gYWN0aW9uVG9rZW4pIHsKKwkJcmV0dXJuIGNodW5rczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvQmFycmllci5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9CYXJyaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlOGVjNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvQmFycmllci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIubWlzYzsKKworLyoqQSB2ZXJ5IHNpbXBsZSBiYXJyaWVyIHdhaXQuICBPbmNlIGEgdGhyZWFkIGhhcyByZXF1ZXN0ZWQgYQorICogd2FpdCBvbiB0aGUgYmFycmllciB3aXRoIHdhaXRGb3JSZWxlYXNlLCBpdCBjYW5ub3QgZm9vbCB0aGUKKyAqIGJhcnJpZXIgaW50byByZWxlYXNpbmcgYnkgImhpdHRpbmciIHRoZSBiYXJyaWVyIG11bHRpcGxlIHRpbWVzLS0KKyAqIHRoZSB0aHJlYWQgaXMgYmxvY2tlZCBvbiB0aGUgd2FpdCgpLgorICovCitwdWJsaWMgY2xhc3MgQmFycmllciB7CisgICAgcHJvdGVjdGVkIGludCB0aHJlc2hvbGQ7CisgICAgcHJvdGVjdGVkIGludCBjb3VudCA9IDA7CisKKyAgICBwdWJsaWMgQmFycmllcihpbnQgdCkgeworICAgICAgICB0aHJlc2hvbGQgPSB0OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3YWl0Rm9yUmVsZWFzZSgpCisgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgLy8gVGhlIGZpbmFsIHRocmVhZCB0byByZWFjaCBiYXJyaWVyIHJlc2V0cyBiYXJyaWVyIGFuZAorICAgICAgICAvLyByZWxlYXNlcyBhbGwgdGhyZWFkcworICAgICAgICBpZiAoIGNvdW50PT10aHJlc2hvbGQgKSB7CisgICAgICAgICAgICAvLyBub3RpZnkgYmxvY2tlZCB0aHJlYWRzIHRoYXQgdGhyZXNob2xkIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgICAgICAgIGFjdGlvbigpOyAvLyBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uCisgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHdoaWxlICggY291bnQ8dGhyZXNob2xkICkgeworICAgICAgICAgICAgd2FpdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFdoYXQgdG8gZG8gd2hlbiBldmVyeW9uZSByZWFjaGVzIGJhcnJpZXIgKi8KKyAgICBwdWJsaWMgdm9pZCBhY3Rpb24oKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9CaXRTZXQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvQml0U2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyOTI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvQml0U2V0LmphdmEKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIubWlzYzsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5MYWJlbDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKkEgQml0U2V0IHRvIHJlcGxhY2UgamF2YS51dGlsLkJpdFNldC4KKyAqCisgKiBQcmltYXJ5IGRpZmZlcmVuY2VzIGFyZSB0aGF0IG1vc3Qgc2V0IG9wZXJhdG9ycyByZXR1cm4gbmV3IHNldHMKKyAqIGFzIG9wcG9zZWQgdG8gb3JpbmcgYW5kIGFuZGluZyAiaW4gcGxhY2UiLiAgRnVydGhlciwgYSBudW1iZXIgb2YKKyAqIG9wZXJhdGlvbnMgd2VyZSBhZGRlZC4gIEkgY2Fubm90IGNvbnRhaW4gYSBCaXRTZXQgYmVjYXVzZSB0aGVyZQorICogaXMgbm8gd2F5IHRvIGFjY2VzcyB0aGUgaW50ZXJuYWwgYml0cyAod2hpY2ggSSBuZWVkIGZvciBzcGVlZCkKKyAqIGFuZCwgYmVjYXVzZSBpdCBpcyBmaW5hbCwgSSBjYW5ub3Qgc3ViY2xhc3MgdG8gYWRkIGZ1bmN0aW9uYWxpdHkuCisgKiBDb25zaWRlciBkZWZpbmluZyBzZXQgZGVncmVlLiAgV2l0aG91dCBhY2Nlc3MgdG8gdGhlIGJpdHMsIEkgbXVzdAorICogY2FsbCBhIG1ldGhvZCBuIHRpbWVzIHRvIHRlc3QgdGhlIGl0aCBiaXQuLi5hY2shCisgKgorICogQWxzbyBzZWVtcyBsaWtlIG9yKCkgZnJvbSB1dGlsIGlzIHdyb25nIHdoZW4gc2l6ZSBvZiBpbmNvbWluZyBzZXQgaXMgYmlnZ2VyCisgKiB0aGFuIHRoaXMuYml0cy5sZW5ndGguCisgKgorICogQGF1dGhvciBUZXJlbmNlIFBhcnIKKyAqLworcHVibGljIGNsYXNzIEJpdFNldCBpbXBsZW1lbnRzIEludFNldCwgQ2xvbmVhYmxlIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBCSVRTID0gNjQ7ICAgIC8vIG51bWJlciBvZiBiaXRzIC8gbG9uZworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IExPR19CSVRTID0gNjsgLy8gMl42ID09IDY0CisKKyAgICAvKiBXZSB3aWxsIG9mdGVuIG5lZWQgdG8gZG8gYSBtb2Qgb3BlcmF0b3IgKGkgbW9kIG5iaXRzKS4gIEl0cworICAgICAqIHR1cm5zIG91dCB0aGF0LCBmb3IgcG93ZXJzIG9mIHR3bywgdGhpcyBtb2Qgb3BlcmF0aW9uIGlzCisgICAgICogc2FtZSBhcyAoaSAmIChuYml0cy0xKSkuICBTaW5jZSBtb2QgaXMgc2xvdywgd2UgdXNlIGEKKyAgICAgKiBwcmVjb21wdXRlZCBtb2QgbWFzayB0byBkbyB0aGUgbW9kIGluc3RlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgTU9EX01BU0sgPSBCSVRTIC0gMTsKKworICAgIC8qKiBUaGUgYWN0dWFsIGRhdGEgYml0cyAqLworICAgIHByb3RlY3RlZCBsb25nIGJpdHNbXTsKKworICAgIC8qKiBDb25zdHJ1Y3QgYSBiaXRzZXQgb2Ygc2l6ZSBvbmUgd29yZCAoNjQgYml0cykgKi8KKyAgICBwdWJsaWMgQml0U2V0KCkgeworICAgICAgICB0aGlzKEJJVFMpOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3Rpb24gZnJvbSBhIHN0YXRpYyBhcnJheSBvZiBsb25ncyAqLworICAgIHB1YmxpYyBCaXRTZXQobG9uZ1tdIGJpdHNfKSB7CisgICAgICAgIGJpdHMgPSBiaXRzXzsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0IGEgYml0c2V0IGdpdmVuIHRoZSBzaXplCisgICAgICogQHBhcmFtIG5iaXRzIFRoZSBzaXplIG9mIHRoZSBiaXRzZXQgaW4gYml0cworICAgICAqLworICAgIHB1YmxpYyBCaXRTZXQoaW50IG5iaXRzKSB7CisgICAgICAgIGJpdHMgPSBuZXcgbG9uZ1soKG5iaXRzIC0gMSkgPj4gTE9HX0JJVFMpICsgMV07CisgICAgfQorCisgICAgLyoqIG9yIHRoaXMgZWxlbWVudCBpbnRvIHRoaXMgc2V0IChncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSkgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGVsKSB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQoIitlbCsiKSIpOworICAgICAgICBpbnQgbiA9IHdvcmROdW1iZXIoZWwpOworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigid29yZCBudW1iZXIgaXMgIituKTsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImJpdHMubGVuZ3RoICIrYml0cy5sZW5ndGgpOworICAgICAgICBpZiAobiA+PSBiaXRzLmxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1RvSW5jbHVkZShlbCk7CisgICAgICAgIH0KKyAgICAgICAgYml0c1tuXSB8PSBiaXRNYXNrKGVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoSW50U2V0IHNldCkgeworICAgICAgICBpZiAoIHNldCBpbnN0YW5jZW9mIEJpdFNldCApIHsKKyAgICAgICAgICAgIHRoaXMub3JJblBsYWNlKChCaXRTZXQpc2V0KTsKKyAgICAgICAgfQorCQllbHNlIGlmICggc2V0IGluc3RhbmNlb2YgSW50ZXJ2YWxTZXQgKSB7CisJCQlJbnRlcnZhbFNldCBvdGhlciA9IChJbnRlcnZhbFNldClzZXQ7CisJCQkvLyB3YWxrIHNldCBhbmQgYWRkIGVhY2ggaW50ZXJ2YWwKKwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG90aGVyLmludGVydmFscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCQlJbnRlcnZhbCBJID0gKEludGVydmFsKSBpdGVyLm5leHQoKTsKKwkJCQl0aGlzLm9ySW5QbGFjZShCaXRTZXQucmFuZ2UoSS5hLEkuYikpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuJ3QgYWRkICIrCisJCQkJCQkJCQkJCSAgIHNldC5nZXRDbGFzcygpLmdldE5hbWUoKSsKKwkJCQkJCQkJCQkJICAgIiB0byBCaXRTZXQiKTsKKwkJfQorICAgIH0KKworCXB1YmxpYyB2b2lkIGFkZEFsbChpbnRbXSBlbGVtZW50cykgeworCQlpZiAoIGVsZW1lbnRzPT1udWxsICkgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWludCBlID0gZWxlbWVudHNbaV07CisJCQlhZGQoZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRBbGwoSXRlcmFibGUgZWxlbWVudHMpIHsKKwkJaWYgKCBlbGVtZW50cz09bnVsbCApIHsKKwkJCXJldHVybjsKKwkJfQorCQlJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBvID0gKE9iamVjdCkgaXQubmV4dCgpOworCQkJaWYgKCAhKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSApIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCQlJbnRlZ2VyIGVJID0gKEludGVnZXIpbzsKKwkJCWFkZChlSS5pbnRWYWx1ZSgpKTsKKwkJfQorCQkvKgorCQlpbnQgbiA9IGVsZW1lbnRzLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCU9iamVjdCBvID0gZWxlbWVudHMuZ2V0KGkpOworCQkJaWYgKCAhKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSApIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCQl9CisJCQlJbnRlZ2VyIGVJID0gKEludGVnZXIpbzsKKwkJCWFkZChlSS5pbnRWYWx1ZSgpKTsKKwkJfQorCQkgKi8KKwl9CisKKyAgICBwdWJsaWMgSW50U2V0IGFuZChJbnRTZXQgYSkgeworICAgICAgICBCaXRTZXQgcyA9IChCaXRTZXQpdGhpcy5jbG9uZSgpOworICAgICAgICBzLmFuZEluUGxhY2UoKEJpdFNldClhKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5kSW5QbGFjZShCaXRTZXQgYSkgeworICAgICAgICBpbnQgbWluID0gTWF0aC5taW4oYml0cy5sZW5ndGgsIGEuYml0cy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gbWluIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGJpdHNbaV0gJj0gYS5iaXRzW2ldOworICAgICAgICB9CisgICAgICAgIC8vIGNsZWFyIGFsbCBiaXRzIGluIHRoaXMgbm90IHByZXNlbnQgaW4gYSAoaWYgdGhpcyBiaWdnZXIgdGhhbiBhKS4KKyAgICAgICAgZm9yIChpbnQgaSA9IG1pbjsgaSA8IGJpdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJpdHNbaV0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBiaXRNYXNrKGludCBiaXROdW1iZXIpIHsKKyAgICAgICAgaW50IGJpdFBvc2l0aW9uID0gYml0TnVtYmVyICYgTU9EX01BU0s7IC8vIGJpdE51bWJlciBtb2QgQklUUworICAgICAgICByZXR1cm4gMUwgPDwgYml0UG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBiaXRzW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKGludCBlbCkgeworICAgICAgICBpbnQgbiA9IHdvcmROdW1iZXIoZWwpOworICAgICAgICBpZiAobiA+PSBiaXRzLmxlbmd0aCkgewkvLyBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZQorICAgICAgICAgICAgZ3Jvd1RvSW5jbHVkZShlbCk7CisgICAgICAgIH0KKyAgICAgICAgYml0c1tuXSAmPSB+Yml0TWFzayhlbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgQml0U2V0IHM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzID0gKEJpdFNldClzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgcy5iaXRzID0gbmV3IGxvbmdbYml0cy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiaXRzLCAwLCBzLmJpdHMsIDAsIGJpdHMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGludCBkZWcgPSAwOworICAgICAgICBmb3IgKGludCBpID0gYml0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbG9uZyB3b3JkID0gYml0c1tpXTsKKyAgICAgICAgICAgIGlmICh3b3JkICE9IDBMKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgYml0ID0gQklUUyAtIDE7IGJpdCA+PSAwOyBiaXQtLSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHdvcmQgJiAoMUwgPDwgYml0KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVnKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmICggb3RoZXIgPT0gbnVsbCB8fCAhKG90aGVyIGluc3RhbmNlb2YgQml0U2V0KSApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEJpdFNldCBvdGhlclNldCA9IChCaXRTZXQpb3RoZXI7CisKKyAgICAgICAgaW50IG4gPSBNYXRoLm1pbih0aGlzLmJpdHMubGVuZ3RoLCBvdGhlclNldC5iaXRzLmxlbmd0aCk7CisKKyAgICAgICAgLy8gZm9yIGFueSBiaXRzIGluIGNvbW1vbiwgY29tcGFyZQorICAgICAgICBmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhpcy5iaXRzW2ldICE9IG90aGVyU2V0LmJpdHNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgYW55IGV4dHJhIGJpdHMgYXJlIG9mZgorCisgICAgICAgIGlmICh0aGlzLmJpdHMubGVuZ3RoID4gbikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG4rMTsgaTx0aGlzLmJpdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5iaXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvdGhlclNldC5iaXRzLmxlbmd0aCA+IG4pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuKzE7IGk8b3RoZXJTZXQuYml0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChvdGhlclNldC5iaXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdyb3dzIHRoZSBzZXQgdG8gYSBsYXJnZXIgbnVtYmVyIG9mIGJpdHMuCisgICAgICogQHBhcmFtIGJpdCBlbGVtZW50IHRoYXQgbXVzdCBmaXQgaW4gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgZ3Jvd1RvSW5jbHVkZShpbnQgYml0KSB7CisgICAgICAgIGludCBuZXdTaXplID0gTWF0aC5tYXgoYml0cy5sZW5ndGggPDwgMSwgbnVtV29yZHNUb0hvbGQoYml0KSk7CisgICAgICAgIGxvbmcgbmV3Yml0c1tdID0gbmV3IGxvbmdbbmV3U2l6ZV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYml0cywgMCwgbmV3Yml0cywgMCwgYml0cy5sZW5ndGgpOworICAgICAgICBiaXRzID0gbmV3Yml0czsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtZW1iZXIoaW50IGVsKSB7CisgICAgICAgIGludCBuID0gd29yZE51bWJlcihlbCk7CisgICAgICAgIGlmIChuID49IGJpdHMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiAoYml0c1tuXSAmIGJpdE1hc2soZWwpKSAhPSAwOworICAgIH0KKworICAgIC8qKiBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgeW91IGZpbmQgYW5kIHJldHVybiBpdC4gIFJldHVybiBMYWJlbC5JTlZBTElECisgICAgICogIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpbmdsZUVsZW1lbnQoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGJpdHMubGVuZ3RoIDw8IExPR19CSVRTKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWVtYmVyKGkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIExhYmVsLklOVkFMSUQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOaWwoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAoYml0c1tpXSAhPSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIEludFNldCBjb21wbGVtZW50KCkgeworICAgICAgICBCaXRTZXQgcyA9IChCaXRTZXQpdGhpcy5jbG9uZSgpOworICAgICAgICBzLm5vdEluUGxhY2UoKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIEludFNldCBjb21wbGVtZW50KEludFNldCBzZXQpIHsKKwkJaWYgKCBzZXQ9PW51bGwgKSB7CisJCQlyZXR1cm4gdGhpcy5jb21wbGVtZW50KCk7CisJCX0KKyAgICAgICAgcmV0dXJuIHNldC5zdWJ0cmFjdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RJblBsYWNlKCkgeworICAgICAgICBmb3IgKGludCBpID0gYml0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYml0c1tpXSA9IH5iaXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIGNvbXBsZW1lbnQgYml0cyBpbiB0aGUgcmFuZ2UgMC4ubWF4Qml0LiAqLworICAgIHB1YmxpYyB2b2lkIG5vdEluUGxhY2UoaW50IG1heEJpdCkgeworICAgICAgICBub3RJblBsYWNlKDAsIG1heEJpdCk7CisgICAgfQorCisgICAgLyoqIGNvbXBsZW1lbnQgYml0cyBpbiB0aGUgcmFuZ2UgbWluQml0Li5tYXhCaXQuKi8KKyAgICBwdWJsaWMgdm9pZCBub3RJblBsYWNlKGludCBtaW5CaXQsIGludCBtYXhCaXQpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByb29tIGZvciBtYXhCaXQKKyAgICAgICAgZ3Jvd1RvSW5jbHVkZShtYXhCaXQpOworICAgICAgICBmb3IgKGludCBpID0gbWluQml0OyBpIDw9IG1heEJpdDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbiA9IHdvcmROdW1iZXIoaSk7CisgICAgICAgICAgICBiaXRzW25dIF49IGJpdE1hc2soaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBudW1Xb3Jkc1RvSG9sZChpbnQgZWwpIHsKKyAgICAgICAgcmV0dXJuIChlbCA+PiBMT0dfQklUUykgKyAxOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IG9mKGludCBlbCkgeworICAgICAgICBCaXRTZXQgcyA9IG5ldyBCaXRTZXQoZWwgKyAxKTsKKyAgICAgICAgcy5hZGQoZWwpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJpdFNldCBvZihDb2xsZWN0aW9uIGVsZW1lbnRzKSB7CisgICAgICAgIEJpdFNldCBzID0gbmV3IEJpdFNldCgpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJbnRlZ2VyIGVsID0gKEludGVnZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgcy5hZGQoZWwuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisJcHVibGljIHN0YXRpYyBCaXRTZXQgb2YoSW50U2V0IHNldCkgeworCQlpZiAoIHNldD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJaWYgKCBzZXQgaW5zdGFuY2VvZiBCaXRTZXQgKSB7CisJCQlyZXR1cm4gKEJpdFNldClzZXQ7CisJCX0KKwkJaWYgKCBzZXQgaW5zdGFuY2VvZiBJbnRlcnZhbFNldCApIHsKKwkJCUJpdFNldCBzID0gbmV3IEJpdFNldCgpOworCQkJcy5hZGRBbGwoc2V0KTsKKwkJCXJldHVybiBzOworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGNyZWF0ZSBCaXRTZXQgZnJvbSAiK3NldC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJfQorCisgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgb2YoTWFwIGVsZW1lbnRzKSB7CisgICAgICAgIHJldHVybiBCaXRTZXQub2YoZWxlbWVudHMua2V5U2V0KCkpOworICAgIH0KKworCXB1YmxpYyBzdGF0aWMgQml0U2V0IHJhbmdlKGludCBhLCBpbnQgYikgeworCQlCaXRTZXQgcyA9IG5ldyBCaXRTZXQoYiArIDEpOworCQlmb3IgKGludCBpID0gYTsgaSA8PSBiOyBpKyspIHsKKwkJCWludCBuID0gd29yZE51bWJlcihpKTsKKwkJCXMuYml0c1tuXSB8PSBiaXRNYXNrKGkpOworCQl9CisJCXJldHVybiBzOworCX0KKworICAgIC8qKiByZXR1cm4gdGhpcyB8IGEgaW4gYSBuZXcgc2V0ICovCisgICAgcHVibGljIEludFNldCBvcihJbnRTZXQgYSkgeworCQlpZiAoIGE9PW51bGwgKSB7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorICAgICAgICBCaXRTZXQgcyA9IChCaXRTZXQpdGhpcy5jbG9uZSgpOworICAgICAgICBzLm9ySW5QbGFjZSgoQml0U2V0KWEpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvckluUGxhY2UoQml0U2V0IGEpIHsKKwkJaWYgKCBhPT1udWxsICkgeworCQkJcmV0dXJuOworCQl9CisgICAgICAgIC8vIElmIHRoaXMgaXMgc21hbGxlciB0aGFuIGEsIGdyb3cgdGhpcyBmaXJzdAorICAgICAgICBpZiAoYS5iaXRzLmxlbmd0aCA+IGJpdHMubGVuZ3RoKSB7CisgICAgICAgICAgICBzZXRTaXplKGEuYml0cy5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGludCBtaW4gPSBNYXRoLm1pbihiaXRzLmxlbmd0aCwgYS5iaXRzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSBtaW4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYml0c1tpXSB8PSBhLmJpdHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZW1vdmUgdGhpcyBlbGVtZW50IGZyb20gdGhpcyBzZXQKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoaW50IGVsKSB7CisgICAgICAgIGludCBuID0gd29yZE51bWJlcihlbCk7CisgICAgICAgIGlmIChuID49IGJpdHMubGVuZ3RoKSB7CisgICAgICAgICAgICBncm93VG9JbmNsdWRlKGVsKTsKKyAgICAgICAgfQorICAgICAgICBiaXRzW25dICY9IH5iaXRNYXNrKGVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzaXplIG9mIGEgc2V0LgorICAgICAqIEBwYXJhbSBud29yZHMgaG93IG1hbnkgd29yZHMgdGhlIG5ldyBzZXQgc2hvdWxkIGJlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFNpemUoaW50IG53b3JkcykgeworICAgICAgICBsb25nIG5ld2JpdHNbXSA9IG5ldyBsb25nW253b3Jkc107CisgICAgICAgIGludCBuID0gTWF0aC5taW4obndvcmRzLCBiaXRzLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYml0cywgMCwgbmV3Yml0cywgMCwgbik7CisgICAgICAgIGJpdHMgPSBuZXdiaXRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgbnVtQml0cygpIHsKKyAgICAgICAgcmV0dXJuIGJpdHMubGVuZ3RoIDw8IExPR19CSVRTOyAvLyBudW0gd29yZHMgKiBiaXRzIHBlciB3b3JkCisgICAgfQorCisgICAgLyoqIHJldHVybiBob3cgbXVjaCBzcGFjZSBpcyBiZWluZyB1c2VkIGJ5IHRoZSBiaXRzIGFycmF5IG5vdAorICAgICAqICBob3cgbWFueSBhY3R1YWxseSBoYXZlIG1lbWJlciBiaXRzIG9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbGVuZ3RoSW5Mb25nV29yZHMoKSB7CisgICAgICAgIHJldHVybiBiaXRzLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKipJcyB0aGlzIGNvbnRhaW5lZCB3aXRoaW4gYT8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdWJzZXQoQml0U2V0IGEpIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5hbmQoYSkuZXF1YWxzKHRoaXMpOworICAgIH0KKworICAgIC8qKlN1YnRyYWN0IHRoZSBlbGVtZW50cyBvZiAnYScgZnJvbSAndGhpcycgaW4tcGxhY2UuCisgICAgICogQmFzaWNhbGx5LCBqdXN0IHR1cm4gb2ZmIGFsbCBiaXRzIG9mICd0aGlzJyB0aGF0IGFyZSBpbiAnYScuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3VidHJhY3RJblBsYWNlKEJpdFNldCBhKSB7CisgICAgICAgIGlmIChhID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gZm9yIGFsbCB3b3JkcyBvZiAnYScsIHR1cm4gb2ZmIGNvcnJlc3BvbmRpbmcgYml0cyBvZiAndGhpcycKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aCAmJiBpIDwgYS5iaXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBiaXRzW2ldICY9IH5hLmJpdHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSW50U2V0IHN1YnRyYWN0KEludFNldCBhKSB7CisgICAgICAgIGlmIChhID09IG51bGwgfHwgIShhIGluc3RhbmNlb2YgQml0U2V0KSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQml0U2V0IHMgPSAoQml0U2V0KXRoaXMuY2xvbmUoKTsKKyAgICAgICAgcy5zdWJ0cmFjdEluUGxhY2UoKEJpdFNldClhKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisJcHVibGljIExpc3QgdG9MaXN0KCkgeworCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXJyb3IoIkJpdFNldC50b0xpc3QoKSB1bmltcGxlbWVudGVkIik7CisJfQorCisgICAgcHVibGljIGludFtdIHRvQXJyYXkoKSB7CisgICAgICAgIGludFtdIGVsZW1zID0gbmV3IGludFtzaXplKCldOworICAgICAgICBpbnQgZW4gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChiaXRzLmxlbmd0aCA8PCBMT0dfQklUUyk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1lbWJlcihpKSkgeworICAgICAgICAgICAgICAgIGVsZW1zW2VuKytdID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWxlbXM7CisgICAgfQorCisgICAgcHVibGljIGxvbmdbXSB0b1BhY2tlZEFycmF5KCkgeworICAgICAgICByZXR1cm4gYml0czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcobnVsbCk7CisgICAgfQorCisgICAgLyoqIFRyYW5zZm9ybSBhIGJpdCBzZXQgaW50byBhIHN0cmluZyBieSBmb3JtYXR0aW5nIGVhY2ggZWxlbWVudCBhcyBhbiBpbnRlZ2VyCisgICAgICogc2VwYXJhdG9yIFRoZSBzdHJpbmcgdG8gcHV0IGluIGJldHdlZW4gZWxlbWVudHMKKyAgICAgKiBAcmV0dXJuIEEgY29tbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoR3JhbW1hciBnKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSAiLCI7CisJCWJvb2xlYW4gaGF2ZVByaW50ZWRBbkVsZW1lbnQgPSBmYWxzZTsKKwkJYnVmLmFwcGVuZCgneycpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGJpdHMubGVuZ3RoIDw8IExPR19CSVRTKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWVtYmVyKGkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIGhhdmVQcmludGVkQW5FbGVtZW50ICkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggZyE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChnLmdldFRva2VuRGlzcGxheU5hbWUoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJaGF2ZVByaW50ZWRBbkVsZW1lbnQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisJCWJ1Zi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKkNyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGVyZSBpbnN0ZWFkIG9mIGludGVnZXIgZWxlbWVudHMsIHRoZQorICAgICAqIGl0aCBlbGVtZW50IG9mIHZvY2FidWxhcnkgaXMgZGlzcGxheWVkIGluc3RlYWQuICBWb2NhYnVsYXJ5IGlzIGEgVmVjdG9yCisgICAgICogb2YgU3RyaW5ncy4KKyAgICAgKiBzZXBhcmF0b3IgVGhlIHN0cmluZyB0byBwdXQgaW4gYmV0d2VlbiBlbGVtZW50cworICAgICAqIEByZXR1cm4gQSBjb21tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBzZXBhcmF0b3IsIExpc3Qgdm9jYWJ1bGFyeSkgeworICAgICAgICBpZiAodm9jYWJ1bGFyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHN0ciA9ICIiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChiaXRzLmxlbmd0aCA8PCBMT0dfQklUUyk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1lbWJlcihpKSkgeworICAgICAgICAgICAgICAgIGlmIChzdHIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSBzZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID49IHZvY2FidWxhcnkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSAiJyIgKyAoY2hhcilpICsgIiciOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh2b2NhYnVsYXJ5LmdldChpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSAiJyIgKyAoY2hhcilpICsgIiciOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyICs9IChTdHJpbmcpdm9jYWJ1bGFyeS5nZXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB3b3JkcyBtYWtpbmcgdXAgdGhlIGJpdCBzZXQuCisgICAgICogU3BsaXQgZWFjaCA2NCBiaXQgbnVtYmVyIGludG8gdHdvIG1vcmUgbWFuYWdlYWJsZSAzMiBiaXQgbnVtYmVycy4KKyAgICAgKiBUaGlzIGdlbmVyYXRlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIEMrKy1saWtlIHVuc2lnbmVkIGxvbmcgY29uc3RhbnRzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdPZkhhbGZXb3JkcygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkgcy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBsb25nIHRtcCA9IGJpdHNbaV07CisgICAgICAgICAgICB0bXAgJj0gMHhGRkZGRkZGRkw7CisgICAgICAgICAgICBzLmFwcGVuZCh0bXApOworCQkJcy5hcHBlbmQoIlVMIik7CisgICAgICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHRtcCA9IGJpdHNbaV0gPj4+IDMyOworICAgICAgICAgICAgdG1wICY9IDB4RkZGRkZGRkZMOworCQkJcy5hcHBlbmQodG1wKTsKKwkJCXMuYXBwZW5kKCJVTCIpOworICAgICAgICB9CisJCXJldHVybiBzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHVtcCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB3b3JkcyBtYWtpbmcgdXAgdGhlIGJpdCBzZXQuCisgICAgICogVGhpcyBnZW5lcmF0ZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBKYXZhLWxpa2UgbG9uZyBpbnQgY29uc3RhbnRzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdPZldvcmRzKCkgeworCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSBzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHMuYXBwZW5kKGJpdHNbaV0pOworCQkJcy5hcHBlbmQoIkwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdXaXRoUmFuZ2VzKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgd29yZE51bWJlcihpbnQgYml0KSB7CisgICAgICAgIHJldHVybiBiaXQgPj4gTE9HX0JJVFM7IC8vIGJpdCAvIEJJVFMKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL0dyYXBoLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL0dyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5NjJlNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvR3JhcGguamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5taXNjOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBBIGdlbmVyaWMgZ3JhcGggd2l0aCBlZGdlczsgRWFjaCBub2RlIGFzIGEgc2luZ2xlIE9iamVjdCBwYXlsb2FkLgorICogIFRoaXMgaXMgb25seSB1c2VkIHRvIHRvcG9sb2dpY2FsbHkgc29ydCBhIGxpc3Qgb2YgZmlsZSBkZXBlbmRlbmNpZXMKKyAqICBhdCB0aGUgbW9tZW50LgorICovCitwdWJsaWMgY2xhc3MgR3JhcGggeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlIHsKKyAgICAgICAgT2JqZWN0IHBheWxvYWQ7CisgICAgICAgIExpc3Q8Tm9kZT4gZWRnZXM7IC8vIHBvaW50cyBhdCB3aGljaCBub2Rlcz8KKworICAgICAgICBwdWJsaWMgTm9kZShPYmplY3QgcGF5bG9hZCkgeyB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkRWRnZShOb2RlIG4pIHsKKyAgICAgICAgICAgIGlmICggZWRnZXM9PW51bGwgKSBlZGdlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIGlmICggIWVkZ2VzLmNvbnRhaW5zKG4pICkgZWRnZXMuYWRkKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoKTsgfQorICAgIH0KKworICAgIC8qKiBNYXAgZnJvbSBub2RlIHBheWxvYWQgdG8gbm9kZSBjb250YWluaW5nIGl0ICovCisgICAgcHJvdGVjdGVkIE1hcDxPYmplY3QsTm9kZT4gbm9kZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsTm9kZT4oKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZEVkZ2UoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgZWRnZSAiK2ErIiB0byAiK2IpOworICAgICAgICBOb2RlIGFfbm9kZSA9IGdldE5vZGUoYSk7CisgICAgICAgIE5vZGUgYl9ub2RlID0gZ2V0Tm9kZShiKTsKKyAgICAgICAgYV9ub2RlLmFkZEVkZ2UoYl9ub2RlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTm9kZSBnZXROb2RlKE9iamVjdCBhKSB7CisgICAgICAgIE5vZGUgZXhpc3RpbmcgPSBub2Rlcy5nZXQoYSk7CisgICAgICAgIGlmICggZXhpc3RpbmchPW51bGwgKSByZXR1cm4gZXhpc3Rpbmc7CisgICAgICAgIE5vZGUgbiA9IG5ldyBOb2RlKGEpOworICAgICAgICBub2Rlcy5wdXQoYSwgbik7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKworICAgIC8qKiBERlMtYmFzZWQgdG9wb2xvZ2ljYWwgc29ydC4gIEEgdmFsaWQgc29ydCBpcyB0aGUgcmV2ZXJzZSBvZgorICAgICAqICB0aGUgcG9zdC1vcmRlciBERkEgdHJhdmVyc2FsLiAgQW1hemluZ2x5IHNpbXBsZSBidXQgdHJ1ZS4KKyAgICAgKiAgRm9yIHNvcnRpbmcsIEknbSBub3QgZm9sbG93aW5nIGNvbnZlbnRpb24gaGVyZSBzaW5jZSBBTlRMUgorICAgICAqICBuZWVkcyB0aGUgb3Bwb3NpdGUuICBIZXJlJ3Mgd2hhdCBJIGFzc3VtZSBmb3Igc29ydGluZzoKKyAgICAgKgorICAgICAqICAgIElmIHRoZXJlIGV4aXN0cyBhbiBlZGdlIHUgLT4gdiB0aGVuIHUgZGVwZW5kcyBvbiB2IGFuZCB2CisgICAgICogICAgbXVzdCBoYXBwZW4gYmVmb3JlIHUuCisgICAgICoKKyAgICAgKiAgU28gaWYgdGhpcyBnaXZlcyBub25yZXZlcnNlZCBwb3N0b3JkZXIgdHJhdmVyc2FsLCBJIGdldCB0aGUgb3JkZXIKKyAgICAgKiAgSSB3YW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gc29ydCgpIHsKKyAgICAgICAgU2V0PE5vZGU+IHZpc2l0ZWQgPSBuZXcgT3JkZXJlZEhhc2hTZXQ8Tm9kZT4oKTsKKyAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gc29ydGVkID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIHdoaWxlICggdmlzaXRlZC5zaXplKCkgPCBub2Rlcy5zaXplKCkgKSB7CisgICAgICAgICAgICAvLyBwaWNrIGFueSB1bnZpc2l0ZWQgbm9kZSwgbgorICAgICAgICAgICAgTm9kZSBuID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBub2Rlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgbiA9IChOb2RlKWl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoICF2aXNpdGVkLmNvbnRhaW5zKG4pICkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBERlMobiwgdmlzaXRlZCwgc29ydGVkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc29ydGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIERGUyhOb2RlIG4sIFNldDxOb2RlPiB2aXNpdGVkLCBBcnJheUxpc3Q8T2JqZWN0PiBzb3J0ZWQpIHsKKyAgICAgICAgaWYgKCB2aXNpdGVkLmNvbnRhaW5zKG4pICkgcmV0dXJuOworICAgICAgICB2aXNpdGVkLmFkZChuKTsKKyAgICAgICAgaWYgKCBuLmVkZ2VzIT1udWxsICkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG4uZWRnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE5vZGUgdGFyZ2V0ID0gKE5vZGUpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBERlModGFyZ2V0LCB2aXNpdGVkLCBzb3J0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNvcnRlZC5hZGQobi5wYXlsb2FkKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9JbnRBcnJheUxpc3QuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvSW50QXJyYXlMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzMTlkZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvSW50QXJyYXlMaXN0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIubWlzYzsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CisKKy8qKiBBbiBBcnJheUxpc3QgYmFzZWQgdXBvbiBpbnQgbWVtYmVycy4gIE5vdCBxdWl0ZSBhIHJlYWwgaW1wbGVtZW50YXRpb24gb2YgYQorICogIG1vZGlmaWFibGUgbGlzdCBhcyBJIGRvbid0IGRvLCBmb3IgZXhhbXBsZSwgYWRkKGluZGV4LGVsZW1lbnQpLgorICogIFRPRE86IHVudXNlZD8KKyAqLworcHVibGljIGNsYXNzIEludEFycmF5TGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdCBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSAxMDsKKwlwcm90ZWN0ZWQgaW50IG4gPSAwOworCXByb3RlY3RlZCBpbnRbXSBlbGVtZW50cyA9IG51bGw7CisKKwlwdWJsaWMgSW50QXJyYXlMaXN0KCkgeworCQl0aGlzKERFRkFVTFRfQ0FQQUNJVFkpOworCX0KKworCXB1YmxpYyBJbnRBcnJheUxpc3QoaW50IGluaXRpYWxDYXBhY2l0eSkgeworCQllbGVtZW50cyA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKKwl9CisKKwkvKiogU2V0IHRoZSBpdGggZWxlbWVudC4gIExpa2UgQXJyYXlMaXN0LCB0aGlzIGRvZXMgTk9UIGFmZmVjdCBzaXplLiAqLworCXB1YmxpYyBpbnQgc2V0KGludCBpLCBpbnQgbmV3VmFsdWUpIHsKKwkJaWYgKCBpPj1uICkgeworCQkJc2V0U2l6ZShpKTsgLy8gdW5saWtlIGRlZmluaXRpb24gb2Ygc2V0IGluIEFycmF5TGlzdCwgc2V0IHNpemUKKwkJfQorCQlpbnQgdiA9IGVsZW1lbnRzW2ldOworCQllbGVtZW50c1tpXSA9IG5ld1ZhbHVlOworCQlyZXR1cm4gdjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBhZGQoaW50IG8pIHsKKwkJaWYgKCBuPj1lbGVtZW50cy5sZW5ndGggKSB7CisJCQlncm93KCk7CisJCX0KKwkJZWxlbWVudHNbbl0gPSBvOworCQluKys7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IG5ld1NpemUpIHsKKwkJaWYgKCBuZXdTaXplPj1lbGVtZW50cy5sZW5ndGggKSB7CisgICAgICAgICAgICBlbnN1cmVDYXBhY2l0eShuZXdTaXplKTsKKwkJfQorCQluID0gbmV3U2l6ZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBncm93KCkgeworCQllbnN1cmVDYXBhY2l0eSgoZWxlbWVudHMubGVuZ3RoICogMykvMiArIDEpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB2KSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlpbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOworCQkJaWYgKCBlbGVtZW50ID09IHYgKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZXdDYXBhY2l0eSkgeworCQlpbnQgb2xkQ2FwYWNpdHkgPSBlbGVtZW50cy5sZW5ndGg7CisJCWlmIChuPj1vbGRDYXBhY2l0eSkgeworCQkJaW50IG9sZERhdGFbXSA9IGVsZW1lbnRzOworCQkJZWxlbWVudHMgPSBuZXcgaW50W25ld0NhcGFjaXR5XTsKKwkJCVN5c3RlbS5hcnJheWNvcHkob2xkRGF0YSwgMCwgZWxlbWVudHMsIDAsIG4pOworCQl9CisJfQorCisJcHVibGljIE9iamVjdCBnZXQoaW50IGkpIHsKKwkJcmV0dXJuIFV0aWxzLmludGVnZXIoZWxlbWVudChpKSk7CisJfQorCisJcHVibGljIGludCBlbGVtZW50KGludCBpKSB7CisJCXJldHVybiBlbGVtZW50c1tpXTsKKwl9CisKKwlwdWJsaWMgaW50W10gZWxlbWVudHMoKSB7CisJCWludFtdIGEgPSBuZXcgaW50W25dOworCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCBhLCAwLCBuKTsKKwkJcmV0dXJuIGE7CisJfQorCisJcHVibGljIGludCBzaXplKCkgeworCQlyZXR1cm4gbjsKKwl9CisKKyAgICBwdWJsaWMgaW50IGNhcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoOworICAgIH0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAoIG89PW51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgSW50QXJyYXlMaXN0IG90aGVyID0gKEludEFycmF5TGlzdClvOworICAgICAgICBpZiAoIHRoaXMuc2l6ZSgpIT1vdGhlci5zaXplKCkgKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmICggZWxlbWVudHNbaV0gIT0gb3RoZXIuZWxlbWVudHNbaV0gKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCQlJbnRBcnJheUxpc3QgYSA9IChJbnRBcnJheUxpc3Qpc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgYS5uID0gdGhpcy5uOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZWxlbWVudHMsIDAsIGEuZWxlbWVudHMsIDAsIHRoaXMuZWxlbWVudHMubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmICggaT4wICkgeworCQkJCWJ1Zi5hcHBlbmQoIiwgIik7CisJCQl9CisJCQlidWYuYXBwZW5kKGVsZW1lbnRzW2ldKTsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9JbnRTZXQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvSW50U2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNmYyNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvSW50U2V0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5taXNjOworCitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogQSBnZW5lcmljIHNldCBvZiBpbnRzIHRoYXQgaGFzIGFuIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiwgQml0U2V0LAorICogIHdoaWNoIGlzIGEgY29tcHJlc3NlZCBiaXRzZXQgYW5kIGlzIHVzZWZ1bCBmb3IgaW50cyB0aGF0CisgKiAgYXJlIHNtYWxsLCBmb3IgZXhhbXBsZSBsZXNzIHRoYW4gNTAwIG9yIHNvLCBhbmQgdy9vIG1hbnkgcmFuZ2VzLiAgRm9yCisgKiAgcmFuZ2VzIHdpdGggbGFyZ2UgdmFsdWVzIGxpa2UgdW5pY29kZSBjaGFyIHNldHMsIHRoaXMgaXMgbm90IHZlcnkgZWZmaWNpZW50LgorICogIENvbnNpZGVyIHVzaW5nIEludGVydmFsU2V0LiAgTm90IGFsbCBtZXRob2RzIGluIEludGVydmFsU2V0IGFyZSBpbXBsZW1lbnRlZC4KKyAqCisgKiAgQHNlZSBvcmcuYW50bHIubWlzYy5CaXRTZXQKKyAqICBAc2VlIG9yZy5hbnRsci5taXNjLkludGVydmFsU2V0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW50U2V0IHsKKyAgICAvKiogQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHNldCAqLworICAgIHZvaWQgYWRkKGludCBlbCk7CisKKyAgICAvKiogQWRkIGFsbCBlbGVtZW50cyBmcm9tIGluY29taW5nIHNldCB0byB0aGlzIHNldC4gIENhbiBsaW1pdAorICAgICAqICB0byBzZXQgb2YgaXRzIG93biB0eXBlLgorICAgICAqLworICAgIHZvaWQgYWRkQWxsKEludFNldCBzZXQpOworCisgICAgLyoqIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IHdpdGggdGhlIGFyZ3VtZW50LCBjcmVhdGluZworICAgICAqICBhIG5ldyBzZXQuCisgICAgICovCisgICAgSW50U2V0IGFuZChJbnRTZXQgYSk7CisKKyAgICBJbnRTZXQgY29tcGxlbWVudChJbnRTZXQgZWxlbWVudHMpOworCisgICAgSW50U2V0IG9yKEludFNldCBhKTsKKworICAgIEludFNldCBzdWJ0cmFjdChJbnRTZXQgYSk7CisKKyAgICAvKiogUmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgc2V0IChub3QgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24ncworICAgICAqICBhbGxvY2F0ZWQgbWVtb3J5IHNpemUsIGZvciBleGFtcGxlKS4KKyAgICAgKi8KKyAgICBpbnQgc2l6ZSgpOworCisgICAgYm9vbGVhbiBpc05pbCgpOworCisgICAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7CisKKyAgICBpbnQgZ2V0U2luZ2xlRWxlbWVudCgpOworCisgICAgYm9vbGVhbiBtZW1iZXIoaW50IGVsKTsKKworICAgIC8qKiByZW1vdmUgdGhpcyBlbGVtZW50IGZyb20gdGhpcyBzZXQgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQgZWwpOworCisgICAgTGlzdCB0b0xpc3QoKTsKKworICAgIFN0cmluZyB0b1N0cmluZygpOworCisgICAgU3RyaW5nIHRvU3RyaW5nKEdyYW1tYXIgZyk7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL0ludGVydmFsLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL0ludGVydmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyNDEwYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvSW50ZXJ2YWwuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5taXNjOworCisvKiogQW4gaW1tdXRhYmxlIGluY2x1c2l2ZSBpbnRlcnZhbCBhLi5iICovCitwdWJsaWMgY2xhc3MgSW50ZXJ2YWwgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSVkFMX1BPT0xfTUFYX1ZBTFVFID0gMTAwMDsKKworCXN0YXRpYyBJbnRlcnZhbFtdIGNhY2hlID0gbmV3IEludGVydmFsW0lOVEVSVkFMX1BPT0xfTUFYX1ZBTFVFKzFdOworCisJcHVibGljIGludCBhOworCXB1YmxpYyBpbnQgYjsKKworCXB1YmxpYyBzdGF0aWMgaW50IGNyZWF0ZXMgPSAwOworCXB1YmxpYyBzdGF0aWMgaW50IG1pc3NlcyA9IDA7CisJcHVibGljIHN0YXRpYyBpbnQgaGl0cyA9IDA7CisJcHVibGljIHN0YXRpYyBpbnQgb3V0T2ZSYW5nZSA9IDA7CisKKwlwdWJsaWMgSW50ZXJ2YWwoaW50IGEsIGludCBiKSB7IHRoaXMuYT1hOyB0aGlzLmI9YjsgfQorCisJLyoqIEludGVydmFsIG9iamVjdHMgYXJlIHVzZWQgcmVhZG9ubHkgc28gc2hhcmUgYWxsIHdpdGggdGhlCisJICogIHNhbWUgc2luZ2xlIHZhbHVlIGE9PWIgdXAgdG8gc29tZSBtYXggc2l6ZS4gIFVzZSBhbiBhcnJheSBhcyBhIHBlcmZlY3QgaGFzaC4KKwkgKiAgUmV0dXJuIHNoYXJlZCBvYmplY3QgZm9yIDAuLklOVEVSVkFMX1BPT0xfTUFYX1ZBTFVFIG9yIGEgbmV3CisJICogIEludGVydmFsIG9iamVjdCB3aXRoIGEuLmEgaW4gaXQuICBPbiBKYXZhLmcsIDIxODYyMyBJbnRlcnZhbFNldHMKKwkgKiAgaGF2ZSBhLi5hIChzZXQgd2l0aCAxIGVsZW1lbnQpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW50ZXJ2YWwgY3JlYXRlKGludCBhLCBpbnQgYikgeworCQkvL3JldHVybiBuZXcgSW50ZXJ2YWwoYSxiKTsKKwkJLy8gY2FjaGUganVzdCBhLi5hCisJCWlmICggYSE9YiB8fCBhPDAgfHwgYT5JTlRFUlZBTF9QT09MX01BWF9WQUxVRSApIHsKKwkJCXJldHVybiBuZXcgSW50ZXJ2YWwoYSxiKTsKKwkJfQorCQlpZiAoIGNhY2hlW2FdPT1udWxsICkgeworCQkJY2FjaGVbYV0gPSBuZXcgSW50ZXJ2YWwoYSxhKTsKKwkJfQorCQlyZXR1cm4gY2FjaGVbYV07CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisJCWlmICggbz09bnVsbCApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlJbnRlcnZhbCBvdGhlciA9IChJbnRlcnZhbClvOworCQlyZXR1cm4gdGhpcy5hPT1vdGhlci5hICYmIHRoaXMuYj09b3RoZXIuYjsKKwl9CisKKwkvKiogRG9lcyB0aGlzIHN0YXJ0IGNvbXBsZXRlbHkgYmVmb3JlIG90aGVyPyBEaXNqb2ludCAqLworCXB1YmxpYyBib29sZWFuIHN0YXJ0c0JlZm9yZURpc2pvaW50KEludGVydmFsIG90aGVyKSB7CisJCXJldHVybiB0aGlzLmE8b3RoZXIuYSAmJiB0aGlzLmI8b3RoZXIuYTsKKwl9CisKKwkvKiogRG9lcyB0aGlzIHN0YXJ0IGF0IG9yIGJlZm9yZSBvdGhlcj8gTm9uZGlzam9pbnQgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNCZWZvcmVOb25EaXNqb2ludChJbnRlcnZhbCBvdGhlcikgeworCQlyZXR1cm4gdGhpcy5hPD1vdGhlci5hICYmIHRoaXMuYj49b3RoZXIuYTsKKwl9CisKKwkvKiogRG9lcyB0aGlzLmEgc3RhcnQgYWZ0ZXIgb3RoZXIuYj8gTWF5IG9yIG1heSBub3QgYmUgZGlzam9pbnQgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNBZnRlcihJbnRlcnZhbCBvdGhlcikgeyByZXR1cm4gdGhpcy5hPm90aGVyLmE7IH0KKworCS8qKiBEb2VzIHRoaXMgc3RhcnQgY29tcGxldGVseSBhZnRlciBvdGhlcj8gRGlzam9pbnQgKi8KKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNBZnRlckRpc2pvaW50KEludGVydmFsIG90aGVyKSB7CisJCXJldHVybiB0aGlzLmE+b3RoZXIuYjsKKwl9CisKKwkvKiogRG9lcyB0aGlzIHN0YXJ0IGFmdGVyIG90aGVyPyBOb25EaXNqb2ludCAqLworCXB1YmxpYyBib29sZWFuIHN0YXJ0c0FmdGVyTm9uRGlzam9pbnQoSW50ZXJ2YWwgb3RoZXIpIHsKKwkJcmV0dXJuIHRoaXMuYT5vdGhlci5hICYmIHRoaXMuYTw9b3RoZXIuYjsgLy8gdGhpcy5iPj1vdGhlci5iIGltcGxpZWQKKwl9CisKKwkvKiogQXJlIGJvdGggcmFuZ2VzIGRpc2pvaW50PyBJLmUuLCBubyBvdmVybGFwPyAqLworCXB1YmxpYyBib29sZWFuIGRpc2pvaW50KEludGVydmFsIG90aGVyKSB7CisJCXJldHVybiBzdGFydHNCZWZvcmVEaXNqb2ludChvdGhlcikgfHwgc3RhcnRzQWZ0ZXJEaXNqb2ludChvdGhlcik7CisJfQorCisJLyoqIEFyZSB0d28gaW50ZXJ2YWxzIGFkamFjZW50IHN1Y2ggYXMgMC4uNDEgYW5kIDQyLi40Mj8gKi8KKwlwdWJsaWMgYm9vbGVhbiBhZGphY2VudChJbnRlcnZhbCBvdGhlcikgeworCQlyZXR1cm4gdGhpcy5hID09IG90aGVyLmIrMSB8fCB0aGlzLmIgPT0gb3RoZXIuYS0xOworCX0KKworCXB1YmxpYyBib29sZWFuIHByb3Blcmx5Q29udGFpbnMoSW50ZXJ2YWwgb3RoZXIpIHsKKwkJcmV0dXJuIG90aGVyLmEgPj0gdGhpcy5hICYmIG90aGVyLmIgPD0gdGhpcy5iOworCX0KKworCS8qKiBSZXR1cm4gdGhlIGludGVydmFsIGNvbXB1dGVkIGZyb20gY29tYmluaW5nIHRoaXMgYW5kIG90aGVyICovCisJcHVibGljIEludGVydmFsIHVuaW9uKEludGVydmFsIG90aGVyKSB7CisJCXJldHVybiBJbnRlcnZhbC5jcmVhdGUoTWF0aC5taW4oYSxvdGhlci5hKSwgTWF0aC5tYXgoYixvdGhlci5iKSk7CisJfQorCisJLyoqIFJldHVybiB0aGUgaW50ZXJ2YWwgaW4gY29tbW9uIGJldHdlZW4gdGhpcyBhbmQgbyAqLworCXB1YmxpYyBJbnRlcnZhbCBpbnRlcnNlY3Rpb24oSW50ZXJ2YWwgb3RoZXIpIHsKKwkJcmV0dXJuIEludGVydmFsLmNyZWF0ZShNYXRoLm1heChhLG90aGVyLmEpLCBNYXRoLm1pbihiLG90aGVyLmIpKTsKKwl9CisKKwkvKiogUmV0dXJuIHRoZSBpbnRlcnZhbCB3aXRoIGVsZW1lbnRzIGZyb20gdGhpcyBub3QgaW4gb3RoZXI7CisJICogIG90aGVyIG11c3Qgbm90IGJlIHRvdGFsbHkgZW5jbG9zZWQgKHByb3Blcmx5IGNvbnRhaW5lZCkKKwkgKiAgd2l0aGluIHRoaXMsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiB0d28gZGlzam9pbnQgaW50ZXJ2YWxzCisJICogIGluc3RlYWQgb2YgdGhlIHNpbmdsZSBvbmUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QuCisJICovCisJcHVibGljIEludGVydmFsIGRpZmZlcmVuY2VOb3RQcm9wZXJseUNvbnRhaW5lZChJbnRlcnZhbCBvdGhlcikgeworCQlJbnRlcnZhbCBkaWZmID0gbnVsbDsKKwkJLy8gb3RoZXIuYSB0byBsZWZ0IG9mIHRoaXMuYSAob3Igc2FtZSkKKwkJaWYgKCBvdGhlci5zdGFydHNCZWZvcmVOb25EaXNqb2ludCh0aGlzKSApIHsKKwkJCWRpZmYgPSBJbnRlcnZhbC5jcmVhdGUoTWF0aC5tYXgodGhpcy5hLG90aGVyLmIrMSksCisJCQkJCQkJCSAgIHRoaXMuYik7CisJCX0KKworCQkvLyBvdGhlci5hIHRvIHJpZ2h0IG9mIHRoaXMuYQorCQllbHNlIGlmICggb3RoZXIuc3RhcnRzQWZ0ZXJOb25EaXNqb2ludCh0aGlzKSApIHsKKwkJCWRpZmYgPSBJbnRlcnZhbC5jcmVhdGUodGhpcy5hLCBvdGhlci5hLTEpOworCQl9CisJCXJldHVybiBkaWZmOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBhKyIuLiIrYjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL0ludGVydmFsU2V0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL0ludGVydmFsU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlNTRmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvSW50ZXJ2YWxTZXQuamF2YQpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci5taXNjOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworCisvKiogQSBzZXQgb2YgaW50ZWdlcnMgdGhhdCByZWxpZXMgb24gcmFuZ2VzIGJlaW5nIGNvbW1vbiB0byBkbworICogICJydW4tbGVuZ3RoLWVuY29kZWQiIGxpa2UgY29tcHJlc3Npb24gKGlmIHlvdSB2aWV3IGFuIEludFNldCBsaWtlCisgKiAgYSBCaXRTZXQgd2l0aCBydW5zIG9mIDBzIGFuZCAxcykuICBPbmx5IHJhbmdlcyBhcmUgcmVjb3JkZWQgc28gdGhhdAorICogIGEgZmV3IGludHMgdXAgbmVhciB2YWx1ZSAxMDAwIGRvbid0IGNhdXNlIG1hc3NpdmUgYml0c2V0cywganVzdCB0d28KKyAqICBpbnRlZ2VyIGludGVydmFscy4KKyAqCisgKiAgZWxlbWVudCB2YWx1ZXMgbWF5IGJlIG5lZ2F0aXZlLiAgVXNlZnVsIGZvciBzZXRzIG9mIEVQU0lMT04gYW5kIEVPRi4KKyAqCisgKiAgMC4uOSBjaGFyIHJhbmdlIGlzIGluZGV4IHBhaXIgWydcdTAwMzAnLCdcdTAwMzknXS4KKyAqICBNdWx0aXBsZSByYW5nZXMgYXJlIGVuY29kZWQgd2l0aCBtdWx0aXBsZSBpbmRleCBwYWlycy4gIElzb2xhdGVkCisgKiAgZWxlbWVudHMgYXJlIGVuY29kZWQgd2l0aCBhbiBpbmRleCBwYWlyIHdoZXJlIGJvdGggaW50ZXJ2YWxzIGFyZSB0aGUgc2FtZS4KKyAqCisgKiAgVGhlIHJhbmdlcyBhcmUgb3JkZXJlZCBhbmQgZGlzam9pbnQgc28gdGhhdCAyLi42IGFwcGVhcnMgYmVmb3JlIDEwMS4uMTAzLgorICovCitwdWJsaWMgY2xhc3MgSW50ZXJ2YWxTZXQgaW1wbGVtZW50cyBJbnRTZXQgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJ2YWxTZXQgQ09NUExFVEVfU0VUID0gSW50ZXJ2YWxTZXQub2YoMCxMYWJlbC5NQVhfQ0hBUl9WQUxVRSk7CisKKwkvKiogVGhlIGxpc3Qgb2Ygc29ydGVkLCBkaXNqb2ludCBpbnRlcnZhbHMuICovCisgICAgcHJvdGVjdGVkIExpc3Q8SW50ZXJ2YWw+IGludGVydmFsczsKKworCS8qKiBDcmVhdGUgYSBzZXQgd2l0aCBubyBlbGVtZW50cyAqLworICAgIHB1YmxpYyBJbnRlcnZhbFNldCgpIHsKKyAgICAgICAgaW50ZXJ2YWxzID0gbmV3IEFycmF5TGlzdDxJbnRlcnZhbD4oMik7IC8vIG1vc3Qgc2V0cyBhcmUgMSBvciAyIGVsZW1lbnRzCisgICAgfQorCisJcHVibGljIEludGVydmFsU2V0KExpc3Q8SW50ZXJ2YWw+IGludGVydmFscykgeworCQl0aGlzLmludGVydmFscyA9IGludGVydmFsczsKKwl9CisKKwkvKiogQ3JlYXRlIGEgc2V0IHdpdGggYSBzaW5nbGUgZWxlbWVudCwgZWwuICovCisgICAgcHVibGljIHN0YXRpYyBJbnRlcnZhbFNldCBvZihpbnQgYSkgeworCQlJbnRlcnZhbFNldCBzID0gbmV3IEludGVydmFsU2V0KCk7CisgICAgICAgIHMuYWRkKGEpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvKiogQ3JlYXRlIGEgc2V0IHdpdGggYWxsIGludHMgd2l0aGluIHJhbmdlIFthLi5iXSAoaW5jbHVzaXZlKSAqLworICAgIHB1YmxpYyBzdGF0aWMgSW50ZXJ2YWxTZXQgb2YoaW50IGEsIGludCBiKSB7CisgICAgICAgIEludGVydmFsU2V0IHMgPSBuZXcgSW50ZXJ2YWxTZXQoKTsKKyAgICAgICAgcy5hZGQoYSxiKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqIEFkZCBhIHNpbmdsZSBlbGVtZW50IHRvIHRoZSBzZXQuICBBbiBpc29sYXRlZCBlbGVtZW50IGlzIHN0b3JlZAorICAgICAqICBhcyBhIHJhbmdlIGVsLi5lbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGVsKSB7CisgICAgICAgIGFkZChlbCxlbCk7CisgICAgfQorCisgICAgLyoqIEFkZCBpbnRlcnZhbDsgaS5lLiwgYWRkIGFsbCBpbnRlZ2VycyBmcm9tIGEgdG8gYiB0byBzZXQuCisgICAgICogIElmIGI8YSwgZG8gbm90aGluZy4KKyAgICAgKiAgS2VlcCBsaXN0IGluIHNvcnRlZCBvcmRlciAoYnkgbGVmdCByYW5nZSB2YWx1ZSkuCisgICAgICogIElmIG92ZXJsYXAsIGNvbWJpbmUgcmFuZ2VzLiAgRm9yIGV4YW1wbGUsCisgICAgICogIElmIHRoaXMgaXMgezEuLjUsIDEwLi4yMH0sIGFkZGluZyA2Li43IHlpZWxkcworICAgICAqICB7MS4uNSwgNi4uNywgMTAuLjIwfS4gIEFkZGluZyA0Li44IHlpZWxkcyB7MS4uOCwgMTAuLjIwfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGEsIGludCBiKSB7CisgICAgICAgIGFkZChJbnRlcnZhbC5jcmVhdGUoYSxiKSk7CisgICAgfQorCisJLy8gY29weSBvbiB3cml0ZSBzbyB3ZSBjYW4gY2FjaGUgYS4uYSBpbnRlcnZhbHMgYW5kIHNldHMgb2YgdGhhdAorCXByb3RlY3RlZCB2b2lkIGFkZChJbnRlcnZhbCBhZGRpdGlvbikgeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkICIrYWRkaXRpb24rIiB0byAiK2ludGVydmFscy50b1N0cmluZygpKTsKKwkJaWYgKCBhZGRpdGlvbi5iPGFkZGl0aW9uLmEgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gZmluZCBwb3NpdGlvbiBpbiBsaXN0CisJCS8vIFVzZSBpdGVyYXRvcnMgYXMgd2UgbW9kaWZ5IGxpc3QgaW4gcGxhY2UKKwkJZm9yIChMaXN0SXRlcmF0b3IgaXRlciA9IGludGVydmFscy5saXN0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlJbnRlcnZhbCByID0gKEludGVydmFsKSBpdGVyLm5leHQoKTsKKwkJCWlmICggYWRkaXRpb24uZXF1YWxzKHIpICkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICggYWRkaXRpb24uYWRqYWNlbnQocikgfHwgIWFkZGl0aW9uLmRpc2pvaW50KHIpICkgeworCQkJCS8vIG5leHQgdG8gZWFjaCBvdGhlciwgbWFrZSBhIHNpbmdsZSBsYXJnZXIgaW50ZXJ2YWwKKwkJCQlJbnRlcnZhbCBiaWdnZXIgPSBhZGRpdGlvbi51bmlvbihyKTsKKwkJCQlpdGVyLnNldChiaWdnZXIpOworCQkJCS8vIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QganVzdCBjcmVhdGUgYW4gaW50ZXJ2YWwgdGhhdAorCQkJCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBuZXh0IGludGVydmFsIGluIGxpc3QKKwkJCQlpZiAoIGl0ZXIuaGFzTmV4dCgpICkgeworCQkJCQlJbnRlcnZhbCBuZXh0ID0gKEludGVydmFsKSBpdGVyLm5leHQoKTsKKwkJCQkJaWYgKCBiaWdnZXIuYWRqYWNlbnQobmV4dCl8fCFiaWdnZXIuZGlzam9pbnQobmV4dCkgKSB7CisJCQkJCQkvLyBpZiB3ZSBidW1wIHVwIGFnYWluc3Qgb3Igb3ZlcmxhcCBuZXh0LCBtZXJnZQorCQkJCQkJaXRlci5yZW1vdmUoKTsgICAvLyByZW1vdmUgdGhpcyBvbmUKKwkJCQkJCWl0ZXIucHJldmlvdXMoKTsgLy8gbW92ZSBiYWNrd2FyZHMgdG8gd2hhdCB3ZSBqdXN0IHNldAorCQkJCQkJaXRlci5zZXQoYmlnZ2VyLnVuaW9uKG5leHQpKTsgLy8gc2V0IHRvIDMgbWVyZ2VkIG9uZXMKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIGFkZGl0aW9uLnN0YXJ0c0JlZm9yZURpc2pvaW50KHIpICkgeworCQkJCS8vIGluc2VydCBiZWZvcmUgcgorCQkJCWl0ZXIucHJldmlvdXMoKTsKKwkJCQlpdGVyLmFkZChhZGRpdGlvbik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy8gaWYgZGlzam9pbnQgYW5kIGFmdGVyIHIsIGEgZnV0dXJlIGl0ZXJhdGlvbiB3aWxsIGhhbmRsZSBpdAorCQl9CisJCS8vIG9rLCBtdXN0IGJlIGFmdGVyIGxhc3QgaW50ZXJ2YWwgKGFuZCBkaXNqb2ludCBmcm9tIGxhc3QgaW50ZXJ2YWwpCisJCS8vIGp1c3QgYWRkIGl0CisJCWludGVydmFscy5hZGQoYWRkaXRpb24pOworCX0KKworCS8qCisJcHJvdGVjdGVkIHZvaWQgYWRkKEludGVydmFsIGFkZGl0aW9uKSB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgIithZGRpdGlvbisiIHRvICIraW50ZXJ2YWxzLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoIGFkZGl0aW9uLmI8YWRkaXRpb24uYSApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBmaW5kIHBvc2l0aW9uIGluIGxpc3QKKyAgICAgICAgLy9mb3IgKExpc3RJdGVyYXRvciBpdGVyID0gaW50ZXJ2YWxzLmxpc3RJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJaW50IG4gPSBpbnRlcnZhbHMuc2l6ZSgpOworCQlmb3IgKGludCBpPTA7IGk8bjsgaSsrKSB7CisJCQlJbnRlcnZhbCByID0gKEludGVydmFsKWludGVydmFscy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoIGFkZGl0aW9uLmVxdWFscyhyKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFkZGl0aW9uLmFkamFjZW50KHIpIHx8ICFhZGRpdGlvbi5kaXNqb2ludChyKSApIHsKKyAgICAgICAgICAgICAgICAvLyBuZXh0IHRvIGVhY2ggb3RoZXIsIG1ha2UgYSBzaW5nbGUgbGFyZ2VyIGludGVydmFsCisgICAgICAgICAgICAgICAgSW50ZXJ2YWwgYmlnZ2VyID0gYWRkaXRpb24udW5pb24ocik7CisJCQkJaW50ZXJ2YWxzLnNldChpLCBiaWdnZXIpOworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QganVzdCBjcmVhdGUgYW4gaW50ZXJ2YWwgdGhhdAorICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBuZXh0IGludGVydmFsIGluIGxpc3QKKwkJCQlpZiAoIChpKzEpPG4gKSB7CisJCQkJCWkrKzsKKwkJCQkJSW50ZXJ2YWwgbmV4dCA9IChJbnRlcnZhbClpbnRlcnZhbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIGJpZ2dlci5hZGphY2VudChuZXh0KXx8IWJpZ2dlci5kaXNqb2ludChuZXh0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGJ1bXAgdXAgYWdhaW5zdCBvciBvdmVybGFwIG5leHQsIG1lcmdlCisJCQkJCQlpbnRlcnZhbHMucmVtb3ZlKGkpOyAvLyByZW1vdmUgbmV4dCBvbmUKKwkJCQkJCWktLTsKKwkJCQkJCWludGVydmFscy5zZXQoaSwgYmlnZ2VyLnVuaW9uKG5leHQpKTsgLy8gc2V0IHRvIDMgbWVyZ2VkIG9uZXMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFkZGl0aW9uLnN0YXJ0c0JlZm9yZURpc2pvaW50KHIpICkgeworICAgICAgICAgICAgICAgIC8vIGluc2VydCBiZWZvcmUgcgorCQkJCWludGVydmFscy5hZGQoaSwgYWRkaXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGRpc2pvaW50IGFuZCBhZnRlciByLCBhIGZ1dHVyZSBpdGVyYXRpb24gd2lsbCBoYW5kbGUgaXQKKyAgICAgICAgfQorICAgICAgICAvLyBvaywgbXVzdCBiZSBhZnRlciBsYXN0IGludGVydmFsIChhbmQgZGlzam9pbnQgZnJvbSBsYXN0IGludGVydmFsKQorICAgICAgICAvLyBqdXN0IGFkZCBpdAorICAgICAgICBpbnRlcnZhbHMuYWRkKGFkZGl0aW9uKTsKKyAgICB9CisqLworCisJcHVibGljIHZvaWQgYWRkQWxsKEludFNldCBzZXQpIHsKKwkJaWYgKCBzZXQ9PW51bGwgKSB7CisJCQlyZXR1cm47CisJCX0KKyAgICAgICAgaWYgKCAhKHNldCBpbnN0YW5jZW9mIEludGVydmFsU2V0KSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGFkZCBub24gSW50U2V0ICgiKworCQkJCQkJCQkJCQkgICBzZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrCisJCQkJCQkJCQkJCSAgICIpIHRvIEludGVydmFsU2V0Iik7CisgICAgICAgIH0KKyAgICAgICAgSW50ZXJ2YWxTZXQgb3RoZXIgPSAoSW50ZXJ2YWxTZXQpc2V0OworICAgICAgICAvLyB3YWxrIHNldCBhbmQgYWRkIGVhY2ggaW50ZXJ2YWwKKwkJaW50IG4gPSBvdGhlci5pbnRlcnZhbHMuc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworCQkJSW50ZXJ2YWwgSSA9IChJbnRlcnZhbCkgb3RoZXIuaW50ZXJ2YWxzLmdldChpKTsKKwkJCXRoaXMuYWRkKEkuYSxJLmIpOworCQl9CisgICAgfQorCisgICAgcHVibGljIEludFNldCBjb21wbGVtZW50KGludCBtaW5FbGVtZW50LCBpbnQgbWF4RWxlbWVudCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb21wbGVtZW50KEludGVydmFsU2V0Lm9mKG1pbkVsZW1lbnQsbWF4RWxlbWVudCkpOworICAgIH0KKworICAgIC8qKiBHaXZlbiB0aGUgc2V0IG9mIHBvc3NpYmxlIHZhbHVlcyAocmF0aGVyIHRoYW4sIHNheSBVTklDT0RFIG9yIE1BWElOVCksCisgICAgICogIHJldHVybiBhIG5ldyBzZXQgY29udGFpbmluZyBhbGwgZWxlbWVudHMgaW4gdm9jYWJ1bGFyeSwgYnV0IG5vdCBpbgorICAgICAqICB0aGlzLiAgVGhlIGNvbXB1dGF0aW9uIGlzICh2b2NhYnVsYXJ5IC0gdGhpcykuCisgICAgICoKKyAgICAgKiAgJ3RoaXMnIGlzIGFzc3VtZWQgdG8gYmUgZWl0aGVyIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHZvY2FidWxhcnkuCisgICAgICovCisgICAgcHVibGljIEludFNldCBjb21wbGVtZW50KEludFNldCB2b2NhYnVsYXJ5KSB7CisgICAgICAgIGlmICggdm9jYWJ1bGFyeT09bnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBub3RoaW5nIGluIGNvbW1vbiB3aXRoIG51bGwgc2V0CisgICAgICAgIH0KKwkJaWYgKCAhKHZvY2FidWxhcnkgaW5zdGFuY2VvZiBJbnRlcnZhbFNldCApICkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuJ3QgY29tcGxlbWVudCB3aXRoIG5vbiBJbnRlcnZhbFNldCAoIisKKwkJCQkJCQkJCQkJICAgdm9jYWJ1bGFyeS5nZXRDbGFzcygpLmdldE5hbWUoKSsiKSIpOworCQl9CisJCUludGVydmFsU2V0IHZvY2FidWxhcnlJUyA9ICgoSW50ZXJ2YWxTZXQpdm9jYWJ1bGFyeSk7CisJCWludCBtYXhFbGVtZW50ID0gdm9jYWJ1bGFyeUlTLmdldE1heEVsZW1lbnQoKTsKKworCQlJbnRlcnZhbFNldCBjb21wbCA9IG5ldyBJbnRlcnZhbFNldCgpOworCQlpbnQgbiA9IGludGVydmFscy5zaXplKCk7CisJCWlmICggbiA9PTAgKSB7CisJCQlyZXR1cm4gY29tcGw7CisJCX0KKwkJSW50ZXJ2YWwgZmlyc3QgPSAoSW50ZXJ2YWwpaW50ZXJ2YWxzLmdldCgwKTsKKwkJLy8gYWRkIGEgcmFuZ2UgZnJvbSAwIHRvIGZpcnN0LmEgY29uc3RyYWluZWQgdG8gdm9jYWIKKwkJaWYgKCBmaXJzdC5hID4gMCApIHsKKwkJCUludGVydmFsU2V0IHMgPSBJbnRlcnZhbFNldC5vZigwLCBmaXJzdC5hLTEpOworCQkJSW50ZXJ2YWxTZXQgYSA9IChJbnRlcnZhbFNldClzLmFuZCh2b2NhYnVsYXJ5SVMpOworCQkJY29tcGwuYWRkQWxsKGEpOworCQl9CisJCWZvciAoaW50IGk9MTsgaTxuOyBpKyspIHsgLy8gZnJvbSAybmQgaW50ZXJ2YWwgLi4gbnRoCisJCQlJbnRlcnZhbCBwcmV2aW91cyA9IChJbnRlcnZhbClpbnRlcnZhbHMuZ2V0KGktMSk7CisJCQlJbnRlcnZhbCBjdXJyZW50ID0gKEludGVydmFsKWludGVydmFscy5nZXQoaSk7CisJCQlJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YocHJldmlvdXMuYisxLCBjdXJyZW50LmEtMSk7CisJCQlJbnRlcnZhbFNldCBhID0gKEludGVydmFsU2V0KXMuYW5kKHZvY2FidWxhcnlJUyk7CisJCQljb21wbC5hZGRBbGwoYSk7CisJCX0KKwkJSW50ZXJ2YWwgbGFzdCA9IChJbnRlcnZhbClpbnRlcnZhbHMuZ2V0KG4gLTEpOworCQkvLyBhZGQgYSByYW5nZSBmcm9tIGxhc3QuYiB0byBtYXhFbGVtZW50IGNvbnN0cmFpbmVkIHRvIHZvY2FiCisJCWlmICggbGFzdC5iIDwgbWF4RWxlbWVudCApIHsKKwkJCUludGVydmFsU2V0IHMgPSBJbnRlcnZhbFNldC5vZihsYXN0LmIrMSwgbWF4RWxlbWVudCk7CisJCQlJbnRlcnZhbFNldCBhID0gKEludGVydmFsU2V0KXMuYW5kKHZvY2FidWxhcnlJUyk7CisJCQljb21wbC5hZGRBbGwoYSk7CisJCX0KKwkJcmV0dXJuIGNvbXBsOworICAgIH0KKworCS8qKiBDb21wdXRlIHRoaXMtb3RoZXIgdmlhIHRoaXMmfm90aGVyLgorCSAqICBSZXR1cm4gYSBuZXcgc2V0IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIGluIHRoaXMgYnV0IG5vdCBpbiBvdGhlci4KKwkgKiAgb3RoZXIgaXMgYXNzdW1lZCB0byBiZSBhIHN1YnNldCBvZiB0aGlzOworICAgICAqICBhbnl0aGluZyB0aGF0IGlzIGluIG90aGVyIGJ1dCBub3QgaW4gdGhpcyB3aWxsIGJlIGlnbm9yZWQuCisJICovCisJcHVibGljIEludFNldCBzdWJ0cmFjdChJbnRTZXQgb3RoZXIpIHsKKwkJLy8gYXNzdW1lIHRoZSB3aG9sZSB1bmljb2RlIHJhbmdlIGhlcmUgZm9yIHRoZSBjb21wbGVtZW50CisJCS8vIGJlY2F1c2UgaXQgZG9lc24ndCBtYXR0ZXIuICBBbnl0aGluZyBiZXlvbmQgdGhlIG1heCBvZiB0aGlzJyBzZXQKKwkJLy8gd2lsbCBiZSBpZ25vcmVkIHNpbmNlIHdlIGFyZSBkb2luZyB0aGlzICYgfm90aGVyLiAgVGhlIGludGVyc2VjdGlvbgorCQkvLyB3aWxsIGJlIGVtcHR5LiAgVGhlIG9ubHkgcHJvYmxlbSB3b3VsZCBiZSB3aGVuIHRoaXMnIHNldCBtYXggdmFsdWUKKwkJLy8gZ29lcyBiZXlvbmQgTUFYX0NIQVJfVkFMVUUsIGJ1dCBob3BlZnVsbHkgdGhlIGNvbnN0YW50IE1BWF9DSEFSX1ZBTFVFCisJCS8vIHdpbGwgcHJldmVudCB0aGlzLgorCQlyZXR1cm4gdGhpcy5hbmQoKChJbnRlcnZhbFNldClvdGhlcikuY29tcGxlbWVudChDT01QTEVURV9TRVQpKTsKKwl9CisKKwkvKiogcmV0dXJuIGEgbmV3IHNldCBjb250YWluaW5nIGFsbCBlbGVtZW50cyBpbiB0aGlzIGJ1dCBub3QgaW4gb3RoZXIuCisgICAgICogIEludGVydmFscyBtYXkgaGF2ZSB0byBiZSBicm9rZW4gdXAgd2hlbiByYW5nZXMgaW4gdGhpcyBvdmVybGFwCisgICAgICogIHdpdGggcmFuZ2VzIGluIG90aGVyLiAgb3RoZXIgaXMgYXNzdW1lZCB0byBiZSBhIHN1YnNldCBvZiB0aGlzOworICAgICAqICBhbnl0aGluZyB0aGF0IGlzIGluIG90aGVyIGJ1dCBub3QgaW4gdGhpcyB3aWxsIGJlIGlnbm9yZWQuCisJICoKKwkgKiAgS2VlcCBhcm91bmQsIGJ1dCAxMC0yMC0yMDA1LCBJIGRlY2lkZWQgdG8gbWFrZSBjb21wbGVtZW50IHdvcmsgdy9vCisJICogIHN1YnRyYWN0IGFuZCBzbyB0aGVuIHN1YnRyYWN0IGNhbiBzaW1wbHkgYmUgYSZ+YgorCSAqCisgICAgcHVibGljIEludFNldCBzdWJ0cmFjdChJbnRTZXQgb3RoZXIpIHsKKyAgICAgICAgaWYgKCBvdGhlcj09bnVsbCB8fCAhKG90aGVyIGluc3RhbmNlb2YgSW50ZXJ2YWxTZXQpICkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgaW4gY29tbW9uIHdpdGggbnVsbCBzZXQKKyAgICAgICAgfQorCisgICAgICAgIEludGVydmFsU2V0IGRpZmYgPSBuZXcgSW50ZXJ2YWxTZXQoKTsKKworICAgICAgICAvLyBpdGVyYXRlIGRvd24gYm90aCBpbnRlcnZhbCBsaXN0cworICAgICAgICBMaXN0SXRlcmF0b3IgdGhpc0l0ZXIgPSB0aGlzLmludGVydmFscy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgTGlzdEl0ZXJhdG9yIG90aGVySXRlciA9ICgoSW50ZXJ2YWxTZXQpb3RoZXIpLmludGVydmFscy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgSW50ZXJ2YWwgbWluZT1udWxsOworICAgICAgICBJbnRlcnZhbCB0aGVpcnM9bnVsbDsKKyAgICAgICAgaWYgKCB0aGlzSXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICBtaW5lID0gKEludGVydmFsKXRoaXNJdGVyLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG90aGVySXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICB0aGVpcnMgPSAoSW50ZXJ2YWwpb3RoZXJJdGVyLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIG1pbmUhPW51bGwgKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibWluZT0iK21pbmUrIiwgdGhlaXJzPSIrdGhlaXJzKTsKKyAgICAgICAgICAgIC8vIENBU0UgMTogbm90aGluZyBpbiB0aGVpcnMgcmVtb3ZlcyBhIGNodW5rIGZyb20gbWluZQorICAgICAgICAgICAgaWYgKCB0aGVpcnM9PW51bGwgfHwgbWluZS5kaXNqb2ludCh0aGVpcnMpICkgeworICAgICAgICAgICAgICAgIC8vIFNVQkNBU0UgMWE6IGZpbmlzaGVkIHRyYXZlcnNpbmcgdGhlaXJzOyBrZWVwIGFkZGluZyBtaW5lIG5vdworICAgICAgICAgICAgICAgIGlmICggdGhlaXJzPT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZXZlcnl0aGluZyBpbiBtaW5lIHRvIGRpZmZlcmVuY2Ugc2luY2UgdGhlaXJzIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgZGlmZi5hZGQobWluZSk7CisgICAgICAgICAgICAgICAgICAgIG1pbmUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXNJdGVyLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbmUgPSAoSW50ZXJ2YWwpdGhpc0l0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTVUJDQVNFIDFiOiBtaW5lIGlzIGNvbXBsZXRlbHkgdG8gdGhlIGxlZnQgb2YgdGhlaXJzCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBhZGQgdG8gZGlmZmVyZW5jZTsgbW92ZSBtaW5lLCBidXQgbm90IHRoZWlycworICAgICAgICAgICAgICAgICAgICBpZiAoIG1pbmUuc3RhcnRzQmVmb3JlRGlzam9pbnQodGhlaXJzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYuYWRkKG1pbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWluZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRoaXNJdGVyLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5lID0gKEludGVydmFsKXRoaXNJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTVUJDQVNFIDFjOiB0aGVpcnMgaXMgY29tcGxldGVseSB0byB0aGUgbGVmdCBvZiBtaW5lCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBsb29raW5nIGluIHRoZWlycworICAgICAgICAgICAgICAgICAgICAgICAgdGhlaXJzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggb3RoZXJJdGVyLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVpcnMgPSAoSW50ZXJ2YWwpb3RoZXJJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENBU0UgMjogdGhlaXJzIGJyZWFrcyBtaW5lIGludG8gdHdvIGNodW5rcworICAgICAgICAgICAgICAgIGlmICggbWluZS5wcm9wZXJseUNvbnRhaW5zKHRoZWlycykgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYWRkIHR3byBpbnRlcnZhbHM6IHN0dWZmIHRvIGxlZnQgYW5kIHN0dWZmIHRvIHJpZ2h0CisgICAgICAgICAgICAgICAgICAgIGRpZmYuYWRkKG1pbmUuYSwgdGhlaXJzLmEtMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFjdHVhbGx5IGFkZCBzdHVmZiB0byByaWdodCB5ZXQgYXMgbmV4dCAndGhlaXJzJworICAgICAgICAgICAgICAgICAgICAvLyBtaWdodCBvdmVybGFwIHdpdGggaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN0dWZmIHRvIHRoZSByaWdodCBtaWdodCBvdmVybGFwIHdpdGggbmV4dCAidGhlaXJzIi4KKyAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgaXMgY29uc2lkZXJlZCBuZXh0CisgICAgICAgICAgICAgICAgICAgIEludGVydmFsIHJpZ2h0ID0gbmV3IEludGVydmFsKHRoZWlycy5iKzEsIG1pbmUuYik7CisgICAgICAgICAgICAgICAgICAgIG1pbmUgPSByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0aGVpcnMgZm9yd2FyZAorICAgICAgICAgICAgICAgICAgICB0aGVpcnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoIG90aGVySXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGVpcnMgPSAoSW50ZXJ2YWwpb3RoZXJJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENBU0UgMzogdGhlaXJzIGNvdmVycyBtaW5lOyBub3RoaW5nIHRvIGFkZCB0byBkaWZmCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHRoZWlycy5wcm9wZXJseUNvbnRhaW5zKG1pbmUpICkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGFkZCwgdGhlaXJzIGZvcmNlcyByZW1vdmFsIHRvdGFsbHkgb2YgbWluZQorICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG1vdmUgbWluZSBsb29raW5nIGZvciBhbiBvdmVybGFwcGluZyBpbnRlcnZhbAorICAgICAgICAgICAgICAgICAgICBtaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzSXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5lID0gKEludGVydmFsKXRoaXNJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENBU0UgNDogbm9uIHByb3BlciBvdmVybGFwCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsYXAsIGJ1dCBub3QgcHJvcGVybHkgY29udGFpbmVkCisgICAgICAgICAgICAgICAgICAgIGRpZmYuYWRkKG1pbmUuZGlmZmVyZW5jZU5vdFByb3Blcmx5Q29udGFpbmVkKHRoZWlycykpOworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaXRlcmF0b3JzCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbW92ZVRoZWlycyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICggbWluZS5zdGFydHNCZWZvcmVOb25EaXNqb2ludCh0aGVpcnMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlaXJzLmIgPiBtaW5lLmIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aCBvaCwgcmlnaHQgb2YgdGhlaXJzIGV4dGVuZHMgcGFzdCByaWdodCBvZiBtaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgY291bGQgb3ZlcmxhcCB3aXRoIG5leHQgb2YgbWluZSBzbyBkb24ndAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0aGVpcnMgaXRlcmF0b3IgeWV0CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlVGhlaXJzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIG1vdmUgbWluZQorICAgICAgICAgICAgICAgICAgICBtaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB0aGlzSXRlci5oYXNOZXh0KCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5lID0gKEludGVydmFsKXRoaXNJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIG1vdmVUaGVpcnMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGVpcnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBvdGhlckl0ZXIuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZWlycyA9IChJbnRlcnZhbClvdGhlckl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkaWZmOworICAgIH0KKwkgKi8KKworICAgIC8qKiBUT0RPOiBpbXBsZW1lbnQgdGhpcyEgKi8KKwlwdWJsaWMgSW50U2V0IG9yKEludFNldCBhKSB7CisJCUludGVydmFsU2V0IG8gPSBuZXcgSW50ZXJ2YWxTZXQoKTsKKwkJby5hZGRBbGwodGhpcyk7CisJCW8uYWRkQWxsKGEpOworCQkvL3Rocm93IG5ldyBOb1N1Y2hNZXRob2RFcnJvcigpOworCQlyZXR1cm4gbzsKKwl9CisKKyAgICAvKiogUmV0dXJuIGEgbmV3IHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgd2l0aCBvdGhlci4gIEJlY2F1c2UKKyAgICAgKiAgdGhlIGludGVydmFscyBhcmUgc29ydGVkLCB3ZSBjYW4gdXNlIGFuIGl0ZXJhdG9yIGZvciBlYWNoIGxpc3QgYW5kCisgICAgICogIGp1c3Qgd2FsayB0aGVtIHRvZ2V0aGVyLiAgVGhpcyBpcyByb3VnaGx5IE8obWluKG4sbSkpIGZvciBpbnRlcnZhbAorICAgICAqICBsaXN0IGxlbmd0aHMgbiBhbmQgbS4KKyAgICAgKi8KKwlwdWJsaWMgSW50U2V0IGFuZChJbnRTZXQgb3RoZXIpIHsKKwkJaWYgKCBvdGhlcj09bnVsbCApIHsgLy98fCAhKG90aGVyIGluc3RhbmNlb2YgSW50ZXJ2YWxTZXQpICkgeworCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgaW4gY29tbW9uIHdpdGggbnVsbCBzZXQKKwkJfQorCisJCUFycmF5TGlzdCBteUludGVydmFscyA9IChBcnJheUxpc3QpdGhpcy5pbnRlcnZhbHM7CisJCUFycmF5TGlzdCB0aGVpckludGVydmFscyA9IChBcnJheUxpc3QpKChJbnRlcnZhbFNldClvdGhlcikuaW50ZXJ2YWxzOworCQlJbnRlcnZhbFNldCBpbnRlcnNlY3Rpb24gPSBudWxsOworCQlpbnQgbXlTaXplID0gbXlJbnRlcnZhbHMuc2l6ZSgpOworCQlpbnQgdGhlaXJTaXplID0gdGhlaXJJbnRlcnZhbHMuc2l6ZSgpOworCQlpbnQgaSA9IDA7CisJCWludCBqID0gMDsKKwkJLy8gaXRlcmF0ZSBkb3duIGJvdGggaW50ZXJ2YWwgbGlzdHMgbG9va2luZyBmb3Igbm9uZGlzam9pbnQgaW50ZXJ2YWxzCisJCXdoaWxlICggaTxteVNpemUgJiYgajx0aGVpclNpemUgKSB7CisJCQlJbnRlcnZhbCBtaW5lID0gKEludGVydmFsKW15SW50ZXJ2YWxzLmdldChpKTsKKwkJCUludGVydmFsIHRoZWlycyA9IChJbnRlcnZhbCl0aGVpckludGVydmFscy5nZXQoaik7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibWluZT0iK21pbmUrIiBhbmQgdGhlaXJzPSIrdGhlaXJzKTsKKwkJCWlmICggbWluZS5zdGFydHNCZWZvcmVEaXNqb2ludCh0aGVpcnMpICkgeworCQkJCS8vIG1vdmUgdGhpcyBpdGVyYXRvciBsb29raW5nIGZvciBpbnRlcnZhbCB0aGF0IG1pZ2h0IG92ZXJsYXAKKwkJCQlpKys7CisJCQl9CisJCQllbHNlIGlmICggdGhlaXJzLnN0YXJ0c0JlZm9yZURpc2pvaW50KG1pbmUpICkgeworCQkJCS8vIG1vdmUgb3RoZXIgaXRlcmF0b3IgbG9va2luZyBmb3IgaW50ZXJ2YWwgdGhhdCBtaWdodCBvdmVybGFwCisJCQkJaisrOworCQkJfQorCQkJZWxzZSBpZiAoIG1pbmUucHJvcGVybHlDb250YWlucyh0aGVpcnMpICkgeworCQkJCS8vIG92ZXJsYXAsIGFkZCBpbnRlcnNlY3Rpb24sIGdldCBuZXh0IHRoZWlycworCQkJCWlmICggaW50ZXJzZWN0aW9uPT1udWxsICkgeworCQkJCQlpbnRlcnNlY3Rpb24gPSBuZXcgSW50ZXJ2YWxTZXQoKTsKKwkJCQl9CisJCQkJaW50ZXJzZWN0aW9uLmFkZChtaW5lLmludGVyc2VjdGlvbih0aGVpcnMpKTsKKwkJCQlqKys7CisJCQl9CisJCQllbHNlIGlmICggdGhlaXJzLnByb3Blcmx5Q29udGFpbnMobWluZSkgKSB7CisJCQkJLy8gb3ZlcmxhcCwgYWRkIGludGVyc2VjdGlvbiwgZ2V0IG5leHQgbWluZQorCQkJCWlmICggaW50ZXJzZWN0aW9uPT1udWxsICkgeworCQkJCQlpbnRlcnNlY3Rpb24gPSBuZXcgSW50ZXJ2YWxTZXQoKTsKKwkJCQl9CisJCQkJaW50ZXJzZWN0aW9uLmFkZChtaW5lLmludGVyc2VjdGlvbih0aGVpcnMpKTsKKwkJCQlpKys7CisJCQl9CisJCQllbHNlIGlmICggIW1pbmUuZGlzam9pbnQodGhlaXJzKSApIHsKKwkJCQkvLyBvdmVybGFwLCBhZGQgaW50ZXJzZWN0aW9uCisJCQkJaWYgKCBpbnRlcnNlY3Rpb249PW51bGwgKSB7CisJCQkJCWludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnZhbFNldCgpOworCQkJCX0KKwkJCQlpbnRlcnNlY3Rpb24uYWRkKG1pbmUuaW50ZXJzZWN0aW9uKHRoZWlycykpOworCQkJCS8vIE1vdmUgdGhlIGl0ZXJhdG9yIG9mIGxvd2VyIHJhbmdlIFthLi5iXSwgYnV0IG5vdAorCQkJCS8vIHRoZSB1cHBlciByYW5nZSBhcyBpdCBtYXkgY29udGFpbiBlbGVtZW50cyB0aGF0IHdpbGwgY29sbGlkZQorCQkJCS8vIHdpdGggdGhlIG5leHQgaXRlcmF0b3IuIFNvLCBpZiBtaW5lPVswLi4xMTVdIGFuZAorCQkJCS8vIHRoZWlycz1bMTE1Li4yMDBdLCB0aGVuIGludGVyc2VjdGlvbiBpcyAxMTUgYW5kIG1vdmUgbWluZQorCQkJCS8vIGJ1dCBub3QgdGhlaXJzIGFzIHRoZWlycyBtYXkgY29sbGlkZSB3aXRoIHRoZSBuZXh0IHJhbmdlCisJCQkJLy8gaW4gdGhpc0l0ZXIuCisJCQkJLy8gbW92ZSBib3RoIGl0ZXJhdG9ycyB0byBuZXh0IHJhbmdlcworCQkJCWlmICggbWluZS5zdGFydHNBZnRlck5vbkRpc2pvaW50KHRoZWlycykgKSB7CisJCQkJCWorKzsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIHRoZWlycy5zdGFydHNBZnRlck5vbkRpc2pvaW50KG1pbmUpICkgeworCQkJCQlpKys7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICggaW50ZXJzZWN0aW9uPT1udWxsICkgeworCQkJcmV0dXJuIG5ldyBJbnRlcnZhbFNldCgpOworCQl9CisJCXJldHVybiBpbnRlcnNlY3Rpb247CisJfQorCisgICAgLyoqIElzIGVsIGluIGFueSByYW5nZSBvZiB0aGlzIHNldD8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtZW1iZXIoaW50IGVsKSB7CisJCWludCBuID0gaW50ZXJ2YWxzLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCUludGVydmFsIEkgPSAoSW50ZXJ2YWwpIGludGVydmFscy5nZXQoaSk7CisJCQlpbnQgYSA9IEkuYTsKKwkJCWludCBiID0gSS5iOworCQkJaWYgKCBlbDxhICkgeworCQkJCWJyZWFrOyAvLyBsaXN0IGlzIHNvcnRlZCBhbmQgZWwgaXMgYmVmb3JlIHRoaXMgaW50ZXJ2YWw7IG5vdCBoZXJlCisJCQl9CisJCQlpZiAoIGVsPj1hICYmIGVsPD1iICkgeworCQkJCXJldHVybiB0cnVlOyAvLyBmb3VuZCBpbiB0aGlzIGludGVydmFsCisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworLyoKKwkJZm9yIChMaXN0SXRlcmF0b3IgaXRlciA9IGludGVydmFscy5saXN0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBJbnRlcnZhbCBJID0gKEludGVydmFsKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICggZWw8SS5hICkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBsaXN0IGlzIHNvcnRlZCBhbmQgZWwgaXMgYmVmb3JlIHRoaXMgaW50ZXJ2YWw7IG5vdCBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGVsPj1JLmEgJiYgZWw8PUkuYiApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZm91bmQgaW4gdGhpcyBpbnRlcnZhbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKi8KKyAgICB9CisKKyAgICAvKiogcmV0dXJuIHRydWUgaWYgdGhpcyBzZXQgaGFzIG5vIG1lbWJlcnMgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05pbCgpIHsKKyAgICAgICAgcmV0dXJuIGludGVydmFscz09bnVsbCB8fCBpbnRlcnZhbHMuc2l6ZSgpPT0wOworICAgIH0KKworICAgIC8qKiBJZiB0aGlzIHNldCBpcyBhIHNpbmdsZSBpbnRlZ2VyLCByZXR1cm4gaXQgb3RoZXJ3aXNlIExhYmVsLklOVkFMSUQgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpbmdsZUVsZW1lbnQoKSB7CisgICAgICAgIGlmICggaW50ZXJ2YWxzIT1udWxsICYmIGludGVydmFscy5zaXplKCk9PTEgKSB7CisgICAgICAgICAgICBJbnRlcnZhbCBJID0gKEludGVydmFsKWludGVydmFscy5nZXQoMCk7CisgICAgICAgICAgICBpZiAoIEkuYSA9PSBJLmIgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEkuYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTGFiZWwuSU5WQUxJRDsKKyAgICB9CisKKwlwdWJsaWMgaW50IGdldE1heEVsZW1lbnQoKSB7CisJCWlmICggaXNOaWwoKSApIHsKKwkJCXJldHVybiBMYWJlbC5JTlZBTElEOworCQl9CisJCUludGVydmFsIGxhc3QgPSAoSW50ZXJ2YWwpaW50ZXJ2YWxzLmdldChpbnRlcnZhbHMuc2l6ZSgpLTEpOworCQlyZXR1cm4gbGFzdC5iOworCX0KKworCS8qKiBSZXR1cm4gbWluaW11bSBlbGVtZW50ID49IDAgKi8KKwlwdWJsaWMgaW50IGdldE1pbkVsZW1lbnQoKSB7CisJCWlmICggaXNOaWwoKSApIHsKKwkJCXJldHVybiBMYWJlbC5JTlZBTElEOworCQl9CisJCWludCBuID0gaW50ZXJ2YWxzLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCUludGVydmFsIEkgPSAoSW50ZXJ2YWwpIGludGVydmFscy5nZXQoaSk7CisJCQlpbnQgYSA9IEkuYTsKKwkJCWludCBiID0gSS5iOworCQkJZm9yIChpbnQgdj1hOyB2PD1iOyB2KyspIHsKKwkJCQlpZiAoIHY+PTAgKSByZXR1cm4gdjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gTGFiZWwuSU5WQUxJRDsKKwl9CisKKyAgICAvKiogUmV0dXJuIGEgbGlzdCBvZiBJbnRlcnZhbCBvYmplY3RzLiAqLworICAgIHB1YmxpYyBMaXN0PEludGVydmFsPiBnZXRJbnRlcnZhbHMoKSB7CisgICAgICAgIHJldHVybiBpbnRlcnZhbHM7CisgICAgfQorCisgICAgLyoqIEFyZSB0d28gSW50ZXJ2YWxTZXRzIGVxdWFsPyAgQmVjYXVzZSBhbGwgaW50ZXJ2YWxzIGFyZSBzb3J0ZWQKKyAgICAgKiAgYW5kIGRpc2pvaW50LCBlcXVhbHMgaXMgYSBzaW1wbGUgbGluZWFyIHdhbGsgb3ZlciBib3RoIGxpc3RzCisgICAgICogIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB0aGUgc2FtZS4gIEludGVydmFsLmVxdWFscygpIGlzIHVzZWQKKyAgICAgKiAgYnkgdGhlIExpc3QuZXF1YWxzKCkgbWV0aG9kIHRvIGNoZWNrIHRoZSByYW5nZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCBvYmo9PW51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBJbnRlcnZhbFNldCkgKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgSW50ZXJ2YWxTZXQgb3RoZXIgPSAoSW50ZXJ2YWxTZXQpb2JqOworICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnZhbHMuZXF1YWxzKG90aGVyLmludGVydmFscyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoR3JhbW1hciBnKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWlmICggdGhpcy5pbnRlcnZhbHM9PW51bGwgfHwgdGhpcy5pbnRlcnZhbHMuc2l6ZSgpPT0wICkgeworCQkJcmV0dXJuICJ7fSI7CisJCX0KKyAgICAgICAgaWYgKCB0aGlzLmludGVydmFscy5zaXplKCk+MSApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInsiKTsKKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBpdGVyID0gdGhpcy5pbnRlcnZhbHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJbnRlcnZhbCBJID0gKEludGVydmFsKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGludCBhID0gSS5hOworICAgICAgICAgICAgaW50IGIgPSBJLmI7CisgICAgICAgICAgICBpZiAoIGE9PWIgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBnIT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGcuZ2V0VG9rZW5EaXNwbGF5TmFtZShhKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggZyE9bnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChnLmdldFRva2VuRGlzcGxheU5hbWUoYSkrIi4uIitnLmdldFRva2VuRGlzcGxheU5hbWUoYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChhKyIuLiIrYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBpdGVyLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5pbnRlcnZhbHMuc2l6ZSgpPjEgKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJ9Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJaW50IG4gPSAwOworCQlpbnQgbnVtSW50ZXJ2YWxzID0gaW50ZXJ2YWxzLnNpemUoKTsKKwkJaWYgKCBudW1JbnRlcnZhbHM9PTEgKSB7CisJCQlJbnRlcnZhbCBmaXJzdEludGVydmFsID0gdGhpcy5pbnRlcnZhbHMuZ2V0KDApOworCQkJcmV0dXJuIGZpcnN0SW50ZXJ2YWwuYi1maXJzdEludGVydmFsLmErMTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUludGVydmFsczsgaSsrKSB7CisJCQlJbnRlcnZhbCBJID0gKEludGVydmFsKSBpbnRlcnZhbHMuZ2V0KGkpOworCQkJbiArPSAoSS5iLUkuYSsxKTsKKwkJfQorCQlyZXR1cm4gbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCB0b0xpc3QoKSB7CisJCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworCQlpbnQgbiA9IGludGVydmFscy5zaXplKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlJbnRlcnZhbCBJID0gKEludGVydmFsKSBpbnRlcnZhbHMuZ2V0KGkpOworCQkJaW50IGEgPSBJLmE7CisJCQlpbnQgYiA9IEkuYjsKKwkJCWZvciAoaW50IHY9YTsgdjw9YjsgdisrKSB7CisJCQkJdmFsdWVzLmFkZChVdGlscy5pbnRlZ2VyKHYpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWVzOworICAgIH0KKworCS8qKiBHZXQgdGhlIGl0aCBlbGVtZW50IG9mIG9yZGVyZWQgc2V0LiAgVXNlZCBvbmx5IGJ5IFJhbmRvbVBocmFzZSBzbworCSAqICBkb24ndCBib3RoZXIgdG8gaW1wbGVtZW50IGlmIHlvdSdyZSBub3QgZG9pbmcgdGhhdCBmb3IgYSBuZXcKKwkgKiAgQU5UTFIgY29kZSBnZW4gdGFyZ2V0LgorCSAqLworCXB1YmxpYyBpbnQgZ2V0KGludCBpKSB7CisJCWludCBuID0gaW50ZXJ2YWxzLnNpemUoKTsKKwkJaW50IGluZGV4ID0gMDsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJCUludGVydmFsIEkgPSAoSW50ZXJ2YWwpIGludGVydmFscy5nZXQoaik7CisJCQlpbnQgYSA9IEkuYTsKKwkJCWludCBiID0gSS5iOworCQkJZm9yIChpbnQgdj1hOyB2PD1iOyB2KyspIHsKKwkJCQlpZiAoIGluZGV4PT1pICkgeworCQkJCQlyZXR1cm4gdjsKKwkJCQl9CisJCQkJaW5kZXgrKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCisJcHVibGljIGludFtdIHRvQXJyYXkoKSB7CisJCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbc2l6ZSgpXTsKKwkJaW50IG4gPSBpbnRlcnZhbHMuc2l6ZSgpOworCQlpbnQgaiA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlJbnRlcnZhbCBJID0gKEludGVydmFsKSBpbnRlcnZhbHMuZ2V0KGkpOworCQkJaW50IGEgPSBJLmE7CisJCQlpbnQgYiA9IEkuYjsKKwkJCWZvciAoaW50IHY9YTsgdjw9YjsgdisrKSB7CisJCQkJdmFsdWVzW2pdID0gdjsKKwkJCQlqKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwlwdWJsaWMgb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0IHRvUnVudGltZUJpdFNldCgpIHsKKwkJb3JnLmFudGxyLnJ1bnRpbWUuQml0U2V0IHMgPQorCQkJbmV3IG9yZy5hbnRsci5ydW50aW1lLkJpdFNldChnZXRNYXhFbGVtZW50KCkrMSk7CisJCWludCBuID0gaW50ZXJ2YWxzLnNpemUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCUludGVydmFsIEkgPSAoSW50ZXJ2YWwpIGludGVydmFscy5nZXQoaSk7CisJCQlpbnQgYSA9IEkuYTsKKwkJCWludCBiID0gSS5iOworCQkJZm9yIChpbnQgdj1hOyB2PD1iOyB2KyspIHsKKwkJCQlzLmFkZCh2KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGVsKSB7CisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hNZXRob2RFcnJvcigiSW50ZXJ2YWxTZXQucmVtb3ZlKCkgdW5pbXBsZW1lbnRlZCIpOworICAgIH0KKworCS8qCisJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKwkJc3VwZXIuZmluYWxpemUoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJzaXplICIraW50ZXJ2YWxzLnNpemUoKSsiICIrc2l6ZSgpKTsKKwl9CisJKi8KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvTXVsdGlNYXAuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvTXVsdGlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGIxYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9NdWx0aU1hcC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIubWlzYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBBIGhhc2ggdGFibGUgdGhhdCBtYXBzIGEga2V5IHRvIGEgbGlzdCBvZiBlbGVtZW50cyBub3QganVzdCBhIHNpbmdsZS4gKi8KK3B1YmxpYyBjbGFzcyBNdWx0aU1hcDxLLCBWPiBleHRlbmRzIExpbmtlZEhhc2hNYXA8SywgTGlzdDxWPj4geworCXB1YmxpYyB2b2lkIG1hcChLIGtleSwgViB2YWx1ZSkgeworCQlMaXN0PFY+IGVsZW1lbnRzRm9yS2V5ID0gZ2V0KGtleSk7CisJCWlmICggZWxlbWVudHNGb3JLZXk9PW51bGwgKSB7CisJCQllbGVtZW50c0ZvcktleSA9IG5ldyBBcnJheUxpc3Q8Vj4oKTsKKwkJCXN1cGVyLnB1dChrZXksIGVsZW1lbnRzRm9yS2V5KTsKKwkJfQorCQllbGVtZW50c0ZvcktleS5hZGQodmFsdWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvTXV0YWJsZUludGVnZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvTXV0YWJsZUludGVnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDIzMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9NdXRhYmxlSW50ZWdlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIubWlzYzsKKworLyoqIEphdmEgd29uJ3QgbGV0IHlvdSBtb2RpZnkgYW4gSW50ZWdlcjsgbm90IHN1cmUgaG93IHRoYXQncyBtb3JlCisgKiAgZWZmaWNpZW50LCBidXQuLi5oZXJlJ3Mgb25lIHRoYXQgbGV0J3MgeW91IG1vZGlmeSBpdC4KKyAqICBGcmlnaHRlbmluZyBJIGhhdmUgdG8gaW1wbGVtZW50IHRoaXMgbXlzZWxmLiBCbGVjaC4KKyAqLworcHVibGljIGNsYXNzIE11dGFibGVJbnRlZ2VyIHsKKwlwdWJsaWMgaW50IHZhbHVlOworCXB1YmxpYyBNdXRhYmxlSW50ZWdlcigpIHsKKwkJdGhpcygwKTsKKwl9CisJcHVibGljIE11dGFibGVJbnRlZ2VyKGludCB2YWx1ZSkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9PcmRlcmVkSGFzaFNldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvbWlzYy9PcmRlcmVkSGFzaFNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWU4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL09yZGVyZWRIYXNoU2V0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIubWlzYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogQSBIYXNoTWFwIHRoYXQgcmVtZW1iZXJzIHRoZSBvcmRlciB0aGF0IHRoZSBlbGVtZW50cyB3ZXJlIGFkZGVkLgorICogIFlvdSBjYW4gYWx0ZXIgdGhlIGl0aCBlbGVtZW50IHdpdGggc2V0KGksdmFsdWUpIHRvbyA6KSAgVW5pcXVlIGxpc3QuCisgKiAgSSBuZWVkIHRoZSByZXBsYWNlL3NldC1lbGVtZW50LWkgZnVuY3Rpb25hbGl0eSBzbyBJJ20gc3ViY2xhc3NpbmcKKyAqICBPcmRlcmVkSGFzaFNldC4KKyAqLworcHVibGljIGNsYXNzIE9yZGVyZWRIYXNoU2V0PFQ+IGV4dGVuZHMgTGlua2VkSGFzaFNldCB7CisgICAgLyoqIFRyYWNrIHRoZSBlbGVtZW50cyBhcyB0aGV5IGFyZSBhZGRlZCB0byB0aGUgc2V0ICovCisgICAgcHJvdGVjdGVkIExpc3Q8VD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisKKyAgICBwdWJsaWMgVCBnZXQoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmdldChpKTsKKyAgICB9CisKKyAgICAvKiogUmVwbGFjZSBhbiBleGlzdGluZyB2YWx1ZSB3aXRoIGEgbmV3IHZhbHVlOyB1cGRhdGVzIHRoZSBlbGVtZW50CisgICAgICogIGxpc3QgYW5kIHRoZSBoYXNoIHRhYmxlLCBidXQgbm90IHRoZSBrZXkgYXMgdGhhdCBoYXMgbm90IGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIFQgc2V0KGludCBpLCBUIHZhbHVlKSB7CisgICAgICAgIFQgb2xkRWxlbWVudCA9IGVsZW1lbnRzLmdldChpKTsKKyAgICAgICAgZWxlbWVudHMuc2V0KGksdmFsdWUpOyAvLyB1cGRhdGUgbGlzdAorICAgICAgICBzdXBlci5yZW1vdmUob2xkRWxlbWVudCk7IC8vIG5vdyB1cGRhdGUgdGhlIHNldDogcmVtb3ZlL2FkZAorICAgICAgICBzdXBlci5hZGQodmFsdWUpOworICAgICAgICByZXR1cm4gb2xkRWxlbWVudDsKKyAgICB9CisKKyAgICAvKiogQWRkIGEgdmFsdWUgdG8gbGlzdDsga2VlcCBpbiBoYXNodGFibGUgZm9yIGNvbnNpc3RlbmN5IGFsc287CisgICAgICogIEtleSBpcyBvYmplY3QgaXRzZWxmLiAgR29vZCBmb3Igc2F5IGFza2luZyBpZiBhIGNlcnRhaW4gc3RyaW5nIGlzIGluCisgICAgICogIGEgbGlzdCBvZiBzdHJpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5hZGQodmFsdWUpOworCQlpZiAoIHJlc3VsdCApIHsgIC8vIG9ubHkgdHJhY2sgaWYgbmV3IGVsZW1lbnQgbm90IGluIHNldAorCQkJZWxlbWVudHMuYWRkKChUKXZhbHVlKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJLyoKKwkJZWxlbWVudHMucmVtb3ZlKG8pOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG8pOworICAgICAgICAqLworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBlbGVtZW50cy5jbGVhcigpOworICAgICAgICBzdXBlci5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gdGhlIExpc3QgaG9sZGluZyBsaXN0IG9mIHRhYmxlIGVsZW1lbnRzLiAgTm90ZSB0aGF0IHlvdSBhcmUKKyAgICAgKiAgTk9UIGdldHRpbmcgYSBjb3B5IHNvIGRvbid0IHdyaXRlIHRvIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFQ+IGVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHM7CisgICAgfQorCisJcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworCQlyZXR1cm4gZWxlbWVudHMuaXRlcmF0b3IoKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKwkJcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKKwl9CisJCisgICAgcHVibGljIGludCBzaXplKCkgeworCQkvKgorCQlpZiAoIGVsZW1lbnRzLnNpemUoKSE9c3VwZXIuc2l6ZSgpICkgeworCQkJRXJyb3JNYW5hZ2VyLmludGVybmFsRXJyb3IoIk9yZGVyZWRIYXNoU2V0OiBlbGVtZW50cyBhbmQgc2V0IHNpemUgZGlmZmVyczsgIisKKwkJCQkJCQkJCSAgIGVsZW1lbnRzLnNpemUoKSsiIT0iK3N1cGVyLnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZWxlbWVudHMudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL1V0aWxzLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci9taXNjL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExNTZkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL21pc2MvVXRpbHMuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLm1pc2M7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgVXRpbHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVJfUE9PTF9NQVhfVkFMVUUgPSAxMDAwOworCXN0YXRpYyBJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW0lOVEVHRVJfUE9PTF9NQVhfVkFMVUUrMV07CisKKwkvKiogSW50ZWdlciBvYmplY3RzIGFyZSBpbW11dGFibGUgc28gc2hhcmUgYWxsIEludGVnZXJzIHdpdGggdGhlCisJICogIHNhbWUgdmFsdWUgdXAgdG8gc29tZSBtYXggc2l6ZS4gIFVzZSBhbiBhcnJheSBhcyBhIHBlcmZlY3QgaGFzaC4KKwkgKiAgUmV0dXJuIHNoYXJlZCBvYmplY3QgZm9yIDAuLklOVEVHRVJfUE9PTF9NQVhfVkFMVUUgb3IgYSBuZXcKKwkgKiAgSW50ZWdlciBvYmplY3Qgd2l0aCB4IGluIGl0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBpbnRlZ2VyKGludCB4KSB7CisJCWlmICggeDwwIHx8IHg+SU5URUdFUl9QT09MX01BWF9WQUxVRSApIHsKKwkJCXJldHVybiBuZXcgSW50ZWdlcih4KTsKKwkJfQorCQlpZiAoIGludHNbeF09PW51bGwgKSB7CisJCQlpbnRzW3hdID0gbmV3IEludGVnZXIoeCk7CisJCX0KKwkJcmV0dXJuIGludHNbeF07CisJfQorCisJLyoqIEdpdmVuIGEgc291cmNlIHN0cmluZywgc3JjLAorCQlhIHN0cmluZyB0byByZXBsYWNlLCByZXBsYWNlZSwKKwkJYW5kIGEgc3RyaW5nIHRvIHJlcGxhY2Ugd2l0aCwgcmVwbGFjZXIsCisJCXJldHVybiBhIG5ldyBzdHJpbmcgdy8gdGhlIHJlcGxhY2luZyBkb25lLgorCQlZb3UgY2FuIHVzZSByZXBsYWNlcj09bnVsbCB0byByZW1vdmUgcmVwbGFjZWUgZnJvbSB0aGUgc3RyaW5nLgorCisJCVRoaXMgc2hvdWxkIGJlIGZhc3RlciB0aGFuIEphdmEncyBTdHJpbmcucmVwbGFjZUFsbCBhcyB0aGF0IG9uZQorCQl1c2VzIHJlZ2V4IChJIG9ubHkgd2FudCB0byBwbGF5IHdpdGggc3RyaW5ncyBhbnl3YXkpLgorCSovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3JjLCBTdHJpbmcgcmVwbGFjZWUsIFN0cmluZyByZXBsYWNlcikgeworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzcmMubGVuZ3RoKCkgKyA1MCk7CisJCWludCBzdGFydEluZGV4ID0gMDsKKwkJaW50IGVuZEluZGV4ID0gc3JjLmluZGV4T2YocmVwbGFjZWUpOworCQl3aGlsZShlbmRJbmRleCAhPSAtMSkgeworCQkJcmVzdWx0LmFwcGVuZChzcmMuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsZW5kSW5kZXgpKTsKKwkJCWlmICggcmVwbGFjZXIhPW51bGwgKSB7CisJCQkJcmVzdWx0LmFwcGVuZChyZXBsYWNlcik7CisJCQl9CisJCQlzdGFydEluZGV4ID0gZW5kSW5kZXggKyByZXBsYWNlZS5sZW5ndGgoKTsKKwkJCWVuZEluZGV4ID0gc3JjLmluZGV4T2YocmVwbGFjZWUsc3RhcnRJbmRleCk7CisJCX0KKwkJcmVzdWx0LmFwcGVuZChzcmMuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsc3JjLmxlbmd0aCgpKSk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKy8vCS8qKiBtaW1pYyBzdHJ1Y3Q7IGxpa2UgYSBub24taXRlcmFibGUgbWFwLiAqLworLy8JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJ1Y3QgeworLy8JCXB1YmxpYyBNYXA8U3RyaW5nLE9iamVjdD4gZmllbGRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLE9iamVjdD4oKTsKKy8vCisvLwkJQE92ZXJyaWRlCisvLwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIGZpZWxkcy50b1N0cmluZygpOyB9CisvLwl9CisvLworLy8JcHVibGljIHN0YXRpYyBTdHJ1Y3Qgc3RydWN0KFN0cmluZyBwcm9wTmFtZXMsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKy8vCQlTdHJpbmdbXSBwcm9wcyA9IHByb3BOYW1lcy5zcGxpdCgiLCIpOworLy8JCWludCBpPTA7CisvLwkJU3RydWN0IHMgPSBuZXcgU3RydWN0KCk7CisvLwkJZm9yIChTdHJpbmcgcCA6IHByb3BzKSBzLmZpZWxkcy5wdXQocCwgdmFsdWVzW2krK10pOworLy8JCXJldHVybiBzOworLy8JfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9BTlRMUkVycm9yTGlzdGVuZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvQU5UTFJFcnJvckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjOTA5NwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvQU5UTFJFcnJvckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCisvKiogRGVmaW5lcyBiZWhhdmlvciBvZiBvYmplY3QgYWJsZSB0byBoYW5kbGUgZXJyb3IgbWVzc2FnZXMgZnJvbSBBTlRMUiBpbmNsdWRpbmcKKyAqICBib3RoIHRvb2wgZXJyb3JzIGxpa2UgImNhbid0IHdyaXRlIGZpbGUiIGFuZCBncmFtbWFyIGFtYmlndWl0eSB3YXJuaW5ncy4KKyAqICBUbyBhdm9pZCBoYXZpbmcgdG8gY2hhbmdlIHRvb2xzIHRoYXQgdXNlIEFOVExSIChsaWtlIEdVSXMpLCBJIGFtCisgKiAgd3JhcHBpbmcgZXJyb3IgZGF0YSBpbiBNZXNzYWdlIG9iamVjdHMgYW5kIHBhc3NpbmcgdGhlbSB0byB0aGUgbGlzdGVuZXIuCisgKiAgSW4gdGhpcyB3YXksIHVzZXJzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBsZXNzIHNlbnNpdGl2ZSB0byBjaGFuZ2VzIGluCisgKiAgdGhlIGluZm8gSSBuZWVkIGZvciBlcnJvciBtZXNzYWdlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBBTlRMUkVycm9yTGlzdGVuZXIgeworCXB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1zZyk7CisJcHVibGljIHZvaWQgZXJyb3IoTWVzc2FnZSBtc2cpOworCXB1YmxpYyB2b2lkIHdhcm5pbmcoTWVzc2FnZSBtc2cpOworCXB1YmxpYyB2b2lkIGVycm9yKFRvb2xNZXNzYWdlIG1zZyk7Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0Fzc2lnblRva2VuVHlwZXNCZWhhdmlvci5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9Bc3NpZ25Ub2tlblR5cGVzQmVoYXZpb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE0ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9Bc3NpZ25Ub2tlblR5cGVzQmVoYXZpb3IuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFzc2lnblRva2VuVHlwZXNXYWxrZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlTm9kZVN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKiogTW92ZSBhbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgZnJvbSBhc3NpZ24udHlwZXMuZyBncmFtbWFyIGZpbGUuICovCitwdWJsaWMgY2xhc3MgQXNzaWduVG9rZW5UeXBlc0JlaGF2aW9yIGV4dGVuZHMgQXNzaWduVG9rZW5UeXBlc1dhbGtlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFVOQVNTSUdORUQgPSBVdGlscy5pbnRlZ2VyKC0xKTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgVU5BU1NJR05FRF9JTl9QQVJTRVJfUlVMRSA9IFV0aWxzLmludGVnZXIoLTIpOworCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsSW50ZWdlcj4gc3RyaW5nTGl0ZXJhbHMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsSW50ZWdlcj4gdG9rZW5zID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworCXByb3RlY3RlZCBNYXA8U3RyaW5nLFN0cmluZz4gYWxpYXNlcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOworCXByb3RlY3RlZCBNYXA8U3RyaW5nLFN0cmluZz4gYWxpYXNlc1JldmVyc2VJbmRleCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisKKwkvKiogVHJhY2sgYWN0dWFsIGxleGVyIHJ1bGUgZGVmcyBzbyB3ZSBkb24ndCBnZXQgcmVwZWF0ZWQgdG9rZW4gZGVmcyBpbgorCSAqICBnZW5lcmF0ZWQgbGV4ZXIuCisJICovCisJcHJvdGVjdGVkIFNldDxTdHJpbmc+IHRva2VuUnVsZURlZnMgPSBuZXcgSGFzaFNldCgpOworCisJcHVibGljIEFzc2lnblRva2VuVHlwZXNCZWhhdmlvcigpIHsKKwkJc3VwZXIobnVsbCk7CisJfQorCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaW5pdChHcmFtbWFyIGcpIHsKKwkJdGhpcy5ncmFtbWFyID0gZzsKKwkJY3VycmVudFJ1bGVOYW1lID0gbnVsbDsKKwkJaWYgKCBzdHJpbmdBbGlhcz09bnVsbCApIHsKKwkJCS8vIG9ubHkgaW5pdCBvbmNlOyBjYW4ndCBzdGF0aWNhbGx5IGluaXQgc2luY2Ugd2UgbmVlZCBhc3RGYWN0b3J5CisJCQlpbml0QVNUUGF0dGVybnMoKTsKKwkJfQorCX0KKworCS8qKiBUcmFjayBzdHJpbmcgbGl0ZXJhbHMgKGNvdWxkIGJlIGluIHRva2Vuc3t9IHNlY3Rpb24pICovCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdHJhY2tTdHJpbmcoR3JhbW1hckFTVCB0KSB7CisJCS8vIGlmIGxleGVyLCBkb24ndCBhbGxvdyBhbGlhc2luZyBpbiB0b2tlbnMgc2VjdGlvbgorCQlpZiAoIGN1cnJlbnRSdWxlTmFtZT09bnVsbCAmJiBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX0FMSUFTX1RPS0VOU19JTl9MRVhFUiwKKwkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCSAgdC50b2tlbiwKKwkJCQkJCQkJCSAgdC5nZXRUZXh0KCkpOworCQkJcmV0dXJuOworCQl9CisJCS8vIGluIGEgcGxhaW4gcGFyc2VyIGdyYW1tYXIgcnVsZSwgY2Fubm90IHJlZmVyZW5jZSBsaXRlcmFscworCQkvLyAodW5sZXNzIGRlZmluZWQgcHJldmlvdXNseSB2aWEgdG9rZW5Wb2NhYiBvcHRpb24pCisJCS8vIGRvbid0IHdhcm4gdW50aWwgd2UgaGl0IHJvb3QgZ3JhbW1hciBhcyBtYXkgYmUgZGVmaW5lZCB0aGVyZS4KKwkJaWYgKCBncmFtbWFyLmdldEdyYW1tYXJJc1Jvb3QoKSAmJgorCQkJIGdyYW1tYXIudHlwZT09R3JhbW1hci5QQVJTRVIgJiYKKwkJCSBncmFtbWFyLmdldFRva2VuVHlwZSh0LmdldFRleHQoKSk9PSBMYWJlbC5JTlZBTElEICkKKwkJeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0xJVEVSQUxfTk9UX0FTU09DSUFURURfV0lUSF9MRVhFUl9SVUxFLAorCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJICB0LnRva2VuLAorCQkJCQkJCQkJICB0LmdldFRleHQoKSk7CisJCX0KKwkJLy8gRG9uJ3QgcmVjb3JkIGxpdGVyYWxzIGZvciBsZXhlcnMsIHRoZXkgYXJlIHRoaW5ncyB0byBtYXRjaCBub3QgdG9rZW5zCisJCWlmICggZ3JhbW1hci50eXBlPT1HcmFtbWFyLkxFWEVSICkgeworCQkJcmV0dXJuOworCQl9CisJCS8vIG90aGVyd2lzZSBhZGQgbGl0ZXJhbCB0byB0b2tlbiB0eXBlcyBpZiByZWZlcmVuY2VkIGZyb20gcGFyc2VyIHJ1bGUKKwkJLy8gb3IgaW4gdGhlIHRva2Vuc3t9IHNlY3Rpb24KKwkJaWYgKCAoY3VycmVudFJ1bGVOYW1lPT1udWxsIHx8CisJCQkgIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjdXJyZW50UnVsZU5hbWUuY2hhckF0KDApKSkgJiYKKwkJCQkJCQkJCQkJCQkJCQlncmFtbWFyLmdldFRva2VuVHlwZSh0LmdldFRleHQoKSk9PUxhYmVsLklOVkFMSUQgKQorCQl7CisJCQlzdHJpbmdMaXRlcmFscy5wdXQodC5nZXRUZXh0KCksIFVOQVNTSUdORURfSU5fUEFSU0VSX1JVTEUpOworCQl9CisJfQorCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdHJhY2tUb2tlbihHcmFtbWFyQVNUIHQpIHsKKwkJLy8gaW1wb3J0ZWQgdG9rZW4gbmFtZXMgbWlnaHQgZXhpc3QsIG9ubHkgYWRkIGlmIG5ldworCQkvLyBNaWdodCBoYXZlICc7Jz00IGluIHZvY2FiIGltcG9ydCBhbmQgU0VNST0nOycuIEF2b2lkCisJCS8vIHNldHRpbmcgdG8gVU5BU1NJR05FRCBpZiB3ZSBoYXZlIGxvYWRlZCAnOycvU0VNSQorCQlpZiAoIGdyYW1tYXIuZ2V0VG9rZW5UeXBlKHQuZ2V0VGV4dCgpKT09TGFiZWwuSU5WQUxJRCAmJgorCQkJIHRva2Vucy5nZXQodC5nZXRUZXh0KCkpPT1udWxsICkKKwkJeworCQkJdG9rZW5zLnB1dCh0LmdldFRleHQoKSwgVU5BU1NJR05FRCk7CisJCX0KKwl9CisKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCB0cmFja1Rva2VuUnVsZShHcmFtbWFyQVNUIHQsCisJCQkJCQkJCSAgR3JhbW1hckFTVCBtb2RpZmllciwKKwkJCQkJCQkJICBHcmFtbWFyQVNUIGJsb2NrKQorCXsKKwkJLy8gaW1wb3J0ZWQgdG9rZW4gbmFtZXMgbWlnaHQgZXhpc3QsIG9ubHkgYWRkIGlmIG5ldworCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiB8fCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuQ09NQklORUQgKSB7CisJCQlpZiAoICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UodC5nZXRUZXh0KCkuY2hhckF0KDApKSApIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIHQuZ2V0VGV4dCgpLmVxdWFscyhHcmFtbWFyLkFSVElGSUNJQUxfVE9LRU5TX1JVTEVOQU1FKSApIHsKKwkJCQkvLyBkb24ndCBhZGQgVG9rZW5zIHJ1bGUKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIHRyYWNrIGFsbCBsZXhlciBydWxlcyBzbyB3ZSBjYW4gbG9vayBmb3IgdG9rZW4gcmVmcyB3L28KKwkJCS8vIGFzc29jaWF0ZWQgbGV4ZXIgcnVsZXMuCisJCQlncmFtbWFyLmNvbXBvc2l0ZS5sZXhlclJ1bGVzLmFkZCh0LmdldFRleHQoKSk7CisKKwkJCWludCBleGlzdGluZyA9IGdyYW1tYXIuZ2V0VG9rZW5UeXBlKHQuZ2V0VGV4dCgpKTsKKwkJCWlmICggZXhpc3Rpbmc9PUxhYmVsLklOVkFMSUQgKSB7CisJCQkJdG9rZW5zLnB1dCh0LmdldFRleHQoKSwgVU5BU1NJR05FRCk7CisJCQl9CisJCQkvLyBsb29rIGZvciAiPFRPS0VOPiA6IDxsaXRlcmFsPiA7IiBwYXR0ZXJuCisJCQkvLyAoY2FuIGhhdmUgb3B0aW9uYWwgYWN0aW9uIGxhc3QpCisJCQlpZiAoIGJsb2NrLmhhc1NhbWVUcmVlU3RydWN0dXJlKGNoYXJBbGlhcykgfHwKKwkJCQkgYmxvY2suaGFzU2FtZVRyZWVTdHJ1Y3R1cmUoc3RyaW5nQWxpYXMpIHx8CisJCQkJIGJsb2NrLmhhc1NhbWVUcmVlU3RydWN0dXJlKGNoYXJBbGlhczIpIHx8CisJCQkJIGJsb2NrLmhhc1NhbWVUcmVlU3RydWN0dXJlKHN0cmluZ0FsaWFzMikgKQorCQkJeworCQkJCXRva2VuUnVsZURlZnMuYWRkKHQuZ2V0VGV4dCgpKTsKKwkJCQkvKgorCQkJR3JhbW1hciBwYXJlbnQgPSBncmFtbWFyLmNvbXBvc2l0ZS5nZXREZWxlZ2F0b3IoZ3JhbW1hcik7CisJCQlib29sZWFuIGltcG9ydGVkQnlQYXJzZXJPckNvbWJpbmVkID0KKwkJCQlwYXJlbnQhPW51bGwgJiYKKwkJCQkocGFyZW50LnR5cGU9PUdyYW1tYXIuTEVYRVJ8fHBhcmVudC50eXBlPT1HcmFtbWFyLlBBUlNFUik7CisJCQkJKi8KKwkJCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5DT01CSU5FRCB8fCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKSB7CisJCQkJCS8vIG9ubHkgY2FsbCB0aGlzIHJ1bGUgYW4gYWxpYXMgaWYgY29tYmluZWQgb3IgbGV4ZXIKKwkJCQkJYWxpYXModCwgKEdyYW1tYXJBU1QpYmxvY2suZ2V0Q2hpbGQoMCkuZ2V0Q2hpbGQoMCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBlbHNlIGVycm9yCisJfQorCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYWxpYXMoR3JhbW1hckFTVCB0LCBHcmFtbWFyQVNUIHMpIHsKKwkJU3RyaW5nIHRva2VuSUQgPSB0LmdldFRleHQoKTsKKwkJU3RyaW5nIGxpdGVyYWwgPSBzLmdldFRleHQoKTsKKwkJU3RyaW5nIHByZXZBbGlhc0xpdGVyYWxJRCA9IGFsaWFzZXNSZXZlcnNlSW5kZXguZ2V0KGxpdGVyYWwpOworCQlpZiAoIHByZXZBbGlhc0xpdGVyYWxJRCE9bnVsbCApIHsgLy8gd2UndmUgc2VlbiB0aGlzIGxpdGVyYWwgYmVmb3JlCisJCQlpZiAoIHRva2VuSUQuZXF1YWxzKHByZXZBbGlhc0xpdGVyYWxJRCkgKSB7CisJCQkJLy8gZHVwbGljYXRlIGJ1dCBpZGVudGljYWwgYWxpYXM7IG1pZ2h0IGJlIHRva2VucyB7QT0nYSd9IGFuZAorCQkJCS8vIGxleGVyIHJ1bGUgQSA6ICdhJyA7ICBJcyBvaywganVzdCByZXR1cm4KKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIGdpdmUgZXJyb3IgdW5sZXNzIGJvdGggYXJlIHJ1bGVzIChvayBpZiBvbmUgaXMgaW4gdG9rZW5zIHNlY3Rpb24pCisJCQlpZiAoICEodG9rZW5SdWxlRGVmcy5jb250YWlucyh0b2tlbklEKSAmJiB0b2tlblJ1bGVEZWZzLmNvbnRhaW5zKHByZXZBbGlhc0xpdGVyYWxJRCkpICkKKwkJCXsKKwkJCQkvLyBkb24ndCBhbGxvdyBhbGlhcyBpZiBBPSdhJyBpbiB0b2tlbnMgc2VjdGlvbiBhbmQgQiA6ICdhJzsgaXMgcnVsZS4KKwkJCQkvLyBBbGxvdyBpZiBib3RoIGFyZSBydWxlcy4gIFdpbGwgZ2V0IERGQSBub25kZXRlcm1pbmlzbSBlcnJvciBsYXRlci4KKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfVE9LRU5fQUxJQVNfQ09ORkxJQ1QsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgdC50b2tlbiwKKwkJCQkJCQkJCQkgIHRva2VuSUQrIj0iK2xpdGVyYWwsCisJCQkJCQkJCQkJICBwcmV2QWxpYXNMaXRlcmFsSUQpOworCQkJfQorCQkJcmV0dXJuOyAvLyBkb24ndCBkbyB0aGUgYWxpYXMKKwkJfQorCQlpbnQgZXhpc3RpbmdMaXRlcmFsVHlwZSA9IGdyYW1tYXIuZ2V0VG9rZW5UeXBlKGxpdGVyYWwpOworCQlpZiAoIGV4aXN0aW5nTGl0ZXJhbFR5cGUgIT1MYWJlbC5JTlZBTElEICkgeworCQkJLy8gd2UndmUgc2VlbiB0aGlzIGJlZm9yZSBmcm9tIGEgdG9rZW5Wb2NhYiBtb3N0IGxpa2VseQorCQkJLy8gZG9uJ3QgYXNzaWduIGEgbmV3IHRva2VuIHR5cGU7IHVzZSBleGlzdGluZ0xpdGVyYWxUeXBlLgorCQkJdG9rZW5zLnB1dCh0b2tlbklELCBleGlzdGluZ0xpdGVyYWxUeXBlKTsKKwkJfQorCQlTdHJpbmcgcHJldkFsaWFzVG9rZW5JRCA9IGFsaWFzZXMuZ2V0KHRva2VuSUQpOworCQlpZiAoIHByZXZBbGlhc1Rva2VuSUQhPW51bGwgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfVE9LRU5fQUxJQVNfUkVBU1NJR05NRU5ULAorCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJICB0LnRva2VuLAorCQkJCQkJCQkJICB0b2tlbklEKyI9IitsaXRlcmFsLAorCQkJCQkJCQkJICBwcmV2QWxpYXNUb2tlbklEKTsKKwkJCXJldHVybjsgLy8gZG9uJ3QgZG8gdGhlIGFsaWFzCisJCX0KKwkJYWxpYXNlcy5wdXQodG9rZW5JRCwgbGl0ZXJhbCk7CisJCWFsaWFzZXNSZXZlcnNlSW5kZXgucHV0KGxpdGVyYWwsIHRva2VuSUQpOworCX0KKworICAgIEBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlZmluZVRva2VucyhHcmFtbWFyIHJvb3QpIHsKKy8qCisJU3lzdGVtLm91dC5wcmludGxuKCJzdHJpbmdMaXRlcmFscz0iK3N0cmluZ0xpdGVyYWxzKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oInRva2Vucz0iK3Rva2Vucyk7CisJU3lzdGVtLm91dC5wcmludGxuKCJhbGlhc2VzPSIrYWxpYXNlcyk7CisJU3lzdGVtLm91dC5wcmludGxuKCJhbGlhc2VzUmV2ZXJzZUluZGV4PSIrYWxpYXNlc1JldmVyc2VJbmRleCk7CisqLworCisJCWFzc2lnblRva2VuSURUeXBlcyhyb290KTsKKworCQlhbGlhc1Rva2VuSURzQW5kTGl0ZXJhbHMocm9vdCk7CisKKwkJYXNzaWduU3RyaW5nVHlwZXMocm9vdCk7CisKKy8qCisJU3lzdGVtLm91dC5wcmludGxuKCJzdHJpbmdMaXRlcmFscz0iK3N0cmluZ0xpdGVyYWxzKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oInRva2Vucz0iK3Rva2Vucyk7CisJU3lzdGVtLm91dC5wcmludGxuKCJhbGlhc2VzPSIrYWxpYXNlcyk7CisqLworCQlkZWZpbmVUb2tlbk5hbWVzQW5kTGl0ZXJhbHNJbkdyYW1tYXIocm9vdCk7CisJfQorCisvKgorcHJvdGVjdGVkIHZvaWQgZGVmaW5lU3RyaW5nTGl0ZXJhbHNGcm9tRGVsZWdhdGVzKCkgeworCSBpZiAoIGdyYW1tYXIuZ2V0R3JhbW1hcklzTWFzdGVyKCkgJiYgZ3JhbW1hci50eXBlPT1HcmFtbWFyLkNPTUJJTkVEICkgeworCQkgTGlzdDxHcmFtbWFyPiBkZWxlZ2F0ZXMgPSBncmFtbWFyLmdldERlbGVnYXRlcygpOworCQkgU3lzdGVtLm91dC5wcmludGxuKCJkZWxlZ2F0ZXMgaW4gbWFzdGVyIGNvbWJpbmVkOiAiK2RlbGVnYXRlcyk7CisJCSBmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlcy5zaXplKCk7IGkrKykgeworCQkJIEdyYW1tYXIgZCA9IChHcmFtbWFyKSBkZWxlZ2F0ZXMuZ2V0KGkpOworCQkJIFNldDxTdHJpbmc+IGxpdGVyYWxzID0gZC5nZXRTdHJpbmdMaXRlcmFscygpOworCQkJIGZvciAoSXRlcmF0b3IgaXQgPSBsaXRlcmFscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQkJIFN0cmluZyBsaXRlcmFsID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oImxpdGVyYWwgIitsaXRlcmFsKTsKKwkJCQkgaW50IHR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUobGl0ZXJhbCk7CisJCQkJIGdyYW1tYXIuZGVmaW5lTGV4ZXJSdWxlRm9yU3RyaW5nTGl0ZXJhbChsaXRlcmFsLCB0dHlwZSk7CisJCQkgfQorCQkgfQorCSB9Cit9CisqLworCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgYXNzaWduU3RyaW5nVHlwZXMoR3JhbW1hciByb290KSB7CisJCS8vIHdhbGsgc3RyaW5nIGxpdGVyYWxzIGFzc2lnbmluZyB0eXBlcyB0byB1bmFzc2lnbmVkIG9uZXMKKwkJU2V0IHMgPSBzdHJpbmdMaXRlcmFscy5rZXlTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJU3RyaW5nIGxpdCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCUludGVnZXIgb2xkVHlwZUkgPSAoSW50ZWdlcilzdHJpbmdMaXRlcmFscy5nZXQobGl0KTsKKwkJCWludCBvbGRUeXBlID0gb2xkVHlwZUkuaW50VmFsdWUoKTsKKwkJCWlmICggb2xkVHlwZTxMYWJlbC5NSU5fVE9LRU5fVFlQRSApIHsKKwkJCQlJbnRlZ2VyIHR5cGVJID0gVXRpbHMuaW50ZWdlcihyb290LmdldE5ld1Rva2VuVHlwZSgpKTsKKwkJCQlzdHJpbmdMaXRlcmFscy5wdXQobGl0LCB0eXBlSSk7CisJCQkJLy8gaWYgc3RyaW5nIHJlZmVyZW5jZWQgaW4gY29tYmluZWQgZ3JhbW1hciBwYXJzZXIgcnVsZSwKKwkJCQkvLyBhdXRvbWF0aWNhbGx5IGRlZmluZSBpbiB0aGUgZ2VuZXJhdGVkIGxleGVyCisJCQkJcm9vdC5kZWZpbmVMZXhlclJ1bGVGb3JTdHJpbmdMaXRlcmFsKGxpdCwgdHlwZUkuaW50VmFsdWUoKSk7CisJCQl9CisJCX0KKwl9CisKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhbGlhc1Rva2VuSURzQW5kTGl0ZXJhbHMoR3JhbW1hciByb290KSB7CisJCWlmICggcm9vdC50eXBlPT1HcmFtbWFyLkxFWEVSICkgeworCQkJcmV0dXJuOyAvLyBzdHJpbmdzL2NoYXJzIGFyZSBuZXZlciB0b2tlbiB0eXBlcyBpbiBMRVhFUgorCQl9CisJCS8vIHdhbGsgYWxpYXNlcyBpZiBhbnkgYW5kIGFzc2lnbiB0eXBlcyB0byBhbGlhc2VkIGxpdGVyYWxzIGlmIGxpdGVyYWwKKwkJLy8gd2FzIHJlZmVyZW5jZWQKKwkJU2V0IHMgPSBhbGlhc2VzLmtleVNldCgpOworCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgdG9rZW5JRCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCVN0cmluZyBsaXRlcmFsID0gKFN0cmluZylhbGlhc2VzLmdldCh0b2tlbklEKTsKKwkJCWlmICggbGl0ZXJhbC5jaGFyQXQoMCk9PSdcJycgJiYgc3RyaW5nTGl0ZXJhbHMuZ2V0KGxpdGVyYWwpIT1udWxsICkgeworCQkJCXN0cmluZ0xpdGVyYWxzLnB1dChsaXRlcmFsLCB0b2tlbnMuZ2V0KHRva2VuSUQpKTsKKwkJCQkvLyBhbiBhbGlhcyBzdGlsbCBtZWFucyB5b3UgbmVlZCBhIGxleGVyIHJ1bGUgZm9yIGl0CisJCQkJSW50ZWdlciB0eXBlSSA9IChJbnRlZ2VyKXRva2Vucy5nZXQodG9rZW5JRCk7CisJCQkJaWYgKCAhdG9rZW5SdWxlRGVmcy5jb250YWlucyh0b2tlbklEKSApIHsKKwkJCQkJcm9vdC5kZWZpbmVMZXhlclJ1bGVGb3JBbGlhc2VkU3RyaW5nTGl0ZXJhbCh0b2tlbklELCBsaXRlcmFsLCB0eXBlSS5pbnRWYWx1ZSgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBhc3NpZ25Ub2tlbklEVHlwZXMoR3JhbW1hciByb290KSB7CisJCS8vIHdhbGsgdG9rZW4gbmFtZXMsIGFzc2lnbmluZyB2YWx1ZXMgaWYgdW5hc3NpZ25lZAorCQlTZXQgcyA9IHRva2Vucy5rZXlTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJU3RyaW5nIHRva2VuSUQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQlpZiAoIHRva2Vucy5nZXQodG9rZW5JRCk9PVVOQVNTSUdORUQgKSB7CisJCQkJdG9rZW5zLnB1dCh0b2tlbklELCBVdGlscy5pbnRlZ2VyKHJvb3QuZ2V0TmV3VG9rZW5UeXBlKCkpKTsKKwkJCX0KKwkJfQorCX0KKworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGRlZmluZVRva2VuTmFtZXNBbmRMaXRlcmFsc0luR3JhbW1hcihHcmFtbWFyIHJvb3QpIHsKKwkJU2V0IHMgPSB0b2tlbnMua2V5U2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyB0b2tlbklEID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJaW50IHR0eXBlID0gKChJbnRlZ2VyKXRva2Vucy5nZXQodG9rZW5JRCkpLmludFZhbHVlKCk7CisJCQlyb290LmRlZmluZVRva2VuKHRva2VuSUQsIHR0eXBlKTsKKwkJfQorCQlzID0gc3RyaW5nTGl0ZXJhbHMua2V5U2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyBsaXQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQlpbnQgdHR5cGUgPSAoKEludGVnZXIpc3RyaW5nTGl0ZXJhbHMuZ2V0KGxpdCkpLmludFZhbHVlKCk7CisJCQlyb290LmRlZmluZVRva2VuKGxpdCwgdHR5cGUpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0F0dHJpYnV0ZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9BdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODM0ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9BdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKKy8qKiBUcmFjayB0aGUgbmFtZXMgb2YgYXR0cmlidXRlcyBkZWZpbmUgaW4gYXJnIGxpc3RzLCByZXR1cm4gdmFsdWVzLAorICogIHNjb3BlIGJsb2NrcyBldGMuLi4KKyAqLworcHVibGljIGNsYXNzIEF0dHJpYnV0ZSB7CisJLyoqIFRoZSBlbnRpcmUgZGVjbGFyYXRpb24gc3VjaCBhcyAiU3RyaW5nIGZvbzsiICovCisJcHVibGljIFN0cmluZyBkZWNsOworCisJLyoqIFRoZSB0eXBlOyBtaWdodCBiZSBlbXB0eSBzdWNoIGFzIGZvciBQeXRob24gd2hpY2ggaGFzIG5vIHN0YXRpYyB0eXBpbmcgKi8KKwlwdWJsaWMgU3RyaW5nIHR5cGU7CisKKwkvKiogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAiZm9vIiAqLworCXB1YmxpYyBTdHJpbmcgbmFtZTsKKworCS8qKiBUaGUgb3B0aW9uYWwgYXR0cmlidXRlIGludGlhbGl6YXRpb24gZXhwcmVzc2lvbiAqLworCXB1YmxpYyBTdHJpbmcgaW5pdFZhbHVlOworCisJcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgZGVjbCkgeworCQlleHRyYWN0QXR0cmlidXRlKGRlY2wpOworCX0KKworCXB1YmxpYyBBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWNsKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuZGVjbCA9IGRlY2w7CisJfQorCisJLyoqIEZvciBkZWNscyBsaWtlICJTdHJpbmcgZm9vIiBvciAiY2hhciAqZm9vMzJbM10iIGNvbXB1dGUgdGhlIElECisJICogIGFuZCB0eXBlIGRlY2xhcmF0aW9ucy4gIEFsc28gaGFuZGxlICJpbnQgeD0zIiBhbmQgJ1QgdCA9IG5ldyBUKCJmb28iKScKKwkgKiAgYnV0IGlmIHRoZSBzZXBhcmF0b3IgaXMgJywnIHlvdSBjYW5ub3QgdXNlICcsJyBpbiB0aGUgaW5pdHZhbHVlLgorCSAqICBBdHRyaWJ1dGVTY29wZS5hZGRBdHRyaWJ1dGVzIHRha2VzIGNhcmUgb2YgdGhlIHNlcGFyYXRpb24gc28gd2UgYXJlCisJICogIGZyZWUgaGVyZSB0byB1c2UgZnJvbSAnPScgdG8gZW5kIG9mIHN0cmluZyBhcyB0aGUgZXhwcmVzc2lvbi4KKwkgKgorCSAqICBTZXQgbmFtZSwgdHlwZSwgaW5pdHZhbHVlLCBhbmQgZnVsbCBkZWNsIGluc3RhbmNlIHZhcnMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZXh0cmFjdEF0dHJpYnV0ZShTdHJpbmcgZGVjbCkgeworCQlpZiAoIGRlY2w9PW51bGwgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJYm9vbGVhbiBpbklEID0gZmFsc2U7CisJCWludCBzdGFydCA9IC0xOworCQlpbnQgcmlnaHRFZGdlT2ZEZWNsYXJhdG9yID0gZGVjbC5sZW5ndGgoKS0xOworCQlpbnQgZXF1YWxzSW5kZXggPSBkZWNsLmluZGV4T2YoJz0nKTsKKwkJaWYgKCBlcXVhbHNJbmRleD4wICkgeworCQkJLy8gZXZlcnl0aGluZyBhZnRlciB0aGUgJz0nIGlzIHRoZSBpbml0IHZhbHVlCisJCQl0aGlzLmluaXRWYWx1ZSA9IGRlY2wuc3Vic3RyaW5nKGVxdWFsc0luZGV4KzEsZGVjbC5sZW5ndGgoKSk7CisJCQlyaWdodEVkZ2VPZkRlY2xhcmF0b3IgPSBlcXVhbHNJbmRleC0xOworCQl9CisJCS8vIHdhbGsgYmFja3dhcmRzIGxvb2tpbmcgZm9yIHN0YXJ0IG9mIGFuIElECisJCWZvciAoaW50IGk9cmlnaHRFZGdlT2ZEZWNsYXJhdG9yOyBpPj0wOyBpLS0pIHsKKwkJCS8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGVuZCB5ZXQsIGtlZXAgZ29pbmcKKwkJCWlmICggIWluSUQgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChkZWNsLmNoYXJBdChpKSkgKSB7CisJCQkgICAgaW5JRCA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmICggaW5JRCAmJgorCQkJCSAgICAgICEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChkZWNsLmNoYXJBdChpKSl8fAorCQkJCSAgICAgICBkZWNsLmNoYXJBdChpKT09J18nKSApIHsKKwkJCQlzdGFydCA9IGkrMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIHN0YXJ0PDAgJiYgaW5JRCApIHsKKwkJCXN0YXJ0ID0gMDsKKwkJfQorCQlpZiAoIHN0YXJ0PDAgKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfRklORF9BVFRSSUJVVEVfTkFNRV9JTl9ERUNMLGRlY2wpOworCQl9CisJCS8vIHdhbGsgZm9yd2FyZHMgbG9va2luZyBmb3IgZW5kIG9mIGFuIElECisJCWludCBzdG9wPS0xOworCQlmb3IgKGludCBpPXN0YXJ0OyBpPD1yaWdodEVkZ2VPZkRlY2xhcmF0b3I7IGkrKykgeworCQkJLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCB0aGUgZW5kIHlldCwga2VlcCBnb2luZworCQkJaWYgKCAhKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZGVjbC5jaGFyQXQoaSkpfHwKKwkJCQlkZWNsLmNoYXJBdChpKT09J18nKSApCisJCQl7CisJCQkJc3RvcCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIGk9PXJpZ2h0RWRnZU9mRGVjbGFyYXRvciApIHsKKwkJCQlzdG9wID0gaSsxOworCQkJfQorCQl9CisKKwkJLy8gdGhlIG5hbWUgaXMgdGhlIGxhc3QgSUQKKwkJdGhpcy5uYW1lID0gZGVjbC5zdWJzdHJpbmcoc3RhcnQsc3RvcCk7CisKKwkJLy8gdGhlIHR5cGUgaXMgdGhlIGRlY2wgbWludXMgdGhlIElEIChjb3VsZCBiZSBlbXB0eSkKKwkJdGhpcy50eXBlID0gZGVjbC5zdWJzdHJpbmcoMCxzdGFydCk7CisJCWlmICggc3RvcDw9cmlnaHRFZGdlT2ZEZWNsYXJhdG9yICkgeworCQkJdGhpcy50eXBlICs9IGRlY2wuc3Vic3RyaW5nKHN0b3AscmlnaHRFZGdlT2ZEZWNsYXJhdG9yKzEpOworCQl9CisJCXRoaXMudHlwZSA9IHR5cGUudHJpbSgpOworCQlpZiAoIHRoaXMudHlwZS5sZW5ndGgoKT09MCApIHsKKwkJCXRoaXMudHlwZSA9IG51bGw7CisJCX0KKworCQl0aGlzLmRlY2wgPSBkZWNsOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmICggaW5pdFZhbHVlIT1udWxsICkgeworCQkJcmV0dXJuIHR5cGUrIiAiK25hbWUrIj0iK2luaXRWYWx1ZTsKKwkJfQorCQlyZXR1cm4gdHlwZSsiICIrbmFtZTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvQXR0cmlidXRlU2NvcGUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvQXR0cmlidXRlU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY0MWRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9BdHRyaWJ1dGVTY29wZS5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqIFRyYWNrIHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiBhIHNjb3BlLiAgQSBuYW1lZCBzY29wZWQgaGFzIGp1c3QgaXRzIGxpc3QKKyAqICBvZiBhdHRyaWJ1dGVzLiAgRWFjaCBydWxlIGhhcyBwb3RlbnRpYWxseSAzIHNjb3BlczogcmV0dXJuIHZhbHVlcywKKyAqICBwYXJhbWV0ZXJzLCBhbmQgYW4gaW1wbGljaXRseS1uYW1lZCBzY29wZSAoaS5lLiwgYSBzY29wZSBkZWZpbmVkIGluIGEgcnVsZSkuCisgKiAgSW1wbGljaXRseS1kZWZpbmVkIHNjb3BlcyBhcmUgbmFtZWQgYWZ0ZXIgdGhlIHJ1bGU7IHJ1bGVzIGFuZCBzY29wZXMgdGhlbgorICogIG11c3QgbGl2ZSBpbiB0aGUgc2FtZSBuYW1lIHNwYWNlLS1ubyBjb2xsaXNpb25zIGFsbG93ZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGVTY29wZSB7CisKKwkvKiogQWxsIHRva2VuIHNjb3BlcyAodG9rZW4gbGFiZWxzKSBzaGFyZSB0aGUgc2FtZSBmaXhlZCBzY29wZSBvZgorCSAqICBvZiBwcmVkZWZpbmVkIGF0dHJpYnV0ZXMuICBJIGtlZXAgdGhpcyBvdXQgb2YgdGhlIHJ1bnRpbWUuVG9rZW4KKwkgKiAgb2JqZWN0IHRvIGF2b2lkIGEgcnVudGltZSBzcGFjZSBidXJkZW4uCisJICovCisJcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVTY29wZSB0b2tlblNjb3BlID0gbmV3IEF0dHJpYnV0ZVNjb3BlKCJUb2tlbiIsbnVsbCk7CisJc3RhdGljIHsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoInRleHQiLCBudWxsKTsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoInR5cGUiLCBudWxsKTsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoImxpbmUiLCBudWxsKTsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoImluZGV4IiwgbnVsbCk7CisJCXRva2VuU2NvcGUuYWRkQXR0cmlidXRlKCJwb3MiLCBudWxsKTsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoImNoYW5uZWwiLCBudWxsKTsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoInRyZWUiLCBudWxsKTsKKwkJdG9rZW5TY29wZS5hZGRBdHRyaWJ1dGUoImludCIsIG51bGwpOworCX0KKworCS8qKiBUaGlzIHNjb3BlIGlzIGFzc29jaWF0ZWQgd2l0aCB3aGljaCBpbnB1dCB0b2tlbiAoZm9yIGVycm9yIGhhbmRsaW5nKT8gKi8KKwlwdWJsaWMgVG9rZW4gZGVyaXZlZEZyb21Ub2tlbjsKKworCXB1YmxpYyBHcmFtbWFyIGdyYW1tYXI7CisKKwkvKiogVGhlIHNjb3BlIG5hbWUgKi8KKwlwcml2YXRlIFN0cmluZyBuYW1lOworCisJLyoqIE5vdCBhIHJ1bGUgc2NvcGUsIGJ1dCB2aXNpYmxlIHRvIGFsbCBydWxlcyAic2NvcGUgc3ltYm9scyB7IC4uLn0iICovCisJcHVibGljIGJvb2xlYW4gaXNEeW5hbWljR2xvYmFsU2NvcGU7CisKKwkvKiogVmlzaWJsZSB0byBhbGwgcnVsZXMsIGJ1dCBkZWZpbmVkIGluIHJ1bGUgInNjb3BlIHsgaW50IGk7IH0iICovCisJcHVibGljIGJvb2xlYW4gaXNEeW5hbWljUnVsZVNjb3BlOworCisJcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJTY29wZTsKKworCXB1YmxpYyBib29sZWFuIGlzUmV0dXJuU2NvcGU7CisKKwlwdWJsaWMgYm9vbGVhbiBpc1ByZWRlZmluZWRSdWxlU2NvcGU7CisKKwlwdWJsaWMgYm9vbGVhbiBpc1ByZWRlZmluZWRMZXhlclJ1bGVTY29wZTsKKworCS8qKiBUaGUgbGlzdCBvZiBBdHRyaWJ1dGUgb2JqZWN0cyAqLworCXByb3RlY3RlZCBMaW5rZWRIYXNoTWFwPFN0cmluZyxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworCisJLyogUGxhY2Vob2xkZXIgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ1NoYXJwMyB0YXJnZXQuICovCisJcHVibGljIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBHcmFtbWFyQVNUPiBhY3Rpb25zID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKworCXB1YmxpYyBBdHRyaWJ1dGVTY29wZShTdHJpbmcgbmFtZSwgVG9rZW4gZGVyaXZlZEZyb21Ub2tlbikgeworCQl0aGlzKG51bGwsbmFtZSxkZXJpdmVkRnJvbVRva2VuKTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlU2NvcGUoR3JhbW1hciBncmFtbWFyLCBTdHJpbmcgbmFtZSwgVG9rZW4gZGVyaXZlZEZyb21Ub2tlbikgeworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmRlcml2ZWRGcm9tVG9rZW4gPSBkZXJpdmVkRnJvbVRva2VuOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJaWYgKCBpc1BhcmFtZXRlclNjb3BlICkgeworCQkJcmV0dXJuIG5hbWUrIl9wYXJhbWV0ZXIiOworCQl9CisJCWVsc2UgaWYgKCBpc1JldHVyblNjb3BlICkgeworCQkJcmV0dXJuIG5hbWUrIl9yZXR1cm4iOworCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKiBGcm9tIGEgY2h1bmsgb2YgdGV4dCBob2xkaW5nIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYXR0cmlidXRlcywKKwkgKiAgcHVsbCB0aGVtIGFwYXJ0IGFuZCBjcmVhdGUgYW4gQXR0cmlidXRlIGZvciBlYWNoIG9uZS4gIEFkZCB0bworCSAqICB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIHNjb3BlLiAgUGFzcyBpbiB0aGUgY2hhcmFjdGVyCisJICogIHRoYXQgdGVybWluYXRlcyBhIGRlZmluaXRpb24gc3VjaCBhcyAnLCcgb3IgJzsnLiAgRm9yIGV4YW1wbGUsCisJICoKKwkgKiAgc2NvcGUgc3ltYm9scyB7CisJICogIAlpbnQgbjsKKwkgKiAgCUxpc3QgbmFtZXM7CisJICogIH0KKwkgKgorCSAqICB3b3VsZCBwYXNzIGluIGRlZmluaXRpb25zIGVxdWFsIHRvIHRoZSB0ZXh0IGluIGJldHdlZW4gey4uLn0gYW5kCisJICogIHNlcGFyYXRvcj0nOycuICBJdCByZXN1bHRzIGluIHR3byBBdHRyaWJ1dGUgb2JqZWN0cy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKFN0cmluZyBkZWZpbml0aW9ucywgaW50IHNlcGFyYXRvcikgeworCQlMaXN0PFN0cmluZz4gYXR0cnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJQ29kZUdlbmVyYXRvci5nZXRMaXN0T2ZBcmd1bWVudHNGcm9tQWN0aW9uKGRlZmluaXRpb25zLDAsLTEsc2VwYXJhdG9yLGF0dHJzKTsKKwkJZm9yIChTdHJpbmcgYSA6IGF0dHJzKSB7CisJCQlBdHRyaWJ1dGUgYXR0ciA9IG5ldyBBdHRyaWJ1dGUoYSk7CisJCQlpZiAoICFpc1JldHVyblNjb3BlICYmIGF0dHIuaW5pdFZhbHVlIT1udWxsICkgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19BUkdfSU5JVF9WQUxVRVNfSUxMRUdBTCwKKwkJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkJICBkZXJpdmVkRnJvbVRva2VuLAorCQkJCQkJCQkJCSAgYXR0ci5uYW1lKTsKKwkJCQlhdHRyLmluaXRWYWx1ZT1udWxsOyAvLyB3aXBlIGl0IG91dAorCQkJfQorCQkJYXR0cmlidXRlcy5wdXQoYXR0ci5uYW1lLCBhdHRyKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlY2wpIHsKKwkJYXR0cmlidXRlcy5wdXQobmFtZSwgbmV3IEF0dHJpYnV0ZShuYW1lLGRlY2wpKTsKKwl9CisKKwkvKiogR2l2ZW4gQHNjb3BlOjpuYW1lIHthY3Rpb259IGRlZmluZSBpdCBmb3IgdGhpcyBhdHRyaWJ1dGUgc2NvcGUuIExhdGVyLAorCSAqICB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBhc2sgZm9yIHRoZSBhY3Rpb25zIHRhYmxlLgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGRlZmluZU5hbWVkQWN0aW9uKEdyYW1tYXJBU1QgbmFtZUFTVCwgR3JhbW1hckFTVCBhY3Rpb25BU1QpCisJeworCQlTdHJpbmcgYWN0aW9uTmFtZSA9IG5hbWVBU1QuZ2V0VGV4dCgpOworCQlHcmFtbWFyQVNUIGEgPSBhY3Rpb25zLmdldChhY3Rpb25OYW1lKTsKKwkJaWYgKGEgIT0gbnVsbCkgeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0FDVElPTl9SRURFRklOSVRJT04sCisJCQkJCQkJCQkgIGdyYW1tYXIsCisJCQkJCQkJCQkgIG5hbWVBU1QuZ2V0VG9rZW4oKSwKKwkJCQkJCQkJCSAgbmFtZUFTVC5nZXRUZXh0KCkpOworCQl9IGVsc2UgeworCQkJYWN0aW9ucy5wdXQoYWN0aW9uTmFtZSwgYWN0aW9uQVNUKTsKKwkJfQorCX0KKworCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiAoQXR0cmlidXRlKWF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworCX0KKworCS8qKiBVc2VkIGJ5IHRlbXBsYXRlcyB0byBnZXQgYWxsIGF0dHJpYnV0ZXMgKi8KKwlwdWJsaWMgTGlzdDxBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7CisJCUxpc3Q8QXR0cmlidXRlPiBhID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGU+KCk7CisJCWEuYWRkQWxsKGF0dHJpYnV0ZXMudmFsdWVzKCkpOworCQlyZXR1cm4gYTsKKwl9CisKKwkvKiogUmV0dXJuIHRoZSBzZXQgb2Yga2V5cyB0aGF0IGNvbGxpZGUgZnJvbQorCSAqICB0aGlzIGFuZCBvdGhlci4KKwkgKi8KKwlwdWJsaWMgU2V0IGludGVyc2VjdGlvbihBdHRyaWJ1dGVTY29wZSBvdGhlcikgeworCQlpZiAoIG90aGVyPT1udWxsIHx8IG90aGVyLnNpemUoKT09MCB8fCBzaXplKCk9PTAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTZXQgaW50ZXIgPSBuZXcgSGFzaFNldCgpOworCQlTZXQgdGhpc0tleXMgPSBhdHRyaWJ1dGVzLmtleVNldCgpOworCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGhpc0tleXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCWlmICggb3RoZXIuYXR0cmlidXRlcy5nZXQoa2V5KSE9bnVsbCApIHsKKwkJCQlpbnRlci5hZGQoa2V5KTsKKwkJCX0KKwkJfQorCQlpZiAoIGludGVyLnNpemUoKT09MCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBpbnRlcjsKKwl9CisKKwlwdWJsaWMgaW50IHNpemUoKSB7CisJCXJldHVybiBhdHRyaWJ1dGVzPT1udWxsPzA6YXR0cmlidXRlcy5zaXplKCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIChpc0R5bmFtaWNHbG9iYWxTY29wZT8iZ2xvYmFsICI6IiIpK2dldE5hbWUoKSsiOiIrYXR0cmlidXRlczsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0J1aWxkRGVwZW5kZW5jeUdlbmVyYXRvci5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9CdWlsZERlcGVuZGVuY3lHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQwNDZlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9CdWlsZERlcGVuZGVuY3lHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5VdGlsczsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXA7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXBGaWxlOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBHaXZlbiBhIGdyYW1tYXIgZmlsZSwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIG9uIC50b2tlbnMgZXRjLi4uCisgKiAgVXNpbmcgU1QsIGVtaXQgYSBzaW1wbGUgIm1ha2UgY29tcGF0aWJsZSIgbGlzdCBvZiBkZXBlbmRlbmNpZXMuCisgKiAgRm9yIGV4YW1wbGUsIGNvbWJpbmVkIGdyYW1tYXIgVC5nIChubyB0b2tlbiBpbXBvcnQpIGdlbmVyYXRlczoKKyAqCisgKgkJVFBhcnNlci5qYXZhIDogVC5nCisgKiAJCVQudG9rZW5zIDogVC5nCisgKiAJCVRfX2cgOiBULmcKKyAqCisgKiAgRm9yIHRyZWUgZ3JhbW1hciBUUCB3aXRoIGltcG9ydCBvZiBULnRva2VuczoKKyAqCisgKiAJCVRQLmcgOiBULnRva2VucworICogCQlUUC5qYXZhIDogVFAuZworICoKKyAqICBJZiAiLWxpYiBsaWJkaXIiIGlzIHVzZWQgb24gY29tbWFuZC1saW5lIHdpdGggLWRlcGVuZCwgdGhlbiBpbmNsdWRlIHRoZQorICogIHBhdGggbGlrZQorICoKKyAqIAkJVFAuZyA6IGxpYmRpci9ULnRva2VucworICoKKyAqICBQYXkgYXR0ZW50aW9uIHRvIC1vIGFzIHdlbGw6CisgKgorICogCQlvdXRwdXRkaXIvVFBhcnNlci5qYXZhIDogVC5nCisgKgorICogIFNvIHRoaXMgb3V0cHV0IHNob3dzIHdoYXQgdGhlIGdyYW1tYXIgZGVwZW5kcyBvbiAqYW5kKiB3aGF0IGl0IGdlbmVyYXRlcy4KKyAqCisgKiAgT3BlcmF0ZSBvbiBvbmUgZ3JhbW1hciBmaWxlIGF0IGEgdGltZS4gIElmIGdpdmVuIGEgbGlzdCBvZiAuZyBvbiB0aGUKKyAqICBjb21tYW5kLWxpbmUgd2l0aCAtZGVwZW5kLCBqdXN0IGVtaXQgdGhlIGRlcGVuZGVuY2llcy4gIFRoZSBncmFtbWFycworICogIG1heSBkZXBlbmQgb24gZWFjaCBvdGhlciwgYnV0IHRoZSBvcmRlciBkb2Vzbid0IG1hdHRlci4gIEJ1aWxkIHRvb2xzLAorICogIHJlYWRpbmcgaW4gdGhpcyBvdXRwdXQsIHdpbGwga25vdyBob3cgdG8gb3JnYW5pemUgaXQuCisgKgorICogIFRoaXMgaXMgYSB3ZWUgYml0IHNsb3cgcHJvYmFibHkgYmVjYXVzZSB0aGUgY29kZSBnZW5lcmF0b3IgaGFzIHRvIGxvYWQKKyAqICBhbGwgb2YgaXRzIHRlbXBsYXRlIGZpbGVzIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgdGhlIGZpbGUgZXh0ZW5zaW9uCisgKiAgZm9yIHRoZSBnZW5lcmF0ZWQgcmVjb2duaXplci4KKyAqCisgKiAgVGhpcyBjb2RlIHdhcyBvYnZpb3VzIHVudGlsIEkgcmVtb3ZlZCByZWR1bmRhbnQgIi4vIiBvbiBmcm9udCBvZiBmaWxlcworICogIGFuZCBoYWQgdG8gZXNjYXBlIHNwYWNlcyBpbiBmaWxlbmFtZXMgOigKKyAqLworcHVibGljIGNsYXNzIEJ1aWxkRGVwZW5kZW5jeUdlbmVyYXRvciB7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmFtbWFyRmlsZU5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0b2tlblZvY2FiOworICAgIHByb3RlY3RlZCBUb29sIHRvb2w7CisgICAgcHJvdGVjdGVkIEdyYW1tYXIgZ3JhbW1hcjsKKyAgICBwcm90ZWN0ZWQgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3I7CisgICAgcHJvdGVjdGVkIFNUR3JvdXAgdGVtcGxhdGVzOworCisgICAgcHVibGljIEJ1aWxkRGVwZW5kZW5jeUdlbmVyYXRvcihUb29sIHRvb2wsIFN0cmluZyBncmFtbWFyRmlsZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLnRvb2wgPSB0b29sOworICAgICAgICB0aGlzLmdyYW1tYXJGaWxlTmFtZSA9IGdyYW1tYXJGaWxlTmFtZTsKKyAgICAgICAgZ3JhbW1hciA9IHRvb2wuZ2V0Um9vdEdyYW1tYXIoZ3JhbW1hckZpbGVOYW1lKTsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gKFN0cmluZykgZ3JhbW1hci5nZXRPcHRpb24oImxhbmd1YWdlIik7CisgICAgICAgIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKHRvb2wsIGdyYW1tYXIsIGxhbmd1YWdlKTsKKyAgICAgICAgZ2VuZXJhdG9yLmxvYWRUZW1wbGF0ZXMobGFuZ3VhZ2UpOworICAgIH0KKworICAgIC8qKiBGcm9tIFQuZyByZXR1cm4gYSBsaXN0IG9mIEZpbGUgb2JqZWN0cyB0aGF0CisgICAgICogIG5hbWUgZmlsZXMgQU5UTFIgd2lsbCBlbWl0IGZyb20gVC5nLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEZpbGU+IGdldEdlbmVyYXRlZEZpbGVMaXN0KCkgeworICAgICAgICBMaXN0PEZpbGU+IGZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICAgICAgICBGaWxlIG91dHB1dERpciA9IHRvb2wuZ2V0T3V0cHV0RGlyZWN0b3J5KGdyYW1tYXJGaWxlTmFtZSk7CisgICAgICAgIGlmIChvdXRwdXREaXIuZ2V0TmFtZSgpLmVxdWFscygiLiIpKSB7CisgICAgICAgICAgICBvdXRwdXREaXIgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKG91dHB1dERpci5nZXROYW1lKCkuaW5kZXhPZignICcpID49IDApIHsgLy8gaGFzIHNwYWNlcz8KKyAgICAgICAgICAgIFN0cmluZyBlc2NTcGFjZXMgPSBVdGlscy5yZXBsYWNlKG91dHB1dERpci50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAiICIsCisgICAgICAgICAgICAgICAgICAgICJcXCAiKTsKKyAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKGVzY1NwYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIGdlbmVyYXRlZCByZWNvZ25pemVyOyBlLmcuLCBUUGFyc2VyLmphdmEKKyAgICAgICAgU3RyaW5nIHJlY29nbml6ZXIgPQorICAgICAgICAgICAgICAgIGdlbmVyYXRvci5nZXRSZWNvZ25pemVyRmlsZU5hbWUoZ3JhbW1hci5uYW1lLCBncmFtbWFyLnR5cGUpOworICAgICAgICBmaWxlcy5hZGQobmV3IEZpbGUob3V0cHV0RGlyLCByZWNvZ25pemVyKSk7CisgICAgICAgIC8vIGFkZCBvdXRwdXQgdm9jYWIgZmlsZTsgZS5nLiwgVC50b2tlbnMuIFRoaXMgaXMgYWx3YXlzIGdlbmVyYXRlZCB0bworICAgICAgICAvLyB0aGUgYmFzZSBvdXRwdXQgZGlyZWN0b3J5LCB3aGljaCB3aWxsIGJlIGp1c3QgLiBpZiB0aGVyZSBpcyBubyAtbyBvcHRpb24KKyAgICAgICAgLy8KKyAgICAgICAgZmlsZXMuYWRkKG5ldyBGaWxlKHRvb2wuZ2V0T3V0cHV0RGlyZWN0b3J5KCksIGdlbmVyYXRvci5nZXRWb2NhYkZpbGVOYW1lKCkpKTsKKyAgICAgICAgLy8gYXJlIHdlIGdlbmVyYXRpbmcgYSAuaCBmaWxlPworICAgICAgICBTVCBoZWFkZXJFeHRTVCA9IG51bGw7CisgICAgICAgIFNUIGV4dFNUID0gZ2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLmdldEluc3RhbmNlT2YoImNvZGVGaWxlRXh0ZW5zaW9uIik7CisgICAgICAgIGlmIChnZW5lcmF0b3IuZ2V0VGVtcGxhdGVzKCkuaXNEZWZpbmVkKCJoZWFkZXJGaWxlIikpIHsKKyAgICAgICAgICAgIGhlYWRlckV4dFNUID0gZ2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLmdldEluc3RhbmNlT2YoImhlYWRlckZpbGVFeHRlbnNpb24iKTsKKyAgICAgICAgICAgIFN0cmluZyBzdWZmaXggPSBHcmFtbWFyLmdyYW1tYXJUeXBlVG9GaWxlTmFtZVN1ZmZpeFtncmFtbWFyLnR5cGVdOworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ3JhbW1hci5uYW1lICsgc3VmZml4ICsgaGVhZGVyRXh0U1QucmVuZGVyKCk7CisgICAgICAgICAgICBmaWxlcy5hZGQobmV3IEZpbGUob3V0cHV0RGlyLCBmaWxlTmFtZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChncmFtbWFyLnR5cGUgPT0gR3JhbW1hci5DT01CSU5FRCkgeworICAgICAgICAgICAgLy8gYWRkIGF1dG9nZW5lcmF0ZWQgbGV4ZXI7IGUuZy4sIFRMZXhlci5qYXZhIFRMZXhlci5oIFRMZXhlci50b2tlbnMKKyAgICAgICAgICAgIC8vIGRvbid0IGFkZCBUX18uZyAoanVzdCBhIHRlbXAgZmlsZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeCA9IEdyYW1tYXIuZ3JhbW1hclR5cGVUb0ZpbGVOYW1lU3VmZml4W0dyYW1tYXIuTEVYRVJdOworICAgICAgICAgICAgU3RyaW5nIGxleGVyID0gZ3JhbW1hci5uYW1lICsgc3VmZml4ICsgZXh0U1QucmVuZGVyKCk7CisgICAgICAgICAgICBmaWxlcy5hZGQobmV3IEZpbGUob3V0cHV0RGlyLCBsZXhlcikpOworCisgICAgICAgICAgICAvLyBUTGV4ZXIuaAorICAgICAgICAgICAgaWYgKGhlYWRlckV4dFNUICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gZ3JhbW1hci5uYW1lICsgc3VmZml4ICsgaGVhZGVyRXh0U1QucmVuZGVyKCk7CisgICAgICAgICAgICAgICAgZmlsZXMuYWRkKG5ldyBGaWxlKG91dHB1dERpciwgaGVhZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vIGZvciBjb21iaW5lZCwgZG9uJ3QgZ2VuZXJhdGUgVExleGVyLnRva2VucworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGdlbmVyYXRlZCBmaWxlcyBmb3IgaW1wb3J0ZWQgZ3JhbW1hcnMKKyAgICAgICAgTGlzdDxHcmFtbWFyPiBpbXBvcnRzID0KKyAgICAgICAgICAgICAgICBncmFtbWFyLmNvbXBvc2l0ZS5nZXREZWxlZ2F0ZXMoZ3JhbW1hci5jb21wb3NpdGUuZ2V0Um9vdEdyYW1tYXIoKSk7CisgICAgICAgIGZvciAoR3JhbW1hciBnIDogaW1wb3J0cykgeworICAgICAgICAgICAgb3V0cHV0RGlyID0gdG9vbC5nZXRPdXRwdXREaXJlY3RvcnkoZy5nZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGdyb29tUXVhbGlmaWVkRmlsZU5hbWUob3V0cHV0RGlyLnRvU3RyaW5nKCksIGcuZ2V0UmVjb2duaXplck5hbWUoKSArIGV4dFNULnJlbmRlcigpKTsKKyAgICAgICAgICAgIGZpbGVzLmFkZChuZXcgRmlsZShmbmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgdGhhdCBuYW1lIGZpbGVzIEFOVExSIHdpbGwgcmVhZAorICAgICAqIHRvIHByb2Nlc3MgVC5nOyBUaGlzIGNhbiBiZSAudG9rZW5zIGZpbGVzIGlmIHRoZSBncmFtbWFyIHVzZXMgdGhlIHRva2VuVm9jYWIgb3B0aW9uCisgICAgICogYXMgd2VsbCBhcyBhbnkgaW1wb3J0ZWQgZ3JhbW1hciBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXREZXBlbmRlbmNpZXNGaWxlTGlzdCgpIHsKKyAgICAgICAgLy8gRmluZCBhbGwgdGhlIHRoaW5ncyBvdGhlciB0aGFuIGltcG9ydGVkIGdyYW1tYXJzCisgICAgICAgIExpc3Q8RmlsZT4gZmlsZXMgPSBnZXROb25JbXBvcnREZXBlbmRlbmNpZXNGaWxlTGlzdCgpOworCisgICAgICAgIC8vIEhhbmRsZSBpbXBvcnRlZCBncmFtbWFycworICAgICAgICBMaXN0PEdyYW1tYXI+IGltcG9ydHMgPQorICAgICAgICAgICAgICAgIGdyYW1tYXIuY29tcG9zaXRlLmdldERlbGVnYXRlcyhncmFtbWFyLmNvbXBvc2l0ZS5nZXRSb290R3JhbW1hcigpKTsKKyAgICAgICAgZm9yIChHcmFtbWFyIGcgOiBpbXBvcnRzKSB7CisgICAgICAgICAgICBTdHJpbmcgbGliZGlyID0gdG9vbC5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBncm9vbVF1YWxpZmllZEZpbGVOYW1lKGxpYmRpciwgZy5maWxlTmFtZSk7CisgICAgICAgICAgICBmaWxlcy5hZGQobmV3IEZpbGUoZmlsZU5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzIHRoYXQgbmFtZSBmaWxlcyBBTlRMUiB3aWxsIHJlYWQKKyAgICAgKiB0byBwcm9jZXNzIFQuZzsgVGhpcyBjYW4gb25seSBiZSAudG9rZW5zIGZpbGVzIGFuZCBvbmx5CisgICAgICogaWYgdGhleSB1c2UgdGhlIHRva2VuVm9jYWIgb3B0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIGRlcGVuZGVuY2llcyBvdGhlciB0aGFuIGltcG9ydGVkIGdyYW1tYXJzCisgICAgICovCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0Tm9uSW1wb3J0RGVwZW5kZW5jaWVzRmlsZUxpc3QoKSB7CisgICAgICAgIExpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7CisKKyAgICAgICAgLy8gaGFuZGxlIHRva2VuIHZvY2FidWxhcnkgbG9hZHMKKyAgICAgICAgdG9rZW5Wb2NhYiA9IChTdHJpbmcpIGdyYW1tYXIuZ2V0T3B0aW9uKCJ0b2tlblZvY2FiIik7CisgICAgICAgIGlmICh0b2tlblZvY2FiICE9IG51bGwpIHsKKworICAgICAgICAgICAgRmlsZSB2b2NhYkZpbGUgPSB0b29sLmdldEltcG9ydGVkVm9jYWJGaWxlKHRva2VuVm9jYWIpOworICAgICAgICAgICAgZmlsZXMuYWRkKHZvY2FiRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCisgICAgcHVibGljIFNUIGdldERlcGVuZGVuY2llcygpIHsKKyAgICAgICAgbG9hZERlcGVuZGVuY3lUZW1wbGF0ZXMoKTsKKyAgICAgICAgU1QgZGVwZW5kZW5jaWVzU1QgPSB0ZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigiZGVwZW5kZW5jaWVzIik7CisgICAgICAgIGRlcGVuZGVuY2llc1NULmFkZCgiaW4iLCBnZXREZXBlbmRlbmNpZXNGaWxlTGlzdCgpKTsKKyAgICAgICAgZGVwZW5kZW5jaWVzU1QuYWRkKCJvdXQiLCBnZXRHZW5lcmF0ZWRGaWxlTGlzdCgpKTsKKyAgICAgICAgZGVwZW5kZW5jaWVzU1QuYWRkKCJncmFtbWFyRmlsZU5hbWUiLCBncmFtbWFyLmZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llc1NUOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWREZXBlbmRlbmN5VGVtcGxhdGVzKCkgeworICAgICAgICBpZiAodGVtcGxhdGVzICE9IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gIm9yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kZXBlbmQuc3RnIjsKKyAgICAgICAgdGVtcGxhdGVzID0gbmV3IFNUR3JvdXBGaWxlKGZpbGVOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuVm9jYWIoKSB7CisgICAgICAgIHJldHVybiB0b2tlblZvY2FiOworICAgIH0KKworICAgIHB1YmxpYyBDb2RlR2VuZXJhdG9yIGdldEdlbmVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcjsKKyAgICB9ICAgIAorCisgICAgcHVibGljIFN0cmluZyBncm9vbVF1YWxpZmllZEZpbGVOYW1lKFN0cmluZyBvdXRwdXREaXIsIFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAob3V0cHV0RGlyLmVxdWFscygiLiIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0RGlyLmluZGV4T2YoJyAnKSA+PSAwKSB7IC8vIGhhcyBzcGFjZXM/CisgICAgICAgICAgICBTdHJpbmcgZXNjU3BhY2VzID0gVXRpbHMucmVwbGFjZShvdXRwdXREaXIudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgIiAiLAorICAgICAgICAgICAgICAgICAgICAiXFwgIik7CisgICAgICAgICAgICByZXR1cm4gZXNjU3BhY2VzICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9Db21wb3NpdGVHcmFtbWFyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0NvbXBvc2l0ZUdyYW1tYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWVmODJmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9Db21wb3NpdGVHcmFtbWFyLmphdmEKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqL3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuTGFiZWw7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLk5GQVN0YXRlOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFOVExSUGFyc2VyOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFzc2lnblRva2VuVHlwZXNXYWxrZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbTsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKiogQSB0cmVlIG9mIGNvbXBvbmVudCAoZGVsZWdhdGUpIGdyYW1tYXJzLgorICoKKyAqICBSdWxlcyBkZWZpbmVkIGluIGRlbGVnYXRlcyBhcmUgImluaGVyaXRlZCIgbGlrZSBtdWx0aS1pbmhlcml0YW5jZQorICogIHNvIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbS4gIEFsbCB0b2tlbiB0eXBlcyBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzCisgKiAgcnVsZXMgZnJvbSBhbGwgZGVsZWdhdGUgZ3JhbW1hcnMsIHNvIHRoZXkgbXVzdCBiZSBzdG9yZWQgaGVyZSBpbiBvbmUKKyAqICBjZW50cmFsIHBsYWNlLgorICoKKyAqICBXZSBoYXZlIHRvIHN0YXJ0IG91dCBhc3N1bWluZyBhIGNvbXBvc2l0ZSBncmFtbWFyIHNpdHVhdGlvbiBhcyB3ZSBjYW4ndAorICogIGxvb2sgaW50byB0aGUgZ3JhbW1hciBmaWxlcyBhIHByaW9yaSB0byBzZWUgaWYgdGhlcmUgaXMgYSBkZWxlZ2F0ZQorICogIHN0YXRlbWVudC4gIEJlY2F1c2Ugb2YgdGhpcywgYW5kIHRvIGF2b2lkIGR1cGxpY2F0aW5nIHRva2VuIHR5cGUgdHJhY2tpbmcKKyAqICBpbiBlYWNoIGdyYW1tYXIsIGV2ZW4gc2luZ2xlIG5vbmNvbXBvc2l0ZSBncmFtbWFycyB1c2Ugb25lIG9mIHRoZXNlIG9iamVjdHMKKyAqICB0byB0cmFjayB0b2tlbiB0eXBlcy4KKyAqLworcHVibGljIGNsYXNzIENvbXBvc2l0ZUdyYW1tYXIgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9SVUxFX0lOREVYID0gMTsKKworCXB1YmxpYyBDb21wb3NpdGVHcmFtbWFyVHJlZSBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdDsKKworCS8qKiBVc2VkIGR1cmluZyBnZXRSdWxlUmVmZXJlbmNlQ2xvc3VyZSB0byBkZXRlY3QgY29tcHV0YXRpb24gY3ljbGVzICovCisJcHJvdGVjdGVkIFNldDxORkFTdGF0ZT4gcmVmQ2xvc3VyZUJ1c3kgPSBuZXcgSGFzaFNldDxORkFTdGF0ZT4oKTsKKworCS8qKiBVc2VkIHRvIGFzc2lnbiBzdGF0ZSBudW1iZXJzOyBhbGwgZ3JhbW1hcnMgaW4gY29tcG9zaXRlIHNoYXJlIGNvbW1vbgorCSAqICBORkEgc3BhY2UuICBUaGlzIE5GQSB0cmFja3Mgc3RhdGUgbnVtYmVycyBudW1iZXIgdG8gc3RhdGUgbWFwcGluZy4KKwkgKi8KKwlwdWJsaWMgaW50IHN0YXRlQ291bnRlciA9IDA7CisKKwkvKiogVGhlIE5GQSBzdGF0ZXMgaW4gdGhlIE5GQSBidWlsdCBmcm9tIHJ1bGVzIGFjcm9zcyBncmFtbWFycyBpbiBjb21wb3NpdGUuCisJICogIE1hcHMgc3RhdGUgbnVtYmVyIHRvIE5GQVN0YXRlIG9iamVjdC4KKwkgKiAgVGhpcyBpcyBhIFZlY3RvciBpbnN0ZWFkIG9mIGEgTGlzdCBiZWNhdXNlIEkgbmVlZCB0byBiZSBhYmxlIHRvIGdyb3cKKwkgKiAgdGhpcyBwcm9wZXJseS4gIEFmdGVyIHRhbGtpbmcgdG8gSm9zaCBCbG9jaCwgQ29sbGVjdGlvbnMgZ3V5IGF0IFN1biwKKwkgKiAgSSBkZWNpZGVkIHRoaXMgd2FzIGVhc2llc3Qgc29sdXRpb24uCisJICovCisJcHJvdGVjdGVkIFZlY3RvcjxORkFTdGF0ZT4gbnVtYmVyVG9TdGF0ZUxpc3QgPSBuZXcgVmVjdG9yPE5GQVN0YXRlPigxMDAwKTsKKworCS8qKiBUb2tlbiBuYW1lcyBhbmQgbGl0ZXJhbCB0b2tlbnMgbGlrZSAidm9pZCIgYXJlIHVuaXF1ZWx5IGluZGV4ZWQuCisJICogIHdpdGggLTEgaW1wbHlpbmcgRU9GLiAgQ2hhcmFjdGVycyBhcmUgZGlmZmVyZW50OyB0aGV5IGdvIGZyb20KKwkgKiAgLTEgKEVPRikgdG8gXHVGRkZFLiAgRm9yIGV4YW1wbGUsIDAgY291bGQgYmUgYSBiaW5hcnkgYnl0ZSB5b3UKKwkgKiAgd2FudCB0byBsZXhlci4gIExhYmVscyBvZiBERkEvTkZBIHRyYW5zaXRpb25zIGNhbiBiZSBib3RoIHRva2VucworCSAqICBhbmQgY2hhcmFjdGVycy4gIEkgdXNlIG5lZ2F0aXZlIG51bWJlcnMgZm9yIGJvb2trZWVwaW5nIGxhYmVscworCSAqICBsaWtlIEVQU0lMT04uIENoYXIvU3RyaW5nIGxpdGVyYWxzIGFuZCB0b2tlbiB0eXBlcyBvdmVybGFwIGluIHRoZSBzYW1lCisJICogIHNwYWNlLCBob3dldmVyLgorCSAqLworCXByb3RlY3RlZCBpbnQgbWF4VG9rZW5UeXBlID0gTGFiZWwuTUlOX1RPS0VOX1RZUEUtMTsKKworCS8qKiBNYXAgdG9rZW4gbGlrZSBJRCAoYnV0IG5vdCBsaXRlcmFscyBsaWtlICJ3aGlsZSIpIHRvIGl0cyB0b2tlbiB0eXBlICovCisJcHVibGljIE1hcCB0b2tlbklEVG9UeXBlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKworCS8qKiBNYXAgdG9rZW4gbGl0ZXJhbHMgbGlrZSAid2hpbGUiIHRvIGl0cyB0b2tlbiB0eXBlLiAgSXQgbWF5IGJlIHRoYXQKKwkgKiAgV0hJTEU9IndoaWxlIj0zNSwgaW4gd2hpY2ggY2FzZSBib3RoIHRva2VuSURUb1R5cGVNYXAgYW5kIHRoaXMKKwkgKiAgZmllbGQgd2lsbCBoYXZlIGVudHJpZXMgYm90aCBtYXBwZWQgdG8gMzUuCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IHN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisJLyoqIFJldmVyc2UgaW5kZXggZm9yIHN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgKi8KKwlwdWJsaWMgVmVjdG9yPFN0cmluZz4gdHlwZVRvU3RyaW5nTGl0ZXJhbExpc3QgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKworCS8qKiBNYXAgYSB0b2tlbiB0eXBlIHRvIGl0cyB0b2tlbiBuYW1lLgorCSAqICBNdXN0IHN1YnRyYWN0IE1JTl9UT0tFTl9UWVBFIGZyb20gaW5kZXguCisJICovCisJcHVibGljIFZlY3RvcjxTdHJpbmc+IHR5cGVUb1Rva2VuTGlzdCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworCisJLyoqIElmIGNvbWJpbmVkIG9yIGxleGVyIGdyYW1tYXIsIHRyYWNrIHRoZSBydWxlcy4KKwkgKiAJVHJhY2sgbGV4ZXIgcnVsZXMgc28gd2UgY2FuIHdhcm4gYWJvdXQgdW5kZWZpbmVkIHRva2Vucy4KKwkgKiAgVGhpcyBpcyBjb21iaW5lZCBzZXQgb2YgbGV4ZXIgcnVsZXMgZnJvbSBhbGwgbGV4ZXIgZ3JhbW1hcnMKKwkgKiAgc2VlbiBpbiBhbGwgaW1wb3J0cy4KKwkgKi8KKwlwcm90ZWN0ZWQgU2V0PFN0cmluZz4gbGV4ZXJSdWxlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCS8qKiBSdWxlcyBhcmUgdW5pcXVlbHkgbGFiZWxlZCBmcm9tIDEuLm4gYW1vbmcgYWxsIGdyYW1tYXJzICovCisJcHJvdGVjdGVkIGludCBydWxlSW5kZXggPSBNSU5fUlVMRV9JTkRFWDsKKworCS8qKiBNYXAgYSBydWxlIGluZGV4IHRvIGl0cyBuYW1lOyB1c2UgYSBWZWN0b3Igb24gcHVycG9zZSBhcyBuZXcKKwkgKiAgY29sbGVjdGlvbnMgc3R1ZmYgd29uJ3QgbGV0IG1lIHNldFNpemUgYW5kIG1ha2UgaXQgZ3Jvdy4gIDooCisJICogIEkgbmVlZCBhIHNwZWNpZmljIGd1YXJhbnRlZWQgaW5kZXgsIHdoaWNoIHRoZSBDb2xsZWN0aW9ucyBzdHVmZgorCSAqICB3b24ndCBsZXQgbWUgaGF2ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgVmVjdG9yPFJ1bGU+IHJ1bGVJbmRleFRvUnVsZUxpc3QgPSBuZXcgVmVjdG9yPFJ1bGU+KCk7CisKKwlwdWJsaWMgYm9vbGVhbiB3YXRjaE5GQUNvbnZlcnNpb24gPSBmYWxzZTsKKworCXByb3RlY3RlZCB2b2lkIGluaXRUb2tlblN5bWJvbFRhYmxlcygpIHsKKwkJLy8gdGhlIGZhdXggdG9rZW4gdHlwZXMgdGFrZSBmaXJzdCBOVU1fRkFVWF9MQUJFTFMgcG9zaXRpb25zCisJCS8vIHRoZW4gd2UgbXVzdCBoYXZlIHJvb20gZm9yIHRoZSBwcmVkZWZpbmVkIHJ1bnRpbWUgdG9rZW4gdHlwZXMKKwkJLy8gbGlrZSBET1dOL1VQIHVzZWQgZm9yIHRyZWUgcGFyc2luZy4KKwkJdHlwZVRvVG9rZW5MaXN0LnNldFNpemUoTGFiZWwuTlVNX0ZBVVhfTEFCRUxTK0xhYmVsLk1JTl9UT0tFTl9UWVBFLTEpOworCQl0eXBlVG9Ub2tlbkxpc3Quc2V0KExhYmVsLk5VTV9GQVVYX0xBQkVMUytMYWJlbC5JTlZBTElELCAiPElOVkFMSUQ+Iik7CisJCXR5cGVUb1Rva2VuTGlzdC5zZXQoTGFiZWwuTlVNX0ZBVVhfTEFCRUxTK0xhYmVsLkVPVCwgIjxFT1Q+Iik7CisJCXR5cGVUb1Rva2VuTGlzdC5zZXQoTGFiZWwuTlVNX0ZBVVhfTEFCRUxTK0xhYmVsLlNFTVBSRUQsICI8U0VNUFJFRD4iKTsKKwkJdHlwZVRvVG9rZW5MaXN0LnNldChMYWJlbC5OVU1fRkFVWF9MQUJFTFMrTGFiZWwuU0VULCAiPFNFVD4iKTsKKwkJdHlwZVRvVG9rZW5MaXN0LnNldChMYWJlbC5OVU1fRkFVWF9MQUJFTFMrTGFiZWwuRVBTSUxPTiwgTGFiZWwuRVBTSUxPTl9TVFIpOworCQl0eXBlVG9Ub2tlbkxpc3Quc2V0KExhYmVsLk5VTV9GQVVYX0xBQkVMUytMYWJlbC5FT0YsICJFT0YiKTsKKwkJdHlwZVRvVG9rZW5MaXN0LnNldChMYWJlbC5OVU1fRkFVWF9MQUJFTFMrTGFiZWwuRU9SX1RPS0VOX1RZUEUtMSwgIjxFT1I+Iik7CisJCXR5cGVUb1Rva2VuTGlzdC5zZXQoTGFiZWwuTlVNX0ZBVVhfTEFCRUxTK0xhYmVsLkRPV04tMSwgIkRPV04iKTsKKwkJdHlwZVRvVG9rZW5MaXN0LnNldChMYWJlbC5OVU1fRkFVWF9MQUJFTFMrTGFiZWwuVVAtMSwgIlVQIik7CisJCXRva2VuSURUb1R5cGVNYXAucHV0KCI8SU5WQUxJRD4iLCBVdGlscy5pbnRlZ2VyKExhYmVsLklOVkFMSUQpKTsKKwkJdG9rZW5JRFRvVHlwZU1hcC5wdXQoIjxFT1Q+IiwgVXRpbHMuaW50ZWdlcihMYWJlbC5FT1QpKTsKKwkJdG9rZW5JRFRvVHlwZU1hcC5wdXQoIjxTRU1QUkVEPiIsIFV0aWxzLmludGVnZXIoTGFiZWwuU0VNUFJFRCkpOworCQl0b2tlbklEVG9UeXBlTWFwLnB1dCgiPFNFVD4iLCBVdGlscy5pbnRlZ2VyKExhYmVsLlNFVCkpOworCQl0b2tlbklEVG9UeXBlTWFwLnB1dCgiPEVQU0lMT04+IiwgVXRpbHMuaW50ZWdlcihMYWJlbC5FUFNJTE9OKSk7CisJCXRva2VuSURUb1R5cGVNYXAucHV0KCJFT0YiLCBVdGlscy5pbnRlZ2VyKExhYmVsLkVPRikpOworCQl0b2tlbklEVG9UeXBlTWFwLnB1dCgiPEVPUj4iLCBVdGlscy5pbnRlZ2VyKExhYmVsLkVPUl9UT0tFTl9UWVBFKSk7CisJCXRva2VuSURUb1R5cGVNYXAucHV0KCJET1dOIiwgVXRpbHMuaW50ZWdlcihMYWJlbC5ET1dOKSk7CisJCXRva2VuSURUb1R5cGVNYXAucHV0KCJVUCIsIFV0aWxzLmludGVnZXIoTGFiZWwuVVApKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9zaXRlR3JhbW1hcigpIHsKKwkJaW5pdFRva2VuU3ltYm9sVGFibGVzKCk7CisJfQorCisJcHVibGljIENvbXBvc2l0ZUdyYW1tYXIoR3JhbW1hciBnKSB7CisJCXRoaXMoKTsKKwkJc2V0RGVsZWdhdGlvblJvb3QoZyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVsZWdhdGlvblJvb3QoR3JhbW1hciByb290KSB7CisJCWRlbGVnYXRlR3JhbW1hclRyZWVSb290ID0gbmV3IENvbXBvc2l0ZUdyYW1tYXJUcmVlKHJvb3QpOworCQlyb290LmNvbXBvc2l0ZVRyZWVOb2RlID0gZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3Q7CisJfQorCisJcHVibGljIFJ1bGUgZ2V0UnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKKwkJcmV0dXJuIGRlbGVnYXRlR3JhbW1hclRyZWVSb290LmdldFJ1bGUocnVsZU5hbWUpOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0T3B0aW9uKFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIGRlbGVnYXRlR3JhbW1hclRyZWVSb290LmdldE9wdGlvbihrZXkpOworCX0KKworCS8qKiBBZGQgZGVsZWdhdGUgZ3JhbW1hciBhcyBjaGlsZCBvZiBkZWxlZ2F0b3IgKi8KKwlwdWJsaWMgdm9pZCBhZGRHcmFtbWFyKEdyYW1tYXIgZGVsZWdhdG9yLCBHcmFtbWFyIGRlbGVnYXRlKSB7CisJCWlmICggZGVsZWdhdG9yLmNvbXBvc2l0ZVRyZWVOb2RlPT1udWxsICkgeworCQkJZGVsZWdhdG9yLmNvbXBvc2l0ZVRyZWVOb2RlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXJUcmVlKGRlbGVnYXRvcik7CisJCX0KKwkJZGVsZWdhdG9yLmNvbXBvc2l0ZVRyZWVOb2RlLmFkZENoaWxkKG5ldyBDb21wb3NpdGVHcmFtbWFyVHJlZShkZWxlZ2F0ZSkpOworCisJCS8qLy8gZmluZCBkZWxlZ2F0b3IgaW4gdHJlZSBzbyB3ZSBjYW4gYWRkIGEgY2hpbGQgdG8gaXQKKwkJQ29tcG9zaXRlR3JhbW1hclRyZWUgdCA9IGRlbGVnYXRlR3JhbW1hclRyZWVSb290LmZpbmROb2RlKGRlbGVnYXRvcik7CisJCXQuYWRkQ2hpbGQoKTsKKwkJKi8KKwkJLy8gbWFrZSBzdXJlIG5ldyBncmFtbWFyIHNoYXJlcyB0aGlzIGNvbXBvc2l0ZQorCQlkZWxlZ2F0ZS5jb21wb3NpdGUgPSB0aGlzOworCX0KKworCS8qKiBHZXQgcGFyZW50IG9mIHRoaXMgZ3JhbW1hciAqLworCXB1YmxpYyBHcmFtbWFyIGdldERlbGVnYXRvcihHcmFtbWFyIGcpIHsKKwkJQ29tcG9zaXRlR3JhbW1hclRyZWUgbWUgPSBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5maW5kTm9kZShnKTsKKwkJaWYgKCBtZT09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKKwkJfQorCQlpZiAoIG1lLnBhcmVudCE9bnVsbCApIHsKKwkJCXJldHVybiBtZS5wYXJlbnQuZ3JhbW1hcjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiogR2V0IGxpc3Qgb2YgYWxsIGRlbGVnYXRlcyBmcm9tIGFsbCBncmFtbWFycyBpbiB0aGUgZGVsZWdhdGUgc3VidHJlZSBvZiBnLgorCSAqICBUaGUgZ3JhbW1hcnMgYXJlIGluIGRlbGVnYXRpb24gdHJlZSBwcmVvcmRlci4gIERvbid0IGluY2x1ZGUgZyBpdHNlbGYKKwkgKiAgaW4gbGlzdCBhcyBpdCBpcyBub3QgYSBkZWxlZ2F0ZSBvZiBpdHNlbGYuCisJICovCisJcHVibGljIExpc3Q8R3JhbW1hcj4gZ2V0RGVsZWdhdGVzKEdyYW1tYXIgZykgeworCQlDb21wb3NpdGVHcmFtbWFyVHJlZSB0ID0gZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QuZmluZE5vZGUoZyk7CisJCWlmICggdD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOyAvLyBubyBkZWxlZ2F0ZXMKKwkJfQorCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gdC5nZXRQb3N0T3JkZXJlZEdyYW1tYXJMaXN0KCk7CisJCWdyYW1tYXJzLnJlbW92ZShncmFtbWFycy5zaXplKCktMSk7IC8vIHJlbW92ZSBnIChsYXN0IG9uZSkKKwkJcmV0dXJuIGdyYW1tYXJzOworCX0KKworCXB1YmxpYyBMaXN0PEdyYW1tYXI+IGdldERpcmVjdERlbGVnYXRlcyhHcmFtbWFyIGcpIHsKKwkJQ29tcG9zaXRlR3JhbW1hclRyZWUgdCA9IGRlbGVnYXRlR3JhbW1hclRyZWVSb290LmZpbmROb2RlKGcpOworCQlMaXN0PENvbXBvc2l0ZUdyYW1tYXJUcmVlPiBjaGlsZHJlbiA9IHQuY2hpbGRyZW47CisJCWlmICggY2hpbGRyZW49PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgY2hpbGRyZW4hPW51bGwgJiYgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlDb21wb3NpdGVHcmFtbWFyVHJlZSBjaGlsZCA9IChDb21wb3NpdGVHcmFtbWFyVHJlZSkgY2hpbGRyZW4uZ2V0KGkpOworCQkJZ3JhbW1hcnMuYWRkKGNoaWxkLmdyYW1tYXIpOworCQl9CisJCXJldHVybiBncmFtbWFyczsKKwl9CisKKwkvKiogR2V0IGRlbGVnYXRlcyBiZWxvdyBkaXJlY3QgZGVsZWdhdGVzIG9mIGcgKi8KKwlwdWJsaWMgTGlzdDxHcmFtbWFyPiBnZXRJbmRpcmVjdERlbGVnYXRlcyhHcmFtbWFyIGcpIHsKKwkJTGlzdDxHcmFtbWFyPiBkaXJlY3QgPSBnZXREaXJlY3REZWxlZ2F0ZXMoZyk7CisJCUxpc3Q8R3JhbW1hcj4gZGVsZWdhdGVzID0gZ2V0RGVsZWdhdGVzKGcpOworCQlkZWxlZ2F0ZXMucmVtb3ZlQWxsKGRpcmVjdCk7CisJCXJldHVybiBkZWxlZ2F0ZXM7CisJfQorCisJLyoqIFJldHVybiBsaXN0IG9mIGRlbGVnYXRlIGdyYW1tYXJzIGZyb20gcm9vdCBkb3duIHRvIGcuCisJICogIE9yZGVyIGlzIHJvb3QsIC4uLiwgZy5wYXJlbnQuICAoZyBub3QgaW5jbHVkZWQpLgorCSAqLworCXB1YmxpYyBMaXN0PEdyYW1tYXI+IGdldERlbGVnYXRvcnMoR3JhbW1hciBnKSB7CisJCWlmICggZz09ZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QuZ3JhbW1hciApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUxpc3Q8R3JhbW1hcj4gZ3JhbW1hcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUNvbXBvc2l0ZUdyYW1tYXJUcmVlIHQgPSBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5maW5kTm9kZShnKTsKKwkJLy8gd2FsayBiYWNrd2FyZHMgdG8gcm9vdCwgY29sbGVjdGluZyBncmFtbWFycworCQlDb21wb3NpdGVHcmFtbWFyVHJlZSBwID0gdC5wYXJlbnQ7CisJCXdoaWxlICggcCE9bnVsbCApIHsKKwkJCWdyYW1tYXJzLmFkZCgwLCBwLmdyYW1tYXIpOyAvLyBhZGQgdG8gaGVhZCBzbyBpbiBvcmRlciBsYXRlcgorCQkJcCA9IHAucGFyZW50OworCQl9CisJCXJldHVybiBncmFtbWFyczsKKwl9CisKKwkvKiogR2V0IHNldCBvZiBydWxlcyBmb3IgZ3JhbW1hciBnIHRoYXQgbmVlZCB0byBoYXZlIG1hbnVhbCBkZWxlZ2F0aW9uCisJICogIG1ldGhvZHMuICBUaGlzIGlzIHRoZSBsaXN0IG9mIHJ1bGVzIGNvbGxlY3RlZCBmcm9tIGFsbCBkaXJlY3QvaW5kaXJlY3QKKwkgKiAgZGVsZWdhdGVzIG1pbnVzIHJ1bGVzIG92ZXJyaWRkZW4gaW4gZ3JhbW1hciBnLgorCSAqCisJICogIFRoaXMgcmV0dXJucyBudWxsIGV4Y2VwdCBmb3IgdGhlIGRlbGVnYXRlIHJvb3QgYmVjYXVzZSBpdCBpcyB0aGUgb25seQorCSAqICBvbmUgdGhhdCBoYXMgdG8gaGF2ZSBhIGNvbXBsZXRlIGdyYW1tYXIgcnVsZSBpbnRlcmZhY2UuICBUaGUgZGVsZWdhdGVzCisJICogIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IGZvciB1c2UgYXMgcGFyc2VycyAoeW91IGNhbiBjcmVhdGUKKwkgKiAgdGhlbSB0byBwYXNzIHRvIHRoZSByb290IHBhcnNlcidzIGN0b3IgYXMgYXJndW1lbnRzKS4KKwkgKi8KKwlwdWJsaWMgU2V0PFJ1bGU+IGdldERlbGVnYXRlZFJ1bGVzKEdyYW1tYXIgZykgeworCQlpZiAoIGchPWRlbGVnYXRlR3JhbW1hclRyZWVSb290LmdyYW1tYXIgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTZXQ8UnVsZT4gcnVsZXMgPSBnZXRBbGxJbXBvcnRlZFJ1bGVzKGcpOworCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcnVsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJUnVsZSByID0gKFJ1bGUpIGl0Lm5leHQoKTsKKwkJCVJ1bGUgbG9jYWxSdWxlID0gZy5nZXRMb2NhbGx5RGVmaW5lZFJ1bGUoci5uYW1lKTsKKwkJCS8vIGlmIGxvY2FsbHkgZGVmaW5lZCBvciBpdCdzIG5vdCBsb2NhbCBidXQgc3lucHJlZCwgZG9uJ3QgbWFrZQorCQkJLy8gYSBkZWxlZ2F0aW9uIG1ldGhvZAorCQkJaWYgKCBsb2NhbFJ1bGUhPW51bGwgfHwgci5pc1N5blByZWQgKSB7CisJCQkJaXQucmVtb3ZlKCk7IC8vIGtpbGwgb3ZlcnJpZGRlbiBydWxlcworCQkJfQorCQl9CisJCXJldHVybiBydWxlczsKKwl9CisKKwkvKiogR2V0IGFsbCBydWxlIGRlZmluaXRpb25zIGZyb20gYWxsIGRpcmVjdC9pbmRpcmVjdCBkZWxlZ2F0ZSBncmFtbWFycworCSAqICBvZiBnLgorCSAqLworCXB1YmxpYyBTZXQ8UnVsZT4gZ2V0QWxsSW1wb3J0ZWRSdWxlcyhHcmFtbWFyIGcpIHsKKwkJU2V0PFN0cmluZz4gcnVsZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKKwkJU2V0PFJ1bGU+IHJ1bGVzID0gbmV3IEhhc2hTZXQoKTsKKwkJQ29tcG9zaXRlR3JhbW1hclRyZWUgc3VidHJlZVJvb3QgPSBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5maW5kTm9kZShnKTsKKworCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gc3VidHJlZVJvb3QuZ2V0UHJlT3JkZXJlZEdyYW1tYXJMaXN0KCk7CisJCS8vIHdhbGsgYWxsIGdyYW1tYXJzIHByZW9yZGVyLCBwcmlvcml0eSBnaXZlbiB0byBncmFtbWFyIGxpc3RlZCBmaXJzdC4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmFtbWFycy5zaXplKCk7IGkrKykgeworCQkJR3JhbW1hciBkZWxlZ2F0ZSA9IChvcmcuYW50bHIudG9vbC5HcmFtbWFyKSBncmFtbWFycy5nZXQoaSk7CisJCQkvLyBmb3IgZWFjaCBydWxlIGluIGRlbGVnYXRlLCBhZGQgdG8gcnVsZXMgaWYgbm8gcnVsZSB3aXRoIHRoYXQKKwkJCS8vIG5hbWUgYXMgYmVlbiBzZWVuLiAgKGNhbid0IHVzZSByZW1vdmVBbGw7IHdyb25nIGhhc2hjb2RlL2VxdWFscyBvbiBSdWxlKQorCQkJZm9yIChJdGVyYXRvciBpdCA9IGRlbGVnYXRlLmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworCQkJCVJ1bGUgciA9IChSdWxlKWl0Lm5leHQoKTsKKwkJCQlpZiAoICFydWxlTmFtZXMuY29udGFpbnMoci5uYW1lKSApIHsKKwkJCQkJcnVsZU5hbWVzLmFkZChyLm5hbWUpOyAvLyB0cmFjayB0aGF0IHdlJ3ZlIHNlZW4gdGhpcworCQkJCQlydWxlcy5hZGQocik7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBydWxlczsKKwl9CisKKwlwdWJsaWMgR3JhbW1hciBnZXRSb290R3JhbW1hcigpIHsKKwkJaWYgKCBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5ncmFtbWFyOworCX0KKworCXB1YmxpYyBHcmFtbWFyIGdldEdyYW1tYXIoU3RyaW5nIGdyYW1tYXJOYW1lKSB7CisJCUNvbXBvc2l0ZUdyYW1tYXJUcmVlIHQgPSBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5maW5kTm9kZShncmFtbWFyTmFtZSk7CisJCWlmICggdCE9bnVsbCApIHsKKwkJCXJldHVybiB0LmdyYW1tYXI7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLy8gTkZBIHNwYW5zIG11bHRpcGxlIGdyYW1tYXJzLCBtdXN0IGhhbmRsZSBoZXJlCisKKwlwdWJsaWMgaW50IGdldE5ld05GQVN0YXRlTnVtYmVyKCkgeworCQlyZXR1cm4gc3RhdGVDb3VudGVyKys7CisJfQorCisJcHVibGljIHZvaWQgYWRkU3RhdGUoTkZBU3RhdGUgc3RhdGUpIHsKKwkJbnVtYmVyVG9TdGF0ZUxpc3Quc2V0U2l6ZShzdGF0ZS5zdGF0ZU51bWJlcisxKTsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgcm9vbQorCQludW1iZXJUb1N0YXRlTGlzdC5zZXQoc3RhdGUuc3RhdGVOdW1iZXIsIHN0YXRlKTsKKwl9CisKKwlwdWJsaWMgTkZBU3RhdGUgZ2V0U3RhdGUoaW50IHMpIHsKKwkJcmV0dXJuIChORkFTdGF0ZSludW1iZXJUb1N0YXRlTGlzdC5nZXQocyk7CisJfQorCisJcHVibGljIHZvaWQgYXNzaWduVG9rZW5UeXBlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisJCS8vIEFTU0lHTiBUT0tFTiBUWVBFUyBmb3IgYWxsIGRlbGVnYXRlcyAoc2FtZSB3YWxrZXIpCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCIjIyMgYXNzaWduIHR5cGVzIik7CisJCUFzc2lnblRva2VuVHlwZXNXYWxrZXIgdHR5cGVzV2Fsa2VyID0gbmV3IEFzc2lnblRva2VuVHlwZXNCZWhhdmlvcigpOworCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QuZ2V0UG9zdE9yZGVyZWRHcmFtbWFyTGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgZ3JhbW1hcnMhPW51bGwgJiYgaSA8IGdyYW1tYXJzLnNpemUoKTsgaSsrKSB7CisJCQlHcmFtbWFyIGcgPSAoR3JhbW1hcilncmFtbWFycy5nZXQoaSk7CisJCQl0dHlwZXNXYWxrZXIuc2V0VHJlZU5vZGVTdHJlYW0obmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKGcuZ2V0R3JhbW1hclRyZWUoKSkpOworCQkJdHJ5IHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICAgIHdhbGtpbmcgIitnLm5hbWUpOworCQkJCXR0eXBlc1dhbGtlci5ncmFtbWFyXyhnKTsKKwkJCX0KKwkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0JBRF9BU1RfU1RSVUNUVVJFLAorCQkJCQkJCQkgICByZSk7CisJCQl9CisJCX0KKwkJLy8gdGhlIHdhbGtlciBoYXMgZmlsbGVkIGxpdGVyYWxzLCB0b2tlbnMsIGFuZCBhbGlhcyB0YWJsZXMuCisJCS8vIG5vdyB0ZWxsIGl0IHRvIGRlZmluZSB0aGVtIGluIHRoZSByb290IGdyYW1tYXIKKwkJdHR5cGVzV2Fsa2VyLmRlZmluZVRva2VucyhkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5ncmFtbWFyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFuc2xhdGVMZWZ0UmVjdXJzaXZlUnVsZXMoKSB7CisJCUxpc3Q8R3JhbW1hcj4gZ3JhbW1hcnMgPSBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5nZXRQb3N0T3JkZXJlZEdyYW1tYXJMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBncmFtbWFycyE9bnVsbCAmJiBpIDwgZ3JhbW1hcnMuc2l6ZSgpOyBpKyspIHsKKwkJCUdyYW1tYXIgZyA9IGdyYW1tYXJzLmdldChpKTsKKwkJCWlmICggIShnLnR5cGU9PUdyYW1tYXIuUEFSU0VSIHx8IGcudHlwZT09R3JhbW1hci5DT01CSU5FRCkgKSBjb250aW51ZTsKKwkJCWZvciAoR3JhbW1hckFTVCByIDogZy5ncmFtbWFyVHJlZS5maW5kQWxsVHlwZShBTlRMUlBhcnNlci5SVUxFKSkgeworCQkJCWlmICggIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZShyLmdldENoaWxkKDApLmdldFRleHQoKS5jaGFyQXQoMCkpICkgeworCQkJCQlpZiAoIExlZnRSZWN1cnNpdmVSdWxlQW5hbHl6ZXIuaGFzSW1tZWRpYXRlUmVjdXJzaXZlUnVsZVJlZnMociwgci5lbmNsb3NpbmdSdWxlTmFtZSkgKSB7CisJCQkJCQlnLnRyYW5zbGF0ZUxlZnRSZWN1cnNpdmVSdWxlKHIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgZGVmaW5lR3JhbW1hclN5bWJvbHMoKSB7CisJCWRlbGVnYXRlR3JhbW1hclRyZWVSb290LnRyaW1MZXhlckltcG9ydHNJbnRvQ29tYmluZWQoKTsKKwkJTGlzdDxHcmFtbWFyPiBncmFtbWFycyA9IGRlbGVnYXRlR3JhbW1hclRyZWVSb290LmdldFBvc3RPcmRlcmVkR3JhbW1hckxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGdyYW1tYXJzIT1udWxsICYmIGkgPCBncmFtbWFycy5zaXplKCk7IGkrKykgeworCQkJR3JhbW1hciBnID0gZ3JhbW1hcnMuZ2V0KGkpOworCQkJZy5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBncmFtbWFycyE9bnVsbCAmJiBpIDwgZ3JhbW1hcnMuc2l6ZSgpOyBpKyspIHsKKwkJCUdyYW1tYXIgZyA9IGdyYW1tYXJzLmdldChpKTsKKwkJCWcuY2hlY2tOYW1lU3BhY2VBbmRBY3Rpb25zKCk7CisJCX0KKwkJbWluaW1pemVSdWxlU2V0KCk7CisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlTkZBcygpIHsKKwkJaWYgKCBFcnJvck1hbmFnZXIuZG9Ob3RBdHRlbXB0QW5hbHlzaXMoKSApIHsKKwkJCXJldHVybjsKKwkJfQorCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QuZ2V0UG9zdE9yZGVyZWRHcmFtbWFyTGlzdCgpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIyMjIGNyZWF0ZU5GQXMgZm9yIGNvbXBvc2l0ZTsgZ3JhbW1hcnM6ICIrbmFtZXMpOworCQlmb3IgKGludCBpID0gMDsgZ3JhbW1hcnMhPW51bGwgJiYgaSA8IGdyYW1tYXJzLnNpemUoKTsgaSsrKSB7CisJCQlHcmFtbWFyIGcgPSAoR3JhbW1hcilncmFtbWFycy5nZXQoaSk7CisJCQlnLmNyZWF0ZVJ1bGVTdGFydEFuZFN0b3BORkFTdGF0ZXMoKTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgZ3JhbW1hcnMhPW51bGwgJiYgaSA8IGdyYW1tYXJzLnNpemUoKTsgaSsrKSB7CisJCQlHcmFtbWFyIGcgPSAoR3JhbW1hcilncmFtbWFycy5nZXQoaSk7CisJCQlnLmJ1aWxkTkZBKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBtaW5pbWl6ZVJ1bGVTZXQoKSB7CisJCVNldDxTdHJpbmc+IHJ1bGVEZWZzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlfbWluaW1pemVSdWxlU2V0KHJ1bGVEZWZzLCBkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdCk7CisJfQorCisJcHVibGljIHZvaWQgX21pbmltaXplUnVsZVNldChTZXQ8U3RyaW5nPiBydWxlRGVmcywKKwkJCQkJCQkJIENvbXBvc2l0ZUdyYW1tYXJUcmVlIHApIHsKKwkJU2V0PFN0cmluZz4gbG9jYWxSdWxlRGVmcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJU2V0PFN0cmluZz4gb3ZlcnJpZGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkvLyBjb21wdXRlIHNldCBvZiBub24tb3ZlcnJpZGRlbiBydWxlcyBmb3IgdGhpcyBkZWxlZ2F0ZQorCQlmb3IgKFJ1bGUgciA6IHAuZ3JhbW1hci5nZXRSdWxlcygpKSB7CisJCQlpZiAoICFydWxlRGVmcy5jb250YWlucyhyLm5hbWUpICkgeworCQkJCWxvY2FsUnVsZURlZnMuYWRkKHIubmFtZSk7CisJCQl9CisJCQllbHNlIGlmICggIXIubmFtZS5lcXVhbHMoR3JhbW1hci5BUlRJRklDSUFMX1RPS0VOU19SVUxFTkFNRSkgKSB7CisJCQkJLy8gcmVjb3JkIGFueSBvdmVycmlkZGVuIHJ1bGUgJ2NlcHQgdG9rZW5zIHJ1bGUKKwkJCQlvdmVycmlkZXMuYWRkKHIubmFtZSk7CisJCQl9CisJCX0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgZGVmcyBmb3IgIitwLmdyYW1tYXIubmFtZSsiOiAiK2xvY2FsUnVsZURlZnMpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigib3ZlcnJpZGRlbiBydWxlIGZvciAiK3AuZ3JhbW1hci5uYW1lKyI6ICIrb3ZlcnJpZGVzKTsKKwkJcC5ncmFtbWFyLm92ZXJyaWRkZW5SdWxlcyA9IG92ZXJyaWRlczsKKworCQkvLyBtYWtlIHNldCBvZiBhbGwgcnVsZXMgZGVmaW5lZCB0aHVzIGZhciB3YWxraW5nIGRlbGVnYXRpb24gdHJlZS4KKwkJLy8gdGhlIHNhbWUgcnVsZSBpbiB0d28gZGVsZWdhdGVzIHJlc29sdmVzIGluIGZhdm9yIG9mIGZpcnN0IGZvdW5kCisJCS8vIGluIHRyZWUgdGhlcmVmb3JlIHNlY29uZCBtdXN0IG5vdCBiZSBpbmNsdWRlZAorCQlydWxlRGVmcy5hZGRBbGwobG9jYWxSdWxlRGVmcyk7CisKKwkJLy8gcGFzcyBsYXJnZXIgc2V0IG9mIGRlZmluZWQgcnVsZXMgdG8gZGVsZWdhdGVzCisJCWlmICggcC5jaGlsZHJlbiE9bnVsbCApIHsKKwkJCWZvciAoQ29tcG9zaXRlR3JhbW1hclRyZWUgZGVsZWdhdGUgOiBwLmNoaWxkcmVuKSB7CisJCQkJX21pbmltaXplUnVsZVNldChydWxlRGVmcywgZGVsZWdhdGUpOworCQkJfQorCQl9CisJfQorCisJLyoKKwlwdWJsaWMgdm9pZCBtaW5pbWl6ZVJ1bGVTZXQoKSB7CisJCVNldDxSdWxlPiByZWZzID0gX21pbmltaXplUnVsZVNldChkZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiYWxsIHJ1bGUgcmVmczogIityZWZzKTsKKwl9CisKKwlwdWJsaWMgU2V0PFJ1bGU+IF9taW5pbWl6ZVJ1bGVTZXQoQ29tcG9zaXRlR3JhbW1hclRyZWUgcCkgeworCQlTZXQ8UnVsZT4gcmVmcyA9IG5ldyBIYXNoU2V0PFJ1bGU+KCk7CisJCWZvciAoR3JhbW1hckFTVCByZWZBU1QgOiBwLmdyYW1tYXIucnVsZVJlZnMpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmICIrcmVmQVNULmdldFRleHQoKSsiOiAiK3JlZkFTVC5ORkFTdGFydFN0YXRlKworCQkJCQkJCSAgICIgZW5jbG9zaW5nIHJ1bGU6ICIrcmVmQVNULk5GQVN0YXJ0U3RhdGUuZW5jbG9zaW5nUnVsZSsKKwkJCQkJCQkgICAiIGludm9raW5nIHJ1bGU6ICIrKChORkFTdGF0ZSlyZWZBU1QuTkZBU3RhcnRTdGF0ZS50cmFuc2l0aW9uWzBdLnRhcmdldCkuZW5jbG9zaW5nUnVsZSk7CisJCQlyZWZzLmFkZCgoKE5GQVN0YXRlKXJlZkFTVC5ORkFTdGFydFN0YXRlLnRyYW5zaXRpb25bMF0udGFyZ2V0KS5lbmNsb3NpbmdSdWxlKTsKKwkJfQorCisJCWlmICggcC5jaGlsZHJlbiE9bnVsbCApIHsKKwkJCWZvciAoQ29tcG9zaXRlR3JhbW1hclRyZWUgZGVsZWdhdGUgOiBwLmNoaWxkcmVuKSB7CisJCQkJU2V0PFJ1bGU+IGRlbGVnYXRlUnVsZVJlZnMgPSBfbWluaW1pemVSdWxlU2V0KGRlbGVnYXRlKTsKKwkJCQlyZWZzLmFkZEFsbChkZWxlZ2F0ZVJ1bGVSZWZzKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZWZzOworCX0KKwkqLworCisJLyoKKwlwdWJsaWMgdm9pZCBvbGRtaW5pbWl6ZVJ1bGVTZXQoKSB7CisJCS8vIGZpcnN0IHdhbGsgdG8gcmVtb3ZlIGFsbCBvdmVycmlkZGVuIHJ1bGVzCisJCVNldDxTdHJpbmc+IHJ1bGVEZWZzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQlTZXQ8U3RyaW5nPiBydWxlUmVmcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJZm9yIChHcmFtbWFyQVNUIHJlZkFTVCA6IGRlbGVnYXRlR3JhbW1hclRyZWVSb290LmdyYW1tYXIucnVsZVJlZnMpIHsKKwkJCVN0cmluZyBybmFtZSA9IHJlZkFTVC5nZXRUZXh0KCk7CisJCQlydWxlUmVmcy5hZGQocm5hbWUpOworCQl9CisJCV9taW5pbWl6ZVJ1bGVTZXQocnVsZURlZnMsCisJCQkJCQkgcnVsZVJlZnMsCisJCQkJCQkgZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIm92ZXJhbGwgcnVsZSBkZWZzOiAiK3J1bGVEZWZzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBfbWluaW1pemVSdWxlU2V0KFNldDxTdHJpbmc+IHJ1bGVEZWZzLAorCQkJCQkJCQkgU2V0PFN0cmluZz4gcnVsZVJlZnMsCisJCQkJCQkJCSBDb21wb3NpdGVHcmFtbWFyVHJlZSBwKSB7CisJCVNldDxTdHJpbmc+IGxvY2FsUnVsZURlZnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoUnVsZSByIDogcC5ncmFtbWFyLmdldFJ1bGVzKCkpIHsKKwkJCWlmICggIXJ1bGVEZWZzLmNvbnRhaW5zKHIubmFtZSkgKSB7CisJCQkJbG9jYWxSdWxlRGVmcy5hZGQoci5uYW1lKTsKKwkJCQlydWxlRGVmcy5hZGQoci5uYW1lKTsKKwkJCX0KKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgZGVmcyBmb3IgIitwLmdyYW1tYXIubmFtZSsiOiAiK2xvY2FsUnVsZURlZnMpOworCisJCS8vIHJlbW92ZSBsb2NhbGx5LWRlZmluZWQgcnVsZXMgbm90IGluIHJlZiBzZXQKKwkJLy8gZmluZCBpbnRlcnNlY3Rpb24gb2YgbG9jYWwgcnVsZXMgYW5kIHJlZmVyZW5jZXMgZnJvbSBkZWxlZ2F0b3IKKwkJLy8gdGhhdCBpcyBzZXQgb2YgcnVsZXMgbmVlZGVkIGJ5IGRlbGVnYXRvcgorCQlTZXQ8U3RyaW5nPiBsb2NhbFJ1bGVEZWZzU2F0aXNmeWluZ1JlZnNGcm9tQmVsb3cgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoU3RyaW5nIHIgOiBydWxlUmVmcykgeworCQkJaWYgKCBsb2NhbFJ1bGVEZWZzLmNvbnRhaW5zKHIpICkgeworCQkJCWxvY2FsUnVsZURlZnNTYXRpc2Z5aW5nUmVmc0Zyb21CZWxvdy5hZGQocik7CisJCQl9CisJCX0KKworCQkvLyBub3cgZ2V0IGxpc3Qgb2YgcmVmcyBmcm9tIGxvY2FsUnVsZURlZnNTYXRpc2Z5aW5nUmVmc0Zyb21CZWxvdy4KKwkJLy8gVGhvc2UgcnVsZXMgYXJlIGFsc28gYWxsb3dlZCBpbiB0aGlzIGRlbGVnYXRlCisJCWZvciAoR3JhbW1hckFTVCByZWZBU1QgOiBwLmdyYW1tYXIucnVsZVJlZnMpIHsKKwkJCWlmICggbG9jYWxSdWxlRGVmc1NhdGlzZnlpbmdSZWZzRnJvbUJlbG93LmNvbnRhaW5zKHJlZkFTVC5lbmNsb3NpbmdSdWxlTmFtZSkgKSB7CisJCQkJLy8gZm91bmQgcnVsZSByZWYgd2l0aGluIG5lZWRlZCBydWxlCisJCQl9CisJCX0KKworCQkvLyByZW1vdmUgcnVsZSByZWZzIG5vdCBpbiB0aGUgbmV3IHJ1bGUgZGVmIHNldAorCisJCS8vIHdhbGsgYWxsIGNoaWxkcmVuLCBhZGRpbmcgcnVsZXMgbm90IGFscmVhZHkgZGVmaW5lZAorCQlpZiAoIHAuY2hpbGRyZW4hPW51bGwgKSB7CisJCQlmb3IgKENvbXBvc2l0ZUdyYW1tYXJUcmVlIGRlbGVnYXRlIDogcC5jaGlsZHJlbikgeworCQkJCV9taW5pbWl6ZVJ1bGVTZXQocnVsZURlZnMsIHJ1bGVSZWZzLCBkZWxlZ2F0ZSk7CisJCQl9CisJCX0KKwl9CisJKi8KKworCS8qCisJcHVibGljIHZvaWQgdHJhY2tORkFTdGF0ZXNUaGF0SGF2ZUxhYmVsZWRFZGdlKExhYmVsIGxhYmVsLAorCQkJCQkJCQkJCQkJICBORkFTdGF0ZSBzdGF0ZVdpdGhMYWJlbGVkRWRnZSkKKwl7CisJCVNldDxORkFTdGF0ZT4gc3RhdGVzID0gdHlwZVRvTkZBU3RhdGVzV2l0aEVkZ2VPZlR5cGVNYXAuZ2V0KGxhYmVsKTsKKwkJaWYgKCBzdGF0ZXM9PW51bGwgKSB7CisJCQlzdGF0ZXMgPSBuZXcgSGFzaFNldDxORkFTdGF0ZT4oKTsKKwkJCXR5cGVUb05GQVN0YXRlc1dpdGhFZGdlT2ZUeXBlTWFwLnB1dChsYWJlbCwgc3RhdGVzKTsKKwkJfQorCQlzdGF0ZXMuYWRkKHN0YXRlV2l0aExhYmVsZWRFZGdlKTsKKwl9CisKKwlwdWJsaWMgTWFwPExhYmVsLCBTZXQ8TkZBU3RhdGU+PiBnZXRUeXBlVG9ORkFTdGF0ZXNXaXRoRWRnZU9mVHlwZU1hcCgpIHsKKwkJcmV0dXJuIHR5cGVUb05GQVN0YXRlc1dpdGhFZGdlT2ZUeXBlTWFwOworCX0KKworCXB1YmxpYyBTZXQ8TkZBU3RhdGU+IGdldFN0YXRlc1dpdGhFZGdlKExhYmVsIGxhYmVsKSB7CisJCXJldHVybiB0eXBlVG9ORkFTdGF0ZXNXaXRoRWRnZU9mVHlwZU1hcC5nZXQobGFiZWwpOworCX0KKyovCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0NvbXBvc2l0ZUdyYW1tYXJUcmVlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0NvbXBvc2l0ZUdyYW1tYXJUcmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhYjM4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvQ29tcG9zaXRlR3JhbW1hclRyZWUuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIEEgdHJlZSBvZiBncmFtbWFycyAqLworcHVibGljIGNsYXNzIENvbXBvc2l0ZUdyYW1tYXJUcmVlIHsKKwlwcm90ZWN0ZWQgTGlzdDxDb21wb3NpdGVHcmFtbWFyVHJlZT4gY2hpbGRyZW47CisJcHVibGljIEdyYW1tYXIgZ3JhbW1hcjsKKworCS8qKiBXaG8gaXMgdGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZTsgaWYgbnVsbCwgaW1wbGllcyBub2RlIGlzIHJvb3QgKi8KKwlwdWJsaWMgQ29tcG9zaXRlR3JhbW1hclRyZWUgcGFyZW50OworCisJcHVibGljIENvbXBvc2l0ZUdyYW1tYXJUcmVlKEdyYW1tYXIgZykgeworCQlncmFtbWFyID0gZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChDb21wb3NpdGVHcmFtbWFyVHJlZSB0KSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhZGQgIit0LnRvU3RyaW5nVHJlZSgpKyIgYXMgY2hpbGQgdG8gIit0aGlzLnRvU3RyaW5nVHJlZSgpKTsKKwkJaWYgKCB0PT1udWxsICkgeworCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nIHVwb24gYWRkQ2hpbGQobnVsbCkKKwkJfQorCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgeworCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PENvbXBvc2l0ZUdyYW1tYXJUcmVlPigpOworCQl9CisJCWNoaWxkcmVuLmFkZCh0KTsKKwkJdC5wYXJlbnQgPSB0aGlzOworCX0KKworCS8qKiBGaW5kIGEgcnVsZSBieSBsb29raW5nIGluIGN1cnJlbnQgZ3JhbW1hciB0aGVuIGRvd24gdG93YXJkcyB0aGUKKwkgKiAgZGVsZWdhdGUgZ3JhbW1hcnMuCisJICovCisJcHVibGljIFJ1bGUgZ2V0UnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKKwkJUnVsZSByID0gZ3JhbW1hci5nZXRMb2NhbGx5RGVmaW5lZFJ1bGUocnVsZU5hbWUpOworCQlmb3IgKGludCBpID0gMDsgcj09bnVsbCAmJiBjaGlsZHJlbiE9bnVsbCAmJiBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCUNvbXBvc2l0ZUdyYW1tYXJUcmVlIGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpOworCQkJciA9IGNoaWxkLmdldFJ1bGUocnVsZU5hbWUpOworCQl9CisJCXJldHVybiByOworCX0KKworCS8qKiBGaW5kIGFuIG9wdGlvbiBieSBsb29raW5nIHVwIHRvd2FyZHMgdGhlIHJvb3QgZ3JhbW1hciByYXRoZXIgdGhhbiBkb3duICovCisJcHVibGljIE9iamVjdCBnZXRPcHRpb24oU3RyaW5nIGtleSkgeworCQlpZiAoIGdyYW1tYXIudG9vbCE9bnVsbCAmJiBrZXkhPW51bGwgJiYga2V5LmVxdWFscygibGFuZ3VhZ2UiKSAmJgorCQkJIGdyYW1tYXIudG9vbC5mb3JjZWRMYW5ndWFnZU9wdGlvbiE9bnVsbCApIHsKKwkJCXJldHVybiBncmFtbWFyLnRvb2wuZm9yY2VkTGFuZ3VhZ2VPcHRpb247CisJCX0KKwkJT2JqZWN0IG8gPSBncmFtbWFyLmdldExvY2FsbHlEZWZpbmVkT3B0aW9uKGtleSk7CisJCWlmICggbyE9bnVsbCApIHsKKwkJCXJldHVybiBvOworCQl9CisJCWlmICggcGFyZW50IT1udWxsICkgeworCQkJcmV0dXJuIHBhcmVudC5nZXRPcHRpb24oa2V5KTsKKwkJfQorCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCisJfQorCisJcHVibGljIENvbXBvc2l0ZUdyYW1tYXJUcmVlIGZpbmROb2RlKEdyYW1tYXIgZykgeworCQlpZiAoIGc9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIHRoaXMuZ3JhbW1hciA9PSBnICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJQ29tcG9zaXRlR3JhbW1hclRyZWUgbiA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBuPT1udWxsICYmIGNoaWxkcmVuIT1udWxsICYmIGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJQ29tcG9zaXRlR3JhbW1hclRyZWUgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQluID0gY2hpbGQuZmluZE5vZGUoZyk7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCisJcHVibGljIENvbXBvc2l0ZUdyYW1tYXJUcmVlIGZpbmROb2RlKFN0cmluZyBncmFtbWFyTmFtZSkgeworCQlpZiAoIGdyYW1tYXJOYW1lPT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKCBncmFtbWFyTmFtZS5lcXVhbHModGhpcy5ncmFtbWFyLm5hbWUpICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJQ29tcG9zaXRlR3JhbW1hclRyZWUgbiA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBuPT1udWxsICYmIGNoaWxkcmVuIT1udWxsICYmIGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJQ29tcG9zaXRlR3JhbW1hclRyZWUgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQluID0gY2hpbGQuZmluZE5vZGUoZ3JhbW1hck5hbWUpOworCQl9CisJCXJldHVybiBuOworCX0KKworCS8qKiBSZXR1cm4gYSBwb3N0b3JkZXIgbGlzdCBvZiBncmFtbWFyczsgcm9vdCBpcyBsYXN0IGluIGxpc3QgKi8KKwlwdWJsaWMgTGlzdDxHcmFtbWFyPiBnZXRQb3N0T3JkZXJlZEdyYW1tYXJMaXN0KCkgeworCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gbmV3IEFycmF5TGlzdDxHcmFtbWFyPigpOworCQlfZ2V0UG9zdE9yZGVyZWRHcmFtbWFyTGlzdChncmFtbWFycyk7CisJCXJldHVybiBncmFtbWFyczsKKwl9CisKKwkvKiogd29yayBmb3IgZ2V0UG9zdE9yZGVyZWRHcmFtbWFyTGlzdCAqLworCXByb3RlY3RlZCB2b2lkIF9nZXRQb3N0T3JkZXJlZEdyYW1tYXJMaXN0KExpc3Q8R3JhbW1hcj4gZ3JhbW1hcnMpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGNoaWxkcmVuIT1udWxsICYmIGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJQ29tcG9zaXRlR3JhbW1hclRyZWUgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQljaGlsZC5fZ2V0UG9zdE9yZGVyZWRHcmFtbWFyTGlzdChncmFtbWFycyk7CisJCX0KKwkJZ3JhbW1hcnMuYWRkKHRoaXMuZ3JhbW1hcik7CisJfQorCisJLyoqIFJldHVybiBhIHByZW9yZGVyIGxpc3Qgb2YgZ3JhbW1hcnM7IHJvb3QgaXMgZmlyc3QgaW4gbGlzdCAqLworCXB1YmxpYyBMaXN0PEdyYW1tYXI+IGdldFByZU9yZGVyZWRHcmFtbWFyTGlzdCgpIHsKKwkJTGlzdDxHcmFtbWFyPiBncmFtbWFycyA9IG5ldyBBcnJheUxpc3Q8R3JhbW1hcj4oKTsKKwkJX2dldFByZU9yZGVyZWRHcmFtbWFyTGlzdChncmFtbWFycyk7CisJCXJldHVybiBncmFtbWFyczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBfZ2V0UHJlT3JkZXJlZEdyYW1tYXJMaXN0KExpc3Q8R3JhbW1hcj4gZ3JhbW1hcnMpIHsKKwkJZ3JhbW1hcnMuYWRkKHRoaXMuZ3JhbW1hcik7CisJCWZvciAoaW50IGkgPSAwOyBjaGlsZHJlbiE9bnVsbCAmJiBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCUNvbXBvc2l0ZUdyYW1tYXJUcmVlIGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpOworCQkJY2hpbGQuX2dldFByZU9yZGVyZWRHcmFtbWFyTGlzdChncmFtbWFycyk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0cmltTGV4ZXJJbXBvcnRzSW50b0NvbWJpbmVkKCkgeworCQlDb21wb3NpdGVHcmFtbWFyVHJlZSBwID0gdGhpczsKKwkJaWYgKCBwLmdyYW1tYXIudHlwZSA9PSBHcmFtbWFyLkxFWEVSICYmIHAucGFyZW50IT1udWxsICYmCisJCQkgcC5wYXJlbnQuZ3JhbW1hci50eXBlID09IEdyYW1tYXIuQ09NQklORUQgKQorCQl7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigid2Fja2luZyAiK3AuZ3JhbW1hci5uYW1lKyIgZnJvbSAiK3AucGFyZW50LmdyYW1tYXIubmFtZSk7CisJCQlwLnBhcmVudC5jaGlsZHJlbi5yZW1vdmUodGhpcyk7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGNoaWxkcmVuIT1udWxsICYmIGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJQ29tcG9zaXRlR3JhbW1hclRyZWUgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQljaGlsZC50cmltTGV4ZXJJbXBvcnRzSW50b0NvbWJpbmVkKCk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9ET1RHZW5lcmF0b3IuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvRE9UR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5MDZhMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvRE9UR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy4qOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFOVExSUGFyc2VyOworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1RHcm91cDsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1RHcm91cERpcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKiogVGhlIERPVCAocGFydCBvZiBncmFwaHZpeikgZ2VuZXJhdGlvbiBhc3BlY3QuICovCitwdWJsaWMgY2xhc3MgRE9UR2VuZXJhdG9yIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RSSVBfTk9OUkVEVUNFRF9TVEFURVMgPSBmYWxzZTsKKworCXByb3RlY3RlZCBTdHJpbmcgYXJyb3doZWFkPSJub3JtYWwiOworCXByb3RlY3RlZCBTdHJpbmcgcmFua2Rpcj0iTFIiOworCisJLyoqIExpYnJhcnkgb2Ygb3V0cHV0IHRlbXBsYXRlczsgdXNlIDxhdHRybmFtZT4gZm9ybWF0ICovCisgICAgcHVibGljIHN0YXRpYyBTVEdyb3VwIHN0bGliID0gbmV3IFNUR3JvdXBEaXIoIm9yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvZGZhIik7CisKKyAgICAvKiogVG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gd2hlbiB3YWxraW5nIHN0YXRlIG1hY2hpbmVzLCByZWNvcmQKKyAgICAgKiAgd2hpY2ggc3RhdGVzIHdlJ3ZlIHZpc2l0ZWQuICBNYWtlIGEgbmV3IHNldCBldmVyeSB0aW1lIHlvdSBzdGFydAorICAgICAqICB3YWxraW5nIGluIGNhc2UgeW91IHJldXNlIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQgbWFya2VkU3RhdGVzID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBHcmFtbWFyIGdyYW1tYXI7CisKKyAgICAvKiogVGhpcyBhc3BlY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZ3JhbW1hciAqLworCXB1YmxpYyBET1RHZW5lcmF0b3IoR3JhbW1hciBncmFtbWFyKSB7CisJCXRoaXMuZ3JhbW1hciA9IGdyYW1tYXI7CisJfQorCisgICAgLyoqIFJldHVybiBhIFN0cmluZyBjb250YWluaW5nIGEgRE9UIGRlc2NyaXB0aW9uIHRoYXQsIHdoZW4gZGlzcGxheWVkLAorICAgICAqICB3aWxsIHNob3cgdGhlIGluY29taW5nIHN0YXRlIG1hY2hpbmUgdmlzdWFsbHkuICBBbGwgbm9kZXMgcmVhY2hhYmxlCisgICAgICogIGZyb20gc3RhcnRTdGF0ZSB3aWxsIGJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RE9UKFN0YXRlIHN0YXJ0U3RhdGUpIHsKKwkJaWYgKCBzdGFydFN0YXRlPT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJLy8gVGhlIG91dHB1dCBET1QgZ3JhcGggZm9yIHZpc3VhbGl6YXRpb24KKwkJU1QgZG90ID0gbnVsbDsKKwkJbWFya2VkU3RhdGVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgaWYgKCBzdGFydFN0YXRlIGluc3RhbmNlb2YgREZBU3RhdGUgKSB7CisgICAgICAgICAgICBkb3QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJkZmEiKTsKKwkJCWRvdC5hZGQoInN0YXJ0U3RhdGUiLAorCQkJCQlVdGlscy5pbnRlZ2VyKHN0YXJ0U3RhdGUuc3RhdGVOdW1iZXIpKTsKKwkJCWRvdC5hZGQoInVzZUJveCIsCisJCQkJCUJvb2xlYW4udmFsdWVPZihUb29sLmludGVybmFsT3B0aW9uX1Nob3dORkFDb25maWdzSW5ERkEpKTsKKwkJCXdhbGtDcmVhdGluZ0RGQURPVChkb3QsIChERkFTdGF0ZSlzdGFydFN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvdCA9IHN0bGliLmdldEluc3RhbmNlT2YoIm5mYSIpOworCQkJZG90LmFkZCgic3RhcnRTdGF0ZSIsCisJCQkJCVV0aWxzLmludGVnZXIoc3RhcnRTdGF0ZS5zdGF0ZU51bWJlcikpOworCQkJd2Fsa1J1bGVORkFDcmVhdGluZ0RPVChkb3QsIHN0YXJ0U3RhdGUpOworICAgICAgICB9CisJCWRvdC5hZGQoInJhbmtkaXIiLCByYW5rZGlyKTsKKyAgICAgICAgcmV0dXJuIGRvdC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIERPVCBkZXNjcmlwdGlvbiB0aGF0LCB3aGVuIGRpc3BsYXllZCwKKyAgICAgKiAgd2lsbCBzaG93IHRoZSBpbmNvbWluZyBzdGF0ZSBtYWNoaW5lIHZpc3VhbGx5LiAgQWxsIG5vZGVzIHJlYWNoYWJsZQorICAgICAqICBmcm9tIHN0YXJ0U3RhdGUgd2lsbCBiZSBpbmNsdWRlZC4KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJ1bGVORkFET1QoU3RhdGUgc3RhcnRTdGF0ZSkgeworICAgICAgICAvLyBUaGUgb3V0cHV0IERPVCBncmFwaCBmb3IgdmlzdWFsaXphdGlvbgorICAgICAgICBTVCBkb3QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJuZmEiKTsKKworICAgICAgICBtYXJrZWRTdGF0ZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBkb3QuYWRkKCJzdGFydFN0YXRlIiwKKyAgICAgICAgICAgICAgICBVdGlscy5pbnRlZ2VyKHN0YXJ0U3RhdGUuc3RhdGVOdW1iZXIpKTsKKyAgICAgICAgd2Fsa1J1bGVORkFDcmVhdGluZ0RPVChkb3QsIHN0YXJ0U3RhdGUpOworICAgICAgICByZXR1cm4gZG90LnRvU3RyaW5nKCk7CisgICAgfQorCSAqLworCisgICAgLyoqIERvIGEgZGVwdGgtZmlyc3Qgd2FsayBvZiB0aGUgc3RhdGUgbWFjaGluZSBncmFwaCBhbmQKKyAgICAgKiAgZmlsbCBhIERPVCBkZXNjcmlwdGlvbiB0ZW1wbGF0ZS4gIEtlZXAgZmlsbGluZyB0aGUKKyAgICAgKiAgc3RhdGVzIGFuZCBlZGdlcyBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdhbGtDcmVhdGluZ0RGQURPVChTVCBkb3QsCisJCQkJCQkJCQkgIERGQVN0YXRlIHMpCisgICAgeworCQlpZiAoIG1hcmtlZFN0YXRlcy5jb250YWlucyhVdGlscy5pbnRlZ2VyKHMuc3RhdGVOdW1iZXIpKSApIHsKKwkJCXJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkIHRoaXMgbm9kZQorICAgICAgICB9CisKKwkJbWFya2VkU3RhdGVzLmFkZChVdGlscy5pbnRlZ2VyKHMuc3RhdGVOdW1iZXIpKTsgLy8gbWFyayB0aGlzIG5vZGUgYXMgY29tcGxldGVkLgorCisgICAgICAgIC8vIGZpcnN0IGFkZCB0aGlzIG5vZGUKKyAgICAgICAgU1Qgc3Q7CisgICAgICAgIGlmICggcy5pc0FjY2VwdFN0YXRlKCkgKSB7CisgICAgICAgICAgICBzdCA9IHN0bGliLmdldEluc3RhbmNlT2YoInN0b3BzdGF0ZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJzdGF0ZSIpOworICAgICAgICB9CisgICAgICAgIHN0LmFkZCgibmFtZSIsIGdldFN0YXRlTGFiZWwocykpOworICAgICAgICBkb3QuYWRkKCJzdGF0ZXMiLCBzdCk7CisKKyAgICAgICAgLy8gbWFrZSBhIERPVCBlZGdlIGZvciBlYWNoIHRyYW5zaXRpb24KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKTsgaSsrKSB7CisJCQlUcmFuc2l0aW9uIGVkZ2UgPSAoVHJhbnNpdGlvbikgcy50cmFuc2l0aW9uKGkpOworCQkJLyoKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGZhICIrcy5kZmEuZGVjaXNpb25OdW1iZXIrCisJCQkJIiBlZGdlIGZyb20gcyIrcy5zdGF0ZU51bWJlcisiIFsiK2krIl0gb2YgIitzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKSk7CisJCQkqLworCQkJaWYgKCBTVFJJUF9OT05SRURVQ0VEX1NUQVRFUyApIHsKKwkJCQlpZiAoIGVkZ2UudGFyZ2V0IGluc3RhbmNlb2YgREZBU3RhdGUgJiYKKwkJCQkJKChERkFTdGF0ZSllZGdlLnRhcmdldCkuZ2V0QWNjZXB0U3RhdGVSZWFjaGFibGUoKSE9REZBLlJFQUNIQUJMRV9ZRVMgKQorCQkJCXsKKwkJCQkJY29udGludWU7IC8vIGRvbid0IGdlbmVyYXRlIG5vZGVzIGZvciB0ZXJtaW5hbCBzdGF0ZXMKKwkJCQl9CisJCQl9CisJCQlzdCA9IHN0bGliLmdldEluc3RhbmNlT2YoImVkZ2UiKTsKKwkJCXN0LmFkZCgibGFiZWwiLCBnZXRFZGdlTGFiZWwoZWRnZSkpOworCQkJc3QuYWRkKCJzcmMiLCBnZXRTdGF0ZUxhYmVsKHMpKTsKKyAgICAgICAgICAgIHN0LmFkZCgidGFyZ2V0IiwgZ2V0U3RhdGVMYWJlbChlZGdlLnRhcmdldCkpOworCQkJc3QuYWRkKCJhcnJvd2hlYWQiLCBhcnJvd2hlYWQpOworICAgICAgICAgICAgZG90LmFkZCgiZWRnZXMiLCBzdCk7CisgICAgICAgICAgICB3YWxrQ3JlYXRpbmdERkFET1QoZG90LCAoREZBU3RhdGUpZWRnZS50YXJnZXQpOyAvLyBrZWVwIHdhbGtpbicKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBEbyBhIGRlcHRoLWZpcnN0IHdhbGsgb2YgdGhlIHN0YXRlIG1hY2hpbmUgZ3JhcGggYW5kCisgICAgICogIGZpbGwgYSBET1QgZGVzY3JpcHRpb24gdGVtcGxhdGUuICBLZWVwIGZpbGxpbmcgdGhlCisgICAgICogIHN0YXRlcyBhbmQgZWRnZXMgYXR0cmlidXRlcy4gIFdlIGtub3cgdGhpcyBpcyBhbiBORkEKKyAgICAgKiAgZm9yIGEgcnVsZSBzbyBkb24ndCB0cmF2ZXJzZSBlZGdlcyB0byBvdGhlciBydWxlcyBhbmQKKyAgICAgKiAgZG9uJ3QgZ28gcGFzdCBydWxlIGVuZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3YWxrUnVsZU5GQUNyZWF0aW5nRE9UKFNUIGRvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlIHMpCisgICAgeworICAgICAgICBpZiAoIG1hcmtlZFN0YXRlcy5jb250YWlucyhzKSApIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkIHRoaXMgbm9kZQorICAgICAgICB9CisKKyAgICAgICAgbWFya2VkU3RhdGVzLmFkZChzKTsgLy8gbWFyayB0aGlzIG5vZGUgYXMgY29tcGxldGVkLgorCisgICAgICAgIC8vIGZpcnN0IGFkZCB0aGlzIG5vZGUKKyAgICAgICAgU1Qgc3RhdGVTVDsKKyAgICAgICAgaWYgKCBzLmlzQWNjZXB0U3RhdGUoKSApIHsKKyAgICAgICAgICAgIHN0YXRlU1QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJzdG9wc3RhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRlU1QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJzdGF0ZSIpOworICAgICAgICB9CisgICAgICAgIHN0YXRlU1QuYWRkKCJuYW1lIiwgZ2V0U3RhdGVMYWJlbChzKSk7CisgICAgICAgIGRvdC5hZGQoInN0YXRlcyIsIHN0YXRlU1QpOworCisgICAgICAgIGlmICggcy5pc0FjY2VwdFN0YXRlKCkgKSAgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCBnbyBwYXN0IGVuZCBvZiBydWxlIG5vZGUgdG8gdGhlIGZvbGxvdyBzdGF0ZXMKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogaWYgZGVjaXNpb24gcG9pbnQsIHRoZW4gbGluZSB1cCB0aGUgYWx0IHN0YXJ0IHN0YXRlcworICAgICAgICAvLyB1bmxlc3MgaXQncyBhbiBlbmQgb2YgYmxvY2sKKwkJaWYgKCAoKE5GQVN0YXRlKXMpLmlzRGVjaXNpb25TdGF0ZSgpICkgeworCQkJR3JhbW1hckFTVCBuID0gKChORkFTdGF0ZSlzKS5hc3NvY2lhdGVkQVNUTm9kZTsKKwkJCWlmICggbiE9bnVsbCAmJiBuLmdldFR5cGUoKSE9QU5UTFJQYXJzZXIuRU9CICkgeworCQkJCVNUIHJhbmtTVCA9IHN0bGliLmdldEluc3RhbmNlT2YoImRlY2lzaW9uLXJhbmsiKTsKKwkJCQlORkFTdGF0ZSBhbHQgPSAoTkZBU3RhdGUpczsKKwkJCQl3aGlsZSAoIGFsdCE9bnVsbCApIHsKKwkJCQkJcmFua1NULmFkZCgic3RhdGVzIiwgZ2V0U3RhdGVMYWJlbChhbHQpKTsKKwkJCQkJaWYgKCBhbHQudHJhbnNpdGlvblsxXSAhPW51bGwgKSB7CisJCQkJCQlhbHQgPSAoTkZBU3RhdGUpYWx0LnRyYW5zaXRpb25bMV0udGFyZ2V0OworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJYWx0PW51bGw7CisJCQkJCX0KKwkJCQl9CisJCQkJZG90LmFkZCgiZGVjaXNpb25SYW5rcyIsIHJhbmtTVCk7CisJCQl9CisJCX0KKworICAgICAgICAvLyBtYWtlIGEgRE9UIGVkZ2UgZm9yIGVhY2ggdHJhbnNpdGlvbgorCQlTVCBlZGdlU1QgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHMuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBpKyspIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb24gZWRnZSA9IChUcmFuc2l0aW9uKSBzLnRyYW5zaXRpb24oaSk7CisgICAgICAgICAgICBpZiAoIGVkZ2UgaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24gKSB7CisgICAgICAgICAgICAgICAgUnVsZUNsb3N1cmVUcmFuc2l0aW9uIHJyID0gKChSdWxlQ2xvc3VyZVRyYW5zaXRpb24pZWRnZSk7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QganVtcCB0byBvdGhlciBydWxlcywgYnV0IGRpc3BsYXkgZWRnZSB0byBmb2xsb3cgbm9kZQorICAgICAgICAgICAgICAgIGVkZ2VTVCA9IHN0bGliLmdldEluc3RhbmNlT2YoImVkZ2UiKTsKKwkJCQlpZiAoIHJyLnJ1bGUuZ3JhbW1hciAhPSBncmFtbWFyICkgeworCQkJCQllZGdlU1QuYWRkKCJsYWJlbCIsICI8IiArIHJyLnJ1bGUuZ3JhbW1hci5uYW1lICsgIi4iICsgcnIucnVsZS5uYW1lICsgIj4iKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWVkZ2VTVC5hZGQoImxhYmVsIiwgIjwiICsgcnIucnVsZS5uYW1lICsgIj4iKTsKKwkJCQl9CisJCQkJZWRnZVNULmFkZCgic3JjIiwgZ2V0U3RhdGVMYWJlbChzKSk7CisJCQkJZWRnZVNULmFkZCgidGFyZ2V0IiwgZ2V0U3RhdGVMYWJlbChyci5mb2xsb3dTdGF0ZSkpOworCQkJCWVkZ2VTVC5hZGQoImFycm93aGVhZCIsIGFycm93aGVhZCk7CisgICAgICAgICAgICAgICAgZG90LmFkZCgiZWRnZXMiLCBlZGdlU1QpOworCQkJCXdhbGtSdWxlTkZBQ3JlYXRpbmdET1QoZG90LCByci5mb2xsb3dTdGF0ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisJCQlpZiAoIGVkZ2UuaXNBY3Rpb24oKSApIHsKKwkJCQllZGdlU1QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJhY3Rpb24tZWRnZSIpOworCQkJfQorCQkJZWxzZSBpZiAoIGVkZ2UuaXNFcHNpbG9uKCkgKSB7CisJCQkJZWRnZVNUID0gc3RsaWIuZ2V0SW5zdGFuY2VPZigiZXBzaWxvbi1lZGdlIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQllZGdlU1QgPSBzdGxpYi5nZXRJbnN0YW5jZU9mKCJlZGdlIik7CisJCQl9CisJCQllZGdlU1QuYWRkKCJsYWJlbCIsIGdldEVkZ2VMYWJlbChlZGdlKSk7CisgICAgICAgICAgICBlZGdlU1QuYWRkKCJzcmMiLCBnZXRTdGF0ZUxhYmVsKHMpKTsKKwkJCWVkZ2VTVC5hZGQoInRhcmdldCIsIGdldFN0YXRlTGFiZWwoZWRnZS50YXJnZXQpKTsKKwkJCWVkZ2VTVC5hZGQoImFycm93aGVhZCIsIGFycm93aGVhZCk7CisgICAgICAgICAgICBkb3QuYWRkKCJlZGdlcyIsIGVkZ2VTVCk7CisgICAgICAgICAgICB3YWxrUnVsZU5GQUNyZWF0aW5nRE9UKGRvdCwgZWRnZS50YXJnZXQpOyAvLyBrZWVwIHdhbGtpbicKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisJcHVibGljIHZvaWQgd3JpdGVET1RGaWxlc0ZvckFsbFJ1bGVORkFzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29sbGVjdGlvbiBydWxlcyA9IGdyYW1tYXIuZ2V0UnVsZXMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdHIgPSBydWxlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworCQkJR3JhbW1hci5SdWxlIHIgPSAoR3JhbW1hci5SdWxlKSBpdHIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHJ1bGVOYW1lID0gci5uYW1lOworICAgICAgICAgICAgd3JpdGVET1RGaWxlKAorICAgICAgICAgICAgICAgICAgICBydWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0UnVsZU5GQURPVChncmFtbWFyLmdldFJ1bGVTdGFydFN0YXRlKHJ1bGVOYW1lKSkpOworICAgICAgICB9CisgICAgfQorICAgICovCisKKyAgICAvKgorCXB1YmxpYyB2b2lkIHdyaXRlRE9URmlsZXNGb3JBbGxEZWNpc2lvbkRGQXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBmb3IgZGVidWdnaW5nLCBjcmVhdGUgYSBET1QgZmlsZSBmb3IgZWFjaCBkZWNpc2lvbiBpbgorICAgICAgICAvLyBhIGRpcmVjdG9yeSBuYW1lZCBmb3IgdGhlIGdyYW1tYXIuCisgICAgICAgIEZpbGUgZ3JhbW1hckRpciA9IG5ldyBGaWxlKGdyYW1tYXIubmFtZSsiX0RGQXMiKTsKKyAgICAgICAgZ3JhbW1hckRpci5ta2RpcnMoKTsKKyAgICAgICAgTGlzdCBkZWNpc2lvbkxpc3QgPSBncmFtbWFyLmdldERlY2lzaW9uTkZBU3RhcnRTdGF0ZUxpc3QoKTsKKyAgICAgICAgaWYgKCBkZWNpc2lvbkxpc3Q9PW51bGwgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBJdGVyYXRvciBpdGVyID0gZGVjaXNpb25MaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgTkZBU3RhdGUgZGVjaXNpb25TdGF0ZSA9IChORkFTdGF0ZSlpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIERGQSBkZmEgPSBkZWNpc2lvblN0YXRlLmdldERlY2lzaW9uQVNUTm9kZSgpLmdldExvb2thaGVhZERGQSgpOworICAgICAgICAgICAgaWYgKCBkZmEhPW51bGwgKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvdCA9IGdldERPVCggZGZhLnN0YXJ0U3RhdGUgKTsKKyAgICAgICAgICAgICAgICB3cml0ZURPVEZpbGUoZ3JhbW1hckRpcisiL2RlYy0iK2ksIGRvdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgKi8KKworICAgIC8qKiBGaXggZWRnZSBzdHJpbmdzIHNvIHRoZXkgcHJpbnQgb3V0IGluIERPVCBwcm9wZXJseTsKKwkgKiAgZ2VuZXJhdGUgYW55IGdhdGVkIHByZWRpY2F0ZXMgb24gZWRnZSB0b28uCisJICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFZGdlTGFiZWwoVHJhbnNpdGlvbiBlZGdlKSB7CisJCVN0cmluZyBsYWJlbCA9IGVkZ2UubGFiZWwudG9TdHJpbmcoZ3JhbW1hcik7CisJCWxhYmVsID0gVXRpbHMucmVwbGFjZShsYWJlbCwiXFwiLCAiXFxcXCIpOworCQlsYWJlbCA9IFV0aWxzLnJlcGxhY2UobGFiZWwsIlwiIiwgIlxcXCIiKTsKKwkJbGFiZWwgPSBVdGlscy5yZXBsYWNlKGxhYmVsLCJcbiIsICJcXFxcbiIpOworCQlsYWJlbCA9IFV0aWxzLnJlcGxhY2UobGFiZWwsIlxyIiwgIiIpOworCQlpZiAoIGxhYmVsLmVxdWFscyhMYWJlbC5FUFNJTE9OX1NUUikgKSB7CisgICAgICAgICAgICBsYWJlbCA9ICJlIjsKKyAgICAgICAgfQorCQlTdGF0ZSB0YXJnZXQgPSBlZGdlLnRhcmdldDsKKwkJaWYgKCAhZWRnZS5pc1NlbWFudGljUHJlZGljYXRlKCkgJiYgdGFyZ2V0IGluc3RhbmNlb2YgREZBU3RhdGUgKSB7CisJCQkvLyBsb29rIGZvciBnYXRlZCBwcmVkaWNhdGVzOyBkb24ndCBhZGQgZ2F0ZWQgdG8gc2ltcGxlIHNlbXByZWQgZWRnZXMKKwkJCVNlbWFudGljQ29udGV4dCBwcmVkcyA9CisJCQkJKChERkFTdGF0ZSl0YXJnZXQpLmdldEdhdGVkUHJlZGljYXRlc0luTkZBQ29uZmlndXJhdGlvbnMoKTsKKwkJCWlmICggcHJlZHMhPW51bGwgKSB7CisJCQkJU3RyaW5nIHByZWRzU3RyID0gIiI7CisJCQkJcHJlZHNTdHIgPSAiJiZ7IisKKwkJCQkJcHJlZHMuZ2VuRXhwcihncmFtbWFyLmdlbmVyYXRvciwKKwkJCQkJCQkJICBncmFtbWFyLmdlbmVyYXRvci5nZXRUZW1wbGF0ZXMoKSwgbnVsbCkudG9TdHJpbmcoKQorCQkJCQkrIn0/IjsKKwkJCQlsYWJlbCArPSBwcmVkc1N0cjsKKwkJCX0KKwkJfQorICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdGF0ZUxhYmVsKFN0YXRlIHMpIHsKKyAgICAgICAgaWYgKCBzPT1udWxsICkgeworICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc3RhdGVMYWJlbCA9IFN0cmluZy52YWx1ZU9mKHMuc3RhdGVOdW1iZXIpOworCQlpZiAoIHMgaW5zdGFuY2VvZiBERkFTdGF0ZSApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDI1MCk7CisJCQlidWYuYXBwZW5kKCdzJyk7CisJCQlidWYuYXBwZW5kKHMuc3RhdGVOdW1iZXIpOworCQkJaWYgKCBUb29sLmludGVybmFsT3B0aW9uX1Nob3dORkFDb25maWdzSW5ERkEgKSB7CisJCQkJaWYgKCBzIGluc3RhbmNlb2YgREZBU3RhdGUgKSB7CisJCQkJCWlmICggKChERkFTdGF0ZSlzKS5hYm9ydGVkRHVlVG9SZWN1cnNpb25PdmVyZmxvdyApIHsKKwkJCQkJCWJ1Zi5hcHBlbmQoIlxcbiIpOworCQkJCQkJYnVmLmFwcGVuZCgiYWJvcnRlZER1ZVRvUmVjdXJzaW9uT3ZlcmZsb3ciKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlTZXQgYWx0cyA9ICgoREZBU3RhdGUpcykuZ2V0QWx0U2V0KCk7CisJCQkJaWYgKCBhbHRzIT1udWxsICkgeworCQkJCQlidWYuYXBwZW5kKCJcXG4iKTsKKwkJCQkJLy8gc2VwYXJhdGUgYWx0cworCQkJCQlMaXN0IGFsdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCWFsdExpc3QuYWRkQWxsKGFsdHMpOworCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGFsdExpc3QpOworCQkJCQlTZXQgY29uZmlndXJhdGlvbnMgPSAoKERGQVN0YXRlKSBzKS5uZmFDb25maWd1cmF0aW9uczsKKwkJCQkJZm9yIChpbnQgYWx0SW5kZXggPSAwOyBhbHRJbmRleCA8IGFsdExpc3Quc2l6ZSgpOyBhbHRJbmRleCsrKSB7CisJCQkJCQlJbnRlZ2VyIGFsdEkgPSAoSW50ZWdlcikgYWx0TGlzdC5nZXQoYWx0SW5kZXgpOworCQkJCQkJaW50IGFsdCA9IGFsdEkuaW50VmFsdWUoKTsKKwkJCQkJCWlmICggYWx0SW5kZXg+MCApIHsKKwkJCQkJCQlidWYuYXBwZW5kKCJcXG4iKTsKKwkJCQkJCX0KKwkJCQkJCWJ1Zi5hcHBlbmQoImFsdCIpOworCQkJCQkJYnVmLmFwcGVuZChhbHQpOworCQkJCQkJYnVmLmFwcGVuZCgnOicpOworCQkJCQkJLy8gZ2V0IGEgbGlzdCBvZiBjb25maWdzIGZvciBqdXN0IHRoaXMgYWx0CisJCQkJCQkvLyBpdCB3aWxsIGhlbHAgdXMgcHJpbnQgYmV0dGVyIGxhdGVyCisJCQkJCQlMaXN0IGNvbmZpZ3NJbkFsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWd1cmF0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQkJCQkJTkZBQ29uZmlndXJhdGlvbiBjID0gKE5GQUNvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKKwkJCQkJCQlpZiAoIGMuYWx0IT1hbHQgKSBjb250aW51ZTsKKwkJCQkJCQljb25maWdzSW5BbHQuYWRkKGMpOworCQkJCQkJfQorCQkJCQkJaW50IG4gPSAwOworCQkJCQkJZm9yIChpbnQgY0luZGV4ID0gMDsgY0luZGV4IDwgY29uZmlnc0luQWx0LnNpemUoKTsgY0luZGV4KyspIHsKKwkJCQkJCQlORkFDb25maWd1cmF0aW9uIGMgPQorCQkJCQkJCQkoTkZBQ29uZmlndXJhdGlvbiljb25maWdzSW5BbHQuZ2V0KGNJbmRleCk7CisJCQkJCQkJbisrOworCQkJCQkJCWJ1Zi5hcHBlbmQoYy50b1N0cmluZyhmYWxzZSkpOworCQkJCQkJCWlmICggKGNJbmRleCsxKTxjb25maWdzSW5BbHQuc2l6ZSgpICkgeworCQkJCQkJCQlidWYuYXBwZW5kKCIsICIpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoIG4lNT09MCAmJiAoY29uZmlnc0luQWx0LnNpemUoKS1jSW5kZXgpPjMgKSB7CisJCQkJCQkJCWJ1Zi5hcHBlbmQoIlxcbiIpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKyAgICAgICAgICAgIHN0YXRlTGFiZWwgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCQlpZiAoIChzIGluc3RhbmNlb2YgTkZBU3RhdGUpICYmICgoTkZBU3RhdGUpcykuaXNEZWNpc2lvblN0YXRlKCkgKSB7CisJCQlzdGF0ZUxhYmVsID0gc3RhdGVMYWJlbCsiLGQ9IisKKwkJCQkJKChORkFTdGF0ZSlzKS5nZXREZWNpc2lvbk51bWJlcigpOworCQkJaWYgKCAoKE5GQVN0YXRlKXMpLmVuZE9mQmxvY2tTdGF0ZU51bWJlciE9U3RhdGUuSU5WQUxJRF9TVEFURV9OVU1CRVIgKSB7CisJCQkJc3RhdGVMYWJlbCArPSAiLGVvYj0iKygoTkZBU3RhdGUpcykuZW5kT2ZCbG9ja1N0YXRlTnVtYmVyOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCAocyBpbnN0YW5jZW9mIE5GQVN0YXRlKSAmJgorCQkJKChORkFTdGF0ZSlzKS5lbmRPZkJsb2NrU3RhdGVOdW1iZXIhPVN0YXRlLklOVkFMSURfU1RBVEVfTlVNQkVSKQorCQl7CisJCQlORkFTdGF0ZSBuID0gKChORkFTdGF0ZSlzKTsKKwkJCXN0YXRlTGFiZWwgPSBzdGF0ZUxhYmVsKyIsZW9iPSIrbi5lbmRPZkJsb2NrU3RhdGVOdW1iZXI7CisJCX0KKyAgICAgICAgZWxzZSBpZiAoIHMgaW5zdGFuY2VvZiBERkFTdGF0ZSAmJiAoKERGQVN0YXRlKXMpLmlzQWNjZXB0U3RhdGUoKSApIHsKKyAgICAgICAgICAgIHN0YXRlTGFiZWwgPSBzdGF0ZUxhYmVsKworICAgICAgICAgICAgICAgICAgICAiPT4iKygoREZBU3RhdGUpcykuZ2V0VW5pcXVlbHlQcmVkaWN0ZWRBbHQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJyInK3N0YXRlTGFiZWwrJyInOworICAgIH0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJyb3doZWFkVHlwZSgpIHsKKwkJcmV0dXJuIGFycm93aGVhZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcnJvd2hlYWRUeXBlKFN0cmluZyBhcnJvd2hlYWQpIHsKKwkJdGhpcy5hcnJvd2hlYWQgPSBhcnJvd2hlYWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRSYW5rZGlyKCkgeworCQlyZXR1cm4gcmFua2RpcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSYW5rZGlyKFN0cmluZyByYW5rZGlyKSB7CisJCXRoaXMucmFua2RpciA9IHJhbmtkaXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9FcnJvck1hbmFnZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvRXJyb3JNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhYWY2OAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvRXJyb3JNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MjQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkFTdGF0ZTsKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuRGVjaXNpb25Qcm9iZTsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5CaXRTZXQ7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVEVycm9yTGlzdGVuZXI7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXA7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXBGaWxlOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5taXNjLlNUTWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqIERlZmluZXMgYWxsIHRoZSBlcnJvcnMgQU5UTFIgY2FuIGdlbmVyYXRvciBmb3IgYm90aCB0aGUgdG9vbCBhbmQgZm9yCisgKiAgaXNzdWVzIHdpdGggYSBncmFtbWFyLgorICoKKyAqICBIZXJlIGlzIGEgbGlzdCBvZiBsYW5ndWFnZSBuYW1lczoKKyAqCisgKiAgaHR0cDovL2Z0cC5pY3MudWNpLmVkdS9wdWIvaWV0Zi9odHRwL3JlbGF0ZWQvaXNvNjM5LnR4dAorICoKKyAqICBIZXJlIGlzIGEgbGlzdCBvZiBjb3VudHJ5IG5hbWVzOgorICoKKyAqICBodHRwOi8vd3d3LmNoZW1pZS5mdS1iZXJsaW4uZGUvZGl2ZXJzZS9kb2MvSVNPXzMxNjYuaHRtbAorICoKKyAqICBJIHVzZSBjb25zdGFudHMgbm90IHN0cmluZ3MgdG8gaWRlbnRpZnkgbWVzc2FnZXMgYXMgdGhlIGNvbXBpbGVyIHdpbGwKKyAqICBmaW5kIGFueSBlcnJvcnMvbWlzbWF0Y2hlcyByYXRoZXIgdGhhbiBsZWF2aW5nIGEgbWlzdHlwZWQgc3RyaW5nIGluCisgKiAgdGhlIGNvZGUgdG8gYmUgZm91bmQgcmFuZG9tbHkgaW4gdGhlIGZ1dHVyZS4gIEZ1cnRoZXIsIEludGVsbGlqIGNhbgorICogIGRvIGZpZWxkIG5hbWUgZXhwYW5zaW9uIHRvIHNhdmUgbWUgc29tZSB0eXBpbmcuICBJIGhhdmUgdG8gbWFwCisgKiAgaW50IGNvbnN0YW50cyB0byB0ZW1wbGF0ZSBuYW1lcywgaG93ZXZlciwgd2hpY2ggY291bGQgaW50cm9kdWNlIGEgbWlzbWF0Y2guCisgKiAgU29tZW9uZSBjb3VsZCBwcm92aWRlIGEgLnN0ZyBmaWxlIHRoYXQgaGFkIGEgdGVtcGxhdGUgbmFtZSB3cm9uZy4gIFdoZW4KKyAqICBJIGxvYWQgdGhlIGdyb3VwLCB0aGVuLCBJIG11c3QgdmVyaWZ5IHRoYXQgYWxsIG1lc3NhZ2VzIGFyZSB0aGVyZS4KKyAqCisgKiAgVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHN0dWZmIEphdmEKKyAqICBoYXMsIGJ1dCBJIGRvbid0IHdhbnQgdG8gbG9hZCBhIHByb3BlcnR5IGZpbGUtLUkgd2FudCB0byBsb2FkIGEgdGVtcGxhdGUKKyAqICBncm91cCBmaWxlIGFuZCB0aGlzIGlzIHNvIHNpbXBsZSwgd2h5IG1lc3Mgd2l0aCB0aGVpciBqdW5rLgorICoKKyAqICBJIHVzZSB0aGUgZGVmYXVsdCBMb2NhbGUgYXMgZGVmaW5lZCBieSBqYXZhIHRvIGNvbXB1dGUgYSBncm91cCBmaWxlIG5hbWUKKyAqICBpbiB0aGUgb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL21lc3NhZ2VzIGRpciBjYWxsZWQgZW5fVVMuc3RnIGFuZCBzbyBvbi4KKyAqCisgKiAgTm9ybWFsbHkgd2Ugd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgbG9jYWxlLCBidXQgb2Z0ZW4gYSBtZXNzYWdlIGZpbGUgd2lsbAorICogIG5vdCBleGlzdCBmb3IgaXQgc28gd2UgbXVzdCBmYWxsIGJhY2sgb24gdGhlIFVTIGxvY2FsLgorICoKKyAqICBEdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBjbGFzcywgYWxsIGVycm9ycyBnbyBzdHJhaWdodCB0byBTeXN0ZW0uZXJyLgorICogIFRoZXJlIGlzIG5vIHdheSBhcm91bmQgdGhpcy4gIElmIEkgaGF2ZSBub3Qgc2V0IHVwIHRoZSBlcnJvciBzeXN0ZW0sIGhvdworICogIGNhbiBJIGRvIGVycm9ycyBwcm9wZXJseT8gIEZvciBleGFtcGxlLCBpZiB0aGUgc3RyaW5nIHRlbXBsYXRlIGdyb3VwIGZpbGUKKyAqICBmdWxsIG9mIG1lc3NhZ2VzIGhhcyBhbiBlcnJvciwgaG93IGNvdWxkIEkgcHJpbnQgdG8gYW55dGhpbmcgYnV0IFN5c3RlbS5lcnI/CisgKgorICogIFRPRE86IGhvdyB0byBtYXAgbG9jYWxlIHRvIGEgZmlsZSBlbmNvZGluZyBmb3IgdGhlIHN0cmluZ3RlbXBsYXRlIGdyb3VwIGZpbGU/CisgKiAgU1Qga25vd3MgaG93IHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIGRlZmF1bHQgZW5jb2Rpbmcgc28gaXQKKyAqICBzaG91bGQgcHJvYmFibHkganVzdCB3b3JrIHVubGVzcyBhIEdVSSBzZXRzIHRoZSBsb2NhbCB0byBzb21lIGNoaW5lc2UKKyAqICB2YXJpYXRpb24gYnV0IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpIGlzIFVTLiAgSG1tLi4uCisgKgorICogIFRPRE86IGdldCBhbnRsci5nIGV0Yy4uIHBhcnNpbmcgZXJyb3JzIHRvIGNvbWUgaGVyZS4KKyAqLworcHVibGljIGNsYXNzIEVycm9yTWFuYWdlciB7CisJLy8gVE9PTCBFUlJPUlMKKwkvLyBmaWxlIGVycm9ycworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DQU5OT1RfV1JJVEVfRklMRSA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTk5PVF9DTE9TRV9GSUxFID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0FOTk9UX0ZJTkRfVE9LRU5TX0ZJTEUgPSAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19FUlJPUl9SRUFESU5HX1RPS0VOU19GSUxFID0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfRElSX05PVF9GT1VORCA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX09VVFBVVF9ESVJfSVNfRklMRSA9IDY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTk5PVF9PUEVOX0ZJTEUgPSA3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19GSUxFX0FORF9HUkFNTUFSX05BTUVfRElGRkVSID0gODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfRklMRU5BTUVfRVhURU5TSU9OX0VSUk9SID0gOTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTlRFUk5BTF9FUlJPUiA9IDEwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTlRFUk5BTF9XQVJOSU5HID0gMTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VSUk9SX0NSRUFUSU5HX0FSVElGSUNJQUxfUlVMRSA9IDEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19UT0tFTlNfRklMRV9TWU5UQVhfRVJST1IgPSAxMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0FOTk9UX0dFTl9ET1RfRklMRSA9IDE0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19CQURfQVNUX1NUUlVDVFVSRSA9IDE1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19CQURfQUNUSU9OX0FTVF9TVFJVQ1RVUkUgPSAxNjsKKworCS8vIGNvZGUgZ2VuIGVycm9ycworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19NSVNTSU5HX0NPREVfR0VOX1RFTVBMQVRFUyA9IDIwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19NSVNTSU5HX0NZQ0xJQ19ERkFfQ09ERV9HRU5fVEVNUExBVEVTID0gMjE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NPREVfR0VOX1RFTVBMQVRFU19JTkNPTVBMRVRFID0gMjI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTk5PVF9DUkVBVEVfVEFSR0VUX0dFTkVSQVRPUiA9IDIzOworCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTk5PVF9DT01QVVRFX1NBTVBMRV9JTlBVVF9TRVEgPSAyNDsKKworCS8vIEdSQU1NQVIgRVJST1JTCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NZTlRBWF9FUlJPUiA9IDEwMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUlVMRV9SRURFRklOSVRJT04gPSAxMDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xFWEVSX1JVTEVTX05PVF9BTExPV0VEID0gMTAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QQVJTRVJfUlVMRVNfTk9UX0FMTE9XRUQgPSAxMDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTk5PVF9GSU5EX0FUVFJJQlVURV9OQU1FX0lOX0RFQ0wgPSAxMDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05PX1RPS0VOX0RFRklOSVRJT04gPSAxMDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VOREVGSU5FRF9SVUxFX1JFRiA9IDEwNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfTElURVJBTF9OT1RfQVNTT0NJQVRFRF9XSVRIX0xFWEVSX1JVTEUgPSAxMDc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NBTk5PVF9BTElBU19UT0tFTlNfSU5fTEVYRVIgPSAxMDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FUVFJJQlVURV9SRUZfTk9UX0lOX1JVTEUgPSAxMTE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOVkFMSURfUlVMRV9TQ09QRV9BVFRSSUJVVEVfUkVGID0gMTEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19VTktOT1dOX0FUVFJJQlVURV9JTl9TQ09QRSA9IDExMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVU5LTk9XTl9TSU1QTEVfQVRUUklCVVRFID0gMTE0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTlZBTElEX1JVTEVfUEFSQU1FVEVSX1JFRiA9IDExNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVU5LTk9XTl9SVUxFX0FUVFJJQlVURSA9IDExNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfSVNPTEFURURfUlVMRV9TQ09QRSA9IDExNzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfU1lNQk9MX0NPTkZMSUNUU19XSVRIX0dMT0JBTF9TQ09QRSA9IDExODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfTEFCRUxfQ09ORkxJQ1RTX1dJVEhfUlVMRSA9IDExOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfTEFCRUxfQ09ORkxJQ1RTX1dJVEhfVE9LRU4gPSAxMjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xBQkVMX0NPTkZMSUNUU19XSVRIX1JVTEVfU0NPUEVfQVRUUklCVVRFID0gMTIxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19MQUJFTF9DT05GTElDVFNfV0lUSF9SVUxFX0FSR19SRVRWQUwgPSAxMjI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FUVFJJQlVURV9DT05GTElDVFNfV0lUSF9SVUxFID0gMTIzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19BVFRSSUJVVEVfQ09ORkxJQ1RTX1dJVEhfUlVMRV9BUkdfUkVUVkFMID0gMTI0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19MQUJFTF9UWVBFX0NPTkZMSUNUID0gMTI1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19BUkdfUkVUVkFMX0NPTkZMSUNUID0gMTI2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19OT05VTklRVUVfUkVGID0gMTI3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19GT1JXQVJEX0VMRU1FTlRfUkVGID0gMTI4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19NSVNTSU5HX1JVTEVfQVJHUyA9IDEyOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUlVMRV9IQVNfTk9fQVJHUyA9IDEzMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQVJHU19PTl9UT0tFTl9SRUYgPSAxMzE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JVTEVfUkVGX0FNQklHX1dJVEhfUlVMRV9JTl9BTFQgPSAxMzI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lMTEVHQUxfT1BUSU9OID0gMTMzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19MSVNUX0xBQkVMX0lOVkFMSURfVU5MRVNTX1JFVFZBTF9TVFJVQ1QgPSAxMzQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VOREVGSU5FRF9UT0tFTl9SRUZfSU5fUkVXUklURSA9IDEzNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUkVXUklURV9FTEVNRU5UX05PVF9QUkVTRU5UX09OX0xIUyA9IDEzNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVU5ERUZJTkVEX0xBQkVMX1JFRl9JTl9SRVdSSVRFID0gMTM3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19OT19HUkFNTUFSX1NUQVJUX1JVTEUgPSAxMzg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VNUFRZX0NPTVBMRU1FTlQgPSAxMzk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VOS05PV05fRFlOQU1JQ19TQ09QRSA9IDE0MDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVU5LTk9XTl9EWU5BTUlDX1NDT1BFX0FUVFJJQlVURSA9IDE0MTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfSVNPTEFURURfUlVMRV9BVFRSSUJVVEUgPSAxNDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOVkFMSURfQUNUSU9OX1NDT1BFID0gMTQzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19BQ1RJT05fUkVERUZJTklUSU9OID0gMTQ0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ET1VCTEVfUVVPVEVTX0lMTEVHQUwgPSAxNDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOVkFMSURfVEVNUExBVEVfQUNUSU9OID0gMTQ2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19NSVNTSU5HX0FUVFJJQlVURV9OQU1FID0gMTQ3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19BUkdfSU5JVF9WQUxVRVNfSUxMRUdBTCA9IDE0ODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUkVXUklURV9PUl9PUF9XSVRIX05PX09VVFBVVF9PUFRJT04gPSAxNDk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05PX1JVTEVTID0gMTUwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19XUklURV9UT19SRUFET05MWV9BVFRSID0gMTUxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19NSVNTSU5HX0FTVF9UWVBFX0lOX1RSRUVfR1JBTU1BUiA9IDE1MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUkVXUklURV9GT1JfTVVMVElfRUxFTUVOVF9BTFQgPSAxNTM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JVTEVfSU5WQUxJRF9TRVQgPSAxNTQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0hFVEVST19JTExFR0FMX0lOX1JFV1JJVEVfQUxUID0gMTU1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19OT19TVUNIX0dSQU1NQVJfU0NPUEUgPSAxNTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05PX1NVQ0hfUlVMRV9JTl9TQ09QRSA9IDE1NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVE9LRU5fQUxJQVNfQ09ORkxJQ1QgPSAxNTg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPS0VOX0FMSUFTX1JFQVNTSUdOTUVOVCA9IDE1OTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfVE9LRU5fVk9DQUJfSU5fREVMRUdBVEUgPSAxNjA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOVkFMSURfSU1QT1JUID0gMTYxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19JTVBPUlRFRF9UT0tFTlNfUlVMRV9FTVBUWSA9IDE2MjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfSU1QT1JUX05BTUVfQ0xBU0ggPSAxNjM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FTVF9PUF9XSVRIX05PTl9BU1RfT1VUUFVUX09QVElPTiA9IDE2NDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQVNUX09QX0lOX0FMVF9XSVRIX1JFV1JJVEUgPSAxNjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1dJTERDQVJEX0FTX1JPT1QgPSAxNjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NPTkZMSUNUSU5HX09QVElPTl9JTl9UUkVFX0ZJTFRFUiA9IDE2NzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfSUxMRUdBTF9PUFRJT05fVkFMVUUgPSAxNjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FMTF9PUFNfTkVFRF9TQU1FX0FTU09DID0gMTY5OworCisJLy8gR1JBTU1BUiBXQVJOSU5HUworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19HUkFNTUFSX05PTkRFVEVSTUlOSVNNID0gMjAwOyAvLyBBIHByZWRpY3RzIGFsdHMgMSwyCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VOUkVBQ0hBQkxFX0FMVFMgPSAyMDE7ICAgICAgIC8vIG5vdGhpbmcgcHJlZGljdHMgYWx0IGkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfREFOR0xJTkdfU1RBVEUgPSAyMDI7ICAgICAgICAgLy8gbm8gZWRnZXMgb3V0IG9mIHN0YXRlCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0lOU1VGRklDSUVOVF9QUkVESUNBVEVTID0gMjAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19EVVBMSUNBVEVfU0VUX0VOVFJZID0gMjA0OyAgICAvLyAoQXxBKQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19BTkFMWVNJU19BQk9SVEVEID0gMjA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19SRUNVUlNJT05fT1ZFUkxPVyA9IDIwNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfTEVGVF9SRUNVUlNJT04gPSAyMDc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VOUkVBQ0hBQkxFX1RPS0VOUyA9IDIwODsgLy8gbm90aGluZyBwcmVkaWN0cyB0b2tlbgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19UT0tFTl9OT05ERVRFUk1JTklTTSA9IDIwOTsgLy8gYWx0cyBvZiBUb2tlbnMgcnVsZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19MRUZUX1JFQ1VSU0lPTl9DWUNMRVMgPSAyMTA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05PTlJFR1VMQVJfREVDSVNJT04gPSAyMTE7CisKKworICAgIC8vIERlcGVuZGVuY3kgc29ydGluZyBlcnJvcnMKKyAgICAvLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DSVJDVUxBUl9ERVBFTkRFTkNZID0gMjEyOyAvLyB0MS5nIC0+IHQyLmcgLT4gdDMuZyAtPnQxLmcKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9NRVNTQUdFX05VTUJFUiA9IDIxMjsKKworCS8qKiBEbyBub3QgZG8gcGVyZm9ybSBhbmFseXNpcyBpZiBvbmUgb2YgdGhlc2UgaGFwcGVucyAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEVSUk9SU19GT1JDSU5HX05PX0FOQUxZU0lTID0gbmV3IEJpdFNldCgpIHsKKwkJeworCQkJYWRkKE1TR19SVUxFX1JFREVGSU5JVElPTik7CisJCQlhZGQoTVNHX1VOREVGSU5FRF9SVUxFX1JFRik7CisJCQlhZGQoTVNHX0xFRlRfUkVDVVJTSU9OX0NZQ0xFUyk7CisJCQlhZGQoTVNHX1JFV1JJVEVfT1JfT1BfV0lUSF9OT19PVVRQVVRfT1BUSU9OKTsKKwkJCWFkZChNU0dfTk9fUlVMRVMpOworCQkJYWRkKE1TR19OT19TVUNIX0dSQU1NQVJfU0NPUEUpOworCQkJYWRkKE1TR19OT19TVUNIX1JVTEVfSU5fU0NPUEUpOworCQkJYWRkKE1TR19MRVhFUl9SVUxFU19OT1RfQUxMT1dFRCk7CisgICAgICAgICAgICBhZGQoTVNHX1dJTERDQVJEX0FTX1JPT1QpOworICAgICAgICAgICAgYWRkKE1TR19DSVJDVUxBUl9ERVBFTkRFTkNZKTsKKyAgICAgICAgICAgIC8vIFRPRE86IC4uLgorCQl9CisJfTsKKworCS8qKiBEbyBub3QgZG8gY29kZSBnZW4gaWYgb25lIG9mIHRoZXNlIGhhcHBlbnMgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBFUlJPUlNfRk9SQ0lOR19OT19DT0RFR0VOID0gbmV3IEJpdFNldCgpIHsKKwkJeworCQkJYWRkKE1TR19OT05SRUdVTEFSX0RFQ0lTSU9OKTsKKwkJCWFkZChNU0dfUkVDVVJTSU9OX09WRVJMT1cpOworCQkJYWRkKE1TR19VTlJFQUNIQUJMRV9BTFRTKTsKKwkJCWFkZChNU0dfRklMRV9BTkRfR1JBTU1BUl9OQU1FX0RJRkZFUik7CisJCQlhZGQoTVNHX0lOVkFMSURfSU1QT1JUKTsKKwkJCWFkZChNU0dfQVNUX09QX1dJVEhfTk9OX0FTVF9PVVRQVVRfT1BUSU9OKTsKKyAgICAgICAgICAgIGFkZChNU0dfQ0lSQ1VMQVJfREVQRU5ERU5DWSk7CisJCQkvLyBUT0RPOiAuLi4KKwkJfQorCX07CisKKwkvKiogT25seSBvbmUgZXJyb3IgY2FuIGJlIGVtaXR0ZWQgZm9yIGFueSBlbnRyeSBpbiB0aGlzIHRhYmxlLgorCSAqICBNYXA8U3RyaW5nLFNldD4gd2hlcmUgdGhlIGtleSBpcyBhIG1ldGhvZCBuYW1lIGxpa2UgZGFuZ2xpbmdTdGF0ZS4KKwkgKiAgVGhlIHNldCBpcyB3aGF0ZXZlciB0aGF0IG1ldGhvZCBhY2NlcHRzIG9yIGRlcml2ZXMgbGlrZSBhIERGQS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBlbWl0U2luZ2xlRXJyb3IgPSBuZXcgSGFzaE1hcCgpIHsKKwkJeworCQkJcHV0KCJkYW5nbGluZ1N0YXRlIiwgbmV3IEhhc2hTZXQoKSk7CisJCX0KKwl9OworCisJLyoqIE1lc3NhZ2VzIHNob3VsZCBiZSBzZW5zaXRpdmUgdG8gdGhlIGxvY2FsZS4gKi8KKwlwcml2YXRlIHN0YXRpYyBMb2NhbGUgbG9jYWxlOworCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXROYW1lOworCisJLyoqIEVhY2ggdGhyZWFkIG1pZ2h0IG5lZWQgaXQncyBvd24gZXJyb3IgbGlzdGVuZXI7IGUuZy4sIGEgR1VJIHdpdGgKKwkgKiAgbXVsdGlwbGUgd2luZG93IGZyYW1lcyBob2xkaW5nIG11bHRpcGxlIGdyYW1tYXJzLgorCSAqLworCXByaXZhdGUgc3RhdGljIE1hcCB0aHJlYWRUb0xpc3RlbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKKworCXN0YXRpYyBjbGFzcyBFcnJvclN0YXRlIHsKKwkJcHVibGljIGludCBlcnJvcnM7CisJCXB1YmxpYyBpbnQgd2FybmluZ3M7CisJCXB1YmxpYyBpbnQgaW5mb3M7CisJCS8qKiBUcmFjayBhbGwgbXNnSURzOyB3ZSB1c2UgdG8gYWJvcnQgbGF0ZXIgaWYgbmVjZXNzYXJ5CisJCSAqICBhbHNvIHVzZWQgaW4gTWVzc2FnZSB0byBmaW5kIG91dCB3aGF0IHR5cGUgb2YgbWVzc2FnZSBpdCBpcyB2aWEgZ2V0TWVzc2FnZVR5cGUoKQorCQkgKi8KKwkJcHVibGljIEJpdFNldCBlcnJvck1zZ0lEcyA9IG5ldyBCaXRTZXQoKTsKKwkJcHVibGljIEJpdFNldCB3YXJuaW5nTXNnSURzID0gbmV3IEJpdFNldCgpOworCQkvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBkbyBpbmZvIG1lc3NhZ2VzLiB0aGVzZSBkbyBub3QgaGF2ZSBJRHMuLi5rcgorCQkvL3B1YmxpYyBCaXRTZXQgaW5mb01zZ0lEcyA9IG5ldyBCaXRTZXQoKTsKKwl9CisKKwkvKiogVHJhY2sgdGhlIG51bWJlciBvZiBlcnJvcnMgcmVnYXJkbGVzcyBvZiB0aGUgbGlzdGVuZXIgYnV0IHRyYWNrCisJICogIHBlciB0aHJlYWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTWFwIHRocmVhZFRvRXJyb3JTdGF0ZU1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKiogRWFjaCB0aHJlYWQgaGFzIGl0cyBvd24gcHRyIHRvIGEgVG9vbCBvYmplY3QsIHdoaWNoIGtub3dzIGhvdworCSAqICB0byBwYW5pYywgZm9yIGV4YW1wbGUuICBJbiBhIEdVSSwgdGhlIHRocmVhZCBtaWdodCBqdXN0IHRocm93IGFuIEVycm9yCisJICogIHRvIGV4aXQgcmF0aGVyIHRoYW4gdGhlIHN1aWNpZGUgU3lzdGVtLmV4aXQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTWFwIHRocmVhZFRvVG9vbE1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKiogVGhlIGdyb3VwIG9mIHRlbXBsYXRlcyB0aGF0IHJlcHJlc2VudCBhbGwgcG9zc2libGUgQU5UTFIgZXJyb3JzLiAqLworCXByaXZhdGUgc3RhdGljIFNUR3JvdXAgbWVzc2FnZXM7CisJLyoqIFRoZSBncm91cCBvZiB0ZW1wbGF0ZXMgdGhhdCByZXByZXNlbnQgdGhlIGN1cnJlbnQgbWVzc2FnZSBmb3JtYXQuICovCisJcHJpdmF0ZSBzdGF0aWMgU1RHcm91cCBmb3JtYXQ7CisKKwkvKiogRnJvbSBhIG1zZ0lEIGhvdyBjYW4gSSBnZXQgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRoYXQgZGVzY3JpYmVzCisJICogIHRoZSBlcnJvciBvciB3YXJuaW5nPworCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGlkVG9NZXNzYWdlVGVtcGxhdGVOYW1lID0gbmV3IFN0cmluZ1tNQVhfTUVTU0FHRV9OVU1CRVIrMV07CisKKwlzdGF0aWMgQU5UTFJFcnJvckxpc3RlbmVyIHRoZURlZmF1bHRFcnJvckxpc3RlbmVyID0gbmV3IEFOVExSRXJyb3JMaXN0ZW5lcigpIHsKKwkJcHVibGljIHZvaWQgaW5mbyhTdHJpbmcgbXNnKSB7CisJCQlpZiAoZm9ybWF0V2FudHNTaW5nbGVMaW5lTWVzc2FnZSgpKSB7CisJCQkJbXNnID0gbXNnLnJlcGxhY2VBbGwoIlxuIiwgIiAiKTsKKwkJCX0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworCQl9CisKKwkJcHVibGljIHZvaWQgZXJyb3IoTWVzc2FnZSBtc2cpIHsKKwkJCVN0cmluZyBvdXRwdXRNc2cgPSBtc2cudG9TdHJpbmcoKTsKKwkJCWlmIChmb3JtYXRXYW50c1NpbmdsZUxpbmVNZXNzYWdlKCkpIHsKKwkJCQlvdXRwdXRNc2cgPSBvdXRwdXRNc2cucmVwbGFjZUFsbCgiXG4iLCAiICIpOworCQkJfQorCQkJU3lzdGVtLmVyci5wcmludGxuKG91dHB1dE1zZyk7CisJCX0KKworCQlwdWJsaWMgdm9pZCB3YXJuaW5nKE1lc3NhZ2UgbXNnKSB7CisJCQlTdHJpbmcgb3V0cHV0TXNnID0gbXNnLnRvU3RyaW5nKCk7CisJCQlpZiAoZm9ybWF0V2FudHNTaW5nbGVMaW5lTWVzc2FnZSgpKSB7CisJCQkJb3V0cHV0TXNnID0gb3V0cHV0TXNnLnJlcGxhY2VBbGwoIlxuIiwgIiAiKTsKKwkJCX0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbihvdXRwdXRNc2cpOworCQl9CisKKwkJcHVibGljIHZvaWQgZXJyb3IoVG9vbE1lc3NhZ2UgbXNnKSB7CisJCQlTdHJpbmcgb3V0cHV0TXNnID0gbXNnLnRvU3RyaW5nKCk7CisJCQlpZiAoZm9ybWF0V2FudHNTaW5nbGVMaW5lTWVzc2FnZSgpKSB7CisJCQkJb3V0cHV0TXNnID0gb3V0cHV0TXNnLnJlcGxhY2VBbGwoIlxuIiwgIiAiKTsKKwkJCX0KKwkJCVN5c3RlbS5lcnIucHJpbnRsbihvdXRwdXRNc2cpOworCQl9CisJfTsKKworCS8qKiBIYW5kbGUgYWxsIFNUIGVycm9yIGxpc3RlbmVycyBoZXJlIChjb2RlIGdlbiwgR3JhbW1hciwgYW5kIHRoaXMgY2xhc3MKKwkgKiAgdXNlIHRlbXBsYXRlcy4KKwkgKi8KKwlzdGF0aWMgU1RFcnJvckxpc3RlbmVyIGluaXRTVExpc3RlbmVyID0KKwkJbmV3IFNURXJyb3JMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGNvbXBpbGVUaW1lRXJyb3IoU1RNZXNzYWdlIG1zZykgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3JNYW5hZ2VyIGluaXQgZXJyb3I6ICIrbXNnKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgcnVuVGltZUVycm9yKFNUTWVzc2FnZSBtc2cpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yTWFuYWdlciBpbml0IGVycm9yOiAiK21zZyk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIElPRXJyb3IoU1RNZXNzYWdlIG1zZykgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3JNYW5hZ2VyIGluaXQgZXJyb3I6ICIrbXNnKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgaW50ZXJuYWxFcnJvcihTVE1lc3NhZ2UgbXNnKSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvck1hbmFnZXIgaW5pdCBlcnJvcjogIittc2cpOworCQkJfQorCisJCX07CisKKwkvKiogRHVyaW5nIHZlcmlmaWNhdGlvbiBvZiB0aGUgbWVzc2FnZXMgZ3JvdXAgZmlsZSwgZG9uJ3QgZ2VuIGVycm9ycy4KKwkgKiAgSSdsbCBoYW5kbGUgdGhlbSBoZXJlLiAgVGhpcyBpcyB1c2VkIG9ubHkgYWZ0ZXIgZmlsZSBoYXMgbG9hZGVkIG9rCisJICogIGFuZCBvbmx5IGZvciB0aGUgbWVzc2FnZXMgU1RHLgorCSAqLworCXN0YXRpYyBTVEVycm9yTGlzdGVuZXIgYmxhbmtTVExpc3RlbmVyID0KKwkJbmV3IFNURXJyb3JMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGNvbXBpbGVUaW1lRXJyb3IoU1RNZXNzYWdlIG1zZykgewkJCX0KKwkJCXB1YmxpYyB2b2lkIHJ1blRpbWVFcnJvcihTVE1lc3NhZ2UgbXNnKSB7CQkJfQorCQkJcHVibGljIHZvaWQgSU9FcnJvcihTVE1lc3NhZ2UgbXNnKSB7CQkJfQorCQkJcHVibGljIHZvaWQgaW50ZXJuYWxFcnJvcihTVE1lc3NhZ2UgbXNnKSB7CQkJfQorCQl9OworCisJLyoqIEVycm9ycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCB0byBTVCBtdXN0IGFsbCBnbyB0byBTeXN0ZW0uZXJyLgorCSAqLworCXN0YXRpYyBTVEVycm9yTGlzdGVuZXIgdGhlRGVmYXVsdFNUTGlzdGVuZXIgPQorCQluZXcgU1RFcnJvckxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgY29tcGlsZVRpbWVFcnJvcihTVE1lc3NhZ2UgbXNnKSB7CisJCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfSU5URVJOQUxfRVJST1IsIG1zZy50b1N0cmluZygpLCBtc2cuY2F1c2UpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBydW5UaW1lRXJyb3IoU1RNZXNzYWdlIG1zZykgeworCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0lOVEVSTkFMX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgbXNnLmNhdXNlKTsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgSU9FcnJvcihTVE1lc3NhZ2UgbXNnKSB7CisJCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfSU5URVJOQUxfRVJST1IsIG1zZy50b1N0cmluZygpLCBtc2cuY2F1c2UpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVycm9yKFNUTWVzc2FnZSBtc2cpIHsKKwkJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19JTlRFUk5BTF9FUlJPUiwgbXNnLnRvU3RyaW5nKCksIG1zZy5jYXVzZSk7CisJCQl9CisJCX07CisKKwkvLyBtYWtlIHN1cmUgdGhhdCB0aGlzIGNsYXNzIGlzIHJlYWR5IHRvIHVzZSBhZnRlciBsb2FkaW5nCisJc3RhdGljIHsKKwkJaW5pdElkVG9NZXNzYWdlTmFtZU1hcHBpbmcoKTsKKwkJLy8gaXQgaXMgaW5lZmZpY2llbnQgdG8gc2V0IHRoZSBkZWZhdWx0IGxvY2FsZSBoZXJlIGlmIGFub3RoZXIKKwkJLy8gcGllY2Ugb2YgY29kZSBpcyBnb2luZyB0byBzZXQgdGhlIGxvY2FsZSwgYnV0IHRoYXQgd291bGQKKwkJLy8gcmVxdWlyZSB0aGF0IGEgdXNlciBjYWxsIGFuIGluaXQoKSBmdW5jdGlvbiBvciBzb21ldGhpbmcuICBJIHByZWZlcgorCQkvLyB0aGF0IHRoaXMgY2xhc3MgYmUgcmVhZHkgdG8gZ28gd2hlbiBsb2FkZWQgYXMgSSdtIGFic2VudG1pbmRlZCA7KQorCQlzZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7CisJCS8vIHRyeSB0byBsb2FkIHRoZSBtZXNzYWdlIGZvcm1hdCBncm91cAorCQkvLyB0aGUgdXNlciBtaWdodCBoYXZlIHNwZWNpZmllZCBvbmUgb24gdGhlIGNvbW1hbmQgbGluZQorCQkvLyBpZiBub3QsIG9yIGlmIHRoZSB1c2VyIGhhcyBnaXZlbiBhbiBpbGxlZ2FsIHZhbHVlLCB3ZSB3aWxsIGZhbGwgYmFjayB0byAiYW50bHIiCisJCXNldEZvcm1hdCgiYW50bHIiKTsKKwl9CisKKyAgICBwdWJsaWMgc3RhdGljIFNURXJyb3JMaXN0ZW5lciBnZXRTVEVycm9yTGlzdGVuZXIoKSB7CisJCXJldHVybiB0aGVEZWZhdWx0U1RMaXN0ZW5lcjsKKwl9CisKKwkvKiogV2UgcmVhbGx5IG9ubHkgbmVlZCBhIHNpbmdsZSBsb2NhbGUgZm9yIGVudGlyZSBydW5uaW5nIEFOVExSIGNvZGUKKwkgKiAgaW4gYSBzaW5nbGUgVk0uICBPbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGxhbmd1YWdlLCBub3QgdGhlIGNvdW50cnkKKwkgKiAgc28gdGhhdCBGcmVuY2ggQ2FuYWRpYW5zIGFuZCBGcmVuY2ggRnJlbmNoaWVzIGFsbCBnZXQgdGhlIHNhbWUKKwkgKiAgdGVtcGxhdGUgZmlsZSwgZnIuc3RnLiAgSnVzdCBlYXNpZXIgdGhpcyB3YXkuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisJCUVycm9yTWFuYWdlci5sb2NhbGUgPSBsb2NhbGU7CisJCVN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSAib3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL21lc3NhZ2VzL2xhbmd1YWdlcy8iK2xhbmd1YWdlKyIuc3RnIjsKKwkJdHJ5IHsKKwkJCW1lc3NhZ2VzID0gbmV3IFNUR3JvdXBGaWxlKGZpbGVOYW1lKTsKKwkJfQorCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworCQkJaWYgKCBsYW5ndWFnZS5lcXVhbHMoTG9jYWxlLlVTLmdldExhbmd1YWdlKCkpICkgeworCQkJCXJhd0Vycm9yKCJBTlRMUiBpbnN0YWxsYXRpb24gY29ycnVwdGVkOyBjYW5ub3QgZmluZCBFbmdsaXNoIG1lc3NhZ2VzIGZpbGUgIitmaWxlTmFtZSk7CisJCQkJcGFuaWMoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNldExvY2FsZShMb2NhbGUuVVMpOyAvLyByZWN1cnNlIG9uIHRoaXMgcnVsZSwgdHJ5aW5nIHRoZSBVUyBsb2NhbGUKKwkJCX0KKwkJfQorCisJCW1lc3NhZ2VzLnNldExpc3RlbmVyKGJsYW5rU1RMaXN0ZW5lcik7CisJCWJvb2xlYW4gbWVzc2FnZXNPSyA9IHZlcmlmeU1lc3NhZ2VzKCk7CisJCWlmICggIW1lc3NhZ2VzT0sgJiYgbGFuZ3VhZ2UuZXF1YWxzKExvY2FsZS5VUy5nZXRMYW5ndWFnZSgpKSApIHsKKwkJCXJhd0Vycm9yKCJBTlRMUiBpbnN0YWxsYXRpb24gY29ycnVwdGVkOyBFbmdsaXNoIG1lc3NhZ2VzIGZpbGUgIitsYW5ndWFnZSsiLnN0ZyBpbmNvbXBsZXRlIik7CisJCQlwYW5pYygpOworCQl9CisJCWVsc2UgaWYgKCAhbWVzc2FnZXNPSyApIHsKKwkJCXNldExvY2FsZShMb2NhbGUuVVMpOyAvLyB0cnkgVVMgdG8gc2VlIGlmIHRoYXQgd2lsbCB3b3JrCisJCX0KKwl9CisKKwkvKiogVGhlIGZvcm1hdCBnZXRzIHJlc2V0IGVpdGhlciBmcm9tIHRoZSBUb29sIGlmIHRoZSB1c2VyIHN1cHBsaWVkIGEgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0aGF0IGVmZmVjdAorCSAqICBPdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIGRlZmF1bHQgImFudGxyIi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9ybWF0KFN0cmluZyBmb3JtYXROYW1lKSB7CisJCUVycm9yTWFuYWdlci5mb3JtYXROYW1lID0gZm9ybWF0TmFtZTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gIm9yZy9hbnRsci90b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9mb3JtYXRzLyIrZm9ybWF0TmFtZSsiLnN0ZyI7CisJCWZvcm1hdCA9IG5ldyBTVEdyb3VwRmlsZShmaWxlTmFtZSk7CisJCWZvcm1hdC5zZXRMaXN0ZW5lcihpbml0U1RMaXN0ZW5lcik7CisJCWlmICggIWZvcm1hdC5pc0RlZmluZWQoIm1lc3NhZ2UiKSApIHsgLy8gcGljayByYW5kb20gbXNnIHRvIGxvYWQKKwkJCWlmICggZm9ybWF0TmFtZS5lcXVhbHMoImFudGxyIikgKSB7CisJCQkJcmF3RXJyb3IoIm5vIHN1Y2ggbWVzc2FnZSBmb3JtYXQgZmlsZSAiK2ZpbGVOYW1lKyIgcmV0cnlpbmcgd2l0aCBkZWZhdWx0IEFOVExSIGZvcm1hdCIpOworCQkJCXNldEZvcm1hdCgiYW50bHIiKTsgLy8gcmVjdXJzZSBvbiB0aGlzIHJ1bGUsIHRyeWluZyB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvcm1hdAorCQkJCXJldHVybjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNldEZvcm1hdCgiYW50bHIiKTsgLy8gcmVjdXJzZSBvbiB0aGlzIHJ1bGUsIHRyeWluZyB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvcm1hdAorCQkJfQorCQl9CisKKwkJZm9ybWF0LnNldExpc3RlbmVyKGJsYW5rU1RMaXN0ZW5lcik7CisJCWJvb2xlYW4gZm9ybWF0T0sgPSB2ZXJpZnlGb3JtYXQoKTsKKwkJaWYgKCAhZm9ybWF0T0sgJiYgZm9ybWF0TmFtZS5lcXVhbHMoImFudGxyIikgKSB7CisJCQlyYXdFcnJvcigiQU5UTFIgaW5zdGFsbGF0aW9uIGNvcnJ1cHRlZDsgQU5UTFIgbWVzc2FnZXMgZm9ybWF0IGZpbGUgIitmb3JtYXROYW1lKyIuc3RnIGluY29tcGxldGUiKTsKKwkJCXBhbmljKCk7CisJCX0KKwkJZWxzZSBpZiAoICFmb3JtYXRPSyApIHsKKwkJCXNldEZvcm1hdCgiYW50bHIiKTsgLy8gcmVjdXJzZSBvbiB0aGlzIHJ1bGUsIHRyeWluZyB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvcm1hdAorCQl9CisJfQorCisJLyoqIEVuY29kZXMgdGhlIGVycm9yIGhhbmRsaW5nIGZvdW5kIGluIHNldExvY2FsZSwgYnV0IGRvZXMgbm90IHRyaWdnZXIKKwkgKiAgcGFuaWNzLCB3aGljaCB3b3VsZCBtYWtlIEdVSSB0b29scyBkaWUgaWYgQU5UTFIncyBpbnN0YWxsYXRpb24gd2FzCisJICogIGEgYml0IHNjcmV3eS4gIER1cGxpY2F0ZWQgY29kZS4uLmljay4KKwlwdWJsaWMgc3RhdGljIExvY2FsZSBnZXRMb2NhbGVGb3JWYWxpZE1lc3NhZ2VzKExvY2FsZSBsb2NhbGUpIHsKKwkJRXJyb3JNYW5hZ2VyLmxvY2FsZSA9IGxvY2FsZTsKKwkJU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9ICJvcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvIitsYW5ndWFnZSsiLnN0ZyI7CisJCUNsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKwkJSW5wdXRTdHJlYW0gaXMgPSBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKKwkJaWYgKCBpcz09bnVsbCAmJiBsYW5ndWFnZS5lcXVhbHMoTG9jYWxlLlVTLmdldExhbmd1YWdlKCkpICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJZWxzZSBpZiAoIGlzPT1udWxsICkgeworCQkJcmV0dXJuIGdldExvY2FsZUZvclZhbGlkTWVzc2FnZXMoTG9jYWxlLlVTKTsgLy8gcmVjdXJzZSBvbiB0aGlzIHJ1bGUsIHRyeWluZyB0aGUgVVMgbG9jYWxlCisJCX0KKworCQlib29sZWFuIG1lc3NhZ2VzT0sgPSB2ZXJpZnlNZXNzYWdlcygpOworCQlpZiAoICFtZXNzYWdlc09LICYmIGxhbmd1YWdlLmVxdWFscyhMb2NhbGUuVVMuZ2V0TGFuZ3VhZ2UoKSkgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQllbHNlIGlmICggIW1lc3NhZ2VzT0sgKSB7CisJCQlyZXR1cm4gZ2V0TG9jYWxlRm9yVmFsaWRNZXNzYWdlcyhMb2NhbGUuVVMpOyAvLyB0cnkgVVMgdG8gc2VlIGlmIHRoYXQgd2lsbCB3b3JrCisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCSAqLworCisJLyoqIEluIGdlbmVyYWwsIHlvdSdsbCB3YW50IGFsbCBlcnJvcnMgdG8gZ28gdG8gYSBzaW5nbGUgc3BvdC4KKwkgKiAgSG93ZXZlciwgaW4gYSBHVUksIHlvdSBtaWdodCBoYXZlIHR3byBmcmFtZXMgdXAgd2l0aCB0d28KKwkgKiAgZGlmZmVyZW50IGdyYW1tYXJzLiAgVHdvIHRocmVhZHMgbWlnaHQgbGF1bmNoIHRvIHByb2Nlc3MgdGhlCisJICogIGdyYW1tYXJzLS15b3Ugd291bGQgd2FudCBlcnJvcnMgdG8gZ28gdG8gZGlmZmVyZW50IG9iamVjdHMKKwkgKiAgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQuICBJIHN0b3JlIGEgc2luZ2xlIGxpc3RlbmVyIHBlcgorCSAqICB0aHJlYWQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEVycm9yTGlzdGVuZXIoQU5UTFJFcnJvckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCXRocmVhZFRvTGlzdGVuZXJNYXAucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGxpc3RlbmVyKTsKKwl9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRXJyb3JMaXN0ZW5lcigpIHsKKyAgICAgICAgdGhyZWFkVG9MaXN0ZW5lck1hcC5yZW1vdmUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFRvb2woVG9vbCB0b29sKSB7CisJCXRocmVhZFRvVG9vbE1hcC5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgdG9vbCk7CisJfQorCisJLyoqIEdpdmVuIGEgbWVzc2FnZSBJRCwgcmV0dXJuIGEgU1QgdGhhdCBzb21lYm9keSBjYW4gZmlsbAorCSAqICB3aXRoIGRhdGEuICBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGludCBJRCB0byB0aGUgbmFtZSBvZiBhIHRlbXBsYXRlCisJICogIGluIHRoZSBtZXNzYWdlcyBTVCBncm91cC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNUIGdldE1lc3NhZ2UoaW50IG1zZ0lEKSB7CisgICAgICAgIFN0cmluZyBtc2dOYW1lID0gaWRUb01lc3NhZ2VUZW1wbGF0ZU5hbWVbbXNnSURdOworCQlyZXR1cm4gbWVzc2FnZXMuZ2V0SW5zdGFuY2VPZihtc2dOYW1lKTsKKwl9CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVR5cGUoaW50IG1zZ0lEKSB7CisJCWlmIChnZXRFcnJvclN0YXRlKCkud2FybmluZ01zZ0lEcy5tZW1iZXIobXNnSUQpKSB7CisJCQlyZXR1cm4gbWVzc2FnZXMuZ2V0SW5zdGFuY2VPZigid2FybmluZyIpLnJlbmRlcigpOworCQl9CisJCWVsc2UgaWYgKGdldEVycm9yU3RhdGUoKS5lcnJvck1zZ0lEcy5tZW1iZXIobXNnSUQpKSB7CisJCQlyZXR1cm4gbWVzc2FnZXMuZ2V0SW5zdGFuY2VPZigiZXJyb3IiKS5yZW5kZXIoKTsKKwkJfQorCQlhc3NlcnRUcnVlKGZhbHNlLCAiQXNzZXJ0aW9uIGZhaWxlZCEgTWVzc2FnZSBJRCAiICsgbXNnSUQgKyAiIGNyZWF0ZWQgYnV0IGlzIG5vdCBwcmVzZW50IGluIGVycm9yTXNnSURzIG9yIHdhcm5pbmdNc2dJRHMuIik7CisJCXJldHVybiAiIjsKKwl9CisKKwkvKiogUmV0dXJuIGEgU1QgdGhhdCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZm9ybWF0IHVzZWQgZm9yCisJICogZW1pdHRpbmcgbWVzc2FnZXMuCisJICovCisJcHVibGljIHN0YXRpYyBTVCBnZXRMb2NhdGlvbkZvcm1hdCgpIHsKKwkJcmV0dXJuIGZvcm1hdC5nZXRJbnN0YW5jZU9mKCJsb2NhdGlvbiIpOworCX0KKwlwdWJsaWMgc3RhdGljIFNUIGdldFJlcG9ydEZvcm1hdCgpIHsKKwkJcmV0dXJuIGZvcm1hdC5nZXRJbnN0YW5jZU9mKCJyZXBvcnQiKTsKKwl9CisJcHVibGljIHN0YXRpYyBTVCBnZXRNZXNzYWdlRm9ybWF0KCkgeworCQlyZXR1cm4gZm9ybWF0LmdldEluc3RhbmNlT2YoIm1lc3NhZ2UiKTsKKwl9CisJcHVibGljIHN0YXRpYyBib29sZWFuIGZvcm1hdFdhbnRzU2luZ2xlTGluZU1lc3NhZ2UoKSB7CisJCXJldHVybiBmb3JtYXQuZ2V0SW5zdGFuY2VPZigid2FudHNTaW5nbGVMaW5lTWVzc2FnZSIpLnJlbmRlcigpLmVxdWFscygidHJ1ZSIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgQU5UTFJFcnJvckxpc3RlbmVyIGdldEVycm9yTGlzdGVuZXIoKSB7CisJCUFOVExSRXJyb3JMaXN0ZW5lciBlbCA9CisJCQkoQU5UTFJFcnJvckxpc3RlbmVyKXRocmVhZFRvTGlzdGVuZXJNYXAuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworCQlpZiAoIGVsPT1udWxsICkgeworCQkJcmV0dXJuIHRoZURlZmF1bHRFcnJvckxpc3RlbmVyOworCQl9CisJCXJldHVybiBlbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVycm9yU3RhdGUgZ2V0RXJyb3JTdGF0ZSgpIHsKKwkJRXJyb3JTdGF0ZSBlYyA9CisJCQkoRXJyb3JTdGF0ZSl0aHJlYWRUb0Vycm9yU3RhdGVNYXAuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworCQlpZiAoIGVjPT1udWxsICkgeworCQkJZWMgPSBuZXcgRXJyb3JTdGF0ZSgpOworCQkJdGhyZWFkVG9FcnJvclN0YXRlTWFwLnB1dChUaHJlYWQuY3VycmVudFRocmVhZCgpLCBlYyk7CisJCX0KKwkJcmV0dXJuIGVjOworCX0KKworCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bUVycm9ycygpIHsKKwkJcmV0dXJuIGdldEVycm9yU3RhdGUoKS5lcnJvcnM7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0RXJyb3JTdGF0ZSgpIHsKKyAgICAgICAgdGhyZWFkVG9MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIEVycm9yU3RhdGUgZWMgPSBuZXcgRXJyb3JTdGF0ZSgpOworCQl0aHJlYWRUb0Vycm9yU3RhdGVNYXAucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGVjKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5mbyhTdHJpbmcgbXNnKSB7CisJCWdldEVycm9yU3RhdGUoKS5pbmZvcysrOworCQlnZXRFcnJvckxpc3RlbmVyKCkuaW5mbyhtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgbXNnSUQpIHsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYWRkKG1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG5ldyBUb29sTWVzc2FnZShtc2dJRCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgbXNnSUQsIFRocm93YWJsZSBlKSB7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvcnMrKzsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9yTXNnSURzLmFkZChtc2dJRCk7CisJCWdldEVycm9yTGlzdGVuZXIoKS5lcnJvcihuZXcgVG9vbE1lc3NhZ2UobXNnSUQsZSkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgbXNnSUQsIE9iamVjdCBhcmcpIHsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYWRkKG1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG5ldyBUb29sTWVzc2FnZShtc2dJRCwgYXJnKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKGludCBtc2dJRCwgT2JqZWN0IGFyZywgT2JqZWN0IGFyZzIpIHsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYWRkKG1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG5ldyBUb29sTWVzc2FnZShtc2dJRCwgYXJnLCBhcmcyKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKGludCBtc2dJRCwgT2JqZWN0IGFyZywgVGhyb3dhYmxlIGUpIHsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYWRkKG1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG5ldyBUb29sTWVzc2FnZShtc2dJRCwgYXJnLCBlKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHdhcm5pbmcoaW50IG1zZ0lELCBPYmplY3QgYXJnKSB7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5ncysrOworCQlnZXRFcnJvclN0YXRlKCkud2FybmluZ01zZ0lEcy5hZGQobXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkud2FybmluZyhuZXcgVG9vbE1lc3NhZ2UobXNnSUQsIGFyZykpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBub25kZXRlcm1pbmlzbShEZWNpc2lvblByb2JlIHByb2JlLAorCQkJCQkJCQkJICBERkFTdGF0ZSBkKQorCXsKKwkJZ2V0RXJyb3JTdGF0ZSgpLndhcm5pbmdzKys7CisJCU1lc3NhZ2UgbXNnID0gbmV3IEdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2UocHJvYmUsZCk7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5nTXNnSURzLmFkZChtc2cubXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkud2FybmluZyhtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkYW5nbGluZ1N0YXRlKERlY2lzaW9uUHJvYmUgcHJvYmUsCisJCQkJCQkJCQkgREZBU3RhdGUgZCkKKwl7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvcnMrKzsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgR3JhbW1hckRhbmdsaW5nU3RhdGVNZXNzYWdlKHByb2JlLGQpOworCQlnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYWRkKG1zZy5tc2dJRCk7CisJCVNldCBzZWVuID0gKFNldCllbWl0U2luZ2xlRXJyb3IuZ2V0KCJkYW5nbGluZ1N0YXRlIik7CisJCWlmICggIXNlZW4uY29udGFpbnMoZC5kZmEuZGVjaXNpb25OdW1iZXIrInwiK2QuZ2V0QWx0U2V0KCkpICkgeworCQkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG1zZyk7CisJCQkvLyB3ZSd2ZSBzZWVuIHRoaXMgZGVjaXNpb24gYW5kIHRoaXMgYWx0IHNldDsgbmV2ZXIgYWdhaW4KKwkJCXNlZW4uYWRkKGQuZGZhLmRlY2lzaW9uTnVtYmVyKyJ8IitkLmdldEFsdFNldCgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhbmFseXNpc0Fib3J0ZWQoRGVjaXNpb25Qcm9iZSBwcm9iZSkKKwl7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5ncysrOworCQlNZXNzYWdlIG1zZyA9IG5ldyBHcmFtbWFyQW5hbHlzaXNBYm9ydGVkTWVzc2FnZShwcm9iZSk7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5nTXNnSURzLmFkZChtc2cubXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkud2FybmluZyhtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB1bnJlYWNoYWJsZUFsdHMoRGVjaXNpb25Qcm9iZSBwcm9iZSwKKwkJCQkJCQkJCSAgIExpc3QgYWx0cykKKwl7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvcnMrKzsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgR3JhbW1hclVucmVhY2hhYmxlQWx0c01lc3NhZ2UocHJvYmUsYWx0cyk7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvck1zZ0lEcy5hZGQobXNnLm1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG1zZyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGluc3VmZmljaWVudFByZWRpY2F0ZXMoRGVjaXNpb25Qcm9iZSBwcm9iZSwKKwkJCQkJCQkJCQkJICBERkFTdGF0ZSBkLAorCQkJCQkJCQkJCQkgIE1hcDxJbnRlZ2VyLCBTZXQ8VG9rZW4+PiBhbHRUb1VuY292ZXJlZExvY2F0aW9ucykKKwl7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5ncysrOworCQlNZXNzYWdlIG1zZyA9IG5ldyBHcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2UocHJvYmUsZCxhbHRUb1VuY292ZXJlZExvY2F0aW9ucyk7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5nTXNnSURzLmFkZChtc2cubXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkud2FybmluZyhtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBub25MTFN0YXJEZWNpc2lvbihEZWNpc2lvblByb2JlIHByb2JlKSB7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvcnMrKzsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTm9uUmVndWxhckRlY2lzaW9uTWVzc2FnZShwcm9iZSwgcHJvYmUuZ2V0Tm9uRGV0ZXJtaW5pc3RpY0FsdHMoKSk7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvck1zZ0lEcy5hZGQobXNnLm1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKG1zZyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJlY3Vyc2lvbk92ZXJmbG93KERlY2lzaW9uUHJvYmUgcHJvYmUsCisJCQkJCQkJCQkJIERGQVN0YXRlIHNhbXBsZUJhZFN0YXRlLAorCQkJCQkJCQkJCSBpbnQgYWx0LAorCQkJCQkJCQkJCSBDb2xsZWN0aW9uIHRhcmdldFJ1bGVzLAorCQkJCQkJCQkJCSBDb2xsZWN0aW9uIGNhbGxTaXRlU3RhdGVzKQorCXsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlNZXNzYWdlIG1zZyA9IG5ldyBSZWN1cnNpb25PdmVyZmxvd01lc3NhZ2UocHJvYmUsc2FtcGxlQmFkU3RhdGUsIGFsdCwKKwkJCQkJCQkJCQkgdGFyZ2V0UnVsZXMsIGNhbGxTaXRlU3RhdGVzKTsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9yTXNnSURzLmFkZChtc2cubXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkuZXJyb3IobXNnKTsKKwl9CisKKwkvKgorCS8vIFRPRE86IHdlIGNhbiByZW1vdmUgSSB0aGluay4gIEFsbCBkZXRlY3RlZCBub3cgd2l0aCBjeWNsZXMgY2hlY2suCisJcHVibGljIHN0YXRpYyB2b2lkIGxlZnRSZWN1cnNpb24oRGVjaXNpb25Qcm9iZSBwcm9iZSwKKwkJCQkJCQkJCSBpbnQgYWx0LAorCQkJCQkJCQkJIENvbGxlY3Rpb24gdGFyZ2V0UnVsZXMsCisJCQkJCQkJCQkgQ29sbGVjdGlvbiBjYWxsU2l0ZVN0YXRlcykKKwl7CisJCWdldEVycm9yU3RhdGUoKS53YXJuaW5ncysrOworCQlNZXNzYWdlIG1zZyA9IG5ldyBMZWZ0UmVjdXJzaW9uTWVzc2FnZShwcm9iZSwgYWx0LCB0YXJnZXRSdWxlcywgY2FsbFNpdGVTdGF0ZXMpOworCQlnZXRFcnJvclN0YXRlKCkud2FybmluZ01zZ0lEcy5hZGQobXNnLm1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLndhcm5pbmcobXNnKTsKKwl9CisJKi8KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsZWZ0UmVjdXJzaW9uQ3ljbGVzKENvbGxlY3Rpb24gY3ljbGVzKSB7CisJCWdldEVycm9yU3RhdGUoKS5lcnJvcnMrKzsKKwkJTWVzc2FnZSBtc2cgPSBuZXcgTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UoY3ljbGVzKTsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9yTXNnSURzLmFkZChtc2cubXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkuZXJyb3IobXNnKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ3JhbW1hckVycm9yKGludCBtc2dJRCwKKwkJCQkJCQkJCUdyYW1tYXIgZywKKwkJCQkJCQkJCVRva2VuIHRva2VuLAorCQkJCQkJCQkJT2JqZWN0IGFyZywKKwkJCQkJCQkJCU9iamVjdCBhcmcyKQorCXsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlNZXNzYWdlIG1zZyA9IG5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShtc2dJRCxnLHRva2VuLGFyZyxhcmcyKTsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9yTXNnSURzLmFkZChtc2dJRCk7CisJCWdldEVycm9yTGlzdGVuZXIoKS5lcnJvcihtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBncmFtbWFyRXJyb3IoaW50IG1zZ0lELAorCQkJCQkJCQkJR3JhbW1hciBnLAorCQkJCQkJCQkJVG9rZW4gdG9rZW4sCisJCQkJCQkJCQlPYmplY3QgYXJnKQorCXsKKwkJZ3JhbW1hckVycm9yKG1zZ0lELGcsdG9rZW4sYXJnLG51bGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBncmFtbWFyRXJyb3IoaW50IG1zZ0lELAorCQkJCQkJCQkJR3JhbW1hciBnLAorCQkJCQkJCQkJVG9rZW4gdG9rZW4pCisJeworCQlncmFtbWFyRXJyb3IobXNnSUQsZyx0b2tlbixudWxsLG51bGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBncmFtbWFyV2FybmluZyhpbnQgbXNnSUQsCisJCQkJCQkJCQkgIEdyYW1tYXIgZywKKwkJCQkJCQkJCSAgVG9rZW4gdG9rZW4sCisJCQkJCQkJCQkgIE9iamVjdCBhcmcsCisJCQkJCQkJCQkgIE9iamVjdCBhcmcyKQorCXsKKwkJZ2V0RXJyb3JTdGF0ZSgpLndhcm5pbmdzKys7CisJCU1lc3NhZ2UgbXNnID0gbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKG1zZ0lELGcsdG9rZW4sYXJnLGFyZzIpOworCQlnZXRFcnJvclN0YXRlKCkud2FybmluZ01zZ0lEcy5hZGQobXNnSUQpOworCQlnZXRFcnJvckxpc3RlbmVyKCkud2FybmluZyhtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBncmFtbWFyV2FybmluZyhpbnQgbXNnSUQsCisJCQkJCQkJCQkgIEdyYW1tYXIgZywKKwkJCQkJCQkJCSAgVG9rZW4gdG9rZW4sCisJCQkJCQkJCQkgIE9iamVjdCBhcmcpCisJeworCQlncmFtbWFyV2FybmluZyhtc2dJRCxnLHRva2VuLGFyZyxudWxsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ3JhbW1hcldhcm5pbmcoaW50IG1zZ0lELAorCQkJCQkJCQkJICBHcmFtbWFyIGcsCisJCQkJCQkJCQkgIFRva2VuIHRva2VuKQorCXsKKwkJZ3JhbW1hcldhcm5pbmcobXNnSUQsZyx0b2tlbixudWxsLG51bGwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW50YXhFcnJvcihpbnQgbXNnSUQsCisJCQkJCQkJCSAgIEdyYW1tYXIgZ3JhbW1hciwKKwkJCQkJCQkJICAgVG9rZW4gdG9rZW4sCisJCQkJCQkJCSAgIE9iamVjdCBhcmcsCisJCQkJCQkJCSAgIFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKQorCXsKKwkJZ2V0RXJyb3JTdGF0ZSgpLmVycm9ycysrOworCQlnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYWRkKG1zZ0lEKTsKKwkJZ2V0RXJyb3JMaXN0ZW5lcigpLmVycm9yKAorCQkJbmV3IEdyYW1tYXJTeW50YXhNZXNzYWdlKG1zZ0lELGdyYW1tYXIsdG9rZW4sYXJnLHJlKQorCQkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbEVycm9yKE9iamVjdCBlcnJvciwgVGhyb3dhYmxlIGUpIHsKKwkJU3RhY2tUcmFjZUVsZW1lbnQgbG9jYXRpb24gPSBnZXRMYXN0Tm9uRXJyb3JNYW5hZ2VyQ29kZUxvY2F0aW9uKGUpOworCQlTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiAiK2UrIkAiK2xvY2F0aW9uKyI6ICIrZXJyb3I7CisJCWVycm9yKE1TR19JTlRFUk5BTF9FUlJPUiwgbXNnKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW50ZXJuYWxFcnJvcihPYmplY3QgZXJyb3IpIHsKKwkJU3RhY2tUcmFjZUVsZW1lbnQgbG9jYXRpb24gPQorCQkJZ2V0TGFzdE5vbkVycm9yTWFuYWdlckNvZGVMb2NhdGlvbihuZXcgRXhjZXB0aW9uKCkpOworCQlTdHJpbmcgbXNnID0gbG9jYXRpb24rIjogIitlcnJvcjsKKwkJZXJyb3IoTVNHX0lOVEVSTkFMX0VSUk9SLCBtc2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb05vdEF0dGVtcHRBbmFseXNpcygpIHsKKwkJcmV0dXJuICFnZXRFcnJvclN0YXRlKCkuZXJyb3JNc2dJRHMuYW5kKEVSUk9SU19GT1JDSU5HX05PX0FOQUxZU0lTKS5pc05pbCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb05vdEF0dGVtcHRDb2RlR2VuKCkgeworCQlyZXR1cm4gZG9Ob3RBdHRlbXB0QW5hbHlzaXMoKSB8fAorCQkJICAgIWdldEVycm9yU3RhdGUoKS5lcnJvck1zZ0lEcy5hbmQoRVJST1JTX0ZPUkNJTkdfTk9fQ09ERUdFTikuaXNOaWwoKTsKKwl9CisKKwkvKiogUmV0dXJuIGZpcnN0IG5vbiBFcnJvck1hbmFnZXIgY29kZSBsb2NhdGlvbiBmb3IgZ2VuZXJhdGluZyBtZXNzYWdlcyAqLworCXByaXZhdGUgc3RhdGljIFN0YWNrVHJhY2VFbGVtZW50IGdldExhc3ROb25FcnJvck1hbmFnZXJDb2RlTG9jYXRpb24oVGhyb3dhYmxlIGUpIHsKKwkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFjayA9IGUuZ2V0U3RhY2tUcmFjZSgpOworCQlpbnQgaSA9IDA7CisJCWZvciAoOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHsKKwkJCVN0YWNrVHJhY2VFbGVtZW50IHQgPSBzdGFja1tpXTsKKwkJCWlmICggdC50b1N0cmluZygpLmluZGV4T2YoIkVycm9yTWFuYWdlciIpPDAgKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJU3RhY2tUcmFjZUVsZW1lbnQgbG9jYXRpb24gPSBzdGFja1tpXTsKKwkJcmV0dXJuIGxvY2F0aW9uOworCX0KKworCS8vIEEgUyBTIEUgUiBUIEkgTyBOICBDIE8gRCBFCisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIGNvbmRpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKCAhY29uZGl0aW9uICkgeworCQkJaW50ZXJuYWxFcnJvcihtZXNzYWdlKTsKKwkJfQorCX0KKworCS8vIFMgVSBQIFAgTyBSIFQgIEMgTyBEIEUKKworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpbml0SWRUb01lc3NhZ2VOYW1lTWFwcGluZygpIHsKKwkJLy8gbWFrZSBzdXJlIGEgbWVzc2FnZSBleGlzdHMsIGV2ZW4gaWYgaXQncyBqdXN0IHRvIGluZGljYXRlIGEgcHJvYmxlbQorCQlmb3IgKGludCBpID0gMDsgaSA8IGlkVG9NZXNzYWdlVGVtcGxhdGVOYW1lLmxlbmd0aDsgaSsrKSB7CisJCQlpZFRvTWVzc2FnZVRlbXBsYXRlTmFtZVtpXSA9ICJJTlZBTElEIE1FU1NBR0UgSUQ6ICIraTsKKwkJfQorCQkvLyBnZXQgbGlzdCBvZiBmaWVsZHMgYW5kIHVzZSBpdCB0byBmaWxsIGluIGlkVG9NZXNzYWdlVGVtcGxhdGVOYW1lIG1hcHBpbmcKKwkJRmllbGRbXSBmaWVsZHMgPSBFcnJvck1hbmFnZXIuY2xhc3MuZ2V0RmllbGRzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQlGaWVsZCBmID0gZmllbGRzW2ldOworCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGYuZ2V0TmFtZSgpOworCQkJaWYgKCAhZmllbGROYW1lLnN0YXJ0c1dpdGgoIk1TR18iKSApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPQorCQkJCWZpZWxkTmFtZS5zdWJzdHJpbmcoIk1TR18iLmxlbmd0aCgpLGZpZWxkTmFtZS5sZW5ndGgoKSk7CisJCQlpbnQgbXNnSUQgPSAwOworCQkJdHJ5IHsKKwkJCQkvLyBnZXQgdGhlIGNvbnN0YW50IHZhbHVlIGZyb20gdGhpcyBjbGFzcyBvYmplY3QKKwkJCQltc2dJRCA9IGYuZ2V0SW50KEVycm9yTWFuYWdlci5jbGFzcyk7CisJCQl9CisJCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oImNhbm5vdCBnZXQgY29uc3QgdmFsdWUgZm9yICIrZi5nZXROYW1lKCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCBmaWVsZE5hbWUuc3RhcnRzV2l0aCgiTVNHXyIpICkgeworICAgICAgICAgICAgICAgIGlkVG9NZXNzYWdlVGVtcGxhdGVOYW1lW21zZ0lEXSA9IHRlbXBsYXRlTmFtZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiogVXNlIHJlZmxlY3Rpb24gdG8gZmluZCBsaXN0IG9mIE1TR18gZmllbGRzIGFuZCB0aGVuIHZlcmlmeSBhCisJICogIHRlbXBsYXRlIGV4aXN0cyBmb3IgZWFjaCBvbmUgZnJvbSB0aGUgbG9jYWxlJ3MgZ3JvdXAuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHZlcmlmeU1lc3NhZ2VzKCkgeworCQlib29sZWFuIG9rID0gdHJ1ZTsKKwkJRmllbGRbXSBmaWVsZHMgPSBFcnJvck1hbmFnZXIuY2xhc3MuZ2V0RmllbGRzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisJCQlGaWVsZCBmID0gZmllbGRzW2ldOworCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGYuZ2V0TmFtZSgpOworCQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9CisJCQkJZmllbGROYW1lLnN1YnN0cmluZygiTVNHXyIubGVuZ3RoKCksZmllbGROYW1lLmxlbmd0aCgpKTsKKwkJCWlmICggZmllbGROYW1lLnN0YXJ0c1dpdGgoIk1TR18iKSApIHsKKwkJCQlpZiAoICFtZXNzYWdlcy5pc0RlZmluZWQodGVtcGxhdGVOYW1lKSApIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJNZXNzYWdlICIrdGVtcGxhdGVOYW1lKyIgaW4gbG9jYWxlICIrCisJCQkJCQkJCQkgICBsb2NhbGUrIiBub3QgZm91bmQiKTsKKwkJCQkJb2sgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLy8gY2hlY2sgZm9yIHNwZWNpYWwgdGVtcGxhdGVzCisJCWlmICghbWVzc2FnZXMuaXNEZWZpbmVkKCJ3YXJuaW5nIikpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTWVzc2FnZSB0ZW1wbGF0ZSAnd2FybmluZycgbm90IGZvdW5kIGluIGxvY2FsZSAiKyBsb2NhbGUpOworCQkJb2sgPSBmYWxzZTsKKwkJfQorCQlpZiAoIW1lc3NhZ2VzLmlzRGVmaW5lZCgiZXJyb3IiKSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJNZXNzYWdlIHRlbXBsYXRlICdlcnJvcicgbm90IGZvdW5kIGluIGxvY2FsZSAiKyBsb2NhbGUpOworCQkJb2sgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gb2s7CisJfQorCisJLyoqIFZlcmlmeSB0aGUgbWVzc2FnZSBmb3JtYXQgdGVtcGxhdGUgZ3JvdXAgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gdmVyaWZ5Rm9ybWF0KCkgeworCQlib29sZWFuIG9rID0gdHJ1ZTsKKwkJaWYgKCFmb3JtYXQuaXNEZWZpbmVkKCJsb2NhdGlvbiIpKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZvcm1hdCB0ZW1wbGF0ZSAnbG9jYXRpb24nIG5vdCBmb3VuZCBpbiAiICsgZm9ybWF0TmFtZSk7CisJCQlvayA9IGZhbHNlOworCQl9CisJCWlmICghZm9ybWF0LmlzRGVmaW5lZCgibWVzc2FnZSIpKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZvcm1hdCB0ZW1wbGF0ZSAnbWVzc2FnZScgbm90IGZvdW5kIGluICIgKyBmb3JtYXROYW1lKTsKKwkJCW9rID0gZmFsc2U7CisJCX0KKwkJaWYgKCFmb3JtYXQuaXNEZWZpbmVkKCJyZXBvcnQiKSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJGb3JtYXQgdGVtcGxhdGUgJ3JlcG9ydCcgbm90IGZvdW5kIGluICIgKyBmb3JtYXROYW1lKTsKKwkJCW9rID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIG9rOworCX0KKworCS8qKiBJZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBFcnJvck1hbmFnZXIgaW5pdCwgd2UgaGF2ZSBubyBjaG9pY2UKKwkgKiAgYnV0IHRvIGdvIHRvIFN5c3RlbS5lcnIuCisJICovCisJc3RhdGljIHZvaWQgcmF3RXJyb3IoU3RyaW5nIG1zZykgeworCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKKwl9CisKKwlzdGF0aWMgdm9pZCByYXdFcnJvcihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSkgeworCQlyYXdFcnJvcihtc2cpOworCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwl9CisKKwkvKiogSSAqdGhpbmsqIHRoaXMgd2lsbCBhbGxvdyBUb29sIHN1YmNsYXNzZXMgdG8gZXhpdCBncmFjZWZ1bGx5CisJICogIGZvciBHVUlzIGV0Yy4uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBwYW5pYygpIHsKKwkJVG9vbCB0b29sID0gKFRvb2wpdGhyZWFkVG9Ub29sTWFwLmdldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKwkJaWYgKCB0b29sPT1udWxsICkgeworCQkJLy8gbm8gdG9vbCByZWdpc3RlcmVkLCBleGl0CisJCQl0aHJvdyBuZXcgRXJyb3IoIkFOVExSIEVycm9yTWFuYWdlciBwYW5pYyIpOworCQl9CisJCWVsc2UgeworCQkJdG9vbC5wYW5pYygpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9GQVNlcmlhbGl6ZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvRkFTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxYmJiMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvRkFTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy4qOworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBBbiBhc3BlY3Qgb2YgRkEgKGZpbml0ZSBhdXRvbWF0YSkgdGhhdCBrbm93cyBob3cgdG8gZHVtcCB0aGVtIHRvIHNlcmlhbGl6ZWQKKyAqICBzdHJpbmdzLgorICovCitwdWJsaWMgY2xhc3MgRkFTZXJpYWxpemVyIHsKKyAgICAvKiogVG8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24gd2hlbiB3YWxraW5nIHN0YXRlIG1hY2hpbmVzLCByZWNvcmQKKyAgICAgKiAgd2hpY2ggc3RhdGVzIHdlJ3ZlIHZpc2l0ZWQuICBNYWtlIGEgbmV3IHNldCBldmVyeSB0aW1lIHlvdSBzdGFydAorICAgICAqICB3YWxraW5nIGluIGNhc2UgeW91IHJldXNlIHRoaXMgb2JqZWN0LiAgTXVsdGlwbGUgdGhyZWFkcyB3aWxsIHRyYXNoCisgICAgICogIHRoaXMgc2hhcmVkIHZhcmlhYmxlLiAgVXNlIGEgZGlmZmVyZW50IEZBU2VyaWFsaXplciBwZXIgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQgbWFya2VkU3RhdGVzOworCisgICAgLyoqIEVhY2ggc3RhdGUgd2Ugd2FsayB3aWxsIGdldCBhIG5ldyBzdGF0ZSBudW1iZXIgZm9yIHNlcmlhbGl6YXRpb24KKyAgICAgKiAgcHVycG9zZXMuICBUaGlzIGlzIHRoZSB2YXJpYWJsZSB0aGF0IHRyYWNrcyBzdGF0ZSBudW1iZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc3RhdGVDb3VudGVyID0gMDsKKworICAgIC8qKiBSYXRoZXIgdGhhbiBhZGQgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUgdG8gTkZBIGFuZCBERkEganVzdCBmb3IKKyAgICAgKiAgc2VyaWFsaXppbmcgbWFjaGluZXMsIG1hcCBvbGQgc3RhdGUgbnVtYmVycyB0byBuZXcgc3RhdGUgbnVtYmVycworICAgICAqICBieSBhIFN0YXRlIG9iamVjdCAtPiBJbnRlZ2VyIG5ldyBzdGF0ZSBudW1iZXIgSGFzaE1hcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIHN0YXRlTnVtYmVyVHJhbnNsYXRvcjsKKworICAgIHByb3RlY3RlZCBHcmFtbWFyIGdyYW1tYXI7CisKKyAgICAvKiogVGhpcyBhc3BlY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZ3JhbW1hcjsgdXNlZCB0byBnZXQgdG9rZW4gbmFtZXMgKi8KKyAgICBwdWJsaWMgRkFTZXJpYWxpemVyKEdyYW1tYXIgZ3JhbW1hcikgeworICAgICAgICB0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworICAgIH0KKworCXB1YmxpYyBTdHJpbmcgc2VyaWFsaXplKFN0YXRlIHMpIHsKKwkJaWYgKCBzPT1udWxsICkgeworCQkJcmV0dXJuICI8bm8gYXV0b21hdG9uPiI7CisJCX0KKwkJcmV0dXJuIHNlcmlhbGl6ZShzLCB0cnVlKTsKKwl9CisKKwkvKiogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhdGUgbWFjaGluZS4gIFR3byBpZGVudGljYWwKKyAgICAgKiAgTkZBcyBvciBERkFzIHdpbGwgaGF2ZSBpZGVudGljYWwgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbnMuICBUaGUKKyAgICAgKiAgc3RhdGUgbnVtYmVycyBpbnNpZGUgdGhlIHN0YXRlIGFyZSBub3QgdXNlZDsgaW5zdGVhZCwgYSBuZXcgbnVtYmVyCisgICAgICogIGlzIGNvbXB1dGVkIGFuZCBiZWNhdXNlIHRoZSBzZXJpYWxpemF0aW9uIHdpbGwgd2FsayB0aGUgdHdvCisgICAgICogIG1hY2hpbmVzIHVzaW5nIHRoZSBzYW1lIHNwZWNpZmljIGFsZ29yaXRobSwgdGhlbiB0aGUgc3RhdGUgbnVtYmVycworICAgICAqICB3aWxsIGJlIGlkZW50aWNhbC4gIEFjY2VwdCBzdGF0ZXMgYXJlIGRpc3Rpbmd1aXNoZWQgZnJvbSByZWd1bGFyCisgICAgICogIHN0YXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNlcmlhbGl6ZShTdGF0ZSBzLCBib29sZWFuIHJlbnVtYmVyKSB7CisgICAgICAgIG1hcmtlZFN0YXRlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIHN0YXRlQ291bnRlciA9IDA7CisJCWlmICggcmVudW1iZXIgKSB7CisJCQlzdGF0ZU51bWJlclRyYW5zbGF0b3IgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAJd2Fsa0ZBTm9ybWFsaXppbmdTdGF0ZU51bWJlcnMocyk7CisJCX0KKwkJTGlzdCBsaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKCBzLmdldE51bWJlck9mVHJhbnNpdGlvbnMoKT4wICkgeworCQkJd2Fsa1NlcmlhbGl6aW5nRkEobGluZXMsIHMpOworCQl9CisJCWVsc2UgeworCQkJLy8gc3BlY2lhbCBjYXNlOiBzMCBpcyBhbiBhY2NlcHQKKwkJCVN0cmluZyBzMCA9IGdldFN0YXRlU3RyaW5nKDAsIHMpOworCQkJbGluZXMuYWRkKHMwKyJcbiIpOworCQl9CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDApOworICAgICAgICAvLyBzb3J0IGxpbmVzIHRvIG5vcm1hbGl6ZTsgbWFrZXMgc3RhdGVzIGNvbWUgb3V0IG9yZGVyZWQKKyAgICAgICAgLy8gYW5kIHRoZW4gb3JkZXJlZCBieSBlZGdlIGxhYmVscyB0aGVuIGJ5IHRhcmdldCBzdGF0ZSBudW1iZXIgOikKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaW5lcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gKFN0cmluZykgbGluZXMuZ2V0KGkpOworICAgICAgICAgICAgYnVmLmFwcGVuZChsaW5lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqIEluIHN0YXRlTnVtYmVyVHJhbnNsYXRvciwgZ2V0IGEgbWFwIGZyb20gU3RhdGUgdG8gbmV3LCBub3JtYWxpemVkCisgICAgICogIHN0YXRlIG51bWJlci4gIFVzZWQgYnkgd2Fsa1NlcmlhbGl6aW5nRkEgdG8gbWFrZSBzdXJlIGFueSB0d28KKyAgICAgKiAgaWRlbnRpY2FsIHN0YXRlIG1hY2hpbmVzIHdpbGwgc2VyaWFsaXplIHRoZSBzYW1lIHdheS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3YWxrRkFOb3JtYWxpemluZ1N0YXRlTnVtYmVycyhTdGF0ZSBzKSB7CisJCWlmICggcz09bnVsbCApIHsKKwkJCUVycm9yTWFuYWdlci5pbnRlcm5hbEVycm9yKCJudWxsIHN0YXRlIHMiKTsKKwkJCXJldHVybjsKKwkJfQorICAgICAgICBpZiAoIHN0YXRlTnVtYmVyVHJhbnNsYXRvci5nZXQocykhPW51bGwgKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgZGlkIHRoaXMgc3RhdGUKKyAgICAgICAgfQorICAgICAgICAvLyBhc3NpZ24gYSBuZXcgc3RhdGUgbnVtYmVyIGZvciB0aGlzIG5vZGUgaWYgdGhlcmUgaXNuJ3Qgb25lCisgICAgICAgIHN0YXRlTnVtYmVyVHJhbnNsYXRvci5wdXQocywgVXRpbHMuaW50ZWdlcihzdGF0ZUNvdW50ZXIpKTsKKyAgICAgICAgc3RhdGVDb3VudGVyKys7CisKKyAgICAgICAgLy8gdmlzaXQgbm9kZXMgcG9pbnRlZCB0byBieSBlYWNoIHRyYW5zaXRpb247CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk7IGkrKykgeworICAgICAgICAgICAgVHJhbnNpdGlvbiBlZGdlID0gKFRyYW5zaXRpb24pIHMudHJhbnNpdGlvbihpKTsKKyAgICAgICAgICAgIHdhbGtGQU5vcm1hbGl6aW5nU3RhdGVOdW1iZXJzKGVkZ2UudGFyZ2V0KTsgLy8ga2VlcCB3YWxraW4nCisgICAgICAgICAgICAvLyBpZiB0aGlzIHRyYW5zaXRpb24gaXMgYSBydWxlIHJlZmVyZW5jZSwgdGhlIG5vZGUgImZvbGxvd2luZyIgdGhpcyBzdGF0ZQorICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgZm91bmQgYW5kIGFwcGVhciB0byBiZSBub3QgaW4gZ3JhcGguICBNdXN0IGV4cGxpY2l0bHkganVtcAorICAgICAgICAgICAgLy8gdG8gaXQsIGJ1dCBkb24ndCAiZHJhdyIgYW4gZWRnZS4KKyAgICAgICAgICAgIGlmICggZWRnZSBpbnN0YW5jZW9mIFJ1bGVDbG9zdXJlVHJhbnNpdGlvbiApIHsKKwkJCQl3YWxrRkFOb3JtYWxpemluZ1N0YXRlTnVtYmVycygoKFJ1bGVDbG9zdXJlVHJhbnNpdGlvbikgZWRnZSkuZm9sbG93U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgd2Fsa1NlcmlhbGl6aW5nRkEoTGlzdCBsaW5lcywgU3RhdGUgcykgeworICAgICAgICBpZiAoIG1hcmtlZFN0YXRlcy5jb250YWlucyhzKSApIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSB2aXNpdGVkIHRoaXMgbm9kZQorICAgICAgICB9CisKKyAgICAgICAgbWFya2VkU3RhdGVzLmFkZChzKTsgLy8gbWFyayB0aGlzIG5vZGUgYXMgY29tcGxldGVkLgorCisJCWludCBub3JtYWxpemVkU3RhdGVOdW1iZXIgPSBzLnN0YXRlTnVtYmVyOworCQlpZiAoIHN0YXRlTnVtYmVyVHJhbnNsYXRvciE9bnVsbCApIHsKKwkgICAgICAgIEludGVnZXIgbm9ybWFsaXplZFN0YXRlTnVtYmVySSA9IChJbnRlZ2VyKXN0YXRlTnVtYmVyVHJhbnNsYXRvci5nZXQocyk7CisJCQlub3JtYWxpemVkU3RhdGVOdW1iZXIgPSBub3JtYWxpemVkU3RhdGVOdW1iZXJJLmludFZhbHVlKCk7CisJCX0KKworCQlTdHJpbmcgc3RhdGVTdHIgPSBnZXRTdGF0ZVN0cmluZyhub3JtYWxpemVkU3RhdGVOdW1iZXIsIHMpOworCisgICAgICAgIC8vIGRlcHRoIGZpcnN0IHdhbGsgZWFjaCB0cmFuc2l0aW9uLCBwcmludGluZyBpdHMgZWRnZSBmaXJzdAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBpKyspIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb24gZWRnZSA9IChUcmFuc2l0aW9uKSBzLnRyYW5zaXRpb24oaSk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYnVmLmFwcGVuZChzdGF0ZVN0cik7CisJCQlpZiAoIGVkZ2UuaXNBY3Rpb24oKSApIHsKKwkJCQlidWYuYXBwZW5kKCIte30tPiIpOworCQkJfQorCQkJZWxzZSBpZiAoIGVkZ2UuaXNFcHNpbG9uKCkgKSB7CisJCQkJYnVmLmFwcGVuZCgiLT4iKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCBlZGdlLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCQlidWYuYXBwZW5kKCIteyIrZWRnZS5sYWJlbC5nZXRTZW1hbnRpY0NvbnRleHQoKSsifT8tPiIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU3RyaW5nIHByZWRzU3RyID0gIiI7CisJCQkJaWYgKCBlZGdlLnRhcmdldCBpbnN0YW5jZW9mIERGQVN0YXRlICkgeworCQkJCQkvLyBsb29rIGZvciBnYXRlZCBwcmVkaWNhdGVzOyBkb24ndCBhZGQgZ2F0ZWQgdG8gc2ltcGxlIHNlbXByZWQgZWRnZXMKKwkJCQkJU2VtYW50aWNDb250ZXh0IHByZWRzID0KKwkJCQkJCSgoREZBU3RhdGUpZWRnZS50YXJnZXQpLmdldEdhdGVkUHJlZGljYXRlc0luTkZBQ29uZmlndXJhdGlvbnMoKTsKKwkJCQkJaWYgKCBwcmVkcyE9bnVsbCApIHsKKwkJCQkJCXByZWRzU3RyID0gIiYmeyIrCisJCQkJCQkJcHJlZHMuZ2VuRXhwcihncmFtbWFyLmdlbmVyYXRvciwKKwkJCQkJCQkJCSAgIAkgIGdyYW1tYXIuZ2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLCBudWxsKS5yZW5kZXIoKQorCQkJCQkJCSsifT8iOworCQkJCQl9CisJCQkJfQorCQkJCWJ1Zi5hcHBlbmQoIi0iK2VkZ2UubGFiZWwudG9TdHJpbmcoZ3JhbW1hcikrcHJlZHNTdHIrIi0+Iik7CisJCQl9CisKKwkJCWludCBub3JtYWxpemVkVGFyZ2V0U3RhdGVOdW1iZXIgPSBlZGdlLnRhcmdldC5zdGF0ZU51bWJlcjsKKwkJCWlmICggc3RhdGVOdW1iZXJUcmFuc2xhdG9yIT1udWxsICkgeworCQkJCUludGVnZXIgbm9ybWFsaXplZFRhcmdldFN0YXRlTnVtYmVySSA9CisJCQkJCShJbnRlZ2VyKXN0YXRlTnVtYmVyVHJhbnNsYXRvci5nZXQoZWRnZS50YXJnZXQpOworCQkJCW5vcm1hbGl6ZWRUYXJnZXRTdGF0ZU51bWJlciA9IG5vcm1hbGl6ZWRUYXJnZXRTdGF0ZU51bWJlckkuaW50VmFsdWUoKTsKKwkJCX0KKwkJCWJ1Zi5hcHBlbmQoZ2V0U3RhdGVTdHJpbmcobm9ybWFsaXplZFRhcmdldFN0YXRlTnVtYmVyLCBlZGdlLnRhcmdldCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGxpbmVzLmFkZChidWYudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHdhbGsgdGhpcyB0cmFuc2l0aW9uCisgICAgICAgICAgICB3YWxrU2VyaWFsaXppbmdGQShsaW5lcywgZWRnZS50YXJnZXQpOworCisgICAgICAgICAgICAvLyBpZiB0aGlzIHRyYW5zaXRpb24gaXMgYSBydWxlIHJlZmVyZW5jZSwgdGhlIG5vZGUgImZvbGxvd2luZyIgdGhpcyBzdGF0ZQorICAgICAgICAgICAgLy8gd2lsbCBub3QgYmUgZm91bmQgYW5kIGFwcGVhciB0byBiZSBub3QgaW4gZ3JhcGguICBNdXN0IGV4cGxpY2l0bHkganVtcAorICAgICAgICAgICAgLy8gdG8gaXQsIGJ1dCBkb24ndCAiZHJhdyIgYW4gZWRnZS4KKyAgICAgICAgICAgIGlmICggZWRnZSBpbnN0YW5jZW9mIFJ1bGVDbG9zdXJlVHJhbnNpdGlvbiApIHsKKwkJCQl3YWxrU2VyaWFsaXppbmdGQShsaW5lcywgKChSdWxlQ2xvc3VyZVRyYW5zaXRpb24pIGVkZ2UpLmZvbGxvd1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGVTdHJpbmcoaW50IG4sIFN0YXRlIHMpIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlU3RyID0gIi5zIituOworICAgICAgICBpZiAoIHMuaXNBY2NlcHRTdGF0ZSgpICkgeworICAgICAgICAgICAgaWYgKCBzIGluc3RhbmNlb2YgREZBU3RhdGUgKSB7CisgICAgICAgICAgICAgICAgc3RhdGVTdHIgPSAiOnMiK24rIj0+IisoKERGQVN0YXRlKXMpLmdldFVuaXF1ZWx5UHJlZGljdGVkQWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9ICI6cyIrbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGVTdHI7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hci5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4MzE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hci5qYXZhCkBAIC0wLDAgKzEsMzE3MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRGQTsKK2ltcG9ydCBvcmcuYW50bHIuY29kZWdlbi5Db2RlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLio7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuKjsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy4qOworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbTsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXA7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXBTdHJpbmc7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBSZXByZXNlbnRzIGEgZ3JhbW1hciBpbiBtZW1vcnkuICovCitwdWJsaWMgY2xhc3MgR3JhbW1hciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOUFJFRF9SVUxFX1BSRUZJWCA9ICJzeW5wcmVkIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQU1NQVJfRklMRV9FWFRFTlNJT04gPSAiLmciOworCisJLyoqIHVzZWQgZm9yIGdlbmVyYXRpbmcgbGV4ZXIgdGVtcCBmaWxlcyAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFWEVSX0dSQU1NQVJfRklMRV9FWFRFTlNJT04gPSAiLmciOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9ERUNJU0lPTl9MSVNUX1NJWkUgPSAzMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SVUxFX0lOREVYID0gLTE7CisKKwkvLyB0aGUgdmFyaW91cyBraW5kcyBvZiBsYWJlbHMuIHQ9dHlwZSwgaWQ9SUQsIHR5cGVzKz10eXBlIGlkcys9SUQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0xBQkVMID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9MQUJFTCA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9MSVNUX0xBQkVMID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9MSVNUX0xBQkVMID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSX0xBQkVMID0gNTsgLy8gdXNlZCBpbiBsZXhlciBmb3IgeD0nYScKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUxEQ0FSRF9UUkVFX0xBQkVMID0gNjsgLy8gVXNlZCBpbiB0cmVlIGdyYW1tYXIgeD0uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lMRENBUkRfVFJFRV9MSVNUX0xBQkVMID0gNzsgLy8gVXNlZCBpbiB0cmVlIGdyYW1tYXIgeCs9LgorCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIExhYmVsVHlwZVRvU3RyaW5nID0KKwkJeyI8aW52YWxpZD4iLCAicnVsZSIsICJ0b2tlbiIsICJydWxlLWxpc3QiLCAidG9rZW4tbGlzdCIsICJ3aWxkY2FyZC10cmVlIiwgIndpbGRjYXJkLXRyZWUtbGlzdCJ9OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZJQ0lBTF9UT0tFTlNfUlVMRU5BTUUgPSAiVG9rZW5zIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9SVUxFX01PRElGSUVSID0gImZyYWdtZW50IjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTlBSRURHQVRFX0FDVElPTl9OQU1FID0gInN5bnByZWRnYXRlIjsKKworCS8qKiBXaGVuIGNvbnZlcnRpbmcgQU5UTFIgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLCBoZXJlIGlzIHRoZQorCSAqICB2YWx1ZSBzZXQgb2YgZXNjYXBlIGNoYXJzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IEFOVExSTGl0ZXJhbEVzY2FwZWRDaGFyVmFsdWVbXSA9IG5ldyBpbnRbMjU1XTsKKworCS8qKiBHaXZlbiBhIGNoYXIsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzaG93IGFzIGFuIEFOVExSIGxpdGVyYWwuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQU5UTFJMaXRlcmFsQ2hhclZhbHVlRXNjYXBlW10gPSBuZXcgU3RyaW5nWzI1NV07CisKKwlzdGF0aWMgeworCQlBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlWyduJ10gPSAnXG4nOworCQlBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlWydyJ10gPSAnXHInOworCQlBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlWyd0J10gPSAnXHQnOworCQlBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlWydiJ10gPSAnXGInOworCQlBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlWydmJ10gPSAnXGYnOworCQlBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlWydcXCddID0gJ1xcJzsKKwkJQU5UTFJMaXRlcmFsRXNjYXBlZENoYXJWYWx1ZVsnXCcnXSA9ICdcJyc7CisJCUFOVExSTGl0ZXJhbEVzY2FwZWRDaGFyVmFsdWVbJyInXSA9ICciJzsKKwkJQU5UTFJMaXRlcmFsQ2hhclZhbHVlRXNjYXBlWydcbiddID0gIlxcbiI7CisJCUFOVExSTGl0ZXJhbENoYXJWYWx1ZUVzY2FwZVsnXHInXSA9ICJcXHIiOworCQlBTlRMUkxpdGVyYWxDaGFyVmFsdWVFc2NhcGVbJ1x0J10gPSAiXFx0IjsKKwkJQU5UTFJMaXRlcmFsQ2hhclZhbHVlRXNjYXBlWydcYiddID0gIlxcYiI7CisJCUFOVExSTGl0ZXJhbENoYXJWYWx1ZUVzY2FwZVsnXGYnXSA9ICJcXGYiOworCQlBTlRMUkxpdGVyYWxDaGFyVmFsdWVFc2NhcGVbJ1xcJ10gPSAiXFxcXCI7CisJCUFOVExSTGl0ZXJhbENoYXJWYWx1ZUVzY2FwZVsnXCcnXSA9ICJcXCciOworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFWEVSID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTRVIgPSAyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSRUVfUEFSU0VSID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5FRCA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBncmFtbWFyVHlwZVRvU3RyaW5nID0gbmV3IFN0cmluZ1tdIHsKKwkJIjxpbnZhbGlkPiIsCisJCSJsZXhlciIsCisJCSJwYXJzZXIiLAorCQkidHJlZSIsCisJCSJjb21iaW5lZCIKKwl9OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBncmFtbWFyVHlwZVRvRmlsZU5hbWVTdWZmaXggPSBuZXcgU3RyaW5nW10geworCQkiPGludmFsaWQ+IiwKKwkJIkxleGVyIiwKKwkJIlBhcnNlciIsCisJCSIiLCAvLyBubyBzdWZmaXggZm9yIHRyZWUgZ3JhbW1hcnMKKwkJIlBhcnNlciIgLy8gaWYgY29tYmluZWQgZ3JhbW1hciwgZ2VuIFBhcnNlciBhbmQgTGV4ZXIgd2lsbCBiZSBkb25lIGxhdGVyCisJfTsKKworCS8qKiBTZXQgb2YgdmFsaWQgaW1wb3J0cy4gIEUuZy4sIGNhbiBvbmx5IGltcG9ydCBhIHRyZWUgcGFyc2VyIGludG8KKwkgKiAgYW5vdGhlciB0cmVlIHBhcnNlci4gIE1hcHMgZGVsZWdhdGUgdG8gc2V0IG9mIGRlbGVnYXRvciBncmFtbWFyIHR5cGVzLgorCSAqICB2YWxpZERlbGVnYXRpb25zLmdldChMRVhFUikgZ2l2ZXMgbGlzdCBvZiB0aGUga2luZHMgb2YgZGVsZWdhdG9ycworCSAqICB0aGF0IGNhbiBpbXBvcnQgbGV4ZXJzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTXVsdGlNYXA8SW50ZWdlcixJbnRlZ2VyPiB2YWxpZERlbGVnYXRpb25zID0KKwkJbmV3IE11bHRpTWFwPEludGVnZXIsSW50ZWdlcj4oKSB7CisJCQl7CisJCQkJbWFwKExFWEVSLCBMRVhFUik7CisJCQkJbWFwKExFWEVSLCBQQVJTRVIpOworCQkJCW1hcChMRVhFUiwgQ09NQklORUQpOworCisJCQkJbWFwKFBBUlNFUiwgUEFSU0VSKTsKKwkJCQltYXAoUEFSU0VSLCBDT01CSU5FRCk7CisKKwkJCQltYXAoVFJFRV9QQVJTRVIsIFRSRUVfUEFSU0VSKTsKKworCQkJCS8vIFRPRE86IGFsbG93IENPTUJJTkVECisJCQkJLy8gbWFwKENPTUJJTkVELCBDT01CSU5FRCk7CisJCQl9CisJCX07CisKKwkvKiogVGhpcyBpcyB0aGUgYnVmZmVyIG9mICphbGwqIHRva2VucyBmb3VuZCBpbiB0aGUgZ3JhbW1hciBmaWxlCisJICogIGluY2x1ZGluZyB3aGl0ZXNwYWNlIHRva2VucyBldGMuLi4gIEkgdXNlIHRoaXMgdG8gZXh0cmFjdAorCSAqICBsZXhlciBydWxlcyBmcm9tIGNvbWJpbmVkIGdyYW1tYXJzLgorCSAqLworCXB1YmxpYyBDb21tb25Ub2tlblN0cmVhbSB0b2tlbkJ1ZmZlcjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfU1RSSU5HX0lOX0dSQU1NQVJfRklMRV9OQU1FID0gIl9fIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0dFTkVSQVRFRF9UT0tFTl9OQU1FX1BSRUZJWCA9ICJUX18iOworCisJcHVibGljIHN0YXRpYyBjbGFzcyBEZWNpc2lvbiB7CisJCXB1YmxpYyBHcmFtbWFyIGdyYW1tYXI7CisJCXB1YmxpYyBpbnQgZGVjaXNpb247CisJCXB1YmxpYyBORkFTdGF0ZSBzdGFydFN0YXRlOworCQlwdWJsaWMgR3JhbW1hckFTVCBibG9ja0FTVDsKKwkJcHVibGljIERGQSBkZmE7CisJfQorCisJcHVibGljIGNsYXNzIExhYmVsRWxlbWVudFBhaXIgeworCQlwdWJsaWMgVG9rZW4gbGFiZWw7CisJCXB1YmxpYyBHcmFtbWFyQVNUIGVsZW1lbnRSZWY7CisJCXB1YmxpYyBTdHJpbmcgcmVmZXJlbmNlZFJ1bGVOYW1lOworCQkvKiogSGFzIGFuIGFjdGlvbiByZWZlcmVuY2VkIHRoZSBsYWJlbD8gIFNldCBieSBBY3Rpb25BbmFseXNpcy5nCisJCSAqICBDdXJyZW50bHkgb25seSBzZXQgZm9yIHJ1bGUgbGFiZWxzLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gYWN0aW9uUmVmZXJlbmNlc0xhYmVsOworCQlwdWJsaWMgaW50IHR5cGU7IC8vIGluIHtSVUxFX0xBQkVMLFRPS0VOX0xBQkVMLFJVTEVfTElTVF9MQUJFTCxUT0tFTl9MSVNUX0xBQkVMfQorCQlwdWJsaWMgTGFiZWxFbGVtZW50UGFpcihUb2tlbiBsYWJlbCwgR3JhbW1hckFTVCBlbGVtZW50UmVmKSB7CisJCQl0aGlzLmxhYmVsID0gbGFiZWw7CisJCQl0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmOworCQkJdGhpcy5yZWZlcmVuY2VkUnVsZU5hbWUgPSBlbGVtZW50UmVmLmdldFRleHQoKTsKKwkJfQorCQlwdWJsaWMgUnVsZSBnZXRSZWZlcmVuY2VkUnVsZSgpIHsKKwkJCXJldHVybiBnZXRSdWxlKHJlZmVyZW5jZWRSdWxlTmFtZSk7CisJCX0KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCXJldHVybiBlbGVtZW50UmVmLnRvU3RyaW5nKCk7CisJCX0KKwl9CisKKwkvKiogV2hhdCBuYW1lIGRpZCB0aGUgdXNlciBwcm92aWRlIGZvciB0aGlzIGdyYW1tYXI/ICovCisJcHVibGljIFN0cmluZyBuYW1lOworCisJLyoqIFdoYXQgdHlwZSBvZiBncmFtbWFyIGlzIHRoaXM6IGxleGVyLCBwYXJzZXIsIHRyZWUgd2Fsa2VyICovCisJcHVibGljIGludCB0eXBlOworCisJLyoqIEEgbGlzdCBvZiBvcHRpb25zIHNwZWNpZmllZCBhdCB0aGUgZ3JhbW1hciBsZXZlbCBzdWNoIGFzIGxhbmd1YWdlPUphdmEuCisJICogIFRoZSB2YWx1ZSBjYW4gYmUgYW4gQVNUIGZvciBjb21wbGljYXRlZCB2YWx1ZXMgc3VjaCBhcyBjaGFyYWN0ZXIgc2V0cy4KKwkgKiAgVGhlcmUgbWF5IGJlIGNvZGUgZ2VuZXJhdG9yIHNwZWNpZmljIG9wdGlvbnMgaW4gaGVyZS4gIEkgZG8gbm8KKwkgKiAgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGtleS92YWx1ZSBwYWlycy4uLnRoZXkgYXJlIHNpbXBseSBhdmFpbGFibGUgZm9yCisJICogIHdobyB3YW50cyB0aGVtLgorCSAqLworCXByb3RlY3RlZCBNYXAgb3B0aW9uczsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IGxlZ2FsTGV4ZXJPcHRpb25zID0KKwkJCW5ldyBIYXNoU2V0KCkgeworCQkJCXsKKwkJCQlhZGQoImxhbmd1YWdlIik7IGFkZCgidG9rZW5Wb2NhYiIpOworCQkJCWFkZCgiVG9rZW5MYWJlbFR5cGUiKTsKKwkJCQlhZGQoInN1cGVyQ2xhc3MiKTsKKwkJCQlhZGQoImZpbHRlciIpOworCQkJCWFkZCgiayIpOworCQkJCWFkZCgiYmFja3RyYWNrIik7CisJCQkJYWRkKCJtZW1vaXplIik7CisJCQkJfQorCQkJfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IGxlZ2FsUGFyc2VyT3B0aW9ucyA9CisJCQluZXcgSGFzaFNldCgpIHsKKwkJCQl7CisJCQkJYWRkKCJsYW5ndWFnZSIpOyBhZGQoInRva2VuVm9jYWIiKTsKKwkJCQlhZGQoIm91dHB1dCIpOyBhZGQoInJld3JpdGUiKTsgYWRkKCJBU1RMYWJlbFR5cGUiKTsKKwkJCQlhZGQoIlRva2VuTGFiZWxUeXBlIik7CisJCQkJYWRkKCJzdXBlckNsYXNzIik7CisJCQkJYWRkKCJrIik7CisJCQkJYWRkKCJiYWNrdHJhY2siKTsKKwkJCQlhZGQoIm1lbW9pemUiKTsKKwkJCQl9CisJCQl9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgbGVnYWxUcmVlUGFyc2VyT3B0aW9ucyA9CisgICAgICAgIG5ldyBIYXNoU2V0KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZCgibGFuZ3VhZ2UiKTsgYWRkKCJ0b2tlblZvY2FiIik7CisgICAgICAgICAgICAgICAgYWRkKCJvdXRwdXQiKTsgYWRkKCJyZXdyaXRlIik7IGFkZCgiQVNUTGFiZWxUeXBlIik7CisgICAgICAgICAgICAgICAgYWRkKCJUb2tlbkxhYmVsVHlwZSIpOworICAgICAgICAgICAgICAgIGFkZCgic3VwZXJDbGFzcyIpOworICAgICAgICAgICAgICAgIGFkZCgiayIpOworICAgICAgICAgICAgICAgIGFkZCgiYmFja3RyYWNrIik7CisgICAgICAgICAgICAgICAgYWRkKCJtZW1vaXplIik7CisgICAgICAgICAgICAgICAgYWRkKCJmaWx0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IGRvTm90Q29weU9wdGlvbnNUb0xleGVyID0KKwkJbmV3IEhhc2hTZXQoKSB7CisJCQl7CisJCQkJYWRkKCJvdXRwdXQiKTsgYWRkKCJBU1RMYWJlbFR5cGUiKTsgYWRkKCJzdXBlckNsYXNzIik7CisJCQkJYWRkKCJrIik7IGFkZCgiYmFja3RyYWNrIik7IGFkZCgibWVtb2l6ZSIpOyBhZGQoInJld3JpdGUiKTsKKwkJCX0KKwkJfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIGRlZmF1bHRPcHRpb25zID0KKwkJCW5ldyBIYXNoTWFwKCkgeworCQkJCXsKKwkJCQkJcHV0KCJsYW5ndWFnZSIsIkphdmEiKTsKKwkJCQl9CisJCQl9OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgbGVnYWxCbG9ja09wdGlvbnMgPQorCQkJbmV3IEhhc2hTZXQoKSB7e2FkZCgiayIpOyBhZGQoImdyZWVkeSIpOyBhZGQoImJhY2t0cmFjayIpOyBhZGQoIm1lbW9pemUiKTt9fTsKKworCS8qKiBXaGF0IGFyZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciBhIHN1YnJ1bGU/ICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgZGVmYXVsdEJsb2NrT3B0aW9ucyA9CisJCQluZXcgSGFzaE1hcCgpIHt7cHV0KCJncmVlZHkiLCJ0cnVlIik7fX07CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBkZWZhdWx0TGV4ZXJCbG9ja09wdGlvbnMgPQorCQkJbmV3IEhhc2hNYXAoKSB7e3B1dCgiZ3JlZWR5IiwidHJ1ZSIpO319OworCisJLy8gVG9rZW4gb3B0aW9ucyBhcmUgaGVyZSB0byBhdm9pZCBjb250YW1pbmF0aW5nIFRva2VuIG9iamVjdCBpbiBydW50aW1lCisKKwkvKiogTGVnYWwgb3B0aW9ucyBmb3IgdGVybWluYWwgcmVmcyBsaWtlIElEPG5vZGU9TXlWYXJOb2RlPiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IGxlZ2FsVG9rZW5PcHRpb25zID0KKwkJbmV3IEhhc2hTZXQoKSB7CisJCQl7CisJCQkJYWRkKGRlZmF1bHRUb2tlbk9wdGlvbik7CisJCQkJYWRkKCJ0eXBlIik7CisJCQkJYWRkKCJ0ZXh0Iik7CisJCQkJYWRkKCJhc3NvYyIpOworCQkJfQorCQl9OworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFRva2VuT3B0aW9uID0gIm5vZGUiOworCisJLyoqIElzIHRoZXJlIGEgZ2xvYmFsIGZpeGVkIGxvb2thaGVhZCBzZXQgZm9yIHRoaXMgZ3JhbW1hcj8KKwkgKiAgSWYgMCwgbm90aGluZyBzcGVjaWZpZWQuICAtMSBpbXBsaWVzIHdlIGhhdmUgbm90IGxvb2tlZCBhdAorCSAqICB0aGUgb3B0aW9ucyB0YWJsZSB5ZXQgdG8gc2V0IGsuCisJICovCisJcHJvdGVjdGVkIGludCBnbG9iYWxfayA9IC0xOworCisJLyoqIE1hcCBhIHNjb3BlIHRvIGEgbWFwIG9mIG5hbWU6YWN0aW9uIHBhaXJzLgorCSAqICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLEdyYW1tYXJBU1Q+PgorCSAqICBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCB1c2UgdGhpcyB0byBmaWxsIGhvbGVzIGluIHRoZSBvdXRwdXQgZmlsZXMuCisJICogIEkgdHJhY2sgdGhlIEFTVCBub2RlIGZvciB0aGUgYWN0aW9uIGluIGNhc2UgSSBuZWVkIHRoZSBsaW5lIG51bWJlcgorCSAqICBmb3IgZXJyb3JzLgorCSAqLworCXByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWN0aW9ucyA9CisJCW5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKworCS8qKiBUaGUgTkZBIHRoYXQgcmVwcmVzZW50cyB0aGUgZ3JhbW1hciB3aXRoIGVkZ2VzIGxhYmVsbGVkIHdpdGggdG9rZW5zCisJICogIG9yIGVwc2lsb24uICBJdCBpcyBtb3JlIHN1aXRhYmxlIHRvIGFuYWx5c2lzIHRoYW4gYW4gQVNUIHJlcHJlc2VudGF0aW9uLgorCSAqLworCXB1YmxpYyBORkEgbmZhOworCisJcHJvdGVjdGVkIE5GQUZhY3RvcnkgZmFjdG9yeTsKKworCS8qKiBJZiB0aGlzIGdyYW1tYXIgaXMgcGFydCBvZiBhIGxhcmdlciBjb21wb3NpdGUgZ3JhbW1hciB2aWEgZGVsZWdhdGUKKwkgKiAgc3RhdGVtZW50LCB0aGVuIHRoaXMgcG9pbnRzIGF0IHRoZSBjb21wb3NpdGUuICBUaGUgY29tcG9zaXRlIGhvbGRzCisJICogIGEgZ2xvYmFsIGxpc3Qgb2YgcnVsZXMsIHRva2VuIHR5cGVzLCBkZWNpc2lvbiBudW1iZXJzLCBldGMuLi4KKwkgKi8KKwlwdWJsaWMgQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGU7CisKKwkvKiogQSBwb2ludGVyIGJhY2sgaW50byBncmFtbWFyIHRyZWUuICBOZWVkZWQgc28gd2UgY2FuIGFkZCBkZWxlZ2F0ZXMuICovCisJcHVibGljIENvbXBvc2l0ZUdyYW1tYXJUcmVlIGNvbXBvc2l0ZVRyZWVOb2RlOworCisJLyoqIElmIHRoaXMgaXMgYSBkZWxlZ2F0ZSBvZiBhbm90aGVyIGdyYW1tYXIsIHRoaXMgaXMgdGhlIGxhYmVsIHVzZWQKKwkgKiAgYXMgYW4gaW5zdGFuY2UgdmFyIGJ5IHRoYXQgZ3JhbW1hciB0byBwb2ludCBhdCB0aGlzIGdyYW1tYXIuIG51bGwKKwkgKiAgaWYgbm8gbGFiZWwgd2FzIHNwZWNpZmllZCBpbiB0aGUgZGVsZWdhdGUgc3RhdGVtZW50LgorCSAqLworCXB1YmxpYyBTdHJpbmcgbGFiZWw7CisKKwkvKiogVE9ETzogaG9vayB0aGlzIHRvIHRoZSBjaGFyVm9jYWJ1bGFyeSBvcHRpb24gKi8KKwlwcm90ZWN0ZWQgSW50U2V0IGNoYXJWb2NhYnVsYXJ5ID0gbnVsbDsKKworCS8qKiBGb3IgQU5UTFJXb3Jrcywgd2Ugd2FudCB0byBiZSBhYmxlIHRvIG1hcCBhIGxpbmU6Y29sIHRvIGEgc3BlY2lmaWMKKwkgKiAgZGVjaXNpb24gREZBIHNvIGl0IGNhbiBkaXNwbGF5IERGQS4KKwkgKi8KKwlNYXAgbGluZUNvbHVtblRvTG9va2FoZWFkREZBTWFwID0gbmV3IEhhc2hNYXAoKTsKKworCXB1YmxpYyBUb29sIHRvb2w7CisKKwkvKiogVGhlIHVuaXF1ZSBzZXQgb2YgYWxsIHJ1bGUgcmVmZXJlbmNlcyBpbiBhbnkgcnVsZTsgc2V0IG9mIHRyZWUgbm9kZQorCSAqICBvYmplY3RzIHNvIHR3byByZWZzIHRvIHNhbWUgcnVsZSBjYW4gZXhpc3QgYnV0IGF0IGRpZmZlcmVudCBsaW5lL3Bvc2l0aW9uLgorCSAqLworCXByb3RlY3RlZCBTZXQ8R3JhbW1hckFTVD4gcnVsZVJlZnMgPSBuZXcgSGFzaFNldDxHcmFtbWFyQVNUPigpOworCisJcHJvdGVjdGVkIFNldDxHcmFtbWFyQVNUPiBzY29wZWRSdWxlUmVmcyA9IG5ldyBIYXNoU2V0KCk7CisKKwkvKiogVGhlIHVuaXF1ZSBzZXQgb2YgYWxsIHRva2VuIElEIHJlZmVyZW5jZXMgaW4gYW55IHJ1bGUgKi8KKwlwcm90ZWN0ZWQgU2V0PFRva2VuPiB0b2tlbklEUmVmcyA9IG5ldyBIYXNoU2V0PFRva2VuPigpOworCisJLyoqIEJlIGFibGUgdG8gYXNzaWduIGEgbnVtYmVyIHRvIGV2ZXJ5IGRlY2lzaW9uIGluIGdyYW1tYXI7CisJICogIGRlY2lzaW9ucyBpbiAxLi5uCisJICovCisJcHJvdGVjdGVkIGludCBkZWNpc2lvbkNvdW50ID0gMDsKKworCS8qKiBBIGxpc3Qgb2YgYWxsIHJ1bGVzIHRoYXQgYXJlIGluIGFueSBsZWZ0LXJlY3Vyc2l2ZSBjeWNsZS4gIFRoZXJlCisJICogIGNvdWxkIGJlIG11bHRpcGxlIGN5Y2xlcywgYnV0IHRoaXMgaXMgYSBmbGF0IGxpc3Qgb2YgYWxsIHByb2JsZW1hdGljCisJICogIHJ1bGVzLiBUaGlzIGlzIHN0dWZmIHdlIGNvdWxkbid0IHJlZmFjdG9yIHRvIHByZWNlZGVuY2UgcnVsZS4KKwkgKi8KKwlwcm90ZWN0ZWQgU2V0PFJ1bGU+IGxlZnRSZWN1cnNpdmVSdWxlczsKKworCS8qKiBBbiBleHRlcm5hbCB0b29sIHJlcXVlc3RzIHRoYXQgREZBIGFuYWx5c2lzIGFib3J0IHByZW1hdHVyZWx5LiAgU3RvcHMKKwkgKiAgYXQgREZBIGdyYW51bGFyaXR5LCB3aGljaCBhcmUgbGltaXRlZCB0byBhIERGQSBzaXplIGFuZCB0aW1lIGNvbXB1dGF0aW9uCisJICogIGFzIGZhaWxzYWZlLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsQW5hbHlzaXNBYm9ydDsKKworCXB1YmxpYyBpbnQgbnVtTm9uTExTdGFyID0gMDsgLy8gaGFjayB0byB0cmFjayBmb3IgLXJlcG9ydAorCisJLyoqIFdoZW4gd2UgcmVhZCBpbiBhIGdyYW1tYXIsIHdlIHRyYWNrIHRoZSBsaXN0IG9mIHN5bnRhY3RpYyBwcmVkaWNhdGVzCisJICogIGFuZCBidWlsZCBmYXV4IHJ1bGVzIGZvciB0aGVtIGxhdGVyLiAgU2VlIG15IGJsb2cgZW50cnkgRGVjIDIsIDIwMDU6CisJICogIGh0dHA6Ly93d3cuYW50bHIub3JnL2Jsb2cvYW50bHIzL2xvb2thaGVhZC50bWwKKwkgKiAgVGhpcyBtYXBzIHRoZSBuYW1lICh3ZSBtYWtlIHVwKSBmb3IgYSBwcmVkIHRvIHRoZSBBU1QgZ3JhbW1hciBmcmFnbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEdyYW1tYXJBU1Q+IG5hbWVUb1N5bnByZWRBU1RNYXA7CisKKwkvKiogRWFjaCBsZWZ0LXJlY3Vyc2l2ZSBwcmVjZWRlbmNlIHJ1bGUgbXVzdCBkZWZpbmUgcHJlY2VkZW5jZSBhcnJheQorCSAqICBmb3IgYmluYXJ5IG9wZXJhdG9ycyBsaWtlOgorCSAqCisJICogIAlzdGF0aWMgaW50W10gZV9wcmVjID0gbmV3IGludFt0b2tlbk5hbWVzLmxlbmd0aF07CisJICogIAlzdGF0aWMgeworICAgCSAqICAJCWVfcHJlY1s3NV0gPSAxOworCSAqICAJfQorCSAqICBUcmFjayBhbmQgd2UgcHVzaCBpbnRvIHBhcnNlciBsYXRlcjsgdGhpcyBpcyBjb21wdXRlZAorCSAqICBlYXJseSB3aGVuIHdlIGxvb2sgZm9yIHByZWMgcnVsZXMuCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBwcmVjUnVsZUluaXRDb2RlQmxvY2tzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICAvKiogQXQgbGVhc3Qgb25lIHJ1bGUgaGFzIG1lbW9pemU9dHJ1ZSAqLworICAgIHB1YmxpYyBib29sZWFuIGF0TGVhc3RPbmVSdWxlTWVtb2l6ZXM7CisKKyAgICAvKiogQXQgbGVhc3Qgb25lIGJhY2t0cmFjaz10cnVlIGluIHJ1bGUgb3IgZGVjaXNpb24gb3IgZ3JhbW1hci4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhdExlYXN0T25lQmFja3RyYWNrT3B0aW9uOworCisJLyoqIFdhcyB0aGlzIGNyZWF0ZWQgZnJvbSBhIENPTUJJTkVEIGdyYW1tYXI/ICovCisJcHVibGljIGJvb2xlYW4gaW1wbGljaXRMZXhlcjsKKworCS8qKiBNYXAgYSBydWxlIHRvIGl0J3MgUnVsZSBvYmplY3QgKi8KKwlwcm90ZWN0ZWQgTGlua2VkSGFzaE1hcDxTdHJpbmcsUnVsZT4gbmFtZVRvUnVsZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZyxSdWxlPigpOworCisJLyoqIElmIHRoaXMgcnVsZSBpcyBhIGRlbGVnYXRlLCBzb21lIHJ1bGVzIG1pZ2h0IGJlIG92ZXJyaWRkZW47IGRvbid0CisJICogIHdhbnQgdG8gZ2VuIGNvZGUgZm9yIHRoZW0uCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IG92ZXJyaWRkZW5SdWxlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworCS8qKiBUaGUgbGlzdCBvZiBhbGwgcnVsZXMgcmVmZXJlbmNlZCBpbiB0aGlzIGdyYW1tYXIsIG5vdCBkZWZpbmVkIGhlcmUsCisJICogIGFuZCBkZWZpbmVkIGluIGEgZGVsZWdhdGUgZ3JhbW1hci4gIE5vdCBhbGwgb2YgdGhlc2Ugd2lsbCBiZSBnZW5lcmF0ZWQKKwkgKiAgaW4gdGhlIHJlY29nbml6ZXIgZm9yIHRoaXMgZmlsZTsgb25seSB0aG9zZSB0aGF0IGFyZSBhZmZlY3RlZCBieSBydWxlCisJICogIGRlZmluaXRpb25zIGluIHRoaXMgZ3JhbW1hci4gIEkgYW0gbm90IHN1cmUgdGhlIEphdmEgdGFyZ2V0IHdpbGwgbmVlZAorCSAqICB0aGlzIGJ1dCBJJ20gbGVhdmluZyBpbiBjYXNlIG90aGVyIHRhcmdldHMgbmVlZCBpdC4KKwkgKiAgc2VlIE5hbWVTcGFjZUNoZWNrZXIubG9va0ZvclJlZmVyZW5jZXNUb1VuZGVmaW5lZFN5bWJvbHMoKQorCSAqLworCXByb3RlY3RlZCBTZXQ8UnVsZT4gZGVsZWdhdGVkUnVsZVJlZmVyZW5jZXMgPSBuZXcgSGFzaFNldCgpOworCisJLyoqIFRoZSBBTlRMUlBhcnNlciB0cmFja3MgbGV4ZXIgcnVsZXMgd2hlbiByZWFkaW5nIGNvbWJpbmVkIGdyYW1tYXJzCisJICogIHNvIHdlIGNhbiBidWlsZCB0aGUgVG9rZW5zIHJ1bGUuCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBsZXhlclJ1bGVOYW1lc0luQ29tYmluZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCS8qKiBUcmFjayB0aGUgc2NvcGVzIGRlZmluZWQgb3V0c2lkZSBvZiBydWxlcyBhbmQgdGhlIHNjb3BlcyBhc3NvY2lhdGVkCisJICogIHdpdGggYWxsIHJ1bGVzIChldmVuIGlmIGVtcHR5KS4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIHNjb3BlcyA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKiogQW4gQVNUIHRoYXQgcmVjb3JkcyBlbnRpcmUgaW5wdXQgZ3JhbW1hciB3aXRoIGFsbCBydWxlcy4gIEEgc2ltcGxlCisJICogIGdyYW1tYXIgd2l0aCBvbmUgcnVsZSwgImdyYW1tYXIgdDsgYSA6IEEgfCBCIDsiLCBsb29rcyBsaWtlOgorCSAqICggZ3JhbW1hciB0ICggcnVsZSBhICggQkxPQ0sgKCBBTFQgQSApICggQUxUIEIgKSApIDxlbmQtb2YtcnVsZT4gKSApCisJICovCisJcHJvdGVjdGVkIEdyYW1tYXJBU1QgZ3JhbW1hclRyZWUgPSBudWxsOworCisJLyoqIEVhY2ggc3VicnVsZS9ydWxlIGlzIGEgZGVjaXNpb24gcG9pbnQgYW5kIHdlIG11c3QgdHJhY2sgdGhlbSBzbyB3ZQorCSAqICBjYW4gZ28gYmFjayBsYXRlciBhbmQgYnVpbGQgREZBIHByZWRpY3RvcnMgZm9yIHRoZW0uICBUaGlzIGluY2x1ZGVzCisJICogIGFsbCB0aGUgcnVsZXMsIHN1YnJ1bGVzLCBvcHRpb25hbCBibG9ja3MsICgpKywgKCkqIGV0Yy4uLgorCSAqLworCXByb3RlY3RlZCBWZWN0b3I8RGVjaXNpb24+IGluZGV4VG9EZWNpc2lvbiA9CisJCW5ldyBWZWN0b3I8RGVjaXNpb24+KElOSVRJQUxfREVDSVNJT05fTElTVF9TSVpFKTsKKworCS8qKiBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgY29kZSBnZW5lcmF0b3Igd2Ugd2lsbCB1c2UgdG8gZ2VuZXJhdGUKKwkgKiAgcmVjb2duaXplcnMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29kZUdlbmVyYXRvciBnZW5lcmF0b3I7CisKKwlwdWJsaWMgTmFtZVNwYWNlQ2hlY2tlciBuYW1lU3BhY2VDaGVja2VyID0gbmV3IE5hbWVTcGFjZUNoZWNrZXIodGhpcyk7CisKKwlwdWJsaWMgTEwxQW5hbHl6ZXIgbGwxQW5hbHl6ZXIgPSBuZXcgTEwxQW5hbHl6ZXIodGhpcyk7CisKKwkvKiogRm9yIG1lcmdlZCBsZXhlci9wYXJzZXJzLCB3ZSBtdXN0IGNvbnN0cnVjdCBhIHNlcGFyYXRlIGxleGVyIHNwZWMuCisJICogIFRoaXMgaXMgdGhlIHRlbXBsYXRlIGZvciBsZXhlcjsgcHV0IHRoZSBsaXRlcmFscyBmaXJzdCB0aGVuIHRoZQorCSAqICByZWd1bGFyIHJ1bGVzLiAgV2UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGEgdG9rZW4gdm9jYWIgaW1wb3J0IGFzCisJICogIEkgbWFrZSB0aGUgbmV3IGdyYW1tYXIgaW1wb3J0IGZyb20gdGhlIG9sZCBhbGwgaW4gbWVtb3J5OyBkb24ndCB3YW50CisJICogIHRvIGZvcmNlIGl0IHRvIHJlYWQgZnJvbSB0aGUgZGlzay4gIExleGVyIGdyYW1tYXIgd2lsbCBoYXZlIHNhbWUKKwkgKiAgbmFtZSBhcyBvcmlnaW5hbCBncmFtbWFyIGJ1dCB3aWxsIGJlIGluIGRpZmZlcmVudCBmaWxlbmFtZS4gIEZvby5nCisJICogIHdpdGggY29tYmluZWQgZ3JhbW1hciB3aWxsIGhhdmUgRm9vUGFyc2VyLmphdmEgZ2VuZXJhdGVkIGFuZAorCSAqICBGb29fXy5nIHdpdGggYWdhaW4gRm9vIGluc2lkZS4gIEl0IHdpbGwgaG93ZXZlciBnZW5lcmF0ZSBGb29MZXhlci5qYXZhCisJICogIGFzIGl0J3MgYSBsZXhlciBncmFtbWFyLiAgQSBiaXQgb2RkLCBidXQgYXV0b2dlbmVyYXRlZC4gIENhbiB0d2VhaworCSAqICBsYXRlciBpZiB3ZSB3YW50LgorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbGV4ZXJHcmFtbWFyVGVtcGxhdGUgPQorCQkJImdyYW1tYXIobmFtZSwgb3B0aW9ucywgaW1wb3J0cywgYWN0aW9uTmFtZXMsIGFjdGlvbnMsIGxpdGVyYWxzLCBydWxlcykgOjo9IDw8XG4iICsKKwkJCSJsZXhlciBncmFtbWFyIDxuYW1lPjtcbiIgKworCQkJIjxpZihvcHRpb25zKT4iICsKKwkJCSJvcHRpb25zIHtcbiIgKworCQkJIiAgPG9wdGlvbnM6e2l0IHwgPGl0Lm5hbWU+PTxpdC52YWx1ZT47PFxcbj59PlxuIiArCisJCQkifTxcXG4+XG4iICsKKwkJCSI8ZW5kaWY+XG4iICsKKwkJCSI8aWYoaW1wb3J0cyk+aW1wb3J0IDxpbXBvcnRzOyBzZXBhcmF0b3I9XCIsIFwiPjs8ZW5kaWY+XG4iICsKKwkJCSI8YWN0aW9uTmFtZXMsYWN0aW9uczp7bixhfEA8bj4gezxhPlxcfVxufT5cbiIgKworCQkJIjxsaXRlcmFsczp7aXQgfCA8aXQucnVsZU5hbWU+IDogPGl0LmxpdGVyYWw+IDtcbn0+XG4iICsKKwkJCSI8cnVsZXM+XG4iICsKKwkJCSI+PlxuIjsKKwlwcm90ZWN0ZWQgU1QgbGV4ZXJHcmFtbWFyU1Q7CisKKwkvKiogV2hhdCBmaWxlIG5hbWUgaG9sZHMgdGhpcyBncmFtbWFyPyAqLworCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWU7CisKKwkvKiogSG93IGxvbmcgaW4gbXMgZGlkIGl0IHRha2UgdG8gYnVpbGQgREZBcyBmb3IgdGhpcyBncmFtbWFyPworCSAqICBJZiB0aGlzIGdyYW1tYXIgaXMgYSBjb21iaW5lZCBncmFtbWFyLCBpdCBvbmx5IHJlY29yZHMgdGltZSBmb3IKKwkgKiAgdGhlIHBhcnNlciBncmFtbWFyIGNvbXBvbmVudC4gIFRoaXMgb25seSByZWNvcmRzIHRoZSB0aW1lIHRvCisJICogIGRvIHRoZSBMTCgqKSB3b3JrOyBORkEtPkRGQSBjb252ZXJzaW9uLgorCSAqLworCXB1YmxpYyBsb25nIERGQUNyZWF0aW9uV2FsbENsb2NrVGltZUluTVM7CisKKwlwdWJsaWMgaW50IG51bWJlck9mU2VtYW50aWNQcmVkaWNhdGVzID0gMDsKKwlwdWJsaWMgaW50IG51bWJlck9mTWFudWFsTG9va2FoZWFkT3B0aW9ucyA9IDA7CisJcHVibGljIFNldDxJbnRlZ2VyPiBzZXRPZk5vbmRldGVybWluaXN0aWNEZWNpc2lvbk51bWJlcnMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworCXB1YmxpYyBTZXQ8SW50ZWdlcj4gc2V0T2ZOb25kZXRlcm1pbmlzdGljRGVjaXNpb25OdW1iZXJzUmVzb2x2ZWRXaXRoUHJlZGljYXRlcyA9CisJCW5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisKKwkvKiogVHJhY2sgZGVjaXNpb25zIHdpdGggc3luIHByZWRzIHNwZWNpZmllZCBmb3IgcmVwb3J0aW5nLgorCSAqICBUaGlzIGlzIHRoZSBhIHNldCBvZiBCTE9DSyB0eXBlIEFTVCBub2Rlcy4KKwkgKi8KKwlwdWJsaWMgU2V0PEdyYW1tYXJBU1Q+IGJsb2Nrc1dpdGhTeW5QcmVkcyA9IG5ldyBIYXNoU2V0KCk7CisKKwkvKiogVHJhY2sgZGVjaXNpb25zIHRoYXQgYWN0dWFsbHkgdXNlIHRoZSBzeW4gcHJlZHMgaW4gdGhlIERGQS4KKwkgKiAgQ29tcHV0ZWQgZHVyaW5nIE5GQSB0byBERkEgY29udmVyc2lvbi4KKwkgKi8KKwlwdWJsaWMgU2V0PERGQT4gZGVjaXNpb25zV2hvc2VERkFzVXNlc1N5blByZWRzID0gbmV3IEhhc2hTZXQ8REZBPigpOworCisJLyoqIFRyYWNrIG5hbWVzIG9mIHByZWRzIHNvIHdlIGNhbiBhdm9pZCBnZW5lcmF0aW5nIHByZWRzIHRoYXQgYXJlbid0IHVzZWQKKwkgKiAgQ29tcHV0ZWQgZHVyaW5nIE5GQSB0byBERkEgY29udmVyc2lvbi4gIEp1c3Qgd2FsayBhY2NlcHQgc3RhdGVzCisJICogIGFuZCBsb29rIGZvciBzeW5wcmVkcyBiZWNhdXNlIHRoYXQgaXMgdGhlIG9ubHkgc3RhdGUgdGFyZ2V0IHdob3NlCisJICogIGluY2lkZW50IGVkZ2VzIGNhbiBoYXZlIHN5bnByZWRzLiAgU2FtZSBpcyB0cnkgZm9yCisJICogIGRlY2lzaW9uc1dob3NlREZBc1VzZXNTeW5QcmVkcy4KKwkgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gc3luUHJlZE5hbWVzVXNlZEluREZBID0gbmV3IEhhc2hTZXQoKTsKKworCS8qKiBUcmFjayBkZWNpc2lvbnMgd2l0aCBzeW4gcHJlZHMgc3BlY2lmaWVkIGZvciByZXBvcnRpbmcuCisJICogIFRoaXMgaXMgdGhlIGEgc2V0IG9mIEJMT0NLIHR5cGUgQVNUIG5vZGVzLgorCSAqLworCXB1YmxpYyBTZXQ8R3JhbW1hckFTVD4gYmxvY2tzV2l0aFNlbVByZWRzID0gbmV3IEhhc2hTZXQoKTsKKworCS8qKiBUcmFjayBkZWNpc2lvbnMgdGhhdCBhY3R1YWxseSB1c2UgdGhlIHN5biBwcmVkcyBpbiB0aGUgREZBLiAqLworCXB1YmxpYyBTZXQ8REZBPiBkZWNpc2lvbnNXaG9zZURGQXNVc2VzU2VtUHJlZHMgPSBuZXcgSGFzaFNldCgpOworCisJcHJvdGVjdGVkIGJvb2xlYW4gYWxsRGVjaXNpb25ERkFDcmVhdGVkID0gZmFsc2U7CisKKwkvKiogV2UgbmVlZCBhIHdheSB0byBkZXRlY3Qgd2hlbiBhIGxleGVyIGdyYW1tYXIgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisJICogIGFub3RoZXIgZ3JhbW1hciBvciB3ZSBhcmUganVzdCBzZW5kaW5nIGluIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhCisJICogIGdyYW1tYXIuICBXZSBkb24ndCB3YW50IHRvIGdlbmVyYXRlIGEgLnRva2VucyBmaWxlLCBmb3IgZXhhbXBsZSwKKwkgKiAgaW4gc3VjaCBjYXNlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsdEZyb21TdHJpbmcgPSBmYWxzZTsKKworCS8qKiBGYWN0b3JlZCBvdXQgdGhlIHNhbml0eSBjaGVja2luZyBjb2RlOyBkZWxlZ2F0ZSB0byBpdC4gKi8KKwlHcmFtbWFyU2FuaXR5IHNhbml0eSA9IG5ldyBHcmFtbWFyU2FuaXR5KHRoaXMpOworCisJLyoqIFVzZWZ1bCBmb3IgYXNraW5nIHF1ZXN0aW9ucyBhYm91dCB0YXJnZXQgZHVyaW5nIGFuYWx5c2lzICovCisJVGFyZ2V0IHRhcmdldDsKKworCS8qKiBDcmVhdGUgYSBncmFtbWFyIGZyb20gZmlsZSBuYW1lLiAgKi8KKwlwdWJsaWMgR3JhbW1hcihUb29sIHRvb2wsIFN0cmluZyBmaWxlTmFtZSwgQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUpIHsKKwkJdGhpcy5jb21wb3NpdGUgPSBjb21wb3NpdGU7CisJCXNldFRvb2wodG9vbCk7CisJCXNldEZpbGVOYW1lKGZpbGVOYW1lKTsKKwkJLy8gZW5zdXJlIHdlIGhhdmUgdGhlIGNvbXBvc2l0ZSBzZXQgdG8gc29tZXRoaW5nCisJCWlmICggY29tcG9zaXRlLmRlbGVnYXRlR3JhbW1hclRyZWVSb290PT1udWxsICkgeworCQkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KHRoaXMpOworCQl9CisJCVNUR3JvdXAgbGV4ZXJHcmFtbWFyU1RHID0gbmV3IFNUR3JvdXBTdHJpbmcobGV4ZXJHcmFtbWFyVGVtcGxhdGUpOworCQlsZXhlckdyYW1tYXJTVCA9IGxleGVyR3JhbW1hclNURy5nZXRJbnN0YW5jZU9mKCJncmFtbWFyIik7CisJCXRhcmdldCA9IENvZGVHZW5lcmF0b3IubG9hZExhbmd1YWdlVGFyZ2V0KChTdHJpbmcpIGdldE9wdGlvbigibGFuZ3VhZ2UiKSk7CisJfQorCisJLyoqIFVzZWZ1bCBmb3Igd2hlbiB5b3UgYXJlIHN1cmUgdGhhdCB5b3UgYXJlIG5vdCBwYXJ0IG9mIGEgY29tcG9zaXRlCisJICogIGFscmVhZHkuICBVc2VkIGluIEludGVycC9SYW5kb21QaHJhc2UgYW5kIHRlc3RpbmcuCisJICovCisJcHVibGljIEdyYW1tYXIoKSB7IHRoaXMoKFRvb2wpbnVsbCk7IH0KKworCXB1YmxpYyBHcmFtbWFyKFRvb2wgdG9vbCkgeworCQlzZXRUb29sKHRvb2wpOworCQlidWlsdEZyb21TdHJpbmcgPSB0cnVlOworCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcih0aGlzKTsKKwkJU1RHcm91cCBsZXhlckdyYW1tYXJTVEcgPSBuZXcgU1RHcm91cFN0cmluZyhsZXhlckdyYW1tYXJUZW1wbGF0ZSk7CisJCWxleGVyR3JhbW1hclNUID0gbGV4ZXJHcmFtbWFyU1RHLmdldEluc3RhbmNlT2YoImdyYW1tYXIiKTsKKwkJdGFyZ2V0ID0gQ29kZUdlbmVyYXRvci5sb2FkTGFuZ3VhZ2VUYXJnZXQoKFN0cmluZylnZXRPcHRpb24oImxhbmd1YWdlIikpOworCX0KKworCS8qKiBVc2VkIGZvciB0ZXN0aW5nOyBvbmx5IHVzZWZ1bCBvbiBub25jb21wb3NpdGUgZ3JhbW1hcnMuKi8KKwlwdWJsaWMgR3JhbW1hcihTdHJpbmcgZ3JhbW1hclN0cmluZykKKwkJCXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorCXsKKwkJdGhpcyhudWxsLCBncmFtbWFyU3RyaW5nKTsKKwl9CisKKwkvKiogVXNlZCBmb3IgdGVzdGluZyBhbmQgSW50ZXJwL1JhbmRvbVBocmFzZS4gIE9ubHkgdXNlZnVsIG9uCisJICogIG5vbmNvbXBvc2l0ZSBncmFtbWFycy4KKwkgKi8KKwlwdWJsaWMgR3JhbW1hcihUb29sIHRvb2wsIFN0cmluZyBncmFtbWFyU3RyaW5nKQorCQl0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KKwl7CisJCXRoaXModG9vbCk7CisJCXNldEZpbGVOYW1lKCI8c3RyaW5nPiIpOworCQlTdHJpbmdSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoZ3JhbW1hclN0cmluZyk7CisJCXBhcnNlQW5kQnVpbGRBU1Qocik7CisJCWNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisJCS8vY29tcG9zaXRlLnRyYW5zbGF0ZUxlZnRSZWN1cnNpdmVSdWxlcygpOworCQlhZGRSdWxlc0ZvclN5bnRhY3RpY1ByZWRpY2F0ZXMoKTsKKwkJY29tcG9zaXRlLmRlZmluZUdyYW1tYXJTeW1ib2xzKCk7CisJCS8vY29tcG9zaXRlLmNyZWF0ZU5GQXMoKTsKKwkJY2hlY2tOYW1lU3BhY2VBbmRBY3Rpb25zKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7CisJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworCQlyZXR1cm4gZmlsZU5hbWU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlpZiAoIG5hbWU9PW51bGwgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJLy8gZG9uJ3QgZXJyb3IgY2hlY2sgYXV0b2dlbmVyYXRlZCBmaWxlcyAodGhvc2Ugd2l0aCAnX18nIGluIHRoZW0pCisJCVN0cmluZyBzYW5lRmlsZSA9IGZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsKKwkJaW50IGxhc3RTbGFzaCA9IHNhbmVGaWxlLmxhc3RJbmRleE9mKCcvJyk7CisJCVN0cmluZyBvbmx5RmlsZU5hbWUgPSBzYW5lRmlsZS5zdWJzdHJpbmcobGFzdFNsYXNoKzEsIGZpbGVOYW1lLmxlbmd0aCgpKTsKKwkJaWYgKCAhYnVpbHRGcm9tU3RyaW5nICkgeworCQkJaW50IGxhc3REb3QgPSBvbmx5RmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKwkJCVN0cmluZyBvbmx5RmlsZU5hbWVOb1N1ZmZpeCA9IG51bGw7CisJCQlpZiAoIGxhc3REb3QgPCAwICkgeworCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0ZJTEVOQU1FX0VYVEVOU0lPTl9FUlJPUiwgZmlsZU5hbWUpOworCQkJCW9ubHlGaWxlTmFtZU5vU3VmZml4ID0gb25seUZpbGVOYW1lK0dSQU1NQVJfRklMRV9FWFRFTlNJT047CisJCQl9CisJCQllbHNlIHsKKwkJCQlvbmx5RmlsZU5hbWVOb1N1ZmZpeCA9IG9ubHlGaWxlTmFtZS5zdWJzdHJpbmcoMCxsYXN0RG90KTsKKwkJCX0KKwkJCWlmICggIW5hbWUuZXF1YWxzKG9ubHlGaWxlTmFtZU5vU3VmZml4KSApIHsKKwkJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19GSUxFX0FORF9HUkFNTUFSX05BTUVfRElGRkVSLAorCQkJCQkJCQkgICBuYW1lLAorCQkJCQkJCQkgICBmaWxlTmFtZSk7CisJCQl9CisJCX0KKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHcmFtbWFyQ29udGVudChTdHJpbmcgZ3JhbW1hclN0cmluZykgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nUmVhZGVyIHIgPSBuZXcgU3RyaW5nUmVhZGVyKGdyYW1tYXJTdHJpbmcpOworCQlwYXJzZUFuZEJ1aWxkQVNUKHIpOworCQljb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCQljb21wb3NpdGUuZGVmaW5lR3JhbW1hclN5bWJvbHMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBwYXJzZUFuZEJ1aWxkQVNUKCkKKwkJdGhyb3dzIElPRXhjZXB0aW9uCisJeworCQlGaWxlUmVhZGVyIGZyID0gbnVsbDsKKwkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOworCQl0cnkgeworCQkJZnIgPSBuZXcgRmlsZVJlYWRlcihmaWxlTmFtZSk7CisJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7CisJCQlwYXJzZUFuZEJ1aWxkQVNUKGJyKTsKKwkJCWJyLmNsb3NlKCk7CisJCQliciA9IG51bGw7CisJCX0KKwkJZmluYWxseSB7CisJCQlpZiAoIGJyIT1udWxsICkgeworCQkJCWJyLmNsb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBwYXJzZUFuZEJ1aWxkQVNUKFJlYWRlciByKSB7CisJCS8vIEJVSUxEIEFTVCBGUk9NIEdSQU1NQVIKKwkJQU5UTFJMZXhlciBsZXhlcjsKKwkJdHJ5IHsKKwkJCWxleGVyID0gbmV3IEFOVExSTGV4ZXIobmV3IEFOVExSUmVhZGVyU3RyZWFtKHIpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJRXJyb3JNYW5hZ2VyLmludGVybmFsRXJyb3IoInVuZXhwZWN0ZWQgc3RyZWFtIGVycm9yIGZyb20gcGFyc2luZyAiK2ZpbGVOYW1lLCBlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxleGVyLnNldEZpbGVOYW1lKHRoaXMuZ2V0RmlsZU5hbWUoKSk7CisJCXRva2VuQnVmZmVyID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleGVyKTsKKwkJQU5UTFJQYXJzZXIgcGFyc2VyID0gQU5UTFJQYXJzZXIuY3JlYXRlUGFyc2VyKHRva2VuQnVmZmVyKTsKKwkJcGFyc2VyLnNldEZpbGVOYW1lKHRoaXMuZ2V0RmlsZU5hbWUoKSk7CisJCUFOVExSUGFyc2VyLmdyYW1tYXJfX3JldHVybiByZXN1bHQgPSBudWxsOworCQl0cnkgeworCQkJcmVzdWx0ID0gcGFyc2VyLmdyYW1tYXJfKHRoaXMpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworCQkJRXJyb3JNYW5hZ2VyLmludGVybmFsRXJyb3IoInVuZXhwZWN0ZWQgcGFyc2VyIHJlY29nbml0aW9uIGVycm9yIGZyb20gIitmaWxlTmFtZSwgcmUpOworCQl9CisKKyAgICAgICAgZGVhbFdpdGhUcmVlRmlsdGVyTW9kZSgpOyAvLyB0cmVlIGdyYW1tYXIgYW5kIGZpbHRlcj10cnVlPworCisgICAgICAgIGlmICggbGV4ZXIuaGFzQVNUT3BlcmF0b3IgJiYgIWJ1aWxkQVNUKCkgKSB7CisJCQlPYmplY3QgdmFsdWUgPSBnZXRPcHRpb24oIm91dHB1dCIpOworCQkJaWYgKCB2YWx1ZSA9PSBudWxsICkgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyV2FybmluZyhFcnJvck1hbmFnZXIuTVNHX1JFV1JJVEVfT1JfT1BfV0lUSF9OT19PVVRQVVRfT1BUSU9OLAorCQkJCQkJCQkJCSAgICB0aGlzLCBudWxsKTsKKwkJCQlzZXRPcHRpb24oIm91dHB1dCIsICJBU1QiLCBudWxsKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19BU1RfT1BfV0lUSF9OT05fQVNUX09VVFBVVF9PUFRJT04sCisJCQkJCQkJCQkJICB0aGlzLCBudWxsLCB2YWx1ZSk7CisJCQl9CisJCX0KKworCQlzZXRHcmFtbWFyVHJlZSgoR3JhbW1hckFTVClyZXN1bHQuZ2V0VHJlZSgpKTsKKworCQkvL2lmICggZ3JhbW1hclRyZWUhPW51bGwgKSBTeXN0ZW0ub3V0LnByaW50bG4oImdyYW1tYXIgdHJlZTogIitncmFtbWFyVHJlZS50b1N0cmluZ1RyZWUoKSk7CisKKwkJZ3JhbW1hclRyZWUuc2V0VW5rbm93blRva2VuQm91bmRhcmllcygpOworCisJCXNldEZpbGVOYW1lKGxleGVyLmdldEZpbGVOYW1lKCkpOyAvLyB0aGUgbGV4ZXIgI3NyYyBtaWdodCBjaGFuZ2UgbmFtZQorCQlpZiAoIGdyYW1tYXJUcmVlPT1udWxsIHx8IGdyYW1tYXJUcmVlLmZpbmRGaXJzdFR5cGUoQU5UTFJQYXJzZXIuUlVMRSk9PW51bGwgKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19OT19SVUxFUywgZ2V0RmlsZU5hbWUoKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkZWFsV2l0aFRyZWVGaWx0ZXJNb2RlKCkgeworICAgICAgICBPYmplY3QgZmlsdGVyTW9kZSA9IChTdHJpbmcpZ2V0T3B0aW9uKCJmaWx0ZXIiKTsKKyAgICAgICAgaWYgKCB0eXBlPT1UUkVFX1BBUlNFUiAmJiBmaWx0ZXJNb2RlIT1udWxsICYmIGZpbHRlck1vZGUudG9TdHJpbmcoKS5lcXVhbHMoInRydWUiKSApIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjb25mbGljdGluZyBvcHRpb25zCisgICAgICAgICAgICAvLyBmaWx0ZXIgPT4gYmFja3RyYWNrPXRydWUKKyAgICAgICAgICAgIC8vIGZpbHRlciYmb3V0cHV0PUFTVCA9PiByZXdyaXRlPXRydWUKKyAgICAgICAgICAgIC8vIGZpbHRlciYmb3V0cHV0IT1BU1QgPT4gZXJyb3IKKyAgICAgICAgICAgIC8vIGFueSBkZXZpYXRpb24gZnJvbSB2YWxpZCBvcHRpb24gc2V0IGlzIGFuIGVycm9yCisgICAgICAgICAgICBPYmplY3QgYmFja3RyYWNrID0gKFN0cmluZylnZXRPcHRpb24oImJhY2t0cmFjayIpOworICAgICAgICAgICAgT2JqZWN0IG91dHB1dCA9IGdldE9wdGlvbigib3V0cHV0Iik7CisgICAgICAgICAgICBPYmplY3QgcmV3cml0ZSA9IGdldE9wdGlvbigicmV3cml0ZSIpOworICAgICAgICAgICAgaWYgKCBiYWNrdHJhY2shPW51bGwgJiYgIWJhY2t0cmFjay50b1N0cmluZygpLmVxdWFscygidHJ1ZSIpICkgeworICAgICAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NPTkZMSUNUSU5HX09QVElPTl9JTl9UUkVFX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0cmFjayIsIGJhY2t0cmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG91dHB1dCE9bnVsbCAmJiAhb3V0cHV0LnRvU3RyaW5nKCkuZXF1YWxzKCJBU1QiKSApIHsKKyAgICAgICAgICAgICAgICBFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DT05GTElDVElOR19PUFRJT05fSU5fVFJFRV9GSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiLCBvdXRwdXQpOworICAgICAgICAgICAgICAgIHNldE9wdGlvbigib3V0cHV0IiwgIiIsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCByZXdyaXRlIT1udWxsICYmICFyZXdyaXRlLnRvU3RyaW5nKCkuZXF1YWxzKCJ0cnVlIikgKSB7CisgICAgICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ09ORkxJQ1RJTkdfT1BUSU9OX0lOX1RSRUVfRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV3cml0ZSIsIHJld3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2V0IG9wdGlvbnMgcHJvcGVybHkKKyAgICAgICAgICAgIHNldE9wdGlvbigiYmFja3RyYWNrIiwgInRydWUiLCBudWxsKTsKKyAgICAgICAgICAgIGlmICggb3V0cHV0IT1udWxsICYmIG91dHB1dC50b1N0cmluZygpLmVxdWFscygiQVNUIikgKSB7CisgICAgICAgICAgICAgICAgc2V0T3B0aW9uKCJyZXdyaXRlIiwgInRydWUiLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEBzeW5wcmVkZ2F0ZSBzZXQgdG8gc3RhdGUuYmFja3RyYWNraW5nPT0xIGJ5IGNvZGUgZ2VuIHdoZW4gZmlsdGVyPXRydWUKKyAgICAgICAgICAgIC8vIHN1cGVyQ2xhc3Mgc2V0IGluIHRlbXBsYXRlIHRhcmdldDo6dHJlZVBhcnNlcgorICAgICAgICB9CisgICAgfQorCisJcHVibGljIHZvaWQgdHJhbnNsYXRlTGVmdFJlY3Vyc2l2ZVJ1bGUoR3JhbW1hckFTVCBydWxlQVNUKSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKHJ1bGVBU1QudG9TdHJpbmdUcmVlKCkpOworCQlDb21tb25UcmVlTm9kZVN0cmVhbSBpbnB1dCA9IG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbShydWxlQVNUKTsKKwkJTGVmdFJlY3Vyc2l2ZVJ1bGVBbmFseXplciBsZWZ0UmVjdXJzaXZlUnVsZVdhbGtlciA9CisJCQluZXcgTGVmdFJlY3Vyc2l2ZVJ1bGVBbmFseXplcihpbnB1dCwgdGhpcywgcnVsZUFTVC5lbmNsb3NpbmdSdWxlTmFtZSk7CisJCWJvb2xlYW4gaXNMZWZ0UmVjID0gZmFsc2U7CisJCXRyeSB7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVEVTVElORyAiK3J1bGVBU1QuZW5jbG9zaW5nUnVsZU5hbWUpOworCQkJaXNMZWZ0UmVjID0gbGVmdFJlY3Vyc2l2ZVJ1bGVXYWxrZXIucmVjX3J1bGUodGhpcyk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19CQURfQVNUX1NUUlVDVFVSRSwgcmUpOworCQl9CisJCWlmICggIWlzTGVmdFJlYyApIHJldHVybjsKKwkJTGlzdDxTdHJpbmc+IHJ1bGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCXJ1bGVzLmFkZCggbGVmdFJlY3Vyc2l2ZVJ1bGVXYWxrZXIuZ2V0QXJ0aWZpY2lhbFByZWNTdGFydFJ1bGUoKSApIDsKKwkJcnVsZXMuYWRkKCBsZWZ0UmVjdXJzaXZlUnVsZVdhbGtlci5nZXRBcnRpZmljaWFsT3BQcmVjUnVsZSgpICk7CisJCXJ1bGVzLmFkZCggbGVmdFJlY3Vyc2l2ZVJ1bGVXYWxrZXIuZ2V0QXJ0aWZpY2lhbFByaW1hcnlSdWxlKCkgKTsKKwkJZm9yIChTdHJpbmcgciA6IHJ1bGVzKSB7CisJCQlHcmFtbWFyQVNUIHQgPSBwYXJzZUFydGlmaWNpYWxSdWxlKHIpOworCQkJYWRkUnVsZShncmFtbWFyVHJlZSwgdCk7CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbih0LnRvU3RyaW5nVHJlZSgpKTsKKwkJfQorCisJCS8vcHJlY1J1bGVJbml0Q29kZUJsb2Nrcy5hZGQoIHByZWNSdWxlV2Fsa2VyLmdldE9wUHJlY0phdmFDb2RlKCkgKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWZpbmVHcmFtbWFyU3ltYm9scygpIHsKKwkJaWYgKCBUb29sLmludGVybmFsT3B0aW9uX1ByaW50R3JhbW1hclRyZWUgKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ3JhbW1hclRyZWUudG9TdHJpbmdMaXN0KCkpOworCQl9CisKKwkJLy8gREVGSU5FIFJVTEVTCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCIjIyMgZGVmaW5lICIrbmFtZSsiIHJ1bGVzIik7CisJCURlZmluZUdyYW1tYXJJdGVtc1dhbGtlciBkZWZpbmVJdGVtc1dhbGtlciA9IG5ldyBEZWZpbmVHcmFtbWFySXRlbXNXYWxrZXIobmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKGdldEdyYW1tYXJUcmVlKCkpKTsKKwkJdHJ5IHsKKwkJCWRlZmluZUl0ZW1zV2Fsa2VyLmdyYW1tYXJfKHRoaXMpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQkFEX0FTVF9TVFJVQ1RVUkUsCisJCQkJCQkJICAgcmUpOworCQl9CisJfQorCisJLyoqIEFOQUxZWkUgQUNUSU9OUywgTE9PS0lORyBGT1IgTEFCRUwgQU5EIEFUVFIgUkVGUywgc2FuaXR5IGNoZWNrICovCisJcHVibGljIHZvaWQgY2hlY2tOYW1lU3BhY2VBbmRBY3Rpb25zKCkgeworCQlleGFtaW5lQWxsRXhlY3V0YWJsZUFjdGlvbnMoKTsKKwkJY2hlY2tBbGxSdWxlc0ZvclVzZWxlc3NMYWJlbHMoKTsKKworCQluYW1lU3BhY2VDaGVja2VyLmNoZWNrQ29uZmxpY3RzKCk7CisJfQorCisJLyoqIE1hbnkgaW1wb3J0cyBhcmUgaWxsZWdhbCBzdWNoIGFzIGxleGVyIGludG8gYSB0cmVlIGdyYW1tYXIgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZEltcG9ydChHcmFtbWFyIGRlbGVnYXRlKSB7CisJCUxpc3Q8SW50ZWdlcj4gdmFsaWREZWxlZ2F0b3JzID0gdmFsaWREZWxlZ2F0aW9ucy5nZXQoZGVsZWdhdGUudHlwZSk7CisJCXJldHVybiB2YWxpZERlbGVnYXRvcnMhPW51bGwgJiYgdmFsaWREZWxlZ2F0b3JzLmNvbnRhaW5zKHRoaXMudHlwZSk7CisJfQorCisJLyoqIElmIHRoZSBncmFtbWFyIGlzIGEgY29tYmluZWQgZ3JhbW1hciwgcmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSBpbXBsaWNpdAorCSAqICBsZXhlciBncmFtbWFyLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGV4ZXJHcmFtbWFyKCkgeworCQlpZiAoIGxleGVyR3JhbW1hclNULmdldEF0dHJpYnV0ZSgibGl0ZXJhbHMiKT09bnVsbCAmJgorCQkJIGxleGVyR3JhbW1hclNULmdldEF0dHJpYnV0ZSgicnVsZXMiKT09bnVsbCApCisJCXsKKwkJCS8vIGlmIG5vIHJ1bGVzLCByZXR1cm4gbm90aGluZworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJbGV4ZXJHcmFtbWFyU1QuYWRkKCJuYW1lIiwgbmFtZSk7CisJCS8vIGlmIHRoZXJlIGFyZSBhbnkgYWN0aW9ucyBzZXQgZm9yIGxleGVyLCBwYXNzIHRoZW0gaW4KKwkJaWYgKCBnZXRBY3Rpb25zKCkuZ2V0KCJsZXhlciIpIT1udWxsICkgeworCQkJbGV4ZXJHcmFtbWFyU1QuYWRkKCJhY3Rpb25OYW1lcyIsCisJCQkJCQkJCQkJZ2V0QWN0aW9ucygpLmdldCgibGV4ZXIiKS5rZXlTZXQoKSk7CisJCQlsZXhlckdyYW1tYXJTVC5hZGQoImFjdGlvbnMiLAorCQkJCQkJCQkJCWdldEFjdGlvbnMoKS5nZXQoImxleGVyIikudmFsdWVzKCkpOworCQl9CisJCS8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgZ3JhbW1hciBoYXMgdGhlIHNhbWUgb3B0aW9ucworCQlpZiAoIG9wdGlvbnMhPW51bGwgKSB7CisJCQlJdGVyYXRvciBvcHRpb25OYW1lcyA9IG9wdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChvcHRpb25OYW1lcy5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcgb3B0aW9uTmFtZSA9IChTdHJpbmcpIG9wdGlvbk5hbWVzLm5leHQoKTsKKwkJCQlpZiAoICFkb05vdENvcHlPcHRpb25zVG9MZXhlci5jb250YWlucyhvcHRpb25OYW1lKSApIHsKKwkJCQkJT2JqZWN0IHZhbHVlID0gb3B0aW9ucy5nZXQob3B0aW9uTmFtZSk7CisJCQkJCWxleGVyR3JhbW1hclNULmFkZEFnZ3IoIm9wdGlvbnMue25hbWUsdmFsdWV9Iiwgb3B0aW9uTmFtZSwgdmFsdWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbGV4ZXJHcmFtbWFyU1QucmVuZGVyKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRJbXBsaWNpdGx5R2VuZXJhdGVkTGV4ZXJGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIG5hbWUrCisJCQkgICBJR05PUkVfU1RSSU5HX0lOX0dSQU1NQVJfRklMRV9OQU1FICsKKwkJCSAgIExFWEVSX0dSQU1NQVJfRklMRV9FWFRFTlNJT047CisJfQorCisJLyoqIEdldCB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHJlY29nbml6ZXI7IG1heSBvciBtYXkgbm90IGJlIHNhbWUKKwkgKiAgYXMgZ3JhbW1hciBuYW1lLgorCSAqICBSZWNvZ25pemVyIGlzIFRQYXJzZXIgYW5kIFRMZXhlciBmcm9tIFQgaWYgY29tYmluZWQsIGVsc2UKKwkgKiAganVzdCB1c2UgVCByZWdhcmRsZXNzIG9mIGdyYW1tYXIgdHlwZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlY29nbml6ZXJOYW1lKCkgeworCQlTdHJpbmcgc3VmZml4ID0gIiI7CisJCUxpc3Q8R3JhbW1hcj4gZ3JhbW1hcnNGcm9tUm9vdFRvTWUgPSBjb21wb3NpdGUuZ2V0RGVsZWdhdG9ycyh0aGlzKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdyYW1tYXJzRnJvbVJvb3RUb01lPSIrZ3JhbW1hcnNGcm9tUm9vdFRvTWUpOworCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IG5hbWU7CisJCWlmICggZ3JhbW1hcnNGcm9tUm9vdFRvTWUhPW51bGwgKSB7CisJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJZm9yIChHcmFtbWFyIGcgOiBncmFtbWFyc0Zyb21Sb290VG9NZSkgeworCQkJCWJ1Zi5hcHBlbmQoZy5uYW1lKTsKKwkJCQlidWYuYXBwZW5kKCdfJyk7CisJCQl9CisJCQlidWYuYXBwZW5kKG5hbWUpOworCQkJcXVhbGlmaWVkTmFtZSA9IGJ1Zi50b1N0cmluZygpOworCQl9CisJCWlmICggdHlwZT09R3JhbW1hci5DT01CSU5FRCB8fAorCQkJICh0eXBlPT1HcmFtbWFyLkxFWEVSICYmIGltcGxpY2l0TGV4ZXIpICkKKwkJeworCQkJc3VmZml4ID0gR3JhbW1hci5ncmFtbWFyVHlwZVRvRmlsZU5hbWVTdWZmaXhbdHlwZV07CisJCX0KKwkJcmV0dXJuIHF1YWxpZmllZE5hbWUrc3VmZml4OworCX0KKworCS8qKiBQYXJzZSBhIHJ1bGUgd2UgYWRkIGFydGlmaWNpYWxseSB0aGF0IGlzIGEgbGlzdCBvZiB0aGUgb3RoZXIgbGV4ZXIKKwkgKiAgcnVsZXMgbGlrZSB0aGlzOiAiVG9rZW5zIDogSUQgfCBJTlQgfCBTRU1JIDsiICBuZXh0VG9rZW4oKSB3aWxsIGludm9rZQorCSAqICB0aGlzIHRvIHNldCB0aGUgY3VycmVudCB0b2tlbi4gIEFkZCBjaGFyIGxpdGVyYWxzIGJlZm9yZQorCSAqICB0aGUgcnVsZSByZWZlcmVuY2VzLgorCSAqCisJICogIElmIGluIGZpbHRlciBtb2RlLCB3ZSB3YW50IGV2ZXJ5IGFsdCB0byBiYWNrdHJhY2sgYW5kIHdlIG5lZWQgdG8KKwkgKiAgZG8gaz0xIHRvIGZvcmNlIHRoZSAiZmlyc3QgdG9rZW4gZGVmIHdpbnMiIHJ1bGUuICBPdGhlcndpc2UsIHRoZQorCSAqICBsb25nZXN0LW1hdGNoIHJ1bGUgY29tZXMgaW50byBwbGF5IHdpdGggTEwoKikuCisJICoKKwkgKiAgVGhlIEFOVExSUGFyc2VyIGFudGxyLmcgZmlsZSBub3cgaW52b2tlcyB0aGlzIHdoZW4gcGFyc2luZyBhIGxleGVyCisJICogIGdyYW1tYXIsIHdoaWNoIEkgdGhpbmsgaXMgcHJvcGVyIGV2ZW4gdGhvdWdoIGl0IHBlZWtzIGF0IHRoZSBpbmZvCisJICogIHRoYXQgbGF0ZXIgcGhhc2VzIHdpbGwgKHJlKWNvbXB1dGUuICBJdCBnZXRzIGEgbGlzdCBvZiBsZXhlciBydWxlcworCSAqICBhbmQgYnVpbGRzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcnVsZTsgdGhlbiBpdCBjcmVhdGVzIGEgcGFyc2VyCisJICogIGFuZCBhZGRzIHRoZSByZXN1bHRpbmcgdHJlZSB0byB0aGUgZ3JhbW1hcidzIHRyZWUuCisJICovCisJcHVibGljIEdyYW1tYXJBU1QgYWRkQXJ0aWZpY2lhbE1hdGNoVG9rZW5zUnVsZShHcmFtbWFyQVNUIGdyYW1tYXJBU1QsCisJCQkJCQkJCQkJCQkgICBMaXN0PFN0cmluZz4gcnVsZU5hbWVzLAorCQkJCQkJCQkJCQkJICAgTGlzdDxTdHJpbmc+IGRlbGVnYXRlTmFtZXMsCisJCQkJCQkJCQkJCQkgICBib29sZWFuIGZpbHRlck1vZGUpIHsKKwkJU1QgbWF0Y2hUb2tlblJ1bGVTVCA9IG51bGw7CisJCWlmICggZmlsdGVyTW9kZSApIHsKKwkJCW1hdGNoVG9rZW5SdWxlU1QgPSBuZXcgU1QoCisJCQkJCUFSVElGSUNJQUxfVE9LRU5TX1JVTEVOQU1FKworCQkJCQkiIG9wdGlvbnMge2s9MTsgYmFja3RyYWNrPXRydWU7fSA6IDxydWxlczsgc2VwYXJhdG9yPVwifFwiPjsiKTsKKwkJfQorCQllbHNlIHsKKwkJCW1hdGNoVG9rZW5SdWxlU1QgPSBuZXcgU1QoCisJCQkJCUFSVElGSUNJQUxfVE9LRU5TX1JVTEVOQU1FKyIgOiA8cnVsZXM7IHNlcGFyYXRvcj1cInxcIj47Iik7CisJCX0KKworCQkvLyBOb3cgYWRkIHRva2VuIHJ1bGUgcmVmZXJlbmNlcworCQlmb3IgKGludCBpID0gMDsgaSA8IHJ1bGVOYW1lcy5zaXplKCk7IGkrKykgeworCQkJU3RyaW5nIHJuYW1lID0gKFN0cmluZykgcnVsZU5hbWVzLmdldChpKTsKKwkJCW1hdGNoVG9rZW5SdWxlU1QuYWRkKCJydWxlcyIsIHJuYW1lKTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGVnYXRlTmFtZXMuc2l6ZSgpOyBpKyspIHsKKwkJCVN0cmluZyBkbmFtZSA9IChTdHJpbmcpIGRlbGVnYXRlTmFtZXMuZ2V0KGkpOworCQkJbWF0Y2hUb2tlblJ1bGVTVC5hZGQoInJ1bGVzIiwgZG5hbWUrIi5Ub2tlbnMiKTsKKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidG9rZW5zIHJ1bGU6ICIrbWF0Y2hUb2tlblJ1bGVTVC50b1N0cmluZygpKTsKKwkJR3JhbW1hckFTVCByID0gcGFyc2VBcnRpZmljaWFsUnVsZShtYXRjaFRva2VuUnVsZVNULnJlbmRlcigpKTsKKwkJYWRkUnVsZShncmFtbWFyQVNULCByKTsKKwkJLy9hZGRSdWxlKChHcmFtbWFyQVNUKXBhcnNlci5nZXRBU1QoKSk7CisJCS8vcmV0dXJuIChHcmFtbWFyQVNUKXBhcnNlci5nZXRBU1QoKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcHVibGljIEdyYW1tYXJBU1QgcGFyc2VBcnRpZmljaWFsUnVsZShTdHJpbmcgcnVsZVRleHQpIHsKKwkJQU5UTFJMZXhlciBsZXhlciA9IG5ldyBBTlRMUkxleGVyKG5ldyBBTlRMUlN0cmluZ1N0cmVhbShydWxlVGV4dCkpOworCQlBTlRMUlBhcnNlciBwYXJzZXIgPSBBTlRMUlBhcnNlci5jcmVhdGVQYXJzZXIobmV3IENvbW1vblRva2VuU3RyZWFtKGxleGVyKSk7CisJCXBhcnNlci5zZXRHcmFtbWFyKHRoaXMpOworCQlwYXJzZXIuc2V0R3JhbW1hclR5cGUodGhpcy50eXBlKTsKKwkJdHJ5IHsKKwkJCUFOVExSUGFyc2VyLnJ1bGVfcmV0dXJuIHJlc3VsdCA9IHBhcnNlci5ydWxlKCk7CisJCQlyZXR1cm4gKEdyYW1tYXJBU1QpcmVzdWx0LmdldFRyZWUoKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0VSUk9SX0NSRUFUSU5HX0FSVElGSUNJQUxfUlVMRSwKKwkJCQkJCQkgICBlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkUnVsZShHcmFtbWFyQVNUIGdyYW1tYXJUcmVlLCBHcmFtbWFyQVNUIHQpIHsKKwkJR3JhbW1hckFTVCBwID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmFtbWFyVHJlZS5nZXRDaGlsZENvdW50KCk7IGkrKyApIHsKKwkJCXAgPSAoR3JhbW1hckFTVClncmFtbWFyVHJlZS5nZXRDaGlsZChpKTsKKwkJCWlmIChwID09IG51bGwgfHwgcC5nZXRUeXBlKCkgPT0gQU5UTFJQYXJzZXIuUlVMRSB8fCBwLmdldFR5cGUoKSA9PSBBTlRMUlBhcnNlci5QUkVDX1JVTEUpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChwICE9IG51bGwpIHsKKwkJCWdyYW1tYXJUcmVlLmFkZENoaWxkKHQpOworCQl9CisJfQorCisJLyoqIGZvciBhbnkgc3ludGFjdGljIHByZWRpY2F0ZXMsIHdlIG5lZWQgdG8gZGVmaW5lIHJ1bGVzIGZvciB0aGVtOyB0aGV5IHdpbGwgZ2V0CisJICogIGRlZmluZWQgYXV0b21hdGljYWxseSBsaWtlIGFueSBvdGhlciBydWxlLiA6KQorCSAqLworCXByb3RlY3RlZCBMaXN0IGdldEFydGlmaWNpYWxSdWxlc0ZvclN5bnRhY3RpY1ByZWRpY2F0ZXMoTGlua2VkSGFzaE1hcDxTdHJpbmcsR3JhbW1hckFTVD4gbmFtZVRvU3lucHJlZEFTVE1hcCkKKwl7CisJCUxpc3Q8R3JhbW1hckFTVD4gcnVsZXMgPSBuZXcgQXJyYXlMaXN0PEdyYW1tYXJBU1Q+KCk7CisJCWlmICggbmFtZVRvU3lucHJlZEFTVE1hcD09bnVsbCApIHsKKwkJCXJldHVybiBydWxlczsKKwkJfQorCQlib29sZWFuIGlzTGV4ZXIgPSBncmFtbWFyVHJlZS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkxFWEVSX0dSQU1NQVI7CisJCWZvciAoU3RyaW5nIHN5bnByZWROYW1lIDogbmFtZVRvU3lucHJlZEFTVE1hcC5rZXlTZXQoKSkgeworCQkJR3JhbW1hckFTVCBmcmFnbWVudEFTVCA9IG5hbWVUb1N5bnByZWRBU1RNYXAuZ2V0KHN5bnByZWROYW1lKTsKKwkJCUdyYW1tYXJBU1QgcnVsZUFTVCA9CisJCQkJQU5UTFJQYXJzZXIuY3JlYXRlU2ltcGxlUnVsZUFTVChzeW5wcmVkTmFtZSwKKwkJCQkJCQkJCQkJCWZyYWdtZW50QVNULAorCQkJCQkJCQkJCQkJaXNMZXhlcik7CisJCQlydWxlcy5hZGQocnVsZUFTVCk7CisJCX0KKwkJcmV0dXJuIHJ1bGVzOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFJ1bGVzRm9yU3ludGFjdGljUHJlZGljYXRlcygpIHsKKwkJLy8gR2V0IHN5biBwcmVkIHJ1bGVzIGFuZCBhZGQgdG8gZXhpc3RpbmcgdHJlZQorCQlMaXN0IHN5bnByZWRSdWxlcyA9CisJCQlnZXRBcnRpZmljaWFsUnVsZXNGb3JTeW50YWN0aWNQcmVkaWNhdGVzKG5hbWVUb1N5bnByZWRBU1RNYXApOworCQlmb3IgKGludCBpID0gMDsgaSA8IHN5bnByZWRSdWxlcy5zaXplKCk7IGkrKykgeworCQkJR3JhbW1hckFTVCByQVNUID0gKEdyYW1tYXJBU1QpIHN5bnByZWRSdWxlcy5nZXQoaSk7CisJCQlncmFtbWFyVHJlZS5hZGRDaGlsZChyQVNUKTsKKwkJfQorCX0KKworCS8qKiBXYWxrIHRoZSBsaXN0IG9mIG9wdGlvbnMsIGFsdGVyaW5nIHRoaXMgR3JhbW1hciBvYmplY3QgYWNjb3JkaW5nCisJICogIHRvIGFueSBJIHJlY29nbml6ZS4KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3B0aW9ucygpIHsKKwkJSXRlcmF0b3Igb3B0aW9uTmFtZXMgPSBvcHRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChvcHRpb25OYW1lcy5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBvcHRpb25OYW1lID0gKFN0cmluZykgb3B0aW9uTmFtZXMubmV4dCgpOworCQkJT2JqZWN0IHZhbHVlID0gb3B0aW9ucy5nZXQob3B0aW9uTmFtZSk7CisJCQlpZiAoIG9wdGlvbk5hbWUuZXF1YWxzKCJ0b2tlblZvY2FiIikgKSB7CisKKwkJCX0KKwkJfQorCX0KKwkgKi8KKworCS8qKiBEZWZpbmUgYWxsIHRoZSBydWxlIGJlZ2luL2VuZCBORkFTdGF0ZXMgdG8gc29sdmUgZm9yd2FyZCByZWZlcmVuY2UKKwkgKiAgaXNzdWVzLiAgQ3JpdGljYWwgZm9yIGNvbXBvc2l0ZSBncmFtbWFycyB0b28uCisJICogIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIG9uIGFsbCByb290L2RlbGVnYXRlcyBtYW51YWxseSBhbmQgdGhlbgorCSAqICBidWlsZE5GQSgpIGlzIGNhbGxlZCBhZnRlcndhcmRzIGJlY2F1c2UgdGhlIE5GQSBjb25zdHJ1Y3Rpb24gbmVlZHMKKwkgKiAgdG8gc2VlIHJ1bGUgc3RhcnQvc3RvcCBzdGF0ZXMgZnJvbSBwb3RlbnRpYWxseSBldmVyeSBncmFtbWFyLiBIYXMKKwkgKiAgdG8gYmUgaGF2ZSB0aGVzZSBjcmVhdGVkIGEgcHJpb3JpLiAgVGVzdGluZyByb3V0aW5lcyB3aWxsIG9mdGVuCisJICogIGp1c3QgY2FsbCBidWlsZE5GQSgpLCB3aGljaCBmb3JjZXMgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIGlmIG5vdAorCSAqICBkb25lIGFscmVhZHkuIFdvcmtzIE9OTFkgZm9yIHNpbmdsZSBub25jb21wb3NpdGUgZ3JhbW1hcnMuCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUnVsZVN0YXJ0QW5kU3RvcE5GQVN0YXRlcygpIHsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiMjIyBjcmVhdGVSdWxlU3RhcnRBbmRTdG9wTkZBU3RhdGVzICIrZ2V0R3JhbW1hclR5cGVTdHJpbmcoKSsiIGdyYW1tYXIgIituYW1lKyIgTkZBcyIpOworCQlpZiAoIG5mYSE9bnVsbCApIHsKKwkJCXJldHVybjsKKwkJfQorCQluZmEgPSBuZXcgTkZBKHRoaXMpOworCQlmYWN0b3J5ID0gbmV3IE5GQUZhY3RvcnkobmZhKTsKKworCQlDb2xsZWN0aW9uIHJ1bGVzID0gZ2V0UnVsZXMoKTsKKwkJZm9yIChJdGVyYXRvciBpdHIgPSBydWxlcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworCQkJUnVsZSByID0gKFJ1bGUpIGl0ci5uZXh0KCk7CisJCQlTdHJpbmcgcnVsZU5hbWUgPSByLm5hbWU7CisJCQlORkFTdGF0ZSBydWxlQmVnaW5TdGF0ZSA9IGZhY3RvcnkubmV3U3RhdGUoKTsKKwkJCXJ1bGVCZWdpblN0YXRlLnNldERlc2NyaXB0aW9uKCJydWxlICIrcnVsZU5hbWUrIiBzdGFydCIpOworCQkJcnVsZUJlZ2luU3RhdGUuZW5jbG9zaW5nUnVsZSA9IHI7CisJCQlyLnN0YXJ0U3RhdGUgPSBydWxlQmVnaW5TdGF0ZTsKKwkJCU5GQVN0YXRlIHJ1bGVFbmRTdGF0ZSA9IGZhY3RvcnkubmV3U3RhdGUoKTsKKwkJCXJ1bGVFbmRTdGF0ZS5zZXREZXNjcmlwdGlvbigicnVsZSAiK3J1bGVOYW1lKyIgZW5kIik7CisJCQlydWxlRW5kU3RhdGUuc2V0QWNjZXB0U3RhdGUodHJ1ZSk7CisJCQlydWxlRW5kU3RhdGUuZW5jbG9zaW5nUnVsZSA9IHI7CisJCQlyLnN0b3BTdGF0ZSA9IHJ1bGVFbmRTdGF0ZTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGJ1aWxkTkZBKCkgeworCQlpZiAoIG5mYT09bnVsbCApIHsKKwkJCWNyZWF0ZVJ1bGVTdGFydEFuZFN0b3BORkFTdGF0ZXMoKTsKKwkJfQorCQlpZiAoIG5mYS5jb21wbGV0ZSApIHsKKwkJCS8vIGRvbid0IGxldCBpdCBjcmVhdGUgbW9yZSB0aGFuIG9uY2U7IGhhcyBzaWRlLWVmZmVjdHMKKwkJCXJldHVybjsKKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIyMjIGJ1aWxkICIrZ2V0R3JhbW1hclR5cGVTdHJpbmcoKSsiIGdyYW1tYXIgIituYW1lKyIgTkZBcyIpOworCQlpZiAoIGdldFJ1bGVzKCkuc2l6ZSgpPT0wICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJQ29tbW9uVHJlZU5vZGVTdHJlYW0gaW5wdXQgPSBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0oZ2V0R3JhbW1hclRyZWUoKSk7CisJCVRyZWVUb05GQUNvbnZlcnRlciBuZmFCdWlsZGVyID0gbmV3IFRyZWVUb05GQUNvbnZlcnRlcihpbnB1dCwgdGhpcywgbmZhLCBmYWN0b3J5KTsKKwkJdHJ5IHsKKwkJCW5mYUJ1aWxkZXIuZ3JhbW1hcl8oKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0JBRF9BU1RfU1RSVUNUVVJFLAorCQkJCQkJCSAgIG5hbWUsCisJCQkJCQkJICAgcmUpOworCQl9CisJCW5mYS5jb21wbGV0ZSA9IHRydWU7CisJfQorCisJLyoqIEZvciBlYWNoIGRlY2lzaW9uIGluIHRoaXMgZ3JhbW1hciwgY29tcHV0ZSBhIHNpbmdsZSBERkEgdXNpbmcgdGhlCisJICogIE5GQSBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNpc2lvbi4gIFRoZSBERkEgY29uc3RydWN0aW9uCisJICogIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGFsdGVybmF0aXZlcyBpbiB0aGUgZGVjaXNpb24gYXJlCisJICogIHNlcGFyYWJsZSB1c2luZyBhIHJlZ3VsYXIgbG9va2FoZWFkIGxhbmd1YWdlLgorCSAqCisJICogIFN0b3JlIHRoZSBsb29rYWhlYWQgREZBcyBpbiB0aGUgQVNUIGNyZWF0ZWQgZnJvbSB0aGUgdXNlcidzIGdyYW1tYXIKKwkgKiAgc28gdGhlIGNvZGUgZ2VuZXJhdG9yIG9yIHdob2V2ZXIgY2FuIGVhc2lseSBhY2Nlc3MgaXQuCisJICoKKwkgKiAgVGhpcyBpcyBhIHNlcGFyYXRlIG1ldGhvZCBiZWNhdXNlIHlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhCisJICogIEdyYW1tYXIgd2l0aG91dCBkb2luZyB0aGUgZXhwZW5zaXZlIGFuYWx5c2lzLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUxvb2thaGVhZERGQXMoKSB7CisJCWNyZWF0ZUxvb2thaGVhZERGQXModHJ1ZSk7CisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlTG9va2FoZWFkREZBcyhib29sZWFuIHdhY2tUZW1wU3RydWN0dXJlcykgeworCQlpZiAoIG5mYT09bnVsbCApIHsKKwkJCWJ1aWxkTkZBKCk7CisJCX0KKworCQkvLyBDSEVDSyBGT1IgTEVGVCBSRUNVUlNJT047IE1ha2Ugc3VyZSB3ZSBjYW4gYWN0dWFsbHkgZG8gYW5hbHlzaXMKKwkJY2hlY2tBbGxSdWxlc0ZvckxlZnRSZWN1cnNpb24oKTsKKworCQkvKgorCQkvLyB3YXMgdGhlcmUgYSBzZXZlcmUgcHJvYmxlbSB3aGlsZSBzbmlmZmluZyB0aGUgZ3JhbW1hcj8KKwkJaWYgKCBFcnJvck1hbmFnZXIuZG9Ob3RBdHRlbXB0QW5hbHlzaXMoKSApIHsKKwkJCXJldHVybjsKKwkJfQorCQkqLworCisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIyMjIGNyZWF0ZSBERkFzIik7CisJCWludCBudW1EZWNpc2lvbnMgPSBnZXROdW1iZXJPZkRlY2lzaW9ucygpOworCQlpZiAoIE5GQVRvREZBQ29udmVydGVyLlNJTkdMRV9USFJFQURFRF9ORkFfQ09OVkVSU0lPTiApIHsKKwkJCWZvciAoaW50IGRlY2lzaW9uPTE7IGRlY2lzaW9uPD1udW1EZWNpc2lvbnM7IGRlY2lzaW9uKyspIHsKKwkJCQlORkFTdGF0ZSBkZWNpc2lvblN0YXJ0U3RhdGUgPSBnZXREZWNpc2lvbk5GQVN0YXJ0U3RhdGUoZGVjaXNpb24pOworCQkJCWlmICggbGVmdFJlY3Vyc2l2ZVJ1bGVzLmNvbnRhaW5zKGRlY2lzaW9uU3RhcnRTdGF0ZS5lbmNsb3NpbmdSdWxlKSApIHsKKwkJCQkJLy8gZG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgZGVjaXNpb25zIHdpdGhpbiBsZWZ0IHJlY3Vyc2l2ZSBydWxlcy4KKwkJCQkJaWYgKCBjb21wb3NpdGUud2F0Y2hORkFDb252ZXJzaW9uICkgeworCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJpZ25vcmluZyBkZWNpc2lvbiAiK2RlY2lzaW9uKworCQkJCQkJCQkJCSAgICIgd2l0aGluIGxlZnQtcmVjdXJzaXZlIHJ1bGUgIitkZWNpc2lvblN0YXJ0U3RhdGUuZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCQkJfQorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCAhZXh0ZXJuYWxBbmFseXNpc0Fib3J0ICYmIGRlY2lzaW9uU3RhcnRTdGF0ZS5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk+MSApIHsKKwkJCQkJUnVsZSByID0gZGVjaXNpb25TdGFydFN0YXRlLmVuY2xvc2luZ1J1bGU7CisJCQkJCWlmICggci5pc1N5blByZWQgJiYgIXN5blByZWROYW1lc1VzZWRJbkRGQS5jb250YWlucyhyLm5hbWUpICkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJREZBIGRmYSA9IG51bGw7CisJCQkJCS8vIGlmIGs9KiBvciBrPTEsIHRyeSBMTCgxKQorCQkJCQlpZiAoIGdldFVzZXJNYXhMb29rYWhlYWQoZGVjaXNpb24pPT0wIHx8CisJCQkJCQkgZ2V0VXNlck1heExvb2thaGVhZChkZWNpc2lvbik9PTEgKQorCQkJCQl7CisJCQkJCQlkZmEgPSBjcmVhdGVMTF8xX0xvb2thaGVhZERGQShkZWNpc2lvbik7CisJCQkJCX0KKwkJCQkJaWYgKCBkZmE9PW51bGwgKSB7CisJCQkJCQlpZiAoIGNvbXBvc2l0ZS53YXRjaE5GQUNvbnZlcnNpb24gKSB7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWNpc2lvbiAiK2RlY2lzaW9uKworCQkJCQkJCQkJCQkgICAiIG5vdCBzdWl0YWJsZSBmb3IgTEwoMSktb3B0aW1pemVkIERGQSBhbmFseXNpcyIpOworCQkJCQkJfQorCQkJCQkJZGZhID0gY3JlYXRlTG9va2FoZWFkREZBKGRlY2lzaW9uLCB3YWNrVGVtcFN0cnVjdHVyZXMpOworCQkJCQl9CisJCQkJCWlmICggZGZhLnN0YXJ0U3RhdGU9PW51bGwgKSB7CisJCQkJCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZzsgd2lwZSBvdXQgREZBCisJCQkJCQlzZXRMb29rYWhlYWRERkEoZGVjaXNpb24sIG51bGwpOworCQkJCQl9CisJCQkJCWlmICggVG9vbC5pbnRlcm5hbE9wdGlvbl9QcmludERGQSApIHsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiREZBIGQ9IitkZWNpc2lvbik7CisJCQkJCQlGQVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBGQVNlcmlhbGl6ZXIobmZhLmdyYW1tYXIpOworCQkJCQkJU3RyaW5nIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGRmYS5zdGFydFN0YXRlKTsKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgeworCQkJRXJyb3JNYW5hZ2VyLmluZm8oInR3by10aHJlYWRlZCBERkEgY29udmVyc2lvbiIpOworCQkJLy8gY3JlYXRlIGEgYmFycmllciBleHBlY3RpbmcgbiBERkEgYW5kIHRoaXMgbWFpbiBjcmVhdGlvbiB0aHJlYWQKKwkJCUJhcnJpZXIgYmFycmllciA9IG5ldyBCYXJyaWVyKDMpOworCQkJLy8gYXNzdW1lIDIgQ1BVIGZvciBub3cKKwkJCWludCBtaWRwb2ludCA9IG51bURlY2lzaW9ucy8yOworCQkJTkZBQ29udmVyc2lvblRocmVhZCB0MSA9CisJCQkJbmV3IE5GQUNvbnZlcnNpb25UaHJlYWQodGhpcywgYmFycmllciwgMSwgbWlkcG9pbnQpOworCQkJbmV3IFRocmVhZCh0MSkuc3RhcnQoKTsKKwkJCWlmICggbWlkcG9pbnQgPT0gKG51bURlY2lzaW9ucy8yKSApIHsKKwkJCQltaWRwb2ludCsrOworCQkJfQorCQkJTkZBQ29udmVyc2lvblRocmVhZCB0MiA9CisJCQkJbmV3IE5GQUNvbnZlcnNpb25UaHJlYWQodGhpcywgYmFycmllciwgbWlkcG9pbnQsIG51bURlY2lzaW9ucyk7CisJCQluZXcgVGhyZWFkKHQyKS5zdGFydCgpOworCQkJLy8gd2FpdCBmb3IgdGhlc2UgdHdvIHRocmVhZHMgdG8gZmluaXNoCisJCQl0cnkgeworCQkJCWJhcnJpZXIud2FpdEZvclJlbGVhc2UoKTsKKwkJCX0KKwkJCWNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQlFcnJvck1hbmFnZXIuaW50ZXJuYWxFcnJvcigid2hhdCB0aGUgaGVsbD8gREZBIGludGVycnVwdHVzIiwgZSk7CisJCQl9CisJCX0KKworCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJREZBQ3JlYXRpb25XYWxsQ2xvY2tUaW1lSW5NUyA9IHN0b3AgLSBzdGFydDsKKworCQkvLyBpbmRpY2F0ZSB0aGF0IHdlJ3ZlIGZpbmlzaGVkIGJ1aWxkaW5nIERGQSAoZXZlbiBpZiAjZGVjaXNpb25zPT0wKQorCQlhbGxEZWNpc2lvbkRGQUNyZWF0ZWQgPSB0cnVlOworCX0KKworCXB1YmxpYyBERkEgY3JlYXRlTExfMV9Mb29rYWhlYWRERkEoaW50IGRlY2lzaW9uKSB7CisJCURlY2lzaW9uIGQgPSBnZXREZWNpc2lvbihkZWNpc2lvbik7CisJCVN0cmluZyBlbmNsb3NpbmdSdWxlID0gZC5zdGFydFN0YXRlLmVuY2xvc2luZ1J1bGUubmFtZTsKKwkJUnVsZSByID0gZC5zdGFydFN0YXRlLmVuY2xvc2luZ1J1bGU7CisJCU5GQVN0YXRlIGRlY2lzaW9uU3RhcnRTdGF0ZSA9IGdldERlY2lzaW9uTkZBU3RhcnRTdGF0ZShkZWNpc2lvbik7CisKKwkJaWYgKCBjb21wb3NpdGUud2F0Y2hORkFDb252ZXJzaW9uICkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLVxuYXR0ZW1wdGluZyBMTCgxKSBERkEgKGQ9IgorCQkJCQkJCSAgICtkZWNpc2lvblN0YXJ0U3RhdGUuZ2V0RGVjaXNpb25OdW1iZXIoKSsiKSBmb3IgIisKKwkJCQkJCQkgICBkZWNpc2lvblN0YXJ0U3RhdGUuZ2V0RGVzY3JpcHRpb24oKSk7CisJCX0KKworCQlpZiAoIHIuaXNTeW5QcmVkICYmICFzeW5QcmVkTmFtZXNVc2VkSW5ERkEuY29udGFpbnMoZW5jbG9zaW5nUnVsZSkgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCS8vIGNvbXB1dGUgbG9va2FoZWFkIGZvciBlYWNoIGFsdAorCQlpbnQgbnVtQWx0cyA9IGdldE51bWJlck9mQWx0c0ZvckRlY2lzaW9uTkZBKGRlY2lzaW9uU3RhcnRTdGF0ZSk7CisJCUxvb2thaGVhZFNldFtdIGFsdExvb2sgPSBuZXcgTG9va2FoZWFkU2V0W251bUFsdHMrMV07CisJCWZvciAoaW50IGFsdCA9IDE7IGFsdCA8PSBudW1BbHRzOyBhbHQrKykgeworCQkJaW50IHdhbGtBbHQgPQorCQkJCWRlY2lzaW9uU3RhcnRTdGF0ZS50cmFuc2xhdGVEaXNwbGF5QWx0VG9XYWxrQWx0KGFsdCk7CisJCQlORkFTdGF0ZSBhbHRMZWZ0RWRnZSA9IGdldE5GQVN0YXRlRm9yQWx0T2ZEZWNpc2lvbihkZWNpc2lvblN0YXJ0U3RhdGUsIHdhbGtBbHQpOworCQkJTkZBU3RhdGUgYWx0U3RhcnRTdGF0ZSA9IChORkFTdGF0ZSlhbHRMZWZ0RWRnZS50cmFuc2l0aW9uWzBdLnRhcmdldDsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhbHQgIithbHQrIiBzdGFydCBzdGF0ZSA9ICIrYWx0U3RhcnRTdGF0ZS5zdGF0ZU51bWJlcik7CisJCQlhbHRMb29rW2FsdF0gPSBsbDFBbmFseXplci5MT09LKGFsdFN0YXJ0U3RhdGUpOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImFsdCAiK2FsdCsiOiAiK2FsdExvb2tbYWx0XS50b1N0cmluZyh0aGlzKSk7CisJCX0KKworCQkvLyBjb21wYXJlIGFsdCBpIHdpdGggYWx0IGogZm9yIGRpc2pvaW50bmVzcworCQlib29sZWFuIGRlY2lzaW9uSXNMTF8xID0gdHJ1ZTsKK291dGVyOgorCQlmb3IgKGludCBpID0gMTsgaSA8PSBudW1BbHRzOyBpKyspIHsKKwkJCWZvciAoaW50IGogPSBpKzE7IGogPD0gbnVtQWx0czsgaisrKSB7CisJCQkJLyoKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBhcmUgIitpKyIsICIraisiOiAiKworCQkJCQkJCQkgICBhbHRMb29rW2ldLnRvU3RyaW5nKHRoaXMpKyIgd2l0aCAiKworCQkJCQkJCQkgICBhbHRMb29rW2pdLnRvU3RyaW5nKHRoaXMpKTsKKwkJCQkqLworCQkJCUxvb2thaGVhZFNldCBjb2xsaXNpb24gPSBhbHRMb29rW2ldLmludGVyc2VjdGlvbihhbHRMb29rW2pdKTsKKwkJCQlpZiAoICFjb2xsaXNpb24uaXNOaWwoKSApIHsKKwkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbGxpc2lvbiAobm9uLUxMKDEpKTogIitjb2xsaXNpb24udG9TdHJpbmcodGhpcykpOworCQkJCQlkZWNpc2lvbklzTExfMSA9IGZhbHNlOworCQkJCQlicmVhayBvdXRlcjsKKwkJCQl9CisJCQl9CisJCX0KKworCQlib29sZWFuIGZvdW5kQ29uZm91bmRpbmdQcmVkaWNhdGUgPQorCQkJbGwxQW5hbHl6ZXIuZGV0ZWN0Q29uZm91bmRpbmdQcmVkaWNhdGVzKGRlY2lzaW9uU3RhcnRTdGF0ZSk7CisJCWlmICggZGVjaXNpb25Jc0xMXzEgJiYgIWZvdW5kQ29uZm91bmRpbmdQcmVkaWNhdGUgKSB7CisJCQkvLyBidWlsZCBhbiBMTCgxKSBvcHRpbWl6ZWQgREZBIHdpdGggZWRnZSBmb3IgZWFjaCBhbHRMb29rW2ldCisJCQlpZiAoIE5GQVRvREZBQ29udmVydGVyLmRlYnVnICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVjaXNpb24gIitkZWNpc2lvbisiIGlzIHNpbXBsZSBMTCgxKSIpOworCQkJfQorCQkJREZBIGxvb2thaGVhZERGQSA9IG5ldyBMTDFERkEoZGVjaXNpb24sIGRlY2lzaW9uU3RhcnRTdGF0ZSwgYWx0TG9vayk7CisJCQlzZXRMb29rYWhlYWRERkEoZGVjaXNpb24sIGxvb2thaGVhZERGQSk7CisJCQl1cGRhdGVMaW5lQ29sdW1uVG9Mb29rYWhlYWRERkFNYXAobG9va2FoZWFkREZBKTsKKwkJCXJldHVybiBsb29rYWhlYWRERkE7CisJCX0KKworCQkvLyBub3QgTEwoMSkgYnV0IHBlcmhhcHMgd2UgY2FuIHNvbHZlIHdpdGggc2ltcGxpZmllZCBwcmVkaWNhdGUgc2VhcmNoCisJCS8vIGV2ZW4gaWYgaz0xIHNldCBtYW51YWxseSwgb25seSByZXNvbHZlIGhlcmUgaWYgd2UgaGF2ZSBwcmVkczsgaS5lLiwKKwkJLy8gZG9uJ3QgcmVzb2x2ZSBldGMuLi4KKworCQkvKgorCQlTZW1hbnRpY0NvbnRleHQgdmlzaWJsZVByZWRpY2F0ZXMgPQorCQkJbGwxQW5hbHl6ZXIuZ2V0UHJlZGljYXRlcyhkZWNpc2lvblN0YXJ0U3RhdGUpOworCQlib29sZWFuIGZvdW5kQ29uZm91bmRpbmdQcmVkaWNhdGUgPQorCQkJbGwxQW5hbHl6ZXIuZGV0ZWN0Q29uZm91bmRpbmdQcmVkaWNhdGVzKGRlY2lzaW9uU3RhcnRTdGF0ZSk7CisJCQkqLworCisJCS8vIGV4aXQgaWYgbm90IGZvcmNlZCBrPTEgb3Igd2UgZm91bmQgYSBwcmVkaWNhdGUgc2l0dWF0aW9uIHdlCisJCS8vIGNhbid0IGhhbmRsZTogcHJlZGljYXRlcyBpbiBydWxlcyBpbnZva2VkIGZyb20gdGhpcyBkZWNpc2lvbi4KKwkJaWYgKCBnZXRVc2VyTWF4TG9va2FoZWFkKGRlY2lzaW9uKSE9MSB8fCAvLyBub3QgbWFudWFsbHkgc2V0IHRvIGs9MQorCQkJICFnZXRBdXRvQmFja3RyYWNrTW9kZShkZWNpc2lvbikgfHwKKwkJCSBmb3VuZENvbmZvdW5kaW5nUHJlZGljYXRlICkKKwkJeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInRyeWluZyBMTCgqKSIpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlMaXN0PEludGVydmFsU2V0PiBlZGdlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZXJ2YWxTZXQ+KCk7CisJCWZvciAoaW50IGkgPSAxOyBpIDwgYWx0TG9vay5sZW5ndGg7IGkrKykgeworCQkJTG9va2FoZWFkU2V0IHMgPSBhbHRMb29rW2ldOworCQkJZWRnZXMuYWRkKChJbnRlcnZhbFNldClzLnRva2VuVHlwZVNldCk7CisJCX0KKwkJTGlzdDxJbnRlcnZhbFNldD4gZGlzam9pbnQgPSBtYWtlRWRnZVNldHNEaXNqb2ludChlZGdlcyk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJkaXNqb2ludD0iK2Rpc2pvaW50KTsKKworCQlNdWx0aU1hcDxJbnRlcnZhbFNldCwgSW50ZWdlcj4gZWRnZU1hcCA9IG5ldyBNdWx0aU1hcDxJbnRlcnZhbFNldCwgSW50ZWdlcj4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNqb2ludC5zaXplKCk7IGkrKykgeworCQkJSW50ZXJ2YWxTZXQgZHMgPSAoSW50ZXJ2YWxTZXQpIGRpc2pvaW50LmdldChpKTsKKwkJCWZvciAoaW50IGFsdCA9IDE7IGFsdCA8IGFsdExvb2subGVuZ3RoOyBhbHQrKykgeworCQkJCUxvb2thaGVhZFNldCBsb29rID0gYWx0TG9va1thbHRdOworCQkJCWlmICggIWRzLmFuZChsb29rLnRva2VuVHlwZVNldCkuaXNOaWwoKSApIHsKKwkJCQkJZWRnZU1hcC5tYXAoZHMsIGFsdCk7CisJCQkJfQorCQkJfQorCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJlZGdlIG1hcDogIitlZGdlTWFwKTsKKworCQkvLyBUT0RPOiBob3cgZG8gd2Uga25vdyB3ZSBjb3ZlcmVkIHN0dWZmPworCisJCS8vIGJ1aWxkIGFuIExMKDEpIG9wdGltaXplZCBERkEgd2l0aCBlZGdlIGZvciBlYWNoIGFsdExvb2tbaV0KKwkJREZBIGxvb2thaGVhZERGQSA9IG5ldyBMTDFERkEoZGVjaXNpb24sIGRlY2lzaW9uU3RhcnRTdGF0ZSwgZWRnZU1hcCk7CisJCXNldExvb2thaGVhZERGQShkZWNpc2lvbiwgbG9va2FoZWFkREZBKTsKKworCQkvLyBjcmVhdGUgbWFwIGZyb20gbGluZTpjb2wgdG8gZGVjaXNpb24gREZBIChmb3IgQU5UTFJXb3JrcykKKwkJdXBkYXRlTGluZUNvbHVtblRvTG9va2FoZWFkREZBTWFwKGxvb2thaGVhZERGQSk7CisKKwkJcmV0dXJuIGxvb2thaGVhZERGQTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlTGluZUNvbHVtblRvTG9va2FoZWFkREZBTWFwKERGQSBsb29rYWhlYWRERkEpIHsKKwkJR3JhbW1hckFTVCBkZWNpc2lvbkFTVCA9IG5mYS5ncmFtbWFyLmdldERlY2lzaW9uQmxvY2tBU1QobG9va2FoZWFkREZBLmRlY2lzaW9uTnVtYmVyKTsKKwkJaW50IGxpbmUgPSBkZWNpc2lvbkFTVC5nZXRMaW5lKCk7CisJCWludCBjb2wgPSBkZWNpc2lvbkFTVC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJbGluZUNvbHVtblRvTG9va2FoZWFkREZBTWFwLnB1dChuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKGxpbmUgKyAiOiIpCisJCQkJCQkJCQkJLmFwcGVuZChjb2wpLnRvU3RyaW5nKCksIGxvb2thaGVhZERGQSk7CisJfQorCisJcHJvdGVjdGVkIExpc3Q8SW50ZXJ2YWxTZXQ+IG1ha2VFZGdlU2V0c0Rpc2pvaW50KExpc3Q8SW50ZXJ2YWxTZXQ+IGVkZ2VzKSB7CisJCU9yZGVyZWRIYXNoU2V0PEludGVydmFsU2V0PiBkaXNqb2ludFNldHMgPSBuZXcgT3JkZXJlZEhhc2hTZXQ8SW50ZXJ2YWxTZXQ+KCk7CisJCS8vIHdhbGsgZWFjaCBpbmNvbWluZyBlZGdlIGxhYmVsL3NldCBhbmQgYWRkIHRvIGRpc2pvaW50IHNldAorCQlpbnQgbnVtRWRnZXMgPSBlZGdlcy5zaXplKCk7CisJCWZvciAoaW50IGUgPSAwOyBlIDwgbnVtRWRnZXM7IGUrKykgeworCQkJSW50ZXJ2YWxTZXQgdCA9IChJbnRlcnZhbFNldCkgZWRnZXMuZ2V0KGUpOworCQkJaWYgKCBkaXNqb2ludFNldHMuY29udGFpbnModCkgKSB7IC8vIGV4YWN0IHNldCBwcmVzZW50CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIGNvbXBhcmUgdCB3aXRoIHNldCBpIGZvciBkaXNqb2ludG5lc3MKKwkJCUludGVydmFsU2V0IHJlbWFpbmRlciA9IHQ7IC8vIHJlbWFpbmRlciBzdGFydHMgb3V0IGFzIHdob2xlIHNldCB0byBhZGQKKwkJCWludCBudW1EaXNqb2ludEVsZW1lbnRzID0gZGlzam9pbnRTZXRzLnNpemUoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGlzam9pbnRFbGVtZW50czsgaSsrKSB7CisJCQkJSW50ZXJ2YWxTZXQgc19pID0gKEludGVydmFsU2V0KWRpc2pvaW50U2V0cy5nZXQoaSk7CisKKwkJCQlpZiAoIHQuYW5kKHNfaSkuaXNOaWwoKSApIHsgLy8gbm90aGluZyBpbiBjb21tb24KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGxhYmVsKyIgY29sbGlkZXMgd2l0aCAiK3JsKTsKKworCQkJCS8vIEZvciBhbnkgKHNfaSwgdCkgd2l0aCBzX2kmdCE9bmlsIHJlcGxhY2Ugd2l0aCAoc19pLXQsIHNfaSZ0KQorCQkJCS8vIChpZ25vcmluZyBzX2ktdCBpZiBuaWw7IGRvbid0IHB1dCBpbiBsaXN0KQorCisJCQkJLy8gUmVwbGFjZSBleGlzdGluZyBzX2kgd2l0aCBpbnRlcnNlY3Rpb24gc2luY2Ugd2UKKwkJCQkvLyBrbm93IHRoYXQgd2lsbCBhbHdheXMgYmUgYSBub24gbmlsIGNoYXJhY3RlciBjbGFzcworCQkJCUludGVydmFsU2V0IGludGVyc2VjdGlvbiA9IChJbnRlcnZhbFNldClzX2kuYW5kKHQpOworCQkJCWRpc2pvaW50U2V0cy5zZXQoaSwgaW50ZXJzZWN0aW9uKTsKKworCQkJCS8vIENvbXB1dGUgc19pLXQgdG8gc2VlIHdoYXQgaXMgaW4gY3VycmVudCBzZXQgYW5kIG5vdCBpbiBpbmNvbWluZworCQkJCUludFNldCBleGlzdGluZ01pbnVzTmV3RWxlbWVudHMgPSBzX2kuc3VidHJhY3QodCk7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oc19pKyItIit0KyI9IitleGlzdGluZ01pbnVzTmV3RWxlbWVudHMpOworCQkJCWlmICggIWV4aXN0aW5nTWludXNOZXdFbGVtZW50cy5pc05pbCgpICkgeworCQkJCQkvLyBmb3VuZCBhIG5ldyBjaGFyYWN0ZXIgY2xhc3MsIGFkZCB0byB0aGUgZW5kIChkb2Vzbid0IGFmZmVjdAorCQkJCQkvLyBvdXRlciBsb29wIGR1cmF0aW9uIGR1ZSB0byBuIGNvbXB1dGF0aW9uIGEgcHJpb3JpLgorCQkJCQlkaXNqb2ludFNldHMuYWRkKGV4aXN0aW5nTWludXNOZXdFbGVtZW50cyk7CisJCQkJfQorCisJCQkJLy8gYW55dGhpbmcgbGVmdCB0byBhZGQgdG8gdGhlIHJlYWNoYWJsZUxhYmVscz8KKwkJCQlyZW1haW5kZXIgPSAoSW50ZXJ2YWxTZXQpdC5zdWJ0cmFjdChzX2kpOworCQkJCWlmICggcmVtYWluZGVyLmlzTmlsKCkgKSB7CisJCQkJCWJyZWFrOyAvLyBub3RoaW5nIGxlZnQgdG8gYWRkIHRvIHNldC4gIGRvbmUhCisJCQkJfQorCisJCQkJdCA9IHJlbWFpbmRlcjsKKwkJCX0KKwkJCWlmICggIXJlbWFpbmRlci5pc05pbCgpICkgeworCQkJCWRpc2pvaW50U2V0cy5hZGQocmVtYWluZGVyKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZGlzam9pbnRTZXRzLmVsZW1lbnRzKCk7CisJfQorCisJcHVibGljIERGQSBjcmVhdGVMb29rYWhlYWRERkEoaW50IGRlY2lzaW9uLCBib29sZWFuIHdhY2tUZW1wU3RydWN0dXJlcykgeworCQlEZWNpc2lvbiBkID0gZ2V0RGVjaXNpb24oZGVjaXNpb24pOworCQlTdHJpbmcgZW5jbG9zaW5nUnVsZSA9IGQuc3RhcnRTdGF0ZS5lbmNsb3NpbmdSdWxlLm5hbWU7CisJCVJ1bGUgciA9IGQuc3RhcnRTdGF0ZS5lbmNsb3NpbmdSdWxlOworCisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVMb29rYWhlYWRERkEoKTogIitlbmNsb3NpbmdSdWxlKyIgZGVjICIrZGVjaXNpb24rIjsgc3lucHJlZG5hbWVzIHByZXYgdXNlZCAiK3N5blByZWROYW1lc1VzZWRJbkRGQSk7CisJCU5GQVN0YXRlIGRlY2lzaW9uU3RhcnRTdGF0ZSA9IGdldERlY2lzaW9uTkZBU3RhcnRTdGF0ZShkZWNpc2lvbik7CisJCWxvbmcgc3RhcnRERkE9MCxzdG9wREZBPTA7CisJCWlmICggY29tcG9zaXRlLndhdGNoTkZBQ29udmVyc2lvbiApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmJ1aWxkaW5nIGxvb2thaGVhZCBERkEgKGQ9IgorCQkJCQkJCSAgICtkZWNpc2lvblN0YXJ0U3RhdGUuZ2V0RGVjaXNpb25OdW1iZXIoKSsiKSBmb3IgIisKKwkJCQkJCQkgICBkZWNpc2lvblN0YXJ0U3RhdGUuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlzdGFydERGQSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQl9CisKKwkJREZBIGxvb2thaGVhZERGQSA9IG5ldyBERkEoZGVjaXNpb24sIGRlY2lzaW9uU3RhcnRTdGF0ZSk7CisJCS8vIFJldHJ5IHRvIGNyZWF0ZSBhIHNpbXBsZXIgREZBIGlmIGFuYWx5c2lzIGZhaWxlZCAobm9uLUxMKCopLAorCQkvLyByZWN1cnNpb24gb3ZlcmZsb3csIG9yIHRpbWUgb3V0KS4KKwkJYm9vbGVhbiBmYWlsZWQgPQorCQkJbG9va2FoZWFkREZBLnByb2JlLmlzTm9uTExTdGFyRGVjaXNpb24oKSB8fAorCQkJbG9va2FoZWFkREZBLnByb2JlLmFuYWx5c2lzT3ZlcmZsb3dlZCgpOworCQlpZiAoIGZhaWxlZCAmJiBsb29rYWhlYWRERkEub2tUb1JldHJ5REZBV2l0aEsxKCkgKSB7CisJCQkvLyBzZXQgaz0xIG9wdGlvbiBhbmQgdHJ5IGFnYWluLgorCQkJLy8gRmlyc3QsIGNsZWFuIHVwIHRyYWNraW5nIHN0dWZmCisJCQlkZWNpc2lvbnNXaG9zZURGQXNVc2VzU3luUHJlZHMucmVtb3ZlKGxvb2thaGVhZERGQSk7CisJCQkvLyBUT0RPOiBjbGVhbiB1cCBzeW5QcmVkTmFtZXNVc2VkSW5ERkEgYWxzbyAoaGFyZGVyKQorCQkJZC5ibG9ja0FTVC5zZXRCbG9ja09wdGlvbih0aGlzLCAiayIsIFV0aWxzLmludGVnZXIoMSkpOworCQkJaWYgKCBjb21wb3NpdGUud2F0Y2hORkFDb252ZXJzaW9uICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnQoInRyeWluZyBkZWNpc2lvbiAiK2RlY2lzaW9uKworCQkJCQkJCQkgIiBhZ2FpbiB3aXRoIGs9MTsgcmVhc29uOiAiKworCQkJCQkJCQkgbG9va2FoZWFkREZBLmdldFJlYXNvbkZvckZhaWx1cmUoKSk7CisJCQl9CisJCQlsb29rYWhlYWRERkEgPSBudWxsOyAvLyBtYWtlIHN1cmUgb3RoZXIgbWVtb3J5IGlzICJmcmVlIiBiZWZvcmUgcmVkb2luZworCQkJbG9va2FoZWFkREZBID0gbmV3IERGQShkZWNpc2lvbiwgZGVjaXNpb25TdGFydFN0YXRlKTsKKwkJfQorCisJCXNldExvb2thaGVhZERGQShkZWNpc2lvbiwgbG9va2FoZWFkREZBKTsKKworCQlpZiAoIHdhY2tUZW1wU3RydWN0dXJlcyApIHsKKwkJCWZvciAoREZBU3RhdGUgcyA6IGxvb2thaGVhZERGQS5nZXRVbmlxdWVTdGF0ZXMoKS52YWx1ZXMoKSkgeworCQkJCXMucmVzZXQoKTsKKwkJCX0KKwkJfQorCisJCS8vIGNyZWF0ZSBtYXAgZnJvbSBsaW5lOmNvbCB0byBkZWNpc2lvbiBERkEgKGZvciBBTlRMUldvcmtzKQorCQl1cGRhdGVMaW5lQ29sdW1uVG9Mb29rYWhlYWRERkFNYXAobG9va2FoZWFkREZBKTsKKworCQlpZiAoIGNvbXBvc2l0ZS53YXRjaE5GQUNvbnZlcnNpb24gKSB7CisJCQlzdG9wREZBID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvc3Q6ICIrbG9va2FoZWFkREZBLmdldE51bWJlck9mU3RhdGVzKCkrCisJCQkJCQkJICAgIiBzdGF0ZXMsICIrKGludCkoc3RvcERGQS1zdGFydERGQSkrIiBtcyIpOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJhZnRlciBjcmVhdGUgREZBOyBzeW5QcmVkTmFtZXNVc2VkSW5ERkE9IitzeW5QcmVkTmFtZXNVc2VkSW5ERkEpOworCQlyZXR1cm4gbG9va2FoZWFkREZBOworCX0KKworCS8qKiBUZXJtaW5hdGUgREZBIGNyZWF0aW9uIChncmFtbWFyIGFuYWx5c2lzKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleHRlcm5hbGx5QWJvcnRORkFUb0RGQUNvbnZlcnNpb24oKSB7CisJCWV4dGVybmFsQW5hbHlzaXNBYm9ydCA9IHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gTkZBVG9ERkFDb252ZXJzaW9uRXh0ZXJuYWxseUFib3J0ZWQoKSB7CisJCXJldHVybiBleHRlcm5hbEFuYWx5c2lzQWJvcnQ7CisJfQorCisJLyoqIFJldHVybiBhIG5ldyB1bmlxdWUgaW50ZWdlciBpbiB0aGUgdG9rZW4gdHlwZSBzcGFjZSAqLworCXB1YmxpYyBpbnQgZ2V0TmV3VG9rZW5UeXBlKCkgeworCQljb21wb3NpdGUubWF4VG9rZW5UeXBlKys7CisJCXJldHVybiBjb21wb3NpdGUubWF4VG9rZW5UeXBlOworCX0KKworCS8qKiBEZWZpbmUgYSB0b2tlbiBhdCBhIHBhcnRpY3VsYXIgdG9rZW4gdHlwZSB2YWx1ZS4gIEJsYXN0IGFuCisJICogIG9sZCB2YWx1ZSB3aXRoIGEgbmV3IG9uZS4gIFRoaXMgaXMgY2FsbGVkIG5vcm1hbCBncmFtbWFyIHByb2Nlc3NzaW5nCisJICogIGFuZCBkdXJpbmcgaW1wb3J0IHZvY2FiIG9wZXJhdGlvbnMgdG8gc2V0IHRva2VucyB3aXRoIHNwZWNpZmljIHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVUb2tlbihTdHJpbmcgdGV4dCwgaW50IHRva2VuVHlwZSkgeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZGVmaW5lVG9rZW4oIit0ZXh0KyIsICIrdG9rZW5UeXBlKyIpIik7CisJCWlmICggY29tcG9zaXRlLnRva2VuSURUb1R5cGVNYXAuZ2V0KHRleHQpIT1udWxsICkgeworCQkJLy8gYWxyZWFkeSBkZWZpbmVkPyAgTXVzdCBiZSBwcmVkZWZpbmVkIG9uZSBsaWtlIEVPRjsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJCXJldHVybjsKKwkJfQorCQkvLyB0aGUgaW5kZXggaW4gdGhlIHR5cGVUb1Rva2VuTGlzdCB0YWJsZSBpcyBhY3R1YWxseSBzaGlmdGVkIHRvCisJCS8vIGhvbGQgZmF1eCBsYWJlbHMgYXMgeW91IGNhbm5vdCBoYXZlIG5lZ2F0aXZlIGluZGljZXMuCisJCWlmICggdGV4dC5jaGFyQXQoMCk9PSdcJycgKSB7CisJCQljb21wb3NpdGUuc3RyaW5nTGl0ZXJhbFRvVHlwZU1hcC5wdXQodGV4dCwgVXRpbHMuaW50ZWdlcih0b2tlblR5cGUpKTsKKwkJCS8vIHRyYWNrIGluIHJldmVyc2UgaW5kZXggdG9vCisJCQlpZiAoIHRva2VuVHlwZT49Y29tcG9zaXRlLnR5cGVUb1N0cmluZ0xpdGVyYWxMaXN0LnNpemUoKSApIHsKKwkJCQljb21wb3NpdGUudHlwZVRvU3RyaW5nTGl0ZXJhbExpc3Quc2V0U2l6ZSh0b2tlblR5cGUrMSk7CisJCQl9CisJCQljb21wb3NpdGUudHlwZVRvU3RyaW5nTGl0ZXJhbExpc3Quc2V0KHRva2VuVHlwZSwgdGV4dCk7CisJCX0KKwkJZWxzZSB7IC8vIG11c3QgYmUgYSBsYWJlbCBsaWtlIElECisJCQljb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcC5wdXQodGV4dCwgVXRpbHMuaW50ZWdlcih0b2tlblR5cGUpKTsKKwkJfQorCQlpbnQgaW5kZXggPSBMYWJlbC5OVU1fRkFVWF9MQUJFTFMrdG9rZW5UeXBlLTE7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJkZWZpbmluZyAiK25hbWUrIiB0b2tlbiAiK3RleHQrIiBhdCB0eXBlPSIrdG9rZW5UeXBlKyIsIGluZGV4PSIraW5kZXgpOworCQljb21wb3NpdGUubWF4VG9rZW5UeXBlID0gTWF0aC5tYXgoY29tcG9zaXRlLm1heFRva2VuVHlwZSwgdG9rZW5UeXBlKTsKKwkJaWYgKCBpbmRleD49Y29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdC5zaXplKCkgKSB7CisJCQljb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0LnNldFNpemUoaW5kZXgrMSk7CisJCX0KKwkJU3RyaW5nIHByZXZUb2tlbiA9IChTdHJpbmcpY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdC5nZXQoaW5kZXgpOworCQlpZiAoIHByZXZUb2tlbj09bnVsbCB8fCBwcmV2VG9rZW4uY2hhckF0KDApPT0nXCcnICkgeworCQkJLy8gb25seSByZWNvcmQgaWYgbm90aGluZyB0aGVyZSBiZWZvcmUgb3IgaWYgdGhpbmcgYmVmb3JlIHdhcyBhIGxpdGVyYWwKKwkJCWNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3Quc2V0KGluZGV4LCB0ZXh0KTsKKwkJfQorCX0KKworCS8qKiBEZWZpbmUgYSBuZXcgcnVsZS4gIEEgbmV3IHJ1bGUgaW5kZXggaXMgY3JlYXRlZCBieSBpbmNyZW1lbnRpbmcKKwkgKiAgcnVsZUluZGV4LgorCSAqLworCXB1YmxpYyB2b2lkIGRlZmluZVJ1bGUoVG9rZW4gcnVsZVRva2VuLAorCQkJCQkJICAgU3RyaW5nIG1vZGlmaWVyLAorCQkJCQkJICAgTWFwIG9wdGlvbnMsCisJCQkJCQkgICBHcmFtbWFyQVNUIHRyZWUsCisJCQkJCQkgICBHcmFtbWFyQVNUIGFyZ0FjdGlvbkFTVCwKKwkJCQkJCSAgIGludCBudW1BbHRzKQorCXsKKwkJU3RyaW5nIHJ1bGVOYW1lID0gcnVsZVRva2VuLmdldFRleHQoKTsKKwkJaWYgKCBnZXRMb2NhbGx5RGVmaW5lZFJ1bGUocnVsZU5hbWUpIT1udWxsICkgeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX1JVTEVfUkVERUZJTklUSU9OLAorCQkJCQkJCQkJICB0aGlzLCBydWxlVG9rZW4sIHJ1bGVOYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICggKHR5cGU9PUdyYW1tYXIuUEFSU0VSfHx0eXBlPT1HcmFtbWFyLlRSRUVfUEFSU0VSKSAmJgorCQkJIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShydWxlTmFtZS5jaGFyQXQoMCkpICkKKwkJeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX0xFWEVSX1JVTEVTX05PVF9BTExPV0VELAorCQkJCQkJCQkJICB0aGlzLCBydWxlVG9rZW4sIHJ1bGVOYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCisJCVJ1bGUgciA9IG5ldyBSdWxlKHRoaXMsIHJ1bGVOYW1lLCBjb21wb3NpdGUucnVsZUluZGV4LCBudW1BbHRzKTsKKwkJLyoKKwkJU3lzdGVtLm91dC5wcmludGxuKCJkZWZpbmVSdWxlKCIrcnVsZU5hbWUrIixtb2RpZmllcj0iK21vZGlmaWVyKworCQkJCQkJICAgIik6IGluZGV4PSIrci5pbmRleCsiLCBuYWx0cz0iK251bUFsdHMpOworCQkqLworCQlyLm1vZGlmaWVyID0gbW9kaWZpZXI7CisJCW5hbWVUb1J1bGVNYXAucHV0KHJ1bGVOYW1lLCByKTsKKwkJc2V0UnVsZUFTVChydWxlTmFtZSwgdHJlZSk7CisJCXIuc2V0T3B0aW9ucyhvcHRpb25zLCBydWxlVG9rZW4pOworCQlyLmFyZ0FjdGlvbkFTVCA9IGFyZ0FjdGlvbkFTVDsKKwkJY29tcG9zaXRlLnJ1bGVJbmRleFRvUnVsZUxpc3Quc2V0U2l6ZShjb21wb3NpdGUucnVsZUluZGV4KzEpOworCQljb21wb3NpdGUucnVsZUluZGV4VG9SdWxlTGlzdC5zZXQoY29tcG9zaXRlLnJ1bGVJbmRleCwgcik7CisJCWNvbXBvc2l0ZS5ydWxlSW5kZXgrKzsKKwkJaWYgKCBydWxlTmFtZS5zdGFydHNXaXRoKFNZTlBSRURfUlVMRV9QUkVGSVgpICkgeworCQkJci5pc1N5blByZWQgPSB0cnVlOworCQl9CisJfQorCisJLyoqIERlZmluZSBhIG5ldyBwcmVkaWNhdGUgYW5kIGdldCBiYWNrIGl0cyBuYW1lIGZvciB1c2UgaW4gYnVpbGRpbmcKKwkgKiAgYSBzZW1hbnRpYyBwcmVkaWNhdGUgcmVmZXJlbmNlIHRvIHRoZSBzeW4gcHJlZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGRlZmluZVN5bnRhY3RpY1ByZWRpY2F0ZShHcmFtbWFyQVNUIGJsb2NrQVNULAorCQkJCQkJCQkJCSAgIFN0cmluZyBjdXJyZW50UnVsZU5hbWUpCisJeworCQlpZiAoIG5hbWVUb1N5bnByZWRBU1RNYXA9PW51bGwgKSB7CisJCQluYW1lVG9TeW5wcmVkQVNUTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKwkJfQorCQlTdHJpbmcgcHJlZE5hbWUgPQorCQkJU1lOUFJFRF9SVUxFX1BSRUZJWCsobmFtZVRvU3lucHJlZEFTVE1hcC5zaXplKCkgKyAxKSsiXyIrbmFtZTsKKwkJYmxvY2tBU1Quc2V0VHJlZUVuY2xvc2luZ1J1bGVOYW1lRGVlcGx5KHByZWROYW1lKTsKKwkJbmFtZVRvU3lucHJlZEFTVE1hcC5wdXQocHJlZE5hbWUsIGJsb2NrQVNUKTsKKwkJcmV0dXJuIHByZWROYW1lOworCX0KKworCXB1YmxpYyBMaW5rZWRIYXNoTWFwIGdldFN5bnRhY3RpY1ByZWRpY2F0ZXMoKSB7CisJCXJldHVybiBuYW1lVG9TeW5wcmVkQVNUTWFwOworCX0KKworCXB1YmxpYyBHcmFtbWFyQVNUIGdldFN5bnRhY3RpY1ByZWRpY2F0ZShTdHJpbmcgbmFtZSkgeworCQlpZiAoIG5hbWVUb1N5bnByZWRBU1RNYXA9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gKEdyYW1tYXJBU1QpbmFtZVRvU3lucHJlZEFTVE1hcC5nZXQobmFtZSk7CisJfQorCisJcHVibGljIHZvaWQgc3luUHJlZFVzZWRJbkRGQShERkEgZGZhLCBTZW1hbnRpY0NvbnRleHQgc2VtQ3R4KSB7CisJCWRlY2lzaW9uc1dob3NlREZBc1VzZXNTeW5QcmVkcy5hZGQoZGZhKTsKKwkJc2VtQ3R4LnRyYWNrVXNlT2ZTeW50YWN0aWNQcmVkaWNhdGVzKHRoaXMpOyAvLyB3YWxrIGN0eCBsb29raW5nIGZvciBwcmVkcworCX0KKworCS8qCisJcHVibGljIFNldDxSdWxlPiBnZXRSdWxlTmFtZXNWaXNpdGVkRHVyaW5nTE9PSygpIHsKKwkJcmV0dXJuIHJ1bGVzU2Vuc2l0aXZlVG9PdGhlclJ1bGVzOworCX0KKwkqLworCisJLyoqIEdpdmVuIEBzY29wZTo6bmFtZSB7YWN0aW9ufSBkZWZpbmUgaXQgZm9yIHRoaXMgZ3JhbW1hci4gIExhdGVyLAorCSAqICB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBhc2sgZm9yIHRoZSBhY3Rpb25zIHRhYmxlLiAgRm9yIGNvbXBvc2l0ZQorICAgICAqICBncmFtbWFycywgbWFrZSBzdXJlIGhlYWRlciBhY3Rpb24gcHJvcG9nYXRlcyBkb3duIHRvIGFsbCBkZWxlZ2F0ZXMuCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lTmFtZWRBY3Rpb24oR3JhbW1hckFTVCBhbXBlcnNhbmRBU1QsCisJCQkJCQkJCSAgU3RyaW5nIHNjb3BlLAorCQkJCQkJCQkgIEdyYW1tYXJBU1QgbmFtZUFTVCwKKwkJCQkJCQkJICBHcmFtbWFyQVNUIGFjdGlvbkFTVCkKKwl7CisJCWlmICggc2NvcGU9PW51bGwgKSB7CisJCQlzY29wZSA9IGdldERlZmF1bHRBY3Rpb25TY29wZSh0eXBlKTsKKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiR3JhbW1hciAiK25hbWUrIiBkZWZpbmUgQCIrc2NvcGUrIjo6IituYW1lQVNULmdldFRleHQoKSsieyIrYWN0aW9uQVNULmdldFRleHQoKSsifSIpOworCQlTdHJpbmcgYWN0aW9uTmFtZSA9IG5hbWVBU1QuZ2V0VGV4dCgpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHNjb3BlQWN0aW9ucyA9IGdldEFjdGlvbnMoKS5nZXQoc2NvcGUpOworCQlpZiAoIHNjb3BlQWN0aW9ucz09bnVsbCApIHsKKwkJCXNjb3BlQWN0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJZ2V0QWN0aW9ucygpLnB1dChzY29wZSwgc2NvcGVBY3Rpb25zKTsKKwkJfQorCQlPYmplY3QgYSA9IHNjb3BlQWN0aW9ucy5nZXQoYWN0aW9uTmFtZSk7CisJCWlmICggYSE9bnVsbCApIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJRXJyb3JNYW5hZ2VyLk1TR19BQ1RJT05fUkVERUZJTklUSU9OLHRoaXMsCisJCQkJbmFtZUFTVC5nZXRUb2tlbigpLG5hbWVBU1QuZ2V0VGV4dCgpKTsKKwkJfQorCQllbHNlIHsKKwkJCXNjb3BlQWN0aW9ucy5wdXQoYWN0aW9uTmFtZSxhY3Rpb25BU1QpOworCQl9CisgICAgICAgIC8vIHByb3BvZ2F0ZSBoZWFkZXIgKHJlZ2FyZGxlc3Mgb2Ygc2NvcGUgKGxleGVyLCBwYXJzZXIsIC4uLikgPworICAgICAgICBpZiAoIHRoaXM9PWNvbXBvc2l0ZS5nZXRSb290R3JhbW1hcigpICYmIGFjdGlvbk5hbWUuZXF1YWxzKCJoZWFkZXIiKSApIHsKKyAgICAgICAgICAgIExpc3Q8R3JhbW1hcj4gYWxsZ3JhbW1hcnMgPSBjb21wb3NpdGUuZ2V0Um9vdEdyYW1tYXIoKS5nZXREZWxlZ2F0ZXMoKTsKKyAgICAgICAgICAgIGZvciAoR3JhbW1hciBkZWxlZ2F0ZSA6IGFsbGdyYW1tYXJzKSB7CisJCQkJaWYgKCB0YXJnZXQuaXNWYWxpZEFjdGlvblNjb3BlKGRlbGVnYXRlLnR5cGUsIHNjb3BlKSApIHsKKwkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInByb3BvZ2F0ZSB0byAiK2RlbGVnYXRlLm5hbWUpOworICAgICAgICAgICAgICAgIAlkZWxlZ2F0ZS5kZWZpbmVOYW1lZEFjdGlvbihhbXBlcnNhbmRBU1QsIHNjb3BlLCBuYW1lQVNULCBhY3Rpb25BU1QpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5blByZWRHYXRlSWZOb3RBbHJlYWR5KFNUIGdhdGVTVCkgeworICAgICAgICBTdHJpbmcgc2NvcGUgPSBnZXREZWZhdWx0QWN0aW9uU2NvcGUodHlwZSk7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYWN0aW9uc0ZvckdyYW1tYXJTY29wZSA9IGdldEFjdGlvbnMoKS5nZXQoc2NvcGUpOworICAgICAgICAvLyBpZiBubyBzeW5wcmVkZ2F0ZSBhY3Rpb24gc2V0IGJ5IHVzZXIgdGhlbiBzZXQKKyAgICAgICAgaWYgKCAoYWN0aW9uc0ZvckdyYW1tYXJTY29wZT09bnVsbCB8fAorICAgICAgICAgICAgICFhY3Rpb25zRm9yR3JhbW1hclNjb3BlLmNvbnRhaW5zS2V5KEdyYW1tYXIuU1lOUFJFREdBVEVfQUNUSU9OX05BTUUpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYWN0aW9uc0ZvckdyYW1tYXJTY29wZT09bnVsbCApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb25zRm9yR3JhbW1hclNjb3BlPW5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgICAgIGdldEFjdGlvbnMoKS5wdXQoc2NvcGUsIGFjdGlvbnNGb3JHcmFtbWFyU2NvcGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWN0aW9uc0ZvckdyYW1tYXJTY29wZS5wdXQoR3JhbW1hci5TWU5QUkVER0FURV9BQ1RJT05fTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGVTVCk7CisgICAgICAgIH0KKyAgICB9CisKKwlwdWJsaWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0QWN0aW9ucygpIHsKKwkJcmV0dXJuIGFjdGlvbnM7CisJfQorCisJLyoqIEdpdmVuIGEgZ3JhbW1hciB0eXBlLCB3aGF0IHNob3VsZCBiZSB0aGUgZGVmYXVsdCBhY3Rpb24gc2NvcGU/CisJICogIElmIEkgc2F5IEBtZW1iZXJzIGluIGEgQ09NQklORUQgZ3JhbW1hciwgZm9yIGV4YW1wbGUsIHRoZQorCSAqICBkZWZhdWx0IHNjb3BlIHNob3VsZCBiZSAicGFyc2VyIi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBY3Rpb25TY29wZShpbnQgZ3JhbW1hclR5cGUpIHsKKwkJc3dpdGNoIChncmFtbWFyVHlwZSkgeworCQkJY2FzZSBHcmFtbWFyLkxFWEVSIDoKKwkJCQlyZXR1cm4gImxleGVyIjsKKwkJCWNhc2UgR3JhbW1hci5QQVJTRVIgOgorCQkJY2FzZSBHcmFtbWFyLkNPTUJJTkVEIDoKKwkJCQlyZXR1cm4gInBhcnNlciI7CisJCQljYXNlIEdyYW1tYXIuVFJFRV9QQVJTRVIgOgorCQkJCXJldHVybiAidHJlZXBhcnNlciI7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgZGVmaW5lTGV4ZXJSdWxlRm91bmRJblBhcnNlcihUb2tlbiBydWxlVG9rZW4sCisJCQkJCQkJCQkJCSBHcmFtbWFyQVNUIHJ1bGVBU1QpCisJeworLy8JCVN5c3RlbS5vdXQucHJpbnRsbigicnVsZSB0cmVlIGlzOlxuIitydWxlQVNULnRvU3RyaW5nVHJlZSgpKTsKKwkJLyoKKwkJU3RyaW5nIHJ1bGVUZXh0ID0gdG9rZW5CdWZmZXIudG9PcmlnaW5hbFN0cmluZyhydWxlQVNULnJ1bGVTdGFydFRva2VuSW5kZXgsCisJCQkJCQkJCQkJCSAgIHJ1bGVBU1QucnVsZVN0b3BUb2tlbkluZGV4KTsKKwkJKi8KKwkJLy8gZmlyc3QsIGNyZWF0ZSB0aGUgdGV4dCBvZiB0aGUgcnVsZQorCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKCIvLyAkQU5UTFIgc3JjIFwiIik7CisJCWJ1Zi5hcHBlbmQoZ2V0RmlsZU5hbWUoKSk7CisJCWJ1Zi5hcHBlbmQoIlwiICIpOworCQlidWYuYXBwZW5kKHJ1bGVBU1QuZ2V0TGluZSgpKTsKKwkJYnVmLmFwcGVuZCgiXG4iKTsKKwkJZm9yIChpbnQgaT1ydWxlQVNULmdldFRva2VuU3RhcnRJbmRleCgpOworCQkJIGk8PXJ1bGVBU1QuZ2V0VG9rZW5TdG9wSW5kZXgoKSAmJiBpPHRva2VuQnVmZmVyLnNpemUoKTsKKwkJCSBpKyspCisJCXsKKwkJCUNvbW1vblRva2VuIHQgPSAoQ29tbW9uVG9rZW4pdG9rZW5CdWZmZXIuZ2V0KGkpOworCQkJLy8gdW5kbyB0aGUgdGV4dCBkZWxldGlvbnMgZG9uZSBieSB0aGUgbGV4ZXIgKHVnaCkKKwkJCWlmICggdC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkJMT0NLICkgeworCQkJCWJ1Zi5hcHBlbmQoIigiKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCB0LmdldFR5cGUoKT09QU5UTFJQYXJzZXIuQUNUSU9OICkgeworCQkJCWJ1Zi5hcHBlbmQoInsiKTsKKwkJCQlidWYuYXBwZW5kKHQuZ2V0VGV4dCgpKTsKKwkJCQlidWYuYXBwZW5kKCJ9Iik7CisJCQl9CisJCQllbHNlIGlmICggdC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlNFTVBSRUQgfHwKKwkJCQkJICB0LmdldFR5cGUoKT09QU5UTFJQYXJzZXIuU1lOX1NFTVBSRUQgfHwKKwkJCQkJICB0LmdldFR5cGUoKT09QU5UTFJQYXJzZXIuR0FURURfU0VNUFJFRCB8fAorCQkJCQkgIHQuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5CQUNLVFJBQ0tfU0VNUFJFRCApCisJCQl7CisJCQkJYnVmLmFwcGVuZCgieyIpOworCQkJCWJ1Zi5hcHBlbmQodC5nZXRUZXh0KCkpOworCQkJCWJ1Zi5hcHBlbmQoIn0/Iik7CisJCQl9CisJCQllbHNlIGlmICggdC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkFSR19BQ1RJT04gKSB7CisJCQkJYnVmLmFwcGVuZCgiWyIpOworCQkJCWJ1Zi5hcHBlbmQodC5nZXRUZXh0KCkpOworCQkJCWJ1Zi5hcHBlbmQoIl0iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWJ1Zi5hcHBlbmQodC5nZXRUZXh0KCkpOworCQkJfQorCQl9CisJCVN0cmluZyBydWxlVGV4dCA9IGJ1Zi50b1N0cmluZygpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiW1siK3J1bGVUZXh0KyJdXSIpOworCQkvLyBub3cgcHV0IHRoZSBydWxlIGludG8gdGhlIGxleGVyIGdyYW1tYXIgdGVtcGxhdGUKKwkJaWYgKCBnZXRHcmFtbWFySXNSb290KCkgKSB7IC8vIGRvbid0IGJ1aWxkIGxleGVycyBmb3IgZGVsZWdhdGVzCisJCQlsZXhlckdyYW1tYXJTVC5hZGQoInJ1bGVzIiwgcnVsZVRleHQpOworCQl9CisJCS8vIHRyYWNrIHRoaXMgbGV4ZXIgcnVsZSdzIG5hbWUKKwkJY29tcG9zaXRlLmxleGVyUnVsZXMuYWRkKHJ1bGVUb2tlbi5nZXRUZXh0KCkpOworCX0KKworCS8qKiBJZiBzb21lb25lIGRvZXMgUExVUz0nKycgaW4gdGhlIHBhcnNlciwgbXVzdCBtYWtlIHN1cmUgd2UgZ2V0CisJICogICJQTFVTIDogJysnIDsiIGluIGxleGVyIG5vdCAiVDczIDogJysnOyIKKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWZpbmVMZXhlclJ1bGVGb3JBbGlhc2VkU3RyaW5nTGl0ZXJhbChTdHJpbmcgdG9rZW5JRCwKKwkJCQkJCQkJCQkJCQkgICBTdHJpbmcgbGl0ZXJhbCwKKwkJCQkJCQkJCQkJCQkgICBpbnQgdG9rZW5UeXBlKQorCXsKKwkJaWYgKCBnZXRHcmFtbWFySXNSb290KCkgKSB7IC8vIGRvbid0IGJ1aWxkIGxleGVycyBmb3IgZGVsZWdhdGVzCisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZGVmaW5lTGV4ZXJSdWxlRm9yQWxpYXNlZFN0cmluZ0xpdGVyYWw6ICIrbGl0ZXJhbCsiICIrdG9rZW5UeXBlKTsKKwkJCWxleGVyR3JhbW1hclNULmFkZEFnZ3IoImxpdGVyYWxzLntydWxlTmFtZSx0eXBlLGxpdGVyYWx9IiwKKwkJCQkJCQkJCQl0b2tlbklELAorCQkJCQkJCQkJCVV0aWxzLmludGVnZXIodG9rZW5UeXBlKSwKKwkJCQkJCQkJCQlsaXRlcmFsKTsKKwkJfQorCQkvLyB0cmFjayB0aGlzIGxleGVyIHJ1bGUncyBuYW1lCisJCWNvbXBvc2l0ZS5sZXhlclJ1bGVzLmFkZCh0b2tlbklEKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZWZpbmVMZXhlclJ1bGVGb3JTdHJpbmdMaXRlcmFsKFN0cmluZyBsaXRlcmFsLCBpbnQgdG9rZW5UeXBlKSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJkZWZpbmVMZXhlclJ1bGVGb3JTdHJpbmdMaXRlcmFsOiAiK2xpdGVyYWwrIiAiK3Rva2VuVHlwZSk7CisJCS8vIGNvbXB1dGUgbmV3IHRva2VuIG5hbWUgbGlrZSBUMjM3IGFuZCBkZWZpbmUgaXQgYXMgaGF2aW5nIHRva2VuVHlwZQorCQlTdHJpbmcgdG9rZW5JRCA9IGNvbXB1dGVUb2tlbk5hbWVGcm9tTGl0ZXJhbCh0b2tlblR5cGUsbGl0ZXJhbCk7CisJCWRlZmluZVRva2VuKHRva2VuSUQsIHRva2VuVHlwZSk7CisJCS8vIHRlbGwgaW1wbGljaXQgbGV4ZXIgdG8gZGVmaW5lIGEgcnVsZSB0byBtYXRjaCB0aGUgbGl0ZXJhbAorCQlpZiAoIGdldEdyYW1tYXJJc1Jvb3QoKSApIHsgLy8gZG9uJ3QgYnVpbGQgbGV4ZXJzIGZvciBkZWxlZ2F0ZXMKKwkJCWxleGVyR3JhbW1hclNULmFkZEFnZ3IoImxpdGVyYWxzLntydWxlTmFtZSx0eXBlLGxpdGVyYWx9IiwKKwkJCQkJCQkJCQl0b2tlbklELAorCQkJCQkJCQkJCVV0aWxzLmludGVnZXIodG9rZW5UeXBlKSwKKwkJCQkJCQkJCQlsaXRlcmFsKTsKKwkJfQorCX0KKworCXB1YmxpYyBSdWxlIGdldExvY2FsbHlEZWZpbmVkUnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKKwkJUnVsZSByID0gbmFtZVRvUnVsZU1hcC5nZXQocnVsZU5hbWUpOworCQlyZXR1cm4gcjsKKwl9CisKKwlwdWJsaWMgUnVsZSBnZXRSdWxlKFN0cmluZyBydWxlTmFtZSkgeworCQlSdWxlIHIgPSBjb21wb3NpdGUuZ2V0UnVsZShydWxlTmFtZSk7CisJCS8qCisJCWlmICggciE9bnVsbCAmJiByLmdyYW1tYXIgIT0gdGhpcyApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lKyIuZ2V0UnVsZSgiK3J1bGVOYW1lKyIpPSIrcik7CisJCX0KKwkJKi8KKwkJcmV0dXJuIHI7CisJfQorCisJcHVibGljIFJ1bGUgZ2V0UnVsZShTdHJpbmcgc2NvcGVOYW1lLCBTdHJpbmcgcnVsZU5hbWUpIHsKKwkJaWYgKCBzY29wZU5hbWUhPW51bGwgKSB7IC8vIHNjb3BlIG92ZXJyaWRlCisJCQlHcmFtbWFyIHNjb3BlID0gY29tcG9zaXRlLmdldEdyYW1tYXIoc2NvcGVOYW1lKTsKKwkJCWlmICggc2NvcGU9PW51bGwgKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlyZXR1cm4gc2NvcGUuZ2V0TG9jYWxseURlZmluZWRSdWxlKHJ1bGVOYW1lKTsKKwkJfQorCQlyZXR1cm4gZ2V0UnVsZShydWxlTmFtZSk7CisJfQorCisJcHVibGljIGludCBnZXRSdWxlSW5kZXgoU3RyaW5nIHNjb3BlTmFtZSwgU3RyaW5nIHJ1bGVOYW1lKSB7CisJCVJ1bGUgciA9IGdldFJ1bGUoc2NvcGVOYW1lLCBydWxlTmFtZSk7CisJCWlmICggciE9bnVsbCApIHsKKwkJCXJldHVybiByLmluZGV4OworCQl9CisJCXJldHVybiBJTlZBTElEX1JVTEVfSU5ERVg7CisJfQorCisJcHVibGljIGludCBnZXRSdWxlSW5kZXgoU3RyaW5nIHJ1bGVOYW1lKSB7CisJCXJldHVybiBnZXRSdWxlSW5kZXgobnVsbCwgcnVsZU5hbWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UnVsZU5hbWUoaW50IHJ1bGVJbmRleCkgeworCQlSdWxlIHIgPSBjb21wb3NpdGUucnVsZUluZGV4VG9SdWxlTGlzdC5nZXQocnVsZUluZGV4KTsKKwkJaWYgKCByIT1udWxsICkgeworCQkJcmV0dXJuIHIubmFtZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiogU2hvdWxkIGNvZGVnZW4uZyBnZW4gcnVsZSBmb3IgcnVsZU5hbWU/CisJICogCUlmIHN5bnByZWQsIG9ubHkgZ2VuIGlmIHVzZWQgaW4gYSBERkEuCisJICogIElmIHJlZ3VsYXIgcnVsZSwgb25seSBnZW4gaWYgbm90IG92ZXJyaWRkZW4gaW4gZGVsZWdhdG9yCisJICogIEFsd2F5cyBnZW4gVG9rZW5zIHJ1bGUgdGhvdWdoLgorCSAqLworCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlTWV0aG9kRm9yUnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKKwkJaWYgKCBydWxlTmFtZS5lcXVhbHMoQVJUSUZJQ0lBTF9UT0tFTlNfUlVMRU5BTUUpICkgeworCQkJLy8gYWx3YXlzIGdlbmVyYXRlIFRva2VucyBydWxlIHRvIHNhdGlzZnkgbGV4ZXIgaW50ZXJmYWNlCisJCQkvLyBidXQgaXQgbWF5IGhhdmUgbm8gYWx0ZXJuYXRpdmVzLgorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKCBvdmVycmlkZGVuUnVsZXMuY29udGFpbnMocnVsZU5hbWUpICkgeworCQkJLy8gZG9uJ3QgZ2VuZXJhdGUgYW55IG92ZXJyaWRkZW4gcnVsZXMKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvLyBnZW5lcmF0ZSBpZiBub24tc3lucHJlZCBvciBzeW5wcmVkIHVzZWQgaW4gYSBERkEKKwkJUnVsZSByID0gZ2V0TG9jYWxseURlZmluZWRSdWxlKHJ1bGVOYW1lKTsKKwkJcmV0dXJuICFyLmlzU3luUHJlZCB8fAorCQkJICAgKHIuaXNTeW5QcmVkJiZzeW5QcmVkTmFtZXNVc2VkSW5ERkEuY29udGFpbnMocnVsZU5hbWUpKTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlU2NvcGUgZGVmaW5lR2xvYmFsU2NvcGUoU3RyaW5nIG5hbWUsIFRva2VuIHNjb3BlQWN0aW9uKSB7CisJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gbmV3IEF0dHJpYnV0ZVNjb3BlKHRoaXMsIG5hbWUsIHNjb3BlQWN0aW9uKTsKKwkJc2NvcGVzLnB1dChuYW1lLHNjb3BlKTsKKwkJcmV0dXJuIHNjb3BlOworCX0KKworCXB1YmxpYyBBdHRyaWJ1dGVTY29wZSBjcmVhdGVSZXR1cm5TY29wZShTdHJpbmcgcnVsZU5hbWUsIFRva2VuIHJldEFjdGlvbikgeworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IG5ldyBBdHRyaWJ1dGVTY29wZSh0aGlzLCBydWxlTmFtZSwgcmV0QWN0aW9uKTsKKwkJc2NvcGUuaXNSZXR1cm5TY29wZSA9IHRydWU7CisJCXJldHVybiBzY29wZTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlU2NvcGUgY3JlYXRlUnVsZVNjb3BlKFN0cmluZyBydWxlTmFtZSwgVG9rZW4gc2NvcGVBY3Rpb24pIHsKKwkJQXR0cmlidXRlU2NvcGUgc2NvcGUgPSBuZXcgQXR0cmlidXRlU2NvcGUodGhpcywgcnVsZU5hbWUsIHNjb3BlQWN0aW9uKTsKKwkJc2NvcGUuaXNEeW5hbWljUnVsZVNjb3BlID0gdHJ1ZTsKKwkJcmV0dXJuIHNjb3BlOworCX0KKworCXB1YmxpYyBBdHRyaWJ1dGVTY29wZSBjcmVhdGVQYXJhbWV0ZXJTY29wZShTdHJpbmcgcnVsZU5hbWUsIFRva2VuIGFyZ0FjdGlvbikgeworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IG5ldyBBdHRyaWJ1dGVTY29wZSh0aGlzLCBydWxlTmFtZSwgYXJnQWN0aW9uKTsKKwkJc2NvcGUuaXNQYXJhbWV0ZXJTY29wZSA9IHRydWU7CisJCXJldHVybiBzY29wZTsKKwl9CisKKwkvKiogR2V0IGEgZ2xvYmFsIHNjb3BlICovCisJcHVibGljIEF0dHJpYnV0ZVNjb3BlIGdldEdsb2JhbFNjb3BlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiAoQXR0cmlidXRlU2NvcGUpc2NvcGVzLmdldChuYW1lKTsKKwl9CisKKwlwdWJsaWMgTWFwIGdldEdsb2JhbFNjb3BlcygpIHsKKwkJcmV0dXJuIHNjb3BlczsKKwl9CisKKwkvKiogRGVmaW5lIGEgbGFiZWwgZGVmaW5lZCBpbiBhIHJ1bGUgcjsgY2hlY2sgdGhlIHZhbGlkaXR5IHRoZW4gYXNrIHRoZQorCSAqICBSdWxlIG9iamVjdCB0byBhY3R1YWxseSBkZWZpbmUgaXQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVmaW5lTGFiZWwoUnVsZSByLCBUb2tlbiBsYWJlbCwgR3JhbW1hckFTVCBlbGVtZW50LCBpbnQgdHlwZSkgeworCQlib29sZWFuIGVyciA9IG5hbWVTcGFjZUNoZWNrZXIuY2hlY2tGb3JMYWJlbFR5cGVNaXNtYXRjaChyLCBsYWJlbCwgdHlwZSk7CisJCWlmICggZXJyICkgeworCQkJcmV0dXJuOworCQl9CisJCXIuZGVmaW5lTGFiZWwobGFiZWwsIGVsZW1lbnQsIHR5cGUpOworCX0KKworCXB1YmxpYyB2b2lkIGRlZmluZVRva2VuUmVmTGFiZWwoU3RyaW5nIHJ1bGVOYW1lLAorCQkJCQkJCQkJVG9rZW4gbGFiZWwsCisJCQkJCQkJCQlHcmFtbWFyQVNUIHRva2VuUmVmKQorCXsKKwkJUnVsZSByID0gZ2V0TG9jYWxseURlZmluZWRSdWxlKHJ1bGVOYW1lKTsKKwkJaWYgKCByIT1udWxsICkgeworCQkJaWYgKCB0eXBlPT1MRVhFUiAmJgorCQkJCSAodG9rZW5SZWYuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5DSEFSX0xJVEVSQUx8fAorCQkJCSAgdG9rZW5SZWYuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5CTE9DS3x8CisJCQkJICB0b2tlblJlZi5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLk5PVHx8CisJCQkJICB0b2tlblJlZi5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkNIQVJfUkFOR0V8fAorCQkJCSAgdG9rZW5SZWYuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5XSUxEQ0FSRCkpCisJCQl7CisJCQkJZGVmaW5lTGFiZWwociwgbGFiZWwsIHRva2VuUmVmLCBDSEFSX0xBQkVMKTsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UgeworCQkJCWRlZmluZUxhYmVsKHIsIGxhYmVsLCB0b2tlblJlZiwgVE9LRU5fTEFCRUwpOworCQkJfQorCQl9CisJfQorCisgICAgcHVibGljIHZvaWQgZGVmaW5lV2lsZGNhcmRUcmVlTGFiZWwoU3RyaW5nIHJ1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuIGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW1tYXJBU1QgdG9rZW5SZWYpCisgICAgeworICAgICAgICBSdWxlIHIgPSBnZXRMb2NhbGx5RGVmaW5lZFJ1bGUocnVsZU5hbWUpOworICAgICAgICBpZiAoIHIhPW51bGwgKSB7CisgICAgICAgICAgICBkZWZpbmVMYWJlbChyLCBsYWJlbCwgdG9rZW5SZWYsIFdJTERDQVJEX1RSRUVfTEFCRUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVmaW5lV2lsZGNhcmRUcmVlTGlzdExhYmVsKFN0cmluZyBydWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFtbWFyQVNUIHRva2VuUmVmKQorICAgIHsKKyAgICAgICAgUnVsZSByID0gZ2V0TG9jYWxseURlZmluZWRSdWxlKHJ1bGVOYW1lKTsKKyAgICAgICAgaWYgKCByIT1udWxsICkgeworICAgICAgICAgICAgZGVmaW5lTGFiZWwociwgbGFiZWwsIHRva2VuUmVmLCBXSUxEQ0FSRF9UUkVFX0xJU1RfTEFCRUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVmaW5lUnVsZVJlZkxhYmVsKFN0cmluZyBydWxlTmFtZSwKKwkJCQkJCQkJICAgVG9rZW4gbGFiZWwsCisJCQkJCQkJCSAgIEdyYW1tYXJBU1QgcnVsZVJlZikKKwl7CisJCVJ1bGUgciA9IGdldExvY2FsbHlEZWZpbmVkUnVsZShydWxlTmFtZSk7CisJCWlmICggciE9bnVsbCApIHsKKwkJCWRlZmluZUxhYmVsKHIsIGxhYmVsLCBydWxlUmVmLCBSVUxFX0xBQkVMKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGRlZmluZVRva2VuTGlzdExhYmVsKFN0cmluZyBydWxlTmFtZSwKKwkJCQkJCQkJCSBUb2tlbiBsYWJlbCwKKwkJCQkJCQkJCSBHcmFtbWFyQVNUIGVsZW1lbnQpCisJeworCQlSdWxlIHIgPSBnZXRMb2NhbGx5RGVmaW5lZFJ1bGUocnVsZU5hbWUpOworCQlpZiAoIHIhPW51bGwgKSB7CisJCQlkZWZpbmVMYWJlbChyLCBsYWJlbCwgZWxlbWVudCwgVE9LRU5fTElTVF9MQUJFTCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkZWZpbmVSdWxlTGlzdExhYmVsKFN0cmluZyBydWxlTmFtZSwKKwkJCQkJCQkJCVRva2VuIGxhYmVsLAorCQkJCQkJCQkJR3JhbW1hckFTVCBlbGVtZW50KQorCXsKKwkJUnVsZSByID0gZ2V0TG9jYWxseURlZmluZWRSdWxlKHJ1bGVOYW1lKTsKKwkJaWYgKCByIT1udWxsICkgeworCQkJaWYgKCAhci5nZXRIYXNNdWx0aXBsZVJldHVyblZhbHVlcygpICkgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCUVycm9yTWFuYWdlci5NU0dfTElTVF9MQUJFTF9JTlZBTElEX1VOTEVTU19SRVRWQUxfU1RSVUNULHRoaXMsCisJCQkJCWxhYmVsLGxhYmVsLmdldFRleHQoKSk7CisJCQl9CisJCQlkZWZpbmVMYWJlbChyLCBsYWJlbCwgZWxlbWVudCwgUlVMRV9MSVNUX0xBQkVMKTsKKwkJfQorCX0KKworCS8qKiBHaXZlbiBhIHNldCBvZiBhbGwgcmV3cml0ZSBlbGVtZW50cyBvbiByaWdodCBvZiAtPiwgZmlsdGVyIGZvcgorCSAqICBsYWJlbCB0eXBlcyBzdWNoIGFzIEdyYW1tYXIuVE9LRU5fTEFCRUwsIEdyYW1tYXIuVE9LRU5fTElTVF9MQUJFTCwgLi4uCisJICogIFJldHVybiBhIGRpc3BsYXlhYmxlIHRva2VuIHR5cGUgbmFtZSBjb21wdXRlZCBmcm9tIHRoZSBHcmFtbWFyQVNULgorCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRMYWJlbHMoU2V0PEdyYW1tYXJBU1Q+IHJld3JpdGVFbGVtZW50cywgaW50IGxhYmVsVHlwZSkgeworCQlTZXQ8U3RyaW5nPiBsYWJlbHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoR3JhbW1hckFTVCBlbCA6IHJld3JpdGVFbGVtZW50cykgeworCQkJaWYgKCBlbC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkxBQkVMICkgeworCQkJCVN0cmluZyBsYWJlbE5hbWUgPSBlbC5nZXRUZXh0KCk7CisJCQkJUnVsZSBlbmNsb3NpbmdSdWxlID0gZ2V0TG9jYWxseURlZmluZWRSdWxlKGVsLmVuY2xvc2luZ1J1bGVOYW1lKTsKKwkJCQlpZiAoIGVuY2xvc2luZ1J1bGU9PW51bGwgKSBjb250aW51ZTsKKwkJCQlMYWJlbEVsZW1lbnRQYWlyIHBhaXIgPSBlbmNsb3NpbmdSdWxlLmdldExhYmVsKGxhYmVsTmFtZSk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAvLyBpZiB0cmVlIGdyYW1tYXIgYW5kIHdlIGhhdmUgYSB3aWxkY2FyZCwgb25seSBub3RpY2UgaXQKKyAgICAgICAgICAgICAgICAvLyB3aGVuIGxvb2tpbmcgZm9yIHJ1bGUgbGFiZWxzIG5vdCB0b2tlbiBsYWJlbC4geD0uIHNob3VsZAorICAgICAgICAgICAgICAgIC8vIGxvb2sgbGlrZSBhIHJ1bGUgcmVmIHNpbmNlIGNvdWxkIGJlIHN1YnRyZWUuCisgICAgICAgICAgICAgICAgaWYgKCB0eXBlPT1UUkVFX1BBUlNFUiAmJiBwYWlyIT1udWxsICYmCisgICAgICAgICAgICAgICAgICAgICBwYWlyLmVsZW1lbnRSZWYuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5XSUxEQ0FSRCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGxhYmVsVHlwZT09V0lMRENBUkRfVFJFRV9MQUJFTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5hZGQobGFiZWxOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIC8vIGlmIHZhbGlkIGxhYmVsIGFuZCB0eXBlIGlzIHdoYXQgd2UncmUgbG9va2luZyBmb3IKKwkJCQkvLyBhbmQgbm90IHJlZiB0byBvbGQgdmFsdWUgdmFsICRydWxlLCBhZGQgdG8gbGlzdAorCQkJCWlmICggcGFpciE9bnVsbCAmJiBwYWlyLnR5cGU9PWxhYmVsVHlwZSAmJgorCQkJCQkgIWxhYmVsTmFtZS5lcXVhbHMoZWwuZW5jbG9zaW5nUnVsZU5hbWUpICkKKwkJCQl7CisJCQkJCWxhYmVscy5hZGQobGFiZWxOYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGxhYmVsczsKKwl9CisKKwkvKiogQmVmb3JlIGdlbmVyYXRpbmcgY29kZSwgd2UgZXhhbWluZSBhbGwgYWN0aW9ucyB0aGF0IGNhbiBoYXZlCisJICogICR4LnkgYW5kICR5IHN0dWZmIGluIHRoZW0gYmVjYXVzZSBzb21lIGNvZGUgZ2VuZXJhdGlvbiBkZXBlbmRzIG9uCisJICogIFJ1bGUucmVmZXJlbmNlZFByZWRlZmluZWRSdWxlQXR0cmlidXRlcy4gIEkgbmVlZCB0byByZW1vdmUgdW51c2VkCisJICogIHJ1bGUgbGFiZWxzIGZvciBleGFtcGxlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGV4YW1pbmVBbGxFeGVjdXRhYmxlQWN0aW9ucygpIHsKKwkJQ29sbGVjdGlvbiBydWxlcyA9IGdldFJ1bGVzKCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBydWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlSdWxlIHIgPSAoUnVsZSkgaXQubmV4dCgpOworCQkJLy8gd2FsayBhbGwgYWN0aW9ucyB3aXRoaW4gdGhlIHJ1bGUgZWxlbWVudHMsIGFyZ3MsIGFuZCBleGNlcHRpb25zCisJCQlMaXN0PEdyYW1tYXJBU1Q+IGFjdGlvbnMgPSByLmdldElubGluZUFjdGlvbnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5zaXplKCk7IGkrKykgeworCQkJCUdyYW1tYXJBU1QgYWN0aW9uQVNUID0gKEdyYW1tYXJBU1QpIGFjdGlvbnMuZ2V0KGkpOworCQkJCUFjdGlvbkFuYWx5c2lzIHNuaWZmZXIgPQorCQkJCQluZXcgQWN0aW9uQW5hbHlzaXModGhpcywgci5uYW1lLCBhY3Rpb25BU1QpOworCQkJCXNuaWZmZXIuYW5hbHl6ZSgpOworCQkJfQorCQkJLy8gd2FsayBhbnkgbmFtZWQgYWN0aW9ucyBsaWtlIEBpbml0LCBAYWZ0ZXIKKwkJCUNvbGxlY3Rpb248R3JhbW1hckFTVD4gbmFtZWRBY3Rpb25zID0gci5nZXRBY3Rpb25zKCkudmFsdWVzKCk7CisJCQlmb3IgKEl0ZXJhdG9yIGl0MiA9IG5hbWVkQWN0aW9ucy5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykgeworCQkJCUdyYW1tYXJBU1QgYWN0aW9uQVNUID0gKEdyYW1tYXJBU1QpIGl0Mi5uZXh0KCk7CisJCQkJQWN0aW9uQW5hbHlzaXMgc25pZmZlciA9CisJCQkJCW5ldyBBY3Rpb25BbmFseXNpcyh0aGlzLCByLm5hbWUsIGFjdGlvbkFTVCk7CisJCQkJc25pZmZlci5hbmFseXplKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogUmVtb3ZlIGFsbCBsYWJlbHMgb24gcnVsZSByZWZzIHdob3NlIHRhcmdldCBydWxlcyBoYXZlIG5vIHJldHVybiB2YWx1ZS4KKwkgKiAgRG8gdGhpcyBmb3IgYWxsIHJ1bGVzIGluIGdyYW1tYXIuCisJICovCisJcHVibGljIHZvaWQgY2hlY2tBbGxSdWxlc0ZvclVzZWxlc3NMYWJlbHMoKSB7CisJCWlmICggdHlwZT09TEVYRVIgKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU2V0IHJ1bGVzID0gbmFtZVRvUnVsZU1hcC5rZXlTZXQoKTsKKwkJZm9yIChJdGVyYXRvciBpdCA9IHJ1bGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyBydWxlTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCVJ1bGUgciA9IGdldFJ1bGUocnVsZU5hbWUpOworCQkJcmVtb3ZlVXNlbGVzc0xhYmVscyhyLmdldFJ1bGVMYWJlbHMoKSk7CisJCQlyZW1vdmVVc2VsZXNzTGFiZWxzKHIuZ2V0UnVsZUxpc3RMYWJlbHMoKSk7CisJCX0KKwl9CisKKwkvKiogQSBsYWJlbCBvbiBhIHJ1bGUgaXMgdXNlbGVzcyBpZiB0aGUgcnVsZSBoYXMgbm8gcmV0dXJuIHZhbHVlLCBubworCSAqICB0cmVlIG9yIHRlbXBsYXRlIG91dHB1dCwgYW5kIGl0IGlzIG5vdCByZWZlcmVuY2VkIGluIGFuIGFjdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVVc2VsZXNzTGFiZWxzKE1hcCBydWxlVG9FbGVtZW50TGFiZWxQYWlyTWFwKSB7CisJCWlmICggcnVsZVRvRWxlbWVudExhYmVsUGFpck1hcD09bnVsbCApIHsKKwkJCXJldHVybjsKKwkJfQorCQlDb2xsZWN0aW9uIGxhYmVscyA9IHJ1bGVUb0VsZW1lbnRMYWJlbFBhaXJNYXAudmFsdWVzKCk7CisJCUxpc3Qga2lsbCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChJdGVyYXRvciBsYWJlbGl0ID0gbGFiZWxzLml0ZXJhdG9yKCk7IGxhYmVsaXQuaGFzTmV4dCgpOykgeworCQkJTGFiZWxFbGVtZW50UGFpciBwYWlyID0gKExhYmVsRWxlbWVudFBhaXIpIGxhYmVsaXQubmV4dCgpOworCQkJUnVsZSByZWZkUnVsZSA9IGdldFJ1bGUocGFpci5lbGVtZW50UmVmLmdldFRleHQoKSk7CisJCQlpZiAoIHJlZmRSdWxlIT1udWxsICYmICFyZWZkUnVsZS5nZXRIYXNSZXR1cm5WYWx1ZSgpICYmICFwYWlyLmFjdGlvblJlZmVyZW5jZXNMYWJlbCApIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihwYWlyLmxhYmVsLmdldFRleHQoKSsiIGlzIHVzZWxlc3MiKTsKKwkJCQlraWxsLmFkZChwYWlyLmxhYmVsLmdldFRleHQoKSk7CisJCQl9CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBraWxsLnNpemUoKTsgaSsrKSB7CisJCQlTdHJpbmcgbGFiZWxUb0tpbGwgPSAoU3RyaW5nKSBraWxsLmdldChpKTsKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigia2lsbCAiK2xhYmVsVG9LaWxsKTsKKwkJCXJ1bGVUb0VsZW1lbnRMYWJlbFBhaXJNYXAucmVtb3ZlKGxhYmVsVG9LaWxsKTsKKwkJfQorCX0KKworCS8qKiBUcmFjayBhIHJ1bGUgcmVmZXJlbmNlIHdpdGhpbiBhbiBvdXRlcm1vc3QgYWx0IG9mIGEgcnVsZS4gIFVzZWQKKwkgKiAgYXQgdGhlIG1vbWVudCB0byBkZWNpZGUgaWYgJHJ1bGVyZWYgcmVmZXJzIHRvIGEgdW5pcXVlIHJ1bGUgcmVmIGluCisJICogIHRoZSBhbHQuICBSZXdyaXRlIHJ1bGVzIGZvcmNlIHRyYWNraW5nIG9mIGFsbCBydWxlIEFTVCByZXN1bHRzLgorCSAqCisJICogIFRoaXMgZGF0YSBpcyBhbHNvIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYWxsIHJ1bGVzIGhhdmUgYmVlbiBkZWZpbmVkLgorCSAqLworCXB1YmxpYyB2b2lkIGFsdFJlZmVyZW5jZXNSdWxlKFN0cmluZyBlbmNsb3NpbmdSdWxlTmFtZSwKKwkJCQkJCQkJICBHcmFtbWFyQVNUIHJlZlNjb3BlQVNULAorCQkJCQkJCQkgIEdyYW1tYXJBU1QgcmVmQVNULAorCQkJCQkJCQkgIGludCBvdXRlckFsdE51bSkKKwl7CisJCS8qIERvIG5vdGhpbmcgZm9yIG5vdzsgbm90IHN1cmUgbmVlZDsgdHJhY2sgUy54IGFzIHgKKwkJU3RyaW5nIHNjb3BlID0gbnVsbDsKKwkJR3JhbW1hciBzY29wZUcgPSBudWxsOworCQlpZiAoIHJlZlNjb3BlQVNUIT1udWxsICkgeworCQkJaWYgKCAhc2NvcGVkUnVsZVJlZnMuY29udGFpbnMocmVmU2NvcGVBU1QpICkgeworCQkJCXNjb3BlZFJ1bGVSZWZzLmFkZChyZWZTY29wZUFTVCk7CisJCQl9CisJCQlzY29wZSA9IHJlZlNjb3BlQVNULmdldFRleHQoKTsKKwkJfQorCQkqLworCQlSdWxlIHIgPSBnZXRSdWxlKGVuY2xvc2luZ1J1bGVOYW1lKTsKKwkJaWYgKCByPT1udWxsICkgeworCQkJcmV0dXJuOyAvLyBubyBlcnJvciBoZXJlOyBzZWUgTmFtZVNwYWNlQ2hlY2tlcgorCQl9CisJCXIudHJhY2tSdWxlUmVmZXJlbmNlSW5BbHQocmVmQVNULCBvdXRlckFsdE51bSk7CisJCVRva2VuIHJlZlRva2VuID0gcmVmQVNULmdldFRva2VuKCk7CisJCWlmICggIXJ1bGVSZWZzLmNvbnRhaW5zKHJlZkFTVCkgKSB7CisJCQlydWxlUmVmcy5hZGQocmVmQVNUKTsKKwkJfQorCX0KKworCS8qKiBUcmFjayBhIHRva2VuIHJlZmVyZW5jZSB3aXRoaW4gYW4gb3V0ZXJtb3N0IGFsdCBvZiBhIHJ1bGUuICBVc2VkCisJICogIHRvIGRlY2lkZSBpZiAkdG9rZW5yZWYgcmVmZXJzIHRvIGEgdW5pcXVlIHRva2VuIHJlZiBpbgorCSAqICB0aGUgYWx0LiBEb2VzIG5vdCB0cmFjayBsaXRlcmFscyEKKwkgKgorCSAqICBSZXdyaXRlIHJ1bGVzIGZvcmNlIHRyYWNraW5nIG9mIGFsbCB0b2tlbnMuCisJICovCisJcHVibGljIHZvaWQgYWx0UmVmZXJlbmNlc1Rva2VuSUQoU3RyaW5nIHJ1bGVOYW1lLCBHcmFtbWFyQVNUIHJlZkFTVCwgaW50IG91dGVyQWx0TnVtKSB7CisJCVJ1bGUgciA9IGdldExvY2FsbHlEZWZpbmVkUnVsZShydWxlTmFtZSk7CisJCWlmICggcj09bnVsbCApIHsKKwkJCXJldHVybjsKKwkJfQorCQlyLnRyYWNrVG9rZW5SZWZlcmVuY2VJbkFsdChyZWZBU1QsIG91dGVyQWx0TnVtKTsKKwkJaWYgKCAhdG9rZW5JRFJlZnMuY29udGFpbnMocmVmQVNULmdldFRva2VuKCkpICkgeworCQkJdG9rZW5JRFJlZnMuYWRkKHJlZkFTVC5nZXRUb2tlbigpKTsKKwkJfQorCX0KKworCS8qKiBUbyB5aWVsZCBzbWFsbGVyLCBtb3JlIHJlYWRhYmxlIGNvZGUsIHRyYWNrIHdoaWNoIHJ1bGVzIGhhdmUgdGhlaXIKKwkgKiAgcHJlZGVmaW5lZCBhdHRyaWJ1dGVzIGFjY2Vzc2VkLiAgSWYgdGhlIHJ1bGUgaGFzIG5vIHVzZXItZGVmaW5lZAorCSAqICByZXR1cm4gdmFsdWVzLCB0aGVuIGRvbid0IGdlbmVyYXRlIHRoZSByZXR1cm4gdmFsdWUgc2NvcGUgY2xhc3NlcworCSAqICBldGMuLi4gIE1ha2UgdGhlIHJ1bGUgaGF2ZSB2b2lkIHJldHVybiB2YWx1ZS4gIERvbid0IHRyYWNrIGZvciBsZXhlcgorCSAqICBydWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZWZlcmVuY2VSdWxlTGFiZWxQcmVkZWZpbmVkQXR0cmlidXRlKFN0cmluZyBydWxlTmFtZSkgeworCQlSdWxlIHIgPSBnZXRSdWxlKHJ1bGVOYW1lKTsKKwkJaWYgKCByIT1udWxsICYmIHR5cGUhPUxFWEVSICkgeworCQkJLy8gaW5kaWNhdGUgdGhhdCBhbiBhY3Rpb24gcmVmJ2QgYW4gYXR0ciB1bmxlc3MgaXQncyBpbiBhIGxleGVyCisJCQkvLyBzbyB0aGF0ICRJRC50ZXh0IHJlZnMgZG9uJ3QgZm9yY2UgbGV4ZXIgcnVsZXMgdG8gZGVmaW5lCisJCQkvLyByZXR1cm4gdmFsdWVzLi4uVG9rZW4gb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgY2FsbGVyIGluc3RlYWQuCisJCQlyLnJlZmVyZW5jZWRQcmVkZWZpbmVkUnVsZUF0dHJpYnV0ZXMgPSB0cnVlOworCQl9CisJfQorCisJcHVibGljIExpc3QgY2hlY2tBbGxSdWxlc0ZvckxlZnRSZWN1cnNpb24oKSB7CisJCXJldHVybiBzYW5pdHkuY2hlY2tBbGxSdWxlc0ZvckxlZnRSZWN1cnNpb24oKTsKKwl9CisKKwkvKiogUmV0dXJuIGEgbGlzdCBvZiBsZWZ0LXJlY3Vyc2l2ZSBydWxlczsgbm8gYW5hbHlzaXMgY2FuIGJlIGRvbmUKKwkgKiAgc3VjY2Vzc2Z1bGx5IG9uIHRoZXNlLiAgVXNlZnVsIHRvIHNraXAgdGhlc2UgcnVsZXMgdGhlbiBhbmQgYWxzbworCSAqICBmb3IgQU5UTFJXb3JrcyB0byBoaWdobGlnaHQgdGhlbS4KKwkgKi8KKwlwdWJsaWMgU2V0PFJ1bGU+IGdldExlZnRSZWN1cnNpdmVSdWxlcygpIHsKKwkJaWYgKCBuZmE9PW51bGwgKSB7CisJCQlidWlsZE5GQSgpOworCQl9CisJCWlmICggbGVmdFJlY3Vyc2l2ZVJ1bGVzIT1udWxsICkgeworCQkJcmV0dXJuIGxlZnRSZWN1cnNpdmVSdWxlczsKKwkJfQorCQlzYW5pdHkuY2hlY2tBbGxSdWxlc0ZvckxlZnRSZWN1cnNpb24oKTsKKwkJcmV0dXJuIGxlZnRSZWN1cnNpdmVSdWxlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBjaGVja1J1bGVSZWZlcmVuY2UoR3JhbW1hckFTVCBzY29wZUFTVCwKKwkJCQkJCQkJICAgR3JhbW1hckFTVCByZWZBU1QsCisJCQkJCQkJCSAgIEdyYW1tYXJBU1QgYXJnc0FTVCwKKwkJCQkJCQkJICAgU3RyaW5nIGN1cnJlbnRSdWxlTmFtZSkKKwl7CisJCXNhbml0eS5jaGVja1J1bGVSZWZlcmVuY2Uoc2NvcGVBU1QsIHJlZkFTVCwgYXJnc0FTVCwgY3VycmVudFJ1bGVOYW1lKTsKKwl9CisKKwkvKiogUnVsZXMgbGlrZSAiYSA6IDsiIGFuZCAiYSA6IHsuLi59IDsiIHNob3VsZCBub3QgZ2VuZXJhdGUKKwkgKiAgdHJ5L2NhdGNoIGJsb2NrcyBmb3IgUmVjb2duaXRpb25FeGNlcHRpb24uICBUbyBkZXRlY3QgdGhpcworCSAqICBpdCdzIHByb2JhYmx5IG9rIHRvIGp1c3QgbG9vayBmb3IgYW55IHJlZmVyZW5jZSB0byBhbiBhdG9tCisJICogIHRoYXQgY2FuIG1hdGNoIHNvbWUgaW5wdXQuICBXL28gdGhhdCwgdGhlIHJ1bGUgaXMgdW5saWtleSB0byBoYXZlCisJICogIGFueSBlbHNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW1wdHlSdWxlKEdyYW1tYXJBU1QgYmxvY2spIHsKKwkJR3JhbW1hckFTVCBhVG9rZW5SZWZOb2RlID0KKwkJCWJsb2NrLmZpbmRGaXJzdFR5cGUoQU5UTFJQYXJzZXIuVE9LRU5fUkVGKTsKKwkJR3JhbW1hckFTVCBhU3RyaW5nTGl0ZXJhbFJlZk5vZGUgPQorCQkJYmxvY2suZmluZEZpcnN0VHlwZShBTlRMUlBhcnNlci5TVFJJTkdfTElURVJBTCk7CisJCUdyYW1tYXJBU1QgYUNoYXJMaXRlcmFsUmVmTm9kZSA9CisJCQlibG9jay5maW5kRmlyc3RUeXBlKEFOVExSUGFyc2VyLkNIQVJfTElURVJBTCk7CisJCUdyYW1tYXJBU1QgYVdpbGRjYXJkUmVmTm9kZSA9CisJCQlibG9jay5maW5kRmlyc3RUeXBlKEFOVExSUGFyc2VyLldJTERDQVJEKTsKKwkJR3JhbW1hckFTVCBhUnVsZVJlZk5vZGUgPQorCQkJYmxvY2suZmluZEZpcnN0VHlwZShBTlRMUlBhcnNlci5SVUxFX1JFRik7CisJCWlmICggYVRva2VuUmVmTm9kZT09bnVsbCYmCisJCQkgYVN0cmluZ0xpdGVyYWxSZWZOb2RlPT1udWxsJiYKKwkJCSBhQ2hhckxpdGVyYWxSZWZOb2RlPT1udWxsJiYKKwkJCSBhV2lsZGNhcmRSZWZOb2RlPT1udWxsJiYKKwkJCSBhUnVsZVJlZk5vZGU9PW51bGwgKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBdG9tVG9rZW5UeXBlKGludCB0dHlwZSkgeworCQlyZXR1cm4gdHR5cGUgPT0gQU5UTFJQYXJzZXIuV0lMRENBUkR8fAorCQkJICAgdHR5cGUgPT0gQU5UTFJQYXJzZXIuQ0hBUl9MSVRFUkFMfHwKKwkJCSAgIHR0eXBlID09IEFOVExSUGFyc2VyLkNIQVJfUkFOR0V8fAorCQkJICAgdHR5cGUgPT0gQU5UTFJQYXJzZXIuU1RSSU5HX0xJVEVSQUx8fAorCQkJICAgdHR5cGUgPT0gQU5UTFJQYXJzZXIuTk9UfHwKKwkJCSAgICh0eXBlICE9IExFWEVSICYmIHR0eXBlID09IEFOVExSUGFyc2VyLlRPS0VOX1JFRik7CisJfQorCisJcHVibGljIGludCBnZXRUb2tlblR5cGUoU3RyaW5nIHRva2VuTmFtZSkgeworCQlJbnRlZ2VyIEkgPSBudWxsOworCQlpZiAoIHRva2VuTmFtZS5jaGFyQXQoMCk9PSdcJycpIHsKKwkJCUkgPSAoSW50ZWdlciljb21wb3NpdGUuc3RyaW5nTGl0ZXJhbFRvVHlwZU1hcC5nZXQodG9rZW5OYW1lKTsKKwkJfQorCQllbHNlIHsgLy8gbXVzdCBiZSBhIGxhYmVsIGxpa2UgSUQKKwkJCUkgPSAoSW50ZWdlciljb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcC5nZXQodG9rZW5OYW1lKTsKKwkJfQorCQlpbnQgaSA9IChJIT1udWxsKT9JLmludFZhbHVlKCk6TGFiZWwuSU5WQUxJRDsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdyYW1tYXIgdHlwZSAiK3R5cGUrIiAiK3Rva2VuTmFtZSsiLT4iK2kpOworCQlyZXR1cm4gaTsKKwl9CisKKwkvKiogR2V0IHRoZSBsaXN0IG9mIHRva2VucyB0aGF0IGFyZSBJRHMgbGlrZSBCTE9DSyBhbmQgTFBBUkVOICovCisJcHVibGljIFNldCBnZXRUb2tlbklEcygpIHsKKwkJcmV0dXJuIGNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwLmtleVNldCgpOworCX0KKworCS8qKiBSZXR1cm4gYW4gb3JkZXJlZCBpbnRlZ2VyIGxpc3Qgb2YgdG9rZW4gdHlwZXMgdGhhdCBoYXZlIG5vCisJICogIGNvcnJlc3BvbmRpbmcgdG9rZW4gSUQgbGlrZSBJTlQgb3IgS0VZV09SRF9CRUdJTjsgZm9yIHN0dWZmCisJICogIGxpa2UgJ2JlZ2luJy4KKwkgKi8KKwlwdWJsaWMgQ29sbGVjdGlvbiBnZXRUb2tlblR5cGVzV2l0aG91dElEKCkgeworCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCB0ID1MYWJlbC5NSU5fVE9LRU5fVFlQRTsgdDw9Z2V0TWF4VG9rZW5UeXBlKCk7IHQrKykgeworCQkJU3RyaW5nIG5hbWUgPSBnZXRUb2tlbkRpc3BsYXlOYW1lKHQpOworCQkJaWYgKCBuYW1lLmNoYXJBdCgwKT09J1wnJyApIHsKKwkJCQl0eXBlcy5hZGQoVXRpbHMuaW50ZWdlcih0KSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHR5cGVzOworCX0KKworCS8qKiBHZXQgYSBsaXN0IG9mIGFsbCB0b2tlbiBJRHMgYW5kIGxpdGVyYWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkCisJICogIHRva2VuIHR5cGUuCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldFRva2VuRGlzcGxheU5hbWVzKCkgeworCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJZm9yIChpbnQgdCA9TGFiZWwuTUlOX1RPS0VOX1RZUEU7IHQgPD1nZXRNYXhUb2tlblR5cGUoKTsgdCsrKSB7CisJCQluYW1lcy5hZGQoZ2V0VG9rZW5EaXNwbGF5TmFtZSh0KSk7CisJCX0KKwkJcmV0dXJuIG5hbWVzOworCX0KKworCS8qKiBHaXZlbiBhIGxpdGVyYWwgbGlrZSAodGhlIDMgY2hhciBzZXF1ZW5jZSB3aXRoIHNpbmdsZSBxdW90ZXMpICdhJywKKwkgKiAgcmV0dXJuIHRoZSBpbnQgdmFsdWUgb2YgJ2EnLiBDb252ZXJ0IGVzY2FwZSBzZXF1ZW5jZXMgaGVyZSBhbHNvLgorCSAqICBBTlRMUidzIGFudGxyLmcgcGFyc2VyIGRvZXMgbm90IGNvbnZlcnQgZXNjYXBlIHNlcXVlbmNlcy4KKwkgKgorCSAqICAxMS8yNi8yMDA1OiBJIGNoYW5nZWQgbGl0ZXJhbHMgdG8gYWx3YXlzIGJlICcuLi4nIGV2ZW4gZm9yIHN0cmluZ3MuCisJICogIFRoaXMgcm91dGluZSBzdGlsbCB3b3JrcyB0aG91Z2guCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0Q2hhclZhbHVlRnJvbUdyYW1tYXJDaGFyTGl0ZXJhbChTdHJpbmcgbGl0ZXJhbCkgeworCQlzd2l0Y2ggKCBsaXRlcmFsLmxlbmd0aCgpICkgeworCQkJY2FzZSAzIDoKKwkJCQkvLyAneCcKKwkJCQlyZXR1cm4gbGl0ZXJhbC5jaGFyQXQoMSk7IC8vIG5vIGVzY2FwZSBjaGFyCisJCQljYXNlIDQgOgorCQkJCS8vICdceCcgIChhbnRsciBsZXhlciB3aWxsIGNhdGNoIGludmFsaWQgY2hhcikKKwkJCQlpZiAoIENoYXJhY3Rlci5pc0RpZ2l0KGxpdGVyYWwuY2hhckF0KDIpKSApIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfU1lOVEFYX0VSUk9SLAorCQkJCQkJCQkJICAgImludmFsaWQgY2hhciBsaXRlcmFsOiAiK2xpdGVyYWwpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWludCBlc2NDaGFyID0gbGl0ZXJhbC5jaGFyQXQoMik7CisJCQkJaW50IGNoYXJWYWwgPSBBTlRMUkxpdGVyYWxFc2NhcGVkQ2hhclZhbHVlW2VzY0NoYXJdOworCQkJCWlmICggY2hhclZhbD09MCApIHsKKwkJCQkJLy8gVW5uZWNlc3NhcnkgZXNjYXBlcyBsaWtlICdceycgc2hvdWxkIGp1c3QgeWllbGQgeworCQkJCQlyZXR1cm4gZXNjQ2hhcjsKKwkJCQl9CisJCQkJcmV0dXJuIGNoYXJWYWw7CisJCQljYXNlIDggOgorCQkJCS8vICdcdTEyMzQnCisJCQkJU3RyaW5nIHVuaWNvZGVDaGFycyA9IGxpdGVyYWwuc3Vic3RyaW5nKDMsbGl0ZXJhbC5sZW5ndGgoKS0xKTsKKwkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh1bmljb2RlQ2hhcnMsIDE2KTsKKwkJCWRlZmF1bHQgOgorCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX1NZTlRBWF9FUlJPUiwKKwkJCQkJCQkJICAgImludmFsaWQgY2hhciBsaXRlcmFsOiAiK2xpdGVyYWwpOworCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qKiBBTlRMUiBkb2VzIG5vdCBjb252ZXJ0IGVzY2FwZSBzZXF1ZW5jZXMgZHVyaW5nIHRoZSBwYXJzZSBwaGFzZSBiZWNhdXNlCisJICogIGl0IGNvdWxkIG5vdCBrbm93IGhvdyB0byBwcmludCBTdHJpbmcvY2hhciBsaXRlcmFscyBiYWNrIG91dCB3aGVuCisJICogIHByaW50aW5nIGdyYW1tYXJzIGV0Yy4uLiAgU29tZW9uZSBpbiBDaGluYSBtaWdodCB1c2UgdGhlIHJlYWwgdW5pY29kZQorCSAqICBjaGFyIGluIGEgbGl0ZXJhbCBhcyBpdCB3aWxsIGRpc3BsYXkgb24gdGhlaXIgc2NyZWVuOyB3aGVuIHByaW50aW5nCisJICogIGJhY2sgb3V0LCBJIGNvdWxkIG5vdCBrbm93IHdoZXRoZXIgdG8gZGlzcGxheSBvciB1c2UgYSB1bmljb2RlIGVzY2FwZS4KKwkgKgorCSAqICBUaGlzIHJvdXRpbmUgY29udmVydHMgYSBzdHJpbmcgbGl0ZXJhbCB3aXRoIHBvc3NpYmxlIGVzY2FwZSBzZXF1ZW5jZXMKKwkgKiAgaW50byBhIHB1cmUgc3RyaW5nIG9mIDE2LWJpdCBjaGFyIHZhbHVlcy4gIEVzY2FwZXMgYW5kIHVuaWNvZGUgXHUwMDAwCisJICogIHNwZWNzIGFyZSBjb252ZXJ0ZWQgdG8gcHVyZSBjaGFycy4gIHJldHVybiBpbiBhIGJ1ZmZlcjsgcGVvcGxlIG1heQorCSAqICB3YW50IHRvIHdhbGsvbWFuaXB1bGF0ZSBmdXJ0aGVyLgorCSAqCisJICogIFRoZSBORkEgY29uc3RydWN0aW9uIHJvdXRpbmUgbXVzdCBrbm93IHRoZSBhY3R1YWwgY2hhciB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZ2V0VW5lc2NhcGVkU3RyaW5nRnJvbUdyYW1tYXJTdHJpbmdMaXRlcmFsKFN0cmluZyBsaXRlcmFsKSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJlc2NhcGU6IFsiK2xpdGVyYWwrIl0iKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaW50IGxhc3QgPSBsaXRlcmFsLmxlbmd0aCgpLTE7IC8vIHNraXAgcXVvdGVzIG9uIG91dHNpZGUKKwkJZm9yIChpbnQgaT0xOyBpPGxhc3Q7IGkrKykgeworCQkJY2hhciBjID0gbGl0ZXJhbC5jaGFyQXQoaSk7CisJCQlpZiAoIGM9PSdcXCcgKSB7CisJCQkJaSsrOworCQkJCWMgPSBsaXRlcmFsLmNoYXJBdChpKTsKKwkJCQlpZiAoIENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKT09J1UnICkgeworCQkJCQkvLyBcdTAwMDAKKwkJCQkJaSsrOworCQkJCQlTdHJpbmcgdW5pY29kZUNoYXJzID0gbGl0ZXJhbC5zdWJzdHJpbmcoaSxpKzQpOworCQkJCQkvLyBwYXJzZSB0aGUgdW5pY29kZSAxNiBiaXQgaGV4IHZhbHVlCisJCQkJCWludCB2YWwgPSBJbnRlZ2VyLnBhcnNlSW50KHVuaWNvZGVDaGFycywgMTYpOworCQkJCQlpKz00LTE7IC8vIGxvb3Agd2lsbCBpbmMgYnkgMTsgb25seSBqdW1wIDMgdGhlbgorCQkJCQlidWYuYXBwZW5kKChjaGFyKXZhbCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKCBDaGFyYWN0ZXIuaXNEaWdpdChjKSApIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfU1lOVEFYX0VSUk9SLAorCQkJCQkJCQkJICAgImludmFsaWQgY2hhciBsaXRlcmFsOiAiK2xpdGVyYWwpOworCQkJCQlidWYuYXBwZW5kKCJcXCIrKGNoYXIpYyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlidWYuYXBwZW5kKChjaGFyKUFOVExSTGl0ZXJhbEVzY2FwZWRDaGFyVmFsdWVbY10pOyAvLyBub3JtYWwgXHggZXNjYXBlCisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJYnVmLmFwcGVuZChjKTsgLy8gc2ltcGxlIGNoYXIgeAorCQkJfQorCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdHJpbmc6IFsiK2J1Zi50b1N0cmluZygpKyJdIik7CisJCXJldHVybiBidWY7CisJfQorCisJLyoqIFB1bGwgeW91ciB0b2tlbiBkZWZpbml0aW9ucyBmcm9tIGFuIGV4aXN0aW5nIGdyYW1tYXIgaW4gbWVtb3J5LgorCSAqICBZb3UgbXVzdCB1c2UgR3JhbW1hcigpIGN0b3IgdGhlbiB0aGlzIG1ldGhvZCB0aGVuIHNldEdyYW1tYXJDb250ZW50KCkKKwkgKiAgdG8gbWFrZSB0aGlzIHdvcmsuICBUaGlzIHdhcyB1c2VmdWwgcHJpbWFyaWx5IGZvciB0ZXN0aW5nIGFuZAorCSAqICBpbnRlcnByZXRpbmcgZ3JhbW1hcnMgdW50aWwgSSBhZGRlZCBpbXBvcnQgZ3JhbW1hciBmdW5jdGlvbmFsaXR5LgorCSAqICBXaGVuIHlvdSBpbXBvcnQgYSBncmFtbWFyIHlvdSBpbXBsaWNpdGx5IGltcG9ydCBpdHMgdm9jYWJ1bGFyeSBhcyB3ZWxsCisJICogIGFuZCBrZWVwIHRoZSBzYW1lIHRva2VuIHR5cGUgdmFsdWVzLgorCSAqCisJICogIFJldHVybnMgdGhlIG1heCB0b2tlbiB0eXBlIGZvdW5kLgorCSAqLworCXB1YmxpYyBpbnQgaW1wb3J0VG9rZW5Wb2NhYnVsYXJ5KEdyYW1tYXIgaW1wb3J0RnJvbUdyKSB7CisJCVNldCBpbXBvcnRlZFRva2VuSURzID0gaW1wb3J0RnJvbUdyLmdldFRva2VuSURzKCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBpbXBvcnRlZFRva2VuSURzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyB0b2tlbklEID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJaW50IHRva2VuVHlwZSA9IGltcG9ydEZyb21Hci5nZXRUb2tlblR5cGUodG9rZW5JRCk7CisJCQljb21wb3NpdGUubWF4VG9rZW5UeXBlID0gTWF0aC5tYXgoY29tcG9zaXRlLm1heFRva2VuVHlwZSx0b2tlblR5cGUpOworCQkJaWYgKCB0b2tlblR5cGU+PUxhYmVsLk1JTl9UT0tFTl9UWVBFICkgeworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJpbXBvcnQgdG9rZW4gZnJvbSBncmFtbWFyICIrdG9rZW5JRCsiPSIrdG9rZW5UeXBlKTsKKwkJCQlkZWZpbmVUb2tlbih0b2tlbklELCB0b2tlblR5cGUpOworCQkJfQorCQl9CisJCXJldHVybiBjb21wb3NpdGUubWF4VG9rZW5UeXBlOyAvLyByZXR1cm4gbWF4IGZvdW5kCisJfQorCisJLyoqIEltcG9ydCB0aGUgcnVsZXMvdG9rZW5zIG9mIGEgZGVsZWdhdGUgZ3JhbW1hci4gQWxsIGRlbGVnYXRlIGdyYW1tYXJzIGFyZQorCSAqICByZWFkIGR1cmluZyB0aGUgY3RvciBvZiBmaXJzdCBHcmFtbWFyIGNyZWF0ZWQuCisJICoKKwkgKiAgRG8gbm90IGNyZWF0ZSBORkEgaGVyZSBiZWNhdXNlIE5GQSBjb25zdHJ1Y3Rpb24gbmVlZHMgdG8gaG9vayB1cCB3aXRoCisJICogIG92ZXJyaWRkZW4gcnVsZXMgaW4gZGVsZWdhdGlvbiByb290IGdyYW1tYXIuCisJICovCisJcHVibGljIHZvaWQgaW1wb3J0R3JhbW1hcihHcmFtbWFyQVNUIGdyYW1tYXJOYW1lQVNULCBTdHJpbmcgbGFiZWwpIHsKKwkJU3RyaW5nIGdyYW1tYXJOYW1lID0gZ3JhbW1hck5hbWVBU1QuZ2V0VGV4dCgpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaW1wb3J0ICIrZ2ZpbGUuZ2V0TmFtZSgpKTsKKwkJU3RyaW5nIGduYW1lID0gZ3JhbW1hck5hbWUgKyBHUkFNTUFSX0ZJTEVfRVhURU5TSU9OOworCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7CisJCXRyeSB7CisJCQlTdHJpbmcgZnVsbE5hbWUgPSB0b29sLmdldExpYnJhcnlGaWxlKGduYW1lKTsKKwkJCUZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmdWxsTmFtZSk7CisJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7CisJCQlHcmFtbWFyIGRlbGVnYXRlR3JhbW1hciA9IG51bGw7CisJCQlkZWxlZ2F0ZUdyYW1tYXIgPSBuZXcgR3JhbW1hcih0b29sLCBnbmFtZSwgY29tcG9zaXRlKTsKKwkJCWRlbGVnYXRlR3JhbW1hci5sYWJlbCA9IGxhYmVsOworCisJCQlhZGREZWxlZ2F0ZUdyYW1tYXIoZGVsZWdhdGVHcmFtbWFyKTsKKworCQkJZGVsZWdhdGVHcmFtbWFyLnBhcnNlQW5kQnVpbGRBU1QoYnIpOworCQkJZGVsZWdhdGVHcmFtbWFyLmFkZFJ1bGVzRm9yU3ludGFjdGljUHJlZGljYXRlcygpOworCQkJaWYgKCAhdmFsaWRJbXBvcnQoZGVsZWdhdGVHcmFtbWFyKSApIHsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfSU5WQUxJRF9JTVBPUlQsCisJCQkJCQkJCQkJICB0aGlzLAorCQkJCQkJCQkJCSAgZ3JhbW1hck5hbWVBU1QudG9rZW4sCisJCQkJCQkJCQkJICB0aGlzLAorCQkJCQkJCQkJCSAgZGVsZWdhdGVHcmFtbWFyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIHRoaXMudHlwZT09Q09NQklORUQgJiYKKwkJCQkgKGRlbGVnYXRlR3JhbW1hci5uYW1lLmVxdWFscyh0aGlzLm5hbWUrZ3JhbW1hclR5cGVUb0ZpbGVOYW1lU3VmZml4W0xFWEVSXSl8fAorCQkJCSAgZGVsZWdhdGVHcmFtbWFyLm5hbWUuZXF1YWxzKHRoaXMubmFtZStncmFtbWFyVHlwZVRvRmlsZU5hbWVTdWZmaXhbUEFSU0VSXSkpICkKKwkJCXsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfSU1QT1JUX05BTUVfQ0xBU0gsCisJCQkJCQkJCQkJICB0aGlzLAorCQkJCQkJCQkJCSAgZ3JhbW1hck5hbWVBU1QudG9rZW4sCisJCQkJCQkJCQkJICB0aGlzLAorCQkJCQkJCQkJCSAgZGVsZWdhdGVHcmFtbWFyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoIGRlbGVnYXRlR3JhbW1hci5ncmFtbWFyVHJlZSE9bnVsbCApIHsKKwkJCQkvLyB3ZSBoYXZlIGEgdmFsaWQgZ3JhbW1hcgorCQkJCS8vIGRlYWwgd2l0aCBjb21iaW5lZCBncmFtbWFycworCQkJCWlmICggZGVsZWdhdGVHcmFtbWFyLnR5cGUgPT0gTEVYRVIgJiYgdGhpcy50eXBlID09IENPTUJJTkVEICkgeworCQkJCQkvLyBvb29wcywgd2Ugd2FzdGVkIHNvbWUgZWZmb3J0OyB0ZWxsIGxleGVyIHRvIHJlYWQgaXQgaW4KKwkJCQkJLy8gbGF0ZXIKKwkJCQkJbGV4ZXJHcmFtbWFyU1QuYWRkKCJpbXBvcnRzIiwgZ3JhbW1hck5hbWUpOworCQkJCQkvLyBidXQsIHRoaXMgcGFyc2VyIGdyYW1tYXIgd2lsbCBuZWVkIHRoZSB2b2NhYgorCQkJCQkvLyBzbyBhZGQgdG8gY29tcG9zaXRlIGFueXdheSBzbyB3ZSBzdWNrIGluIHRoZSB0b2tlbnMgbGF0ZXIKKwkJCQl9CisJCQl9CisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiR290IGdyYW1tYXI6XG4iK2RlbGVnYXRlR3JhbW1hcik7CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX09QRU5fRklMRSwKKwkJCQkJCQkgICBnbmFtZSwKKwkJCQkJCQkgICBpb2UpOworCQl9CisJCWZpbmFsbHkgeworCQkJaWYgKCBiciE9bnVsbCApIHsKKwkJCQl0cnkgeworCQkJCQlici5jbG9zZSgpOworCQkJCX0KKwkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9DTE9TRV9GSUxFLAorCQkJCQkJCQkJICAgZ25hbWUsCisJCQkJCQkJCQkgICBpb2UpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKiBhZGQgbmV3IGRlbGVnYXRlIHRvIGNvbXBvc2l0ZSB0cmVlICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVsZWdhdGVHcmFtbWFyKEdyYW1tYXIgZGVsZWdhdGVHcmFtbWFyKSB7CisJCUNvbXBvc2l0ZUdyYW1tYXJUcmVlIHQgPSBjb21wb3NpdGUuZGVsZWdhdGVHcmFtbWFyVHJlZVJvb3QuZmluZE5vZGUodGhpcyk7CisJCXQuYWRkQ2hpbGQobmV3IENvbXBvc2l0ZUdyYW1tYXJUcmVlKGRlbGVnYXRlR3JhbW1hcikpOworCQkvLyBtYWtlIHN1cmUgbmV3IGdyYW1tYXIgc2hhcmVzIHRoaXMgY29tcG9zaXRlCisJCWRlbGVnYXRlR3JhbW1hci5jb21wb3NpdGUgPSB0aGlzLmNvbXBvc2l0ZTsKKwl9CisKKwkvKiogTG9hZCBhIHZvY2FiIGZpbGUgPHZvY2FiTmFtZT4udG9rZW5zIGFuZCByZXR1cm4gbWF4IHRva2VuIHR5cGUgZm91bmQuICovCisJcHVibGljIGludCBpbXBvcnRUb2tlblZvY2FidWxhcnkoR3JhbW1hckFTVCB0b2tlblZvY2FiT3B0aW9uQVNULAorCQkJCQkJCQkJIFN0cmluZyB2b2NhYk5hbWUpCisJeworCQlpZiAoICFnZXRHcmFtbWFySXNSb290KCkgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hcldhcm5pbmcoRXJyb3JNYW5hZ2VyLk1TR19UT0tFTl9WT0NBQl9JTl9ERUxFR0FURSwKKwkJCQkJCQkJCQl0aGlzLAorCQkJCQkJCQkJCXRva2VuVm9jYWJPcHRpb25BU1QudG9rZW4sCisJCQkJCQkJCQkJbmFtZSk7CisJCQlyZXR1cm4gY29tcG9zaXRlLm1heFRva2VuVHlwZTsKKwkJfQorCisJCUZpbGUgZnVsbEZpbGUgPSB0b29sLmdldEltcG9ydGVkVm9jYWJGaWxlKHZvY2FiTmFtZSk7CisJCXRyeSB7CisJCQlGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIoZnVsbEZpbGUpOworCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOworCQkJU3RyZWFtVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJlYW1Ub2tlbml6ZXIoYnIpOworCQkJdG9rZW5pemVyLnBhcnNlTnVtYmVycygpOworCQkJdG9rZW5pemVyLndvcmRDaGFycygnXycsICdfJyk7CisJCQl0b2tlbml6ZXIuZW9sSXNTaWduaWZpY2FudCh0cnVlKTsKKwkJCXRva2VuaXplci5zbGFzaFNsYXNoQ29tbWVudHModHJ1ZSk7CisJCQl0b2tlbml6ZXIuc2xhc2hTdGFyQ29tbWVudHModHJ1ZSk7CisJCQl0b2tlbml6ZXIub3JkaW5hcnlDaGFyKCc9Jyk7CisJCQl0b2tlbml6ZXIucXVvdGVDaGFyKCdcJycpOworCQkJdG9rZW5pemVyLndoaXRlc3BhY2VDaGFycygnICcsJyAnKTsKKwkJCXRva2VuaXplci53aGl0ZXNwYWNlQ2hhcnMoJ1x0JywnXHQnKTsKKwkJCWludCBsaW5lTnVtID0gMTsKKwkJCWludCB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCXdoaWxlICh0b2tlbiAhPSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GKSB7CisJCQkJU3RyaW5nIHRva2VuSUQ7CisJCQkJaWYgKCB0b2tlbiA9PSBTdHJlYW1Ub2tlbml6ZXIuVFRfV09SRCApIHsKKwkJCQkJdG9rZW5JRCA9IHRva2VuaXplci5zdmFsOworCQkJCX0KKwkJCQllbHNlIGlmICggdG9rZW4gPT0gJ1wnJyApIHsKKwkJCQkJdG9rZW5JRCA9ICInIit0b2tlbml6ZXIuc3ZhbCsiJyI7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19UT0tFTlNfRklMRV9TWU5UQVhfRVJST1IsCisJCQkJCQkJCQkgICB2b2NhYk5hbWUrQ29kZUdlbmVyYXRvci5WT0NBQl9GSUxFX0VYVEVOU0lPTiwKKwkJCQkJCQkJCSAgIFV0aWxzLmludGVnZXIobGluZU51bSkpOworCQkJCQl3aGlsZSAoIHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9MICkgezt9CisJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJaWYgKCB0b2tlbiAhPSAnPScgKSB7CisJCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX1RPS0VOU19GSUxFX1NZTlRBWF9FUlJPUiwKKwkJCQkJCQkJCSAgIHZvY2FiTmFtZStDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OLAorCQkJCQkJCQkJICAgVXRpbHMuaW50ZWdlcihsaW5lTnVtKSk7CisJCQkJCXdoaWxlICggdG9rZW5pemVyLm5leHRUb2tlbigpICE9IFN0cmVhbVRva2VuaXplci5UVF9FT0wgKSB7O30KKwkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsgLy8gc2tpcCAnPScKKwkJCQlpZiAoIHRva2VuICE9IFN0cmVhbVRva2VuaXplci5UVF9OVU1CRVIgKSB7CisJCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX1RPS0VOU19GSUxFX1NZTlRBWF9FUlJPUiwKKwkJCQkJCQkJCSAgIHZvY2FiTmFtZStDb2RlR2VuZXJhdG9yLlZPQ0FCX0ZJTEVfRVhURU5TSU9OLAorCQkJCQkJCQkJICAgVXRpbHMuaW50ZWdlcihsaW5lTnVtKSk7CisJCQkJCXdoaWxlICggdG9rZW5pemVyLm5leHRUb2tlbigpICE9IFN0cmVhbVRva2VuaXplci5UVF9FT0wgKSB7O30KKwkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpbnQgdG9rZW5UeXBlID0gKGludCl0b2tlbml6ZXIubnZhbDsKKwkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaW1wb3J0ICIrdG9rZW5JRCsiPSIrdG9rZW5UeXBlKTsKKwkJCQljb21wb3NpdGUubWF4VG9rZW5UeXBlID0gTWF0aC5tYXgoY29tcG9zaXRlLm1heFRva2VuVHlwZSx0b2tlblR5cGUpOworCQkJCWRlZmluZVRva2VuKHRva2VuSUQsIHRva2VuVHlwZSk7CisJCQkJbGluZU51bSsrOworCQkJCWlmICggdG9rZW4gIT0gU3RyZWFtVG9rZW5pemVyLlRUX0VPTCApIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfVE9LRU5TX0ZJTEVfU1lOVEFYX0VSUk9SLAorCQkJCQkJCQkJICAgdm9jYWJOYW1lK0NvZGVHZW5lcmF0b3IuVk9DQUJfRklMRV9FWFRFTlNJT04sCisJCQkJCQkJCQkgICBVdGlscy5pbnRlZ2VyKGxpbmVOdW0pKTsKKwkJCQkJd2hpbGUgKCB0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gU3RyZWFtVG9rZW5pemVyLlRUX0VPTCApIHs7fQorCQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOyAvLyBza2lwIG5ld2xpbmUKKwkJCX0KKwkJCWJyLmNsb3NlKCk7CisJCX0KKwkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19DQU5OT1RfRklORF9UT0tFTlNfRklMRSwKKwkJCQkJCQkgICBmdWxsRmlsZSk7CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfRVJST1JfUkVBRElOR19UT0tFTlNfRklMRSwKKwkJCQkJCQkgICBmdWxsRmlsZSwKKwkJCQkJCQkgICBpb2UpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfRVJST1JfUkVBRElOR19UT0tFTlNfRklMRSwKKwkJCQkJCQkgICBmdWxsRmlsZSwKKwkJCQkJCQkgICBlKTsKKwkJfQorCQlyZXR1cm4gY29tcG9zaXRlLm1heFRva2VuVHlwZTsKKwl9CisKKwkvKiogR2l2ZW4gYSB0b2tlbiB0eXBlLCBnZXQgYSBtZWFuaW5nZnVsIG5hbWUgZm9yIGl0IHN1Y2ggYXMgdGhlIElECisJICogIG9yIHN0cmluZyBsaXRlcmFsLiAgSWYgdGhpcyBpcyBhIGxleGVyIGFuZCB0aGUgdHR5cGUgaXMgaW4gdGhlCisJICogIGNoYXIgdm9jYWJ1bGFyeSwgY29tcHV0ZSBhbiBBTlRMUi12YWxpZCAocG9zc2libHkgZXNjYXBlZCkgY2hhciBsaXRlcmFsLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5EaXNwbGF5TmFtZShpbnQgdHR5cGUpIHsKKwkJU3RyaW5nIHRva2VuTmFtZSA9IG51bGw7CisJCWludCBpbmRleD0wOworCQkvLyBpbnNpZGUgYW55IHRhcmdldCdzIGNoYXIgcmFuZ2UgYW5kIGlzIGxleGVyIGdyYW1tYXI/CisJCWlmICggdGhpcy50eXBlPT1MRVhFUiAmJgorCQkJIHR0eXBlID49IExhYmVsLk1JTl9DSEFSX1ZBTFVFICYmIHR0eXBlIDw9IExhYmVsLk1BWF9DSEFSX1ZBTFVFICkKKwkJeworCQkJcmV0dXJuIGdldEFOVExSQ2hhckxpdGVyYWxGb3JDaGFyKHR0eXBlKTsKKwkJfQorCQkvLyBmYXV4IGxhYmVsPworCQllbHNlIGlmICggdHR5cGU8MCApIHsKKwkJCXRva2VuTmFtZSA9IChTdHJpbmcpY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdC5nZXQoTGFiZWwuTlVNX0ZBVVhfTEFCRUxTK3R0eXBlKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIGNvbXB1dGUgaW5kZXggaW4gdHlwZVRvVG9rZW5MaXN0IGZvciB0dHlwZQorCQkJaW5kZXggPSB0dHlwZS0xOyAvLyBub3JtYWxpemUgdG8gMC4ubi0xCisJCQlpbmRleCArPSBMYWJlbC5OVU1fRkFVWF9MQUJFTFM7ICAgICAvLyBqdW1wIG92ZXIgZmF1eCB0b2tlbnMKKworCQkJaWYgKCBpbmRleDxjb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0LnNpemUoKSApIHsKKwkJCQl0b2tlbk5hbWUgPSAoU3RyaW5nKWNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QuZ2V0KGluZGV4KTsKKwkJCQlpZiAoIHRva2VuTmFtZSE9bnVsbCAmJgorCQkJCQkgdG9rZW5OYW1lLnN0YXJ0c1dpdGgoQVVUT19HRU5FUkFURURfVE9LRU5fTkFNRV9QUkVGSVgpICkKKwkJCQl7CisJCQkJCXRva2VuTmFtZSA9IGNvbXBvc2l0ZS50eXBlVG9TdHJpbmdMaXRlcmFsTGlzdC5nZXQodHR5cGUpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXRva2VuTmFtZSA9IFN0cmluZy52YWx1ZU9mKHR0eXBlKTsKKwkJCX0KKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0VG9rZW5EaXNwbGF5TmFtZSB0dHlwZT0iK3R0eXBlKyIsIGluZGV4PSIraW5kZXgrIiwgbmFtZT0iK3Rva2VuTmFtZSk7CisJCXJldHVybiB0b2tlbk5hbWU7CisJfQorCisJLyoqIEdldCB0aGUgbGlzdCBvZiBBTlRMUiBTdHJpbmcgbGl0ZXJhbHMgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3RyaW5nTGl0ZXJhbHMoKSB7CisJCXJldHVybiBjb21wb3NpdGUuc3RyaW5nTGl0ZXJhbFRvVHlwZU1hcC5rZXlTZXQoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJUeXBlU3RyaW5nKCkgeworCQlyZXR1cm4gZ3JhbW1hclR5cGVUb1N0cmluZ1t0eXBlXTsKKwl9CisKKwlwdWJsaWMgaW50IGdldEdyYW1tYXJNYXhMb29rYWhlYWQoKSB7CisJCWlmICggZ2xvYmFsX2s+PTAgKSB7CisJCQlyZXR1cm4gZ2xvYmFsX2s7CisJCX0KKwkJT2JqZWN0IGsgPSBnZXRPcHRpb24oImsiKTsKKwkJaWYgKCBrPT1udWxsICkgeworCQkJZ2xvYmFsX2sgPSAwOworCQl9CisJCWVsc2UgaWYgKGsgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQlJbnRlZ2VyIGtJID0gKEludGVnZXIpazsKKwkJCWdsb2JhbF9rID0ga0kuaW50VmFsdWUoKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIG11c3QgYmUgU3RyaW5nICIqIgorCQkJaWYgKCBrLmVxdWFscygiKiIpICkgeyAgLy8gdGhpcyB0aGUgZGVmYXVsdCBhbnl3YXkKKwkJCQlnbG9iYWxfayA9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdsb2JhbF9rOworCX0KKworCS8qKiBTYXZlIHRoZSBvcHRpb24ga2V5L3ZhbHVlIHBhaXIgYW5kIHByb2Nlc3MgaXQ7IHJldHVybiB0aGUga2V5CisJICogIG9yIG51bGwgaWYgaW52YWxpZCBvcHRpb24uCisJICovCisJcHVibGljIFN0cmluZyBzZXRPcHRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBUb2tlbiBvcHRpb25zU3RhcnRUb2tlbikgeworCQlpZiAoIGxlZ2FsT3B0aW9uKGtleSkgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfSUxMRUdBTF9PUFRJT04sCisJCQkJCQkJCQkgIHRoaXMsCisJCQkJCQkJCQkgIG9wdGlvbnNTdGFydFRva2VuLAorCQkJCQkJCQkJICBrZXkpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKCAhb3B0aW9uSXNWYWxpZChrZXksIHZhbHVlKSApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisgICAgICAgIGlmICgga2V5LmVxdWFscygiYmFja3RyYWNrIikgJiYgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoInRydWUiKSApIHsKKyAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRSb290R3JhbW1hcigpLmF0TGVhc3RPbmVCYWNrdHJhY2tPcHRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICggb3B0aW9ucz09bnVsbCApIHsKKwkJCW9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworCQl9CisJCW9wdGlvbnMucHV0KGtleSwgdmFsdWUpOworCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyBib29sZWFuIGxlZ2FsT3B0aW9uKFN0cmluZyBrZXkpIHsKKwkJc3dpdGNoICggdHlwZSApIHsKKwkJCWNhc2UgTEVYRVIgOgorCQkJCXJldHVybiAhbGVnYWxMZXhlck9wdGlvbnMuY29udGFpbnMoa2V5KTsKKwkJCWNhc2UgUEFSU0VSIDoKKwkJCQlyZXR1cm4gIWxlZ2FsUGFyc2VyT3B0aW9ucy5jb250YWlucyhrZXkpOworCQkJY2FzZSBUUkVFX1BBUlNFUiA6CisJCQkJcmV0dXJuICFsZWdhbFRyZWVQYXJzZXJPcHRpb25zLmNvbnRhaW5zKGtleSk7CisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gIWxlZ2FsUGFyc2VyT3B0aW9ucy5jb250YWlucyhrZXkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2V0T3B0aW9ucyhNYXAgb3B0aW9ucywgVG9rZW4gb3B0aW9uc1N0YXJ0VG9rZW4pIHsKKwkJaWYgKCBvcHRpb25zPT1udWxsICkgeworCQkJdGhpcy5vcHRpb25zID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQorCQlTZXQga2V5cyA9IG9wdGlvbnMua2V5U2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyBvcHRpb25OYW1lID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJT2JqZWN0IG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQob3B0aW9uTmFtZSk7CisJCQlTdHJpbmcgc3RvcmVkPXNldE9wdGlvbihvcHRpb25OYW1lLCBvcHRpb25WYWx1ZSwgb3B0aW9uc1N0YXJ0VG9rZW4pOworCQkJaWYgKCBzdG9yZWQ9PW51bGwgKSB7CisJCQkJaXQucmVtb3ZlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldE9wdGlvbihTdHJpbmcga2V5KSB7CisJCXJldHVybiBjb21wb3NpdGUuZ2V0T3B0aW9uKGtleSk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRMb2NhbGx5RGVmaW5lZE9wdGlvbihTdHJpbmcga2V5KSB7CisJCU9iamVjdCB2YWx1ZSA9IG51bGw7CisJCWlmICggb3B0aW9ucyE9bnVsbCApIHsKKwkJCXZhbHVlID0gb3B0aW9ucy5nZXQoa2V5KTsKKwkJfQorCQlpZiAoIHZhbHVlPT1udWxsICkgeworCQkJdmFsdWUgPSBkZWZhdWx0T3B0aW9ucy5nZXQoa2V5KTsKKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRCbG9ja09wdGlvbihHcmFtbWFyQVNUIGJsb2NrQVNULCBTdHJpbmcga2V5KSB7CisJCVN0cmluZyB2ID0gKFN0cmluZylibG9ja0FTVC5nZXRCbG9ja09wdGlvbihrZXkpOworCQlpZiAoIHYhPW51bGwgKSB7CisJCQlyZXR1cm4gdjsKKwkJfQorCQlpZiAoIHR5cGU9PUdyYW1tYXIuTEVYRVIgKSB7CisJCQlyZXR1cm4gZGVmYXVsdExleGVyQmxvY2tPcHRpb25zLmdldChrZXkpOworCQl9CisJCXJldHVybiBkZWZhdWx0QmxvY2tPcHRpb25zLmdldChrZXkpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0VXNlck1heExvb2thaGVhZChpbnQgZGVjaXNpb24pIHsKKwkJaW50IHVzZXJfayA9IDA7CisJCUdyYW1tYXJBU1QgYmxvY2tBU1QgPSBuZmEuZ3JhbW1hci5nZXREZWNpc2lvbkJsb2NrQVNUKGRlY2lzaW9uKTsKKwkJT2JqZWN0IGsgPSBibG9ja0FTVC5nZXRCbG9ja09wdGlvbigiayIpOworCQlpZiAoIGs9PW51bGwgKSB7CisJCQl1c2VyX2sgPSBuZmEuZ3JhbW1hci5nZXRHcmFtbWFyTWF4TG9va2FoZWFkKCk7CisJCQlyZXR1cm4gdXNlcl9rOworCQl9CisJCWlmIChrIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJSW50ZWdlciBrSSA9IChJbnRlZ2VyKWs7CisJCQl1c2VyX2sgPSBrSS5pbnRWYWx1ZSgpOworCQl9CisJCWVsc2UgeworCQkJLy8gbXVzdCBiZSBTdHJpbmcgIioiCisJCQlpZiAoIGsuZXF1YWxzKCIqIikgKSB7CisJCQkJdXNlcl9rID0gMDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdXNlcl9rOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldEF1dG9CYWNrdHJhY2tNb2RlKGludCBkZWNpc2lvbikgeworCQlORkFTdGF0ZSBkZWNpc2lvbk5GQVN0YXJ0U3RhdGUgPSBnZXREZWNpc2lvbk5GQVN0YXJ0U3RhdGUoZGVjaXNpb24pOworCQlTdHJpbmcgYXV0b0JhY2t0cmFjayA9CisJCQkoU3RyaW5nKWdldEJsb2NrT3B0aW9uKGRlY2lzaW9uTkZBU3RhcnRTdGF0ZS5hc3NvY2lhdGVkQVNUTm9kZSwgImJhY2t0cmFjayIpOworCisJCWlmICggYXV0b0JhY2t0cmFjaz09bnVsbCApIHsKKwkJCWF1dG9CYWNrdHJhY2sgPSAoU3RyaW5nKW5mYS5ncmFtbWFyLmdldE9wdGlvbigiYmFja3RyYWNrIik7CisJCX0KKwkJcmV0dXJuIGF1dG9CYWNrdHJhY2shPW51bGwmJmF1dG9CYWNrdHJhY2suZXF1YWxzKCJ0cnVlIik7CisJfQorCisJcHVibGljIGJvb2xlYW4gb3B0aW9uSXNWYWxpZChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gYnVpbGRBU1QoKSB7CisJCVN0cmluZyBvdXRwdXRUeXBlID0gKFN0cmluZylnZXRPcHRpb24oIm91dHB1dCIpOworCQlpZiAoIG91dHB1dFR5cGUhPW51bGwgKSB7CisJCQlyZXR1cm4gb3V0cHV0VHlwZS50b1N0cmluZygpLmVxdWFscygiQVNUIik7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIHJld3JpdGVNb2RlKCkgeworCQlPYmplY3Qgb3V0cHV0VHlwZSA9IGdldE9wdGlvbigicmV3cml0ZSIpOworCQlpZiAoIG91dHB1dFR5cGUhPW51bGwgKSB7CisJCQlyZXR1cm4gb3V0cHV0VHlwZS50b1N0cmluZygpLmVxdWFscygidHJ1ZSIpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0J1aWx0RnJvbVN0cmluZygpIHsKKwkJcmV0dXJuIGJ1aWx0RnJvbVN0cmluZzsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBidWlsZFRlbXBsYXRlKCkgeworCQlTdHJpbmcgb3V0cHV0VHlwZSA9IChTdHJpbmcpZ2V0T3B0aW9uKCJvdXRwdXQiKTsKKwkJaWYgKCBvdXRwdXRUeXBlIT1udWxsICkgeworCQkJcmV0dXJuIG91dHB1dFR5cGUudG9TdHJpbmcoKS5lcXVhbHMoInRlbXBsYXRlIik7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uPFJ1bGU+IGdldFJ1bGVzKCkgeworCQlyZXR1cm4gbmFtZVRvUnVsZU1hcC52YWx1ZXMoKTsKKwl9CisKKwkvKiogR2V0IHRoZSBzZXQgb2YgUnVsZXMgdGhhdCBuZWVkIHRvIGhhdmUgbWFudWFsIGRlbGVnYXRpb25zCisJICogIGxpa2UgInZvaWQgcnVsZSgpIHsgaW1wb3J0ZWRHcmFtbWFyLnJ1bGUoKTsgfSIKKwkgKgorCSAqICBJZiB0aGlzIGdyYW1tYXIgaXMgbWFzdGVyLCBnZXQgbGlzdCBvZiBhbGwgcnVsZSBkZWZpbml0aW9ucyBmcm9tIGFsbAorCSAqICBkZWxlZ2F0ZSBncmFtbWFycy4gIE9ubHkgbWFzdGVyIGhhcyBjb21wbGV0ZSBpbnRlcmZhY2UgZnJvbSBjb21iaW5lZAorCSAqICBncmFtbWFycy4uLndlIHdpbGwgZ2VuZXJhdGVkIGRlbGVnYXRlcyBhcyBoZWxwZXIgb2JqZWN0cy4KKwkgKgorCSAqICBDb21wb3NpdGUgZ3JhbW1hcnMgdGhhdCBhcmUgbm90IHRoZSByb290L21hc3RlciBkbyBub3QgaGF2ZSBjb21wbGV0ZQorCSAqICBpbnRlcmZhY2VzLiAgSXQgaXMgbm90IG15IGludGVudGlvbiB0aGF0IHBlb3BsZSB1c2Ugc3ViY29tcG9zaXRlcy4KKwkgKiAgT25seSB0aGUgb3V0ZXJtb3N0IGdyYW1tYXIgc2hvdWxkIGJlIHVzZWQgZnJvbSBvdXRzaWRlIGNvZGUuICBUaGUKKwkgKiAgb3RoZXIgZ3JhbW1hciBjb21wb25lbnRzIGFyZSBzcGVjaWZpY2FsbHkgZ2VuZXJhdGVkIHRvIHdvcmsgb25seQorCSAqICB3aXRoIHRoZSBtYXN0ZXIvcm9vdC4KKwkgKgorCSAqICBkZWxlZ2F0ZWRSdWxlcyA9IGltcG9ydGVkIC0gb3ZlcnJpZGRlbgorCSAqLworCXB1YmxpYyBTZXQ8UnVsZT4gZ2V0RGVsZWdhdGVkUnVsZXMoKSB7CisJCXJldHVybiBjb21wb3NpdGUuZ2V0RGVsZWdhdGVkUnVsZXModGhpcyk7CisJfQorCisJLyoqIEdldCBzZXQgb2YgYWxsIHJ1bGVzIGltcG9ydGVkIGZyb20gYWxsIGRlbGVnYXRlIGdyYW1tYXJzIGV2ZW4gaWYKKwkgKiAgaW5kaXJlY3RseSBkZWxlZ2F0ZWQuCisJICovCisJcHVibGljIFNldDxSdWxlPiBnZXRBbGxJbXBvcnRlZFJ1bGVzKCkgeworCQlyZXR1cm4gY29tcG9zaXRlLmdldEFsbEltcG9ydGVkUnVsZXModGhpcyk7CisJfQorCisJLyoqIEdldCBsaXN0IG9mIGFsbCBkZWxlZ2F0ZXMgZnJvbSBhbGwgZ3JhbW1hcnMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorCSAqICBpbXBvcnRlZCBpbnRvIHRoaXMgZ3JhbW1hci4KKwkgKi8KKwlwdWJsaWMgTGlzdDxHcmFtbWFyPiBnZXREZWxlZ2F0ZXMoKSB7CisJCXJldHVybiBjb21wb3NpdGUuZ2V0RGVsZWdhdGVzKHRoaXMpOworCX0KKworCXB1YmxpYyBib29sZWFuIGdldEhhc0RlbGVnYXRlcygpIHsKKwkgICByZXR1cm4gIWdldERlbGVnYXRlcygpLmlzRW1wdHkoKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldERlbGVnYXRlTmFtZXMoKSB7CisJCS8vIGNvbXB1dGUgZGVsZWdhdGVzOntHcmFtbWFyIGcgfCByZXR1cm4gZy5uYW1lO30KKwkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCUxpc3Q8R3JhbW1hcj4gZGVsZWdhdGVzID0gY29tcG9zaXRlLmdldERlbGVnYXRlcyh0aGlzKTsKKwkJaWYgKCBkZWxlZ2F0ZXMhPW51bGwgKSB7CisJCQlmb3IgKEdyYW1tYXIgZyA6IGRlbGVnYXRlcykgeworCQkJCW5hbWVzLmFkZChnLm5hbWUpOworCQkJfQorCQl9CisJCXJldHVybiBuYW1lczsKKwl9CisKKwlwdWJsaWMgTGlzdDxHcmFtbWFyPiBnZXREaXJlY3REZWxlZ2F0ZXMoKSB7CisJCXJldHVybiBjb21wb3NpdGUuZ2V0RGlyZWN0RGVsZWdhdGVzKHRoaXMpOworCX0KKworCS8qKiBHZXQgZGVsZWdhdGVzIGJlbG93IGRpcmVjdCBkZWxlZ2F0ZXMgKi8KKwlwdWJsaWMgTGlzdDxHcmFtbWFyPiBnZXRJbmRpcmVjdERlbGVnYXRlcygpIHsKKwkJcmV0dXJuIGNvbXBvc2l0ZS5nZXRJbmRpcmVjdERlbGVnYXRlcyh0aGlzKTsKKwl9CisKKwkvKiogR2V0IGxpc3Qgb2YgYWxsIGRlbGVnYXRvcnMuICBUaGlzIGFtb3VudHMgdG8gdGhlIGdyYW1tYXJzIG9uIHRoZSBwYXRoCisJICogIHRvIHRoZSByb290IG9mIHRoZSBkZWxlZ2F0aW9uIHRyZWUuCisJICovCisJcHVibGljIExpc3Q8R3JhbW1hcj4gZ2V0RGVsZWdhdG9ycygpIHsKKwkJcmV0dXJuIGNvbXBvc2l0ZS5nZXREZWxlZ2F0b3JzKHRoaXMpOworCX0KKworCS8qKiBXaG8ncyBteSBkaXJlY3QgcGFyZW50IGdyYW1tYXI/ICovCisJcHVibGljIEdyYW1tYXIgZ2V0RGVsZWdhdG9yKCkgeworCQlyZXR1cm4gY29tcG9zaXRlLmdldERlbGVnYXRvcih0aGlzKTsKKwl9CisKKwlwdWJsaWMgU2V0PFJ1bGU+IGdldERlbGVnYXRlZFJ1bGVSZWZlcmVuY2VzKCkgeworCQlyZXR1cm4gZGVsZWdhdGVkUnVsZVJlZmVyZW5jZXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gZ2V0R3JhbW1hcklzUm9vdCgpIHsKKwkJcmV0dXJuIGNvbXBvc2l0ZS5kZWxlZ2F0ZUdyYW1tYXJUcmVlUm9vdC5ncmFtbWFyID09IHRoaXM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UnVsZUFTVChTdHJpbmcgcnVsZU5hbWUsIEdyYW1tYXJBU1QgdCkgeworCQlSdWxlIHIgPSBnZXRMb2NhbGx5RGVmaW5lZFJ1bGUocnVsZU5hbWUpOworCQlpZiAoIHIhPW51bGwgKSB7CisJCQlyLnRyZWUgPSB0OworCQkJci5FT1JOb2RlID0gdC5nZXRMYXN0Q2hpbGQoKTsKKwkJfQorCX0KKworCXB1YmxpYyBORkFTdGF0ZSBnZXRSdWxlU3RhcnRTdGF0ZShTdHJpbmcgcnVsZU5hbWUpIHsKKwkJcmV0dXJuIGdldFJ1bGVTdGFydFN0YXRlKG51bGwsIHJ1bGVOYW1lKTsKKwl9CisKKwlwdWJsaWMgTkZBU3RhdGUgZ2V0UnVsZVN0YXJ0U3RhdGUoU3RyaW5nIHNjb3BlTmFtZSwgU3RyaW5nIHJ1bGVOYW1lKSB7CisJCVJ1bGUgciA9IGdldFJ1bGUoc2NvcGVOYW1lLCBydWxlTmFtZSk7CisJCWlmICggciE9bnVsbCApIHsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRSdWxlU3RhcnRTdGF0ZSgiK3Njb3BlTmFtZSsiLCAiK3J1bGVOYW1lKyIpPSIrci5zdGFydFN0YXRlKTsKKwkJCXJldHVybiByLnN0YXJ0U3RhdGU7CisJCX0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldFJ1bGVTdGFydFN0YXRlKCIrc2NvcGVOYW1lKyIsICIrcnVsZU5hbWUrIik9bnVsbCIpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFJ1bGVNb2RpZmllcihTdHJpbmcgcnVsZU5hbWUpIHsKKwkJUnVsZSByID0gZ2V0UnVsZShydWxlTmFtZSk7CisJCWlmICggciE9bnVsbCApIHsKKwkJCXJldHVybiByLm1vZGlmaWVyOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBORkFTdGF0ZSBnZXRSdWxlU3RvcFN0YXRlKFN0cmluZyBydWxlTmFtZSkgeworCQlSdWxlIHIgPSBnZXRSdWxlKHJ1bGVOYW1lKTsKKwkJaWYgKCByIT1udWxsICkgeworCQkJcmV0dXJuIHIuc3RvcFN0YXRlOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBpbnQgYXNzaWduRGVjaXNpb25OdW1iZXIoTkZBU3RhdGUgc3RhdGUpIHsKKwkJZGVjaXNpb25Db3VudCsrOworCQlzdGF0ZS5zZXREZWNpc2lvbk51bWJlcihkZWNpc2lvbkNvdW50KTsKKwkJcmV0dXJuIGRlY2lzaW9uQ291bnQ7CisJfQorCisJcHJvdGVjdGVkIERlY2lzaW9uIGdldERlY2lzaW9uKGludCBkZWNpc2lvbikgeworCQlpbnQgaW5kZXggPSBkZWNpc2lvbi0xOworCQlpZiAoIGluZGV4ID49IGluZGV4VG9EZWNpc2lvbi5zaXplKCkgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlEZWNpc2lvbiBkID0gaW5kZXhUb0RlY2lzaW9uLmdldChpbmRleCk7CisJCXJldHVybiBkOworCX0KKworCXB1YmxpYyBMaXN0PERlY2lzaW9uPiBnZXREZWNpc2lvbnMoKSB7CisJCXJldHVybiBpbmRleFRvRGVjaXNpb247CisJfQorCisJcHJvdGVjdGVkIERlY2lzaW9uIGNyZWF0ZURlY2lzaW9uKGludCBkZWNpc2lvbikgeworCQlpbnQgaW5kZXggPSBkZWNpc2lvbi0xOworCQlpZiAoIGluZGV4IDwgaW5kZXhUb0RlY2lzaW9uLnNpemUoKSApIHsKKwkJCXJldHVybiBnZXREZWNpc2lvbihkZWNpc2lvbik7IC8vIGRvbid0IHJlY3JlYXRlCisJCX0KKwkJRGVjaXNpb24gZCA9IG5ldyBEZWNpc2lvbigpOworCQlkLmRlY2lzaW9uID0gZGVjaXNpb247CisJCWQuZ3JhbW1hciA9IHRoaXM7CisJCWluZGV4VG9EZWNpc2lvbi5zZXRTaXplKGdldE51bWJlck9mRGVjaXNpb25zKCkpOworCQlpbmRleFRvRGVjaXNpb24uc2V0KGluZGV4LCBkKTsKKwkJcmV0dXJuIGQ7CisJfQorCisJcHVibGljIExpc3QgZ2V0RGVjaXNpb25ORkFTdGFydFN0YXRlTGlzdCgpIHsKKwkJTGlzdCBzdGF0ZXMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7CisJCWZvciAoaW50IGQgPSAwOyBkIDwgaW5kZXhUb0RlY2lzaW9uLnNpemUoKTsgZCsrKSB7CisJCQlEZWNpc2lvbiBkZWMgPSAoRGVjaXNpb24pIGluZGV4VG9EZWNpc2lvbi5nZXQoZCk7CisJCQlzdGF0ZXMuYWRkKGRlYy5zdGFydFN0YXRlKTsKKwkJfQorCQlyZXR1cm4gc3RhdGVzOworCX0KKworCXB1YmxpYyBORkFTdGF0ZSBnZXREZWNpc2lvbk5GQVN0YXJ0U3RhdGUoaW50IGRlY2lzaW9uKSB7CisJCURlY2lzaW9uIGQgPSBnZXREZWNpc2lvbihkZWNpc2lvbik7CisJCWlmICggZD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBkLnN0YXJ0U3RhdGU7CisJfQorCisJcHVibGljIERGQSBnZXRMb29rYWhlYWRERkEoaW50IGRlY2lzaW9uKSB7CisJCURlY2lzaW9uIGQgPSBnZXREZWNpc2lvbihkZWNpc2lvbik7CisJCWlmICggZD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBkLmRmYTsKKwl9CisKKwlwdWJsaWMgR3JhbW1hckFTVCBnZXREZWNpc2lvbkJsb2NrQVNUKGludCBkZWNpc2lvbikgeworCQlEZWNpc2lvbiBkID0gZ2V0RGVjaXNpb24oZGVjaXNpb24pOworCQlpZiAoIGQ9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZC5ibG9ja0FTVDsKKwl9CisKKwkvKiogcmV0dXJucyBhIGxpc3Qgb2YgY29sdW1uIG51bWJlcnMgZm9yIGFsbCBkZWNpc2lvbnMKKwkgKiAgb24gYSBwYXJ0aWN1bGFyIGxpbmUgc28gQU5UTFJXb3JrcyBjaG9vc2UgdGhlIGRlY2lzaW9uCisJICogIGRlcGVuZGluZyBvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnNvciAob3RoZXJ3aXNlLAorCSAqICBBTlRMUldvcmtzIGhhcyB0byBnaXZlIHRoZSAqZXhhY3QqIGxvY2F0aW9uIHdoaWNoCisJICogIGlzIG5vdCBlYXN5IGZyb20gdGhlIHVzZXIgcG9pbnQgb2YgdmlldykuCisJICoKKwkgKiAgVGhpcyBpcyBub3QgcGFydGljdWxhcmx5IGZhc3QgYXMgaXQgd2Fsa3MgZW50aXJlIGxpbmU6Y29sLT5ERkEgbWFwCisJICogIGxvb2tpbmcgZm9yIGEgcHJlZml4IG9mICJsaW5lOiIuCisJICovCisJcHVibGljIExpc3QgZ2V0TG9va2FoZWFkREZBQ29sdW1uc0ZvckxpbmVJbkZpbGUoaW50IGxpbmUpIHsKKwkJU3RyaW5nIHByZWZpeCA9IGxpbmUrIjoiOworCQlMaXN0IGNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvcihJdGVyYXRvciBpdGVyID0gbGluZUNvbHVtblRvTG9va2FoZWFkREZBTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQlpdGVyLmhhc05leHQoKTsgKSB7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZylpdGVyLm5leHQoKTsKKwkJCWlmKGtleS5zdGFydHNXaXRoKHByZWZpeCkpIHsKKwkJCQljb2x1bW5zLmFkZChJbnRlZ2VyLnZhbHVlT2Yoa2V5LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvbHVtbnM7CisJfQorCisJLyoqIFVzZWZ1bCBmb3IgQU5UTFJXb3JrcyB0byBtYXAgcG9zaXRpb24gaW4gZmlsZSB0byB0aGUgREZBIGZvciBkaXNwbGF5ICovCisJcHVibGljIERGQSBnZXRMb29rYWhlYWRERkFGcm9tUG9zaXRpb25JbkZpbGUoaW50IGxpbmUsIGludCBjb2wpIHsKKwkJcmV0dXJuIChERkEpbGluZUNvbHVtblRvTG9va2FoZWFkREZBTWFwLmdldCgKKwkJCW5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQobGluZSArICI6IikuYXBwZW5kKGNvbCkudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIE1hcCBnZXRMaW5lQ29sdW1uVG9Mb29rYWhlYWRERkFNYXAoKSB7CisJCXJldHVybiBsaW5lQ29sdW1uVG9Mb29rYWhlYWRERkFNYXA7CisJfQorCisJLyoKKwlwdWJsaWMgdm9pZCBzZXREZWNpc2lvbk9wdGlvbnMoaW50IGRlY2lzaW9uLCBNYXAgb3B0aW9ucykgeworCQlEZWNpc2lvbiBkID0gY3JlYXRlRGVjaXNpb24oZGVjaXNpb24pOworCQlkLm9wdGlvbnMgPSBvcHRpb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlY2lzaW9uT3B0aW9uKGludCBkZWNpc2lvbiwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCQlEZWNpc2lvbiBkID0gZ2V0RGVjaXNpb24oZGVjaXNpb24pOworCQlpZiAoIGQhPW51bGwgKSB7CisJCQlpZiAoIGQub3B0aW9ucz09bnVsbCApIHsKKwkJCQlkLm9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworCQkJfQorCQkJZC5vcHRpb25zLnB1dChuYW1lLHZhbHVlKTsKKwkJfQorCX0KKworCXB1YmxpYyBNYXAgZ2V0RGVjaXNpb25PcHRpb25zKGludCBkZWNpc2lvbikgeworCQlEZWNpc2lvbiBkID0gZ2V0RGVjaXNpb24oZGVjaXNpb24pOworCQlpZiAoIGQ9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gZC5vcHRpb25zOworICAgIH0KKyAgICAqLworCisJcHVibGljIGludCBnZXROdW1iZXJPZkRlY2lzaW9ucygpIHsKKwkJcmV0dXJuIGRlY2lzaW9uQ291bnQ7CisJfQorCisJcHVibGljIGludCBnZXROdW1iZXJPZkN5Y2xpY0RlY2lzaW9ucygpIHsKKwkJaW50IG4gPSAwOworCQlmb3IgKGludCBpPTE7IGk8PWdldE51bWJlck9mRGVjaXNpb25zKCk7IGkrKykgeworCQkJRGVjaXNpb24gZCA9IGdldERlY2lzaW9uKGkpOworCQkJaWYgKCBkLmRmYSE9bnVsbCAmJiBkLmRmYS5pc0N5Y2xpYygpICkgeworCQkJCW4rKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwkvKiogU2V0IHRoZSBsb29rYWhlYWQgREZBIGZvciBhIHBhcnRpY3VsYXIgZGVjaXNpb24uICBUaGlzIG1lYW5zCisJICogIHRoYXQgdGhlIGFwcHJvcHJpYXRlIEFTVCBub2RlIG11c3QgdXBkYXRlZCB0byBoYXZlIHRoZSBuZXcgbG9va2FoZWFkCisJICogIERGQS4gIFRoaXMgbWV0aG9kIGNvdWxkIGJlIHVzZWQgdG8gcHJvcGVybHkgc2V0IHRoZSBERkFzIHdpdGhvdXQKKwkgKiAgdXNpbmcgdGhlIGNyZWF0ZUxvb2thaGVhZERGQXMoKSBtZXRob2QuICBZb3UgY291bGQgZG8gdGhpcworCSAqCisJICogICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoIi4uLiIpOworCSAqICAgIGcuc2V0TG9va2FoZWFkKDEsIGRmYTEpOworCSAqICAgIGcuc2V0TG9va2FoZWFkKDIsIGRmYTIpOworCSAqICAgIC4uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldExvb2thaGVhZERGQShpbnQgZGVjaXNpb24sIERGQSBsb29rYWhlYWRERkEpIHsKKwkJRGVjaXNpb24gZCA9IGNyZWF0ZURlY2lzaW9uKGRlY2lzaW9uKTsKKwkJZC5kZmEgPSBsb29rYWhlYWRERkE7CisJCUdyYW1tYXJBU1QgYXN0ID0gZC5zdGFydFN0YXRlLmFzc29jaWF0ZWRBU1ROb2RlOworCQlhc3Quc2V0TG9va2FoZWFkREZBKGxvb2thaGVhZERGQSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVjaXNpb25ORkEoaW50IGRlY2lzaW9uLCBORkFTdGF0ZSBzdGF0ZSkgeworCQlEZWNpc2lvbiBkID0gY3JlYXRlRGVjaXNpb24oZGVjaXNpb24pOworCQlkLnN0YXJ0U3RhdGUgPSBzdGF0ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXREZWNpc2lvbkJsb2NrQVNUKGludCBkZWNpc2lvbiwgR3JhbW1hckFTVCBibG9ja0FTVCkgeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2V0RGVjaXNpb25CbG9ja0FTVCgiK2RlY2lzaW9uKyIsICIrYmxvY2tBU1QudG9rZW4pOworCQlEZWNpc2lvbiBkID0gY3JlYXRlRGVjaXNpb24oZGVjaXNpb24pOworCQlkLmJsb2NrQVNUID0gYmxvY2tBU1Q7CisJfQorCisJcHVibGljIGJvb2xlYW4gYWxsRGVjaXNpb25ERkFIYXZlQmVlbkNyZWF0ZWQoKSB7CisJCXJldHVybiBhbGxEZWNpc2lvbkRGQUNyZWF0ZWQ7CisJfQorCisJLyoqIEhvdyBtYW55IHRva2VuIHR5cGVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgc28gZmFyPyAqLworCXB1YmxpYyBpbnQgZ2V0TWF4VG9rZW5UeXBlKCkgeworCQlyZXR1cm4gY29tcG9zaXRlLm1heFRva2VuVHlwZTsKKwl9CisKKwkvKiogV2hhdCBpcyB0aGUgbWF4IGNoYXIgdmFsdWUgcG9zc2libGUgZm9yIHRoaXMgZ3JhbW1hcidzIHRhcmdldD8gIFVzZQorCSAqICB1bmljb2RlIG1heCBpZiBubyB0YXJnZXQgZGVmaW5lZC4KKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heENoYXJWYWx1ZSgpIHsKKwkJaWYgKCBnZW5lcmF0b3IhPW51bGwgKSB7CisJCQlyZXR1cm4gZ2VuZXJhdG9yLnRhcmdldC5nZXRNYXhDaGFyVmFsdWUoZ2VuZXJhdG9yKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBMYWJlbC5NQVhfQ0hBUl9WQUxVRTsKKwkJfQorCX0KKworCS8qKiBSZXR1cm4gYSBzZXQgb2YgYWxsIHBvc3NpYmxlIHRva2VuIG9yIGNoYXIgdHlwZXMgZm9yIHRoaXMgZ3JhbW1hciAqLworCXB1YmxpYyBJbnRTZXQgZ2V0VG9rZW5UeXBlcygpIHsKKwkJaWYgKCB0eXBlPT1MRVhFUiApIHsKKwkJCXJldHVybiBnZXRBbGxDaGFyVmFsdWVzKCk7CisJCX0KKwkJcmV0dXJuIEludGVydmFsU2V0Lm9mKExhYmVsLk1JTl9UT0tFTl9UWVBFLCBnZXRNYXhUb2tlblR5cGUoKSk7CisJfQorCisJLyoqIElmIHRoZXJlIGlzIGEgY2hhciB2b2NhYnVsYXJ5LCB1c2UgaXQ7IGVsc2UgcmV0dXJuIG1pbiB0byBtYXggY2hhcgorCSAqICBhcyBkZWZpbmVkIGJ5IHRoZSB0YXJnZXQuICBJZiBubyB0YXJnZXQsIHVzZSBtYXggdW5pY29kZSBjaGFyIHZhbHVlLgorCSAqLworCXB1YmxpYyBJbnRTZXQgZ2V0QWxsQ2hhclZhbHVlcygpIHsKKwkJaWYgKCBjaGFyVm9jYWJ1bGFyeSE9bnVsbCApIHsKKwkJCXJldHVybiBjaGFyVm9jYWJ1bGFyeTsKKwkJfQorCQlJbnRTZXQgYWxsQ2hhciA9IEludGVydmFsU2V0Lm9mKExhYmVsLk1JTl9DSEFSX1ZBTFVFLCBnZXRNYXhDaGFyVmFsdWUoKSk7CisJCXJldHVybiBhbGxDaGFyOworCX0KKworCS8qKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlc2NhcGVkIGNoYXIgZm9yIGNvZGUgYy4gIEUuZy4sIElmIGMKKwkgKiAgaGFzIHZhbHVlIDB4MTAwLCB5b3Ugd2lsbCBnZXQgIlx1MDEwMCIuICBBU0NJSSBnZXRzIHRoZSB1c3VhbAorCSAqICBjaGFyIChub24taGV4KSByZXByZXNlbnRhdGlvbi4gIENvbnRyb2wgY2hhcmFjdGVycyBhcmUgc3BpdCBvdXQKKwkgKiAgYXMgdW5pY29kZS4gIFdoaWxlIHRoaXMgaXMgc3BlY2lhbGx5IHNldCB1cCBmb3IgcmV0dXJuaW5nIEphdmEgc3RyaW5ncywKKwkgKiAgaXQgY2FuIGJlIHVzZWQgYnkgYW55IGxhbmd1YWdlIHRhcmdldCB0aGF0IGhhcyB0aGUgc2FtZSBzeW50YXguIDopCisJICoKKwkgKiAgMTEvMjYvMjAwNTogSSBjaGFuZ2VkIHRoaXMgdG8gdXNlIGRvdWJsZSBxdW90ZXMsIGNvbnNpc3RlbnQgd2l0aCBhbnRsci5nCisJICogIDEyLzA5LzIwMDU6IEkgY2hhbmdlZCBzbyBldmVyeXRoaW5nIGlzIHNpbmdsZSBxdW90ZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBTlRMUkNoYXJMaXRlcmFsRm9yQ2hhcihpbnQgYykgeworCQlpZiAoIGM8TGFiZWwuTUlOX0NIQVJfVkFMVUUgKSB7CisJCQlFcnJvck1hbmFnZXIuaW50ZXJuYWxFcnJvcigiaW52YWxpZCBjaGFyIHZhbHVlICIrYyk7CisJCQlyZXR1cm4gIic8SU5WQUxJRD4nIjsKKwkJfQorCQlpZiAoIGM8QU5UTFJMaXRlcmFsQ2hhclZhbHVlRXNjYXBlLmxlbmd0aCAmJiBBTlRMUkxpdGVyYWxDaGFyVmFsdWVFc2NhcGVbY10hPW51bGwgKSB7CisJCQlyZXR1cm4gJ1wnJytBTlRMUkxpdGVyYWxDaGFyVmFsdWVFc2NhcGVbY10rJ1wnJzsKKwkJfQorCQlpZiAoIENoYXJhY3Rlci5Vbmljb2RlQmxvY2sub2YoKGNoYXIpYyk9PUNoYXJhY3Rlci5Vbmljb2RlQmxvY2suQkFTSUNfTEFUSU4gJiYKKwkJCSAhQ2hhcmFjdGVyLmlzSVNPQ29udHJvbCgoY2hhciljKSApIHsKKwkJCWlmICggYz09J1xcJyApIHsKKwkJCQlyZXR1cm4gIidcXFxcJyI7CisJCQl9CisJCQlpZiAoIGM9PSdcJycpIHsKKwkJCQlyZXR1cm4gIidcXCcnIjsKKwkJCX0KKwkJCXJldHVybiAnXCcnK0NoYXJhY3Rlci50b1N0cmluZygoY2hhciljKSsnXCcnOworCQl9CisJCS8vIHR1cm4gb24gdGhlIGJpdCBhYm92ZSBtYXggIlx1RkZGRiIgdmFsdWUgc28gdGhhdCB3ZSBwYWQgd2l0aCB6ZXJvcworCQkvLyB0aGVuIG9ubHkgdGFrZSBsYXN0IDQgZGlnaXRzCisJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGN8MHgxMDAwMCkudG9VcHBlckNhc2UoKS5zdWJzdHJpbmcoMSw1KTsKKwkJU3RyaW5nIHVuaWNvZGVTdHIgPSAiJ1xcdSIraGV4KyInIjsKKwkJcmV0dXJuIHVuaWNvZGVTdHI7CisJfQorCisJLyoqIEZvciBsZXhlciBncmFtbWFycywgcmV0dXJuIGV2ZXJ5dGhpbmcgaW4gdW5pY29kZSBub3QgaW4gc2V0LgorCSAqICBGb3IgcGFyc2VyIGFuZCB0cmVlIGdyYW1tYXJzLCByZXR1cm4gZXZlcnl0aGluZyBpbiB0b2tlbiBzcGFjZQorCSAqICBmcm9tIE1JTl9UT0tFTl9UWVBFIHRvIGxhc3QgdmFsaWQgdG9rZW4gdHlwZSBvciBjaGFyIHZhbHVlLgorCSAqLworCXB1YmxpYyBJbnRTZXQgY29tcGxlbWVudChJbnRTZXQgc2V0KSB7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGVtZW50ICIrc2V0LnRvU3RyaW5nKHRoaXMpKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInZvY2FidWxhcnkgIitnZXRUb2tlblR5cGVzKCkudG9TdHJpbmcodGhpcykpOworCQlJbnRTZXQgYyA9IHNldC5jb21wbGVtZW50KGdldFRva2VuVHlwZXMoKSk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZXN1bHQ9IitjLnRvU3RyaW5nKHRoaXMpKTsKKwkJcmV0dXJuIGM7CisJfQorCisJcHVibGljIEludFNldCBjb21wbGVtZW50KGludCBhdG9tKSB7CisJCXJldHVybiBjb21wbGVtZW50KEludGVydmFsU2V0Lm9mKGF0b20pKTsKKwl9CisKKwkvKiogR2l2ZW4gc2V0IHRyZWUgbGlrZSAoIFNFVCBBIEIgKSwgY2hlY2sgdGhhdCBBIGFuZCBCCisJICogIGFyZSBib3RoIHZhbGlkIHNldHMgdGhlbXNlbHZlcywgZWxzZSB3ZSBtdXN0IHRyZWUgbGlrZSBhIEJMT0NLCisJICovCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZFNldChUcmVlVG9ORkFDb252ZXJ0ZXIgbmZhYnVpbGRlciwgR3JhbW1hckFTVCB0KSB7CisJCWJvb2xlYW4gdmFsaWQgPSB0cnVlOworCQl0cnkgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlIEJMT0NLIGFzIHNldCB0cmVlOiAiK3QudG9TdHJpbmdUcmVlKCkpOworCQkJaW50IGFsdHMgPSBuZmFidWlsZGVyLnRlc3RCbG9ja0FzU2V0KHQpOworCQkJdmFsaWQgPSBhbHRzID4gMTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJCS8vIFRoZSBydWxlIGRpZCBub3QgcGFyc2UgYXMgYSBzZXQsIHJldHVybiBudWxsOyBpZ25vcmUgZXhjZXB0aW9uCisJCQl2YWxpZCA9IGZhbHNlOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZD8gIit2YWxpZCk7CisJCXJldHVybiB2YWxpZDsKKwl9CisKKwkvKiogR2V0IHRoZSBzZXQgZXF1aXZhbGVudCAoaWYgYW55KSBvZiB0aGUgaW5kaWNhdGVkIHJ1bGUgZnJvbSB0aGlzCisJICogIGdyYW1tYXIuICBNb3N0bHkgdXNlZCBpbiB0aGUgbGV4ZXIgdG8gZG8gflQgZm9yIHNvbWUgZnJhZ21lbnQgcnVsZQorCSAqICBULiAgSWYgdGhlIHJ1bGUgQVNUIGhhcyBhIFNFVCB1c2UgdGhhdC4gIElmIHRoZSBydWxlIGlzIGEgc2luZ2xlIGNoYXIKKwkgKiAgY29udmVydCBpdCB0byBhIHNldCBhbmQgcmV0dXJuLiAgSWYgcnVsZSBpcyBub3QgYSBzaW1wbGUgc2V0ICh3L28gYWN0aW9ucykKKwkgKiAgdGhlbiByZXR1cm4gbnVsbC4KKwkgKiAgUnVsZXMgaGF2ZSBBU1QgZm9ybToKKwkgKgorCSAqCQleKCBSVUxFIElEIG1vZGlmaWVyIEFSRyBSRVQgU0NPUEUgYmxvY2sgRU9SICkKKwkgKi8KKwlwdWJsaWMgSW50U2V0IGdldFNldEZyb21SdWxlKFRyZWVUb05GQUNvbnZlcnRlciBuZmFidWlsZGVyLCBTdHJpbmcgcnVsZU5hbWUpCisJCXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorCXsKKwkJUnVsZSByID0gZ2V0UnVsZShydWxlTmFtZSk7CisJCWlmICggcj09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUludFNldCBlbGVtZW50cyA9IG51bGw7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJwYXJzZWQgdHJlZTogIityLnRyZWUudG9TdHJpbmdUcmVlKCkpOworCQllbGVtZW50cyA9IG5mYWJ1aWxkZXIuc2V0UnVsZShyLnRyZWUpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZWxlbWVudHM9IitlbGVtZW50cyk7CisJCXJldHVybiBlbGVtZW50czsKKwl9CisKKwkvKiogRGVjaXNpb25zIGFyZSBsaW5rZWQgdG9nZXRoZXIgd2l0aCB0cmFuc2l0aW9uKDEpLiAgQ291bnQgaG93CisJICogIG1hbnkgdGhlcmUgYXJlLiAgVGhpcyBpcyBoZXJlIHJhdGhlciB0aGFuIGluIE5GQVN0YXRlIGJlY2F1c2UKKwkgKiAgYSBncmFtbWFyIGRlY2lkZXMgaG93IE5GQXMgYXJlIHB1dCB0b2dldGhlciB0byBmb3JtIGEgZGVjaXNpb24uCisJICovCisJcHVibGljIGludCBnZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShORkFTdGF0ZSBkZWNpc2lvblN0YXRlKSB7CisJCWlmICggZGVjaXNpb25TdGF0ZT09bnVsbCApIHsKKwkJCXJldHVybiAwOworCQl9CisJCWludCBuID0gMTsKKwkJTkZBU3RhdGUgcCA9IGRlY2lzaW9uU3RhdGU7CisJCXdoaWxlICggcC50cmFuc2l0aW9uWzFdICE9bnVsbCApIHsKKwkJCW4rKzsKKwkJCXAgPSAoTkZBU3RhdGUpcC50cmFuc2l0aW9uWzFdLnRhcmdldDsKKwkJfQorCQlyZXR1cm4gbjsKKwl9CisKKwkvKiogR2V0IHRoZSBpdGggYWx0ZXJuYXRpdmUgKDEuLm4pIGZyb20gYSBkZWNpc2lvbjsgcmV0dXJuIG51bGwgd2hlbgorCSAqICBhbiBpbnZhbGlkIGFsdCBpcyByZXF1ZXN0ZWQuICBJIG11c3QgY291bnQgaW4gdG8gZmluZCB0aGUgcmlnaHQKKwkgKiAgYWx0ZXJuYXRpdmUgbnVtYmVyLiAgRm9yIChBfEIpLCB5b3UgZ2V0IE5GQSBzdHJ1Y3R1cmUgKHJvdWdobHkpOgorCSAqCisJICogIG8tPm8tQS0+bworCSAqICB8CisJICogIG8tPm8tQi0+bworCSAqCisJICogIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBsZWZ0bW9zdCBzdGF0ZSBmb3IgZWFjaCBhbHQuICBTbyBhbHQ9MSwgcmV0dXJucworCSAqICB0aGUgdXBwZXJsZWZ0IG1vc3Qgc3RhdGUgaW4gdGhpcyBzdHJ1Y3R1cmUuCisJICovCisJcHVibGljIE5GQVN0YXRlIGdldE5GQVN0YXRlRm9yQWx0T2ZEZWNpc2lvbihORkFTdGF0ZSBkZWNpc2lvblN0YXRlLCBpbnQgYWx0KSB7CisJCWlmICggZGVjaXNpb25TdGF0ZT09bnVsbCB8fCBhbHQ8PTAgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpbnQgbiA9IDE7CisJCU5GQVN0YXRlIHAgPSBkZWNpc2lvblN0YXRlOworCQl3aGlsZSAoIHAhPW51bGwgKSB7CisJCQlpZiAoIG49PWFsdCApIHsKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJCW4rKzsKKwkJCVRyYW5zaXRpb24gbmV4dCA9IHAudHJhbnNpdGlvblsxXTsKKwkJCXAgPSBudWxsOworCQkJaWYgKCBuZXh0IT1udWxsICkgeworCQkJCXAgPSAoTkZBU3RhdGUpbmV4dC50YXJnZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwlwdWJsaWMgdm9pZCBjb21wdXRlUnVsZUZPTExPV1NldHMoKSB7CisJCWlmICggZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKT09MCApIHsKKwkJCWNyZWF0ZU5GQXMoKTsKKwkJfQorCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UnVsZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlSdWxlIHIgPSAoUnVsZSlpdC5uZXh0KCk7CisJCQlpZiAoIHIuaXNTeW5QcmVkICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJTG9va2FoZWFkU2V0IHMgPSBsbDFBbmFseXplci5GT0xMT1cocik7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZPTExPVygiK3IubmFtZSsiKT0iK3MpOworCQl9CisJfQorCSovCisKKwlwdWJsaWMgTG9va2FoZWFkU2V0IEZJUlNUKE5GQVN0YXRlIHMpIHsKKwkJcmV0dXJuIGxsMUFuYWx5emVyLkZJUlNUKHMpOworCX0KKworCXB1YmxpYyBMb29rYWhlYWRTZXQgTE9PSyhORkFTdGF0ZSBzKSB7CisJCXJldHVybiBsbDFBbmFseXplci5MT09LKHMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvZGVHZW5lcmF0b3IoQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKKwkJdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7CisJfQorCisJcHVibGljIENvZGVHZW5lcmF0b3IgZ2V0Q29kZUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIGdlbmVyYXRvcjsKKwl9CisKKwlwdWJsaWMgR3JhbW1hckFTVCBnZXRHcmFtbWFyVHJlZSgpIHsKKwkJcmV0dXJuIGdyYW1tYXJUcmVlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJUcmVlKEdyYW1tYXJBU1QgdmFsdWUpIHsKKwkJZ3JhbW1hclRyZWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgVG9vbCBnZXRUb29sKCkgeworCQlyZXR1cm4gdG9vbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUb29sKFRvb2wgdG9vbCkgeworCQl0aGlzLnRvb2wgPSB0b29sOworCX0KKworCS8qKiBnaXZlbiBhIHRva2VuIHR5cGUgYW5kIHRoZSB0ZXh0IG9mIHRoZSBsaXRlcmFsLCBjb21lIHVwIHdpdGggYQorCSAqICBkZWNlbnQgdG9rZW4gdHlwZSBsYWJlbC4gIEZvciBub3cgaXQncyBqdXN0IFQ8dHlwZT4uICBBY3R1YWxseSwKKwkgKiAgaWYgdGhlcmUgaXMgYW4gYWxpYXNlZCBuYW1lIGZyb20gdG9rZW5zIGxpa2UgUExVUz0nKycsIHVzZSBpdC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbXB1dGVUb2tlbk5hbWVGcm9tTGl0ZXJhbChpbnQgdG9rZW5UeXBlLCBTdHJpbmcgbGl0ZXJhbCkgeworCQlyZXR1cm4gQVVUT19HRU5FUkFURURfVE9LRU5fTkFNRV9QUkVGSVggK3Rva2VuVHlwZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCS8vCXJldHVybiAiRkZGRkZGRkZGRkZGRkYiOworCQlyZXR1cm4gZ3JhbW1hclRyZWVUb1N0cmluZyhncmFtbWFyVHJlZSk7CisJfQorCisJcHVibGljIFN0cmluZyBncmFtbWFyVHJlZVRvU3RyaW5nKEdyYW1tYXJBU1QgdCkgeworCQlyZXR1cm4gZ3JhbW1hclRyZWVUb1N0cmluZyh0LCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdyYW1tYXJUcmVlVG9TdHJpbmcoR3JhbW1hckFTVCB0LCBib29sZWFuIHNob3dBY3Rpb25zKSB7CisJCVN0cmluZyBzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXMgPSB0LmdldExpbmUoKSsiOiIrKHQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkrMSkrIjogIjsKKwkJCXMgKz0gbmV3IEFOVExSVHJlZVByaW50ZXIobmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHQpKS50b1N0cmluZyh0aGlzLCBzaG93QWN0aW9ucyk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlzID0gIjxpbnZhbGlkIG9yIG1pc3NpbmcgdHJlZSBzdHJ1Y3R1cmU+IjsKKwkJfQorCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCBwcmludEdyYW1tYXIoUHJpbnRTdHJlYW0gb3V0cHV0KSB7CisJCUFOVExSVHJlZVByaW50ZXIgcHJpbnRlciA9IG5ldyBBTlRMUlRyZWVQcmludGVyKG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbShnZXRHcmFtbWFyVHJlZSgpKSk7CisJCXRyeSB7CisJCQlTdHJpbmcgZyA9IHByaW50ZXIudG9TdHJpbmcodGhpcywgZmFsc2UpOworCQkJb3V0cHV0LnByaW50bG4oZyk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19TWU5UQVhfRVJST1IscmUpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJBU1QuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hckFTVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzZjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJBU1QuamF2YQpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRGQTsKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuTkZBU3RhdGU7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50U2V0OworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludGVydmFsOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuU291cmNlOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvcjsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yLk9SQkluaXRJbmZvUGFja2FnZS5EdXBsaWNhdGVOYW1lOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiBHcmFtbWFycyBhcmUgZmlyc3QgY29udmVydGVkIHRvIEFTVHMgdXNpbmcgdGhpcyBjbGFzcyBhbmQgdGhlbiBhcmUKKyAqICBjb252ZXJ0ZWQgdG8gTkZBcyB2aWEgYSB0cmVlIHdhbGtlci4KKyAqCisgKiAgVGhlIHJlYWRlciBtYXkgbm90aWNlIHRoYXQgSSBoYXZlIG1hZGUgYSB2ZXJ5IG5vbi1PTyBkZWNpc2lvbiBpbiB0aGlzCisgKiAgY2xhc3MgdG8gdHJhY2sgdmFyaWFibGVzIGZvciBtYW55IGRpZmZlcmVudCBraW5kcyBvZiBub2Rlcy4gIEl0IHdhc3RlcworICogIHNwYWNlIGZvciBub2RlcyB0aGF0IGRvbid0IG5lZWQgdGhlIHZhbHVlcyBhbmQgT08gcHJpbmNpcGxlcyBjcnkgb3V0CisgKiAgZm9yIGEgbmV3IGNsYXNzIHR5cGUgZm9yIGVhY2gga2luZCBvZiBub2RlIGluIG15IHRyZWUuICBJIGFtIGRvaW5nIHRoaXMKKyAqICBvbiBwdXJwb3NlIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucy4gIEkgZG9uJ3QgbGlrZSB1c2luZyB0aGUgdHlwZQorICogIHN5c3RlbSBmb3IgZGlmZmVyZW50IG5vZGUgdHlwZXM7IGl0IHlpZWxkcyB0b28gbWFueSBkYW1uIGNsYXNzIGZpbGVzCisgKiAgd2hpY2ggSSBoYXRlLiAgUGVyaGFwcyBpZiBJIHB1dCB0aGVtIGFsbCBpbiBvbmUgZmlsZS4gIE1vc3QgaW1wb3J0YW50bHkKKyAqICB0aG91Z2ggSSBoYXRlIGFsbCB0aGUgdHlwZSBjYXN0aW5nIHRoYXQgd291bGQgaGF2ZSB0byBnbyBvbi4gIEkgd291bGQKKyAqICBoYXZlIGFsbCBzb3J0cyBvZiBleHRyYSB3b3JrIHRvIGRvLiAgSWNrLiAgQW55d2F5LCBJJ20gZG9pbmcgYWxsIHRoaXMKKyAqICBvbiBwdXJwb3NlLCBub3Qgb3V0IG9mIGlnbm9yYW5jZS4gOykKKyAqLworcHVibGljIGNsYXNzIEdyYW1tYXJBU1QgZXh0ZW5kcyBDb21tb25UcmVlIHsKKwlzdGF0aWMgaW50IGNvdW50ID0gMDsKKworCXB1YmxpYyBpbnQgSUQgPSArK2NvdW50OworCisJcHJpdmF0ZSBTdHJpbmcgdGV4dE92ZXJyaWRlOworCisgICAgcHVibGljIFN0cmluZyBlbmNsb3NpbmdSdWxlTmFtZTsKKworICAgIC8qKiBJZiB0aGlzIGlzIGEgZGVjaXNpb24gbm9kZSwgd2hhdCBpcyB0aGUgbG9va2FoZWFkIERGQT8gKi8KKyAgICBwdWJsaWMgREZBIGxvb2thaGVhZERGQSA9IG51bGw7CisKKyAgICAvKiogV2hhdCBORkEgc3RhcnQgc3RhdGUgd2FzIGJ1aWx0IGZyb20gdGhpcyBub2RlPyAqLworICAgIHB1YmxpYyBORkFTdGF0ZSBORkFTdGFydFN0YXRlID0gbnVsbDsKKworCS8qKiBUaGlzIGlzIHVzZWQgZm9yIFRSRUVfQkVHSU4gbm9kZXMgdG8gcG9pbnQgaW50bworCSAqICB0aGUgTkZBLiAgVFJFRV9CRUdJTnMgcG9pbnQgYXQgbGVmdCBlZGdlIG9mIERPV04gZm9yIExPT0sgY29tcHV0YXRpb24KKyAgICAgKiAgcHVycG9zZXMgKE51bGxhYmxlIHRyZWUgY2hpbGQgbGlzdCBuZWVkcyBzcGVjaWFsIGNvZGUgZ2VuIHdoZW4gbWF0Y2hpbmcpLgorCSAqLworCXB1YmxpYyBORkFTdGF0ZSBORkFUcmVlRG93blN0YXRlID0gbnVsbDsKKworCS8qKiBSdWxlIHJlZiBub2RlcywgdG9rZW4gcmVmcywgc2V0LCBhbmQgTk9UIHNldCByZWZzIG5lZWQgdG8gdHJhY2sgdGhlaXIKKwkgKiAgbG9jYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBORkEgc28gdGhhdCBsb2NhbCBGT0xMT1cgc2V0cyBjYW4gYmUKKwkgKiAgY29tcHV0ZWQgZHVyaW5nIGNvZGUgZ2VuIGZvciBhdXRvbWF0aWMgZXJyb3IgcmVjb3ZlcnkuCisJICovCisJcHVibGljIE5GQVN0YXRlIGZvbGxvd2luZ05GQVN0YXRlID0gbnVsbDsKKworCS8qKiBJZiB0aGlzIGlzIGEgU0VUIG5vZGUsIHdoYXQgYXJlIHRoZSBlbGVtZW50cz8gKi8KKyAgICBwcm90ZWN0ZWQgSW50U2V0IHNldFZhbHVlID0gbnVsbDsKKworICAgIC8qKiBJZiB0aGlzIGlzIGEgQkxPQ0sgbm9kZSwgdHJhY2sgb3B0aW9ucyBoZXJlICovCisgICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsT2JqZWN0PiBibG9ja09wdGlvbnM7CisKKwkvKiogSWYgdGhpcyBpcyBhIEJMT0NLIG5vZGUgZm9yIGEgcmV3cml0ZSBydWxlLCB0cmFjayByZWZlcmVuY2VkCisJICogIGVsZW1lbnRzIGhlcmUuICBEb24ndCB0cmFjayBlbGVtZW50cyBpbiBuZXN0ZWQgc3VicnVsZXMuCisJICovCisJcHVibGljIFNldDxHcmFtbWFyQVNUPiByZXdyaXRlUmVmc1NoYWxsb3c7CisKKwkvKglJZiBSRVdSSVRFIG5vZGUsIHRyYWNrIEVWRVJZIGVsZW1lbnQgYW5kIGxhYmVsIHJlZiB0byByaWdodCBvZiAtPgorCSAqICBmb3IgdGhpcyByZXdyaXRlIHJ1bGUuICBUaGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBwZXIKKwkgKiAgcnVsZToKKwkgKgorCSAqICAgICBhIDogKCAuLi4gLT4gLi4uIHwgLi4uIC0+IC4uLiApIC0+IC4uLiA7CisJICoKKwkgKiAgV2UgbWF5IG5lZWQgYSBsaXN0IG9mIGFsbCByZWZzIHRvIGRvIGRlZmluaXRpb25zIGZvciB3aG9sZSByZXdyaXRlCisJICogIGxhdGVyLgorCSAqCisJICogIElmIEJMT0NLIHRoZW4gdHJhY2tzIGV2ZXJ5IGVsZW1lbnQgYXQgdGhhdCBsZXZlbCBhbmQgYmVsb3cuCisJICovCisJcHVibGljIFNldDxHcmFtbWFyQVNUPiByZXdyaXRlUmVmc0RlZXA7CisKKwlwdWJsaWMgTWFwPFN0cmluZyxPYmplY3Q+IHRlcm1pbmFsT3B0aW9uczsKKworCS8qKiBpZiB0aGlzIGlzIGFuIEFDVElPTiBub2RlLCB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgZW5jbG9zaW5nCisJICogIGFsdCBudW0gaW4gcnVsZS4gIEZvciBhY3Rpb25zLCBkZWZpbmUuZyBzZXRzIHRoZXNlICh1c2VkIHRvCisJICogIGJlIGNvZGVnZW4uZykuICBXZSBuZWVkIHRoZXNlIHNldCBzbyB3ZSBjYW4gZXhhbWluZSBhY3Rpb25zCisJICogIGVhcmx5LCBiZWZvcmUgY29kZSBnZW4sIGZvciByZWZzIHRvIHJ1bGUgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzCisJICogIGFuZCBydWxlIGxhYmVscy4gIEZvciBtb3N0IHBhcnQgZGVmaW5lLmcgc2V0cyBvdXRlckFsdE51bSwgYnV0CisJICogIGNvZGVnZW4uZyBkb2VzIHRoZSBvbmVzIGZvciAlZm9vKGE9eyRJRC50ZXh0fSkgdHlwZSByZWZzIGFzCisJICogIHRoZSB7JElELi4ufSBpcyBub3Qgc2VlbiBhcyBhbiBhY3Rpb24gdW50aWwgY29kZSBnZW4gcHVsbHMgYXBhcnQuCisJICovCisJcHVibGljIGludCBvdXRlckFsdE51bTsKKworCS8qKiBpZiB0aGlzIGlzIGEgVE9LRU5fUkVGIG9yIFJVTEVfUkVGIG5vZGUsIHRoaXMgaXMgdGhlIGNvZGUgU1QKKwkgKiAgZ2VuZXJhdGVkIGZvciB0aGlzIG5vZGUuICBXZSBuZWVkIHRvIHVwZGF0ZSBpdCBsYXRlciB0byBhZGQKKwkgKiAgYSBsYWJlbCBpZiBzb21lb25lIGRvZXMgJHRva2VucmVmIG9yICRydWxlcmVmIGluIGFuIGFjdGlvbi4KKwkgKi8KKwlwdWJsaWMgU1QgY29kZTsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEJsb2NrT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrT3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBibG9ja09wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbG9ja09wdGlvbnMoTWFwPFN0cmluZywgT2JqZWN0PiBibG9ja09wdGlvbnMpIHsKKyAgICAgICAgdGhpcy5ibG9ja09wdGlvbnMgPSBibG9ja09wdGlvbnM7CisgICAgfQorCisJcHVibGljIEdyYW1tYXJBU1QoKSB7O30KKworCXB1YmxpYyBHcmFtbWFyQVNUKGludCB0LCBTdHJpbmcgdHh0KSB7CisJCWluaXRpYWxpemUodCx0eHQpOworCX0KKworCXB1YmxpYyBHcmFtbWFyQVNUKFRva2VuIHRva2VuKSB7CisJCWluaXRpYWxpemUodG9rZW4pOworCX0KKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoaW50IGksIFN0cmluZyBzKSB7CisgICAgICAgIHRva2VuID0gbmV3IENvbW1vblRva2VuKGkscyk7CisJCXRva2VuLnNldFRva2VuSW5kZXgoLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoVHJlZSBhc3QpIHsKKwkJR3JhbW1hckFTVCB0ID0gKChHcmFtbWFyQVNUKWFzdCk7CisJCXRoaXMuc3RhcnRJbmRleCA9IHQuc3RhcnRJbmRleDsKKwkJdGhpcy5zdG9wSW5kZXggPSB0LnN0b3BJbmRleDsKKwkJdGhpcy50b2tlbiA9IHQudG9rZW47CisJCXRoaXMuZW5jbG9zaW5nUnVsZU5hbWUgPSB0LmVuY2xvc2luZ1J1bGVOYW1lOworCQl0aGlzLnNldFZhbHVlID0gdC5zZXRWYWx1ZTsKKwkJdGhpcy5ibG9ja09wdGlvbnMgPSB0LmJsb2NrT3B0aW9uczsKKwkJdGhpcy5vdXRlckFsdE51bSA9IHQub3V0ZXJBbHROdW07CisJfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShUb2tlbiB0b2tlbikgeworICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CisJCWlmICggdG9rZW4hPW51bGwgKSB7CisJCQlzdGFydEluZGV4ID0gdG9rZW4uZ2V0VG9rZW5JbmRleCgpOworCQkJc3RvcEluZGV4ID0gc3RhcnRJbmRleDsKKwkJfQorICAgIH0KKworICAgIHB1YmxpYyBERkEgZ2V0TG9va2FoZWFkREZBKCkgeworICAgICAgICByZXR1cm4gbG9va2FoZWFkREZBOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvb2thaGVhZERGQShERkEgbG9va2FoZWFkREZBKSB7CisgICAgICAgIHRoaXMubG9va2FoZWFkREZBID0gbG9va2FoZWFkREZBOworICAgIH0KKworICAgIHB1YmxpYyBORkFTdGF0ZSBnZXRORkFTdGFydFN0YXRlKCkgeworICAgICAgICByZXR1cm4gTkZBU3RhcnRTdGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRORkFTdGFydFN0YXRlKE5GQVN0YXRlIG5mYVN0YXJ0U3RhdGUpIHsKKwkJdGhpcy5ORkFTdGFydFN0YXRlID0gbmZhU3RhcnRTdGF0ZTsKKwl9CisKKwkvKiogU2F2ZSB0aGUgb3B0aW9uIGtleS92YWx1ZSBwYWlyIGFuZCBwcm9jZXNzIGl0OyByZXR1cm4gdGhlIGtleQorCSAqICBvciBudWxsIGlmIGludmFsaWQgb3B0aW9uLgorCSAqLworCXB1YmxpYyBTdHJpbmcgc2V0QmxvY2tPcHRpb24oR3JhbW1hciBncmFtbWFyLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKCBibG9ja09wdGlvbnMgPT0gbnVsbCApIHsKKwkJCWJsb2NrT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CisJCX0KKwkJcmV0dXJuIHNldE9wdGlvbihibG9ja09wdGlvbnMsIEdyYW1tYXIubGVnYWxCbG9ja09wdGlvbnMsIGdyYW1tYXIsIGtleSwgdmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgc2V0VGVybWluYWxPcHRpb24oR3JhbW1hciBncmFtbWFyLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKCB0ZXJtaW5hbE9wdGlvbnMgPT0gbnVsbCApIHsKKwkJCXRlcm1pbmFsT3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZyxPYmplY3Q+KCk7CisJCX0KKwkJcmV0dXJuIHNldE9wdGlvbih0ZXJtaW5hbE9wdGlvbnMsIEdyYW1tYXIubGVnYWxUb2tlbk9wdGlvbnMsIGdyYW1tYXIsIGtleSwgdmFsdWUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgc2V0T3B0aW9uKE1hcCBvcHRpb25zLCBTZXQgbGVnYWxPcHRpb25zLCBHcmFtbWFyIGdyYW1tYXIsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworCQlpZiAoICFsZWdhbE9wdGlvbnMuY29udGFpbnMoa2V5KSApIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19JTExFR0FMX09QVElPTiwKKwkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCSAgdG9rZW4sCisJCQkJCQkJCQkgIGtleSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgeworCQkJU3RyaW5nIHZzID0gKFN0cmluZyl2YWx1ZTsKKwkJCWlmICggdnMuY2hhckF0KDApPT0nIicgKSB7CisJCQkJdmFsdWUgPSB2cy5zdWJzdHJpbmcoMSx2cy5sZW5ndGgoKS0xKTsgLy8gc3RyaXAgcXVvdGVzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJaWYgKCBrZXkuZXF1YWxzKCJrIikgKSB7CisJCQlncmFtbWFyLm51bWJlck9mTWFudWFsTG9va2FoZWFkT3B0aW9ucysrOworCQl9CisgICAgICAgIGlmICgga2V5LmVxdWFscygiYmFja3RyYWNrIikgJiYgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoInRydWUiKSApIHsKKyAgICAgICAgICAgIGdyYW1tYXIuY29tcG9zaXRlLmdldFJvb3RHcmFtbWFyKCkuYXRMZWFzdE9uZUJhY2t0cmFja09wdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgb3B0aW9ucy5wdXQoa2V5LCB2YWx1ZSk7CisJCXJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRCbG9ja09wdGlvbihTdHJpbmcga2V5KSB7CisJCU9iamVjdCB2YWx1ZSA9IG51bGw7CisJCWlmICggYmxvY2tPcHRpb25zICE9IG51bGwgKSB7CisJCQl2YWx1ZSA9IGJsb2NrT3B0aW9ucy5nZXQoa2V5KTsKKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhHcmFtbWFyIGdyYW1tYXIsIE1hcCBvcHRpb25zKSB7CisJCWlmICggb3B0aW9ucz09bnVsbCApIHsKKwkJCXRoaXMuYmxvY2tPcHRpb25zID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmdbXSBrZXlzID0gKFN0cmluZ1tdKW9wdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nW29wdGlvbnMuc2l6ZSgpXSk7CisJCWZvciAoU3RyaW5nIG9wdGlvbk5hbWUgOiBrZXlzKSB7CisJCQlTdHJpbmcgc3RvcmVkPSBzZXRCbG9ja09wdGlvbihncmFtbWFyLCBvcHRpb25OYW1lLCBvcHRpb25zLmdldChvcHRpb25OYW1lKSk7CisJCQlpZiAoIHN0b3JlZD09bnVsbCApIHsKKwkJCQlvcHRpb25zLnJlbW92ZShvcHRpb25OYW1lKTsKKwkJCX0KKwkJfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJaWYgKCB0ZXh0T3ZlcnJpZGUhPW51bGwgKSByZXR1cm4gdGV4dE92ZXJyaWRlOworICAgICAgICBpZiAoIHRva2VuIT1udWxsICkgeworICAgICAgICAgICAgcmV0dXJuIHRva2VuLmdldFRleHQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisJcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgeworCQl0b2tlbi5zZXRUeXBlKHR5cGUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKKwkJdGV4dE92ZXJyaWRlID0gdGV4dDsgLy8gZG9uJ3QgYWx0IHRva2VucyBhcyBvdGhlcnMgbWlnaHQgc2VlCisJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICBpZiAoIHRva2VuIT1udWxsICkgeworICAgICAgICAgICAgcmV0dXJuIHRva2VuLmdldFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRMaW5lKCkgeworCQlpbnQgbGluZT0wOworICAgICAgICBpZiAoIHRva2VuIT1udWxsICkgeworICAgICAgICAgICAgbGluZSA9IHRva2VuLmdldExpbmUoKTsKKyAgICAgICAgfQorCQlpZiAoIGxpbmU9PTAgKSB7CisJCQlUcmVlIGNoaWxkID0gZ2V0Q2hpbGQoMCk7CisJCQlpZiAoIGNoaWxkIT1udWxsICkgeworCQkJCWxpbmUgPSBjaGlsZC5nZXRMaW5lKCk7CisJCQl9CisJCX0KKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKXsKKwkJaW50IGNvbD0wOworICAgICAgICBpZiAoIHRva2VuIT1udWxsICkgeworICAgICAgICAgICAgY29sID0gdG9rZW4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisgICAgICAgIH0KKwkJaWYgKCBjb2w9PTAgKSB7CisJCQlUcmVlIGNoaWxkID0gZ2V0Q2hpbGQoMCk7CisJCQlpZiAoIGNoaWxkIT1udWxsICkgeworCQkJCWNvbCA9IGNoaWxkLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQkJfQorCQl9CisgICAgICAgIHJldHVybiBjb2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZSkgeworICAgICAgICB0b2tlbi5zZXRMaW5lKGxpbmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJQb3NpdGlvbkluTGluZShpbnQgdmFsdWUpeworICAgICAgICB0b2tlbi5zZXRDaGFyUG9zaXRpb25JbkxpbmUodmFsdWUpOworICAgIH0KKworIAlwdWJsaWMgSW50U2V0IGdldFNldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gc2V0VmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2V0VmFsdWUoSW50U2V0IHNldFZhbHVlKSB7CisgICAgICAgIHRoaXMuc2V0VmFsdWUgPSBzZXRWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3JhbW1hckFTVCBnZXRMYXN0Q2hpbGQoKSB7CisgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKEdyYW1tYXJBU1QpZ2V0Q2hpbGQoZ2V0Q2hpbGRDb3VudCgpIC0gMSk7CisgICAgfQorCisgICAgcHVibGljIEdyYW1tYXJBU1QgZ2V0TmV4dFNpYmxpbmcoKSB7CisgICAgICAgIHJldHVybiAoR3JhbW1hckFTVClnZXRQYXJlbnQoKS5nZXRDaGlsZChnZXRDaGlsZEluZGV4KCkgKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3JhbW1hckFTVCBnZXRMYXN0U2libGluZygpIHsKKyAgICAgICAgVHJlZSBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKCBwYXJlbnQ9PW51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEdyYW1tYXJBU1QpcGFyZW50LmdldENoaWxkKHBhcmVudC5nZXRDaGlsZENvdW50KCkgLSAxKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBHcmFtbWFyQVNUW10gZ2V0Q2hpbGRyZW5Bc0FycmF5KCkgeworICAgICAgICByZXR1cm4gKEdyYW1tYXJBU1RbXSlnZXRDaGlsZHJlbigpLnRvQXJyYXkobmV3IEdyYW1tYXJBU1RbZ2V0Q2hpbGRDb3VudCgpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3JhbW1hckFTVCBEZXNjZW5kYW50RG93bk5vZGUgPSBuZXcgR3JhbW1hckFTVChUb2tlbi5ET1dOLCAiRE9XTiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdyYW1tYXJBU1QgRGVzY2VuZGFudFVwTm9kZSA9IG5ldyBHcmFtbWFyQVNUKFRva2VuLlVQLCAiVVAiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxUcmVlPiBkZXNjZW5kYW50cyhUcmVlIHJvb3QpeworICAgICAgICByZXR1cm4gZGVzY2VuZGFudHMocm9vdCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxUcmVlPiBkZXNjZW5kYW50cyhUcmVlIHJvb3QsIGJvb2xlYW4gaW5zZXJ0RG93blVwTm9kZXMpeworICAgICAgICBMaXN0PFRyZWU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VHJlZT4oKTsKKyAgICAgICAgaW50IGNvdW50ID0gcm9vdC5nZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgaWYgKGluc2VydERvd25VcE5vZGVzKXsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQocm9vdCk7CisgICAgICAgICAgICByZXN1bHQuYWRkKERlc2NlbmRhbnREb3duTm9kZSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKXsKKyAgICAgICAgICAgICAgICBUcmVlIGNoaWxkID0gcm9vdC5nZXRDaGlsZChpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFRyZWUgc3ViY2hpbGQgOiBkZXNjZW5kYW50cyhjaGlsZCwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoc3ViY2hpbGQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuYWRkKERlc2NlbmRhbnRVcE5vZGUpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQocm9vdCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKyl7CisgICAgICAgICAgICAgICAgVHJlZSBjaGlsZCA9IHJvb3QuZ2V0Q2hpbGQoaSk7CisgICAgICAgICAgICAgICAgZm9yIChUcmVlIHN1YmNoaWxkIDogZGVzY2VuZGFudHMoY2hpbGQsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdWJjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCXB1YmxpYyBHcmFtbWFyQVNUIGZpbmRGaXJzdFR5cGUoaW50IHR0eXBlKSB7CisJCS8vIGNoZWNrIHRoaXMgbm9kZSAodGhlIHJvb3QpIGZpcnN0CisJCWlmICggdGhpcy5nZXRUeXBlKCk9PXR0eXBlICkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJLy8gZWxzZSBjaGVjayBjaGlsZHJlbgorCQlMaXN0PFRyZWU+IGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHModGhpcyk7CisJCWZvciAoVHJlZSBjaGlsZCA6IGRlc2NlbmRhbnRzKSB7CisJCQlpZiAoIGNoaWxkLmdldFR5cGUoKT09dHR5cGUgKSB7CisJCQkJcmV0dXJuIChHcmFtbWFyQVNUKWNoaWxkOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBMaXN0PEdyYW1tYXJBU1Q+IGZpbmRBbGxUeXBlKGludCB0dHlwZSkgeworCQlMaXN0PEdyYW1tYXJBU1Q+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxHcmFtbWFyQVNUPigpOworCQlfZmluZEFsbFR5cGUodHR5cGUsIG5vZGVzKTsKKwkJcmV0dXJuIG5vZGVzOworCX0KKworCXB1YmxpYyB2b2lkIF9maW5kQWxsVHlwZShpbnQgdHR5cGUsIExpc3Q8R3JhbW1hckFTVD4gbm9kZXMpIHsKKwkJLy8gY2hlY2sgdGhpcyBub2RlICh0aGUgcm9vdCkgZmlyc3QKKwkJaWYgKCB0aGlzLmdldFR5cGUoKT09dHR5cGUgKSBub2Rlcy5hZGQodGhpcyk7CisJCS8vIGNoZWNrIGNoaWxkcmVuCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRDb3VudCgpOyBpKyspeworCQkJR3JhbW1hckFTVCBjaGlsZCA9IChHcmFtbWFyQVNUKWdldENoaWxkKGkpOworCQkJY2hpbGQuX2ZpbmRBbGxUeXBlKHR0eXBlLCBub2Rlcyk7CisJCX0KKwl9CisKKyAgICAvKiogTWFrZSBub2RlcyB1bmlxdWUgYmFzZWQgdXBvbiBUb2tlbiBzbyB3ZSBjYW4gYWRkIHRoZW0gdG8gYSBTZXQ7IGlmCisJICogIG5vdCBhIEdyYW1tYXJBU1QsIGNoZWNrIHR5cGUuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhc3QpIHsKKwkJaWYgKCB0aGlzID09IGFzdCApIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICggIShhc3QgaW5zdGFuY2VvZiBHcmFtbWFyQVNUKSApIHsKKwkJCXJldHVybiB0aGlzLmdldFR5cGUoKSA9PSAoKFRyZWUpYXN0KS5nZXRUeXBlKCk7CisJCX0KKwkJR3JhbW1hckFTVCB0ID0gKEdyYW1tYXJBU1QpYXN0OworCQlyZXR1cm4gdG9rZW4uZ2V0TGluZSgpID09IHQuZ2V0TGluZSgpICYmCisJCQkgICB0b2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSA9PSB0LmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCX0KKworICAgIC8qKiBNYWtlIG5vZGVzIHVuaXF1ZSBiYXNlZCB1cG9uIFRva2VuIHNvIHdlIGNhbiBhZGQgdGhlbSB0byBhIFNldDsgaWYKKwkgKiAgbm90IGEgR3JhbW1hckFTVCwgY2hlY2sgdHlwZS4KKwkgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCl7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcmV0dXJuIHRva2VuLmhhc2hDb2RlKCk7CisgICAgfQorCisJLyoqIFNlZSBpZiB0cmVlIGhhcyBleGFjdCB0b2tlbiB0eXBlcyBhbmQgc3RydWN0dXJlOyBubyB0ZXh0ICovCisJcHVibGljIGJvb2xlYW4gaGFzU2FtZVRyZWVTdHJ1Y3R1cmUoVHJlZSBvdGhlcikgeworCQkvLyBjaGVjayByb290cyBmaXJzdC4KKwkJaWYgKHRoaXMuZ2V0VHlwZSgpICE9IG90aGVyLmdldFR5cGUoKSkgcmV0dXJuIGZhbHNlOworCQkvLyBpZiByb290cyBtYXRjaCwgZG8gZnVsbCBsaXN0IG1hdGNoIHRlc3Qgb24gY2hpbGRyZW4uCisJCUl0ZXJhdG9yPFRyZWU+IHRoaXNEZXNjZW5kYW50cyA9IGRlc2NlbmRhbnRzKHRoaXMsIHRydWUpLml0ZXJhdG9yKCk7CisJCUl0ZXJhdG9yPFRyZWU+IG90aGVyRGVzY2VuZGFudHMgPSBkZXNjZW5kYW50cyhvdGhlciwgdHJ1ZSkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKHRoaXNEZXNjZW5kYW50cy5oYXNOZXh0KCkpIHsKKwkJCWlmICghb3RoZXJEZXNjZW5kYW50cy5oYXNOZXh0KCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKHRoaXNEZXNjZW5kYW50cy5uZXh0KCkuZ2V0VHlwZSgpICE9IG90aGVyRGVzY2VuZGFudHMubmV4dCgpLmdldFR5cGUoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuICFvdGhlckRlc2NlbmRhbnRzLmhhc05leHQoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEdyYW1tYXJBU1QgZHVwKFRyZWUgdCkgeworCQlpZiAoIHQ9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlHcmFtbWFyQVNUIGR1cF90ID0gbmV3IEdyYW1tYXJBU1QoKTsKKwkJZHVwX3QuaW5pdGlhbGl6ZSh0KTsKKwkJcmV0dXJuIGR1cF90OworCX0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUcmVlIGR1cE5vZGUoKXsKKyAgICAgICAgcmV0dXJuIGR1cCh0aGlzKTsKKyAgICB9CisKKwkvKipEdXBsaWNhdGUgYSB0cmVlLCBhc3N1bWluZyB0aGlzIGlzIGEgcm9vdCBub2RlIG9mIGEgdHJlZS0tCisJICogZHVwbGljYXRlIHRoYXQgbm9kZSBhbmQgd2hhdCdzIGJlbG93OyBpZ25vcmUgc2libGluZ3Mgb2Ygcm9vdCBub2RlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgR3JhbW1hckFTVCBkdXBUcmVlTm9BY3Rpb25zKEdyYW1tYXJBU1QgdCwgR3JhbW1hckFTVCBwYXJlbnQpIHsKKwkJaWYgKCB0PT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJR3JhbW1hckFTVCByZXN1bHQgPSAoR3JhbW1hckFTVCl0LmR1cE5vZGUoKTsKKwkJZm9yIChHcmFtbWFyQVNUIHN1YmNoaWxkIDogZ2V0Q2hpbGRyZW5Gb3JEdXBUcmVlKHQpKSB7CisJCQlyZXN1bHQuYWRkQ2hpbGQoZHVwVHJlZU5vQWN0aW9ucyhzdWJjaGlsZCwgcmVzdWx0KSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMaXN0PEdyYW1tYXJBU1Q+IGdldENoaWxkcmVuRm9yRHVwVHJlZShHcmFtbWFyQVNUIHQpIHsKKwkJTGlzdDxHcmFtbWFyQVNUPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEdyYW1tYXJBU1Q+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdC5nZXRDaGlsZENvdW50KCk7IGkrKyl7CisJCQlHcmFtbWFyQVNUIGNoaWxkID0gKEdyYW1tYXJBU1QpdC5nZXRDaGlsZChpKTsKKwkJCWludCB0dHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKKwkJCWlmICh0dHlwZSA9PSBBTlRMUlBhcnNlci5SRVdSSVRFUyB8fCB0dHlwZSA9PSBBTlRMUlBhcnNlci5SRVdSSVRFIHx8IHR0eXBlPT1BTlRMUlBhcnNlci5BQ1RJT04pIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHR0eXBlID09IEFOVExSUGFyc2VyLkJBTkcgfHwgdHR5cGUgPT0gQU5UTFJQYXJzZXIuUk9PVCkgeworCQkJCWZvciAoR3JhbW1hckFTVCBzdWJjaGlsZCA6IGdldENoaWxkcmVuRm9yRHVwVHJlZShjaGlsZCkpCisJCQkJCXJlc3VsdC5hZGQoc3ViY2hpbGQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKKwkJCX0KKwkJfQorCQlpZiAoIHJlc3VsdC5zaXplKCk9PTEgJiYgcmVzdWx0LmdldCgwKS5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkVPQSAmJgorCQkJIHQuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5BTFQgKQorCQl7CisJCQkvLyBjYW4ndCBoYXZlIGFuIGVtcHR5IGFsdCwgaW5zZXJ0IGVwc2lsb24KKwkJCXJlc3VsdC5hZGQoMCwgbmV3IEdyYW1tYXJBU1QoQU5UTFJQYXJzZXIuRVBTSUxPTiwgImVwc2lsb24iKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgR3JhbW1hckFTVCBkdXBUcmVlKEdyYW1tYXJBU1QgdCkgeworCQlpZiAoIHQ9PW51bGwgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlHcmFtbWFyQVNUIHJvb3QgPSBkdXAodCk7CQkvLyBtYWtlIGNvcHkgb2Ygcm9vdAorCQkvLyBjb3B5IGFsbCBjaGlsZHJlbiBvZiByb290LgorCQlmb3IgKGludCBpPSAwOyBpIDwgdC5nZXRDaGlsZENvdW50KCk7IGkrKykgeworCQkJR3JhbW1hckFTVCBjaGlsZCA9IChHcmFtbWFyQVNUKXQuZ2V0Q2hpbGQoaSk7CisJCQlyb290LmFkZENoaWxkKGR1cFRyZWUoY2hpbGQpKTsKKwkJfQorCQlyZXR1cm4gcm9vdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUcmVlRW5jbG9zaW5nUnVsZU5hbWVEZWVwbHkoU3RyaW5nIHJuYW1lKSB7CisJCWVuY2xvc2luZ1J1bGVOYW1lID0gcm5hbWU7CisJCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgcmV0dXJuOworCQlmb3IgKE9iamVjdCBjaGlsZCA6IGdldENoaWxkcmVuKCkpIHsKKwkJCWlmICghKGNoaWxkIGluc3RhbmNlb2YgR3JhbW1hckFTVCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUdyYW1tYXJBU1QgZ3JhbW1hckFTVCA9IChHcmFtbWFyQVNUKWNoaWxkOworCQkJZ3JhbW1hckFTVC5zZXRUcmVlRW5jbG9zaW5nUnVsZU5hbWVEZWVwbHkocm5hbWUpOworCQl9CisJfQorCisJU3RyaW5nIHRvU3RyaW5nTGlzdCgpIHsKKwkJcmV0dXJuICIiOworCX0KKworCS8qKiBUcmFjayBzdGFydC9zdG9wIHRva2VuIGZvciBzdWJ0cmVlIHJvb3QgY3JlYXRlZCBmb3IgYSBydWxlLgorCSAqICBPbmx5IHdvcmtzIHdpdGggVHJlZSBub2Rlcy4gIEZvciBydWxlcyB0aGF0IG1hdGNoIG5vdGhpbmcsCisJICogIHNlZW1zIGxpa2UgdGhpcyB3aWxsIHlpZWxkIHN0YXJ0PWkgYW5kIHN0b3A9aS0xIGluIGEgbmlsIG5vZGUuCisJICogIE1pZ2h0IGJlIHVzZWZ1bCBpbmZvIHNvIEknbGwgbm90IGZvcmNlIHRvIGJlIGkuLmkuCisJICovCisJcHVibGljIHZvaWQgc2V0VG9rZW5Cb3VuZGFyaWVzKFRva2VuIHN0YXJ0VG9rZW4sIFRva2VuIHN0b3BUb2tlbikgeworCQlpZiAoIHN0YXJ0VG9rZW4hPW51bGwgKSBzdGFydEluZGV4ID0gc3RhcnRUb2tlbi5nZXRUb2tlbkluZGV4KCk7CisJCWlmICggc3RvcFRva2VuIT1udWxsICkgc3RvcEluZGV4ID0gc3RvcFRva2VuLmdldFRva2VuSW5kZXgoKTsKKwl9CisKKwlwdWJsaWMgR3JhbW1hckFTVCBnZXRCbG9ja0FMVChpbnQgaSkgeworCQlpZiAoIHRoaXMuZ2V0VHlwZSgpIT1BTlRMUlBhcnNlci5CTE9DSyApIHJldHVybiBudWxsOworCQlpbnQgYWx0cyA9IDA7CisJCWZvciAoaW50IGogPTAgOyBqIDwgZ2V0Q2hpbGRDb3VudCgpOyBqKyspIHsKKwkJCWlmIChnZXRDaGlsZChqKS5nZXRUeXBlKCkgPT0gQU5UTFJQYXJzZXIuQUxUKSB7CisJCQkJYWx0cysrOworCQkJfQorCQkJaWYgKGFsdHMgPT0gaSkgeworCQkJCXJldHVybiAoR3JhbW1hckFTVClnZXRDaGlsZChqKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJBbmFseXNpc0Fib3J0ZWRNZXNzYWdlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJBbmFseXNpc0Fib3J0ZWRNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkMWQxNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hckFuYWx5c2lzQWJvcnRlZE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuRGVjaXNpb25Qcm9iZTsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKKy8qKiBSZXBvcnRzIHRoZSBjb25kaXRpb24gdGhhdCBBTlRMUidzIExMKCopIGFuYWx5c2lzIGVuZ2luZSB0ZXJtaW5hdGVkCisgKiAgZWFybHkuCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFtbWFyQW5hbHlzaXNBYm9ydGVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgeworCXB1YmxpYyBEZWNpc2lvblByb2JlIHByb2JlOworCisJcHVibGljIEdyYW1tYXJBbmFseXNpc0Fib3J0ZWRNZXNzYWdlKERlY2lzaW9uUHJvYmUgcHJvYmUpIHsKKwkJc3VwZXIoRXJyb3JNYW5hZ2VyLk1TR19BTkFMWVNJU19BQk9SVEVEKTsKKwkJdGhpcy5wcm9iZSA9IHByb2JlOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCUdyYW1tYXJBU1QgZGVjaXNpb25BU1ROb2RlID0gcHJvYmUuZGZhLmdldERlY2lzaW9uQVNUTm9kZSgpOworCQlsaW5lID0gZGVjaXNpb25BU1ROb2RlLmdldExpbmUoKTsKKwkJY29sdW1uID0gZGVjaXNpb25BU1ROb2RlLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSBwcm9iZS5kZmEubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKTsKKwkJaWYgKCBmaWxlTmFtZSE9bnVsbCApIHsKKwkJCWZpbGUgPSBmaWxlTmFtZTsKKwkJfQorCQlTVCBzdCA9IGdldE1lc3NhZ2VUZW1wbGF0ZSgpOworCQlzdC5hZGQoImVuY2xvc2luZ1J1bGUiLAorCQkJCQkJcHJvYmUuZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpLmVuY2xvc2luZ1J1bGUubmFtZSk7CisKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKHN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hckRhbmdsaW5nU3RhdGVNZXNzYWdlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJEYW5nbGluZ1N0YXRlTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjBkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJEYW5nbGluZ1N0YXRlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkFTdGF0ZTsKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuRGVjaXNpb25Qcm9iZTsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIFJlcG9ydHMgYSBwb3RlbnRpYWwgcGFyc2luZyBpc3N1ZSB3aXRoIGEgZGVjaXNpb247IHRoZSBkZWNpc2lvbiBpcworICogIG5vbmRldGVybWluaXN0aWMgaW4gc29tZSB3YXkuCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFtbWFyRGFuZ2xpbmdTdGF0ZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgRGVjaXNpb25Qcm9iZSBwcm9iZTsKKwlwdWJsaWMgREZBU3RhdGUgcHJvYmxlbVN0YXRlOworCisJcHVibGljIEdyYW1tYXJEYW5nbGluZ1N0YXRlTWVzc2FnZShEZWNpc2lvblByb2JlIHByb2JlLAorCQkJCQkJCQkJICAgREZBU3RhdGUgcHJvYmxlbVN0YXRlKQorCXsKKwkJc3VwZXIoRXJyb3JNYW5hZ2VyLk1TR19EQU5HTElOR19TVEFURSk7CisJCXRoaXMucHJvYmUgPSBwcm9iZTsKKwkJdGhpcy5wcm9ibGVtU3RhdGUgPSBwcm9ibGVtU3RhdGU7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJR3JhbW1hckFTVCBkZWNpc2lvbkFTVE5vZGUgPSBwcm9iZS5kZmEuZ2V0RGVjaXNpb25BU1ROb2RlKCk7CisJCWxpbmUgPSBkZWNpc2lvbkFTVE5vZGUuZ2V0TGluZSgpOworCQljb2x1bW4gPSBkZWNpc2lvbkFTVE5vZGUuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCVN0cmluZyBmaWxlTmFtZSA9IHByb2JlLmRmYS5uZmEuZ3JhbW1hci5nZXRGaWxlTmFtZSgpOworCQlpZiAoIGZpbGVOYW1lIT1udWxsICkgeworCQkJZmlsZSA9IGZpbGVOYW1lOworCQl9CisJCUxpc3QgbGFiZWxzID0gcHJvYmUuZ2V0U2FtcGxlTm9uRGV0ZXJtaW5pc3RpY0lucHV0U2VxdWVuY2UocHJvYmxlbVN0YXRlKTsKKwkJU3RyaW5nIGlucHV0ID0gcHJvYmUuZ2V0SW5wdXRTZXF1ZW5jZURpc3BsYXkobGFiZWxzKTsKKwkJU1Qgc3QgPSBnZXRNZXNzYWdlVGVtcGxhdGUoKTsKKwkJTGlzdCBhbHRzID0gbmV3IEFycmF5TGlzdCgpOworCQlhbHRzLmFkZEFsbChwcm9ibGVtU3RhdGUuZ2V0QWx0U2V0KCkpOworCQlDb2xsZWN0aW9ucy5zb3J0KGFsdHMpOworCQlzdC5hZGQoImRhbmdsaW5nQWx0cyIsIGFsdHMpOworCQlzdC5hZGQoImlucHV0IiwgaW5wdXQpOworCisJCXJldHVybiBzdXBlci50b1N0cmluZyhzdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJJbnN1ZmZpY2llbnRQcmVkaWNhdGVzTWVzc2FnZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTZiZGMxCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuREZBU3RhdGU7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRlY2lzaW9uUHJvYmU7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgR3JhbW1hckluc3VmZmljaWVudFByZWRpY2F0ZXNNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7CisJcHVibGljIERlY2lzaW9uUHJvYmUgcHJvYmU7CisgICAgcHVibGljIE1hcDxJbnRlZ2VyLCBTZXQ8VG9rZW4+PiBhbHRUb0xvY2F0aW9uczsKKwlwdWJsaWMgREZBU3RhdGUgcHJvYmxlbVN0YXRlOworCisJcHVibGljIEdyYW1tYXJJbnN1ZmZpY2llbnRQcmVkaWNhdGVzTWVzc2FnZShEZWNpc2lvblByb2JlIHByb2JlLAorCQkJCQkJCQkJCQkJREZBU3RhdGUgcHJvYmxlbVN0YXRlLAorCQkJCQkJCQkJCQkJTWFwPEludGVnZXIsIFNldDxUb2tlbj4+IGFsdFRvTG9jYXRpb25zKQorCXsKKwkJc3VwZXIoRXJyb3JNYW5hZ2VyLk1TR19JTlNVRkZJQ0lFTlRfUFJFRElDQVRFUyk7CisJCXRoaXMucHJvYmUgPSBwcm9iZTsKKwkJdGhpcy5wcm9ibGVtU3RhdGUgPSBwcm9ibGVtU3RhdGU7CisJCXRoaXMuYWx0VG9Mb2NhdGlvbnMgPSBhbHRUb0xvY2F0aW9uczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlHcmFtbWFyQVNUIGRlY2lzaW9uQVNUTm9kZSA9IHByb2JlLmRmYS5nZXREZWNpc2lvbkFTVE5vZGUoKTsKKwkJbGluZSA9IGRlY2lzaW9uQVNUTm9kZS5nZXRMaW5lKCk7CisJCWNvbHVtbiA9IGRlY2lzaW9uQVNUTm9kZS5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gcHJvYmUuZGZhLm5mYS5ncmFtbWFyLmdldEZpbGVOYW1lKCk7CisJCWlmICggZmlsZU5hbWUhPW51bGwgKSB7CisJCQlmaWxlID0gZmlsZU5hbWU7CisJCX0KKwkJU1Qgc3QgPSBnZXRNZXNzYWdlVGVtcGxhdGUoKTsKKwkJLy8gY29udmVydCB0byBzdHJpbmcga2V5IHRvIGF2b2lkIDMuMSBTVCBidWcKKwkJTWFwPFN0cmluZywgU2V0PFRva2VuPj4gYWx0VG9Mb2NhdGlvbnNXaXRoU3RyaW5nS2V5ID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTZXQ8VG9rZW4+PigpOworCQlMaXN0PEludGVnZXI+IGFsdHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisJCWFsdHMuYWRkQWxsKGFsdFRvTG9jYXRpb25zLmtleVNldCgpKTsKKwkJQ29sbGVjdGlvbnMuc29ydChhbHRzKTsKKwkJZm9yIChJbnRlZ2VyIGFsdEkgOiBhbHRzKSB7CisJCQlhbHRUb0xvY2F0aW9uc1dpdGhTdHJpbmdLZXkucHV0KGFsdEkudG9TdHJpbmcoKSwgYWx0VG9Mb2NhdGlvbnMuZ2V0KGFsdEkpKTsKKwkJCS8qCisJCQlMaXN0PFN0cmluZz4gdG9rZW5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQlmb3IgKFRva2VuIHQgOiBhbHRUb0xvY2F0aW9ucy5nZXQoYWx0SSkpIHsKKwkJCQl0b2tlbnMuYWRkKHQudG9TdHJpbmcoKSk7CisJCQl9CisJCQlDb2xsZWN0aW9ucy5zb3J0KHRva2Vucyk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRva2Vucz1cbiIrdG9rZW5zKTsKKwkJCSovCisJCX0KKwkJc3QuYWRkKCJhbHRUb0xvY2F0aW9ucyIsIGFsdFRvTG9jYXRpb25zV2l0aFN0cmluZ0tleSk7CisKKwkJTGlzdDxMYWJlbD4gc2FtcGxlSW5wdXRMYWJlbHMgPSBwcm9ibGVtU3RhdGUuZGZhLnByb2JlLmdldFNhbXBsZU5vbkRldGVybWluaXN0aWNJbnB1dFNlcXVlbmNlKHByb2JsZW1TdGF0ZSk7CisJCVN0cmluZyBpbnB1dCA9IHByb2JsZW1TdGF0ZS5kZmEucHJvYmUuZ2V0SW5wdXRTZXF1ZW5jZURpc3BsYXkoc2FtcGxlSW5wdXRMYWJlbHMpOworCQlzdC5hZGQoInVwb24iLCBpbnB1dCk7CisKKwkJc3QuYWRkKCJoYXNQcmVkaWNhdGVCbG9ja2VkQnlBY3Rpb24iLCBwcm9ibGVtU3RhdGUuZGZhLmhhc1ByZWRpY2F0ZUJsb2NrZWRCeUFjdGlvbik7CisKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKHN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFyTm9uRGV0ZXJtaW5pc21NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkOTVhZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuREZBU3RhdGU7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRlY2lzaW9uUHJvYmU7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLk5GQVN0YXRlOworaW1wb3J0IG9yZy5hbnRsci5taXNjLlV0aWxzOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKiogUmVwb3J0cyBhIHBvdGVudGlhbCBwYXJzaW5nIGlzc3VlIHdpdGggYSBkZWNpc2lvbjsgdGhlIGRlY2lzaW9uIGlzCisgKiAgbm9uZGV0ZXJtaW5pc3RpYyBpbiBzb21lIHdheS4KKyAqLworcHVibGljIGNsYXNzIEdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgRGVjaXNpb25Qcm9iZSBwcm9iZTsKKyAgICBwdWJsaWMgREZBU3RhdGUgcHJvYmxlbVN0YXRlOworCisJcHVibGljIEdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2UoRGVjaXNpb25Qcm9iZSBwcm9iZSwKKwkJCQkJCQkJCQlERkFTdGF0ZSBwcm9ibGVtU3RhdGUpCisJeworCQlzdXBlcihFcnJvck1hbmFnZXIuTVNHX0dSQU1NQVJfTk9OREVURVJNSU5JU00pOworCQl0aGlzLnByb2JlID0gcHJvYmU7CisJCXRoaXMucHJvYmxlbVN0YXRlID0gcHJvYmxlbVN0YXRlOworCQkvLyBmbGlwIG1zZyBJRCBpZiBhbHRzIGFyZSBhY3R1YWxseSB0b2tlbiByZWZzIGluIFRva2VucyBydWxlCisJCWlmICggcHJvYmUuZGZhLmlzVG9rZW5zUnVsZURlY2lzaW9uKCkgKSB7CisJCQlzZXRNZXNzYWdlSUQoRXJyb3JNYW5hZ2VyLk1TR19UT0tFTl9OT05ERVRFUk1JTklTTSk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlHcmFtbWFyQVNUIGRlY2lzaW9uQVNUTm9kZSA9IHByb2JlLmRmYS5nZXREZWNpc2lvbkFTVE5vZGUoKTsKKwkJbGluZSA9IGRlY2lzaW9uQVNUTm9kZS5nZXRMaW5lKCk7CisJCWNvbHVtbiA9IGRlY2lzaW9uQVNUTm9kZS5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gcHJvYmUuZGZhLm5mYS5ncmFtbWFyLmdldEZpbGVOYW1lKCk7CisJCWlmICggZmlsZU5hbWUhPW51bGwgKSB7CisJCQlmaWxlID0gZmlsZU5hbWU7CisJCX0KKworCQlTVCBzdCA9IGdldE1lc3NhZ2VUZW1wbGF0ZSgpOworCQkvLyBOb3cgZmlsbCB0ZW1wbGF0ZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHByb2JsZW1TdGF0ZQorCQlMaXN0IGxhYmVscyA9IHByb2JlLmdldFNhbXBsZU5vbkRldGVybWluaXN0aWNJbnB1dFNlcXVlbmNlKHByb2JsZW1TdGF0ZSk7CisJCVN0cmluZyBpbnB1dCA9IHByb2JlLmdldElucHV0U2VxdWVuY2VEaXNwbGF5KGxhYmVscyk7CisJCXN0LmFkZCgiaW5wdXQiLCBpbnB1dCk7CisKKwkJaWYgKCBwcm9iZS5kZmEuaXNUb2tlbnNSdWxlRGVjaXNpb24oKSApIHsKKwkJCVNldCBkaXNhYmxlZEFsdHMgPSBwcm9iZS5nZXREaXNhYmxlZEFsdGVybmF0aXZlcyhwcm9ibGVtU3RhdGUpOworCQkJZm9yIChJdGVyYXRvciBpdCA9IGRpc2FibGVkQWx0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQkJSW50ZWdlciBhbHRJID0gKEludGVnZXIpIGl0Lm5leHQoKTsKKwkJCQlTdHJpbmcgdG9rZW5OYW1lID0KKwkJCQkJcHJvYmUuZ2V0VG9rZW5OYW1lRm9yVG9rZW5zUnVsZUFsdChhbHRJLmludFZhbHVlKCkpOworCQkJCS8vIHJlc2V0IHRoZSBsaW5lL2NvbCB0byB0aGUgdG9rZW4gZGVmaW5pdGlvbiAocGljayBsYXN0IG9uZSkKKwkJCQlORkFTdGF0ZSBydWxlU3RhcnQgPQorCQkJCQlwcm9iZS5kZmEubmZhLmdyYW1tYXIuZ2V0UnVsZVN0YXJ0U3RhdGUodG9rZW5OYW1lKTsKKwkJCQlsaW5lID0gcnVsZVN0YXJ0LmFzc29jaWF0ZWRBU1ROb2RlLmdldExpbmUoKTsKKwkJCQljb2x1bW4gPSBydWxlU3RhcnQuYXNzb2NpYXRlZEFTVE5vZGUuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCQkJc3QuYWRkKCJkaXNhYmxlZCIsIHRva2VuTmFtZSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlzdC5hZGQoImRpc2FibGVkIiwgcHJvYmUuZ2V0RGlzYWJsZWRBbHRlcm5hdGl2ZXMocHJvYmxlbVN0YXRlKSk7CisJCX0KKworCQlMaXN0IG5vbmRldEFsdHMgPSBwcm9iZS5nZXROb25EZXRlcm1pbmlzdGljQWx0c0ZvclN0YXRlKHByb2JsZW1TdGF0ZSk7CisJCU5GQVN0YXRlIG5mYVN0YXJ0ID0gcHJvYmUuZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpOworCQkvLyBhbGwgc3RhdGUgcGF0aHMgaGF2ZSB0byBiZWdpbiB3aXRoIHNhbWUgTkZBIHN0YXRlCisJCWludCBmaXJzdEFsdCA9IDA7CisJCWlmICggbm9uZGV0QWx0cyE9bnVsbCApIHsKKwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vbmRldEFsdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQkJSW50ZWdlciBkaXNwbGF5QWx0SSA9IChJbnRlZ2VyKSBpdGVyLm5leHQoKTsKKwkJCQlpZiAoIERlY2lzaW9uUHJvYmUudmVyYm9zZSApIHsKKwkJCQkJaW50IHRyYWNlUGF0aEFsdCA9CisJCQkJCQluZmFTdGFydC50cmFuc2xhdGVEaXNwbGF5QWx0VG9XYWxrQWx0KGRpc3BsYXlBbHRJLmludFZhbHVlKCkpOworCQkJCQlpZiAoIGZpcnN0QWx0ID09IDAgKSB7CisJCQkJCQlmaXJzdEFsdCA9IHRyYWNlUGF0aEFsdDsKKwkJCQkJfQorCQkJCQlMaXN0IHBhdGggPQorCQkJCQkJcHJvYmUuZ2V0TkZBUGF0aFN0YXRlc0ZvckFsdChmaXJzdEFsdCwKKwkJCQkJCQkJCQkJCQkgdHJhY2VQYXRoQWx0LAorCQkJCQkJCQkJCQkJCSBsYWJlbHMpOworCQkJCQlzdC5hZGRBZ2dyKCJwYXRocy57YWx0LCBzdGF0ZXN9IiwgZGlzcGxheUFsdEksIHBhdGgpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKCBwcm9iZS5kZmEuaXNUb2tlbnNSdWxlRGVjaXNpb24oKSApIHsKKwkJCQkJCS8vIGFsdHMgYXJlIHRva2VuIHJ1bGVzLCBjb252ZXJ0IHRvIHRoZSBuYW1lcyBpbnN0ZWFkIG9mIG51bWJlcnMKKwkJCQkJCVN0cmluZyB0b2tlbk5hbWUgPQorCQkJCQkJCXByb2JlLmdldFRva2VuTmFtZUZvclRva2Vuc1J1bGVBbHQoZGlzcGxheUFsdEkuaW50VmFsdWUoKSk7CisJCQkJCQlzdC5hZGQoImNvbmZsaWN0aW5nVG9rZW5zIiwgdG9rZW5OYW1lKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXN0LmFkZCgiY29uZmxpY3RpbmdBbHRzIiwgZGlzcGxheUFsdEkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXN0LmFkZCgiaGFzUHJlZGljYXRlQmxvY2tlZEJ5QWN0aW9uIiwgcHJvYmxlbVN0YXRlLmRmYS5oYXNQcmVkaWNhdGVCbG9ja2VkQnlBY3Rpb24pOworCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoc3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFyUmVwb3J0LmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJSZXBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ2MmEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFyUmVwb3J0LmphdmEKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkE7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUubWlzYy5TdGF0czsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgR3JhbW1hclJlcG9ydCB7CisJLyoqIEJlY2F1c2UgSSBtYXkgY2hhbmdlIHRoZSBzdGF0cywgSSBuZWVkIHRvIHRyYWNrIHZlcnNpb24gZm9yIGxhdGVyCisJICogIGNvbXB1dGF0aW9ucyB0byBiZSBjb25zaXN0ZW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZlcnNpb24gPSAiNSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBTU1BUl9TVEFUU19GSUxFTkFNRSA9ICJncmFtbWFyLnN0YXRzIjsKKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVwb3J0RGF0YSB7CisJCVN0cmluZyB2ZXJzaW9uOworCQlTdHJpbmcgZ25hbWU7CisJCVN0cmluZyBndHlwZTsKKwkJU3RyaW5nIGxhbmd1YWdlOworCQlpbnQgbnVtUnVsZXM7CisJCWludCBudW1PdXRlclByb2R1Y3Rpb25zOworCQlpbnQgbnVtYmVyT2ZEZWNpc2lvbnNJblJlYWxSdWxlczsKKwkJaW50IG51bWJlck9mRGVjaXNpb25zOworCQlpbnQgbnVtYmVyT2ZDeWNsaWNEZWNpc2lvbnM7CisJCWludCBudW1iZXJPZkZpeGVkS0RlY2lzaW9uczsKKwkJaW50IG51bUxMMTsKKwkJaW50IG1pbms7CisJCWludCBtYXhrOworCQlkb3VibGUgYXZnazsKKwkJaW50IG51bVRva2VuczsKKwkJbG9uZyBERkFDcmVhdGlvbldhbGxDbG9ja1RpbWVJbk1TOworCQlpbnQgbnVtYmVyT2ZTZW1hbnRpY1ByZWRpY2F0ZXM7CisJCWludCBudW1iZXJPZk1hbnVhbExvb2thaGVhZE9wdGlvbnM7IC8vIFRPRE86IHZlcmlmeQorCQlpbnQgbnVtTm9uTExTdGFyRGVjaXNpb25zOworCQlpbnQgbnVtTm9uZGV0ZXJtaW5pc3RpY0RlY2lzaW9uczsKKwkJaW50IG51bU5vbmRldGVybWluaXN0aWNEZWNpc2lvbk51bWJlcnNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzOworCQlpbnQgZXJyb3JzOworCQlpbnQgd2FybmluZ3M7CisJCWludCBpbmZvczsKKwkJLy9pbnQgbnVtX3N5bnByZWRzOworCQlpbnQgYmxvY2tzV2l0aFN5blByZWRzOworCQlpbnQgZGVjaXNpb25zV2hvc2VERkFzVXNlc1N5blByZWRzOworCQlpbnQgYmxvY2tzV2l0aFNlbVByZWRzOworCQlpbnQgZGVjaXNpb25zV2hvc2VERkFzVXNlc1NlbVByZWRzOworCQlTdHJpbmcgb3V0cHV0OworCQlTdHJpbmcgZ3JhbW1hckxldmVsazsKKwkJU3RyaW5nIGdyYW1tYXJMZXZlbEJhY2t0cmFjazsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCisJcHVibGljIEdyYW1tYXIgZ3JhbW1hcjsKKworCXB1YmxpYyBHcmFtbWFyUmVwb3J0KEdyYW1tYXIgZ3JhbW1hcikgeworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVwb3J0RGF0YSBnZXRSZXBvcnREYXRhKEdyYW1tYXIgZykgeworCQlSZXBvcnREYXRhIGRhdGEgPSBuZXcgUmVwb3J0RGF0YSgpOworCQlkYXRhLnZlcnNpb24gPSBWZXJzaW9uOworCQlkYXRhLmduYW1lID0gZy5uYW1lOworCisJCWRhdGEuZ3R5cGUgPSBnLmdldEdyYW1tYXJUeXBlU3RyaW5nKCk7CisKKwkJZGF0YS5sYW5ndWFnZSA9IChTdHJpbmcpIGcuZ2V0T3B0aW9uKCJsYW5ndWFnZSIpOworCQlkYXRhLm91dHB1dCA9IChTdHJpbmcpIGcuZ2V0T3B0aW9uKCJvdXRwdXQiKTsKKwkJaWYgKCBkYXRhLm91dHB1dD09bnVsbCApIHsKKwkJCWRhdGEub3V0cHV0ID0gIm5vbmUiOworCQl9CisKKwkJU3RyaW5nIGsgPSAoU3RyaW5nKSBnLmdldE9wdGlvbigiayIpOworCQlpZiAoIGs9PW51bGwgKSB7CisJCQlrID0gIm5vbmUiOworCQl9CisJCWRhdGEuZ3JhbW1hckxldmVsayA9IGs7CisKKwkJU3RyaW5nIGJhY2t0cmFjayA9IChTdHJpbmcpIGcuZ2V0T3B0aW9uKCJiYWNrdHJhY2siKTsKKwkJaWYgKCBiYWNrdHJhY2s9PW51bGwgKSB7CisJCQliYWNrdHJhY2sgPSAiZmFsc2UiOworCQl9CisJCWRhdGEuZ3JhbW1hckxldmVsQmFja3RyYWNrID0gYmFja3RyYWNrOworCisJCWludCB0b3RhbE5vblN5blByZWRQcm9kdWN0aW9ucyA9IDA7CisJCWludCB0b3RhbE5vblN5blByZWRSdWxlcyA9IDA7CisJCUNvbGxlY3Rpb24gcnVsZXMgPSBnLmdldFJ1bGVzKCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBydWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlSdWxlIHIgPSAoUnVsZSkgaXQubmV4dCgpOworCQkJaWYgKCAhci5uYW1lLnRvVXBwZXJDYXNlKCkKKwkJCQkuc3RhcnRzV2l0aChHcmFtbWFyLlNZTlBSRURfUlVMRV9QUkVGSVgudG9VcHBlckNhc2UoKSkgKQorCQkJeworCQkJCXRvdGFsTm9uU3luUHJlZFByb2R1Y3Rpb25zICs9IHIubnVtYmVyT2ZBbHRzOworCQkJCXRvdGFsTm9uU3luUHJlZFJ1bGVzKys7CisJCQl9CisJCX0KKworCQlkYXRhLm51bVJ1bGVzID0gdG90YWxOb25TeW5QcmVkUnVsZXM7CisJCWRhdGEubnVtT3V0ZXJQcm9kdWN0aW9ucyA9IHRvdGFsTm9uU3luUHJlZFByb2R1Y3Rpb25zOworCisJCWludCBudW1BQ3ljbGljRGVjaXNpb25zID0KKwkJCWcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKS0gZy5nZXROdW1iZXJPZkN5Y2xpY0RlY2lzaW9ucygpOworCQlMaXN0PEludGVnZXI+IGRlcHRocyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwkJaW50W10gYWN5Y2xpY0RGQVN0YXRlcyA9IG5ldyBpbnRbbnVtQUN5Y2xpY0RlY2lzaW9uc107CisJCWludFtdIGN5Y2xpY0RGQVN0YXRlcyA9IG5ldyBpbnRbZy5nZXROdW1iZXJPZkN5Y2xpY0RlY2lzaW9ucygpXTsKKwkJaW50IGFjeWNsaWNJbmRleCA9IDA7CisJCWludCBjeWNsaWNJbmRleCA9IDA7CisJCWludCBudW1MTDEgPSAwOworCQlpbnQgYmxvY2tzV2l0aFN5blByZWRzID0gMDsKKwkJaW50IGRmYVdpdGhTeW5QcmVkID0gMDsKKwkJaW50IG51bURlY2lzaW9ucyA9IDA7CisJCWludCBudW1DeWNsaWNEZWNpc2lvbnMgPSAwOworCQlmb3IgKGludCBpPTE7IGk8PSBnLmdldE51bWJlck9mRGVjaXNpb25zKCk7IGkrKykgeworCQkJR3JhbW1hci5EZWNpc2lvbiBkID0gZy5nZXREZWNpc2lvbihpKTsKKwkJCWlmKCBkLmRmYT09bnVsbCApIHsKKwkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZGVjICIrZC5kZWNpc2lvbisiIGhhcyBubyBBU1QiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVJ1bGUgciA9IGQuZGZhLmRlY2lzaW9uTkZBU3RhcnRTdGF0ZS5lbmNsb3NpbmdSdWxlOworCQkJaWYgKCByLm5hbWUudG9VcHBlckNhc2UoKQorCQkJCS5zdGFydHNXaXRoKEdyYW1tYXIuU1lOUFJFRF9SVUxFX1BSRUZJWC50b1VwcGVyQ2FzZSgpKSApCisJCQl7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImRlYyAiK2QuZGVjaXNpb24rIiBpcyBhIHN5bnByZWQiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbnVtRGVjaXNpb25zKys7CisJCQlpZiAoIGJsb2NrSGFzU3luUHJlZChkLmJsb2NrQVNUKSApIGJsb2Nrc1dpdGhTeW5QcmVkcysrOworCQkJLy9pZiAoIGcuZGVjaXNpb25zV2hvc2VERkFzVXNlc1N5blByZWRzLmNvbnRhaW5zKGQuZGZhKSApIGRmYVdpdGhTeW5QcmVkKys7CisJCQlpZiAoIGQuZGZhLmhhc1N5blByZWQoKSApIGRmYVdpdGhTeW5QcmVkKys7CisJCQkKKy8vCQkJTkZBU3RhdGUgZGVjaXNpb25TdGFydFN0YXRlID0gZ3JhbW1hci5nZXREZWNpc2lvbk5GQVN0YXJ0U3RhdGUoZC5kZWNpc2lvbik7CisvLwkJCWludCBuYWx0cyA9IGdyYW1tYXIuZ2V0TnVtYmVyT2ZBbHRzRm9yRGVjaXNpb25ORkEoZGVjaXNpb25TdGFydFN0YXRlKTsKKy8vCQkJZm9yIChpbnQgYWx0ID0gMTsgYWx0IDw9IG5hbHRzOyBhbHQrKykgeworLy8JCQkJaW50IHdhbGtBbHQgPQorLy8JCQkJCWRlY2lzaW9uU3RhcnRTdGF0ZS50cmFuc2xhdGVEaXNwbGF5QWx0VG9XYWxrQWx0KGFsdCk7CisvLwkJCQlORkFTdGF0ZSBhbHRMZWZ0RWRnZSA9IGdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKGRlY2lzaW9uU3RhcnRTdGF0ZSwgd2Fsa0FsdCk7CisvLwkJCX0KKy8vCQkJaW50IG5hbHRzID0gZ3JhbW1hci5nZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShkLmRmYS5kZWNpc2lvbk5GQVN0YXJ0U3RhdGUpOworLy8JCQlmb3IgKGludCBhPTE7IGE8bmFsdHM7IGErKykgeworLy8JCQkJTkZBU3RhdGUgYWx0U3RhcnQgPQorLy8JCQkJCWdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKGQuZGZhLmRlY2lzaW9uTkZBU3RhcnRTdGF0ZSwgYSk7CisvLwkJCX0KKwkJCWlmICggIWQuZGZhLmlzQ3ljbGljKCkgKSB7CisJCQkJaWYgKCBkLmRmYS5pc0NsYXNzaWNERkEoKSApIHsKKwkJCQkJaW50IG1heGsgPSBkLmRmYS5nZXRNYXhMb29rYWhlYWREZXB0aCgpOworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZGVjaXNpb24gIitkLmRmYS5kZWNpc2lvbk51bWJlcisiIGs9IittYXhrKTsKKwkJCQkJaWYgKCBtYXhrPT0xICkgbnVtTEwxKys7CisJCQkJCWRlcHRocy5hZGQoIG1heGsgKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWFjeWNsaWNERkFTdGF0ZXNbYWN5Y2xpY0luZGV4XSA9IGQuZGZhLmdldE51bWJlck9mU3RhdGVzKCk7CisJCQkJCWFjeWNsaWNJbmRleCsrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJDWUNMSUMgZGVjaXNpb24gIitkLmRmYS5kZWNpc2lvbk51bWJlcik7CisJCQkJbnVtQ3ljbGljRGVjaXNpb25zKys7CisJCQkJY3ljbGljREZBU3RhdGVzW2N5Y2xpY0luZGV4XSA9IGQuZGZhLmdldE51bWJlck9mU3RhdGVzKCk7CisJCQkJY3ljbGljSW5kZXgrKzsKKwkJCX0KKwkJfQorCisJCWRhdGEubnVtTEwxID0gbnVtTEwxOworCQlkYXRhLm51bWJlck9mRml4ZWRLRGVjaXNpb25zID0gZGVwdGhzLnNpemUoKTsKKwkJZGF0YS5taW5rID0gU3RhdHMubWluKGRlcHRocyk7CisJCWRhdGEubWF4ayA9IFN0YXRzLm1heChkZXB0aHMpOworCQlkYXRhLmF2Z2sgPSBTdGF0cy5hdmcoZGVwdGhzKTsKKworCQlkYXRhLm51bWJlck9mRGVjaXNpb25zSW5SZWFsUnVsZXMgPSBudW1EZWNpc2lvbnM7CisJCWRhdGEubnVtYmVyT2ZEZWNpc2lvbnMgPSBnLmdldE51bWJlck9mRGVjaXNpb25zKCk7CisJCWRhdGEubnVtYmVyT2ZDeWNsaWNEZWNpc2lvbnMgPSBudW1DeWNsaWNEZWNpc2lvbnM7CisKKy8vCQlNYXAgc3lucHJlZHMgPSBncmFtbWFyLmdldFN5bnRhY3RpY1ByZWRpY2F0ZXMoKTsKKy8vCQlpbnQgbnVtX3N5bnByZWRzID0gc3lucHJlZHMhPW51bGwgPyBzeW5wcmVkcy5zaXplKCkgOiAwOworLy8JCWRhdGEubnVtX3N5bnByZWRzID0gbnVtX3N5bnByZWRzOworCQlkYXRhLmJsb2Nrc1dpdGhTeW5QcmVkcyA9IGJsb2Nrc1dpdGhTeW5QcmVkczsKKwkJZGF0YS5kZWNpc2lvbnNXaG9zZURGQXNVc2VzU3luUHJlZHMgPSBkZmFXaXRoU3luUHJlZDsKKworLy8KKy8vCQlkYXRhLiA9IFN0YXRzLnN0ZGRldihkZXB0aHMpOworLy8KKy8vCQlkYXRhLiA9IFN0YXRzLm1pbihhY3ljbGljREZBU3RhdGVzKTsKKy8vCisvLwkJZGF0YS4gPSBTdGF0cy5tYXgoYWN5Y2xpY0RGQVN0YXRlcyk7CisvLworLy8JCWRhdGEuID0gU3RhdHMuYXZnKGFjeWNsaWNERkFTdGF0ZXMpOworLy8KKy8vCQlkYXRhLiA9IFN0YXRzLnN0ZGRldihhY3ljbGljREZBU3RhdGVzKTsKKy8vCisvLwkJZGF0YS4gPSBTdGF0cy5zdW0oYWN5Y2xpY0RGQVN0YXRlcyk7CisvLworLy8JCWRhdGEuID0gU3RhdHMubWluKGN5Y2xpY0RGQVN0YXRlcyk7CisvLworLy8JCWRhdGEuID0gU3RhdHMubWF4KGN5Y2xpY0RGQVN0YXRlcyk7CisvLworLy8JCWRhdGEuID0gU3RhdHMuYXZnKGN5Y2xpY0RGQVN0YXRlcyk7CisvLworLy8JCWRhdGEuID0gU3RhdHMuc3RkZGV2KGN5Y2xpY0RGQVN0YXRlcyk7CisvLworLy8JCWRhdGEuID0gU3RhdHMuc3VtKGN5Y2xpY0RGQVN0YXRlcyk7CisKKwkJZGF0YS5udW1Ub2tlbnMgPSBnLmdldFRva2VuVHlwZXMoKS5zaXplKCk7CisKKwkJZGF0YS5ERkFDcmVhdGlvbldhbGxDbG9ja1RpbWVJbk1TID0gZy5ERkFDcmVhdGlvbldhbGxDbG9ja1RpbWVJbk1TOworCisJCS8vIGluY2x1ZGVzIHRydWUgb25lcyBhbmQgcHJlZHMgaW4gc3lucHJlZHMgSSB0aGluazsgc3RyaXAgb3V0LiAKKwkJZGF0YS5udW1iZXJPZlNlbWFudGljUHJlZGljYXRlcyA9IGcubnVtYmVyT2ZTZW1hbnRpY1ByZWRpY2F0ZXM7CisKKwkJZGF0YS5udW1iZXJPZk1hbnVhbExvb2thaGVhZE9wdGlvbnMgPSBnLm51bWJlck9mTWFudWFsTG9va2FoZWFkT3B0aW9uczsKKworCQlkYXRhLm51bU5vbkxMU3RhckRlY2lzaW9ucyA9IGcubnVtTm9uTExTdGFyOworCQlkYXRhLm51bU5vbmRldGVybWluaXN0aWNEZWNpc2lvbnMgPSBnLnNldE9mTm9uZGV0ZXJtaW5pc3RpY0RlY2lzaW9uTnVtYmVycy5zaXplKCk7CisJCWRhdGEubnVtTm9uZGV0ZXJtaW5pc3RpY0RlY2lzaW9uTnVtYmVyc1Jlc29sdmVkV2l0aFByZWRpY2F0ZXMgPQorCQkJZy5zZXRPZk5vbmRldGVybWluaXN0aWNEZWNpc2lvbk51bWJlcnNSZXNvbHZlZFdpdGhQcmVkaWNhdGVzLnNpemUoKTsKKworCQlkYXRhLmVycm9ycyA9IEVycm9yTWFuYWdlci5nZXRFcnJvclN0YXRlKCkuZXJyb3JzOworCQlkYXRhLndhcm5pbmdzID0gRXJyb3JNYW5hZ2VyLmdldEVycm9yU3RhdGUoKS53YXJuaW5nczsKKwkJZGF0YS5pbmZvcyA9IEVycm9yTWFuYWdlci5nZXRFcnJvclN0YXRlKCkuaW5mb3M7CisKKwkJZGF0YS5ibG9ja3NXaXRoU2VtUHJlZHMgPSBnLmJsb2Nrc1dpdGhTZW1QcmVkcy5zaXplKCk7CisKKwkJZGF0YS5kZWNpc2lvbnNXaG9zZURGQXNVc2VzU2VtUHJlZHMgPSBnLmRlY2lzaW9uc1dob3NlREZBc1VzZXNTZW1QcmVkcy5zaXplKCk7CisKKwkJcmV0dXJuIGRhdGE7CisJfQorCQorCS8qKiBDcmVhdGUgYSBzaW5nbGUtbGluZSBzdGF0cyByZXBvcnQgYWJvdXQgdGhpcyBncmFtbWFyIHN1aXRhYmxlIHRvCisJICogIHNlbmQgdG8gdGhlIG5vdGlmeSBwYWdlIGF0IGFudGxyLm9yZworCSAqLworCXB1YmxpYyBTdHJpbmcgdG9Ob3RpZnlTdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCVJlcG9ydERhdGEgZGF0YSA9IGdldFJlcG9ydERhdGEoZ3JhbW1hcik7CisJCUZpZWxkW10gZmllbGRzID0gUmVwb3J0RGF0YS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOworCQlpbnQgaSA9IDA7CisJCWZvciAoRmllbGQgZiA6IGZpZWxkcykgeworCQkJdHJ5IHsKKwkJCQlPYmplY3QgdiA9IGYuZ2V0KGRhdGEpOworCQkJCVN0cmluZyBzID0gdiE9bnVsbCA/IHYudG9TdHJpbmcoKSA6ICJudWxsIjsKKwkJCQlpZiAoaT4wKSBidWYuYXBwZW5kKCdcdCcpOworCQkJCWJ1Zi5hcHBlbmQocyk7CisJCQl9CisJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlFcnJvck1hbmFnZXIuaW50ZXJuYWxFcnJvcigiQ2FuJ3QgZ2V0IGRhdGEiLCBlKTsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRCYWNrdHJhY2tpbmdSZXBvcnQoKSB7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWJ1Zi5hcHBlbmQoIkJhY2t0cmFja2luZyByZXBvcnQ6Iik7CisJCWJ1Zi5hcHBlbmQobmV3bGluZSk7CisJCWJ1Zi5hcHBlbmQoIk51bWJlciBvZiBkZWNpc2lvbnMgdGhhdCBiYWNrdHJhY2s6ICIpOworCQlidWYuYXBwZW5kKGdyYW1tYXIuZGVjaXNpb25zV2hvc2VERkFzVXNlc1N5blByZWRzLnNpemUoKSk7CisJCWJ1Zi5hcHBlbmQobmV3bGluZSk7CisJCWJ1Zi5hcHBlbmQoZ2V0REZBTG9jYXRpb25zKGdyYW1tYXIuZGVjaXNpb25zV2hvc2VERkFzVXNlc1N5blByZWRzKSk7CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERGQUxvY2F0aW9ucyhTZXQgZGZhcykgeworCQlTZXQgZGVjaXNpb25zID0gbmV3IEhhc2hTZXQoKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJSXRlcmF0b3IgaXQgPSBkZmFzLml0ZXJhdG9yKCk7CisJCXdoaWxlICggaXQuaGFzTmV4dCgpICkgeworCQkJREZBIGRmYSA9IChERkEpIGl0Lm5leHQoKTsKKwkJCS8vIGlmIHdlIGFib3J0ZWQgYSBERkEgYW5kIHJlZGlkIHdpdGggaz0xLCB0aGUgYmFja3RyYWNraW4KKwkJCWlmICggZGVjaXNpb25zLmNvbnRhaW5zKFV0aWxzLmludGVnZXIoZGZhLmRlY2lzaW9uTnVtYmVyKSkgKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkZWNpc2lvbnMuYWRkKFV0aWxzLmludGVnZXIoZGZhLmRlY2lzaW9uTnVtYmVyKSk7CisJCQlidWYuYXBwZW5kKCJSdWxlICIpOworCQkJYnVmLmFwcGVuZChkZmEuZGVjaXNpb25ORkFTdGFydFN0YXRlLmVuY2xvc2luZ1J1bGUubmFtZSk7CisJCQlidWYuYXBwZW5kKCIgZGVjaXNpb24gIik7CisJCQlidWYuYXBwZW5kKGRmYS5kZWNpc2lvbk51bWJlcik7CisJCQlidWYuYXBwZW5kKCIgbG9jYXRpb24gIik7CisJCQlHcmFtbWFyQVNUIGRlY2lzaW9uQVNUID0KKwkJCQlkZmEuZGVjaXNpb25ORkFTdGFydFN0YXRlLmFzc29jaWF0ZWRBU1ROb2RlOworCQkJYnVmLmFwcGVuZChkZWNpc2lvbkFTVC5nZXRMaW5lKCkpOworCQkJYnVmLmFwcGVuZCgiOiIpOworCQkJYnVmLmFwcGVuZChkZWNpc2lvbkFTVC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSk7CisJCQlidWYuYXBwZW5kKG5ld2xpbmUpOworCQl9CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwkvKiogR2l2ZW4gYSBzdGF0cyBsaW5lIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIHRoZSBhbnRsci5vcmcgc2l0ZSwKKwkgKiAgcmV0dXJuIGEgaHVtYW4tcmVhZGFibGUgdmVyc2lvbi4gIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIGEKKwkgKiAgcHJvYmxlbSB3aXRoIHRoZSBkYXRhLgorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiB0b1N0cmluZyh0b05vdGlmeVN0cmluZygpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFJlcG9ydERhdGEgZGVjb2RlUmVwb3J0RGF0YShTdHJpbmcgZGF0YVMpIHsKKwkJUmVwb3J0RGF0YSBkYXRhID0gbmV3IFJlcG9ydERhdGEoKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihkYXRhUywgIlx0Iik7CisJCUZpZWxkW10gZmllbGRzID0gUmVwb3J0RGF0YS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOworCQlmb3IgKEZpZWxkIGYgOiBmaWVsZHMpIHsKKwkJCVN0cmluZyB2ID0gc3QubmV4dFRva2VuKCk7CisJCQl0cnkgeworCQkJCWlmICggZi5nZXRUeXBlKCkgPT0gU3RyaW5nLmNsYXNzICkgeworCQkJCQlmLnNldChkYXRhLCB2KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIGYuZ2V0VHlwZSgpID09IGRvdWJsZS5jbGFzcyApIHsKKwkJCQkJZi5zZXQoZGF0YSwgRG91YmxlLnZhbHVlT2YodikpOwkJCQkJCisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlmLnNldChkYXRhLCBJbnRlZ2VyLnZhbHVlT2YodikpOwkJCQkJCisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJRXJyb3JNYW5hZ2VyLmludGVybmFsRXJyb3IoIkNhbid0IGdldCBkYXRhIiwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGRhdGE7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIG5vdGlmeURhdGFMaW5lKSB7CisJCVJlcG9ydERhdGEgZGF0YSA9IGRlY29kZVJlcG9ydERhdGEobm90aWZ5RGF0YUxpbmUpOworCQlpZiAoIGRhdGEgPT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmLmFwcGVuZCgiQU5UTFIgR3JhbW1hciBSZXBvcnQ7IFN0YXRzIFZlcnNpb24gIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS52ZXJzaW9uKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiR3JhbW1hcjogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5nbmFtZSk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIlR5cGU6ICIpOworCQlidWYuYXBwZW5kKGRhdGEuZ3R5cGUpOworCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJUYXJnZXQgbGFuZ3VhZ2U6ICIpOworCQlidWYuYXBwZW5kKGRhdGEubGFuZ3VhZ2UpOworCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJPdXRwdXQ6ICIpOworCQlidWYuYXBwZW5kKGRhdGEub3V0cHV0KTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiR3JhbW1hciBvcHRpb24gazogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5ncmFtbWFyTGV2ZWxrKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiR3JhbW1hciBvcHRpb24gYmFja3RyYWNrOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLmdyYW1tYXJMZXZlbEJhY2t0cmFjayk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIlJ1bGVzOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLm51bVJ1bGVzKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiT3V0ZXIgcHJvZHVjdGlvbnM6ICIpOworCQlidWYuYXBwZW5kKGRhdGEubnVtT3V0ZXJQcm9kdWN0aW9ucyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIkRlY2lzaW9uczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5udW1iZXJPZkRlY2lzaW9ucyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIkRlY2lzaW9ucyAoaWdub3JpbmcgZGVjaXNpb25zIGluIHN5bnByZWRzKTogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5udW1iZXJPZkRlY2lzaW9uc0luUmVhbFJ1bGVzKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiRml4ZWQgayBERkEgZGVjaXNpb25zOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLm51bWJlck9mRml4ZWRLRGVjaXNpb25zKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiQ3ljbGljIERGQSBkZWNpc2lvbnM6ICIpOworCQlidWYuYXBwZW5kKGRhdGEubnVtYmVyT2ZDeWNsaWNEZWNpc2lvbnMpOworCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJMTCgxKSBkZWNpc2lvbnM6ICIpOyBidWYuYXBwZW5kKGRhdGEubnVtTEwxKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiTWluIGZpeGVkIGs6ICIpOyBidWYuYXBwZW5kKGRhdGEubWluayk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIk1heCBmaXhlZCBrOiAiKTsgYnVmLmFwcGVuZChkYXRhLm1heGspOworCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJBdmVyYWdlIGZpeGVkIGs6ICIpOyBidWYuYXBwZW5kKGRhdGEuYXZnayk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisvLwkJYnVmLmFwcGVuZCgiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIGZpeGVkIGs6ICIpOyBidWYuYXBwZW5kKGZpZWxkc1sxMl0pOworLy8JCWJ1Zi5hcHBlbmQoJ1xuJyk7CisvLwkJYnVmLmFwcGVuZCgiTWluIGFjeWNsaWMgREZBIHN0YXRlczogIik7IGJ1Zi5hcHBlbmQoZmllbGRzWzEzXSk7CisvLwkJYnVmLmFwcGVuZCgnXG4nKTsKKy8vCQlidWYuYXBwZW5kKCJNYXggYWN5Y2xpYyBERkEgc3RhdGVzOiAiKTsgYnVmLmFwcGVuZChmaWVsZHNbMTRdKTsKKy8vCQlidWYuYXBwZW5kKCdcbicpOworLy8JCWJ1Zi5hcHBlbmQoIkF2ZXJhZ2UgYWN5Y2xpYyBERkEgc3RhdGVzOiAiKTsgYnVmLmFwcGVuZChmaWVsZHNbMTVdKTsKKy8vCQlidWYuYXBwZW5kKCdcbicpOworLy8JCWJ1Zi5hcHBlbmQoIlN0YW5kYXJkIGRldmlhdGlvbiBvZiBhY3ljbGljIERGQSBzdGF0ZXM6ICIpOyBidWYuYXBwZW5kKGZpZWxkc1sxNl0pOworLy8JCWJ1Zi5hcHBlbmQoJ1xuJyk7CisvLwkJYnVmLmFwcGVuZCgiVG90YWwgYWN5Y2xpYyBERkEgc3RhdGVzOiAiKTsgYnVmLmFwcGVuZChmaWVsZHNbMTddKTsKKy8vCQlidWYuYXBwZW5kKCdcbicpOworLy8JCWJ1Zi5hcHBlbmQoIk1pbiBjeWNsaWMgREZBIHN0YXRlczogIik7IGJ1Zi5hcHBlbmQoZmllbGRzWzE4XSk7CisvLwkJYnVmLmFwcGVuZCgnXG4nKTsKKy8vCQlidWYuYXBwZW5kKCJNYXggY3ljbGljIERGQSBzdGF0ZXM6ICIpOyBidWYuYXBwZW5kKGZpZWxkc1sxOV0pOworLy8JCWJ1Zi5hcHBlbmQoJ1xuJyk7CisvLwkJYnVmLmFwcGVuZCgiQXZlcmFnZSBjeWNsaWMgREZBIHN0YXRlczogIik7IGJ1Zi5hcHBlbmQoZmllbGRzWzIwXSk7CisvLwkJYnVmLmFwcGVuZCgnXG4nKTsKKy8vCQlidWYuYXBwZW5kKCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgY3ljbGljIERGQSBzdGF0ZXM6ICIpOyBidWYuYXBwZW5kKGZpZWxkc1syMV0pOworLy8JCWJ1Zi5hcHBlbmQoJ1xuJyk7CisvLwkJYnVmLmFwcGVuZCgiVG90YWwgY3ljbGljIERGQSBzdGF0ZXM6ICIpOyBidWYuYXBwZW5kKGZpZWxkc1syMl0pOworLy8JCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIkRGQSBjcmVhdGlvbiB0aW1lIGluIG1zOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLkRGQUNyZWF0aW9uV2FsbENsb2NrVGltZUluTVMpOworCQlidWYuYXBwZW5kKCdcbicpOworCisvLwkJYnVmLmFwcGVuZCgiTnVtYmVyIG9mIHN5bnRhY3RpYyBwcmVkaWNhdGVzIGF2YWlsYWJsZSAoaW5jbHVkaW5nIHN5bnByZWQgcnVsZXMpOiAiKTsKKy8vCQlidWYuYXBwZW5kKGRhdGEubnVtX3N5bnByZWRzKTsKKy8vCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJEZWNpc2lvbnMgd2l0aCBhdmFpbGFibGUgc3ludGFjdGljIHByZWRpY2F0ZXMgKGlnbm9yaW5nIHN5bnByZWQgcnVsZXMpOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLmJsb2Nrc1dpdGhTeW5QcmVkcyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIkRlY2lzaW9uIERGQXMgdXNpbmcgc3ludGFjdGljIHByZWRpY2F0ZXMgKGlnbm9yaW5nIHN5bnByZWQgcnVsZXMpOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLmRlY2lzaW9uc1dob3NlREZBc1VzZXNTeW5QcmVkcyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisKKwkJYnVmLmFwcGVuZCgiTnVtYmVyIG9mIHNlbWFudGljIHByZWRpY2F0ZXMgZm91bmQ6ICIpOworCQlidWYuYXBwZW5kKGRhdGEubnVtYmVyT2ZTZW1hbnRpY1ByZWRpY2F0ZXMpOworCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJEZWNpc2lvbnMgd2l0aCBzZW1hbnRpYyBwcmVkaWNhdGVzOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLmJsb2Nrc1dpdGhTZW1QcmVkcyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIkRlY2lzaW9uIERGQXMgdXNpbmcgc2VtYW50aWMgcHJlZGljYXRlczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5kZWNpc2lvbnNXaG9zZURGQXNVc2VzU2VtUHJlZHMpOworCQlidWYuYXBwZW5kKCdcbicpOworCisJCWJ1Zi5hcHBlbmQoIk51bWJlciBvZiAobGlrZWx5KSBub24tTEwoKikgZGVjaXNpb25zOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLm51bU5vbkxMU3RhckRlY2lzaW9ucyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIk51bWJlciBvZiBub25kZXRlcm1pbmlzdGljIGRlY2lzaW9uczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5udW1Ob25kZXRlcm1pbmlzdGljRGVjaXNpb25zKTsKKwkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJYnVmLmFwcGVuZCgiTnVtYmVyIG9mIG5vbmRldGVybWluaXN0aWMgZGVjaXNpb25zIHJlc29sdmVkIHdpdGggcHJlZGljYXRlczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5udW1Ob25kZXRlcm1pbmlzdGljRGVjaXNpb25OdW1iZXJzUmVzb2x2ZWRXaXRoUHJlZGljYXRlcyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisKKwkJYnVmLmFwcGVuZCgiTnVtYmVyIG9mIG1hbnVhbCBvciBmb3JjZWQgZml4ZWQgbG9va2FoZWFkIGs9dmFsdWUgb3B0aW9uczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5udW1iZXJPZk1hbnVhbExvb2thaGVhZE9wdGlvbnMpOworCQlidWYuYXBwZW5kKCdcbicpOworCisJCWJ1Zi5hcHBlbmQoIlZvY2FidWxhcnkgc2l6ZTogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5udW1Ub2tlbnMpOworCQlidWYuYXBwZW5kKCdcbicpOworCQlidWYuYXBwZW5kKCJOdW1iZXIgb2YgZXJyb3JzOiAiKTsKKwkJYnVmLmFwcGVuZChkYXRhLmVycm9ycyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIk51bWJlciBvZiB3YXJuaW5nczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS53YXJuaW5ncyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCWJ1Zi5hcHBlbmQoIk51bWJlciBvZiBpbmZvczogIik7CisJCWJ1Zi5hcHBlbmQoZGF0YS5pbmZvcyk7CisJCWJ1Zi5hcHBlbmQoJ1xuJyk7CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYmxvY2tIYXNTeW5QcmVkKEdyYW1tYXJBU1QgYmxvY2tBU1QpIHsKKwkJR3JhbW1hckFTVCBjMSA9IGJsb2NrQVNULmZpbmRGaXJzdFR5cGUoQU5UTFJQYXJzZXIuU1lOX1NFTVBSRUQpOworCQlHcmFtbWFyQVNUIGMyID0gYmxvY2tBU1QuZmluZEZpcnN0VHlwZShBTlRMUlBhcnNlci5CQUNLVFJBQ0tfU0VNUFJFRCk7CisJCWlmICggYzEhPW51bGwgfHwgYzIhPW51bGwgKSByZXR1cm4gdHJ1ZTsKKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oYmxvY2tBU1QuZW5jbG9zaW5nUnVsZU5hbWUrCisvLwkJCQkJCSAgICIgIitibG9ja0FTVC5nZXRMaW5lKCkrIjoiK2Jsb2NrQVNULmdldENvbHVtbigpKyIgbm8gcHJlZHMgQVNUPSIrYmxvY2tBU1QudG9TdHJpbmdUcmVlKCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJSZXBvcnQyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJSZXBvcnQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1Nzg5MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclJlcG9ydDIuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworLyoqIFNpbXBsaWZ5aW5nIHJlcG9ydCBkcmFtYXRpY2FsbHkgZm9yIExMKCopIHBhcGVyLiAgT2xkIHJlc3VsdHMgd2VyZQorICogIHdyb25nIGFueXdheSBpdCBzZWVtcy4gIFdlIG5lZWQ6CisgKgorICogCQlwZXJjZW50IGRlY2lzaW9ucyB0aGF0IHBvdGVudGlhbGx5IGJhY2t0cmFjaworICogIAloaXN0b2dyYW0gb2YgcmVndWxhciBsb29rYWhlYWQgZGVwdGggKGludCBrIG9yICopCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFtbWFyUmVwb3J0MiB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmV3bGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworCXB1YmxpYyBHcmFtbWFyIHJvb3Q7CisKKwlwdWJsaWMgR3JhbW1hclJlcG9ydDIoR3JhbW1hciByb290R3JhbW1hcikgeworCQl0aGlzLnJvb3QgPSByb290R3JhbW1hcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCXN0YXRzKHJvb3QsIGJ1Zik7CisJCUNvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gcm9vdC5jb21wb3NpdGU7CisJCWZvciAoR3JhbW1hciBnIDogY29tcG9zaXRlLmdldERlbGVnYXRlcyhyb290KSkgeworCQkJc3RhdHMoZywgYnVmKTsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJdm9pZCBzdGF0cyhHcmFtbWFyIGcsIFN0cmluZ0J1aWxkZXIgYnVmKSB7CisJCWludCBudW1EZWMgPSBnLmdldE51bWJlck9mRGVjaXNpb25zKCk7CisJCWZvciAoaW50IGRlY2lzaW9uPTE7IGRlY2lzaW9uPD1udW1EZWM7IGRlY2lzaW9uKyspIHsKKwkJCUdyYW1tYXIuRGVjaXNpb24gZCA9IGcuZ2V0RGVjaXNpb24oZGVjaXNpb24pOworCQkJaWYgKCBkLmRmYT09bnVsbCApIHsgLy8gdW51c3VlZCBkZWNpc2lvbnMgaW4gYXV0byBzeW5wcmVkcworCQkJCS8vU3lzdGVtLmVyci5wcmludGxuKCJubyBkZWNpc2lvbiAiK2RlY2lzaW9uKyIgZGZhIGZvciAiK2QuYmxvY2tBU1QudG9TdHJpbmdUcmVlKCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaW50IGsgPSBkLmRmYS5nZXRNYXhMb29rYWhlYWREZXB0aCgpOworCQkJUnVsZSBlbmNsb3NpbmdSdWxlID0gZC5kZmEuZGVjaXNpb25ORkFTdGFydFN0YXRlLmVuY2xvc2luZ1J1bGU7CisJCQlpZiAoIGVuY2xvc2luZ1J1bGUuaXNTeW5QcmVkICkgY29udGludWU7IC8vIGRvbid0IGNvdW50IHN5bnByZWQgcnVsZXMKKwkJCWJ1Zi5hcHBlbmQoZy5uYW1lKyIuIitlbmNsb3NpbmdSdWxlLm5hbWUrIjoiICsKKwkJCQkJICAgIiIpOworCQkJR3JhbW1hckFTVCBkZWNpc2lvbkFTVCA9CisJCQkJZC5kZmEuZGVjaXNpb25ORkFTdGFydFN0YXRlLmFzc29jaWF0ZWRBU1ROb2RlOworCQkJYnVmLmFwcGVuZChkZWNpc2lvbkFTVC5nZXRMaW5lKCkpOworCQkJYnVmLmFwcGVuZCgiOiIpOworCQkJYnVmLmFwcGVuZChkZWNpc2lvbkFTVC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSk7CisJCQlidWYuYXBwZW5kKCIgZGVjaXNpb24gIitkZWNpc2lvbisiOiIpOworCQkJCisJCQlpZiAoIGQuZGZhLmlzQ3ljbGljKCkgKSBidWYuYXBwZW5kKCIgY3ljbGljIik7CisJCQlpZiAoIGshPUludGVnZXIuTUFYX1ZBTFVFICkgYnVmLmFwcGVuZCgiIGs9IitrKTsgLy8gZml4ZWQsIG5vIHNlbXByZWRzCisJCQlpZiAoIGQuZGZhLmhhc1N5blByZWQoKSApIGJ1Zi5hcHBlbmQoIiBiYWNrdHJhY2tzIik7IC8vIGlzb2xhdGVkIHN5bnByZWQgbm90IGdhdGVkCisJCQlpZiAoIGQuZGZhLmhhc1NlbVByZWQoKSApIGJ1Zi5hcHBlbmQoIiBzZW1wcmVkIik7IC8vIHVzZXItZGVmaW5lZCBzZW1wcmVkCisvLwkJCWVsc2UgeworLy8JCQkJYnVmLmFwcGVuZCgidW5kZWZpbmVkIik7CisvLwkJCQlGQVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBGQVNlcmlhbGl6ZXIoZyk7CisvLwkJCQlTdHJpbmcgcmVzdWx0ID0gc2VyaWFsaXplci5zZXJpYWxpemUoZC5kZmEuc3RhcnRTdGF0ZSk7CisvLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVzdWx0KTsKKy8vCQkJfQorCQkJbmwoYnVmKTsKKwkJfQorCX0KKworCXZvaWQgbmwoU3RyaW5nQnVpbGRlciBidWYpIHsKKwkJYnVmLmFwcGVuZChuZXdsaW5lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTYW5pdHkuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclNhbml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZmFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTYW5pdHkuamF2YQpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLk5GQVN0YXRlOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5SdWxlQ2xvc3VyZVRyYW5zaXRpb247CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLlRyYW5zaXRpb247CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKiogRmFjdG9yIG91dCByb3V0aW5lcyB0aGF0IGNoZWNrIHNhbml0eSBvZiBydWxlcywgYWx0cywgZ3JhbW1hcnMsIGV0Yy4uICovCitwdWJsaWMgY2xhc3MgR3JhbW1hclNhbml0eSB7CisJLyoqIFRoZSBjaGVja0ZvckxlZnRSZWN1cnNpb24gbWV0aG9kIG5lZWRzIHRvIHRyYWNrIHdoYXQgcnVsZXMgaXQgaGFzCisJICogIHZpc2l0ZWQgdG8gdHJhY2sgaW5maW5pdGUgcmVjdXJzaW9uLgorCSAqLworCXByb3RlY3RlZCBTZXQ8UnVsZT4gdmlzaXRlZER1cmluZ1JlY3Vyc2lvbkNoZWNrID0gbnVsbDsKKworCXByb3RlY3RlZCBHcmFtbWFyIGdyYW1tYXI7CisJcHVibGljIEdyYW1tYXJTYW5pdHkoR3JhbW1hciBncmFtbWFyKSB7CisJCXRoaXMuZ3JhbW1hciA9IGdyYW1tYXI7CisJfQorCisJLyoqIENoZWNrIGFsbCBydWxlcyBmb3IgaW5maW5pdGUgbGVmdCByZWN1cnNpb24gYmVmb3JlIGFuYWx5c2lzLiBSZXR1cm4gbGlzdAorCSAqICBvZiB0cm91Ymxlc29tZSBydWxlIGN5Y2xlcy4gIFRoaXMgbWV0aG9kIGhhcyB0d28gc2lkZS1lZmZlY3RzOiBpdCBub3RpZmllcworCSAqICB0aGUgZXJyb3IgbWFuYWdlciB0aGF0IHdlIGhhdmUgcHJvYmxlbXMgYW5kIGl0IHNldHMgdGhlIGxpc3Qgb2YKKwkgKiAgcmVjdXJzaXZlIHJ1bGVzIHRoYXQgd2Ugc2hvdWxkIGlnbm9yZSBkdXJpbmcgYW5hbHlzaXMuCisJICovCisJcHVibGljIExpc3Q8U2V0PFJ1bGU+PiBjaGVja0FsbFJ1bGVzRm9yTGVmdFJlY3Vyc2lvbigpIHsKKwkJZ3JhbW1hci5idWlsZE5GQSgpOyAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBORkFzCisJCWdyYW1tYXIubGVmdFJlY3Vyc2l2ZVJ1bGVzID0gbmV3IEhhc2hTZXQoKTsKKwkJTGlzdDxTZXQ8UnVsZT4+IGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmFtbWFyLmNvbXBvc2l0ZS5ydWxlSW5kZXhUb1J1bGVMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlSdWxlIHIgPSBncmFtbWFyLmNvbXBvc2l0ZS5ydWxlSW5kZXhUb1J1bGVMaXN0LmVsZW1lbnRBdChpKTsKKwkJCWlmICggciE9bnVsbCApIHsKKwkJCQl2aXNpdGVkRHVyaW5nUmVjdXJzaW9uQ2hlY2sgPSBuZXcgSGFzaFNldCgpOworCQkJCXZpc2l0ZWREdXJpbmdSZWN1cnNpb25DaGVjay5hZGQocik7CisJCQkJU2V0IHZpc2l0ZWRTdGF0ZXMgPSBuZXcgSGFzaFNldCgpOworCQkJCXRyYWNlU3RhdGVzTG9va2luZ0ZvckxlZnRSZWN1cnNpb24oci5zdGFydFN0YXRlLAorCQkJCQkJCQkJCQkJICAgdmlzaXRlZFN0YXRlcywKKwkJCQkJCQkJCQkJCSAgIGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcyk7CisJCQl9CisJCX0KKwkJaWYgKCBsaXN0T2ZSZWN1cnNpdmVDeWNsZXMuc2l6ZSgpPjAgKSB7CisJCQlFcnJvck1hbmFnZXIubGVmdFJlY3Vyc2lvbkN5Y2xlcyhsaXN0T2ZSZWN1cnNpdmVDeWNsZXMpOworCQl9CisJCXJldHVybiBsaXN0T2ZSZWN1cnNpdmVDeWNsZXM7CisJfQorCisJLyoqIEZyb20gc3RhdGUgcywgbG9vayBmb3IgYW55IHRyYW5zaXRpb24gdG8gYSBydWxlIHRoYXQgaXMgY3VycmVudGx5CisJICogIGJlaW5nIHRyYWNlZC4gIFdoZW4gdHJhY2luZyByLCB2aXNpdGVkRHVyaW5nUmVjdXJzaW9uQ2hlY2sgaGFzIHIKKwkgKiAgaW5pdGlhbGx5LiAgSWYgeW91IHJlYWNoIGFuIGFjY2VwdCBzdGF0ZSwgcmV0dXJuIGJ1dCBub3RpZnkgdGhlCisJICogIGludm9raW5nIHJ1bGUgdGhhdCBpdCBpcyBudWxsYWJsZSwgd2hpY2ggaW1wbGllcyB0aGF0IGludm9raW5nCisJICogIHJ1bGUgbXVzdCBsb29rIGF0IGZvbGxvdyB0cmFuc2l0aW9uIGZvciB0aGF0IGludm9raW5nIHN0YXRlLgorCSAqICBUaGUgdmlzaXRlZFN0YXRlcyB0cmFja3MgdmlzaXRlZCBzdGF0ZXMgd2l0aGluIGEgc2luZ2xlIHJ1bGUgc28KKwkgKiAgd2UgY2FuIGF2b2lkIGVwc2lsb24tbG9vcC1pbmR1Y2VkIGluZmluaXRlIHJlY3Vyc2lvbiBoZXJlLiAgS2VlcAorCSAqICBmaWxsaW5nIHRoZSBjeWNsZXMgaW4gbGlzdE9mUmVjdXJzaXZlQ3ljbGVzIGFuZCBhbHNvLCBhcyBhCisJICogIHNpZGUtZWZmZWN0LCBzZXQgbGVmdFJlY3Vyc2l2ZVJ1bGVzLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHRyYWNlU3RhdGVzTG9va2luZ0ZvckxlZnRSZWN1cnNpb24oTkZBU3RhdGUgcywKKwkJCQkJCQkJCQkJCQkJIFNldCB2aXNpdGVkU3RhdGVzLAorCQkJCQkJCQkJCQkJCQkgTGlzdDxTZXQ8UnVsZT4+IGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcykKKwl7CisJCWlmICggcy5pc0FjY2VwdFN0YXRlKCkgKSB7CisJCQkvLyB0aGlzIHJ1bGUgbXVzdCBiZSBudWxsYWJsZSEKKwkJCS8vIEF0IGxlYXN0IG9uZSBlcHNpbG9uIGVkZ2UgcmVhY2hlZCBhY2NlcHQgc3RhdGUKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICggdmlzaXRlZFN0YXRlcy5jb250YWlucyhzKSApIHsKKwkJCS8vIHdpdGhpbiBzYW1lIHJ1bGUsIHdlJ3ZlIGhpdCBzYW1lIHN0YXRlOyBxdWl0IGxvb3BpbmcKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQl2aXNpdGVkU3RhdGVzLmFkZChzKTsKKwkJYm9vbGVhbiBzdGF0ZVJlYWNoZXNBY2NlcHRTdGF0ZSA9IGZhbHNlOworCQlUcmFuc2l0aW9uIHQwID0gcy50cmFuc2l0aW9uWzBdOworCQlpZiAoIHQwIGluc3RhbmNlb2YgUnVsZUNsb3N1cmVUcmFuc2l0aW9uICkgeworCQkJUnVsZUNsb3N1cmVUcmFuc2l0aW9uIHJlZlRyYW5zID0gKFJ1bGVDbG9zdXJlVHJhbnNpdGlvbil0MDsKKwkJCVJ1bGUgcmVmUnVsZURlZiA9IHJlZlRyYW5zLnJ1bGU7CisJCQkvL1N0cmluZyB0YXJnZXRSdWxlTmFtZSA9ICgoTkZBU3RhdGUpdDAudGFyZ2V0KS5nZXRFbmNsb3NpbmdSdWxlKCk7CisJCQlpZiAoIHZpc2l0ZWREdXJpbmdSZWN1cnNpb25DaGVjay5jb250YWlucyhyZWZSdWxlRGVmKSApIHsKKwkJCQkvLyByZWNvcmQgbGVmdC1yZWN1cnNpdmUgcnVsZSwgYnV0IGRvbid0IGdvIGJhY2sgaW4KKwkJCQlncmFtbWFyLmxlZnRSZWN1cnNpdmVSdWxlcy5hZGQocmVmUnVsZURlZik7CisJCQkJLyoKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgdmlzaXRlZCAiK3JlZlJ1bGVEZWYrIiwgY2FsbGluZyBmcm9tICIrCisJCQkJCQkJCSAgIHMuZW5jbG9zaW5nUnVsZSk7CisJCQkJCQkJCSAgICovCisJCQkJYWRkUnVsZXNUb0N5Y2xlKHJlZlJ1bGVEZWYsCisJCQkJCQkJCXMuZW5jbG9zaW5nUnVsZSwKKwkJCQkJCQkJbGlzdE9mUmVjdXJzaXZlQ3ljbGVzKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCS8vIG11c3QgdmlzaXQgaWYgbm90IGFscmVhZHkgdmlzaXRlZDsgc2VuZCBuZXcgdmlzaXRlZFN0YXRlcyBzZXQKKwkJCQl2aXNpdGVkRHVyaW5nUmVjdXJzaW9uQ2hlY2suYWRkKHJlZlJ1bGVEZWYpOworCQkJCWJvb2xlYW4gY2FsbFJlYWNoZWRBY2NlcHRTdGF0ZSA9CisJCQkJCXRyYWNlU3RhdGVzTG9va2luZ0ZvckxlZnRSZWN1cnNpb24oKE5GQVN0YXRlKXQwLnRhcmdldCwKKwkJCQkJCQkJCQkJCQkgICBuZXcgSGFzaFNldCgpLAorCQkJCQkJCQkJCQkJCSAgIGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcyk7CisJCQkJLy8gd2UncmUgYmFjayBmcm9tIHZpc2l0aW5nIHRoYXQgcnVsZQorCQkJCXZpc2l0ZWREdXJpbmdSZWN1cnNpb25DaGVjay5yZW1vdmUocmVmUnVsZURlZik7CisJCQkJLy8gbXVzdCBrZWVwIGdvaW5nIGluIHRoaXMgcnVsZSB0aGVuCisJCQkJaWYgKCBjYWxsUmVhY2hlZEFjY2VwdFN0YXRlICkgeworCQkJCQlORkFTdGF0ZSBmb2xsb3dpbmdTdGF0ZSA9CisJCQkJCQkoKFJ1bGVDbG9zdXJlVHJhbnNpdGlvbikgdDApLmZvbGxvd1N0YXRlOworCQkJCQlzdGF0ZVJlYWNoZXNBY2NlcHRTdGF0ZSB8PQorCQkJCQkJdHJhY2VTdGF0ZXNMb29raW5nRm9yTGVmdFJlY3Vyc2lvbihmb2xsb3dpbmdTdGF0ZSwKKwkJCQkJCQkJCQkJCQkJICAgdmlzaXRlZFN0YXRlcywKKwkJCQkJCQkJCQkJCQkJICAgbGlzdE9mUmVjdXJzaXZlQ3ljbGVzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHQwLmxhYmVsLmlzRXBzaWxvbigpIHx8IHQwLmxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCXN0YXRlUmVhY2hlc0FjY2VwdFN0YXRlIHw9CisJCQkJdHJhY2VTdGF0ZXNMb29raW5nRm9yTGVmdFJlY3Vyc2lvbigoTkZBU3RhdGUpdDAudGFyZ2V0LCB2aXNpdGVkU3RhdGVzLCBsaXN0T2ZSZWN1cnNpdmVDeWNsZXMpOworCQl9CisJCS8vIGVsc2UgaXQgaGFzIGEgbGFiZWxlZCBlZGdlCisKKwkJLy8gbm93IGRvIHRoZSBvdGhlciB0cmFuc2l0aW9uIGlmIGl0IGV4aXN0cworCQlUcmFuc2l0aW9uIHQxID0gcy50cmFuc2l0aW9uWzFdOworCQlpZiAoIHQxIT1udWxsICkgeworCQkJc3RhdGVSZWFjaGVzQWNjZXB0U3RhdGUgfD0KKwkJCQl0cmFjZVN0YXRlc0xvb2tpbmdGb3JMZWZ0UmVjdXJzaW9uKChORkFTdGF0ZSl0MS50YXJnZXQsCisJCQkJCQkJCQkJCQkgICB2aXNpdGVkU3RhdGVzLAorCQkJCQkJCQkJCQkJICAgbGlzdE9mUmVjdXJzaXZlQ3ljbGVzKTsKKwkJfQorCQlyZXR1cm4gc3RhdGVSZWFjaGVzQWNjZXB0U3RhdGU7CisJfQorCisJLyoqIGVuY2xvc2luZ1J1bGVOYW1lIGNhbGxzIHRhcmdldFJ1bGVOYW1lLCBmaW5kIHRoZSBjeWNsZSBjb250YWluaW5nCisJICogIHRoZSB0YXJnZXQgYW5kIGFkZCB0aGUgY2FsbGVyLiAgRmluZCB0aGUgY3ljbGUgY29udGFpbmluZyB0aGUgY2FsbGVyCisJICogIGFuZCBhZGQgdGhlIHRhcmdldC4gIElmIG5vIGN5Y2xlcyBjb250YWluIGVpdGhlciwgdGhlbiBjcmVhdGUgYSBuZXcKKwkgKiAgY3ljbGUuICBsaXN0T2ZSZWN1cnNpdmVDeWNsZXMgaXMgTGlzdDxTZXQ8U3RyaW5nPj4gdGhhdCBob2xkcyBhIGxpc3QKKwkgKiAgb2YgY3ljbGVzIChzZXRzIG9mIHJ1bGUgbmFtZXMpLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZFJ1bGVzVG9DeWNsZShSdWxlIHRhcmdldFJ1bGUsCisJCQkJCQkJCSAgIFJ1bGUgZW5jbG9zaW5nUnVsZSwKKwkJCQkJCQkJICAgTGlzdDxTZXQ8UnVsZT4+IGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcykKKwl7CisJCWJvb2xlYW4gZm91bmRDeWNsZSA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcy5zaXplKCk7IGkrKykgeworCQkJU2V0PFJ1bGU+IHJ1bGVzSW5DeWNsZSA9IGxpc3RPZlJlY3Vyc2l2ZUN5Y2xlcy5nZXQoaSk7CisJCQkvLyBlbnN1cmUgYm90aCBydWxlcyBhcmUgaW4gc2FtZSBjeWNsZQorCQkJaWYgKCBydWxlc0luQ3ljbGUuY29udGFpbnModGFyZ2V0UnVsZSkgKSB7CisJCQkJcnVsZXNJbkN5Y2xlLmFkZChlbmNsb3NpbmdSdWxlKTsKKwkJCQlmb3VuZEN5Y2xlID0gdHJ1ZTsKKwkJCX0KKwkJCWlmICggcnVsZXNJbkN5Y2xlLmNvbnRhaW5zKGVuY2xvc2luZ1J1bGUpICkgeworCQkJCXJ1bGVzSW5DeWNsZS5hZGQodGFyZ2V0UnVsZSk7CisJCQkJZm91bmRDeWNsZSA9IHRydWU7CisJCQl9CisJCX0KKwkJaWYgKCAhZm91bmRDeWNsZSApIHsKKwkJCVNldCBjeWNsZSA9IG5ldyBIYXNoU2V0KCk7CisJCQljeWNsZS5hZGQodGFyZ2V0UnVsZSk7CisJCQljeWNsZS5hZGQoZW5jbG9zaW5nUnVsZSk7CisJCQlsaXN0T2ZSZWN1cnNpdmVDeWNsZXMuYWRkKGN5Y2xlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNoZWNrUnVsZVJlZmVyZW5jZShHcmFtbWFyQVNUIHNjb3BlQVNULAorCQkJCQkJCQkgICBHcmFtbWFyQVNUIHJlZkFTVCwKKwkJCQkJCQkJICAgR3JhbW1hckFTVCBhcmdzQVNULAorCQkJCQkJCQkgICBTdHJpbmcgY3VycmVudFJ1bGVOYW1lKQorCXsKKwkJUnVsZSByID0gZ3JhbW1hci5nZXRSdWxlKHJlZkFTVC5nZXRUZXh0KCkpOworCQlpZiAoIHJlZkFTVC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlJVTEVfUkVGICkgeworCQkJaWYgKCBhcmdzQVNUIT1udWxsICkgeworCQkJCS8vIHJ1bGVbYXJnc107IHJlZiBoYXMgYXJncworICAgICAgICAgICAgICAgIGlmICggciE9bnVsbCAmJiByLmFyZ0FjdGlvbkFTVD09bnVsbCApIHsKKwkJCQkJLy8gYnV0IHJ1bGUgZGVmIGhhcyBubyBhcmdzCisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX1JVTEVfSEFTX05PX0FSR1MsCisJCQkJCQlncmFtbWFyLAorCQkJCQkJYXJnc0FTVC5nZXRUb2tlbigpLAorCQkJCQkJci5uYW1lKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBydWxlIHJlZiBoYXMgbm8gYXJncworCQkJCWlmICggciE9bnVsbCAmJiByLmFyZ0FjdGlvbkFTVCE9bnVsbCApIHsKKwkJCQkJLy8gYnV0IHJ1bGUgZGVmIGhhcyBhcmdzCisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX01JU1NJTkdfUlVMRV9BUkdTLAorCQkJCQkJZ3JhbW1hciwKKwkJCQkJCXJlZkFTVC5nZXRUb2tlbigpLAorCQkJCQkJci5uYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHJlZkFTVC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlRPS0VOX1JFRiApIHsKKwkJCWlmICggZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICkgeworCQkJCWlmICggYXJnc0FTVCE9bnVsbCApIHsKKwkJCQkJLy8gYXJncyBvbiBhIHRva2VuIHJlZiBub3QgaW4gYSBsZXhlciBydWxlCisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX0FSR1NfT05fVE9LRU5fUkVGLAorCQkJCQkJZ3JhbW1hciwKKwkJCQkJCXJlZkFTVC5nZXRUb2tlbigpLAorCQkJCQkJcmVmQVNULmdldFRleHQoKSk7CisJCQkJfQorCQkJCXJldHVybjsgLy8gaWdub3JlIHRva2VuIHJlZnMgaW4gbm9ubGV4ZXJzCisJCQl9CisJCQlpZiAoIGFyZ3NBU1QhPW51bGwgKSB7CisJCQkJLy8gdG9rZW5SZWZbYXJnc107IHJlZiBoYXMgYXJncworCQkJCWlmICggciE9bnVsbCAmJiByLmFyZ0FjdGlvbkFTVD09bnVsbCApIHsKKwkJCQkJLy8gYnV0IHRva2VuIHJ1bGUgZGVmIGhhcyBubyBhcmdzCisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX1JVTEVfSEFTX05PX0FSR1MsCisJCQkJCQlncmFtbWFyLAorCQkJCQkJYXJnc0FTVC5nZXRUb2tlbigpLAorCQkJCQkJci5uYW1lKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyB0b2tlbiByZWYgaGFzIG5vIGFyZ3MKKwkJCQlpZiAoIHIhPW51bGwgJiYgci5hcmdBY3Rpb25BU1QhPW51bGwgKSB7CisJCQkJCS8vIGJ1dCB0b2tlbiBydWxlIGRlZiBoYXMgYXJncworCQkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKAorCQkJCQkJRXJyb3JNYW5hZ2VyLk1TR19NSVNTSU5HX1JVTEVfQVJHUywKKwkJCQkJCWdyYW1tYXIsCisJCQkJCQlyZWZBU1QuZ2V0VG9rZW4oKSwKKwkJCQkJCXIubmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqIFJ1bGVzIGluIHRyZWUgZ3JhbW1hciB0aGF0IHVzZSAtPiByZXdyaXRlcyBhbmQgYXJlIHNwaXR0aW5nIG91dAorCSAqICB0ZW1wbGF0ZXMgdmlhIG91dHB1dD10ZW1wbGF0ZSBhbmQgdGhlbiB1c2UgcmV3cml0ZT10cnVlIG11c3Qgb25seQorCSAqICB1c2UgLT4gb24gYWx0cyB0aGF0IGFyZSBzaW1wbGUgbm9kZXMgb3IgdHJlZXMgb3Igc2luZ2xlIHJ1bGUgcmVmcworCSAqICB0aGF0IG1hdGNoIGVpdGhlciBub2RlcyBvciB0cmVlcy4gIFRoZSBhbHRBU1QgaXMgdGhlIEFMVCBub2RlCisJICogIGZvciBhbiBBTFQuICBWZXJpZnkgdGhhdCBpdHMgZmlyc3QgY2hpbGQgaXMgc2ltcGxlLiAgTXVzdCBiZSBlaXRoZXIKKwkgKiAgKCBBTFQgXiggQSBCICkgPGVuZC1vZi1hbHQ+ICkgb3IgKCBBTFQgQSA8ZW5kLW9mLWFsdD4gKSBvcgorCSAqICBvdGhlciBlbGVtZW50LgorCSAqCisJICogIElnbm9yZSBwcmVkaWNhdGVzIGluIGZyb250IGFuZCBsYWJlbHMuCisJICovCisJcHVibGljIHZvaWQgZW5zdXJlQWx0SXNTaW1wbGVOb2RlT3JUcmVlKEdyYW1tYXJBU1QgYWx0QVNULAorCQkJCQkJCQkJCQlHcmFtbWFyQVNUIGVsZW1lbnRBU1QsCisJCQkJCQkJCQkJCWludCBvdXRlckFsdE51bSkKKwl7CisJCWlmICggaXNWYWxpZFNpbXBsZUVsZW1lbnROb2RlKGVsZW1lbnRBU1QpICkgeworCQkJR3JhbW1hckFTVCBuZXh0ID0gKEdyYW1tYXJBU1QpZWxlbWVudEFTVC5nZXROZXh0U2libGluZygpOworCQkJaWYgKCAhaXNOZXh0Tm9uQWN0aW9uRWxlbWVudEVPQShuZXh0KSkgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyV2FybmluZyhFcnJvck1hbmFnZXIuTVNHX1JFV1JJVEVfRk9SX01VTFRJX0VMRU1FTlRfQUxULAorCQkJCQkJCQkJCQlncmFtbWFyLAorCQkJCQkJCQkJCQluZXh0LnRva2VuLAorCQkJCQkJCQkJCQluZXcgSW50ZWdlcihvdXRlckFsdE51bSkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCXN3aXRjaCAoIGVsZW1lbnRBU1QuZ2V0VHlwZSgpICkgeworCQkJY2FzZSBBTlRMUlBhcnNlci5BU1NJR04gOgkJLy8gbGFiZWxzIG9rIG9uIG5vbi1ydWxlIHJlZnMKKwkJCWNhc2UgQU5UTFJQYXJzZXIuUExVU19BU1NJR04gOgorCQkJCWlmICggaXNWYWxpZFNpbXBsZUVsZW1lbnROb2RlKGVsZW1lbnRBU1QuZ2V0Q2hpbGQoMSkpICkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBBTlRMUlBhcnNlci5BQ1RJT04gOgkJLy8gc2tpcCBwYXN0IGFjdGlvbnMKKwkJCWNhc2UgQU5UTFJQYXJzZXIuU0VNUFJFRCA6CisJCQljYXNlIEFOVExSUGFyc2VyLlNZTl9TRU1QUkVEIDoKKwkJCWNhc2UgQU5UTFJQYXJzZXIuQkFDS1RSQUNLX1NFTVBSRUQgOgorCQkJY2FzZSBBTlRMUlBhcnNlci5HQVRFRF9TRU1QUkVEIDoKKwkJCQllbnN1cmVBbHRJc1NpbXBsZU5vZGVPclRyZWUoYWx0QVNULAorCQkJCQkJCQkJCQkoR3JhbW1hckFTVCllbGVtZW50QVNULmdldE5leHRTaWJsaW5nKCksCisJCQkJCQkJCQkJCW91dGVyQWx0TnVtKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJXYXJuaW5nKEVycm9yTWFuYWdlci5NU0dfUkVXUklURV9GT1JfTVVMVElfRUxFTUVOVF9BTFQsCisJCQkJCQkJCQlncmFtbWFyLAorCQkJCQkJCQkJZWxlbWVudEFTVC50b2tlbiwKKwkJCQkJCQkJCW5ldyBJbnRlZ2VyKG91dGVyQWx0TnVtKSk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNpbXBsZUVsZW1lbnROb2RlKFRyZWUgdCkgeworCQlzd2l0Y2ggKCB0LmdldFR5cGUoKSApIHsKKwkJCWNhc2UgQU5UTFJQYXJzZXIuVFJFRV9CRUdJTiA6CisJCQljYXNlIEFOVExSUGFyc2VyLlRPS0VOX1JFRiA6CisJCQljYXNlIEFOVExSUGFyc2VyLkNIQVJfTElURVJBTCA6CisJCQljYXNlIEFOVExSUGFyc2VyLlNUUklOR19MSVRFUkFMIDoKKwkJCWNhc2UgQU5UTFJQYXJzZXIuV0lMRENBUkQgOgorCQkJCXJldHVybiB0cnVlOworCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXh0Tm9uQWN0aW9uRWxlbWVudEVPQShHcmFtbWFyQVNUIHQpIHsKKwkJd2hpbGUgKCB0LmdldFR5cGUoKT09QU5UTFJQYXJzZXIuQUNUSU9OIHx8CisJCQkJdC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlNFTVBSRUQgKQorCQl7CisJCQl0ID0gKEdyYW1tYXJBU1QpdC5nZXROZXh0U2libGluZygpOworCQl9CisJCWlmICggdC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLkVPQSApIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTZW1hbnRpY3NNZXNzYWdlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTZW1hbnRpY3NNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyNzE4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclNlbWFudGljc01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKKy8qKiBBIHByb2JsZW0gd2l0aCB0aGUgc3ltYm9scyBhbmQvb3IgbWVhbmluZyBvZiBhIGdyYW1tYXIgc3VjaCBhcyBydWxlCisgKiAgcmVkZWZpbml0aW9uLgorICovCitwdWJsaWMgY2xhc3MgR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgR3JhbW1hciBnOworCS8qKiBNb3N0IG9mIHRoZSB0aW1lLCB3ZSdsbCBoYXZlIGEgdG9rZW4gc3VjaCBhcyBhbiB1bmRlZmluZWQgcnVsZSByZWYKKwkgKiAgYW5kIHNvIHRoaXMgd2lsbCBiZSBzZXQuCisJICovCisJcHVibGljIFRva2VuIG9mZmVuZGluZ1Rva2VuOworCisJcHVibGljIEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGludCBtc2dJRCwKKwkJCQkJCSAgR3JhbW1hciBnLAorCQkJCQkJICBUb2tlbiBvZmZlbmRpbmdUb2tlbikKKwl7CisJCXRoaXMobXNnSUQsZyxvZmZlbmRpbmdUb2tlbixudWxsLG51bGwpOworCX0KKworCXB1YmxpYyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShpbnQgbXNnSUQsCisJCQkJCQkgIEdyYW1tYXIgZywKKwkJCQkJCSAgVG9rZW4gb2ZmZW5kaW5nVG9rZW4sCisJCQkJCQkgIE9iamVjdCBhcmcpCisJeworCQl0aGlzKG1zZ0lELGcsb2ZmZW5kaW5nVG9rZW4sYXJnLG51bGwpOworCX0KKworCXB1YmxpYyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShpbnQgbXNnSUQsCisJCQkJCQkgIEdyYW1tYXIgZywKKwkJCQkJCSAgVG9rZW4gb2ZmZW5kaW5nVG9rZW4sCisJCQkJCQkgIE9iamVjdCBhcmcsCisJCQkJCQkgIE9iamVjdCBhcmcyKQorCXsKKwkJc3VwZXIobXNnSUQsYXJnLGFyZzIpOworCQl0aGlzLmcgPSBnOworCQl0aGlzLm9mZmVuZGluZ1Rva2VuID0gb2ZmZW5kaW5nVG9rZW47CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJbGluZSA9IDA7CisJCWNvbHVtbiA9IDA7CisJCWlmICggb2ZmZW5kaW5nVG9rZW4hPW51bGwgKSB7CisJCQlsaW5lID0gb2ZmZW5kaW5nVG9rZW4uZ2V0TGluZSgpOworCQkJY29sdW1uID0gb2ZmZW5kaW5nVG9rZW4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisJCX0KKwkJaWYgKCBnIT1udWxsICkgeworCQkJZmlsZSA9IGcuZ2V0RmlsZU5hbWUoKTsKKwkJfQorCQlTVCBzdCA9IGdldE1lc3NhZ2VUZW1wbGF0ZSgpOworCQlpZiAoIGFyZyE9bnVsbCApIHsKKwkJCXN0LmFkZCgiYXJnIiwgYXJnKTsKKwkJfQorCQlpZiAoIGFyZzIhPW51bGwgKSB7CisJCQlzdC5hZGQoImFyZzIiLCBhcmcyKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoc3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclNlcmlhbGl6ZXJGb28uamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclNlcmlhbGl6ZXJGb28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFhZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9HcmFtbWFyU2VyaWFsaXplckZvby5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlNlcmlhbGl6ZWRHcmFtbWFyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworLyoqIFNlcmlhbGl6ZSBhIGdyYW1tYXIgaW50byBhIGhpZ2hseSBjb21wcmVzc2VkIGZvcm0gd2l0aAorICogIG9ubHkgdGhlIGluZm8gbmVlZGVkIHRvIHJlY29nbml6ZSBzZW50ZW5jZXMuCisgKiAgRk9STUFUOgorICoKKyAqICBmaWxlIDo6PSAkQU5UTFI8dmVyc2lvbjpieXRlPjxncmFtbWFydHlwZTpieXRlPjxuYW1lOnN0cmluZz47PG51bVJ1bGVzOnNob3J0PjxydWxlcz4KKyAqICBydWxlIDo6PSBSPHJ1bGVuYW1lOnN0cmluZz47QjxuYWx0czpzaG9ydD48YWx0cz4uCisgKiAgYWx0ICA6Oj0gQTxlbGVtcz47CisgKiAgZWxlbSA6Oj0gdDx0b2tlbnR5cGU6c2hvcnQ+IHwgcjxydWxlSW5kZXg6c2hvcnQ+IHwgLTxjaGFyOnVjaGFyPjxjaGFyOnVjaGFyPiB8IH48dG9rZW50eXBlPiB8IHcKKyAqLworcHVibGljIGNsYXNzIEdyYW1tYXJTZXJpYWxpemVyRm9vIHsKKyAgICBwcm90ZWN0ZWQgRGF0YU91dHB1dFN0cmVhbSBvdXQ7CisgICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZTsKKyAgICBwcm90ZWN0ZWQgR3JhbW1hciBnOworCisgICAgcHJvdGVjdGVkIFN0YWNrIHN0cmVhbXMgPSBuZXcgU3RhY2soKTsKKyAgICBwcm90ZWN0ZWQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFsdEJ1ZjsKKyAgICBwcm90ZWN0ZWQgaW50IG51bUVsZW1lbnRzSW5BbHQgPSAwOworCisgICAgcHVibGljIEdyYW1tYXJTZXJpYWxpemVyRm9vKEdyYW1tYXIgZykgeworICAgICAgICB0aGlzLmcgPSBnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9wZW4oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOworICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZm9zKTsKKyAgICAgICAgb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYm9zKTsKKyAgICAgICAgd3JpdGVTdHJpbmcob3V0LCBTZXJpYWxpemVkR3JhbW1hci5DT09LSUUpOworICAgICAgICBvdXQud3JpdGVCeXRlKFNlcmlhbGl6ZWRHcmFtbWFyLkZPUk1BVF9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICggb3V0IT1udWxsICkgb3V0LmNsb3NlKCk7CisgICAgICAgIG91dCA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyBXUklURQorCisgICAgcHVibGljIHZvaWQgZ3JhbW1hcihpbnQgZ3JhbW1hclRva2VuVHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBzd2l0Y2ggKCBncmFtbWFyVG9rZW5UeXBlICkgeworICAgICAgICAgICAgICAgIGNhc2UgQU5UTFJQYXJzZXIuTEVYRVJfR1JBTU1BUiA6IG91dC53cml0ZUJ5dGUoJ2wnKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBTlRMUlBhcnNlci5QQVJTRVJfR1JBTU1BUiA6IG91dC53cml0ZUJ5dGUoJ3AnKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBTlRMUlBhcnNlci5UUkVFX0dSQU1NQVI6IG91dC53cml0ZUJ5dGUoJ3QnKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBTlRMUlBhcnNlci5DT01CSU5FRF9HUkFNTUFSIDogb3V0LndyaXRlQnl0ZSgnYycpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKG91dCwgbmFtZSk7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoZy5nZXRSdWxlcygpLnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoJ1InKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKG91dCwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZFJ1bGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKCcuJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJsb2NrKGludCBuYWx0cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgnQicpOworICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQobmFsdHMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9XUklURV9GSUxFLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbHQoR3JhbW1hckFTVCBhbHQpIHsKKyAgICAgICAgbnVtRWxlbWVudHNJbkFsdCA9IDA7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKCdBJyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAvL3N0cmVhbXMucHVzaChvdXQpOworICAgICAgICAvL2FsdEJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgLy9vdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShhbHRCdWYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZEFsdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAvL291dCA9IChEYXRhT3V0cHV0U3RyZWFtKXN0cmVhbXMucG9wKCk7IC8vIHJlc3RvcmUgcHJldmlvdXMgc3RyZWFtCisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKCc7Jyk7CisgICAgICAgICAgICAvL291dC53cml0ZVNob3J0KG51bUVsZW1lbnRzSW5BbHQpOworICAgICAgICAgICAgLy9vdXQud3JpdGUoYWx0QnVmLnRvQnl0ZUFycmF5KCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9XUklURV9GSUxFLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydWxlUmVmKEdyYW1tYXJBU1QgdCkgeworICAgICAgICBudW1FbGVtZW50c0luQWx0Kys7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKCdyJyk7CisgICAgICAgICAgICBvdXQud3JpdGVTaG9ydChnLmdldFJ1bGVJbmRleCh0LmdldFRleHQoKSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9XUklURV9GSUxFLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b2tlbihHcmFtbWFyQVNUIHQpIHsKKyAgICAgICAgbnVtRWxlbWVudHNJbkFsdCsrOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgndCcpOworICAgICAgICAgICAgaW50IHR0eXBlID0gZy5nZXRUb2tlblR5cGUodC5nZXRUZXh0KCkpOworICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQodHR5cGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9XUklURV9GSUxFLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGFyTGl0ZXJhbChHcmFtbWFyQVNUIHQpIHsKKyAgICAgICAgbnVtRWxlbWVudHNJbkFsdCsrOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCBnLnR5cGUhPUdyYW1tYXIuTEVYRVIgKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgndCcpOworICAgICAgICAgICAgICAgIGludCB0dHlwZSA9IGcuZ2V0VG9rZW5UeXBlKHQuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVTaG9ydCh0dHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBlbHNlIGxleGVyPz8/CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdpbGRjYXJkKEdyYW1tYXJBU1QgdCkgeworICAgICAgICBudW1FbGVtZW50c0luQWx0Kys7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKCd3Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJhbmdlKCkgeyAvLyBtdXN0IGJlIGNoYXIgcmFuZ2UKKyAgICAgICAgbnVtRWxlbWVudHNJbkFsdCsrOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgnLScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9XUklURV9GSUxFLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKCd+Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQ0FOTk9UX1dSSVRFX0ZJTEUsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKERhdGFPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlQnl0ZXMocyk7CisgICAgICAgIG91dC53cml0ZUJ5dGUoJzsnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTcGVsdW5rZXIuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclNwZWx1bmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTg2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTcGVsdW5rZXIuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBMb2FkIGEgZ3JhbW1hciBmaWxlIGFuZCBzY2FuIGl0IGp1c3QgdW50aWwgd2UgbGVhcm4gYSBmZXcgaXRlbXMKKyAqICBvZiBpbnRlcmVzdC4gIEN1cnJlbnRseTogbmFtZSwgdHlwZSwgaW1wb3J0cywgdG9rZW5Wb2NhYiwgbGFuZ3VhZ2Ugb3B0aW9uLgorICoKKyAqICBHcmFtbWFyU2Nhbm5lciAoYXQgYm90dG9tIG9mIHRoaXMgY2xhc3MpIGNvbnZlcnRzIGdyYW1tYXIgdG8gc3R1ZmYgbGlrZToKKyAqCisgKiAgIGdyYW1tYXIgSmF2YSA7IG9wdGlvbnMgeyBiYWNrdHJhY2sgdHJ1ZSBtZW1vaXplIHRydWUgfQorICogICBpbXBvcnQgSmF2YURlY2wgSmF2YUFubm90YXRpb25zIEphdmFFeHByIDsKKyAqICAgLi4uIDogLi4uCisgKgorICogIEZpcnN0ICc6JyBvciAnQCcgaW5kaWNhdGVzIHdlIGNhbiBzdG9wIGxvb2tpbmcgZm9yIGltcG9ydHMvb3B0aW9ucy4KKyAqCisgKiAgVGhlbiB3ZSBqdXN0IGdyYWIgaW50ZXJlc3RpbmcgZ3JhbW1hciBwcm9wZXJ0aWVzLgorICovCitwdWJsaWMgY2xhc3MgR3JhbW1hclNwZWx1bmtlciB7CisgICAgcHJvdGVjdGVkIFN0cmluZyBncmFtbWFyRmlsZU5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0b2tlbjsKKyAgICBwcm90ZWN0ZWQgU2Nhbm5lciBzY2FubmVyOworCisgICAgLy8gZ3JhbW1hciBpbmZvIC8gcHJvcGVydGllcworICAgIHByb3RlY3RlZCBTdHJpbmcgZ3JhbW1hck1vZGlmaWVyOworICAgIHByb3RlY3RlZCBTdHJpbmcgZ3JhbW1hck5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0b2tlblZvY2FiOworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFuZ3VhZ2UgPSAiSmF2YSI7IC8vIGRlZmF1bHQKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlucHV0RGlyZWN0b3J5OworICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gaW1wb3J0ZWRHcmFtbWFyczsKKworICAgIHB1YmxpYyBHcmFtbWFyU3BlbHVua2VyKFN0cmluZyBpbnB1dERpcmVjdG9yeSwgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSkgeworICAgICAgICB0aGlzLmlucHV0RGlyZWN0b3J5ID0gaW5wdXREaXJlY3Rvcnk7CisgICAgICAgIHRoaXMuZ3JhbW1hckZpbGVOYW1lID0gZ3JhbW1hckZpbGVOYW1lOworICAgIH0KKworICAgIHZvaWQgY29uc3VtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IHRva2VuID0gc2Nhbm5lci5uZXh0VG9rZW4oKTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbWF0Y2goU3RyaW5nIGV4cGVjdGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoICIrZXhwZWN0aW5nKyI7IGlzICIrdG9rZW4pOworICAgICAgICBpZiAoIHRva2VuLmVxdWFscyhleHBlY3RpbmcpICkgY29uc3VtZSgpOworICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcigiRXJyb3IgcGFyc2luZyAiK2dyYW1tYXJGaWxlTmFtZSsiOiAnIit0b2tlbisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgbm90IGV4cGVjdGVkICciK2V4cGVjdGluZysiJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhcnNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVhZGVyIHIgPSBuZXcgRmlsZVJlYWRlcigoaW5wdXREaXJlY3RvcnkgIT0gbnVsbCA/IGlucHV0RGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgOiAiIikgKyBncmFtbWFyRmlsZU5hbWUpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihicik7CisgICAgICAgICAgICBjb25zdW1lKCk7CisgICAgICAgICAgICBncmFtbWFySGVhZGVyKCk7CisgICAgICAgICAgICAvLyBzY2FuIHVudGlsIGltcG9ydHMgb3Igb3B0aW9ucworICAgICAgICAgICAgd2hpbGUgKCB0b2tlbiE9bnVsbCAmJiAhdG9rZW4uZXF1YWxzKCJAIikgJiYgIXRva2VuLmVxdWFscygiOiIpICYmCisgICAgICAgICAgICAgICAgICAgICF0b2tlbi5lcXVhbHMoImltcG9ydCIpICYmICF0b2tlbi5lcXVhbHMoIm9wdGlvbnMiKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCB0b2tlbi5lcXVhbHMoIm9wdGlvbnMiKSApIG9wdGlvbnMoKTsKKyAgICAgICAgICAgIC8vIHNjYW4gdW50aWwgb3B0aW9ucyBvciBmaXJzdCBydWxlCisgICAgICAgICAgICB3aGlsZSAoIHRva2VuIT1udWxsICYmICF0b2tlbi5lcXVhbHMoIkAiKSAmJiAhdG9rZW4uZXF1YWxzKCI6IikgJiYKKyAgICAgICAgICAgICAgICAgICAgIXRva2VuLmVxdWFscygiaW1wb3J0IikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdG9rZW4uZXF1YWxzKCJpbXBvcnQiKSApIGltcG9ydHMoKTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSByZXN0IG9mIGlucHV0OyBjbG9zZSB1cCBzaG9wCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBpZiAoIGJyIT1udWxsICkgYnIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGdyYW1tYXJIZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIHRva2VuPT1udWxsICkgcmV0dXJuOworICAgICAgICBpZiAoIHRva2VuLmVxdWFscygidHJlZSIpIHx8IHRva2VuLmVxdWFscygicGFyc2VyIikgfHwgdG9rZW4uZXF1YWxzKCJsZXhlciIpICkgeworICAgICAgICAgICAgZ3JhbW1hck1vZGlmaWVyPXRva2VuOworICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICB9CisgICAgICAgIG1hdGNoKCJncmFtbWFyIik7CisgICAgICAgIGdyYW1tYXJOYW1lID0gdG9rZW47CisgICAgICAgIGNvbnN1bWUoKTsgLy8gbW92ZSBiZXlvbmQgbmFtZQorICAgIH0KKworICAgIC8vIGxvb2tzIGxpa2UgIm9wdGlvbnMgeyBiYWNrdHJhY2sgdHJ1ZSA7IHRva2VuVm9jYWIgTXlUb2tlbnMgOyB9IgorICAgIHByb3RlY3RlZCB2b2lkIG9wdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtYXRjaCgib3B0aW9ucyIpOworICAgICAgICBtYXRjaCgieyIpOworICAgICAgICB3aGlsZSAoIHRva2VuIT1udWxsICYmICF0b2tlbi5lcXVhbHMoIn0iKSApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdG9rZW47CisgICAgICAgICAgICBjb25zdW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0b2tlbjsKKyAgICAgICAgICAgIGNvbnN1bWUoKTsKKyAgICAgICAgICAgIG1hdGNoKCI7Iik7CisgICAgICAgICAgICBpZiAoIG5hbWUuZXF1YWxzKCJ0b2tlblZvY2FiIikgKSB0b2tlblZvY2FiID0gdmFsdWU7CisgICAgICAgICAgICBpZiAoIG5hbWUuZXF1YWxzKCJsYW5ndWFnZSIpICkgbGFuZ3VhZ2UgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBtYXRjaCgifSIpOworICAgIH0KKworICAgIC8vIGxvb2tzIGxpa2UgImltcG9ydCBKYXZhRGVjbCBKYXZhQW5ub3RhdGlvbnMgSmF2YUV4cHIgOyIKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbXBvcnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbWF0Y2goImltcG9ydCIpOworICAgICAgICBpbXBvcnRlZEdyYW1tYXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHdoaWxlICggdG9rZW4hPW51bGwgJiYgIXRva2VuLmVxdWFscygiOyIpICkgeworICAgICAgICAgICAgaW1wb3J0ZWRHcmFtbWFycy5hZGQodG9rZW4pOworICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICB9CisgICAgICAgIG1hdGNoKCI7Iik7CisgICAgICAgIGlmICggaW1wb3J0ZWRHcmFtbWFycy5zaXplKCk9PTAgKSBpbXBvcnRlZEdyYW1tYXJzID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJNb2RpZmllcigpIHsgcmV0dXJuIGdyYW1tYXJNb2RpZmllcjsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyTmFtZSgpIHsgcmV0dXJuIGdyYW1tYXJOYW1lOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuVm9jYWIoKSB7IHJldHVybiB0b2tlblZvY2FiOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgeyByZXR1cm4gbGFuZ3VhZ2U7IH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW1wb3J0ZWRHcmFtbWFycygpIHsgcmV0dXJuIGltcG9ydGVkR3JhbW1hcnM7IH0KKworICAgIC8qKiBTdHJpcCBjb21tZW50cyBhbmQgdGhlbiByZXR1cm4gc3RyZWFtIG9mIHdvcmRzIGFuZAorICAgICAqICB0b2tlbnMgeyc7JywgJzonLCAneycsICd9J30KKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY2FubmVyIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7CisgICAgICAgIFJlYWRlciBpbnB1dDsKKyAgICAgICAgaW50IGM7CisKKyAgICAgICAgcHVibGljIFNjYW5uZXIoUmVhZGVyIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OworICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0RJR0lUKCkgeyByZXR1cm4gYz49JzAnJiZjPD0nOSc7IH0KKyAgICAgICAgYm9vbGVhbiBpc0lEX1NUQVJUKCkgeyByZXR1cm4gYz49J2EnJiZjPD0neicgfHwgYz49J0EnJiZjPD0nWic7IH0KKyAgICAgICAgYm9vbGVhbiBpc0lEX0xFVFRFUigpIHsgcmV0dXJuIGlzSURfU1RBUlQoKSB8fCBjPj0nMCcmJmM8PSc5JyB8fCBjPT0nXyc7IH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgY29uc3VtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IGMgPSBpbnB1dC5yZWFkKCk7IH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIG5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB3aGlsZSAoIGMhPUVPRiApIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2hlY2sgIisoY2hhciljKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBjICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICc7JyA6IGNvbnN1bWUoKTsgcmV0dXJuICI7IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAneycgOiBjb25zdW1lKCk7IHJldHVybiAieyI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nIDogY29uc3VtZSgpOyByZXR1cm4gIn0iOworICAgICAgICAgICAgICAgICAgICBjYXNlICc6JyA6IGNvbnN1bWUoKTsgcmV0dXJuICI6IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnQCcgOiBjb25zdW1lKCk7IHJldHVybiAiQCI7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nIDogQ09NTUVOVCgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCcnOiByZXR1cm4gU1RSSU5HKCk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlzSURfU1RBUlQoKSApIHJldHVybiBJRCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGlzRElHSVQoKSApIHJldHVybiBJTlQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsgLy8gaWdub3JlIGFueXRoaW5nIGVsc2UKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBOQU1FIDogTEVUVEVSKyA7IC8vIE5BTUUgaXMgc2VxdWVuY2Ugb2YgPj0xIGxldHRlciAqLworICAgICAgICBTdHJpbmcgSUQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIHdoaWxlICggYyE9RU9GICYmIGlzSURfTEVUVEVSKCkgKSB7IGJ1Zi5hcHBlbmQoKGNoYXIpYyk7IGNvbnN1bWUoKTsgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIElOVCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgd2hpbGUgKCBjIT1FT0YgJiYgaXNESUdJVCgpICkgeyBidWYuYXBwZW5kKChjaGFyKWMpOyBjb25zdW1lKCk7IH0KKyAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBTVFJJTkcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGNvbnN1bWUoKTsKKyAgICAgICAgICAgIHdoaWxlICggYyE9RU9GICYmIGMhPSdcJycgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjPT0nXFwnICkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKWMpOworICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpYyk7CisgICAgICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3VtZSgpOyAvLyBzY2FuIHBhc3QgJworICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBDT01NRU5UKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICggYz09Jy8nICkgeworICAgICAgICAgICAgICAgIGNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIGM9PScqJyApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICBzY2FyZjoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCB0cnVlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjPT0nKicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYz09Jy8nICkgeyBjb25zdW1lKCk7IGJyZWFrIHNjYXJmOyB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGMhPUVPRiAmJiBjIT0nKicgKSBjb25zdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGM9PScvJyApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBjIT1FT0YgJiYgYyE9J1xuJyApIGNvbnN1bWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdGVyOyBHaXZlIGdyYW1tYXIgZmlsZW5hbWUgYXMgYXJnICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhbW1hclNwZWx1bmtlciBnID0gbmV3IEdyYW1tYXJTcGVsdW5rZXIoIi4iLCBhcmdzWzBdKTsKKyAgICAgICAgZy5wYXJzZSgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZy5ncmFtbWFyTW9kaWZpZXIrIiBncmFtbWFyICIrZy5ncmFtbWFyTmFtZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibGFuZ3VhZ2U9IitnLmxhbmd1YWdlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlblZvY2FiPSIrZy50b2tlblZvY2FiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbXBvcnRzPSIrZy5pbXBvcnRlZEdyYW1tYXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTeW50YXhNZXNzYWdlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJTeW50YXhNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwY2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclN5bnRheE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKKy8qKiBBIHByb2JsZW0gd2l0aCB0aGUgc3ludGF4IG9mIHlvdXIgYW50bHIgZ3JhbW1hciBzdWNoIGFzCisgKiAgIlRoZSAneycgY2FtZSBhcyBhIGNvbXBsZXRlIHN1cnByaXNlIHRvIG1lIGF0IHRoaXMgcG9pbnQgaW4geW91ciBwcm9ncmFtIgorICovCitwdWJsaWMgY2xhc3MgR3JhbW1hclN5bnRheE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgR3JhbW1hciBnOworCS8qKiBNb3N0IG9mIHRoZSB0aW1lLCB3ZSdsbCBoYXZlIGEgdG9rZW4gYW5kIHNvIHRoaXMgd2lsbCBiZSBzZXQuICovCisJcHVibGljIFRva2VuIG9mZmVuZGluZ1Rva2VuOworCXB1YmxpYyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleGNlcHRpb247CisKKwlwdWJsaWMgR3JhbW1hclN5bnRheE1lc3NhZ2UoaW50IG1zZ0lELAorCQkJCQkJCQlHcmFtbWFyIGdyYW1tYXIsCisJCQkJCQkJCVRva2VuIG9mZmVuZGluZ1Rva2VuLAorCQkJCQkJCQlSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pCisJeworCQl0aGlzKG1zZ0lELGdyYW1tYXIsb2ZmZW5kaW5nVG9rZW4sbnVsbCxleGNlcHRpb24pOworCX0KKworCXB1YmxpYyBHcmFtbWFyU3ludGF4TWVzc2FnZShpbnQgbXNnSUQsCisJCQkJCQkJCUdyYW1tYXIgZ3JhbW1hciwKKwkJCQkJCQkJVG9rZW4gb2ZmZW5kaW5nVG9rZW4sCisJCQkJCQkJCU9iamVjdCBhcmcsCisJCQkJCQkJCVJlY29nbml0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKKwl7CisJCXN1cGVyKG1zZ0lELCBhcmcsIG51bGwpOworCQl0aGlzLm9mZmVuZGluZ1Rva2VuID0gb2ZmZW5kaW5nVG9rZW47CisJCXRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworCQl0aGlzLmcgPSBncmFtbWFyOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWxpbmUgPSAwOworCQljb2x1bW4gPSAwOworCQlpZiAoIG9mZmVuZGluZ1Rva2VuIT1udWxsICkgeworCQkJbGluZSA9IG9mZmVuZGluZ1Rva2VuLmdldExpbmUoKTsKKwkJCWNvbHVtbiA9IG9mZmVuZGluZ1Rva2VuLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQl9CisJCS8vIFRPRE86IGFjdHVhbGx5IHNldCB0aGUgcmlnaHQgR3JhbW1hciBpbnN0YW5jZSB0byBnZXQgdGhlIGZpbGVuYW1lCisJCS8vIFRPRE86IGhhdmUgdG8gdXBkYXRlIGFsbCB2MiBncmFtbWFyIGZpbGVzIGZvciB0aGlzLiBvciB1c2UgZXJyb3JtYW5hZ2VyIGFuZCB0b29sIHRvIGdldCB0aGUgY3VycmVudCBncmFtbWFyCisJCWlmIChnICE9IG51bGwpIHsKKwkJCWZpbGUgPSBnLmdldEZpbGVOYW1lKCk7CisJCX0KKwkJU1Qgc3QgPSBnZXRNZXNzYWdlVGVtcGxhdGUoKTsKKwkJaWYgKCBhcmchPW51bGwgKSB7CisJCQlzdC5hZGQoImFyZyIsIGFyZyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKHN0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJVbnJlYWNoYWJsZUFsdHNNZXNzYWdlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0dyYW1tYXJVbnJlYWNoYWJsZUFsdHNNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxOGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvR3JhbW1hclVucmVhY2hhYmxlQWx0c01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuRGVjaXNpb25Qcm9iZTsKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuTkZBU3RhdGU7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBSZXBvcnRzIGEgcG90ZW50aWFsIHBhcnNpbmcgaXNzdWUgd2l0aCBhIGRlY2lzaW9uOyB0aGUgZGVjaXNpb24gaXMKKyAqICBub25kZXRlcm1pbmlzdGljIGluIHNvbWUgd2F5LgorICovCitwdWJsaWMgY2xhc3MgR3JhbW1hclVucmVhY2hhYmxlQWx0c01lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgRGVjaXNpb25Qcm9iZSBwcm9iZTsKKyAgICBwdWJsaWMgTGlzdCBhbHRzOworCisJcHVibGljIEdyYW1tYXJVbnJlYWNoYWJsZUFsdHNNZXNzYWdlKERlY2lzaW9uUHJvYmUgcHJvYmUsCisJCQkJCQkJCQkJIExpc3QgYWx0cykKKwl7CisJCXN1cGVyKEVycm9yTWFuYWdlci5NU0dfVU5SRUFDSEFCTEVfQUxUUyk7CisJCXRoaXMucHJvYmUgPSBwcm9iZTsKKwkJdGhpcy5hbHRzID0gYWx0czsKKwkJLy8gZmxpcCBtc2cgSUQgaWYgYWx0cyBhcmUgYWN0dWFsbHkgdG9rZW4gcmVmcyBpbiBUb2tlbnMgcnVsZQorCQlpZiAoIHByb2JlLmRmYS5pc1Rva2Vuc1J1bGVEZWNpc2lvbigpICkgeworCQkJc2V0TWVzc2FnZUlEKEVycm9yTWFuYWdlci5NU0dfVU5SRUFDSEFCTEVfVE9LRU5TKTsKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCUdyYW1tYXJBU1QgZGVjaXNpb25BU1ROb2RlID0gcHJvYmUuZGZhLmdldERlY2lzaW9uQVNUTm9kZSgpOworCQlsaW5lID0gZGVjaXNpb25BU1ROb2RlLmdldExpbmUoKTsKKwkJY29sdW1uID0gZGVjaXNpb25BU1ROb2RlLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSBwcm9iZS5kZmEubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKTsKKwkJaWYgKCBmaWxlTmFtZSE9bnVsbCApIHsKKwkJCWZpbGUgPSBmaWxlTmFtZTsKKwkJfQorCisJCVNUIHN0ID0gZ2V0TWVzc2FnZVRlbXBsYXRlKCk7CisKKwkJaWYgKCBwcm9iZS5kZmEuaXNUb2tlbnNSdWxlRGVjaXNpb24oKSApIHsKKwkJCS8vIGFsdHMgYXJlIHRva2VuIHJ1bGVzLCBjb252ZXJ0IHRvIHRoZSBuYW1lcyBpbnN0ZWFkIG9mIG51bWJlcnMKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWx0cy5zaXplKCk7IGkrKykgeworCQkJCUludGVnZXIgYWx0SSA9IChJbnRlZ2VyKSBhbHRzLmdldChpKTsKKwkJCQlTdHJpbmcgdG9rZW5OYW1lID0KKwkJCQkJcHJvYmUuZ2V0VG9rZW5OYW1lRm9yVG9rZW5zUnVsZUFsdChhbHRJLmludFZhbHVlKCkpOworCQkJCS8vIHJlc2V0IHRoZSBsaW5lL2NvbCB0byB0aGUgdG9rZW4gZGVmaW5pdGlvbgorCQkJCU5GQVN0YXRlIHJ1bGVTdGFydCA9CisJCQkJCXByb2JlLmRmYS5uZmEuZ3JhbW1hci5nZXRSdWxlU3RhcnRTdGF0ZSh0b2tlbk5hbWUpOworCQkJCWxpbmUgPSBydWxlU3RhcnQuYXNzb2NpYXRlZEFTVE5vZGUuZ2V0TGluZSgpOworCQkJCWNvbHVtbiA9IHJ1bGVTdGFydC5hc3NvY2lhdGVkQVNUTm9kZS5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJCQlzdC5hZGQoInRva2VucyIsIHRva2VuTmFtZSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvLyByZWd1bGFyIGFsdCBudW1iZXJzLCBzaG93IHRoZSBhbHRzCisJCQlzdC5hZGQoImFsdHMiLCBhbHRzKTsKKwkJfQorCisJCXJldHVybiBzdXBlci50b1N0cmluZyhzdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0ludGVycC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9JbnRlcnAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE0OWJkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9JbnRlcnAuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlBhcnNlVHJlZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworLyoqIEludGVycHJldCBhbnkgQU5UTFIgZ3JhbW1hcjoKKyAqCisgKiAgamF2YSBJbnRlcnAgZmlsZS5nIHRva2Vucy10by1pZ25vcmUgc3RhcnQtcnVsZSBpbnB1dC1maWxlCisgKgorICogIGphdmEgSW50ZXJwIEMuZyAnV1MgQ09NTUVOVCcgcHJvZ3JhbSB0LmMKKyAqCisgKiAgd2hlcmUgdGhlIFdTIGFuZCBDT01NRU5UIGFyZSB0aGUgbmFtZXMgb2YgdG9rZW5zIHlvdSB3YW50IHRvIGhhdmUKKyAqICB0aGUgcGFyc2VyIGlnbm9yZS4KKyAqLworcHVibGljIGNsYXNzIEludGVycCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXJpbmdUb2tlblN0cmVhbSBleHRlbmRzIENvbW1vblRva2VuU3RyZWFtIHsKKyAgICAgICAgcHVibGljIEZpbHRlcmluZ1Rva2VuU3RyZWFtKFRva2VuU291cmNlIHNyYykgeyBzdXBlcihzcmMpOyB9CisgICAgICAgIFNldDxJbnRlZ2VyPiBoaWRlID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3luYyhpbnQgaSkgeworICAgICAgICAgICAgc3VwZXIuc3luYyhpKTsKKyAgICAgICAgICAgIGlmICggaGlkZS5jb250YWlucyhnZXQoaSkuZ2V0VHlwZSgpKSApIGdldChpKS5zZXRDaGFubmVsKFRva2VuLkhJRERFTl9DSEFOTkVMKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlblR5cGVDaGFubmVsKGludCB0dHlwZSwgaW50IGNoYW5uZWwpIHsKKyAgICAgICAgICAgIGhpZGUuYWRkKHR0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworCS8vIHBhc3MgbWUgYSBqYXZhIGZpbGUgdG8gcGFyc2UKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaWYgKCBhcmdzLmxlbmd0aCE9NCApIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiamF2YSBJbnRlcnAgZmlsZS5nIHRva2Vucy10by1pZ25vcmUgc3RhcnQtcnVsZSBpbnB1dC1maWxlIik7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGFyZ3NbMF07CisJCVN0cmluZyBpZ25vcmVUb2tlbnMgPSBhcmdzWzFdOworCQlTdHJpbmcgc3RhcnRSdWxlID0gYXJnc1syXTsKKwkJU3RyaW5nIGlucHV0RmlsZU5hbWUgPSBhcmdzWzNdOworCisJCS8vIFRPRE86IHVzaW5nIHdyb25nIGNvbnN0cnVjdG9yIG5vdworCQlUb29sIHRvb2wgPSBuZXcgVG9vbCgpOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgcGFyc2VyID0gbmV3IEdyYW1tYXIodG9vbCwgZ3JhbW1hckZpbGVOYW1lLCBjb21wb3NpdGUpOworCQljb21wb3NpdGUuc2V0RGVsZWdhdGlvblJvb3QocGFyc2VyKTsKKwkJRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKGdyYW1tYXJGaWxlTmFtZSk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKwkJcGFyc2VyLnBhcnNlQW5kQnVpbGRBU1QoYnIpOworCQlici5jbG9zZSgpOworCisJCXBhcnNlci5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCQlwYXJzZXIuY29tcG9zaXRlLmRlZmluZUdyYW1tYXJTeW1ib2xzKCk7CisJCXBhcnNlci5jb21wb3NpdGUuY3JlYXRlTkZBcygpOworCisJCUxpc3QgbGVmdFJlY3Vyc2l2ZVJ1bGVzID0gcGFyc2VyLmNoZWNrQWxsUnVsZXNGb3JMZWZ0UmVjdXJzaW9uKCk7CisJCWlmICggbGVmdFJlY3Vyc2l2ZVJ1bGVzLnNpemUoKT4wICkgeworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCBwYXJzZXIuZ2V0UnVsZShzdGFydFJ1bGUpPT1udWxsICkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmRlZmluZWQgc3RhcnQgcnVsZSAiK3N0YXJ0UnVsZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlTdHJpbmcgbGV4ZXJHcmFtbWFyVGV4dCA9IHBhcnNlci5nZXRMZXhlckdyYW1tYXIoKTsKKwkJR3JhbW1hciBsZXhlciA9IG5ldyBHcmFtbWFyKHRvb2wpOworCQlsZXhlci5pbXBvcnRUb2tlblZvY2FidWxhcnkocGFyc2VyKTsKKwkJbGV4ZXIuZmlsZU5hbWUgPSBncmFtbWFyRmlsZU5hbWU7CisJCWxleGVyLnNldFRvb2wodG9vbCk7CisJCWlmICggbGV4ZXJHcmFtbWFyVGV4dCE9bnVsbCApIHsKKwkJCWxleGVyLnNldEdyYW1tYXJDb250ZW50KGxleGVyR3JhbW1hclRleHQpOworCQl9CisJCWVsc2UgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJubyBsZXhlciBncmFtbWFyIGZvdW5kIGluICIrZ3JhbW1hckZpbGVOYW1lKTsKKwkJfQorCQlsZXhlci5jb21wb3NpdGUuY3JlYXRlTkZBcygpOworCQkKKwkJQ2hhclN0cmVhbSBpbnB1dCA9CisJCQluZXcgQU5UTFJGaWxlU3RyZWFtKGlucHV0RmlsZU5hbWUpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIobGV4ZXIsIGlucHV0KTsKKwkJRmlsdGVyaW5nVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IEZpbHRlcmluZ1Rva2VuU3RyZWFtKGxleEVuZ2luZSk7CisJCVN0cmluZ1Rva2VuaXplciB0ayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaWdub3JlVG9rZW5zLCAiICIpOworCQl3aGlsZSAoIHRrLmhhc01vcmVUb2tlbnMoKSApIHsKKwkJCVN0cmluZyB0b2tlbk5hbWUgPSB0ay5uZXh0VG9rZW4oKTsKKwkJCXRva2Vucy5zZXRUb2tlblR5cGVDaGFubmVsKGxleGVyLmdldFRva2VuVHlwZSh0b2tlbk5hbWUpLCA5OSk7CisJCX0KKworCQlpZiAoIHBhcnNlci5nZXRSdWxlKHN0YXJ0UnVsZSk9PW51bGwgKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlJ1bGUgIitzdGFydFJ1bGUrIiBkb2VzIG5vdCBleGlzdCBpbiAiK2dyYW1tYXJGaWxlTmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJSW50ZXJwcmV0ZXIgcGFyc2VFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIocGFyc2VyLCB0b2tlbnMpOworCQlQYXJzZVRyZWUgdCA9IHBhcnNlRW5naW5lLnBhcnNlKHN0YXJ0UnVsZSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbih0LnRvU3RyaW5nVHJlZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0ludGVycHJldGVyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0ludGVycHJldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0ZTk1YwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvSW50ZXJwcmV0ZXIuamF2YQpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRGQTsKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuKjsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5JbnRlcnZhbFNldDsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLmRlYnVnLkJsYW5rRGVidWdFdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLmRlYnVnLkRlYnVnRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5kZWJ1Zy5QYXJzZVRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUGFyc2VUcmVlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvKiogVGhlIHJlY29nbml0aW9uIGludGVycHJldGVyL2VuZ2luZSBmb3IgZ3JhbW1hcnMuICBTZXBhcmF0ZWQKKyAqICBvdXQgb2YgR3JhbW1hciBhcyBpdCdzIHJlbGF0ZWQsIGJ1dCB0ZWNobmljYWxseSBub3QgYSBHcmFtbWFyIGZ1bmN0aW9uLgorICogIFlvdSBjcmVhdGUgYW4gaW50ZXJwcmV0ZXIgZm9yIGEgZ3JhbW1hciBhbmQgYW4gaW5wdXQgc3RyZWFtLiAgVGhpcyBvYmplY3QKKyAqICBjYW4gYWN0IGFzIGEgVG9rZW5Tb3VyY2Ugc28gdGhhdCB5b3UgY2FuIGhvb2sgdXAgdHdvIGdyYW1tYXJzICh2aWEKKyAqICBhIENvbW1vblRva2VuU3RyZWFtKSB0byBsZXgvcGFyc2UuICBCZWluZyBhIHRva2VuIHNvdXJjZSBvbmx5IG1ha2VzIHNlbnNlCisgKiAgZm9yIGEgbGV4ZXIgZ3JhbW1hciBvZiBjb3Vyc2UuCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcnByZXRlciBpbXBsZW1lbnRzIFRva2VuU291cmNlIHsKKwlwcm90ZWN0ZWQgR3JhbW1hciBncmFtbWFyOworCXByb3RlY3RlZCBJbnRTdHJlYW0gaW5wdXQ7CisKKwkvKiogQSBsZXhlciBsaXN0ZW5lciB0aGF0IGp1c3QgY3JlYXRlcyB0b2tlbiBvYmplY3RzIGFzIHRoZXkKKwkgKiAgYXJlIG1hdGNoZWQuICBzY2FuKCkgdXNlIHRoaXMgbGlzdGVuZXIgdG8gZ2V0IGEgc2luZ2xlIG9iamVjdC4KKwkgKiAgVG8gZ2V0IGEgc3RyZWFtIG9mIHRva2VucywgeW91IG11c3QgY2FsbCBzY2FuKCkgbXVsdGlwbGUgdGltZXMsCisJICogIHJlY29yZGluZyB0aGUgdG9rZW4gb2JqZWN0IHJlc3VsdCBhZnRlciBlYWNoIGNhbGwuCisJICovCisJY2xhc3MgTGV4ZXJBY3Rpb25HZXRUb2tlblR5cGUgZXh0ZW5kcyBCbGFua0RlYnVnRXZlbnRMaXN0ZW5lciB7CisJCXB1YmxpYyBDb21tb25Ub2tlbiB0b2tlbjsKKwkJR3JhbW1hciBnOworCQlwdWJsaWMgTGV4ZXJBY3Rpb25HZXRUb2tlblR5cGUoR3JhbW1hciBnKSB7CisJCQl0aGlzLmcgPSBnOworCQl9CisKKwkJcHVibGljIHZvaWQgZXhpdFJ1bGUoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgU3RyaW5nIHJ1bGVOYW1lKSB7CisJCQlpZiAoICFydWxlTmFtZS5lcXVhbHMoR3JhbW1hci5BUlRJRklDSUFMX1RPS0VOU19SVUxFTkFNRSkgKXsKKwkJCQlpbnQgdHlwZSA9IGcuZ2V0VG9rZW5UeXBlKHJ1bGVOYW1lKTsKKwkJCQlpbnQgY2hhbm5lbCA9IFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKwkJCQl0b2tlbiA9IG5ldyBDb21tb25Ub2tlbigoQ2hhclN0cmVhbSlpbnB1dCx0eXBlLGNoYW5uZWwsMCwwKTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBJbnRlcnByZXRlcihHcmFtbWFyIGdyYW1tYXIsIEludFN0cmVhbSBpbnB1dCkgeworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCQl0aGlzLmlucHV0ID0gaW5wdXQ7CisJfQorCisJcHVibGljIFRva2VuIG5leHRUb2tlbigpIHsKKwkJaWYgKCBncmFtbWFyLnR5cGUhPUdyYW1tYXIuTEVYRVIgKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIGlucHV0LkxBKDEpPT1DaGFyU3RyZWFtLkVPRiApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbW9uVG9rZW4oKENoYXJTdHJlYW0paW5wdXQsVG9rZW4uRU9GLFRva2VuLkRFRkFVTFRfQ0hBTk5FTCxpbnB1dC5pbmRleCgpLGlucHV0LmluZGV4KCkpOworCQl9CisJCWludCBzdGFydCA9IGlucHV0LmluZGV4KCk7CisJCWludCBjaGFyUG9zID0gKChDaGFyU3RyZWFtKWlucHV0KS5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKwkJQ29tbW9uVG9rZW4gdG9rZW4gPSBudWxsOworCQlsb29wOgorCQl3aGlsZSAoaW5wdXQuTEEoMSkhPUNoYXJTdHJlYW0uRU9GKSB7CisJCQl0cnkgeworCQkJCXRva2VuID0gc2NhbihHcmFtbWFyLkFSVElGSUNJQUxfVE9LRU5TX1JVTEVOQU1FLCBudWxsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworCQkJCS8vIHJlcG9ydCBhIHByb2JsZW0gYW5kIHRyeSBmb3IgYW5vdGhlcgorCQkJCXJlcG9ydFNjYW5FcnJvcihyZSk7CisJCQkJY29udGludWUgbG9vcDsKKwkJCX0KKwkJfQorCQkvLyB0aGUgc2NhbiBjYW4gb25seSBzZXQgdHlwZQorCQkvLyB3ZSBtdXN0IHNldCB0aGUgbGluZSwgYW5kIG90aGVyIGp1bmsgaGVyZSB0byBtYWtlIGl0IGEgY29tcGxldGUgdG9rZW4KKwkJaW50IHN0b3AgPSBpbnB1dC5pbmRleCgpLTE7CisJCWlmICggdG9rZW49PW51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1vblRva2VuKChDaGFyU3RyZWFtKWlucHV0LFRva2VuLkVPRixUb2tlbi5ERUZBVUxUX0NIQU5ORUwsc3RhcnQsc3RhcnQpOworCQl9CisJCXRva2VuLnNldExpbmUoKChDaGFyU3RyZWFtKWlucHV0KS5nZXRMaW5lKCkpOworCQl0b2tlbi5zZXRTdGFydEluZGV4KHN0YXJ0KTsKKwkJdG9rZW4uc2V0U3RvcEluZGV4KHN0b3ApOworCQl0b2tlbi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoY2hhclBvcyk7CisJCXJldHVybiB0b2tlbjsKKwl9CisKKwkvKiogRm9yIGEgZ2l2ZW4gaW5wdXQgY2hhciBzdHJlYW0sIHRyeSB0byBtYXRjaCBhZ2FpbnN0IHRoZSBORkEKKwkgKiAgc3RhcnRpbmcgYXQgc3RhcnRSdWxlLiAgVGhpcyBpcyBhIGRldGVybWluaXN0aWMgcGFyc2UgZXZlbiB0aG91Z2gKKwkgKiAgaXQgaXMgdXNpbmcgYW4gTkZBIGJlY2F1c2UgaXQgdXNlcyBERkFzIGF0IGVhY2ggZGVjaXNpb24gcG9pbnQgdG8KKwkgKiAgcHJlZGljdCB3aGljaCBhbHRlcm5hdGl2ZSB3aWxsIHN1Y2NlZWQuICBUaGlzIGlzIGV4YWN0bHkgd2hhdCB0aGUKKwkgKiAgZ2VuZXJhdGVkIHBhcnNlciB3aWxsIGRvLgorCSAqCisJICogIFRoaXMgb25seSBkb2VzIGxleGVyIGdyYW1tYXJzLgorCSAqCisJICogIFJldHVybiB0aGUgdG9rZW4gdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbmFsIHJ1bGUgZW5kIHN0YXRlLgorCSAqLworCXB1YmxpYyB2b2lkIHNjYW4oU3RyaW5nIHN0YXJ0UnVsZSwKKwkJCQkJIERlYnVnRXZlbnRMaXN0ZW5lciBhY3Rpb25zLAorCQkJCQkgTGlzdCB2aXNpdGVkU3RhdGVzKQorCQl0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KKwl7CisJCWlmICggZ3JhbW1hci50eXBlIT1HcmFtbWFyLkxFWEVSICkgeworCQkJcmV0dXJuOworCQl9CisJCUNoYXJTdHJlYW0gaW4gPSAoQ2hhclN0cmVhbSl0aGlzLmlucHV0OworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NhbigiK3N0YXJ0UnVsZSsiLCciK2luLnN1YnN0cmluZyhpbi5pbmRleCgpLGluLnNpemUoKS0xKSsiJykiKTsKKwkJLy8gQnVpbGQgTkZBcy9ERkFzIGZyb20gdGhlIGdyYW1tYXIgQVNUIGlmIE5GQXMgaGF2ZW4ndCBiZWVuIGJ1aWx0IHlldAorCQlpZiAoIGdyYW1tYXIuZ2V0UnVsZVN0YXJ0U3RhdGUoc3RhcnRSdWxlKT09bnVsbCApIHsKKwkJCWdyYW1tYXIuYnVpbGRORkEoKTsKKwkJfQorCisJCWlmICggIWdyYW1tYXIuYWxsRGVjaXNpb25ERkFIYXZlQmVlbkNyZWF0ZWQoKSApIHsKKwkJCS8vIENyZWF0ZSB0aGUgREZBIHByZWRpY3RvcnMgZm9yIGVhY2ggZGVjaXNpb24KKwkJCWdyYW1tYXIuY3JlYXRlTG9va2FoZWFkREZBcygpOworCQl9CisKKwkJLy8gZG8gdGhlIHBhcnNlCisJCVN0YWNrIHJ1bGVJbnZvY2F0aW9uU3RhY2sgPSBuZXcgU3RhY2soKTsKKwkJTkZBU3RhdGUgc3RhcnQgPSBncmFtbWFyLmdldFJ1bGVTdGFydFN0YXRlKHN0YXJ0UnVsZSk7CisJCU5GQVN0YXRlIHN0b3AgPSBncmFtbWFyLmdldFJ1bGVTdG9wU3RhdGUoc3RhcnRSdWxlKTsKKwkJcGFyc2VFbmdpbmUoc3RhcnRSdWxlLCBzdGFydCwgc3RvcCwgaW4sIHJ1bGVJbnZvY2F0aW9uU3RhY2ssCisJCQkJCWFjdGlvbnMsIHZpc2l0ZWRTdGF0ZXMpOworCX0KKworCXB1YmxpYyBDb21tb25Ub2tlbiBzY2FuKFN0cmluZyBzdGFydFJ1bGUpCisJCXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHNjYW4oc3RhcnRSdWxlLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgQ29tbW9uVG9rZW4gc2NhbihTdHJpbmcgc3RhcnRSdWxlLAorCQkJCQkJCUxpc3QgdmlzaXRlZFN0YXRlcykKKwkJdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uCisJeworCQlMZXhlckFjdGlvbkdldFRva2VuVHlwZSBhY3Rpb25zID0gbmV3IExleGVyQWN0aW9uR2V0VG9rZW5UeXBlKGdyYW1tYXIpOworCQlzY2FuKHN0YXJ0UnVsZSwgYWN0aW9ucywgdmlzaXRlZFN0YXRlcyk7CisJCXJldHVybiBhY3Rpb25zLnRva2VuOworCX0KKworCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBzdGFydFJ1bGUsCisJCQkJCSAgRGVidWdFdmVudExpc3RlbmVyIGFjdGlvbnMsCisJCQkJCSAgTGlzdCB2aXNpdGVkU3RhdGVzKQorCQl0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KKwl7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJwYXJzZSgiK3N0YXJ0UnVsZSsiKSIpOworCQkvLyBCdWlsZCBORkFzL0RGQXMgZnJvbSB0aGUgZ3JhbW1hciBBU1QgaWYgTkZBcyBoYXZlbid0IGJlZW4gYnVpbHQgeWV0CisJCWlmICggZ3JhbW1hci5nZXRSdWxlU3RhcnRTdGF0ZShzdGFydFJ1bGUpPT1udWxsICkgeworCQkJZ3JhbW1hci5idWlsZE5GQSgpOworCQl9CisJCWlmICggIWdyYW1tYXIuYWxsRGVjaXNpb25ERkFIYXZlQmVlbkNyZWF0ZWQoKSApIHsKKwkJCS8vIENyZWF0ZSB0aGUgREZBIHByZWRpY3RvcnMgZm9yIGVhY2ggZGVjaXNpb24KKwkJCWdyYW1tYXIuY3JlYXRlTG9va2FoZWFkREZBcygpOworCQl9CisJCS8vIGRvIHRoZSBwYXJzZQorCQlTdGFjayBydWxlSW52b2NhdGlvblN0YWNrID0gbmV3IFN0YWNrKCk7CisJCU5GQVN0YXRlIHN0YXJ0ID0gZ3JhbW1hci5nZXRSdWxlU3RhcnRTdGF0ZShzdGFydFJ1bGUpOworCQlORkFTdGF0ZSBzdG9wID0gZ3JhbW1hci5nZXRSdWxlU3RvcFN0YXRlKHN0YXJ0UnVsZSk7CisJCXBhcnNlRW5naW5lKHN0YXJ0UnVsZSwgc3RhcnQsIHN0b3AsIGlucHV0LCBydWxlSW52b2NhdGlvblN0YWNrLAorCQkJCQlhY3Rpb25zLCB2aXNpdGVkU3RhdGVzKTsKKwl9CisKKwlwdWJsaWMgUGFyc2VUcmVlIHBhcnNlKFN0cmluZyBzdGFydFJ1bGUpCisJCXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorCXsKKwkJcmV0dXJuIHBhcnNlKHN0YXJ0UnVsZSwgbnVsbCk7CisJfQorCisJcHVibGljIFBhcnNlVHJlZSBwYXJzZShTdHJpbmcgc3RhcnRSdWxlLCBMaXN0IHZpc2l0ZWRTdGF0ZXMpCisJCXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgorCXsKKwkJUGFyc2VUcmVlQnVpbGRlciBhY3Rpb25zID0gbmV3IFBhcnNlVHJlZUJ1aWxkZXIoZ3JhbW1hci5uYW1lKTsKKwkJdHJ5IHsKKwkJCXBhcnNlKHN0YXJ0UnVsZSwgYWN0aW9ucywgdmlzaXRlZFN0YXRlcyk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisJCQkvLyBFcnJvcnMgYXJlIHRyYWNrZWQgdmlhIHRoZSBBTlRMUkRlYnVnSW50ZXJmYWNlCisJCQkvLyBFeGNlcHRpb25zIGFyZSB1c2VkIGp1c3QgdG8gYmxhc3Qgb3V0IG9mIHRoZSBwYXJzZSBlbmdpbmUKKwkJCS8vIFRoZSBlcnJvciB3aWxsIGJlIGluIHRoZSBwYXJzZSB0cmVlLgorCQl9CisJCXJldHVybiBhY3Rpb25zLmdldFRyZWUoKTsKKwl9CisKKwkvKiogRmlsbCBhIGxpc3Qgb2YgYWxsIE5GQSBzdGF0ZXMgdmlzaXRlZCBkdXJpbmcgdGhlIHBhcnNlICovCisJcHJvdGVjdGVkIHZvaWQgcGFyc2VFbmdpbmUoU3RyaW5nIHN0YXJ0UnVsZSwKKwkJCQkJCQkgICBORkFTdGF0ZSBzdGFydCwKKwkJCQkJCQkgICBORkFTdGF0ZSBzdG9wLAorCQkJCQkJCSAgIEludFN0cmVhbSBpbnB1dCwKKwkJCQkJCQkgICBTdGFjayBydWxlSW52b2NhdGlvblN0YWNrLAorCQkJCQkJCSAgIERlYnVnRXZlbnRMaXN0ZW5lciBhY3Rpb25zLAorCQkJCQkJCSAgIExpc3QgdmlzaXRlZFN0YXRlcykKKwkJdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uCisJeworCQlORkFTdGF0ZSBzID0gc3RhcnQ7CisJCWlmICggYWN0aW9ucyE9bnVsbCApIHsKKwkJCWFjdGlvbnMuZW50ZXJSdWxlKHMubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKSwgc3RhcnQuZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJfQorCQlpbnQgdCA9IGlucHV0LkxBKDEpOworCQl3aGlsZSAoIHMhPXN0b3AgKSB7CisJCQlpZiAoIHZpc2l0ZWRTdGF0ZXMhPW51bGwgKSB7CisJCQkJdmlzaXRlZFN0YXRlcy5hZGQocyk7CisJCQl9CisJCQkvKgorCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJzZSBzdGF0ZSAiK3Muc3RhdGVOdW1iZXIrIiBpbnB1dD0iKworCQkJCXMubmZhLmdyYW1tYXIuZ2V0VG9rZW5EaXNwbGF5TmFtZSh0KSk7CisJCQkJKi8KKwkJCS8vIENBU0UgMTogZGVjaXNpb24gc3RhdGUKKwkJCWlmICggcy5nZXREZWNpc2lvbk51bWJlcigpPjAgJiYgcy5uZmEuZ3JhbW1hci5nZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShzKT4xICkgeworCQkJCS8vIGRlY2lzaW9uIHBvaW50LCBtdXN0IHByZWRpY3QgYW5kIGp1bXAgdG8gYWx0CisJCQkJREZBIGRmYSA9IHMubmZhLmdyYW1tYXIuZ2V0TG9va2FoZWFkREZBKHMuZ2V0RGVjaXNpb25OdW1iZXIoKSk7CisJCQkJLyoKKwkJCQlpZiAoIHMubmZhLmdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiApIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWNpc2lvbjogIisKKwkJCQkJCQkJICAgZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpLmdldERlc2NyaXB0aW9uKCkrCisJCQkJCQkJCSAgICIgaW5wdXQ9IitzLm5mYS5ncmFtbWFyLmdldFRva2VuRGlzcGxheU5hbWUodCkpOworCQkJCX0KKwkJCQkqLworCQkJCWludCBtID0gaW5wdXQubWFyaygpOworCQkJCWludCBwcmVkaWN0ZWRBbHQgPSBwcmVkaWN0KGRmYSk7CisJCQkJaWYgKCBwcmVkaWN0ZWRBbHQgPT0gTkZBLklOVkFMSURfQUxUX05VTUJFUiApIHsKKwkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZGZhLmdldE5GQURlY2lzaW9uU3RhcnRTdGF0ZSgpLmdldERlc2NyaXB0aW9uKCk7CisJCQkJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorCQkJCQkJbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGRlc2NyaXB0aW9uLAorCQkJCQkJCQkJCQkJCSAgZGZhLmdldERlY2lzaW9uTnVtYmVyKCksCisJCQkJCQkJCQkJCQkJICBzLnN0YXRlTnVtYmVyLAorCQkJCQkJCQkJCQkJCSAgaW5wdXQpOworCQkJCQlpZiAoIGFjdGlvbnMhPW51bGwgKSB7CisJCQkJCQlhY3Rpb25zLnJlY29nbml0aW9uRXhjZXB0aW9uKG52YWUpOworCQkJCQl9CisJCQkJCWlucHV0LmNvbnN1bWUoKTsgLy8gcmVjb3ZlcgorCQkJCQl0aHJvdyBudmFlOworCQkJCX0KKwkJCQlpbnB1dC5yZXdpbmQobSk7CisJCQkJaW50IHBhcnNlQWx0ID0KKwkJCQkJcy50cmFuc2xhdGVEaXNwbGF5QWx0VG9XYWxrQWx0KHByZWRpY3RlZEFsdCk7CisJCQkJLyoKKwkJCQlpZiAoIHMubmZhLmdyYW1tYXIudHlwZSE9R3JhbW1hci5MRVhFUiApIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcmVkaWN0ZWQgYWx0ICIrcHJlZGljdGVkQWx0KyIsIHBhcnNlQWx0ICIrCisJCQkJCQkJCQkgICBwYXJzZUFsdCk7CisJCQkJfQorCQkJCSovCisJCQkJTkZBU3RhdGUgYWx0OworCQkJCWlmICggcGFyc2VBbHQgPiBzLm5mYS5ncmFtbWFyLmdldE51bWJlck9mQWx0c0ZvckRlY2lzaW9uTkZBKHMpICkgeworCQkJCQkvLyBpbXBsaWVkIGJyYW5jaCBvZiBsb29wIGV0Yy4uLgorCQkJCQlhbHQgPSBzLm5mYS5ncmFtbWFyLm5mYS5nZXRTdGF0ZSggcy5lbmRPZkJsb2NrU3RhdGVOdW1iZXIgKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWFsdCA9IHMubmZhLmdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKHMsIHBhcnNlQWx0KTsKKwkJCQl9CisJCQkJcyA9IChORkFTdGF0ZSlhbHQudHJhbnNpdGlvblswXS50YXJnZXQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIENBU0UgMjogZmluaXNoZWQgbWF0Y2hpbmcgYSBydWxlCisJCQlpZiAoIHMuaXNBY2NlcHRTdGF0ZSgpICkgeyAvLyBlbmQgb2YgcnVsZSBub2RlCisJCQkJaWYgKCBhY3Rpb25zIT1udWxsICkgeworCQkJCQlhY3Rpb25zLmV4aXRSdWxlKHMubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKSwgcy5lbmNsb3NpbmdSdWxlLm5hbWUpOworCQkJCX0KKwkJCQlpZiAoIHJ1bGVJbnZvY2F0aW9uU3RhY2suZW1wdHkoKSApIHsKKwkJCQkJLy8gZG9uZSBwYXJzaW5nLiAgSGl0IHRoZSBzdGFydCBzdGF0ZS4KKwkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInN0YWNrIGVtcHR5IGluIHN0b3Agc3RhdGUgZm9yICIrcy5nZXRFbmNsb3NpbmdSdWxlKCkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gcG9wIGludm9raW5nIHN0YXRlIG9mZiB0aGUgc3RhY2sgdG8ga25vdyB3aGVyZSB0byByZXR1cm4gdG8KKwkJCQlORkFTdGF0ZSBpbnZva2luZ1N0YXRlID0gKE5GQVN0YXRlKXJ1bGVJbnZvY2F0aW9uU3RhY2sucG9wKCk7CisJCQkJUnVsZUNsb3N1cmVUcmFuc2l0aW9uIGludm9raW5nVHJhbnNpdGlvbiA9CisJCQkJCQkoUnVsZUNsb3N1cmVUcmFuc2l0aW9uKWludm9raW5nU3RhdGUudHJhbnNpdGlvblswXTsKKwkJCQkvLyBtb3ZlIHRvIG5vZGUgYWZ0ZXIgc3RhdGUgdGhhdCBpbnZva2VkIHRoaXMgcnVsZQorCQkJCXMgPSBpbnZva2luZ1RyYW5zaXRpb24uZm9sbG93U3RhdGU7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVRyYW5zaXRpb24gdHJhbnMgPSBzLnRyYW5zaXRpb25bMF07CisJCQlMYWJlbCBsYWJlbCA9IHRyYW5zLmxhYmVsOworCQkJaWYgKCBsYWJlbC5pc1NlbWFudGljUHJlZGljYXRlKCkgKSB7CisJCQkJRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIGZwZSA9CisJCQkJCW5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsCisJCQkJCQkJCQkJCQkgcy5lbmNsb3NpbmdSdWxlLm5hbWUsCisJCQkJCQkJCQkJCQkgImNhbid0IGRlYWwgd2l0aCBwcmVkaWNhdGVzIHlldCIpOworCQkJCWlmICggYWN0aW9ucyE9bnVsbCApIHsKKwkJCQkJYWN0aW9ucy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihmcGUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gQ0FTRSAzOiBlcHNpbG9uIHRyYW5zaXRpb24KKwkJCWlmICggbGFiZWwuaXNFcHNpbG9uKCkgKSB7CisJCQkJLy8gQ0FTRSAzYTogcnVsZSBpbnZvY2F0aW9uIHN0YXRlCisJCQkJaWYgKCB0cmFucyBpbnN0YW5jZW9mIFJ1bGVDbG9zdXJlVHJhbnNpdGlvbiApIHsKKwkJCQkJcnVsZUludm9jYXRpb25TdGFjay5wdXNoKHMpOworCQkJCQlzID0gKE5GQVN0YXRlKXRyYW5zLnRhcmdldDsKKwkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNhbGwgIitzLmVuY2xvc2luZ1J1bGUubmFtZSsiIGZyb20gIitzLm5mYS5ncmFtbWFyLmdldEZpbGVOYW1lKCkpOworCQkJCQlpZiAoIGFjdGlvbnMhPW51bGwgKSB7CisJCQkJCQlhY3Rpb25zLmVudGVyUnVsZShzLm5mYS5ncmFtbWFyLmdldEZpbGVOYW1lKCksIHMuZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCQkJfQorCQkJCQkvLyBjb3VsZCBiZSBqdW1waW5nIHRvIG5ldyBncmFtbWFyLCBtYWtlIHN1cmUgREZBIGNyZWF0ZWQKKwkJCQkJaWYgKCAhcy5uZmEuZ3JhbW1hci5hbGxEZWNpc2lvbkRGQUhhdmVCZWVuQ3JlYXRlZCgpICkgeworCQkJCQkJcy5uZmEuZ3JhbW1hci5jcmVhdGVMb29rYWhlYWRERkFzKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gQ0FTRSAzYjogcGxhaW4gb2xkIGVwc2lsb24gdHJhbnNpdGlvbiwganVzdCBtb3ZlCisJCQkJZWxzZSB7CisJCQkJCXMgPSAoTkZBU3RhdGUpdHJhbnMudGFyZ2V0OworCQkJCX0KKwkJCX0KKworCQkJLy8gQ0FTRSA0OiBtYXRjaCBsYWJlbCBvbiB0cmFuc2l0aW9uCisJCQllbHNlIGlmICggbGFiZWwubWF0Y2hlcyh0KSApIHsKKwkJCQlpZiAoIGFjdGlvbnMhPW51bGwgKSB7CisJCQkJCWlmICggcy5uZmEuZ3JhbW1hci50eXBlID09IEdyYW1tYXIuUEFSU0VSIHx8CisJCQkJCQkgcy5uZmEuZ3JhbW1hci50eXBlID09IEdyYW1tYXIuQ09NQklORUQgKQorCQkJCQl7CisJCQkJCQlhY3Rpb25zLmNvbnN1bWVUb2tlbigoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgxKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJcyA9IChORkFTdGF0ZSlzLnRyYW5zaXRpb25bMF0udGFyZ2V0OworCQkJCWlucHV0LmNvbnN1bWUoKTsKKwkJCQl0ID0gaW5wdXQuTEEoMSk7CisJCQl9CisKKwkJCS8vIENBU0UgNTogZXJyb3IgY29uZGl0aW9uOyBsYWJlbCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBpbnB1dAorCQkJZWxzZSB7CisJCQkJaWYgKCBsYWJlbC5pc0F0b20oKSApIHsKKwkJCQkJTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uIG10ZSA9CisJCQkJCQluZXcgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKGxhYmVsLmdldEF0b20oKSwgaW5wdXQpOworCQkJCQlpZiAoIGFjdGlvbnMhPW51bGwgKSB7CisJCQkJCQlhY3Rpb25zLnJlY29nbml0aW9uRXhjZXB0aW9uKG10ZSk7CisJCQkJCX0KKwkJCQkJaW5wdXQuY29uc3VtZSgpOyAvLyByZWNvdmVyCisJCQkJCXRocm93IG10ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIGxhYmVsLmlzU2V0KCkgKSB7CisJCQkJCU1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKwkJCQkJCW5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKCgoSW50ZXJ2YWxTZXQpbGFiZWwuZ2V0U2V0KCkpLnRvUnVudGltZUJpdFNldCgpLAorCQkJCQkJCQkJCQkJICAgaW5wdXQpOworCQkJCQlpZiAoIGFjdGlvbnMhPW51bGwgKSB7CisJCQkJCQlhY3Rpb25zLnJlY29nbml0aW9uRXhjZXB0aW9uKG1zZSk7CisJCQkJCX0KKwkJCQkJaW5wdXQuY29uc3VtZSgpOyAvLyByZWNvdmVyCisJCQkJCXRocm93IG1zZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIGxhYmVsLmlzU2VtYW50aWNQcmVkaWNhdGUoKSApIHsKKwkJCQkJRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIGZwZSA9CisJCQkJCQluZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LAorCQkJCQkJCQkJCQkJCSBzLmVuY2xvc2luZ1J1bGUubmFtZSwKKwkJCQkJCQkJCQkJCQkgbGFiZWwuZ2V0U2VtYW50aWNDb250ZXh0KCkudG9TdHJpbmcoKSk7CisJCQkJCWlmICggYWN0aW9ucyE9bnVsbCApIHsKKwkJCQkJCWFjdGlvbnMucmVjb2duaXRpb25FeGNlcHRpb24oZnBlKTsKKwkJCQkJfQorCQkJCQlpbnB1dC5jb25zdW1lKCk7IC8vIHJlY292ZXIKKwkJCQkJdGhyb3cgZnBlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJdGhyb3cgbmV3IFJlY29nbml0aW9uRXhjZXB0aW9uKGlucHV0KTsgLy8gdW5rbm93biBlcnJvcgorCQkJCX0KKwkJCX0KKwkJfQorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaGl0IHN0b3Agc3RhdGUgZm9yICIrc3RvcC5nZXRFbmNsb3NpbmdSdWxlKCkpOworCQlpZiAoIGFjdGlvbnMhPW51bGwgKSB7CisJCQlhY3Rpb25zLmV4aXRSdWxlKHMubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKSwgc3RvcC5lbmNsb3NpbmdSdWxlLm5hbWUpOworCQl9CisJfQorCisJLyoqIEdpdmVuIGFuIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSB1bmlxdWUgYWx0ZXJuYXRpdmUgcHJlZGljdGVkIGJ5CisJICogIG1hdGNoaW5nIHRoZSBpbnB1dC4gIFVwb24gZXJyb3IsIHJldHVybiBORkEuSU5WQUxJRF9BTFRfTlVNQkVSCisJICogIFRoZSBmaXJzdCBzeW1ib2wgb2YgbG9va2FoZWFkIGlzIHByZXN1bWVkIHRvIGJlIHByaW1lZDsgdGhhdCBpcywKKwkgKiAgaW5wdXQubG9va2FoZWFkKDEpIG11c3QgcG9pbnQgYXQgdGhlIGlucHV0IHN5bWJvbCB5b3Ugd2FudCB0byBzdGFydAorCSAqICBwcmVkaWN0aW5nIHdpdGguCisJICovCisJcHVibGljIGludCBwcmVkaWN0KERGQSBkZmEpIHsKKwkJREZBU3RhdGUgcyA9IGRmYS5zdGFydFN0YXRlOworCQlpbnQgYyA9IGlucHV0LkxBKDEpOworCQlUcmFuc2l0aW9uIGVvdFRyYW5zaXRpb24gPSBudWxsOworCWRmYUxvb3A6CisJCXdoaWxlICggIXMuaXNBY2NlcHRTdGF0ZSgpICkgeworCQkJLyoKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiREZBLnByZWRpY3QoIitzLmdldFN0YXRlTnVtYmVyKCkrIiwgIisKKwkJCQkJZGZhLmdldE5GQSgpLmdldEdyYW1tYXIoKS5nZXRUb2tlbk5hbWUoYykrIikiKTsKKwkJCSovCisJCQkvLyBmb3IgZWFjaCBlZGdlIG9mIHMsIGxvb2sgZm9yIGludGVyc2VjdGlvbiB3aXRoIGN1cnJlbnQgY2hhcgorCQkJZm9yIChpbnQgaT0wOyBpPHMuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpOyBpKyspIHsKKwkJCQlUcmFuc2l0aW9uIHQgPSBzLnRyYW5zaXRpb24oaSk7CisJCQkJLy8gc3BlY2lhbCBjYXNlOiBFT1QgbWF0Y2hlcyBhbnkgY2hhcgorCQkJCWlmICggdC5sYWJlbC5tYXRjaGVzKGMpICkgeworCQkJCQkvLyB0YWtlIHRyYW5zaXRpb24gaQorCQkJCQlzID0gKERGQVN0YXRlKXQudGFyZ2V0OworCQkJCQlpbnB1dC5jb25zdW1lKCk7CisJCQkJCWMgPSBpbnB1dC5MQSgxKTsKKwkJCQkJY29udGludWUgZGZhTG9vcDsKKwkJCQl9CisJCQkJaWYgKCB0LmxhYmVsLmdldEF0b20oKT09TGFiZWwuRU9UICkgeworCQkJCQllb3RUcmFuc2l0aW9uID0gdDsKKwkJCQl9CisJCQl9CisJCQlpZiAoIGVvdFRyYW5zaXRpb24hPW51bGwgKSB7CisJCQkJcyA9IChERkFTdGF0ZSllb3RUcmFuc2l0aW9uLnRhcmdldDsKKwkJCQljb250aW51ZSBkZmFMb29wOworCQkJfQorCQkJLyoKKwkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX05PX1ZJQUJMRV9ERkFfQUxULAorCQkJCQkJCSAgIHMsCisJCQkJCQkJICAgZGZhLm5mYS5ncmFtbWFyLmdldFRva2VuTmFtZShjKSk7CisJCQkqLworCQkJcmV0dXJuIE5GQS5JTlZBTElEX0FMVF9OVU1CRVI7CisJCX0KKwkJLy8gd29vaG9vISAgV2Uga25vdyB3aGljaCBhbHQgdG8gcHJlZGljdAorCQkvLyBub3RoaW5nIGVtYW5hdGVzIGZyb20gYSBzdG9wIHN0YXRlOyBtdXN0IHRlcm1pbmF0ZSBhbnl3YXkKKwkJLyoKKwkJU3lzdGVtLm91dC5wcmludGxuKCJERkEgc3RvcCBzdGF0ZSAiK3MuZ2V0U3RhdGVOdW1iZXIoKSsiIHByZWRpY3RzICIrCisJCQkJcy5nZXRVbmlxdWVseVByZWRpY3RlZEFsdCgpKTsKKwkJKi8KKwkJcmV0dXJuIHMuZ2V0VW5pcXVlbHlQcmVkaWN0ZWRBbHQoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXBvcnRTY2FuRXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJQ2hhclN0cmVhbSBjcyA9IChDaGFyU3RyZWFtKWlucHV0OworCQkvLyBwcmludCBhcyBnb29kIG9mIGEgbWVzc2FnZSBhcyB3ZSBjYW4sIGdpdmVuIHRoYXQgd2UgZG8gbm90IGhhdmUKKwkJLy8gYSBMZXhlciBvYmplY3QgYW5kLCBoZW5jZSwgY2Fubm90IGNhbGwgdGhlIHJvdXRpbmUgdG8gZ2V0IGEKKwkJLy8gZGVjZW50IGVycm9yIG1lc3NhZ2UuCisJCVN5c3RlbS5lcnIucHJpbnRsbigicHJvYmxlbSBtYXRjaGluZyB0b2tlbiBhdCAiKworCQkJY3MuZ2V0TGluZSgpKyI6Iitjcy5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSsiICIrcmUpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKKwkJcmV0dXJuIGlucHV0LmdldFNvdXJjZU5hbWUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI5NzhlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9MZWZ0UmVjdXJzaW9uQ3ljbGVzTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKiogU2ltaWxhciB0byBMZWZ0UmVjdXJzaW9uTWVzc2FnZSBleGNlcHQgdGhpcyBpcyB1c2VkIGZvciBhbm5vdW5jaW5nCisgKiAgY3ljbGVzIGZvdW5kIGJ5IHdhbGtpbmcgcnVsZXMgd2l0aG91dCBkZWNpc2lvbnM7IHRoZSBvdGhlciBtc2cgaXMKKyAqICBpbnZva2VkIHdoZW4gYSBkZWNpc2lvbiBERkEgY29uc3RydWN0aW9uIGZpbmRzIGEgcHJvYmxlbSBpbiBjbG9zdXJlLgorICovCitwdWJsaWMgY2xhc3MgTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgQ29sbGVjdGlvbiBjeWNsZXM7CisKKwlwdWJsaWMgTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UoQ29sbGVjdGlvbiBjeWNsZXMpIHsKKwkJc3VwZXIoRXJyb3JNYW5hZ2VyLk1TR19MRUZUX1JFQ1VSU0lPTl9DWUNMRVMpOworCQl0aGlzLmN5Y2xlcyA9IGN5Y2xlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTVCBzdCA9IGdldE1lc3NhZ2VUZW1wbGF0ZSgpOworCQlzdC5hZGQoImxpc3RPZkN5Y2xlcyIsIGN5Y2xlcyk7CisJCXJldHVybiBzdXBlci50b1N0cmluZyhzdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9MZWZ0UmVjdXJzaXZlUnVsZUFuYWx5emVyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL0xlZnRSZWN1cnNpdmVSdWxlQW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JmN2RiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9MZWZ0UmVjdXJzaXZlUnVsZUFuYWx5emVyLmphdmEKQEAgLTAsMCArMSwzNTIgQEAKK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuY29kZWdlbi5Db2RlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLio7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlTm9kZVN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC4qOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKiAqLworcHVibGljIGNsYXNzIExlZnRSZWN1cnNpdmVSdWxlQW5hbHl6ZXIgZXh0ZW5kcyBMZWZ0UmVjdXJzaXZlUnVsZVdhbGtlciB7CisJcHVibGljIHN0YXRpYyBlbnVtIEFTU09DIHsgbGVmdCwgcmlnaHQgfTsKKworCXB1YmxpYyBHcmFtbWFyIGc7CisJcHVibGljIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yOworCXB1YmxpYyBTdHJpbmcgcnVsZU5hbWU7CisJTWFwPEludGVnZXIsIEludGVnZXI+IHRva2VuVG9QcmVjID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKKwlwdWJsaWMgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGJpbmFyeUFsdHMgPSBuZXcgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisJcHVibGljIExpbmtlZEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiB0ZXJuYXJ5QWx0cyA9IG5ldyBMaW5rZWRIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKKwlwdWJsaWMgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHN1ZmZpeEFsdHMgPSBuZXcgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisJcHVibGljIExpc3Q8U3RyaW5nPiBwcmVmaXhBbHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJcHVibGljIExpc3Q8U3RyaW5nPiBvdGhlckFsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworCXB1YmxpYyBHcmFtbWFyQVNUIHJldHZhbHM7CisKKwlwdWJsaWMgU1RHcm91cCByZWNSdWxlVGVtcGxhdGVzOworCXB1YmxpYyBTdHJpbmcgbGFuZ3VhZ2U7CisKKwlwdWJsaWMgTWFwPEludGVnZXIsIEFTU09DPiBhbHRBc3NvY2lhdGl2aXR5ID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQVNTT0M+KCk7CisKKwlwdWJsaWMgTGVmdFJlY3Vyc2l2ZVJ1bGVBbmFseXplcihUcmVlTm9kZVN0cmVhbSBpbnB1dCwgR3JhbW1hciBnLCBTdHJpbmcgcnVsZU5hbWUpIHsKKwkJc3VwZXIoaW5wdXQpOworCQl0aGlzLmcgPSBnOworCQl0aGlzLnJ1bGVOYW1lID0gcnVsZU5hbWU7CisJCWxhbmd1YWdlID0gKFN0cmluZylnLmdldE9wdGlvbigibGFuZ3VhZ2UiKTsKKwkJZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoZy50b29sLCBnLCBsYW5ndWFnZSk7CisJCWdlbmVyYXRvci5sb2FkVGVtcGxhdGVzKGxhbmd1YWdlKTsKKwkJbG9hZFByZWNSdWxlVGVtcGxhdGVzKCk7CisJfQorCisJcHVibGljIHZvaWQgbG9hZFByZWNSdWxlVGVtcGxhdGVzKCkgeworCQlyZWNSdWxlVGVtcGxhdGVzID0KKwkJCW5ldyBTVEdyb3VwRmlsZShDb2RlR2VuZXJhdG9yLmNsYXNzcGF0aFRlbXBsYXRlUm9vdERpcmVjdG9yeU5hbWUrCisJCQkJCQkJIi9MZWZ0UmVjdXJzaXZlUnVsZXMuc3RnIik7CisJCWlmICggIXJlY1J1bGVUZW1wbGF0ZXMuaXNEZWZpbmVkKCJyZWNSdWxlTmFtZSIpICkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfTUlTU0lOR19DT0RFX0dFTl9URU1QTEFURVMsCisJCQkJCQkJICAgIlByZWNSdWxlcyIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0UmV0dXJuVmFsdWVzKEdyYW1tYXJBU1QgdCkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7CisJCXJldHZhbHMgPSB0OworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFRva2VuUHJlYyhHcmFtbWFyQVNUIHQsIGludCBhbHQpIHsKKwkJaW50IHR0eXBlID0gZy5nZXRUb2tlblR5cGUodC5nZXRUZXh0KCkpOworCQl0b2tlblRvUHJlYy5wdXQodHR5cGUsIGFsdCk7CisJCUFTU09DIGFzc29jID0gQVNTT0MubGVmdDsKKwkJaWYgKCB0LnRlcm1pbmFsT3B0aW9ucyE9bnVsbCApIHsKKwkJCVN0cmluZyBhID0gKFN0cmluZyl0LnRlcm1pbmFsT3B0aW9ucy5nZXQoImFzc29jIik7CisJCQlpZiAoIGEhPW51bGwgKSB7CisJCQkJaWYgKCBhLmVxdWFscyhBU1NPQy5yaWdodC50b1N0cmluZygpKSApIHsKKwkJCQkJYXNzb2MgPSBBU1NPQy5yaWdodDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCUVycm9yTWFuYWdlci5lcnJvcihFcnJvck1hbmFnZXIuTVNHX0lMTEVHQUxfT1BUSU9OX1ZBTFVFLCAiYXNzb2MiLCBhc3NvYyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCBhbHRBc3NvY2lhdGl2aXR5LmdldChhbHQpIT1udWxsICYmIGFsdEFzc29jaWF0aXZpdHkuZ2V0KGFsdCkhPWFzc29jICkgeworCQkJRXJyb3JNYW5hZ2VyLmVycm9yKEVycm9yTWFuYWdlci5NU0dfQUxMX09QU19ORUVEX1NBTUVfQVNTT0MsIGFsdCk7CisJCX0KKwkJYWx0QXNzb2NpYXRpdml0eS5wdXQoYWx0LCBhc3NvYyk7CisKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm9wICIgKyBhbHQgKyAiOiAiICsgdC5nZXRUZXh0KCkrIiwgYXNzb2M9Iithc3NvYyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgYmluYXJ5QWx0KEdyYW1tYXJBU1QgYWx0VHJlZSwgR3JhbW1hckFTVCByZXdyaXRlVHJlZSwgaW50IGFsdCkgeworCQlhbHRUcmVlID0gR3JhbW1hckFTVC5kdXBUcmVlKGFsdFRyZWUpOworCQlyZXdyaXRlVHJlZSA9IEdyYW1tYXJBU1QuZHVwVHJlZShyZXdyaXRlVHJlZSk7CisKKwkJc3RyaXBTeW5QcmVkKGFsdFRyZWUpOworCQlzdHJpcExlZnRSZWN1cnNpb24oYWx0VHJlZSk7CisKKwkJLy8gcmV3cml0ZSBlIHRvIGJlIGVfW3JlY19hcmddCisJCWludCBuZXh0UHJlYyA9IG5leHRQcmVjZWRlbmNlKGFsdCk7CisJCVNUIHJlZlNUID0gcmVjUnVsZVRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZWNSdWxlUmVmIik7CisJCXJlZlNULmFkZCgicnVsZU5hbWUiLCBydWxlTmFtZSk7CisJCXJlZlNULmFkZCgiYXJnIiwgbmV4dFByZWMpOworCQlhbHRUcmVlID0gcmVwbGFjZVJ1bGVSZWZzKGFsdFRyZWUsIHJlZlNULnJlbmRlcigpKTsKKworCQlTdHJpbmcgYWx0VGV4dCA9IHRleHQoYWx0VHJlZSk7CisJCWFsdFRleHQgPSBhbHRUZXh0LnRyaW0oKTsKKwkJYWx0VGV4dCArPSAie30iOyAvLyBhZGQgZW1wdHkgYWx0IHRvIHByZXZlbnQgcHJlZCBob2lzdGluZworCQlTVCBuYW1lU1QgPSByZWNSdWxlVGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJlY1J1bGVOYW1lIik7CisJCW5hbWVTVC5hZGQoInJ1bGVOYW1lIiwgcnVsZU5hbWUpOworCQlyZXdyaXRlVHJlZSA9IHJlcGxhY2VSdWxlUmVmcyhyZXdyaXRlVHJlZSwgIiQiICsgbmFtZVNULnJlbmRlcigpKTsKKwkJU3RyaW5nIHJld3JpdGVUZXh0ID0gdGV4dChyZXdyaXRlVHJlZSk7CisJCWJpbmFyeUFsdHMucHV0KGFsdCwgYWx0VGV4dCArIChyZXdyaXRlVGV4dCAhPSBudWxsID8gIiAiICsgcmV3cml0ZVRleHQgOiAiIikpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYmluYXJ5QWx0ICIgKyBhbHQgKyAiOiAiICsgYWx0VGV4dCArICIsIHJld3JpdGU9IiArIHJld3JpdGVUZXh0KTsKKwl9CisKKwkvKiogQ29udmVydCBlID8gZSA6IGUgIC0+ICA/IGUgOiBlX1tuZXh0UHJlY10gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZXJuYXJ5QWx0KEdyYW1tYXJBU1QgYWx0VHJlZSwgR3JhbW1hckFTVCByZXdyaXRlVHJlZSwgaW50IGFsdCkgeworCQlhbHRUcmVlID0gR3JhbW1hckFTVC5kdXBUcmVlKGFsdFRyZWUpOworCQlyZXdyaXRlVHJlZSA9IEdyYW1tYXJBU1QuZHVwVHJlZShyZXdyaXRlVHJlZSk7CisKKwkJc3RyaXBTeW5QcmVkKGFsdFRyZWUpOworCQlzdHJpcExlZnRSZWN1cnNpb24oYWx0VHJlZSk7CisKKwkJaW50IG5leHRQcmVjID0gbmV4dFByZWNlZGVuY2UoYWx0KTsKKwkJU1QgcmVmU1QgPSByZWNSdWxlVGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJlY1J1bGVSZWYiKTsKKwkJcmVmU1QuYWRkKCJydWxlTmFtZSIsIHJ1bGVOYW1lKTsKKwkJcmVmU1QuYWRkKCJhcmciLCBuZXh0UHJlYyk7CisJCWFsdFRyZWUgPSByZXBsYWNlTGFzdFJ1bGVSZWYoYWx0VHJlZSwgcmVmU1QucmVuZGVyKCkpOworCisJCVN0cmluZyBhbHRUZXh0ID0gdGV4dChhbHRUcmVlKTsKKwkJYWx0VGV4dCA9IGFsdFRleHQudHJpbSgpOworCQlhbHRUZXh0ICs9ICJ7fSI7IC8vIGFkZCBlbXB0eSBhbHQgdG8gcHJldmVudCBwcmVkIGhvaXN0aW5nCisJCVNUIG5hbWVTVCA9IHJlY1J1bGVUZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmVjUnVsZU5hbWUiKTsKKwkJbmFtZVNULmFkZCgicnVsZU5hbWUiLCBydWxlTmFtZSk7CisJCXJld3JpdGVUcmVlID0gcmVwbGFjZVJ1bGVSZWZzKHJld3JpdGVUcmVlLCAiJCIgKyBuYW1lU1QucmVuZGVyKCkpOworCQlTdHJpbmcgcmV3cml0ZVRleHQgPSB0ZXh0KHJld3JpdGVUcmVlKTsKKwkJdGVybmFyeUFsdHMucHV0KGFsdCwgYWx0VGV4dCArIChyZXdyaXRlVGV4dCAhPSBudWxsID8gIiAiICsgcmV3cml0ZVRleHQgOiAiIikpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidGVybmFyeUFsdCAiICsgYWx0ICsgIjogIiArIGFsdFRleHQgKyAiLCByZXdyaXRlPSIgKyByZXdyaXRlVGV4dCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcHJlZml4QWx0KEdyYW1tYXJBU1QgYWx0VHJlZSwgR3JhbW1hckFTVCByZXdyaXRlVHJlZSwgaW50IGFsdCkgeworCQlhbHRUcmVlID0gR3JhbW1hckFTVC5kdXBUcmVlKGFsdFRyZWUpOworCQlyZXdyaXRlVHJlZSA9IEdyYW1tYXJBU1QuZHVwVHJlZShyZXdyaXRlVHJlZSk7CisKKwkJc3RyaXBTeW5QcmVkKGFsdFRyZWUpOworCisJCWludCBuZXh0UHJlYyA9IHByZWNlZGVuY2UoYWx0KTsKKwkJLy8gcmV3cml0ZSBlIHRvIGJlIGVfW3JlY19hcmddCisJCVNUIHJlZlNUID0gcmVjUnVsZVRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZWNSdWxlUmVmIik7CisJCXJlZlNULmFkZCgicnVsZU5hbWUiLCBydWxlTmFtZSk7CisJCXJlZlNULmFkZCgiYXJnIiwgbmV4dFByZWMpOworCQlhbHRUcmVlID0gcmVwbGFjZVJ1bGVSZWZzKGFsdFRyZWUsIHJlZlNULnJlbmRlcigpKTsKKwkJU3RyaW5nIGFsdFRleHQgPSB0ZXh0KGFsdFRyZWUpOworCQlhbHRUZXh0ID0gYWx0VGV4dC50cmltKCk7CisJCWFsdFRleHQgKz0gInt9IjsgLy8gYWRkIGVtcHR5IGFsdCB0byBwcmV2ZW50IHByZWQgaG9pc3RpbmcKKworCQlTVCBuYW1lU1QgPSByZWNSdWxlVGVtcGxhdGVzLmdldEluc3RhbmNlT2YoInJlY1J1bGVOYW1lIik7CisJCW5hbWVTVC5hZGQoInJ1bGVOYW1lIiwgcnVsZU5hbWUpOworCQlyZXdyaXRlVHJlZSA9IHJlcGxhY2VSdWxlUmVmcyhyZXdyaXRlVHJlZSwgbmFtZVNULnJlbmRlcigpKTsKKwkJU3RyaW5nIHJld3JpdGVUZXh0ID0gdGV4dChyZXdyaXRlVHJlZSk7CisKKwkJcHJlZml4QWx0cy5hZGQoYWx0VGV4dCArIChyZXdyaXRlVGV4dCAhPSBudWxsID8gIiAiICsgcmV3cml0ZVRleHQgOiAiIikpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicHJlZml4QWx0ICIgKyBhbHQgKyAiOiAiICsgYWx0VGV4dCArICIsIHJld3JpdGU9IiArIHJld3JpdGVUZXh0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdWZmaXhBbHQoR3JhbW1hckFTVCBhbHRUcmVlLCBHcmFtbWFyQVNUIHJld3JpdGVUcmVlLCBpbnQgYWx0KSB7CisJCWFsdFRyZWUgPSBHcmFtbWFyQVNULmR1cFRyZWUoYWx0VHJlZSk7CisJCXJld3JpdGVUcmVlID0gR3JhbW1hckFTVC5kdXBUcmVlKHJld3JpdGVUcmVlKTsKKwkJc3RyaXBTeW5QcmVkKGFsdFRyZWUpOworCQlzdHJpcExlZnRSZWN1cnNpb24oYWx0VHJlZSk7CisJCVNUIG5hbWVTVCA9IHJlY1J1bGVUZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmVjUnVsZU5hbWUiKTsKKwkJbmFtZVNULmFkZCgicnVsZU5hbWUiLCBydWxlTmFtZSk7CisJCXJld3JpdGVUcmVlID0gcmVwbGFjZVJ1bGVSZWZzKHJld3JpdGVUcmVlLCAiJCIgKyBuYW1lU1QucmVuZGVyKCkpOworCQlTdHJpbmcgcmV3cml0ZVRleHQgPSB0ZXh0KHJld3JpdGVUcmVlKTsKKwkJU3RyaW5nIGFsdFRleHQgPSB0ZXh0KGFsdFRyZWUpOworCQlhbHRUZXh0ID0gYWx0VGV4dC50cmltKCk7CisJCXN1ZmZpeEFsdHMucHV0KGFsdCwgYWx0VGV4dCArIChyZXdyaXRlVGV4dCAhPSBudWxsID8gIiAiICsgcmV3cml0ZVRleHQgOiAiIikpOworLy8JCVN5c3RlbS5vdXQucHJpbnRsbigic3VmZml4QWx0ICIgKyBhbHQgKyAiOiAiICsgYWx0VGV4dCArICIsIHJld3JpdGU9IiArIHJld3JpdGVUZXh0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBvdGhlckFsdChHcmFtbWFyQVNUIGFsdFRyZWUsIEdyYW1tYXJBU1QgcmV3cml0ZVRyZWUsIGludCBhbHQpIHsKKwkJYWx0VHJlZSA9IEdyYW1tYXJBU1QuZHVwVHJlZShhbHRUcmVlKTsKKwkJcmV3cml0ZVRyZWUgPSBHcmFtbWFyQVNULmR1cFRyZWUocmV3cml0ZVRyZWUpOworCQlzdHJpcFN5blByZWQoYWx0VHJlZSk7CisJCXN0cmlwTGVmdFJlY3Vyc2lvbihhbHRUcmVlKTsKKwkJU3RyaW5nIGFsdFRleHQgPSB0ZXh0KGFsdFRyZWUpOworCisJCVN0cmluZyByZXdyaXRlVGV4dCA9IHRleHQocmV3cml0ZVRyZWUpOworCQlvdGhlckFsdHMuYWRkKGFsdFRleHQgKyAocmV3cml0ZVRleHQgIT0gbnVsbCA/ICIgIiArIHJld3JpdGVUZXh0IDogIiIpKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm90aGVyQWx0ICIgKyBhbHQgKyAiOiAiICsgYWx0VGV4dCArICIsIHJld3JpdGU9IiArIHJld3JpdGVUZXh0KTsKKwl9CisKKwkvLyAtLS0tLS0tLS0gZ2V0IHRyYW5zZm9ybWVkIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZpY2lhbFByZWNTdGFydFJ1bGUoKSB7CisJCVNUIHJ1bGVTVCA9IHJlY1J1bGVUZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmVjUnVsZVN0YXJ0Iik7CisJCXJ1bGVTVC5hZGQoInJ1bGVOYW1lIiwgcnVsZU5hbWUpOworCQlydWxlU1QuYWRkKCJtaW5QcmVjIiwgMCk7CisJCXJ1bGVTVC5hZGQoInVzZXJSZXR2YWxzIiwgcmV0dmFscyk7CisJCWZpbGxSZXRWYWxBc3NpZ25tZW50cyhydWxlU1QsICJyZWNSdWxlTmFtZSIpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhcnQ6ICIgKyBydWxlU1QpOworCQlyZXR1cm4gcnVsZVNULnJlbmRlcigpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZpY2lhbE9wUHJlY1J1bGUoKSB7CisJCVNUIHJ1bGVTVCA9IHJlY1J1bGVUZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmVjUnVsZSIpOworCQlydWxlU1QuYWRkKCJydWxlTmFtZSIsIHJ1bGVOYW1lKTsKKwkJcnVsZVNULmFkZCgiYnVpbGRBU1QiLCBncmFtbWFyLmJ1aWxkQVNUKCkpOworCQlTVCBhcmdEZWZTVCA9CisJCQlnZW5lcmF0b3IuZ2V0VGVtcGxhdGVzKCkuZ2V0SW5zdGFuY2VPZigicmVjUnVsZURlZkFyZyIpOworCQlydWxlU1QuYWRkKCJwcmVjQXJnRGVmIiwgYXJnRGVmU1QpOworCQlTVCBydWxlQXJnU1QgPQorCQkJZ2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLmdldEluc3RhbmNlT2YoInJlY1J1bGVBcmciKTsKKwkJcnVsZVNULmFkZCgiYXJnTmFtZSIsIHJ1bGVBcmdTVCk7CisJCVNUIHNldFJlc3VsdFNUID0KKwkJCWdlbmVyYXRvci5nZXRUZW1wbGF0ZXMoKS5nZXRJbnN0YW5jZU9mKCJyZWNSdWxlU2V0UmVzdWx0QWN0aW9uIik7CisJCXJ1bGVTVC5hZGQoInNldFJlc3VsdEFjdGlvbiIsIHNldFJlc3VsdFNUKTsKKwkJcnVsZVNULmFkZCgidXNlclJldHZhbHMiLCByZXR2YWxzKTsKKwkJZmlsbFJldFZhbEFzc2lnbm1lbnRzKHJ1bGVTVCwgInJlY1ByaW1hcnlOYW1lIik7CisKKwkJTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IG9wUHJlY1J1bGVBbHRzID0gbmV3IExpbmtlZEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworCQlvcFByZWNSdWxlQWx0cy5wdXRBbGwoYmluYXJ5QWx0cyk7CisJCW9wUHJlY1J1bGVBbHRzLnB1dEFsbCh0ZXJuYXJ5QWx0cyk7CisJCW9wUHJlY1J1bGVBbHRzLnB1dEFsbChzdWZmaXhBbHRzKTsKKwkJZm9yIChpbnQgYWx0IDogb3BQcmVjUnVsZUFsdHMua2V5U2V0KCkpIHsKKwkJCVN0cmluZyBhbHRUZXh0ID0gb3BQcmVjUnVsZUFsdHMuZ2V0KGFsdCk7CisJCQlTVCBhbHRTVCA9IHJlY1J1bGVUZW1wbGF0ZXMuZ2V0SW5zdGFuY2VPZigicmVjUnVsZUFsdCIpOworCQkJU1QgcHJlZFNUID0KKwkJCQlnZW5lcmF0b3IuZ2V0VGVtcGxhdGVzKCkuZ2V0SW5zdGFuY2VPZigicmVjUnVsZUFsdFByZWRpY2F0ZSIpOworCQkJcHJlZFNULmFkZCgib3BQcmVjIiwgcHJlY2VkZW5jZShhbHQpKTsKKwkJCXByZWRTVC5hZGQoInJ1bGVOYW1lIiwgcnVsZU5hbWUpOworCQkJYWx0U1QuYWRkKCJwcmVkIiwgcHJlZFNUKTsKKwkJCWFsdFNULmFkZCgiYWx0IiwgYWx0VGV4dCk7CisJCQlydWxlU1QuYWRkKCJhbHRzIiwgYWx0U1QpOworCQl9CisKKwkJU3lzdGVtLm91dC5wcmludGxuKHJ1bGVTVCk7CisKKwkJcmV0dXJuIHJ1bGVTVC5yZW5kZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEFydGlmaWNpYWxQcmltYXJ5UnVsZSgpIHsKKwkJU1QgcnVsZVNUID0gcmVjUnVsZVRlbXBsYXRlcy5nZXRJbnN0YW5jZU9mKCJyZWNQcmltYXJ5UnVsZSIpOworCQlydWxlU1QuYWRkKCJydWxlTmFtZSIsIHJ1bGVOYW1lKTsKKwkJcnVsZVNULmFkZCgiYWx0cyIsIHByZWZpeEFsdHMpOworCQlydWxlU1QuYWRkKCJhbHRzIiwgb3RoZXJBbHRzKTsKKwkJcnVsZVNULmFkZCgidXNlclJldHZhbHMiLCByZXR2YWxzKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKHJ1bGVTVCk7CisJCXJldHVybiBydWxlU1QucmVuZGVyKCk7CisJfQorCisJcHVibGljIEdyYW1tYXJBU1QgcmVwbGFjZVJ1bGVSZWZzKEdyYW1tYXJBU1QgdCwgU3RyaW5nIG5hbWUpIHsKKwkJaWYgKCB0PT1udWxsICkgcmV0dXJuIG51bGw7CisJCWZvciAoR3JhbW1hckFTVCBycmVmIDogdC5maW5kQWxsVHlwZShSVUxFX1JFRikpIHsKKwkJCWlmICggcnJlZi5nZXRUZXh0KCkuZXF1YWxzKHJ1bGVOYW1lKSApIHJyZWYuc2V0VGV4dChuYW1lKTsKKwkJfQorCQlyZXR1cm4gdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW1tZWRpYXRlUmVjdXJzaXZlUnVsZVJlZnMoR3JhbW1hckFTVCB0LCBTdHJpbmcgcnVsZU5hbWUpIHsKKwkJaWYgKCB0PT1udWxsICkgcmV0dXJuIGZhbHNlOworCQlmb3IgKEdyYW1tYXJBU1QgcnJlZiA6IHQuZmluZEFsbFR5cGUoUlVMRV9SRUYpKSB7CisJCQlpZiAoIHJyZWYuZ2V0VGV4dCgpLmVxdWFscyhydWxlTmFtZSkgKSByZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIEdyYW1tYXJBU1QgcmVwbGFjZUxhc3RSdWxlUmVmKEdyYW1tYXJBU1QgdCwgU3RyaW5nIG5hbWUpIHsKKwkJaWYgKCB0PT1udWxsICkgcmV0dXJuIG51bGw7CisJCUdyYW1tYXJBU1QgbGFzdCA9IG51bGw7CisJCWZvciAoR3JhbW1hckFTVCBycmVmIDogdC5maW5kQWxsVHlwZShSVUxFX1JFRikpIHsgbGFzdCA9IHJyZWY7IH0KKwkJaWYgKCBsYXN0ICE9bnVsbCAmJiBsYXN0LmdldFRleHQoKS5lcXVhbHMocnVsZU5hbWUpICkgbGFzdC5zZXRUZXh0KG5hbWUpOworCQlyZXR1cm4gdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdHJpcFN5blByZWQoR3JhbW1hckFTVCBhbHRBU1QpIHsKKwkJR3JhbW1hckFTVCB0ID0gKEdyYW1tYXJBU1QpYWx0QVNULmdldENoaWxkKDApOworCQlpZiAoIHQuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5CQUNLVFJBQ0tfU0VNUFJFRCB8fAorCQkJIHQuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5TWU5QUkVEIHx8CisJCQkgdC5nZXRUeXBlKCk9PUFOVExSUGFyc2VyLlNZTl9TRU1QUkVEICkKKwkJeworCQkJYWx0QVNULmRlbGV0ZUNoaWxkKDApOyAvLyBraWxsIGl0CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzdHJpcExlZnRSZWN1cnNpb24oR3JhbW1hckFTVCBhbHRBU1QpIHsKKwkJR3JhbW1hckFTVCBycmVmID0gKEdyYW1tYXJBU1QpYWx0QVNULmdldENoaWxkKDApOworCQlpZiAoIHJyZWYuZ2V0VHlwZSgpPT0gQU5UTFJQYXJzZXIuUlVMRV9SRUYgJiYKKwkJCSBycmVmLmdldFRleHQoKS5lcXVhbHMocnVsZU5hbWUpKQorCQl7CisJCQkvLyByZW1vdmUgcnVsZSByZWYKKwkJCWFsdEFTVC5kZWxldGVDaGlsZCgwKTsKKwkJCS8vIHJlc2V0IGluZGV4IHNvIGl0IHByaW50cyBwcm9wZXJseQorCQkJR3JhbW1hckFTVCBuZXdGaXJzdENoaWxkID0gKEdyYW1tYXJBU1QpIGFsdEFTVC5nZXRDaGlsZCgwKTsKKwkJCWFsdEFTVC5zZXRUb2tlblN0YXJ0SW5kZXgobmV3Rmlyc3RDaGlsZC5nZXRUb2tlblN0YXJ0SW5kZXgoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRleHQoR3JhbW1hckFTVCB0KSB7CisJCWlmICggdD09bnVsbCApIHJldHVybiBudWxsOworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBBTlRMUlRyZWVQcmludGVyKG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSh0KSkudG9TdHJpbmcoZ3JhbW1hciwgdHJ1ZSk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlFcnJvck1hbmFnZXIuZXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19CQURfQVNUX1NUUlVDVFVSRSwgZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGludCBwcmVjZWRlbmNlKGludCBhbHQpIHsKKwkJcmV0dXJuIG51bUFsdHMtYWx0KzE7CisJfQorCisJcHVibGljIGludCBuZXh0UHJlY2VkZW5jZShpbnQgYWx0KSB7CisJCWludCBwID0gcHJlY2VkZW5jZShhbHQpOworCQlpZiAoIGFsdEFzc29jaWF0aXZpdHkuZ2V0KGFsdCk9PUFTU09DLmxlZnQgKSBwKys7CisJCXJldHVybiBwOworCX0KKworCXB1YmxpYyB2b2lkIGZpbGxSZXRWYWxBc3NpZ25tZW50cyhTVCBydWxlU1QsIFN0cmluZyBzcmNOYW1lKSB7CisJCWlmICggcmV0dmFscz09bnVsbCApIHJldHVybjsKKworCQkvLyBjb21wbGljYXRlZCBzaW5jZSB3ZSBtdXN0IGJlIHRhcmdldC1pbmRlcGVuZGVudAorCQlmb3IgKFN0cmluZyBuYW1lIDogZ2V0TmFtZXNGcm9tQXJnQWN0aW9uKHJldHZhbHMudG9rZW4pKSB7CisJCQlTVCBzZXRSZXRWYWxTVCA9CisJCQkJZ2VuZXJhdG9yLmdldFRlbXBsYXRlcygpLmdldEluc3RhbmNlT2YoInJlY1J1bGVTZXRSZXR1cm5BY3Rpb24iKTsKKwkJCVNUIHJ1bGVOYW1lU1QgPSByZWNSdWxlVGVtcGxhdGVzLmdldEluc3RhbmNlT2Yoc3JjTmFtZSk7CisJCQlydWxlTmFtZVNULmFkZCgicnVsZU5hbWUiLCBydWxlTmFtZSk7CisJCQlzZXRSZXRWYWxTVC5hZGQoInNyYyIsIHJ1bGVOYW1lU1QpOworCQkJc2V0UmV0VmFsU1QuYWRkKCJuYW1lIiwgbmFtZSk7CisJCQlydWxlU1QuYWRkKCJ1c2VyUmV0dmFsQXNzaWdubWVudHMiLHNldFJldFZhbFNUKTsKKwkJfQorCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0TmFtZXNGcm9tQXJnQWN0aW9uKFRva2VuIHQpIHsKKwkJQXR0cmlidXRlU2NvcGUgcmV0dXJuU2NvcGUgPSBncmFtbWFyLmNyZWF0ZVJldHVyblNjb3BlKCIiLHQpOworCQlyZXR1cm5TY29wZS5hZGRBdHRyaWJ1dGVzKHQuZ2V0VGV4dCgpLCAnLCcpOworCQlyZXR1cm4gcmV0dXJuU2NvcGUuYXR0cmlidXRlcy5rZXlTZXQoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlByZWNSdWxlT3BlcmF0b3JDb2xsZWN0b3J7IiArCisJCQkgICAiYmluYXJ5QWx0cz0iICsgYmluYXJ5QWx0cyArCisJCQkgICAiLCByZWM9IiArIHRva2VuVG9QcmVjICsKKwkJCSAgICIsIHRlcm5hcnlBbHRzPSIgKyB0ZXJuYXJ5QWx0cyArCisJCQkgICAiLCBzdWZmaXhBbHRzPSIgKyBzdWZmaXhBbHRzICsKKwkJCSAgICIsIHByZWZpeEFsdHM9IiArIHByZWZpeEFsdHMgKworCQkJICAgIiwgb3RoZXJBbHRzPSIgKyBvdGhlckFsdHMgKworCQkJICAgJ30nOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvTWVzc2FnZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2MDliYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKKy8qKiBUaGUgQU5UTFIgY29kZSBjYWxscyBtZXRob2RzIG9uIEVycm9yTWFuYWdlciB0byByZXBvcnQgZXJyb3JzIGV0Yy4uLgorICogIFJhdGhlciB0aGFuIHNpbXBseSBwYXNzIHRoZXNlIGFyZ3VtZW50cyB0byB0aGUgQU5UTFJFcnJvckxpc3RlbmVyIGRpcmVjdGx5LAorICogIGNyZWF0ZSBhbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgZXZlcnl0aGluZy4gIEluIHRoaXMgd2F5LCB0aGUgZXJyb3IKKyAqICBsaXN0ZW5lciBpbnRlcmZhY2UgZG9lcyBub3QgaGF2ZSB0byBjaGFuZ2Ugd2hlbiBJIGFkZCBhIG5ldyBraW5kIG9mCisgKiAgZXJyb3IgbWVzc2FnZS4gIEkgZG9uJ3Qgd2FudCB0byBicmVhayBhIEdVSSBmb3IgZXhhbXBsZSBldmVyeSB0aW1lCisgKiAgSSB1cGRhdGUgdGhlIGVycm9yIHN5c3RlbSBpbiBBTlRMUiBpdHNlbGYuCisgKgorICogIFRvIGdldCBhIHByaW50YWJsZSBlcnJvci93YXJuaW5nIG1lc3NhZ2UsIGNhbGwgdG9TdHJpbmcoKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2UgeworCS8vIG1zZ1NUIGlzIHRoZSBhY3R1YWwgdGV4dCBvZiB0aGUgbWVzc2FnZQorCXB1YmxpYyBTVCBtc2dTVDsKKwkvLyB0aGVzZSBhcmUgZm9yIHN1cHBvcnRpbmcgZGlmZmVyZW50IG91dHB1dCBmb3JtYXRzCisJcHVibGljIFNUIGxvY2F0aW9uU1Q7CisJcHVibGljIFNUIHJlcG9ydFNUOworCXB1YmxpYyBTVCBtZXNzYWdlRm9ybWF0U1Q7CisKKwlwdWJsaWMgaW50IG1zZ0lEOworCXB1YmxpYyBPYmplY3QgYXJnOworCXB1YmxpYyBPYmplY3QgYXJnMjsKKwlwdWJsaWMgVGhyb3dhYmxlIGU7CisJLy8gdXNlZCBmb3IgbG9jYXRpb24gdGVtcGxhdGUKKwlwdWJsaWMgU3RyaW5nIGZpbGU7CisJcHVibGljIGludCBsaW5lID0gLTE7CisJcHVibGljIGludCBjb2x1bW4gPSAtMTsKKworCXB1YmxpYyBNZXNzYWdlKCkgeworCX0KKworCXB1YmxpYyBNZXNzYWdlKGludCBtc2dJRCkgeworCQl0aGlzKG1zZ0lELCBudWxsLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgTWVzc2FnZShpbnQgbXNnSUQsIE9iamVjdCBhcmcsIE9iamVjdCBhcmcyKSB7CisJCXNldE1lc3NhZ2VJRChtc2dJRCk7CisJCXRoaXMuYXJnID0gYXJnOworCQl0aGlzLmFyZzIgPSBhcmcyOworCX0KKworCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKKwkJdGhpcy5saW5lID0gbGluZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oaW50IGNvbHVtbikgeworCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlSUQoaW50IG1zZ0lEKSB7CisJCXRoaXMubXNnSUQgPSBtc2dJRDsKKwkJbXNnU1QgPSBFcnJvck1hbmFnZXIuZ2V0TWVzc2FnZShtc2dJRCk7CisJfQorCisJLyoqIFJldHVybiBhIG5ldyB0ZW1wbGF0ZSBpbnN0YW5jZSBldmVyeSB0aW1lIHNvbWVvbmUgdHJpZXMgdG8gcHJpbnQKKwkgKiAgYSBNZXNzYWdlLgorCSAqLworCXB1YmxpYyBTVCBnZXRNZXNzYWdlVGVtcGxhdGUoKSB7IHJldHVybiBuZXcgU1QobXNnU1QpOyB9CisKKwkvKiogUmV0dXJuIGEgbmV3IHRlbXBsYXRlIGluc3RhbmNlIGZvciB0aGUgbG9jYXRpb24gcGFydCBvZiBhIE1lc3NhZ2UuCisJICogIFRPRE86IElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gLUtheQorCSAqLworCXB1YmxpYyBTVCBnZXRMb2NhdGlvblRlbXBsYXRlKCkgeyByZXR1cm4gbmV3IFNUKGxvY2F0aW9uU1QpOyB9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFNUIG1lc3NhZ2VTVCkgeworCQkvLyBzZXR1cCB0aGUgbG9jYXRpb24KKwkJbG9jYXRpb25TVCA9IEVycm9yTWFuYWdlci5nZXRMb2NhdGlvbkZvcm1hdCgpOworCQlyZXBvcnRTVCA9IEVycm9yTWFuYWdlci5nZXRSZXBvcnRGb3JtYXQoKTsKKwkJbWVzc2FnZUZvcm1hdFNUID0gRXJyb3JNYW5hZ2VyLmdldE1lc3NhZ2VGb3JtYXQoKTsKKwkJYm9vbGVhbiBsb2NhdGlvblZhbGlkID0gZmFsc2U7CisJCWlmIChsaW5lICE9IC0xKSB7CisJCQlsb2NhdGlvblNULmFkZCgibGluZSIsIGxpbmUpOworCQkJbG9jYXRpb25WYWxpZCA9IHRydWU7CisJCX0KKwkJaWYgKGNvbHVtbiAhPSAtMSkgeworCQkJbG9jYXRpb25TVC5hZGQoImNvbHVtbiIsIGNvbHVtbisxKTsKKwkJCWxvY2F0aW9uVmFsaWQgPSB0cnVlOworCQl9CisJCWlmIChmaWxlICE9IG51bGwpIHsKKwkJCWxvY2F0aW9uU1QuYWRkKCJmaWxlIiwgZmlsZSk7CisJCQlsb2NhdGlvblZhbGlkID0gdHJ1ZTsKKwkJfQorCisJCW1lc3NhZ2VGb3JtYXRTVC5hZGQoImlkIiwgbXNnSUQpOworCQltZXNzYWdlRm9ybWF0U1QuYWRkKCJ0ZXh0IiwgbWVzc2FnZVNUKTsKKworCQlpZiAobG9jYXRpb25WYWxpZCkgeworCQkJcmVwb3J0U1QuYWRkKCJsb2NhdGlvbiIsIGxvY2F0aW9uU1QpOworCQl9CisJCXJlcG9ydFNULmFkZCgibWVzc2FnZSIsIG1lc3NhZ2VGb3JtYXRTVCk7CisJCXJlcG9ydFNULmFkZCgidHlwZSIsIEVycm9yTWFuYWdlci5nZXRNZXNzYWdlVHlwZShtc2dJRCkpOworCisJCXJldHVybiByZXBvcnRTVC5yZW5kZXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL05GQUZhY3RvcnkuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvTkZBRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTIyODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL05GQUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDczMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLio7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50U2V0OworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludGVydmFsU2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBSb3V0aW5lcyB0byBjb25zdHJ1Y3QgU3RhdGVDbHVzdGVycyBmcm9tIEVCTkYgZ3JhbW1hciBjb25zdHJ1Y3RzLgorICogIE5vIG9wdGltaXphdGlvbiBpcyBkb25lIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBlcHNpbG9uIGVkZ2VzLgorICoKKyAqICBUT0RPOiBhZGQgYW4gb3B0aW1pemF0aW9uIHRoYXQgcmVkdWNlcyBudW1iZXIgb2Ygc3RhdGVzIGFuZCB0cmFuc2l0aW9ucworICogIHdpbGwgaGVscCB3aXRoIHNwZWVkIG9mIGNvbnZlcnNpb24gYW5kIG1ha2UgaXQgZWFzaWVyIHRvIHZpZXcgTkZBLiAgRm9yCisgKiAgZXhhbXBsZSwgby1BLT5vLS0+by1CLT5vIHNob3VsZCBiZSBvLUEtPm8tQi0+bworICovCitwdWJsaWMgY2xhc3MgTkZBRmFjdG9yeSB7CisJLyoqIFRoaXMgZmFjdG9yeSBpcyBhdHRhY2hlZCB0byBhIHNwZWNpZmMgTkZBIHRoYXQgaXQgaXMgYnVpbGRpbmcuCisgICAgICogIFRoZSBORkEgd2lsbCBiZSBmaWxsZWQgdXAgd2l0aCBzdGF0ZXMgYW5kIHRyYW5zaXRpb25zLgorICAgICAqLworCU5GQSBuZmEgPSBudWxsOworCisgICAgcHVibGljIFJ1bGUgZ2V0Q3VycmVudFJ1bGUoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50UnVsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UnVsZShSdWxlIGN1cnJlbnRSdWxlKSB7CisgICAgICAgIHRoaXMuY3VycmVudFJ1bGUgPSBjdXJyZW50UnVsZTsKKyAgICB9CisKKwlSdWxlIGN1cnJlbnRSdWxlID0gbnVsbDsKKworCXB1YmxpYyBORkFGYWN0b3J5KE5GQSBuZmEpIHsKKyAgICAgICAgbmZhLnNldEZhY3RvcnkodGhpcyk7CisJCXRoaXMubmZhID0gbmZhOworCX0KKworICAgIHB1YmxpYyBORkFTdGF0ZSBuZXdTdGF0ZSgpIHsKKyAgICAgICAgTkZBU3RhdGUgbiA9IG5ldyBORkFTdGF0ZShuZmEpOworICAgICAgICBpbnQgc3RhdGUgPSBuZmEuZ2V0TmV3TkZBU3RhdGVOdW1iZXIoKTsKKyAgICAgICAgbi5zdGF0ZU51bWJlciA9IHN0YXRlOworICAgICAgICBuZmEuYWRkU3RhdGUobik7CisJCW4uZW5jbG9zaW5nUnVsZSA9IGN1cnJlbnRSdWxlOworCQlyZXR1cm4gbjsKKyAgICB9CisKKwkvKiogT3B0aW1pemUgYW4gYWx0ZXJuYXRpdmUgKGxpc3Qgb2YgZ3JhbW1hciBlbGVtZW50cykuCisJICoKKwkgKiAgV2FsayB0aGUgY2hhaW4gb2YgZWxlbWVudHMgKHdoaWNoIGNhbiBiZSBjb21wbGljYXRlZCBsb29wIGJsb2Nrcy4uLikKKwkgKiAgYW5kIHRocm93IGF3YXkgYW55IGVwc2lsb24gdHJhbnNpdGlvbnMgdXNlZCB0byBsaW5rIHVwIHNpbXBsZSBlbGVtZW50cy4KKwkgKgorCSAqICBUaGlzIG9ubHkgcmVtb3ZlcyAxOTUgc3RhdGVzIGZyb20gdGhlIGphdmEuZydzIE5GQSwgYnV0IGV2ZXJ5IGxpdHRsZQorCSAqICBiaXQgaGVscHMuICBQZXJoYXBzIEkgY2FuIGltcHJvdmUgaW4gdGhlIGZ1dHVyZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBvcHRpbWl6ZUFsdGVybmF0aXZlKFN0YXRlQ2x1c3RlciBhbHQpIHsKKwkJTkZBU3RhdGUgcyA9IGFsdC5sZWZ0OworCQl3aGlsZSAoIHMhPWFsdC5yaWdodCApIHsKKwkJCS8vIGlmIGl0J3MgYSBibG9jayBlbGVtZW50LCBqdW1wIG92ZXIgaXQgYW5kIGNvbnRpbnVlCisJCQlpZiAoIHMuZW5kT2ZCbG9ja1N0YXRlTnVtYmVyIT1TdGF0ZS5JTlZBTElEX1NUQVRFX05VTUJFUiApIHsKKwkJCQlzID0gbmZhLmdldFN0YXRlKHMuZW5kT2ZCbG9ja1N0YXRlTnVtYmVyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCVRyYW5zaXRpb24gdCA9IHMudHJhbnNpdGlvblswXTsKKwkJCWlmICggdCBpbnN0YW5jZW9mIFJ1bGVDbG9zdXJlVHJhbnNpdGlvbiApIHsKKwkJCQlzID0gKChSdWxlQ2xvc3VyZVRyYW5zaXRpb24pIHQpLmZvbGxvd1N0YXRlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCB0LmxhYmVsLmlzRXBzaWxvbigpICYmICF0LmxhYmVsLmlzQWN0aW9uKCkgJiYgcy5nZXROdW1iZXJPZlRyYW5zaXRpb25zKCk9PTEgKSB7CisJCQkJLy8gYnlwYXNzIGVwc2lsb24gdHJhbnNpdGlvbiBhbmQgcG9pbnQgdG8gd2hhdCB0aGUgZXBzaWxvbidzCisJCQkJLy8gdGFyZ2V0IHBvaW50cyB0byB1bmxlc3MgdGhhdCBlcHNpbG9uIHRyYW5zaXRpb24gcG9pbnRzIHRvCisJCQkJLy8gYSBibG9jayBvciBsb29wIGV0Yy4uICBBbHNvIGRvbid0IGNvbGxhcHNlIGVwc2lsb25zIHRoYXQKKwkJCQkvLyBwb2ludCBhdCB0aGUgbGFzdCBub2RlIG9mIHRoZSBhbHQuIERvbid0IGNvbGxhcHNlIGFjdGlvbiBlZGdlcworCQkJCU5GQVN0YXRlIGVwc2lsb25UYXJnZXQgPSAoTkZBU3RhdGUpdC50YXJnZXQ7CisJCQkJaWYgKCBlcHNpbG9uVGFyZ2V0LmVuZE9mQmxvY2tTdGF0ZU51bWJlcj09U3RhdGUuSU5WQUxJRF9TVEFURV9OVU1CRVIgJiYKKwkJCQkJIGVwc2lsb25UYXJnZXQudHJhbnNpdGlvblswXSAhPW51bGwgKQorCQkJCXsKKwkJCQkJcy5zZXRUcmFuc2l0aW9uMChlcHNpbG9uVGFyZ2V0LnRyYW5zaXRpb25bMF0pOworCQkJCQkvKgorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyBvcHQgIitzLnN0YXRlTnVtYmVyKyItPiIrCisJCQkJCQkJCQkgICBlcHNpbG9uVGFyZ2V0LnRyYW5zaXRpb24oMCkudGFyZ2V0LnN0YXRlTnVtYmVyKTsKKwkJCQkJKi8KKwkJCQl9CisJCQl9CisJCQlzID0gKE5GQVN0YXRlKXQudGFyZ2V0OworCQl9CisJfQorCisJLyoqIEZyb20gbGFiZWwgQSBidWlsZCBHcmFwaCBvLUEtPm8gKi8KKwlwdWJsaWMgU3RhdGVDbHVzdGVyIGJ1aWxkX0F0b20oaW50IGxhYmVsLCBHcmFtbWFyQVNUIGFzc29jaWF0ZWRBU1QpIHsKKwkJTkZBU3RhdGUgbGVmdCA9IG5ld1N0YXRlKCk7CisJCU5GQVN0YXRlIHJpZ2h0ID0gbmV3U3RhdGUoKTsKKwkJbGVmdC5hc3NvY2lhdGVkQVNUTm9kZSA9IGFzc29jaWF0ZWRBU1Q7CisJCXJpZ2h0LmFzc29jaWF0ZWRBU1ROb2RlID0gYXNzb2NpYXRlZEFTVDsKKwkJdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMobGVmdCwgcmlnaHQsIGxhYmVsKTsKKwkJU3RhdGVDbHVzdGVyIGcgPSBuZXcgU3RhdGVDbHVzdGVyKGxlZnQsIHJpZ2h0KTsKKwkJcmV0dXJuIGc7CisJfQorCisJcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9BdG9tKEdyYW1tYXJBU1QgYXRvbUFTVCkgeworCQlpbnQgdG9rZW5UeXBlID0gbmZhLmdyYW1tYXIuZ2V0VG9rZW5UeXBlKGF0b21BU1QuZ2V0VGV4dCgpKTsKKwkJcmV0dXJuIGJ1aWxkX0F0b20odG9rZW5UeXBlLCBhdG9tQVNUKTsKKwl9CisKKwkvKiogRnJvbSBzZXQgYnVpbGQgc2luZ2xlIGVkZ2UgZ3JhcGggby0+by1zZXQtPm8uICBUbyBjb25mb3JtIHRvCisgICAgICogIHdoYXQgYW4gYWx0IGJsb2NrIGxvb2tzIGxpa2UsIG11c3QgaGF2ZSBleHRyYSBzdGF0ZSBvbiBsZWZ0LgorICAgICAqLworCXB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfU2V0KEludFNldCBzZXQsIEdyYW1tYXJBU1QgYXNzb2NpYXRlZEFTVCkgeworICAgICAgICBORkFTdGF0ZSBsZWZ0ID0gbmV3U3RhdGUoKTsKKyAgICAgICAgTkZBU3RhdGUgcmlnaHQgPSBuZXdTdGF0ZSgpOworCQlsZWZ0LmFzc29jaWF0ZWRBU1ROb2RlID0gYXNzb2NpYXRlZEFTVDsKKwkJcmlnaHQuYXNzb2NpYXRlZEFTVE5vZGUgPSBhc3NvY2lhdGVkQVNUOworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzZXQpOworCQlUcmFuc2l0aW9uIGUgPSBuZXcgVHJhbnNpdGlvbihsYWJlbCxyaWdodCk7CisgICAgICAgIGxlZnQuYWRkVHJhbnNpdGlvbihlKTsKKwkJU3RhdGVDbHVzdGVyIGcgPSBuZXcgU3RhdGVDbHVzdGVyKGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGc7CisJfQorCisgICAgLyoqIENhbiBvbmx5IGNvbXBsZW1lbnQgYmxvY2sgb2Ygc2ltcGxlIGFsdHM7IGNhbiBjb21wbGVtZW50IGJ1aWxkX1NldCgpCisgICAgICogIHJlc3VsdCwgdGhhdCBpcy4gIEdldCBzZXQgYW5kIGNvbXBsZW1lbnQsIHJlcGxhY2Ugb2xkIHdpdGggY29tcGxlbWVudC4KKyAgICBwdWJsaWMgU3RhdGVDbHVzdGVyIGJ1aWxkX0FsdGVybmF0aXZlQmxvY2tDb21wbGVtZW50KFN0YXRlQ2x1c3RlciBibGspIHsKKyAgICAgICAgU3RhdGUgczAgPSBibGsubGVmdDsKKyAgICAgICAgSW50U2V0IHNldCA9IGdldENvbGxhcHNlZEJsb2NrQXNTZXQoczApOworICAgICAgICBpZiAoIHNldCE9bnVsbCApIHsKKyAgICAgICAgICAgIC8vIGlmIHNldCBpcyBhdmFpbGFibGUsIHRoZW4gc3RydWN0dXJlIGtub3duIGFuZCBibGsgaXMgYSBzZXQKKyAgICAgICAgICAgIHNldCA9IG5mYS5ncmFtbWFyLmNvbXBsZW1lbnQoc2V0KTsKKyAgICAgICAgICAgIExhYmVsIGxhYmVsID0gczAudHJhbnNpdGlvbigwKS50YXJnZXQudHJhbnNpdGlvbigwKS5sYWJlbDsKKyAgICAgICAgICAgIGxhYmVsLnNldFNldChzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBibGs7CisgICAgfQorCSAqLworCisgICAgcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9SYW5nZShpbnQgYSwgaW50IGIpIHsKKyAgICAgICAgTkZBU3RhdGUgbGVmdCA9IG5ld1N0YXRlKCk7CisgICAgICAgIE5GQVN0YXRlIHJpZ2h0ID0gbmV3U3RhdGUoKTsKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoSW50ZXJ2YWxTZXQub2YoYSwgYikpOworCQlUcmFuc2l0aW9uIGUgPSBuZXcgVHJhbnNpdGlvbihsYWJlbCxyaWdodCk7CisgICAgICAgIGxlZnQuYWRkVHJhbnNpdGlvbihlKTsKKyAgICAgICAgU3RhdGVDbHVzdGVyIGcgPSBuZXcgU3RhdGVDbHVzdGVyKGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGc7CisgICAgfQorCisJLyoqIEZyb20gY2hhciAnYycgYnVpbGQgU3RhdGVDbHVzdGVyIG8taW50VmFsdWUoYyktPm8KKwkgKi8KKwlwdWJsaWMgU3RhdGVDbHVzdGVyIGJ1aWxkX0NoYXJMaXRlcmFsQXRvbShHcmFtbWFyQVNUIGNoYXJMaXRlcmFsQVNUKSB7CisgICAgICAgIGludCBjID0gR3JhbW1hci5nZXRDaGFyVmFsdWVGcm9tR3JhbW1hckNoYXJMaXRlcmFsKGNoYXJMaXRlcmFsQVNULmdldFRleHQoKSk7CisJCXJldHVybiBidWlsZF9BdG9tKGMsIGNoYXJMaXRlcmFsQVNUKTsKKwl9CisKKwkvKiogRnJvbSBjaGFyICdjJyBidWlsZCBTdGF0ZUNsdXN0ZXIgby1pbnRWYWx1ZShjKS0+bworCSAqICBjYW4gaW5jbHVkZSB1bmljb2RlIHNwZWMgbGlrZXMgJ1x1MDAyNCcgbGF0ZXIuICBBY2NlcHRzCisJICogIGFjdHVhbCB1bmljb2RlIDE2LWJpdCBub3csIG9mIGNvdXJzZSwgYnkgZGVmYXVsdC4KKyAgICAgKiAgVE9ETyBub3Qgc3VwcGxlbWVudGFsIGNoYXIgY2xlYW4hCisJICovCisJcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9DaGFyUmFuZ2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisJCWludCBmcm9tID0gR3JhbW1hci5nZXRDaGFyVmFsdWVGcm9tR3JhbW1hckNoYXJMaXRlcmFsKGEpOworCQlpbnQgdG8gPSBHcmFtbWFyLmdldENoYXJWYWx1ZUZyb21HcmFtbWFyQ2hhckxpdGVyYWwoYik7CisJCXJldHVybiBidWlsZF9SYW5nZShmcm9tLCB0byk7CisJfQorCisgICAgLyoqIEZvciBhIG5vbi1sZXhlciwganVzdCBidWlsZCBhIHNpbXBsZSB0b2tlbiByZWZlcmVuY2UgYXRvbS4KKyAgICAgKiAgRm9yIGEgbGV4ZXIsIGEgc3RyaW5nIGlzIGEgc2VxdWVuY2Ugb2YgY2hhciB0byBtYXRjaC4gIFRoYXQgaXMsCisgICAgICogICJmb2ciIGlzIHRyZWF0ZWQgYXMgJ2YnICdvJyAnZycgbm90IGFzIGEgc2luZ2xlIHRyYW5zaXRpb24gaW4KKyAgICAgKiAgdGhlIERGQS4gIE1hY2hpbmU9PSBvLSdmJy0+by0nbyctPm8tJ2cnLT5vIGFuZCBoYXMgbisxIHN0YXRlcworICAgICAqICBmb3IgbiBjaGFyYWN0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfU3RyaW5nTGl0ZXJhbEF0b20oR3JhbW1hckFTVCBzdHJpbmdMaXRlcmFsQVNUKSB7CisgICAgICAgIGlmICggbmZhLmdyYW1tYXIudHlwZT09R3JhbW1hci5MRVhFUiApIHsKKwkJCVN0cmluZ0J1ZmZlciBjaGFycyA9CisJCQkJR3JhbW1hci5nZXRVbmVzY2FwZWRTdHJpbmdGcm9tR3JhbW1hclN0cmluZ0xpdGVyYWwoc3RyaW5nTGl0ZXJhbEFTVC5nZXRUZXh0KCkpOworICAgICAgICAgICAgTkZBU3RhdGUgZmlyc3QgPSBuZXdTdGF0ZSgpOworICAgICAgICAgICAgTkZBU3RhdGUgbGFzdCA9IG51bGw7CisgICAgICAgICAgICBORkFTdGF0ZSBwcmV2ID0gZmlyc3Q7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hhcnMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjID0gY2hhcnMuY2hhckF0KGkpOworICAgICAgICAgICAgICAgIE5GQVN0YXRlIG5leHQgPSBuZXdTdGF0ZSgpOworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKHByZXYsIG5leHQsIGMpOworICAgICAgICAgICAgICAgIHByZXYgPSBsYXN0ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAgbmV3IFN0YXRlQ2x1c3RlcihmaXJzdCwgbGFzdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhIHNpbXBsZSB0b2tlbiByZWZlcmVuY2UgaW4gbm9uLUxleGVycworICAgICAgICBpbnQgdG9rZW5UeXBlID0gbmZhLmdyYW1tYXIuZ2V0VG9rZW5UeXBlKHN0cmluZ0xpdGVyYWxBU1QuZ2V0VGV4dCgpKTsKKwkJcmV0dXJuIGJ1aWxkX0F0b20odG9rZW5UeXBlLCBzdHJpbmdMaXRlcmFsQVNUKTsKKyAgICB9CisKKyAgICAvKiogRm9yIHJlZmVyZW5jZSB0byBydWxlIHIsIGJ1aWxkCisgICAgICoKKyAgICAgKiAgby1lLT4ocikgIG8KKyAgICAgKgorICAgICAqICB3aGVyZSAocikgaXMgdGhlIHN0YXJ0IG9mIHJ1bGUgciBhbmQgdGhlIHRyYWlsaW5nIG8gaXMgbm90IGxpbmtlZAorICAgICAqICB0byBmcm9tIHJ1bGUgcmVmIHN0YXRlIGRpcmVjdGx5IChpdCdzIGRvbmUgdGhydSB0aGUgdHJhbnNpdGlvbigwKQorICAgICAqICBSdWxlQ2xvc3VyZVRyYW5zaXRpb24uCisgICAgICoKKyAgICAgKiAgSWYgdGhlIHJ1bGUgciBpcyBqdXN0IGEgbGlzdCBvZiB0b2tlbnMsIGl0J3MgYmxvY2sgd2lsbCBiZSBqdXN0CisgICAgICogIGEgc2V0IG9uIGFuIGVkZ2Ugby0+by0+by1zZXQtPm8tPm8tPm8sIGNvdWxkIGlubGluZSBpdCByYXRoZXIgdGhhbiBkb2luZworICAgICAqICB0aGUgcnVsZSByZWZlcmVuY2UsIGJ1dCBpJ20gbm90IGRvaW5nIHRoaXMgeWV0IGFzIEknbSBub3Qgc3VyZQorICAgICAqICBpdCB3b3VsZCBoZWxwIG11Y2ggaW4gdGhlIE5GQS0+REZBIGNvbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqICBUT0RPIGFkZCB0byBjb2RlZ2VuOiBjb2xsYXBzZSBhbHQgYmxrcyB0aGF0IGFyZSBzZXRzIGludG8gc2luZ2xlIG1hdGNoU2V0CisgICAgICovCisgICAgcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9SdWxlUmVmKFJ1bGUgcmVmRGVmLCBORkFTdGF0ZSBydWxlU3RhcnQpIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImJ1aWxkaW5nIHJlZiB0byBydWxlICIrbmZhLmdyYW1tYXIubmFtZSsiLiIrcmVmRGVmLm5hbWUpOworICAgICAgICBORkFTdGF0ZSBsZWZ0ID0gbmV3U3RhdGUoKTsKKyAgICAgICAgLy8gbGVmdC5zZXREZXNjcmlwdGlvbigicmVmIHRvICIrcnVsZVN0YXJ0LmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBORkFTdGF0ZSByaWdodCA9IG5ld1N0YXRlKCk7CisgICAgICAgIC8vIHJpZ2h0LnNldERlc2NyaXB0aW9uKCJORkFTdGF0ZSBmb2xsb3dpbmcgcmVmIHRvICIrcnVsZVN0YXJ0LmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBUcmFuc2l0aW9uIGUgPSBuZXcgUnVsZUNsb3N1cmVUcmFuc2l0aW9uKHJlZkRlZixydWxlU3RhcnQscmlnaHQpOworICAgICAgICBsZWZ0LmFkZFRyYW5zaXRpb24oZSk7CisgICAgICAgIFN0YXRlQ2x1c3RlciBnID0gbmV3IFN0YXRlQ2x1c3RlcihsZWZ0LCByaWdodCk7CisgICAgICAgIHJldHVybiBnOworICAgIH0KKworICAgIC8qKiBGcm9tIGFuIGVtcHR5IGFsdGVybmF0aXZlIGJ1aWxkIFN0YXRlQ2x1c3RlciBvLWUtPm8gKi8KKyAgICBwdWJsaWMgU3RhdGVDbHVzdGVyIGJ1aWxkX0Vwc2lsb24oKSB7CisgICAgICAgIE5GQVN0YXRlIGxlZnQgPSBuZXdTdGF0ZSgpOworICAgICAgICBORkFTdGF0ZSByaWdodCA9IG5ld1N0YXRlKCk7CisgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKGxlZnQsIHJpZ2h0LCBMYWJlbC5FUFNJTE9OKTsKKyAgICAgICAgU3RhdGVDbHVzdGVyIGcgPSBuZXcgU3RhdGVDbHVzdGVyKGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGc7CisgICAgfQorCisJLyoqIEJ1aWxkIHdoYXQgYW1vdW50cyB0byBhbiBlcHNpbG9uIHRyYW5zaXRpb24gd2l0aCBhIHNlbWFudGljCisJICogIHByZWRpY2F0ZSBhY3Rpb24uICBUaGUgcHJlZCBpcyBhIHBvaW50ZXIgaW50byB0aGUgQVNUIG9mCisJICogIHRoZSBTRU1QUkVEIHRva2VuLgorCSAqLworCXB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfU2VtYW50aWNQcmVkaWNhdGUoR3JhbW1hckFTVCBwcmVkKSB7CisJCS8vIGRvbid0IGNvdW50IHN5biBwcmVkcworCQlpZiAoICFwcmVkLmdldFRleHQoKS50b1VwcGVyQ2FzZSgpCisJCQkJLnN0YXJ0c1dpdGgoR3JhbW1hci5TWU5QUkVEX1JVTEVfUFJFRklYLnRvVXBwZXJDYXNlKCkpICkKKwkJeworCQkJbmZhLmdyYW1tYXIubnVtYmVyT2ZTZW1hbnRpY1ByZWRpY2F0ZXMrKzsKKwkJfQorCQlORkFTdGF0ZSBsZWZ0ID0gbmV3U3RhdGUoKTsKKwkJTkZBU3RhdGUgcmlnaHQgPSBuZXdTdGF0ZSgpOworCQlUcmFuc2l0aW9uIGUgPSBuZXcgVHJhbnNpdGlvbihuZXcgUHJlZGljYXRlTGFiZWwocHJlZCksIHJpZ2h0KTsKKwkJbGVmdC5hZGRUcmFuc2l0aW9uKGUpOworCQlTdGF0ZUNsdXN0ZXIgZyA9IG5ldyBTdGF0ZUNsdXN0ZXIobGVmdCwgcmlnaHQpOworCQlyZXR1cm4gZzsKKwl9CisKKwkvKiogQnVpbGQgd2hhdCBhbW91bnRzIHRvIGFuIGVwc2lsb24gdHJhbnNpdGlvbiB3aXRoIGFuIGFjdGlvbi4KKwkgKiAgVGhlIGFjdGlvbiBnb2VzIGludG8gTkZBIHRob3VnaCBpdCBpcyBpZ25vcmVkIGR1cmluZyBhbmFseXNpcy4KKwkgKiAgSXQgc2xvd3MgdGhpbmdzIGRvd24gYSBiaXQsIGJ1dCBJIG11c3QgaWdub3JlIHByZWRpY2F0ZXMgYWZ0ZXIKKwkgKiAgaGF2aW5nIHNlZW4gYW4gYWN0aW9uICg1LTUtMjAwOCkuCisJICovCisJcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9BY3Rpb24oR3JhbW1hckFTVCBhY3Rpb24pIHsKKwkJTkZBU3RhdGUgbGVmdCA9IG5ld1N0YXRlKCk7CisJCU5GQVN0YXRlIHJpZ2h0ID0gbmV3U3RhdGUoKTsKKwkJVHJhbnNpdGlvbiBlID0gbmV3IFRyYW5zaXRpb24obmV3IEFjdGlvbkxhYmVsKGFjdGlvbiksIHJpZ2h0KTsKKwkJbGVmdC5hZGRUcmFuc2l0aW9uKGUpOworCQlyZXR1cm4gbmV3IFN0YXRlQ2x1c3RlcihsZWZ0LCByaWdodCk7CisJfQorCisJLyoqIGFkZCBhbiBFT0YgdHJhbnNpdGlvbiB0byBhbnkgcnVsZSBlbmQgTkZBU3RhdGUgdGhhdCBwb2ludHMgdG8gbm90aGluZworICAgICAqICAoaS5lLiwgZm9yIGFsbCB0aG9zZSBydWxlcyBub3QgaW52b2tlZCBieSBhbm90aGVyIHJ1bGUpLiAgVGhlc2UKKyAgICAgKiAgYXJlIHN0YXJ0IHN5bWJvbHMgdGhlbi4KKwkgKgorCSAqICBSZXR1cm4gdGhlIG51bWJlciBvZiBncmFtbWFyIGVudHJ5IHBvaW50czsgaS5lLiwgaG93IG1hbnkgcnVsZXMgYXJlCisJICogIG5vdCBpbnZva2VkIGJ5IGFub3RoZXIgcnVsZSAodGhleSBjYW4gb25seSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSkuCisJICogIFRoZXNlIGFyZSB0aGUgc3RhcnQgcnVsZXMuCisgICAgICovCisgICAgcHVibGljIGludCBidWlsZF9FT0ZTdGF0ZXMoQ29sbGVjdGlvbiBydWxlcykgeworCQlpbnQgbnVtYmVyVW5JbnZva2VkUnVsZXMgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJUnVsZSByID0gKFJ1bGUpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCU5GQVN0YXRlIGVuZE5GQVN0YXRlID0gci5zdG9wU3RhdGU7CisgICAgICAgICAgICAvLyBJcyB0aGlzIHJ1bGUgYSBzdGFydCBzeW1ib2w/ICAobm8gZm9sbG93IGxpbmtzKQorCQkJaWYgKCBlbmRORkFTdGF0ZS50cmFuc2l0aW9uWzBdID09bnVsbCApIHsKKwkJCQkvLyBpZiBzbywgdGhlbiBkb24ndCBsZXQgYWxnb3JpdGhtIGZhbGwgb2ZmIHRoZSBlbmQgb2YKKwkJCQkvLyB0aGUgcnVsZSwgbWFrZSBpdCBoaXQgRU9GL0VPVC4KKwkJCQlidWlsZF9FT0ZTdGF0ZShlbmRORkFTdGF0ZSk7CisJCQkJLy8gdHJhY2sgaG93IG1hbnkgcnVsZXMgaGF2ZSBiZWVuIGludm9rZWQgYnkgYW5vdGhlciBydWxlCisJCQkJbnVtYmVyVW5JbnZva2VkUnVsZXMrKzsKKwkJCX0KKyAgICAgICAgfQorCQlyZXR1cm4gbnVtYmVyVW5JbnZva2VkUnVsZXM7CisgICAgfQorCisgICAgLyoqIHNldCB1cCBhbiBORkEgTkZBU3RhdGUgdGhhdCB3aWxsIHlpZWxkIGVvZiB0b2tlbnMgb3IsCisgICAgICogIGluIHRoZSBjYXNlIG9mIGEgbGV4ZXIgZ3JhbW1hciwgYW4gRU9UIHRva2VuIHdoZW4gdGhlIGNvbnZlcnNpb24KKyAgICAgKiAgaGl0cyB0aGUgZW5kIG9mIGEgcnVsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVpbGRfRU9GU3RhdGUoTkZBU3RhdGUgZW5kTkZBU3RhdGUpIHsKKwkJTkZBU3RhdGUgZW5kID0gbmV3U3RhdGUoKTsKKyAgICAgICAgaW50IGxhYmVsID0gTGFiZWwuRU9GOworICAgICAgICBpZiAoIG5mYS5ncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgKSB7CisgICAgICAgICAgICBsYWJlbCA9IExhYmVsLkVPVDsKKwkJCWVuZC5zZXRFT1RUYXJnZXRTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorCQkvKgorCQlTeXN0ZW0ub3V0LnByaW50bG4oImJ1aWxkICIrbmZhLmdyYW1tYXIuZ2V0VG9rZW5EaXNwbGF5TmFtZShsYWJlbCkrCisJCQkJCQkgICAiIGxvb3Agb24gZW5kIG9mIHN0YXRlICIrZW5kTkZBU3RhdGUuZ2V0RGVzY3JpcHRpb24oKSsKKwkJCQkJCSAgICIgdG8gc3RhdGUgIitlbmQuc3RhdGVOdW1iZXIpOworCQkqLworCQlUcmFuc2l0aW9uIHRvRW5kID0gbmV3IFRyYW5zaXRpb24obGFiZWwsIGVuZCk7CisJCWVuZE5GQVN0YXRlLmFkZFRyYW5zaXRpb24odG9FbmQpOworCX0KKworICAgIC8qKiBGcm9tIEEgQiBidWlsZCBBLWUtPkIgKHRoYXQgaXMsIGJ1aWxkIGFuIGVwc2lsb24gYXJjIGZyb20gcmlnaHQKKyAgICAgKiAgb2YgQSB0byBsZWZ0IG9mIEIpLgorICAgICAqCisgICAgICogIEFzIGEgY29udmVuaWVuY2UsIHJldHVybiBCIGlmIEEgaXMgbnVsbCBvciByZXR1cm4gQSBpZiBCIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9BQihTdGF0ZUNsdXN0ZXIgQSwgU3RhdGVDbHVzdGVyIEIpIHsKKyAgICAgICAgaWYgKCBBPT1udWxsICkgeworICAgICAgICAgICAgcmV0dXJuIEI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBCPT1udWxsICkgeworICAgICAgICAgICAgcmV0dXJuIEE7CisgICAgICAgIH0KKwkJdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMoQS5yaWdodCwgQi5sZWZ0LCBMYWJlbC5FUFNJTE9OKTsKKwkJU3RhdGVDbHVzdGVyIGcgPSBuZXcgU3RhdGVDbHVzdGVyKEEubGVmdCwgQi5yaWdodCk7CisgICAgICAgIHJldHVybiBnOworICAgIH0KKworCS8qKiBGcm9tIGEgc2V0ICgnYSd8J2InKSBidWlsZAorICAgICAqCisgICAgICogIG8tPm8tJ2EnLi4nYictPm8tPm8gKGxhc3QgTkZBU3RhdGUgaXMgYmxvY2tFbmRORkFTdGF0ZSBwb2ludGVkIHRvIGJ5IGFsbCBhbHRzKQorCSAqLworCXB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfQWx0ZXJuYXRpdmVCbG9ja0Zyb21TZXQoU3RhdGVDbHVzdGVyIHNldCkgeworCQlpZiAoIHNldD09bnVsbCApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLy8gc2luZ2xlIGFsdCwgbm8gZGVjaXNpb24sIGp1c3QgcmV0dXJuIG9ubHkgYWx0IHN0YXRlIGNsdXN0ZXIKKwkJTkZBU3RhdGUgc3RhcnRPZkFsdCA9IG5ld1N0YXRlKCk7IC8vIG11c3QgaGF2ZSB0aGlzIG5vIG1hdHRlciB3aGF0CisJCXRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKHN0YXJ0T2ZBbHQsIHNldC5sZWZ0LCBMYWJlbC5FUFNJTE9OKTsKKworCQlyZXR1cm4gbmV3IFN0YXRlQ2x1c3RlcihzdGFydE9mQWx0LHNldC5yaWdodCk7CisJfQorCisJLyoqIEZyb20gQXxCfC4ufFogYWx0ZXJuYXRpdmUgYmxvY2sgYnVpbGQKKyAgICAgKgorICAgICAqICBvLT5vLUEtPm8tPm8gKGxhc3QgTkZBU3RhdGUgaXMgYmxvY2tFbmRORkFTdGF0ZSBwb2ludGVkIHRvIGJ5IGFsbCBhbHRzKQorICAgICAqICB8ICAgICAgICAgIF4KKyAgICAgKiAgby0+by1CLT5vLS18CisgICAgICogIHwgICAgICAgICAgfAorICAgICAqICAuLi4gICAgICAgIHwKKyAgICAgKiAgfCAgICAgICAgICB8CisgICAgICogIG8tPm8tWi0+by0tfAorICAgICAqCisgICAgICogIFNvIGV2ZXJ5IGFsdGVybmF0aXZlIGdldHMgYmVnaW4gTkZBU3RhdGUgY29ubmVjdGVkIGJ5IGVwc2lsb24KKyAgICAgKiAgYW5kIGV2ZXJ5IGFsdCByaWdodCBzaWRlIHBvaW50cyBhdCBhIGJsb2NrIGVuZCBORkFTdGF0ZS4gIFRoZXJlIGlzIGEKKyAgICAgKiAgbmV3IE5GQVN0YXRlIGluIHRoZSBORkFTdGF0ZSBpbiB0aGUgU3RhdGVDbHVzdGVyIGZvciBlYWNoIGFsdCBwbHVzIG9uZSBmb3IgdGhlCisgICAgICogIGVuZCBORkFTdGF0ZS4KKyAgICAgKgorICAgICAqICBTcGVjaWFsIGNhc2U6IG9ubHkgb25lIGFsdGVybmF0aXZlOiBkb24ndCBtYWtlIGEgYmxvY2sgd2l0aCBhbHQKKyAgICAgKiAgYmVnaW4vZW5kLgorICAgICAqCisgICAgICogIFNwZWNpYWwgY2FzZTogaWYganVzdCBhIGxpc3Qgb2YgdG9rZW5zL2NoYXJzL3NldHMsIHRoZW4gY29sbGFwc2UKKyAgICAgKiAgdG8gYSBzaW5nbGUgZWRnZSdkIG8tc2V0LT5vIGdyYXBoLgorICAgICAqCisgICAgICogIFNldCBhbHQgbnVtYmVyICgxLi5uKSBpbiB0aGUgbGVmdC1UcmFuc2l0aW9uIE5GQVN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfQWx0ZXJuYXRpdmVCbG9jayhMaXN0IGFsdGVybmF0aXZlU3RhdGVDbHVzdGVycykKKyAgICB7CisgICAgICAgIFN0YXRlQ2x1c3RlciByZXN1bHQgPSBudWxsOworICAgICAgICBpZiAoIGFsdGVybmF0aXZlU3RhdGVDbHVzdGVycz09bnVsbCB8fCBhbHRlcm5hdGl2ZVN0YXRlQ2x1c3RlcnMuc2l6ZSgpPT0wICkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworCQkvLyBzaW5nbGUgYWx0IGNhc2UKKwkJaWYgKCBhbHRlcm5hdGl2ZVN0YXRlQ2x1c3RlcnMuc2l6ZSgpPT0xICkgeworCQkJLy8gc2luZ2xlIGFsdCwgbm8gZGVjaXNpb24sIGp1c3QgcmV0dXJuIG9ubHkgYWx0IHN0YXRlIGNsdXN0ZXIKKwkJCVN0YXRlQ2x1c3RlciBnID0gKFN0YXRlQ2x1c3RlcilhbHRlcm5hdGl2ZVN0YXRlQ2x1c3RlcnMuZ2V0KDApOworCQkJTkZBU3RhdGUgc3RhcnRPZkFsdCA9IG5ld1N0YXRlKCk7IC8vIG11c3QgaGF2ZSB0aGlzIG5vIG1hdHRlciB3aGF0CisJCQl0cmFuc2l0aW9uQmV0d2VlblN0YXRlcyhzdGFydE9mQWx0LCBnLmxlZnQsIExhYmVsLkVQU0lMT04pOworCisJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIyMjIG9wdCBzYXZlZCBzdGFydC9zdG9wIGVuZCBpbiAoLi4uKSIpOworCQkJcmV0dXJuIG5ldyBTdGF0ZUNsdXN0ZXIoc3RhcnRPZkFsdCxnLnJpZ2h0KTsKKwkJfQorCisJCS8vIGV2ZW4gaWYgd2UgY2FuIGNvbGxhcHNlIGZvciBsb29rYWhlYWQgcHVycG9zZXMsIHdlIHdpbGwgc3RpbGwKKyAgICAgICAgLy8gbmVlZCB0byBwcmVkaWN0IHRoZSBhbHRzIG9mIHRoaXMgc3VicnVsZSBpbiBjYXNlIHRoZXJlIGFyZSBhY3Rpb25zCisgICAgICAgIC8vIGV0Yy4uLiAgVGhpcyBpcyB0aGUgZGVjaXNpb24gdGhhdCBpcyBwb2ludGVkIHRvIGZyb20gdGhlIEFTVCBub2RlCisgICAgICAgIC8vIChhbHdheXMpCisgICAgICAgIE5GQVN0YXRlIHByZXZBbHRlcm5hdGl2ZSA9IG51bGw7IC8vIHRyYWNrcyBwcmV2IHNvIHdlIGNhbiBsaW5rIHRvIG5leHQgYWx0CisgICAgICAgIE5GQVN0YXRlIGZpcnN0QWx0ID0gbnVsbDsKKyAgICAgICAgTkZBU3RhdGUgYmxvY2tFbmRORkFTdGF0ZSA9IG5ld1N0YXRlKCk7CisgICAgICAgIGJsb2NrRW5kTkZBU3RhdGUuc2V0RGVzY3JpcHRpb24oImVuZCBibG9jayIpOworICAgICAgICBpbnQgYWx0TnVtID0gMTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWx0ZXJuYXRpdmVTdGF0ZUNsdXN0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RhdGVDbHVzdGVyIGcgPSAoU3RhdGVDbHVzdGVyKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIC8vIGFkZCBiZWdpbiBORkFTdGF0ZSBmb3IgdGhpcyBhbHQgY29ubmVjdGVkIGJ5IGVwc2lsb24KKyAgICAgICAgICAgIE5GQVN0YXRlIGxlZnQgPSBuZXdTdGF0ZSgpOworICAgICAgICAgICAgbGVmdC5zZXREZXNjcmlwdGlvbigiYWx0ICIrYWx0TnVtKyIgb2YgKCkiKTsKKwkJCXRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKGxlZnQsIGcubGVmdCwgTGFiZWwuRVBTSUxPTik7CisJCQl0cmFuc2l0aW9uQmV0d2VlblN0YXRlcyhnLnJpZ2h0LCBibG9ja0VuZE5GQVN0YXRlLCBMYWJlbC5FUFNJTE9OKTsKKwkJCS8vIEFyZSB3ZSB0aGUgZmlyc3QgYWx0ZXJuYXRpdmU/CisJCQlpZiAoIGZpcnN0QWx0PT1udWxsICkgeworCQkJCWZpcnN0QWx0ID0gbGVmdDsgLy8gdHJhY2sgZXh0cmVtZSBsZWZ0IG5vZGUgb2YgU3RhdGVDbHVzdGVyCisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBpZiBub3QgZmlyc3QgYWx0ZXJuYXRpdmUsIG11c3QgbGluayB0byB0aGlzIGFsdCBmcm9tIHByZXZpb3VzCisJCQkJdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMocHJldkFsdGVybmF0aXZlLCBsZWZ0LCBMYWJlbC5FUFNJTE9OKTsKKwkJCX0KKwkJCXByZXZBbHRlcm5hdGl2ZSA9IGxlZnQ7CisJCQlhbHROdW0rKzsKKwkJfQorCisJCS8vIHJldHVybiBTdGF0ZUNsdXN0ZXIgcG9pbnRpbmcgcmVwcmVzZW50aW5nIGVudGlyZSBibG9jaworCQkvLyBQb2ludHMgdG8gZmlyc3QgYWx0IE5GQVN0YXRlIG9uIGxlZnQsIGJsb2NrIGVuZCBvbiByaWdodAorCQlyZXN1bHQgPSBuZXcgU3RhdGVDbHVzdGVyKGZpcnN0QWx0LCBibG9ja0VuZE5GQVN0YXRlKTsKKworCQlmaXJzdEFsdC5kZWNpc2lvblN0YXRlVHlwZSA9IE5GQVN0YXRlLkJMT0NLX1NUQVJUOworCisJCS8vIHNldCBFT0IgbWFya2VycyBmb3IgSmVhbgorCQlmaXJzdEFsdC5lbmRPZkJsb2NrU3RhdGVOdW1iZXIgPSBibG9ja0VuZE5GQVN0YXRlLnN0YXRlTnVtYmVyOworCisJCXJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqIEZyb20gKEEpPyBidWlsZCBlaXRoZXI6CisgICAgICoKKwkgKiAgby0tQS0+bworCSAqICB8ICAgICBeCisJICogIG8tLS0tPnwKKyAgICAgKgorICAgICAqICBvciwgaWYgQSBpcyBhIGJsb2NrLCBqdXN0IGFkZCBhbiBlbXB0eSBhbHQgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhdGVDbHVzdGVyIGJ1aWxkX0FvcHRpb25hbChTdGF0ZUNsdXN0ZXIgQSkgeworICAgICAgICBTdGF0ZUNsdXN0ZXIgZyA9IG51bGw7CisgICAgICAgIGludCBuID0gbmZhLmdyYW1tYXIuZ2V0TnVtYmVyT2ZBbHRzRm9yRGVjaXNpb25ORkEoQS5sZWZ0KTsKKyAgICAgICAgaWYgKCBuPT0xICkgeworICAgICAgICAgICAgLy8gbm8gZGVjaXNpb24sIGp1c3Qgd3JhcCBpbiBhbiBvcHRpb25hbCBwYXRoCisJCQkvL05GQVN0YXRlIGRlY2lzaW9uU3RhdGUgPSBuZXdTdGF0ZSgpOworCQkJTkZBU3RhdGUgZGVjaXNpb25TdGF0ZSA9IEEubGVmdDsgLy8gcmVzdXNlIGxlZnQgZWRnZQorCQkJZGVjaXNpb25TdGF0ZS5zZXREZXNjcmlwdGlvbigib25seSBhbHQgb2YgKCk/IGJsb2NrIik7CisJCQlORkFTdGF0ZSBlbXB0eUFsdCA9IG5ld1N0YXRlKCk7CisgICAgICAgICAgICBlbXB0eUFsdC5zZXREZXNjcmlwdGlvbigiZXBzaWxvbiBwYXRoIG9mICgpPyBibG9jayIpOworICAgICAgICAgICAgTkZBU3RhdGUgYmxvY2tFbmRORkFTdGF0ZSA9IG51bGw7CisJCQlibG9ja0VuZE5GQVN0YXRlID0gbmV3U3RhdGUoKTsKKwkJCXRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKEEucmlnaHQsIGJsb2NrRW5kTkZBU3RhdGUsIExhYmVsLkVQU0lMT04pOworCQkJYmxvY2tFbmRORkFTdGF0ZS5zZXREZXNjcmlwdGlvbigiZW5kICgpPyBibG9jayIpOworICAgICAgICAgICAgLy90cmFuc2l0aW9uQmV0d2VlblN0YXRlcyhkZWNpc2lvblN0YXRlLCBBLmxlZnQsIExhYmVsLkVQU0lMT04pOworICAgICAgICAgICAgdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMoZGVjaXNpb25TdGF0ZSwgZW1wdHlBbHQsIExhYmVsLkVQU0lMT04pOworICAgICAgICAgICAgdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMoZW1wdHlBbHQsIGJsb2NrRW5kTkZBU3RhdGUsIExhYmVsLkVQU0lMT04pOworCisJCQkvLyBzZXQgRU9CIG1hcmtlcnMgZm9yIEplYW4KKwkJCWRlY2lzaW9uU3RhdGUuZW5kT2ZCbG9ja1N0YXRlTnVtYmVyID0gYmxvY2tFbmRORkFTdGF0ZS5zdGF0ZU51bWJlcjsKKwkJCWJsb2NrRW5kTkZBU3RhdGUuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5SSUdIVF9FREdFX09GX0JMT0NLOworCisgICAgICAgICAgICBnID0gbmV3IFN0YXRlQ2x1c3RlcihkZWNpc2lvblN0YXRlLCBibG9ja0VuZE5GQVN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGEgZGVjaXNpb24gYmxvY2ssIGFkZCBhbiBlbXB0eSBhbHQKKyAgICAgICAgICAgIE5GQVN0YXRlIGxhc3RSZWFsQWx0ID0KKyAgICAgICAgICAgICAgICAgICAgbmZhLmdyYW1tYXIuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKEEubGVmdCwgbik7CisgICAgICAgICAgICBORkFTdGF0ZSBlbXB0eUFsdCA9IG5ld1N0YXRlKCk7CisgICAgICAgICAgICBlbXB0eUFsdC5zZXREZXNjcmlwdGlvbigiZXBzaWxvbiBwYXRoIG9mICgpPyBibG9jayIpOworICAgICAgICAgICAgdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMobGFzdFJlYWxBbHQsIGVtcHR5QWx0LCBMYWJlbC5FUFNJTE9OKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKGVtcHR5QWx0LCBBLnJpZ2h0LCBMYWJlbC5FUFNJTE9OKTsKKworCQkJLy8gc2V0IEVPQiBtYXJrZXJzIGZvciBKZWFuIChJIHRoaW5rIHRoaXMgaXMgcmVkdW5kYW50IGhlcmUpCisJCQlBLmxlZnQuZW5kT2ZCbG9ja1N0YXRlTnVtYmVyID0gQS5yaWdodC5zdGF0ZU51bWJlcjsKKwkJCUEucmlnaHQuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5SSUdIVF9FREdFX09GX0JMT0NLOworCisgICAgICAgICAgICBnID0gQTsgLy8gcmV0dXJuIHNhbWUgYmxvY2ssIGJ1dCBub3cgd2l0aCBvcHRpb25hbCBsYXN0IHBhdGgKKyAgICAgICAgfQorCQlnLmxlZnQuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5PUFRJT05BTF9CTE9DS19TVEFSVDsKKworICAgICAgICByZXR1cm4gZzsKKyAgICB9CisKKyAgICAvKiogRnJvbSAoQSkrIGJ1aWxkCisJICoKKyAgICAgKiAgICAgfC0tLXwgICAgKFRyYW5zaXRpb24gMiBmcm9tIEEucmlnaHQgcG9pbnRzIGF0IGFsdCAxKQorCSAqICAgICB2ICAgfCAgICAoZm9sbG93IG9mIGxvb3AgaXMgVHJhbnNpdGlvbiAxKQorICAgICAqICBvLT5vLUEtby0+bworICAgICAqCisgICAgICogIE1lYW5pbmcgdGhhdCB0aGUgbGFzdCBORkFTdGF0ZSBpbiBBIHBvaW50cyBiYWNrIHRvIEEncyBsZWZ0IFRyYW5zaXRpb24gTkZBU3RhdGUKKyAgICAgKiAgYW5kIHdlIGFkZCBhIG5ldyBiZWdpbi9lbmQgTkZBU3RhdGUuICBBIGNhbiBiZSBzaW5nbGUgYWx0ZXJuYXRpdmUgb3IKKyAgICAgKiAgbXVsdGlwbGUuCisJICoKKwkgKiAgRHVyaW5nIGFuYWx5c2lzIHdlJ2xsIGNhbGwgdGhlIGZvbGxvdyBsaW5rICh0cmFuc2l0aW9uIDEpIGFsdCBuKzEgZm9yCisJICogIGFuIG4tYWx0IEEgYmxvY2suCisgICAgICovCisgICAgcHVibGljIFN0YXRlQ2x1c3RlciBidWlsZF9BcGx1cyhTdGF0ZUNsdXN0ZXIgQSkgeworICAgICAgICBORkFTdGF0ZSBsZWZ0ID0gbmV3U3RhdGUoKTsKKyAgICAgICAgTkZBU3RhdGUgYmxvY2tFbmRORkFTdGF0ZSA9IG5ld1N0YXRlKCk7CisJCWJsb2NrRW5kTkZBU3RhdGUuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5SSUdIVF9FREdFX09GX0JMT0NLOworCisJCS8vIGRvbid0IHJldXNlIEEucmlnaHQgYXMgbG9vcGJhY2sgaWYgaXQncyByaWdodCBlZGdlIG9mIGFub3RoZXIgYmxvY2sKKwkJaWYgKCBBLnJpZ2h0LmRlY2lzaW9uU3RhdGVUeXBlID09IE5GQVN0YXRlLlJJR0hUX0VER0VfT0ZfQkxPQ0sgKSB7CisJCQkvLyBuZXN0ZWQgQSogc28gbWFrZSBhbm90aGVyIHRhaWwgbm9kZSB0byBiZSB0aGUgbG9vcCBiYWNrCisJCQkvLyBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBBLnJpZ2h0IHdoaWNoIGlzIHRoZSBFT0IgZm9yIGlubmVyIGxvb3AKKwkJCU5GQVN0YXRlIGV4dHJhUmlnaHRFZGdlID0gbmV3U3RhdGUoKTsKKwkJCXRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKEEucmlnaHQsIGV4dHJhUmlnaHRFZGdlLCBMYWJlbC5FUFNJTE9OKTsKKwkJCUEucmlnaHQgPSBleHRyYVJpZ2h0RWRnZTsKKwkJfQorCisgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKEEucmlnaHQsIGJsb2NrRW5kTkZBU3RhdGUsIExhYmVsLkVQU0lMT04pOyAvLyBmb2xsb3cgaXMgVHJhbnNpdGlvbiAxCisJCS8vIHR1cm4gQSdzIGJsb2NrIGVuZCBpbnRvIGEgbG9vcGJhY2sgKGFjdHMgbGlrZSBhbHQgMikKKwkJdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMoQS5yaWdodCwgQS5sZWZ0LCBMYWJlbC5FUFNJTE9OKTsgLy8gbG9vcCBiYWNrIFRyYW5zaXRpb24gMgorCQl0cmFuc2l0aW9uQmV0d2VlblN0YXRlcyhsZWZ0LCBBLmxlZnQsIExhYmVsLkVQU0lMT04pOworCQkKKwkJQS5yaWdodC5kZWNpc2lvblN0YXRlVHlwZSA9IE5GQVN0YXRlLkxPT1BCQUNLOworCQlBLmxlZnQuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5CTE9DS19TVEFSVDsKKworCQkvLyBzZXQgRU9CIG1hcmtlcnMgZm9yIEplYW4KKwkJQS5sZWZ0LmVuZE9mQmxvY2tTdGF0ZU51bWJlciA9IEEucmlnaHQuc3RhdGVOdW1iZXI7CisKKyAgICAgICAgU3RhdGVDbHVzdGVyIGcgPSBuZXcgU3RhdGVDbHVzdGVyKGxlZnQsIGJsb2NrRW5kTkZBU3RhdGUpOworICAgICAgICByZXR1cm4gZzsKKyAgICB9CisKKyAgICAvKiogRnJvbSAoQSkqIGJ1aWxkCisgICAgICoKKwkgKiAgICAgfC0tLXwKKwkgKiAgICAgdiAgIHwKKwkgKiAgby0+by1BLW8tLW8gKFRyYW5zaXRpb24gMiBmcm9tIGJsb2NrIGVuZCBwb2ludHMgYXQgYWx0IDE7IGZvbGxvdyBpcyBUcmFuc2l0aW9uIDEpCisgICAgICogIHwgICAgICAgICBeCisgICAgICogIG8tLS0tLS0tLS18IChvcHRpb25hbCBicmFuY2ggaXMgMm5kIGFsdCBvZiBvcHRpb25hbCBibG9jayBjb250YWluaW5nIEErKQorICAgICAqCisgICAgICogIE1lYW5pbmcgdGhhdCB0aGUgbGFzdCAoZW5kKSBORkFTdGF0ZSBpbiBBIHBvaW50cyBiYWNrIHRvIEEncworICAgICAqICBsZWZ0IHNpZGUgTkZBU3RhdGUgYW5kIHdlIGFkZCAzIG5ldyBORkFTdGF0ZXMgKHRoZQorICAgICAqICBvcHRpb25hbCBicmFuY2ggaXMgYnVpbHQganVzdCBsaWtlIGFuIG9wdGlvbmFsIHN1YnJ1bGUpLgorICAgICAqICBTZWUgdGhlIEFwbHVzKCkgbWV0aG9kIGZvciBtb3JlIG9uIHRoZSBsb29wIGJhY2sgVHJhbnNpdGlvbi4KKwkgKiAgVGhlIG5ldyBub2RlIG9uIHJpZ2h0IGVkZ2UgaXMgc2V0IHRvIFJJR0hUX0VER0VfT0ZfQ0xPU1VSRSBzbyB3ZQorCSAqICBjYW4gZGV0ZWN0IG5lc3RlZCAoQSopKiBsb29wcyBhbmQgaW5zZXJ0IGFuIGV4dHJhIG5vZGUuICBQcmV2aW91c2x5LAorCSAqICB0d28gYmxvY2tzIHNoYXJlZCBzYW1lIEVPQiBub2RlLgorICAgICAqCisgICAgICogIFRoZXJlIGFyZSAyIG9yIDMgZGVjaXNpb24gcG9pbnRzIGluIGEgQSouICBJZiBBIGlzIG5vdCBhIGJsb2NrIChpLmUuLAorICAgICAqICBpdCBvbmx5IGhhcyBvbmUgYWx0KSwgdGhlbiB0aGVyZSBhcmUgdHdvIGRlY2lzaW9uczogdGhlIG9wdGlvbmFsIGJ5cGFzcworICAgICAqICBhbmQgdGhlbiBsb29wYmFjay4gIElmIEEgaXMgYSBibG9jayBvZiBhbHRzLCB0aGVuIHRoZXJlIGFyZSB0aHJlZQorICAgICAqICBkZWNpc2lvbnM6IGJ5cGFzcywgbG9vcGJhY2ssIGFuZCBBJ3MgZGVjaXNpb24gcG9pbnQuCisgICAgICoKKyAgICAgKiAgTm90ZSB0aGF0IHRoZSBvcHRpb25hbCBieXBhc3MgbXVzdCBiZSBvdXRzaWRlIHRoZSBsb29wIGFzIChBfEIpKiBpcworICAgICAqICBub3QgdGhlIHNhbWUgdGhpbmcgYXMgKEF8QnwpKy4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIGFuIGFjY3VyYXRlIE5GQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVhbmluZyBvZiAoQSkqLCBidXQKKyAgICAgKiAgZm9yIGdlbmVyYXRpbmcgY29kZSwgSSBkb24ndCBuZWVkIGEgREZBIGZvciB0aGUgb3B0aW9uYWwgYnJhbmNoIGJ5CisgICAgICogIHZpcnR1ZSBvZiBob3cgSSBnZW5lcmF0ZSBjb2RlLiAgVGhlIGV4aXQtbG9vcGJhY2stYnJhbmNoIGRlY2lzaW9uCisgICAgICogIGlzIHN1ZmZpY2llbnQgdG8gbGV0IG1lIG1ha2UgYW4gYXBwcm9wcmlhdGUgZW50ZXIsIGV4aXQsIGxvb3AKKyAgICAgKiAgZGV0ZXJtaW5hdGlvbi4gIFNlZSBjb2RlZ2VuLmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhdGVDbHVzdGVyIGJ1aWxkX0FzdGFyKFN0YXRlQ2x1c3RlciBBKSB7CisJCU5GQVN0YXRlIGJ5cGFzc0RlY2lzaW9uU3RhdGUgPSBuZXdTdGF0ZSgpOworCQlieXBhc3NEZWNpc2lvblN0YXRlLnNldERlc2NyaXB0aW9uKCJlbnRlciBsb29wIHBhdGggb2YgKCkqIGJsb2NrIik7CisgICAgICAgIE5GQVN0YXRlIG9wdGlvbmFsQWx0ID0gbmV3U3RhdGUoKTsKKyAgICAgICAgb3B0aW9uYWxBbHQuc2V0RGVzY3JpcHRpb24oImVwc2lsb24gcGF0aCBvZiAoKSogYmxvY2siKTsKKyAgICAgICAgTkZBU3RhdGUgYmxvY2tFbmRORkFTdGF0ZSA9IG5ld1N0YXRlKCk7CisJCWJsb2NrRW5kTkZBU3RhdGUuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5SSUdIVF9FREdFX09GX0JMT0NLOworCisJCS8vIGRvbid0IHJldXNlIEEucmlnaHQgYXMgbG9vcGJhY2sgaWYgaXQncyByaWdodCBlZGdlIG9mIGFub3RoZXIgYmxvY2sKKwkJaWYgKCBBLnJpZ2h0LmRlY2lzaW9uU3RhdGVUeXBlID09IE5GQVN0YXRlLlJJR0hUX0VER0VfT0ZfQkxPQ0sgKSB7CisJCQkvLyBuZXN0ZWQgQSogc28gbWFrZSBhbm90aGVyIHRhaWwgbm9kZSB0byBiZSB0aGUgbG9vcCBiYWNrCisJCQkvLyBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBBLnJpZ2h0IHdoaWNoIGlzIHRoZSBFT0IgZm9yIGlubmVyIGxvb3AKKwkJCU5GQVN0YXRlIGV4dHJhUmlnaHRFZGdlID0gbmV3U3RhdGUoKTsKKwkJCXRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKEEucmlnaHQsIGV4dHJhUmlnaHRFZGdlLCBMYWJlbC5FUFNJTE9OKTsKKwkJCUEucmlnaHQgPSBleHRyYVJpZ2h0RWRnZTsKKwkJfQorCisJCS8vIGNvbnZlcnQgQSdzIGVuZCBibG9jayB0byBsb29wYmFjaworCQlBLnJpZ2h0LnNldERlc2NyaXB0aW9uKCIoKSogbG9vcGJhY2siKTsKKwkJLy8gVHJhbnNpdGlvbiAxIHRvIGFjdHVhbCBibG9jayBvZiBzdHVmZgorICAgICAgICB0cmFuc2l0aW9uQmV0d2VlblN0YXRlcyhieXBhc3NEZWNpc2lvblN0YXRlLCBBLmxlZnQsIExhYmVsLkVQU0lMT04pOworICAgICAgICAvLyBUcmFuc2l0aW9uIDIgb3B0aW9uYWwgdG8gYnlwYXNzCisgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKGJ5cGFzc0RlY2lzaW9uU3RhdGUsIG9wdGlvbmFsQWx0LCBMYWJlbC5FUFNJTE9OKTsKKwkJdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMob3B0aW9uYWxBbHQsIGJsb2NrRW5kTkZBU3RhdGUsIExhYmVsLkVQU0lMT04pOworICAgICAgICAvLyBUcmFuc2l0aW9uIDEgb2YgZW5kIGJsb2NrIGV4aXRzCisgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKEEucmlnaHQsIGJsb2NrRW5kTkZBU3RhdGUsIExhYmVsLkVQU0lMT04pOworICAgICAgICAvLyBUcmFuc2l0aW9uIDIgb2YgZW5kIGJsb2NrIGxvb3BzCisgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKEEucmlnaHQsIEEubGVmdCwgTGFiZWwuRVBTSUxPTik7CisKKwkJYnlwYXNzRGVjaXNpb25TdGF0ZS5kZWNpc2lvblN0YXRlVHlwZSA9IE5GQVN0YXRlLkJZUEFTUzsKKwkJQS5sZWZ0LmRlY2lzaW9uU3RhdGVUeXBlID0gTkZBU3RhdGUuQkxPQ0tfU1RBUlQ7CisJCUEucmlnaHQuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5MT09QQkFDSzsKKworCQkvLyBzZXQgRU9CIG1hcmtlcnMgZm9yIEplYW4KKwkJQS5sZWZ0LmVuZE9mQmxvY2tTdGF0ZU51bWJlciA9IEEucmlnaHQuc3RhdGVOdW1iZXI7CisJCWJ5cGFzc0RlY2lzaW9uU3RhdGUuZW5kT2ZCbG9ja1N0YXRlTnVtYmVyID0gYmxvY2tFbmRORkFTdGF0ZS5zdGF0ZU51bWJlcjsKKworICAgICAgICBTdGF0ZUNsdXN0ZXIgZyA9IG5ldyBTdGF0ZUNsdXN0ZXIoYnlwYXNzRGVjaXNpb25TdGF0ZSwgYmxvY2tFbmRORkFTdGF0ZSk7CisgICAgICAgIHJldHVybiBnOworICAgIH0KKworICAgIC8qKiBCdWlsZCBhbiBORkEgcHJlZGljdG9yIGZvciBzcGVjaWFsIHJ1bGUgY2FsbGVkIFRva2VucyBtYW51YWxseSB0aGF0CisgICAgICogIHByZWRpY3RzIHdoaWNoIHRva2VuIHdpbGwgc3VjY2VlZC4gIFRoZSByZWZzIHRvIHRoZSBydWxlcyBhcmUgbm90CisgICAgICogIFJ1bGVSZWZUcmFuc2l0aW9ucyBhcyBJIHdhbnQgREZBIGNvbnZlcnNpb24gdG8gc3RvcCBhdCB0aGUgRU9UCisgICAgICogIHRyYW5zaXRpb24gb24gdGhlIGVuZCBvZiBlYWNoIHRva2VuLCByYXRoZXIgdGhhbiByZXR1cm4gdG8gVG9rZW5zIHJ1bGUuCisgICAgICogIElmIEkgdXNlZCBub3JtYWwgYnVpbGRfYWx0ZXJuYXRpdmVCbG9jayBmb3IgdGhpcywgdGhlIFJ1bGVSZWZUcmFuc2l0aW9ucworICAgICAqICB3b3VsZCBzYXZlIHJldHVybiBhZGRyZXNzIHdoZW4ganVtcGluZyBhd2F5IGZyb20gVG9rZW5zIHJ1bGUuCisgICAgICoKKyAgICAgKiAgQWxsIEkgZG8gaGVyZSBpcyBidWlsZCBuIG5ldyBzdGF0ZXMgZm9yIG4gcnVsZXMgd2l0aCBhbiBlcHNpbG9uCisgICAgICogIGVkZ2UgdG8gdGhlIHJ1bGUgc3RhcnQgc3RhdGVzIGFuZCB0aGVuIHRvIHRoZSBuZXh0IHN0YXRlIGluIHRoZQorICAgICAqICBsaXN0OgorICAgICAqCisgICAgICogICBvLT4oQSkgIChhIHN0YXRlIGxpbmtzIHRvIHN0YXJ0IG9mIEEgYW5kIHRvIG5leHQgaW4gbGlzdCkKKyAgICAgKiAgIHwKKyAgICAgKiAgIG8tPihCKQorICAgICAqICAgfAorICAgICAqICAgLi4uCisgICAgICogICB8CisgICAgICogICBvLT4oWikKKwkgKgorCSAqICBUaGlzIGlzIHRoZSBORkEgY3JlYXRlZCBmb3IgdGhlIGFydGlmaWNpYWwgcnVsZSBjcmVhdGVkIGluCisJICogIEdyYW1tYXIuYWRkQXJ0aWZpY2lhbE1hdGNoVG9rZW5zUnVsZSgpLgorCSAqCisJICogIDExLzI4LzIwMDU6IHJlbW92ZWQgc28gd2UgY2FuIHVzZSBub3JtYWwgcnVsZSBjb25zdHJ1Y3Rpb24gZm9yIFRva2Vucy4KKyAgICBwdWJsaWMgTkZBU3RhdGUgYnVpbGRfQXJ0aWZpY2lhbE1hdGNoVG9rZW5zUnVsZU5GQSgpIHsKKyAgICAgICAgaW50IGFsdE51bSA9IDE7CisgICAgICAgIE5GQVN0YXRlIGZpcnN0QWx0ID0gbnVsbDsgLy8gdGhlIHN0YXJ0IHN0YXRlIGZvciB0aGUgInJ1bGUiCisgICAgICAgIE5GQVN0YXRlIHByZXZBbHRlcm5hdGl2ZSA9IG51bGw7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBuZmEuZ3JhbW1hci5nZXRSdWxlcygpLml0ZXJhdG9yKCk7CisJCS8vIFRPRE86IGFkZCBhIHNpbmdsZSBkZWNpc2lvbiBub2RlL3N0YXRlIGZvciBnb29kIGRlc2NyaXB0aW9uCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJUnVsZSByID0gKFJ1bGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHJ1bGVOYW1lID0gci5uYW1lOworCQkJU3RyaW5nIG1vZGlmaWVyID0gbmZhLmdyYW1tYXIuZ2V0UnVsZU1vZGlmaWVyKHJ1bGVOYW1lKTsKKyAgICAgICAgICAgIGlmICggcnVsZU5hbWUuZXF1YWxzKEdyYW1tYXIuQVJUSUZJQ0lBTF9UT0tFTlNfUlVMRU5BTUUpIHx8CisJCQkJIChtb2RpZmllciE9bnVsbCAmJgorCQkJCSAgbW9kaWZpZXIuZXF1YWxzKEdyYW1tYXIuRlJBR01FTlRfUlVMRV9NT0RJRklFUikpICkKKwkJCXsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgbG9vcCB0byB5b3Vyc2VsZiBvciBkbyBub250b2tlbiBydWxlcworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkZBU3RhdGUgcnVsZVN0YXJ0U3RhdGUgPSBuZmEuZ3JhbW1hci5nZXRSdWxlU3RhcnRTdGF0ZShydWxlTmFtZSk7CisgICAgICAgICAgICBORkFTdGF0ZSBsZWZ0ID0gbmV3U3RhdGUoKTsKKyAgICAgICAgICAgIGxlZnQuc2V0RGVzY3JpcHRpb24oImFsdCAiK2FsdE51bSsiIG9mIGFydGlmaWNpYWwgcnVsZSAiK0dyYW1tYXIuQVJUSUZJQ0lBTF9UT0tFTlNfUlVMRU5BTUUpOworICAgICAgICAgICAgdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMobGVmdCwgcnVsZVN0YXJ0U3RhdGUsIExhYmVsLkVQU0lMT04pOworICAgICAgICAgICAgLy8gQXJlIHdlIHRoZSBmaXJzdCBhbHRlcm5hdGl2ZT8KKyAgICAgICAgICAgIGlmICggZmlyc3RBbHQ9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgZmlyc3RBbHQgPSBsZWZ0OyAvLyB0cmFjayBleHRyZW1lIHRvcCBsZWZ0IG5vZGUgYXMgcnVsZSBzdGFydAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbm90IGZpcnN0IGFsdGVybmF0aXZlLCBtdXN0IGxpbmsgdG8gdGhpcyBhbHQgZnJvbSBwcmV2aW91cworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25CZXR3ZWVuU3RhdGVzKHByZXZBbHRlcm5hdGl2ZSwgbGVmdCwgTGFiZWwuRVBTSUxPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2QWx0ZXJuYXRpdmUgPSBsZWZ0OworICAgICAgICAgICAgYWx0TnVtKys7CisgICAgICAgIH0KKwkJZmlyc3RBbHQuZGVjaXNpb25TdGF0ZVR5cGUgPSBORkFTdGF0ZS5CTE9DS19TVEFSVDsKKworICAgICAgICByZXR1cm4gZmlyc3RBbHQ7CisgICAgfQorCSAqLworCisgICAgLyoqIEJ1aWxkIGFuIGF0b20gd2l0aCBhbGwgcG9zc2libGUgdmFsdWVzIGluIGl0cyBsYWJlbCAqLworICAgIHB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfV2lsZGNhcmQoR3JhbW1hckFTVCBhc3NvY2lhdGVkQVNUKSB7CisgICAgICAgIE5GQVN0YXRlIGxlZnQgPSBuZXdTdGF0ZSgpOworICAgICAgICBORkFTdGF0ZSByaWdodCA9IG5ld1N0YXRlKCk7CisgICAgICAgIGxlZnQuYXNzb2NpYXRlZEFTVE5vZGUgPSBhc3NvY2lhdGVkQVNUOworICAgICAgICByaWdodC5hc3NvY2lhdGVkQVNUTm9kZSA9IGFzc29jaWF0ZWRBU1Q7CisgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKG5mYS5ncmFtbWFyLmdldFRva2VuVHlwZXMoKSk7IC8vIGNoYXIgb3IgdG9rZW5zCisgICAgICAgIFRyYW5zaXRpb24gZSA9IG5ldyBUcmFuc2l0aW9uKGxhYmVsLHJpZ2h0KTsKKyAgICAgICAgbGVmdC5hZGRUcmFuc2l0aW9uKGUpOworICAgICAgICBTdGF0ZUNsdXN0ZXIgZyA9IG5ldyBTdGF0ZUNsdXN0ZXIobGVmdCwgcmlnaHQpOworICAgICAgICByZXR1cm4gZzsKKyAgICB9CisKKyAgICAvKiogQnVpbGQgYSBzdWJydWxlIG1hdGNoaW5nIF4oLiAuKikgKGFueSB0cmVlIG9yIG5vZGUpLiBMZXQncyB1c2UKKyAgICAgKiAgKF4oLiAuKykgfCAuKSB0byBiZSBzYWZlLgorICAgICAqLworICAgIHB1YmxpYyBTdGF0ZUNsdXN0ZXIgYnVpbGRfV2lsZGNhcmRUcmVlKEdyYW1tYXJBU1QgYXNzb2NpYXRlZEFTVCkgeworICAgICAgICBTdGF0ZUNsdXN0ZXIgd2lsZFJvb3QgPSBidWlsZF9XaWxkY2FyZChhc3NvY2lhdGVkQVNUKTsKKworICAgICAgICBTdGF0ZUNsdXN0ZXIgZG93biA9IGJ1aWxkX0F0b20oTGFiZWwuRE9XTiwgYXNzb2NpYXRlZEFTVCk7CisgICAgICAgIHdpbGRSb290ID0gYnVpbGRfQUIod2lsZFJvb3QsZG93bik7IC8vIGhvb2sgaW47IC4gRE9XTgorCisgICAgICAgIC8vIG1ha2UgLisKKyAgICAgICAgU3RhdGVDbHVzdGVyIHdpbGRDaGlsZHJlbiA9IGJ1aWxkX1dpbGRjYXJkKGFzc29jaWF0ZWRBU1QpOworICAgICAgICB3aWxkQ2hpbGRyZW4gPSBidWlsZF9BcGx1cyh3aWxkQ2hpbGRyZW4pOworICAgICAgICB3aWxkUm9vdCA9IGJ1aWxkX0FCKHdpbGRSb290LHdpbGRDaGlsZHJlbik7IC8vIGhvb2sgaW47IC4gRE9XTiAuKworCisgICAgICAgIFN0YXRlQ2x1c3RlciB1cCA9IGJ1aWxkX0F0b20oTGFiZWwuVVAsIGFzc29jaWF0ZWRBU1QpOworICAgICAgICB3aWxkUm9vdCA9IGJ1aWxkX0FCKHdpbGRSb290LHVwKTsgLy8gaG9vayBpbjsgLiBET1dOIC4rIFVQCisKKyAgICAgICAgLy8gbWFrZSBvcHRpb25hbCAuIGFsdAorICAgICAgICBTdGF0ZUNsdXN0ZXIgb3B0aW9uYWxOb2RlQWx0ID0gYnVpbGRfV2lsZGNhcmQoYXNzb2NpYXRlZEFTVCk7CisKKyAgICAgICAgTGlzdCBhbHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBhbHRzLmFkZCh3aWxkUm9vdCk7CisgICAgICAgIGFsdHMuYWRkKG9wdGlvbmFsTm9kZUFsdCk7CisgICAgICAgIFN0YXRlQ2x1c3RlciBibGsgPSBidWlsZF9BbHRlcm5hdGl2ZUJsb2NrKGFsdHMpOworCisgICAgICAgIHJldHVybiBibGs7CisgICAgfQorCisgICAgLyoqIEdpdmVuIGEgY29sbGFwc2VkIGJsb2NrIG9mIGFsdHMgKGEgc2V0IG9mIGF0b21zKSwgcHVsbCBvdXQKKyAgICAgKiAgdGhlIHNldCBhbmQgcmV0dXJuIGl0LgorICAgICAqLworICAgIHByb3RlY3RlZCBJbnRTZXQgZ2V0Q29sbGFwc2VkQmxvY2tBc1NldChTdGF0ZSBibGspIHsKKyAgICAgICAgU3RhdGUgczAgPSBibGs7CisgICAgICAgIGlmICggczAhPW51bGwgJiYgczAudHJhbnNpdGlvbigwKSE9bnVsbCApIHsKKyAgICAgICAgICAgIFN0YXRlIHMxID0gczAudHJhbnNpdGlvbigwKS50YXJnZXQ7CisgICAgICAgICAgICBpZiAoIHMxIT1udWxsICYmIHMxLnRyYW5zaXRpb24oMCkhPW51bGwgKSB7CisgICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBzMS50cmFuc2l0aW9uKDApLmxhYmVsOworICAgICAgICAgICAgICAgIGlmICggbGFiZWwuaXNTZXQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLmdldFNldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKwlwcml2YXRlIHZvaWQgdHJhbnNpdGlvbkJldHdlZW5TdGF0ZXMoTkZBU3RhdGUgYSwgTkZBU3RhdGUgYiwgaW50IGxhYmVsKSB7CisJCVRyYW5zaXRpb24gZSA9IG5ldyBUcmFuc2l0aW9uKGxhYmVsLGIpOworCQlhLmFkZFRyYW5zaXRpb24oZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9OYW1lU3BhY2VDaGVja2VyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL05hbWVTcGFjZUNoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZkYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9OYW1lU3BhY2VDaGVja2VyLmphdmEKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudG9vbDsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5MYWJlbDsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgTmFtZVNwYWNlQ2hlY2tlciB7CisJcHJvdGVjdGVkIEdyYW1tYXIgZ3JhbW1hcjsKKworCXB1YmxpYyBOYW1lU3BhY2VDaGVja2VyKEdyYW1tYXIgZ3JhbW1hcikgeworCQl0aGlzLmdyYW1tYXIgPSBncmFtbWFyOworCX0KKworCXB1YmxpYyB2b2lkIGNoZWNrQ29uZmxpY3RzKCkgeworCQlmb3IgKGludCBpID0gQ29tcG9zaXRlR3JhbW1hci5NSU5fUlVMRV9JTkRFWDsgaSA8IGdyYW1tYXIuY29tcG9zaXRlLnJ1bGVJbmRleFRvUnVsZUxpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCVJ1bGUgciA9IGdyYW1tYXIuY29tcG9zaXRlLnJ1bGVJbmRleFRvUnVsZUxpc3QuZWxlbWVudEF0KGkpOworCQkJaWYgKCByPT1udWxsICkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gd2FsayBhbGwgbGFiZWxzIGZvciBSdWxlIHIKKwkJCWlmICggci5sYWJlbE5hbWVTcGFjZSE9bnVsbCApIHsKKwkJCQlJdGVyYXRvciBpdCA9IHIubGFiZWxOYW1lU3BhY2UudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoIGl0Lmhhc05leHQoKSApIHsKKwkJCQkJR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIHBhaXIgPSAoR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyKSBpdC5uZXh0KCk7CisJCQkJCWNoZWNrRm9yTGFiZWxDb25mbGljdChyLCBwYWlyLmxhYmVsKTsKKwkJCQl9CisJCQl9CisJCQkvLyB3YWxrIHJ1bGUgc2NvcGUgYXR0cmlidXRlcyBmb3IgUnVsZSByCisJCQlpZiAoIHIucnVsZVNjb3BlIT1udWxsICkgeworCQkJCUxpc3QgYXR0cmlidXRlcyA9IHIucnVsZVNjb3BlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBqKyspIHsKKwkJCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGopOworCQkJCQljaGVja0ZvclJ1bGVTY29wZUF0dHJpYnV0ZUNvbmZsaWN0KHIsIGF0dHJpYnV0ZSk7CisJCQkJfQorCQkJfQorCQkJY2hlY2tGb3JSdWxlRGVmaW5pdGlvblByb2JsZW1zKHIpOworCQkJY2hlY2tGb3JSdWxlQXJndW1lbnRBbmRSZXR1cm5WYWx1ZUNvbmZsaWN0cyhyKTsKKwkJfQorCQkvLyBjaGVjayBhbGwgZ2xvYmFsIHNjb3BlcyBhZ2FpbnN0IHRva2VucworCQlJdGVyYXRvciBpdCA9IGdyYW1tYXIuZ2V0R2xvYmFsU2NvcGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJQXR0cmlidXRlU2NvcGUgc2NvcGUgPSAoQXR0cmlidXRlU2NvcGUpIGl0Lm5leHQoKTsKKwkJCWNoZWNrRm9yR2xvYmFsU2NvcGVUb2tlbkNvbmZsaWN0KHNjb3BlKTsKKwkJfQorCQkvLyBjaGVjayBmb3IgbWlzc2luZyBydWxlLCB0b2tlbnMKKwkJbG9va0ZvclJlZmVyZW5jZXNUb1VuZGVmaW5lZFN5bWJvbHMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvclJ1bGVBcmd1bWVudEFuZFJldHVyblZhbHVlQ29uZmxpY3RzKFJ1bGUgcikgeworCQlpZiAoIHIucmV0dXJuU2NvcGUhPW51bGwgKSB7CisJCQlTZXQgY29uZmxpY3RpbmdLZXlzID0gci5yZXR1cm5TY29wZS5pbnRlcnNlY3Rpb24oci5wYXJhbWV0ZXJTY29wZSk7CisJCQlpZiAoY29uZmxpY3RpbmdLZXlzIT1udWxsKSB7CisJCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZsaWN0aW5nS2V5cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJCQlFcnJvck1hbmFnZXIuTVNHX0FSR19SRVRWQUxfQ09ORkxJQ1QsCisJCQkJCQlncmFtbWFyLAorCQkJCQkJci50cmVlLmdldFRva2VuKCksCisJCQkJCQlrZXksCisJCQkJCQlyLm5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yUnVsZURlZmluaXRpb25Qcm9ibGVtcyhSdWxlIHIpIHsKKwkJU3RyaW5nIHJ1bGVOYW1lID0gci5uYW1lOworCQlUb2tlbiBydWxlVG9rZW4gPSByLnRyZWUuZ2V0VG9rZW4oKTsKKwkJaW50IG1zZ0lEID0gMDsKKwkJaWYgKCAoZ3JhbW1hci50eXBlPT1HcmFtbWFyLlBBUlNFUnx8Z3JhbW1hci50eXBlPT1HcmFtbWFyLlRSRUVfUEFSU0VSKSAmJgorCQkJIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShydWxlTmFtZS5jaGFyQXQoMCkpICkKKwkJeworCQkJbXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0xFWEVSX1JVTEVTX05PVF9BTExPV0VEOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBncmFtbWFyLnR5cGU9PUdyYW1tYXIuTEVYRVIgJiYKKwkJCSAgICAgIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShydWxlTmFtZS5jaGFyQXQoMCkpICYmCisJCQkgICAgICAhci5pc1N5blByZWQgKQorCQl7CisJCQltc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfUEFSU0VSX1JVTEVTX05PVF9BTExPV0VEOworICAgICAgICB9CisJCWVsc2UgaWYgKCBncmFtbWFyLmdldEdsb2JhbFNjb3BlKHJ1bGVOYW1lKSE9bnVsbCApIHsKKwkJCW1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19TWU1CT0xfQ09ORkxJQ1RTX1dJVEhfR0xPQkFMX1NDT1BFOworCQl9CisJCWlmICggbXNnSUQhPTAgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKG1zZ0lELCBncmFtbWFyLCBydWxlVG9rZW4sIHJ1bGVOYW1lKTsKKwkJfQorCX0KKworCS8qKiBJZiByZWYgdG8gdW5kZWZpbmVkIHJ1bGUsIGdpdmUgZXJyb3IgYXQgZmlyc3Qgb2NjdXJyZW5jZS4KKwkgKiAKKwkgKiAgR2l2ZSBlcnJvciBpZiB5b3UgY2Fubm90IGZpbmQgdGhlIHNjb3BlIG92ZXJyaWRlIG9uIGEgcnVsZSByZWZlcmVuY2UuCisJICoKKwkgKiAgSWYgeW91IHJlZiBJRCBpbiBhIGNvbWJpbmVkIGdyYW1tYXIgYW5kIGRvbid0IGRlZmluZSBJRCBhcyBhIGxleGVyIHJ1bGUKKwkgKiAgaXQgaXMgYW4gZXJyb3IuCisJICovCisJcHJvdGVjdGVkIHZvaWQgbG9va0ZvclJlZmVyZW5jZXNUb1VuZGVmaW5lZFN5bWJvbHMoKSB7CisJCS8vIGZvciBlYWNoIHJ1bGUgcmVmLCBhc2sgaWYgdGhlcmUgaXMgYSBydWxlIGRlZmluaXRpb24KKwkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JhbW1hci5ydWxlUmVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCUdyYW1tYXJBU1QgcmVmQVNUID0gKEdyYW1tYXJBU1QpaXRlci5uZXh0KCk7CisJCQlUb2tlbiB0b2sgPSByZWZBU1QudG9rZW47CisJCQlTdHJpbmcgcnVsZU5hbWUgPSB0b2suZ2V0VGV4dCgpOworCQkJUnVsZSBsb2NhbFJ1bGUgPSBncmFtbWFyLmdldExvY2FsbHlEZWZpbmVkUnVsZShydWxlTmFtZSk7CisJCQlSdWxlIHJ1bGUgPSBncmFtbWFyLmdldFJ1bGUocnVsZU5hbWUpOworCQkJaWYgKCBsb2NhbFJ1bGU9PW51bGwgJiYgcnVsZSE9bnVsbCApIHsgLy8gaW1wb3J0ZWQgcnVsZT8KKwkJCQlncmFtbWFyLmRlbGVnYXRlZFJ1bGVSZWZlcmVuY2VzLmFkZChydWxlKTsKKwkJCQlydWxlLmltcG9ydGVkID0gdHJ1ZTsKKwkJCX0KKwkJCWlmICggcnVsZT09bnVsbCAmJiBncmFtbWFyLmdldFRva2VuVHlwZShydWxlTmFtZSkhPUxhYmVsLkVPRiApIHsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfVU5ERUZJTkVEX1JVTEVfUkVGLAorCQkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCQkgIHRvaywKKwkJCQkJCQkJCQkgIHJ1bGVOYW1lKTsKKwkJCX0KKyAgICAgICAgfQorCQlpZiAoIGdyYW1tYXIudHlwZT09R3JhbW1hci5DT01CSU5FRCApIHsKKwkJCS8vIGlmIHdlJ3JlIGEgY29tYmluZWQgZ3JhbW1hciwgd2Uga25vdyB3aGljaCB0b2tlbiBJRHMgaGF2ZSBubworCQkJLy8gYXNzb2NpYXRlZCBsZXhlciBydWxlLgorCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JhbW1hci50b2tlbklEUmVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCQlUb2tlbiB0b2sgPSAoVG9rZW4pIGl0ZXIubmV4dCgpOworCQkJCVN0cmluZyB0b2tlbklEID0gdG9rLmdldFRleHQoKTsKKwkJCQlpZiAoICFncmFtbWFyLmNvbXBvc2l0ZS5sZXhlclJ1bGVzLmNvbnRhaW5zKHRva2VuSUQpICYmCisJCQkJCSBncmFtbWFyLmdldFRva2VuVHlwZSh0b2tlbklEKSE9TGFiZWwuRU9GICkKKwkJCQl7CisJCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyV2FybmluZyhFcnJvck1hbmFnZXIuTVNHX05PX1RPS0VOX0RFRklOSVRJT04sCisJCQkJCQkJCQkJCQlncmFtbWFyLAorCQkJCQkJCQkJCQkJdG9rLAorCQkJCQkJCQkJCQkJdG9rZW5JRCk7CisJCQkJfQorCQkJfQorCQl9CisJCS8vIGNoZWNrIHNjb3BlcyBhbmQgc2NvcGVkIHJ1bGUgcmVmcworCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ3JhbW1hci5zY29wZWRSdWxlUmVmcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlHcmFtbWFyQVNUIHNjb3BlQVNUID0gKEdyYW1tYXJBU1QpaXQubmV4dCgpOyAvLyBeKERPVCBJRCBhdG9tKQorCQkJR3JhbW1hciBzY29wZUcgPSBncmFtbWFyLmNvbXBvc2l0ZS5nZXRHcmFtbWFyKHNjb3BlQVNULmdldFRleHQoKSk7CisJCQlHcmFtbWFyQVNUIHJlZkFTVCA9IChHcmFtbWFyQVNUKXNjb3BlQVNULmdldENoaWxkKDEpOworCQkJU3RyaW5nIHJ1bGVOYW1lID0gcmVmQVNULmdldFRleHQoKTsKKwkJCWlmICggc2NvcGVHPT1udWxsICkgeworCQkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19OT19TVUNIX0dSQU1NQVJfU0NPUEUsCisJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCSAgc2NvcGVBU1QuZ2V0VG9rZW4oKSwKKwkJCQkJCQkJCQkgIHNjb3BlQVNULmdldFRleHQoKSwKKwkJCQkJCQkJCQkgIHJ1bGVOYW1lKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVJ1bGUgcnVsZSA9IGdyYW1tYXIuZ2V0UnVsZShzY29wZUcubmFtZSwgcnVsZU5hbWUpOworCQkJCWlmICggcnVsZT09bnVsbCApIHsKKwkJCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihFcnJvck1hbmFnZXIuTVNHX05PX1NVQ0hfUlVMRV9JTl9TQ09QRSwKKwkJCQkJCQkJCQkJICBncmFtbWFyLAorCQkJCQkJCQkJCQkgIHNjb3BlQVNULmdldFRva2VuKCksCisJCQkJCQkJCQkJCSAgc2NvcGVBU1QuZ2V0VGV4dCgpLAorCQkJCQkJCQkJCQkgIHJ1bGVOYW1lKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0Zvckdsb2JhbFNjb3BlVG9rZW5Db25mbGljdChBdHRyaWJ1dGVTY29wZSBzY29wZSkgeworCQlpZiAoIGdyYW1tYXIuZ2V0VG9rZW5UeXBlKHNjb3BlLmdldE5hbWUoKSkhPUxhYmVsLklOVkFMSUQgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKEVycm9yTWFuYWdlci5NU0dfU1lNQk9MX0NPTkZMSUNUU19XSVRIX0dMT0JBTF9TQ09QRSwKKwkJCQkJCQkJCSAgZ3JhbW1hciwgbnVsbCwgc2NvcGUuZ2V0TmFtZSgpKTsKKwkJfQorCX0KKworCS8qKiBDaGVjayBmb3IgY29sbGlzaW9uIG9mIGEgcnVsZS1zY29wZSBkeW5hbWljIGF0dHJpYnV0ZSB3aXRoOgorCSAqICBhcmcsIHJldHVybiB2YWx1ZSwgcnVsZSBuYW1lIGl0c2VsZi4gIExhYmVscyBhcmUgY2hlY2tlZCBlbHNld2hlcmUuCisJICovCisJcHVibGljIHZvaWQgY2hlY2tGb3JSdWxlU2NvcGVBdHRyaWJ1dGVDb25mbGljdChSdWxlIHIsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJaW50IG1zZ0lEID0gMDsKKwkJT2JqZWN0IGFyZzIgPSBudWxsOworCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGUubmFtZTsKKwkJaWYgKCByLm5hbWUuZXF1YWxzKGF0dHJOYW1lKSApIHsKKwkJCW1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19BVFRSSUJVVEVfQ09ORkxJQ1RTX1dJVEhfUlVMRTsKKwkJCWFyZzIgPSByLm5hbWU7CisJCX0KKwkJZWxzZSBpZiAoIChyLnJldHVyblNjb3BlIT1udWxsJiZyLnJldHVyblNjb3BlLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkhPW51bGwpIHx8CisJCQkJICAoci5wYXJhbWV0ZXJTY29wZSE9bnVsbCYmci5wYXJhbWV0ZXJTY29wZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpIT1udWxsKSApCisJCXsKKwkJCW1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19BVFRSSUJVVEVfQ09ORkxJQ1RTX1dJVEhfUlVMRV9BUkdfUkVUVkFMOworCQkJYXJnMiA9IHIubmFtZTsKKwkJfQorCQlpZiAoIG1zZ0lEIT0wICkgeworCQkJRXJyb3JNYW5hZ2VyLmdyYW1tYXJFcnJvcihtc2dJRCxncmFtbWFyLHIudHJlZS5nZXRUb2tlbigpLGF0dHJOYW1lLGFyZzIpOworCQl9CisJfQorCisJLyoqIE1ha2Ugc3VyZSBhIGxhYmVsIGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBhbm90aGVyIHN5bWJvbC4KKwkgKiAgTGFiZWxzIG11c3Qgbm90IGNvbmZsaWN0IHdpdGg6IHJ1bGVzLCB0b2tlbnMsIHNjb3BlIG5hbWVzLAorCSAqICByZXR1cm4gdmFsdWVzLCBwYXJhbWV0ZXJzLCBhbmQgcnVsZS1zY29wZSBkeW5hbWljIGF0dHJpYnV0ZXMKKwkgKiAgZGVmaW5lZCBpbiBzdXJyb3VuZGluZyBydWxlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrRm9yTGFiZWxDb25mbGljdChSdWxlIHIsIFRva2VuIGxhYmVsKSB7CisJCWludCBtc2dJRCA9IDA7CisJCU9iamVjdCBhcmcyID0gbnVsbDsKKwkJaWYgKCBncmFtbWFyLmdldEdsb2JhbFNjb3BlKGxhYmVsLmdldFRleHQoKSkhPW51bGwgKSB7CisJCQltc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfU1lNQk9MX0NPTkZMSUNUU19XSVRIX0dMT0JBTF9TQ09QRTsKKwkJfQorCQllbHNlIGlmICggZ3JhbW1hci5nZXRSdWxlKGxhYmVsLmdldFRleHQoKSkhPW51bGwgKSB7CisJCQltc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfQ09ORkxJQ1RTX1dJVEhfUlVMRTsKKwkJfQorCQllbHNlIGlmICggZ3JhbW1hci5nZXRUb2tlblR5cGUobGFiZWwuZ2V0VGV4dCgpKSE9TGFiZWwuSU5WQUxJRCApIHsKKwkJCW1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MQUJFTF9DT05GTElDVFNfV0lUSF9UT0tFTjsKKwkJfQorCQllbHNlIGlmICggci5ydWxlU2NvcGUhPW51bGwgJiYgci5ydWxlU2NvcGUuZ2V0QXR0cmlidXRlKGxhYmVsLmdldFRleHQoKSkhPW51bGwgKSB7CisJCQltc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfQ09ORkxJQ1RTX1dJVEhfUlVMRV9TQ09QRV9BVFRSSUJVVEU7CisJCQlhcmcyID0gci5uYW1lOworCQl9CisJCWVsc2UgaWYgKCAoci5yZXR1cm5TY29wZSE9bnVsbCYmci5yZXR1cm5TY29wZS5nZXRBdHRyaWJ1dGUobGFiZWwuZ2V0VGV4dCgpKSE9bnVsbCkgfHwKKwkJCQkgIChyLnBhcmFtZXRlclNjb3BlIT1udWxsJiZyLnBhcmFtZXRlclNjb3BlLmdldEF0dHJpYnV0ZShsYWJlbC5nZXRUZXh0KCkpIT1udWxsKSApCisJCXsKKwkJCW1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MQUJFTF9DT05GTElDVFNfV0lUSF9SVUxFX0FSR19SRVRWQUw7CisJCQlhcmcyID0gci5uYW1lOworCQl9CisJCWlmICggbXNnSUQhPTAgKSB7CisJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKG1zZ0lELGdyYW1tYXIsbGFiZWwsbGFiZWwuZ2V0VGV4dCgpLGFyZzIpOworCQl9CisJfQorCisJLyoqIElmIHR5cGUgb2YgcHJldmlvdXMgbGFiZWwgZGlmZmVycyBmcm9tIG5ldyBsYWJlbCdzIHR5cGUsIHRoYXQncyBhbiBlcnJvci4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjaGVja0ZvckxhYmVsVHlwZU1pc21hdGNoKFJ1bGUgciwgVG9rZW4gbGFiZWwsIGludCB0eXBlKSB7CisJCUdyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBwcmV2TGFiZWxQYWlyID0KKwkJCShHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIpci5sYWJlbE5hbWVTcGFjZS5nZXQobGFiZWwuZ2V0VGV4dCgpKTsKKwkJaWYgKCBwcmV2TGFiZWxQYWlyIT1udWxsICkgeworCQkJLy8gbGFiZWwgYWxyZWFkeSBkZWZpbmVkOyBpZiBzYW1lIHR5cGUsIG5vIHByb2JsZW0KKwkJCWlmICggcHJldkxhYmVsUGFpci50eXBlICE9IHR5cGUgKSB7CisJCQkJU3RyaW5nIHR5cGVNaXNtYXRjaEV4cHIgPQorCQkJCQlHcmFtbWFyLkxhYmVsVHlwZVRvU3RyaW5nW3R5cGVdKyIhPSIrCisJCQkJCUdyYW1tYXIuTGFiZWxUeXBlVG9TdHJpbmdbcHJldkxhYmVsUGFpci50eXBlXTsKKwkJCQlFcnJvck1hbmFnZXIuZ3JhbW1hckVycm9yKAorCQkJCQlFcnJvck1hbmFnZXIuTVNHX0xBQkVMX1RZUEVfQ09ORkxJQ1QsCisJCQkJCWdyYW1tYXIsCisJCQkJCWxhYmVsLAorCQkJCQlsYWJlbC5nZXRUZXh0KCksCisJCQkJCXR5cGVNaXNtYXRjaEV4cHIpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL05vblJlZ3VsYXJEZWNpc2lvbk1lc3NhZ2UuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvTm9uUmVndWxhckRlY2lzaW9uTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWY5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL05vblJlZ3VsYXJEZWNpc2lvbk1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuRGVjaXNpb25Qcm9iZTsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKiogTW9yZSBhIHNpbmdsZSBhbHRlcm5hdGl2ZSByZWN1cnNlcyBzbyB0aGlzIGRlY2lzaW9uIGlzIG5vdCByZWd1bGFyLiAqLworcHVibGljIGNsYXNzIE5vblJlZ3VsYXJEZWNpc2lvbk1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgRGVjaXNpb25Qcm9iZSBwcm9iZTsKKwlwdWJsaWMgU2V0PEludGVnZXI+IGFsdHNXaXRoUmVjdXJzaW9uOworCisJcHVibGljIE5vblJlZ3VsYXJEZWNpc2lvbk1lc3NhZ2UoRGVjaXNpb25Qcm9iZSBwcm9iZSwgU2V0PEludGVnZXI+IGFsdHNXaXRoUmVjdXJzaW9uKSB7CisJCXN1cGVyKEVycm9yTWFuYWdlci5NU0dfTk9OUkVHVUxBUl9ERUNJU0lPTik7CisJCXRoaXMucHJvYmUgPSBwcm9iZTsKKwkJdGhpcy5hbHRzV2l0aFJlY3Vyc2lvbiA9IGFsdHNXaXRoUmVjdXJzaW9uOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCUdyYW1tYXJBU1QgZGVjaXNpb25BU1ROb2RlID0gcHJvYmUuZGZhLmdldERlY2lzaW9uQVNUTm9kZSgpOworCQlsaW5lID0gZGVjaXNpb25BU1ROb2RlLmdldExpbmUoKTsKKwkJY29sdW1uID0gZGVjaXNpb25BU1ROb2RlLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSBwcm9iZS5kZmEubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKTsKKwkJaWYgKCBmaWxlTmFtZSE9bnVsbCApIHsKKwkJCWZpbGUgPSBmaWxlTmFtZTsKKwkJfQorCisJCVNUIHN0ID0gZ2V0TWVzc2FnZVRlbXBsYXRlKCk7CisJCVN0cmluZyBydWxlTmFtZSA9IHByb2JlLmRmYS5nZXRORkFEZWNpc2lvblN0YXJ0U3RhdGUoKS5lbmNsb3NpbmdSdWxlLm5hbWU7CisJCXN0LmFkZCgicnVsZU5hbWUiLCBydWxlTmFtZSk7CisJCUxpc3Qgc29ydGVkQWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJc29ydGVkQWx0cy5hZGRBbGwoYWx0c1dpdGhSZWN1cnNpb24pOworCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEFsdHMpOyAvLyBtYWtlIHN1cmUgaXQncyAxLCAyLCAuLi4KKwkJc3QuYWRkKCJhbHRzIiwgc29ydGVkQWx0cyk7CisKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKHN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvUmFuZG9tUGhyYXNlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL1JhbmRvbVBocmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjYwODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL1JhbmRvbVBocmFzZS5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuVG9vbDsKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuTGFiZWw7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLk5GQVN0YXRlOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5SdWxlQ2xvc3VyZVRyYW5zaXRpb247CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLlRyYW5zaXRpb247CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuSW50ZXJ2YWxTZXQ7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuVXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisvKiogR2VuZXJhdGUgYSByYW5kb20gcGhyYXNlIGdpdmVuIGEgZ3JhbW1hci4KKyAqICBVc2FnZToKKyAqICAgICBqYXZhIG9yZy5hbnRsci50b29sLlJhbmRvbVBocmFzZSBncmFtbWFyRmlsZS5nIHN0YXJ0UnVsZSBbc2VlZF0KKyAqCisgKiAgRm9yIGV4YW1wbGU6CisgKiAgICAgamF2YSBvcmcuYW50bHIudG9vbC5SYW5kb21QaHJhc2Ugc2ltcGxlLmcgcHJvZ3JhbSAzNDIKKyAqCisgKiAgVGhlIHNlZWQgYWN0cyBsaWtlIGEgdW5pcXVlIGlkZW50aWZpZXIgc28geW91IGNhbiBnZXQgdGhlIHNhbWUgcmFuZG9tCisgKiAgcGhyYXNlIGJhY2sgZHVyaW5nIHVuaXQgdGVzdGluZywgZm9yIGV4YW1wbGUuCisgKgorICogIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHNlZWQgdGhlbiB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcyBpcyB1c2VkCisgKiAgZ3VhcmFudGVlaW5nIHRoYXQgeW91J2xsIG5ldmVyIHNlZSB0aGF0IHNlZWQgYWdhaW4uCisgKgorICogIE5PVEU6IHRoaXMgZG9lcyBub3Qgd29yayB3ZWxsIGZvciBsYXJnZSBncmFtbWFycy4uLml0IHRlbmRzIHRvIHJlY3Vyc2UKKyAqICB0b28gbXVjaCBhbmQgYnVpbGQgcmVhbGx5IGxvbmcgc3RyaW5ncy4gIEkgbmVlZCB0aHJvdHRsZSBjb250cm9sOyBsYXRlci4KKyAqLworcHVibGljIGNsYXNzIFJhbmRvbVBocmFzZSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFJhbmRvbSByYW5kb207CisKKwkvKiogYW4gZXhwZXJpbWVudGFsIG1ldGhvZCB0byBnZW5lcmF0ZSByYW5kb20gcGhyYXNlcyBmb3IgYSBnaXZlbgorCSAqICBncmFtbWFyIGdpdmVuIGEgc3RhcnQgcnVsZS4gIFJldHVybiBhIGxpc3Qgb2YgdG9rZW4gdHlwZXMuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJhbmRvbVBocmFzZShHcmFtbWFyIGcsIExpc3Q8SW50ZWdlcj4gdG9rZW5UeXBlcywgU3RyaW5nIHN0YXJ0UnVsZSkgeworCQlORkFTdGF0ZSBzdGF0ZSA9IGcuZ2V0UnVsZVN0YXJ0U3RhdGUoc3RhcnRSdWxlKTsKKwkJTkZBU3RhdGUgc3RvcFN0YXRlID0gZy5nZXRSdWxlU3RvcFN0YXRlKHN0YXJ0UnVsZSk7CisKKwkJU3RhY2sgcnVsZUludm9jYXRpb25TdGFjayA9IG5ldyBTdGFjaygpOworCQl3aGlsZSAoIHRydWUgKSB7CisJCQlpZiAoIHN0YXRlPT1zdG9wU3RhdGUgJiYgcnVsZUludm9jYXRpb25TdGFjay5zaXplKCk9PTAgKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIGRlYnVnICkgU3lzdGVtLm91dC5wcmludGxuKCJzdGF0ZSAiK3N0YXRlKTsKKwkJCWlmICggc3RhdGUuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpPT0wICkgeworCQkJCWlmICggZGVidWcgKSBTeXN0ZW0ub3V0LnByaW50bG4oImRhbmdsaW5nIHN0YXRlOiAiK3N0YXRlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBlbmQgb2YgcnVsZSBub2RlCisJCQlpZiAoIHN0YXRlLmlzQWNjZXB0U3RhdGUoKSApIHsKKwkJCQlORkFTdGF0ZSBpbnZva2luZ1N0YXRlID0gKE5GQVN0YXRlKXJ1bGVJbnZvY2F0aW9uU3RhY2sucG9wKCk7CisJCQkJaWYgKCBkZWJ1ZyApIFN5c3RlbS5vdXQucHJpbnRsbigicG9wIGludm9raW5nIHN0YXRlICIraW52b2tpbmdTdGF0ZSk7CisJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxlYXZlICIrc3RhdGUuZW5jbG9zaW5nUnVsZS5uYW1lKTsKKwkJCQlSdWxlQ2xvc3VyZVRyYW5zaXRpb24gaW52b2tpbmdUcmFuc2l0aW9uID0KKwkJCQkJKFJ1bGVDbG9zdXJlVHJhbnNpdGlvbilpbnZva2luZ1N0YXRlLnRyYW5zaXRpb25bMF07CisJCQkJLy8gbW92ZSB0byBub2RlIGFmdGVyIHN0YXRlIHRoYXQgaW52b2tlZCB0aGlzIHJ1bGUKKwkJCQlzdGF0ZSA9IGludm9raW5nVHJhbnNpdGlvbi5mb2xsb3dTdGF0ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICggc3RhdGUuZ2V0TnVtYmVyT2ZUcmFuc2l0aW9ucygpPT0xICkgeworCQkJCS8vIG5vIGJyYW5jaGluZywganVzdCB0YWtlIHRoaXMgcGF0aAorCQkJCVRyYW5zaXRpb24gdDAgPSBzdGF0ZS50cmFuc2l0aW9uWzBdOworCQkJCWlmICggdDAgaW5zdGFuY2VvZiBSdWxlQ2xvc3VyZVRyYW5zaXRpb24gKSB7CisJCQkJCXJ1bGVJbnZvY2F0aW9uU3RhY2sucHVzaChzdGF0ZSk7CisJCQkJCWlmICggZGVidWcgKSBTeXN0ZW0ub3V0LnByaW50bG4oInB1c2ggc3RhdGUgIitzdGF0ZSk7CisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYWxsICIrKChSdWxlQ2xvc3VyZVRyYW5zaXRpb24pdDApLnJ1bGUubmFtZSk7CisJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzdGFjayBkZXB0aD0iK3J1bGVJbnZvY2F0aW9uU3RhY2suc2l6ZSgpKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoIHQwLmxhYmVsLmlzU2V0KCkgfHwgdDAubGFiZWwuaXNBdG9tKCkgKSB7CisJCQkJCXRva2VuVHlwZXMuYWRkKCBnZXRUb2tlblR5cGUodDAubGFiZWwpICk7CisJCQkJfQorCQkJCXN0YXRlID0gKE5GQVN0YXRlKXQwLnRhcmdldDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaW50IGRlY2lzaW9uTnVtYmVyID0gc3RhdGUuZ2V0RGVjaXNpb25OdW1iZXIoKTsKKwkJCWlmICggZGVjaXNpb25OdW1iZXI9PTAgKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3ZWlyZDogbm8gZGVjaXNpb24gbnVtYmVyIGJ1dCBhIGNob2ljZSBub2RlIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBkZWNpc2lvbiBwb2ludCwgcGljayBpdGggYWx0ZXJuYXRpdmUgcmFuZG9tbHkKKwkJCWludCBuID0gZy5nZXROdW1iZXJPZkFsdHNGb3JEZWNpc2lvbk5GQShzdGF0ZSk7CisJCQlpbnQgcmFuZG9tQWx0ID0gcmFuZG9tLm5leHRJbnQobikgKyAxOworCQkJaWYgKCBkZWJ1ZyApIFN5c3RlbS5vdXQucHJpbnRsbigicmFuZG9tQWx0PSIrcmFuZG9tQWx0KTsKKwkJCU5GQVN0YXRlIGFsdFN0YXJ0U3RhdGUgPQorCQkJCWcuZ2V0TkZBU3RhdGVGb3JBbHRPZkRlY2lzaW9uKHN0YXRlLCByYW5kb21BbHQpOworCQkJVHJhbnNpdGlvbiB0ID0gYWx0U3RhcnRTdGF0ZS50cmFuc2l0aW9uWzBdOworCQkJc3RhdGUgPSAoTkZBU3RhdGUpdC50YXJnZXQ7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIEludGVnZXIgZ2V0VG9rZW5UeXBlKExhYmVsIGxhYmVsKSB7CisJCWlmICggbGFiZWwuaXNTZXQoKSApIHsKKwkJCS8vIHBpY2sgcmFuZG9tIGVsZW1lbnQgb2Ygc2V0CisJCQlJbnRlcnZhbFNldCB0eXBlU2V0ID0gKEludGVydmFsU2V0KWxhYmVsLmdldFNldCgpOworCQkJaW50IHJhbmRvbUluZGV4ID0gcmFuZG9tLm5leHRJbnQodHlwZVNldC5zaXplKCkpOworCQkJcmV0dXJuIHR5cGVTZXQuZ2V0KHJhbmRvbUluZGV4KTsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBVdGlscy5pbnRlZ2VyKGxhYmVsLmdldEF0b20oKSk7CisJCX0KKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4odDAubGFiZWwudG9TdHJpbmcoZykpOworCX0KKworCS8qKiBVc2VkIHRvIGdlbmVyYXRlIHJhbmRvbSBzdHJpbmdzICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlpZiAoIGFyZ3MubGVuZ3RoIDwgMiApIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGphdmEgb3JnLmFudGxyLnRvb2wuUmFuZG9tUGhyYXNlIGdyYW1tYXJmaWxlIHN0YXJ0cnVsZSIpOworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBncmFtbWFyRmlsZU5hbWUgPSBhcmdzWzBdOworCQlTdHJpbmcgc3RhcnRSdWxlID0gYXJnc1sxXTsKKwkJbG9uZyBzZWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7IC8vIHVzZSByYW5kb20gc2VlZCB1bmxlc3Mgc3BlYy4KKwkJaWYgKCBhcmdzLmxlbmd0aD09MyApIHsKKwkJCVN0cmluZyBzZWVkU3RyID0gYXJnc1syXTsKKwkJCXNlZWQgPSBMb25nLnBhcnNlTG9uZyhzZWVkU3RyKTsKKwkJfQorCQl0cnkgeworCQkJcmFuZG9tID0gbmV3IFJhbmRvbShzZWVkKTsKKworCQkJQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworCQkJVG9vbCB0b29sID0gbmV3IFRvb2woKTsKKwkJCUdyYW1tYXIgcGFyc2VyID0gbmV3IEdyYW1tYXIodG9vbCwgZ3JhbW1hckZpbGVOYW1lLCBjb21wb3NpdGUpOworCQkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KHBhcnNlcik7CisKKwkJCUZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihncmFtbWFyRmlsZU5hbWUpOworCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOworCQkJcGFyc2VyLnBhcnNlQW5kQnVpbGRBU1QoYnIpOworCQkJYnIuY2xvc2UoKTsKKworCQkJcGFyc2VyLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisJCQlwYXJzZXIuY29tcG9zaXRlLmRlZmluZUdyYW1tYXJTeW1ib2xzKCk7CisJCQlwYXJzZXIuY29tcG9zaXRlLmNyZWF0ZU5GQXMoKTsKKworCQkJTGlzdCBsZWZ0UmVjdXJzaXZlUnVsZXMgPSBwYXJzZXIuY2hlY2tBbGxSdWxlc0ZvckxlZnRSZWN1cnNpb24oKTsKKwkJCWlmICggbGVmdFJlY3Vyc2l2ZVJ1bGVzLnNpemUoKT4wICkgeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKCBwYXJzZXIuZ2V0UnVsZShzdGFydFJ1bGUpPT1udWxsICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5kZWZpbmVkIHN0YXJ0IHJ1bGUgIitzdGFydFJ1bGUpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJU3RyaW5nIGxleGVyR3JhbW1hclRleHQgPSBwYXJzZXIuZ2V0TGV4ZXJHcmFtbWFyKCk7CisJCQlHcmFtbWFyIGxleGVyID0gbmV3IEdyYW1tYXIodG9vbCk7CisJCQlsZXhlci5pbXBvcnRUb2tlblZvY2FidWxhcnkocGFyc2VyKTsKKwkJCWxleGVyLmZpbGVOYW1lID0gZ3JhbW1hckZpbGVOYW1lOworCQkJaWYgKCBsZXhlckdyYW1tYXJUZXh0IT1udWxsICkgeworCQkJCWxleGVyLnNldEdyYW1tYXJDb250ZW50KGxleGVyR3JhbW1hclRleHQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJubyBsZXhlciBncmFtbWFyIGZvdW5kIGluICIrZ3JhbW1hckZpbGVOYW1lKTsKKwkJCX0KKwkJCWxleGVyLmJ1aWxkTkZBKCk7CisJCQlsZWZ0UmVjdXJzaXZlUnVsZXMgPSBsZXhlci5jaGVja0FsbFJ1bGVzRm9yTGVmdFJlY3Vyc2lvbigpOworCQkJaWYgKCBsZWZ0UmVjdXJzaXZlUnVsZXMuc2l6ZSgpPjAgKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxleGVyOlxuIitsZXhlcik7CisKKwkJCUxpc3Q8SW50ZWdlcj4gdG9rZW5UeXBlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oMTAwKTsKKwkJCXJhbmRvbVBocmFzZShwYXJzZXIsIHRva2VuVHlwZXMsIHN0YXJ0UnVsZSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRva2VuIHR5cGVzPSIrdG9rZW5UeXBlcyk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuVHlwZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQlJbnRlZ2VyIHR0eXBlSSA9IChJbnRlZ2VyKSB0b2tlblR5cGVzLmdldChpKTsKKwkJCQlpbnQgdHR5cGUgPSB0dHlwZUkuaW50VmFsdWUoKTsKKwkJCQlTdHJpbmcgdHR5cGVEaXNwbGF5TmFtZSA9IHBhcnNlci5nZXRUb2tlbkRpc3BsYXlOYW1lKHR0eXBlKTsKKwkJCQlpZiAoIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh0dHlwZURpc3BsYXlOYW1lLmNoYXJBdCgwKSkgKSB7CisJCQkJCUxpc3Q8SW50ZWdlcj4gY2hhcnNJblRva2VuID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigxMCk7CisJCQkJCXJhbmRvbVBocmFzZShsZXhlciwgY2hhcnNJblRva2VuLCB0dHlwZURpc3BsYXlOYW1lKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludCgiICIpOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzSW5Ub2tlbi5zaXplKCk7IGorKykgeworCQkJCQkJamF2YS5sYW5nLkludGVnZXIgY0kgPSAoamF2YS5sYW5nLkludGVnZXIpIGNoYXJzSW5Ub2tlbi5nZXQoaik7CisJCQkJCQlTeXN0ZW0ub3V0LnByaW50KChjaGFyKWNJLmludFZhbHVlKCkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvLyBpdCdzIGEgbGl0ZXJhbAorCQkJCQlTdHJpbmcgbGl0ZXJhbCA9CisJCQkJCQl0dHlwZURpc3BsYXlOYW1lLnN1YnN0cmluZygxLHR0eXBlRGlzcGxheU5hbWUubGVuZ3RoKCktMSk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAiK2xpdGVyYWwpOworCQkJCX0KKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQl9CisJCWNhdGNoIChFcnJvciBlcikgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciB3YWxraW5nICIrZ3JhbW1hckZpbGVOYW1lKyIgcnVsZSAiK3N0YXJ0UnVsZSsiIHNlZWQgIitzZWVkKTsKKwkJCWVyLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uIHdhbGtpbmcgIitncmFtbWFyRmlsZU5hbWUrIiBydWxlICIrc3RhcnRSdWxlKyIgc2VlZCAiK3NlZWQpOworCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL1JlY3Vyc2lvbk92ZXJmbG93TWVzc2FnZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9SZWN1cnNpb25PdmVyZmxvd01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGU3MmM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9SZWN1cnNpb25PdmVyZmxvd01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuREZBU3RhdGU7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRlY2lzaW9uUHJvYmU7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBJbmRpY2F0ZXMgcmVjdXJzaW9uIG92ZXJmbG93LiAgQSBERkEgc3RhdGUgdHJpZWQgYWRkIGFuIE5GQSBjb25maWd1cmF0aW9uCisgKiAgd2l0aCBORkEgc3RhdGUgcCB0aGF0IHdhcyBtZW50aW9uZWQgaW4gaXRzIHN0YWNrIGNvbnRleHQgdG9vIG1hbnkgdGltZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBSZWN1cnNpb25PdmVyZmxvd01lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKwlwdWJsaWMgRGVjaXNpb25Qcm9iZSBwcm9iZTsKKwlwdWJsaWMgREZBU3RhdGUgc2FtcGxlQmFkU3RhdGU7CisJcHVibGljIGludCBhbHQ7CisJcHVibGljIENvbGxlY3Rpb24gdGFyZ2V0UnVsZXM7CisJcHVibGljIENvbGxlY3Rpb24gY2FsbFNpdGVTdGF0ZXM7CisKKwlwdWJsaWMgUmVjdXJzaW9uT3ZlcmZsb3dNZXNzYWdlKERlY2lzaW9uUHJvYmUgcHJvYmUsCisJCQkJCQkJCQlERkFTdGF0ZSBzYW1wbGVCYWRTdGF0ZSwKKwkJCQkJCQkJCWludCBhbHQsCisJCQkJCQkJCQlDb2xsZWN0aW9uIHRhcmdldFJ1bGVzLAorCQkJCQkJCQkJQ29sbGVjdGlvbiBjYWxsU2l0ZVN0YXRlcykKKwl7CisJCXN1cGVyKEVycm9yTWFuYWdlci5NU0dfUkVDVVJTSU9OX09WRVJMT1cpOworCQl0aGlzLnByb2JlID0gcHJvYmU7CisJCXRoaXMuc2FtcGxlQmFkU3RhdGUgPSBzYW1wbGVCYWRTdGF0ZTsKKwkJdGhpcy5hbHQgPSBhbHQ7CisJCXRoaXMudGFyZ2V0UnVsZXMgPSB0YXJnZXRSdWxlczsKKwkJdGhpcy5jYWxsU2l0ZVN0YXRlcyA9IGNhbGxTaXRlU3RhdGVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCUdyYW1tYXJBU1QgZGVjaXNpb25BU1ROb2RlID0gcHJvYmUuZGZhLmdldERlY2lzaW9uQVNUTm9kZSgpOworCQlsaW5lID0gZGVjaXNpb25BU1ROb2RlLmdldExpbmUoKTsKKwkJY29sdW1uID0gZGVjaXNpb25BU1ROb2RlLmdldENoYXJQb3NpdGlvbkluTGluZSgpOworCQlTdHJpbmcgZmlsZU5hbWUgPSBwcm9iZS5kZmEubmZhLmdyYW1tYXIuZ2V0RmlsZU5hbWUoKTsKKwkJaWYgKCBmaWxlTmFtZSE9bnVsbCApIHsKKwkJCWZpbGUgPSBmaWxlTmFtZTsKKwkJfQorCisJCVNUIHN0ID0gZ2V0TWVzc2FnZVRlbXBsYXRlKCk7CisJCXN0LmFkZCgidGFyZ2V0UnVsZXMiLCB0YXJnZXRSdWxlcyk7CisJCXN0LmFkZCgiYWx0IiwgYWx0KTsKKwkJc3QuYWRkKCJjYWxsU2l0ZVN0YXRlcyIsIGNhbGxTaXRlU3RhdGVzKTsKKworCQlMaXN0IGxhYmVscyA9CisJCQlwcm9iZS5nZXRTYW1wbGVOb25EZXRlcm1pbmlzdGljSW5wdXRTZXF1ZW5jZShzYW1wbGVCYWRTdGF0ZSk7CisJCVN0cmluZyBpbnB1dCA9IHByb2JlLmdldElucHV0U2VxdWVuY2VEaXNwbGF5KGxhYmVscyk7CisJCXN0LmFkZCgiaW5wdXQiLCBpbnB1dCk7CisKKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKHN0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvUnVsZS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9SdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNDFmMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvUnVsZS5qYXZhCkBAIC0wLDAgKzEsNTgyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuTkZBU3RhdGU7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3JhbW1hci52My5BTlRMUlBhcnNlcjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKiogQ29tYmluZSB0aGUgaW5mbyBhc3NvY2lhdGVkIHdpdGggYSBydWxlLiAqLworcHVibGljIGNsYXNzIFJ1bGUgeworCXB1YmxpYyBTdHJpbmcgbmFtZTsKKwlwdWJsaWMgaW50IGluZGV4OworCXB1YmxpYyBTdHJpbmcgbW9kaWZpZXI7CisJcHVibGljIE5GQVN0YXRlIHN0YXJ0U3RhdGU7CisJcHVibGljIE5GQVN0YXRlIHN0b3BTdGF0ZTsKKworCS8qKiBUaGlzIHJ1bGUncyBvcHRpb25zICovCisJcHJvdGVjdGVkIE1hcCBvcHRpb25zOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXQgbGVnYWxPcHRpb25zID0KKwkJCW5ldyBIYXNoU2V0KCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkKCJrIik7IGFkZCgiZ3JlZWR5Iik7IGFkZCgibWVtb2l6ZSIpOworICAgICAgICAgICAgICAgICAgICBhZGQoImJhY2t0cmFjayIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKwkvKiogVGhlIEFTVCByZXByZXNlbnRpbmcgdGhlIHdob2xlIHJ1bGUgKi8KKwlwdWJsaWMgR3JhbW1hckFTVCB0cmVlOworCisJLyoqIFRvIHdoaWNoIGdyYW1tYXIgZG9lcyB0aGlzIGJlbG9uZz8gKi8KKwlwdWJsaWMgR3JhbW1hciBncmFtbWFyOworCisJLyoqIEZvciBjb252ZW5pZW5jZSwgdHJhY2sgdGhlIGFyZ3VtZW50IGRlZiBBU1QgYWN0aW9uIG5vZGUgaWYgYW55ICovCisJcHVibGljIEdyYW1tYXJBU1QgYXJnQWN0aW9uQVNUOworCisJcHVibGljIEdyYW1tYXJBU1QgRU9STm9kZTsKKworCS8qKiBUaGUgcmV0dXJuIHZhbHVlcyBvZiBhIHJ1bGUgYW5kIHByZWRlZmluZWQgcnVsZSBhdHRyaWJ1dGVzICovCisJcHVibGljIEF0dHJpYnV0ZVNjb3BlIHJldHVyblNjb3BlOworCisJcHVibGljIEF0dHJpYnV0ZVNjb3BlIHBhcmFtZXRlclNjb3BlOworCisJLyoqIHRoZSBhdHRyaWJ1dGVzIGRlZmluZWQgd2l0aCAic2NvcGUgey4uLn0iIGluc2lkZSBhIHJ1bGUgKi8KKwlwdWJsaWMgQXR0cmlidXRlU2NvcGUgcnVsZVNjb3BlOworCisJLyoqIEEgbGlzdCBvZiBzY29wZSBuYW1lcyAoU3RyaW5nKSB1c2VkIGJ5IHRoaXMgcnVsZSAqLworCXB1YmxpYyBMaXN0IHVzZVNjb3BlczsKKworICAgIC8qKiBFeGNlcHRpb25zIHRoYXQgdGhpcyBydWxlIGNhbiB0aHJvdyAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiB0aHJvd3NTcGVjOworCisgICAgLyoqIEEgbGlzdCBvZiBhbGwgTGFiZWxFbGVtZW50UGFpciBhdHRhY2hlZCB0byB0b2tlbnMgbGlrZSBpZD1JRCAqLworICAgIHB1YmxpYyBMaW5rZWRIYXNoTWFwIHRva2VuTGFiZWxzOworCisgICAgLyoqIEEgbGlzdCBvZiBhbGwgTGFiZWxFbGVtZW50UGFpciBhdHRhY2hlZCB0byB0b2tlbnMgbGlrZSB4PS4gaW4gdHJlZSBncmFtbWFyICovCisgICAgcHVibGljIExpbmtlZEhhc2hNYXAgd2lsZGNhcmRUcmVlTGFiZWxzOworCisgICAgLyoqIEEgbGlzdCBvZiBhbGwgTGFiZWxFbGVtZW50UGFpciBhdHRhY2hlZCB0byB0b2tlbnMgbGlrZSB4Kz0uIGluIHRyZWUgZ3JhbW1hciAqLworICAgIHB1YmxpYyBMaW5rZWRIYXNoTWFwIHdpbGRjYXJkVHJlZUxpc3RMYWJlbHM7CisKKwkvKiogQSBsaXN0IG9mIGFsbCBMYWJlbEVsZW1lbnRQYWlyIGF0dGFjaGVkIHRvIHNpbmdsZSBjaGFyIGxpdGVyYWxzIGxpa2UgeD0nYScgKi8KKwlwdWJsaWMgTGlua2VkSGFzaE1hcCBjaGFyTGFiZWxzOworCisJLyoqIEEgbGlzdCBvZiBhbGwgTGFiZWxFbGVtZW50UGFpciBhdHRhY2hlZCB0byBydWxlIHJlZmVyZW5jZXMgbGlrZSBmPWZpZWxkICovCisJcHVibGljIExpbmtlZEhhc2hNYXAgcnVsZUxhYmVsczsKKworCS8qKiBBIGxpc3Qgb2YgYWxsIFRva2VuIGxpc3QgTGFiZWxFbGVtZW50UGFpciBsaWtlIGlkcys9SUQgKi8KKwlwdWJsaWMgTGlua2VkSGFzaE1hcCB0b2tlbkxpc3RMYWJlbHM7CisKKwkvKiogQSBsaXN0IG9mIGFsbCBydWxlIHJlZiBsaXN0IExhYmVsRWxlbWVudFBhaXIgbGlrZSBpZHMrPWV4cHIgKi8KKwlwdWJsaWMgTGlua2VkSGFzaE1hcCBydWxlTGlzdExhYmVsczsKKworCS8qKiBBbGwgbGFiZWxzIGdvIGluIGhlcmUgKHBsdXMgYmVpbmcgc3BsaXQgcGVyIHRoZSBhYm92ZSBsaXN0cykgdG8KKwkgKiAgY2F0Y2ggZHVwIGxhYmVsIGFuZCBsYWJlbCB0eXBlIG1pc21hdGNoZXMuCisJICovCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIEdyYW1tYXIuTGFiZWxFbGVtZW50UGFpcj4gbGFiZWxOYW1lU3BhY2UgPQorCQluZXcgSGFzaE1hcDxTdHJpbmcsIEdyYW1tYXIuTGFiZWxFbGVtZW50UGFpcj4oKTsKKworCS8qKiBNYXAgYSBuYW1lIHRvIGFuIGFjdGlvbiBmb3IgdGhpcyBydWxlLiAgQ3VycmVudGx5IGluaXQgaXMgb25seQorCSAqICBvbmUgd2UgdXNlLCBidXQgd2UgY2FuIGFkZCBtb3JlIGluIGZ1dHVyZS4KKwkgKiAgVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgdXNlIHRoaXMgdG8gZmlsbCBob2xlcyBpbiB0aGUgcnVsZSB0ZW1wbGF0ZS4KKwkgKiAgSSB0cmFjayB0aGUgQVNUIG5vZGUgZm9yIHRoZSBhY3Rpb24gaW4gY2FzZSBJIG5lZWQgdGhlIGxpbmUgbnVtYmVyCisJICogIGZvciBlcnJvcnMuICBBIGJldHRlciBuYW1lIGlzIHByb2JhYmx5IG5hbWVkQWN0aW9ucywgYnV0IEkgZG9uJ3QKKwkgKiAgd2FudCBldmVyeW9uZSB0byBoYXZlIHRvIGNoYW5nZSB0aGVpciBjb2RlIGdlbiB0ZW1wbGF0ZXMgbm93LgorCSAqLworCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBHcmFtbWFyQVNUPiBhY3Rpb25zID0KKwkJbmV3IEhhc2hNYXA8U3RyaW5nLCBHcmFtbWFyQVNUPigpOworCisJLyoqIFRyYWNrIGFsbCBleGVjdXRhYmxlIGFjdGlvbnMgb3RoZXIgdGhhbiBuYW1lZCBhY3Rpb25zIGxpa2UgQGluaXQuCisJICogIEFsc28gdHJhY2tzIGV4Y2VwdGlvbiBoYW5kbGVycywgcHJlZGljYXRlcywgYW5kIHJld3JpdGUgcmV3cml0ZXMuCisJICogIFdlIG5lZWQgdG8gZXhhbWluZSB0aGVzZSBhY3Rpb25zIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24gc28KKwkgKiAgdGhhdCB3ZSBjYW4gZGV0ZWN0IHJlZnMgdG8gJHJ1bGUuYXR0ciBldGMuLi4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxHcmFtbWFyQVNUPiBpbmxpbmVBY3Rpb25zID0gbmV3IEFycmF5TGlzdDxHcmFtbWFyQVNUPigpOworCisJcHVibGljIGludCBudW1iZXJPZkFsdHM7CisKKwkvKiogRWFjaCBhbHQgaGFzIGEgTWFwPHRva2VuUmVmTmFtZSxMaXN0PHRva2VuUmVmQVNUPj47IHJhbmdlIDEuLm51bWJlck9mQWx0cy4KKwkgKiAgU28sIGlmIHRoZXJlIGFyZSAzIElEIHJlZnMgaW4gYSBydWxlJ3MgYWx0IG51bWJlciAyLCB5b3UnbGwgaGF2ZQorCSAqICBhbHRUb1Rva2VuUmVmWzJdLmdldCgiSUQiKS5zaXplKCk9PTMuICBUaGlzIGlzIHVzZWQgdG8gc2VlIGlmICRJRCBpcyBvay4KKwkgKiAgVGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBJRCByZWZlcmVuY2UgaW4gdGhlIGFsdCBmb3IgJElEIHRvIGJlIG9rIGluCisJICogIGFuIGFjdGlvbi0tbXVzdCBiZSB1bmlxdWUuCisJICoKKwkgKiAgVGhpcyBhbHNvIHRyYWNrcyAnKycgYW5kICJpbnQiIGxpdGVyYWwgdG9rZW4gcmVmZXJlbmNlcworCSAqICAoaWYgbm90IGluIExFWEVSKS4KKwkgKgorCSAqICBSZXdyaXRlIHJ1bGVzIGZvcmNlIHRyYWNraW5nIG9mIGFsbCB0b2tlbnMuCisJICovCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIExpc3Q8R3JhbW1hckFTVD4+W10gYWx0VG9Ub2tlblJlZk1hcDsKKworCS8qKiBFYWNoIGFsdCBoYXMgYSBNYXA8cnVsZVJlZk5hbWUsTGlzdDxydWxlUmVmQVNUPj47IHJhbmdlIDEuLm51bWJlck9mQWx0cworCSAqICBTbywgaWYgdGhlcmUgYXJlIDMgZXhwciByZWZzIGluIGEgcnVsZSdzIGFsdCBudW1iZXIgMiwgeW91J2xsIGhhdmUKKwkgKiAgYWx0VG9SdWxlUmVmWzJdLmdldCgiZXhwciIpLnNpemUoKT09My4gIFRoaXMgaXMgdXNlZCB0byBzZWUgaWYgJGV4cHIgaXMgb2suCisJICogIFRoZXJlIG11c3QgYmUgb25seSBvbmUgZXhwciByZWZlcmVuY2UgaW4gdGhlIGFsdCBmb3IgJGV4cHIgdG8gYmUgb2sgaW4KKwkgKiAgYW4gYWN0aW9uLS1tdXN0IGJlIHVuaXF1ZS4KKwkgKgorCSAqICBSZXdyaXRlIHJ1bGVzIGZvcmNlIHRyYWNraW5nIG9mIGFsbCBydWxlIHJlc3VsdCBBU1RzLiAxLi5uCisJICovCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIExpc3Q8R3JhbW1hckFTVD4+W10gYWx0VG9SdWxlUmVmTWFwOworCisJLyoqIERvIG5vdCBnZW5lcmF0ZSBzdGFydCwgc3RvcCBldGMuLi4gaW4gYSByZXR1cm4gdmFsdWUgc3RydWN0IHVubGVzcworCSAqICBzb21lYm9keSByZWZlcmVuY2VzICRyLnN0YXJ0IHNvbWV3aGVyZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkUHJlZGVmaW5lZFJ1bGVBdHRyaWJ1dGVzID0gZmFsc2U7CisKKwlwdWJsaWMgYm9vbGVhbiBpc1N5blByZWQgPSBmYWxzZTsKKworCXB1YmxpYyBib29sZWFuIGltcG9ydGVkID0gZmFsc2U7CisKKwlwdWJsaWMgUnVsZShHcmFtbWFyIGdyYW1tYXIsCisJCQkJU3RyaW5nIHJ1bGVOYW1lLAorCQkJCWludCBydWxlSW5kZXgsCisJCQkJaW50IG51bWJlck9mQWx0cykKKwl7CisJCXRoaXMubmFtZSA9IHJ1bGVOYW1lOworCQl0aGlzLmluZGV4ID0gcnVsZUluZGV4OworCQl0aGlzLm51bWJlck9mQWx0cyA9IG51bWJlck9mQWx0czsKKwkJdGhpcy5ncmFtbWFyID0gZ3JhbW1hcjsKKwkJdGhyb3dzU3BlYyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJYWx0VG9Ub2tlblJlZk1hcCA9IG5ldyBNYXBbbnVtYmVyT2ZBbHRzKzFdOworCQlhbHRUb1J1bGVSZWZNYXAgPSBuZXcgTWFwW251bWJlck9mQWx0cysxXTsKKwkJZm9yIChpbnQgYWx0PTE7IGFsdDw9bnVtYmVyT2ZBbHRzOyBhbHQrKykgeworCQkJYWx0VG9Ub2tlblJlZk1hcFthbHRdID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEdyYW1tYXJBU1Q+PigpOworCQkJYWx0VG9SdWxlUmVmTWFwW2FsdF0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8R3JhbW1hckFTVD4+KCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGludCBnZXRSdWxlVHlwZShTdHJpbmcgcnVsZU5hbWUpeworCQlpZiAocnVsZU5hbWUgPT0gbnVsbCB8fCBydWxlTmFtZS5sZW5ndGgoKSA9PSAwKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBydWxlIG5hbWUgaXMgbm90IHZhbGlkLiIpOworCQlyZXR1cm4gQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHJ1bGVOYW1lLmNoYXJBdCgwKSkgPyBHcmFtbWFyLkxFWEVSIDogR3JhbW1hci5QQVJTRVI7CisJfQorCisJcHVibGljIHZvaWQgZGVmaW5lTGFiZWwoVG9rZW4gbGFiZWwsIEdyYW1tYXJBU1QgZWxlbWVudFJlZiwgaW50IHR5cGUpIHsKKwkJR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIHBhaXIgPSBncmFtbWFyLm5ldyBMYWJlbEVsZW1lbnRQYWlyKGxhYmVsLGVsZW1lbnRSZWYpOworCQlwYWlyLnR5cGUgPSB0eXBlOworCQlsYWJlbE5hbWVTcGFjZS5wdXQobGFiZWwuZ2V0VGV4dCgpLCBwYWlyKTsKKwkJc3dpdGNoICggdHlwZSApIHsKKyAgICAgICAgICAgIGNhc2UgR3JhbW1hci5UT0tFTl9MQUJFTCA6CisgICAgICAgICAgICAgICAgaWYgKCB0b2tlbkxhYmVscz09bnVsbCApIHRva2VuTGFiZWxzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICB0b2tlbkxhYmVscy5wdXQobGFiZWwuZ2V0VGV4dCgpLCBwYWlyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR3JhbW1hci5XSUxEQ0FSRF9UUkVFX0xBQkVMIDoKKyAgICAgICAgICAgICAgICBpZiAoIHdpbGRjYXJkVHJlZUxhYmVscz09bnVsbCApIHdpbGRjYXJkVHJlZUxhYmVscyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgd2lsZGNhcmRUcmVlTGFiZWxzLnB1dChsYWJlbC5nZXRUZXh0KCksIHBhaXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHcmFtbWFyLldJTERDQVJEX1RSRUVfTElTVF9MQUJFTCA6CisgICAgICAgICAgICAgICAgaWYgKCB3aWxkY2FyZFRyZWVMaXN0TGFiZWxzPT1udWxsICkgd2lsZGNhcmRUcmVlTGlzdExhYmVscyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgd2lsZGNhcmRUcmVlTGlzdExhYmVscy5wdXQobGFiZWwuZ2V0VGV4dCgpLCBwYWlyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgR3JhbW1hci5SVUxFX0xBQkVMIDoKKwkJCQlpZiAoIHJ1bGVMYWJlbHM9PW51bGwgKSBydWxlTGFiZWxzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKwkJCQlydWxlTGFiZWxzLnB1dChsYWJlbC5nZXRUZXh0KCksIHBhaXIpOworCQkJCWJyZWFrOworCQkJY2FzZSBHcmFtbWFyLlRPS0VOX0xJU1RfTEFCRUwgOgorCQkJCWlmICggdG9rZW5MaXN0TGFiZWxzPT1udWxsICkgdG9rZW5MaXN0TGFiZWxzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKwkJCQl0b2tlbkxpc3RMYWJlbHMucHV0KGxhYmVsLmdldFRleHQoKSwgcGFpcik7CisJCQkJYnJlYWs7CisJCQljYXNlIEdyYW1tYXIuUlVMRV9MSVNUX0xBQkVMIDoKKwkJCQlpZiAoIHJ1bGVMaXN0TGFiZWxzPT1udWxsICkgcnVsZUxpc3RMYWJlbHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworCQkJCXJ1bGVMaXN0TGFiZWxzLnB1dChsYWJlbC5nZXRUZXh0KCksIHBhaXIpOworCQkJCWJyZWFrOworCQkJY2FzZSBHcmFtbWFyLkNIQVJfTEFCRUwgOgorCQkJCWlmICggY2hhckxhYmVscz09bnVsbCApIGNoYXJMYWJlbHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworCQkJCWNoYXJMYWJlbHMucHV0KGxhYmVsLmdldFRleHQoKSwgcGFpcik7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwdWJsaWMgR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIGdldExhYmVsKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiAoR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyKWxhYmVsTmFtZVNwYWNlLmdldChuYW1lKTsKKwl9CisKKwlwdWJsaWMgR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIGdldFRva2VuTGFiZWwoU3RyaW5nIG5hbWUpIHsKKwkJR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIHBhaXIgPSBudWxsOworCQlpZiAoIHRva2VuTGFiZWxzIT1udWxsICkgeworCQkJcmV0dXJuIChHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIpdG9rZW5MYWJlbHMuZ2V0KG5hbWUpOworCQl9CisJCXJldHVybiBwYWlyOworCX0KKworCXB1YmxpYyBNYXAgZ2V0UnVsZUxhYmVscygpIHsKKwkJcmV0dXJuIHJ1bGVMYWJlbHM7CisJfQorCisJcHVibGljIE1hcCBnZXRSdWxlTGlzdExhYmVscygpIHsKKwkJcmV0dXJuIHJ1bGVMaXN0TGFiZWxzOworCX0KKworCXB1YmxpYyBHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIgZ2V0UnVsZUxhYmVsKFN0cmluZyBuYW1lKSB7CisJCUdyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBwYWlyID0gbnVsbDsKKwkJaWYgKCBydWxlTGFiZWxzIT1udWxsICkgeworCQkJcmV0dXJuIChHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIpcnVsZUxhYmVscy5nZXQobmFtZSk7CisJCX0KKwkJcmV0dXJuIHBhaXI7CisJfQorCisJcHVibGljIEdyYW1tYXIuTGFiZWxFbGVtZW50UGFpciBnZXRUb2tlbkxpc3RMYWJlbChTdHJpbmcgbmFtZSkgeworCQlHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIgcGFpciA9IG51bGw7CisJCWlmICggdG9rZW5MaXN0TGFiZWxzIT1udWxsICkgeworCQkJcmV0dXJuIChHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIpdG9rZW5MaXN0TGFiZWxzLmdldChuYW1lKTsKKwkJfQorCQlyZXR1cm4gcGFpcjsKKwl9CisKKwlwdWJsaWMgR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIGdldFJ1bGVMaXN0TGFiZWwoU3RyaW5nIG5hbWUpIHsKKwkJR3JhbW1hci5MYWJlbEVsZW1lbnRQYWlyIHBhaXIgPSBudWxsOworCQlpZiAoIHJ1bGVMaXN0TGFiZWxzIT1udWxsICkgeworCQkJcmV0dXJuIChHcmFtbWFyLkxhYmVsRWxlbWVudFBhaXIpcnVsZUxpc3RMYWJlbHMuZ2V0KG5hbWUpOworCQl9CisJCXJldHVybiBwYWlyOworCX0KKworCS8qKiBUcmFjayBhIHRva2VuIElEIG9yIGxpdGVyYWwgbGlrZSAnKycgYW5kICJ2b2lkIiBhcyBoYXZpbmcgYmVlbiByZWZlcmVuY2VkCisJICogIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGFsdHMgKG5vdCByZXdyaXRlIHNlY3Rpb25zKSBvZiBhIHJ1bGUuCisJICoKKwkgKiAgVGhpcyBkaWZmZXJzIGZyb20gR3JhbW1hci5hbHRSZWZlcmVuY2VzVG9rZW5JRCgpLCB3aGljaCB0cmFja3MgYWxsCisJICogIHRva2VuIElEcyB0byBjaGVjayBmb3IgdG9rZW4gSURzIHdpdGhvdXQgY29ycmVzcG9uZGluZyBsZXhlciBydWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB0cmFja1Rva2VuUmVmZXJlbmNlSW5BbHQoR3JhbW1hckFTVCByZWZBU1QsIGludCBvdXRlckFsdE51bSkgeworCQlMaXN0IHJlZnMgPSAoTGlzdClhbHRUb1Rva2VuUmVmTWFwW291dGVyQWx0TnVtXS5nZXQocmVmQVNULmdldFRleHQoKSk7CisJCWlmICggcmVmcz09bnVsbCApIHsKKwkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlhbHRUb1Rva2VuUmVmTWFwW291dGVyQWx0TnVtXS5wdXQocmVmQVNULmdldFRleHQoKSwgcmVmcyk7CisJCX0KKwkJcmVmcy5hZGQocmVmQVNUKTsKKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRUb2tlblJlZnNJbkFsdChTdHJpbmcgcmVmLCBpbnQgb3V0ZXJBbHROdW0pIHsKKwkJaWYgKCBhbHRUb1Rva2VuUmVmTWFwW291dGVyQWx0TnVtXSE9bnVsbCApIHsKKwkJCUxpc3QgdG9rZW5SZWZBU1RzID0gKExpc3QpYWx0VG9Ub2tlblJlZk1hcFtvdXRlckFsdE51bV0uZ2V0KHJlZik7CisJCQlyZXR1cm4gdG9rZW5SZWZBU1RzOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHRyYWNrUnVsZVJlZmVyZW5jZUluQWx0KEdyYW1tYXJBU1QgcmVmQVNULCBpbnQgb3V0ZXJBbHROdW0pIHsKKwkJTGlzdCByZWZzID0gKExpc3QpYWx0VG9SdWxlUmVmTWFwW291dGVyQWx0TnVtXS5nZXQocmVmQVNULmdldFRleHQoKSk7CisJCWlmICggcmVmcz09bnVsbCApIHsKKwkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlhbHRUb1J1bGVSZWZNYXBbb3V0ZXJBbHROdW1dLnB1dChyZWZBU1QuZ2V0VGV4dCgpLCByZWZzKTsKKwkJfQorCQlyZWZzLmFkZChyZWZBU1QpOworCX0KKworCXB1YmxpYyBMaXN0IGdldFJ1bGVSZWZzSW5BbHQoU3RyaW5nIHJlZiwgaW50IG91dGVyQWx0TnVtKSB7CisJCWlmICggYWx0VG9SdWxlUmVmTWFwW291dGVyQWx0TnVtXSE9bnVsbCApIHsKKwkJCUxpc3QgcnVsZVJlZkFTVHMgPSAoTGlzdClhbHRUb1J1bGVSZWZNYXBbb3V0ZXJBbHROdW1dLmdldChyZWYpOworCQkJcmV0dXJuIHJ1bGVSZWZBU1RzOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTZXQgZ2V0VG9rZW5SZWZzSW5BbHQoaW50IGFsdE51bSkgeworCQlyZXR1cm4gYWx0VG9Ub2tlblJlZk1hcFthbHROdW1dLmtleVNldCgpOworCX0KKworCS8qKiBGb3IgdXNlIHdpdGggcmV3cml0ZSBydWxlcywgd2UgbXVzdCB0cmFjayBhbGwgdG9rZW5zIG1hdGNoZWQgb24gdGhlCisJICogIGxlZnQtaGFuZC1zaWRlOyBzbyB3ZSBuZWVkIExpc3RzLiAgVGhpcyBpcyBhIHVuaXF1ZSBsaXN0IG9mIGFsbAorCSAqICB0b2tlbiB0eXBlcyBmb3Igd2hpY2ggdGhlIHJ1bGUgbmVlZHMgYSBsaXN0IG9mIHRva2Vucy4gIFRoaXMKKwkgKiAgaXMgY2FsbGVkIGZyb20gdGhlIHJ1bGUgdGVtcGxhdGUgbm90IGRpcmVjdGx5IGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKwkgKi8KKwlwdWJsaWMgU2V0IGdldEFsbFRva2VuUmVmc0luQWx0c1dpdGhSZXdyaXRlcygpIHsKKwkJU3RyaW5nIG91dHB1dCA9IChTdHJpbmcpZ3JhbW1hci5nZXRPcHRpb24oIm91dHB1dCIpOworCQlTZXQ8U3RyaW5nPiB0b2tlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWlmICggb3V0cHV0PT1udWxsIHx8ICFvdXRwdXQuZXF1YWxzKCJBU1QiKSApIHsKKwkJCS8vIHJldHVybiBub3RoaW5nIGlmIG5vdCBnZW5lcmF0aW5nIHRyZWVzOyBpLmUuLCBkb24ndCBkbyBmb3IgdGVtcGxhdGVzCisJCQlyZXR1cm4gdG9rZW5zOworCQl9CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJibGsgIit0cmVlLmZpbmRGaXJzdFR5cGUoQU5UTFJQYXJzZXIuQkxPQ0spLnRvU3RyaW5nVHJlZSgpKTsKKwkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtYmVyT2ZBbHRzOyBpKyspIHsKKwkJCWlmICggaGFzUmV3cml0ZShpKSApIHsKKwkJCQlNYXA8U3RyaW5nLCBMaXN0PEdyYW1tYXJBU1Q+PiBtID0gYWx0VG9Ub2tlblJlZk1hcFtpXTsKKwkJCQlmb3IgKFN0cmluZyB0b2tlbk5hbWUgOiBtLmtleVNldCgpKSB7CisJCQkJCS8vIGNvbnZlcnQgdG9rZW4gbmFtZSBsaWtlIElEIHRvIElELCAidm9pZCIgdG8gMzEKKwkJCQkJaW50IHR0eXBlID0gZ3JhbW1hci5nZXRUb2tlblR5cGUodG9rZW5OYW1lKTsKKwkJCQkJU3RyaW5nIGxhYmVsID0gZ3JhbW1hci5nZW5lcmF0b3IuZ2V0VG9rZW5UeXBlQXNUYXJnZXRMYWJlbCh0dHlwZSk7CisJCQkJCXRva2Vucy5hZGQobGFiZWwpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdG9rZW5zOworCX0KKworCXB1YmxpYyBTZXQgZ2V0UnVsZVJlZnNJbkFsdChpbnQgb3V0ZXJBbHROdW0pIHsKKwkJcmV0dXJuIGFsdFRvUnVsZVJlZk1hcFtvdXRlckFsdE51bV0ua2V5U2V0KCk7CisJfQorCisJLyoqIEZvciB1c2Ugd2l0aCByZXdyaXRlIHJ1bGVzLCB3ZSBtdXN0IHRyYWNrIGFsbCBydWxlIEFTVCByZXN1bHRzIG9uIHRoZQorCSAqICBsZWZ0LWhhbmQtc2lkZTsgc28gd2UgbmVlZCBMaXN0cy4gIFRoaXMgaXMgYSB1bmlxdWUgbGlzdCBvZiBhbGwKKwkgKiAgcnVsZSByZXN1bHRzIGZvciB3aGljaCB0aGUgcnVsZSBuZWVkcyBhIGxpc3Qgb2YgcmVzdWx0cy4KKwkgKi8KKwlwdWJsaWMgU2V0IGdldEFsbFJ1bGVSZWZzSW5BbHRzV2l0aFJld3JpdGVzKCkgeworCQlTZXQgcnVsZXMgPSBuZXcgSGFzaFNldCgpOworCQlmb3IgKGludCBpID0gMTsgaSA8PSBudW1iZXJPZkFsdHM7IGkrKykgeworCQkJaWYgKCBoYXNSZXdyaXRlKGkpICkgeworCQkJCU1hcCBtID0gYWx0VG9SdWxlUmVmTWFwW2ldOworCQkJCXJ1bGVzLmFkZEFsbChtLmtleVNldCgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcnVsZXM7CisJfQorCisJcHVibGljIExpc3Q8R3JhbW1hckFTVD4gZ2V0SW5saW5lQWN0aW9ucygpIHsKKwkJcmV0dXJuIGlubGluZUFjdGlvbnM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzUmV3cml0ZShpbnQgaSkgeworCQlHcmFtbWFyQVNUIGJsayA9IHRyZWUuZmluZEZpcnN0VHlwZShBTlRMUlBhcnNlci5CTE9DSyk7CisJCUdyYW1tYXJBU1QgYWx0ID0gYmxrLmdldEJsb2NrQUxUKGkpOworCQlHcmFtbWFyQVNUIHJldyA9IChHcmFtbWFyQVNUKWFsdC5nZXROZXh0U2libGluZygpOworCQlpZiAoIHJldyE9bnVsbCAmJiByZXcuZ2V0VHlwZSgpPT1BTlRMUlBhcnNlci5SRVdSSVRFUyApIHJldHVybiB0cnVlOworCQlpZiAoIGFsdC5maW5kRmlyc3RUeXBlKEFOVExSUGFyc2VyLlJFV1JJVEVTKSE9bnVsbCApIHJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqIFJldHVybiB0aGUgc2NvcGUgY29udGFpbmluZyBuYW1lICovCisJcHVibGljIEF0dHJpYnV0ZVNjb3BlIGdldEF0dHJpYnV0ZVNjb3BlKFN0cmluZyBuYW1lKSB7CisJCUF0dHJpYnV0ZVNjb3BlIHNjb3BlID0gZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZShuYW1lKTsKKwkJaWYgKCBzY29wZSE9bnVsbCApIHsKKwkJCXJldHVybiBzY29wZTsKKwkJfQorCQlpZiAoIHJ1bGVTY29wZSE9bnVsbCAmJiBydWxlU2NvcGUuZ2V0QXR0cmlidXRlKG5hbWUpIT1udWxsICkgeworCQkJc2NvcGUgPSBydWxlU2NvcGU7CisJCX0KKwkJcmV0dXJuIHNjb3BlOworCX0KKworCS8qKiBHZXQgdGhlIGFyZywgcmV0dXJuIHZhbHVlLCBvciBwcmVkZWZpbmVkIHByb3BlcnR5IGZvciB0aGlzIHJ1bGUgKi8KKwlwdWJsaWMgQXR0cmlidXRlU2NvcGUgZ2V0TG9jYWxBdHRyaWJ1dGVTY29wZShTdHJpbmcgbmFtZSkgeworCQlBdHRyaWJ1dGVTY29wZSBzY29wZSA9IG51bGw7CisJCWlmICggcmV0dXJuU2NvcGUhPW51bGwgJiYgcmV0dXJuU2NvcGUuZ2V0QXR0cmlidXRlKG5hbWUpIT1udWxsICkgeworCQkJc2NvcGUgPSByZXR1cm5TY29wZTsKKwkJfQorCQllbHNlIGlmICggcGFyYW1ldGVyU2NvcGUhPW51bGwgJiYgcGFyYW1ldGVyU2NvcGUuZ2V0QXR0cmlidXRlKG5hbWUpIT1udWxsICkgeworCQkJc2NvcGUgPSBwYXJhbWV0ZXJTY29wZTsKKwkJfQorCQllbHNlIHsKKwkJCUF0dHJpYnV0ZVNjb3BlIHJ1bGVQcm9wZXJ0aWVzU2NvcGUgPQorCQkJCVJ1bGVMYWJlbFNjb3BlLmdyYW1tYXJUeXBlVG9SdWxlUHJvcGVydGllc1Njb3BlW2dyYW1tYXIudHlwZV07CisJCQlpZiAoIHJ1bGVQcm9wZXJ0aWVzU2NvcGUuZ2V0QXR0cmlidXRlKG5hbWUpIT1udWxsICkgeworCQkJCXNjb3BlID0gcnVsZVByb3BlcnRpZXNTY29wZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2NvcGU7CisJfQorCisJLyoqIEZvciByZWZlcmVuY2VzIHRvIHRva2VucyByYXRoZXIgdGhhbiBieSBsYWJlbCBzdWNoIGFzICRJRCwgd2UKKwkgKiAgbmVlZCB0byBnZXQgdGhlIGV4aXN0aW5nIGxhYmVsIGZvciB0aGUgSUQgcmVmIG9yIGNyZWF0ZSBhIG5ldworCSAqICBvbmUuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TGFiZWwoU3RyaW5nIHJlZmRTeW1ib2wsCisJCQkJCQkJCSAgaW50IG91dGVyQWx0TnVtLAorCQkJCQkJCQkgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yKQorCXsKKwkJR3JhbW1hckFTVCB1bmlxdWVSZWZBU1Q7CisJCWlmICggZ3JhbW1hci50eXBlICE9IEdyYW1tYXIuTEVYRVIgJiYKKwkJCSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UocmVmZFN5bWJvbC5jaGFyQXQoMCkpICkKKwkJeworCQkJLy8gc3ltYm9sIGlzIGEgdG9rZW4KKwkJCUxpc3QgdG9rZW5SZWZzID0gZ2V0VG9rZW5SZWZzSW5BbHQocmVmZFN5bWJvbCwgb3V0ZXJBbHROdW0pOworCQkJdW5pcXVlUmVmQVNUID0gKEdyYW1tYXJBU1QpdG9rZW5SZWZzLmdldCgwKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIHN5bWJvbCBpcyBhIHJ1bGUKKwkJCUxpc3QgcnVsZVJlZnMgPSBnZXRSdWxlUmVmc0luQWx0KHJlZmRTeW1ib2wsIG91dGVyQWx0TnVtKTsKKwkJCXVuaXF1ZVJlZkFTVCA9IChHcmFtbWFyQVNUKXJ1bGVSZWZzLmdldCgwKTsKKwkJfQorCQlpZiAoIHVuaXF1ZVJlZkFTVC5jb2RlPT1udWxsICkgeworCQkJLy8gbm8gY29kZT8gIG11c3Qgbm90IGhhdmUgZ2VuJ2QgeWV0OyBmb3J3YXJkIHJlZgorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nIGxhYmVsTmFtZSA9IG51bGw7CisJCVN0cmluZyBleGlzdGluZ0xhYmVsTmFtZSA9CisJCQkoU3RyaW5nKXVuaXF1ZVJlZkFTVC5jb2RlLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKKwkJLy8gcmV1c2UgYW55IGxhYmVsIG9yIGxpc3QgbGFiZWwgaWYgaXQgZXhpc3RzCisJCWlmICggZXhpc3RpbmdMYWJlbE5hbWUhPW51bGwgKSB7CisJCQlsYWJlbE5hbWUgPSBleGlzdGluZ0xhYmVsTmFtZTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIGVsc2UgY3JlYXRlIG5ldyBsYWJlbAorCQkJbGFiZWxOYW1lID0gZ2VuZXJhdG9yLmNyZWF0ZVVuaXF1ZUxhYmVsKHJlZmRTeW1ib2wpOworCQkJQ29tbW9uVG9rZW4gbGFiZWwgPSBuZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuSUQsIGxhYmVsTmFtZSk7CisJCQlpZiAoIGdyYW1tYXIudHlwZSAhPSBHcmFtbWFyLkxFWEVSICYmCisJCQkJIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShyZWZkU3ltYm9sLmNoYXJBdCgwKSkgKQorCQkJeworCQkJCWdyYW1tYXIuZGVmaW5lVG9rZW5SZWZMYWJlbChuYW1lLCBsYWJlbCwgdW5pcXVlUmVmQVNUKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWdyYW1tYXIuZGVmaW5lUnVsZVJlZkxhYmVsKG5hbWUsIGxhYmVsLCB1bmlxdWVSZWZBU1QpOworCQkJfQorCQkJdW5pcXVlUmVmQVNULmNvZGUuYWRkKCJsYWJlbCIsIGxhYmVsTmFtZSk7CisJCX0KKwkJcmV0dXJuIGxhYmVsTmFtZTsKKwl9CisKKwkvKiogSWYgYSBydWxlIGhhcyBubyB1c2VyLWRlZmluZWQgcmV0dXJuIHZhbHVlcyBhbmQgbm9ib2R5IHJlZmVyZW5jZXMKKwkgKiAgaXQncyBzdGFydC9zdG9wIChwcmVkZWZpbmVkIGF0dHJpYnV0ZXMpLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiAgZGVmaW5lIGEgc3RydWN0OyBvdGhlcndpc2UgZm9yIG5vdyB3ZSBhc3N1bWUgYSBzdHJ1Y3QuICBBIHJ1bGUgYWxzbworCSAqICBoYXMgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBpZiB5b3UgYXJlIGJ1aWxkaW5nIHRyZWVzIG9yIHRlbXBsYXRlcy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXRIYXNNdWx0aXBsZVJldHVyblZhbHVlcygpIHsKKwkJcmV0dXJuCisJCQlyZWZlcmVuY2VkUHJlZGVmaW5lZFJ1bGVBdHRyaWJ1dGVzIHx8IGdyYW1tYXIuYnVpbGRBU1QoKSB8fAorCQkJZ3JhbW1hci5idWlsZFRlbXBsYXRlKCkgfHwKKwkJCShyZXR1cm5TY29wZSE9bnVsbCAmJiByZXR1cm5TY29wZS5hdHRyaWJ1dGVzLnNpemUoKT4xKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBnZXRIYXNTaW5nbGVSZXR1cm5WYWx1ZSgpIHsKKwkJcmV0dXJuCisJCQkhKHJlZmVyZW5jZWRQcmVkZWZpbmVkUnVsZUF0dHJpYnV0ZXMgfHwgZ3JhbW1hci5idWlsZEFTVCgpIHx8CisJCQkgIGdyYW1tYXIuYnVpbGRUZW1wbGF0ZSgpKSAmJgorCQkJCQkJCQkJICAgKHJldHVyblNjb3BlIT1udWxsICYmIHJldHVyblNjb3BlLmF0dHJpYnV0ZXMuc2l6ZSgpPT0xKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBnZXRIYXNSZXR1cm5WYWx1ZSgpIHsKKwkJcmV0dXJuCisJCQlyZWZlcmVuY2VkUHJlZGVmaW5lZFJ1bGVBdHRyaWJ1dGVzIHx8IGdyYW1tYXIuYnVpbGRBU1QoKSB8fAorCQkJZ3JhbW1hci5idWlsZFRlbXBsYXRlKCkgfHwKKwkJCShyZXR1cm5TY29wZSE9bnVsbCAmJiByZXR1cm5TY29wZS5hdHRyaWJ1dGVzLnNpemUoKT4wKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNpbmdsZVZhbHVlUmV0dXJuVHlwZSgpIHsKKwkJaWYgKCByZXR1cm5TY29wZSE9bnVsbCAmJiByZXR1cm5TY29wZS5hdHRyaWJ1dGVzLnNpemUoKT09MSApIHsKKwkJCUNvbGxlY3Rpb24gcmV0dmFsQXR0cnMgPSByZXR1cm5TY29wZS5hdHRyaWJ1dGVzLnZhbHVlcygpOworCQkJT2JqZWN0W10gamF2YVN1Y2tzID0gcmV0dmFsQXR0cnMudG9BcnJheSgpOworCQkJcmV0dXJuICgoQXR0cmlidXRlKWphdmFTdWNrc1swXSkudHlwZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFNpbmdsZVZhbHVlUmV0dXJuTmFtZSgpIHsKKwkJaWYgKCByZXR1cm5TY29wZSE9bnVsbCAmJiByZXR1cm5TY29wZS5hdHRyaWJ1dGVzLnNpemUoKT09MSApIHsKKwkJCUNvbGxlY3Rpb24gcmV0dmFsQXR0cnMgPSByZXR1cm5TY29wZS5hdHRyaWJ1dGVzLnZhbHVlcygpOworCQkJT2JqZWN0W10gamF2YVN1Y2tzID0gcmV0dmFsQXR0cnMudG9BcnJheSgpOworCQkJcmV0dXJuICgoQXR0cmlidXRlKWphdmFTdWNrc1swXSkubmFtZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiogR2l2ZW4gQHNjb3BlOjpuYW1lIHthY3Rpb259IGRlZmluZSBpdCBmb3IgdGhpcyBncmFtbWFyLiAgTGF0ZXIsCisJICogIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGFzayBmb3IgdGhlIGFjdGlvbnMgdGFibGUuCisJICovCisJcHVibGljIHZvaWQgZGVmaW5lTmFtZWRBY3Rpb24oR3JhbW1hckFTVCBhbXBlcnNhbmRBU1QsCisJCQkJCQkJCSAgR3JhbW1hckFTVCBuYW1lQVNULAorCQkJCQkJCQkgIEdyYW1tYXJBU1QgYWN0aW9uQVNUKQorCXsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGUgQCIrbmFtZUFTVC5nZXRUZXh0KCkrInsiK2FjdGlvbkFTVC5nZXRUZXh0KCkrIn0iKTsKKwkJU3RyaW5nIGFjdGlvbk5hbWUgPSBuYW1lQVNULmdldFRleHQoKTsKKwkJR3JhbW1hckFTVCBhID0gKEdyYW1tYXJBU1QpYWN0aW9ucy5nZXQoYWN0aW9uTmFtZSk7CisJCWlmICggYSE9bnVsbCApIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoCisJCQkJRXJyb3JNYW5hZ2VyLk1TR19BQ1RJT05fUkVERUZJTklUSU9OLGdyYW1tYXIsCisJCQkJbmFtZUFTVC5nZXRUb2tlbigpLG5hbWVBU1QuZ2V0VGV4dCgpKTsKKwkJfQorCQllbHNlIHsKKwkJCWFjdGlvbnMucHV0KGFjdGlvbk5hbWUsYWN0aW9uQVNUKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHRyYWNrSW5saW5lQWN0aW9uKEdyYW1tYXJBU1QgYWN0aW9uQVNUKSB7CisJCWlubGluZUFjdGlvbnMuYWRkKGFjdGlvbkFTVCk7CisJfQorCisJcHVibGljIE1hcDxTdHJpbmcsIEdyYW1tYXJBU1Q+IGdldEFjdGlvbnMoKSB7CisJCXJldHVybiBhY3Rpb25zOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGlvbnMoTWFwPFN0cmluZywgR3JhbW1hckFTVD4gYWN0aW9ucykgeworCQl0aGlzLmFjdGlvbnMgPSBhY3Rpb25zOworCX0KKworCS8qKiBTYXZlIHRoZSBvcHRpb24ga2V5L3ZhbHVlIHBhaXIgYW5kIHByb2Nlc3MgaXQ7IHJldHVybiB0aGUga2V5CisJICogIG9yIG51bGwgaWYgaW52YWxpZCBvcHRpb24uCisJICovCisJcHVibGljIFN0cmluZyBzZXRPcHRpb24oU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBUb2tlbiBvcHRpb25zU3RhcnRUb2tlbikgeworCQlpZiAoICFsZWdhbE9wdGlvbnMuY29udGFpbnMoa2V5KSApIHsKKwkJCUVycm9yTWFuYWdlci5ncmFtbWFyRXJyb3IoRXJyb3JNYW5hZ2VyLk1TR19JTExFR0FMX09QVElPTiwKKwkJCQkJCQkJCSAgZ3JhbW1hciwKKwkJCQkJCQkJCSAgb3B0aW9uc1N0YXJ0VG9rZW4sCisJCQkJCQkJCQkgIGtleSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAoIG9wdGlvbnM9PW51bGwgKSB7CisJCQlvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKKwkJfQorICAgICAgICBpZiAoIGtleS5lcXVhbHMoIm1lbW9pemUiKSAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscygidHJ1ZSIpICkgeworICAgICAgICAgICAgZ3JhbW1hci5hdExlYXN0T25lUnVsZU1lbW9pemVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGtleS5lcXVhbHMoImJhY2t0cmFjayIpICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCJ0cnVlIikgKSB7CisgICAgICAgICAgICBncmFtbWFyLmNvbXBvc2l0ZS5nZXRSb290R3JhbW1hcigpLmF0TGVhc3RPbmVCYWNrdHJhY2tPcHRpb24gPSB0cnVlOworICAgICAgICB9CisJCWlmICgga2V5LmVxdWFscygiayIpICkgeworCQkJZ3JhbW1hci5udW1iZXJPZk1hbnVhbExvb2thaGVhZE9wdGlvbnMrKzsKKwkJfQorCQkgb3B0aW9ucy5wdXQoa2V5LCB2YWx1ZSk7CisJCXJldHVybiBrZXk7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3B0aW9ucyhNYXAgb3B0aW9ucywgVG9rZW4gb3B0aW9uc1N0YXJ0VG9rZW4pIHsKKwkJaWYgKCBvcHRpb25zPT1udWxsICkgeworCQkJdGhpcy5vcHRpb25zID0gbnVsbDsKKwkJCXJldHVybjsKKwkJfQorCQlTZXQga2V5cyA9IG9wdGlvbnMua2V5U2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCVN0cmluZyBvcHRpb25OYW1lID0gKFN0cmluZykgaXQubmV4dCgpOworCQkJT2JqZWN0IG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQob3B0aW9uTmFtZSk7CisJCQlTdHJpbmcgc3RvcmVkPXNldE9wdGlvbihvcHRpb25OYW1lLCBvcHRpb25WYWx1ZSwgb3B0aW9uc1N0YXJ0VG9rZW4pOworCQkJaWYgKCBzdG9yZWQ9PW51bGwgKSB7CisJCQkJaXQucmVtb3ZlKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiogVXNlZCBkdXJpbmcgZ3JhbW1hciBpbXBvcnRzIHRvIHNlZSBpZiBzZXRzIG9mIHJ1bGVzIGludGVyc2VjdC4uLiBUaGlzCisJICogIG1ldGhvZCBhbmQgaGFzaENvZGUgdXNlIHRoZSBTdHJpbmcgbmFtZSBhcyB0aGUga2V5IGZvciBSdWxlIG9iamVjdHMuCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworCQlyZXR1cm4gdGhpcy5uYW1lLmVxdWFscygoKFJ1bGUpb3RoZXIpLm5hbWUpOworCX0KKwkgKi8KKworCS8qKiBVc2VkIGR1cmluZyBncmFtbWFyIGltcG9ydHMgdG8gc2VlIGlmIHNldHMgb2YgcnVsZXMgaW50ZXJzZWN0Li4uCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKKwl9CisJICogKi8KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IC8vIHVzZWQgZm9yIHRlc3RpbmcKKwkJcmV0dXJuICJbIitncmFtbWFyLm5hbWUrIi4iK25hbWUrIixpbmRleD0iK2luZGV4KyIsbGluZT0iK3RyZWUuZ2V0VG9rZW4oKS5nZXRMaW5lKCkrIl0iOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvUnVsZUxhYmVsU2NvcGUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvUnVsZUxhYmVsU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVkMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9SdWxlTGFiZWxTY29wZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Ub2tlbjsKKworcHVibGljIGNsYXNzIFJ1bGVMYWJlbFNjb3BlIGV4dGVuZHMgQXR0cmlidXRlU2NvcGUgeworCS8qKiBSdWxlcyBoYXZlIGEgcHJlZGVmaW5lZCBzZXQgb2YgYXR0cmlidXRlcyBhcyB3ZWxsIGFzCisJICogIHRoZSByZXR1cm4gdmFsdWVzLiAgJ3RleHQnIG5lZWRzIHRvIGJlIGNvbXB1dGVkIHRob3VnaCBzby4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEF0dHJpYnV0ZVNjb3BlIHByZWRlZmluZWRSdWxlUHJvcGVydGllc1Njb3BlID0KKwkJbmV3IEF0dHJpYnV0ZVNjb3BlKCJSdWxlUHJlZGVmaW5lZCIsbnVsbCkge3sKKwkJCWFkZEF0dHJpYnV0ZSgidGV4dCIsIG51bGwpOworCQkJYWRkQXR0cmlidXRlKCJzdGFydCIsIG51bGwpOworCQkJYWRkQXR0cmlidXRlKCJzdG9wIiwgbnVsbCk7CisJCQlhZGRBdHRyaWJ1dGUoInRyZWUiLCBudWxsKTsKKwkJCWFkZEF0dHJpYnV0ZSgic3QiLCBudWxsKTsKKwkJCWlzUHJlZGVmaW5lZFJ1bGVTY29wZSA9IHRydWU7CisJCX19OworCisJcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVTY29wZSBwcmVkZWZpbmVkVHJlZVJ1bGVQcm9wZXJ0aWVzU2NvcGUgPQorCQluZXcgQXR0cmlidXRlU2NvcGUoIlJ1bGVQcmVkZWZpbmVkIixudWxsKSB7eworCQkJYWRkQXR0cmlidXRlKCJ0ZXh0IiwgbnVsbCk7CisJCQlhZGRBdHRyaWJ1dGUoInN0YXJ0IiwgbnVsbCk7IC8vIG5vdGU6IG5vIHN0b3A7IG5vdCBtZWFuaW5nZnVsCisJCQlhZGRBdHRyaWJ1dGUoInRyZWUiLCBudWxsKTsKKwkJCWFkZEF0dHJpYnV0ZSgic3QiLCBudWxsKTsKKwkJCWlzUHJlZGVmaW5lZFJ1bGVTY29wZSA9IHRydWU7CisJCX19OworCisJcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVTY29wZSBwcmVkZWZpbmVkTGV4ZXJSdWxlUHJvcGVydGllc1Njb3BlID0KKwkJbmV3IEF0dHJpYnV0ZVNjb3BlKCJMZXhlclJ1bGVQcmVkZWZpbmVkIixudWxsKSB7eworCQkJYWRkQXR0cmlidXRlKCJ0ZXh0IiwgbnVsbCk7CisJCQlhZGRBdHRyaWJ1dGUoInR5cGUiLCBudWxsKTsKKwkJCWFkZEF0dHJpYnV0ZSgibGluZSIsIG51bGwpOworCQkJYWRkQXR0cmlidXRlKCJpbmRleCIsIG51bGwpOworCQkJYWRkQXR0cmlidXRlKCJwb3MiLCBudWxsKTsKKwkJCWFkZEF0dHJpYnV0ZSgiY2hhbm5lbCIsIG51bGwpOworCQkJYWRkQXR0cmlidXRlKCJzdGFydCIsIG51bGwpOworCQkJYWRkQXR0cmlidXRlKCJzdG9wIiwgbnVsbCk7CisJCQlhZGRBdHRyaWJ1dGUoImludCIsIG51bGwpOworCQkJaXNQcmVkZWZpbmVkTGV4ZXJSdWxlU2NvcGUgPSB0cnVlOworCQl9fTsKKworCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlU2NvcGVbXSBncmFtbWFyVHlwZVRvUnVsZVByb3BlcnRpZXNTY29wZSA9CisJCXsKKwkJCW51bGwsCisJCQlwcmVkZWZpbmVkTGV4ZXJSdWxlUHJvcGVydGllc1Njb3BlLAkvLyBMRVhFUgorCQkJcHJlZGVmaW5lZFJ1bGVQcm9wZXJ0aWVzU2NvcGUsCQkvLyBQQVJTRVIKKwkJCXByZWRlZmluZWRUcmVlUnVsZVByb3BlcnRpZXNTY29wZSwJLy8gVFJFRV9QQVJTRVIKKwkJCXByZWRlZmluZWRSdWxlUHJvcGVydGllc1Njb3BlLAkJLy8gQ09NQklORUQKKwkJfTsKKworCXB1YmxpYyBSdWxlIHJlZmVyZW5jZWRSdWxlOworCisJcHVibGljIFJ1bGVMYWJlbFNjb3BlKFJ1bGUgcmVmZXJlbmNlZFJ1bGUsIFRva2VuIGFjdGlvblRva2VuKSB7CisJCXN1cGVyKCJyZWZfIityZWZlcmVuY2VkUnVsZS5uYW1lLGFjdGlvblRva2VuKTsKKwkJdGhpcy5yZWZlcmVuY2VkUnVsZSA9IHJlZmVyZW5jZWRSdWxlOworCX0KKworCS8qKiBJZiB5b3UgbGFiZWwgYSBydWxlIHJlZmVyZW5jZSwgeW91IGNhbiBhY2Nlc3MgdGhhdCBydWxlJ3MKKwkgKiAgcmV0dXJuIHZhbHVlcyBhcyB3ZWxsIGFzIGFueSBwcmVkZWZpbmVkIGF0dHJpYnV0ZXMuCisJICovCisJcHVibGljIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKwkJQXR0cmlidXRlU2NvcGUgcnVsZVByb3BlcnRpZXNTY29wZSA9CisJCQlSdWxlTGFiZWxTY29wZS5ncmFtbWFyVHlwZVRvUnVsZVByb3BlcnRpZXNTY29wZVtncmFtbWFyLnR5cGVdOworCQlpZiAoIHJ1bGVQcm9wZXJ0aWVzU2NvcGUuZ2V0QXR0cmlidXRlKG5hbWUpIT1udWxsICkgeworCQkJcmV0dXJuIHJ1bGVQcm9wZXJ0aWVzU2NvcGUuZ2V0QXR0cmlidXRlKG5hbWUpOworCQl9CisKKwkJaWYgKCByZWZlcmVuY2VkUnVsZS5yZXR1cm5TY29wZSE9bnVsbCApIHsKKwkJCXJldHVybiByZWZlcmVuY2VkUnVsZS5yZXR1cm5TY29wZS5nZXRBdHRyaWJ1dGUobmFtZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9TdHJpcC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9TdHJpcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMTUyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL1N0cmlwLmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitwYWNrYWdlIG9yZy5hbnRsci50b29sOworCitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJ2M0xleGVyOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFOVExSdjNQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLkNvbW1vblRyZWU7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvcjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVXaXphcmQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIEEgYmFzaWMgYWN0aW9uIHN0cmlwcGVyLiAqLworcHVibGljIGNsYXNzIFN0cmlwIHsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVuYW1lOworICAgIHByb3RlY3RlZCBUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zOworICAgIHByb3RlY3RlZCBib29sZWFuIHRyZWVfb3B0aW9uID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBhcmdzW107CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaXAgcyA9IG5ldyBTdHJpcChhcmdzKTsKKyAgICAgICAgcy5wYXJzZUFuZFJld3JpdGUoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMudG9rZW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaXAoU3RyaW5nW10gYXJncykgeyB0aGlzLmFyZ3MgPSBhcmdzOyB9CisKKyAgICBwdWJsaWMgVG9rZW5SZXdyaXRlU3RyZWFtIGdldFRva2VuU3RyZWFtKCkgeyByZXR1cm4gdG9rZW5zOyB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUFuZFJld3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc0FyZ3MoYXJncyk7CisgICAgICAgIENoYXJTdHJlYW0gaW5wdXQgPSBudWxsOworICAgICAgICBpZiAoIGZpbGVuYW1lIT1udWxsICkgaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgZWxzZSBpbnB1dCA9IG5ldyBBTlRMUklucHV0U3RyZWFtKFN5c3RlbS5pbik7CisgICAgICAgIC8vIEJVSUxEIEFTVAorICAgICAgICBBTlRMUnYzTGV4ZXIgbGV4ID0gbmV3IEFOVExSdjNMZXhlcihpbnB1dCk7CisgICAgICAgIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4KTsKKyAgICAgICAgQU5UTFJ2M1BhcnNlciBnID0gbmV3IEFOVExSdjNQYXJzZXIodG9rZW5zKTsKKyAgICAgICAgQU5UTFJ2M1BhcnNlci5ncmFtbWFyRGVmX3JldHVybiByID0gZy5ncmFtbWFyRGVmKCk7CisgICAgICAgIENvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXIuZ2V0VHJlZSgpOworICAgICAgICBpZiAodHJlZV9vcHRpb24pIFN5c3RlbS5vdXQucHJpbnRsbih0LnRvU3RyaW5nVHJlZSgpKTsKKyAgICAgICAgcmV3cml0ZShnLmdldFRyZWVBZGFwdG9yKCksdCxnLmdldFRva2VuTmFtZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmV3cml0ZShUcmVlQWRhcHRvciBhZGFwdG9yLCBDb21tb25UcmVlIHQsIFN0cmluZ1tdIHRva2VuTmFtZXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2VuTmFtZXMpOworCisgICAgICAgIC8vIEFDVElPTlMgU1RVRkYKKyAgICAgICAgd2l6LnZpc2l0KHQsIEFOVExSdjNQYXJzZXIuQUNUSU9OLAorICAgICAgICAgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsgQUNUSU9OKHRva2VucywgKENvbW1vblRyZWUpdCk7IH0KKyAgICAgICAgICAgfSk7CisKKyAgICAgICAgd2l6LnZpc2l0KHQsIEFOVExSdjNQYXJzZXIuQVQsICAvLyBeKCdAJyBpZCBBQ1RJT04pIHJ1bGUgYWN0aW9ucworICAgICAgICAgICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsKKyAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUgYSA9IChDb21tb25UcmVlKXQ7CisgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGFjdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICBpZiAoIGEuZ2V0Q2hpbGRDb3VudCgpPT0yICkgYWN0aW9uID0gKENvbW1vblRyZWUpYS5nZXRDaGlsZCgxKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBhLmdldENoaWxkQ291bnQoKT09MyApIGFjdGlvbiA9IChDb21tb25UcmVlKWEuZ2V0Q2hpbGQoMik7CisgICAgICAgICAgICAgICAgICBpZiAoIGFjdGlvbi5nZXRUeXBlKCk9PUFOVExSdjNQYXJzZXIuQUNUSU9OICkgeworICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5kZWxldGUoYS5nZXRUb2tlblN0YXJ0SW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0VG9rZW5TdG9wSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgICAga2lsbFRyYWlsaW5nTmV3bGluZSh0b2tlbnMsIGFjdGlvbi5nZXRUb2tlblN0b3BJbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHdpei52aXNpdCh0LCBBTlRMUnYzUGFyc2VyLkFSRywgLy8gd2lwZSBydWxlIGFyZ3VtZW50cworICAgICAgICAgICAgICAgICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsKKyAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUgYSA9IChDb21tb25UcmVlKXQ7CisgICAgICAgICAgICAgICAgICBhID0gKENvbW1vblRyZWUpYS5nZXRDaGlsZCgwKTsKKyAgICAgICAgICAgICAgICAgIHRva2Vucy5kZWxldGUoYS50b2tlbi5nZXRUb2tlbkluZGV4KCkpOworICAgICAgICAgICAgICAgICAga2lsbFRyYWlsaW5nTmV3bGluZSh0b2tlbnMsIGEudG9rZW4uZ2V0VG9rZW5JbmRleCgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHdpei52aXNpdCh0LCBBTlRMUnYzUGFyc2VyLlJFVCwgLy8gd2lwZSBydWxlIHJldHVybiBkZWNsYXJhdGlvbnMKKyAgICAgICAgICAgIG5ldyBUcmVlV2l6YXJkLlZpc2l0b3IoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSBhID0gKENvbW1vblRyZWUpdDsKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSByZXQgPSAoQ29tbW9uVHJlZSlhLmdldENoaWxkKDApOworICAgICAgICAgICAgICAgICAgICB0b2tlbnMuZGVsZXRlKGEudG9rZW4uZ2V0VG9rZW5JbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC50b2tlbi5nZXRUb2tlbkluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB3aXoudmlzaXQodCwgQU5UTFJ2M1BhcnNlci5TRU1QUkVELCAvLyBjb21tZW50IG91dCBzZW1hbnRpYyBwcmVkaWNhdGVzCisgICAgICAgICAgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisgICAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUgYSA9IChDb21tb25UcmVlKXQ7CisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5yZXBsYWNlKGEudG9rZW4uZ2V0VG9rZW5JbmRleCgpLCAiLyoiK2EuZ2V0VGV4dCgpKyIqLyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB3aXoudmlzaXQodCwgQU5UTFJ2M1BhcnNlci5HQVRFRF9TRU1QUkVELCAvLyBjb21tZW50IG91dCBzZW1hbnRpYyBwcmVkaWNhdGVzCisgICAgICAgICAgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisgICAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUgYSA9IChDb21tb25UcmVlKXQ7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdG9rZW5zLnRvU3RyaW5nKGEuZ2V0VG9rZW5TdGFydEluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0VG9rZW5TdG9wSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5yZXBsYWNlKGEuZ2V0VG9rZW5TdGFydEluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0VG9rZW5TdG9wSW5kZXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8qIit0ZXh0KyIqLyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB3aXoudmlzaXQodCwgQU5UTFJ2M1BhcnNlci5TQ09QRSwgLy8gY29tbWVudCBzY29wZSBzcGVjcworICAgICAgICAgICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCkgeworICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGEgPSAoQ29tbW9uVHJlZSl0OworICAgICAgICAgICAgICAgICAgICB0b2tlbnMuZGVsZXRlKGEuZ2V0VG9rZW5TdGFydEluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRUb2tlblN0b3BJbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAga2lsbFRyYWlsaW5nTmV3bGluZSh0b2tlbnMsIGEuZ2V0VG9rZW5TdG9wSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7ICAgICAgICAKKyAgICAgICAgd2l6LnZpc2l0KHQsIEFOVExSdjNQYXJzZXIuQVJHX0FDVElPTiwgLy8gYXJncyByW3gseV0gLT4gXihyIFt4LHldKQorICAgICAgICAgICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCkgeworICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGEgPSAoQ29tbW9uVHJlZSl0OworICAgICAgICAgICAgICAgICAgICBpZiAoIGEuZ2V0UGFyZW50KCkuZ2V0VHlwZSgpPT1BTlRMUnYzUGFyc2VyLlJVTEVfUkVGICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLmRlbGV0ZShhLmdldFRva2VuU3RhcnRJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFRva2VuU3RvcEluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHdpei52aXNpdCh0LCBBTlRMUnYzUGFyc2VyLkxBQkVMX0FTU0lHTiwgLy8gXignPScgaWQgXihSVUxFX1JFRiBbYXJnXSkpLCAuLi4KKyAgICAgICAgICAgIG5ldyBUcmVlV2l6YXJkLlZpc2l0b3IoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSBhID0gKENvbW1vblRyZWUpdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhYS5oYXNBbmNlc3RvcihBTlRMUnYzUGFyc2VyLk9QVElPTlMpICkgeyAvLyBhdm9pZCBvcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGNoaWxkID0gKENvbW1vblRyZWUpYS5nZXRDaGlsZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5kZWxldGUoYS50b2tlbi5nZXRUb2tlbkluZGV4KCkpOyAgICAgLy8ga2lsbCAiaWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLmRlbGV0ZShjaGlsZC50b2tlbi5nZXRUb2tlbkluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIHdpei52aXNpdCh0LCBBTlRMUnYzUGFyc2VyLkxJU1RfTEFCRUxfQVNTSUdOLCAvLyBeKCcrPScgaWQgXihSVUxFX1JFRiBbYXJnXSkpLCAuLi4KKyAgICAgICAgICAgIG5ldyBUcmVlV2l6YXJkLlZpc2l0b3IoKSB7CisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIGEgPSAoQ29tbW9uVHJlZSl0OworICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSBjaGlsZCA9IChDb21tb25UcmVlKWEuZ2V0Q2hpbGQoMCk7CisgICAgICAgICAgICAgICAgICB0b2tlbnMuZGVsZXRlKGEudG9rZW4uZ2V0VG9rZW5JbmRleCgpKTsgICAgIC8vIGtpbGwgImlkKz0iCisgICAgICAgICAgICAgICAgICB0b2tlbnMuZGVsZXRlKGNoaWxkLnRva2VuLmdldFRva2VuSW5kZXgoKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisKKyAgICAgICAgLy8gQVNUIFNUVUZGCisgICAgICAgIHdpei52aXNpdCh0LCBBTlRMUnYzUGFyc2VyLlJFV1JJVEUsCisgICAgICAgICAgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCkgeworICAgICAgICAgICAgICAgICAgQ29tbW9uVHJlZSBhID0gKENvbW1vblRyZWUpdDsKKyAgICAgICAgICAgICAgICAgIENvbW1vblRyZWUgY2hpbGQgPSAoQ29tbW9uVHJlZSlhLmdldENoaWxkKDApOworICAgICAgICAgICAgICAgICAgaW50IHN0b3AgPSBjaGlsZC5nZXRUb2tlblN0b3BJbmRleCgpOworICAgICAgICAgICAgICAgICAgaWYgKCBjaGlsZC5nZXRUeXBlKCk9PUFOVExSdjNQYXJzZXIuU0VNUFJFRCApIHsKKyAgICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIHJldyA9IChDb21tb25UcmVlKWEuZ2V0Q2hpbGQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHJldy5nZXRUb2tlblN0b3BJbmRleCgpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgdG9rZW5zLmRlbGV0ZShhLnRva2VuLmdldFRva2VuSW5kZXgoKSwgc3RvcCk7CisgICAgICAgICAgICAgICAgICBraWxsVHJhaWxpbmdOZXdsaW5lKHRva2Vucywgc3RvcCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB3aXoudmlzaXQodCwgQU5UTFJ2M1BhcnNlci5ST09ULAorICAgICAgICAgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsKKyAgICAgICAgICAgICAgICAgICB0b2tlbnMuZGVsZXRlKCgoQ29tbW9uVHJlZSl0KS50b2tlbi5nZXRUb2tlbkluZGV4KCkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9KTsKKyAgICAgICAgd2l6LnZpc2l0KHQsIEFOVExSdjNQYXJzZXIuQkFORywKKyAgICAgICAgICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisgICAgICAgICAgICAgICAgICAgdG9rZW5zLmRlbGV0ZSgoKENvbW1vblRyZWUpdCkudG9rZW4uZ2V0VG9rZW5JbmRleCgpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIEFDVElPTihUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zLCBDb21tb25UcmVlIHQpIHsKKyAgICAgICAgQ29tbW9uVHJlZSBwYXJlbnQgPSAoQ29tbW9uVHJlZSl0LmdldFBhcmVudCgpOworICAgICAgICBpbnQgcHR5cGUgPSBwYXJlbnQuZ2V0VHlwZSgpOworICAgICAgICBpZiAoIHB0eXBlPT1BTlRMUnYzUGFyc2VyLlNDT1BFIHx8IC8vIHdlIGhhdmUgc3BlY2lhbCBydWxlcyBmb3IgdGhlc2UKKyAgICAgICAgICAgICBwdHlwZT09QU5UTFJ2M1BhcnNlci5BVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQUNUSU9OOiAiK3QuZ2V0VGV4dCgpKTsKKyAgICAgICAgQ29tbW9uVHJlZSByb290ID0gKENvbW1vblRyZWUpdC5nZXRBbmNlc3RvcihBTlRMUnYzUGFyc2VyLlJVTEUpOworICAgICAgICBpZiAoIHJvb3QhPW51bGwgKSB7CisgICAgICAgICAgICBDb21tb25UcmVlIHJ1bGUgPSAoQ29tbW9uVHJlZSlyb290LmdldENoaWxkKDApOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJ1bGU6ICIrcnVsZSk7CisgICAgICAgICAgICBpZiAoICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UocnVsZS5nZXRUZXh0KCkuY2hhckF0KDApKSApIHsKKyAgICAgICAgICAgICAgICB0b2tlbnMuZGVsZXRlKHQuZ2V0VG9rZW5TdGFydEluZGV4KCksdC5nZXRUb2tlblN0b3BJbmRleCgpKTsKKyAgICAgICAgICAgICAgICBraWxsVHJhaWxpbmdOZXdsaW5lKHRva2VucywgdC50b2tlbi5nZXRUb2tlbkluZGV4KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBraWxsVHJhaWxpbmdOZXdsaW5lKFRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMsIGludCBpbmRleCkgeworICAgICAgICBMaXN0IGFsbCA9IHRva2Vucy5nZXRUb2tlbnMoKTsKKyAgICAgICAgVG9rZW4gdG9rID0gKFRva2VuKWFsbC5nZXQoaW5kZXgpOworICAgICAgICBUb2tlbiBhZnRlciA9IChUb2tlbilhbGwuZ2V0KGluZGV4KzEpOworICAgICAgICBTdHJpbmcgd3MgPSBhZnRlci5nZXRUZXh0KCk7CisgICAgICAgIGlmICggd3Muc3RhcnRzV2l0aCgiXG4iKSApIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJraWxsaW5nIFdTIGFmdGVyIGFjdGlvbiIpOworICAgICAgICAgICAgaWYgKCB3cy5sZW5ndGgoKT4xICkgeworICAgICAgICAgICAgICAgIGludCBzcGFjZSA9IHdzLmluZGV4T2YoJyAnKTsKKyAgICAgICAgICAgICAgICBpbnQgdGFiID0gd3MuaW5kZXhPZignXHQnKTsKKyAgICAgICAgICAgICAgICBpZiAoIHdzLnN0YXJ0c1dpdGgoIlxuIikgJiYKKyAgICAgICAgICAgICAgICAgICAgIHNwYWNlPj0wIHx8IHRhYj49MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGRvIG5vdGhpbmcgaWYgXG4gKyBpbmRlbnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtpbGwgYWxsIFxuCisgICAgICAgICAgICAgICAgd3MgPSB3cy5yZXBsYWNlQWxsKCJcbiIsICIiKTsKKyAgICAgICAgICAgICAgICB0b2tlbnMucmVwbGFjZShhZnRlci5nZXRUb2tlbkluZGV4KCksIHdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRva2Vucy5kZWxldGUoYWZ0ZXIuZ2V0VG9rZW5JbmRleCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MpIHsKKwkJaWYgKCBhcmdzPT1udWxsIHx8IGFyZ3MubGVuZ3RoPT0wICkgeworCQkJaGVscCgpOworCQkJcmV0dXJuOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItdHJlZSIpKSB0cmVlX29wdGlvbiA9IHRydWU7CisJCQllbHNlIHsKKwkJCQlpZiAoYXJnc1tpXS5jaGFyQXQoMCkgIT0gJy0nKSB7CisJCQkJCS8vIE11c3QgYmUgdGhlIGdyYW1tYXIgZmlsZQorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGFyZ3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoZWxwKCkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInVzYWdlOiBqYXZhIG9yZy5hbnRsci50b29sLlN0cmlwIFthcmdzXSBmaWxlLmciKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC10cmVlICAgICAgcHJpbnQgb3V0IEFOVExSIGdyYW1tYXIgQVNUIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL1Rvb2xNZXNzYWdlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL1Rvb2xNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiZDVjMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL2phdmEvb3JnL2FudGxyL3Rvb2wvVG9vbE1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CisKKy8qKiBBIGdlbmVyaWMgbWVzc2FnZSBmcm9tIHRoZSB0b29sIHN1Y2ggYXMgImZpbGUgbm90IGZvdW5kIiB0eXBlIGVycm9yczsgdGhlcmUKKyAqICBpcyBubyByZWFzb24gdG8gY3JlYXRlIGEgc3BlY2lhbCBvYmplY3QgZm9yIGVhY2ggZXJyb3IgdW5saWtlIHRoZSBncmFtbWFyCisgKiAgZXJyb3JzLCB3aGljaCBtYXkgYmUgcmF0aGVyIGNvbXBsZXguCisgKgorICogIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBwYXNzIGluIGEgZmlsZW5hbWUgb3Igc29tZXRoaW5nIHRvIHNheSBpdCBpcyAiYmFkIi4KKyAqICBBbGxvdyBhIGdlbmVyaWMgb2JqZWN0IHRvIGJlIHBhc3NlZCBpbiBhbmQgdGhlIHN0cmluZyB0ZW1wbGF0ZSBjYW4gZGVhbAorICogIHdpdGgganVzdCBwcmludGluZyBpdCBvciBwdWxsaW5nIGEgcHJvcGVydHkgb3V0IG9mIGl0LgorICoKKyAqICBUT0RPIHdoYXQgdG8gZG8gd2l0aCBleGNlcHRpb25zPyAgV2FudCBzdGFjayB0cmFjZSBmb3IgaW50ZXJuYWwgZXJyb3JzPworICovCitwdWJsaWMgY2xhc3MgVG9vbE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKworCXB1YmxpYyBUb29sTWVzc2FnZShpbnQgbXNnSUQpIHsKKwkJc3VwZXIobXNnSUQsIG51bGwsIG51bGwpOworCX0KKwlwdWJsaWMgVG9vbE1lc3NhZ2UoaW50IG1zZ0lELCBPYmplY3QgYXJnKSB7CisJCXN1cGVyKG1zZ0lELCBhcmcsIG51bGwpOworCX0KKwlwdWJsaWMgVG9vbE1lc3NhZ2UoaW50IG1zZ0lELCBUaHJvd2FibGUgZSkgeworCQlzdXBlcihtc2dJRCk7CisJCXRoaXMuZSA9IGU7CisJfQorCXB1YmxpYyBUb29sTWVzc2FnZShpbnQgbXNnSUQsIE9iamVjdCBhcmcsIE9iamVjdCBhcmcyKSB7CisJCXN1cGVyKG1zZ0lELCBhcmcsIGFyZzIpOworCX0KKwlwdWJsaWMgVG9vbE1lc3NhZ2UoaW50IG1zZ0lELCBPYmplY3QgYXJnLCBUaHJvd2FibGUgZSkgeworCQlzdXBlcihtc2dJRCxhcmcsbnVsbCk7CisJCXRoaXMuZSA9IGU7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVNUIHN0ID0gZ2V0TWVzc2FnZVRlbXBsYXRlKCk7CisJCWlmICggYXJnIT1udWxsICkgeworCQkJc3QuYWRkKCJhcmciLCBhcmcpOworCQl9CisJCWlmICggYXJnMiE9bnVsbCApIHsKKwkJCXN0LmFkZCgiYXJnMiIsIGFyZzIpOworCQl9CisJCWlmICggZSE9bnVsbCApIHsKKwkJCXN0LmFkZCgiZXhjZXB0aW9uIiwgZSk7CisJCQlzdC5hZGQoInN0YWNrVHJhY2UiLCBlLmdldFN0YWNrVHJhY2UoKSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKHN0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9qYXZhL29yZy9hbnRsci90b29sL3NlcmlhbGl6ZS5nIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9zZXJpYWxpemUuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzcyYTUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vamF2YS9vcmcvYW50bHIvdG9vbC9zZXJpYWxpemUuZwpAQCAtMCwwICsxLDIzOCBAQAoraGVhZGVyIHsKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCXBhY2thZ2Ugb3JnLmFudGxyLnRvb2w7CisJaW1wb3J0IGphdmEudXRpbC4qOworCWltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuKjsKKwlpbXBvcnQgb3JnLmFudGxyLm1pc2MuKjsKKwlpbXBvcnQgamF2YS5pby4qOworfQorCitjbGFzcyBTZXJpYWxpemVyV2Fsa2VyIGV4dGVuZHMgVHJlZVBhcnNlcjsKKworb3B0aW9ucyB7CisJaW1wb3J0Vm9jYWIgPSBBTlRMUjsKKwlBU1RMYWJlbFR5cGUgPSAiR3JhbW1hckFTVCI7CisgICAgY29kZUdlbkJpdHNldFRlc3RUaHJlc2hvbGQ9OTk5OworfQorCit7CisgICAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJVG9rZW4gdG9rZW4gPSBudWxsOworCQlpZiAoIGV4IGluc3RhbmNlb2YgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uICkgeworCQkJdG9rZW4gPSAoKE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbilleCkudG9rZW47CisJCX0KKwkJZWxzZSBpZiAoIGV4IGluc3RhbmNlb2YgTm9WaWFibGVBbHRFeGNlcHRpb24gKSB7CisJCQl0b2tlbiA9ICgoTm9WaWFibGVBbHRFeGNlcHRpb24pZXgpLnRva2VuOworCQl9CisgICAgICAgIEVycm9yTWFuYWdlci5zeW50YXhFcnJvcigKKyAgICAgICAgICAgIEVycm9yTWFuYWdlci5NU0dfU1lOVEFYX0VSUk9SLAorICAgICAgICAgICAgZ3JhbW1hciwKKyAgICAgICAgICAgIHRva2VuLAorICAgICAgICAgICAgInNlcmlhbGl6ZTogIitleC50b1N0cmluZygpLAorICAgICAgICAgICAgZXgpOworICAgIH0KKworcHJvdGVjdGVkIEdyYW1tYXIgZ3JhbW1hcjsKK3Byb3RlY3RlZCBTdHJpbmcgY3VycmVudFJ1bGVOYW1lOworcHJvdGVjdGVkIEdyYW1tYXJTZXJpYWxpemVyIG91dDsKK30KKworZ3JhbW1hcltHcmFtbWFyU2VyaWFsaXplciBvdXRdCit7CisJdGhpcy5vdXQgPSBvdXQ7Cit9CisgICAgOiAgICMoIExFWEVSX0dSQU1NQVIgCWdyYW1tYXJTcGVjWyNncmFtbWFyLmdldFR5cGUoKV0gKQorCXwgICAjKCBQQVJTRVJfR1JBTU1BUiAgIGdyYW1tYXJTcGVjWyNncmFtbWFyLmdldFR5cGUoKV0gKQorCXwgICAjKCBUUkVFX0dSQU1NQVIgICAgIGdyYW1tYXJTcGVjWyNncmFtbWFyLmdldFR5cGUoKV0gKQorCXwgICAjKCBDT01CSU5FRF9HUkFNTUFSIGdyYW1tYXJTcGVjWyNncmFtbWFyLmdldFR5cGUoKV0gKQorICAgIDsKKworZ3JhbW1hclNwZWNbaW50IGd0b2tlbnR5cGVdCisJOglpZDpJRCB7b3V0LmdyYW1tYXIoZ3Rva2VudHlwZSwgI2lkLmdldFRleHQoKSk7fQorCQkoY210OkRPQ19DT01NRU5UKT8KKwkJKG9wdGlvbnNTcGVjKT8KKyAgICAgICAgKGRlbGVnYXRlR3JhbW1hcnMpPworICAgICAgICAodG9rZW5zU3BlYyk/CisgICAgICAgIChhdHRyU2NvcGUpKgorICAgICAgICAoQU1QRVJTQU5EKSogLy8gc2tpcCBhY3Rpb25zCisgICAgICAgIHJ1bGVzCisJOworCithdHRyU2NvcGUKKwk6CSMoICJzY29wZSIgSUQgQUNUSU9OICkKKwk7CisKK29wdGlvbnNTcGVjCisgICAgOiAgICMoIE9QVElPTlMgKG9wdGlvbikrICkKKyAgICA7CisKK29wdGlvbgorICAgIDogICAjKCBBU1NJR04gSUQgb3B0aW9uVmFsdWUgKQorICAgIDsKKworb3B0aW9uVmFsdWUKKyAgICA6ICAgaWQ6SUQKKyAgICB8ICAgczpTVFJJTkdfTElURVJBTAorICAgIHwgICBjOkNIQVJfTElURVJBTAorICAgIHwgICBpOklOVAorICAgIDsKKworY2hhclNldAorCTogICAjKCBDSEFSU0VUIGNoYXJTZXRFbGVtZW50ICkKKwk7CisKK2NoYXJTZXRFbGVtZW50CisJOiAgIGM6Q0hBUl9MSVRFUkFMCisJfCAgICMoIE9SIGMxOkNIQVJfTElURVJBTCBjMjpDSEFSX0xJVEVSQUwgKQorCXwgICAjKCBSQU5HRSBjMzpDSEFSX0xJVEVSQUwgYzQ6Q0hBUl9MSVRFUkFMICkKKwk7CisKK2RlbGVnYXRlR3JhbW1hcnMKKwk6CSMoICJpbXBvcnQiCisgICAgICAgICAgICAoICAgIyhBU1NJR04gSUQgSUQpCisgICAgICAgICAgICB8ICAgSUQKKyAgICAgICAgICAgICkrCisgICAgICAgICkKKwk7CisKK3Rva2Vuc1NwZWMKKwk6CSMoIFRPS0VOUyAoIHRva2VuU3BlYyApKyApCisJOworCit0b2tlblNwZWMKKwk6CXQ6VE9LRU5fUkVGCisJfAkjKCBBU1NJR04KKwkJICAgdDI6VE9LRU5fUkVGCisJCSAgICggczpTVFJJTkdfTElURVJBTAorCQkgICB8IGM6Q0hBUl9MSVRFUkFMCisJCSAgICkKKwkJICkKKwk7CisKK3J1bGVzCisgICAgOiAgICggcnVsZSApKworICAgIDsKKworcnVsZQorICAgIDogICAjKCBSVUxFIGlkOklEICAgICAgICAgICB7b3V0LnJ1bGUoI2lkLmdldFRleHQoKSk7fQorICAgICAgICAgICAobTptb2RpZmllcik/CisgICAgICAgICAgIChBUkcgKEFSR19BQ1RJT04pPykKKyAgICAgICAgICAgKFJFVCAoQVJHX0FDVElPTik/KQorICAgICAgICAgICAob3B0aW9uc1NwZWMpPworICAgICAgICAgICAocnVsZVNjb3BlU3BlYyk/CisgICAgICAgCSAgIChBTVBFUlNBTkQpKgorICAgICAgICAgICBiOmJsb2NrCisgICAgICAgICAgIChleGNlcHRpb25Hcm91cCk/CisgICAgICAgICAgIEVPUiAgICAgICAgICAgICAgICAgIHtvdXQuZW5kUnVsZSgpO30KKyAgICAgICAgICkKKyAgICA7CisKK21vZGlmaWVyCisJOgkicHJvdGVjdGVkIgorCXwJInB1YmxpYyIKKwl8CSJwcml2YXRlIgorCXwJImZyYWdtZW50IgorCTsKKworcnVsZVNjb3BlU3BlYworIAk6CSMoICJzY29wZSIgKEFDVElPTik/ICggSUQgKSogKQorIAk7CisKK2Jsb2NrCisgICAgOiAgICMoICBCTE9DSyB7b3V0LmJsb2NrKCNCTE9DSy5nZXROdW1iZXJPZkNoaWxkcmVuV2l0aFR5cGUoQUxUKSk7fQorICAgICAgICAgICAgKG9wdGlvbnNTcGVjKT8KKyAgICAgICAgICAgICggYWx0ZXJuYXRpdmUgcmV3cml0ZSApKworICAgICAgICAgICAgRU9CCisgICAgICAgICApCisgICAgOworCithbHRlcm5hdGl2ZQorICAgIDogICAjKCBBTFQge291dC5hbHQoI2FsdGVybmF0aXZlKTt9IChlbGVtZW50KSsgRU9BIHtvdXQuZW5kQWx0KCk7fSApCisgICAgOworCitleGNlcHRpb25Hcm91cAorCToJKCBleGNlcHRpb25IYW5kbGVyICkrIChmaW5hbGx5Q2xhdXNlKT8KKwl8CWZpbmFsbHlDbGF1c2UKKyAgICA7CisKK2V4Y2VwdGlvbkhhbmRsZXIKKyAgICA6ICAgICMoImNhdGNoIiBBUkdfQUNUSU9OIEFDVElPTikKKyAgICA7CisKK2ZpbmFsbHlDbGF1c2UKKyAgICA6ICAgICMoImZpbmFsbHkiIEFDVElPTikKKyAgICA7CisKK3Jld3JpdGUKKwk6CSggIyggUkVXUklURSAoU0VNUFJFRCk/IChBTFR8VEVNUExBVEV8QUNUSU9OfEVUQykgKSApKgorCTsKKworZWxlbWVudAorICAgIDogICAjKFJPT1QgZWxlbWVudCkKKyAgICB8ICAgIyhCQU5HIGVsZW1lbnQpCisgICAgfCAgIGF0b20KKyAgICB8ICAgIyhOT1Qge291dC5ub3QoKTt9IGVsZW1lbnQpCisgICAgfCAgICMoUkFOR0UgYXRvbSBhdG9tKQorICAgIHwgICAjKENIQVJfUkFOR0Uge291dC5yYW5nZSgpO30gYXRvbSBhdG9tKQorICAgIHwJIyhBU1NJR04gSUQgZWxlbWVudCkKKyAgICB8CSMoUExVU19BU1NJR04gSUQgZWxlbWVudCkKKyAgICB8ICAgZWJuZgorICAgIHwgICB0cmVlCisgICAgfCAgICMoIFNZTlBSRUQgYmxvY2sgKQorICAgIHwgICBGT1JDRURfQUNUSU9OCisgICAgfCAgIEFDVElPTgorICAgIHwgICBTRU1QUkVECisgICAgfCAgIFNZTl9TRU1QUkVECisgICAgfCAgIEJBQ0tUUkFDS19TRU1QUkVECisgICAgfCAgIEdBVEVEX1NFTVBSRUQKKyAgICB8ICAgRVBTSUxPTgorICAgIDsKKworZWJuZjogICBibG9jaworICAgIHwgICAjKCBPUFRJT05BTCBibG9jayApCisgICAgfCAgICMoIENMT1NVUkUgYmxvY2sgKQorICAgIHwgICAjKCBQT1NJVElWRV9DTE9TVVJFIGJsb2NrICkKKyAgICA7CisKK3RyZWU6ICAgIyhUUkVFX0JFR0lOICBlbGVtZW50IChlbGVtZW50KSogICkKKyAgICA7CisKK2F0b20KKyAgICA6ICAgIyggcnI6UlVMRV9SRUYgKHJhcmc6QVJHX0FDVElPTik/ICkgICAgIHtvdXQucnVsZVJlZigjcnIpO30KKyAgICB8ICAgIyggdDpUT0tFTl9SRUYgKHRhcmc6QVJHX0FDVElPTiApPyApICAgIHtvdXQudG9rZW4oI3QpO30KKyAgICB8ICAgYzpDSEFSX0xJVEVSQUwgICAgICAgICAgICAgICAgICAgICAgICAgIHtvdXQuY2hhckxpdGVyYWwoI2MpO30KKyAgICB8ICAgczpTVFJJTkdfTElURVJBTCAgICAgICAgICAgICAgICAgICAgICAgIHtvdXQuY2hhckxpdGVyYWwoI3MpO30KKyAgICB8ICAgV0lMRENBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvdXQud2lsZGNhcmQoI1dJTERDQVJEKTt9CisgICAgfCAgICMoRE9UIElEIGF0b20pIC8vIHNjb3BlIG92ZXJyaWRlIG9uIHJ1bGUKKyAgICA7CisKK2FzdF9zdWZmaXgKKwk6CVJPT1QKKwl8CUJBTkcKKwk7CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2FudGxyLnByb3BlcnRpZXMgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2FudGxyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlYjQyMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvYW50bHIucHJvcGVydGllcwpAQCAtMCwwICsxLDcgQEAKKyMgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaXMgdXNlZCBieSBBTlRMUiB0byBwaWNrIHVwIGFueSByZXNvdXJjZXMKKyMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IG1heSBvciBtYXkgbm90IGJlIHByb2R1Y2VkIGJ5CisjIHRoZSBidWlsZCBwcm9jZXNzLiBGb3IgaW5zdGFuY2UgdGhlIFRvb2wgdmVyc2lvbiBzdHJpbmcgaXMKKyMgZmlsdGVyZWQgaW50byB0aGlzIHJlc291cmNlIGZpbGUgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvCisjIGhhcmQgY29kZSB0aGlzIGludG8gVG9vbC5qYXZhIGFuZCBzbyBvbi4KKyMKK2FudGxyLnZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259ICR7YnVpbGROdW1iZXJ9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0FjdGlvblNjcmlwdC9BU1Quc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9BY3Rpb25TY3JpcHQvQVNULnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTBlZWRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9BY3Rpb25TY3JpcHQvQVNULnN0ZwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitncm91cCBBU1Q7CisKK0BvdXRwdXRGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPgorPGlmKCFUUkVFX1BBUlNFUik+PCEgdHJlZSBwYXJzZXIgd291bGQgYWxyZWFkeSBoYXZlIGltcG9ydGVkICE+CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qOzxcbj4KKzxlbmRpZj4KKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKzxAc3VwZXIubWVtYmVycygpPgorPHBhcnNlck1lbWJlcnMoKT4KKz4+CisKKy8qKiBBZGQgYW4gYWRhcHRvciBwcm9wZXJ0eSB0aGF0IGtub3dzIGhvdyB0byBidWlsZCB0cmVlcyAqLworcGFyc2VyTWVtYmVycygpIDo6PSA8PAorcHJvdGVjdGVkIHZhciBhZGFwdG9yOlRyZWVBZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7PFxuPgorb3ZlcnJpZGUgcHVibGljIGZ1bmN0aW9uIHNldCB0cmVlQWRhcHRvcihhZGFwdG9yOlRyZWVBZGFwdG9yKTp2b2lkIHsKKyAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4udHJlZUFkYXB0b3IgPSB0aGlzLmFkYXB0b3I7fT4KK30KK292ZXJyaWRlIHB1YmxpYyBmdW5jdGlvbiBnZXQgdHJlZUFkYXB0b3IoKTpUcmVlQWRhcHRvciB7CisgICAgcmV0dXJuIGFkYXB0b3I7Cit9Cis+PgorCitAcmV0dXJuU2NvcGUucnVsZVJldHVybk1lbWJlcnMoKSA6Oj0gPDwKKzxBU1RMYWJlbFR5cGU+IHRyZWU7CitwdWJsaWMgZnVuY3Rpb24gZ2V0IHRyZWUoKTpPYmplY3QgeyByZXR1cm4gdHJlZTsgfQorPj4KKworLyoqIEFkZCBhIHZhcmlhYmxlIHRvIHRyYWNrIHJ1bGUncyByZXR1cm4gQVNUICovCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZURlY2xhcmF0aW9ucygpPgordmFyIHJvb3RfMDo8QVNUTGFiZWxUeXBlPiA9IG51bGw7PFxuPgorPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPHN1cGVyLnJ1bGVMYWJlbERlZnMoKT4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMscnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGFiZWxzLAorICBydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXTp7dmFyIDxpdC5sYWJlbC50ZXh0Pl90cmVlOjxBU1RMYWJlbFR5cGU+PW51bGw7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzOnt2YXIgPGl0LmxhYmVsLnRleHQ+X3RyZWU6PEFTVExhYmVsVHlwZT49bnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e3ZhciBzdHJlYW1fPGl0PjpSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtPW5ldyBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtKGFkYXB0b3IsInRva2VuIDxpdD4iKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlcworICAgIDp7dmFyIHN0cmVhbV88aXQ+OlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbT1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgPGl0PiIpO307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworLyoqIFdoZW4gZG9pbmcgYXV0byBBU1QgY29uc3RydWN0aW9uLCB3ZSBtdXN0IGRlZmluZSBzb21lIHZhcmlhYmxlczsKKyAqICBUaGVzZSBzaG91bGQgYmUgdHVybmVkIG9mZiBpZiBkb2luZyByZXdyaXRlcy4gIFRoaXMgbXVzdCBiZSBhICJtb2RlIgorICogIGFzIGEgcnVsZSBjb3VsZCBoYXZlIGJvdGggcmV3cml0ZSBhbmQgQVNUIHdpdGhpbiB0aGUgc2FtZSBhbHRlcm5hdGl2ZQorICogIGJsb2NrLgorICovCitAYWx0LmRlY2xhcmF0aW9ucygpIDo6PSA8PAorPGlmKGF1dG9BU1QpPgorPGlmKG91dGVyQWx0KT4KKzxpZighcmV3cml0ZU1vZGUpPgorcm9vdF8wID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5uaWwoKSk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLy8gVCByIGEgYyBrIGkgbiBnICBSIHUgbCBlICBFIGwgZSBtIGUgbiB0IHMKKworLyoqIElEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlICovCit0b2tlblJlZlRyYWNrKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPiA8ISBUcmFjayBpbXBsaWVzIG5vIGF1dG8gQVNUIGNvbnN0cnVjdGlvbiE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnN0cmVhbV88dG9rZW4+LmFkZCg8bGFiZWw+KTs8XG4+Cis+PgorCisvKiogaWRzKz1JRCBhbmQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZTsgYWRkcyB0byBpZHMgKmFuZCoKKyAqICB0byB0aGUgdHJhY2tpbmcgbGlzdCBzdHJlYW1fSUQgZm9yIHVzZSBpbiB0aGUgcmV3cml0ZS4KKyAqLwordG9rZW5SZWZUcmFja0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgdHJhY2sgZm9yIHJld3JpdGUgKi8KK3Rva2VuUmVmUnVsZVJvb3RUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+c3RyZWFtXzx0b2tlbj4uYWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnN0cmVhbV88cnVsZS5uYW1lPi5hZGQoPGxhYmVsPi50cmVlKTsKKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLnRyZWUiLC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnN0cmVhbV88cnVsZT4uYWRkKDxsYWJlbD4udHJlZSk7Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290VHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLnRyZWUiLC4uLik+Cis+PgorCisvLyBSIGUgdyByIGkgdCBlCisKK3Jld3JpdGVDb2RlKAorCWFsdHMsIGRlc2NyaXB0aW9uLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIEFMTCByZWZlcmVuY2VkIGVsZW1lbnRzIHRvIHJpZ2h0IG9mIC0+CisJcmVmZXJlbmNlZFRva2VuTGFiZWxzLAorCXJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHMsCisJcmVmZXJlbmNlZFJ1bGVMYWJlbHMsCisJcmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzLAorICAgIHJlZmVyZW5jZWRXaWxkY2FyZExhYmVscywKKyAgICByZWZlcmVuY2VkV2lsZGNhcmRMaXN0TGFiZWxzLAorCXJld3JpdGVCbG9ja0xldmVsLCBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9Cis8PAorCisvLyBBU1QgUkVXUklURQorLy8gZWxlbWVudHM6IDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxhYmVsczogPHJlZmVyZW5jZWRSdWxlTGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8XG4+Cis8ZW5kaWY+Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzA7Cis8cmV3cml0ZUNvZGVMYWJlbHMoKT4KK3Jvb3RfMCA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IubmlsKCkpOworPGFsdHM6cmV3cml0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKzwhIGlmIHRyZWUgcGFyc2VyIGFuZCByZXdyaXRlPXRydWUgIT4KKzxpZihUUkVFX1BBUlNFUik+Cis8aWYocmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKSk7CitpbnB1dC5yZXBsYWNlQ2hpbGRyZW4oYWRhcHRvci5nZXRQYXJlbnQocmV0dmFsLnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmdldENoaWxkSW5kZXgocmV0dmFsLnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmdldENoaWxkSW5kZXgoX2xhc3QpLAorICAgICAgICAgICAgICAgICAgICAgIHJldHZhbC50cmVlKTsKKzxlbmRpZj4KKzxlbmRpZj4KKzwhIGlmIHBhcnNlciBvciB0cmVlLXBhcnNlciAmJiByZXdyaXRlIT10cnVlLCB3ZSBuZWVkIHRvIHNldCByZXN1bHQgIT4KKzxpZighVFJFRV9QQVJTRVIpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gcm9vdF8wOworPGVsc2U+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4udHJlZSA9IHJvb3RfMDsKKzxlbmRpZj4KKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPgorfQorPGVuZGlmPgorPj4KKworcmV3cml0ZUNvZGVMYWJlbHMoKSA6Oj0gPDwKKzxyZWZlcmVuY2VkVG9rZW5MYWJlbHMKKyAgICA6e3ZhciBzdHJlYW1fPGl0PjpSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtPW5ldyBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtKGFkYXB0b3IsInRva2VuIDxpdD4iLDxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzCisgICAgOnt2YXIgc3RyZWFtXzxpdD46UmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbT1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+IiwgbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzCisgICAgOnt2YXIgIHN0cmVhbV88aXQ+OlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbT1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsIndpbGRjYXJkIDxpdD4iLDxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkV2lsZGNhcmRMaXN0TGFiZWxzCisgICAgOnt2YXIgc3RyZWFtXzxpdD46UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtPW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwid2lsZGNhcmQgPGl0PiIsbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMYWJlbHMKKyAgICA6e3ZhciBzdHJlYW1fPGl0PjpSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW09bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIDxpdD4iLDxpdD4hPW51bGw/PGl0Pi50cmVlOm51bGwpO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMKKyAgICA6e3ZhciBzdHJlYW1fPGl0PjpSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW09bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJydWxlIDxpdD4iLGxpc3RfPGl0Pik7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworLyoqIEdlbmVyYXRlIGNvZGUgZm9yIGFuIG9wdGlvbmFsIHJld3JpdGUgYmxvY2s7IG5vdGUgaXQgdXNlcyB0aGUgZGVlcCByZWYnZCBlbGVtZW50CisgICogIGxpc3QgcmF0aGVyIHNoYWxsb3cgbGlrZSBvdGhlciBibG9ja3MuCisgICovCityZXdyaXRlT3B0aW9uYWxCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAvLyBlbGVtZW50cyBpbiBpbW1lZGlhdGVseSBibG9jazsgbm8gbmVzdGVkIGJsb2NrcworCWRlc2NyaXB0aW9uKSA6Oj0KKzw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK2lmICggPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dH07IHNlcGFyYXRvcj0ifHwiPiApIHsKKyAgICA8YWx0PgorfQorPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgc3RyZWFtXzxlbD4ucmVzZXQoKTs8XG4+fT4KKz4+CisKK3Jld3JpdGVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit3aGlsZSAoIDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dH07IHNlcGFyYXRvcj0ifHwiPiApIHsKKyAgICA8YWx0PgorfQorPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5yZXNldCgpOzxcbj59PgorPj4KKworcmV3cml0ZVBvc2l0aXZlQ2xvc3VyZUJsb2NrKAorCWFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBhbGwgbmVzdGVkIHJlZnMKKwlyZWZlcmVuY2VkRWxlbWVudHMsIC8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKK2lmICggISg8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+Lmhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4pICkgeworICAgIHRocm93IG5ldyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKCk7Cit9Cit3aGlsZSAoIDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dH07IHNlcGFyYXRvcj0ifHwiPiApIHsKKyAgICA8YWx0PgorfQorPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5yZXNldCgpOzxcbj59PgorPj4KKworcmV3cml0ZUFsdChhKSA6Oj0gPDwKKy8vIDxhLmRlc2NyaXB0aW9uPgorPGlmKGEucHJlZCk+CitpZiAoPGEucHJlZD4pIHsKKyAgICA8YS5hbHQ+Cit9PFxuPgorPGVsc2U+Cit7CisgICAgPGEuYWx0PgorfTxcbj4KKzxlbmRpZj4KKz4+CisKKy8qKiBGb3IgZW1wdHkgcmV3cml0ZXM6ICJyIDogLi4uIC0+IDsiICovCityZXdyaXRlRW1wdHlBbHQoKSA6Oj0gInJvb3RfMCA9IG51bGw7IgorCityZXdyaXRlVHJlZShyb290LGNoaWxkcmVuLGRlc2NyaXB0aW9uLGVuY2xvc2luZ1RyZWVMZXZlbCx0cmVlTGV2ZWwpIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit7Cit2YXIgcm9vdF88dHJlZUxldmVsPjo8QVNUTGFiZWxUeXBlPiA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IubmlsKCkpOworPHJvb3Q6cmV3cml0ZUVsZW1lbnQoKT4KKzxjaGlsZHJlbjpyZXdyaXRlRWxlbWVudCgpPgorYWRhcHRvci5hZGRDaGlsZChyb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTsKK308XG4+Cis+PgorCityZXdyaXRlRWxlbWVudExpc3QoZWxlbWVudHMpIDo6PSAiPGVsZW1lbnRzOnJld3JpdGVFbGVtZW50KCk+IgorCityZXdyaXRlRWxlbWVudChlKSA6Oj0gPDwKKzxAcHJlZ2VuKCk+Cis8ZS5lbD4KKz4+CisKKy8qKiBHZW4gSUQgb3IgSURbYXJnc10gKi8KK3Jld3JpdGVUb2tlblJlZih0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPik7PFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsPUlEICovCityZXdyaXRlVG9rZW5MYWJlbFJlZihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpKTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRsYWJlbCAuLi4pICovCityZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPikpOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSB3aGVyZSBsYWJlbCs9Li4uICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworLyoqIEdlbiBeKElEIC4uLikgb3IgXihJRFthcmdzXSAuLi4pICovCityZXdyaXRlVG9rZW5SZWZSb290KHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5iZWNvbWVSb290KDxjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KC4uLik+LCByb290Xzx0cmVlTGV2ZWw+KSk7PFxuPgorPj4KKworcmV3cml0ZUltYWdpbmFyeVRva2VuUmVmKGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLmJlY29tZVJvb3QoPGNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlPXRva2VuLCAuLi4pPiwgcm9vdF88dHJlZUxldmVsPikpOzxcbj4KKz4+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfMCA9IDxhY3Rpb24+Ozxcbj4KKz4+CisKKy8qKiBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGlzIHJ1bGUncyByb290IHRyZWU/ICBUaGlzCisgKiAgbGV0J3MgdXMgcmVmZXIgdG8gJHJ1bGUgdG8gbWVhbiBwcmV2aW91cyB2YWx1ZS4gIEkgYW0gcmV1c2luZyB0aGUKKyAqICB2YXJpYWJsZSAndHJlZScgc2l0dGluZyBpbiByZXR2YWwgc3RydWN0IHRvIGhvbGQgdGhlIHZhbHVlIG9mIHJvb3RfMCByaWdodAorICogIGJlZm9yZSBJIHNldCBpdCBkdXJpbmcgcmV3cml0ZXMuICBUaGUgYXNzaWduIHdpbGwgYmUgdG8gcmV0dmFsLnRyZWUuCisgKi8KK3ByZXZSdWxlUm9vdFJlZigpIDo6PSAicmV0dmFsIgorCityZXdyaXRlUnVsZVJlZihydWxlKSA6Oj0gPDwKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxydWxlPi5uZXh0VHJlZSgpKTs8XG4+Cis+PgorCityZXdyaXRlUnVsZVJlZlJvb3QocnVsZSkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5iZWNvbWVSb290KHN0cmVhbV88cnVsZT4ubmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPikpOzxcbj4KKz4+CisKK3Jld3JpdGVOb2RlQWN0aW9uKGFjdGlvbikgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxhY3Rpb24+KTs8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvblJvb3QoYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLmJlY29tZVJvb3QoPGFjdGlvbj4sIHJvb3RfPHRyZWVMZXZlbD4pKTs8XG4+Cis+PgorCisvKiogR2VuICRydWxlTGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIHJ1bGVMYWJlbD1ydWxlICovCityZXdyaXRlUnVsZUxhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmUm9vdChsYWJlbCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5iZWNvbWVSb290KHN0cmVhbV88bGFiZWw+Lm5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pKTs8XG4+Cis+PgorCityZXdyaXRlV2lsZGNhcmRMYWJlbFJlZihsYWJlbCkgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHRUcmVlKCkpOzxcbj4KKz4+CisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsLCBhcmdzKSAhPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorPEFTVExhYmVsVHlwZT4oYWRhcHRvci5jcmVhdGUoPHRva2VuVHlwZT4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj48aWYoIWFyZ3MpPiI8dG9rZW5UeXBlPiI8ZW5kaWY+KSkKKzxlbmRpZj4KKz4+CisKK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KHN0cmVhbV88dG9rZW4+Lm5leHRUb2tlbigpPGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj4pCis8ZWxzZT4KKzxpZihhcmdzKT4gPCEgbXVzdCBjcmVhdGUgbmV3IG5vZGUgZnJvbSBvbGQgIT4KK2FkYXB0b3IuY3JlYXRlKDx0b2tlbj4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lm5leHROb2RlKCkKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0FjdGlvblNjcmlwdC9BU1RQYXJzZXIuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9BY3Rpb25TY3JpcHQvQVNUUGFyc2VyLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk2Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9BY3Rpb25TY3JpcHQvQVNUUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIG5vcm1hbCBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgVGhlIHNpdHVhdGlvbiBpcyBub3QgdG9vIGJhZCBhcyByZXdyaXRlICgtPikgdXNhZ2UgbWFrZXMgXiBhbmQgIQorICogIGludmFsaWQuIFRoZXJlIGlzIG5vIGh1Z2UgZXhwbG9zaW9uIG9mIGNvbWJpbmF0aW9ucy4KKyAqLworZ3JvdXAgQVNUUGFyc2VyOworCitAcnVsZS5zZXRFcnJvclJldHVyblZhbHVlKCkgOjo9IDw8CityZXR2YWwudHJlZSA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuZXJyb3JOb2RlKGlucHV0LCBUb2tlbihyZXR2YWwuc3RhcnQpLCBpbnB1dC5MVCgtMSksIHJlKSk7Cis8ISB0cmFjZSgiPHJ1bGVOYW1lPiByZXR1cm5zICIrKChDb21tb25UcmVlKXJldHZhbC50cmVlKS50b1N0cmluZ1RyZWUoKSk7ICE+Cis+PgorCisvLyBUT0tFTiBBU1QgU1RVRkYKKworLyoqIElEIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPjsKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gIjxzdXBlci50b2tlblJlZiguLi4pPiIKKworLyoqIElEXiBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWZSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPjsKK3Jvb3RfMCA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfMCkpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBpZHMrPUlEISBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWZCYW5nQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggbGFiZWwrPVRPS0VOXiB3aGVuIG91dHB1dD1BU1QgYnV0IG5vdCByZXdyaXRlIGFsdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8vIFNFVCBBU1QKKworLy8gdGhlIG1hdGNoIHNldCBzdHVmZiBpcyBpbnRlcmVzdGluZyBpbiB0aGF0IGl0IHVzZXMgYW4gYXJndW1lbnQgbGlzdAorLy8gdG8gcGFzcyBjb2RlIHRvIHRoZSBkZWZhdWx0IG1hdGNoU2V0OyBhbm90aGVyIHBvc3NpYmxlIHdheSB0byBhbHRlcgorLy8gaW5oZXJpdGVkIGNvZGUuICBJIGRvbid0IHVzZSB0aGUgcmVnaW9uIHN0dWZmIGJlY2F1c2UgSSBuZWVkIHRvIHBhc3MKKy8vIGRpZmZlcmVudCBjaHVua3MgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4gIEkgZG9uJ3QgbGlrZSBtYWtpbmcKKy8vIHRoZSB0ZW1wbGF0ZSBuYW1lIGhhdmUgdGhlIG9wZXJhdG9yIGFzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGVzIGdldHMKKy8vIGxhcmdlIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGZsZXhpYmxlLS10aGlzIGlzIGFzIG9wcG9zZWQgdG8gaGF2aW5nCisvLyB0aGUgY29kZSBnZW5lcmF0b3IgY2FsbCBtYXRjaFNldCB0aGVuIGFkZCByb290IGNvZGUgb3IgcnVsZXJvb3QgY29kZQorLy8gcGx1cyBsaXN0IGxhYmVsIHBsdXMgLi4uICBUaGUgY29tYmluYXRpb25zIG1pZ2h0IHJlcXVpcmUgY29tcGxpY2F0ZWQKKy8vIHJhdGhlciB0aGFuIGp1c3QgYWRkZWQgb24gY29kZS4gIEludmVzdGlnYXRlIHRoYXQgcmVmYWN0b3Jpbmcgd2hlbgorLy8gSSBoYXZlIG1vcmUgdGltZS4KKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPHN1cGVyLm1hdGNoU2V0KC4uLiwgcG9zdG1hdGNoQ29kZT17PGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5hZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4pO30pPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUsdHJlZUxldmVsPSIwIikgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKz4+CisKK21hdGNoU2V0QmFuZyhzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gIjxzdXBlci5tYXRjaFNldCguLi4pPiIKKworLy8gbm90ZSB0aGVyZSBpcyBubyBtYXRjaFNldFRyYWNrIGJlY2F1c2UgLT4gcmV3cml0ZXMgZm9yY2Ugc2V0cyB0byBiZQorLy8gcGxhaW4gb2xkIGJsb2NrcyBvZiBhbHRzOiAoQXxCfC4uLnxDKQorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj08bGFiZWxUeXBlPihpbnB1dC5MVCgxKSk7PFxuPgorPGVuZGlmPgorPHN1cGVyLm1hdGNoU2V0KC4uLiwgcG9zdG1hdGNoQ29kZT17PGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5yb290XzAgPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLmJlY29tZVJvb3QoPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4sIHJvb3RfMCkpO30pPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPmFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+LnRyZWUpOworPj4KKworLyoqIHJ1bGUhIGlzIHNhbWUgYXMgbm9ybWFsIHJ1bGUgcmVmICovCitydWxlUmVmQmFuZyhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gIjxzdXBlci5ydWxlUmVmKC4uLik+IgorCisvKiogcnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnJvb3RfMCA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+LnRyZWUsIHJvb3RfMCkpOworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLnRyZWUiLC4uLik+Cis+PgorCisvKiogeCs9cnVsZSEgd2hlbiBvdXRwdXQ9QVNUIGlzIGEgcnVsZSByZWYgd2l0aCBsaXN0IGFkZGl0aW9uICovCitydWxlUmVmQmFuZ0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmQmFuZyguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIudHJlZSIsLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlXiAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIudHJlZSIsLi4uKT4KKz4+CisKKy8vIFdJTERDQVJEIEFTVAorCit3aWxkY2FyZChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxsYWJlbD5fdHJlZSA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuY3JlYXRlKDxsYWJlbD4pKTsKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKK3dpbGRjYXJkQmFuZyhsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSAiPHN1cGVyLndpbGRjYXJkKC4uLik+IgorCit3aWxkY2FyZFJ1bGVSb290KGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8c3VwZXIud2lsZGNhcmQoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5jcmVhdGUoPGxhYmVsPikpOworcm9vdF8wID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF8wKSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pIDwhIG5ldyBNZXRob2ROb2RlKElETGFiZWwpICE+Cis8ZWxzZT4KKzxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuY3JlYXRlKDxsYWJlbD4pKQorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8XG4+PGVuZGlmPgorcmV0dmFsLnRyZWUgPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApKTsKK2FkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCBUb2tlbihyZXR2YWwuc3RhcnQpLCBUb2tlbihyZXR2YWwuc3RvcCkpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9BY3Rpb25TY3JpcHQvQVNUVHJlZVBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0FjdGlvblNjcmlwdC9BU1RUcmVlUGFyc2VyLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk4ZDRmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9BY3Rpb25TY3JpcHQvQVNUVHJlZVBhcnNlci5zdGcKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGVzIGZvciBidWlsZGluZyBBU1RzIGR1cmluZyB0cmVlIHBhcnNpbmcuCisgKgorICogIERlYWwgd2l0aCBtYW55IGNvbWJpbmF0aW9ucy4gIERpbWVuc2lvbnMgYXJlOgorICogIEF1dG8gYnVpbGQgb3IgcmV3cml0ZQorICogICAgbm8gbGFiZWwsIGxhYmVsLCBsaXN0IGxhYmVsICAobGFiZWwvbm8tbGFiZWwgaGFuZGxlZCB0b2dldGhlcikKKyAqICAgIGNoaWxkLCByb290CisgKiAgICB0b2tlbiwgc2V0LCBydWxlLCB3aWxkY2FyZAorICoKKyAqICBFYWNoIGNvbWJpbmF0aW9uIGhhcyBpdHMgb3duIHRlbXBsYXRlIGV4Y2VwdCB0aGF0IGxhYmVsL25vIGxhYmVsCisgKiAgaXMgY29tYmluZWQgaW50byB0b2tlblJlZiwgcnVsZVJlZiwgLi4uCisgKi8KK2dyb3VwIEFTVFRyZWVQYXJzZXI7CisKKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBsYXN0IGVsZW1lbnQgbWF0Y2hlZCAqLworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KK3ZhciBfZmlyc3RfMDo8QVNUTGFiZWxUeXBlPiA9IG51bGw7Cit2YXIgX2xhc3Q6PEFTVExhYmVsVHlwZT4gPSBudWxsOzxcbj4KKz4+CisKKy8qKiBXaGF0IHRvIGVtaXQgd2hlbiB0aGVyZSBpcyBubyByZXdyaXRlIHJ1bGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYocmV3cml0ZU1vZGUpPgorcmV0dmFsLnRyZWUgPSA8QVNUTGFiZWxUeXBlPihfZmlyc3RfMCk7CitpZiAoIGFkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC50cmVlKSE9bnVsbCAmJiBhZGFwdG9yLmlzTmlsKCBhZGFwdG9yLmdldFBhcmVudChyZXR2YWwudHJlZSkgKSApCisgICAgcmV0dmFsLnRyZWUgPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLmdldFBhcmVudChyZXR2YWwudHJlZSkpOworPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyOyBvdmVycmlkZSBoZXJlIHRvCisgKiAgYWRkIHRyZWUgY29uc3RydWN0aW9uIGFjdGlvbnMuCisgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8CitfbGFzdCA9IDxBU1RMYWJlbFR5cGU+KGlucHV0LkxUKDEpKTsKK3sKK3ZhciBfc2F2ZV9sYXN0Xzx0cmVlTGV2ZWw+OjxBU1RMYWJlbFR5cGU+ID0gX2xhc3Q7Cit2YXIgX2ZpcnN0Xzx0cmVlTGV2ZWw+OjxBU1RMYWJlbFR5cGU+ID0gbnVsbDsKKzxpZighcmV3cml0ZU1vZGUpPgordmFyIHJvb3RfPHRyZWVMZXZlbD46PEFTVExhYmVsVHlwZT4gPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLm5pbCgpKTsKKzxlbmRpZj4KKzxyb290OmVsZW1lbnQoKT4KKzxpZihyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICk8ZW5kaWY+Cis8aWYocm9vdC5lbC5ydWxlKT4KK2lmICggX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+PT1udWxsICkgX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ID0gPHJvb3QuZWwubGFiZWw+LnRyZWU7Cis8ZWxzZT4KK2lmICggX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+PT1udWxsICkgX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ID0gPHJvb3QuZWwubGFiZWw+OworPGVuZGlmPgorPGVuZGlmPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmICggaW5wdXQuTEEoMSk9PVRva2VuQ29uc3RhbnRzLkRPV04gKSB7CisgICAgbWF0Y2hTdHJlYW0oaW5wdXQsIFRva2VuQ29uc3RhbnRzLkRPV04sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgbWF0Y2hTdHJlYW0oaW5wdXQsIFRva2VuQ29uc3RhbnRzLlVQLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK30KKzxlbHNlPgorbWF0Y2hTdHJlYW0oaW5wdXQsIFRva2VuQ29uc3RhbnRzLkRPV04sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGNoaWxkcmVuOmVsZW1lbnQoKT4KK21hdGNoU3RyZWFtKGlucHV0LCBUb2tlbkNvbnN0YW50cy5VUCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88ZW5jbG9zaW5nVHJlZUxldmVsPiwgcm9vdF88dHJlZUxldmVsPik7Cis8ZW5kaWY+CitfbGFzdCA9IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD47Cit9PFxuPgorPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICdjZXB0IGFkZAorICogIHNldHRpbmcgb2YgX2xhc3QKKyAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CitfbGFzdCA9IDxBU1RMYWJlbFR5cGU+KGlucHV0LkxUKDEpKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPj4KKworLyoqIElEIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gPEFTVExhYmVsVHlwZT4oaW5wdXQuTFQoMSkpOworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IG5ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSA8QVNUTGFiZWxUeXBlPihhZGFwdG9yLmR1cE5vZGUoPGxhYmVsPikpOworPGVuZGlmPjxcbj4KK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICk8ZW5kaWY+CitpZiAoIF9maXJzdF88dHJlZUxldmVsPj09bnVsbCApIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9IDxBU1RMYWJlbFR5cGU+KGlucHV0LkxUKDEpKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pKTsKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF88dHJlZUxldmVsPikpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIC4gd2lsZGNhcmQgYW5kIGF1dG8gZHVwIHRoZSBub2RlL3N1YnRyZWUgKi8KK3dpbGRjYXJkKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIud2lsZGNhcmQoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5kdXBUcmVlKDxsYWJlbD4pOworYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KK2lmICggX2ZpcnN0Xzx0cmVlTGV2ZWw+PT1udWxsICkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPjsKKzxlbmRpZj4KKz4+CisKKy8vIFNFVCBBU1QKKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSA8QVNUTGFiZWxUeXBlPihpbnB1dC5MVCgxKSk7Cis8c3VwZXIubWF0Y2hTZXQoLi4uLCBwb3N0bWF0Y2hDb2RlPXsKKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KSk7Cis8ZW5kaWY+PFxuPgorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KK30KKyk+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPG5vUmV3cml0ZSgpPiA8ISBzZXQgcmV0dXJuIHRyZWUgIT4KKz4+CisKK21hdGNoU2V0QmFuZyhzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gPEFTVExhYmVsVHlwZT4oaW5wdXQuTFQoMSkpOworPHN1cGVyLm1hdGNoU2V0KC4uLik+Cis+PgorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8c3VwZXIubWF0Y2hTZXQoLi4uLCBwb3N0bWF0Y2hDb2RlPXsKKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KSk7Cis8ZW5kaWY+PFxuPgorcm9vdF88dHJlZUxldmVsPiA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfPHRyZWVMZXZlbD4pKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cit9CispPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSA8QVNUTGFiZWxUeXBlPihpbnB1dC5MVCgxKSk7Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+LnRyZWUpOworPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgoraWYgKCBfZmlyc3RfPHRyZWVMZXZlbD49PW51bGwgKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+LnRyZWU7Cis8ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi50cmVlIiwuLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmUnVsZVJvb3QocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9IDxBU1RMYWJlbFR5cGU+KGlucHV0LkxUKDEpKTsKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+cm9vdF88dHJlZUxldmVsPiA9IDxBU1RMYWJlbFR5cGU+KGFkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+LnRyZWUsIHJvb3RfPHRyZWVMZXZlbD4pKTsKKzxlbmRpZj4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIudHJlZSIsLi4uKT4KKz4+CisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gPEFTVExhYmVsVHlwZT4oaW5wdXQuTFQoMSkpOworPHN1cGVyLnJ1bGVSZWZUcmFjayguLi4pPgorPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSA8QVNUTGFiZWxUeXBlPihpbnB1dC5MVCgxKSk7Cis8c3VwZXIucnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9IDxBU1RMYWJlbFR5cGU+KGlucHV0LkxUKDEpKTsKKzxzdXBlci5ydWxlUmVmUm9vdFRyYWNrKC4uLik+Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9IDxBU1RMYWJlbFR5cGU+KGlucHV0LkxUKDEpKTsKKzxzdXBlci5ydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworLyoqIFN0cmVhbXMgZm9yIHRva2VuIHJlZnMgYXJlIHRyZWUgbm9kZXMgbm93OyBvdmVycmlkZSB0bworICogIGNoYW5nZSBuZXh0VG9rZW4gdG8gbmV4dE5vZGUuCisgKi8KK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLHNjb3BlKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+CituZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPihzdHJlYW1fPHRva2VuPi5uZXh0Tm9kZSgpKQorPGVsc2U+CitzdHJlYW1fPHRva2VuPi5uZXh0Tm9kZSgpCis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PFxuPjxlbmRpZj4KK3JldHZhbC50cmVlID0gPEFTVExhYmVsVHlwZT4oYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQWN0aW9uU2NyaXB0L0FjdGlvblNjcmlwdC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0FjdGlvblNjcmlwdC9BY3Rpb25TY3JpcHQuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODdhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0FjdGlvblNjcmlwdC9BY3Rpb25TY3JpcHQuc3RnCkBAIC0wLDAgKzEsMTI4OSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitncm91cCBBY3Rpb25TY3JpcHQ7CisKK2FzVHlwZUluaXRNYXAgOjo9IFsKKwkiaW50IjoiMCIsCisJInVpbnQiOiIwIiwKKwkiTnVtYmVyIjoiMC4wIiwKKwkiQm9vbGVhbiI6ImZhbHNlIiwKKwlkZWZhdWx0OiJudWxsIiAvLyBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGF0b21pYyB0eXBlCitdCisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqLworb3V0cHV0RmlsZShMRVhFUixQQVJTRVIsVFJFRV9QQVJTRVIsIGFjdGlvblNjb3BlLCBhY3Rpb25zLAorICAgICAgICAgICBkb2NDb21tZW50LCByZWNvZ25pemVyLAorICAgICAgICAgICBuYW1lLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLAorCSAgIGJpdHNldHMsIGJ1aWxkVGVtcGxhdGUsIGJ1aWxkQVNULCByZXdyaXRlTW9kZSwgcHJvZmlsZSwKKwkgICBiYWNrdHJhY2tpbmcsIHN5bnByZWRzLCBtZW1vaXplLCBudW1SdWxlcywKKwkgICBmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsIHRyYWNlLAorCSAgIHNjb3Blcywgc3VwZXJDbGFzcywgbGl0ZXJhbHMpIDo6PQorPDwKKy8vICRBTlRMUiA8QU5UTFJWZXJzaW9uPiA8ZmlsZU5hbWU+IDxnZW5lcmF0ZWRUaW1lc3RhbXA+CitwYWNrYWdlPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wYWNrYWdlKT4gPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wYWNrYWdlPjxlbmRpZj4geworICAgIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyPgorICAgIDxAaW1wb3J0cz4KK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworPGlmKFRSRUVfUEFSU0VSKT4KKyAgICBpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qOworPGVuZGlmPgorICAgIDxAZW5kPgorCisgICAgPGRvY0NvbW1lbnQ+CisgICAgPHJlY29nbml6ZXI+Cit9Cis+PgorCitsZXhlcihncmFtbWFyLCBuYW1lLCB0b2tlbnMsIHNjb3BlcywgcnVsZXMsIG51bVJ1bGVzLCBsYWJlbFR5cGU9IlRva2VuIiwKKyAgICAgIGZpbHRlck1vZGUsIHN1cGVyQ2xhc3M9IkxleGVyIikgOjo9IDw8CitwdWJsaWMgY2xhc3MgPGdyYW1tYXIucmVjb2duaXplck5hbWU+IGV4dGVuZHMgPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zdXBlckNsYXNzKT48YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN1cGVyQ2xhc3M+PGVsc2U+PEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD48ZW5kaWY+IHsKKyAgICA8dG9rZW5zOntwdWJsaWMgc3RhdGljIGNvbnN0IDxpdC5uYW1lPjppbnQ9PGl0LnR5cGU+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxzY29wZXM6ezxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlPWl0KT48ZW5kaWY+fT4KKyAgICA8YWN0aW9ucy5sZXhlci5tZW1iZXJzPgorCisgICAgLy8gZGVsZWdhdGVzCisgICAgPGdyYW1tYXIuZGVsZWdhdGVzOgorICAgICAgICAge2d8cHVibGljIHZhciA8ZzpkZWxlZ2F0ZU5hbWUoKT46PGcucmVjb2duaXplck5hbWU+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIC8vIGRlbGVnYXRvcnMKKyAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOgorICAgICAgICAge2d8cHVibGljIHZhciA8ZzpkZWxlZ2F0ZU5hbWUoKT46PGcucmVjb2duaXplck5hbWU+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxsYXN0KGdyYW1tYXIuZGVsZWdhdG9ycyk6e2d8cHVibGljIHZhciBnUGFyZW50OjxnLnJlY29nbml6ZXJOYW1lPjt9PgorCisgICAgcHVibGljIGZ1bmN0aW9uIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfDxnOmRlbGVnYXRlTmFtZSgpPjo8Zy5yZWNvZ25pemVyTmFtZT4sIH0+aW5wdXQ6Q2hhclN0cmVhbSA9IG51bGwsIHN0YXRlOlJlY29nbml6ZXJTaGFyZWRTdGF0ZSA9IG51bGwpIHsKKyAgICAgICAgc3VwZXIoaW5wdXQsIHN0YXRlKTsKKyAgICAgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBQ3RvcigpPgorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgICAgICAgIHRoaXMuc3RhdGUucnVsZU1lbW8gPSBuZXcgQXJyYXkoPG51bVJ1bGVzPisxKTs8XG4+IDwhIGluZGV4IGZyb20gMS4ubiAhPgorPGVuZGlmPgorPGVuZGlmPgorICAgICAgICA8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisgICAgICAgICB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KDx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfDxwOmRlbGVnYXRlTmFtZSgpPiwgfT50aGlzLCBpbnB1dCwgdGhpcy5zdGF0ZSk7fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3x0aGlzLjxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O30+CisgICAgfQorICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXQgZ3JhbW1hckZpbGVOYW1lKCk6U3RyaW5nIHsgcmV0dXJuICI8ZmlsZU5hbWU+IjsgfQorCis8aWYoZmlsdGVyTW9kZSk+CisgICAgPGZpbHRlcmluZ05leHRUb2tlbigpPgorPGVuZGlmPgorICAgIDxydWxlczsgc2VwYXJhdG9yPSJcblxuIj4KKworICAgIDxzeW5wcmVkczp7cCB8IDxsZXhlclN5bnByZWQocCk+fT4KKworICAgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCit9Cis+PgorCisvKiogQSBvdmVycmlkZSBvZiBMZXhlci5uZXh0VG9rZW4oKSB0aGF0IGJhY2t0cmFja3Mgb3ZlciBtVG9rZW5zKCkgbG9va2luZworICogIGZvciBtYXRjaGVzLiAgTm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCB1cG9uIGVycm9yOyBqdXN0IHJld2luZCwgY29uc3VtZQorICogIGEgdG9rZW4gYW5kIHRoZW4gdHJ5IGFnYWluLiAgYmFja3RyYWNraW5nIG5lZWRzIHRvIGJlIHNldCBhcyB3ZWxsLgorICogIE1ha2UgcnVsZSBtZW1vaXphdGlvbiBoYXBwZW4gb25seSBhdCBsZXZlbHMgYWJvdmUgMSBhcyB3ZSBzdGFydCBtVG9rZW5zCisgKiAgYXQgYmFja3RyYWNraW5nPT0xLgorICovCitmaWx0ZXJpbmdOZXh0VG9rZW4oKSA6Oj0gPDwKK3B1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBuZXh0VG9rZW4oKTpUb2tlbiB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09Q2hhclN0cmVhbUNvbnN0YW50cy5FT0YgKSB7CisgICAgICAgICAgICByZXR1cm4gVG9rZW5Db25zdGFudHMuRU9GX1RPS0VOOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3RhdGUudG9rZW4gPSBudWxsOworCSAgICB0aGlzLnN0YXRlLmNoYW5uZWwgPSBUb2tlbkNvbnN0YW50cy5ERUZBVUxUX0NIQU5ORUw7CisgICAgICAgIHRoaXMuc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LmluZGV4OworICAgICAgICB0aGlzLnN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSBpbnB1dC5jaGFyUG9zaXRpb25JbkxpbmU7CisgICAgICAgIHRoaXMuc3RhdGUudG9rZW5TdGFydExpbmUgPSBpbnB1dC5saW5lOworCSAgICB0aGlzLnN0YXRlLnRleHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIG06aW50ID0gaW5wdXQubWFyaygpOworICAgICAgICAgICAgdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc9MTsgPCEgbWVhbnMgd2Ugd29uJ3QgdGhyb3cgc2xvdyBleGNlcHRpb24gIT4KKyAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICAgICAgbVRva2VucygpOworICAgICAgICAgICAgdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc9MDsKKyAgICAgICAgICAgIDwhIG1Ub2tlbnMgYmFja3RyYWNrcyB3aXRoIHN5bnByZWQgYXQgYmFja3RyYWNraW5nPT0yCisgICAgICAgICAgICAgICBhbmQgd2Ugc2V0IHRoZSBzeW5wcmVkZ2F0ZSB0byBhbGxvdyBhY3Rpb25zIGF0IGxldmVsIDEuICE+CisgICAgICAgICAgICBpZiAoIHRoaXMuc3RhdGUuZmFpbGVkICkgeworICAgICAgICAgICAgICAgIGlucHV0LnJld2luZFRvKG0pOworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsgPCEgYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluICE+CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbWl0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHJlOlJlY29nbml0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIocmUpOworICAgICAgICB9CisgICAgfQorICAgIC8vIE5vdCByZWFjaGVkIC0gRm9yIEFjdGlvblNjcmlwdCBjb21waWxlcgorICAgIHRocm93IG5ldyBFcnJvcigpOworfQorCitwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gbWVtb2l6ZShpbnB1dDpJbnRTdHJlYW0sCisJCXJ1bGVJbmRleDppbnQsCisJCXJ1bGVTdGFydEluZGV4OmludCk6dm9pZAoreworaWYgKCB0aGlzLnN0YXRlLmJhY2t0cmFja2luZz4xICkgc3VwZXIubWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCk7Cit9CisKK3B1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBhbHJlYWR5UGFyc2VkUnVsZShpbnB1dDpJbnRTdHJlYW0sIHJ1bGVJbmRleDppbnQpOkJvb2xlYW4geworaWYgKCB0aGlzLnN0YXRlLmJhY2t0cmFja2luZz4xICkgcmV0dXJuIHN1cGVyLmFscmVhZHlQYXJzZWRSdWxlKGlucHV0LCBydWxlSW5kZXgpOworcmV0dXJuIGZhbHNlOworfQorPj4KKworYWN0aW9uR2F0ZSgpIDo6PSAidGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc9PTAiCisKK2ZpbHRlcmluZ0FjdGlvbkdhdGUoKSA6Oj0gInRoaXMuc3RhdGUuYmFja3RyYWNraW5nPT0xIgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcGFyc2VyICovCitnZW5lcmljUGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsCisgICAgICAgICAgICAgIGJpdHNldHMsIGlucHV0U3RyZWFtVHlwZSwgc3VwZXJDbGFzcywgZmlsdGVyTW9kZSwKKyAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPSJPYmplY3QiLCBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSkgOjo9IDw8CitwdWJsaWMgY2xhc3MgPGdyYW1tYXIucmVjb2duaXplck5hbWU+IGV4dGVuZHMgPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zdXBlckNsYXNzKT48YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN1cGVyQ2xhc3M+PGVsc2U+PEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD48ZW5kaWY+IHsKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgdG9rZW5OYW1lczpBcnJheSA9IFsKKyAgICAgICAgIlw8aW52YWxpZD4iLCAiXDxFT1I+IiwgIlw8RE9XTj4iLCAiXDxVUD4iLCA8dG9rZW5OYW1lczsgc2VwYXJhdG9yPSIsICI+CisgICAgXTs8XG4+Cis8ZW5kaWY+CisgICAgPHRva2Vuczp7cHVibGljIHN0YXRpYyBjb25zdCA8aXQubmFtZT46aW50PTxpdC50eXBlPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworICAgIC8vIGRlbGVnYXRlcworICAgIDxncmFtbWFyLmRlbGVnYXRlczoKKyAgICAgICAgIHtnfHB1YmxpYyB2YXIgPGc6ZGVsZWdhdGVOYW1lKCk+OjxnLnJlY29nbml6ZXJOYW1lPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAvLyBkZWxlZ2F0b3JzCisgICAgPGdyYW1tYXIuZGVsZWdhdG9yczoKKyAgICAgICAgIHtnfHB1YmxpYyB2YXIgPGc6ZGVsZWdhdGVOYW1lKCk+OjxnLnJlY29nbml6ZXJOYW1lPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfHB1YmxpYyB2YXIgZ1BhcmVudDo8Zy5yZWNvZ25pemVyTmFtZT47fT4KKworICAgIDxzY29wZXM6ezxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlPWl0KT48ZW5kaWY+fT4KKyAgICA8QG1lbWJlcnM+CisgICA8ISBXQVJOSU5HLiBidWcgaW4gU1Q6IHRoaXMgaXMgY3V0LW4tcGFzdGUgaW50byBEYmcuc3RnICE+CisgICAgcHVibGljIGZ1bmN0aW9uIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfDxnOmRlbGVnYXRlTmFtZSgpPjo8Zy5yZWNvZ25pemVyTmFtZT4sIH0+aW5wdXQ6PGlucHV0U3RyZWFtVHlwZT4sIHN0YXRlOlJlY29nbml6ZXJTaGFyZWRTdGF0ZSA9IG51bGwpIHsKKyAgICAgICAgc3VwZXIoaW5wdXQsIHN0YXRlKTsKKyAgICAgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBQ3RvcigpPgorICAgICAgICA8cGFyc2VyQ3RvckJvZHkoKT4KKyAgICAgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPig8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHw8cDpkZWxlZ2F0ZU5hbWUoKT4sIH0+dGhpcywgaW5wdXQsIHRoaXMuc3RhdGUpO307IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8Z3JhbW1hci5pbmRpcmVjdERlbGVnYXRlczp7ZyB8IDxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnLmRlbGVnYXRvcjpkZWxlZ2F0ZU5hbWUoKT4uPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfGdQYXJlbnQgPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fT4KKyAgICB9CisgICAgPEBlbmQ+CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IHRva2VuTmFtZXMoKTpBcnJheSB7IHJldHVybiA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnRva2VuTmFtZXM7IH0KKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0IGdyYW1tYXJGaWxlTmFtZSgpOlN0cmluZyB7IHJldHVybiAiPGZpbGVOYW1lPiI7IH0KKworICAgIDxtZW1iZXJzPgorCisgICAgPHJ1bGVzOyBzZXBhcmF0b3I9IlxuXG4iPgorCisgICAgPCEgZ2VuZXJhdGUgcnVsZS9tZXRob2QgZGVmaW5pdGlvbnMgZm9yIGltcG9ydGVkIHJ1bGVzIHNvIHRoZXkKKyAgICAgICBhcHBlYXIgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIHJlY29nbml6ZXIuICE+CisgICAgICAgLy8gRGVsZWdhdGVkIHJ1bGVzCisgICAgPGdyYW1tYXIuZGVsZWdhdGVkUnVsZXM6e3J1bGVEZXNjcmlwdG9yfAorICAgICAgICBwdWJsaWMgZnVuY3Rpb24gPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTo8cmV0dXJuVHlwZSgpPiBceyA8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPnJldHVybiA8ZW5kaWY+PHJ1bGVEZXNjcmlwdG9yLmdyYW1tYXI6ZGVsZWdhdGVOYW1lKCk+LjxydWxlRGVzY3JpcHRvci5uYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUuYXR0cmlidXRlczp7YXw8YS5uYW1lPn07IHNlcGFyYXRvcj0iLCAiPik7IFx9fTsgc2VwYXJhdG9yPSJcbiI+CisKKyAgICA8c3lucHJlZHM6e3AgfCA8c3lucHJlZChwKT59PgorCisgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+IDwhIGR1bXAgdGFibGVzIGZvciBhbGwgREZBICE+CisKKyAgICA8Yml0c2V0czpiaXRzZXQobmFtZT17Rk9MTE9XXzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0sCisgICAgICAgICAgICAgICAgICAgIHdvcmRzNjQ9aXQuYml0cyk+Cit9Cis+PgorCitwYXJzZXJDdG9yQm9keSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Cit0aGlzLnN0YXRlLnJ1bGVNZW1vID0gbmV3IEFycmF5KDxsZW5ndGgoZ3JhbW1hci5hbGxJbXBvcnRlZFJ1bGVzKT4rMSk7PFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKzxncmFtbWFyLmRlbGVnYXRvcnM6Cisge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitwYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywgQVNUTGFiZWxUeXBlPSJPYmplY3QiLCBzdXBlckNsYXNzPSJQYXJzZXIiLCBsYWJlbFR5cGU9IlRva2VuIiwgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IlRva2VuU3RyZWFtIiwgcmV3cml0ZUVsZW1lbnRUeXBlPSJUb2tlbiIsIC4uLik+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgdHJlZSBwYXJzZXI7IHNhbWUgYXMgcGFyc2VyIGV4Y2VwdCB0aGUgaW5wdXQKKyAqICBzdHJlYW0gaXMgYSBkaWZmZXJlbnQgdHlwZS4KKyAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLCBydWxlcywgbnVtUnVsZXMsIGJpdHNldHMsIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsIHN1cGVyQ2xhc3M9IlRyZWVQYXJzZXIiLCBtZW1iZXJzPXs8YWN0aW9ucy50cmVlcGFyc2VyLm1lbWJlcnM+fSwgZmlsdGVyTW9kZSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IlRyZWVOb2RlU3RyZWFtIiwgcmV3cml0ZUVsZW1lbnRUeXBlPSJOb2RlIiwgLi4uKT4KKz4+CisKKy8qKiBBIHNpbXBsZXIgdmVyc2lvbiBvZiBhIHJ1bGUgdGVtcGxhdGUgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgaW1hZ2luYXJ5CisgKiAgcnVsZXMgY3JlYXRlZCBmb3Igc3ludGFjdGljIHByZWRpY2F0ZXMuICBBcyB0aGV5IG5ldmVyIGhhdmUgcmV0dXJuIHZhbHVlcworICogIG5vciBwYXJhbWV0ZXJzIGV0Yy4uLiwganVzdCBnaXZlIHNpbXBsZXN0IHBvc3NpYmxlIG1ldGhvZC4gIERvbid0IGRvCisgKiAgYW55IG9mIHRoZSBub3JtYWwgbWVtb2l6YXRpb24gc3R1ZmYgaW4gaGVyZSBlaXRoZXI7IGl0J3MgYSB3YXN0ZS4KKyAqICBBcyBwcmVkaWNhdGVzIGNhbm5vdCBiZSBpbmxpbmVkIGludG8gdGhlIGludm9raW5nIHJ1bGUsIHRoZXkgbmVlZCB0bworICogIGJlIGluIGEgcnVsZSBieSB0aGVtc2VsdmVzLgorICovCitzeW5wcmVkUnVsZShydWxlTmFtZSwgcnVsZURlc2NyaXB0b3IsIGJsb2NrLCBkZXNjcmlwdGlvbiwgbmFrZWRCbG9jaykgOjo9Cis8PAorLy8gJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KK3B1YmxpYyBmaW5hbCBmdW5jdGlvbiA8cnVsZU5hbWU+X2ZyYWdtZW50KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTp2b2lkIHsKKyAgICA8cnVsZUxhYmVsRGVmcygpPgorPGlmKHRyYWNlKT4KKyAgICB0cmFjZUluKCI8cnVsZU5hbWU+X2ZyYWdtZW50IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisgICAgdHJ5IHsKKyAgICAgICAgPGJsb2NrPgorICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgICAgdHJhY2VPdXQoIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKyAgICB9Cis8ZWxzZT4KKyAgICA8YmxvY2s+Cis8ZW5kaWY+Cit9CisvLyAkQU5UTFIgZW5kIDxydWxlTmFtZT4KKz4+CisKK3N5bnByZWQobmFtZSkgOjo9IDw8CitwdWJsaWMgZmluYWwgZnVuY3Rpb24gPG5hbWU+KCk6Qm9vbGVhbiB7CisgICAgdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICA8QHN0YXJ0KCk+CisgICAgdmFyIHN0YXJ0OmludCA9IGlucHV0Lm1hcmsoKTsKKyAgICB0cnkgeworICAgICAgICA8bmFtZT5fZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIH0gY2F0Y2ggKHJlOlJlY29nbml0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgIHRyYWNlKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICB9CisgICAgdmFyIHN1Y2Nlc3M6Qm9vbGVhbiA9ICF0aGlzLnN0YXRlLmZhaWxlZDsKKyAgICBpbnB1dC5yZXdpbmRUbyhzdGFydCk7CisgICAgPEBzdG9wKCk+CisgICAgdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmctLTsKKyAgICB0aGlzLnN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICByZXR1cm4gc3VjY2VzczsKK308XG4+Cis+PgorCitsZXhlclN5bnByZWQobmFtZSkgOjo9IDw8Cis8c3lucHJlZChuYW1lKT4KKz4+CisKK3J1bGVNZW1vaXphdGlvbihuYW1lKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KK2lmICggdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc+MCAmJiBhbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PikgKSB7IHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OyB9Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIHRlc3QgZm9yIGZhaWx1cmUgYW5kIHJldHVybiBmcm9tIHJ1bGUgKi8KK2NoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmICh0aGlzLnN0YXRlLmZhaWxlZCkgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47PGVuZGlmPgorPj4KKworLyoqIFRoaXMgcnVsZSBoYXMgZmFpbGVkLCBleGl0IGluZGljYXRpbmcgZmFpbHVyZSBkdXJpbmcgYmFja3RyYWNrICovCitydWxlQmFja3RyYWNrRmFpbHVyZSgpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjApIHt0aGlzLnN0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjt9PGVuZGlmPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhIHJ1bGUuICBUaGlzIGluY2x1ZGVzIGFueSByZXR1cm4gdHlwZQorICogIGRhdGEgYWdncmVnYXRlcyByZXF1aXJlZCBmb3IgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KKyAqLworcnVsZShydWxlTmFtZSxydWxlRGVzY3JpcHRvcixibG9jayxlbXB0eVJ1bGUsZGVzY3JpcHRpb24sZXhjZXB0aW9ucyxmaW5hbGx5LG1lbW9pemUpIDo6PSA8PAorPHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorLy8gJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorcHVibGljIGZpbmFsIGZ1bmN0aW9uIDxydWxlTmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pOjxyZXR1cm5UeXBlKCk+IHsKKyAgICA8aWYodHJhY2UpPnRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICA8cnVsZUxhYmVsRGVmcygpPgorICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgPEBwcmVhbWJsZSgpPgorICAgIHRyeSB7CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorICAgIH0KKzxpZihleGNlcHRpb25zKT4KKyAgICA8ZXhjZXB0aW9uczp7ZXw8Y2F0Y2goZGVjbD1lLmRlY2wsYWN0aW9uPWUuYWN0aW9uKT48XG4+fT4KKzxlbHNlPgorPGlmKCFlbXB0eVJ1bGUpPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2gpPgorICAgIDxhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoPgorPGVsc2U+CisgICAgY2F0Y2ggKHJlOlJlY29nbml0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgcmVjb3ZlclN0cmVhbShpbnB1dCxyZSk7CisgICAgICAgIDxAc2V0RXJyb3JSZXR1cm5WYWx1ZSgpPgorICAgIH08XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CisgICAgZmluYWxseSB7CisgICAgICAgIDxpZih0cmFjZSk+dHJhY2VPdXQoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgICAgIDxtZW1vaXplKCk+CisgICAgICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgICAgIDxmaW5hbGx5PgorICAgIH0KKyAgICA8QHBvc3RhbWJsZSgpPgorICAgIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OworfQorLy8gJEFOVExSIGVuZCA8cnVsZU5hbWU+Cis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitjYXRjaCAoPGUuZGVjbD4pIHsKKyAgICA8ZS5hY3Rpb24+Cit9Cis+PgorCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgordmFyIHJldHZhbDo8cmV0dXJuVHlwZSgpPiA9IG5ldyA8cmV0dXJuVHlwZSgpPigpOworcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7PFxuPgorPGVsc2U+Cis8cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlczp7IGEgfAordmFyIDxhLm5hbWU+OjxhLnR5cGU+ID0gPGlmKGEuaW5pdFZhbHVlKT48YS5pbml0VmFsdWU+PGVsc2U+PGluaXRWYWx1ZShhLnR5cGUpPjxlbmRpZj47Cit9PgorPGVuZGlmPgorPGlmKG1lbW9pemUpPgordmFyIDxydWxlRGVzY3JpcHRvci5uYW1lPl9TdGFydEluZGV4OmludCA9IGlucHV0LmluZGV4OworPGVuZGlmPgorPj4KKworcnVsZVNjb3BlU2V0VXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6ezxpdD5fc3RhY2sucHVzaChuZXcgT2JqZWN0KCkpO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7PGl0Lm5hbWU+X3N0YWNrLnB1c2gobmV3IE9iamVjdCgpKTt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3J1bGVTY29wZUNsZWFuVXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6ezxpdD5fc3RhY2sucG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOns8aXQubmFtZT5fc3RhY2sucG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHNdCisgICAgOnt2YXIgPGl0LmxhYmVsLnRleHQ+OjxsYWJlbFR5cGU+PW51bGw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHNdCisgICAgOnt2YXIgbGlzdF88aXQubGFiZWwudGV4dD46QXJyYXk9bnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHM6cnVsZUxhYmVsRGVmKGxhYmVsPWl0KTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHM6e2xsfHZhciA8bGwubGFiZWwudGV4dD46UnVsZVJldHVyblNjb3BlID0gbnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK2xleGVyUnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzXQorICAgIDp7dmFyIDxpdC5sYWJlbC50ZXh0Pjo8bGFiZWxUeXBlPj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7dmFyIDxpdC5sYWJlbC50ZXh0PjppbnQ7fTsgc2VwYXJhdG9yPSJcbiI+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOnt2YXIgbGlzdF88aXQubGFiZWwudGV4dD46QXJyYXk9bnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworcnVsZVJldHVyblZhbHVlKCkgOjo9IDw8Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVybk5hbWU+Cis8ZWxzZT4KK3JldHZhbAorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoIVRSRUVfUEFSU0VSKT4KK3JldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK21lbW9pemUoKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCB0aGlzLnN0YXRlLmJhY2t0cmFja2luZz4wICkgeyBtZW1vaXplKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCk7IH0KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxydWxlRGVzY3JpcHRvcixibG9jayxtZW1vaXplKSA6Oj0gPDwKKy8vICRBTlRMUiBzdGFydCA8cnVsZU5hbWU+CitwdWJsaWMgZmluYWwgZnVuY3Rpb24gbTxydWxlTmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pOnZvaWQgeworICAgIDxpZih0cmFjZSk+dHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIHRyeSB7Cis8aWYobmFrZWRCbG9jayk+CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxsZXhlclJ1bGVMYWJlbERlZnMoKT4KKyAgICAgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKyAgICAgICAgPGJsb2NrPjxcbj4KKzxlbHNlPgorICAgICAgICB2YXIgX3R5cGU6aW50ID0gPHJ1bGVOYW1lPjsKKyAgICAgICAgdmFyIF9jaGFubmVsOmludCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPGxleGVyUnVsZUxhYmVsRGVmcygpPgorICAgICAgICA8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorICAgICAgICA8YmxvY2s+CisgICAgICAgIDxydWxlQ2xlYW5VcCgpPgorICAgICAgICB0aGlzLnN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgdGhpcy5zdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorPGVuZGlmPgorICAgIH0KKyAgICBmaW5hbGx5IHsKKyAgICAgICAgPGlmKHRyYWNlKT50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgICAgPG1lbW9pemUoKT4KKyAgICB9Cit9CisvLyAkQU5UTFIgZW5kIDxydWxlTmFtZT4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG1Ub2tlbnMoKTp2b2lkIHsKKyAgICA8YmxvY2s+PFxuPgorfQorPj4KKworLy8gUyBVIEIgUiBVIEwgRSBTCisKKy8qKiBBICguLi4pIHN1YnJ1bGUgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK2Jsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgordmFyIGFsdDxkZWNpc2lvbk51bWJlcj46aW50PTxtYXhBbHQ+OworPGRlY2xzPgorPEBwcmVkZWNpc2lvbigpPgorPGRlY2lzaW9uPgorPEBwb3N0ZGVjaXNpb24oKT4KKzxAcHJlYnJhbmNoKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+Cit9Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+OmludD08bWF4QWx0PjsKKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+Cit9Cis+PgorCitydWxlQmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBIHNwZWNpYWwgY2FzZSBvZiBhICguLi4pIHN1YnJ1bGUgd2l0aCBhIHNpbmdsZSBhbHRlcm5hdGl2ZSAqLworYmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBICguLikrIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworcG9zaXRpdmVDbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit2YXIgY250PGRlY2lzaW9uTnVtYmVyPjppbnQ9MDsKKzxkZWNscz4KKzxAcHJlbG9vcCgpPgorbG9vcDxkZWNpc2lvbk51bWJlcj46CitkbyB7CisgICAgdmFyIGFsdDxkZWNpc2lvbk51bWJlcj46aW50PTxtYXhBbHQ+OworICAgIDxAcHJlZGVjaXNpb24oKT4KKyAgICA8ZGVjaXNpb24+CisgICAgPEBwb3N0ZGVjaXNpb24oKT4KKyAgICBzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKwk8YWx0czphbHRTd2l0Y2hDYXNlKCk+CisJZGVmYXVsdCA6CisJICAgIGlmICggY250PGRlY2lzaW9uTnVtYmVyPiA+PSAxICkgYnJlYWsgbG9vcDxkZWNpc2lvbk51bWJlcj47CisJICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgICAgICAgICAgdGhyb3cgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbig8ZGVjaXNpb25OdW1iZXI+LCBpbnB1dCk7CisgICAgICAgICAgICA8ISBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBlYXJseUV4aXRFeGNlcHRpb24gZGVidWcgaG9vayAhPgorICAgIH0KKyAgICBjbnQ8ZGVjaXNpb25OdW1iZXI+Kys7Cit9IHdoaWxlICh0cnVlKTsKKzxAcG9zdGxvb3AoKT4KKz4+CisKK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBwb3NpdGl2ZUNsb3N1cmVCbG9jaworCisvKiogQSAoLi4pKiBibG9jayB3aXRoIDEgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK2Nsb3N1cmVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlbG9vcCgpPgorbG9vcDxkZWNpc2lvbk51bWJlcj46CitkbyB7CisgICAgdmFyIGFsdDxkZWNpc2lvbk51bWJlcj46aW50PTxtYXhBbHQ+OworICAgIDxAcHJlZGVjaXNpb24oKT4KKyAgICA8ZGVjaXNpb24+CisgICAgPEBwb3N0ZGVjaXNpb24oKT4KKyAgICBzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKwk8YWx0czphbHRTd2l0Y2hDYXNlKCk+CisJZGVmYXVsdCA6CisJICAgIGJyZWFrIGxvb3A8ZGVjaXNpb25OdW1iZXI+OworICAgIH0KK30gd2hpbGUgKHRydWUpOworPEBwb3N0bG9vcCgpPgorPj4KKworY2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBjbG9zdXJlQmxvY2sKKworLyoqIE9wdGlvbmFsIGJsb2NrcyAoeCk/IGFyZSB0cmFuc2xhdGVkIHRvICh4fCkgYnkgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbgorICogIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJsb2NrIHRlbXBsYXRlCisgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBIGNhc2UgaW4gYSBzd2l0Y2ggdGhhdCBqdW1wcyB0byBhbiBhbHRlcm5hdGl2ZSBnaXZlbiB0aGUgYWx0ZXJuYXRpdmUKKyAqICBudW1iZXIuICBBIERGQSBwcmVkaWN0cyB0aGUgYWx0ZXJuYXRpdmUgYW5kIHRoZW4gYSBzaW1wbGUgc3dpdGNoCisgKiAgZG9lcyB0aGUganVtcCB0byB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IG1hdGNoZXMgdGhhdCBhbHRlcm5hdGl2ZS4KKyAqLworYWx0U3dpdGNoQ2FzZSgpIDo6PSA8PAorY2FzZSA8aT4gOgorICAgIDxAcHJlYWx0KCk+CisgICAgPGl0PgorICAgIGJyZWFrOzxcbj4KKz4+CisKKy8qKiBBbiBhbHRlcm5hdGl2ZSBpcyBqdXN0IGEgbGlzdCBvZiBlbGVtZW50czsgYXQgb3V0ZXJtb3N0IGxldmVsICovCithbHQoZWxlbWVudHMsYWx0TnVtLGRlc2NyaXB0aW9uLGF1dG9BU1Qsb3V0ZXJBbHQsdHJlZUxldmVsLHJldykgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKzxAZGVjbGFyYXRpb25zKCk+Cis8ZWxlbWVudHM6ZWxlbWVudCgpPgorPHJldz4KKzxAY2xlYW51cCgpPgorfQorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvLyBFIEwgRSBNIEUgTiBUIFMKKworLyoqIER1bXAgdGhlIGVsZW1lbnRzIG9uZSBwZXIgbGluZSAqLworZWxlbWVudCgpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGl0LmVsPjxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIHRva2VuIG9wdGlvbmFsbHkgd2l0aCBhIGxhYmVsIGluIGZyb250ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxpZihsYWJlbCk+PGxhYmVsPj08bGFiZWxUeXBlPig8ZW5kaWY+bWF0Y2hTdHJlYW0oaW5wdXQsPHRva2VuPixGT0xMT1dfPHRva2VuPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pPGlmKGxhYmVsKT4pPGVuZGlmPjsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPUlEICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCitsaXN0TGFiZWwobGFiZWwsZWxlbSkgOjo9IDw8CitpZiAobGlzdF88bGFiZWw+PT1udWxsKSBsaXN0XzxsYWJlbD49bmV3IEFycmF5KCk7CitsaXN0XzxsYWJlbD4ucHVzaCg8ZWxlbT4pOzxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciAqLworY2hhclJlZihjaGFyLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gaW5wdXQuTEEoMSk7PFxuPgorPGVuZGlmPgorbWF0Y2goPGNoYXI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciByYW5nZSAqLworY2hhclJhbmdlUmVmKGEsYixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK21hdGNoUmFuZ2UoPGE+LDxiPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogRm9yIG5vdywgc2V0cyBhcmUgaW50ZXJ2YWwgdGVzdHMgYW5kIG11c3QgYmUgdGVzdGVkIGlubGluZSAqLworbWF0Y2hTZXQocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZT0iIikgOjo9IDw8Cis8aWYobGFiZWwpPgorPGlmKExFWEVSKT4KKzxsYWJlbD49IGlucHV0LkxBKDEpOzxcbj4KKzxlbHNlPgorPGxhYmVsPj08bGFiZWxUeXBlPihpbnB1dC5MVCgxKSk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgoraWYgKCA8cz4gKSB7CisgICAgaW5wdXQuY29uc3VtZSgpOworICAgIDxwb3N0bWF0Y2hDb2RlPgorPGlmKCFMRVhFUik+CisgICAgdGhpcy5zdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworPGVuZGlmPgorICAgIDxpZihiYWNrdHJhY2tpbmcpPnRoaXMuc3RhdGUuZmFpbGVkPWZhbHNlOzxlbmRpZj4KK30KK2Vsc2UgeworICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxAbWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpPgorPGlmKExFWEVSKT4KKyAgICB0aHJvdyByZWNvdmVyKG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpKTs8XG4+Cis8ZWxzZT4KKyAgICB0aHJvdyBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICA8ISB1c2UgZm9sbG93aW5nIGNvZGUgdG8gbWFrZSBpdCByZWNvdmVyIGlubGluZTsgcmVtb3ZlIHRocm93IG1zZTsKKyAgICByZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoaW5wdXQsbXNlLEZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKyAgICAhPgorPGVuZGlmPgorfTxcbj4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0IDo6PSBtYXRjaFNldAorCittYXRjaFNldEFuZExpc3RMYWJlbChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggYSBzdHJpbmcgbGl0ZXJhbCAqLworbGV4ZXJTdHJpbmdSZWYoc3RyaW5nLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgordmFyIDxsYWJlbD5TdGFydDppbnQgPSBjaGFySW5kZXg7CittYXRjaFN0cmluZyg8c3RyaW5nPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8bGFiZWw+ID0gQ29tbW9uVG9rZW4uY3JlYXRlRnJvbVN0cmVhbShpbnB1dCwgVG9rZW5Db25zdGFudHMuSU5WQUxJRF9UT0tFTl9UWVBFLCBUb2tlbkNvbnN0YW50cy5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydCwgY2hhckluZGV4LTEpOworPGVsc2U+CittYXRjaFN0cmluZyg8c3RyaW5nPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGVuZGlmPgorPj4KKword2lsZGNhcmQobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+PTxsYWJlbFR5cGU+KGlucHV0LkxUKDEpKTs8XG4+Cis8ZW5kaWY+CittYXRjaEFueShpbnB1dCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK21hdGNoQW55KCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZENoYXJMaXN0TGFiZWwobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8d2lsZGNhcmRDaGFyKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4gIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZQorICogIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcworICogIHNhbWU6IHRoZSBydWxlIG5hbWUuICBOb3cgdGhvdWdoIHlvdSBjYW4gYWNjZXNzIGZ1bGwgcnVsZQorICogIGRlc2NyaXB0b3Igc3R1ZmYuCisgKgorICogR01TOiBOb3RlOiAgZG8gbm90IHVzZSBwb3N0LWRlY3JlbWVudCBvcGVyYXRvciEgIEFTQyBwcm9kdWNlcyBiYWQgY29kZSBmb3IgZXhjZXB0aW9ucyBpbiB0aGlzIGNhc2UuCisgKiAgICAgIFNlZTogaHR0cHM6Ly9idWdzLmFkb2JlLmNvbS9qaXJhL2Jyb3dzZS9BU0MtMzYyNQorICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorcHVzaEZvbGxvdyhGT0xMT1dfPHJ1bGUubmFtZT5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKzxpZihsYWJlbCk+PGxhYmVsPj08ZW5kaWY+PGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj48cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTs8XG4+CitzdGF0ZS5fZnNwID0gc3RhdGUuX2ZzcCAtIDE7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworCisvKiogaWRzKz1yICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIEEgbGV4ZXIgcnVsZSByZWZlcmVuY2UuCisgKgorICogIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZSB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93CisgKiAgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcyBzYW1lOiB0aGUgcnVsZSBuYW1lLgorICogIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK2xleGVyUnVsZVJlZihydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cit2YXIgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD46aW50ID0gY2hhckluZGV4OworPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj5tPHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8bGFiZWw+ID0gQ29tbW9uVG9rZW4uY3JlYXRlRnJvbVN0cmVhbShpbnB1dCwgVG9rZW5Db25zdGFudHMuSU5WQUxJRF9UT0tFTl9UWVBFLCBUb2tlbkNvbnN0YW50cy5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+LCBjaGFySW5kZXgtMSk7Cis8ZWxzZT4KKzxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIGkrPUlOVCBpbiBsZXhlciAqLworbGV4ZXJSdWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGxleGVyUnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogRU9GIGluIHRoZSBsZXhlciAqLworbGV4ZXJNYXRjaEVPRihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK3ZhciA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PjppbnQgPSBjaGFySW5kZXg7CittYXRjaChFT0YpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgordmFyIDxsYWJlbD46PGxhYmVsVHlwZT4gPSBDb21tb25Ub2tlbi5jcmVhdGVGcm9tU3RyZWFtKGlucHV0LCBFT0YsIFRva2VuQ29uc3RhbnRzLkRFRkFVTFRfQ0hBTk5FTCwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIGNoYXJJbmRleC0xKTsKKzxlbHNlPgorbWF0Y2goRU9GKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyICovCit0cmVlKHJvb3QsIGFjdGlvbnNBZnRlclJvb3QsIGNoaWxkcmVuLCBudWxsYWJsZUNoaWxkTGlzdCwKKyAgICAgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorPHJvb3Q6ZWxlbWVudCgpPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmICggaW5wdXQuTEEoMSk9PVRva2VuQ29uc3RhbnRzLkRPV04gKSB7CisgICAgbWF0Y2hTdHJlYW0oaW5wdXQsIFRva2VuQ29uc3RhbnRzLkRPV04sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgbWF0Y2hTdHJlYW0oaW5wdXQsIFRva2VuQ29uc3RhbnRzLlVQLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK30KKzxlbHNlPgorbWF0Y2hTdHJlYW0oaW5wdXQsIFRva2VuQ29uc3RhbnRzLkRPV04sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGNoaWxkcmVuOmVsZW1lbnQoKT4KK21hdGNoU3RyZWFtKGlucHV0LCBUb2tlbkNvbnN0YW50cy5VUCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogRXZlcnkgcHJlZGljYXRlIGlzIHVzZWQgYXMgYSB2YWxpZGF0aW5nIHByZWRpY2F0ZSAoZXZlbiB3aGVuIGl0IGlzCisgKiAgYWxzbyBob2lzdGVkIGludG8gYSBwcmVkaWN0aW9uIGV4cHJlc3Npb24pLgorICovCit2YWxpZGF0ZVNlbWFudGljUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAoraWYgKCAhKDxldmFsUHJlZGljYXRlKC4uLik+KSApIHsKKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+Iik7Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Cit2YXIgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj46aW50ID0gaW5wdXQuTEEoPGs+KTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+CitlbHNlIHsKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworPGVsc2U+CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiwgaW5wdXQpOzxcbj4KKyAgICA8ISBOZWVkIHRvIGFkZCBob29rIGZvciBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpICE+Cis8ZW5kaWY+Cit9Cis+PgorCisvKiogU2FtZSBhcyBhIG5vcm1hbCBERkEgc3RhdGUgZXhjZXB0IHRoYXQgd2UgZG9uJ3QgZXhhbWluZSBsb29rYWhlYWQKKyAqICBmb3IgdGhlIGJ5cGFzcyBhbHRlcm5hdGl2ZS4gIEl0IGRlbGF5cyBlcnJvciBkZXRlY3Rpb24gYnV0IHRoaXMKKyAqICBpcyBmYXN0ZXIsIHNtYWxsZXIsIGFuZCBtb3JlIHdoYXQgcGVvcGxlIGV4cGVjdC4gIEZvciAoWCk/IHBlb3BsZQorICogIGV4cGVjdCAiaWYgKCBMQSgxKT09WCApIG1hdGNoKFgpOyIgYW5kIHRoYXQncyBpdC4KKyAqLworZGZhT3B0aW9uYWxCbG9ja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3ZhciBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPjppbnQgPSBpbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKz4+CisKKy8qKiBBIERGQSBzdGF0ZSB0aGF0IGlzIGFjdHVhbGx5IHRoZSBsb29wYmFjayBkZWNpc2lvbiBvZiBhIGNsb3N1cmUKKyAqICBsb29wLiAgSWYgZW5kLW9mLXRva2VuIChFT1QpIHByZWRpY3RzIGFueSBvZiB0aGUgdGFyZ2V0cyB0aGVuIGl0CisgKiAgc2hvdWxkIGFjdCBsaWtlIGEgZGVmYXVsdCBjbGF1c2UgKGkuZS4sIG5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQpLgorICogIFRoaXMgaXMgdXNlZCBvbmx5IGluIHRoZSBsZXhlciBzbyB0aGF0IGZvciAoJ2EnKSogb24gdGhlIGVuZCBvZiBhIHJ1bGUKKyAqICBhbnl0aGluZyBvdGhlciB0aGFuICdhJyBwcmVkaWN0cyBleGl0aW5nLgorICovCitkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3ZhciBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPjppbnQgPSBpbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj48XG4+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorPGlmKCFlZGdlcyk+CithbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD47IDwhIGlmIG5vIGVkZ2VzLCBkb24ndCBnZW4gRUxTRSAhPgorPGVsc2U+CitlbHNlIHsKKyAgICBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD47Cit9PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEFuIGFjY2VwdCBzdGF0ZSBpbmRpY2F0ZXMgYSB1bmlxdWUgYWx0ZXJuYXRpdmUgaGFzIGJlZW4gcHJlZGljdGVkICovCitkZmFBY2NlcHRTdGF0ZShhbHQpIDo6PSAiYWx0PGRlY2lzaW9uTnVtYmVyPj08YWx0PjsiCisKKy8qKiBBIHNpbXBsZSBlZGdlIHdpdGggYW4gZXhwcmVzc2lvbi4gIElmIHRoZSBleHByZXNzaW9uIGlzIHNhdGlzZmllZCwKKyAqICBlbnRlciB0byB0aGUgdGFyZ2V0IHN0YXRlLiAgVG8gaGFuZGxlIGdhdGVkIHByb2R1Y3Rpb25zLCB3ZSBtYXkKKyAqICBoYXZlIHRvIGV2YWx1YXRlIHNvbWUgcHJlZGljYXRlcyBmb3IgdGhpcyBlZGdlLgorICovCitkZmFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGUsIHByZWRpY2F0ZXMpIDo6PSA8PAoraWYgKCAoPGxhYmVsRXhwcj4pIDxpZihwcmVkaWNhdGVzKT4mJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pIHsKKyAgICA8dGFyZ2V0U3RhdGU+Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoc3dpdGNoIGNhc2UpCisKKy8qKiBBIERGQSBzdGF0ZSB3aGVyZSBhIFNXSVRDSCBtYXkgYmUgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgZ2VuZXJhdG9yCisgKiAgZGVjaWRlcyBpZiB0aGlzIGlzIHBvc3NpYmxlOiBDb2RlR2VuZXJhdG9yLmNhbkdlbmVyYXRlU3dpdGNoKCkuCisgKi8KK2RmYVN0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoIGlucHV0LkxBKDxrPikgKSB7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorZGVmYXVsdDoKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworPGVsc2U+CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiwgaW5wdXQpOzxcbj4KKyAgICA8ISBOZWVkIHRvIGFkZCBob29rIGZvciBub1ZpYWJsZUFsdEV4Y2VwdGlvbiAhPgorPGVuZGlmPgorfTxcbj4KKz4+CisKK2RmYU9wdGlvbmFsQmxvY2tTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKCBpbnB1dC5MQSg8az4pICkgeworICAgIDxlZGdlczsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworZGZhTG9vcGJhY2tTdGF0ZVN3aXRjaChrLCBlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoICggaW5wdXQuTEEoPGs+KSApIHsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KK2RlZmF1bHQ6CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworICAgIGJyZWFrOzxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAorPGxhYmVsczp7Y2FzZSA8aXQ+On07IHNlcGFyYXRvcj0iXG4iPgorICAgIHsKKyAgICA8dGFyZ2V0U3RhdGU+CisgICAgfQorICAgIGJyZWFrOworPj4KKworLy8gQyB5IGMgbCBpIGMgIEQgRiBBCisKKy8qKiBUaGUgY29kZSB0byBpbml0aWF0ZSBleGVjdXRpb24gb2YgYSBjeWNsaWMgREZBOyB0aGlzIGlzIHVzZWQKKyAqICBpbiB0aGUgcnVsZSB0byBwcmVkaWN0IGFuIGFsdCBqdXN0IGxpa2UgdGhlIGZpeGVkIERGQSBjYXNlLgorICogIFRoZSA8bmFtZT4gYXR0cmlidXRlIGlzIGluaGVyaXRlZCB2aWEgdGhlIHBhcnNlciwgbGV4ZXIsIC4uLgorICovCitkZmFEZWNpc2lvbihkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CithbHQ8ZGVjaXNpb25OdW1iZXI+ID0gZGZhPGRlY2lzaW9uTnVtYmVyPi5wcmVkaWN0KGlucHV0KTsKKz4+CisKK2N5Y2xpY0RGQUN0b3IoZGZhKSA6Oj0gPDwKKworZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBuZXcgREZBKHRoaXMsIDxkZmEuZGVjaXNpb25OdW1iZXI+LAorICAgICAgICAgICAgIjxkZmEuZGVzY3JpcHRpb24+IiwKKyAgICAgICAgICAgIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvdCwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mLCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW4sCisgICAgICAgICAgICBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9tYXgsIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdCwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbCwKKyAgICAgICAgICAgIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb248aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+LCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsU3RhdGVUcmFuc2l0aW9uPGVuZGlmPik7CisKKz4+CisvKiBEdW1wIERGQSB0YWJsZXMgYXMgcnVuLWxlbmd0aC1lbmNvZGVkIFN0cmluZ3Mgb2Ygb2N0YWwgdmFsdWVzLgorICogQ2FuJ3QgdXNlIGhleCBhcyBjb21waWxlciB0cmFuc2xhdGVzIHRoZW0gYmVmb3JlIGNvbXBpbGF0aW9uLgorICogVGhlc2Ugc3RyaW5ncyBhcmUgc3BsaXQgaW50byBtdWx0aXBsZSwgY29uY2F0ZW5hdGVkIHN0cmluZ3MuCisgKiBKYXZhIHB1dHMgdGhlbSBiYWNrIHRvZ2V0aGVyIGF0IGNvbXBpbGUgdGltZSB0aGFua2Z1bGx5LgorICogSmF2YSBjYW5ub3QgaGFuZGxlIGxhcmdlIHN0YXRpYyBhcnJheXMsIHNvIHdlJ3JlIHN0dWNrIHdpdGggdGhpcworICogZW5jb2RlL2RlY29kZSBhcHByb2FjaC4gIFNlZSBhbmFseXNpcyBhbmQgcnVudGltZSBERkEgZm9yCisgKiB0aGUgZW5jb2RpbmcgbWV0aG9kcy4KKyAqLworY3ljbGljREZBKGRmYSkgOjo9IDw8CisKK3ByaXZhdGUgY29uc3QgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OkFycmF5ID0KKyAgICBERkEudW5wYWNrRW5jb2RlZFN0cmluZygiPGRmYS5qYXZhQ29tcHJlc3NlZEVPVDsgd3JhcD0iXCIrXG4gICAgXCIiPiIpOworcHJpdmF0ZSBjb25zdCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2Y6QXJyYXkgPQorICAgIERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKCI8ZGZhLmphdmFDb21wcmVzc2VkRU9GOyB3cmFwPSJcIitcbiAgICBcIiI+Iik7Citwcml2YXRlIGNvbnN0IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbjpBcnJheSA9CisgICAgREZBLnVucGFja0VuY29kZWRTdHJpbmcoIjxkZmEuamF2YUNvbXByZXNzZWRNaW47IHdyYXA9IlwiK1xuICAgIFwiIj4iLCB0cnVlKTsKK3ByaXZhdGUgY29uc3QgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OkFycmF5ID0KKyAgICBERkEudW5wYWNrRW5jb2RlZFN0cmluZygiPGRmYS5qYXZhQ29tcHJlc3NlZE1heDsgd3JhcD0iXCIrXG4gICAgXCIiPiIsIHRydWUpOworcHJpdmF0ZSBjb25zdCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQ6QXJyYXkgPQorICAgIERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKCI8ZGZhLmphdmFDb21wcmVzc2VkQWNjZXB0OyB3cmFwPSJcIitcbiAgICBcIiI+Iik7Citwcml2YXRlIGNvbnN0IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWw6QXJyYXkgPQorICAgIERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKCI8ZGZhLmphdmFDb21wcmVzc2VkU3BlY2lhbDsgd3JhcD0iXCIrXG4gICAgXCIiPiIpOworcHJpdmF0ZSBjb25zdCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uOkFycmF5ID0gWworICAgICAgICA8ZGZhLmphdmFDb21wcmVzc2VkVHJhbnNpdGlvbjp7c3xERkEudW5wYWNrRW5jb2RlZFN0cmluZygiPHM7IHdyYXA9IlwiK1xuXCIiPiIpfTsgc2VwYXJhdG9yPSIsXG4iPgorXTsKKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWxTdGF0ZVRyYW5zaXRpb24oZGZhOkRGQSwgczppbnQsIF9pbnB1dDpJbnRTdHJlYW0pOmludCB7CisgICAgICAgIDxpZihMRVhFUik+CisgICAgICAgIHZhciBpbnB1dDpJbnRTdHJlYW0gPSBfaW5wdXQ7CisgICAgICAgIDxlbmRpZj4KKyAgICAgICAgPGlmKFBBUlNFUik+CisgICAgICAgIHZhciBpbnB1dDpUb2tlblN0cmVhbSA9IFRva2VuU3RyZWFtKF9pbnB1dCk7CisgICAgICAgIDxlbmRpZj4KKyAgICAgICAgPGlmKFRSRUVfUEFSU0VSKT4KKyAgICAgICAgdmFyIGlucHV0OlRyZWVOb2RlU3RyZWFtID0gVHJlZU5vZGVTdHJlYW0oX2lucHV0KTsKKyAgICAgICAgPGVuZGlmPgorICAgIAl2YXIgX3M6aW50ID0gczsKKyAgICAgICAgc3dpdGNoICggcyApIHsKKyAgICAgICAgPGRmYS5zcGVjaWFsU3RhdGVTVHM6e3N0YXRlIHwKKyAgICAgICAgY2FzZSA8aTA+IDogPCEgY29tcHJlc3NlZCBzcGVjaWFsIHN0YXRlIG51bWJlcnMgMC4ubi0xICE+CisgICAgICAgICAgICA8c3RhdGU+fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIH0KKzxpZihiYWNrdHJhY2tpbmcpPgorICAgICAgICBpZiAodGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3RoaXMuc3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMTt9PFxuPgorPGVuZGlmPgorICAgICAgICB0aHJvdyBkZmEuZXJyb3IobmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGRmYS5kZXNjcmlwdGlvbiwgPGRmYS5kZWNpc2lvbk51bWJlcj4sIF9zLCBpbnB1dCkpOworICAgIH08XG4+Cis8ZW5kaWY+CisKK3Byb3RlY3RlZCB2YXIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj46REZBOyAgLy8gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKKworPj4KKworLyoqIEEgc3RhdGUgaW4gYSBjeWNsaWMgREZBOyBpdCdzIGEgc3BlY2lhbCBzdGF0ZSBhbmQgcGFydCBvZiBhIGJpZyBzd2l0Y2ggb24KKyAqICBzdGF0ZS4KKyAqLworY3ljbGljREZBU3RhdGUoZGVjaXNpb25OdW1iZXIsc3RhdGVOdW1iZXIsZWRnZXMsbmVlZEVycm9yQ2xhdXNlLHNlbVByZWRTdGF0ZSkgOjo9IDw8Cit2YXIgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj46aW50ID0gaW5wdXQuTEEoMSk7PFxuPgorPGlmKHNlbVByZWRTdGF0ZSk+IDwhIGdldCBuZXh0IGxvb2thaGVhZCBzeW1ib2wgdG8gdGVzdCBlZGdlcywgdGhlbiByZXdpbmQgIT4KK3ZhciBpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPjppbnQgPSBpbnB1dC5pbmRleDsKK2lucHV0LnJld2luZCgpOzxcbj4KKzxlbmRpZj4KK3MgPSAtMTsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKzxpZihzZW1QcmVkU3RhdGUpPiA8ISByZXR1cm4gaW5wdXQgY3Vyc29yIHRvIHN0YXRlIGJlZm9yZSB3ZSByZXdvdW5kICE+CitpbnB1dC5zZWVrKGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+KTs8XG4+Cis8ZW5kaWY+CitpZiAoIHM+PTAgKSByZXR1cm4gczsKK2JyZWFrOworPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rYWhlYWQgYW5kIGluZGljYXRlIHdoYXQKKyAqICBzdGF0ZSB0byBqdW1wIHRvIG5leHQgaWYgc3VjY2Vzc2Z1bC4KKyAqLworY3ljbGljREZBRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlTnVtYmVyLCBlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7cyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47fTxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkgY2hhcjsKKyAqICBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICovCitlb3RERkFFZGdlKHRhcmdldFN0YXRlTnVtYmVyLGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPgorPj4KKworCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoPGxlZnQ+JiY8cmlnaHQ+KSIKKworb3JQcmVkaWNhdGVzKG9wZXJhbmRzKSA6Oj0gIig8Zmlyc3Qob3BlcmFuZHMpPjxyZXN0KG9wZXJhbmRzKTp7byB8IHx8PG8+fT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxldmFsUHJlZGljYXRlKC4uLik+KSIKKworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIig8cHJlZD4pIgorCitldmFsU3luUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiPHByZWQ+KCkiCisKK2xvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICJMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPj09PGF0b21Bc0ludD4iCisKKy8qKiBTb21ldGltZXMgYSBsb29rYWhlYWQgdGVzdCBjYW5ub3QgYXNzdW1lIHRoYXQgTEEoaykgaXMgaW4gYSB0ZW1wIHZhcmlhYmxlCisgKiAgc29tZXdoZXJlLiAgTXVzdCBhc2sgZm9yIHRoZSBsb29rYWhlYWQgZGlyZWN0bHkuCisgKi8KK2lzb2xhdGVkTG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gImlucHV0LkxBKDxrPik9PTxhdG9tQXNJbnQ+IgorCitsb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSA8PAorKExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+XD49PGxvd2VyQXNJbnQ+ICYmIExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+XDw9PHVwcGVyQXNJbnQ+KQorPj4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSAiKGlucHV0LkxBKDxrPilcPj08bG93ZXJBc0ludD4gJiYgaW5wdXQuTEEoPGs+KVw8PTx1cHBlckFzSW50PikiCisKK3NldFRlc3QocmFuZ2VzKSA6Oj0gIjxyYW5nZXM7IHNlcGFyYXRvcj1cInx8XCI+IgorCisvLyBBIFQgVCBSIEkgQiBVIFQgRSBTCisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK3Byb3RlY3RlZCB2YXIgPHNjb3BlLm5hbWU+X3N0YWNrOkFycmF5ID0gbmV3IEFycmF5KCk7PFxuPgorPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK3Byb3RlY3RlZCB2YXIgPHNjb3BlLm5hbWU+X3N0YWNrOkFycmF5ID0gbmV3IEFycmF5KCk7PFxuPgorPGVuZGlmPgorPj4KKworcmV0dXJuU3RydWN0TmFtZSgpIDo6PSAiPGlmKFRSRUVfUEFSU0VSKT5UcmVlPGVsc2U+UGFyc2VyPGVuZGlmPlJ1bGVSZXR1cm5TY29wZSIKKworcmV0dXJuVHlwZSgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxyZXR1cm5TdHJ1Y3ROYW1lKCk+Cis8ZWxzZT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+Cis8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5UeXBlPgorPGVsc2U+Cit2b2lkCis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogR2VuZXJhdGUgdGhlIEphdmEgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgb3IgbXVsdGlwbGUgcmV0dXJuCisgKiAgdmFsdWVzLgorICovCitydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlKSA6Oj0gPDwKKzxpZihyZWZlcmVuY2VkUnVsZS5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cmV0dXJuU3RydWN0TmFtZSgpPgorPGVsc2U+Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJlZmVyZW5jZWRSdWxlLnNpbmdsZVZhbHVlUmV0dXJuVHlwZT4KKzxlbHNlPgordm9pZAorPGVuZGlmPgorPGVuZGlmPgorPj4KKworZGVsZWdhdGVOYW1lKCkgOjo9IDw8Cis8aWYoaXQubGFiZWwpPjxpdC5sYWJlbD48ZWxzZT5nPGl0Lm5hbWU+PGVuZGlmPgorPj4KKworLyoqIFVzaW5nIGEgdHlwZSB0byBpbml0IHZhbHVlIG1hcCwgdHJ5IHRvIGluaXQgYSB0eXBlOyBpZiBub3QgaW4gdGFibGUKKyAqICBtdXN0IGJlIGFuIG9iamVjdCwgZGVmYXVsdCB2YWx1ZSBpcyAibnVsbCIuCisgKi8KK2luaXRWYWx1ZSh0eXBlTmFtZSkgOjo9IDw8Cis8YXNUeXBlSW5pdE1hcC4odHlwZU5hbWUpPgorPj4KKworLyoqIERlZmluZSBhIHJ1bGUgbGFiZWwgaW5jbHVkaW5nIGRlZmF1bHQgdmFsdWUgKi8KK3J1bGVMYWJlbERlZihsYWJlbCkgOjo9IDw8Cit2YXIgPGxhYmVsLmxhYmVsLnRleHQ+OjxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKT4gPSA8aW5pdFZhbHVlKHR5cGVOYW1lPXJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpKT47PFxuPgorPj4KKworLyoqIERlZmluZSBhIHJldHVybiBzdHJ1Y3QgZm9yIGEgcnVsZSBpZiB0aGUgY29kZSBuZWVkcyB0byBhY2Nlc3MgaXRzCisgKiAgc3RhcnQvc3RvcCB0b2tlbnMsIHRyZWUgc3R1ZmYsIGF0dHJpYnV0ZXMsIC4uLiAgTGVhdmUgYSBob2xlIGZvcgorICogIHN1Ymdyb3VwcyB0byBzdGljayBpbiBtZW1iZXJzLgorICovCityZXR1cm5TY29wZShzY29wZSkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcHVibGljIHN0YXRpYyBjbGFzcyA8cmV0dXJuVHlwZSgpPiBleHRlbmRzIDxpZihUUkVFX1BBUlNFUik+VHJlZTxlbHNlPlBhcnNlcjxlbmRpZj5SdWxlUmV0dXJuU2NvcGUgeworICAgIDxzY29wZS5hdHRyaWJ1dGVzOntwdWJsaWMgPGl0LmRlY2w+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAcnVsZVJldHVybk1lbWJlcnMoKT4KK307Cis8ZW5kaWY+Cis+PgorCitwYXJhbWV0ZXJTY29wZShzY29wZSkgOjo9IDw8Cis8c2NvcGUuYXR0cmlidXRlczp7PGl0Lm5hbWU+OjxpdC50eXBlPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSAiPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+ID08ZXhwcj47IgorCitzY29wZUF0dHJpYnV0ZVJlZihzY29wZSxhdHRyLGluZGV4LG5lZ0luZGV4KSA6Oj0gPDwKKyA8aWYobmVnSW5kZXgpPgorIDxzY29wZT5fc3RhY2tbPHNjb3BlPl9zdGFjay5sZW5ndGgtPG5lZ0luZGV4Pi0xXS48YXR0ci5uYW1lPgorIDxlbHNlPgorIDxpZihpbmRleCk+CisgPHNjb3BlPl9zdGFja1s8aW5kZXg+XS48YXR0ci5uYW1lPgorIDxlbHNlPgorIDxzY29wZT5fc3RhY2tbPHNjb3BlPl9zdGFjay5sZW5ndGgtMV0uPGF0dHIubmFtZT4KKyA8ZW5kaWY+CisgPGVuZGlmPgorPj4KKworc2NvcGVTZXRBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixleHByLGluZGV4LG5lZ0luZGV4KSA6Oj0gPDwKKzxpZihuZWdJbmRleCk+Cis8c2NvcGU+X3N0YWNrWzxzY29wZT5fc3RhY2subGVuZ3RoLTxuZWdJbmRleD4tMV0uPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPGlmKGluZGV4KT4KKzxzY29wZT5fc3RhY2tbPGluZGV4Pl0uPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPHNjb3BlPl9zdGFja1s8c2NvcGU+X3N0YWNrLmxlbmd0aC0xXS48YXR0ci5uYW1lPiA9PGV4cHI+OworPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsgcmVmZXJzCisgKiAgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJlZGljYXRlcworICogIGxpa2UgeyRmdW5jdGlvbi5zaXplKCk+MCAmJiAkZnVuY3Rpb246Om5hbWUuZXF1YWxzKCJmb28iKX0/CisgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gIjxzY29wZT5fc3RhY2siCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorKDxzY29wZT4hPW51bGw/PHNjb3BlPi52YWx1ZXMuPGF0dHIubmFtZT46PGluaXRWYWx1ZShhdHRyLnR5cGUpPikKKzxlbHNlPgorPHNjb3BlPgorPGVuZGlmPgorPj4KKworcmV0dXJuQXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC52YWx1ZXMuPGF0dHIubmFtZT4KKzxlbHNlPgorPGF0dHIubmFtZT4KKzxlbmRpZj4KKz4+CisKK3JldHVyblNldEF0dHJpYnV0ZVJlZihydWxlRGVzY3JpcHRvcixhdHRyLGV4cHIpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC52YWx1ZXMuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdHJhbnNsYXRlICR0b2tlbkxhYmVsICovCit0b2tlbkxhYmVsUmVmKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0XzxsYWJlbD4iCisKKworLy8gbm90IHN1cmUgdGhlIG5leHQgYXJlIHRoZSByaWdodCBhcHByb2FjaAorCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4udGV4dDpudWxsKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi50eXBlOjApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LmxpbmU6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5jaGFyUG9zaXRpb25JbkxpbmU6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4uY2hhbm5lbDowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4udG9rZW5JbmRleDowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPl90cmVlIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsP2ludCg8c2NvcGU+LnRleHQpOjApIgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxsYWJlbFR5cGU+KDxzY29wZT4uc3RhcnQpOm51bGwpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxsYWJlbFR5cGU+KDxzY29wZT4uc3RvcCk6bnVsbCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PEFTVExhYmVsVHlwZT4oPHNjb3BlPi50cmVlKTpudWxsKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorKDxzY29wZT4hPW51bGw/KGlucHV0LnRva2VuU3RyZWFtLnRvU3RyaW5nV2l0aFJhbmdlKAorICBpbnB1dC50cmVlQWRhcHRvci5nZXRUb2tlblN0YXJ0SW5kZXgoPHNjb3BlPi5zdGFydCksCisgIGlucHV0LnRyZWVBZGFwdG9yLmdldFRva2VuU3RvcEluZGV4KDxzY29wZT4uc3RhcnQpKSk6bnVsbCkKKzxlbHNlPgorKDxzY29wZT4hPW51bGw/aW5wdXQudG9TdHJpbmdXaXRoVG9rZW5SYW5nZSg8c2NvcGU+LnN0YXJ0LDxzY29wZT4uc3RvcCk6bnVsbCkKKzxlbmRpZj4KKz4+CisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5zdDpudWxsKSIKKworLyoqIElzb2xhdGVkICRSVUxFIHJlZiBvayBpbiBsZXhlciBhcyBpdCdzIGEgVG9rZW4gKi8KK2xleGVyUnVsZUxhYmVsKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi50eXBlOjApIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LmxpZW46MCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5jaGFyUG9zaXRpb25JbkxpbmU6MCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uY2hhbm5lbDowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4udG9rZW5JbmRleDowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi50ZXh0Om51bGwpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsP2ludCg8c2NvcGU+LnRleHQpOjApIgorCisvLyBTb21lYm9keSBtYXkgcmVmICR0ZW1wbGF0ZSBvciAkdHJlZSBvciAkc3RvcCB3aXRoaW4gYSBydWxlOgorcnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiPGxhYmVsVHlwZT4ocmV0dmFsLnN0YXJ0KSIKK3J1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiPGxhYmVsVHlwZT4ocmV0dmFsLnN0b3ApIgorcnVsZVByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICI8QVNUTGFiZWxUeXBlPihyZXR2YWwudHJlZSkiCitydWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CitpbnB1dC50b2tlblN0cmVhbS50b1N0cmluZ1dpdGhSYW5nZSgKKyAgaW5wdXQudHJlZUFkYXB0b3IuZ2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5zdGFydCksCisgIGlucHV0LnRyZWVBZGFwdG9yLmdldFRva2VuU3RvcEluZGV4KHJldHZhbC5zdGFydCkpCis8ZWxzZT4KK2lucHV0LnRvU3RyaW5nV2l0aFRva2VuUmFuZ2UocmV0dmFsLnN0YXJ0LGlucHV0LkxUKC0xKSkKKzxlbmRpZj4KKz4+CitydWxlUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICJyZXR2YWwuc3QiCisKK2xleGVyUnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJ0ZXh0IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIl90eXBlIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRMaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAic3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiLTEiIC8vIHVuZGVmaW5lZCB0b2tlbiBpbmRleCBpbiBsZXhlcgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIl9jaGFubmVsIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihjaGFySW5kZXgtMSkiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9ICJpbnQoPHNjb3BlPi50ZXh0KSIKKworLy8gc2V0dGluZyAkc3QgYW5kICR0cmVlIGlzIGFsbG93ZWQgaW4gbG9jYWwgcnVsZS4gZXZlcnl0aGluZyBlbHNlCisvLyBpcyBmbGFnZ2VkIGFzIGVycm9yCitydWxlU2V0UHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyLGV4cHIpIDo6PSAicmV0dmFsLnRyZWUgPTxleHByPjsiCitydWxlU2V0UHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cixleHByKSA6Oj0gInJldHZhbC5zdCA9PGV4cHI+OyIKKworLyoqIEhvdyB0byBleGVjdXRlIGFuIGFjdGlvbiAob25seSB3aGVuIG5vdCBiYWNrdHJhY2tpbmcpICovCitleGVjQWN0aW9uKGFjdGlvbikgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7CisgIDxhY3Rpb24+Cit9Cis8ZWxzZT4KKzxhY3Rpb24+Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGFsd2F5cyBleGVjdXRlIGFuIGFjdGlvbiBldmVuIHdoZW4gYmFja3RyYWNraW5nICovCitleGVjRm9yY2VkQWN0aW9uKGFjdGlvbikgOjo9ICI8YWN0aW9uPiIKKworLy8gTSBJIFMgQyAocHJvcGVydGllcywgZXRjLi4uKQorCitiaXRzZXQobmFtZSwgd29yZHM2NCkgOjo9IDw8CitwdWJsaWMgc3RhdGljIGNvbnN0IDxuYW1lPjpCaXRTZXQgPSBuZXcgQml0U2V0KFs8d29yZHM2NDp7PGl0Pn07c2VwYXJhdG9yPSIsICI+XSk7PFxuPgorPj4KKworY29kZUZpbGVFeHRlbnNpb24oKSA6Oj0gIi5hcyIKKwordHJ1ZSgpIDo6PSAidHJ1ZSIKK2ZhbHNlKCkgOjo9ICJmYWxzZSIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQy9BU1Quc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DL0FTVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3YTBlYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQy9BU1Quc3RnCkBAIC0wLDAgKzEsNTY0IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisgaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKiogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK0BoZWFkZXJGaWxlLm1lbWJlcnMoKSA6Oj0gPDwKKy8qIEBoZWFkZXJGaWxlLm1lbWJlcnMoKSAqLworcEFOVExSM19CQVNFX1RSRUVfQURBUFRPUglhZGFwdG9yOworcEFOVExSM19WRUNUT1JfRkFDVE9SWQkJdmVjdG9yczsKKy8qIEVuZCBAaGVhZGVyRmlsZS5tZW1iZXJzKCkgKi8KKz4+CisKKy8qKiBJbnN0YWxsIHRoZSB0cmVlIGFkYXB0b3IgaW50ZXJmYWNlIHBvaW50ZXIgYW5kIGFueXRoaW5nIGVsc2UgdGhhdAorICogIHRyZWUgcGFyc2VycyBhbmQgcHJvZHVjZXJzIHJlcXVpcmUuCisgKi8KK0BnZW5lcmljUGFyc2VyLmFwaWZ1bmNzKCkgOjo9IDw8Cis8aWYoUEFSU0VSKT4KK0FEQVBUT1IJPSBBTlRMUjNfVFJFRV9BREFQVE9STmV3KGluc3RyZWFtLT50c3RyZWFtLT50b2tlblNvdXJjZS0+c3RyRmFjdG9yeSk7PFxuPgorPGVuZGlmPgorY3R4LT52ZWN0b3JzCT0gYW50bHIzVmVjdG9yRmFjdG9yeU5ldygwKTsKKz4+CisKK0BnZW5lcmljUGFyc2VyLmNsZWFudXAoKSA6Oj0gPDwKK2N0eC0+dmVjdG9ycy0+Y2xvc2UoY3R4LT52ZWN0b3JzKTsKKzxpZihQQVJTRVIpPgorLyogV2UgY3JlYXRlZCB0aGUgYWRhcHRvciBzbyB3ZSBtdXN0IGZyZWUgaXQKKyAqLworQURBUFRPUi0+ZnJlZShBREFQVE9SKTsKKzxlbmRpZj4KKz4+CisKK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuTWVtYmVycygpIDo6PSA8PAorCis8c3VwZXIuQVNUTGFiZWxUeXBlKCk+CXRyZWU7CisKKz4+CisKKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBydWxlJ3MgcmV0dXJuIEFTVCAqLworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KKzxBU1RMYWJlbFR5cGU+IHJvb3RfMDs8XG4+Cis+PgorCitydWxlSW5pdGlhbGl6YXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZUluaXRpYWxpemF0aW9ucygpPgorcm9vdF8wID0gTlVMTDs8XG4+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8c3VwZXIucnVsZUxhYmVsRGVmcygpPgorPHJ1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzOntpdCB8IDxBU1RMYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pl90cmVlO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsczp7aXQgfCA8QVNUTGFiZWxUeXBlPiA8aXQubGFiZWwudGV4dD5fdHJlZTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2l0IHwgcEFOVExSM19SRVdSSVRFX1JVTEVfPHJld3JpdGVFbGVtZW50VHlwZT5fU1RSRUFNIHN0cmVhbV88aXQ+O307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLmFsbFJ1bGVSZWZzSW5BbHRzV2l0aFJld3JpdGVzCisgICAgOntpdCB8IHBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNIHN0cmVhbV88aXQ+O307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworLyogTm90ZSB0aGF0IHdlIGRlZmVyIHRoZSBhY3R1YWwgY3JlYXRpb24gb2YgYW55IHJld3JpdGUgc3RyZWFtcyB3ZSBuZWVkIGhlcmUgYW5kIGp1c3QgaW5pdGlhbGl6ZQorICogdGhlbSB0byBOVUxMLiBUaGlzIHNhdmVzIGNyZWF0aW5nIGh1Z2UgbnVtYmVycyBvZiByZXdyaXRlIHN0cmVhbXMgdGhhdCBjYW5ub3QgYmUgdXNlZCBhcyBvbmx5CisgKiBvbmUgYWx0IHdpbGwgYmUgdGFrZW4gaW4gYSBydWxlLCBidXQgd2UgYXJlIGRlY2xhcmluZyBhbGwgdGhlIHN0cmVhbXMgaGVyZS4gU28gd2UgZGVmaW5lCisgKiBhIG1hY3JvIHRoYXQgY29uYXRpbnMgdGhlIGNyZWF0ZSBjb2RlLCB0aGVuIHVzZSB0aGlzIG1hY3JvIGxhdGVyIHRvIGNoZWNrIGlmIHRoZSBzdHJlYW0KKyAqIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LiBDaGVja2luZyBmb3IgTlVMTCBpcyBhbG1vc3QgZnJlZSBpbiBDLgorICovCitydWxlTGFiZWxJbml0aWFsaXphdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlTGFiZWxJbml0aWFsaXphdGlvbnMoKT4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxhYmVsczp7aXQgfCA8aXQubGFiZWwudGV4dD5fdHJlZSAgID0gTlVMTDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHM6e2l0IHwgPGl0LmxhYmVsLnRleHQ+X3RyZWUgICA9IE5VTEw7fTsgc2VwYXJhdG9yPSJcbiI+CisKKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKzp7aXQgfCBzdHJlYW1fPGl0PiAgID0gTlVMTDsKKyNkZWZpbmUgQ1JFQVRFX3N0cmVhbV88aXQ+ICBpZiAoc3RyZWFtXzxpdD4gPT0gTlVMTCkge3N0cmVhbV88aXQ+ID0gYW50bHIzUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbU5ld0FFKEFEQVBUT1IsIFJFQ09HTklaRVIsIChwQU5UTFIzX1VJTlQ4KSJ0b2tlbiA8aXQ+Iik7IFx9IH07IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLmFsbFJ1bGVSZWZzSW5BbHRzV2l0aFJld3JpdGVzCis6e2l0IHwgc3RyZWFtXzxpdD4gICA9IE5VTEw7CisjZGVmaW5lIENSRUFURV9zdHJlYW1fPGl0PiAgaWYgKHN0cmVhbV88aXQ+ID09IE5VTEwpIHtzdHJlYW1fPGl0PiA9IGFudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFKEFEQVBUT1IsIFJFQ09HTklaRVIsIChwQU5UTFIzX1VJTlQ4KSJydWxlIDxpdD4iKTsgXH19OyBzZXBhcmF0b3I9IlxuIj4KKworPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC50cmVlICA9IE5VTEw7Cis8ZW5kaWY+Cis+PgorCisKKy8qKiAgYSBydWxlIGxhYmVsIGluY2x1ZGluZyBkZWZhdWx0IHZhbHVlICovCitydWxlTGFiZWxJbml0VmFsKGxhYmVsKSA6Oj0gPDwKKzxzdXBlci5ydWxlTGFiZWxJbml0VmFsKC4uLik+Cis8bGFiZWwubGFiZWwudGV4dD4udHJlZSA9IE5VTEw7Cis+PgorCisvKiogV2hlbiBkb2luZyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24sIHdlIG11c3QgZGVmaW5lIHNvbWUgdmFyaWFibGVzOworICogIFRoZXNlIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGlmIGRvaW5nIHJld3JpdGVzLiAgVGhpcyBtdXN0IGJlIGEgIm1vZGUiCisgKiAgYXMgYSBydWxlIGNvdWxkIGhhdmUgYm90aCByZXdyaXRlIGFuZCBBU1Qgd2l0aGluIHRoZSBzYW1lIGFsdGVybmF0aXZlCisgKiAgYmxvY2suCisgKi8KK0BhbHQuZGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYoYXV0b0FTVCk+Cis8aWYob3V0ZXJBbHQpPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworQGFsdC5pbml0aWFsaXphdGlvbnMoKSA6Oj0gPDwKKzxpZihhdXRvQVNUKT4KKzxpZihvdXRlckFsdCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KK3Jvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPikoQURBUFRPUi0+bmlsTm9kZShBREFQVE9SKSk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworCisvLyBUIHIgYSBjIGsgaSBuIGcgIFIgdSBsIGUgIEUgbCBlIG0gZSBuIHQgcworLy8KKy8qKiBJRCBidXQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZSAqLwordG9rZW5SZWZUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4gPCEgVHJhY2sgaW1wbGllcyBubyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24hPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHsgPGVuZGlmPkNSRUFURV9zdHJlYW1fPHRva2VuPjsgc3RyZWFtXzx0b2tlbj4tPmFkZChzdHJlYW1fPHRva2VuPiwgPGxhYmVsPiwgTlVMTCk7PGlmKGJhY2t0cmFja2luZyk+IH08ZW5kaWY+PFxuPgorPj4KKworLyoqIGlkcys9SUQgYW5kIHRyYWNrIGl0IGZvciB1c2UgaW4gYSByZXdyaXRlIHJ1bGU7IGFkZHMgdG8gaWRzICphbmQqCisgKiAgdG8gdGhlIHRyYWNraW5nIGxpc3Qgc3RyZWFtX0lEIGZvciB1c2UgaW4gdGhlIHJld3JpdGUuCisgKi8KK3Rva2VuUmVmVHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZUcmFjayguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2sodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj5DUkVBVEVfc3RyZWFtXzx0b2tlbj47IHN0cmVhbV88dG9rZW4+LT5hZGQoc3RyZWFtXzx0b2tlbj4sIDxsYWJlbD4sIE5VTEwpOzxpZihiYWNrdHJhY2tpbmcpPiB9PGVuZGlmPjxcbj4KKz4+CisKK3dpbGRjYXJkVHJhY2sobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7IDxlbmRpZj5DUkVBVEVfc3RyZWFtXzxydWxlLm5hbWU+OyBzdHJlYW1fPHJ1bGUubmFtZT4tPmFkZChzdHJlYW1fPHJ1bGUubmFtZT4sIDxsYWJlbD4udHJlZSwgTlVMTCk7PGlmKGJhY2t0cmFja2luZyk+IH08ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsVHJhY2soLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7IDxlbmRpZj5DUkVBVEVfc3RyZWFtXzxydWxlLm5hbWU+OyBzdHJlYW1fPHJ1bGUubmFtZT4tPmFkZChzdHJlYW1fPHJ1bGUubmFtZT4sIDxsYWJlbD4udHJlZSwgTlVMTCk7PGlmKGJhY2t0cmFja2luZyk+IH08ZW5kaWY+Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290VHJhY2soLi4uKT4KKzxsaXN0TGFiZWxBU1QoLi4uKT4KKz4+CisKKworLy8gUlVMRSBSRUYgQVNUCisKKworCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSB0cmFjayBmb3IgcmV3cml0ZSAqLwordG9rZW5SZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisKKy8qIEhvdyB0byBhY2N1bXVsYXRlIGxpc3RzIHdoZW4gd2UgYXJlIGRvaW5nIHJld3JpdGUgdHJhY2tpbmcuLi4KKyAqLworbGlzdExhYmVsVHJhY2sobGFiZWwpIDo6PSA8PAorLyogbGlzdExhYmVsVHJhY2sobGFiZWwpCisgKi8KK2lmIChsaXN0XzxsYWJlbD4gPT0gTlVMTCkKK3sKKyAgICBsaXN0XzxsYWJlbD49Y3R4LT52ZWN0b3JzLT5uZXdWZWN0b3IoY3R4LT52ZWN0b3JzKTsKK30KK2xpc3RfPGxhYmVsPi0+YWRkKGxpc3RfPGxhYmVsPiwgPGxhYmVsPi50cmVlLCBOVUxMKTsKKz4+CisKKy8qIEhvdyB0byBhY2N1bXVsYXRlIGxpc3RzIG9mIHJ1bGUgb3V0cHV0cyAob25seSBhbGxvd2VkIHdpdGggQVNUCisgKiBvcHRpb24gYnV0IGlmIHRoZSB1c2VyIGlzIGdvaW5nIHRvIHdhbGsgdGhlIHRyZWUsIHRoZXkgd2lsbCB3YW50CisgKiBhbGwgdGhlaXIgY3VzdG9tIGVsZW1lbnRzIGZyb20gcnVsZSByZXR1cm5zLgorICoKKyAqIE5vcm1hbGx5LCB3ZSB1c2UgaW5saW5lIHN0cnVjdHVyZXMgKHdoaWNoIHRoZSBjb21waWxlciBsYXlzIGRvd24KKyAqIGNvZGUgdG8gY29weSBmcm9tIGhlYXAgYWxsb2NhdGlvbnMuIEhvd2V2ZXIsIGhlcmUgd2Ugd2FudCB0byBhY2N1bXVsYXRlIGNvcGllcworICogb2YgdGhlIHJldHVybmVkIHN0cnVjdHVyZXMgYmVjYXVzZSB3ZSBhcmUgYWRkaW5nIHRoZW0gdG8gYSBsaXN0LiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlCisgKiBncmFtbWFyIGlzIG5vdCByZXdyaXRpbmcgdGhlIHRyZWUgYXMgYSB0cmVlIHJld3JpdGUgb25seSBwcmVzZXJ2ZXMgdGhlIHRyZWUsIG5vdCB0aGUgb2JqZWN0L3N0cnVjdHVyZQorICogcmV0dXJuZWQgZnJvbSB0aGUgcnVsZS4gVGhlIHJld3JpdGUgd2lsbCBleHRyYWN0IHRoZSB0cmVlIHBvaW50ZXIuIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgZ29pbmcgdG8KKyAqIGRvIGEgdHJlZSByZS13cml0ZSwgdGhlbiB0aGUgdXNlciBtYXkgd2lzaCB0byBpdGVyYXRlIHRoZSBzdHJ1Y3R1cmVzIHJldHVybmVkIGJ5IHRoZSBydWxlIGluCisgKiBhY3Rpb24gY29kZSBhbmQgd2lsbCBleHBlY3QgdGhlIHVzZXIgZGVmaW5lZCByZXR1cm5zW10gZWxlbWVudHMgdG8gYmUgYXZhaWxhYmxlIHdoZW4gdGhleSBkbyB0aGlzLgorICogSGVuY2Ugd2UgY2Fubm90IGp1c3QgcHJlc2VydmUgdGhlIHRyZWUgdGhhdCB3YXMgcmV0dXJuZWQuIFNvLCB3ZSBtdXN0IGNvcHkgdGhlIGxvY2FsIHN0cnVjdHVyZSBhbmQgcHJvdmlkZQorICogYSBmdW5jdGlvbiB0aGF0IGNhbiBmcmVlIHRoZSBhbGxvY2F0ZWQgc3BhY2UuIFdlIGNhbm5vdCBrbm93IGhvdyB0byBmcmVlIHVzZXIgYWxsb2NhdGVkIGVsZW1lbnRzIGFuZAorICogcHJlc3VtZSB0aGF0IHRoZSB1c2VyIHdpbGwga25vdyB0byBkbyB0aGlzIHVzaW5nIHRoZWlyIG93biBmYWN0b3JpZXMgZm9yIHRoZSBzdHJ1Y3R1cmVzIHRoZXkgYWxsb2NhdGUuCisgKi8KK2xpc3RMYWJlbEFTVChsYWJlbCkgOjo9IDw8CitpZiAobGlzdF88bGFiZWw+ID09IE5VTEwpCit7CisgICAgbGlzdF88bGFiZWw+PWN0eC0+dmVjdG9ycy0+bmV3VmVjdG9yKGN0eC0+dmVjdG9ycyk7Cit9Cit7CisgICAgUkVUVVJOX1RZUEVfPGxhYmVsPiAqIHRjb3B5OworCisgICAgdGNvcHkgPSAoUkVUVVJOX1RZUEVfPGxhYmVsPiAqKUFOVExSM19NQUxMT0Moc2l6ZW9mKFJFVFVSTl9UWVBFXzxsYWJlbD4pKTsgLyogTm90ZSBubyBtZW1vcnkgYWxsb2NhdGlvbiBjaGVja3MhICovCisgICAgQU5UTFIzX01FTUNQWSgodm9pZCAqKSh0Y29weSksIChjb25zdCB2b2lkICopJjxsYWJlbD4sIHNpemVvZihSRVRVUk5fVFlQRV88bGFiZWw+KSk7CisgICAgbGlzdF88bGFiZWw+LT5hZGQobGlzdF88bGFiZWw+LCAodm9pZCAqKXRjb3B5LCBmcmVlU2NvcGUpOyAgLyogQWRkIHdoYXRldmVyIHRoZSByZXR1cm4gdHlwZSBpcyAqLzxcbj4KK30KKz4+CisKKy8vIFIgZSB3IHIgaSB0IGUKKworcmV3cml0ZUNvZGUoCisJYWx0cywKKwlkZXNjcmlwdGlvbiwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBBTEwgcmVmZXJlbmNlZCBlbGVtZW50cyB0byByaWdodCBvZiAtPgorCXJlZmVyZW5jZWRUb2tlbkxhYmVscywKKwlyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzLAorCXJlZmVyZW5jZWRSdWxlTGFiZWxzLAorCXJlZmVyZW5jZWRSdWxlTGlzdExhYmVscywKKyAgICByZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMsCisgICAgcmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVscywKKwlyZXdyaXRlQmxvY2tMZXZlbCwKKwllbmNsb3NpbmdUcmVlTGV2ZWwsCisJdHJlZUxldmVsKSA6Oj0KKzw8CisKKy8qIEFTVCBSRVdSSVRFCisgKiBlbGVtZW50cyAgICAgICAgICA6IDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOyBzZXBhcmF0b3I9IiwgIj4KKyAqIHRva2VuIGxhYmVscyAgICAgIDogPHJlZmVyZW5jZWRUb2tlbkxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisgKiBydWxlIGxhYmVscyAgICAgICA6IDxyZWZlcmVuY2VkUnVsZUxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisgKiB0b2tlbiBsaXN0IGxhYmVscyA6IDxyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKyAqIHJ1bGUgbGlzdCBsYWJlbHMgIDogPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisgKi8KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxcbj4KKzxlbmRpZj4KK3sKKwk8cmV3cml0ZUNvZGVMYWJlbHNEZWNsKCk+CisJPHJld3JpdGVDb2RlTGFiZWxzSW5pdCgpPgorCXJvb3RfMAkJCSAgICA9ICg8QVNUTGFiZWxUeXBlPikoQURBUFRPUi0+bmlsTm9kZShBREFQVE9SKSk7CisJPHByZXZSdWxlUm9vdFJlZigpPi50cmVlICAgID0gcm9vdF8wOworCTxhbHRzOnJld3JpdGVBbHQoKTsgc2VwYXJhdG9yPSJlbHNlICI+CisJPGlmKFRSRUVfUEFSU0VSKT4KKwk8aWYocmV3cml0ZU1vZGUpPgorCTxwcmV2UnVsZVJvb3RSZWYoKT4udHJlZSA9ICg8QVNUTGFiZWxUeXBlPikoQURBUFRPUi0+cnVsZVBvc3RQcm9jZXNzaW5nKEFEQVBUT1IsIHJvb3RfMCkpOworCUlOUFVULT5yZXBsYWNlQ2hpbGRyZW4oSU5QVVQsIEFEQVBUT1ItPmdldFBhcmVudChBREFQVE9SLCByZXR2YWwuc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIEFEQVBUT1ItPmdldENoaWxkSW5kZXgoQURBUFRPUiwgcmV0dmFsLnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBBREFQVE9SLT5nZXRDaGlsZEluZGV4KEFEQVBUT1IsIF9sYXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICByZXR2YWwudHJlZSk7CisJPGVuZGlmPgorCTxlbmRpZj4KKwk8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzA7IC8vIHNldCByZXN1bHQgcm9vdAorCTxyZXdyaXRlQ29kZUxhYmVsc0ZyZWUoKT4KKworfQorPj4KKworcmV3cml0ZUNvZGVMYWJlbHNEZWNsKCkgOjo9IDw8Cis8cmVmZXJlbmNlZFRva2VuTGFiZWxzCisgICAgOntpdCB8IHBBTlRMUjNfUkVXUklURV9SVUxFXzxyZXdyaXRlRWxlbWVudFR5cGU+X1NUUkVBTSBzdHJlYW1fPGl0Pjt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVscworICAgIDp7aXQgfCBwQU5UTFIzX1JFV1JJVEVfUlVMRV88cmV3cml0ZUVsZW1lbnRUeXBlPl9TVFJFQU0gc3RyZWFtXzxpdD47fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRSdWxlTGFiZWxzCisgICAgOntpdCB8IHBBTlRMUjNfUkVXUklURV9SVUxFX1NVQlRSRUVfU1RSRUFNIHN0cmVhbV88aXQ+O307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMKKyAgICA6e2l0IHwgcEFOVExSM19SRVdSSVRFX1JVTEVfU1VCVFJFRV9TVFJFQU0gc3RyZWFtXzxpdD47fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworcmV3cml0ZUNvZGVMYWJlbHNJbml0KCkgOjo9IDw8Cis8cmVmZXJlbmNlZFRva2VuTGFiZWxzCis6e2l0IHwgc3RyZWFtXzxpdD49YW50bHIzUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbU5ld0FFRShBREFQVE9SLCAgUkVDT0dOSVpFUiwgKHBBTlRMUjNfVUlOVDgpInRva2VuIDxpdD4iLCA8aXQ+KTt9Oworc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzCis6e2l0IHwgc3RyZWFtXzxpdD49YW50bHIzUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbU5ld0FFVihBREFQVE9SLCAgUkVDT0dOSVpFUiwgKHBBTlRMUjNfVUlOVDgpInRva2VuIDxpdD4iLCBsaXN0XzxpdD4pOyB9Oworc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxhYmVscworOntpdCB8IHN0cmVhbV88aXQ+PWFudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFRShBREFQVE9SLCAgUkVDT0dOSVpFUiwgKHBBTlRMUjNfVUlOVDgpInRva2VuIDxpdD4iLCA8aXQ+LnRyZWUgIT0gTlVMTCA/IDxpdD4udHJlZSA6IE5VTEwpO307CitzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVscworOntpdCB8IHN0cmVhbV88aXQ+PWFudGxyM1Jld3JpdGVSdWxlU3VidHJlZVN0cmVhbU5ld0FFVihBREFQVE9SLCAgUkVDT0dOSVpFUiwgKHBBTlRMUjNfVUlOVDgpInRva2VuIDxpdD4iLCBsaXN0XzxpdD4pO307CitzZXBhcmF0b3I9IlxuIgorPgorPj4KK3Jld3JpdGVDb2RlTGFiZWxzRnJlZSgpIDo6PSA8PAorPHJlZmVyZW5jZWRUb2tlbkxhYmVscworOntpdCB8IGlmIChzdHJlYW1fPGl0PiAhPSBOVUxMKSBzdHJlYW1fPGl0Pi0+ZnJlZShzdHJlYW1fPGl0Pik7IH07CitzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHMKKzp7aXQgfCBpZiAoc3RyZWFtXzxpdD4gIT0gTlVMTCkgc3RyZWFtXzxpdD4tPmZyZWUoc3RyZWFtXzxpdD4pO307CitzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRSdWxlTGFiZWxzCis6e2l0IHwgaWYgKHN0cmVhbV88aXQ+ICE9IE5VTEwpIHN0cmVhbV88aXQ+LT5mcmVlKHN0cmVhbV88aXQ+KTt9Oworc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMKKzp7aXQgfCBpZiAoc3RyZWFtXzxpdD4gIT0gTlVMTCkgc3RyZWFtXzxpdD4tPmZyZWUoc3RyZWFtXzxpdD4pO307CitzZXBhcmF0b3I9IlxuIgorPgorPj4KKworLyoqIEdlbmVyYXRlIGNvZGUgZm9yIGFuIG9wdGlvbmFsIHJld3JpdGUgYmxvY2s7IG5vdGUgaXQgdXNlcyB0aGUgZGVlcCByZWYnZCBlbGVtZW50CisgICogIGxpc3QgcmF0aGVyIHNoYWxsb3cgbGlrZSBvdGhlciBibG9ja3MuCisgICovCityZXdyaXRlT3B0aW9uYWxCbG9jaygKKwlhbHQsCisJcmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLAkJLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit7CisJaWYgKCA8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDp7ZWwgfCAoc3RyZWFtXzxlbD4gIT0gTlVMTCAmJiBzdHJlYW1fPGVsPi0+aGFzTmV4dChzdHJlYW1fPGVsPikpIH07IHNlcGFyYXRvcj0ifHwgIj4gKQorCXsKKwkJPGFsdD4KKwl9CisJPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgaWYgKCBzdHJlYW1fPGVsPiAhPSBOVUxMKSBzdHJlYW1fPGVsPi0+cmVzZXQoc3RyZWFtXzxlbD4pOzxcbj59PgorfTxcbj4KKz4+CisKK3Jld3JpdGVDbG9zdXJlQmxvY2soCisJYWx0LAorCXJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywJCS8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworCXdoaWxlICggPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCAoc3RyZWFtXzxlbD4gIT0gTlVMTCAmJiBzdHJlYW1fPGVsPi0+aGFzTmV4dChzdHJlYW1fPGVsPikpIH07IHNlcGFyYXRvcj0ifHwgIj4gKQorCXsKKwkJPGFsdD4KKwl9CisJPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBpZiAoc3RyZWFtXzxlbD4gIT0gTlVMTCkgc3RyZWFtXzxlbD4tPnJlc2V0KHN0cmVhbV88ZWw+KTs8XG4+fT4KK308XG4+Cis+PgorUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbigpIDo6PQorPDwKK0NPTlNUUlVDVEVYKCk7CitFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19SRVdSSVRFX0VBUkxZX0VYQ0VQVElPTjsKK0VYQ0VQVElPTi0+bmFtZSAgICAgICAgID0gKHZvaWQgKilBTlRMUjNfUkVXUklURV9FQVJMWV9FWENFUFRJT05fTkFNRTsKKz4+CityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisJYWx0LAorCXJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywJCS8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKK2lmICg8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IChzdHJlYW1fPGVsPiA9PSBOVUxMIHx8ICFzdHJlYW1fPGVsPi0+aGFzTmV4dChzdHJlYW1fPGVsPikpIH07IHNlcGFyYXRvcj0ifHwgIj4gKQoreworICAgIDxSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKCk+Cit9CitlbHNlCit7CisJd2hpbGUgKCA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IChzdHJlYW1fPGVsPi0+aGFzTmV4dChzdHJlYW1fPGVsPikpIH07IHNlcGFyYXRvcj0ifHwgIj4gKSB7CisJCTxhbHQ+CisJfQorCTxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4tPnJlc2V0KHN0cmVhbV88ZWw+KTs8XG4+fT4KK30KKz4+CisKK3Jld3JpdGVBbHQoYSkgOjo9IDw8CisvLyA8YS5kZXNjcmlwdGlvbj4KKzxpZihhLnByZWQpPgoraWYgKDxhLnByZWQ+KQoreworICAgIDxhLmFsdD4KK308XG4+Cis8ZWxzZT4KK3sKKyAgICA8YS5hbHQ+Cit9PFxuPgorPGVuZGlmPgorPj4KKworLyoqIEZvciBlbXB0eSByZXdyaXRlczogInIgOiAuLi4gLT4gOyIgKi8KK3Jld3JpdGVFbXB0eUFsdCgpIDo6PSAicm9vdF8wID0gTlVMTDsgLyogXDwtLSByZXdyaXRlRW1wdHlBbHQoKSkgKi8iCisKK3Jld3JpdGVUcmVlKHJvb3QsY2hpbGRyZW4sZGVzY3JpcHRpb24sZW5jbG9zaW5nVHJlZUxldmVsLHRyZWVMZXZlbCkgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKyAgICA8QVNUTGFiZWxUeXBlPiByb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5uaWxOb2RlKEFEQVBUT1IpKTsKKyAgICA8cm9vdDpyZXdyaXRlRWxlbWVudCgpPgorICAgIDxjaGlsZHJlbjpyZXdyaXRlRWxlbWVudCgpPgorICAgIEFEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4sIHJvb3RfPHRyZWVMZXZlbD4pOworfTxcbj4KKz4+CisKK3Jld3JpdGVFbGVtZW50TGlzdChlbGVtZW50cykgOjo9ICI8ZWxlbWVudHM6cmV3cml0ZUVsZW1lbnQoKT4iCisKK3Jld3JpdGVFbGVtZW50KGUpIDo6PSA8PAorPEBwcmVnZW4oKT4KKzxlLmVsPgorPj4KKworLyoqIEdlbiBJRCBvciBJRFthcmdzXSAqLworcmV3cml0ZVRva2VuUmVmKHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPik7PFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsPUlEICovCityZXdyaXRlVG9rZW5MYWJlbFJlZihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorQURBUFRPUi0+YWRkQ2hpbGQoQURBUFRPUiwgcm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4gPT0gTlVMTCA/IE5VTEwgOiBzdHJlYW1fPGxhYmVsPi0+bmV4dE5vZGUoc3RyZWFtXzxsYWJlbD4pKTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK0FEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+ID09IE5VTEwgPyBOVUxMIDogc3RyZWFtXzxsYWJlbD4tPm5leHROb2RlKHN0cmVhbV88bGFiZWw+KSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRsYWJlbCAuLi4pICovCityZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3RUb2tlbihBREFQVE9SLCBzdHJlYW1fPGxhYmVsPiA9PSBOVUxMID8gTlVMTCA6IHN0cmVhbV88bGFiZWw+LT5uZXh0VG9rZW4oc3RyZWFtXzxsYWJlbD4pLCByb290Xzx0cmVlTGV2ZWw+KSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRsYWJlbCAuLi4pIHdoZXJlIGxhYmVsKz0uLi4gKi8KK3Jld3JpdGVUb2tlbkxpc3RMYWJlbFJlZlJvb3QgOjo9IHJld3JpdGVUb2tlbkxhYmVsUmVmUm9vdAorCisvKiogR2VuIF4oSUQgLi4uKSBvciBeKElEW2FyZ3NdIC4uLikgKi8KK3Jld3JpdGVUb2tlblJlZlJvb3QodG9rZW4sZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3QoQURBUFRPUiwgPGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4sIHJvb3RfPHRyZWVMZXZlbD4pKTs8XG4+Cis+PgorCityZXdyaXRlSW1hZ2luYXJ5VG9rZW5SZWYoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK0FEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPHRyZWVMZXZlbD4sIDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3QoQURBUFRPUiwgPGNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlPXRva2VuLCAuLi4pPiwgcm9vdF88dHJlZUxldmVsPikpOzxcbj4KKz4+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfMCA9IDxhY3Rpb24+Ozxcbj4KKz4+CisKKy8qKiBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGlzIHJ1bGUncyByb290IHRyZWU/ICBUaGlzCisgKiAgbGV0J3MgdXMgcmVmZXIgdG8gJHJ1bGUgdG8gbWVhbiBwcmV2aW91cyB2YWx1ZS4gIEkgYW0gcmV1c2luZyB0aGUKKyAqICB2YXJpYWJsZSAndHJlZScgc2l0dGluZyBpbiByZXR2YWwgc3RydWN0IHRvIGhvbGQgdGhlIHZhbHVlIG9mIHJvb3RfMCByaWdodAorICogIGJlZm9yZSBJIHNldCBpdCBkdXJpbmcgcmV3cml0ZXMuICBUaGUgYXNzaWduIHdpbGwgYmUgdG8gcmV0dmFsLnRyZWUuCisgKi8KK3ByZXZSdWxlUm9vdFJlZigpIDo6PSAicmV0dmFsIgorCityZXdyaXRlUnVsZVJlZihydWxlLGR1cCkgOjo9IDw8CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPHJ1bGU+ID09IE5VTEwgPyBOVUxMIDogc3RyZWFtXzxydWxlPi0+bmV4dFRyZWUoc3RyZWFtXzxydWxlPikpOzxcbj4KKz4+CisKK3Jld3JpdGVSdWxlUmVmUm9vdChydWxlLGR1cCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5iZWNvbWVSb290KEFEQVBUT1IsIHN0cmVhbV88cnVsZT4gPT0gTlVMTCA/IE5VTEwgOiBzdHJlYW1fPHJ1bGU+LT5uZXh0Tm9kZShzdHJlYW1fPHJ1bGU+KSwgcm9vdF88dHJlZUxldmVsPikpOzxcbj4KKz4+CisKK3Jld3JpdGVOb2RlQWN0aW9uKGFjdGlvbikgOjo9IDw8CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290Xzx0cmVlTGV2ZWw+LCA8YWN0aW9uPik7PFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb25Sb290KGFjdGlvbikgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU0xhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3QoQURBUFRPUiwgPGFjdGlvbj4sIHJvb3RfPHRyZWVMZXZlbD4pKTs8XG4+Cis+PgorCisvKiogR2VuICRydWxlTGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIHJ1bGVMYWJlbD1ydWxlICovCityZXdyaXRlUnVsZUxhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK0FEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+ID09IE5VTEwgPyBOVUxMIDogc3RyZWFtXzxsYWJlbD4tPm5leHRUcmVlKHN0cmVhbV88bGFiZWw+KSk7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK0FEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+ID09IE5VTEwgPyBOVUxMIDogc3RyZWFtXzxsYWJlbD4tPm5leHRUcmVlKHN0cmVhbV88bGFiZWw+KSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPikoQURBUFRPUi0+YmVjb21lUm9vdChBREFQVE9SLCBzdHJlYW1fPGxhYmVsPiA9PSBOVUxMID8gTlVMTCA6IHN0cmVhbV88bGFiZWw+LT5uZXh0Tm9kZShzdHJlYW1fPGxhYmVsPiksIHJvb3RfPHRyZWVMZXZlbD4pKTs8XG4+Cis+PgorCisvKiogR2VuIF4oJHJ1bGVMYWJlbCAuLi4pIHdoZXJlIHJ1bGVMYWJlbCs9cnVsZSAqLworcmV3cml0ZVJ1bGVMaXN0TGFiZWxSZWZSb290KGxhYmVsKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3QoKDxBU1RMYWJlbFR5cGU+KShzdHJlYW1fPGxhYmVsPiA9PSBOVUxMID8gTlVMTCA6IHN0cmVhbV88bGFiZWw+LT5uZXh0Tm9kZShzdHJlYW1fPGxhYmVsPiksIHJvb3RfPHRyZWVMZXZlbD4pKTs8XG4+Cis+PgorCityZXdyaXRlV2lsZGNhcmRMYWJlbFJlZihsYWJlbCkgOjo9IDw8CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPiA9PSBOVUxMID8gTlVMTCA6IHN0cmVhbV88bGFiZWw+LT5uZXh0VHJlZShzdHJlYW1fPGxhYmVsPikpOzxcbj4KKz4+CisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsLCBhcmdzKSAhPgorPHRlcm1pbmFsT3B0aW9ucy5ub2RlPk5ldyg8dG9rZW5UeXBlPjxpZihhcmdzKT4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj48ZW5kaWY+KQorPGVsc2U+Cis8aWYoYXJncyk+CisKKyNpZiA8bGVuZ3RoKGFyZ3MpPiA9PSAyCisJKDxBU1RMYWJlbFR5cGU+KUFEQVBUT1ItPmNyZWF0ZVR5cGVUb2tlblRleHQoQURBUFRPUiwgPHRva2VuVHlwZT4sIFRPS1RFWFQoPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPikpCisjZWxzZQorCSg8QVNUTGFiZWxUeXBlPilBREFQVE9SLT5jcmVhdGVUeXBlVGV4dChBREFQVE9SLCA8dG9rZW5UeXBlPiwgKHBBTlRMUjNfVUlOVDgpPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPikKKyNlbmRpZgorCis8ZWxzZT4KKyg8QVNUTGFiZWxUeXBlPilBREFQVE9SLT5jcmVhdGVUeXBlVGV4dChBREFQVE9SLCA8dG9rZW5UeXBlPiwgKHBBTlRMUjNfVUlOVDgpIjx0b2tlblR5cGU+IikKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT5OZXcoc3RyZWFtXzx0b2tlbj4tPm5leHRUb2tlbihzdHJlYW1fPHRva2VuPik8aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorPGlmKGFyZ3MpPiA8ISBtdXN0IGNyZWF0ZSBuZXcgbm9kZSBmcm9tIG9sZCAhPgorCisjaWYJPGxlbmd0aChhcmdzKT4gPT0gMgorQURBUFRPUi0+Y3JlYXRlVHlwZVRva2VuVGV4dChBREFQVE9SLCA8dG9rZW4+LT5nZXRUeXBlKDx0b2tlbj4sIFRPS1RFWFQoPHRva2VuPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPikpIC8qIEpJTUkgKi8KKyNlbHNlCitBREFQVE9SLT5jcmVhdGVUeXBlVG9rZW4oQURBUFRPUiwgPHRva2VuPi0+Z2V0VHlwZSg8dG9rZW4+LCA8dG9rZW4+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+KQorI2VuZGlmCisKKzxlbHNlPgorc3RyZWFtXzx0b2tlbj4gPT0gTlVMTCA/IE5VTEwgOiBzdHJlYW1fPHRva2VuPi0+bmV4dE5vZGUoc3RyZWFtXzx0b2tlbj4pCis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DL0FTVERiZy5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0MvQVNURGJnLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFiZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DL0FTVERiZy5zdGcKQEAgLTAsMCArMSw1NiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisgaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKworIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gQVNUIHN0dWZmLiAgRHluYW1pYyBpbmhlcml0YW5jZQorICogIGhpZXJhcmNoeSBpcyBzZXQgdXAgYXMgQVNURGJnIDogQVNUIDogRGJnIDogSmF2YSBieSBjb2RlIGdlbmVyYXRvci4KKyAqLworcGFyc2VyTWVtYmVycygpIDo6PSA8PAorcHJvdGVjdGVkIERlYnVnVHJlZUFkYXB0b3IgYWRhcHRvciA9CisgICAgbmV3IERlYnVnVHJlZUFkYXB0b3IobnVsbCxuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKSk7CitwdWJsaWMgdm9pZCBzZXRUcmVlQWRhcHRvcihUcmVlQWRhcHRvciBhZGFwdG9yKSB7CisgICAgdGhpcy5hZGFwdG9yID0gbmV3IERlYnVnVHJlZUFkYXB0b3IoZGJnLGFkYXB0b3IpOworfQorcHVibGljIFRyZWVBZGFwdG9yIGdldFRyZWVBZGFwdG9yKCkgeworICAgIHJldHVybiBhZGFwdG9yOworfTxcbj4KKz4+CisKK3BhcnNlckN0b3JCb2R5KCkgOjo9IDw8Cis+PgorCitjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpIDo6PSA8PAorPHN1cGVyLmNyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCk+Cis+PgorCitjdG9yRm9yUHJlZGVmaW5lZExpc3RlbmVyKCkgOjo9IDw8Cis+PgorCitAcmV3cml0ZUVsZW1lbnQucHJlZ2VuKCkgOjo9ICIiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0MvQVNUUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQy9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NWY3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0MvQVNUUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisgaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKworIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGVzIGZvciBidWlsZGluZyBBU1RzIGR1cmluZyBub3JtYWwgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIFRoZSBzaXR1YXRpb24gaXMgbm90IHRvbyBiYWQgYXMgcmV3cml0ZSAoLT4pIHVzYWdlIG1ha2VzIF4gYW5kICEKKyAqICBpbnZhbGlkLiBUaGVyZSBpcyBubyBodWdlIGV4cGxvc2lvbiBvZiBjb21iaW5hdGlvbnMuCisgKi8KKworQHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSgpIDo6PSA8PAorcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmVycm9yTm9kZShBREFQVE9SLCBJTlBVVCwgcmV0dmFsLnN0YXJ0LCBMVCgtMSksIEVYQ0VQVElPTikpOworPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5jcmVhdGUoQURBUFRPUiwgPGxhYmVsPikpOworQURBUFRPUi0+YWRkQ2hpbGQoQURBUFRPUiwgcm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9ICI8c3VwZXIudG9rZW5SZWYoLi4uKT4iCisKKy8qKiBJRF4gYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT47Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3QoQURBUFRPUiwgPGxhYmVsPl90cmVlLCByb290XzApKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCisvKiogaWRzKz1JRCEgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmQmFuZ0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworCisvKiogbGFiZWwrPVRPS0VOIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisKKy8qKiBNYXRjaCBsYWJlbCs9VE9LRU5eIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLy8gU0VUIEFTVAorCisvLyB0aGUgbWF0Y2ggc2V0IHN0dWZmIGlzIGludGVyZXN0aW5nIGluIHRoYXQgaXQgdXNlcyBhbiBhcmd1bWVudCBsaXN0CisvLyB0byBwYXNzIGNvZGUgdG8gdGhlIGRlZmF1bHQgbWF0Y2hTZXQ7IGFub3RoZXIgcG9zc2libGUgd2F5IHRvIGFsdGVyCisvLyBpbmhlcml0ZWQgY29kZS4gIEkgZG9uJ3QgdXNlIHRoZSByZWdpb24gc3R1ZmYgYmVjYXVzZSBJIG5lZWQgdG8gcGFzcworLy8gZGlmZmVyZW50IGNodW5rcyBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdG9yLiAgSSBkb24ndCBsaWtlIG1ha2luZworLy8gdGhlIHRlbXBsYXRlIG5hbWUgaGF2ZSB0aGUgb3BlcmF0b3IgYXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZXMgZ2V0cworLy8gbGFyZ2UgYnV0IHRoaXMgaXMgdGhlIG1vc3QgZmxleGlibGUtLXRoaXMgaXMgYXMgb3Bwb3NlZCB0byBoYXZpbmcKKy8vIHRoZSBjb2RlIGdlbmVyYXRvciBjYWxsIG1hdGNoU2V0IHRoZW4gYWRkIHJvb3QgY29kZSBvciBydWxlcm9vdCBjb2RlCisvLyBwbHVzIGxpc3QgbGFiZWwgcGx1cyAuLi4gIFRoZSBjb21iaW5hdGlvbnMgbWlnaHQgcmVxdWlyZSBjb21wbGljYXRlZAorLy8gcmF0aGVyIHRoYW4ganVzdCBhZGRlZCBvbiBjb2RlLiAgSW52ZXN0aWdhdGUgdGhhdCByZWZhY3RvcmluZyB3aGVuCisvLyBJIGhhdmUgbW9yZSB0aW1lLgorCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17PGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5BREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290XzAsIDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+KTt9LC4uLik+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxwb3N0bWF0Y2hDb2RlKSA6Oj0gIjxzdXBlci5tYXRjaFNldCguLi4pPiIKKworLy8gbm90ZSB0aGVyZSBpcyBubyBtYXRjaFNldFRyYWNrIGJlY2F1c2UgLT4gcmV3cml0ZXMgZm9yY2Ugc2V0cyB0byBiZQorLy8gcGxhaW4gb2xkIGJsb2NrcyBvZiBhbHRzOiAoQXxCfC4uLnxDKQorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj0oPGxhYmVsVHlwZT4pTFQoMSk7PFxuPgorPGVuZGlmPgorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9ezxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+cm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5iZWNvbWVSb290KEFEQVBUT1IsIDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+LCByb290XzApKTt9LC4uLik+Cis+PgorCisvLyBSVUxFIFJFRiBBU1QKKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+QURBUFRPUi0+YWRkQ2hpbGQoQURBUFRPUiwgcm9vdF8wLCA8bGFiZWw+LnRyZWUpOworPj4KKworLyoqIHJ1bGUhIGlzIHNhbWUgYXMgbm9ybWFsIHJ1bGUgcmVmICovCitydWxlUmVmQmFuZyhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gIjxzdXBlci5ydWxlUmVmKC4uLik+IgorCisvKiogcnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnJvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPikoQURBUFRPUi0+YmVjb21lUm9vdChBREFQVE9SLCA8bGFiZWw+LnRyZWUsIHJvb3RfMCkpOworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWxBU1QoLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlISB3aGVuIG91dHB1dD1BU1QgaXMgYSBydWxlIHJlZiB3aXRoIGxpc3QgYWRkaXRpb24gKi8KK3J1bGVSZWZCYW5nQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZCYW5nKC4uLik+Cis8bGlzdExhYmVsQVNUKC4uLik+Cis+PgorCisvKiogeCs9cnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWxBU1QoLi4uKT4KKz4+CisKKy8vIFdJTERDQVJEIEFTVAorCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmNyZWF0ZShBREFQVE9SLCA8bGFiZWw+KSk7CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290XzAsIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKword2lsZGNhcmRCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSAiPHN1cGVyLndpbGRjYXJkKC4uLik+IgorCit3aWxkY2FyZFJ1bGVSb290KGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8c3VwZXIud2lsZGNhcmQoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5jcmVhdGUoQURBUFRPUiwgPGxhYmVsPikpOworcm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5iZWNvbWVSb290KEFEQVBUT1IsIDxsYWJlbD5fdHJlZSwgcm9vdF8wKSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT5OZXcoPGxhYmVsPikgPCEgbmV3IE1ldGhvZE5vZGUoSURMYWJlbCkgIT4KKzxlbHNlPgorKDxBU1RMYWJlbFR5cGU+KShBREFQVE9SLT5jcmVhdGUoQURBUFRPUiwgPGxhYmVsPikpCis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKQorezxcbj4KKzxlbmRpZj4KKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKwlyZXR2YWwuc3RvcCA9IExUKC0xKTs8XG4+Cis8ZW5kaWY+CisJcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPnJ1bGVQb3N0UHJvY2Vzc2luZyhBREFQVE9SLCByb290XzApKTsKKwlBREFQVE9SLT5zZXRUb2tlbkJvdW5kYXJpZXMoQURBUFRPUiwgcmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworICAgIDxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2l0IHwgaWYgKHN0cmVhbV88aXQ+ICE9IE5VTEwpIHN0cmVhbV88aXQ+LT5mcmVlKHN0cmVhbV88aXQ+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8cnVsZURlc2NyaXB0b3IuYWxsUnVsZVJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2l0IHwgaWYgKHN0cmVhbV88aXQ+ICE9IE5VTEwpIHN0cmVhbV88aXQ+LT5mcmVlKHN0cmVhbV88aXQ+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxpZihiYWNrdHJhY2tpbmcpPgorfTxcbj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0MvQVNUVHJlZVBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0MvQVNUVHJlZVBhcnNlci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhYzZkNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQy9BU1RUcmVlUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisgaHR0cDovL3d3dy50ZW1wb3JhbC13YXZlLmNvbQorIGh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2ppbWlkbGUKKworIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGVzIGZvciBidWlsZGluZyBBU1RzIGR1cmluZyB0cmVlIHBhcnNpbmcuCisgKgorICogIERlYWwgd2l0aCBtYW55IGNvbWJpbmF0aW9ucy4gIERpbWVuc2lvbnMgYXJlOgorICogIEF1dG8gYnVpbGQgb3IgcmV3cml0ZQorICogICAgbm8gbGFiZWwsIGxhYmVsLCBsaXN0IGxhYmVsICAobGFiZWwvbm8tbGFiZWwgaGFuZGxlZCB0b2dldGhlcikKKyAqICAgIGNoaWxkLCByb290CisgKiAgICB0b2tlbiwgc2V0LCBydWxlLCB3aWxkY2FyZAorICoKKyAqICBFYWNoIGNvbWJpbmF0aW9uIGhhcyBpdHMgb3duIHRlbXBsYXRlIGV4Y2VwdCB0aGF0IGxhYmVsL25vIGxhYmVsCisgKiAgaXMgY29tYmluZWQgaW50byB0b2tlblJlZiwgcnVsZVJlZiwgLi4uCisgKi8KKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBsYXN0IGVsZW1lbnQgbWF0Y2hlZCAqLworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KKzxBU1RMYWJlbFR5cGU+IF9sYXN0Ozxcbj4KKzxBU1RMYWJlbFR5cGU+IF9maXJzdF8wOzxcbj4KKz4+CisKKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBsYXN0IGVsZW1lbnQgbWF0Y2hlZCAqLworcnVsZUluaXRpYWxpemF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVJbml0aWFsaXphdGlvbnMoKT4KK19sYXN0ID0gTlVMTDs8XG4+CitfZmlyc3RfMCA9IE5VTEw7PFxuPgorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUgcnVsZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIEJBQ0tUUkFDS0lORyA9PTAgKSB7PGVuZGlmPgorPGlmKHJld3JpdGVNb2RlKT4KK3JldHZhbC50cmVlID0gKDxBU1RMYWJlbFR5cGU+KV9maXJzdF8wOworaWYgKCBBREFQVE9SLT5nZXRQYXJlbnQoQURBUFRPUiwgcmV0dmFsLnRyZWUpICE9IE5VTEwgJiYgQURBUFRPUi0+aXNOaWxOb2RlKEFEQVBUT1IsIEFEQVBUT1ItPmdldFBhcmVudChBREFQVE9SLCByZXR2YWwudHJlZSkgKSApCit7CisgICAgcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pQURBUFRPUi0+Z2V0UGFyZW50KEFEQVBUT1IsIHJldHZhbC50cmVlKTsKK30KKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCisvKiogbWF0Y2ggXihyb290IGNoaWxkcmVuKSBpbiB0cmVlIHBhcnNlcjsgb3ZlcnJpZGUgaGVyZSB0bworICogIGFkZCB0cmVlIGNvbnN0cnVjdGlvbiBhY3Rpb25zLgorICovCit0cmVlKHJvb3QsIGFjdGlvbnNBZnRlclJvb3QsIGNoaWxkcmVuLCBudWxsYWJsZUNoaWxkTGlzdCwKKyAgICAgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4pTFQoMSk7Cit7Cis8QVNUTGFiZWxUeXBlPiBfc2F2ZV9sYXN0Xzx0cmVlTGV2ZWw+OworPEFTVExhYmVsVHlwZT4gX2ZpcnN0Xzx0cmVlTGV2ZWw+OworPGlmKCFyZXdyaXRlTW9kZSk+Cis8QVNUTGFiZWxUeXBlPiByb290Xzx0cmVlTGV2ZWw+OworPGVuZGlmPgorX3NhdmVfbGFzdF88dHJlZUxldmVsPiA9IF9sYXN0OworX2ZpcnN0Xzx0cmVlTGV2ZWw+ICAgICA9IE5VTEw7Cis8aWYoIXJld3JpdGVNb2RlKT4KK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPm5pbE5vZGUoQURBUFRPUikpOworPGVuZGlmPgorPHJvb3Q6ZWxlbWVudCgpPgorPGlmKHJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggQkFDS1RSQUNLSU5HID09MCApIHs8ZW5kaWY+Cis8aWYocm9vdC5lbC5ydWxlKT4KK2lmICggX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ID09IE5VTEwgKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD4udHJlZTsKKzxlbHNlPgoraWYgKCBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPT0gTlVMTCApIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9IDxyb290LmVsLmxhYmVsPjsKKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKCBMQSgxKT09QU5UTFIzX1RPS0VOX0RPV04gKSB7CisgICAgTUFUQ0hUKEFOVExSM19UT0tFTl9ET1dOLCBOVUxMKTsKKyAgICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICAgIE1BVENIVChBTlRMUjNfVE9LRU5fVVAsIE5VTEwpOworfQorPGVsc2U+CitNQVRDSFQoQU5UTFIzX1RPS0VOX0RPV04sIE5VTEwpOworPGNoaWxkcmVuOmVsZW1lbnQoKT4KK01BVENIVChBTlRMUjNfVE9LRU5fVVAsIE5VTEwpOworPGVuZGlmPgorPGlmKCFyZXdyaXRlTW9kZSk+CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTsKKzxlbmRpZj4KK19sYXN0ID0gX3NhdmVfbGFzdF88dHJlZUxldmVsPjsKK308XG4+Cis+PgorCisvLyBUT0tFTiBBU1QgU1RVRkYKKworLyoqIElEISBhbmQgb3V0cHV0PUFTVCAoc2FtZSBhcyBwbGFpbiB0b2tlblJlZikgJ2NlcHQgYWRkCisgKiAgc2V0dGluZyBvZiBfbGFzdAorICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPj4KKworLyoqIElEIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KUxUKDEpOworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggQkFDS1RSQUNLSU5HID09MCApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gPHRlcm1pbmFsT3B0aW9ucy5ub2RlPk5ldyg8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KUFEQVBUT1ItPmR1cE5vZGUoQURBUFRPUiwgPGxhYmVsPik7Cis8ZW5kaWY+CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCBCQUNLVFJBQ0tJTkcgPT0wICkgezxlbmRpZj4KK2lmICggX2ZpcnN0Xzx0cmVlTGV2ZWw+ID09IE5VTEwgKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+OworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBsYWJlbCs9VE9LRU4gYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIEJBQ0tUUkFDS0lORyA9PSAwICkgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSA8dGVybWluYWxPcHRpb25zLm5vZGU+TmV3KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pQURBUFRPUi0+ZHVwTm9kZShBREFQVE9SLCA8bGFiZWw+KTsKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KUFEQVBUT1ItPmJlY29tZVJvb3QoQURBUFRPUiwgPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGFuZCBhdXRvIGR1cCB0aGUgbm9kZS9zdWJ0cmVlICovCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KUxUKDEpOworPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KUFEQVBUT1ItPmR1cFRyZWUoQURBUFRPUiwgPGxhYmVsPik7CitBREFQVE9SLT5hZGRDaGlsZChBREFQVE9SLCByb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KK2lmICggX2ZpcnN0Xzx0cmVlTGV2ZWw+PT1udWxsICkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPjsKKzxlbmRpZj4KKz4+CisKKy8vIFNFVCBBU1QKKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4pTFQoMSk7Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggQkFDS1RSQUNLSU5HID09IDAgKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT5OZXcoPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilBREFQVE9SLT5kdXBOb2RlKEFEQVBUT1IsIDxsYWJlbD4pOworPGVuZGlmPjxcbj4KK0FEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT5cfTxlbmRpZj4KKzxlbmRpZj4KK30KKywuLi4pPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUsdHJlZUxldmVsPSIwIikgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxub1Jld3JpdGUoKT4gPCEgc2V0IHJldHVybiB0cmVlICE+Cis+PgorCittYXRjaFNldEJhbmcocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4pTFQoMSk7Cis8c3VwZXIubWF0Y2hTZXQoLi4uKT4KKz4+CisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXsKKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSA8dGVybWluYWxPcHRpb25zLm5vZGU+TmV3KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pQURBUFRPUi0+ZHVwTm9kZShBREFQVE9SLCA8bGFiZWw+KTsKKzxlbmRpZj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pQURBUFRPUi0+YmVjb21lUm9vdChBREFQVE9SLCA8bGFiZWw+X3RyZWUsIHJvb3RfPHRyZWVMZXZlbD4pOworPGlmKGJhY2t0cmFja2luZyk+XH08ZW5kaWY+Cis8ZW5kaWY+Cit9LCAuLi4KKyk+Cis+PgorCisvLyBSVUxFIFJFRiBBU1QKKworLyoqIHJ1bGUgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkKK3sKKzxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorCUFEQVBUT1ItPmFkZENoaWxkKEFEQVBUT1IsIHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD4udHJlZSk7Cis8ZWxzZT4KKwlpZiAoIF9maXJzdF88dHJlZUxldmVsPiA9PSBOVUxMICkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPi50cmVlOworPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiB4Kz1ydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxzdXBlci5saXN0TGFiZWxBU1QoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmUnVsZVJvb3QocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApICkgPGVuZGlmPnJvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pKEFEQVBUT1ItPmJlY29tZVJvb3QoQURBUFRPUiwgPGxhYmVsPi50cmVlLCByb290Xzx0cmVlTGV2ZWw+KSk7Cis8ZW5kaWY+Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxzdXBlci5saXN0TGFiZWxBU1QoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4pTFQoMSk7Cis8c3VwZXIucnVsZVJlZlRyYWNrKC4uLik+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci5ydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisvKiogXihydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci5ydWxlUmVmUm9vdFRyYWNrKC4uLik+Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilMVCgxKTsKKzxzdXBlci5ydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworCisvKiogU3RyZWFtcyBmb3IgdG9rZW4gcmVmcyBhcmUgdHJlZSBub2RlcyBub3c7IG92ZXJyaWRlIHRvCisgKiAgY2hhbmdlIG5leHRUb2tlbiB0byBuZXh0Tm9kZS4KKyAqLworY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsc2NvcGUpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT5OZXcoc3RyZWFtXzx0b2tlbj4tPm5leHROb2RlKHN0cmVhbV88dG9rZW4+KSkKKzxlbHNlPgorc3RyZWFtXzx0b2tlbj4tPm5leHROb2RlKHN0cmVhbV88dG9rZW4+KQorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxcbj4KKzxlbmRpZj4KKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKwlyZXR2YWwuc3RvcCA9IExUKC0xKTs8XG4+Cis8ZW5kaWY+CisJcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pQURBUFRPUi0+cnVsZVBvc3RQcm9jZXNzaW5nKEFEQVBUT1IsIHJvb3RfMCk7Cis8aWYoYmFja3RyYWNraW5nKT4KK30KKzxlbmRpZj4KKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2lmIChzdHJlYW1fPGl0PiAhPSBOVUxMKSBzdHJlYW1fPGl0Pi0+ZnJlZShzdHJlYW1fPGl0Pik7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IuYWxsUnVsZVJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2lmIChzdHJlYW1fPGl0PiAhPSBOVUxMKSBzdHJlYW1fPGl0Pi0+ZnJlZShzdHJlYW1fPGl0Pik7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DL0Muc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DL0Muc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViM2E3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0MvQy5zdGcKQEAgLTAsMCArMSwzMjU2IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisgaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qCisgKiBUaGlzIGNvZGUgZ2VuZXJhdGluZyB0ZW1wbGF0ZSBhbmQgdGhlIGFzc29jaWF0ZWQgQyBydW50aW1lIHdhcyBwcm9kdWNlZCBieToKKyAqIEppbSBJZGxlIGppbWl8aGVyZWlzYW5hdHxpZGxlfGRvdGdvZXNoZXJlfHdzLgorICogSWYgaXQgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgVW5pdmVyc2UsIGl0IHdpbGwgYmUgcHJldHR5IGNvb2wgc28gbG9uZyBhcworICogSSBhbSBpbiBhIGRpZmZlcmVudCBvbmUgYXQgdGhlIHRpbWUuCisgKi8KK2NUeXBlSW5pdE1hcCA6Oj0gWworCSJpbnQiCQkgICAgOiAiMCIsICAgICAgICAgICAgICAvLyBJbnRlZ2VycyAgICAgc3RhcnQgb3V0IGJlaW5nIDAKKwkibG9uZyIJCSAgICA6ICIwIiwgICAgICAgICAgICAgIC8vIExvbmdzICAgICAgICBzdGFydCBvdXQgYmVpbmcgMAorCSJmbG9hdCIJCSAgICA6ICIwLjAiLCAgICAgICAgICAgLy8gRmxvYXRzICAgICAgIHN0YXJ0IG91dCBiZWluZyAwCisJImRvdWJsZSIJICAgIDogIjAuMCIsICAgICAgICAgICAvLyBEb3VibGVzICAgICAgc3RhcnQgb3V0IGJlaW5nIDAKKwkiQU5UTFIzX0JPT0xFQU4iICAgIDogIkFOVExSM19GQUxTRSIsICAgLy8gQm9vbGVhbnMgICAgIHN0YXJ0IG91dCBiZWluZyBBbnRsciBDIGZvciBmYWxzZQorCSJieXRlIgkJICAgIDogIjAiLCAgICAgICAgICAgICAgLy8gQnl0ZXMgICAgICAgIHN0YXJ0IG91dCBiZWluZyAwCisJInNob3J0IgkJICAgIDogIjAiLCAgICAgICAgICAgICAgLy8gU2hvcnRzICAgICAgIHN0YXJ0IG91dCBiZWluZyAwCisJImNoYXIiCQkgICAgOiAiMCIgICAgICAgICAgICAgIC8vIENoYXJzICAgICAgICBzdGFydCBvdXQgYmVpbmcgMAorXQorCitsZWFkSW4odHlwZSkgOjo9Cis8PAorLyoqIFxmaWxlCisgKiAgVGhpcyA8dHlwZT4gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDxBTlRMUlZlcnNpb24+CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiA8ZmlsZU5hbWU+CisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDxnZW5lcmF0ZWRUaW1lc3RhbXA+Cis8aWYoTEVYRVIpPgorICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiA8bmFtZT5MZXhlcgorPGVuZGlmPgorPGlmKFBBUlNFUik+CisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IDxuYW1lPlBhcnNlcgorPGVuZGlmPgorPGlmKFRSRUVfUEFSU0VSKT4KKyAqICAgICAtICAgICAgICAgICBmb3IgdGhlIHRyZWUgcGFyc2VyIDogPG5hbWU+VHJlZVBhcnNlcgorPGVuZGlmPgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBKaW0gSWRsZSwgamltaXxoZXJlaXNhbmF0fGlkbGV8ZG90Z29lc2hlcmV8d3MuCisgKgorICoKKz4+CisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqLworb3V0cHV0RmlsZSggTEVYRVIsCisgICAgICAgICAgICBQQVJTRVIsCisgICAgICAgICAgICBUUkVFX1BBUlNFUiwKKyAgICAgICAgICAgIGFjdGlvblNjb3BlLAorICAgICAgICAgICAgYWN0aW9ucywKKyAgICAgICAgICAgIGRvY0NvbW1lbnQsCisgICAgICAgICAgICByZWNvZ25pemVyLAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHRva2VucywKKyAgICAgICAgICAgIHRva2VuTmFtZXMsCisgICAgICAgICAgICBydWxlcywKKyAgICAgICAgICAgIGN5Y2xpY0RGQXMsCisgICAgICAgICAgICBiaXRzZXRzLAorICAgICAgICAgICAgYnVpbGRUZW1wbGF0ZSwKKyAgICAgICAgICAgIGJ1aWxkQVNULAorICAgICAgICAgICAgcmV3cml0ZU1vZGUsCisgICAgICAgICAgICBwcm9maWxlLAorICAgICAgICAgICAgYmFja3RyYWNraW5nLAorICAgICAgICAgICAgc3lucHJlZHMsCisgICAgICAgICAgICBtZW1vaXplLAorICAgICAgICAgICAgbnVtUnVsZXMsCisgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgIEFOVExSVmVyc2lvbiwKKyAgICAgICAgICAgIGdlbmVyYXRlZFRpbWVzdGFtcCwKKyAgICAgICAgICAgIHRyYWNlLAorICAgICAgICAgICAgc2NvcGVzLAorICAgICAgICAgICAgc3VwZXJDbGFzcywKKyAgICAgICAgICAgIGxpdGVyYWxzCisgICAgICAgICAgICApIDo6PQorPDwKKzxsZWFkSW4oIkMgc291cmNlIik+CisqLworLy8gW1RoZSAiQlNEIGxpY2Vuc2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcik+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGlzIHdoYXQgdGhlIGdyYW1tYXIgcHJvZ3JhbW1lciBhc2tlZCB1cyB0byBwdXQgYXQgdGhlIHRvcCBvZiBldmVyeSBmaWxlLgorICovCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKy8qIEVuZCBvZiBIZWFkZXIgYWN0aW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworPGVuZGlmPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2luY2x1ZGUgICAgIjxuYW1lPi5oIgorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wb3N0aW5jbHVkZT4KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKzxkb2NDb21tZW50PgorCis8aWYobGl0ZXJhbHMpPgorLyoqIFN0cmluZyBsaXRlcmFscyB1c2VkIGJ5IDxuYW1lPiB0aGF0IHdlIG11c3QgZG8gdGhpbmdzIGxpa2UgTUFUQ0hTKCkgd2l0aC4KKyAqICBDIHdpbGwgbm9ybWFsbHkganVzdCBsYXkgZG93biA4IGJpdCBjaGFyYWN0ZXJzLCBhbmQgeW91IGNhbiB1c2UgTCJ4eHgiIHRvCisgKiAgZ2V0IHdjaGFyX3QsIGJ1dCB3Y2hhcl90IGlzIDE2IGJpdHMgb24gV2luZG93cywgd2hpY2ggaXMgbm90IFVURjMyIGFuZCBzbworICogIHdlIHBlcmZvcm0gdGhpcyBsaXR0bGUgdHJpY2sgb2YgZGVmaW5pbmcgdGhlIGxpdGVyYWxzIGFzIGFycmF5cyBvZiBVSU5UMzIKKyAqICBhbmQgcGFzc2luZyBpbiB0aGUgYWRkcmVzcyBvZiB0aGVzZS4KKyAqLworPGxpdGVyYWxzOntpdCB8IHN0YXRpYyBBTlRMUjNfVUNIQVIJbGl0XzxpPltdICA9IDxpdD47fTsgc2VwYXJhdG9yPSJcbiI+CisKKzxlbmRpZj4KKworCisKKworLyogTUFDUk9TIHRoYXQgaGlkZSB0aGUgQyBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25zIGZyb20gdGhlCisgKiBnZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWFrZXMgaXQgYSBsaXR0bGUgbW9yZSB1bmRlcnN0YW5kYWJsZSB0byB0aGUgaHVtYW4gZXllLgorICogSSBhbSB2ZXJ5IG11Y2ggYWdhaW5zdCB1c2luZyBDIHByZS1wcm9jZXNzb3IgbWFjcm9zIGZvciBmdW5jdGlvbiBjYWxscyBhbmQgYml0cworICogb2YgY29kZSBhcyB5b3UgY2Fubm90IHNlZSB3aGF0IGlzIGhhcHBlbmluZyB3aGVuIHNpbmdsZSBzdGVwcGluZyBpbiBkZWJ1Z2dlcnMKKyAqIGFuZCBzbyBvbi4gVGhlIGV4Y2VwdGlvbiAoaW4gbXkgYm9vayBhdCBsZWFzdCkgaXMgZm9yIGdlbmVyYXRlZCBjb2RlLCB3aGVyZSB5b3UgYXJlCisgKiBub3QgbWFpbnRhaW5pbmcgaXQsIGJ1dCBtYXkgd2lzaCB0byByZWFkIGFuZCB1bmRlcnN0YW5kIGl0LiBJZiB5b3Ugc2luZ2xlIHN0ZXAgaXQsIHlvdSBrbm93IHRoYXQgaW5wdXQoKQorICogaGlkZXMgc29tZSBpbmRpcmVjdCBjYWxscywgYnV0IGlzIGFsd2F5cyByZWZlcnJpbmcgdG8gdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBpcworICogcHJvYmFibHkgbW9yZSByZWFkYWJsZSB0aGFuIGN0eC0+aW5wdXQtPmlzdHJlYW0tPmlucHV0KHNuYXJmbGUwLT5ibGFyZykgYW5kIGFsbG93cyBtZSB0byByZWppZworICogdGhlIHJ1bnRpbWUgaW50ZXJmYWNlcyB3aXRob3V0IGNoYW5naW5nIHRoZSBnZW5lcmF0ZWQgY29kZSB0b28gb2Z0ZW4sIHdpdGhvdXQKKyAqIGNvbmZ1c2luZyB0aGUgcmVhZGVyIG9mIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCB3aG8gbWF5IG5vdCB3aXNoIHRvIGtub3cgdGhlIGdvcnkKKyAqIGRldGFpbHMgb2YgdGhlIGludGVyZmFjZSBpbmhlcml0YW5jZS4KKyAqLworCisjZGVmaW5lCQlDVFgJY3R4CisKKy8qIEFpZHMgaW4gYWNjZXNzaW5nIHNjb3BlcyBmb3IgZ3JhbW1hciBwcm9ncmFtbWVycworICovCisjdW5kZWYJU0NPUEVfVFlQRQorI3VuZGVmCVNDT1BFX1NUQUNLCisjdW5kZWYJU0NPUEVfVE9QCisjZGVmaW5lCVNDT1BFX1RZUEUoc2NvcGUpICAgcDxuYW1lPl8jI3Njb3BlIyNfU0NPUEUKKyNkZWZpbmUgU0NPUEVfU1RBQ0soc2NvcGUpICBwPG5hbWU+XyMjc2NvcGUjI1N0YWNrCisjZGVmaW5lCVNDT1BFX1RPUChzY29wZSkgICAgY3R4LT5wPG5hbWU+XyMjc2NvcGUjI1RvcAorI2RlZmluZQlTQ09QRV9TSVpFKHNjb3BlKQkJY3R4LT5wPG5hbWU+XyMjc2NvcGUjI1N0YWNrX2xpbWl0CisjZGVmaW5lIFNDT1BFX0lOU1RBTkNFKHNjb3BlLCBpKQkoY3R4LT5TQ09QRV9TVEFDSyhzY29wZSktPmdldChjdHgtPlNDT1BFX1NUQUNLKHNjb3BlKSxpKSkKKworPGlmKExFWEVSKT4KKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhpbmdzIGluIGEgbGV4ZXIKKyAqLworI3VuZGVmCSAgICBMRVhFUgorI3VuZGVmCSAgICBSRUNPR05JWkVSCisjdW5kZWYJICAgIFJVTEVNRU1PCisjdW5kZWYJICAgIEdFVENIQVJJTkRFWAorI3VuZGVmCSAgICBHRVRMSU5FCisjdW5kZWYJICAgIEdFVENIQVJQT1NJVElPTklOTElORQorI3VuZGVmCSAgICBFTUlUCisjdW5kZWYJICAgIEVNSVRORVcKKyN1bmRlZgkgICAgTUFUQ0hDCisjdW5kZWYJICAgIE1BVENIUworI3VuZGVmCSAgICBNQVRDSFJBTkdFCisjdW5kZWYJICAgIExUT0tFTgorI3VuZGVmCSAgICBIQVNGQUlMRUQKKyN1bmRlZgkgICAgRkFJTEVERkxBRworI3VuZGVmCSAgICBJTlBVVAorI3VuZGVmCSAgICBTVFJTVFJFQU0KKyN1bmRlZgkgICAgTEEKKyN1bmRlZgkgICAgSEFTRVhDRVBUSU9OCisjdW5kZWYJICAgIEVYQ0VQVElPTgorI3VuZGVmCSAgICBDT05TVFJVQ1RFWAorI3VuZGVmCSAgICBDT05TVU1FCisjdW5kZWYJICAgIExSRUNPVkVSCisjdW5kZWYJICAgIE1BUksKKyN1bmRlZgkgICAgUkVXSU5ECisjdW5kZWYJICAgIFJFV0lORExBU1QKKyN1bmRlZgkgICAgQkFDS1RSQUNLSU5HCisjdW5kZWYJCU1BVENIQU5ZCisjdW5kZWYJCU1FTU9JWkUKKyN1bmRlZgkJSEFWRVBBUlNFRFJVTEUKKyN1bmRlZgkJR0VUVEVYVAorI3VuZGVmCQlJTkRFWAorI3VuZGVmCQlTRUVLCisjdW5kZWYJCVBVU0hTVFJFQU0KKyN1bmRlZgkJUE9QU1RSRUFNCisjdW5kZWYJCVNFVFRFWFQKKyN1bmRlZgkJU0VUVEVYVDgKKworI2RlZmluZQkgICAgTEVYRVIJCQkJCWN0eC0+cExleGVyCisjZGVmaW5lCSAgICBSRUNPR05JWkVSCQkJICAgIExFWEVSLT5yZWMKKyNkZWZpbmUJCUxFWFNUQVRFCQkJCVJFQ09HTklaRVItPnN0YXRlCisjZGVmaW5lCQlUT0tTT1VSQ0UJCQkJTEVYU1RBVEUtPnRva1NvdXJjZQorI2RlZmluZQkgICAgR0VUQ0hBUklOREVYKCkJCQlMRVhFUi0+Z2V0Q2hhckluZGV4KExFWEVSKQorI2RlZmluZQkgICAgR0VUTElORSgpCQkJCUxFWEVSLT5nZXRMaW5lKExFWEVSKQorI2RlZmluZQkgICAgR0VUVEVYVCgpCQkJCUxFWEVSLT5nZXRUZXh0KExFWEVSKQorI2RlZmluZQkgICAgR0VUQ0hBUlBPU0lUSU9OSU5MSU5FKCkgTEVYRVItPmdldENoYXJQb3NpdGlvbkluTGluZShMRVhFUikKKyNkZWZpbmUJICAgIEVNSVQoKQkJCQkJTEVYU1RBVEUtPnR5cGUgPSBfdHlwZTsgTEVYRVItPmVtaXQoTEVYRVIpCisjZGVmaW5lCSAgICBFTUlUTkVXKHQpCQkJCUxFWEVSLT5lbWl0TmV3KExFWEVSLCB0KQorI2RlZmluZQkgICAgTUFUQ0hDKGMpCQkJCUxFWEVSLT5tYXRjaGMoTEVYRVIsIGMpCisjZGVmaW5lCSAgICBNQVRDSFMocykJCQkJTEVYRVItPm1hdGNocyhMRVhFUiwgcykKKyNkZWZpbmUJICAgIE1BVENIUkFOR0UoYzEsYzIpCSAgICBMRVhFUi0+bWF0Y2hSYW5nZShMRVhFUiwgYzEsIGMyKQorI2RlZmluZQkgICAgTUFUQ0hBTlkoKQkJCQlMRVhFUi0+bWF0Y2hBbnkoTEVYRVIpCisjZGVmaW5lCSAgICBMVE9LRU4gIAkJCQlMRVhTVEFURS0+dG9rZW4KKyNkZWZpbmUJICAgIEhBU0ZBSUxFRCgpCQkJCShMRVhTVEFURS0+ZmFpbGVkID09IEFOVExSM19UUlVFKQorI2RlZmluZQkgICAgQkFDS1RSQUNLSU5HCQkJTEVYU1RBVEUtPmJhY2t0cmFja2luZworI2RlZmluZQkgICAgRkFJTEVERkxBRwkJCQlMRVhTVEFURS0+ZmFpbGVkCisjZGVmaW5lCSAgICBJTlBVVAkJCQkJTEVYRVItPmlucHV0CisjZGVmaW5lCSAgICBTVFJTVFJFQU0JCQkJSU5QVVQKKyNkZWZpbmUJCUlTVFJFQU0JCQkJCUlOUFVULT5pc3RyZWFtCisjZGVmaW5lCQlJTkRFWCgpCQkJCQlJU1RSRUFNLT5pbmRleChJU1RSRUFNKQorI2RlZmluZQkJU0VFSyhuKQkJCQkJSVNUUkVBTS0+c2VlayhJU1RSRUFNLCBuKQorI2RlZmluZQkgICAgRU9GX1RPS0VOCQkJCSYoTEVYU1RBVEUtPnRva1NvdXJjZS0+ZW9mVG9rZW4pCisjZGVmaW5lCSAgICBIQVNFWENFUFRJT04oKQkJCShMRVhTVEFURS0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUpCisjZGVmaW5lCSAgICBFWENFUFRJT04JCQkJTEVYU1RBVEUtPmV4Y2VwdGlvbgorI2RlZmluZQkgICAgQ09OU1RSVUNURVgoKQkJCVJFQ09HTklaRVItPmV4Q29uc3RydWN0KFJFQ09HTklaRVIpCisjZGVmaW5lCSAgICBMUkVDT1ZFUigpCQkJCUxFWEVSLT5yZWNvdmVyKExFWEVSKQorI2RlZmluZQkgICAgTUFSSygpCQkJCQlJU1RSRUFNLT5tYXJrKElTVFJFQU0pCisjZGVmaW5lCSAgICBSRVdJTkQobSkJCQkJSVNUUkVBTS0+cmV3aW5kKElTVFJFQU0sIG0pCisjZGVmaW5lCSAgICBSRVdJTkRMQVNUKCkJCQlJU1RSRUFNLT5yZXdpbmRMYXN0KElTVFJFQU0pCisjZGVmaW5lCQlNRU1PSVpFKHJpLHNpKQkJCVJFQ09HTklaRVItPm1lbW9pemUoUkVDT0dOSVpFUiwgcmksIHNpKQorI2RlZmluZQkJSEFWRVBBUlNFRFJVTEUocikJCVJFQ09HTklaRVItPmFscmVhZHlQYXJzZWRSdWxlKFJFQ09HTklaRVIsIHIpCisjZGVmaW5lCQlQVVNIU1RSRUFNKHN0cikJCQlMRVhFUi0+cHVzaENoYXJTdHJlYW0oTEVYRVIsIHN0cikKKyNkZWZpbmUJCVBPUFNUUkVBTSgpCQkJCUxFWEVSLT5wb3BDaGFyU3RyZWFtKExFWEVSKQorI2RlZmluZQkJU0VUVEVYVChzdHIpCQkJTEVYU1RBVEUtPnRleHQgPSBzdHIKKyNkZWZpbmUJCVNLSVAoKQkJCQkJTEVYU1RBVEUtPnRva2VuID0gJihUT0tTT1VSQ0UtPnNraXBUb2tlbikKKyNkZWZpbmUJCVVTRVIxCQkJCQlMRVhTVEFURS0+dXNlcjEKKyNkZWZpbmUJCVVTRVIyCQkJCQlMRVhTVEFURS0+dXNlcjIKKyNkZWZpbmUJCVVTRVIzCQkJCQlMRVhTVEFURS0+dXNlcjMKKyNkZWZpbmUJCUNVU1RPTQkJCQkJTEVYU1RBVEUtPmN1c3RvbQorI2RlZmluZQkJUlVMRU1FTU8JCQkJTEVYU1RBVEUtPnJ1bGVNZW1vCisjZGVmaW5lCQlEQkcJCQkJCQlSRUNPR05JWkVSLT5kZWJ1Z2dlcgorCisvKiBJZiB3ZSBoYXZlIGJlZW4gdG9sZCB3ZSBjYW4gcmVseSBvbiB0aGUgc3RhbmRhcmQgOCBiaXQgb3IgVVRGMTYgaW5wdXQKKyAqIHN0cmVhbSwgdGhlbiB3ZSBjYW4gZGVmaW5lIG91ciBtYWNyb3MgdG8gdXNlIHRoZSBkaXJlY3QgcG9pbnRlcnMKKyAqIGluIHRoZSBpbnB1dCBvYmplY3QsIHdoaWNoIGlzIG11Y2ggZmFzdGVyIHRoYW4gaW5kaXJlY3QgY2FsbHMuIFRoaXMKKyAqIGlzIHJlYWxseSBvbmx5IHNpZ25pZmljYW50IHRvIGxleGVycyB3aXRoIGEgbG90IG9mIGZyYWdtZW50IHJ1bGVzICh3aGljaAorICogZG8gbm90IHBsYWNlIExBKDEpIGluIGEgdGVtcG9yYXJ5IGF0IHRoZSBtb21lbnQpIGFuZCBldmVuIHRoZW4KKyAqIG9ubHkgaWYgdGhlcmUgaXMgYSBsb3Qgb2YgaW5wdXQgKG9yZGVyIG9mIHNheSAxTSBvciBzbykuCisgKi8KKyNpZglkZWZpbmVkKEFOVExSM19JTkxJTkVfSU5QVVRfOEJJVCkgfHwgZGVmaW5lZChBTlRMUjNfSU5MSU5FX0lOUFVUX1VURjE2KQorCisjIGlmZGVmCUFOVExSM19JTkxJTkVfSU5QVVRfOEJJVAorCisvKiA4IGJpdCBjaGFyYWN0ZXIgc2V0ICovCisKKyMgIGRlZmluZQkgICAgTkVYVENIQVIJKChwQU5UTFIzX1VJTlQ4KShJTlBVVC0+bmV4dENoYXIpKQorIyAgZGVmaW5lCSAgICBEQVRBUAkoKHBBTlRMUjNfVUlOVDgpKElOUFVULT5kYXRhKSkKKworIyBlbHNlCisKKyMgIGRlZmluZQkgICAgTkVYVENIQVIJKChwQU5UTFIzX1VJTlQxNikoSU5QVVQtPm5leHRDaGFyKSkKKyMgIGRlZmluZQkgICAgREFUQVAJKChwQU5UTFIzX1VJTlQxNikoSU5QVVQtPmRhdGEpKQorCisjIGVuZGlmCisKKyMgZGVmaW5lCSAgICBMQShuKSAoKE5FWFRDSEFSICsgbikgPiAoREFUQVAgKyBJTlBVVC0+c2l6ZUJ1ZikgPyBBTlRMUjNfQ0hBUlNUUkVBTV9FT0YgOiAoQU5UTFIzX1VDSEFSKSgqKE5FWFRDSEFSICsgbiAtIDEpKSkKKyMgZGVmaW5lICAgICAgICAgICAgQ09OU1VNRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgIGlmICAgICAgICAoTkVYVENIQVIgXDwgKERBVEFQICsgSU5QVVQtPnNpemVCdWYpKSAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICBJTlBVVC0+Y2hhclBvc2l0aW9uSW5MaW5lKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgaWYgICgoQU5UTFIzX1VDSEFSKSgqTkVYVENIQVIpID09IElOUFVULT5uZXdsaW5lQ2hhcikgICAgICAgICAgIFxcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorICAgICAgICAgICAgSU5QVVQtPmxpbmUrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgICAgIElOUFVULT5jaGFyUG9zaXRpb25JbkxpbmUgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgICAgICAgICBJTlBVVC0+Y3VycmVudExpbmUgICAgICAgICAgICAgICAgPSAodm9pZCAqKShORVhUQ0hBUiArIDEpOyBcXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwKKyAgICAgICAgSU5QVVQtPm5leHRDaGFyID0gKHZvaWQgKikoTkVYVENIQVIgKyAxKTsgICAgICAgICAgICAgICAgICAgICAgIFxcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXAorfQorCisjZWxzZQorCisvLyBQaWNrIHVwIHRoZSBpbnB1dCBjaGFyYWN0ZXIgYnkgY2FsbGluZyB0aGUgaW5wdXQgc3RyZWFtIGltcGxlbWVudGF0aW9uLgorLy8KKyNkZWZpbmUJICAgIENPTlNVTUUoKSAgIElOUFVULT5pc3RyZWFtLT5jb25zdW1lKElOUFVULT5pc3RyZWFtKQorI2RlZmluZQkgICAgTEEobikgICAgICAgSU5QVVQtPmlzdHJlYW0tPl9MQShJTlBVVC0+aXN0cmVhbSwgbikKKworI2VuZGlmCis8ZW5kaWY+CisKKzxpZihQQVJTRVIpPgorLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhpbmdzIGluIHRoZSBwYXJzZXIKKyAqLworCisjdW5kZWYJICAgIFBBUlNFUgorI3VuZGVmCSAgICBSRUNPR05JWkVSCisjdW5kZWYJICAgIEhBVkVQQVJTRURSVUxFCisjdW5kZWYJCU1FTU9JWkUKKyN1bmRlZgkgICAgSU5QVVQKKyN1bmRlZgkgICAgU1RSU1RSRUFNCisjdW5kZWYJICAgIEhBU0VYQ0VQVElPTgorI3VuZGVmCSAgICBFWENFUFRJT04KKyN1bmRlZgkgICAgTUFUQ0hUCisjdW5kZWYJICAgIE1BVENIQU5ZVAorI3VuZGVmCSAgICBGT0xMT1dTVEFDSworI3VuZGVmCSAgICBGT0xMT1dQVVNICisjdW5kZWYJICAgIEZPTExPV1BPUAorI3VuZGVmCSAgICBQUkVDT1ZFUgorI3VuZGVmCSAgICBQUkVQT1JURVJST1IKKyN1bmRlZgkgICAgTEEKKyN1bmRlZgkgICAgTFQKKyN1bmRlZgkgICAgQ09OU1RSVUNURVgKKyN1bmRlZgkgICAgQ09OU1VNRQorI3VuZGVmCSAgICBNQVJLCisjdW5kZWYJICAgIFJFV0lORAorI3VuZGVmCSAgICBSRVdJTkRMQVNUCisjdW5kZWYJICAgIFBFUlJPUlJFQ09WRVJZCisjdW5kZWYJICAgIEhBU0ZBSUxFRAorI3VuZGVmCSAgICBGQUlMRURGTEFHCisjdW5kZWYJICAgIFJFQ09WRVJGUk9NTUlTTUFUQ0hFRFNFVAorI3VuZGVmCSAgICBSRUNPVkVSRlJPTU1JU01BVENIRURFTEVNRU5UCisjdW5kZWYJCUlOREVYCisjdW5kZWYgICAgICBBREFQVE9SCisjdW5kZWYJCVNFRUsKKyN1bmRlZgkgICAgUlVMRU1FTU8KKyN1bmRlZgkJREJHCisKKyNkZWZpbmUJICAgIFBBUlNFUgkJCQljdHgtPnBQYXJzZXIKKyNkZWZpbmUJICAgIFJFQ09HTklaRVIJCQkJUEFSU0VSLT5yZWMKKyNkZWZpbmUJICAgIFBTUlNUQVRFCQkJCVJFQ09HTklaRVItPnN0YXRlCisjZGVmaW5lCSAgICBIQVZFUEFSU0VEUlVMRShyKQkJCVJFQ09HTklaRVItPmFscmVhZHlQYXJzZWRSdWxlKFJFQ09HTklaRVIsIHIpCisjZGVmaW5lCSAgICBNRU1PSVpFKHJpLHNpKQkJCVJFQ09HTklaRVItPm1lbW9pemUoUkVDT0dOSVpFUiwgcmksIHNpKQorI2RlZmluZQkgICAgSU5QVVQJCQkJUEFSU0VSLT50c3RyZWFtCisjZGVmaW5lCSAgICBTVFJTVFJFQU0JCQkJSU5QVVQKKyNkZWZpbmUJICAgIElTVFJFQU0JCQkJSU5QVVQtPmlzdHJlYW0KKyNkZWZpbmUJICAgIElOREVYKCkJCQkJSVNUUkVBTS0+aW5kZXgoSU5QVVQtPmlzdHJlYW0pCisjZGVmaW5lCSAgICBIQVNFWENFUFRJT04oKQkJCShQU1JTVEFURS0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUpCisjZGVmaW5lCSAgICBFWENFUFRJT04JCQkJUFNSU1RBVEUtPmV4Y2VwdGlvbgorI2RlZmluZQkgICAgTUFUQ0hUKHQsIGZzKQkJCVJFQ09HTklaRVItPm1hdGNoKFJFQ09HTklaRVIsIHQsIGZzKQorI2RlZmluZQkgICAgTUFUQ0hBTllUKCkJCQkJUkVDT0dOSVpFUi0+bWF0Y2hBbnkoUkVDT0dOSVpFUikKKyNkZWZpbmUJICAgIEZPTExPV1NUQUNLCQkJCVBTUlNUQVRFLT5mb2xsb3dpbmcKKyNpZmRlZiAgU0tJUF9GT0xMT1dfU0VUUworI2RlZmluZQkgICAgRk9MTE9XUFVTSCh4KQorI2RlZmluZQkgICAgRk9MTE9XUE9QKCkKKyNlbHNlCisjZGVmaW5lCSAgICBGT0xMT1dQVVNIKHgpCQkJRk9MTE9XU1RBQ0stPnB1c2goRk9MTE9XU1RBQ0ssICgodm9pZCAqKSgmKHgpKSksIE5VTEwpCisjZGVmaW5lCSAgICBGT0xMT1dQT1AoKQkJCQlGT0xMT1dTVEFDSy0+cG9wKEZPTExPV1NUQUNLKQorI2VuZGlmCisjZGVmaW5lCSAgICBQUkVDT1ZFUigpCQkJCVJFQ09HTklaRVItPnJlY292ZXIoUkVDT0dOSVpFUikKKyNkZWZpbmUJICAgIFBSRVBPUlRFUlJPUigpCQkJUkVDT0dOSVpFUi0+cmVwb3J0RXJyb3IoUkVDT0dOSVpFUikKKyNkZWZpbmUJICAgIExBKG4pCQkJCUlOUFVULT5pc3RyZWFtLT5fTEEoSVNUUkVBTSwgbikKKyNkZWZpbmUJICAgIExUKG4pCQkJCUlOUFVULT5fTFQoSU5QVVQsIG4pCisjZGVmaW5lCSAgICBDT05TVFJVQ1RFWCgpCQkJUkVDT0dOSVpFUi0+ZXhDb25zdHJ1Y3QoUkVDT0dOSVpFUikKKyNkZWZpbmUJICAgIENPTlNVTUUoKQkJCQlJU1RSRUFNLT5jb25zdW1lKElTVFJFQU0pCisjZGVmaW5lCSAgICBNQVJLKCkJCQkJSVNUUkVBTS0+bWFyayhJU1RSRUFNKQorI2RlZmluZQkgICAgUkVXSU5EKG0pCQkJCUlTVFJFQU0tPnJld2luZChJU1RSRUFNLCBtKQorI2RlZmluZQkgICAgUkVXSU5ETEFTVCgpCQkJSVNUUkVBTS0+cmV3aW5kTGFzdChJU1RSRUFNKQorI2RlZmluZQkgICAgU0VFSyhuKQkJCQlJU1RSRUFNLT5zZWVrKElTVFJFQU0sIG4pCisjZGVmaW5lCSAgICBQRVJST1JSRUNPVkVSWQkJCVBTUlNUQVRFLT5lcnJvclJlY292ZXJ5CisjZGVmaW5lCSAgICBGQUlMRURGTEFHCQkJCVBTUlNUQVRFLT5mYWlsZWQKKyNkZWZpbmUJICAgIEhBU0ZBSUxFRCgpCQkJCShGQUlMRURGTEFHID09IEFOVExSM19UUlVFKQorI2RlZmluZQkgICAgQkFDS1RSQUNLSU5HCQkJUFNSU1RBVEUtPmJhY2t0cmFja2luZworI2RlZmluZQkgICAgUkVDT1ZFUkZST01NSVNNQVRDSEVEU0VUKHMpCQlSRUNPR05JWkVSLT5yZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoUkVDT0dOSVpFUiwgcykKKyNkZWZpbmUJICAgIFJFQ09WRVJGUk9NTUlTTUFUQ0hFREVMRU1FTlQoZSkJUkVDT0dOSVpFUi0+cmVjb3ZlckZyb21NaXNtYXRjaGVkRWxlbWVudChSRUNPR05JWkVSLCBzKQorI2RlZmluZSAgICAgQURBUFRPUiAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmFkYXB0b3IKKyNkZWZpbmUJCVJVTEVNRU1PCQkJCQkJUFNSU1RBVEUtPnJ1bGVNZW1vCisjZGVmaW5lCQlEQkcJCQkJCQkJCVJFQ09HTklaRVItPmRlYnVnZ2VyCisKKzxlbmRpZj4KKworPGlmKFRSRUVfUEFSU0VSKT4KKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIHRoaW5ncyBpbiB0aGUgcGFyc2VyCisgKi8KKworI3VuZGVmCSAgICBQQVJTRVIKKyN1bmRlZgkgICAgUkVDT0dOSVpFUgorI3VuZGVmCSAgICBIQVZFUEFSU0VEUlVMRQorI3VuZGVmCSAgICBJTlBVVAorI3VuZGVmCSAgICBTVFJTVFJFQU0KKyN1bmRlZgkgICAgSEFTRVhDRVBUSU9OCisjdW5kZWYJICAgIEVYQ0VQVElPTgorI3VuZGVmCSAgICBNQVRDSFQKKyN1bmRlZgkgICAgTUFUQ0hBTllUCisjdW5kZWYJICAgIEZPTExPV1NUQUNLCisjdW5kZWYJICAgIEZPTExPV1BVU0gKKyN1bmRlZgkgICAgRk9MTE9XUE9QCisjdW5kZWYJICAgIFBSRUNPVkVSCisjdW5kZWYJICAgIFBSRVBPUlRFUlJPUgorI3VuZGVmCSAgICBMQQorI3VuZGVmCSAgICBMVAorI3VuZGVmCSAgICBDT05TVFJVQ1RFWAorI3VuZGVmCSAgICBDT05TVU1FCisjdW5kZWYJICAgIE1BUksKKyN1bmRlZgkgICAgUkVXSU5ECisjdW5kZWYJICAgIFJFV0lORExBU1QKKyN1bmRlZgkgICAgUEVSUk9SUkVDT1ZFUlkKKyN1bmRlZgkgICAgSEFTRkFJTEVECisjdW5kZWYJICAgIEZBSUxFREZMQUcKKyN1bmRlZgkgICAgUkVDT1ZFUkZST01NSVNNQVRDSEVEU0VUCisjdW5kZWYJICAgIFJFQ09WRVJGUk9NTUlTTUFUQ0hFREVMRU1FTlQKKyN1bmRlZgkgICAgQkFDS1RSQUNLSU5HCisjdW5kZWYgICAgICBBREFQVE9SCisjdW5kZWYJICAgIFJVTEVNRU1PCisjdW5kZWYJCVNFRUsKKyN1bmRlZgkJSU5ERVgKKyN1bmRlZgkJREJHCisKKyNkZWZpbmUJICAgIFBBUlNFUgkJCQkJCQljdHgtPnBUcmVlUGFyc2VyCisjZGVmaW5lCSAgICBSRUNPR05JWkVSCQkJCQkJUEFSU0VSLT5yZWMKKyNkZWZpbmUJCVBTUlNUQVRFCQkJCQkJUkVDT0dOSVpFUi0+c3RhdGUKKyNkZWZpbmUJICAgIEhBVkVQQVJTRURSVUxFKHIpCQkJCVJFQ09HTklaRVItPmFscmVhZHlQYXJzZWRSdWxlKFJFQ09HTklaRVIsIHIpCisjZGVmaW5lCSAgICBJTlBVVAkJCQkJCQlQQVJTRVItPmN0bnN0cmVhbQorI2RlZmluZQkJSVNUUkVBTQkJCQkJCQlJTlBVVC0+dG5zdHJlYW0tPmlzdHJlYW0KKyNkZWZpbmUJICAgIFNUUlNUUkVBTQkJCQkJCUlOUFVULT50bnN0cmVhbQorI2RlZmluZQkgICAgSEFTRVhDRVBUSU9OKCkJCQkJCShQU1JTVEFURS0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUpCisjZGVmaW5lCSAgICBFWENFUFRJT04JCQkJCQlQU1JTVEFURS0+ZXhjZXB0aW9uCisjZGVmaW5lCSAgICBNQVRDSFQodCwgZnMpCQkJCQlSRUNPR05JWkVSLT5tYXRjaChSRUNPR05JWkVSLCB0LCBmcykKKyNkZWZpbmUJICAgIE1BVENIQU5ZVCgpCQkJCQkJUkVDT0dOSVpFUi0+bWF0Y2hBbnkoUkVDT0dOSVpFUikKKyNkZWZpbmUJICAgIEZPTExPV1NUQUNLCQkJCQkgICAgUFNSU1RBVEUtPmZvbGxvd2luZworI2RlZmluZQkgICAgRk9MTE9XUFVTSCh4KQkJCQkJRk9MTE9XU1RBQ0stPnB1c2goRk9MTE9XU1RBQ0ssICgodm9pZCAqKSgmKHgpKSksIE5VTEwpCisjZGVmaW5lCSAgICBGT0xMT1dQT1AoKQkJCQkJCUZPTExPV1NUQUNLLT5wb3AoRk9MTE9XU1RBQ0spCisjZGVmaW5lCSAgICBQUkVDT1ZFUigpCQkJCQkJUkVDT0dOSVpFUi0+cmVjb3ZlcihSRUNPR05JWkVSKQorI2RlZmluZQkgICAgUFJFUE9SVEVSUk9SKCkJCQkJCVJFQ09HTklaRVItPnJlcG9ydEVycm9yKFJFQ09HTklaRVIpCisjZGVmaW5lCSAgICBMQShuKQkJCQkJCQlJU1RSRUFNLT5fTEEoSVNUUkVBTSwgbikKKyNkZWZpbmUJICAgIExUKG4pCQkJCQkJCUlOUFVULT50bnN0cmVhbS0+X0xUKElOUFVULT50bnN0cmVhbSwgbikKKyNkZWZpbmUJICAgIENPTlNUUlVDVEVYKCkJCQkJCVJFQ09HTklaRVItPmV4Q29uc3RydWN0KFJFQ09HTklaRVIpCisjZGVmaW5lCSAgICBDT05TVU1FKCkJCQkJCQlJU1RSRUFNLT5jb25zdW1lKElTVFJFQU0pCisjZGVmaW5lCSAgICBNQVJLKCkJCQkJCQkJSVNUUkVBTS0+bWFyayhJU1RSRUFNKQorI2RlZmluZQkgICAgUkVXSU5EKG0pCQkJCQkJSVNUUkVBTS0+cmV3aW5kKElTVFJFQU0sIG0pCisjZGVmaW5lCSAgICBSRVdJTkRMQVNUKCkJCQkJCUlTVFJFQU0tPnJld2luZExhc3QoSVNUUkVBTSkKKyNkZWZpbmUJICAgIFBFUlJPUlJFQ09WRVJZCQkJCQlQU1JTVEFURS0+ZXJyb3JSZWNvdmVyeQorI2RlZmluZQkgICAgRkFJTEVERkxBRwkJCQkJCVBTUlNUQVRFLT5mYWlsZWQKKyNkZWZpbmUJICAgIEhBU0ZBSUxFRCgpCQkJCQkJKEZBSUxFREZMQUcgPT0gQU5UTFIzX1RSVUUpCisjZGVmaW5lCSAgICBCQUNLVFJBQ0tJTkcJCQkJCVBTUlNUQVRFLT5iYWNrdHJhY2tpbmcKKyNkZWZpbmUJICAgIFJFQ09WRVJGUk9NTUlTTUFUQ0hFRFNFVChzKQkJUkVDT0dOSVpFUi0+cmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KFJFQ09HTklaRVIsIHMpCisjZGVmaW5lCSAgICBSRUNPVkVSRlJPTU1JU01BVENIRURFTEVNRU5UKGUpCVJFQ09HTklaRVItPnJlY292ZXJGcm9tTWlzbWF0Y2hlZEVsZW1lbnQoUkVDT0dOSVpFUiwgcykKKyNkZWZpbmUgICAgIEFEQVBUT1IgICAgICAgICAgICAgICAgICAgICAgICAgSU5QVVQtPmFkYXB0b3IKKyNkZWZpbmUJCVJVTEVNRU1PCQkJCQkJUFNSU1RBVEUtPnJ1bGVNZW1vCisjZGVmaW5lCQlTRUVLKG4pCQkJCQkJCUlTVFJFQU0tPnNlZWsoSVNUUkVBTSwgbikKKyNkZWZpbmUJCUlOREVYKCkJCQkJCQkJSVNUUkVBTS0+aW5kZXgoSVNUUkVBTSkKKyNkZWZpbmUJCURCRwkJCQkJCQkJUkVDT0dOSVpFUi0+ZGVidWdnZXIKKworCis8ZW5kaWY+CisKKyNkZWZpbmUJCVRPS1RFWFQodG9rLCB0eHQpCQkJCXRvaywgKHBBTlRMUjNfVUlOVDgpdHh0CisKKy8qIFRoZSA0IHRva2VucyBkZWZpbmVkIGJlbG93IG1heSB3ZWxsIGNsYXNoIHdpdGggeW91ciBvd24gI2RlZmluZXMgb3IgdG9rZW4gdHlwZXMuIElmIHNvCisgKiB0aGVuIGZvciB0aGUgcHJlc2VudCB5b3UgbXVzdCB1c2UgZGlmZmVyZW50IG5hbWVzIGZvciB5b3VyIGRlZmluZXMgYXMgdGhlc2UgYXJlIGhhcmQgY29kZWQKKyAqIGluIHRoZSBjb2RlIGdlbmVyYXRvci4gSXQgd291bGQgYmUgYmV0dGVyIG5vdCB0byB1c2Ugc3VjaCBuYW1lcyBpbnRlcm5hbGx5LCBhbmQgbWF5YmUKKyAqIHdlIGNhbiBjaGFuZ2UgdGhpcyBpbiBhIGZvcnRoY29taW5nIHJlbGVhc2UuIEkgZGVsaWJlcmF0ZWx5IGRvIG5vdCAjdW5kZWYgdGhlc2UKKyAqIGhlcmUgYXMgdGhpcyB3aWxsIGF0IGxlYXN0IGdpdmUgeW91IGEgcmVkZWZpbmVkIGVycm9yIHNvbWV3aGVyZSBpZiB0aGV5IGNsYXNoLgorICovCisjZGVmaW5lCSAgICBVUAkgICAgQU5UTFIzX1RPS0VOX1VQCisjZGVmaW5lCSAgICBET1dOICAgIEFOVExSM19UT0tFTl9ET1dOCisjZGVmaW5lCSAgICBFT1IJICAgIEFOVExSM19UT0tFTl9FT1IKKyNkZWZpbmUJICAgIElOVkFMSUQgQU5UTFIzX1RPS0VOX0lOVkFMSUQKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBzY29wZXMuIEZpcnN0IGNvbWUgdGhlIHJ1bGUgc2NvcGVzLCBmb2xsb3dlZAorICogYnkgdGhlIGdsb2JhbCBkZWNsYXJlZCBzY29wZXMuCisgKi8KKworPHJ1bGVzOiB7ciB8PGlmKHIucnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT4KKzxydWxlQXR0cmlidXRlU2NvcGVGdW5jRGVjbChzY29wZT1yLnJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+Cis8cnVsZUF0dHJpYnV0ZVNjb3BlRnVuY3Moc2NvcGU9ci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorPGVuZGlmPn0+CisKKzxyZWNvZ25pemVyLnNjb3Blczp7aXQgfCA8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPgorPGdsb2JhbEF0dHJpYnV0ZVNjb3BlRnVuY0RlY2woaXQpPgorPGdsb2JhbEF0dHJpYnV0ZVNjb3BlRnVuY3MoaXQpPgorPGVuZGlmPn0+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBvZiByZWNvZ25pemVyCisgKi8KKworPHJlY29nbml6ZXI+CisKKy8qIEVuZCBvZiBjb2RlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKz4+CitoZWFkZXJGaWxlRXh0ZW5zaW9uKCkgOjo9ICIuaCIKKworaGVhZGVyRmlsZSggTEVYRVIsCisgICAgICAgICAgICBQQVJTRVIsCisgICAgICAgICAgICBUUkVFX1BBUlNFUiwKKyAgICAgICAgICAgIGFjdGlvblNjb3BlLAorICAgICAgICAgICAgYWN0aW9ucywKKyAgICAgICAgICAgIGRvY0NvbW1lbnQsCisgICAgICAgICAgICByZWNvZ25pemVyLAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHRva2VucywKKyAgICAgICAgICAgIHRva2VuTmFtZXMsCisgICAgICAgICAgICBydWxlcywKKyAgICAgICAgICAgIGN5Y2xpY0RGQXMsCisgICAgICAgICAgICBiaXRzZXRzLAorICAgICAgICAgICAgYnVpbGRUZW1wbGF0ZSwKKyAgICAgICAgICAgIGJ1aWxkQVNULAorICAgICAgICAgICAgcmV3cml0ZU1vZGUsCisgICAgICAgICAgICBwcm9maWxlLAorICAgICAgICAgICAgYmFja3RyYWNraW5nLAorICAgICAgICAgICAgc3lucHJlZHMsCisgICAgICAgICAgICBtZW1vaXplLAorICAgICAgICAgICAgbnVtUnVsZXMsCisgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgIEFOVExSVmVyc2lvbiwKKyAgICAgICAgICAgIGdlbmVyYXRlZFRpbWVzdGFtcCwKKyAgICAgICAgICAgIHRyYWNlLAorICAgICAgICAgICAgc2NvcGVzLAorCQkJc3VwZXJDbGFzcywKKyAgICAgICAgICAgIGxpdGVyYWxzCisgICAgICAgICkgOjo9Cis8PAorPGxlYWRJbigiQyBoZWFkZXIiKT4KKzxpZihQQVJTRVIpPgorICogVGhlIHBhcnNlciA8bWFpbk5hbWUoKT4KKzxlbmRpZj4KKzxpZihMRVhFUik+CisgKiBUaGUgbGV4ZXIgPG1haW5OYW1lKCk+Cis8ZW5kaWY+Cis8aWYoVFJFRV9QQVJTRVIpPgorICogVGhlIHRyZWUgcGFyc2VyIDxtYWluTmFtZSgpPgorPGVuZGlmPgoraGFzIHRoZSBjYWxsYWJsZSBmdW5jdGlvbnMgKHJ1bGVzKSBzaG93biBiZWxvdywKKyAqIHdoaWNoIHdpbGwgaW52b2tlIHRoZSBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBydWxlIGluIHRoZSBzb3VyY2UgZ3JhbW1hcgorICogYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzIHBvaW50aW5nIHRvIGEgdG9rZW4vdGV4dCBzdHJlYW0gdGhhdCBjb3VsZCBiZWdpbgorICogdGhpcyBydWxlLgorICoKKyAqIEZvciBpbnN0YW5jZSBpZiB5b3UgY2FsbCB0aGUgZmlyc3QgKHRvcG1vc3QpIHJ1bGUgaW4gYSBwYXJzZXIgZ3JhbW1hciwgeW91IHdpbGwKKyAqIGdldCB0aGUgcmVzdWx0cyBvZiBhIGZ1bGwgcGFyc2UsIGJ1dCBjYWxsaW5nIGEgcnVsZSBoYWxmIHdheSB0aHJvdWdoIHRoZSBncmFtbWFyIHdpbGwKKyAqIGFsbG93IHlvdSB0byBwYXNzIHBhcnQgb2YgYSBmdWxsIHRva2VuIHN0cmVhbSB0byB0aGUgcGFyc2VyLCBzdWNoIGFzIGZvciBzeW50YXggY2hlY2tpbmcKKyAqIGluIGVkaXRvcnMgYW5kIHNvIG9uLgorICoKKyAqIFRoZSBwYXJzZXIgZW50cnkgcG9pbnRzIGFyZSBjYWxsZWQgaW5kaXJlY3RseSAoYnkgZnVuY3Rpb24gcG9pbnRlciB0byBmdW5jdGlvbikgdmlhCisgKiBhIHBhcnNlciBjb250ZXh0IHR5cGVkZWYgcDxuYW1lPiwgd2hpY2ggaXMgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gPG5hbWU+TmV3KCkuCisgKgorPGlmKExFWEVSKT4KKyAqIEFzIHRoaXMgaXMgYSBnZW5lcmF0ZWQgbGV4ZXIsIGl0IGlzIHVubGlrZWx5IHlvdSB3aWxsIGNhbGwgaXQgJ21hbnVhbGx5Jy4gSG93ZXZlcgorICogdGhlIG1ldGhvZHMgYXJlIHByb3ZpZGVkIGFueXdheS4KKyAqCis8ZW5kaWY+CisgKiBUaGUgbWV0aG9kcyBpbiBwPG5hbWU+IGFyZSAgYXMgZm9sbG93czoKKyAqCisgKiA8cnVsZXM6e3IgfCA8aWYoIXIucnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4gLSA8aGVhZGVyUmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcj1yLnJ1bGVEZXNjcmlwdG9yLC4uLik+ICAgICAgcDxuYW1lPi0+PHIucnVsZURlc2NyaXB0b3IubmFtZT4ocDxuYW1lPik8ZW5kaWY+fTsgc2VwYXJhdG9yPSJcbiAqICI+CisgKgorICogVGhlIHJldHVybiB0eXBlIGZvciBhbnkgcGFydGljdWxhciBydWxlIGlzIG9mIGNvdXJzZSBkZXRlcm1pbmVkIGJ5IHRoZSBzb3VyY2UKKyAqIGdyYW1tYXIgZmlsZS4KKyAqLworLy8gW1RoZSAiQlNEIGxpY2Vuc2UiXQorLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgSmltIElkbGUsIFRlbXBvcmFsIFdhdmUgTExDCisvLyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisvLyBodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9qaW1pZGxlCisvLworLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gYXJlIG1ldDoKKy8vIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKy8vIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKy8vIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisvLyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisvLyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKy8vIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisvLyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmCV88bmFtZT5fSAorI2RlZmluZSBfPG5hbWU+X0gKKzxhY3Rpb25zLihhY3Rpb25TY29wZSkucHJlaW5jbHVkZXM+CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhbmRhcmQgYW50bHIzIEMgcnVudGltZSBkZWZpbml0aW9ucworICovCisjaW5jbHVkZSAgICBcPGFudGxyMy5oPgorCisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIgMyBydW50aW1lIGRlZmluaXRpb25zCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmluY2x1ZGVzPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEZvcndhcmQgZGVjbGFyZSB0aGUgY29udGV4dCB0eXBlZGVmIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBiZWZvcmUgaXQgaXMKKy8vIHByb3Blcmx5IGRlZmluZWQuIERlbGVnYXRvcnMgYW5kIGRlbGVnYXRlcyAoZnJvbSBpbXBvcnQgc3RhdGVtZW50cykgYXJlCisvLyBpbnRlcmRlcGVuZGVudCBhbmQgdGhlaXIgY29udGV4dCBzdHJ1Y3R1cmVzIGNvbnRhaW4gcG9pbnRlcnMgdG8gZWFjaCBvdGhlcgorLy8gQyBvbmx5IGFsbG93cyBzdWNoIHRoaW5ncyB0byBiZSBkZWNsYXJlZCBpZiB5b3UgcHJlLWRlY2xhcmUgdGhlIHR5cGVkZWYuCisvLwordHlwZWRlZiBzdHJ1Y3QgPG5hbWU+X0N0eF9zdHJ1Y3QgPG5hbWU+LCAqIHA8bmFtZT47CisKKzxpZihyZWNvZ25pemVyLmdyYW1tYXIuZGVsZWdhdGVzKT4KKy8vIEluY2x1ZGUgZGVsZWdhdGUgZGVmaW5pdGlvbiBoZWFkZXIgZmlsZXMKKy8vCis8cmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRlczoge2d8I2luY2x1ZGUJXDw8Zy5yZWNvZ25pemVyTmFtZT4uaD59OyBzZXBhcmF0b3I9IlxuIj4KKworPGVuZGlmPgorCisKKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyPgorCisjaWZkZWYJQU5UTFIzX1dJTkRPV1MKKy8vIERpc2FibGU6IFVucmVmZXJlbmNlZCBwYXJhbWV0ZXIsCQkJCQkJCS0gUnVsZXMgd2l0aCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCB1c2VkCisvLyAgICAgICAgICBjb25zdGFudCBjb25kaXRpb25hbCwJCQkJCQkJLSBBTlRMUiByZWFsaXplcyB0aGF0IGEgcHJlZGljdGlvbiBpcyBhbHdheXMgdHJ1ZSAoc3lucHJlZCB1c3VhbGx5KQorLy8gICAgICAgICAgaW5pdGlhbGl6ZWQgYnV0IHVudXNlZCB2YXJpYWJsZQkJCQkJLSB0cmVlIHJld3JpdGUgdmFyaWFibGVzIGRlY2xhcmVkIGJ1dCBub3QgbmVlZGVkCisvLyAgICAgICAgICBVbnJlZmVyZW5jZWQgbG9jYWwgdmFyaWFibGUJCQkJCQktIGxleGVyIHJ1bGUgZGVjbGFyZXMgYnV0IGRvZXMgbm90IGFsd2F5cyB1c2UgX3R5cGUKKy8vICAgICAgICAgIHBvdGVudGlhbGx5IHVuaXRpYWxpemVkIHZhcmlhYmxlIHVzZWQJCQktIHJldHZhbCBhbHdheXMgcmV0dXJuZWQgZnJvbSBhIHJ1bGUKKy8vCQkJdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQJLSBzdXN1YWxseSBnZXRUb2tlbk5hbWVzIG9yIGZyZWVTY29wZSwgdGhleSBjYW4gZ28gd2l0aG91dCB3YXJuaWducworLy8KKy8vIFRoZXNlIGFyZSBvbmx5IHJlYWxseSBkaXNwbGF5ZWQgYXQgd2FybmluZyBsZXZlbCAvVzQgYnV0IHRoYXQgaXMgdGhlIGNvZGUgaWRlYWwgSSBhbSBhaW1pbmcgYXQKKy8vIGFuZCB0aGUgY29kZWdlbiBtdXN0IGdlbmVyYXRlIHNvbWUgb2YgdGhlc2Ugd2FybmluZ3MgYnkgbmVjZXNzaXR5LCBhcGFydCBmcm9tIDQxMDAsIHdoaWNoIGlzCisvLyB1c3VhbGx5IGdlbmVyYXRlZCB3aGVuIGEgcGFyc2VyIHJ1bGUgaXMgZ2l2ZW4gYSBwYXJhbWV0ZXIgdGhhdCBpdCBkb2VzIG5vdCB1c2UuIE1vc3RseSB0aG91Z2gKKy8vIHRoaXMgaXMgYSBtYXR0ZXIgb2Ygb3J0aG9nb25hbGl0eSBoZW5jZSBJIGRpc2FibGUgdGhhdCBvbmUuCisvLworI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMCApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTAxICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDE4OSApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTA1ICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MDEgKQorI2VuZGlmCis8aWYoYmFja3RyYWNraW5nKT4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09CisgKiBCQUNLVFJBQ0tJTkcgSVMgRU5BQkxFRAorICogPT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKzxlbmRpZj4KKworPHJ1bGVzOntyIHw8aGVhZGVyUmV0dXJuU2NvcGUocnVsZURlc2NyaXB0b3I9ci5ydWxlRGVzY3JpcHRvciwuLi4pPn0+CisKKzxzY29wZXM6e2l0IHwgPGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGVEZWNsKGl0KT48ZW5kaWY+fT4KKzxydWxlczp7ciB8PHJ1bGVBdHRyaWJ1dGVTY29wZURlY2woc2NvcGU9ci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPn0+Cis8aWYocmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRvcnMpPgorLy8gSW5jbHVkZSBkZWxlZ2F0b3IgZGVmaW5pdGlvbiBoZWFkZXIgZmlsZXMKKy8vCis8cmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRvcnM6IHtnfCNpbmNsdWRlCVw8PGcucmVjb2duaXplck5hbWU+Lmg+fTsgc2VwYXJhdG9yPSJcbiI+CisKKzxlbmRpZj4KKworLyoqIENvbnRleHQgdHJhY2tpbmcgc3RydWN0dXJlIGZvciA8bWFpbk5hbWUoKT4KKyAqLworc3RydWN0IDxuYW1lPl9DdHhfc3RydWN0Cit7CisgICAgLyoqIEJ1aWx0IGluIEFOVExSMyBjb250ZXh0IHRyYWNrZXIgY29udGFpbnMgYWxsIHRoZSBnZW5lcmljIGVsZW1lbnRzCisgICAgICogIHJlcXVpcmVkIGZvciBjb250ZXh0IHRyYWNraW5nLgorICAgICAqLworPGlmKFBBUlNFUik+CisgICAgcEFOVExSM19QQVJTRVIgICBwUGFyc2VyOworPGVuZGlmPgorPGlmKExFWEVSKT4KKyAgICBwQU5UTFIzX0xFWEVSICAgIHBMZXhlcjsKKzxlbmRpZj4KKzxpZihUUkVFX1BBUlNFUik+CisgICAgcEFOVExSM19UUkVFX1BBUlNFUgkgICAgcFRyZWVQYXJzZXI7Cis8ZW5kaWY+CisKKzxpZihyZWNvZ25pemVyLmdyYW1tYXIuZGVsZWdhdGVzKT4KKwk8cmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRlczoKKyAgICAgICAgIHtnfHA8Zy5yZWNvZ25pemVyTmFtZT4JPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorPGlmKHJlY29nbml6ZXIuZ3JhbW1hci5kZWxlZ2F0b3JzKT4KKwk8cmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xwPGcucmVjb2duaXplck5hbWU+CTxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxlbmRpZj4KKzxzY29wZXM6e2l0IHwgPGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT4KKyAgICA8Z2xvYmFsQXR0cmlidXRlU2NvcGVEZWYoaXQpPgorPGVuZGlmPn07IHNlcGFyYXRvcj0iXG5cbiI+Cis8cnVsZXM6IHtyIHw8aWYoci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorICAgIDxydWxlQXR0cmlidXRlU2NvcGVEZWYoc2NvcGU9ci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorPGVuZGlmPn0+CisKKzxpZihMRVhFUik+CisgICAgPHJ1bGVzOntyIHwgPGlmKCFyLnJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+PGhlYWRlclJldHVyblR5cGUocnVsZURlc2NyaXB0b3I9ci5ydWxlRGVzY3JpcHRvcik+ICgqbTxyLnJ1bGVEZXNjcmlwdG9yLm5hbWU+KQkoc3RydWN0IDxuYW1lPl9DdHhfc3RydWN0ICogY3R4PGlmKHIucnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUpPiwgPGVuZGlmPjxyLnJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KTs8ZW5kaWY+fTsgc2VwYXJhdG9yPSJcbiI+Cis8ZW5kaWY+Cis8aWYoIUxFWEVSKT4KKyAgICA8cnVsZXM6e3IgfCA8aGVhZGVyUmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcj1yLnJ1bGVEZXNjcmlwdG9yKT4gKCo8ci5ydWxlRGVzY3JpcHRvci5uYW1lPikJKHN0cnVjdCA8bmFtZT5fQ3R4X3N0cnVjdCAqIGN0eDxpZihyLnJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT4sIDxlbmRpZj48ci5ydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPik7fTsgc2VwYXJhdG9yPSJcbiI+Cis8ISBnZW5lcmF0ZSBydWxlL21ldGhvZCBkZWZpbml0aW9ucyBmb3IgaW1wb3J0ZWQgcnVsZXMgc28gdGhleQorICAgYXBwZWFyIHRvIGJlIGRlZmluZWQgaW4gdGhpcyByZWNvZ25pemVyLiAhPgorICAgIC8vIERlbGVnYXRlZCBydWxlcworPHJlY29nbml6ZXIuZ3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8CisgICAgPGhlYWRlclJldHVyblR5cGUocnVsZURlc2NyaXB0b3IpPiAoKjxydWxlRGVzY3JpcHRvci5uYW1lPikoc3RydWN0IDxuYW1lPl9DdHhfc3RydWN0ICogY3R4PGlmKHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT4sIDxlbmRpZj48cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pO307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorCisgICAgY29uc3QgY2hhciAqICgqZ2V0R3JhbW1hckZpbGVOYW1lKSgpOworICAgIHZvaWQgICAgICAgICAgICAoKnJlc2V0KSAgKHN0cnVjdCA8bmFtZT5fQ3R4X3N0cnVjdCAqIGN0eCk7CisgICAgdm9pZAkgICAgKCpmcmVlKSAgIChzdHJ1Y3QgPG5hbWU+X0N0eF9zdHJ1Y3QgKiBjdHgpOworICAgIDxAbWVtYmVycz4KKyAgICA8QGVuZD4KKyAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmNvbnRleHQ+Cit9OworCisvLyBGdW5jdGlvbiBwcm90b3lwZXMgZm9yIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCBleHRlcm5hbCB0cmFuc2xhdGlvbiB1bml0cworLy8gc3VjaCBhcyBkZWxlZ2F0b3JzIGFuZCBkZWxlZ2F0ZXMgbWF5IHdpc2ggdG8gY2FsbC4KKy8vCitBTlRMUjNfQVBJIHA8bmFtZT4gPG5hbWU+TmV3ICAgICAgICAgKDxpbnB1dFR5cGUoKT4gaW5zdHJlYW08cmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCBwPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KTsKK0FOVExSM19BUEkgcDxuYW1lPiA8bmFtZT5OZXdTU0QgICAgICAoPGlucHV0VHlwZSgpPiBpbnN0cmVhbSwgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZTxyZWNvZ25pemVyLmdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIHA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pOworPGlmKCFyZWNvZ25pemVyLmdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CitleHRlcm4gcEFOVExSM19VSU5UOCAgIDxyZWNvZ25pemVyLmdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPlRva2VuTmFtZXNbXTsKKzxlbmRpZj4KKworCisvKiogU3ltYm9saWMgZGVmaW5pdGlvbnMgb2YgYWxsIHRoZSB0b2tlbnMgdGhhdCB0aGUgPGdyYW1tYXJUeXBlKCk+IHdpbGwgd29yayB3aXRoLgorICogXHsKKyAqCisgKiBBbnRsciB3aWxsIGRlZmluZSBFT0YsIGJ1dCB3ZSBjYW4ndCB1c2UgdGhhdCBhcyBpdCBpdCBpcyB0b28gY29tbW9uIGluCisgKiBpbiBDIGhlYWRlciBmaWxlcyBhbmQgdGhhdCB3b3VsZCBiZSBjb25mdXNpbmcuIFRoZXJlIGlzIG5vIHdheSB0byBmaWx0ZXIgdGhpcyBvdXQgYXQgdGhlIG1vbWVudAorICogc28gd2UganVzdCB1bmRlZiBpdCBoZXJlIGZvciBub3cuIFRoYXQgaXNuJ3QgdGhlIHZhbHVlIHdlIGdldCBiYWNrIGZyb20gQyByZWNvZ25pemVycworICogYW55d2F5LiBXZSBhcmUgbG9va2luZyBmb3IgQU5UTFIzX1RPS0VOX0VPRi4KKyAqLworI2lmZGVmCUVPRgorI3VuZGVmCUVPRgorI2VuZGlmCisjaWZkZWYJVG9rZW5zCisjdW5kZWYJVG9rZW5zCisjZW5kaWYKKzx0b2tlbnM6e2l0IHwgI2RlZmluZSA8aXQubmFtZT4gICAgICA8aXQudHlwZT59OyBzZXBhcmF0b3I9IlxuIj4KKyNpZmRlZglFT0YKKyN1bmRlZglFT0YKKyNkZWZpbmUJRU9GCUFOVExSM19UT0tFTl9FT0YKKyNlbmRpZgorCisjaWZuZGVmIFRPS0VOU09VUkNFCisjZGVmaW5lIFRPS0VOU09VUkNFKGx4cikgbHhyLT5wTGV4ZXItPnJlYy0+c3RhdGUtPnRva1NvdXJjZQorI2VuZGlmCisKKy8qIEVuZCBvZiB0b2tlbiBkZWZpbml0aW9ucyBmb3IgPG5hbWU+CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKKy8qIEVORCAtIE5vdGU6S2VlcCBleHRyYSBsaW5lIGZlZWQgdG8gc2F0aXNmeSBVTklYIHN5c3RlbXMgKi8KKworPj4KKworaW5wdXRUeXBlKCkgOjo9PDwKKzxpZihMRVhFUik+CitwQU5UTFIzX0lOUFVUX1NUUkVBTQorPGVuZGlmPgorPGlmKFBBUlNFUik+CitwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0KKzxlbmRpZj4KKzxpZihUUkVFX1BBUlNFUik+CitwQU5UTFIzX0NPTU1PTl9UUkVFX05PREVfU1RSRUFNCis8ZW5kaWY+Cis+PgorCitncmFtbWFyVHlwZSgpIDo6PSA8PAorPGlmKFBBUlNFUik+CitwYXJzZXIKKzxlbmRpZj4KKzxpZihMRVhFUik+CitsZXhlcgorPGVuZGlmPgorPGlmKFRSRUVfUEFSU0VSKT4KK3RyZWUgcGFyc2VyCis8ZW5kaWY+Cis+PgorCittYWluTmFtZSgpIDo6PSA8PAorPGlmKFBBUlNFUik+Cis8bmFtZT4KKzxlbmRpZj4KKzxpZihMRVhFUik+Cis8bmFtZT4KKzxlbmRpZj4KKzxpZihUUkVFX1BBUlNFUik+Cis8bmFtZT4KKzxlbmRpZj4KKz4+CisKK2hlYWRlclJldHVyblNjb3BlKHJ1bGVEZXNjcmlwdG9yKSA6Oj0gIjxyZXR1cm5TY29wZSguLi4pPiIKKworaGVhZGVyUmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcikgOjo9IDw8Cis8aWYoTEVYRVIpPgorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorIHZvaWQKKzxlbHNlPgorIDxyZXR1cm5UeXBlKCk+Cis8ZW5kaWY+Cis8ZWxzZT4KKyA8cmV0dXJuVHlwZSgpPgorPGVuZGlmPgorPj4KKworLy8gUHJvZHVjZSB0aGUgbGV4ZXIgb3V0cHV0CisvLworbGV4ZXIoICBncmFtbWFyLAorCQluYW1lLAorICAgICAgICB0b2tlbnMsCisgICAgICAgIHNjb3BlcywKKyAgICAgICAgcnVsZXMsCisgICAgICAgIG51bVJ1bGVzLAorICAgICAgICBmaWx0ZXJNb2RlLAorICAgICAgICBzdXBlckNsYXNzLAorICAgICAgICBsYWJlbFR5cGU9InBBTlRMUjNfQ09NTU9OX1RPS0VOIikgOjo9IDw8CisKKzxpZihmaWx0ZXJNb2RlKT4KKy8qIEZvcndhcmQgZGVjbGFyZSBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbiBmb3IgQU5UTFIzX1RPS0VOX1NPVVJDRSBpbnRlcmZhY2Ugd2hlbgorICogdGhpcyBpcyBhIGZpbHRlciBtb2RlIGxleGVyLgorICovCitzdGF0aWMgcEFOVExSM19DT01NT05fVE9LRU4gPG5hbWU+TmV4dFRva2VuICAgKHBBTlRMUjNfVE9LRU5fU09VUkNFIHRva3NvdXJjZSk7CisKKy8qIE92ZXJyaWRlIHRoZSBub3JtYWwgTUVNT0laRSBhbmQgSEFWRUFMUkVBRFlQQVJTRUQgbWFjcm9zIGFzIHRoaXMgaXMgYSBmaWx0ZXJpbmcKKyAqIGxleGVyLiBJbiBmaWx0ZXIgbW9kZSwgdGhlIG1lbW9pemluZyBhbmQgYmFja3RyYWNraW5nIGFyZSBnYXRlZCBhdCBCQUNLVFJBQ0tJTkcgPiAxIHJhdGhlcgorICogdGhhbiBqdXN0IEJBQ0tUUkFDS0lORy4gSW4gc29tZSBjYXNlcyB0aGlzIG1pZ2h0IGdlbmVyYXRlIGNvZGUgYWtpbiB0bzoKKyAqICAgaWYgKEJBQ0tUUkFDS0lORykgaWYgKEJBQ0tUUkFDS0lORyA+IDEpIG1lbW9pemUuCisgKiBIb3dldmVyLCBJIGFzc3VtZSB0aGF0IHRoZSBDIGNvbXBpbGVycy9vcHRpbWl6ZXJzIGFyZSBzbWFydCBlbm91Z2ggdG8gd29yayB0aGlzIG9uZSBvdXQKKyAqIHRoZXNlIGRheXMgLSBKaW0KKyAqLworI3VuZGVmCQlNRU1PSVpFCisjZGVmaW5lCQlNRU1PSVpFKHJpLHNpKQkJCWlmIChCQUNLVFJBQ0tJTkc+MSkgeyBSRUNPR05JWkVSLT5tZW1vaXplKFJFQ09HTklaRVIsIHJpLCBzaSkgfQorI3VuZGVmCQlIQVZFUEFSU0VEUlVMRQorI2RlZmluZQkJSEFWRVBBUlNFRFJVTEUocikJCWlmIChCQUNLVFJBQ0tJTkc+MSkgeyBSRUNPR05JWkVSLT5hbHJlYWR5UGFyc2VkUnVsZShSRUNPR05JWkVSLCByKSB9Cis8ZW5kaWY+CisKKy8qIEZvcndhcmQgZGVjbGFyZSB0aGUgbG9jYWxseSBzdGF0aWMgbWF0Y2hpbmcgZnVuY3Rpb25zIHdlIGhhdmUgZ2VuZXJhdGVkIGFuZCBhbnkgcHJlZGljYXRlIGZ1bmN0aW9ucy4KKyAqLworPHJ1bGVzOntyIHwgc3RhdGljIEFOVExSM19JTkxJTkUgPGhlYWRlclJldHVyblR5cGUocnVsZURlc2NyaXB0b3I9ci5ydWxlRGVzY3JpcHRvcik+CTxpZighci5ydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPm08ZW5kaWY+PHIucnVsZURlc2NyaXB0b3IubmFtZT4gICAgKHA8bmFtZT4gY3R4PGlmKHIucnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUpPiwgPGVuZGlmPjxyLnJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KTt9OyBzZXBhcmF0b3I9IlxuIj4KK3N0YXRpYyB2b2lkCTxuYW1lPkZyZWUocDxuYW1lPiBjdHgpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMZXhlciBtYXRjaGluZyBydWxlcyBlbmQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworPHNjb3Blczp7aXQgfDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKGl0KT48ZW5kaWY+fT4KKworPGFjdGlvbnMubGV4ZXIubWVtYmVycz4KKworc3RhdGljIHZvaWQKKzxuYW1lPkZyZWUgIChwPG5hbWU+IGN0eCkKK3sKKzxpZihtZW1vaXplKT4KKwlpZgkoUlVMRU1FTU8gIT0gTlVMTCkKKwl7CisJCVJVTEVNRU1PLT5mcmVlKFJVTEVNRU1PKTsKKwkJUlVMRU1FTU8gPSBOVUxMOworCX0KKzxlbmRpZj4KKzxpZihncmFtbWFyLmRpcmVjdERlbGVnYXRlcyk+CisJLy8gRnJlZSB0aGUgbGV4ZXJzIHRoYXQgd2UgZGVsZWdhdGVkIHRvCisJLy8gZnVuY3Rpb25zIHRvLiBOVUxMIHRoZSBzdGF0ZSBzbyB3ZSBvbmx5IGZyZWUgaXQgb25jZS4KKwkvLworCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgICAgICAgIHtnfGN0eC0+PGc6ZGVsZWdhdGVOYW1lKCk+LT5wTGV4ZXItPnJlYy0+c3RhdGUgPSBOVUxMOworICAgICAgICAgY3R4LT48ZzpkZWxlZ2F0ZU5hbWUoKT4tPmZyZWUoY3R4LT48ZzpkZWxlZ2F0ZU5hbWUoKT4pO307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorICAgIExFWEVSLT5mcmVlKExFWEVSKTsKKworICAgIEFOVExSM19GUkVFKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCis8bmFtZT5SZXNldCAocDxuYW1lPiBjdHgpCit7CisgICAgUkVDT0dOSVpFUi0+cmVzZXQoUkVDT0dOSVpFUik7Cit9CisKKy8qKiBcYnJpZWYgTmFtZSBvZiB0aGUgZ3JhbW1hciBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXMgY29kZQorICovCitzdGF0aWMgY29uc3QgY2hhciBmaWxlTmFtZVtdID0gIjxmaWxlTmFtZT4iOworCisvKiogXGJyaWVmIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZ3JhbW1hciBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXMgY29kZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBnZXRHcmFtbWFyRmlsZU5hbWUoKQoreworCXJldHVybiBmaWxlTmFtZTsKK30KKworPGlmKGZpbHRlck1vZGUpPgorICAgIDxmaWx0ZXJpbmdOZXh0VG9rZW4oKT4KKzxlbmRpZj4KKworLyoqIFxicmllZiBDcmVhdGUgYSBuZXcgbGV4ZXIgY2FsbGVkIDxuYW1lPgorICoKKyAqIFxwYXJhbVtpbl0gICAgaW5zdHJlYW0gUG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBpbnB1dCBzdHJlYW0KKyAqIFxyZXR1cm4KKyAqICAgICAtIFN1Y2Nlc3MgcDxuYW1lPiBpbml0aWFsaXplZCBmb3IgdGhlIGxleCBzdGFydAorICogICAgIC0gRmFpbCBOVUxMCisgKi8KK0FOVExSM19BUEkgcDxuYW1lPiA8bmFtZT5OZXcKKyg8aW5wdXRUeXBlKCk+IGluc3RyZWFtPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIHA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pCit7CisJLy8gU2VlIGlmIHdlIGNhbiBjcmVhdGUgYSBuZXcgbGV4ZXIgd2l0aCB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3IKKwkvLworCXJldHVybiA8bmFtZT5OZXdTU0QoaW5zdHJlYW0sIE5VTEw8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pOworfQorCisvKiogXGJyaWVmIENyZWF0ZSBhIG5ldyBsZXhlciBjYWxsZWQgPG5hbWU+CisgKgorICogXHBhcmFtW2luXSAgICBpbnN0cmVhbSBQb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIGlucHV0IHN0cmVhbQorICogXHBhcmFtW3N0YXRlXSBzdGF0ZSBQcmV2aW91c2x5IGNyZWF0ZWQgc2hhcmVkIHJlY29nbml6ZXIgc3RhdAorICogXHJldHVybgorICogICAgIC0gU3VjY2VzcyBwPG5hbWU+IGluaXRpYWxpemVkIGZvciB0aGUgbGV4IHN0YXJ0CisgKiAgICAgLSBGYWlsIE5VTEwKKyAqLworQU5UTFIzX0FQSSBwPG5hbWU+IDxuYW1lPk5ld1NTRAorKHBBTlRMUjNfSU5QVVRfU1RSRUFNIGluc3RyZWFtLCBwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIHA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pCit7CisgICAgcDxuYW1lPiBjdHg7IC8vIENvbnRleHQgc3RydWN0dXJlIHdlIHdpbGwgYnVpbGQgYW5kIHJldHVybgorCisgICAgY3R4ID0gKHA8bmFtZT4pIEFOVExSM19DQUxMT0MoMSwgc2l6ZW9mKDxuYW1lPikpOworCisgICAgaWYgIChjdHggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8vIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxleGVyIGNvbnRleHQKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBNZW1vcnkgZm9yIGJhc2ljIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQsIG5vdyB0byBmaWxsIGluCisgICAgICogaW4gYmFzZSBBTlRMUjMgc3RydWN0dXJlcy4gV2UgaW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgKiBmb3IgdGhlIHN0YW5kYXJkIEFOVExSMyBsZXhlciBmdW5jdGlvbiBzZXQsIGJ1dCB1cG9uIHJldHVybgorICAgICAqIGZyb20gaGVyZSwgdGhlIHByb2dyYW1tZXIgbWF5IHNldCB0aGUgcG9pbnRlcnMgdG8gcHJvdmlkZSBjdXN0b20KKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IHVzZSB0aGUgbWFjcm9zIGRlZmluZWQgaW4gPG5hbWU+LmggaGVyZSBzbyB5b3UgY2FuIGdldCBhIHNlbnNlCisgICAgICogb2Ygd2hhdCBnb2VzIHdoZXJlLgorICAgICAqLworCisgICAgLyogQ3JlYXRlIGEgYmFzZSBsZXhlciwgdXNpbmcgdGhlIHN1cHBsaWVkIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIGN0eC0+cExleGVyCT0gYW50bHIzTGV4ZXJOZXdTdHJlYW0oQU5UTFIzX1NJWkVfSElOVCwgaW5zdHJlYW0sIHN0YXRlKTsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgYWxsb2NhdGVkIHRoZSBtZW1vcnkgY29ycmVjdGx5CisgICAgICovCisgICAgaWYJKGN0eC0+cExleGVyID09IE5VTEwpCisgICAgeworCQlBTlRMUjNfRlJFRShjdHgpOworCQlyZXR1cm4gIE5VTEw7CisgICAgfQorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgICAgLy8gQ3JlYXRlIGEgTElTVCBmb3IgcmVjb3JkaW5nIHJ1bGUgbWVtb3MuCisgICAgLy8KKyAgICBjdHgtPnBMZXhlci0+cmVjLT5ydWxlTWVtbyAgICA9IGFudGxyM0ludFRyaWVOZXcoMTUpOwkvKiAxNiBiaXQgZGVwdGggaXMgZW5vdWdoIGZvciAzMjc2OCBydWxlcyEgKi8KKzxlbmRpZj4KKzxlbmRpZj4KKworICAgIC8qIEluc3RhbGwgdGhlIGltcGxlbWVudGF0aW9uIG9mIG91ciA8bmFtZT4gaW50ZXJmYWNlCisgICAgICovCisgICAgPHJ1bGVzOntyIHwgPGlmKCFyLnJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Y3R4LT5tPHIucnVsZURlc2NyaXB0b3IubmFtZT4JPSBtPHIucnVsZURlc2NyaXB0b3IubmFtZT47PGVuZGlmPn07IHNlcGFyYXRvcj0iXG4iPgorCisgICAgLyoqIFdoZW4gdGhlIG5leHRUb2tlbigpIGNhbGwgaXMgbWFkZSB0byB0aGlzIGxleGVyJ3MgcEFOVExSM19UT0tFTl9TT1VSQ0UKKyAgICAgKiAgaXQgd2lsbCBjYWxsIG1Ub2tlbnMoKSBpbiB0aGlzIGdlbmVyYXRlZCBjb2RlLCBhbmQgd2lsbCBwYXNzIGl0IHRoZSBjdHgKKyAgICAgKiBwb2ludGVyIG9mIHRoaXMgbGV4ZXIsIG5vdCB0aGUgY29udGV4dCBvZiB0aGUgYmFzZSBsZXhlciwgc28gc3RvcmUgdGhhdCBub3cuCisgICAgICovCisgICAgY3R4LT5wTGV4ZXItPmN0eAkgICAgPSBjdHg7CisKKyAgICAvKipJbnN0YWxsIHRoZSB0b2tlbiBtYXRjaGluZyBmdW5jdGlvbgorICAgICAqLworICAgIGN0eC0+cExleGVyLT5tVG9rZW5zID0gKHZvaWQgKCopICh2b2lkICopKShtVG9rZW5zKTsKKworICAgIGN0eC0+Z2V0R3JhbW1hckZpbGVOYW1lCT0gZ2V0R3JhbW1hckZpbGVOYW1lOworICAgIGN0eC0+ZnJlZQkJPSA8bmFtZT5GcmVlOworICAgIGN0eC0+cmVzZXQgICAgICAgICAgPSA8bmFtZT5SZXNldDsKKworPGlmKGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzKT4KKwkvLyBJbml0aWFsaXplIHRoZSBsZXhlcnMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVsZWdhdGUgc29tZQorCS8vIGZ1bmN0aW9ucyB0by4KKwkvLworCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgICAgICAgIHtnfGN0eC0+PGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGcucmVjb2duaXplck5hbWU+TmV3U1NEKGluc3RyZWFtLCBjdHgtPnBMZXhlci0+cmVjLT5zdGF0ZSwgY3R4PGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxlbmRpZj4KKzxpZihncmFtbWFyLmRlbGVnYXRvcnMpPgorCS8vIEluc3RhbGwgdGhlIHBvaW50ZXJzIGJhY2sgdG8gbGV4ZXJzIHRoYXQgd2lsbCBkZWxlZ2F0ZSB1cyB0byBwZXJmb3JtIGNlcnRhaW4gZnVuY3Rpb25zCisJLy8gZm9yIHRoZW0uCisJLy8KKwk8Z3JhbW1hci5kZWxlZ2F0b3JzOgorICAgICAgICAge2d8Y3R4LT48ZzpkZWxlZ2F0ZU5hbWUoKT4JCQk9IDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxlbmRpZj4KKzxpZihmaWx0ZXJNb2RlKT4KKyAgICAvKiBXZSBoYXZlIGZpbHRlciBtb2RlIHR1cm5lZCBvbiwgc28gaW5zdGFsbCB0aGUgZmlsdGVyaW5nIG5leHRUb2tlbiBmdW5jdGlvbgorICAgICAqLworICAgIGN0eC0+cExleGVyLT5yZWMtPnN0YXRlLT50b2tTb3VyY2UtPm5leHRUb2tlbiA9IDxuYW1lPk5leHRUb2tlbjsKKzxlbmRpZj4KKwkgPGFjdGlvbnMubGV4ZXIuYXBpZnVuY3M+CisKKyAgICAvKiBSZXR1cm4gdGhlIG5ld2x5IGJ1aWx0IGxleGVyIHRvIHRoZSBjYWxsZXIKKyAgICAgKi8KKyAgICByZXR1cm4gIGN0eDsKK30KKzxpZihjeWNsaWNERkFzKT4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogREZBIHRhYmxlcyBmb3IgdGhlIGxleGVyCisgKi8KKzxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5kIG9mIERGQSB0YWJsZXMgZm9yIHRoZSBsZXhlcgorICovCis8ZW5kaWY+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9ucyB0byBtYXRjaCB0aGUgbGV4ZXIgZ3JhbW1hciBkZWZpbmVkIHRva2VucyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAqLworCis8cnVsZXM7IHNlcGFyYXRvcj0iXG5cbiI+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExleGVyIG1hdGNoaW5nIHJ1bGVzIGVuZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworPGlmKHN5bnByZWRzKT4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGV4ZXIgc3ludGFjdGljIHByZWRpY2F0ZXMKKyAqLworPHN5bnByZWRzOntwIHwgPGxleGVyU3lucHJlZChwcmVkbmFtZT1wKT59PgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTGV4ZXIgc3ludGFjdGljIHByZWRpY2F0ZXMgZW5kLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCis8ZW5kaWY+CisKKy8qIEVuZCBvZiBMZXhlciBjb2RlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKz4+CisKKworZmlsdGVyaW5nTmV4dFRva2VuKCkgOjo9IDw8CisvKiogQW4gb3ZlcnJpZGUgb2YgdGhlIGxleGVyJ3MgbmV4dFRva2VuKCkgbWV0aG9kIHRoYXQgYmFja3RyYWNrcyBvdmVyIG1Ub2tlbnMoKSBsb29raW5nCisgKiAgZm9yIG1hdGNoZXMgaW4gbGV4ZXIgZmlsdGVyTW9kZS4gIE5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQgdXBvbiBlcnJvcjsganVzdCByZXdpbmQsIGNvbnN1bWUKKyAqICBhIHRva2VuIGFuZCB0aGVuIHRyeSBhZ2Fpbi4gIEJBQ0tUUkFDS0lORyBuZWVkcyB0byBiZSBzZXQgYXMgd2VsbC4KKyAqICBNYWtlIHJ1bGUgbWVtb2l6YXRpb24gaGFwcGVuIG9ubHkgYXQgbGV2ZWxzIGFib3ZlIDEgYXMgd2Ugc3RhcnQgbVRva2VucworICogIGF0IEJBQ0tUUkFDS0lORz09MS4KKyAqLworc3RhdGljIHBBTlRMUjNfQ09NTU9OX1RPS0VOCis8bmFtZT5OZXh0VG9rZW4ocEFOVExSM19UT0tFTl9TT1VSQ0UgdG9rc291cmNlKQoreworICAgIHBBTlRMUjNfTEVYRVIgICBsZXhlcjsKKwlwQU5UTFIzX1JFQ09HTklaRVJfU0hBUkVEX1NUQVRFIHN0YXRlOworCisgICAgbGV4ZXIgICA9IChwQU5UTFIzX0xFWEVSKSh0b2tzb3VyY2UtPnN1cGVyKTsKKyAgICBzdGF0ZQk9IGxleGVyLT5yZWMtPnN0YXRlOworCisgICAgLyogR2V0IHJpZCBvZiBhbnkgcHJldmlvdXMgdG9rZW4gKHRva2VuIGZhY3RvcnkgdGFrZXMgY2FyZSBvZgorICAgICAqIGFueSBkZWFsbG9jYXRpb24gd2hlbiB0aGlzIHRva2VuIGlzIGZpbmFsbHkgdXNlZCB1cC4KKyAgICAgKi8KKyAgICBzdGF0ZQkJLT50b2tlbgkgICAgPSBOVUxMOworICAgIHN0YXRlCQktPmVycm9yCSAgICA9IEFOVExSM19GQUxTRTsJICAgIC8qIFN0YXJ0IG91dCB3aXRob3V0IGFuIGV4Y2VwdGlvbgkqLworICAgIHN0YXRlCQktPmZhaWxlZCAgICA9IEFOVExSM19GQUxTRTsKKworICAgIC8qIFJlY29yZCB0aGUgc3RhcnQgb2YgdGhlIHRva2VuIGluIG91ciBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgc3RhdGUtPnRva2VuU3RhcnRDaGFySW5kZXgJCQk9IGxleGVyLT5pbnB1dC0+aXN0cmVhbS0+aW5kZXgobGV4ZXItPmlucHV0LT5pc3RyZWFtKTsKKyAgICBzdGF0ZS0+dG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZQk9IGxleGVyLT5pbnB1dC0+Z2V0Q2hhclBvc2l0aW9uSW5MaW5lKGxleGVyLT5pbnB1dCk7CisgICAgc3RhdGUtPnRva2VuU3RhcnRMaW5lCQkJCT0gbGV4ZXItPmlucHV0LT5nZXRMaW5lKGxleGVyLT5pbnB1dCk7CisgICAgc3RhdGUtPnRleHQJCQkJCQkJPSBOVUxMOworCisgICAgLyogTm93IGNhbGwgdGhlIG1hdGNoaW5nIHJ1bGVzIGFuZCBzZWUgaWYgd2UgY2FuIGdlbmVyYXRlIGEgbmV3IHRva2VuCisgICAgICovCisgICAgZm9yCSg7OykKKyAgICB7CisJCWlmICAobGV4ZXItPmlucHV0LT5pc3RyZWFtLT5fTEEobGV4ZXItPmlucHV0LT5pc3RyZWFtLCAxKSA9PSBBTlRMUjNfQ0hBUlNUUkVBTV9FT0YpCisJCXsKKwkJCS8qIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBub3RoaW5nIG1vcmUgdG8gZG8uCisJCQkgKi8KKwkJCXBBTlRMUjNfQ09NTU9OX1RPS0VOICAgIHRlb2YgPSAmKHRva3NvdXJjZS0+ZW9mVG9rZW4pOworCisJCQl0ZW9mLT5zZXRTdGFydEluZGV4ICh0ZW9mLCBsZXhlci0+Z2V0Q2hhckluZGV4KGxleGVyKSk7CisJCQl0ZW9mLT5zZXRTdG9wSW5kZXggICh0ZW9mLCBsZXhlci0+Z2V0Q2hhckluZGV4KGxleGVyKSk7CisJCQl0ZW9mLT5zZXRMaW5lCQkodGVvZiwgbGV4ZXItPmdldExpbmUobGV4ZXIpKTsKKwkJCXJldHVybiAgdGVvZjsKKwkJfQorCisJCXN0YXRlLT50b2tlbgkJPSBOVUxMOworCQlzdGF0ZS0+ZXJyb3IJCT0gQU5UTFIzX0ZBTFNFOwkgICAgLyogU3RhcnQgb3V0IHdpdGhvdXQgYW4gZXhjZXB0aW9uCSovCisKKwkJeworCQkJQU5UTFIzX01BUktFUiAgIG07CisKKwkJCW0JCQkJCQk9IGxleGVyLT5pbnB1dC0+aXN0cmVhbS0+bWFyayhsZXhlci0+aW5wdXQtPmlzdHJlYW0pOworCQkJc3RhdGUtPmJhY2t0cmFja2luZwkJPSAxOwkJCQkvKiBObyBleGNlcHRpb25zICovCisJCQlzdGF0ZS0+ZmFpbGVkCQkJPSBBTlRMUjNfRkFMU0U7CisKKwkJCS8qIENhbGwgdGhlIGdlbmVyYXRlZCBsZXhlciwgc2VlIGlmIGl0IGNhbiBnZXQgYSBuZXcgdG9rZW4gdG9nZXRoZXIuCisJCQkgKi8KKwkJCWxleGVyLT5tVG9rZW5zKGxleGVyLT5jdHgpOworICAgIAkJc3RhdGUtPmJhY2t0cmFja2luZwk9IDA7CisKKyAgICAJCTwhIG1Ub2tlbnMgYmFja3RyYWNrcyB3aXRoIHN5bnByZWQgYXQgQkFDS1RSQUNLSU5HPT0yCisJCQkJYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAhPgorCisJCQlpZgkoc3RhdGUtPmZhaWxlZCA9PSBBTlRMUjNfVFJVRSkKKwkJCXsKKwkJCQlsZXhlci0+aW5wdXQtPmlzdHJlYW0tPnJld2luZChsZXhlci0+aW5wdXQtPmlzdHJlYW0sIG0pOworCQkJCWxleGVyLT5pbnB1dC0+aXN0cmVhbS0+Y29uc3VtZShsZXhlci0+aW5wdXQtPmlzdHJlYW0pOyA8ISBhZHZhbmNlIG9uZSBjaGFyIGFuZCB0cnkgYWdhaW4gIT4KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsZXhlci0+ZW1pdChsZXhlcik7CQkJCQkvKiBBc3NlbWJsZSB0aGUgdG9rZW4gYW5kIGVtaXQgaXQgdG8gdGhlIHN0cmVhbSAqLworCQkJCXJldHVybglzdGF0ZS0+dG9rZW47CisJCQl9CisJCX0KKyAgICB9Cit9Cis+PgorCithY3Rpb25HYXRlKCkgOjo9ICJCQUNLVFJBQ0tJTkc9PTAiCisKK2ZpbHRlcmluZ0FjdGlvbkdhdGUoKSA6Oj0gIkJBQ0tUUkFDS0lORz09MSIKKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHBhcnNlciAqLworZ2VuZXJpY1BhcnNlciggIGdyYW1tYXIsCisJCQkJbmFtZSwKKyAgICAgICAgICAgICAgICBzY29wZXMsCisgICAgICAgICAgICAgICAgdG9rZW5zLAorICAgICAgICAgICAgICAgIHRva2VuTmFtZXMsCisgICAgICAgICAgICAgICAgcnVsZXMsCisgICAgICAgICAgICAgICAgbnVtUnVsZXMsCisgICAgICAgICAgICAgICAgYml0c2V0cywKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgc3VwZXJDbGFzcywKKyAgICAgICAgICAgICAgICBsYWJlbFR5cGUsCisJCQkJbWVtYmVycywKKwkJCQlyZXdyaXRlRWxlbWVudFR5cGUsIGZpbHRlck1vZGUsCisgICAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPSJwQU5UTFIzX0JBU0VfVFJFRSIKKyAgICAgICAgICAgICAgKSA6Oj0gPDwKKworCis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKy8qKiBcYnJpZWYgVGFibGUgb2YgYWxsIHRva2VuIG5hbWVzIGluIHN5bWJvbGljIG9yZGVyLCBtYWlubHkgdXNlZCBmb3IKKyAqICAgICAgICAgZXJyb3IgcmVwb3J0aW5nLgorICovCitwQU5UTFIzX1VJTlQ4ICAgPG5hbWU+VG9rZW5OYW1lc1s8bGVuZ3RoKHRva2VuTmFtZXMpPis0XQorICAgICA9IHsKKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJcPGludmFsaWQ+IiwgICAgICAgLyogU3RyaW5nIHRvIHByaW50IHRvIGluZGljYXRlIGFuIGludmFsaWQgdG9rZW4gKi8KKyAgICAgICAgKHBBTlRMUjNfVUlOVDgpICJcPEVPUj4iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlw8RE9XTj4iLAorICAgICAgICAocEFOVExSM19VSU5UOCkgIlw8VVA+IiwKKyAgICAgICAgPHRva2VuTmFtZXM6e2l0IHwocEFOVExSM19VSU5UOCkgPGl0Pn07IHNlcGFyYXRvcj0iLFxuIj4KKyAgICAgICB9OworPGVuZGlmPgorCisgICAgPEBtZW1iZXJzPgorCisgICAgPEBlbmQ+Cis8cnVsZXM6e3IgfDxydWxlQXR0cmlidXRlU2NvcGVGdW5jTWFjcm8oc2NvcGU9ci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPn0+Cis8c2NvcGVzOntpdCB8PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGVGdW5jTWFjcm8oaXQpPjxlbmRpZj59PgorCisvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGxvY2FsbHkgc3RhdGljIG1hdGNoaW5nIGZ1bmN0aW9ucyB3ZSBoYXZlIGdlbmVyYXRlZC4KKy8vCis8cnVsZXM6e3IgfCBzdGF0aWMgPGhlYWRlclJldHVyblR5cGUocnVsZURlc2NyaXB0b3I9ci5ydWxlRGVzY3JpcHRvcik+CTxyLnJ1bGVEZXNjcmlwdG9yLm5hbWU+ICAgIChwPG5hbWU+IGN0eDxpZihyLnJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT4sIDxlbmRpZj48ci5ydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPik7fTsgc2VwYXJhdG9yPSJcbiI+CitzdGF0aWMgdm9pZAk8bmFtZT5GcmVlKHA8bmFtZT4gY3R4KTsKK3N0YXRpYyB2b2lkICAgICA8bmFtZT5SZXNldCAocDxuYW1lPiBjdHgpOworCis8aWYoIUxFWEVSKT4KKzwhIGdlbmVyYXRlIHJ1bGUvbWV0aG9kIGRlZmluaXRpb25zIGZvciBpbXBvcnRlZCBydWxlcyBzbyB0aGV5CisgICBhcHBlYXIgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIHJlY29nbml6ZXIuICE+Cis8aWYocmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRlZFJ1bGVzKT4KKy8vIERlbGVnYXRlZCBydWxlcworLy8KKzxyZWNvZ25pemVyLmdyYW1tYXIuZGVsZWdhdGVkUnVsZXM6e3J1bGVEZXNjcmlwdG9yfHN0YXRpYyA8aGVhZGVyUmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcik+IDxydWxlRGVzY3JpcHRvci5uYW1lPihwPG5hbWU+IGN0eDxpZihydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZSk+LCA8ZW5kaWY+PHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKworPGVuZGlmPgorPGVuZGlmPgorCisvKiBGb3IgdXNlIGluIHRyZWUgb3V0cHV0IHdoZXJlIHdlIGFyZSBhY2N1bXVsYXRpbmcgcnVsZSBsYWJlbHMgdmlhIGxhYmVsICs9IHJ1bGVSZWYKKyAqIHdlIG5lZWQgYSBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBmcmVlIGEgcmV0dXJuIHNjb3BlIHdoZW4gdGhlIGxpc3QgaXMgZGVzdHJveWVkLgorICogV2UgY2Fubm90IGp1c3QgdXNlIEFOVExSM19GUkVFIGJlY2F1c2UgaW4gZGVidWcgdHJhY2tpbmcgbW9kZSwgdGhpcyBpcyBhIG1hY3JvLgorICovCitzdGF0aWMJdm9pZCBBTlRMUjNfQ0RFQ0wgZnJlZVNjb3BlKHZvaWQgKiBzY29wZSkKK3sKKyAgICBBTlRMUjNfRlJFRShzY29wZSk7Cit9CisKKy8qKiBcYnJpZWYgTmFtZSBvZiB0aGUgZ3JhbW1hciBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXMgY29kZQorICovCitzdGF0aWMgY29uc3QgY2hhciBmaWxlTmFtZVtdID0gIjxmaWxlTmFtZT4iOworCisvKiogXGJyaWVmIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZ3JhbW1hciBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXMgY29kZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBnZXRHcmFtbWFyRmlsZU5hbWUoKQoreworCXJldHVybiBmaWxlTmFtZTsKK30KKy8qKiBcYnJpZWYgQ3JlYXRlIGEgbmV3IDxuYW1lPiBwYXJzZXIgYW5kIHJldHVybiBhIGNvbnRleHQgZm9yIGl0LgorICoKKyAqIFxwYXJhbVtpbl0gaW5zdHJlYW0gUG9pbnRlciB0byBhbiBpbnB1dCBzdHJlYW0gaW50ZXJmYWNlLgorICoKKyAqIFxyZXR1cm4gUG9pbnRlciB0byBuZXcgcGFyc2VyIGNvbnRleHQgdXBvbiBzdWNjZXNzLgorICovCitBTlRMUjNfQVBJIHA8bmFtZT4KKzxuYW1lPk5ldyAgICg8aW5wdXRTdHJlYW1UeXBlPiBpbnN0cmVhbTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCBwPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KQoreworCS8vIFNlZSBpZiB3ZSBjYW4gY3JlYXRlIGEgbmV3IHBhcnNlciB3aXRoIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcgorCS8vCisJcmV0dXJuIDxuYW1lPk5ld1NTRChpbnN0cmVhbSwgTlVMTDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pik7Cit9CisKKy8qKiBcYnJpZWYgQ3JlYXRlIGEgbmV3IDxuYW1lPiBwYXJzZXIgYW5kIHJldHVybiBhIGNvbnRleHQgZm9yIGl0LgorICoKKyAqIFxwYXJhbVtpbl0gaW5zdHJlYW0gUG9pbnRlciB0byBhbiBpbnB1dCBzdHJlYW0gaW50ZXJmYWNlLgorICoKKyAqIFxyZXR1cm4gUG9pbnRlciB0byBuZXcgcGFyc2VyIGNvbnRleHQgdXBvbiBzdWNjZXNzLgorICovCitBTlRMUjNfQVBJIHA8bmFtZT4KKzxuYW1lPk5ld1NTRCAgICg8aW5wdXRTdHJlYW1UeXBlPiBpbnN0cmVhbSwgcEFOVExSM19SRUNPR05JWkVSX1NIQVJFRF9TVEFURSBzdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCBwPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KQoreworICAgIHA8bmFtZT4gY3R4OwkgICAgLyogQ29udGV4dCBzdHJ1Y3R1cmUgd2Ugd2lsbCBidWlsZCBhbmQgcmV0dXJuICAgKi8KKworICAgIGN0eAk9IChwPG5hbWU+KSBBTlRMUjNfQ0FMTE9DKDEsIHNpemVvZig8bmFtZT4pKTsKKworICAgIGlmCShjdHggPT0gTlVMTCkKKyAgICB7CisJCS8vIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhcnNlciBjb250ZXh0CisJCS8vCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogTWVtb3J5IGZvciBiYXNpYyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkLCBub3cgdG8gZmlsbCBpbgorICAgICAqIHRoZSBiYXNlIEFOVExSMyBzdHJ1Y3R1cmVzLiBXZSBpbml0aWFsaXplIHRoZSBmdW5jdGlvbiBwb2ludGVycworICAgICAqIGZvciB0aGUgc3RhbmRhcmQgQU5UTFIzIHBhcnNlciBmdW5jdGlvbiBzZXQsIGJ1dCB1cG9uIHJldHVybgorICAgICAqIGZyb20gaGVyZSwgdGhlIHByb2dyYW1tZXIgbWF5IHNldCB0aGUgcG9pbnRlcnMgdG8gcHJvdmlkZSBjdXN0b20KKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IHVzZSB0aGUgbWFjcm9zIGRlZmluZWQgaW4gPG5hbWU+LmggaGVyZSwgaW4gb3JkZXIgdGhhdCB5b3UgY2FuIGdldCBhIHNlbnNlCisgICAgICogb2Ygd2hhdCBnb2VzIHdoZXJlLgorICAgICAqLworCis8aWYoUEFSU0VSKT4KKyAgICAvKiBDcmVhdGUgYSBiYXNlIHBhcnNlci9yZWNvZ25pemVyLCB1c2luZyB0aGUgc3VwcGxpZWQgdG9rZW4gc3RyZWFtCisgICAgICovCisgICAgY3R4LT5wUGFyc2VyCSAgICA9IGFudGxyM1BhcnNlck5ld1N0cmVhbShBTlRMUjNfU0laRV9ISU5ULCBpbnN0cmVhbS0+dHN0cmVhbSwgc3RhdGUpOworPGVuZGlmPgorPGlmKFRSRUVfUEFSU0VSKT4KKyAgICAvKiBDcmVhdGUgYSBiYXNlIFRyZWUgcGFyc2VyL3JlY29nbml6ZXIsIHVzaW5nIHRoZSBzdXBwbGllZCB0cmVlIG5vZGUgc3RyZWFtCisgICAgICovCisgICAgY3R4LT5wVHJlZVBhcnNlcgkJPSBhbnRscjNUcmVlUGFyc2VyTmV3U3RyZWFtKEFOVExSM19TSVpFX0hJTlQsIGluc3RyZWFtLCBzdGF0ZSk7Cis8ZW5kaWY+CisKKyAgICAvKiBJbnN0YWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBvdXIgPG5hbWU+IGludGVyZmFjZQorICAgICAqLworICAgIDxydWxlczp7ciB8IGN0eC0+PHIucnVsZURlc2NyaXB0b3IubmFtZT4JPSA8ci5ydWxlRGVzY3JpcHRvci5uYW1lPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxpZihncmFtbWFyLmRlbGVnYXRlZFJ1bGVzKT4KKwkvLyBJbnN0YWxsIHRoZSBkZWxlZ2F0ZWQgbWV0aG9kcyBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlIGEgcGFydCBvZiB0aGlzCisJLy8gcGFyc2VyCisJLy8KKyAgICA8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3IgfCBjdHgtPjxydWxlRGVzY3JpcHRvci5uYW1lPgk9IDxydWxlRGVzY3JpcHRvci5uYW1lPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxlbmRpZj4KKworICAgIGN0eC0+ZnJlZQkJCT0gPG5hbWU+RnJlZTsKKyAgICBjdHgtPnJlc2V0CQkJPSA8bmFtZT5SZXNldDsKKyAgICBjdHgtPmdldEdyYW1tYXJGaWxlTmFtZQk9IGdldEdyYW1tYXJGaWxlTmFtZTsKKworICAgIC8qIEluc3RhbGwgdGhlIHNjb3BlIHB1c2hpbmcgbWV0aG9kcy4KKyAgICAgKi8KKyAgICA8cnVsZXM6IHtyIHw8aWYoci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorPHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZT1yLnJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+PFxuPgorPGVuZGlmPn0+CisgICAgPHJlY29nbml6ZXIuc2NvcGVzOntpdCB8PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT4KKzxnbG9iYWxBdHRyaWJ1dGVTY29wZShpdCk+PFxuPgorPGVuZGlmPn0+CisgICAgPEBhcGlmdW5jcz4KKworICAgIDxAZW5kPgorPGlmKGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzKT4KKwkvLyBJbml0aWFsaXplIHRoZSBwYXJzZXJzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlbGVnYXRlIHNvbWUKKwkvLyBmdW5jdGlvbnMgdG8uCisJLy8KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisgICAgICAgICB7Z3xjdHgtPjxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnLnJlY29nbml6ZXJOYW1lPk5ld1NTRChpbnN0cmVhbSwgUFNSU1RBVEUsIGN0eDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pik7fTsgc2VwYXJhdG9yPSJcbiI+Cis8ZW5kaWY+Cis8aWYoZ3JhbW1hci5kZWxlZ2F0b3JzKT4KKwkvLyBJbnN0YWxsIHRoZSBwb2ludGVycyBiYWNrIHRvIHBhcnNlcnMgdGhhdCB3aWxsIGRlbGVnYXRlIHVzIHRvIHBlcmZvcm0gY2VydGFpbiBmdW5jdGlvbnMKKwkvLyBmb3IgdGhlbS4KKwkvLworCTxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xjdHgtPjxnOmRlbGVnYXRlTmFtZSgpPgkJCT0gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorICAgIDxhY3Rpb25zLnBhcnNlci5hcGlmdW5jcz4KKyAgICA8YWN0aW9ucy50cmVlcGFyc2VyLmFwaWZ1bmNzPgorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgICAgLyogQ3JlYXRlIGEgTElTVCBmb3IgcmVjb3JkaW5nIHJ1bGUgbWVtb3MuCisgICAgICovCisgICAgIFJVTEVNRU1PICAgID0gYW50bHIzSW50VHJpZU5ldygxNSk7CS8qIDE2IGJpdCBkZXB0aCBpcyBlbm91Z2ggZm9yIDMyNzY4IHJ1bGVzISAqLzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICAvKiBJbnN0YWxsIHRoZSB0b2tlbiB0YWJsZQorICAgICAqLworICAgIFBTUlNUQVRFLT50b2tlbk5hbWVzICAgPSA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+VG9rZW5OYW1lczsKKworICAgIDxAZGVidWdTdHVmZigpPgorCisgICAgLyogUmV0dXJuIHRoZSBuZXdseSBidWlsdCBwYXJzZXIgdG8gdGhlIGNhbGxlcgorICAgICAqLworICAgIHJldHVybiAgY3R4OworfQorCitzdGF0aWMgdm9pZAorPG5hbWU+UmVzZXQgKHA8bmFtZT4gY3R4KQoreworICAgIFJFQ09HTklaRVItPnJlc2V0KFJFQ09HTklaRVIpOworfQorCisvKiogRnJlZSB0aGUgcGFyc2VyIHJlc291cmNlcworICovCisgc3RhdGljIHZvaWQKKyA8bmFtZT5GcmVlKHA8bmFtZT4gY3R4KQorIHsKKyAgICAvKiBGcmVlIGFueSBzY29wZSBtZW1vcnkKKyAgICAgKi8KKyAgICA8cnVsZXM6IHtyIHw8aWYoci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPjxydWxlQXR0cmlidXRlU2NvcGVGcmVlKHNjb3BlPXIucnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT48XG4+PGVuZGlmPn0+CisgICAgPHJlY29nbml6ZXIuc2NvcGVzOntpdCB8PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGVGcmVlKGl0KT48XG4+PGVuZGlmPn0+CisKKyAgICA8QGNsZWFudXA+CisgICAgPEBlbmQ+Cis8aWYoZ3JhbW1hci5kaXJlY3REZWxlZ2F0ZXMpPgorCS8vIEZyZWUgdGhlIHBhcnNlcnMgdGhhdCB3ZSBkZWxlZ2F0ZWQgdG8KKwkvLyBmdW5jdGlvbnMgdG8uTlVMTCB0aGUgc3RhdGUgc28gd2Ugb25seSBmcmVlIGl0IG9uY2UuCisJLy8KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisgICAgICAgICB7Z3wgY3R4LT48ZzpkZWxlZ2F0ZU5hbWUoKT4tPjxpZihUUkVFX1BBUlNFUik+cFRyZWVQYXJzZXI8ZWxzZT5wUGFyc2VyPGVuZGlmPi0+cmVjLT5zdGF0ZSA9IE5VTEw7CisgICAgICAgICBjdHgtPjxnOmRlbGVnYXRlTmFtZSgpPi0+ZnJlZShjdHgtPjxnOmRlbGVnYXRlTmFtZSgpPik7fTsgc2VwYXJhdG9yPSJcbiI+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKwlpZgkoUlVMRU1FTU8gIT0gTlVMTCkKKwl7CisJCVJVTEVNRU1PLT5mcmVlKFJVTEVNRU1PKTsKKwkJUlVMRU1FTU8gPSBOVUxMOworCX0KKzxlbmRpZj4KKzxlbmRpZj4KKwkvLyBGcmVlIHRoaXMgcGFyc2VyCisJLy8KKzxpZihUUkVFX1BBUlNFUik+CisgICAgY3R4LT5wVHJlZVBhcnNlci0+ZnJlZShjdHgtPnBUcmVlUGFyc2VyKTs8XG4+Cis8ZWxzZT4KKyAgICBjdHgtPnBQYXJzZXItPmZyZWUoY3R4LT5wUGFyc2VyKTs8XG4+Cis8ZW5kaWY+CisKKyAgICBBTlRMUjNfRlJFRShjdHgpOworCisgICAgLyogRXZlcnl0aGluZyBpcyByZWxlYXNlZCwgc28gd2UgY2FuIHJldHVybgorICAgICAqLworICAgIHJldHVybjsKKyB9CisKKy8qKiBSZXR1cm4gdG9rZW4gbmFtZXMgdXNlZCBieSB0aGlzIDxncmFtbWFyVHlwZSgpPgorICoKKyAqIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHVzZWQgYXMgYW4gaW5kZXggaW50byB0aGUgdG9rZW4gbmFtZXMgdGFibGUgKHVzaW5nIHRoZSB0b2tlbgorICogbnVtYmVyIGFzIHRoZSBpbmRleCkuCisgKgorICogXHJldHVybiBQb2ludGVyIHRvIGZpcnN0IGNoYXIgKiBpbiB0aGUgdGFibGUuCisgKi8KK3N0YXRpYyBwQU5UTFIzX1VJTlQ4ICAgICpnZXRUb2tlbk5hbWVzKCkKK3sKKyAgICAgICAgcmV0dXJuIDxncmFtbWFyLmNvbXBvc2l0ZS5yb290R3JhbW1hci5yZWNvZ25pemVyTmFtZT5Ub2tlbk5hbWVzOworfQorCisgICAgPG1lbWJlcnM+CisKKy8qIERlY2xhcmUgdGhlIGJpdHNldHMKKyAqLworPGJpdHNldHM6e2l0IHwgPGJpdHNldERlY2xhcmUobmFtZT17Rk9MTE9XXzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0sCisgICAgICAgICAgICAgICAgICAgIHdvcmRzNjQ9aXQuYml0cyk+fT4KKworCis8aWYoY3ljbGljREZBcyk+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERGQSB0YWJsZXMgZm9yIHRoZSBwYXJzZXIKKyAqLworPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+IDwhIGR1bXAgdGFibGVzIGZvciBhbGwgREZBICE+CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmQgb2YgREZBIHRhYmxlcyBmb3IgdGhlIHBhcnNlcgorICovCis8ZW5kaWY+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFBhcnNpbmcgcnVsZXMKKyAqLworPHJ1bGVzOyBzZXBhcmF0b3I9IlxuXG4iPgorPGlmKGdyYW1tYXIuZGVsZWdhdGVkUnVsZXMpPgorCS8vIERlbGVnYXRlZCBtZXRob2RzIHRoYXQgYXBwZWFyIHRvIGJlIGEgcGFydCBvZiB0aGlzCisJLy8gcGFyc2VyCisJLy8KKzxncmFtbWFyLmRlbGVnYXRlZFJ1bGVzOntydWxlRGVzY3JpcHRvcnwKKyAgICA8cmV0dXJuVHlwZSgpPiA8cnVsZURlc2NyaXB0b3IubmFtZT4ocDxuYW1lPiBjdHg8aWYocnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUuYXR0cmlidXRlcyk+LCA8ZW5kaWY+PHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KQorICAgIHsKKyAgICAgICAgPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT5yZXR1cm4gPGVuZGlmPiAgICAgICBjdHgtPjxydWxlRGVzY3JpcHRvci5ncmFtbWFyOmRlbGVnYXRlTmFtZSgpPi0+PHJ1bGVEZXNjcmlwdG9yLm5hbWU+KGN0eC0+PHJ1bGVEZXNjcmlwdG9yLmdyYW1tYXI6ZGVsZWdhdGVOYW1lKCk+PGlmKHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlLmF0dHJpYnV0ZXMpPiwgPGVuZGlmPjxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU+fTsgc2VwYXJhdG9yPSIsICI+KTsKKwlcfX07IHNlcGFyYXRvcj0iXG4iPgorCis8ZW5kaWY+CisvKiBFbmQgb2YgcGFyc2luZyBydWxlcworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN5bnRhY3RpYyBwcmVkaWNhdGVzCisgKi8KKzxzeW5wcmVkczp7cCB8IDxzeW5wcmVkKHByZWRuYW1lPXApPn0+CisvKiBFbmQgb2Ygc3ludGFjdGljIHByZWRpY2F0ZXMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisKKworCisKKz4+CisKK3BhcnNlcigJZ3JhbW1hciwKKwkJbmFtZSwKKwkJc2NvcGVzLAorCQl0b2tlbnMsCisJCXRva2VuTmFtZXMsCisJCXJ1bGVzLAorCQludW1SdWxlcywKKwkJYml0c2V0cywKKwkJQVNUTGFiZWxUeXBlLAorCQlzdXBlckNsYXNzPSJQYXJzZXIiLAorCQlsYWJlbFR5cGU9InBBTlRMUjNfQ09NTU9OX1RPS0VOIiwKKwkJbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fQorCQkpIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJwQU5UTFIzX0NPTU1PTl9UT0tFTl9TVFJFQU0iLCByZXdyaXRlRWxlbWVudFR5cGU9IlRPS0VOIiwgLi4uKT4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSB0cmVlIHBhcnNlcjsgc2FtZSBhcyBwYXJzZXIgZXhjZXB0IHRoZSBpbnB1dAorICogIHN0cmVhbSBpcyBhIGRpZmZlcmVudCB0eXBlLgorICovCit0cmVlUGFyc2VyKAlncmFtbWFyLAorCQkJbmFtZSwKKwkJCXNjb3BlcywKKwkJCXRva2VucywKKwkJCXRva2VuTmFtZXMsCisJCQlnbG9iYWxBY3Rpb24sCisJCQlydWxlcywKKwkJCW51bVJ1bGVzLAorCQkJYml0c2V0cywKKwkJCWZpbHRlck1vZGUsCisJCQlsYWJlbFR5cGU9ezxBU1RMYWJlbFR5cGU+fSwKKwkJCUFTVExhYmVsVHlwZT0icEFOVExSM19CQVNFX1RSRUUiLAorCQkJc3VwZXJDbGFzcz0iVHJlZVBhcnNlciIsCisJCQltZW1iZXJzPXs8YWN0aW9ucy50cmVlcGFyc2VyLm1lbWJlcnM+fQorCQkJKSA6Oj0gPDwKKzxnZW5lcmljUGFyc2VyKGlucHV0U3RyZWFtVHlwZT0icEFOVExSM19DT01NT05fVFJFRV9OT0RFX1NUUkVBTSIsIHJld3JpdGVFbGVtZW50VHlwZT0iTk9ERSIsIC4uLik+Cis+PgorCisvKiogQSBzaW1wbGVyIHZlcnNpb24gb2YgYSBydWxlIHRlbXBsYXRlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGltYWdpbmFyeQorICogIHJ1bGVzIGNyZWF0ZWQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLiAgQXMgdGhleSBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMKKyAqICBub3IgcGFyYW1ldGVycyBldGMuLi4sIGp1c3QgZ2l2ZSBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbworICogIGFueSBvZiB0aGUgbm9ybWFsIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuCisgKiAgQXMgcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5IG5lZWQgdG8KKyAqICBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAqLworc3lucHJlZFJ1bGUocnVsZU5hbWUsIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgZGVzY3JpcHRpb24sIG5ha2VkQmxvY2spIDo6PQorPDwKKy8vICRBTlRMUiBzdGFydCA8cnVsZU5hbWU+CitzdGF0aWMgdm9pZCA8cnVsZU5hbWU+X2ZyYWdtZW50KHA8bmFtZT4gY3R4IDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPikKK3sKKwk8cnVsZUxhYmVsRGVmcygpPgorCTxydWxlTGFiZWxJbml0aWFsaXphdGlvbnMoKT4KKzxpZih0cmFjZSk+CisgICAgQU5UTFIzX1BSSU5URigiZW50ZXIgPHJ1bGVOYW1lPiAlZCBmYWlsZWQgPSAlZCwgYmFja3RyYWNraW5nID0gJWRcXG4iLExUKDEpLGZhaWxlZCxCQUNLVFJBQ0tJTkcpOworICAgIDxibG9jaz4KKyAgICBBTlRMUjNfUFJJTlRGKCJleGl0IDxydWxlTmFtZT4gJWQsIGZhaWxlZCA9ICVkLCBiYWNrdHJhY2tpbmcgPSAlZFxcbiIsTFQoMSksZmFpbGVkLEJBQ0tUUkFDS0lORyk7CisKKzxlbHNlPgorICAgIDxibG9jaz4KKzxlbmRpZj4KKzxydWxlQ2xlYW5VcCgpPgorfQorLy8gJEFOVExSIGVuZCA8cnVsZU5hbWU+Cis+PgorCitzeW5wcmVkKHByZWRuYW1lKSA6Oj0gPDwKK3N0YXRpYyBBTlRMUjNfQk9PTEVBTiA8cHJlZG5hbWU+KHA8bmFtZT4gY3R4KQoreworICAgIEFOVExSM19NQVJLRVIgICBzdGFydDsKKyAgICBBTlRMUjNfQk9PTEVBTiAgc3VjY2VzczsKKworICAgIEJBQ0tUUkFDS0lORysrOworICAgIDxAc3RhcnQoKT4KKyAgICBzdGFydAk9IE1BUksoKTsKKyAgICA8cHJlZG5hbWU+X2ZyYWdtZW50KGN0eCk7CSAgICAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgc3VjY2Vzcwk9ICEoRkFJTEVERkxBRyk7CisgICAgUkVXSU5EKHN0YXJ0KTsKKyAgICA8QHN0b3AoKT4KKyAgICBCQUNLVFJBQ0tJTkctLTsKKyAgICBGQUlMRURGTEFHCT0gQU5UTFIzX0ZBTFNFOworICAgIHJldHVybiBzdWNjZXNzOworfTxcbj4KKz4+CisKK2xleGVyU3lucHJlZChwcmVkbmFtZSkgOjo9IDw8Cis8c3lucHJlZChwcmVkbmFtZSk+Cis+PgorCitydWxlTWVtb2l6YXRpb24ocm5hbWUpIDo6PSA8PAorPGlmKG1lbW9pemUpPgoraWYgKCAoQkFDS1RSQUNLSU5HPjApICYmIChIQVZFUEFSU0VEUlVMRSg8cnVsZURlc2NyaXB0b3IuaW5kZXg+KSkgKQoreworPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKwlyZXR2YWwuc3RhcnQgPSAwOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICA8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBZnRlcigpPgorICAgIDxmaW5hbENvZGUoZmluYWxCbG9jaz1maW5hbGx5KT4KKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKyAgICA8c2NvcGVDbGVhbigpPjxcbj4KKzxlbmRpZj4KKyAgICByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjsKK30KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdGVzdCBmb3IgZmFpbHVyZSBhbmQgcmV0dXJuIGZyb20gcnVsZSAqLworY2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpIDo6PSA8PAoraWYgIChIQVNFWENFUFRJT04oKSkKK3sKKyAgICBnb3RvIHJ1bGU8cnVsZURlc2NyaXB0b3IubmFtZT5FeDsKK30KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKEhBU0ZBSUxFRCgpKQoreworICAgIDxzY29wZUNsZWFuKCk+CisgICAgPEBkZWJ1Z0NsZWFuKCk+CisgICAgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47Cit9Cis8ZW5kaWY+Cis+PgorCisvKiogVGhpcyBydWxlIGhhcyBmYWlsZWQsIGV4aXQgaW5kaWNhdGluZyBmYWlsdXJlIGR1cmluZyBiYWNrdHJhY2sgKi8KK3J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIChCQUNLVFJBQ0tJTkc+MCkKK3sKKyAgICBGQUlMRURGTEFHID0gPHRydWVfdmFsdWUoKT47CisgICAgPHNjb3BlQ2xlYW4oKT4KKyAgICByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjsKK30KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBydWxlLiAgVGhpcyBpbmNsdWRlcyBhbnkgcmV0dXJuIHR5cGUKKyAqICBkYXRhIGFnZ3JlZ2F0ZXMgcmVxdWlyZWQgZm9yIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCisgKi8KK3J1bGUocnVsZU5hbWUscnVsZURlc2NyaXB0b3IsYmxvY2ssZW1wdHlSdWxlLGRlc2NyaXB0aW9uLGV4Y2VwdGlvbnMsZmluYWxseSxtZW1vaXplKSA6Oj0gPDwKKy8qKgorICogJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KKyAqIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorICovCitzdGF0aWMgPHJldHVyblR5cGUoKT4KKzxydWxlTmFtZT4ocDxuYW1lPiBjdHg8aWYocnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUpPiwgPGVuZGlmPjxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPikKK3sKKyAgICA8aWYodHJhY2UpPkFOVExSM19QUklOVEYoImVudGVyIDxydWxlTmFtZT4gJXMgZmFpbGVkPSVkLCBiYWNrdHJhY2tpbmc9JWRcbiIsIExUKDEpLCBCQUNLVFJBQ0tJTkcpOzxlbmRpZj4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmRlY2xhcmF0aW9ucz4KKyAgICA8cnVsZUxhYmVsRGVmcygpPgorICAgIDxydWxlSW5pdGlhbGl6YXRpb25zKCk+CisgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKyAgICA8cnVsZU1lbW9pemF0aW9uKHJuYW1lPXJ1bGVOYW1lKT4KKyAgICA8cnVsZUxhYmVsSW5pdGlhbGl6YXRpb25zKCk+CisgICAgPEBwcmVhbWJsZSgpPgorICAgIHsKKyAgICAgICAgPGJsb2NrPgorICAgIH0KKworICAgIDxydWxlQ2xlYW5VcCgpPgorPGlmKGV4Y2VwdGlvbnMpPgorICAgIGlmCShIQVNFWENFUFRJT04oKSkKKyAgICB7CisJPGV4Y2VwdGlvbnM6e2V8PGNhdGNoKGRlY2w9ZS5kZWNsLGFjdGlvbj1lLmFjdGlvbik+PFxuPn0+CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWZ0ZXIoKT4KKyAgICB9Cis8ZWxzZT4KKyAgICA8aWYoIWVtcHR5UnVsZSk+CisgICAgICAgIDxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoKT4KKyAgICAgICAgICAgIDxhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoPgorICAgICAgICA8ZWxzZT4KKyAgICAgICAgICAgIGlmIChIQVNFWENFUFRJT04oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUkVQT1JURVJST1IoKTsKKyAgICAgICAgICAgICAgICBQUkVDT1ZFUigpOworICAgICAgICAgICAgICAgIDxAc2V0RXJyb3JSZXR1cm5WYWx1ZSgpPgorICAgICAgICAgICAgfQorICAgICAgICAgICAgPGlmKHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpPgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FmdGVyKCk+CisgICAgICAgICAgICB9PFxuPgorICAgICAgICAgICAgPGVuZGlmPgorICAgICAgICA8ZW5kaWY+CisgICAgPGVuZGlmPgorPGVuZGlmPgorCisgICAgPGlmKHRyYWNlKT5BTlRMUjNfUFJJTlRGKCJleGl0IDxydWxlTmFtZT4gJWQgZmFpbGVkPSVzIGJhY2t0cmFja2luZz0lc1xuIiwgTFQoMSksIGZhaWxlZCwgQkFDS1RSQUNLSU5HKTs8ZW5kaWY+CisgICAgPG1lbW9pemUoKT4KKzxpZihmaW5hbGx5KT4KKyAgICA8ZmluYWxDb2RlKGZpbmFsQmxvY2s9ZmluYWxseSk+Cis8ZW5kaWY+CisgICAgPHNjb3BlQ2xlYW4oKT4KKyAgICA8QHBvc3RhbWJsZSgpPgorICAgIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OworfQorLyogJEFOVExSIGVuZCA8cnVsZU5hbWU+ICovCis+PgorCitmaW5hbENvZGUoZmluYWxCbG9jaykgOjo9IDw8Cit7CisgICAgPGZpbmFsQmxvY2s+Cit9CisKKz4+CisKK2NhdGNoKGRlY2wsYWN0aW9uKSA6Oj0gPDwKKy8qIGNhdGNoKGRlY2wsYWN0aW9uKQorICovCit7CisgICAgPGUuYWN0aW9uPgorfQorCis+PgorCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJldHVyblR5cGUoKT4gcmV0dmFsOzxcbj4KKzxlbHNlPgorPHJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlLmF0dHJpYnV0ZXM6eyBhIHwKKzxhLnR5cGU+IDxhLm5hbWU+OworfT4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KK0FOVExSM19VSU5UMzIgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXg7Cis8ZW5kaWY+Cis+PgorCitydWxlSW5pdGlhbGl6YXRpb25zKCkgOjo9IDw8CisvKiBJbml0aWFsaXplIHJ1bGUgdmFyaWFibGVzCisgKi8KKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlczp7IGEgfAorPGlmKGEuaW5pdFZhbHVlKT5yZXR2YWwuPGEubmFtZT4gPSA8YS5pbml0VmFsdWU+OzxlbmRpZj4KK30+Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8Cis8aWYoYS5pbml0VmFsdWUpPjxhLm5hbWU+ID0gPGEuaW5pdFZhbHVlPjs8ZW5kaWY+Cit9PgorPGVuZGlmPgorPGlmKG1lbW9pemUpPgorPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSBJTkRFWCgpOzxcbj4KKzxlbmRpZj4KKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6e2l0IHw8c2NvcGVUb3AoaXQpPiA9IDxzY29wZVB1c2goaXQpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6e2l0IHw8c2NvcGVUb3AoaXQubmFtZSk+ID0gPHNjb3BlUHVzaChpdC5uYW1lKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsc10KKyAgICA6e2l0IHw8bGFiZWxUeXBlPiAgICA8aXQubGFiZWwudGV4dD47fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDp7aXQgfHBBTlRMUjNfVkVDVE9SICAgIGxpc3RfPGl0LmxhYmVsLnRleHQ+O307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHMscnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOnJ1bGVMYWJlbERlZigpOyBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworcnVsZUxhYmVsSW5pdGlhbGl6YXRpb25zKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsc10KKyAgICA6e2l0IHw8aXQubGFiZWwudGV4dD4gICAgICAgPSBOVUxMO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc10KKyAgICA6e2l0IHxsaXN0XzxpdC5sYWJlbC50ZXh0PiAgICAgPSBOVUxMO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHMscnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOnJ1bGVMYWJlbEluaXRWYWwoKTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+CityZXR2YWwuc3RhcnQgPSBMVCgxKTsgcmV0dmFsLnN0b3AgPSByZXR2YWwuc3RhcnQ7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworbGV4ZXJSdWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLAorICBydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHNdCisgICAgOntpdCB8PGxhYmVsVHlwZT4gPGl0LmxhYmVsLnRleHQ+O307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7aXQgfEFOVExSM19VSU5UMzIgPGl0LmxhYmVsLnRleHQ+O307IHNlcGFyYXRvcj0iXG4iPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc10KKyAgICA6e2l0IHxwQU5UTFIzX0lOVF9UUklFIGxpc3RfPGl0LmxhYmVsLnRleHQ+O307IHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCitsZXhlclJ1bGVMYWJlbEluaXQoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6e2l0IHw8aXQubGFiZWwudGV4dD4gPSBOVUxMO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDp7aXQgfGxpc3RfPGl0LmxhYmVsLnRleHQ+ID0gYW50bHIzSW50VHJpZU5ldygzMSk7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKz4+CisKK2xleGVyUnVsZUxhYmVsRnJlZSgpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzXQorICAgIDp7aXQgfDxpdC5sYWJlbC50ZXh0PiA9IE5VTEw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOntpdCB8bGlzdF88aXQubGFiZWwudGV4dD4tPmZyZWUobGlzdF88aXQubGFiZWwudGV4dD4pO307IHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCitydWxlUmV0dXJuVmFsdWUoKSA6Oj0gPCUKKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNSZXR1cm5WYWx1ZSk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuTmFtZT4KKzxlbHNlPgorcmV0dmFsCis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCittZW1vaXplKCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggQkFDS1RSQUNLSU5HPjAgKSB7IE1FTU9JWkUoPHJ1bGVEZXNjcmlwdG9yLmluZGV4PiwgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXgpOyB9Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorCisvLyBUaGlzIGlzIHdoZXJlIHJ1bGVzIGNsZWFuIHVwIGFuZCBleGl0CisvLworZ290byBydWxlPHJ1bGVEZXNjcmlwdG9yLm5hbWU+RXg7IC8qIFByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KK3J1bGU8cnVsZURlc2NyaXB0b3IubmFtZT5FeDogOworPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighVFJFRV9QQVJTRVIpPgorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorcmV0dmFsLnN0b3AgPSBMVCgtMSk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworc2NvcGVDbGVhbigpIDo6PSA8PAorPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7aXQgfDxzY29wZVBvcChpdCk+fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdCB8PHNjb3BlUG9wKGl0Lm5hbWUpPn07IHNlcGFyYXRvcj0iXG4iPgorCis+PgorLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHJ1bGUgaW4gdGhlIGxleGVyOyBuYWtlZCBibG9ja3MgYXJlIHVzZWQgZm9yCisgKiAgZnJhZ21lbnQgcnVsZXMsIHdoaWNoIGRvIG5vdCBwcm9kdWNlIHRva2Vucy4KKyAqLworbGV4ZXJSdWxlKHJ1bGVOYW1lLG5ha2VkQmxvY2sscnVsZURlc2NyaXB0b3IsYmxvY2ssbWVtb2l6ZSkgOjo9IDw8CisvLyAgIENvbWVzIGZyb206IDxibG9jay5kZXNjcmlwdGlvbj4KKy8qKiBcYnJpZWYgTGV4ZXIgcnVsZSBnZW5lcmF0ZWQgYnkgQU5UTFIzCisgKgorICogJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KKyAqCisgKiBMb29rcyB0byBtYXRjaCB0aGUgY2hhcmFjdGVycyB0aGUgY29uc3RpdHV0ZSB0aGUgdG9rZW4gPHJ1bGVOYW1lPgorICogZnJvbSB0aGUgYXR0YWNoZWQgaW5wdXQgc3RyZWFtLgorICoKKyAqCisgKiBccmVtYXJrCisgKiAgLSBsZXhlci0+ZXJyb3IgPT0gQU5UTFIzX1RSVUUgaWYgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgKi8KK3N0YXRpYyBBTlRMUjNfSU5MSU5FCit2b2lkIG08cnVsZU5hbWU+KHA8bmFtZT4gY3R4PGlmKHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT4sIDxlbmRpZj48cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pCit7CisJQU5UTFIzX1VJTlQzMglfdHlwZTsKKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmRlY2xhcmF0aW9ucz4KKyAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgPGlmKHRyYWNlKT5TeXN0ZW0ub3V0LnByaW50bG4oImVudGVyIDxydWxlTmFtZT4gJyIrKGNoYXIpTEEoMSkrIicgbGluZT0iK0dFVExJTkUoKSsiOiIrR0VUQ0hBUlBPU0lUSU9OSU5MSU5FKCkrIiBmYWlsZWQ9IitmYWlsZWQrIiBiYWNrdHJhY2tpbmc9IitCQUNLVFJBQ0tJTkcpOzxlbmRpZj4KKworPGlmKG5ha2VkQmxvY2spPgorICAgIDxydWxlTWVtb2l6YXRpb24ocm5hbWU9cnVsZU5hbWUpPgorICAgIDxsZXhlclJ1bGVMYWJlbEluaXQoKT4KKyAgICA8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorCisgICAgPGJsb2NrPjxcbj4KKzxlbHNlPgorICAgIDxydWxlTWVtb2l6YXRpb24ocm5hbWU9cnVsZU5hbWUpPgorICAgIDxsZXhlclJ1bGVMYWJlbEluaXQoKT4KKyAgICBfdHlwZQkgICAgPSA8cnVsZU5hbWU+OworCisgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKworICAgIDxibG9jaz4KKwlMRVhTVEFURS0+dHlwZSA9IF90eXBlOworPGVuZGlmPgorICAgIDxpZih0cmFjZSk+IEFOVExSM19GUFJJTlRGKHN0ZGVyciwgImV4aXQgPHJ1bGVOYW1lPiAnJWMnIGxpbmU9JWQ6JWQgZmFpbGVkID0gJWQsIGJhY2t0cmFja2luZyA9JWRcbiIsTEEoMSksR0VUTElORSgpLEdFVENIQVJQT1NJVElPTklOTElORSgpLGZhaWxlZCxCQUNLVFJBQ0tJTkcpOzxlbmRpZj4KKyAgICA8cnVsZUNsZWFuVXAoKT4KKyAgICA8bGV4ZXJSdWxlTGFiZWxGcmVlKCk+CisgICAgPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWZ0ZXIoKT4KKyAgICA8bWVtb2l6ZT4KK30KKy8vICRBTlRMUiBlbmQgPHJ1bGVOYW1lPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgaW1wbGljaXRseS1kZWZpbmVkIGxleGVyIGdyYW1tYXIgcnVsZQorICogIHRoYXQgY2hvb3NlcyBiZXR3ZWVuIGxleGVyIHJ1bGVzLgorICovCit0b2tlbnNSdWxlKHJ1bGVOYW1lLG5ha2VkQmxvY2ssYXJncyxibG9jayxydWxlRGVzY3JpcHRvcikgOjo9IDw8CisvKiogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgaW4gdG8gdGhlIGxleGVyIGZyb20gYW4gb2JqZWN0IHRoYXQKKyAqICB3YW50cyB0byBnZW5lcmF0ZSB0aGUgbmV4dCB0b2tlbiwgc3VjaCBhcyBhIHBDT01NT05fVE9LRU5fU1RSRUFNCisgKi8KK3N0YXRpYyB2b2lkCittVG9rZW5zKHA8bmFtZT4gY3R4KQoreworICAgIDxibG9jaz48XG4+CisKKyAgICBnb3RvIHJ1bGVUb2tlbnNFeDsgLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyAqLworcnVsZVRva2Vuc0V4OiA7Cit9Cis+PgorCisvLyBTIFUgQiBSIFUgTCBFIFMKKworLyoqIEEgKC4uLikgc3VicnVsZSB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworYmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorCisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKyAgICBpbnQgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKyAgICA8ZGVjbHM+CisgICAgPEBwcmVkZWNpc2lvbigpPgorICAgIDxkZWNpc2lvbj4KKyAgICA8QHBvc3RkZWNpc2lvbigpPgorICAgIDxAcHJlYnJhbmNoKCk+CisgICAgc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KQorICAgIHsKKwk8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KKyAgICB9CisgICAgPEBwb3N0YnJhbmNoKCk+Cit9Cis+PgorCisvKiogQSBydWxlIGJsb2NrIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRpdmVzICovCitydWxlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAoreworICAgIC8vICA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKworICAgIEFOVExSM19VSU5UMzIgYWx0PGRlY2lzaW9uTnVtYmVyPjsKKworICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47CisKKyAgICA8ZGVjbHM+CisgICAgPEBwcmVkZWNpc2lvbigpPgorICAgIDxkZWNpc2lvbj4KKyAgICA8QHBvc3RkZWNpc2lvbigpPgorICAgIHN3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikKKyAgICB7CisJPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLGEpPn0+CisgICAgfQorfQorPj4KKworcnVsZUJsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSBzcGVjaWFsIGNhc2Ugb2YgYSAoLi4uKSBzdWJydWxlIHdpdGggYSBzaW5nbGUgYWx0ZXJuYXRpdmUgKi8KK2Jsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSAoLi4pKyBibG9jayB3aXRoIDEgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworICAgIGludCBjbnQ8ZGVjaXNpb25OdW1iZXI+PTA7CisgICAgPGRlY2xzPgorICAgIDxAcHJlbG9vcCgpPgorCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGludCBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworCTxAcHJlZGVjaXNpb24oKT4KKwk8ZGVjaXNpb24+CisJPEBwb3N0ZGVjaXNpb24oKT4KKwlzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pCisJeworCSAgICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KKwkgICAgZGVmYXVsdDoKKworCQlpZiAoIGNudDxkZWNpc2lvbk51bWJlcj4gPj0gMSApCisJCXsKKwkJICAgIGdvdG8gbG9vcDxkZWNpc2lvbk51bWJlcj47CisJCX0KKwkJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJCTxlYXJseUV4aXRFeCgpPgorCQk8QGVhcmx5RXhpdEV4Y2VwdGlvbigpPgorCQlnb3RvIHJ1bGU8cnVsZURlc2NyaXB0b3IubmFtZT5FeDsKKwl9CisJY250PGRlY2lzaW9uTnVtYmVyPisrOworICAgIH0KKyAgICBsb29wPGRlY2lzaW9uTnVtYmVyPjogOwkvKiBKdW1wIHRvIGhlcmUgaWYgdGhpcyBydWxlIGRvZXMgbm90IG1hdGNoICovCisgICAgPEBwb3N0bG9vcCgpPgorfQorPj4KKworZWFybHlFeGl0RXgoKSA6Oj0gPDwKKy8qIG1pc21hdGNoZWRTZXRFeCgpCisgKi8KK0NPTlNUUlVDVEVYKCk7CitFWENFUFRJT04tPnR5cGUgPSBBTlRMUjNfRUFSTFlfRVhJVF9FWENFUFRJT047CitFWENFUFRJT04tPm5hbWUgPSAodm9pZCAqKUFOVExSM19FQVJMWV9FWElUX05BTUU7Cis8XG4+Cis+PgorcG9zaXRpdmVDbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisKKy8qKiBBICguLikqIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworY2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKworLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+CisKKzxAcHJlbG9vcCgpPgorZm9yICg7OykKK3sKKyAgICBpbnQgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KQorICAgIHsKKwk8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KKwlkZWZhdWx0OgorCSAgICBnb3RvIGxvb3A8ZGVjaXNpb25OdW1iZXI+OwkvKiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KKwkgICAgYnJlYWs7CisgICAgfQorfQorbG9vcDxkZWNpc2lvbk51bWJlcj46IDsgLyogSnVtcCBvdXQgdG8gaGVyZSBpZiB0aGlzIHJ1bGUgZG9lcyBub3QgbWF0Y2ggKi8KKzxAcG9zdGxvb3AoKT4KKz4+CisKK2Nsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gY2xvc3VyZUJsb2NrCisKKy8qKiBPcHRpb25hbCBibG9ja3MgKHgpPyBhcmUgdHJhbnNsYXRlZCB0byAoeHwpIGJ5IGFudGxyIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24KKyAqICBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBibG9jayB0ZW1wbGF0ZQorICovCitvcHRpb25hbEJsb2NrIDo6PSBibG9jaworCitvcHRpb25hbEJsb2NrU2luZ2xlQWx0IDo6PSBibG9jaworCisvKiogQSBjYXNlIGluIGEgc3dpdGNoIHRoYXQganVtcHMgdG8gYW4gYWx0ZXJuYXRpdmUgZ2l2ZW4gdGhlIGFsdGVybmF0aXZlCisgKiAgbnVtYmVyLiAgQSBERkEgcHJlZGljdHMgdGhlIGFsdGVybmF0aXZlIGFuZCB0aGVuIGEgc2ltcGxlIHN3aXRjaAorICogIGRvZXMgdGhlIGp1bXAgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBtYXRjaGVzIHRoYXQgYWx0ZXJuYXRpdmUuCisgKi8KK2FsdFN3aXRjaENhc2UoYWx0TnVtLGFsdCkgOjo9IDw8CitjYXNlIDxhbHROdW0+OgorICAgIDxAcHJlYWx0KCk+CisgICAgPGFsdD4KKyAgICBicmVhazs8XG4+Cis+PgorCisvKiogQW4gYWx0ZXJuYXRpdmUgaXMganVzdCBhIGxpc3Qgb2YgZWxlbWVudHM7IGF0IG91dGVybW9zdCBsZXZlbCAqLworYWx0KGVsZW1lbnRzLGFsdE51bSxkZXNjcmlwdGlvbixhdXRvQVNULG91dGVyQWx0LHRyZWVMZXZlbCxyZXcpIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit7CisgICAgPEBkZWNsYXJhdGlvbnMoKT4KKyAgICA8QGluaXRpYWxpemF0aW9ucygpPgorICAgIDxlbGVtZW50czplbGVtZW50KCk+CisgICAgPHJldz4KKyAgICA8QGNsZWFudXAoKT4KK30KKz4+CisKKy8vIEUgTCBFIE0gRSBOIFQgUworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvKiogRHVtcCB0aGUgZWxlbWVudHMgb25lIHBlciBsaW5lICovCitlbGVtZW50KGUpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGUuZWw+PFxuPgorPj4KKworLyoqIG1hdGNoIGEgdG9rZW4gb3B0aW9uYWxseSB3aXRoIGEgbGFiZWwgaW4gZnJvbnQgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw+ID0gKDxsYWJlbFR5cGU+KTxlbmRpZj4gTUFUQ0hUKDx0b2tlbj4sICZGT0xMT1dfPHRva2VuPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPUlEICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCitsaXN0TGFiZWwobGFiZWwsZWxlbSkgOjo9IDw8CitpZiAobGlzdF88bGFiZWw+ID09IE5VTEwpCit7CisgICAgbGlzdF88bGFiZWw+PWN0eC0+dmVjdG9ycy0+bmV3VmVjdG9yKGN0eC0+dmVjdG9ycyk7Cit9CitsaXN0XzxsYWJlbD4tPmFkZChsaXN0XzxsYWJlbD4sIDxlbGVtPiwgTlVMTCk7Cis+PgorCisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciAqLworY2hhclJlZihjaGFyLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gTEEoMSk7PFxuPgorPGVuZGlmPgorTUFUQ0hDKDxjaGFyPik7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIG1hdGNoIGEgY2hhcmFjdGVyIHJhbmdlICovCitjaGFyUmFuZ2VSZWYoYSxiLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gTEEoMSk7PFxuPgorPGVuZGlmPgorTUFUQ0hSQU5HRSg8YT4sIDxiPik7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxwb3N0bWF0Y2hDb2RlPSIiKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8aWYoTEVYRVIpPgorPGxhYmVsPj0gTEEoMSk7PFxuPgorPGVsc2U+Cis8bGFiZWw+PSg8bGFiZWxUeXBlPilMVCgxKTs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+CitpZiAoIDxzPiApCit7CisgICAgQ09OU1VNRSgpOworICAgIDxwb3N0bWF0Y2hDb2RlPgorPGlmKCFMRVhFUik+CisgICAgUEVSUk9SUkVDT1ZFUlk9QU5UTFIzX0ZBTFNFOworPGVuZGlmPgorICAgIDxpZihiYWNrdHJhY2tpbmcpPkZBSUxFREZMQUc9QU5UTFIzX0ZBTFNFOzxcbj48ZW5kaWY+Cit9CitlbHNlCit7CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPG1pc21hdGNoZWRTZXRFeCgpPgorICAgIDxAbWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpPgorPGlmKExFWEVSKT4KKyAgICBMUkVDT1ZFUigpOworPGVsc2U+Cis8ISB1c2UgZm9sbG93aW5nIGNvZGUgdG8gbWFrZSBpdCByZWNvdmVyIGlubGluZTsKKyAgICBSRUNPVkVSRlJPTU1JU01BVENIRURTRVQoJkZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKyE+Cis8ZW5kaWY+CisgICAgZ290byBydWxlPHJ1bGVEZXNjcmlwdG9yLm5hbWU+RXg7Cit9PFxuPgorPj4KKworbWlzbWF0Y2hlZFNldEV4KCkgOjo9IDw8CitDT05TVFJVQ1RFWCgpOworRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTUlTTUFUQ0hFRF9TRVRfRVhDRVBUSU9OOworRVhDRVBUSU9OLT5uYW1lICAgICAgICAgPSAodm9pZCAqKUFOVExSM19NSVNNQVRDSEVEX1NFVF9OQU1FOworPGlmKFBBUlNFUik+CitFWENFUFRJT04tPmV4cGVjdGluZ1NldCA9IE5VTEw7Cis8ISB1c2UgZm9sbG93aW5nIGNvZGUgdG8gbWFrZSBpdCByZWNvdmVyIGlubGluZTsKK0VYQ0VQVElPTi0+ZXhwZWN0aW5nU2V0ID0gJkZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+OworIT4KKzxlbmRpZj4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0IDo6PSBtYXRjaFNldAorCittYXRjaFNldEFuZExpc3RMYWJlbChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggYSBzdHJpbmcgbGl0ZXJhbCAqLworbGV4ZXJTdHJpbmdSZWYoc3RyaW5nLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPlN0YXJ0ID0gR0VUQ0hBUklOREVYKCk7CitNQVRDSFMoPHN0cmluZz4pOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxsYWJlbD4gPSBMRVhTVEFURS0+dG9rRmFjdG9yeS0+bmV3VG9rZW4oTEVYU1RBVEUtPnRva0ZhY3RvcnkpOworPGxhYmVsPi0+c2V0VHlwZSg8bGFiZWw+LCBBTlRMUjNfVE9LRU5fSU5WQUxJRCk7Cis8bGFiZWw+LT5zZXRTdGFydEluZGV4KDxsYWJlbD4sIDxsYWJlbD5TdGFydCk7Cis8bGFiZWw+LT5zZXRTdG9wSW5kZXgoPGxhYmVsPiwgR0VUQ0hBUklOREVYKCktMSk7Cis8bGFiZWw+LT5pbnB1dCA9IElOUFVULT50bnN0cmVhbS0+aXN0cmVhbTsKKzxlbHNlPgorTUFUQ0hTKDxzdHJpbmc+KTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGVuZGlmPgorPj4KKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj0oPGxhYmVsVHlwZT4pTFQoMSk7PFxuPgorPGVuZGlmPgorTUFUQ0hBTllUKCk7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKword2lsZGNhcmRBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8d2lsZGNhcmQoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIC4gd2lsZGNhcmQgaW4gbGV4ZXIgKi8KK3dpbGRjYXJkQ2hhcihsYWJlbCwgZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gTEEoMSk7PFxuPgorPGVuZGlmPgorTUFUQ0hBTlkoKTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZENoYXJMaXN0TGFiZWwobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8d2lsZGNhcmRDaGFyKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4gVGhlICdydWxlJyBhcmd1bWVudCB3YXMgdGhlCisgKiAgdGFyZ2V0IHJ1bGUgbmFtZSwgYnV0IG5vdyBpcyB0eXBlIFJ1bGUsIHdob3NlIHRvU3RyaW5nIGlzCisgKiAgc2FtZTogdGhlIHJ1bGUgbmFtZS4gIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlCisgKiAgZGVzY3JpcHRvciBzdHVmZi4KKyAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK0ZPTExPV1BVU0goRk9MTE9XXzxydWxlLm5hbWU+X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4Pik7Cis8aWYobGFiZWwpPjxsYWJlbD49PGVuZGlmPjxpZihzY29wZSk+Y3R4LT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LT48ZW5kaWY+PHJ1bGUubmFtZT4oY3R4PGlmKHNjb3BlKT4tPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT48ZW5kaWY+PGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj4pOzxcbj4KK0ZPTExPV1BPUCgpOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPXIgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogQSBsZXhlciBydWxlIHJlZmVyZW5jZQorICogIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZSB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93CisgKiAgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcyBzYW1lOiB0aGUgcnVsZSBuYW1lLgorICogIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK2xleGVyUnVsZVJlZihydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKy8qIDxkZXNjcmlwdGlvbj4gKi8KKzxpZihsYWJlbCk+Cit7CisgICAgQU5UTFIzX01BUktFUiA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IEdFVENIQVJJTkRFWCgpOworICAgIDxpZihzY29wZSk+Y3R4LT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LT48ZW5kaWY+bTxydWxlLm5hbWU+KGN0eDxpZihzY29wZSk+LT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+PGVuZGlmPiA8aWYoYXJncyk+LCA8ZW5kaWY+PGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7CisgICAgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8bGFiZWw+ID0gTEVYU1RBVEUtPnRva0ZhY3RvcnktPm5ld1Rva2VuKExFWFNUQVRFLT50b2tGYWN0b3J5KTsKKyAgICA8bGFiZWw+LT5zZXRUeXBlKDxsYWJlbD4sIEFOVExSM19UT0tFTl9JTlZBTElEKTsKKyAgICA8bGFiZWw+LT5zZXRTdGFydEluZGV4KDxsYWJlbD4sIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+KTsKKyAgICA8bGFiZWw+LT5zZXRTdG9wSW5kZXgoPGxhYmVsPiwgR0VUQ0hBUklOREVYKCktMSk7CisgICAgPGxhYmVsPi0+aW5wdXQgPSBJTlBVVDsKK30KKzxlbHNlPgorPGlmKHNjb3BlKT5jdHgtPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4tPjxlbmRpZj5tPHJ1bGUubmFtZT4oY3R4PGlmKHNjb3BlKT4tPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT48ZW5kaWY+IDxpZihhcmdzKT4sIDxlbmRpZj48YXJnczsgc2VwYXJhdG9yPSIsICI+KTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogaSs9SU5UIGluIGxleGVyICovCitsZXhlclJ1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSkgOjo9IDw8Cis8bGV4ZXJSdWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBFT0YgaW4gdGhlIGxleGVyICovCitsZXhlck1hdGNoRU9GKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgoreworICAgIEFOVExSM19VSU5UMzIgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD47CisgICAgPGxhYmVsVHlwZT4gPGxhYmVsPjsKKyAgICA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IEdFVENIQVJJTkRFWCgpOworICAgIE1BVENIQyhBTlRMUjNfQ0hBUlNUUkVBTV9FT0YpOworICAgIDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGxhYmVsPiA9IExFWFNUQVRFLT50b2tGYWN0b3J5LT5uZXdUb2tlbihMRVhTVEFURS0+dG9rRmFjdG9yeSk7CisgICAgPGxhYmVsPi0+c2V0VHlwZSg8bGFiZWw+LCBBTlRMUjNfVE9LRU5fRU9GKTsKKyAgICA8bGFiZWw+LT5zZXRTdGFydEluZGV4KDxsYWJlbD4sIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+KTsKKyAgICA8bGFiZWw+LT5zZXRTdG9wSW5kZXgoPGxhYmVsPiwgR0VUQ0hBUklOREVYKCktMSk7CisgICAgPGxhYmVsPi0+aW5wdXQgPSBJTlBVVC0+dG5zdHJlYW0tPmlzdHJlYW07Cit9Cis8ZWxzZT4KKyAgICBNQVRDSEMoQU5UTFIzX0NIQVJTVFJFQU1fRU9GKTsKKyAgICA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxlbmRpZj4KKz4+CisKKy8vIHVzZWQgZm9yIGxlZnQtcmVjdXJzaXZlIHJ1bGVzCityZWNSdWxlRGVmQXJnKCkgICAgICAgICAgICAgICAgICAgICAgIDo6PSAiaW50IDxyZWNSdWxlQXJnKCk+IgorcmVjUnVsZUFyZygpICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIl9wIgorcmVjUnVsZUFsdFByZWRpY2F0ZShydWxlTmFtZSxvcFByZWMpICA6Oj0gIjxyZWNSdWxlQXJnKCk+IFw8PSA8b3BQcmVjPiIKK3JlY1J1bGVTZXRSZXN1bHRBY3Rpb24oKSAgICAgICAgICAgICAgOjo9ICJyb290XzA9JDxydWxlTmFtZT5fcHJpbWFyeS50cmVlOyIKK3JlY1J1bGVTZXRSZXR1cm5BY3Rpb24oc3JjLG5hbWUpICAgICAgOjo9ICIkPG5hbWU+PSQ8c3JjPi48bmFtZT47IgorCisvKiogbWF0Y2ggXihyb290IGNoaWxkcmVuKSBpbiB0cmVlIHBhcnNlciAqLwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxyb290OmVsZW1lbnQoKT4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIExBKDEpPT1BTlRMUjNfVE9LRU5fRE9XTiApIHsKKyAgICBNQVRDSFQoQU5UTFIzX1RPS0VOX0RPV04sIE5VTEwpOworICAgIDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBNQVRDSFQoQU5UTFIzX1RPS0VOX1VQLCBOVUxMKTsKKyAgICA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CitNQVRDSFQoQU5UTFIzX1RPS0VOX0RPV04sIE5VTEwpOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxjaGlsZHJlbjplbGVtZW50KCk+CitNQVRDSFQoQU5UTFIzX1RPS0VOX1VQLCBOVUxMKTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogRXZlcnkgcHJlZGljYXRlIGlzIHVzZWQgYXMgYSB2YWxpZGF0aW5nIHByZWRpY2F0ZSAoZXZlbiB3aGVuIGl0IGlzCisgKiAgYWxzbyBob2lzdGVkIGludG8gYSBwcmVkaWN0aW9uIGV4cHJlc3Npb24pLgorICovCit2YWxpZGF0ZVNlbWFudGljUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAoraWYgKCAhKDxldmFsUHJlZGljYXRlKC4uLik+KSApCit7CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPG5ld0ZQRSguLi4pPgorfQorPj4KKworbmV3RlBFKCkgOjo9IDw8CisgICAgQ09OU1RSVUNURVgoKTsKKyAgICBFWENFUFRJT04tPnR5cGUgICAgICAgICA9IEFOVExSM19GQUlMRURfUFJFRElDQVRFX0VYQ0VQVElPTjsKKyAgICBFWENFUFRJT04tPm1lc3NhZ2UgICAgICA9ICh2b2lkICopIjxkZXNjcmlwdGlvbj4iOworICAgIEVYQ0VQVElPTi0+cnVsZU5hbWUJID0gKHZvaWQgKikiPHJ1bGVOYW1lPiI7CisgICAgPFxuPgorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKGlmLXRoZW4tZWxzZSkKKworZGZhU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorCit7CisgICAgaW50IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gTEEoPGs+KTsKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+CisgICAgZWxzZQorICAgIHsKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKzxlbHNlPgorICAgICAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKworICAgICAgICA8bmV3TlZFeGNlcHRpb24oKT4KKyAgICAgICAgZ290byBydWxlPHJ1bGVEZXNjcmlwdG9yLm5hbWU+RXg7CisKKzxlbmRpZj4KKyAgICB9Cit9Cis+PgorCituZXdOVkV4Y2VwdGlvbigpIDo6PSA8PAorQ09OU1RSVUNURVgoKTsKK0VYQ0VQVElPTi0+dHlwZSAgICAgICAgID0gQU5UTFIzX05PX1ZJQUJMRV9BTFRfRVhDRVBUSU9OOworRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSI8ZGVzY3JpcHRpb24+IjsKK0VYQ0VQVElPTi0+ZGVjaXNpb25OdW0gID0gPGRlY2lzaW9uTnVtYmVyPjsKK0VYQ0VQVElPTi0+c3RhdGUgICAgICAgID0gPHN0YXRlTnVtYmVyPjsKKzxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKzxcbj4KKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lIGxvb2thaGVhZAorICogIGZvciB0aGUgYnlwYXNzIGFsdGVybmF0aXZlLiAgSXQgZGVsYXlzIGVycm9yIGRldGVjdGlvbiBidXQgdGhpcworICogIGlzIGZhc3Rlciwgc21hbGxlciwgYW5kIG1vcmUgd2hhdCBwZW9wbGUgZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlCisgKiAgZXhwZWN0ICJpZiAoIExBKDEpPT1YICkgbWF0Y2goWCk7IiBhbmQgdGhhdCdzIGl0LgorICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAoreworICAgIGludCBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IExBKDxrPik7CisgICAgPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorfQorPj4KKworLyoqIEEgREZBIHN0YXRlIHRoYXQgaXMgYWN0dWFsbHkgdGhlIGxvb3BiYWNrIGRlY2lzaW9uIG9mIGEgY2xvc3VyZQorICogIGxvb3AuICBJZiBlbmQtb2YtdG9rZW4gKEVPVCkgcHJlZGljdHMgYW55IG9mIHRoZSB0YXJnZXRzIHRoZW4gaXQKKyAqICBzaG91bGQgYWN0IGxpa2UgYSBkZWZhdWx0IGNsYXVzZSAoaS5lLiwgbm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCkuCisgKiAgVGhpcyBpcyB1c2VkIG9ubHkgaW4gdGhlIGxleGVyIHNvIHRoYXQgZm9yICgnYScpKiBvbiB0aGUgZW5kIG9mIGEgcnVsZQorICogIGFueXRoaW5nIG90aGVyIHRoYW4gJ2EnIHByZWRpY3RzIGV4aXRpbmcuCisgKi8KKworZGZhTG9vcGJhY2tTdGF0ZURlY2xzKCk6Oj0gPDwKK0FOVExSM19VSU5UMzIgICBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPjsKKz4+CitkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3sKKyAgIC8qIGRmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpCisgICAgKi8KKyAgICBpbnQgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBMQSg8az4pOworICAgIDxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj48XG4+CisgICAgPGlmKGVvdFByZWRpY3RzQWx0KT4KKyAgICA8aWYoIWVkZ2VzKT4KKwlhbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD47IDwhIGlmIG5vIGVkZ2VzLCBkb24ndCBnZW4gRUxTRSAhPgorCTxlbHNlPgorICAgIGVsc2UKKyAgICB7CisJYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworICAgIH08XG4+CisgICAgPGVuZGlmPgorICAgIDxlbmRpZj4KK30KKz4+CisKKy8qKiBBbiBhY2NlcHQgc3RhdGUgaW5kaWNhdGVzIGEgdW5pcXVlIGFsdGVybmF0aXZlIGhhcyBiZWVuIHByZWRpY3RlZCAqLworZGZhQWNjZXB0U3RhdGUoYWx0KSA6Oj0gImFsdDxkZWNpc2lvbk51bWJlcj49PGFsdD47IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggPGlmKHByZWRpY2F0ZXMpPig8cHJlZGljYXRlcz4pICYmIDxlbmRpZj4oPGxhYmVsRXhwcj4pKQoreworICAgIDx0YXJnZXRTdGF0ZT4KK30KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChzd2l0Y2ggY2FzZSkKKworLyoqIEEgREZBIHN0YXRlIHdoZXJlIGEgU1dJVENIIG1heSBiZSBnZW5lcmF0ZWQuICBUaGUgY29kZSBnZW5lcmF0b3IKKyAqICBkZWNpZGVzIGlmIHRoaXMgaXMgcG9zc2libGU6IENvZGVHZW5lcmF0b3IuY2FuR2VuZXJhdGVTd2l0Y2goKS4KKyAqLworZGZhU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoICggTEEoPGs+KSApCit7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorCitkZWZhdWx0OgorPGlmKGVvdFByZWRpY3RzQWx0KT4KKyAgICBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD47Cis8ZWxzZT4KKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8bmV3TlZFeGNlcHRpb24oKT4KKyAgICBnb3RvIHJ1bGU8cnVsZURlc2NyaXB0b3IubmFtZT5FeDs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoIExBKDxrPikgKQoreworICAgIDxlZGdlczsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworZGZhTG9vcGJhY2tTdGF0ZVN3aXRjaChrLCBlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoICggTEEoPGs+KSApCit7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPjxcbj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitkZWZhdWx0OgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKyAgICBicmVhazs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhRWRnZVN3aXRjaChsYWJlbHMsIHRhcmdldFN0YXRlKSA6Oj0gPDwKKzxsYWJlbHM6e2l0IHxjYXNlIDxpdD46fTsgc2VwYXJhdG9yPSJcbiI+CisJeworCQk8dGFyZ2V0U3RhdGU+CisJfQorICAgIGJyZWFrOworPj4KKworLy8gQyB5IGMgbCBpIGMgIEQgRiBBCisKKy8qKiBUaGUgY29kZSB0byBpbml0aWF0ZSBleGVjdXRpb24gb2YgYSBjeWNsaWMgREZBOyB0aGlzIGlzIHVzZWQKKyAqICBpbiB0aGUgcnVsZSB0byBwcmVkaWN0IGFuIGFsdCBqdXN0IGxpa2UgdGhlIGZpeGVkIERGQSBjYXNlLgorICogIFRoZSA8bmFtZT4gYXR0cmlidXRlIGlzIGluaGVyaXRlZCB2aWEgdGhlIHBhcnNlciwgbGV4ZXIsIC4uLgorICovCitkZmFEZWNpc2lvbihkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CithbHQ8ZGVjaXNpb25OdW1iZXI+ID0gY2RmYTxkZWNpc2lvbk51bWJlcj4ucHJlZGljdChjdHgsIFJFQ09HTklaRVIsIElTVFJFQU0sICZjZGZhPGRlY2lzaW9uTnVtYmVyPik7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyogRHVtcCBERkEgdGFibGVzIGFzIHN0YXRpYyBpbml0aWFsaXplZCBhcnJheXMgb2Ygc2hvcnRzKDE2IGJpdHMpL2NoYXJhY3RlcnMoOCBiaXRzKQorICogd2hpY2ggYXJlIHRoZW4gdXNlZCB0byBzdGF0aWNhbGx5IGluaXRpYWxpemUgdGhlIGRmYSBzdHJ1Y3R1cmUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlcmUKKyAqIGlzIG5vIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24gd2hhdHNvZXZlciwgb3RoZXIgdGhhbiBhbnl0aGluZyB0aGUgQyBjb21waWxlciBtaWdodAorICogbmVlZCB0byBnZW5lcmF0ZS4gSW4gZ2VuZXJhbCB0aGUgQyBjb21waWxlciB3aWxsIGxheSBvdXQgbWVtb3J5IHN1Y2ggdGhhdCB0aGVyZSBpcyBubworICogcnVudGltZSBjb2RlIHJlcXVpcmVkLgorICovCitjeWNsaWNERkEoZGZhKSA6Oj0gPDwKKy8qKiBTdGF0aWMgZGZhIHN0YXRlIHRhYmxlcyBmb3IgQ3ljbGljIGRmYToKKyAqICAgIDxkZmEuZGVzY3JpcHRpb24+CisgKi8KK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90WzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgeworCTxkZmEuZW90OyB3cmFwPSJcbiIsIHNlcGFyYXRvcj0iLCAiLCBudWxsPSItMSI+CisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mWzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgeworCTxkZmEuZW9mOyB3cmFwPSJcbiIsIHNlcGFyYXRvcj0iLCAiLCBudWxsPSItMSI+CisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluWzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgeworCTxkZmEubWluOyB3cmFwPSJcbiIsIHNlcGFyYXRvcj0iLCAiLCBudWxsPSItMSI+CisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4WzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgeworCTxkZmEubWF4OyB3cmFwPSJcbiIsIHNlcGFyYXRvcj0iLCAiLCBudWxsPSItMSI+CisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0WzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgeworCTxkZmEuYWNjZXB0OyB3cmFwPSJcbiIsIHNlcGFyYXRvcj0iLCAiLCBudWxsPSItMSI+CisgICAgfTsKK3N0YXRpYyBjb25zdCBBTlRMUjNfSU5UMzIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbFs8ZGZhLm51bWJlck9mU3RhdGVzPl0gPQorICAgIHsKKwk8ZGZhLnNwZWNpYWw7IHdyYXA9IlxuIiwgc2VwYXJhdG9yPSIsICIsIG51bGw9Ii0xIj4KKyAgICB9OworCisvKiogVXNlZCB3aGVuIHRoZXJlIGlzIG5vIHRyYW5zaXRpb24gdGFibGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBzdGF0ZSAqLworI2RlZmluZSBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9UX2VtcHR5CSAgICBOVUxMCisKKzxkZmEuZWRnZVRyYW5zaXRpb25DbGFzc01hcC5rZXlzOnsgdGFibGUgfAorc3RhdGljIGNvbnN0IEFOVExSM19JTlQzMiBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9UPGkwPltdID0KKyAgICB7CisJPHRhYmxlOyBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4iLCBudWxsPSItMSI+CisgICAgXH07PFxuPn07IG51bGwgPSAiIj4KKworLyogVHJhbnNpdGlvbiB0YWJsZXMgYXJlIGEgdGFibGUgb2Ygc3ViIHRhYmxlcywgd2l0aCBzb21lIHRhYmxlcworICogcmV1c2VkIGZvciBlZmZpY2llbmN5LgorICovCitzdGF0aWMgY29uc3QgQU5UTFIzX0lOVDMyICogY29uc3QgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbnNbXSA9Cit7CisgICAgPGRmYS50cmFuc2l0aW9uRWRnZVRhYmxlczp7eHJlZnxkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9UPHhyZWY+fTsgc2VwYXJhdG9yPSIsICIsIHdyYXA9IlxuIiwgbnVsbD0iTlVMTCI+Cit9OworCis8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+CitzdGF0aWMgQU5UTFIzX0lOVDMyIGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X3NzdChwPG5hbWU+IGN0eCwgcEFOVExSM19CQVNFX1JFQ09HTklaRVIgcmVjb2duaXplciwgcEFOVExSM19JTlRfU1RSRUFNIGlzLCBwQU5UTFIzX0NZQ0xJQ19ERkEgZGZhLCBBTlRMUjNfSU5UMzIgcykKK3sKKyAgICBBTlRMUjNfSU5UMzIgICAgX3M7CisKKyAgICBfcwkgICAgPSBzOworICAgIHN3aXRjaCAgKHMpCisgICAgeworICAgIDxkZmEuc3BlY2lhbFN0YXRlU1RzOntzdGF0ZSB8CisgICAgY2FzZSA8aTA+OgorCisJPHN0YXRlPn07IHNlcGFyYXRvcj0iXG4iPgorICAgIH0KKzxpZihiYWNrdHJhY2tpbmcpPgorICAgIGlmIChCQUNLVFJBQ0tJTkcgPiAwKQorICAgIHsKKwlGQUlMRURGTEFHID0gQU5UTFIzX1RSVUU7CisJcmV0dXJuCS0xOworICAgIH0KKzxlbmRpZj4KKworICAgIENPTlNUUlVDVEVYKCk7CisgICAgRVhDRVBUSU9OLT50eXBlICAgICAgICAgPSBBTlRMUjNfTk9fVklBQkxFX0FMVF9FWENFUFRJT047CisgICAgRVhDRVBUSU9OLT5tZXNzYWdlICAgICAgPSAodm9pZCAqKSI8ZGZhLmRlc2NyaXB0aW9uPiI7CisgICAgRVhDRVBUSU9OLT5kZWNpc2lvbk51bSAgPSA8ZGZhLmRlY2lzaW9uTnVtYmVyPjsKKyAgICBFWENFUFRJT04tPnN0YXRlICAgICAgICA9IF9zOworICAgIDxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKyAgICByZXR1cm4gLTE7Cit9Cis8ZW5kaWY+CisKKzxAZXJyb3JNZXRob2QoKT4KKworLyogRGVjbGFyZSB0cmFja2luZyBzdHJ1Y3R1cmUgZm9yIEN5Y2xpYyBERkEgPGRmYS5kZWNpc2lvbk51bWJlcj4KKyAqLworc3RhdGljCitBTlRMUjNfQ1lDTElDX0RGQSBjZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4KKyAgICA9CXsKKwkgICAgPGRmYS5kZWNpc2lvbk51bWJlcj4sCQkgICAgLyogRGVjaXNpb24gbnVtYmVyIG9mIHRoaXMgZGZhCSAgICAqLworCSAgICAvKiBXaGljaCBkZWNpc2lvbiB0aGlzIHJlcHJlc2VudHM6ICAgKi8KKwkgICAgKGNvbnN0IHBBTlRMUjNfVUNIQVIpIjxkZmEuZGVzY3JpcHRpb24+IiwKKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKwkgICAgKENERkFfU1BFQ0lBTF9GVU5DKSBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zc3QsCis8ZWxzZT4KKwkgICAgKENERkFfU1BFQ0lBTF9GVU5DKSBhbnRscjNkZmFzcGVjaWFsU3RhdGVUcmFuc2l0aW9uLAkvKiBEZWZhdWx0IHNwZWNpYWwgc3RhdGUgdHJhbnNpdGlvbiBmdW5jdGlvbgkqLworPGVuZGlmPgorCisJICAgIGFudGxyM2RmYXNwZWNpYWxUcmFuc2l0aW9uLAkJLyogREZBIHNwZWNpYWxUcmFuc2l0aW9uIGlzIGN1cnJlbnRseSBqdXN0IGEgZGVmYXVsdCBmdW5jdGlvbiBpbiB0aGUgcnVudGltZSAqLworCSAgICBhbnRscjNkZmFwcmVkaWN0LAkJCS8qIERGQSBzaW11bGF0b3IgZnVuY3Rpb24gaXMgaW4gdGhlIHJ1bnRpbWUgKi8KKwkgICAgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90LAkgICAgLyogRU9UIHRhYmxlCQkJICAgICovCisJICAgIGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZiwJICAgIC8qIEVPRiB0YWJsZQkJCSAgICAqLworCSAgICBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW4sCSAgICAvKiBNaW5pbXVtIHRva2VucyBmb3IgZWFjaCBzdGF0ZSAgICAqLworCSAgICBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9tYXgsCSAgICAvKiBNYXhpbXVtIHRva2VucyBmb3IgZWFjaCBzdGF0ZSAgICAqLworCSAgICBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQsCS8qIEFjY2VwdCB0YWJsZQkJCSAgICAqLworCSAgICBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsLAkvKiBTcGVjaWFsIHRyYW5zaXRpb24gc3RhdGVzCSAgICAqLworCSAgICBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9ucwkvKiBUYWJsZSBvZiB0cmFuc2l0aW9uIHRhYmxlcwkgICAgKi8KKworCX07CisvKiBFbmQgb2YgQ3ljbGljIERGQSA8ZGZhLmRlY2lzaW9uTnVtYmVyPgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKz4+CisKKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAoreworICAgIEFOVExSM19VSU5UMzIgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj47PFxuPgorICAgIEFOVExSM19NQVJLRVIgaW5kZXg8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj47PFxuPgorCisJTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBMQSgxKTs8XG4+CisgICAgPGlmKHNlbVByZWRTdGF0ZSk+IDwhIGdldCBuZXh0IGxvb2thaGVhZCBzeW1ib2wgdG8gdGVzdCBlZGdlcywgdGhlbiByZXdpbmQgIT4KKyAgICBpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IElOREVYKCk7PFxuPgorICAgIFJFV0lORExBU1QoKTs8XG4+CisgICAgPGVuZGlmPgorICAgIHMgPSAtMTsKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+CisJPGlmKHNlbVByZWRTdGF0ZSk+IDwhIHJldHVybiBpbnB1dCBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIHdlIHJld291bmQgIT4KKwlTRUVLKGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+KTs8XG4+CisJPGVuZGlmPgorICAgIGlmICggcz49MCApCisgICAgeworCXJldHVybiBzOworICAgIH0KK30KK2JyZWFrOworPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rYWhlYWQgYW5kIGluZGljYXRlIHdoYXQKKyAqICBzdGF0ZSB0byBqdW1wIHRvIG5leHQgaWYgc3VjY2Vzc2Z1bC4KKyAqLworY3ljbGljREZBRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlTnVtYmVyLCBlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggPGlmKHByZWRpY2F0ZXMpPig8cHJlZGljYXRlcz4pICYmIDxlbmRpZj4oPGxhYmVsRXhwcj4pICkKK3sKKyAgICBzID0gPHRhcmdldFN0YXRlTnVtYmVyPjsKK308XG4+Cis+PgorCisvKiogQW4gZWRnZSBwb2ludGluZyBhdCBlbmQtb2YtdG9rZW47IGVzc2VudGlhbGx5IG1hdGNoZXMgYW55IGNoYXI7CisgKiAgYWx3YXlzIGp1bXAgdG8gdGhlIHRhcmdldC4KKyAqLworZW90REZBRWRnZSh0YXJnZXRTdGF0ZU51bWJlcixlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKKyBzID0gPHRhcmdldFN0YXRlTnVtYmVyPjs8XG4+Cis+PgorCisKKy8vIEQgRiBBICBFIFggUCBSIEUgUyBTIEkgTyBOIFMKKworYW5kUHJlZGljYXRlcyhsZWZ0LHJpZ2h0KSA6Oj0gIiggKDxsZWZ0PikgJiYgKDxyaWdodD4pICkiCisKK29yUHJlZGljYXRlcyhvcGVyYW5kcykgOjo9ICIoKDxmaXJzdChvcGVyYW5kcyk+KTxyZXN0KG9wZXJhbmRzKTp7byB8IHx8KDxvPil9PikiCisKK25vdFByZWRpY2F0ZShwcmVkKSA6Oj0gIiEoIDxldmFsUHJlZGljYXRlKHByZWQse30pPiApIgorCitldmFsUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiKDxwcmVkPikiCisKK2V2YWxTeW5QcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICI8cHJlZD4oY3R4KSIKKworbG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gIkxBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID09IDxhdG9tPiIKKworLyoqIFNvbWV0aW1lcyBhIGxvb2thaGVhZCB0ZXN0IGNhbm5vdCBhc3N1bWUgdGhhdCBMQShrKSBpcyBpbiBhIHRlbXAgdmFyaWFibGUKKyAqICBzb21ld2hlcmUuICBNdXN0IGFzayBmb3IgdGhlIGxvb2thaGVhZCBkaXJlY3RseS4KKyAqLworaXNvbGF0ZWRMb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiTEEoPGs+KSA9PSA8YXRvbT4iCisKK2xvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9IDwlCisoKExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID49IDxsb3dlcj4pICYmIChMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiBcPD0gPHVwcGVyPikpCislPgorCitpc29sYXRlZExvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9ICIoKExBKDxrPikgPj0gPGxvd2VyPikgJiYgKExBKDxrPikgXDw9IDx1cHBlcj4pKSIKKworc2V0VGVzdChyYW5nZXMpIDo6PSAiPHJhbmdlczsgc2VwYXJhdG9yPVwiIHx8IFwiPiIKKworLy8gQSBUIFQgUiBJIEIgVSBUIEUgUworCittYWtlU2NvcGVTZXQoKSA6Oj0gPDwKKy8qIG1ha2VTY29wZVNldCgpCisgKi8KKyAvKiogRGVmaW5pdGlvbiBvZiB0aGUgPHNjb3BlLm5hbWU+IHNjb3BlIHZhcmlhYmxlIHRyYWNraW5nCisgKiAgc3RydWN0dXJlLiBBbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcKKyAqICA8bmFtZT5fPHNjb3BlLm5hbWU+UHVzaCgpLgorICovCit0eXBlZGVmIHN0cnVjdCAgPHNjb3BlU3RydWN0KHNuYW1lPXNjb3BlLm5hbWUsLi4uKT5fc3RydWN0Cit7CisgICAgLyoqIEZ1bmN0aW9uIHRoYXQgdGhlIHVzZXIgbWF5IHByb3ZpZGUgdG8gYmUgY2FsbGVkIHdoZW4gdGhlCisgICAgICogIHNjb3BlIGlzIGRlc3Ryb3llZCAoc28geW91IGNhbiBmcmVlIHBBTlRMUjNfSEFTSF9UQUJMRVMgYW5kIHNvIG9uKQorICAgICAqCisgICAgICogXHBhcmFtIFBPaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlZGVmL3N0cnVjdAorICAgICAqLworICAgIHZvaWQgICAgKEFOVExSM19DREVDTCAqZnJlZSkJKHN0cnVjdCA8c2NvcGVTdHJ1Y3Qoc25hbWU9c2NvcGUubmFtZSwuLi4pPl9zdHJ1Y3QgKiBmcmFtZSk7CisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFByb2dyYW1tZXIgZGVmaW5lZCB2YXJpYWJsZXMuLi4KKyAgICAgKi8KKyAgICA8c2NvcGUuYXR0cmlidXRlczp7aXQgfDxpdC5kZWNsPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworICAgIC8qIEVuZCBvZiBwcm9ncmFtbWVyIGRlZmluZWQgdmFyaWFibGVzCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKi8KK30KKyAgICA8c2NvcGVTdHJ1Y3Qoc25hbWU9c2NvcGUubmFtZSwuLi4pPiwgKiA8c2NvcGVUeXBlKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT47CisKKz4+CisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlRGVjbChzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+CisvKiBnbG9iYWxBdHRyaWJ1dGVTY29wZURlY2woc2NvcGUpCisgKi8KKzxtYWtlU2NvcGVTZXQoLi4uKT4KKzxlbmRpZj4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZURlY2woc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogcnVsZUF0dHJpYnV0ZVNjb3BlRGVjbChzY29wZSkKKyAqLworPG1ha2VTY29wZVNldCguLi4pPgorPGVuZGlmPgorPj4KKworZ2xvYmFsQXR0cmlidXRlU2NvcGVGdW5jRGVjbChzY29wZSkgOjo9Cis8PAorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVGdW5jRGVjbChzY29wZSkKKyAqLworPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvciBjcmVhdGluZyBhIDxuYW1lPl88c2NvcGUubmFtZT4gc2NvcGUgc2V0CisgKi8KK3N0YXRpYyA8c2NvcGVUeXBlKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4gICA8c2NvcGVQdXNoTmFtZShzbmFtZT1zY29wZS5uYW1lLC4uLik+KHA8bmFtZT4gY3R4KTsKK3N0YXRpYyB2b2lkIEFOVExSM19DREVDTCA8c2NvcGUubmFtZT5GcmVlKDxzY29wZVR5cGUoc25hbWU9c2NvcGUubmFtZSk+IHNjb3BlKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKzxlbmRpZj4KKz4+CisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlRnVuY01hY3JvKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlRnVuY01hY3JvKHNjb3BlKQorICovCisvKiogRnVuY3Rpb24gIGZvciBwb3BwaW5nIHRoZSB0b3AgdmFsdWUgZnJvbSBhIDxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUpPgorICovCit2b2lkCis8c2NvcGVQb3BOYW1lKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4ocDxuYW1lPiBjdHgpCit7CisgICAgLy8gRmlyc3Qgc2VlIGlmIHRoZSB1c2VyIGRlZmluZWQgYSBmdW5jdGlvbiB0aGV5IHdhbnQgdG8gYmUgY2FsbGVkIHdoZW4gYQorICAgIC8vIHNjb3BlIGlzIHBvcHBlZC9mcmVlZC4KKyAgICAvLworCS8vIElmIHRoZSB1c2VyIHN1cHBsaWVkIHRoZSBzY29wZSBlbnRyaWVzIHdpdGggYSBmcmVlIGZ1bmN0aW9uLHRoZW4gY2FsbCBpdCBmaXJzdAorCS8vCisgICAgaWYJKFNDT1BFX1RPUCg8c2NvcGUubmFtZT4pLT5mcmVlICE9IE5VTEwpCisJeworICAgICAgICBTQ09QRV9UT1AoPHNjb3BlLm5hbWU+KS0+ZnJlZShTQ09QRV9UT1AoPHNjb3BlLm5hbWU+KSk7CisJfQorCisgICAgLy8gTm93IHdlIGRlY3JlbWVudCB0aGUgc2NvcGUncyB1cHBlciBsaW1pdCBib3VuZC4gV2UgZG8gbm90IGFjdHVhbGx5IHBvcCB0aGUgc2NvcGUgYXMKKyAgICAvLyB3ZSB3YW50IHRvIHJldXNlIHNjb3BlIGVudHJpZXMgaWYgd2UgZG8gY29udGludW91cyBwdXNoIGFuZCBwb3BzLiBNb3N0IHNjb3BlcyBkb24ndAorICAgIC8vIG5leHQgdG9vIGZhciBzbyB3ZSBkb24ndCB3YW50IHRvIGtlZXAgZnJlZWluZyBhbmQgYWxsb2NhdGluZyB0aGVtCisgICAgLy8KKyAgICBjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT5fbGltaXQtLTsKKyAgICBTQ09QRV9UT1AoPHNjb3BlLm5hbWU+KSA9ICg8c2NvcGVUeXBlKHNuYW1lPXNjb3BlLm5hbWUpPikoY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lLC4uLik+LT5nZXQoY3R4LT48YnNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSwuLi4pPiwgY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lLC4uLik+X2xpbWl0IC0gMSkpOworfQorPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlRnVuY0RlY2woc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogcnVsZUF0dHJpYnV0ZVNjb3BlRnVuY0RlY2woc2NvcGUpCisgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIGNyZWF0aW5nIGEgPG5hbWU+XzxzY29wZS5uYW1lPiBzY29wZSBzZXQKKyAqLworc3RhdGljIDxzY29wZVR5cGUoc25hbWU9c2NvcGUubmFtZSwuLi4pPiAgIDxzY29wZVB1c2hOYW1lKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4ocDxuYW1lPiBjdHgpOworc3RhdGljIHZvaWQgQU5UTFIzX0NERUNMIDxzY29wZS5uYW1lPkZyZWUoPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lKT4gc2NvcGUpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlRnVuY01hY3JvKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHJ1bGVBdHRyaWJ1dGVTY29wZUZ1bmNNYWNybyhzY29wZSkKKyAqLworLyoqIEZ1bmN0aW9uIGZvciBwb3BwaW5nIHRoZSB0b3AgdmFsdWUgZnJvbSBhIDxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4KKyAqLwordm9pZAorPHNjb3BlUG9wTmFtZShzbmFtZT1zY29wZS5uYW1lLC4uLik+KHA8bmFtZT4gY3R4KQoreworICAgIC8vIEZpcnN0IHNlZSBpZiB0aGUgdXNlciBkZWZpbmVkIGEgZnVuY3Rpb24gdGhleSB3YW50IHRvIGJlIGNhbGxlZCB3aGVuIGEKKyAgICAvLyBzY29wZSBpcyBwb3BwZWQvZnJlZWQuCisgICAgLy8KKwkvLyBJZiB0aGUgdXNlciBzdXBwbGllZCB0aGUgc2NvcGUgZW50cmllcyB3aXRoIGEgZnJlZSBmdW5jdGlvbix0aGVuIGNhbGwgaXQgZmlyc3QKKwkvLworICAgIGlmCShTQ09QRV9UT1AoPHNjb3BlLm5hbWU+KS0+ZnJlZSAhPSBOVUxMKQorCXsKKyAgICAgICAgU0NPUEVfVE9QKDxzY29wZS5uYW1lPiktPmZyZWUoU0NPUEVfVE9QKDxzY29wZS5uYW1lPikpOworCX0KKworICAgIC8vIE5vdyB3ZSBkZWNyZW1lbnQgdGhlIHNjb3BlJ3MgdXBwZXIgbGltaXQgYm91bmQuIFdlIGRvIG5vdCBhY3R1YWxseSBwb3AgdGhlIHNjb3BlIGFzCisgICAgLy8gd2Ugd2FudCB0byByZXVzZSBzY29wZSBlbnRyaWVzIGlmIHdlIGRvIGNvbnRpbnVvdXMgcHVzaCBhbmQgcG9wcy4gTW9zdCBzY29wZXMgZG9uJ3QKKyAgICAvLyBuZXh0IHRvbyBmYXIgc28gd2UgZG9uJ3Qgd2FudCB0byBrZWVwIGZyZWVpbmcgYW5kIGFsbG9jYXRpbmcgdGhlbQorICAgIC8vCisgICAgY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lLC4uLik+X2xpbWl0LS07CisgICAgU0NPUEVfVE9QKDxzY29wZS5uYW1lPikgPSAoPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lKT4pKGN0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSwuLi4pPi0+Z2V0KGN0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSwuLi4pPiwgY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lLC4uLik+X2xpbWl0IC0gMSkpOworfQorCis8ZW5kaWY+Cis+PgorCitnbG9iYWxBdHRyaWJ1dGVTY29wZURlZihzY29wZSkgOjo9Cis8PAorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVEZWYoc2NvcGUpCisgKi8KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qKiBQb2ludGVyIHRvIHRoZSAgPHNjb3BlLm5hbWU+IHN0YWNrIGZvciB1c2UgYnkgPHNjb3BlUHVzaE5hbWUoc25hbWU9c2NvcGUubmFtZSk+KCkKKyAqICBhbmQgPHNjb3BlUG9wTmFtZShzbmFtZT1zY29wZS5uYW1lLC4uLik+KCkKKyAqLworcEFOVExSM19TVEFDSyA8c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lKT47CitBTlRMUjNfVUlOVDMyIDxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUpPl9saW1pdDsKKy8qKiBQb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGZvciB0aGUgZ2xvYmFsIHNjb3BlIDxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUpPgorICovCis8c2NvcGVUeXBlKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4gICAgKCo8c2NvcGVQdXNoTmFtZShzbmFtZT1zY29wZS5uYW1lLC4uLik+KShzdHJ1Y3QgPG5hbWU+X0N0eF9zdHJ1Y3QgKiBjdHgpOworPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lLC4uLik+ICAgIDxzY29wZVRvcERlY2woc25hbWU9c2NvcGUubmFtZSwuLi4pPjsKKworPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlRGVmKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHJ1bGVBdHRyaWJ1dGVTY29wZURlZihzY29wZSkKKyAqLworLyoqIFBvaW50ZXIgdG8gdGhlICA8c2NvcGUubmFtZT4gc3RhY2sgZm9yIHVzZSBieSA8c2NvcGVQdXNoTmFtZShzbmFtZT1zY29wZS5uYW1lKT4oKQorICogIGFuZCA8c2NvcGVQb3BOYW1lKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4oKQorICovCitwQU5UTFIzX1NUQUNLIDxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT47CitBTlRMUjNfVUlOVDMyIDxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT5fbGltaXQ7Cis8c2NvcGVUeXBlKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4gICAoKjxzY29wZVB1c2hOYW1lKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4pKHN0cnVjdCA8bmFtZT5fQ3R4X3N0cnVjdCAqIGN0eCk7Cis8c2NvcGVUeXBlKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4gICA8c2NvcGVUb3BEZWNsKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT47CisKKzxlbmRpZj4KKz4+CisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlRnVuY3Moc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVGdW5jcyhzY29wZSkKKyAqLworPGF0dHJpYnV0ZUZ1bmNzKHNjb3BlKT4KKzxlbmRpZj4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZUZ1bmNzKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHJ1bGVBdHRyaWJ1dGVTY29wZUZ1bmNzKHNjb3BlKQorICovCis8YXR0cmlidXRlRnVuY3Moc2NvcGUpPgorPGVuZGlmPgorPj4KKworZ2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGUpCisgKi8KK2N0eC0+PHNjb3BlUHVzaE5hbWUoc25hbWU9c2NvcGUubmFtZSwuLi4pPiAgICAgPSA8c2NvcGVQdXNoTmFtZShzbmFtZT1zY29wZS5uYW1lLC4uLik+OworY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lLC4uLik+ICAgID0gYW50bHIzU3RhY2tOZXcoMCk7CitjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT5fbGltaXQgICAgPSAwOworPHNjb3BlVG9wKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4gICAgICA9IE5VTEw7Cis8ZW5kaWY+Cis+PgorCitydWxlQXR0cmlidXRlU2NvcGUoc2NvcGUpIDo6PQorPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZSkKKyAqLworY3R4LT48c2NvcGVQdXNoTmFtZShzbmFtZT1zY29wZS5uYW1lLC4uLik+ICAgICA9IDxzY29wZVB1c2hOYW1lKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT47CitjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4gICAgPSBhbnRscjNTdGFja05ldygwKTsKK2N0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSwuLi4pPl9saW1pdCAgICA9IDA7Cis8c2NvcGVUb3Aoc25hbWU9c2NvcGUubmFtZSwuLi4pPiAgICAgID0gTlVMTDsKKzxlbmRpZj4KKz4+CitnbG9iYWxBdHRyaWJ1dGVTY29wZUZyZWUoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGUpCisgKi8KK2N0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSwuLi4pPi0+ZnJlZShjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4pOworPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlRnJlZShzY29wZSkgOjo9Cis8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogcnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlKQorICovCitjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUsLi4uKT4tPmZyZWUoY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lLC4uLik+KTsKKzxlbmRpZj4KKz4+CisKK3Njb3BlVG9wRGVjbChzbmFtZSkgOjo9IDw8CitwPG5hbWU+XzxzbmFtZT5Ub3AKKz4+CisKK3Njb3BlVG9wKHNuYW1lKSA6Oj0gPDwKK2N0eC0+PHNjb3BlVG9wRGVjbChzbmFtZT1zbmFtZSwuLi4pPgorPj4KKworc2NvcGVQb3Aoc25hbWUpIDo6PSA8PAorPHNjb3BlUG9wTmFtZShzbmFtZT1zbmFtZSwuLi4pPihjdHgpOworPj4KKworc2NvcGVQdXNoKHNuYW1lKSA6Oj0gPDwKK3A8bmFtZT5fPHNuYW1lPlB1c2goY3R4KQorPj4KKworc2NvcGVQb3BOYW1lKHNuYW1lKSA6Oj0gPDwKK3A8bmFtZT5fPHNuYW1lPlBvcAorPj4KKworc2NvcGVQdXNoTmFtZShzbmFtZSkgOjo9IDw8CitwPG5hbWU+XzxzbmFtZT5QdXNoCis+PgorCitzY29wZVR5cGUoc25hbWUpIDo6PSA8PAorcDxuYW1lPl88c25hbWU+X1NDT1BFCis+PgorCitzY29wZVN0cnVjdChzbmFtZSkgOjo9IDw8Cis8bmFtZT5fPHNuYW1lPl9TQ09QRQorPj4KKworc2NvcGVTdGFjayhzbmFtZSkgOjo9IDw8CitwPG5hbWU+XzxzbmFtZT5TdGFjaworPj4KKworYXR0cmlidXRlRnVuY3Moc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogYXR0cmlidXRlRnVuY3Moc2NvcGUpCisgKi8KKworc3RhdGljIHZvaWQgQU5UTFIzX0NERUNMIDxzY29wZS5uYW1lPkZyZWUoPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lKT4gc2NvcGUpCit7CisgICAgQU5UTFIzX0ZSRUUoc2NvcGUpOworfQorCisvKiogXGJyaWVmIEFsbG9jYXRlIGluaXRpYWwgbWVtb3J5IGZvciBhIDxuYW1lPiA8c2NvcGUubmFtZT4gc2NvcGUgdmFyaWFibGUgc3RhY2sgZW50cnkgYW5kCisgKiAgICAgICAgIGFkZCBpdCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAqCisgKiBccmVtYXJrCisgKiBCeSBkZWZhdWx0IHRoZSBzdHJ1Y3R1cmUgaXMgZnJlZWQgd2l0aCBBTlRMUl9GUkVFKCksIGJ1dCB5b3UgY2FuIHVzZSB0aGUKKyAqIHRoZSBcQGluaXQgYWN0aW9uIHRvIGluc3RhbGwgYSBwb2ludGVyIHRvIGEgY3VzdG9tIGZyZWUoKSByb3V0aW5lIGJ5CisgKiBhZGRpbmcgdGhlIGNvZGU6CisgKiBcY29kZQorICogICA8c2NvcGVUb3Aoc25hbWU9c2NvcGUubmFtZSk+LT5mcmVlID0gbXlyb3V0aW5lOworICogXGVuZGNvZGUKKyAqCisgKiBXaXRoIGxvdHMgb2YgY29tbWVudHMgb2YgY291cnNlISBUaGUgcm91dGluZSBzaG91bGQgYmUgZGVjbGFyZWQgaW4KKyAqIFxAbWVtYmVycyB7IH0gYXM6CisgKiBcY29kZQorICogICB2b2lkIEFOVExSM19DREVDTCBteWZ1bmMoIDxzY29wZVR5cGUoc25hbWU9c2NvcGUubmFtZSk+IHB0cikuCisgKiBcZW5kY29kZQorICoKKyAqIEl0IHNob3VsZCBwZXJmb3JtIGFueSBjdXN0b20gZnJlZWluZyBzdHVmZiB0aGF0IHlvdSBuZWVkIChjYWxsIEFOVExSX0ZSRUUzLCBub3QgZnJlZSgpCisgKiBOQjogSXQgc2hvdWxkIG5vdCBmcmVlIHRoZSBwb2ludGVyIGl0IGlzIGdpdmVuLCB3aGljaCBpcyB0aGUgc2NvcGUgc3RhY2sgZW50cnkgaXRzZWxmCisgKiBhbmQgd2lsbCBiZSBmcmVlZCBieSB0aGUgZnVuY3Rpb24gdGhhdCBjYWxscyB5b3VyIGN1c3RvbSBmcmVlIHJvdXRpbmUuCisgKgorICovCitzdGF0aWMgPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lKT4KKzxzY29wZVB1c2hOYW1lKHNuYW1lPXNjb3BlLm5hbWUpPihwPG5hbWU+IGN0eCkKK3sKKyAgICAvKiBQb2ludGVyIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHNldCBvZiBhdHRyaWJ1dGVzCisgICAgICovCisgICAgPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lKT4gICAgICBuZXdBdHRyaWJ1dGVzOworCisgICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgYSBuZXcgc3RydWN0dXJlIGlmIHdlIG5lZWQgb25lLgorICAgICAqLworICAgIGlmIChjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUpPi0+c2l6ZShjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUpPikgPiBjdHgtPjxzY29wZVN0YWNrKHNuYW1lPXNjb3BlLm5hbWUpPl9saW1pdCkKKyAgICB7CisgICAgICAgIC8vIFRoZSBjdXJyZW50IGxpbWl0IHZhbHVlIHdhcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBzY29wZXMgYXZhaWxhYmxlIG9uIHRoZSBzdGFjayBzbworICAgICAgICAvLyB3ZSBjYW4ganVzdCByZXVzZSBvbmUuIE91ciBsaW1pdCB0cmFja3MgdGhlIHN0YWNrIGNvdW50LCBzbyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IHdlIHdhbnQKKyAgICAgICAgLy8gaXMgb25lIGxlc3MgdGhhbiB0aGF0LCBvciBjb252ZW5pZW50bHksIHRoZSBjdXJyZW50IHZhbHVlIG9mIGxpbWl0LgorICAgICAgICAvLworICAgICAgICBuZXdBdHRyaWJ1dGVzID0gKDxzY29wZVR5cGUoc25hbWU9c2NvcGUubmFtZSk+KWN0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSk+LT5nZXQoY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lKT4sIGN0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSk+X2xpbWl0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gTmVlZCBhIG5ldyBhbGxvY2F0aW9uCisgICAgICAgIC8vCisgICAgICAgIG5ld0F0dHJpYnV0ZXMgPSAoPHNjb3BlVHlwZShzbmFtZT1zY29wZS5uYW1lKT4pIEFOVExSM19NQUxMT0Moc2l6ZW9mKDxzY29wZVN0cnVjdChzbmFtZT1zY29wZS5uYW1lKT4pKTsKKyAgICAgICAgaWYgIChuZXdBdHRyaWJ1dGVzICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN0YW5kYXJkIEFOVExSMyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGN0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSk+LT5wdXNoKGN0eC0+PHNjb3BlU3RhY2soc25hbWU9c2NvcGUubmFtZSk+LCBuZXdBdHRyaWJ1dGVzLCAodm9pZCAoKikodm9pZCAqKSk8c2NvcGUubmFtZT5GcmVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEJsYW5rIG91dCBhbnkgcHJldmlvdXMgZnJlZSBwb2ludGVyLCB0aGUgdXNlciBtaWdodCBvciBtaWdodCBpbnN0YWxsIGEgbmV3IG9uZS4KKyAgICAvLworICAgIG5ld0F0dHJpYnV0ZXMtPmZyZWUgPSBOVUxMOworCisgICAgLy8gSW5kaWNhdGUgdGhlIHBvc2l0aW9uIGluIHRoZSBhdmFpbGFibGUgc3RhY2sgdGhhdCB0aGUgY3VycmVudCBsZXZlbCBpcyBhdAorICAgIC8vCisgICAgY3R4LT48c2NvcGVTdGFjayhzbmFtZT1zY29wZS5uYW1lKT5fbGltaXQrKzsKKworCS8qIFJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IGVudHJ5LCB3aGljaCBtYXkgYmUgdXNlZCBsb2NhbGx5CisJICogd2l0aG91dCBkZS1yZWZlcmVuY2luZyB2aWEgdGhlIGNvbnRleHQuCisgICAgICovCisgICAgcmV0dXJuICBuZXdBdHRyaWJ1dGVzOworfTxcbj4KKworPGVuZGlmPgorPj4KK3JldHVyblN0cnVjdE5hbWUocikgOjo9ICI8ci5uYW1lPl9yZXR1cm4iCisKK3JldHVyblR5cGUoKSA6Oj0gPCUKKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cnVsZURlc2NyaXB0b3IuZ3JhbW1hci5yZWNvZ25pemVyTmFtZT5fPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4KKzxlbHNlPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbHNlPgorQU5UTFIzX0JPT0xFQU4KKzxlbmRpZj4KKyU+CisKKy8qKiBHZW5lcmF0ZSB0aGUgQyB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBvciBtdWx0aXBsZSByZXR1cm4KKyAqICB2YWx1ZShzKS4KKyAqLworcnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZSkgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJlZmVyZW5jZWRSdWxlLmdyYW1tYXIucmVjb2duaXplck5hbWU+XzxyZWZlcmVuY2VkUnVsZS5uYW1lPl9yZXR1cm4KKzxlbHNlPgorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKyU+CisKK2RlbGVnYXRlTmFtZShkKSA6Oj0gPDwKKzxpZihkLmxhYmVsKT48ZC5sYWJlbD48ZWxzZT5nPGQubmFtZT48ZW5kaWY+Cis+PgorCisvKiogVXNpbmcgYSB0eXBlIHRvIGluaXQgdmFsdWUgbWFwLCB0cnkgdG8gaW5pdCBhIHR5cGU7IGlmIG5vdCBpbiB0YWJsZQorICogIG11c3QgYmUgYW4gb2JqZWN0LCBkZWZhdWx0IHZhbHVlIGlzICIwIi4KKyAqLworaW5pdFZhbHVlKHR5cGVOYW1lKSA6Oj0gPDwKKyA9IDxjVHlwZUluaXRNYXAuKHR5cGVOYW1lKT4KKz4+CisKKy8qKiBEZWZpbmUgYSBydWxlIGxhYmVsICAqLworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPDwKKzxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKT4gPGxhYmVsLmxhYmVsLnRleHQ+OworI3VuZGVmCVJFVFVSTl9UWVBFXzxsYWJlbC5sYWJlbC50ZXh0PgorI2RlZmluZQlSRVRVUk5fVFlQRV88bGFiZWwubGFiZWwudGV4dD4gPHJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpPjxcbj4KKz4+CisvKiogIFJ1bGUgbGFiZWwgZGVmYXVsdCB2YWx1ZSAqLworcnVsZUxhYmVsSW5pdFZhbChsYWJlbCkgOjo9IDw8Cis+PgorCitBU1RMYWJlbFR5cGUoKSA6Oj0gIjxpZihyZWNvZ25pemVyLkFTVExhYmVsVHlwZSk+PHJlY29nbml6ZXIuQVNUTGFiZWxUeXBlPjxlbHNlPnBBTlRMUjNfQkFTRV9UUkVFPGVuZGlmPiIKKworLyoqIERlZmluZSBhIHJldHVybiBzdHJ1Y3QgZm9yIGEgcnVsZSBpZiB0aGUgY29kZSBuZWVkcyB0byBhY2Nlc3MgaXRzCisgKiAgc3RhcnQvc3RvcCB0b2tlbnMsIHRyZWUgc3R1ZmYsIGF0dHJpYnV0ZXMsIC4uLiAgTGVhdmUgYSBob2xlIGZvcgorICogIHN1Ymdyb3VwcyB0byBzdGljayBpbiBtZW1iZXJzLgorICovCityZXR1cm5TY29wZShzY29wZSkgOjo9IDw8Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgordHlwZWRlZiBzdHJ1Y3QgPHJ1bGVEZXNjcmlwdG9yLmdyYW1tYXIucmVjb2duaXplck5hbWU+XzxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+X3N0cnVjdAoreworPGlmKCFUUkVFX1BBUlNFUik+CisgICAgLyoqIEdlbmVyaWMgcmV0dXJuIGVsZW1lbnRzIGZvciBBTlRMUjMgcnVsZXMgdGhhdCBhcmUgbm90IGluIHRyZWUgcGFyc2VycyBvciByZXR1cm5pbmcgdHJlZXMKKyAgICAgKi8KKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBzdGFydDsKKyAgICBwQU5UTFIzX0NPTU1PTl9UT0tFTiAgICBzdG9wOworPGVsc2U+CisgICAgPHJlY29nbml6ZXIuQVNUTGFiZWxUeXBlPiAgICAgICBzdGFydDsKKyAgICA8cmVjb2duaXplci5BU1RMYWJlbFR5cGU+ICAgICAgIHN0b3A7Cis8ZW5kaWY+CisgICAgPEBydWxlUmV0dXJuTWVtYmVycygpPgorICAgIDxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOntpdCB8PGl0LnR5cGU+IDxpdC5uYW1lPjt9OyBzZXBhcmF0b3I9IlxuIj4KK30KKyAgICA8cnVsZURlc2NyaXB0b3IuZ3JhbW1hci5yZWNvZ25pemVyTmFtZT5fPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT47PFxuPjxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3BhcmFtZXRlclNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxzY29wZS5hdHRyaWJ1dGVzOntpdCB8PGl0LmRlY2w+fTsgc2VwYXJhdG9yPSIsICI+Cis+PgorCitwYXJhbWV0ZXJBdHRyaWJ1dGVSZWYoYXR0cikgOjo9ICI8YXR0ci5uYW1lPiIKK3BhcmFtZXRlclNldEF0dHJpYnV0ZVJlZihhdHRyLGV4cHIpIDo6PSAiPGF0dHIubmFtZT49PGV4cHI+OyIKKworLyoqIE5vdGUgdGhhdCB0aGUgc2NvcGVBdHRyaWJ1dGVSZWYgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCisgKiBncmFtbWFyIG5hbWUgZGlyZWN0bHkKKyAqLworc2NvcGVBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixpbmRleCxuZWdJbmRleCkgOjo9IDwlCis8aWYobmVnSW5kZXgpPgorCSgoU0NPUEVfVFlQRSg8c2NvcGU+KSkoY3R4LT5TQ09QRV9TVEFDSyg8c2NvcGU+KS0+Z2V0KCBjdHgtPlNDT1BFX1NUQUNLKDxzY29wZT4pLCBjdHgtPlNDT1BFX1NUQUNLKDxzY29wZT4pLT5zaXplKGN0eC0+U0NPUEVfU1RBQ0soPHNjb3BlPikpIC0gPG5lZ0luZGV4PiAtIDEpICkpLT48YXR0ci5uYW1lPgorPGVsc2U+Cis8aWYoaW5kZXgpPgorCSgoU0NPUEVfVFlQRSg8c2NvcGU+KSkoY3R4LT5TQ09QRV9TVEFDSyg8c2NvcGU+KS0+Z2V0KGN0eC0+U0NPUEVfU1RBQ0soPHNjb3BlPiksIChBTlRMUjNfVUlOVDMyKTxpbmRleD4gKSApKS0+PGF0dHIubmFtZT4KKzxlbHNlPgorCShTQ09QRV9UT1AoPHNjb3BlPikpLT48YXR0ci5uYW1lPgorPGVuZGlmPgorPGVuZGlmPgorJT4KKworc2NvcGVTZXRBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixleHByLGluZGV4LG5lZ0luZGV4KSA6Oj0gPCUKKzxpZihuZWdJbmRleCk+CisJKChTQ09QRV9UWVBFKDxzY29wZT4pKShjdHgtPlNDT1BFX1NUQUNLKDxzY29wZT4pLT5nZXQoIGN0eC0+U0NPUEVfU1RBQ0soPHNjb3BlPiksIGN0eC0+U0NPUEVfU1RBQ0soPHNjb3BlPiktPnNpemUoY3R4LT5TQ09QRV9TVEFDSyg8c2NvcGU+KSkgLSA8bmVnSW5kZXg+IC0gMSkgKSktPjxhdHRyLm5hbWU+ID0gPGV4cHI+OworPGVsc2U+Cis8aWYoaW5kZXgpPgorCSgoU0NPUEVfVFlQRSg8c2NvcGU+KSkoY3R4LT5TQ09QRV9TVEFDSyg8c2NvcGU+KS0+Z2V0KGN0eC0+U0NPUEVfU1RBQ0soPHNjb3BlPiksIChBTlRMUjNfVUlOVDMyKTxpbmRleD4gKSApKS0+PGF0dHIubmFtZT4gPSA8ZXhwcj47Cis8ZWxzZT4KKwkoU0NPUEVfVE9QKDxzY29wZT4pKS0+PGF0dHIubmFtZT49PGV4cHI+OworPGVuZGlmPgorPGVuZGlmPgorJT4KKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsgcmVmZXJzCisgKiAgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJlZGljYXRlcworICogIGxpa2UgeyRmdW5jdGlvbi5zaXplKCk+MCAmJiAkZnVuY3Rpb246Om5hbWUuZXF1YWxzKCJmb28iKX0/CisgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gImN0eC0+U0NPUEVfU1RBQ0soPHNjb3BlPikiCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHNjb3BlPi48YXR0ci5uYW1lPgorPGVsc2U+Cis8c2NvcGU+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cikgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKzxhdHRyLm5hbWU+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5TZXRBdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cixleHByKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CityZXR2YWwuPGF0dHIubmFtZT49PGV4cHI+OworPGVsc2U+Cis8YXR0ci5uYW1lPj08ZXhwcj47Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIHRyYW5zbGF0ZSAkdG9rZW5MYWJlbCAqLwordG9rZW5MYWJlbFJlZihsYWJlbCkgOjo9ICI8bGFiZWw+IgorCisvKiogaWRzKz1JRCB7JGlkc30gb3IgZSs9ZXhwciB7JGV9ICovCitsaXN0TGFiZWxSZWYobGFiZWwpIDo6PSAibGlzdF88bGFiZWw+IgorCisKKy8vIG5vdCBzdXJlIHRoZSBuZXh0IGFyZSB0aGUgcmlnaHQgYXBwcm9hY2gKKy8vCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRUZXh0KDxzY29wZT4pKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4tPmdldFR5cGUoPHNjb3BlPikpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPi0+Z2V0TGluZSg8c2NvcGU+KSkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4tPmdldENoYXJQb3NpdGlvbkluTGluZSg8c2NvcGU+KSkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRDaGFubmVsKDxzY29wZT4pKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRUb2tlbkluZGV4KDxzY29wZT4pKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4tPnRyZWUpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRUZXh0KDxzY29wZT4pLT50b0ludDMyKDxzY29wZT4tPmdldFRleHQoPHNjb3BlPikpKSIKKworcnVsZUxhYmVsUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPi5zdGFydCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4uc3RvcCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4udHJlZSkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSA8PAorPGlmKFRSRUVfUEFSU0VSKT4KKyhTVFJTVFJFQU0tPnRvU3RyaW5nU1MoU1RSU1RSRUFNLCA8c2NvcGU+LnN0YXJ0LCA8c2NvcGU+LnN0YXJ0KSkKKzxlbHNlPgorKFNUUlNUUkVBTS0+dG9TdHJpbmdUVChTVFJTVFJFQU0sIDxzY29wZT4uc3RhcnQsIDxzY29wZT4uc3RvcCkpCis8ZW5kaWY+Cis+PgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uc3QiCisKKy8qKiBJc29sYXRlZCAkUlVMRSByZWYgb2sgaW4gbGV4ZXIgYXMgaXQncyBhIFRva2VuICovCitsZXhlclJ1bGVMYWJlbChsYWJlbCkgOjo9ICI8bGFiZWw+IgorCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPi0+Z2V0VHlwZSg8c2NvcGU+KSkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPi0+Z2V0TGluZSg8c2NvcGU+KSkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRDaGFyUG9zaXRpb25JbkxpbmUoPHNjb3BlPikpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4tPmdldENoYW5uZWwoPHNjb3BlPikpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRUb2tlbkluZGV4KDxzY29wZT4pKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+LT5nZXRUZXh0KDxzY29wZT4pKSIKKworLy8gU29tZWJvZHkgbWF5IHJlZiAkdGVtcGxhdGUgb3IgJHRyZWUgb3IgJHN0b3Agd2l0aGluIGEgcnVsZToKK3J1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5zdGFydCIKK3J1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLnN0b3AiCitydWxlUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gInJldHZhbC50cmVlIgorcnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorSU5QVVQtPnRvU3RyaW5nU1MoSU5QVVQsIEFEQVBUT1ItPmdldFRva2VuU3RhcnRJbmRleChBREFQVE9SLCByZXR2YWwuc3RhcnQpLCBBREFQVE9SLT5nZXRUb2tlblN0b3BJbmRleChBREFQVE9SLCByZXR2YWwuc3RhcnQpKQorPGVsc2U+CitTVFJTVFJFQU0tPnRvU3RyaW5nVFQoU1RSU1RSRUFNLCByZXR2YWwuc3RhcnQsIExUKC0xKSkKKzxlbmRpZj4KKz4+CitydWxlUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICJyZXR2YWwuc3QiCisKK2xleGVyUnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJMRVhFUi0+Z2V0VGV4dChMRVhFUikiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiX3R5cGUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiTEVYU1RBVEUtPnRva2VuU3RhcnRMaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiTEVYU1RBVEUtPnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiTEVYU1RBVEUtPmNoYW5uZWwiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIkxFWFNUQVRFLT50b2tlblN0YXJ0Q2hhckluZGV4IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihMRVhFUi0+Z2V0Q2hhckluZGV4KExFWEVSKS0xKSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiLTEiIC8vIHVuZGVmaW5lZCB0b2tlbiBpbmRleCBpbiBsZXhlcgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiTEVYRVItPmdldFRleHQoTEVYRVIpLT50b0ludDMyKExFWEVSLT5nZXRUZXh0KExFWEVSKSkiCisKKworLy8gc2V0dGluZyAkc3QgYW5kICR0cmVlIGlzIGFsbG93ZWQgaW4gbG9jYWwgcnVsZS4gZXZlcnl0aGluZyBlbHNlIGlzIGZsYWdnZWQgYXMgZXJyb3IKK3J1bGVTZXRQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwudHJlZT08ZXhwcj47IgorcnVsZVNldFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwuc3Q9PGV4cHI+OyIKKworCisvKiogSG93IHRvIGRlYWwgd2l0aCBhbiBAYWZ0ZXIgZm9yIEMgdGFyZ2V0cy4gQmVjYXVzZSB3ZSBjYW5ub3QgcmVseSBvbgorICogIGFueSBnYXJiYWdlIGNvbGxlY3Rpb24sIGFmdGVyIGNvZGUgaXMgZXhlY3V0ZWQgZXZlbiBpbiBiYWNrdHJhY2tpbmcKKyAqICBtb2RlLiBNdXN0IGJlIGRvY3VtZW50ZWQgY2xlYXJseS4KKyAqLworZXhlY0FmdGVyKGFjdGlvbikgOjo9IDw8Cit7CisgICAgPGFjdGlvbj4KK30KKz4+CisKKy8qKiBIb3cgdG8gZXhlY3V0ZSBhbiBhY3Rpb24gKHdoZW4gbm90IGJhY2t0cmFja2luZykgKi8KK2V4ZWNBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZSk+CitpZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkKK3sKKyAgICA8YWN0aW9uPgorfQorPGVsc2U+CitpZiAoIEJBQ0tUUkFDS0lORyA9PSAwICkKK3sKKyAgICA8YWN0aW9uPgorfQorPGVuZGlmPgorPGVsc2U+Cit7CisgICAgPGFjdGlvbj4KK30KKzxlbmRpZj4KKz4+CisKKy8vIE0gSSBTIEMgKHByb3BlcnRpZXMsIGV0Yy4uLikKKworYml0c2V0RGVjbGFyZShuYW1lLCB3b3JkczY0KSA6Oj0gPDwKKworLyoqIEJpdHNldCBkZWZpbmluZyBmb2xsb3cgc2V0IGZvciBlcnJvciByZWNvdmVyeSBpbiBydWxlIHN0YXRlOiA8bmFtZT4gICovCitzdGF0aWMJQU5UTFIzX0JJVFdPUkQgPG5hbWU+X2JpdHNbXQk9IHsgPHdvcmRzNjQ6e2l0IHxBTlRMUjNfVUlOVDY0X0xJVCg8aXQ+KX07IHNlcGFyYXRvcj0iLCAiPiB9Oworc3RhdGljICBBTlRMUjNfQklUU0VUX0xJU1QgPG5hbWU+CT0geyA8bmFtZT5fYml0cywgPGxlbmd0aCh3b3JkczY0KT4JfTsKKz4+CisKK2JpdHNldChuYW1lLCB3b3JkczY0KSA6Oj0gPDwKK2FudGxyM0JpdHNldFNldEFQSSgmPG5hbWU+KTs8XG4+Cis+PgorCitjb2RlRmlsZUV4dGVuc2lvbigpIDo6PSAiLmMiCisKK3RydWVfdmFsdWUoKSA6Oj0gIkFOVExSM19UUlVFIgorZmFsc2VfdmFsdWUoKSA6Oj0gIkFOVExSM19GQUxTRSIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQy9EYmcuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DL0RiZy5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2MmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQy9EYmcuc3RnCkBAIC0wLDAgKzEsMjQzIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBKaW0gSWRsZSwgVGVtcG9yYWwgV2F2ZSBMTEMKKyBodHRwOi8vd3d3LnRlbXBvcmFsLXdhdmUuY29tCisgaHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vamltaWRsZQorCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gbm9ybWFsIEMgb3V0cHV0OworICogIElmIEFTVHMgYXJlIGJ1aWx0LCB0aGVuIHlvdSdsbCBhbHNvIGdldCBBU1REYmcuc3RnIGxvYWRlZC4KKyAqLworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Citjb25zdCBjaGFyICoKK3J1bGVOYW1lc1tdID0KKwl7CisJCSJpbnZhbGlkUnVsZSIsIDxncmFtbWFyLmFsbEltcG9ydGVkUnVsZXM6e3JTVCB8ICI8clNULm5hbWU+In07IHdyYXA9IlxuCQkiLCBzZXBhcmF0b3I9IiwgIj4KKwl9Ozxcbj4KKzxlbmRpZj4KKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPiA8ISBncmFtbWFyIGltcG9ydHMgb3RoZXIgZ3JhbW1hcihzKSAhPgorc3RhdGljIEFOVExSM19VSU5UMzIgcnVsZUxldmVsID0gMDsKK3N0YXRpYyBBTlRMUjNfVUlOVDMyIGdldFJ1bGVMZXZlbCgpCit7CisJcmV0dXJuIHJ1bGVMZXZlbDsKK30KK3N0YXRpYyB2b2lkIGluY1J1bGVMZXZlbCgpCit7CisJcnVsZUxldmVsKys7Cit9CitzdGF0aWMgdm9pZCBkZWNSdWxlTGV2ZWwoKQoreworCXJ1bGVMZXZlbC0tOworfQorPGVsc2U+IDwhIGltcG9ydGVkIGdyYW1tYXIgIT4KK3N0YXRpYyBBTlRMUjNfVUlOVDMyCitnZXRSdWxlTGV2ZWwoKQoreworCXJldHVybiA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pi0+Z2V0UnVsZUxldmVsKCk7Cit9CitzdGF0aWMgdm9pZCBpbmNSdWxlTGV2ZWwoKQoreworCTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LT5pbmNSdWxlTGV2ZWwoKTsKK30KK3N0YXRpYyB2b2lkCitkZWNSdWxlTGV2ZWwoKQoreworCTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LmRlY1J1bGVMZXZlbCgpOworfQorPGVuZGlmPgorPGlmKHByb2ZpbGUpPgorLy8gUHJvZmlsaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZm9yIEMgdGFyZ2V0CisvLworPGVuZGlmPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Cis8Y3RvckZvclByZWRlZmluZWRMaXN0ZW5lcigpPgorPGVsc2U+Cis8Y3RvckZvckRlbGVnYXRlR3JhbW1hcigpPgorPGVuZGlmPgorCitzdGF0aWMgQU5UTFIzX0JPT0xFQU4KK2V2YWxQcmVkaWNhdGUocDxuYW1lPiBjdHgsIEFOVExSM19CT09MRUFOIHJlc3VsdCwgY29uc3QgY2hhciAqIHByZWRpY2F0ZSkKK3sKKyAgICBEQkctPnNlbWFudGljUHJlZGljYXRlKERCRywgcmVzdWx0LCBwcmVkaWNhdGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9PFxuPgorPj4KKworQGdlbmVyaWNQYXJzZXIuZGVidWdTdHVmZigpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Cis8Y3JlYXRlTGlzdGVuZXJBbmRIYW5kc2hha2UoKT4KKzxlbmRpZj4KKz4+CisKK2N0b3JGb3JQcm9maWxpbmdSb290R3JhbW1hcigpIDo6PSA8PAorPj4KKworLyoqIEJhc2ljYWxseSB3ZSBkb24ndCB3YW50IHRvIHNldCBhbnkgZGJnIGxpc3RlbmVycyBhcyByb290IHdpbGwgaGF2ZSBpdC4gKi8KK2N0b3JGb3JEZWxlZ2F0ZUdyYW1tYXIoKSA6Oj0gPDwKKworPj4KKworY3RvckZvclByZWRlZmluZWRMaXN0ZW5lcigpIDo6PSA8PAorCis+PgorCitjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpIDo6PSA8PAoreworCS8vIERFQlVHIE1PREUgY29kZQorCS8vCisJcEFOVExSM19ERUJVR19FVkVOVF9MSVNURU5FUgkgcHJveHk7CisJcHJveHkgPSBhbnRscjNEZWJ1Z0xpc3RlbmVyTmV3KCk7CisJcHJveHktPmdyYW1tYXJGaWxlTmFtZSA9IElOUFVULT50b2tlblNvdXJjZS0+c3RyRmFjdG9yeS0+bmV3U3RyOChJTlBVVC0+dG9rZW5Tb3VyY2UtPnN0ckZhY3RvcnksIChwQU5UTFIzX1VJTlQ4KWN0eC0+Z2V0R3JhbW1hckZpbGVOYW1lKCkpOworCis8aWYoVFJFRV9QQVJTRVIpPgorCXByb3h5LT5hZGFwdG9yID0gQURBUFRPUjsKKzxlbmRpZj4KKwlQQVJTRVItPnNldERlYnVnTGlzdGVuZXIoUEFSU0VSLCBwcm94eSk7CisKKwkvLyBUcnkgdG8gY29ubmVjdCB0byB0aGUgZGVidWdnZXIgKHdhaXRzIGZvcmV2ZXIgZm9yIGEgY29ubmVjdGlvbikKKwkvLworCXByb3h5LT5oYW5kc2hha2UocHJveHkpOworCisJLy8gRW5kIERFQlVHIE1PREUgY29kZQorCS8vCit9Cis+PgorCisKK0BydWxlLnByZWFtYmxlKCkgOjo9IDw8CitpZiAoIGdldFJ1bGVMZXZlbCgpPT0wICkKK3sKKwlEQkctPmNvbW1lbmNlKERCRyk7Cit9CitEQkctPmVudGVyUnVsZShEQkcsIGdldEdyYW1tYXJGaWxlTmFtZSgpLCAoY29uc3QgY2hhciAqKSI8cnVsZU5hbWU+Iik7CitpbmNSdWxlTGV2ZWwoKTsKK0RCRy0+bG9jYXRpb24oREJHLCA8cnVsZURlc2NyaXB0b3IudHJlZS5saW5lPiwgPHJ1bGVEZXNjcmlwdG9yLnRyZWUuY29sdW1uPik7PFxuPgorPj4KKworQHJ1bGUucG9zdGFtYmxlKCkgOjo9IDw8CitEQkctPmxvY2F0aW9uKERCRywgPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUubGluZT4sIDxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmNvbHVtbj4pOzxcbj4KK0RCRy0+ZXhpdFJ1bGUoREJHLCBnZXRHcmFtbWFyRmlsZU5hbWUoKSwgKGNvbnN0IGNoYXIgKikiPHJ1bGVOYW1lPiIpOworZGVjUnVsZUxldmVsKCk7CitpZiAoIGdldFJ1bGVMZXZlbCgpPT0wICkKK3sKKwlEQkctPnRlcm1pbmF0ZShEQkcpOworfQorPFxuPgorPj4KKworQGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUuZGVidWdDbGVhbigpIDo6PSA8PAorREJHLT5leGl0UnVsZShEQkcsIGdldEdyYW1tYXJGaWxlTmFtZSgpLCAoY29uc3QgY2hhciAqKSI8cnVsZU5hbWU+Iik7CitkZWNSdWxlTGV2ZWwoKTsKKz4+CisKK0BzeW5wcmVkLnN0YXJ0KCkgOjo9ICJEQkctPmJlZ2luQmFja3RyYWNrKERCRywgQkFDS1RSQUNLSU5HKTsiCisKK0BzeW5wcmVkLnN0b3AoKSA6Oj0gIkRCRy0+ZW5kQmFja3RyYWNrKERCRywgQkFDS1RSQUNLSU5HLCBzdWNjZXNzKTsiCisKKy8vIENvbW1vbiBkZWJ1ZyBldmVudCB0cmlnZ2VycyB1c2VkIGJ5IHJlZ2lvbiBvdmVycmlkZXMgYmVsb3cKKworZW50ZXJTdWJSdWxlKCkgOjo9CisgICAgIkRCRy0+ZW50ZXJTdWJSdWxlKERCRywgPGRlY2lzaW9uTnVtYmVyPik7PFxuPiIKKworZXhpdFN1YlJ1bGUoKSA6Oj0KKyAgICAiREJHLT5leGl0U3ViUnVsZShEQkcsIDxkZWNpc2lvbk51bWJlcj4pOzxcbj4iCisKK2VudGVyRGVjaXNpb24oKSA6Oj0KKyAgICAiREJHLT5lbnRlckRlY2lzaW9uKERCRywgPGRlY2lzaW9uTnVtYmVyPik7PFxuPiIKKworZXhpdERlY2lzaW9uKCkgOjo9CisgICAgIkRCRy0+ZXhpdERlY2lzaW9uKERCRywgPGRlY2lzaW9uTnVtYmVyPik7PFxuPiIKKworZW50ZXJBbHQobikgOjo9ICJEQkctPmVudGVyQWx0KERCRywgPG4+KTs8XG4+IgorCisvLyBSZWdpb24gb3ZlcnJpZGVzIHRoYXQgdGVsbCB2YXJpb3VzIGNvbnN0cnVjdHMgdG8gYWRkIGRlYnVnZ2luZyB0cmlnZ2VycworCitAYmxvY2sucHJlZGVjaXNpb24oKSA6Oj0gIjxlbnRlclN1YlJ1bGUoKT48ZW50ZXJEZWNpc2lvbigpPiIKKworQGJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworQGJsb2NrLnBvc3RicmFuY2goKSA6Oj0gIjxleGl0U3ViUnVsZSgpPiIKKworQHJ1bGVCbG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyRGVjaXNpb24oKT4iCisKK0BydWxlQmxvY2sucG9zdGRlY2lzaW9uKCkgOjo9ICI8ZXhpdERlY2lzaW9uKCk+IgorCitAcnVsZUJsb2NrU2luZ2xlQWx0LnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49XCIxXCIpPiIKKworQGJsb2NrU2luZ2xlQWx0LnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49XCIxXCIpPiIKKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLnByZWxvb3AoKSA6Oj0gIjxlbnRlclN1YlJ1bGUoKT4iCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCitAcG9zaXRpdmVDbG9zdXJlQmxvY2sucHJlZGVjaXNpb24oKSA6Oj0gIjxlbnRlckRlY2lzaW9uKCk+IgorCitAcG9zaXRpdmVDbG9zdXJlQmxvY2sucG9zdGRlY2lzaW9uKCkgOjo9ICI8ZXhpdERlY2lzaW9uKCk+IgorCitAcG9zaXRpdmVDbG9zdXJlQmxvY2suZWFybHlFeGl0RXhjZXB0aW9uKCkgOjo9CisgICAgIkRCRy0+cmVjb2duaXRpb25FeGNlcHRpb24oREJHLCBFWENFUFRJT04pOzxcbj4iCisKK0BjbG9zdXJlQmxvY2sucHJlbG9vcCgpIDo6PSAiPGVudGVyU3ViUnVsZSgpPiIKKworQGNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCitAY2xvc3VyZUJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJEZWNpc2lvbigpPiIKKworQGNsb3N1cmVCbG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKK0BhbHRTd2l0Y2hDYXNlLnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KGFsdE51bSk+IgorCitAZWxlbWVudC5wcmVtYXRjaCgpIDo6PQorICAgICJEQkctPmxvY2F0aW9uKERCRywgPGUubGluZT4sIDxlLnBvcz4pOyIgLy8gZSBpcyBhcmcgb2YgZWxlbWVudAorCitAbWF0Y2hTZXQubWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpIDo6PQorICAgICJEQkctPnJlY29nbml0aW9uRXhjZXB0aW9uKERCRywgRVhDRVBUSU9OKTsiCisKK0BuZXdOVkV4Y2VwdGlvbi5ub1ZpYWJsZUFsdEV4Y2VwdGlvbigpIDo6PSAiREJHLT5yZWNvZ25pdGlvbkV4Y2VwdGlvbihEQkcsIEVYQ0VQVElPTik7IgorCitkZmFEZWNpc2lvbihkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CithbHQ8ZGVjaXNpb25OdW1iZXI+ID0gY2RmYTxkZWNpc2lvbk51bWJlcj4ucHJlZGljdChjdHgsIFJFQ09HTklaRVIsIElTVFJFQU0sICZjZGZhPGRlY2lzaW9uTnVtYmVyPik7CitpZiAgKEhBU0VYQ0VQVElPTigpKQoreworCURCRy0+cmVjb2duaXRpb25FeGNlcHRpb24oREJHLCBFWENFUFRJT04pOworICAgIGdvdG8gcnVsZTxydWxlRGVzY3JpcHRvci5uYW1lPkV4OworfQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKK0BjeWNsaWNERkEuZXJyb3JNZXRob2QoKSA6Oj0gPDwKKy8vc3RhdGljIHZvaWQKKy8vZGZhRXJyb3IocDxuYW1lPiBjdHgpCisvL3sKKy8vICAgIERCRy0+cmVjb2duaXRpb25FeGNlcHRpb24oREJHLCBFWENFUFRJT04pOworLy99Cis+PgorCisvKiogRm9yY2UgcHJlZGljYXRlIHZhbGlkYXRpb24gdG8gdHJpZ2dlciBhbiBldmVudCAqLworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2V2YWxQcmVkaWNhdGUoY3R4LCA8cHJlZD4sIChjb25zdCBjaGFyICopIjxkZXNjcmlwdGlvbj4iKQorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1BQL0NQUC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NQUC9DUFAuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODhiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NQUC9DUFAuc3RnCkBAIC0wLDAgKzEsMTM1MSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitncm91cCBDcHA7CisKK2NwcFR5cGVJbml0TWFwIDo6PSBbCisJImludCI6IjAiLAorCSJsb25nIjoiMCIsCisJImZsb2F0IjoiMC4wIiwKKwkiZG91YmxlIjoiMC4wIiwKKwkiYm9vbCI6ImZhbHNlIiwKKwkiYnl0ZSI6IjAiLAorCSJzaG9ydCI6IjAiLAorCSJjaGFyIjoiMCIsCisJZGVmYXVsdDoiMCIgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBhdG9taWMgdHlwZQorXQorCisvLyBXaGF0IHdlIGdlbmVyYXRlIGxleGVyL3BhcnNlci90cmVlcGFyc2VyLCB1c2VkIGEgc3VmZml4IGluIGEgZmV3IHBsYWNlcworZ2VuZXJhdGVkVHlwZSgpIDo6PSA8PAorPGlmKExFWEVSKT5MZXhlcjxlbmRpZj48aWYoUEFSU0VSKT5QYXJzZXI8ZW5kaWY+PGlmKFRSRUVfUEFSU0VSKT5UcmVlUGFyc2VyPGVuZGlmPgorPj4KKworbGVhZEluKHR5cGUpIDo6PQorPDwKKy8qKiBcZmlsZQorICoKKyAqICBUaGlzIDx0eXBlPiBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgQU5UTFIgdmVyc2lvbiA8QU5UTFJWZXJzaW9uPgorICoKKyAqICAgICAtICBGcm9tIHRoZSBncmFtbWFyIHNvdXJjZSBmaWxlIDogPGZpbGVOYW1lPgorICogICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gOiA8Z2VuZXJhdGVkVGltZXN0YW1wPgorPGlmKExFWEVSKT4KKyAqICAgICAtICAgICAgICAgICAgICAgICBmb3IgdGhlIGxleGVyIDogPG5hbWU+PFxuPgorPGVuZGlmPgorPGlmKFBBUlNFUik+CisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IDxuYW1lPjxcbj4KKzxlbmRpZj4KKzxpZihUUkVFX1BBUlNFUik+CisgKiAgICAgLSAgICAgICAgICAgZm9yIHRoZSB0cmVlIHBhcnNlciA6IDxuYW1lPjxcbj4KKzxlbmRpZj4KKyAqCisgKiAgRWRpdCBhdCB5b3VyIG93biBwZXJpbC4KKyAqLworPj4KKworc3RhbmRhcmRIZWFkZXJzKCkgOjo9Cis8PAorI2luY2x1ZGUgXDxhbnRscjMvPGdlbmVyYXRlZFR5cGUoKT4uaD4KKworPGlmKHByb2ZpbGUpPgorI3dhcm5pbmcgIk5vIHByb2ZpbGluZyBzdXBwb3J0Li4iCis8ZW5kaWY+Cis8aWYoVFJFRV9QQVJTRVIpPgorI3dhcm5pbmcgIk5vIHRyZWUgcGFyc2luZyB5ZXQuLi4iCis8ZW5kaWY+Cis+PgorCisvKiogVGhlIG92ZXJhbGwgZmlsZSBzdHJ1Y3R1cmUgb2YgYSByZWNvZ25pemVyOyBzdG9yZXMgbWV0aG9kcyBmb3IgcnVsZXMKKyAqICBhbmQgY3ljbGljIERGQXMgcGx1cyBzdXBwb3J0IGNvZGUuCisgKi8KK291dHB1dEZpbGUoTEVYRVIsUEFSU0VSLFRSRUVfUEFSU0VSLCBhY3Rpb25TY29wZSwgYWN0aW9ucywKKwkJCSAgZG9jQ29tbWVudCwgcmVjb2duaXplciwKKwkJCSAgbmFtZSwgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgY3ljbGljREZBcywKKwkJCSAgYml0c2V0cywgYnVpbGRUZW1wbGF0ZSwgcHJvZmlsZSwKKwkJCSAgYmFja3RyYWNraW5nLCBzeW5wcmVkcywgbWVtb2l6ZSwgbnVtUnVsZXMsCisJCQkgIGZpbGVOYW1lLCBBTlRMUlZlcnNpb24sIGdlbmVyYXRlZFRpbWVzdGFtcCwgdHJhY2UsCisJCQkgIHNjb3Blcywgc3VwZXJDbGFzcykgOjo9Cis8PAorPGxlYWRJbigiQysrIHNvdXJjZSIpPgorPEBpbmNsdWRlcz4KKyNpbmNsdWRlICI8bmFtZT48aGVhZGVyRmlsZUV4dGVuc2lvbigpPiIKKzxAZW5kPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5oZWFkZXIpPgorLy8gSGVhZGVyIGFjdGlvbiBzdGFydCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5oZWFkZXI+CisvLyBIZWFkZXIgYWN0aW9uIGVuZCAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis8ZW5kaWY+CisKKzxoZWFkZXJBY3Rpb24+CisKKzxzdGFuZGFyZEhlYWRlcnMoKT4KKworPGRvY0NvbW1lbnQ+Cis8cmVjb2duaXplcj4KKz4+CitwYXJzZXJIZWFkZXJGaWxlKCkgOjo9IDw8Cis+PgordHJlZVBhcnNlckhlYWRlckZpbGUoKSA6Oj0gPDwKKz4+CitsZXhlckhlYWRlckZpbGUoKSA6Oj0gPDwKK3RlbXBsYXRlXDx0eXBlbmFtZSBTdHJlYW1UeXBlLCB0eXBlbmFtZSBUb2tlblR5cGUsIHR5cGVuYW1lIFRva2VuQnVpbGRlcj4KK2NsYXNzIDxuYW1lPiA6IHB1YmxpYyBhbnRscjM6OkxleGVyXDxTdHJlYW1UeXBlLFRva2VuVHlwZSxUb2tlbkJ1aWxkZXI+IHsKKwkvLyBjYXJyeSBvdmVyIGdlbmVyYWwgdHlwZXMKKwl0eXBlZGVmIHR5cGVuYW1lIFN0cmVhbVR5cGU6OnBvc2l0aW9uX3R5cGUgcG9zaXRpb25fdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIFN0cmVhbVR5cGU6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisKKwl0eXBlZGVmIGFudGxyMzo6dG9rZW5pZF90eXBlICAgICAgICAgICAgICAgdG9rZW5pZF90eXBlOworCXR5cGVkZWYgYW50bHIzOjpjaGFubmVsX3R5cGUgICAgICAgICAgICAgICBjaGFubmVsX3R5cGU7CisJdHlwZWRlZiBhbnRscjM6OmRlY2lzaW9uX3R5cGUgICAgICAgICAgICAgIGRlY2lzaW9uX3R5cGU7CisJLy8gZXhjZXB0aW9uIHNob3J0aGFuZHMKKwl0eXBlZGVmIGFudGxyMzo6TWlzbWF0Y2hFeGNlcHRpb25cPHBvc2l0aW9uX3R5cGUsY2hhcl90eXBlPiAgICAgICAgTWlzbWF0Y2hFeGNlcHRpb247CisJdHlwZWRlZiBhbnRscjM6Ok1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvblw8cG9zaXRpb25fdHlwZSxjaGFyX3R5cGU+IE1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbjsKKwl0eXBlZGVmIGFudGxyMzo6TWlzbWF0Y2hlZFNldEV4Y2VwdGlvblw8cG9zaXRpb25fdHlwZSxjaGFyX3R5cGU+ICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbjsKKwl0eXBlZGVmIGFudGxyMzo6RWFybHlFeGl0RXhjZXB0aW9uXDxwb3NpdGlvbl90eXBlPiAgICAgICBFYXJseUV4aXRFeGNlcHRpb247CisJdHlwZWRlZiBhbnRscjM6Ok5vVmlhYmxlQWx0RXhjZXB0aW9uXDxwb3NpdGlvbl90eXBlPiAgICAgTm9WaWFibGVBbHRFeGNlcHRpb247Cis8aWYoYmFja3RyYWNraW5nKT4KKwkvLyBAVE9ETyBiYWNrdHJhY2tpbmcgcnVsZU1lbW8gPSBuZXcgSGFzaE1hcFs8bnVtUnVsZXM+KzFdOzxcbj4gPCEgaW5kZXggZnJvbSAxLi5uICE+Cis8ZW5kaWY+CisKK3B1YmxpYzoKKwk8dG9rZW5zOntzdGF0aWMgY29uc3QgdG9rZW5pZF90eXBlIDx0b2tlblByZWZpeCgpPjxpdC5uYW1lPiA9IDxpdC50eXBlPjt9OyBzZXBhcmF0b3I9IlxuIj4KKwk8c2NvcGVzOns8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZT1pdCk+PGVuZGlmPn0+CisJPGFjdGlvbnMubGV4ZXIubWVtYmVycz4KKworCTxuYW1lPihTdHJlYW1UeXBlKiBpbnB1dCkKKwk6IGFudGxyMzo6TGV4ZXJcPFN0cmVhbVR5cGUsVG9rZW5UeXBlLFRva2VuQnVpbGRlcj4oaW5wdXQpCisJeworCX0KKworPCFpZihmaWx0ZXJNb2RlKSE+CisgICAgPCFmaWx0ZXJpbmdOZXh0VG9rZW4oKSE+Cis8IWVuZGlmIT4KKwk8cnVsZXM7IHNlcGFyYXRvcj0iXG5cbiI+CisKKwkvLyBzeW4gcHJlZHMKKwk8c3lucHJlZHM6e3AgfCA8bGV4ZXJTeW5wcmVkKHApPn0+CisKKwkvLyBjeWNsaWMgZGZhJ3MKKwk8Y3ljbGljREZBczp7ZGZhIHwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBuZXcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4odGhpcyk7fTsgc2VwYXJhdG9yPSJcbiI+CisJLy8gZGZhIHRhYmxlcy4uCit9OyAvLyBjbGFzcyA8bmFtZT48XG4+Cis+PgorCitoZWFkZXJGaWxlKCBMRVhFUiwKKyAgICAgICAgICAgIFBBUlNFUiwKKyAgICAgICAgICAgIFRSRUVfUEFSU0VSLAorICAgICAgICAgICAgYWN0aW9uU2NvcGUsCisgICAgICAgICAgICBhY3Rpb25zLAorICAgICAgICAgICAgZG9jQ29tbWVudCwKKyAgICAgICAgICAgIHJlY29nbml6ZXIsCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdG9rZW5zLAorICAgICAgICAgICAgdG9rZW5OYW1lcywKKyAgICAgICAgICAgIHJ1bGVzLAorICAgICAgICAgICAgY3ljbGljREZBcywKKyAgICAgICAgICAgIGJpdHNldHMsCisgICAgICAgICAgICBidWlsZFRlbXBsYXRlLAorICAgICAgICAgICAgcHJvZmlsZSwKKyAgICAgICAgICAgIGJhY2t0cmFja2luZywKKyAgICAgICAgICAgIHN5bnByZWRzLAorICAgICAgICAgICAgbWVtb2l6ZSwKKyAgICAgICAgICAgIG51bVJ1bGVzLAorICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICBBTlRMUlZlcnNpb24sCisgICAgICAgICAgICBnZW5lcmF0ZWRUaW1lc3RhbXAsCisgICAgICAgICAgICB0cmFjZSwKKyAgICAgICAgICAgIHNjb3BlcywKKyAgICAgICAgICAgIHN1cGVyQ2xhc3MKKyAgICAgICAgKSA6Oj0KKzw8CisjaWZuZGVmCV88bmFtZT5fSAorI2RlZmluZSBfPG5hbWU+X0gKKzxsZWFkSW4oIkMrKyBoZWFkZXIiKT4KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyZmlsZT4KKworPEBpbmNsdWRlcz4KKzxzdGFuZGFyZEhlYWRlcnMoKT4KKzxAZW5kPgorCis8aWYoTEVYRVIpPgorPGxleGVySGVhZGVyRmlsZSgpPgorPGVuZGlmPgorPGlmKFBBUlNFUik+Cis8cGFyc2VySGVhZGVyRmlsZSgpPgorPGVuZGlmPgorPGlmKFRSRUVfUEFSU0VSKT4KKzx0cmVlUGFyc2VySGVhZGVyRmlsZSgpPgorPGVuZGlmPgorCisKKyNlbmRpZgkvLyBfPG5hbWU+X0g8XG4+Cis+PgorCitsZXhlcihncmFtbWFyLCBuYW1lLCB0b2tlbnMsIHNjb3BlcywgcnVsZXMsIG51bVJ1bGVzLCBsYWJlbFR5cGU9IlRva2VuIiwKKyAgICAgIGZpbHRlck1vZGUpIDo6PSA8PAorCis8Y3ljbGljREZBczpjeWNsaWNERkEoKT4gPCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KKworPj4KKworZmlsdGVyaW5nTmV4dFRva2VuKCkgOjo9IDw8CisvKiogQSBvdmVycmlkZSBvZiBMZXhlci5uZXh0VG9rZW4oKSB0aGF0IGJhY2t0cmFja3Mgb3ZlciBtVG9rZW5zKCkgbG9va2luZworICogIGZvciBtYXRjaGVzLiAgTm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCB1cG9uIGVycm9yOyBqdXN0IHJld2luZCwgY29uc3VtZQorICogIGEgdG9rZW4gYW5kIHRoZW4gdHJ5IGFnYWluLiAgYmFja3RyYWNraW5nIG5lZWRzIHRvIGJlIHNldCBhcyB3ZWxsLgorICogIE1ha2UgcnVsZSBtZW1vaXphdGlvbiBoYXBwZW4gb25seSBhdCBsZXZlbHMgYWJvdmUgMSBhcyB3ZSBzdGFydCBtVG9rZW5zCisgKiAgYXQgYmFja3RyYWNraW5nPT0xLgorICovCitwdWJsaWMgVG9rZW4gbmV4dFRva2VuKCkgeworCXdoaWxlICh0cnVlKSB7CisJCWlmICggaW5wdXQuTEEoMSk9PUNoYXJTdHJlYW0uRU9GICkgeworCQkJcmV0dXJuIFRva2VuLkVPRl9UT0tFTjsKKwkJfQorCQl0aGlzLT50b2tlbiA9IDA7CisJCXRva2VuU3RhcnRDaGFySW5kZXggPSBnZXRDaGFySW5kZXgoKTsKKwkJdHJ5IHsKKwkJCWludCBtID0gaW5wdXQubWFyaygpOworCQkJYmFja3RyYWNraW5nPTE7IDwhIG1lYW5zIHdlIHdvbid0IHRocm93IHNsb3cgZXhjZXB0aW9uICE+CisJCQlmYWlsZWQ9ZmFsc2U7CisJCQltVG9rZW5zKCk7CisJCQliYWNrdHJhY2tpbmc9MDsKKwkJCTwhIG1Ub2tlbnMgYmFja3RyYWNrcyB3aXRoIHN5bnByZWQgYXQgYmFja3RyYWNraW5nPT0yCisJCQkJYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAhPgorCQkJaWYgKCBmYWlsZWQgKSB7CisJCQkJaW5wdXQucmV3aW5kKG0pOworCQkJCWlucHV0LmNvbnN1bWUoKTsgPCEgYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluICE+CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZXR1cm4gdG9rZW47CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisJCQkvLyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKwkJCXJlcG9ydEVycm9yKHJlKTsKKwkJCXJlY292ZXIocmUpOworCQl9CisJfQorfQorCitwdWJsaWMgdm9pZCBtZW1vaXplKEludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCwgaW50IHJ1bGVTdGFydEluZGV4KQoreworCWlmICggYmFja3RyYWNraW5nID4gMSApCisJCXN1cGVyLm1lbW9pemUoaW5wdXQsIHJ1bGVJbmRleCwgcnVsZVN0YXJ0SW5kZXgpOworfQorCitwdWJsaWMgYm9vbGVhbiBhbHJlYWR5UGFyc2VkUnVsZShJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlSW5kZXgpCit7CisJaWYgKCBiYWNrdHJhY2tpbmcgPiAxICkKKwkJcmV0dXJuIHN1cGVyLmFscmVhZHlQYXJzZWRSdWxlKGlucHV0LCBydWxlSW5kZXgpOworCXJldHVybiBmYWxzZTsKK30KKz4+CisKK2ZpbHRlcmluZ0FjdGlvbkdhdGUoKSA6Oj0gImJhY2t0cmFja2luZyA9PSAxIgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcGFyc2VyICovCitnZW5lcmljUGFyc2VyKAorCWdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsIGN5Y2xpY0RGQXMsCisJYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsCisJbGFiZWxUeXBlLCBtZW1iZXJzLCBmaWx0ZXJNb2RlCisJKSA6Oj0gPDwKKy8vIGdlbmVyaWNQYXJzZXIKK2NsYXNzIDxuYW1lPiA6IHB1YmxpYyA8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPiB7CitwdWJsaWM6CisJc3RhdGljIGNvbnN0IGNoYXIqIHRva2VuTmFtZXNbXSA9IHsKKwkJIlw8aW52YWxpZD4iLCAiXDxFT1I+IiwgIlw8RE9XTj4iLCAiXDxVUD4iLCA8dG9rZW5OYW1lczsgc2VwYXJhdG9yPSIsICI+CisJfTsKKwk8dG9rZW5zOntzdGF0aWMgdG9rZW5pZF90eXBlIDx0b2tlblByZWZpeCgpPjxpdC5uYW1lPj08aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisJPHNjb3Blczp7PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorCTxAbWVtYmVycz4KKworCTxuYW1lPihTdHJlYW1UeXBlKiBpbnB1dCkKKwk6IDxzdXBlckNsYXNzPlw8U3RyZWFtVHlwZSxUb2tlblR5cGU+KGlucHV0KQorCXsKKzxpZihiYWNrdHJhY2tpbmcpPgorCQlydWxlTWVtbyA9IG5ldyBIYXNoTWFwWzxudW1SdWxlcz4rMV07PFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKwl9CisJPEBlbmQ+CisKKwkvL0BUT0RPIHB1YmxpYyBTdHJpbmdbXSBnZXRUb2tlbk5hbWVzKCkgeyByZXR1cm4gdG9rZW5OYW1lczsgfQorCS8vQFRPRE8gcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiPGZpbGVOYW1lPiI7IH0KKwk8bWVtYmVycz4KKworCTxydWxlczsgc2VwYXJhdG9yPSJcblxuIj4KKworCTxzeW5wcmVkczp7cCB8IDxzeW5wcmVkKHApPn0+CisKKwk8Y3ljbGljREZBczp7ZGZhIHwgcHJvdGVjdGVkIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gbmV3IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorCTxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCisJPGJpdHNldHM6Yml0c2V0KG5hbWU9e0ZPTExPV188aXQubmFtZT5faW5fPGl0LmluTmFtZT48aXQudG9rZW5JbmRleD59LAorCQkJCQkJCXdvcmRzNjQ9aXQuYml0cyk+Cit9OworPj4KKworcGFyc2VyKAorCWdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLAorCXJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywgQVNUTGFiZWxUeXBlLAorCXN1cGVyQ2xhc3M9IlBhcnNlciIsIGxhYmVsVHlwZT0iVG9rZW4iLAorCW1lbWJlcnM9ezxhY3Rpb25zLnBhcnNlci5tZW1iZXJzPn0pIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJUb2tlblN0cmVhbSIsIC4uLik+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgdHJlZSBwYXJzZXI7IHNhbWUgYXMgcGFyc2VyIGV4Y2VwdCB0aGUgaW5wdXQKKyAqICBzdHJlYW0gaXMgYSBkaWZmZXJlbnQgdHlwZS4KKyAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLAorCXJ1bGVzLCBudW1SdWxlcywKKwliaXRzZXRzLAorCWxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsCisJc3VwZXJDbGFzcz0iVHJlZVBhcnNlciIsIG1lbWJlcnM9ezxhY3Rpb25zLnRyZWVwYXJzZXIubWVtYmVycz59LCBmaWx0ZXJNb2RlCisJKSA6Oj0gPDwKKzxnZW5lcmljUGFyc2VyKGlucHV0U3RyZWFtVHlwZT0iVHJlZU5vZGVTdHJlYW0iLCAuLi4pPgorPj4KKworLyoqIEEgc2ltcGxlciB2ZXJzaW9uIG9mIGEgcnVsZSB0ZW1wbGF0ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBpbWFnaW5hcnkKKyAqICBydWxlcyBjcmVhdGVkIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gIEFzIHRoZXkgbmV2ZXIgaGF2ZSByZXR1cm4gdmFsdWVzCisgKiAgbm9yIHBhcmFtZXRlcnMgZXRjLi4uLCBqdXN0IGdpdmUgc2ltcGxlc3QgcG9zc2libGUgbWV0aG9kLiAgRG9uJ3QgZG8KKyAqICBhbnkgb2YgdGhlIG5vcm1hbCBtZW1vaXphdGlvbiBzdHVmZiBpbiBoZXJlIGVpdGhlcjsgaXQncyBhIHdhc3RlLgorICogIEFzIHByZWRpY2F0ZXMgY2Fubm90IGJlIGlubGluZWQgaW50byB0aGUgaW52b2tpbmcgcnVsZSwgdGhleSBuZWVkIHRvCisgKiAgYmUgaW4gYSBydWxlIGJ5IHRoZW1zZWx2ZXMuCisgKi8KK3N5bnByZWRSdWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGRlc2NyaXB0aW9uLCBuYWtlZEJsb2NrKSA6Oj0KKzw8CisvLyAkQU5UTFIgc3RhcnQgPHJ1bGVOYW1lPgorcHVibGljIHZvaWQgPHJ1bGVOYW1lPl9mcmFnbWVudCg8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoc2NvcGU9aXQpPikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKwk8aWYodHJhY2UpPlN5c3RlbS5vdXQucHJpbnRsbigiZW50ZXIgPHJ1bGVOYW1lPiAiK2lucHV0LkxUKDEpKyIgZmFpbGVkPSIrZmFpbGVkKyIgYmFja3RyYWNraW5nPSIrYmFja3RyYWNraW5nKTs8ZW5kaWY+Cis8aWYodHJhY2UpPgorCXRyeSB7CisJCTxibG9jaz4KKwl9CisJZmluYWxseSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdCA8cnVsZU5hbWU+ICIraW5wdXQuTFQoMSkrIiBmYWlsZWQ9IitmYWlsZWQrIiBiYWNrdHJhY2tpbmc9IitiYWNrdHJhY2tpbmcpOworCX0KKzxlbHNlPgorCTxibG9jaz4KKzxlbmRpZj4KK30KKy8vICRBTlRMUiBlbmQgPHJ1bGVOYW1lPgorPj4KKworc3lucHJlZChuYW1lKSA6Oj0gPDwKK3B1YmxpYyBib29sZWFuIDxuYW1lPigpIHsKKyAgICB0aGlzLT5iYWNrdHJhY2tpbmcrKzsKKyAgICA8QHN0YXJ0KCk+CisgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgIHRyeSB7CisgICAgICAgIDxuYW1lPl9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICB9CisgICAgYm9vbGVhbiBzdWNjZXNzID0gISB0aGlzLT5mYWlsZWQ7CisgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICA8QHN0b3AoKT4KKyAgICB0aGlzLT5iYWNrdHJhY2tpbmctLTsKKyAgICB0aGlzLT5mYWlsZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gc3VjY2VzczsKK308XG4+Cis+PgorCitsZXhlclN5bnByZWQobmFtZSkgOjo9IDw8Cis8c3lucHJlZChuYW1lKT4KKz4+CisKK3J1bGVNZW1vaXphdGlvbihuYW1lKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KK2lmICggYmFja3RyYWNraW5nID4gMCAmJiBhbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PikgKQorCXJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OworPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byB0ZXN0IGZvciBmYWlsdXJlIGFuZCByZXR1cm4gZnJvbSBydWxlICovCitjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIChmYWlsZWQpCisJcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47Cis8ZW5kaWY+Cis+PgorCisvKiogVGhpcyBydWxlIGhhcyBmYWlsZWQsIGV4aXQgaW5kaWNhdGluZyBmYWlsdXJlIGR1cmluZyBiYWNrdHJhY2sgKi8KK3J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIChiYWNrdHJhY2tpbmcgPiAwKQoreworCWZhaWxlZCA9IHRydWU7CisJcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47Cit9Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcnVsZS4gIFRoaXMgaW5jbHVkZXMgYW55IHJldHVybiB0eXBlCisgKiAgZGF0YSBhZ2dyZWdhdGVzIHJlcXVpcmVkIGZvciBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgorICovCitydWxlKHJ1bGVOYW1lLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLGVtcHR5UnVsZSxkZXNjcmlwdGlvbixleGNlcHRpb25zLG1lbW9pemUpIDo6PSA8PAorPHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorPHJldHVyblNjb3BlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT4KKworLy8gJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorcHVibGljIDxyZXR1cm5UeXBlKCk+IDxydWxlTmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pIHRocm93KGFudGxyMzo6QmFzZVJlY29nbml0aW9uRXhjZXB0aW9uKQoreworPGlmKHRyYWNlKT4KKwlhbnRscjM6OlRyYWNlciB0cmFjZSh0aGlzLCI8cnVsZU5hbWU+Iik7CisJU3lzdGVtLm91dC5wcmludGxuKCJlbnRlciA8cnVsZU5hbWU+ICIraW5wdXQuTFQoMSkrIiBmYWlsZWQ9IitmYWlsZWQrIiBiYWNrdHJhY2tpbmc9IitiYWNrdHJhY2tpbmcpOworPGVuZGlmPgorCTxydWxlRGVjbGFyYXRpb25zKCk+CisJPHJ1bGVMYWJlbERlZnMoKT4KKwk8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorCTxAcHJlYW1ibGUoKT4KKwl0cnkgeworCQk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCQk8YmxvY2s+CisJfQorPGlmKGV4Y2VwdGlvbnMpPgorCTxleGNlcHRpb25zOntlfDxjYXRjaChkZWNsPWUuZGVjbCxhY3Rpb249ZS5hY3Rpb24pPjxcbj59PgorPGVsc2U+Cis8aWYoIWVtcHR5UnVsZSk+Cis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaCk+CisJPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2g+Cis8ZWxzZT4KKwljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKwkJcmVwb3J0RXJyb3IocmUpOworCQlyZWNvdmVyKGlucHV0LHJlKTsKKwl9PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorCWZpbmFsbHkgeworCQk8aWYodHJhY2UpPlN5c3RlbS5vdXQucHJpbnRsbigiZXhpdCA8cnVsZU5hbWU+ICIraW5wdXQuTFQoMSkrIiBmYWlsZWQ9IitmYWlsZWQrIiBiYWNrdHJhY2tpbmc9IitiYWNrdHJhY2tpbmcpOzxlbmRpZj4KKwkJPHJ1bGVDbGVhblVwKCk+CisJCTwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5maW5hbGx5KTpleGVjQWN0aW9uKCk+CisJfQorCTxAcG9zdGFtYmxlKCk+CisJcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47Cit9CisvLyAkQU5UTFIgZW5kIDxydWxlTmFtZT4KKz4+CisKK2NhdGNoKGRlY2wsYWN0aW9uKSA6Oj0gPDwKK2NhdGNoICg8ZS5kZWNsPikgeworICAgIDxlLmFjdGlvbj4KK30KKz4+CisKK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6ezxpdD5fc3RhY2sucHVzaChuZXcgPGl0Pl9zY29wZSgpKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6ezxpdC5uYW1lPl9zdGFjay5wdXNoKG5ldyA8aXQubmFtZT5fc2NvcGUoKSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJldHVyblR5cGUoKT4gcmV0dmFsID0gbmV3IDxyZXR1cm5UeXBlKCk+KCk7CityZXR2YWwuc3RhcnQgPSBpbnB1dC5MVCgxKTs8XG4+Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8Cis8YS50eXBlPiA8YS5uYW1lPiA9IDxpZihhLmluaXRWYWx1ZSk+PGEuaW5pdFZhbHVlPjxlbHNlPjxpbml0VmFsdWUoYS50eXBlKT48ZW5kaWY+OworfT4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KK2ludCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCA9IGlucHV0LmluZGV4KCk7Cis8ZW5kaWY+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsc10KKyAgICA6ezxsYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc10KKyAgICA6e0xpc3QgbGlzdF88aXQubGFiZWwudGV4dD49bnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPFtydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDpydWxlTGFiZWxEZWYobGFiZWw9aXQpOyBzZXBhcmF0b3I9IlxuIgorPgorPFtydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlcyxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXNdCisgICAgOntMaXN0IGxpc3RfPGl0Pj1uZXcgQXJyYXlMaXN0KCk7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKz4+CisKK3J1bGVSZXR1cm5WYWx1ZSgpIDo6PSA8PAorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+Cis8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5OYW1lPgorPGVsc2U+CityZXR2YWwKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3J1bGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOns8aXQ+X3N0YWNrLnBvcCgpO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7PGl0Lm5hbWU+X3N0YWNrLnBvcCgpO307IHNlcGFyYXRvcj0iXG4iPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpOzxcbj4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCBiYWNrdHJhY2tpbmcgPiAwICkgeyBtZW1vaXplKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCk7IH0KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxydWxlRGVzY3JpcHRvcixibG9jayxtZW1vaXplKSA6Oj0gPDwKK3ZvaWQgbTxydWxlTmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pIHRocm93KGFudGxyMzo6QmFzZVJlY29nbml0aW9uRXhjZXB0aW9uKQoreworPGlmKHRyYWNlKT4KKwlhbnRscjM6OlRyYWNlciB0cmFjZSh0aGlzLCI8cnVsZU5hbWU+Iik7Cis8ZW5kaWY+CisJYW50bHIzOjpDb3VudFNjb3BlIG5lc3RpbmdUcmFja2VyKHRoaXMtPnJ1bGVOZXN0aW5nTGV2ZWwpOworCVN0cmVhbVR5cGUmIGlucHV0KHRoaXMtPmdldElucHV0KCkpOworPGlmKG5ha2VkQmxvY2spPgorCTxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisJPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKwk8YmxvY2s+PFxuPgorPGVsc2U+CisJdG9rZW5pZF90eXBlIHR5cGUgPSA8dG9rZW5QcmVmaXgoKT48cnVsZU5hbWU+OworCWNoYW5uZWxfdHlwZSBjaGFubmVsID0gYW50bHIzOjpUb2tlbjo6REVGQVVMVF9DSEFOTkVMOworCXBvc2l0aW9uX3R5cGUgc3RhcnQoaW5wdXQuZ2V0UG9zaXRpb24oKSk7CisJPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKwk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCTxibG9jaz4KKwk8ISBjcmVhdGUgdG9rZW4gaWYgbm9uZSBleGlzdHMgKmFuZCogd2UgYXJlIGFuIG91dGVybW9zdCB0b2tlbiBydWxlICE+CisJPGV4ZWNBY3Rpb24oe2lmICggdGhpcy0+dG9rZW4gPT0gMCAmJiB0aGlzLT5ydWxlTmVzdGluZ0xldmVsID09IDEgKSB7CisJVG9rZW5UeXBlICp0dCA9IFRva2VuQnVpbGRlcjo6YnVpbGQodHlwZSxzdGFydCxpbnB1dCxjaGFubmVsKTsKKwlzdGQ6OmNvdXQgXDxcPCAoKnR0KSBcPFw8IHN0ZDo6ZW5kbDsKKwl0aGlzLT5lbWl0KHR0KTsKKwl9PFxuPgorfSk+Cis8ZW5kaWY+Cit9Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpbXBsaWNpdGx5LWRlZmluZWQgbGV4ZXIgZ3JhbW1hciBydWxlCisgKiAgdGhhdCBjaG9vc2VzIGJldHdlZW4gbGV4ZXIgcnVsZXMuCisgKi8KK3Rva2Vuc1J1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxhcmdzLGJsb2NrLHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKK3ZvaWQgbVRva2VucygpIHRocm93KGFudGxyMzo6QmFzZVJlY29nbml0aW9uRXhjZXB0aW9uKQoreworCVN0cmVhbVR5cGUmIGlucHV0KHRoaXMtPmdldElucHV0KCkpOworCTxibG9jaz48XG4+Cit9Cis+PgorCisvLyBTIFUgQiBSIFUgTCBFIFMKKworLyoqIEEgKC4uLikgc3VicnVsZSB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworYmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsCisJbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gYmxvY2sgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitkZWNpc2lvbl90eXBlIGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cis8ZGVjaXNpb24+Cis8QHBvc3RkZWNpc2lvbigpPgorPEBwcmVicmFuY2goKT4KK3N3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikgeworICAgIDxhbHRzOmFsdFN3aXRjaENhc2UoKT4KK30KKzxAcG9zdGJyYW5jaCgpPgorPj4KKworLyoqIEEgcnVsZSBibG9jayB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworcnVsZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIHJ1bGVCbG9jayA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK2RlY2lzaW9uX3R5cGUgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+Cit9Cis+PgorCitydWxlQmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gcnVsZUJsb2NrU2luZ2xlQWx0IDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSBzcGVjaWFsIGNhc2Ugb2YgYSAoLi4uKSBzdWJydWxlIHdpdGggYSBzaW5nbGUgYWx0ZXJuYXRpdmUgKi8KK2Jsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSAoLi4pKyBibG9jayB3aXRoIDAgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIHBvc2l0aXZlQ2xvc3VyZUJsb2NrIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorZGVjaXNpb25fdHlwZSBjbnQ8ZGVjaXNpb25OdW1iZXI+PTA7Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK2RvIHsKKwlkZWNpc2lvbl90eXBlIGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47CisJPEBwcmVkZWNpc2lvbigpPgorCTxkZWNpc2lvbj4KKwk8QHBvc3RkZWNpc2lvbigpPgorCXN3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikgeworCTxhbHRzOmFsdFN3aXRjaENhc2UoKT4KKwlkZWZhdWx0IDoKKwkJaWYgKCBjbnQ8ZGVjaXNpb25OdW1iZXI+ID49IDEgKQorCQkJZ290byBsb29wPGRlY2lzaW9uTnVtYmVyPjsKKyAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUoIGlucHV0LmdldFBvc2l0aW9uKCksIDxkZWNpc2lvbk51bWJlcj4gKTsKKwkJCQk8QGVhcmx5RXhpdEV4Y2VwdGlvbigpPgorICAgICAgICAgICAgdGhyb3cgZWVlOworCX0KKwljbnQ8ZGVjaXNpb25OdW1iZXI+Kys7Cit9IHdoaWxlICh0cnVlKTsKK2xvb3A8ZGVjaXNpb25OdW1iZXI+OiA7Cis8QHBvc3Rsb29wKCk+Cis+PgorCitwb3NpdGl2ZUNsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKworLyoqIEEgKC4uKSogYmxvY2sgd2l0aCAxIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitjbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gY2xvc3VyZUJsb2NrIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVsb29wKCk+CitkbyB7CisJZGVjaXNpb25fdHlwZSBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworCTxAcHJlZGVjaXNpb24oKT4KKwk8ZGVjaXNpb24+CisJPEBwb3N0ZGVjaXNpb24oKT4KKwlzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKwk8YWx0czphbHRTd2l0Y2hDYXNlKCk+CisJZGVmYXVsdCA6CisJCWdvdG8gbG9vcDxkZWNpc2lvbk51bWJlcj47CisJfQorfSB3aGlsZSAodHJ1ZSk7Citsb29wPGRlY2lzaW9uTnVtYmVyPjogOworPEBwb3N0bG9vcCgpPgorPj4KKworY2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBjbG9zdXJlQmxvY2sKKworLyoqIE9wdGlvbmFsIGJsb2NrcyAoeCk/IGFyZSB0cmFuc2xhdGVkIHRvICh4fCkgYnkgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbgorICogIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJsb2NrIHRlbXBsYXRlCisgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBIGNhc2UgaW4gYSBzd2l0Y2ggdGhhdCBqdW1wcyB0byBhbiBhbHRlcm5hdGl2ZSBnaXZlbiB0aGUgYWx0ZXJuYXRpdmUKKyAqICBudW1iZXIuICBBIERGQSBwcmVkaWN0cyB0aGUgYWx0ZXJuYXRpdmUgYW5kIHRoZW4gYSBzaW1wbGUgc3dpdGNoCisgKiAgZG9lcyB0aGUganVtcCB0byB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IG1hdGNoZXMgdGhhdCBhbHRlcm5hdGl2ZS4KKyAqLworYWx0U3dpdGNoQ2FzZSgpIDo6PSA8PAorY2FzZSA8aT4gOgorCTxAcHJlYWx0KCk+CisJPGl0PgorCWJyZWFrOzxcbj4KKz4+CisKKy8qKiBBbiBhbHRlcm5hdGl2ZSBpcyBqdXN0IGEgbGlzdCBvZiBlbGVtZW50czsgYXQgb3V0ZXJtb3N0IGxldmVsICovCithbHQoZWxlbWVudHMsYWx0TnVtLGRlc2NyaXB0aW9uLGF1dG9BU1Qsb3V0ZXJBbHQpIDo6PSA8PAorLy8gYWx0IDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworCTxAZGVjbGFyYXRpb25zKCk+CisJPGVsZW1lbnRzOmVsZW1lbnQoKT4KKwk8QGNsZWFudXAoKT4KK30KKz4+CisKKy8vIEUgTCBFIE0gRSBOIFQgUworCisvKiogRHVtcCB0aGUgZWxlbWVudHMgb25lIHBlciBsaW5lICovCitlbGVtZW50KCkgOjo9IDw8CisvLyBlbGVtZW50IDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPEBwcmVtYXRjaCgpPgorPGl0LmVsPjxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIHRva2VuIG9wdGlvbmFsbHkgd2l0aCBhIGxhYmVsIGluIGZyb250ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorLy8gdG9rZW5SZWYKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gaW5wdXQuTFQoMSk7PFxuPgorPGVuZGlmPgordGhpcy0+bWF0Y2goaW5wdXQsPHRva2VuPixGT0xMT1dfPHRva2VuPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPUlEIG5vIEFTVCBidWlsZGluZyAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbCguLi4pPgorPj4KKworbGlzdExhYmVsKGxhYmVsKSA6Oj0gPDwKK2lmIChsaXN0XzxsYWJlbD49PW51bGwpIGxpc3RfPGxhYmVsPj1uZXcgQXJyYXlMaXN0KCk7CitsaXN0XzxsYWJlbD4uYWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciAqLworY2hhclJlZihjaGFyLGxhYmVsKSA6Oj0gPDwKKy8vIGNoYXJSZWYKKzxpZihsYWJlbCk+Cis8dG9rZW5pZF90eXBlKCk+IDxsYWJlbD4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+Cit0aGlzLT5tYXRjaCg8Y2hhcj4pOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciByYW5nZSAqLworY2hhclJhbmdlUmVmKGEsYikgOjo9ICJ0aGlzLT5tYXRjaFJhbmdlKDxhPiw8Yj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPiIKKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGU9IiIpIDo6PSA8PAorLy8gbWF0Y2hTZXQKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gaW5wdXQuTFQoMSk7PFxuPgorPGVuZGlmPgoraWYgKCA8cz4gKQoreworCTxwb3N0bWF0Y2hDb2RlPgorCWlucHV0LmNvbnN1bWUoKTsKKzxpZighTEVYRVIpPgorCWVycm9yUmVjb3Zlcnk9ZmFsc2U7Cis8ZW5kaWY+CisJPGlmKGJhY2t0cmFja2luZyk+ZmFpbGVkPWZhbHNlOzxlbmRpZj4KK30KK2Vsc2UKK3sKKwk8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwlNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZShpbnB1dC5nZXRQb3NpdGlvbigpLGlucHV0LkxBKDEpKTsKKwk8QG1pc21hdGNoZWRTZXRFeGNlcHRpb24oKT4KKzxpZihMRVhFUik+CisJdGhpcy0+cmVjb3Zlcihtc2UpOworPGVsc2U+CisJdGhpcy0+cmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KGlucHV0LG1zZSxGT0xMT1dfc2V0X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4Pik7Cis8ZW5kaWY+CisJdGhyb3cgbXNlOworfTxcbj4KKz4+CisKK21hdGNoU2V0QW5kTGlzdExhYmVsKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogTWF0Y2ggYSBzdHJpbmcgbGl0ZXJhbCAqLworbGV4ZXJTdHJpbmdSZWYoc3RyaW5nLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CisvLyBsZXhlclN0cmluZ1JlZgorPGlmKGxhYmVsKT4KK3Bvc2l0aW9uX3R5cGUgPGxhYmVsPlN0YXJ0KGlucHV0LmdldFBvc2l0aW9uKCkpOwordGhpcy0+bWF0Y2goIDxzdHJpbmc+ICk7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorVG9rZW5UeXBlKiA8bGFiZWw+ID0gVG9rZW5CdWlsZGVyOjpidWlsZChUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUsPGxhYmVsPlN0YXJ0LGlucHV0LFRva2VuLkRFRkFVTFRfQ0hBTk5FTCk7Cis8ZWxzZT4KK3RoaXMtPm1hdGNoKCA8c3RyaW5nPiApOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+Cis8ZW5kaWY+Cis+PgorCit3aWxkY2FyZChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBpbnB1dC5MVCgxKTs8XG4+Cis8ZW5kaWY+Cit0aGlzLT5tYXRjaEFueSggaW5wdXQgKTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogTWF0Y2ggLiB3aWxkY2FyZCAqLword2lsZGNhcmRDaGFyKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzx0b2tlbmlkX3R5cGUoKT4gPGxhYmVsPiA9IGlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK3RoaXMtPm1hdGNoQW55KCk7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKwordG9rZW5pZF90eXBlKCkgOjo9ICI8aWYoTEVYRVIpPmNoYXJfdHlwZTxlbHNlPnRva2VuaWRfdHlwZTxlbmRpZj4iCisKK3dpbGRjYXJkQ2hhckxpc3RMYWJlbChsYWJlbCwgZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx3aWxkY2FyZENoYXIoLi4uKT4KKzxsaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4KKyAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzKSA6Oj0gPDwKK2ZvbGxvd2luZy5wdXNoKEZPTExPV188cnVsZT5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKzxpZihsYWJlbCk+Cis8bGFiZWw+PTxydWxlPig8YXJncz4pOzxcbj4KKzxlbHNlPgorPHJ1bGU+KDxhcmdzPik7PFxuPgorPGVuZGlmPgorZm9sbG93aW5nLnBvcCgpOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPUlEICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3MpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBBIGxleGVyIHJ1bGUgcmVmZXJlbmNlICovCitsZXhlclJ1bGVSZWYocnVsZSxsYWJlbCxhcmdzKSA6Oj0gPDwKKzxpZihsYWJlbCk+Citwb3NpdGlvbl90eXBlIDxsYWJlbD5TdGFydChpbnB1dC5nZXRQb3NpdGlvbigpKTsKK208cnVsZT4oPGFyZ3M+KTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CitUb2tlblR5cGUqIDxsYWJlbD4gPSBUb2tlbkJ1aWxkZXI6OmJ1aWxkKFRva2VuLklOVkFMSURfVE9LRU5fVFlQRSw8bGFiZWw+U3RhcnQsaW5wdXQsVG9rZW4uREVGQVVMVF9DSEFOTkVMKTsKKzxlbHNlPgorbTxydWxlPig8YXJncz4pOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKz4+CisKKy8qKiBFT0YgaW4gdGhlIGxleGVyICovCitsZXhlck1hdGNoRU9GKGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Citwb3NpdGlvbl90eXBlIDxsYWJlbD5TdGFydChpbnB1dC5nZXRQb3NpdGlvbigpKTsKK21hdGNoKEVPRik7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorVG9rZW5UeXBlKiA8bGFiZWw+ID0gVG9rZW5CdWlsZGVyOjpidWlsZChUb2tlbi5FT0YsPGxhYmVsPlN0YXJ0LGlucHV0LFRva2VuLkRFRkFVTFRfQ0hBTk5FTCk7Cis8ZWxzZT4KK21hdGNoKEVPRik7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0KSA6Oj0gPDwKKzxyb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIGlucHV0LkxBKDEpPT1hbnRscjM6OlRva2VuOjpET1dOICkgeworICAgIG1hdGNoKGlucHV0LCBhbnRscjM6OlRva2VuOjpET1dOLCBudWxsKTsKKyAgICA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgbWF0Y2goaW5wdXQsIGFudGxyMzo6VG9rZW46OlVQLCBudWxsKTsKKyAgICA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CittYXRjaChpbnB1dCwgYW50bHIzOjpUb2tlbjo6RE9XTiwgbnVsbCk7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGNoaWxkcmVuOmVsZW1lbnQoKT4KK21hdGNoKGlucHV0LCBhbnRscjM6OlRva2VuOjpVUCwgbnVsbCk7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIEV2ZXJ5IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdmFsaWRhdGluZyBwcmVkaWNhdGUgKGV2ZW4gd2hlbiBpdCBpcworICogIGFsc28gaG9pc3RlZCBpbnRvIGEgcHJlZGljdGlvbiBleHByZXNzaW9uKS4KKyAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2lmICggISg8ZXZhbFByZWRpY2F0ZSguLi4pPikgKSB7CisJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgIjxydWxlTmFtZT4iLCAiPGRlc2NyaXB0aW9uPiIpOworfQorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKGlmLXRoZW4tZWxzZSkKK2RmYVN0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKKzxpZighc2VtUHJlZFN0YXRlKT4KKzx0b2tlbmlkX3R5cGUoKT4gTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSg8az4pOzxcbj4KKzxlbmRpZj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KK2Vsc2UKK3sKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisJYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47PFxuPgorPGVsc2U+CisJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZShpbnB1dC5nZXRQb3NpdGlvbigpLCAiPGRlc2NyaXB0aW9uPiIsIDxkZWNpc2lvbk51bWJlcj4sIDxzdGF0ZU51bWJlcj4pOzxcbj4KKwk8QG5vVmlhYmxlQWx0RXhjZXB0aW9uKCk+CisJdGhyb3cgbnZhZTs8XG4+Cis8ZW5kaWY+Cit9Cis+PgorCisvKiogU2FtZSBhcyBhIG5vcm1hbCBERkEgc3RhdGUgZXhjZXB0IHRoYXQgd2UgZG9uJ3QgZXhhbWluZSBsb29rYWhlYWQKKyAqICBmb3IgdGhlIGJ5cGFzcyBhbHRlcm5hdGl2ZS4gIEl0IGRlbGF5cyBlcnJvciBkZXRlY3Rpb24gYnV0IHRoaXMKKyAqICBpcyBmYXN0ZXIsIHNtYWxsZXIsIGFuZCBtb3JlIHdoYXQgcGVvcGxlIGV4cGVjdC4gIEZvciAoWCk/IHBlb3BsZQorICogIGV4cGVjdCAiaWYgKCBMQSgxKT09WCApIG1hdGNoKFgpOyIgYW5kIHRoYXQncyBpdC4KKyAqLworZGZhT3B0aW9uYWxCbG9ja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKKzxpZighc2VtUHJlZFN0YXRlKT4KKzx0b2tlbmlkX3R5cGUoKT4gTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSg8az4pOworPGVuZGlmPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorPj4KKworLyoqIEEgREZBIHN0YXRlIHRoYXQgaXMgYWN0dWFsbHkgdGhlIGxvb3BiYWNrIGRlY2lzaW9uIG9mIGEgY2xvc3VyZQorICogIGxvb3AuICBJZiBlbmQtb2YtdG9rZW4gKEVPVCkgcHJlZGljdHMgYW55IG9mIHRoZSB0YXJnZXRzIHRoZW4gaXQKKyAqICBzaG91bGQgYWN0IGxpa2UgYSBkZWZhdWx0IGNsYXVzZSAoaS5lLiwgbm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCkuCisgKiAgVGhpcyBpcyB1c2VkIG9ubHkgaW4gdGhlIGxleGVyIHNvIHRoYXQgZm9yICgnYScpKiBvbiB0aGUgZW5kIG9mIGEgcnVsZQorICogIGFueXRoaW5nIG90aGVyIHRoYW4gJ2EnIHByZWRpY3RzIGV4aXRpbmcuCisgKi8KK2RmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorPGlmKCFzZW1QcmVkU3RhdGUpPgorPHRva2VuaWRfdHlwZSgpPiBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LkxBKDxrPik7Cis8ZW5kaWY+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KK2Vsc2UKK3sKKwlhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKK308XG4+Cis8ZW5kaWY+Cis+PgorCisvKiogQW4gYWNjZXB0IHN0YXRlIGluZGljYXRlcyBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBoYXMgYmVlbiBwcmVkaWN0ZWQgKi8KK2RmYUFjY2VwdFN0YXRlKGFsdCkgOjo9ICJhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGFsdD47IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KQoreworCTx0YXJnZXRTdGF0ZT4KK30KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChzd2l0Y2ggY2FzZSkKKworLyoqIEEgREZBIHN0YXRlIHdoZXJlIGEgU1dJVENIIG1heSBiZSBnZW5lcmF0ZWQuICBUaGUgY29kZSBnZW5lcmF0b3IKKyAqICBkZWNpZGVzIGlmIHRoaXMgaXMgcG9zc2libGU6IENvZGVHZW5lcmF0b3IuY2FuR2VuZXJhdGVTd2l0Y2goKS4KKyAqLworZGZhU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoICggaW5wdXQuTEEoPGs+KSApIHsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+CitkZWZhdWx0OgorPGlmKGVvdFByZWRpY3RzQWx0KT4KKwlhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKKzxlbHNlPgorCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUoIGlucHV0LmdldFBvc2l0aW9uKCksICI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiApOzxcbj4KKwk8QG5vVmlhYmxlQWx0RXhjZXB0aW9uKCk+CisJdGhyb3cgbnZhZTs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoIGlucHV0LkxBKDxrPikgKSB7CisJPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KK308XG4+Cis+PgorCitkZmFMb29wYmFja1N0YXRlU3dpdGNoKGssIGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKCBpbnB1dC5MQSg8az4pICkgeworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj48XG4+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorZGVmYXVsdDoKKwlhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKKwlicmVhazs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhRWRnZVN3aXRjaChsYWJlbHMsIHRhcmdldFN0YXRlKSA6Oj0gPDwKKzxsYWJlbHM6e2Nhc2UgPGl0Pjp9OyBzZXBhcmF0b3I9IlxuIj4geworCTx0YXJnZXRTdGF0ZT4KK30gYnJlYWs7Cis+PgorCisvLyBDIHkgYyBsIGkgYyAgRCBGIEEKKworLyoqIFRoZSBjb2RlIHRvIGluaXRpYXRlIGV4ZWN1dGlvbiBvZiBhIGN5Y2xpYyBERkE7IHRoaXMgaXMgdXNlZAorICogIGluIHRoZSBydWxlIHRvIHByZWRpY3QgYW4gYWx0IGp1c3QgbGlrZSB0aGUgZml4ZWQgREZBIGNhc2UuCisgKiAgVGhlIDxuYW1lPiBhdHRyaWJ1dGUgaXMgaW5oZXJpdGVkIHZpYSB0aGUgcGFyc2VyLCBsZXhlciwgLi4uCisgKi8KK2RmYURlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIGRmYURlY2lzaW9uCithbHQ8ZGVjaXNpb25OdW1iZXI+ID0gcHJlZGljdERGQTxkZWNpc2lvbk51bWJlcj4oaW5wdXQpOworPj4KKworLyoqIFRoZSBvdmVyYWxsIGN5Y2xpYyBERkEgY2h1bms7IGNvbnRhaW5zIGFsbCB0aGUgREZBIHN0YXRlcyAqLworY3ljbGljREZBKGRmYSkgOjo9IDw8CisvKiBjeWNsaWNERkE9PGRmYT4KKyovCisvLyBjeWNsaWMgICAgPSA8ZGZhLmN5Y2xpYz4KKy8vIG51bXN0YXRlcyA9IDxkZmEubnVtYmVyT2ZTdGF0ZXM+CisKKy8vIHN0YXJ0U3RhdGUgPSA8ZGZhLnN0YXJ0U3RhdGU+CisvLyBzdGFydFN0YXRlLm51bWJlck9mVHJhbnNpdGlvbnMgPSA8ZGZhLnN0YXJ0U3RhdGUuTnVtYmVyT2ZUcmFuc2l0aW9ucz4KKy8vIHN0YXJ0U3RhdGUubG9va2FoZWFkRGVwdGggPSA8ZGZhLnN0YXJ0U3RhdGUuTG9va2FoZWFkRGVwdGg+CisKK2NvbnN0IHN0YXRpYyBzaG9ydCA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb3RbPGRmYS5udW1iZXJPZlN0YXRlcz5dID0geworCTxkZmEuZW90OyB3cmFwPSJcbiAgICAgIiwgc2VwYXJhdG9yPSIsIiwgbnVsbD0iLTEiPgorfTsKK2NvbnN0IHN0YXRpYyBzaG9ydCA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2ZbPGRmYS5udW1iZXJPZlN0YXRlcz5dID0geworCTxkZmEuZW9mOyB3cmFwPSJcbiAgICAgIiwgc2VwYXJhdG9yPSIsIiwgbnVsbD0iLTEiPgorfTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIDxuYW1lPmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbls8ZGZhLm51bWJlck9mU3RhdGVzPl0gPSB7CisJPGRmYS5taW47IHdyYXA9IlxuICAgICAiLCBzZXBhcmF0b3I9IiwiLCBudWxsPSIwIj4KK307Citjb25zdCBzdGF0aWMgdW5pY2hhciA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9tYXhbPGRmYS5udW1iZXJPZlN0YXRlcz5dID0geworCTxkZmEubWF4OyB3cmFwPSJcbiAgICAgIiwgc2VwYXJhdG9yPSIsIiwgbnVsbD0iMCI+Cit9OworY29uc3Qgc3RhdGljIHNob3J0IDxuYW1lPmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdFs8ZGZhLm51bWJlck9mU3RhdGVzPl0gPSB7CisJPGRmYS5hY2NlcHQ7IHdyYXA9IlxuICAgICAiLCBzZXBhcmF0b3I9IiwiLCBudWxsPSItMSI+Cit9OworY29uc3Qgc3RhdGljIHNob3J0IDxuYW1lPmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWxbPGRmYS5udW1iZXJPZlN0YXRlcz5dID0geworCTxkZmEuc3BlY2lhbDsgd3JhcD0iXG4gICAgICIsIHNlcGFyYXRvcj0iLCIsIG51bGw9Ii0xIj4KK307Cis8ZGZhLmVkZ2VUcmFuc2l0aW9uQ2xhc3NNYXAua2V5czp7IHRhYmxlIHwKK2NvbnN0IHN0YXRpYyBzaG9ydCA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uPGkwPltdID0geworCTx0YWJsZTsgc2VwYXJhdG9yPSIsICIsIHdyYXA9IlxuCSIsIG51bGw9Ii0xIj4KK307Cit9OyBudWxsPSIiPgorY29uc3Qgc3RhdGljIHNob3J0IDxuYW1lPmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25bXSA9IHsKKwk8ZGZhLnRyYW5zaXRpb25FZGdlVGFibGVzOnt3aGljaFRhYmxlfDxuYW1lPmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb248d2hpY2hUYWJsZT4sfTsgc2VwYXJhdG9yPSJcbiIsIG51bGw9IjAgLyogZml4bWU/ICovIj4KK307CisJPCEgYWRkIGF0dHJpYnV0ZSBmb3IgdGhlIERGQSAhPgorCURGQVw8Y2hhcl90eXBlPiBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPjsKKzwhIHRoaXMgc2hvdWxkIGdvIGluIHRoZSBpbml0aWFsaXplciBvZiB0aGUgdGhpbmcKKy0gKGlkKSBpbml0Cit7CisJaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSAhPSBuaWwpIHsKKwkJZW90ID0gPG5hbWU+ZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OworCQllb2YgPSA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2Y7CisJCW1pbiA9IDxuYW1lPmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbjsKKwkJbWF4ID0gPG5hbWU+ZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OworCQlhY2NlcHQgPSA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQ7CisJCXNwZWNpYWwgPSA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsOworCQlpZiAoISh0cmFuc2l0aW9uID0gY2FsbG9jKDxkZmEubnVtYmVyT2ZTdGF0ZXM+LCBzaXplb2Yodm9pZCopKSkpIHsKKwkJCVtzZWxmIHJlbGVhc2VdOworCQkJcmV0dXJuIG5pbDsKKwkJfQorCQk8ZGZhLnRyYW5zaXRpb25FZGdlVGFibGVzOnt3aGljaFRhYmxlfHRyYW5zaXRpb25bPGkwPl0gPSA8bmFtZT5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uPHdoaWNoVGFibGU+O307IHNlcGFyYXRvcj0iXG4iLCBudWxsPSIiPgorCX0KKwlyZXR1cm4gc2VsZjsKK30KKyE+CisKKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KK2ludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKCBpbnQgc3RhdGUgKQoreworCWludCBzID0gc3RhdGU7CisJc3dpdGNoICggcyApIHsKKyAJCTxkZmEuc3BlY2lhbFN0YXRlU1RzOntzdGF0ZSB8CisJCWNhc2UgPGkwPiA6IDwhIGNvbXByZXNzZWQgc3BlY2lhbCBzdGF0ZSBudW1iZXJzIDAuLm4tMSAhPgorCQk8c3RhdGU+fTsgc2VwYXJhdG9yPSJcbiI+CisJfQorPGlmKGJhY2t0cmFja2luZyk+CisJaWYgKCByZWNvZ25pemVyLmlzQmFja3RyYWNraW5nKCkgKSB7CisJCXJlY29nbml6ZXIuc2V0RmFpbGVkKCk7CisJCXJldHVybiAtMTsKKwl9PFxuPgorPGVuZGlmPgorCW5vVmlhYmxlQWx0KHMsIGlucHV0KTsKK308XG4+Cis8ZW5kaWY+CisKKworPFxuPgorCisvLyA8ZGZhLmRlc2NyaXB0aW9uPgorZGVjaXNpb25fdHlwZSBwcmVkaWN0REZBPGRmYS5kZWNpc2lvbk51bWJlcj4oIFN0cmVhbVR5cGUmIGlucHV0ICkKK3sKKwkvKiBtYXJrIGN1cnJlbnQgbG9jYXRpb24gKHJld2luZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHJld2luZGVyIGdvZXMKKwkgKiBvdXQgb2Ygc2NvcGUgKi8KKwlhbnRscjM6OlJld2luZGVyXDxwb3NpdGlvbl90eXBlPiBtYXJrUG9pbnQoaW5wdXQuZ2V0UG9zaXRpb24oKSk7CisJZ290byBzMDsJLy8gZ290byBzdGFydC4uLgorCS8vIC4uLgorCXRocm93IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCBpbnB1dC5nZXRQb3NpdGlvbigpLCAiPGRmYS5kZXNjcmlwdGlvbj4iLCA8ZGZhLmRlY2lzaW9uTnVtYmVyPiwgMCAvKiBmaXhtZSAqLyApOzxcbj4KK308XG4+Cis+PgorCisvKiogQSBzdGF0ZSBpbiBhIGN5Y2xpYyBERkEgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAorLy8gY3ljbGljREZBU3RhdGUKK3M8c3RhdGVOdW1iZXI+OiB7CisJPGlmKHNlbVByZWRTdGF0ZSk+CisJaW5wdXQucmV3aW5kKCk7PFxuPgorCTxlbHNlPgorCTx0b2tlbmlkX3R5cGUoKT4gTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSgxKTsKKwk8ZW5kaWY+CisJPGVkZ2VzPgorCTxpZihuZWVkRXJyb3JDbGF1c2UpPgorCXRocm93IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCBpbnB1dC5nZXRQb3NpdGlvbigpLCAiPGRlc2NyaXB0aW9uPiIsIDxkZWNpc2lvbk51bWJlcj4sIDxzdGF0ZU51bWJlcj4gKTs8XG4+CisJPGVuZGlmPjxcbj4KK308XG4+Cis+PgorCisvKiogSnVzdCBsaWtlIGEgZml4ZWQgREZBIGVkZ2UsIHRlc3QgdGhlIGxvb2thaGVhZCBhbmQgaW5kaWNhdGUgd2hhdAorICogIHN0YXRlIHRvIGp1bXAgdG8gbmV4dCBpZiBzdWNjZXNzZnVsLgorICovCitjeWNsaWNERkFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGVOdW1iZXIsIGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorLy8gY3ljbGljREZBRWRnZQoraWYgKCAoPGxhYmVsRXhwcj4pIDxpZihwcmVkaWNhdGVzKT4mJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pCit7CisJaW5wdXQuY29uc3VtZSgpOworCWdvdG8gczx0YXJnZXRTdGF0ZU51bWJlcj47Cit9PFxuPgorPj4KKworLyoqIEFuIGVkZ2UgcG9pbnRpbmcgYXQgZW5kLW9mLXRva2VuOyBlc3NlbnRpYWxseSBtYXRjaGVzIGFueSBjaGFyOworICogIGFsd2F5cyBqdW1wIHRvIHRoZSB0YXJnZXQuCisgKi8KK2VvdERGQUVkZ2UodGFyZ2V0U3RhdGVOdW1iZXIsZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9ICJnb3RvIHM8dGFyZ2V0U3RhdGVOdW1iZXI+OyIKKworLy8gRCBGIEEgIEUgWCBQIFIgRSBTIFMgSSBPIE4gUworCithbmRQcmVkaWNhdGVzKGxlZnQscmlnaHQpIDo6PSAiKDxsZWZ0PiAmJiA8cmlnaHQ+KSIKKworb3JQcmVkaWNhdGVzKG9wZXJhbmRzKSA6Oj0gIig8Zmlyc3Qob3BlcmFuZHMpPjxyZXN0KG9wZXJhbmRzKTp7byB8IHx8PG8+fT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxwcmVkPikiCisKK2V2YWxQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICI8cHJlZD4iCisKK2V2YWxTeW5QcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICI8cHJlZD4oKSIKKworbG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gIkxBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+PT08YXRvbT4iCisKKy8qKiBTb21ldGltZXMgYSBsb29rYWhlYWQgdGVzdCBjYW5ub3QgYXNzdW1lIHRoYXQgTEEoaykgaXMgaW4gYSB0ZW1wIHZhcmlhYmxlCisgKiAgc29tZXdoZXJlLiAgTXVzdCBhc2sgZm9yIHRoZSBsb29rYWhlYWQgZGlyZWN0bHkuCisgKi8KK2lzb2xhdGVkTG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gImlucHV0LkxBKDxrPik9PTxhdG9tPiIKKworbG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLHVwcGVyLGsscmFuZ2VOdW1iZXIsbG93ZXJBc0ludCx1cHBlckFzSW50KSA6Oj0gPDwKKyhMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPlw+PTxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj5cPD08dXBwZXI+KQorPj4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSAiKGlucHV0LkxBKDxrPilcPj08bG93ZXI+ICYmIGlucHV0LkxBKDxrPilcPD08dXBwZXI+KSIKKworc2V0VGVzdChyYW5nZXMpIDo6PSAiPHJhbmdlczsgc2VwYXJhdG9yPVwifHxcIj4iCisKKy8vIEEgVCBUIFIgSSBCIFUgVCBFIFMKKworZ2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyA8c2NvcGUubmFtZT4geworICAgIDxzY29wZS5hdHRyaWJ1dGVzOns8aXQuZGVjbD47fTsgc2VwYXJhdG9yPSJcbiI+Cit9Citwcm90ZWN0ZWQgU3RhY2sgPHNjb3BlLm5hbWU+X3N0YWNrID0gbmV3IFN0YWNrKCk7PFxuPgorPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK3Byb3RlY3RlZCBzdGF0aWMgY2xhc3MgPHNjb3BlLm5hbWU+X3Njb3BlIHsKKyAgICA8c2NvcGUuYXR0cmlidXRlczp7PGl0LmRlY2w+O307IHNlcGFyYXRvcj0iXG4iPgorfQorcHJvdGVjdGVkIFN0YWNrIDxzY29wZS5uYW1lPl9zdGFjayA9IG5ldyBTdGFjaygpOzxcbj4KKzxlbmRpZj4KKz4+CisKK3JldHVyblR5cGUoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cnVsZURlc2NyaXB0b3IubmFtZT5fcmV0dXJuCis8ZWxzZT4KKzxpZihydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuVHlwZT4KKzxlbHNlPgordm9pZAorPGVuZGlmPgorPGVuZGlmPgorPj4KKworcnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZSkgOjo9IDw8Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJlZmVyZW5jZWRSdWxlLm5hbWU+X3JldHVybgorPGVsc2U+Cis8aWYocmVmZXJlbmNlZFJ1bGUuc2luZ2xlVmFsdWVSZXR1cm5UeXBlKT4KKzxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBVc2luZyBhIHR5cGUgdG8gaW5pdCB2YWx1ZSBtYXAsIHRyeSB0byBpbml0IGEgdHlwZTsgaWYgbm90IGluIHRhYmxlCisgKiAgbXVzdCBiZSBhbiBvYmplY3QsIGRlZmF1bHQgdmFsdWUgaXMgIm51bGwiLgorICovCitpbml0VmFsdWUodHlwZU5hbWUpIDo6PSA8PAorPGphdmFUeXBlSW5pdE1hcC4odHlwZU5hbWUpPgorPj4KKworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPDwKKzxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKT4gPGxhYmVsLmxhYmVsLnRleHQ+ID0gPGluaXRWYWx1ZSh0eXBlTmFtZT1ydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKSk+Ozxcbj4KKz4+CisKK3JldHVyblNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitwdWJsaWMgc3RhdGljIGNsYXNzIDxyZXR1cm5UeXBlKCk+IHsKKyAgICA8bGFiZWxUeXBlPiBzdGFydCwgc3RvcDsKKzxpZihidWlsZEFTVCk+CisgICAgPEFTVExhYmVsVHlwZT4gdHJlZTsKKzxlbHNlPgorPGlmKGJ1aWxkVGVtcGxhdGUpPgorICAgIFN0cmluZ1RlbXBsYXRlIHN0OworPGVuZGlmPgorPGVuZGlmPgorICAgIDxzY29wZS5hdHRyaWJ1dGVzOns8aXQuZGVjbD47fTsgc2VwYXJhdG9yPSJcbiI+Cit9OworPGVuZGlmPgorPj4KKworcGFyYW1ldGVyU2NvcGUoc2NvcGUpIDo6PSA8PAorPHNjb3BlLmF0dHJpYnV0ZXM6ezxpdC5kZWNsPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworLyoqIFVzZWQgaW4gY29kZWdlbi5nIHRvIHRyYW5zbGF0ZSAkeC55IHJlZmVyZW5jZXMuCisgKiAgSSBjb3VsZCBoYXZlIGxlZnQgYWN0aW9ucyBhcyBTdHJpbmdUZW1wbGF0ZXMgdG8gYmUgaW5zZXJ0ZWQgaW4KKyAqICB0aGUgb3V0cHV0IChzbyB0aGV5IGNvdWxkIHVzZSBhdHRyaWJ1dGVzIGluaGVyaXRlZCBmcm9tIHN1cnJvdW5kaW5nCisgKiAgdGVtcGxhdGVzKSwgYnV0IHJlYWxseSB3YW50ZWQgdG8gcGFzcyBpbiBBdHRyaWJ1dGVTY29wZSBhbmQgQXR0cmlidXRlCisgKiAgb2JqZWN0cyBzbyB0aGlzIHRyYW5zbGF0aW9uIGNvdWxkIHF1ZXJ5IHRoZW0uICBTbywgdHJhbnNsYXRpb24gb2YKKyAqICAkeC55IHRvIGV4ZWN1dGFibGUgY29kZSBvY2N1cnMgYmVmb3JlIHJlY29nbml6ZXJTVC50b1N0cmluZygpIG9jY3Vycy4KKyAqICBJLmUuLCBhY3Rpb25zIGFyZSBqdXN0IHRleHQgc3RyaW5ncyBkdXJpbmcgZmluYWwgY29kZSBnZW5lcmF0aW9uLgorICovCitnbG9iYWxBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cikgOjo9IDw8CisoKDxzY29wZT4pPHNjb3BlPl9zdGFjay5wZWVrKCkpLjxhdHRyLm5hbWU+Cis+PgorCitwYXJhbWV0ZXJBdHRyaWJ1dGVSZWYoYXR0cikgOjo9ICI8YXR0ci5uYW1lPiIKKworc2NvcGVBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixpbmRleCxuZWdJbmRleCkgOjo9IDw8Cis8aWYobmVnSW5kZXgpPgorKCg8c2NvcGU+X3Njb3BlKTxzY29wZT5fc3RhY2suZWxlbWVudEF0KDxzY29wZT5fc3RhY2suc2l6ZSgpLTxuZWdJbmRleD4tMSkpLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKzxpZihpbmRleCk+CisoKDxzY29wZT5fc2NvcGUpPHNjb3BlPl9zdGFjay5lbGVtZW50QXQoPGluZGV4PikpLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKygoPHNjb3BlPl9zY29wZSk8c2NvcGU+X3N0YWNrLnBlZWsoKSkuPGF0dHIubmFtZT4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiAkeCBpcyBlaXRoZXIgZ2xvYmFsIHNjb3BlIG9yIHggaXMgcnVsZSB3aXRoIGR5bmFtaWMgc2NvcGU7IHJlZmVycworICogIHRvIHN0YWNrIGl0c2VsZiBub3QgdG9wIG9mIHN0YWNrLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByZWRpY2F0ZXMKKyAqICBsaWtlIHskZnVuY3Rpb24uc2l6ZSgpPjAgJiYgJGZ1bmN0aW9uOjpuYW1lLmVxdWFscygiZm9vIil9PworICovCitpc29sYXRlZER5bmFtaWNTY29wZVJlZihzY29wZSkgOjo9ICI8c2NvcGU+X3N0YWNrIgorCisvKiogcmVmZXJlbmNlIGFuIGF0dHJpYnV0ZSBvZiBydWxlOyBtaWdodCBvbmx5IGhhdmUgc2luZ2xlIHJldHVybiB2YWx1ZSAqLworcnVsZUxhYmVsUmVmKHJlZmVyZW5jZWRSdWxlLHNjb3BlLGF0dHIpIDo6PSA8PAorPGlmKHJlZmVyZW5jZWRSdWxlLnNpbmdsZVZhbHVlUmV0dXJuVHlwZSk+Cis8c2NvcGU+Cis8ZWxzZT4KKzxzY29wZT4uPGF0dHIubmFtZT4KKzxlbmRpZj4KKz4+CisKK3JldHVybkF0dHJpYnV0ZVJlZihydWxlRGVzY3JpcHRvcixhdHRyKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGUpPgorPGF0dHIubmFtZT4KKzxlbHNlPgorcmV0dmFsLjxhdHRyLm5hbWU+Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIHRyYW5zbGF0ZSAkdG9rZW5MYWJlbCAqLwordG9rZW5MYWJlbFJlZihsYWJlbCkgOjo9ICI8bGFiZWw+IgorCisvKiogaWRzKz1JRCB7JGlkc30gb3IgZSs9ZXhwciB7JGV9ICovCitsaXN0TGFiZWxSZWYobGFiZWwpIDo6PSAibGlzdF88bGFiZWw+IgorCisvLyBub3Qgc3VyZSB0aGUgbmV4dCBhcmUgdGhlIHJpZ2h0IGFwcHJvYWNoOyBhbmQgdGhleSBhcmUgZXZhbHVhdGVkIGVhcmx5OworLy8gdGhleSBjYW5ub3Qgc2VlIFRSRUVfUEFSU0VSIG9yIFBBUlNFUiBhdHRyaWJ1dGVzIGZvciBleGFtcGxlLiA6KAorCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uZ2V0VGV4dCgpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldFR5cGUoKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRMaW5lKCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRDaGFubmVsKCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldFRva2VuSW5kZXgoKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPl90cmVlIgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uc3RhcnQiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5zdG9wIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4udHJlZSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJpbnB1dC50b1N0cmluZyg8c2NvcGU+LnN0YXJ0LDxzY29wZT4uc3RvcCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uc3QiCisKKy8qKiBJc29sYXRlZCAkUlVMRSByZWYgb2sgaW4gbGV4ZXIgYXMgaXQncyBhIFRva2VuICovCitsZXhlclJ1bGVMYWJlbChsYWJlbCkgOjo9ICI8bGFiZWw+IgorCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldFR5cGUoKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uZ2V0TGluZSgpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldENoYXJQb3NpdGlvbkluTGluZSgpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRDaGFubmVsKCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRUb2tlbkluZGV4KCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldFRleHQoKSIKKworLy8gU29tZWJvZHkgbWF5IHJlZiAkdGVtcGxhdGUgb3IgJHRyZWUgb3IgJHN0b3Agd2l0aGluIGEgcnVsZToKK3J1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIigoPGxhYmVsVHlwZT4pcmV0dmFsLnN0YXJ0KSIKK3J1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKCg8bGFiZWxUeXBlPilyZXR2YWwuc3RvcCkiCitydWxlUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIigoPEFTVExhYmVsVHlwZT4pcmV0dmFsLnRyZWUpIgorcnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJpbnB1dC50b1N0cmluZyhyZXR2YWwuc3RhcnQsaW5wdXQuTFQoLTEpKSIKK3J1bGVQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5zdCIKKworLy8gQSBDIFQgSSBPIE4gUworCitlbWl0KHR5cGUpIDo6PSAiZW1pdCg8dHlwZT4pOyIKKworc2V0VHlwZSh0eXBlKSA6Oj0gInNldFR5cGUoPHR5cGU+KTsiCisKKy8qKiBIb3cgdG8gZXhlY3V0ZSBhbiBhY3Rpb24gKi8KK2V4ZWNBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZSk+CitpZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkKK3sKKwk8YWN0aW9uPgorfQorPGVsc2U+CitpZiAoIGJhY2t0cmFja2luZyA9PSAwICkKK3sKKwk8YWN0aW9uPgorfQorPGVuZGlmPgorPGVsc2U+Cis8YWN0aW9uPgorPGVuZGlmPgorPj4KKworLy8gTSBJIFMgQyAocHJvcGVydGllcywgZXRjLi4uKQorCitiaXRzZXQobmFtZSwgd29yZHM2NCkgOjo9IDw8CitwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCA8bmFtZT4gPSBuZXcgQml0U2V0KG5ldyBsb25nW117PHdvcmRzNjQ6ezxpdD5MfTtzZXBhcmF0b3I9IiwiPn0pOzxcbj4KKz4+CisKK3Rva2VuUHJlZml4KCkgOjo9ICJUT0tfIgorY29kZUZpbGVFeHRlbnNpb24oKSA6Oj0gIi5jcHAiCisvLyB1c2VkIGluIENQUFRhcmdldC5qYXZhIHRvIGdlbmVyYXRlIHRoZSBoZWFkZXJmaWxlIGV4dGVuc2lvbgoraGVhZGVyRmlsZUV4dGVuc2lvbigpIDo6PSAiLmgiCisKK3RydWUoKSA6Oj0gInRydWUiCitmYWxzZSgpIDo6PSAiZmFsc2UiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDIvQVNULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9BU1Quc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmRlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDIvQVNULnN0ZwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEpvaGFubmVzIEx1YmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwKKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitAb3V0cHV0RmlsZS5pbXBvcnRzKCkgOjo9IDw8Cis8QHN1cGVyLmltcG9ydHMoKT4KKworPGlmKCFUUkVFX1BBUlNFUik+Cis8ISB0cmVlIHBhcnNlciB3b3VsZCBhbHJlYWR5IGhhdmUgaW1wb3J0ZWQgIT4KK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKK3VzaW5nIFJld3JpdGVSdWxlSVRva2VuU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLlJld3JpdGVSdWxlVG9rZW5TdHJlYW07Cis8ZW5kaWY+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8QHN1cGVyLm1lbWJlcnMoKT4KKzxwYXJzZXJNZW1iZXJzKCk+Cis+PgorCitwYXJzZXJDdG9yQm9keSgpIDo6PSA8JQorPHN1cGVyLnBhcnNlckN0b3JCb2R5KCk+PFxuPgorVHJlZUFkYXB0b3IgPSAKKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkudHJlZUFkYXB0b3JJbml0aWFsaXplcik+CisJPGFjdGlvbnMuKGFjdGlvblNjb3BlKS50cmVlQWRhcHRvckluaXRpYWxpemVyPgorPGVsc2U+CisJbmV3IDxhY3Rpb25zLihhY3Rpb25TY29wZSkudHJlZUFkYXB0b3JUeXBlOyBudWxsPSJDb21tb25UcmVlQWRhcHRvciI+KCkKKzxlbmQ+Cis7CislPgorCisvKiogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK3BhcnNlck1lbWJlcnMoKSA6Oj0gPDwKK3ByaXZhdGUgPHRyZWVBZGFwdG9yVHlwZSgpPiBhZGFwdG9yOworCitwdWJsaWMgPHRyZWVBZGFwdG9yVHlwZSgpPiBUcmVlQWRhcHRvcgoreworCWdldAorCXsKKwkJcmV0dXJuIGFkYXB0b3I7CisJfQorCisJc2V0CisJeworCQl0aGlzLmFkYXB0b3IgPSB2YWx1ZTsKKwkJPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPi5UcmVlQWRhcHRvciA9IHRoaXMuYWRhcHRvcjt9PgorCX0KK30KKz4+CisKK3RyZWVBZGFwdG9yVHlwZSgpIDo6PSA8PAorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS50cmVlQWRhcHRvclR5cGU7IG51bGw9IklUcmVlQWRhcHRvciI+Cis+PgorCitydWxlUmV0dXJuQmFzZVR5cGUoKSA6Oj0gPCUKK0FzdDxpZihUUkVFX1BBUlNFUik+VHJlZTxlbHNlPlBhcnNlcjxlbmRpZj5SdWxlUmV0dXJuU2NvcGVcPDxBU1RMYWJlbFR5cGU+LCA8bGFiZWxUeXBlPj4KKyU+CisKKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBydWxlJ3MgcmV0dXJuIEFTVCAqLworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KKzxBU1RMYWJlbFR5cGU+IHJvb3RfMCA9IGRlZmF1bHQoPEFTVExhYmVsVHlwZT4pOzxcbj4KKz4+CisKK3J1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlTGFiZWxEZWZzKCk+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorCTp7aXR8PEFTVExhYmVsVHlwZT4gPGl0LmxhYmVsLnRleHQ+X3RyZWUgPSBkZWZhdWx0KDxBU1RMYWJlbFR5cGU+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHM6e2l0fDxBU1RMYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pl90cmVlID0gZGVmYXVsdCg8QVNUTGFiZWxUeXBlPik7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IuYWxsVG9rZW5SZWZzSW5BbHRzV2l0aFJld3JpdGVzCisJOntpdHxSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtKGFkYXB0b3IsInRva2VuIDxpdD4iKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlcworCTp7aXR8UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSA8aXQ+Iik7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCisvKiogV2hlbiBkb2luZyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24sIHdlIG11c3QgZGVmaW5lIHNvbWUgdmFyaWFibGVzOworICogIFRoZXNlIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGlmIGRvaW5nIHJld3JpdGVzLiAgVGhpcyBtdXN0IGJlIGEgIm1vZGUiCisgKiAgYXMgYSBydWxlIGNvdWxkIGhhdmUgYm90aCByZXdyaXRlIGFuZCBBU1Qgd2l0aGluIHRoZSBzYW1lIGFsdGVybmF0aXZlCisgKiAgYmxvY2suCisgKi8KK0BhbHQuZGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYoYXV0b0FTVCk+Cis8aWYob3V0ZXJBbHQpPgorPGlmKCFyZXdyaXRlTW9kZSk+Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5OaWwoKTsKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8vIFQgciBhIGMgayBpIG4gZyAgUiB1IGwgZSAgRSBsIGUgbSBlIG4gdCBzCisKKy8qKiBJRCBhbmQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZSAqLwordG9rZW5SZWZUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4gPCEgVHJhY2sgaW1wbGllcyBubyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24hPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+c3RyZWFtXzx0b2tlbj4uQWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBpZHMrPUlEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlOyBhZGRzIHRvIGlkcyAqYW5kKgorICogIHRvIHRoZSB0cmFja2luZyBsaXN0IHN0cmVhbV9JRCBmb3IgdXNlIGluIHRoZSByZXdyaXRlLgorICovCit0b2tlblJlZlRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2sodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5zdHJlYW1fPHRva2VuPi5BZGQoPGxhYmVsPik7Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSB0cmFjayBmb3IgcmV3cml0ZSAqLwordG9rZW5SZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5zdHJlYW1fPHJ1bGUubmFtZT4uQWRkKDxsYWJlbD4uVHJlZSk7Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LGVsZW1UeXBlPUFTVExhYmVsVHlwZSwuLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+c3RyZWFtXzxydWxlPi5BZGQoPGxhYmVsPi5UcmVlKTsKKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT17PGxhYmVsPi5UcmVlfSxlbGVtVHlwZT1BU1RMYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8vIFIgZSB3IHIgaSB0IGUKKworcmV3cml0ZUNvZGUoCisJYWx0cywgZGVzY3JpcHRpb24sCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gQUxMIHJlZmVyZW5jZWQgZWxlbWVudHMgdG8gcmlnaHQgb2YgLT4KKwlyZWZlcmVuY2VkVG9rZW5MYWJlbHMsCisJcmVmZXJlbmNlZFRva2VuTGlzdExhYmVscywKKwlyZWZlcmVuY2VkUnVsZUxhYmVscywKKwlyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMsCisJcmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzLAorCXJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHMsCisJcmV3cml0ZUJsb2NrTGV2ZWwsIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxcbj57CisvLyBBU1QgUkVXUklURQorLy8gZWxlbWVudHM6IDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxhYmVsczogPHJlZmVyZW5jZWRSdWxlTGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHdpbGRjYXJkIGxhYmVsczogPFtyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMscmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVsc107IHNlcGFyYXRvcj0iLCAiPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHsKKzxlbmRpZj4KKzxwcmV2UnVsZVJvb3RSZWYoKT4uVHJlZSA9IHJvb3RfMDsKKzxyZXdyaXRlQ29kZUxhYmVscygpPgorcm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuTmlsKCk7Cis8YWx0czpyZXdyaXRlQWx0KCk7IHNlcGFyYXRvcj0iZWxzZSAiPgorPCEgaWYgdHJlZSBwYXJzZXIgYW5kIHJld3JpdGU9dHJ1ZSAhPgorPGlmKFRSRUVfUEFSU0VSJiZyZXdyaXRlTW9kZSk+Cis8cHJldlJ1bGVSb290UmVmKCk+LlRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKK2lucHV0LlJlcGxhY2VDaGlsZHJlbihhZGFwdG9yLkdldFBhcmVudChyZXR2YWwuU3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuR2V0Q2hpbGRJbmRleChyZXR2YWwuU3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuR2V0Q2hpbGRJbmRleChfbGFzdCksCisgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLlRyZWUpOworPGVuZGlmPgorPCEgaWYgcGFyc2VyIG9yIHRyZWUtcGFyc2VyICYmIHJld3JpdGUhPXRydWUsIHdlIG5lZWQgdG8gc2V0IHJlc3VsdCAhPgorPGlmKCFUUkVFX1BBUlNFUnx8IXJld3JpdGVNb2RlKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4uVHJlZSA9IHJvb3RfMDsKKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPgorfQorPGVuZGlmPgorfQorCis+PgorCityZXdyaXRlQ29kZUxhYmVscygpIDo6PSA8PAorPHJlZmVyZW5jZWRUb2tlbkxhYmVscworICAgIDp7aXR8UmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+Iiw8aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVscworICAgIDp7aXR8UmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+IiwgbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzCisJOntpdHxSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtXzxpdD49bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJ3aWxkY2FyZCA8aXQ+Iiw8aXQ+KTt9OworCXNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVscworCTp7aXR8UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwid2lsZGNhcmQgPGl0PiIsbGlzdF88aXQ+KTt9OworCXNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMYWJlbHMKKyAgICA6e2l0fFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgPGl0PiIsPGl0PiE9bnVsbD88aXQ+LlRyZWU6bnVsbCk7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVscworICAgIDp7aXR8UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwidG9rZW4gPGl0PiIsbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCisvKiogR2VuZXJhdGUgY29kZSBmb3IgYW4gb3B0aW9uYWwgcmV3cml0ZSBibG9jazsgbm90ZSBpdCB1c2VzIHRoZSBkZWVwIHJlZidkIGVsZW1lbnQKKyAgKiAgbGlzdCByYXRoZXIgc2hhbGxvdyBsaWtlIG90aGVyIGJsb2Nrcy4KKyAgKi8KK3Jld3JpdGVPcHRpb25hbEJsb2NrKAorCWFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBhbGwgbmVzdGVkIHJlZnMKKwlyZWZlcmVuY2VkRWxlbWVudHMsIC8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraWYgKDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+Lkhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4pCit7CisJPGFsdD4KK30KKzxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+LlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQ2xvc3VyZUJsb2NrKAorCWFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBhbGwgbmVzdGVkIHJlZnMKKwlyZWZlcmVuY2VkRWxlbWVudHMsIC8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgord2hpbGUgKCA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+Lkhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4gKQoreworCTxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAoraWYgKCEoPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5IYXNOZXh0fTsgc2VwYXJhdG9yPSJ8fCI+KSkKK3sKKwl0aHJvdyBuZXcgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbigpOworfQord2hpbGUgKCA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+Lkhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4gKQoreworCTxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQWx0KGEpIDo6PSA8PAorLy8gPGEuZGVzY3JpcHRpb24+Cis8aWYoYS5wcmVkKT4KK2lmICg8YS5wcmVkPikKK3sKKwk8YS5hbHQ+Cit9Cis8ZWxzZT4KK3sKKwk8YS5hbHQ+Cit9Cis8ZW5kaWY+Cis+PgorCisvKiogRm9yIGVtcHR5IHJld3JpdGVzOiAiciA6IC4uLiAtPiA7IiAqLworcmV3cml0ZUVtcHR5QWx0KCkgOjo9ICJyb290XzAgPSBudWxsOyIKKworcmV3cml0ZVRyZWUocm9vdCxjaGlsZHJlbixkZXNjcmlwdGlvbixlbmNsb3NpbmdUcmVlTGV2ZWwsdHJlZUxldmVsKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworPEFTVExhYmVsVHlwZT4gcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLk5pbCgpOworPHJvb3Q6cmV3cml0ZUVsZW1lbnQoKT4KKzxjaGlsZHJlbjpyZXdyaXRlRWxlbWVudCgpPgorYWRhcHRvci5BZGRDaGlsZChyb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTsKK308XG4+Cis+PgorCityZXdyaXRlRWxlbWVudExpc3QoZWxlbWVudHMpIDo6PSAiPGVsZW1lbnRzOnJld3JpdGVFbGVtZW50KCk+IgorCityZXdyaXRlRWxlbWVudChlKSA6Oj0gPCUKKzxAcHJlZ2VuKCk+CitEZWJ1Z0xvY2F0aW9uKDxlLmxpbmU+LCA8ZS5wb3M+KTs8XG4+Cis8ZS5lbD4KKyU+CisKKy8qKiBHZW4gSUQgb3IgSURbYXJnc10gKi8KK3Jld3JpdGVUb2tlblJlZih0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPik7PFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsPUlEICovCityZXdyaXRlVG9rZW5MYWJlbFJlZihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5OZXh0Tm9kZSgpKTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4uTmV4dE5vZGUoKSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRsYWJlbCAuLi4pICovCityZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KHN0cmVhbV88bGFiZWw+Lk5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSB3aGVyZSBsYWJlbCs9Li4uICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworLyoqIEdlbiBeKElEIC4uLikgb3IgXihJRFthcmdzXSAuLi4pICovCityZXdyaXRlVG9rZW5SZWZSb290KHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPiwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworcmV3cml0ZUltYWdpbmFyeVRva2VuUmVmKGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4sIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfMCA9IDxhY3Rpb24+Ozxcbj4KKz4+CisKKy8qKiBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGlzIHJ1bGUncyByb290IHRyZWU/ICBUaGlzCisgKiAgbGV0J3MgdXMgcmVmZXIgdG8gJHJ1bGUgdG8gbWVhbiBwcmV2aW91cyB2YWx1ZS4gIEkgYW0gcmV1c2luZyB0aGUKKyAqICB2YXJpYWJsZSAndHJlZScgc2l0dGluZyBpbiByZXR2YWwgc3RydWN0IHRvIGhvbGQgdGhlIHZhbHVlIG9mIHJvb3RfMCByaWdodAorICogIGJlZm9yZSBJIHNldCBpdCBkdXJpbmcgcmV3cml0ZXMuICBUaGUgYXNzaWduIHdpbGwgYmUgdG8gcmV0dmFsLnRyZWUuCisgKi8KK3ByZXZSdWxlUm9vdFJlZigpIDo6PSAicmV0dmFsIgorCityZXdyaXRlUnVsZVJlZihydWxlKSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxydWxlPi5OZXh0VHJlZSgpKTs8XG4+Cis+PgorCityZXdyaXRlUnVsZVJlZlJvb3QocnVsZSkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdChzdHJlYW1fPHJ1bGU+Lk5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKK3Jld3JpdGVOb2RlQWN0aW9uKGFjdGlvbikgOjo9IDw8CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxhY3Rpb24+KTs8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvblJvb3QoYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxhY3Rpb24+LCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCisvKiogR2VuICRydWxlTGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIHJ1bGVMYWJlbD1ydWxlICovCityZXdyaXRlUnVsZUxhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4uTmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4uTmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4uTmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmUm9vdChsYWJlbCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdChzdHJlYW1fPGxhYmVsPi5OZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCityZXdyaXRlV2lsZGNhcmRMYWJlbFJlZihsYWJlbCkgOjo9IDw8CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lk5leHRUcmVlKCkpOzxcbj4KKz4+CisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPCUKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsLCBhcmdzKSAhPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQ3JlYXRlKDx0b2tlblR5cGU+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGlmKCFhcmdzKT4iPHRva2VuVHlwZT4iPGVuZGlmPikKKzxlbmRpZj4KKyU+CisKK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8JQorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KHN0cmVhbV88dG9rZW4+Lk5leHRUb2tlbigpPGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj4pCis8ZWxzZT4KKzxpZihhcmdzKT4gPCEgbXVzdCBjcmVhdGUgbmV3IG5vZGUgZnJvbSBvbGQgIT4KK2FkYXB0b3IuQ3JlYXRlKDx0b2tlbj4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lk5leHROb2RlKCkKKzxlbmRpZj4KKzxlbmRpZj4KKyU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDIvQVNURGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9BU1REYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMmE0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDIvQVNURGJnLnN0ZwpAQCAtMCwwICsxLDk0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSm9oYW5uZXMgTHViZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gQVNUIHN0dWZmLiAgRHluYW1pYyBpbmhlcml0YW5jZQorICogIGhpZXJhcmNoeSBpcyBzZXQgdXAgYXMgQVNURGJnIDogQVNUIDogRGJnIDogSmF2YSBieSBjb2RlIGdlbmVyYXRvci4KKyAqLworCitwYXJzZXJNZW1iZXJzKCkgOjo9IDw8Citwcm90ZWN0ZWQgRGVidWdUcmVlQWRhcHRvciBhZGFwdG9yOworCitwdWJsaWMgSVRyZWVBZGFwdG9yIFRyZWVBZGFwdG9yCit7CisJZ2V0CisJeworCQlyZXR1cm4gYWRhcHRvcjsKKwl9CisJc2V0CisJeworPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisJCXRoaXMuYWRhcHRvciA9IG5ldyBEZWJ1Z1RyZWVBZGFwdG9yKGRiZyxhZGFwdG9yKTsKKzxlbHNlPgorCQl0aGlzLmFkYXB0b3IgPSAoRGVidWdUcmVlQWRhcHRvcilhZGFwdG9yOyAvLyBkZWxlZ2F0b3Igc2VuZHMgZGJnIGFkYXB0b3IKKzxlbmRpZj48XG4+CisJCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4uVHJlZUFkYXB0b3IgPSB0aGlzLmFkYXB0b3I7fT4KKwl9Cit9PFxuPgorPj4KKworcGFyc2VyQ3RvckJvZHkoKSA6Oj0gPDwKKzxzdXBlci5wYXJzZXJDdG9yQm9keSgpPgorPj4KKworY3JlYXRlTGlzdGVuZXJBbmRIYW5kc2hha2UoKSA6Oj0gPDwKK0RlYnVnRXZlbnRTb2NrZXRQcm94eSBwcm94eSA9IG5ldyBEZWJ1Z0V2ZW50U29ja2V0UHJveHkoIHRoaXMsIHBvcnQsIDxpZihUUkVFX1BBUlNFUik+aW5wdXQuVHJlZUFkYXB0b3I8ZWxzZT5hZGFwdG9yPGVuZGlmPiApOworRGVidWdMaXN0ZW5lciA9IHByb3h5OworPGlucHV0U3RyZWFtVHlwZT4gPSBuZXcgRGVidWc8aW5wdXRTdHJlYW1UeXBlPiggaW5wdXQsIHByb3h5ICk7Cit0cnkKK3sKKwlwcm94eS5IYW5kc2hha2UoKTsKK30KK2NhdGNoICggSU9FeGNlcHRpb24gaW9lICkKK3sKKwlSZXBvcnRFcnJvciggaW9lICk7Cit9Cis+PgorCitAY3RvckZvclJvb3RHcmFtbWFyLmZpbmFsbHkoKSA6Oj0gPDwKK0lUcmVlQWRhcHRvciBhZGFwID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CitUcmVlQWRhcHRvciA9IGFkYXA7Citwcm94eS5UcmVlQWRhcHRvciA9IGFkYXA7Cis+PgorCitAY3RvckZvclByb2ZpbGluZ1Jvb3RHcmFtbWFyLmZpbmFsbHkoKSA6Oj08PAorSVRyZWVBZGFwdG9yIGFkYXAgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKK1RyZWVBZGFwdG9yID0gYWRhcDsKKz4+CisKK0BjdG9yRm9yUHJlZGVmaW5lZExpc3RlbmVyLnN1cGVyQ2xhc3NSZWYoKSA6Oj0gIjogYmFzZSggaW5wdXQsIGRiZyApIgorCitAY3RvckZvclByZWRlZmluZWRMaXN0ZW5lci5maW5hbGx5KCkgOjo9PDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPjwhIGRvbid0IGNyZWF0ZSBuZXcgYWRhcHRvciBmb3IgZGVsZWdhdGVzICE+CitJVHJlZUFkYXB0b3IgYWRhcCA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworVHJlZUFkYXB0b3IgPSBhZGFwOzxcbj4KKzxlbmRpZj4KKz4+CisKKy8vQHJld3JpdGVFbGVtZW50LnByZWdlbigpIDo6PSAiZGJnLkxvY2F0aW9uKCA8ZS5saW5lPiwgPGUucG9zPiApOyIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9BU1RQYXJzZXIuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL0FTVFBhcnNlci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxM2RmZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9BU1RQYXJzZXIuc3RnCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSm9oYW5uZXMgTHViZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIG5vcm1hbCBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgVGhlIHNpdHVhdGlvbiBpcyBub3QgdG9vIGJhZCBhcyByZXdyaXRlICgtPikgdXNhZ2UgbWFrZXMgXiBhbmQgIQorICogIGludmFsaWQuIFRoZXJlIGlzIG5vIGh1Z2UgZXhwbG9zaW9uIG9mIGNvbWJpbmF0aW9ucy4KKyAqLworCitAcnVsZS5zZXRFcnJvclJldHVyblZhbHVlKCkgOjo9IDw8CityZXR2YWwuVHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkVycm9yTm9kZShpbnB1dCwgcmV0dmFsLlN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKzwhIFN5c3RlbS5vdXQuV3JpdGVMaW5lKCI8cnVsZU5hbWU+IHJldHVybnMgIisoKENvbW1vblRyZWUpcmV0dmFsLnRyZWUpLnRvU3RyaW5nVHJlZSgpKTsgIT4KKz4+CisKKy8vIFRPS0VOIEFTVCBTVFVGRgorCisvKiogSUQgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoc3RhdGUuYmFja3RyYWNraW5nID09IDApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPjsKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gIjxzdXBlci50b2tlblJlZiguLi4pPiIKKworLyoqIElEXiBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWZSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT47Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF8wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCisvKiogaWRzKz1JRCEgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmQmFuZ0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBsYWJlbCs9VE9LRU5eIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvLyBTRVQgQVNUCisKKy8vIHRoZSBtYXRjaCBzZXQgc3R1ZmYgaXMgaW50ZXJlc3RpbmcgaW4gdGhhdCBpdCB1c2VzIGFuIGFyZ3VtZW50IGxpc3QKKy8vIHRvIHBhc3MgY29kZSB0byB0aGUgZGVmYXVsdCBtYXRjaFNldDsgYW5vdGhlciBwb3NzaWJsZSB3YXkgdG8gYWx0ZXIKKy8vIGluaGVyaXRlZCBjb2RlLiAgSSBkb24ndCB1c2UgdGhlIHJlZ2lvbiBzdHVmZiBiZWNhdXNlIEkgbmVlZCB0byBwYXNzCisvLyBkaWZmZXJlbnQgY2h1bmtzIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0b3IuICBJIGRvbid0IGxpa2UgbWFraW5nCisvLyB0aGUgdGVtcGxhdGUgbmFtZSBoYXZlIHRoZSBvcGVyYXRvciBhcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlcyBnZXRzCisvLyBsYXJnZSBidXQgdGhpcyBpcyB0aGUgbW9zdCBmbGV4aWJsZS0tdGhpcyBpcyBhcyBvcHBvc2VkIHRvIGhhdmluZworLy8gdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbGwgbWF0Y2hTZXQgdGhlbiBhZGQgcm9vdCBjb2RlIG9yIHJ1bGVyb290IGNvZGUKKy8vIHBsdXMgbGlzdCBsYWJlbCBwbHVzIC4uLiAgVGhlIGNvbWJpbmF0aW9ucyBtaWdodCByZXF1aXJlIGNvbXBsaWNhdGVkCisvLyByYXRoZXIgdGhhbiBqdXN0IGFkZGVkIG9uIGNvZGUuICBJbnZlc3RpZ2F0ZSB0aGF0IHJlZmFjdG9yaW5nIHdoZW4KKy8vIEkgaGF2ZSBtb3JlIHRpbWUuCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXs8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5hZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4pO30sIC4uLik+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxwb3N0bWF0Y2hDb2RlKSA6Oj0gIjxzdXBlci5tYXRjaFNldCguLi4pPiIKKworLy8gbm90ZSB0aGVyZSBpcyBubyBtYXRjaFNldFRyYWNrIGJlY2F1c2UgLT4gcmV3cml0ZXMgZm9yY2Ugc2V0cyB0byBiZQorLy8gcGxhaW4gb2xkIGJsb2NrcyBvZiBhbHRzOiAoQXxCfC4uLnxDKQorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj0oPGxhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8ZW5kaWY+Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17PGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+cm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPiwgcm9vdF8wKTt9LCAuLi4pPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5hZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPi5UcmVlKTsKKz4+CisKKy8qKiBydWxlISBpcyBzYW1lIGFzIG5vcm1hbCBydWxlIHJlZiAqLworcnVsZVJlZkJhbmcocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9ICI8c3VwZXIucnVsZVJlZiguLi4pPiIKKworLyoqIHJ1bGVeICovCitydWxlUmVmUnVsZVJvb3QocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+cm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+LlRyZWUsIHJvb3RfMCk7Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT17PGxhYmVsPi5UcmVlfSxlbGVtVHlwZT1BU1RMYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlISB3aGVuIG91dHB1dD1BU1QgaXMgYSBydWxlIHJlZiB3aXRoIGxpc3QgYWRkaXRpb24gKi8KK3J1bGVSZWZCYW5nQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZCYW5nKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LGVsZW1UeXBlPUFTVExhYmVsVHlwZSwuLi4pPgorPj4KKworLyoqIHgrPXJ1bGVeICovCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LGVsZW1UeXBlPUFTVExhYmVsVHlwZSwuLi4pPgorPj4KKworLy8gV0lMRENBUkQgQVNUCisKK3dpbGRjYXJkKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5DcmVhdGUoPGxhYmVsPik7CithZGFwdG9yLkFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCit3aWxkY2FyZEJhbmcobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gIjxzdXBlci53aWxkY2FyZCguLi4pPiIKKword2lsZGNhcmRSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQ3JlYXRlKDxsYWJlbD4pOworcm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfMCk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8JQorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxpZih0ZXJtaW5hbE9wdGlvbnMudHlwZSk+PHRlcm1pbmFsT3B0aW9ucy50eXBlPiw8ZW5kaWY+PGxhYmVsPjxpZih0ZXJtaW5hbE9wdGlvbnMudGV4dCk+LDx0ZXJtaW5hbE9wdGlvbnMudGV4dDsgZm9ybWF0PSJzdHJpbmciPjxlbmRpZj4pCis8ZWxzZT4KKyg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkNyZWF0ZSg8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KQorPGVuZGlmPgorJT4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorcmV0dmFsLlRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKK2FkYXB0b3IuU2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC5UcmVlLCByZXR2YWwuU3RhcnQsIHJldHZhbC5TdG9wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL0FTVFRyZWVQYXJzZXIuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL0FTVFRyZWVQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NDlmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDIvQVNUVHJlZVBhcnNlci5zdGcKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKb2hhbm5lcyBMdWJlcgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoqIFRlbXBsYXRlcyBmb3IgYnVpbGRpbmcgQVNUcyBkdXJpbmcgdHJlZSBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgRWFjaCBjb21iaW5hdGlvbiBoYXMgaXRzIG93biB0ZW1wbGF0ZSBleGNlcHQgdGhhdCBsYWJlbC9ubyBsYWJlbAorICogIGlzIGNvbWJpbmVkIGludG8gdG9rZW5SZWYsIHJ1bGVSZWYsIC4uLgorICovCisKKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBsYXN0IGVsZW1lbnQgbWF0Y2hlZCAqLworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KKzxBU1RMYWJlbFR5cGU+IF9maXJzdF8wID0gZGVmYXVsdCg8QVNUTGFiZWxUeXBlPik7Cis8QVNUTGFiZWxUeXBlPiBfbGFzdCA9IGRlZmF1bHQoPEFTVExhYmVsVHlwZT4pOzxcbj4KKz4+CisKKy8qKiBXaGF0IHRvIGVtaXQgd2hlbiB0aGVyZSBpcyBubyByZXdyaXRlIHJ1bGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorPGlmKHJld3JpdGVNb2RlKT4KK3JldHZhbC5UcmVlID0gKDxBU1RMYWJlbFR5cGU+KV9maXJzdF8wOworaWYgKGFkYXB0b3IuR2V0UGFyZW50KHJldHZhbC5UcmVlKSE9bnVsbCAmJiBhZGFwdG9yLklzTmlsKGFkYXB0b3IuR2V0UGFyZW50KHJldHZhbC5UcmVlKSkpCisgICAgcmV0dmFsLlRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5HZXRQYXJlbnQocmV0dmFsLlRyZWUpOworPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyOyBvdmVycmlkZSBoZXJlIHRvCisgKiAgYWRkIHRyZWUgY29uc3RydWN0aW9uIGFjdGlvbnMuCisgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKK3sKKzxBU1RMYWJlbFR5cGU+IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD4gPSBfbGFzdDsKKzxBU1RMYWJlbFR5cGU+IF9maXJzdF88dHJlZUxldmVsPiA9IGRlZmF1bHQoPEFTVExhYmVsVHlwZT4pOworPGlmKCFyZXdyaXRlTW9kZSk+Cis8QVNUTGFiZWxUeXBlPiByb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuTmlsKCk7Cis8ZW5kaWY+Cis8cm9vdDplbGVtZW50KCk+Cis8aWYocmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KTxlbmRpZj4KKzxpZihyb290LmVsLnJ1bGUpPgoraWYgKF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9PSBudWxsKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD4uVHJlZTsKKzxlbHNlPgoraWYgKF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9PSBudWxsKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD47Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKGlucHV0LkxBKDEpID09IFRva2VuVHlwZXMuRG93bikgeworICAgIE1hdGNoKGlucHV0LCBUb2tlblR5cGVzLkRvd24sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CitNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxjaGlsZHJlbjplbGVtZW50KCk+CitNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5VcCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88ZW5jbG9zaW5nVHJlZUxldmVsPiwgcm9vdF88dHJlZUxldmVsPik7Cis8ZW5kaWY+CitfbGFzdCA9IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD47Cit9PFxuPgorPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICdjZXB0IGFkZAorICogIHNldHRpbmcgb2YgX2xhc3QKKyAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKz4+CisKKy8qKiBJRCBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkR1cE5vZGUoPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZW5kaWY+PFxuPgorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPik8ZW5kaWY+CitpZiAoX2ZpcnN0Xzx0cmVlTGV2ZWw+ID09IG51bGwpIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIF4oSUQgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuRHVwTm9kZSg8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KTsKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfPHRyZWVMZXZlbD4pOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGFuZCBhdXRvIGR1cCB0aGUgbm9kZS9zdWJ0cmVlICovCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkR1cFRyZWUoPGxhYmVsPik7CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KTxlbmRpZj4KK2lmIChfZmlyc3RfPHRyZWVMZXZlbD4gPT0gbnVsbCkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPjsKKzxlbmRpZj4KKz4+CisKKy8vIFNFVCBBU1QKKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuRHVwTm9kZSg8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KTsKKzxlbmRpZj48XG4+CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT5cfTxlbmRpZj4KKzxlbmRpZj4KK30sIC4uLgorKT4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlLHRyZWVMZXZlbD0iMCIpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bm9SZXdyaXRlKC4uLik+IDwhIHNldCByZXR1cm4gdHJlZSAhPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLm1hdGNoU2V0KC4uLik+Cis+PgorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuRHVwTm9kZSg8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPjxsYWJlbD48aWYodGVybWluYWxPcHRpb25zLnRleHQpPiw8dGVybWluYWxPcHRpb25zLnRleHQ7IGZvcm1hdD0ic3RyaW5nIj48ZW5kaWY+KTsKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfPHRyZWVMZXZlbD4pOworPGlmKGJhY2t0cmFja2luZyk+XH08ZW5kaWY+Cis8ZW5kaWY+Cit9LCAuLi4KKyk+Cis+PgorCisvLyBSVUxFIFJFRiBBU1QKKworLyoqIHJ1bGUgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pPGVuZGlmPgorPGlmKCFyZXdyaXRlTW9kZSk+CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD4uVHJlZSk7Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+CitpZiAoX2ZpcnN0Xzx0cmVlTGV2ZWw+ID09IG51bGwpIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD4uVHJlZTsKKzxlbmRpZj4KKz4+CisKKy8qKiB4Kz1ydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09ezxsYWJlbD4uVHJlZX0sLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5yb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+LlRyZWUsIHJvb3RfPHRyZWVMZXZlbD4pOworPGVuZGlmPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LC4uLik+Cis+PgorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci5ydWxlUmVmVHJhY2soLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZlJvb3RUcmFjayguLi4pPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBTdHJlYW1zIGZvciB0b2tlbiByZWZzIGFyZSB0cmVlIG5vZGVzIG5vdzsgb3ZlcnJpZGUgdG8KKyAqICBjaGFuZ2UgTmV4dFRva2VuIHRvIE5leHROb2RlLgorICovCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPCUKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+CituZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8aWYodGVybWluYWxPcHRpb25zLnR5cGUpPjx0ZXJtaW5hbE9wdGlvbnMudHlwZT4sPGVuZGlmPnN0cmVhbV88dG9rZW4+Lk5leHROb2RlKCkpCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lk5leHROb2RlKCkKKzxlbmRpZj4KKyU+CisKK3J1bGVDbGVhblVwKCkgOjo9IDw8Cis8c3VwZXIucnVsZUNsZWFuVXAoKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorcmV0dmFsLlRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL0NTaGFycDIuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL0NTaGFycDIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNWQ2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDIvQ1NoYXJwMi5zdGcKQEAgLTAsMCArMSwxNzE1IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSm9oYW5uZXMgTHViZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2NzaGFycFZpc2liaWxpdHlNYXAgOjo9IFsKKwkicHJpdmF0ZSI6InByaXZhdGUiLAorCSJwcm90ZWN0ZWQiOiJwcm90ZWN0ZWQiLAorCSJwdWJsaWMiOiJwdWJsaWMiLAorCSJmcmFnbWVudCI6InByaXZhdGUiLAorCWRlZmF1bHQ6InByaXZhdGUiCitdCisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqLworb3V0cHV0RmlsZSgJTEVYRVIsUEFSU0VSLFRSRUVfUEFSU0VSLCBhY3Rpb25TY29wZSwgYWN0aW9ucywKKwkJCWRvY0NvbW1lbnQsIHJlY29nbml6ZXIsCisJCQluYW1lLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLAorCQkJYml0c2V0cywgYnVpbGRUZW1wbGF0ZSwgYnVpbGRBU1QsIHJld3JpdGVNb2RlLCBwcm9maWxlLAorCQkJYmFja3RyYWNraW5nLCBzeW5wcmVkcywgbWVtb2l6ZSwgbnVtUnVsZXMsCisJCQlmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsIHRyYWNlLAorCQkJc2NvcGVzLCBzdXBlckNsYXNzLCBsaXRlcmFscykgOjo9Cis8PAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFw8YXV0by1nZW5lcmF0ZWQ+CisvLyAgICAgVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgYSB0b29sLgorLy8gICAgIEFOVExSIFZlcnNpb246IDxBTlRMUlZlcnNpb24+CisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLgorLy8gXDwvYXV0by1nZW5lcmF0ZWQ+CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAkQU5UTFIgPEFOVExSVmVyc2lvbj4gPGZpbGVOYW1lPiA8Z2VuZXJhdGVkVGltZXN0YW1wPgorCis8aWYodHJhY2UpPgorI2RlZmluZSBBTlRMUl9UUkFDRQorPGVuZGlmPgorPEBkZWJ1Z1ByZXByb2Nlc3NvcigpPgorLy8gVGhlIHZhcmlhYmxlICd2YXJpYWJsZScgaXMgYXNzaWduZWQgYnV0IGl0cyB2YWx1ZSBpcyBuZXZlciB1c2VkLgorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTY4LCAyMTkKKy8vIFVucmVhY2hhYmxlIGNvZGUgZGV0ZWN0ZWQuCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNjIKKy8vIE1pc3NpbmcgWE1MIGNvbW1lbnQgZm9yIHB1YmxpY2x5IHZpc2libGUgdHlwZSBvciBtZW1iZXIgJ1R5cGVfb3JfTWVtYmVyJworI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MQorCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKworPEBpbXBvcnRzPgordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBBbnRsci5SdW50aW1lOwordXNpbmcgQW50bHIuUnVudGltZS5NaXNjOworPGlmKFRSRUVfUEFSU0VSKT4KK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKK3VzaW5nIFJld3JpdGVSdWxlSVRva2VuU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLlJld3JpdGVSdWxlVG9rZW5TdHJlYW07Cis8ZW5kaWY+Cit1c2luZyBDb25kaXRpb25hbEF0dHJpYnV0ZSA9IFN5c3RlbS5EaWFnbm9zdGljcy5Db25kaXRpb25hbEF0dHJpYnV0ZTsKKzxAZW5kPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5uYW1lc3BhY2UpPgorbmFtZXNwYWNlIDxhY3Rpb25zLihhY3Rpb25TY29wZSkubmFtZXNwYWNlPgoreworPGVuZGlmPgorPGRvY0NvbW1lbnQ+Cis8cmVjb2duaXplcj4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkubmFtZXNwYWNlKT4KKworfSAvLyBuYW1lc3BhY2UgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5uYW1lc3BhY2U+Cis8ZW5kaWY+Cis+PgorCitsZXhlcklucHV0U3RyZWFtVHlwZSgpIDo6PSA8PAorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5pbnB1dFN0cmVhbVR5cGU7IG51bGw9IklDaGFyU3RyZWFtIj4KKz4+CisKK2xleGVyKGdyYW1tYXIsIG5hbWUsIHRva2Vucywgc2NvcGVzLCBydWxlcywgbnVtUnVsZXMsIGZpbHRlck1vZGUsIGxhYmVsVHlwZT0iQ29tbW9uVG9rZW4iLAorICAgICAgc3VwZXJDbGFzcz17PGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zdXBlckNsYXNzKT48YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN1cGVyQ2xhc3M+PGVsc2U+QW50bHIuUnVudGltZS5MZXhlcjxlbmRpZj59KSA6Oj0gPDwKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICI8QU5UTFJWZXJzaW9uPiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorPHBhcnNlck1vZGlmaWVyKGdyYW1tYXI9Z3JhbW1hciwgYWN0aW9ucz1hY3Rpb25zKT4gcGFydGlhbCBjbGFzcyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gOiA8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPgoreworCTx0b2tlbnM6e2l0fHB1YmxpYyBjb25zdCBpbnQgPGl0Lm5hbWU7IGZvcm1hdD0iaWQiPj08aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisJPHNjb3Blczp7aXR8PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorCTxhY3Rpb25zLmxleGVyLm1lbWJlcnM+CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICA8Z3JhbW1hci5kZWxlZ2F0ZXM6CisgICAgICAgICB7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgLy8gZGVsZWdhdG9ycworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiBnUGFyZW50O30+CisKKwk8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPGdyYW1tYXIucmVjb2duaXplck5hbWU+KCk8ISBuZWVkZWQgYnkgc3ViY2xhc3NlcyAhPgorCXsKKwkJT25DcmVhdGVkKCk7CisJfQorCisJPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8bGV4ZXJJbnB1dFN0cmVhbVR5cGUoKT4gaW5wdXQ8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+ICkKKwkJOiB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCk8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pCisJeworCX0KKworCTxhY3Rpb25zLihhY3Rpb25TY29wZSkuY3Rvck1vZGlmaWVyOyBudWxsPSJwdWJsaWMiPiA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oPGxleGVySW5wdXRTdHJlYW1UeXBlKCk+IGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KQorCQk6IGJhc2UoaW5wdXQsIHN0YXRlKQorCXsKKzxpZihtZW1vaXplKT4KKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorCQlzdGF0ZS5ydWxlTWVtbyA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5XDxpbnQsIGludD5bPG51bVJ1bGVzPisxXTs8XG4+PCEgaW5kZXggZnJvbSAxLi5uICE+Cis8ZW5kaWY+Cis8ZW5kaWY+CisJCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKwkJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oaW5wdXQsIHRoaXMuc3RhdGU8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHwsIDxwOmRlbGVnYXRlTmFtZSgpPn0+LCB0aGlzKTt9OyBzZXBhcmF0b3I9IlxuIj4KKwkJPGdyYW1tYXIuZGVsZWdhdG9yczoKKwkJIHtnfHRoaXMuPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorCQk8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfGdQYXJlbnQgPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fT4KKworCQlPbkNyZWF0ZWQoKTsKKwl9CisJcHVibGljIG92ZXJyaWRlIHN0cmluZyBHcmFtbWFyRmlsZU5hbWUgeyBnZXQgeyByZXR1cm4gIjxmaWxlTmFtZT4iOyB9IH0KKworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJvb2xbXSBkZWNpc2lvbkNhbkJhY2t0cmFjayA9IG5ldyBib29sWzBdOworCis8aWYoZ3JhbW1hci5oYXNEZWxlZ2F0ZXMpPgorCXB1YmxpYyBvdmVycmlkZSA8bGV4ZXJJbnB1dFN0cmVhbVR5cGUoKT4gQ2hhclN0cmVhbQorCXsKKwkJZ2V0CisJCXsKKwkJCXJldHVybiBiYXNlLkNoYXJTdHJlYW07CisJCX0KKwkJc2V0CisJCXsKKwkJCWJhc2UuQ2hhclN0cmVhbSA9IHZhbHVlOworCQkJPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorCQkJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oaW5wdXQsIHN0YXRlPHRydW5jKGcuZGVsZWdhdG9ycyk6e3B8LCA8cDpkZWxlZ2F0ZU5hbWUoKT59PiwgdGhpcyk7fTsgc2VwYXJhdG9yPSJcbiI+CisJCQk8Z3JhbW1hci5kZWxlZ2F0b3JzOgorCQkJIHtnfHRoaXMuPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorCQkJPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O30+CisJCX0KKwl9CisKKzxlbmRpZj4KKzxpZihmaWx0ZXJNb2RlKT4KKwk8ZmlsdGVyaW5nTmV4dFRva2VuKCk+Cis8ZW5kaWY+CisKKwlbQ29uZGl0aW9uYWwoIkFOVExSX1RSQUNFIildCisJcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZWQoKSB7fQorCVtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKwlwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEVudGVyUnVsZShzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpIHt9CisJW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorCXByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgTGVhdmVSdWxlKHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkge30KKworICAgIDxydWxlczsgc2VwYXJhdG9yPSJcbiI+CisKKwk8aW5zZXJ0TGV4ZXJTeW5wcmVkcyhzeW5wcmVkcyk+CisKKwkjcmVnaW9uIERGQQorCTxjeWNsaWNERkFzOntkZmEgfCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworCXByb3RlY3RlZCBvdmVycmlkZSB2b2lkIEluaXRERkFzKCkKKwl7CisJCWJhc2UuSW5pdERGQXMoKTsKKwkJPGN5Y2xpY0RGQXM6e2RmYSB8IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gbmV3IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KHRoaXM8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+LCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uPGRmYS5kZWNpc2lvbk51bWJlcj48ZW5kaWY+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKwl9CisKKwk8Y3ljbGljREZBczpjeWNsaWNERkEoKT4gPCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KKwkjZW5kcmVnaW9uCisKK30KKz4+CisKKy8qKiBBIG92ZXJyaWRlIG9mIExleGVyLm5leHRUb2tlbigpIHRoYXQgYmFja3RyYWNrcyBvdmVyIG1Ub2tlbnMoKSBsb29raW5nCisgKiAgZm9yIG1hdGNoZXMuICBObyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkIHVwb24gZXJyb3I7IGp1c3QgcmV3aW5kLCBjb25zdW1lCisgKiAgYSB0b2tlbiBhbmQgdGhlbiB0cnkgYWdhaW4uICBiYWNrdHJhY2tpbmcgbmVlZHMgdG8gYmUgc2V0IGFzIHdlbGwuCisgKiAgTWFrZSBydWxlIG1lbW9pemF0aW9uIGhhcHBlbiBvbmx5IGF0IGxldmVscyBhYm92ZSAxIGFzIHdlIHN0YXJ0IG1Ub2tlbnMKKyAqICBhdCBiYWNrdHJhY2tpbmc9PTEuCisgKi8KK2ZpbHRlcmluZ05leHRUb2tlbigpIDo6PSA8PAorcHVibGljIG92ZXJyaWRlIElUb2tlbiBOZXh0VG9rZW4oKQoreworCXdoaWxlICh0cnVlKQorCXsKKwkJaWYgKGlucHV0LkxBKDEpID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorCQl7CisJCQlJVG9rZW4gZW9mID0gbmV3IENvbW1vblRva2VuKChJQ2hhclN0cmVhbSlpbnB1dCwgQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCwgaW5wdXQuSW5kZXgsIGlucHV0LkluZGV4KTsKKwkJCWVvZi5MaW5lID0gTGluZTsKKwkJCWVvZi5DaGFyUG9zaXRpb25JbkxpbmUgPSBDaGFyUG9zaXRpb25JbkxpbmU7CisJCQlyZXR1cm4gZW9mOworCQl9CisJCXN0YXRlLnRva2VuID0gbnVsbDsKKwkJc3RhdGUuY2hhbm5lbCA9IFRva2VuQ2hhbm5lbHMuRGVmYXVsdDsKKwkJc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LkluZGV4OworCQlzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gaW5wdXQuQ2hhclBvc2l0aW9uSW5MaW5lOworCQlzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LkxpbmU7CisJCXN0YXRlLnRleHQgPSBudWxsOworCQl0cnkKKwkJeworCQkJaW50IG0gPSBpbnB1dC5NYXJrKCk7CisJCQlzdGF0ZS5iYWNrdHJhY2tpbmc9MTs8ISBtZWFucyB3ZSB3b24ndCB0aHJvdyBzbG93IGV4Y2VwdGlvbiAhPgorCQkJc3RhdGUuZmFpbGVkPWZhbHNlOworCQkJbVRva2VucygpOworCQkJc3RhdGUuYmFja3RyYWNraW5nPTA7CisJCQk8ISBtVG9rZW5zIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorCQkJICAgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAhPgorCQkJaWYgKHN0YXRlLmZhaWxlZCkKKwkJCXsKKwkJCQlpbnB1dC5SZXdpbmQobSk7CisJCQkJaW5wdXQuQ29uc3VtZSgpOzwhIGFkdmFuY2Ugb25lIGNoYXIgYW5kIHRyeSBhZ2FpbiAhPgorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUVtaXQoKTsKKwkJCQlyZXR1cm4gc3RhdGUudG9rZW47CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKQorCQl7CisJCQkvLyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIocmUpOworCQl9CisJfQorfQorCitwdWJsaWMgb3ZlcnJpZGUgdm9pZCBNZW1vaXplKElJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlSW5kZXgsIGludCBydWxlU3RhcnRJbmRleCkKK3sKKwlpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMSkKKwkJYmFzZS5NZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKK30KKworcHVibGljIG92ZXJyaWRlIGJvb2wgQWxyZWFkeVBhcnNlZFJ1bGUoSUludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCkKK3sKKwlpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMSkKKwkJcmV0dXJuIGJhc2UuQWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9Cis+PgorCithY3Rpb25HYXRlKCkgOjo9ICJzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCIKKworZmlsdGVyaW5nQWN0aW9uR2F0ZSgpIDo6PSAic3RhdGUuYmFja3RyYWNraW5nID09IDEiCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBwYXJzZXIgKi8KK2dlbmVyaWNQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywKKyAgICAgICAgICAgICAgYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLAorICAgICAgICAgICAgICBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgZmlsdGVyTW9kZSwgQVNUTGFiZWxUeXBlPSJvYmplY3QiKSA6Oj0gPDwKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICI8QU5UTFJWZXJzaW9uPiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorPHBhcnNlck1vZGlmaWVyKGdyYW1tYXI9Z3JhbW1hciwgYWN0aW9ucz1hY3Rpb25zKT4gcGFydGlhbCBjbGFzcyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gOiA8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPgoreworPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisJaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgc3RyaW5nW10geworCQkiXDxpbnZhbGlkPiIsICJcPEVPUj4iLCAiXDxET1dOPiIsICJcPFVQPiIsIDx0b2tlbk5hbWVzOyBzZXBhcmF0b3I9IiwgIj4KKwl9OworPGVuZGlmPgorCTx0b2tlbnM6e2l0fHB1YmxpYyBjb25zdCBpbnQgPGl0Lm5hbWU7IGZvcm1hdD0iaWQiPj08aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisKKzxpZihncmFtbWFyLmRlbGVnYXRlcyk+CisJLy8gZGVsZWdhdGVzCisJPGdyYW1tYXIuZGVsZWdhdGVzOgorCQkge2d8cHJpdmF0ZSA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuZGVsZWdhdG9ycyk+CisJLy8gZGVsZWdhdG9ycworCTxncmFtbWFyLmRlbGVnYXRvcnM6CisJCSB7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisJPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiBnUGFyZW50O30+Cis8ZW5kaWY+CisKKwk8c2NvcGVzOntpdHw8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZT1pdCk+PGVuZGlmPn0+CisJPEBtZW1iZXJzKCk+CisKKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nW10gVG9rZW5OYW1lcyB7IGdldCB7IHJldHVybiA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnRva2VuTmFtZXM7IH0gfQorCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR3JhbW1hckZpbGVOYW1lIHsgZ2V0IHsgcmV0dXJuICI8ZmlsZU5hbWU+IjsgfSB9CisKKwk8bWVtYmVycz4KKworCVtDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KKwlwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIE9uQ3JlYXRlZCgpIHt9CisJW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorCXByb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRW50ZXJSdWxlKHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkge30KKwlbQ29uZGl0aW9uYWwoIkFOVExSX1RSQUNFIildCisJcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBMZWF2ZVJ1bGUoc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSB7fQorCisJI3JlZ2lvbiBSdWxlcworCTxydWxlczsgc2VwYXJhdG9yPSJcbiI+CisJI2VuZHJlZ2lvbiBSdWxlcworCis8aWYoZ3JhbW1hci5kZWxlZ2F0ZWRSdWxlcyk+Cis8ISBnZW5lcmF0ZSBydWxlL21ldGhvZCBkZWZpbml0aW9ucyBmb3IgaW1wb3J0ZWQgcnVsZXMgc28gdGhleQorICAgYXBwZWFyIHRvIGJlIGRlZmluZWQgaW4gdGhpcyByZWNvZ25pemVyLiAhPgorCSNyZWdpb24gRGVsZWdhdGVkIHJ1bGVzCis8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8CisJPHJ1bGVNb2RpZmllcihncmFtbWFyPWdyYW1tYXIscnVsZURlc2NyaXB0b3I9cnVsZURlc2NyaXB0b3IpPiA8cmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcik+IDxydWxlRGVzY3JpcHRvci5uYW1lOyBmb3JtYXQ9ImlkIj4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KSA8IXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiAhPnsgPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT5yZXR1cm4gPGVuZGlmPjxydWxlRGVzY3JpcHRvci5ncmFtbWFyOmRlbGVnYXRlTmFtZSgpPi48cnVsZURlc2NyaXB0b3IubmFtZTsgZm9ybWF0PSJpZCI+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU7IGZvcm1hdD0iaWQiPn07IHNlcGFyYXRvcj0iLCAiPik7IFx9fTsgc2VwYXJhdG9yPSJcbiI+CisJI2VuZHJlZ2lvbiBEZWxlZ2F0ZWQgcnVsZXMKKzxlbmRpZj4KKworCTxpbnNlcnRTeW5wcmVkcyhzeW5wcmVkcyk+CisKKzxpZihjeWNsaWNERkFzKT4KKwkjcmVnaW9uIERGQQorCTxjeWNsaWNERkFzOntkZmEgfCBwcml2YXRlIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+O307IHNlcGFyYXRvcj0iXG4iPgorCisJcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgSW5pdERGQXMoKQorCXsKKwkJYmFzZS5Jbml0REZBcygpOworCQk8Y3ljbGljREZBczp7ZGZhIHwgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBuZXcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4oIHRoaXM8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+LCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uPGRmYS5kZWNpc2lvbk51bWJlcj48ZW5kaWY+ICk7fTsgc2VwYXJhdG9yPSJcbiI+CisJfQorCisJPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+PCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KKwkjZW5kcmVnaW9uIERGQQorPGVuZGlmPgorCis8aWYoYml0c2V0cyk+CisJI3JlZ2lvbiBGb2xsb3cgc2V0cworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbGxvdworCXsKKwkJPGJpdHNldHM6e2l0fDxiaXRzZXQobmFtZT17XzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0sIHdvcmRzNjQ9aXQuYml0cyk+fTsgc2VwYXJhdG9yPSJcbiI+CisJfQorCSNlbmRyZWdpb24gRm9sbG93IHNldHMKKzxlbmRpZj4KK30KKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKyNpZiBBTlRMUl9ERUJVRworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJvb2xbXSBkZWNpc2lvbkNhbkJhY2t0cmFjayA9CisJCW5ldyBib29sW10KKwkJeworCQkJZmFsc2UsIC8vIGludmFsaWQgZGVjaXNpb24KKwkJCTxncmFtbWFyLmRlY2lzaW9uczp7ZCB8IDxkLmRmYS5oYXNTeW5QcmVkPn07IHdyYXA9IlxuIiwgc2VwYXJhdG9yPSIsICI+CisJCX07CisjZWxzZQorCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJvb2xbXSBkZWNpc2lvbkNhbkJhY2t0cmFjayA9IG5ldyBib29sWzBdOworI2VuZGlmCis8ISBXQVJOSU5HLiBidWcgaW4gU1Q6IHRoaXMgaXMgY3V0LW4tcGFzdGUgaW50byBEYmcuc3RnICE+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPGdyYW1tYXIucmVjb2duaXplck5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0PGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT59PikKKwk6IHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59PikKK3sKK30KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuY3Rvck1vZGlmaWVyOyBudWxsPSJwdWJsaWMiPiA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pCisJOiBiYXNlKGlucHV0LCBzdGF0ZSkKK3sKKwk8cGFyc2VyQ3RvckJvZHkoKT4KKzxpZihncmFtbWFyLmRpcmVjdERlbGVnYXRlcyk+CisJPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorCSB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBzdGF0ZTx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfCwgPHA6ZGVsZWdhdGVOYW1lKCk+fT4sIHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuaW5kaXJlY3REZWxlZ2F0ZXMpPgorCTxncmFtbWFyLmluZGlyZWN0RGVsZWdhdGVzOntnIHwgPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGcuZGVsZWdhdG9yOmRlbGVnYXRlTmFtZSgpPi48ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis8ZW5kaWY+Cis8aWYoZ3JhbW1hci5kZWxlZ2F0b3JzKT4KKwk8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfGdQYXJlbnQgPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fT4KKzxlbmRpZj4KKwlPbkNyZWF0ZWQoKTsKK30KKz4+CisKKy8vIGltcG9ydGVkIGdyYW1tYXJzIGFyZSAncHVibGljJyAoY2FuJ3QgYmUgaW50ZXJuYWwgYmVjYXVzZSB0aGVpciByZXR1cm4gc2NvcGUgY2xhc3NlcyBtdXN0IGJlIGFjY2Vzc2libGUpCitwYXJzZXJNb2RpZmllcihncmFtbWFyLCBhY3Rpb25zKSA6Oj0gPDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPjxhY3Rpb25zLihhY3Rpb25TY29wZSkubW9kaWZpZXI7IG51bGw9InB1YmxpYyI+PGVsc2U+cHVibGljPGVuZGlmPgorPj4KKworcGFyc2VyQ3RvckJvZHkoKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgordGhpcy5zdGF0ZS5ydWxlTWVtbyA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5XDxpbnQsIGludD5bPGxlbmd0aChncmFtbWFyLmFsbEltcG9ydGVkUnVsZXMpPisxXTs8XG4+PCEgaW5kZXggZnJvbSAxLi5uICE+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8Z3JhbW1hci5kZWxlZ2F0b3JzOgorIHtnfHRoaXMuPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworcGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsIGJpdHNldHMsCisgICAgICAgQVNUTGFiZWxUeXBlPSJvYmplY3QiLCBzdXBlckNsYXNzPXs8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN1cGVyQ2xhc3MpPjxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3VwZXJDbGFzcz48ZWxzZT5BbnRsci5SdW50aW1lLlBhcnNlcjxlbmRpZj59LCBsYWJlbFR5cGU9IklUb2tlbiIsCisgICAgICAgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IklUb2tlblN0cmVhbSIsIHJld3JpdGVFbGVtZW50VHlwZT0iSVRva2VuIiwgLi4uKT4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSB0cmVlIHBhcnNlcjsgc2FtZSBhcyBwYXJzZXIgZXhjZXB0IHRoZSBpbnB1dAorICogIHN0cmVhbSBpcyBhIGRpZmZlcmVudCB0eXBlLgorICovCit0cmVlUGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBnbG9iYWxBY3Rpb24sIHJ1bGVzLAorICAgICAgICAgICBudW1SdWxlcywgYml0c2V0cywgZmlsdGVyTW9kZSwgbGFiZWxUeXBlPXs8QVNUTGFiZWxUeXBlPn0sIEFTVExhYmVsVHlwZT0ib2JqZWN0IiwKKyAgICAgICAgICAgc3VwZXJDbGFzcz17PGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zdXBlckNsYXNzKT48YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN1cGVyQ2xhc3M+PGVsc2U+QW50bHIuUnVudGltZS5UcmVlLjxpZihmaWx0ZXJNb2RlKT48aWYoYnVpbGRBU1QpPlRyZWVSZXdyaXRlcjxlbHNlPlRyZWVGaWx0ZXI8ZW5kaWY+PGVsc2U+VHJlZVBhcnNlcjxlbmRpZj48ZW5kaWY+fSwKKyAgICAgICAgICAgbWVtYmVycz17PGFjdGlvbnMudHJlZXBhcnNlci5tZW1iZXJzPn0pIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJJVHJlZU5vZGVTdHJlYW0iLCByZXdyaXRlRWxlbWVudFR5cGU9Ik5vZGUiLCAuLi4pPgorPj4KKworLyoqIEEgc2ltcGxlciB2ZXJzaW9uIG9mIGEgcnVsZSB0ZW1wbGF0ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBpbWFnaW5hcnkKKyAqICBydWxlcyBjcmVhdGVkIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gIEFzIHRoZXkgbmV2ZXIgaGF2ZSByZXR1cm4gdmFsdWVzCisgKiAgbm9yIHBhcmFtZXRlcnMgZXRjLi4uLCBqdXN0IGdpdmUgc2ltcGxlc3QgcG9zc2libGUgbWV0aG9kLiAgRG9uJ3QgZG8KKyAqICBhbnkgb2YgdGhlIG5vcm1hbCBtZW1vaXphdGlvbiBzdHVmZiBpbiBoZXJlIGVpdGhlcjsgaXQncyBhIHdhc3RlLgorICogIEFzIHByZWRpY2F0ZXMgY2Fubm90IGJlIGlubGluZWQgaW50byB0aGUgaW52b2tpbmcgcnVsZSwgdGhleSBuZWVkIHRvCisgKiAgYmUgaW4gYSBydWxlIGJ5IHRoZW1zZWx2ZXMuCisgKi8KK3N5bnByZWRSdWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGRlc2NyaXB0aW9uLCBuYWtlZEJsb2NrKSA6Oj0KKzw8CitbQ29uZGl0aW9uYWwoIkFOVExSX1RSQUNFIildCitwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEVudGVyUnVsZV88cnVsZU5hbWU+X2ZyYWdtZW50KCkge30KK1tDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KK3Byb3RlY3RlZCB2aXJ0dWFsIHZvaWQgTGVhdmVSdWxlXzxydWxlTmFtZT5fZnJhZ21lbnQoKSB7fQorCisvLyAkQU5UTFIgc3RhcnQgPHJ1bGVOYW1lPgorcHVibGljIDwhZmluYWwgIT52b2lkIDxydWxlTmFtZT5fZnJhZ21lbnQoPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KQoreworCTxydWxlTGFiZWxEZWZzKCk+CisJRW50ZXJSdWxlXzxydWxlTmFtZT5fZnJhZ21lbnQoKTsKKwlFbnRlclJ1bGUoIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKwlUcmFjZUluKCI8cnVsZU5hbWU+X2ZyYWdtZW50IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJdHJ5CisJeworCQk8YmxvY2s+CisJfQorCWZpbmFsbHkKKwl7CisJCVRyYWNlT3V0KCI8cnVsZU5hbWU+X2ZyYWdtZW50IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJCUxlYXZlUnVsZSgiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCQlMZWF2ZVJ1bGVfPHJ1bGVOYW1lPl9mcmFnbWVudCgpOworCX0KK30KKy8vICRBTlRMUiBlbmQgPHJ1bGVOYW1lPgorPj4KKworaW5zZXJ0TGV4ZXJTeW5wcmVkcyhzeW5wcmVkcykgOjo9IDw8Cis8aW5zZXJ0U3lucHJlZHMoc3lucHJlZHMpPgorPj4KKworaW5zZXJ0U3lucHJlZHMoc3lucHJlZHMpIDo6PSA8PAorPGlmKHN5bnByZWRzKT4KKyNyZWdpb24gU3lucHJlZHMKK3ByaXZhdGUgYm9vbCBFdmFsdWF0ZVByZWRpY2F0ZShTeXN0ZW0uQWN0aW9uIGZyYWdtZW50KQoreworCWJvb2wgc3VjY2VzcyA9IGZhbHNlOworCXN0YXRlLmJhY2t0cmFja2luZysrOworCTxAc3RhcnQoKT4KKwl0cnkgeyBEZWJ1Z0JlZ2luQmFja3RyYWNrKHN0YXRlLmJhY2t0cmFja2luZyk7CisJaW50IHN0YXJ0ID0gaW5wdXQuTWFyaygpOworCXRyeQorCXsKKwkJZnJhZ21lbnQoKTsKKwl9CisJY2F0Y2ggKCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSApCisJeworCQlTeXN0ZW0uQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImltcG9zc2libGU6ICIrcmUpOworCX0KKwlzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKwlpbnB1dC5SZXdpbmQoc3RhcnQpOworCX0gZmluYWxseSB7IERlYnVnRW5kQmFja3RyYWNrKHN0YXRlLmJhY2t0cmFja2luZywgc3VjY2Vzcyk7IH0KKwk8QHN0b3AoKT4KKwlzdGF0ZS5iYWNrdHJhY2tpbmctLTsKKwlzdGF0ZS5mYWlsZWQ9ZmFsc2U7CisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisjZW5kcmVnaW9uIFN5bnByZWRzCis8ZW5kaWY+Cis+PgorCitydWxlTWVtb2l6YXRpb24obmFtZSkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+CitpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMCAmJiBBbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PikpIHsgPHJldHVybkZyb21SdWxlKCk+IH0KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdGVzdCBmb3IgZmFpbHVyZSBhbmQgcmV0dXJuIGZyb20gcnVsZSAqLworY2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKHN0YXRlLmZhaWxlZCkgPHJldHVybkZyb21SdWxlKCk+PGVuZGlmPgorPj4KKworLyoqIFRoaXMgcnVsZSBoYXMgZmFpbGVkLCBleGl0IGluZGljYXRpbmcgZmFpbHVyZSBkdXJpbmcgYmFja3RyYWNrICovCitydWxlQmFja3RyYWNrRmFpbHVyZSgpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IDxyZXR1cm5Gcm9tUnVsZSgpPn08ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcnVsZS4gIFRoaXMgaW5jbHVkZXMgYW55IHJldHVybiB0eXBlCisgKiAgZGF0YSBhZ2dyZWdhdGVzIHJlcXVpcmVkIGZvciBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgorICovCitydWxlKHJ1bGVOYW1lLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLGVtcHR5UnVsZSxkZXNjcmlwdGlvbixleGNlcHRpb25zLGZpbmFsbHksbWVtb2l6ZSkgOjo9IDw8Cis8cnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+Cis8cmV0dXJuU2NvcGUocnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUpPgorCitbQ29uZGl0aW9uYWwoIkFOVExSX1RSQUNFIildCitwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIEVudGVyUnVsZV88cnVsZU5hbWU+KCkge30KK1tDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KK3Byb3RlY3RlZCB2aXJ0dWFsIHZvaWQgTGVhdmVSdWxlXzxydWxlTmFtZT4oKSB7fQorCisvLyAkQU5UTFIgc3RhcnQgIjxydWxlTmFtZT4iCisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK1tHcmFtbWFyUnVsZSgiPHJ1bGVOYW1lPiIpXQorPHJ1bGVNb2RpZmllcihncmFtbWFyPWdyYW1tYXIscnVsZURlc2NyaXB0b3I9cnVsZURlc2NyaXB0b3IpPiA8cmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcik+IDxydWxlTmFtZTsgZm9ybWF0PSJpZCI+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPikKK3sKKwlFbnRlclJ1bGVfPHJ1bGVOYW1lPigpOworCUVudGVyUnVsZSgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCVRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIDxydWxlTGFiZWxEZWZzKCk+CisgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKwl0cnkgeyBEZWJ1Z0VudGVyUnVsZShHcmFtbWFyRmlsZU5hbWUsICI8cnVsZU5hbWU+Iik7CisJRGVidWdMb2NhdGlvbig8cnVsZURlc2NyaXB0b3IudHJlZS5saW5lPiwgPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUuY2hhclBvc2l0aW9uSW5MaW5lPik7CisJPEBwcmVhbWJsZSgpPgorCXRyeQorCXsKKwkJPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKwkJPGJsb2NrPgorCQk8cnVsZUNsZWFuVXAoKT4KKwkJPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWN0aW9uKCk+CisJfQorPGlmKGV4Y2VwdGlvbnMpPgorCTxleGNlcHRpb25zOntlfDxjYXRjaChkZWNsPWUuZGVjbCxhY3Rpb249ZS5hY3Rpb24pPjxcbj59PgorPGVsc2U+Cis8aWYoIWVtcHR5UnVsZSk+Cis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaCk+CisJPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2g+Cis8ZWxzZT4KKwljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpCisJeworCQlSZXBvcnRFcnJvcihyZSk7CisJCVJlY292ZXIoaW5wdXQscmUpOworCTxAc2V0RXJyb3JSZXR1cm5WYWx1ZSgpPgorCX0KKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKwlmaW5hbGx5CisJeworCQlUcmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCQlMZWF2ZVJ1bGUoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKwkJTGVhdmVSdWxlXzxydWxlTmFtZT4oKTsKKyAgICAgICAgPG1lbW9pemUoKT4KKyAgICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgICAgPGZpbmFsbHk+CisgICAgfQorIAlEZWJ1Z0xvY2F0aW9uKDxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmxpbmU+LCA8cnVsZURlc2NyaXB0b3IuRU9STm9kZS5jaGFyUG9zaXRpb25JbkxpbmU+KTsKKwl9IGZpbmFsbHkgeyBEZWJ1Z0V4aXRSdWxlKEdyYW1tYXJGaWxlTmFtZSwgIjxydWxlTmFtZT4iKTsgfQorCTxAcG9zdGFtYmxlKCk+CisJPHJldHVybkZyb21SdWxlKCk+PFxuPgorfQorLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKKy8vIGltcG9ydGVkIGdyYW1tYXJzIG5lZWQgdG8gaGF2ZSBpbnRlcm5hbCBydWxlcworcnVsZU1vZGlmaWVyKGdyYW1tYXIscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+PGNzaGFycFZpc2liaWxpdHlNYXAuKHJ1bGVEZXNjcmlwdG9yLm1vZGlmaWVyKTsgbnVsbD0icHJpdmF0ZSI+PGVsc2U+aW50ZXJuYWw8ZW5kaWY+Cis+PgorCisvLyBpbXBvcnRlZCBncmFtbWFycyBuZWVkIHRvIGhhdmUgcHVibGljIHJldHVybiBzY29wZXMKK3JldHVyblNjb3BlTW9kaWZpZXIoZ3JhbW1hcixydWxlRGVzY3JpcHRvcikgOjo9IDw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT48Y3NoYXJwVmlzaWJpbGl0eU1hcC4ocnVsZURlc2NyaXB0b3IubW9kaWZpZXIpOyBudWxsPSJwcml2YXRlIj48ZWxzZT5wdWJsaWM8ZW5kaWY+Cis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitjYXRjaCAoPGUuZGVjbD4pCit7CisJPGUuYWN0aW9uPgorfQorPj4KKworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxyZXR1cm5UeXBlKHJ1bGVEZXNjcmlwdG9yKT4gcmV0dmFsID0gbmV3IDxyZXR1cm5UeXBlKHJ1bGVEZXNjcmlwdG9yKT4oKTsKK3JldHZhbC5TdGFydCA9ICg8bGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxlbHNlPgorPHJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlLmF0dHJpYnV0ZXM6eyBhIHwKKzxhLnR5cGU+IDxhLm5hbWU7IGZvcm1hdD0iaWQiPiA9IDxpZihhLmluaXRWYWx1ZSk+PGEuaW5pdFZhbHVlPjxlbHNlPjxpbml0VmFsdWUoYS50eXBlKT48ZW5kaWY+OworfT4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KK2ludCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCA9IGlucHV0LkluZGV4OworPGVuZGlmPgorPj4KKworcnVsZVNjb3BlU2V0VXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6e2l0fDxpdD5fc3RhY2suUHVzaChuZXcgPGl0Pl9zY29wZSgpKTs8aXQ+X3Njb3BlSW5pdCg8aXQ+X3N0YWNrLlBlZWsoKSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdHw8aXQubmFtZT5fc3RhY2suUHVzaChuZXcgPGl0Lm5hbWU+X3Njb3BlKCkpOzxpdC5uYW1lPl9zY29wZUluaXQoPGl0Lm5hbWU+X3N0YWNrLlBlZWsoKSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlU2NvcGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOntpdHw8aXQ+X3Njb3BlQWZ0ZXIoPGl0Pl9zdGFjay5QZWVrKCkpOzxpdD5fc3RhY2suUG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdHw8aXQubmFtZT5fc2NvcGVBZnRlcig8aXQubmFtZT5fc3RhY2suUGVlaygpKTs8aXQubmFtZT5fc3RhY2suUG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMYWJlbHMscnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGlzdExhYmVsc10KKyAgICA6e2l0fDxsYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0PiA9IGRlZmF1bHQoPGxhYmVsVHlwZT4pO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzCisgICAgOntpdHxMaXN0XDw8bGFiZWxUeXBlPlw+IGxpc3RfPGl0LmxhYmVsLnRleHQ+ID0gbnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPFtydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXR8TGlzdFw8PEFTVExhYmVsVHlwZT5cPiBsaXN0XzxpdC5sYWJlbC50ZXh0PiA9IG51bGw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzOnJ1bGVMYWJlbERlZigpOyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsczpydWxlTGFiZWxEZWYoKTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitsZXhlclJ1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6e2l0fDxsYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0PiA9IGRlZmF1bHQoPGxhYmVsVHlwZT4pO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLmNoYXJMaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5jaGFyTGFiZWxzXQorCTp7aXR8aW50IDxpdC5sYWJlbC50ZXh0PiA9IDA7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc10KKyAgICA6e2l0fExpc3RcPDxsYWJlbFR5cGU+XD4gbGlzdF88aXQubGFiZWwudGV4dD4gPSBudWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxpc3RMYWJlbHM6e2l0fExpc3RcPGludFw+IGxpc3RfPGl0LmxhYmVsLnRleHQ+ID0gbnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworcmV0dXJuRnJvbVJ1bGUoKSA6Oj0gPCUKK3JldHVybgorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+Cis8ISBUaGlzIGNvbW1lbnQgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nCisgICBzaW5nbGUgc3BhY2UgYXBwZWFycyBpbiB0aGUgb3V0cHV0LiAhPiA8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5OYW1lPgorPGVsc2U+Cis8ISE+IHJldHZhbAorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorOworJT4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoIVRSRUVfUEFSU0VSKT4KK3JldHZhbC5TdG9wID0gKDxsYWJlbFR5cGU+KWlucHV0LkxUKC0xKTsKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK21lbW9pemUoKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKHN0YXRlLmJhY2t0cmFja2luZyA+IDApIHsgTWVtb2l6ZShpbnB1dCwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PiwgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXgpOyB9Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcnVsZSBpbiB0aGUgbGV4ZXI7IG5ha2VkIGJsb2NrcyBhcmUgdXNlZCBmb3IKKyAqICBmcmFnbWVudCBydWxlcy4KKyAqLworbGV4ZXJSdWxlKHJ1bGVOYW1lLG5ha2VkQmxvY2sscnVsZURlc2NyaXB0b3IsYmxvY2ssbWVtb2l6ZSkgOjo9IDw8CisKK1tDb25kaXRpb25hbCgiQU5UTFJfVFJBQ0UiKV0KK3Byb3RlY3RlZCB2aXJ0dWFsIHZvaWQgRW50ZXJSdWxlXzxydWxlTmFtZT4oKSB7fQorW0NvbmRpdGlvbmFsKCJBTlRMUl9UUkFDRSIpXQorcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBMZWF2ZVJ1bGVfPHJ1bGVOYW1lPigpIHt9CisKKy8vICRBTlRMUiBzdGFydCAiPHJ1bGVOYW1lPiIKK1tHcmFtbWFyUnVsZSgiPHJ1bGVOYW1lPiIpXQorPHJ1bGVNb2RpZmllcihncmFtbWFyPWdyYW1tYXIscnVsZURlc2NyaXB0b3I9cnVsZURlc2NyaXB0b3IpPiB2b2lkIG08cnVsZU5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPikKK3sKKwlFbnRlclJ1bGVfPHJ1bGVOYW1lPigpOworCUVudGVyUnVsZSgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCVRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorCQl0cnkKKwkJeworPGlmKG5ha2VkQmxvY2spPgorCQk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCQk8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisJCTxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisJCTxibG9jaz4KKzxlbHNlPgorCQlpbnQgX3R5cGUgPSA8cnVsZU5hbWU+OworCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCQk8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisJCTxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisJCTxibG9jaz4KKwkJPHJ1bGVDbGVhblVwKCk+CisJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQk8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKzxlbmRpZj4KKwl9CisJZmluYWxseQorCXsKKwkJVHJhY2VPdXQoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKwkJTGVhdmVSdWxlKCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJCUxlYXZlUnVsZV88cnVsZU5hbWU+KCk7CisgICAgICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgICAgIDxtZW1vaXplKCk+CisgICAgfQorfQorLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorCitwdWJsaWMgb3ZlcnJpZGUgdm9pZCBtVG9rZW5zKCkKK3sKKwk8YmxvY2s+PFxuPgorfQorPj4KKworLy8gUyBVIEIgUiBVIEwgRSBTCisKKy8qKiBBICguLi4pIHN1YnJ1bGUgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK2Jsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cit0cnkgeyBEZWJ1Z0VudGVyU3ViUnVsZSg8ZGVjaXNpb25OdW1iZXI+KTsKK3RyeSB7IERlYnVnRW50ZXJEZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+LCBkZWNpc2lvbkNhbkJhY2t0cmFja1s8ZGVjaXNpb25OdW1iZXI+XSk7Cis8ZGVjaXNpb24+Cit9IGZpbmFsbHkgeyBEZWJ1Z0V4aXREZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KTsgfQorPEBwb3N0ZGVjaXNpb24oKT4KKzxAcHJlYnJhbmNoKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pCit7Cis8YWx0czp7YXw8YWx0U3dpdGNoQ2FzZShpLGEpPn0+Cit9Cit9IGZpbmFsbHkgeyBEZWJ1Z0V4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOyB9Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK2ludCBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworPGRlY2xzPgorPEBwcmVkZWNpc2lvbigpPgordHJ5IHsgRGVidWdFbnRlckRlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4sIGRlY2lzaW9uQ2FuQmFja3RyYWNrWzxkZWNpc2lvbk51bWJlcj5dKTsKKzxkZWNpc2lvbj4KK30gZmluYWxseSB7IERlYnVnRXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pOyB9Cis8QHBvc3RkZWNpc2lvbigpPgorc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KQoreworPGFsdHM6e2F8PGFsdFN3aXRjaENhc2UoaSxhKT59PgorfQorPj4KKworcnVsZUJsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVhbHQoKT4KK0RlYnVnRW50ZXJBbHQoMSk7Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgc3BlY2lhbCBjYXNlIG9mIGEgKC4uLikgc3VicnVsZSB3aXRoIGEgc2luZ2xlIGFsdGVybmF0aXZlICovCitibG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+CitEZWJ1Z0VudGVyQWx0KDEpOworPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBICguLikrIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworcG9zaXRpdmVDbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitpbnQgY250PGRlY2lzaW9uTnVtYmVyPj0wOworPGRlY2xzPgorPEBwcmVsb29wKCk+Cit0cnkgeyBEZWJ1Z0VudGVyU3ViUnVsZSg8ZGVjaXNpb25OdW1iZXI+KTsKK3doaWxlICh0cnVlKQoreworCWludCBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworCTxAcHJlZGVjaXNpb24oKT4KKwl0cnkgeyBEZWJ1Z0VudGVyRGVjaXNpb24oPGRlY2lzaW9uTnVtYmVyPiwgZGVjaXNpb25DYW5CYWNrdHJhY2tbPGRlY2lzaW9uTnVtYmVyPl0pOworCTxkZWNpc2lvbj4KKwl9IGZpbmFsbHkgeyBEZWJ1Z0V4aXREZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KTsgfQorCTxAcG9zdGRlY2lzaW9uKCk+CisJc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KQorCXsKKwk8YWx0czp7YXw8YWx0U3dpdGNoQ2FzZShpLGEpPn0+CisJZGVmYXVsdDoKKwkJaWYgKGNudDxkZWNpc2lvbk51bWJlcj4gPj0gMSkKKwkJCWdvdG8gbG9vcDxkZWNpc2lvbk51bWJlcj47CisKKwkJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJCUVhcmx5RXhpdEV4Y2VwdGlvbiBlZWU8ZGVjaXNpb25OdW1iZXI+ID0gbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbiggPGRlY2lzaW9uTnVtYmVyPiwgaW5wdXQgKTsKKwkJRGVidWdSZWNvZ25pdGlvbkV4Y2VwdGlvbihlZWU8ZGVjaXNpb25OdW1iZXI+KTsKKwkJPEBlYXJseUV4aXRFeGNlcHRpb24oKT4KKwkJdGhyb3cgZWVlPGRlY2lzaW9uTnVtYmVyPjsKKwl9CisJY250PGRlY2lzaW9uTnVtYmVyPisrOworfQorbG9vcDxkZWNpc2lvbk51bWJlcj46CisJOworCit9IGZpbmFsbHkgeyBEZWJ1Z0V4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOyB9Cis8QHBvc3Rsb29wKCk+Cis+PgorCitwb3NpdGl2ZUNsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKworLyoqIEEgKC4uKSogYmxvY2sgd2l0aCAxIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitjbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK3RyeSB7IERlYnVnRW50ZXJTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOword2hpbGUgKHRydWUpCit7CisJaW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47CisJPEBwcmVkZWNpc2lvbigpPgorCXRyeSB7IERlYnVnRW50ZXJEZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+LCBkZWNpc2lvbkNhbkJhY2t0cmFja1s8ZGVjaXNpb25OdW1iZXI+XSk7CisJPGRlY2lzaW9uPgorCX0gZmluYWxseSB7IERlYnVnRXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pOyB9CisJPEBwb3N0ZGVjaXNpb24oKT4KKwlzd2l0Y2ggKCBhbHQ8ZGVjaXNpb25OdW1iZXI+ICkKKwl7CisJPGFsdHM6e2F8PGFsdFN3aXRjaENhc2UoaSxhKT59PgorCWRlZmF1bHQ6CisJCWdvdG8gbG9vcDxkZWNpc2lvbk51bWJlcj47CisJfQorfQorCitsb29wPGRlY2lzaW9uTnVtYmVyPjoKKwk7CisKK30gZmluYWxseSB7IERlYnVnRXhpdFN1YlJ1bGUoPGRlY2lzaW9uTnVtYmVyPik7IH0KKzxAcG9zdGxvb3AoKT4KKz4+CisKK2Nsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gY2xvc3VyZUJsb2NrCisKKy8qKiBPcHRpb25hbCBibG9ja3MgKHgpPyBhcmUgdHJhbnNsYXRlZCB0byAoeHwpIGJ5IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24KKyAqICBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBibG9jayB0ZW1wbGF0ZQorICovCitvcHRpb25hbEJsb2NrIDo6PSBibG9jaworCitvcHRpb25hbEJsb2NrU2luZ2xlQWx0IDo6PSBibG9jaworCisvKiogQSBjYXNlIGluIGEgc3dpdGNoIHRoYXQganVtcHMgdG8gYW4gYWx0ZXJuYXRpdmUgZ2l2ZW4gdGhlIGFsdGVybmF0aXZlCisgKiAgbnVtYmVyLiAgQSBERkEgcHJlZGljdHMgdGhlIGFsdGVybmF0aXZlIGFuZCB0aGVuIGEgc2ltcGxlIHN3aXRjaAorICogIGRvZXMgdGhlIGp1bXAgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBtYXRjaGVzIHRoYXQgYWx0ZXJuYXRpdmUuCisgKi8KK2FsdFN3aXRjaENhc2UoYWx0TnVtLGFsdCkgOjo9IDw8CitjYXNlIDxhbHROdW0+OgorCTxAcHJlYWx0KCk+CisJRGVidWdFbnRlckFsdCg8YWx0TnVtPik7CisJPGFsdD4KKwlicmVhazs8XG4+Cis+PgorCisvKiogQW4gYWx0ZXJuYXRpdmUgaXMganVzdCBhIGxpc3Qgb2YgZWxlbWVudHM7IGF0IG91dGVybW9zdCBsZXZlbCAqLworYWx0KGVsZW1lbnRzLGFsdE51bSxkZXNjcmlwdGlvbixhdXRvQVNULG91dGVyQWx0LHRyZWVMZXZlbCxyZXcpIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit7Cis8QGRlY2xhcmF0aW9ucygpPgorPGVsZW1lbnRzOmVsZW1lbnQoKT4KKzxyZXc+Cis8QGNsZWFudXAoKT4KK30KKz4+CisKKy8qKiBXaGF0IHRvIGVtaXQgd2hlbiB0aGVyZSBpcyBubyByZXdyaXRlLiAgRm9yIGF1dG8gYnVpbGQKKyAqICBtb2RlLCBkb2VzIG5vdGhpbmcuCisgKi8KK25vUmV3cml0ZShyZXdyaXRlQmxvY2tMZXZlbCwgdHJlZUxldmVsKSA6Oj0gIiIKKworLy8gRSBMIEUgTSBFIE4gVCBTCisKKy8qKiBEdW1wIHRoZSBlbGVtZW50cyBvbmUgcGVyIGxpbmUgKi8KK2VsZW1lbnQoaXQpIDo6PSA8JQorPEBwcmVtYXRjaCgpPgorRGVidWdMb2NhdGlvbig8aXQubGluZT4sIDxpdC5wb3M+KTs8XG4+Cis8aXQuZWw+PFxuPgorJT4KKworLyoqIG1hdGNoIGEgdG9rZW4gb3B0aW9uYWxseSB3aXRoIGEgbGFiZWwgaW4gZnJvbnQgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw+PSg8bGFiZWxUeXBlPik8ZW5kaWY+TWF0Y2goaW5wdXQsPHRva2VuPixGb2xsb3cuXzx0b2tlbj5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPUlEICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKK2xpc3RMYWJlbEVsZW0obGFiZWwsZWxlbSxlbGVtVHlwZSkgOjo9IDw8CitpZiAobGlzdF88bGFiZWw+PT1udWxsKSBsaXN0XzxsYWJlbD49bmV3IExpc3RcPDxlbGVtVHlwZTsgbnVsbD17PGxhYmVsVHlwZT59Plw+KCk7CitsaXN0XzxsYWJlbD4uQWRkKDxlbGVtPik7PFxuPgorPj4KKworLyoqIG1hdGNoIGEgY2hhcmFjdGVyICovCitjaGFyUmVmKGNoYXIsbGFiZWwpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CitNYXRjaCg8Y2hhcj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIG1hdGNoIGEgY2hhcmFjdGVyIHJhbmdlICovCitjaGFyUmFuZ2VSZWYoYSxiLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gaW5wdXQuTEEoMSk7PFxuPgorPGVuZGlmPgorTWF0Y2hSYW5nZSg8YT4sPGI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBGb3Igbm93LCBzZXRzIGFyZSBpbnRlcnZhbCB0ZXN0cyBhbmQgbXVzdCBiZSB0ZXN0ZWQgaW5saW5lICovCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZT0iIikgOjo9IDw8Cis8aWYobGFiZWwpPgorPG1hdGNoU2V0TGFiZWwoKT4KKzxlbmRpZj4KK2lmICg8cz4pCit7CisJaW5wdXQuQ29uc3VtZSgpOworCTxwb3N0bWF0Y2hDb2RlPgorCTxpZighTEVYRVIpPnN0YXRlLmVycm9yUmVjb3Zlcnk9ZmFsc2U7PGVuZGlmPjxpZihiYWNrdHJhY2tpbmcpPnN0YXRlLmZhaWxlZD1mYWxzZTs8ZW5kaWY+Cit9CitlbHNlCit7CisJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKwlEZWJ1Z1JlY29nbml0aW9uRXhjZXB0aW9uKG1zZSk7CisJPEBtaXNtYXRjaGVkU2V0RXhjZXB0aW9uKCk+Cis8aWYoTEVYRVIpPgorCVJlY292ZXIobXNlKTsKKwl0aHJvdyBtc2U7Cis8ZWxzZT4KKwl0aHJvdyBtc2U7CisJPCEgdXNlIGZvbGxvd2luZyBjb2RlIHRvIG1ha2UgaXQgcmVjb3ZlciBpbmxpbmU7IHJlbW92ZSB0aHJvdyBtc2U7CisJcmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KGlucHV0LG1zZSxGb2xsb3cuX3NldF9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworCSE+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworbWF0Y2hTZXRVbmNoZWNrZWQocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZT1mYWxzZSkgOjo9IDwlCis8aWYobGFiZWwpPgorPG1hdGNoU2V0TGFiZWwoKT48XG4+Cis8ZW5kaWY+CitpbnB1dC5Db25zdW1lKCk7PFxuPgorPGlmKHBvc3RtYXRjaENvZGUpPgorPHBvc3RtYXRjaENvZGU+PFxuPgorPGVuZGlmPgorPGlmKCFMRVhFUik+c3RhdGUuZXJyb3JSZWNvdmVyeT1mYWxzZTs8ZW5kaWY+PGlmKGJhY2t0cmFja2luZyk+c3RhdGUuZmFpbGVkPWZhbHNlOzxlbmRpZj4KKyU+CisKK21hdGNoU2V0TGFiZWwoKSA6Oj0gPCUKKzxpZihMRVhFUik+Cis8bGFiZWw+PSBpbnB1dC5MQSgxKTsKKzxlbHNlPgorPGxhYmVsPj0oPGxhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8ZW5kaWY+CislPgorCittYXRjaFJ1bGVCbG9ja1NldCA6Oj0gbWF0Y2hTZXQKKworbWF0Y2hTZXRBbmRMaXN0TGFiZWwocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogTWF0Y2ggYSBzdHJpbmcgbGl0ZXJhbCAqLworbGV4ZXJTdHJpbmdSZWYoc3RyaW5nLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDwlCis8aWYobGFiZWwpPgoraW50IDxsYWJlbD5TdGFydCA9IENoYXJJbmRleDs8XG4+CitNYXRjaCg8c3RyaW5nPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgoraW50IDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PiA9IExpbmU7PFxuPgoraW50IDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PiA9IENoYXJQb3NpdGlvbkluTGluZTs8XG4+Cis8bGFiZWw+ID0gbmV3IDxsYWJlbFR5cGU+KGlucHV0LCBUb2tlblR5cGVzLkludmFsaWQsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCwgPGxhYmVsPlN0YXJ0LCBDaGFySW5kZXgtMSk7PFxuPgorPGxhYmVsPi5MaW5lID0gPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+Ozxcbj4KKzxsYWJlbD4uQ2hhclBvc2l0aW9uSW5MaW5lID0gPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+OworPGVsc2U+CitNYXRjaCg8c3RyaW5nPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGVuZGlmPgorJT4KKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj0oPGxhYmVsVHlwZT4paW5wdXQuTFQoMSk7PFxuPgorPGVuZGlmPgorTWF0Y2hBbnkoaW5wdXQpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKword2lsZGNhcmRBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8d2lsZGNhcmQoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogTWF0Y2ggLiB3aWxkY2FyZCBpbiBsZXhlciAqLword2lsZGNhcmRDaGFyKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CitNYXRjaEFueSgpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKword2lsZGNhcmRDaGFyTGlzdExhYmVsKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkQ2hhciguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4gIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZQorICogIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcworICogIHNhbWU6IHRoZSBydWxlIG5hbWUuICBOb3cgdGhvdWdoIHlvdSBjYW4gYWNjZXNzIGZ1bGwgcnVsZQorICogIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitQdXNoRm9sbG93KEZvbGxvdy5fPHJ1bGUubmFtZT5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKzxpZihsYWJlbCk+PGxhYmVsPj08ZW5kaWY+PGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj48cnVsZS5uYW1lOyBmb3JtYXQ9ImlkIj4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7CitQb3BGb2xsb3coKTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1yICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9ezxBU1RMYWJlbFR5cGU+fSwuLi4pPgorPj4KKworLyoqIEEgbGV4ZXIgcnVsZSByZWZlcmVuY2UuCisgKgorICogIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZSB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93CisgKiAgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcyBzYW1lOiB0aGUgcnVsZSBuYW1lLgorICogIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK2xleGVyUnVsZVJlZihydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPCUKKzxpZihsYWJlbCk+CitpbnQgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4gPSBDaGFySW5kZXg7PFxuPgoraW50IDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PiA9IExpbmU7PFxuPgoraW50IDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PiA9IENoYXJQb3NpdGlvbkluTGluZTs8XG4+Cis8aWYoc2NvcGUpPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4uPGVuZGlmPm08cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+Cis8bGFiZWw+ID0gbmV3IDxsYWJlbFR5cGU+KGlucHV0LCBUb2tlblR5cGVzLkludmFsaWQsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIENoYXJJbmRleC0xKTs8XG4+Cis8bGFiZWw+LkxpbmUgPSA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD47PFxuPgorPGxhYmVsPi5DaGFyUG9zaXRpb25JbkxpbmUgPSA8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD47Cis8ZWxzZT4KKzxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorJT4KKworLyoqIGkrPUlOVCBpbiBsZXhlciAqLworbGV4ZXJSdWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGxleGVyUnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBFT0YgaW4gdGhlIGxleGVyICovCitsZXhlck1hdGNoRU9GKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDwlCis8aWYobGFiZWwpPgoraW50IDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+ID0gQ2hhckluZGV4Ozxcbj4KK2ludCA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4gPSBMaW5lOzxcbj4KK2ludCA8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4gPSBDaGFyUG9zaXRpb25JbkxpbmU7PFxuPgorTWF0Y2goRU9GKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+Cis8bGFiZWxUeXBlPiA8bGFiZWw+ID0gbmV3IDxsYWJlbFR5cGU+KGlucHV0LCBFT0YsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIENoYXJJbmRleC0xKTs8XG4+Cis8bGFiZWw+LkxpbmUgPSA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD47PFxuPgorPGxhYmVsPi5DaGFyUG9zaXRpb25JbkxpbmUgPSA8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD47Cis8ZWxzZT4KK01hdGNoKEVPRik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+CislPgorCisvLyB1c2VkIGZvciBsZWZ0LXJlY3Vyc2l2ZSBydWxlcworcmVjUnVsZURlZkFyZygpICAgICAgICAgICAgICAgICAgICAgICA6Oj0gImludCA8cmVjUnVsZUFyZygpPiIKK3JlY1J1bGVBcmcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgOjo9ICJfcCIKK3JlY1J1bGVBbHRQcmVkaWNhdGUocnVsZU5hbWUsb3BQcmVjKSAgOjo9ICI8cmVjUnVsZUFyZygpPiBcPD0gPG9wUHJlYz4iCityZWNSdWxlU2V0UmVzdWx0QWN0aW9uKCkgICAgICAgICAgICAgIDo6PSAicm9vdF8wPSQ8cnVsZU5hbWU+X3ByaW1hcnkudHJlZTsiCityZWNSdWxlU2V0UmV0dXJuQWN0aW9uKHNyYyxuYW1lKSAgICAgIDo6PSAiJDxuYW1lPj0kPHNyYz4uPG5hbWU+OyIKKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8cm9vdDplbGVtZW50KCk+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKGlucHV0LkxBKDEpID09IFRva2VuVHlwZXMuRG93bikKK3sKKwlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwk8Y2hpbGRyZW46ZWxlbWVudCgpPgorCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK30KKzxlbHNlPgorTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8Y2hpbGRyZW46ZWxlbWVudCgpPgorTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIEV2ZXJ5IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdmFsaWRhdGluZyBwcmVkaWNhdGUgKGV2ZW4gd2hlbiBpdCBpcworICogIGFsc28gaG9pc3RlZCBpbnRvIGEgcHJlZGljdGlvbiBleHByZXNzaW9uKS4KKyAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2lmICghKDxldmFsUHJlZGljYXRlKC4uLik+KSkKK3sKKwk8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwl0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+Iik7Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitpbnQgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KK2Vsc2UKK3sKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisJYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47Cis8ZWxzZT4KKwk8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiwgaW5wdXQpOworCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7CisJPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorCXRocm93IG52YWU7Cis8ZW5kaWY+Cit9Cis+PgorCisvKiogU2FtZSBhcyBhIG5vcm1hbCBERkEgc3RhdGUgZXhjZXB0IHRoYXQgd2UgZG9uJ3QgZXhhbWluZSBsb29rYWhlYWQKKyAqICBmb3IgdGhlIGJ5cGFzcyBhbHRlcm5hdGl2ZS4gIEl0IGRlbGF5cyBlcnJvciBkZXRlY3Rpb24gYnV0IHRoaXMKKyAqICBpcyBmYXN0ZXIsIHNtYWxsZXIsIGFuZCBtb3JlIHdoYXQgcGVvcGxlIGV4cGVjdC4gIEZvciAoWCk/IHBlb3BsZQorICogIGV4cGVjdCAiaWYgKCBMQSgxKT09WCApIG1hdGNoKFgpOyIgYW5kIHRoYXQncyBpdC4KKyAqLworZGZhT3B0aW9uYWxCbG9ja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK2ludCBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LkxBKDxrPik7PFxuPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorPj4KKworLyoqIEEgREZBIHN0YXRlIHRoYXQgaXMgYWN0dWFsbHkgdGhlIGxvb3BiYWNrIGRlY2lzaW9uIG9mIGEgY2xvc3VyZQorICogIGxvb3AuICBJZiBlbmQtb2YtdG9rZW4gKEVPVCkgcHJlZGljdHMgYW55IG9mIHRoZSB0YXJnZXRzIHRoZW4gaXQKKyAqICBzaG91bGQgYWN0IGxpa2UgYSBkZWZhdWx0IGNsYXVzZSAoaS5lLiwgbm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCkuCisgKiAgVGhpcyBpcyB1c2VkIG9ubHkgaW4gdGhlIGxleGVyIHNvIHRoYXQgZm9yICgnYScpKiBvbiB0aGUgZW5kIG9mIGEgcnVsZQorICogIGFueXRoaW5nIG90aGVyIHRoYW4gJ2EnIHByZWRpY3RzIGV4aXRpbmcuCisgKi8KK2RmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAoraW50IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoPGs+KTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KKzxpZighZWRnZXMpPgorYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47PCEgaWYgbm8gZWRnZXMsIGRvbid0IGdlbiBFTFNFICE+Cis8ZWxzZT4KK2Vsc2UKK3sKKwlhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKK308XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogQW4gYWNjZXB0IHN0YXRlIGluZGljYXRlcyBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBoYXMgYmVlbiBwcmVkaWN0ZWQgKi8KK2RmYUFjY2VwdFN0YXRlKGFsdCkgOjo9ICJhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGFsdD47IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICgoPGxhYmVsRXhwcj4pPGlmKHByZWRpY2F0ZXMpPiAmJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pCit7CisJPHRhcmdldFN0YXRlPgorfQorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKHN3aXRjaCBjYXNlKQorCisvKiogQSBERkEgc3RhdGUgd2hlcmUgYSBTV0lUQ0ggbWF5IGJlIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGdlbmVyYXRvcgorICogIGRlY2lkZXMgaWYgdGhpcyBpcyBwb3NzaWJsZTogQ29kZUdlbmVyYXRvci5jYW5HZW5lcmF0ZVN3aXRjaCgpLgorICovCitkZmFTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKGlucHV0LkxBKDxrPikpCit7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorZGVmYXVsdDoKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisJYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworCWJyZWFrOzxcbj4KKzxlbHNlPgorCXsKKwkJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjxkZXNjcmlwdGlvbj4iLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCBpbnB1dCk7CisJCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7CisJCTxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKwkJdGhyb3cgbnZhZTsKKwl9Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoaW5wdXQuTEEoPGs+KSkKK3sKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworZGZhTG9vcGJhY2tTdGF0ZVN3aXRjaChrLCBlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoIChpbnB1dC5MQSg8az4pKQoreworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitkZWZhdWx0OgorCWFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKwlicmVhazs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhRWRnZVN3aXRjaChsYWJlbHMsIHRhcmdldFN0YXRlKSA6Oj0gPDwKKzxsYWJlbHM6e2l0fGNhc2UgPGl0Pjp9OyBzZXBhcmF0b3I9IlxuIj4KKwl7CisJPHRhcmdldFN0YXRlPgorCX0KKwlicmVhazsKKz4+CisKKy8vIEMgeSBjIGwgaSBjICBEIEYgQQorCisvKiogVGhlIGNvZGUgdG8gaW5pdGlhdGUgZXhlY3V0aW9uIG9mIGEgY3ljbGljIERGQTsgdGhpcyBpcyB1c2VkCisgKiAgaW4gdGhlIHJ1bGUgdG8gcHJlZGljdCBhbiBhbHQganVzdCBsaWtlIHRoZSBmaXhlZCBERkEgY2FzZS4KKyAqICBUaGUgPG5hbWU+IGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgdmlhIHRoZSBwYXJzZXIsIGxleGVyLCAuLi4KKyAqLworZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAordHJ5Cit7CisJYWx0PGRlY2lzaW9uTnVtYmVyPiA9IGRmYTxkZWNpc2lvbk51bWJlcj4uUHJlZGljdChpbnB1dCk7Cit9CitjYXRjaCAoTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSkKK3sKKwlEZWJ1Z1JlY29nbml0aW9uRXhjZXB0aW9uKG52YWUpOworCXRocm93OworfQorPj4KKworLyogRHVtcCBERkEgdGFibGVzIGFzIHJ1bi1sZW5ndGgtZW5jb2RlZCBTdHJpbmdzIG9mIG9jdGFsIHZhbHVlcy4KKyAqIENhbid0IHVzZSBoZXggYXMgY29tcGlsZXIgdHJhbnNsYXRlcyB0aGVtIGJlZm9yZSBjb21waWxhdGlvbi4KKyAqIFRoZXNlIHN0cmluZ3MgYXJlIHNwbGl0IGludG8gbXVsdGlwbGUsIGNvbmNhdGVuYXRlZCBzdHJpbmdzLgorICogSmF2YSBwdXRzIHRoZW0gYmFjayB0b2dldGhlciBhdCBjb21waWxlIHRpbWUgdGhhbmtmdWxseS4KKyAqIEphdmEgY2Fubm90IGhhbmRsZSBsYXJnZSBzdGF0aWMgYXJyYXlzLCBzbyB3ZSdyZSBzdHVjayB3aXRoIHRoaXMKKyAqIGVuY29kZS9kZWNvZGUgYXBwcm9hY2guICBTZWUgYW5hbHlzaXMgYW5kIHJ1bnRpbWUgREZBIGZvcgorICogdGhlIGVuY29kaW5nIG1ldGhvZHMuCisgKi8KK2N5Y2xpY0RGQShkZmEpIDo6PSA8PAorcHJpdmF0ZSBjbGFzcyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA6IERGQQoreworCXByaXZhdGUgY29uc3Qgc3RyaW5nIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvdFMgPQorCQkiPGRmYS5qYXZhQ29tcHJlc3NlZEVPVDsgd3JhcD0iXCIrXG5cdFx0XCIiPiI7CisJcHJpdmF0ZSBjb25zdCBzdHJpbmcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mUyA9CisJCSI8ZGZhLmphdmFDb21wcmVzc2VkRU9GOyB3cmFwPSJcIitcblx0XHRcIiI+IjsKKwlwcml2YXRlIGNvbnN0IHN0cmluZyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW5TID0KKwkJIjxkZmEuamF2YUNvbXByZXNzZWRNaW47IHdyYXA9IlwiK1xuXHRcdFwiIj4iOworCXByaXZhdGUgY29uc3Qgc3RyaW5nIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFMgPQorCQkiPGRmYS5qYXZhQ29tcHJlc3NlZE1heDsgd3JhcD0iXCIrXG5cdFx0XCIiPiI7CisJcHJpdmF0ZSBjb25zdCBzdHJpbmcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0UyA9CisJCSI8ZGZhLmphdmFDb21wcmVzc2VkQWNjZXB0OyB3cmFwPSJcIitcblx0XHRcIiI+IjsKKwlwcml2YXRlIGNvbnN0IHN0cmluZyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsUyA9CisJCSI8ZGZhLmphdmFDb21wcmVzc2VkU3BlY2lhbDsgd3JhcD0iXCIrXG5cdFx0XCIiPn0+IjsKKwlwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uUyA9CisJCXsKKwkJCTxkZmEuamF2YUNvbXByZXNzZWRUcmFuc2l0aW9uOntzfCI8czsgd3JhcD0iXCIrXG5cIiI+In07IHNlcGFyYXRvcj0iLFxuIj4KKwkJfTsKKworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNob3J0W10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90ID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90Uyk7CisJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2YgPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2ZTKTsKKwlwcml2YXRlIHN0YXRpYyByZWFkb25seSBjaGFyW10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluID0gREZBLlVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluUyk7CisJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heCA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFMpOworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNob3J0W10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0ID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0Uyk7CisJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbFMpOworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNob3J0W11bXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uOworCisJc3RhdGljIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KCkKKwl7CisJCWludCBudW1TdGF0ZXMgPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uUy5MZW5ndGg7CisJCURGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworCQlmb3IgKCBpbnQgaT0wOyBpIFw8IG51bVN0YXRlczsgaSsrICkKKwkJeworCQkJREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbltpXSA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TW2ldKTsKKwkJfQorCX0KKworCXB1YmxpYyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiggQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcjxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4sIFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb248ZW5kaWY+ICkKKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKwkJOiBiYXNlKHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24pCis8ZW5kaWY+CisJeworCQl0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworCQl0aGlzLmRlY2lzaW9uTnVtYmVyID0gPGRmYS5kZWNpc2lvbk51bWJlcj47CisJCXRoaXMuZW90ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OworCQl0aGlzLmVvZiA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZjsKKwkJdGhpcy5taW4gPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW47CisJCXRoaXMubWF4ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OworCQl0aGlzLmFjY2VwdCA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdDsKKwkJdGhpcy5zcGVjaWFsID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbDsKKwkJdGhpcy50cmFuc2l0aW9uID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbjsKKwl9CisKKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIERlc2NyaXB0aW9uIHsgZ2V0IHsgcmV0dXJuICI8ZGZhLmRlc2NyaXB0aW9uPiI7IH0gfQorCisJcHVibGljIG92ZXJyaWRlIHZvaWQgRXJyb3IoTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSkKKwl7CisJCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7CisJfQorfTxcbj4KKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KK3ByaXZhdGUgaW50IFNwZWNpYWxTdGF0ZVRyYW5zaXRpb248ZGZhLmRlY2lzaW9uTnVtYmVyPihERkEgZGZhLCBpbnQgcywgSUludFN0cmVhbSBfaW5wdXQpPCEgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIT4KK3sKKwk8aWYoTEVYRVIpPgorCUlJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CisJPGVuZGlmPgorCTxpZihQQVJTRVIpPgorCUlUb2tlblN0cmVhbSBpbnB1dCA9IChJVG9rZW5TdHJlYW0pX2lucHV0OworCTxlbmRpZj4KKwk8aWYoVFJFRV9QQVJTRVIpPgorCUlUcmVlTm9kZVN0cmVhbSBpbnB1dCA9IChJVHJlZU5vZGVTdHJlYW0pX2lucHV0OworCTxlbmRpZj4KKwlpbnQgX3MgPSBzOworCXN3aXRjaCAocykKKwl7CisJPGRmYS5zcGVjaWFsU3RhdGVTVHM6e3N0YXRlIHwKKwljYXNlIDxpMD46PCEgY29tcHJlc3NlZCBzcGVjaWFsIHN0YXRlIG51bWJlcnMgMC4ubi0xICE+CisJCTxzdGF0ZT59OyBzZXBhcmF0b3I9IlxuIj4KKwl9Cis8aWYoYmFja3RyYWNraW5nKT4KKwlpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorPGVuZGlmPgorCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZGZhLkRlc2NyaXB0aW9uLCA8ZGZhLmRlY2lzaW9uTnVtYmVyPiwgX3MsIGlucHV0KTsKKwlkZmEuRXJyb3IobnZhZSk7CisJdGhyb3cgbnZhZTsKK30KKzxlbmRpZj4KKz4+CisKKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAoraW50IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoMSk7PFxuPgorPGlmKHNlbVByZWRTdGF0ZSk+Cis8ISBnZXQgbmV4dCBsb29rYWhlYWQgc3ltYm9sIHRvIHRlc3QgZWRnZXMsIHRoZW4gcmV3aW5kICE+Cis8XG4+aW50IGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuSW5kZXg7CitpbnB1dC5SZXdpbmQoKTsKKzxlbmRpZj4KK3MgPSAtMTsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKzxpZihzZW1QcmVkU3RhdGUpPgorPCEgcmV0dXJuIGlucHV0IGN1cnNvciB0byBzdGF0ZSBiZWZvcmUgd2UgcmV3b3VuZCAhPgorPFxuPmlucHV0LlNlZWsoaW5kZXg8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4pOworPGVuZGlmPgoraWYgKHMgPj0gMCkgcmV0dXJuIHM7CiticmVhazsKKz4+CisKKy8qKiBKdXN0IGxpa2UgYSBmaXhlZCBERkEgZWRnZSwgdGVzdCB0aGUgbG9va2FoZWFkIGFuZCBpbmRpY2F0ZSB3aGF0CisgKiAgc3RhdGUgdG8ganVtcCB0byBuZXh0IGlmIHN1Y2Nlc3NmdWwuCisgKi8KK2N5Y2xpY0RGQUVkZ2UobGFiZWxFeHByLCB0YXJnZXRTdGF0ZU51bWJlciwgZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitpZiAoKDxsYWJlbEV4cHI+KTxpZihwcmVkaWNhdGVzKT4gJiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7cyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47fTxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkgY2hhcjsKKyAqICBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICovCitlb3RERkFFZGdlKHRhcmdldFN0YXRlTnVtYmVyLGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPgorPj4KKworCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoPGxlZnQ+JiY8cmlnaHQ+KSIKKworb3JQcmVkaWNhdGVzKG9wZXJhbmRzKSA6Oj0gIig8Zmlyc3Qob3BlcmFuZHMpPjxyZXN0KG9wZXJhbmRzKTp7byB8IHx8PG8+fT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxldmFsUHJlZGljYXRlKC4uLik+KSIKKworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIig8cHJlZD4pIgorCitldmFsU3luUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiRXZhbHVhdGVQcmVkaWNhdGUoPHByZWQ+X2ZyYWdtZW50KSIKKworbG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gIkxBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+PT08YXRvbT4iCisKKy8qKiBTb21ldGltZXMgYSBsb29rYWhlYWQgdGVzdCBjYW5ub3QgYXNzdW1lIHRoYXQgTEEoaykgaXMgaW4gYSB0ZW1wIHZhcmlhYmxlCisgKiAgc29tZXdoZXJlLiAgTXVzdCBhc2sgZm9yIHRoZSBsb29rYWhlYWQgZGlyZWN0bHkuCisgKi8KK2lzb2xhdGVkTG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gImlucHV0LkxBKDxrPik9PTxhdG9tPiIKKworbG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLHVwcGVyLGsscmFuZ2VOdW1iZXIsbG93ZXJBc0ludCx1cHBlckFzSW50KSA6Oj0gPCUKKyhMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPjxnZSgpPjxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj48bGUoKT48dXBwZXI+KQorJT4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSAiKGlucHV0LkxBKDxrPik8Z2UoKT48bG93ZXI+ICYmIGlucHV0LkxBKDxrPik8bGUoKT48dXBwZXI+KSIKKworbGUoKSA6Oj0gIlw8PSIKK2dlKCkgOjo9ICI+PSIKKworc2V0VGVzdChyYW5nZXMpIDo6PSA8PAorPHJhbmdlczsgc2VwYXJhdG9yPSJ8fCI+Cis+PgorCisvLyBBIFQgVCBSIEkgQiBVIFQgRSBTCisKK2F0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK3Byb3RlY3RlZCBzZWFsZWQgcGFydGlhbCBjbGFzcyA8c2NvcGUubmFtZT5fc2NvcGUKK3sKKwk8c2NvcGUuYXR0cmlidXRlczp7aXR8cHVibGljIDxpdC5kZWNsPjt9OyBzZXBhcmF0b3I9IlxuIj4KK30KKzxpZihzY29wZS5hY3Rpb25zLnNjb3BlaW5pdCk+Citwcm90ZWN0ZWQgdm9pZCA8c2NvcGUubmFtZT5fc2NvcGVJbml0KCA8c2NvcGUubmFtZT5fc2NvcGUgc2NvcGUgKQoreworCTxzY29wZS5hY3Rpb25zLnNjb3BlaW5pdD4KK30KKzxlbHNlPgorcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCA8c2NvcGUubmFtZT5fc2NvcGVJbml0KCA8c2NvcGUubmFtZT5fc2NvcGUgc2NvcGUgKSB7fQorPGVuZGlmPgorPGlmKHNjb3BlLmFjdGlvbnMuc2NvcGVhZnRlcik+Citwcm90ZWN0ZWQgdm9pZCA8c2NvcGUubmFtZT5fc2NvcGVBZnRlciggPHNjb3BlLm5hbWU+X3Njb3BlIHNjb3BlICkKK3sKKwk8c2NvcGUuYWN0aW9ucy5zY29wZWFmdGVyPgorfQorPGVsc2U+Citwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIDxzY29wZS5uYW1lPl9zY29wZUFmdGVyKCA8c2NvcGUubmFtZT5fc2NvcGUgc2NvcGUgKSB7fQorPGVuZGlmPgorcHJvdGVjdGVkIHJlYWRvbmx5IExpc3RTdGFja1w8PHNjb3BlLm5hbWU+X3Njb3BlXD4gPHNjb3BlLm5hbWU+X3N0YWNrID0gbmV3IExpc3RTdGFja1w8PHNjb3BlLm5hbWU+X3Njb3BlXD4oKTsKKzxlbmRpZj4KKz4+CisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxhdHRyaWJ1dGVTY29wZSguLi4pPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxhdHRyaWJ1dGVTY29wZSguLi4pPgorPj4KKworcmV0dXJuU3RydWN0TmFtZShpdCkgOjo9ICI8aXQubmFtZT5fcmV0dXJuIgorCityZXR1cm5UeXBlKHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPCUKKzxpZihydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzICYmIHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKwk8cnVsZURlc2NyaXB0b3IuZ3JhbW1hci5yZWNvZ25pemVyTmFtZT4uPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4KKzxlbHNlaWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorCTxydWxlUmV0dXJuQmFzZVR5cGUoKT4KKzxlbHNlaWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorCTxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KKwl2b2lkCis8ZW5kaWY+CislPgorCisvKiogR2VuZXJhdGUgdGhlIEMjIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIG9yIG11bHRpcGxlIHJldHVybgorICogIHZhbHVlcy4KKyAqLworcnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZSkgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUucmV0dXJuU2NvcGUuYXR0cmlidXRlcyYmcmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorCTxyZWZlcmVuY2VkUnVsZS5ncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cmVmZXJlbmNlZFJ1bGU6cmV0dXJuU3RydWN0TmFtZSgpPgorPGVsc2VpZihyZWZlcmVuY2VkUnVsZS5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CisJPHJ1bGVSZXR1cm5CYXNlVHlwZSgpPgorPGVsc2VpZihyZWZlcmVuY2VkUnVsZS5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+CisJPHJlZmVyZW5jZWRSdWxlLnNpbmdsZVZhbHVlUmV0dXJuVHlwZT4KKzxlbHNlPgorCXZvaWQKKzxlbmRpZj4KKyU+CisKK2RlbGVnYXRlTmFtZShpdCkgOjo9IDw8Cis8aWYoaXQubGFiZWwpPjxpdC5sYWJlbD48ZWxzZT5nPGl0Lm5hbWU+PGVuZGlmPgorPj4KKworLyoqIFVzaW5nIGEgdHlwZSB0byBpbml0IHZhbHVlIG1hcCwgdHJ5IHRvIGluaXQgYSB0eXBlOyBpZiBub3QgaW4gdGFibGUKKyAqICBtdXN0IGJlIGFuIG9iamVjdCwgZGVmYXVsdCB2YWx1ZSBpcyAibnVsbCIuCisgKi8KK2luaXRWYWx1ZSh0eXBlTmFtZSkgOjo9IDw8CitkZWZhdWx0KDx0eXBlTmFtZT4pCis+PgorCisvKiogRGVmaW5lIGEgcnVsZSBsYWJlbCBpbmNsdWRpbmcgZGVmYXVsdCB2YWx1ZSAqLworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPCUKKzxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKT4gPGxhYmVsLmxhYmVsLnRleHQ+ID0gPGluaXRWYWx1ZSh0eXBlTmFtZT1ydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKSk+OworJT4KKworLyoqIERlZmluZSBhIHJldHVybiBzdHJ1Y3QgZm9yIGEgcnVsZSBpZiB0aGUgY29kZSBuZWVkcyB0byBhY2Nlc3MgaXRzCisgKiAgc3RhcnQvc3RvcCB0b2tlbnMsIHRyZWUgc3R1ZmYsIGF0dHJpYnV0ZXMsIC4uLiAgTGVhdmUgYSBob2xlIGZvcgorICogIHN1Ymdyb3VwcyB0byBzdGljayBpbiBtZW1iZXJzLgorICovCityZXR1cm5TY29wZShzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyAmJiBydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cmV0dXJuU2NvcGVNb2RpZmllcihncmFtbWFyPWdyYW1tYXIscnVsZURlc2NyaXB0b3I9cnVsZURlc2NyaXB0b3IpPiBzZWFsZWQgcGFydGlhbCBjbGFzcyA8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiA6IDxydWxlUmV0dXJuQmFzZVR5cGUoKT48QHJ1bGVSZXR1cm5JbnRlcmZhY2VzKCk+Cit7CisJPHNjb3BlLmF0dHJpYnV0ZXM6e2l0fHB1YmxpYyA8aXQuZGVjbD47fTsgc2VwYXJhdG9yPSJcbiI+CisJPEBydWxlUmV0dXJuTWVtYmVycygpPgorfQorPGVuZGlmPgorPj4KKworcnVsZVJldHVybkJhc2VUeXBlKCkgOjo9IDwlCis8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZWxzZT5QYXJzZXI8ZW5kaWY+UnVsZVJldHVyblNjb3BlXDw8bGFiZWxUeXBlPj4KKyU+CisKK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuTWVtYmVycygpIDo6PSA8PAorPj4KKworcGFyYW1ldGVyU2NvcGUoc2NvcGUpIDo6PSA8PAorPHNjb3BlLmF0dHJpYnV0ZXM6e2l0fDxpdC5kZWNsPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSA8PAorPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+Cis+PgorCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gPDwKKzxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPiA9PGV4cHI+OworPj4KKworc2NvcGVBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixpbmRleCxuZWdJbmRleCkgOjo9IDwlCis8aWYobmVnSW5kZXgpPgorPHNjb3BlPl9zdGFja1s8c2NvcGU+X3N0YWNrLkNvdW50IC0gPG5lZ0luZGV4PiAtIDFdLjxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPgorPGVsc2U+Cis8aWYoaW5kZXgpPgorPHNjb3BlPl9zdGFja1s8aW5kZXg+XS48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4KKzxlbHNlPgorPHNjb3BlPl9zdGFjay5QZWVrKCkuPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCitzY29wZVNldEF0dHJpYnV0ZVJlZihzY29wZSxhdHRyLGV4cHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8JQorPGlmKG5lZ0luZGV4KT4KKzxzY29wZT5fc3RhY2tbPHNjb3BlPl9zdGFjay5Db3VudCAtIDxuZWdJbmRleD4gLSAxXS48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4gPSA8ZXhwcj47Cis8ZWxzZT4KKzxpZihpbmRleCk+Cis8c2NvcGU+X3N0YWNrWzxpbmRleD5dLjxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPiA9IDxleHByPjsKKzxlbHNlPgorPHNjb3BlPl9zdGFjay5QZWVrKCkuPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+ID0gPGV4cHI+OworPGVuZGlmPgorPGVuZGlmPgorJT4KKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsgcmVmZXJzCisgKiAgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJlZGljYXRlcworICogIGxpa2UgeyRmdW5jdGlvbi5Db3VudD4wICYmICRmdW5jdGlvbjo6bmFtZS5FcXVhbHMoImZvbyIpfT8KKyAqLworaXNvbGF0ZWREeW5hbWljU2NvcGVSZWYoc2NvcGUpIDo6PSAiPHNjb3BlPl9zdGFjayIKKworLyoqIHJlZmVyZW5jZSBhbiBhdHRyaWJ1dGUgb2YgcnVsZTsgbWlnaHQgb25seSBoYXZlIHNpbmdsZSByZXR1cm4gdmFsdWUgKi8KK3J1bGVMYWJlbFJlZihyZWZlcmVuY2VkUnVsZSxzY29wZSxhdHRyKSA6Oj0gPCUKKzxpZihyZWZlcmVuY2VkUnVsZS5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CisoPHNjb3BlPiE9bnVsbD88c2NvcGU+LjxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPjo8aW5pdFZhbHVlKGF0dHIudHlwZSk+KQorPGVsc2U+Cis8c2NvcGU+Cis8ZW5kaWY+CislPgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPgorPGVsc2U+Cis8YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4KKzxlbmRpZj4KKyU+CisKK3JldHVyblNldEF0dHJpYnV0ZVJlZihydWxlRGVzY3JpcHRvcixhdHRyLGV4cHIpIDo6PSA8JQorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4gPTxleHByPjsKKzxlbHNlPgorPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+ID08ZXhwcj47Cis8ZW5kaWY+CislPgorCisvKiogSG93IHRvIHRyYW5zbGF0ZSAkdG9rZW5MYWJlbCAqLwordG9rZW5MYWJlbFJlZihsYWJlbCkgOjo9ICI8bGFiZWw+IgorCisvKiogaWRzKz1JRCB7JGlkc30gb3IgZSs9ZXhwciB7JGV9ICovCitsaXN0TGFiZWxSZWYobGFiZWwpIDo6PSAibGlzdF88bGFiZWw+IgorCisKKy8vIG5vdCBzdXJlIHRoZSBuZXh0IGFyZSB0aGUgcmlnaHQgYXBwcm9hY2gKKwordG9rZW5MYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LlRleHQ6bnVsbCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4uVHlwZTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5MaW5lOjApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4uQ2hhclBvc2l0aW9uSW5MaW5lOjApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LkNoYW5uZWw6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LlRva2VuSW5kZXg6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT5fdHJlZSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD9pbnQuUGFyc2UoPHNjb3BlPi5UZXh0KTowKSIKKworcnVsZUxhYmVsUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD8oKDxsYWJlbFR5cGU+KTxzY29wZT4uU3RhcnQpOmRlZmF1bHQoPGxhYmVsVHlwZT4pKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD8oKDxsYWJlbFR5cGU+KTxzY29wZT4uU3RvcCk6ZGVmYXVsdCg8bGFiZWxUeXBlPikpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPygoPEFTVExhYmVsVHlwZT4pPHNjb3BlPi5UcmVlKTpkZWZhdWx0KDxBU1RMYWJlbFR5cGU+KSkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSA8JQorPGlmKFRSRUVfUEFSU0VSKT4KKyg8c2NvcGU+IT1udWxsPyhpbnB1dC5Ub2tlblN0cmVhbS5Ub1N0cmluZygKKyAgaW5wdXQuVHJlZUFkYXB0b3IuR2V0VG9rZW5TdGFydEluZGV4KDxzY29wZT4uU3RhcnQpLAorICBpbnB1dC5UcmVlQWRhcHRvci5HZXRUb2tlblN0b3BJbmRleCg8c2NvcGU+LlN0YXJ0KSkpOm51bGwpCis8ZWxzZT4KKyg8c2NvcGU+IT1udWxsP2lucHV0LlRvU3RyaW5nKDxzY29wZT4uU3RhcnQsPHNjb3BlPi5TdG9wKTpudWxsKQorPGVuZGlmPgorJT4KKworcnVsZUxhYmVsUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LlRlbXBsYXRlOm51bGwpIgorCisvKiogSXNvbGF0ZWQgJFJVTEUgcmVmIG9rIGluIGxleGVyIGFzIGl0J3MgYSBUb2tlbiAqLworbGV4ZXJSdWxlTGFiZWwobGFiZWwpIDo6PSAiPGxhYmVsPiIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LlR5cGU6MCkiCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5MaW5lOjApIgorCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5DaGFyUG9zaXRpb25JbkxpbmU6LTEpIgorCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uQ2hhbm5lbDowKSIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5Ub2tlbkluZGV4OjApIgorCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uVGV4dDpudWxsKSIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsP2ludC5QYXJzZSg8c2NvcGU+LlRleHQpOjApIgorCisvLyBTb21lYm9keSBtYXkgcmVmICR0ZW1wbGF0ZSBvciAkdHJlZSBvciAkc3RvcCB3aXRoaW4gYSBydWxlOgorcnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLlN0YXJ0IgorcnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICJyZXR2YWwuU3RvcCIKK3J1bGVQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLlRyZWUiCitydWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPCUKKzxpZihUUkVFX1BBUlNFUik+CitpbnB1dC5Ub2tlblN0cmVhbS5Ub1N0cmluZygKKyAgaW5wdXQuVHJlZUFkYXB0b3IuR2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5TdGFydCksCisgIGlucHV0LlRyZWVBZGFwdG9yLkdldFRva2VuU3RvcEluZGV4KHJldHZhbC5TdGFydCkpCis8ZWxzZT4KK2lucHV0LlRvU3RyaW5nKHJldHZhbC5TdGFydCxpbnB1dC5MVCgtMSkpCis8ZW5kaWY+CislPgorcnVsZVByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLlRlbXBsYXRlIgorCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiVGV4dCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICJfdHlwZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50b2tlblN0YXJ0TGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIi0xIiAvLyB1bmRlZmluZWQgdG9rZW4gaW5kZXggaW4gbGV4ZXIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICJfY2hhbm5lbCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAic3RhdGUudG9rZW5TdGFydENoYXJJbmRleCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoQ2hhckluZGV4LTEpIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiaW50LlBhcnNlKDxzY29wZT4uVGV4dCkiCisKKy8vIHNldHRpbmcgJHN0IGFuZCAkdHJlZSBpcyBhbGxvd2VkIGluIGxvY2FsIHJ1bGUuIGV2ZXJ5dGhpbmcgZWxzZQorLy8gaXMgZmxhZ2dlZCBhcyBlcnJvcgorcnVsZVNldFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cixleHByKSA6Oj0gInJldHZhbC5UcmVlID0gPGV4cHI+OyIKK3J1bGVTZXRQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyLGV4cHIpIDo6PSAicmV0dmFsLlRlbXBsYXRlID08ZXhwcj47IgorCisvKiogSG93IHRvIGV4ZWN1dGUgYW4gYWN0aW9uIChvbmx5IHdoZW4gbm90IGJhY2t0cmFja2luZykgKi8KK2V4ZWNBY3Rpb24oYWN0aW9uKSA6Oj0gPCUKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KTxcbj4KK3s8XG4+Cis8QGluZGVudGVkQWN0aW9uKCk+PFxuPgorfQorPGVsc2U+Cis8YWN0aW9uPgorPGVuZGlmPgorJT4KKworQGV4ZWNBY3Rpb24uaW5kZW50ZWRBY3Rpb24oKSA6Oj0gPDwKKwk8YWN0aW9uPgorPj4KKworLyoqIEhvdyB0byBhbHdheXMgZXhlY3V0ZSBhbiBhY3Rpb24gZXZlbiB3aGVuIGJhY2t0cmFja2luZyAqLworZXhlY0ZvcmNlZEFjdGlvbihhY3Rpb24pIDo6PSAiPGFjdGlvbj4iCisKKy8vIE0gSSBTIEMgKHByb3BlcnRpZXMsIGV0Yy4uLikKKworYml0c2V0KG5hbWUsIHdvcmRzNjQpIDo6PSA8PAorcHVibGljIHN0YXRpYyByZWFkb25seSBCaXRTZXQgPG5hbWU+ID0gbmV3IEJpdFNldChuZXcgdWxvbmdbXXs8d29yZHM2NDp7aXR8PGl0PlVMfTtzZXBhcmF0b3I9IiwiPn0pOworPj4KKworY29kZUZpbGVFeHRlbnNpb24oKSA6Oj0gIi5jcyIKKwordHJ1ZV92YWx1ZSgpIDo6PSAidHJ1ZSIKK2ZhbHNlX3ZhbHVlKCkgOjo9ICJmYWxzZSIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9EYmcuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL0RiZy5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZDViNQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9EYmcuc3RnCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSm9oYW5uZXMgTHViZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbAorICogQ29weXJpZ2h0IChjKSAyMDExIFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gbm9ybWFsIEphdmEgb3V0cHV0OworICogIElmIEFTVHMgYXJlIGJ1aWx0LCB0aGVuIHlvdSdsbCBhbHNvIGdldCBBU1REYmcuc3RnIGxvYWRlZC4KKyAqLworCitAb3V0cHV0RmlsZS5kZWJ1Z1ByZXByb2Nlc3NvcigpIDo6PSAiI2RlZmluZSBBTlRMUl9ERUJVRyIKKworQG91dHB1dEZpbGUuaW1wb3J0cygpIDo6PSA8PAorPEBzdXBlci5pbXBvcnRzKCk+Cit1c2luZyBBbnRsci5SdW50aW1lLkRlYnVnOwordXNpbmcgSU9FeGNlcHRpb24gPSBTeXN0ZW0uSU8uSU9FeGNlcHRpb247Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KK3B1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gcnVsZU5hbWVzID0KKwluZXcgc3RyaW5nW10KKwl7CisJCSJpbnZhbGlkUnVsZSIsIDxncmFtbWFyLmFsbEltcG9ydGVkUnVsZXM6e3JTVCB8ICI8clNULm5hbWU+In07IHdyYXA9IlxuCSIsIHNlcGFyYXRvcj0iLCAiPgorCX07PFxuPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+PCEgZ3JhbW1hciBpbXBvcnRzIG90aGVyIGdyYW1tYXIocykgIT4KKwlpbnQgcnVsZUxldmVsID0gMDsKKwlwdWJsaWMgdmlydHVhbCBpbnQgUnVsZUxldmVsIHsgZ2V0IHsgcmV0dXJuIHJ1bGVMZXZlbDsgfSB9CisJcHVibGljIHZpcnR1YWwgdm9pZCBJbmNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbCsrOyB9CisJcHVibGljIHZpcnR1YWwgdm9pZCBEZWNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbC0tOyB9Cis8aWYocHJvZmlsZSk+CisJPGN0b3JGb3JQcm9maWxpbmdSb290R3JhbW1hcigpPgorPGVsc2U+CisJPGN0b3JGb3JSb290R3JhbW1hcigpPgorPGVuZGlmPgorPGN0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIoKT4KKzxlbHNlPjwhIGltcG9ydGVkIGdyYW1tYXIgIT4KKwlwdWJsaWMgaW50IFJ1bGVMZXZlbCB7IGdldCB7IHJldHVybiA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pi5SdWxlTGV2ZWw7IH0gfQorCXB1YmxpYyB2b2lkIEluY1J1bGVMZXZlbCgpIHsgPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wgPGc6ZGVsZWdhdGVOYW1lKCk+fT4uSW5jUnVsZUxldmVsKCk7IH0KKwlwdWJsaWMgdm9pZCBEZWNSdWxlTGV2ZWwoKSB7IDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LkRlY1J1bGVMZXZlbCgpOyB9CisJPGN0b3JGb3JEZWxlZ2F0ZUdyYW1tYXIoKT4KKzxlbmRpZj4KKzxpZihwcm9maWxlKT4KK3B1YmxpYyBvdmVycmlkZSBib29sIEFscmVhZHlQYXJzZWRSdWxlKCBJSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4ICkKK3sKKwlpbnQgc3RvcEluZGV4ID0gR2V0UnVsZU1lbW9pemF0aW9uKHJ1bGVJbmRleCwgaW5wdXQuSW5kZXgpOworCSgoUHJvZmlsZXIpZGJnKS5FeGFtaW5lUnVsZU1lbW9pemF0aW9uKGlucHV0LCBydWxlSW5kZXgsIHN0b3BJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisJcmV0dXJuIGJhc2UuQWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCk7Cit9PFxuPgorcHVibGljIG92ZXJyaWRlIHZvaWQgTWVtb2l6ZSggSUludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCwgaW50IHJ1bGVTdGFydEluZGV4ICkKK3sKKwkoKFByb2ZpbGVyKWRiZykuTWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisJYmFzZS5NZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKK308XG4+Cis8ZW5kaWY+Citwcm90ZWN0ZWQgdmlydHVhbCBib29sIEV2YWxQcmVkaWNhdGUoIGJvb2wgcmVzdWx0LCBzdHJpbmcgcHJlZGljYXRlICkKK3sKKwlkYmcuU2VtYW50aWNQcmVkaWNhdGUoIHJlc3VsdCwgcHJlZGljYXRlICk7CisJcmV0dXJuIHJlc3VsdDsKK308XG4+Cis+PgorCitjdG9yRm9yUm9vdEdyYW1tYXIoKSA6Oj0gPDwKKzwhIGJ1ZzogY2FuJ3QgdXNlIDxAc3VwZXIubWVtYmVycygpPiBjdXQtbi1wYXN0ZSBpbnN0ZWFkICE+Cis8ISBTYW1lIGV4Y2VwdCB3ZSBhZGQgcG9ydCBudW1iZXIgYW5kIHByb2ZpbGUgc3R1ZmYgaWYgcm9vdCBncmFtbWFyICE+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPG5hbWU+KCA8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCApCisJOiB0aGlzKCBpbnB1dCwgRGVidWdFdmVudFNvY2tldFByb3h5LkRlZmF1bHREZWJ1Z2dlclBvcnQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSApCit7Cit9Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPG5hbWU+KCA8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgaW50IHBvcnQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSApCisJOiBiYXNlKCBpbnB1dCwgc3RhdGUgKQoreworCTxwYXJzZXJDdG9yQm9keSgpPgorCTxjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpPgorCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KCBpbnB1dCwgZGJnLCB0aGlzLnN0YXRlLCB0aGlzPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+ICk7fTsgc2VwYXJhdG9yPSJcbiI+CisJPEBmaW5hbGx5KCk+Cit9PFxuPgorPj4KKworY3RvckZvclByb2ZpbGluZ1Jvb3RHcmFtbWFyKCkgOjo9IDw8Cis8ISBidWc6IGNhbid0IHVzZSA8QHN1cGVyLm1lbWJlcnMoKT4gY3V0LW4tcGFzdGUgaW5zdGVhZCAhPgorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxuYW1lPiggPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQgKQorCTogdGhpcyggaW5wdXQsIG5ldyBQcm9maWxlcihudWxsKSwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpICkKK3sKK30KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuY3Rvck1vZGlmaWVyOyBudWxsPSJwdWJsaWMiPiA8bmFtZT4oIDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0LCBJRGVidWdFdmVudExpc3RlbmVyIGRiZywgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwk6IGJhc2UoIGlucHV0LCBkYmcsIHN0YXRlICkKK3sKKwlQcm9maWxlciBwID0gKFByb2ZpbGVyKWRiZzsKKwlwLnNldFBhcnNlcih0aGlzKTsKKwk8cGFyc2VyQ3RvckJvZHkoKT4KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oIGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4gKTt9OyBzZXBhcmF0b3I9IlxuIj4KKwk8QGZpbmFsbHkoKT4KK30KKzxcbj4KKz4+CisKKy8qKiBCYXNpY2FsbHkgd2UgZG9uJ3Qgd2FudCB0byBzZXQgYW55IGRiZyBsaXN0ZW5lcnMgYXJlIHJvb3Qgd2lsbCBoYXZlIGl0LiAqLworY3RvckZvckRlbGVnYXRlR3JhbW1hcigpIDo6PSA8PAorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxuYW1lPiggPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+ICkKKwk6IGJhc2UoIGlucHV0LCBkYmcsIHN0YXRlICkKK3sKKwk8cGFyc2VyQ3RvckJvZHkoKT4KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oIGlucHV0LCB0aGlzLCB0aGlzLnN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+ICk7fTsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworY3RvckZvclByZWRlZmluZWRMaXN0ZW5lcigpIDo6PSA8PAorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxuYW1lPiggPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKwk8QHN1cGVyQ2xhc3NSZWY+OiBiYXNlKCBpbnB1dCwgZGJnLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKTxAZW5kPgoreworPGlmKHByb2ZpbGUpPgorCVByb2ZpbGVyIHAgPSAoUHJvZmlsZXIpZGJnOworCXAuc2V0UGFyc2VyKHRoaXMpOworPGVuZGlmPgorCTxwYXJzZXJDdG9yQm9keSgpPgorCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorCTxAZmluYWxseSgpPgorfTxcbj4KKz4+CisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0gbmV3IERlYnVnRXZlbnRTb2NrZXRQcm94eSggdGhpcywgcG9ydCwgaW5wdXQuVHJlZUFkYXB0b3IgKTs8XG4+Cis8ZWxzZT4KK0RlYnVnRXZlbnRTb2NrZXRQcm94eSBwcm94eSA9IG5ldyBEZWJ1Z0V2ZW50U29ja2V0UHJveHkoIHRoaXMsIHBvcnQsIG51bGwgKTs8XG4+Cis8ZW5kaWY+CitEZWJ1Z0xpc3RlbmVyID0gcHJveHk7Cit0cnkKK3sKKwlwcm94eS5IYW5kc2hha2UoKTsKK30KK2NhdGNoICggSU9FeGNlcHRpb24gaW9lICkKK3sKKwlSZXBvcnRFcnJvciggaW9lICk7Cit9Cis+PgorCitAZ2VuZXJpY1BhcnNlci5zdXBlckNsYXNzTmFtZSgpIDo6PSAiRGVidWc8QHN1cGVyLnN1cGVyQ2xhc3NOYW1lKCk+IgorCisvKgorICogTWFueSBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzIHdlcmUgbWVyZ2VkIGludG8gQ1NoYXJwMi5zdGcuCisgKi8KKworQHJ1bGUucHJlYW1ibGUoKSA6Oj0gPDwKK2lmIChSdWxlTGV2ZWwgPT0gMCkKKwlEZWJ1Z0xpc3RlbmVyLkNvbW1lbmNlKCk7CitJbmNSdWxlTGV2ZWwoKTsKKz4+CisvL0BydWxlLnByZWFtYmxlKCkgOjo9IDw8CisvL3RyeQorLy97CisvLwlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICI8cnVsZU5hbWU+IiApOworLy8JaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisvLwl7CisvLwkJZGJnLkNvbW1lbmNlKCk7CisvLwl9CisvLwlJbmNSdWxlTGV2ZWwoKTsKKy8vCWRiZy5Mb2NhdGlvbiggPHJ1bGVEZXNjcmlwdG9yLnRyZWUubGluZT4sIDxydWxlRGVzY3JpcHRvci50cmVlLmNoYXJQb3NpdGlvbkluTGluZT4gKTs8XG4+CisvLz4+CisKK0BydWxlLnBvc3RhbWJsZSgpIDo6PSA8PAorRGVjUnVsZUxldmVsKCk7CitpZiAoUnVsZUxldmVsID09IDApCisJRGVidWdMaXN0ZW5lci5UZXJtaW5hdGUoKTsKKz4+CisvL0BydWxlLnBvc3RhbWJsZSgpIDo6PSA8PAorLy9kYmcuTG9jYXRpb24oPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUubGluZT4sIDxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmNoYXJQb3NpdGlvbkluTGluZT4pOzxcbj4KKy8vfQorLy9maW5hbGx5CisvL3sKKy8vCWRiZy5FeGl0UnVsZSggR3JhbW1hckZpbGVOYW1lLCAiPHJ1bGVOYW1lPiIgKTsKKy8vCURlY1J1bGVMZXZlbCgpOworLy8JaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisvLwl7CisvLwkJZGJnLlRlcm1pbmF0ZSgpOworLy8JfQorLy99PFxuPgorLy8+PgorCisvL0BpbnNlcnRTeW5wcmVkcy5zdGFydCgpIDo6PSAiZGJnLkJlZ2luQmFja3RyYWNrKCBzdGF0ZS5iYWNrdHJhY2tpbmcgKTsiCisvL0BpbnNlcnRTeW5wcmVkcy5zdG9wKCkgOjo9ICJkYmcuRW5kQmFja3RyYWNrKCBzdGF0ZS5iYWNrdHJhY2tpbmcsIHN1Y2Nlc3MgKTsiCisKKy8vIENvbW1vbiBkZWJ1ZyBldmVudCB0cmlnZ2VycyB1c2VkIGJ5IHJlZ2lvbiBvdmVycmlkZXMgYmVsb3cKKworLy9lbnRlclN1YlJ1bGUoKSA6Oj0gPDwKKy8vdHJ5CisvL3sKKy8vCWRiZy5FbnRlclN1YlJ1bGUoIDxkZWNpc2lvbk51bWJlcj4gKTs8XG4+CisvLz4+CisKKy8vZXhpdFN1YlJ1bGUoKSA6Oj0gPDwKKy8vfQorLy9maW5hbGx5CisvL3sKKy8vCWRiZy5FeGl0U3ViUnVsZSggPGRlY2lzaW9uTnVtYmVyPiApOworLy99PFxuPgorLy8+PgorCisvL2VudGVyRGVjaXNpb24oKSA6Oj0gPDwKKy8vdHJ5CisvL3sKKy8vCWRiZy5FbnRlckRlY2lzaW9uKCA8ZGVjaXNpb25OdW1iZXI+ICk7PFxuPgorLy8+PgorCisvL2V4aXREZWNpc2lvbigpIDo6PSA8PAorLy99CisvL2ZpbmFsbHkKKy8veworLy8JZGJnLkV4aXREZWNpc2lvbiggPGRlY2lzaW9uTnVtYmVyPiApOworLy99PFxuPgorLy8+PgorCisvL2VudGVyQWx0KG4pIDo6PSAiZGJnLkVudGVyQWx0KCA8bj4gKTs8XG4+IgorCisvLyBSZWdpb24gb3ZlcnJpZGVzIHRoYXQgdGVsbCB2YXJpb3VzIGNvbnN0cnVjdHMgdG8gYWRkIGRlYnVnZ2luZyB0cmlnZ2VycworCisvL0BibG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyU3ViUnVsZSgpPjxlbnRlckRlY2lzaW9uKCk+IgorCisvL0BibG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKKy8vQGJsb2NrLnBvc3RicmFuY2goKSA6Oj0gIjxleGl0U3ViUnVsZSgpPiIKKworLy9AcnVsZUJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJEZWNpc2lvbigpPiIKKworLy9AcnVsZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworLy9AcnVsZUJsb2NrU2luZ2xlQWx0LnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49XCIxXCIpPiIKKworLy9AYmxvY2tTaW5nbGVBbHQucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQobj1cIjFcIik+IgorCisvL0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wcmVsb29wKCkgOjo9ICI8ZW50ZXJTdWJSdWxlKCk+IgorCisvL0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCisvL0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyRGVjaXNpb24oKT4iCisKKy8vQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworLy9AcG9zaXRpdmVDbG9zdXJlQmxvY2suZWFybHlFeGl0RXhjZXB0aW9uKCkgOjo9CisvLwkiZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBlZWU8ZGVjaXNpb25OdW1iZXI+ICk7PFxuPiIKKworLy9AY2xvc3VyZUJsb2NrLnByZWxvb3AoKSA6Oj0gIjxlbnRlclN1YlJ1bGUoKT4iCisKKy8vQGNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCisvL0BjbG9zdXJlQmxvY2sucHJlZGVjaXNpb24oKSA6Oj0gIjxlbnRlckRlY2lzaW9uKCk+IgorCisvL0BjbG9zdXJlQmxvY2sucG9zdGRlY2lzaW9uKCkgOjo9ICI8ZXhpdERlY2lzaW9uKCk+IgorCisvL0BhbHRTd2l0Y2hDYXNlLnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49aSk+IgorCisvL0BlbGVtZW50LnByZW1hdGNoKCkgOjo9CisvLwkiZGJnLkxvY2F0aW9uKCA8aXQubGluZT4sIDxpdC5wb3M+ICk7IgorCisvL0BtYXRjaFNldC5taXNtYXRjaGVkU2V0RXhjZXB0aW9uKCkgOjo9CisvLwkiZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBtc2UgKTsiCisKKy8vQGRmYVN0YXRlLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9ICJkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsiCisKKy8vQGRmYVN0YXRlU3dpdGNoLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9ICJkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsiCisKKy8vZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy90cnkKKy8veworLy8JaXNDeWNsaWNEZWNpc2lvbiA9IHRydWU7CisvLwk8c3VwZXIuZGZhRGVjaXNpb24oLi4uKT4KKy8vfQorLy9jYXRjaCAoIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgKQorLy97CisvLwlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKy8vCXRocm93IG52YWU7CisvL30KKy8vPj4KKworLy9AY3ljbGljREZBLmVycm9yTWV0aG9kKCkgOjo9IDw8CisvL3B1YmxpYyBvdmVycmlkZSB2b2lkIEVycm9yKCBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlICkKKy8veworLy8JKChEZWJ1Z1BhcnNlcilyZWNvZ25pemVyKS5kYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKy8vfQorLy8+PgorCisvKiogRm9yY2UgcHJlZGljYXRlIHZhbGlkYXRpb24gdG8gdHJpZ2dlciBhbiBldmVudCAqLworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK0V2YWxQcmVkaWNhdGUoPHByZWQ+LCAiPGRlc2NyaXB0aW9uPiIpCis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAyL1NULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9TVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZDk3MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMi9TVC5zdGcKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKb2hhbm5lcyBMdWJlcgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorICogQ29weXJpZ2h0IChjKSAyMDExIFNhbSBIYXJ3ZWxsCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKy8qKiBUZW1wbGF0ZSBzdWJncm91cCB0byBhZGQgdGVtcGxhdGUgcmV3cml0ZSBvdXRwdXQKKyAqICBJZiBkZWJ1Z2dpbmcsIHRoZW4geW91J2xsIGFsc28gZ2V0IFNURGJnLnN0ZyBsb2FkZWQuCisgKi8KKworQG91dHB1dEZpbGUuaW1wb3J0cygpIDo6PSA8PAorPEBzdXBlci5pbXBvcnRzKCk+Cit1c2luZyBBbnRsci5TdHJpbmdUZW1wbGF0ZTsKK3VzaW5nIEFudGxyLlN0cmluZ1RlbXBsYXRlLkxhbmd1YWdlOworPGlmKCFiYWNrdHJhY2tpbmcpPgordXNpbmcgSGFzaHRhYmxlID0gU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZTsKKzxlbmRpZj4KKworPj4KKworLyoqIEFkZCB0aGlzIHRvIGVhY2ggcnVsZSdzIHJldHVybiB2YWx1ZSBzdHJ1Y3QgKi8KK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuTWVtYmVycygpIDo6PSA8PAorcHJpdmF0ZSBTdHJpbmdUZW1wbGF0ZSBfc3Q7CitwdWJsaWMgU3RyaW5nVGVtcGxhdGUgVGVtcGxhdGUgeyBnZXQgeyByZXR1cm4gX3N0OyB9IHNldCB7IF9zdCA9IHZhbHVlOyB9IH0KK3B1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7IHJldHVybiAoVGVtcGxhdGU9PW51bGwpID8gc3RyaW5nLkVtcHR5IDogVGVtcGxhdGUuVG9TdHJpbmcoKTsgfQorPj4KKworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPEBzdXBlci5tZW1iZXJzKCk+Citwcm90ZWN0ZWQgU3RyaW5nVGVtcGxhdGVHcm91cCB0ZW1wbGF0ZUxpYiA9IG5ldyBTdHJpbmdUZW1wbGF0ZUdyb3VwKCI8bmFtZT5UZW1wbGF0ZXMiLCB0eXBlb2YoQW5nbGVCcmFja2V0VGVtcGxhdGVMZXhlcikgKTsKKworcHVibGljIFN0cmluZ1RlbXBsYXRlR3JvdXAgVGVtcGxhdGVMaWIKK3sKKyAJZ2V0IHsgcmV0dXJuIHRoaXMudGVtcGxhdGVMaWI7IH0KKyAJc2V0IHsgdGhpcy50ZW1wbGF0ZUxpYiA9IHZhbHVlOyB9Cit9CisKKy8vLyBcPHN1bW1hcnk+IEFsbG93cyBjb252ZW5pZW50IG11bHRpLXZhbHVlIGluaXRpYWxpemF0aW9uOgorLy8vICAibmV3IFNUQXR0ck1hcCgpLkFkZCguLi4pLkFkZCguLi4pIgorLy8vIFw8L3N1bW1hcnk+Citwcm90ZWN0ZWQgY2xhc3MgU1RBdHRyTWFwIDogSGFzaHRhYmxlCit7CisgIHB1YmxpYyBTVEF0dHJNYXAgQWRkKHN0cmluZyBhdHRyTmFtZSwgb2JqZWN0IHZhbHVlKQorICB7CisgICAgYmFzZS5BZGQoYXR0ck5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICBwdWJsaWMgU1RBdHRyTWFwIEFkZChzdHJpbmcgYXR0ck5hbWUsIGludCB2YWx1ZSkKKyAgeworICAgIGJhc2UuQWRkKGF0dHJOYW1lLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KK30KKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PXRlbXBsYXRlICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLlRlbXBsYXRlIiwuLi4pPgorPj4KKworcmV3cml0ZVRlbXBsYXRlKGFsdHMpIDo6PSA8PAorCisvLyBURU1QTEFURSBSRVdSSVRFCis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKQoreworICA8YWx0czpyZXdyaXRlVGVtcGxhdGVBbHQoKTsgc2VwYXJhdG9yPSJlbHNlICI+CisgIDxpZihyZXdyaXRlTW9kZSk+PHJlcGxhY2VUZXh0SW5MaW5lKCk+PGVuZGlmPgorfQorPGVsc2U+Cis8YWx0czpyZXdyaXRlVGVtcGxhdGVBbHQoKTsgc2VwYXJhdG9yPSJlbHNlICI+Cis8aWYocmV3cml0ZU1vZGUpPjxyZXBsYWNlVGV4dEluTGluZSgpPjxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3JlcGxhY2VUZXh0SW5MaW5lKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorKChUb2tlblJld3JpdGVTdHJlYW0paW5wdXQuVG9rZW5TdHJlYW0pLlJlcGxhY2UoCisgIGlucHV0LlRyZWVBZGFwdG9yLkdldFRva2VuU3RhcnRJbmRleChyZXR2YWwuU3RhcnQpLAorICBpbnB1dC5UcmVlQWRhcHRvci5HZXRUb2tlblN0b3BJbmRleChyZXR2YWwuU3RhcnQpLAorICByZXR2YWwuVGVtcGxhdGUpOworPGVsc2U+CisoKFRva2VuUmV3cml0ZVN0cmVhbSlpbnB1dCkuUmVwbGFjZSgKKyAgKChJVG9rZW4pcmV0dmFsLlN0YXJ0KS5Ub2tlbkluZGV4LAorICBpbnB1dC5MVCgtMSkuVG9rZW5JbmRleCwKKyAgcmV0dmFsLlRlbXBsYXRlKTsKKzxlbmRpZj4KKz4+CisKK3Jld3JpdGVUZW1wbGF0ZUFsdCgpIDo6PSA8PAorLy8gPGl0LmRlc2NyaXB0aW9uPgorPGlmKGl0LnByZWQpPgoraWYgKDxpdC5wcmVkPikgeworICAgIHJldHZhbC5UZW1wbGF0ZSA9IDxpdC5hbHQ+OworfTxcbj4KKzxlbHNlPgoreworICAgIHJldHZhbC5UZW1wbGF0ZSA9IDxpdC5hbHQ+OworfTxcbj4KKzxlbmRpZj4KKz4+CisKK3Jld3JpdGVFbXB0eVRlbXBsYXRlKGFsdHMpIDo6PSA8PAorbnVsbDsKKz4+CisKKy8qKiBJbnZva2UgYSB0ZW1wbGF0ZSB3aXRoIGEgc2V0IG9mIGF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHBhaXJzLgorICogIFNldCB0aGUgdmFsdWUgb2YgdGhlIHJ1bGUncyB0ZW1wbGF0ZSAqYWZ0ZXIqIGhhdmluZyBzZXQKKyAqICB0aGUgYXR0cmlidXRlcyBiZWNhdXNlIHRoZSBydWxlJ3MgdGVtcGxhdGUgbWlnaHQgYmUgdXNlZCBhcworICogIGFuIGF0dHJpYnV0ZSB0byBidWlsZCBhIGJpZ2dlciB0ZW1wbGF0ZTsgeW91IGdldCBhIHNlbGYtZW1iZWRkZWQKKyAqICB0ZW1wbGF0ZS4KKyAqLworcmV3cml0ZUV4dGVybmFsVGVtcGxhdGUobmFtZSxhcmdzKSA6Oj0gPDwKK3RlbXBsYXRlTGliLkdldEluc3RhbmNlT2YoIjxuYW1lPiI8aWYoYXJncyk+LAorICBuZXcgU1RBdHRyTWFwKCk8YXJnczp7YSB8IC5BZGQoIjxhLm5hbWU+IiwgPGEudmFsdWU+KX0+CisgIDxlbmRpZj4pCis+PgorCisvKiogZXhwciBpcyBhIHN0cmluZyBleHByZXNzaW9uIHRoYXQgc2F5cyB3aGF0IHRlbXBsYXRlIHRvIGxvYWQgKi8KK3Jld3JpdGVJbmRpcmVjdFRlbXBsYXRlKGV4cHIsYXJncykgOjo9IDw8Cit0ZW1wbGF0ZUxpYi5HZXRJbnN0YW5jZU9mKDxleHByPjxpZihhcmdzKT4sCisgIG5ldyBTVEF0dHJNYXAoKTxhcmdzOnthIHwgLkFkZCgiPGEubmFtZT4iLCA8YS52YWx1ZT4pfT4KKyAgPGVuZGlmPikKKz4+CisKKy8qKiBJbnZva2UgYW4gaW5saW5lIHRlbXBsYXRlIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMgKi8KK3Jld3JpdGVJbmxpbmVUZW1wbGF0ZShhcmdzLCB0ZW1wbGF0ZSkgOjo9IDw8CituZXcgU3RyaW5nVGVtcGxhdGUodGVtcGxhdGVMaWIsICI8dGVtcGxhdGU+IjxpZihhcmdzKT4sCisgIG5ldyBTVEF0dHJNYXAoKTxhcmdzOnthIHwgLkFkZCgiPGEubmFtZT4iLCA8YS52YWx1ZT4pfT4KKyAgPGVuZGlmPikKKz4+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxhY3Rpb24+Cis+PgorCisvKiogQW4gYWN0aW9uIGhhcyAlc3QuYXR0ck5hbWU9ZXhwcjsgb3IgJXtzdH0uYXR0ck5hbWU9ZXhwcjsgKi8KK2FjdGlvblNldEF0dHJpYnV0ZShzdCxhdHRyTmFtZSxleHByKSA6Oj0gPDwKKyg8c3Q+KS5TZXRBdHRyaWJ1dGUoIjxhdHRyTmFtZT4iLDxleHByPik7Cis+PgorCisvKiogVHJhbnNsYXRlICV7c3RyaW5nRXhwcn0gKi8KK2FjdGlvblN0cmluZ0NvbnN0cnVjdG9yKHN0cmluZ0V4cHIpIDo6PSA8PAorbmV3IFN0cmluZ1RlbXBsYXRlKHRlbXBsYXRlTGliLDxzdHJpbmdFeHByPikKKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9BU1Quc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDM0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNULnN0ZwpAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK0BvdXRwdXRGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPgorCis8aWYoIVRSRUVfUEFSU0VSKT4KKzwhIHRyZWUgcGFyc2VyIHdvdWxkIGFscmVhZHkgaGF2ZSBpbXBvcnRlZCAhPgordXNpbmcgQW50bHIuUnVudGltZS5UcmVlOwordXNpbmcgUmV3cml0ZVJ1bGVJVG9rZW5TdHJlYW0gPSBBbnRsci5SdW50aW1lLlRyZWUuUmV3cml0ZVJ1bGVUb2tlblN0cmVhbTsKKzxlbmRpZj4KKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKzxAc3VwZXIubWVtYmVycygpPgorPHBhcnNlck1lbWJlcnMoKT4KKz4+CisKK3BhcnNlckN0b3JCb2R5KCkgOjo9IDw8Cis8c3VwZXIucGFyc2VyQ3RvckJvZHkoKT4KKzx0cmVlQWRhcHRvclR5cGUoKT4gdHJlZUFkYXB0b3IgPSBkZWZhdWx0KDx0cmVlQWRhcHRvclR5cGUoKT4pOworQ3JlYXRlVHJlZUFkYXB0b3IocmVmIHRyZWVBZGFwdG9yKTsKK1RyZWVBZGFwdG9yID0gdHJlZUFkYXB0b3I8aWYoIWFjdGlvbnMuKGFjdGlvblNjb3BlKS50cmVlQWRhcHRvclR5cGUpPiA/PyBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTxlbmRpZj47Cis+PgorCisvKiogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK3BhcnNlck1lbWJlcnMoKSA6Oj0gPDwKKy8vIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGluIHlvdXIgaGVscGVyIGZpbGUgdG8gdXNlIGEgY3VzdG9tIHRyZWUgYWRhcHRvcgorcGFydGlhbCB2b2lkIENyZWF0ZVRyZWVBZGFwdG9yKHJlZiA8dHJlZUFkYXB0b3JUeXBlKCk+IGFkYXB0b3IpOworCitwcml2YXRlIDx0cmVlQWRhcHRvclR5cGUoKT4gYWRhcHRvcjsKKworcHVibGljIDx0cmVlQWRhcHRvclR5cGUoKT4gVHJlZUFkYXB0b3IKK3sKKwlnZXQKKwl7CisJCXJldHVybiBhZGFwdG9yOworCX0KKworCXNldAorCXsKKwkJdGhpcy5hZGFwdG9yID0gdmFsdWU7CisJCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4uVHJlZUFkYXB0b3IgPSB0aGlzLmFkYXB0b3I7fT4KKwl9Cit9Cis+PgorCit0cmVlQWRhcHRvclR5cGUoKSA6Oj0gPDwKKzxhY3Rpb25zLihhY3Rpb25TY29wZSkudHJlZUFkYXB0b3JUeXBlOyBudWxsPSJJVHJlZUFkYXB0b3IiPgorPj4KKworcnVsZVJldHVybkJhc2VUeXBlKCkgOjo9IDwlCitBc3Q8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZWxzZT5QYXJzZXI8ZW5kaWY+UnVsZVJldHVyblNjb3BlXDw8QVNUTGFiZWxUeXBlPiwgPGxhYmVsVHlwZT4+CislPgorCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgcnVsZSdzIHJldHVybiBBU1QgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+Cis8QVNUTGFiZWxUeXBlPiByb290XzAgPSBkZWZhdWx0KDxBU1RMYWJlbFR5cGU+KTs8XG4+Cis+PgorCitydWxlTGFiZWxEZWZzKHJ1bGVEZXNjcmlwdG9yLCBsYWJlbFR5cGUsIEFTVExhYmVsVHlwZSwgcmV3cml0ZUVsZW1lbnRUeXBlKSA6Oj0gPCUKKzxzdXBlci5ydWxlTGFiZWxEZWZzKC4uLik+Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorCTp7aXR8PFxuPjxBU1RMYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pl90cmVlID0gZGVmYXVsdCg8QVNUTGFiZWxUeXBlPik7fT4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHM6e2l0fDxcbj48QVNUTGFiZWxUeXBlPiA8aXQubGFiZWwudGV4dD5fdHJlZSA9IGRlZmF1bHQoPEFTVExhYmVsVHlwZT4pO30+Cis8cnVsZURlc2NyaXB0b3IuYWxsVG9rZW5SZWZzSW5BbHRzV2l0aFJld3JpdGVzCisJOntpdHw8XG4+UmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+Iik7fT4KKzxydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlcworCTp7aXR8PFxuPlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgPGl0PiIpO30+Cis8ZW5kaWY+CislPgorCisvKiogV2hlbiBkb2luZyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24sIHdlIG11c3QgZGVmaW5lIHNvbWUgdmFyaWFibGVzOworICogIFRoZXNlIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGlmIGRvaW5nIHJld3JpdGVzLiAgVGhpcyBtdXN0IGJlIGEgIm1vZGUiCisgKiAgYXMgYSBydWxlIGNvdWxkIGhhdmUgYm90aCByZXdyaXRlIGFuZCBBU1Qgd2l0aGluIHRoZSBzYW1lIGFsdGVybmF0aXZlCisgKiAgYmxvY2suCisgKi8KK0BhbHQuZGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYoYXV0b0FTVCAmJiBvdXRlckFsdCAmJiAhcmV3cml0ZU1vZGUgJiYgIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5OaWwoKTsKKzxlbmRpZj4KKz4+CisKKy8vIFQgciBhIGMgayBpIG4gZyAgUiB1IGwgZSAgRSBsIGUgbSBlIG4gdCBzCisKKy8qKiBJRCBhbmQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZSAqLwordG9rZW5SZWZUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4gPCEgVHJhY2sgaW1wbGllcyBubyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24hPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+c3RyZWFtXzx0b2tlbj4uQWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBpZHMrPUlEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlOyBhZGRzIHRvIGlkcyAqYW5kKgorICogIHRvIHRoZSB0cmFja2luZyBsaXN0IHN0cmVhbV9JRCBmb3IgdXNlIGluIHRoZSByZXdyaXRlLgorICovCit0b2tlblJlZlRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2sodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5zdHJlYW1fPHRva2VuPi5BZGQoPGxhYmVsPik7Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSB0cmFjayBmb3IgcmV3cml0ZSAqLwordG9rZW5SZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5zdHJlYW1fPHJ1bGUubmFtZT4uQWRkKDxsYWJlbD4uVHJlZSk7Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LGVsZW1UeXBlPUFTVExhYmVsVHlwZSwuLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+c3RyZWFtXzxydWxlPi5BZGQoPGxhYmVsPi5UcmVlKTsKKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT17PGxhYmVsPi5UcmVlfSxlbGVtVHlwZT1BU1RMYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8vIFIgZSB3IHIgaSB0IGUKKworcmV3cml0ZUNvZGUoCisJYWx0cywgZGVzY3JpcHRpb24sCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gQUxMIHJlZmVyZW5jZWQgZWxlbWVudHMgdG8gcmlnaHQgb2YgLT4KKwlyZWZlcmVuY2VkVG9rZW5MYWJlbHMsCisJcmVmZXJlbmNlZFRva2VuTGlzdExhYmVscywKKwlyZWZlcmVuY2VkUnVsZUxhYmVscywKKwlyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMsCisJcmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzLAorCXJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHMsCisJcmV3cml0ZUJsb2NrTGV2ZWwsIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxcbj57CisvLyBBU1QgUkVXUklURQorLy8gZWxlbWVudHM6IDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxhYmVsczogPHJlZmVyZW5jZWRSdWxlTGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHdpbGRjYXJkIGxhYmVsczogPFtyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMscmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVsc107IHNlcGFyYXRvcj0iLCAiPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHsKKzxlbmRpZj4KKzxwcmV2UnVsZVJvb3RSZWYoKT4uVHJlZSA9IHJvb3RfMDsKKzxyZXdyaXRlQ29kZUxhYmVscygpPgorcm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuTmlsKCk7Cis8YWx0czpyZXdyaXRlQWx0KCk7IHNlcGFyYXRvcj0iZWxzZSAiPgorPCEgaWYgdHJlZSBwYXJzZXIgYW5kIHJld3JpdGU9dHJ1ZSAhPgorPGlmKFRSRUVfUEFSU0VSJiZyZXdyaXRlTW9kZSk+Cis8cHJldlJ1bGVSb290UmVmKCk+LlRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5SdWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKTsKK2lucHV0LlJlcGxhY2VDaGlsZHJlbihhZGFwdG9yLkdldFBhcmVudChyZXR2YWwuU3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuR2V0Q2hpbGRJbmRleChyZXR2YWwuU3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgIGFkYXB0b3IuR2V0Q2hpbGRJbmRleChfbGFzdCksCisgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLlRyZWUpOworPGVuZGlmPgorPCEgaWYgcGFyc2VyIG9yIHRyZWUtcGFyc2VyICYmIHJld3JpdGUhPXRydWUsIHdlIG5lZWQgdG8gc2V0IHJlc3VsdCAhPgorPGlmKCFUUkVFX1BBUlNFUnx8IXJld3JpdGVNb2RlKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4uVHJlZSA9IHJvb3RfMDsKKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPgorfQorPGVuZGlmPgorfQorCis+PgorCityZXdyaXRlQ29kZUxhYmVscygpIDo6PSA8PAorPHJlZmVyZW5jZWRUb2tlbkxhYmVscworICAgIDp7aXR8UmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+Iiw8aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVscworICAgIDp7aXR8UmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+IiwgbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzCisJOntpdHxSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gc3RyZWFtXzxpdD49bmV3IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShhZGFwdG9yLCJ3aWxkY2FyZCA8aXQ+Iiw8aXQ+KTt9OworCXNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVscworCTp7aXR8UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwid2lsZGNhcmQgPGl0PiIsbGlzdF88aXQ+KTt9OworCXNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMYWJlbHMKKyAgICA6e2l0fFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInJ1bGUgPGl0PiIsPGl0PiE9bnVsbD88aXQ+LlRyZWU6bnVsbCk7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVscworICAgIDp7aXR8UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwidG9rZW4gPGl0PiIsbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCisvKiogR2VuZXJhdGUgY29kZSBmb3IgYW4gb3B0aW9uYWwgcmV3cml0ZSBibG9jazsgbm90ZSBpdCB1c2VzIHRoZSBkZWVwIHJlZidkIGVsZW1lbnQKKyAgKiAgbGlzdCByYXRoZXIgc2hhbGxvdyBsaWtlIG90aGVyIGJsb2Nrcy4KKyAgKi8KK3Jld3JpdGVPcHRpb25hbEJsb2NrKAorCWFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBhbGwgbmVzdGVkIHJlZnMKKwlyZWZlcmVuY2VkRWxlbWVudHMsIC8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraWYgKDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+Lkhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4pCit7CisJPGFsdD4KK30KKzxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+LlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQ2xvc3VyZUJsb2NrKAorCWFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBhbGwgbmVzdGVkIHJlZnMKKwlyZWZlcmVuY2VkRWxlbWVudHMsIC8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisJZGVzY3JpcHRpb24pIDo6PQorPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgord2hpbGUgKCA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+Lkhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4gKQoreworCTxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAoraWYgKCEoPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5IYXNOZXh0fTsgc2VwYXJhdG9yPSJ8fCI+KSkKK3sKKwl0aHJvdyBuZXcgUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbigpOworfQord2hpbGUgKCA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+Lkhhc05leHR9OyBzZXBhcmF0b3I9Inx8Ij4gKQoreworCTxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQWx0KGEpIDo6PSA8PAorLy8gPGEuZGVzY3JpcHRpb24+Cis8aWYoYS5wcmVkKT4KK2lmICg8YS5wcmVkPikKK3sKKwk8YS5hbHQ+Cit9Cis8ZWxzZT4KK3sKKwk8YS5hbHQ+Cit9Cis8ZW5kaWY+Cis+PgorCisvKiogRm9yIGVtcHR5IHJld3JpdGVzOiAiciA6IC4uLiAtPiA7IiAqLworcmV3cml0ZUVtcHR5QWx0KCkgOjo9ICJyb290XzAgPSBudWxsOyIKKworcmV3cml0ZVRyZWUocm9vdCxjaGlsZHJlbixkZXNjcmlwdGlvbixlbmNsb3NpbmdUcmVlTGV2ZWwsdHJlZUxldmVsKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworPEFTVExhYmVsVHlwZT4gcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLk5pbCgpOworPHJvb3Q6cmV3cml0ZUVsZW1lbnQoKT4KKzxjaGlsZHJlbjpyZXdyaXRlRWxlbWVudCgpPgorYWRhcHRvci5BZGRDaGlsZChyb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTsKK308XG4+Cis+PgorCityZXdyaXRlRWxlbWVudExpc3QoZWxlbWVudHMpIDo6PSAiPGVsZW1lbnRzOnJld3JpdGVFbGVtZW50KCk+IgorCityZXdyaXRlRWxlbWVudChlKSA6Oj0gPCUKKzxAcHJlZ2VuKCk+CitEZWJ1Z0xvY2F0aW9uKDxlLmxpbmU+LCA8ZS5wb3M+KTs8XG4+Cis8ZS5lbD4KKyU+CisKKy8qKiBHZW4gSUQgb3IgSURbYXJnc10gKi8KK3Jld3JpdGVUb2tlblJlZih0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPik7PFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsPUlEICovCityZXdyaXRlVG9rZW5MYWJlbFJlZihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5OZXh0Tm9kZSgpKTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4uTmV4dE5vZGUoKSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRsYWJlbCAuLi4pICovCityZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KHN0cmVhbV88bGFiZWw+Lk5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSB3aGVyZSBsYWJlbCs9Li4uICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworLyoqIEdlbiBeKElEIC4uLikgb3IgXihJRFthcmdzXSAuLi4pICovCityZXdyaXRlVG9rZW5SZWZSb290KHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPiwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworcmV3cml0ZUltYWdpbmFyeVRva2VuUmVmKGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4sIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfMCA9IDxhY3Rpb24+Ozxcbj4KKz4+CisKKy8qKiBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGlzIHJ1bGUncyByb290IHRyZWU/ICBUaGlzCisgKiAgbGV0J3MgdXMgcmVmZXIgdG8gJHJ1bGUgdG8gbWVhbiBwcmV2aW91cyB2YWx1ZS4gIEkgYW0gcmV1c2luZyB0aGUKKyAqICB2YXJpYWJsZSAndHJlZScgc2l0dGluZyBpbiByZXR2YWwgc3RydWN0IHRvIGhvbGQgdGhlIHZhbHVlIG9mIHJvb3RfMCByaWdodAorICogIGJlZm9yZSBJIHNldCBpdCBkdXJpbmcgcmV3cml0ZXMuICBUaGUgYXNzaWduIHdpbGwgYmUgdG8gcmV0dmFsLnRyZWUuCisgKi8KK3ByZXZSdWxlUm9vdFJlZigpIDo6PSAicmV0dmFsIgorCityZXdyaXRlUnVsZVJlZihydWxlKSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxydWxlPi5OZXh0VHJlZSgpKTs8XG4+Cis+PgorCityZXdyaXRlUnVsZVJlZlJvb3QocnVsZSkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdChzdHJlYW1fPHJ1bGU+Lk5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKK3Jld3JpdGVOb2RlQWN0aW9uKGFjdGlvbikgOjo9IDw8CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxhY3Rpb24+KTs8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvblJvb3QoYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxhY3Rpb24+LCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCisvKiogR2VuICRydWxlTGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIHJ1bGVMYWJlbD1ydWxlICovCityZXdyaXRlUnVsZUxhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4uTmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4uTmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4uTmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmUm9vdChsYWJlbCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdChzdHJlYW1fPGxhYmVsPi5OZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCityZXdyaXRlV2lsZGNhcmRMYWJlbFJlZihsYWJlbCkgOjo9IDw8CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lk5leHRUcmVlKCkpOzxcbj4KKz4+CisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPCUKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsLCBhcmdzKSAhPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQ3JlYXRlKDx0b2tlblR5cGU+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGlmKCFhcmdzKT4iPHRva2VuVHlwZT4iPGVuZGlmPikKKzxlbmRpZj4KKyU+CisKK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8JQorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KHN0cmVhbV88dG9rZW4+Lk5leHRUb2tlbigpPGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj4pCis8ZWxzZT4KKzxpZihhcmdzKT4gPCEgbXVzdCBjcmVhdGUgbmV3IG5vZGUgZnJvbSBvbGQgIT4KK2FkYXB0b3IuQ3JlYXRlKDx0b2tlbj4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lk5leHROb2RlKCkKKzxlbmRpZj4KKzxlbmRpZj4KKyU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNURGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9BU1REYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDE2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNURGJnLnN0ZwpAQCAtMCwwICsxLDk4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDggVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKiBUZW1wbGF0ZSBvdmVycmlkZXMgdG8gYWRkIGRlYnVnZ2luZyB0byBBU1Qgc3R1ZmYuICBEeW5hbWljIGluaGVyaXRhbmNlCisgKiAgaGllcmFyY2h5IGlzIHNldCB1cCBhcyBBU1REYmcgOiBBU1QgOiBEYmcgOiBKYXZhIGJ5IGNvZGUgZ2VuZXJhdG9yLgorICovCisKK3BhcnNlck1lbWJlcnMoKSA6Oj0gPDwKKy8vIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGluIHlvdXIgaGVscGVyIGZpbGUgdG8gdXNlIGEgY3VzdG9tIHRyZWUgYWRhcHRvcgorcGFydGlhbCB2b2lkIEluaXRpYWxpemVUcmVlQWRhcHRvcigpOworcHJvdGVjdGVkIERlYnVnVHJlZUFkYXB0b3IgYWRhcHRvcjsKKworcHVibGljIElUcmVlQWRhcHRvciBUcmVlQWRhcHRvcgoreworCWdldAorCXsKKwkJcmV0dXJuIGFkYXB0b3I7CisJfQorCXNldAorCXsKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorCQl0aGlzLmFkYXB0b3IgPSBuZXcgRGVidWdUcmVlQWRhcHRvcihkYmcsYWRhcHRvcik7Cis8ZWxzZT4KKwkJdGhpcy5hZGFwdG9yID0gKERlYnVnVHJlZUFkYXB0b3IpYWRhcHRvcjsgLy8gZGVsZWdhdG9yIHNlbmRzIGRiZyBhZGFwdG9yCis8ZW5kaWY+PFxuPgorCQk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6e2d8PGc6ZGVsZWdhdGVOYW1lKCk+LlRyZWVBZGFwdG9yID0gdGhpcy5hZGFwdG9yO30+CisJfQorfTxcbj4KKz4+CisKK3BhcnNlckN0b3JCb2R5KCkgOjo9IDw8Cis8c3VwZXIucGFyc2VyQ3RvckJvZHkoKT4KKz4+CisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8CitEZWJ1Z0V2ZW50U29ja2V0UHJveHkgcHJveHkgPSBuZXcgRGVidWdFdmVudFNvY2tldFByb3h5KCB0aGlzLCBwb3J0LCA8aWYoVFJFRV9QQVJTRVIpPmlucHV0LlRyZWVBZGFwdG9yPGVsc2U+YWRhcHRvcjxlbmRpZj4gKTsKK0RlYnVnTGlzdGVuZXIgPSBwcm94eTsKKzxpbnB1dFN0cmVhbVR5cGU+ID0gbmV3IERlYnVnPGlucHV0U3RyZWFtVHlwZT4oIGlucHV0LCBwcm94eSApOwordHJ5Cit7CisJcHJveHkuSGFuZHNoYWtlKCk7Cit9CitjYXRjaCAoIElPRXhjZXB0aW9uIGlvZSApCit7CisJUmVwb3J0RXJyb3IoIGlvZSApOworfQorPj4KKworQGN0b3JGb3JSb290R3JhbW1hci5maW5hbGx5KCkgOjo9IDw8CitJVHJlZUFkYXB0b3IgYWRhcCA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworVHJlZUFkYXB0b3IgPSBhZGFwOworcHJveHkuVHJlZUFkYXB0b3IgPSBhZGFwOworPj4KKworQGN0b3JGb3JQcm9maWxpbmdSb290R3JhbW1hci5maW5hbGx5KCkgOjo9PDwKK0lUcmVlQWRhcHRvciBhZGFwID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CitUcmVlQWRhcHRvciA9IGFkYXA7Cis+PgorCitAY3RvckZvclByZWRlZmluZWRMaXN0ZW5lci5zdXBlckNsYXNzUmVmKCkgOjo9ICI6IGJhc2UoIGlucHV0LCBkYmcgKSIKKworQGN0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIuZmluYWxseSgpIDo6PTw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT48ISBkb24ndCBjcmVhdGUgbmV3IGFkYXB0b3IgZm9yIGRlbGVnYXRlcyAhPgorSVRyZWVBZGFwdG9yIGFkYXAgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKK1RyZWVBZGFwdG9yID0gYWRhcDs8XG4+Cis8ZW5kaWY+Cis+PgorCisvL0ByZXdyaXRlRWxlbWVudC5wcmVnZW4oKSA6Oj0gImRiZy5Mb2NhdGlvbiggPGUubGluZT4sIDxlLnBvcz4gKTsiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNUUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTA3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNUUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIG5vcm1hbCBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgVGhlIHNpdHVhdGlvbiBpcyBub3QgdG9vIGJhZCBhcyByZXdyaXRlICgtPikgdXNhZ2UgbWFrZXMgXiBhbmQgIQorICogIGludmFsaWQuIFRoZXJlIGlzIG5vIGh1Z2UgZXhwbG9zaW9uIG9mIGNvbWJpbmF0aW9ucy4KKyAqLworCitAcnVsZS5zZXRFcnJvclJldHVyblZhbHVlKCkgOjo9IDw8CityZXR2YWwuVHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkVycm9yTm9kZShpbnB1dCwgcmV0dmFsLlN0YXJ0LCBpbnB1dC5MVCgtMSksIHJlKTsKKzwhIFN5c3RlbS5vdXQuV3JpdGVMaW5lKCI8cnVsZU5hbWU+IHJldHVybnMgIisoKENvbW1vblRyZWUpcmV0dmFsLnRyZWUpLnRvU3RyaW5nVHJlZSgpKTsgIT4KKz4+CisKKy8vIFRPS0VOIEFTVCBTVFVGRgorCisvKiogSUQgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8JQorPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYoYmFja3RyYWNraW5nKT48XG4+aWYgKHN0YXRlLmJhY2t0cmFja2luZyA9PSAwKSB7PGVuZGlmPgorPFxuPjxsYWJlbD5fdHJlZSA9IDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+OworPFxuPmFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+PFxuPn08ZW5kaWY+Cis8ZW5kaWY+CislPgorCisvKiogSUQhIGFuZCBvdXRwdXQ9QVNUIChzYW1lIGFzIHBsYWluIHRva2VuUmVmKSAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSAiPHN1cGVyLnRva2VuUmVmKC4uLik+IgorCisvKiogSUReIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8JQorPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYoYmFja3RyYWNraW5nKT48XG4+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorPFxuPjxsYWJlbD5fdHJlZSA9IDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+OworPFxuPnJvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290XzApOworPGlmKGJhY2t0cmFja2luZyk+PFxuPn08ZW5kaWY+Cis8ZW5kaWY+CislPgorCisvKiogaWRzKz1JRCEgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmQmFuZ0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBsYWJlbCs9VE9LRU5eIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsZWxlbVR5cGU9bGFiZWxUeXBlLC4uLik+Cis+PgorCisvLyBTRVQgQVNUCisKKy8vIHRoZSBtYXRjaCBzZXQgc3R1ZmYgaXMgaW50ZXJlc3RpbmcgaW4gdGhhdCBpdCB1c2VzIGFuIGFyZ3VtZW50IGxpc3QKKy8vIHRvIHBhc3MgY29kZSB0byB0aGUgZGVmYXVsdCBtYXRjaFNldDsgYW5vdGhlciBwb3NzaWJsZSB3YXkgdG8gYWx0ZXIKKy8vIGluaGVyaXRlZCBjb2RlLiAgSSBkb24ndCB1c2UgdGhlIHJlZ2lvbiBzdHVmZiBiZWNhdXNlIEkgbmVlZCB0byBwYXNzCisvLyBkaWZmZXJlbnQgY2h1bmtzIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0b3IuICBJIGRvbid0IGxpa2UgbWFraW5nCisvLyB0aGUgdGVtcGxhdGUgbmFtZSBoYXZlIHRoZSBvcGVyYXRvciBhcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlcyBnZXRzCisvLyBsYXJnZSBidXQgdGhpcyBpcyB0aGUgbW9zdCBmbGV4aWJsZS0tdGhpcyBpcyBhcyBvcHBvc2VkIHRvIGhhdmluZworLy8gdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbGwgbWF0Y2hTZXQgdGhlbiBhZGQgcm9vdCBjb2RlIG9yIHJ1bGVyb290IGNvZGUKKy8vIHBsdXMgbGlzdCBsYWJlbCBwbHVzIC4uLiAgVGhlIGNvbWJpbmF0aW9ucyBtaWdodCByZXF1aXJlIGNvbXBsaWNhdGVkCisvLyByYXRoZXIgdGhhbiBqdXN0IGFkZGVkIG9uIGNvZGUuICBJbnZlc3RpZ2F0ZSB0aGF0IHJlZmFjdG9yaW5nIHdoZW4KKy8vIEkgaGF2ZSBtb3JlIHRpbWUuCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXs8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+PGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+YWRhcHRvci5BZGRDaGlsZChyb290XzAsIDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+KTs8ZW5kaWY+fSwgLi4uKT4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlLHRyZWVMZXZlbD0iMCIpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis+PgorCittYXRjaFNldEJhbmcocyxsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLHBvc3RtYXRjaENvZGUpIDo6PSAiPHN1cGVyLm1hdGNoU2V0KC4uLik+IgorCisvLyBub3RlIHRoZXJlIGlzIG5vIG1hdGNoU2V0VHJhY2sgYmVjYXVzZSAtPiByZXdyaXRlcyBmb3JjZSBzZXRzIHRvIGJlCisvLyBwbGFpbiBvbGQgYmxvY2tzIG9mIGFsdHM6IChBfEJ8Li4ufEMpCisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+PSg8bGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxlbmRpZj4KKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXs8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+PGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+cm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQmVjb21lUm9vdCg8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPiwgcm9vdF8wKTs8ZW5kaWY+fSwgLi4uKT4KKz4+CisKKy8vIFJVTEUgUkVGIEFTVAorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDwlCis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPFxuPjxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgPGVuZGlmPmFkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+LlRyZWUpOworPGVuZGlmPgorJT4KKworLyoqIHJ1bGUhIGlzIHNhbWUgYXMgbm9ybWFsIHJ1bGUgcmVmICovCitydWxlUmVmQmFuZyhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gIjxzdXBlci5ydWxlUmVmKC4uLik+IgorCisvKiogcnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIDxlbmRpZj5yb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxsYWJlbD4uVHJlZSwgcm9vdF8wKTsKKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PUFTVCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LGVsZW1UeXBlPUFTVExhYmVsVHlwZSwuLi4pPgorPj4KKworLyoqIHgrPXJ1bGUhIHdoZW4gb3V0cHV0PUFTVCBpcyBhIHJ1bGUgcmVmIHdpdGggbGlzdCBhZGRpdGlvbiAqLworcnVsZVJlZkJhbmdBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09ezxsYWJlbD4uVHJlZX0sZWxlbVR5cGU9QVNUTGFiZWxUeXBlLC4uLik+Cis+PgorCisvKiogeCs9cnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09ezxsYWJlbD4uVHJlZX0sZWxlbVR5cGU9QVNUTGFiZWxUeXBlLC4uLik+Cis+PgorCisvLyBXSUxEQ0FSRCBBU1QKKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIud2lsZGNhcmQoLi4uKT4KKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkNyZWF0ZSg8bGFiZWw+KTsKK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3dpbGRjYXJkQmFuZyhsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSAiPHN1cGVyLndpbGRjYXJkKC4uLik+IgorCit3aWxkY2FyZFJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5DcmVhdGUoPGxhYmVsPik7Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5CZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF8wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCitjcmVhdGVOb2RlRnJvbVRva2VuKGxhYmVsLHRlcm1pbmFsT3B0aW9ucykgOjo9IDwlCis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPikKKzxlbHNlPgorKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuQ3JlYXRlKDxpZih0ZXJtaW5hbE9wdGlvbnMudHlwZSk+PHRlcm1pbmFsT3B0aW9ucy50eXBlPiw8ZW5kaWY+PGxhYmVsPjxpZih0ZXJtaW5hbE9wdGlvbnMudGV4dCk+LDx0ZXJtaW5hbE9wdGlvbnMudGV4dDsgZm9ybWF0PSJzdHJpbmciPjxlbmRpZj4pCis8ZW5kaWY+CislPgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+CityZXR2YWwuVHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLlJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworYWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLlRyZWUsIHJldHZhbC5TdGFydCwgcmV0dmFsLlN0b3ApOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNUVHJlZVBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvQVNUVHJlZVBhcnNlci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlODJlZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9BU1RUcmVlUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIHRyZWUgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIEVhY2ggY29tYmluYXRpb24gaGFzIGl0cyBvd24gdGVtcGxhdGUgZXhjZXB0IHRoYXQgbGFiZWwvbm8gbGFiZWwKKyAqICBpcyBjb21iaW5lZCBpbnRvIHRva2VuUmVmLCBydWxlUmVmLCAuLi4KKyAqLworCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgbGFzdCBlbGVtZW50IG1hdGNoZWQgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+Cis8QVNUTGFiZWxUeXBlPiBfZmlyc3RfMCA9IGRlZmF1bHQoPEFTVExhYmVsVHlwZT4pOworPEFTVExhYmVsVHlwZT4gX2xhc3QgPSBkZWZhdWx0KDxBU1RMYWJlbFR5cGU+KTs8XG4+Cis+PgorCisvKiogV2hhdCB0byBlbWl0IHdoZW4gdGhlcmUgaXMgbm8gcmV3cml0ZSBydWxlLiAgRm9yIGF1dG8gYnVpbGQKKyAqICBtb2RlLCBkb2VzIG5vdGhpbmcuCisgKi8KK25vUmV3cml0ZShyZXdyaXRlQmxvY2tMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KKzxpZihyZXdyaXRlTW9kZSk+CityZXR2YWwuVHJlZSA9ICg8QVNUTGFiZWxUeXBlPilfZmlyc3RfMDsKK2lmIChhZGFwdG9yLkdldFBhcmVudChyZXR2YWwuVHJlZSkhPW51bGwgJiYgYWRhcHRvci5Jc05pbChhZGFwdG9yLkdldFBhcmVudChyZXR2YWwuVHJlZSkpKQorICAgIHJldHZhbC5UcmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuR2V0UGFyZW50KHJldHZhbC5UcmVlKTsKKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCisvKiogbWF0Y2ggXihyb290IGNoaWxkcmVuKSBpbiB0cmVlIHBhcnNlcjsgb3ZlcnJpZGUgaGVyZSB0bworICogIGFkZCB0cmVlIGNvbnN0cnVjdGlvbiBhY3Rpb25zLgorICovCit0cmVlKHJvb3QsIGFjdGlvbnNBZnRlclJvb3QsIGNoaWxkcmVuLCBudWxsYWJsZUNoaWxkTGlzdCwKKyAgICAgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cit7Cis8QVNUTGFiZWxUeXBlPiBfc2F2ZV9sYXN0Xzx0cmVlTGV2ZWw+ID0gX2xhc3Q7Cis8QVNUTGFiZWxUeXBlPiBfZmlyc3RfPHRyZWVMZXZlbD4gPSBkZWZhdWx0KDxBU1RMYWJlbFR5cGU+KTsKKzxpZighcmV3cml0ZU1vZGUpPgorPEFTVExhYmVsVHlwZT4gcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLk5pbCgpOworPGVuZGlmPgorPHJvb3Q6ZWxlbWVudCgpPgorPGlmKHJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPik8ZW5kaWY+Cis8aWYocm9vdC5lbC5ydWxlKT4KK2lmIChfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPT0gbnVsbCkgX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ID0gPHJvb3QuZWwubGFiZWw+LlRyZWU7Cis8ZWxzZT4KK2lmIChfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPT0gbnVsbCkgX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ID0gPHJvb3QuZWwubGFiZWw+OworPGVuZGlmPgorPGVuZGlmPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmIChpbnB1dC5MQSgxKSA9PSBUb2tlblR5cGVzLkRvd24pIHsKKyAgICBNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICAgIE1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK30KKzxlbHNlPgorTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8Y2hpbGRyZW46ZWxlbWVudCgpPgorTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPGlmKCFyZXdyaXRlTW9kZSk+CithZGFwdG9yLkFkZENoaWxkKHJvb3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4sIHJvb3RfPHRyZWVMZXZlbD4pOworPGVuZGlmPgorX2xhc3QgPSBfc2F2ZV9sYXN0Xzx0cmVlTGV2ZWw+OworfTxcbj4KKz4+CisKKy8vIFRPS0VOIEFTVCBTVFVGRgorCisvKiogSUQhIGFuZCBvdXRwdXQ9QVNUIChzYW1lIGFzIHBsYWluIHRva2VuUmVmKSAnY2VwdCBhZGQKKyAqICBzZXR0aW5nIG9mIF9sYXN0CisgKi8KK3Rva2VuUmVmQmFuZyh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis+PgorCisvKiogSUQgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IG5ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxpZih0ZXJtaW5hbE9wdGlvbnMudHlwZSk+PHRlcm1pbmFsT3B0aW9ucy50eXBlPiw8ZW5kaWY+PGxhYmVsPjxpZih0ZXJtaW5hbE9wdGlvbnMudGV4dCk+LDx0ZXJtaW5hbE9wdGlvbnMudGV4dDsgZm9ybWF0PSJzdHJpbmciPjxlbmRpZj4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5EdXBOb2RlKDxpZih0ZXJtaW5hbE9wdGlvbnMudHlwZSk+PHRlcm1pbmFsT3B0aW9ucy50eXBlPiw8ZW5kaWY+PGxhYmVsPjxpZih0ZXJtaW5hbE9wdGlvbnMudGV4dCk+LDx0ZXJtaW5hbE9wdGlvbnMudGV4dDsgZm9ybWF0PSJzdHJpbmciPjxlbmRpZj4pOworPGVuZGlmPjxcbj4KK2FkYXB0b3IuQWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pPGVuZGlmPgoraWYgKF9maXJzdF88dHJlZUxldmVsPiA9PSBudWxsKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+OworPGVuZGlmPgorPj4KKworLyoqIGxhYmVsKz1UT0tFTiBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkR1cE5vZGUoPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZW5kaWY+PFxuPgorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggLiB3aWxkY2FyZCBhbmQgYXV0byBkdXAgdGhlIG5vZGUvc3VidHJlZSAqLword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5EdXBUcmVlKDxsYWJlbD4pOworYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPik8ZW5kaWY+CitpZiAoX2ZpcnN0Xzx0cmVlTGV2ZWw+ID09IG51bGwpIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvLyBTRVQgQVNUCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkR1cE5vZGUoPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZW5kaWY+PFxuPgorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+XH08ZW5kaWY+Cis8ZW5kaWY+Cit9LCAuLi4KKyk+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPG5vUmV3cml0ZSguLi4pPiA8ISBzZXQgcmV0dXJuIHRyZWUgIT4KKz4+CisKK21hdGNoU2V0QmFuZyhzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci5tYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRSdWxlUm9vdChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgsZGVidWcpIDo6PSA8PAorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkR1cE5vZGUoPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj48bGFiZWw+PGlmKHRlcm1pbmFsT3B0aW9ucy50ZXh0KT4sPHRlcm1pbmFsT3B0aW9ucy50ZXh0OyBmb3JtYXQ9InN0cmluZyI+PGVuZGlmPik7Cis8ZW5kaWY+PFxuPgorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxpZihiYWNrdHJhY2tpbmcpPlx9PGVuZGlmPgorPGVuZGlmPgorfSwgLi4uCispPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KTxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorYWRhcHRvci5BZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+LlRyZWUpOworPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgoraWYgKF9maXJzdF88dHJlZUxldmVsPiA9PSBudWxsKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+LlRyZWU7Cis8ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPXs8bGFiZWw+LlRyZWV9LC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+KSA8ZW5kaWY+cm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLkJlY29tZVJvb3QoPGxhYmVsPi5UcmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxlbmRpZj4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT17PGxhYmVsPi5UcmVlfSwuLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZlRyYWNrKC4uLik+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci5ydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZSb290VHJhY2soLi4uKT4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogU3RyZWFtcyBmb3IgdG9rZW4gcmVmcyBhcmUgdHJlZSBub2RlcyBub3c7IG92ZXJyaWRlIHRvCisgKiAgY2hhbmdlIE5leHRUb2tlbiB0byBOZXh0Tm9kZS4KKyAqLworY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDwlCis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGlmKHRlcm1pbmFsT3B0aW9ucy50eXBlKT48dGVybWluYWxPcHRpb25zLnR5cGU+LDxlbmRpZj5zdHJlYW1fPHRva2VuPi5OZXh0Tm9kZSgpKQorPGVsc2U+CitzdHJlYW1fPHRva2VuPi5OZXh0Tm9kZSgpCis8ZW5kaWY+CislPgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPikgezxlbmRpZj4KK3JldHZhbC5UcmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9DU2hhcnAzLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9DU2hhcnAzLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM4ZmFlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAzL0NTaGFycDMuc3RnCkBAIC0wLDAgKzEsMTY5OSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgUGl4ZWwgTWluZSwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2NzaGFycFZpc2liaWxpdHlNYXAgOjo9IFsKKwkicHJpdmF0ZSI6InByaXZhdGUiLAorCSJwcm90ZWN0ZWQiOiJwcm90ZWN0ZWQiLAorCSJwdWJsaWMiOiJwdWJsaWMiLAorCSJmcmFnbWVudCI6InByaXZhdGUiLAorCWRlZmF1bHQ6InByaXZhdGUiCitdCisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqLworb3V0cHV0RmlsZSgJTEVYRVIsUEFSU0VSLFRSRUVfUEFSU0VSLCBhY3Rpb25TY29wZSwgYWN0aW9ucywKKwkJCWRvY0NvbW1lbnQsIHJlY29nbml6ZXIsCisJCQluYW1lLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLAorCQkJYml0c2V0cywgYnVpbGRUZW1wbGF0ZSwgYnVpbGRBU1QsIHJld3JpdGVNb2RlLCBwcm9maWxlLAorCQkJYmFja3RyYWNraW5nLCBzeW5wcmVkcywgbWVtb2l6ZSwgbnVtUnVsZXMsCisJCQlmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsIHRyYWNlLAorCQkJc2NvcGVzLCBzdXBlckNsYXNzLCBsaXRlcmFscykgOjo9Cis8PAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFw8YXV0by1nZW5lcmF0ZWQ+CisvLyAgICAgVGhpcyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgYSB0b29sLgorLy8gICAgIEFOVExSIFZlcnNpb246IDxBTlRMUlZlcnNpb24+CisvLworLy8gICAgIENoYW5nZXMgdG8gdGhpcyBmaWxlIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZgorLy8gICAgIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLgorLy8gXDwvYXV0by1nZW5lcmF0ZWQ+CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAkQU5UTFIgPEFOVExSVmVyc2lvbj4gPGZpbGVOYW1lPiA8Z2VuZXJhdGVkVGltZXN0YW1wPgorCisvLyBUaGUgdmFyaWFibGUgJ3ZhcmlhYmxlJyBpcyBhc3NpZ25lZCBidXQgaXRzIHZhbHVlIGlzIG5ldmVyIHVzZWQuCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAyMTkKKy8vIFVucmVhY2hhYmxlIGNvZGUgZGV0ZWN0ZWQuCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNjIKKy8vIE1pc3NpbmcgWE1MIGNvbW1lbnQgZm9yIHB1YmxpY2x5IHZpc2libGUgdHlwZSBvciBtZW1iZXIgJ1R5cGVfb3JfTWVtYmVyJworI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MQorLy8gQ0xTIGNvbXBsaWFuY2UgY2hlY2tpbmcgd2lsbCBub3QgYmUgcGVyZm9ybWVkIG9uICd0eXBlJyBiZWNhdXNlIGl0IGlzIG5vdCB2aXNpYmxlIGZyb20gb3V0c2lkZSB0aGlzIGFzc2VtYmx5LgorI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMzAxOQorCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKworPEBpbXBvcnRzPgordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBBbnRsci5SdW50aW1lOwordXNpbmcgQW50bHIuUnVudGltZS5NaXNjOworPGlmKFRSRUVfUEFSU0VSKT4KK3VzaW5nIEFudGxyLlJ1bnRpbWUuVHJlZTsKK3VzaW5nIFJld3JpdGVSdWxlSVRva2VuU3RyZWFtID0gQW50bHIuUnVudGltZS5UcmVlLlJld3JpdGVSdWxlVG9rZW5TdHJlYW07Cis8ZW5kaWY+Cis8QGVuZD4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkubmFtZXNwYWNlKT4KK25hbWVzcGFjZSA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLm5hbWVzcGFjZT4KK3sKKzxlbmRpZj4KKzxkb2NDb21tZW50PgorPHJlY29nbml6ZXI+Cis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm5hbWVzcGFjZSk+CisKK30gLy8gbmFtZXNwYWNlIDxhY3Rpb25zLihhY3Rpb25TY29wZSkubmFtZXNwYWNlPgorPGVuZGlmPgorPj4KKworbGV4ZXJJbnB1dFN0cmVhbVR5cGUoKSA6Oj0gPDwKKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuaW5wdXRTdHJlYW1UeXBlOyBudWxsPSJJQ2hhclN0cmVhbSI+Cis+PgorCitsZXhlcihncmFtbWFyLCBuYW1lLCB0b2tlbnMsIHNjb3BlcywgcnVsZXMsIG51bVJ1bGVzLCBmaWx0ZXJNb2RlLCBsYWJlbFR5cGU9IkNvbW1vblRva2VuIiwKKyAgICAgIHN1cGVyQ2xhc3M9ezxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkuc3VwZXJDbGFzcyk+PGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zdXBlckNsYXNzPjxlbHNlPkFudGxyLlJ1bnRpbWUuTGV4ZXI8ZW5kaWY+fSwKKwkgIHJld3JpdGVFbGVtZW50VHlwZT17fSwgQVNUTGFiZWxUeXBlPXt9KSA6Oj0gPDwKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICI8QU5UTFJWZXJzaW9uPiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorPHBhcnNlck1vZGlmaWVyKGdyYW1tYXI9Z3JhbW1hciwgYWN0aW9ucz1hY3Rpb25zKT4gcGFydGlhbCBjbGFzcyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gOiA8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPgoreworCTx0b2tlbnM6e2l0fHB1YmxpYyBjb25zdCBpbnQgPGl0Lm5hbWU7IGZvcm1hdD0iaWQiPj08aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisJPHNjb3Blczp7aXR8PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorCTxhY3Rpb25zLmxleGVyLm1lbWJlcnM+CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICA8Z3JhbW1hci5kZWxlZ2F0ZXM6CisgICAgICAgICB7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgLy8gZGVsZWdhdG9ycworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiBnUGFyZW50O30+CisKKwk8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPGdyYW1tYXIucmVjb2duaXplck5hbWU+KCk8ISBuZWVkZWQgYnkgc3ViY2xhc3NlcyAhPgorCXsKKwkJT25DcmVhdGVkKCk7CisJfQorCisJPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8bGV4ZXJJbnB1dFN0cmVhbVR5cGUoKT4gaW5wdXQ8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+ICkKKwkJOiB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCk8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pCisJeworCX0KKworCTxhY3Rpb25zLihhY3Rpb25TY29wZSkuY3Rvck1vZGlmaWVyOyBudWxsPSJwdWJsaWMiPiA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oPGxleGVySW5wdXRTdHJlYW1UeXBlKCk+IGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KQorCQk6IGJhc2UoaW5wdXQsIHN0YXRlKQorCXsKKzxpZihtZW1vaXplKT4KKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorCQlzdGF0ZS5ydWxlTWVtbyA9IG5ldyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5XDxpbnQsIGludD5bPG51bVJ1bGVzPisxXTs8XG4+PCEgaW5kZXggZnJvbSAxLi5uICE+Cis8ZW5kaWY+Cis8ZW5kaWY+CisJCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKwkJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oaW5wdXQsIHRoaXMuc3RhdGU8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHwsIDxwOmRlbGVnYXRlTmFtZSgpPn0+LCB0aGlzKTt9OyBzZXBhcmF0b3I9IlxuIj4KKwkJPGdyYW1tYXIuZGVsZWdhdG9yczoKKwkJIHtnfHRoaXMuPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorCQk8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfGdQYXJlbnQgPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fT4KKworCQlPbkNyZWF0ZWQoKTsKKwl9CisJcHVibGljIG92ZXJyaWRlIHN0cmluZyBHcmFtbWFyRmlsZU5hbWUgeyBnZXQgeyByZXR1cm4gIjxmaWxlTmFtZT4iOyB9IH0KKworPGlmKGdyYW1tYXIuaGFzRGVsZWdhdGVzKT4KKwlwdWJsaWMgb3ZlcnJpZGUgPGxleGVySW5wdXRTdHJlYW1UeXBlKCk+IENoYXJTdHJlYW0KKwl7CisJCWdldAorCQl7CisJCQlyZXR1cm4gYmFzZS5DaGFyU3RyZWFtOworCQl9CisJCXNldAorCQl7CisJCQliYXNlLkNoYXJTdHJlYW0gPSB2YWx1ZTsKKwkJCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKwkJCSB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBzdGF0ZTx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfCwgPHA6ZGVsZWdhdGVOYW1lKCk+fT4sIHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorCQkJPGdyYW1tYXIuZGVsZWdhdG9yczoKKwkJCSB7Z3x0aGlzLjxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKwkJCTxsYXN0KGdyYW1tYXIuZGVsZWdhdG9ycyk6e2d8Z1BhcmVudCA9IDxnOmRlbGVnYXRlTmFtZSgpPjt9PgorCQl9CisJfQorCis8ZW5kaWY+Cis8aWYoZmlsdGVyTW9kZSk+CisJPGZpbHRlcmluZ05leHRUb2tlbigpPgorPGVuZGlmPgorCisKKwlwYXJ0aWFsIHZvaWQgT25DcmVhdGVkKCk7CisJcGFydGlhbCB2b2lkIEVudGVyUnVsZShzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpOworCXBhcnRpYWwgdm9pZCBMZWF2ZVJ1bGUoc3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KTsKKworCTxydWxlczsgc2VwYXJhdG9yPSJcbiI+CisKKwk8aW5zZXJ0TGV4ZXJTeW5wcmVkcyhzeW5wcmVkcyk+CisKKwkjcmVnaW9uIERGQQorCTxjeWNsaWNERkFzOntkZmEgfCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworCXByb3RlY3RlZCBvdmVycmlkZSB2b2lkIEluaXRERkFzKCkKKwl7CisJCWJhc2UuSW5pdERGQXMoKTsKKwkJPGN5Y2xpY0RGQXM6e2RmYSB8IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gbmV3IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KHRoaXM8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+LCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uPGRmYS5kZWNpc2lvbk51bWJlcj48ZW5kaWY+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKwl9CisKKwk8Y3ljbGljREZBczpjeWNsaWNERkEoKT4gPCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KKwkjZW5kcmVnaW9uCisKK30KKz4+CisKKy8qKiBBIG92ZXJyaWRlIG9mIExleGVyLm5leHRUb2tlbigpIHRoYXQgYmFja3RyYWNrcyBvdmVyIG1Ub2tlbnMoKSBsb29raW5nCisgKiAgZm9yIG1hdGNoZXMuICBObyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkIHVwb24gZXJyb3I7IGp1c3QgcmV3aW5kLCBjb25zdW1lCisgKiAgYSB0b2tlbiBhbmQgdGhlbiB0cnkgYWdhaW4uICBiYWNrdHJhY2tpbmcgbmVlZHMgdG8gYmUgc2V0IGFzIHdlbGwuCisgKiAgTWFrZSBydWxlIG1lbW9pemF0aW9uIGhhcHBlbiBvbmx5IGF0IGxldmVscyBhYm92ZSAxIGFzIHdlIHN0YXJ0IG1Ub2tlbnMKKyAqICBhdCBiYWNrdHJhY2tpbmc9PTEuCisgKi8KK2ZpbHRlcmluZ05leHRUb2tlbigpIDo6PSA8PAorcHVibGljIG92ZXJyaWRlIElUb2tlbiBOZXh0VG9rZW4oKQoreworCXdoaWxlICh0cnVlKQorCXsKKwkJaWYgKGlucHV0LkxBKDEpID09IENoYXJTdHJlYW1Db25zdGFudHMuRW5kT2ZGaWxlKQorCQl7CisJCQlJVG9rZW4gZW9mID0gbmV3IENvbW1vblRva2VuKChJQ2hhclN0cmVhbSlpbnB1dCwgQ2hhclN0cmVhbUNvbnN0YW50cy5FbmRPZkZpbGUsIFRva2VuQ2hhbm5lbHMuRGVmYXVsdCwgaW5wdXQuSW5kZXgsIGlucHV0LkluZGV4KTsKKwkJCWVvZi5MaW5lID0gTGluZTsKKwkJCWVvZi5DaGFyUG9zaXRpb25JbkxpbmUgPSBDaGFyUG9zaXRpb25JbkxpbmU7CisJCQlyZXR1cm4gZW9mOworCQl9CisJCXN0YXRlLnRva2VuID0gbnVsbDsKKwkJc3RhdGUuY2hhbm5lbCA9IFRva2VuQ2hhbm5lbHMuRGVmYXVsdDsKKwkJc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LkluZGV4OworCQlzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gaW5wdXQuQ2hhclBvc2l0aW9uSW5MaW5lOworCQlzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LkxpbmU7CisJCXN0YXRlLnRleHQgPSBudWxsOworCQl0cnkKKwkJeworCQkJaW50IG0gPSBpbnB1dC5NYXJrKCk7CisJCQlzdGF0ZS5iYWNrdHJhY2tpbmc9MTs8ISBtZWFucyB3ZSB3b24ndCB0aHJvdyBzbG93IGV4Y2VwdGlvbiAhPgorCQkJc3RhdGUuZmFpbGVkPWZhbHNlOworCQkJbVRva2VucygpOworCQkJc3RhdGUuYmFja3RyYWNraW5nPTA7CisJCQk8ISBtVG9rZW5zIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorCQkJICAgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAhPgorCQkJaWYgKHN0YXRlLmZhaWxlZCkKKwkJCXsKKwkJCQlpbnB1dC5SZXdpbmQobSk7CisJCQkJaW5wdXQuQ29uc3VtZSgpOzwhIGFkdmFuY2Ugb25lIGNoYXIgYW5kIHRyeSBhZ2FpbiAhPgorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUVtaXQoKTsKKwkJCQlyZXR1cm4gc3RhdGUudG9rZW47CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKQorCQl7CisJCQkvLyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKwkJCVJlcG9ydEVycm9yKHJlKTsKKwkJCVJlY292ZXIocmUpOworCQl9CisJfQorfQorCitwdWJsaWMgb3ZlcnJpZGUgdm9pZCBNZW1vaXplKElJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlSW5kZXgsIGludCBydWxlU3RhcnRJbmRleCkKK3sKKwlpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMSkKKwkJYmFzZS5NZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKK30KKworcHVibGljIG92ZXJyaWRlIGJvb2wgQWxyZWFkeVBhcnNlZFJ1bGUoSUludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCkKK3sKKwlpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMSkKKwkJcmV0dXJuIGJhc2UuQWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9Cis+PgorCithY3Rpb25HYXRlKCkgOjo9ICJzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCIKKworZmlsdGVyaW5nQWN0aW9uR2F0ZSgpIDo6PSAic3RhdGUuYmFja3RyYWNraW5nID09IDEiCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBwYXJzZXIgKi8KK2dlbmVyaWNQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywKKyAgICAgICAgICAgICAgYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLAorICAgICAgICAgICAgICBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgZmlsdGVyTW9kZSwgQVNUTGFiZWxUeXBlPSJvYmplY3QiKSA6Oj0gPDwKK1tTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJBTlRMUiIsICI8QU5UTFJWZXJzaW9uPiIpXQorW1N5c3RlbS5DTFNDb21wbGlhbnQoZmFsc2UpXQorPHBhcnNlck1vZGlmaWVyKGdyYW1tYXI9Z3JhbW1hciwgYWN0aW9ucz1hY3Rpb25zKT4gcGFydGlhbCBjbGFzcyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gOiA8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPgoreworPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisJaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IHN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgc3RyaW5nW10geworCQkiXDxpbnZhbGlkPiIsICJcPEVPUj4iLCAiXDxET1dOPiIsICJcPFVQPiIsIDx0b2tlbk5hbWVzOyBzZXBhcmF0b3I9IiwgIj4KKwl9OworPGVuZGlmPgorCTx0b2tlbnM6e2l0fHB1YmxpYyBjb25zdCBpbnQgPGl0Lm5hbWU7IGZvcm1hdD0iaWQiPj08aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisKKzxpZihncmFtbWFyLmRlbGVnYXRlcyk+CisJLy8gZGVsZWdhdGVzCisJPGdyYW1tYXIuZGVsZWdhdGVzOgorCQkge2d8cHJpdmF0ZSA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuZGVsZWdhdG9ycyk+CisJLy8gZGVsZWdhdG9ycworCTxncmFtbWFyLmRlbGVnYXRvcnM6CisJCSB7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisJPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xwcml2YXRlIDxnLnJlY29nbml6ZXJOYW1lPiBnUGFyZW50O30+Cis8ZW5kaWY+CisKKwk8c2NvcGVzOntpdHw8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZT1pdCk+PGVuZGlmPn0+CisJPEBtZW1iZXJzKCk+CisKKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nW10gVG9rZW5OYW1lcyB7IGdldCB7IHJldHVybiA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnRva2VuTmFtZXM7IH0gfQorCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR3JhbW1hckZpbGVOYW1lIHsgZ2V0IHsgcmV0dXJuICI8ZmlsZU5hbWU+IjsgfSB9CisKKwk8bWVtYmVycz4KKworCXBhcnRpYWwgdm9pZCBPbkNyZWF0ZWQoKTsKKwlwYXJ0aWFsIHZvaWQgRW50ZXJSdWxlKHN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCk7CisJcGFydGlhbCB2b2lkIExlYXZlUnVsZShzdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpOworCisJI3JlZ2lvbiBSdWxlcworCTxydWxlczsgc2VwYXJhdG9yPSJcbiI+CisJI2VuZHJlZ2lvbiBSdWxlcworCis8aWYoZ3JhbW1hci5kZWxlZ2F0ZWRSdWxlcyk+Cis8ISBnZW5lcmF0ZSBydWxlL21ldGhvZCBkZWZpbml0aW9ucyBmb3IgaW1wb3J0ZWQgcnVsZXMgc28gdGhleQorICAgYXBwZWFyIHRvIGJlIGRlZmluZWQgaW4gdGhpcyByZWNvZ25pemVyLiAhPgorCSNyZWdpb24gRGVsZWdhdGVkIHJ1bGVzCis8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8CisJPHJ1bGVNb2RpZmllcihncmFtbWFyPWdyYW1tYXIscnVsZURlc2NyaXB0b3I9cnVsZURlc2NyaXB0b3IpPiA8cmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcik+IDxydWxlRGVzY3JpcHRvci5uYW1lOyBmb3JtYXQ9ImlkIj4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KSA8IXRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiAhPnsgPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT5yZXR1cm4gPGVuZGlmPjxydWxlRGVzY3JpcHRvci5ncmFtbWFyOmRlbGVnYXRlTmFtZSgpPi48cnVsZURlc2NyaXB0b3IubmFtZTsgZm9ybWF0PSJpZCI+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU7IGZvcm1hdD0iaWQiPn07IHNlcGFyYXRvcj0iLCAiPik7IFx9fTsgc2VwYXJhdG9yPSJcbiI+CisJI2VuZHJlZ2lvbiBEZWxlZ2F0ZWQgcnVsZXMKKzxlbmRpZj4KKworCTxpbnNlcnRTeW5wcmVkcyhzeW5wcmVkcyk+CisKKzxpZihjeWNsaWNERkFzKT4KKwkjcmVnaW9uIERGQQorCTxjeWNsaWNERkFzOntkZmEgfCBwcml2YXRlIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+O307IHNlcGFyYXRvcj0iXG4iPgorCisJcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgSW5pdERGQXMoKQorCXsKKwkJYmFzZS5Jbml0REZBcygpOworCQk8Y3ljbGljREZBczp7ZGZhIHwgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBuZXcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4oIHRoaXM8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+LCBTcGVjaWFsU3RhdGVUcmFuc2l0aW9uPGRmYS5kZWNpc2lvbk51bWJlcj48ZW5kaWY+ICk7fTsgc2VwYXJhdG9yPSJcbiI+CisJfQorCisJPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+PCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KKwkjZW5kcmVnaW9uIERGQQorPGVuZGlmPgorCis8aWYoYml0c2V0cyk+CisJI3JlZ2lvbiBGb2xsb3cgc2V0cworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZvbGxvdworCXsKKwkJPGJpdHNldHM6e2l0fDxiaXRzZXQobmFtZT17XzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0sIHdvcmRzNjQ9aXQuYml0cyk+fTsgc2VwYXJhdG9yPSJcbiI+CisJfQorCSNlbmRyZWdpb24gRm9sbG93IHNldHMKKzxlbmRpZj4KK30KKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKzwhIFdBUk5JTkcuIGJ1ZyBpbiBTVDogdGhpcyBpcyBjdXQtbi1wYXN0ZSBpbnRvIERiZy5zdGcgIT4KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuY3Rvck1vZGlmaWVyOyBudWxsPSJwdWJsaWMiPiA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQ8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KQorCTogdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KQoreworfQorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT59PikKKwk6IGJhc2UoaW5wdXQsIHN0YXRlKQoreworCTxwYXJzZXJDdG9yQm9keSgpPgorPGlmKGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzKT4KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisJCXtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oaW5wdXQsIHN0YXRlPHRydW5jKGcuZGVsZWdhdG9ycyk6e3B8LCA8cDpkZWxlZ2F0ZU5hbWUoKT59PiwgdGhpcyk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8ZW5kaWY+Cis8aWYoZ3JhbW1hci5pbmRpcmVjdERlbGVnYXRlcyk+CisJPGdyYW1tYXIuaW5kaXJlY3REZWxlZ2F0ZXM6e2cgfCA8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8Zy5kZWxlZ2F0b3I6ZGVsZWdhdGVOYW1lKCk+LjxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxlbmRpZj4KKzxpZihncmFtbWFyLmRlbGVnYXRvcnMpPgorCTxsYXN0KGdyYW1tYXIuZGVsZWdhdG9ycyk6e2d8Z1BhcmVudCA9IDxnOmRlbGVnYXRlTmFtZSgpPjt9PgorPGVuZGlmPgorCU9uQ3JlYXRlZCgpOworfQorPj4KKworLy8gaW1wb3J0ZWQgZ3JhbW1hcnMgYXJlICdwdWJsaWMnIChjYW4ndCBiZSBpbnRlcm5hbCBiZWNhdXNlIHRoZWlyIHJldHVybiBzY29wZSBjbGFzc2VzIG11c3QgYmUgYWNjZXNzaWJsZSkKK3BhcnNlck1vZGlmaWVyKGdyYW1tYXIsIGFjdGlvbnMpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+PGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tb2RpZmllcjsgbnVsbD0icHVibGljIj48ZWxzZT5wdWJsaWM8ZW5kaWY+Cis+PgorCitwYXJzZXJDdG9yQm9keSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Cit0aGlzLnN0YXRlLnJ1bGVNZW1vID0gbmV3IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlcPGludCwgaW50Pls8bGVuZ3RoKGdyYW1tYXIuYWxsSW1wb3J0ZWRSdWxlcyk+KzFdOzxcbj48ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKzxncmFtbWFyLmRlbGVnYXRvcnM6Cisge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitwYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywKKyAgICAgICBBU1RMYWJlbFR5cGU9Im9iamVjdCIsIHN1cGVyQ2xhc3M9ezxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkuc3VwZXJDbGFzcyk+PGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zdXBlckNsYXNzPjxlbHNlPkFudGxyLlJ1bnRpbWUuUGFyc2VyPGVuZGlmPn0sIGxhYmVsVHlwZT0iSVRva2VuIiwKKyAgICAgICBtZW1iZXJzPXs8YWN0aW9ucy5wYXJzZXIubWVtYmVycz59KSA6Oj0gPDwKKzxnZW5lcmljUGFyc2VyKGlucHV0U3RyZWFtVHlwZT0iSVRva2VuU3RyZWFtIiwgcmV3cml0ZUVsZW1lbnRUeXBlPSJJVG9rZW4iLCBmaWx0ZXJNb2RlPWZhbHNlLCAuLi4pPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHRyZWUgcGFyc2VyOyBzYW1lIGFzIHBhcnNlciBleGNlcHQgdGhlIGlucHV0CisgKiAgc3RyZWFtIGlzIGEgZGlmZmVyZW50IHR5cGUuCisgKi8KK3RyZWVQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIGdsb2JhbEFjdGlvbiwgcnVsZXMsCisgICAgICAgICAgIG51bVJ1bGVzLCBiaXRzZXRzLCBmaWx0ZXJNb2RlLCBsYWJlbFR5cGU9ezxBU1RMYWJlbFR5cGU+fSwgQVNUTGFiZWxUeXBlPSJvYmplY3QiLAorICAgICAgICAgICBzdXBlckNsYXNzPXs8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN1cGVyQ2xhc3MpPjxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3VwZXJDbGFzcz48ZWxzZT5BbnRsci5SdW50aW1lLlRyZWUuPGlmKGZpbHRlck1vZGUpPjxpZihidWlsZEFTVCk+VHJlZVJld3JpdGVyPGVsc2U+VHJlZUZpbHRlcjxlbmRpZj48ZWxzZT5UcmVlUGFyc2VyPGVuZGlmPjxlbmRpZj59LAorICAgICAgICAgICBtZW1iZXJzPXs8YWN0aW9ucy50cmVlcGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IklUcmVlTm9kZVN0cmVhbSIsIHJld3JpdGVFbGVtZW50VHlwZT0iTm9kZSIsIC4uLik+Cis+PgorCisvKiogQSBzaW1wbGVyIHZlcnNpb24gb2YgYSBydWxlIHRlbXBsYXRlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGltYWdpbmFyeQorICogIHJ1bGVzIGNyZWF0ZWQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLiAgQXMgdGhleSBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMKKyAqICBub3IgcGFyYW1ldGVycyBldGMuLi4sIGp1c3QgZ2l2ZSBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbworICogIGFueSBvZiB0aGUgbm9ybWFsIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuCisgKiAgQXMgcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5IG5lZWQgdG8KKyAqICBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAqLworc3lucHJlZFJ1bGUocnVsZU5hbWUsIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgZGVzY3JpcHRpb24sIG5ha2VkQmxvY2spIDo6PQorPDwKKworcGFydGlhbCB2b2lkIEVudGVyUnVsZV88cnVsZU5hbWU+X2ZyYWdtZW50KCk7CitwYXJ0aWFsIHZvaWQgTGVhdmVSdWxlXzxydWxlTmFtZT5fZnJhZ21lbnQoKTsKKworLy8gJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KK3B1YmxpYyA8IWZpbmFsICE+dm9pZCA8cnVsZU5hbWU+X2ZyYWdtZW50KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPikKK3sKKwk8cnVsZUxhYmVsRGVmcyguLi4pPgorCUVudGVyUnVsZV88cnVsZU5hbWU+X2ZyYWdtZW50KCk7CisJRW50ZXJSdWxlKCI8cnVsZU5hbWU+X2ZyYWdtZW50IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJVHJhY2VJbigiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCXRyeQorCXsKKwkJPGJsb2NrPgorCX0KKwlmaW5hbGx5CisJeworCQlUcmFjZU91dCgiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCQlMZWF2ZVJ1bGUoIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKwkJTGVhdmVSdWxlXzxydWxlTmFtZT5fZnJhZ21lbnQoKTsKKwl9Cit9CisvLyAkQU5UTFIgZW5kIDxydWxlTmFtZT4KKz4+CisKK2luc2VydExleGVyU3lucHJlZHMoc3lucHJlZHMpIDo6PSA8PAorPGluc2VydFN5bnByZWRzKHN5bnByZWRzKT4KKz4+CisKK2luc2VydFN5bnByZWRzKHN5bnByZWRzKSA6Oj0gPDwKKzxpZihzeW5wcmVkcyk+CisjcmVnaW9uIFN5bnByZWRzCitwcml2YXRlIGJvb2wgRXZhbHVhdGVQcmVkaWNhdGUoU3lzdGVtLkFjdGlvbiBmcmFnbWVudCkKK3sKKwlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKwlzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKwk8QHN0YXJ0KCk+CisJdHJ5IHsgRGVidWdCZWdpbkJhY2t0cmFjayhzdGF0ZS5iYWNrdHJhY2tpbmcpOworCWludCBzdGFydCA9IGlucHV0Lk1hcmsoKTsKKwl0cnkKKwl7CisJCWZyYWdtZW50KCk7CisJfQorCWNhdGNoICggUmVjb2duaXRpb25FeGNlcHRpb24gcmUgKQorCXsKKwkJU3lzdGVtLkNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJpbXBvc3NpYmxlOiAiK3JlKTsKKwl9CisJc3VjY2VzcyA9ICFzdGF0ZS5mYWlsZWQ7CisJaW5wdXQuUmV3aW5kKHN0YXJ0KTsKKwl9IGZpbmFsbHkgeyBEZWJ1Z0VuZEJhY2t0cmFjayhzdGF0ZS5iYWNrdHJhY2tpbmcsIHN1Y2Nlc3MpOyB9CisJPEBzdG9wKCk+CisJc3RhdGUuYmFja3RyYWNraW5nLS07CisJc3RhdGUuZmFpbGVkPWZhbHNlOworCXJldHVybiBzdWNjZXNzOworfQorI2VuZHJlZ2lvbiBTeW5wcmVkcworPGVuZGlmPgorPj4KKworcnVsZU1lbW9pemF0aW9uKG5hbWUpIDo6PSA8PAorPGlmKG1lbW9pemUpPgoraWYgKHN0YXRlLmJhY2t0cmFja2luZyA+IDAgJiYgQWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pKSB7IDxyZXR1cm5Gcm9tUnVsZSgpPiB9Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIHRlc3QgZm9yIGZhaWx1cmUgYW5kIHJldHVybiBmcm9tIHJ1bGUgKi8KK2NoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmIChzdGF0ZS5mYWlsZWQpIDxyZXR1cm5Gcm9tUnVsZSgpPjxlbmRpZj4KKz4+CisKKy8qKiBUaGlzIHJ1bGUgaGFzIGZhaWxlZCwgZXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgZHVyaW5nIGJhY2t0cmFjayAqLworcnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyA8cmV0dXJuRnJvbVJ1bGUoKT59PGVuZGlmPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhIHJ1bGUuICBUaGlzIGluY2x1ZGVzIGFueSByZXR1cm4gdHlwZQorICogIGRhdGEgYWdncmVnYXRlcyByZXF1aXJlZCBmb3IgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KKyAqLworcnVsZShydWxlTmFtZSxydWxlRGVzY3JpcHRvcixibG9jayxlbXB0eVJ1bGUsZGVzY3JpcHRpb24sZXhjZXB0aW9ucyxmaW5hbGx5LG1lbW9pemUpIDo6PSA8PAorPHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorPHJldHVyblNjb3BlKHJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT4KK3BhcnRpYWwgdm9pZCBFbnRlclJ1bGVfPHJ1bGVOYW1lPigpOworcGFydGlhbCB2b2lkIExlYXZlUnVsZV88cnVsZU5hbWU+KCk7CisKKy8vICRBTlRMUiBzdGFydCAiPHJ1bGVOYW1lPiIKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorW0dyYW1tYXJSdWxlKCI8cnVsZU5hbWU+IildCis8cnVsZU1vZGlmaWVyKGdyYW1tYXI9Z3JhbW1hcixydWxlRGVzY3JpcHRvcj1ydWxlRGVzY3JpcHRvcik+IDxyZXR1cm5UeXBlKHJ1bGVEZXNjcmlwdG9yKT4gPHJ1bGVOYW1lOyBmb3JtYXQ9ImlkIj4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KQoreworCUVudGVyUnVsZV88cnVsZU5hbWU+KCk7CisJRW50ZXJSdWxlKCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJVHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCTxydWxlU2NvcGVTZXRVcCgpPgorCTxydWxlRGVjbGFyYXRpb25zKCk+CisJPHJ1bGVMYWJlbERlZnMoLi4uKT4KKwk8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorCXRyeSB7IERlYnVnRW50ZXJSdWxlKEdyYW1tYXJGaWxlTmFtZSwgIjxydWxlTmFtZT4iKTsKKwlEZWJ1Z0xvY2F0aW9uKDxydWxlRGVzY3JpcHRvci50cmVlLmxpbmU+LCA8cnVsZURlc2NyaXB0b3IuRU9STm9kZS5jaGFyUG9zaXRpb25JbkxpbmU+KTsKKwk8QHByZWFtYmxlKCk+CisJdHJ5CisJeworCQk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCQk8YmxvY2s+CisJCTxydWxlQ2xlYW5VcCgpPgorCQk8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKwl9Cis8aWYoZXhjZXB0aW9ucyk+CisJPGV4Y2VwdGlvbnM6e2V8PGNhdGNoKGRlY2w9ZS5kZWNsLGFjdGlvbj1lLmFjdGlvbik+PFxuPn0+Cis8ZWxzZT4KKzxpZighZW1wdHlSdWxlKT4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoKT4KKwk8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaD4KKzxlbHNlPgorCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkKKwl7CisJCVJlcG9ydEVycm9yKHJlKTsKKwkJUmVjb3ZlcihpbnB1dCxyZSk7CisJPEBzZXRFcnJvclJldHVyblZhbHVlKCk+CisJfQorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorCWZpbmFsbHkKKwl7CisJCVRyYWNlT3V0KCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJCUxlYXZlUnVsZSgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCQlMZWF2ZVJ1bGVfPHJ1bGVOYW1lPigpOworCQk8bWVtb2l6ZSgpPgorCQk8cnVsZVNjb3BlQ2xlYW5VcCgpPgorCQk8ZmluYWxseT4KKwl9CisJRGVidWdMb2NhdGlvbig8cnVsZURlc2NyaXB0b3IuRU9STm9kZS5saW5lPiwgPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUuY2hhclBvc2l0aW9uSW5MaW5lPik7CisJfSBmaW5hbGx5IHsgRGVidWdFeGl0UnVsZShHcmFtbWFyRmlsZU5hbWUsICI8cnVsZU5hbWU+Iik7IH0KKwk8QHBvc3RhbWJsZSgpPgorCTxyZXR1cm5Gcm9tUnVsZSgpPjxcbj4KK30KKy8vICRBTlRMUiBlbmQgIjxydWxlTmFtZT4iCis+PgorCisvLyBpbXBvcnRlZCBncmFtbWFycyBuZWVkIHRvIGhhdmUgaW50ZXJuYWwgcnVsZXMKK3J1bGVNb2RpZmllcihncmFtbWFyLHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPjxjc2hhcnBWaXNpYmlsaXR5TWFwLihydWxlRGVzY3JpcHRvci5tb2RpZmllcik7IG51bGw9InByaXZhdGUiPjxlbHNlPmludGVybmFsPGVuZGlmPgorPj4KKworLy8gaW1wb3J0ZWQgZ3JhbW1hcnMgbmVlZCB0byBoYXZlIHB1YmxpYyByZXR1cm4gc2NvcGVzCityZXR1cm5TY29wZU1vZGlmaWVyKGdyYW1tYXIscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+PGNzaGFycFZpc2liaWxpdHlNYXAuKHJ1bGVEZXNjcmlwdG9yLm1vZGlmaWVyKTsgbnVsbD0icHJpdmF0ZSI+PGVsc2U+cHVibGljPGVuZGlmPgorPj4KKworY2F0Y2goZGVjbCxhY3Rpb24pIDo6PSA8PAorY2F0Y2ggKDxlLmRlY2w+KQoreworCTxlLmFjdGlvbj4KK30KKz4+CisKK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcik+IHJldHZhbCA9IG5ldyA8cmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcik+KDxpZihydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzKT50aGlzPGVuZGlmPik7CityZXR2YWwuU3RhcnQgPSAoPGxhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8Cis8YS50eXBlPiA8YS5uYW1lOyBmb3JtYXQ9ImlkIj4gPSA8aWYoYS5pbml0VmFsdWUpPjxhLmluaXRWYWx1ZT48ZWxzZT48aW5pdFZhbHVlKGEudHlwZSk+PGVuZGlmPjsKK30+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+CitpbnQgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSBpbnB1dC5JbmRleDsKKzxlbmRpZj4KKz4+CisKK3J1bGVTY29wZVNldFVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOntpdHw8aXQ+X3N0YWNrLlB1c2gobmV3IDxpdD5fc2NvcGUodGhpcykpOzxpdD5fc2NvcGVJbml0KDxpdD5fc3RhY2suUGVlaygpKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6e2l0fDxpdC5uYW1lPl9zdGFjay5QdXNoKG5ldyA8aXQubmFtZT5fc2NvcGUodGhpcykpOzxpdC5uYW1lPl9zY29wZUluaXQoPGl0Lm5hbWU+X3N0YWNrLlBlZWsoKSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlU2NvcGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOntpdHw8aXQ+X3Njb3BlQWZ0ZXIoPGl0Pl9zdGFjay5QZWVrKCkpOzxpdD5fc3RhY2suUG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdHw8aXQubmFtZT5fc2NvcGVBZnRlcig8aXQubmFtZT5fc3RhY2suUGVlaygpKTs8aXQubmFtZT5fc3RhY2suUG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlTGFiZWxEZWZzKHJ1bGVEZXNjcmlwdG9yLCBsYWJlbFR5cGUsIEFTVExhYmVsVHlwZSwgcmV3cml0ZUVsZW1lbnRUeXBlKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMscnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXR8PGxhYmVsVHlwZT4gPGl0LmxhYmVsLnRleHQ+ID0gZGVmYXVsdCg8bGFiZWxUeXBlPik7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMKKyAgICA6e2l0fExpc3RcPDxsYWJlbFR5cGU+XD4gbGlzdF88aXQubGFiZWwudGV4dD4gPSBudWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHNdCisgICAgOntpdHxMaXN0XDw8QVNUTGFiZWxUeXBlPlw+IGxpc3RfPGl0LmxhYmVsLnRleHQ+ID0gbnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHM6cnVsZUxhYmVsRGVmKCk7IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzOnJ1bGVMYWJlbERlZigpOyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK2xleGVyUnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzXQorICAgIDp7aXR8PGxhYmVsVHlwZT4gPGl0LmxhYmVsLnRleHQ+ID0gZGVmYXVsdCg8bGFiZWxUeXBlPik7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IuY2hhckxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLmNoYXJMYWJlbHNdCisJOntpdHxpbnQgPGl0LmxhYmVsLnRleHQ+ID0gMDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDp7aXR8TGlzdFw8PGxhYmVsVHlwZT5cPiBsaXN0XzxpdC5sYWJlbC50ZXh0PiA9IG51bGw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci5jaGFyTGlzdExhYmVsczp7aXR8TGlzdFw8aW50XD4gbGlzdF88aXQubGFiZWwudGV4dD4gPSBudWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCityZXR1cm5Gcm9tUnVsZSgpIDo6PSA8JQorcmV0dXJuCis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzwhIFRoaXMgY29tbWVudCBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcKKyAgIHNpbmdsZSBzcGFjZSBhcHBlYXJzIGluIHRoZSBvdXRwdXQuICE+IDxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVybk5hbWU+Cis8ZWxzZT4KKzwhIT4gcmV0dmFsCis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis7CislPgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighVFJFRV9QQVJTRVIpPgorcmV0dmFsLlN0b3AgPSAoPGxhYmVsVHlwZT4paW5wdXQuTFQoLTEpOworPGVuZGlmPgorPGVuZGlmPgorPj4KKworbWVtb2l6ZSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMCkgeyBNZW1vaXplKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCk7IH0KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxydWxlRGVzY3JpcHRvcixibG9jayxtZW1vaXplKSA6Oj0gPDwKKworcGFydGlhbCB2b2lkIEVudGVyUnVsZV88cnVsZU5hbWU+KCk7CitwYXJ0aWFsIHZvaWQgTGVhdmVSdWxlXzxydWxlTmFtZT4oKTsKKworLy8gJEFOVExSIHN0YXJ0ICI8cnVsZU5hbWU+IgorW0dyYW1tYXJSdWxlKCI8cnVsZU5hbWU+IildCis8cnVsZU1vZGlmaWVyKGdyYW1tYXI9Z3JhbW1hcixydWxlRGVzY3JpcHRvcj1ydWxlRGVzY3JpcHRvcik+IHZvaWQgbTxydWxlTmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KQoreworCUVudGVyUnVsZV88cnVsZU5hbWU+KCk7CisJRW50ZXJSdWxlKCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJVHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworCTxydWxlU2NvcGVTZXRVcCgpPgorCTxydWxlRGVjbGFyYXRpb25zKCk+CisJdHJ5CisJeworPGlmKG5ha2VkQmxvY2spPgorCQk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCQk8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisJCTxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisJCTxibG9jaz4KKzxlbHNlPgorCQlpbnQgX3R5cGUgPSA8cnVsZU5hbWU+OworCQlpbnQgX2NoYW5uZWwgPSBEZWZhdWx0VG9rZW5DaGFubmVsOworCQk8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorCQk8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisJCTxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisJCTxibG9jaz4KKwkJPHJ1bGVDbGVhblVwKCk+CisJCXN0YXRlLnR5cGUgPSBfdHlwZTsKKwkJc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworCQk8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKzxlbmRpZj4KKwl9CisJZmluYWxseQorCXsKKwkJVHJhY2VPdXQoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKwkJTGVhdmVSdWxlKCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisJCUxlYXZlUnVsZV88cnVsZU5hbWU+KCk7CisJCTxydWxlU2NvcGVDbGVhblVwKCk+CisJCTxtZW1vaXplKCk+CisJfQorfQorLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorCitwdWJsaWMgb3ZlcnJpZGUgdm9pZCBtVG9rZW5zKCkKK3sKKwk8YmxvY2s+PFxuPgorfQorPj4KKworLy8gUyBVIEIgUiBVIEwgRSBTCisKKy8qKiBBICguLi4pIHN1YnJ1bGUgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK2Jsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cit0cnkgeyBEZWJ1Z0VudGVyU3ViUnVsZSg8ZGVjaXNpb25OdW1iZXI+KTsKK3RyeSB7IERlYnVnRW50ZXJEZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+LCBmYWxzZTwhPGRlY2lzaW9uLmRmYS5oYXNTeW5QcmVkPiE+KTsKKzxkZWNpc2lvbj4KK30gZmluYWxseSB7IERlYnVnRXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pOyB9Cis8QHBvc3RkZWNpc2lvbigpPgorPEBwcmVicmFuY2goKT4KK3N3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikKK3sKKzxhbHRzOnthfDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KK30KK30gZmluYWxseSB7IERlYnVnRXhpdFN1YlJ1bGUoPGRlY2lzaW9uTnVtYmVyPik7IH0KKzxAcG9zdGJyYW5jaCgpPgorPj4KKworLyoqIEEgcnVsZSBibG9jayB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworcnVsZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cit0cnkgeyBEZWJ1Z0VudGVyRGVjaXNpb24oPGRlY2lzaW9uTnVtYmVyPiwgZmFsc2U8ITxkZWNpc2lvbi5kZmEuaGFzU3luUHJlZD4hPik7Cis8ZGVjaXNpb24+Cit9IGZpbmFsbHkgeyBEZWJ1Z0V4aXREZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KTsgfQorPEBwb3N0ZGVjaXNpb24oKT4KK3N3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikKK3sKKzxhbHRzOnthfDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KK30KKz4+CisKK3J1bGVCbG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+CitEZWJ1Z0VudGVyQWx0KDEpOworPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBIHNwZWNpYWwgY2FzZSBvZiBhICguLi4pIHN1YnJ1bGUgd2l0aCBhIHNpbmdsZSBhbHRlcm5hdGl2ZSAqLworYmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorRGVidWdFbnRlckFsdCgxKTsKKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSAoLi4pKyBibG9jayB3aXRoIDEgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraW50IGNudDxkZWNpc2lvbk51bWJlcj49MDsKKzxkZWNscz4KKzxAcHJlbG9vcCgpPgordHJ5IHsgRGVidWdFbnRlclN1YlJ1bGUoPGRlY2lzaW9uTnVtYmVyPik7Cit3aGlsZSAodHJ1ZSkKK3sKKwlpbnQgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKwk8QHByZWRlY2lzaW9uKCk+CisJdHJ5IHsgRGVidWdFbnRlckRlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4sIGZhbHNlPCE8ZGVjaXNpb24uZGZhLmhhc1N5blByZWQ+IT4pOworCTxkZWNpc2lvbj4KKwl9IGZpbmFsbHkgeyBEZWJ1Z0V4aXREZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KTsgfQorCTxAcG9zdGRlY2lzaW9uKCk+CisJc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KQorCXsKKwk8YWx0czp7YXw8YWx0U3dpdGNoQ2FzZShpLGEpPn0+CisJZGVmYXVsdDoKKwkJaWYgKGNudDxkZWNpc2lvbk51bWJlcj4gPj0gMSkKKwkJCWdvdG8gbG9vcDxkZWNpc2lvbk51bWJlcj47CisKKwkJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJCUVhcmx5RXhpdEV4Y2VwdGlvbiBlZWU8ZGVjaXNpb25OdW1iZXI+ID0gbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbiggPGRlY2lzaW9uTnVtYmVyPiwgaW5wdXQgKTsKKwkJRGVidWdSZWNvZ25pdGlvbkV4Y2VwdGlvbihlZWU8ZGVjaXNpb25OdW1iZXI+KTsKKwkJPEBlYXJseUV4aXRFeGNlcHRpb24oKT4KKwkJdGhyb3cgZWVlPGRlY2lzaW9uTnVtYmVyPjsKKwl9CisJY250PGRlY2lzaW9uTnVtYmVyPisrOworfQorbG9vcDxkZWNpc2lvbk51bWJlcj46CisJOworCit9IGZpbmFsbHkgeyBEZWJ1Z0V4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOyB9Cis8QHBvc3Rsb29wKCk+Cis+PgorCitwb3NpdGl2ZUNsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKworLyoqIEEgKC4uKSogYmxvY2sgd2l0aCAxIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitjbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK3RyeSB7IERlYnVnRW50ZXJTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOword2hpbGUgKHRydWUpCit7CisJaW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47CisJPEBwcmVkZWNpc2lvbigpPgorCXRyeSB7IERlYnVnRW50ZXJEZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+LCBmYWxzZTwhPGRlY2lzaW9uLmRmYS5oYXNTeW5QcmVkPiE+KTsKKwk8ZGVjaXNpb24+CisJfSBmaW5hbGx5IHsgRGVidWdFeGl0RGVjaXNpb24oPGRlY2lzaW9uTnVtYmVyPik7IH0KKwk8QHBvc3RkZWNpc2lvbigpPgorCXN3aXRjaCAoIGFsdDxkZWNpc2lvbk51bWJlcj4gKQorCXsKKwk8YWx0czp7YXw8YWx0U3dpdGNoQ2FzZShpLGEpPn0+CisJZGVmYXVsdDoKKwkJZ290byBsb29wPGRlY2lzaW9uTnVtYmVyPjsKKwl9Cit9CisKK2xvb3A8ZGVjaXNpb25OdW1iZXI+OgorCTsKKworfSBmaW5hbGx5IHsgRGVidWdFeGl0U3ViUnVsZSg8ZGVjaXNpb25OdW1iZXI+KTsgfQorPEBwb3N0bG9vcCgpPgorPj4KKworY2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBjbG9zdXJlQmxvY2sKKworLyoqIE9wdGlvbmFsIGJsb2NrcyAoeCk/IGFyZSB0cmFuc2xhdGVkIHRvICh4fCkgYnkgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbgorICogIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJsb2NrIHRlbXBsYXRlCisgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBIGNhc2UgaW4gYSBzd2l0Y2ggdGhhdCBqdW1wcyB0byBhbiBhbHRlcm5hdGl2ZSBnaXZlbiB0aGUgYWx0ZXJuYXRpdmUKKyAqICBudW1iZXIuICBBIERGQSBwcmVkaWN0cyB0aGUgYWx0ZXJuYXRpdmUgYW5kIHRoZW4gYSBzaW1wbGUgc3dpdGNoCisgKiAgZG9lcyB0aGUganVtcCB0byB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IG1hdGNoZXMgdGhhdCBhbHRlcm5hdGl2ZS4KKyAqLworYWx0U3dpdGNoQ2FzZShhbHROdW0sYWx0KSA6Oj0gPDwKK2Nhc2UgPGFsdE51bT46CisJPEBwcmVhbHQoKT4KKwlEZWJ1Z0VudGVyQWx0KDxhbHROdW0+KTsKKwk8YWx0PgorCWJyZWFrOzxcbj4KKz4+CisKKy8qKiBBbiBhbHRlcm5hdGl2ZSBpcyBqdXN0IGEgbGlzdCBvZiBlbGVtZW50czsgYXQgb3V0ZXJtb3N0IGxldmVsICovCithbHQoZWxlbWVudHMsYWx0TnVtLGRlc2NyaXB0aW9uLGF1dG9BU1Qsb3V0ZXJBbHQsdHJlZUxldmVsLHJldykgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKzxAZGVjbGFyYXRpb25zKCk+Cis8ZWxlbWVudHM6ZWxlbWVudCgpPgorPHJldz4KKzxAY2xlYW51cCgpPgorfQorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvLyBFIEwgRSBNIEUgTiBUIFMKKworLyoqIER1bXAgdGhlIGVsZW1lbnRzIG9uZSBwZXIgbGluZSAqLworZWxlbWVudChpdCkgOjo9IDwlCis8QHByZW1hdGNoKCk+CitEZWJ1Z0xvY2F0aW9uKDxpdC5saW5lPiwgPGl0LnBvcz4pOzxcbj4KKzxpdC5lbD48XG4+CislPgorCisvKiogbWF0Y2ggYSB0b2tlbiBvcHRpb25hbGx5IHdpdGggYSBsYWJlbCBpbiBmcm9udCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPjxsYWJlbD49KDxsYWJlbFR5cGU+KTxlbmRpZj5NYXRjaChpbnB1dCw8dG9rZW4+LEZvbGxvdy5fPHRva2VuPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIGlkcys9SUQgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPWxhYmVsLGVsZW1UeXBlPWxhYmVsVHlwZSwuLi4pPgorPj4KKworbGlzdExhYmVsKGxhYmVsLGVsZW0pIDo6PSA8PAorI2Vycm9yIFRoZSBsaXN0TGFiZWwgdGVtcGxhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhpcyB0YXJnZXQuPFxuPgorPj4KKworbGlzdExhYmVsRWxlbShsYWJlbCxlbGVtLGVsZW1UeXBlKSA6Oj0gPDwKK2lmIChsaXN0XzxsYWJlbD49PW51bGwpIGxpc3RfPGxhYmVsPj1uZXcgTGlzdFw8PGVsZW1UeXBlOyBudWxsPXs8bGFiZWxUeXBlPn0+XD4oKTsKK2xpc3RfPGxhYmVsPi5BZGQoPGVsZW0+KTs8XG4+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgKi8KK2NoYXJSZWYoY2hhcixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK01hdGNoKDxjaGFyPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgcmFuZ2UgKi8KK2NoYXJSYW5nZVJlZihhLGIsbGFiZWwpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CitNYXRjaFJhbmdlKDxhPiw8Yj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlPSIiKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bWF0Y2hTZXRMYWJlbCgpPgorPGVuZGlmPgoraWYgKDxzPikKK3sKKwlpbnB1dC5Db25zdW1lKCk7CisJPHBvc3RtYXRjaENvZGU+CisJPGlmKCFMRVhFUik+c3RhdGUuZXJyb3JSZWNvdmVyeT1mYWxzZTs8ZW5kaWY+PGlmKGJhY2t0cmFja2luZyk+c3RhdGUuZmFpbGVkPWZhbHNlOzxlbmRpZj4KK30KK2Vsc2UKK3sKKwk8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwlNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obXNlKTsKKwk8QG1pc21hdGNoZWRTZXRFeGNlcHRpb24oKT4KKzxpZihMRVhFUik+CisJUmVjb3Zlcihtc2UpOworCXRocm93IG1zZTsKKzxlbHNlPgorCXRocm93IG1zZTsKKwk8ISB1c2UgZm9sbG93aW5nIGNvZGUgdG8gbWFrZSBpdCByZWNvdmVyIGlubGluZTsgcmVtb3ZlIHRocm93IG1zZTsKKwlyZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoaW5wdXQsbXNlLEZvbGxvdy5fc2V0X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4Pik7CisJIT4KKzxlbmRpZj4KK308XG4+Cis+PgorCittYXRjaFNldFVuY2hlY2tlZChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlPWZhbHNlKSA6Oj0gPCUKKzxpZihsYWJlbCk+Cis8bWF0Y2hTZXRMYWJlbCgpPjxcbj4KKzxlbmRpZj4KK2lucHV0LkNvbnN1bWUoKTs8XG4+Cis8aWYocG9zdG1hdGNoQ29kZSk+Cis8cG9zdG1hdGNoQ29kZT48XG4+Cis8ZW5kaWY+Cis8aWYoIUxFWEVSKT5zdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOzxlbmRpZj48aWYoYmFja3RyYWNraW5nKT5zdGF0ZS5mYWlsZWQ9ZmFsc2U7PGVuZGlmPgorJT4KKworbWF0Y2hTZXRMYWJlbCgpIDo6PSA8JQorPGlmKExFWEVSKT4KKzxsYWJlbD49IGlucHV0LkxBKDEpOworPGVsc2U+Cis8bGFiZWw+PSg8bGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxlbmRpZj4KKyU+CisKK21hdGNoUnVsZUJsb2NrU2V0IDo6PSBtYXRjaFNldAorCittYXRjaFNldEFuZExpc3RMYWJlbChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHN0cmluZyBsaXRlcmFsICovCitsZXhlclN0cmluZ1JlZihzdHJpbmcsbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPCUKKzxpZihsYWJlbCk+CitpbnQgPGxhYmVsPlN0YXJ0ID0gQ2hhckluZGV4Ozxcbj4KK01hdGNoKDxzdHJpbmc+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+CitpbnQgPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+ID0gTGluZTs8XG4+CitpbnQgPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+ID0gQ2hhclBvc2l0aW9uSW5MaW5lOzxcbj4KKzxsYWJlbD4gPSBuZXcgPGxhYmVsVHlwZT4oaW5wdXQsIFRva2VuVHlwZXMuSW52YWxpZCwgVG9rZW5DaGFubmVscy5EZWZhdWx0LCA8bGFiZWw+U3RhcnQsIENoYXJJbmRleC0xKTs8XG4+Cis8bGFiZWw+LkxpbmUgPSA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD47PFxuPgorPGxhYmVsPi5DaGFyUG9zaXRpb25JbkxpbmUgPSA8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD47Cis8ZWxzZT4KK01hdGNoKDxzdHJpbmc+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+Cis8ZW5kaWY+CislPgorCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+PSg8bGFiZWxUeXBlPilpbnB1dC5MVCgxKTs8XG4+Cis8ZW5kaWY+CitNYXRjaEFueShpbnB1dCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx3aWxkY2FyZCguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT1sYWJlbFR5cGUsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK01hdGNoQW55KCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZENoYXJMaXN0TGFiZWwobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8d2lsZGNhcmRDaGFyKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPWxhYmVsLGVsZW1UeXBlPWxhYmVsVHlwZSwuLi4pPgorPj4KKworLyoqIE1hdGNoIGEgcnVsZSByZWZlcmVuY2UgYnkgaW52b2tpbmcgaXQgcG9zc2libHkgd2l0aCBhcmd1bWVudHMKKyAqICBhbmQgYSByZXR1cm4gdmFsdWUgb3IgdmFsdWVzLiAgVGhlICdydWxlJyBhcmd1bWVudCB3YXMgdGhlCisgKiAgdGFyZ2V0IHJ1bGUgbmFtZSwgYnV0IG5vdyBpcyB0eXBlIFJ1bGUsIHdob3NlIHRvU3RyaW5nIGlzCisgKiAgc2FtZTogdGhlIHJ1bGUgbmFtZS4gIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlCisgKiAgZGVzY3JpcHRvciBzdHVmZi4KKyAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK1B1c2hGb2xsb3coRm9sbG93Ll88cnVsZS5uYW1lPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworPGlmKGxhYmVsKT48bGFiZWw+PTxlbmRpZj48aWYoc2NvcGUpPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4uPGVuZGlmPjxydWxlLm5hbWU7IGZvcm1hdD0iaWQiPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTsKK1BvcEZvbGxvdygpOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPXIgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbEVsZW0oZWxlbT1sYWJlbCxlbGVtVHlwZT17PEFTVExhYmVsVHlwZT59LC4uLik+Cis+PgorCisvKiogQSBsZXhlciBydWxlIHJlZmVyZW5jZS4KKyAqCisgKiAgVGhlICdydWxlJyBhcmd1bWVudCB3YXMgdGhlIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cKKyAqICBpcyB0eXBlIFJ1bGUsIHdob3NlIHRvU3RyaW5nIGlzIHNhbWU6IHRoZSBydWxlIG5hbWUuCisgKiAgTm93IHRob3VnaCB5b3UgY2FuIGFjY2VzcyBmdWxsIHJ1bGUgZGVzY3JpcHRvciBzdHVmZi4KKyAqLworbGV4ZXJSdWxlUmVmKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8JQorPGlmKGxhYmVsKT4KK2ludCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IENoYXJJbmRleDs8XG4+CitpbnQgPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+ID0gTGluZTs8XG4+CitpbnQgPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+ID0gQ2hhclBvc2l0aW9uSW5MaW5lOzxcbj4KKzxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxsYWJlbD4gPSBuZXcgPGxhYmVsVHlwZT4oaW5wdXQsIFRva2VuVHlwZXMuSW52YWxpZCwgVG9rZW5DaGFubmVscy5EZWZhdWx0LCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiwgQ2hhckluZGV4LTEpOzxcbj4KKzxsYWJlbD4uTGluZSA9IDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4Pjs8XG4+Cis8bGFiZWw+LkNoYXJQb3NpdGlvbkluTGluZSA9IDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PjsKKzxlbHNlPgorPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj5tPHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+CislPgorCisvKiogaSs9SU5UIGluIGxleGVyICovCitsZXhlclJ1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSkgOjo9IDw8Cis8bGV4ZXJSdWxlUmVmKC4uLik+Cis8bGlzdExhYmVsRWxlbShlbGVtPWxhYmVsLGVsZW1UeXBlPWxhYmVsVHlwZSwuLi4pPgorPj4KKworLyoqIEVPRiBpbiB0aGUgbGV4ZXIgKi8KK2xleGVyTWF0Y2hFT0YobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPCUKKzxpZihsYWJlbCk+CitpbnQgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4gPSBDaGFySW5kZXg7PFxuPgoraW50IDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PiA9IExpbmU7PFxuPgoraW50IDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PiA9IENoYXJQb3NpdGlvbkluTGluZTs8XG4+CitNYXRjaChFT0YpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxsYWJlbFR5cGU+IDxsYWJlbD4gPSBuZXcgPGxhYmVsVHlwZT4oaW5wdXQsIEVPRiwgVG9rZW5DaGFubmVscy5EZWZhdWx0LCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiwgQ2hhckluZGV4LTEpOzxcbj4KKzxsYWJlbD4uTGluZSA9IDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4Pjs8XG4+Cis8bGFiZWw+LkNoYXJQb3NpdGlvbkluTGluZSA9IDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PjsKKzxlbHNlPgorTWF0Y2goRU9GKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKyU+CisKKy8vIHVzZWQgZm9yIGxlZnQtcmVjdXJzaXZlIHJ1bGVzCityZWNSdWxlRGVmQXJnKCkgICAgICAgICAgICAgICAgICAgICAgIDo6PSAiaW50IDxyZWNSdWxlQXJnKCk+IgorcmVjUnVsZUFyZygpICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIl9wIgorcmVjUnVsZUFsdFByZWRpY2F0ZShydWxlTmFtZSxvcFByZWMpICA6Oj0gIjxyZWNSdWxlQXJnKCk+IFw8PSA8b3BQcmVjPiIKK3JlY1J1bGVTZXRSZXN1bHRBY3Rpb24oKSAgICAgICAgICAgICAgOjo9ICJyb290XzA9JDxydWxlTmFtZT5fcHJpbWFyeS50cmVlOyIKKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8cm9vdDplbGVtZW50KCk+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKGlucHV0LkxBKDEpID09IFRva2VuVHlwZXMuRG93bikKK3sKKwlNYXRjaChpbnB1dCwgVG9rZW5UeXBlcy5Eb3duLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwk8Y2hpbGRyZW46ZWxlbWVudCgpPgorCU1hdGNoKGlucHV0LCBUb2tlblR5cGVzLlVwLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK30KKzxlbHNlPgorTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuRG93biwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8Y2hpbGRyZW46ZWxlbWVudCgpPgorTWF0Y2goaW5wdXQsIFRva2VuVHlwZXMuVXAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIEV2ZXJ5IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdmFsaWRhdGluZyBwcmVkaWNhdGUgKGV2ZW4gd2hlbiBpdCBpcworICogIGFsc28gaG9pc3RlZCBpbnRvIGEgcHJlZGljdGlvbiBleHByZXNzaW9uKS4KKyAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2lmICghKDxldmFsUHJlZGljYXRlKC4uLik+KSkKK3sKKwk8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwl0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+Iik7Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitpbnQgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KK2Vsc2UKK3sKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisJYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47Cis8ZWxzZT4KKwk8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKwlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiwgaW5wdXQpOworCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7CisJPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorCXRocm93IG52YWU7Cis8ZW5kaWY+Cit9Cis+PgorCisvKiogU2FtZSBhcyBhIG5vcm1hbCBERkEgc3RhdGUgZXhjZXB0IHRoYXQgd2UgZG9uJ3QgZXhhbWluZSBsb29rYWhlYWQKKyAqICBmb3IgdGhlIGJ5cGFzcyBhbHRlcm5hdGl2ZS4gIEl0IGRlbGF5cyBlcnJvciBkZXRlY3Rpb24gYnV0IHRoaXMKKyAqICBpcyBmYXN0ZXIsIHNtYWxsZXIsIGFuZCBtb3JlIHdoYXQgcGVvcGxlIGV4cGVjdC4gIEZvciAoWCk/IHBlb3BsZQorICogIGV4cGVjdCAiaWYgKCBMQSgxKT09WCApIG1hdGNoKFgpOyIgYW5kIHRoYXQncyBpdC4KKyAqLworZGZhT3B0aW9uYWxCbG9ja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK2ludCBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LkxBKDxrPik7PFxuPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorPj4KKworLyoqIEEgREZBIHN0YXRlIHRoYXQgaXMgYWN0dWFsbHkgdGhlIGxvb3BiYWNrIGRlY2lzaW9uIG9mIGEgY2xvc3VyZQorICogIGxvb3AuICBJZiBlbmQtb2YtdG9rZW4gKEVPVCkgcHJlZGljdHMgYW55IG9mIHRoZSB0YXJnZXRzIHRoZW4gaXQKKyAqICBzaG91bGQgYWN0IGxpa2UgYSBkZWZhdWx0IGNsYXVzZSAoaS5lLiwgbm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCkuCisgKiAgVGhpcyBpcyB1c2VkIG9ubHkgaW4gdGhlIGxleGVyIHNvIHRoYXQgZm9yICgnYScpKiBvbiB0aGUgZW5kIG9mIGEgcnVsZQorICogIGFueXRoaW5nIG90aGVyIHRoYW4gJ2EnIHByZWRpY3RzIGV4aXRpbmcuCisgKi8KK2RmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAoraW50IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoPGs+KTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KKzxpZighZWRnZXMpPgorYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47PCEgaWYgbm8gZWRnZXMsIGRvbid0IGdlbiBFTFNFICE+Cis8ZWxzZT4KK2Vsc2UKK3sKKwlhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKK308XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogQW4gYWNjZXB0IHN0YXRlIGluZGljYXRlcyBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBoYXMgYmVlbiBwcmVkaWN0ZWQgKi8KK2RmYUFjY2VwdFN0YXRlKGFsdCkgOjo9ICJhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGFsdD47IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICgoPGxhYmVsRXhwcj4pPGlmKHByZWRpY2F0ZXMpPiAmJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pCit7CisJPHRhcmdldFN0YXRlPgorfQorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKHN3aXRjaCBjYXNlKQorCisvKiogQSBERkEgc3RhdGUgd2hlcmUgYSBTV0lUQ0ggbWF5IGJlIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGdlbmVyYXRvcgorICogIGRlY2lkZXMgaWYgdGhpcyBpcyBwb3NzaWJsZTogQ29kZUdlbmVyYXRvci5jYW5HZW5lcmF0ZVN3aXRjaCgpLgorICovCitkZmFTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKGlucHV0LkxBKDxrPikpCit7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorZGVmYXVsdDoKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisJYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworCWJyZWFrOzxcbj4KKzxlbHNlPgorCXsKKwkJPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisJCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjxkZXNjcmlwdGlvbj4iLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCBpbnB1dCk7CisJCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7CisJCTxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKwkJdGhyb3cgbnZhZTsKKwl9Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoaW5wdXQuTEEoPGs+KSkKK3sKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworZGZhTG9vcGJhY2tTdGF0ZVN3aXRjaChrLCBlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoIChpbnB1dC5MQSg8az4pKQoreworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitkZWZhdWx0OgorCWFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKwlicmVhazs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhRWRnZVN3aXRjaChsYWJlbHMsIHRhcmdldFN0YXRlKSA6Oj0gPDwKKzxsYWJlbHM6e2l0fGNhc2UgPGl0Pjp9OyBzZXBhcmF0b3I9IlxuIj4KKwl7CisJPHRhcmdldFN0YXRlPgorCX0KKwlicmVhazsKKz4+CisKKy8vIEMgeSBjIGwgaSBjICBEIEYgQQorCisvKiogVGhlIGNvZGUgdG8gaW5pdGlhdGUgZXhlY3V0aW9uIG9mIGEgY3ljbGljIERGQTsgdGhpcyBpcyB1c2VkCisgKiAgaW4gdGhlIHJ1bGUgdG8gcHJlZGljdCBhbiBhbHQganVzdCBsaWtlIHRoZSBmaXhlZCBERkEgY2FzZS4KKyAqICBUaGUgPG5hbWU+IGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgdmlhIHRoZSBwYXJzZXIsIGxleGVyLCAuLi4KKyAqLworZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAordHJ5Cit7CisJYWx0PGRlY2lzaW9uTnVtYmVyPiA9IGRmYTxkZWNpc2lvbk51bWJlcj4uUHJlZGljdChpbnB1dCk7Cit9CitjYXRjaCAoTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSkKK3sKKwlEZWJ1Z1JlY29nbml0aW9uRXhjZXB0aW9uKG52YWUpOworCXRocm93OworfQorPj4KKworLyogRHVtcCBERkEgdGFibGVzIGFzIHJ1bi1sZW5ndGgtZW5jb2RlZCBTdHJpbmdzIG9mIG9jdGFsIHZhbHVlcy4KKyAqIENhbid0IHVzZSBoZXggYXMgY29tcGlsZXIgdHJhbnNsYXRlcyB0aGVtIGJlZm9yZSBjb21waWxhdGlvbi4KKyAqIFRoZXNlIHN0cmluZ3MgYXJlIHNwbGl0IGludG8gbXVsdGlwbGUsIGNvbmNhdGVuYXRlZCBzdHJpbmdzLgorICogSmF2YSBwdXRzIHRoZW0gYmFjayB0b2dldGhlciBhdCBjb21waWxlIHRpbWUgdGhhbmtmdWxseS4KKyAqIEphdmEgY2Fubm90IGhhbmRsZSBsYXJnZSBzdGF0aWMgYXJyYXlzLCBzbyB3ZSdyZSBzdHVjayB3aXRoIHRoaXMKKyAqIGVuY29kZS9kZWNvZGUgYXBwcm9hY2guICBTZWUgYW5hbHlzaXMgYW5kIHJ1bnRpbWUgREZBIGZvcgorICogdGhlIGVuY29kaW5nIG1ldGhvZHMuCisgKi8KK2N5Y2xpY0RGQShkZmEpIDo6PSA8PAorcHJpdmF0ZSBjbGFzcyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA6IERGQQoreworCXByaXZhdGUgY29uc3Qgc3RyaW5nIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvdFMgPQorCQkiPGRmYS5qYXZhQ29tcHJlc3NlZEVPVDsgd3JhcD0iXCIrXG5cdFx0XCIiPiI7CisJcHJpdmF0ZSBjb25zdCBzdHJpbmcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mUyA9CisJCSI8ZGZhLmphdmFDb21wcmVzc2VkRU9GOyB3cmFwPSJcIitcblx0XHRcIiI+IjsKKwlwcml2YXRlIGNvbnN0IHN0cmluZyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW5TID0KKwkJIjxkZmEuamF2YUNvbXByZXNzZWRNaW47IHdyYXA9IlwiK1xuXHRcdFwiIj4iOworCXByaXZhdGUgY29uc3Qgc3RyaW5nIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFMgPQorCQkiPGRmYS5qYXZhQ29tcHJlc3NlZE1heDsgd3JhcD0iXCIrXG5cdFx0XCIiPiI7CisJcHJpdmF0ZSBjb25zdCBzdHJpbmcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0UyA9CisJCSI8ZGZhLmphdmFDb21wcmVzc2VkQWNjZXB0OyB3cmFwPSJcIitcblx0XHRcIiI+IjsKKwlwcml2YXRlIGNvbnN0IHN0cmluZyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsUyA9CisJCSI8ZGZhLmphdmFDb21wcmVzc2VkU3BlY2lhbDsgd3JhcD0iXCIrXG5cdFx0XCIiPn0+IjsKKwlwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uUyA9CisJCXsKKwkJCTxkZmEuamF2YUNvbXByZXNzZWRUcmFuc2l0aW9uOntzfCI8czsgd3JhcD0iXCIrXG5cIiI+In07IHNlcGFyYXRvcj0iLFxuIj4KKwkJfTsKKworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNob3J0W10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90ID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90Uyk7CisJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2YgPSBERkEuVW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2ZTKTsKKwlwcml2YXRlIHN0YXRpYyByZWFkb25seSBjaGFyW10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluID0gREZBLlVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluUyk7CisJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heCA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFMpOworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNob3J0W10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0ID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0Uyk7CisJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc2hvcnRbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsID0gREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbFMpOworCXByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHNob3J0W11bXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uOworCisJc3RhdGljIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KCkKKwl7CisJCWludCBudW1TdGF0ZXMgPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uUy5MZW5ndGg7CisJCURGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworCQlmb3IgKCBpbnQgaT0wOyBpIFw8IG51bVN0YXRlczsgaSsrICkKKwkJeworCQkJREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbltpXSA9IERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TW2ldKTsKKwkJfQorCX0KKworCXB1YmxpYyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiggQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcjxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4sIFNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb248ZW5kaWY+ICkKKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKwkJOiBiYXNlKHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24pCis8ZW5kaWY+CisJeworCQl0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworCQl0aGlzLmRlY2lzaW9uTnVtYmVyID0gPGRmYS5kZWNpc2lvbk51bWJlcj47CisJCXRoaXMuZW90ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OworCQl0aGlzLmVvZiA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZjsKKwkJdGhpcy5taW4gPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW47CisJCXRoaXMubWF4ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OworCQl0aGlzLmFjY2VwdCA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdDsKKwkJdGhpcy5zcGVjaWFsID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbDsKKwkJdGhpcy50cmFuc2l0aW9uID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbjsKKwl9CisKKwlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIERlc2NyaXB0aW9uIHsgZ2V0IHsgcmV0dXJuICI8ZGZhLmRlc2NyaXB0aW9uPiI7IH0gfQorCisJcHVibGljIG92ZXJyaWRlIHZvaWQgRXJyb3IoTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSkKKwl7CisJCURlYnVnUmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7CisJfQorfTxcbj4KKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KK3ByaXZhdGUgaW50IFNwZWNpYWxTdGF0ZVRyYW5zaXRpb248ZGZhLmRlY2lzaW9uTnVtYmVyPihERkEgZGZhLCBpbnQgcywgSUludFN0cmVhbSBfaW5wdXQpPCEgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIT4KK3sKKwk8aWYoTEVYRVIpPgorCUlJbnRTdHJlYW0gaW5wdXQgPSBfaW5wdXQ7CisJPGVuZGlmPgorCTxpZihQQVJTRVIpPgorCUlUb2tlblN0cmVhbSBpbnB1dCA9IChJVG9rZW5TdHJlYW0pX2lucHV0OworCTxlbmRpZj4KKwk8aWYoVFJFRV9QQVJTRVIpPgorCUlUcmVlTm9kZVN0cmVhbSBpbnB1dCA9IChJVHJlZU5vZGVTdHJlYW0pX2lucHV0OworCTxlbmRpZj4KKwlpbnQgX3MgPSBzOworCXN3aXRjaCAocykKKwl7CisJPGRmYS5zcGVjaWFsU3RhdGVTVHM6e3N0YXRlIHwKKwljYXNlIDxpMD46PCEgY29tcHJlc3NlZCBzcGVjaWFsIHN0YXRlIG51bWJlcnMgMC4ubi0xICE+CisJCTxzdGF0ZT59OyBzZXBhcmF0b3I9IlxuIj4KKwl9Cis8aWYoYmFja3RyYWNraW5nKT4KKwlpZiAoc3RhdGUuYmFja3RyYWNraW5nID4gMCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fQorPGVuZGlmPgorCU5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPSBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZGZhLkRlc2NyaXB0aW9uLCA8ZGZhLmRlY2lzaW9uTnVtYmVyPiwgX3MsIGlucHV0KTsKKwlkZmEuRXJyb3IobnZhZSk7CisJdGhyb3cgbnZhZTsKK30KKzxlbmRpZj4KKz4+CisKKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAoraW50IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoMSk7PFxuPgorPGlmKHNlbVByZWRTdGF0ZSk+Cis8ISBnZXQgbmV4dCBsb29rYWhlYWQgc3ltYm9sIHRvIHRlc3QgZWRnZXMsIHRoZW4gcmV3aW5kICE+Cis8XG4+aW50IGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuSW5kZXg7CitpbnB1dC5SZXdpbmQoKTsKKzxlbmRpZj4KK3MgPSAtMTsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKzxpZihzZW1QcmVkU3RhdGUpPgorPCEgcmV0dXJuIGlucHV0IGN1cnNvciB0byBzdGF0ZSBiZWZvcmUgd2UgcmV3b3VuZCAhPgorPFxuPmlucHV0LlNlZWsoaW5kZXg8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4pOworPGVuZGlmPgoraWYgKHMgPj0gMCkgcmV0dXJuIHM7CiticmVhazsKKz4+CisKKy8qKiBKdXN0IGxpa2UgYSBmaXhlZCBERkEgZWRnZSwgdGVzdCB0aGUgbG9va2FoZWFkIGFuZCBpbmRpY2F0ZSB3aGF0CisgKiAgc3RhdGUgdG8ganVtcCB0byBuZXh0IGlmIHN1Y2Nlc3NmdWwuCisgKi8KK2N5Y2xpY0RGQUVkZ2UobGFiZWxFeHByLCB0YXJnZXRTdGF0ZU51bWJlciwgZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitpZiAoKDxsYWJlbEV4cHI+KTxpZihwcmVkaWNhdGVzKT4gJiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7cyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47fTxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkgY2hhcjsKKyAqICBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICovCitlb3RERkFFZGdlKHRhcmdldFN0YXRlTnVtYmVyLGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPgorPj4KKworCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoPGxlZnQ+JiY8cmlnaHQ+KSIKKworb3JQcmVkaWNhdGVzKG9wZXJhbmRzKSA6Oj0gIig8Zmlyc3Qob3BlcmFuZHMpPjxyZXN0KG9wZXJhbmRzKTp7byB8IHx8PG8+fT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxldmFsUHJlZGljYXRlKC4uLik+KSIKKworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIig8cHJlZD4pIgorCitldmFsU3luUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiRXZhbHVhdGVQcmVkaWNhdGUoPHByZWQ+X2ZyYWdtZW50KSIKKworbG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gIkxBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+PT08YXRvbT4iCisKKy8qKiBTb21ldGltZXMgYSBsb29rYWhlYWQgdGVzdCBjYW5ub3QgYXNzdW1lIHRoYXQgTEEoaykgaXMgaW4gYSB0ZW1wIHZhcmlhYmxlCisgKiAgc29tZXdoZXJlLiAgTXVzdCBhc2sgZm9yIHRoZSBsb29rYWhlYWQgZGlyZWN0bHkuCisgKi8KK2lzb2xhdGVkTG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gImlucHV0LkxBKDxrPik9PTxhdG9tPiIKKworbG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLHVwcGVyLGsscmFuZ2VOdW1iZXIsbG93ZXJBc0ludCx1cHBlckFzSW50KSA6Oj0gPCUKKyhMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPjxnZSgpPjxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj48bGUoKT48dXBwZXI+KQorJT4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSAiKGlucHV0LkxBKDxrPik8Z2UoKT48bG93ZXI+ICYmIGlucHV0LkxBKDxrPik8bGUoKT48dXBwZXI+KSIKKworbGUoKSA6Oj0gIlw8PSIKK2dlKCkgOjo9ICI+PSIKKworc2V0VGVzdChyYW5nZXMpIDo6PSA8PAorPHJhbmdlczsgc2VwYXJhdG9yPSJ8fCI+Cis+PgorCisvLyBBIFQgVCBSIEkgQiBVIFQgRSBTCisKK2F0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK3Byb3RlY3RlZCBzZWFsZWQgcGFydGlhbCBjbGFzcyA8c2NvcGUubmFtZT5fc2NvcGUKK3sKKwk8c2NvcGUuYXR0cmlidXRlczp7aXR8cHVibGljIDxpdC5kZWNsPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworCXB1YmxpYyA8c2NvcGUubmFtZT5fc2NvcGUoPGdyYW1tYXIucmVjb2duaXplck5hbWU+IGdyYW1tYXIpIHsgT25DcmVhdGVkKGdyYW1tYXIpOyB9CisJcGFydGlhbCB2b2lkIE9uQ3JlYXRlZCg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gZ3JhbW1hcik7Cit9Cis8aWYoc2NvcGUuYWN0aW9ucy5zY29wZWluaXQpPgorcHJvdGVjdGVkIHZvaWQgPHNjb3BlLm5hbWU+X3Njb3BlSW5pdCggPHNjb3BlLm5hbWU+X3Njb3BlIHNjb3BlICkKK3sKKwk8c2NvcGUuYWN0aW9ucy5zY29wZWluaXQ+Cit9Cis8ZWxzZT4KK3BhcnRpYWwgdm9pZCA8c2NvcGUubmFtZT5fc2NvcGVJbml0KCA8c2NvcGUubmFtZT5fc2NvcGUgc2NvcGUgKTsKKzxlbmRpZj4KKzxpZihzY29wZS5hY3Rpb25zLnNjb3BlYWZ0ZXIpPgorcHJvdGVjdGVkIHZvaWQgPHNjb3BlLm5hbWU+X3Njb3BlQWZ0ZXIoIDxzY29wZS5uYW1lPl9zY29wZSBzY29wZSApCit7CisJPHNjb3BlLmFjdGlvbnMuc2NvcGVhZnRlcj4KK30KKzxlbHNlPgorcGFydGlhbCB2b2lkIDxzY29wZS5uYW1lPl9zY29wZUFmdGVyKCA8c2NvcGUubmFtZT5fc2NvcGUgc2NvcGUgKTsKKzxlbmRpZj4KK3Byb3RlY3RlZCByZWFkb25seSBMaXN0U3RhY2tcPDxzY29wZS5uYW1lPl9zY29wZVw+IDxzY29wZS5uYW1lPl9zdGFjayA9IG5ldyBMaXN0U3RhY2tcPDxzY29wZS5uYW1lPl9zY29wZVw+KCk7Cis8ZW5kaWY+Cis+PgorCitnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDw8Cis8YXR0cmlidXRlU2NvcGUoLi4uKT4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDw8Cis8YXR0cmlidXRlU2NvcGUoLi4uKT4KKz4+CisKK3JldHVyblN0cnVjdE5hbWUoaXQpIDo6PSAiPGl0Lm5hbWU+X3JldHVybiIKKworcmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlcyAmJiBydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CisJPHJ1bGVEZXNjcmlwdG9yLmdyYW1tYXIucmVjb2duaXplck5hbWU+LjxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+Cis8ZWxzZWlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKwk8cnVsZVJldHVybkJhc2VUeXBlKCk+Cis8ZWxzZWlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKwk8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5UeXBlPgorPGVsc2U+CisJdm9pZAorPGVuZGlmPgorJT4KKworLyoqIEdlbmVyYXRlIHRoZSBDIyB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBvciBtdWx0aXBsZSByZXR1cm4KKyAqICB2YWx1ZXMuCisgKi8KK3J1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGUpIDo6PSA8JQorPGlmKHJlZmVyZW5jZWRSdWxlLnJldHVyblNjb3BlLmF0dHJpYnV0ZXMmJnJlZmVyZW5jZWRSdWxlLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKwk8cmVmZXJlbmNlZFJ1bGUuZ3JhbW1hci5yZWNvZ25pemVyTmFtZT4uPHJlZmVyZW5jZWRSdWxlOnJldHVyblN0cnVjdE5hbWUoKT4KKzxlbHNlaWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorCTxydWxlUmV0dXJuQmFzZVR5cGUoKT4KKzxlbHNlaWYocmVmZXJlbmNlZFJ1bGUuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorCTxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KKwl2b2lkCis8ZW5kaWY+CislPgorCitkZWxlZ2F0ZU5hbWUoaXQpIDo6PSA8PAorPGlmKGl0LmxhYmVsKT48aXQubGFiZWw+PGVsc2U+ZzxpdC5uYW1lPjxlbmRpZj4KKz4+CisKKy8qKiBVc2luZyBhIHR5cGUgdG8gaW5pdCB2YWx1ZSBtYXAsIHRyeSB0byBpbml0IGEgdHlwZTsgaWYgbm90IGluIHRhYmxlCisgKiAgbXVzdCBiZSBhbiBvYmplY3QsIGRlZmF1bHQgdmFsdWUgaXMgIm51bGwiLgorICovCitpbml0VmFsdWUodHlwZU5hbWUpIDo6PSA8PAorZGVmYXVsdCg8dHlwZU5hbWU+KQorPj4KKworLyoqIERlZmluZSBhIHJ1bGUgbGFiZWwgaW5jbHVkaW5nIGRlZmF1bHQgdmFsdWUgKi8KK3J1bGVMYWJlbERlZihsYWJlbCkgOjo9IDwlCis8cnVsZUxhYmVsVHlwZShsYWJlbC5yZWZlcmVuY2VkUnVsZSk+IDxsYWJlbC5sYWJlbC50ZXh0PiA9IDxpbml0VmFsdWUocnVsZUxhYmVsVHlwZShsYWJlbC5yZWZlcmVuY2VkUnVsZSkpPjsKKyU+CisKKy8qKiBEZWZpbmUgYSByZXR1cm4gc3RydWN0IGZvciBhIHJ1bGUgaWYgdGhlIGNvZGUgbmVlZHMgdG8gYWNjZXNzIGl0cworICogIHN0YXJ0L3N0b3AgdG9rZW5zLCB0cmVlIHN0dWZmLCBhdHRyaWJ1dGVzLCAuLi4gIExlYXZlIGEgaG9sZSBmb3IKKyAqICBzdWJncm91cHMgdG8gc3RpY2sgaW4gbWVtYmVycy4KKyAqLworcmV0dXJuU2NvcGUoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMgJiYgcnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJldHVyblNjb3BlTW9kaWZpZXIoZ3JhbW1hcj1ncmFtbWFyLHJ1bGVEZXNjcmlwdG9yPXJ1bGVEZXNjcmlwdG9yKT4gc2VhbGVkIHBhcnRpYWwgY2xhc3MgPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4gOiA8cnVsZVJldHVybkJhc2VUeXBlKCk+PEBydWxlUmV0dXJuSW50ZXJmYWNlcygpPgoreworCTxzY29wZS5hdHRyaWJ1dGVzOntpdHxwdWJsaWMgPGl0LmRlY2w+O307IHNlcGFyYXRvcj0iXG4iPgorCTxAcnVsZVJldHVybk1lbWJlcnMoKT4KK30KKzxlbmRpZj4KKz4+CisKK3J1bGVSZXR1cm5CYXNlVHlwZSgpIDo6PSA8JQorPGlmKFRSRUVfUEFSU0VSKT5UcmVlPGVsc2U+UGFyc2VyPGVuZGlmPlJ1bGVSZXR1cm5TY29wZVw8PGxhYmVsVHlwZT4+CislPgorCitAcmV0dXJuU2NvcGUucnVsZVJldHVybk1lbWJlcnMoKSA6Oj0gPDwKK3B1YmxpYyA8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPig8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gZ3JhbW1hcikge09uQ3JlYXRlZChncmFtbWFyKTt9CitwYXJ0aWFsIHZvaWQgT25DcmVhdGVkKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiBncmFtbWFyKTsKKz4+CisKK3BhcmFtZXRlclNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxzY29wZS5hdHRyaWJ1dGVzOntpdHw8aXQuZGVjbD59OyBzZXBhcmF0b3I9IiwgIj4KKz4+CisKK3BhcmFtZXRlckF0dHJpYnV0ZVJlZihhdHRyKSA6Oj0gPDwKKzxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPgorPj4KKworcGFyYW1ldGVyU2V0QXR0cmlidXRlUmVmKGF0dHIsZXhwcikgOjo9IDw8Cis8YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4gPTxleHByPjsKKz4+CisKK3Njb3BlQXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8JQorPGlmKG5lZ0luZGV4KT4KKzxzY29wZT5fc3RhY2tbPHNjb3BlPl9zdGFjay5Db3VudCAtIDxuZWdJbmRleD4gLSAxXS48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4KKzxlbHNlPgorPGlmKGluZGV4KT4KKzxzY29wZT5fc3RhY2tbPGluZGV4Pl0uPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+Cis8ZWxzZT4KKzxzY29wZT5fc3RhY2suUGVlaygpLjxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPgorPGVuZGlmPgorPGVuZGlmPgorJT4KKworc2NvcGVTZXRBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixleHByLGluZGV4LG5lZ0luZGV4KSA6Oj0gPCUKKzxpZihuZWdJbmRleCk+Cis8c2NvcGU+X3N0YWNrWzxzY29wZT5fc3RhY2suQ291bnQgLSA8bmVnSW5kZXg+IC0gMV0uPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+ID0gPGV4cHI+OworPGVsc2U+Cis8aWYoaW5kZXgpPgorPHNjb3BlPl9zdGFja1s8aW5kZXg+XS48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4gPSA8ZXhwcj47Cis8ZWxzZT4KKzxzY29wZT5fc3RhY2suUGVlaygpLjxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPiA9IDxleHByPjsKKzxlbmRpZj4KKzxlbmRpZj4KKyU+CisKKy8qKiAkeCBpcyBlaXRoZXIgZ2xvYmFsIHNjb3BlIG9yIHggaXMgcnVsZSB3aXRoIGR5bmFtaWMgc2NvcGU7IHJlZmVycworICogIHRvIHN0YWNrIGl0c2VsZiBub3QgdG9wIG9mIHN0YWNrLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByZWRpY2F0ZXMKKyAqICBsaWtlIHskZnVuY3Rpb24uQ291bnQ+MCAmJiAkZnVuY3Rpb246Om5hbWUuRXF1YWxzKCJmb28iKX0/CisgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gIjxzY29wZT5fc3RhY2siCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorKDxzY29wZT4hPW51bGw/PHNjb3BlPi48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj46PGluaXRWYWx1ZShhdHRyLnR5cGUpPikKKzxlbHNlPgorPHNjb3BlPgorPGVuZGlmPgorJT4KKworcmV0dXJuQXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIpIDo6PSA8JQorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC48YXR0ci5uYW1lOyBmb3JtYXQ9ImlkIj4KKzxlbHNlPgorPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+Cis8ZW5kaWY+CislPgorCityZXR1cm5TZXRBdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cixleHByKSA6Oj0gPCUKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CityZXR2YWwuPGF0dHIubmFtZTsgZm9ybWF0PSJpZCI+ID08ZXhwcj47Cis8ZWxzZT4KKzxhdHRyLm5hbWU7IGZvcm1hdD0iaWQiPiA9PGV4cHI+OworPGVuZGlmPgorJT4KKworLyoqIEhvdyB0byB0cmFuc2xhdGUgJHRva2VuTGFiZWwgKi8KK3Rva2VuTGFiZWxSZWYobGFiZWwpIDo6PSAiPGxhYmVsPiIKKworLyoqIGlkcys9SUQgeyRpZHN9IG9yIGUrPWV4cHIgeyRlfSAqLworbGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gImxpc3RfPGxhYmVsPiIKKworCisvLyBub3Qgc3VyZSB0aGUgbmV4dCBhcmUgdGhlIHJpZ2h0IGFwcHJvYWNoCisKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5UZXh0Om51bGwpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LlR5cGU6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4uTGluZTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LkNoYXJQb3NpdGlvbkluTGluZTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5DaGFubmVsOjApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5Ub2tlbkluZGV4OjApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+X3RyZWUiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/aW50LlBhcnNlKDxzY29wZT4uVGV4dCk6MCkiCisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/KCg8bGFiZWxUeXBlPik8c2NvcGU+LlN0YXJ0KTpkZWZhdWx0KDxsYWJlbFR5cGU+KSkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/KCg8bGFiZWxUeXBlPik8c2NvcGU+LlN0b3ApOmRlZmF1bHQoPGxhYmVsVHlwZT4pKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD8oKDxBU1RMYWJlbFR5cGU+KTxzY29wZT4uVHJlZSk6ZGVmYXVsdCg8QVNUTGFiZWxUeXBlPikpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPCUKKzxpZihUUkVFX1BBUlNFUik+CisoPHNjb3BlPiE9bnVsbD8oaW5wdXQuVG9rZW5TdHJlYW0uVG9TdHJpbmcoCisgIGlucHV0LlRyZWVBZGFwdG9yLkdldFRva2VuU3RhcnRJbmRleCg8c2NvcGU+LlN0YXJ0KSwKKyAgaW5wdXQuVHJlZUFkYXB0b3IuR2V0VG9rZW5TdG9wSW5kZXgoPHNjb3BlPi5TdGFydCkpKTpudWxsKQorPGVsc2U+CisoPHNjb3BlPiE9bnVsbD9pbnB1dC5Ub1N0cmluZyg8c2NvcGU+LlN0YXJ0LDxzY29wZT4uU3RvcCk6bnVsbCkKKzxlbmRpZj4KKyU+CisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5UZW1wbGF0ZTpudWxsKSIKKworLyoqIElzb2xhdGVkICRSVUxFIHJlZiBvayBpbiBsZXhlciBhcyBpdCdzIGEgVG9rZW4gKi8KK2xleGVyUnVsZUxhYmVsKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5UeXBlOjApIgorCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uTGluZTowKSIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uQ2hhclBvc2l0aW9uSW5MaW5lOi0xKSIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LkNoYW5uZWw6MCkiCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uVG9rZW5JbmRleDowKSIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LlRleHQ6bnVsbCkiCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD9pbnQuUGFyc2UoPHNjb3BlPi5UZXh0KTowKSIKKworLy8gU29tZWJvZHkgbWF5IHJlZiAkdGVtcGxhdGUgb3IgJHRyZWUgb3IgJHN0b3Agd2l0aGluIGEgcnVsZToKK3J1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5TdGFydCIKK3J1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLlN0b3AiCitydWxlUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5UcmVlIgorcnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDwlCis8aWYoVFJFRV9QQVJTRVIpPgoraW5wdXQuVG9rZW5TdHJlYW0uVG9TdHJpbmcoCisgIGlucHV0LlRyZWVBZGFwdG9yLkdldFRva2VuU3RhcnRJbmRleChyZXR2YWwuU3RhcnQpLAorICBpbnB1dC5UcmVlQWRhcHRvci5HZXRUb2tlblN0b3BJbmRleChyZXR2YWwuU3RhcnQpKQorPGVsc2U+CitpbnB1dC5Ub1N0cmluZyhyZXR2YWwuU3RhcnQsaW5wdXQuTFQoLTEpKQorPGVuZGlmPgorJT4KK3J1bGVQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5UZW1wbGF0ZSIKKworbGV4ZXJSdWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIlRleHQiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiX3R5cGUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAic3RhdGUudG9rZW5TdGFydExpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICItMSIgLy8gdW5kZWZpbmVkIHRva2VuIGluZGV4IGluIGxleGVyCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiX2NoYW5uZWwiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXgiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKENoYXJJbmRleC0xKSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gImludC5QYXJzZSg8c2NvcGU+LlRleHQpIgorCisvLyBzZXR0aW5nICRzdCBhbmQgJHRyZWUgaXMgYWxsb3dlZCBpbiBsb2NhbCBydWxlLiBldmVyeXRoaW5nIGVsc2UKKy8vIGlzIGZsYWdnZWQgYXMgZXJyb3IKK3J1bGVTZXRQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwuVHJlZSA9IDxleHByPjsiCitydWxlU2V0UHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cixleHByKSA6Oj0gInJldHZhbC5UZW1wbGF0ZSA9PGV4cHI+OyIKKworLyoqIEhvdyB0byBleGVjdXRlIGFuIGFjdGlvbiAob25seSB3aGVuIG5vdCBiYWNrdHJhY2tpbmcpICovCitleGVjQWN0aW9uKGFjdGlvbikgOjo9IDwlCis8aWYoYmFja3RyYWNraW5nKT4KK2lmICg8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPik8XG4+Cit7PFxuPgorPEBpbmRlbnRlZEFjdGlvbigpPjxcbj4KK30KKzxlbHNlPgorPGFjdGlvbj4KKzxlbmRpZj4KKyU+CisKK0BleGVjQWN0aW9uLmluZGVudGVkQWN0aW9uKCkgOjo9IDw8CisJPGFjdGlvbj4KKz4+CisKKy8qKiBIb3cgdG8gYWx3YXlzIGV4ZWN1dGUgYW4gYWN0aW9uIGV2ZW4gd2hlbiBiYWNrdHJhY2tpbmcgKi8KK2V4ZWNGb3JjZWRBY3Rpb24oYWN0aW9uKSA6Oj0gIjxhY3Rpb24+IgorCisvLyBNIEkgUyBDIChwcm9wZXJ0aWVzLCBldGMuLi4pCisKK2JpdHNldChuYW1lLCB3b3JkczY0KSA6Oj0gPDwKK3B1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQml0U2V0IDxuYW1lPiA9IG5ldyBCaXRTZXQobmV3IHVsb25nW117PHdvcmRzNjQ6e2l0fDxpdD5VTH07c2VwYXJhdG9yPSIsIj59KTsKKz4+CisKK2NvZGVGaWxlRXh0ZW5zaW9uKCkgOjo9ICIuY3MiCisKK3RydWVfdmFsdWUoKSA6Oj0gInRydWUiCitmYWxzZV92YWx1ZSgpIDo6PSAiZmFsc2UiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvRGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9EYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDFhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0NTaGFycDMvRGJnLnN0ZwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA4IFRlcmVuY2UgUGFycgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb252ZXJzaW9uIHRvIEMjOgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworLyoqIFRlbXBsYXRlIG92ZXJyaWRlcyB0byBhZGQgZGVidWdnaW5nIHRvIG5vcm1hbCBKYXZhIG91dHB1dDsKKyAqICBJZiBBU1RzIGFyZSBidWlsdCwgdGhlbiB5b3UnbGwgYWxzbyBnZXQgQVNURGJnLnN0ZyBsb2FkZWQuCisgKi8KKworQG91dHB1dEZpbGUuaW1wb3J0cygpIDo6PSA8PAorPEBzdXBlci5pbXBvcnRzKCk+Cit1c2luZyBBbnRsci5SdW50aW1lLkRlYnVnOwordXNpbmcgSU9FeGNlcHRpb24gPSBTeXN0ZW0uSU8uSU9FeGNlcHRpb247Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KK3B1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gcnVsZU5hbWVzID0KKwluZXcgc3RyaW5nW10KKwl7CisJCSJpbnZhbGlkUnVsZSIsIDxncmFtbWFyLmFsbEltcG9ydGVkUnVsZXM6e3JTVCB8ICI8clNULm5hbWU+In07IHdyYXA9IlxuCSIsIHNlcGFyYXRvcj0iLCAiPgorCX07PFxuPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+PCEgZ3JhbW1hciBpbXBvcnRzIG90aGVyIGdyYW1tYXIocykgIT4KKwlpbnQgcnVsZUxldmVsID0gMDsKKwlwdWJsaWMgdmlydHVhbCBpbnQgUnVsZUxldmVsIHsgZ2V0IHsgcmV0dXJuIHJ1bGVMZXZlbDsgfSB9CisJcHVibGljIHZpcnR1YWwgdm9pZCBJbmNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbCsrOyB9CisJcHVibGljIHZpcnR1YWwgdm9pZCBEZWNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbC0tOyB9Cis8aWYocHJvZmlsZSk+CisJPGN0b3JGb3JQcm9maWxpbmdSb290R3JhbW1hcigpPgorPGVsc2U+CisJPGN0b3JGb3JSb290R3JhbW1hcigpPgorPGVuZGlmPgorPGN0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIoKT4KKzxlbHNlPjwhIGltcG9ydGVkIGdyYW1tYXIgIT4KKwlwdWJsaWMgaW50IFJ1bGVMZXZlbCB7IGdldCB7IHJldHVybiA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pi5SdWxlTGV2ZWw7IH0gfQorCXB1YmxpYyB2b2lkIEluY1J1bGVMZXZlbCgpIHsgPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wgPGc6ZGVsZWdhdGVOYW1lKCk+fT4uSW5jUnVsZUxldmVsKCk7IH0KKwlwdWJsaWMgdm9pZCBEZWNSdWxlTGV2ZWwoKSB7IDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LkRlY1J1bGVMZXZlbCgpOyB9CisJPGN0b3JGb3JEZWxlZ2F0ZUdyYW1tYXIoKT4KKzxlbmRpZj4KKzxpZihwcm9maWxlKT4KK3B1YmxpYyBvdmVycmlkZSBib29sIEFscmVhZHlQYXJzZWRSdWxlKCBJSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4ICkKK3sKKwlpbnQgc3RvcEluZGV4ID0gR2V0UnVsZU1lbW9pemF0aW9uKHJ1bGVJbmRleCwgaW5wdXQuSW5kZXgpOworCSgoUHJvZmlsZXIpZGJnKS5FeGFtaW5lUnVsZU1lbW9pemF0aW9uKGlucHV0LCBydWxlSW5kZXgsIHN0b3BJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisJcmV0dXJuIGJhc2UuQWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCk7Cit9PFxuPgorcHVibGljIG92ZXJyaWRlIHZvaWQgTWVtb2l6ZSggSUludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCwgaW50IHJ1bGVTdGFydEluZGV4ICkKK3sKKwkoKFByb2ZpbGVyKWRiZykuTWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisJYmFzZS5NZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKK308XG4+Cis8ZW5kaWY+Citwcm90ZWN0ZWQgdmlydHVhbCBib29sIEV2YWxQcmVkaWNhdGUoIGJvb2wgcmVzdWx0LCBzdHJpbmcgcHJlZGljYXRlICkKK3sKKwlkYmcuU2VtYW50aWNQcmVkaWNhdGUoIHJlc3VsdCwgcHJlZGljYXRlICk7CisJcmV0dXJuIHJlc3VsdDsKK308XG4+Cis+PgorCitjdG9yRm9yUm9vdEdyYW1tYXIoKSA6Oj0gPDwKKzwhIGJ1ZzogY2FuJ3QgdXNlIDxAc3VwZXIubWVtYmVycygpPiBjdXQtbi1wYXN0ZSBpbnN0ZWFkICE+Cis8ISBTYW1lIGV4Y2VwdCB3ZSBhZGQgcG9ydCBudW1iZXIgYW5kIHByb2ZpbGUgc3R1ZmYgaWYgcm9vdCBncmFtbWFyICE+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPG5hbWU+KCA8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCApCisJOiB0aGlzKCBpbnB1dCwgRGVidWdFdmVudFNvY2tldFByb3h5LkRlZmF1bHREZWJ1Z2dlclBvcnQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSApCit7Cit9Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmN0b3JNb2RpZmllcjsgbnVsbD0icHVibGljIj4gPG5hbWU+KCA8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgaW50IHBvcnQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSApCisJOiBiYXNlKCBpbnB1dCwgc3RhdGUgKQoreworCTxwYXJzZXJDdG9yQm9keSgpPgorCTxjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpPgorCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KCBpbnB1dCwgZGJnLCB0aGlzLnN0YXRlLCB0aGlzPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+ICk7fTsgc2VwYXJhdG9yPSJcbiI+CisJPEBmaW5hbGx5KCk+Cit9PFxuPgorPj4KKworY3RvckZvclByb2ZpbGluZ1Jvb3RHcmFtbWFyKCkgOjo9IDw8Cis8ISBidWc6IGNhbid0IHVzZSA8QHN1cGVyLm1lbWJlcnMoKT4gY3V0LW4tcGFzdGUgaW5zdGVhZCAhPgorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxuYW1lPiggPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQgKQorCTogdGhpcyggaW5wdXQsIG5ldyBQcm9maWxlcihudWxsKSwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpICkKK3sKK30KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuY3Rvck1vZGlmaWVyOyBudWxsPSJwdWJsaWMiPiA8bmFtZT4oIDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0LCBJRGVidWdFdmVudExpc3RlbmVyIGRiZywgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlICkKKwk6IGJhc2UoIGlucHV0LCBkYmcsIHN0YXRlICkKK3sKKwlQcm9maWxlciBwID0gKFByb2ZpbGVyKWRiZzsKKwlwLnNldFBhcnNlcih0aGlzKTsKKwk8cGFyc2VyQ3RvckJvZHkoKT4KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oIGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4gKTt9OyBzZXBhcmF0b3I9IlxuIj4KKwk8QGZpbmFsbHkoKT4KK30KKzxcbj4KKz4+CisKKy8qKiBCYXNpY2FsbHkgd2UgZG9uJ3Qgd2FudCB0byBzZXQgYW55IGRiZyBsaXN0ZW5lcnMgYXJlIHJvb3Qgd2lsbCBoYXZlIGl0LiAqLworY3RvckZvckRlbGVnYXRlR3JhbW1hcigpIDo6PSA8PAorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxuYW1lPiggPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+ICkKKwk6IGJhc2UoIGlucHV0LCBkYmcsIHN0YXRlICkKK3sKKwk8cGFyc2VyQ3RvckJvZHkoKT4KKwk8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisJIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oIGlucHV0LCB0aGlzLCB0aGlzLnN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+ICk7fTsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworY3RvckZvclByZWRlZmluZWRMaXN0ZW5lcigpIDo6PSA8PAorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5jdG9yTW9kaWZpZXI7IG51bGw9InB1YmxpYyI+IDxuYW1lPiggPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIElEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnICkKKwk8QHN1cGVyQ2xhc3NSZWY+OiBiYXNlKCBpbnB1dCwgZGJnLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkgKTxAZW5kPgoreworPGlmKHByb2ZpbGUpPgorCVByb2ZpbGVyIHAgPSAoUHJvZmlsZXIpZGJnOworCXAuc2V0UGFyc2VyKHRoaXMpOworPGVuZGlmPgorCTxwYXJzZXJDdG9yQm9keSgpPgorCTxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorCTxAZmluYWxseSgpPgorfTxcbj4KKz4+CisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0gbmV3IERlYnVnRXZlbnRTb2NrZXRQcm94eSggdGhpcywgcG9ydCwgaW5wdXQuVHJlZUFkYXB0b3IgKTs8XG4+Cis8ZWxzZT4KK0RlYnVnRXZlbnRTb2NrZXRQcm94eSBwcm94eSA9IG5ldyBEZWJ1Z0V2ZW50U29ja2V0UHJveHkoIHRoaXMsIHBvcnQsIG51bGwgKTs8XG4+Cis8ZW5kaWY+CitEZWJ1Z0xpc3RlbmVyID0gcHJveHk7Cit0cnkKK3sKKwlwcm94eS5IYW5kc2hha2UoKTsKK30KK2NhdGNoICggSU9FeGNlcHRpb24gaW9lICkKK3sKKwlSZXBvcnRFcnJvciggaW9lICk7Cit9Cis+PgorCitAZ2VuZXJpY1BhcnNlci5zdXBlckNsYXNzTmFtZSgpIDo6PSAiRGVidWc8QHN1cGVyLnN1cGVyQ2xhc3NOYW1lKCk+IgorCisvKgorICogTXVjaCBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzIHdlcmUgbWVyZ2VkIGludG8gQ1NoYXJwMy5zdGcuCisgKi8KKworQHJ1bGUucHJlYW1ibGUoKSA6Oj0gPDwKK2lmIChSdWxlTGV2ZWwgPT0gMCkKKwlEZWJ1Z0xpc3RlbmVyLkNvbW1lbmNlKCk7CitJbmNSdWxlTGV2ZWwoKTsKKz4+CisvL0BydWxlLnByZWFtYmxlKCkgOjo9IDw8CisvL3RyeQorLy97CisvLwlkYmcuRW50ZXJSdWxlKCBHcmFtbWFyRmlsZU5hbWUsICI8cnVsZU5hbWU+IiApOworLy8JaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisvLwl7CisvLwkJZGJnLkNvbW1lbmNlKCk7CisvLwl9CisvLwlJbmNSdWxlTGV2ZWwoKTsKKy8vCWRiZy5Mb2NhdGlvbiggPHJ1bGVEZXNjcmlwdG9yLnRyZWUubGluZT4sIDxydWxlRGVzY3JpcHRvci50cmVlLmNoYXJQb3NpdGlvbkluTGluZT4gKTs8XG4+CisvLz4+CisKK0BydWxlLnBvc3RhbWJsZSgpIDo6PSA8PAorRGVjUnVsZUxldmVsKCk7CitpZiAoUnVsZUxldmVsID09IDApCisJRGVidWdMaXN0ZW5lci5UZXJtaW5hdGUoKTsKKz4+CisvL0BydWxlLnBvc3RhbWJsZSgpIDo6PSA8PAorLy9kYmcuTG9jYXRpb24oPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUubGluZT4sIDxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmNoYXJQb3NpdGlvbkluTGluZT4pOzxcbj4KKy8vfQorLy9maW5hbGx5CisvL3sKKy8vCWRiZy5FeGl0UnVsZSggR3JhbW1hckZpbGVOYW1lLCAiPHJ1bGVOYW1lPiIgKTsKKy8vCURlY1J1bGVMZXZlbCgpOworLy8JaWYgKCBSdWxlTGV2ZWwgPT0gMCApCisvLwl7CisvLwkJZGJnLlRlcm1pbmF0ZSgpOworLy8JfQorLy99PFxuPgorLy8+PgorCisvL0BpbnNlcnRTeW5wcmVkcy5zdGFydCgpIDo6PSAiZGJnLkJlZ2luQmFja3RyYWNrKCBzdGF0ZS5iYWNrdHJhY2tpbmcgKTsiCisvL0BpbnNlcnRTeW5wcmVkcy5zdG9wKCkgOjo9ICJkYmcuRW5kQmFja3RyYWNrKCBzdGF0ZS5iYWNrdHJhY2tpbmcsIHN1Y2Nlc3MgKTsiCisKKy8vIENvbW1vbiBkZWJ1ZyBldmVudCB0cmlnZ2VycyB1c2VkIGJ5IHJlZ2lvbiBvdmVycmlkZXMgYmVsb3cKKworLy9lbnRlclN1YlJ1bGUoKSA6Oj0gPDwKKy8vdHJ5CisvL3sKKy8vCWRiZy5FbnRlclN1YlJ1bGUoIDxkZWNpc2lvbk51bWJlcj4gKTs8XG4+CisvLz4+CisKKy8vZXhpdFN1YlJ1bGUoKSA6Oj0gPDwKKy8vfQorLy9maW5hbGx5CisvL3sKKy8vCWRiZy5FeGl0U3ViUnVsZSggPGRlY2lzaW9uTnVtYmVyPiApOworLy99PFxuPgorLy8+PgorCisvL2VudGVyRGVjaXNpb24oKSA6Oj0gPDwKKy8vdHJ5CisvL3sKKy8vCWRiZy5FbnRlckRlY2lzaW9uKCA8ZGVjaXNpb25OdW1iZXI+ICk7PFxuPgorLy8+PgorCisvL2V4aXREZWNpc2lvbigpIDo6PSA8PAorLy99CisvL2ZpbmFsbHkKKy8veworLy8JZGJnLkV4aXREZWNpc2lvbiggPGRlY2lzaW9uTnVtYmVyPiApOworLy99PFxuPgorLy8+PgorCisvL2VudGVyQWx0KG4pIDo6PSAiZGJnLkVudGVyQWx0KCA8bj4gKTs8XG4+IgorCisvLyBSZWdpb24gb3ZlcnJpZGVzIHRoYXQgdGVsbCB2YXJpb3VzIGNvbnN0cnVjdHMgdG8gYWRkIGRlYnVnZ2luZyB0cmlnZ2VycworCisvL0BibG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyU3ViUnVsZSgpPjxlbnRlckRlY2lzaW9uKCk+IgorCisvL0BibG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKKy8vQGJsb2NrLnBvc3RicmFuY2goKSA6Oj0gIjxleGl0U3ViUnVsZSgpPiIKKworLy9AcnVsZUJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJEZWNpc2lvbigpPiIKKworLy9AcnVsZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworLy9AcnVsZUJsb2NrU2luZ2xlQWx0LnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49XCIxXCIpPiIKKworLy9AYmxvY2tTaW5nbGVBbHQucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQobj1cIjFcIik+IgorCisvL0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wcmVsb29wKCkgOjo9ICI8ZW50ZXJTdWJSdWxlKCk+IgorCisvL0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCisvL0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyRGVjaXNpb24oKT4iCisKKy8vQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworLy9AcG9zaXRpdmVDbG9zdXJlQmxvY2suZWFybHlFeGl0RXhjZXB0aW9uKCkgOjo9CisvLwkiZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBlZWU8ZGVjaXNpb25OdW1iZXI+ICk7PFxuPiIKKworLy9AY2xvc3VyZUJsb2NrLnByZWxvb3AoKSA6Oj0gIjxlbnRlclN1YlJ1bGUoKT4iCisKKy8vQGNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCisvL0BjbG9zdXJlQmxvY2sucHJlZGVjaXNpb24oKSA6Oj0gIjxlbnRlckRlY2lzaW9uKCk+IgorCisvL0BjbG9zdXJlQmxvY2sucG9zdGRlY2lzaW9uKCkgOjo9ICI8ZXhpdERlY2lzaW9uKCk+IgorCisvL0BhbHRTd2l0Y2hDYXNlLnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49aSk+IgorCisvL0BlbGVtZW50LnByZW1hdGNoKCkgOjo9CisvLwkiZGJnLkxvY2F0aW9uKCA8aXQubGluZT4sIDxpdC5wb3M+ICk7IgorCisvL0BtYXRjaFNldC5taXNtYXRjaGVkU2V0RXhjZXB0aW9uKCkgOjo9CisvLwkiZGJnLlJlY29nbml0aW9uRXhjZXB0aW9uKCBtc2UgKTsiCisKKy8vQGRmYVN0YXRlLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9ICJkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsiCisKKy8vQGRmYVN0YXRlU3dpdGNoLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9ICJkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsiCisKKy8vZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy90cnkKKy8veworLy8JaXNDeWNsaWNEZWNpc2lvbiA9IHRydWU7CisvLwk8c3VwZXIuZGZhRGVjaXNpb24oLi4uKT4KKy8vfQorLy9jYXRjaCAoIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgKQorLy97CisvLwlkYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKy8vCXRocm93IG52YWU7CisvL30KKy8vPj4KKworLy9AY3ljbGljREZBLmVycm9yTWV0aG9kKCkgOjo9IDw8CisvL3B1YmxpYyBvdmVycmlkZSB2b2lkIEVycm9yKCBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlICkKKy8veworLy8JKChEZWJ1Z1BhcnNlcilyZWNvZ25pemVyKS5kYmcuUmVjb2duaXRpb25FeGNlcHRpb24oIG52YWUgKTsKKy8vfQorLy8+PgorCisvKiogRm9yY2UgcHJlZGljYXRlIHZhbGlkYXRpb24gdG8gdHJpZ2dlciBhbiBldmVudCAqLworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK0V2YWxQcmVkaWNhdGUoPHByZWQ+LCAiPGRlc2NyaXB0aW9uPiIpCis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9DU2hhcnAzL1NULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9TVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxMzIyZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvQ1NoYXJwMy9TVC5zdGcKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGVyZW5jZSBQYXJyCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnZlcnNpb24gdG8gQyM6CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2FtIEhhcndlbGwsIFBpeGVsIE1pbmUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworLyoqIFRlbXBsYXRlIHN1Ymdyb3VwIHRvIGFkZCB0ZW1wbGF0ZSByZXdyaXRlIG91dHB1dAorICogIElmIGRlYnVnZ2luZywgdGhlbiB5b3UnbGwgYWxzbyBnZXQgU1REYmcuc3RnIGxvYWRlZC4KKyAqLworCitAb3V0cHV0RmlsZS5pbXBvcnRzKCkgOjo9IDw8Cis8QHN1cGVyLmltcG9ydHMoKT4KK3VzaW5nIEFudGxyMy5TVDsKK3VzaW5nIEFudGxyMy5TVC5MYW5ndWFnZTsKKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKzxAc3VwZXIubWVtYmVycygpPgorcHJpdmF0ZSBTdHJpbmdUZW1wbGF0ZUdyb3VwIF90ZW1wbGF0ZUdyb3VwID0gbmV3IFN0cmluZ1RlbXBsYXRlR3JvdXAoIjxuYW1lPlRlbXBsYXRlcyIsIHR5cGVvZihBbmdsZUJyYWNrZXRUZW1wbGF0ZUxleGVyKSApOworCitwdWJsaWMgU3RyaW5nVGVtcGxhdGVHcm91cCBUZW1wbGF0ZUdyb3VwCit7CisJZ2V0IHsgcmV0dXJuIF90ZW1wbGF0ZUdyb3VwOyB9CisJc2V0IHsgX3RlbXBsYXRlR3JvdXAgPSB2YWx1ZTsgfQorfQorPj4KKworcnVsZVJldHVybkJhc2VUeXBlKCkgOjo9IDwlCitUZW1wbGF0ZTxpZihUUkVFX1BBUlNFUik+VHJlZTxlbHNlPlBhcnNlcjxlbmRpZj5SdWxlUmV0dXJuU2NvcGVcPFN0cmluZ1RlbXBsYXRlLCA8bGFiZWxUeXBlPj4KKyU+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PXRlbXBsYXRlICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWxFbGVtKGVsZW09ezxsYWJlbD4uVGVtcGxhdGV9LGVsZW1UeXBlPSJTdHJpbmdUZW1wbGF0ZSIsLi4uKT4KKz4+CisKK3Jld3JpdGVUZW1wbGF0ZShhbHRzKSA6Oj0gPDwKKworLy8gVEVNUExBVEUgUkVXUklURQorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pCit7CisJPGFsdHM6cmV3cml0ZVRlbXBsYXRlQWx0KCk7IHNlcGFyYXRvcj0iZWxzZSAiPgorCTxpZihyZXdyaXRlTW9kZSk+PHJlcGxhY2VUZXh0SW5MaW5lKCk+PGVuZGlmPgorfQorPGVsc2U+Cis8YWx0czpyZXdyaXRlVGVtcGxhdGVBbHQoKTsgc2VwYXJhdG9yPSJlbHNlICI+Cis8aWYocmV3cml0ZU1vZGUpPjxyZXBsYWNlVGV4dEluTGluZSgpPjxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3JlcGxhY2VUZXh0SW5MaW5lKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorKChUb2tlblJld3JpdGVTdHJlYW0paW5wdXQuVG9rZW5TdHJlYW0pLlJlcGxhY2UoCisJaW5wdXQuVHJlZUFkYXB0b3IuR2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5TdGFydCksCisJaW5wdXQuVHJlZUFkYXB0b3IuR2V0VG9rZW5TdG9wSW5kZXgocmV0dmFsLlN0YXJ0KSwKKwlyZXR2YWwuVGVtcGxhdGUpOworPGVsc2U+CisoKFRva2VuUmV3cml0ZVN0cmVhbSlpbnB1dCkuUmVwbGFjZSgKKwlyZXR2YWwuU3RhcnQuVG9rZW5JbmRleCwKKwlpbnB1dC5MVCgtMSkuVG9rZW5JbmRleCwKKwlyZXR2YWwuVGVtcGxhdGUpOworPGVuZGlmPgorPj4KKworcmV3cml0ZVRlbXBsYXRlQWx0KGl0KSA6Oj0gPDwKKy8vIDxpdC5kZXNjcmlwdGlvbj4KKzxpZihpdC5wcmVkKT4KK2lmICg8aXQucHJlZD4pCit7CisJcmV0dmFsLlRlbXBsYXRlID0gPGl0LmFsdD47Cit9PFxuPgorPGVsc2U+Cit7CisJcmV0dmFsLlRlbXBsYXRlID0gPGl0LmFsdD47Cit9PFxuPgorPGVuZGlmPgorPj4KKworcmV3cml0ZUVtcHR5VGVtcGxhdGUoYWx0cykgOjo9IDw8CitudWxsOworPj4KKworLyoqIEludm9rZSBhIHRlbXBsYXRlIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMuCisgKiAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcnVsZSdzIHRlbXBsYXRlICphZnRlciogaGF2aW5nIHNldAorICogIHRoZSBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhlIHJ1bGUncyB0ZW1wbGF0ZSBtaWdodCBiZSB1c2VkIGFzCisgKiAgYW4gYXR0cmlidXRlIHRvIGJ1aWxkIGEgYmlnZ2VyIHRlbXBsYXRlOyB5b3UgZ2V0IGEgc2VsZi1lbWJlZGRlZAorICogIHRlbXBsYXRlLgorICovCityZXdyaXRlRXh0ZXJuYWxUZW1wbGF0ZShuYW1lLGFyZ3MpIDo6PSA8JQorVGVtcGxhdGVHcm91cC5HZXRJbnN0YW5jZU9mKCI8bmFtZT4iPG9wdGlvbmFsQXJndW1lbnRzKGFyZ3MpPikKKyU+CisKKy8qKiBleHByIGlzIGEgc3RyaW5nIGV4cHJlc3Npb24gdGhhdCBzYXlzIHdoYXQgdGVtcGxhdGUgdG8gbG9hZCAqLworcmV3cml0ZUluZGlyZWN0VGVtcGxhdGUoZXhwcixhcmdzKSA6Oj0gPCUKK1RlbXBsYXRlR3JvdXAuR2V0SW5zdGFuY2VPZig8ZXhwcj48b3B0aW9uYWxBcmd1bWVudHMoYXJncyk+KQorJT4KKworLyoqIEludm9rZSBhbiBpbmxpbmUgdGVtcGxhdGUgd2l0aCBhIHNldCBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycyAqLworcmV3cml0ZUlubGluZVRlbXBsYXRlKGFyZ3MsIHRlbXBsYXRlKSA6Oj0gPCUKK25ldyBTdHJpbmdUZW1wbGF0ZShUZW1wbGF0ZUdyb3VwLCAiPHRlbXBsYXRlPiI8b3B0aW9uYWxBcmd1bWVudHMoYXJncyk+KQorJT4KKworb3B0aW9uYWxBcmd1bWVudHMoYXJncykgOjo9IDw8Cis8aWYoYXJncyk+LAorCW5ldyBEaWN0aW9uYXJ5XDxzdHJpbmcsIG9iamVjdD4oKSB7IDxhcmdzOm9wdGlvbmFsQXJndW1lbnQoKTsgc2VwYXJhdG9yPSIsICI+IH0KKzxlbmRpZj4KKz4+CisKK29wdGlvbmFsQXJndW1lbnQoaXQpIDo6PSA8PAoreyI8aXQubmFtZT4iLCA8aXQudmFsdWU+fQorPj4KKworLyoqIHBsYWluIC0+IHtmb299IGFjdGlvbiAqLworcmV3cml0ZUFjdGlvbihhY3Rpb24pIDo6PSA8PAorPGFjdGlvbj4KKz4+CisKKy8qKiBBbiBhY3Rpb24gaGFzICVzdC5hdHRyTmFtZT1leHByOyBvciAle3N0fS5hdHRyTmFtZT1leHByOyAqLworYWN0aW9uU2V0QXR0cmlidXRlKHN0LGF0dHJOYW1lLGV4cHIpIDo6PSA8PAorKDxzdD4pLlNldEF0dHJpYnV0ZSgiPGF0dHJOYW1lPiIsPGV4cHI+KTsKKz4+CisKKy8qKiBUcmFuc2xhdGUgJXtzdHJpbmdFeHByfSAqLworYWN0aW9uU3RyaW5nQ29uc3RydWN0b3Ioc3RyaW5nRXhwcikgOjo9IDw8CituZXcgU3RyaW5nVGVtcGxhdGUoVGVtcGxhdGVHcm91cCw8c3RyaW5nRXhwcj4pCis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9EZWxwaGkvQVNULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvRGVscGhpL0FTVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNGU0MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvRGVscGhpL0FTVC5zdGcKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwOCBFcmlrIHZhbiBCaWxzZW4KKyBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKb2hhbm5lcyBMdWJlcgorIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKKyBDb3B5cmlnaHQgKGMpIDIwMDUgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitncm91cCBBU1Q7CisKK0BvdXRwdXRGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPjxpZighVFJFRV9QQVJTRVIpPjwhIHRyZWUgcGFyc2VyIHdvdWxkIGFscmVhZHkgaGF2ZSBpbXBvcnRlZCAhPiAgQW50bHIuUnVudGltZS5UcmVlLDxcbj48ZW5kaWY+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8QHN1cGVyLm1lbWJlcnMoKT4KKzxwYXJzZXJNZW1iZXJzKCk+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzQ29uc3RydWN0b3IoKSA6Oj0gPDwKKzxAc3VwZXIubWVtYmVyc0NvbnN0cnVjdG9yKCk+Cis8cGFyc2VyTWVtYmVyc0NvbnN0cnVjdG9yKCk+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzSW1wbGVtZW50YXRpb24oKSA6Oj0gPDwKKzxAc3VwZXIubWVtYmVyc0ltcGxlbWVudGF0aW9uKCk+Cis8cGFyc2VyTWVtYmVyc0ltcGxlbWVudGF0aW9uKCk+Cis+PgorCisvKiogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK3BhcnNlck1lbWJlcnMoKSA6Oj0gPDwKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZBZGFwdG9yOiBJVHJlZUFkYXB0b3I7CisgICAgcHJvY2VkdXJlIFNldEFkYXB0b3IoY29uc3QgVmFsdWU6IElUcmVlQWRhcHRvcik7CisgICAgcHJvcGVydHkgQWRhcHRvcjogSVRyZWVBZGFwdG9yIHJlYWQgRkFkYXB0b3I7CisgIHB1YmxpYworICAgIHByb3BlcnR5IFRyZWVBZGFwdG9yOiBJVHJlZUFkYXB0b3IgcmVhZCBGQWRhcHRvciB3cml0ZSBTZXRBZGFwdG9yOworCis+PgorCitwYXJzZXJNZW1iZXJzQ29uc3RydWN0b3IoKSA6Oj0gPDwKK0ZBZGFwdG9yIDo9IFRDb21tb25UcmVlQWRhcHRvci5DcmVhdGU7Cis+PgorCitwYXJzZXJNZW1iZXJzSW1wbGVtZW50YXRpb24oKSA6Oj0gPDwKK3Byb2NlZHVyZSBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LlNldEFkYXB0b3IoY29uc3QgVmFsdWU6IElUcmVlQWRhcHRvcik7CitiZWdpbgorICBGQWRhcHRvciA6PSBWYWx1ZTsKKyAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPi5UcmVlQWRhcHRvciA6PSBGQWRhcHRvcjt9PgorZW5kOworPj4KKworQHJldHVyblNjb3BlLnJ1bGVSZXR1cm5NZW1iZXJzKCkgOjo9IDw8CitmdW5jdGlvbiBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LlQ8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPi5HZXRUcmVlOiBJQU5UTFJJbnRlcmZhY2U7CitiZWdpbgorICBSZXN1bHQgOj0gRlRyZWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LlQ8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPi5TZXRUcmVlKGNvbnN0IFZhbHVlOiBJQU5UTFJJbnRlcmZhY2UpOworYmVnaW4KKyAgRlRyZWUgOj0gVmFsdWUgYXMgSTxBU1RMYWJlbFR5cGU+OworZW5kOworPj4KKworQHJldHVyblNjb3BlRGVjbGFyYXRpb24ucnVsZVJldHVybk1lbWJlcnMoKSA6Oj0gPDwKK3N0cmljdCBwcml2YXRlCisgIEZUcmVlOiBJPEFTVExhYmVsVHlwZT47Citwcm90ZWN0ZWQKKyAgeyBJUnVsZVJldHVyblNjb3BlIH0KKyAgZnVuY3Rpb24gR2V0VHJlZTogSUFOVExSSW50ZXJmYWNlOyBvdmVycmlkZTsKKyAgcHJvY2VkdXJlIFNldFRyZWUoY29uc3QgVmFsdWU6IElBTlRMUkludGVyZmFjZSk7IG92ZXJyaWRlOworPj4KKworLyoqIEFkZCBhIHZhcmlhYmxlIHRvIHRyYWNrIHJ1bGUncyByZXR1cm4gQVNUICovCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZURlY2xhcmF0aW9ucygpPgorUm9vdFswXSA6PSBuaWw7PFxuPgorPj4KKworcnVsZURlY2xhcmF0aW9uVmFycygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvblZhcnMoKT4KK1Jvb3Q6IGFycmF5IFswLi42M10gb2YgSTxBU1RMYWJlbFR5cGU+OworPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPHN1cGVyLnJ1bGVMYWJlbERlZnMoKT4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxhYmVsczp7PGl0LmxhYmVsLnRleHQ+X3RyZWUgOj0gbmlsO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsczp7PGl0LmxhYmVsLnRleHQ+X3RyZWUgOj0gbmlsO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLmFsbFRva2VuUmVmc0luQWx0c1dpdGhSZXdyaXRlczp7TG9jYWxzWydTdHJlYW1fPGl0PiddIDo9IFRSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtLkNyZWF0ZShBZGFwdG9yLCd0b2tlbiA8aXQ+Jyk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IuYWxsUnVsZVJlZnNJbkFsdHNXaXRoUmV3cml0ZXM6e0xvY2Fsc1snU3RyZWFtXzxpdD4nXSA6PSBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkNyZWF0ZShBZGFwdG9yLCdydWxlIDxpdD4nKTt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3J1bGVMYWJlbERlZlZhcnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlTGFiZWxEZWZWYXJzKCk+Cis8cnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHM6ezxpdC5sYWJlbC50ZXh0Pl90cmVlOiBJPEFTVExhYmVsVHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzOns8aXQubGFiZWwudGV4dD5fdHJlZTogSTxBU1RMYWJlbFR5cGU+O307IHNlcGFyYXRvcj0iXG4iPgorPj4KKy8qKiBXaGVuIGRvaW5nIGF1dG8gQVNUIGNvbnN0cnVjdGlvbiwgd2UgbXVzdCBkZWZpbmUgc29tZSB2YXJpYWJsZXM7CisgKiAgVGhlc2Ugc2hvdWxkIGJlIHR1cm5lZCBvZmYgaWYgZG9pbmcgcmV3cml0ZXMuICBUaGlzIG11c3QgYmUgYSAibW9kZSIKKyAqICBhcyBhIHJ1bGUgY291bGQgaGF2ZSBib3RoIHJld3JpdGUgYW5kIEFTVCB3aXRoaW4gdGhlIHNhbWUgYWx0ZXJuYXRpdmUKKyAqICBibG9jay4KKyAqLworQGFsdC5kZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxpZihhdXRvQVNUKT4KKzxpZihvdXRlckFsdCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KK1Jvb3RbMF0gOj0gQWRhcHRvci5HZXROaWxOb2RlIGFzIEk8QVNUTGFiZWxUeXBlPjsKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8vIFQgciBhIGMgayBpIG4gZyAgUiB1IGwgZSAgRSBsIGUgbSBlIG4gdCBzCisKKy8qKiBJRCBhbmQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZSAqLwordG9rZW5SZWZUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4gPCEgVHJhY2sgaW1wbGllcyBubyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24hPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4gPGVuZGlmPihMb2NhbHNbJ1N0cmVhbV88dG9rZW4+J10gYXMgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSkuQWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBpZHMrPUlEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlOyBhZGRzIHRvIGlkcyAqYW5kKgorICogIHRvIHRoZSB0cmFja2luZyBsaXN0IHN0cmVhbV9JRCBmb3IgdXNlIGluIHRoZSByZXdyaXRlLgorICovCit0b2tlblJlZlRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIF4oSUQgLi4uKSB0cmFjayBmb3IgcmV3cml0ZSAqLwordG9rZW5SZWZSdWxlUm9vdFRyYWNrKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4gPGVuZGlmPihMb2NhbHNbJ1N0cmVhbV88dG9rZW4+J10gYXMgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSkuQWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKK3dpbGRjYXJkVHJhY2sobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmIChTdGF0ZS5CYWNrdHJhY2tpbmcgPSAwKSB0aGVuIDxlbmRpZj4oTG9jYWxzWydTdHJlYW1fPHJ1bGUubmFtZT4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5BZGQoPGxhYmVsPi5UcmVlKTs8XG4+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi5UcmVlIiwuLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4gPGVuZGlmPihMb2NhbHNbJ1N0cmVhbV88cnVsZT4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5BZGQoPGxhYmVsPi5UcmVlKTsKKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIuVHJlZSIsLi4uKT4KKz4+CisKKy8vIFIgZSB3IHIgaSB0IGUKKworcmV3cml0ZUNvZGUoCisJYWx0cywgZGVzY3JpcHRpb24sCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gQUxMIHJlZmVyZW5jZWQgZWxlbWVudHMgdG8gcmlnaHQgb2YgLT4KKwlyZWZlcmVuY2VkVG9rZW5MYWJlbHMsCisJcmVmZXJlbmNlZFRva2VuTGlzdExhYmVscywKKwlyZWZlcmVuY2VkUnVsZUxhYmVscywKKwlyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMsCisgICAgcmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzLAorICAgIHJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHMsCisJcmV3cml0ZUJsb2NrTGV2ZWwsIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0KKzw8CisKKy8vIEFTVCBSRVdSSVRFCisvLyBlbGVtZW50czogICAgICAgICAgPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA7IHNlcGFyYXRvcj0iLCAiPgorLy8gdG9rZW4gbGFiZWxzOiAgICAgIDxyZWZlcmVuY2VkVG9rZW5MYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorLy8gcnVsZSBsYWJlbHM6ICAgICAgIDxyZWZlcmVuY2VkUnVsZUxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyB0b2tlbiBsaXN0IGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorLy8gcnVsZSBsaXN0IGxhYmVsczogIDxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbgorYmVnaW48XG4+Cis8ZW5kaWY+Cis8cHJldlJ1bGVSb290UmVmKCk+LlRyZWUgOj0gUm9vdFswXTsKKzxyZXdyaXRlQ29kZUxhYmVscygpPgorUm9vdFswXSA6PSBBZGFwdG9yLkdldE5pbE5vZGUgYXMgSTxBU1RMYWJlbFR5cGU+OworPGFsdHM6cmV3cml0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKzwhIGlmIHRyZWUgcGFyc2VyIGFuZCByZXdyaXRlPXRydWUgIT4KKzxpZihUUkVFX1BBUlNFUik+Cis8aWYocmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpPi5UcmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RbMF0pOworaW5wdXQuUmVwbGFjZUNoaWxkcmVuKGFkYXB0b3IuR2V0UGFyZW50KHJldHZhbC5TdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5HZXRDaGlsZEluZGV4KHJldHZhbC5TdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgYWRhcHRvci5HZXRDaGlsZEluZGV4KF9sYXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICByZXR2YWwuVHJlZSk7Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ISBpZiBwYXJzZXIgb3IgcmV3cml0ZSE9dHJ1ZSwgd2UgbmVlZCB0byBzZXQgcmVzdWx0ICE+Cis8aWYoIVRSRUVfUEFSU0VSKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4uVHJlZSA6PSBSb290WzBdOzxcbj4KKzxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpPi5UcmVlIDo9IFJvb3RbMF07PFxuPgorPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+CitlbmQ7Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlQ29kZUxhYmVscygpIDo6PSA8PAorPHJlZmVyZW5jZWRUb2tlbkxhYmVscworICAgIDp7TG9jYWxzWydTdHJlYW1fPGl0PiddIDo9IFRSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtLkNyZWF0ZShBZGFwdG9yLCAndG9rZW4gPGl0PicsIDxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzCisgICAgOntMb2NhbHNbJ1N0cmVhbV88aXQ+J10gOj0gVFJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW0uQ3JlYXRlKEFkYXB0b3IsJ3Rva2VuIDxpdD4nLCBsaXN0XzxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxhYmVsczp7CitpZiBBc3NpZ25lZCg8aXQ+KSB0aGVuCisgIExvY2Fsc1snU3RyZWFtXzxpdD4nXSA6PSBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkNyZWF0ZShBZGFwdG9yLCAndG9rZW4gPGl0PicsIDxpdD4uVHJlZSkKK2Vsc2UKKyAgTG9jYWxzWydTdHJlYW1fPGl0PiddIDo9IFRSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0uQ3JlYXRlKEFkYXB0b3IsICd0b2tlbiA8aXQ+JywgbmlsKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMKKyAgICA6e0xvY2Fsc1snU3RyZWFtXzxpdD4nXSA6PSBUUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLkNyZWF0ZShBZGFwdG9yLCAndG9rZW4gPGl0PicsIGxpc3RfPGl0Pik7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworLyoqIEdlbmVyYXRlIGNvZGUgZm9yIGFuIG9wdGlvbmFsIHJld3JpdGUgYmxvY2s7IG5vdGUgaXQgdXNlcyB0aGUgZGVlcCByZWYnZCBlbGVtZW50CisgICogIGxpc3QgcmF0aGVyIHNoYWxsb3cgbGlrZSBvdGhlciBibG9ja3MuCisgICovCityZXdyaXRlT3B0aW9uYWxCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAgICAgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorKCogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+ICopCitpZiAoPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgKExvY2Fsc1snU3RyZWFtXzxlbD4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5IYXNOZXh0fTsgc2VwYXJhdG9yPSIgb3IgIj4pIHRoZW4KK2JlZ2luCisgIDxhbHQ+CitlbmQ7Cis8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDp7ZWwgfCAoTG9jYWxzWydTdHJlYW1fPGVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLlJlc2V0Ozxcbj59PgorPj4KKworcmV3cml0ZUNsb3N1cmVCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAgICAgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorKCogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+ICopCit3aGlsZSAoPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCAoTG9jYWxzWydTdHJlYW1fPGVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLkhhc05leHR9OyBzZXBhcmF0b3I9IiBvciAiPikgZG8KK2JlZ2luCisgIDxhbHQ+CitlbmQ7Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IChMb2NhbHNbJ1N0cmVhbV88ZWw+J10gYXMgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSkuUmVzZXQoKTs8XG4+fT4KKz4+CisKK3Jld3JpdGVQb3NpdGl2ZUNsb3N1cmVCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAgICAgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAoraWYgKG5vdCAoPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCAoTG9jYWxzWydTdHJlYW1fPGVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLkhhc05leHR9OyBzZXBhcmF0b3I9IiBvciAiPikpIHRoZW4KKyAgcmFpc2UgRVJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24uQ3JlYXRlKCcnKTsKKword2hpbGUgKDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgKExvY2Fsc1snU3RyZWFtXzxlbD4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5IYXNOZXh0fTsgc2VwYXJhdG9yPSIgb3IgIj4pIGRvCitiZWdpbgorICA8YWx0PgorZW5kOworPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCAoTG9jYWxzWydTdHJlYW1fPGVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLlJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQWx0KGEpIDo6PSA8PAorKCogPGEuZGVzY3JpcHRpb24+ICopCis8aWYoYS5wcmVkKT4KK2lmICg8YS5wcmVkPikgdGhlbgorYmVnaW4KKyAgPGEuYWx0PgorZW5kPFxuPgorPGVsc2U+CitiZWdpbgorICA8YS5hbHQ+CitlbmQ7PFxuPgorPGVuZGlmPgorPj4KKworLyoqIEZvciBlbXB0eSByZXdyaXRlczogInIgOiAuLi4gLT4gOyIgKi8KK3Jld3JpdGVFbXB0eUFsdCgpIDo6PSAiUm9vdFswXSA9IG51bGw7IgorCityZXdyaXRlVHJlZShyb290LGNoaWxkcmVuLGRlc2NyaXB0aW9uLGVuY2xvc2luZ1RyZWVMZXZlbCx0cmVlTGV2ZWwpIDo6PSA8PAorKCogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+ICopCitiZWdpbgorICBSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkdldE5pbE5vZGUgYXMgSTxBU1RMYWJlbFR5cGU+OworICA8cm9vdDpyZXdyaXRlRWxlbWVudCgpPgorICA8Y2hpbGRyZW46cmV3cml0ZUVsZW1lbnQoKT4KKyAgQWRhcHRvci5BZGRDaGlsZChSb290WzxlbmNsb3NpbmdUcmVlTGV2ZWw+XSwgUm9vdFs8dHJlZUxldmVsPl0pOworZW5kOzxcbj4KKz4+CisKK3Jld3JpdGVFbGVtZW50TGlzdChlbGVtZW50cykgOjo9ICI8ZWxlbWVudHM6cmV3cml0ZUVsZW1lbnQoKT4iCisKK3Jld3JpdGVFbGVtZW50KGUpIDo6PSA8PAorPEBwcmVnZW4oKT4KKzxlLmVsPgorPj4KKworLyoqIEdlbiBJRCBvciBJRFthcmdzXSAqLworcmV3cml0ZVRva2VuUmVmKHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8CitBZGFwdG9yLkFkZENoaWxkKFJvb3RbPHRyZWVMZXZlbD5dLCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPik7PFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsPUlEICovCityZXdyaXRlVG9rZW5MYWJlbFJlZihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorQWRhcHRvci5BZGRDaGlsZChSb290Wzx0cmVlTGV2ZWw+XSwgKExvY2Fsc1snU3RyZWFtXzxsYWJlbD4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5OZXh0Tm9kZSgpKTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK0FkYXB0b3IuQWRkQ2hpbGQoUm9vdFs8dHJlZUxldmVsPl0sIChMb2NhbHNbJ1N0cmVhbV88bGFiZWw+J10gYXMgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSkuTmV4dE5vZGUpOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSAqLworcmV3cml0ZVRva2VuTGFiZWxSZWZSb290KGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CitSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoKExvY2Fsc1snU3RyZWFtXzxsYWJlbD4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5OZXh0Tm9kZSgpLCBSb290Wzx0cmVlTGV2ZWw+XSkgYXMgSTxBU1RMYWJlbFR5cGU+Ozxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSB3aGVyZSBsYWJlbCs9Li4uICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworLyoqIEdlbiBeKElEIC4uLikgb3IgXihJRFthcmdzXSAuLi4pICovCityZXdyaXRlVG9rZW5SZWZSb290KHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8CitSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoPGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4sIFJvb3RbPHRyZWVMZXZlbD5dKSBhcyBJPEFTVExhYmVsVHlwZT47PFxuPgorPj4KKworcmV3cml0ZUltYWdpbmFyeVRva2VuUmVmKGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8CitBZGFwdG9yLkFkZENoaWxkKFJvb3RbPHRyZWVMZXZlbD5dLCA8Y3JlYXRlSW1hZ2luYXJ5Tm9kZSh0b2tlblR5cGU9dG9rZW4sIC4uLik+KTs8XG4+Cis+PgorCityZXdyaXRlSW1hZ2luYXJ5VG9rZW5SZWZSb290KGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8CitSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoPGNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlPXRva2VuLCAuLi4pPiwgUm9vdFs8dHJlZUxldmVsPl0pIGFzIEk8QVNUTGFiZWxUeXBlPjs8XG4+Cis+PgorCisvKiogcGxhaW4gLT4ge2Zvb30gYWN0aW9uICovCityZXdyaXRlQWN0aW9uKGFjdGlvbikgOjo9IDw8CitSb290WzBdID0gPGFjdGlvbj47PFxuPgorPj4KKworLyoqIFdoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoaXMgcnVsZSdzIHJvb3QgdHJlZT8gIFRoaXMKKyAqICBsZXQncyB1cyByZWZlciB0byAkcnVsZSB0byBtZWFuIHByZXZpb3VzIHZhbHVlLiAgSSBhbSByZXVzaW5nIHRoZQorICogIHZhcmlhYmxlICd0cmVlJyBzaXR0aW5nIGluIHJldHZhbCBzdHJ1Y3QgdG8gaG9sZCB0aGUgdmFsdWUgb2YgUm9vdFswXSByaWdodAorICogIGJlZm9yZSBJIHNldCBpdCBkdXJpbmcgcmV3cml0ZXMuICBUaGUgYXNzaWduIHdpbGwgYmUgdG8gcmV0dmFsLlRyZWUuCisgKi8KK3ByZXZSdWxlUm9vdFJlZigpIDo6PSAiUmV0VmFsIgorCityZXdyaXRlUnVsZVJlZihydWxlKSA6Oj0gPDwKK0FkYXB0b3IuQWRkQ2hpbGQoUm9vdFs8dHJlZUxldmVsPl0sIChMb2NhbHNbJ1N0cmVhbV88cnVsZT4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5OZXh0VHJlZSgpKTs8XG4+Cis+PgorCityZXdyaXRlUnVsZVJlZlJvb3QocnVsZSkgOjo9IDw8CitSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoKExvY2Fsc1snU3RyZWFtXzxydWxlPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLk5leHROb2RlLCBSb290Wzx0cmVlTGV2ZWw+XSkgYXMgSTxBU1RMYWJlbFR5cGU+Ozxcbj4KKz4+CisKK3Jld3JpdGVOb2RlQWN0aW9uKGFjdGlvbikgOjo9IDw8CitBZGFwdG9yLkFkZENoaWxkKFJvb3RbPHRyZWVMZXZlbD5dLCA8YWN0aW9uPik7PFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb25Sb290KGFjdGlvbikgOjo9IDw8CitSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoPGFjdGlvbj4sIFJvb3RbPHRyZWVMZXZlbD5dKSBhcyBJPEFTVExhYmVsVHlwZT47PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZihsYWJlbCkgOjo9IDw8CitBZGFwdG9yLkFkZENoaWxkKFJvb3RbPHRyZWVMZXZlbD5dLCAoTG9jYWxzWydTdHJlYW1fPGxhYmVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLk5leHRUcmVlKCkpOzxcbj4KKz4+CisKKy8qKiBHZW4gJHJ1bGVMYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZihsYWJlbCkgOjo9IDw8CitBZGFwdG9yLkFkZENoaWxkKFJvb3RbPHRyZWVMZXZlbD5dLCAoTG9jYWxzWydTdHJlYW1fPGxhYmVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLk5leHRUcmVlKCkpOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkcnVsZUxhYmVsIC4uLikgd2hlcmUgcnVsZUxhYmVsPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGFiZWxSZWZSb290KGxhYmVsKSA6Oj0gPDwKK1Jvb3RbPHRyZWVMZXZlbD5dIDo9IEFkYXB0b3IuQmVjb21lUm9vdCgoTG9jYWxzWydTdHJlYW1fPGxhYmVsPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLk5leHROb2RlLCBSb290Wzx0cmVlTGV2ZWw+XSkgYXMgSTxBU1RMYWJlbFR5cGU+Ozxcbj4KKz4+CisKKy8qKiBHZW4gXigkcnVsZUxhYmVsIC4uLikgd2hlcmUgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorUm9vdFs8dHJlZUxldmVsPl0gOj0gQWRhcHRvci5CZWNvbWVSb290KChMb2NhbHNbJ1N0cmVhbV88bGFiZWw+J10gYXMgSVJld3JpdGVSdWxlRWxlbWVudFN0cmVhbSkuTmV4dE5vZGUsIFJvb3RbPHRyZWVMZXZlbD5dKSBhcyBJPEFTVExhYmVsVHlwZT47PFxuPgorPj4KKworY3JlYXRlSW1hZ2luYXJ5Tm9kZSh0b2tlblR5cGUsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzwhIG5ldyBNZXRob2ROb2RlKElETGFiZWwsIGFyZ3MpICE+CitUPHRlcm1pbmFsT3B0aW9ucy5ub2RlPi5DcmVhdGUoPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorQWRhcHRvci5DcmVhdGVOb2RlKDx0b2tlblR5cGU+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGlmKCFhcmdzKT4nPHRva2VuVHlwZT4nPGVuZGlmPikgYXMgSTxBU1RMYWJlbFR5cGU+Cis8ZW5kaWY+Cis+PgorCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+CitUPHRlcm1pbmFsT3B0aW9ucy5ub2RlPi5DcmVhdGUoKExvY2Fsc1snU3RyZWFtXzx0b2tlbj4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5OZXh0VG9rZW48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorPGlmKGFyZ3MpPiA8ISBtdXN0IGNyZWF0ZSBuZXcgbm9kZSBmcm9tIG9sZCAhPgorQWRhcHRvci5DcmVhdGUoPHRva2VuPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPikKKzxlbHNlPgorKExvY2Fsc1snU3RyZWFtXzx0b2tlbj4nXSBhcyBJUmV3cml0ZVJ1bGVFbGVtZW50U3RyZWFtKS5OZXh0Tm9kZQorPGVuZGlmPgorPGVuZGlmPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvRGVscGhpL0FTVFBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0RlbHBoaS9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWE0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0RlbHBoaS9BU1RQYXJzZXIuc3RnCkBAIC0wLDAgKzEsMjIwIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDggRXJpayB2YW4gQmlsc2VuCisgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSm9oYW5uZXMgTHViZXIKKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBLdW5sZSBPZHV0b2xhCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIG5vcm1hbCBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgVGhlIHNpdHVhdGlvbiBpcyBub3QgdG9vIGJhZCBhcyByZXdyaXRlICgtPikgdXNhZ2UgbWFrZXMgXiBhbmQgIQorICogIGludmFsaWQuIFRoZXJlIGlzIG5vIGh1Z2UgZXhwbG9zaW9uIG9mIGNvbWJpbmF0aW9ucy4KKyAqLworZ3JvdXAgQVNUUGFyc2VyOworCitAcnVsZS5zZXRFcnJvclJldHVyblZhbHVlKCkgOjo9IDw8CitSZXRWYWwuVHJlZSA6PSBBZGFwdG9yLkVycm9yTm9kZShJbnB1dCwgUmV0VmFsLlN0YXJ0IGFzIElUb2tlbiwKKyAgSW5wdXQuTFQoLTEpLCBSRSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4KK2JlZ2luPFxuPgorPGVuZGlmPgorPGxhYmVsPl90cmVlIDo9IDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+OworQWRhcHRvci5BZGRDaGlsZChSb290WzBdLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+CitlbmQ7Cis8ZW5kaWY+Cis+PgorCisvKiogSUQhIGFuZCBvdXRwdXQ9QVNUIChzYW1lIGFzIHBsYWluIHRva2VuUmVmKSAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9ICI8c3VwZXIudG9rZW5SZWYoLi4uKT4iCisKKy8qKiBJRF4gYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4KK2JlZ2luCis8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgOj0gPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT47CitSb290WzBdIDo9IEFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIFJvb3RbMF0pIGFzIEk8QVNUTGFiZWxUeXBlPjsKKzxpZihiYWNrdHJhY2tpbmcpPgorZW5kOworPGVuZGlmPgorPj4KKworLyoqIGlkcys9SUQhIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZkJhbmdBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBsYWJlbCs9VE9LRU4gd2hlbiBvdXRwdXQ9QVNUIGJ1dCBub3QgcmV3cml0ZSBhbHQgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBsYWJlbCs9VE9LRU5eIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLy8gU0VUIEFTVAorCisvLyB0aGUgbWF0Y2ggc2V0IHN0dWZmIGlzIGludGVyZXN0aW5nIGluIHRoYXQgaXQgdXNlcyBhbiBhcmd1bWVudCBsaXN0CisvLyB0byBwYXNzIGNvZGUgdG8gdGhlIGRlZmF1bHQgbWF0Y2hTZXQ7IGFub3RoZXIgcG9zc2libGUgd2F5IHRvIGFsdGVyCisvLyBpbmhlcml0ZWQgY29kZS4gIEkgZG9uJ3QgdXNlIHRoZSByZWdpb24gc3R1ZmYgYmVjYXVzZSBJIG5lZWQgdG8gcGFzcworLy8gZGlmZmVyZW50IGNodW5rcyBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdG9yLiAgSSBkb24ndCBsaWtlIG1ha2luZworLy8gdGhlIHRlbXBsYXRlIG5hbWUgaGF2ZSB0aGUgb3BlcmF0b3IgYXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZXMgZ2V0cworLy8gbGFyZ2UgYnV0IHRoaXMgaXMgdGhlIG1vc3QgZmxleGlibGUtLXRoaXMgaXMgYXMgb3Bwb3NlZCB0byBoYXZpbmcKKy8vIHRoZSBjb2RlIGdlbmVyYXRvciBjYWxsIG1hdGNoU2V0IHRoZW4gYWRkIHJvb3QgY29kZSBvciBydWxlcm9vdCBjb2RlCisvLyBwbHVzIGxpc3QgbGFiZWwgcGx1cyAuLi4gIFRoZSBjb21iaW5hdGlvbnMgbWlnaHQgcmVxdWlyZSBjb21wbGljYXRlZAorLy8gcmF0aGVyIHRoYW4ganVzdCBhZGRlZCBvbiBjb2RlLiAgSW52ZXN0aWdhdGUgdGhhdCByZWZhY3RvcmluZyB3aGVuCisvLyBJIGhhdmUgbW9yZSB0aW1lLgorCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8c3VwZXIubWF0Y2hTZXQoLi4uLCBwb3N0bWF0Y2hDb2RlPXs8aWYoYmFja3RyYWNraW5nKT5pZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbiA8ZW5kaWY+QWRhcHRvci5BZGRDaGlsZChSb290WzBdLCA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPik7fSk+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSAiPHN1cGVyLm1hdGNoU2V0KC4uLik+IgorCisvLyBub3RlIHRoZXJlIGlzIG5vIG1hdGNoU2V0VHJhY2sgYmVjYXVzZSAtPiByZXdyaXRlcyBmb3JjZSBzZXRzIHRvIGJlCisvLyBwbGFpbiBvbGQgYmxvY2tzIG9mIGFsdHM6IChBfEJ8Li4ufEMpCisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+IDo9IElucHV0LkxUKDEpIGFzIEk8bGFiZWxUeXBlPjs8XG4+Cis8ZW5kaWY+Cis8c3VwZXIubWF0Y2hTZXQoLi4uLCBwb3N0bWF0Y2hDb2RlPXs8aWYoYmFja3RyYWNraW5nKT5pZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbiA8ZW5kaWY+Um9vdFswXSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4sIFJvb3RbMF0pIGFzIEk8QVNUTGFiZWxUeXBlPjt9KT4KKz4+CisKKy8vIFJVTEUgUkVGIEFTVAorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4gPGVuZGlmPkFkYXB0b3IuQWRkQ2hpbGQoUm9vdFswXSwgPGxhYmVsPi5UcmVlKTsKKz4+CisKKy8qKiBydWxlISBpcyBzYW1lIGFzIG5vcm1hbCBydWxlIHJlZiAqLworcnVsZVJlZkJhbmcocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9ICI8c3VwZXIucnVsZVJlZiguLi4pPiIKKworLyoqIHJ1bGVeICovCitydWxlUmVmUnVsZVJvb3QocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4gPGVuZGlmPlJvb3RbMF0gOj0gQWRhcHRvci5CZWNvbWVSb290KDxsYWJlbD4uVHJlZSwgUm9vdFswXSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLlRyZWUiLC4uLik+Cis+PgorCisvKiogeCs9cnVsZSEgd2hlbiBvdXRwdXQ9QVNUIGlzIGEgcnVsZSByZWYgd2l0aCBsaXN0IGFkZGl0aW9uICovCitydWxlUmVmQmFuZ0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmQmFuZyguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIuVHJlZSIsLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlXiAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIuVHJlZSIsLi4uKT4KKz4+CisKKy8vIFdJTERDQVJEIEFTVAorCit3aWxkY2FyZChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIChTdGF0ZS5CYWNrdHJhY2tpbmcgPSAwKSB0aGVuCitiZWdpbgorPGVuZGlmPgorCTxsYWJlbD5fdHJlZSA6PSBBZGFwdG9yLkNyZWF0ZU5vZGUoPGxhYmVsPikgYXMgSTxBU1RMYWJlbFR5cGU+OworCUFkYXB0b3IuQWRkQ2hpbGQoUm9vdFswXSwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPgorZW5kOworPGVuZGlmPgorPj4KKword2lsZGNhcmRCYW5nKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9ICI8c3VwZXIud2lsZGNhcmQoLi4uKT4iCisKK3dpbGRjYXJkUnVsZVJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbgorYmVnaW4KKzxlbmRpZj4KKwk8bGFiZWw+X3RyZWUgOj0gQWRhcHRvci5DcmVhdGVOb2RlKDxsYWJlbD4pIGFzIEk8QVNUTGFiZWxUeXBlPjsKKwlSb290WzBdIDo9IEFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIFJvb3RbMF0pIGFzIEk8QVNUTGFiZWxUeXBlPjsKKzxpZihiYWNrdHJhY2tpbmcpPgorZW5kOworPGVuZGlmPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK1Q8dGVybWluYWxPcHRpb25zLm5vZGU+LkNyZWF0ZSg8bGFiZWw+KSA8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsKSAhPgorPGVsc2U+CitBZGFwdG9yLkNyZWF0ZU5vZGUoPGxhYmVsPikgYXMgSTxBU1RMYWJlbFR5cGU+Cis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIChTdGF0ZS5CYWNrdHJhY2tpbmcgPSAwKSB0aGVuCitiZWdpbjxcbj4KKzxlbmRpZj4KK1JldFZhbC5UcmVlIDo9IEFkYXB0b3IuUnVsZVBvc3RQcm9jZXNzaW5nKFJvb3RbMF0pIGFzIEk8QVNUTGFiZWxUeXBlPjsKKzxpZighVFJFRV9QQVJTRVIpPgorQWRhcHRvci5TZXRUb2tlbkJvdW5kYXJpZXMoUmV0VmFsLlRyZWUsIFJldFZhbC5TdGFydCBhcyBJVG9rZW4sIFJldFZhbC5TdG9wIGFzIElUb2tlbik7Cis8ZW5kaWY+Cis8aWYoYmFja3RyYWNraW5nKT4KKzxcbj5lbmQ7Cis8ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9EZWxwaGkvQVNUVHJlZVBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0RlbHBoaS9BU1RUcmVlUGFyc2VyLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzMwNDIwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9EZWxwaGkvQVNUVHJlZVBhcnNlci5zdGcKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwOCBFcmlrIHZhbiBCaWxzZW4KKyBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKb2hhbm5lcyBMdWJlcgorIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IEt1bmxlIE9kdXRvbGEKKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIFRlbXBsYXRlcyBmb3IgYnVpbGRpbmcgQVNUcyBkdXJpbmcgdHJlZSBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgRWFjaCBjb21iaW5hdGlvbiBoYXMgaXRzIG93biB0ZW1wbGF0ZSBleGNlcHQgdGhhdCBsYWJlbC9ubyBsYWJlbAorICogIGlzIGNvbWJpbmVkIGludG8gdG9rZW5SZWYsIHJ1bGVSZWYsIC4uLgorICovCitncm91cCBBU1RUcmVlUGFyc2VyOworCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgbGFzdCBlbGVtZW50IG1hdGNoZWQgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+CitfRmlyc3RbMF0gOj0gbmlsOworX0xhc3QgOj0gbmlsOzxcbj4KKz4+CisKK3J1bGVEZWNsYXJhdGlvblZhcnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25WYXJzKCk+CitfRmlyc3QsIF9TYXZlX0xhc3Q6IGFycmF5IFswLi42M10gb2YgSTxBU1RMYWJlbFR5cGU+OworX0xhc3Q6IEk8QVNUTGFiZWxUeXBlPjsKKz4+CisKKy8qKiBXaGF0IHRvIGVtaXQgd2hlbiB0aGVyZSBpcyBubyByZXdyaXRlIHJ1bGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4KK2JlZ2luPGVuZGlmPgorPGlmKHJld3JpdGVNb2RlKT4KK1JldFZhbC5UcmVlIDo9IF9GaXJzdFswXSBhcyBJPEFTVExhYmVsVHlwZT47CitpZiAoQWRhcHRvci5HZXRQYXJlbnQoUmV0VmFsLlRyZWUpIFw8XD4gbmlsKSBhbmQgKEFkYXB0b3IuSXNOaWwoQWRhcHRvci5HZXRQYXJlbnQoUmV0VmFsLlRyZWUpKSkgdGhlbgorICBSZXRWYWwuVHJlZSA6PSBBZGFwdG9yLkdldFBhcmVudChSZXRWYWwuVHJlZSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+ZW5kOzxlbmRpZj4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyOyBvdmVycmlkZSBoZXJlIHRvCisgKiAgYWRkIHRyZWUgY29uc3RydWN0aW9uIGFjdGlvbnMuCisgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47CitiZWdpbgorICBfU2F2ZV9MYXN0Wzx0cmVlTGV2ZWw+XSA6PSBfTGFzdDsKKyAgX0ZpcnN0Wzx0cmVlTGV2ZWw+XSA6PSBuaWw7Cis8aWYoIXJld3JpdGVNb2RlKT4KKyAgUm9vdFs8dHJlZUxldmVsPl0gOj0gQWRhcHRvci5HZXROaWxOb2RlIGFzIEk8QVNUTGFiZWxUeXBlPjs8XG4+Cis8ZW5kaWY+CisgIDxyb290OmVsZW1lbnQoKT4KKzxpZihyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbiA8ZW5kaWY+Cis8aWYocm9vdC5lbC5ydWxlKT4KKyAgaWYgKF9GaXJzdFs8ZW5jbG9zaW5nVHJlZUxldmVsPl0gPSBuaWwpIHRoZW4gX0ZpcnN0WzxlbmNsb3NpbmdUcmVlTGV2ZWw+XSA6PSA8cm9vdC5lbC5sYWJlbD4uVHJlZTsKKzxlbHNlPgorICBpZiAoX0ZpcnN0WzxlbmNsb3NpbmdUcmVlTGV2ZWw+XSA9IG5pbCkgdGhlbiBfRmlyc3RbPGVuY2xvc2luZ1RyZWVMZXZlbD5dIDo9IDxyb290LmVsLmxhYmVsPjsKKzxlbmRpZj4KKzxlbmRpZj4KKyAgPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KKyAgaWYgKElucHV0LkxBKDEpID0gVFRva2VuLkRPV04pIHRoZW4KKyAgYmVnaW4KKyAgICBNYXRjaChJbnB1dCwgVFRva2VuLkRPV04sIG5pbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBNYXRjaChJbnB1dCwgVFRva2VuLlVQLCBuaWwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICBlbmQ7Cis8ZWxzZT4KKyAgTWF0Y2goSW5wdXQsIFRUb2tlbi5ET1dOLCBuaWwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICBNYXRjaChJbnB1dCwgVFRva2VuLlVQLCBuaWwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPGlmKCFyZXdyaXRlTW9kZSk+CisgIEFkYXB0b3IuQWRkQ2hpbGQoUm9vdFs8ZW5jbG9zaW5nVHJlZUxldmVsPl0sIFJvb3RbPHRyZWVMZXZlbD5dKTsKKzxlbmRpZj4KKyAgX0xhc3QgOj0gX1NhdmVfTGFzdFs8dHJlZUxldmVsPl07CitlbmQ7PFxuPgorPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICdjZXB0IGFkZAorICogIHNldHRpbmcgb2YgX2xhc3QKKyAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKz4+CisKKy8qKiBJRCBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbgorYmVnaW48XG4+Cis8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlIDo9IFQ8dGVybWluYWxPcHRpb25zLm5vZGU+LkNyZWF0ZSg8bGFiZWw+KTsKKzxlbHNlPgorCTxsYWJlbD5fdHJlZSA6PSBBZGFwdG9yLkR1cE5vZGUoPGxhYmVsPikgYXMgSTxBU1RMYWJlbFR5cGU+OworPGVuZGlmPjxcbj4KKwlBZGFwdG9yLkFkZENoaWxkKFJvb3RbPHRyZWVMZXZlbD5dLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+CitlbmQ7Cis8ZW5kaWY+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbiA8ZW5kaWY+CitpZiAoX0ZpcnN0Wzx0cmVlTGV2ZWw+XSA9IG5pbCkgdGhlbiBfRmlyc3RbPHRyZWVMZXZlbD5dIDo9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX0xhc3QgOj0gSW5wdXQuTFQoMSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4KK2JlZ2luCis8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlIDo9IFQ8dGVybWluYWxPcHRpb25zLm5vZGU+LkNyZWF0ZSg8bGFiZWw+KTsKKzxlbHNlPgorCTxsYWJlbD5fdHJlZSA6PSBBZGFwdG9yLkR1cE5vZGUoPGxhYmVsPikgYXMgSTxBU1RMYWJlbFR5cGU+OworPGVuZGlmPjxcbj4KKwlSb290Wzx0cmVlTGV2ZWw+XSA6PSBBZGFwdG9yLkJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCBSb290Wzx0cmVlTGV2ZWw+XSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPGlmKGJhY2t0cmFja2luZyk+CitlbmQ7Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8vIFNFVCBBU1QKKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX0xsYXN0IDo9IElucHV0LkxUKDEpIGFzIEk8QVNUTGFiZWxUeXBlPjsKKzxzdXBlci5tYXRjaFNldCguLi4sIHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbiBiZWdpbiA8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlIDo9IFQ8dGVybWluYWxPcHRpb25zLm5vZGU+LkNyZWF0ZSg8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlIDo9IEFkYXB0b3IuRHVwTm9kZSg8bGFiZWw+KSBhcyBJPEFTVExhYmVsVHlwZT47Cis8ZW5kaWY+PFxuPgorQWRhcHRvci5BZGRDaGlsZChSb290Wzx0cmVlTGV2ZWw+XSwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPmVuZDs8ZW5kaWY+Cis8ZW5kaWY+Cit9CispPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUsdHJlZUxldmVsPSIwIikgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxub1Jld3JpdGUoKT4gPCEgc2V0IHJldHVybiB0cmVlICE+Cis+PgorCittYXRjaFNldEJhbmcocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8c3VwZXIubWF0Y2hTZXQoLi4uKT4KKz4+CisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxzdXBlci5tYXRjaFNldCguLi4sIHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoU3RhdGUuQmFja3RyYWNraW5nID0gMCkgdGhlbiBiZWdpbiA8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlIDo9IFQ8dGVybWluYWxPcHRpb25zLm5vZGU+LkNyZWF0ZSg8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlIDo9IEFkYXB0b3IuRHVwTm9kZSg8bGFiZWw+KSBhcyBJPEFTVExhYmVsVHlwZT47Cis8ZW5kaWY+PFxuPgorUm9vdFs8dHJlZUxldmVsPl0gOj0gQWRhcHRvci5CZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgUm9vdFs8dHJlZUxldmVsPl0pIGFzIEk8QVNUTGFiZWxUeXBlPjsKKzxpZihiYWNrdHJhY2tpbmcpPmVuZDs8ZW5kaWY+Cis8ZW5kaWY+Cit9CispPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX0xhc3QgOj0gSW5wdXQuTFQoMSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmIChTdGF0ZS5CYWNrdHJhY2tpbmcgPSAwKSB0aGVuIDxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorQWRhcHRvci5BZGRDaGlsZChSb290Wzx0cmVlTGV2ZWw+XSwgPGxhYmVsPi5UcmVlKTsKKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KK2lmIChfRmlyc3RbPHRyZWVMZXZlbD5dID0gbmlsKSB0aGVuIF9GaXJzdFs8dHJlZUxldmVsPl0gOj0gPGxhYmVsPi5UcmVlOworPGVuZGlmPgorPj4KKworLyoqIHgrPXJ1bGUgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIuVHJlZSIsLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX0xhc3QgOj0gSW5wdXQuTFQoMSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4gPGVuZGlmPlJvb3RbPHRyZWVMZXZlbD5dIDo9IEFkYXB0b3IuQmVjb21lUm9vdCg8bGFiZWw+LlRyZWUsIFJvb3RbPHRyZWVMZXZlbD5dKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8ZW5kaWY+Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLlRyZWUiLC4uLik+Cis+PgorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8c3VwZXIucnVsZVJlZlRyYWNrKC4uLik+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8c3VwZXIucnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfTGFzdCA6PSBJbnB1dC5MVCgxKSBhcyBJPEFTVExhYmVsVHlwZT47Cis8c3VwZXIucnVsZVJlZlJvb3RUcmFjayguLi4pPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX0xhc3QgOj0gSW5wdXQuTFQoMSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPHN1cGVyLnJ1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogU3RyZWFtcyBmb3IgdG9rZW4gcmVmcyBhcmUgdHJlZSBub2RlcyBub3c7IG92ZXJyaWRlIHRvCisgKiAgY2hhbmdlIG5leHRUb2tlbiB0byBuZXh0Tm9kZS4KKyAqLworY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsc2NvcGUpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK1Q8dGVybWluYWxPcHRpb25zLm5vZGU+LkNyZWF0ZSgoTG9jYWxzWydTdHJlYW1fPHRva2VuPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLk5leHROb2RlKQorPGVsc2U+CisoTG9jYWxzWydTdHJlYW1fPHRva2VuPiddIGFzIElSZXdyaXRlUnVsZUVsZW1lbnRTdHJlYW0pLk5leHROb2RlCis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKFN0YXRlLkJhY2t0cmFja2luZyA9IDApIHRoZW4KK2JlZ2luPFxuPgorPGVuZGlmPgorUmV0VmFsLlRyZWUgOj0gQWRhcHRvci5SdWxlUG9zdFByb2Nlc3NpbmcoUm9vdFswXSkgYXMgSTxBU1RMYWJlbFR5cGU+OworPGlmKGJhY2t0cmFja2luZyk+CitlbmQ7Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9EZWxwaGkvRGVscGhpLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvRGVscGhpL0RlbHBoaS5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmM2RmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvRGVscGhpL0RlbHBoaS5zdGcKQEAgLTAsMCArMSwxODA1IEBACisvKiBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA4IEVyaWsgdmFuIEJpbHNlbgorIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEpvaGFubmVzIEx1YmVyCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgS3VubGUgT2R1dG9sYQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworZ3JvdXAgRGVscGhpOworCitjc2hhcnBUeXBlSW5pdE1hcCA6Oj0gWworICAiaW50IjoiMCIsCisgICJ1aW50IjoiMCIsCisgICJsb25nIjoiMCIsCisgICJ1bG9uZyI6IjAiLAorICAiZmxvYXQiOiIwLjAiLAorICAiZG91YmxlIjoiMC4wIiwKKyAgImJvb2wiOiJGYWxzZSIsCisgICJieXRlIjoiMCIsCisgICJzYnl0ZSI6IjAiLAorICAic2hvcnQiOiIwIiwKKyAgInVzaG9ydCI6IjAiLAorICAiY2hhciI6IiMwIiwKKyAgInN0cmluZyI6IicnIiwKKyAgIlN0cmluZyI6IicnIiwKKyAgZGVmYXVsdDoibmlsIiAvLyBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGF0b21pYyB0eXBlCitdCisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqICBMRVhFUiAoQm9vbGVhbik6IHNob3VsZCB3ZSBnZW5lcmF0ZSBsZXhlciBjb2RlPworICogIFBBUlNFUiAoQm9vbGVhbik6IHNob3VsZCB3ZSBnZW5lcmF0ZSBwYXJzZXIgY29kZT8KKyAqICBUUkVFX1BBUlNFUiAoQm9vbGVhbik6IHNob3VsZCB3ZSBnZW5lcmF0ZSB0cmVlIHBhcnNlciBjb2RlPworICogIGFjdGlvblNjb3BlIChTdHJpbmcpOiAnbGV4ZXInLCAncGFyc2VyJywgJ3RyZWVfcGFyc2VyJyBvciBjdXN0b20gc2NvcGUKKyAqICBhY3Rpb25zIChIYXNoTWFwKToKKyAqICBkb2NDb21tZW50IChTdHJpbmcpOiBkb2N1bWVudCBjb21tZW50CisgKiAgcmVjb2duaXplciAoT2JqZWN0KTogcmVjb2duaXplciBjbGFzcyBnZW5lcmF0b3IKKyAqICBuYW1lIChTdHJpbmcpOiBuYW1lIG9mIGdyYW1tYXIKKyAqICB0b2tlbnMgKEhhc2hNYXA8bmFtZTogU3RyaW5nLCB0eXBlOiBJbnRlZ2VyPik6CisgKiAgdG9rZW5OYW1lczoKKyAqICBydWxlczoKKyAqICBjeWNsaWNERkFzOgorICogIGJpdHNldHM6CisgKiAgYnVpbGRUZW1wbGF0ZSAoQm9vbGVhbik6IHNob3VsZCB3ZSBnZW5lcmF0ZSBhIHN0cmluZyB0ZW1wbGF0ZT8KKyAqICBidWlsZEFTVCAoQm9vbGVhbik6IHNob3VsZCB3ZSBnZW5lcmF0ZSBhbiBBU1Q/CisgKiAgcmV3cml0ZU1vZGUgKEJvb2xlYW4pOiBhcmUgd2UgcmV3cml0ZWluZyBub2Rlcz8KKyAqICBwcm9maWxlIChCb29sZWFuKToKKyAqICBiYWNrdHJhY2tpbmcgKEJvb2xlYW4pOiBiYWNrdHJhY2tpbmcgbW9kZT8KKyAqICBzeW5wcmVkcyAoKTogc3ludGFjdGljIHByZWRpY2F0ZXMKKyAqICBtZW1vaXplIChCb29sZWFuKTogc2hvdWxkIHdlIG1lbW9pemU/CisgKiAgbnVtUnVsZXMgKEludGVnZXIpOiBudW1iZXIgb2YgcnVsZXMKKyAqICBmaWxlTmFtZSAoU3RyaW5nKTogZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2Ygb3JpZ2luYWwgLmcgZmlsZQorICogIEFOVExSVmVyc2lvbiAoU3RyaW5nKTogQU5UTFIgdmVyc2lvbiBpbiBNYWpvci5NaW5vci5CdWlsZCBmb3JtYXQKKyAqICBnZW5lcmF0ZWRUaW1lc3RhbXAgKFN0cmluZyk6IGRhdGUvdGltZSB3aGVuIHRoZSBmaWxlIGlzIGdlbmVyYXRlZAorICogIHRyYWNlIChCb29sZWFuKTogc2hvdWxkIHdlIHRyYWNlIGlucHV0L291dHB1dD8KKyAqICBzY29wZXM6CisgKiAgc3VwZXJDbGFzcyAoU3RyaW5nKTogbmFtZSBvZiBiYXNlIGNsYXNzLCBvciBlbXB0eSBzdHJpbmcKKyAqICBsaXRlcmFsczoKKyAqLworb3V0cHV0RmlsZShMRVhFUixQQVJTRVIsVFJFRV9QQVJTRVIsIGFjdGlvblNjb3BlLCBhY3Rpb25zLAorICAgICAgICAgICBkb2NDb21tZW50LCByZWNvZ25pemVyLAorICAgICAgICAgICBuYW1lLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLAorICAgICBiaXRzZXRzLCBidWlsZFRlbXBsYXRlLCBidWlsZEFTVCwgcmV3cml0ZU1vZGUsIHByb2ZpbGUsCisgICAgIGJhY2t0cmFja2luZywgc3lucHJlZHMsIG1lbW9pemUsIG51bVJ1bGVzLAorICAgICBmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsIHRyYWNlLAorICAgICBzY29wZXMsIHN1cGVyQ2xhc3MsIGxpdGVyYWxzKSA6Oj0KKzw8Cit1bml0IDxuYW1lPjsKKworeyRISU5UUyBPRkZ9CisKKy8vICRBTlRMUiA8QU5UTFJWZXJzaW9uPiA8ZmlsZU5hbWU+IDxnZW5lcmF0ZWRUaW1lc3RhbXA+CisKKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyPgorCitpbnRlcmZhY2UKKworPEBpbXBvcnRzPgordXNlczxcbj4KKzxAZW5kPgorICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnVzZXNJbnRlcmZhY2U+Cis8aWYoVFJFRV9QQVJTRVIpPgorICBBbnRsci5SdW50aW1lLlRyZWUsPFxuPgorPGVuZGlmPgorICBBbnRsci5SdW50aW1lLAorICBBbnRsci5SdW50aW1lLkNvbGxlY3Rpb25zLAorICBBbnRsci5SdW50aW1lLlRvb2xzOworCis8ZG9jQ29tbWVudD4KKzxyZWNvZ25pemVyPgorPj4KKworLyoqIEdlbmVyYXRlcyBzb3VyY2UgY29kZSBmb3IgdGhlIGxleGVyIGNsYXNzCisgKiBncmFtbWFyIChHcmFtbWFyIG9iamVjdCkKKyAqLworbGV4ZXIoZ3JhbW1hciwgbmFtZSwgdG9rZW5zLCBzY29wZXMsIHJ1bGVzLCBudW1SdWxlcywgbGFiZWxUeXBlPSJUb2tlbiIsCisgICAgICBmaWx0ZXJNb2RlLCBzdXBlckNsYXNzPSJMZXhlciIpIDo6PSA8PAordHlwZQorICBJPGdyYW1tYXIucmVjb2duaXplck5hbWU+ID0gaW50ZXJmYWNlKEk8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPikKKyAgZW5kOworCisgIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gPSBjbGFzcyhUPEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD4sIEk8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4pCisgIHN0cmljdCBwcml2YXRlCisgICAgRkNudDogYXJyYXkgWzAuLjxncmFtbWFyLm51bWJlck9mRGVjaXNpb25zPl0gb2YgQnl0ZTsKKyAgICBGTEE6IGFycmF5IFswLi48Z3JhbW1hci5udW1iZXJPZkRlY2lzaW9ucz4sIDAuLjI1NV0gb2YgSW50ZWdlcjsKKyAgICBGRXhjZXB0aW9uOiBFUmVjb2duaXRpb25FeGNlcHRpb247CisgICAgcHJvY2VkdXJlIEluaXRpYWxpemVDeWNsaWNERkFzOworICA8Y3ljbGljREZBczpjeWNsaWNERkFEZWNsYXJhdGlvbigpPgorICBwdWJsaWMKKyAgICBjb25zdAorICAgICAgPHRva2Vuczp7PGl0Lm5hbWU+ID0gPGl0LnR5cGU+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxzY29wZXM6ezxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlPWl0KT48ZW5kaWY+fT4KKyAgc3RyaWN0IHByaXZhdGUKKyAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbWJlckRlY2xhcmF0aW9ucz4KKyAgcHVibGljCisgICAgLy8gZGVsZWdhdGVzCisgICAgPGdyYW1tYXIuZGVsZWdhdGVzOiB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT46IEk8c3VwZXJDbGFzcz47IHs8Zy5yZWNvZ25pemVyTmFtZT59fTsgc2VwYXJhdG9yPSJcbiI+CisgIHB1YmxpYworICAgIC8vIGRlbGVnYXRvcnMKKyAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOiB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT46IFBvaW50ZXI7IHs8Zy5yZWNvZ25pemVyTmFtZT59fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50OiBQb2ludGVyOyB7PGcucmVjb2duaXplck5hbWU+fX0+CisgIHByb3RlY3RlZAorICAgIHsgSUJhc2VSZWNvZ25pemVyIH0KKyAgICBmdW5jdGlvbiBHZXRHcmFtbWFyRmlsZU5hbWU6IFN0cmluZzsgb3ZlcnJpZGU7Cis8aWYoZmlsdGVyTW9kZSk+CisgICAgZnVuY3Rpb24gQWxyZWFkeVBhcnNlZFJ1bGUoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07CisgICAgICBjb25zdCBSdWxlSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgTWVtb2l6ZShjb25zdCBJbnB1dDogSUludFN0cmVhbTsgY29uc3QgUnVsZUluZGV4LAorICAgICAgUnVsZVN0YXJ0SW5kZXg6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgcHJvdGVjdGVkCisgICAgeyBJTGV4ZXIgfQorICAgIGZ1bmN0aW9uIE5leHRUb2tlbjogSVRva2VuOyBvdmVycmlkZTs8XG4+Cis8ZW5kaWY+CisgIHByb3RlY3RlZAorICAgIHsgSUxleGVyIH0KKyAgICBwcm9jZWR1cmUgRG9Ub2tlbnM7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBBSW5wdXQ6IElDaGFyU3RyZWFtPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3w7IGNvbnN0IEE8ZzpkZWxlZ2F0ZU5hbWUoKT46IElCYXNlUmVjb2duaXplcns8Zy5yZWNvZ25pemVyTmFtZT59fT4pOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUlucHV0OiBJQ2hhclN0cmVhbTsgY29uc3QgQVN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3w7IGNvbnN0IEE8ZzpkZWxlZ2F0ZU5hbWUoKT46IElCYXNlUmVjb2duaXplcns8Zy5yZWNvZ25pemVyTmFtZT59fT4pOyBvdmVybG9hZDsKKworICAgIDxydWxlczoge3IgfCA8aWYoIXIucnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT48bGV4ZXJSdWxlRGVjbGFyYXRpb24ocik+PGVuZGlmPn0+CisgICAgPHN5bnByZWRzOntwIHwgPGxleGVyU3lucHJlZERlY2xhcmF0aW9uKHApPn07IHNlcGFyYXRvcj0iXG4iPgorICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3VzZXMKKyAgPGdyYW1tYXIuZGVsZWdhdGVzOiB7Z3w8Zy5yZWNvZ25pemVyTmFtZT4sfTsgc2VwYXJhdG9yPSJcbiI+CisgIDxncmFtbWFyLmRlbGVnYXRvcnM6IHtnfDxnLnJlY29nbml6ZXJOYW1lPix9OyBzZXBhcmF0b3I9IlxuIj4KKyAgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS51c2VzSW1wbGVtZW50YXRpb24+CisgIFN5c1V0aWxzLAorICBTdHJVdGlscywKKyAgTWF0aDsKKworeyBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+IH0KKworY29uc3RydWN0b3IgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5DcmVhdGU7CitiZWdpbgorICBJbml0aWFsaXplQ3ljbGljREZBczsKK2VuZDsKKworY29uc3RydWN0b3IgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5DcmVhdGUoY29uc3QgQUlucHV0OiBJQ2hhclN0cmVhbTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8OyBjb25zdCBBPGc6ZGVsZWdhdGVOYW1lKCk+OiBJQmFzZVJlY29nbml6ZXJ7PGcucmVjb2duaXplck5hbWU+fX0+KTsKK2JlZ2luCisgIENyZWF0ZShBSW5wdXQsIG5pbDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCBBPGc6ZGVsZWdhdGVOYW1lKCk+fT4pOworZW5kOworCitjb25zdHJ1Y3RvciBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkNyZWF0ZShjb25zdCBBSW5wdXQ6IElDaGFyU3RyZWFtOyBjb25zdCBBU3RhdGU6IElSZWNvZ25pemVyU2hhcmVkU3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfDsgY29uc3QgQTxnOmRlbGVnYXRlTmFtZSgpPjogSUJhc2VSZWNvZ25pemVyezxnLnJlY29nbml6ZXJOYW1lPn19Pik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFJbnB1dCwgQVN0YXRlKTsKKyAgSW5pdGlhbGl6ZUN5Y2xpY0RGQXM7IHsgVE9ETzogTmVjZXNzYXJ5IGluIERlbHBoaT8/PyBOb3QgcmVtb3ZlZCB5ZXQuIH0KKyAgPGlmKG1lbW9pemUpPgorICA8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgU3RhdGUuUnVsZU1lbW9Db3VudCA6PSA8bnVtUnVsZXM+KzE7PFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKyAgPGVuZGlmPgorICA8ZW5kaWY+CisgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgIHtnfDxnOmRlbGVnYXRlTmFtZSgpPiA6PSBUPGcucmVjb2duaXplck5hbWU+LkNyZWF0ZShBSW5wdXQsIFN0YXRlPHRydW5jKGcuZGVsZWdhdG9ycyk6e3B8LCA8cDpkZWxlZ2F0ZU5hbWUoKT59PiwgU2VsZik7fTsgc2VwYXJhdG9yPSJcbiI+CisgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gOj0gUG9pbnRlcihBPGc6ZGVsZWdhdGVOYW1lKCk+KTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50IDo9IFBvaW50ZXIoQTxnOmRlbGVnYXRlTmFtZSgpPik7fT4KKyAgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZW1iZXJJbml0aWFsaXphdGlvbnM+CitlbmQ7Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbWJlckltcGxlbWVudGF0aW9ucz4KK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uR2V0R3JhbW1hckZpbGVOYW1lOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJzxmaWxlTmFtZT4nOworZW5kOworCis8aWYoZmlsdGVyTW9kZSk+Cis8ZmlsdGVyaW5nTmV4dFRva2VuKCk+Cis8ZW5kaWY+CisKKzxydWxlczsgc2VwYXJhdG9yPSJcblxuIj4KKzxzeW5wcmVkczp7cCB8IDxsZXhlclN5bnByZWQocCk+fT4KKworcHJvY2VkdXJlIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uSW5pdGlhbGl6ZUN5Y2xpY0RGQXM7CitiZWdpbgorICA8Y3ljbGljREZBczp7ZGZhIHwgRkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+IDo9IFRERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPi5DcmVhdGUoU2VsZjxAZGVidWdBZGRpdGlvbigpPik7fTsgc2VwYXJhdG9yPSJcbiI+CisgIDxjeWNsaWNERkFzOntkZmEgfCA8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+RkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+LlNwZWNpYWxTdGF0ZVRyYW5zaXRpb25IYW5kbGVyIDo9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X1NwZWNpYWxTdGF0ZVRyYW5zaXRpb247PGVuZGlmPn07IHNlcGFyYXRvcj0iXG4iPgorZW5kOworCis8Y3ljbGljREZBczpjeWNsaWNERkEoKT4gPCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KK2VuZC4+PgorCitsZXhlclJ1bGVEZWNsYXJhdGlvbihydWxlKSA6Oj0gPDwKK3Byb2NlZHVyZSBtPHJ1bGUucnVsZU5hbWU+KDxydWxlLnJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPXJ1bGUpPik7PFxuPgorPj4KKworLyoqIEEgb3ZlcnJpZGUgb2YgTGV4ZXIubmV4dFRva2VuKCkgdGhhdCBiYWNrdHJhY2tzIG92ZXIgbVRva2VucygpIGxvb2tpbmcKKyAqICBmb3IgbWF0Y2hlcy4gIE5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQgdXBvbiBlcnJvcjsganVzdCByZXdpbmQsIGNvbnN1bWUKKyAqICBhIHRva2VuIGFuZCB0aGVuIHRyeSBhZ2Fpbi4gIGJhY2t0cmFja2luZyBuZWVkcyB0byBiZSBzZXQgYXMgd2VsbC4KKyAqCisgKiAgTWFrZSBydWxlIG1lbW9pemF0aW9uIGhhcHBlbiBvbmx5IGF0IGxldmVscyBhYm92ZSAxIGFzIHdlIHN0YXJ0IG1Ub2tlbnMKKyAqICBhdCBiYWNrdHJhY2tpbmc9PTEuCisgKi8KK2ZpbHRlcmluZ05leHRUb2tlbigpIDo6PSA8PAorZnVuY3Rpb24gVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5OZXh0VG9rZW46IElUb2tlbjsKK3ZhcgorICBNOiBJbnRlZ2VyOworYmVnaW4KKyAgd2hpbGUgKFRydWUpIGRvCisgIGJlZ2luCisgICAgaWYgKElucHV0LkxBKDEpID0gSW50ZWdlcihjc2NFT0YpKSB0aGVuCisgICAgICBFeGl0KFRUb2tlbi5FT0ZfVE9LRU4pOworCisgICAgU3RhdGUuVG9rZW4gOj0gbmlsOworICAgIFN0YXRlLkNoYW5uZWwgOj0gVFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICBTdGF0ZS5Ub2tlblN0YXJ0Q2hhckluZGV4IDo9IElucHV0LkluZGV4OworICAgIFN0YXRlLlRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgOj0gSW5wdXQuQ2hhclBvc2l0aW9uSW5MaW5lOworICAgIFN0YXRlLlRva2VuU3RhcnRMaW5lIDo9IElucHV0LkxpbmU7CisgICAgU3RhdGUuVGV4dCA6PSAnJzsKKyAgICB0cnkKKyAgICAgIE0gOj0gSW5wdXQuTWFyaygpOworICAgICAgU3RhdGUuQmFja3RyYWNraW5nIDo9IDE7IDwhIG1lYW5zIHdlIHdvbid0IHRocm93IHNsb3cgZXhjZXB0aW9uICE+CisgICAgICBTdGF0ZS5GYWlsZWQgOj0gRmFsc2U7CisgICAgICBtVG9rZW5zKCk7CisgICAgICBTdGF0ZS5CYWNrdHJhY2tpbmcgOj0gMDsKKzwhCisgICAgICBtVG9rZW5zIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorICAgICAgICAgICAgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLgorIT4KKyAgICAgIGlmIChTdGF0ZS5GYWlsZWQpIHRoZW4KKyAgICAgIGJlZ2luCisgICAgICAgIElucHV0LlJld2luZChNKTsKKyAgICAgICAgSW5wdXQuQ29uc3VtZTsgPCEgLy8gYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluICE+CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgIGJlZ2luCisgICAgICAgIEVtaXQ7CisgICAgICAgIEV4aXQoU3RhdGUuVG9rZW4pOworICAgICAgZW5kOworICAgIGV4Y2VwdAorICAgICAgb24gUkU6IEVSZWNvZ25pdGlvbkV4Y2VwdGlvbiBkbworICAgICAgYmVnaW4KKyAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiBpbiBiYWNrdHJhY2tpbmcgbW9kZSwgYnV0Li4uCisgICAgICAgIFJlcG9ydEVycm9yKFJFKTsKKyAgICAgICAgUmVjb3ZlcihSRSk7CisgICAgICBlbmQ7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uQWxyZWFkeVBhcnNlZFJ1bGUoY29uc3QgSW5wdXQ6IElJbnRTdHJlYW07CisgIGNvbnN0IFJ1bGVJbmRleDogSW50ZWdlcik6IEJvb2xlYW47CitiZWdpbgorICBpZiAoU3RhdGUuQmFja3RyYWNraW5nID4gMSkgdGhlbgorICAgIFJlc3VsdCA6PSBpbmhlcml0ZWQgQWxyZWFkeVBhcnNlZFJ1bGUoSW5wdXQsIFJ1bGVJbmRleCkKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBGYWxzZTsKK2VuZDsKKworcHJvY2VkdXJlIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uTWVtb2l6ZShjb25zdCBJbnB1dDogSUludFN0cmVhbTsgY29uc3QgUnVsZUluZGV4LAorICBSdWxlU3RhcnRJbmRleDogSW50ZWdlcik7CitiZWdpbgorICBpZiAoU3RhdGUuQmFja3RyYWNraW5nID4gMSkgdGhlbgorICAgIGluaGVyaXRlZCBNZW1vaXplKElucHV0LCBSdWxlSW5kZXgsIFJ1bGVTdGFydEluZGV4KTsKK2VuZDsKKworPj4KKworZmlsdGVyaW5nQWN0aW9uR2F0ZSgpIDo6PSAiKFN0YXRlLkJhY2t0cmFja2luZyA9IDEpIgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcGFyc2VyICovCitnZW5lcmljUGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsCisgICAgICAgICAgICAgIGJpdHNldHMsIGlucHV0U3RyZWFtVHlwZSwgc3VwZXJDbGFzcywgZmlsdGVyTW9kZSwKKyAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPSJBTlRMUkludGVyZmFjZSIsIGxhYmVsVHlwZSwgbWVtYmVycywgcmV3cml0ZUVsZW1lbnRUeXBlKSA6Oj0gPDwKK3R5cGUKKyAgPHJ1bGVzOiB7ciB8IDxnZW5lcmljUGFyc2VyUnVsZVJldHVyblR5cGUocnVsZT1yLCBydWxlRGVzY3JpcHRvcj1yLnJ1bGVEZXNjcmlwdG9yKT59PgorICBJPGdyYW1tYXIucmVjb2duaXplck5hbWU+ID0gaW50ZXJmYWNlKEk8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPikKKyAgICA8cnVsZXM6IHtyIHwgPGdlbmVyaWNQYXJzZXJSdWxlSW50ZXJmYWNlKHJ1bGU9ciwgcnVsZURlc2NyaXB0b3I9ci5ydWxlRGVzY3JpcHRvcik+fT4KKyAgZW5kOworCisgIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gPSBjbGFzcyhUPEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD4sIEk8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4pCis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgcHVibGljCisgICAgY29uc3QKKyAgICAgIFRPS0VOX05BTUVTOiBhcnJheSBbMC4uPGxlbmd0aCh0b2tlbk5hbWVzKT4rM10gb2YgU3RyaW5nID0gKAorICAgICAgICAnXDxpbnZhbGlkPicsCisgICAgICAgICdcPEVPUj4nLAorICAgICAgICAnXDxET1dOPicsCisgICAgICAgICdcPFVQPicsCisgICAgICAgIDx0b2tlbk5hbWVzOyBzZXBhcmF0b3I9IixcbiI+KTs8XG4+Cis8ZW5kaWY+CisgIHB1YmxpYworICAgIGNvbnN0CisgICAgICA8dG9rZW5zOns8aXQubmFtZT4gPSA8aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisgIHB1YmxpYworICAgIC8vIGRlbGVnYXRlcworICAgIDxncmFtbWFyLmRlbGVnYXRlczoge2d8PGc6ZGVsZWdhdGVOYW1lKCk+OiBJPHN1cGVyQ2xhc3M+OyB7PGcucmVjb2duaXplck5hbWU+fX07IHNlcGFyYXRvcj0iXG4iPgorICBwdWJsaWMKKyAgICAvLyBkZWxlZ2F0b3JzCisgICAgPGdyYW1tYXIuZGVsZWdhdG9yczoge2d8PGc6ZGVsZWdhdGVOYW1lKCk+OiBQb2ludGVyOyB7PGcucmVjb2duaXplck5hbWU+fX07IHNlcGFyYXRvcj0iXG4iPgorICAgIDxsYXN0KGdyYW1tYXIuZGVsZWdhdG9ycyk6e2d8Z1BhcmVudDogUG9pbnRlcjsgezxnLnJlY29nbml6ZXJOYW1lPn19PgorCisgICAgPHNjb3Blczp7PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGVEZWNsYXJhdGlvbihzY29wZT1pdCk+PGVuZGlmPn0+Cis8QG1lbWJlcnM+CisgICAgPCEgV0FSTklORy4gYnVnIGluIFNUOiB0aGlzIGlzIGN1dC1uLXBhc3RlIGludG8gRGJnLnN0ZyAhPgorICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQUlucHV0OiA8aW5wdXRTdHJlYW1UeXBlPjxncmFtbWFyLmRlbGVnYXRvcnM6e2d8OyBjb25zdCBBPGc6ZGVsZWdhdGVOYW1lKCk+OiBJQmFzZVJlY29nbml6ZXJ7PGcucmVjb2duaXplck5hbWU+fX0+KTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFJbnB1dDogPGlucHV0U3RyZWFtVHlwZT47IGNvbnN0IEFTdGF0ZTogSVJlY29nbml6ZXJTaGFyZWRTdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8OyBjb25zdCBBPGc6ZGVsZWdhdGVOYW1lKCk+OiBJQmFzZVJlY29nbml6ZXJ7PGcucmVjb2duaXplck5hbWU+fX0+KTsgb3ZlcmxvYWQ7Cis8QGVuZD4KKyAgcHJvdGVjdGVkCisgICAgeyBJQmFzZVJlY29nbml6ZXIgfQorICAgIGZ1bmN0aW9uIEdldFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gR2V0R3JhbW1hckZpbGVOYW1lOiBTdHJpbmc7IG92ZXJyaWRlOworICBzdHJpY3QgcHJpdmF0ZQorICAgIDxhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtYmVyRGVjbGFyYXRpb25zPgorICA8cnVsZXM6IHtyIHwgPGdlbmVyaWNQYXJzZXJSdWxlRGVjbGFyYXRpb24ocnVsZT1yLCBydWxlRGVzY3JpcHRvcj1yLnJ1bGVEZXNjcmlwdG9yKT59PgorCis8ISBnZW5lcmF0ZSBydWxlL21ldGhvZCBkZWZpbml0aW9ucyBmb3IgaW1wb3J0ZWQgcnVsZXMgc28gdGhleQorICAgYXBwZWFyIHRvIGJlIGRlZmluZWQgaW4gdGhpcyByZWNvZ25pemVyLiAhPgorICAgIC8vIERlbGVnYXRlZCBydWxlcworICAgIDxncmFtbWFyLmRlbGVnYXRlZFJ1bGVzOntydWxlRGVzY3JpcHRvcnwgPGRlbGVnYXRlZFJ1bGVEZWNsYXJhdGlvbihydWxlRGVzY3JpcHRvcik+fT4KKworICAgIDxzeW5wcmVkczp7cCB8IDxzeW5wcmVkRGVjbGFyYXRpb24ocCk+fTsgc2VwYXJhdG9yPSJcbiI+CisgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQURlY2xhcmF0aW9uKCk+CisgIHN0cmljdCBwcml2YXRlCisgICAgRkV4Y2VwdGlvbjogRVJlY29nbml0aW9uRXhjZXB0aW9uOworICAgIEZMQTogYXJyYXkgWzAuLjxncmFtbWFyLm51bWJlck9mRGVjaXNpb25zPiwgMC4uMjU1XSBvZiBJbnRlZ2VyOworICAgIEZDbnQ6IGFycmF5IFswLi48Z3JhbW1hci5udW1iZXJPZkRlY2lzaW9ucz5dIG9mIEJ5dGU7CisgICAgcHJvY2VkdXJlIEluaXRpYWxpemVDeWNsaWNERkFzOworPGlmKGJpdHNldHMpPgorICBwdWJsaWMKKyAgICBjbGFzcyB2YXIKKyAgICAgIDxiaXRzZXRzOmJpdHNldERlY2wobmFtZT17Rk9MTE9XXzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0pPgorICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgSW5pdGlhbGl6ZUJpdHNldHM7IHN0YXRpYzs8XG4+Cis8ZW5kaWY+CisgIGVuZDsKKworaW1wbGVtZW50YXRpb24KKwordXNlcworICA8Z3JhbW1hci5kZWxlZ2F0ZXM6IHtnfDxnLnJlY29nbml6ZXJOYW1lPix9OyBzZXBhcmF0b3I9IlxuIj4KKyAgPGdyYW1tYXIuZGVsZWdhdG9yczoge2d8PGcucmVjb2duaXplck5hbWU+LH07IHNlcGFyYXRvcj0iXG4iPgorICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnVzZXNJbXBsZW1lbnRhdGlvbj4KKyAgU3lzVXRpbHMsCisgIFN0clV0aWxzLAorICBNYXRoOworCit7IFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gfQorCitjb25zdHJ1Y3RvciBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkNyZWF0ZShjb25zdCBBSW5wdXQ6IDxpbnB1dFN0cmVhbVR5cGU+PGdyYW1tYXIuZGVsZWdhdG9yczp7Z3w7IGNvbnN0IEE8ZzpkZWxlZ2F0ZU5hbWUoKT46IElCYXNlUmVjb2duaXplcns8Zy5yZWNvZ25pemVyTmFtZT59fT4pOworYmVnaW4KKyAgQ3JlYXRlKEFJbnB1dCwgVFJlY29nbml6ZXJTaGFyZWRTdGF0ZS5DcmVhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgQTxnOmRlbGVnYXRlTmFtZSgpPn0+KTsKK2VuZDsKKworY29uc3RydWN0b3IgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5DcmVhdGUoY29uc3QgQUlucHV0OiA8aW5wdXRTdHJlYW1UeXBlPjsKKyAgY29uc3QgQVN0YXRlOiBJUmVjb2duaXplclNoYXJlZFN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3w7IGNvbnN0IEE8ZzpkZWxlZ2F0ZU5hbWUoKT46IElCYXNlUmVjb2duaXplcns8Zy5yZWNvZ25pemVyTmFtZT59fT4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBSW5wdXQsIEFTdGF0ZSk7CisgIDxAbWVtYmVyc0NvbnN0cnVjdG9yPgorICA8QGVuZD4KKyAgPHBhcnNlckN0b3JCb2R5KCk+CisgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gOj0gVDxnLnJlY29nbml6ZXJOYW1lPi5DcmVhdGUoSW5wdXQsIFN0YXRlPHRydW5jKGcuZGVsZWdhdG9ycyk6e3B8LCA8cDpkZWxlZ2F0ZU5hbWUoKT59PiwgU2VsZik7fTsgc2VwYXJhdG9yPSJcbiI+CisgIDxncmFtbWFyLmluZGlyZWN0RGVsZWdhdGVzOntnIHwgPGc6ZGVsZWdhdGVOYW1lKCk+IDo9IDxnLmRlbGVnYXRvcjpkZWxlZ2F0ZU5hbWUoKT4uPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfGdQYXJlbnQgOj0gUG9pbnRlcihBPGc6ZGVsZWdhdGVOYW1lKCk+KTt9PgorICA8cnVsZXM6IHtyIHwgPHJ1bGVBdHRyaWJ1dGVTY29wZUluaXQoc2NvcGU9ci5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPn0+CisgIDxzY29wZXM6ezxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlPWl0KT48ZW5kaWY+fT4KKyAgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZW1iZXJJbml0aWFsaXphdGlvbnM+CitlbmQ7Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbWJlckltcGxlbWVudGF0aW9ucz4KKworPGdyYW1tYXIuZGVsZWdhdGVkUnVsZXM6e3J1bGVEZXNjcmlwdG9yfCA8ZGVsZWdhdGVkUnVsZUltcGxlbWVudGF0aW9uKHJ1bGVEZXNjcmlwdG9yKT59OyBzZXBhcmF0b3I9IlxuIj4KK3Byb2NlZHVyZSBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkluaXRpYWxpemVDeWNsaWNERkFzOworYmVnaW4KKyAgPGN5Y2xpY0RGQXM6e2RmYSB8IEZERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA6PSBUREZBPGRmYS5kZWNpc2lvbk51bWJlcj4uQ3JlYXRlKFNlbGYpO307IHNlcGFyYXRvcj0iXG4iPgorICA8Y3ljbGljREZBczp7ZGZhIHwgPGlmKGRmYS5zcGVjaWFsU3RhdGVTVHMpPkZERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPi5TcGVjaWFsU3RhdGVUcmFuc2l0aW9uSGFuZGxlciA6PSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9TcGVjaWFsU3RhdGVUcmFuc2l0aW9uOzxlbmRpZj59OyBzZXBhcmF0b3I9IlxuIj4KK2VuZDsKKworPGlmKGJpdHNldHMpPgorY2xhc3MgcHJvY2VkdXJlIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uSW5pdGlhbGl6ZUJpdHNldHM7CitiZWdpbgorICA8Yml0c2V0czpiaXRzZXQobmFtZT17Rk9MTE9XXzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0sIHdvcmRzNjQ9aXQuYml0cyk+CitlbmQ7Cis8ZW5kaWY+CisKKzxAbWVtYmVyc0ltcGxlbWVudGF0aW9uPgorIDxAZW5kPgorCitmdW5jdGlvbiBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkdldFRva2VuTmFtZXM6IFRTdHJpbmdBcnJheTsKK3ZhcgorICBJOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKFJlc3VsdCxMZW5ndGgoVDxncmFtbWFyLmNvbXBvc2l0ZS5yb290R3JhbW1hci5yZWNvZ25pemVyTmFtZT4uVE9LRU5fTkFNRVMpKTsKKyAgZm9yIEkgOj0gMCB0byBMZW5ndGgoVDxncmFtbWFyLmNvbXBvc2l0ZS5yb290R3JhbW1hci5yZWNvZ25pemVyTmFtZT4uVE9LRU5fTkFNRVMpIC0gMSBkbworICAgIFJlc3VsdFtJXSA6PSBUPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5UT0tFTl9OQU1FU1tJXTsKK2VuZDsKKworZnVuY3Rpb24gVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5HZXRHcmFtbWFyRmlsZU5hbWU6IFN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSAnPGZpbGVOYW1lPic7CitlbmQ7CisKKzxydWxlczsgc2VwYXJhdG9yPSJcblxuIj4KKzxzeW5wcmVkczp7cCB8IDxzeW5wcmVkKHApPn0+CisKKzxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorPGlmKGJpdHNldHMpPgoraW5pdGlhbGl6YXRpb24KKyAgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5Jbml0aWFsaXplQml0c2V0czs8XG4+Cis8ZW5kaWY+CitlbmQuPj4KKworZGVsZWdhdGVkUnVsZURlY2xhcmF0aW9uKHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitmdW5jdGlvbiA8cnVsZURlc2NyaXB0b3IubmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pOiBJPHJldHVyblR5cGUoKT47PFxuPgorPGVsc2U+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorZnVuY3Rpb24gPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTogPHJldHVyblR5cGUoKT47PFxuPgorPGVsc2U+Citwcm9jZWR1cmUgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCitkZWxlZ2F0ZWRSdWxlSW1wbGVtZW50YXRpb24ocnVsZURlc2NyaXB0b3IpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTogSTxyZXR1cm5UeXBlKCk+Ozxcbj4KKzxlbHNlPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTogPHJldHVyblR5cGUoKT47PFxuPgorPGVsc2U+Citwcm9jZWR1cmUgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cnVsZURlc2NyaXB0b3IubmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KK2JlZ2luCisgIDxpZihydWxlRGVzY3JpcHRvci5oYXNSZXR1cm5WYWx1ZSk+UmVzdWx0IDo9PGVuZGlmPiBUPHJ1bGVEZXNjcmlwdG9yLmdyYW1tYXIucmVjb2duaXplck5hbWU+KDxydWxlRGVzY3JpcHRvci5ncmFtbWFyOmRlbGVnYXRlTmFtZSgpPi5JbXBsZW1lbnRvcikuPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU+fTsgc2VwYXJhdG9yPSIsICI+KTsKK2VuZDsKKworPj4KKworcGFyc2VyQ3RvckJvZHkoKSA6Oj0gPDwKK0luaXRpYWxpemVDeWNsaWNERkFzOworPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CitTdGF0ZS5SdWxlTWVtb0NvdW50IDo9IDxsZW5ndGgoZ3JhbW1hci5hbGxJbXBvcnRlZFJ1bGVzKT4rMTs8XG4+IDwhIGluZGV4IGZyb20gMS4ubiAhPgorPGVuZGlmPgorPGVuZGlmPgorPGdyYW1tYXIuZGVsZWdhdG9yczoge2d8PGc6ZGVsZWdhdGVOYW1lKCk+IDo9IFBvaW50ZXIoQTxnOmRlbGVnYXRlTmFtZSgpPik7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitwYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywgQVNUTGFiZWxUeXBlLCBzdXBlckNsYXNzPSJQYXJzZXIiLCBsYWJlbFR5cGU9IlRva2VuIiwgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IklUb2tlblN0cmVhbSIsIHJld3JpdGVFbGVtZW50VHlwZT0iVG9rZW4iLCAuLi4pPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHRyZWUgcGFyc2VyOyBzYW1lIGFzIHBhcnNlciBleGNlcHQgdGhlIGlucHV0CisgKiAgc3RyZWFtIGlzIGEgZGlmZmVyZW50IHR5cGUuCisgKi8KK3RyZWVQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIGdsb2JhbEFjdGlvbiwgcnVsZXMsIG51bVJ1bGVzLCBiaXRzZXRzLCBsYWJlbFR5cGU9ezxBU1RMYWJlbFR5cGU+fSwgQVNUTGFiZWxUeXBlPSJvYmplY3QiLCBzdXBlckNsYXNzPSJUcmVlUGFyc2VyIiwgbWVtYmVycz17PGFjdGlvbnMudHJlZXBhcnNlci5tZW1iZXJzPn0sIGZpbHRlck1vZGUpIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJJVHJlZU5vZGVTdHJlYW0iLCByZXdyaXRlRWxlbWVudFR5cGU9Ik5vZGUiLCAuLi4pPgorPj4KKworLyoqIEEgc2ltcGxlciB2ZXJzaW9uIG9mIGEgcnVsZSB0ZW1wbGF0ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBpbWFnaW5hcnkKKyAqICBydWxlcyBjcmVhdGVkIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gIEFzIHRoZXkgbmV2ZXIgaGF2ZSByZXR1cm4gdmFsdWVzCisgKiAgbm9yIHBhcmFtZXRlcnMgZXRjLi4uLCBqdXN0IGdpdmUgc2ltcGxlc3QgcG9zc2libGUgbWV0aG9kLiAgRG9uJ3QgZG8KKyAqICBhbnkgb2YgdGhlIG5vcm1hbCBtZW1vaXphdGlvbiBzdHVmZiBpbiBoZXJlIGVpdGhlcjsgaXQncyBhIHdhc3RlLgorICogIEFzIHByZWRpY2F0ZXMgY2Fubm90IGJlIGlubGluZWQgaW50byB0aGUgaW52b2tpbmcgcnVsZSwgdGhleSBuZWVkIHRvCisgKiAgYmUgaW4gYSBydWxlIGJ5IHRoZW1zZWx2ZXMuCisgKi8KK3N5bnByZWRSdWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGRlc2NyaXB0aW9uLCBuYWtlZEJsb2NrKSA6Oj0KKzw8CisvLyAkQU5UTFIgc3RhcnQgIjxydWxlTmFtZT4iCitwcm9jZWR1cmUgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cnVsZU5hbWU+X2ZyYWdtZW50KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTsKK3ZhcgorICBBbHQ6IGFycmF5IFswLi48Z3JhbW1hci5udW1iZXJPZkRlY2lzaW9ucz5dIG9mIEludGVnZXI7CisgIDxydWxlTGFiZWxEZWZWYXJzKCk+CitiZWdpbgorICA8cnVsZUxhYmVsRGVmcygpPgorPGlmKHRyYWNlKT4KKyAgVHJhY2VJbignPHJ1bGVOYW1lPl9mcmFnbWVudCcsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworICB0cnkKKyAgICA8YmxvY2s+CisgIGZpbmFsbHkKKyAgICBUcmFjZU91dCgnPHJ1bGVOYW1lPl9mcmFnbWVudCcsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworICBlbmQ7Cis8ZWxzZT4KKyAgPGJsb2NrPgorPGVuZGlmPgorZW5kOworLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKK3N5bnByZWREZWNscyhuYW1lKSA6Oj0gPDwKK1N5blByZWRQb2ludGVyIDxuYW1lPjs8XG4+Cis+PgorCitzeW5wcmVkKG5hbWUpIDo6PSA8PAorCitmdW5jdGlvbiBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LjxuYW1lPjogQm9vbGVhbjsKK3ZhcgorICBTdGFydDogSW50ZWdlcjsKKyAgU3VjY2VzczogQm9vbGVhbjsKK2JlZ2luCisgIFN0YXRlLkJhY2t0cmFja2luZyA6PSBTdGF0ZS5CYWNrdHJhY2tpbmcgKyAxOworICA8QHN0YXJ0KCk+CisgIFN0YXJ0IDo9IElucHV0Lk1hcms7CisgIHRyeQorICAgIDxuYW1lPl9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgIGV4Y2VwdAorICAgIG9uIFJFOiBFUmVjb2duaXRpb25FeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlTG4oJ0ltcG9zc2libGU6ICcgKyBSRS5Ub1N0cmluZyk7CisgIGVuZDsKKyAgU3VjY2VzcyA6PSBub3QgU3RhdGUuRmFpbGVkOworICBJbnB1dC5SZXdpbmQoU3RhcnQpOworICA8QHN0b3AoKT4KKyAgU3RhdGUuQmFja3RyYWNraW5nIDo9IFN0YXRlLkJhY2t0cmFja2luZyAtIDE7CisgIFN0YXRlLkZhaWxlZCA6PSBGYWxzZTsKKyAgUmVzdWx0IDo9IFN1Y2Nlc3M7CitlbmQ7PFxuPgorPj4KKworbGV4ZXJTeW5wcmVkKG5hbWUpIDo6PSA8PAorPHN5bnByZWQobmFtZSk+Cis+PgorCitsZXhlclN5bnByZWREZWNsYXJhdGlvbihuYW1lKSA6Oj0gPDwKK2Z1bmN0aW9uIDxuYW1lPjogQm9vbGVhbjsKK3Byb2NlZHVyZSA8bmFtZT5fZnJhZ21lbnQ7Cis+PgorCitzeW5wcmVkRGVjbGFyYXRpb24obmFtZSkgOjo9IDw8CitmdW5jdGlvbiA8bmFtZT46IEJvb2xlYW47Citwcm9jZWR1cmUgPG5hbWU+X2ZyYWdtZW50OworPj4KKworcnVsZU1lbW9pemF0aW9uKG5hbWUpIDo6PSA8PAorPGlmKG1lbW9pemUpPgoraWYgKChTdGF0ZS5CYWNrdHJhY2tpbmcgPiAwKSBhbmQgQWxyZWFkeVBhcnNlZFJ1bGUoSW5wdXQsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pKSB0aGVuCisgIEV4aXQoPHJ1bGVSZXR1cm5WYWx1ZSgpPik7Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIHRlc3QgZm9yIGZhaWx1cmUgYW5kIHJldHVybiBmcm9tIHJ1bGUgKi8KK2NoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPjxcbj5pZiAoU3RhdGUuRmFpbGVkKSB0aGVuIEV4aXQoPHJ1bGVSZXR1cm5WYWx1ZSgpPik7PFxuPjxlbmRpZj4KKz4+CisKKy8qKiBUaGlzIHJ1bGUgaGFzIGZhaWxlZCwgZXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgZHVyaW5nIGJhY2t0cmFjayAqLworcnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmIChTdGF0ZS5CYWNrdHJhY2tpbmcgPiAwKSB0aGVuCitiZWdpbgorICBTdGF0ZS5GYWlsZWQgOj0gVHJ1ZTsKKyAgRXhpdCg8cnVsZVJldHVyblZhbHVlKCk+KTsKK2VuZDs8ZW5kaWY+Cis+PgorCitnZW5lcmljUGFyc2VyUnVsZURlY2xhcmF0aW9uKHJ1bGUsIHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGVsc2U+Cis8cnVsZUF0dHJpYnV0ZVNjb3BlRGVjbGFyYXRpb24oc2NvcGU9cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT4KKzxyZXR1cm5TY29wZURlY2xhcmF0aW9uKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT4KK3B1YmxpYworPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKyAgZnVuY3Rpb24gPHJ1bGUucnVsZU5hbWU+OiBJPHJldHVyblR5cGUoKT47PFxuPgorPGVsc2U+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorICBmdW5jdGlvbiA8cnVsZS5ydWxlTmFtZT46IDxyZXR1cm5UeXBlKCk+Ozxcbj4KKzxlbHNlPgorICBwcm9jZWR1cmUgPHJ1bGUucnVsZU5hbWU+Ozxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK2dlbmVyaWNQYXJzZXJSdWxlSW50ZXJmYWNlKHJ1bGUsIHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGVsc2U+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorZnVuY3Rpb24gPHJ1bGUucnVsZU5hbWU+OiBJPHJldHVyblR5cGUoKT47PFxuPgorPGVsc2U+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorZnVuY3Rpb24gPHJ1bGUucnVsZU5hbWU+OiA8cmV0dXJuVHlwZSgpPjs8XG4+Cis8ZWxzZT4KK3Byb2NlZHVyZSA8cnVsZS5ydWxlTmFtZT47PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworZ2VuZXJpY1BhcnNlclJ1bGVSZXR1cm5UeXBlKHJ1bGUsIHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYocnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxlbHNlPgorSTxyZXR1cm5UeXBlKCk+ID0gaW50ZXJmYWNlKEk8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZWxzZT5QYXJzZXI8ZW5kaWY+UnVsZVJldHVyblNjb3BlKQorZW5kOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBydWxlLiAgVGhpcyBpbmNsdWRlcyBhbnkgcmV0dXJuIHR5cGUKKyAqICBkYXRhIGFnZ3JlZ2F0ZXMgcmVxdWlyZWQgZm9yIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCisgKi8KK3J1bGUocnVsZU5hbWUscnVsZURlc2NyaXB0b3IsYmxvY2ssZW1wdHlSdWxlLGRlc2NyaXB0aW9uLGV4Y2VwdGlvbnMsZmluYWxseSxtZW1vaXplKSA6Oj0gPDwKKzxydWxlQXR0cmlidXRlU2NvcGUoc2NvcGU9cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT4KKzxyZXR1cm5TY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZSk+CisKKy8vICRBTlRMUiBzdGFydCAiPHJ1bGVOYW1lPiIKKygqIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPiAqKQorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uPHJ1bGVOYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoc2NvcGU9aXQpPik6IEk8cmV0dXJuVHlwZSgpPjsKKzxlbHNlPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uPHJ1bGVOYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoc2NvcGU9aXQpPik6IDxyZXR1cm5UeXBlKCk+OworPGVsc2U+Citwcm9jZWR1cmUgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cnVsZU5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KTsKKzxlbmRpZj4KKzxlbmRpZj4KKwordmFyCis8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy52YXJzPgorICBMb2NhbHM6IFRMb2NhbFN0b3JhZ2U7Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorICBSZXRWYWw6IEk8cmV0dXJuVHlwZSgpPjs8XG4+Cis8ZWxzZT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+CisgIFJldFZhbDogPHJldHVyblR5cGUoKT47PFxuPgorPGVsc2U+Cis8ZW5kaWY+Cis8ZW5kaWY+CisgIEFsdDogYXJyYXkgWzAuLjxncmFtbWFyLm51bWJlck9mRGVjaXNpb25zPl0gb2YgSW50ZWdlcjsKKyAgPHJ1bGVEZWNsYXJhdGlvblZhcnMoKT4KKyAgPHJ1bGVMYWJlbERlZlZhcnMoKT4KK2JlZ2luCisgIExvY2Fscy5Jbml0aWFsaXplOworICB0cnkKKyAgICA8aWYodHJhY2UpPlRyYWNlSW4oJzxydWxlTmFtZT4nLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICA8cnVsZUxhYmVsRGVmcygpPgorICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgPEBwcmVhbWJsZSgpPgorICAgIHRyeQorICAgICAgdHJ5CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorPGlmKGV4Y2VwdGlvbnMpPgorICAgICAgICA8ZXhjZXB0aW9uczp7ZXw8Y2F0Y2goZGVjbD1lLmRlY2wsYWN0aW9uPWUuYWN0aW9uKT48XG4+fT4KKzxlbHNlPgorPGlmKCFlbXB0eVJ1bGUpPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2gpPgorICAgICAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaD4KKzxlbHNlPgorICAgICAgZXhjZXB0CisgICAgICAgIG9uIFJFOiBFUmVjb2duaXRpb25FeGNlcHRpb24gZG8KKyAgICAgICAgYmVnaW4KKyAgICAgICAgICBSZXBvcnRFcnJvcihSRSk7CisgICAgICAgICAgUmVjb3ZlcihJbnB1dCxSRSk7CisgICAgICAgICAgPEBzZXRFcnJvclJldHVyblZhbHVlKCk+CisgICAgICAgIGVuZDs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CisgICAgICBlbmQ7CisgICAgZmluYWxseQorICAgICAgPGlmKHRyYWNlKT5UcmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICAgIDxtZW1vaXplKCk+CisgICAgICA8cnVsZVNjb3BlQ2xlYW5VcCgpPgorICAgICAgPGZpbmFsbHk+CisgICAgZW5kOworICAgIDxAcG9zdGFtYmxlKCk+CisgIGZpbmFsbHkKKyAgICBMb2NhbHMuRmluYWxpemU7CisgIGVuZDsKKyAgRXhpdCg8cnVsZVJldHVyblZhbHVlKCk+KTsKK2VuZDsKKy8vICRBTlRMUiBlbmQgIjxydWxlTmFtZT4iCis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitjYXRjaCAoPGUuZGVjbD4pCit7CisgICAgPGUuYWN0aW9uPgorfQorPj4KKworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK1JldFZhbCA6PSBUPHJldHVyblR5cGUoKT4uQ3JlYXRlOworUmV0VmFsLlN0YXJ0IDo9IElucHV0LkxUKDEpOzxcbj4KKzxlbHNlPgorPHJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlLmF0dHJpYnV0ZXM6eyBhIHwKKzxhLm5hbWU+IDo9IDxpZihhLmluaXRWYWx1ZSk+PGEuaW5pdFZhbHVlPjxlbHNlPjxpbml0VmFsdWUoYS50eXBlKT48ZW5kaWY+OworfT4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KKzxydWxlRGVzY3JpcHRvci5uYW1lPl9TdGFydEluZGV4IDo9IElucHV0LkluZGV4KCk7Cis8ZW5kaWY+Cis+PgorCitydWxlRGVjbGFyYXRpb25WYXJzKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPGVsc2U+Cis8cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlczp7IGEgfAorPGEubmFtZT46IDxhLnR5cGU+OworfT4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KKzxydWxlRGVzY3JpcHRvci5uYW1lPl9TdGFydEluZGV4OiBJbnRlZ2VyOworPGVuZGlmPgorPj4KKworcnVsZVNjb3BlU2V0VXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6ezxpdD5TdGFjay5QdXNoKFQ8aXQ+U2NvcGUuQ3JlYXRlKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6ezxpdC5uYW1lPlN0YWNrLlB1c2goVDxpdC5uYW1lPlNjb3BlLkNyZWF0ZSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlU2NvcGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOns8aXQ+U3RhY2suUG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOns8aXQubmFtZT5TdGFjay5Qb3A7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsc106ezxpdC5sYWJlbC50ZXh0PiA6PSBuaWw7fTsgc2VwYXJhdG9yPSJcbiI+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc106e2xpc3RfPGl0LmxhYmVsLnRleHQ+IDo9IG5pbDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzOnJ1bGVMYWJlbERlZihsYWJlbD1pdCk7IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzOntsbHw8bGwubGFiZWwudGV4dD4gOj0gbmlsO307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworcnVsZUxhYmVsRGVmVmFycygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscyxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHNdOns8aXQubGFiZWwudGV4dD46IEk8bGFiZWxUeXBlPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXTp7bGlzdF88aXQubGFiZWwudGV4dD46IElMaXN0XDxJQU5UTFJJbnRlcmZhY2VcPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzOnJ1bGVMYWJlbERlZlZhcihsYWJlbD1pdCk7IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzOntsbHw8bGwubGFiZWwudGV4dD46IDxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxsLnJlZmVyZW5jZWRSdWxlKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitsZXhlclJ1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6ezxpdC5sYWJlbC50ZXh0PiA6PSBuaWw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci5jaGFyTGFiZWxzOntpbnQgPGl0LmxhYmVsLnRleHQ+O307IHNlcGFyYXRvcj0iXG4iPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc10KKyAgICA6e0xpc3RfPGl0LmxhYmVsLnRleHQ+IDo9IG5pbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworbGV4ZXJSdWxlTGFiZWxEZWZEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6ezxpdC5sYWJlbC50ZXh0PjogSTxsYWJlbFR5cGU+O307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7aW50IDxpdC5sYWJlbC50ZXh0Pjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOntMaXN0XzxpdC5sYWJlbC50ZXh0PjogSUxpc3Q7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKz4+CisKK3J1bGVSZXR1cm5WYWx1ZSgpIDo6PSA8PAorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+Cis8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5OYW1lPgorPGVsc2U+CitSZXRWYWwKKzxlbmRpZj4KKzxlbHNlPgorPCEgbmlsICE+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighVFJFRV9QQVJTRVIpPgorUmV0VmFsLlN0b3AgOj0gSW5wdXQuTFQoLTEpOworPGVuZGlmPgorPGVuZGlmPgorPj4KKworbWVtb2l6ZSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoU3RhdGUuQmFja3RyYWNraW5nID4gMCkgdGhlbgorICBNZW1vaXplKElucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCk7Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcnVsZSBpbiB0aGUgbGV4ZXI7IG5ha2VkIGJsb2NrcyBhcmUgdXNlZCBmb3IKKyAqICBmcmFnbWVudCBydWxlcy4KKyAqLworbGV4ZXJSdWxlKHJ1bGVOYW1lLG5ha2VkQmxvY2sscnVsZURlc2NyaXB0b3IsYmxvY2ssbWVtb2l6ZSkgOjo9IDw8CisvLyAkQU5UTFIgc3RhcnQgIjxydWxlTmFtZT4iCis8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU+Citwcm9jZWR1cmUgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5tPHJ1bGVOYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoc2NvcGU9aXQpPik7Cit2YXIKKyAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMudmFycz4KKyAgTG9jYWxzOiBUTG9jYWxTdG9yYWdlOworICBUb2tlblR5cGUsIENoYW5uZWw6IEludGVnZXI7CisgIEFsdDogYXJyYXkgWzAuLjxncmFtbWFyLm51bWJlck9mRGVjaXNpb25zPl0gb2YgSW50ZWdlcjsKKyAgPGxleGVyUnVsZUxhYmVsRGVmRGVjbGFyYXRpb25zKCk+CitiZWdpbgorICBMb2NhbHMuSW5pdGlhbGl6ZTsKKyAgdHJ5CisgICAgPHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorICAgIDxpZih0cmFjZSk+VHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIHRyeQorPGlmKG5ha2VkQmxvY2spPgorICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgIDxsZXhlclJ1bGVMYWJlbERlZnMoKT4KKyAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICA8YmxvY2s+PFxuPgorPGVsc2U+CisgICAgICBUb2tlblR5cGUgOj0gPHJ1bGVOYW1lPjsKKyAgICAgIENoYW5uZWwgOj0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgIDxsZXhlclJ1bGVMYWJlbERlZnMoKT4KKyAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICA8YmxvY2s+CisgICAgICA8cnVsZUNsZWFuVXAoKT4KKyAgICAgIFN0YXRlLlRva2VuVHlwZSA6PSBUb2tlblR5cGU7CisgICAgICBTdGF0ZS5DaGFubmVsIDo9IENoYW5uZWw7CisgICAgICA8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKzxlbmRpZj4KKyAgICBmaW5hbGx5CisgICAgICA8aWYodHJhY2UpPlRyYWNlT3V0KCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7PGVuZGlmPgorICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgIDxtZW1vaXplKCk+CisgICAgZW5kOworICBmaW5hbGx5CisgICAgTG9jYWxzLkZpbmFsaXplOworICBlbmQ7CitlbmQ7CisvLyAkQU5UTFIgZW5kICI8cnVsZU5hbWU+IgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgaW1wbGljaXRseS1kZWZpbmVkIGxleGVyIGdyYW1tYXIgcnVsZQorICogIHRoYXQgY2hvb3NlcyBiZXR3ZWVuIGxleGVyIHJ1bGVzLgorICovCit0b2tlbnNSdWxlKHJ1bGVOYW1lLG5ha2VkQmxvY2ssYXJncyxibG9jayxydWxlRGVzY3JpcHRvcikgOjo9IDw8Citwcm9jZWR1cmUgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5tVG9rZW5zOwordmFyCisgIEFsdDogYXJyYXkgWzAuLjxncmFtbWFyLm51bWJlck9mRGVjaXNpb25zPl0gb2YgSW50ZWdlcjsKK2JlZ2luCisgIDxibG9jaz4KK2VuZDsKKworcHJvY2VkdXJlIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uRG9Ub2tlbnM7CitiZWdpbgorICBtVG9rZW5zOworZW5kOworPj4KKworLy8gUyBVIEIgUiBVIEwgRSBTCisKKy8qKiBBICguLi4pIHN1YnJ1bGUgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK2Jsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKygqIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPiAqKQorQWx0WzxkZWNpc2lvbk51bWJlcj5dIDo9IDxtYXhBbHQ+OworPGRlY2xzPgorPEBwcmVkZWNpc2lvbigpPgorPGRlY2lzaW9uPgorPEBwb3N0ZGVjaXNpb24oKT4KKzxAcHJlYnJhbmNoKCk+CitjYXNlIEFsdFs8ZGVjaXNpb25OdW1iZXI+XSBvZgorICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+CitlbmQ7Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisoKiA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4gKikKK0FsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSA8bWF4QWx0PjsKKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+CitjYXNlIEFsdFs8ZGVjaXNpb25OdW1iZXI+XSBvZgorICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+CitlbmQ7Cis+PgorCitydWxlQmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorKCogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+ICopCis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBIHNwZWNpYWwgY2FzZSBvZiBhICguLi4pIHN1YnJ1bGUgd2l0aCBhIHNpbmdsZSBhbHRlcm5hdGl2ZSAqLworYmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorKCogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+ICopCis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBICguLikrIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworcG9zaXRpdmVDbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorKCogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+ICopCitGQ250WzxkZWNpc2lvbk51bWJlcj5dIDo9IDA7Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK3doaWxlIChUcnVlKSBkbworYmVnaW4KKyAgQWx0WzxkZWNpc2lvbk51bWJlcj5dIDo9IDxtYXhBbHQ+OworICA8QHByZWRlY2lzaW9uKCk+CisgIDxkZWNpc2lvbj4KKyAgPEBwb3N0ZGVjaXNpb24oKT4KKyAgY2FzZSBBbHRbPGRlY2lzaW9uTnVtYmVyPl0gb2YKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+CisgIGVsc2UKKyAgICBiZWdpbgorICAgICAgaWYgKEZDbnRbPGRlY2lzaW9uTnVtYmVyPl0gPj0gMSkgdGhlbgorICAgICAgICBCcmVhazsKKyAgICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgICAgcmFpc2UgRUVhcmx5RXhpdEV4Y2VwdGlvbi5DcmVhdGUoPGRlY2lzaW9uTnVtYmVyPiwgSW5wdXQpOworICAgICAgPEBlYXJseUV4aXRFeGNlcHRpb24oKT4KKyAgICBlbmQ7CisgIGVuZDsKKyAgSW5jKEZDbnRbPGRlY2lzaW9uTnVtYmVyPl0pOworZW5kOworPEBwb3N0bG9vcCgpPgorPj4KKworcG9zaXRpdmVDbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisKKy8qKiBBICguLikqIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworY2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKygqIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPiAqKQorPGRlY2xzPgorPEBwcmVsb29wKCk+Cit3aGlsZSAoVHJ1ZSkgZG8KK2JlZ2luCisgIEFsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSA8bWF4QWx0PjsKKyAgPEBwcmVkZWNpc2lvbigpPgorICA8ZGVjaXNpb24+CisgIDxAcG9zdGRlY2lzaW9uKCk+CisgIGNhc2UgQWx0WzxkZWNpc2lvbk51bWJlcj5dIG9mCisgICAgPGFsdHM6YWx0U3dpdGNoQ2FzZSgpPgorICBlbHNlCisgICAgQnJlYWs7CisgIGVuZDsKK2VuZDsKKzxAcG9zdGxvb3AoKT4KKz4+CisKK2Nsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gY2xvc3VyZUJsb2NrCisKKy8qKiBPcHRpb25hbCBibG9ja3MgKHgpPyBhcmUgdHJhbnNsYXRlZCB0byAoeHwpIGJ5IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24KKyAqICBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBibG9jayB0ZW1wbGF0ZQorICovCitvcHRpb25hbEJsb2NrIDo6PSBibG9jaworCitvcHRpb25hbEJsb2NrU2luZ2xlQWx0IDo6PSBibG9jaworCisvKiogQSBjYXNlIGluIGEgc3dpdGNoIHRoYXQganVtcHMgdG8gYW4gYWx0ZXJuYXRpdmUgZ2l2ZW4gdGhlIGFsdGVybmF0aXZlCisgKiAgbnVtYmVyLiAgQSBERkEgcHJlZGljdHMgdGhlIGFsdGVybmF0aXZlIGFuZCB0aGVuIGEgc2ltcGxlIHN3aXRjaAorICogIGRvZXMgdGhlIGp1bXAgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBtYXRjaGVzIHRoYXQgYWx0ZXJuYXRpdmUuCisgKi8KK2FsdFN3aXRjaENhc2UoKSA6Oj0gPDwKKzxpPjoKKyAgPEBwcmVhbHQoKT4KKyAgPGl0Pjxcbj4KKz4+CisKKy8qKiBBbiBhbHRlcm5hdGl2ZSBpcyBqdXN0IGEgbGlzdCBvZiBlbGVtZW50czsgYXQgb3V0ZXJtb3N0IGxldmVsICovCithbHQoZWxlbWVudHMsYWx0TnVtLGRlc2NyaXB0aW9uLGF1dG9BU1Qsb3V0ZXJBbHQsdHJlZUxldmVsLHJldykgOjo9IDw8CisoKiA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4gKikKK2JlZ2luCisgIDxAZGVjbGFyYXRpb25zKCk+CisgIDxlbGVtZW50czplbGVtZW50KCk+CisgIDxyZXc+CisgIDxAY2xlYW51cCgpPgorZW5kOworPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvLyBFIEwgRSBNIEUgTiBUIFMKKworLyoqIER1bXAgdGhlIGVsZW1lbnRzIG9uZSBwZXIgbGluZSAqLworZWxlbWVudCgpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGl0LmVsPgorPj4KKworLyoqIG1hdGNoIGEgdG9rZW4gb3B0aW9uYWxseSB3aXRoIGEgbGFiZWwgaW4gZnJvbnQgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw+IDo9IDxlbmRpZj5NYXRjaChJbnB1dCwgPHRva2VuPiwgRk9MTE9XXzx0b2tlbj5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTxpZihsYWJlbCk+IGFzIEk8bGFiZWxUeXBlPjxlbmRpZj47PFxuPjxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1JRCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworbGlzdExhYmVsKGxhYmVsLGVsZW0pIDo6PSA8PAoraWYgKGxpc3RfPGxhYmVsPiA9IG5pbCkgdGhlbiBsaXN0XzxsYWJlbD4gOj0gVExpc3RcPElBTlRMUkludGVyZmFjZVw+LkNyZWF0ZTsKK2xpc3RfPGxhYmVsPi5BZGQoPGVsZW0+KTs8XG4+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgKi8KK2NoYXJSZWYoY2hhcixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA6PSBJbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CitNYXRjaCg8Y2hhcj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIG1hdGNoIGEgY2hhcmFjdGVyIHJhbmdlICovCitjaGFyUmFuZ2VSZWYoYSxiLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+IDo9IElucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK01hdGNoUmFuZ2UoPGE+LCA8Yj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGU9IiIpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxpZihMRVhFUik+Cis8bGFiZWw+IDo9IElucHV0LkxBKDEpOzxcbj4KKzxlbHNlPgorPGxhYmVsPiA6PSBJbnB1dC5MVCgxKSBhcyBJPGxhYmVsVHlwZT47PFxuPgorPGVuZGlmPgorPGVuZGlmPgoraWYgKDxzPikgdGhlbgorYmVnaW4KKyAgSW5wdXQuQ29uc3VtZTsKKyAgPHBvc3RtYXRjaENvZGU+CisgIDxpZighTEVYRVIpPgorICBTdGF0ZS5FcnJvclJlY292ZXJ5IDo9IEZhbHNlOzxlbmRpZj4KKyAgPGlmKGJhY2t0cmFja2luZyk+U3RhdGUuRmFpbGVkIDo9IEZhbHNlOzxlbmRpZj4KK2VuZAorZWxzZQorYmVnaW4KKyAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgIEZFeGNlcHRpb24gOj0gRU1pc21hdGNoZWRTZXRFeGNlcHRpb24uQ3JlYXRlKG5pbCwgSW5wdXQpOworICA8QG1pc21hdGNoZWRTZXRFeGNlcHRpb24oKT4KKzxpZihMRVhFUik+CisgIFJlY292ZXIoRkV4Y2VwdGlvbik7CisgIHJhaXNlIEZFeGNlcHRpb247PFxuPgorPGVsc2U+CisgIHJhaXNlIEZFeGNlcHRpb247CisgIDwhIHVzZSBmb2xsb3dpbmcgY29kZSB0byBtYWtlIGl0IHJlY292ZXIgaW5saW5lOyByZW1vdmUgdGhyb3cgbXNlOworICBSZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoaW5wdXQsbXNlLEZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKyAgIT4KKzxlbmRpZj4KK2VuZDs8XG4+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldCA6Oj0gbWF0Y2hTZXQKKworbWF0Y2hTZXRBbmRMaXN0TGFiZWwocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIGEgc3RyaW5nIGxpdGVyYWwgKi8KK2xleGVyU3RyaW5nUmVmKHN0cmluZyxsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK0xvY2Fscy5Bc0ludGVnZXJbJzxsYWJlbD5TdGFydCddIDo9IENoYXJJbmRleDsKK01hdGNoKDxzdHJpbmc+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxsYWJlbD4gOj0gVENvbW1vblRva2VuLkNyZWF0ZShJbnB1dCwgVFRva2VuLklOVkFMSURfVE9LRU5fVFlQRSwgVFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwgTG9jYWxzLkFzSW50ZWdlclsnPGxhYmVsPlN0YXJ0J10sIENoYXJJbmRleC0xKTsKKzxlbHNlPgorTWF0Y2goPHN0cmluZz4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKword2lsZGNhcmQobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+IDo9IElucHV0LkxUKDEpIGFzIEk8bGFiZWxUeXBlPjs8XG4+Cis8ZW5kaWY+CitNYXRjaEFueShpbnB1dCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA6PSBJbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CitNYXRjaEFueSgpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKword2lsZGNhcmRDaGFyTGlzdExhYmVsKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkQ2hhciguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggYSBydWxlIHJlZmVyZW5jZSBieSBpbnZva2luZyBpdCBwb3NzaWJseSB3aXRoIGFyZ3VtZW50cworICogIGFuZCBhIHJldHVybiB2YWx1ZSBvciB2YWx1ZXMuICBUaGUgJ3J1bGUnIGFyZ3VtZW50IHdhcyB0aGUKKyAqICB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93IGlzIHR5cGUgUnVsZSwgd2hvc2UgdG9TdHJpbmcgaXMKKyAqICBzYW1lOiB0aGUgcnVsZSBuYW1lLiAgTm93IHRob3VnaCB5b3UgY2FuIGFjY2VzcyBmdWxsIHJ1bGUKKyAqICBkZXNjcmlwdG9yIHN0dWZmLgorICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorUHVzaEZvbGxvdyhGT0xMT1dfPHJ1bGUubmFtZT5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKzxpZihsYWJlbCk+Cis8bGFiZWw+IDo9IDxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+PHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7PFxuPgorPGVsc2U+Cis8aWYoc2NvcGUpPlQ8c2NvcGUucmVjb2duaXplck5hbWU+KElBTlRMUk9iamVjdCg8c2NvcGU6ZGVsZWdhdGVOYW1lKCk+KS5JbXBsZW1lbnRvcikuPGVuZGlmPjxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOzxcbj4KKzxlbmRpZj4KK1N0YXRlLkZvbGxvd2luZ1N0YWNrUG9pbnRlciA6PSBTdGF0ZS5Gb2xsb3dpbmdTdGFja1BvaW50ZXIgLSAxOworPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPXIgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogQSBsZXhlciBydWxlIHJlZmVyZW5jZS4KKyAqCisgKiAgVGhlICdydWxlJyBhcmd1bWVudCB3YXMgdGhlIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cKKyAqICBpcyB0eXBlIFJ1bGUsIHdob3NlIHRvU3RyaW5nIGlzIHNhbWU6IHRoZSBydWxlIG5hbWUuCisgKiAgTm93IHRob3VnaCB5b3UgY2FuIGFjY2VzcyBmdWxsIHJ1bGUgZGVzY3JpcHRvciBzdHVmZi4KKyAqLworbGV4ZXJSdWxlUmVmKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGlmKGxhYmVsKT4KK0xvY2Fscy5Bc0ludGVnZXJbJzxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+J10gOj0gQ2hhckluZGV4OworPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj5tPHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8bGFiZWw+IDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoSW5wdXQsIFRUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUsIFRUb2tlbi5ERUZBVUxUX0NIQU5ORUwsCisgIExvY2Fscy5Bc0ludGVnZXJbJzxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+J10sIENoYXJJbmRleCAtIDEpOworPGVsc2U+Cis8aWYoc2NvcGUpPig8c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LkltcGxlbWVudG9yIGFzIFQ8c2NvcGUucmVjb2duaXplck5hbWU+KS48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIGkrPUlOVCBpbiBsZXhlciAqLworbGV4ZXJSdWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGxleGVyUnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogRU9GIGluIHRoZSBsZXhlciAqLworbGV4ZXJNYXRjaEVPRihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK0xvY2Fscy5Bc0ludGVnZXJbJzxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+J10gOj0gQ2hhckluZGV4OworTWF0Y2goRU9GKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK0xvY2Fsc1snPGxhYmVsPiddIDo9IFRDb21tb25Ub2tlbi5DcmVhdGUoSW5wdXQsIEVPRiwgVFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwgTG9jYWxzLkFzSW50ZWdlclsnPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4nXSwgQ2hhckluZGV4LTEpOworPGVsc2U+CitNYXRjaChFT0YpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8cm9vdDplbGVtZW50KCk+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKElucHV0LkxBKDEpID0gVFRva2VuLkRPV04pIHRoZW4KK2JlZ2luCisgIE1hdGNoKElucHV0LCBUVG9rZW4uRE9XTiwgbmlsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgTWF0Y2goSW5wdXQsIFRUb2tlbi5VUCwgbmlsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK2VuZDsKKzxlbHNlPgorTWF0Y2goSW5wdXQsIFRUb2tlbi5ET1dOLCBuaWwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGNoaWxkcmVuOmVsZW1lbnQoKT4KK01hdGNoKElucHV0LCBUVG9rZW4uVVAsIG5pbCk7PFxuPjxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogRXZlcnkgcHJlZGljYXRlIGlzIHVzZWQgYXMgYSB2YWxpZGF0aW5nIHByZWRpY2F0ZSAoZXZlbiB3aGVuIGl0IGlzCisgKiAgYWxzbyBob2lzdGVkIGludG8gYSBwcmVkaWN0aW9uIGV4cHJlc3Npb24pLgorICovCit2YWxpZGF0ZVNlbWFudGljUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAoraWYgKG5vdCAoPGV2YWxQcmVkaWNhdGUoLi4uKT4pKSB0aGVuCitiZWdpbgorICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgcmFpc2UgRUZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbi5DcmVhdGUoSW5wdXQsICc8cnVsZU5hbWU+JywgJzxkZXNjcmlwdGlvbj4nKTsKK2VuZDs8XG4+Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitGTEFbPGRlY2lzaW9uTnVtYmVyPiw8c3RhdGVOdW1iZXI+XSA6PSBJbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KK2Vsc2UKK2JlZ2luCis8aWYoZW90UHJlZGljdHNBbHQpPgorICBBbHRbPGRlY2lzaW9uTnVtYmVyPl0gOj0gPGVvdFByZWRpY3RzQWx0Pjs8XG4+Cis8ZWxzZT4KKyAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgIHJhaXNlIEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5DcmVhdGUoJzxkZXNjcmlwdGlvbj4nLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCBJbnB1dCk7PFxuPgorPGVuZGlmPgorZW5kOworPj4KKworLyoqIFNhbWUgYXMgYSBub3JtYWwgREZBIHN0YXRlIGV4Y2VwdCB0aGF0IHdlIGRvbid0IGV4YW1pbmUgbG9va2FoZWFkCisgKiAgZm9yIHRoZSBieXBhc3MgYWx0ZXJuYXRpdmUuICBJdCBkZWxheXMgZXJyb3IgZGV0ZWN0aW9uIGJ1dCB0aGlzCisgKiAgaXMgZmFzdGVyLCBzbWFsbGVyLCBhbmQgbW9yZSB3aGF0IHBlb3BsZSBleHBlY3QuICBGb3IgKFgpPyBwZW9wbGUKKyAqICBleHBlY3QgImlmICggTEEoMSk9PVggKSBtYXRjaChYKTsiIGFuZCB0aGF0J3MgaXQuCisgKi8KK2RmYU9wdGlvbmFsQmxvY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitGTEFbPGRlY2lzaW9uTnVtYmVyPiw8c3RhdGVOdW1iZXI+XSA6PSBJbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj47Cis+PgorCisvKiogQSBERkEgc3RhdGUgdGhhdCBpcyBhY3R1YWxseSB0aGUgbG9vcGJhY2sgZGVjaXNpb24gb2YgYSBjbG9zdXJlCisgKiAgbG9vcC4gIElmIGVuZC1vZi10b2tlbiAoRU9UKSBwcmVkaWN0cyBhbnkgb2YgdGhlIHRhcmdldHMgdGhlbiBpdAorICogIHNob3VsZCBhY3QgbGlrZSBhIGRlZmF1bHQgY2xhdXNlIChpLmUuLCBubyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkKS4KKyAqICBUaGlzIGlzIHVzZWQgb25seSBpbiB0aGUgbGV4ZXIgc28gdGhhdCBmb3IgKCdhJykqIG9uIHRoZSBlbmQgb2YgYSBydWxlCisgKiAgYW55dGhpbmcgb3RoZXIgdGhhbiAnYScgcHJlZGljdHMgZXhpdGluZy4KKyAqLworZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitGTEFbPGRlY2lzaW9uTnVtYmVyPiw8c3RhdGVOdW1iZXI+XSA6PSBJbnB1dC5MQSg8az4pOworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPjs8XG4+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorPGlmKCFlZGdlcyk+CitBbHRbPGRlY2lzaW9uTnVtYmVyPl0gOj0gPGVvdFByZWRpY3RzQWx0PjsgPCEgaWYgbm8gZWRnZXMsIGRvbid0IGdlbiBFTFNFICE+Cis8ZWxzZT4KK2Vsc2UKK2JlZ2luCisgIEFsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSA8ZW90UHJlZGljdHNBbHQ+OworZW5kOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBBbiBhY2NlcHQgc3RhdGUgaW5kaWNhdGVzIGEgdW5pcXVlIGFsdGVybmF0aXZlIGhhcyBiZWVuIHByZWRpY3RlZCAqLworZGZhQWNjZXB0U3RhdGUoYWx0KSA6Oj0gIkFsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSA8YWx0PjsiCisKKy8qKiBBIHNpbXBsZSBlZGdlIHdpdGggYW4gZXhwcmVzc2lvbi4gIElmIHRoZSBleHByZXNzaW9uIGlzIHNhdGlzZmllZCwKKyAqICBlbnRlciB0byB0aGUgdGFyZ2V0IHN0YXRlLiAgVG8gaGFuZGxlIGdhdGVkIHByb2R1Y3Rpb25zLCB3ZSBtYXkKKyAqICBoYXZlIHRvIGV2YWx1YXRlIHNvbWUgcHJlZGljYXRlcyBmb3IgdGhpcyBlZGdlLgorICovCitkZmFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGUsIHByZWRpY2F0ZXMpIDo6PSA8PAoraWYgKCg8bGFiZWxFeHByPik8aWYocHJlZGljYXRlcyk+IGFuZCAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pIHRoZW4KK2JlZ2luCisgIDx0YXJnZXRTdGF0ZT4KK2VuZCA8ISBubyA7IGhlcmUgIT4KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChzd2l0Y2ggY2FzZSkKKworLyoqIEEgREZBIHN0YXRlIHdoZXJlIGEgU1dJVENIIG1heSBiZSBnZW5lcmF0ZWQuICBUaGUgY29kZSBnZW5lcmF0b3IKKyAqICBkZWNpZGVzIGlmIHRoaXMgaXMgcG9zc2libGU6IENvZGVHZW5lcmF0b3IuY2FuR2VuZXJhdGVTd2l0Y2goKS4KKyAqLworZGZhU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorY2FzZSBJbnB1dC5MQSg8az4pIG9mCisgIDxlZGdlczsgc2VwYXJhdG9yPSJcbiI+CitlbHNlCisgIGJlZ2luCis8aWYoZW90UHJlZGljdHNBbHQpPgorICAgIEFsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSA8ZW90UHJlZGljdHNBbHQ+OworPGVsc2U+CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorICAgIHJhaXNlIEVOb1ZpYWJsZUFsdEV4Y2VwdGlvbi5DcmVhdGUoJzxkZXNjcmlwdGlvbj4nLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCBJbnB1dCk7PFxuPgorPGVuZGlmPgorICBlbmQ7CitlbmQ7PFxuPgorPj4KKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK2Nhc2UgSW5wdXQuTEEoPGs+KSBvZgorICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorZW5kOzxcbj4KKz4+CisKK2RmYUxvb3BiYWNrU3RhdGVTd2l0Y2goaywgZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK2Nhc2UgSW5wdXQuTEEoPGs+KSBvZgorICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPjxcbj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitlbHNlCisgIEFsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSA8ZW90UHJlZGljdHNBbHQ+Ozxcbj4KKzxlbmRpZj4KK2VuZDs8XG4+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAorPGxhYmVsczp7PGl0Pn07IHNlcGFyYXRvcj0iLFxuIj46CisgIGJlZ2luCisgICAgPHRhcmdldFN0YXRlPgorICBlbmQ7Cis+PgorCisvLyBDIHkgYyBsIGkgYyAgRCBGIEEKKworLyoqIFRoZSBjb2RlIHRvIGluaXRpYXRlIGV4ZWN1dGlvbiBvZiBhIGN5Y2xpYyBERkE7IHRoaXMgaXMgdXNlZAorICogIGluIHRoZSBydWxlIHRvIHByZWRpY3QgYW4gYWx0IGp1c3QgbGlrZSB0aGUgZml4ZWQgREZBIGNhc2UuCisgKiAgVGhlIDxuYW1lPiBhdHRyaWJ1dGUgaXMgaW5oZXJpdGVkIHZpYSB0aGUgcGFyc2VyLCBsZXhlciwgLi4uCisgKi8KK2RmYURlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK0FsdFs8ZGVjaXNpb25OdW1iZXI+XSA6PSBGREZBPGRlY2lzaW9uTnVtYmVyPi5QcmVkaWN0KElucHV0KTsKKz4+CisKKy8qIER1bXAgREZBIHRhYmxlcy4KKyAqLworY3ljbGljREZBRGVjbGFyYXRpb24oZGZhKSA6Oj0gPDwKK3N0cmljdCBwcm90ZWN0ZWQKKyAgdHlwZQorICAgIFRERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA9IGNsYXNzKFRERkEpCisgICAgcHJvdGVjdGVkCisgICAgICB7IElERkEgfQorICAgICAgZnVuY3Rpb24gRGVzY3JpcHRpb246IFN0cmluZzsgb3ZlcnJpZGU7CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgQVJlY29nbml6ZXI6IElCYXNlUmVjb2duaXplcik7CisgICAgZW5kOworICB2YXIKKyAgICBGREZBPGRmYS5kZWNpc2lvbk51bWJlcj46IElERkE7Cis8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+CitzdHJpY3QgcHJvdGVjdGVkCisgIGZ1bmN0aW9uIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X1NwZWNpYWxTdGF0ZVRyYW5zaXRpb24oY29uc3QgREZBOiBJREZBOyBTOiBJbnRlZ2VyOworICAgIGNvbnN0IEFJbnB1dDogSUludFN0cmVhbSk6IEludGVnZXI7PGVuZGlmPgorPj4KKworY3ljbGljREZBKGRmYSkgOjo9IDw8Cit7IFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uVERGQTxkZmEuZGVjaXNpb25OdW1iZXI+IH0KKworY29uc3RydWN0b3IgVDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5UREZBPGRmYS5kZWNpc2lvbk51bWJlcj4uQ3JlYXRlKGNvbnN0IEFSZWNvZ25pemVyOiBJQmFzZVJlY29nbml6ZXIpOworY29uc3QKKyAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fRU9UID0gJzxkZmEuamF2YUNvbXByZXNzZWRFT1Q7IHdyYXA9IicrXG4gICAgJyI+JzsKKyAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fRU9GID0gJzxkZmEuamF2YUNvbXByZXNzZWRFT0Y7IHdyYXA9IicrXG4gICAgJyI+JzsKKyAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fTUlOID0gJzxkZmEuamF2YUNvbXByZXNzZWRNaW47IHdyYXA9IicrXG4gICAgJyI+JzsKKyAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fTUFYID0gJzxkZmEuamF2YUNvbXByZXNzZWRNYXg7IHdyYXA9IicrXG4gICAgJyI+JzsKKyAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fQUNDRVBUID0gJzxkZmEuamF2YUNvbXByZXNzZWRBY2NlcHQ7IHdyYXA9IicrXG4gICAgJyI+JzsKKyAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fU1BFQ0lBTCA9ICc8ZGZhLmphdmFDb21wcmVzc2VkU3BlY2lhbDsgd3JhcD0iJytcbiAgICAnIj4nOworICBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9UUkFOU0lUSU9OOiBhcnJheSBbMC4uPGxlbmd0aChkZmEuamF2YUNvbXByZXNzZWRUcmFuc2l0aW9uKT4tMV0gb2YgU3RyaW5nID0gKAorICAgIDxkZmEuamF2YUNvbXByZXNzZWRUcmFuc2l0aW9uOntzfCc8czsgd3JhcD0iJytcbiciPid9OyBzZXBhcmF0b3I9IixcbiI+KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIFJlY29nbml6ZXIgOj0gQVJlY29nbml6ZXI7CisgIERlY2lzaW9uTnVtYmVyIDo9IDxkZmEuZGVjaXNpb25OdW1iZXI+OworICBFT1QgOj0gVERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X0VPVCk7CisgIEVPRiA6PSBUREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fRU9GKTsKKyAgTWluIDo9IFRERkEuVW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9NSU4pOworICBNYXggOj0gVERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X01BWCk7CisgIEFjY2VwdCA6PSBUREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fQUNDRVBUKTsKKyAgU3BlY2lhbCA6PSBUREZBLlVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fU1BFQ0lBTCk7CisgIFRyYW5zaXRpb24gOj0gVERGQS5VbnBhY2tFbmNvZGVkU3RyaW5nQXJyYXkoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fVFJBTlNJVElPTik7CitlbmQ7CisKK2Z1bmN0aW9uIFQ8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uVERGQTxkZmEuZGVjaXNpb25OdW1iZXI+LkRlc2NyaXB0aW9uOiBTdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gJzxkZmEuZGVzY3JpcHRpb24+JzsKK2VuZDs8XG4+Cis8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+CitmdW5jdGlvbiBUPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+X1NwZWNpYWxTdGF0ZVRyYW5zaXRpb24oY29uc3QgREZBOiBJREZBOyBTOiBJbnRlZ2VyOworICBjb25zdCBBSW5wdXQ6IElJbnRTdHJlYW0pOiBJbnRlZ2VyOwordmFyCisgIExvY2FsczogVExvY2FsU3RvcmFnZTsKKyAgPGlmKExFWEVSKT4KKyAgSW5wdXQ6IElJbnRTdHJlYW07CisgIDxlbmRpZj4KKyAgPGlmKFBBUlNFUik+CisgIElucHV0OiBJVG9rZW5TdHJlYW07CisgIDxlbmRpZj4KKyAgPGlmKFRSRUVfUEFSU0VSKT4KKyAgSW5wdXQ6IElUcmVlTm9kZVN0cmVhbTsKKyAgPGVuZGlmPgorICBfUzogSW50ZWdlcjsKKyAgTlZBRTogRU5vVmlhYmxlQWx0RXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IC0xOworICBMb2NhbHMuSW5pdGlhbGl6ZTsKKyAgdHJ5CisgICAgPGlmKExFWEVSKT4KKyAgICBJbnB1dCA6PSBBSW5wdXQ7CisgICAgPGVuZGlmPgorICAgIDxpZihQQVJTRVIpPgorICAgIElucHV0IDo9IEFJbnB1dCBhcyBJVG9rZW5TdHJlYW07CisgICAgPGVuZGlmPgorICAgIDxpZihUUkVFX1BBUlNFUik+CisgICAgSW5wdXQgOj0gQUlucHV0IGFzIElUcmVlTm9kZVN0cmVhbTsKKyAgICA8ZW5kaWY+CisgICAgX1MgOj0gUzsKKyAgICBjYXNlIFMgb2YKKyAgICAgIDxkZmEuc3BlY2lhbFN0YXRlU1RzOntzdGF0ZSB8IDxpMD46IGJlZ2luPCEgY29tcHJlc3NlZCBzcGVjaWFsIHN0YXRlIG51bWJlcnMgMC4ubi0xICE+CisgICAgIDxzdGF0ZT4gPFxuPiAgIGVuZDt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICBlbmQ7Cis8aWYoYmFja3RyYWNraW5nKT4KKyAgICBpZiAoU3RhdGUuQmFja3RyYWNraW5nID4gMCkgdGhlbgorICAgIGJlZ2luCisgICAgICBTdGF0ZS5GYWlsZWQgOj0gVHJ1ZTsKKyAgICAgIEV4aXQoLTEpOworICAgIGVuZDs8XG4+Cis8ZW5kaWY+CisgICAgTlZBRSA6PSBFTm9WaWFibGVBbHRFeGNlcHRpb24uQ3JlYXRlKERGQS5EZXNjcmlwdGlvbiwgPGRmYS5kZWNpc2lvbk51bWJlcj4sIF9TLCBJbnB1dCk7CisgICAgREZBLkVycm9yKE5WQUUpOworICAgIHJhaXNlIE5WQUU7CisgIGZpbmFsbHkKKyAgICBMb2NhbHMuRmluYWxpemU7CisgIGVuZDsKK2VuZDs8XG4+Cis8ZW5kaWY+Cis+PgorCisvKiogQSBzdGF0ZSBpbiBhIGN5Y2xpYyBERkE7IGl0J3MgYSBzcGVjaWFsIHN0YXRlIGFuZCBwYXJ0IG9mIGEgYmlnIHN3aXRjaCBvbgorICogIHN0YXRlLgorICovCitjeWNsaWNERkFTdGF0ZShkZWNpc2lvbk51bWJlcixzdGF0ZU51bWJlcixlZGdlcyxuZWVkRXJyb3JDbGF1c2Usc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK0ZMQVs8ZGVjaXNpb25OdW1iZXI+LDxzdGF0ZU51bWJlcj5dIDo9IElucHV0LkxBKDEpOzxcbj4KKzxpZihzZW1QcmVkU3RhdGUpPiA8ISBnZXQgbmV4dCBsb29rYWhlYWQgc3ltYm9sIHRvIHRlc3QgZWRnZXMsIHRoZW4gcmV3aW5kICE+CitMb2NhbHMuQXNJbnRlZ2VyWydpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiddIDo9IElucHV0LkluZGV4OworSW5wdXQuUmV3aW5kOzxcbj4KKzxlbmRpZj4KK1MgOj0gLTE7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+OworPGlmKHNlbVByZWRTdGF0ZSk+IDwhIHJldHVybiBpbnB1dCBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIHdlIHJld291bmQgIT4KK0lucHV0LlNlZWsoTG9jYWxzLkFzSW50ZWdlclsnaW5kZXg8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4nXSk7PFxuPgorPGVuZGlmPgoraWYgKFMgPj0gMCkgdGhlbgorICBFeGl0KFMpOworPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rYWhlYWQgYW5kIGluZGljYXRlIHdoYXQKKyAqICBzdGF0ZSB0byBqdW1wIHRvIG5leHQgaWYgc3VjY2Vzc2Z1bC4KKyAqLworY3ljbGljREZBRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlTnVtYmVyLCBlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICgoPGxhYmVsRXhwcj4pPGlmKHByZWRpY2F0ZXMpPiBhbmQgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB0aGVuCisgIFMgOj0gPHRhcmdldFN0YXRlTnVtYmVyPgorPj4KKworLyoqIEFuIGVkZ2UgcG9pbnRpbmcgYXQgZW5kLW9mLXRva2VuOyBlc3NlbnRpYWxseSBtYXRjaGVzIGFueSBjaGFyOworICogIGFsd2F5cyBqdW1wIHRvIHRoZSB0YXJnZXQuCisgKi8KK2VvdERGQUVkZ2UodGFyZ2V0U3RhdGVOdW1iZXIsZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitTIDo9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPgorPj4KKworCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoKDxsZWZ0PikgYW5kICg8cmlnaHQ+KSkiCisKK29yUHJlZGljYXRlcyhvcGVyYW5kcykgOjo9ICIoKDxmaXJzdChvcGVyYW5kcyk+KTxyZXN0KG9wZXJhbmRzKTp7byB8IG9yICg8bz4pfT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxldmFsUHJlZGljYXRlKC4uLik+KSIKKworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIig8cHJlZD4pIgorCitldmFsU3luUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiPHByZWQ+KCkiCisKK2xvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICJGTEFbPGRlY2lzaW9uTnVtYmVyPiw8c3RhdGVOdW1iZXI+XSA9IDxhdG9tQXNJbnQ+IgorCisvKiogU29tZXRpbWVzIGEgbG9va2FoZWFkIHRlc3QgY2Fubm90IGFzc3VtZSB0aGF0IExBKGspIGlzIGluIGEgdGVtcCB2YXJpYWJsZQorICogIHNvbWV3aGVyZS4gIE11c3QgYXNrIGZvciB0aGUgbG9va2FoZWFkIGRpcmVjdGx5LgorICovCitpc29sYXRlZExvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICJJbnB1dC5MQSg8az4pID0gPGF0b21Bc0ludD4iCisKK2xvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9IDw8CisoKEZMQVs8ZGVjaXNpb25OdW1iZXI+LDxzdGF0ZU51bWJlcj5dIFw+PSA8bG93ZXJBc0ludD4pIGFuZCAoRkxBWzxkZWNpc2lvbk51bWJlcj4sPHN0YXRlTnVtYmVyPl0gXDw9IDx1cHBlckFzSW50PikpCis+PgorCitpc29sYXRlZExvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9ICIoSW5wdXQuTEEoPGs+KSBcPj0gPGxvd2VyQXNJbnQ+KSBhbmQgKElucHV0LkxBKDxrPikgXDw9IDx1cHBlckFzSW50PikiCisKK3NldFRlc3QocmFuZ2VzKSA6Oj0gIjxyYW5nZXM7IHNlcGFyYXRvcj1cIikgb3IgKFwiPiIKKworLy8gQSBUIFQgUiBJIEIgVSBUIEUgUworCitnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDw8Cis8c2NvcGUubmFtZT5TdGFjayA6PSBUU3RhY2tMaXN0XDxJPHNjb3BlLm5hbWU+U2NvcGVcPi5DcmVhdGU7PFxuPgorPGVuZGlmPgorPj4KKworZ2xvYmFsQXR0cmlidXRlU2NvcGVEZWNsYXJhdGlvbihzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+CitzdHJpY3QgcHJvdGVjdGVkCisgIHR5cGUKKyAgICBJPHNjb3BlLm5hbWU+U2NvcGUgPSBpbnRlcmZhY2UoSUFOVExST2JqZWN0KQorICAgIGVuZDsKKyAgICBUPHNjb3BlLm5hbWU+U2NvcGUgPSBjbGFzcyhUQU5UTFJPYmplY3QsIEk8c2NvcGUubmFtZT5TY29wZSkKKyAgICBwcm90ZWN0ZWQKKyAgICAgIDxzY29wZS5hdHRyaWJ1dGVzOns8aXQubmFtZT46IDxpdC50eXBlPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICBlbmQ7CitzdHJpY3QgcHJvdGVjdGVkCisgIDxzY29wZS5uYW1lPlN0YWNrOiBJU3RhY2tMaXN0XDxJPHNjb3BlLm5hbWU+U2NvcGVcPjsKKzxlbmRpZj4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZURlY2xhcmF0aW9uKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK3N0cmljdCBwcm90ZWN0ZWQKKyAgdHlwZQorICAgIEk8c2NvcGUubmFtZT5TY29wZSA9IGludGVyZmFjZShJQU5UTFJPYmplY3QpCisgICAgZW5kOworICAgIFQ8c2NvcGUubmFtZT5TY29wZSA9IGNsYXNzKFRBTlRMUk9iamVjdCwgSTxzY29wZS5uYW1lPlNjb3BlKQorICAgIHByb3RlY3RlZAorICAgICAgPHNjb3BlLmF0dHJpYnV0ZXM6ezxpdC5uYW1lPjogPGl0LnR5cGU+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIGVuZDsKK3N0cmljdCBwcm90ZWN0ZWQKKyAgPHNjb3BlLm5hbWU+U3RhY2s6IElTdGFja0xpc3RcPEk8c2NvcGUubmFtZT5TY29wZVw+OworPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzwhIHByb3RlY3RlZCBTdGFjayA8c2NvcGUubmFtZT5TdGFjayA9IG5ldyBTdGFjaygpOzxcbj4gIT4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZUluaXQoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlKT4KKzxzY29wZS5uYW1lPlN0YWNrIDo9IFRTdGFja0xpc3RcPEk8c2NvcGUubmFtZT5TY29wZVw+LkNyZWF0ZTs8XG4+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5TdHJ1Y3ROYW1lKCkgOjo9ICI8aXQubmFtZT5fcmV0dXJuIgorCityZXR1cm5UeXBlKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4KKzwhIEk8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZWxzZT5QYXJzZXI8ZW5kaWY+UnVsZVJldHVyblNjb3BlICE+Cis8ZWxzZT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+Cis8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5UeXBlPgorPGVsc2U+Cis8ISBQb2ludGVyL3ZvaWQgIT4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBHZW5lcmF0ZSB0aGUgQyMgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgb3IgbXVsdGlwbGUgcmV0dXJuCisgKiAgdmFsdWVzLgorICovCitydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlKSA6Oj0gPDwKKzxpZihyZWZlcmVuY2VkUnVsZS5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitJPHJlZmVyZW5jZWRSdWxlLm5hbWU+X3JldHVybgorPGVsc2U+Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJlZmVyZW5jZWRSdWxlLnNpbmdsZVZhbHVlUmV0dXJuVHlwZT4KKzxlbHNlPgordm9pZAorPGVuZGlmPgorPGVuZGlmPgorPj4KKworZGVsZWdhdGVOYW1lKCkgOjo9IDw8Cis8aWYoaXQubGFiZWwpPjxpdC5sYWJlbD48ZWxzZT5nPGl0Lm5hbWU+PGVuZGlmPgorPj4KKworLyoqIFVzaW5nIGEgdHlwZSB0byBpbml0IHZhbHVlIG1hcCwgdHJ5IHRvIGluaXQgYSB0eXBlOyBpZiBub3QgaW4gdGFibGUKKyAqICBtdXN0IGJlIGFuIG9iamVjdCwgZGVmYXVsdCB2YWx1ZSBpcyAibnVsbCIuCisgKi8KK2luaXRWYWx1ZSh0eXBlTmFtZSkgOjo9IDw8Cis8Y3NoYXJwVHlwZUluaXRNYXAuKHR5cGVOYW1lKT4KKz4+CisKKy8qKiBEZWZpbmUgYSBydWxlIGxhYmVsIGluY2x1ZGluZyBkZWZhdWx0IHZhbHVlICovCitydWxlTGFiZWxEZWYobGFiZWwpIDo6PSA8PAorPGxhYmVsLmxhYmVsLnRleHQ+IDo9IDxpbml0VmFsdWUodHlwZU5hbWU9cnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZT1sYWJlbC5yZWZlcmVuY2VkUnVsZSkpPjs8XG4+Cis+PgorCitydWxlTGFiZWxEZWZWYXIobGFiZWwpIDo6PSA8PAorPGxhYmVsLmxhYmVsLnRleHQ+OiA8cnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZT1sYWJlbC5yZWZlcmVuY2VkUnVsZSk+OworPj4KKworLyoqIERlZmluZSBhIHJldHVybiBzdHJ1Y3QgZm9yIGEgcnVsZSBpZiB0aGUgY29kZSBuZWVkcyB0byBhY2Nlc3MgaXRzCisgKiAgc3RhcnQvc3RvcCB0b2tlbnMsIHRyZWUgc3R1ZmYsIGF0dHJpYnV0ZXMsIC4uLiAgTGVhdmUgYSBob2xlIGZvcgorICogIHN1Ymdyb3VwcyB0byBzdGljayBpbiBtZW1iZXJzLgorICovCityZXR1cm5TY29wZShzY29wZSkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgoreyBUPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4gfQorCis8c2NvcGUuYXR0cmlidXRlczp7cHVibGljIDxpdC5kZWNsPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxAcnVsZVJldHVybk1lbWJlcnMoKT4KKzxlbmRpZj4KKz4+CisKK3JldHVyblNjb3BlRGVjbGFyYXRpb24oc2NvcGUpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3B1YmxpYworICB0eXBlCisgICAgVDxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+ID0gY2xhc3MoVDxpZihUUkVFX1BBUlNFUik+VHJlZTxlbHNlPlBhcnNlcjxlbmRpZj5SdWxlUmV0dXJuU2NvcGUsIEk8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPikKKyAgICA8c2NvcGUuYXR0cmlidXRlczp7cHVibGljIDxpdC5kZWNsPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8QHJ1bGVSZXR1cm5NZW1iZXJzKCk+CisgICAgZW5kOworPGVuZGlmPgorPj4KKworcGFyYW1ldGVyU2NvcGUoc2NvcGUpIDo6PSA8PAorPHNjb3BlLmF0dHJpYnV0ZXM6ezxpdC5kZWNsPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSAiPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+IDo9IDxleHByPjsiCisKK3Njb3BlQXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8PAorPGlmKG5lZ0luZGV4KT4KKyg8c2NvcGU+U3RhY2tbPHNjb3BlPlN0YWNrLkNvdW50LTxuZWdJbmRleD4tMV0gYXMgVDxzY29wZT5TY29wZSkuPGF0dHIubmFtZT4KKzxlbHNlPgorPGlmKGluZGV4KT4KKyg8c2NvcGU+U3RhY2tbPGluZGV4Pl0gYXMgVDxzY29wZT5TY29wZSkuPGF0dHIubmFtZT4KKygoPHNjb3BlPl9zY29wZSk8c2NvcGU+X3N0YWNrWzxpbmRleD5dKS48YXR0ci5uYW1lPgorPGVsc2U+CisoPHNjb3BlPlN0YWNrLlBlZWsuSW1wbGVtZW50b3IgYXMgVDxzY29wZT5TY29wZSkuPGF0dHIubmFtZT4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3Njb3BlU2V0QXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsZXhwcixpbmRleCxuZWdJbmRleCkgOjo9IDw8Cis8aWYobmVnSW5kZXgpPgorKDxzY29wZT5TdGFja1s8c2NvcGU+U3RhY2suQ291bnQtPG5lZ0luZGV4Pi0xXSBhcyBUPHNjb3BlPlNjb3BlKS48YXR0ci5uYW1lPiA6PSA8ZXhwcj47PFxuPgorPGVsc2U+Cis8aWYoaW5kZXgpPgorKDxzY29wZT5TdGFja1s8aW5kZXg+XSBhcyBUPHNjb3BlPlNjb3BlKS48YXR0ci5uYW1lPiA6PSA8ZXhwcj47PFxuPgorPGVsc2U+CisoPHNjb3BlPlN0YWNrLlBlZWsuSW1wbGVtZW50b3IgYXMgVDxzY29wZT5TY29wZSkuPGF0dHIubmFtZT4gOj0gPGV4cHI+Ozxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiAkeCBpcyBlaXRoZXIgZ2xvYmFsIHNjb3BlIG9yIHggaXMgcnVsZSB3aXRoIGR5bmFtaWMgc2NvcGU7IHJlZmVycworICogIHRvIHN0YWNrIGl0c2VsZiBub3QgdG9wIG9mIHN0YWNrLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByZWRpY2F0ZXMKKyAqICBsaWtlIHskZnVuY3Rpb24uc2l6ZSgpPjAgJiYgJGZ1bmN0aW9uOjpuYW1lLmVxdWFscygiZm9vIil9PworICovCitpc29sYXRlZER5bmFtaWNTY29wZVJlZihzY29wZSkgOjo9ICI8c2NvcGU+U3RhY2siCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorKElmVGhlbihBc3NpZ25lZCg8c2NvcGU+KSxEZWYoPHNjb3BlPikuPGF0dHIubmFtZT4sPGluaXRWYWx1ZShhdHRyLnR5cGUpPikpCis8ZWxzZT4KKzxzY29wZT4KKzxlbmRpZj4KKz4+CisKK3JldHVybkF0dHJpYnV0ZVJlZihydWxlRGVzY3JpcHRvcixhdHRyKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitSZXRWYWwuPGF0dHIubmFtZT4KKzxlbHNlPgorPGF0dHIubmFtZT4KKzxlbmRpZj4KKz4+CisKK3JldHVyblNldEF0dHJpYnV0ZVJlZihydWxlRGVzY3JpcHRvcixhdHRyLGV4cHIpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK1JldFZhbC48YXR0ci5uYW1lPiA6PSA8ZXhwcj47Cis8ZWxzZT4KKzxhdHRyLm5hbWU+IDo9IDxleHByPjsKKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdHJhbnNsYXRlICR0b2tlbkxhYmVsICovCit0b2tlbkxhYmVsUmVmKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0XzxsYWJlbD4iCisKKworLy8gbm90IHN1cmUgdGhlIG5leHQgYXJlIHRoZSByaWdodCBhcHByb2FjaAorCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIihEZWYoPHNjb3BlPikuVGV4dCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIihEZWYoPHNjb3BlPikuVG9rZW5UeXBlKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiKERlZig8c2NvcGU+KS5MaW5lKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICIoRGVmKDxzY29wZT4pLkNoYXJQb3NpdGlvbkluTGluZSkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIihEZWYoPHNjb3BlPikuQ2hhbm5lbCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoRGVmKDxzY29wZT4pLlRva2VuSW5kZXgpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+X3RyZWUiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiKFN0clRvSW50RGVmKERlZig8c2NvcGU+KS5UZXh0LDApKSIKKworcnVsZUxhYmVsUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICIoSWZUaGVuKEFzc2lnbmVkKDxzY29wZT4pLCBEZWYoPHNjb3BlPikuU3RhcnQsIG5pbCkgYXMgSTxsYWJlbFR5cGU+KSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoRGVmKDxzY29wZT4pLlN0b3AgYXMgSTxsYWJlbFR5cGU+KSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICIoRGVmKERlZig8c2NvcGU+KS5UcmVlIGFzIEk8QVNUTGFiZWxUeXBlPikpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CitJZlRoZW4oQXNzaWduZWQoPHNjb3BlPiksIElucHV0LlRva2VuU3RyZWFtLlRvU3RyaW5nKAorICBJbnB1dC5UcmVlQWRhcHRvci5HZXRUb2tlblN0YXJ0SW5kZXgoRGVmKDxzY29wZT4pLlN0YXJ0KSwKKyAgSW5wdXQuVHJlZUFkYXB0b3IuR2V0VG9rZW5TdG9wSW5kZXgoRGVmKDxzY29wZT4pLlN0YXJ0KSksICcnKQorPGVsc2U+CitJZlRoZW4oQXNzaWduZWQoPHNjb3BlPiksIElucHV0LlRvU3RyaW5nKAorICAoRGVmKDxzY29wZT4pLlN0YXJ0KSBhcyBJVG9rZW4sKERlZig8c2NvcGU+KS5TdG9wKSBhcyBJVG9rZW4pLCAnJykKKzxlbmRpZj4KKz4+CitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gIigoPHNjb3BlPiAhPSBudWxsKSA/IDxzY29wZT4uU1QgOiBudWxsKSIKKworLyoqIElzb2xhdGVkICRSVUxFIHJlZiBvayBpbiBsZXhlciBhcyBpdCdzIGEgVG9rZW4gKi8KK2xleGVyUnVsZUxhYmVsKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIihEZWYoPHNjb3BlPikuVG9rZW5UeXBlKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gIihEZWYoPHNjb3BlPikuTGluZSkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0gIihJZlRoZW4oQXNzaWduZWQoPHNjb3BlPiksRGVmKDxzY29wZT4pLkNoYXJQb3NpdGlvbkluTGluZSwtMSkpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKERlZig8c2NvcGU+KS5DaGFubmVsKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoRGVmKDxzY29wZT4pLlRva2VuSW5kZXgpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiKERlZig8c2NvcGU+KS5UZXh0KSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiKFN0clRvSW50RGVmKERlZig8c2NvcGU+KS5UZXh0LDApKSIKKworLy8gU29tZWJvZHkgbWF5IHJlZiAkdGVtcGxhdGUgb3IgJHRyZWUgb3IgJHN0b3Agd2l0aGluIGEgcnVsZToKK3J1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIihSZXRWYWwuU3RhcnQgYXMgSTxsYWJlbFR5cGU+KSIKK3J1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKFJldFZhbC5TdG9wIGFzIEk8bGFiZWxUeXBlPikiCitydWxlUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIihSZXRWYWwuVHJlZSBhcyBJPEFTVExhYmVsVHlwZT4pIgorcnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorSW5wdXQuVG9rZW5TdHJlYW0uVG9TdHJpbmcoCisgIElucHV0LlRyZWVBZGFwdG9yLkdldFRva2VuU3RhcnRJbmRleChSZXRWYWwuU3RhcnQpLAorICBJbnB1dC5UcmVlQWRhcHRvci5HZXRUb2tlblN0b3BJbmRleChSZXRWYWwuU3RhcnQpKQorPGVsc2U+CitJbnB1dC5Ub1N0cmluZyhSZXRWYWwuU3RhcnQgYXMgSVRva2VuLElucHV0LkxUKC0xKSkKKzxlbmRpZj4KKz4+CitydWxlUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICJSZXRWYWwuU1QiCisKK2xleGVyUnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJUZXh0IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIlRva2VuVHlwZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICJTdGF0ZS5Ub2tlblN0YXJ0TGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0gIlN0YXRlLlRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIi0xIiAvLyB1bmRlZmluZWQgdG9rZW4gaW5kZXggaW4gbGV4ZXIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICJDaGFubmVsIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICJTdGF0ZS5Ub2tlblN0YXJ0Q2hhckluZGV4IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihDaGFySW5kZXgtMSkiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9ICJTdHJUb0ludCg8c2NvcGU+LlRleHQpIgorCisvLyBzZXR0aW5nICRzdCBhbmQgJHRyZWUgaXMgYWxsb3dlZCBpbiBsb2NhbCBydWxlLiBldmVyeXRoaW5nIGVsc2UKKy8vIGlzIGZsYWdnZWQgYXMgZXJyb3IKK3J1bGVTZXRQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIsZXhwcikgOjo9ICJSZXRWYWwuVHJlZSA6PSA8ZXhwcj47IgorcnVsZVNldFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJSZXRWYWwuU1QgOj0gPGV4cHI+OyIKKworCisvKiogSG93IHRvIGV4ZWN1dGUgYW4gYWN0aW9uIChvbmx5IHdoZW4gbm90IGJhY2t0cmFja2luZykgKi8KK2V4ZWNBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZSk+CitpZiAoPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4pIHRoZW4KK2JlZ2luCisgIDxhY3Rpb24+CitlbmQ7Cis8ZWxzZT4KK2lmIChTdGF0ZS5CYWNrdHJhY2tpbmcgPSAwKSB0aGVuCitiZWdpbgorICA8YWN0aW9uPgorZW5kOzxcbj4KKzxlbmRpZj4KKzxlbHNlPgorPGFjdGlvbj4KKzxlbmRpZj4KKz4+CisKKworLyoqIEhvdyB0byBhbHdheXMgZXhlY3V0ZSBhbiBhY3Rpb24gZXZlbiB3aGVuIGJhY2t0cmFja2luZyAqLworZXhlY0ZvcmNlZEFjdGlvbihhY3Rpb24pIDo6PSAiPGFjdGlvbj4iCisKKy8vIE0gSSBTIEMgKHByb3BlcnRpZXMsIGV0Yy4uLikKKworYml0c2V0KG5hbWUsIHdvcmRzNjQpIDo6PSA8PAorPG5hbWU+IDo9IFRCaXRTZXQuQ3JlYXRlKFs8d29yZHM2NDp7PGl0Pn07c2VwYXJhdG9yPSIsIj5dKTs8XG4+Cis+PgorCitiaXRzZXREZWNsKG5hbWUpIDo6PSA8PAorPG5hbWU+OiBJQml0U2V0Ozxcbj4KKz4+CisKK2NvZGVGaWxlRXh0ZW5zaW9uKCkgOjo9ICIucGFzIgorCit0cnVlKCkgOjo9ICJUcnVlIgorZmFsc2UoKSA6Oj0gIkZhbHNlIgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0FTVC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNULnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY2NzFhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0FTVC5zdGcKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCitAb3V0cHV0RmlsZS5pbXBvcnRzKCkgOjo9IDw8Cis8QHN1cGVyLmltcG9ydHMoKT4KKzxpZighVFJFRV9QQVJTRVIpPjwhIHRyZWUgcGFyc2VyIHdvdWxkIGFscmVhZHkgaGF2ZSBpbXBvcnRlZCAhPgoraW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjs8XG4+Cis8ZW5kaWY+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8QHN1cGVyLm1lbWJlcnMoKT4KKzxwYXJzZXJNZW1iZXJzKCk+Cis+PgorCisvKiogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK3BhcnNlck1lbWJlcnMoKSA6Oj0gPDwKK3Byb3RlY3RlZCBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7PFxuPgorcHVibGljIHZvaWQgc2V0VHJlZUFkYXB0b3IoVHJlZUFkYXB0b3IgYWRhcHRvcikgeworICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPi5zZXRUcmVlQWRhcHRvcih0aGlzLmFkYXB0b3IpO30+Cit9CitwdWJsaWMgVHJlZUFkYXB0b3IgZ2V0VHJlZUFkYXB0b3IoKSB7CisgICAgcmV0dXJuIGFkYXB0b3I7Cit9Cis+PgorCitAcmV0dXJuU2NvcGUucnVsZVJldHVybk1lbWJlcnMoKSA6Oj0gPDwKKzxBU1RMYWJlbFR5cGU+IHRyZWU7CitwdWJsaWMgT2JqZWN0IGdldFRyZWUoKSB7IHJldHVybiB0cmVlOyB9Cis+PgorCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgcnVsZSdzIHJldHVybiBBU1QgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+Cis8QVNUTGFiZWxUeXBlPiByb290XzAgPSBudWxsOzxcbj4KKz4+CisKK3J1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlTGFiZWxEZWZzKCk+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscywKKyAgcnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGlzdExhYmVsc106e2l0IHwgPEFTVExhYmVsVHlwZT4gPGl0LmxhYmVsLnRleHQ+X3RyZWU9bnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHM6e2l0IHwgPEFTVExhYmVsVHlwZT4gPGl0LmxhYmVsLnRleHQ+X3RyZWU9bnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2l0IHwgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+Iik7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IuYWxsUnVsZVJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2l0IHwgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSA8aXQ+Iik7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCisvKiogV2hlbiBkb2luZyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24sIHdlIG11c3QgZGVmaW5lIHNvbWUgdmFyaWFibGVzOworICogIFRoZXNlIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGlmIGRvaW5nIHJld3JpdGVzLiAgVGhpcyBtdXN0IGJlIGEgIm1vZGUiCisgKiAgYXMgYSBydWxlIGNvdWxkIGhhdmUgYm90aCByZXdyaXRlIGFuZCBBU1Qgd2l0aGluIHRoZSBzYW1lIGFsdGVybmF0aXZlCisgKiAgYmxvY2suCisgKi8KK0BhbHQuZGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYoYXV0b0FTVCk+Cis8aWYob3V0ZXJBbHQpPgorPGlmKCFyZXdyaXRlTW9kZSk+Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5uaWwoKTs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvLyBUIHIgYSBjIGsgaSBuIGcgIFIgdSBsIGUgIEUgbCBlIG0gZSBuIHQgcworCisvKiogSUQgYW5kIHRyYWNrIGl0IGZvciB1c2UgaW4gYSByZXdyaXRlIHJ1bGUgKi8KK3Rva2VuUmVmVHJhY2sodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+IDwhIFRyYWNrIGltcGxpZXMgbm8gYXV0byBBU1QgY29uc3RydWN0aW9uIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+c3RyZWFtXzx0b2tlbj4uYWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBpZHMrPUlEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlOyBhZGRzIHRvIGlkcyAqYW5kKgorICogIHRvIHRoZSB0cmFja2luZyBsaXN0IHN0cmVhbV9JRCBmb3IgdXNlIGluIHRoZSByZXdyaXRlLgorICovCit0b2tlblJlZlRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwgLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgdHJhY2sgZm9yIHJld3JpdGUgKi8KK3Rva2VuUmVmUnVsZVJvb3RUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+c3RyZWFtXzx0b2tlbj4uYWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsIC4uLik+Cis+PgorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5zdHJlYW1fPHJ1bGUubmFtZT4uYWRkKDxsYWJlbD4uZ2V0VHJlZSgpKTsKKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWwobGFiZWwsIHs8bGFiZWw+LmdldFRyZWUoKX0pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5zdHJlYW1fPHJ1bGU+LmFkZCg8bGFiZWw+LmdldFRyZWUoKSk7Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290VHJhY2soLi4uKT4KKzxsaXN0TGFiZWwobGFiZWwsIHs8bGFiZWw+LmdldFRyZWUoKX0pPgorPj4KKworLy8gUiBlIHcgciBpIHQgZQorCityZXdyaXRlQ29kZSgKKwlhbHRzLCBkZXNjcmlwdGlvbiwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBBTEwgcmVmZXJlbmNlZCBlbGVtZW50cyB0byByaWdodCBvZiAtPgorCXJlZmVyZW5jZWRUb2tlbkxhYmVscywKKwlyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzLAorCXJlZmVyZW5jZWRSdWxlTGFiZWxzLAorCXJlZmVyZW5jZWRSdWxlTGlzdExhYmVscywKKwlyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMsCisJcmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVscywKKwlyZXdyaXRlQmxvY2tMZXZlbCwgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PQorPDwKKworLy8gQVNUIFJFV1JJVEUKKy8vIGVsZW1lbnRzOiA8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDsgc2VwYXJhdG9yPSIsICI+CisvLyB0b2tlbiBsYWJlbHM6IDxyZWZlcmVuY2VkVG9rZW5MYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorLy8gcnVsZSBsYWJlbHM6IDxyZWZlcmVuY2VkUnVsZUxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyB0b2tlbiBsaXN0IGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorLy8gcnVsZSBsaXN0IGxhYmVsczogPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyB3aWxkY2FyZCBsYWJlbHM6IDxbcmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzLHJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHNdOyBzZXBhcmF0b3I9IiwgIj4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8XG4+Cis8ZW5kaWY+Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzA7Cis8cmV3cml0ZUNvZGVMYWJlbHMoKT4KK3Jvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLm5pbCgpOworPGFsdHM6cmV3cml0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKzwhIGlmIHRyZWUgcGFyc2VyIGFuZCByZXdyaXRlPXRydWUgIT4KKzxpZihUUkVFX1BBUlNFUik+Cis8aWYocmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7CitpbnB1dC5yZXBsYWNlQ2hpbGRyZW4oYWRhcHRvci5nZXRQYXJlbnQocmV0dmFsLnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmdldENoaWxkSW5kZXgocmV0dmFsLnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBhZGFwdG9yLmdldENoaWxkSW5kZXgoX2xhc3QpLAorICAgICAgICAgICAgICAgICAgICAgIHJldHZhbC50cmVlKTsKKzxlbmRpZj4KKzxlbmRpZj4KKzwhIGlmIHBhcnNlciBvciB0cmVlLXBhcnNlciAmJiByZXdyaXRlIT10cnVlLCB3ZSBuZWVkIHRvIHNldCByZXN1bHQgIT4KKzxpZighVFJFRV9QQVJTRVIpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gcm9vdF8wOworPGVsc2U+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4udHJlZSA9IHJvb3RfMDsKKzxlbmRpZj4KKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPgorfQorPGVuZGlmPgorPj4KKworcmV3cml0ZUNvZGVMYWJlbHMoKSA6Oj0gPDwKKzxyZWZlcmVuY2VkVG9rZW5MYWJlbHMKKyAgICA6e2l0IHwgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShhZGFwdG9yLCJ0b2tlbiA8aXQ+Iiw8aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVscworICAgIDp7aXQgfCBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtKGFkYXB0b3IsInRva2VuIDxpdD4iLCBsaXN0XzxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMKKyAgICA6e2l0IHwgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwid2lsZGNhcmQgPGl0PiIsPGl0Pik7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHMKKyAgICA6e2l0IHwgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwid2lsZGNhcmQgPGl0PiIsbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMYWJlbHMKKyAgICA6e2l0IHwgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+PW5ldyBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oYWRhcHRvciwicnVsZSA8aXQ+Iiw8aXQ+IT1udWxsPzxpdD4udHJlZTpudWxsKTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzCisgICAgOntpdCB8IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSBzdHJlYW1fPGl0Pj1uZXcgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKGFkYXB0b3IsInRva2VuIDxpdD4iLGxpc3RfPGl0Pik7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworLyoqIEdlbmVyYXRlIGNvZGUgZm9yIGFuIG9wdGlvbmFsIHJld3JpdGUgYmxvY2s7IG5vdGUgaXQgdXNlcyB0aGUgZGVlcCByZWYnZCBlbGVtZW50CisgICogIGxpc3QgcmF0aGVyIHNoYWxsb3cgbGlrZSBvdGhlciBibG9ja3MuCisgICovCityZXdyaXRlT3B0aW9uYWxCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAvLyBlbGVtZW50cyBpbiBpbW1lZGlhdGVseSBibG9jazsgbm8gbmVzdGVkIGJsb2NrcworCWRlc2NyaXB0aW9uKSA6Oj0KKzw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK2lmICggPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dCgpfTsgc2VwYXJhdG9yPSJ8fCI+ICkgeworICAgIDxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDp7ZWwgfCBzdHJlYW1fPGVsPi5yZXNldCgpOzxcbj59PgorPj4KKworcmV3cml0ZUNsb3N1cmVCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAvLyBlbGVtZW50cyBpbiBpbW1lZGlhdGVseSBibG9jazsgbm8gbmVzdGVkIGJsb2NrcworCWRlc2NyaXB0aW9uKSA6Oj0KKzw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3doaWxlICggPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5oYXNOZXh0KCl9OyBzZXBhcmF0b3I9Inx8Ij4gKSB7CisgICAgPGFsdD4KK30KKzxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4ucmVzZXQoKTs8XG4+fT4KKz4+CisKK3Jld3JpdGVQb3NpdGl2ZUNsb3N1cmVCbG9jaygKKwlhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisJcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisJcmVmZXJlbmNlZEVsZW1lbnRzLCAvLyBlbGVtZW50cyBpbiBpbW1lZGlhdGVseSBibG9jazsgbm8gbmVzdGVkIGJsb2NrcworCWRlc2NyaXB0aW9uKSA6Oj0KKzw8CitpZiAoICEoPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5oYXNOZXh0KCl9OyBzZXBhcmF0b3I9Inx8Ij4pICkgeworICAgIHRocm93IG5ldyBSZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKCk7Cit9Cit3aGlsZSAoIDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dCgpfTsgc2VwYXJhdG9yPSJ8fCI+ICkgeworICAgIDxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LnJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQWx0KGEpIDo6PSA8PAorLy8gPGEuZGVzY3JpcHRpb24+Cis8aWYoYS5wcmVkKT4KK2lmICg8YS5wcmVkPikgeworICAgIDxhLmFsdD4KK308XG4+Cis8ZWxzZT4KK3sKKyAgICA8YS5hbHQ+Cit9PFxuPgorPGVuZGlmPgorPj4KKworLyoqIEZvciBlbXB0eSByZXdyaXRlczogInIgOiAuLi4gLT4gOyIgKi8KK3Jld3JpdGVFbXB0eUFsdCgpIDo6PSAicm9vdF8wID0gbnVsbDsiCisKK3Jld3JpdGVUcmVlKHJvb3QsY2hpbGRyZW4sZGVzY3JpcHRpb24sZW5jbG9zaW5nVHJlZUxldmVsLHRyZWVMZXZlbCkgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKzxBU1RMYWJlbFR5cGU+IHJvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5uaWwoKTsKKzxyb290OnJld3JpdGVFbGVtZW50KCk+Cis8Y2hpbGRyZW46cmV3cml0ZUVsZW1lbnQoKT4KK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88ZW5jbG9zaW5nVHJlZUxldmVsPiwgcm9vdF88dHJlZUxldmVsPik7Cit9PFxuPgorPj4KKworcmV3cml0ZUVsZW1lbnRMaXN0KGVsZW1lbnRzKSA6Oj0gIjxlbGVtZW50czpyZXdyaXRlRWxlbWVudCgpPiIKKworcmV3cml0ZUVsZW1lbnQoZSkgOjo9IDw8Cis8QHByZWdlbigpPgorPGUuZWw+Cis+PgorCisvKiogR2VuIElEIG9yIElEW2FyZ3NdICovCityZXdyaXRlVG9rZW5SZWYodG9rZW4sZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4pOzxcbj4KKz4+CisKKy8qKiBHZW4gJGxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBsYWJlbD1JRCAqLworcmV3cml0ZVRva2VuTGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSk7PFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsKz1JRCAqLworcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHROb2RlKCkpOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSAqLworcmV3cml0ZVRva2VuTGFiZWxSZWZSb290KGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCisvKiogR2VuIF4oJGxhYmVsIC4uLikgd2hlcmUgbGFiZWwrPS4uLiAqLworcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmUm9vdCA6Oj0gcmV3cml0ZVRva2VuTGFiZWxSZWZSb290CisKKy8qKiBHZW4gXihJRCAuLi4pIG9yIF4oSURbYXJnc10gLi4uKSAqLworcmV3cml0ZVRva2VuUmVmUm9vdCh0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmJlY29tZVJvb3QoPGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4sIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZihhcmdzLHRva2VuLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlSW1hZ2luYXJ5Tm9kZSh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsYXJncyk+KTs8XG4+Cis+PgorCityZXdyaXRlSW1hZ2luYXJ5VG9rZW5SZWZSb290KGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuYmVjb21lUm9vdCg8Y3JlYXRlSW1hZ2luYXJ5Tm9kZSh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsYXJncyk+LCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCisvKiogcGxhaW4gLT4ge2Zvb30gYWN0aW9uICovCityZXdyaXRlQWN0aW9uKGFjdGlvbikgOjo9IDw8Cityb290XzAgPSA8YWN0aW9uPjs8XG4+Cis+PgorCisvKiogV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhpcyBydWxlJ3Mgcm9vdCB0cmVlPyAgVGhpcworICogIGxldCdzIHVzIHJlZmVyIHRvICRydWxlIHRvIG1lYW4gcHJldmlvdXMgdmFsdWUuICBJIGFtIHJldXNpbmcgdGhlCisgKiAgdmFyaWFibGUgJ3RyZWUnIHNpdHRpbmcgaW4gcmV0dmFsIHN0cnVjdCB0byBob2xkIHRoZSB2YWx1ZSBvZiByb290XzAgcmlnaHQKKyAqICBiZWZvcmUgSSBzZXQgaXQgZHVyaW5nIHJld3JpdGVzLiAgVGhlIGFzc2lnbiB3aWxsIGJlIHRvIHJldHZhbC50cmVlLgorICovCitwcmV2UnVsZVJvb3RSZWYoKSA6Oj0gInJldHZhbCIKKworcmV3cml0ZVJ1bGVSZWYocnVsZSkgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88cnVsZT4ubmV4dFRyZWUoKSk7PFxuPgorPj4KKworcmV3cml0ZVJ1bGVSZWZSb290KHJ1bGUpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxydWxlPi5uZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvbihhY3Rpb24pIDo6PSA8PAorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8YWN0aW9uPik7PFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb25Sb290KGFjdGlvbikgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuYmVjb21lUm9vdCg8YWN0aW9uPiwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZihsYWJlbCkgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHRUcmVlKCkpOzxcbj4KKz4+CisKKy8qKiBHZW4gJHJ1bGVMYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZihsYWJlbCkgOjo9IDw8CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHRUcmVlKCkpOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkcnVsZUxhYmVsIC4uLikgd2hlcmUgcnVsZUxhYmVsPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGFiZWxSZWZSb290KGxhYmVsKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5iZWNvbWVSb290KHN0cmVhbV88bGFiZWw+Lm5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkcnVsZUxhYmVsIC4uLikgd2hlcmUgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworcmV3cml0ZVdpbGRjYXJkTGFiZWxSZWYobGFiZWwpIDo6PSA8PAorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0VHJlZSgpKTs8XG4+Cis+PgorCisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsLCBhcmdzKSAhPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuY3JlYXRlKDx0b2tlblR5cGU+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGlmKCFhcmdzKT4iPHRva2VuVHlwZT4iPGVuZGlmPikKKzxlbmRpZj4KKz4+CisKK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KHN0cmVhbV88dG9rZW4+Lm5leHRUb2tlbigpPGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj4pCis8ZWxzZT4KKzxpZihhcmdzKT4gPCEgbXVzdCBjcmVhdGUgbmV3IG5vZGUgZnJvbSBvbGQgIT4KK2FkYXB0b3IuY3JlYXRlKDx0b2tlbj4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lm5leHROb2RlKCkKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNURGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9BU1REYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmUxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNURGJnLnN0ZwpAQCAtMCwwICsxLDg1IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIFRlbXBsYXRlIG92ZXJyaWRlcyB0byBhZGQgZGVidWdnaW5nIHRvIEFTVCBzdHVmZi4gIER5bmFtaWMgaW5oZXJpdGFuY2UKKyAqICBoaWVyYXJjaHkgaXMgc2V0IHVwIGFzIEFTVERiZyA6IEFTVCA6IERiZyA6IEphdmEgYnkgY29kZSBnZW5lcmF0b3IuCisgKi8KKworcGFyc2VyTWVtYmVycygpIDo6PSA8PAorcHJvdGVjdGVkIERlYnVnVHJlZUFkYXB0b3IgYWRhcHRvcjsKK3B1YmxpYyB2b2lkIHNldFRyZWVBZGFwdG9yKFRyZWVBZGFwdG9yIGFkYXB0b3IpIHsKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorICAgIHRoaXMuYWRhcHRvciA9IG5ldyBEZWJ1Z1RyZWVBZGFwdG9yKGRiZyxhZGFwdG9yKTsKKzxlbHNlPgorICAgIHRoaXMuYWRhcHRvciA9IChEZWJ1Z1RyZWVBZGFwdG9yKWFkYXB0b3I7IC8vIGRlbGVnYXRvciBzZW5kcyBkYmcgYWRhcHRvcgorPGVuZGlmPjxcbj4KKyAgICA8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6e2d8PGc6ZGVsZWdhdGVOYW1lKCk+LnNldFRyZWVBZGFwdG9yKHRoaXMuYWRhcHRvcik7fT4KK30KK3B1YmxpYyBUcmVlQWRhcHRvciBnZXRUcmVlQWRhcHRvcigpIHsKKyAgICByZXR1cm4gYWRhcHRvcjsKK308XG4+Cis+PgorCitwYXJzZXJDdG9yQm9keSgpIDo6PSA8PAorPHN1cGVyLnBhcnNlckN0b3JCb2R5KCk+Cis+PgorCitjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpIDo6PSA8PAorRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0KKyAgICBuZXcgRGVidWdFdmVudFNvY2tldFByb3h5KHRoaXMscG9ydCw8aWYoVFJFRV9QQVJTRVIpPmlucHV0LmdldFRyZWVBZGFwdG9yKCk8ZWxzZT5hZGFwdG9yPGVuZGlmPik7CitzZXREZWJ1Z0xpc3RlbmVyKHByb3h5KTsKK3NldDxpbnB1dFN0cmVhbVR5cGU+KG5ldyBEZWJ1ZzxpbnB1dFN0cmVhbVR5cGU+KGlucHV0LHByb3h5KSk7Cit0cnkgeworICAgIHByb3h5LmhhbmRzaGFrZSgpOworfQorY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgIHJlcG9ydEVycm9yKGlvZSk7Cit9Cis+PgorCitAY3RvckZvclJvb3RHcmFtbWFyLmZpbmFsbHkoKSA6Oj0gPDwKK1RyZWVBZGFwdG9yIGFkYXAgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKK3NldFRyZWVBZGFwdG9yKGFkYXApOworcHJveHkuc2V0VHJlZUFkYXB0b3IoYWRhcCk7Cis+PgorCitAY3RvckZvclByb2ZpbGluZ1Jvb3RHcmFtbWFyLmZpbmFsbHkoKSA6Oj08PAorVHJlZUFkYXB0b3IgYWRhcCA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworc2V0VHJlZUFkYXB0b3IoYWRhcCk7Cis+PgorCitAY3RvckZvclByZWRlZmluZWRMaXN0ZW5lci5zdXBlckNsYXNzUmVmKCkgOjo9ICJzdXBlcihpbnB1dCwgZGJnKTsiCisKK0BjdG9yRm9yUHJlZGVmaW5lZExpc3RlbmVyLmZpbmFsbHkoKSA6Oj08PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+IDwhIGRvbid0IGNyZWF0ZSBuZXcgYWRhcHRvciBmb3IgZGVsZWdhdGVzICE+CitUcmVlQWRhcHRvciBhZGFwID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CitzZXRUcmVlQWRhcHRvcihhZGFwKTs8XG4+Cis8ZW5kaWY+Cis+PgorCitAcmV3cml0ZUVsZW1lbnQucHJlZ2VuKCkgOjo9ICJkYmcubG9jYXRpb24oPGUubGluZT4sPGUucG9zPik7IgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0FTVFBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNUUGFyc2VyLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDEyMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0FTVFBhcnNlci5zdGcKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGVzIGZvciBidWlsZGluZyBBU1RzIGR1cmluZyBub3JtYWwgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIFRoZSBzaXR1YXRpb24gaXMgbm90IHRvbyBiYWQgYXMgcmV3cml0ZSAoLT4pIHVzYWdlIG1ha2VzIF4gYW5kICEKKyAqICBpbnZhbGlkLiBUaGVyZSBpcyBubyBodWdlIGV4cGxvc2lvbiBvZiBjb21iaW5hdGlvbnMuCisgKi8KKworQHJ1bGUuc2V0RXJyb3JSZXR1cm5WYWx1ZSgpIDo6PSA8PAorcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5lcnJvck5vZGUoaW5wdXQsIHJldHZhbC5zdGFydCwgaW5wdXQuTFQoLTEpLCByZSk7Cis8ISBTeXN0ZW0ub3V0LnByaW50bG4oIjxydWxlTmFtZT4gcmV0dXJucyAiKygoQ29tbW9uVHJlZSlyZXR2YWwudHJlZSkudG9TdHJpbmdUcmVlKCkpOyAhPgorPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT47CithZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCisvKiogSUQhIGFuZCBvdXRwdXQ9QVNUIChzYW1lIGFzIHBsYWluIHRva2VuUmVmKSAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSAiPHN1cGVyLnRva2VuUmVmKC4uLik+IgorCisvKiogSUReIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxsYWJlbD5fdHJlZSA9IDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+Oworcm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfMCk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworLyoqIGlkcys9SUQhIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZkJhbmdBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsIC4uLik+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLCAuLi4pPgorPj4KKworLyoqIE1hdGNoIGxhYmVsKz1UT0tFTl4gd2hlbiBvdXRwdXQ9QVNUIGJ1dCBub3QgcmV3cml0ZSBhbHQgKi8KK3Rva2VuUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLCAuLi4pPgorPj4KKworLy8gU0VUIEFTVAorCisvLyB0aGUgbWF0Y2ggc2V0IHN0dWZmIGlzIGludGVyZXN0aW5nIGluIHRoYXQgaXQgdXNlcyBhbiBhcmd1bWVudCBsaXN0CisvLyB0byBwYXNzIGNvZGUgdG8gdGhlIGRlZmF1bHQgbWF0Y2hTZXQ7IGFub3RoZXIgcG9zc2libGUgd2F5IHRvIGFsdGVyCisvLyBpbmhlcml0ZWQgY29kZS4gIEkgZG9uJ3QgdXNlIHRoZSByZWdpb24gc3R1ZmYgYmVjYXVzZSBJIG5lZWQgdG8gcGFzcworLy8gZGlmZmVyZW50IGNodW5rcyBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdG9yLiAgSSBkb24ndCBsaWtlIG1ha2luZworLy8gdGhlIHRlbXBsYXRlIG5hbWUgaGF2ZSB0aGUgb3BlcmF0b3IgYXMgdGhlIG51bWJlciBvZiB0ZW1wbGF0ZXMgZ2V0cworLy8gbGFyZ2UgYnV0IHRoaXMgaXMgdGhlIG1vc3QgZmxleGlibGUtLXRoaXMgaXMgYXMgb3Bwb3NlZCB0byBoYXZpbmcKKy8vIHRoZSBjb2RlIGdlbmVyYXRvciBjYWxsIG1hdGNoU2V0IHRoZW4gYWRkIHJvb3QgY29kZSBvciBydWxlcm9vdCBjb2RlCisvLyBwbHVzIGxpc3QgbGFiZWwgcGx1cyAuLi4gIFRoZSBjb21iaW5hdGlvbnMgbWlnaHQgcmVxdWlyZSBjb21wbGljYXRlZAorLy8gcmF0aGVyIHRoYW4ganVzdCBhZGRlZCBvbiBjb2RlLiAgSW52ZXN0aWdhdGUgdGhhdCByZWZhY3RvcmluZyB3aGVuCisvLyBJIGhhdmUgbW9yZSB0aW1lLgorCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDwlCis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17PGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5hZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4pO30sIC4uLik+CislPgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxwb3N0bWF0Y2hDb2RlKSA6Oj0gIjxzdXBlci5tYXRjaFNldCguLi4pPiIKKworLy8gbm90ZSB0aGVyZSBpcyBubyBtYXRjaFNldFRyYWNrIGJlY2F1c2UgLT4gcmV3cml0ZXMgZm9yY2Ugc2V0cyB0byBiZQorLy8gcGxhaW4gb2xkIGJsb2NrcyBvZiBhbHRzOiAoQXxCfC4uLnxDKQorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj0oPGxhYmVsVHlwZT4paW5wdXQuTFQoMSk7PFxuPgorPGVuZGlmPgorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9ezxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+cm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuYmVjb21lUm9vdCg8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPiwgcm9vdF8wKTt9LC4uLik+Cis+PgorCisvLyBSVUxFIFJFRiBBU1QKKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+YWRhcHRvci5hZGRDaGlsZChyb290XzAsIDxsYWJlbD4uZ2V0VHJlZSgpKTsKKz4+CisKKy8qKiBydWxlISBpcyBzYW1lIGFzIG5vcm1hbCBydWxlIHJlZiAqLworcnVsZVJlZkJhbmcocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9ICI8c3VwZXIucnVsZVJlZiguLi4pPiIKKworLyoqIHJ1bGVeICovCitydWxlUmVmUnVsZVJvb3QocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj5yb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD4uZ2V0VHJlZSgpLCByb290XzApOworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwobGFiZWwsIHs8bGFiZWw+LmdldFRyZWUoKX0pPgorPj4KKworLyoqIHgrPXJ1bGUhIHdoZW4gb3V0cHV0PUFTVCBpcyBhIHJ1bGUgcmVmIHdpdGggbGlzdCBhZGRpdGlvbiAqLworcnVsZVJlZkJhbmdBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWwobGFiZWwsIHs8bGFiZWw+LmdldFRyZWUoKX0pPgorPj4KKworLyoqIHgrPXJ1bGVeICovCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCB7PGxhYmVsPi5nZXRUcmVlKCl9KT4KKz4+CisKKy8vIFdJTERDQVJEIEFTVAorCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5jcmVhdGUoPGxhYmVsPik7CithZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCit3aWxkY2FyZEJhbmcobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gIjxzdXBlci53aWxkY2FyZCguLi4pPiIKKword2lsZGNhcmRSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5jcmVhdGUoPGxhYmVsPik7Cityb290XzAgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF8wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCitjcmVhdGVOb2RlRnJvbVRva2VuKGxhYmVsLHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPikgPCEgbmV3IE1ldGhvZE5vZGUoSURMYWJlbCkgIT4KKzxlbHNlPgorKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuY3JlYXRlKDxsYWJlbD4pCis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxcbj48ZW5kaWY+CityZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNUVHJlZVBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvQVNUVHJlZVBhcnNlci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4NjY4MwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9BU1RUcmVlUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIHRyZWUgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIEVhY2ggY29tYmluYXRpb24gaGFzIGl0cyBvd24gdGVtcGxhdGUgZXhjZXB0IHRoYXQgbGFiZWwvbm8gbGFiZWwKKyAqICBpcyBjb21iaW5lZCBpbnRvIHRva2VuUmVmLCBydWxlUmVmLCAuLi4KKyAqLworCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgbGFzdCBlbGVtZW50IG1hdGNoZWQgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+Cis8QVNUTGFiZWxUeXBlPiBfZmlyc3RfMCA9IG51bGw7Cis8QVNUTGFiZWxUeXBlPiBfbGFzdCA9IG51bGw7PFxuPgorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUgcnVsZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZihyZXdyaXRlTW9kZSk+CityZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPilfZmlyc3RfMDsKK2lmICggYWRhcHRvci5nZXRQYXJlbnQocmV0dmFsLnRyZWUpIT1udWxsICYmIGFkYXB0b3IuaXNOaWwoIGFkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC50cmVlKSApICkKKyAgICByZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmdldFBhcmVudChyZXR2YWwudHJlZSk7Cis8ZW5kaWY+Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXI7IG92ZXJyaWRlIGhlcmUgdG8KKyAqICBhZGQgdHJlZSBjb25zdHJ1Y3Rpb24gYWN0aW9ucy4KKyAqLwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsCisgICAgIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworeworPEFTVExhYmVsVHlwZT4gX3NhdmVfbGFzdF88dHJlZUxldmVsPiA9IF9sYXN0OworPEFTVExhYmVsVHlwZT4gX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gbnVsbDsKKzxpZighcmV3cml0ZU1vZGUpPgorPEFTVExhYmVsVHlwZT4gcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLm5pbCgpOworPGVuZGlmPgorPHJvb3Q6ZWxlbWVudCgpPgorPGlmKHJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KKzxpZihyb290LmVsLnJ1bGUpPgoraWYgKCBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD49PW51bGwgKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD4udHJlZTsKKzxlbHNlPgoraWYgKCBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD49PW51bGwgKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD47Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKCBpbnB1dC5MQSgxKT09VG9rZW4uRE9XTiApIHsKKyAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CittYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8Y2hpbGRyZW46ZWxlbWVudCgpPgorbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorYWRhcHRvci5hZGRDaGlsZChyb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTsKKzxlbmRpZj4KK19sYXN0ID0gX3NhdmVfbGFzdF88dHJlZUxldmVsPjsKK308XG4+Cis+PgorCisvLyBUT0tFTiBBU1QgU1RVRkYKKworLyoqIElEISBhbmQgb3V0cHV0PUFTVCAoc2FtZSBhcyBwbGFpbiB0b2tlblJlZikgJ2NlcHQgYWRkCisgKiAgc2V0dGluZyBvZiBfbGFzdAorICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPj4KKworLyoqIElEIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IG5ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pOworPGVuZGlmPjxcbj4KK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICk8ZW5kaWY+CitpZiAoIF9maXJzdF88dHJlZUxldmVsPj09bnVsbCApIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmR1cE5vZGUoPGxhYmVsPik7Cis8ZW5kaWY+PFxuPgorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGFuZCBhdXRvIGR1cCB0aGUgbm9kZS9zdWJ0cmVlICovCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuZHVwVHJlZSg8bGFiZWw+KTsKK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPl90cmVlKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICk8ZW5kaWY+CitpZiAoIF9maXJzdF88dHJlZUxldmVsPj09bnVsbCApIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvLyBTRVQgQVNUCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KTsKKzxlbmRpZj48XG4+CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT5cfTxlbmRpZj4KKzxlbmRpZj4KK30sIC4uLgorKT4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlLHRyZWVMZXZlbD0iMCIpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bm9SZXdyaXRlKC4uLik+IDwhIHNldCByZXR1cm4gdHJlZSAhPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLm1hdGNoU2V0KC4uLik+Cis+PgorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IG5ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pOworPGVuZGlmPjxcbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF88dHJlZUxldmVsPik7Cis8aWYoYmFja3RyYWNraW5nKT5cfTxlbmRpZj4KKzxlbmRpZj4KK30sIC4uLgorKT4KKz4+CisKKy8vIFJVTEUgUkVGIEFTVAorCisvKiogcnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPi5nZXRUcmVlKCkpOworPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgoraWYgKCBfZmlyc3RfPHRyZWVMZXZlbD49PW51bGwgKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+LnRyZWU7Cis8ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCB7PGxhYmVsPi5nZXRUcmVlKCl9KT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnJvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD4uZ2V0VHJlZSgpLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxlbmRpZj4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChsYWJlbCwgezxsYWJlbD4uZ2V0VHJlZSgpfSk+Cis+PgorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci5ydWxlUmVmVHJhY2soLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZlJvb3RUcmFjayguLi4pPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBTdHJlYW1zIGZvciB0b2tlbiByZWZzIGFyZSB0cmVlIG5vZGVzIG5vdzsgb3ZlcnJpZGUgdG8KKyAqICBjaGFuZ2UgbmV4dFRva2VuIHRvIG5leHROb2RlLgorICovCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxzY29wZSkgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oc3RyZWFtXzx0b2tlbj4ubmV4dE5vZGUoKSkKKzxlbHNlPgorc3RyZWFtXzx0b2tlbj4ubmV4dE5vZGUoKQorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxcbj48ZW5kaWY+CityZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvRGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9EYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTJiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmEvRGJnLnN0ZwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gbm9ybWFsIEphdmEgb3V0cHV0OworICogIElmIEFTVHMgYXJlIGJ1aWx0LCB0aGVuIHlvdSdsbCBhbHNvIGdldCBBU1REYmcuc3RnIGxvYWRlZC4KKyAqLworQG91dHB1dEZpbGUuaW1wb3J0cygpIDo6PSA8PAorPEBzdXBlci5pbXBvcnRzKCk+CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuZGVidWcuKjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworPj4KKworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHJ1bGVOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgImludmFsaWRSdWxlIiwgPGdyYW1tYXIuYWxsSW1wb3J0ZWRSdWxlczp7clNUIHwgIjxyU1QubmFtZT4ifTsgd3JhcD0iXG4gICAgIiwgc2VwYXJhdG9yPSIsICI+Cit9Ozxcbj4KKzxlbmRpZj4KK3B1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbltdIGRlY2lzaW9uQ2FuQmFja3RyYWNrID0gbmV3IGJvb2xlYW5bXSB7CisgICAgZmFsc2UsIC8vIGludmFsaWQgZGVjaXNpb24KKyAgICA8Z3JhbW1hci5kZWNpc2lvbnM6e2QgfCA8ZC5kZmEuaGFzU3luUHJlZDsgbnVsbD0iZmFsc2UiPn07IHdyYXA9IlxuICAgICIsIHNlcGFyYXRvcj0iLCAiPgorfTs8XG4+Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4gPCEgZ3JhbW1hciBpbXBvcnRzIG90aGVyIGdyYW1tYXIocykgIT4KKyAgICBwdWJsaWMgaW50IHJ1bGVMZXZlbCA9IDA7CisgICAgcHVibGljIGludCBnZXRSdWxlTGV2ZWwoKSB7IHJldHVybiBydWxlTGV2ZWw7IH0KKyAgICBwdWJsaWMgdm9pZCBpbmNSdWxlTGV2ZWwoKSB7IHJ1bGVMZXZlbCsrOyB9CisgICAgcHVibGljIHZvaWQgZGVjUnVsZUxldmVsKCkgeyBydWxlTGV2ZWwtLTsgfQorPGlmKHByb2ZpbGUpPgorICAgIDxjdG9yRm9yUHJvZmlsaW5nUm9vdEdyYW1tYXIoKT4KKzxlbHNlPgorICAgIDxjdG9yRm9yUm9vdEdyYW1tYXIoKT4KKzxlbmRpZj4KKzxjdG9yRm9yUHJlZGVmaW5lZExpc3RlbmVyKCk+Cis8ZWxzZT4gPCEgaW1wb3J0ZWQgZ3JhbW1hciAhPgorICAgIHB1YmxpYyBpbnQgZ2V0UnVsZUxldmVsKCkgeyByZXR1cm4gPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wgPGc6ZGVsZWdhdGVOYW1lKCk+fT4uZ2V0UnVsZUxldmVsKCk7IH0KKyAgICBwdWJsaWMgdm9pZCBpbmNSdWxlTGV2ZWwoKSB7IDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LmluY1J1bGVMZXZlbCgpOyB9CisgICAgcHVibGljIHZvaWQgZGVjUnVsZUxldmVsKCkgeyA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pi5kZWNSdWxlTGV2ZWwoKTsgfQorICAgIDxjdG9yRm9yRGVsZWdhdGVHcmFtbWFyKCk+Cis8ZW5kaWY+Cis8aWYocHJvZmlsZSk+CitwdWJsaWMgYm9vbGVhbiBhbHJlYWR5UGFyc2VkUnVsZShJbnRTdHJlYW0gaW5wdXQsIGludCBydWxlSW5kZXgpIHsKKwlpbnQgc3RvcEluZGV4ID0gZ2V0UnVsZU1lbW9pemF0aW9uKHJ1bGVJbmRleCwgaW5wdXQuaW5kZXgoKSk7CisgICAgKChQcm9maWxlcilkYmcpLmV4YW1pbmVSdWxlTWVtb2l6YXRpb24oaW5wdXQsIHJ1bGVJbmRleCwgc3RvcEluZGV4LCA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnJ1bGVOYW1lc1tydWxlSW5kZXhdKTsKKyAgICByZXR1cm4gc3VwZXIuYWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCk7Cit9PFxuPgorcHVibGljIHZvaWQgbWVtb2l6ZShJbnRTdHJlYW0gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIGludCBydWxlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGludCBydWxlU3RhcnRJbmRleCkKK3sKKyAgICAoKFByb2ZpbGVyKWRiZykubWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisgICAgc3VwZXIubWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCk7Cit9PFxuPgorPGVuZGlmPgorcHJvdGVjdGVkIGJvb2xlYW4gZXZhbFByZWRpY2F0ZShib29sZWFuIHJlc3VsdCwgU3RyaW5nIHByZWRpY2F0ZSkgeworICAgIGRiZy5zZW1hbnRpY1ByZWRpY2F0ZShyZXN1bHQsIHByZWRpY2F0ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK308XG4+Cis+PgorCitjdG9yRm9yUm9vdEdyYW1tYXIoKSA6Oj0gPDwKKzwhIGJ1ZzogY2FuJ3QgdXNlIDxAc3VwZXIubWVtYmVycygpPiBjdXQtbi1wYXN0ZSBpbnN0ZWFkICE+Cis8ISBTYW1lIGV4Y2VwdCB3ZSBhZGQgcG9ydCBudW1iZXIgYW5kIHByb2ZpbGUgc3R1ZmYgaWYgcm9vdCBncmFtbWFyICE+CitwdWJsaWMgPG5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0KSB7CisgICAgdGhpcyhpbnB1dCwgRGVidWdFdmVudFNvY2tldFByb3h5LkRFRkFVTFRfREVCVUdHRVJfUE9SVCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKK30KK3B1YmxpYyA8bmFtZT4oPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIGludCBwb3J0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgIDxjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAZmluYWxseSgpPgorfTxcbj4KKz4+CisKK2N0b3JGb3JQcm9maWxpbmdSb290R3JhbW1hcigpIDo6PSA8PAorPCEgYnVnOiBjYW4ndCB1c2UgPEBzdXBlci5tZW1iZXJzKCk+IGN1dC1uLXBhc3RlIGluc3RlYWQgIT4KK3B1YmxpYyA8bmFtZT4oPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQpIHsKKyAgICB0aGlzKGlucHV0LCBuZXcgUHJvZmlsZXIobnVsbCksIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7Cit9CitwdWJsaWMgPG5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0LCBEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICBzdXBlcihpbnB1dCwgZGJnLCBzdGF0ZSk7CisgICAgUHJvZmlsZXIgcCA9IChQcm9maWxlcilkYmc7CisgICAgcC5zZXRQYXJzZXIodGhpcyk7CisgICAgPHBhcnNlckN0b3JCb2R5KCk+CisgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAZmluYWxseSgpPgorfQorPFxuPgorPj4KKworLyoqIEJhc2ljYWxseSB3ZSBkb24ndCB3YW50IHRvIHNldCBhbnkgZGJnIGxpc3RlbmVycyBhcmUgcm9vdCB3aWxsIGhhdmUgaXQuICovCitjdG9yRm9yRGVsZWdhdGVHcmFtbWFyKCkgOjo9IDw8CitwdWJsaWMgPG5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0LCBEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KSB7CisgICAgc3VwZXIoaW5wdXQsIGRiZywgc3RhdGUpOworICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPihpbnB1dCwgdGhpcywgdGhpcy5zdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pik7fTsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworY3RvckZvclByZWRlZmluZWRMaXN0ZW5lcigpIDo6PSA8PAorcHVibGljIDxuYW1lPig8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgRGVidWdFdmVudExpc3RlbmVyIGRiZykgeworICAgIDxAc3VwZXJDbGFzc1JlZj5zdXBlcihpbnB1dCwgZGJnLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOzxAZW5kPgorPGlmKHByb2ZpbGUpPgorICAgIFByb2ZpbGVyIHAgPSAoUHJvZmlsZXIpZGJnOworICAgIHAuc2V0UGFyc2VyKHRoaXMpOworPGVuZGlmPgorICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBkYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAZmluYWxseSgpPgorfTxcbj4KKz4+CisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0KKyAgICBuZXcgRGVidWdFdmVudFNvY2tldFByb3h5KHRoaXMsIHBvcnQsIGlucHV0LmdldFRyZWVBZGFwdG9yKCkpOzxcbj4KKzxlbHNlPgorRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0KKyAgICBuZXcgRGVidWdFdmVudFNvY2tldFByb3h5KHRoaXMsIHBvcnQsIG51bGwpOzxcbj4KKzxlbmRpZj4KK3NldERlYnVnTGlzdGVuZXIocHJveHkpOwordHJ5IHsKKyAgICBwcm94eS5oYW5kc2hha2UoKTsKK30KK2NhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICByZXBvcnRFcnJvcihpb2UpOworfQorPj4KKworQGdlbmVyaWNQYXJzZXIuc3VwZXJDbGFzc05hbWUoKSA6Oj0gIkRlYnVnPEBzdXBlci5zdXBlckNsYXNzTmFtZSgpPiIKKworQHJ1bGUucHJlYW1ibGUoKSA6Oj0gPDwKK3RyeSB7IGRiZy5lbnRlclJ1bGUoZ2V0R3JhbW1hckZpbGVOYW1lKCksICI8cnVsZU5hbWU+Iik7CitpZiAoIGdldFJ1bGVMZXZlbCgpPT0wICkge2RiZy5jb21tZW5jZSgpO30KK2luY1J1bGVMZXZlbCgpOworZGJnLmxvY2F0aW9uKDxydWxlRGVzY3JpcHRvci50cmVlLmxpbmU+LCA8cnVsZURlc2NyaXB0b3IudHJlZS5jaGFyUG9zaXRpb25JbkxpbmU+KTs8XG4+Cis+PgorCitAcnVsZS5wb3N0YW1ibGUoKSA6Oj0gPDwKK2RiZy5sb2NhdGlvbig8cnVsZURlc2NyaXB0b3IuRU9STm9kZS5saW5lPiwgPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUuY2hhclBvc2l0aW9uSW5MaW5lPik7PFxuPgorfQorZmluYWxseSB7CisgICAgZGJnLmV4aXRSdWxlKGdldEdyYW1tYXJGaWxlTmFtZSgpLCAiPHJ1bGVOYW1lPiIpOworICAgIGRlY1J1bGVMZXZlbCgpOworICAgIGlmICggZ2V0UnVsZUxldmVsKCk9PTAgKSB7ZGJnLnRlcm1pbmF0ZSgpO30KK308XG4+Cis+PgorCitAc3lucHJlZC5zdGFydCgpIDo6PSAiZGJnLmJlZ2luQmFja3RyYWNrKHN0YXRlLmJhY2t0cmFja2luZyk7IgorCitAc3lucHJlZC5zdG9wKCkgOjo9ICJkYmcuZW5kQmFja3RyYWNrKHN0YXRlLmJhY2t0cmFja2luZywgc3VjY2Vzcyk7IgorCisvLyBDb21tb24gZGVidWcgZXZlbnQgdHJpZ2dlcnMgdXNlZCBieSByZWdpb24gb3ZlcnJpZGVzIGJlbG93CisKK2VudGVyU3ViUnVsZSgpIDo6PQorICAgICJ0cnkgeyBkYmcuZW50ZXJTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOzxcbj4iCisKK2V4aXRTdWJSdWxlKCkgOjo9CisgICAgIn0gZmluYWxseSB7ZGJnLmV4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pO308XG4+IgorCitlbnRlckRlY2lzaW9uKCkgOjo9CisgICAgInRyeSB7IGRiZy5lbnRlckRlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4sIGRlY2lzaW9uQ2FuQmFja3RyYWNrWzxkZWNpc2lvbk51bWJlcj5dKTs8XG4+IgorCitleGl0RGVjaXNpb24oKSA6Oj0KKyAgICAifSBmaW5hbGx5IHtkYmcuZXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pO308XG4+IgorCitlbnRlckFsdChuKSA6Oj0gImRiZy5lbnRlckFsdCg8bj4pOzxcbj4iCisKKy8vIFJlZ2lvbiBvdmVycmlkZXMgdGhhdCB0ZWxsIHZhcmlvdXMgY29uc3RydWN0cyB0byBhZGQgZGVidWdnaW5nIHRyaWdnZXJzCisKK0BibG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyU3ViUnVsZSgpPjxlbnRlckRlY2lzaW9uKCk+IgorCitAYmxvY2sucG9zdGRlY2lzaW9uKCkgOjo9ICI8ZXhpdERlY2lzaW9uKCk+IgorCitAYmxvY2sucG9zdGJyYW5jaCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCitAcnVsZUJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJEZWNpc2lvbigpPiIKKworQHJ1bGVCbG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKK0BydWxlQmxvY2tTaW5nbGVBbHQucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQobj1cIjFcIik+IgorCitAYmxvY2tTaW5nbGVBbHQucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQobj1cIjFcIik+IgorCitAcG9zaXRpdmVDbG9zdXJlQmxvY2sucHJlbG9vcCgpIDo6PSAiPGVudGVyU3ViUnVsZSgpPiIKKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLnBvc3Rsb29wKCkgOjo9ICI8ZXhpdFN1YlJ1bGUoKT4iCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wcmVkZWNpc2lvbigpIDo6PSAiPGVudGVyRGVjaXNpb24oKT4iCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5lYXJseUV4aXRFeGNlcHRpb24oKSA6Oj0KKyAgICAiZGJnLnJlY29nbml0aW9uRXhjZXB0aW9uKGVlZSk7PFxuPiIKKworQGNsb3N1cmVCbG9jay5wcmVsb29wKCkgOjo9ICI8ZW50ZXJTdWJSdWxlKCk+IgorCitAY2xvc3VyZUJsb2NrLnBvc3Rsb29wKCkgOjo9ICI8ZXhpdFN1YlJ1bGUoKT4iCisKK0BjbG9zdXJlQmxvY2sucHJlZGVjaXNpb24oKSA6Oj0gIjxlbnRlckRlY2lzaW9uKCk+IgorCitAY2xvc3VyZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworQGFsdFN3aXRjaENhc2UucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQoYWx0TnVtKT4iIC8vIGFsdE51bSBpcyBhcmcgb2YgYWx0U3dpdGNoQ2FzZQorCitAZWxlbWVudC5wcmVtYXRjaCgpIDo6PQorICAgICJkYmcubG9jYXRpb24oPGUubGluZT4sPGUucG9zPik7IiAvLyBlIGlzIGFyZyBvZiBlbGVtZW50CisKK0BtYXRjaFNldC5taXNtYXRjaGVkU2V0RXhjZXB0aW9uKCkgOjo9CisgICAgImRiZy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihtc2UpOyIKKworQGRmYVN0YXRlLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9ICJkYmcucmVjb2duaXRpb25FeGNlcHRpb24obnZhZSk7IgorCitAZGZhU3RhdGVTd2l0Y2gubm9WaWFibGVBbHRFeGNlcHRpb24oKSA6Oj0gImRiZy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihudmFlKTsiCisKK2RmYURlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK3RyeSB7CisgICAgaXNDeWNsaWNEZWNpc2lvbiA9IHRydWU7CisgICAgPHN1cGVyLmRmYURlY2lzaW9uKC4uLik+Cit9CitjYXRjaCAoTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSkgeworICAgIGRiZy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihudmFlKTsKKyAgICB0aHJvdyBudmFlOworfQorPj4KKworQGN5Y2xpY0RGQS5lcnJvck1ldGhvZCgpIDo6PSA8PAorcHVibGljIHZvaWQgZXJyb3IoTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSkgeworICAgIGRiZy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihudmFlKTsKK30KKz4+CisKKy8qKiBGb3JjZSBwcmVkaWNhdGUgdmFsaWRhdGlvbiB0byB0cmlnZ2VyIGFuIGV2ZW50ICovCitldmFsUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAorZXZhbFByZWRpY2F0ZSg8cHJlZD4sIjxkZXNjcmlwdGlvbj4iKQorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9KYXZhLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9KYXZhLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGVmNThjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL0phdmEuc3RnCkBAIC0wLDAgKzEsMTQwMSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCitqYXZhVHlwZUluaXRNYXAgOjo9IFsKKwkiaW50IjoiMCIsCisJImxvbmciOiIwIiwKKwkiZmxvYXQiOiIwLjBmIiwKKwkiZG91YmxlIjoiMC4wIiwKKwkiYm9vbGVhbiI6ImZhbHNlIiwKKwkiYnl0ZSI6IjAiLAorCSJzaG9ydCI6IjAiLAorCSJjaGFyIjoiMCIsCisJZGVmYXVsdDoibnVsbCIgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBhdG9taWMgdHlwZQorXQorCisvLyBTeXN0ZW0uQm9vbGVhbi5Ub1N0cmluZygpIHJldHVybnMgIlRydWUiIGFuZCAiRmFsc2UiLCBidXQgdGhlIHByb3BlciBDIyBsaXRlcmFscyBhcmUgInRydWUiIGFuZCAiZmFsc2UiCisvLyBUaGUgSmF2YSB2ZXJzaW9uIG9mIEJvb2xlYW4gcmV0dXJucyAidHJ1ZSIgYW5kICJmYWxzZSIsIHNvIHRoZXkgbWFwIHRvIHRoZW1zZWx2ZXMgaGVyZS4KK2Jvb2xlYW5MaXRlcmFsIDo6PSBbCisJIlRydWUiOiJ0cnVlIiwKKwkiRmFsc2UiOiJmYWxzZSIsCisJInRydWUiOiJ0cnVlIiwKKwkiZmFsc2UiOiJmYWxzZSIsCisJZGVmYXVsdDoiZmFsc2UiCitdCisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqLworb3V0cHV0RmlsZShMRVhFUixQQVJTRVIsVFJFRV9QQVJTRVIsIGFjdGlvblNjb3BlLCBhY3Rpb25zLAorICAgICAgICAgICBkb2NDb21tZW50LCByZWNvZ25pemVyLAorICAgICAgICAgICBuYW1lLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLAorCSAgIGJpdHNldHMsIGJ1aWxkVGVtcGxhdGUsIGJ1aWxkQVNULCByZXdyaXRlTW9kZSwgcHJvZmlsZSwKKwkgICBiYWNrdHJhY2tpbmcsIHN5bnByZWRzLCBtZW1vaXplLCBudW1SdWxlcywKKwkgICBmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsIHRyYWNlLAorCSAgIHNjb3Blcywgc3VwZXJDbGFzcywgbGl0ZXJhbHMpIDo6PQorPDwKKy8vICRBTlRMUiA8QU5UTFJWZXJzaW9uPiA8ZmlsZU5hbWU+IDxnZW5lcmF0ZWRUaW1lc3RhbXA+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKworPEBpbXBvcnRzPgoraW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7Cis8aWYoVFJFRV9QQVJTRVIpPgoraW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjsKKzxlbmRpZj4KK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKzxpZihiYWNrdHJhY2tpbmcpPgoraW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Cis8ZW5kaWY+Cis8QGVuZD4KKworPGRvY0NvbW1lbnQ+CitAU3VwcHJlc3NXYXJuaW5ncyh7ImFsbCIsICJ3YXJuaW5ncyIsICJ1bmNoZWNrZWQifSkKKzxyZWNvZ25pemVyPgorPj4KKworbGV4ZXIoZ3JhbW1hciwgbmFtZSwgdG9rZW5zLCBzY29wZXMsIHJ1bGVzLCBudW1SdWxlcywgZmlsdGVyTW9kZSwgbGFiZWxUeXBlPSJDb21tb25Ub2tlbiIsCisgICAgICBzdXBlckNsYXNzPSJMZXhlciIpIDo6PSA8PAorcHVibGljIGNsYXNzIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiBleHRlbmRzIDxAc3VwZXJDbGFzc05hbWU+PHN1cGVyQ2xhc3M+PEBlbmQ+IHsKKyAgICA8dG9rZW5zOntpdCB8IHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IDxpdC5uYW1lPj08aXQudHlwZT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPHNjb3Blczp7aXQgfDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKGl0KT48ZW5kaWY+fT4KKyAgICA8YWN0aW9ucy5sZXhlci5tZW1iZXJzPgorCisgICAgLy8gZGVsZWdhdGVzCisgICAgPGdyYW1tYXIuZGVsZWdhdGVzOgorICAgICAgICAge2d8cHVibGljIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgLy8gZGVsZWdhdG9ycworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xwdWJsaWMgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfHB1YmxpYyA8Zy5yZWNvZ25pemVyTmFtZT4gZ1BhcmVudDt9PgorICAgIHB1YmxpYyA8c3VwZXJDbGFzcz5bXSBnZXREZWxlZ2F0ZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgPHN1cGVyQ2xhc3M+W10gezxncmFtbWFyLmRlbGVnYXRlczoge2d8PGc6ZGVsZWdhdGVOYW1lKCk+fTsgc2VwYXJhdG9yID0gIiwgIj59OworICAgIH0KKworICAgIHB1YmxpYyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oKSB7fSA8ISBuZWVkZWQgYnkgc3ViY2xhc3NlcyAhPgorICAgIHB1YmxpYyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oQ2hhclN0cmVhbSBpbnB1dDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pIHsKKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KTsKKyAgICB9CisgICAgcHVibGljIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KSB7CisgICAgICAgIHN1cGVyKGlucHV0LHN0YXRlKTsKKzxpZihtZW1vaXplKT4KKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorICAgICAgICBzdGF0ZS5ydWxlTWVtbyA9IG5ldyBIYXNoTWFwWzxudW1SdWxlcz4rMV07PFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICAgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPihpbnB1dCwgc3RhdGU8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHwsIDxwOmRlbGVnYXRlTmFtZSgpPn0+LCB0aGlzKTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGdyYW1tYXIuZGVsZWdhdG9yczoKKyAgICAgICAgIHtnfHRoaXMuPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfGdQYXJlbnQgPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fT4KKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRHcmFtbWFyRmlsZU5hbWUoKSB7IHJldHVybiAiPGZpbGVOYW1lPiI7IH0KKworPGlmKGZpbHRlck1vZGUpPgorICAgIDxmaWx0ZXJpbmdOZXh0VG9rZW4oKT4KKzxlbmRpZj4KKyAgICA8cnVsZXM7IHNlcGFyYXRvcj0iXG5cbiI+CisKKyAgICA8c3lucHJlZHM6e3AgfCA8bGV4ZXJTeW5wcmVkKHApPn0+CisKKyAgICA8Y3ljbGljREZBczp7ZGZhIHwgcHJvdGVjdGVkIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gbmV3IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCit9Cis+PgorCisvKiogQSBvdmVycmlkZSBvZiBMZXhlci5uZXh0VG9rZW4oKSB0aGF0IGJhY2t0cmFja3Mgb3ZlciBtVG9rZW5zKCkgbG9va2luZworICogIGZvciBtYXRjaGVzLiAgTm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCB1cG9uIGVycm9yOyBqdXN0IHJld2luZCwgY29uc3VtZQorICogIGEgdG9rZW4gYW5kIHRoZW4gdHJ5IGFnYWluLiAgYmFja3RyYWNraW5nIG5lZWRzIHRvIGJlIHNldCBhcyB3ZWxsLgorICogIE1ha2UgcnVsZSBtZW1vaXphdGlvbiBoYXBwZW4gb25seSBhdCBsZXZlbHMgYWJvdmUgMSBhcyB3ZSBzdGFydCBtVG9rZW5zCisgKiAgYXQgYmFja3RyYWNraW5nPT0xLgorICovCitmaWx0ZXJpbmdOZXh0VG9rZW4oKSA6Oj0gPDwKK3B1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09Q2hhclN0cmVhbS5FT0YgKSB7CisgICAgICAgICAgICBUb2tlbiBlb2YgPSBuZXcgQ29tbW9uVG9rZW4oKENoYXJTdHJlYW0paW5wdXQsVG9rZW4uRU9GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbmRleCgpLGlucHV0LmluZGV4KCkpOworICAgICAgICAgICAgZW9mLnNldExpbmUoZ2V0TGluZSgpKTsKKyAgICAgICAgICAgIGVvZi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkpOworICAgICAgICAgICAgcmV0dXJuIGVvZjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS50b2tlbiA9IG51bGw7CisJc3RhdGUuY2hhbm5lbCA9IFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LmluZGV4KCk7CisgICAgICAgIHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSBpbnB1dC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydExpbmUgPSBpbnB1dC5nZXRMaW5lKCk7CisJc3RhdGUudGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgbSA9IGlucHV0Lm1hcmsoKTsKKyAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZz0xOyA8ISBtZWFucyB3ZSB3b24ndCB0aHJvdyBzbG93IGV4Y2VwdGlvbiAhPgorICAgICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICAgICAgbVRva2VucygpOworICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNraW5nPTA7CisgICAgICAgICAgICA8ISBtVG9rZW5zIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorICAgICAgICAgICAgICAgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAhPgorICAgICAgICAgICAgaWYgKCBzdGF0ZS5mYWlsZWQgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKG0pOworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsgPCEgYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluICE+CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbWl0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiBpbiBiYWNrdHJhY2tpbmcgbW9kZSwgYnV0Li4uCisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKHJlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworcHVibGljIHZvaWQgbWVtb2l6ZShJbnRTdHJlYW0gaW5wdXQsCisJCWludCBydWxlSW5kZXgsCisJCWludCBydWxlU3RhcnRJbmRleCkKK3sKK2lmICggc3RhdGUuYmFja3RyYWNraW5nPjEgKSBzdXBlci5tZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKK30KKworcHVibGljIGJvb2xlYW4gYWxyZWFkeVBhcnNlZFJ1bGUoSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4KSB7CitpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4xICkgcmV0dXJuIHN1cGVyLmFscmVhZHlQYXJzZWRSdWxlKGlucHV0LCBydWxlSW5kZXgpOworcmV0dXJuIGZhbHNlOworfQorPj4KKworYWN0aW9uR2F0ZSgpIDo6PSAic3RhdGUuYmFja3RyYWNraW5nPT0wIgorCitmaWx0ZXJpbmdBY3Rpb25HYXRlKCkgOjo9ICJzdGF0ZS5iYWNrdHJhY2tpbmc9PTEiCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBwYXJzZXIgKi8KK2dlbmVyaWNQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywKKyAgICAgICAgICAgICAgYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLAorICAgICAgICAgICAgICBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgZmlsdGVyTW9kZSwgQVNUTGFiZWxUeXBlPSJPYmplY3QiKSA6Oj0gPDwKK3B1YmxpYyBjbGFzcyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gZXh0ZW5kcyA8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPiB7Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiXDxpbnZhbGlkPiIsICJcPEVPUj4iLCAiXDxET1dOPiIsICJcPFVQPiIsIDx0b2tlbk5hbWVzOyBzZXBhcmF0b3I9IiwgIj4KKyAgICB9Ozxcbj4KKzxlbmRpZj4KKyAgICA8dG9rZW5zOntpdCB8cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgPGl0Lm5hbWU+PTxpdC50eXBlPjt9OyBzZXBhcmF0b3I9IlxuIj4KKworICAgIC8vIGRlbGVnYXRlcworICAgIDxncmFtbWFyLmRlbGVnYXRlczoge2d8cHVibGljIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgcHVibGljIDxzdXBlckNsYXNzPltdIGdldERlbGVnYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyA8c3VwZXJDbGFzcz5bXSB7PGdyYW1tYXIuZGVsZWdhdGVzOiB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3IgPSAiLCAiPn07CisgICAgfQorCisgICAgLy8gZGVsZWdhdG9ycworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xwdWJsaWMgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfHB1YmxpYyA8Zy5yZWNvZ25pemVyTmFtZT4gZ1BhcmVudDt9PgorCisgICAgPHNjb3Blczp7aXQgfDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKGl0KT48ZW5kaWY+fT4KKworICAgIDxAbWVtYmVycz4KKyAgICA8ISBXQVJOSU5HLiBidWcgaW4gU1Q6IHRoaXMgaXMgY3V0LW4tcGFzdGUgaW50byBEYmcuc3RnICE+CisgICAgcHVibGljIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pIHsKKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KTsKKyAgICB9CisgICAgcHVibGljIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT59PikgeworICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICA8cGFyc2VyQ3RvckJvZHkoKT4KKyAgICAgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPihpbnB1dCwgc3RhdGU8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHwsIDxwOmRlbGVnYXRlTmFtZSgpPn0+LCB0aGlzKTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGdyYW1tYXIuaW5kaXJlY3REZWxlZ2F0ZXM6e2cgfCA8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8Zy5kZWxlZ2F0b3I6ZGVsZWdhdGVOYW1lKCk+LjxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50ID0gPGc6ZGVsZWdhdGVOYW1lKCk+O30+CisgICAgfQorICAgIDxAZW5kPgorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnRva2VuTmFtZXM7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICI8ZmlsZU5hbWU+IjsgfQorCisgICAgPG1lbWJlcnM+CisKKyAgICA8cnVsZXM7IHNlcGFyYXRvcj0iXG5cbiI+CisKKzwhIGdlbmVyYXRlIHJ1bGUvbWV0aG9kIGRlZmluaXRpb25zIGZvciBpbXBvcnRlZCBydWxlcyBzbyB0aGV5CisgICBhcHBlYXIgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIHJlY29nbml6ZXIuICE+CisgICAgLy8gRGVsZWdhdGVkIHJ1bGVzCis8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8CisgICAgcHVibGljIDxyZXR1cm5UeXBlKCk+IDxydWxlRGVzY3JpcHRvci5uYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pIHRocm93cyA8cnVsZURlc2NyaXB0b3IudGhyb3dzU3BlYzsgc2VwYXJhdG9yPSIsICI+IHsgPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT5yZXR1cm4gPGVuZGlmPjxydWxlRGVzY3JpcHRvci5ncmFtbWFyOmRlbGVnYXRlTmFtZSgpPi48cnVsZURlc2NyaXB0b3IubmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlLmF0dHJpYnV0ZXM6e2F8PGEubmFtZT59OyBzZXBhcmF0b3I9IiwgIj4pOyBcfX07IHNlcGFyYXRvcj0iXG4iPgorCisgICAgPHN5bnByZWRzOntwIHwgPHN5bnByZWQocCk+fT4KKworICAgIDxjeWNsaWNERkFzOntkZmEgfCBwcm90ZWN0ZWQgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBuZXcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4odGhpcyk7fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+IDwhIGR1bXAgdGFibGVzIGZvciBhbGwgREZBICE+CisKKyAgICA8Yml0c2V0czp7aXQgfCA8Yml0c2V0KG5hbWU9e0ZPTExPV188aXQubmFtZT5faW5fPGl0LmluTmFtZT48aXQudG9rZW5JbmRleD59LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkczY0PWl0LmJpdHMpPn0+Cit9Cis+PgorCitwYXJzZXJDdG9yQm9keSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Cit0aGlzLnN0YXRlLnJ1bGVNZW1vID0gbmV3IEhhc2hNYXBbPGxlbmd0aChncmFtbWFyLmFsbEltcG9ydGVkUnVsZXMpPisxXTs8XG4+IDwhIGluZGV4IGZyb20gMS4ubiAhPgorPGVuZGlmPgorPGVuZGlmPgorPGdyYW1tYXIuZGVsZWdhdG9yczoKKyB7Z3x0aGlzLjxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnOmRlbGVnYXRlTmFtZSgpPjt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3BhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgcnVsZXMsIG51bVJ1bGVzLCBiaXRzZXRzLAorICAgICAgIEFTVExhYmVsVHlwZT0iT2JqZWN0Iiwgc3VwZXJDbGFzcz0iUGFyc2VyIiwgbGFiZWxUeXBlPSJUb2tlbiIsCisgICAgICAgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgcnVsZXMsIG51bVJ1bGVzLAorICAgICAgICAgICAgICBiaXRzZXRzLCAiVG9rZW5TdHJlYW0iLCBzdXBlckNsYXNzLAorICAgICAgICAgICAgICBsYWJlbFR5cGUsIG1lbWJlcnMsICJUb2tlbiIsCisgICAgICAgICAgICAgIGZhbHNlLCBBU1RMYWJlbFR5cGUpPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHRyZWUgcGFyc2VyOyBzYW1lIGFzIHBhcnNlciBleGNlcHQgdGhlIGlucHV0CisgKiAgc3RyZWFtIGlzIGEgZGlmZmVyZW50IHR5cGUuCisgKi8KK3RyZWVQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIGdsb2JhbEFjdGlvbiwgcnVsZXMsCisgICAgICAgICAgIG51bVJ1bGVzLCBiaXRzZXRzLCBmaWx0ZXJNb2RlLCBsYWJlbFR5cGU9ezxBU1RMYWJlbFR5cGU+fSwgQVNUTGFiZWxUeXBlPSJPYmplY3QiLAorICAgICAgICAgICBzdXBlckNsYXNzPXs8aWYoZmlsdGVyTW9kZSk+PGlmKGJ1aWxkQVNUKT5UcmVlUmV3cml0ZXI8ZWxzZT5UcmVlRmlsdGVyPGVuZGlmPjxlbHNlPlRyZWVQYXJzZXI8ZW5kaWY+fSwKKyAgICAgICAgICAgbWVtYmVycz17PGFjdGlvbnMudHJlZXBhcnNlci5tZW1iZXJzPn0KKyAgICAgICAgICAgKSA6Oj0gPDwKKzxnZW5lcmljUGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsCisgICAgICAgICAgICAgIGJpdHNldHMsICJUcmVlTm9kZVN0cmVhbSIsIHN1cGVyQ2xhc3MsCisgICAgICAgICAgICAgIGxhYmVsVHlwZSwgbWVtYmVycywgIk5vZGUiLAorICAgICAgICAgICAgICBmaWx0ZXJNb2RlLCBBU1RMYWJlbFR5cGUpPgorPj4KKworLyoqIEEgc2ltcGxlciB2ZXJzaW9uIG9mIGEgcnVsZSB0ZW1wbGF0ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBpbWFnaW5hcnkKKyAqICBydWxlcyBjcmVhdGVkIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gIEFzIHRoZXkgbmV2ZXIgaGF2ZSByZXR1cm4gdmFsdWVzCisgKiAgbm9yIHBhcmFtZXRlcnMgZXRjLi4uLCBqdXN0IGdpdmUgc2ltcGxlc3QgcG9zc2libGUgbWV0aG9kLiAgRG9uJ3QgZG8KKyAqICBhbnkgb2YgdGhlIG5vcm1hbCBtZW1vaXphdGlvbiBzdHVmZiBpbiBoZXJlIGVpdGhlcjsgaXQncyBhIHdhc3RlLgorICogIEFzIHByZWRpY2F0ZXMgY2Fubm90IGJlIGlubGluZWQgaW50byB0aGUgaW52b2tpbmcgcnVsZSwgdGhleSBuZWVkIHRvCisgKiAgYmUgaW4gYSBydWxlIGJ5IHRoZW1zZWx2ZXMuCisgKi8KK3N5bnByZWRSdWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGRlc2NyaXB0aW9uLCBuYWtlZEJsb2NrKSA6Oj0KKzw8CisvLyAkQU5UTFIgc3RhcnQgPHJ1bGVOYW1lPgorcHVibGljIGZpbmFsIHZvaWQgPHJ1bGVOYW1lPl9mcmFnbWVudCg8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pIHRocm93cyA8cnVsZURlc2NyaXB0b3IudGhyb3dzU3BlYzp7eHw8eD59OyBzZXBhcmF0b3I9IiwgIj4geworICAgIDxydWxlTGFiZWxEZWZzKCk+Cis8aWYodHJhY2UpPgorICAgIHRyYWNlSW4oIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKyAgICB0cnkgeworICAgICAgICA8YmxvY2s+CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgICB0cmFjZU91dCgiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworICAgIH0KKzxlbHNlPgorICAgIDxibG9jaz4KKzxlbmRpZj4KK30KKy8vICRBTlRMUiBlbmQgPHJ1bGVOYW1lPgorPj4KKworc3lucHJlZChuYW1lKSA6Oj0gPDwKK3B1YmxpYyBmaW5hbCBib29sZWFuIDxuYW1lPigpIHsKKyAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrKzsKKyAgICA8QHN0YXJ0KCk+CisgICAgaW50IHN0YXJ0ID0gaW5wdXQubWFyaygpOworICAgIHRyeSB7CisgICAgICAgIDxuYW1lPl9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbXBvc3NpYmxlOiAiK3JlKTsKKyAgICB9CisgICAgYm9vbGVhbiBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZDsKKyAgICBpbnB1dC5yZXdpbmQoc3RhcnQpOworICAgIDxAc3RvcCgpPgorICAgIHN0YXRlLmJhY2t0cmFja2luZy0tOworICAgIHN0YXRlLmZhaWxlZD1mYWxzZTsKKyAgICByZXR1cm4gc3VjY2VzczsKK308XG4+Cis+PgorCitsZXhlclN5bnByZWQobmFtZSkgOjo9IDw8Cis8c3lucHJlZChuYW1lKT4KKz4+CisKK3J1bGVNZW1vaXphdGlvbihuYW1lKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KK2lmICggc3RhdGUuYmFja3RyYWNraW5nPjAgJiYgYWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pICkgeyByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjsgfQorPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byB0ZXN0IGZvciBmYWlsdXJlIGFuZCByZXR1cm4gZnJvbSBydWxlICovCitjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjs8ZW5kaWY+Cis+PgorCisvKiogVGhpcyBydWxlIGhhcyBmYWlsZWQsIGV4aXQgaW5kaWNhdGluZyBmYWlsdXJlIGR1cmluZyBiYWNrdHJhY2sgKi8KK3J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47fTxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBydWxlLiAgVGhpcyBpbmNsdWRlcyBhbnkgcmV0dXJuIHR5cGUKKyAqICBkYXRhIGFnZ3JlZ2F0ZXMgcmVxdWlyZWQgZm9yIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCisgKi8KK3J1bGUocnVsZU5hbWUscnVsZURlc2NyaXB0b3IsYmxvY2ssZW1wdHlSdWxlLGRlc2NyaXB0aW9uLGV4Y2VwdGlvbnMsZmluYWxseSxtZW1vaXplKSA6Oj0gPDwKKzxydWxlQXR0cmlidXRlU2NvcGUoc2NvcGU9cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT4KKzxyZXR1cm5TY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZSk+CisKKy8vICRBTlRMUiBzdGFydCAiPHJ1bGVOYW1lPiIKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorcHVibGljIGZpbmFsIDxyZXR1cm5UeXBlKCk+IDxydWxlTmFtZT4oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KSB0aHJvd3MgPHJ1bGVEZXNjcmlwdG9yLnRocm93c1NwZWM6e3h8PHg+fTsgc2VwYXJhdG9yPSIsICI+IHsKKyAgICA8aWYodHJhY2UpPnRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICA8cnVsZUxhYmVsRGVmcygpPgorICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgPEBwcmVhbWJsZSgpPgorICAgIHRyeSB7CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorICAgIH0KKzxpZihleGNlcHRpb25zKT4KKyAgICA8ZXhjZXB0aW9uczp7ZXw8Y2F0Y2goZGVjbD1lLmRlY2wsYWN0aW9uPWUuYWN0aW9uKT48XG4+fT4KKzxlbHNlPgorPGlmKCFlbXB0eVJ1bGUpPgorPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2gpPgorICAgIDxhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoPgorPGVsc2U+CisgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisJPEBzZXRFcnJvclJldHVyblZhbHVlKCk+CisgICAgfTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICBmaW5hbGx5IHsKKyAgICAJLy8gZG8gZm9yIHN1cmUgYmVmb3JlIGxlYXZpbmcKKyAgICAgICAgPGlmKHRyYWNlKT50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICAgICAgPG1lbW9pemUoKT4KKyAgICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgICAgPGZpbmFsbHk+CisgICAgfQorICAgIDxAcG9zdGFtYmxlKCk+CisgICAgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47Cit9CisvLyAkQU5UTFIgZW5kICI8cnVsZU5hbWU+IgorPj4KKworY2F0Y2goZGVjbCxhY3Rpb24pIDo6PSA8PAorY2F0Y2ggKDxlLmRlY2w+KSB7CisgICAgPGUuYWN0aW9uPgorfQorPj4KKworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxyZXR1cm5UeXBlKCk+IHJldHZhbCA9IG5ldyA8cmV0dXJuVHlwZSgpPigpOworcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk7PFxuPgorPGVsc2U+Cis8cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlczp7IGEgfAorPGEudHlwZT4gPGEubmFtZT4gPSA8aWYoYS5pbml0VmFsdWUpPjxhLmluaXRWYWx1ZT48ZWxzZT48aW5pdFZhbHVlKGEudHlwZSk+PGVuZGlmPjsKK30+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+CitpbnQgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSBpbnB1dC5pbmRleCgpOworPGVuZGlmPgorPj4KKworcnVsZVNjb3BlU2V0VXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6e2l0IHw8aXQ+X3N0YWNrLnB1c2gobmV3IDxpdD5fc2NvcGUoKSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdCB8PGl0Lm5hbWU+X3N0YWNrLnB1c2gobmV3IDxpdC5uYW1lPl9zY29wZSgpKTt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3J1bGVTY29wZUNsZWFuVXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6e2l0IHw8aXQ+X3N0YWNrLnBvcCgpO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7aXQgfDxpdC5uYW1lPl9zdGFjay5wb3AoKTt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscyxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXQgfDxsYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXQgfExpc3QgbGlzdF88aXQubGFiZWwudGV4dD49bnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHM6cnVsZUxhYmVsRGVmKCk7IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzOntsbHxSdWxlUmV0dXJuU2NvcGUgPGxsLmxhYmVsLnRleHQ+ID0gbnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK2xleGVyUnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzXQorICAgIDp7aXQgfDxsYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7aXQgfGludCA8aXQubGFiZWwudGV4dD47fTsgc2VwYXJhdG9yPSJcbiI+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOntpdCB8TGlzdCBsaXN0XzxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCitydWxlUmV0dXJuVmFsdWUoKSA6Oj0gPCUKKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNSZXR1cm5WYWx1ZSk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuTmFtZT4KKzxlbHNlPgorcmV0dmFsCis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighVFJFRV9QQVJTRVIpPgorcmV0dmFsLnN0b3AgPSBpbnB1dC5MVCgtMSk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworbWVtb2l6ZSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICkgeyBtZW1vaXplKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCk7IH0KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxydWxlRGVzY3JpcHRvcixibG9jayxtZW1vaXplKSA6Oj0gPDwKKy8vICRBTlRMUiBzdGFydCAiPHJ1bGVOYW1lPiIKK3B1YmxpYyBmaW5hbCB2b2lkIG08cnVsZU5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICA8aWYodHJhY2UpPnRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICB0cnkgeworPGlmKG5ha2VkQmxvY2spPgorICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz48XG4+Cis8ZWxzZT4KKyAgICAgICAgaW50IF90eXBlID0gPHJ1bGVOYW1lPjsKKyAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICA8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKzxlbmRpZj4KKyAgICB9CisgICAgZmluYWxseSB7CisgICAgCS8vIGRvIGZvciBzdXJlIGJlZm9yZSBsZWF2aW5nCisgICAgICAgIDxpZih0cmFjZSk+dHJhY2VPdXQoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgICAgIDxtZW1vaXplKCk+CisgICAgfQorfQorLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorcHVibGljIHZvaWQgbVRva2VucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgPGJsb2NrPjxcbj4KK30KKz4+CisKKy8vIFMgVSBCIFIgVSBMIEUgUworCisvKiogQSAoLi4uKSBzdWJydWxlIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRpdmVzICovCitibG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK2ludCBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworPGRlY2xzPgorPEBwcmVkZWNpc2lvbigpPgorPGRlY2lzaW9uPgorPEBwb3N0ZGVjaXNpb24oKT4KKzxAcHJlYnJhbmNoKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KK30KKzxAcG9zdGJyYW5jaCgpPgorPj4KKworLyoqIEEgcnVsZSBibG9jayB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworcnVsZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoraW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cis8ZGVjaXNpb24+Cis8QHBvc3RkZWNpc2lvbigpPgorc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisgICAgPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLGEpPn0+Cit9Cis+PgorCitydWxlQmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBIHNwZWNpYWwgY2FzZSBvZiBhICguLi4pIHN1YnJ1bGUgd2l0aCBhIHNpbmdsZSBhbHRlcm5hdGl2ZSAqLworYmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBICguLikrIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworcG9zaXRpdmVDbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitpbnQgY250PGRlY2lzaW9uTnVtYmVyPj0wOworPGRlY2xzPgorPEBwcmVsb29wKCk+Citsb29wPGRlY2lzaW9uTnVtYmVyPjoKK2RvIHsKKyAgICBpbnQgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisJPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLGEpPn0+CisJZGVmYXVsdCA6CisJICAgIGlmICggY250PGRlY2lzaW9uTnVtYmVyPiA+PSAxICkgYnJlYWsgbG9vcDxkZWNpc2lvbk51bWJlcj47CisJICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbig8ZGVjaXNpb25OdW1iZXI+LCBpbnB1dCk7CisgICAgICAgICAgICA8QGVhcmx5RXhpdEV4Y2VwdGlvbigpPgorICAgICAgICAgICAgdGhyb3cgZWVlOworICAgIH0KKyAgICBjbnQ8ZGVjaXNpb25OdW1iZXI+Kys7Cit9IHdoaWxlICh0cnVlKTsKKzxAcG9zdGxvb3AoKT4KKz4+CisKK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBwb3NpdGl2ZUNsb3N1cmVCbG9jaworCisvKiogQSAoLi4pKiBibG9jayB3aXRoIDEgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK2Nsb3N1cmVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlbG9vcCgpPgorbG9vcDxkZWNpc2lvbk51bWJlcj46CitkbyB7CisgICAgaW50IGFsdDxkZWNpc2lvbk51bWJlcj49PG1heEFsdD47CisgICAgPEBwcmVkZWNpc2lvbigpPgorICAgIDxkZWNpc2lvbj4KKyAgICA8QHBvc3RkZWNpc2lvbigpPgorICAgIHN3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikgeworCTxhbHRzOnthIHwgPGFsdFN3aXRjaENhc2UoaSxhKT59PgorCWRlZmF1bHQgOgorCSAgICBicmVhayBsb29wPGRlY2lzaW9uTnVtYmVyPjsKKyAgICB9Cit9IHdoaWxlICh0cnVlKTsKKzxAcG9zdGxvb3AoKT4KKz4+CisKK2Nsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gY2xvc3VyZUJsb2NrCisKKy8qKiBPcHRpb25hbCBibG9ja3MgKHgpPyBhcmUgdHJhbnNsYXRlZCB0byAoeHwpIGJ5IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24KKyAqICBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBibG9jayB0ZW1wbGF0ZQorICovCitvcHRpb25hbEJsb2NrIDo6PSBibG9jaworCitvcHRpb25hbEJsb2NrU2luZ2xlQWx0IDo6PSBibG9jaworCisvKiogQSBjYXNlIGluIGEgc3dpdGNoIHRoYXQganVtcHMgdG8gYW4gYWx0ZXJuYXRpdmUgZ2l2ZW4gdGhlIGFsdGVybmF0aXZlCisgKiAgbnVtYmVyLiAgQSBERkEgcHJlZGljdHMgdGhlIGFsdGVybmF0aXZlIGFuZCB0aGVuIGEgc2ltcGxlIHN3aXRjaAorICogIGRvZXMgdGhlIGp1bXAgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBtYXRjaGVzIHRoYXQgYWx0ZXJuYXRpdmUuCisgKi8KK2FsdFN3aXRjaENhc2UoYWx0TnVtLGFsdCkgOjo9IDw8CitjYXNlIDxhbHROdW0+IDoKKyAgICA8QHByZWFsdCgpPgorICAgIDxhbHQ+CisgICAgYnJlYWs7PFxuPgorPj4KKworLyoqIEFuIGFsdGVybmF0aXZlIGlzIGp1c3QgYSBsaXN0IG9mIGVsZW1lbnRzOyBhdCBvdXRlcm1vc3QgbGV2ZWwgKi8KK2FsdChlbGVtZW50cyxhbHROdW0sZGVzY3JpcHRpb24sYXV0b0FTVCxvdXRlckFsdCx0cmVlTGV2ZWwscmV3KSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworPEBkZWNsYXJhdGlvbnMoKT4KKzxlbGVtZW50czplbGVtZW50KCk+Cis8cmV3PgorPEBjbGVhbnVwKCk+Cit9Cis+PgorCisvKiogV2hhdCB0byBlbWl0IHdoZW4gdGhlcmUgaXMgbm8gcmV3cml0ZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9ICIiCisKKy8vIEUgTCBFIE0gRSBOIFQgUworCisvKiogRHVtcCB0aGUgZWxlbWVudHMgb25lIHBlciBsaW5lICovCitlbGVtZW50KGUpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGUuZWw+PFxuPgorPj4KKworLyoqIG1hdGNoIGEgdG9rZW4gb3B0aW9uYWxseSB3aXRoIGEgbGFiZWwgaW4gZnJvbnQgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw+PSg8bGFiZWxUeXBlPik8ZW5kaWY+bWF0Y2goaW5wdXQsPHRva2VuPixGT0xMT1dfPHRva2VuPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIGlkcys9SUQgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpPgorPGxpc3RMYWJlbChsYWJlbCwgbGFiZWwpPgorPj4KKworbGlzdExhYmVsKGxhYmVsLGVsZW0pIDo6PSA8PAoraWYgKGxpc3RfPGxhYmVsPj09bnVsbCkgbGlzdF88bGFiZWw+PW5ldyBBcnJheUxpc3QoKTsKK2xpc3RfPGxhYmVsPi5hZGQoPGVsZW0+KTs8XG4+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgKi8KK2NoYXJSZWYoY2hhcixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK21hdGNoKDxjaGFyPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgcmFuZ2UgKi8KK2NoYXJSYW5nZVJlZihhLGIsbGFiZWwpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CittYXRjaFJhbmdlKDxhPiw8Yj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxwb3N0bWF0Y2hDb2RlPSIiKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8aWYoTEVYRVIpPgorPGxhYmVsPj0gaW5wdXQuTEEoMSk7PFxuPgorPGVsc2U+Cis8bGFiZWw+PSg8bGFiZWxUeXBlPilpbnB1dC5MVCgxKTs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+CitpZiAoIDxzPiApIHsKKyAgICBpbnB1dC5jb25zdW1lKCk7CisgICAgPHBvc3RtYXRjaENvZGU+Cis8aWYoIUxFWEVSKT4KKyAgICBzdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworPGVuZGlmPgorICAgIDxpZihiYWNrdHJhY2tpbmcpPnN0YXRlLmZhaWxlZD1mYWxzZTs8ZW5kaWY+Cit9CitlbHNlIHsKKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgIDxAbWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpPgorPGlmKExFWEVSKT4KKyAgICByZWNvdmVyKG1zZSk7CisgICAgdGhyb3cgbXNlOworPGVsc2U+CisgICAgdGhyb3cgbXNlOworICAgIDwhIHVzZSBmb2xsb3dpbmcgY29kZSB0byBtYWtlIGl0IHJlY292ZXIgaW5saW5lOyByZW1vdmUgdGhyb3cgbXNlOworICAgIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldChpbnB1dCxtc2UsRk9MTE9XX3NldF9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworICAgICE+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQgOjo9IG1hdGNoU2V0CisKK21hdGNoU2V0QW5kTGlzdExhYmVsKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCBsYWJlbCk+Cis+PgorCisvKiogTWF0Y2ggYSBzdHJpbmcgbGl0ZXJhbCAqLworbGV4ZXJTdHJpbmdSZWYoc3RyaW5nLGxhYmVsLGVsZW1lbnRJbmRleD0iMCIpIDo6PSA8PAorPGlmKGxhYmVsKT4KK2ludCA8bGFiZWw+U3RhcnQgPSBnZXRDaGFySW5kZXgoKTsKK21hdGNoKDxzdHJpbmc+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK2ludCA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4gPSBnZXRMaW5lKCk7CitpbnQgPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+ID0gZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7Cis8bGFiZWw+ID0gbmV3IDxsYWJlbFR5cGU+KGlucHV0LCBUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUsIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwgPGxhYmVsPlN0YXJ0LCBnZXRDaGFySW5kZXgoKS0xKTsKKzxsYWJlbD4uc2V0TGluZSg8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4pOworPGxhYmVsPi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+KTsKKzxlbHNlPgorbWF0Y2goPHN0cmluZz4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxlbmRpZj4KKz4+CisKK3dpbGRjYXJkKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD49KDxsYWJlbFR5cGU+KWlucHV0LkxUKDEpOzxcbj4KKzxlbmRpZj4KK21hdGNoQW55KGlucHV0KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKK3dpbGRjYXJkQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCBsYWJlbCk+Cis+PgorCisvKiogTWF0Y2ggLiB3aWxkY2FyZCBpbiBsZXhlciAqLword2lsZGNhcmRDaGFyKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8ZW5kaWY+CittYXRjaEFueSgpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKword2lsZGNhcmRDaGFyTGlzdExhYmVsKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkQ2hhcihsYWJlbCwgZWxlbWVudEluZGV4KT4KKzxsaXN0TGFiZWwobGFiZWwsIGxhYmVsKT4KKz4+CisKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4gIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZQorICogIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcworICogIHNhbWU6IHRoZSBydWxlIG5hbWUuICBOb3cgdGhvdWdoIHlvdSBjYW4gYWNjZXNzIGZ1bGwgcnVsZQorICogIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitwdXNoRm9sbG93KEZPTExPV188cnVsZS5uYW1lPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworPGlmKGxhYmVsKT48bGFiZWw+PTxlbmRpZj48aWYoc2NvcGUpPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4uPGVuZGlmPjxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOzxcbj4KK3N0YXRlLl9mc3AtLTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1yICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSk+Cis8bGlzdExhYmVsKGxhYmVsLCBsYWJlbCk+Cis+PgorCisvKiogQSBsZXhlciBydWxlIHJlZmVyZW5jZS4KKyAqCisgKiAgVGhlICdydWxlJyBhcmd1bWVudCB3YXMgdGhlIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cKKyAqICBpcyB0eXBlIFJ1bGUsIHdob3NlIHRvU3RyaW5nIGlzIHNhbWU6IHRoZSBydWxlIG5hbWUuCisgKiAgTm93IHRob3VnaCB5b3UgY2FuIGFjY2VzcyBmdWxsIHJ1bGUgZGVzY3JpcHRvciBzdHVmZi4KKyAqLworbGV4ZXJSdWxlUmVmKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGlmKGxhYmVsKT4KK2ludCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IGdldENoYXJJbmRleCgpOworaW50IDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PiA9IGdldExpbmUoKTsKK2ludCA8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4gPSBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKKzxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGxhYmVsPiA9IG5ldyA8bGFiZWxUeXBlPihpbnB1dCwgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFLCBUb2tlbi5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+LCBnZXRDaGFySW5kZXgoKS0xKTsKKzxsYWJlbD4uc2V0TGluZSg8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4pOworPGxhYmVsPi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+KTsKKzxlbHNlPgorPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj5tPHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogaSs9SU5UIGluIGxleGVyICovCitsZXhlclJ1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSkgOjo9IDw8Cis8bGV4ZXJSdWxlUmVmKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpPgorPGxpc3RMYWJlbChsYWJlbCwgbGFiZWwpPgorPj4KKworLyoqIEVPRiBpbiB0aGUgbGV4ZXIgKi8KK2xleGVyTWF0Y2hFT0YobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+CitpbnQgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4gPSBnZXRDaGFySW5kZXgoKTsKK2ludCA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4gPSBnZXRMaW5lKCk7CitpbnQgPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+ID0gZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CittYXRjaChFT0YpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGxhYmVsVHlwZT4gPGxhYmVsPiA9IG5ldyA8bGFiZWxUeXBlPihpbnB1dCwgRU9GLCBUb2tlbi5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+LCBnZXRDaGFySW5kZXgoKS0xKTsKKzxsYWJlbD4uc2V0TGluZSg8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4pOworPGxhYmVsPi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+KTsKKzxlbHNlPgorbWF0Y2goRU9GKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKz4+CisKKy8vIHVzZWQgZm9yIGxlZnQtcmVjdXJzaXZlIHJ1bGVzCityZWNSdWxlRGVmQXJnKCkgICAgICAgICAgICAgICAgICAgICAgIDo6PSAiaW50IDxyZWNSdWxlQXJnKCk+IgorcmVjUnVsZUFyZygpICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIl9wIgorcmVjUnVsZUFsdFByZWRpY2F0ZShydWxlTmFtZSxvcFByZWMpICA6Oj0gIjxyZWNSdWxlQXJnKCk+IFw8PSA8b3BQcmVjPiIKK3JlY1J1bGVTZXRSZXN1bHRBY3Rpb24oKSAgICAgICAgICAgICAgOjo9ICJyb290XzA9JDxydWxlTmFtZT5fcHJpbWFyeS50cmVlOyIKK3JlY1J1bGVTZXRSZXR1cm5BY3Rpb24oc3JjLG5hbWUpICAgICAgOjo9ICIkPG5hbWU+PSQ8c3JjPi48bmFtZT47IgorCisvKiogbWF0Y2ggXihyb290IGNoaWxkcmVuKSBpbiB0cmVlIHBhcnNlciAqLwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsCisgICAgIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxyb290OmVsZW1lbnQoKT4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIGlucHV0LkxBKDEpPT1Ub2tlbi5ET1dOICkgeworICAgIG1hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICAgIG1hdGNoKGlucHV0LCBUb2tlbi5VUCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cit9Cis8ZWxzZT4KK21hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxjaGlsZHJlbjplbGVtZW50KCk+CittYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIEV2ZXJ5IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdmFsaWRhdGluZyBwcmVkaWNhdGUgKGV2ZW4gd2hlbiBpdCBpcworICogIGFsc28gaG9pc3RlZCBpbnRvIGEgcHJlZGljdGlvbiBleHByZXNzaW9uKS4KKyAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2lmICggISg8ZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKT4pICkgeworICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICI8cnVsZU5hbWU+IiwgIjxkZXNjcmlwdGlvbj4iKTsKK30KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChpZi10aGVuLWVsc2UpCisKK2RmYVN0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK2ludCBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LkxBKDxrPik7PFxuPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorZWxzZSB7Cis8aWYoZW90UHJlZGljdHNBbHQpPgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKzxlbHNlPgorICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjxkZXNjcmlwdGlvbj4iLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCBpbnB1dCk7PFxuPgorICAgIDxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKyAgICB0aHJvdyBudmFlOzxcbj4KKzxlbmRpZj4KK30KKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lIGxvb2thaGVhZAorICogIGZvciB0aGUgYnlwYXNzIGFsdGVybmF0aXZlLiAgSXQgZGVsYXlzIGVycm9yIGRldGVjdGlvbiBidXQgdGhpcworICogIGlzIGZhc3Rlciwgc21hbGxlciwgYW5kIG1vcmUgd2hhdCBwZW9wbGUgZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlCisgKiAgZXhwZWN0ICJpZiAoIExBKDEpPT1YICkgbWF0Y2goWCk7IiBhbmQgdGhhdCdzIGl0LgorICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAoraW50IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoPGs+KTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+Cis+PgorCisvKiogQSBERkEgc3RhdGUgdGhhdCBpcyBhY3R1YWxseSB0aGUgbG9vcGJhY2sgZGVjaXNpb24gb2YgYSBjbG9zdXJlCisgKiAgbG9vcC4gIElmIGVuZC1vZi10b2tlbiAoRU9UKSBwcmVkaWN0cyBhbnkgb2YgdGhlIHRhcmdldHMgdGhlbiBpdAorICogIHNob3VsZCBhY3QgbGlrZSBhIGRlZmF1bHQgY2xhdXNlIChpLmUuLCBubyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkKS4KKyAqICBUaGlzIGlzIHVzZWQgb25seSBpbiB0aGUgbGV4ZXIgc28gdGhhdCBmb3IgKCdhJykqIG9uIHRoZSBlbmQgb2YgYSBydWxlCisgKiAgYW55dGhpbmcgb3RoZXIgdGhhbiAnYScgcHJlZGljdHMgZXhpdGluZy4KKyAqLworZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitpbnQgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj48XG4+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorPGlmKCFlZGdlcyk+CithbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD47IDwhIGlmIG5vIGVkZ2VzLCBkb24ndCBnZW4gRUxTRSAhPgorPGVsc2U+CitlbHNlIHsKKyAgICBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD47Cit9PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEFuIGFjY2VwdCBzdGF0ZSBpbmRpY2F0ZXMgYSB1bmlxdWUgYWx0ZXJuYXRpdmUgaGFzIGJlZW4gcHJlZGljdGVkICovCitkZmFBY2NlcHRTdGF0ZShhbHQpIDo6PSAiYWx0PGRlY2lzaW9uTnVtYmVyPj08YWx0PjsiCisKKy8qKiBBIHNpbXBsZSBlZGdlIHdpdGggYW4gZXhwcmVzc2lvbi4gIElmIHRoZSBleHByZXNzaW9uIGlzIHNhdGlzZmllZCwKKyAqICBlbnRlciB0byB0aGUgdGFyZ2V0IHN0YXRlLiAgVG8gaGFuZGxlIGdhdGVkIHByb2R1Y3Rpb25zLCB3ZSBtYXkKKyAqICBoYXZlIHRvIGV2YWx1YXRlIHNvbWUgcHJlZGljYXRlcyBmb3IgdGhpcyBlZGdlLgorICovCitkZmFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGUsIHByZWRpY2F0ZXMpIDo6PSA8PAoraWYgKCAoPGxhYmVsRXhwcj4pIDxpZihwcmVkaWNhdGVzKT4mJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pIHsKKyAgICA8dGFyZ2V0U3RhdGU+Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoc3dpdGNoIGNhc2UpCisKKy8qKiBBIERGQSBzdGF0ZSB3aGVyZSBhIFNXSVRDSCBtYXkgYmUgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgZ2VuZXJhdG9yCisgKiAgZGVjaWRlcyBpZiB0aGlzIGlzIHBvc3NpYmxlOiBDb2RlR2VuZXJhdG9yLmNhbkdlbmVyYXRlU3dpdGNoKCkuCisgKi8KK2RmYVN0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoIGlucHV0LkxBKDxrPikgKSB7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorZGVmYXVsdDoKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworPGVsc2U+CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiPGRlc2NyaXB0aW9uPiIsIDxkZWNpc2lvbk51bWJlcj4sIDxzdGF0ZU51bWJlcj4sIGlucHV0KTs8XG4+CisgICAgPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorICAgIHRocm93IG52YWU7PFxuPgorPGVuZGlmPgorfTxcbj4KKz4+CisKK2RmYU9wdGlvbmFsQmxvY2tTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKCBpbnB1dC5MQSg8az4pICkgeworICAgIDxlZGdlczsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorPj4KKworZGZhTG9vcGJhY2tTdGF0ZVN3aXRjaChrLCBlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoICggaW5wdXQuTEEoPGs+KSApIHsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KK2RlZmF1bHQ6CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworICAgIGJyZWFrOzxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAorPGxhYmVsczp7aXQgfGNhc2UgPGl0Pjp9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICB7CisgICAgPHRhcmdldFN0YXRlPgorICAgIH0KKyAgICBicmVhazsKKz4+CisKKy8vIEMgeSBjIGwgaSBjICBEIEYgQQorCisvKiogVGhlIGNvZGUgdG8gaW5pdGlhdGUgZXhlY3V0aW9uIG9mIGEgY3ljbGljIERGQTsgdGhpcyBpcyB1c2VkCisgKiAgaW4gdGhlIHJ1bGUgdG8gcHJlZGljdCBhbiBhbHQganVzdCBsaWtlIHRoZSBmaXhlZCBERkEgY2FzZS4KKyAqICBUaGUgPG5hbWU+IGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgdmlhIHRoZSBwYXJzZXIsIGxleGVyLCAuLi4KKyAqLworZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorYWx0PGRlY2lzaW9uTnVtYmVyPiA9IGRmYTxkZWNpc2lvbk51bWJlcj4ucHJlZGljdChpbnB1dCk7Cis+PgorCisvKiBEdW1wIERGQSB0YWJsZXMgYXMgcnVuLWxlbmd0aC1lbmNvZGVkIFN0cmluZ3Mgb2Ygb2N0YWwgdmFsdWVzLgorICogQ2FuJ3QgdXNlIGhleCBhcyBjb21waWxlciB0cmFuc2xhdGVzIHRoZW0gYmVmb3JlIGNvbXBpbGF0aW9uLgorICogVGhlc2Ugc3RyaW5ncyBhcmUgc3BsaXQgaW50byBtdWx0aXBsZSwgY29uY2F0ZW5hdGVkIHN0cmluZ3MuCisgKiBKYXZhIHB1dHMgdGhlbSBiYWNrIHRvZ2V0aGVyIGF0IGNvbXBpbGUgdGltZSB0aGFua2Z1bGx5LgorICogSmF2YSBjYW5ub3QgaGFuZGxlIGxhcmdlIHN0YXRpYyBhcnJheXMsIHNvIHdlJ3JlIHN0dWNrIHdpdGggdGhpcworICogZW5jb2RlL2RlY29kZSBhcHByb2FjaC4gIFNlZSBhbmFseXNpcyBhbmQgcnVudGltZSBERkEgZm9yCisgKiB0aGUgZW5jb2RpbmcgbWV0aG9kcy4KKyAqLworY3ljbGljREZBKGRmYSkgOjo9IDw8CitzdGF0aWMgZmluYWwgU3RyaW5nIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvdFMgPQorICAgICI8ZGZhLmphdmFDb21wcmVzc2VkRU9UOyB3cmFwPSJcIitcbiAgICBcIiI+IjsKK3N0YXRpYyBmaW5hbCBTdHJpbmcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mUyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRFT0Y7IHdyYXA9IlwiK1xuICAgIFwiIj4iOworc3RhdGljIGZpbmFsIFN0cmluZyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW5TID0KKyAgICAiPGRmYS5qYXZhQ29tcHJlc3NlZE1pbjsgd3JhcD0iXCIrXG4gICAgXCIiPiI7CitzdGF0aWMgZmluYWwgU3RyaW5nIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFMgPQorICAgICI8ZGZhLmphdmFDb21wcmVzc2VkTWF4OyB3cmFwPSJcIitcbiAgICBcIiI+IjsKK3N0YXRpYyBmaW5hbCBTdHJpbmcgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0UyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRBY2NlcHQ7IHdyYXA9IlwiK1xuICAgIFwiIj4iOworc3RhdGljIGZpbmFsIFN0cmluZyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsUyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRTcGVjaWFsOyB3cmFwPSJcIitcbiAgICBcIiI+fT4iOworc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TID0geworICAgICAgICA8ZGZhLmphdmFDb21wcmVzc2VkVHJhbnNpdGlvbjp7c3wiPHM7IHdyYXA9IlwiK1xuXCIiPiJ9OyBzZXBhcmF0b3I9IixcbiI+Cit9OworCitzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb3RTKTsKK3N0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZlMpOworc3RhdGljIGZpbmFsIGNoYXJbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW5TKTsKK3N0YXRpYyBmaW5hbCBjaGFyW10gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4Uyk7CitzdGF0aWMgZmluYWwgc2hvcnRbXSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHRTKTsKK3N0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsUyk7CitzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb247CisKK3N0YXRpYyB7CisgICAgaW50IG51bVN0YXRlcyA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICBmb3IgKGludCBpPTA7IGlcPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uU1tpXSk7CisgICAgfQorfQorCitjbGFzcyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiBleHRlbmRzIERGQSB7CisKKyAgICBwdWJsaWMgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4oQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gPGRmYS5kZWNpc2lvbk51bWJlcj47CisgICAgICAgIHRoaXMuZW90ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OworICAgICAgICB0aGlzLmVvZiA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZjsKKyAgICAgICAgdGhpcy5taW4gPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW47CisgICAgICAgIHRoaXMubWF4ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OworICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdDsKKyAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbDsKKyAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbjsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICI8ZGZhLmRlc2NyaXB0aW9uPiI7CisgICAgfQorICAgIDxAZXJyb3JNZXRob2QoKT4KKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKyAgICBwdWJsaWMgaW50IHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oaW50IHMsIEludFN0cmVhbSBfaW5wdXQpIHRocm93cyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiB7CisgICAgICAgIDxpZihMRVhFUik+CisgICAgICAgIEludFN0cmVhbSBpbnB1dCA9IF9pbnB1dDsKKyAgICAgICAgPGVuZGlmPgorICAgICAgICA8aWYoUEFSU0VSKT4KKyAgICAgICAgVG9rZW5TdHJlYW0gaW5wdXQgPSAoVG9rZW5TdHJlYW0pX2lucHV0OworICAgICAgICA8ZW5kaWY+CisgICAgICAgIDxpZihUUkVFX1BBUlNFUik+CisgICAgICAgIFRyZWVOb2RlU3RyZWFtIGlucHV0ID0gKFRyZWVOb2RlU3RyZWFtKV9pbnB1dDsKKyAgICAgICAgPGVuZGlmPgorICAgIAlpbnQgX3MgPSBzOworICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICA8ZGZhLnNwZWNpYWxTdGF0ZVNUczp7c3RhdGUgfAorICAgICAgICBjYXNlIDxpMD4gOiA8ISBjb21wcmVzc2VkIHNwZWNpYWwgc3RhdGUgbnVtYmVycyAwLi5uLTEgIT4KKyAgICAgICAgICAgIDxzdGF0ZT59OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgfQorPGlmKGJhY2t0cmFja2luZyk+CisgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fTxcbj4KKzxlbmRpZj4KKyAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgPGRmYS5kZWNpc2lvbk51bWJlcj4sIF9zLCBpbnB1dCk7CisgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICB0aHJvdyBudmFlOworICAgIH08XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworLyoqIEEgc3RhdGUgaW4gYSBjeWNsaWMgREZBOyBpdCdzIGEgc3BlY2lhbCBzdGF0ZSBhbmQgcGFydCBvZiBhIGJpZyBzd2l0Y2ggb24KKyAqICBzdGF0ZS4KKyAqLworY3ljbGljREZBU3RhdGUoZGVjaXNpb25OdW1iZXIsc3RhdGVOdW1iZXIsZWRnZXMsbmVlZEVycm9yQ2xhdXNlLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitpbnQgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSgxKTs8XG4+Cis8aWYoc2VtUHJlZFN0YXRlKT4gPCEgZ2V0IG5leHQgbG9va2FoZWFkIHN5bWJvbCB0byB0ZXN0IGVkZ2VzLCB0aGVuIHJld2luZCAhPgoraW50IGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuaW5kZXgoKTsKK2lucHV0LnJld2luZCgpOzxcbj4KKzxlbmRpZj4KK3MgPSAtMTsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKzxpZihzZW1QcmVkU3RhdGUpPiA8ISByZXR1cm4gaW5wdXQgY3Vyc29yIHRvIHN0YXRlIGJlZm9yZSB3ZSByZXdvdW5kICE+CitpbnB1dC5zZWVrKGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+KTs8XG4+Cis8ZW5kaWY+CitpZiAoIHM+PTAgKSByZXR1cm4gczsKK2JyZWFrOworPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rYWhlYWQgYW5kIGluZGljYXRlIHdoYXQKKyAqICBzdGF0ZSB0byBqdW1wIHRvIG5leHQgaWYgc3VjY2Vzc2Z1bC4KKyAqLworY3ljbGljREZBRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlTnVtYmVyLCBlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7cyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47fTxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkgY2hhcjsKKyAqICBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICovCitlb3RERkFFZGdlKHRhcmdldFN0YXRlTnVtYmVyLGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPgorPj4KKworCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoPGxlZnQ+JiY8cmlnaHQ+KSIKKworb3JQcmVkaWNhdGVzKG9wZXJhbmRzKSA6Oj0gIig8Zmlyc3Qob3BlcmFuZHMpPjxyZXN0KG9wZXJhbmRzKTp7byB8IHx8PG8+fT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxldmFsUHJlZGljYXRlKHByZWQse30pPikiCisKK2V2YWxQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICIoPHByZWQ+KSIKKworZXZhbFN5blByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIjxwcmVkPigpIgorCitsb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj49PTxhdG9tPiIKKworLyoqIFNvbWV0aW1lcyBhIGxvb2thaGVhZCB0ZXN0IGNhbm5vdCBhc3N1bWUgdGhhdCBMQShrKSBpcyBpbiBhIHRlbXAgdmFyaWFibGUKKyAqICBzb21ld2hlcmUuICBNdXN0IGFzayBmb3IgdGhlIGxvb2thaGVhZCBkaXJlY3RseS4KKyAqLworaXNvbGF0ZWRMb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiaW5wdXQuTEEoPGs+KT09PGF0b20+IgorCitsb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSA8JQorKExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID49IDxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gXDw9IDx1cHBlcj4pCislPgorCitpc29sYXRlZExvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9ICIoaW5wdXQuTEEoPGs+KSA+PSA8bG93ZXI+ICYmIGlucHV0LkxBKDxrPikgXDw9IDx1cHBlcj4pIgorCitzZXRUZXN0KHJhbmdlcykgOjo9IDw8Cis8cmFuZ2VzOyBzZXBhcmF0b3I9Inx8Ij4KKz4+CisKKy8vIEEgVCBUIFIgSSBCIFUgVCBFIFMKKworZ2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyA8c2NvcGUubmFtZT5fc2NvcGUgeworICAgIDxzY29wZS5hdHRyaWJ1dGVzOntpdCB8PGl0LmRlY2w+O307IHNlcGFyYXRvcj0iXG4iPgorfQorcHJvdGVjdGVkIFN0YWNrIDxzY29wZS5uYW1lPl9zdGFjayA9IG5ldyBTdGFjaygpOzxcbj4KKzxlbmRpZj4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+Citwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIDxzY29wZS5uYW1lPl9zY29wZSB7CisgICAgPHNjb3BlLmF0dHJpYnV0ZXM6e2l0IHw8aXQuZGVjbD47fTsgc2VwYXJhdG9yPSJcbiI+Cit9Citwcm90ZWN0ZWQgU3RhY2sgPHNjb3BlLm5hbWU+X3N0YWNrID0gbmV3IFN0YWNrKCk7PFxuPgorPGVuZGlmPgorPj4KKworcmV0dXJuU3RydWN0TmFtZShyKSA6Oj0gIjxyLm5hbWU+X3JldHVybiIKKworcmV0dXJuVHlwZSgpIDo6PSA8JQorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxydWxlRGVzY3JpcHRvci5ncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPgorPGVsc2U+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuVHlwZT4KKzxlbHNlPgordm9pZAorPGVuZGlmPgorPGVuZGlmPgorJT4KKworLyoqIEdlbmVyYXRlIHRoZSBKYXZhIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIG9yIG11bHRpcGxlIHJldHVybgorICogIHZhbHVlcy4KKyAqLworcnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZSkgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJlZmVyZW5jZWRSdWxlLmdyYW1tYXIucmVjb2duaXplck5hbWU+LjxyZWZlcmVuY2VkUnVsZS5uYW1lPl9yZXR1cm4KKzxlbHNlPgorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKyU+CisKK2RlbGVnYXRlTmFtZShkKSA6Oj0gPDwKKzxpZihkLmxhYmVsKT48ZC5sYWJlbD48ZWxzZT5nPGQubmFtZT48ZW5kaWY+Cis+PgorCisvKiogVXNpbmcgYSB0eXBlIHRvIGluaXQgdmFsdWUgbWFwLCB0cnkgdG8gaW5pdCBhIHR5cGU7IGlmIG5vdCBpbiB0YWJsZQorICogIG11c3QgYmUgYW4gb2JqZWN0LCBkZWZhdWx0IHZhbHVlIGlzICJudWxsIi4KKyAqLworaW5pdFZhbHVlKHR5cGVOYW1lKSA6Oj0gPDwKKzxqYXZhVHlwZUluaXRNYXAuKHR5cGVOYW1lKT4KKz4+CisKKy8qKiBEZWZpbmUgYSBydWxlIGxhYmVsIGluY2x1ZGluZyBkZWZhdWx0IHZhbHVlICovCitydWxlTGFiZWxEZWYobGFiZWwpIDo6PSA8JQorPHJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpPiA8bGFiZWwubGFiZWwudGV4dD4gPQorIDxpbml0VmFsdWUodHlwZU5hbWU9cnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZT1sYWJlbC5yZWZlcmVuY2VkUnVsZSkpPjs8XG4+CislPgorCisvKiogRGVmaW5lIGEgcmV0dXJuIHN0cnVjdCBmb3IgYSBydWxlIGlmIHRoZSBjb2RlIG5lZWRzIHRvIGFjY2VzcyBpdHMKKyAqICBzdGFydC9zdG9wIHRva2VucywgdHJlZSBzdHVmZiwgYXR0cmlidXRlcywgLi4uICBMZWF2ZSBhIGhvbGUgZm9yCisgKiAgc3ViZ3JvdXBzIHRvIHN0aWNrIGluIG1lbWJlcnMuCisgKi8KK3JldHVyblNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitwdWJsaWMgc3RhdGljIGNsYXNzIDxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+IGV4dGVuZHMgPGlmKFRSRUVfUEFSU0VSKT5UcmVlPGVsc2U+UGFyc2VyPGVuZGlmPlJ1bGVSZXR1cm5TY29wZSB7CisgICAgPHNjb3BlLmF0dHJpYnV0ZXM6e2l0IHxwdWJsaWMgPGl0LmRlY2w+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAcnVsZVJldHVybk1lbWJlcnMoKT4KK307Cis8ZW5kaWY+Cis+PgorCitwYXJhbWV0ZXJTY29wZShzY29wZSkgOjo9IDw8Cis8c2NvcGUuYXR0cmlidXRlczp7aXQgfDxpdC5kZWNsPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSAiPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+ID08ZXhwcj47IgorCitzY29wZUF0dHJpYnV0ZVJlZihzY29wZSxhdHRyLGluZGV4LG5lZ0luZGV4KSA6Oj0gPCUKKzxpZihuZWdJbmRleCk+CisoKDxzY29wZT5fc2NvcGUpPHNjb3BlPl9zdGFjay5lbGVtZW50QXQoPHNjb3BlPl9zdGFjay5zaXplKCktPG5lZ0luZGV4Pi0xKSkuPGF0dHIubmFtZT4KKzxlbHNlPgorPGlmKGluZGV4KT4KKygoPHNjb3BlPl9zY29wZSk8c2NvcGU+X3N0YWNrLmVsZW1lbnRBdCg8aW5kZXg+KSkuPGF0dHIubmFtZT4KKzxlbHNlPgorKCg8c2NvcGU+X3Njb3BlKTxzY29wZT5fc3RhY2sucGVlaygpKS48YXR0ci5uYW1lPgorPGVuZGlmPgorPGVuZGlmPgorJT4KKworc2NvcGVTZXRBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixleHByLGluZGV4LG5lZ0luZGV4KSA6Oj0gPCUKKzxpZihuZWdJbmRleCk+CisoKDxzY29wZT5fc2NvcGUpPHNjb3BlPl9zdGFjay5lbGVtZW50QXQoPHNjb3BlPl9zdGFjay5zaXplKCktPG5lZ0luZGV4Pi0xKSkuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPGlmKGluZGV4KT4KKygoPHNjb3BlPl9zY29wZSk8c2NvcGU+X3N0YWNrLmVsZW1lbnRBdCg8aW5kZXg+KSkuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorKCg8c2NvcGU+X3Njb3BlKTxzY29wZT5fc3RhY2sucGVlaygpKS48YXR0ci5uYW1lPiA9PGV4cHI+OworPGVuZGlmPgorPGVuZGlmPgorJT4KKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsgcmVmZXJzCisgKiAgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJlZGljYXRlcworICogIGxpa2UgeyRmdW5jdGlvbi5zaXplKCk+MCAmJiAkZnVuY3Rpb246Om5hbWUuZXF1YWxzKCJmb28iKX0/CisgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gIjxzY29wZT5fc3RhY2siCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorKDxzY29wZT4hPW51bGw/PHNjb3BlPi48YXR0ci5uYW1lPjo8aW5pdFZhbHVlKGF0dHIudHlwZSk+KQorPGVsc2U+Cis8c2NvcGU+Cis8ZW5kaWY+CislPgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKzxhdHRyLm5hbWU+Cis8ZW5kaWY+CislPgorCityZXR1cm5TZXRBdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cixleHByKSA6Oj0gPCUKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CityZXR2YWwuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbmRpZj4KKyU+CisKKy8qKiBIb3cgdG8gdHJhbnNsYXRlICR0b2tlbkxhYmVsICovCit0b2tlbkxhYmVsUmVmKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0XzxsYWJlbD4iCisKKworLy8gbm90IHN1cmUgdGhlIG5leHQgYXJlIHRoZSByaWdodCBhcHByb2FjaAorCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsPzxzY29wZT4uZ2V0VGV4dCgpOm51bGwpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LmdldFR5cGUoKTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5nZXRMaW5lKCk6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5nZXRDaGFubmVsKCk6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LmdldFRva2VuSW5kZXgoKTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPl90cmVlIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+IT1udWxsP0ludGVnZXIudmFsdWVPZig8c2NvcGU+LmdldFRleHQoKSk6MCkiCisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/KCg8bGFiZWxUeXBlPik8c2NvcGU+LnN0YXJ0KTpudWxsKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bnVsbD8oKDxsYWJlbFR5cGU+KTxzY29wZT4uc3RvcCk6bnVsbCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/KCg8QVNUTGFiZWxUeXBlPik8c2NvcGU+LnRyZWUpOm51bGwpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPCUKKzxpZihUUkVFX1BBUlNFUik+CisoPHNjb3BlPiE9bnVsbD8oaW5wdXQuZ2V0VG9rZW5TdHJlYW0oKS50b1N0cmluZygKKyAgaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0YXJ0SW5kZXgoPHNjb3BlPi5zdGFydCksCisgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgoPHNjb3BlPi5zdGFydCkpKTpudWxsKQorPGVsc2U+CisoPHNjb3BlPiE9bnVsbD9pbnB1dC50b1N0cmluZyg8c2NvcGU+LnN0YXJ0LDxzY29wZT4uc3RvcCk6bnVsbCkKKzxlbmRpZj4KKyU+CisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5zdDpudWxsKSIKKworLyoqIElzb2xhdGVkICRSVUxFIHJlZiBvayBpbiBsZXhlciBhcyBpdCdzIGEgVG9rZW4gKi8KK2xleGVyUnVsZUxhYmVsKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0KKyAgICAiKDxzY29wZT4hPW51bGw/PHNjb3BlPi5nZXRUeXBlKCk6MCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uZ2V0TGluZSgpOjApIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk6LTEpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LmdldENoYW5uZWwoKTowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9CisgICAgIig8c2NvcGU+IT1udWxsPzxzY29wZT4uZ2V0VG9rZW5JbmRleCgpOjApIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD88c2NvcGU+LmdldFRleHQoKTpudWxsKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PQorICAgICIoPHNjb3BlPiE9bnVsbD9JbnRlZ2VyLnZhbHVlT2YoPHNjb3BlPi5nZXRUZXh0KCkpOjApIgorCisvLyBTb21lYm9keSBtYXkgcmVmICR0ZW1wbGF0ZSBvciAkdHJlZSBvciAkc3RvcCB3aXRoaW4gYSBydWxlOgorcnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKCg8bGFiZWxUeXBlPilyZXR2YWwuc3RhcnQpIgorcnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoKDxsYWJlbFR5cGU+KXJldHZhbC5zdG9wKSIKK3J1bGVQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKCg8QVNUTGFiZWxUeXBlPilyZXR2YWwudHJlZSkiCitydWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPCUKKzxpZihUUkVFX1BBUlNFUik+CitpbnB1dC5nZXRUb2tlblN0cmVhbSgpLnRvU3RyaW5nKAorICBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFRva2VuU3RhcnRJbmRleChyZXR2YWwuc3RhcnQpLAorICBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFRva2VuU3RvcEluZGV4KHJldHZhbC5zdGFydCkpCis8ZWxzZT4KK2lucHV0LnRvU3RyaW5nKHJldHZhbC5zdGFydCxpbnB1dC5MVCgtMSkpCis8ZW5kaWY+CislPgorcnVsZVByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLnN0IgorCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiZ2V0VGV4dCgpIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIl90eXBlIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRMaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAic3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiLTEiIC8vIHVuZGVmaW5lZCB0b2tlbiBpbmRleCBpbiBsZXhlcgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIl9jaGFubmVsIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihnZXRDaGFySW5kZXgoKS0xKSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gIkludGVnZXIudmFsdWVPZig8c2NvcGU+LmdldFRleHQoKSkiCisKKy8vIHNldHRpbmcgJHN0IGFuZCAkdHJlZSBpcyBhbGxvd2VkIGluIGxvY2FsIHJ1bGUuIGV2ZXJ5dGhpbmcgZWxzZQorLy8gaXMgZmxhZ2dlZCBhcyBlcnJvcgorcnVsZVNldFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cixleHByKSA6Oj0gInJldHZhbC50cmVlID08ZXhwcj47IgorcnVsZVNldFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwuc3QgPTxleHByPjsiCisKKy8qKiBIb3cgdG8gZXhlY3V0ZSBhbiBhY3Rpb24gKG9ubHkgd2hlbiBub3QgYmFja3RyYWNraW5nKSAqLworZXhlY0FjdGlvbihhY3Rpb24pIDo6PSA8JQorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgeworICA8YWN0aW9uPgorfQorPGVsc2U+Cis8YWN0aW9uPgorPGVuZGlmPgorJT4KKworLyoqIEhvdyB0byBhbHdheXMgZXhlY3V0ZSBhbiBhY3Rpb24gZXZlbiB3aGVuIGJhY2t0cmFja2luZyAqLworZXhlY0ZvcmNlZEFjdGlvbihhY3Rpb24pIDo6PSAiPGFjdGlvbj4iCisKKy8vIE0gSSBTIEMgKHByb3BlcnRpZXMsIGV0Yy4uLikKKworYml0c2V0KG5hbWUsIHdvcmRzNjQpIDo6PSA8PAorcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgPG5hbWU+ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezx3b3JkczY0OntpdCB8PGl0Pkx9O3NlcGFyYXRvcj0iLCI+fSk7PFxuPgorPj4KKworY29kZUZpbGVFeHRlbnNpb24oKSA6Oj0gIi5qYXZhIgorCit0cnVlX3ZhbHVlKCkgOjo9ICJ0cnVlIgorZmFsc2VfdmFsdWUoKSA6Oj0gImZhbHNlIgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhL1NULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9TVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5OGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YS9TVC5zdGcKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworLyoqIFRlbXBsYXRlIHN1Ymdyb3VwIHRvIGFkZCB0ZW1wbGF0ZSByZXdyaXRlIG91dHB1dAorICogIElmIGRlYnVnZ2luZywgdGhlbiB5b3UnbGwgYWxzbyBnZXQgU1REYmcuc3RnIGxvYWRlZC4KKyAqLworCitAb3V0cHV0RmlsZS5pbXBvcnRzKCkgOjo9IDw8Cis8QHN1cGVyLmltcG9ydHMoKT4KK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUuKjsKK2ltcG9ydCBvcmcuYW50bHIuc3RyaW5ndGVtcGxhdGUubGFuZ3VhZ2UuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKz4+CisKKy8qKiBBZGQgdGhpcyB0byBlYWNoIHJ1bGUncyByZXR1cm4gdmFsdWUgc3RydWN0ICovCitAcmV0dXJuU2NvcGUucnVsZVJldHVybk1lbWJlcnMoKSA6Oj0gPDwKK3B1YmxpYyBTdHJpbmdUZW1wbGF0ZSBzdDsKK3B1YmxpYyBPYmplY3QgZ2V0VGVtcGxhdGUoKSB7IHJldHVybiBzdDsgfQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHN0PT1udWxsP251bGw6c3QudG9TdHJpbmcoKTsgfQorPj4KKworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPEBzdXBlci5tZW1iZXJzKCk+Citwcm90ZWN0ZWQgU3RyaW5nVGVtcGxhdGVHcm91cCB0ZW1wbGF0ZUxpYiA9CisgIG5ldyBTdHJpbmdUZW1wbGF0ZUdyb3VwKCI8bmFtZT5UZW1wbGF0ZXMiLCBBbmdsZUJyYWNrZXRUZW1wbGF0ZUxleGVyLmNsYXNzKTsKKworcHVibGljIHZvaWQgc2V0VGVtcGxhdGVMaWIoU3RyaW5nVGVtcGxhdGVHcm91cCB0ZW1wbGF0ZUxpYikgeworICB0aGlzLnRlbXBsYXRlTGliID0gdGVtcGxhdGVMaWI7Cit9CitwdWJsaWMgU3RyaW5nVGVtcGxhdGVHcm91cCBnZXRUZW1wbGF0ZUxpYigpIHsKKyAgcmV0dXJuIHRlbXBsYXRlTGliOworfQorLyoqIGFsbG93cyBjb252ZW5pZW50IG11bHRpLXZhbHVlIGluaXRpYWxpemF0aW9uOgorICogICJuZXcgU1RBdHRyTWFwKCkucHV0KC4uLikucHV0KC4uLikiCisgKi8KK3B1YmxpYyBzdGF0aWMgY2xhc3MgU1RBdHRyTWFwIGV4dGVuZHMgSGFzaE1hcCB7CisgIHB1YmxpYyBTVEF0dHJNYXAgcHV0KFN0cmluZyBhdHRyTmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3VwZXIucHV0KGF0dHJOYW1lLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKyAgcHVibGljIFNUQXR0ck1hcCBwdXQoU3RyaW5nIGF0dHJOYW1lLCBpbnQgdmFsdWUpIHsKKyAgICBzdXBlci5wdXQoYXR0ck5hbWUsIG5ldyBJbnRlZ2VyKHZhbHVlKSk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KK30KKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PXRlbXBsYXRlICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSk+Cis8bGlzdExhYmVsKGxhYmVsLCB7PGxhYmVsPi5nZXRUZW1wbGF0ZSgpfSk+Cis+PgorCityZXdyaXRlVGVtcGxhdGUoYWx0cykgOjo9IDw8CisKKy8vIFRFTVBMQVRFIFJFV1JJVEUKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHsKKyAgPGFsdHM6cmV3cml0ZVRlbXBsYXRlQWx0KCk7IHNlcGFyYXRvcj0iZWxzZSAiPgorICA8aWYocmV3cml0ZU1vZGUpPjxyZXBsYWNlVGV4dEluTGluZSgpPjxlbmRpZj4KK30KKzxlbHNlPgorPGFsdHM6cmV3cml0ZVRlbXBsYXRlQWx0KCk7IHNlcGFyYXRvcj0iZWxzZSAiPgorPGlmKHJld3JpdGVNb2RlKT48cmVwbGFjZVRleHRJbkxpbmUoKT48ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCityZXBsYWNlVGV4dEluTGluZSgpIDo6PSA8PAorPGlmKFRSRUVfUEFSU0VSKT4KKygoVG9rZW5SZXdyaXRlU3RyZWFtKWlucHV0LmdldFRva2VuU3RyZWFtKCkpLnJlcGxhY2UoCisgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5zdGFydCksCisgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgocmV0dmFsLnN0YXJ0KSwKKyAgcmV0dmFsLnN0KTsKKzxlbHNlPgorKChUb2tlblJld3JpdGVTdHJlYW0paW5wdXQpLnJlcGxhY2UoCisgICgoVG9rZW4pcmV0dmFsLnN0YXJ0KS5nZXRUb2tlbkluZGV4KCksCisgIGlucHV0LkxUKC0xKS5nZXRUb2tlbkluZGV4KCksCisgIHJldHZhbC5zdCk7Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlVGVtcGxhdGVBbHQoYWx0KSA6Oj0gPDwKKy8vIDxhbHQuZGVzY3JpcHRpb24+Cis8aWYoYWx0LnByZWQpPgoraWYgKDxhbHQucHJlZD4pIHsKKyAgICByZXR2YWwuc3QgPSA8YWx0LmFsdD47Cit9PFxuPgorPGVsc2U+Cit7CisgICAgcmV0dmFsLnN0ID0gPGFsdC5hbHQ+OworfTxcbj4KKzxlbmRpZj4KKz4+CisKK3Jld3JpdGVFbXB0eVRlbXBsYXRlKGFsdHMpIDo6PSA8PAorbnVsbDsKKz4+CisKKy8qKiBJbnZva2UgYSB0ZW1wbGF0ZSB3aXRoIGEgc2V0IG9mIGF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHBhaXJzLgorICogIFNldCB0aGUgdmFsdWUgb2YgdGhlIHJ1bGUncyB0ZW1wbGF0ZSAqYWZ0ZXIqIGhhdmluZyBzZXQKKyAqICB0aGUgYXR0cmlidXRlcyBiZWNhdXNlIHRoZSBydWxlJ3MgdGVtcGxhdGUgbWlnaHQgYmUgdXNlZCBhcworICogIGFuIGF0dHJpYnV0ZSB0byBidWlsZCBhIGJpZ2dlciB0ZW1wbGF0ZTsgeW91IGdldCBhIHNlbGYtZW1iZWRkZWQKKyAqICB0ZW1wbGF0ZS4KKyAqLworcmV3cml0ZUV4dGVybmFsVGVtcGxhdGUobmFtZSxhcmdzKSA6Oj0gPCUKK3RlbXBsYXRlTGliLmdldEluc3RhbmNlT2YoIjxuYW1lPiI8aWYoYXJncyk+LAorICBuZXcgU1RBdHRyTWFwKCk8YXJnczp7YSB8IC5wdXQoIjxhLm5hbWU+IiwgPGEudmFsdWU+KX0+CisgIDxlbmRpZj4pCislPgorCisvKiogZXhwciBpcyBhIHN0cmluZyBleHByZXNzaW9uIHRoYXQgc2F5cyB3aGF0IHRlbXBsYXRlIHRvIGxvYWQgKi8KK3Jld3JpdGVJbmRpcmVjdFRlbXBsYXRlKGV4cHIsYXJncykgOjo9IDwlCit0ZW1wbGF0ZUxpYi5nZXRJbnN0YW5jZU9mKDxleHByPjxpZihhcmdzKT4sCisgIG5ldyBTVEF0dHJNYXAoKTxhcmdzOnthIHwgLnB1dCgiPGEubmFtZT4iLCA8YS52YWx1ZT4pfT4KKyAgPGVuZGlmPikKKyU+CisKKy8qKiBJbnZva2UgYW4gaW5saW5lIHRlbXBsYXRlIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMgKi8KK3Jld3JpdGVJbmxpbmVUZW1wbGF0ZShhcmdzLCB0ZW1wbGF0ZSkgOjo9IDwlCituZXcgU3RyaW5nVGVtcGxhdGUodGVtcGxhdGVMaWIsICI8dGVtcGxhdGU+IjxpZihhcmdzKT4sCisgIG5ldyBTVEF0dHJNYXAoKTxhcmdzOnthIHwgLnB1dCgiPGEubmFtZT4iLCA8YS52YWx1ZT4pfT4KKyAgPGVuZGlmPikKKyU+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxhY3Rpb24+Cis+PgorCisvKiogQW4gYWN0aW9uIGhhcyAlc3QuYXR0ck5hbWU9ZXhwcjsgb3IgJXtzdH0uYXR0ck5hbWU9ZXhwcjsgKi8KK2FjdGlvblNldEF0dHJpYnV0ZShzdCxhdHRyTmFtZSxleHByKSA6Oj0gPDwKKyg8c3Q+KS5zZXRBdHRyaWJ1dGUoIjxhdHRyTmFtZT4iLDxleHByPik7Cis+PgorCisvKiogVHJhbnNsYXRlICV7c3RyaW5nRXhwcn0gKi8KK2FjdGlvblN0cmluZ0NvbnN0cnVjdG9yKHN0cmluZ0V4cHIpIDo6PSA8PAorbmV3IFN0cmluZ1RlbXBsYXRlKHRlbXBsYXRlTGliLDxzdHJpbmdFeHByPikKKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvQVNULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YVNjcmlwdC9BU1Quc3RnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3ODAzODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvQVNULnN0ZwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCitncm91cCBBU1Q7CisKK0BvdXRwdXRGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPgorPj4KKworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPEBzdXBlci5tZW1iZXJzKCk+Cis8cGFyc2VyTWVtYmVycygpPgorPj4KKworLyoqIEFkZCBhbiBhZGFwdG9yIHByb3BlcnR5IHRoYXQga25vd3MgaG93IHRvIGJ1aWxkIHRyZWVzICovCitwYXJzZXJNZW1iZXJzKCkgOjo9IDw8Cis8IXByb3RlY3RlZCBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7PFxuPiE+CitzZXRUcmVlQWRhcHRvcjogZnVuY3Rpb24oYWRhcHRvcikgeworICAgIHRoaXMuYWRhcHRvciA9IGFkYXB0b3I7CisgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPi5zZXRUcmVlQWRhcHRvcih0aGlzLmFkYXB0b3IpO30+Cit9LAorZ2V0VHJlZUFkYXB0b3I6IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmFkYXB0b3I7Cit9LAorPj4KKworQHJldHVyblNjb3BlLnJ1bGVSZXR1cm5NZW1iZXJzKCkgOjo9IDw8CitnZXRUcmVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMudHJlZTsgfQorPj4KKworLyoqIEFkZCBhIHZhcmlhYmxlIHRvIHRyYWNrIHJ1bGUncyByZXR1cm4gQVNUICovCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZURlY2xhcmF0aW9ucygpPgordmFyIHJvb3RfMCA9IG51bGw7PFxuPgorPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPHN1cGVyLnJ1bGVMYWJlbERlZnMoKT4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxhYmVsczp7dmFyIDxpdC5sYWJlbC50ZXh0Pl90cmVlPW51bGw7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzOnt2YXIgPGl0LmxhYmVsLnRleHQ+X3RyZWU9bnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e3ZhciBzdHJlYW1fPGl0Pj1uZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVRva2VuU3RyZWFtKHRoaXMuYWRhcHRvciwidG9rZW4gPGl0PiIpO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLmFsbFJ1bGVSZWZzSW5BbHRzV2l0aFJld3JpdGVzCisgICAgOnt2YXIgc3RyZWFtXzxpdD49bmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKHRoaXMuYWRhcHRvciwicnVsZSA8aXQ+Iik7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCisvKiogV2hlbiBkb2luZyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24sIHdlIG11c3QgZGVmaW5lIHNvbWUgdmFyaWFibGVzOworICogIFRoZXNlIHNob3VsZCBiZSB0dXJuZWQgb2ZmIGlmIGRvaW5nIHJld3JpdGVzLiAgVGhpcyBtdXN0IGJlIGEgIm1vZGUiCisgKiAgYXMgYSBydWxlIGNvdWxkIGhhdmUgYm90aCByZXdyaXRlIGFuZCBBU1Qgd2l0aGluIHRoZSBzYW1lIGFsdGVybmF0aXZlCisgKiAgYmxvY2suCisgKi8KK0BhbHQuZGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYoYXV0b0FTVCk+Cis8aWYob3V0ZXJBbHQpPgorPGlmKCFyZXdyaXRlTW9kZSk+Cityb290XzAgPSB0aGlzLmFkYXB0b3IubmlsKCk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLy8gVCByIGEgYyBrIGkgbiBnICBSIHUgbCBlICBFIGwgZSBtIGUgbiB0IHMKKworLyoqIElEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlICovCit0b2tlblJlZlRyYWNrKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPiA8ISBUcmFjayBpbXBsaWVzIG5vIGF1dG8gQVNUIGNvbnN0cnVjdGlvbiE+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnN0cmVhbV88dG9rZW4+LmFkZCg8bGFiZWw+KTs8XG4+Cis+PgorCisvKiogaWRzKz1JRCBhbmQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZTsgYWRkcyB0byBpZHMgKmFuZCoKKyAqICB0byB0aGUgdHJhY2tpbmcgbGlzdCBzdHJlYW1fSUQgZm9yIHVzZSBpbiB0aGUgcmV3cml0ZS4KKyAqLwordG9rZW5SZWZUcmFja0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgdHJhY2sgZm9yIHJld3JpdGUgKi8KK3Rva2VuUmVmUnVsZVJvb3RUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+c3RyZWFtXzx0b2tlbj4uYWRkKDxsYWJlbD4pOzxcbj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKK3dpbGRjYXJkVHJhY2sobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+c3RyZWFtXzxydWxlLm5hbWU+LmFkZCg8bGFiZWw+LmdldFRyZWUoKSk7Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi5nZXRUcmVlKCkiLC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2socnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnN0cmVhbV88cnVsZT4uYWRkKDxsYWJlbD4uZ2V0VHJlZSgpKTsKKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIuZ2V0VHJlZSgpIiwuLi4pPgorPj4KKworLy8gUiBlIHcgciBpIHQgZQorCityZXdyaXRlQ29kZSgKKwlhbHRzLCBkZXNjcmlwdGlvbiwKKwlyZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBBTEwgcmVmZXJlbmNlZCBlbGVtZW50cyB0byByaWdodCBvZiAtPgorCXJlZmVyZW5jZWRUb2tlbkxhYmVscywKKwlyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzLAorCXJlZmVyZW5jZWRSdWxlTGFiZWxzLAorCXJlZmVyZW5jZWRSdWxlTGlzdExhYmVscywKKyAgICByZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMsCisgICAgcmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVscywKKwlyZXdyaXRlQmxvY2tMZXZlbCwgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PQorPDwKKworLy8gQVNUIFJFV1JJVEUKKy8vIGVsZW1lbnRzOiA8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDsgc2VwYXJhdG9yPSIsICI+CisvLyB0b2tlbiBsYWJlbHM6IDxyZWZlcmVuY2VkVG9rZW5MYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorLy8gcnVsZSBsYWJlbHM6IDxyZWZlcmVuY2VkUnVsZUxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyB0b2tlbiBsaXN0IGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorLy8gcnVsZSBsaXN0IGxhYmVsczogPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PFxuPgorPGVuZGlmPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gcm9vdF8wOworPHJld3JpdGVDb2RlTGFiZWxzKCk+Cityb290XzAgPSB0aGlzLmFkYXB0b3IubmlsKCk7Cis8YWx0czpyZXdyaXRlQWx0KCk7IHNlcGFyYXRvcj0iZWxzZSAiPgorPCEgaWYgdHJlZSBwYXJzZXIgYW5kIHJld3JpdGU9dHJ1ZSAhPgorPGlmKFRSRUVfUEFSU0VSKT4KKzxpZihyZXdyaXRlTW9kZSk+Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSB0aGlzLmFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7Cit0aGlzLmlucHV0LnJlcGxhY2VDaGlsZHJlbih0aGlzLmFkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC5zdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGFwdG9yLmdldENoaWxkSW5kZXgocmV0dmFsLnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0b3IuZ2V0Q2hpbGRJbmRleChfbGFzdCksCisgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLnRyZWUpOworPGVuZGlmPgorPGVuZGlmPgorPCEgaWYgcGFyc2VyIG9yIHRyZWUtcGFyc2VyICYmIHJld3JpdGUhPXRydWUsIHdlIG5lZWQgdG8gc2V0IHJlc3VsdCAhPgorPGlmKCFUUkVFX1BBUlNFUik+Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzA7Cis8ZWxzZT4KKzxpZighcmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gcm9vdF8wOworPGVuZGlmPgorPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+Cit9Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlQ29kZUxhYmVscygpIDo6PSA8PAorPHJlZmVyZW5jZWRUb2tlbkxhYmVscworICAgIDp7dmFyIHN0cmVhbV88aXQ+PW5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW0odGhpcy5hZGFwdG9yLCJ0b2tlbiA8aXQ+Iiw8aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVscworICAgIDp7dmFyIHN0cmVhbV88aXQ+PW5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW0odGhpcy5hZGFwdG9yLCJ0b2tlbiA8aXQ+IiwgbGlzdF88aXQ+KTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzCisgICAgOnt2YXIgc3RyZWFtXzxpdD49bmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKHRoaXMuYWRhcHRvciwid2lsZGNhcmQgPGl0PiIsPGl0Pik7fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHMKKyAgICA6e3ZhciBzdHJlYW1fPGl0Pj1uZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0odGhpcy5hZGFwdG9yLCJ3aWxkY2FyZCA8aXQ+IixsaXN0XzxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxhYmVscworICAgIDp7dmFyIHN0cmVhbV88aXQ+PW5ldyBvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSh0aGlzLmFkYXB0b3IsInRva2VuIDxpdD4iLDxpdD4hPW51bGw/PGl0Pi50cmVlOm51bGwpO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMKKyAgICA6e3ZhciBzdHJlYW1fPGl0Pj1uZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0odGhpcy5hZGFwdG9yLCJ0b2tlbiA8aXQ+IixsaXN0XzxpdD4pO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKz4+CisKKy8qKiBHZW5lcmF0ZSBjb2RlIGZvciBhbiBvcHRpb25hbCByZXdyaXRlIGJsb2NrOyBub3RlIGl0IHVzZXMgdGhlIGRlZXAgcmVmJ2QgZWxlbWVudAorICAqICBsaXN0IHJhdGhlciBzaGFsbG93IGxpa2Ugb3RoZXIgYmxvY2tzLgorICAqLworcmV3cml0ZU9wdGlvbmFsQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitpZiAoIDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+Lmhhc05leHQoKX07IHNlcGFyYXRvcj0ifHwiPiApIHsKKyAgICA8YWx0PgorfQorPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgc3RyZWFtXzxlbD4ucmVzZXQoKTs8XG4+fT4KKz4+CisKK3Jld3JpdGVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit3aGlsZSAoIDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dCgpfTsgc2VwYXJhdG9yPSJ8fCI+ICkgeworICAgIDxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LnJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAoraWYgKCAhKDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dCgpfTsgc2VwYXJhdG9yPSJ8fCI+KSApIHsKKyAgICB0aHJvdyBuZXcgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5SZXdyaXRlRWFybHlFeGl0RXhjZXB0aW9uKCk7Cit9Cit3aGlsZSAoIDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dCgpfTsgc2VwYXJhdG9yPSJ8fCI+ICkgeworICAgIDxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LnJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQWx0KGEpIDo6PSA8PAorLy8gPGEuZGVzY3JpcHRpb24+Cis8aWYoYS5wcmVkKT4KK2lmICg8YS5wcmVkPikgeworICAgIDxhLmFsdD4KK308XG4+Cis8ZWxzZT4KK3sKKyAgICA8YS5hbHQ+Cit9PFxuPgorPGVuZGlmPgorPj4KKworLyoqIEZvciBlbXB0eSByZXdyaXRlczogInIgOiAuLi4gLT4gOyIgKi8KK3Jld3JpdGVFbXB0eUFsdCgpIDo6PSAicm9vdF8wID0gbnVsbDsiCisKK3Jld3JpdGVUcmVlKHJvb3QsY2hpbGRyZW4sZGVzY3JpcHRpb24sZW5jbG9zaW5nVHJlZUxldmVsLHRyZWVMZXZlbCkgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKK3ZhciByb290Xzx0cmVlTGV2ZWw+ID0gdGhpcy5hZGFwdG9yLm5pbCgpOworPHJvb3Q6cmV3cml0ZUVsZW1lbnQoKT4KKzxjaGlsZHJlbjpyZXdyaXRlRWxlbWVudCgpPgordGhpcy5hZGFwdG9yLmFkZENoaWxkKHJvb3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4sIHJvb3RfPHRyZWVMZXZlbD4pOworfTxcbj4KKz4+CisKK3Jld3JpdGVFbGVtZW50TGlzdChlbGVtZW50cykgOjo9ICI8ZWxlbWVudHM6cmV3cml0ZUVsZW1lbnQoKT4iCisKK3Jld3JpdGVFbGVtZW50KGUpIDo6PSA8PAorPEBwcmVnZW4oKT4KKzxlLmVsPgorPj4KKworLyoqIEdlbiBJRCBvciBJRFthcmdzXSAqLworcmV3cml0ZVRva2VuUmVmKHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cit0aGlzLmFkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4pOzxcbj4KKz4+CisKKy8qKiBHZW4gJGxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBsYWJlbD1JRCAqLworcmV3cml0ZVRva2VuTGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpKTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpKTs8XG4+Cis+PgorCisvKiogR2VuIF4oJGxhYmVsIC4uLikgKi8KK3Jld3JpdGVUb2tlbkxhYmVsUmVmUm9vdChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IHRoaXMuYWRhcHRvci5iZWNvbWVSb290KHN0cmVhbV88bGFiZWw+Lm5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSB3aGVyZSBsYWJlbCs9Li4uICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworLyoqIEdlbiBeKElEIC4uLikgb3IgXihJRFthcmdzXSAuLi4pICovCityZXdyaXRlVG9rZW5SZWZSb290KHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3QoPGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4sIHJvb3RfPHRyZWVMZXZlbD4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZihhcmdzLHRva2VuLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAordGhpcy5hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4pOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSB0aGlzLmFkYXB0b3IuYmVjb21lUm9vdCg8Y3JlYXRlSW1hZ2luYXJ5Tm9kZSh0b2tlblR5cGU9dG9rZW4sIC4uLik+LCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCisvKiogcGxhaW4gLT4ge2Zvb30gYWN0aW9uICovCityZXdyaXRlQWN0aW9uKGFjdGlvbikgOjo9IDw8Cityb290XzAgPSA8YWN0aW9uPjs8XG4+Cis+PgorCisvKiogV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhpcyBydWxlJ3Mgcm9vdCB0cmVlPyAgVGhpcworICogIGxldCdzIHVzIHJlZmVyIHRvICRydWxlIHRvIG1lYW4gcHJldmlvdXMgdmFsdWUuICBJIGFtIHJldXNpbmcgdGhlCisgKiAgdmFyaWFibGUgJ3RyZWUnIHNpdHRpbmcgaW4gcmV0dmFsIHN0cnVjdCB0byBob2xkIHRoZSB2YWx1ZSBvZiByb290XzAgcmlnaHQKKyAqICBiZWZvcmUgSSBzZXQgaXQgZHVyaW5nIHJld3JpdGVzLiAgVGhlIGFzc2lnbiB3aWxsIGJlIHRvIHJldHZhbC50cmVlLgorICovCitwcmV2UnVsZVJvb3RSZWYoKSA6Oj0gInJldHZhbCIKKworcmV3cml0ZVJ1bGVSZWYocnVsZSkgOjo9IDw8Cit0aGlzLmFkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxydWxlPi5uZXh0VHJlZSgpKTs8XG4+Cis+PgorCityZXdyaXRlUnVsZVJlZlJvb3QocnVsZSkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxydWxlPi5uZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTs8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvbihhY3Rpb24pIDo6PSA8PAordGhpcy5hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxhY3Rpb24+KTs8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvblJvb3QoYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSB0aGlzLmFkYXB0b3IuYmVjb21lUm9vdCg8YWN0aW9uPiwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZihsYWJlbCkgOjo9IDw8Cit0aGlzLmFkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dFRyZWUoKSk7PFxuPgorPj4KKworLyoqIEdlbiAkcnVsZUxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0VHJlZSgpKTs8XG4+Cis+PgorCisvKiogR2VuIF4oJHJ1bGVMYWJlbCAuLi4pIHdoZXJlIHJ1bGVMYWJlbD1ydWxlICovCityZXdyaXRlUnVsZUxhYmVsUmVmUm9vdChsYWJlbCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWwrPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmUm9vdChsYWJlbCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPik7PFxuPgorPj4KKworcmV3cml0ZVdpbGRjYXJkTGFiZWxSZWYobGFiZWwpIDo6PSA8PAordGhpcy5hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHRUcmVlKCkpOzxcbj4KKz4+CisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsLCBhcmdzKSAhPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgordGhpcy5hZGFwdG9yLmNyZWF0ZSg8dG9rZW5UeXBlPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxpZighYXJncyk+Ijx0b2tlblR5cGU+IjxlbmRpZj4pCis8ZW5kaWY+Cis+PgorCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+CituZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPihzdHJlYW1fPHRva2VuPi5uZXh0VG9rZW4oKTxpZihhcmdzKT4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj48ZW5kaWY+KQorPGVsc2U+Cis8aWYoYXJncyk+IDwhIG11c3QgY3JlYXRlIG5ldyBub2RlIGZyb20gb2xkICE+Cit0aGlzLmFkYXB0b3IuY3JlYXRlKDx0b2tlbj4sIDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lm5leHROb2RlKCkKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvQVNUUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YVNjcmlwdC9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0M2Q3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvQVNUUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDE2MSBAQAorLyoqIFRlbXBsYXRlcyBmb3IgYnVpbGRpbmcgQVNUcyBkdXJpbmcgbm9ybWFsIHBhcnNpbmcuCisgKgorICogIERlYWwgd2l0aCBtYW55IGNvbWJpbmF0aW9ucy4gIERpbWVuc2lvbnMgYXJlOgorICogIEF1dG8gYnVpbGQgb3IgcmV3cml0ZQorICogICAgbm8gbGFiZWwsIGxhYmVsLCBsaXN0IGxhYmVsICAobGFiZWwvbm8tbGFiZWwgaGFuZGxlZCB0b2dldGhlcikKKyAqICAgIGNoaWxkLCByb290CisgKiAgICB0b2tlbiwgc2V0LCBydWxlLCB3aWxkY2FyZAorICoKKyAqICBUaGUgc2l0dWF0aW9uIGlzIG5vdCB0b28gYmFkIGFzIHJld3JpdGUgKC0+KSB1c2FnZSBtYWtlcyBeIGFuZCAhCisgKiAgaW52YWxpZC4gVGhlcmUgaXMgbm8gaHVnZSBleHBsb3Npb24gb2YgY29tYmluYXRpb25zLgorICovCitncm91cCBBU1RQYXJzZXI7CisKK0BydWxlLnNldEVycm9yUmV0dXJuVmFsdWUoKSA6Oj0gPDwKK3JldHZhbC50cmVlID0gdGhpcy5hZGFwdG9yLmVycm9yTm9kZSh0aGlzLmlucHV0LCByZXR2YWwuc3RhcnQsIHRoaXMuaW5wdXQuTFQoLTEpLCByZSk7Cis+PgorCisvLyBUT0tFTiBBU1QgU1RVRkYKKworLyoqIElEIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPjsKK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290XzAsIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworLyoqIElEISBhbmQgb3V0cHV0PUFTVCAoc2FtZSBhcyBwbGFpbiB0b2tlblJlZikgKi8KK3Rva2VuUmVmQmFuZyh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSAiPHN1cGVyLnRva2VuUmVmKC4uLik+IgorCisvKiogSUReIGFuZCBvdXRwdXQ9QVNUICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxsYWJlbD5fdHJlZSA9IDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+Oworcm9vdF8wID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290XzApOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBpZHMrPUlEISBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWZCYW5nQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIHdoZW4gb3V0cHV0PUFTVCBidXQgbm90IHJld3JpdGUgYWx0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggbGFiZWwrPVRPS0VOXiB3aGVuIG91dHB1dD1BU1QgYnV0IG5vdCByZXdyaXRlIGFsdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8vIFNFVCBBU1QKKworLy8gdGhlIG1hdGNoIHNldCBzdHVmZiBpcyBpbnRlcmVzdGluZyBpbiB0aGF0IGl0IHVzZXMgYW4gYXJndW1lbnQgbGlzdAorLy8gdG8gcGFzcyBjb2RlIHRvIHRoZSBkZWZhdWx0IG1hdGNoU2V0OyBhbm90aGVyIHBvc3NpYmxlIHdheSB0byBhbHRlcgorLy8gaW5oZXJpdGVkIGNvZGUuICBJIGRvbid0IHVzZSB0aGUgcmVnaW9uIHN0dWZmIGJlY2F1c2UgSSBuZWVkIHRvIHBhc3MKKy8vIGRpZmZlcmVudCBjaHVua3MgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4gIEkgZG9uJ3QgbGlrZSBtYWtpbmcKKy8vIHRoZSB0ZW1wbGF0ZSBuYW1lIGhhdmUgdGhlIG9wZXJhdG9yIGFzIHRoZSBudW1iZXIgb2YgdGVtcGxhdGVzIGdldHMKKy8vIGxhcmdlIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGZsZXhpYmxlLS10aGlzIGlzIGFzIG9wcG9zZWQgdG8gaGF2aW5nCisvLyB0aGUgY29kZSBnZW5lcmF0b3IgY2FsbCBtYXRjaFNldCB0aGVuIGFkZCByb290IGNvZGUgb3IgcnVsZXJvb3QgY29kZQorLy8gcGx1cyBsaXN0IGxhYmVsIHBsdXMgLi4uICBUaGUgY29tYmluYXRpb25zIG1pZ2h0IHJlcXVpcmUgY29tcGxpY2F0ZWQKKy8vIHJhdGhlciB0aGFuIGp1c3QgYWRkZWQgb24gY29kZS4gIEludmVzdGlnYXRlIHRoYXQgcmVmYWN0b3Jpbmcgd2hlbgorLy8gSSBoYXZlIG1vcmUgdGltZS4KKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPHN1cGVyLm1hdGNoU2V0KC4uLiwgcG9zdG1hdGNoQ29kZT17PGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj50aGlzLmFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPik7fSk+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSAiPHN1cGVyLm1hdGNoU2V0KC4uLik+IgorCisvLyBub3RlIHRoZXJlIGlzIG5vIG1hdGNoU2V0VHJhY2sgYmVjYXVzZSAtPiByZXdyaXRlcyBmb3JjZSBzZXRzIHRvIGJlCisvLyBwbGFpbiBvbGQgYmxvY2tzIG9mIGFsdHM6IChBfEJ8Li4ufEMpCisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+PWlucHV0LkxUKDEpOzxcbj4KKzxlbmRpZj4KKzxzdXBlci5tYXRjaFNldCguLi4sIHBvc3RtYXRjaENvZGU9ezxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+cm9vdF8wID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3QoPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4sIHJvb3RfMCk7fSk+Cis+PgorCisvLyBSVUxFIFJFRiBBU1QKKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+dGhpcy5hZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPi5nZXRUcmVlKCkpOworPj4KKworLyoqIHJ1bGUhIGlzIHNhbWUgYXMgbm9ybWFsIHJ1bGUgcmVmICovCitydWxlUmVmQmFuZyhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gIjxzdXBlci5ydWxlUmVmKC4uLik+IgorCisvKiogcnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPnJvb3RfMCA9IHRoaXMuYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD4uZ2V0VHJlZSgpLCByb290XzApOworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLmdldFRyZWUoKSIsLi4uKT4KKz4+CisKKy8qKiB4Kz1ydWxlISB3aGVuIG91dHB1dD1BU1QgaXMgYSBydWxlIHJlZiB3aXRoIGxpc3QgYWRkaXRpb24gKi8KK3J1bGVSZWZCYW5nQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZCYW5nKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi5nZXRUcmVlKCkiLC4uLik+Cis+PgorCisvKiogeCs9cnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCsiLmdldFRyZWUoKSIsLi4uKT4KKz4+CisKKy8vIFdJTERDQVJEIEFTVAorCit3aWxkY2FyZChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxsYWJlbD5fdHJlZSA9IHRoaXMuYWRhcHRvci5jcmVhdGUoPGxhYmVsPik7Cit0aGlzLmFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKK3dpbGRjYXJkQmFuZyhsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSAiPHN1cGVyLndpbGRjYXJkKC4uLik+IgorCit3aWxkY2FyZFJ1bGVSb290KGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8c3VwZXIud2lsZGNhcmQoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gdGhpcy5hZGFwdG9yLmNyZWF0ZSg8bGFiZWw+KTsKK3Jvb3RfMCA9IHRoaXMuYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF8wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCitjcmVhdGVOb2RlRnJvbVRva2VuKGxhYmVsLHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPikgPCEgbmV3IE1ldGhvZE5vZGUoSURMYWJlbCkgIT4KKzxlbHNlPgordGhpcy5hZGFwdG9yLmNyZWF0ZSg8bGFiZWw+KQorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8XG4+PGVuZGlmPgorcmV0dmFsLnRyZWUgPSB0aGlzLmFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7Cit0aGlzLmFkYXB0b3Iuc2V0VG9rZW5Cb3VuZGFyaWVzKHJldHZhbC50cmVlLCByZXR2YWwuc3RhcnQsIHJldHZhbC5zdG9wKTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhU2NyaXB0L0FTVFRyZWVQYXJzZXIuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9KYXZhU2NyaXB0L0FTVFRyZWVQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmMTVkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvQVNUVHJlZVBhcnNlci5zdGcKQEAgLTAsMCArMSwyNTMgQEAKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIHRyZWUgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIEVhY2ggY29tYmluYXRpb24gaGFzIGl0cyBvd24gdGVtcGxhdGUgZXhjZXB0IHRoYXQgbGFiZWwvbm8gbGFiZWwKKyAqICBpcyBjb21iaW5lZCBpbnRvIHRva2VuUmVmLCBydWxlUmVmLCAuLi4KKyAqLworZ3JvdXAgQVNUVHJlZVBhcnNlcjsKKworLyoqIEFkZCBhIHZhcmlhYmxlIHRvIHRyYWNrIGxhc3QgZWxlbWVudCBtYXRjaGVkICovCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZURlY2xhcmF0aW9ucygpPgordmFyIF9maXJzdF8wID0gbnVsbDsKK3ZhciBfbGFzdCA9IG51bGw7PFxuPgorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUgcnVsZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZihyZXdyaXRlTW9kZSk+CityZXR2YWwudHJlZSA9IF9maXJzdF8wOworaWYgKCB0aGlzLmFkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC50cmVlKSAmJiB0aGlzLmFkYXB0b3IuaXNOaWwoIHRoaXMuYWRhcHRvci5nZXRQYXJlbnQocmV0dmFsLnRyZWUpICkgKQorICAgIHJldHZhbC50cmVlID0gdGhpcy5hZGFwdG9yLmdldFBhcmVudChyZXR2YWwudHJlZSk7Cis8ZW5kaWY+Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXI7IG92ZXJyaWRlIGhlcmUgdG8KKyAqICBhZGQgdHJlZSBjb25zdHJ1Y3Rpb24gYWN0aW9ucy4KKyAqLwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsCisgICAgIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKK19sYXN0ID0gdGhpcy5pbnB1dC5MVCgxKTsKK3sKK3ZhciBfc2F2ZV9sYXN0Xzx0cmVlTGV2ZWw+ID0gX2xhc3Q7Cit2YXIgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gbnVsbDsKKzxpZighcmV3cml0ZU1vZGUpPgordmFyIHJvb3RfPHRyZWVMZXZlbD4gPSB0aGlzLmFkYXB0b3IubmlsKCk7Cis8ZW5kaWY+Cis8cm9vdDplbGVtZW50KCk+Cis8aWYocmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApPGVuZGlmPgorPGlmKHJvb3QuZWwucnVsZSk+CitpZiAoICFfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD4udHJlZTsKKzxlbHNlPgoraWYgKCAhX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ICkgX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+ID0gPHJvb3QuZWwubGFiZWw+OworPGVuZGlmPgorPGVuZGlmPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmICggdGhpcy5pbnB1dC5MQSgxKT09b3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRE9XTiApIHsKKyAgICB0aGlzLm1hdGNoKHRoaXMuaW5wdXQsIG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRPV04sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgdGhpcy5tYXRjaCh0aGlzLmlucHV0LCBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5VUCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cit9Cis8ZWxzZT4KK3RoaXMubWF0Y2godGhpcy5pbnB1dCwgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRE9XTiwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8Y2hpbGRyZW46ZWxlbWVudCgpPgordGhpcy5tYXRjaCh0aGlzLmlucHV0LCBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5VUCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTsKKzxlbmRpZj4KK19sYXN0ID0gX3NhdmVfbGFzdF88dHJlZUxldmVsPjsKK308XG4+Cis+PgorCisvLyBUT0tFTiBBU1QgU1RVRkYKKworLyoqIElEISBhbmQgb3V0cHV0PUFTVCAoc2FtZSBhcyBwbGFpbiB0b2tlblJlZikgJ2NlcHQgYWRkCisgKiAgc2V0dGluZyBvZiBfbGFzdAorICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK19sYXN0ID0gdGhpcy5pbnB1dC5MVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPj4KKworLyoqIElEIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gdGhpcy5pbnB1dC5MVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gdGhpcy5hZGFwdG9yLmR1cE5vZGUoPGxhYmVsPik7Cis8ZW5kaWY+PFxuPgordGhpcy5hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApPGVuZGlmPgoraWYgKCAhX2ZpcnN0Xzx0cmVlTGV2ZWw+ICkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPjsKKzxlbmRpZj4KKz4+CisKKy8qKiBsYWJlbCs9VE9LRU4gYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9IHRoaXMuaW5wdXQuTFQoMSk7Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IHRoaXMuYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pOworPGVuZGlmPjxcbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSB0aGlzLmFkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfPHRyZWVMZXZlbD4pOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLy8gU0VUIEFTVAorCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8CitfbGFzdCA9IHRoaXMuaW5wdXQuTFQoMSk7Cis8c3VwZXIubWF0Y2hTZXQoLi4uLCBwb3N0bWF0Y2hDb2RlPXsKKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IHRoaXMuYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pOworPGVuZGlmPjxcbj4KK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KK30KKyk+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPG5vUmV3cml0ZSgpPiA8ISBzZXQgcmV0dXJuIHRyZWUgIT4KKz4+CisKK21hdGNoU2V0QmFuZyhzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gdGhpcy5pbnB1dC5MVCgxKTsKKzxzdXBlci5tYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRSdWxlUm9vdChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgsZGVidWcpIDo6PSA8PAorPHN1cGVyLm1hdGNoU2V0KC4uLiwgcG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IG5ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSB0aGlzLmFkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KTsKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gdGhpcy5hZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cit9CispPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSB0aGlzLmlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK3RoaXMuYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+LmdldFRyZWUoKSk7Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+CitpZiAoICFfZmlyc3RfPHRyZWVMZXZlbD4gKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+LnRyZWU7Cis8ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi5nZXRUcmVlKCkiLC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gdGhpcy5pbnB1dC5MVCgxKTsKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+cm9vdF88dHJlZUxldmVsPiA9IHRoaXMuYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD4uZ2V0VHJlZSgpLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxlbmRpZj4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsKyIuZ2V0VHJlZSgpIiwuLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSB0aGlzLmlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZUcmFjayguLi4pPgorPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSB0aGlzLmlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSB0aGlzLmlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWZSb290VHJhY2soLi4uKT4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gdGhpcy5pbnB1dC5MVCgxKTsKKzxzdXBlci5ydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworLyoqIFN0cmVhbXMgZm9yIHRva2VuIHJlZnMgYXJlIHRyZWUgbm9kZXMgbm93OyBvdmVycmlkZSB0bworICogIGNoYW5nZSBuZXh0VG9rZW4gdG8gbmV4dE5vZGUuCisgKi8KK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLHNjb3BlKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+CituZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPihzdHJlYW1fPHRva2VuPi5uZXh0Tm9kZSgpKQorPGVsc2U+CitzdHJlYW1fPHRva2VuPi5uZXh0Tm9kZSgpCis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PFxuPjxlbmRpZj4KK3JldHZhbC50cmVlID0gdGhpcy5hZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvSmF2YVNjcmlwdC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0phdmFTY3JpcHQvSmF2YVNjcmlwdC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBhZGFiNAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvSmF2YVNjcmlwdC9KYXZhU2NyaXB0LnN0ZwpAQCAtMCwwICsxLDEzMzMgQEAKK2dyb3VwIEphdmFTY3JpcHQ7CisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzIGZvciBydWxlcworICogIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAqLworb3V0cHV0RmlsZShMRVhFUixQQVJTRVIsVFJFRV9QQVJTRVIsIGFjdGlvblNjb3BlLCBhY3Rpb25zLAorICAgICAgICAgICBkb2NDb21tZW50LCByZWNvZ25pemVyLAorICAgICAgICAgICBuYW1lLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLAorICAgICAgIGJpdHNldHMsIGJ1aWxkVGVtcGxhdGUsIGJ1aWxkQVNULCByZXdyaXRlTW9kZSwgcHJvZmlsZSwKKyAgICAgICBiYWNrdHJhY2tpbmcsIHN5bnByZWRzLCBtZW1vaXplLCBudW1SdWxlcywKKyAgICAgICBmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsIHRyYWNlLAorICAgICAgIHNjb3Blcywgc3VwZXJDbGFzcywgbGl0ZXJhbHMpIDo6PQorPDwKKy8vICRBTlRMUiA8QU5UTFJWZXJzaW9uPiA8ZmlsZU5hbWU+IDxnZW5lcmF0ZWRUaW1lc3RhbXA+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKworPEBpbXBvcnRzPgorPGlmKFRSRUVfUEFSU0VSKT4KKzxlbmRpZj4KKzxAZW5kPgorCis8ZG9jQ29tbWVudD4KKzxyZWNvZ25pemVyPgorPj4KKworbGV4ZXIoZ3JhbW1hciwgbmFtZSwgdG9rZW5zLCBzY29wZXMsIHJ1bGVzLCBudW1SdWxlcywgbGFiZWxUeXBlPSJUb2tlbiIsCisgICAgICBmaWx0ZXJNb2RlLCBzdXBlckNsYXNzPSJvcmcuYW50bHIucnVudGltZS5MZXhlciIpIDo6PSA8PAordmFyIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiA9IGZ1bmN0aW9uKGlucHV0LCBzdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59PikgeworLy8gYWx0ZXJuYXRlIGNvbnN0cnVjdG9yIEB0b2RvCisvLyBwdWJsaWMgPGdyYW1tYXIucmVjb2duaXplck5hbWU+KENoYXJTdHJlYW0gaW5wdXQ8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KQorLy8gcHVibGljIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KSB7CisgICAgaWYgKCFzdGF0ZSkgeworICAgICAgICBzdGF0ZSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKKyAgICB9CisKKyAgICAoZnVuY3Rpb24oKXsKKyAgICAgICAgPGFjdGlvbnMubGV4ZXIubWVtYmVycz4KKyAgICB9KS5jYWxsKHRoaXMpOworCisgICAgPGN5Y2xpY0RGQXM6e2RmYSB8IHRoaXMuZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBuZXcgPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+KHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgaW5wdXQsIHN0YXRlKTsKKyAgICA8aWYobWVtb2l6ZSk+CisgICAgPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgICAgdGhpcy5zdGF0ZS5ydWxlTWVtbyA9IHt9OworICAgIDxlbmRpZj4KKyAgICA8ZW5kaWY+CisKKyAgICA8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisgICAgICAge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBzdGF0ZTx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfCwgPHA6ZGVsZWdhdGVOYW1lKCk+fT4sIHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3x0aGlzLmdQYXJlbnQgPSB0aGlzLjxnOmRlbGVnYXRlTmFtZSgpPjt9PgorCisgICAgPGFjdGlvbnMubGV4ZXIuaW5pdD4KK307CisKK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3QoPGdyYW1tYXIucmVjb2duaXplck5hbWU+LCB7CisgICAgPHRva2Vuczp7PGl0Lm5hbWU+OiA8aXQudHlwZT59OyBzZXBhcmF0b3I9IixcbiI+Cit9KTsKKworKGZ1bmN0aW9uKCl7Cit2YXIgSElEREVOID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uSElEREVOX0NIQU5ORUwsCisgICAgRU9GID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uRU9GOworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgPEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD4sIHsKKyAgICA8dG9rZW5zOns8aXQubmFtZT4gOiA8aXQudHlwZT4sfTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPHNjb3Blczp7PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorICAgIGdldEdyYW1tYXJGaWxlTmFtZTogZnVuY3Rpb24oKSB7IHJldHVybiAiPGZpbGVOYW1lPiI7IH0KK30pOworb3JnLmFudGxyLmxhbmcuYXVnbWVudE9iamVjdCg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4ucHJvdG90eXBlLCB7Cis8aWYoZmlsdGVyTW9kZSk+CisgICAgPGZpbHRlcmluZ05leHRUb2tlbigpPgorPGVuZGlmPgorICAgIDxydWxlczsgc2VwYXJhdG9yPSIsXG5cbiI+CisKKyAgICA8c3lucHJlZHM6e3AgfCA8bGV4ZXJTeW5wcmVkKHApPn07IHNlcGFyYXRvcj0iLFxuIj4KK30sIHRydWUpOyAvLyBpbXBvcnRhbnQgdG8gcGFzcyB0cnVlIHRvIG92ZXJ3cml0ZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucworCis8Y3ljbGljREZBczpjeWNsaWNERkEoKT4gPCEgZHVtcCB0YWJsZXMgZm9yIGFsbCBERkEgIT4KK30pKCk7Cis+PgorCisvKiogQSBvdmVycmlkZSBvZiBMZXhlci5uZXh0VG9rZW4oKSB0aGF0IGJhY2t0cmFja3Mgb3ZlciBtVG9rZW5zKCkgbG9va2luZworICogIGZvciBtYXRjaGVzLiAgTm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCB1cG9uIGVycm9yOyBqdXN0IHJld2luZCwgY29uc3VtZQorICogIGEgdG9rZW4gYW5kIHRoZW4gdHJ5IGFnYWluLiAgYmFja3RyYWNraW5nIG5lZWRzIHRvIGJlIHNldCBhcyB3ZWxsLgorICogIE1ha2UgcnVsZSBtZW1vaXphdGlvbiBoYXBwZW4gb25seSBhdCBsZXZlbHMgYWJvdmUgMSBhcyB3ZSBzdGFydCBtVG9rZW5zCisgKiAgYXQgYmFja3RyYWNraW5nPT0xLgorICovCitmaWx0ZXJpbmdOZXh0VG9rZW4oKSA6Oj0gPDwKK25leHRUb2tlbjogZnVuY3Rpb24oKSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKCB0aGlzLmlucHV0LkxBKDEpPT1vcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtLkVPRiApIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5FT0ZfVE9LRU47CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdGF0ZS50b2tlbiA9IG51bGw7CisgICAgICAgIHRoaXMuc3RhdGUuY2hhbm5lbCA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKKyAgICAgICAgdGhpcy5zdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gdGhpcy5pbnB1dC5pbmRleCgpOworICAgICAgICB0aGlzLnN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSB0aGlzLmlucHV0LmdldENoYXJQb3NpdGlvbkluTGluZSgpOworICAgICAgICB0aGlzLnN0YXRlLnRva2VuU3RhcnRMaW5lID0gdGhpcy5pbnB1dC5nZXRMaW5lKCk7CisgICAgICAgIHRoaXMuc3RhdGUudGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgbSA9IHRoaXMuaW5wdXQubWFyaygpOworICAgICAgICAgICAgdGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc9MTsgPCEgbWVhbnMgd2Ugd29uJ3QgdGhyb3cgc2xvdyBleGNlcHRpb24gIT4KKyAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFpbGVkPWZhbHNlOworICAgICAgICAgICAgdGhpcy5tVG9rZW5zKCk7CisgICAgICAgICAgICB0aGlzLnN0YXRlLmJhY2t0cmFja2luZz0wOworICAgICAgICAgICAgPCEgbVRva2VucyBiYWNrdHJhY2tzIHdpdGggc3lucHJlZCBhdCBiYWNrdHJhY2tpbmc9PTIKKyAgICAgICAgICAgICAgIGFuZCB3ZSBzZXQgdGhlIHN5bnByZWRnYXRlIHRvIGFsbG93IGFjdGlvbnMgYXQgbGV2ZWwgMS4gIT4KKyAgICAgICAgICAgIGlmICggdGhpcy5zdGF0ZS5mYWlsZWQgKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5yZXdpbmQobSk7CisgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jb25zdW1lKCk7IDwhIGFkdmFuY2Ugb25lIGNoYXIgYW5kIHRyeSBhZ2FpbiAhPgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKHJlKSB7CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKyAgICAgICAgICAgIGlmIChyZSBpbnN0YW5jZW9mIG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyKHJlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9LAorCittZW1vaXplOiBmdW5jdGlvbihpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCkgeworICAgIGlmICh0aGlzLnN0YXRlLmJhY2t0cmFja2luZz4xKSB7CisgICAgICAgIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5zdXBlcmNsYXNzLnByb3RvdHlwZS5tZW1vaXplLmNhbGwodGhpcywgaW5wdXQsIHJ1bGVJbmRleCwgcnVsZVN0YXJ0SW5kZXgpOworICAgIH0KK30sCisKK2FscmVhZHlQYXJzZWRSdWxlOiBmdW5jdGlvbihpbnB1dCwgcnVsZUluZGV4KSB7CisgICAgaWYgKHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjEpIHsKKyAgICAgICAgcmV0dXJuIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5zdXBlcmNsYXNzLnByb3RvdHlwZS5hbHJlYWR5UGFyc2VkUnVsZS5jYWxsKHRoaXMsIGlucHV0LCBydWxlSW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9LAorCisKKz4+CisKK2FjdGlvbkdhdGUoKSA6Oj0gInRoaXMuc3RhdGUuYmFja3RyYWNraW5nPT09MCIKKworZmlsdGVyaW5nQWN0aW9uR2F0ZSgpIDo6PSAidGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc9PT0xIgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcGFyc2VyICovCitnZW5lcmljUGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsCisgICAgICAgICAgICAgIGJpdHNldHMsIGlucHV0U3RyZWFtVHlwZSwgc3VwZXJDbGFzcywKKyAgICAgICAgICAgICAgQVNUTGFiZWxUeXBlPSJPYmplY3QiLCBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSkgOjo9IDw8Cis8ISBXQVJOSU5HLiBidWcgaW4gU1Q6IHRoaXMgaXMgY3V0LW4tcGFzdGUgaW50byBEYmcuc3RnICE+Cit2YXIgPGdyYW1tYXIucmVjb2duaXplck5hbWU+ID0gZnVuY3Rpb24oaW5wdXQsIHN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KSB7CisgICAgaWYgKCFzdGF0ZSkgeworICAgICAgICBzdGF0ZSA9IG5ldyBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pemVyU2hhcmVkU3RhdGUoKTsKKyAgICB9CisKKyAgICAoZnVuY3Rpb24oKXsKKyAgICAgICAgPG1lbWJlcnM+CisgICAgfSkuY2FsbCh0aGlzKTsKKworICAgIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5zdXBlcmNsYXNzLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgaW5wdXQsIHN0YXRlKTsKKworICAgIDxjeWNsaWNERkFzOntkZmEgfCB0aGlzLmRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gbmV3IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPih0aGlzKTt9OyBzZXBhcmF0b3I9IlxuIj4KKworICAgICAgICA8cGFyc2VyQ3RvckJvZHkoKT4KKyAgICAgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICAgICAge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBzdGF0ZTx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfCwgPHA6ZGVsZWdhdGVOYW1lKCk+fT4sIHRoaXMpO307IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICAgPGdyYW1tYXIuaW5kaXJlY3REZWxlZ2F0ZXM6e2cgfCB0aGlzLjxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnLmRlbGVnYXRvcjpkZWxlZ2F0ZU5hbWUoKT4uPGc6ZGVsZWdhdGVOYW1lKCk+O307IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3x0aGlzLmdQYXJlbnQgPSB0aGlzLjxnOmRlbGVnYXRlTmFtZSgpPjt9PgorCisgICAgLyogQHRvZG8gb25seSBjcmVhdGUgYWRhcHRvciBpZiBvdXRwdXQ9QVNUICovCisgICAgdGhpcy5hZGFwdG9yID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZUFkYXB0b3IoKTs8XG4+Cit9OworCitvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0KDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgeworICAgIDx0b2tlbnM6ezxpdC5uYW1lPjogPGl0LnR5cGU+fTsgc2VwYXJhdG9yPSIsXG4iPgorfSk7CisKKyhmdW5jdGlvbigpeworLy8gcHVibGljIGNsYXNzIHZhcmlhYmxlcwordmFyIDx0b2tlbnM6ezxpdC5uYW1lPj0gPGl0LnR5cGU+fTsgc2VwYXJhdG9yPSIsXG4gICAgIj47Cis8aWYoVFJFRV9QQVJTRVIpPgordmFyIFVQID0gb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uVVAsCisgICAgRE9XTiA9IG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRPV047Cis8ZW5kaWY+CisKKworLy8gcHVibGljIGluc3RhbmNlIG1ldGhvZHMvdmFycworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgb3JnLmFudGxyLnJ1bnRpbWUuPEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD4sIHsKKyAgICA8QG1lbWJlcnM+CisgICAgPEBlbmQ+CisgICAgPHNjb3Blczp7PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorCisgICAgZ2V0VG9rZW5OYW1lczogZnVuY3Rpb24oKSB7IHJldHVybiA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnRva2VuTmFtZXM7IH0sCisgICAgZ2V0R3JhbW1hckZpbGVOYW1lOiBmdW5jdGlvbigpIHsgcmV0dXJuICI8ZmlsZU5hbWU+IjsgfQorfSk7CitvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0KDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5wcm90b3R5cGUsIHsKKworICAgIDxydWxlczsgc2VwYXJhdG9yPSIsXG5cbiI+CisKKzwhIGdlbmVyYXRlIHJ1bGUvbWV0aG9kIGRlZmluaXRpb25zIGZvciBpbXBvcnRlZCBydWxlcyBzbyB0aGV5CisgICBhcHBlYXIgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIHJlY29nbml6ZXIuICE+CisgICAgLy8gRGVsZWdhdGVkIHJ1bGVzCis8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8CisgICAgLCA8cnVsZURlc2NyaXB0b3IubmFtZT46IGZ1bmN0aW9uKDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+KSBceyA8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPnJldHVybiA8ZW5kaWY+dGhpcy48cnVsZURlc2NyaXB0b3IuZ3JhbW1hcjpkZWxlZ2F0ZU5hbWUoKT4uPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU+fTsgc2VwYXJhdG9yPSIsICI+KTsgXH19PgorCisKKworICAgIDxzeW5wcmVkczp7cCB8IDxzeW5wcmVkKHApPn07IHNlcGFyYXRvcj0iLFxuIj4KKworfSwgdHJ1ZSk7IC8vIGltcG9ydGFudCB0byBwYXNzIHRydWUgdG8gb3ZlcndyaXRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisKKzxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCisvLyBwdWJsaWMgY2xhc3MgdmFyaWFibGVzCitvcmcuYW50bHIubGFuZy5hdWdtZW50T2JqZWN0KDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgeworPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgICAgdG9rZW5OYW1lczogWyJcPGludmFsaWQ+IiwgIlw8RU9SPiIsICJcPERPV04+IiwgIlw8VVA+IiwgPHRva2VuTmFtZXM7IHNlcGFyYXRvcj0iLCAiPl0sPFxuPgorPGVuZGlmPgorICAgIDxiaXRzZXRzOmJpdHNldChuYW1lPXtGT0xMT1dfPGl0Lm5hbWU+X2luXzxpdC5pbk5hbWU+PGl0LnRva2VuSW5kZXg+fSwKKyAgICAgICAgICAgICAgICAgICAgd29yZHM2ND1pdC5iaXRzKTsgc2VwYXJhdG9yPSIsXG4iPgorfSk7CisKK30pKCk7Cis+PgorCitwYXJzZXJDdG9yQm9keSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+Cit0aGlzLnN0YXRlLnJ1bGVNZW1vID0ge307PFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKzxncmFtbWFyLmRlbGVnYXRvcnM6Cisge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitwYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywgQVNUTGFiZWxUeXBlPSJPYmplY3QiLCBzdXBlckNsYXNzPSJQYXJzZXIiLCBsYWJlbFR5cGU9IlRva2VuIiwgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IlRva2VuU3RyZWFtIiwgcmV3cml0ZUVsZW1lbnRUeXBlPSJUb2tlbiIsIC4uLik+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgdHJlZSBwYXJzZXI7IHNhbWUgYXMgcGFyc2VyIGV4Y2VwdCB0aGUgaW5wdXQKKyAqICBzdHJlYW0gaXMgYSBkaWZmZXJlbnQgdHlwZS4KKyAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLCBydWxlcywgbnVtUnVsZXMsIGJpdHNldHMsIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9InZhciIsIHN1cGVyQ2xhc3M9InRyZWUuVHJlZVBhcnNlciIsIG1lbWJlcnM9ezxhY3Rpb25zLnRyZWVwYXJzZXIubWVtYmVycz59LCBmaWx0ZXJNb2RlKSA6Oj0gPDwKKzxnZW5lcmljUGFyc2VyKGlucHV0U3RyZWFtVHlwZT0iVHJlZU5vZGVTdHJlYW0iLCByZXdyaXRlRWxlbWVudFR5cGU9Ik5vZGUiLCAuLi4pPgorPj4KKworLyoqIEEgc2ltcGxlciB2ZXJzaW9uIG9mIGEgcnVsZSB0ZW1wbGF0ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBpbWFnaW5hcnkKKyAqICBydWxlcyBjcmVhdGVkIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gIEFzIHRoZXkgbmV2ZXIgaGF2ZSByZXR1cm4gdmFsdWVzCisgKiAgbm9yIHBhcmFtZXRlcnMgZXRjLi4uLCBqdXN0IGdpdmUgc2ltcGxlc3QgcG9zc2libGUgbWV0aG9kLiAgRG9uJ3QgZG8KKyAqICBhbnkgb2YgdGhlIG5vcm1hbCBtZW1vaXphdGlvbiBzdHVmZiBpbiBoZXJlIGVpdGhlcjsgaXQncyBhIHdhc3RlLgorICogIEFzIHByZWRpY2F0ZXMgY2Fubm90IGJlIGlubGluZWQgaW50byB0aGUgaW52b2tpbmcgcnVsZSwgdGhleSBuZWVkIHRvCisgKiAgYmUgaW4gYSBydWxlIGJ5IHRoZW1zZWx2ZXMuCisgKi8KK3N5bnByZWRSdWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGRlc2NyaXB0aW9uLCBuYWtlZEJsb2NrKSA6Oj0KKzw8CisvLyAkQU5UTFIgc3RhcnQgIjxydWxlTmFtZT4iCis8cnVsZU5hbWU+X2ZyYWdtZW50OiBmdW5jdGlvbig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoc2NvcGU9aXQpPikgeworPGlmKHRyYWNlKT4KKyAgICB0aGlzLnRyYWNlSW4oIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKyAgICB0cnkgeworICAgICAgICA8YmxvY2s+CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgICB0aGlzLnRyYWNlT3V0KCI8cnVsZU5hbWU+X2ZyYWdtZW50IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik7CisgICAgfQorPGVsc2U+CisgICAgPGJsb2NrPgorPGVuZGlmPgorfSwKKy8vICRBTlRMUiBlbmQgIjxydWxlTmFtZT4iCis+PgorCitzeW5wcmVkKG5hbWUpIDo6PSA8PAorPG5hbWU+OiBmdW5jdGlvbigpIHsKKyAgICB0aGlzLnN0YXRlLmJhY2t0cmFja2luZysrOworICAgIDxAc3RhcnQoKT4KKyAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0Lm1hcmsoKTsKKyAgICB0cnkgeworICAgICAgICB0aGlzLjxuYW1lPl9mcmFnbWVudCgpOyAvLyBjYW4gbmV2ZXIgdGhyb3cgZXhjZXB0aW9uCisgICAgfSBjYXRjaCAocmUpIHsKKyAgICAgICAgYWxlcnQoImltcG9zc2libGU6ICIrcmUudG9TdHJpbmcoKSk7CisgICAgfQorICAgIHZhciBzdWNjZXNzID0gIXRoaXMuc3RhdGUuZmFpbGVkOworICAgIHRoaXMuaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICA8QHN0b3AoKT4KKyAgICB0aGlzLnN0YXRlLmJhY2t0cmFja2luZy0tOworICAgIHRoaXMuc3RhdGUuZmFpbGVkPWZhbHNlOworICAgIHJldHVybiBzdWNjZXNzOworfQorPj4KKworbGV4ZXJTeW5wcmVkKG5hbWUpIDo6PSA8PAorPHN5bnByZWQobmFtZSk+Cis+PgorCitydWxlTWVtb2l6YXRpb24obmFtZSkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+CitpZiAoIHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjAgJiYgdGhpcy5hbHJlYWR5UGFyc2VkUnVsZSh0aGlzLmlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KSApIHsgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47IH0KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdGVzdCBmb3IgZmFpbHVyZSBhbmQgcmV0dXJuIGZyb20gcnVsZSAqLworY2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+aWYgKHRoaXMuc3RhdGUuZmFpbGVkKSByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjs8ZW5kaWY+Cis+PgorCisvKiogVGhpcyBydWxlIGhhcyBmYWlsZWQsIGV4aXQgaW5kaWNhdGluZyBmYWlsdXJlIGR1cmluZyBiYWNrdHJhY2sgKi8KK3J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAodGhpcy5zdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3RoaXMuc3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+O308ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcnVsZS4gIFRoaXMgaW5jbHVkZXMgYW55IHJldHVybiB0eXBlCisgKiAgZGF0YSBhZ2dyZWdhdGVzIHJlcXVpcmVkIGZvciBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgorICovCitydWxlKHJ1bGVOYW1lLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLGVtcHR5UnVsZSxkZXNjcmlwdGlvbixleGNlcHRpb25zLGZpbmFsbHksbWVtb2l6ZSkgOjo9IDw8Cis8cnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+Cis8cmV0dXJuU2NvcGUoc2NvcGU9cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUpPgorCisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKy8vICRBTlRMUiBzdGFydCAiPHJ1bGVOYW1lPiIKKzxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmRlY29yYXRlPgorPHJ1bGVOYW1lPjogZnVuY3Rpb24oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pIHsKKyAgICA8aWYodHJhY2UpPnRoaXMudHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIDxydWxlTGFiZWxEZWZzKCk+CisgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKyAgICA8QHByZWFtYmxlKCk+CisgICAgdHJ5IHsKKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPGJsb2NrPgorICAgICAgICA8cnVsZUNsZWFuVXAoKT4KKyAgICAgICAgPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWN0aW9uKCk+CisgICAgfQorPGlmKGV4Y2VwdGlvbnMpPgorICAgIDxleGNlcHRpb25zOntlfDxjYXRjaChkZWNsPWUuZGVjbCxhY3Rpb249ZS5hY3Rpb24pPjxcbj59PgorPGVsc2U+Cis8aWYoIWVtcHR5UnVsZSk+Cis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaCk+CisgICAgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2g+Cis8ZWxzZT4KKyAgICBjYXRjaCAocmUpIHsKKyAgICAgICAgaWYgKHJlIGluc3RhbmNlb2Ygb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgdGhpcy5yZWNvdmVyKHRoaXMuaW5wdXQscmUpOworICAgICAgICAgICAgPEBzZXRFcnJvclJldHVyblZhbHVlKCk+CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgfQorICAgIH08XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CisgICAgZmluYWxseSB7CisgICAgICAgIDxpZih0cmFjZSk+dGhpcy50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICAgICAgPG1lbW9pemUoKT4KKyAgICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgICAgPGZpbmFsbHk+CisgICAgfQorICAgIDxAcG9zdGFtYmxlKCk+CisgICAgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47Cit9Cis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitjYXRjaCAoPGUuZGVjbD4pIHsKKyAgICA8ZS5hY3Rpb24+Cit9Cis+PgorCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgordmFyIHJldHZhbCA9IG5ldyA8cmV0dXJuVHlwZSgpPigpOworcmV0dmFsLnN0YXJ0ID0gdGhpcy5pbnB1dC5MVCgxKTs8XG4+Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8Cit2YXIgPGEubmFtZT4gPSA8aWYoYS5pbml0VmFsdWUpPjxhLmluaXRWYWx1ZT48ZWxzZT5udWxsPGVuZGlmPjsKK30+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+Cit2YXIgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSB0aGlzLmlucHV0LmluZGV4KCk7Cis8ZW5kaWY+Cis+PgorCitydWxlU2NvcGVTZXRVcCgpIDo6PSA8PAorPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7dGhpcy48aXQ+X3N0YWNrLnB1c2goe30pO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7dGhpcy48aXQubmFtZT5fc3RhY2sucHVzaCh7fSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlU2NvcGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOnt0aGlzLjxpdD5fc3RhY2sucG9wKCk7fTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOnt0aGlzLjxpdC5uYW1lPl9zdGFjay5wb3AoKTt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3J1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMscnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzXQorICAgIDp7dmFyIDxpdC5sYWJlbC50ZXh0PiA9IG51bGw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDp7dmFyIGxpc3RfPGl0LmxhYmVsLnRleHQ+PW51bGw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzOnJ1bGVMYWJlbERlZihsYWJlbD1pdCk7IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzOntsbHx2YXIgPGxsLmxhYmVsLnRleHQ+ID0gbnVsbDt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK2xleGVyUnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzXQorICAgIDp7dmFyIDxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7dmFyIDxpdC5sYWJlbC50ZXh0Pjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOnt2YXIgbGlzdF88aXQubGFiZWwudGV4dD49bnVsbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworcnVsZVJldHVyblZhbHVlKCkgOjo9IDw8Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVybk5hbWU+Cis8ZWxzZT4KK3JldHZhbAorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoIVRSRUVfUEFSU0VSKT4KK3JldHZhbC5zdG9wID0gdGhpcy5pbnB1dC5MVCgtMSk7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworbWVtb2l6ZSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoIHRoaXMuc3RhdGUuYmFja3RyYWNraW5nPjAgKSB7IHRoaXMubWVtb2l6ZSh0aGlzLmlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCk7IH0KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxydWxlRGVzY3JpcHRvcixibG9jayxtZW1vaXplKSA6Oj0gPDwKKy8vICRBTlRMUiBzdGFydCA8cnVsZU5hbWU+CittPHJ1bGVOYW1lPjogZnVuY3Rpb24oPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pICB7CisgICAgPGlmKHRyYWNlKT50aGlzLnRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICB0cnkgeworPGlmKG5ha2VkQmxvY2spPgorICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz48XG4+Cis8ZWxzZT4KKyAgICAgICAgdmFyIF90eXBlID0gdGhpcy48cnVsZU5hbWU+OworICAgICAgICB2YXIgX2NoYW5uZWwgPSBvcmcuYW50bHIucnVudGltZS5CYXNlUmVjb2duaXplci5ERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxsZXhlclJ1bGVMYWJlbERlZnMoKT4KKyAgICAgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKyAgICAgICAgPGJsb2NrPgorICAgICAgICA8cnVsZUNsZWFuVXAoKT4KKyAgICAgICAgdGhpcy5zdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgIHRoaXMuc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICA8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKzxlbmRpZj4KKyAgICB9CisgICAgZmluYWxseSB7CisgICAgICAgIDxpZih0cmFjZSk+dGhpcy50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgICAgPG1lbW9pemUoKT4KKyAgICB9Cit9LAorLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorbVRva2VuczogZnVuY3Rpb24oKSB7CisgICAgPGJsb2NrPjxcbj4KK30KKz4+CisKKy8vIFMgVSBCIFIgVSBMIEUgUworCisvKiogQSAoLi4uKSBzdWJydWxlIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRpdmVzICovCitibG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworPGRlY2xzPgorPEBwcmVkZWNpc2lvbigpPgorPGRlY2lzaW9uPgorPEBwb3N0ZGVjaXNpb24oKT4KKzxAcHJlYnJhbmNoKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+Cit9Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworPGRlY2xzPgorPEBwcmVkZWNpc2lvbigpPgorPGRlY2lzaW9uPgorPEBwb3N0ZGVjaXNpb24oKT4KK3N3aXRjaCAoYWx0PGRlY2lzaW9uTnVtYmVyPikgeworICAgIDxhbHRzOmFsdFN3aXRjaENhc2UoKT4KK30KKz4+CisKK3J1bGVCbG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgc3BlY2lhbCBjYXNlIG9mIGEgKC4uLikgc3VicnVsZSB3aXRoIGEgc2luZ2xlIGFsdGVybmF0aXZlICovCitibG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgKC4uKSsgYmxvY2sgd2l0aCAxIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitwb3NpdGl2ZUNsb3N1cmVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBjbnQ8ZGVjaXNpb25OdW1iZXI+PTA7Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK2xvb3A8ZGVjaXNpb25OdW1iZXI+OgorZG8geworICAgIHZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxtYXhBbHQ+OworICAgIDxAcHJlZGVjaXNpb24oKT4KKyAgICA8ZGVjaXNpb24+CisgICAgPEBwb3N0ZGVjaXNpb24oKT4KKyAgICBzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+CisgICAgZGVmYXVsdCA6CisgICAgICAgIGlmICggY250PGRlY2lzaW9uTnVtYmVyPiA+PSAxICkgeworICAgICAgICAgICAgYnJlYWsgbG9vcDxkZWNpc2lvbk51bWJlcj47CisgICAgICAgIH0KKyAgICAgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgICAgICAgICB2YXIgZWVlID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkVhcmx5RXhpdEV4Y2VwdGlvbig8ZGVjaXNpb25OdW1iZXI+LCB0aGlzLmlucHV0KTsKKyAgICAgICAgICAgIDxAZWFybHlFeGl0RXhjZXB0aW9uKCk+CisgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgfQorICAgIGNudDxkZWNpc2lvbk51bWJlcj4rKzsKK30gd2hpbGUgKHRydWUpOworPEBwb3N0bG9vcCgpPgorPj4KKworcG9zaXRpdmVDbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisKKy8qKiBBICguLikqIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworY2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVsb29wKCk+Citsb29wPGRlY2lzaW9uTnVtYmVyPjoKK2RvIHsKKyAgICB2YXIgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisgICAgPGFsdHM6YWx0U3dpdGNoQ2FzZSgpPgorICAgIGRlZmF1bHQgOgorICAgICAgICBicmVhayBsb29wPGRlY2lzaW9uTnVtYmVyPjsKKyAgICB9Cit9IHdoaWxlICh0cnVlKTsKKzxAcG9zdGxvb3AoKT4KKz4+CisKK2Nsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gY2xvc3VyZUJsb2NrCisKKy8qKiBPcHRpb25hbCBibG9ja3MgKHgpPyBhcmUgdHJhbnNsYXRlZCB0byAoeHwpIGJ5IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24KKyAqICBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBibG9jayB0ZW1wbGF0ZQorICovCitvcHRpb25hbEJsb2NrIDo6PSBibG9jaworCitvcHRpb25hbEJsb2NrU2luZ2xlQWx0IDo6PSBibG9jaworCisvKiogQSBjYXNlIGluIGEgc3dpdGNoIHRoYXQganVtcHMgdG8gYW4gYWx0ZXJuYXRpdmUgZ2l2ZW4gdGhlIGFsdGVybmF0aXZlCisgKiAgbnVtYmVyLiAgQSBERkEgcHJlZGljdHMgdGhlIGFsdGVybmF0aXZlIGFuZCB0aGVuIGEgc2ltcGxlIHN3aXRjaAorICogIGRvZXMgdGhlIGp1bXAgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBtYXRjaGVzIHRoYXQgYWx0ZXJuYXRpdmUuCisgKi8KK2FsdFN3aXRjaENhc2UoKSA6Oj0gPDwKK2Nhc2UgPGk+IDoKKyAgICA8QHByZWFsdCgpPgorICAgIDxpdD4KKyAgICBicmVhazs8XG4+Cis+PgorCisvKiogQW4gYWx0ZXJuYXRpdmUgaXMganVzdCBhIGxpc3Qgb2YgZWxlbWVudHM7IGF0IG91dGVybW9zdCBsZXZlbCAqLworYWx0KGVsZW1lbnRzLGFsdE51bSxkZXNjcmlwdGlvbixhdXRvQVNULG91dGVyQWx0LHRyZWVMZXZlbCxyZXcpIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ISAoZnVuY3Rpb24oKSB7IC8qIEB0b2RvNCAoZG8gd2UgcmVhbGx5IG5lZWQgYSBuZXcgc2NvcGU/KSAqLyAhPgorPEBkZWNsYXJhdGlvbnMoKT4KKzxlbGVtZW50czplbGVtZW50KCk+Cis8cmV3PgorPEBjbGVhbnVwKCk+Cis8ISB9KS5jYWxsKHRoaXMpOyAhPgorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvLyBFIEwgRSBNIEUgTiBUIFMKKworLyoqIER1bXAgdGhlIGVsZW1lbnRzIG9uZSBwZXIgbGluZSAqLworZWxlbWVudCgpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGl0LmVsPjxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIHRva2VuIG9wdGlvbmFsbHkgd2l0aCBhIGxhYmVsIGluIGZyb250ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxpZihsYWJlbCk+PGxhYmVsPj08ZW5kaWY+dGhpcy5tYXRjaCh0aGlzLmlucHV0LDx0b2tlbj4sPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkZPTExPV188dG9rZW4+X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4Pik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1JRCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworbGlzdExhYmVsKGxhYmVsLGVsZW0pIDo6PSA8PAoraWYgKG9yZy5hbnRsci5sYW5nLmlzTnVsbChsaXN0XzxsYWJlbD4pKSBsaXN0XzxsYWJlbD4gPSBbXTsKK2xpc3RfPGxhYmVsPi5wdXNoKDxlbGVtPik7PFxuPgorPj4KKworLyoqIG1hdGNoIGEgY2hhcmFjdGVyICovCitjaGFyUmVmKGNoYXIsbGFiZWwpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSB0aGlzLmlucHV0LkxBKDEpOzxcbj4KKzxlbmRpZj4KK3RoaXMubWF0Y2goPGNoYXI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciByYW5nZSAqLworY2hhclJhbmdlUmVmKGEsYixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IHRoaXMuaW5wdXQuTEEoMSk7PFxuPgorPGVuZGlmPgordGhpcy5tYXRjaFJhbmdlKDxhPiw8Yj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGU9IiIpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxpZihMRVhFUik+Cis8bGFiZWw+PSB0aGlzLmlucHV0LkxBKDEpOzxcbj4KKzxlbHNlPgorPGxhYmVsPj10aGlzLmlucHV0LkxUKDEpOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KK2lmICggPHM+ICkgeworICAgIHRoaXMuaW5wdXQuY29uc3VtZSgpOworICAgIDxwb3N0bWF0Y2hDb2RlPgorPGlmKCFMRVhFUik+CisgICAgdGhpcy5zdGF0ZS5lcnJvclJlY292ZXJ5PWZhbHNlOworPGVuZGlmPgorICAgIDxpZihiYWNrdHJhY2tpbmcpPnRoaXMuc3RhdGUuZmFpbGVkPWZhbHNlOzxlbmRpZj4KK30KK2Vsc2UgeworICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIHZhciBtc2UgPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLHRoaXMuaW5wdXQpOworICAgIDxAbWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpPgorPGlmKExFWEVSKT4KKyAgICB0aGlzLnJlY292ZXIobXNlKTsKKyAgICB0aHJvdyBtc2U7Cis8ZWxzZT4KKyAgICB0aHJvdyBtc2U7CisgICAgPCEgdXNlIGZvbGxvd2luZyBjb2RlIHRvIG1ha2UgaXQgcmVjb3ZlciBpbmxpbmU7IHJlbW92ZSB0aHJvdyBtc2U7CisgICAgdGhpcy5yZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQodGhpcy5pbnB1dCxtc2UsPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKyAgICAhPgorPGVuZGlmPgorfTxcbj4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0IDo6PSBtYXRjaFNldAorCittYXRjaFNldEFuZExpc3RMYWJlbChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggYSBzdHJpbmcgbGl0ZXJhbCAqLworbGV4ZXJTdHJpbmdSZWYoc3RyaW5nLGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgordmFyIDxsYWJlbD5TdGFydCA9IHRoaXMuZ2V0Q2hhckluZGV4KCk7Cit0aGlzLm1hdGNoKDxzdHJpbmc+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK3ZhciA8bGFiZWw+ID0gbmV3IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuKHRoaXMuaW5wdXQsIG9yZy5hbnRsci5ydW50aW1lLlRva2VuLklOVkFMSURfVE9LRU5fVFlQRSwgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uREVGQVVMVF9DSEFOTkVMLCA8bGFiZWw+U3RhcnQsIHRoaXMuZ2V0Q2hhckluZGV4KCktMSk7Cis8ZWxzZT4KK3RoaXMubWF0Y2goPHN0cmluZz4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxlbmRpZj4KKz4+CisKK3dpbGRjYXJkKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPj10aGlzLmlucHV0LkxUKDEpOzxcbj4KKzxlbmRpZj4KK3RoaXMubWF0Y2hBbnkodGhpcy5pbnB1dCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IHRoaXMuaW5wdXQuTEEoMSk7PFxuPgorPGVuZGlmPgordGhpcy5tYXRjaEFueSgpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKword2lsZGNhcmRDaGFyTGlzdExhYmVsKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkQ2hhciguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvLyBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4KKyAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK3RoaXMucHVzaEZvbGxvdyg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uRk9MTE9XXzxydWxlLm5hbWU+X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4Pik7Cis8aWYobGFiZWwpPjxsYWJlbD49PGVuZGlmPnRoaXMuPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj48cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTs8XG4+Cit0aGlzLnN0YXRlLl9mc3AtLTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1yICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIEEgbGV4ZXIgcnVsZSByZWZlcmVuY2UgKi8KK2xleGVyUnVsZVJlZihydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cit2YXIgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4gPSB0aGlzLmdldENoYXJJbmRleCgpOwordGhpcy48aWYoc2NvcGUpPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4uPGVuZGlmPm08cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxsYWJlbD4gPSBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW4odGhpcy5pbnB1dCwgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFLCBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+LCB0aGlzLmdldENoYXJJbmRleCgpLTEpOworPGVsc2U+Cit0aGlzLjxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIGkrPUlOVCBpbiBsZXhlciAqLworbGV4ZXJSdWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGxleGVyUnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogRU9GIGluIHRoZSBsZXhlciAqLworbGV4ZXJNYXRjaEVPRihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK3ZhciA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IHRoaXMuZ2V0Q2hhckluZGV4KCk7Cit0aGlzLm1hdGNoKEVPRik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cit2YXIgPGxhYmVsPiA9IG5ldyBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbih0aGlzLmlucHV0LCB0aGlzLkVPRiwgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uREVGQVVMVF9DSEFOTkVMLCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiwgdGhpcy5nZXRDaGFySW5kZXgoKS0xKTsKKzxlbHNlPgordGhpcy5tYXRjaCh0aGlzLkVPRik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvLyB1c2VkIGZvciBsZWZ0LXJlY3Vyc2l2ZSBydWxlcworcmVjUnVsZURlZkFyZygpICAgICAgICAgICAgICAgICAgICAgICA6Oj0gImludCA8cmVjUnVsZUFyZygpPiIKK3JlY1J1bGVBcmcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgOjo9ICJfcCIKK3JlY1J1bGVBbHRQcmVkaWNhdGUocnVsZU5hbWUsb3BQcmVjKSAgOjo9ICI8cmVjUnVsZUFyZygpPiBcPD0gPG9wUHJlYz4iCityZWNSdWxlU2V0UmVzdWx0QWN0aW9uKCkgICAgICAgICAgICAgIDo6PSAicm9vdF8wPSQ8cnVsZU5hbWU+X3ByaW1hcnkudHJlZTsiCityZWNSdWxlU2V0UmV0dXJuQWN0aW9uKHNyYyxuYW1lKSAgICAgIDo6PSAiJDxuYW1lPj0kPHNyYz4uPG5hbWU+OyIKKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxyb290OmVsZW1lbnQoKT4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIHRoaXMuaW5wdXQuTEEoMSk9PW9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRPV04gKSB7CisgICAgdGhpcy5tYXRjaCh0aGlzLmlucHV0LCBvcmcuYW50bHIucnVudGltZS5Ub2tlbi5ET1dOLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICAgIHRoaXMubWF0Y2godGhpcy5pbnB1dCwgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uVVAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+Cit0aGlzLm1hdGNoKHRoaXMuaW5wdXQsIG9yZy5hbnRsci5ydW50aW1lLlRva2VuLkRPV04sIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGNoaWxkcmVuOmVsZW1lbnQoKT4KK3RoaXMubWF0Y2godGhpcy5pbnB1dCwgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW4uVVAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIEV2ZXJ5IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdmFsaWRhdGluZyBwcmVkaWNhdGUgKGV2ZW4gd2hlbiBpdCBpcworICogIGFsc28gaG9pc3RlZCBpbnRvIGEgcHJlZGljdGlvbiBleHByZXNzaW9uKS4KKyAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2lmICggISg8ZXZhbFByZWRpY2F0ZSguLi4pPikgKSB7CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgdGhyb3cgbmV3IG9yZy5hbnRsci5ydW50aW1lLkZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbih0aGlzLmlucHV0LCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+Iik7Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Cit2YXIgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSB0aGlzLmlucHV0LkxBKDxrPik7PFxuPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorZWxzZSB7Cis8aWYoZW90UHJlZGljdHNBbHQpPgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKzxlbHNlPgorICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIHZhciBudmFlID0KKyAgICAgICAgbmV3IG9yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uKCI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiwgdGhpcy5pbnB1dCk7PFxuPgorICAgIDxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKyAgICB0aHJvdyBudmFlOzxcbj4KKzxlbmRpZj4KK30KKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lIGxvb2thaGVhZAorICogIGZvciB0aGUgYnlwYXNzIGFsdGVybmF0aXZlLiAgSXQgZGVsYXlzIGVycm9yIGRldGVjdGlvbiBidXQgdGhpcworICogIGlzIGZhc3Rlciwgc21hbGxlciwgYW5kIG1vcmUgd2hhdCBwZW9wbGUgZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlCisgKiAgZXhwZWN0ICJpZiAoIExBKDEpPT1YICkgbWF0Y2goWCk7IiBhbmQgdGhhdCdzIGl0LgorICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAordmFyIExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gdGhpcy5pbnB1dC5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKz4+CisKKy8qKiBBIERGQSBzdGF0ZSB0aGF0IGlzIGFjdHVhbGx5IHRoZSBsb29wYmFjayBkZWNpc2lvbiBvZiBhIGNsb3N1cmUKKyAqICBsb29wLiAgSWYgZW5kLW9mLXRva2VuIChFT1QpIHByZWRpY3RzIGFueSBvZiB0aGUgdGFyZ2V0cyB0aGVuIGl0CisgKiAgc2hvdWxkIGFjdCBsaWtlIGEgZGVmYXVsdCBjbGF1c2UgKGkuZS4sIG5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQpLgorICogIFRoaXMgaXMgdXNlZCBvbmx5IGluIHRoZSBsZXhlciBzbyB0aGF0IGZvciAoJ2EnKSogb24gdGhlIGVuZCBvZiBhIHJ1bGUKKyAqICBhbnl0aGluZyBvdGhlciB0aGFuICdhJyBwcmVkaWN0cyBleGl0aW5nLgorICovCitkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3ZhciBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IHRoaXMuaW5wdXQuTEEoPGs+KTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KKzxpZighZWRnZXMpPgorYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OyA8ISBpZiBubyBlZGdlcywgZG9uJ3QgZ2VuIEVMU0UgIT4KKzxlbHNlPgorZWxzZSB7CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworfTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBBbiBhY2NlcHQgc3RhdGUgaW5kaWNhdGVzIGEgdW5pcXVlIGFsdGVybmF0aXZlIGhhcyBiZWVuIHByZWRpY3RlZCAqLworZGZhQWNjZXB0U3RhdGUoYWx0KSA6Oj0gImFsdDxkZWNpc2lvbk51bWJlcj49PGFsdD47IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7CisgICAgPHRhcmdldFN0YXRlPgorfQorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKHN3aXRjaCBjYXNlKQorCisvKiogQSBERkEgc3RhdGUgd2hlcmUgYSBTV0lUQ0ggbWF5IGJlIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGdlbmVyYXRvcgorICogIGRlY2lkZXMgaWYgdGhpcyBpcyBwb3NzaWJsZTogQ29kZUdlbmVyYXRvci5jYW5HZW5lcmF0ZVN3aXRjaCgpLgorICovCitkZmFTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKCB0aGlzLmlucHV0LkxBKDxrPikgKSB7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorZGVmYXVsdDoKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+OworPGVsc2U+CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgdmFyIG52YWUgPQorICAgICAgICBuZXcgb3JnLmFudGxyLnJ1bnRpbWUuTm9WaWFibGVBbHRFeGNlcHRpb24oIjxkZXNjcmlwdGlvbj4iLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCB0aGlzLmlucHV0KTs8XG4+CisgICAgPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorICAgIHRocm93IG52YWU7PFxuPgorPGVuZGlmPgorfTxcbj4KKz4+CisKK2RmYU9wdGlvbmFsQmxvY2tTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKCB0aGlzLmlucHV0LkxBKDxrPikgKSB7CisgICAgPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KK308XG4+Cis+PgorCitkZmFMb29wYmFja1N0YXRlU3dpdGNoKGssIGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKCB0aGlzLmlucHV0LkxBKDxrPikgKSB7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPjxcbj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitkZWZhdWx0OgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKyAgICBicmVhazs8XG4+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworZGZhRWRnZVN3aXRjaChsYWJlbHMsIHRhcmdldFN0YXRlKSA6Oj0gPDwKKzxsYWJlbHM6e2Nhc2UgPGl0Pjp9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8dGFyZ2V0U3RhdGU+CisgICAgYnJlYWs7Cis+PgorCisvLyBDIHkgYyBsIGkgYyAgRCBGIEEKKworLyoqIFRoZSBjb2RlIHRvIGluaXRpYXRlIGV4ZWN1dGlvbiBvZiBhIGN5Y2xpYyBERkE7IHRoaXMgaXMgdXNlZAorICogIGluIHRoZSBydWxlIHRvIHByZWRpY3QgYW4gYWx0IGp1c3QgbGlrZSB0aGUgZml4ZWQgREZBIGNhc2UuCisgKiAgVGhlIDxuYW1lPiBhdHRyaWJ1dGUgaXMgaW5oZXJpdGVkIHZpYSB0aGUgcGFyc2VyLCBsZXhlciwgLi4uCisgKi8KK2RmYURlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2FsdDxkZWNpc2lvbk51bWJlcj4gPSB0aGlzLmRmYTxkZWNpc2lvbk51bWJlcj4ucHJlZGljdCh0aGlzLmlucHV0KTsKKz4+CisKKy8qIER1bXAgREZBIHRhYmxlcyBhcyBydW4tbGVuZ3RoLWVuY29kZWQgU3RyaW5ncyBvZiBvY3RhbCB2YWx1ZXMuCisgKiBDYW4ndCB1c2UgaGV4IGFzIGNvbXBpbGVyIHRyYW5zbGF0ZXMgdGhlbSBiZWZvcmUgY29tcGlsYXRpb24uCisgKiBUaGVzZSBzdHJpbmdzIGFyZSBzcGxpdCBpbnRvIG11bHRpcGxlLCBjb25jYXRlbmF0ZWQgc3RyaW5ncy4KKyAqIEphdmEgcHV0cyB0aGVtIGJhY2sgdG9nZXRoZXIgYXQgY29tcGlsZSB0aW1lIHRoYW5rZnVsbHkuCisgKiBKYXZhIGNhbm5vdCBoYW5kbGUgbGFyZ2Ugc3RhdGljIGFycmF5cywgc28gd2UncmUgc3R1Y2sgd2l0aCB0aGlzCisgKiBlbmNvZGUvZGVjb2RlIGFwcHJvYWNoLiAgU2VlIGFuYWx5c2lzIGFuZCBydW50aW1lIERGQSBmb3IKKyAqIHRoZSBlbmNvZGluZyBtZXRob2RzLgorICovCitjeWNsaWNERkEoZGZhKSA6Oj0gPDwKK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3QoPGdyYW1tYXIucmVjb2duaXplck5hbWU+LCB7CisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90UzoKKyAgICAgICAgIjxkZmEuamF2YUNvbXByZXNzZWRFT1Q7IHdyYXA9IlwiK1xuICAgIFwiIj4iLAorICAgIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZlM6CisgICAgICAgICI8ZGZhLmphdmFDb21wcmVzc2VkRU9GOyB3cmFwPSJcIitcbiAgICBcIiI+IiwKKyAgICBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW5TOgorICAgICAgICAiPGRmYS5qYXZhQ29tcHJlc3NlZE1pbjsgd3JhcD0iXCIrXG4gICAgXCIiPiIsCisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4UzoKKyAgICAgICAgIjxkZmEuamF2YUNvbXByZXNzZWRNYXg7IHdyYXA9IlwiK1xuICAgIFwiIj4iLAorICAgIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdFM6CisgICAgICAgICI8ZGZhLmphdmFDb21wcmVzc2VkQWNjZXB0OyB3cmFwPSJcIitcbiAgICBcIiI+IiwKKyAgICBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsUzoKKyAgICAgICAgIjxkZmEuamF2YUNvbXByZXNzZWRTcGVjaWFsOyB3cmFwPSJcIitcbiAgICBcIiI+fT4iLAorICAgIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TOiBbCisgICAgICAgICAgICA8ZGZhLmphdmFDb21wcmVzc2VkVHJhbnNpdGlvbjp7c3wiPHM7IHdyYXA9IlwiK1xuXCIiPiJ9OyBzZXBhcmF0b3I9IixcbiI+CisgICAgXQorfSk7CisKK29yZy5hbnRsci5sYW5nLmF1Z21lbnRPYmplY3QoPGdyYW1tYXIucmVjb2duaXplck5hbWU+LCB7CisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OgorICAgICAgICBvcmcuYW50bHIucnVudGltZS5ERkEudW5wYWNrRW5jb2RlZFN0cmluZyg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90UyksCisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mOgorICAgICAgICBvcmcuYW50bHIucnVudGltZS5ERkEudW5wYWNrRW5jb2RlZFN0cmluZyg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mUyksCisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluOgorICAgICAgICBvcmcuYW50bHIucnVudGltZS5ERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluUyksCisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OgorICAgICAgICBvcmcuYW50bHIucnVudGltZS5ERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4UyksCisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0OgorICAgICAgICBvcmcuYW50bHIucnVudGltZS5ERkEudW5wYWNrRW5jb2RlZFN0cmluZyg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0UyksCisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbDoKKyAgICAgICAgb3JnLmFudGxyLnJ1bnRpbWUuREZBLnVucGFja0VuY29kZWRTdHJpbmcoPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWxTKSwKKyAgICBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uOiAoZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBhID0gW10sCisgICAgICAgICAgICBpLAorICAgICAgICAgICAgbnVtU3RhdGVzID0gPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgZm9yIChpPTA7IGlcPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBhLnB1c2gob3JnLmFudGxyLnJ1bnRpbWUuREZBLnVucGFja0VuY29kZWRTdHJpbmcoPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGE7CisgICAgfSkoKQorfSk7CisKKzxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA9IGZ1bmN0aW9uKHJlY29nbml6ZXIpIHsKKyAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA8ZGZhLmRlY2lzaW9uTnVtYmVyPjsKKyAgICB0aGlzLmVvdCA9IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb3Q7CisgICAgdGhpcy5lb2YgPSA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mOworICAgIHRoaXMubWluID0gPGdyYW1tYXIucmVjb2duaXplck5hbWU+LkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbjsKKyAgICB0aGlzLm1heCA9IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9tYXg7CisgICAgdGhpcy5hY2NlcHQgPSA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0OworICAgIHRoaXMuc3BlY2lhbCA9IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsOworICAgIHRoaXMudHJhbnNpdGlvbiA9IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uOworfTsKKworb3JnLmFudGxyLmxhbmcuZXh0ZW5kKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiwgb3JnLmFudGxyLnJ1bnRpbWUuREZBLCB7CisgICAgZ2V0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gIjxkZmEuZGVzY3JpcHRpb24+IjsKKyAgICB9LAorICAgIDxAZXJyb3JNZXRob2QoKT4KKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKyAgICBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uOiBmdW5jdGlvbihzLCBpbnB1dCkgeworICAgICAgICB2YXIgX3MgPSBzOworICAgICAgICAvKiBiaW5kIHRvIHJlY29nbml6ZXIgc28gc2VtYW50aWMgcHJlZGljYXRlcyBjYW4gYmUgZXZhbHVhdGVkICovCisgICAgICAgIHZhciByZXR2YWwgPSAoZnVuY3Rpb24ocywgaW5wdXQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICA8ZGZhLnNwZWNpYWxTdGF0ZVNUczp7c3RhdGUgfAorICAgICAgICAgICAgY2FzZSA8aTA+IDogPCEgY29tcHJlc3NlZCBzcGVjaWFsIHN0YXRlIG51bWJlcnMgMC4ubi0xICE+CisgICAgICAgICAgICAgICAgPHN0YXRlPn07IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICAgICAgfQorICAgICAgICB9KS5jYWxsKHRoaXMucmVjb2duaXplciwgcywgaW5wdXQpOworICAgICAgICBpZiAoIW9yZy5hbnRsci5sYW5nLmlzVW5kZWZpbmVkKHJldHZhbCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKzxpZihiYWNrdHJhY2tpbmcpPgorICAgICAgICBpZiAodGhpcy5yZWNvZ25pemVyLnN0YXRlLmJhY2t0cmFja2luZz4wKSB7dGhpcy5yZWNvZ25pemVyLnN0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gLTE7fTxcbj4KKzxlbmRpZj4KKyAgICAgICAgdmFyIG52YWUgPQorICAgICAgICAgICAgbmV3IG9yZy5hbnRsci5ydW50aW1lLk5vVmlhYmxlQWx0RXhjZXB0aW9uKHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgPGRmYS5kZWNpc2lvbk51bWJlcj4sIF9zLCBpbnB1dCk7CisgICAgICAgIHRoaXMuZXJyb3IobnZhZSk7CisgICAgICAgIHRocm93IG52YWU7CisgICAgfSw8XG4+Cis8ZW5kaWY+CisgICAgZHVtbXk6IG51bGwKK30pOzxcbj4KKz4+CisKKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAordmFyIExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoMSk7PFxuPgorPGlmKHNlbVByZWRTdGF0ZSk+IDwhIGdldCBuZXh0IGxvb2thaGVhZCBzeW1ib2wgdG8gdGVzdCBlZGdlcywgdGhlbiByZXdpbmQgIT4KK3ZhciBpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LmluZGV4KCk7CitpbnB1dC5yZXdpbmQoKTs8XG4+Cis8ZW5kaWY+CitzID0gLTE7Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+Cis8aWYoc2VtUHJlZFN0YXRlKT4gPCEgcmV0dXJuIGlucHV0IGN1cnNvciB0byBzdGF0ZSBiZWZvcmUgd2UgcmV3b3VuZCAhPgoraW5wdXQuc2VlayhpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPik7PFxuPgorPGVuZGlmPgoraWYgKCBzPj0wICkgcmV0dXJuIHM7CiticmVhazsKKz4+CisKKy8qKiBKdXN0IGxpa2UgYSBmaXhlZCBERkEgZWRnZSwgdGVzdCB0aGUgbG9va2FoZWFkIGFuZCBpbmRpY2F0ZSB3aGF0CisgKiAgc3RhdGUgdG8ganVtcCB0byBuZXh0IGlmIHN1Y2Nlc3NmdWwuCisgKi8KK2N5Y2xpY0RGQUVkZ2UobGFiZWxFeHByLCB0YXJnZXRTdGF0ZU51bWJlciwgZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitpZiAoICg8bGFiZWxFeHByPikgPGlmKHByZWRpY2F0ZXMpPiYmICg8cHJlZGljYXRlcz4pPGVuZGlmPikge3MgPSA8dGFyZ2V0U3RhdGVOdW1iZXI+O308XG4+Cis+PgorCisvKiogQW4gZWRnZSBwb2ludGluZyBhdCBlbmQtb2YtdG9rZW47IGVzc2VudGlhbGx5IG1hdGNoZXMgYW55IGNoYXI7CisgKiAgYWx3YXlzIGp1bXAgdG8gdGhlIHRhcmdldC4KKyAqLworZW90REZBRWRnZSh0YXJnZXRTdGF0ZU51bWJlcixlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK3MgPSA8dGFyZ2V0U3RhdGVOdW1iZXI+Ozxcbj4KKz4+CisKKworLy8gRCBGIEEgIEUgWCBQIFIgRSBTIFMgSSBPIE4gUworCithbmRQcmVkaWNhdGVzKGxlZnQscmlnaHQpIDo6PSAiKDxsZWZ0PiYmPHJpZ2h0PikiCisKK29yUHJlZGljYXRlcyhvcGVyYW5kcykgOjo9ICIoPGZpcnN0KG9wZXJhbmRzKT48cmVzdChvcGVyYW5kcyk6e28gfCB8fDxvPn0+KSIKKworbm90UHJlZGljYXRlKHByZWQpIDo6PSAiISg8ZXZhbFByZWRpY2F0ZSguLi4pPikiCisKK2V2YWxQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICIoPHByZWQ+KSIKKworZXZhbFN5blByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gInRoaXMuPHByZWQ+KCkiCisKK2xvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICJMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPj09PGF0b20+IgorCisvKiogU29tZXRpbWVzIGEgbG9va2FoZWFkIHRlc3QgY2Fubm90IGFzc3VtZSB0aGF0IExBKGspIGlzIGluIGEgdGVtcCB2YXJpYWJsZQorICogIHNvbWV3aGVyZS4gIE11c3QgYXNrIGZvciB0aGUgbG9va2FoZWFkIGRpcmVjdGx5LgorICovCitpc29sYXRlZExvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICJ0aGlzLmlucHV0LkxBKDxrPik9PTxhdG9tPiIKKworbG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLHVwcGVyLGsscmFuZ2VOdW1iZXIsbG93ZXJBc0ludCx1cHBlckFzSW50KSA6Oj0gPDwKKyhMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPlw+PTxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj5cPD08dXBwZXI+KQorPj4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSAiKHRoaXMuaW5wdXQuTEEoPGs+KVw+PTxsb3dlcj4gJiYgdGhpcy5pbnB1dC5MQSg8az4pXDw9PHVwcGVyPikiCisKK3NldFRlc3QocmFuZ2VzKSA6Oj0gIjxyYW5nZXM7IHNlcGFyYXRvcj1cInx8XCI+IgorCisvLyBBIFQgVCBSIEkgQiBVIFQgRSBTCisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKzxzY29wZS5uYW1lPl9zdGFjazogW10sPFxuPgorPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKzxzY29wZS5uYW1lPl9zdGFjazogW10sPFxuPgorPGVuZGlmPgorPj4KKworcmV0dXJuU3RydWN0TmFtZSgpIDo6PSAiPGl0Lm5hbWU+X3JldHVybiIKKworcmV0dXJuVHlwZSgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxydWxlRGVzY3JpcHRvci5ncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPgorPGVsc2U+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuVHlwZT4KKzxlbHNlPgordm9pZAorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEdlbmVyYXRlIHRoZSBKYXZhIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIG9yIG11bHRpcGxlIHJldHVybgorICogIHZhbHVlcy4KKyAqLworcnVsZUxhYmVsVHlwZShyZWZlcmVuY2VkUnVsZSkgOjo9IDw8Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJlZmVyZW5jZWRSdWxlLmdyYW1tYXIucmVjb2duaXplck5hbWU+LjxyZWZlcmVuY2VkUnVsZS5uYW1lPl9yZXR1cm4KKzxlbHNlPgorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK2RlbGVnYXRlTmFtZSgpIDo6PSA8PAorPGlmKGl0LmxhYmVsKT48aXQubGFiZWw+PGVsc2U+ZzxpdC5uYW1lPjxlbmRpZj4KKz4+CisKKy8qKiBVc2luZyBhIHR5cGUgdG8gaW5pdCB2YWx1ZSBtYXAsIHRyeSB0byBpbml0IGEgdHlwZTsgaWYgbm90IGluIHRhYmxlCisgKiAgbXVzdCBiZSBhbiBvYmplY3QsIGRlZmF1bHQgdmFsdWUgaXMgIm51bGwiLgorICovCitpbml0VmFsdWUodHlwZU5hbWUpIDo6PSA8PAorbnVsbAorPj4KKworLyoqIERlZmluZSBhIHJ1bGUgbGFiZWwgaW5jbHVkaW5nIGRlZmF1bHQgdmFsdWUgKi8KK3J1bGVMYWJlbERlZihsYWJlbCkgOjo9IDw8Cis8ITxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKT4hPiB2YXIgPGxhYmVsLmxhYmVsLnRleHQ+ID0gPGluaXRWYWx1ZSh0eXBlTmFtZT1ydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKSk+OworPj4KKworLyoqIERlZmluZSBhIHJldHVybiBzdHJ1Y3QgZm9yIGEgcnVsZSBpZiB0aGUgY29kZSBuZWVkcyB0byBhY2Nlc3MgaXRzCisgKiAgc3RhcnQvc3RvcCB0b2tlbnMsIHRyZWUgc3R1ZmYsIGF0dHJpYnV0ZXMsIC4uLiAgTGVhdmUgYSBob2xlIGZvcgorICogIHN1Ymdyb3VwcyB0byBzdGljayBpbiBtZW1iZXJzLgorICovCityZXR1cm5TY29wZShzY29wZSkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorLy8gaW5saW5lIHN0YXRpYyByZXR1cm4gY2xhc3MKKzxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+OiAoZnVuY3Rpb24oKSB7CisgICAgPHJldHVyblR5cGUoKT4gPSBmdW5jdGlvbigpe307CisgICAgb3JnLmFudGxyLmxhbmcuZXh0ZW5kKDxyZXR1cm5UeXBlKCk+LAorICAgICAgICAgICAgICAgICAgICAgIG9yZy5hbnRsci5ydW50aW1lLjxpZihUUkVFX1BBUlNFUik+dHJlZS5UcmVlPGVsc2U+UGFyc2VyPGVuZGlmPlJ1bGVSZXR1cm5TY29wZSwKKyAgICB7CisgICAgICAgIDxAcnVsZVJldHVybk1lbWJlcnMoKT4KKyAgICB9KTsKKyAgICByZXR1cm47Cit9KSgpLAorPGVuZGlmPgorPj4KKworcGFyYW1ldGVyU2NvcGUoc2NvcGUpIDo6PSA8PAorPHNjb3BlLmF0dHJpYnV0ZXM6ezxpdC5kZWNsPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSAiPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+ID08ZXhwcj47IgorCitzY29wZUF0dHJpYnV0ZVJlZihzY29wZSxhdHRyLGluZGV4LG5lZ0luZGV4KSA6Oj0gPDwKKzxpZihuZWdJbmRleCk+CisodGhpcy48c2NvcGU+X3N0YWNrW3RoaXMuPHNjb3BlPl9zdGFjay5sZW5ndGgtPG5lZ0luZGV4Pi0xXSkuPGF0dHIubmFtZT4KKzxlbHNlPgorPGlmKGluZGV4KT4KKyh0aGlzLjxzY29wZT5fc3RhY2tbPGluZGV4Pl0pLjxhdHRyLm5hbWU+Cis8ZWxzZT4KK29yZy5hbnRsci5sYW5nLmFycmF5LnBlZWsodGhpcy48c2NvcGU+X3N0YWNrKS48YXR0ci5uYW1lPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworc2NvcGVTZXRBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixleHByLGluZGV4LG5lZ0luZGV4KSA6Oj0gPDwKKzxpZihuZWdJbmRleCk+CisodGhpcy48c2NvcGU+X3N0YWNrW3RoaXMuPHNjb3BlPl9zdGFjay5sZW5ndGgtPG5lZ0luZGV4Pi0xXSkuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPGlmKGluZGV4KT4KKyh0aGlzLjxzY29wZT5fc3RhY2tbPGluZGV4Pl0pLjxhdHRyLm5hbWU+ID08ZXhwcj47Cis8ZWxzZT4KK29yZy5hbnRsci5sYW5nLmFycmF5LnBlZWsodGhpcy48c2NvcGU+X3N0YWNrKS48YXR0ci5uYW1lPiA9PGV4cHI+OworPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsgcmVmZXJzCisgKiAgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJlZGljYXRlcworICogIGxpa2UgeyRmdW5jdGlvbi5zaXplKCk+MCAmJiAkZnVuY3Rpb246Om5hbWUuZXF1YWxzKCJmb28iKX0/CisgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gInRoaXMuPHNjb3BlPl9zdGFjayIKKworLyoqIHJlZmVyZW5jZSBhbiBhdHRyaWJ1dGUgb2YgcnVsZTsgbWlnaHQgb25seSBoYXZlIHNpbmdsZSByZXR1cm4gdmFsdWUgKi8KK3J1bGVMYWJlbFJlZihyZWZlcmVuY2VkUnVsZSxzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihyZWZlcmVuY2VkUnVsZS5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CisoPHNjb3BlPiE9PW51bGw/PHNjb3BlPi48YXR0ci5uYW1lPjo8aW5pdFZhbHVlKGF0dHIudHlwZSk+KQorPGVsc2U+Cis8c2NvcGU+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cikgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKzxhdHRyLm5hbWU+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5TZXRBdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cixleHByKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CityZXR2YWwuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbHNlPgorPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdHJhbnNsYXRlICR0b2tlbkxhYmVsICovCit0b2tlbkxhYmVsUmVmKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0XzxsYWJlbD4iCisKKworLy8gbm90IHN1cmUgdGhlIG5leHQgYXJlIHRoZSByaWdodCBhcHByb2FjaAorCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+PzxzY29wZT4uZ2V0VGV4dCgpOm51bGwpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPj88c2NvcGU+LmdldFR5cGUoKTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi5nZXRMaW5lKCk6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi5nZXRDaGFubmVsKCk6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPj88c2NvcGU+LmdldFRva2VuSW5kZXgoKTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPl90cmVlIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+P3BhcnNlSW50KDxzY29wZT4uZ2V0VGV4dCgpLCAxMCk6MCkiCisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi5zdGFydDpudWxsKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPj88c2NvcGU+LnN0b3A6bnVsbCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi50cmVlOm51bGwpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CisoPHNjb3BlPj8odGhpcy5pbnB1dC5nZXRUb2tlblN0cmVhbSgpLnRvU3RyaW5nKAorICB0aGlzLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KDxzY29wZT4uc3RhcnQpLAorICB0aGlzLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgoPHNjb3BlPi5zdGFydCkpKTpudWxsKQorPGVsc2U+CisoPHNjb3BlPj90aGlzLmlucHV0LnRvU3RyaW5nKDxzY29wZT4uc3RhcnQsPHNjb3BlPi5zdG9wKTpudWxsKQorPGVuZGlmPgorPj4KKworcnVsZUxhYmVsUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LnN0IgorCisvKiogSXNvbGF0ZWQgJFJVTEUgcmVmIG9rIGluIGxleGVyIGFzIGl0J3MgYSBUb2tlbiAqLworbGV4ZXJSdWxlTGFiZWwobGFiZWwpIDo6PSAiPGxhYmVsPiIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi5nZXRUeXBlKCk6MCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPj88c2NvcGU+LmdldExpbmUoKTowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4/PHNjb3BlPi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTotMSkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPj88c2NvcGU+LmdldENoYW5uZWwoKTowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPj88c2NvcGU+LmdldFRva2VuSW5kZXgoKTowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIig8c2NvcGU+PzxzY29wZT4uZ2V0VGV4dCgpOjApIgorCisvLyBTb21lYm9keSBtYXkgcmVmICR0ZW1wbGF0ZSBvciAkdHJlZSBvciAkc3RvcCB3aXRoaW4gYSBydWxlOgorcnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKHJldHZhbC5zdGFydCkiCitydWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihyZXR2YWwuc3RvcCkiCitydWxlUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIihyZXR2YWwudHJlZSkiCitydWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+Cit0aGlzLmlucHV0LmdldFRva2VuU3RyZWFtKCkudG9TdHJpbmcoCisgIHRoaXMuaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0YXJ0SW5kZXgocmV0dmFsLnN0YXJ0KSwKKyAgdGhpcy5pbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFRva2VuU3RvcEluZGV4KHJldHZhbC5zdGFydCkpCis8ZWxzZT4KK3RoaXMuaW5wdXQudG9TdHJpbmcocmV0dmFsLnN0YXJ0LHRoaXMuaW5wdXQuTFQoLTEpKQorPGVuZGlmPgorPj4KK3J1bGVQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5zdCIKKworbGV4ZXJSdWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gInRoaXMuZ2V0VGV4dCgpIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIl90eXBlIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gInRoaXMuc3RhdGUudG9rZW5TdGFydExpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICJ0aGlzLnN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIi0xIiAvLyB1bmRlZmluZWQgdG9rZW4gaW5kZXggaW4gbGV4ZXIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICJfY2hhbm5lbCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAidGhpcy5zdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIih0aGlzLmdldENoYXJJbmRleCgpLTEpIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAicGFyc2VJbnQoPHNjb3BlPi5nZXRUZXh0KCksMTApIgorCisvLyBzZXR0aW5nICRzdCBhbmQgJHRyZWUgaXMgYWxsb3dlZCBpbiBsb2NhbCBydWxlLiBldmVyeXRoaW5nIGVsc2UKKy8vIGlzIGZsYWdnZWQgYXMgZXJyb3IKK3J1bGVTZXRQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwudHJlZSA9PGV4cHI+OyIKK3J1bGVTZXRQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyLGV4cHIpIDo6PSAicmV0dmFsLnN0ID08ZXhwcj47IgorCisKKy8qKiBIb3cgdG8gZXhlY3V0ZSBhbiBhY3Rpb24gKi8KK2V4ZWNBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHsKKyAgPGFjdGlvbj4KK30KKzxlbHNlPgorPGFjdGlvbj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gYWx3YXlzIGV4ZWN1dGUgYW4gYWN0aW9uIGV2ZW4gd2hlbiBiYWNrdHJhY2tpbmcgKi8KK2V4ZWNGb3JjZWRBY3Rpb24oYWN0aW9uKSA6Oj0gIjxhY3Rpb24+IgorCisvLyBNIEkgUyBDIChwcm9wZXJ0aWVzLCBldGMuLi4pCisKK2JpdHNldChuYW1lLCB3b3JkczY0KSA6Oj0gPDwKKzwhIEB0b2RvIG92ZXJmbG93IGlzc3VlICE+Cis8bmFtZT46IG5ldyBvcmcuYW50bHIucnVudGltZS5CaXRTZXQoWzx3b3JkczY0Ons8aXQ+fTtzZXBhcmF0b3I9IiwiPl0pCis+PgorCitjb2RlRmlsZUV4dGVuc2lvbigpIDo6PSAiLmpzIgorCit0cnVlKCkgOjo9ICJ0cnVlIgorZmFsc2UoKSA6Oj0gImZhbHNlIgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9MZWZ0UmVjdXJzaXZlUnVsZXMuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9MZWZ0UmVjdXJzaXZlUnVsZXMuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWIxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL0xlZnRSZWN1cnNpdmVSdWxlcy5zdGcKQEAgLTAsMCArMSw4MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogSG93IHRvIGdlbmVyYXRlIHJ1bGVzIGRlcml2ZWQgZnJvbSBsZWZ0LXJlY3Vyc2l2ZSBydWxlcy4KKyAqICBUaGVzZSByZWx5IG9uIHJlY1J1bGVEZWZBcmcoKSwgcmVjUnVsZUFsdFByZWRpY2F0ZSgpLAorICogIHJlY1J1bGVBcmcoKSwgcmVjUnVsZVNldFJlc3VsdEFjdGlvbigpLCByZWNSdWxlU2V0UmV0dXJuQWN0aW9uKCkKKyAqICB0ZW1wbGF0ZXMgaW4gbWFpbiBsYW5ndWFnZS5zdGcKKyAqLworZ3JvdXAgTGVmdFJlY3Vyc2l2ZVJ1bGVzOworCityZWNSdWxlTmFtZShydWxlTmFtZSkgOjo9ICI8cnVsZU5hbWU+XyIKK3JlY1ByaW1hcnlOYW1lKHJ1bGVOYW1lKSA6Oj0gIjxydWxlTmFtZT5fcHJpbWFyeSIKKworcmVjUnVsZVN0YXJ0KHJ1bGVOYW1lLCBtaW5QcmVjLCB1c2VyUmV0dmFscywgdXNlclJldHZhbEFzc2lnbm1lbnRzKSA6Oj0gPDwKKzxydWxlTmFtZT48aWYodXNlclJldHZhbHMpPiByZXR1cm5zIFs8dXNlclJldHZhbHM+XTxlbmRpZj4KKyAgOiA8cmVjUnVsZU5hbWUoLi4uKT5bPG1pblByZWM+XQorICAgIDxpZih1c2VyUmV0dmFscyk+CisgICAgeworICAgICAgICA8dXNlclJldHZhbEFzc2lnbm1lbnRzOyBzZXBhcmF0b3I9IlxuIj4KKyAgICB9CisgICAgPGVuZGlmPgorICA7Cis+PgorCityZWNSdWxlKHJ1bGVOYW1lLCBwcmVjQXJnRGVmLCBhcmdOYW1lLCBhbHRzLCBzZXRSZXN1bHRBY3Rpb24sIGJ1aWxkQVNULAorICAgICAgICB1c2VyUmV0dmFscywgdXNlclJldHZhbEFzc2lnbm1lbnRzKSA6Oj0gPDwKKzxyZWNSdWxlTmFtZSguLi4pPls8cHJlY0FyZ0RlZj5dPGlmKHVzZXJSZXR2YWxzKT4gcmV0dXJucyBbPHVzZXJSZXR2YWxzPl08ZW5kaWY+CisgICAgOiAgIDxyZWNQcmltYXJ5TmFtZSguLi4pPgorICAgICAgICA8aWYoYnVpbGRBU1QpPgorICAgICAgICB7CisgICAgICAgICAgICA8c2V0UmVzdWx0QWN0aW9uPgorICAgICAgICB9CisgICAgICAgIDxlbmRpZj4KKyAgICAgICAgPGlmKHVzZXJSZXR2YWxzKT4KKyAgICAgICAgeworICAgICAgICAgICAgPHVzZXJSZXR2YWxBc3NpZ25tZW50czsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIH0KKyAgICAgICAgPGVuZGlmPgorICAgICAgICAoIG9wdGlvbnMge2JhY2t0cmFjaz1mYWxzZTt9CisgICAgICAgIDogKCBvcHRpb25zIHtiYWNrdHJhY2s9ZmFsc2U7fQorICAgICAgICAgIDogPGFsdHM7IHNlcGFyYXRvcj0iXG4gICAgICAgICAgfCAiPgorICAgICAgICAgICkKKyAgICAgICAgKSoKKyAgICA7Cis+PgorCityZWNQcmltYXJ5UnVsZShydWxlTmFtZSwgYWx0cywgdXNlclJldHZhbHMpIDo6PSA8PAorPHJlY1ByaW1hcnlOYW1lKC4uLik+PGlmKHVzZXJSZXR2YWxzKT4gcmV0dXJucyBbPHVzZXJSZXR2YWxzPl08ZW5kaWY+CitvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9CisgICAgOiA8YWx0czsgc2VwYXJhdG9yPSJcbiAgICB8ICI+CisgICAgOworPj4KKworcmVjUnVsZUFsdChhbHQsIHByZWQpIDo6PSAiezxwcmVkPn0/PT4gPGFsdD4iCisKK3JlY1J1bGVSZWYocnVsZU5hbWUsIGFyZykgOjo9ICI8cmVjUnVsZU5hbWUoLi4uKT5bPGFyZz5dIgorCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9BU1Quc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTIxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNULnN0ZwpAQCAtMCwwICsxLDU2MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworQGdlbmVyaWNQYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMoKSA6Oj0gPDwKKy8qIEFTVCBwYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMgKi8KK05TSW50ZWdlciBydWxlTGV2ZWw7CitOU0FycmF5ICpydWxlTmFtZXM7Cis8QHN1cGVyLm1lbVZhcnMoKT4gIC8qIEFTVCBzdXBlci5tZW1WYXJzICovCis8cGFyc2VyTWVtVmFycygpPiAgIC8qIEFTVCBwYXJzZXJNZW1WYXJzICovCis+PgorCitAZ2VuZXJpY1BhcnNlckhlYWRlckZpbGUucHJvcGVydGllcygpIDo6PSA8PAorLyogQVNUIHBhcnNlckhlYWRlckZpbGUucHJvcGVydGllcyAqLworPEBzdXBlci5wcm9wZXJ0aWVzKCk+ICAvKiBBU1Qgc3VwZXIucHJvcGVydGllcyAqLworPHBhcnNlclByb3BlcnRpZXMoKT4gICAvKiBBU1QgcGFyc2VycHJvcGVydGllcyAqLworPj4KKworQGdlbmVyaWNQYXJzZXJIZWFkZXJGaWxlLm1ldGhvZHNEZWNsKCkgOjo9IDw8CisvKiBBU1QgcGFyc2VySGVhZGVyRmlsZS5tZXRob2RzRGVjbCAqLworPEBzdXBlci5tZXRob2RzRGVjbCgpPiAgLyogQVNUIHN1cGVyLm1ldGhvZHNEZWNsICovCis8cGFyc2VyTWV0aG9kc0RlY2woKT4gICAvKiBBU1QgcGFyc2VybWV0aG9kc0RlY2wgKi8KKz4+CisKK0BnZW5lcmljUGFyc2VyLnN5bnRoZXNpemUoKSA6Oj0gPDwKKy8qIEFTVCBnZW5lcmljUGFyc2VyLnN5bnRoZXNpemUgKi8KKzxAc3VwZXIuc3ludGhlc2l6ZSgpPgorPHBhcnNlclN5bnRoZXNpemUoKT4KKz4+CisKK0BnZW5lcmljUGFyc2VyLm1ldGhvZHMoKSA6Oj0gPDwKKy8qIEFTVCBnZW5lcmljUGFyc2VyLm1ldGhvZHMgKi8KKzxAc3VwZXIubWV0aG9kcygpPgorPHBhcnNlck1ldGhvZHMoKT4KKz4+CisKKy8qIGFkZGl0aW9uYWwgaW5pdCBjb2RlIGZvciB0cmVlIHN1cHBvcnQgKi8KK0BnZW5lcmljUGFyc2VyLmluaXQoKSA6Oj0gPDwKKy8qIEFTVCBnZW5lcmljUGFyc2VyLmluaXQgKi8KKzxAc3VwZXIuaW5pdCgpPgorW3NlbGYgc2V0VHJlZUFkYXB0b3I6W1tBTlRMUkNvbW1vblRyZWVBZGFwdG9yIG5ld1RyZWVBZGFwdG9yXSByZXRhaW5dXTsKKz4+CisKK0BnZW5lcmljUGFyc2VyLmRlYWxsb2MoKSA6Oj0gPDwKKy8qIEFTVCBnZW5lcmljUGFyc2VyLmRlYWxsb2MgKi8KK1tzZWxmIHNldFRyZWVBZGFwdG9yOm5pbF07Cis8QHN1cGVyLmRlYWxsb2MoKT4KKz4+CisKKy8qIEFkZCBhbiBhZGFwdG9yIHByb3BlcnR5IHRoYXQga25vd3MgaG93IHRvIGJ1aWxkIHRyZWVzICovCitwYXJzZXJNZW1WYXJzKCkgOjo9IDw8CisvKiBBU1QgcGFyc2VyTWVtVmFycyAqLworaWRcPEFOVExSVHJlZUFkYXB0b3I+IHRyZWVBZGFwdG9yOworPj4KKworLyogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK3BhcnNlclByb3BlcnRpZXMoKSA6Oj0gPDwKKy8qIEFTVCBwYXJzZXJQcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRyZWVBZGFwdG9yLCBzZXR0ZXI9c2V0VHJlZUFkYXB0b3I6KSBpZFw8QU5UTFJUcmVlQWRhcHRvcj4gdHJlZUFkYXB0b3I7Cis+PgorCisvKiogRGVjbGFyYXRpb24gb2YgYWRkaXRpb25hbCB0cmVlIHN1cHBvcnQgbWV0aG9kcyAtIGdvIGluIGludGVyZmFjZSBvZiBwYXJzZXJIZWFkZXJGaWxlKCkgKi8KK3BhcnNlck1ldGhvZHNEZWNsKCkgOjo9IDw8CisvKiBBU1QgcGFyc2VyTWV0aG9kc0RlY2wgKi8KKy0gKGlkXDxBTlRMUlRyZWVBZGFwdG9yPikgZ2V0VHJlZUFkYXB0b3I7CistICh2b2lkKSBzZXRUcmVlQWRhcHRvcjooaWRcPEFOVExSVHJlZUFkYXB0b3I+KXRoZVRyZWVBZGFwdG9yOworPj4KKworLyogQWRkIGFuIGFkYXB0b3IgcHJvcGVydHkgdGhhdCBrbm93cyBob3cgdG8gYnVpbGQgdHJlZXMgKi8KK3BhcnNlclN5bnRoZXNpemUoKSA6Oj0gPDwKKy8qIEFTVCBwYXJzZXJQcm9wZXJ0aWVzICovCitAc3ludGhlc2l6ZSB0cmVlQWRhcHRvcjsKKz4+CisKKy8qKiBEZWZpbml0aW9uIG9mIGFkZGl0aW9uIHRyZWUgc3VwcG9ydCBtZXRob2RzIC0gZ28gaW4gaW1wbGVtZW50YXRpb24gb2YgZ2VuZXJpY1BhcnNlcigpICovCitwYXJzZXJNZXRob2RzKCkgOjo9IDw8CisvKiBBU1QgcGFyc2VyTWV0aG9kcyAqLworLSAoaWRcPEFOVExSVHJlZUFkYXB0b3I+KSBnZXRUcmVlQWRhcHRvcgoreworCXJldHVybiB0cmVlQWRhcHRvcjsKK30KKworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KGlkXDxBTlRMUlRyZWVBZGFwdG9yPilhVHJlZUFkYXB0b3IKK3sKKwlpZiAoYVRyZWVBZGFwdG9yICE9IHRyZWVBZGFwdG9yKSB7CisJCXRyZWVBZGFwdG9yID0gYVRyZWVBZGFwdG9yOworCX0KK30KKz4+CisKKy8qKiBhZGRpdGlvbiBtZW1WYXJzIGZvciByZXR1cm5zY29wZXMgKi8KK0ByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzKCkgOjo9IDw8CisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycyAqLworPHJlY29nbml6ZXIuQVNUTGFiZWxUeXBlOyBudWxsPSJBTlRMUkNvbW1vblRyZWUiPiAqdHJlZTsKKz4+CisKKy8qKiB0aGUgaW50ZXJmYWNlIG9mIHJldHVyblNjb3BlIHByb3BlcnRpZXMgKi8KK0ByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzKCkgOjo9IDw8CisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcyAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUcmVlLCBzZXR0ZXI9c2V0VHJlZTopIDxyZWNvZ25pemVyLkFTVExhYmVsVHlwZTsgbnVsbD0iQU5UTFJDb21tb25UcmVlIj4gKnRyZWU7Cis+PgorCisvKiogdGhlIGludGVyZmFjZSBvZiByZXR1cm5TY29wZSBtZXRob2RzRGVjbCAqLworQHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsKCkgOjo9IDw8CisvKiBBU1QgcmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kc0RlY2wgKi8KKy0gKDxyZWNvZ25pemVyLkFTVExhYmVsVHlwZTsgbnVsbD0iQU5UTFJDb21tb25UcmVlIj4gKilnZXRUcmVlOzxcbj4KKy0gKHZvaWQpIHNldFRyZWU6KDxyZWNvZ25pemVyLkFTVExhYmVsVHlwZTsgbnVsbD0iQU5UTFJDb21tb25UcmVlIj4gKilhVHJlZTs8XG4+Cis+PgorCisvKiogdGhlIGltcGxlbWVudGF0aW9uIG9mIHJldHVyblNjb3BlIHN5bnRoZXNpemUgKi8KK0ByZXR1cm5TY29wZUltcGxlbWVudGF0aW9uLnN5bnRoZXNpemUoKSA6Oj0gPDwKKy8qIEFTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0cmVlOworPj4KKworLyoqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiByZXR1cm5TY29wZSBtZXRob2RzICovCitAcmV0dXJuU2NvcGVJbXBsZW1lbnRhdGlvbi5tZXRob2RzKCkgOjo9IDw8CisvKiBBU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoPEFTVExhYmVsVHlwZT4gKilnZXRUcmVlCit7CisgICAgcmV0dXJuIHRyZWU7Cit9CisKKy0gKHZvaWQpIHNldFRyZWU6KDxBU1RMYWJlbFR5cGU+ICopYVRyZWUKK3sKKyAgICBpZiAodHJlZSAhPSBhVHJlZSkgeworICAgICAgICBpZiAoIHRyZWUgKSBbdHJlZSByZWxlYXNlXTsKKyAgICAgICAgaWYgKCBhVHJlZSApIFthVHJlZSByZXRhaW5dOworICAgICAgICB0cmVlID0gYVRyZWU7CisgICAgfQorfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgc2VsZi50cmVlID0gbmlsOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworPj4KKworLyoqIEFkZCBhIHZhcmlhYmxlIHRvIHRyYWNrIHJ1bGUncyByZXR1cm4gQVNUICovCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8CisvKiBBU1QgcnVsZURlY2xhcmF0aW9ucyAqLworPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KKzxBU1RMYWJlbFR5cGU+ICpyb290XzAgPSBuaWw7PFxuPgorPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorLyogQVNUIHJ1bGVMYWJlbERlZnMgKi8KKzxzdXBlci5ydWxlTGFiZWxEZWZzKCk+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscywKKyAgcnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGlzdExhYmVsc106e2l0IHwgPEFTVExhYmVsVHlwZT4gKjxpdC5sYWJlbC50ZXh0Pl90cmVlPW5pbDt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHM6e2l0IHwgPEFTVExhYmVsVHlwZT4gKjxpdC5sYWJlbC50ZXh0Pl90cmVlID0gbmlsO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLmFsbFRva2VuUmVmc0luQWx0c1dpdGhSZXdyaXRlczp7aXQgfCBBTlRMUlJld3JpdGVSdWxlVG9rZW5TdHJlYW0gKnN0cmVhbV88aXQ+ID0KKyAgICBbW0FOVExSUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJ0b2tlbiA8aXQ+Il0gcmV0YWluXTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlczp7aXQgfCBBTlRMUlJld3JpdGVSdWxlU3VidHJlZVN0cmVhbSAqc3RyZWFtXzxpdD4gPQorICAgIFtbQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW06dHJlZUFkYXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246QCJydWxlIDxpdD4iXSByZXRhaW5dO307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKy8qIEFTVCBydWxlQ2xlYW5VcCAqLworPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8W3J1bGVEZXNjcmlwdG9yLmFsbFRva2VuUmVmc0luQWx0c1dpdGhSZXdyaXRlcyxydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlc106e2l0IHwgW3N0cmVhbV88aXQ+IHJlbGVhc2VdO307IHNlcGFyYXRvcj0iXG4iPgorPCEKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIHN0YXRlLmJhY2t0cmFja2luZyA9PSAwICkgezxcbj4KKzxlbmRpZj4KKyAgICBbPHByZXZSdWxlUm9vdFJlZigpPiBzZXRUcmVlOig8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXV07PFxuPgorICAgIFt0cmVlQWRhcHRvciBzZXRUb2tlbkJvdW5kYXJpZXM6WzxwcmV2UnVsZVJvb3RSZWYoKT4gZ2V0VHJlZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9tOls8cHJldlJ1bGVSb290UmVmKCk+IGdldFN0YXJ0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG86WzxwcmV2UnVsZVJvb3RSZWYoKT4gZ2V0U3RvcF1dOzxcbj4KKzxpZihiYWNrdHJhY2tpbmcpPn08XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Citbcm9vdF8wIHJlbGVhc2VdOworIT4KKz4+CisKK3Jld3JpdGVDb2RlTGFiZWxzQ2xlYW5VcCgpIDo6PSA8PAorLyogQVNUIHJld3JpdGVDb2RlTGFiZWxzQ2xlYW5VcCAqLworIDxyZWZlcmVuY2VkVG9rZW5MYWJlbHM6e2l0IHwgW3N0cmVhbV88aXQ+IHJlbGVhc2VdO307IHNlcGFyYXRvcj0iXG4iPgorIDxyZWZlcmVuY2VkVG9rZW5MaXN0TGFiZWxzOntpdCB8IFtzdHJlYW1fPGl0PiByZWxlYXNlXTt9OyBzZXBhcmF0b3I9IlxuIj4KKyA8cmVmZXJlbmNlZFJ1bGVMYWJlbHM6e2l0IHwgW3N0cmVhbV88aXQ+IHJlbGVhc2VdO307IHNlcGFyYXRvcj0iXG4iPgorIDxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHM6e2l0IHwgW3N0cmVhbV88aXQ+IHJlbGVhc2VdO307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworLyoqIFdoZW4gZG9pbmcgYXV0byBBU1QgY29uc3RydWN0aW9uLCB3ZSBtdXN0IGRlZmluZSBzb21lIHZhcmlhYmxlczsKKyAqICBUaGVzZSBzaG91bGQgYmUgdHVybmVkIG9mZiBpZiBkb2luZyByZXdyaXRlcy4gIFRoaXMgbXVzdCBiZSBhICJtb2RlIgorICogIGFzIGEgcnVsZSBjb3VsZCBoYXZlIGJvdGggcmV3cml0ZSBhbmQgQVNUIHdpdGhpbiB0aGUgc2FtZSBhbHRlcm5hdGl2ZQorICogIGJsb2NrLgorICovCitAYWx0LmRlY2xhcmF0aW9ucygpIDo6PSA8PAorPGlmKGF1dG9BU1QpPgorPGlmKG91dGVyQWx0KT4KKzxpZighcmV3cml0ZU1vZGUpPgorcm9vdF8wID0gKDxBU1RMYWJlbFR5cGU+ICopW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvLyBUIHIgYSBjIGsgaSBuIGcgIFIgdSBsIGUgIEUgbCBlIG0gZSBuIHQgcworCisvKiogSUQgYW5kIHRyYWNrIGl0IGZvciB1c2UgaW4gYSByZXdyaXRlIHJ1bGUgKi8KK3Rva2VuUmVmVHJhY2sodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzwhIDxzdXBlci50b2tlblJlZiguLi4pPiAhPgorPHRva2VuUmVmQmFuZyguLi4pPiA8ISBUcmFjayBpbXBsaWVzIG5vIGF1dG8gQVNUIGNvbnN0cnVjdGlvbiE+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+CisgICAgW3N0cmVhbV88dG9rZW4+IGFkZEVsZW1lbnQ6PGxhYmVsPl07PFxuPgorPj4KKworLyoqIGlkcys9SUQgYW5kIHRyYWNrIGl0IGZvciB1c2UgaW4gYSByZXdyaXRlIHJ1bGU7IGFkZHMgdG8gaWRzICphbmQqCisgKiAgdG8gdGhlIHRyYWNraW5nIGxpc3Qgc3RyZWFtX0lEIGZvciB1c2UgaW4gdGhlIHJld3JpdGUuCisgKi8KK3Rva2VuUmVmVHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx0b2tlblJlZlRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBeKElEIC4uLikgdHJhY2sgZm9yIHJld3JpdGUgKi8KK3Rva2VuUmVmUnVsZVJvb3RUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPCEgPHN1cGVyLnRva2VuUmVmKC4uLik+ICE+Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggITxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgPGVuZGlmPgorICAgIFtzdHJlYW1fPHRva2VuPiBhZGRFbGVtZW50OjxsYWJlbD5dOzxcbj4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290VHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+Citbc3RyZWFtXzxydWxlLm5hbWU+IGFkZEVsZW1lbnQ6WzxsYWJlbD4gZ2V0VHJlZV1dOworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZUcmFjayguLi4pPgorPGxpc3RMYWJlbChlbGVtPXtbPGxhYmVsPiBnZXRUcmVlXX0sLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzwhIDxzdXBlci5ydWxlUmVmUnVsZVJvb3QoLi4uKT4gIT4KKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSA8ZW5kaWY+CisgICAgW3N0cmVhbV88cnVsZS5uYW1lPiBhZGRFbGVtZW50Ols8bGFiZWw+IGdldFRyZWVdXTs8XG4+Cis+PgorCisvKiogXih4Kz1ydWxlIC4uLikgcmV3cml0ZSAqLworcnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290VHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT17WzxsYWJlbD4gZ2V0VHJlZV19LC4uLik+Cis+PgorCisvLyBSIGUgdyByIGkgdCBlCisKK3Jld3JpdGVDb2RlKAorCWFsdHMsIGRlc2NyaXB0aW9uLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIEFMTCByZWZlcmVuY2VkIGVsZW1lbnRzIHRvIHJpZ2h0IG9mIC0+CisJcmVmZXJlbmNlZFRva2VuTGFiZWxzLAorCXJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHMsCisJcmVmZXJlbmNlZFJ1bGVMYWJlbHMsCisJcmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzLAorCXJlZmVyZW5jZWRXaWxkY2FyZExhYmVscywKKwlyZWZlcmVuY2VkV2lsZGNhcmRMaXN0TGFiZWxzLAorCXJld3JpdGVCbG9ja0xldmVsLCBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9Cis8PAorCisvLyBBU1QgUkVXUklURQorLy8gZWxlbWVudHM6IDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxhYmVsczogPHJlZmVyZW5jZWRSdWxlTGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHRva2VuIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisvLyBydWxlIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKy8vIHdpbGRjYXJkIGxhYmVsczogPFtyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMscmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVsc107IHNlcGFyYXRvcj0iLCAiPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxcbj4KKzxlbmRpZj4KKzxwcmV2UnVsZVJvb3RSZWYoKT4udHJlZSA9IHJvb3RfMDs8XG4+Cis8cmV3cml0ZUNvZGVMYWJlbHMoKT4KK3Jvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPiAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07PFxuPgorPGFsdHM6cmV3cml0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKzwhIGlmIHRyZWUgcGFyc2VyIGFuZCByZXdyaXRlPXRydWUgIT4KKzxpZihUUkVFX1BBUlNFUik+Cis8aWYocmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gKDxBU1RMYWJlbFR5cGU+KVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKK1tpbnB1dCByZXBsYWNlQ2hpbGRyZW46W3RyZWVBZGFwdG9yIGdldFBhcmVudDpyZXR2YWwuc3RhcnRdCisgICAgICAgICAgICAgICAgICBGcm9tOlt0cmVlQWRhcHRvciBnZXRDaGlsZEluZGV4OnJldHZhbC5zdGFydF0KKyAgICAgICAgICAgICAgICAgICAgVG86W3RyZWVBZGFwdG9yIGdldENoaWxkSW5kZXg6X2xhc3RdCisgICAgICAgICAgICAgICAgICBXaXRoOnJldHZhbC50cmVlXTsKKzxlbmRpZj4KKzxlbmRpZj4KKzwhIGlmIHBhcnNlciBvciB0cmVlLXBhcnNlciAmJiByZXdyaXRlIT10cnVlLCB3ZSBuZWVkIHRvIHNldCByZXN1bHQgIT4KKzxpZighVFJFRV9QQVJTRVIpPgorPHByZXZSdWxlUm9vdFJlZigpPi50cmVlID0gcm9vdF8wOzxcbj4KKzxlbHNlPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzA7PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+Cit9Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlQ29kZUxhYmVscygpIDo6PSA8PAorPHJlZmVyZW5jZWRUb2tlbkxhYmVscworICAgIDp7aXQgfCBBTlRMUlJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW0gKnN0cmVhbV88aXQ+ID0KKyAgICBbW0FOVExSUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbSBuZXdBTlRMUlJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW06dHJlZUFkYXB0b3IgZGVzY3JpcHRpb246QCJ0b2tlbiA8aXQ+IiBlbGVtZW50OjxpdD5dIHJldGFpbl07fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHM6e2l0IHwgQU5UTFJSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtICpzdHJlYW1fPGl0PiA9CisgICAgW1tBTlRMUlJld3JpdGVSdWxlPHJld3JpdGVFbGVtZW50VHlwZT5TdHJlYW0gbmV3QU5UTFJSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gPGl0PiIgZWxlbWVudHM6bGlzdF88aXQ+XSByZXRhaW5dO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHM6e2l0IHwgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+ID0KKyAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgIGRlc2NyaXB0aW9uOiJ3aWxkY2FyZCA8aXQ+IiBlbGVtZW50OjxpdD5dIHJldGFpbl07fTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHM6e2l0IHwgUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIHN0cmVhbV88aXQ+ID0KKyAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgIGRlc2NyaXB0b3I6IndpbGRjYXJkIDxpdD4iIGVsZW1lbnRzOmxpc3RfPGl0Pl0gcmV0YWluXTt9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMYWJlbHM6e2l0IHwgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV88aXQ+ID0KKyAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gPGl0PiIgZWxlbWVudDo8aXQ+IT1uaWw/WzxpdD4gZ2V0VHJlZV06bmlsXSByZXRhaW5dO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHM6e2l0IHwgQU5UTFJSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0gKnN0cmVhbV88aXQ+ID0KKyAgICBbW0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtIG5ld0FOVExSUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtOnRyZWVBZGFwdG9yCisgICAgICAgIGRlc2NyaXB0aW9uOkAidG9rZW4gPGl0PiIgZWxlbWVudHM6bGlzdF88aXQ+XSByZXRhaW5dO307CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKz4+CisKKy8qKiBHZW5lcmF0ZSBjb2RlIGZvciBhbiBvcHRpb25hbCByZXdyaXRlIGJsb2NrOyBub3RlIGl0IHVzZXMgdGhlIGRlZXAgcmVmJ2QgZWxlbWVudAorICAqICBsaXN0IHJhdGhlciBzaGFsbG93IGxpa2Ugb3RoZXIgYmxvY2tzLgorICAqLworcmV3cml0ZU9wdGlvbmFsQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitpZiAoIDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IFtzdHJlYW1fPGVsPiBoYXNOZXh0XX07IHNlcGFyYXRvcj0ifHwiPiApIHsKKwk8YWx0PgorfQorPHJlZmVyZW5jZWRFbGVtZW50c0RlZXA6e2VsIHwgW3N0cmVhbV88ZWw+IHJlc2V0XTs8XG4+fT4KKz4+CisKK3Jld3JpdGVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit3aGlsZSAoIDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgW3N0cmVhbV88ZWw+IGhhc05leHRdfTsgc2VwYXJhdG9yPSJ8fCI+ICkgeworICAgIDxhbHQ+Cit9Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IFtzdHJlYW1fPGVsPiByZXNldF07PFxuPn0+Cis+PgorCityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisJYWx0LHJld3JpdGVCbG9ja0xldmVsLAorCXJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworCXJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKwlkZXNjcmlwdGlvbikgOjo9Cis8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cit7CitpZiAoICEoPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBbc3RyZWFtXzxlbD4gaGFzTmV4dF19OyBzZXBhcmF0b3I9IiB8fCAiPikgKSB7CisgICAgQHRocm93IFtBTlRMUlJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24gbmV3RXhjZXB0aW9uXTsKK30KK3doaWxlICggPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBbc3RyZWFtXzxlbD4gaGFzTmV4dF19OyBzZXBhcmF0b3I9IiB8fCAiPiApIHsKKyAgICA8YWx0PgorfQorPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBbc3RyZWFtXzxlbD4gcmVzZXRdOzxcbj59PgorfQorPj4KKworcmV3cml0ZUFsdChhKSA6Oj0gPDwKKy8vIDxhLmRlc2NyaXB0aW9uPgorPGlmKGEucHJlZCk+CitpZiAoPGEucHJlZD4pIHsKKyAgICA8YS5hbHQ+Cit9PFxuPgorPGVsc2U+Cit7CisgICAgPGEuYWx0PgorfTxcbj4KKzxlbmRpZj4KKz4+CisKKy8qKiBGb3IgZW1wdHkgcmV3cml0ZXM6ICJyIDogLi4uIC0+IDsiICovCityZXdyaXRlRW1wdHlBbHQoKSA6Oj0gInJvb3RfMCA9IG5pbDsiCisKK3Jld3JpdGVUcmVlKHJvb3QsY2hpbGRyZW4sZGVzY3JpcHRpb24sZW5jbG9zaW5nVHJlZUxldmVsLHRyZWVMZXZlbCkgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKyAgICA8QVNUTGFiZWxUeXBlPiAqcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPiAqKVtbW3RyZWVBZGFwdG9yIGNsYXNzXSBuZXdFbXB0eVRyZWVdIHJldGFpbl07CisgICAgPHJvb3Q6cmV3cml0ZUVsZW1lbnQoKT4KKyAgICA8Y2hpbGRyZW46cmV3cml0ZUVsZW1lbnQoKT4KKyAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF88dHJlZUxldmVsPiB0b1RyZWU6cm9vdF88ZW5jbG9zaW5nVHJlZUxldmVsPl07Cit9PFxuPgorPj4KKworcmV3cml0ZUVsZW1lbnRMaXN0KGVsZW1lbnRzKSA6Oj0gIjxlbGVtZW50czpyZXdyaXRlRWxlbWVudCgpPiIKKworcmV3cml0ZUVsZW1lbnQoZSkgOjo9IDw8Cis8QHByZWdlbigpPgorPGUuZWw+Cis+PgorCisvKiogR2VuIElEIG9yIElEW2FyZ3NdICovCityZXdyaXRlVG9rZW5SZWYodG9rZW4sZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKyAvLyBUT0RPOiBhcmdzOiA8YXJnczsgc2VwYXJhdG9yPSIsICI+CitbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6PGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4gdG9UcmVlOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKKy8qKiBHZW4gJGxhYmVsIC4uLiB3aGVyZSBkZWZpbmVkIHZpYSBsYWJlbD1JRCAqLworcmV3cml0ZVRva2VuTGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK1t0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtXzxsYWJlbD4gbmV4dE5vZGVdIHRvVHJlZTpyb290Xzx0cmVlTGV2ZWw+XTs8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWwrPUlEICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK1t0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtXzxsYWJlbD4gbmV4dE5vZGVdIHRvVHJlZTpyb290Xzx0cmVlTGV2ZWw+XTs8XG4+Cis+PgorCisvKiogR2VuIF4oJGxhYmVsIC4uLikgKi8KK3Jld3JpdGVUb2tlbkxhYmVsUmVmUm9vdChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OltzdHJlYW1fPGxhYmVsPiBuZXh0Tm9kZV0gb2xkOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkbGFiZWwgLi4uKSB3aGVyZSBsYWJlbCs9Li4uICovCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworLyoqIEdlbiBeKElEIC4uLikgb3IgXihJRFthcmdzXSAuLi4pICovCityZXdyaXRlVG9rZW5SZWZSb290KHRva2VuLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+ICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6PGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQoLi4uKT4gb2xkOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZihhcmdzLHRva2VuLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorW3RyZWVBZGFwdG9yIGFkZENoaWxkOjxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4gdG9UcmVlOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4gKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDo8Y3JlYXRlSW1hZ2luYXJ5Tm9kZSh0b2tlblR5cGU9dG9rZW4sIC4uLik+IG9sZDpyb290Xzx0cmVlTGV2ZWw+XTs8XG4+Cis+PgorCisvKiogcGxhaW4gLT4ge2Zvb30gYWN0aW9uICovCityZXdyaXRlQWN0aW9uKGFjdGlvbikgOjo9IDw8Cityb290XzAgPSA8YWN0aW9uPjs8XG4+Cis+PgorCisvKiogV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhpcyBydWxlJ3Mgcm9vdCB0cmVlPyAgVGhpcworICogIGxldCdzIHVzIHJlZmVyIHRvICRydWxlIHRvIG1lYW4gcHJldmlvdXMgdmFsdWUuICBJIGFtIHJldXNpbmcgdGhlCisgKiAgdmFyaWFibGUgJ3RyZWUnIHNpdHRpbmcgaW4gcmV0dmFsIHN0cnVjdCB0byBob2xkIHRoZSB2YWx1ZSBvZiByb290XzAgcmlnaHQKKyAqICBiZWZvcmUgSSBzZXQgaXQgZHVyaW5nIHJld3JpdGVzLiAgVGhlIGFzc2lnbiB3aWxsIGJlIHRvIHJldHZhbC50cmVlLgorICovCitwcmV2UnVsZVJvb3RSZWYoKSA6Oj0gInJldHZhbCIKKworcmV3cml0ZVJ1bGVSZWYocnVsZSkgOjo9IDw8CitbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV88cnVsZT4gbmV4dFRyZWVdIHRvVHJlZTpyb290Xzx0cmVlTGV2ZWw+XTs8XG4+Cis+PgorCityZXdyaXRlUnVsZVJlZlJvb3QocnVsZSkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+ICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6KGlkXDxBTlRMUlRyZWU+KVtzdHJlYW1fPHJ1bGU+IG5leHROb2RlXSBvbGQ6cm9vdF88dHJlZUxldmVsPl07PFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK1t0cmVlQWRhcHRvciBhZGRDaGlsZDo8YWN0aW9uPiB0b1RyZWU6cm9vdF88dHJlZUxldmVsPl07PFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb25Sb290KGFjdGlvbikgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gKDxBU1RMYWJlbFR5cGU+ICopW3RyZWVBZGFwdG9yIGJlY29tZVJvb3Q6PGFjdGlvbj4gb2xkOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKKy8qKiBHZW4gJHJ1bGVMYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgcnVsZUxhYmVsPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGFiZWxSZWYobGFiZWwpIDo6PSA8PAorW3RyZWVBZGFwdG9yIGFkZENoaWxkOltzdHJlYW1fPGxhYmVsPiBuZXh0VHJlZV0gdG9UcmVlOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKKy8qKiBHZW4gJHJ1bGVMYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZihsYWJlbCkgOjo9IDw8CitbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W3N0cmVhbV88bGFiZWw+IG5leHRUcmVlXSB0b1RyZWU6cm9vdF88dHJlZUxldmVsPl07PFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OltzdHJlYW1fPGxhYmVsPiBuZXh0Tm9kZV0gb2xkOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKKy8qKiBHZW4gXigkcnVsZUxhYmVsIC4uLikgd2hlcmUgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OltzdHJlYW1fPGxhYmVsPiBuZXh0Tm9kZV0gb2xkOnJvb3RfPHRyZWVMZXZlbD5dOzxcbj4KKz4+CisKK3Jld3JpdGVXaWxkY2FyZExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK1t0cmVlQWRhcHRvciBhZGRDaGlsZDpbc3RyZWFtXzxsYWJlbD4gbmV4dFRyZWVdIHRvVHJlZTpyb290Xzx0cmVlTGV2ZWw+XTs8XG4+Cis+PgorCitjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZSx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorICAgIFs8dGVybWluYWxPcHRpb25zLm5vZGU+IG5ldzx0ZXJtaW5hbE9wdGlvbnMubm9kZT46PHRva2VuVHlwZT4gPGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj5dCis8ZWxzZT4KKyAgICA8aWYoYXJncyk+CisgICAgICAgIFtbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTo8dG9rZW5UeXBlPiA8aWYoZmlyc3QoYXJncykpPkZyb21Ub2tlbjo8Zmlyc3QoYXJncyk+PGVuZGlmPiA8aWYoZmlyc3QocmVzdChhcmdzKSkpPlRleHQ6PGZpcnN0KHJlc3QoYXJncykpPjxlbHNlPlRleHQ6QCI8dG9rZW5UeXBlPiI8ZW5kaWY+XSByZXRhaW5dCisgICAgPGVsc2U+CisgICAgICAgIFtbdHJlZUFkYXB0b3IgY3JlYXRlVHJlZTo8dG9rZW5UeXBlPiBUZXh0OkAiPHRva2VuVHlwZT4iXSByZXRhaW5dCisgICAgPGVuZGlmPgorPGVuZGlmPgorPj4KKworY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorICAgIFs8dGVybWluYWxPcHRpb25zLm5vZGU+IG5ldzx0ZXJtaW5hbE9wdGlvbnMubm9kZT46W3N0cmVhbV88dG9rZW4+IG5leHRUb2tlbl08aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPl0KKzxlbHNlPgorICAgIDxpZihhcmdzKT4gPCEgbXVzdCBjcmVhdGUgbmV3IG5vZGUgZnJvbSBvbGQgIT4KKyAgICAgICAgW1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOjx0b2tlbj4gVGV4dDo8Zmlyc3QocmVzdChhcmdzKSk+IDxhcmdzOyBzZXBhcmF0b3I9IiwgIj5dIHJldGFpbl0KKyAgICA8ZWxzZT4KKyAgICAgICAgW3N0cmVhbV88dG9rZW4+IG5leHROb2RlXQorICAgIDxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNURGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9BU1REYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTZmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNURGJnLnN0ZwpAQCAtMCwwICsxLDkzIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDYgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qKiBUZW1wbGF0ZSBvdmVycmlkZXMgdG8gYWRkIGRlYnVnZ2luZyB0byBBU1Qgc3R1ZmYuICBEeW5hbWljIGluaGVyaXRhbmNlCisgKiAgaGllcmFyY2h5IGlzIHNldCB1cCBhcyBBU1REYmcgOiBBU1QgOiBEYmcgOiBKYXZhIGJ5IGNvZGUgZ2VuZXJhdG9yLgorICovCitwYXJzZXJNZW1iZXJzKCkgOjo9IDw8CitBTlRMUkRlYnVnVHJlZUFkYXB0b3IgKmFkYXB0b3IgPSBbQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yIG5ld1RyZWVBZGFwdG9yOihpZClkYmcgQWRhcHRvcjpbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl1dOworCisvLyBmaXggdGhpcworLSAodm9pZCkgc2V0VHJlZUFkYXB0b3I6KGlkPEFOVExSVHJlZUFkYXB0b3I+KWFuQWRhcHRvcgoreworICAgIGFkYXB0b3IgPSBbQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yIG5ld1RyZWVBZGFwdG9yOmRiZyBBZGFwdG9yOmFuQWRhcHRvcl07Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgICBhZGFwdG9yID0gW0FOVExSRGVidWdUcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcjphZGFwdG9yIHdpdGhEQkc6ZGJnXTsKKzxlbHNlPgorICAgIGFkYXB0b3IgPSAoQU5UTFJEZWJ1Z1RyZWVBZGFwdG9yICopYWRhcHRvcjsgLy8gZGVsZWdhdG9yIHNlbmRzIGRiZyBhZGFwdG9yCis8ZW5kaWY+PFxuPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3xbPGc6ZGVsZWdhdGVOYW1lKCk+IHNldFRyZWVBZGFwdG9yOmFkYXB0b3JdO30+Cit9CisKKy0gKGlkPEFOVExSVHJlZUFkYXB0b3I+KWdldFRyZWVBZGFwdG9yCit7CisgICAgcmV0dXJuIGFkYXB0b3I7Cit9PFxuPgorPj4KKworcGFyc2VyQ3RvckJvZHkoKSA6Oj0gPDwKKzxzdXBlci5wYXJzZXJDdG9yQm9keSgpPgorPj4KKworY3JlYXRlTGlzdGVuZXJBbmRIYW5kc2hha2UoKSA6Oj0gPDwKK0FOVExSRGVidWdFdmVudFNvY2tldFByb3h5IHByb3h5ID0KKyAgICBbQU5UTFJEZWJ1Z0V2ZW50U29ja2V0UHJveHkgbmV3QU5UTFJEZWJ1Z0V2ZW50U29ja2V0UHJveHk6c2VsZiwgcG9ydCwgPGlmKFRSRUVfUEFSU0VSKT5baW5wdXQgZ2V0VHJlZUFkYXB0b3JdPGVsc2U+YWRhcHRvcjxlbmRpZj5dOworW3NlbGYgc2V0RGVidWdMaXN0ZW5lcjpwcm94eV07Citbc2VsZiBzZXQ8aW5wdXRTdHJlYW1UeXBlPjpbQU5UTFJBTlRMUkRlYnVnPGlucHV0U3RyZWFtVHlwZT4gbmV3QU5UTFJEZWJ1ZzxpbnB1dFN0cmVhbVR5cGU+OmlucHV0IHdpdGg6cHJveHldXTsKK3RyeSB7CisgICAgW3Byb3h5IGhhbmRzaGFrZV07Cit9CitAY2F0Y2ggKElPRXhjZXB0aW9uICppb2UpIHsKKyAgICBbc2VsZiByZXBvcnRFcnJvcjppb2VdOworfQorPj4KKworQGN0b3JGb3JSb290R3JhbW1hci5maW5hbGx5KCkgOjo9IDw8CitBTlRMUkNvbW1vblRyZWVBZGFwdG9yICphZGFwID0gW0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgbmV3VHJlZUFkYXB0b3JdOworW3NlbGYgc2V0VHJlZUFkYXB0b3I6YWRhcF07CitbcHJveHkgc2V0VHJlZUFkYXB0b3I6YWRhcF07Cis+PgorCitAY3RvckZvclByb2ZpbGluZ1Jvb3RHcmFtbWFyLmZpbmFsbHkoKSA6Oj08PAorQU5UTFJDb21tb25UcmVlQWRhcHRvciAqYWRhcCA9IFtBTlRMUkNvbW1vblRyZWVBZGFwdG9yIG5ld1RyZWVBZGFwdG9yXTsKK1tzZWxmIHNldFRyZWVBZGFwdG9yOmFkYXBdOworW3Byb3h5IHNldFRyZWVBZGFwdG9yOmFkYXBdOworPj4KKworQGN0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIuc3VwZXJDbGFzc1JlZigpIDo6PSBAInN1cGVyKGlucHV0LCBkYmcpOyIKKworQGN0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIuZmluYWxseSgpIDo6PTw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4gPCEgZG9uJ3QgY3JlYXRlIG5ldyBhZGFwdG9yIGZvciBkZWxlZ2F0ZXMgIT4KK0FOVExSQ29tbW9uVHJlZUFkYXB0b3IgKmFkYXAgPSBbQU5UTFJDb21tb25UcmVlQWRhcHRvciBuZXdUcmVlQWRhcHRvcl07Citbc2VsZiBzZXRUcmVlQWRhcHRvcjphZGFwXTs8XG4+Cis8ZW5kaWY+Cis+PgorCitAdHJlZVBhcnNlckhlYWRlckZpbGUuc3VwZXJDbGFzc05hbWUgOjo9ICJBTlRMUkRlYnVnVHJlZVBhcnNlciIKKworQHJld3JpdGVFbGVtZW50LnByZWdlbigpIDo6PSAiW2RlYnVnTGlzdGVuZXIgbG9jYXRpb25MaW5lOjxlLmxpbmU+IGNvbHVtbjo8ZS5wb3M+XTsiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNUUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGJlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNUUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGVzIGZvciBidWlsZGluZyBBU1RzIGR1cmluZyBub3JtYWwgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIFRoZSBzaXR1YXRpb24gaXMgbm90IHRvbyBiYWQgYXMgcmV3cml0ZSAoLT4pIHVzYWdlIG1ha2VzIF4gYW5kICEKKyAqICBpbnZhbGlkLiBUaGVyZSBpcyBubyBodWdlIGV4cGxvc2lvbiBvZiBjb21iaW5hdGlvbnMuCisgKi8KK0BydWxlLnNldEVycm9yUmV0dXJuVmFsdWUoKSA6Oj0gPDwKKy8qIEFTVFBhcnNlciBydWxlLnNldEVycm9yUmV0dXJuVmFsdWUgKi8KK3JldHZhbC50cmVlID0gKDxBU1RMYWJlbFR5cGU+ICopW3RyZWVBZGFwdG9yIGVycm9yTm9kZTppbnB1dCBGcm9tOnJldHZhbC5zdGFydCBUbzpbaW5wdXQgTFQ6LTFdIEV4Y2VwdGlvbjpyZV07Cis8ISBTeXN0ZW0ub3V0LnByaW50bG4oIjxydWxlTmFtZT4gcmV0dXJucyAiKygoQ29tbW9uVHJlZSlyZXR2YWwudHJlZSkudG9TdHJpbmdUcmVlKCkpOyAhPgorPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWYodG9rZW4sIGxhYmVsLCBlbGVtZW50SW5kZXgsIHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CisvKiBBU1RQYXJzZXIgdG9rZW5SZWYgKi8KKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPjsKK1t0cmVlQWRhcHRvciBhZGRDaGlsZDo8bGFiZWw+X3RyZWUgIHRvVHJlZTpyb290XzBdOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qIElEISBhbmQgb3V0cHV0PUFTVCAoc2FtZSBhcyBwbGFpbiB0b2tlblJlZikgKi8KKy8qIEFTVFBhcnNlciB0b2tlblJlZkJhbmcgKi8KK3Rva2VuUmVmQmFuZyh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gIjxzdXBlci50b2tlblJlZiguLi4pPiIKKworLyoqIElEXiBhbmQgb3V0cHV0PUFTVCAqLwordG9rZW5SZWZSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPjsKK3Jvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OjxsYWJlbD5fdHJlZSBvbGQ6cm9vdF8wXTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis+PgorCisvKiogaWRzKz1JRCEgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmQmFuZ0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKy8qIEFTVFBhcnNlciB0b2tlblJlZkJhbmdBbmRMaXN0TGFiZWwgKi8KKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIGxhYmVsKz1UT0tFTiB3aGVuIG91dHB1dD1BU1QgYnV0IG5vdCByZXdyaXRlIGFsdCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CisvKiBBU1RQYXJzZXIgdG9rZW5SZWZBbmRMaXN0TGFiZWwgKi8KKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggbGFiZWwrPVRPS0VOXiB3aGVuIG91dHB1dD1BU1QgYnV0IG5vdCByZXdyaXRlIGFsdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKKy8qIEFTVFBhcnNlciB0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsICovCis8dG9rZW5SZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvLyBTRVQgQVNUCisKKy8vIHRoZSBtYXRjaCBzZXQgc3R1ZmYgaXMgaW50ZXJlc3RpbmcgaW4gdGhhdCBpdCB1c2VzIGFuIGFyZ3VtZW50IGxpc3QKKy8vIHRvIHBhc3MgY29kZSB0byB0aGUgZGVmYXVsdCBtYXRjaFNldDsgYW5vdGhlciBwb3NzaWJsZSB3YXkgdG8gYWx0ZXIKKy8vIGluaGVyaXRlZCBjb2RlLiAgSSBkb24ndCB1c2UgdGhlIHJlZ2lvbiBzdHVmZiBiZWNhdXNlIEkgbmVlZCB0byBwYXNzCisvLyBkaWZmZXJlbnQgY2h1bmtzIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0b3IuICBJIGRvbid0IGxpa2UgbWFraW5nCisvLyB0aGUgdGVtcGxhdGUgbmFtZSBoYXZlIHRoZSBvcGVyYXRvciBhcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlcyBnZXRzCisvLyBsYXJnZSBidXQgdGhpcyBpcyB0aGUgbW9zdCBmbGV4aWJsZS0tdGhpcyBpcyBhcyBvcHBvc2VkIHRvIGhhdmluZworLy8gdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbGwgbWF0Y2hTZXQgdGhlbiBhZGQgcm9vdCBjb2RlIG9yIHJ1bGVyb290IGNvZGUKKy8vIHBsdXMgbGlzdCBsYWJlbCBwbHVzIC4uLiAgVGhlIGNvbWJpbmF0aW9ucyBtaWdodCByZXF1aXJlIGNvbXBsaWNhdGVkCisvLyByYXRoZXIgdGhhbiBqdXN0IGFkZGVkIG9uIGNvZGUuICBJbnZlc3RpZ2F0ZSB0aGF0IHJlZmFjdG9yaW5nIHdoZW4KKy8vIEkgaGF2ZSBtb3JlIHRpbWUuCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPCUKKy8qIEFTVFBhcnNlciBtYXRjaFNldCAqLworPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9ezxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KKyAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6PGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4gdG9UcmVlOnJvb3RfMCBdO30sIC4uLik+CislPgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKy8qIEFTVFBhcnNlciBtYXRjaFJ1bGVCbG9ja1NldCAqLworPG1hdGNoU2V0KC4uLik+Cis+PgorCittYXRjaFNldEJhbmcocyxsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLCBwb3N0bWF0Y2hDb2RlKSA6Oj0gIjxzdXBlci5tYXRjaFNldCguLi4pPiIKKworLy8gbm90ZSB0aGVyZSBpcyBubyBtYXRjaFNldFRyYWNrIGJlY2F1c2UgLT4gcmV3cml0ZXMgZm9yY2Ugc2V0cyB0byBiZQorLy8gcGxhaW4gb2xkIGJsb2NrcyBvZiBhbHRzOiAoQXxCfC4uLnxDKQorCittYXRjaFNldFJ1bGVSb290KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxkZWJ1ZykgOjo9IDw8CisvKiBBU1RQYXJzZXIgbWF0Y2hTZXRSdWxlUm9vdCAqLworPGlmKGxhYmVsKT4KKzxsYWJlbD49KDxsYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOyAvKiBtYXRjaFNldFJ1bGVSb290ICovPFxuPgorPGVuZGlmPgorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9ezxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KK3Jvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OjxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+IG9sZDpyb290XzBdO30sIC4uLik+Cis+PgorCisvLyBSVUxFIFJFRiBBU1QKKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUUGFyc2VyIHJ1bGVSZWYgKi8KKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICk8ZW5kaWY+CitbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6WzxsYWJlbD4gZ2V0VHJlZV0gdG9UcmVlOnJvb3RfMF07Cis+PgorCisvKiogcnVsZSEgaXMgc2FtZSBhcyBub3JtYWwgcnVsZSByZWYgKi8KK3J1bGVSZWZCYW5nKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSAiPHN1cGVyLnJ1bGVSZWYoLi4uKT4iCisKKy8qKiBydWxlXiAqLworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUUGFyc2VyIHJ1bGVSZWZSdWxlUm9vdCAqLworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KK3Jvb3RfMCA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290Ols8bGFiZWw+IGdldFRyZWVdIG9sZDpyb290XzBdOworPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUUGFyc2VyIHJ1bGVSZWZBbmRMaXN0TGFiZWwgKi8KKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW0gPSB7WzxsYWJlbD4gZ2V0VHJlZV19LC4uLik+Cis+PgorCisvKiogeCs9cnVsZSEgd2hlbiBvdXRwdXQ9QVNUIGlzIGEgcnVsZSByZWYgd2l0aCBsaXN0IGFkZGl0aW9uICovCitydWxlUmVmQmFuZ0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKy8qIEFTVFBhcnNlciBydWxlUmVmQmFuZ0FuZExpc3RMYWJlbCAqLworPHJ1bGVSZWZCYW5nKC4uLik+Cis8bGlzdExhYmVsKGVsZW0gPSB7WzxsYWJlbD4gZ2V0VHJlZV19LC4uLik+Cis+PgorCisvKiogeCs9cnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKy8qIEFTVFBhcnNlciBydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwgKi8KKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbSA9IHtbPGxhYmVsPiBnZXRUcmVlXX0sLi4uKT4KKz4+CisKKy8vIFdJTERDQVJEIEFTVAorCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKy8qIEFTVFBhcnNlciB3aWxkY2FyZCAqLworPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKyAgICBbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6W1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOjxsYWJlbD5dIHJldGFpbl0gdG9UcmVlOnJvb3RfMF07Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKword2lsZGNhcmRCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSAiPHN1cGVyLndpbGRjYXJkKC4uLik+IgorCit3aWxkY2FyZFJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorLyogQVNUUGFyc2VyIHdpbGRjYXJkUnVsZVJvb3QgKi8KKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+CisgICAgPGxhYmVsPl90cmVlID0gW1t0cmVlQWRhcHRvciBjcmVhdGVUcmVlOjxsYWJlbD5dIHJldGFpbl0KKyAgICByb290XzAgPSAoPEFTVExhYmVsVHlwZT4gKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDo8bGFiZWw+X3RyZWUgb2xkOnJvb3RfMF07Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorLyogQVNUUGFyc2VyIGNyZWF0ZU5vZGVGcm9tVG9rZW4gKi8KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+CitbQU5UTFI8dGVybWluYWxPcHRpb25zLm5vZGU+IG5ld0FOVExSPHRlcm1pbmFsT3B0aW9ucy5ub2RlPjo8bGFiZWw+XSA8ISBuZXcgTWV0aG9kTm9kZShJRExhYmVsKSAhPgorPGVsc2U+CisoPEFTVExhYmVsVHlwZT4gKilbW3RyZWVBZGFwdG9yIGNyZWF0ZVRyZWU6PGxhYmVsPl0gcmV0YWluXQorPGVuZGlmPgorPj4KKworLy8gc3RyYWlnaHQgZnJvbSBqYXZhIGNsZWFudXAgLy8vCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorLyogQVNUUGFyc2VyIHJ1bGVDbGVhblVwICovCis8c3VwZXIucnVsZUNsZWFuVXAoKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PFxuPjxlbmRpZj4KKyAgICByZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBydWxlUG9zdFByb2Nlc3Npbmc6cm9vdF8wXTsKKyAgICBbdHJlZUFkYXB0b3Igc2V0VG9rZW5Cb3VuZGFyaWVzOnJldHZhbC50cmVlIEZyb206cmV0dmFsLnN0YXJ0IFRvOnJldHZhbC5zdG9wVG9rZW5dOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNUVHJlZVBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvQVNUVHJlZVBhcnNlci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5NTlhMwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9BU1RUcmVlUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA3IEtheSBSb2Vwa2UgMjAxMCBBbGFuIENvbmRpdAorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGVzIGZvciBidWlsZGluZyBBU1RzIGR1cmluZyB0cmVlIHBhcnNpbmcuCisgKgorICogIERlYWwgd2l0aCBtYW55IGNvbWJpbmF0aW9ucy4gIERpbWVuc2lvbnMgYXJlOgorICogIEF1dG8gYnVpbGQgb3IgcmV3cml0ZQorICogICAgbm8gbGFiZWwsIGxhYmVsLCBsaXN0IGxhYmVsICAobGFiZWwvbm8tbGFiZWwgaGFuZGxlZCB0b2dldGhlcikKKyAqICAgIGNoaWxkLCByb290CisgKiAgICB0b2tlbiwgc2V0LCBydWxlLCB3aWxkY2FyZAorICoKKyAqICBFYWNoIGNvbWJpbmF0aW9uIGhhcyBpdHMgb3duIHRlbXBsYXRlIGV4Y2VwdCB0aGF0IGxhYmVsL25vIGxhYmVsCisgKiAgaXMgY29tYmluZWQgaW50byB0b2tlblJlZiwgcnVsZVJlZiwgLi4uCisgKi8KKworLyogYWRkaXRpb24gbWVtVmFycyBmb3IgcmV0dXJuc2NvcGVzICovCitAcmV0dXJuU2NvcGVJbnRlcmZhY2UubWVtVmFycygpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciByZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzICovCis8cmVjb2duaXplci5BU1RMYWJlbFR5cGU7IG51bGw9IkFOVExSQ29tbW9uVHJlZSI+ICp0cmVlOworPj4KKworLyoqIHRoZSBpbnRlcmZhY2Ugb2YgcmV0dXJuU2NvcGUgbWV0aG9kc0RlY2wgKi8KK0ByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCgpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCAqLworLSAoPHJlY29nbml6ZXIuQVNUTGFiZWxUeXBlOyBudWxsPSJBTlRMUkNvbW1vblRyZWUiPiAqKWdldFRyZWU7CistICh2b2lkKSBzZXRUcmVlOig8cmVjb2duaXplci5BU1RMYWJlbFR5cGU7IG51bGw9IkFOVExSQ29tbW9uVHJlZSI+ICopYVRyZWU7PFxuPgorPj4KKworLyoqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiByZXR1cm5TY29wZSBtZXRob2RzICovCitAcmV0dXJuU2NvcGUubWV0aG9kcygpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciByZXR1cm5TY29wZS5tZXRob2RzICovCistICg8QVNUTGFiZWxUeXBlPiAqKWdldFRyZWUKK3sKKyAgICByZXR1cm4gdHJlZTsKK30KKworLSAodm9pZCkgc2V0VHJlZTooPEFTVExhYmVsVHlwZT4gKilhVHJlZQoreworICAgIGlmICh0cmVlICE9IGFUcmVlKSB7CisgICAgICAgIGlmICggdHJlZSApIFt0cmVlIHJlbGVhc2VdOworICAgICAgICBpZiAoIGFUcmVlICkgW2FUcmVlIHJldGFpbl07CisgICAgICAgIHRyZWUgPSBhVHJlZTsKKyAgICB9Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICBbc2VsZiBzZXRUcmVlOm5pbF07CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCitAc3ludGhlc2l6ZSB0cmVlOworPj4KKworQHJldHVyblNjb3BlUHJvcGVydGllcygpIDo6PSA8PAorQHByb3BlcnR5IChyZXRhaW4pIDxyZWNvZ25pemVyLkFTVExhYmVsVHlwZTsgbnVsbD0iQU5UTFJDb21tb25UcmVlIj4gKnRyZWU7Cis+PgorCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgbGFzdCBlbGVtZW50IG1hdGNoZWQgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKy8qIEFTVFRyZWVQYXJzZXIgcnVsZURlY2xhcmF0aW9ucyAqLworPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KKzxBU1RMYWJlbFR5cGU+ICpfZmlyc3RfMCA9IG5pbDsKKzxBU1RMYWJlbFR5cGU+ICpfbGFzdCA9IG5pbDs8XG4+Cis+PgorCisvKiogV2hhdCB0byBlbWl0IHdoZW4gdGhlcmUgaXMgbm8gcmV3cml0ZSBydWxlLiAgRm9yIGF1dG8gYnVpbGQKKyAqICBtb2RlLCBkb2VzIG5vdGhpbmcuCisgKi8KK25vUmV3cml0ZShyZXdyaXRlQmxvY2tMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKy8qIEFTVFRyZWVQYXJzZXIgbm9SZXdyaXRlICovCis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZihyZXdyaXRlTW9kZSk+CityZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPiAqKV9maXJzdF8wOworaWYgKCBbdHJlZUFkYXB0b3IgZ2V0UGFyZW50OnJldHZhbC50cmVlXSAhPSBuaWwgJiYgW3RyZWVBZGFwdG9yIGlzTmlsOlt0cmVlQWRhcHRvciBnZXRQYXJlbnQ6cmV0dmFsLnRyZWVdXSApICkKKyAgICByZXR2YWwudHJlZSA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBnZXRQYXJlbnQ6cmV0dmFsLnRyZWVdOworPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyOyBvdmVycmlkZSBoZXJlIHRvCisgKiAgYWRkIHRyZWUgY29uc3RydWN0aW9uIGFjdGlvbnMuCisgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIHRyZWUgKi8KK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOworeworPEFTVExhYmVsVHlwZT4gKl9zYXZlX2xhc3RfPHRyZWVMZXZlbD4gPSBfbGFzdDsKKzxBU1RMYWJlbFR5cGU+ICpfZmlyc3RfPHRyZWVMZXZlbD4gPSBuaWw7Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxBU1RMYWJlbFR5cGU+ICpyb290Xzx0cmVlTGV2ZWw+ID0gW1tbdHJlZUFkYXB0b3IgY2xhc3NdIG5ld0VtcHR5VHJlZV0gcmV0YWluXTsKKzxlbmRpZj4KKzxyb290OmVsZW1lbnQoKT4KKzxpZihyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICk8ZW5kaWY+Cis8aWYocm9vdC5lbC5ydWxlKT4KK2lmICggX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+PT1uaWwgKSBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD4udHJlZTsKKzxlbHNlPgoraWYgKCBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD49PW5pbCApIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9IDxyb290LmVsLmxhYmVsPjsKKzxlbmRpZj4KKzxlbmRpZj4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIFtpbnB1dCBMQToxXSA9PSBBTlRMUlRva2VuVHlwZURPV04gKSB7CisgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkFOVExSVG9rZW5UeXBlRE9XTiBGb2xsb3c6bmlsXTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQIEZvbGxvdzpuaWxdOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+Citbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6QU5UTFJUb2tlblR5cGVET1dOIEZvbGxvdzpuaWxdOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGNoaWxkcmVuOmVsZW1lbnQoKT4KK1tzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpBTlRMUlRva2VuVHlwZVVQIEZvbGxvdzpuaWxdOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPGlmKCFyZXdyaXRlTW9kZSk+CitbdHJlZUFkYXB0b3IgYWRkQ2hpbGQ6cm9vdF88dHJlZUxldmVsPiB0b1RyZWU6cm9vdF88ZW5jbG9zaW5nVHJlZUxldmVsPl07Cis8ZW5kaWY+CitfbGFzdCA9IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD47Cit9PFxuPgorPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICdjZXB0IGFkZAorICogIHNldHRpbmcgb2YgX2xhc3QKKyAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciB0b2tlblJlZkJhbmcgKi8KK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis+PgorCisvKiogSUQgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciB0b2tlblJlZiAqLworX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4gKilbaW5wdXQgTFQ6MV07Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorICAgIDxsYWJlbD5fdHJlZSA9IFtBTlRMUjx0ZXJtaW5hbE9wdGlvbnMubm9kZT4gbmV3QU5UTFI8dGVybWluYWxPcHRpb25zLm5vZGU+OjxsYWJlbD5dOworPGVsc2U+CisgICAgPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+ICopW3RyZWVBZGFwdG9yIGR1cE5vZGU6PGxhYmVsPl07Cis8ZW5kaWY+PFxuPgorICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDo8bGFiZWw+X3RyZWUgdG9UcmVlOnJvb3RfPHRyZWVMZXZlbD5dOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKTxlbmRpZj4KK2lmICggX2ZpcnN0Xzx0cmVlTGV2ZWw+PT1uaWwgKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+OworPGVuZGlmPgorPj4KKworLyoqIGxhYmVsKz1UT0tFTiBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIHRva2VuUmVmQW5kTGlzdExhYmVsICovCis8dG9rZW5SZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIF4oSUQgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciB0b2tlblJlZlJ1bGVSb290ICovCitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPiAqKVtpbnB1dCBMVDoxXTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+ICkgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBbQU5UTFI8dGVybWluYWxPcHRpb25zLm5vZGU+IG5ld0FOVExSPHRlcm1pbmFsT3B0aW9ucy5ub2RlPjo8bGFiZWw+XTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+ICopW3RyZWVBZGFwdG9yIGR1cE5vZGU6PGxhYmVsPl07Cis8ZW5kaWY+PFxuPgorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPiAqKVt0cmVlQWRhcHRvciBiZWNvbWVSb290OjxsYWJlbD5fdHJlZSBvbGQ6cm9vdF88dHJlZUxldmVsPl07Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIE1hdGNoIF4obGFiZWwrPVRPS0VOIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIHRva2VuUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwgKi8KKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGFuZCBhdXRvIGR1cCB0aGUgbm9kZS9zdWJ0cmVlICovCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKy8qIEFTVFRyZWVQYXJzZXIgd2lsZGNhcmQgKi8KK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOworPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+ICopW2FkYXB0b3IgZHVwVHJlZTo8bGFiZWw+XTsKK1thZGFwdG9yIGFkZENoaWxkOjxsYWJlbD5fdHJlZSB0b1RyZWU6cm9vdF88dHJlZUxldmVsPl07Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApPGVuZGlmPgoraWYgKCBfZmlyc3RfPHRyZWVMZXZlbD4gPT0gbmlsICkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPjsKKzxlbmRpZj4KKz4+CisKKy8vIFNFVCBBU1QKKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBtYXRjaFNldCAqLworX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4gKilbaW5wdXQgTFQ6MV07Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IFtBTlRMUjx0ZXJtaW5hbE9wdGlvbnMubm9kZT4gbmV3QU5UTFI8dGVybWluYWxPcHRpb25zLm5vZGU+OjxsYWJlbD5dOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4gKilbYWRhcHRvciBkdXBOb2RlOjxsYWJlbD5dOworPGVuZGlmPjxcbj4KK1thZGFwdG9yIGFkZENoaWxkOjxsYWJlbD5fdHJlZSB0b1RyZWU6cm9vdF88dHJlZUxldmVsPl07Cis8aWYoYmFja3RyYWNraW5nKT5cfTxlbmRpZj4KKzxlbmRpZj4KK30sIC4uLgorKT4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlLHRyZWVMZXZlbD0iMCIpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBtYXRjaFJ1bGVCbG9ja1NldCAqLworPG1hdGNoU2V0KC4uLik+Cis8bm9SZXdyaXRlKC4uLik+IDwhIHNldCByZXR1cm4gdHJlZSAhPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKy8qIEFTVFRyZWVQYXJzZXIgbWF0Y2hTZXRCYW5nICovCitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPiAqKVtpbnB1dCBMVDoxXTsKKzxzdXBlci5tYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRSdWxlUm9vdChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgsZGVidWcpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBtYXRjaFNldFJ1bGVSb290ICovCis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IFtBTlRMUjx0ZXJtaW5hbE9wdGlvbnMubm9kZT4gbmV3QU5UTFI8dGVybWluYWxPcHRpb25zLm5vZGU+OjxsYWJlbD5dOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4gKilbYWRhcHRvciBkdXBOb2RlOjxsYWJlbD5dOworPGVuZGlmPjxcbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4gKilbYWRhcHRvciBiZWNvbWVSb290OjxsYWJlbD5fdHJlZSBvbGQ6cm9vdF88dHJlZUxldmVsPl07Cis8aWYoYmFja3RyYWNraW5nKT5cfTxlbmRpZj4KKzxlbmRpZj4KK30sIC4uLgorKT4KKz4+CisKKy8vIFJVTEUgUkVGIEFTVAorCisvKiogcnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKy8qIEFTVFRyZWVQYXJzZXIgcnVsZVJlZiAqLworX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4gKilbaW5wdXQgTFQ6MV07Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIDxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorICAgIFt0cmVlQWRhcHRvciBhZGRDaGlsZDo8bGFiZWw+LnRyZWUgdG9UcmVlOnJvb3RfPHRyZWVMZXZlbD5dOworPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgoraWYgKCBfZmlyc3RfPHRyZWVMZXZlbD4gPT0gbmlsICkgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPi50cmVlOworPGVuZGlmPgorPj4KKworLyoqIHgrPXJ1bGUgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIHJ1bGVSZWZBbmRMaXN0TGFiZWwgKi8KKzxydWxlUmVmKC4uLik+Cis8ISA8bGlzdExhYmVsKGVsZW0gPSAiWyIrbGFiZWwrIiBnZXRUcmVlXSIsLi4uKT4gIT4KKzxsaXN0TGFiZWwoZWxlbSA9IHtbPGxhYmVsPiBnZXRUcmVlXX0sLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBydWxlUmVmUnVsZVJvb3QgKi8KK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCApIDxlbmRpZj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4gKilbdHJlZUFkYXB0b3IgYmVjb21lUm9vdDo8bGFiZWw+LnRyZWUgb2xkOnJvb3RfPHRyZWVMZXZlbD5dOworPGVuZGlmPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIHJ1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbCAqLworPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtID0ge1s8bGFiZWw+IGdldFRyZWVdfSwuLi4pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBydWxlUmVmVHJhY2sgKi8KK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOworPHN1cGVyLnJ1bGVSZWZUcmFjayguLi4pPgorPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwgKi8KK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOworPHN1cGVyLnJ1bGVSZWZUcmFja0FuZExpc3RMYWJlbCguLi4pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBydWxlUmVmUnVsZVJvb3RUcmFjayAqLworX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4gKilbaW5wdXQgTFQ6MV07Cis8c3VwZXIucnVsZVJlZlJvb3RUcmFjayguLi4pPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogQVNUVHJlZVBhcnNlciBydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbCAqLworX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4gKilbaW5wdXQgTFQ6MV07Cis8c3VwZXIucnVsZVJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBTdHJlYW1zIGZvciB0b2tlbiByZWZzIGFyZSB0cmVlIG5vZGVzIG5vdzsgb3ZlcnJpZGUgdG8KKyAqICBjaGFuZ2UgbmV4dFRva2VuIHRvIG5leHROb2RlLgorICovCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxzY29wZSkgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIGNyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQgKi8KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8ISBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPihzdHJlYW1fPHRva2VuPi5uZXh0Tm9kZSgpKSAhPgorW1tbQU5UTFI8dGVybWluYWxPcHRpb25zLm5vZGU+KHN0cmVhbV88dG9rZW4+IGFsbG9jXSBpbml0XSBuZXh0Tm9kZV07Cis8ZWxzZT4KKzwhIHN0cmVhbV88dG9rZW4+Lm5leHROb2RlKCkgIT4KK1tzdHJlYW1fPHRva2VuPiBuZXh0Tm9kZV0KKzxlbmRpZj4KKz4+CisKK3J1bGVDbGVhblVwKCkgOjo9IDw8CisvKiBBU1RUcmVlUGFyc2VyIHJ1bGVDbGVhblVwICovCis8c3VwZXIucnVsZUNsZWFuVXAoKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHs8XG4+PGVuZGlmPgorcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4gKilbdHJlZUFkYXB0b3IgcnVsZVBvc3RQcm9jZXNzaW5nOnJvb3RfMF07Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9EYmcuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9PYmpDL0RiZy5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4YjQyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9EYmcuc3RnCkBAIC0wLDAgKzEsMjI4IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDYgS2F5IFJvZXBrZSAyMDEwIEFsYW4gQ29uZGl0CisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gbm9ybWFsIE9iamVjdGl2ZS1DIG91dHB1dDsKKyAqICBJZiBBU1RzIGFyZSBidWlsdCwgdGhlbiB5b3UnbGwgYWxzbyBnZXQgQVNURGJnLnN0ZyBsb2FkZWQuCisgKi8KK0BoZWFkZXJGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPgorI2ltcG9ydCBcPEFOVExSL0FOVExSRGVidWcuaD4KKz4+CisKK0BwYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMoKSA6Oj0gPDwKK05TSW50ZWdlciBydWxlTGV2ZWw7CitOU0FycmF5ICpydWxlTmFtZXM7Cis+PgorCitAcGFyc2VySGVhZGVyRmlsZS5tZXRob2RzRGVjbCgpIDo6PSA8PAorLShCT09MKSBldmFsUHJlZGljYXRlOihOU1N0cmluZyAqKXByZWRpY2F0ZSBtYXRjaGVkOihCT09MKXJlc3VsdDs8XG4+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZXRob2RzKCkgOjo9IDw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KK0FNdXRhYmxlQXJyYXkgKnJ1bGVOYW1lcyA9IFtBTXV0YWJsZUFycmF5IGFycmF5V2l0aEFycmF5OnsKKyAgICBAImludmFsaWRSdWxlIiwgPGdyYW1tYXIuYWxsSW1wb3J0ZWRSdWxlczp7clNUIHwgQCI8clNULm5hbWU+In07IHdyYXA9QCJcbiAgICAiLCBzZXBhcmF0b3I9IiwgIj4KK307PFxuPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+IDwhIGdyYW1tYXIgaW1wb3J0cyBvdGhlciBncmFtbWFyKHMpICE+CisgICAgcnVsZUxldmVsID0gMDsKKy0gKE5TSW50ZWdlcikgZ2V0UnVsZUxldmVsIHsgcmV0dXJuIHJ1bGVMZXZlbDsgfQorLSAodm9pZCkgaW5jUnVsZUxldmVsIHsgcnVsZUxldmVsKys7IH0KKy0gKHZvaWQpIGRlY1J1bGVMZXZlbCB7IHJ1bGVMZXZlbC0tOyB9Cis8aWYocHJvZmlsZSk+CisgICAgPGN0b3JGb3JQcm9maWxpbmdSb290R3JhbW1hcigpPgorPGVsc2U+CisgICAgPGN0b3JGb3JSb290R3JhbW1hcigpPgorPGVuZGlmPgorPGN0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIoKT4KKzxlbHNlPiA8ISBpbXBvcnRlZCBncmFtbWFyICE+CistIChOU0ludGVnZXIpIGdldFJ1bGVMZXZlbAoreworICAgIHJldHVybiA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pi5nZXRSdWxlTGV2ZWwoKTsKK308XG4+CisKKy0gKHZvaWQpIGluY1J1bGVMZXZlbAoreworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LmluY1J1bGVMZXZlbCgpOworfTxcbj4KKy0gKHZvaWQpIGRlY1J1bGVMZXZlbAoreworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LmRlY1J1bGVMZXZlbCgpOworfTxcbj4KKyAgICA8Y3RvckZvckRlbGVnYXRlR3JhbW1hcigpPgorPGVuZGlmPgorPGlmKHByb2ZpbGUpPgorLSAoQk9PTCkgYWxyZWFkeVBhcnNlZFJ1bGU6KGlkPEludFN0cmVhbT4pIGlucHV0IEluZGV4OihOU0ludGVnZXIpIHJ1bGVJbmRleAoreworICAgIFsoUHJvZmlsZXIpZGJnIGV4YW1pbmVSdWxlTWVtb2l6YXRpb246aW5wdXQsIHJ1bGVJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXMgb2JqZWN0QXRJbmRleDpydWxlSW5kZXhdOworICAgIHJldHVybiBzdXBlci5hbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgcnVsZUluZGV4KTsKK308XG4+CistICh2b2lkKSBtZW1vaXplOihpZDxBTlRMUkludFN0cmVhbT4paW5wdXQgUnVsZUluZGV4OihOU0ludGVnZXIpcnVsZUluZGV4IFN0YXJ0SW5kZXg6KE5TSW50ZWdlcilydWxlU3RhcnRJbmRleAoreworICAgIFsoKFByb2ZpbGVyKWRiZykgbWVtb2l6ZTppbnB1dCBSdWxlSW5kZXg6cnVsZUluZGV4IFN0YXJ0SW5kZXg6cnVsZVN0YXJ0SW5kZXggWzxncmFtbWFyLmNvbXBvc2l0ZS5yb290R3JhbW1hci5yZWNvZ25pemVyTmFtZT4gcnVsZU5hbWVzW3J1bGVJbmRleF1dOworICAgIFtzdXBlciBtZW1vaXplOmlucHV0IFJ1bGVJbmRleDpydWxlSW5kZXggU3RhcnRJbmRleDpydWxlU3RhcnRJbmRleF07Cit9PFxuPgorPGVuZGlmPgorLSAoQk9PTCkgZXZhbFByZWRpY2F0ZTooQk9PTClyZXN1bHQgUHJlZDooTlNTdHJpbmcgKilwcmVkaWNhdGUKK3sKKyAgICBbZGJnIHNlbWFudGljUHJlZGljYXRlOnJlc3VsdCBQcmVkOnByZWRpY2F0ZV07CisgICAgcmV0dXJuIHJlc3VsdDsKK308XG4+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5pbml0KCkgOjo9IDw8CitydWxlTmFtZXMgPSBbTlNBcnJheSBhcnJheVdpdGhPYmplY3RzOjxydWxlczp7clNUIHwgQCI8clNULnJ1bGVOYW1lPiJ9OyBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4JIj4sIG5pbF07PFxuPgorPj4KKworQGdlbmVyaWNQYXJzZXIuZGVhbGxvYygpIDo6PSA8PAorW3J1bGVOYW1lcyByZWxlYXNlXTs8XG4+Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZXRob2RzKCkgOjo9IDw8CistKEJPT0wpIGV2YWxQcmVkaWNhdGU6KE5TU3RyaW5nICopcHJlZGljYXRlIG1hdGNoZWQ6KEJPT0wpcmVzdWx0Cit7CisJW2RlYnVnTGlzdGVuZXIgc2VtYW50aWNQcmVkaWNhdGU6cHJlZGljYXRlIG1hdGNoZWQ6cmVzdWx0XTsKKwlyZXR1cm4gcmVzdWx0OworfTxcbj4KKz4+CisKKy8qIGJ1ZzogY2FuJ3QgdXNlIEBzdXBlci5zdXBlckNsYXNzTmFtZSgpPiAqLworQHBhcnNlckhlYWRlckZpbGUuc3VwZXJDbGFzc05hbWUoKSA6Oj0gIkFOVExSRGVidWc8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZW5kaWY+UGFyc2VyIgorCitAcnVsZS5wcmVhbWJsZSgpIDo6PSA8PAorQHRyeSB7IFtkZWJ1Z0xpc3RlbmVyIGVudGVyUnVsZTpAIjxydWxlTmFtZT4iXTsKK2lmICggcnVsZUxldmVsPT0wICkgW2RlYnVnTGlzdGVuZXIgY29tbWVuY2VdOworcnVsZUxldmVsKys7CitbZGVidWdMaXN0ZW5lciBsb2NhdGlvbkxpbmU6PHJ1bGVEZXNjcmlwdG9yLnRyZWUubGluZT4gY29sdW1uOjxydWxlRGVzY3JpcHRvci50cmVlLmNvbHVtbj5dOzxcbj4KKz4+CisKK0BydWxlLnBvc3RhbWJsZSgpIDo6PSA8PAorW2RlYnVnTGlzdGVuZXIgbG9jYXRpb25MaW5lOjxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmxpbmU+IGNvbHVtbjo8cnVsZURlc2NyaXB0b3IuRU9STm9kZS5jb2x1bW4+XTs8XG4+Cit9CitAZmluYWxseSB7CisgICAgW2RlYnVnTGlzdGVuZXIgZXhpdFJ1bGU6QCI8cnVsZU5hbWU+Il07CisgICAgcnVsZUxldmVsLS07CisgICAgaWYgKCBydWxlTGV2ZWw9PTAgKSBbZGVidWdMaXN0ZW5lciB0ZXJtaW5hdGVdOworfTxcbj4KKz4+CisKKy8qIHRoZXNlIGFyZSBoYW5kbGVkIGluIHRoZSBydW50aW1lIGZvciBub3cuCisgKiBzdGlua3MsIGJ1dCB0aGF0J3MgdGhlIGVhc2llc3Qgd2F5IHRvIGF2b2lkIGhhdmluZyB0byBnZW5lcmF0ZSB0d28KKyAqIG1ldGhvZHMgZm9yIGVhY2ggc3lucHJlZAorCitAc3lucHJlZC5zdGFydCgpIDo6PSAiW2RlYnVnTGlzdGVuZXIgYmVnaW5CYWNrdHJhY2s6c3RhdGUuYmFja3RyYWNraW5nXTsiCisKK0BzeW5wcmVkLnN0b3AoKSA6Oj0gIltkZWJ1Z0xpc3RlbmVyIGVuZEJhY2t0cmFjazpzdGF0ZS5iYWNrdHJhY2tpbmcgd2FzU3VjY2Vzc2Z1bDpzdWNjZXNzXTsiCisKKyAqLworCisvLyBDb21tb24gZGVidWcgZXZlbnQgdHJpZ2dlcnMgdXNlZCBieSByZWdpb24gb3ZlcnJpZGVzIGJlbG93CisKK2VudGVyU3ViUnVsZSgpIDo6PQorICAgICJAdHJ5IHsgW2RlYnVnTGlzdGVuZXIgZW50ZXJTdWJSdWxlOjxkZWNpc2lvbk51bWJlcj5dOzxcbj4iCisKK2V4aXRTdWJSdWxlKCkgOjo9CisgICAgIn0gQGZpbmFsbHkgeyBbZGVidWdMaXN0ZW5lciBleGl0U3ViUnVsZTo8ZGVjaXNpb25OdW1iZXI+XTsgfTxcbj4iCisKK2VudGVyRGVjaXNpb24oKSA6Oj0KKyAgICAiQHRyeSB7IFtkZWJ1Z0xpc3RlbmVyIGVudGVyRGVjaXNpb246PGRlY2lzaW9uTnVtYmVyPl07PFxuPiIKKworZXhpdERlY2lzaW9uKCkgOjo9CisgICAgIn0gQGZpbmFsbHkgeyBbZGVidWdMaXN0ZW5lciBleGl0RGVjaXNpb246PGRlY2lzaW9uTnVtYmVyPl07IH08XG4+IgorCitlbnRlckFsdChuKSA6Oj0gIltkZWJ1Z0xpc3RlbmVyIGVudGVyQWx0OjxuPl07PFxuPiIKKworLy8gUmVnaW9uIG92ZXJyaWRlcyB0aGF0IHRlbGwgdmFyaW91cyBjb25zdHJ1Y3RzIHRvIGFkZCBkZWJ1Z2dpbmcgdHJpZ2dlcnMKKworQGJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJTdWJSdWxlKCk+PGVudGVyRGVjaXNpb24oKT4iCisKK0BibG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKK0BibG9jay5wb3N0YnJhbmNoKCkgOjo9ICI8ZXhpdFN1YlJ1bGUoKT4iCisKK0BydWxlQmxvY2sucHJlZGVjaXNpb24oKSA6Oj0gIjxlbnRlckRlY2lzaW9uKCk+IgorCitAcnVsZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworQHJ1bGVCbG9ja1NpbmdsZUFsdC5wcmVhbHQoKSA6Oj0gIjxlbnRlckFsdChuPVwiMVwiKT4iCisKK0BibG9ja1NpbmdsZUFsdC5wcmVhbHQoKSA6Oj0gIjxlbnRlckFsdChuPVwiMVwiKT4iCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9jay5wcmVsb29wKCkgOjo9ICI8ZW50ZXJTdWJSdWxlKCk+IgorCitAcG9zaXRpdmVDbG9zdXJlQmxvY2sucG9zdGxvb3AoKSA6Oj0gIjxleGl0U3ViUnVsZSgpPiIKKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJEZWNpc2lvbigpPiIKKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLnBvc3RkZWNpc2lvbigpIDo6PSAiPGV4aXREZWNpc2lvbigpPiIKKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLmVhcmx5RXhpdEV4Y2VwdGlvbigpIDo6PQorICAgICJbZGVidWdMaXN0ZW5lciByZWNvZ25pdGlvbkV4Y2VwdGlvbjplZWVdOzxcbj4iCisKK0BjbG9zdXJlQmxvY2sucHJlbG9vcCgpIDo6PSAiPGVudGVyU3ViUnVsZSgpPiIKKworQGNsb3N1cmVCbG9jay5wb3N0bG9vcCgpIDo6PSAiPGV4aXRTdWJSdWxlKCk+IgorCitAY2xvc3VyZUJsb2NrLnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJEZWNpc2lvbigpPiIKKworQGNsb3N1cmVCbG9jay5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisKK0BhbHRTd2l0Y2hDYXNlLnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49aSk+IgorCitAZWxlbWVudC5wcmVtYXRjaCgpIDo6PQorICAgICJbZGVidWdMaXN0ZW5lciBsb2NhdGlvbkxpbmU6PGl0LmxpbmU+IGNvbHVtbjo8aXQucG9zPl07IgorCitAbWF0Y2hTZXQubWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpIDo6PQorICAgICJbZGVidWdMaXN0ZW5lciByZWNvZ25pdGlvbkV4Y2VwdGlvbjptc2VdOyIKKworQGRmYVN0YXRlLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9ICJbZGVidWdMaXN0ZW5lciByZWNvZ25pdGlvbkV4Y2VwdGlvbjpudmFlXTsiCisKK0BkZmFTdGF0ZVN3aXRjaC5ub1ZpYWJsZUFsdEV4Y2VwdGlvbigpIDo6PSAiW2RlYnVnTGlzdGVuZXIgcmVjb2duaXRpb25FeGNlcHRpb246bnZhZV07IgorCitkZmFEZWNpc2lvbihkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CitAdHJ5IHsKKyAgICAvLyBpc0N5Y2xpY0RlY2lzaW9uIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciB0aGUgUHJvZmlsZXIuIFdoaWNoIEkgZGlkbid0IGRvLCB5ZXQuCisgICAgLy8gaXNDeWNsaWNEZWNpc2lvbiA9IFlFUzsKKyAgICA8c3VwZXIuZGZhRGVjaXNpb24oLi4uKT4KK30KK0BjYXRjaCAoQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqbnZhZSkgeworICAgIFtkZWJ1Z0xpc3RlbmVyIHJlY29nbml0aW9uRXhjZXB0aW9uOm52YWVdOworICAgIEB0aHJvdyBudmFlOworfQorPj4KKworQGN5Y2xpY0RGQS5lcnJvck1ldGhvZCgpIDo6PSA8PAorLSh2b2lkKSBlcnJvcjooQU5UTFJOb1ZpYWJsZUFsdEV4Y2VwdGlvbiAqKW52YWUKK3sKKyAgICBbW3JlY29nbml6ZXIgZGVidWdMaXN0ZW5lcl0gcmVjb2duaXRpb25FeGNlcHRpb246bnZhZV07Cit9Cis+PgorCisvKiogRm9yY2UgcHJlZGljYXRlIHZhbGlkYXRpb24gdG8gdHJpZ2dlciBhbiBldmVudCAqLworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK1tzZWxmIGV2YWxQcmVkaWNhdGU6QCI8ZGVzY3JpcHRpb24+IiByZXN1bHQ6PHByZWQ+XTsKKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvT2JqQy5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvT2JqQy5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiYTBmZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9PYmpDLnN0ZwpAQCAtMCwwICsxLDIxMDggQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBLYXkgUm9lcGtlIDIwMTAgQWxhbiBDb25kaXQKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoKKyAqICBUZW1wbGF0ZSBncm91cCBmaWxlIGZvciB0aGUgT2JqZWN0aXZlIEMgY29kZSBnZW5lcmF0b3IuCisgKiAgSGVhdmlseSBiYXNlZCBvbiBKYXZhLnN0ZworICoKKyAqICBXcml0dGVuIGJ5IEtheSBSb2Vwa2UgPGtyb2Vwa2UoYXQpY2xhc3NkdW1wLm9yZz4KKyAqICBNb2RpZmllZCBieSBBbGFuIENvbmRpdCA8YWNvbmRpdChhdClpcG5zLmNvbT4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQU5UTFIgYW5kIHN1YmplY3QgdG8gdGhlIHNhbWUgbGljZW5zZSBhcyBBTlRMUiBpdHNlbGYuCisgKi8KKworb2JqY1R5cGVJbml0TWFwIDo6PSBbCisgICAgImludCIgICAgICAgICAgIDogIjAiLCAgICAgICAgICAgICAgLy8gSW50ZWdlcnMgICAgIHN0YXJ0IG91dCBiZWluZyAwCisgICAgImxvbmciICAgICAgICAgIDogIjAiLCAgICAgICAgICAgICAgLy8gTG9uZ3MgICAgICAgIHN0YXJ0IG91dCBiZWluZyAwCisgICAgImZsb2F0IiAgICAgICAgIDogIjAuMCIsICAgICAgICAgICAgLy8gRmxvYXRzICAgICAgIHN0YXJ0IG91dCBiZWluZyAwCisgICAgImRvdWJsZSIgICAgICAgIDogIjAuMCIsICAgICAgICAgICAgLy8gRG91YmxlcyAgICAgIHN0YXJ0IG91dCBiZWluZyAwCisgICAgIkJPT0wiICAgICAgICAgIDogIk5PIiwgICAgICAgICAgICAgLy8gQm9vbGVhbnMgICAgIHN0YXJ0IG91dCBiZWluZyBBbnRsciBPYmpDIGZvciBmYWxzZQorICAgICJieXRlIiAgICAgICAgICA6ICIwIiwgICAgICAgICAgICAgIC8vIEJ5dGVzICAgICAgICBzdGFydCBvdXQgYmVpbmcgMAorICAgICJzaG9ydCIgICAgICAgICA6ICIwIiwgICAgICAgICAgICAgIC8vIFNob3J0cyAgICAgICBzdGFydCBvdXQgYmVpbmcgMAorICAgICJjaGFyIiAgICAgICAgICA6ICIwIiwgICAgICAgICAgICAgIC8vIENoYXJzICAgICAgICBzdGFydCBvdXQgYmVpbmcgMAorICAgICJpZCIgICAgICAgICAgICA6ICJuaWwiLCAgICAgICAgICAgIC8vIGlkcyAgICAgICAgICBzdGFydCBvdXQgYmVpbmcgbmlsCisgICAgZGVmYXVsdCAgICAgICAgIDogIm5pbCIgICAgICAgICAgICAgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBhdG9taWMgdHlwZQorXQorCitjbGFzc05hbWUoKSA6Oj0gIjxuYW1lPjwhPGlmKExFWEVSKT5MZXhlcjxlbHNlPjxpZihUUkVFX1BBUlNFUik+VHJlZTxlbmRpZj5QYXJzZXI8ZW5kaWY+IT4iCitsZWFkSW4odHlwZSkgOjo9Cis8PAorLyoqIFxmaWxlCisgKiAgVGhpcyA8dHlwZT4gZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5ICRBTlRMUiB2ZXJzaW9uIDxBTlRMUlZlcnNpb24+CisgKgorICogICAgIC0gIEZyb20gdGhlIGdyYW1tYXIgc291cmNlIGZpbGUgOiA8ZmlsZU5hbWU+CisgKiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiA6IDxnZW5lcmF0ZWRUaW1lc3RhbXA+Cis8aWYoTEVYRVIpPgorICogICAgIC0gICAgICAgICAgICAgICAgIGZvciB0aGUgbGV4ZXIgOiA8bmFtZT5MZXhlcgorPGVuZGlmPgorPGlmKFBBUlNFUik+CisgKiAgICAgLSAgICAgICAgICAgICAgICBmb3IgdGhlIHBhcnNlciA6IDxuYW1lPlBhcnNlcgorPGVuZGlmPgorPGlmKFRSRUVfUEFSU0VSKT4KKyAqICAgICAtICAgICAgICAgICBmb3IgdGhlIHRyZWUgcGFyc2VyIDogPG5hbWU+VHJlZVBhcnNlcgorPGVuZGlmPgorICoKKyAqIEVkaXRpbmcgaXQsIGF0IGxlYXN0IG1hbnVhbGx5LCBpcyBub3Qgd2lzZS4KKyAqCisgKiBPYmpDIGxhbmd1YWdlIGdlbmVyYXRvciBhbmQgcnVudGltZSBieSBBbGFuIENvbmRpdCwgYWNvbmRpdHxoZXJlaXNhbmF0fGlwbnN8ZG90Z29lc2hlcmV8Y29tLgorICoKKyAqCis+PgorCisvKiogVGhlIG92ZXJhbGwgZmlsZSBzdHJ1Y3R1cmUgb2YgYSByZWNvZ25pemVyOyBzdG9yZXMgbWV0aG9kcyBmb3IgcnVsZXMKKyAqICBhbmQgY3ljbGljIERGQXMgcGx1cyBzdXBwb3J0IGNvZGUuCisgKi8KK291dHB1dEZpbGUoIExFWEVSLAorICAgICAgICAgICAgUEFSU0VSLAorICAgICAgICAgICAgVFJFRV9QQVJTRVIsCisgICAgICAgICAgICBhY3Rpb25TY29wZSwKKyAgICAgICAgICAgIGFjdGlvbnMsCisgICAgICAgICAgICBkb2NDb21tZW50LAorICAgICAgICAgICAgcmVjb2duaXplciwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB0b2tlbnMsCisgICAgICAgICAgICB0b2tlbk5hbWVzLAorICAgICAgICAgICAgcnVsZXMsCisgICAgICAgICAgICBjeWNsaWNERkFzLAorICAgICAgICAgICAgYml0c2V0cywKKyAgICAgICAgICAgIGJ1aWxkVGVtcGxhdGUsCisgICAgICAgICAgICBidWlsZEFTVCwKKyAgICAgICAgICAgIHJld3JpdGVNb2RlLAorICAgICAgICAgICAgcHJvZmlsZSwKKyAgICAgICAgICAgIGJhY2t0cmFja2luZywKKyAgICAgICAgICAgIHN5bnByZWRzLAorICAgICAgICAgICAgbWVtb2l6ZSwKKyAgICAgICAgICAgIG51bVJ1bGVzLAorICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICBBTlRMUlZlcnNpb24sCisgICAgICAgICAgICBnZW5lcmF0ZWRUaW1lc3RhbXAsCisgICAgICAgICAgICB0cmFjZSwKKyAgICAgICAgICAgIHNjb3BlcywKKyAgICAgICAgICAgIHN1cGVyQ2xhc3MsCisgICAgICAgICAgICBsaXRlcmFscworICAgICAgICAgICAgKSA6Oj0KKzw8Cis8bGVhZEluKCJPQkpDIHNvdXJjZSIpPgorKi8KKy8vICRBTlRMUiA8QU5UTFJWZXJzaW9uPiA8ZmlsZU5hbWU+IDxnZW5lcmF0ZWRUaW1lc3RhbXA+CisKKzwhIDxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyKT4KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGlzIHdoYXQgdGhlIGdyYW1tYXIgcHJvZ3JhbW1lciBhc2tlZCB1cyB0byBwdXQgYXQgdGhlIHRvcCBvZiBldmVyeSBmaWxlLgorICovCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKy8qIEVuZCBvZiBIZWFkZXIgYWN0aW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworPGVuZGlmPiAhPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5jbHVkZSB0aGUgQU5UTFIzIGdlbmVyYXRlZCBoZWFkZXIgZmlsZS4KKyAqLworI2ltcG9ydCAiPG5hbWU+PCE8aWYoTEVYRVIpPkxleGVyPGVsc2U+PGlmKFRSRUVfUEFSU0VSKT5UcmVlPGVuZGlmPlBhcnNlcjxlbmRpZj4hPi5oIgorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wb3N0aW5jbHVkZT4KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKzxkb2NDb21tZW50PgorCis8aWYobGl0ZXJhbHMpPgorLyoqIFN0cmluZyBsaXRlcmFscyB1c2VkIGJ5IDxuYW1lPiB0aGF0IHdlIG11c3QgZG8gdGhpbmdzIGxpa2UgTUFUQ0hTKCkgd2l0aC4KKyAqICBDIHdpbGwgbm9ybWFsbHkganVzdCBsYXkgZG93biA4IGJpdCBjaGFyYWN0ZXJzLCBhbmQgeW91IGNhbiB1c2UgTCJ4eHgiIHRvCisgKiAgZ2V0IHdjaGFyX3QsIGJ1dCB3Y2hhcl90IGlzIDE2IGJpdHMgb24gV2luZG93cywgd2hpY2ggaXMgbm90IFVURjMyIGFuZCBzbworICogIHdlIHBlcmZvcm0gdGhpcyBsaXR0bGUgdHJpY2sgb2YgZGVmaW5pbmcgdGhlIGxpdGVyYWxzIGFzIGFycmF5cyBvZiBVSU5UMzIKKyAqICBhbmQgcGFzc2luZyBpbiB0aGUgYWRkcmVzcyBvZiB0aGVzZS4KKyAqLworPGxpdGVyYWxzOntpdCB8IHN0YXRpYyBBTlRMUjNfVUNIQVIgIGxpdF88aT5bXSAgPSA8aXQ+O307IHNlcGFyYXRvcj0iXG4iPgorCis8ZW5kaWY+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RhcnQgb2YgcmVjb2duaXplcgorICovCis8cmVjb2duaXplcj4KKz4+CitoZWFkZXJGaWxlRXh0ZW5zaW9uKCkgOjo9ICIuaCIKKworaGVhZGVyRmlsZSggTEVYRVIsCisgICAgICAgICAgICBQQVJTRVIsCisgICAgICAgICAgICBUUkVFX1BBUlNFUiwKKyAgICAgICAgICAgIGFjdGlvblNjb3BlLAorICAgICAgICAgICAgYWN0aW9ucywKKyAgICAgICAgICAgIGRvY0NvbW1lbnQsCisgICAgICAgICAgICByZWNvZ25pemVyLAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHRva2VucywKKyAgICAgICAgICAgIHRva2VuTmFtZXMsCisgICAgICAgICAgICBydWxlcywKKyAgICAgICAgICAgIGN5Y2xpY0RGQXMsCisgICAgICAgICAgICBiaXRzZXRzLAorICAgICAgICAgICAgYnVpbGRUZW1wbGF0ZSwKKyAgICAgICAgICAgIGJ1aWxkQVNULAorICAgICAgICAgICAgcmV3cml0ZU1vZGUsCisgICAgICAgICAgICBwcm9maWxlLAorICAgICAgICAgICAgYmFja3RyYWNraW5nLAorICAgICAgICAgICAgc3lucHJlZHMsCisgICAgICAgICAgICBtZW1vaXplLAorICAgICAgICAgICAgbnVtUnVsZXMsCisgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgIEFOVExSVmVyc2lvbiwKKyAgICAgICAgICAgIGdlbmVyYXRlZFRpbWVzdGFtcCwKKyAgICAgICAgICAgIHRyYWNlLAorICAgICAgICAgICAgc2NvcGVzLAorICAgICAgICAgICAgc3VwZXJDbGFzcywKKyAgICAgICAgICAgIGxpdGVyYWxzCisgICAgICAgICAgKSA6Oj0KKzw8CisvLyAkQU5UTFIgPEFOVExSVmVyc2lvbj4gPGZpbGVOYW1lPiA8Z2VuZXJhdGVkVGltZXN0YW1wPgorCis8QGltcG9ydHM+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByZWluY2x1ZGVzPgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YW5kYXJkIGFudGxyMyBPQkpDIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqLworI2ltcG9ydCBcPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCBcPEFOVExSL0FOVExSLmg+CisvKiBFbmQgb2Ygc3RhbmRhcmQgYW50bHIzIHJ1bnRpbWUgZGVmaW5pdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuaW5jbHVkZXM+Cis8QGVuZD4KKworPGlmKExFWEVSKT4KKzxsZXhlckhlYWRlckZpbGUoLi4uKT4KKzxlbmRpZj4KKzxpZihQQVJTRVIpPgorPHBhcnNlckhlYWRlckZpbGUoLi4uKT4KKzxlbmRpZj4KKzxpZihUUkVFX1BBUlNFUik+Cis8dHJlZVBhcnNlckhlYWRlckZpbGUoLi4uKT4KKzxlbmRpZj4KKzxkb2NDb21tZW50PgorPj4KKworbGV4ZXJIZWFkZXJGaWxlKCBMRVhFUiwKKyAgICAgICAgICAgIFBBUlNFUiwKKyAgICAgICAgICAgIFRSRUVfUEFSU0VSLAorICAgICAgICAgICAgYWN0aW9uU2NvcGUsCisgICAgICAgICAgICBhY3Rpb25zLAorICAgICAgICAgICAgZG9jQ29tbWVudCwKKyAgICAgICAgICAgIHJlY29nbml6ZXIsCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdG9rZW5zLAorICAgICAgICAgICAgdG9rZW5OYW1lcywKKyAgICAgICAgICAgIHJ1bGVzLAorICAgICAgICAgICAgY3ljbGljREZBcywKKyAgICAgICAgICAgIGJpdHNldHMsCisgICAgICAgICAgICBidWlsZFRlbXBsYXRlLAorICAgICAgICAgICAgcHJvZmlsZSwKKyAgICAgICAgICAgIGJhY2t0cmFja2luZywKKyAgICAgICAgICAgIHN5bnByZWRzLAorICAgICAgICAgICAgbWVtb2l6ZSwKKyAgICAgICAgICAgIG51bVJ1bGVzLAorICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICBBTlRMUlZlcnNpb24sCisgICAgICAgICAgICBnZW5lcmF0ZWRUaW1lc3RhbXAsCisgICAgICAgICAgICB0cmFjZSwKKyAgICAgICAgICAgIHNjb3BlcywKKyAgICAgICAgICAgIHN1cGVyQ2xhc3M9IkFOVExSTGV4ZXIiCisgICAgICAgICAgICApIDo6PQorPDwKKworPGlmKGFjdGlvbnMuKGFjdGlvblNjb3BlKS5oZWFkZXIpPgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgaXMgd2hhdCB0aGUgZ3JhbW1hciBwcm9ncmFtbWVyIGFza2VkIHVzIHRvIHB1dCBhdCB0aGUgdG9wIG9mIGV2ZXJ5IGZpbGUuCisgKi8KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyPgorLyogRW5kIG9mIEhlYWRlciBhY3Rpb24uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCis8ZW5kaWY+CisKKy8qIFN0YXJ0IGN5Y2xpY0RGQUludGVyZmFjZSAqLworPGN5Y2xpY0RGQXM6Y3ljbGljREZBSW50ZXJmYWNlKCk+CisKKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgSW50ZXJmYWNlIHN0YXJ0Cis8cnVsZXM6e3J1bGUgfAorPHJ1bGUucnVsZURlc2NyaXB0b3I6e3J1bGVEZXNjcmlwdG9yIHwgPHJldHVyblNjb3BlSW50ZXJmYWNlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT59Pn0+CisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIEludGVyZmFjZSBlbmQKKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorPHRva2Vuczp7aXQgfCAjZGVmaW5lIDxpdC5uYW1lPiA8aXQudHlwZT59OyBzZXBhcmF0b3I9IlxuIj4KKy8qIGludGVyZmFjZSBsZXhlciBjbGFzcyAqLworQGludGVyZmFjZSA8Y2xhc3NOYW1lKCk+IDxAc3VwZXJDbGFzc05hbWU+OiA8c3VwZXJDbGFzcz48QGVuZD4geyAvLyBsaW5lIDI4MworPGN5Y2xpY0RGQXM6e2RmYSB8IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+ICpkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxzeW5wcmVkczp7cHJlZCB8IFNFTCA8cHJlZD5TZWxlY3Rvcjt9OyBzZXBhcmF0b3I9IlxuIj4KKy8qIE9iakMgc3RhcnQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCis8YWN0aW9ucy5sZXhlci5tZW1WYXJzPgorLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZW1WYXJzICovCit9CisrICh2b2lkKSBpbml0aWFsaXplOworKyAoPGNsYXNzTmFtZSgpPiAqKW5ldzxjbGFzc05hbWUoKT5XaXRoQ2hhclN0cmVhbTooaWRcPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dDsKKy8qIE9iakMgc3RhcnQgYWN0aW9ucy5sZXhlci5tZXRob2RzRGVjbCAqLworPGFjdGlvbnMubGV4ZXIubWV0aG9kc0RlY2w+CisvKiBPYmpDIGVuZCBhY3Rpb25zLmxleGVyLm1ldGhvZHNEZWNsICovCis8cnVsZXM6e3J1bGUgfAorLSAoPHJ1bGUucnVsZURlc2NyaXB0b3I6e3J1bGVEZXNjcmlwdG9yfDxyZXR1cm5UeXBlKCk+fT4pIDxpZighcnVsZS5ydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPm08cnVsZS5ydWxlTmFtZT48ZWxzZT48cnVsZS5ydWxlTmFtZT5fZnJhZ21lbnQ8ZW5kaWY+IDxpZihydWxlLnJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT48cnVsZS5ydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPjxlbmRpZj47IH07IHNlcGFyYXRvcj0iXG4iPjxcbj4KK0BlbmQgLyogZW5kIG9mIDxjbGFzc05hbWUoKT4gaW50ZXJmYWNlICovPFxuPgorPj4KKworaGVhZGVyUmV0dXJuU2NvcGUocnVsZURlc2NyaXB0b3IpIDo6PSAiPHJldHVyblNjb3BlSW50ZXJmYWNlKC4uLik+IgoraGVhZGVyUmV0dXJuVHlwZShydWxlRGVzY3JpcHRvcikgOjo9IDw8Cis8aWYoTEVYRVIpPgorPGlmKCFyLnJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cisgdm9pZAorPGVsc2U+CisgPHJ1bGVEZXNjcmlwdG9yOnJldHVyblR5cGUoKT4KKzxlbmRpZj4KKzxlbHNlPgorIDxydWxlRGVzY3JpcHRvcjpyZXR1cm5UeXBlKCk+Cis8ZW5kaWY+Cis+PgorLy8gUHJvZHVjZSB0aGUgbGV4ZXIgb3V0cHV0CitsZXhlciggIGdyYW1tYXIsCisgICAgICAgIG5hbWUsCisgICAgICAgIHRva2VucywKKyAgICAgICAgc2NvcGVzLAorICAgICAgICBydWxlcywKKyAgICAgICAgbnVtUnVsZXMsCisgICAgICAgIGZpbHRlck1vZGUsCisgICAgICAgIGxhYmVsVHlwZT0iQU5UTFJDb21tb25Ub2tlbiIsCisgICAgICAgIHN1cGVyQ2xhc3M9IkFOVExSTGV4ZXIiCisgICAgICAgICkgOjo9IDw8Cis8Y3ljbGljREZBczpjeWNsaWNERkEoKT4KKworLyoqIEFzIHBlciBUZXJlbmNlOiBObyByZXR1cm5zIGZvciBsZXhlciBydWxlcyEgKi8KKzwhCisjcHJhZ21hIG1hcmsgUnVsZSByZXR1cm4gc2NvcGVzIHN0YXJ0Cis8cnVsZXM6e3J1bGUgfCA8cnVsZS5ydWxlRGVzY3JpcHRvcjp7cnVsZURlc2NyaXB0b3IgfCAKKzxyZXR1cm5TY29wZUltcGxlbWVudGF0aW9uKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT59PgorfT4KKyNwcmFnbWEgbWFyayBSdWxlIHJldHVybiBzY29wZXMgZW5kCishPgorQGltcGxlbWVudGF0aW9uIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiAvLyBsaW5lIDMzMAorCisrICh2b2lkKSBpbml0aWFsaXplCit7CisgICAgW0FOVExSQmFzZVJlY29nbml6ZXIgc2V0R3JhbW1hckZpbGVOYW1lOkAiPGZpbGVOYW1lPiJdOworfQorCisrIChOU1N0cmluZyAqKSB0b2tlbk5hbWVGb3JUeXBlOihOU0ludGVnZXIpYVRva2VuVHlwZQoreworICAgIHJldHVybiBbW3NlbGYgZ2V0VG9rZW5OYW1lc10gb2JqZWN0QXRJbmRleDphVG9rZW5UeXBlXTsKK30KKworKyAoPGdyYW1tYXIucmVjb2duaXplck5hbWU+ICopbmV3PGdyYW1tYXIucmVjb2duaXplck5hbWU+V2l0aENoYXJTdHJlYW06KGlkXDxBTlRMUkNoYXJTdHJlYW0+KWFuSW5wdXQKK3sKKyAgICByZXR1cm4gW1s8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gYWxsb2NdIGluaXRXaXRoQ2hhclN0cmVhbTphbklucHV0XTsKK30KKworLSAoaWQpIGluaXRXaXRoQ2hhclN0cmVhbTooaWRcPEFOVExSQ2hhclN0cmVhbT4pYW5JbnB1dAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhDaGFyU3RyZWFtOmFuSW5wdXQgU3RhdGU6W0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlIG5ld0FOVExSUmVjb2duaXplclNoYXJlZFN0YXRlV2l0aFJ1bGVMZW46PG51bVJ1bGVzPisxXV07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKzxpZihtZW1vaXplKT4KKyAgICAgICAgaWYgKCBzdGF0ZS5ydWxlTWVtbyA9PSBuaWwgKSB7CisgICAgICAgICAgICBzdGF0ZS5ydWxlTWVtbyA9IFtbQU5UTFJSdWxlU3RhY2sgbmV3QU5UTFJSdWxlU3RhY2tXaXRoU2l6ZTo8bnVtUnVsZXM+KzFdIHJldGFpbl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBbc3RhdGUucnVsZU1lbW8gY291bnRdID09IDAgKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBtZW1vaXphdGlvbiBjYWNoZSAtIHRoZSBpbmRpY2VzIGFyZSAxLWJhc2VkIGluIHRoZSBydW50aW1lIGNvZGUhCisgICAgICAgICAgICA8ISBbc3RhdGUucnVsZU1lbW8gYWRkT2JqZWN0OltOU051bGwgbnVsbF1dOyAgICAgLyogZHVtbXkgZW50cnkgdG8gZW5zdXJlIDEtYmFzZWRuZXNzLiAqLyAhPgorICAgICAgICAgICAgZm9yIChOU0ludGVnZXIgaSA9IDA7IGkgXDwgPG51bVJ1bGVzPjsgaSsrKSB7CisgICAgICAgICAgICAgICAgW3N0YXRlLnJ1bGVNZW1vIGFkZE9iamVjdDpbQU5UTFJIYXNoUnVsZSBuZXdBTlRMUkhhc2hSdWxlV2l0aExlbjoxN11dOworICAgICAgICAgICAgfQorICAgICAgICB9Cis8ZW5kaWY+CisgICAgICAgIDxzeW5wcmVkczp7cHJlZCB8IDxsZXhlclN5bnByZWQobmFtZT1wcmVkKT59O3NlcGFyYXRvcj0iXG4iPgorICAgICAgICA8Y3ljbGljREZBczp7ZGZhIHwgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBbREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gbmV3REZBPGRmYS5kZWNpc2lvbk51bWJlcj5XaXRoUmVjb2duaXplcjpzZWxmXTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGFjdGlvbnMubGV4ZXIuaW5pdD4KKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIGRlYWxsb2MKK3sKKyAgICA8Y3ljbGljREZBczp7ZGZhIHwgW2RmYTxkZmEuZGVjaXNpb25OdW1iZXI+IHJlbGVhc2VdO307IHNlcGFyYXRvcj0iXG4iPgorPGFjdGlvbnMubGV4ZXIuZGVhbGxvYz4KKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy8qIE9iakMgU3RhcnQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCis8YWN0aW9ucy5sZXhlci5tZXRob2RzPgorLyogT2JqQyBlbmQgb2YgYWN0aW9ucy5sZXhlci5tZXRob2RzICovCisvKiBPYmpDIHN0YXJ0IG1ldGhvZHMoKSAqLworPEBtZXRob2RzKCk+CisvKiBPYmpDIGVuZCBtZXRob2RzKCkgKi8KKworPGlmKGFjdGlvbnMubGV4ZXIucmVzZXQpPgorLSAodm9pZCkgcmVzZXQKK3sKKyAgICA8YWN0aW9ucy5sZXhlci5yZXNldD4KKyAgICBbc3VwZXIgcmVzZXRdOworfQorPGVuZGlmPgorCis8aWYoZmlsdGVyTW9kZSk+Cis8ZmlsdGVyaW5nTmV4dFRva2VuKCk+Cis8ZW5kaWY+CisvKiBTdGFydCBvZiBSdWxlcyAqLworPHJ1bGVzOyBzZXBhcmF0b3I9IlxuIj4KKworQGVuZCAvKiBlbmQgb2YgPGdyYW1tYXIucmVjb2duaXplck5hbWU+IGltcGxlbWVudGF0aW9uIGxpbmUgMzk3ICovCis+PgorCisvKiogQSBvdmVycmlkZSBvZiBMZXhlci5uZXh0VG9rZW4oKSB0aGF0IGJhY2t0cmFja3Mgb3ZlciBtVG9rZW5zKCkgbG9va2luZworICogIGZvciBtYXRjaGVzLiAgTm8gZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCB1cG9uIGVycm9yOyBqdXN0IHJld2luZCwgY29uc3VtZQorICogIGEgdG9rZW4gYW5kIHRoZW4gdHJ5IGFnYWluLiAgYmFja3RyYWNraW5nIG5lZWRzIHRvIGJlIHNldCBhcyB3ZWxsLgorICogIE1ha2UgcnVsZSBtZW1vaXphdGlvbiBoYXBwZW4gb25seSBhdCBsZXZlbHMgYWJvdmUgMSBhcyB3ZSBzdGFydCBtVG9rZW5zCisgKiAgYXQgYmFja3RyYWNraW5nPT0xLgorICovCitmaWx0ZXJpbmdOZXh0VG9rZW4oKSA6Oj0gPDwKKy0gKGlkXDxBTlRMUlRva2VuPikgbmV4dFRva2VuCit7CisgICAgd2hpbGUgKFlFUykgeworICAgICAgICBpZiAoIFtpbnB1dCBMQToxXSA9PSBBTlRMUkNoYXJTdHJlYW1FT0YgKSB7CisgICAgICAgICAgICByZXR1cm4gWzxsYWJlbFR5cGU+IGVvZlRva2VuXTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS50b2tlbiA9IG5pbDsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IEFOVExSVG9rZW5DaGFubmVsRGVmYXVsdDsKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LmluZGV4OworICAgICAgICBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gaW5wdXQuY2hhclBvc2l0aW9uSW5MaW5lOworICAgICAgICBzdGF0ZS50b2tlblN0YXJ0TGluZSA9IGlucHV0LmxpbmU7CisgICAgICAgIHN0YXRlLnRleHQgPSBuaWw7CisgICAgICAgIEB0cnkgeworICAgICAgICAgICAgTlNJbnRlZ2VyIG0gPSBbaW5wdXQgbWFya107CisgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcgPSAxOyAvKiBtZWFucyB3ZSB3b24ndCB0aHJvdyBzbG93IGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgc3RhdGUuZmFpbGVkID0gTk87CisgICAgICAgICAgICBbc2VsZiBtVG9rZW5zXTsKKyAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZyA9IDA7CisgICAgICAgICAgICAvKiBtVG9rZW5zIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorICAgICAgICAgICAgICAgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAqLworICAgICAgICAgICAgaWYgKCBzdGF0ZS5mYWlsZWQgKSB7CisgICAgICAgICAgICAgICAgW2lucHV0IHJld2luZDptXTsKKyAgICAgICAgICAgICAgICBbaW5wdXQgY29uc3VtZV07IC8qIGFkdmFuY2Ugb25lIGNoYXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBbc2VsZiBlbWl0XTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiBpbiBiYWNrdHJhY2tpbmcgbW9kZSwgYnV0Li4uCisgICAgICAgICAgICBbc2VsZiByZXBvcnRFcnJvcjpyZV07CisgICAgICAgICAgICBbc2VsZiByZWNvdmVyOnJlXTsKKyAgICAgICAgfQorICAgIH0KK30KKworLSAodm9pZCltZW1vaXplOihpZFw8QU5UTFJJbnRTdHJlYW1cPilhbklucHV0CisgICAgICBSdWxlSW5kZXg6KE5TSW50ZWdlcilydWxlSW5kZXgKKyAgICAgU3RhcnRJbmRleDooTlNJbnRlZ2VyKXJ1bGVTdGFydEluZGV4Cit7CisgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAxICkgW3N1cGVyIG1lbW9pemU6YW5JbnB1dCBSdWxlSW5kZXg6cnVsZUluZGV4IFN0YXJ0SW5kZXg6cnVsZVN0YXJ0SW5kZXhdOworfQorCistIChCT09MKWFscmVhZHlQYXJzZWRSdWxlOihpZFw8QU5UTFJJbnRTdHJlYW1cPilhbklucHV0IFJ1bGVJbmRleDooTlNJbnRlZ2VyKXJ1bGVJbmRleAoreworICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMSApIHJldHVybiBbc3VwZXIgYWxyZWFkeVBhcnNlZFJ1bGU6YW5JbnB1dCBSdWxlSW5kZXg6cnVsZUluZGV4XTsKKyAgICByZXR1cm4gTk87Cit9Cis+PgorCithY3Rpb25HYXRlKCkgOjo9ICJzdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCIKKworZmlsdGVyaW5nQWN0aW9uR2F0ZSgpIDo6PSAic3RhdGUuYmFja3RyYWNraW5nID09IDEiCisKK3BhcnNlckhlYWRlckZpbGUoIExFWEVSLAorICAgICAgICAgICAgUEFSU0VSLAorICAgICAgICAgICAgVFJFRV9QQVJTRVIsCisgICAgICAgICAgICBhY3Rpb25TY29wZSwKKyAgICAgICAgICAgIGFjdGlvbnMsCisgICAgICAgICAgICBkb2NDb21tZW50LAorICAgICAgICAgICAgcmVjb2duaXplciwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB0b2tlbnMsCisgICAgICAgICAgICB0b2tlbk5hbWVzLAorICAgICAgICAgICAgcnVsZXMsCisgICAgICAgICAgICBjeWNsaWNERkFzLAorICAgICAgICAgICAgYml0c2V0cywKKyAgICAgICAgICAgIGJ1aWxkVGVtcGxhdGUsCisgICAgICAgICAgICBwcm9maWxlLAorICAgICAgICAgICAgYmFja3RyYWNraW5nLAorICAgICAgICAgICAgc3lucHJlZHMsCisgICAgICAgICAgICBtZW1vaXplLAorICAgICAgICAgICAgbnVtUnVsZXMsCisgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgIEFOVExSVmVyc2lvbiwKKyAgICAgICAgICAgIGdlbmVyYXRlZFRpbWVzdGFtcCwKKyAgICAgICAgICAgIHRyYWNlLAorICAgICAgICAgICAgc2NvcGVzLAorICAgICAgICAgICAgbGl0ZXJhbHMsCisgICAgICAgICAgICBzdXBlckNsYXNzPSJBTlRMUlBhcnNlciIKKyAgICAgICAgICAgICkgOjo9IDw8CisvKiBwYXJzZXJIZWFkZXJGaWxlICovCis8Z2VuZXJpY1BhcnNlckhlYWRlckZpbGUoaW5wdXRTdHJlYW1UeXBlPSJpZFw8QU5UTFJUb2tlblN0cmVhbT4iLC4uLik+Cis+PgorCit0cmVlUGFyc2VySGVhZGVyRmlsZSggTEVYRVIsCisgICAgICAgICAgICBQQVJTRVIsCisgICAgICAgICAgICBUUkVFX1BBUlNFUiwKKyAgICAgICAgICAgIGFjdGlvblNjb3BlLAorICAgICAgICAgICAgYWN0aW9ucywKKyAgICAgICAgICAgIGRvY0NvbW1lbnQsCisgICAgICAgICAgICByZWNvZ25pemVyLAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHRva2VucywKKyAgICAgICAgICAgIHRva2VuTmFtZXMsCisgICAgICAgICAgICBydWxlcywKKyAgICAgICAgICAgIGN5Y2xpY0RGQXMsCisgICAgICAgICAgICBiaXRzZXRzLAorICAgICAgICAgICAgYnVpbGRUZW1wbGF0ZSwKKyAgICAgICAgICAgIHByb2ZpbGUsCisgICAgICAgICAgICBiYWNrdHJhY2tpbmcsCisgICAgICAgICAgICBzeW5wcmVkcywKKyAgICAgICAgICAgIG1lbW9pemUsCisgICAgICAgICAgICBudW1SdWxlcywKKyAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgQU5UTFJWZXJzaW9uLAorICAgICAgICAgICAgZ2VuZXJhdGVkVGltZXN0YW1wLAorICAgICAgICAgICAgdHJhY2UsCisgICAgICAgICAgICBzY29wZXMsCisgICAgICAgICAgICBsaXRlcmFscywKKyAgICAgICAgICAgIHN1cGVyQ2xhc3M9IkFOVExSVHJlZVBhcnNlciIKKyAgICAgICAgICAgICkgOjo9IDw8CisvKiB0cmVlUGFyc2VySGVhZGVyRmlsZSAqLworPGdlbmVyaWNQYXJzZXJIZWFkZXJGaWxlKGlucHV0U3RyZWFtVHlwZT0iaWRcPEFOVExSVHJlZU5vZGVTdHJlYW0+IiwuLi4pPgorPj4KKworZ2VuZXJpY1BhcnNlckhlYWRlckZpbGUoIExFWEVSLAorICAgICAgICAgICAgUEFSU0VSLAorICAgICAgICAgICAgVFJFRV9QQVJTRVIsCisgICAgICAgICAgICBhY3Rpb25TY29wZSwKKyAgICAgICAgICAgIGFjdGlvbnMsCisgICAgICAgICAgICBkb2NDb21tZW50LAorICAgICAgICAgICAgcmVjb2duaXplciwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICB0b2tlbnMsCisgICAgICAgICAgICB0b2tlbk5hbWVzLAorICAgICAgICAgICAgcnVsZXMsCisgICAgICAgICAgICBjeWNsaWNERkFzLAorICAgICAgICAgICAgYml0c2V0cywKKyAgICAgICAgICAgIGJ1aWxkVGVtcGxhdGUsCisgICAgICAgICAgICBwcm9maWxlLAorICAgICAgICAgICAgYmFja3RyYWNraW5nLAorICAgICAgICAgICAgc3lucHJlZHMsCisgICAgICAgICAgICBtZW1vaXplLAorICAgICAgICAgICAgbnVtUnVsZXMsCisgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgIEFOVExSVmVyc2lvbiwKKyAgICAgICAgICAgIGdlbmVyYXRlZFRpbWVzdGFtcCwKKyAgICAgICAgICAgIHRyYWNlLAorICAgICAgICAgICAgc2NvcGVzLAorICAgICAgICAgICAgc3VwZXJDbGFzcywKKyAgICAgICAgICAgIGxpdGVyYWxzLAorICAgICAgICAgICAgaW5wdXRTdHJlYW1UeXBlCisgICAgICAgICAgICApIDo6PQorPDwKKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkuaGVhZGVyKT4KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGlzIHdoYXQgdGhlIGdyYW1tYXIgcHJvZ3JhbW1lciBhc2tlZCB1cyB0byBwdXQgYXQgdGhlIHRvcCBvZiBldmVyeSBmaWxlLgorICovCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKy8qIEVuZCBvZiBIZWFkZXIgYWN0aW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworPGVuZGlmPgorCisjaWZuZGVmIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCisjZGVmaW5lIEFOVExSM1Rva2VuVHlwZUFscmVhZHlEZWZpbmVkCit0eXBlZGVmIGVudW0geworICAgIEFOVExSX0VPRiA9IC0xLAorICAgIElOVkFMSUQsCisgICAgRU9SLAorICAgIERPV04sCisgICAgVVAsCisgICAgTUlOCit9IEFOVExSM1Rva2VuVHlwZTsKKyNlbmRpZgorCis8Y3ljbGljREZBczpjeWNsaWNERkFJbnRlcmZhY2UoKT4KKyNwcmFnbWEgbWFyayBUb2tlbnMKKyNpZmRlZiBFT0YKKyN1bmRlZiBFT0YKKyNlbmRpZgorPHRva2Vuczp7aXQgfCAjZGVmaW5lIDxpdC5uYW1lPiA8aXQudHlwZT59OyBzZXBhcmF0b3I9IlxuIj4KKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBTY29wZXMgZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2UKKzxzY29wZXM6e2l0IHwgPGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2Uoc2NvcGU9aXQpPjxlbmRpZj59PgorI3ByYWdtYSBtYXJrIER5bmFtaWMgUnVsZSBTY29wZXMgcnVsZUF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlCis8cnVsZXM6e3J1bGUgfAorPHJ1bGUucnVsZURlc2NyaXB0b3I6eyBydWxlRGVzY3JpcHRvciB8IDxydWxlQXR0cmlidXRlU2NvcGVJbnRlcmZhY2Uoc2NvcGU9cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT59Pn0+CisjcHJhZ21hIG1hcmsgUnVsZSBSZXR1cm4gU2NvcGVzIHJldHVyblNjb3BlSW50ZXJmYWNlCis8cnVsZXM6e3J1bGUgfDxydWxlLnJ1bGVEZXNjcmlwdG9yOnsgcnVsZURlc2NyaXB0b3IgfCA8cmV0dXJuU2NvcGVJbnRlcmZhY2Uoc2NvcGU9cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUpPn0+fT4KKworLyogSW50ZXJmYWNlIGdyYW1tYXIgY2xhc3MgKi8KK0BpbnRlcmZhY2UgPGNsYXNzTmFtZSgpPiA8QHN1cGVyQ2xhc3NOYW1lPiA6IDxzdXBlckNsYXNzPjxAZW5kPiB7IC8qIGxpbmUgNTcyICovCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcyBydWxlQXR0cmlidXRlU2NvcGVEZWNsCis8cnVsZXM6e3J1bGUgfCA8cnVsZS5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6cnVsZUF0dHJpYnV0ZVNjb3BlRGVjbChzY29wZT1ydWxlLnJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+fT4KKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBSdWxlIFNjb3BlcyBnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhcgorPHNjb3Blczp7aXQgfCA8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZU1lbVZhcihzY29wZT1pdCk+PGVuZGlmPn0+PFxuPgorLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWVtVmFycyAqLworPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZW1WYXJzPgorLyogT2JqQyBlbmQgb2YgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1lbVZhcnMgKi8KKy8qIE9iakMgc3RhcnQgb2YgbWVtVmFycyAqLworPEBtZW1WYXJzKCk+CisvKiBPYmpDIGVuZCBvZiBtZW1WYXJzICovCisKKzxjeWNsaWNERkFzOntkZmEgfCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiAqZGZhPGRmYS5kZWNpc2lvbk51bWJlcj47fTsgc2VwYXJhdG9yPSJcbiI+Cis8c3lucHJlZHM6e3ByZWQgfCBTRUwgPHByZWQ+U2VsZWN0b3I7fTsgc2VwYXJhdG9yPSJcbiI+CisgfQorCisvKiBPYmpDIHN0YXJ0IG9mIGFjdGlvbnMuKGFjdGlvblNjb3BlKS5wcm9wZXJ0aWVzICovCis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnByb3BlcnRpZXM+CisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkucHJvcGVydGllcyAqLworLyogT2JqQyBzdGFydCBvZiBwcm9wZXJ0aWVzICovCis8QHByb3BlcnRpZXMoKT4KKy8qIE9iakMgZW5kIG9mIHByb3BlcnRpZXMgKi8KKworKyAodm9pZCkgaW5pdGlhbGl6ZTsKKysgKGlkKSBuZXc8Y2xhc3NOYW1lKCk+Oig8aW5wdXRTdHJlYW1UeXBlPilhU3RyZWFtOworLyogT2JqQyBzdGFydCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2w+CisvKiBPYmpDIGVuZCBvZiBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kc0RlY2wgKi8KKworLyogT2JqQyBzdGFydCBvZiBtZXRob2RzRGVjbCAqLworPEBtZXRob2RzRGVjbCgpPgorLyogT2JqQyBlbmQgb2YgbWV0aG9kc0RlY2wgKi8KKworPHJ1bGVzOntydWxlIHwKKy0gKDxydWxlLnJ1bGVEZXNjcmlwdG9yOntydWxlRGVzY3JpcHRvcnw8cmV0dXJuVHlwZSgpPn0+KTxpZighcnVsZS5ydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPjxydWxlLnJ1bGVOYW1lPjxlbHNlPjxydWxlLnJ1bGVOYW1lPl9mcmFnbWVudDxlbmRpZj48aWYocnVsZS5ydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZSk+PHJ1bGUucnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT48ZW5kaWY+OyB9OyBzZXBhcmF0b3I9IlxuIj48XG4+CisKK0BlbmQgLyogZW5kIG9mIDxjbGFzc05hbWUoKT4gaW50ZXJmYWNlICovPFxuPgorPj4KKworcGFyc2VyKCBncmFtbWFyLAorICAgICAgICBuYW1lLAorICAgICAgICBzY29wZXMsCisgICAgICAgIHRva2VucywKKyAgICAgICAgdG9rZW5OYW1lcywKKyAgICAgICAgcnVsZXMsCisgICAgICAgIG51bVJ1bGVzLAorICAgICAgICBiaXRzZXRzLAorICAgICAgICBBU1RMYWJlbFR5cGU9IkFOVExSQ29tbW9uVHJlZSIsCisgICAgICAgIHN1cGVyQ2xhc3M9IkFOVExSUGFyc2VyIiwKKyAgICAgICAgbGFiZWxUeXBlPSJBTlRMUkNvbW1vblRva2VuIiwKKyAgICAgICAgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fQorICAgICAgICApIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJpZFw8QU5UTFJUb2tlblN0cmVhbT4iLCByZXdyaXRlRWxlbWVudFR5cGU9IlRva2VuIiwgLi4uKT4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSB0cmVlIHBhcnNlcjsgc2FtZSBhcyBwYXJzZXIgZXhjZXB0IHRoZSBpbnB1dAorICogIHN0cmVhbSBpcyBhIGRpZmZlcmVudCB0eXBlLgorICovCit0cmVlUGFyc2VyKCBncmFtbWFyLAorICAgICAgICBuYW1lLAorICAgICAgICBzY29wZXMsCisgICAgICAgIHRva2VucywKKyAgICAgICAgdG9rZW5OYW1lcywKKyAgICAgICAgZ2xvYmFsQWN0aW9uLAorICAgICAgICBydWxlcywKKyAgICAgICAgbnVtUnVsZXMsCisgICAgICAgIGJpdHNldHMsCisgICAgICAgIGZpbHRlck1vZGUsCisgICAgICAgIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LAorICAgICAgICBBU1RMYWJlbFR5cGU9IkFOVExSQ29tbW9uVHJlZSIsCisgICAgICAgIHN1cGVyQ2xhc3M9ezxpZihmaWx0ZXJNb2RlKT48aWYoYnVpbGRBU1QpPkFOVExSVHJlZVJld3JpdGVyPGVsc2U+QU5UTFJUcmVlRmlsdGVyPGVuZGlmPjxlbHNlPkFOVExSVHJlZVBhcnNlcjxlbmRpZj59LAorICAgICAgICBtZW1iZXJzPXs8YWN0aW9ucy50cmVlcGFyc2VyLm1lbWJlcnM+fQorICAgICAgICApIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJpZFw8QU5UTFJUcmVlTm9kZVN0cmVhbT4iLCByZXdyaXRlRWxlbWVudFR5cGU9Ik5vZGUiLCAuLi4pPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHBhcnNlciAqLworZ2VuZXJpY1BhcnNlciggIGdyYW1tYXIsCisgICAgICAgIG5hbWUsCisgICAgICAgIHNjb3BlcywKKyAgICAgICAgdG9rZW5zLAorICAgICAgICB0b2tlbk5hbWVzLAorICAgICAgICBydWxlcywKKyAgICAgICAgbnVtUnVsZXMsCisgICAgICAgIGN5Y2xpY0RGQXMsICAgICAgICAgIC8vIHBhcnNlciBpbml0IC0tIGluaXRpYWxpemVzIHRoZSBERkFzCisgICAgICAgIGJpdHNldHMsCisgICAgICAgIGxhYmVsVHlwZSwKKyAgICAgICAgQVNUTGFiZWxUeXBlLAorICAgICAgICBzdXBlckNsYXNzLAorICAgICAgICBtZW1iZXJzLAorICAgICAgICBmaWx0ZXJNb2RlLAorICAgICAgICByZXdyaXRlRWxlbWVudFR5cGUsCisgICAgICAgIGlucHV0U3RyZWFtVHlwZQorICAgICAgICApIDo6PSA8PAorPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+CisKKyNwcmFnbWEgbWFyayBCaXRzZXRzCis8Yml0c2V0czp7aXQgfCA8Yml0c2V0KG5hbWU9e0ZPTExPV188aXQubmFtZT5faW5fPGl0LmluTmFtZT48aXQudG9rZW5JbmRleD59LCB3b3JkczY0PWl0LmJpdHMpPn0+CisKKyNwcmFnbWEgbWFyayBEeW5hbWljIEdsb2JhbCBnbG9iYWxBdHRyaWJ1dGVTY29wZUltcGxlbWVudGF0aW9uCis8c2NvcGVzOntpdCB8IDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW1wbGVtZW50YXRpb24oc2NvcGU9aXQpPjxlbmRpZj59PgorCisjcHJhZ21hIG1hcmsgRHluYW1pYyBSdWxlIFNjb3BlcyBydWxlQXR0cmlidXRlU2NvcGVJbXBsZW1lbnRhdGlvbgorPHJ1bGVzOntydWxlIHwKKzxydWxlLnJ1bGVEZXNjcmlwdG9yOnsgcnVsZURlc2NyaXB0b3IgfCA8cnVsZUF0dHJpYnV0ZVNjb3BlSW1wbGVtZW50YXRpb24oc2NvcGU9cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT59Pn0+CisKKyNwcmFnbWEgbWFyayBSdWxlIFJldHVybiBTY29wZXMgcmV0dXJuU2NvcGVJbXBsZW1lbnRhdGlvbgorPHJ1bGVzOntydWxlIHwgPHJ1bGUucnVsZURlc2NyaXB0b3I6eyBydWxlRGVzY3JpcHRvciB8IDxyZXR1cm5TY29wZUltcGxlbWVudGF0aW9uKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT59Pn0+CisKK0BpbXBsZW1lbnRhdGlvbiA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gIC8vIGxpbmUgNjM3CisKKyNwcmFnbWEgbWFyayBEeW5hbWljIFJ1bGUgU2NvcGVzIHJ1bGVBdHRyaWJ1dGVTY29wZQorPHJ1bGVzOntydWxlIHwgPHJ1bGUucnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOnJ1bGVBdHRyaWJ1dGVTY29wZSgpPn0+CisjcHJhZ21hIG1hcmsgZ2xvYmFsIEF0dHJpYnV0ZSBTY29wZXMgZ2xvYmFsQXR0cmlidXRlU2NvcGUKKzxzY29wZXM6e2l0IHwgPGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoKT48ZW5kaWY+fT4KKy8qIE9iakMgc3RhcnQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnRoZXNpemUgKi8KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3ludGhlc2l6ZT4KKy8qIE9iakMgc3RhcnQgc3ludGhlc2l6ZSgpICovCis8QHN5bnRoZXNpemUoKT4KKworKyAodm9pZCkgaW5pdGlhbGl6ZQoreworICAgICNwcmFnbWEgbWFyayBCaXRzZXRzCisgICAgPGJpdHNldHM6e2l0IHwgPGJpdHNldEluaXQobmFtZT17Rk9MTE9XXzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4Pn0sIHdvcmRzNjQ9aXQuYml0cyk+fT4KKyAgICBbQU5UTFJCYXNlUmVjb2duaXplciBzZXRUb2tlbk5hbWVzOltbQU11dGFibGVBcnJheSBhcnJheVdpdGhPYmplY3RzOkAiXDxpbnZhbGlkPiIsIEAiXDxFT1I+IiwgQCJcPERPV04+IiwgQCJcPFVQPiIsIDx0b2tlbk5hbWVzOntpdCB8IEA8aXQ+fTsgc2VwYXJhdG9yPSIsICIsIHdyYXA9IlxuICI+LCBuaWxdIHJldGFpbl1dOworICAgIFtBTlRMUkJhc2VSZWNvZ25pemVyIHNldEdyYW1tYXJGaWxlTmFtZTpAIjxmaWxlTmFtZT4iXTsKKyAgICA8c3lucHJlZHM6e3ByZWQgfCA8c3lucHJlZChwcmVkKT59PgorfQorCisrICg8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4gKiluZXc8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT46KDxpbnB1dFN0cmVhbVR5cGU+KWFTdHJlYW0KK3sKKzxpZihQQVJTRVIpPgorICAgIHJldHVybiBbWzxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiBhbGxvY10gaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtXTsKKzxlbHNlPjwhIFRSRUVfUEFSU0VSICE+CisgICAgcmV0dXJuIFtbPGdyYW1tYXIucmVjb2duaXplck5hbWU+IGFsbG9jXSBpbml0V2l0aFN0cmVhbTphU3RyZWFtXTsKKzxlbmRpZj4KK30KKworPGlmKFBBUlNFUik+CistIChpZCkgaW5pdFdpdGhUb2tlblN0cmVhbTooPGlucHV0U3RyZWFtVHlwZT4pYVN0cmVhbQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhUb2tlblN0cmVhbTphU3RyZWFtIFN0YXRlOltBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZSBuZXdBTlRMUlJlY29nbml6ZXJTaGFyZWRTdGF0ZVdpdGhSdWxlTGVuOjxudW1SdWxlcz4rMV1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7Cis8ZWxzZT48ISBUUkVFX1BBUlNFUiAhPgorLSAoaWQpIGluaXRXaXRoU3RyZWFtOig8aW5wdXRTdHJlYW1UeXBlPilhU3RyZWFtCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aFN0cmVhbTphU3RyZWFtIFN0YXRlOltbQU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGUgbmV3QU5UTFJSZWNvZ25pemVyU2hhcmVkU3RhdGVXaXRoUnVsZUxlbjo8bnVtUnVsZXM+KzFdIHJldGFpbl1dOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7Cis8ZW5kaWY+CisgICAgICAgIDwhIDxwYXJzZXJDdG9yQm9keSgpPiAhPgorICAgICAgICA8Y3ljbGljREZBczp7ZGZhIHwgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBbREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gbmV3REZBPGRmYS5kZWNpc2lvbk51bWJlcj5XaXRoUmVjb2duaXplcjpzZWxmXTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPHNjb3Blczp7aXQgfCA8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZUluaXQoc2NvcGU9aXQpPjxlbmRpZj59PgorICAgICAgICA8cnVsZXM6e3J1bGUgfCA8cnVsZS5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6cnVsZUF0dHJpYnV0ZVNjb3BlSW5pdCgpPn0+CisgICAgICAgIC8qIHN0YXJ0IG9mIGFjdGlvbnMtYWN0aW9uU2NvcGUtaW5pdCAqLworICAgICAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmluaXQ+CisgICAgICAgIC8qIHN0YXJ0IG9mIGluaXQgKi8KKyAgICAgICAgPEBpbml0KCk+CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKSBkZWFsbG9jCit7CisgICAgPGN5Y2xpY0RGQXM6e2RmYSB8IFtkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPiByZWxlYXNlXTt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8c2NvcGVzOntpdCB8IDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlRGVhbGxvYyhzY29wZT1pdCk+PGVuZGlmPn0+CisgICAgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5kZWFsbG9jPgorICAgIDxAZGVhbGxvYygpPgorICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLyogT2JqQyBzdGFydCBhY3Rpb25zLihhY3Rpb25TY29wZSkubWV0aG9kcyAqLworPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tZXRob2RzPgorLyogT2JqQyBlbmQgYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1ldGhvZHMgKi8KKy8qIE9iakMgc3RhcnQgbWV0aG9kcygpICovCis8QG1ldGhvZHMoKT4KKy8qIE9iakMgZW5kIG1ldGhvZHMoKSAqLworLyogT2JqQyBzdGFydCBydWxlcyAqLworPHJ1bGVzOyBzZXBhcmF0b3I9IlxuIj4KKy8qIE9iakMgZW5kIHJ1bGVzICovCisKK0BlbmQgLyogZW5kIG9mIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiBpbXBsZW1lbnRhdGlvbiBsaW5lIDY5MiAqLzxcbj4KKz4+CisKK3BhcnNlckN0b3JCb2R5KCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+IC8qIHBhcnNlckN0b3JCb2R5ICovCis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KK3N0YXRlLnJ1bGVNZW1vID0gW1tBTlRMUlJ1bGVTdGFjayBuZXdBTlRMUlJ1bGVTdGFjazo8bnVtUnVsZXM+KzFdIHJldGFpbl07PFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKzxncmFtbWFyLmRlbGVnYXRvcnM6Cisge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT47fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCisvKiogQSBzaW1wbGVyIHZlcnNpb24gb2YgYSBydWxlIHRlbXBsYXRlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGltYWdpbmFyeQorICogIHJ1bGVzIGNyZWF0ZWQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLiAgQXMgdGhleSBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMKKyAqICBub3IgcGFyYW1ldGVycyBldGMuLi4sIGp1c3QgZ2l2ZSBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbworICogIGFueSBvZiB0aGUgbm9ybWFsIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuCisgKiAgQXMgcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5IG5lZWQgdG8KKyAqICBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAqLworc3lucHJlZFJ1bGUocnVsZU5hbWUsIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgZGVzY3JpcHRpb24sIG5ha2VkQmxvY2spIDo6PQorPDwKKy8vICRBTlRMUiBzdGFydCA8cnVsZU5hbWU+X2ZyYWdtZW50CistICh2b2lkKSA8cnVsZU5hbWU+X2ZyYWdtZW50Cit7CisgICAgPHJ1bGVMYWJlbERlZnMoKT4KKyAgICA8aWYodHJhY2UpPgorICAgICAgICBbc2VsZiB0cmFjZUluOlxAIjxydWxlTmFtZT5fZnJhZ21lbnQiIEluZGV4OjxydWxlRGVzY3JpcHRvci5pbmRleD5dOworICAgIEB0cnkgeworICAgICAgICA8YmxvY2s+CisgICAgfQorICAgIEBmaW5hbGx5IHsKKyAgICAgICAgW3NlbGYgdHJhY2VPdXQ6XEAiPHJ1bGVOYW1lPl9mcmFnbWVudCIgSW5kZXg6PHJ1bGVEZXNjcmlwdG9yLmluZGV4Pl07CisgICAgfQorPGVsc2U+CisgICAgPGJsb2NrPgorPGVuZGlmPgorfSAvLyAkQU5UTFIgZW5kIDxydWxlTmFtZT5fZnJhZ21lbnQKKz4+CisKK3N5bnByZWQobmFtZSkgOjo9IDw8CitTRUwgPG5hbWU+U2VsZWN0b3IgPSBAc2VsZWN0b3IoPG5hbWU+X2ZyYWdtZW50KTsKKzwhIC8vICRBTlRMUiBzdGFydCA8bmFtZT4KKy0gKEJPT0wpIDxuYW1lPgoreworICAgIHN0YXRlLmJhY2t0cmFja2luZysrOworICAgIDxAc3RhcnQoKT4KKyAgICBOU0ludGVnZXIgc3RhcnQgPSBbaW5wdXQgbWFya107CisgICAgQHRyeSB7CisgICAgICAgIFtzZWxmIDxuYW1lPl9mcmFnbWVudF07IC8vIGNhbiBuZXZlciB0aHJvdyBleGNlcHRpb24KKyAgICB9CisgICAgQGNhdGNoIChBTlRMUlJlY29nbml0aW9uRXhjZXB0aW9uICpyZSkgeworICAgICAgICBOU0xvZyhAImltcG9zc2libGU6ICVAXG4iLCByZS5uYW1lKTsKKyAgICB9CisgICAgQk9PTCBzdWNjZXNzID0gKHN0YXRlLmZhaWxlZCA9PSBOTyk7CisgICAgW2lucHV0IHJld2luZDpzdGFydF07CisgICAgPEBzdG9wKCk+CisgICAgc3RhdGUuYmFja3RyYWNraW5nLS07CisgICAgc3RhdGUuZmFpbGVkPU5POworICAgIHJldHVybiBzdWNjZXNzOworfSAvLyAkQU5UTFIgZW5kIDxuYW1lPiA8XG4+ICE+Cis+PgorCitsZXhlclN5bnByZWQobmFtZSkgOjo9IDw8Cis8c3lucHJlZChuYW1lKT4KKz4+CisKK3J1bGVNZW1vaXphdGlvbihuYW1lKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KK2lmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCAmJiBbc2VsZiBhbHJlYWR5UGFyc2VkUnVsZTppbnB1dCBSdWxlSW5kZXg6PHJ1bGVEZXNjcmlwdG9yLmluZGV4Pl0gKSB7IHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OyB9Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIHRlc3QgZm9yIGZhaWx1cmUgYW5kIHJldHVybiBmcm9tIHJ1bGUgKi8KK2NoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZiAoYmFja3RyYWNraW5nKT5pZiAoIHN0YXRlLmZhaWxlZCApIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OzxlbmRpZj4KKz4+CisKKy8qKiBUaGlzIHJ1bGUgaGFzIGZhaWxlZCwgZXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgZHVyaW5nIGJhY2t0cmFjayAqLworcnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmICggc3RhdGUuYmFja3RyYWNraW5nID4gMCApIHsgc3RhdGUuZmFpbGVkID0gWUVTOyByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjsgfTxcbj48ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcnVsZS4KKyAqICBUaGUgcmV0dXJuIHR5cGUgYWdncmVnYXRlcyBhcmUgZGVjbGFyZWQgaW4gdGhlIGhlYWRlciBmaWxlIChoZWFkZXJGaWxlIHRlbXBsYXRlKQorICovCitydWxlKHJ1bGVOYW1lLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLGVtcHR5UnVsZSxkZXNjcmlwdGlvbixleGNlcHRpb25zLGZpbmFsbHksbWVtb2l6ZSkgOjo9IDw8CisKKy8qCisgKiAkQU5UTFIgc3RhcnQgPHJ1bGVOYW1lPgorICogPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CisgKi8KKy0gKDxyZXR1cm5UeXBlKCk+KSA8cnVsZU5hbWU+PHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+Cit7CisgICAgPGlmKHRyYWNlKT5bc2VsZiB0cmFjZUluOlxAIjxydWxlTmFtZT4iIEluZGV4OjxydWxlRGVzY3JpcHRvci5pbmRleD5dOzxlbmRpZj4KKyAgICA8aWYodHJhY2UpPk5TTG9nKEAiZW50ZXIgPHJ1bGVOYW1lPiAlQCBmYWlsZWQ9JUAgYmFja3RyYWNraW5nPSVkIiwgW2lucHV0IExUOjFdLCAoc3RhdGUuZmFpbGVkPT1ZRVMpP0AiWUVTIjpAIk5PIiwgc3RhdGUuYmFja3RyYWNraW5nKTs8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICA8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorICAgIDxAcHJlYW1ibGUoKT4KKyAgICBAdHJ5IHsKKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPHJ1bGVMYWJlbERlZnMoKT4KKyAgICAgICAgPGJsb2NrPgorICAgICAgICA8cnVsZUNsZWFuVXAoKT4KKyAgICAgICAgPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWN0aW9uKCk+CisgICAgfQorPGlmKGV4Y2VwdGlvbnMpPgorICAgIDxleGNlcHRpb25zOntlfDxjYXRjaChkZWNsPWUuZGVjbCxhY3Rpb249ZS5hY3Rpb24pPjxcbj59PgorPGVsc2U+PGlmKCFlbXB0eVJ1bGUpPjxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoKT4KKyAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaD4KKzxlbHNlPgorICAgIEBjYXRjaCAoQU5UTFJSZWNvZ25pdGlvbkV4Y2VwdGlvbiAqcmUpIHsKKyAgICAgICAgW3NlbGYgcmVwb3J0RXJyb3I6cmVdOworICAgICAgICBbc2VsZiByZWNvdmVyOmlucHV0IEV4Y2VwdGlvbjpyZV07CisgICAgICAgIDxAc2V0RXJyb3JSZXR1cm5WYWx1ZSgpPgorICAgIH08XG4+Cis8ZW5kaWY+PGVuZGlmPjxlbmRpZj4KKyAgICBAZmluYWxseSB7CisgICAgICAgIDxpZih0cmFjZSk+W3NlbGYgdHJhY2VPdXQ6QCI8cnVsZU5hbWU+IiBJbmRleDo8cnVsZURlc2NyaXB0b3IuaW5kZXg+XTs8ZW5kaWY+CisgICAgICAgIDxtZW1vaXplKCk+CisgICAgICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgICAgIDxmaW5hbGx5PgorICAgIH0KKyAgICA8QHBvc3RhbWJsZSgpPgorICAgIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+OworfQorLyogJEFOVExSIGVuZCA8cnVsZU5hbWU+ICovCis+PgorCitmaW5hbENvZGUoZmluYWxCbG9jaykgOjo9IDw8Cit7CisgICAgPGZpbmFsQmxvY2s+Cit9Cis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitAY2F0Y2ggKDxlLmRlY2w+KSB7CisgICAgPGUuYWN0aW9uPgorfQorPj4KKworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorLyogcnVsZURlY2xhcmF0aW9ucyAqLworPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxyZXR1cm5UeXBlKCk+IHJldHZhbCA9IFs8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiBuZXc8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPl07CitbcmV0dmFsIHNldFN0YXJ0OltpbnB1dCBMVDoxXV07PFxuPgorPGVsc2U+Cis8cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlczp7IGEgfAorPGEudHlwZT4gPGEubmFtZT4gPSA8aWYoYS5pbml0VmFsdWUpPjxhLmluaXRWYWx1ZT48ZWxzZT48aW5pdFZhbHVlKGEudHlwZSk+PGVuZGlmPjsKK30+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+CitOU0ludGVnZXIgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSBpbnB1dC5pbmRleDsKKzxlbmRpZj4KKz4+CisKK3J1bGVTY29wZVNldFVwKCkgOjo9IDw8CisvKiBydWxlU2NvcGVTZXRVcCAqLworPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7aXQgfCBbPGl0Pl9zdGFjayBwdXNoOls8aXQ+X1Njb3BlIG5ldzxpdD5fU2NvcGVdXTt9PgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7aXQgfCBbPGl0Lm5hbWU+X3N0YWNrIHB1c2g6WzxpdC5uYW1lPl9TY29wZSBuZXc8aXQubmFtZT5fU2NvcGVdXTt9PgorPj4KKworcnVsZVNjb3BlQ2xlYW5VcCgpIDo6PSA8PAorLyogcnVsZVNjb3BlQ2xlYW5VcCAqLworPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7aXQgfCBbPGl0Pl9zdGFjayBwb3BdO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7aXQgfCBbPGl0Lm5hbWU+X3N0YWNrIHBvcF07fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLCBydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXQgfCA8bGFiZWxUeXBlPiAqPGl0LmxhYmVsLnRleHQ+ID0gbmlsO307IHNlcGFyYXRvcj0iXG4iPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMscnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHMscnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGlzdExhYmVsc10KKyAgICA6e2l0IHwgQU11dGFibGVBcnJheSAqbGlzdF88aXQubGFiZWwudGV4dD4gPSBuaWw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzOnJ1bGVMYWJlbERlZigpOyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsczp7bGx8QU5UTFJQYXJzZXJSdWxlUmV0dXJuU2NvcGUgKjxsbC5sYWJlbC50ZXh0PiA9IG5pbDt9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK2xleGVyUnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzXQorICAgIDp7aXQgfCA8bGFiZWxUeXBlPiAqPGl0LmxhYmVsLnRleHQ+PW5pbDt9OyBzZXBhcmF0b3I9IlxuIgorPgorPHJ1bGVEZXNjcmlwdG9yLmNoYXJMYWJlbHM6e2l0IHwgTlNJbnRlZ2VyIDxpdC5sYWJlbC50ZXh0Pjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc106e2l0IHwgQU11dGFibGVBcnJheSAqbGlzdF88aXQubGFiZWwudGV4dD49bmlsOyB9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3J1bGVSZXR1cm5WYWx1ZSgpIDo6PSA8JQorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+Cis8cnVsZURlc2NyaXB0b3Iuc2luZ2xlVmFsdWVSZXR1cm5OYW1lPgorPGVsc2U+CityZXR2YWwKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKyU+CisKK3J1bGVDbGVhblVwKCkgOjo9IDw8CisvKiB0b2tlbitydWxlIGxpc3QgbGFiZWxzICovCis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsc106e2l0IHwgW2xpc3RfPGl0LmxhYmVsLnRleHQ+IHJlbGVhc2VdO307IHNlcGFyYXRvcj0iXG4iPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighVFJFRV9QQVJTRVIpPgorW3JldHZhbCBzZXRTdG9wOltpbnB1dCBMVDotMV1dOzxcbj4KKzxlbmRpZj48ZW5kaWY+Cis+PgorCittZW1vaXplKCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIChzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwKSBbc2VsZiBtZW1vaXplOmlucHV0IFJ1bGVJbmRleDo8cnVsZURlc2NyaXB0b3IuaW5kZXg+IFN0YXJ0SW5kZXg6PHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXhdOworPGVuZGlmPjxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsIG5ha2VkQmxvY2ssIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgbWVtb2l6ZSkgOjo9IDw8CisvLyAkQU5UTFIgc3RhcnQgIjxydWxlTmFtZT4iCistICh2b2lkKSBtPHJ1bGVOYW1lPjxpZihydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZSk+PHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT48ZW5kaWY+Cit7CisgICAgLy88aWYodHJhY2UpPltzZWxmIHRyYWNlSW46XEAiPHJ1bGVOYW1lPiIgSW5kZXg6PHJ1bGVEZXNjcmlwdG9yLmluZGV4Pl07PGVuZGlmPgorICAgIDxpZih0cmFjZSk+TlNMb2coQCJlbnRlciA8cnVsZU5hbWU+ICVDIGxpbmU9JWQ6JWQgZmFpbGVkPSVAIGJhY2t0cmFja2luZz0lZCIsCisgICAgICAgIFtpbnB1dCBMQToxXSwKKyAgICAgICAgc2VsZi5saW5lLAorICAgICAgICBzZWxmLmNoYXJQb3NpdGlvbkluTGluZSwKKyAgICAgICAgKHN0YXRlLmZhaWxlZD09WUVTKSA/IEAiWUVTIiA6IEAiTk8iLAorICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmcpOworICAgIDxlbmRpZj4KKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIEB0cnkgeworPGlmKG5ha2VkQmxvY2spPgorICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz48XG4+Cis8ZWxzZT4KKyAgICAgICAgTlNJbnRlZ2VyIF90eXBlID0gPHJ1bGVOYW1lPjsKKyAgICAgICAgTlNJbnRlZ2VyIF9jaGFubmVsID0gQU5UTFJUb2tlbkNoYW5uZWxEZWZhdWx0OworICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICA8KHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuYWZ0ZXIpOmV4ZWNBY3Rpb24oKT4KKzxlbmRpZj4KKyAgICB9CisgICAgQGZpbmFsbHkgeworICAgICAgICAvLzxpZih0cmFjZSk+W3NlbGYgdHJhY2VPdXQ6W05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8cnVsZU5hbWU+ICVkXG4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+XV07PGVuZGlmPgorICAgICAgICA8aWYodHJhY2UpPk5TTG9nKEAiZXhpdCA8cnVsZU5hbWU+ICVDIGxpbmU9JWQ6JWQgZmFpbGVkPSVAIGJhY2t0cmFja2luZz0lZCIsCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dCBMQToxXSwgc2VsZi5saW5lLCBzZWxmLmNoYXJQb3NpdGlvbkluTGluZSwKKyAgICAgICAgICAgICAgICAgICAgKHN0YXRlLmZhaWxlZD09WUVTKSA/IEAiWUVTIiA6IEAiTk8iLCBzdGF0ZS5iYWNrdHJhY2tpbmcpOzxlbmRpZj4KKyAgICAgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICAgICAgPG1lbW9pemUoKT4KKyAgICB9CisgICAgcmV0dXJuOworfQorLyogJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIgKi8KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorLSAodm9pZCkgbVRva2VucworeworICAgIDxibG9jaz48XG4+Cit9Cis+PgorCisvLyBTIFUgQiBSIFUgTCBFIFMKKworLyoqIEEgKC4uLikgc3VicnVsZSB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworYmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+IC8vIGJsb2NrCitOU0ludGVnZXIgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+Cis8QHByZWJyYW5jaCgpPgorc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisgICAgPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLCBhKT59PgorfQorPEBwb3N0YnJhbmNoKCk+Cis+PgorCisvKiogQSBydWxlIGJsb2NrIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRpdmVzICovCitydWxlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+IC8vcnVsZWJsb2NrCitOU0ludGVnZXIgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+Citzd2l0Y2ggKGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksIGEpPn0+Cit9Cis+PgorCitydWxlQmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+IC8vIHJ1bGVCbG9ja1NpbmdsZUFsdAorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSBzcGVjaWFsIGNhc2Ugb2YgYSAoLi4uKSBzdWJydWxlIHdpdGggYSBzaW5nbGUgYWx0ZXJuYXRpdmUgKi8KK2Jsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPiAvLyBibG9ja1NpbmdsZUFsdAorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSAoLi4pKyBibG9jayB3aXRoIDEgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPiAvLyBwb3NpdGl2ZUNsb3N1cmVCbG9jaworTlNJbnRlZ2VyIGNudDxkZWNpc2lvbk51bWJlcj4gPSAwOworPGRlY2xzPgorPEBwcmVsb29wKCk+CitkbyB7CisgICAgTlNJbnRlZ2VyIGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PjsKKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisgICAgICAgIDxhbHRzOnthIHwgPGFsdFN3aXRjaENhc2UoaSwgYSk+fT4KKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBpZiAoIGNudDxkZWNpc2lvbk51bWJlcj4gPj0gMSApCisgICAgICAgICAgICAgICAgZ290byBsb29wPGRlY2lzaW9uTnVtYmVyPjsKKyAgICAgICAgICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgICAgICAgICAgQU5UTFJFYXJseUV4aXRFeGNlcHRpb24gKmVlZSA9CisgICAgICAgICAgICAgICAgW0FOVExSRWFybHlFeGl0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjppbnB1dCBkZWNpc2lvbk51bWJlcjo8ZGVjaXNpb25OdW1iZXI+XTsKKyAgICAgICAgICAgIDxAZWFybHlFeGl0RXhjZXB0aW9uKCk+CisgICAgICAgICAgICBAdGhyb3cgZWVlOworICAgIH0KKyAgICBjbnQ8ZGVjaXNpb25OdW1iZXI+Kys7Cit9IHdoaWxlIChZRVMpOworbG9vcDxkZWNpc2lvbk51bWJlcj46IDsKKzxAcG9zdGxvb3AoKT4KKz4+CisKK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBwb3NpdGl2ZUNsb3N1cmVCbG9jaworCisvKiogQSAoLi4pKiBibG9jayB3aXRoIDAgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK2Nsb3N1cmVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK2RvIHsKKyAgICBOU0ludGVnZXIgYWx0PGRlY2lzaW9uTnVtYmVyPj08bWF4QWx0PjsKKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgc3dpdGNoIChhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisgICAgICAgIDxhbHRzOnthIHwgPGFsdFN3aXRjaENhc2UoaSwgYSk+fT4KKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBnb3RvIGxvb3A8ZGVjaXNpb25OdW1iZXI+OworICAgIH0KK30gd2hpbGUgKFlFUyk7Citsb29wPGRlY2lzaW9uTnVtYmVyPjogOworPEBwb3N0bG9vcCgpPgorPj4KKworY2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBjbG9zdXJlQmxvY2sKKworLyoqIE9wdGlvbmFsIGJsb2NrcyAoeCk/IGFyZSB0cmFuc2xhdGVkIHRvICh4fCkgYnkgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbgorICogIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJsb2NrIHRlbXBsYXRlCisgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBIGNhc2UgaW4gYSBzd2l0Y2ggdGhhdCBqdW1wcyB0byBhbiBhbHRlcm5hdGl2ZSBnaXZlbiB0aGUgYWx0ZXJuYXRpdmUKKyAqICBudW1iZXIuICBBIERGQSBwcmVkaWN0cyB0aGUgYWx0ZXJuYXRpdmUgYW5kIHRoZW4gYSBzaW1wbGUgc3dpdGNoCisgKiAgZG9lcyB0aGUganVtcCB0byB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IG1hdGNoZXMgdGhhdCBhbHRlcm5hdGl2ZS4KKyAqLworYWx0U3dpdGNoQ2FzZShhbHROdW0sIGFsdCkgOjo9IDw8CitjYXNlIDxhbHROdW0+IDogOworICAgIDxAcHJlYWx0KCk+CisgICAgPGFsdD4KKyAgICBicmVhazs8XG4+Cis+PgorCisvKiogQW4gYWx0ZXJuYXRpdmUgaXMganVzdCBhIGxpc3Qgb2YgZWxlbWVudHM7IGF0IG91dGVybW9zdCBsZXZlbCAqLworYWx0KGVsZW1lbnRzLGFsdE51bSxkZXNjcmlwdGlvbixhdXRvQVNULG91dGVyQWx0LHRyZWVMZXZlbCxyZXcpIDo6PSA8PAorLy8gPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+IC8vIGFsdAoreworPEBkZWNsYXJhdGlvbnMoKT4KKzxlbGVtZW50czplbGVtZW50KCk+Cis8cmV3PgorPEBjbGVhbnVwKCk+Cit9Cis+PgorCisvKiogV2hhdCB0byBlbWl0IHdoZW4gdGhlcmUgaXMgbm8gcmV3cml0ZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9ICIiCisKKy8vIEUgTCBFIE0gRSBOIFQgUworCisvKiogRHVtcCB0aGUgZWxlbWVudHMgb25lIHBlciBsaW5lICovCitlbGVtZW50KGUpIDo6PSA8PCA8QHByZW1hdGNoKCk+PFxuPjxlLmVsPjxcbj4gPj4KKworLyoqIG1hdGNoIGEgdG9rZW4gb3B0aW9uYWxseSB3aXRoIGEgbGFiZWwgaW4gZnJvbnQgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw+PSg8bGFiZWxUeXBlPiAqKTxlbmRpZj5bc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6PHRva2VuPiBGb2xsb3c6Rk9MTE9XXzx0b2tlbj5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+XTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBpZHMrPUlEICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCitsaXN0TGFiZWwobGFiZWwsZWxlbSkgOjo9IDw8CitpZiAobGlzdF88bGFiZWw+ID09IG5pbCkgbGlzdF88bGFiZWw+ID0gW1tBTXV0YWJsZUFycmF5IGFycmF5V2l0aENhcGFjaXR5OjVdIHJldGFpbl07CitbbGlzdF88bGFiZWw+IGFkZE9iamVjdDo8ZWxlbT5dOzxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciAqLworY2hhclJlZihjaGFyLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+TlNJbnRlZ2VyIDxsYWJlbD4gPSBbaW5wdXQgTEE6MV07PFxuPjxlbmRpZj4KK1tzZWxmIG1hdGNoQ2hhcjo8Y2hhcj5dOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciByYW5nZSAqLworY2hhclJhbmdlUmVmKGEsYixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPjxsYWJlbD4gPSBbaW5wdXQgTEE6MV07PFxuPjxlbmRpZj4KK1tzZWxmIG1hdGNoUmFuZ2VGcm9tQ2hhcjo8YT4gdG86PGI+XTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBGb3Igbm93LCBzZXRzIGFyZSBpbnRlcnZhbCB0ZXN0cyBhbmQgbXVzdCBiZSB0ZXN0ZWQgaW5saW5lICovCittYXRjaFNldChzLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMscG9zdG1hdGNoQ29kZT0iIikgOjo9IDw8Cis8aWYobGFiZWwpPgorPGlmKExFWEVSKT4KKzxsYWJlbD4gPSBbaW5wdXQgTEE6MV07PFxuPgorPGVsc2U+Cis8bGFiZWw+ID0gKDxsYWJlbFR5cGU+ICopW2lucHV0IExUOjFdOyAvKiBtYXRjaFNldCAqLzxcbj4KKzxlbmRpZj48ZW5kaWY+CitpZiAoPHM+KSB7CisgICAgW2lucHV0IGNvbnN1bWVdOworICAgIDxwb3N0bWF0Y2hDb2RlPgorPGlmKCFMRVhFUik+CisgICAgW3N0YXRlIHNldElzRXJyb3JSZWNvdmVyeTpOT107Cis8ZW5kaWY+CisgICAgPGlmKGJhY2t0cmFja2luZyk+c3RhdGUuZmFpbGVkID0gTk87PFxuPjxlbmRpZj4KK30gZWxzZSB7CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uICptc2UgPSBbQU5UTFJNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpuaWwgc3RyZWFtOmlucHV0XTsKKyAgICA8QG1pc21hdGNoZWRTZXRFeGNlcHRpb24oKT4KKzxpZihMRVhFUik+Cis8aWYobGFiZWwpPgorICAgIG1zZS5jID0gPGxhYmVsPjsKKzxlbmRpZj4KKyAgICBbc2VsZiByZWNvdmVyOm1zZV07CisgICAgQHRocm93IG1zZTsKKzxlbHNlPgorICAgIEB0aHJvdyBtc2U7CisgICAgPCEgdXNlIGZvbGxvd2luZyBjb2RlIHRvIG1ha2UgaXQgcmVjb3ZlciBpbmxpbmU7IHJlbW92ZSB0aHJvdyBtc2U7CisgICAgW3NlbGYgcmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0OmlucHV0IGV4Y2VwdGlvbjptc2UgZm9sbG93OkZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+XTsgIT4KKzxlbmRpZj4KK308XG4+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldCA6Oj0gbWF0Y2hTZXQKKworbWF0Y2hTZXRBbmRMaXN0TGFiZWwocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIGEgc3RyaW5nIGxpdGVyYWwgKi8KK2xleGVyU3RyaW5nUmVmKHN0cmluZyxsYWJlbCxlbGVtZW50SW5kZXg9IjAiKSA6Oj0gPDwKKzxpZihsYWJlbCk+CitOU0ludGVnZXIgPGxhYmVsPlN0YXJ0ID0gaW5wdXQuaW5kZXg7Citbc2VsZiBtYXRjaFN0cmluZzo8c3RyaW5nPl07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CitOU0ludGVnZXIgU3RhcnRMaW5lPGVsZW1lbnRJbmRleD4gPSBzZWxmLmxpbmU7CitOU0ludGVnZXIgPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+ID0gc2VsZi5jaGFyUG9zaXRpb25JbkxpbmU7Cis8bGFiZWw+ID0gW1s8bGFiZWxUeXBlPiBuZXdUb2tlbjppbnB1dCBUeXBlOkFOVExSVG9rZW5UeXBlSW52YWxpZCBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo8bGFiZWw+U3RhcnQgU3RvcDppbnB1dC5pbmRleF0gcmV0YWluXTsKK1tzZWxmIHNldExpbmU6PGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+XTsKK1tzZWxmIHNldENoYXJQb3NpdGlvbkluTGluZTo8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD5dOworPGVsc2U+Citbc2VsZiBtYXRjaFN0cmluZzo8c3RyaW5nPl07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGVuZGlmPgorPj4KKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9ICg8bGFiZWxUeXBlPiAqKVtpbnB1dCBMVDoxXTs8XG4+Cis8ZW5kaWY+Citbc2VsZiBtYXRjaEFueTppbnB1dF07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx3aWxkY2FyZCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogTWF0Y2ggLiB3aWxkY2FyZCBpbiBsZXhlciAqLword2lsZGNhcmRDaGFyKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK05TSW50ZWdlciA8bGFiZWw+ID0gW2lucHV0IExBOjFdOzxcbj4KKzxlbmRpZj4KK1tzZWxmIG1hdGNoQW55XTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+Cis+PgorCit3aWxkY2FyZENoYXJMaXN0TGFiZWwobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8d2lsZGNhcmRDaGFyKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHJ1bGUgcmVmZXJlbmNlIGJ5IGludm9raW5nIGl0IHBvc3NpYmx5IHdpdGggYXJndW1lbnRzCisgKiAgYW5kIGEgcmV0dXJuIHZhbHVlIG9yIHZhbHVlcy4gIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZQorICogIHRhcmdldCBydWxlIG5hbWUsIGJ1dCBub3cgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcworICogIHNhbWU6IHRoZSBydWxlIG5hbWUuICBOb3cgdGhvdWdoIHlvdSBjYW4gYWNjZXNzIGZ1bGwgcnVsZQorICogIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CisvKiBydWxlUmVmICovCitbc2VsZiBwdXNoRm9sbG93OkZPTExPV188cnVsZS5uYW1lPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD5dOworPGlmKGxhYmVsKT48bGFiZWw+ID0gPGVuZGlmPltzZWxmIDxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+PHJ1bGUubmFtZT48aWYoYXJncyk+OjxmaXJzdChhcmdzKT4gPHJlc3QoYXJncyk6eyBhIHwgYXJnPGk+OjxyZXN0KGFyZ3MpPn07IHNlcGFyYXRvcj0iICI+PGVuZGlmPl07PFxuPgorW3NlbGYgcG9wRm9sbG93XTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPj4KKworLyoqIGlkcys9ciAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBBIGxleGVyIHJ1bGUgcmVmZXJlbmNlLgorICoKKyAqICBUaGUgJ3J1bGUnIGFyZ3VtZW50IHdhcyB0aGUgdGFyZ2V0IHJ1bGUgbmFtZSwgYnV0IG5vdworICogIGlzIHR5cGUgUnVsZSwgd2hvc2UgdG9TdHJpbmcgaXMgc2FtZTogdGhlIHJ1bGUgbmFtZS4KKyAqICBOb3cgdGhvdWdoIHlvdSBjYW4gYWNjZXNzIGZ1bGwgcnVsZSBkZXNjcmlwdG9yIHN0dWZmLgorICovCitsZXhlclJ1bGVSZWYocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSkgOjo9IDw8Cis8aWYobGFiZWwpPgorTlNJbnRlZ2VyIDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+ID0gaW5wdXQuaW5kZXg7Citbc2VsZiBtPHJ1bGUubmFtZT48aWYoYXJncyk+OjxhcmdzOyBzZXBhcmF0b3I9IiA6Ij48ZW5kaWY+XTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT48XG4+Cis8bGFiZWw+ID0gW1s8bGFiZWxUeXBlPiBuZXdUb2tlbjppbnB1dCBUeXBlOkFOVExSVG9rZW5UeXBlSW52YWxpZCBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiBTdG9wOmlucHV0LmluZGV4LTFdIHJldGFpbl07Cis8bGFiZWw+LmxpbmUgPSBzZWxmLmxpbmU7Cis8ZWxzZT4KK1tzZWxmIDxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+PGlmKGFyZ3MpPjo8YXJnczsgc2VwYXJhdG9yPSIgOiI+PGVuZGlmPl07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGVuZGlmPgorPj4KKworLyoqIGkrPUlOVCBpbiBsZXhlciAqLworbGV4ZXJSdWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGxleGVyUnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogRU9GIGluIHRoZSBsZXhlciAqLworbGV4ZXJNYXRjaEVPRihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK05TSW50ZWdlciA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IGlucHV0LmluZGV4OworW3NlbGYgbWF0Y2hDaGFyOkFOVExSQ2hhclN0cmVhbUVPRl07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGxhYmVsVHlwZT4gPGxhYmVsPiA9IFtbPGxhYmVsVHlwZT4gbmV3VG9rZW46aW5wdXQgVHlwZTpBTlRMUlRva2VuVHlwZUVPRiBDaGFubmVsOkFOVExSVG9rZW5DaGFubmVsRGVmYXVsdCBTdGFydDo8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiBTdG9wOmlucHV0LmluZGV4LTFdIHJldGFpbl07Cis8bGFiZWw+LmxpbmUgPSBzZWxmLmxpbmU7Cis8ZWxzZT4KK1tzZWxmIG1hdGNoQ2hhcjpBTlRMUkNoYXJTdHJlYW1FT0ZdOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxlbmRpZj4KKz4+CisKKy8vIHVzZWQgZm9yIGxlZnQtcmVjdXJzaXZlIHJ1bGVzCityZWNSdWxlRGVmQXJnKCkgICAgICAgICAgICAgICAgICAgICAgIDo6PSAiaW50IDxyZWNSdWxlQXJnKCk+IgorcmVjUnVsZUFyZygpICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIl9wIgorcmVjUnVsZUFsdFByZWRpY2F0ZShydWxlTmFtZSxvcFByZWMpICA6Oj0gIjxyZWNSdWxlQXJnKCk+IFw8PSA8b3BQcmVjPiIKK3JlY1J1bGVTZXRSZXN1bHRBY3Rpb24oKSAgICAgICAgICAgICAgOjo9ICJyb290XzA9JDxydWxlTmFtZT5fcHJpbWFyeS50cmVlOyIKK3JlY1J1bGVTZXRSZXR1cm5BY3Rpb24oc3JjLG5hbWUpICAgICAgOjo9ICIkPG5hbWU+PSQ8c3JjPi48bmFtZT47IgorCisvKiogbWF0Y2ggXihyb290IGNoaWxkcmVuKSBpbiB0cmVlIHBhcnNlciAqLwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxyb290OmVsZW1lbnQoKT4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIFtpbnB1dCBMQToxXSA9PSBET1dOICkgeworICAgIFtzZWxmIG1hdGNoOmlucHV0IFRva2VuVHlwZTpET1dOIEZvbGxvdzpuaWxdOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOlVQIEZvbGxvdzpuaWxdOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CisgICAgW3NlbGYgbWF0Y2g6aW5wdXQgVG9rZW5UeXBlOkRPV04gRm9sbG93Om5pbF07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBbc2VsZiBtYXRjaDppbnB1dCBUb2tlblR5cGU6VVAgRm9sbG93Om5pbF07IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogRXZlcnkgcHJlZGljYXRlIGlzIHVzZWQgYXMgYSB2YWxpZGF0aW5nIHByZWRpY2F0ZSAoZXZlbiB3aGVuIGl0IGlzCisgKiAgYWxzbyBob2lzdGVkIGludG8gYSBwcmVkaWN0aW9uIGV4cHJlc3Npb24pLgorICovCit2YWxpZGF0ZVNlbWFudGljUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAoraWYgKCAhKDxldmFsUHJlZGljYXRlKC4uLik+KSApIHsKKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICBAdGhyb3cgW0FOVExSRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbjpAIjxydWxlTmFtZT4iIHByZWRpY2F0ZTpAIjxkZXNjcmlwdGlvbj4iIHN0cmVhbTppbnB1dF07Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitOU0ludGVnZXIgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBbaW5wdXQgTEE6PGs+XTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+CitlbHNlIHsKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47Cis8ZWxzZT4KKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjxkZWNpc2lvbk51bWJlcj4gc3RhdGU6PHN0YXRlTnVtYmVyPiBzdHJlYW06aW5wdXRdOworICAgIG52YWUuYyA9IExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+OworICAgIDxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKyAgICBAdGhyb3cgbnZhZTs8XG4+Cis8ZW5kaWY+Cit9Cis+PgorCisvKiogU2FtZSBhcyBhIG5vcm1hbCBERkEgc3RhdGUgZXhjZXB0IHRoYXQgd2UgZG9uJ3QgZXhhbWluZSBsb29rYWhlYWQKKyAqICBmb3IgdGhlIGJ5cGFzcyBhbHRlcm5hdGl2ZS4gIEl0IGRlbGF5cyBlcnJvciBkZXRlY3Rpb24gYnV0IHRoaXMKKyAqICBpcyBmYXN0ZXIsIHNtYWxsZXIsIGFuZCBtb3JlIHdoYXQgcGVvcGxlIGV4cGVjdC4gIEZvciAoWCk/IHBlb3BsZQorICogIGV4cGVjdCAiaWYgKCBMQSgxKT09WCApIG1hdGNoKFgpOyIgYW5kIHRoYXQncyBpdC4KKyAqLworZGZhT3B0aW9uYWxCbG9ja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK05TSW50ZWdlciBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IFtpbnB1dCBMQTo8az5dOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKz4+CisKKy8qKiBBIERGQSBzdGF0ZSB0aGF0IGlzIGFjdHVhbGx5IHRoZSBsb29wYmFjayBkZWNpc2lvbiBvZiBhIGNsb3N1cmUKKyAqICBsb29wLiAgSWYgZW5kLW9mLXRva2VuIChFT1QpIHByZWRpY3RzIGFueSBvZiB0aGUgdGFyZ2V0cyB0aGVuIGl0CisgKiAgc2hvdWxkIGFjdCBsaWtlIGEgZGVmYXVsdCBjbGF1c2UgKGkuZS4sIG5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQpLgorICogIFRoaXMgaXMgdXNlZCBvbmx5IGluIHRoZSBsZXhlciBzbyB0aGF0IGZvciAoJ2EnKSogb24gdGhlIGVuZCBvZiBhIHJ1bGUKKyAqICBhbnl0aGluZyBvdGhlciB0aGFuICdhJyBwcmVkaWN0cyBleGl0aW5nLgorICovCitkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK05TSW50ZWdlciBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IFtpbnB1dCBMQTo8az5dOworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPjxcbj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+Cis8aWYoIWVkZ2VzKT4KK2FsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsgPCEgaWYgbm8gZWRnZXMsIGRvbid0IGdlbiBFTFNFICE+Cis8ZWxzZT4KK2Vsc2UgeworICAgIGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8ZW90UHJlZGljdHNBbHQ+OworfTxcbj4KKzxlbmRpZj48ZW5kaWY+Cis+PgorCisvKiogQW4gYWNjZXB0IHN0YXRlIGluZGljYXRlcyBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBoYXMgYmVlbiBwcmVkaWN0ZWQgKi8KK2RmYUFjY2VwdFN0YXRlKGFsdCkgOjo9ICJhbHQ8ZGVjaXNpb25OdW1iZXI+PTxhbHQ+OyIKKworLyoqIEEgc2ltcGxlIGVkZ2Ugd2l0aCBhbiBleHByZXNzaW9uLiAgSWYgdGhlIGV4cHJlc3Npb24gaXMgc2F0aXNmaWVkLAorICogIGVudGVyIHRvIHRoZSB0YXJnZXQgc3RhdGUuICBUbyBoYW5kbGUgZ2F0ZWQgcHJvZHVjdGlvbnMsIHdlIG1heQorICogIGhhdmUgdG8gZXZhbHVhdGUgc29tZSBwcmVkaWNhdGVzIGZvciB0aGlzIGVkZ2UuCisgKi8KK2RmYUVkZ2UobGFiZWxFeHByLCB0YXJnZXRTdGF0ZSwgcHJlZGljYXRlcykgOjo9IDw8CitpZiAoICg8bGFiZWxFeHByPikgPGlmKHByZWRpY2F0ZXMpPiYmICg8cHJlZGljYXRlcz4pPGVuZGlmPikgeworICAgIDx0YXJnZXRTdGF0ZT4KK30KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChzd2l0Y2ggY2FzZSkKKworLyoqIEEgREZBIHN0YXRlIHdoZXJlIGEgU1dJVENIIG1heSBiZSBnZW5lcmF0ZWQuICBUaGUgY29kZSBnZW5lcmF0b3IKKyAqICBkZWNpZGVzIGlmIHRoaXMgaXMgcG9zc2libGU6IENvZGVHZW5lcmF0b3IuY2FuR2VuZXJhdGVTd2l0Y2goKS4KKyAqLworZGZhU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAordW5pY2hhciBjaGFyTEE8ZGVjaXNpb25OdW1iZXI+ID0gW2lucHV0IExBOjxrPl07Citzd2l0Y2ggKGNoYXJMQTxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPjxcbj4KK2RlZmF1bHQ6IDsKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47Cis8ZWxzZT4KKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjxkZWNpc2lvbk51bWJlcj4gc3RhdGU6PHN0YXRlTnVtYmVyPiBzdHJlYW06aW5wdXRdOworICAgIG52YWUuYyA9IGNoYXJMQTxkZWNpc2lvbk51bWJlcj47CisgICAgPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorICAgIEB0aHJvdyBudmFlOzxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFPcHRpb25hbEJsb2NrU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorc3dpdGNoIChbaW5wdXQgTEE6PGs+XSkgeyAvLyBkZmFPcHRpb25hbEJsb2NrU3RhdGVTd2l0Y2gKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPjxcbj4KK308XG4+Cis+PgorCitkZmFMb29wYmFja1N0YXRlU3dpdGNoKGssIGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Citzd2l0Y2ggKFtpbnB1dCBMQTo8az5dKSB7IC8vIGRmYUxvb3BiYWNrU3RhdGVTd2l0Y2gKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPjxcbj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitkZWZhdWx0OgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8ZW90UHJlZGljdHNBbHQ+OworICAgIGJyZWFrOzxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAorPGxhYmVsczp7aXQgfCBjYXNlIDxpdD46IDt9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICB7CisgICAgPHRhcmdldFN0YXRlPgorICAgIH0KKyAgICBicmVhazsKKz4+CisKKy8vIEMgeSBjIGwgaSBjICBEIEYgQQorCisvKiogVGhlIGNvZGUgdG8gaW5pdGlhdGUgZXhlY3V0aW9uIG9mIGEgY3ljbGljIERGQTsgdGhpcyBpcyB1c2VkCisgKiAgaW4gdGhlIHJ1bGUgdG8gcHJlZGljdCBhbiBhbHQganVzdCBsaWtlIHRoZSBmaXhlZCBERkEgY2FzZS4KKyAqICBUaGUgPG5hbWU+IGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgdmlhIHRoZSBwYXJzZXIsIGxleGVyLCAuLi4KKyAqLworZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorYWx0PGRlY2lzaW9uTnVtYmVyPiA9IFtkZmE8ZGVjaXNpb25OdW1iZXI+IHByZWRpY3Q6aW5wdXRdOworPj4KKworLyoqIFVzZWQgaW4gaGVhZGVyRmlsZSAqLworY3ljbGljREZBSW50ZXJmYWNlKGRmYSkgOjo9IDw8CisjcHJhZ21hIG1hcmsgQ3ljbGljIERGQSBpbnRlcmZhY2Ugc3RhcnQgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4KK0BpbnRlcmZhY2UgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gOiBBTlRMUkRGQSB7Cit9CisrIG5ld0RGQTxkZmEuZGVjaXNpb25OdW1iZXI+V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKil0aGVSZWNvZ25pemVyOworLSBpbml0V2l0aFJlY29nbml6ZXI6KEFOVExSQmFzZVJlY29nbml6ZXIgKilyZWNvZ25pemVyOworQGVuZCAvKiBlbmQgb2YgREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gaW50ZXJmYWNlICAqLzxcbj4KKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGludGVyZmFjZSBlbmQgREZBPGRmYS5kZWNpc2lvbk51bWJlcj48XG4+Cis+PgorCisvKiogVXNlZCBpbiBsZXhlci9wYXJzZXIgaW1wbGVtZW50YXRpb24gZmlsZXMgKi8KKy8qIER1bXAgREZBIHRhYmxlcyBhcyBydW4tbGVuZ3RoLWVuY29kZWQgU3RyaW5ncyBvZiBvY3RhbCB2YWx1ZXMuCisgKiBDYW4ndCB1c2UgaGV4IGFzIGNvbXBpbGVyIHRyYW5zbGF0ZXMgdGhlbSBiZWZvcmUgY29tcGlsYXRpb24uCisgKiBUaGVzZSBzdHJpbmdzIGFyZSBzcGxpdCBpbnRvIG11bHRpcGxlLCBjb25jYXRlbmF0ZWQgc3RyaW5ncy4KKyAqIEphdmEgcHV0cyB0aGVtIGJhY2sgdG9nZXRoZXIgYXQgY29tcGlsZSB0aW1lIHRoYW5rZnVsbHkuCisgKiBKYXZhIGNhbm5vdCBoYW5kbGUgbGFyZ2Ugc3RhdGljIGFycmF5cywgc28gd2UncmUgc3R1Y2sgd2l0aCB0aGlzCisgKiBlbmNvZGUvZGVjb2RlIGFwcHJvYWNoLiAgU2VlIGFuYWx5c2lzIGFuZCBydW50aW1lIERGQSBmb3IKKyAqIHRoZSBlbmNvZGluZyBtZXRob2RzLgorICovCitjeWNsaWNERkEoZGZhKSA6Oj0gPDwKKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGltcGxlbWVudGF0aW9uIHN0YXJ0IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+CitAaW1wbGVtZW50YXRpb24gREZBPGRmYS5kZWNpc2lvbk51bWJlcj4KK2NvbnN0IHN0YXRpYyBOU0ludGVnZXIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90WzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgezxkZmEuZW90OyB3cmFwPSJcbiAgICAgIiwgc2VwYXJhdG9yPSIsIiwgbnVsbD0iLTEiPn07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZls8ZGZhLm51bWJlck9mU3RhdGVzPl0gPQorICAgIHs8ZGZhLmVvZjsgd3JhcD0iXG4gICAgICIsIHNlcGFyYXRvcj0iLCIsIG51bGw9Ii0xIj59OworY29uc3Qgc3RhdGljIHVuaWNoYXIgZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluWzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgezxkZmEubWluOyB3cmFwPSJcbiAgICAgIiwgc2VwYXJhdG9yPSIsIiwgbnVsbD0iMCI+fTsKK2NvbnN0IHN0YXRpYyB1bmljaGFyIGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFs8ZGZhLm51bWJlck9mU3RhdGVzPl0gPQorICAgIHs8ZGZhLm1heDsgd3JhcD0iXG4gICAgICIsIHNlcGFyYXRvcj0iLCIsIG51bGw9IjAiPn07Citjb25zdCBzdGF0aWMgTlNJbnRlZ2VyIGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdFs8ZGZhLm51bWJlck9mU3RhdGVzPl0gPQorICAgIHs8ZGZhLmFjY2VwdDsgd3JhcD0iXG4gICAgICIsIHNlcGFyYXRvcj0iLCIsIG51bGw9Ii0xIj59OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsWzxkZmEubnVtYmVyT2ZTdGF0ZXM+XSA9CisgICAgezxkZmEuc3BlY2lhbDsgd3JhcD0iXG4gICAgICIsIHNlcGFyYXRvcj0iLCIsIG51bGw9Ii0xIj59OworY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uW10gPSB7fTsKKzxkZmEuZWRnZVRyYW5zaXRpb25DbGFzc01hcC5rZXlzOnsgdGFibGUgfAorY29uc3Qgc3RhdGljIE5TSW50ZWdlciBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uPGkwPltdID0gezx0YWJsZTsgc2VwYXJhdG9yPSIsICIsIHdyYXA9IlxuICIsIG51bGw9Ii0xIj5cfTsKK307IG51bGw9IiI+CisKKysgKGlkKSBuZXdERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPldpdGhSZWNvZ25pemVyOihBTlRMUkJhc2VSZWNvZ25pemVyICopYVJlY29nbml6ZXIKK3sKKyAgICByZXR1cm4gW1tbREZBPGRmYS5kZWNpc2lvbk51bWJlcj4gYWxsb2NdIGluaXRXaXRoUmVjb2duaXplcjphUmVjb2duaXplcl0gcmV0YWluXTsKK30KKworLSAoaWQpIGluaXRXaXRoUmVjb2duaXplcjooQU5UTFJCYXNlUmVjb2duaXplciAqKSB0aGVSZWNvZ25pemVyCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aFJlY29nbml6ZXI6dGhlUmVjb2duaXplcl07CisgICAgaWYgKCBzZWxmICE9IG5pbCApIHsKKyAgICAgICAgZGVjaXNpb25OdW1iZXIgPSA8ZGZhLmRlY2lzaW9uTnVtYmVyPjsKKyAgICAgICAgZW90ID0gZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90OworICAgICAgICBlb2YgPSBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2Y7CisgICAgICAgIG1pbiA9IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbjsKKyAgICAgICAgbWF4ID0gZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OworICAgICAgICBhY2NlcHQgPSBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQ7CisgICAgICAgIHNwZWNpYWwgPSBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsOworICAgICAgICBpZiAoISh0cmFuc2l0aW9uID0gY2FsbG9jKDxkZmEubnVtYmVyT2ZTdGF0ZXM+LCBzaXplb2Yodm9pZCopKSkpIHsKKyAgICAgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSA8ZGZhLm51bWJlck9mU3RhdGVzPjsKKyAgICAgICAgPGRmYS50cmFuc2l0aW9uRWRnZVRhYmxlczp7d2hpY2hUYWJsZXx0cmFuc2l0aW9uWzxpMD5dID0gZGZhPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbjx3aGljaFRhYmxlPjt9OyBzZXBhcmF0b3I9IlxuIiwgbnVsbD0iIj4KKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKy8qIHN0YXJ0IGRmYS5zcGVjaWFsU3RhdGVTVHMgKi8KKy0gKE5TSW50ZWdlcikgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbjooTlNJbnRlZ2VyKXMgU3RyZWFtOihpZFw8QU5UTFJJbnRTdHJlYW1cPilhbklucHV0Cit7Cis8aWYoTEVYRVIpPgorICAgIGlkXDxBTlRMUkludFN0cmVhbVw+IGlucHV0ID0gYW5JbnB1dDs8XG4+Cis8ZW5kaWY+Cis8aWYoUEFSU0VSKT4KKyAgICBpZFw8QU5UTFJUb2tlblN0cmVhbVw+IGlucHV0ID0gKGlkXDxBTlRMUlRva2VuU3RyZWFtXD4pYW5JbnB1dDs8XG4+Cis8ZW5kaWY+Cis8aWYoVFJFRV9QQVJTRVIpPgorICAgIGlkXDxBTlRMUlRyZWVOb2RlU3RyZWFtXD4gaW5wdXQgPSAoaWRcPEFOVExSVHJlZU5vZGVTdHJlYW1cPilhbklucHV0Ozxcbj4KKzxlbmRpZj4KKyAgICBzd2l0Y2ggKHMpIHsKKyAgICAgICAgPGRmYS5zcGVjaWFsU3RhdGVTVHM6e3N0YXRlIHwKKyAgICAgICAgY2FzZSA8aTA+IDogOzwhIGNvbXByZXNzZWQgc3BlY2lhbCBzdGF0ZSBudW1iZXJzIDAuLm4tMSAhPgorICAgICAgICAgICAgPHN0YXRlPn07IHNlcGFyYXRvcj0iXG4iPgorICAgIH0KKzxpZihiYWNrdHJhY2tpbmcpPgorICAgIGlmICggW3JlY29nbml6ZXIgZ2V0QmFja3RyYWNraW5nTGV2ZWxdID4gMCApIHsgW3JlY29nbml6ZXIgc2V0RmFpbGVkOllFU107IHJldHVybiAtMTsgfTxcbj4KKzxlbmRpZj4KKyAgICBBTlRMUk5vVmlhYmxlQWx0RXhjZXB0aW9uICpudmFlID0gW0FOVExSTm9WaWFibGVBbHRFeGNlcHRpb24gbmV3RXhjZXB0aW9uOjxkZmEuZGVjaXNpb25OdW1iZXI+IHN0YXRlOnMgc3RyZWFtOnJlY29nbml6ZXIuaW5wdXRdOworICAgIC8vIG52YWUuYyA9IHM7CisgICAgLyogW3NlbGYgZXJyb3I6bnZhZV07ICovIDwhIGZvciBkZWJ1Z2dlciAtIGRvIGxhdGVyICE+CisgICAgQHRocm93IG52YWU7Cit9PFxuPgorLyogZW5kIGRmYS5zcGVjaWFsU3RhdGVTVHMgKi8KKzxlbmRpZj4KKworLSAodm9pZCkgZGVhbGxvYworeworICAgIGZyZWUodHJhbnNpdGlvbik7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgoreworICAgIHJldHVybiBAIjxkZmEuZGVzY3JpcHRpb24+IjsKK30KKworPEBlcnJvck1ldGhvZCgpPgorCitAZW5kIC8qIGVuZCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiBpbXBsZW1lbnRhdGlvbiAqLzxcbj4KKyNwcmFnbWEgbWFyayBDeWNsaWMgREZBIGltcGxlbWVudGF0aW9uIGVuZCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPgorPFxuPgorPj4KKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLCBzdGF0ZU51bWJlciwgZWRnZXMsIG5lZWRFcnJvckNsYXVzZSwgc2VtUHJlZFN0YXRlKSA6Oj0gPDwKKy8qIGN5Y2xpY0RGQVN0YXRlICovCitOU0ludGVnZXIgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBbaW5wdXQgTEE6MV07PFxuPgorPGlmKHNlbVByZWRTdGF0ZSk+IDwhIGdldCBuZXh0IGxvb2thaGVhZCBzeW1ib2wgdG8gdGVzdCBlZGdlcywgdGhlbiByZXdpbmQgIT4KK05TSW50ZWdlciBpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LmluZGV4OworW2lucHV0IHJld2luZF07PFxuPgorPGVuZGlmPgorcyA9IC0xOworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzZSAiPgorPGlmKHNlbVByZWRTdGF0ZSk+IDwhIHJldHVybiBpbnB1dCBjdXJzb3IgdG8gc3RhdGUgYmVmb3JlIHdlIHJld291bmQgIT4KK1tpbnB1dCBzZWVrOmluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+XTs8XG4+Cis8ZW5kaWY+CitpZiAoIHMgPj0gMCApCisgICAgcmV0dXJuIHM7CisgYnJlYWs7Cis+PgorCisvKiogSnVzdCBsaWtlIGEgZml4ZWQgREZBIGVkZ2UsIHRlc3QgdGhlIGxvb2thaGVhZCBhbmQgaW5kaWNhdGUgd2hhdAorICogIHN0YXRlIHRvIGp1bXAgdG8gbmV4dCBpZiBzdWNjZXNzZnVsLgorICovCitjeWNsaWNERkFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGVOdW1iZXIsIGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorLyogY3ljbGljREZBRWRnZSAqLworaWYgKDxsYWJlbEV4cHI+PGlmKHByZWRpY2F0ZXMpPiAmJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pIHsgcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47fTxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkgY2hhcjsKKyAqICBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICovCitlb3RERkFFZGdlKHRhcmdldFN0YXRlTnVtYmVyLGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPiAvKiBlb3RERkFFZGdlICovCis+PgorCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoPGxlZnQ+JiY8cmlnaHQ+KSIKKworb3JQcmVkaWNhdGVzKG9wZXJhbmRzKSA6Oj0gIig8Zmlyc3Qob3BlcmFuZHMpPjxyZXN0KG9wZXJhbmRzKTp7byB8IHx8PG8+fT4pIgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICIhKDxldmFsUHJlZGljYXRlKHByZWQsIFwiXCIpPikiCisKK2V2YWxQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICIoPHByZWQ+KSIKKworLyoKKyAqIGV2YWxTeW5QcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICI8cHJlZD4oKSIKKyAqCisgKiBzeW5wcmVkcyBhcmUgYnJva2VuIGluIGN5Y2xpYyBERkEgc3BlY2lhbCBzdGF0ZXMKKyAqICBEYW1uISBGb3Igbm93LCB3b3JrIGFyb3VuZCB3aXRoIHVzaW5nIHRoZSBzZWxlY3RvcnMgZGlyZWN0bHksIGFuZCBieSBwcm92aWRpbmcgYSB0cmFtcG9saW5lIGV2YWxTeW5QcmVkIG1ldGhvZCBpbgorICogIEFOVExSREZBCisgKi8KKy8qIGV2YWxTeW5QcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICJbc2VsZiBldmFsdWF0ZVN5bnRhY3RpY1ByZWRpY2F0ZTo8cHJlZD5TZWxlY3RvciBzdHJlYW06aW5wdXRdIiAqLworZXZhbFN5blByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIltzZWxmIGV2YWx1YXRlU3ludGFjdGljUHJlZGljYXRlOkBzZWxlY3Rvcig8cHJlZD5fZnJhZ21lbnQpXSIKKy8qIGV2YWxTeW5QcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICJbcmVjb2duaXplciA8cHJlZD5dIiAqLworCitsb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj49PTxhdG9tPiIKKworLyoqIFNvbWV0aW1lcyBhIGxvb2thaGVhZCB0ZXN0IGNhbm5vdCBhc3N1bWUgdGhhdCBMQShrKSBpcyBpbiBhIHRlbXAgdmFyaWFibGUKKyAqICBzb21ld2hlcmUuICBNdXN0IGFzayBmb3IgdGhlIGxvb2thaGVhZCBkaXJlY3RseS4KKyAqLworaXNvbGF0ZWRMb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiW2lucHV0IExBOjxrPl0gPT0gPGF0b20+IgorCitsb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSA8JQorKExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID49IDxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gXDw9IDx1cHBlcj4pCislPgorCitpc29sYXRlZExvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9ICIoKFtpbnB1dCBMQTo8az5dID49IDxsb3dlcj4pICYmIChbaW5wdXQgTEE6PGs+XSBcPD0gPHVwcGVyPikpIgorCitzZXRUZXN0KHJhbmdlcykgOjo9ICI8cmFuZ2VzOyBzZXBhcmF0b3I9XCJ8fFwiPiIKKworLy8gQSBUIFQgUiBJIEIgVSBUIEUgUworCittZW1WYXJzKHNjb3BlKSA6Oj0gPDwgPHNjb3BlLmF0dHJpYnV0ZXM6e2F8PGEudHlwZT4gPGEubmFtZT47PFxuPn07IHNlcGFyYXRvcj0iXG4iPiA+PgorCitwcm9wZXJ0aWVzKHNjb3BlKSA6Oj0gPDwKKzxzY29wZS5hdHRyaWJ1dGVzOnthfEBwcm9wZXJ0eSAoYXNzaWduLCBnZXR0ZXI9Z2V0PGEubmFtZT4sIHNldHRlcj1zZXQ8YS5uYW1lPjopIDxhLnR5cGU+IDxhLm5hbWU+Ozxcbj59OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK21ldGhvZHNEZWNsKHNjb3BlKSA6Oj0gPDwKKzxzY29wZS5hdHRyaWJ1dGVzOnthfC0gKDxhLnR5cGU+KWdldDxhLm5hbWU+Ozxcbj4tICh2b2lkKXNldDxhLm5hbWU+Oig8YS50eXBlPilhVmFsOzxcbj59OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3N5bnRoZXNpemUoc2NvcGUpIDo6PSA8PCA8c2NvcGUuYXR0cmlidXRlczp7YXxAc3ludGhlc2l6ZSA8YS5uYW1lPjt9OyBzZXBhcmF0b3I9IlxuIj4gPj4KKworbWV0aG9kcyhzY29wZSkgOjo9IDwlCis8c2NvcGUuYXR0cmlidXRlczp7YXwKKy0gKDxhLnR5cGU+KWdldDxhLm5hbWU+IHsgcmV0dXJuKCA8YS5uYW1lPiApOyBcfTxcbj4KKy0gKHZvaWQpc2V0PGEubmFtZT46KDxhLnR5cGU+KWFWYWwgeyA8YS5uYW1lPiA9IGFWYWw7IFx9PFxuPn07IHNlcGFyYXRvcj0iXG4iPgorJT4KKworZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2Uoc2NvcGUpIDo6PSA8JQorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2UgKi88XG4+CitAaW50ZXJmYWNlIDxzY29wZS5uYW1lPl9TY29wZSA6IEFOVExSU3ltYm9sc1Njb3BlIHs8XG4+Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+Cis8bWVtVmFycyhzY29wZSk+Cis8ZW5kaWY+Cit9PFxuPgorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2UgcHJvcGVydGllcyAqLzxcbj4KKzxwcm9wZXJ0aWVzKHNjb3BlKT4KKy8qIGVuZCBnbG9iYWxBdHRyaWJ1dGVTY29wZUludGVyZmFjZSBwcm9wZXJ0aWVzICovPFxuPgorPGVuZGlmPgorCisrICg8c2NvcGUubmFtZT5fU2NvcGUgKiluZXc8c2NvcGUubmFtZT5fU2NvcGU7PFxuPgorLSAoaWQpIGluaXQ7PFxuPgorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorLyogc3RhcnQgb2YgZ2xvYmFsQXR0cmlidXRlU2NvcGVJbnRlcmZhY2UgbWV0aG9kc0RlY2wgKi88XG4+Cis8bWV0aG9kc0RlY2woc2NvcGUpPgorLyogRW5kIG9mIGdsb2JhbEF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlIG1ldGhvZHNEZWNsICovPFxuPgorPGVuZGlmPgorQGVuZCAvKiBlbmQgb2YgPHNjb3BlLm5hbWU+X1Njb3BlIGludGVyZmFjZSAqLzxcbj4KKyU+CisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyKHNjb3BlKSA6Oj0gPCUKKy8qIGdsb2JhbEF0dHJpYnV0ZVNjb3BlTWVtVmFyICovPFxuPgorQU5UTFJTeW1ib2xTdGFjayAqPHNjb3BlLm5hbWU+X3N0YWNrOzxcbj4KKzxzY29wZS5uYW1lPl9TY29wZSAqPHNjb3BlLm5hbWU+X3Njb3BlOzxcbj4KKyU+CisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlSW1wbGVtZW50YXRpb24oc2NvcGUpIDo6PSA8JQorQGltcGxlbWVudGF0aW9uIDxzY29wZS5uYW1lPl9TY29wZSAgLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVJbXBsZW1lbnRhdGlvbiAqLzxcbj4KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHN0YXJ0IG9mIHN5bnRoZXNpemUgLS0gT0JKQy1MaW5lIDE3NTAgKi88XG4+Cis8c3ludGhlc2l6ZShzY29wZSk+PFxuPgorPGVuZGlmPgorPFxuPgorKyAoPHNjb3BlLm5hbWU+X1Njb3BlICopbmV3PHNjb3BlLm5hbWU+X1Njb3BlPFxuPgorezxcbj4KKyAgICByZXR1cm4gW1s8c2NvcGUubmFtZT5fU2NvcGUgYWxsb2NdIGluaXRdOzxcbj4KK308XG4+Cis8XG4+CistIChpZCkgaW5pdDxcbj4KK3s8XG4+CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTs8XG4+CisgICAgcmV0dXJuIHNlbGY7PFxuPgorfTxcbj4KKzxcbj4KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHN0YXJ0IG9mIGl0ZXJhdGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovPFxuPgorPG1ldGhvZHMoc2NvcGUpPjxcbj4KKy8qIEVuZCBvZiBpdGVyYXRlIGdldCBhbmQgc2V0IGZ1bmN0aW9ucyAqLzxcbj4KKzxlbmRpZj4KK0BlbmQgLyogZW5kIG9mIDxzY29wZS5uYW1lPl9TY29wZSBpbXBsZW1lbnRhdGlvbiAqLzxcbj48XG4+CislPgorCitnbG9iYWxBdHRyaWJ1dGVTY29wZUluaXQoc2NvcGUpIDo6PSA8PAorLyogZ2xvYmFsQXR0cmlidXRlU2NvcGVJbml0ICovPFxuPgorPHNjb3BlLm5hbWU+X3Njb3BlID0gWzxzY29wZS5uYW1lPl9TY29wZSBuZXc8c2NvcGUubmFtZT5fU2NvcGVdOzxcbj4KKzxzY29wZS5uYW1lPl9zdGFjayA9IFtBTlRMUlN5bWJvbFN0YWNrIG5ld0FOVExSU3ltYm9sU3RhY2tXaXRoTGVuOjMwXTs8XG4+Cis+PgorCitnbG9iYWxBdHRyaWJ1dGVTY29wZURlYWxsb2Moc2NvcGUpIDo6PSA8PCBbPHNjb3BlLm5hbWU+X3N0YWNrIHJlbGVhc2VdOzxcbj4gPj4KKworZ2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGUpIDo6PSA8PCBzdGF0aWMgPHNjb3BlLm5hbWU+X3N0YWNrOzxcbj4gPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyKHNjb3BlKSA6Oj0gPCUKKy8qIE9iakMgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovPFxuPgorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorPHNjb3BlLm5hbWU+X1Njb3BlICo8c2NvcGUubmFtZT5fc2NvcGU7IC8qIE9iakMgcnVsZUF0dHJpYnV0ZVNjb3BlTWVtVmFyICovPFxuPgorPGVuZGlmPgorJT4KKworcnVsZUF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlKHNjb3BlKSA6Oj0gPCUKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHN0YXJ0IG9mIHJ1bGVBdHRyaWJ1dGVTY29wZUludGVyZmFjZSAqLzxcbj4KK0BpbnRlcmZhY2UgPHNjb3BlLm5hbWU+X1Njb3BlIDogQU5UTFJTeW1ib2xzU2NvcGUgezxcbj4KKyAgICA8bWVtVmFycyhzY29wZSk+PFxuPgorfTxcbj4KKzxcbj4KKy8qIHN0YXJ0IHByb3BlcnR5IGRlY2xhcmF0aW9ucyAqLzxcbj4KKzxwcm9wZXJ0aWVzKHNjb3BlKT48XG4+CisvKiBzdGFydCBtZXRob2QgZGVjbGFyYXRpb25zICovPFxuPgorKyAoPHNjb3BlLm5hbWU+X1Njb3BlICopbmV3PHNjb3BlLm5hbWU+X1Njb3BlOzxcbj4KKy0gKGlkKSBpbml0Ozxcbj4KKzxtZXRob2RzRGVjbChzY29wZSk+PFxuPgorQGVuZCAvKiBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlSW50ZXJmYWNlICovPFxuPjxcbj4KKzxlbmRpZj4KKyU+CisKK3J1bGVBdHRyaWJ1dGVTY29wZUltcGxlbWVudGF0aW9uKHNjb3BlKSA6Oj0gPCUKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK0BpbXBsZW1lbnRhdGlvbiA8c2NvcGUubmFtZT5fU2NvcGUgIC8qIHN0YXJ0IG9mIHJ1bGVBdHRyaWJ1dGVTY29wZUltcGxlbWVudGF0aW9uICovPFxuPgorPHN5bnRoZXNpemUoc2NvcGUpPjxcbj4KKzxcbj4KKysgKDxzY29wZS5uYW1lPl9TY29wZSAqKW5ldzxzY29wZS5uYW1lPl9TY29wZTxcbj4KK3s8XG4+CisgICAgcmV0dXJuIFtbPHNjb3BlLm5hbWU+X1Njb3BlIGFsbG9jXSBpbml0XTs8XG4+Cit9PFxuPgorPFxuPgorLSAoaWQpIGluaXQ8XG4+Cit7PFxuPgorICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07PFxuPgorICAgIHJldHVybiBzZWxmOzxcbj4KK308XG4+Cis8XG4+CisvKiBzdGFydCBvZiA8c2NvcGUubmFtZT5fU2NvcGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovPFxuPgorPG1ldGhvZHMoc2NvcGUpPjxcbj4KKy8qIEVuZCBvZiA8c2NvcGUubmFtZT5fU2NvcGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovPFxuPgorQGVuZCAvKiBlbmQgb2YgcnVsZUF0dHJpYnV0ZVNjb3BlSW1wbGVtZW50YXRpb24gKi88XG4+PFxuPgorPGVuZGlmPgorJT4KKworcnVsZUF0dHJpYnV0ZVNjb3BlSW5pdChzY29wZSkgOjo9IDwlCisvKiBydWxlQXR0cmlidXRlU2NvcGVJbml0ICovPFxuPgorPHNjb3BlLm5hbWU+X3Njb3BlID0gWzxzY29wZS5uYW1lPl9TY29wZSBuZXc8c2NvcGUubmFtZT5fU2NvcGVdOzxcbj4KKzxzY29wZS5uYW1lPl9zdGFjayA9IFtBTlRMUlN5bWJvbFN0YWNrIG5ld0FOVExSU3ltYm9sU3RhY2tXaXRoTGVuOjMwXTs8XG4+CislPgorCitydWxlQXR0cmlidXRlU2NvcGVEZWFsbG9jKHNjb3BlKSA6Oj0gPCUgWzxzY29wZS5uYW1lPl9TY29wZSByZWxlYXNlXTs8XG4+ICU+CisKK3J1bGVBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDwlCis8aWYoc2NvcGUuYXR0cmlidXRlcyk+CisvKiBydWxlQXR0cmlidXRlU2NvcGUgKi88XG4+CitzdGF0aWMgQU5UTFJTeW1ib2xTdGFjayAqPHNjb3BlLm5hbWU+X3N0YWNrOzxcbj4KKzxlbmRpZj4KKyU+CisKK3J1bGVBdHRyaWJ1dGVTY29wZURlY2woc2NvcGUpIDo6PSA8JQorLyogcnVsZUF0dHJpYnV0ZVNjb3BlRGVjbCAqLzxcbj4KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKzxzY29wZS5uYW1lPl9TY29wZSAqPHNjb3BlLm5hbWU+X3Njb3BlOzxcbj4KKzxlbmRpZj4KKyU+CisKK3JldHVyblN0cnVjdE5hbWUocikgOjo9ICI8Y2xhc3NOYW1lKCk+XzxyLm5hbWU+X3JldHVybiIKKworcmV0dXJuVHlwZSgpIDo6PSA8JQorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+ICoKKzxlbHNlPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbHNlPgordm9pZAorPGVuZGlmPgorJT4KKworLyoqIEdlbmVyYXRlIHRoZSBPYmplY3RpdmUtQyB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBvciBtdWx0aXBsZSByZXR1cm4KKyAqICB2YWx1ZXMuCisgKi8KK3J1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGUpIDo6PSA8JQorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxjbGFzc05hbWUoKT5fPHJlZmVyZW5jZWRSdWxlLm5hbWU+X3JldHVybiAqPGVsc2U+Cis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPjxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+PGVsc2U+Cit2b2lkPGVuZGlmPgorPGVuZGlmPgorJT4KKworZGVsZWdhdGVOYW1lKGQpIDo6PSA8PCA8aWYoZC5sYWJlbCk+PGQubGFiZWw+PGVsc2U+ZzxkLm5hbWU+PGVuZGlmPiA+PgorCisvKiogVXNpbmcgYSB0eXBlIHRvIGluaXQgdmFsdWUgbWFwLCB0cnkgdG8gaW5pdCBhIHR5cGU7IGlmIG5vdCBpbiB0YWJsZQorICogIG11c3QgYmUgYW4gb2JqZWN0LCBkZWZhdWx0IHZhbHVlIGlzICJudWxsIi4KKyAqLworaW5pdFZhbHVlKHR5cGVOYW1lKSA6Oj0gPCUgPG9iamNUeXBlSW5pdE1hcC4odHlwZU5hbWUpPiAlPgorCisvKiogRGVmaW5lIGEgcnVsZSBsYWJlbCBpbmNsdWRpbmcgZGVmYXVsdCB2YWx1ZSAqLworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPDwgPHJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpPiA8bGFiZWwubGFiZWwudGV4dD4gPSA8aW5pdFZhbHVlKHR5cGVOYW1lPXJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpKT47PFxuPiA+PgorCisvKiogRGVmaW5lIGEgcmV0dXJuIHN0cnVjdCBmb3IgYSBydWxlIGlmIHRoZSBjb2RlIG5lZWRzIHRvIGFjY2VzcyBpdHMKKyAqICBzdGFydC9zdG9wIHRva2VucywgdHJlZSBzdHVmZiwgYXR0cmlidXRlcywgLi4uICBMZWF2ZSBhIGhvbGUgZm9yCisgKiAgc3ViZ3JvdXBzIHRvIHN0aWNrIGluIG1lbWJlcnMuCisgKi8KK3JldHVyblNjb3BlSW50ZXJmYWNlKHNjb3BlKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CisvKiByZXR1cm5TY29wZUludGVyZmFjZSA8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiAqLworQGludGVyZmFjZSA8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiA6IEFOVExSPGlmKFRSRUVfUEFSU0VSKT5UcmVlPGVsc2U+UGFyc2VyPGVuZGlmPlJ1bGVSZXR1cm5TY29wZSB7IC8qIHJldHVyblNjb3BlSW50ZXJmYWNlIGxpbmUgMTgzOCAqLworPEBtZW1WYXJzKCk+IC8qIE9iakMgc3RhcnQgb2YgbWVtVmFycygpICovPFxuPgorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorPG1lbVZhcnMoc2NvcGUpPjxcbj4KKzxlbmRpZj4KK30KKy8qIHN0YXJ0IHByb3BlcnR5IGRlY2xhcmF0aW9ucyAqLworPEBwcm9wZXJ0aWVzKCk+PFxuPgorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorPHByb3BlcnRpZXMoc2NvcGUpPjxcbj4KKzxlbmRpZj4KKy8qIHN0YXJ0IG9mIG1ldGhvZCBkZWNsYXJhdGlvbnMgKi88XG4+CisrICg8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiAqKW5ldzxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+OworLyogdGhpcyBpcyBzdGFydCBvZiBzZXQgYW5kIGdldCBtZXRob2RzICovCis8QG1ldGhvZHNEZWNsKCk+ICAvKiBtZXRob2RzRGVjbCAqLzxcbj4KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHN0YXJ0IG9mIGl0ZXJhdGVkIGdldCBhbmQgc2V0IGZ1bmN0aW9ucyAqLzxcbj4KKzxtZXRob2RzRGVjbChzY29wZSk+PFxuPgorPGVuZGlmPgorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGVJbnRlcmZhY2UgaW50ZXJmYWNlICovPFxuPgorPGVuZGlmPgorPj4KKworcmV0dXJuU2NvcGVJbXBsZW1lbnRhdGlvbihzY29wZSkgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorQGltcGxlbWVudGF0aW9uIDxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+IC8qIHJldHVyblNjb3BlSW1wbGVtZW50YXRpb24gKi88XG4+Cis8QHN5bnRoZXNpemUoKT4gLyogc3RhcnQgb2Ygc3ludGhlc2l6ZSAtLSBPQkpDLUxpbmUgMTgzNyAqLzxcbj4KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKyAgICA8c3ludGhlc2l6ZShzY29wZSk+PFxuPgorPGVuZGlmPgorKyAoPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4gKiluZXc8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPjxcbj4KK3s8XG4+CisgICAgcmV0dXJuIFtbWzxydWxlRGVzY3JpcHRvcjpyZXR1cm5TdHJ1Y3ROYW1lKCk+IGFsbG9jXSBpbml0XSByZXRhaW5dOzxcbj4KK308XG4+Cis8XG4+CistIChpZCkgaW5pdDxcbj4KK3s8XG4+CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTs8XG4+CisgICAgcmV0dXJuIHNlbGY7PFxuPgorfTxcbj4KKzxcbj4KKzxAbWV0aG9kcygpPjxcbj4KKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KKy8qIHN0YXJ0IG9mIGl0ZXJhdGUgZ2V0IGFuZCBzZXQgZnVuY3Rpb25zICovPFxuPgorPG1ldGhvZHMoc2NvcGUpPjxcbj4KKy8qIEVuZCBvZiBpdGVyYXRlIGdldCBhbmQgc2V0IGZ1bmN0aW9ucyAqLzxcbj4KKzxlbmRpZj4KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZVJldHVybk1ldGhvZHM+Cis8QHJ1bGVSZXR1cm5NZW1iZXJzKCk+PFxuPgorQGVuZCAvKiBlbmQgb2YgcmV0dXJuU2NvcGUgaW1wbGVtZW50YXRpb24gKi88XG4+PFxuPgorPGVuZGlmPgorJT4KKworcGFyYW1ldGVyU2NvcGUoc2NvcGUpIDo6PSA8PAorPCEgPHNjb3BlLmF0dHJpYnV0ZXM6e2l0IHwgOig8aXQudHlwZT4pPGl0Lm5hbWU+fTsgc2VwYXJhdG9yPSIgIj4gIT4KKzxmaXJzdChzY29wZS5hdHRyaWJ1dGVzKTp7IGEgfCA6KDxhLnR5cGU+KTxhLm5hbWU+fT4gPHJlc3Qoc2NvcGUuYXR0cmlidXRlcyk6eyBhIHwgYXJnPGk+Oig8YS50eXBlPik8YS5uYW1lPiB9OyBzZXBhcmF0b3I9IiAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSAiPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+ID0gPGV4cHI+OyIKKworLyoqIE5vdGUgdGhhdCB0aGUgc2NvcGVBdHRyaWJ1dGVSZWYgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCisgKiBncmFtbWFyIG5hbWUgZGlyZWN0bHkKKyAqLworc2NvcGVBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixpbmRleCxuZWdJbmRleCkgOjo9IDwlCis8aWYobmVnSW5kZXgpPgorKFsoKDxzY29wZT5fU2NvcGUgKilbPHNjb3BlPl9zdGFjayBvYmplY3RBdEluZGV4Ols8c2NvcGU+X3N0YWNrIHNpemVdLTxuZWdJbmRleD4tMSldKS48YXR0ci5uYW1lPgorPGVsc2U+Cis8aWYoaW5kZXgpPgorKCg8c2NvcGU+X1Njb3BlICopWzxzY29wZT5fc3RhY2sgb2JqZWN0QXRJbmRleDo8aW5kZXg+XSkuPGF0dHIubmFtZT4KKzxlbHNlPgorKCg8c2NvcGU+X1Njb3BlICopWzxzY29wZT5fc3RhY2sgcGVla10pLjxhdHRyLm5hbWU+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCitzY29wZVNldEF0dHJpYnV0ZVJlZihzY29wZSxhdHRyLGV4cHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8JQorLyogc2NvcGVTZXRBdHRyaWJ1dGVSZWYgKi8KKzxpZihuZWdJbmRleCk+CisoKDxzY29wZT5fU2NvcGUgKilbPHNjb3BlPl9zdGFjayBvYmplY3RBdEluZGV4OihbPHNjb3BlPl9zdGFjayBzaXplXS08bmVnSW5kZXg+LTEpXSkuPGF0dHIubmFtZT4gPSA8ZXhwcj47Cis8ZWxzZT4KKzxpZihpbmRleCk+CisoKDxzY29wZT5fU2NvcGUgKilbPHNjb3BlPl9zdGFjayBvYmplY3RBdEluZGV4OjxpbmRleD5dKS48YXR0ci5uYW1lPiA9IDxleHByPjsKKzxlbHNlPgorKCg8c2NvcGU+X1Njb3BlICopWzxzY29wZT5fc3RhY2sgcGVla10pLjxhdHRyLm5hbWU+ID0gPGV4cHI+OworPGVuZGlmPgorPGVuZGlmPgorJT4KKworc2NvcGVBdHRyaWJ1dGVSZWZTdGFjaygpIDo6PSA8PAorLyogc2NvcGVBdHRyaWJ1dGVSZWZTdGFjayAqLworPGlmKG5lZ0luZGV4KT4KKygoPHNjb3BlPl9TY29wZSAqKVs8c2NvcGU+X3N0YWNrIG9iamVjdEF0SW5kZXg6WzxzY29wZT5fc3RhY2sgY291bnRdLTxuZWdJbmRleD4tMV0pLjxhdHRyLm5hbWU+ID0gPGV4cHI+OworPGVsc2U+Cis8aWYoaW5kZXgpPgorKCg8c2NvcGU+X1Njb3BlICopWzxzY29wZT5fc3RhY2sgb2JqZWN0QXRJbmRleDo8aW5kZXg+XSkuPGF0dHIubmFtZT4gPSA8ZXhwcj47Cis8ZWxzZT4KKygoPHNjb3BlPl9TY29wZSAqKVs8c2NvcGU+X3N0YWNrIHBlZWtdKS48YXR0ci5uYW1lPiA9IDxleHByPjsKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiAkeCBpcyBlaXRoZXIgZ2xvYmFsIHNjb3BlIG9yIHggaXMgcnVsZSB3aXRoIGR5bmFtaWMgc2NvcGU7IHJlZmVycworICogIHRvIHN0YWNrIGl0c2VsZiBub3QgdG9wIG9mIHN0YWNrLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByZWRpY2F0ZXMKKyAqICBsaWtlIHskZnVuY3Rpb24uc2l6ZSgpPjAgJiYgJGZ1bmN0aW9uOjpuYW1lLmVxdWFscygiZm9vIil9PworICovCitpc29sYXRlZER5bmFtaWNTY29wZVJlZihzY29wZSkgOjo9ICI8c2NvcGU+X3N0YWNrIgorCisvKiogcmVmZXJlbmNlIGFuIGF0dHJpYnV0ZSBvZiBydWxlOyBtaWdodCBvbmx5IGhhdmUgc2luZ2xlIHJldHVybiB2YWx1ZSAqLworcnVsZUxhYmVsUmVmKHJlZmVyZW5jZWRSdWxlLHNjb3BlLGF0dHIpIDo6PSA8PAorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKyg8c2NvcGU+IT1uaWw/PHNjb3BlPi48YXR0ci5uYW1lPjo8aW5pdFZhbHVlKGF0dHIudHlwZSk+KQorPGVsc2U+Cis8c2NvcGU+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+ICAvKiBhZGRlZCB0byByZXR1cm5BdHRyaWJ1dGVSZWYgKi88XG4+Cis8ZWxzZT4KKzxhdHRyLm5hbWU+PFxuPgorPGVuZGlmPgorJT4KKworcmV0dXJuU2V0QXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIsZXhwcikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorIHJldHZhbC48YXR0ci5uYW1lPiA9PGV4cHI+OyAvKiBhZGRlZCB0byByZXR1cm5TZXRBdHRyaWJ1dGVSZWYgKi88XG4+Cis8ZWxzZT4KKzxhdHRyLm5hbWU+ID0gPGV4cHI+Ozxcbj4KKzxlbmRpZj4KKyU+CisKKy8qKiBIb3cgdG8gdHJhbnNsYXRlICR0b2tlbkxhYmVsICovCit0b2tlbkxhYmVsUmVmKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0XzxsYWJlbD4iCisKKworLyogbm90IHN1cmUgdGhlIG5leHQgYXJlIHRoZSByaWdodCBhcHByb2FjaDsgYW5kIHRoZXkgYXJlIGV2YWx1YXRlZCBlYXJseTsgKi8KKy8qIHRoZXkgY2Fubm90IHNlZSBUUkVFX1BBUlNFUiBvciBQQVJTRVIgYXR0cmlidXRlcyBmb3IgZXhhbXBsZS4gOiggKi8KKwordG9rZW5MYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsPzxzY29wZT4udGV4dDpuaWwpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsPzxzY29wZT4udHlwZTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD88c2NvcGU+LmxpbmU6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD88c2NvcGU+LmNoYXJQb3NpdGlvbkluTGluZTowKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD88c2NvcGU+LmNoYW5uZWw6MCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsP1s8c2NvcGU+IGdldFRva2VuSW5kZXhdOjApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+X3RyZWUiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD9bPHNjb3BlPi50ZXh0IGludGVnZXJWYWx1ZV06MCkiCisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD8oKDxsYWJlbFR5cGU+ICopPHNjb3BlPi5zdGFydCk6bmlsKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsPygoPGxhYmVsVHlwZT4gKik8c2NvcGU+LnN0b3BUb2tlbik6bmlsKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsPygoPEFTVExhYmVsVHlwZT4gKik8c2NvcGU+LnRyZWUpOm5pbCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSA8JQorPGlmKFRSRUVfUEFSU0VSKT4KKyg8c2NvcGU+IT1uaWw/W1tpbnB1dCBnZXRUb2tlblN0cmVhbV0gdG9TdHJpbmdGcm9tU3RhcnQ6W1tpbnB1dCBnZXRUcmVlQWRhcHRvcl0gZ2V0VG9rZW5TdGFydEluZGV4Ols8c2NvcGU+IGdldFN0YXJ0XV0KKyAgICAgICAgIFRvRW5kOltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RvcEluZGV4Ols8c2NvcGU+IGdldFN0YXJ0XV1dOjApCis8ZWxzZT4KKyg8c2NvcGU+IT1uaWw/KFtpbnB1dCB0b1N0cmluZ0Zyb21TdGFydDpbPHNjb3BlPiBnZXRTdGFydF0gVG9FbmQ6WzxzY29wZT4gZ2V0U3RvcF1dOjApCis8ZW5kaWY+CislPgorcnVsZUxhYmVsUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsP1s8c2NvcGU+IHN0XTpuaWwpIgorCisvKiogSXNvbGF0ZWQgJFJVTEUgcmVmIG9rIGluIGxleGVyIGFzIGl0J3MgYSBUb2tlbiAqLworbGV4ZXJSdWxlTGFiZWwobGFiZWwpIDo6PSAiPGxhYmVsPiIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD88c2NvcGU+LnR5cGU6MCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsPzxzY29wZT4ubGluZTowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD88c2NvcGU+LmNoYXJQb3NpdGlvbkluTGluZTotMSkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsPzxzY29wZT4uY2hhbm5lbDowKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICIoPHNjb3BlPiE9bmlsP1s8c2NvcGU+IGdldFRva2VuSW5kZXhdOjApIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiKDxzY29wZT4hPW5pbD88c2NvcGU+LnRleHQ6bmlsKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSIoPHNjb3BlPiE9bmlsP1s8c2NvcGU+LnRleHQgaW50ZWdlclZhbHVlXTowKSIKKworLy8gU29tZWJvZHkgbWF5IHJlZiAkdGVtcGxhdGUgb3IgJHRyZWUgb3IgJHN0b3Agd2l0aGluIGEgcnVsZToKK3J1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIigoPGxhYmVsVHlwZT4gKilyZXR2YWwuc3RhcnQpIgorcnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoKDxsYWJlbFR5cGU+ICopcmV0dmFsLnN0b3BUb2tlbikiCitydWxlUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIigoPEFTVExhYmVsVHlwZT4gKilyZXR2YWwudHJlZSkiCitydWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CitbW2lucHV0IGdldFRva2VuU3RyZWFtXSB0b1N0cmluZ0Zyb21TdGFydDpbW2lucHV0IGdldFRyZWVBZGFwdG9yXSBnZXRUb2tlblN0YXJ0SW5kZXg6cmV0dmFsLnN0YXJ0LnRva2VuLnN0YXJ0SW5kZXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0VuZDpbW2lucHV0IGdldFRyZWVBZGFwdG9yXSBnZXRUb2tlblN0b3BJbmRleDpyZXR2YWwuc3RhcnQudG9rZW4uc3RvcEluZGV4XV0KKzxlbHNlPgorW2lucHV0IHRvU3RyaW5nRnJvbVRva2VuOnJldHZhbC5zdGFydCBUb1Rva2VuOltpbnB1dCBMVDotMV1dCis8ZW5kaWY+Cis+PgorcnVsZVByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLnN0IgorCisvKiBoaWRlb3VzOiBmaW5kIGEgd2F5IHRvIGN1dCBkb3duIG9uIHRoZSBudW1iZXIgb2YgdGVtcGxhdGVzIHRvIHN1cHBvcnQgcmVhZC93cml0ZSBhY2Nlc3MgKi8KKy8qIFRPRE86IGFsc28sIHdoaWNoIG9uZXMgYXJlIHZhbGlkIHRvIHdyaXRlIHRvPyBhc2sgVGVyICovCitsZXhlclJ1bGVTZXRQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJzdGF0ZS50ZXh0ID0gPGV4cHI+OyIKK2xleGVyUnVsZVNldFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cixleHByKSA6Oj0gIl90eXBlIgorbGV4ZXJSdWxlU2V0UHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyLGV4cHIpIDo6PSAic3RhdGUudG9rZW5TdGFydExpbmUiCitsZXhlclJ1bGVTZXRQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cixleHByKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUiCitsZXhlclJ1bGVTZXRQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyLGV4cHIpIDo6PSAiLTEiIC8qIHVuZGVmaW5lZCB0b2tlbiBpbmRleCBpbiBsZXhlciAqLworbGV4ZXJSdWxlU2V0UHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyLGV4cHIpIDo6PSAic3RhdGUuY2hhbm5lbD08ZXhwcj47IgorbGV4ZXJSdWxlU2V0UHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cixleHByKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXgiCitsZXhlclJ1bGVTZXRQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIsZXhwcikgOjo9ICIoaW5wdXQuaW5kZXgtMSkiCisKKworbGV4ZXJSdWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gInNlbGYudGV4dCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50eXBlIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRMaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAic3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiLTEiIC8vIHVuZGVmaW5lZCB0b2tlbiBpbmRleCBpbiBsZXhlcgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIl9jaGFubmVsIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4IgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihpbnB1dC5pbmRleC0xKSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2ludChzY29wZSxhdHRyKSA6Oj0gIls8c2NvcGU+LnRleHQgaW50ZWdlclZhbHVlXSIKKworLy8gc2V0dGluZyAkc3QgYW5kICR0cmVlIGlzIGFsbG93ZWQgaW4gbG9jYWwgcnVsZS4gZXZlcnl0aGluZyBlbHNlCisvLyBpcyBmbGFnZ2VkIGFzIGVycm9yCitydWxlU2V0UHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyLGV4cHIpIDo6PSAicmV0dmFsLnN0YXJ0ID08ZXhwcj47IgorcnVsZVNldFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwuc3QgPTxleHByPjsiIC8qICI8XG4+I2Vycm9yIFN0cmluZ1RlbXBsYXRlcyBhcmUgdW5zdXBwb3J0ZWQ8XG4+IiAqLworCisKKy8qKiBIb3cgdG8gZXhlY3V0ZSBhbiBhY3Rpb24gKi8KK2V4ZWNBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHsKKyAgICA8YWN0aW9uPgorfQorPGVsc2U+Cis8YWN0aW9uPgorPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byBhbHdheXMgZXhlY3V0ZSBhbiBhY3Rpb24gZXZlbiB3aGVuIGJhY2t0cmFja2luZyAqLworZXhlY0ZvcmNlZEFjdGlvbihhY3Rpb24pIDo6PSAiPGFjdGlvbj4iCisKKy8vIE0gSSBTIEMgKHByb3BlcnRpZXMsIGV0Yy4uLikKKworYml0c2V0KG5hbWUsIHdvcmRzNjQpIDo6PSA8PAorc3RhdGljIEFOVExSQml0U2V0ICo8bmFtZT47CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIDxuYW1lPl9kYXRhW10gPSB7IDx3b3JkczY0OntpdCB8IDxpdD5MTH07c2VwYXJhdG9yPSIsICI+fTs8XG4+Cis+PgorCitiaXRzZXRJbml0KG5hbWUsIHdvcmRzNjQpIDo6PSA8PAorPG5hbWU+ID0gW1tBTlRMUkJpdFNldCBuZXdBTlRMUkJpdFNldFdpdGhCaXRzOihjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKik8bmFtZT5fZGF0YSBDb3VudDooTlNVSW50ZWdlcik8bGVuZ3RoKHdvcmRzNjQpPl0gcmV0YWluXTs8XG4+Cis+PgorCitjb2RlRmlsZUV4dGVuc2lvbigpIDo6PSAiLm0iCisKK3RydWVfdmFsdWUoKSA6Oj0gIllFUyIKK2ZhbHNlX3ZhbHVlKCkgOjo9ICJOTyIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9TVC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvU1Quc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTA0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL09iakMvU1Quc3RnCkBAIC0wLDAgKzEsMzcxIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKy8qKiBUZW1wbGF0ZSBzdWJncm91cCB0byBhZGQgdGVtcGxhdGUgcmV3cml0ZSBvdXRwdXQKKyAqICBJZiBkZWJ1Z2dpbmcsIHRoZW4geW91J2xsIGFsc28gZ2V0IFNURGJnLnN0ZyBsb2FkZWQuCisgKi8KKworQHJldHVyblNjb3BlSW50ZXJmYWNlLm1lbVZhcnMoKSA6Oj0gPDwKKzxAc3VwZXIubWVtVmFycygpPgorLyogU1QgcmV0dXJuSW50ZXJmYWNlLm1lbVZhcnMgKi8KK1NUICpzdDsKKz4+CisKK0ByZXR1cm5TY29wZUludGVyZmFjZS5wcm9wZXJ0aWVzKCkgOjo9IDw8Cis8QHN1cGVyLnByb3BlcnRpZXMoKT4KKy8qIFNUIHJldHVyblNjb3BlLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0U1QsIHNldHRlcj1zZXRTVDopIFNUICpzdDsKKz4+CisKK0ByZXR1cm5TY29wZUludGVyZmFjZS5tZXRob2RzRGVjbCgpIDo6PSA8PAorPEBzdXBlci5tZXRob2RzRGVjbCgpPgorLyogU1QgQVNUIHJldHVyblNjb3BlSW50ZXJmYWNlLm1ldGhvZHNEZWNsICovCistIChpZCkgZ2V0VGVtcGxhdGU7CistIChOU1N0cmluZyAqKSB0b1N0cmluZzsKKy0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uOworPj4KKworQHJldHVyblNjb3BlSW50ZXJmYWNlKCkgOjo9IDw8CisvKiBTVCByZXR1cm5TY29wZUludGVyZmFjZSAqLworQGludGVyZmFjZSA8cmV0dXJuU2NvcGVJbnRlcmZhY2UubmFtZT4gOiBBTlRMUlJldHVyblNjb3BlIHsKKzxyZXR1cm5TY29wZUludGVyZmFjZS5tZW1WYXJzKCk+Cit9Cis8cmV0dXJuU2NvcGVJbnRlcmZhY2UucHJvcGVydGllcygpPgorCis8cmV0dXJuU2NvcGVJbnRlcmZhY2UubWV0aG9kcygpPgorQGVuZAorPj4KKworQHJldHVyblNjb3BlSW1wbGVtZW50YXRpb24uc3ludGhlc2l6ZSgpIDo6PSA8PAorPEBzdXBlci5zeW50aGVzaXplKCk+CisvKiBTVCByZXR1cm5TY29wZS5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSBzdDsKKz4+CisKK0ByZXR1cm5TY29wZUltcGxlbWVudGF0aW9uLm1ldGhvZHMoKSA6Oj0gPDwKKzxAc3VwZXIubWV0aG9kcygpPgorLyogU1QgcmV0dXJuU2NvcGUubWV0aG9kcyAqLworLSAoaWQpIGdldFRlbXBsYXRlIHsgcmV0dXJuIHN0OyB9CistIChOU1N0cmluZyAqKSB0b1N0cmluZyB7IHJldHVybiBzdD09bmlsP25pbDpbc3QgdG9TdHJpbmddOyB9CistIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IFtzZWxmIHRvU3RyaW5nXTsgfQorPj4KKworQHJldHVyblNjb3BlSW1wbGVtZW50YXRpb24oKSA6Oj0gPDwKK0BpbXBsZW1lbnRhdGlvbiA8cmV0dXJuU2NvcGVJbXBsZW1lbnRhdGlvbi5uYW1lPgorPHJldHVyblNjb3BlSW1wbGVtZW50YXRpb24uc3ludGhlc2l6ZSgpPgorCis8cmV0dXJuU2NvcGVJbXBsZW1lbnRhdGlvbi5tZXRob2RzKCk+CitAZW5kCis+PgorCisvKiogQWRkIHRoaXMgdG8gZWFjaCBydWxlJ3MgcmV0dXJuIHZhbHVlIHN0cnVjdCAqLworQHJldHVyblNjb3BlLnJ1bGVSZXR1cm5NZW1iZXJzKCkgOjo9IDw8Cis8QHN1cGVyLnJ1bGVSZXR1cm5NZW1iZXJzKCk+CisvKiBTVCByZXR1cm5TY29wZS5ydWxlUmV0dXJuTWVtYmVycyAtLSBlbXB0eSAqLworPj4KKworQGdlbmVyaWNQYXJzZXJIZWFkZXJGaWxlLm1lbVZhcnMoKSA6Oj0gPDwKKzxAc3VwZXIubWVtVmFycygpPgorLyogU1QgZ2VuZXJpY1BhcnNlckhlYWRlckZpbGUubWVtVmFycyAtLSBlbXB0eSBub3cgKi8KK1NUR3JvdXAgKnRlbXBsYXRlTGliOyAvKiBTVCAtLSByZWFsbHkgYSBwYXJ0IG9mIFNUQXR0ck1hcCAqLworPj4KKworQGdlbmVyaWNQYXJzZXJIZWFkZXJGaWxlLnByb3BlcnRpZXMoKSA6Oj0gPDwKKzxAc3VwZXIucHJvcGVydGllcygpPgorLyogU1QgZ2VuZXJpY1BhcnNlci5wcm9wZXJ0aWVzICovCitAcHJvcGVydHkgKHJldGFpbiwgZ2V0dGVyPWdldFRlbXBsYXRlTGliLCBzZXR0ZXI9c2V0VGVtcGxhdGVMaWI6KSBTVEdyb3VwICp0ZW1wbGF0ZUxpYjsKKz4+CisKK0BnZW5lcmljUGFyc2VySGVhZGVyRmlsZS5tZXRob2RzRGVjbCgpIDo6PSA8PAorPEBzdXBlci5tZXRob2RzRGVjbCgpPgorLyogU1QgZ2VuZXJpY1BhcnNlci5tZXRob2RzRGVjbCAqLworLSBpbml0OworLSAoU1RHcm91cCAqKSBnZXRUZW1wbGF0ZUxpYjsKKy0gKHZvaWQpIHNldFRlbXBsYXRlTGliOihTVEdyb3VwICopYVRlbXBsYXRlTGliOworQGVuZAorPj4KKworQGdlbmVyaWNQYXJzZXIuc3ludGhlc2l6ZSgpIDo6PSA8PAorPEBzdXBlci5zeW50aGVzaXplKCk+CisvKiBTVCBnZW5lcmljUGFyc2VySW1wbGVtZW50YXRpb24uc3ludGhlc2l6ZSAqLworQHN5bnRoZXNpemUgdGVtcGxhdGVMaWI7Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZXRob2RzKCkgOjo9IDw8Cis8QHN1cGVyLm1ldGhvZHMoKT4KKy8qIFNUIGdlbmVyaWNQYXJzZXIubWV0aG9kcyAqLworCistIChTVEdyb3VwICopZ2V0VGVtcGxhdGVMaWIKK3sKKyAgICByZXR1cm4gdGVtcGxhdGVMaWI7Cit9CisKKy0gKHZvaWQpIHNldFRlbXBsYXRlTGliOihTVEdyb3VwICopYVRlbXBsYXRlTGliCit7CisgICAgdGVtcGxhdGVMaWIgPSBhVGVtcGxhdGVMaWI7Cit9CisKKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKzxAc3VwZXIubWVtYmVycygpPgorU1RHcm91cCAqdGVtcGxhdGVMaWIgPSBbU1RHcm91cCAgbmV3U1RHcm91cDpAIjxuYW1lPlRlbXBsYXRlcyJdOworCistIChTVEdyb3VwICopIGdldFRlbXBsYXRlTGliCit7CisgIHJldHVybiB0ZW1wbGF0ZUxpYjsKK30KKworLSAodm9pZCkgc2V0VGVtcGxhdGVMaWI6KFNUR3JvdXAgKikgdGVtcGxhdGVMaWIKK3sKKyAgdGhpcy50ZW1wbGF0ZUxpYiA9IHRlbXBsYXRlTGliOworfQorCisvKiogYWxsb3dzIGNvbnZlbmllbnQgbXVsdGktdmFsdWUgaW5pdGlhbGl6YXRpb246CisgKiAgIm5ldyBTVEF0dHJNYXAoKS5wdXQoLi4uKS5wdXQoLi4uKSIKKyAqLworLyogUkVQTEFDRSBUSElTIFNUQVRJQyBDTEFTUworc3RhdGljIGNsYXNzIFNUQXR0ck1hcCBleHRlbmRzIEhhc2hNYXAgeworLSAoU1RBdHRyTWFwICopIHNldE9iamVjdDooaWQpYVZhbHVlIGZvcktleTooTlMqKVN0cmluZyBhdHRyTmFtZQoreworICAgIFtzdXBlciBzZXRPYmplY3Q6dmFsdWUgZm9yS2V5OmF0dHJOYW1lXTsKKyAgICByZXR1cm4gc2VsZjsKK30KKy0gKFNUQXR0ck1hcCAqKSBzZXRPYmplY3RXaXRoSW50OihOU0ludGVnZXIpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWF0dHJOYW1lCit7CisgICAgW3N1cGVyIHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6dmFsdWVdIGZvcktleTphdHRyTmFtZV07CisgICAgcmV0dXJuIHNlbGY7CisgIH0KK30KKyovCis+PgorCitAU1RBdHRyTWFwKCkgOjo9IDw8CisvKiAtLS0tLS0tLSBTVCBzdGFydCBTVEF0dHJNYXAgLS0tLS0tLS0tLS0tICovCis8QFNUQXR0ck1hcC5pbnRlcmZhY2UoKT4KKzxAU1RBdHRyTWFwLmltcGxlbWVudGF0aW9uKCk+CisvKiAtLS0tLS0tLSBTVCBlbmQgU1RBdHRyTWFwIC0tLS0tLS0tLS0tLSAqLworPj4KKworQFNUQXR0ck1hcC5pbnRlcmZhY2UoKSA6Oj0gPDwKKy8qIC0tLS0tLS0tIFNUIHN0YXJ0IFNUQXR0ck1hcC5pbnRlcmZhY2UgLS0tLS0tLS0tLS0tICovCitAaW50ZXJmYWNlIFNUQXR0ck1hcCA6IEFOVExSSGFzaE1hcCB7CisvKiAgICA8QFNUQXR0ck1hcC5tZW1WYXJzKCk+ICovCisgICAgU1RHcm91cCAqdGVtcGxhdGVMaWI7Cit9CisKKy8qICAgIDxAU1RBdHRyTWFwLnByb3BlcnRpZXMoKT4gKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VGVtcGxhdGVMaWIsIHNldHRlcj1zZXRUZW1wbGF0ZUxpYjopIFNUR3JvdXAgKnRlbXBsYXRlTGliOworLyogPEBTVEF0dHJNYXAubWV0aG9kc0RlY2woKT4gKi8KKy0gKGlkKSBpbml0OworLSAoU1RBdHRyTWFwICopIHNldE9iamVjdDooaWQpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWF0dHJOYW1lOworLSAoU1RBdHRyTWFwICopIHNldE9iamVjdFdpdGhJbnQ6KE5TSW50ZWdlcil2YWx1ZSBmb3JLZXk6KE5TU3RyaW5nICopYXR0ck5hbWU7CistICh2b2lkKSBzZXRUZW1wbGF0ZUxpYjooU1RHcm91cCAqKWFUZW1wbGF0ZUxpYjsKKy0gKFNUR3JvdXAgKikgZ2V0VGVtcGxhdGVMaWI7CitAZW5kCisvKiAtLS0tLS0tLSBTVCBlbmQgU1RBdHRyTWFwLmludGVyZmFjZSAtLS0tLS0tLS0tLS0gKi8KKz4+CisKK0BTVEF0dHJNYXAuaW1wbGVtZW50YXRpb24oKSA6Oj0gPDwKKy8qIC0tLS0tLS0tIFNUIHN0YXJ0IFNUQXR0ck1hcC5pbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0gKi8KKy8qKiBhbGxvd3MgY29udmVuaWVudCBtdWx0aS12YWx1ZSBpbml0aWFsaXphdGlvbjoKKyAqICAibmV3IFNUQXR0ck1hcCgpLnB1dCguLi4pLnB1dCguLi4pIgorICovCitAaW1wbGVtZW50YXRpb24gU1RBdHRyTWFwCitAc3ludGhlc2l6ZSB0ZW1wbGF0ZUxpYjsKKworPEBTVEF0dHJNYXAubWV0aG9kcygpPgorQGVuZAorLyogLS0tLS0tLS0gU1QgZW5kIFNUQXR0ck1hcC5pbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0gKi8KKz4+CisKK0BTVEF0dHJNYXAubWVtVmFycygpIDo6PSA8PAorLyogLS0tLS0tLS0gU1Qgc3RhcnQgU1RBdHRyTWFwLm1lbVZhcnMgLS0tLS0tLS0tLS0tICovCisgICAgU1RHcm91cCAqdGVtcGxhdGVMaWI7CisvKiAtLS0tLS0tLSBTVCBlbmQgU1RBdHRyTWFwLm1lbVZhcnMgLS0tLS0tLS0tLS0tICovCis+PgorCitAU1RBdHRyTWFwLnByb3BlcnRpZXMoKSA6Oj0gPDwKKy8qIC0tLS0tLS0tIFNUIHN0YXJ0IFNUQXR0ck1hcC5wcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLSAqLworQHByb3BlcnR5IChyZXRhaW4sIGdldHRlcj1nZXRUZW1wbGF0ZUxpYiwgc2V0dGVyPXNldFRlbXBsYXRlTGliOikgU1RHcm91cCAqdGVtcGxhdGVMaWI7CisvKiAtLS0tLS0tLSBTVCBlbmQgU1RBdHRyTWFwLnByb3BlcnRpZXMgLS0tLS0tLS0tLS0tICovCis+PgorCitAU1RBdHRyTWFwLm1ldGhvZHNEZWNsKCkgOjo9IDw8CisvKiAtLS0tLS0tLSBTVCBzdGFydCBTVEF0dHJNYXAubWV0aG9kc0RlY2wgLS0tLS0tLS0tLS0tICovCistIChpZCkgaW5pdDsKKy0gKFNUQXR0ck1hcCAqKSBzZXRPYmplY3Q6KGlkKXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilhdHRyTmFtZTsKKy0gKFNUQXR0ck1hcCAqKSBzZXRPYmplY3RXaXRoSW50OihOU0ludGVnZXIpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWF0dHJOYW1lOworLSAodm9pZCkgc2V0VGVtcGxhdGVMaWI6KFNUR3JvdXAgKilhVGVtcGxhdGVMaWI7CistIChTVEdyb3VwICopIGdldFRlbXBsYXRlTGliOworLyogLS0tLS0tLS0gU1QgZW5kIFNUQXR0ck1hcC5tZXRob2RzRGVjbCAtLS0tLS0tLS0tLS0gKi8KKz4+CisKK0BTVEF0dHJNYXAubWV0aG9kcygpIDo6PSA8PAorLyogLS0tLS0tLS0gU1Qgc3RhcnQgU1RBdHRyTWFwLm1ldGhvZHMgLS0tLS0tLS0tLS0tICovCistIChpZCkgaW5pdAoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhMZW46MTZdOworICAgIGlmICggc2VsZiAhPSBuaWwgKSB7CisgICAgICAgIHRlbXBsYXRlTGliID0gW1NUR3JvdXAgbmV3U1RHcm91cDoiPG5hbWU+VGVtcGxhdGVzIl07CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChTVEF0dHJNYXAgKikgc2V0T2JqZWN0OihpZClhVmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWFBdHRyTmFtZQoreworICAgIFtzdXBlciBzZXRPYmplY3Q6YVZhbHVlIGZvcktleTphQXR0ck5hbWVdOworICAgIHJldHVybiBzZWxmOworfQorCistIChTVEF0dHJNYXAgKikgc2V0T2JqZWN0V2l0aEludDooTlNJbnRlZ2VyKWFWYWx1ZSBmb3JLZXk6KE5TU3RyaW5nICopYUF0dHJOYW1lCit7CisgICAgW3N1cGVyIHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEludGVnZXI6YVZhbHVlXSBmb3JLZXk6YUF0dHJOYW1lXTsKKyAgICByZXR1cm4gc2VsZjsKK30KKy0gKHZvaWQpIHNldFRlbXBsYXRlTGliOihTVEdyb3VwICopYVRlbXBsYXRlTGliCit7CisgICAgdGVtcGxhdGVMaWIgPSBhVGVtcGxhdGVMaWI7Cit9CisKKy0gKFNUR3JvdXAgKilnZXRUZW1wbGF0ZUxpYgoreworICAgIHJldHVybiB0ZW1wbGF0ZUxpYjsKK30KKy8qIC0tLS0tLS0tIFNUIGVuZCBTVEF0dHJNYXAubWV0aG9kcyAtLS0tLS0tLS0tLS0gKi8KKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PXRlbXBsYXRlICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorLyogU1QgcnVsZVJlZkFuZExpc3RMYWJsZSAqLworPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1bbGFiZWwgZ2V0VGVtcGxhdGUsLi4uXT4KKz4+CisKK3Jld3JpdGVUZW1wbGF0ZShhbHRzKSA6Oj0gPDwKKy8qIC0tLS0tLS0tIFNUIHN0YXJ0IHJld3JpdGVUZW1wbGF0ZSAtLS0tLS0tLS0tLS0gKi8KKy8vIFRFTVBMQVRFIFJFV1JJVEUKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgKCA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPiApIHsKKyAgICA8YWx0czpyZXdyaXRlVGVtcGxhdGVBbHQoKTsgc2VwYXJhdG9yPSJlbHNlICI+CisgICAgPGlmKHJld3JpdGVNb2RlKT48cmVwbGFjZVRleHRJbkxpbmUoKT48ZW5kaWY+Cit9Cis8ZWxzZT4KKzxhbHRzOnJld3JpdGVUZW1wbGF0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKzxpZihyZXdyaXRlTW9kZSk+PHJlcGxhY2VUZXh0SW5MaW5lKCk+PGVuZGlmPgorPGVuZGlmPgorLyogLS0tLS0tLS0gU1QgZW5kIHJld3JpdGVUZW1wbGF0ZSAtLS0tLS0tLS0tLS0gKi8KKz4+CisKK3JlcGxhY2VUZXh0SW5MaW5lKCkgOjo9IDw8CisvKiAtLS0tLS0tLSBTVCBzdGFydCByZXBsYWNlVGV4dEluTGluZSAtLS0tLS0tLS0tLS0gKi8KKzxpZihUUkVFX1BBUlNFUik+CitbWyhBTlRMUlRva2VuUmV3cml0ZVN0cmVhbSAqKWlucHV0IGdldFRva2VuU3RyZWFtXQorICAgIHJlcGxhY2VGcm9tSW5kZXg6W1tpbnB1dCBnZXRUcmVlQWRhcHRvcl0gZ2V0VG9rZW5TdGFydEluZGV4OnJldHZhbC5zdGFydF0KKyAgICAgICAgICAgICBUb0luZGV4OltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RvcEluZGV4OnJldHZhbC5zdGFydF0KKyAgICAgICAgICAgICAgICBUZXh0OnJldHZhbC5zdF07Cis8ZWxzZT4KK1soQU5UTFJUb2tlblJld3JpdGVTdHJlYW0gKilpbnB1dCkKKyAgICAgICAgcmVwbGFjZUZyb21JbmRleDpbKChBTlRMUkNvbW1vblRva2VuICopcmV0dmFsLnN0YXJ0KSBnZXRUb2tlbkluZGV4XQorICAgICAgICAgICAgICAgICBUb0luZGV4OltbaW5wdXQgTFQ6LTFdIGdldFRva2VuSW5kZXhdCisgICAgICAgICAgICAgICAgICAgIFRleHQ6cmV0dmFsLnN0XTsKKzxlbmRpZj4KKy8qIC0tLS0tLS0tIFNUIGVuZCByZXBsYWNlVGV4dEluTGluZSAtLS0tLS0tLS0tLS0gKi8KKz4+CisKK3Jld3JpdGVUZW1wbGF0ZUFsdCgpIDo6PSA8PAorLyogLS0tLS0tLS0gU1Qgc3RhcnQgcmV3cml0ZVRlbXBsYXRlQWx0IC0tLS0tLS0tLS0tLSAqLworLyogU1QgPGl0LmRlc2NyaXB0aW9uPiAqLworPGlmKGl0LnByZWQpPgoraWYgKDxpdC5wcmVkPikgeworICAgIHJldHZhbC5zdCA9IDxpdC5hbHQ+OworfTxcbj4KKzxlbHNlPgoreworICAgIHJldHZhbC5zdCA9IDxpdC5hbHQ+OworfTxcbj4KKzxlbmRpZj4KKy8qIC0tLS0tLS0tIFNUIGVuZCByZXdyaXRlVGVtcGxhdGVBbHQgLS0tLS0tLS0tLS0tICovCis+PgorCityZXdyaXRlRW1wdHlUZW1wbGF0ZShhbHRzKSA6Oj0gPDwKK25pbDsKKz4+CisKKy8qKiBJbnZva2UgYSB0ZW1wbGF0ZSB3aXRoIGEgc2V0IG9mIGF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHBhaXJzLgorICogIFNldCB0aGUgdmFsdWUgb2YgdGhlIHJ1bGUncyB0ZW1wbGF0ZSAqYWZ0ZXIqIGhhdmluZyBzZXQKKyAqICB0aGUgYXR0cmlidXRlcyBiZWNhdXNlIHRoZSBydWxlJ3MgdGVtcGxhdGUgbWlnaHQgYmUgdXNlZCBhcworICogIGFuIGF0dHJpYnV0ZSB0byBidWlsZCBhIGJpZ2dlciB0ZW1wbGF0ZTsgeW91IGdldCBhIHNlbGYtZW1iZWRkZWQKKyAqICB0ZW1wbGF0ZS4KKyAqLworcmV3cml0ZUV4dGVybmFsVGVtcGxhdGUobmFtZSxhcmdzKSA6Oj0gPDwKKy8qIC0tLS0tLS0tIFNUIHN0YXJ0IHJld3JpdGVFeHRlcm5hbFRlbXBsYXRlIC0tLS0tLS0tLS0tLSAqLworW3RlbXBsYXRlTGliIGdldEluc3RhbmNlT2Y6QCI8bmFtZT4iCis8aWYoYXJncyk+W1tTVEF0dHJNYXAgbmV3U1RBdHRyTWFwXSA8YXJnczp7YSB8IHNldE9iamVjdDo8YS52YWx1ZT4gZm9yS2V5OkAiPGEubmFtZT4iXX0+PGVuZGlmPl0KKy8qIC0tLS0tLS0tIFNUIGVuZCByZXdyaXRlRXh0ZXJuYWxUZW1wbGF0ZSAtLS0tLS0tLS0tLS0gKi8KKz4+CisKKy8qKiBleHByIGlzIGEgc3RyaW5nIGV4cHJlc3Npb24gdGhhdCBzYXlzIHdoYXQgdGVtcGxhdGUgdG8gbG9hZCAqLworcmV3cml0ZUluZGlyZWN0VGVtcGxhdGUoZXhwcixhcmdzKSA6Oj0gPDwKKy8qIC0tLS0tLS0tIFNUIHN0YXJ0IHJld3JpdGVJbmRpcmVjdFRlbXBsYXRlIC0tLS0tLS0tLS0tLSAqLworW3RlbXBsYXRlTGliIGdldEluc3RhbmNlT2Y6PGV4cHI+Cis8aWYoYXJncyk+IFtbU1RBdHRyTWFwIG5ld1NUQXR0ck1hcF08YXJnczp7YSB8IHNldE9iamVjdDo8YS52YWx1ZT4gZm9yS2V5OkAiPGEubmFtZT4iXX0+XQorPGVsc2U+XTxlbmRpZj4KKy8qIC0tLS0tLS0tIFNUIGVuZCByZXdyaXRlSW5kaXJlY3RUZW1wbGF0ZSAtLS0tLS0tLS0tLS0gKi8KKz4+CisKKy8qKiBJbnZva2UgYW4gaW5saW5lIHRlbXBsYXRlIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMgKi8KK3Jld3JpdGVJbmxpbmVUZW1wbGF0ZShhcmdzLCB0ZW1wbGF0ZSkgOjo9IDw8CisvKiAtLS0tLS0tLSBTVCBzdGFydCByZXdyaXRlSW5saW5lVGVtcGxhdGUgLS0tLS0tLS0tLS0tICovCitTVEdyb3VwICp0ZW1wbGF0ZUxpYjsKK3RlbXBsYXRlTGliLnRlbXBsYXRlcyA9IFtTVEF0dHJNYXAgbmV3U1RBdHRyTWFwXTsKKzxpZihhcmdzKT4gW3RlbXBsYXRlTGliLnRlbXBsYXRlcyA8YXJnczp7YSB8IHNldE9iamVjdDo8YS52YWx1ZT4gZm9yS2V5OkAiPGEubmFtZT4iXTt9PjxlbmRpZj4KK1tTVCBuZXdTVDp0ZW1wbGF0ZUxpYiB0ZW1wbGF0ZTpAIjx0ZW1wbGF0ZT4iXTsKKy8qIC0tLS0tLS0tIFNUIGVuZCByZXdyaXRlSW5saW5lVGVtcGxhdGUgLS0tLS0tLS0tLS0tICovCis+PgorCisvKiogcGxhaW4gLT4ge2Zvb30gYWN0aW9uICovCityZXdyaXRlQWN0aW9uKGFjdGlvbikgOjo9IDw8CisvKiAtLS0tLS0tLSBTVCBzdGFydCByZXdyaXRlQWN0aW9uIC0tLS0tLS0tLS0tLSAqLworPGFjdGlvbj4KKy8qIC0tLS0tLS0tIFNUIGVuZCByZXdyaXRlQWN0aW9uIC0tLS0tLS0tLS0tLSAqLworPj4KKworLyoqIEFuIGFjdGlvbiBoYXMgJXN0LmF0dHJOYW1lPWV4cHI7IG9yICV7c3R9LmF0dHJOYW1lPWV4cHI7ICovCithY3Rpb25TZXRBdHRyaWJ1dGUoc3QsYXR0ck5hbWUsZXhwcikgOjo9IDw8CisvKiAtLS0tLS0tLSBTVCBzdGFydCBhY3Rpb25TZXRBdHRyaWJ1dGUgLS0tLS0tLS0tLS0tICovCitbW1NUIGF0dHJpYnV0ZXNdIHNldE9iamVjdDo8ZXhwcj4gZm9yS2V5OkAiPGF0dHJOYW1lPiJdOworPCFbPHN0PiBzZXRBdHRyaWJ1dGU6PGV4cHI+IG5hbWU6QCI8YXR0ck5hbWU+Il07IT4KKy8qIC0tLS0tLS0tIFNUIGVuZCBhY3Rpb25TZXRBdHRyaWJ1dGUgLS0tLS0tLS0tLS0tICovCis+PgorCisvKiogVHJhbnNsYXRlICV7c3RyaW5nRXhwcn0gKi8KK2FjdGlvblN0cmluZ0NvbnN0cnVjdG9yKHN0cmluZ0V4cHIpIDo6PSA8PAorLyogLS0tLS0tLS0gU1Qgc3RhcnQgYWN0aW9uU3RyaW5nQ29uc3RydWN0b3IgLS0tLS0tLS0tLS0tICovCitbU1QgbmV3U1RXaXRoVGVtcGxhdGU6PHN0cmluZ0V4cHI+XQorLyogLS0tLS0tLS0gU1QgZW5kIGFjdGlvblN0cmluZ0NvbnN0cnVjdG9yIC0tLS0tLS0tLS0tLSAqLworPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9TVDRPYmpDLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvT2JqQy9TVDRPYmpDLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmMxMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9PYmpDL1NUNE9iakMuc3RnCkBAIC0wLDAgKzEsMjMyIEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKy8qKiBUZW1wbGF0ZSBzdWJncm91cCB0byBhZGQgdGVtcGxhdGUgcmV3cml0ZSBvdXRwdXQKKyAqICBJZiBkZWJ1Z2dpbmcsIHRoZW4geW91J2xsIGFsc28gZ2V0IFNURGJnLnN0ZyBsb2FkZWQuCisgKi8KKworQG91dHB1dEZpbGUuaW1wb3J0cygpIDo6PSA8PAorPEBzdXBlci5pbXBvcnRzKCk+CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Cis+PgorCisvKiogQWRkIHRoaXMgdG8gZWFjaCBydWxlJ3MgcmV0dXJuIHZhbHVlIHN0cnVjdCAqLworQHJldHVyblNjb3BlLnJ1bGVSZXR1cm5NZW1iZXJzKCkgOjo9IDw8CisvKiBTVCByZXR1cm5TY29wZS5ydWxlUmV0dXJuTWVtYmVycyAtLSBlbXB0eSAqLworPj4KKworLyoqIEFkZCB0aGlzIHRvIGVhY2ggcnVsZSdzIHJldHVybiB2YWx1ZSBzdHJ1Y3QgKi8KK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuLm1lbXZhcnMoKSA6Oj0gPDwKK1NUICpzdDsKKz4+CisKKy8qKiBBZGQgdGhpcyB0byBlYWNoIHJ1bGUncyByZXR1cm4gdmFsdWUgc3RydWN0ICovCitAcmV0dXJuU2NvcGUucnVsZVJldHVybi5wcm9wZXJ0aWVzKCkgOjo9IDw8CitAcHJvcGVydHkgKHJldGFpbikgU1QgKnN0OworPj4KKworLyoqIEFkZCB0aGlzIHRvIGVhY2ggcnVsZSdzIHJldHVybiB2YWx1ZSBzdHJ1Y3QgKi8KK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuLm1ldGhvZHNEZWNsKCkgOjo9IDw8CistIChTVCAqKWdldFRlbXBsYXRlOworLSAoTlNTdHJpbmcgKil0b1N0cmluZzsKKz4+CisKKy8qKiBBZGQgdGhpcyB0byBlYWNoIHJ1bGUncyByZXR1cm4gdmFsdWUgc3RydWN0ICovCitAcmV0dXJuU2NvcGUucnVsZVJldHVybi5zeW50aGVzaXplKCkgOjo9IDw8CitAc3ludGhlc2l6ZSBzdDsKKz4+CisKKy8qKiBBZGQgdGhpcyB0byBlYWNoIHJ1bGUncyByZXR1cm4gdmFsdWUgc3RydWN0ICovCitAcmV0dXJuU2NvcGUucnVsZVJldHVybi5tZXRob2RzKCkgOjo9IDw8CistIChTVCAqKWdldFRlbXBsYXRlIHsgcmV0dXJuIHN0OyB9CistIChOU1N0cmluZyAqKXRvU3RyaW5nIHsgcmV0dXJuIHN0PT1uaWw/bmlsOltzdCByZW5kZXJdOyB9Cis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8QHN1cGVyLm1lbWJlcnMoKT4KK1NUR3JvdXAgKnRlbXBsYXRlTGliID0gW1NUR3JvdXAgbmV3U1RHcm91cF07CisKKy0gKHZvaWQpc2V0VGVtcGxhdGVMaWI6KFNUR3JvdXAgKilhVGVtcGxhdGVMaWIKK3sKKyAgICBzZWxmLnRlbXBsYXRlTGliID0gYVRlbXBsYXRlTGliOworfQorCistIChTVEdyb3VwICopZ2V0VGVtcGxhdGVMaWIKK3sKKyAgICByZXR1cm4gdGVtcGxhdGVMaWI7Cit9Cis+PgorCitAZ2VuZXJpY1BhcnNlckhlYWRlckZpbGUubWVtVmFycygpIDo6PSA8PAorPEBzdXBlci5tZW1WYXJzKCk+CisvKiBTVCBnZW5lcmljUGFyc2VySGVhZGVyRmlsZS5tZW1WYXJzIC0tIGVtcHR5IG5vdyAqLworU1RHcm91cCAqdGVtcGxhdGVMaWI7IC8qIFNUIC0tIHJlYWxseSBhIHBhcnQgb2YgU1RBdHRyTWFwICovCis+PgorCitAZ2VuZXJpY1BhcnNlckhlYWRlckZpbGUucHJvcGVydGllcygpIDo6PSA8PAorPEBzdXBlci5wcm9wZXJ0aWVzKCk+CisvKiBTVCBnZW5lcmljUGFyc2VyLnByb3BlcnRpZXMgKi8KK0Bwcm9wZXJ0eSAocmV0YWluLCBnZXR0ZXI9Z2V0VGVtcGxhdGVMaWIsIHNldHRlcj1zZXRUZW1wbGF0ZUxpYjopIFNUR3JvdXAgKnRlbXBsYXRlTGliOworPj4KKworQGdlbmVyaWNQYXJzZXJIZWFkZXJGaWxlLm1ldGhvZHNEZWNsKCkgOjo9IDw8Cis8QHN1cGVyLm1ldGhvZHNEZWNsKCk+CisvKiBTVCBnZW5lcmljUGFyc2VyLm1ldGhvZHNEZWNsICovCistIGluaXQ7CistIChTVEdyb3VwICopIGdldFRlbXBsYXRlTGliOworLSAodm9pZCkgc2V0VGVtcGxhdGVMaWI6KFNUR3JvdXAgKilhVGVtcGxhdGVMaWI7CitAZW5kCis+PgorCitAZ2VuZXJpY1BhcnNlci5zeW50aGVzaXplKCkgOjo9IDw8Cis8QHN1cGVyLnN5bnRoZXNpemUoKT4KKy8qIFNUIGdlbmVyaWNQYXJzZXJJbXBsZW1lbnRhdGlvbi5zeW50aGVzaXplICovCitAc3ludGhlc2l6ZSB0ZW1wbGF0ZUxpYjsKKz4+CisKK0BnZW5lcmljUGFyc2VyLm1ldGhvZHMoKSA6Oj0gPDwKKzxAc3VwZXIubWV0aG9kcygpPgorLyogU1QgZ2VuZXJpY1BhcnNlci5tZXRob2RzICovCisKKy0gKFNUR3JvdXAgKilnZXRUZW1wbGF0ZUxpYgoreworICAgIHJldHVybiB0ZW1wbGF0ZUxpYjsKK30KKworLSAodm9pZCkgc2V0VGVtcGxhdGVMaWI6KFNUR3JvdXAgKilhVGVtcGxhdGVMaWIKK3sKKyAgICB0ZW1wbGF0ZUxpYiA9IGFUZW1wbGF0ZUxpYjsKK30KKworPj4KKworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPEBzdXBlci5tZW1iZXJzKCk+CitTVEdyb3VwICp0ZW1wbGF0ZUxpYiA9IFtTVEdyb3VwIG5ld1NUR3JvdXBdOworCistIChTVEdyb3VwICopIGdldFRlbXBsYXRlTGliCit7CisgIHJldHVybiB0ZW1wbGF0ZUxpYjsKK30KKworLSAodm9pZCkgc2V0VGVtcGxhdGVMaWI6KFNUR3JvdXAgKikgdGVtcGxhdGVMaWIKK3sKKyAgdGhpcy50ZW1wbGF0ZUxpYiA9IHRlbXBsYXRlTGliOworfQorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD10ZW1wbGF0ZSAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpPgorPGxpc3RMYWJlbChsYWJlbCwgeyBbPGxhYmVsPiBnZXRUZW1wbGF0ZV07IH0pPgorPj4KKworcmV3cml0ZVRlbXBsYXRlKGFsdHMpIDo6PSA8PAorCisvLyBURU1QTEFURSBSRVdSSVRFCis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7CisgIDxhbHRzOnJld3JpdGVUZW1wbGF0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKyAgPGlmKHJld3JpdGVNb2RlKT48cmVwbGFjZVRleHRJbkxpbmUoKT48ZW5kaWY+Cit9Cis8ZWxzZT4KKzxhbHRzOnJld3JpdGVUZW1wbGF0ZUFsdCgpOyBzZXBhcmF0b3I9ImVsc2UgIj4KKzxpZihyZXdyaXRlTW9kZSk+PHJlcGxhY2VUZXh0SW5MaW5lKCk+PGVuZGlmPgorPGVuZGlmPgorPj4KKworcmVwbGFjZVRleHRJbkxpbmUoKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CisgICAgWyhbKFRva2VuUmV3cml0ZVN0cmVhbSlpbnB1dCBnZXRUb2tlblN0cmVhbV0pIAorICAgIHJlcGxhY2VGcm9tSW5kZXg6W1tpbnB1dCBnZXRUcmVlQWRhcHRvcl0gZ2V0VG9rZW5TdGFydEluZGV4OnJldHZhbC5zdGFydF0KKyAgICBUb0luZGV4OltbaW5wdXQgZ2V0VHJlZUFkYXB0b3JdIGdldFRva2VuU3RvcEluZGV4OnJldHZhbC5zdGFydF0KKyAgICBUZXh0OltyZXR2YWwuc3QgcmVuZGVyXV07Cis8ZWxzZT4KKyAgICBbKChUb2tlblJld3JpdGVTdHJlYW0paW5wdXQpIAorICAgIHJlcGxhY2VGcm9tSW5kZXg6WygoVG9rZW4pcmV0dmFsLnN0YXJ0KSBnZXRUb2tlbkluZGV4XQorICAgIFRvSW5kZXg6W2lucHV0IExUOi0xXSBnZXRUb2tlbkluZGV4XQorICAgIFRleHQ6W3JldHZhbC5zdCByZW5kZXJdXTsKKzxlbmRpZj4KKz4+CisKK3Jld3JpdGVUZW1wbGF0ZUFsdChhbHQpIDo6PSA8PAorLy8gPGFsdC5kZXNjcmlwdGlvbj4KKzxpZihhbHQucHJlZCk+CitpZiAoPGFsdC5wcmVkPikgeworICAgIHJldHZhbC5zdCA9IDxhbHQuYWx0PjsKK308XG4+Cis8ZWxzZT4KK3sKKyAgICByZXR2YWwuc3QgPSA8YWx0LmFsdD47Cit9PFxuPgorPGVuZGlmPgorPj4KKworcmV3cml0ZUVtcHR5VGVtcGxhdGUoYWx0cykgOjo9IDw8CituaWw7Cis+PgorCisvKiogSW52b2tlIGEgdGVtcGxhdGUgd2l0aCBhIHNldCBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycy4KKyAqICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBydWxlJ3MgdGVtcGxhdGUgKmFmdGVyKiBoYXZpbmcgc2V0CisgKiAgdGhlIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGUgcnVsZSdzIHRlbXBsYXRlIG1pZ2h0IGJlIHVzZWQgYXMKKyAqICBhbiBhdHRyaWJ1dGUgdG8gYnVpbGQgYSBiaWdnZXIgdGVtcGxhdGU7IHlvdSBnZXQgYSBzZWxmLWVtYmVkZGVkCisgKiAgdGVtcGxhdGUuCisgKi8KK3Jld3JpdGVFeHRlcm5hbFRlbXBsYXRlKG5hbWUsYXJncykgOjo9IDwlCis8aWYoYXJncyk+PGFyZ3M6e2EgfCBbfT48ZW5kaWY+CitbdGVtcGxhdGVMaWIgZ2V0SW5zdGFuY2VPZjpAIjxuYW1lPiJdCisgIDxpZihhcmdzKT48YXJnczp7YSB8IGFkZDpAIjxhLm5hbWU+IiB2YWx1ZTo8YS52YWx1ZT5dfT48ZW5kaWY+OworJT4KKworLyoqIGV4cHIgaXMgYSBzdHJpbmcgZXhwcmVzc2lvbiB0aGF0IHNheXMgd2hhdCB0ZW1wbGF0ZSB0byBsb2FkICovCityZXdyaXRlSW5kaXJlY3RUZW1wbGF0ZShleHByLGFyZ3MpIDo6PSA8JQorPGlmKGFyZ3MpPjxhcmdzOnthIHwgW30+PGVuZGlmPgorW3RlbXBsYXRlTGliIGdldEluc3RhbmNlT2Y6PGV4cHI+XTsKKzxpZihhcmdzKT48YXJnczp7YSB8IGFkZDpAIjxhLm5hbWU+IiB2YWx1ZTo8YS52YWx1ZT5dfT48ZW5kaWY+OworJT4KKworLyoqIEludm9rZSBhbiBpbmxpbmUgdGVtcGxhdGUgd2l0aCBhIHNldCBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycyAqLworcmV3cml0ZUlubGluZVRlbXBsYXRlKGFyZ3MsIHRlbXBsYXRlKSA6Oj0gPCUKKzxpZihhcmdzKT48YXJnczp7YSB8IFt9PjxlbmRpZj4KK1tTVCBuZXdTVDp0ZW1wbGF0ZUxpYiB0ZW1wbGF0ZToiPHRlbXBsYXRlPiJdCisgIDxpZihhcmdzKT48YXJnczp7YSB8ICBhZGQ6QCI8YS5uYW1lPiIgPGEudmFsdWU+XX0+PGVuZGlmPjsKKyU+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxhY3Rpb24+Cis+PgorCisvKiogQW4gYWN0aW9uIGhhcyAlc3QuYXR0ck5hbWU9ZXhwcjsgb3IgJXtzdH0uYXR0ck5hbWU9ZXhwcjsgKi8KK2FjdGlvblNldEF0dHJpYnV0ZShzdCxhdHRyTmFtZSxleHByKSA6Oj0gPDwKK1soPHN0Pikgc2V0QXR0cmlidXRlOkAiPGF0dHJOYW1lPiIgdmFsdWU6PGV4cHI+XTsKKz4+CisKKy8qKiBUcmFuc2xhdGUgJXtzdHJpbmdFeHByfSAqLworYWN0aW9uU3RyaW5nQ29uc3RydWN0b3Ioc3RyaW5nRXhwcikgOjo9IDw8CisgW1NUIG5ld1NUOnRlbXBsYXRlTGliIHRlbXBsYXRlOjxzdHJpbmdFeHByPl07Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QZXJsNS9BU1RUcmVlUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUGVybDUvQVNUVHJlZVBhcnNlci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiYTA5MQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUGVybDUvQVNUVHJlZVBhcnNlci5zdGcKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIENvcHlyaWdodCAoYykgMjAwOCBSb25hbGQgQmxhc2Noa2UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIFRlbXBsYXRlcyBmb3IgYnVpbGRpbmcgQVNUcyBkdXJpbmcgdHJlZSBwYXJzaW5nLgorICoKKyAqICBEZWFsIHdpdGggbWFueSBjb21iaW5hdGlvbnMuICBEaW1lbnNpb25zIGFyZToKKyAqICBBdXRvIGJ1aWxkIG9yIHJld3JpdGUKKyAqICAgIG5vIGxhYmVsLCBsYWJlbCwgbGlzdCBsYWJlbCAgKGxhYmVsL25vLWxhYmVsIGhhbmRsZWQgdG9nZXRoZXIpCisgKiAgICBjaGlsZCwgcm9vdAorICogICAgdG9rZW4sIHNldCwgcnVsZSwgd2lsZGNhcmQKKyAqCisgKiAgRWFjaCBjb21iaW5hdGlvbiBoYXMgaXRzIG93biB0ZW1wbGF0ZSBleGNlcHQgdGhhdCBsYWJlbC9ubyBsYWJlbAorICogIGlzIGNvbWJpbmVkIGludG8gdG9rZW5SZWYsIHJ1bGVSZWYsIC4uLgorICovCitncm91cCBBU1RUcmVlUGFyc2VyOworCisvKiogQWRkIGEgdmFyaWFibGUgdG8gdHJhY2sgbGFzdCBlbGVtZW50IG1hdGNoZWQgKi8KK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+Cis8QVNUTGFiZWxUeXBlPiBfZmlyc3RfMCA9IG51bGw7Cis8QVNUTGFiZWxUeXBlPiBfbGFzdCA9IG51bGw7PFxuPgorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUgcnVsZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHs8ZW5kaWY+Cis8aWYocmV3cml0ZU1vZGUpPgorcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pX2ZpcnN0XzA7CitpZiAoIGFkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC50cmVlKSE9bnVsbCAmJiBhZGFwdG9yLmlzTmlsKCBhZGFwdG9yLmdldFBhcmVudChyZXR2YWwudHJlZSkgKSApCisgICAgcmV0dmFsLnRyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5nZXRQYXJlbnQocmV0dmFsLnRyZWUpOworPGVuZGlmPgorPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyOyBvdmVycmlkZSBoZXJlIHRvCisgKiAgYWRkIHRyZWUgY29uc3RydWN0aW9uIGFjdGlvbnMuCisgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKK3sKKzxBU1RMYWJlbFR5cGU+IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD4gPSBfbGFzdDsKKzxBU1RMYWJlbFR5cGU+IF9maXJzdF88dHJlZUxldmVsPiA9IG51bGw7Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxBU1RMYWJlbFR5cGU+IHJvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5uaWwoKTsKKzxlbmRpZj4KKzxyb290OmVsZW1lbnQoKT4KKzxpZihyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApPGVuZGlmPgorPGlmKHJvb3QuZWwucnVsZSk+CitpZiAoIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPj09bnVsbCApIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9IDxyb290LmVsLmxhYmVsPi50cmVlOworPGVsc2U+CitpZiAoIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPj09bnVsbCApIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9IDxyb290LmVsLmxhYmVsPjsKKzxlbmRpZj4KKzxlbmRpZj4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiAoIGlucHV0LkxBKDEpPT1Ub2tlbi5ET1dOICkgeworICAgIG1hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICA8Y2hpbGRyZW46ZWxlbWVudCgpPgorICAgIG1hdGNoKGlucHV0LCBUb2tlbi5VUCwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cit9Cis8ZWxzZT4KK21hdGNoKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxjaGlsZHJlbjplbGVtZW50KCk+CittYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPGlmKCFyZXdyaXRlTW9kZSk+CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4sIHJvb3RfPHRyZWVMZXZlbD4pOworPGVuZGlmPgorX2xhc3QgPSBfc2F2ZV9sYXN0Xzx0cmVlTGV2ZWw+OworfTxcbj4KKz4+CisKKy8vIFRPS0VOIEFTVCBTVFVGRgorCisvKiogSUQhIGFuZCBvdXRwdXQ9QVNUIChzYW1lIGFzIHBsYWluIHRva2VuUmVmKSAnY2VwdCBhZGQKKyAqICBzZXR0aW5nIG9mIF9sYXN0CisgKi8KK3Rva2VuUmVmQmFuZyh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKz4+CisKKy8qKiBJRCBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9ICg8QVNUTGFiZWxUeXBlPilpbnB1dC5MVCgxKTsKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmR1cE5vZGUoPGxhYmVsPik7Cis8ZW5kaWY+PFxuPgorYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpOworPGlmKGJhY2t0cmFja2luZyk+fTxlbmRpZj4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICk8ZW5kaWY+CitpZiAoIF9maXJzdF88dHJlZUxldmVsPj09bnVsbCApIF9maXJzdF88dHJlZUxldmVsPiA9IDxsYWJlbD47Cis8ZW5kaWY+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7PGVuZGlmPgorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IG5ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pOworPGVsc2U+Cis8bGFiZWw+X3RyZWUgPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pOworPGVuZGlmPjxcbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSAoPEFTVExhYmVsVHlwZT4pYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF88dHJlZUxldmVsPik7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIE1hdGNoIF4obGFiZWwrPVRPS0VOIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3Rva2VuUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvLyBTRVQgQVNUCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLm1hdGNoU2V0KC4uLiwgcG9zdG1hdGNoQ29kZT17Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxpZihiYWNrdHJhY2tpbmcpPmlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgezxlbmRpZj4KKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSBuZXcgPHRlcm1pbmFsT3B0aW9ucy5ub2RlPig8bGFiZWw+KTsKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KTsKKzxlbmRpZj48XG4+CithZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbD5fdHJlZSk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorfQorKT4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlLHRyZWVMZXZlbD0iMCIpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bm9SZXdyaXRlKCk+IDwhIHNldCByZXR1cm4gdHJlZSAhPgorPj4KKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIubWF0Y2hTZXQoLi4uKT4KKz4+CisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxzdXBlci5tYXRjaFNldCguLi4sIHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHs8ZW5kaWY+Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPGxhYmVsPl90cmVlID0gbmV3IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPik7Cis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmR1cE5vZGUoPGxhYmVsPik7Cis8ZW5kaWY+PFxuPgorcm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KTsKKzxpZihiYWNrdHJhY2tpbmcpPn08ZW5kaWY+Cis8ZW5kaWY+Cit9CispPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSAoPEFTVExhYmVsVHlwZT4paW5wdXQuTFQoMSk7Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSA8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPi5nZXRUcmVlKCkpOworPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgoraWYgKCBfZmlyc3RfPHRyZWVMZXZlbD49PW51bGwgKSBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+LnRyZWU7Cis8ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi5nZXRUcmVlKCkiLC4uLik+Cis+PgorCisvKiogXihydWxlIC4uLikgYXV0byBjb25zdHJ1Y3QgKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gKDxBU1RMYWJlbFR5cGU+KWlucHV0LkxUKDEpOworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSA8ZW5kaWY+cm9vdF88dHJlZUxldmVsPiA9ICg8QVNUTGFiZWxUeXBlPilhZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPi5nZXRUcmVlKCksIHJvb3RfPHRyZWVMZXZlbD4pOworPGVuZGlmPgorPj4KKworLyoqIF4oeCs9cnVsZSAuLi4pIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwrIi5nZXRUcmVlKCkiLC4uLik+Cis+PgorCisvKiogU3RyZWFtcyBmb3IgdG9rZW4gcmVmcyBhcmUgdHJlZSBub2RlcyBub3c7IG92ZXJyaWRlIHRvCisgKiAgY2hhbmdlIG5leHRUb2tlbiB0byBuZXh0Tm9kZS4KKyAqLworY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsc2NvcGUpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK25ldyA8dGVybWluYWxPcHRpb25zLm5vZGU+KHN0cmVhbV88dG9rZW4+Lm5leHROb2RlKCkpCis8ZWxzZT4KK3N0cmVhbV88dG9rZW4+Lm5leHROb2RlKCkKKzxlbmRpZj4KKz4+CisKK3J1bGVDbGVhblVwKCkgOjo9IDw8Cis8c3VwZXIucnVsZUNsZWFuVXAoKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGlmKGJhY2t0cmFja2luZyk+aWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7PFxuPjxlbmRpZj4KK3JldHZhbC50cmVlID0gKDxBU1RMYWJlbFR5cGU+KWFkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCk7Cis8aWYoYmFja3RyYWNraW5nKT59PGVuZGlmPgorPGVuZGlmPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUGVybDUvUGVybDUuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QZXJsNS9QZXJsNS5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4NzVkMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUGVybDUvUGVybDUuc3RnCkBAIC0wLDAgKzEsMTM3MyBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggUm9uYWxkIEJsYXNjaGtlCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK2dyb3VwIFBlcmw1OworCisvKiogVGhlIG92ZXJhbGwgZmlsZSBzdHJ1Y3R1cmUgb2YgYSByZWNvZ25pemVyOyBzdG9yZXMgbWV0aG9kcyBmb3IgcnVsZXMKKyAqICBhbmQgY3ljbGljIERGQXMgcGx1cyBzdXBwb3J0IGNvZGUuCisgKi8KK291dHB1dEZpbGUoTEVYRVIsUEFSU0VSLFRSRUVfUEFSU0VSLCBhY3Rpb25TY29wZSwgYWN0aW9ucywKKyAgICAgICAgICAgZG9jQ29tbWVudCwgcmVjb2duaXplciwKKyAgICAgICAgICAgbmFtZSwgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgY3ljbGljREZBcywKKwkgICBiaXRzZXRzLCBidWlsZFRlbXBsYXRlLCBidWlsZEFTVCwgcmV3cml0ZU1vZGUsIHByb2ZpbGUsCisJICAgYmFja3RyYWNraW5nLCBzeW5wcmVkcywgbWVtb2l6ZSwgbnVtUnVsZXMsCisJICAgZmlsZU5hbWUsIEFOVExSVmVyc2lvbiwgZ2VuZXJhdGVkVGltZXN0YW1wLCB0cmFjZSwKKwkgICBzY29wZXMsIHN1cGVyQ2xhc3MsIGxpdGVyYWxzKSA6Oj0KKzw8CisjICRBTlRMUiA8QU5UTFJWZXJzaW9uPiA8ZmlsZU5hbWU+IDxnZW5lcmF0ZWRUaW1lc3RhbXA+Cis8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLmhlYWRlcj4KKworPEBpbXBvcnRzPgorPGlmKFRSRUVfUEFSU0VSKT4KKzxlbmRpZj4KKzxpZihiYWNrdHJhY2tpbmcpPgorPGVuZGlmPgorPEBlbmQ+CisKKzxkb2NDb21tZW50PgorPHJlY29nbml6ZXI+Cis+PgorCitsZXhlcihncmFtbWFyLCBuYW1lLCB0b2tlbnMsIHNjb3BlcywgcnVsZXMsIG51bVJ1bGVzLCBsYWJlbFR5cGU9IlRva2VuIiwKKyAgICAgIGZpbHRlck1vZGUsIHN1cGVyQ2xhc3M9IkFOVExSOjpSdW50aW1lOjpMZXhlciIpICA6Oj0gPDwKK3BhY2thZ2UgPG5hbWU+OworCit1c2UgQ2FycDsKK3VzZSBFbmdsaXNoIHF3KCAtbm9fbWF0Y2hfdmFycyApIDsKK3VzZSBSZWFkb25seTsKK3VzZSBTd2l0Y2g7CisKK3VzZSBBTlRMUjo6UnVudGltZTo6QmFzZVJlY29nbml6ZXI7Cit1c2UgQU5UTFI6OlJ1bnRpbWU6OkRGQTsKK3VzZSBBTlRMUjo6UnVudGltZTo6Tm9WaWFibGVBbHRFeGNlcHRpb247CisKK3VzZSBNb29zZTsKKworZXh0ZW5kcyAnQU5UTFI6OlJ1bnRpbWU6OkxleGVyJzsKKworUmVhZG9ubHkgbXkgJEhJRERFTiA9PiBBTlRMUjo6UnVudGltZTo6QmFzZVJlY29nbml6ZXItPkhJRERFTjsKK3N1YiBISURERU4geyAkSElEREVOIH0KKwordXNlIGNvbnN0YW50IHsKKyAgICA8dG9rZW5zOnsgPGl0Lm5hbWU+ID0+IDxpdC50eXBlPiwgfTsgc2VwYXJhdG9yPSJcbiI+Cit9OworPHNjb3Blczp7PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorPGFjdGlvbnMubGV4ZXIubWVtYmVycz4KKworc3ViIEJVSUxEIHsKKyAgICBteSAoJHNlbGYsICRhcmdfcmVmKSA9IEBfOworCisgICAgJHNlbGYtPmluaXRfZGZhcygpOworfQorCitzdWIgZ2V0X2dyYW1tYXJfZmlsZV9uYW1lIHsKKyAgICByZXR1cm4gIjxmaWxlTmFtZT4iOworfQorCis8aWYoZmlsdGVyTW9kZSk+Cis8ZmlsdGVyaW5nTmV4dFRva2VuKCk+Cis8ZW5kaWY+Cis8cnVsZXM7IHNlcGFyYXRvcj0iXG5cbiI+CisKKzxzeW5wcmVkczp7cCB8IDxsZXhlclN5bnByZWQocCk+fT4KKworPGN5Y2xpY0RGQXM6e2RmYSB8IGhhcyAnZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4nO307IHNlcGFyYXRvcj0iXG4iPgorCitzdWIgaW5pdF9kZmFzIHsKKyAgICBteSAoJHNlbGYpID0gQF87CisKKyAgICA8Y3ljbGljREZBczp7ZGZhIHwKKyAgICAkc2VsZi0+ZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4oPG5hbWU+OjpERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPi0+bmV3KHsgcmVjb2duaXplciA9PiAkc2VsZiB9KSk7CisgICAgfTsgc2VwYXJhdG9yPSJcbiI+CisKKyAgICByZXR1cm47Cit9CisKKzxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCitubyBNb29zZTsKK19fUEFDS0FHRV9fLT5tZXRhLT5tYWtlX2ltbXV0YWJsZSgpOworMTsKKworPj4KKworcGVybFR5cGVJbml0TWFwIDo6PSBbCisJIiQiOiJ1bmRlZiIsCisJIkAiOiIoKSIsCisJIiUiOiIoKSIsCisJZGVmYXVsdDoidW5kZWYiCitdCisKKy8qKiBBIG92ZXJyaWRlIG9mIExleGVyLm5leHRUb2tlbigpIHRoYXQgYmFja3RyYWNrcyBvdmVyIG1Ub2tlbnMoKSBsb29raW5nCisgKiAgZm9yIG1hdGNoZXMuICBObyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkIHVwb24gZXJyb3I7IGp1c3QgcmV3aW5kLCBjb25zdW1lCisgKiAgYSB0b2tlbiBhbmQgdGhlbiB0cnkgYWdhaW4uICBiYWNrdHJhY2tpbmcgbmVlZHMgdG8gYmUgc2V0IGFzIHdlbGwuCisgKiAgTWFrZSBydWxlIG1lbW9pemF0aW9uIGhhcHBlbiBvbmx5IGF0IGxldmVscyBhYm92ZSAxIGFzIHdlIHN0YXJ0IG1Ub2tlbnMKKyAqICBhdCBiYWNrdHJhY2tpbmc9PTEuCisgKi8KK2ZpbHRlcmluZ05leHRUb2tlbigpIDo6PSA8PAorcHVibGljIFRva2VuIG5leHRUb2tlbigpIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT1DaGFyU3RyZWFtLkVPRiApIHsKKyAgICAgICAgICAgIHJldHVybiBUb2tlbi5FT0ZfVE9LRU47CisgICAgICAgIH0KKyAgICAgICAgdG9rZW4gPSBudWxsOworCWNoYW5uZWwgPSBUb2tlbi5ERUZBVUxUX0NIQU5ORUw7CisgICAgICAgIHRva2VuU3RhcnRDaGFySW5kZXggPSBpbnB1dC5pbmRleCgpOworICAgICAgICB0b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gaW5wdXQuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCk7CisgICAgICAgIHRva2VuU3RhcnRMaW5lID0gaW5wdXQuZ2V0TGluZSgpOworCXRleHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IG0gPSBpbnB1dC5tYXJrKCk7CisgICAgICAgICAgICBiYWNrdHJhY2tpbmc9MTsgPCEgbWVhbnMgd2Ugd29uJ3QgdGhyb3cgc2xvdyBleGNlcHRpb24gIT4KKyAgICAgICAgICAgIGZhaWxlZD1mYWxzZTsKKyAgICAgICAgICAgIG1Ub2tlbnMoKTsKKyAgICAgICAgICAgIGJhY2t0cmFja2luZz0wOworICAgICAgICAgICAgPCEgbVRva2VucyBiYWNrdHJhY2tzIHdpdGggc3lucHJlZCBhdCBiYWNrdHJhY2tpbmc9PTIKKyAgICAgICAgICAgICAgIGFuZCB3ZSBzZXQgdGhlIHN5bnByZWRnYXRlIHRvIGFsbG93IGFjdGlvbnMgYXQgbGV2ZWwgMS4gIT4KKyAgICAgICAgICAgIGlmICggZmFpbGVkICkgeworICAgICAgICAgICAgICAgIGlucHV0LnJld2luZChtKTsKKyAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7IDwhIGFkdmFuY2Ugb25lIGNoYXIgYW5kIHRyeSBhZ2FpbiAhPgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZW1pdCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gaW4gYmFja3RyYWNraW5nIG1vZGUsIGJ1dC4uLgorICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihyZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3B1YmxpYyB2b2lkIG1lbW9pemUoSW50U3RyZWFtIGlucHV0LAorCQlpbnQgcnVsZUluZGV4LAorCQlpbnQgcnVsZVN0YXJ0SW5kZXgpCit7CitpZiAoIGJhY2t0cmFja2luZz4xICkgc3VwZXIubWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCk7Cit9CisKK3B1YmxpYyBib29sZWFuIGFscmVhZHlQYXJzZWRSdWxlKEludFN0cmVhbSBpbnB1dCwgaW50IHJ1bGVJbmRleCkgeworaWYgKCBiYWNrdHJhY2tpbmc+MSApIHJldHVybiBzdXBlci5hbHJlYWR5UGFyc2VkUnVsZShpbnB1dCwgcnVsZUluZGV4KTsKK3JldHVybiBmYWxzZTsKK30KKz4+CisKK2FjdGlvbkdhdGUoKSA6Oj0gIiRzZWxmLT5zdGF0ZS0+YmFja3RyYWNraW5nPT0wIgorCitmaWx0ZXJpbmdBY3Rpb25HYXRlKCkgOjo9ICJiYWNrdHJhY2tpbmc9PTEiCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBwYXJzZXIgKi8KK2dlbmVyaWNQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywKKyAgICAgICAgICAgICAgYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLCBmaWx0ZXJNb2RlLAorICAgICAgICAgICAgICBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsIGxhYmVsVHlwZSwgbWVtYmVycykgOjo9IDw8CitwYWNrYWdlIDxuYW1lPjsKKwordXNlIEVuZ2xpc2ggcXcoIC1ub19tYXRjaF92YXJzICkgOwordXNlIFJlYWRvbmx5OwordXNlIFN3aXRjaDsKK3VzZSBDYXJwOwordXNlIEFOVExSOjpSdW50aW1lOjpCaXRTZXQ7CisKK3VzZSBNb29zZTsKKworZXh0ZW5kcyAnPEBzdXBlckNsYXNzTmFtZT48c3VwZXJDbGFzcz48QGVuZD4nOworCitSZWFkb25seSBteSAkdG9rZW5fbmFtZXMgPT4gWworICAgICJcPGludmFsaWQ+IiwgIlw8RU9SPiIsICJcPERPV04+IiwgIlw8VVA+IiwgPHRva2VuTmFtZXM7IHNlcGFyYXRvcj0iLCAiPgorXTsKKwordXNlIGNvbnN0YW50IHsKKzx0b2tlbnM6eyA8aXQubmFtZT4gPT4gPGl0LnR5cGU+LCB9OyBzZXBhcmF0b3I9IlxuIj4KK307CisKKzxiaXRzZXRzOmJpdHNldChuYW1lPXtGT0xMT1dfPGl0Lm5hbWU+X2luXzxpdC5pbk5hbWU+PGl0LnRva2VuSW5kZXg+fSwKKyAgICAgICAgICAgICAgICAgICAgd29yZHM2ND1pdC5iaXRzKT4KKworPHNjb3Blczp7PGlmKGl0LmlzRHluYW1pY0dsb2JhbFNjb3BlKT48Z2xvYmFsQXR0cmlidXRlU2NvcGUoc2NvcGU9aXQpPjxlbmRpZj59PgorPEBtZW1iZXJzPgorPCEgV0FSTklORy4gYnVnIGluIFNUOiB0aGlzIGlzIGN1dC1uLXBhc3RlIGludG8gRGJnLnN0ZyAhPgorCitzdWIgQlVJTEQgeworICAgIG15ICgkc2VsZiwgJGFyZ19yZWYpID0gQF87CisKKzxpZihiYWNrdHJhY2tpbmcpPgorICAgICRzZWxmLT5zdGF0ZS0+cnVsZV9tZW1vKHt9KTs8XG4+Cis8ZW5kaWY+Cit9Cis8QGVuZD4KKworc3ViIGdldF90b2tlbl9uYW1lcyB7CisgICAgcmV0dXJuICR0b2tlbl9uYW1lczsKK30KKworc3ViIGdldF9ncmFtbWFyX2ZpbGVfbmFtZSB7CisgICAgcmV0dXJuICI8ZmlsZU5hbWU+IjsKK30KKworPG1lbWJlcnM+CisKKzxydWxlczsgc2VwYXJhdG9yPSJcblxuIj4KKworPHN5bnByZWRzOntwIHwgPHN5bnByZWQocCk+fT4KKworPGN5Y2xpY0RGQXM6e2RmYSB8IGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gX19QQUNLQUdFX186OkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+LT5uZXcoJHNlbGYpO307IHNlcGFyYXRvcj0iXG4iPgorPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+IDwhIGR1bXAgdGFibGVzIGZvciBhbGwgREZBICE+CisKK25vIE1vb3NlOworX19QQUNLQUdFX18tPm1ldGEtPm1ha2VfaW1tdXRhYmxlKCk7CisxOworX19FTkRfXworPj4KKworcGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsIGJpdHNldHMsIEFTVExhYmVsVHlwZSwgc3VwZXJDbGFzcz0iQU5UTFI6OlJ1bnRpbWU6OlBhcnNlciIsIGxhYmVsVHlwZT0iQU5UTFI6OlJ1bnRpbWU6OlRva2VuIiwgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IkFOVExSOjpSdW50aW1lOjpUb2tlblN0cmVhbSIsIC4uLik+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgdHJlZSBwYXJzZXI7IHNhbWUgYXMgcGFyc2VyIGV4Y2VwdCB0aGUgaW5wdXQKKyAqICBzdHJlYW0gaXMgYSBkaWZmZXJlbnQgdHlwZS4KKyAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLCBydWxlcywgbnVtUnVsZXMsIGJpdHNldHMsIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsIHN1cGVyQ2xhc3M9IkFOVExSOjpSdW50aW1lOjpUcmVlUGFyc2VyIiwgbWVtYmVycz17PGFjdGlvbnMudHJlZXBhcnNlci5tZW1iZXJzPn0sIGZpbHRlck1vZGUpIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJUcmVlTm9kZVN0cmVhbSIsIC4uLik+Cis+PgorCisvKiogQSBzaW1wbGVyIHZlcnNpb24gb2YgYSBydWxlIHRlbXBsYXRlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGltYWdpbmFyeQorICogIHJ1bGVzIGNyZWF0ZWQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLiAgQXMgdGhleSBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMKKyAqICBub3IgcGFyYW1ldGVycyBldGMuLi4sIGp1c3QgZ2l2ZSBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbworICogIGFueSBvZiB0aGUgbm9ybWFsIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuCisgKiAgQXMgcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5IG5lZWQgdG8KKyAqICBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAqLworc3lucHJlZFJ1bGUocnVsZU5hbWUsIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgZGVzY3JpcHRpb24sIG5ha2VkQmxvY2spIDo6PQorPDwKKyMgJEFOVExSIHN0YXJ0IDxydWxlTmFtZT4KK3N1YiA8cnVsZU5hbWU+X2ZyYWdtZW50IHsKKyMgPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4KKworPGlmKHRyYWNlKT4KKyAgICAkc2VsZi0+dHJhY2VJbigiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworICAgIGV2YWwgeworICAgICAgICA8YmxvY2s+CisgICAgfTsKKyAgICAkc2VsZi0+dHJhY2VPdXQoIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTsKKyAgICBpZiAoJEVWQUxfRVJST1IpIHsKKyAgICAgICAgY3JvYWsgJEVWQUxfRVJST1I7CisgICAgfQorPGVsc2U+CisgICAgPGJsb2NrPgorPGVuZGlmPgorfQorIyAkQU5UTFIgZW5kIDxydWxlTmFtZT4KKz4+CisKK3N5bnByZWQobmFtZSkgOjo9IDw8CitwdWJsaWMgZmluYWwgYm9vbGVhbiA8bmFtZT4oKSB7CisgICAgYmFja3RyYWNraW5nKys7CisgICAgPEBzdGFydCgpPgorICAgIGludCBzdGFydCA9IGlucHV0Lm1hcmsoKTsKKyAgICB0cnkgeworICAgICAgICA8bmFtZT5fZnJhZ21lbnQoKTsgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiaW1wb3NzaWJsZTogIityZSk7CisgICAgfQorICAgIGJvb2xlYW4gc3VjY2VzcyA9ICFmYWlsZWQ7CisgICAgaW5wdXQucmV3aW5kKHN0YXJ0KTsKKyAgICA8QHN0b3AoKT4KKyAgICBiYWNrdHJhY2tpbmctLTsKKyAgICBmYWlsZWQ9ZmFsc2U7CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9PFxuPgorPj4KKworbGV4ZXJTeW5wcmVkKG5hbWUpIDo6PSA8PAorPHN5bnByZWQobmFtZSk+Cis+PgorCitydWxlTWVtb2l6YXRpb24obmFtZSkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+CitpZiAoIGJhY2t0cmFja2luZz4wICYmIGFscmVhZHlQYXJzZWRSdWxlKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KSApIHsgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT47IH0KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdGVzdCBmb3IgZmFpbHVyZSBhbmQgcmV0dXJuIGZyb20gcnVsZSAqLworY2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoJHNlbGYtPnN0YXRlLT5mYWlsZWQpIHsKKyAgICByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjsKK30KKzxlbmRpZj4KKz4+CisKKy8qKiBUaGlzIHJ1bGUgaGFzIGZhaWxlZCwgZXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgZHVyaW5nIGJhY2t0cmFjayAqLworcnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmIChiYWNrdHJhY2tpbmc+MCkge2ZhaWxlZD10cnVlOyByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjt9PGVuZGlmPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhIHJ1bGUuICBUaGlzIGluY2x1ZGVzIGFueSByZXR1cm4gdHlwZQorICogIGRhdGEgYWdncmVnYXRlcyByZXF1aXJlZCBmb3IgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KKyAqLworcnVsZShydWxlTmFtZSxydWxlRGVzY3JpcHRvcixibG9jayxlbXB0eVJ1bGUsZGVzY3JpcHRpb24sZXhjZXB0aW9ucyxmaW5hbGx5LG1lbW9pemUpIDo6PSA8PAorPHJ1bGVBdHRyaWJ1dGVTY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPgorPHJldHVyblNjb3BlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT4KKworIyAkQU5UTFIgc3RhcnQgPHJ1bGVOYW1lPgorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3N1YiA8cnVsZU5hbWU+KCkgeworICAgIG15ICgkc2VsZiwgPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKHNjb3BlPWl0KT4pID0gQF87CisgICAgPGlmKHRyYWNlKT4kc2VsZi0+dHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIDxydWxlTGFiZWxEZWZzKCk+CisgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKyAgICA8QHByZWFtYmxlKCk+CisgICAgZXZhbCB7CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorICAgIH07Cis8aWYoZXhjZXB0aW9ucyk+CisgICAgPGV4Y2VwdGlvbnM6e2V8PGNhdGNoKGRlY2w9ZS5kZWNsLGFjdGlvbj1lLmFjdGlvbik+PFxuPn0+Cis8ZWxzZT4KKzxpZighZW1wdHlSdWxlKT4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoKT4KKyAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaD4KKzxlbHNlPgorICAgIG15ICRleGNlcHRpb24gPSAkRVZBTF9FUlJPUjsKKyAgICBpZiAocmVmICRleGNlcHRpb24gJiYgJGV4Y2VwdGlvbi0+aXNhKCdBTlRMUjo6UnVudGltZTo6UmVjb2duaXRpb25FeGNlcHRpb24nKSkgeworICAgICAgICAkc2VsZi0+cmVwb3J0X2Vycm9yKCRleGNlcHRpb24pOworICAgICAgICAkc2VsZi0+cmVjb3Zlcigkc2VsZi0+aW5wdXQsICRleGNlcHRpb24pOworICAgICAgICAkZXhjZXB0aW9uID0gdW5kZWY7CisgICAgfTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICA8aWYodHJhY2UpPiRzZWxmLT50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8bWVtb2l6ZSgpPgorICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgPGZpbmFsbHk+CisgICAgaWYgKCRleGNlcHRpb24pIHsKKyAgICAgICAgY3JvYWsgJGV4Y2VwdGlvbjsKKyAgICAgICAgIyRleGNlcHRpb24tPnJldGhyb3coKTsKKyAgICB9CisgICAgPEBwb3N0YW1ibGUoKT4KKyAgICByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjsKK30KKyMgJEFOVExSIGVuZCA8cnVsZU5hbWU+Cis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitjYXRjaCAoPGUuZGVjbD4pIHsKKyAgICA8ZS5hY3Rpb24+Cit9Cis+PgorCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorbXkgJHJldHZhbCA9IDxyZXR1cm5UeXBlKCk+LT5uZXcoKTsKKyRyZXR2YWwtPnNldF9zdGFydCgkc2VsZi0+aW5wdXQtPkxUKDEpKTs8XG4+Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8CitteSAkPGEubmFtZT4gPSA8aWYoYS5pbml0VmFsdWUpPjxhLmluaXRWYWx1ZT48ZWxzZT48aW5pdFZhbHVlKGEudHlwZSk+PGVuZGlmPjsKK30+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+CitteSAkPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X3N0YXJ0X2luZGV4ID0gJHNlbGYtPmlucHV0LT5pbmRleCgpOworPGVuZGlmPgorPj4KKworcnVsZVNjb3BlU2V0VXAoKSA6Oj0gPDwKKzxydWxlRGVzY3JpcHRvci51c2VTY29wZXM6ezxpdD5fc3RhY2sucHVzaChuZXcgPGl0Pl9zY29wZSgpKTt9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6ezxpdC5uYW1lPl9zdGFjay5wdXNoKG5ldyA8aXQubmFtZT5fc2NvcGUoKSk7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlU2NvcGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOns8aXQ+X3N0YWNrLnBvcCgpO307IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7PGl0Lm5hbWU+X3N0YWNrLnBvcCgpO307IHNlcGFyYXRvcj0iXG4iPgorPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscyxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHNdCisgICAgOntteSAkPGl0LmxhYmVsLnRleHQ+ID0gdW5kZWY7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDp7TGlzdCBsaXN0XzxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IucnVsZUxhYmVsczpydWxlTGFiZWxEZWYobGFiZWw9aXQpOyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsczp7bGx8UnVsZVJldHVyblNjb3BlIDxsbC5sYWJlbC50ZXh0PiA9IG51bGw7fTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitsZXhlclJ1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6ezxsYWJlbFR5cGU+IDxpdC5sYWJlbC50ZXh0Pj1udWxsO307IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7bXkgJDxpdC5sYWJlbC50ZXh0Pjt9OyBzZXBhcmF0b3I9IlxuIj4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOntMaXN0IGxpc3RfPGl0LmxhYmVsLnRleHQ+PW51bGw7fTsgc2VwYXJhdG9yPSJcbiIKKz4KKz4+CisKK3J1bGVSZXR1cm5WYWx1ZSgpIDo6PSA8PAorPGlmKCFydWxlRGVzY3JpcHRvci5pc1N5blByZWQpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1JldHVyblZhbHVlKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNTaW5nbGVSZXR1cm5WYWx1ZSk+CiskPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuTmFtZT4KKzxlbHNlPgorJHJldHZhbAorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoIVRSRUVfUEFSU0VSKT4KKyRyZXR2YWwtPnNldF9zdG9wKCRzZWxmLT5pbnB1dC0+TFQoLTEpKTs8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCittZW1vaXplKCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggYmFja3RyYWNraW5nPjAgKSB7IG1lbW9pemUoaW5wdXQsIDxydWxlRGVzY3JpcHRvci5pbmRleD4sIDxydWxlRGVzY3JpcHRvci5uYW1lPl9TdGFydEluZGV4KTsgfQorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHJ1bGUgaW4gdGhlIGxleGVyOyBuYWtlZCBibG9ja3MgYXJlIHVzZWQgZm9yCisgKiAgZnJhZ21lbnQgcnVsZXMuCisgKi8KK2xleGVyUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLG1lbW9pemUpIDo6PSA8PAorIyAkQU5UTFIgc3RhcnQgPHJ1bGVOYW1lPgorc3ViIG1fPHJ1bGVOYW1lPiB7CisjIDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZShzY29wZT1pdCk+CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIDxpZih0cmFjZSk+dHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIGV2YWwgeworPGlmKG5ha2VkQmxvY2spPgorICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz48XG4+Cis8ZWxzZT4KKyAgICAgICAgbXkgJF90eXBlID0gPHJ1bGVOYW1lPjsKKyAgICAgICAgbXkgJF9jaGFubmVsID0gJHNlbGYtPkRFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPGxleGVyUnVsZUxhYmVsRGVmcygpPgorICAgICAgICA8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorICAgICAgICA8YmxvY2s+CisgICAgICAgIDxydWxlQ2xlYW5VcCgpPgorICAgICAgICAkc2VsZi0+c3RhdGUtPnR5cGUoJF90eXBlKTsKKyAgICAgICAgJHNlbGYtPnN0YXRlLT5jaGFubmVsKCRfY2hhbm5lbCk7CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorPGVuZGlmPgorICAgIH07CisgICAgPGlmKHRyYWNlKT50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOzxlbmRpZj4KKyAgICA8bWVtb2l6ZSgpPgorCisgICAgaWYgKCRFVkFMX0VSUk9SKSB7CisgICAgICAgIGNyb2FrICRFVkFMX0VSUk9SOworICAgIH0KK30KKyMgJEFOVExSIGVuZCA8cnVsZU5hbWU+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpbXBsaWNpdGx5LWRlZmluZWQgbGV4ZXIgZ3JhbW1hciBydWxlCisgKiAgdGhhdCBjaG9vc2VzIGJldHdlZW4gbGV4ZXIgcnVsZXMuCisgKi8KK3Rva2Vuc1J1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxhcmdzLGJsb2NrLHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKK3N1YiBtX3Rva2VucyB7CisgICAgbXkgKCRzZWxmKSA9IEBfOworICAgIDxibG9jaz48XG4+Cit9Cis+PgorCisvLyBTIFUgQiBSIFUgTCBFIFMKKworLyoqIEEgKC4uLikgc3VicnVsZSB3aXRoIG11bHRpcGxlIGFsdGVybmF0aXZlcyAqLworYmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK215ICRhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPG1heEFsdD47Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cis8ZGVjaXNpb24+Cis8QHBvc3RkZWNpc2lvbigpPgorPEBwcmVicmFuY2goKT4KK3N3aXRjaCAoJGFsdDxkZWNpc2lvbk51bWJlcj4pIHsKKyAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+Cit9Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisjIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorbXkgJGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PjsKKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+Citzd2l0Y2ggKCRhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisgICAgPGFsdHM6YWx0U3dpdGNoQ2FzZSgpPgorfQorPj4KKworcnVsZUJsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis8QHBvc3RhbHQoKT4KKz4+CisKKy8qKiBBIHNwZWNpYWwgY2FzZSBvZiBhICguLi4pIHN1YnJ1bGUgd2l0aCBhIHNpbmdsZSBhbHRlcm5hdGl2ZSAqLworYmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgKC4uKSsgYmxvY2sgd2l0aCAxIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitwb3NpdGl2ZUNsb3N1cmVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisjIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorbXkgJGNudDxkZWNpc2lvbk51bWJlcj4gPSAwOworPGRlY2xzPgorPEBwcmVsb29wKCk+CitMT09QPGRlY2lzaW9uTnVtYmVyPjoKK3doaWxlICgxKSB7CisgICAgbXkgJGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PjsKKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgc3dpdGNoICgkYWx0PGRlY2lzaW9uTnVtYmVyPikgeworCSAgICA8YWx0czphbHRTd2l0Y2hDYXNlKCk+CisJICAgIGVsc2UgeworCSAgICAgICAgaWYgKCAkY250PGRlY2lzaW9uTnVtYmVyPiA+PSAxICkgeyBsYXN0IExPT1A8ZGVjaXNpb25OdW1iZXI+IH0KKwkgICAgICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgICAgICAgICAgbXkgJGVlZSA9CisgICAgICAgICAgICAgICAgQU5UTFI6OlJ1bnRpbWU6OkVhcmx5RXhpdEV4Y2VwdGlvbi0+bmV3KDxkZWNpc2lvbk51bWJlcj4sICRzZWxmLT5pbnB1dCk7CisgICAgICAgICAgICA8QGVhcmx5RXhpdEV4Y2VwdGlvbigpPgorICAgICAgICAgICAgY3JvYWsgJGVlZTsKKyAgICAgICAgfQorICAgIH0KKyAgICArKyRjbnQ8ZGVjaXNpb25OdW1iZXI+OworfQorPEBwb3N0bG9vcCgpPgorPj4KKworcG9zaXRpdmVDbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisKKy8qKiBBICguLikqIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworY2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK0xPT1A8ZGVjaXNpb25OdW1iZXI+Ogord2hpbGUgKDEpIHsKKyAgICBteSAkYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxtYXhBbHQ+OworICAgIDxAcHJlZGVjaXNpb24oKT4KKyAgICA8ZGVjaXNpb24+CisgICAgPEBwb3N0ZGVjaXNpb24oKT4KKyAgICBzd2l0Y2ggKCRhbHQ8ZGVjaXNpb25OdW1iZXI+KSB7CisJICAgIDxhbHRzOmFsdFN3aXRjaENhc2UoKT4KKwkgICAgZWxzZSB7IGxhc3QgTE9PUDxkZWNpc2lvbk51bWJlcj4gfQorICAgIH0KK30KKzxAcG9zdGxvb3AoKT4KKz4+CisKK2Nsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gY2xvc3VyZUJsb2NrCisKKy8qKiBPcHRpb25hbCBibG9ja3MgKHgpPyBhcmUgdHJhbnNsYXRlZCB0byAoeHwpIGJ5IGJlZm9yZSBjb2RlIGdlbmVyYXRpb24KKyAqICBzbyB3ZSBjYW4ganVzdCB1c2UgdGhlIG5vcm1hbCBibG9jayB0ZW1wbGF0ZQorICovCitvcHRpb25hbEJsb2NrIDo6PSBibG9jaworCitvcHRpb25hbEJsb2NrU2luZ2xlQWx0IDo6PSBibG9jaworCisvKiogQSBjYXNlIGluIGEgc3dpdGNoIHRoYXQganVtcHMgdG8gYW4gYWx0ZXJuYXRpdmUgZ2l2ZW4gdGhlIGFsdGVybmF0aXZlCisgKiAgbnVtYmVyLiAgQSBERkEgcHJlZGljdHMgdGhlIGFsdGVybmF0aXZlIGFuZCB0aGVuIGEgc2ltcGxlIHN3aXRjaAorICogIGRvZXMgdGhlIGp1bXAgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBtYXRjaGVzIHRoYXQgYWx0ZXJuYXRpdmUuCisgKi8KK2FsdFN3aXRjaENhc2UoKSA6Oj0gPDwKK2Nhc2UgPGk+IHsKKyAgICA8QHByZWFsdCgpPgorICAgIDxpdD4KK308XG4+Cis+PgorCisvKiogQW4gYWx0ZXJuYXRpdmUgaXMganVzdCBhIGxpc3Qgb2YgZWxlbWVudHM7IGF0IG91dGVybW9zdCBsZXZlbCAqLworYWx0KGVsZW1lbnRzLGFsdE51bSxkZXNjcmlwdGlvbixhdXRvQVNULG91dGVyQWx0LHRyZWVMZXZlbCxyZXcpIDo6PSA8PAorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3sKKzxAZGVjbGFyYXRpb25zKCk+Cis8ZWxlbWVudHM6ZWxlbWVudCgpPgorPHJldz4KKzxAY2xlYW51cCgpPgorfQorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvLyBFIEwgRSBNIEUgTiBUIFMKKworLyoqIER1bXAgdGhlIGVsZW1lbnRzIG9uZSBwZXIgbGluZSAqLworZWxlbWVudCgpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGl0LmVsPjxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIHRva2VuIG9wdGlvbmFsbHkgd2l0aCBhIGxhYmVsIGluIGZyb250ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxpZihsYWJlbCk+JDxsYWJlbD4gPTxlbmRpZj4kc2VsZi0+bWF0Y2goJHNlbGYtPmlucHV0LCA8dG9rZW4+LCAkRk9MTE9XXzx0b2tlbj5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1JRCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworbGlzdExhYmVsKGxhYmVsLGVsZW0pIDo6PSA8PAoraWYgKGxpc3RfPGxhYmVsPj09bnVsbCkgbGlzdF88bGFiZWw+PW5ldyBBcnJheUxpc3QoKTsKK2xpc3RfPGxhYmVsPi5hZGQoPGVsZW0+KTs8XG4+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgKi8KK2NoYXJSZWYoY2hhcixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9ICRzZWxmLT5pbnB1dC0+TEEoMSk7PFxuPgorPGVuZGlmPgorJHNlbGYtPm1hdGNoKDxjaGFyPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgcmFuZ2UgKi8KK2NoYXJSYW5nZVJlZihhLGIsbGFiZWwpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSAkc2VsZi0+aW5wdXQtPkxBKDEpOzxcbj4KKzxlbmRpZj4KKyRzZWxmLT5tYXRjaF9yYW5nZSg8YT4sPGI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKKy8qKiBGb3Igbm93LCBzZXRzIGFyZSBpbnRlcnZhbCB0ZXN0cyBhbmQgbXVzdCBiZSB0ZXN0ZWQgaW5saW5lICovCittYXRjaFNldChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlPSIiKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8aWYoTEVYRVIpPgorPGxhYmVsPj0gJHNlbGYtPmlucHV0LT5MQSgxKTs8XG4+Cis8ZWxzZT4KKzxsYWJlbD49KDxsYWJlbFR5cGU+KWlucHV0LkxUKDEpOzxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KK2lmICggPHM+ICkgeworICAgICRzZWxmLT5pbnB1dC0+Y29uc3VtZSgpOworICAgIDxwb3N0bWF0Y2hDb2RlPgorPGlmKCFMRVhFUik+CisgICAgJHNlbGYtPnN0YXRlLT5lcnJvcl9yZWNvdmVyeSgwKTsKKzxlbmRpZj4KKyAgICA8aWYoYmFja3RyYWNraW5nKT5mYWlsZWQ9ZmFsc2U7PGVuZGlmPgorfQorZWxzZSB7CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgbXkgJG1zZSA9CisgICAgICAgIEFOVExSOjpSdW50aW1lOjpNaXNtYXRjaGVkU2V0RXhjZXB0aW9uLT5uZXcodW5kZWYsICRzZWxmLT5pbnB1dCk7CisgICAgPEBtaXNtYXRjaGVkU2V0RXhjZXB0aW9uKCk+Cis8aWYoTEVYRVIpPgorICAgICRzZWxmLT5yZWNvdmVyKCRtc2UpOworICAgICRtc2UtPnRocm93KCk7Cis8ZWxzZT4KKyAgICAkbXNlLT50aHJvdygpOworICAgIDwhIHVzZSBmb2xsb3dpbmcgY29kZSB0byBtYWtlIGl0IHJlY292ZXIgaW5saW5lOyByZW1vdmUgdGhyb3cgbXNlOworICAgICRzZWxmLT5yZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoJHNlbGYtPmlucHV0LCAkbXNlLCAkRk9MTE9XX3NldF9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pOworICAgICE+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQgOjo9IG1hdGNoU2V0CisKK21hdGNoU2V0QW5kTGlzdExhYmVsKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHN0cmluZyBsaXRlcmFsICovCitsZXhlclN0cmluZ1JlZihzdHJpbmcsbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+CitpbnQgPGxhYmVsPlN0YXJ0ID0gZ2V0Q2hhckluZGV4KCk7Ciskc2VsZi0+bWF0Y2goPHN0cmluZz4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGxhYmVsVHlwZT4gPGxhYmVsPiA9IG5ldyBDb21tb25Ub2tlbihpbnB1dCwgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFLCBUb2tlbi5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydCwgZ2V0Q2hhckluZGV4KCktMSk7Cis8ZWxzZT4KKyRzZWxmLT5tYXRjaCg8c3RyaW5nPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+PFxuPgorPGVuZGlmPgorPj4KKword2lsZGNhcmQobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+PSg8bGFiZWxUeXBlPilpbnB1dC5MVCgxKTs8XG4+Cis8ZW5kaWY+CittYXRjaEFueShpbnB1dCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9ICRzZWxmLT5pbnB1dC0+TEEoMSk7PFxuPgorPGVuZGlmPgorbWF0Y2hBbnkoKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKK3dpbGRjYXJkQ2hhckxpc3RMYWJlbChsYWJlbCwgZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx3aWxkY2FyZENoYXIoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIGEgcnVsZSByZWZlcmVuY2UgYnkgaW52b2tpbmcgaXQgcG9zc2libHkgd2l0aCBhcmd1bWVudHMKKyAqICBhbmQgYSByZXR1cm4gdmFsdWUgb3IgdmFsdWVzLgorICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorJHNlbGYtPnB1c2hfZm9sbG93KCRGT0xMT1dfPHJ1bGUubmFtZT5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTsKKzxpZihsYWJlbCk+CiskPGxhYmVsPiA9ICRzZWxmLT48cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTs8XG4+Cis8ZWxzZT4KKyRzZWxmLT48cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTs8XG4+Cis8ZW5kaWY+Ciskc2VsZi0+c3RhdGUtPl9mc3AoJHNlbGYtPnN0YXRlLT5fZnNwIC0gMSk7Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIGlkcys9ciAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBBIGxleGVyIHJ1bGUgcmVmZXJlbmNlLgorICoKKyAqICBUaGUgJ3J1bGUnIGFyZ3VtZW50IHdhcyB0aGUgdGFyZ2V0IHJ1bGUgbmFtZSwgYnV0IG5vdworICogIGlzIHR5cGUgUnVsZSwgd2hvc2UgdG9TdHJpbmcgaXMgc2FtZTogdGhlIHJ1bGUgbmFtZS4KKyAqICBOb3cgdGhvdWdoIHlvdSBjYW4gYWNjZXNzIGZ1bGwgcnVsZSBkZXNjcmlwdG9yIHN0dWZmLgorICovCitsZXhlclJ1bGVSZWYocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSkgOjo9IDw8Cis8aWYobGFiZWwpPgoraW50IDxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+ID0gZ2V0Q2hhckluZGV4KCk7Ciskc2VsZi0+bV88cnVsZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8bGFiZWw+ID0gbmV3IENvbW1vblRva2VuKGlucHV0LCBUb2tlbi5JTlZBTElEX1RPS0VOX1RZUEUsIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIGdldENoYXJJbmRleCgpLTEpOworPGVsc2U+Ciskc2VsZi0+bV88cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKz4+CisKKy8qKiBpKz1JTlQgaW4gbGV4ZXIgKi8KK2xleGVyUnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxsZXhlclJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIEVPRiBpbiB0aGUgbGV4ZXIgKi8KK2xleGVyTWF0Y2hFT0YobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+CitpbnQgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4gPSBnZXRDaGFySW5kZXgoKTsKK21hdGNoKEVPRik7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8bGFiZWxUeXBlPiA8bGFiZWw+ID0gbmV3IENvbW1vblRva2VuKGlucHV0LCBFT0YsIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIGdldENoYXJJbmRleCgpLTEpOworPGVsc2U+CittYXRjaChFT0YpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8cm9vdDplbGVtZW50KCk+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKCBpbnB1dC5MQSgxKT09VG9rZW4uRE9XTiApIHsKKyAgICBtYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBtYXRjaChpbnB1dCwgVG9rZW4uVVAsIG51bGwpOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CittYXRjaChpbnB1dCwgVG9rZW4uRE9XTiwgbnVsbCk7IDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8Y2hpbGRyZW46ZWxlbWVudCgpPgorbWF0Y2goaW5wdXQsIFRva2VuLlVQLCBudWxsKTsgPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxlbmRpZj4KKz4+CisKKy8qKiBFdmVyeSBwcmVkaWNhdGUgaXMgdXNlZCBhcyBhIHZhbGlkYXRpbmcgcHJlZGljYXRlIChldmVuIHdoZW4gaXQgaXMKKyAqICBhbHNvIGhvaXN0ZWQgaW50byBhIHByZWRpY3Rpb24gZXhwcmVzc2lvbikuCisgKi8KK3ZhbGlkYXRlU2VtYW50aWNQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9IDw8CitpZiAoICEoPGV2YWxQcmVkaWNhdGUoLi4uKT4pICkgeworICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICI8cnVsZU5hbWU+IiwgIjxkZXNjcmlwdGlvbj4iKTsKK30KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChpZi10aGVuLWVsc2UpCisKK2RmYVN0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK215ICRMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9ICRzZWxmLT5pbnB1dC0+TEEoPGs+KTs8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHMiPgorZWxzZSB7Cis8aWYoZW90UHJlZGljdHNBbHQpPgorICAgICRhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKKzxlbHNlPgorICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIG15ICRudmFlID0KKyAgICAgICAgQU5UTFI6OlJ1bnRpbWU6Ok5vVmlhYmxlQWx0RXhjZXB0aW9uLT5uZXcoeworICAgICAgICAgICAgZ3JhbW1hcl9kZWNpc2lvbl9kZXNjcmlwdGlvbiA9PiAiPGRlc2NyaXB0aW9uPiIsCisgICAgICAgICAgICBkZWNpc2lvbl9udW1iZXIgPT4gPGRlY2lzaW9uTnVtYmVyPiwKKyAgICAgICAgICAgIHN0YXRlX251bWJlciA9PiA8c3RhdGVOdW1iZXI+LAorICAgICAgICAgICAgaW5wdXQgPT4gJHNlbGYtPmlucHV0LAorICAgICAgICB9KTs8XG4+CisgICAgPEBub1ZpYWJsZUFsdEV4Y2VwdGlvbigpPgorICAgIGNyb2FrICRudmFlOzxcbj4KKzxlbmRpZj4KK30KKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lIGxvb2thaGVhZAorICogIGZvciB0aGUgYnlwYXNzIGFsdGVybmF0aXZlLiAgSXQgZGVsYXlzIGVycm9yIGRldGVjdGlvbiBidXQgdGhpcworICogIGlzIGZhc3Rlciwgc21hbGxlciwgYW5kIG1vcmUgd2hhdCBwZW9wbGUgZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlCisgKiAgZXhwZWN0ICJpZiAoIExBKDEpPT1YICkgbWF0Y2goWCk7IiBhbmQgdGhhdCdzIGl0LgorICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorbXkgJExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gJHNlbGYtPmlucHV0LT5MQSg8az4pOzxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVscyI+Cis+PgorCisvKiogQSBERkEgc3RhdGUgdGhhdCBpcyBhY3R1YWxseSB0aGUgbG9vcGJhY2sgZGVjaXNpb24gb2YgYSBjbG9zdXJlCisgKiAgbG9vcC4gIElmIGVuZC1vZi10b2tlbiAoRU9UKSBwcmVkaWN0cyBhbnkgb2YgdGhlIHRhcmdldHMgdGhlbiBpdAorICogIHNob3VsZCBhY3QgbGlrZSBhIGRlZmF1bHQgY2xhdXNlIChpLmUuLCBubyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkKS4KKyAqICBUaGlzIGlzIHVzZWQgb25seSBpbiB0aGUgbGV4ZXIgc28gdGhhdCBmb3IgKCdhJykqIG9uIHRoZSBlbmQgb2YgYSBydWxlCisgKiAgYW55dGhpbmcgb3RoZXIgdGhhbiAnYScgcHJlZGljdHMgZXhpdGluZy4KKyAqLworZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitteSAkTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSAkc2VsZi0+aW5wdXQtPkxBKDxrPik7PFxuPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzIj48XG4+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorPGlmKCFlZGdlcyk+CiskYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47IDwhIGlmIG5vIGVkZ2VzLCBkb24ndCBnZW4gRUxTRSAhPgorPGVsc2U+CitlbHNlIHsKKyAgICAkYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD47Cit9PFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEFuIGFjY2VwdCBzdGF0ZSBpbmRpY2F0ZXMgYSB1bmlxdWUgYWx0ZXJuYXRpdmUgaGFzIGJlZW4gcHJlZGljdGVkICovCitkZmFBY2NlcHRTdGF0ZShhbHQpIDo6PSAiJGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8YWx0PjsiCisKKy8qKiBBIHNpbXBsZSBlZGdlIHdpdGggYW4gZXhwcmVzc2lvbi4gIElmIHRoZSBleHByZXNzaW9uIGlzIHNhdGlzZmllZCwKKyAqICBlbnRlciB0byB0aGUgdGFyZ2V0IHN0YXRlLiAgVG8gaGFuZGxlIGdhdGVkIHByb2R1Y3Rpb25zLCB3ZSBtYXkKKyAqICBoYXZlIHRvIGV2YWx1YXRlIHNvbWUgcHJlZGljYXRlcyBmb3IgdGhpcyBlZGdlLgorICovCitkZmFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGUsIHByZWRpY2F0ZXMpIDo6PSA8PAoraWYgKCAoPGxhYmVsRXhwcj4pIDxpZihwcmVkaWNhdGVzKT4mJiAoPHByZWRpY2F0ZXM+KTxlbmRpZj4pIHsKKyAgICA8dGFyZ2V0U3RhdGU+Cit9Cis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoc3dpdGNoIGNhc2UpCisKKy8qKiBBIERGQSBzdGF0ZSB3aGVyZSBhIFNXSVRDSCBtYXkgYmUgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgZ2VuZXJhdG9yCisgKiAgZGVjaWRlcyBpZiB0aGlzIGlzIHBvc3NpYmxlOiBDb2RlR2VuZXJhdG9yLmNhbkdlbmVyYXRlU3dpdGNoKCkuCisgKi8KK2RmYVN0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoICRzZWxmLT5pbnB1dC0+TEEoPGs+KSApIHsKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorICAgIGVsc2UgeworICAgIDxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgICAgICRhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PjsKKyAgICA8ZWxzZT4KKyAgICAgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgICAgIG15ICRudmFlID0KKyAgICAgICAgICAgIEFOVExSOjpSdW50aW1lOjpOb1ZpYWJsZUFsdEV4Y2VwdGlvbi0+bmV3KHsKKyAgICAgICAgICAgICAgICBncmFtbWFyX2RlY2lzaW9uX2Rlc2NyaXB0aW9uID0+ICI8ZGVzY3JpcHRpb24+IiwKKyAgICAgICAgICAgICAgICBkZWNpc2lvbl9udW1iZXIgPT4gPGRlY2lzaW9uTnVtYmVyPiwKKyAgICAgICAgICAgICAgICBzdGF0ZV9udW1iZXIgPT4gPHN0YXRlTnVtYmVyPiwKKyAgICAgICAgICAgICAgICBpbnB1dCA9PiAkc2VsZi0+aW5wdXQsCisgICAgICAgICAgICB9KTs8XG4+CisgICAgICAgIDxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKyAgICAgICAgY3JvYWsgJG52YWU7PFxuPgorICAgIDxlbmRpZj4KKyAgICB9Cit9PFxuPgorPj4KKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoICRzZWxmLT5pbnB1dC0+TEEoPGs+KSApIHsKKyAgICA8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorfTxcbj4KKz4+CisKK2RmYUxvb3BiYWNrU3RhdGVTd2l0Y2goaywgZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3N3aXRjaCAoICRzZWxmLT5pbnB1dC0+TEEoPGs+KSApIHsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KK2Vsc2UgeyAkYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD4gfTxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAorY2FzZSBbPGxhYmVsczp7IDxpdD4gfTsgc2VwYXJhdG9yPSIsICI+XSB7IDx0YXJnZXRTdGF0ZT4gfQorPj4KKworLy8gQyB5IGMgbCBpIGMgIEQgRiBBCisKKy8qKiBUaGUgY29kZSB0byBpbml0aWF0ZSBleGVjdXRpb24gb2YgYSBjeWNsaWMgREZBOyB0aGlzIGlzIHVzZWQKKyAqICBpbiB0aGUgcnVsZSB0byBwcmVkaWN0IGFuIGFsdCBqdXN0IGxpa2UgdGhlIGZpeGVkIERGQSBjYXNlLgorICogIFRoZSA8bmFtZT4gYXR0cmlidXRlIGlzIGluaGVyaXRlZCB2aWEgdGhlIHBhcnNlciwgbGV4ZXIsIC4uLgorICovCitkZmFEZWNpc2lvbihkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CiskYWx0PGRlY2lzaW9uTnVtYmVyPiA9ICRzZWxmLT5kZmE8ZGVjaXNpb25OdW1iZXI+LT5wcmVkaWN0KCRzZWxmLT5pbnB1dCk7Cis+PgorCisvKiBEdW1wIERGQSB0YWJsZXMgYXMgcnVuLWxlbmd0aC1lbmNvZGVkIFN0cmluZ3Mgb2Ygb2N0YWwgdmFsdWVzLgorICogQ2FuJ3QgdXNlIGhleCBhcyBjb21waWxlciB0cmFuc2xhdGVzIHRoZW0gYmVmb3JlIGNvbXBpbGF0aW9uLgorICogVGhlc2Ugc3RyaW5ncyBhcmUgc3BsaXQgaW50byBtdWx0aXBsZSwgY29uY2F0ZW5hdGVkIHN0cmluZ3MuCisgKiBKYXZhIHB1dHMgdGhlbSBiYWNrIHRvZ2V0aGVyIGF0IGNvbXBpbGUgdGltZSB0aGFua2Z1bGx5LgorICogSmF2YSBjYW5ub3QgaGFuZGxlIGxhcmdlIHN0YXRpYyBhcnJheXMsIHNvIHdlJ3JlIHN0dWNrIHdpdGggdGhpcworICogZW5jb2RlL2RlY29kZSBhcHByb2FjaC4gIFNlZSBhbmFseXNpcyBhbmQgcnVudGltZSBERkEgZm9yCisgKiB0aGUgZW5jb2RpbmcgbWV0aG9kcy4KKyAqLworY3ljbGljREZBKGRmYSkgOjo9IDw8CitSZWFkb25seSBteSAkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90ID0+IEFOVExSOjpSdW50aW1lOjpERkEtPnVucGFja19ybGUoWyA8ZGZhLmphdmFDb21wcmVzc2VkRU9UOyBzZXBhcmF0b3I9IiwgIj4gXSk7CitSZWFkb25seSBteSAkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mID0+IEFOVExSOjpSdW50aW1lOjpERkEtPnVucGFja19ybGUoWyA8ZGZhLmphdmFDb21wcmVzc2VkRU9GOyBzZXBhcmF0b3I9IiwgIj4gXSk7CitSZWFkb25seSBteSAkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluID0+IEFOVExSOjpSdW50aW1lOjpERkEtPnVucGFja19ybGUoWyA8ZGZhLmphdmFDb21wcmVzc2VkTWluOyBzZXBhcmF0b3I9IiwgIj4gXSk7CitSZWFkb25seSBteSAkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4ID0+IEFOVExSOjpSdW50aW1lOjpERkEtPnVucGFja19ybGUoWyA8ZGZhLmphdmFDb21wcmVzc2VkTWF4OyBzZXBhcmF0b3I9IiwgIj4gXSk7CitSZWFkb25seSBteSAkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0ID0+IEFOVExSOjpSdW50aW1lOjpERkEtPnVucGFja19ybGUoWyA8ZGZhLmphdmFDb21wcmVzc2VkQWNjZXB0OyBzZXBhcmF0b3I9IiwgIj4gXSk7CitSZWFkb25seSBteSAkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbCA9PiBBTlRMUjo6UnVudGltZTo6REZBLT51bnBhY2tfcmxlKFsgPGRmYS5qYXZhQ29tcHJlc3NlZFNwZWNpYWw7IHNlcGFyYXRvcj0iLCAiPiBdKTsKK1JlYWRvbmx5IG15ICRERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uID0+IFsgPGRmYS5qYXZhQ29tcHJlc3NlZFRyYW5zaXRpb246e3N8QU5UTFI6OlJ1bnRpbWU6OkRGQS0+dW5wYWNrX3JsZShbIDxzOyBzZXBhcmF0b3I9IiwgIj4gXSl9OyBzZXBhcmF0b3I9IiwgIj4gXTsKKworeworcGFja2FnZSA8bmFtZT46OkRGQTxkZmEuZGVjaXNpb25OdW1iZXI+OwordXNlIEFOVExSOjpSdW50aW1lOjpDbGFzczsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworZXh0ZW5kcyAnQU5UTFI6OlJ1bnRpbWU6OkRGQSc7CisKK3N1YiBCVUlMRCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkcGFyYW1fcmVmID0gX19QQUNLQUdFX18tPnVucGFja19wYXJhbXMoQF8sIHsKKyAgICAgICAgc3BlYyA9PiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSA9PiAncmVjb2duaXplcicsCisgICAgICAgICAgICAgICAgaXNhICA9PiAnQU5UTFI6OlJ1bnRpbWU6OkJhc2VSZWNvZ25pemVyJworICAgICAgICAgICAgfSwKKyAgICAgICAgXQorICAgIH0pOworCisgICAgJHNlbGYtPnJlY29nbml6ZXIoJHBhcmFtX3JlZi0+e3JlY29nbml6ZXJ9KTsKKyAgICAkc2VsZi0+ZGVjaXNpb25fbnVtYmVyKDxkZmEuZGVjaXNpb25OdW1iZXI+KTsKKyAgICAkc2VsZi0+ZW90KCRERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb3QpOworICAgICRzZWxmLT5lb2YoJERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZik7CisgICAgJHNlbGYtPm1pbigkREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluKTsKKyAgICAkc2VsZi0+bWF4KCRERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9tYXgpOworICAgICRzZWxmLT5hY2NlcHQoJERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdCk7CisgICAgJHNlbGYtPnNwZWNpYWwoJERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWwpOworICAgICRzZWxmLT50cmFuc2l0aW9uKCRERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uKTsKK30KKworc3ViIGdldF9kZXNjcmlwdGlvbiB7CisgICAgcmV0dXJuICI8ZGZhLmRlc2NyaXB0aW9uPiI7Cit9CisKKzxAZXJyb3JNZXRob2QoKT4KKworPGlmKGRmYS5zcGVjaWFsU3RhdGVTVHMpPgorc3ViIHNwZWNpYWxfc3RhdGVfdHJhbnNpdGlvbiB7CisgICAgbXkgKCRzZWxmLCAkcGFyYW1fcmVmKSA9IHVucGFja19wYXJhbXMoQF8sIHsKKyAgICAgICAgc3BlYyA9PiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSA9PiAncycsCisgICAgICAgICAgICAgICAgdHlwZSA9PiBTQ0FMQVIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWUgPT4gJ2lucHV0JywKKyAgICAgICAgICAgICAgICBpc2EgID0+ICdBTlRMUjo6UnVudGltZTo6SW50U3RyZWFtJywKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorICAgIH0pOworICAgIG15ICRzID0gJHBhcmFtX3JlZi0+e3N9OworICAgIG15ICRpbnB1dCA9ICRwYXJhbV9yZWYtPntpbnB1dH07CisKKyAgICBzd2l0Y2ggKCRzKSB7CisgICAgICAgIDxkZmEuc3BlY2lhbFN0YXRlU1RzOntzdGF0ZSB8CisgICAgICAgIGNhc2UgPGkwPiBceyA8ISBjb21wcmVzc2VkIHNwZWNpYWwgc3RhdGUgbnVtYmVycyAwLi5uLTEgIT4KKyAgICAgICAgICAgIDxzdGF0ZT59OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgfQorICAgIH0KKworPGlmKGJhY2t0cmFja2luZyk+CisgICAgaWYgKCRzZWxmLT5zdGF0ZS0+YmFja3RyYWNraW5nID4gMCkgeworICAgICAgICAkc2VsZi0+c3RhdGUtPmZhaWxlZCA9IDE7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9PFxuPgorPGVuZGlmPgorCisgICAgbXkgJG52YWUgPQorICAgICAgICBBTlRMUjo6UnVudGltZTo6Tm9WaWFibGVBbHRFeGNlcHRpb24tPm5ldyh7CisgICAgICAgICAgICBncmFtbWFyX2RlY2lzaW9uX2Rlc2NyaXB0aW9uID0+ICRzZWxmLT5nZXRfZGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgIGRlY2lzaW9uX251bWJlciA9PiA8ZGZhLmRlY2lzaW9uTnVtYmVyPiwKKyAgICAgICAgICAgIHN0YXRlX251bWJlciA9PiAkcywKKyAgICAgICAgICAgIGlucHV0ID0+ICRpbnB1dCwKKyAgICAgICAgfSk7PFxuPgorICAgICRzZWxmLT5lcnJvcigkbnZhZSk7CisgICAgJG52YWUtPnRocm93KCk7CisgICAgfTxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCisvKiogQSBzdGF0ZSBpbiBhIGN5Y2xpYyBERkE7IGl0J3MgYSBzcGVjaWFsIHN0YXRlIGFuZCBwYXJ0IG9mIGEgYmlnIHN3aXRjaCBvbgorICogIHN0YXRlLgorICovCitjeWNsaWNERkFTdGF0ZShkZWNpc2lvbk51bWJlcixzdGF0ZU51bWJlcixlZGdlcyxuZWVkRXJyb3JDbGF1c2Usc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK215ICRpbnB1dCA9ICRzZWxmLT5pbnB1dDsKK215ICRMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9ICRpbnB1dC0+TEEoMSk7PFxuPgorPGlmKHNlbVByZWRTdGF0ZSk+IDwhIGdldCBuZXh0IGxvb2thaGVhZCBzeW1ib2wgdG8gdGVzdCBlZGdlcywgdGhlbiByZXdpbmQgIT4KK215ICRpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9ICRpbnB1dC0+aW5kZXgoKTsKKyRpbnB1dC0+cmV3aW5kKCk7PFxuPgorPGVuZGlmPgorcyA9IC0xOworPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzIj4KKzxpZihzZW1QcmVkU3RhdGUpPiA8ISByZXR1cm4gaW5wdXQgY3Vyc29yIHRvIHN0YXRlIGJlZm9yZSB3ZSByZXdvdW5kICE+CitpbnB1dC5zZWVrKGluZGV4PGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+KTs8XG4+Cis8ZW5kaWY+CitpZiAoIHM+PTAgKSByZXR1cm4gczsKK2JyZWFrOworPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rYWhlYWQgYW5kIGluZGljYXRlIHdoYXQKKyAqICBzdGF0ZSB0byBqdW1wIHRvIG5leHQgaWYgc3VjY2Vzc2Z1bC4KKyAqLworY3ljbGljREZBRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlTnVtYmVyLCBlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7cyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47fTxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkgY2hhcjsKKyAqICBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICovCitlb3RERkFFZGdlKHRhcmdldFN0YXRlTnVtYmVyLGVkZ2VOdW1iZXIsIHByZWRpY2F0ZXMpIDo6PSA8PAorcyA9IDx0YXJnZXRTdGF0ZU51bWJlcj47PFxuPgorPj4KKworCisvLyBEIEYgQSAgRSBYIFAgUiBFIFMgUyBJIE8gTiBTCisKK2FuZFByZWRpY2F0ZXMobGVmdCxyaWdodCkgOjo9ICIoPGxlZnQ+ICYmIDxyaWdodD4pIgorCitvclByZWRpY2F0ZXMob3BlcmFuZHMpIDo6PSAiKDxmaXJzdChvcGVyYW5kcyk+PHJlc3Qob3BlcmFuZHMpOntvIHwgfHw8bz59PikiCisKK25vdFByZWRpY2F0ZShwcmVkKSA6Oj0gIiEoPGV2YWxQcmVkaWNhdGUoLi4uKT4pIgorCitldmFsUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiPHByZWQ+IgorCitldmFsU3luUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAiPHByZWQ+KCkiCisKK2xvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICIkTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gZXEgPGF0b20+IgorCisvKiogU29tZXRpbWVzIGEgbG9va2FoZWFkIHRlc3QgY2Fubm90IGFzc3VtZSB0aGF0IExBKGspIGlzIGluIGEgdGVtcCB2YXJpYWJsZQorICogIHNvbWV3aGVyZS4gIE11c3QgYXNrIGZvciB0aGUgbG9va2FoZWFkIGRpcmVjdGx5LgorICovCitpc29sYXRlZExvb2thaGVhZFRlc3QoYXRvbSxrLGF0b21Bc0ludCkgOjo9ICIkc2VsZi0+aW5wdXQtPkxBKDxrPikgZXEgPGF0b20+IgorCitsb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSA8PAorKCRMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiBnZSA8bG93ZXI+ICYmICRMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiBsZSA8dXBwZXI+KQorPj4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSAiKCRzZWxmLT5pbnB1dC0+TEEoPGs+KSBnZSA8bG93ZXI+ICYmICRzZWxmLT5pbnB1dC0+TEEoPGs+KSBsZSA8dXBwZXI+KSIKKworc2V0VGVzdChyYW5nZXMpIDo6PSAiPHJhbmdlczsgc2VwYXJhdG9yPVwiIHx8IFwiPiIKKworLy8gQSBUIFQgUiBJIEIgVSBUIEUgUworCitnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+Citwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIDxzY29wZS5uYW1lPl9zY29wZSB7CisgICAgPHNjb3BlLmF0dHJpYnV0ZXM6ezxpdC5kZWNsPjt9OyBzZXBhcmF0b3I9IlxuIj4KK30KK3Byb3RlY3RlZCBTdGFjayA8c2NvcGUubmFtZT5fc3RhY2sgPSBuZXcgU3RhY2soKTs8XG4+Cis8ZW5kaWY+Cis+PgorCitydWxlQXR0cmlidXRlU2NvcGUoc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyA8c2NvcGUubmFtZT5fc2NvcGUgeworICAgIDxzY29wZS5hdHRyaWJ1dGVzOns8aXQuZGVjbD47fTsgc2VwYXJhdG9yPSJcbiI+Cit9Citwcm90ZWN0ZWQgU3RhY2sgPHNjb3BlLm5hbWU+X3N0YWNrID0gbmV3IFN0YWNrKCk7PFxuPgorPGVuZGlmPgorPj4KKworcmV0dXJuVHlwZSgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxydWxlRGVzY3JpcHRvci5uYW1lPl9yZXR1cm4KKzxlbHNlPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBHZW5lcmF0ZSB0aGUgSmF2YSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBvciBtdWx0aXBsZSByZXR1cm4KKyAqICB2YWx1ZXMuCisgKi8KK3J1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGUpIDo6PSA8PAorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxyZWZlcmVuY2VkUnVsZS5uYW1lPl9yZXR1cm4KKzxlbHNlPgorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK3ZvaWQKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBVc2luZyBhIHR5cGUgdG8gaW5pdCB2YWx1ZSBtYXAsIHRyeSB0byBpbml0IGEgdHlwZTsgaWYgbm90IGluIHRhYmxlCisgKiAgbXVzdCBiZSBhbiBvYmplY3QsIGRlZmF1bHQgdmFsdWUgaXMgInVuZGVmIi4KKyAqLworaW5pdFZhbHVlKHR5cGVOYW1lKSA6Oj0gPDwKKzxpZih0eXBlTmFtZSk+Cis8cGVybFR5cGVJbml0TWFwLih0eXBlTmFtZSk+Cis8ZWxzZT4KK3VuZGVmCis8ZW5kaWY+Cis+PgorCisvKiogRGVmaW5lIGEgcnVsZSBsYWJlbCBpbmNsdWRpbmcgZGVmYXVsdCB2YWx1ZSAqLworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPDwKK215ICQ8bGFiZWwubGFiZWwudGV4dD4gPSA8aW5pdFZhbHVlKHR5cGVOYW1lPXJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpKT47PFxuPgorPj4KKworLyoqIERlZmluZSBhIHJldHVybiBzdHJ1Y3QgZm9yIGEgcnVsZSBpZiB0aGUgY29kZSBuZWVkcyB0byBhY2Nlc3MgaXRzCisgKiAgc3RhcnQvc3RvcCB0b2tlbnMsIHRyZWUgc3R1ZmYsIGF0dHJpYnV0ZXMsIC4uLiAgTGVhdmUgYSBob2xlIGZvcgorICogIHN1Ymdyb3VwcyB0byBzdGljayBpbiBtZW1iZXJzLgorICovCityZXR1cm5TY29wZShzY29wZSkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgoreworICAgIHBhY2thZ2UgPHJldHVyblR5cGUoKT47CisgICAgdXNlIEFOVExSOjpSdW50aW1lOjpDbGFzczsKKworICAgIGV4dGVuZHMgJ0FOVExSOjpSdW50aW1lOjo8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZWxzZT5QYXJzZXI8ZW5kaWY+UnVsZVJldHVyblNjb3BlJzsKKworICAgIDxzY29wZS5hdHRyaWJ1dGVzOntwdWJsaWMgPGl0LmRlY2w+O307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAcnVsZVJldHVybk1lbWJlcnMoKT4KK30KKzxlbmRpZj4KKz4+CisKK3BhcmFtZXRlclNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxzY29wZS5hdHRyaWJ1dGVzOnskPGl0Lm5hbWU+fTsgc2VwYXJhdG9yPSIsICI+Cis+PgorCitwYXJhbWV0ZXJBdHRyaWJ1dGVSZWYoYXR0cikgOjo9ICIkPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIiQ8YXR0ci5uYW1lPiA9PGV4cHI+OyIKKworc2NvcGVBdHRyaWJ1dGVSZWYoc2NvcGUsYXR0cixpbmRleCxuZWdJbmRleCkgOjo9IDw8Cis8aWYobmVnSW5kZXgpPgorKCg8c2NvcGU+X3Njb3BlKTxzY29wZT5fc3RhY2suZWxlbWVudEF0KDxzY29wZT5fc3RhY2suc2l6ZSgpLTxuZWdJbmRleD4tMSkpLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKzxpZihpbmRleCk+CisoKDxzY29wZT5fc2NvcGUpPHNjb3BlPl9zdGFjay5lbGVtZW50QXQoPGluZGV4PikpLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKygoPHNjb3BlPl9zY29wZSk8c2NvcGU+X3N0YWNrLnBlZWsoKSkuPGF0dHIubmFtZT4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK3Njb3BlU2V0QXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsZXhwcixpbmRleCxuZWdJbmRleCkgOjo9IDw8Cis8aWYobmVnSW5kZXgpPgorKCg8c2NvcGU+X3Njb3BlKTxzY29wZT5fc3RhY2suZWxlbWVudEF0KDxzY29wZT5fc3RhY2suc2l6ZSgpLTxuZWdJbmRleD4tMSkpLjxhdHRyLm5hbWU+ID08ZXhwcj47Cis8ZWxzZT4KKzxpZihpbmRleCk+CisoKDxzY29wZT5fc2NvcGUpPHNjb3BlPl9zdGFjay5lbGVtZW50QXQoPGluZGV4PikpLjxhdHRyLm5hbWU+ID08ZXhwcj47Cis8ZWxzZT4KKygoPHNjb3BlPl9zY29wZSk8c2NvcGU+X3N0YWNrLnBlZWsoKSkuPGF0dHIubmFtZT4gPTxleHByPjsKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiAkeCBpcyBlaXRoZXIgZ2xvYmFsIHNjb3BlIG9yIHggaXMgcnVsZSB3aXRoIGR5bmFtaWMgc2NvcGU7IHJlZmVycworICogIHRvIHN0YWNrIGl0c2VsZiBub3QgdG9wIG9mIHN0YWNrLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByZWRpY2F0ZXMKKyAqICBsaWtlIHskZnVuY3Rpb24uc2l6ZSgpPjAgJiYgJGZ1bmN0aW9uOjpuYW1lLmVxdWFscygiZm9vIil9PworICovCitpc29sYXRlZER5bmFtaWNTY29wZVJlZihzY29wZSkgOjo9ICI8c2NvcGU+X3N0YWNrIgorCisvKiogcmVmZXJlbmNlIGFuIGF0dHJpYnV0ZSBvZiBydWxlOyBtaWdodCBvbmx5IGhhdmUgc2luZ2xlIHJldHVybiB2YWx1ZSAqLworcnVsZUxhYmVsUmVmKHJlZmVyZW5jZWRSdWxlLHNjb3BlLGF0dHIpIDo6PSA8PAorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKyQ8c2NvcGU+LjxhdHRyLm5hbWU+Cis8ZWxzZT4KKyQ8c2NvcGU+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsYXR0cikgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+Cis8ZWxzZT4KKyQ8YXR0ci5uYW1lPgorPGVuZGlmPgorPj4KKworcmV0dXJuU2V0QXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIsZXhwcikgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+ID08ZXhwcj47Cis8ZWxzZT4KKyQ8YXR0ci5uYW1lPiA9PGV4cHI+OworPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byB0cmFuc2xhdGUgJHRva2VuTGFiZWwgKi8KK3Rva2VuTGFiZWxSZWYobGFiZWwpIDo6PSAiJDxsYWJlbD4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0XzxsYWJlbD4iCisKKworLy8gbm90IHN1cmUgdGhlIG5leHQgYXJlIHRoZSByaWdodCBhcHByb2FjaAorCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gIiQ8c2NvcGU+LT5nZXRfdGV4dCgpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldFR5cGUoKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRMaW5lKCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRDaGFubmVsKCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldFRva2VuSW5kZXgoKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPl90cmVlIgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIigoPGxhYmVsVHlwZT4pPHNjb3BlPi5zdGFydCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKCg8bGFiZWxUeXBlPik8c2NvcGU+LnN0b3ApIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIigoPEFTVExhYmVsVHlwZT4pPHNjb3BlPi50cmVlKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgoraW5wdXQuZ2V0VG9rZW5TdHJlYW0oKS50b1N0cmluZygKKyAgaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0YXJ0SW5kZXgoPHNjb3BlPi5zdGFydCksCisgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgoPHNjb3BlPi5zdGFydCkpCis8ZWxzZT4KK3N1YnN0cigkc2VsZi0+aW5wdXQsICQ8c2NvcGU+LT5zdGFydCwgJDxzY29wZT4tPnN0b3ApCis8ZW5kaWY+Cis+PgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uc3QiCisKKy8qKiBJc29sYXRlZCAkUlVMRSByZWYgb2sgaW4gbGV4ZXIgYXMgaXQncyBhIFRva2VuICovCitsZXhlclJ1bGVMYWJlbChsYWJlbCkgOjo9ICIkPGxhYmVsPiIKKworbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRUeXBlKCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmdldExpbmUoKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uZ2V0Q2hhbm5lbCgpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uZ2V0VG9rZW5JbmRleCgpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5nZXRUZXh0KCkiCisKKy8vIFNvbWVib2R5IG1heSByZWYgJHRlbXBsYXRlIG9yICR0cmVlIG9yICRzdG9wIHdpdGhpbiBhIHJ1bGU6CitydWxlUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsYXR0cikgOjo9ICIoKDxsYWJlbFR5cGU+KXJldHZhbC5zdGFydCkiCitydWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIigoPGxhYmVsVHlwZT4pcmV0dmFsLnN0b3ApIgorcnVsZVByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICIoKDxBU1RMYWJlbFR5cGU+KXJldHZhbC50cmVlKSIKK3J1bGVQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSA8PAorPGlmKFRSRUVfUEFSU0VSKT4KK2lucHV0LmdldFRva2VuU3RyZWFtKCkudG9TdHJpbmcoCisgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5zdGFydCksCisgIGlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdG9wSW5kZXgocmV0dmFsLnN0YXJ0KSkKKzxlbHNlPgoraW5wdXQudG9TdHJpbmcocmV0dmFsLnN0YXJ0LGlucHV0LkxUKC0xKSkKKzxlbmRpZj4KKz4+CitydWxlUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICJyZXR2YWwuc3QiCisKK2xleGVyUnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJnZXRUZXh0KCkiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiJF90eXBlIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gInRva2VuU3RhcnRMaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfcG9zKHNjb3BlLGF0dHIpIDo6PSAidG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiLTEiIC8vIHVuZGVmaW5lZCB0b2tlbiBpbmRleCBpbiBsZXhlcgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSxhdHRyKSA6Oj0gIiRfY2hhbm5lbCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAidG9rZW5TdGFydENoYXJJbmRleCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoZ2V0Q2hhckluZGV4KCktMSkiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zZWxmKHNjb3BlLGF0dHIpIDo6PSAiJHNlbGYiCisKKy8vIHNldHRpbmcgJHN0IGFuZCAkdHJlZSBpcyBhbGxvd2VkIGluIGxvY2FsIHJ1bGUuIGV2ZXJ5dGhpbmcgZWxzZQorLy8gaXMgZmxhZ2dlZCBhcyBlcnJvcgorcnVsZVNldFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cixleHByKSA6Oj0gInJldHZhbC50cmVlID08ZXhwcj47IgorcnVsZVNldFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwuc3QgPTxleHByPjsiCisKKworLyoqIEhvdyB0byBleGVjdXRlIGFuIGFjdGlvbiAqLworZXhlY0FjdGlvbihhY3Rpb24pIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+Cis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7CisgIDxhY3Rpb24+Cit9Cis8ZWxzZT4KK2lmICggYmFja3RyYWNraW5nPT0wICkgeworICA8YWN0aW9uPgorfQorPGVuZGlmPgorPGVsc2U+Cis8YWN0aW9uPgorPGVuZGlmPgorPj4KKworLy8gTSBJIFMgQyAocHJvcGVydGllcywgZXRjLi4uKQorCitiaXRzZXQobmFtZSwgd29yZHM2NCkgOjo9IDw8CitSZWFkb25seSBteSAkPG5hbWU+ID0+IEFOVExSOjpSdW50aW1lOjpCaXRTZXQtPm5ldyh7IHdvcmRzNjQgPT4gWyA8d29yZHM2NDp7JzxpdD4nfTtzZXBhcmF0b3I9IiwgIj4gXSB9KTs8XG4+Cis+PgorCitjb2RlRmlsZUV4dGVuc2lvbigpIDo6PSAiLnBtIgorCit0cnVlKCkgOjo9ICIxIgorZmFsc2UoKSA6Oj0gIjAiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1Quc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vQVNULnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTI1MmUzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vQVNULnN0ZwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK2ZpbmlzaGVkQmFja3RyYWNraW5nKGJsb2NrKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT46CisgICAgPGJsb2NrPgorPGVsc2U+Cis8YmxvY2s+Cis8ZW5kaWY+Cis+PgorCitAb3V0cHV0RmlsZS5pbXBvcnRzKCkgOjo9IDw8Cis8QHN1cGVyLmltcG9ydHMoKT4KKzxpZighVFJFRV9QQVJTRVIpPjwhIHRyZWUgcGFyc2VyIHdvdWxkIGFscmVhZHkgaGF2ZSBpbXBvcnRlZCAhPgorZnJvbSBhbnRscjMudHJlZSBpbXBvcnQgKjxcbj4KKzxlbmRpZj4KKz4+CisKKy8qKiBBZGQgYW4gYWRhcHRvciBwcm9wZXJ0eSB0aGF0IGtub3dzIGhvdyB0byBidWlsZCB0cmVlcyAqLworQGdlbmVyaWNQYXJzZXIuaW5pdCgpIDo6PSA8PAorc2VsZi5fYWRhcHRvciA9IE5vbmUKK3NlbGYuYWRhcHRvciA9IENvbW1vblRyZWVBZGFwdG9yKCkKKzxAc3VwZXIuaW5pdCgpPgorPj4KKworQGdlbmVyaWNQYXJzZXIubWVtYmVycygpIDo6PSA8PAorPEBzdXBlci5tZW1iZXJzKCk+Cis8YXN0QWNjZXNzb3IoKT4KKz4+CisKK2FzdEFjY2Vzc29yKCkgOjo9IDw8CitkZWYgZ2V0VHJlZUFkYXB0b3Ioc2VsZik6CisgICAgcmV0dXJuIHNlbGYuX2FkYXB0b3IKKworZGVmIHNldFRyZWVBZGFwdG9yKHNlbGYsIGFkYXB0b3IpOgorICAgIHNlbGYuX2FkYXB0b3IgPSBhZGFwdG9yCisgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPi5hZGFwdG9yID0gYWRhcHRvcn07IHNlcGFyYXRvcj0iXG4iPgorCithZGFwdG9yID0gcHJvcGVydHkoZ2V0VHJlZUFkYXB0b3IsIHNldFRyZWVBZGFwdG9yKQorPj4KKworQHJldHVyblNjb3BlLnJ1bGVSZXR1cm5Jbml0KCkgOjo9IDw8CitzZWxmLnRyZWUgPSBOb25lCis+PgorCisKKy8qKiBBZGQgYSB2YXJpYWJsZSB0byB0cmFjayBydWxlJ3MgcmV0dXJuIEFTVCAqLworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPHN1cGVyLnJ1bGVEZWNsYXJhdGlvbnMoKT4KK3Jvb3RfMCA9IE5vbmU8XG4+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8c3VwZXIucnVsZUxhYmVsRGVmcygpPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHNdCisgICAgOntpdCB8IDxpdC5sYWJlbC50ZXh0Pl90cmVlID0gTm9uZX07IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVsczp7aXQgfCA8aXQubGFiZWwudGV4dD5fdHJlZSA9IE5vbmV9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxUb2tlblJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2l0IHwgc3RyZWFtXzxpdD4gPSBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtKHNlbGYuX2FkYXB0b3IsICJ0b2tlbiA8aXQ+Iil9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5hbGxSdWxlUmVmc0luQWx0c1dpdGhSZXdyaXRlcworICAgIDp7aXQgfCBzdHJlYW1fPGl0PiA9IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShzZWxmLl9hZGFwdG9yLCAicnVsZSA8aXQ+Iil9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKKy8qKiBXaGVuIGRvaW5nIGF1dG8gQVNUIGNvbnN0cnVjdGlvbiwgd2UgbXVzdCBkZWZpbmUgc29tZSB2YXJpYWJsZXM7CisgKiAgVGhlc2Ugc2hvdWxkIGJlIHR1cm5lZCBvZmYgaWYgZG9pbmcgcmV3cml0ZXMuICBUaGlzIG11c3QgYmUgYSAibW9kZSIKKyAqICBhcyBhIHJ1bGUgY291bGQgaGF2ZSBib3RoIHJld3JpdGUgYW5kIEFTVCB3aXRoaW4gdGhlIHNhbWUgYWx0ZXJuYXRpdmUKKyAqICBibG9jay4KKyAqLworQGFsdC5kZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxpZihhdXRvQVNUKT4KKzxpZihvdXRlckFsdCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KK3Jvb3RfMCA9IHNlbGYuX2FkYXB0b3IubmlsKCk8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisKKy8vIFQgciBhIGMgayBpIG4gZyAgUiB1IGwgZSAgRSBsIGUgbSBlIG4gdCBzCisKKy8qKiBJRCBhbmQgdHJhY2sgaXQgZm9yIHVzZSBpbiBhIHJld3JpdGUgcnVsZSAqLwordG9rZW5SZWZUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4gPCEgVHJhY2sgaW1wbGllcyBubyBhdXRvIEFTVCBjb25zdHJ1Y3Rpb24hPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHtzdHJlYW1fPHRva2VuPi5hZGQoPGxhYmVsPil9KT4KKz4+CisKKy8qKiBpZHMrPUlEIGFuZCB0cmFjayBpdCBmb3IgdXNlIGluIGEgcmV3cml0ZSBydWxlOyBhZGRzIHRvIGlkcyAqYW5kKgorICogIHRvIHRoZSB0cmFja2luZyBsaXN0IHN0cmVhbV9JRCBmb3IgdXNlIGluIHRoZSByZXdyaXRlLgorICovCit0b2tlblJlZlRyYWNrQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmVHJhY2soLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIF4oSUQgLi4uKSB0cmFjayBmb3IgcmV3cml0ZSAqLwordG9rZW5SZWZSdWxlUm9vdFRyYWNrKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHtzdHJlYW1fPHRva2VuPi5hZGQoPGxhYmVsPil9KT4KKz4+CisKKy8qKiBNYXRjaCBeKGxhYmVsKz1UT0tFTiAuLi4pIHRyYWNrIGZvciByZXdyaXRlICovCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBydWxlIHdoZW4gb3V0cHV0PUFTVCBhbmQgdHJhY2tpbmcgZm9yIHJld3JpdGUgKi8KK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoe3N0cmVhbV88cnVsZS5uYW1lPi5hZGQoPGxhYmVsPi50cmVlKX0pPgorPj4KKworLyoqIHgrPXJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZUcmFjayguLi4pPgorPGxpc3RMYWJlbChsYWJlbCwgezxsYWJlbD4udHJlZX0pPgorPj4KKworLyoqIF4ocnVsZSAuLi4pIHJld3JpdGUgKi8KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHtzdHJlYW1fPHJ1bGUubmFtZT4uYWRkKDxsYWJlbD4udHJlZSl9KT4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3RUcmFjayguLi4pPgorPGxpc3RMYWJlbChsYWJlbCwgezxsYWJlbD4udHJlZX0pPgorPj4KKworLy8gUiBlIHcgciBpIHQgZQorCityZXdyaXRlQ29kZSgKKyAgICAgICAgYWx0cywgZGVzY3JpcHRpb24sCisgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIEFMTCByZWZlcmVuY2VkIGVsZW1lbnRzIHRvIHJpZ2h0IG9mIC0+CisgICAgICAgIHJlZmVyZW5jZWRUb2tlbkxhYmVscywKKyAgICAgICAgcmVmZXJlbmNlZFRva2VuTGlzdExhYmVscywKKyAgICAgICAgcmVmZXJlbmNlZFJ1bGVMYWJlbHMsCisgICAgICAgIHJlZmVyZW5jZWRSdWxlTGlzdExhYmVscywKKyAgICAgICAgcmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzLAorICAgICAgICByZWZlcmVuY2VkV2lsZGNhcmRMaXN0TGFiZWxzLAorICAgICAgICByZXdyaXRlQmxvY2tMZXZlbCwgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PQorPDwKKyMgQVNUIFJld3JpdGUKKyMgZWxlbWVudHM6IDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOyBzZXBhcmF0b3I9IiwgIj4KKyMgdG9rZW4gbGFiZWxzOiA8cmVmZXJlbmNlZFRva2VuTGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKyMgcnVsZSBsYWJlbHM6IDxyZWZlcmVuY2VkUnVsZUxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisjIHRva2VuIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFRva2VuTGlzdExhYmVsczsgc2VwYXJhdG9yPSIsICI+CisjIHJ1bGUgbGlzdCBsYWJlbHM6IDxyZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorIyB3aWxkY2FyZCBsYWJlbHM6IDxbcmVmZXJlbmNlZFdpbGRjYXJkTGFiZWxzLHJlZmVyZW5jZWRXaWxkY2FyZExpc3RMYWJlbHNdOyBzZXBhcmF0b3I9IiwgIj4KKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzAKKzxyZXdyaXRlQ29kZUxhYmVscygpPgorcm9vdF8wID0gc2VsZi5fYWRhcHRvci5uaWwoKQorPGZpcnN0KGFsdHMpOnJld3JpdGVBbHRGaXJzdCgpOyBhbmNob3I+CisKKzxyZXN0KGFsdHMpOnthIHwgZWw8cmV3cml0ZUFsdFJlc3QoYSk+fTsgYW5jaG9yLCBzZXBhcmF0b3I9IlxuXG4iPgorCis8ISBpZiB0cmVlIHBhcnNlciBhbmQgcmV3cml0ZT10cnVlICE+Cis8aWYoVFJFRV9QQVJTRVIpPgorPGlmKHJld3JpdGVNb2RlKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4udHJlZSA9IHNlbGYuX2FkYXB0b3IucnVsZVBvc3RQcm9jZXNzaW5nKHJvb3RfMCkKK3NlbGYuaW5wdXQucmVwbGFjZUNoaWxkcmVuKAorICAgIHNlbGYuX2FkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC5zdGFydCksCisgICAgc2VsZi5fYWRhcHRvci5nZXRDaGlsZEluZGV4KHJldHZhbC5zdGFydCksCisgICAgc2VsZi5fYWRhcHRvci5nZXRDaGlsZEluZGV4KF9sYXN0KSwKKyAgICByZXR2YWwudHJlZQorICAgICk8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+CisKKzwhIGlmIHBhcnNlciBvciB0cmVlLXBhcnNlciBhbmQgcmV3cml0ZSE9dHJ1ZSwgd2UgbmVlZCB0byBzZXQgcmVzdWx0ICE+Cis8aWYoIVRSRUVfUEFSU0VSKT4KKzxwcmV2UnVsZVJvb3RSZWYoKT4udHJlZSA9IHJvb3RfMDxcbj4KKzxlbHNlPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8cHJldlJ1bGVSb290UmVmKCk+LnRyZWUgPSByb290XzA8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cit9KT4KKz4+CisKK3Jld3JpdGVDb2RlTGFiZWxzKCkgOjo9IDw8Cis8cmVmZXJlbmNlZFRva2VuTGFiZWxzCisgICAgOntpdCB8IHN0cmVhbV88aXQ+ID0gUmV3cml0ZVJ1bGU8cmV3cml0ZUVsZW1lbnRUeXBlPlN0cmVhbShzZWxmLl9hZGFwdG9yLCAidG9rZW4gPGl0PiIsIDxpdD4pfTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHMKKyAgICA6e2l0IHwgc3RyZWFtXzxpdD4gPSBSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtKHNlbGYuX2FkYXB0b3IsICJ0b2tlbiA8aXQ+IiwgbGlzdF88aXQ+KX07CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHMKKyAgICA6e2l0IHwgc3RyZWFtXzxpdD4gPSBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oc2VsZi5fYWRhcHRvciwgIndpbGRjYXJkIDxpdD4iLCA8aXQ+KX07CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkV2lsZGNhcmRMaXN0TGFiZWxzCisgICAgOntpdCB8IHN0cmVhbV88aXQ+ID0gUmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtKHNlbGYuX2FkYXB0b3IsICJ3aWxkY2FyZCA8aXQ+IiwgbGlzdF88aXQ+KX07CisgICAgc2VwYXJhdG9yPSJcbiIKKz4KKzxyZWZlcmVuY2VkUnVsZUxhYmVscworICAgIDp7aXQgfAoraWYgPGl0PiBpcyBub3QgTm9uZToKKyAgICBzdHJlYW1fPGl0PiA9IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShzZWxmLl9hZGFwdG9yLCAicnVsZSA8aXQ+IiwgPGl0Pi50cmVlKQorZWxzZToKKyAgICBzdHJlYW1fPGl0PiA9IFJld3JpdGVSdWxlU3VidHJlZVN0cmVhbShzZWxmLl9hZGFwdG9yLCAidG9rZW4gPGl0PiIsIE5vbmUpCit9OworICAgIHNlcGFyYXRvcj0iXG4iCis+Cis8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzCisgICAgOntpdHwgc3RyZWFtXzxpdD4gPSBSZXdyaXRlUnVsZVN1YnRyZWVTdHJlYW0oc2VsZi5fYWRhcHRvciwgInRva2VuIDxpdD4iLCBsaXN0XzxpdD4pfTsKKyAgICBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworLyoqIEdlbmVyYXRlIGNvZGUgZm9yIGFuIG9wdGlvbmFsIHJld3JpdGUgYmxvY2s7IG5vdGUgaXQgdXNlcyB0aGUgZGVlcCByZWYnZCBlbGVtZW50CisgICogIGxpc3QgcmF0aGVyIHNoYWxsb3cgbGlrZSBvdGhlciBibG9ja3MuCisgICovCityZXdyaXRlT3B0aW9uYWxCbG9jaygKKyAgICAgICAgYWx0LHJld3JpdGVCbG9ja0xldmVsLAorICAgICAgICByZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBhbGwgbmVzdGVkIHJlZnMKKyAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnRzLCAvLyBlbGVtZW50cyBpbiBpbW1lZGlhdGVseSBibG9jazsgbm8gbmVzdGVkIGJsb2NrcworICAgICAgICBkZXNjcmlwdGlvbikgOjo9Cis8PAorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK2lmIDxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+Lmhhc05leHQoKX07IHNlcGFyYXRvcj0iIG9yICI+OgorICAgIDxhbHQ+CisKKzxyZWZlcmVuY2VkRWxlbWVudHNEZWVwOntlbCB8IHN0cmVhbV88ZWw+LnJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlQ2xvc3VyZUJsb2NrKAorICAgICAgICBhbHQscmV3cml0ZUJsb2NrTGV2ZWwsCisgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50c0RlZXAsIC8vIGFsbCBuZXN0ZWQgcmVmcworICAgICAgICByZWZlcmVuY2VkRWxlbWVudHMsIC8vIGVsZW1lbnRzIGluIGltbWVkaWF0ZWx5IGJsb2NrOyBubyBuZXN0ZWQgYmxvY2tzCisgICAgICAgIGRlc2NyaXB0aW9uKSA6Oj0KKzw8CisjIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgord2hpbGUgPHJlZmVyZW5jZWRFbGVtZW50czp7ZWwgfCBzdHJlYW1fPGVsPi5oYXNOZXh0KCl9OyBzZXBhcmF0b3I9IiBvciAiPjoKKyAgICA8YWx0PgorCis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+LnJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisgICAgICAgIGFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKyAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKyAgICAgICAgZGVzY3JpcHRpb24pIDo6PQorPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitpZiBub3QgKDxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4uaGFzTmV4dCgpfTsgc2VwYXJhdG9yPSIgb3IgIj4pOgorICAgIHJhaXNlIFJld3JpdGVFYXJseUV4aXRFeGNlcHRpb24oKQorCit3aGlsZSA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbCB8IHN0cmVhbV88ZWw+Lmhhc05leHQoKX07IHNlcGFyYXRvcj0iIG9yICI+OgorICAgIDxhbHQ+CisKKzxyZWZlcmVuY2VkRWxlbWVudHM6e2VsIHwgc3RyZWFtXzxlbD4ucmVzZXQoKTxcbj59PgorPj4KKworcmV3cml0ZUFsdFJlc3QoYSkgOjo9IDw8Cis8aWYoYS5wcmVkKT5pZiA8YS5wcmVkPjoKKyAgICAjIDxhLmRlc2NyaXB0aW9uPgorICAgIDxhLmFsdD4KKzxlbHNlPnNlOiA8ISBsaXR0bGUgaGFjayB0byBnZXQgaWYgLi4gZWxpZiAuLiBlbHNlIGJsb2NrIHJpZ2h0ICE+CisgICAgIyA8YS5kZXNjcmlwdGlvbj4KKyAgICA8YS5hbHQ+Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlQWx0Rmlyc3QoYSkgOjo9IDw8Cis8aWYoYS5wcmVkKT4KK2lmIDxhLnByZWQ+OgorICAgICMgPGEuZGVzY3JpcHRpb24+CisgICAgPGEuYWx0PgorPGVsc2U+CisjIDxhLmRlc2NyaXB0aW9uPgorPGEuYWx0PgorPGVuZGlmPgorPj4KKworLyoqIEZvciBlbXB0eSByZXdyaXRlczogInIgOiAuLi4gLT4gOyIgKi8KK3Jld3JpdGVFbXB0eUFsdCgpIDo6PSAicm9vdF8wID0gTm9uZSIKKworcmV3cml0ZVRyZWUocm9vdCxjaGlsZHJlbixkZXNjcmlwdGlvbixlbmNsb3NpbmdUcmVlTGV2ZWwsdHJlZUxldmVsKSA6Oj0gPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cityb290Xzx0cmVlTGV2ZWw+ID0gc2VsZi5fYWRhcHRvci5uaWwoKQorPHJvb3Q6cmV3cml0ZUVsZW1lbnQoKT4KKzxjaGlsZHJlbjpyZXdyaXRlRWxlbWVudCgpPgorc2VsZi5fYWRhcHRvci5hZGRDaGlsZChyb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+KTxcbj4KKz4+CisKK3Jld3JpdGVFbGVtZW50TGlzdChlbGVtZW50cykgOjo9ICI8ZWxlbWVudHM6cmV3cml0ZUVsZW1lbnQoKT4iCisKK3Jld3JpdGVFbGVtZW50KGUpIDo6PSA8PAorPEBwcmVnZW4+PEBlbmQ+Cis8ZS5lbD4KKz4+CisKKy8qKiBHZW4gSUQgb3IgSURbYXJnc10gKi8KK3Jld3JpdGVUb2tlblJlZih0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorc2VsZi5fYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPik8XG4+Cis+PgorCisvKiogR2VuICRsYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgbGFiZWw9SUQgKi8KK3Jld3JpdGVUb2tlbkxhYmVsUmVmKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CitzZWxmLl9hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHROb2RlKCkpPFxuPgorPj4KKworLyoqIEdlbiAkbGFiZWwgLi4uIHdoZXJlIGRlZmluZWQgdmlhIGxhYmVsKz1JRCAqLworcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmKGxhYmVsLGVsZW1lbnRJbmRleCkgOjo9IDw8CitzZWxmLl9hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHROb2RlKCkpPFxuPgorPj4KKworLyoqIEdlbiBeKCRsYWJlbCAuLi4pICovCityZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSBzZWxmLl9hZGFwdG9yLmJlY29tZVJvb3Qoc3RyZWFtXzxsYWJlbD4ubmV4dE5vZGUoKSwgcm9vdF88dHJlZUxldmVsPik8XG4+Cis+PgorCisvKiogR2VuIF4oJGxhYmVsIC4uLikgd2hlcmUgbGFiZWwrPS4uLiAqLworcmV3cml0ZVRva2VuTGlzdExhYmVsUmVmUm9vdCA6Oj0gcmV3cml0ZVRva2VuTGFiZWxSZWZSb290CisKKy8qKiBHZW4gXihJRCAuLi4pIG9yIF4oSURbYXJnc10gLi4uKSAqLworcmV3cml0ZVRva2VuUmVmUm9vdCh0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdCg8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPiwgcm9vdF88dHJlZUxldmVsPik8XG4+Cis+PgorCityZXdyaXRlSW1hZ2luYXJ5VG9rZW5SZWYoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW4sIHRlcm1pbmFsT3B0aW9ucywgYXJncyk+KTxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSBzZWxmLl9hZGFwdG9yLmJlY29tZVJvb3QoPGNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW4sIHRlcm1pbmFsT3B0aW9ucywgYXJncyk+LCByb290Xzx0cmVlTGV2ZWw+KTxcbj4KKz4+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzwhRklYTUUoOTYsdW50ZXN0ZWQpIT4KK3Jvb3RfMCA9IDxhY3Rpb24+PFxuPgorPj4KKworLyoqIFdoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoaXMgcnVsZSdzIHJvb3QgdHJlZT8gIFRoaXMKKyAqICBsZXQncyB1cyByZWZlciB0byAkcnVsZSB0byBtZWFuIHByZXZpb3VzIHZhbHVlLiAgSSBhbSByZXVzaW5nIHRoZQorICogIHZhcmlhYmxlICd0cmVlJyBzaXR0aW5nIGluIHJldHZhbCBzdHJ1Y3QgdG8gaG9sZCB0aGUgdmFsdWUgb2Ygcm9vdF8wIHJpZ2h0CisgKiAgYmVmb3JlIEkgc2V0IGl0IGR1cmluZyByZXdyaXRlcy4gIFRoZSBhc3NpZ24gd2lsbCBiZSB0byByZXR2YWwudHJlZS4KKyAqLworcHJldlJ1bGVSb290UmVmKCkgOjo9ICJyZXR2YWwiCisKK3Jld3JpdGVSdWxlUmVmKHJ1bGUpIDo6PSA8PAorc2VsZi5fYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPHJ1bGU+Lm5leHRUcmVlKCkpPFxuPgorPj4KKworcmV3cml0ZVJ1bGVSZWZSb290KHJ1bGUpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fPHJ1bGU+Lm5leHROb2RlKCksIHJvb3RfPHRyZWVMZXZlbD4pPFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGFjdGlvbj4pPFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb25Sb290KGFjdGlvbikgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gc2VsZi5fYWRhcHRvci5iZWNvbWVSb290KDxhY3Rpb24+LCByb290Xzx0cmVlTGV2ZWw+KTxcbj4KKz4+CisKKy8qKiBHZW4gJHJ1bGVMYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgcnVsZUxhYmVsPXJ1bGUgKi8KK3Jld3JpdGVSdWxlTGFiZWxSZWYobGFiZWwpIDo6PSA8PAorc2VsZi5fYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0VHJlZSgpKTxcbj4KKz4+CisKKy8qKiBHZW4gJHJ1bGVMYWJlbCAuLi4gd2hlcmUgZGVmaW5lZCB2aWEgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZihsYWJlbCkgOjo9IDw8CitzZWxmLl9hZGFwdG9yLmFkZENoaWxkKHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHRUcmVlKCkpPFxuPgorPj4KKworLyoqIEdlbiBeKCRydWxlTGFiZWwgLi4uKSB3aGVyZSBydWxlTGFiZWw9cnVsZSAqLworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTxcbj4KKz4+CisKKy8qKiBHZW4gXigkcnVsZUxhYmVsIC4uLikgd2hlcmUgcnVsZUxhYmVsKz1ydWxlICovCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdChzdHJlYW1fPGxhYmVsPi5uZXh0Tm9kZSgpLCByb290Xzx0cmVlTGV2ZWw+KTxcbj4KKz4+CisKK3Jld3JpdGVXaWxkY2FyZExhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dFRyZWUoKSk8XG4+Cis+PgorCitjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZSx0ZXJtaW5hbE9wdGlvbnMsYXJncykgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPCEgbmV3IE1ldGhvZE5vZGUoSURMYWJlbCwgYXJncykgIT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPHRva2VuVHlwZT48aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorPGlmICghYXJncyk+c2VsZi5fYWRhcHRvci5jcmVhdGVGcm9tVHlwZSg8dG9rZW5UeXBlPiwgIjx0b2tlblR5cGU+IikKKzxlbHNlPnNlbGYuX2FkYXB0b3IuY3JlYXRlKDx0b2tlblR5cGU+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+KQorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLy88ISBuZWVkIHRvIGNhbGwgZGlmZmVyZW50IGFkYXB0b3IuY3JlYXRlKigpIG1ldGhvZHMgZGVwZW5kaW5nIG9mIGFyZ3VtZW50IGNvdW50ICE+CisvLzxpZiAoIWFyZ3MpPnNlbGYuX2FkYXB0b3IuY3JlYXRlRnJvbVR5cGUoPHRva2VuVHlwZT4sICI8dG9rZW5UeXBlPiIpCisvLzxlbHNlPjxpZiAoIXJlc3QoYXJncykpPnNlbGYuX2FkYXB0b3IuY3JlYXRlRnJvbVR5cGUoPHRva2VuVHlwZT4sIDxmaXJzdChhcmdzKT4pCisvLzxlbHNlPjxpZiAoIXJlc3QocmVzdChhcmdzKSkpPnNlbGYuX2FkYXB0b3IuY3JlYXRlRnJvbVRva2VuKDx0b2tlblR5cGU+LCA8Zmlyc3QoYXJncyk+LCA8Zmlyc3QocmVzdChhcmdzKSk+KQorLy88ZW5kaWY+CisvLzxlbmRpZj4KKy8vPGVuZGlmPgorCisKK2NyZWF0ZVJld3JpdGVOb2RlRnJvbUVsZW1lbnQodG9rZW4sdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oc3RyZWFtXzx0b2tlbj4ubmV4dFRva2VuKCk8aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPikKKzxlbHNlPgorPGlmKGFyZ3MpPiA8ISBtdXN0IGNyZWF0ZSBuZXcgbm9kZSBmcm9tIG9sZCAhPgorPCEgbmVlZCB0byBjYWxsIGRpZmZlcmVudCBhZGFwdG9yLmNyZWF0ZSooKSBtZXRob2RzIGRlcGVuZGluZyBvZiBhcmd1bWVudCBjb3VudCAhPgorPGlmICghYXJncyk+c2VsZi5fYWRhcHRvci5jcmVhdGVGcm9tVHlwZSg8dG9rZW4+LCAiPHRva2VuPiIpCis8ZWxzZT48aWYgKCFyZXN0KGFyZ3MpKT5zZWxmLl9hZGFwdG9yLmNyZWF0ZUZyb21Ub2tlbig8dG9rZW4+LCA8Zmlyc3QoYXJncyk+KQorPGVsc2U+PGlmICghcmVzdChyZXN0KGFyZ3MpKSk+c2VsZi5fYWRhcHRvci5jcmVhdGVGcm9tVG9rZW4oPHRva2VuPiwgPGZpcnN0KGFyZ3MpPiwgPGZpcnN0KHJlc3QoYXJncykpPikKKzxlbmRpZj4KKzxlbmRpZj4KKzxlbmRpZj4KKzxlbHNlPgorc3RyZWFtXzx0b2tlbj4ubmV4dE5vZGUoKQorPGVuZGlmPgorPGVuZGlmPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUHl0aG9uL0FTVERiZy5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1REYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzc5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1REYmcuc3RnCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gQVNUIHN0dWZmLiAgRHluYW1pYyBpbmhlcml0YW5jZQorICogIGhpZXJhcmNoeSBpcyBzZXQgdXAgYXMgQVNURGJnIDogQVNUIDogRGJnIDogUHl0aG9uIGJ5IGNvZGUgZ2VuZXJhdG9yLgorICovCitncm91cCBBU1REYmc7CisKK2FzdEFjY2Vzc29yKCkgOjo9IDw8CitkZWYgc2V0VHJlZUFkYXB0b3Ioc2VsZiwgYWRhcHRvcik6Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgICBzZWxmLl9hZGFwdG9yID0gRGVidWdUcmVlQWRhcHRvcihzZWxmLmRiZywgYWRhcHRvcikKKzxlbHNlPgorICAgIHNlbGYuX2FkYXB0b3IgPSBhZGFwdG9yICMgZGVsZWdhdG9yIHNlbmRzIGRiZyBhZGFwdG9yCis8ZW5kaWY+CisgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPi5zZXRUcmVlQWRhcHRvcihzZWxmLl9hZGFwdG9yKX0+CisKK2RlZiBnZXRUcmVlQWRhcHRvcihzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fYWRhcHRvcgorCithZGFwdG9yID0gcHJvcGVydHkoZ2V0VHJlZUFkYXB0b3IsIHNldFRyZWVBZGFwdG9yKTxcbj4KKz4+CisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8Citwcm94eSA9IERlYnVnRXZlbnRTb2NrZXRQcm94eShzZWxmLCBhZGFwdG9yPTxpZihUUkVFX1BBUlNFUik+c2VsZi5pbnB1dC5nZXRUcmVlQWRhcHRvcigpPGVsc2U+c2VsZi5fYWRhcHRvcjxlbmRpZj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1kZWJ1Z19zb2NrZXQsIHBvcnQ9cG9ydCkKK3NlbGYuc2V0RGVidWdMaXN0ZW5lcihwcm94eSkKK3NlbGYuYWRhcHRvci5zZXREZWJ1Z0xpc3RlbmVyKHByb3h5KQorc2VsZi5pbnB1dC5zZXREZWJ1Z0xpc3RlbmVyKHByb3h5KQorI3NlbGYuc2V0PGlucHV0U3RyZWFtVHlwZT4oRGVidWc8aW5wdXRTdHJlYW1UeXBlPihzZWxmLmlucHV0LCBwcm94eSkpCitwcm94eS5oYW5kc2hha2UoKQorPj4KKworQHJld3JpdGVFbGVtZW50LnByZWdlbigpIDo6PSAic2VsZi5fZGJnLmxvY2F0aW9uKDxlLmxpbmU+LCA8ZS5wb3M+KSIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUHl0aG9uL0FTVFBhcnNlci5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmZhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1RQYXJzZXIuc3RnCkBAIC0wLDAgKzEsMTk3IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiBUZXJlbmNlIFBhcnIKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyoqIFRlbXBsYXRlcyBmb3IgYnVpbGRpbmcgQVNUcyBkdXJpbmcgbm9ybWFsIHBhcnNpbmcuCisgKgorICogIERlYWwgd2l0aCBtYW55IGNvbWJpbmF0aW9ucy4gIERpbWVuc2lvbnMgYXJlOgorICogIEF1dG8gYnVpbGQgb3IgcmV3cml0ZQorICogICAgbm8gbGFiZWwsIGxhYmVsLCBsaXN0IGxhYmVsICAobGFiZWwvbm8tbGFiZWwgaGFuZGxlZCB0b2dldGhlcikKKyAqICAgIGNoaWxkLCByb290CisgKiAgICB0b2tlbiwgc2V0LCBydWxlLCB3aWxkY2FyZAorICoKKyAqICBUaGUgc2l0dWF0aW9uIGlzIG5vdCB0b28gYmFkIGFzIHJld3JpdGUgKC0+KSB1c2FnZSBtYWtlcyBeIGFuZCAhCisgKiAgaW52YWxpZC4gVGhlcmUgaXMgbm8gaHVnZSBleHBsb3Npb24gb2YgY29tYmluYXRpb25zLgorICovCisKK2ZpbmlzaGVkQmFja3RyYWNraW5nKGJsb2NrKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT46CisgICAgPGJsb2NrPgorPGVsc2U+Cis8YmxvY2s+Cis8ZW5kaWY+Cis+PgorCitAcnVsZUJvZHkuc2V0RXJyb3JSZXR1cm5WYWx1ZSgpIDo6PSA8PAorcmV0dmFsLnRyZWUgPSBzZWxmLl9hZGFwdG9yLmVycm9yTm9kZShzZWxmLmlucHV0LCByZXR2YWwuc3RhcnQsIHNlbGYuaW5wdXQuTFQoLTEpLCByZSkKKz4+CisKKy8vIFRPS0VOIEFTVCBTVFVGRgorCisvKiogSUQgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHN1cGVyLnRva2VuUmVmKC4uLik+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoeworPGxhYmVsPl90cmVlID0gPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4KK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8bGFiZWw+X3RyZWUpCit9KT4KKz4+CisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICovCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9ICI8c3VwZXIudG9rZW5SZWYoLi4uKT4iCisKKy8qKiBJRF4gYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7Cis8bGFiZWw+X3RyZWUgPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPgorcm9vdF8wID0gc2VsZi5fYWRhcHRvci5iZWNvbWVSb290KDxsYWJlbD5fdHJlZSwgcm9vdF8wKQorfSk+Cis+PgorCisvKiogaWRzKz1JRCEgYW5kIG91dHB1dD1BU1QgKi8KK3Rva2VuUmVmQmFuZ0FuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIGxhYmVsKz1UT0tFTiB3aGVuIG91dHB1dD1BU1QgYnV0IG5vdCByZXdyaXRlIGFsdCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIGxhYmVsKz1UT0tFTl4gd2hlbiBvdXRwdXQ9QVNUIGJ1dCBub3QgcmV3cml0ZSBhbHQgKi8KK3Rva2VuUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvLyBTRVQgQVNUCisKKy8vIHRoZSBtYXRjaCBzZXQgc3R1ZmYgaXMgaW50ZXJlc3RpbmcgaW4gdGhhdCBpdCB1c2VzIGFuIGFyZ3VtZW50IGxpc3QKKy8vIHRvIHBhc3MgY29kZSB0byB0aGUgZGVmYXVsdCBtYXRjaFNldDsgYW5vdGhlciBwb3NzaWJsZSB3YXkgdG8gYWx0ZXIKKy8vIGluaGVyaXRlZCBjb2RlLiAgSSBkb24ndCB1c2UgdGhlIHJlZ2lvbiBzdHVmZiBiZWNhdXNlIEkgbmVlZCB0byBwYXNzCisvLyBkaWZmZXJlbnQgY2h1bmtzIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0b3IuICBJIGRvbid0IGxpa2UgbWFraW5nCisvLyB0aGUgdGVtcGxhdGUgbmFtZSBoYXZlIHRoZSBvcGVyYXRvciBhcyB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlcyBnZXRzCisvLyBsYXJnZSBidXQgdGhpcyBpcyB0aGUgbW9zdCBmbGV4aWJsZS0tdGhpcyBpcyBhcyBvcHBvc2VkIHRvIGhhdmluZworLy8gdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbGwgbWF0Y2hTZXQgdGhlbiBhZGQgcm9vdCBjb2RlIG9yIHJ1bGVyb290IGNvZGUKKy8vIHBsdXMgbGlzdCBsYWJlbCBwbHVzIC4uLiAgVGhlIGNvbWJpbmF0aW9ucyBtaWdodCByZXF1aXJlIGNvbXBsaWNhdGVkCisvLyByYXRoZXIgdGhhbiBqdXN0IGFkZGVkIG9uIGNvZGUuICBJbnZlc3RpZ2F0ZSB0aGF0IHJlZmFjdG9yaW5nIHdoZW4KKy8vIEkgaGF2ZSBtb3JlIHRpbWUuCisKK21hdGNoU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPCUKKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXs8ZmluaXNoZWRCYWNrdHJhY2tpbmcoe3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPil9KT59LCAuLi4pPgorJT4KKworbWF0Y2hSdWxlQmxvY2tTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUsdHJlZUxldmVsPSIwIikgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKz4+CisKK21hdGNoU2V0QmFuZyhzLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMscG9zdG1hdGNoQ29kZSkgOjo9ICI8c3VwZXIubWF0Y2hTZXQoLi4uKT4iCisKKy8vIG5vdGUgdGhlcmUgaXMgbm8gbWF0Y2hTZXRUcmFjayBiZWNhdXNlIC0+IHJld3JpdGVzIGZvcmNlIHNldHMgdG8gYmUKKy8vIHBsYWluIG9sZCBibG9ja3Mgb2YgYWx0czogKEF8QnwuLi58QykKKworbWF0Y2hTZXRSdWxlUm9vdChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgsZGVidWcpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBzZWxmLmlucHV0LkxUKDEpPFxuPgorPGVuZGlmPgorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9ezxmaW5pc2hlZEJhY2t0cmFja2luZyh7cm9vdF8wID0gc2VsZi5fYWRhcHRvci5iZWNvbWVSb290KDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+LCByb290XzApfSk+fSwgLi4uKT4KKz4+CisKKy8vIFJVTEUgUkVGIEFTVAorCisvKiogcnVsZSB3aGVuIG91dHB1dD1BU1QgKi8KK3J1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8c3VwZXIucnVsZVJlZiguLi4pPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHtzZWxmLl9hZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPi50cmVlKX0pPgorPj4KKworLyoqIHJ1bGUhIGlzIHNhbWUgYXMgbm9ybWFsIHJ1bGUgcmVmICovCitydWxlUmVmQmFuZyhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gIjxzdXBlci5ydWxlUmVmKC4uLik+IgorCisvKiogcnVsZV4gKi8KK3J1bGVSZWZSdWxlUm9vdChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoe3Jvb3RfMCA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+LnRyZWUsIHJvb3RfMCl9KT4KKz4+CisKKy8qKiB4Kz1ydWxlIHdoZW4gb3V0cHV0PUFTVCAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCB7PGxhYmVsPi50cmVlfSk+Cis+PgorCisvKiogeCs9cnVsZSEgd2hlbiBvdXRwdXQ9QVNUIGlzIGEgcnVsZSByZWYgd2l0aCBsaXN0IGFkZGl0aW9uICovCitydWxlUmVmQmFuZ0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmQmFuZyguLi4pPgorPGxpc3RMYWJlbChsYWJlbCwgezxsYWJlbD4udHJlZX0pPgorPj4KKworLyoqIHgrPXJ1bGVeICovCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCB7PGxhYmVsPi50cmVlfSk+Cis+PgorCisvLyBXSUxEQ0FSRCBBU1QKKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIud2lsZGNhcmQoLi4uKT4KKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7Cis8bGFiZWw+X3RyZWUgPSBzZWxmLl9hZGFwdG9yLmNyZWF0ZVdpdGhQYXlsb2FkKDxsYWJlbD4pCitzZWxmLl9hZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgPGxhYmVsPl90cmVlKQorfSk+Cis+PgorCit3aWxkY2FyZEJhbmcobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gIjxzdXBlci53aWxkY2FyZCguLi4pPiIKKword2lsZGNhcmRSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHsKKzxsYWJlbD5fdHJlZSA9IHNlbGYuX2FkYXB0b3IuY3JlYXRlV2l0aFBheWxvYWQoPGxhYmVsPikKK3Jvb3RfMCA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+X3RyZWUsIHJvb3RfMCkKK30pPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8JQorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPikgPCEgbmV3IE1ldGhvZE5vZGUoSURMYWJlbCkgIT4KKzxlbHNlPgorc2VsZi5fYWRhcHRvci5jcmVhdGVXaXRoUGF5bG9hZCg8bGFiZWw+KQorPGVuZGlmPgorJT4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHsKK3JldHZhbC50cmVlID0gc2VsZi5fYWRhcHRvci5ydWxlUG9zdFByb2Nlc3Npbmcocm9vdF8wKQorc2VsZi5fYWRhcHRvci5zZXRUb2tlbkJvdW5kYXJpZXMocmV0dmFsLnRyZWUsIHJldHZhbC5zdGFydCwgcmV0dmFsLnN0b3ApCit9KT4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1RUcmVlUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUHl0aG9uL0FTVFRyZWVQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOGE1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9BU1RUcmVlUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qKiBUZW1wbGF0ZXMgZm9yIGJ1aWxkaW5nIEFTVHMgZHVyaW5nIHRyZWUgcGFyc2luZy4KKyAqCisgKiAgRGVhbCB3aXRoIG1hbnkgY29tYmluYXRpb25zLiAgRGltZW5zaW9ucyBhcmU6CisgKiAgQXV0byBidWlsZCBvciByZXdyaXRlCisgKiAgICBubyBsYWJlbCwgbGFiZWwsIGxpc3QgbGFiZWwgIChsYWJlbC9uby1sYWJlbCBoYW5kbGVkIHRvZ2V0aGVyKQorICogICAgY2hpbGQsIHJvb3QKKyAqICAgIHRva2VuLCBzZXQsIHJ1bGUsIHdpbGRjYXJkCisgKgorICogIEVhY2ggY29tYmluYXRpb24gaGFzIGl0cyBvd24gdGVtcGxhdGUgZXhjZXB0IHRoYXQgbGFiZWwvbm8gbGFiZWwKKyAqICBpcyBjb21iaW5lZCBpbnRvIHRva2VuUmVmLCBydWxlUmVmLCAuLi4KKyAqLworCitmaW5pc2hlZEJhY2t0cmFja2luZyhibG9jaykgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+OgorICAgIDxibG9jaz4KKzxlbHNlPgorPGJsb2NrPgorPGVuZGlmPgorPj4KKworLyoqIEFkZCBhIHZhcmlhYmxlIHRvIHRyYWNrIGxhc3QgZWxlbWVudCBtYXRjaGVkICovCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZURlY2xhcmF0aW9ucygpPgorX2ZpcnN0XzAgPSBOb25lCitfbGFzdCA9IE5vbmU8XG4+Cis+PgorCisvKiogV2hhdCB0byBlbWl0IHdoZW4gdGhlcmUgaXMgbm8gcmV3cml0ZSBydWxlLiAgRm9yIGF1dG8gYnVpbGQKKyAqICBtb2RlLCBkb2VzIG5vdGhpbmcuCisgKi8KK25vUmV3cml0ZShyZXdyaXRlQmxvY2tMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7Cis8aWYocmV3cml0ZU1vZGUpPgorcmV0dmFsLnRyZWUgPSBfZmlyc3RfMAoraWYgc2VsZi5fYWRhcHRvci5nZXRQYXJlbnQocmV0dmFsLnRyZWUpIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9hZGFwdG9yLmlzTmlsKHNlbGYuX2FkYXB0b3IuZ2V0UGFyZW50KHJldHZhbC50cmVlKSk6CisgICAgcmV0dmFsLnRyZWUgPSBzZWxmLl9hZGFwdG9yLmdldFBhcmVudChyZXR2YWwudHJlZSkKKzxlbmRpZj4KK30pPgorPj4KKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXI7IG92ZXJyaWRlIGhlcmUgdG8KKyAqICBhZGQgdHJlZSBjb25zdHJ1Y3Rpb24gYWN0aW9ucy4KKyAqLwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsCisgICAgIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKK19sYXN0ID0gc2VsZi5pbnB1dC5MVCgxKQorX3NhdmVfbGFzdF88dHJlZUxldmVsPiA9IF9sYXN0CitfZmlyc3RfPHRyZWVMZXZlbD4gPSBOb25lCis8aWYoIXJld3JpdGVNb2RlKT4KK3Jvb3RfPHRyZWVMZXZlbD4gPSBzZWxmLl9hZGFwdG9yLm5pbCgpPFxuPgorPGVuZGlmPgorPHJvb3Q6ZWxlbWVudCgpPgorPGlmKHJld3JpdGVNb2RlKT4KKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7Cis8aWYocm9vdC5lbC5ydWxlKT4KK2lmIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiBpcyBOb25lOgorICAgIF9maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiA9IDxyb290LmVsLmxhYmVsPi50cmVlPFxuPgorPGVsc2U+CitpZiBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gaXMgTm9uZToKKyAgICBfZmlyc3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4gPSA8cm9vdC5lbC5sYWJlbD48XG4+Cis8ZW5kaWY+Cit9KT4KKzxlbmRpZj4KKzxhY3Rpb25zQWZ0ZXJSb290OmVsZW1lbnQoKT4KKzxpZihudWxsYWJsZUNoaWxkTGlzdCk+CitpZiBzZWxmLmlucHV0LkxBKDEpID09IERPV046CisgICAgc2VsZi5tYXRjaChzZWxmLmlucHV0LCBET1dOLCBOb25lKQorICAgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgICAgc2VsZi5tYXRjaChzZWxmLmlucHV0LCBVUCwgTm9uZSkKKworPGVsc2U+CitzZWxmLm1hdGNoKHNlbGYuaW5wdXQsIERPV04sIE5vbmUpCis8Y2hpbGRyZW46ZWxlbWVudCgpPgorc2VsZi5tYXRjaChzZWxmLmlucHV0LCBVUCwgTm9uZSk8XG4+Cis8ZW5kaWY+Cis8aWYoIXJld3JpdGVNb2RlKT4KK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88ZW5jbG9zaW5nVHJlZUxldmVsPiwgcm9vdF88dHJlZUxldmVsPik8XG4+Cis8ZW5kaWY+CitfbGFzdCA9IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD4KKworPj4KKworLy8gVE9LRU4gQVNUIFNUVUZGCisKKy8qKiBJRCEgYW5kIG91dHB1dD1BU1QgKHNhbWUgYXMgcGxhaW4gdG9rZW5SZWYpICdjZXB0IGFkZAorICogIHNldHRpbmcgb2YgX2xhc3QKKyAqLwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSBzZWxmLmlucHV0LkxUKDEpCis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKz4+CisKKy8qKiBJRCBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8CitfbGFzdCA9IHNlbGYuaW5wdXQuTFQoMSkKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoeworPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzxsYWJlbD5fdHJlZSA9IDx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oPGxhYmVsPikKKzxlbHNlPgorPGxhYmVsPl90cmVlID0gc2VsZi5fYWRhcHRvci5kdXBOb2RlKDxsYWJlbD4pCis8ZW5kaWY+PFxuPgorc2VsZi5fYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+X3RyZWUpCit9KT4KKzxlbHNlPiA8ISByZXdyaXRlIG1vZGUgIT4KKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7CitpZiBfZmlyc3RfPHRyZWVMZXZlbD4gaXMgTm9uZToKKyAgICBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+PFxuPgorfSk+Cis8ZW5kaWY+Cis+PgorCisvKiogbGFiZWwrPVRPS0VOIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZkFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogXihJRCAuLi4pIGF1dG8gY29uc3RydWN0ICovCit0b2tlblJlZlJ1bGVSb290KHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSBzZWxmLmlucHV0LkxUKDEpCis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHsKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pCis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IHNlbGYuX2FkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KQorPGVuZGlmPjxcbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSBzZWxmLl9hZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KQorfSk+Cis8ZW5kaWY+Cis+PgorCisvKiogTWF0Y2ggXihsYWJlbCs9VE9LRU4gLi4uKSBhdXRvIGNvbnN0cnVjdCAqLwordG9rZW5SZWZSdWxlUm9vdEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZlJ1bGVSb290KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGFuZCBhdXRvIGR1cCB0aGUgbm9kZS9zdWJ0cmVlICovCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gc2VsZi5pbnB1dC5MVCgxKQorPHN1cGVyLndpbGRjYXJkKC4uLik+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxmaW5pc2hlZEJhY2t0cmFja2luZyh7Cis8bGFiZWw+X3RyZWUgPSBzZWxmLl9hZGFwdG9yLmR1cFRyZWUoPGxhYmVsPikKK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPl90cmVlKQorfSk+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoeworaWYgX2ZpcnN0Xzx0cmVlTGV2ZWw+IGlzIE5vbmU6CisgICAgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsPgorfSk+Cis8ZW5kaWY+Cis+PgorCisvLyBTRVQgQVNUCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8CitfbGFzdCA9IHNlbGYuaW5wdXQuTFQoMSkKKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXsKKzxpZighcmV3cml0ZU1vZGUpPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHsKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pCis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IHNlbGYuX2FkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KQorPGVuZGlmPjxcbj4KK3NlbGYuX2FkYXB0b3IuYWRkQ2hpbGQocm9vdF88dHJlZUxldmVsPiwgPGxhYmVsPl90cmVlKQorfSk+Cis8ZW5kaWY+Cit9LCAuLi4pPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUsdHJlZUxldmVsPSIwIikgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxub1Jld3JpdGUoLi4uKT4gPCEgc2V0IHJldHVybiB0cmVlICE+Cis+PgorCittYXRjaFNldEJhbmcocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSBzZWxmLmlucHV0LkxUKDEpCis8c3VwZXIubWF0Y2hTZXQoLi4uKT4KKz4+CisKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxzdXBlci5tYXRjaFNldChwb3N0bWF0Y2hDb2RlPXsKKzxpZighcmV3cml0ZU1vZGUpPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHsKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8bGFiZWw+X3RyZWUgPSA8dGVybWluYWxPcHRpb25zLm5vZGU+KDxsYWJlbD4pCis8ZWxzZT4KKzxsYWJlbD5fdHJlZSA9IHNlbGYuX2FkYXB0b3IuZHVwTm9kZSg8bGFiZWw+KQorPGVuZGlmPjxcbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSBzZWxmLl9hZGFwdG9yLmJlY29tZVJvb3QoPGxhYmVsPl90cmVlLCByb290Xzx0cmVlTGV2ZWw+KQorfSk+Cis8ZW5kaWY+Cit9LCAuLi4pPgorPj4KKworLy8gUlVMRSBSRUYgQVNUCisKKy8qKiBydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSBzZWxmLmlucHV0LkxUKDEpCis8c3VwZXIucnVsZVJlZiguLi4pPgorPGZpbmlzaGVkQmFja3RyYWNraW5nKHsKKzxpZighcmV3cml0ZU1vZGUpPgorc2VsZi5fYWRhcHRvci5hZGRDaGlsZChyb290Xzx0cmVlTGV2ZWw+LCA8bGFiZWw+LnRyZWUpCis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+CitpZiBfZmlyc3RfPHRyZWVMZXZlbD4gaXMgTm9uZToKKyAgICBfZmlyc3RfPHRyZWVMZXZlbD4gPSA8bGFiZWw+LnRyZWU8XG4+Cis8ZW5kaWY+Cit9KT4KKz4+CisKKy8qKiB4Kz1ydWxlIGF1dG8gY29uc3RydWN0ICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwobGFiZWwsIHs8bGFiZWw+LnRyZWV9KT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSBzZWxmLmlucHV0LkxUKDEpCis8c3VwZXIucnVsZVJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoeworcm9vdF88dHJlZUxldmVsPiA9IHNlbGYuX2FkYXB0b3IuYmVjb21lUm9vdCg8bGFiZWw+LnRyZWUsIHJvb3RfPHRyZWVMZXZlbD4pCit9KT4KKzxlbmRpZj4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSBhdXRvIGNvbnN0cnVjdCAqLworcnVsZVJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGxpc3RMYWJlbChsYWJlbCwgezxsYWJlbD4udHJlZX0pPgorPj4KKworLyoqIHJ1bGUgd2hlbiBvdXRwdXQ9QVNUIGFuZCB0cmFja2luZyBmb3IgcmV3cml0ZSAqLworcnVsZVJlZlRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSBzZWxmLmlucHV0LkxUKDEpCis8c3VwZXIucnVsZVJlZlRyYWNrKC4uLik+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD1BU1QgYW5kIHRyYWNraW5nIGZvciByZXdyaXRlICovCitydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8CitfbGFzdCA9IHNlbGYuaW5wdXQuTFQoMSkKKzxzdXBlci5ydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisKKy8qKiBeKHJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gc2VsZi5pbnB1dC5MVCgxKQorPHN1cGVyLnJ1bGVSZWZSb290VHJhY2soLi4uKT4KKz4+CisKKy8qKiBeKHgrPXJ1bGUgLi4uKSByZXdyaXRlICovCitydWxlUmVmUnVsZVJvb3RUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gc2VsZi5pbnB1dC5MVCgxKQorPHN1cGVyLnJ1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKC4uLik+Cis+PgorCisvKiogU3RyZWFtcyBmb3IgdG9rZW4gcmVmcyBhcmUgdHJlZSBub2RlcyBub3c7IG92ZXJyaWRlIHRvCisgKiAgY2hhbmdlIG5leHRUb2tlbiB0byBuZXh0Tm9kZS4KKyAqLworY3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCh0b2tlbix0ZXJtaW5hbE9wdGlvbnMsc2NvcGUpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZT4oc3RyZWFtXzx0b2tlbj4ubmV4dE5vZGUoKSkKKzxlbHNlPgorc3RyZWFtXzx0b2tlbj4ubmV4dE5vZGUoKQorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8ZmluaXNoZWRCYWNrdHJhY2tpbmcoeworcmV0dmFsLnRyZWUgPSBzZWxmLl9hZGFwdG9yLnJ1bGVQb3N0UHJvY2Vzc2luZyhyb290XzApCit9KT4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9EYmcuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vRGJnLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJiZGVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vRGJnLnN0ZwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKiogVGVtcGxhdGUgb3ZlcnJpZGVzIHRvIGFkZCBkZWJ1Z2dpbmcgdG8gbm9ybWFsIFB5dGhvbiBvdXRwdXQ7CisgKiAgSWYgQVNUcyBhcmUgYnVpbHQsIHRoZW4geW91J2xsIGFsc28gZ2V0IEFTVERiZy5zdGcgbG9hZGVkLgorICovCisKK0BvdXRwdXRGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPgorZnJvbSBhbnRscjMuZGVidWcgaW1wb3J0ICoKKz4+CisKK0BnZW5lcmljUGFyc2VyLmFyZ3MoKSA6Oj0gPDwKK2RlYnVnX3NvY2tldCA9IGt3YXJncy5wb3AoJ2RlYnVnX3NvY2tldCcsIE5vbmUpCitwb3J0ID0ga3dhcmdzLnBvcCgncG9ydCcsIE5vbmUpCis+PgorCitAZ2VuZXJpY1BhcnNlci5pbml0KCkgOjo9IDw8CitzZWxmLnJ1bGVMZXZlbCA9IDAKKworaWYgc2VsZi5fZGJnIGlzIE5vbmU6CisgICAgPGNyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCk+CisKKz4+CisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgorcHJveHkgPSBEZWJ1Z0V2ZW50U29ja2V0UHJveHkoc2VsZiwgYWRhcHRvcj1zZWxmLmlucHV0LmdldFRyZWVBZGFwdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1kZWJ1Z19zb2NrZXQsIHBvcnQ9cG9ydCk8XG4+Cis8ZWxzZT4KK3Byb3h5ID0gRGVidWdFdmVudFNvY2tldFByb3h5KHNlbGYsIGRlYnVnPWRlYnVnX3NvY2tldCwgcG9ydD1wb3J0KTxcbj4KKzxlbmRpZj4KK3NlbGYuc2V0RGVidWdMaXN0ZW5lcihwcm94eSkKK3Byb3h5LmhhbmRzaGFrZSgpCisKKz4+CisKK0BnZW5lcmljUGFyc2VyLm1lbWJlcnMoKSA6Oj0gPDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorcnVsZU5hbWVzID0gWworICAgICJpbnZhbGlkUnVsZSIsIDxncmFtbWFyLmFsbEltcG9ydGVkUnVsZXM6e3JTVCB8ICI8clNULm5hbWU+In07IHdyYXA9IlxuICAgICIsIHNlcGFyYXRvcj0iLCAiPgorICAgIF08XG4+Cis8ZW5kaWY+CitkZWNpc2lvbkNhbkJhY2t0cmFjayA9IFsKKyAgICBGYWxzZSwgIyBpbnZhbGlkIGRlY2lzaW9uCisgICAgPGdyYW1tYXIuZGVjaXNpb25zOntkIHwgPGlmKGQuZGZhLmhhc1N5blByZWQpPlRydWU8ZWxzZT5GYWxzZTxlbmRpZj59OyB3cmFwPSJcbiAgICAiLCBzZXBhcmF0b3I9IiwgIj4KKyAgICBdCis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4gPCEgZ3JhbW1hciBpbXBvcnRzIG90aGVyIGdyYW1tYXIocykgIT4KK2RlZiBnZXRSdWxlTGV2ZWwoc2VsZik6CisgICAgcmV0dXJuIHNlbGYucnVsZUxldmVsCisKK2RlZiBpbmNSdWxlTGV2ZWwoc2VsZik6CisgICAgc2VsZi5ydWxlTGV2ZWwgKz0gMQorCitkZWYgZGVjUnVsZUxldmVsKHNlbGYpOgorICAgIHNlbGYucnVsZUxldmVsIC09IDEKKworPGlmKHByb2ZpbGUpPgorICAgIDxjdG9yRm9yUHJvZmlsaW5nUm9vdEdyYW1tYXIoKT4KKzxlbHNlPgorICAgIDxjdG9yRm9yUm9vdEdyYW1tYXIoKT4KKzxlbmRpZj4KKzxjdG9yRm9yUHJlZGVmaW5lZExpc3RlbmVyKCk+Cis8ZWxzZT4gPCEgaW1wb3J0ZWQgZ3JhbW1hciAhPgorZGVmIGdldFJ1bGVMZXZlbChzZWxmKToKKyAgICByZXR1cm4gPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wgPGc6ZGVsZWdhdGVOYW1lKCk+fT4uZ2V0UnVsZUxldmVsKCkKKworZGVmIGluY1J1bGVMZXZlbChzZWxmKToKKyAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pi5pbmNSdWxlTGV2ZWwoKQorCitkZWYgZGVjUnVsZUxldmVsKHNlbGYpOgorICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8IDxnOmRlbGVnYXRlTmFtZSgpPn0+LmRlY1J1bGVMZXZlbCgpCisKKzxjdG9yRm9yRGVsZWdhdGVHcmFtbWFyKCk+Cis8ZW5kaWY+Cis8aWYocHJvZmlsZSk+CitGSVhNRSgyKQorcHVibGljIGJvb2xlYW4gYWxyZWFkeVBhcnNlZFJ1bGUoSW50U3RyZWFtIGlucHV0LCBpbnQgcnVsZUluZGV4KSB7CisgICAgKChQcm9maWxlcilzZWxmLl9kYmcpLmV4YW1pbmVSdWxlTWVtb2l6YXRpb24oaW5wdXQsIHJ1bGVJbmRleCwgPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ydWxlTmFtZXNbcnVsZUluZGV4XSk7CisgICAgcmV0dXJuIHN1cGVyLmFscmVhZHlQYXJzZWRSdWxlKGlucHV0LCBydWxlSW5kZXgpOworfTxcbj4KK0ZJWE1FKDMpCitwdWJsaWMgdm9pZCBtZW1vaXplKEludFN0cmVhbSBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHJ1bGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHJ1bGVTdGFydEluZGV4KQoreworICAgICgoUHJvZmlsZXIpc2VsZi5fZGJnKS5tZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4LCA8Z3JhbW1hci5jb21wb3NpdGUucm9vdEdyYW1tYXIucmVjb2duaXplck5hbWU+LnJ1bGVOYW1lc1tydWxlSW5kZXhdKTsKKyAgICBzdXBlci5tZW1vaXplKGlucHV0LCBydWxlSW5kZXgsIHJ1bGVTdGFydEluZGV4KTsKK308XG4+Cis8ZW5kaWY+CitkZWYgZXZhbFByZWRpY2F0ZShzZWxmLCByZXN1bHQsIHByZWRpY2F0ZSk6CisgICAgc2VsZi5fZGJnLnNlbWFudGljUHJlZGljYXRlKHJlc3VsdCwgcHJlZGljYXRlKQorICAgIHJldHVybiByZXN1bHQKKzxcbj4KKz4+CisKK2N0b3JGb3JSb290R3JhbW1hcigpIDo6PSA8PAorPCEgYnVnOiBjYW4ndCB1c2UgPEBzdXBlci5tZW1iZXJzKCk+IGN1dC1uLXBhc3RlIGluc3RlYWQgIT4KKzwhIFNhbWUgZXhjZXB0IHdlIGFkZCBwb3J0IG51bWJlciBhbmQgcHJvZmlsZSBzdHVmZiBpZiByb290IGdyYW1tYXIgIT4KKzwhCitwdWJsaWMgPG5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0KSB7CisgICAgdGhpcyhpbnB1dCwgRGVidWdFdmVudFNvY2tldFByb3h5LkRFRkFVTFRfREVCVUdHRVJfUE9SVCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKK30KK3B1YmxpYyA8bmFtZT4oPGlucHV0U3RyZWFtVHlwZT4gaW5wdXQsIGludCBwb3J0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgIDxjcmVhdGVMaXN0ZW5lckFuZEhhbmRzaGFrZSgpPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBzZWxmLl9kYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAZmluYWxseSgpPgorfTxcbj4KKyE+Cis+PgorCitjdG9yRm9yUHJvZmlsaW5nUm9vdEdyYW1tYXIoKSA6Oj0gPDwKKzwhIGJ1ZzogY2FuJ3QgdXNlIDxAc3VwZXIubWVtYmVycygpPiBjdXQtbi1wYXN0ZSBpbnN0ZWFkICE+CitwdWJsaWMgPG5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0KSB7CisgICAgdGhpcyhpbnB1dCwgbmV3IFByb2ZpbGVyKG51bGwpLCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworfQorcHVibGljIDxuYW1lPig8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgRGVidWdFdmVudExpc3RlbmVyIHNlbGYuZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICBzdXBlcihpbnB1dCwgc2VsZi5kYmcsIHN0YXRlKTsKKyAgICBQcm9maWxlciBwID0gKFByb2ZpbGVyKXNlbGYuZGJnOworICAgIHAuc2V0UGFyc2VyKHRoaXMpOworICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPihpbnB1dCwgc2VsZi5kYmcsIHRoaXMuc3RhdGUsIHRoaXM8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGc6ZGVsZWdhdGVOYW1lKCk+fT4pO307IHNlcGFyYXRvcj0iXG4iPgorICAgIDxAZmluYWxseSgpPgorfQorPFxuPgorPj4KKworLyoqIEJhc2ljYWxseSB3ZSBkb24ndCB3YW50IHRvIHNldCBhbnkgZGJnIGxpc3RlbmVycyBhcmUgcm9vdCB3aWxsIGhhdmUgaXQuICovCitjdG9yRm9yRGVsZWdhdGVHcmFtbWFyKCkgOjo9IDw8Cis8IQorcHVibGljIDxuYW1lPig8aW5wdXRTdHJlYW1UeXBlPiBpbnB1dCwgRGVidWdFdmVudExpc3RlbmVyIHNlbGYuZGJnLCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGU8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfCwgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn0+KSB7CisgICAgc3VwZXIoaW5wdXQsIGRiZywgc3RhdGUpOworICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPihpbnB1dCwgdGhpcywgdGhpcy5zdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pik7fTsgc2VwYXJhdG9yPSJcbiI+Cit9PFxuPgorIT4KKz4+CisKK2N0b3JGb3JQcmVkZWZpbmVkTGlzdGVuZXIoKSA6Oj0gPDwKKzwhCitwdWJsaWMgPG5hbWU+KDxpbnB1dFN0cmVhbVR5cGU+IGlucHV0LCBEZWJ1Z0V2ZW50TGlzdGVuZXIgZGJnKSB7CisgICAgPEBzdXBlckNsYXNzUmVmPnN1cGVyKGlucHV0LCBkYmcsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7PEBlbmQ+Cis8aWYocHJvZmlsZSk+CisgICAgUHJvZmlsZXIgcCA9IChQcm9maWxlcilkYmc7CisgICAgcC5zZXRQYXJzZXIodGhpcyk7Cis8ZW5kaWY+CisgICAgPHBhcnNlckN0b3JCb2R5KCk+CisgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOntnfDxnOmRlbGVnYXRlTmFtZSgpPiA9IG5ldyA8Zy5yZWNvZ25pemVyTmFtZT4oaW5wdXQsIHNlbGYuX2RiZywgdGhpcy5zdGF0ZSwgdGhpczxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59Pik7fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgPEBmaW5hbGx5KCk+Cit9PFxuPgorIT4KKz4+CisKK0BnZW5lcmljUGFyc2VyLnN1cGVyQ2xhc3NOYW1lKCkgOjo9ICJEZWJ1ZzxAc3VwZXIuc3VwZXJDbGFzc05hbWUoKT4iCisKK0BydWxlLmJvZHkoKSA6Oj0gPDwKK3RyeToKKyAgICBzZWxmLl9kYmcuZW50ZXJSdWxlKHNlbGYuZ2V0R3JhbW1hckZpbGVOYW1lKCksICI8cnVsZU5hbWU+IikKKyAgICBpZiBzZWxmLmdldFJ1bGVMZXZlbCgpID09IDA6CisgICAgICAgIHNlbGYuX2RiZy5jb21tZW5jZSgpOworICAgIHNlbGYuaW5jUnVsZUxldmVsKCkKKyAgICA8ISBTVCB1c2VzIHplcm8tYmFzZWQgY29sdW1ucywgd2Ugd2FudCBvbmUtYmFzZSAhPgorICAgIHNlbGYuX2RiZy5sb2NhdGlvbig8cnVsZURlc2NyaXB0b3IudHJlZS5saW5lPiwgPHJ1bGVEZXNjcmlwdG9yLnRyZWUuY2hhclBvc2l0aW9uSW5MaW5lPisxKQorCisgICAgPEBzdXBlci5ib2R5KCk+CisKKyAgICBzZWxmLl9kYmcubG9jYXRpb24oPHJ1bGVEZXNjcmlwdG9yLkVPUk5vZGUubGluZT4sIDxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmNoYXJQb3NpdGlvbkluTGluZT4rMSkKK2ZpbmFsbHk6CisgICAgc2VsZi5fZGJnLmV4aXRSdWxlKHNlbGYuZ2V0R3JhbW1hckZpbGVOYW1lKCksICI8cnVsZU5hbWU+IikKKyAgICBzZWxmLmRlY1J1bGVMZXZlbCgpCisgICAgaWYgc2VsZi5nZXRSdWxlTGV2ZWwoKSA9PSAwOgorICAgICAgICAgc2VsZi5fZGJnLnRlcm1pbmF0ZSgpCisKKz4+CisKK0BzeW5wcmVkLnN0YXJ0KCkgOjo9ICJzZWxmLl9kYmcuYmVnaW5CYWNrdHJhY2soc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nKSIKKworQHN5bnByZWQuc3RvcCgpIDo6PSAic2VsZi5fZGJnLmVuZEJhY2t0cmFjayhzZWxmLl9zdGF0ZS5iYWNrdHJhY2tpbmcsIHN1Y2Nlc3MpIgorCisvLyBDb21tb24gZGVidWcgZXZlbnQgdHJpZ2dlcnMgdXNlZCBieSByZWdpb24gb3ZlcnJpZGVzIGJlbG93CisKK2VudGVyU3ViUnVsZSgpIDo6PQorICAgICJ0cnkgeyBzZWxmLl9kYmcuZW50ZXJTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pOzxcbj4iCisKK2V4aXRTdWJSdWxlKCkgOjo9CisgICAgIn0gZmluYWxseSB7c2VsZi5fZGJnLmV4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pO308XG4+IgorCitlbnRlckRlY2lzaW9uKCkgOjo9CisgICAgInRyeSB7IHNlbGYuX2RiZy5lbnRlckRlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pOzxcbj4iCisKK2V4aXREZWNpc2lvbigpIDo6PQorICAgICJ9IGZpbmFsbHkge3NlbGYuX2RiZy5leGl0RGVjaXNpb24oPGRlY2lzaW9uTnVtYmVyPik7fTxcbj4iCisKK2VudGVyQWx0KG4pIDo6PSAic2VsZi5fZGJnLmVudGVyQWx0KDxuPik8XG4+IgorCisvLyBSZWdpb24gb3ZlcnJpZGVzIHRoYXQgdGVsbCB2YXJpb3VzIGNvbnN0cnVjdHMgdG8gYWRkIGRlYnVnZ2luZyB0cmlnZ2VycworCitAYmxvY2suYm9keSgpIDo6PSA8PAordHJ5OgorICAgIHNlbGYuX2RiZy5lbnRlclN1YlJ1bGUoPGRlY2lzaW9uTnVtYmVyPikKKyAgICA8QHN1cGVyLmJvZHkoKT4KK2ZpbmFsbHk6CisgICAgc2VsZi5fZGJnLmV4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pCis+PgorCitAYmxvY2tCb2R5LmRlY2lzaW9uKCkgOjo9IDw8Cit0cnk6CisgICAgc2VsZi5fZGJnLmVudGVyRGVjaXNpb24oCisgICAgICAgIDxkZWNpc2lvbk51bWJlcj4sIHNlbGYuZGVjaXNpb25DYW5CYWNrdHJhY2tbPGRlY2lzaW9uTnVtYmVyPl0pCisgICAgPEBzdXBlci5kZWNpc2lvbigpPgorZmluYWxseToKKyAgICBzZWxmLl9kYmcuZXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pCis+PgorCitAcnVsZUJsb2NrLmRlY2lzaW9uKCkgOjo9IDw8Cit0cnk6CisgICAgc2VsZi5fZGJnLmVudGVyRGVjaXNpb24oCisgICAgICAgIDxkZWNpc2lvbk51bWJlcj4sIHNlbGYuZGVjaXNpb25DYW5CYWNrdHJhY2tbPGRlY2lzaW9uTnVtYmVyPl0pCisgICAgPEBzdXBlci5kZWNpc2lvbigpPgorZmluYWxseToKKyAgICBzZWxmLl9kYmcuZXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pCis+PgorCitAcnVsZUJsb2NrU2luZ2xlQWx0LnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49XCIxXCIpPiIKKworQGJsb2NrU2luZ2xlQWx0LnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KG49XCIxXCIpPiIKKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrLmxvb3BCb2R5KCkgOjo9IDw8Cit0cnk6CisgICAgc2VsZi5fZGJnLmVudGVyU3ViUnVsZSg8ZGVjaXNpb25OdW1iZXI+KQorICAgIDxAc3VwZXIubG9vcEJvZHkoKT4KK2ZpbmFsbHk6CisgICAgc2VsZi5fZGJnLmV4aXRTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pPFxuPgorPj4KKworQHBvc2l0aXZlQ2xvc3VyZUJsb2NrTG9vcC5kZWNpc2lvbkJvZHkoKSA6Oj0gPDwKK3RyeToKKyAgICBzZWxmLl9kYmcuZW50ZXJEZWNpc2lvbigKKyAgICAgICAgPGRlY2lzaW9uTnVtYmVyPiwgc2VsZi5kZWNpc2lvbkNhbkJhY2t0cmFja1s8ZGVjaXNpb25OdW1iZXI+XSkKKyAgICA8QHN1cGVyLmRlY2lzaW9uQm9keSgpPgorZmluYWxseToKKyAgICBzZWxmLl9kYmcuZXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pCis+PgorCitAcG9zaXRpdmVDbG9zdXJlQmxvY2tMb29wLmVhcmx5RXhpdEV4Y2VwdGlvbigpIDo6PQorICAgICJzZWxmLl9kYmcucmVjb2duaXRpb25FeGNlcHRpb24oZWVlKTxcbj4iCisKK0BjbG9zdXJlQmxvY2subG9vcEJvZHkoKSA6Oj0gPDwKK3RyeToKKyAgICBzZWxmLl9kYmcuZW50ZXJTdWJSdWxlKDxkZWNpc2lvbk51bWJlcj4pCisgICAgPEBzdXBlci5sb29wQm9keSgpPgorZmluYWxseToKKyAgICBzZWxmLl9kYmcuZXhpdFN1YlJ1bGUoPGRlY2lzaW9uTnVtYmVyPik8XG4+Cis+PgorCitAY2xvc3VyZUJsb2NrTG9vcC5kZWNpc2lvbkJvZHkoKSA6Oj0gPDwKK3RyeToKKyAgICBzZWxmLl9kYmcuZW50ZXJEZWNpc2lvbigKKyAgICAgICAgPGRlY2lzaW9uTnVtYmVyPiwgc2VsZi5kZWNpc2lvbkNhbkJhY2t0cmFja1s8ZGVjaXNpb25OdW1iZXI+XSkKKyAgICA8QHN1cGVyLmRlY2lzaW9uQm9keSgpPgorZmluYWxseToKKyAgICBzZWxmLl9kYmcuZXhpdERlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pCis+PgorCitAYWx0U3dpdGNoQ2FzZS5wcmVhbHQoKSA6Oj0gIjxlbnRlckFsdChhbHROdW0pPiIKKworQGVsZW1lbnQucHJlbWF0Y2goKSA6Oj0KKyAgICAic2VsZi5fZGJnLmxvY2F0aW9uKDxlLmxpbmU+LCA8ZS5wb3M+KSIKKworQG1hdGNoU2V0Lm1pc21hdGNoZWRTZXRFeGNlcHRpb24oKSA6Oj0KKyAgICAic2VsZi5fZGJnLnJlY29nbml0aW9uRXhjZXB0aW9uKG1zZSkiCisKK0BkZmFTdGF0ZS5ub1ZpYWJsZUFsdEV4Y2VwdGlvbigpIDo6PSAic2VsZi5fZGJnLnJlY29nbml0aW9uRXhjZXB0aW9uKG52YWUpIgorCitAZGZhU3RhdGVTd2l0Y2gubm9WaWFibGVBbHRFeGNlcHRpb24oKSA6Oj0gInNlbGYuX2RiZy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihudmFlKSIKKworZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAordHJ5OgorICAgIHNlbGYuaXNDeWNsaWNEZWNpc2lvbiA9IFRydWUKKyAgICA8c3VwZXIuZGZhRGVjaXNpb24oLi4uKT4KKworZXhjZXB0IE5vVmlhYmxlQWx0RXhjZXB0aW9uLCBudmFlOgorICAgIHNlbGYuX2RiZy5yZWNvZ25pdGlvbkV4Y2VwdGlvbihudmFlKQorICAgIHJhaXNlCisKKz4+CisKK0BjeWNsaWNERkEuZXJyb3JNZXRob2QoKSA6Oj0gPDwKK2RlZiBlcnJvcihzZWxmLCBudmFlKToKKyAgICBzZWxmLl9kYmcucmVjb2duaXRpb25FeGNlcHRpb24obnZhZSkKKworPj4KKworLyoqIEZvcmNlIHByZWRpY2F0ZSB2YWxpZGF0aW9uIHRvIHRyaWdnZXIgYW4gZXZlbnQgKi8KK2V2YWxQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9IDw8CitzZWxmLmV2YWxQcmVkaWNhdGUoPHByZWQ+LCI8ZGVzY3JpcHRpb24+IikKKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9QeXRob24uc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vUHl0aG9uLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWMzMjRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9QeXRob24vUHl0aG9uLnN0ZwpAQCAtMCwwICsxLDE0NzQgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IFRlcmVuY2UgUGFycgorIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiogVGhlIEFQSSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lIHRoYXQgcmVjb2duaXplcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgcnVudGltZQorICogIG5lZWQuCisgKi8KK2FwaVZlcnNpb24oKSA6Oj0gIjEiCisKKy8vIFN5c3RlbS5Cb29sZWFuLlRvU3RyaW5nKCkgcmV0dXJucyAiVHJ1ZSIgYW5kICJGYWxzZSIsIGJ1dCB0aGUgcHJvcGVyIEMjIGxpdGVyYWxzIGFyZSAidHJ1ZSIgYW5kICJmYWxzZSIKKy8vIFRoZSBKYXZhIHZlcnNpb24gb2YgQm9vbGVhbiByZXR1cm5zICJ0cnVlIiBhbmQgImZhbHNlIiwgc28gdGhleSBtYXAgdG8gdGhlbXNlbHZlcyBoZXJlLgorYm9vbGVhbkxpdGVyYWwgOjo9IFsKKwkgICAgICAgIlRydWUiOiJ0cnVlIiwKKwkgICAgICAgIkZhbHNlIjoiZmFsc2UiLAorCSAgICAgICAidHJ1ZSI6InRydWUiLAorCSAgICAgICAiZmFsc2UiOiJmYWxzZSIsCisJICAgICAgIGRlZmF1bHQ6ImZhbHNlIgorXQorCisvKiogVGhlIG92ZXJhbGwgZmlsZSBzdHJ1Y3R1cmUgb2YgYSByZWNvZ25pemVyOyBzdG9yZXMgbWV0aG9kcyBmb3IgcnVsZXMKKyAqICBhbmQgY3ljbGljIERGQXMgcGx1cyBzdXBwb3J0IGNvZGUuCisgKi8KK291dHB1dEZpbGUoTEVYRVIsUEFSU0VSLFRSRUVfUEFSU0VSLCBhY3Rpb25TY29wZSwgYWN0aW9ucywKKyAgICAgICAgICAgZG9jQ29tbWVudCwgcmVjb2duaXplciwKKyAgICAgICAgICAgbmFtZSwgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgY3ljbGljREZBcywKKyAgICAgICAgICAgYml0c2V0cywgYnVpbGRUZW1wbGF0ZSwgYnVpbGRBU1QsIHJld3JpdGVNb2RlLCBwcm9maWxlLAorICAgICAgICAgICBiYWNrdHJhY2tpbmcsIHN5bnByZWRzLCBtZW1vaXplLCBudW1SdWxlcywKKyAgICAgICAgICAgZmlsZU5hbWUsIEFOVExSVmVyc2lvbiwgZ2VuZXJhdGVkVGltZXN0YW1wLCB0cmFjZSwKKyAgICAgICAgICAgc2NvcGVzLCBzdXBlckNsYXNzLCBsaXRlcmFscykgOjo9Cis8PAorIyAkQU5UTFIgPEFOVExSVmVyc2lvbj4gPGZpbGVOYW1lPiA8Z2VuZXJhdGVkVGltZXN0YW1wPgorCis8QGltcG9ydHM+CitpbXBvcnQgc3lzCitmcm9tIGFudGxyMyBpbXBvcnQgKgorPGlmKFRSRUVfUEFSU0VSKT4KK2Zyb20gYW50bHIzLnRyZWUgaW1wb3J0ICo8XG4+Cis8ZW5kaWY+Citmcm9tIGFudGxyMy5jb21wYXQgaW1wb3J0IHNldCwgZnJvemVuc2V0Cis8QGVuZD4KKworPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5oZWFkZXI+CisKKzwhIDxkb2NDb21tZW50PiAhPgorCisjIGZvciBjb252ZW5pZW5jZSBpbiBhY3Rpb25zCitISURERU4gPSBCYXNlUmVjb2duaXplci5ISURERU4KKworIyB0b2tlbiB0eXBlcworPHRva2Vuczp7aXQgfCA8aXQubmFtZT49PGl0LnR5cGU+fTsgc2VwYXJhdG9yPSJcbiI+CisKKzxyZWNvZ25pemVyPgorCis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1haW4pPgorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5tYWluPgorPGVsc2U+CitkZWYgbWFpbihhcmd2LCBzdGRpbj1zeXMuc3RkaW4sIHN0ZG91dD1zeXMuc3Rkb3V0LCBzdGRlcnI9c3lzLnN0ZGVycik6Cis8aWYoTEVYRVIpPgorICAgIGZyb20gYW50bHIzLm1haW4gaW1wb3J0IExleGVyTWFpbgorICAgIG1haW4gPSBMZXhlck1haW4oPHJlY29nbml6ZXIubmFtZT4pPFxuPgorPGVuZGlmPgorPGlmKFBBUlNFUik+CisgICAgZnJvbSBhbnRscjMubWFpbiBpbXBvcnQgUGFyc2VyTWFpbgorICAgIG1haW4gPSBQYXJzZXJNYWluKCI8cmVjb2duaXplci5ncmFtbWFyLm5hbWU+TGV4ZXIiLCA8cmVjb2duaXplci5uYW1lPik8XG4+Cis8ZW5kaWY+Cis8aWYoVFJFRV9QQVJTRVIpPgorICAgIGZyb20gYW50bHIzLm1haW4gaW1wb3J0IFdhbGtlck1haW4KKyAgICBtYWluID0gV2Fsa2VyTWFpbig8cmVjb2duaXplci5uYW1lPik8XG4+Cis8ZW5kaWY+CisgICAgbWFpbi5zdGRpbiA9IHN0ZGluCisgICAgbWFpbi5zdGRvdXQgPSBzdGRvdXQKKyAgICBtYWluLnN0ZGVyciA9IHN0ZGVycgorICAgIG1haW4uZXhlY3V0ZShhcmd2KTxcbj4KKzxlbmRpZj4KKworPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5mb290ZXI+CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbihzeXMuYXJndikKKworPj4KKworbGV4ZXIoZ3JhbW1hciwgbmFtZSwgdG9rZW5zLCBzY29wZXMsIHJ1bGVzLCBudW1SdWxlcywgZmlsdGVyTW9kZSwKKyAgICAgIGxhYmVsVHlwZT0iQ29tbW9uVG9rZW4iLCBzdXBlckNsYXNzPSJMZXhlciIpIDo6PSA8PAorPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorIHtnfGZyb20gPGcucmVjb2duaXplck5hbWU+IGltcG9ydCA8Zy5yZWNvZ25pemVyTmFtZT59OyBzZXBhcmF0b3I9IlxuIj4KKworY2xhc3MgPGdyYW1tYXIucmVjb2duaXplck5hbWU+KDxAc3VwZXJDbGFzc05hbWU+PHN1cGVyQ2xhc3M+PEBlbmQ+KToKKyAgICA8c2NvcGVzOntpdHw8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZShzY29wZT1pdCk+PGVuZGlmPn0+CisKKyAgICBncmFtbWFyRmlsZU5hbWUgPSAiPGZpbGVOYW1lPiIKKyAgICBhcGlfdmVyc2lvbiA9IDxhcGlWZXJzaW9uKCk+CisKKyAgICBkZWYgX19pbml0X18oc2VsZjxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59PiwgaW5wdXQ9Tm9uZSwgc3RhdGU9Tm9uZSk6CisgICAgICAgIGlmIHN0YXRlIGlzIE5vbmU6CisgICAgICAgICAgICBzdGF0ZSA9IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpCisgICAgICAgIHN1cGVyKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgc2VsZikuX19pbml0X18oaW5wdXQsIHN0YXRlKQorCis8aWYobWVtb2l6ZSk+Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgICAgICAgc2VsZi5fc3RhdGUucnVsZU1lbW8gPSB7fQorPGVuZGlmPgorPGVuZGlmPgorCisgICAgICAgIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczoKKyAgICAgICAgIHtnfHNlbGYuPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGcucmVjb2duaXplck5hbWU+KDx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfDxwOmRlbGVnYXRlTmFtZSgpPiwgfT5zZWxmLCBpbnB1dCwgc3RhdGUpfTsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xzZWxmLjxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnOmRlbGVnYXRlTmFtZSgpPn07IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOgorICAgIAkge2d8c2VsZi5nUGFyZW50ID0gPGc6ZGVsZWdhdGVOYW1lKCk+fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIHNlbGYuZGVsZWdhdGVzID0gWzxncmFtbWFyLmRlbGVnYXRlczoge2d8c2VsZi48ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3IgPSAiLCAiPl0KKworICAgICAgICA8Y3ljbGljREZBczp7ZGZhIHwgPGN5Y2xpY0RGQUluaXQoZGZhKT59OyBzZXBhcmF0b3I9IlxuIj4KKworICAgICAgICA8YWN0aW9ucy5sZXhlci5pbml0PgorCisKKyAgICA8YWN0aW9ucy5sZXhlci5tZW1iZXJzPgorCisKKzxpZihmaWx0ZXJNb2RlKT4KKyAgICA8ZmlsdGVyaW5nTmV4dFRva2VuKCk+Cis8ZW5kaWY+CisgICAgPHJ1bGVzOyBzZXBhcmF0b3I9IlxuXG4iPgorCisgICAgPHN5bnByZWRzOntwIHwgPGxleGVyU3lucHJlZChwKT59PgorCisgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+IDwhIGR1bXAgdGFibGVzIGZvciBhbGwgREZBICE+CisKKworPj4KKworLyoqIEEgb3ZlcnJpZGUgb2YgTGV4ZXIubmV4dFRva2VuKCkgdGhhdCBiYWNrdHJhY2tzIG92ZXIgbVRva2VucygpIGxvb2tpbmcKKyAqICBmb3IgbWF0Y2hlcy4gIE5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQgdXBvbiBlcnJvcjsganVzdCByZXdpbmQsIGNvbnN1bWUKKyAqICBhIHRva2VuIGFuZCB0aGVuIHRyeSBhZ2Fpbi4gIGJhY2t0cmFja2luZyBuZWVkcyB0byBiZSBzZXQgYXMgd2VsbC4KKyAqICBNYWtlIHJ1bGUgbWVtb2l6YXRpb24gaGFwcGVuIG9ubHkgYXQgbGV2ZWxzIGFib3ZlIDEgYXMgd2Ugc3RhcnQgbVRva2VucworICogIGF0IGJhY2t0cmFja2luZz09MS4KKyAqLworZmlsdGVyaW5nTmV4dFRva2VuKCkgOjo9IDw8CitkZWYgbmV4dFRva2VuKHNlbGYpOgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGlmIHNlbGYuaW5wdXQuTEEoMSkgPT0gRU9GOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFrZUVPRlRva2VuKCkKKworICAgICAgICBzZWxmLl9zdGF0ZS50b2tlbiA9IE5vbmUKKyAgICAgICAgc2VsZi5fc3RhdGUuY2hhbm5lbCA9IERFRkFVTFRfQ0hBTk5FTAorICAgICAgICBzZWxmLl9zdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4ID0gc2VsZi5pbnB1dC5pbmRleCgpCisgICAgICAgIHNlbGYuX3N0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgPSBzZWxmLmlucHV0LmNoYXJQb3NpdGlvbkluTGluZQorICAgICAgICBzZWxmLl9zdGF0ZS50b2tlblN0YXJ0TGluZSA9IHNlbGYuaW5wdXQubGluZQorICAgICAgICBzZWxmLl9zdGF0ZS5fdGV4dCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbSA9IHNlbGYuaW5wdXQubWFyaygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBtZWFucyB3ZSB3b24ndCB0aHJvdyBzbG93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubVRva2VucygpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID0gMAorCisgICAgICAgICAgICBleGNlcHQgQmFja3RyYWNraW5nRmFpbGVkOgorICAgICAgICAgICAgICAgICMgbVRva2VucyBiYWNrdHJhY2tzIHdpdGggc3lucHJlZCBhdCBiYWNrdHJhY2tpbmc9PTIKKyAgICAgICAgICAgICAgICAjIGFuZCB3ZSBzZXQgdGhlIHN5bnByZWRnYXRlIHRvIGFsbG93IGFjdGlvbnMgYXQgbGV2ZWwgMS4KKyAgICAgICAgICAgICAgICBzZWxmLmlucHV0LnJld2luZChtKQorICAgICAgICAgICAgICAgIHNlbGYuaW5wdXQuY29uc3VtZSgpICMgYWR2YW5jZSBvbmUgY2hhciBhbmQgdHJ5IGFnYWluCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUudG9rZW4KKworICAgICAgICBleGNlcHQgUmVjb2duaXRpb25FeGNlcHRpb24sIHJlOgorICAgICAgICAgICAgIyBzaG91bGRuJ3QgaGFwcGVuIGluIGJhY2t0cmFja2luZyBtb2RlLCBidXQuLi4KKyAgICAgICAgICAgIHNlbGYucmVwb3J0RXJyb3IocmUpCisgICAgICAgICAgICBzZWxmLnJlY292ZXIocmUpCisKKworZGVmIG1lbW9pemUoc2VsZiwgaW5wdXQsIHJ1bGVJbmRleCwgcnVsZVN0YXJ0SW5kZXgsIHN1Y2Nlc3MpOgorICAgIGlmIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA+IDE6CisgICAgICAgICMgaXMgTGV4ZXIgYWx3YXlzIHN1cGVyY2xhc3M/CisgICAgICAgIHN1cGVyKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgc2VsZikubWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCwgc3VjY2VzcykKKworCitkZWYgYWxyZWFkeVBhcnNlZFJ1bGUoc2VsZiwgaW5wdXQsIHJ1bGVJbmRleCk6CisgICAgaWYgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID4gMToKKyAgICAgICAgcmV0dXJuIHN1cGVyKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgc2VsZikuYWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCkKKyAgICByZXR1cm4gRmFsc2UKKworCis+PgorCithY3Rpb25HYXRlKCkgOjo9ICJzZWxmLl9zdGF0ZS5iYWNrdHJhY2tpbmcgPT0gMCIKKworZmlsdGVyaW5nQWN0aW9uR2F0ZSgpIDo6PSAic2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID09IDEiCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBwYXJzZXIgKi8KKworZ2VuZXJpY1BhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgcnVsZXMsIG51bVJ1bGVzLAorICAgICAgICAgICAgICBiaXRzZXRzLCBpbnB1dFN0cmVhbVR5cGUsIHN1cGVyQ2xhc3MsIGxhYmVsVHlwZSwgbWVtYmVycywKKwkgICAgICByZXdyaXRlRWxlbWVudFR5cGUsIGZpbHRlck1vZGUsIGluaXQsIEFTVExhYmVsVHlwZT0iT2JqZWN0IikgOjo9IDw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyMgdG9rZW4gbmFtZXMKK3Rva2VuTmFtZXMgPSBbCisgICAgIlw8aW52YWxpZD4iLCAiXDxFT1I+IiwgIlw8RE9XTj4iLCAiXDxVUD4iLAorICAgIDx0b2tlbk5hbWVzOyB3cmFwLCBzZXBhcmF0b3I9IiwgIj4KK108XG4+Cis8ZWxzZT4KK2Zyb20gPGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLnJlY29nbml6ZXJOYW1lPiBpbXBvcnQgdG9rZW5OYW1lczxcbj4KKzxlbmRpZj4KKzxzY29wZXM6e2l0fDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlQ2xhc3Moc2NvcGU9aXQpPjxlbmRpZj59PgorCis8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6Cisge2d8ZnJvbSA8Zy5yZWNvZ25pemVyTmFtZT4gaW1wb3J0IDxnLnJlY29nbml6ZXJOYW1lPn07IHNlcGFyYXRvcj0iXG4iPgorCis8cnVsZXM6e2l0fDxydWxlQXR0cmlidXRlU2NvcGVDbGFzcyhzY29wZT1pdC5ydWxlRGVzY3JpcHRvci5ydWxlU2NvcGUpPn0+CisKK2NsYXNzIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPig8QHN1cGVyQ2xhc3NOYW1lPjxzdXBlckNsYXNzPjxAZW5kPik6CisgICAgZ3JhbW1hckZpbGVOYW1lID0gIjxmaWxlTmFtZT4iCisgICAgYXBpX3ZlcnNpb24gPSA8YXBpVmVyc2lvbigpPgorICAgIHRva2VuTmFtZXMgPSB0b2tlbk5hbWVzCisKKyAgICBkZWYgX19pbml0X18oc2VsZjxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8ZzpkZWxlZ2F0ZU5hbWUoKT59PiwgaW5wdXQsIHN0YXRlPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGlmIHN0YXRlIGlzIE5vbmU6CisgICAgICAgICAgICBzdGF0ZSA9IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpCisKKyAgICAgICAgPEBhcmdzKCk+CisgICAgICAgIHN1cGVyKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPiwgc2VsZikuX19pbml0X18oaW5wdXQsIHN0YXRlLCAqYXJncywgKiprd2FyZ3MpCisKKzxpZihtZW1vaXplKT4KKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorICAgICAgICBzZWxmLl9zdGF0ZS5ydWxlTWVtbyA9IHt9Cis8ZW5kaWY+Cis8ZW5kaWY+CisKKyAgICAgICAgPGN5Y2xpY0RGQXM6e2RmYSB8IDxjeWNsaWNERkFJbml0KGRmYSk+fTsgc2VwYXJhdG9yPSJcbiI+CisKKyAgICAgICAgPHNjb3Blczp7aXQgfCA8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZVN0YWNrKHNjb3BlPWl0KT48ZW5kaWY+fT4KKwk8cnVsZXM6e2l0IHwgPHJ1bGVBdHRyaWJ1dGVTY29wZVN0YWNrKHNjb3BlPWl0LnJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+fT4KKworICAgICAgICA8aW5pdD4KKworICAgICAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOgorICAgICAgICAge2d8c2VsZi48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICAgICAge2d8c2VsZi48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8Zy5yZWNvZ25pemVyTmFtZT4oPHRydW5jKGcuZGVsZWdhdG9ycyk6e3B8PHA6ZGVsZWdhdGVOYW1lKCk+LCB9PnNlbGYsIGlucHV0LCBzdGF0ZSl9OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGdyYW1tYXIuaW5kaXJlY3REZWxlZ2F0ZXM6CisgICAgICAgICB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8Zy5kZWxlZ2F0b3I6ZGVsZWdhdGVOYW1lKCk+LjxnOmRlbGVnYXRlTmFtZSgpPn07IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOgorICAgIAkge2d8c2VsZi5nUGFyZW50ID0gc2VsZi48ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgc2VsZi5kZWxlZ2F0ZXMgPSBbPGdyYW1tYXIuZGVsZWdhdGVzOiB7Z3xzZWxmLjxnOmRlbGVnYXRlTmFtZSgpPn07IHNlcGFyYXRvciA9ICIsICI+XQorCisJPEBpbml0PjxAZW5kPgorCisKKyAgICA8QG1lbWJlcnM+PEBlbmQ+CisKKyAgICA8bWVtYmVycz4KKworICAgIDxydWxlczsgc2VwYXJhdG9yPSJcblxuIj4KKworICAgIDwhIGdlbmVyYXRlIHJ1bGUvbWV0aG9kIGRlZmluaXRpb25zIGZvciBpbXBvcnRlZCBydWxlcyBzbyB0aGV5CisgICAgICAgYXBwZWFyIHRvIGJlIGRlZmluZWQgaW4gdGhpcyByZWNvZ25pemVyLiAhPgorICAgIDxncmFtbWFyLmRlbGVnYXRlZFJ1bGVzOntydWxlRGVzY3JpcHRvcnwgPGRlbGVnYXRlUnVsZShydWxlRGVzY3JpcHRvcik+IH07IHNlcGFyYXRvcj0iXG4iPgorCisgICAgPHN5bnByZWRzOntwIHwgPHN5bnByZWQocCk+fT4KKworICAgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorCisgICAgPGJpdHNldHM6e2l0IHwgRk9MTE9XXzxpdC5uYW1lPl9pbl88aXQuaW5OYW1lPjxpdC50b2tlbkluZGV4PiA9IGZyb3plbnNldChbPGl0LnRva2VuVHlwZXM6e2l0IHwgPGl0Pn07c2VwYXJhdG9yPSIsICI+XSk8XG4+fT4KKworPj4KKworZGVsZWdhdGVSdWxlKHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKK2RlZiA8cnVsZURlc2NyaXB0b3IubmFtZT4oc2VsZiwgPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KToKKzxcID4gICA8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPnJldHVybiA8ZW5kaWY+c2VsZi48cnVsZURlc2NyaXB0b3IuZ3JhbW1hcjpkZWxlZ2F0ZU5hbWUoKT4uPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU+fTsgc2VwYXJhdG9yPSIsICI+KQorCisKKz4+CisKK3BhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgcnVsZXMsIG51bVJ1bGVzLCBiaXRzZXRzLAorICAgICAgIEFTVExhYmVsVHlwZT0iT2JqZWN0Iiwgc3VwZXJDbGFzcz0iUGFyc2VyIiwgbGFiZWxUeXBlPSJUb2tlbiIsCisgICAgICAgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSwKKyAgICAgICBpbml0PXs8YWN0aW9ucy5wYXJzZXIuaW5pdD59CisgICAgICAgKSA6Oj0gPDwKKzxnZW5lcmljUGFyc2VyKGdyYW1tYXIsIG5hbWUsIHNjb3BlcywgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgbnVtUnVsZXMsCisgICAgICAgICAgICAgIGJpdHNldHMsICJUb2tlblN0cmVhbSIsIHN1cGVyQ2xhc3MsCisgICAgICAgICAgICAgIGxhYmVsVHlwZSwgbWVtYmVycywgIlRva2VuIiwKKyAgICAgICAgICAgICAgZmFsc2UsIGluaXQsIEFTVExhYmVsVHlwZSk+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgdHJlZSBwYXJzZXI7IHNhbWUgYXMgcGFyc2VyIGV4Y2VwdCB0aGUgaW5wdXQKKyAqICBzdHJlYW0gaXMgYSBkaWZmZXJlbnQgdHlwZS4KKyAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLCBydWxlcywKKyAgICAgICAgICAgbnVtUnVsZXMsIGJpdHNldHMsIGZpbHRlck1vZGUsIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsCisgICAgICAgICAgIHN1cGVyQ2xhc3M9ezxpZihmaWx0ZXJNb2RlKT48aWYoYnVpbGRBU1QpPlRyZWVSZXdyaXRlcjxlbHNlPlRyZWVGaWx0ZXI8ZW5kaWY+PGVsc2U+VHJlZVBhcnNlcjxlbmRpZj59LAorICAgICAgICAgICBtZW1iZXJzPXs8YWN0aW9ucy50cmVlcGFyc2VyLm1lbWJlcnM+fSwKKwkgICBpbml0PXs8YWN0aW9ucy50cmVlcGFyc2VyLmluaXQ+fQorICAgICAgICAgICApIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywKKyAgICAgICAgICAgICAgYml0c2V0cywgIlRyZWVOb2RlU3RyZWFtIiwgc3VwZXJDbGFzcywKKyAgICAgICAgICAgICAgbGFiZWxUeXBlLCBtZW1iZXJzLCAiTm9kZSIsCisgICAgICAgICAgICAgIGZpbHRlck1vZGUsIGluaXQsIEFTVExhYmVsVHlwZSk+Cis+PgorCisvKiogQSBzaW1wbGVyIHZlcnNpb24gb2YgYSBydWxlIHRlbXBsYXRlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGltYWdpbmFyeQorICogIHJ1bGVzIGNyZWF0ZWQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLiAgQXMgdGhleSBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMKKyAqICBub3IgcGFyYW1ldGVycyBldGMuLi4sIGp1c3QgZ2l2ZSBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbworICogIGFueSBvZiB0aGUgbm9ybWFsIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuCisgKiAgQXMgcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5IG5lZWQgdG8KKyAqICBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAqLworc3lucHJlZFJ1bGUocnVsZU5hbWUsIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgZGVzY3JpcHRpb24sIG5ha2VkQmxvY2spIDo6PQorPDwKKyMgJEFOVExSIHN0YXJ0ICI8cnVsZU5hbWU+IgorZGVmIDxydWxlTmFtZT5fZnJhZ21lbnQoc2VsZiwgPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KToKKyAgICA8cnVsZUxhYmVsRGVmcygpPgorPGlmKHRyYWNlKT4KKyAgICBzZWxmLnRyYWNlSW4oIjxydWxlTmFtZT5fZnJhZ21lbnQiLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KQorICAgIHRyeToKKyAgICAgICAgPGJsb2NrPgorCisgICAgZmluYWxseToKKyAgICAgICAgc2VsZi50cmFjZU91dCgiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pCisKKzxlbHNlPgorICAgIDxibG9jaz4KKzxlbmRpZj4KKyMgJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKworCis+PgorCitzeW5wcmVkKG5hbWUpIDo6PSA8PAorZGVmIDxuYW1lPihzZWxmKToKKyAgICBzZWxmLl9zdGF0ZS5iYWNrdHJhY2tpbmcgKz0gMQorICAgIDxAc3RhcnQoKT4KKyAgICBzdGFydCA9IHNlbGYuaW5wdXQubWFyaygpCisgICAgdHJ5OgorICAgICAgICBzZWxmLjxuYW1lPl9mcmFnbWVudCgpCisgICAgZXhjZXB0IEJhY2t0cmFja2luZ0ZhaWxlZDoKKyAgICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgZWxzZToKKyAgICAgICAgc3VjY2VzcyA9IFRydWUKKyAgICBzZWxmLmlucHV0LnJld2luZChzdGFydCkKKyAgICA8QHN0b3AoKT4KKyAgICBzZWxmLl9zdGF0ZS5iYWNrdHJhY2tpbmcgLT0gMQorICAgIHJldHVybiBzdWNjZXNzCisKKworPj4KKworbGV4ZXJTeW5wcmVkKG5hbWUpIDo6PSA8PAorPHN5bnByZWQobmFtZSk+Cis+PgorCitydWxlTWVtb2l6YXRpb24obmFtZSkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+CitpZiBzZWxmLl9zdGF0ZS5iYWNrdHJhY2tpbmcgPiAwIGFuZCBzZWxmLmFscmVhZHlQYXJzZWRSdWxlKHNlbGYuaW5wdXQsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOgorICAgICMgZm9yIGNhY2hlZCBmYWlsZWQgcnVsZXMsIGFscmVhZHlQYXJzZWRSdWxlIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgc3VjY2VzcyA9IFRydWUKKyAgICByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPgorCis8ZW5kaWY+Cis+PgorCisvKiogVGhpcyBydWxlIGhhcyBmYWlsZWQsIGV4aXQgaW5kaWNhdGluZyBmYWlsdXJlIGR1cmluZyBiYWNrdHJhY2sgKi8KK3J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA+IDA6CisgICAgcmFpc2UgQmFja3RyYWNraW5nRmFpbGVkCisKKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBydWxlLiAgVGhpcyBpbmNsdWRlcyBhbnkgcmV0dXJuIHR5cGUKKyAqICBkYXRhIGFnZ3JlZ2F0ZXMgcmVxdWlyZWQgZm9yIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCisgKi8KK3J1bGUocnVsZU5hbWUscnVsZURlc2NyaXB0b3IsYmxvY2ssZW1wdHlSdWxlLGRlc2NyaXB0aW9uLGV4Y2VwdGlvbnMsZmluYWxseSxtZW1vaXplKSA6Oj0gPDwKKzxyZXR1cm5TY29wZShzY29wZT1ydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZSk+CisKKyMgJEFOVExSIHN0YXJ0ICI8cnVsZU5hbWU+IgorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmRlY29yYXRlPgorZGVmIDxydWxlTmFtZT4oc2VsZiwgPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KToKKzxpZih0cmFjZSk+CisgICAgc2VsZi50cmFjZUluKCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik8XG4+Cis8ZW5kaWY+CisgICAgPHJ1bGVTY29wZVNldFVwKCk+CisgICAgPHJ1bGVEZWNsYXJhdGlvbnMoKT4KKyAgICA8cnVsZUxhYmVsRGVmcygpPgorICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgPEBwcmVhbWJsZSgpPgorICAgIDxAYm9keT48cnVsZUJvZHkoKT48QGVuZD4KKyAgICA8QHBvc3RhbWJsZSgpPgorICAgIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+CisKKyMgJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKK3J1bGVCb2R5KCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+Cis8aWYoYmFja3RyYWNraW5nKT4KK3N1Y2Nlc3MgPSBGYWxzZTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KK3RyeToKKyAgICB0cnk6CisgICAgICAgIDxydWxlTWVtb2l6YXRpb24obmFtZT1ydWxlTmFtZSk+CisgICAgICAgIDxibG9jaz4KKyAgICAgICAgPHJ1bGVDbGVhblVwKCk+CisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorCis8aWYobWVtb2l6ZSk+Cis8aWYoYmFja3RyYWNraW5nKT4KKyAgICAgICAgc3VjY2VzcyA9IFRydWU8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8aWYoZXhjZXB0aW9ucyk+CisgICAgPGV4Y2VwdGlvbnM6e2V8PGNhdGNoKGRlY2w9ZS5kZWNsLGFjdGlvbj1lLmFjdGlvbik+PFxuPn0+Cis8ZWxzZT4KKzxpZighZW1wdHlSdWxlKT4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoKT4KKyAgICA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaD4KKzxlbHNlPgorICAgIGV4Y2VwdCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgcmU6CisgICAgICAgIHNlbGYucmVwb3J0RXJyb3IocmUpCisgICAgICAgIHNlbGYucmVjb3ZlcihzZWxmLmlucHV0LCByZSkKKyAgICAgICAgPEBzZXRFcnJvclJldHVyblZhbHVlKCk+CisKKzxlbmRpZj4KKzxlbHNlPgorICAgIGZpbmFsbHk6CisgICAgICAgIHBhc3MKKworPGVuZGlmPgorPGVuZGlmPgorZmluYWxseToKKzxpZih0cmFjZSk+CisgICAgc2VsZi50cmFjZU91dCgiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pPFxuPgorPGVuZGlmPgorICAgIDxtZW1vaXplKCk+CisgICAgPHJ1bGVTY29wZUNsZWFuVXAoKT4KKyAgICA8ZmluYWxseT4KKyAgICBwYXNzCis+PgorCitjYXRjaChkZWNsLGFjdGlvbikgOjo9IDw8CitleGNlcHQgPGUuZGVjbD46CisgICAgPGUuYWN0aW9uPgorCis+PgorCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsID0gc2VsZi48cnVsZURlc2NyaXB0b3IubmFtZT5fcmV0dXJuKCkKK3JldHZhbC5zdGFydCA9IHNlbGYuaW5wdXQuTFQoMSk8XG4+Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8Cis8YS5uYW1lPiA9IDxpZihhLmluaXRWYWx1ZSk+PGEuaW5pdFZhbHVlPjxlbHNlPk5vbmU8ZW5kaWY+Cit9PgorPGVuZGlmPgorPGlmKG1lbW9pemUpPgorPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSBzZWxmLmlucHV0LmluZGV4KCkKKzxlbmRpZj4KKz4+CisKK3J1bGVTY29wZVNldFVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOntpdCB8IHNlbGYuPGl0Pl9zdGFjay5hcHBlbmQoPGl0Pl9zY29wZSgpKX07IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7aXQgfCBzZWxmLjxpdC5uYW1lPl9zdGFjay5hcHBlbmQoPGl0Lm5hbWU+X3Njb3BlKCkpfTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitydWxlU2NvcGVDbGVhblVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOntpdCB8IHNlbGYuPGl0Pl9zdGFjay5wb3AoKX07IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZTp7aXQgfCBzZWxmLjxpdC5uYW1lPl9zdGFjay5wb3AoKX07IHNlcGFyYXRvcj0iXG4iPgorPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscyxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXQgfCA8aXQubGFiZWwudGV4dD4gPSBOb25lfTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzLAorICBydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXQgfCBsaXN0XzxpdC5sYWJlbC50ZXh0PiA9IE5vbmV9OyBzZXBhcmF0b3I9IlxuIgorPgorPFtydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDpydWxlTGFiZWxEZWYoKTsgc2VwYXJhdG9yPSJcbiIKKz4KKzxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVsczp7aXQgfCA8aXQubGFiZWwudGV4dD4gPSBOb25lfTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitsZXhlclJ1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6e2l0IHwgPGl0LmxhYmVsLnRleHQ+ID0gTm9uZX07IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7aXQgfCA8aXQubGFiZWwudGV4dD4gPSBOb25lfTsgc2VwYXJhdG9yPSJcbiI+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdCisgICAgOntpdCB8IGxpc3RfPGl0LmxhYmVsLnRleHQ+ID0gTm9uZX07IHNlcGFyYXRvcj0iXG4iCis+Cis+PgorCitydWxlUmV0dXJuVmFsdWUoKSA6Oj0gPCUKKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNSZXR1cm5WYWx1ZSk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuTmFtZT4KKzxlbHNlPgorcmV0dmFsCis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxpZighVFJFRV9QQVJTRVIpPgorcmV0dmFsLnN0b3AgPSBzZWxmLmlucHV0LkxUKC0xKTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK21lbW9pemUoKSA6Oj0gPDwKKzxpZihtZW1vaXplKT4KKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgc2VsZi5fc3RhdGUuYmFja3RyYWNraW5nID4gMDoKKyAgICBzZWxmLm1lbW9pemUoc2VsZi5pbnB1dCwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PiwgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXgsIHN1Y2Nlc3MpCisKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBydWxlIGluIHRoZSBsZXhlcjsgbmFrZWQgYmxvY2tzIGFyZSB1c2VkIGZvcgorICogIGZyYWdtZW50IHJ1bGVzLgorICovCitsZXhlclJ1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxydWxlRGVzY3JpcHRvcixibG9jayxtZW1vaXplKSA6Oj0gPDwKKyMgJEFOVExSIHN0YXJ0ICI8cnVsZU5hbWU+IgorZGVmIG08cnVsZU5hbWU+KHNlbGYsIDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPik6Cis8aWYodHJhY2UpPgorICAgIHNlbGYudHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pPFxuPgorPGVuZGlmPgorICAgIDxydWxlU2NvcGVTZXRVcCgpPgorICAgIDxydWxlRGVjbGFyYXRpb25zKCk+Cis8aWYobWVtb2l6ZSk+Cis8aWYoYmFja3RyYWNraW5nKT4KKyAgICBzdWNjZXNzID0gRmFsc2U8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+CisgICAgdHJ5OgorPGlmKG5ha2VkQmxvY2spPgorICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIDxibG9jaz48XG4+Cis8ZWxzZT4KKyAgICAgICAgX3R5cGUgPSA8cnVsZU5hbWU+CisgICAgICAgIF9jaGFubmVsID0gREVGQVVMVF9DSEFOTkVMCisKKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPGxleGVyUnVsZUxhYmVsRGVmcygpPgorICAgICAgICA8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorICAgICAgICA8YmxvY2s+CisgICAgICAgIDxydWxlQ2xlYW5VcCgpPgorICAgICAgICBzZWxmLl9zdGF0ZS50eXBlID0gX3R5cGUKKyAgICAgICAgc2VsZi5fc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsCisgICAgICAgIDwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorPGVuZGlmPgorPGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CisgICAgICAgIHN1Y2Nlc3MgPSBUcnVlPFxuPgorPGVuZGlmPgorPGVuZGlmPgorCisgICAgZmluYWxseToKKzxpZih0cmFjZSk+CisgICAgICAgIHNlbGYudHJhY2VPdXQoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTxcbj4KKzxlbmRpZj4KKwk8cnVsZVNjb3BlQ2xlYW5VcCgpPgorICAgICAgICA8bWVtb2l6ZSgpPgorICAgICAgICBwYXNzCisKKyMgJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKworCis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpbXBsaWNpdGx5LWRlZmluZWQgbGV4ZXIgZ3JhbW1hciBydWxlCisgKiAgdGhhdCBjaG9vc2VzIGJldHdlZW4gbGV4ZXIgcnVsZXMuCisgKi8KK3Rva2Vuc1J1bGUocnVsZU5hbWUsbmFrZWRCbG9jayxhcmdzLGJsb2NrLHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKK2RlZiBtVG9rZW5zKHNlbGYpOgorICAgIDxibG9jaz48XG4+CisKKworPj4KKworLy8gUyBVIEIgUiBVIEwgRSBTCisKKy8qKiBBICguLi4pIHN1YnJ1bGUgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK2Jsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CithbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPG1heEFsdD4KKzxkZWNscz4KKzxAYm9keT48YmxvY2tCb2R5KCk+PEBlbmQ+Cis+PgorCitibG9ja0JvZHkoKSA6Oj0gPDwKKzxAcHJlZGVjaXNpb24oKT4KKzxAZGVjaXNpb24+PGRlY2lzaW9uPjxAZW5kPgorPEBwb3N0ZGVjaXNpb24oKT4KKzxAcHJlYnJhbmNoKCk+Cis8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksIGEpPn07IHNlcGFyYXRvcj0iXG5lbCI+Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisjIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxtYXhBbHQ+Cis8ZGVjbHM+Cis8QHByZWRlY2lzaW9uKCk+Cis8QGRlY2lzaW9uPjxkZWNpc2lvbj48QGVuZD4KKzxAcG9zdGRlY2lzaW9uKCk+Cis8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksIGEpPn07IHNlcGFyYXRvcj0iXG5lbCI+Cis+PgorCitydWxlQmxvY2tTaW5nbGVBbHQoYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorIyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgc3BlY2lhbCBjYXNlIG9mIGEgKC4uLikgc3VicnVsZSB3aXRoIGEgc2luZ2xlIGFsdGVybmF0aXZlICovCitibG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisjIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVhbHQoKT4KKzxhbHRzPgorPEBwb3N0YWx0KCk+Cis+PgorCisvKiogQSAoLi4pKyBibG9jayB3aXRoIDEgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+CitjbnQ8ZGVjaXNpb25OdW1iZXI+ID0gMAorPGRlY2xzPgorPEBwcmVsb29wKCk+Cis8QGxvb3BCb2R5PgorPHBvc2l0aXZlQ2xvc3VyZUJsb2NrTG9vcCgpPgorPEBlbmQ+Cis8QHBvc3Rsb29wKCk+Cis+PgorCitwb3NpdGl2ZUNsb3N1cmVCbG9ja0xvb3AoKSA6Oj0gPDwKK3doaWxlIFRydWU6ICNsb29wPGRlY2lzaW9uTnVtYmVyPgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PgorICAgIDxAcHJlZGVjaXNpb24oKT4KKyAgICA8QGRlY2lzaW9uQm9keT48ZGVjaXNpb24+PEBlbmQ+CisgICAgPEBwb3N0ZGVjaXNpb24oKT4KKyAgICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksIGEpPn07IHNlcGFyYXRvcj0iXG5lbCI+CisgICAgZWxzZToKKyAgICAgICAgaWYgY250PGRlY2lzaW9uTnVtYmVyPiA+PSAxOgorICAgICAgICAgICAgYnJlYWsgI2xvb3A8ZGVjaXNpb25OdW1iZXI+CisKKyAgICAgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgICAgIGVlZSA9IEVhcmx5RXhpdEV4Y2VwdGlvbig8ZGVjaXNpb25OdW1iZXI+LCBzZWxmLmlucHV0KQorICAgICAgICA8QGVhcmx5RXhpdEV4Y2VwdGlvbigpPgorICAgICAgICByYWlzZSBlZWUKKworICAgIGNudDxkZWNpc2lvbk51bWJlcj4gKz0gMQorPj4KKworcG9zaXRpdmVDbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisKKy8qKiBBICguLikqIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworY2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgPGZpbGVOYW1lPjo8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KKzxAbG9vcEJvZHk+Cis8Y2xvc3VyZUJsb2NrTG9vcCgpPgorPEBlbmQ+Cis8QHBvc3Rsb29wKCk+Cis+PgorCitjbG9zdXJlQmxvY2tMb29wKCkgOjo9IDw8Cit3aGlsZSBUcnVlOiAjbG9vcDxkZWNpc2lvbk51bWJlcj4KKyAgICBhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPG1heEFsdD4KKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPEBkZWNpc2lvbkJvZHk+PGRlY2lzaW9uPjxAZW5kPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLCBhKT59OyBzZXBhcmF0b3I9IlxuZWwiPgorICAgIGVsc2U6CisgICAgICAgIGJyZWFrICNsb29wPGRlY2lzaW9uTnVtYmVyPgorPj4KKworY2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBjbG9zdXJlQmxvY2sKKworLyoqIE9wdGlvbmFsIGJsb2NrcyAoeCk/IGFyZSB0cmFuc2xhdGVkIHRvICh4fCkgYnkgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbgorICogIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJsb2NrIHRlbXBsYXRlCisgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBIGNhc2UgaW4gYSBzd2l0Y2ggdGhhdCBqdW1wcyB0byBhbiBhbHRlcm5hdGl2ZSBnaXZlbiB0aGUgYWx0ZXJuYXRpdmUKKyAqICBudW1iZXIuICBBIERGQSBwcmVkaWN0cyB0aGUgYWx0ZXJuYXRpdmUgYW5kIHRoZW4gYSBzaW1wbGUgc3dpdGNoCisgKiAgZG9lcyB0aGUganVtcCB0byB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IG1hdGNoZXMgdGhhdCBhbHRlcm5hdGl2ZS4KKyAqLworYWx0U3dpdGNoQ2FzZShhbHROdW0sYWx0KSA6Oj0gPDwKK2lmIGFsdDxkZWNpc2lvbk51bWJlcj4gPT0gPGFsdE51bT46CisgICAgPEBwcmVhbHQoKT4KKyAgICA8YWx0PgorPj4KKworLyoqIEFuIGFsdGVybmF0aXZlIGlzIGp1c3QgYSBsaXN0IG9mIGVsZW1lbnRzOyBhdCBvdXRlcm1vc3QgbGV2ZWwgKi8KK2FsdChlbGVtZW50cyxhbHROdW0sZGVzY3JpcHRpb24sYXV0b0FTVCxvdXRlckFsdCwgdHJlZUxldmVsLHJldykgOjo9IDw8CisjIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorcGFzcyA8ISBzbyBlbXB0eSBhbHRlcm5hdGl2ZXMgYXJlIGEgdmFsaWQgYmxvY2sgIT4KKzxAZGVjbGFyYXRpb25zKCk+Cis8ZWxlbWVudHM6ZWxlbWVudCgpPgorPHJldz4KKzxAY2xlYW51cCgpPgorPj4KKworLyoqIFdoYXQgdG8gZW1pdCB3aGVuIHRoZXJlIGlzIG5vIHJld3JpdGUuICBGb3IgYXV0byBidWlsZAorICogIG1vZGUsIGRvZXMgbm90aGluZy4KKyAqLworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCisvLyBFIEwgRSBNIEUgTiBUIFMKKworLyoqIER1bXAgdGhlIGVsZW1lbnRzIG9uZSBwZXIgbGluZSAqLworZWxlbWVudChlKSA6Oj0gPDwKKzxAcHJlbWF0Y2goKT4KKzxlLmVsPjxcbj4KKz4+CisKKy8qKiBtYXRjaCBhIHRva2VuIG9wdGlvbmFsbHkgd2l0aCBhIGxhYmVsIGluIGZyb250ICovCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxpZihsYWJlbCk+PGxhYmVsPiA9IDxlbmRpZj5zZWxmLm1hdGNoKHNlbGYuaW5wdXQsIDx0b2tlbj4sIHNlbGYuRk9MTE9XXzx0b2tlbj5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KQorPj4KKworLyoqIGlkcys9SUQgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpPgorPGxpc3RMYWJlbChsYWJlbCwgbGFiZWwpPgorPj4KKworbGlzdExhYmVsKGxhYmVsLCBlbGVtKSA6Oj0gPDwKK2lmIGxpc3RfPGxhYmVsPiBpcyBOb25lOgorICAgIGxpc3RfPGxhYmVsPiA9IFtdCitsaXN0XzxsYWJlbD4uYXBwZW5kKDxlbGVtPik8XG4+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgKi8KK2NoYXJSZWYoY2hhcixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IHNlbGYuaW5wdXQuTEEoMSk8XG4+Cis8ZW5kaWY+CitzZWxmLm1hdGNoKDxjaGFyPikKKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciByYW5nZSAqLworY2hhclJhbmdlUmVmKGEsYixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IHNlbGYuaW5wdXQuTEEoMSk8XG4+Cis8ZW5kaWY+CitzZWxmLm1hdGNoUmFuZ2UoPGE+LCA8Yj4pCis+PgorCisvKiogRm9yIG5vdywgc2V0cyBhcmUgaW50ZXJ2YWwgdGVzdHMgYW5kIG11c3QgYmUgdGVzdGVkIGlubGluZSAqLworbWF0Y2hTZXQocyxsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLHBvc3RtYXRjaENvZGU9IiIpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBzZWxmLmlucHV0LkxUKDEpPFxuPgorPGVuZGlmPgoraWYgPHM+OgorICAgIHNlbGYuaW5wdXQuY29uc3VtZSgpCisgICAgPHBvc3RtYXRjaENvZGU+Cis8aWYoIUxFWEVSKT4KKyAgICBzZWxmLl9zdGF0ZS5lcnJvclJlY292ZXJ5ID0gRmFsc2U8XG4+Cis8ZW5kaWY+CisKK2Vsc2U6CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgbXNlID0gTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihOb25lLCBzZWxmLmlucHV0KQorICAgIDxAbWlzbWF0Y2hlZFNldEV4Y2VwdGlvbigpPgorPGlmKExFWEVSKT4KKyAgICBzZWxmLnJlY292ZXIobXNlKQorICAgIHJhaXNlIG1zZQorPGVsc2U+CisgICAgcmFpc2UgbXNlCisgICAgPCEgdXNlIGZvbGxvd2luZyBjb2RlIHRvIG1ha2UgaXQgcmVjb3ZlciBpbmxpbmU7IHJlbW92ZSB0aHJvdyBtc2U7CisgICAgc2VsZi5yZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoCisgICAgICAgIHNlbGYuaW5wdXQsIG1zZSwgc2VsZi5GT0xMT1dfc2V0X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4PgorICAgICAgICApCisgICAgIT4KKzxlbmRpZj4KKzxcbj4KKz4+CisKK21hdGNoUnVsZUJsb2NrU2V0IDo6PSBtYXRjaFNldAorCittYXRjaFNldEFuZExpc3RMYWJlbChzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPGxpc3RMYWJlbChsYWJlbCwgbGFiZWwpPgorPj4KKworLyoqIE1hdGNoIGEgc3RyaW5nIGxpdGVyYWwgKi8KK2xleGVyU3RyaW5nUmVmKHN0cmluZyxsYWJlbCxlbGVtZW50SW5kZXg9IjAiKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+U3RhcnQgPSBzZWxmLmdldENoYXJJbmRleCgpCitzZWxmLm1hdGNoKDxzdHJpbmc+KQorPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+ID0gc2VsZi5nZXRMaW5lKCkKKzxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PiA9IHNlbGYuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkKKzxsYWJlbD4gPSA8bGFiZWxUeXBlPihpbnB1dD1zZWxmLmlucHV0LCB0eXBlPUlOVkFMSURfVE9LRU5fVFlQRSwgY2hhbm5lbD1ERUZBVUxUX0NIQU5ORUwsIHN0YXJ0PTxsYWJlbD5TdGFydCwgc3RvcD1zZWxmLmdldENoYXJJbmRleCgpLTEpCis8bGFiZWw+LnNldExpbmUoPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+KQorPGxhYmVsPi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+KQorPGVsc2U+CitzZWxmLm1hdGNoKDxzdHJpbmc+KQorPGVuZGlmPgorPj4KKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IHNlbGYuaW5wdXQuTFQoMSk8XG4+Cis8ZW5kaWY+CitzZWxmLm1hdGNoQW55KHNlbGYuaW5wdXQpCis+PgorCit3aWxkY2FyZEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx3aWxkY2FyZCguLi4pPgorPGxpc3RMYWJlbChsYWJlbCxsYWJlbCk+Cis+PgorCisvKiogTWF0Y2ggLiB3aWxkY2FyZCBpbiBsZXhlciAqLword2lsZGNhcmRDaGFyKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD4gPSBzZWxmLmlucHV0LkxBKDEpPFxuPgorPGVuZGlmPgorc2VsZi5tYXRjaEFueSgpCis+PgorCit3aWxkY2FyZENoYXJMaXN0TGFiZWwobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8d2lsZGNhcmRDaGFyKGxhYmVsLCBlbGVtZW50SW5kZXgpPgorPGxpc3RMYWJlbChsYWJlbCwgbGFiZWwpPgorPj4KKworLyoqIE1hdGNoIGEgcnVsZSByZWZlcmVuY2UgYnkgaW52b2tpbmcgaXQgcG9zc2libHkgd2l0aCBhcmd1bWVudHMKKyAqICBhbmQgYSByZXR1cm4gdmFsdWUgb3IgdmFsdWVzLiBUaGUgJ3J1bGUnIGFyZ3VtZW50IHdhcyB0aGUKKyAqICB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93IGlzIHR5cGUgUnVsZSwgd2hvc2UgdG9TdHJpbmcgaXMKKyAqICBzYW1lOiB0aGUgcnVsZSBuYW1lLiAgTm93IHRob3VnaCB5b3UgY2FuIGFjY2VzcyBmdWxsIHJ1bGUKKyAqICBkZXNjcmlwdG9yIHN0dWZmLgorICovCitydWxlUmVmKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorc2VsZi5fc3RhdGUuZm9sbG93aW5nLmFwcGVuZChzZWxmLkZPTExPV188cnVsZS5uYW1lPl9pbl88cnVsZU5hbWU+PGVsZW1lbnRJbmRleD4pCis8aWYobGFiZWwpPjxsYWJlbD4gPSA8ZW5kaWY+c2VsZi48aWYoc2NvcGUpPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4uPGVuZGlmPjxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pPFxuPgorc2VsZi5fc3RhdGUuZm9sbG93aW5nLnBvcCgpCis+PgorCisvKiogaWRzKz1ydWxlICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSk+Cis8bGlzdExhYmVsKGxhYmVsLCBsYWJlbCk+Cis+PgorCisvKiogQSBsZXhlciBydWxlIHJlZmVyZW5jZQorICogIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZSB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93CisgKiAgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcyBzYW1lOiB0aGUgcnVsZSBuYW1lLgorICogIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK2xleGVyUnVsZVJlZihydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IHNlbGYuZ2V0Q2hhckluZGV4KCkKK3NlbGYuPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj5tPHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPikKKzxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PiA9IHNlbGYuZ2V0TGluZSgpCis8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4gPSBzZWxmLmdldENoYXJQb3NpdGlvbkluTGluZSgpCis8bGFiZWw+ID0gPGxhYmVsVHlwZT4oCisgICAgaW5wdXQ9c2VsZi5pbnB1dCwKKyAgICB0eXBlPUlOVkFMSURfVE9LRU5fVFlQRSwKKyAgICBjaGFubmVsPURFRkFVTFRfQ0hBTk5FTCwKKyAgICBzdGFydD08bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiwKKyAgICBzdG9wPXNlbGYuZ2V0Q2hhckluZGV4KCktMSkKKzxsYWJlbD4uc2V0TGluZSg8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4pCis8bGFiZWw+LnNldENoYXJQb3NpdGlvbkluTGluZSg8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4pCis8ZWxzZT4KK3NlbGYuPGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj5tPHJ1bGUubmFtZT4oPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPikKKzxlbmRpZj4KKz4+CisKKy8qKiBpKz1JTlQgaW4gbGV4ZXIgKi8KK2xleGVyUnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxsZXhlclJ1bGVSZWYocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSk+Cis8bGlzdExhYmVsKGxhYmVsLCBsYWJlbCk+Cis+PgorCisvKiogRU9GIGluIHRoZSBsZXhlciAqLworbGV4ZXJNYXRjaEVPRihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD5TdGFydDxlbGVtZW50SW5kZXg+ID0gc2VsZi5nZXRDaGFySW5kZXgoKQorPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+ID0gc2VsZi5nZXRMaW5lKCkKKzxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PiA9IHNlbGYuZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkKK3NlbGYubWF0Y2goRU9GKQorPGxhYmVsPiA9IDxsYWJlbFR5cGU+KGlucHV0PXNlbGYuaW5wdXQsIHR5cGU9RU9GLCBjaGFubmVsPURFRkFVTFRfQ0hBTk5FTCwgc3RhcnQ9PGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIHN0b3A9c2VsZi5nZXRDaGFySW5kZXgoKS0xKQorPGxhYmVsPi5zZXRMaW5lKDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PikKKzxsYWJlbD4uc2V0Q2hhclBvc2l0aW9uSW5MaW5lKDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PikKKzxlbHNlPgorc2VsZi5tYXRjaChFT0YpCis8ZW5kaWY+Cis+PgorCisvLyB1c2VkIGZvciBsZWZ0LXJlY3Vyc2l2ZSBydWxlcworcmVjUnVsZURlZkFyZygpICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIjxyZWNSdWxlQXJnKCk+IgorcmVjUnVsZUFyZygpICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIl9wIgorcmVjUnVsZUFsdFByZWRpY2F0ZShydWxlTmFtZSwgb3BQcmVjKSA6Oj0gIjxyZWNSdWxlQXJnKCk+IFw8PSA8b3BQcmVjPiIKK3JlY1J1bGVTZXRSZXN1bHRBY3Rpb24oKSAgICAgICAgICAgICAgOjo9ICJyb290XzAgPSAkPHJ1bGVOYW1lPl9wcmltYXJ5LnRyZWUiCityZWNSdWxlU2V0UmV0dXJuQWN0aW9uKHNyYywgbmFtZSkgICAgIDo6PSAiJDxuYW1lPiA9ICQ8c3JjPi48bmFtZT4iCisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyICovCit0cmVlKHJvb3QsIGFjdGlvbnNBZnRlclJvb3QsIGNoaWxkcmVuLCBudWxsYWJsZUNoaWxkTGlzdCwKKyAgICAgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorPHJvb3Q6ZWxlbWVudCgpPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmIHNlbGYuaW5wdXQuTEEoMSkgPT0gRE9XTjoKKyAgICBzZWxmLm1hdGNoKHNlbGYuaW5wdXQsIERPV04sIE5vbmUpCisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBzZWxmLm1hdGNoKHNlbGYuaW5wdXQsIFVQLCBOb25lKQorCis8ZWxzZT4KK3NlbGYubWF0Y2goc2VsZi5pbnB1dCwgRE9XTiwgTm9uZSkKKzxjaGlsZHJlbjplbGVtZW50KCk+CitzZWxmLm1hdGNoKHNlbGYuaW5wdXQsIFVQLCBOb25lKQorPGVuZGlmPgorPj4KKworLyoqIEV2ZXJ5IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdmFsaWRhdGluZyBwcmVkaWNhdGUgKGV2ZW4gd2hlbiBpdCBpcworICogIGFsc28gaG9pc3RlZCBpbnRvIGEgcHJlZGljdGlvbiBleHByZXNzaW9uKS4KKyAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2lmIG5vdCAoPGV2YWxQcmVkaWNhdGUocHJlZCwgZGVzY3JpcHRpb24pPik6CisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgcmFpc2UgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKHNlbGYuaW5wdXQsICI8cnVsZU5hbWU+IiwgIjxkZXNjcmlwdGlvbj4iKQorCis+PgorCisvLyBGIGkgeCBlIGQgIEQgRiBBICAoaWYtdGhlbi1lbHNlKQorCitkZmFTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IHNlbGYuaW5wdXQuTEEoPGs+KTxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsIj4KK2Vsc2U6Cis8aWYoZW90UHJlZGljdHNBbHQpPgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8ZW90UHJlZGljdHNBbHQ+Cis8ZWxzZT4KKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICBudmFlID0gTm9WaWFibGVBbHRFeGNlcHRpb24oIjxkZXNjcmlwdGlvbj4iLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+LCBzZWxmLmlucHV0KTxcbj4KKyAgICA8QG5vVmlhYmxlQWx0RXhjZXB0aW9uKCk+CisgICAgcmFpc2UgbnZhZTxcbj4KKzxlbmRpZj4KKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lIGxvb2thaGVhZAorICogIGZvciB0aGUgYnlwYXNzIGFsdGVybmF0aXZlLiAgSXQgZGVsYXlzIGVycm9yIGRldGVjdGlvbiBidXQgdGhpcworICogIGlzIGZhc3Rlciwgc21hbGxlciwgYW5kIG1vcmUgd2hhdCBwZW9wbGUgZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlCisgKiAgZXhwZWN0ICJpZiAoIExBKDEpPT1YICkgbWF0Y2goWCk7IiBhbmQgdGhhdCdzIGl0LgorICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBzZWxmLmlucHV0LkxBKDxrPik8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbCI+Cis+PgorCisvKiogQSBERkEgc3RhdGUgdGhhdCBpcyBhY3R1YWxseSB0aGUgbG9vcGJhY2sgZGVjaXNpb24gb2YgYSBjbG9zdXJlCisgKiAgbG9vcC4gIElmIGVuZC1vZi10b2tlbiAoRU9UKSBwcmVkaWN0cyBhbnkgb2YgdGhlIHRhcmdldHMgdGhlbiBpdAorICogIHNob3VsZCBhY3QgbGlrZSBhIGRlZmF1bHQgY2xhdXNlIChpLmUuLCBubyBlcnJvciBjYW4gYmUgZ2VuZXJhdGVkKS4KKyAqICBUaGlzIGlzIHVzZWQgb25seSBpbiB0aGUgbGV4ZXIgc28gdGhhdCBmb3IgKCdhJykqIG9uIHRoZSBlbmQgb2YgYSBydWxlCisgKiAgYW55dGhpbmcgb3RoZXIgdGhhbiAnYScgcHJlZGljdHMgZXhpdGluZy4KKyAqLworZGZhTG9vcGJhY2tTdGF0ZShrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IHNlbGYuaW5wdXQuTEEoPGs+KTxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsIj48XG4+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorPGlmKCFlZGdlcyk+CithbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PiA8ISBpZiBubyBlZGdlcywgZG9uJ3QgZ2VuIEVMU0UgIT4KKzxlbHNlPgorZWxzZToKKyAgICBhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PgorPFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEFuIGFjY2VwdCBzdGF0ZSBpbmRpY2F0ZXMgYSB1bmlxdWUgYWx0ZXJuYXRpdmUgaGFzIGJlZW4gcHJlZGljdGVkICovCitkZmFBY2NlcHRTdGF0ZShhbHQpIDo6PSAiYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxhbHQ+IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICg8bGFiZWxFeHByPikgPGlmKHByZWRpY2F0ZXMpPmFuZCAoPHByZWRpY2F0ZXM+KTxlbmRpZj46CisgICAgPHRhcmdldFN0YXRlPgorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKHN3aXRjaCBjYXNlKQorCisvKiogQSBERkEgc3RhdGUgd2hlcmUgYSBTV0lUQ0ggbWF5IGJlIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGdlbmVyYXRvcgorICogIGRlY2lkZXMgaWYgdGhpcyBpcyBwb3NzaWJsZTogQ29kZUdlbmVyYXRvci5jYW5HZW5lcmF0ZVN3aXRjaCgpLgorICovCitkZmFTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8Cis8IQorICBGSVhNRTogdGhpcyBpcyBvbmUgb2YgdGhlIGZldyBvY2Nhc2lvbiwgd2hlcmUgSSBtaXNzIGEgc3dpdGNoIHN0YXRlbWVudAorICBpbiBQeXRob24uIEFUTSB0aGlzIGlzIGltcGxlbWVudGVkIGFzIGEgbGlzdCBvZiBpZiAuLiBlbGlmIC4uCisgIFRoaXMgbWF5IGJlIHJlcGxhY2VkIGJ5IGZhc3RlciBhIGRpY3Rpb25hcnkgbG9va3VwLCB3aGVuIEkgZmluZCBhIHNvbHV0aW9uCisgIGZvciB0aGUgY2FzZXMgd2hlbiBhbiBlZGdlIGlzIG5vdCBhIHBsYWluIGRmYUFjY2VwdFN0YXRlLgorIT4KK0xBPGRlY2lzaW9uTnVtYmVyPiA9IHNlbGYuaW5wdXQuTEEoPGs+KQorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWwiPgorZWxzZToKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPiA9IDxlb3RQcmVkaWN0c0FsdD4KKzxlbHNlPgorICAgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICAgIG52YWUgPSBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiPGRlc2NyaXB0aW9uPiIsIDxkZWNpc2lvbk51bWJlcj4sIDxzdGF0ZU51bWJlcj4sIHNlbGYuaW5wdXQpPFxuPgorICAgIDxAbm9WaWFibGVBbHRFeGNlcHRpb24oKT4KKyAgICByYWlzZSBudmFlPFxuPgorPGVuZGlmPgorCis+PgorCitkZmFPcHRpb25hbEJsb2NrU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorTEE8ZGVjaXNpb25OdW1iZXI+ID0gc2VsZi5pbnB1dC5MQSg8az4pCis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbCI+Cis+PgorCitkZmFMb29wYmFja1N0YXRlU3dpdGNoKGssIGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitMQTxkZWNpc2lvbk51bWJlcj4gPSBzZWxmLmlucHV0LkxBKDxrPikKKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsIj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitlbHNlOgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj4gPSA8ZW90UHJlZGljdHNBbHQ+Cis8ZW5kaWY+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAoraWYgPGxhYmVsczp7aXQgfCBMQTxkZWNpc2lvbk51bWJlcj4gPT0gPGl0Pn07IHNlcGFyYXRvcj0iIG9yICI+OgorICAgIDx0YXJnZXRTdGF0ZT4KKz4+CisKKy8vIEMgeSBjIGwgaSBjICBEIEYgQQorCisvKiogVGhlIGNvZGUgdG8gaW5pdGlhdGUgZXhlY3V0aW9uIG9mIGEgY3ljbGljIERGQTsgdGhpcyBpcyB1c2VkCisgKiAgaW4gdGhlIHJ1bGUgdG8gcHJlZGljdCBhbiBhbHQganVzdCBsaWtlIHRoZSBmaXhlZCBERkEgY2FzZS4KKyAqICBUaGUgPG5hbWU+IGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgdmlhIHRoZSBwYXJzZXIsIGxleGVyLCAuLi4KKyAqLworZGZhRGVjaXNpb24oZGVjaXNpb25OdW1iZXIsZGVzY3JpcHRpb24pIDo6PSA8PAorYWx0PGRlY2lzaW9uTnVtYmVyPiA9IHNlbGYuZGZhPGRlY2lzaW9uTnVtYmVyPi5wcmVkaWN0KHNlbGYuaW5wdXQpCis+PgorCisvKiBEdW1wIERGQSB0YWJsZXMgYXMgcnVuLWxlbmd0aC1lbmNvZGVkIFN0cmluZ3Mgb2Ygb2N0YWwgdmFsdWVzLgorICogQ2FuJ3QgdXNlIGhleCBhcyBjb21waWxlciB0cmFuc2xhdGVzIHRoZW0gYmVmb3JlIGNvbXBpbGF0aW9uLgorICogVGhlc2Ugc3RyaW5ncyBhcmUgc3BsaXQgaW50byBtdWx0aXBsZSwgY29uY2F0ZW5hdGVkIHN0cmluZ3MuCisgKiBKYXZhIHB1dHMgdGhlbSBiYWNrIHRvZ2V0aGVyIGF0IGNvbXBpbGUgdGltZSB0aGFua2Z1bGx5LgorICogSmF2YSBjYW5ub3QgaGFuZGxlIGxhcmdlIHN0YXRpYyBhcnJheXMsIHNvIHdlJ3JlIHN0dWNrIHdpdGggdGhpcworICogZW5jb2RlL2RlY29kZSBhcHByb2FjaC4gIFNlZSBhbmFseXNpcyBhbmQgcnVudGltZSBERkEgZm9yCisgKiB0aGUgZW5jb2RpbmcgbWV0aG9kcy4KKyAqLworY3ljbGljREZBKGRmYSkgOjo9IDw8CisjIGxvb2t1cCB0YWJsZXMgZm9yIERGQSAjPGRmYS5kZWNpc2lvbk51bWJlcj4KKworREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90ID0gREZBLnVucGFjaygKKyAgICB1IjxkZmEuamF2YUNvbXByZXNzZWRFT1Q7IHdyYXA9IlwiXG4gICAgdVwiIj4iCisgICAgKQorCitERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2YgPSBERkEudW5wYWNrKAorICAgIHUiPGRmYS5qYXZhQ29tcHJlc3NlZEVPRjsgd3JhcD0iXCJcbiAgICB1XCIiPiIKKyAgICApCisKK0RGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbiA9IERGQS51bnBhY2soCisgICAgdSI8ZGZhLmphdmFDb21wcmVzc2VkTWluOyB3cmFwPSJcIlxuICAgIHVcIiI+IgorICAgICkKKworREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4ID0gREZBLnVucGFjaygKKyAgICB1IjxkZmEuamF2YUNvbXByZXNzZWRNYXg7IHdyYXA9IlwiXG4gICAgdVwiIj4iCisgICAgKQorCitERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQgPSBERkEudW5wYWNrKAorICAgIHUiPGRmYS5qYXZhQ29tcHJlc3NlZEFjY2VwdDsgd3JhcD0iXCJcbiAgICB1XCIiPiIKKyAgICApCisKK0RGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWwgPSBERkEudW5wYWNrKAorICAgIHUiPGRmYS5qYXZhQ29tcHJlc3NlZFNwZWNpYWw7IHdyYXA9IlwiXG4gICAgdVwiIj4iCisgICAgKQorCisKK0RGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb24gPSBbCisgICAgPGRmYS5qYXZhQ29tcHJlc3NlZFRyYW5zaXRpb246e3N8REZBLnVucGFjayh1IjxzOyB3cmFwPSJcIlxudVwiIj4iKX07IHNlcGFyYXRvcj0iLFxuIj4KK10KKworIyBjbGFzcyBkZWZpbml0aW9uIGZvciBERkEgIzxkZmEuZGVjaXNpb25OdW1iZXI+CisKK2NsYXNzIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+KERGQSk6CisgICAgcGFzcworCisgICAgPEBlcnJvck1ldGhvZCgpPgorCis8aWYoZGZhLnNwZWNpYWxTdGF0ZVNUcyk+CisgICAgZGVmIHNwZWNpYWxTdGF0ZVRyYW5zaXRpb24oc2VsZl8sIHMsIGlucHV0KToKKyAgICAgICAgIyBjb252aW5jZSBweWxpbnQgdGhhdCBteSBzZWxmXyBtYWdpYyBpcyBvayA7KQorICAgICAgICAjIHB5bGludDogZGlzYWJsZS1tc2c9RTAyMTMKKworICAgICAgICAjIHByZXRlbmQgd2UgYXJlIGEgbWVtYmVyIG9mIHRoZSByZWNvZ25pemVyCisgICAgICAgICMgdGh1cyBzZW1hbnRpYyBwcmVkaWNhdGVzIGNhbiBiZSBldmFsdWF0ZWQKKyAgICAgICAgc2VsZiA9IHNlbGZfLnJlY29nbml6ZXIKKworICAgICAgICBfcyA9IHMKKworICAgICAgICA8ZGZhLnNwZWNpYWxTdGF0ZVNUczp7c3RhdGUgfAoraWYgcyA9PSA8aTA+OiA8ISBjb21wcmVzc2VkIHNwZWNpYWwgc3RhdGUgbnVtYmVycyAwLi5uLTEgIT4KKyAgICA8c3RhdGU+fTsgc2VwYXJhdG9yPSJcbmVsIj4KKworPGlmKGJhY2t0cmFja2luZyk+CisgICAgICAgIGlmIHNlbGYuX3N0YXRlLmJhY2t0cmFja2luZyA+IDA6CisgICAgICAgICAgICByYWlzZSBCYWNrdHJhY2tpbmdGYWlsZWQKKworPGVuZGlmPgorICAgICAgICBudmFlID0gTm9WaWFibGVBbHRFeGNlcHRpb24oc2VsZl8uZ2V0RGVzY3JpcHRpb24oKSwgPGRmYS5kZWNpc2lvbk51bWJlcj4sIF9zLCBpbnB1dCkKKyAgICAgICAgc2VsZl8uZXJyb3IobnZhZSkKKyAgICAgICAgcmFpc2UgbnZhZTxcbj4KKzxlbmRpZj4KKworPj4KKworY3ljbGljREZBSW5pdChkZmEpIDo6PSA8PAorc2VsZi5kZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA9IHNlbGYuREZBPGRmYS5kZWNpc2lvbk51bWJlcj4oCisgICAgc2VsZiwgPGRmYS5kZWNpc2lvbk51bWJlcj4sCisgICAgZW90ID0gc2VsZi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb3QsCisgICAgZW9mID0gc2VsZi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2YsCisgICAgbWluID0gc2VsZi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9taW4sCisgICAgbWF4ID0gc2VsZi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9tYXgsCisgICAgYWNjZXB0ID0gc2VsZi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHQsCisgICAgc3BlY2lhbCA9IHNlbGYuREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbCwKKyAgICB0cmFuc2l0aW9uID0gc2VsZi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uCisgICAgKTxcbj4KKz4+CisKKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAorTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBpbnB1dC5MQSgxKTxcbj4KKzxpZihzZW1QcmVkU3RhdGUpPiA8ISBnZXQgbmV4dCBsb29rYWhlYWQgc3ltYm9sIHRvIHRlc3QgZWRnZXMsIHRoZW4gcmV3aW5kICE+CitpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LmluZGV4KCkKK2lucHV0LnJld2luZCgpPFxuPgorPGVuZGlmPgorcyA9IC0xCis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbCI+Cis8aWYoc2VtUHJlZFN0YXRlKT4gPCEgcmV0dXJuIGlucHV0IGN1cnNvciB0byBzdGF0ZSBiZWZvcmUgd2UgcmV3b3VuZCAhPgoraW5wdXQuc2VlayhpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPik8XG4+Cis8ZW5kaWY+CitpZiBzID49IDA6CisgICAgcmV0dXJuIHMKKz4+CisKKy8qKiBKdXN0IGxpa2UgYSBmaXhlZCBERkEgZWRnZSwgdGVzdCB0aGUgbG9va2FoZWFkIGFuZCBpbmRpY2F0ZSB3aGF0CisgKiAgc3RhdGUgdG8ganVtcCB0byBuZXh0IGlmIHN1Y2Nlc3NmdWwuCisgKi8KK2N5Y2xpY0RGQUVkZ2UobGFiZWxFeHByLCB0YXJnZXRTdGF0ZU51bWJlciwgZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitpZiAoPGxhYmVsRXhwcj4pPGlmKHByZWRpY2F0ZXMpPiBhbmQgKDxwcmVkaWNhdGVzPik8ZW5kaWY+OgorICAgIHMgPSA8dGFyZ2V0U3RhdGVOdW1iZXI+PFxuPgorPj4KKworLyoqIEFuIGVkZ2UgcG9pbnRpbmcgYXQgZW5kLW9mLXRva2VuOyBlc3NlbnRpYWxseSBtYXRjaGVzIGFueSBjaGFyOworICogIGFsd2F5cyBqdW1wIHRvIHRoZSB0YXJnZXQuCisgKi8KK2VvdERGQUVkZ2UodGFyZ2V0U3RhdGVOdW1iZXIsZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitzZToKKyAgICBzID0gPHRhcmdldFN0YXRlTnVtYmVyPjxcbj4KKz4+CisKKworLy8gRCBGIEEgIEUgWCBQIFIgRSBTIFMgSSBPIE4gUworCithbmRQcmVkaWNhdGVzKGxlZnQscmlnaHQpIDo6PSAiKCg8bGVmdD4pIGFuZCAoPHJpZ2h0PikpIgorCitvclByZWRpY2F0ZXMob3BlcmFuZHMpIDo6PSAiKDxmaXJzdChvcGVyYW5kcyk+PHJlc3Qob3BlcmFuZHMpOntvIHwgIG9yIDxvPn0+KSIKKworbm90UHJlZGljYXRlKHByZWQpIDo6PSAibm90ICg8ZXZhbFByZWRpY2F0ZShwcmVkLCB7fSk+KSIKKworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIig8cHJlZD4pIgorCitldmFsU3luUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSAic2VsZi48cHJlZD4oKSIKKworbG9va2FoZWFkVGVzdChhdG9tLGssYXRvbUFzSW50KSA6Oj0gIkxBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID09IDxhdG9tPiIKKworLyoqIFNvbWV0aW1lcyBhIGxvb2thaGVhZCB0ZXN0IGNhbm5vdCBhc3N1bWUgdGhhdCBMQShrKSBpcyBpbiBhIHRlbXAgdmFyaWFibGUKKyAqICBzb21ld2hlcmUuICBNdXN0IGFzayBmb3IgdGhlIGxvb2thaGVhZCBkaXJlY3RseS4KKyAqLworaXNvbGF0ZWRMb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAic2VsZi5pbnB1dC5MQSg8az4pID09IDxhdG9tPiIKKworbG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLHVwcGVyLGsscmFuZ2VOdW1iZXIsbG93ZXJBc0ludCx1cHBlckFzSW50KSA6Oj0gPCUKKyg8bG93ZXI+IFw8PSBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiBcPD0gPHVwcGVyPikKKyU+CisKK2lzb2xhdGVkTG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLHVwcGVyLGsscmFuZ2VOdW1iZXIsbG93ZXJBc0ludCx1cHBlckFzSW50KSA6Oj0gIig8bG93ZXI+IFw8PSBzZWxmLmlucHV0LkxBKDxrPikgXDw9IDx1cHBlcj4pIgorCitzZXRUZXN0KHJhbmdlcykgOjo9ICI8cmFuZ2VzOyBzZXBhcmF0b3I9XCIgb3IgXCI+IgorCisvLyBBIFQgVCBSIEkgQiBVIFQgRSBTCisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlQ2xhc3Moc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorY2xhc3MgPHNjb3BlLm5hbWU+X3Njb3BlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICA8c2NvcGUuYXR0cmlidXRlczp7aXQgfCBzZWxmLjxpdC5kZWNsPiA9IE5vbmV9OyBzZXBhcmF0b3I9IlxuIj4KKworPGVuZGlmPgorPj4KKworZ2xvYmFsQXR0cmlidXRlU2NvcGVTdGFjayhzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+CitzZWxmLjxzY29wZS5uYW1lPl9zdGFjayA9IFtdPFxuPgorPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlQ2xhc3Moc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorY2xhc3MgPHNjb3BlLm5hbWU+X3Njb3BlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICA8c2NvcGUuYXR0cmlidXRlczp7aXQgfCBzZWxmLjxpdC5kZWNsPiA9IE5vbmV9OyBzZXBhcmF0b3I9IlxuIj4KKworPGVuZGlmPgorPj4KKworcnVsZUF0dHJpYnV0ZVNjb3BlU3RhY2soc2NvcGUpIDo6PSA8PAorPGlmKHNjb3BlLmF0dHJpYnV0ZXMpPgorc2VsZi48c2NvcGUubmFtZT5fc3RhY2sgPSBbXTxcbj4KKzxlbmRpZj4KKz4+CisKK2RlbGVnYXRlTmFtZShkKSA6Oj0gPDwKKzxpZihkLmxhYmVsKT48ZC5sYWJlbD48ZWxzZT5nPGQubmFtZT48ZW5kaWY+Cis+PgorCisvKiogRGVmaW5lIGEgcnVsZSBsYWJlbCBpbmNsdWRpbmcgZGVmYXVsdCB2YWx1ZSAqLworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPDwKKzxsYWJlbC5sYWJlbC50ZXh0PiA9IE5vbmU8XG4+Cis+PgorCityZXR1cm5TdHJ1Y3ROYW1lKHIpIDo6PSAiPHIubmFtZT5fcmV0dXJuIgorCisvKiogRGVmaW5lIGEgcmV0dXJuIHN0cnVjdCBmb3IgYSBydWxlIGlmIHRoZSBjb2RlIG5lZWRzIHRvIGFjY2VzcyBpdHMKKyAqICBzdGFydC9zdG9wIHRva2VucywgdHJlZSBzdHVmZiwgYXR0cmlidXRlcywgLi4uICBMZWF2ZSBhIGhvbGUgZm9yCisgKiAgc3ViZ3JvdXBzIHRvIHN0aWNrIGluIG1lbWJlcnMuCisgKi8KK3JldHVyblNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitjbGFzcyA8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPig8aWYoVFJFRV9QQVJTRVIpPlRyZWU8ZWxzZT5QYXJzZXI8ZW5kaWY+UnVsZVJldHVyblNjb3BlKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi48cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiwgc2VsZikuX19pbml0X18oKQorCisgICAgICAgIDxzY29wZS5hdHRyaWJ1dGVzOntpdCB8IHNlbGYuPGl0LmRlY2w+ID0gTm9uZX07IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8QHJ1bGVSZXR1cm5Jbml0KCk+CisKKworICAgIDxAcnVsZVJldHVybk1lbWJlcnMoKT4KKworPGVuZGlmPgorPj4KKworcGFyYW1ldGVyU2NvcGUoc2NvcGUpIDo6PSA8PAorPHNjb3BlLmF0dHJpYnV0ZXM6e2l0IHwgPGl0LmRlY2w+fTsgc2VwYXJhdG9yPSIsICI+Cis+PgorCitwYXJhbWV0ZXJBdHRyaWJ1dGVSZWYoYXR0cikgOjo9ICI8YXR0ci5uYW1lPiIKK3BhcmFtZXRlclNldEF0dHJpYnV0ZVJlZihhdHRyLGV4cHIpIDo6PSAiPGF0dHIubmFtZT4gPSA8ZXhwcj4iCisKK3Njb3BlQXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8JQorPGlmKG5lZ0luZGV4KT4KK3NlbGYuPHNjb3BlPl9zdGFja1stPG5lZ0luZGV4Pl0uPGF0dHIubmFtZT4KKzxlbHNlPgorPGlmKGluZGV4KT4KK3NlbGYuPHNjb3BlPl9zdGFja1s8aW5kZXg+XS48YXR0ci5uYW1lPgorPGVsc2U+CitzZWxmLjxzY29wZT5fc3RhY2tbLTFdLjxhdHRyLm5hbWU+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCisvKiBub3QgYXBwbHlpbmcgcGF0Y2ggYmVjYXVzZSBvZiBidWcgaW4gYWN0aW9uIHBhcnNlciEKKworPGlmKG5lZ0luZGV4KT4KKygobGVuKHNlbGYuPHNjb3BlPl9zdGFjaykgLSA8bmVnSW5kZXg+IC0gMSkgPj0gMCBhbmQgW3NlbGYuPHNjb3BlPl9zdGFja1stPG5lZ0luZGV4Pl0uPGF0dHIubmFtZT5dIG9yIFtOb25lXSlbMF0KKzxlbHNlPgorPGlmKGluZGV4KT4KKygoPGluZGV4PiBcPCBsZW4oc2VsZi48c2NvcGU+X3N0YWNrKSkgYW5kIFtzZWxmLjxzY29wZT5fc3RhY2tbPGluZGV4Pl0uPGF0dHIubmFtZT5dIG9yIFtOb25lXSlbMF0KKzxlbHNlPgorKChsZW4oc2VsZi48c2NvcGU+X3N0YWNrKSA+IDApIGFuZCBbc2VsZi48c2NvcGU+X3N0YWNrWy0xXS48YXR0ci5uYW1lPl0gb3IgW05vbmVdKVswXQorPGVuZGlmPgorPGVuZGlmPgorCisqLworCitzY29wZVNldEF0dHJpYnV0ZVJlZihzY29wZSxhdHRyLGV4cHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8JQorPGlmKG5lZ0luZGV4KT4KKzwhRklYTUU6IHRoaXMgc2VlbXMgbm90IHRvIGJlIHVzZWQgYnkgQWN0aW9uVHJhbnNsYXRvci4uLiE+CitzZWxmLjxzY29wZT5fc3RhY2tbLTxuZWdJbmRleD5dLjxhdHRyLm5hbWU+ID0gPGV4cHI+Cis8ZWxzZT4KKzxpZihpbmRleCk+Cis8IUZJWE1FOiB0aGlzIHNlZW1zIG5vdCB0byBiZSB1c2VkIGJ5IEFjdGlvblRyYW5zbGF0b3IuLi4hPgorc2VsZi48c2NvcGU+X3N0YWNrWzxpbmRleD5dLjxhdHRyLm5hbWU+ID0gPGV4cHI+Cis8ZWxzZT4KK3NlbGYuPHNjb3BlPl9zdGFja1stMV0uPGF0dHIubmFtZT4gPSA8ZXhwcj4KKzxlbmRpZj4KKzxlbmRpZj4KKyU+CisKKy8qKiAkeCBpcyBlaXRoZXIgZ2xvYmFsIHNjb3BlIG9yIHggaXMgcnVsZSB3aXRoIGR5bmFtaWMgc2NvcGU7IHJlZmVycworICogIHRvIHN0YWNrIGl0c2VsZiBub3QgdG9wIG9mIHN0YWNrLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByZWRpY2F0ZXMKKyAqICBsaWtlIHskZnVuY3Rpb24uc2l6ZSgpPjAgJiYgJGZ1bmN0aW9uOjpuYW1lLmVxdWFscygiZm9vIil9PworICovCitpc29sYXRlZER5bmFtaWNTY29wZVJlZihzY29wZSkgOjo9ICJzZWxmLjxzY29wZT5fc3RhY2siCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorKCg8c2NvcGU+IGlzIG5vdCBOb25lKSBhbmQgWzxzY29wZT4uPGF0dHIubmFtZT5dIG9yIFtOb25lXSlbMF0KKzxlbHNlPgorPHNjb3BlPgorPGVuZGlmPgorJT4KKworcmV0dXJuQXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIpIDo6PSA8JQorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC48YXR0ci5uYW1lPgorPGVsc2U+Cis8YXR0ci5uYW1lPgorPGVuZGlmPgorJT4KKworcmV0dXJuU2V0QXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIsZXhwcikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+ID0gPGV4cHI+Cis8ZWxzZT4KKzxhdHRyLm5hbWU+ID0gPGV4cHI+Cis8ZW5kaWY+CislPgorCisvKiogSG93IHRvIHRyYW5zbGF0ZSAkdG9rZW5MYWJlbCAqLwordG9rZW5MYWJlbFJlZihsYWJlbCkgOjo9ICI8bGFiZWw+IgorCisvKiogaWRzKz1JRCB7JGlkc30gb3IgZSs9ZXhwciB7JGV9ICovCitsaXN0TGFiZWxSZWYobGFiZWwpIDo6PSAibGlzdF88bGFiZWw+IgorCisKKy8vIG5vdCBzdXJlIHRoZSBuZXh0IGFyZSB0aGUgcmlnaHQgYXBwcm9hY2g7IGFuZCB0aGV5IGFyZSBldmFsdWF0ZWQgZWFybHk7CisvLyB0aGV5IGNhbm5vdCBzZWUgVFJFRV9QQVJTRVIgb3IgUEFSU0VSIGF0dHJpYnV0ZXMgZm9yIGV4YW1wbGUuIDooCisKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi50ZXh0IgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LnR5cGUiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4ubGluZSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+LmNoYXJQb3NpdGlvbkluTGluZSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5jaGFubmVsIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5pbmRleCIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPl90cmVlIgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4uc3RhcnQiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiPHNjb3BlPi5zdG9wIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyKSA6Oj0gIjxzY29wZT4udHJlZSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDwlCis8aWYoVFJFRV9QQVJTRVIpPgorKCg8c2NvcGU+IGlzIG5vdCBOb25lKSBhbmQgW3NlbGYuaW5wdXQuZ2V0VG9rZW5TdHJlYW0oKS50b1N0cmluZygKKyAgICBzZWxmLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KDxzY29wZT4uc3RhcnQpLAorICAgIHNlbGYuaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0b3BJbmRleCg8c2NvcGU+LnN0YXJ0KQorICAgICldIG9yIFtOb25lXSlbMF0KKzxlbHNlPgorKCg8c2NvcGU+IGlzIG5vdCBOb25lKSBhbmQgW3NlbGYuaW5wdXQudG9TdHJpbmcoPHNjb3BlPi5zdGFydCw8c2NvcGU+LnN0b3ApXSBvciBbTm9uZV0pWzBdCis8ZW5kaWY+CislPgorcnVsZUxhYmVsUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICIoKDxzY29wZT4gaXMgbm90IE5vbmUpIGFuZCBbPHNjb3BlPi5zdF0gb3IgW05vbmVdKVswXSIKKworLyoqIElzb2xhdGVkICRSVUxFIHJlZiBvayBpbiBsZXhlciBhcyBpdCdzIGEgVG9rZW4gKi8KK2xleGVyUnVsZUxhYmVsKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0gIigoPHNjb3BlPiBpcyBub3QgTm9uZSkgYW5kIFs8c2NvcGU+LnR5cGVdIG9yIFswXSlbMF0iCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICIoKDxzY29wZT4gaXMgbm90IE5vbmUpIGFuZCBbPHNjb3BlPi5saW5lXSBvciBbMF0pWzBdIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICIoKDxzY29wZT4gaXMgbm90IE5vbmUpIGFuZCBbPHNjb3BlPi5jaGFyUG9zaXRpb25JbkxpbmVdIG9yIFswXSlbMF0iCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICIoKDxzY29wZT4gaXMgbm90IE5vbmUpIGFuZCBbPHNjb3BlPi5jaGFubmVsXSBvciBbMF0pWzBdIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIigoPHNjb3BlPiBpcyBub3QgTm9uZSkgYW5kIFs8c2NvcGU+LmluZGV4XSBvciBbMF0pWzBdIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiKCg8c2NvcGU+IGlzIG5vdCBOb25lKSBhbmQgWzxzY29wZT4udGV4dF0gb3IgW05vbmVdKVswXSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiKCg8c2NvcGU+IGlzIG5vdCBOb25lKSBhbmQgW2ludCg8c2NvcGU+LnRleHQpXSBvciBbMF0pWzBdIgorCisvLyBTb21lYm9keSBtYXkgcmVmICR0ZW1wbGF0ZSBvciAkdHJlZSBvciAkc3RvcCB3aXRoaW4gYSBydWxlOgorcnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLnN0YXJ0IgorcnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICJyZXR2YWwuc3RvcCIgLy9tbW0uLi4gb3IgaW5wdXQuTFQoLTEpPz8KK3J1bGVQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAicmV0dmFsLnRyZWUiCitydWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gInNlbGYuaW5wdXQudG9TdHJpbmcocmV0dmFsLnN0YXJ0LCBzZWxmLmlucHV0LkxUKC0xKSkiCitydWxlUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICJyZXR2YWwuc3QiCisKK2xleGVyUnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9ICJzZWxmLnRleHQiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLGF0dHIpIDo6PSAiX3R5cGUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PSAic2VsZi5fc3RhdGUudG9rZW5TdGFydExpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICJzZWxmLl9zdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsYXR0cikgOjo9ICItMSIgLy8gdW5kZWZpbmVkIHRva2VuIGluZGV4IGluIGxleGVyCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiX2NoYW5uZWwiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gInNlbGYuX3N0YXRlLnRva2VuU3RhcnRDaGFySW5kZXgiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLGF0dHIpIDo6PSAiKHNlbGYuZ2V0Q2hhckluZGV4KCktMSkiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9ICJpbnQoPHNjb3BlPi50ZXh0KSIKKworLy8gc2V0dGluZyAkc3QgYW5kICR0cmVlIGlzIGFsbG93ZWQgaW4gbG9jYWwgcnVsZS4gZXZlcnl0aGluZyBlbHNlCisvLyBpcyBmbGFnZ2VkIGFzIGVycm9yCitydWxlU2V0UHJvcGVydHlSZWZfdHJlZShzY29wZSxhdHRyLGV4cHIpIDo6PSAicmV0dmFsLnRyZWUgPTxleHByPiIKK3J1bGVTZXRQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyLGV4cHIpIDo6PSAicmV0dmFsLnN0ID08ZXhwcj4iCisKKworLyoqIEhvdyB0byBleGVjdXRlIGFuIGFjdGlvbiAob25seSB3aGVuIG5vdCBiYWNrdHJhY2tpbmcpICovCitleGVjQWN0aW9uKGFjdGlvbikgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGUpPgoraWYgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT46CisgICAgcGFzcworICAgIDxhY3Rpb24+CisKKzxlbHNlPgoraWYgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT46CisgICAgcGFzcworICAgIDxhY3Rpb24+CisKKzxlbmRpZj4KKzxlbHNlPgorI2FjdGlvbiBzdGFydAorPGFjdGlvbj4KKyNhY3Rpb24gZW5kCis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGFsd2F5cyBleGVjdXRlIGFuIGFjdGlvbiBldmVuIHdoZW4gYmFja3RyYWNraW5nICovCitleGVjRm9yY2VkQWN0aW9uKGFjdGlvbikgOjo9ICI8YWN0aW9uPiIKKworCisvLyBNIEkgUyBDIChwcm9wZXJ0aWVzLCBldGMuLi4pCisKK2NvZGVGaWxlRXh0ZW5zaW9uKCkgOjo9ICIucHkiCisKK3RydWVfdmFsdWUoKSA6Oj0gIlRydWUiCitmYWxzZV92YWx1ZSgpIDo6PSAiRmFsc2UiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9TVC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1B5dGhvbi9TVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNWUxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUHl0aG9uL1NULnN0ZwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKiogVGVtcGxhdGUgc3ViZ3JvdXAgdG8gYWRkIHRlbXBsYXRlIHJld3JpdGUgb3V0cHV0CisgKiAgSWYgZGVidWdnaW5nLCB0aGVuIHlvdSdsbCBhbHNvIGdldCBTVERiZy5zdGcgbG9hZGVkLgorICovCisKK0BvdXRwdXRGaWxlLmltcG9ydHMoKSA6Oj0gPDwKKzxAc3VwZXIuaW1wb3J0cygpPgoraW1wb3J0IHN0cmluZ3RlbXBsYXRlMworPj4KKworLyoqIEFkZCB0aGlzIHRvIGVhY2ggcnVsZSdzIHJldHVybiB2YWx1ZSBzdHJ1Y3QgKi8KK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuSW5pdCgpIDo6PSA8PAorc2VsZi5zdCA9IE5vbmUKKz4+CisKK0ByZXR1cm5TY29wZS5ydWxlUmV0dXJuTWVtYmVycygpIDo6PSA8PAorZGVmIGdldFRlbXBsYXRlKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnN0CisKK2RlZiB0b1N0cmluZyhzZWxmKToKKyAgICBpZiBzZWxmLnN0IGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gc2VsZi5zdC50b1N0cmluZygpCisgICAgcmV0dXJuIE5vbmUKK19fc3RyX18gPSB0b1N0cmluZworCis+PgorCitAZ2VuZXJpY1BhcnNlci5pbml0KCkgOjo9IDw8Cis8QHN1cGVyLmluaXQoKT4KK3NlbGYudGVtcGxhdGVMaWIgPSBzdHJpbmd0ZW1wbGF0ZTMuU3RyaW5nVGVtcGxhdGVHcm91cCgKKyAgICAnPG5hbWU+VGVtcGxhdGVzJywgbGV4ZXI9J2FuZ2xlLWJyYWNrZXQnCisgICAgKQorCis+PgorCitAZ2VuZXJpY1BhcnNlci5tZW1iZXJzKCkgOjo9IDw8Cis8QHN1cGVyLm1lbWJlcnMoKT4KK2RlZiBzZXRUZW1wbGF0ZUxpYihzZWxmLCB0ZW1wbGF0ZUxpYik6CisgICAgc2VsZi50ZW1wbGF0ZUxpYiA9IHRlbXBsYXRlTGliCisKK2RlZiBnZXRUZW1wbGF0ZUxpYihzZWxmKToKKyAgICByZXR1cm4gc2VsZi50ZW1wbGF0ZUxpYgorCis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD10ZW1wbGF0ZSAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGxhYmVsLCB7PGxhYmVsPi5zdH0pPgorPj4KKworcmV3cml0ZVRlbXBsYXRlKGFsdHMpIDo6PSA8PAorIyBURU1QTEFURSBSRVdSSVRFCis8aWYoYmFja3RyYWNraW5nKT4KK2lmIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+OgorICAgIDxmaXJzdChhbHRzKTpyZXdyaXRlVGVtcGxhdGVBbHRGaXJzdCgpPgorICAgIDxyZXN0KGFsdHMpOntpdCB8IGVsPHJld3JpdGVUZW1wbGF0ZUFsdChpdCk+fT4KKyAgICA8aWYocmV3cml0ZU1vZGUpPjxyZXBsYWNlVGV4dEluTGluZSgpPjxlbmRpZj4KKworPGVsc2U+Cis8Zmlyc3QoYWx0cyk6cmV3cml0ZVRlbXBsYXRlQWx0Rmlyc3QoKT4KKzxyZXN0KGFsdHMpOntpdCB8IGVsPHJld3JpdGVUZW1wbGF0ZUFsdChpdCk+fT4KKzxpZihyZXdyaXRlTW9kZSk+PHJlcGxhY2VUZXh0SW5MaW5lKCk+PGVuZGlmPgorPGVuZGlmPgorPj4KKworcmVwbGFjZVRleHRJbkxpbmUoKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CitzZWxmLmlucHV0LmdldFRva2VuU3RyZWFtKCkucmVwbGFjZSgKKyAgICBzZWxmLmlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5zdGFydCksCisgICAgc2VsZi5pbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFRva2VuU3RvcEluZGV4KHJldHZhbC5zdGFydCksCisgICAgcmV0dmFsLnN0CisgICAgKQorPGVsc2U+CitzZWxmLmlucHV0LnJlcGxhY2UoCisgICAgcmV0dmFsLnN0YXJ0LmdldFRva2VuSW5kZXgoKSwKKyAgICBzZWxmLmlucHV0LkxUKC0xKS5nZXRUb2tlbkluZGV4KCksCisgICAgcmV0dmFsLnN0CisgICAgKQorPGVuZGlmPgorPj4KKworcmV3cml0ZVRlbXBsYXRlQWx0Rmlyc3QoYWx0KSA6Oj0gPDwKKzxpZihhbHQucHJlZCk+CitpZiA8YWx0LnByZWQ+OgorICAgICMgPGFsdC5kZXNjcmlwdGlvbj4KKyAgICByZXR2YWwuc3QgPSA8YWx0LmFsdD4KKzxcbj4KKzxlbHNlPgorIyA8YWx0LmRlc2NyaXB0aW9uPgorcmV0dmFsLnN0ID0gPGFsdC5hbHQ+Cis8XG4+Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlVGVtcGxhdGVBbHQoYWx0KSA6Oj0gPDwKKzxpZihhbHQucHJlZCk+aWYgPGFsdC5wcmVkPjoKKyAgICAjIDxhbHQuZGVzY3JpcHRpb24+CisgICAgcmV0dmFsLnN0ID0gPGFsdC5hbHQ+Cis8XG4+Cis8ZWxzZT5zZToKKyAgICAjIDxhbHQuZGVzY3JpcHRpb24+CisgICAgcmV0dmFsLnN0ID0gPGFsdC5hbHQ+Cis8XG4+Cis8ZW5kaWY+Cis+PgorCityZXdyaXRlRW1wdHlUZW1wbGF0ZShhbHRzKSA6Oj0gPDwKK05vbmUKKz4+CisKKy8qKiBJbnZva2UgYSB0ZW1wbGF0ZSB3aXRoIGEgc2V0IG9mIGF0dHJpYnV0ZSBuYW1lL3ZhbHVlIHBhaXJzLgorICogIFNldCB0aGUgdmFsdWUgb2YgdGhlIHJ1bGUncyB0ZW1wbGF0ZSAqYWZ0ZXIqIGhhdmluZyBzZXQKKyAqICB0aGUgYXR0cmlidXRlcyBiZWNhdXNlIHRoZSBydWxlJ3MgdGVtcGxhdGUgbWlnaHQgYmUgdXNlZCBhcworICogIGFuIGF0dHJpYnV0ZSB0byBidWlsZCBhIGJpZ2dlciB0ZW1wbGF0ZTsgeW91IGdldCBhIHNlbGYtZW1iZWRkZWQKKyAqICB0ZW1wbGF0ZS4KKyAqLworcmV3cml0ZUV4dGVybmFsVGVtcGxhdGUobmFtZSxhcmdzKSA6Oj0gPCUKK3NlbGYudGVtcGxhdGVMaWIuZ2V0SW5zdGFuY2VPZigiPG5hbWU+IjxpZihhcmdzKT4sIGF0dHJpYnV0ZXM9ezxhcmdzOnthIHwgIjxhLm5hbWU+IjogPGEudmFsdWU+fTsgc2VwYXJhdG9yPSIsICI+fTxlbmRpZj4pCislPgorCisvKiogZXhwciBpcyBhIHN0cmluZyBleHByZXNzaW9uIHRoYXQgc2F5cyB3aGF0IHRlbXBsYXRlIHRvIGxvYWQgKi8KK3Jld3JpdGVJbmRpcmVjdFRlbXBsYXRlKGV4cHIsYXJncykgOjo9IDwlCitzZWxmLnRlbXBsYXRlTGliLmdldEluc3RhbmNlT2YoPGV4cHI+PGlmKGFyZ3MpPiwgYXR0cmlidXRlcz17PGFyZ3M6e2EgfCAiPGEubmFtZT4iOiA8YS52YWx1ZT59OyBzZXBhcmF0b3I9IiwgIj59PGVuZGlmPikKKyU+CisKKy8qKiBJbnZva2UgYW4gaW5saW5lIHRlbXBsYXRlIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMgKi8KK3Jld3JpdGVJbmxpbmVUZW1wbGF0ZShhcmdzLCB0ZW1wbGF0ZSkgOjo9IDwlCitzdHJpbmd0ZW1wbGF0ZTMuU3RyaW5nVGVtcGxhdGUoIjx0ZW1wbGF0ZT4iLCBncm91cD1zZWxmLnRlbXBsYXRlTGliPGlmKGFyZ3MpPiwgYXR0cmlidXRlcz17PGFyZ3M6e2EgfCAiPGEubmFtZT4iOiA8YS52YWx1ZT59OyBzZXBhcmF0b3I9IiwgIj59PGVuZGlmPikKKyU+CisKKy8qKiBwbGFpbiAtPiB7Zm9vfSBhY3Rpb24gKi8KK3Jld3JpdGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKKzxhY3Rpb24+Cis+PgorCisvKiogQW4gYWN0aW9uIGhhcyAlc3QuYXR0ck5hbWU9ZXhwcjsgb3IgJXtzdH0uYXR0ck5hbWU9ZXhwcjsgKi8KK2FjdGlvblNldEF0dHJpYnV0ZShzdCxhdHRyTmFtZSxleHByKSA6Oj0gPDwKKyg8c3Q+KVsiPGF0dHJOYW1lPiJdID0gPGV4cHI+Cis+PgorCisvKiogVHJhbnNsYXRlICV7c3RyaW5nRXhwcn0gKi8KK2FjdGlvblN0cmluZ0NvbnN0cnVjdG9yKHN0cmluZ0V4cHIpIDo6PSA8PAorc3RyaW5ndGVtcGxhdGUzLlN0cmluZ1RlbXBsYXRlKDxzdHJpbmdFeHByPiwgZ3JvdXA9c2VsZi50ZW1wbGF0ZUxpYikKKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvQVNULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9BU1Quc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzJhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvQVNULnN0ZwpAQCAtMCwwICsxLDMyNyBAQAorQHBhcnNlckJvZHkubWl4aW5zKCkgOjo9IDw8Cis8QHN1cGVyLm1peGlucygpPgoraW5jbHVkZSBBTlRMUjM6OkFTVEJ1aWxkZXIKKz4+CisKK2dhdGVkQWN0aW9uKGJsb2NrKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgoraWYgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4KKyAgPGJsb2NrPgorZW5kCis8ZWxzZT4KKzxibG9jaz4KKzxlbmRpZj4KKz4+CisKK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxzdXBlci5ydWxlRGVjbGFyYXRpb25zKCk+Cityb290XzAgPSBuaWw8XG4+Cis+PgorCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8c3VwZXIucnVsZUxhYmVsRGVmcygpPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMYWJlbHMscnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHNdCisgICAgOntpbnQgfHRyZWVfZm9yXzxpdC5sYWJlbC50ZXh0PiA9IG5pbH07IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLmFsbFRva2VuUmVmc0luQWx0c1dpdGhSZXdyaXRlcworICAgIDp7aW50IHxzdHJlYW1fPGl0PiA9IEFOVExSMzo6QVNUOjpSZXdyaXRlUnVsZTxyZXdyaXRlRWxlbWVudFR5cGU+U3RyZWFtLm5ldyggQGFkYXB0b3IsICJ0b2tlbiA8aXQ+IiApfTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IuYWxsUnVsZVJlZnNJbkFsdHNXaXRoUmV3cml0ZXMKKyAgICA6e2ludCB8c3RyZWFtXzxpdD4gPSBBTlRMUjM6OkFTVDo6UmV3cml0ZVJ1bGVTdWJ0cmVlU3RyZWFtLm5ldyggQGFkYXB0b3IsICJydWxlIDxpdD4iICl9OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK2FsdChlbGVtZW50cyxhbHROdW0sZGVzY3JpcHRpb24sYXV0b0FTVCxvdXRlckFsdCx0cmVlTGV2ZWwscmV3KSA6Oj0gPDwKKzxpZihhdXRvQVNUKT48aWYob3V0ZXJBbHQpPjxpZighcmV3cml0ZU1vZGUpPgorcm9vdF8wID0gQGFkYXB0b3IuY3JlYXRlX2ZsYXRfbGlzdDxcbj48XG4+Cis8ZW5kaWY+PGVuZGlmPjxlbmRpZj4KKyMgYXQgbGluZSA8ZGVzY3JpcHRpb24+Cis8ZWxlbWVudHM6ZWxlbWVudCgpPjxyZXc+Cis+PgorCit0b2tlblJlZlRyYWNrKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmQmFuZyguLi4pPgorPGdhdGVkQWN0aW9uKHtzdHJlYW1fPHRva2VuPi5hZGQoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ICl9KT4KKz4+CisKK3Rva2VuUmVmVHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZUcmFjayguLi4pPgorPGFkZFRvTGlzdChlbGVtPXs8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPn0sLi4uKT4KKz4+CisKK3Rva2VuUmVmUnVsZVJvb3RUcmFjayh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx0b2tlblJlZkJhbmcoLi4uKT4KKzxnYXRlZEFjdGlvbih7c3RyZWFtXzx0b2tlbj4uYWRkKCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApfSk+Cis+PgorCit0b2tlblJlZlJ1bGVSb290VHJhY2tBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8YWRkVG9MaXN0KGVsZW09bGFiZWwsLi4uKT4KKz4+CisKK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8Z2F0ZWRBY3Rpb24oe3N0cmVhbV88cnVsZS5uYW1lPi5hZGQoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWUgKX0pPgorPj4KKworcnVsZVJlZlRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZUcmFjayguLi4pPgorPGFkZFRvTGlzdChlbGVtPXs8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPi50cmVlfSwuLi4pPgorPj4KK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdCguLi4pPgorPGdhdGVkQWN0aW9uKHtzdHJlYW1fPHJ1bGUubmFtZT4uYWRkKCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPi50cmVlICl9KT4KKz4+CisKK3J1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWZSdWxlUm9vdFRyYWNrKC4uLik+Cis8YWRkVG9MaXN0KGVsZW09ezxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWV9LC4uLik+Cis+PgorCisKK3Jld3JpdGVDb2RlKGFsdHMsIGRlc2NyaXB0aW9uLAorICAgICAgICByZWZlcmVuY2VkRWxlbWVudHNEZWVwLCAvLyBBTEwgcmVmZXJlbmNlZCBlbGVtZW50cyB0byByaWdodCBvZiAtPgorICAgICAgICByZWZlcmVuY2VkVG9rZW5MYWJlbHMsCisgICAgICAgIHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHMsCisgICAgICAgIHJlZmVyZW5jZWRSdWxlTGFiZWxzLAorICAgICAgICByZWZlcmVuY2VkUnVsZUxpc3RMYWJlbHMsCisgICAgICAgIHJlZmVyZW5jZWRXaWxkY2FyZExhYmVscywKKyAgICAgICAgcmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVscywKKyAgICAgICAgcmV3cml0ZUJsb2NrTGV2ZWwsIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0KKzw8CisjIEFTVCBSZXdyaXRlCisjIGVsZW1lbnRzOiA8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDsgc2VwYXJhdG9yPSIsICI+CisjIHRva2VuIGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxhYmVsczsgc2VwYXJhdG9yPSIsICI+CisjIHJ1bGUgbGFiZWxzOiA8cmVmZXJlbmNlZFJ1bGVMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorIyB0b2tlbiBsaXN0IGxhYmVsczogPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHM7IHNlcGFyYXRvcj0iLCAiPgorIyBydWxlIGxpc3QgbGFiZWxzOiA8cmVmZXJlbmNlZFJ1bGVMaXN0TGFiZWxzOyBzZXBhcmF0b3I9IiwgIj4KKyMgd2lsZGNhcmQgbGFiZWxzOiA8W3JlZmVyZW5jZWRXaWxkY2FyZExhYmVscyxyZWZlcmVuY2VkV2lsZGNhcmRMaXN0TGFiZWxzXTsgc2VwYXJhdG9yPSIsICI+Cis8Z2F0ZWRBY3Rpb24oeworPHByZXZSdWxlUm9vdFJlZigpOyBmb3JtYXQ9ImxhYmVsIj4udHJlZSA9IHJvb3RfMAorPHJld3JpdGVDb2RlTGFiZWxzKCk+Cityb290XzAgPSBAYWRhcHRvci5jcmVhdGVfZmxhdF9saXN0Cis8Zmlyc3QoYWx0cyk6cmV3cml0ZUFsdEZpcnN0KCk7IGFuY2hvcj4KKworPHJlc3QoYWx0cyk6e2F8IGVsczxyZXdyaXRlQWx0UmVzdChhKT59OyBhbmNob3IsIHNlcGFyYXRvcj0iXG5cbiI+CisKKzwhIGlmIHRyZWUgcGFyc2VyIGFuZCByZXdyaXRlPXRydWUgIT4KKzxpZihUUkVFX1BBUlNFUik+Cis8aWYocmV3cml0ZU1vZGUpPgorPHByZXZSdWxlUm9vdFJlZigpOyBmb3JtYXQ9ImxhYmVsIj4udHJlZSA9IEBhZGFwdG9yLnJ1bGVfcG9zdF9wcm9jZXNzaW5nKCByb290XzAgKQorQGlucHV0LnJlcGxhY2VfY2hpbGRyZW4oCisgIEBhZGFwdG9yLnBhcmVudCggcmV0dXJuX3ZhbHVlLnN0YXJ0ICksCisgIEBhZGFwdG9yLmNoaWxkX2luZGV4KCByZXR1cm5fdmFsdWUuc3RhcnQgKSwKKyAgQGFkYXB0b3IuY2hpbGRfaW5kZXgoIF9sYXN0ICksCisgIHJldHVybl92YWx1ZS50cmVlCispPFxuPgorPGVuZGlmPgorPGVuZGlmPgorCis8ISBpZiBwYXJzZXIgb3IgdHJlZS1wYXJzZXIgYW5kIHJld3JpdGUhPXRydWUsIHdlIG5lZWQgdG8gc2V0IHJlc3VsdCAhPgorPGlmKCFUUkVFX1BBUlNFUik+Cis8cHJldlJ1bGVSb290UmVmKCk7IGZvcm1hdD0ibGFiZWwiPi50cmVlID0gcm9vdF8wPFxuPgorPGVsc2U+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxwcmV2UnVsZVJvb3RSZWYoKTsgZm9ybWF0PSJsYWJlbCI+LnRyZWUgPSByb290XzA8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cit9KT4KKz4+CisKK3Jld3JpdGVDb2RlTGFiZWxzKCkgOjo9IDw8Cis8cmVmZXJlbmNlZFRva2VuTGFiZWxzOgore2l0IHwgc3RyZWFtXzxpdD4gPSA8cmV3cml0ZUVsZW1lbnRUeXBlOyBmb3JtYXQ9InNuYWtlY2FzZSI+X3N0cmVhbSggInRva2VuIDxpdD4iLCA8aXQ7IGZvcm1hdD0ibGFiZWwiPiApfTsKK3NlcGFyYXRvcj0iXG4iPgorPHJlZmVyZW5jZWRUb2tlbkxpc3RMYWJlbHM6Cit7aXQgfCBzdHJlYW1fPGl0PiA9IDxyZXdyaXRlRWxlbWVudFR5cGU7IGZvcm1hdD0ic25ha2VjYXNlIj5fc3RyZWFtKCAidG9rZW4gPGl0PiIsIGxpc3Rfb2ZfPGl0OyBmb3JtYXQ9ImxhYmVsIj4gKX07CitzZXBhcmF0b3I9IlxuIj4KKzxyZWZlcmVuY2VkV2lsZGNhcmRMYWJlbHM6Cit7aXQgfCBzdHJlYW1fPGl0PiA9IHN1YnRyZWVfc3RyZWFtKCAid2lsZGNhcmQgPGl0PiIsIDxpdDsgZm9ybWF0PSJsYWJlbCI+ICl9Oworc2VwYXJhdG9yPSJcbiI+Cis8cmVmZXJlbmNlZFdpbGRjYXJkTGlzdExhYmVsczoKK3tpdCB8IHN0cmVhbV88aXQ+ID0gc3VidHJlZV9zdHJlYW0oICJ3aWxkY2FyZCA8aXQ+IiwgbGlzdF9vZl88aXQ7IGZvcm1hdD0ibGFiZWwiPiApfTsKK3NlcGFyYXRvcj0iXG4iPgorPHJlZmVyZW5jZWRSdWxlTGFiZWxzOgore2l0IHwgc3RyZWFtXzxpdD4gPSA8aXQ7IGZvcm1hdD0ibGFiZWwiPiA/IHN1YnRyZWVfc3RyZWFtKCAicnVsZSA8aXQ+IiwgPGl0OyBmb3JtYXQ9ImxhYmVsIj4udHJlZSApIDogc3VidHJlZV9zdHJlYW0oICJ0b2tlbiA8aXQ+IiApfTsKK3NlcGFyYXRvcj0iXG4iPgorPHJlZmVyZW5jZWRSdWxlTGlzdExhYmVsczoKK3tpdCB8IHN0cmVhbV88aXQ+ID0gc3VidHJlZV9zdHJlYW0oICJ0b2tlbiA8aXQ+IiwgbGlzdF9vZl88aXQ7IGZvcm1hdD0ibGFiZWwiPiApfTsKK3NlcGFyYXRvcj0iXG4iPgorPj4KKworcmV3cml0ZU9wdGlvbmFsQmxvY2soCisgICAgICAgIGFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKyAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKyAgICAgICAgZGVzY3JpcHRpb24pIDo6PQorPDwKKyMgYXQgbGluZSA8ZGVzY3JpcHRpb24+CitpZiA8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDp7ZWx8c3RyZWFtXzxlbD4uaGFzX25leHQ/fTsgc2VwYXJhdG9yPSIgfHwgIj4KKyAgPGFsdD4KK2VuZAorCis8cmVmZXJlbmNlZEVsZW1lbnRzRGVlcDp7ZWx8c3RyZWFtXzxlbD4ucmVzZXQoKTs8XG4+fT4KKz4+CisKK3Jld3JpdGVDbG9zdXJlQmxvY2soCisgICAgICAgIGFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKyAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKyAgICAgICAgZGVzY3JpcHRpb24pIDo6PQorPDwKKyMgYXQgbGluZSA8ZGVzY3JpcHRpb24+Cit3aGlsZSA8cmVmZXJlbmNlZEVsZW1lbnRzOntlbHxzdHJlYW1fPGVsPi5oYXNfbmV4dD99OyBzZXBhcmF0b3I9IiB8fCAiPgorICA8YWx0PgorZW5kCisKKzxyZWZlcmVuY2VkRWxlbWVudHM6e2VsfHN0cmVhbV88ZWw+LnJlc2V0KCk7PFxuPn0+Cis+PgorCityZXdyaXRlUG9zaXRpdmVDbG9zdXJlQmxvY2soCisgICAgICAgIGFsdCxyZXdyaXRlQmxvY2tMZXZlbCwKKyAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnRzRGVlcCwgLy8gYWxsIG5lc3RlZCByZWZzCisgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50cywgLy8gZWxlbWVudHMgaW4gaW1tZWRpYXRlbHkgYmxvY2s7IG5vIG5lc3RlZCBibG9ja3MKKyAgICAgICAgZGVzY3JpcHRpb24pIDo6PQorPDwKKyMgYXQgbGluZSA8ZGVzY3JpcHRpb24+Cis8cmVmZXJlbmNlZEVsZW1lbnRzOntlbHxzdHJlYW1fPGVsPi5oYXNfbmV4dD99OyBzZXBhcmF0b3I9IiB8fCAiPiBvciByYWlzZSBBTlRMUjM6OlJld3JpdGVFYXJseUV4aXQKKword2hpbGUgPHJlZmVyZW5jZWRFbGVtZW50czp7ZWx8c3RyZWFtXzxlbD4uaGFzX25leHQ/fTsgc2VwYXJhdG9yPSIgfHwgIj4KKyAgPGFsdD4KK2VuZAorPHJlZmVyZW5jZWRFbGVtZW50czp7ZWx8c3RyZWFtXzxlbD4ucmVzZXQ8XG4+fT4KKz4+CisKK3Jld3JpdGVBbHRSZXN0KGEpIDo6PSA8PAorPGlmKGEucHJlZCk+CitpZiA8YS5wcmVkPgorICAjIDxhLmRlc2NyaXB0aW9uPgorICA8YS5hbHQ+Cis8ZWxzZT4KK2UKKyAgIyA8YS5kZXNjcmlwdGlvbj4KKyAgPGEuYWx0PgorZW5kCis8ZW5kaWY+Cis+PgorCityZXdyaXRlQWx0Rmlyc3QoYSkgOjo9IDw8Cis8aWYoYS5wcmVkKT4KK2lmIDxhLnByZWQ+CisgICMgPGEuZGVzY3JpcHRpb24+CisgIDxhLmFsdD4KKzxlbHNlPgorIyA8YS5kZXNjcmlwdGlvbj4KKzxhLmFsdD4KKzxlbmRpZj4KKz4+CisKK3Jld3JpdGVFbXB0eUFsdCgpIDo6PSAicm9vdF8wID0gbmlsIgorCityZXdyaXRlVHJlZShyb290LGNoaWxkcmVuLGRlc2NyaXB0aW9uLGVuY2xvc2luZ1RyZWVMZXZlbCx0cmVlTGV2ZWwpIDo6PSA8PAorIyBhdCBsaW5lIDxkZXNjcmlwdGlvbj4KK3Jvb3RfPHRyZWVMZXZlbD4gPSBAYWRhcHRvci5jcmVhdGVfZmxhdF9saXN0Cis8cm9vdDpyZXdyaXRlRWxlbWVudCgpPgorPGNoaWxkcmVuOnJld3JpdGVFbGVtZW50KCk+CitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfPGVuY2xvc2luZ1RyZWVMZXZlbD4sIHJvb3RfPHRyZWVMZXZlbD4gKTxcbj4KKz4+CisKK3Jld3JpdGVFbGVtZW50TGlzdChlbGVtZW50cykgOjo9ICI8ZWxlbWVudHM6cmV3cml0ZUVsZW1lbnQoKT4iCityZXdyaXRlRWxlbWVudChlKSA6Oj0gPDwKKzxAcHJlZ2VuKCk+Cis8ZS5lbD4KKz4+CisKK3Jld3JpdGVUb2tlblJlZih0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorQGFkYXB0b3IuYWRkX2NoaWxkKCByb290Xzx0cmVlTGV2ZWw+LCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPiApPFxuPgorPj4KKworcmV3cml0ZVRva2VuTGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK0BhZGFwdG9yLmFkZF9jaGlsZCggcm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dF9ub2RlICk8XG4+Cis+PgorCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWYobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK0BhZGFwdG9yLmFkZF9jaGlsZCggcm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dF9ub2RlICk8XG4+Cis+PgorCityZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSBAYWRhcHRvci5iZWNvbWVfcm9vdCggc3RyZWFtXzxsYWJlbD4ubmV4dF9ub2RlLCByb290Xzx0cmVlTGV2ZWw+ICk8XG4+Cis+PgorCityZXdyaXRlVG9rZW5MaXN0TGFiZWxSZWZSb290IDo6PSByZXdyaXRlVG9rZW5MYWJlbFJlZlJvb3QKKworcmV3cml0ZVRva2VuUmVmUm9vdCh0b2tlbixlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLGFyZ3MpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IEBhZGFwdG9yLmJlY29tZV9yb290KCA8Y3JlYXRlUmV3cml0ZU5vZGVGcm9tRWxlbWVudCguLi4pPiwgcm9vdF88dHJlZUxldmVsPiApPFxuPgorPj4KKworcmV3cml0ZUltYWdpbmFyeVRva2VuUmVmKGFyZ3MsdG9rZW4sdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCkgOjo9IDw8CitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfPHRyZWVMZXZlbD4sIDxjcmVhdGVJbWFnaW5hcnlOb2RlKHRva2VuVHlwZT10b2tlbiwgLi4uKT4gKTxcbj4KKz4+CisKK3Jld3JpdGVJbWFnaW5hcnlUb2tlblJlZlJvb3QoYXJncyx0b2tlbix0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4KSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSBAYWRhcHRvci5iZWNvbWVfcm9vdCggPGNyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlPXRva2VuLCAuLi4pPiwgcm9vdF88dHJlZUxldmVsPiApPFxuPgorPj4KKworcmV3cml0ZUFjdGlvbihhY3Rpb24pIDo6PSA8PAorcm9vdF8wID0gKCA8YWN0aW9uPiApPFxuPgorPj4KKworcHJldlJ1bGVSb290UmVmKCkgOjo9ICJyZXR1cm5fdmFsdWUiCisKK3Jld3JpdGVSdWxlUmVmKHJ1bGUpIDo6PSA8PAorQGFkYXB0b3IuYWRkX2NoaWxkKCByb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPHJ1bGU+Lm5leHRfdHJlZSApPFxuPgorPj4KKworcmV3cml0ZVJ1bGVSZWZSb290KHJ1bGUpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IEBhZGFwdG9yLmJlY29tZV9yb290KCBzdHJlYW1fPHJ1bGU+Lm5leHRfbm9kZSwgcm9vdF88dHJlZUxldmVsPiApPFxuPgorPj4KKworcmV3cml0ZU5vZGVBY3Rpb24oYWN0aW9uKSA6Oj0gPDwKK0BhZGFwdG9yLmFkZF9jaGlsZCggcm9vdF88dHJlZUxldmVsPiwgKCA8YWN0aW9uPiApICk8XG4+Cis+PgorCityZXdyaXRlTm9kZUFjdGlvblJvb3QoYWN0aW9uKSA6Oj0gPDwKK3Jvb3RfPHRyZWVMZXZlbD4gPSBAYWRhcHRvci5iZWNvbWVfcm9vdCggKCA8YWN0aW9uPiApLCByb290Xzx0cmVlTGV2ZWw+ICk8XG4+Cis+PgorCityZXdyaXRlUnVsZUxhYmVsUmVmKGxhYmVsKSA6Oj0gPDwKK0BhZGFwdG9yLmFkZF9jaGlsZCggcm9vdF88dHJlZUxldmVsPiwgc3RyZWFtXzxsYWJlbD4ubmV4dF90cmVlICk8XG4+Cis+PgorCityZXdyaXRlUnVsZUxpc3RMYWJlbFJlZihsYWJlbCkgOjo9IDw8CitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfPHRyZWVMZXZlbD4sIHN0cmVhbV88bGFiZWw+Lm5leHRfdHJlZSApPFxuPgorPj4KKworcmV3cml0ZVJ1bGVMYWJlbFJlZlJvb3QobGFiZWwpIDo6PSA8PAorcm9vdF88dHJlZUxldmVsPiA9IEBhZGFwdG9yLmJlY29tZV9yb290KCBzdHJlYW1fPGxhYmVsPi5uZXh0X25vZGUsIHJvb3RfPHRyZWVMZXZlbD4gKTxcbj4KKz4+CisKK3Jld3JpdGVSdWxlTGlzdExhYmVsUmVmUm9vdChsYWJlbCkgOjo9IDw8Cityb290Xzx0cmVlTGV2ZWw+ID0gQGFkYXB0b3IuYmVjb21lX3Jvb3QoIHN0cmVhbV88bGFiZWw+Lm5leHRfbm9kZSwgcm9vdF88dHJlZUxldmVsPiApPFxuPgorPj4KKworcmV3cml0ZVdpbGRjYXJkTGFiZWxSZWYobGFiZWwpIDo6PSA8PAorQGFkYXB0b3IuYWRkX2NoaWxkKCByb290Xzx0cmVlTGV2ZWw+LCBzdHJlYW1fPGxhYmVsPi5uZXh0X3RyZWUgKTxcbj4KKz4+CisKK2NyZWF0ZUltYWdpbmFyeU5vZGUodG9rZW5UeXBlLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8dGVybWluYWxPcHRpb25zLm5vZGU7IGZvcm1hdD0iY29uc3RhbnRQYXRoIj4ubmV3KCBjcmVhdGVfdG9rZW4oIDx0b2tlblR5cGU+ICk8aWYoYXJncyk+LCA8YXJnczsgc2VwYXJhdG9yPSIsICI+PGVuZGlmPiApCis8ZWxzZT4KKzxpZighYXJncyk+QGFkYXB0b3IuY3JlYXRlX2Zyb21fdHlwZSggPHRva2VuVHlwZT4sICI8dG9rZW5UeXBlPiIgKQorPGVsc2U+QGFkYXB0b3IuY3JlYXRlKCA8dG9rZW5UeXBlPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPiApCis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxhcmdzKSA6Oj0gPDwKKzxpZih0ZXJtaW5hbE9wdGlvbnMubm9kZSk+Cis8dGVybWluYWxPcHRpb25zLm5vZGU7IGZvcm1hdD0iY29uc3RhbnRQYXRoIj4ubmV3KCBzdHJlYW1fPHRva2VuPi5uZXh0PGlmKGFyZ3MpPiwgPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPjxlbmRpZj4gKQorPGVsc2U+Cis8aWYoYXJncyk+Cis8aWYoIXJlc3QoYXJncykpPkBhZGFwdG9yLmNyZWF0ZV9mcm9tX3Rva2VuKCA8dG9rZW4+LCA8Zmlyc3QoYXJncyk+ICkKKzxlbHNlPjxpZighcmVzdChyZXN0KGFyZ3MpKSk+QGFkYXB0b3IuY3JlYXRlX2Zyb21fdG9rZW4oIDx0b2tlbj4sIDxmaXJzdChhcmdzKT4sIDxmaXJzdChyZXN0KGFyZ3MpKT4gKQorPGVuZGlmPgorPGVuZGlmPgorPGVsc2U+CitzdHJlYW1fPHRva2VuPi5uZXh0X25vZGUKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvQVNURGJnLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9BU1REYmcuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzA5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvQVNURGJnLnN0ZwpAQCAtMCwwICsxLDM3IEBACitAcGFyc2VyQm9keS5hZGRpdGlvbmFsTWVtYmVycygpIDo6PSA8PAorZGVmIHNlbGYucmV0dXJuX3Njb3BlX21lbWJlcnMKKyAgc3VwZXIucHVzaCggOnRyZWUgKQorZW5kCisKK2F0dHJfcmVhZGVyIDphZGFwdG9yCitkZWYgYWRhcHRvcj0oIGFkYXB0b3IgKQorICBAYWRhcHRvciA9IAorICAgIGFkYXB0b3IuaXNfYT8oIEFOVExSMzo6RGVidWc6OlRyZWVBZGFwdG9yICkgPyBhZGFwdG9yIDogCisgICAgICBBTlRMUjM6OkRlYnVnOjpUcmVlQWRhcHRvci53cmFwKCBhZGFwdG9yLCBAZGVidWdfbGlzdGVuZXIgKQorICA8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6e2d8PGc6ZGVsZWdhdGVOYW1lKCk+LmFkYXB0b3IgPSBAYWRhcHRvcn07IHNlcGFyYXRvcj0iXG4iPgorZW5kCisKK2FsaWFzIHRyZWVfYWRhcHRvciBhZGFwdG9yCithbGlhcyB0cmVlX2FkYXB0b3I9IGFkYXB0b3I9Cis+PgorCisKK2NyZWF0ZUxpc3RlbmVyQW5kSGFuZHNoYWtlKCkgOjo9IDw8CitvcHRpb25zWyA6ZGVidWdfbGlzdGVuZXIgXSB8fD0gYmVnaW4KKyAgcG9ydCA9IG9wdGlvbnNbIDpwb3J0IF0KKyAgbG9nICA9IG9wdGlvbnNbIDpsb2cgXQorICBwcm94eSA9IEFOVExSMzo6RGVidWc6OkV2ZW50U29ja2V0UHJveHkubmV3KCBzZWxmLCAKKyAgICA6YWRhcHRvciA9PiBhZGFwdG9yLAorICAgIDpsb2cgICAgID0+IGxvZywgCisgICAgOnBvcnQgICAgPT4gcG9ydAorICApCisgIHByb3h5LmhhbmRzaGFrZQorICBwcm94eQorZW5kCis+PgorCitAcGFyc2VyQ29uc3RydWN0b3IuaW5pdCgpIDo6PSAic2VsZi5hZGFwdG9yID0gYWRhcHRvciIKKworQG5ld0RlbGVnYXRlLmRlbGVnYXRlT3B0aW9ucygpIDo6PSAiLCA6YWRhcHRvciA9PiBhZGFwdG9yIgorCitAcmV3cml0ZUVsZW1lbnQucHJlZ2VuKCkgOjo9ICJAZGVidWdfbGlzdGVuZXIubG9jYXRpb24oIDxlLmxpbmU+LCA8ZS5wb3M+ICkiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvQVNUUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9BU1RQYXJzZXIuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTc4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvQVNUUGFyc2VyLnN0ZwpAQCAtMCwwICsxLDE0MyBAQAorZ2F0ZWRBY3Rpb24oYmxvY2spIDo6PSA8PAorPGlmKGJhY2t0cmFja2luZyk+CitpZiA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPgorICA8YmxvY2s+CitlbmQKKzxlbHNlPgorPGJsb2NrPgorPGVuZGlmPgorPj4KKworQHJ1bGVCb2R5LnNldEVycm9yUmV0dXJuVmFsdWUoKSA6Oj0gPDwKK3JldHVybl92YWx1ZS50cmVlID0gQGFkYXB0b3IuY3JlYXRlX2Vycm9yX25vZGUoIEBpbnB1dCwgcmV0dXJuX3ZhbHVlLnN0YXJ0LCBAaW5wdXQubG9vaygtMSksIHJlICk8XG4+Cis+PgorCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGdhdGVkQWN0aW9uKHsKK3RyZWVfZm9yXzxsYWJlbD4gPSA8Y3JlYXRlTm9kZUZyb21Ub2tlbiguLi4pPgorQGFkYXB0b3IuYWRkX2NoaWxkKCByb290XzAsIHRyZWVfZm9yXzxsYWJlbD4gKQorfSk+Cis+PgorCit0b2tlblJlZkJhbmcodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9ICI8c3VwZXIudG9rZW5SZWYoLi4uKT4iCisKK3Rva2VuUmVmUnVsZVJvb3QodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8c3VwZXIudG9rZW5SZWYoLi4uKT4KKzxnYXRlZEFjdGlvbih7Cit0cmVlX2Zvcl88bGFiZWw+ID0gPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4KK3Jvb3RfMCA9IEBhZGFwdG9yLmJlY29tZV9yb290KCB0cmVlX2Zvcl88bGFiZWw+LCByb290XzAgKQorfSk+Cis+PgorCit0b2tlblJlZkJhbmdBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWZCYW5nKC4uLik+Cis8YWRkVG9MaXN0KGVsZW09ezxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+fSwuLi4pPgorPj4KKwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCittYXRjaFNldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8c3VwZXIubWF0Y2hTZXQocG9zdG1hdGNoQ29kZT17PGdhdGVkQWN0aW9uKHtAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfMCwgPGNyZWF0ZU5vZGVGcm9tVG9rZW4oLi4uKT4gKX0pPn0sIC4uLik+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSx0cmVlTGV2ZWw9IjAiKSA6Oj0gPDwKKzxtYXRjaFNldCguLi4pPgorPj4KKworCisKK21hdGNoU2V0QmFuZyhzLGxhYmVsLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gIjxzdXBlci5tYXRjaFNldCguLi4pPiIKK21hdGNoU2V0UnVsZVJvb3QocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LGRlYnVnKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiA9IEBpbnB1dC5sb29rPFxuPgorPGVuZGlmPgorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9ezxnYXRlZEFjdGlvbih7cm9vdF8wID0gQGFkYXB0b3IuYmVjb21lX3Jvb3QoIDxjcmVhdGVOb2RlRnJvbVRva2VuKC4uLik+LCByb290XzAgKX0pPn0sIC4uLik+Cis+PgorbWF0Y2hTZXRSdWxlUm9vdEFuZExpc3RMYWJlbChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgsZGVidWcpIDo6PSA8PAorPG1hdGNoU2V0UnVsZVJvb3QoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCisKKworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8Z2F0ZWRBY3Rpb24oe0BhZGFwdG9yLmFkZF9jaGlsZCggcm9vdF8wLCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPi50cmVlICl9KT4KKz4+CisKKworCitydWxlUmVmQmFuZyhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gIjxzdXBlci5ydWxlUmVmKC4uLik+IgorCisKKworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxnYXRlZEFjdGlvbih7cm9vdF8wID0gQGFkYXB0b3IuYmVjb21lX3Jvb3QoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWUsIHJvb3RfMCApfSk+Cis+PgorCisKKworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8YWRkVG9MaXN0KGVsZW09ezxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWV9LC4uLik+Cis+PgorCisKKworcnVsZVJlZkJhbmdBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZkJhbmcoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4udHJlZX0sLi4uKT4KKz4+CisKKworCitydWxlUmVmUnVsZVJvb3RBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZlJ1bGVSb290KC4uLik+Cis8YWRkVG9MaXN0KGVsZW09ezxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWV9LC4uLik+Cis+PgorCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGdhdGVkQWN0aW9uKHsKK3RyZWVfZm9yXzxsYWJlbD4gPSBAYWRhcHRvci5jcmVhdGVfd2l0aF9wYXlsb2FkKCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApCitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfMCwgdHJlZV9mb3JfPGxhYmVsPiApCit9KT4KKz4+CisKK3dpbGRjYXJkQmFuZyh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gIjxzdXBlci53aWxkY2FyZCguLi4pPiIKKword2lsZGNhcmRSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGdhdGVkQWN0aW9uKHsKK3RyZWVfZm9yXzxsYWJlbD4gPSBAYWRhcHRvci5jcmVhdGVfd2l0aF9wYXlsb2FkKCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApCityb290XzAgPSBAYWRhcHRvci5iZWNvbWVfcm9vdCggdHJlZV9mb3JfPGxhYmVsPiwgcm9vdF8wICkKK30pPgorPj4KKworY3JlYXRlTm9kZUZyb21Ub2tlbihsYWJlbCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KKzx0ZXJtaW5hbE9wdGlvbnMubm9kZTsgZm9ybWF0PSJjb25zdGFudFBhdGgiPi5uZXcoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ICkKKzxlbHNlPgorQGFkYXB0b3IuY3JlYXRlX3dpdGhfcGF5bG9hZCggPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gKQorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxzdXBlci5ydWxlQ2xlYW5VcCgpPgorPGdhdGVkQWN0aW9uKHsKK3JldHVybl92YWx1ZS50cmVlID0gQGFkYXB0b3IucnVsZV9wb3N0X3Byb2Nlc3NpbmcoIHJvb3RfMCApCitAYWRhcHRvci5zZXRfdG9rZW5fYm91bmRhcmllcyggcmV0dXJuX3ZhbHVlLnRyZWUsIHJldHVybl92YWx1ZS5zdGFydCwgcmV0dXJuX3ZhbHVlLnN0b3AgKQorfSk+Cis+PgorCisKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9BU1RUcmVlUGFyc2VyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9BU1RUcmVlUGFyc2VyLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDkzOGNkCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9SdWJ5L0FTVFRyZWVQYXJzZXIuc3RnCkBAIC0wLDAgKzEsMjQxIEBACitnYXRlZEFjdGlvbihibG9jaykgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+CisgIDxibG9jaz4KK2VuZAorPGVsc2U+Cis8YmxvY2s+Cis8ZW5kaWY+Cis+PgorCitydWxlRGVjbGFyYXRpb25zKCkgOjo9IDw8Cis8c3VwZXIucnVsZURlY2xhcmF0aW9ucygpPgorX2xhc3QgPSBfZmlyc3RfMCA9IG5pbDxcbj4KKz4+CisKK25vUmV3cml0ZShyZXdyaXRlQmxvY2tMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKKzxnYXRlZEFjdGlvbih7Cis8aWYocmV3cml0ZU1vZGUpPgorcmV0dXJuX3ZhbHVlLnRyZWUgPSBfZmlyc3RfMAoraWYgQGFkYXB0b3IucGFyZW50KCByZXR1cm5fdmFsdWUudHJlZSApICYmIEBhZGFwdG9yLmZsYXRfbGlzdD8oIEBhZGFwdG9yLnBhcmVudCggcmV0dXJuX3ZhbHVlLnRyZWUgKSApCisgIHJldHVybl92YWx1ZS50cmVlID0gQGFkYXB0b3IucGFyZW50KCByZXR1cm5fdmFsdWUudHJlZSApCitlbmQKKzxlbmRpZj4KK30pPgorPj4KKwordHJlZShyb290LCBhY3Rpb25zQWZ0ZXJSb290LCBjaGlsZHJlbiwgbnVsbGFibGVDaGlsZExpc3QsCisgICAgIGVuY2xvc2luZ1RyZWVMZXZlbCwgdHJlZUxldmVsKSA6Oj0gPDwKK19zYXZlX2xhc3RfPHRyZWVMZXZlbD4gPSBfbGFzdCA9IEBpbnB1dC5sb29rCitfZmlyc3RfPHRyZWVMZXZlbD4gPSBuaWwKKzxpZighcmV3cml0ZU1vZGUpPgorcm9vdF88dHJlZUxldmVsPiA9IEBhZGFwdG9yLmNyZWF0ZV9mbGF0X2xpc3Q8XG4+Cis8ZW5kaWY+Cis8cm9vdDplbGVtZW50KCk+Cis8aWYocmV3cml0ZU1vZGUpPgorPGdhdGVkQWN0aW9uKHsKKzxpZihyb290LmVsLnJ1bGUpPgorX2ZpcnN0XzxlbmNsb3NpbmdUcmVlTGV2ZWw+IHx8PSA8cm9vdC5lbC5sYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWU8XG4+Cis8ZWxzZT4KK19maXJzdF88ZW5jbG9zaW5nVHJlZUxldmVsPiB8fD0gPHJvb3QuZWwubGFiZWw7IGZvcm1hdD0ibGFiZWwiPjxcbj4KKzxlbmRpZj4KK30pPgorPGVuZGlmPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmIEBpbnB1dC5wZWVrID09IERPV04KKyAgbWF0Y2goIERPV04sIG5pbCApCisgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgIG1hdGNoKCBVUCwgbmlsICkKK2VuZDxcbj4KKzxlbHNlPgorbWF0Y2goIERPV04sIG5pbCApCis8Y2hpbGRyZW46ZWxlbWVudCgpPgorbWF0Y2goIFVQLCBuaWwgKTxcbj4KKzxlbmRpZj4KKzxpZighcmV3cml0ZU1vZGUpPgorQGFkYXB0b3IuYWRkX2NoaWxkKCByb290XzxlbmNsb3NpbmdUcmVlTGV2ZWw+LCByb290Xzx0cmVlTGV2ZWw+ICk8XG4+Cis8ZW5kaWY+CitfbGFzdCA9IF9zYXZlX2xhc3RfPHRyZWVMZXZlbD4KKworPj4KKwordG9rZW5SZWZCYW5nKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorX2xhc3QgPSBAaW5wdXQubG9vaworPHN1cGVyLnRva2VuUmVmKC4uLik+Cis+PgorCit0b2tlblJlZih0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8Z2F0ZWRBY3Rpb24oeworPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK3RyZWVfZm9yXzxsYWJlbD4gPSA8dGVybWluYWxPcHRpb25zLm5vZGU7IGZvcm1hdD0iY29uc3RhbnRQYXRoIj4ubmV3KCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApCis8ZWxzZT4KK3RyZWVfZm9yXzxsYWJlbD4gPSBAYWRhcHRvci5jb3B5X25vZGUoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ICkKKzxlbmRpZj48XG4+CitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfPHRyZWVMZXZlbD4sIHRyZWVfZm9yXzxsYWJlbD4gKQorfSk+Cis8ZWxzZT4gPCEgcmV3cml0ZSBtb2RlICE+Cis8Z2F0ZWRBY3Rpb24oeworX2ZpcnN0Xzx0cmVlTGV2ZWw+IHx8PSA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPjxcbj4KK30pPgorPGVuZGlmPgorPj4KKworCisKK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8YWRkVG9MaXN0KGVsZW09ezxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+fSwuLi4pPgorPj4KKwordG9rZW5SZWZSdWxlUm9vdCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci50b2tlblJlZiguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8Z2F0ZWRBY3Rpb24oeworPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK3RyZWVfZm9yXzxsYWJlbD4gPSA8dGVybWluYWxPcHRpb25zLm5vZGU7IGZvcm1hdD0iY29uc3RhbnRQYXRoIj4ubmV3KCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApCis8ZWxzZT4KK3RyZWVfZm9yXzxsYWJlbD4gPSBAYWRhcHRvci5jb3B5X25vZGUoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ICkKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gQGFkYXB0b3IuYmVjb21lX3Jvb3QoIHRyZWVfZm9yXzxsYWJlbD4sIHJvb3RfPHRyZWVMZXZlbD4gKQorfSk+Cis8ZW5kaWY+Cis+PgorCit0b2tlblJlZlJ1bGVSb290QW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmUnVsZVJvb3QoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCit3aWxkY2FyZCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci53aWxkY2FyZCguLi4pPgorPGlmKCFyZXdyaXRlTW9kZSk+Cis8Z2F0ZWRBY3Rpb24oewordHJlZV9mb3JfPGxhYmVsPiA9IEBhZGFwdG9yLmNvcHlfdHJlZSggPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gKQorQGFkYXB0b3IuYWRkX2NoaWxkKCByb290Xzx0cmVlTGV2ZWw+LCB0cmVlX2Zvcl88bGFiZWw+ICkKK30pPgorPGVsc2U+IDwhIHJld3JpdGUgbW9kZSAhPgorPGdhdGVkQWN0aW9uKHsKK19maXJzdF88dHJlZUxldmVsPiBhbmQgX2ZpcnN0Xzx0cmVlTGV2ZWw+ID0gPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4KK30pPgorPGVuZGlmPgorPj4KKworbWF0Y2hTZXQocyxsYWJlbCx0ZXJtaW5hbE9wdGlvbnMsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorX2xhc3QgPSBAaW5wdXQubG9vaworPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8Z2F0ZWRBY3Rpb24oeworPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK3RyZWVfZm9yXzxsYWJlbD4gPSA8dGVybWluYWxPcHRpb25zLm5vZGU7IGZvcm1hdD0iY29uc3RhbnRQYXRoIj4ubmV3KCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApCis8ZWxzZT4KK3RyZWVfZm9yXzxsYWJlbD4gPSBAYWRhcHRvci5jb3B5X25vZGUoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ICkKKzxlbmRpZj48XG4+CitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfPHRyZWVMZXZlbD4sIHRyZWVfZm9yXzxsYWJlbD4gKQorfSk+Cis8ZW5kaWY+Cit9LCAuLi4pPgorPj4KKworCisKK21hdGNoUnVsZUJsb2NrU2V0KHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlLHRyZWVMZXZlbD0iMCIpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bm9SZXdyaXRlKC4uLik+Cis+PgorCisKKworbWF0Y2hTZXRCYW5nKHMsbGFiZWwsdGVybWluYWxPcHRpb25zLGVsZW1lbnRJbmRleCxwb3N0bWF0Y2hDb2RlKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci5tYXRjaFNldCguLi4pPgorPj4KKworbWF0Y2hTZXRSdWxlUm9vdChzLGxhYmVsLHRlcm1pbmFsT3B0aW9ucyxlbGVtZW50SW5kZXgsZGVidWcpIDo6PSA8PAorPHN1cGVyLm1hdGNoU2V0KHBvc3RtYXRjaENvZGU9eworPGlmKCFyZXdyaXRlTW9kZSk+Cis8Z2F0ZWRBY3Rpb24oeworPGlmKHRlcm1pbmFsT3B0aW9ucy5ub2RlKT4KK3RyZWVfZm9yXzxsYWJlbD4gPSA8dGVybWluYWxPcHRpb25zLm5vZGU7IGZvcm1hdD0iY29uc3RhbnRQYXRoIj4ubmV3KCA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiApCis8ZWxzZT4KK3RyZWVfZm9yXzxsYWJlbD4gPSBAYWRhcHRvci5jb3B5X25vZGUoIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ICkKKzxlbmRpZj48XG4+Cityb290Xzx0cmVlTGV2ZWw+ID0gQGFkYXB0b3IuYmVjb21lX3Jvb3QoIHRyZWVfZm9yXzxsYWJlbD4sIHJvb3RfPHRyZWVMZXZlbD4gKQorfSk+Cis8ZW5kaWY+Cit9LCAuLi4pPgorPj4KKworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci5ydWxlUmVmKC4uLik+Cis8Z2F0ZWRBY3Rpb24oeworPGlmKCFyZXdyaXRlTW9kZSk+CitAYWRhcHRvci5hZGRfY2hpbGQoIHJvb3RfPHRyZWVMZXZlbD4sIDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWUgKQorPGVsc2U+CitfZmlyc3RfPHRyZWVMZXZlbD4gfHw9IDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRyZWU8XG4+Cis8ZW5kaWY+Cit9KT4KKz4+CisKK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGFkZFRvTGlzdChlbGVtPXs8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPi50cmVlfSwuLi4pPgorPj4KKworcnVsZVJlZlJ1bGVSb290KHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSBAaW5wdXQubG9vaworPHN1cGVyLnJ1bGVSZWYoLi4uKT4KKzxpZighcmV3cml0ZU1vZGUpPgorPGdhdGVkQWN0aW9uKHsKK3Jvb3RfPHRyZWVMZXZlbD4gPSBAYWRhcHRvci5iZWNvbWVfcm9vdCggPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4udHJlZSwgcm9vdF88dHJlZUxldmVsPiApCit9KT4KKzxlbmRpZj4KKz4+CisKK3J1bGVSZWZSdWxlUm9vdEFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmUnVsZVJvb3QoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4udHJlZX0sLi4uKT4KKz4+CisKK3J1bGVSZWZUcmFjayhydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci5ydWxlUmVmVHJhY2soLi4uKT4KKz4+CisKK3J1bGVSZWZUcmFja0FuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK19sYXN0ID0gQGlucHV0Lmxvb2sKKzxzdXBlci5ydWxlUmVmVHJhY2tBbmRMaXN0TGFiZWwoLi4uKT4KKz4+CisKK3J1bGVSZWZSdWxlUm9vdFRyYWNrKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSBAaW5wdXQubG9vaworPHN1cGVyLnJ1bGVSZWZSb290VHJhY2soLi4uKT4KKz4+CisKK3J1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorX2xhc3QgPSBAaW5wdXQubG9vaworPHN1cGVyLnJ1bGVSZWZSdWxlUm9vdFRyYWNrQW5kTGlzdExhYmVsKC4uLik+Cis+PgorCitjcmVhdGVSZXdyaXRlTm9kZUZyb21FbGVtZW50KHRva2VuLHRlcm1pbmFsT3B0aW9ucyxzY29wZSkgOjo9IDw8Cis8aWYodGVybWluYWxPcHRpb25zLm5vZGUpPgorPHRlcm1pbmFsT3B0aW9ucy5ub2RlOyBmb3JtYXQ9ImNvbnN0YW50UGF0aCI+Lm5ldyggc3RyZWFtXzx0b2tlbj4ubmV4dF9ub2RlICkKKzxlbHNlPgorc3RyZWFtXzx0b2tlbj4ubmV4dF9ub2RlCis8ZW5kaWY+Cis+PgorCitydWxlQ2xlYW5VcCgpIDo6PSA8PAorPHN1cGVyLnJ1bGVDbGVhblVwKCk+Cis8aWYoIXJld3JpdGVNb2RlKT4KKzxnYXRlZEFjdGlvbih7CityZXR1cm5fdmFsdWUudHJlZSA9IEBhZGFwdG9yLnJ1bGVfcG9zdF9wcm9jZXNzaW5nKCByb290XzAgKQorfSk+Cis8ZW5kaWY+Cis+PgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9SdWJ5L0RiZy5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvRGJnLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkwZmIyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9SdWJ5L0RiZy5zdGcKQEAgLTAsMCArMSwxOTIgQEAKK2dyb3VwIERiZzsKKworLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK0BwYXJzZXJCb2R5Lm1peGlucygpIDo6PSA8PAoraW5jbHVkZSBBTlRMUjM6OjxpZihwcm9maWxlKT5Qcm9maWxlPGVsc2U+RGVidWc8ZW5kaWY+OjpQYXJzZXJFdmVudHMKKz4+CisKKworQHBhcnNlckJvZHkuYWRkaXRpb25hbE1lbWJlcnMoKSA6Oj0gPDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorUlVMRV9OQU1FUyA9IFsKKyAgOmludmFsaWRfcnVsZSwgPGdyYW1tYXIuYWxsSW1wb3J0ZWRSdWxlczp7clNUfDo8clNULm5hbWU+fTsgd3JhcD0iXG4gICIsIHNlcGFyYXRvcj0iLCAiPgorXS5mcmVlemUKKzxlbmRpZj4KKz4+CisKKworQHJ1bGUuYm9keSgpIDo6PSA8PAoraW5fcnVsZShncmFtbWFyX2ZpbGVfbmFtZSwgIjxydWxlTmFtZT4iKSBkbworICBAZGVidWdfbGlzdGVuZXIubG9jYXRpb24oPHJ1bGVEZXNjcmlwdG9yLnRyZWUubGluZT4sIDxydWxlRGVzY3JpcHRvci50cmVlLmNvbHVtbj4pCisKKyAgPEBzdXBlci5ib2R5KCk+CisKKyAgQGRlYnVnX2xpc3RlbmVyLmxvY2F0aW9uKDxydWxlRGVzY3JpcHRvci5FT1JOb2RlLmxpbmU+LCA8cnVsZURlc2NyaXB0b3IuRU9STm9kZS5jb2x1bW4+KQorZW5kCis+PgorCisKKy8vIENvbW1vbiBkZWJ1ZyBldmVudCB0cmlnZ2VycyB1c2VkIGJ5IHJlZ2lvbiBvdmVycmlkZXMgYmVsb3cKK2VudGVyU3ViUnVsZSgpIDo6PSA8PAoraW5fc3VicnVsZSg8ZGVjaXNpb25OdW1iZXI+KSBkbzxcbj4KKz4+CisKKworZXhpdFN1YlJ1bGUoKSA6Oj0gPDwKK2VuZDxcbj4KKz4+CisKKworZW50ZXJEZWNpc2lvbigpIDo6PSA8PAoraW5fZGVjaXNpb24oPGRlY2lzaW9uTnVtYmVyPikgZG88XG4+Cis+PgorCisKK2V4aXREZWNpc2lvbigpIDo6PSA8PAorZW5kPFxuPgorPj4KKworCitlbnRlckFsdChuKSA6Oj0gPDwKK2luX2FsdGVybmF0aXZlKDxuPik8XG4+Cis+PgorCisKKy8vIFJlZ2lvbiBvdmVycmlkZXMgdGhhdCB0ZWxsIHZhcmlvdXMgY29uc3RydWN0cyB0byBhZGQgZGVidWdnaW5nIHRyaWdnZXJzCitAYmxvY2suYm9keSgpIDo6PSA8PAoraW5fc3VicnVsZSg8ZGVjaXNpb25OdW1iZXI+KSBkbworICA8QHN1cGVyLmJvZHkoKT4KK2VuZAorPj4KKworCisvLyBAYmxvY2tCb2R5LnByZWRlY2lzaW9uKCkgOjo9ICI8ZW50ZXJTdWJSdWxlKCk+IgorLy8gQGJsb2NrQm9keS5wb3N0ZGVjaXNpb24oKSA6Oj0gIjxleGl0RGVjaXNpb24oKT4iCisvLyBAYmxvY2tCb2R5LnBvc3RicmFuY2goKSA6Oj0gIjxleGl0U3ViUnVsZSgpPiIKK0BibG9ja0JvZHkuZGVjaXNpb24oKSA6Oj0gPDwKK2luX2RlY2lzaW9uKDxkZWNpc2lvbk51bWJlcj4pIGRvCisgIDxAc3VwZXIuZGVjaXNpb24oKT4KK2VuZAorPj4KKworCitAcnVsZUJsb2NrLmRlY2lzaW9uKCkgOjo9IDw8Citpbl9kZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KSBkbworICA8QHN1cGVyLmRlY2lzaW9uKCk+CitlbmQ8XG4+Cis+PgorCisKK0BydWxlQmxvY2tTaW5nbGVBbHQucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQobj17MX0pPiIKKworCitAYmxvY2tTaW5nbGVBbHQucHJlYWx0KCkgOjo9ICI8ZW50ZXJBbHQobj17MX0pPiIKKworCitAcG9zaXRpdmVDbG9zdXJlQmxvY2subG9vcEJvZHkoKSA6Oj0gPDwKK2luX3N1YnJ1bGUoPGRlY2lzaW9uTnVtYmVyPikgZG8KKyAgPEBzdXBlci5sb29wQm9keSgpPgorZW5kCis+PgorCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9ja0xvb3AuZGVjaXNpb25Cb2R5KCkgOjo9IDw8Citpbl9kZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KSBkbworICA8QHN1cGVyLmRlY2lzaW9uQm9keSgpPgorZW5kCis+PgorCisKK0Bwb3NpdGl2ZUNsb3N1cmVCbG9ja0xvb3AuZWFybHlFeGl0RXhjZXB0aW9uKCkgOjo9IDw8CitAZGVidWdfbGlzdGVuZXIucmVjb2duaXRpb25fZXhjZXB0aW9uKGVlZSkKKz4+CisKKworQGNsb3N1cmVCbG9jay5sb29wQm9keSgpIDo6PSA8PAoraW5fc3VicnVsZSg8ZGVjaXNpb25OdW1iZXI+KSBkbworICA8QHN1cGVyLmxvb3BCb2R5KCk+CitlbmQKKz4+CisKKworQGNsb3N1cmVCbG9ja0xvb3AuZGVjaXNpb25Cb2R5KCkgOjo9IDw8Citpbl9kZWNpc2lvbig8ZGVjaXNpb25OdW1iZXI+KSBkbworICA8QHN1cGVyLmRlY2lzaW9uQm9keSgpPgorZW5kCis+PgorCisKK0BhbHRTd2l0Y2hDYXNlLnByZWFsdCgpIDo6PSAiPGVudGVyQWx0KGFsdE51bSk+IiAgLy8gYWx0TnVtIGlzIGFyZyBvZiBhbHRTd2l0Y2hDYXNlCisKKworZWxlbWVudChlKSA6Oj0gPDwKK0BkZWJ1Z19saXN0ZW5lci5sb2NhdGlvbig8ZS5saW5lPiwgPGUucG9zPikgLy8gZSBpcyBhcmcgb2YgZWxlbWVudAorPHN1cGVyLmVsZW1lbnQoZSk+Cis+PgorCisKK0BtYXRjaFNldC5taXNtYXRjaGVkU2V0RXhjZXB0aW9uKCkgOjo9ICJAZGVidWdfbGlzdGVuZXIucmVjb2duaXRpb25fZXhjZXB0aW9uKG1zZSkiCisKKworQGRmYVN0YXRlLm5vVmlhYmxlQWx0RXhjZXB0aW9uKCkgOjo9IDw8CitudmFlID0gTm9WaWFibGVBbHRlcm5hdGl2ZSggIjxkZXNjcmlwdGlvbj4iLCA8ZGVjaXNpb25OdW1iZXI+LCA8c3RhdGVOdW1iZXI+ICkKK0BkZWJ1Z19saXN0ZW5lci5yZWNvZ25pdGlvbl9leGNlcHRpb24oIG52YWUgKQorcmFpc2UoIG52YWUgKTxcbj4KKz4+CisKK0BkZmFTdGF0ZVN3aXRjaC5ub1ZpYWJsZUFsdEV4Y2VwdGlvbigpIDo6PSA8PAorbnZhZSA9IE5vVmlhYmxlQWx0ZXJuYXRpdmUoICI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiApCitAZGVidWdfbGlzdGVuZXIucmVjb2duaXRpb25fZXhjZXB0aW9uKCBudmFlICkKK3JhaXNlKCBudmFlICk8XG4+Cis+PgorCitkZmFEZWNpc2lvbihkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CitiZWdpbgorICBAc3RhdGUuY3ljbGljX2RlY2lzaW9uID0gdHJ1ZQorICA8c3VwZXIuZGZhRGVjaXNpb24oLi4uKT4KK3Jlc2N1ZSBBTlRMUjM6OkVycm9yOjpOb1ZpYWJsZUFsdGVybmF0aXZlID0+IG52YWUKKyAgQGRlYnVnX2xpc3RlbmVyLnJlY29nbml0aW9uX2V4Y2VwdGlvbihudmFlKQorICByYWlzZQorZW5kCis+PgorCisKK0BjeWNsaWNERkEuZXJyb3JNZXRob2QoKSA6Oj0gPDwKK2RlZiBlcnJvcihudmFlKQorICBAcmVjb2duaXplci5kZWJ1Z19saXN0ZW5lci5yZWNvZ25pdGlvbl9leGNlcHRpb24obnZhZSkKKyAgc3VwZXIKK2VuZAorPj4KKy8qKiBGb3JjZSBwcmVkaWNhdGUgdmFsaWRhdGlvbiB0byB0cmlnZ2VyIGFuIGV2ZW50ICovCitldmFsUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAorcHJlZGljYXRlPygiPGRlc2NyaXB0aW9uPiIpIHsgPHByZWQ+IH0KKz4+CisKKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9SdWJ5L1J1Ynkuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9SdWJ5L1J1Ynkuc3RnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjZjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL2NvZGVnZW4vdGVtcGxhdGVzL1J1YnkvUnVieS5zdGcKQEAgLTAsMCArMSwxNDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqICBNIEEgSiBPIFIgICBDIE8gTSBQIE8gTiBFIE4gVCBTICAqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBTeXN0ZW0uQm9vbGVhbi5Ub1N0cmluZygpIHJldHVybnMgIlRydWUiIGFuZCAiRmFsc2UiLCBidXQgdGhlIHByb3BlciBDIyBsaXRlcmFscyBhcmUgInRydWUiIGFuZCAiZmFsc2UiCisvLyBUaGUgSmF2YSB2ZXJzaW9uIG9mIEJvb2xlYW4gcmV0dXJucyAidHJ1ZSIgYW5kICJmYWxzZSIsIHNvIHRoZXkgbWFwIHRvIHRoZW1zZWx2ZXMgaGVyZS4KK2Jvb2xlYW5MaXRlcmFsIDo6PSBbCisJIlRydWUiOiJ0cnVlIiwKKwkiRmFsc2UiOiJmYWxzZSIsCisJInRydWUiOiJ0cnVlIiwKKwkiZmFsc2UiOiJmYWxzZSIsCisJZGVmYXVsdDoiZmFsc2UiCitdCisKKy8qKiBUaGUgb3ZlcmFsbCBmaWxlIHN0cnVjdHVyZSBvZiBhIHJlY29nbml6ZXI7IHN0b3JlcyBtZXRob2RzCisgICogZm9yIHJ1bGVzIGFuZCBjeWNsaWMgREZBcyBwbHVzIHN1cHBvcnQgY29kZS4KKyAgKi8KK291dHB1dEZpbGUoTEVYRVIsIFBBUlNFUiwgVFJFRV9QQVJTRVIsIGFjdGlvblNjb3BlLCBhY3Rpb25zLCBkb2NDb21tZW50LCByZWNvZ25pemVyLCBuYW1lLAorICB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBjeWNsaWNERkFzLCBiaXRzZXRzLCBidWlsZFRlbXBsYXRlLCBidWlsZEFTVCwgcmV3cml0ZU1vZGUsCisgIHByb2ZpbGUsIGJhY2t0cmFja2luZywgc3lucHJlZHMsIG1lbW9pemUsIG51bVJ1bGVzLCBmaWxlTmFtZSwgQU5UTFJWZXJzaW9uLCBnZW5lcmF0ZWRUaW1lc3RhbXAsCisgIHRyYWNlLCBzY29wZXMsIHN1cGVyQ2xhc3MsIGxpdGVyYWxzKSA6Oj0KKzw8CisjIS91c3IvYmluL2VudiBydWJ5CisjCisjIDxmaWxlTmFtZT4KKyMgLS0KKyMgR2VuZXJhdGVkIHVzaW5nIEFOVExSIHZlcnNpb246IDxBTlRMUlZlcnNpb24+CisjIFJ1YnkgcnVudGltZSBsaWJyYXJ5IHZlcnNpb246IDxydW50aW1lTGlicmFyeVZlcnNpb24oKT4KKyMgSW5wdXQgZ3JhbW1hciBmaWxlOiA8ZmlsZU5hbWU+CisjIEdlbmVyYXRlZCBhdDogPGdlbmVyYXRlZFRpbWVzdGFtcD4KKyMKKworIyB+fn5cPiBzdGFydCBsb2FkIHBhdGggc2V0dXAKK3RoaXNfZGlyZWN0b3J5ID0gRmlsZS5leHBhbmRfcGF0aCggRmlsZS5kaXJuYW1lKCBfX0ZJTEVfXyApICkKKyRMT0FEX1BBVEgudW5zaGlmdCggdGhpc19kaXJlY3RvcnkgKSB1bmxlc3MgJExPQURfUEFUSC5pbmNsdWRlPyggdGhpc19kaXJlY3RvcnkgKQorCithbnRscl9sb2FkX2ZhaWxlZCA9IHByb2MgZG8KKyAgbG9hZF9wYXRoID0gJExPQURfUEFUSC5tYXAgeyB8ZGlyfCAnICAtICcgXDxcPCBkaXIgfS5qb2luKCAkLyApCisgIHJhaXNlIExvYWRFcnJvciwgXDxcPC1FTkQuc3RyaXAhCisKK0ZhaWxlZCB0byBsb2FkIHRoZSBBTlRMUjMgcnVudGltZSBsaWJyYXJ5ICh2ZXJzaW9uIDxydW50aW1lTGlicmFyeVZlcnNpb24oKT4pOgorCitFbnN1cmUgdGhlIGxpYnJhcnkgaGFzIGJlZW4gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBpcyBhdmFpbGFibGUKK29uIHRoZSBsb2FkIHBhdGguIElmIHJ1YnlnZW1zIGlzIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSwgdGhpcyBjYW4KK2JlIGRvbmUgd2l0aCB0aGUgY29tbWFuZDoKKworICBnZW0gaW5zdGFsbCBhbnRscjMKKworQ3VycmVudCBsb2FkIHBhdGg6CisjeyBsb2FkX3BhdGggfQorCisgIEVORAorZW5kCisKK2RlZmluZWQ/KCBBTlRMUjMgKSBvciBiZWdpbgorCisgICMgMTogdHJ5IHRvIGxvYWQgdGhlIHJ1YnkgYW50bHIzIHJ1bnRpbWUgbGlicmFyeSBmcm9tIHRoZSBzeXN0ZW0gcGF0aAorICByZXF1aXJlICdhbnRscjMnCisKK3Jlc2N1ZSBMb2FkRXJyb3IKKworICAjIDI6IHRyeSB0byBsb2FkIHJ1YnlnZW1zIGlmIGl0IGlzbid0IGFscmVhZHkgbG9hZGVkCisgIGRlZmluZWQ/KCBHZW0gKSBvciBiZWdpbgorICAgIHJlcXVpcmUgJ3J1YnlnZW1zJworICByZXNjdWUgTG9hZEVycm9yCisgICAgYW50bHJfbG9hZF9mYWlsZWQuY2FsbAorICBlbmQKKworICAjIDM6IHRyeSB0byBhY3RpdmF0ZSB0aGUgYW50bHIzIGdlbQorICBiZWdpbgorICAgIEdlbS5hY3RpdmF0ZSggJ2FudGxyMycsICd+PiA8cnVudGltZUxpYnJhcnlWZXJzaW9uKCk+JyApCisgIHJlc2N1ZSBHZW06OkxvYWRFcnJvcgorICAgIGFudGxyX2xvYWRfZmFpbGVkLmNhbGwKKyAgZW5kCisKKyAgcmVxdWlyZSAnYW50bHIzJworCitlbmQKKyMgXDx+fn4gZW5kIGxvYWQgcGF0aCBzZXR1cAorCis8cGxhY2VBY3Rpb24oc2NvcGU9ImFsbCIsIG5hbWU9ImhlYWRlciIpPgorPHBsYWNlQWN0aW9uKHNjb3BlPWFjdGlvblNjb3BlLG5hbWU9ImhlYWRlciIpPgorCis8aWYocmVjb2duaXplci5ncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPgorPHJvb3RHcmFtbWFyT3V0cHV0RmlsZSgpPgorPGVsc2U+Cis8ZGVsZWdhdGVHcmFtbWFyT3V0cHV0RmlsZSgpPgorPGVuZGlmPgorCis8cGxhY2VBY3Rpb24oc2NvcGU9YWN0aW9uU2NvcGUsbmFtZT0iZm9vdGVyIik+Cis8cGxhY2VBY3Rpb24oc2NvcGU9ImFsbCIsIG5hbWU9ImZvb3RlciIpPgorCis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1haW4pPgoraWYgX19GSUxFX18gPT0gJDAgYW5kIEFSR1YuZmlyc3QgIT0gJy0tJworICA8cGxhY2VBY3Rpb24oc2NvcGU9YWN0aW9uU2NvcGUsbmFtZT0ibWFpbiIpPgorZW5kCis8ZW5kaWY+Cis+PgorCit0b2tlbkRhdGFNb2R1bGUoKSA6Oj0gPDwKKyMgVG9rZW5EYXRhIGRlZmluZXMgYWxsIG9mIHRoZSB0b2tlbiB0eXBlIGludGVnZXIgdmFsdWVzCisjIGFzIGNvbnN0YW50cywgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyMgQU5UTFItZ2VuZXJhdGVkIHJlY29nbml6ZXJzLgorY29uc3RfZGVmaW5lZD8oIDpUb2tlbkRhdGEgKSBvciBUb2tlbkRhdGEgPSBBTlRMUjM6OlRva2VuU2NoZW1lLm5ldworCittb2R1bGUgVG9rZW5EYXRhCis8aWYodG9rZW5zKT4KKworICAjIGRlZmluZSB0aGUgdG9rZW4gY29uc3RhbnRzCisgIGRlZmluZV90b2tlbnMoIDx0b2tlbnM6e2l0IHwgOjxpdC5uYW1lPiA9PiA8aXQudHlwZT59OyBhbmNob3IsIHdyYXA9IlxuIiwgc2VwYXJhdG9yPSIsICI+ICkKKworPGVuZGlmPgorPGlmKHRva2VuTmFtZXMpPgorCisgICMgcmVnaXN0ZXIgdGhlIHByb3BlciBodW1hbi1yZWFkYWJsZSBuYW1lIG9yIGxpdGVyYWwgdmFsdWUKKyAgIyBmb3IgZWFjaCB0b2tlbiB0eXBlCisgICMKKyAgIyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGFub255bW91cyB0b2tlbnMsIHdoaWNoIGFyZQorICAjIGNyZWF0ZWQgZnJvbSBsaXRlcmFsIHZhbHVlcyBpbiB0aGUgZ3JhbW1hciwgZG8gbm90CisgICMgaGF2ZSBkZXNjcmlwdGl2ZSBuYW1lcworICByZWdpc3Rlcl9uYW1lcyggPHRva2VuTmFtZXM6e2l0IHwgPGl0Pn07IHNlcGFyYXRvcj0iLCAiLCBhbmNob3IsIHdyYXA9IlxuIj4gKQorCis8ZW5kaWY+CisKKyAgPHBsYWNlQWN0aW9uKHNjb3BlPSJ0b2tlbiIsbmFtZT0ic2NoZW1lIik+CisgIDxwbGFjZUFjdGlvbihzY29wZT0idG9rZW4iLG5hbWU9Im1lbWJlcnMiKT4KK2VuZDxcbj4KKz4+CisKK3Jvb3RHcmFtbWFyT3V0cHV0RmlsZSgpIDo6PSA8PAorbW9kdWxlIDxyZWNvZ25pemVyLmdyYW1tYXIubmFtZT4KKyAgPHBsYWNlQWN0aW9uKHNjb3BlPSJtb2R1bGUiLG5hbWU9ImhlYWQiKT4KKyAgPHRva2VuRGF0YU1vZHVsZSgpPgorICA8cmVjb2duaXplcj4KKyAgPHBsYWNlQWN0aW9uKHNjb3BlPSJtb2R1bGUiLG5hbWU9ImZvb3QiKT4KK2VuZAorPj4KKworZGVsZWdhdGVHcmFtbWFyT3V0cHV0RmlsZSgpIDo6PSA8PAorcmVxdWlyZSAnPHJlY29nbml6ZXIuZ3JhbW1hci5kZWxlZ2F0b3IucmVjb2duaXplck5hbWU+JworCis8ZGVsZWdhdGVHcmFtbWFyTW9kdWxlSGVhZChncmFtPXJlY29nbml6ZXIuZ3JhbW1hci5kZWxlZ2F0b3IpPgorICA8cmVjb2duaXplcj4KKzxkZWxlZ2F0ZUdyYW1tYXJNb2R1bGVUYWlsKGdyYW09cmVjb2duaXplci5ncmFtbWFyLmRlbGVnYXRvcik+Cis+PgorCitkZWxlZ2F0ZUdyYW1tYXJNb2R1bGVIZWFkKGdyYW0pIDo6PSA8PAorPGlmKGdyYW0uZ3JhbW1hcklzUm9vdCk+Cittb2R1bGUgPGdyYW0ubmFtZT4KKzxlbHNlPgorPGRlbGVnYXRlR3JhbW1hck1vZHVsZUhlYWQoZ3JhbT1ncmFtLmRlbGVnYXRvcik+PFxuPgorY2xhc3MgPGdyYW0ubmFtZT4KKzxlbmRpZj4KKz4+CisKK2RlbGVnYXRlR3JhbW1hck1vZHVsZVRhaWwoZ3JhbSkgOjo9IDw8Cis8aWYoZ3JhbS5ncmFtbWFySXNSb290KT4KK2VuZCAjIG1vZHVsZSA8Z3JhbS5uYW1lPgorPGVsc2U+CitlbmQgIyBjbGFzcyA8Z3JhbS5uYW1lPgorPGRlbGVnYXRlR3JhbW1hck1vZHVsZVRhaWwoZ3JhbT1ncmFtLmRlbGVnYXRvcik+PFxuPgorPGVuZGlmPgorPj4KKy8qICogKiAqICogKiAqICogKiAqIFIgRSBDIE8gRyBOIEkgWiBFIFIgICBDIEwgQSBTIFMgRSBTICogKiAqICogKiAqICogKiAqICovCisKK3BhcnNlcigKKyAgZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywKKyAgQVNUTGFiZWxUeXBlPSJPYmplY3QiLCBzdXBlckNsYXNzPSJBTlRMUjM6OlBhcnNlciIsIGxhYmVsVHlwZT0iQU5UTFIzOjpUb2tlbiIsCisgIG1lbWJlcnM9ezxhY3Rpb25zLnBhcnNlci5tZW1iZXJzPn0KKykgOjo9IDw8Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT48YXV0b2xvYWREZWxlZ2F0ZXMoKT48ZW5kaWY+CisKK2NsYXNzIDxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPlBhcnNlcjxlbHNlPjxncmFtbWFyLm5hbWU+PGVuZGlmPiBcPCA8c3VwZXJDbGFzcz4KKyAgPHBhcnNlckJvZHkoaW5wdXRTdHJlYW1UeXBlPSJBTlRMUjM6OlRva2VuU3RyZWFtIiwgcmV3cml0ZUVsZW1lbnRUeXBlPSJUb2tlbiIsIGFjdGlvblNjb3BlPSJwYXJzZXIiLCAuLi4pPgorZW5kICMgY2xhc3MgPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+UGFyc2VyPGVsc2U+PGdyYW1tYXIubmFtZT48ZW5kaWY+IFw8IDxzdXBlckNsYXNzPgorPGlmKCFhY3Rpb25zLihhY3Rpb25TY29wZSkubWFpbik+CisKK2F0X2V4aXQgeyA8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT5QYXJzZXI8ZWxzZT48Z3JhbW1hci5uYW1lPjxlbmRpZj4ubWFpbiggQVJHViApIH0gaWYgX19GSUxFX18gPT0gJDAKKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSB0cmVlIHBhcnNlcjsgc2FtZSBhcyBwYXJzZXIgZXhjZXB0IHRoZQorICAqIGlucHV0IHN0cmVhbSBpcyBhIGRpZmZlcmVudCB0eXBlLgorICAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLCBydWxlcywgbnVtUnVsZXMsIGJpdHNldHMsIGZpbHRlck1vZGUsIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsIHN1cGVyQ2xhc3M9IkFOVExSMzo6VHJlZVBhcnNlciIsIG1lbWJlcnM9ezxhY3Rpb25zLnRyZWVwYXJzZXIubWVtYmVycz59KSA6Oj0gPDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPjxhdXRvbG9hZERlbGVnYXRlcygpPjxlbmRpZj4KKworY2xhc3MgPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+VHJlZVBhcnNlcjxlbHNlPjxncmFtbWFyLm5hbWU+PGVuZGlmPiBcPCA8c3VwZXJDbGFzcz4KKyAgPHBhcnNlckJvZHkoaW5wdXRTdHJlYW1UeXBlPSJUcmVlTm9kZVN0cmVhbSIsIHJld3JpdGVFbGVtZW50VHlwZT0iTm9kZSIsIGFjdGlvblNjb3BlPSJ0cmVlcGFyc2VyIiwgLi4uKT4KK2VuZCAjIGNsYXNzIDxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPlRyZWVQYXJzZXI8ZWxzZT48Z3JhbW1hci5uYW1lPjxlbmRpZj4gXDwgPHN1cGVyQ2xhc3M+Cis8aWYoIWFjdGlvbnMuKGFjdGlvblNjb3BlKS5tYWluKT4KKworYXRfZXhpdCB7IDxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPlRyZWVQYXJzZXI8ZWxzZT48Z3JhbW1hci5uYW1lPjxlbmRpZj4ubWFpbiggQVJHViApIH0gaWYgX19GSUxFX18gPT0gJDAKKzxlbmRpZj4KKz4+CisKK3BhcnNlckJvZHkoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywgYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLCBmaWx0ZXJNb2RlLCBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSwgYWN0aW9uU2NvcGUsIEFTVExhYmVsVHlwZT0iT2JqZWN0IikgOjo9IDw8CitAZ3JhbW1hcl9ob21lID0gPGdyYW1tYXIubmFtZT4KKzxpZighZ3JhbW1hci5ncmFtbWFySXNSb290KT48YXV0b2xvYWREZWxlZ2F0ZXMoKT48XG4+PGVuZGlmPgorPEBtaXhpbnMoKT4KKworUlVMRV9NRVRIT0RTID0gWyA8cnVsZXM6e3J8OjxyLnJ1bGVOYW1lPn07IHNlcGFyYXRvcj0iLCAiLCB3cmFwPSJcbiIsIGFuY2hvcj4gXS5mcmVlemUKKworPHNjb3Blczp7aXQgfCA8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZUNsYXNzKCk+PFxuPjxlbmRpZj59PgorPHJ1bGVzOntpdCB8IDxydWxlQXR0cmlidXRlU2NvcGVDbGFzcygucnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT59PgorPGlmKGdyYW1tYXIuZGVsZWdhdG9ycyk+CittYXN0ZXJzKCA8Z3JhbW1hci5kZWxlZ2F0b3JzOntkfDo8ZC5uYW1lPn07IHNlcGFyYXRvcj0iLCAiPiApPFxuPgorPGVuZGlmPgorPGlmKGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzKT4KK2ltcG9ydHMoIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7ZHw6PGQubmFtZT59OyBzZXBhcmF0b3I9IiwgIj4gKTxcbj4KKzxlbmRpZj4KKworaW5jbHVkZSBUb2tlbkRhdGEKKworYmVnaW4KKyAgZ2VuZXJhdGVkX3VzaW5nKCAiPGZpbGVOYW1lPiIsICI8QU5UTFJWZXJzaW9uPiIsICI8cnVudGltZUxpYnJhcnlWZXJzaW9uKCk+IiApCityZXNjdWUgTm9NZXRob2RFcnJvciA9PiBlcnJvcgorICAjIGlnbm9yZQorZW5kCisKKzxpZighZ3JhbW1hci5ncmFtbWFySXNSb290KT4KK3JlcXVpcmUgJzxncmFtbWFyLmNvbXBvc2l0ZS5yb290R3JhbW1hci5yZWNvZ25pemVyTmFtZT4nCitpbmNsdWRlIDxncmFtbWFyLmNvbXBvc2l0ZS5yb290R3JhbW1hci5uYW1lPjo6VG9rZW5EYXRhPFxuPjxcbj4KKzxlbmRpZj4KKzxwYXJzZXJDb25zdHJ1Y3RvcigpPgorPEBhZGRpdGlvbmFsTWVtYmVycygpPgorPG1lbWJlcnM+CisjIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIFJ1bGVzIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKzxydWxlczp7aXQgfCA8aXQ+PFxuPn0+CisKKzxpZihncmFtbWFyLmRlbGVnYXRlZFJ1bGVzKT4KKyMgLSAtIC0gLSAtIC0gLSAtIC0gLSBEZWxlZ2F0ZWQgUnVsZXMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtCis8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8PGRlbGVnYXRlUnVsZShydWxlRGVzY3JpcHRvcik+PFxuPn0+Cis8ZW5kaWY+Cis8aWYoY3ljbGljREZBcyk+CisjIC0gLSAtIC0gLSAtIC0gLSAtIC0gREZBIGRlZmluaXRpb25zIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorPGN5Y2xpY0RGQXM6e2l0IHwgPGN5Y2xpY0RGQShpdCk+fT4KKworcHJpdmF0ZQorCitkZWYgaW5pdGlhbGl6ZV9kZmFzCisgIHN1cGVyIHJlc2N1ZSBuaWwKKyAgPGN5Y2xpY0RGQXM6e2l0IHwgPGN5Y2xpY0RGQUluaXQoaXQpPn0+CitlbmQKKworPGVuZGlmPgorPGJpdHNldHM6e2l0IHwgVE9LRU5TX0ZPTExPV0lOR188aXQubmFtZT5fSU5fPGl0LmluTmFtZT5fPGl0LnRva2VuSW5kZXg+ID0gU2V0WyA8aXQudG9rZW5UeXBlczp7aXQgfCA8aXQ+fTsgc2VwYXJhdG9yPSIsICI+IF08XG4+fT4KKz4+CisKK3BhcnNlckNvbnN0cnVjdG9yKCkgOjo9IDw8CitkZWYgaW5pdGlhbGl6ZSggPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4sIH0+aW5wdXQsIG9wdGlvbnMgPSB7fSApCisgIHN1cGVyKCBpbnB1dCwgb3B0aW9ucyApCis8aWYobWVtb2l6ZSk+PGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgIEBzdGF0ZS5ydWxlX21lbW9yeSA9IHt9Cis8ZW5kaWY+PGVuZGlmPgorICA8c2NvcGVzOntpdCB8IDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlU3RhY2soKT48XG4+PGVuZGlmPn0+PHJ1bGVzOntpdCB8IDxydWxlQXR0cmlidXRlU2NvcGVTdGFjaygucnVsZURlc2NyaXB0b3IucnVsZVNjb3BlKT59PgorICA8cGxhY2VBY3Rpb24oc2NvcGU9YWN0aW9uU2NvcGUsbmFtZT0iaW5pdCIpPgorICA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfEA8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT48XG4+fT48Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6e2d8QDxnOmRlbGVnYXRlTmFtZSgpPiA9IDxuZXdEZWxlZ2F0ZShnKT48XG4+fT48bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfEBwYXJlbnQgPSBAPGc6ZGVsZWdhdGVOYW1lKCk+PFxuPn0+PEBpbml0KCk+CitlbmQKKz4+CisKKworLyogKiAqICogKiAqICogKiAqICogKiAqICogUiBVIEwgRSAgIE0gRSBUIEggTyBEIFMgKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLyoqIEEgc2ltcGxlciB2ZXJzaW9uIG9mIGEgcnVsZSB0ZW1wbGF0ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZQorICAqIGltYWdpbmFyeSBydWxlcyBjcmVhdGVkIGZvciBzeW50YWN0aWMgcHJlZGljYXRlcy4gIEFzIHRoZXkKKyAgKiBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMgbm9yIHBhcmFtZXRlcnMgZXRjLi4uLCBqdXN0IGdpdmUKKyAgKiBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbyBhbnkgb2YgdGhlIG5vcm1hbAorICAqIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuIEFzCisgICogcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5CisgICogbmVlZCB0byBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAgKi8KK3N5bnByZWRSdWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGRlc2NyaXB0aW9uLCBuYWtlZEJsb2NrKSA6Oj0gPDwKKyMKKyMgc3ludGFjdGljIHByZWRpY2F0ZSA8cnVsZU5hbWU+CisjCisjIChpbiA8ZmlsZU5hbWU+KQorIyA8ZGVzY3JpcHRpb24+CisjCisjIFRoaXMgaXMgYW4gaW1hZ2luYXJ5IHJ1bGUgaW5zZXJ0ZWQgYnkgQU5UTFIgdG8KKyMgaW1wbGVtZW50IGEgc3ludGFjdGljIHByZWRpY2F0ZSBkZWNpc2lvbgorIworZGVmIDxydWxlTmFtZT48aWYocnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUpPiggPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+ICk8ZW5kaWY+CisgIDx0cmFjZUluKCk+PHJ1bGVMYWJlbERlZnMoKT4KKyAgPGJsb2NrPgorZW5zdXJlCisgIDx0cmFjZU91dCgpPgorZW5kCis+PgorCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgYSBydWxlLiAgVGhpcyBpbmNsdWRlcyBhbnkgcmV0dXJuCisgICogdHlwZSBkYXRhIGFnZ3JlZ2F0ZXMgcmVxdWlyZWQgZm9yIG11bHRpcGxlIHJldHVybiB2YWx1ZXMuCisgICovCitydWxlKHJ1bGVOYW1lLCBydWxlRGVzY3JpcHRvciwgYmxvY2ssIGVtcHR5UnVsZSwgZGVzY3JpcHRpb24sIGV4Y2VwdGlvbnMsIGZpbmFsbHksIG1lbW9pemUpIDo6PSA8PAorPHJldHVyblNjb3BlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJldHVyblNjb3BlKT4KKworIworIyBwYXJzZXIgcnVsZSA8cnVsZU5hbWU+CisjCisjIChpbiA8ZmlsZU5hbWU+KQorIyA8ZGVzY3JpcHRpb24+CisjCitkZWYgPHJ1bGVOYW1lPjxpZihydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZSk+KCA8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4gKTxlbmRpZj4KKyAgPHRyYWNlSW4oKT48cnVsZVNjb3BlU2V0VXAoKT48cnVsZURlY2xhcmF0aW9ucygpPjxydWxlTGFiZWxEZWZzKCk+PGFjdGlvbihuYW1lPSJpbml0IiwgY29kZT1ydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQpPgorICA8QGJvZHk+PHJ1bGVCb2R5KCk+PEBlbmQ+CisKKyAgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT4KK2VuZAorPGlmKHJ1bGVEZXNjcmlwdG9yLm1vZGlmaWVyKT4KKworPHJ1bGVEZXNjcmlwdG9yLm1vZGlmaWVyPiA6PHJ1bGVOYW1lPiByZXNjdWUgbmlsPFxuPgorPGVuZGlmPgorPj4KKworZGVsZWdhdGVSdWxlKHJ1bGVEZXNjcmlwdG9yKSA6Oj0gPDwKKyMgZGVsZWdhdGVkIHJ1bGUgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+CitkZWYgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+PGlmKHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT4oIDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPiApPGVuZGlmPgorICA8bWV0aG9kQ2FsbChkZWw9cnVsZURlc2NyaXB0b3IuZ3JhbW1hciwgbj1ydWxlRGVzY3JpcHRvci5uYW1lLCBhcmdzPXs8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUuYXR0cmlidXRlczp7aXQgfCA8aXQubmFtZT59Pn0pPgorZW5kCis+PgorLy8gSEVMUEVSUworCityZWNvZ25pemVyQ2xhc3NOYW1lKCkgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPlRyZWVQYXJzZXI8ZWxzZWlmKFBBUlNFUik+UGFyc2VyPGVsc2U+TGV4ZXI8ZW5kaWY+Cis+PgorCitpbml0aWFsaXplRGlyZWN0RGVsZWdhdGUoKSA6Oj0gPDwKK0A8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8Zy5uYW1lPjo6PHJlY29nbml6ZXJDbGFzc05hbWUoKT4ubmV3KAorICA8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHw8cDpkZWxlZ2F0ZU5hbWUoKT4sIH0+c2VsZiwgaW5wdXQsIG9wdGlvbnMubWVyZ2UoIDpzdGF0ZSA9PiBAc3RhdGUgKQorKQorPj4KKworaW5pdGlhbGl6ZURlbGVnYXRvcigpIDo6PSA8PAorQDxnOmRlbGVnYXRlTmFtZSgpPiA9IDxnOmRlbGVnYXRlTmFtZSgpPgorPj4KKworYWx0U3dpdGNoQ2FzZShhbHROdW0sYWx0KSA6Oj0gPDwKK3doZW4gPGFsdE51bT4KKyAgPEBwcmVhbHQoKT4KKyAgPGFsdD4KKz4+CisKK2Jsb2NrQm9keSgpIDo6PSA8PAorPEBkZWNpc2lvbj48ZGVjaXNpb24+PEBlbmQ+CitjYXNlIGFsdF88ZGVjaXNpb25OdW1iZXI+Cis8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fTsgc2VwYXJhdG9yPSJcbiI+CitlbmQKKz4+CisKK2NhdGNoKGRlY2wsIGFjdGlvbikgOjo9IDw8CisjIC0gLSAtIC0gLSAtIEBjYXRjaCA8ZS5kZWNsPiAtIC0gLSAtIC0gLQorcmVzY3VlIDxlLmRlY2w+CisgIDxlLmFjdGlvbj48XG4+Cis+PgorCitjbG9zdXJlQmxvY2tMb29wKCkgOjo9IDw8Cit3aGlsZSB0cnVlICMgZGVjaXNpb24gPGRlY2lzaW9uTnVtYmVyPgorICBhbHRfPGRlY2lzaW9uTnVtYmVyPiA9IDxtYXhBbHQ+CisgIDxAZGVjaXNpb25Cb2R5PjxkZWNpc2lvbj48QGVuZD4KKyAgY2FzZSBhbHRfPGRlY2lzaW9uTnVtYmVyPgorICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fTsgc2VwYXJhdG9yPSJcbiI+CisgIGVsc2UKKyAgICBicmVhayAjIG91dCBvZiBsb29wIGZvciBkZWNpc2lvbiA8ZGVjaXNpb25OdW1iZXI+CisgIGVuZAorZW5kICMgbG9vcCBmb3IgZGVjaXNpb24gPGRlY2lzaW9uTnVtYmVyPgorPj4KKworZGVsZWdhdGVOYW1lKGQpIDo6PSA8PAorPGlmKGQubGFiZWwpPjxkLmxhYmVsOyBmb3JtYXQ9ImxhYmVsIj48ZWxzZT48ZC5uYW1lOyBmb3JtYXQ9InNuYWtlY2FzZSI+PGVuZGlmPgorPj4KKworZWxlbWVudChlKSA6Oj0gPDwKKzxlLmVsPjxcbj4KKz4+CisKK2V4ZWNGb3JjZWRBY3Rpb24oYWN0aW9uKSA6Oj0gIjxhY3Rpb24+IgorCitnbG9iYWxBdHRyaWJ1dGVTY29wZUNsYXNzKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT5AQDxzY29wZS5uYW1lPiA9IFNjb3BlKCA8c2NvcGUuYXR0cmlidXRlczp7aXQgfCA8aXQuZGVjbDsgZm9ybWF0PSJydWJ5U3RyaW5nIj59OyBzZXBhcmF0b3I9IiwgIj4gKTxcbj48ZW5kaWY+Cis+PgorCitnbG9iYWxBdHRyaWJ1dGVTY29wZVN0YWNrKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT5APHNjb3BlLm5hbWU+X3N0YWNrID0gW108XG4+PGVuZGlmPgorPj4KKworbm9SZXdyaXRlKHJld3JpdGVCbG9ja0xldmVsLCB0cmVlTGV2ZWwpIDo6PSAiIgorCitwYXJhbWV0ZXJTY29wZShzY29wZSkgOjo9IDw8Cis8c2NvcGUuYXR0cmlidXRlczp7aXQgfCA8aXQuZGVjbD59OyBzZXBhcmF0b3I9IiwgIj4KKz4+CisKK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrTG9vcCgpIDo6PSA8PAorbWF0Y2hfY291bnRfPGRlY2lzaW9uTnVtYmVyPiA9IDAKK3doaWxlIHRydWUKKyAgYWx0XzxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PgorICA8QGRlY2lzaW9uQm9keT48ZGVjaXNpb24+PEBlbmQ+CisgIGNhc2UgYWx0XzxkZWNpc2lvbk51bWJlcj4KKyAgPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLGEpPn07IHNlcGFyYXRvcj0iXG4iPgorICBlbHNlCisgICAgbWF0Y2hfY291bnRfPGRlY2lzaW9uTnVtYmVyPiA+IDAgYW5kIGJyZWFrCisgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgZWVlID0gRWFybHlFeGl0KDxkZWNpc2lvbk51bWJlcj4pCisgICAgPEBlYXJseUV4aXRFeGNlcHRpb24oKT48XG4+CisgICAgcmFpc2UgZWVlCisgIGVuZAorICBtYXRjaF9jb3VudF88ZGVjaXNpb25OdW1iZXI+ICs9IDEKK2VuZDxcbj4KKz4+CisKK3JldHVyblNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZShyPWl0KT4gPSBkZWZpbmVfcmV0dXJuX3Njb3BlIDxzY29wZS5hdHRyaWJ1dGVzOntpdCB8IDo8aXQuZGVjbD59OyBzZXBhcmF0b3I9IiwgIj4KKzxlbmRpZj4KKz4+CisKK3JldHVyblN0cnVjdE5hbWUocikgOjo9ICI8ci5uYW1lOyBmb3JtYXQ9XCJjYW1lbGNhc2VcIj5SZXR1cm5WYWx1ZSIKKworcnVsZUF0dHJpYnV0ZVNjb3BlQ2xhc3MgOjo9IGdsb2JhbEF0dHJpYnV0ZVNjb3BlQ2xhc3MKK3J1bGVBdHRyaWJ1dGVTY29wZVN0YWNrIDo6PSBnbG9iYWxBdHRyaWJ1dGVTY29wZVN0YWNrCisKK3J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK0BzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwIGFuZCByYWlzZSggQU5UTFIzOjpFcnJvcjo6QmFja3RyYWNraW5nRmFpbGVkICk8XG4+Cis8ZW5kaWY+Cis+PgorCitydWxlQm9keSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPjxpZihiYWNrdHJhY2tpbmcpPgorc3VjY2VzcyA9IGZhbHNlICMgZmxhZyB1c2VkIGZvciBtZW1vaXphdGlvbjxcbj4KKzxlbmRpZj48ZW5kaWY+CitiZWdpbgorICA8cnVsZU1lbW9pemF0aW9uKHJ1bGVOYW1lKT48YmxvY2s+PHJ1bGVDbGVhblVwKCk+PChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWN0aW9uKCk+Cis8aWYobWVtb2l6ZSk+PGlmKGJhY2t0cmFja2luZyk+CisgIHN1Y2Nlc3MgPSB0cnVlPFxuPgorPGVuZGlmPjxlbmRpZj4KKzxpZihleGNlcHRpb25zKT4KKyAgPGV4Y2VwdGlvbnM6e2V8PGNhdGNoKGRlY2w9ZS5kZWNsLGFjdGlvbj1lLmFjdGlvbik+PFxuPn0+Cis8ZWxzZT4KKzxpZighZW1wdHlSdWxlKT4KKzxpZihhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoKT4KKworIyAtIC0gLSAtIC0gLSAtIC0gQHJ1bGVjYXRjaCAtIC0gLSAtIC0gLSAtIC0KKzxhY3Rpb25zLihhY3Rpb25TY29wZSkucnVsZWNhdGNoPgorPGVsc2U+CityZXNjdWUgQU5UTFIzOjpFcnJvcjo6UmVjb2duaXRpb25FcnJvciA9PiByZQorICByZXBvcnRfZXJyb3IocmUpCisgIHJlY292ZXIocmUpCisgIDxAc2V0RXJyb3JSZXR1cm5WYWx1ZSgpPgorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorCitlbnN1cmUKKyAgPHRyYWNlT3V0KCk+PG1lbW9pemUoKT48cnVsZVNjb3BlQ2xlYW5VcCgpPjxmaW5hbGx5PgorZW5kCis+PgorCitydWxlUmV0dXJuVmFsdWUoKSA6Oj0gPCUKKzxpZighcnVsZURlc2NyaXB0b3IuaXNTeW5QcmVkKT4KKzxpZihydWxlRGVzY3JpcHRvci5oYXNSZXR1cm5WYWx1ZSk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzU2luZ2xlUmV0dXJuVmFsdWUpPgorPHJ1bGVEZXNjcmlwdG9yLnNpbmdsZVZhbHVlUmV0dXJuTmFtZT4KKzxlbHNlPgorcmV0dXJuX3ZhbHVlCis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CislPgorCisKK3J1bGVEZWNsYXJhdGlvbnMoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CityZXR1cm5fdmFsdWUgPSA8cmV0dXJuU3RydWN0TmFtZShyPXJ1bGVEZXNjcmlwdG9yKT4ubmV3CisKKyMgJHJ1bGUuc3RhcnQgPSB0aGUgZmlyc3QgdG9rZW4gc2VlbiBiZWZvcmUgbWF0Y2hpbmcKK3JldHVybl92YWx1ZS5zdGFydCA9IEBpbnB1dC5sb29rPFxuPgorPGVsc2U+Cis8cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUuYXR0cmlidXRlczp7YXw8YS5uYW1lPiA9IDxpZihhLmluaXRWYWx1ZSk+PGEuaW5pdFZhbHVlPjxlbHNlPm5pbDxlbmRpZj48XG4+fT4KKzxlbmRpZj4KKzxpZihtZW1vaXplKT4KKzxydWxlRGVzY3JpcHRvci5uYW1lPl9zdGFydF9pbmRleCA9IEBpbnB1dC5pbmRleDxcbj4KKzxlbmRpZj4KKz4+CisKK3J1bGVMYWJlbERlZihsYWJlbCkgOjo9IDw8Cis8bGFiZWwubGFiZWwudGV4dDsgZm9ybWF0PSJsYWJlbCI+ID0gbmlsPFxuPgorPj4KKworcnVsZUxhYmVsRGVmcygpIDo6PSA8PAorPFsKKyAgICBydWxlRGVzY3JpcHRvci50b2tlbkxhYmVscywKKyAgICBydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgICAgcnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGFiZWxzLAorICAgIHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHMsCisgICAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVscywKKyAgICBydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscworIF06CisgezxpdC5sYWJlbC50ZXh0OyBmb3JtYXQ9ImxhYmVsIj4gPSBuaWw8XG4+fQorPjxbCisgICAgcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLAorICAgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzLAorICAgIHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHMKKyAgXToKKyAge2xpc3Rfb2ZfPGl0LmxhYmVsLnRleHQ7IGZvcm1hdD0ibGFiZWwiPiA9IFtdPFxuPn0KKz4KKz4+CisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqIFIgVSBMIEUgICBIIEUgTCBQIEUgUiBTICogKiAqICogKiAqICogKiAqICogKiAqICovCisKK3RyYWNlSW4oKSA6Oj0gPDwKKzxpZih0cmFjZSk+Cit0cmFjZV9pbiggX19tZXRob2RfXywgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PiApPFxuPgorPGVsc2U+CisjIC0+IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIG1hbnVhbGx5IGVuYWJsZSBydWxlIHRyYWNpbmcKKyMgdHJhY2VfaW4oIF9fbWV0aG9kX18sIDxydWxlRGVzY3JpcHRvci5pbmRleD4gKTxcbj4KKzxlbmRpZj4KKz4+CisKK3RyYWNlT3V0KCkgOjo9IDw8Cis8aWYodHJhY2UpPgordHJhY2Vfb3V0KCBfX21ldGhvZF9fLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+ICk8XG4+Cis8ZWxzZT4KKyMgLT4gdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gbWFudWFsbHkgZW5hYmxlIHJ1bGUgdHJhY2luZworIyB0cmFjZV9vdXQoIF9fbWV0aG9kX18sIDxydWxlRGVzY3JpcHRvci5pbmRleD4gKTxcbj4KKzxlbmRpZj4KKz4+CisKK3J1bGVDbGVhblVwKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPGlmKCFUUkVFX1BBUlNFUik+CisjIC0gLSAtIC0gLSAtIC0gcnVsZSBjbGVhbiB1cCAtIC0gLSAtIC0gLSAtIC0KK3JldHVybl92YWx1ZS5zdG9wID0gQGlucHV0Lmxvb2soIC0xICk8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCitydWxlTWVtb2l6YXRpb24obmFtZSkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+CisjIHJ1bGUgbWVtb2l6YXRpb24KK2lmIEBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwIGFuZCBhbHJlYWR5X3BhcnNlZF9ydWxlPyggX19tZXRob2RfXyApCisgIHN1Y2Nlc3MgPSB0cnVlCisgIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+CitlbmQ8XG4+Cis8ZW5kaWY+Cis+PgorCisKK3J1bGVTY29wZVNldFVwKCkgOjo9IDw8Cis8cnVsZURlc2NyaXB0b3IudXNlU2NvcGVzOntpdCB8IEA8aXQ+X3N0YWNrLnB1c2goIEBAPGl0Pi5uZXcgKTxcbj59PjxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6e2l0IHwgQDxpdC5uYW1lPl9zdGFjay5wdXNoKCBAQDxpdC5uYW1lPi5uZXcgKTxcbj59PgorPj4KKworcnVsZVNjb3BlQ2xlYW5VcCgpIDo6PSA8PAorPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7aXQgfCBAPGl0Pl9zdGFjay5wb3A8XG4+fT48cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdCB8IEA8aXQubmFtZT5fc3RhY2sucG9wPFxuPn0+Cis+PgorCittZW1vaXplKCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+PGlmKGJhY2t0cmFja2luZyk+CittZW1vaXplKCBfX21ldGhvZF9fLCA8cnVsZURlc2NyaXB0b3IubmFtZT5fc3RhcnRfaW5kZXgsIHN1Y2Nlc3MgKSBpZiBAc3RhdGUuYmFja3RyYWNraW5nID4gMDxcbj4KKzxlbmRpZj48ZW5kaWY+Cis+PgorCisvKiogaGVscGVyIHRlbXBsYXRlIHRvIGZvcm1hdCBhIHJ1YnkgbWV0aG9kIGNhbGwgKi8KK21ldGhvZENhbGwobiwgZGVsLCBhcmdzKSA6Oj0gPDwKKzxpZihkZWwpPkA8ZGVsOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+PG4+PGlmKGFyZ3MpPiggPGFyZ3M7IHNlcGFyYXRvcj0iLCAiPiApPGVuZGlmPgorPj4KKworLyogKiAqICogKiAqICogKiAqICogKiAqICogTCBFIFggRSBSICAgUCBBIFIgVCBTICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworYWN0aW9uR2F0ZSgpIDo6PSAiQHN0YXRlLmJhY2t0cmFja2luZyA9PSAwIgorCisvKiogQSAoLi4uKSBzdWJydWxlIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRpdmVzICovCitibG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisjIGF0IGxpbmUgPGRlc2NyaXB0aW9uPgorYWx0XzxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PgorPGRlY2xzPgorPEBib2R5PjxibG9ja0JvZHkoKT48QGVuZD4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisjIGF0IGxpbmUgPGRlc2NyaXB0aW9uPgorYWx0XzxkZWNpc2lvbk51bWJlcj4gPSA8bWF4QWx0PgorPGRlY2xzPgorPEBkZWNpc2lvbj48ZGVjaXNpb24+PEBlbmQ+CitjYXNlIGFsdF88ZGVjaXNpb25OdW1iZXI+Cis8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fTsgc2VwYXJhdG9yPSJcbiI+CitlbmQKKz4+CisKK3J1bGVCbG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis+PgorCisvKiogQSBzcGVjaWFsIGNhc2Ugb2YgYSAoLi4uKSBzdWJydWxlIHdpdGggYSBzaW5nbGUgYWx0ZXJuYXRpdmUgKi8KK2Jsb2NrU2luZ2xlQWx0KGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgYXQgbGluZSA8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QHByZWFsdCgpPgorPGFsdHM+Cis+PgorCisvKiogQSAoLi4pKyBibG9jayB3aXRoIDAgb3IgbW9yZSBhbHRlcm5hdGl2ZXMgKi8KK3Bvc2l0aXZlQ2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKyMgYXQgZmlsZSA8ZGVzY3JpcHRpb24+Cis8ZGVjbHM+Cis8QGxvb3BCb2R5PgorPHBvc2l0aXZlQ2xvc3VyZUJsb2NrTG9vcCgpPgorPEBlbmQ+Cis+PgorCitwb3NpdGl2ZUNsb3N1cmVCbG9ja1NpbmdsZUFsdCA6Oj0gcG9zaXRpdmVDbG9zdXJlQmxvY2sKKworLyoqIEEgKC4uKSogYmxvY2sgd2l0aCAwIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitjbG9zdXJlQmxvY2soYWx0cyxkZWNscyxkZWNpc2lvbixlbmNsb3NpbmdCbG9ja0xldmVsLGJsb2NrTGV2ZWwsZGVjaXNpb25OdW1iZXIsbWF4SyxtYXhBbHQsZGVzY3JpcHRpb24pIDo6PSA8PAorIyBhdCBsaW5lIDxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAbG9vcEJvZHk+Cis8Y2xvc3VyZUJsb2NrTG9vcCgpPgorPEBlbmQ+Cis+PgorCitjbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IGNsb3N1cmVCbG9jaworCisvKiogT3B0aW9uYWwgYmxvY2tzICh4KT8gYXJlIHRyYW5zbGF0ZWQgdG8gKHh8KSBieSBiZWZvcmUgY29kZQorICAqIGdlbmVyYXRpb24gc28gd2UgY2FuIGp1c3QgdXNlIHRoZSBub3JtYWwgYmxvY2sgdGVtcGxhdGUKKyAgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBbiBhbHRlcm5hdGl2ZSBpcyBqdXN0IGEgbGlzdCBvZiBlbGVtZW50czsgYXQgb3V0ZXJtb3N0CisgICogbGV2ZWwKKyAgKi8KK2FsdChlbGVtZW50cyxhbHROdW0sZGVzY3JpcHRpb24sYXV0b0FTVCxvdXRlckFsdCx0cmVlTGV2ZWwscmV3KSA6Oj0gPDwKKyMgYXQgbGluZSA8ZGVzY3JpcHRpb24+Cis8ZWxlbWVudHM6ZWxlbWVudCgpPjxyZXc+Cis+PgorCisvKiogbWF0Y2ggYSB0b2tlbiBvcHRpb25hbGx5IHdpdGggYSBsYWJlbCBpbiBmcm9udCAqLwordG9rZW5SZWYodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPjxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ID0gPGVuZGlmPm1hdGNoKCA8dG9rZW4+LCBUT0tFTlNfRk9MTE9XSU5HXzx0b2tlbj5fSU5fPHJ1bGVOYW1lPl88ZWxlbWVudEluZGV4PiApCis+PgorCisvKiogaWRzKz1JRCAqLwordG9rZW5SZWZBbmRMaXN0TGFiZWwodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8dG9rZW5SZWYoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCisvKiBUUlkgVEhJUzoKK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorbGlzdF9vZl88bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiA8PCBtYXRjaCggPHRva2VuPiwgVE9LRU5TX0ZPTExPV0lOR188dG9rZW4+X0lOXzxydWxlTmFtZT5fPGVsZW1lbnRJbmRleD4gKQorPj4KKyovCisKK2FkZFRvTGlzdChsYWJlbCxlbGVtKSA6Oj0gPDwKK2xpc3Rfb2ZfPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gXDxcPCA8ZWxlbT48XG4+Cis+PgorCitsaXN0TGFiZWwgOjo9IGFkZFRvTGlzdAorCisvKiogRm9yIG5vdywgc2V0cyBhcmUgaW50ZXJ2YWwgdGVzdHMgYW5kIG11c3QgYmUgdGVzdGVkIGlubGluZSAqLworbWF0Y2hTZXQocyxsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zLHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ID0gQGlucHV0Lmxvb2s8XG4+Cis8ZW5kaWY+CitpZiA8cz4KKyAgQGlucHV0LmNvbnN1bWUKKyAgPHBvc3RtYXRjaENvZGU+Cis8aWYoIUxFWEVSKT4KKyAgQHN0YXRlLmVycm9yX3JlY292ZXJ5ID0gZmFsc2U8XG4+Cis8ZW5kaWY+CitlbHNlCisgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPgorICBtc2UgPSBNaXNtYXRjaGVkU2V0KCBuaWwgKQorICA8QG1pc21hdGNoZWRTZXRFeGNlcHRpb24oKT4KKzxpZihMRVhFUik+CisgIHJlY292ZXIgbXNlCisgIHJhaXNlIG1zZTxcbj4KKzxlbHNlPgorICByYWlzZSBtc2U8XG4+Cis8ZW5kaWY+CitlbmQKKzxcbj4KKz4+CisKKworbWF0Y2hTZXRBbmRMaXN0TGFiZWwocyxsYWJlbCxlbGVtZW50SW5kZXgscG9zdG1hdGNoQ29kZSkgOjo9IDw8Cis8bWF0Y2hTZXQoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCittYXRjaFJ1bGVCbG9ja1NldCA6Oj0gbWF0Y2hTZXQKKword2lsZGNhcmQodG9rZW4sbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucykgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gPSBAaW5wdXQubG9vazxcbj4KKzxlbmRpZj4KK21hdGNoX2FueQorPj4KKworLyogVFJZIFRISVM6Cit3aWxkY2FyZChsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiA9IDxlbmRpZj5tYXRjaF9hbnkKKz4+CisqLworCit3aWxkY2FyZEFuZExpc3RMYWJlbCh0b2tlbixsYWJlbCxlbGVtZW50SW5kZXgsdGVybWluYWxPcHRpb25zKSA6Oj0gPDwKKzx3aWxkY2FyZCguLi4pPgorPGFkZFRvTGlzdChlbGVtPXs8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPn0sLi4uKT4KKz4+CisKKworLyoqIE1hdGNoIGEgcnVsZSByZWZlcmVuY2UgYnkgaW52b2tpbmcgaXQgcG9zc2libHkgd2l0aAorICAqIGFyZ3VtZW50cyBhbmQgYSByZXR1cm4gdmFsdWUgb3IgdmFsdWVzLgorICAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK0BzdGF0ZS5mb2xsb3dpbmcucHVzaCggVE9LRU5TX0ZPTExPV0lOR188cnVsZS5uYW1lPl9JTl88cnVsZU5hbWU+XzxlbGVtZW50SW5kZXg+ICkKKzxpZihsYWJlbCk+PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gPSA8ZW5kaWY+PG1ldGhvZENhbGwoZGVsPXNjb3BlLCBuPXs8cnVsZS5uYW1lPn0sIGFyZ3M9YXJncyk+CitAc3RhdGUuZm9sbG93aW5nLnBvcAorPj4KKworLyoqIGlkcys9SUQgKi8KK3J1bGVSZWZBbmRMaXN0TGFiZWwocnVsZSxsYWJlbCxlbGVtZW50SW5kZXgsYXJncyxzY29wZSkgOjo9IDw8Cis8cnVsZVJlZiguLi4pPgorPGFkZFRvTGlzdChlbGVtPXs8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPn0sLi4uKT4KKz4+CisKKy8qKiBtYXRjaCBeKHJvb3QgY2hpbGRyZW4pIGluIHRyZWUgcGFyc2VyICovCit0cmVlKHJvb3QsIGFjdGlvbnNBZnRlclJvb3QsIGNoaWxkcmVuLCBudWxsYWJsZUNoaWxkTGlzdCwgZW5jbG9zaW5nVHJlZUxldmVsLCB0cmVlTGV2ZWwpIDo6PSA8PAorPHJvb3Q6ZWxlbWVudCgpPgorPGFjdGlvbnNBZnRlclJvb3Q6ZWxlbWVudCgpPgorPGlmKG51bGxhYmxlQ2hpbGRMaXN0KT4KK2lmIEBpbnB1dC5wZWVrID09IERPV04KKyAgbWF0Y2goIERPV04sIG5pbCApCisgIDxjaGlsZHJlbjplbGVtZW50KCk+CisgIG1hdGNoKCBVUCwgbmlsICkKK2VuZAorPGVsc2U+CittYXRjaCggRE9XTiwgbmlsICkKKzxjaGlsZHJlbjplbGVtZW50KCk+CittYXRjaCggVVAsIG5pbCApCis8ZW5kaWY+Cis+PgorCisvKiogRXZlcnkgcHJlZGljYXRlIGlzIHVzZWQgYXMgYSB2YWxpZGF0aW5nIHByZWRpY2F0ZSAoZXZlbiB3aGVuCisgICogaXQgaXMgYWxzbyBob2lzdGVkIGludG8gYSBwcmVkaWN0aW9uIGV4cHJlc3Npb24pLgorICAqLwordmFsaWRhdGVTZW1hbnRpY1ByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPgordW5sZXNzICggPGV2YWxQcmVkaWNhdGUoLi4uKT4gKQorICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgcmFpc2UgRmFpbGVkUHJlZGljYXRlKCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+IiApCitlbmQKKzxlbHNlPgorcmFpc2UgRmFpbGVkUHJlZGljYXRlKCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+IiApIHVubGVzcyAoIDxldmFsUHJlZGljYXRlKC4uLik+ICkKKzxlbmRpZj4KKz4+CisKK2RmYVN0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK2xvb2tfPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gQGlucHV0LnBlZWsoIDxrPiApPFxuPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuZWxzIj4KK2Vsc2UKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgIGFsdF88ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0Pjxcbj4KKzxlbHNlPgorPGlmKGJhY2t0cmFja2luZyk+CisgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxlbmRpZj4KKzxAbm9WaWFibGVBbHRFeGNlcHRpb24+CisgIHJhaXNlIE5vVmlhYmxlQWx0ZXJuYXRpdmUoICI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiApPFxuPgorPEBlbmQ+Cis8ZW5kaWY+CitlbmQKKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lCisgICogbG9vayBmb3IgdGhlIGJ5cGFzcyBhbHRlcm5hdGl2ZS4gIEl0IGRlbGF5cyBlcnJvcgorICAqIGRldGVjdGlvbiBidXQgdGhpcyBpcyBmYXN0ZXIsIHNtYWxsZXIsIGFuZCBtb3JlIHdoYXQgcGVvcGxlCisgICogZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlIGV4cGVjdCAiaWYgKCBMQSgxKT09WCApIG1hdGNoKFgpOyIKKyAgKiBhbmQgdGhhdCdzIGl0LiAqICBJZiBhIHNlbVByZWRTdGF0ZSwgZG9uJ3QgZm9yY2UgbG9vaworICAqIGxvb2t1cDsgcHJlZHMgbWlnaHQgbm90IG5lZWQuCisgICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorbG9va188ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBAaW5wdXQucGVlayggPGs+ICk8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHMiPgorZW5kCis+PgorCisKKy8qKiBBIERGQSBzdGF0ZSB0aGF0IGlzIGFjdHVhbGx5IHRoZSBsb29wYmFjayBkZWNpc2lvbiBvZiBhCisgICogY2xvc3VyZSBsb29wLiAgSWYgZW5kLW9mLXRva2VuIChFT1QpIHByZWRpY3RzIGFueSBvZiB0aGUKKyAgKiB0YXJnZXRzIHRoZW4gaXQgc2hvdWxkIGFjdCBsaWtlIGEgZGVmYXVsdCBjbGF1c2UgKGkuZS4sIG5vCisgICogZXJyb3IgY2FuIGJlIGdlbmVyYXRlZCkuIFRoaXMgaXMgdXNlZCBvbmx5IGluIHRoZSBsZXhlciBzbworICAqIHRoYXQgZm9yICgnYScpKiBvbiB0aGUgZW5kIG9mIGEgcnVsZSBhbnl0aGluZyBvdGhlciB0aGFuICdhJworICAqIHByZWRpY3RzIGV4aXRpbmcuICogIElmIGEgc2VtUHJlZFN0YXRlLCBkb24ndCBmb3JjZQorICAqIGxvb2sgbG9va3VwOyBwcmVkcyBtaWdodCBub3QgbmVlZC4KKyAgKi8KK2RmYUxvb3BiYWNrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAorbG9va188ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBAaW5wdXQucGVlayggPGs+ICk8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHMiPjxcbj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitlbHNlCisgIGFsdF88ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0Pjxcbj4KKzxlbmRpZj4KK2VuZAorPj4KKworCisvKiogQW4gYWNjZXB0IHN0YXRlIGluZGljYXRlcyBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBoYXMgYmVlbgorICAqIHByZWRpY3RlZAorICAqLworZGZhQWNjZXB0U3RhdGUoYWx0KSA6Oj0gImFsdF88ZGVjaXNpb25OdW1iZXI+ID0gPGFsdD4iCisKKy8qKiBBIHNpbXBsZSBlZGdlIHdpdGggYW4gZXhwcmVzc2lvbi4gIElmIHRoZSBleHByZXNzaW9uIGlzCisgICogc2F0aXNmaWVkLCBlbnRlciB0byB0aGUgdGFyZ2V0IHN0YXRlLiAgVG8gaGFuZGxlIGdhdGVkCisgICogcHJvZHVjdGlvbnMsIHdlIG1heSBoYXZlIHRvIGV2YWx1YXRlIHNvbWUgcHJlZGljYXRlcyBmb3IKKyAgKiB0aGlzIGVkZ2UuCisgICovCitkZmFFZGdlKGxhYmVsRXhwciwgdGFyZ2V0U3RhdGUsIHByZWRpY2F0ZXMpIDo6PSA8PAoraWYgKCA8bGFiZWxFeHByPiApPGlmKHByZWRpY2F0ZXMpPiBhbmQgKCA8cHJlZGljYXRlcz4gKTxlbmRpZj4KKyAgPHRhcmdldFN0YXRlPgorPj4KKworCisvKiogQSBERkEgc3RhdGUgd2hlcmUgYSBTV0lUQ0ggbWF5IGJlIGdlbmVyYXRlZC4gIFRoZSBjb2RlCisgICogZ2VuZXJhdG9yIGRlY2lkZXMgaWYgdGhpcyBpcyBwb3NzaWJsZToKKyAgKiBDb2RlR2VuZXJhdG9yLmNhbkdlbmVyYXRlU3dpdGNoKCkuCisgICovCitkZmFTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitjYXNlIGxvb2tfPGRlY2lzaW9uTnVtYmVyPiA9IEBpbnB1dC5wZWVrKCA8az4gKQorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KK2Vsc2UKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgIGFsdF88ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0Pjxcbj4KKzxlbHNlPgorPGlmKGJhY2t0cmFja2luZyk+CisgIDxydWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxlbmRpZj4KKzxAbm9WaWFibGVBbHRFeGNlcHRpb24+CisgIHJhaXNlIE5vVmlhYmxlQWx0ZXJuYXRpdmUoICI8ZGVzY3JpcHRpb24+IiwgPGRlY2lzaW9uTnVtYmVyPiwgPHN0YXRlTnVtYmVyPiApPFxuPgorPEBlbmQ+Cis8ZW5kaWY+CitlbmQKKz4+CisKKworZGZhT3B0aW9uYWxCbG9ja1N0YXRlU3dpdGNoKGssIGVkZ2VzLCBlb3RQcmVkaWN0c0FsdCwgZGVzY3JpcHRpb24sIHN0YXRlTnVtYmVyLCBzZW1QcmVkU3RhdGUpIDo6PSA8PAorY2FzZSBsb29rXzxkZWNpc2lvbk51bWJlcj4gPSBAaW5wdXQucGVlayggPGs+ICkKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+CitlbmQKKz4+CisKK2RmYUxvb3BiYWNrU3RhdGVTd2l0Y2goaywgZWRnZXMsIGVvdFByZWRpY3RzQWx0LCBkZXNjcmlwdGlvbiwgc3RhdGVOdW1iZXIsIHNlbVByZWRTdGF0ZSkgOjo9IDw8CitjYXNlIGxvb2tfPGRlY2lzaW9uTnVtYmVyPiA9IEBpbnB1dC5wZWVrKCA8az4gKQorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CitlbHNlCisgIGFsdF88ZGVjaXNpb25OdW1iZXI+ID0gPGVvdFByZWRpY3RzQWx0PgorPGVuZGlmPgorZW5kCis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAord2hlbiA8bGFiZWxzOntpdCB8IDxpdD59OyBzZXBhcmF0b3I9IiwgIj4gdGhlbiA8dGFyZ2V0U3RhdGU+Cis+PgorCisvKiogVGhlIGNvZGUgdG8gaW5pdGlhdGUgZXhlY3V0aW9uIG9mIGEgY3ljbGljIERGQTsgdGhpcyBpcyB1c2VkCisgICogaW4gdGhlIHJ1bGUgdG8gcHJlZGljdCBhbiBhbHQganVzdCBsaWtlIHRoZSBmaXhlZCBERkEgY2FzZS4KKyAgKiBUaGUgPG5hbWU+IGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgdmlhIHRoZSBwYXJzZXIsIGxleGVyLCAuLi4KKyAgKi8KK2RmYURlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLCBkZXNjcmlwdGlvbikgOjo9IDw8CithbHRfPGRlY2lzaW9uTnVtYmVyPiA9IEBkZmE8ZGVjaXNpb25OdW1iZXI+LnByZWRpY3QoIEBpbnB1dCApCis+PgorCisvKiogR2VuZXJhdGUgdGhlIHRhYmxlcyBhbmQgc3VwcG9ydCBjb2RlIG5lZWRlZCBmb3IgdGhlIERGQVN0YXRlCisgICogb2JqZWN0IGFyZ3VtZW50LiAgVW5sZXNzIHRoZXJlIGlzIGEgc2VtYW50aWMgcHJlZGljYXRlIChvcgorICAqIHN5biBwcmVkLCB3aGljaCBiZWNvbWUgc2VtIHByZWRzKSwgYWxsIHN0YXRlcyBzaG91bGQgYmUKKyAgKiBlbmNvZGVkIGluIHRoZSBzdGF0ZSB0YWJsZXMuIENvbnNlcXVlbnRseSwKKyAgKiBjeWNsaWNERkFTdGF0ZS9jeWNsaWNERkFFZGdlLGVvdERGQUVkZ2UgdGVtcGxhdGVzIGFyZSBub3QKKyAgKiB1c2VkIGV4Y2VwdCBmb3Igc3BlY2lhbCBERkEgc3RhdGVzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMKKyAgKiBhIHRyYW5zaXRpb24gdGFibGUuCisgICovCitjeWNsaWNERkEoZGZhKSA6Oj0gPDwKK2NsYXNzIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+IFw8IEFOVExSMzo6REZBCisgIEVPVCA9IHVucGFjayggPGRmYS5qYXZhQ29tcHJlc3NlZEVPVDsgYW5jaG9yLCBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4iPiApCisgIEVPRiA9IHVucGFjayggPGRmYS5qYXZhQ29tcHJlc3NlZEVPRjsgYW5jaG9yLCBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4iPiApCisgIE1JTiA9IHVucGFjayggPGRmYS5qYXZhQ29tcHJlc3NlZE1pbjsgYW5jaG9yLCBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4iPiApCisgIE1BWCA9IHVucGFjayggPGRmYS5qYXZhQ29tcHJlc3NlZE1heDsgYW5jaG9yLCBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4iPiApCisgIEFDQ0VQVCA9IHVucGFjayggPGRmYS5qYXZhQ29tcHJlc3NlZEFjY2VwdDsgYW5jaG9yLCBzZXBhcmF0b3I9IiwgIiwgd3JhcD0iXG4iPiApCisgIFNQRUNJQUwgPSB1bnBhY2soIDxkZmEuamF2YUNvbXByZXNzZWRTcGVjaWFsOyBhbmNob3IsIHNlcGFyYXRvcj0iLCAiLCB3cmFwPSJcbiI+ICkKKyAgVFJBTlNJVElPTiA9IFsKKyAgICA8ZGZhLmphdmFDb21wcmVzc2VkVHJhbnNpdGlvbjp7c3x1bnBhY2soIDxzOyB3cmFwPSJcbiIsIGFuY2hvciwgc2VwYXJhdG9yPSIsICI+ICl9OyBzZXBhcmF0b3I9IixcbiI+CisgIF0uZnJlZXplCisKKyAgKCAwIC4uLiBNSU4ubGVuZ3RoICkuemlwKCBNSU4sIE1BWCApIGRvIHwgaSwgYSwgeiB8CisgICAgaWYgYSBcPiAwIGFuZCB6IFw8IDAKKyAgICAgIE1BWFsgaSBdICU9IDB4MTAwMDAKKyAgICBlbmQKKyAgZW5kCisKKyAgQGRlY2lzaW9uID0gPGRmYS5kZWNpc2lvbk51bWJlcj4KKworICA8QGVycm9yTWV0aG9kKCk+Cis8aWYoZGZhLmRlc2NyaXB0aW9uKT4KKworICBkZWYgZGVzY3JpcHRpb24KKyAgICBcPFw8LSdfX2RmYV9kZXNjcmlwdGlvbl9fJy5zdHJpcCEKKyAgICAgIDxkZmEuZGVzY3JpcHRpb24+CisgICAgX19kZmFfZGVzY3JpcHRpb25fXworICBlbmQ8XG4+Cis8ZW5kaWY+CitlbmQ8XG4+Cis+PgorCisKK3NwZWNpYWxTdGF0ZVRyYW5zaXRpb25NZXRob2QoZGZhKSA6Oj0gPDwKK2RlZiBzcGVjaWFsX3N0YXRlX3RyYW5zaXRpb25fZm9yX2RmYTxkZmEuZGVjaXNpb25OdW1iZXI+KHMsIGlucHV0KQorICBjYXNlIHMKKyAgPGRmYS5zcGVjaWFsU3RhdGVTVHM6e3N0YXRlfHdoZW4gPGkwPgorICA8c3RhdGU+fTsgc2VwYXJhdG9yPSJcbiI+CisgIGVuZAorPGlmKGJhY2t0cmFja2luZyk+CisgIEBzdGF0ZS5iYWNrdHJhY2tpbmcgPiAwIGFuZCByYWlzZSBBTlRMUjM6OkVycm9yOjpCYWNrdHJhY2tpbmdGYWlsZWQ8XG4+Cis8ZW5kaWY+CisgIG52YSA9IEFOVExSMzo6RXJyb3I6Ok5vVmlhYmxlQWx0ZXJuYXRpdmUubmV3KCBAZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4uZGVzY3JpcHRpb24sIDxkZmEuZGVjaXNpb25OdW1iZXI+LCBzLCBpbnB1dCApCisgIEBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPi5lcnJvciggbnZhICkKKyAgcmFpc2UgbnZhCitlbmQKKz4+CisKK2N5Y2xpY0RGQVN5bnByZWQoIG5hbWUgKSA6Oj0gPDwKK2RlZiA8bmFtZT4oKSBAcmVjb2duaXplci48bmFtZT4gZW5kPFxuPgorPj4KKworY3ljbGljREZBSW5pdChkZmEpIDo6PSA8PAorPGlmKGRmYS5zcGVjaWFsU3RhdGVTVHMpPgorQGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj4ubmV3KCBzZWxmLCA8ZGZhLmRlY2lzaW9uTnVtYmVyPiApIGRvIHxzfAorICBjYXNlIHMKKyAgPGRmYS5zcGVjaWFsU3RhdGVTVHM6e3N0YXRlfHdoZW4gPGkwPgorICA8c3RhdGU+fTsgc2VwYXJhdG9yPSJcbiI+CisgIGVuZAorCisgIGlmIHMgXDwgMAorPGlmKGJhY2t0cmFja2luZyk+CisgICAgQHN0YXRlLmJhY2t0cmFja2luZyA+IDAgYW5kIHJhaXNlIEFOVExSMzo6RXJyb3I6OkJhY2t0cmFja2luZ0ZhaWxlZDxcbj4KKzxlbmRpZj4KKyAgICBudmEgPSBBTlRMUjM6OkVycm9yOjpOb1ZpYWJsZUFsdGVybmF0aXZlLm5ldyggQGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+LmRlc2NyaXB0aW9uLCA8ZGZhLmRlY2lzaW9uTnVtYmVyPiwgcywgaW5wdXQgKQorICAgIEBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPi5lcnJvciggbnZhICkKKyAgICByYWlzZSBudmEKKyAgZW5kCisKKyAgcworZW5kPFxuPgorPGVsc2U+CitAZGZhPGRmYS5kZWNpc2lvbk51bWJlcj4gPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPi5uZXcoIHNlbGYsIDxkZmEuZGVjaXNpb25OdW1iZXI+ICk8XG4+Cis8ZW5kaWY+Cis+PgorCisKKy8qKiBBIHNwZWNpYWwgc3RhdGUgaW4gYSBjeWNsaWMgREZBOyBzcGVjaWFsIG1lYW5zIGhhcyBhCisgICogc2VtYW50aWMgcHJlZGljYXRlIG9yIGl0J3MgYSBodWdlIHNldCBvZiBzeW1ib2xzIHRvIGNoZWNrLgorICAqLworY3ljbGljREZBU3RhdGUoZGVjaXNpb25OdW1iZXIsIHN0YXRlTnVtYmVyLCBlZGdlcywgbmVlZEVycm9yQ2xhdXNlLCBzZW1QcmVkU3RhdGUpIDo6PSA8PAorbG9va188ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBAaW5wdXQucGVlaworPGlmKHNlbVByZWRTdGF0ZSk+CitpbmRleF88ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gPSBAaW5wdXQuaW5kZXgKK0BpbnB1dC5yZXdpbmQoIEBpbnB1dC5sYXN0X21hcmtlciwgZmFsc2UgKTxcbj4KKzxlbmRpZj4KK3MgPSAtMQorPGVkZ2VzOyBzZXBhcmF0b3I9ImVscyI+ZW5kCis8aWYoc2VtUHJlZFN0YXRlKT4gPCEgcmV0dXJuIGlucHV0IGN1cnNvciB0byBzdGF0ZSBiZWZvcmUgd2UgcmV3b3VuZCAhPgorQGlucHV0LnNlZWsoIGluZGV4XzxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiApPFxuPgorPGVuZGlmPgorPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rIGFuZCBpbmRpY2F0ZQorICAqIHdoYXQgc3RhdGUgdG8ganVtcCB0byBuZXh0IGlmIHN1Y2Nlc3NmdWwuICBBZ2FpbiwgdGhpcyBpcworICAqIGZvciBzcGVjaWFsIHN0YXRlcy4KKyAgKi8KK2N5Y2xpY0RGQUVkZ2UobGFiZWxFeHByLCB0YXJnZXRTdGF0ZU51bWJlciwgZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitpZiAoIDxsYWJlbEV4cHI+ICk8aWYocHJlZGljYXRlcyk+IGFuZCAoIDxwcmVkaWNhdGVzPiApPGVuZGlmPgorICBzID0gPHRhcmdldFN0YXRlTnVtYmVyPjxcbj4KKz4+CisKKy8qKiBBbiBlZGdlIHBvaW50aW5nIGF0IGVuZC1vZi10b2tlbjsgZXNzZW50aWFsbHkgbWF0Y2hlcyBhbnkKKyAgKiBjaGFyOyBhbHdheXMganVtcCB0byB0aGUgdGFyZ2V0LgorICAqLworZW90REZBRWRnZSh0YXJnZXRTdGF0ZU51bWJlciwgZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitlCisgIHMgPSA8dGFyZ2V0U3RhdGVOdW1iZXI+PFxuPgorPj4KKworYW5kUHJlZGljYXRlcyhsZWZ0LHJpZ2h0KSA6Oj0gIiggPGxlZnQ+ICkgYW5kICggPHJpZ2h0PiApIgorCitvclByZWRpY2F0ZXMob3BlcmFuZHMpIDo6PSAiKCA8Zmlyc3Qob3BlcmFuZHMpPiApPHJlc3Qob3BlcmFuZHMpOntvfCAgb3IgKCA8bz4gKX0+IgorCitub3RQcmVkaWNhdGUocHJlZCkgOjo9ICJub3QgKCA8cHJlZD4gKSIKKworZXZhbFByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIiggPHByZWQ+ICkiCisKK2V2YWxTeW5QcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9IDw8CitzeW50YWN0aWNfcHJlZGljYXRlPyggOjxwcmVkOntpdCB8IDxpdD59PiApCis+PgorCitsb29rYWhlYWRUZXN0KGF0b20sIGssIGF0b21Bc0ludCkgOjo9ICJsb29rXzxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9PSA8YXRvbT4iCisKKy8qKiBTb21ldGltZXMgYSBsb29rIHRlc3QgY2Fubm90IGFzc3VtZSB0aGF0IExBKGspIGlzIGluIGEKKyAgKiB0ZW1wIHZhcmlhYmxlIHNvbWV3aGVyZS4gIE11c3QgYXNrIGZvciB0aGUgbG9vaworICAqIGRpcmVjdGx5LgorICAqLworaXNvbGF0ZWRMb29rYWhlYWRUZXN0KGF0b20sIGssIGF0b21Bc0ludCkgOjo9ICJAaW5wdXQucGVlayg8az4pID09IDxhdG9tPiIKKworbG9va2FoZWFkUmFuZ2VUZXN0KGxvd2VyLCB1cHBlciwgaywgcmFuZ2VOdW1iZXIsIGxvd2VyQXNJbnQsIHVwcGVyQXNJbnQpIDo6PSA8PAorbG9va188ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4uYmV0d2Vlbj8oIDxsb3dlcj4sIDx1cHBlcj4gKQorPj4KKworaXNvbGF0ZWRMb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsIHVwcGVyLCBrLCByYW5nZU51bWJlciwgbG93ZXJBc0ludCwgdXBwZXJBc0ludCkgOjo9IDw8CitAaW5wdXQucGVlayggPGs+ICkuYmV0d2Vlbj8oIDxsb3dlcj4sIDx1cHBlcj4gKQorPj4KKworc2V0VGVzdChyYW5nZXMpIDo6PSA8PAorPHJhbmdlczsgc2VwYXJhdG9yPSIgfHwgIj4KKz4+CisKK3BhcmFtZXRlckF0dHJpYnV0ZVJlZihhdHRyKSA6Oj0gIjxhdHRyLm5hbWU+IgorCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+ID0gPGV4cHI+IgorCitzY29wZUF0dHJpYnV0ZVJlZihzY29wZSwgYXR0ciwgaW5kZXgsIG5lZ0luZGV4KSA6Oj0gPDwKKzxpZihuZWdJbmRleCk+CitAPHNjb3BlPl9zdGFja1sgLTxuZWdJbmRleD4gXS48YXR0ci5uYW1lPgorPGVsc2U+Cis8aWYoaW5kZXgpPgorQDxzY29wZT5fc3RhY2tbIDxpbmRleD4gXS48YXR0ci5uYW1lPgorPGVsc2U+CitAPHNjb3BlPl9zdGFjay5sYXN0LjxhdHRyLm5hbWU+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisKK3Njb3BlU2V0QXR0cmlidXRlUmVmKHNjb3BlLCBhdHRyLCBleHByLCBpbmRleCwgbmVnSW5kZXgpIDo6PSA8PAorPGlmKG5lZ0luZGV4KT4KK0A8c2NvcGU+X3N0YWNrWyAtPG5lZ0luZGV4PiBdLjxhdHRyLm5hbWU+ID0gPGV4cHI+Cis8ZWxzZT4KKzxpZihpbmRleCk+CitAPHNjb3BlPl9zdGFja1sgPGluZGV4PiBdLjxhdHRyLm5hbWU+ID0gPGV4cHI+Cis8ZWxzZT4KK0A8c2NvcGU+X3N0YWNrLmxhc3QuPGF0dHIubmFtZT4gPSA8ZXhwcj4KKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsKKyAgKiByZWZlcnMgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAgKiBwcmVkaWNhdGVzIGxpa2UgeyRmdW5jdGlvbi5zaXplKCk+MCAmJgorICAqICRmdW5jdGlvbjo6bmFtZS5lcXVhbHMoImZvbyIpfT8KKyAgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gIkA8c2NvcGU+X3N0YWNrIgorCisvKiogcmVmZXJlbmNlIGFuIGF0dHJpYnV0ZSBvZiBydWxlOyBtaWdodCBvbmx5IGhhdmUgc2luZ2xlCisgICogcmV0dXJuIHZhbHVlCisgICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsIHNjb3BlLCBhdHRyKSA6Oj0gPDwKKzxpZihyZWZlcmVuY2VkUnVsZS5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CisoIDxzY29wZTsgZm9ybWF0PSJsYWJlbCI+Lm5pbD8gPyBuaWwgOiA8c2NvcGU7IGZvcm1hdD0ibGFiZWwiPi48YXR0ci5uYW1lPiApCis8ZWxzZT4KKzxzY29wZTsgZm9ybWF0PSJsYWJlbCI+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5BdHRyaWJ1dGVSZWYocnVsZURlc2NyaXB0b3IsIGF0dHIpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHVybl92YWx1ZS48YXR0ci5uYW1lPgorPGVsc2U+Cis8YXR0ci5uYW1lPgorPGVuZGlmPgorPj4KKworcmV0dXJuU2V0QXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLCBhdHRyLCBleHByKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CityZXR1cm5fdmFsdWUuPGF0dHIubmFtZT4gPSA8ZXhwcj4KKzxlbHNlPgorPGF0dHIubmFtZT4gPSA8ZXhwcj4KKzxlbmRpZj4KKz4+CisKKy8qKiBIb3cgdG8gdHJhbnNsYXRlICR0b2tlbkxhYmVsICovCit0b2tlbkxhYmVsUmVmKGxhYmVsKSA6Oj0gIjxsYWJlbDsgZm9ybWF0PVwibGFiZWxcIj4iCisKKy8qKiBpZHMrPUlEIHskaWRzfSBvciBlKz1leHByIHskZX0gKi8KK2xpc3RMYWJlbFJlZihsYWJlbCkgOjo9ICJsaXN0X29mXzxsYWJlbDsgZm9ybWF0PVwibGFiZWxcIj4iCisKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLCBhdHRyKSA6Oj0gIjxzY29wZTsgZm9ybWF0PVwibGFiZWxcIj4udGV4dCIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLCBhdHRyKSA6Oj0gIjxzY29wZTsgZm9ybWF0PVwibGFiZWxcIj4udHlwZSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLCBhdHRyKSA6Oj0gIjxzY29wZTsgZm9ybWF0PVwibGFiZWxcIj4ubGluZSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsIGF0dHIpIDo6PSAiPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPi5jb2x1bW4iCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfY2hhbm5lbChzY29wZSwgYXR0cikgOjo9ICI8c2NvcGU7IGZvcm1hdD1cImxhYmVsXCI+LmNoYW5uZWwiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsIGF0dHIpIDo6PSAiPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPi5pbmRleCIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLCBhdHRyKSA6Oj0gInRyZWVfZm9yXzxzY29wZT4iCisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLCBhdHRyKSA6Oj0gIjxzY29wZTsgZm9ybWF0PVwibGFiZWxcIj4uc3RhcnQiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLCBhdHRyKSA6Oj0gIjxzY29wZTsgZm9ybWF0PVwibGFiZWxcIj4uc3RvcCIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsIGF0dHIpIDo6PSAiPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPi50cmVlIgorCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLCBhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CisoCisgIEBpbnB1dC50b2tlbl9zdHJlYW0udG9fcygKKyAgICBAaW5wdXQudHJlZV9hZGFwdG9yLnRva2VuX3N0YXJ0X2luZGV4KCA8c2NvcGU7IGZvcm1hdD0ibGFiZWwiPi5zdGFydCApLAorICAgIEBpbnB1dC50cmVlX2FkYXB0b3IudG9rZW5fc3RvcF9pbmRleCggPHNjb3BlOyBmb3JtYXQ9ImxhYmVsIj4uc3RhcnQgKQorICApIGlmIDxzY29wZTsgZm9ybWF0PSJsYWJlbCI+CispCis8ZWxzZT4KKyggPHNjb3BlOyBmb3JtYXQ9ImxhYmVsIj4gJiYgQGlucHV0LnRvX3MoIDxzY29wZTsgZm9ybWF0PSJsYWJlbCI+LnN0YXJ0LCA8c2NvcGU7IGZvcm1hdD0ibGFiZWwiPi5zdG9wICkgKQorPGVuZGlmPgorPj4KK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0KHNjb3BlLCBhdHRyKSA6Oj0gIiggPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPiAmJiA8c2NvcGU7IGZvcm1hdD1cImxhYmVsXCI+LnRlbXBsYXRlICkiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKiAgTCBFIFggRSBSIC0gTyBOIEwgWSAgIFQgRSBNIFAgTCBBIFQgRSBTICAqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2xleGVyU3lucHJlZChuYW1lKSA6Oj0gIiIKKworbGV4ZXIoZ3JhbW1hciwgbmFtZSwgdG9rZW5zLCBzY29wZXMsIHJ1bGVzLCBudW1SdWxlcywgbGFiZWxUeXBlPSJBTlRMUjM6OlRva2VuIiwgZmlsdGVyTW9kZSwgc3VwZXJDbGFzcz0iQU5UTFIzOjpMZXhlciIpIDo6PSA8PAorPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+PGF1dG9sb2FkRGVsZWdhdGVzKCk+PGVuZGlmPgorCitjbGFzcyA8aWYoZ3JhbW1hci5kZWxlZ2F0b3IpPjxncmFtbWFyLm5hbWU+PGVsc2U+TGV4ZXI8ZW5kaWY+IFw8IDxzdXBlckNsYXNzPgorICBAZ3JhbW1hcl9ob21lID0gPGdyYW1tYXIubmFtZT4KKzxpZighZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgPGF1dG9sb2FkRGVsZWdhdGVzKCk+PFxuPgorPGVuZGlmPgorICBpbmNsdWRlIFRva2VuRGF0YQorPGlmKGZpbHRlck1vZGUpPgorICBpbmNsdWRlIEFOVExSMzo6RmlsdGVyTW9kZTxcbj4KKzxlbmRpZj4KKyAgPHNjb3Blczp7aXQgfCA8aWYoaXQuaXNEeW5hbWljR2xvYmFsU2NvcGUpPjxnbG9iYWxBdHRyaWJ1dGVTY29wZUNsYXNzKCk+PFxuPjxlbmRpZj59PgorCisgIGJlZ2luCisgICAgZ2VuZXJhdGVkX3VzaW5nKCAiPGZpbGVOYW1lPiIsICI8QU5UTFJWZXJzaW9uPiIsICI8cnVudGltZUxpYnJhcnlWZXJzaW9uKCk+IiApCisgIHJlc2N1ZSBOb01ldGhvZEVycm9yID0+IGVycm9yCisgICAgIyBpZ25vcmUKKyAgZW5kCisKKyAgUlVMRV9OQU1FUyAgID0gWyA8dHJ1bmMocnVsZXMpOntyfCI8ci5ydWxlTmFtZT4ifTsgc2VwYXJhdG9yPSIsICIsIHdyYXA9IlxuIiwgYW5jaG9yPiBdLmZyZWV6ZQorICBSVUxFX01FVEhPRFMgPSBbIDx0cnVuYyhydWxlcyk6e3J8OjxyLnJ1bGVOYW1lOyBmb3JtYXQ9ImxleGVyUnVsZSI+fTsgc2VwYXJhdG9yPSIsICIsIHdyYXA9IlxuIiwgYW5jaG9yPiBdLmZyZWV6ZQorCis8aWYoZ3JhbW1hci5kZWxlZ2F0b3JzKT4KKyAgbWFzdGVycyggPGdyYW1tYXIuZGVsZWdhdG9yczp7ZHw6PGQubmFtZT59OyBzZXBhcmF0b3I9IiwgIj4gKTxcbj4KKzxlbmRpZj4KKzxpZihncmFtbWFyLmRpcmVjdERlbGVnYXRlcyk+CisgIGltcG9ydHMoIDxncmFtbWFyLmRpcmVjdERlbGVnYXRlczp7ZHw6PGQubmFtZT59OyBzZXBhcmF0b3I9IiwgIj4gKTxcbj4KKzxlbmRpZj4KKworICBkZWYgaW5pdGlhbGl6ZSggPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4sIH0+aW5wdXQ9bmlsLCBvcHRpb25zID0ge30gKQorICAgIHN1cGVyKCBpbnB1dCwgb3B0aW9ucyApCis8aWYobWVtb2l6ZSk+Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgICBAc3RhdGUucnVsZV9tZW1vcnkgPSB7fTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOntnfEA8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT48XG4+fT48Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6e2d8QDxnOmRlbGVnYXRlTmFtZSgpPiA9IDxuZXdEZWxlZ2F0ZShnKT48XG4+fT48bGFzdChncmFtbWFyLmRlbGVnYXRvcnMpOntnfEBwYXJlbnQgPSBAPGc6ZGVsZWdhdGVOYW1lKCk+PFxuPn0+PHBsYWNlQWN0aW9uKHNjb3BlPSJsZXhlciIsbmFtZT0iaW5pdCIpPgorICBlbmQKKworICA8cGxhY2VBY3Rpb24oc2NvcGU9ImxleGVyIixuYW1lPSJtZW1iZXJzIik+CisKKyAgIyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gbGV4ZXIgcnVsZXMgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgPHJ1bGVzOntpdCB8IDxpdD48XG4+fT4KKzxpZihncmFtbWFyLmRlbGVnYXRlZFJ1bGVzKT4KKworICAjIC0gLSAtIC0gLSAtIC0gLSAtIC0gZGVsZWdhdGVkIHJ1bGVzIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICA8Z3JhbW1hci5kZWxlZ2F0ZWRSdWxlczp7cnVsZURlc2NyaXB0b3J8PGRlbGVnYXRlTGV4ZXJSdWxlKHJ1bGVEZXNjcmlwdG9yKT48XG4+PFxuPn0+Cis8ZW5kaWY+Cis8aWYoY3ljbGljREZBcyk+CisKKyAgIyAtIC0gLSAtIC0gLSAtIC0gLSAtIERGQSBkZWZpbml0aW9ucyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKyAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+CisKKyAgcHJpdmF0ZQorCisgIGRlZiBpbml0aWFsaXplX2RmYXMKKyAgICBzdXBlciByZXNjdWUgbmlsCisgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBSW5pdCgpPgorICBlbmQKKworPGVuZGlmPgorZW5kICMgY2xhc3MgPGlmKGdyYW1tYXIuZGVsZWdhdG9yKT48Z3JhbW1hci5uYW1lPjxlbHNlPkxleGVyPGVuZGlmPiBcPCA8c3VwZXJDbGFzcz4KKzxpZighYWN0aW9ucy4oYWN0aW9uU2NvcGUpLm1haW4pPgorCithdF9leGl0IHsgPGlmKGdyYW1tYXIuZGVsZWdhdG9yKT48Z3JhbW1hci5uYW1lPjxlbHNlPkxleGVyPGVuZGlmPi5tYWluKCBBUkdWICkgfSBpZiBfX0ZJTEVfXyA9PSAkMAorPGVuZGlmPgorPj4KKworCitsZXhlclJ1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxpZihbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMscnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHMscnVsZURlc2NyaXB0b3IuY2hhckxhYmVscyxydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMscnVsZURlc2NyaXB0b3IucnVsZUxpc3RMYWJlbHNdKT4KKyMgLSAtIC0gLSBsYWJlbCBpbml0aWFsaXphdGlvbiAtIC0gLSAtCis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLmNoYXJMYWJlbHNdOntpdCB8IDxpdC5sYWJlbC50ZXh0OyBmb3JtYXQ9ImxhYmVsIj4gPSBuaWw8XG4+fT4KKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MaXN0TGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXTp7aXQgfCBsaXN0X29mXzxpdC5sYWJlbC50ZXh0OyBmb3JtYXQ9ImxhYmVsIj4gPSBbXSB1bmxlc3MgZGVmaW5lZD8obGlzdF9vZl88aXQubGFiZWwudGV4dDsgZm9ybWF0PSJsYWJlbCI+KTxcbj59PgorPGVuZGlmPgorPj4KKworCisvKiogSG93IHRvIGdlbmVyYXRlIGEgcnVsZSBpbiB0aGUgbGV4ZXI7IG5ha2VkIGJsb2NrcyBhcmUgdXNlZAorICAqIGZvciBmcmFnbWVudCBydWxlcy4KKyAgKi8KK2xleGVyUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLG1lbW9pemUpIDo6PSA8PAorIyBsZXhlciBydWxlIDxydWxlTmFtZTsgZm9ybWF0PSJsZXhlclJ1bGUiPiAoPHJ1bGVOYW1lPikKKyMgKGluIDxmaWxlTmFtZT4pCitkZWYgPHJ1bGVOYW1lOyBmb3JtYXQ9ImxleGVyUnVsZSI+PGlmKHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlKT4oIDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZTpwYXJhbWV0ZXJTY29wZSgpPiApPGVuZGlmPgorICA8dHJhY2VJbigpPjxydWxlU2NvcGVTZXRVcCgpPjxydWxlRGVjbGFyYXRpb25zKCk+PGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CisKKyAgIyBiYWNrdHJhY2tpbmcgc3VjY2VzcworICBzdWNjZXNzID0gZmFsc2U8XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8aWYobmFrZWRCbG9jayk+CisgIDxydWxlTWVtb2l6YXRpb24oezxydWxlTmFtZTsgZm9ybWF0PSJsZXhlclJ1bGUiPn0pPjxsZXhlclJ1bGVMYWJlbERlZnMoKT48YWN0aW9uKG5hbWU9ImluaXQiLCBjb2RlPXJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdCk+CisKKyAgIyAtIC0gLSAtIG1haW4gcnVsZSBibG9jayAtIC0gLSAtCisgIDxibG9jaz4KKzxlbHNlPgorCisgIHR5cGUgPSA8cnVsZU5hbWU+CisgIGNoYW5uZWwgPSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorICA8cnVsZU1lbW9pemF0aW9uKHJ1bGVOYW1lKT48bGV4ZXJSdWxlTGFiZWxEZWZzKCk+PGFjdGlvbihuYW1lPSJpbml0IiwgY29kZT1ydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQpPgorCisgICMgLSAtIC0gLSBtYWluIHJ1bGUgYmxvY2sgLSAtIC0gLQorICA8YmxvY2s+CisgIDxydWxlQ2xlYW5VcCgpPgorCisgIEBzdGF0ZS50eXBlID0gdHlwZQorICBAc3RhdGUuY2hhbm5lbCA9IGNoYW5uZWwKKzwocnVsZURlc2NyaXB0b3IuYWN0aW9ucy5hZnRlcik6ZXhlY0FjdGlvbigpPgorPGVuZGlmPgorPGlmKG1lbW9pemUpPjxpZihiYWNrdHJhY2tpbmcpPgorICBzdWNjZXNzID0gZmFsc2U8XG4+Cis8ZW5kaWY+PGVuZGlmPgorZW5zdXJlCisgIDx0cmFjZU91dCgpPjxydWxlU2NvcGVDbGVhblVwKCk+PG1lbW9pemUoKT4KK2VuZAorPCEgPGlmKHJ1bGVEZXNjcmlwdG9yLm1vZGlmaWVyKT4KKworPHJ1bGVEZXNjcmlwdG9yLm1vZGlmaWVyPiA6PHJ1bGVOYW1lOyBmb3JtYXQ9ImxleGVyUnVsZSI+PFxuPgorPGVuZGlmPiAhPgorPj4KKworCisvKiogSXNvbGF0ZWQgJFJVTEUgcmVmIG9rIGluIGxleGVyIGFzIGl0J3MgYSBUb2tlbiAqLworbGV4ZXJSdWxlTGFiZWwobGFiZWwpIDo6PSAiPGxhYmVsOyBmb3JtYXQ9XCJsYWJlbFwiPiIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSwgYXR0cikgOjo9ICI8c2NvcGU7IGZvcm1hdD1cImxhYmVsXCI+LmxpbmUiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsIGF0dHIpIDo6PSAiPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPi50eXBlIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsIGF0dHIpIDo6PSAiPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPi5jb2x1bW4iCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsIGF0dHIpIDo6PSAiPHNjb3BlOyBmb3JtYXQ9XCJsYWJlbFwiPi5jaGFubmVsIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9pbmRleChzY29wZSwgYXR0cikgOjo9ICI8c2NvcGU7IGZvcm1hdD1cImxhYmVsXCI+LmluZGV4IgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLCBhdHRyKSA6Oj0gIjxzY29wZTsgZm9ybWF0PVwibGFiZWxcIj4udGV4dCIKKworCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBpbXBsaWNpdGx5LWRlZmluZWQgbGV4ZXIKKyAgKiBncmFtbWFyIHJ1bGUgdGhhdCBjaG9vc2VzIGJldHdlZW4gbGV4ZXIgcnVsZXMuCisgICovCit0b2tlbnNSdWxlKHJ1bGVOYW1lLG5ha2VkQmxvY2ssYXJncyxibG9jayxydWxlRGVzY3JpcHRvcikgOjo9IDw8CisjIG1haW4gcnVsZSB1c2VkIHRvIHN0dWR5IHRoZSBpbnB1dCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwKKyMgYW5kIGNob29zZSB0aGUgcHJvcGVyIGxleGVyIHJ1bGUgdG8gY2FsbCBpbiBvcmRlciB0bworIyBmZXRjaCB0aGUgbmV4dCB0b2tlbgorIworIyB1c3VhbGx5LCB5b3UgZG9uJ3QgbWFrZSBkaXJlY3QgY2FsbHMgdG8gdGhpcyBtZXRob2QsCisjIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgbmV4dF90b2tlbiBtZXRob2QsIHdoaWNoIHdpbGwKKyMgYnVpbGQgYW5kIGVtaXQgdGhlIGFjdHVhbCBuZXh0IHRva2VuCitkZWYgPHJ1bGVOYW1lOyBmb3JtYXQ9ImxleGVyUnVsZSI+CisgIDxibG9jaz4KK2VuZAorPj4KKworbGV4ZXJSdWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSwgYXR0cikgOjo9ICJzZWxmLnRleHQiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl90eXBlKHNjb3BlLCBhdHRyKSA6Oj0gInR5cGUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLCBhdHRyKSA6Oj0gIkBzdGF0ZS50b2tlbl9zdGFydF9saW5lIgorbGV4ZXJSdWxlUHJvcGVydHlSZWZfcG9zKHNjb3BlLCBhdHRyKSAgOjo9ICJAc3RhdGUudG9rZW5fc3RhcnRfY29sdW1uIgorCisvKiogVW5kZWZpbmVkLCBidXQgcHJlc2VudCBmb3IgY29uc2lzdGVuY3kgd2l0aCBUb2tlbgorICAqIGF0dHJpYnV0ZXM7IHNldCB0byAtMQorICAqLworbGV4ZXJSdWxlUHJvcGVydHlSZWZfaW5kZXgoc2NvcGUsIGF0dHIpIDo6PSAiLTEiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLCBhdHRyKSA6Oj0gImNoYW5uZWwiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSwgYXR0cikgOjo9ICJAc3RhdGUudG9rZW5fc3RhcnRfcG9zaXRpb24iCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLCBhdHRyKSA6Oj0gIiggc2VsZi5jaGFyYWN0ZXJfaW5kZXggLSAxICkiCisKKy8qKiBBIGxleGVyIHJ1bGUgcmVmZXJlbmNlICovCitsZXhlclJ1bGVSZWYocnVsZSxsYWJlbCxhcmdzLGVsZW1lbnRJbmRleCxzY29wZSkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj5fc3RhcnRfPGVsZW1lbnRJbmRleD4gPSBzZWxmLmNoYXJhY3Rlcl9pbmRleAorPG1ldGhvZENhbGwobj17PHJ1bGUubmFtZTsgZm9ybWF0PSJsZXhlclJ1bGUiPn0sZGVsPXNjb3BlLGFyZ3M9YXJncyk+Cis8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiA9IGNyZWF0ZV90b2tlbiBkbyB8dHwKKyAgdC5pbnB1dCAgID0gQGlucHV0CisgIHQudHlwZSAgICA9IEFOVExSMzo6SU5WQUxJRF9UT0tFTl9UWVBFCisgIHQuY2hhbm5lbCA9IEFOVExSMzo6REVGQVVMVF9DSEFOTkVMCisgIHQuc3RhcnQgICA9IDxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+X3N0YXJ0XzxlbGVtZW50SW5kZXg+CisgIHQuc3RvcCAgICA9IHNlbGYuY2hhcmFjdGVyX2luZGV4IC0gMQorZW5kCis8ZWxzZT4KKzxtZXRob2RDYWxsKG49ezxydWxlLm5hbWU7IGZvcm1hdD0ibGV4ZXJSdWxlIj59LCBkZWw9c2NvcGUsIGFyZ3M9YXJncyk+Cis8ZW5kaWY+Cis+PgorCisKKy8qKiBpKz1JTlQgaW4gbGV4ZXIgKi8KK2xleGVyUnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxsZXhlclJ1bGVSZWYoLi4uKT4KKzxhZGRUb0xpc3QoZWxlbT17PGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj59LC4uLik+Cis+PgorCisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gPSBAaW5wdXQucGVlazxcbj4KKzxlbmRpZj4KK21hdGNoX2FueQorPj4KKword2lsZGNhcmRDaGFyTGlzdExhYmVsKGxhYmVsLCBlbGVtZW50SW5kZXgpIDo6PSA8PAorPHdpbGRjYXJkQ2hhciguLi4pPgorPGFkZFRvTGlzdChlbGVtPXs8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPn0sLi4uKT4KKz4+CisKKy8qKiBtYXRjaCBhIGNoYXJhY3RlciAqLworY2hhclJlZihjaGFyLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPiA9IEBpbnB1dC5wZWVrPFxuPgorPGVuZGlmPgorbWF0Y2goIDxjaGFyPiApCis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgcmFuZ2UgKi8KK2NoYXJSYW5nZVJlZihhLGIsbGFiZWwpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ID0gQGlucHV0LnBlZWs8XG4+Cis8ZW5kaWY+CittYXRjaF9yYW5nZSggPGE+LCA8Yj4gKQorPj4KKworZmlsdGVyaW5nTmV4dFRva2VuKCkgOjo9ICIiCitmaWx0ZXJpbmdBY3Rpb25HYXRlKCkgOjo9ICJAc3RhdGUuYmFja3RyYWNraW5nID09IDEiCisKKy8qKiBNYXRjaCBhIHN0cmluZyBsaXRlcmFsICovCitsZXhlclN0cmluZ1JlZihzdHJpbmcsbGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPl9zdGFydCA9IHNlbGYuY2hhcmFjdGVyX2luZGV4CittYXRjaCggPHN0cmluZz4gKQorPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj4gPSBjcmVhdGVfdG9rZW4gZG8gfHR8CisgIHQuaW5wdXQgICA9IEBpbnB1dAorICB0LnR5cGUgICAgPSBBTlRMUjM6OklOVkFMSURfVE9LRU5fVFlQRQorICB0LmNoYW5uZWwgPSBBTlRMUjM6OkRFRkFVTFRfQ0hBTk5FTAorICB0LnN0YXJ0ICAgPSA8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPl9zdGFydAorICB0LnN0b3AgICAgPSBjaGFyYWN0ZXJfaW5kZXggLSAxCitlbmQKKzxlbHNlPgorbWF0Y2goIDxzdHJpbmc+ICkKKzxlbmRpZj4KKz4+CisKKworLyoqIEVPRiBpbiB0aGUgbGV4ZXIgKi8KK2xleGVyTWF0Y2hFT0YobGFiZWwsZWxlbWVudEluZGV4KSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw7IGZvcm1hdD0ibGFiZWwiPl9zdGFydF88ZWxlbWVudEluZGV4PiA9IGNoYXJhY3Rlcl9pbmRleAorbWF0Y2goIEFOVExSMzo6RU9GICkKKzxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+ID0gY3JlYXRlX3Rva2VuIGRvIHx0fAorICB0LmlucHV0ICAgPSBAaW5wdXQKKyAgdC50eXBlICAgID0gQU5UTFIzOjpJTlZBTElEX1RPS0VOX1RZUEUKKyAgdC5jaGFubmVsID0gQU5UTFIzOjpERUZBVUxUX0NIQU5ORUwKKyAgdC5zdGFydCAgID0gPGxhYmVsOyBmb3JtYXQ9ImxhYmVsIj5fc3RhcnRfPGVsZW1lbnRJbmRleD4KKyAgdC5zdG9wICAgID0gY2hhcmFjdGVyX2luZGV4IC0gMQorZW5kPFxuPgorPGVsc2U+CittYXRjaCggQU5UTFIzOjpFT0YgKTxcbj4KKzxlbmRpZj4KKz4+CisKKy8vIHVzZWQgZm9yIGxlZnQtcmVjdXJzaXZlIHJ1bGVzCityZWNSdWxlRGVmQXJnKCkgICAgICAgICAgICAgICAgICAgICAgIDo6PSAiaW50IDxyZWNSdWxlQXJnKCk+IgorcmVjUnVsZUFyZygpICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gIl9wIgorcmVjUnVsZUFsdFByZWRpY2F0ZShydWxlTmFtZSxvcFByZWMpICA6Oj0gIjxyZWNSdWxlQXJnKCk+IFw8PSA8b3BQcmVjPiIKK3JlY1J1bGVTZXRSZXN1bHRBY3Rpb24oKSAgICAgICAgICAgICAgOjo9ICJyb290XzA9JDxydWxlTmFtZT5fcHJpbWFyeS50cmVlOyIKK3JlY1J1bGVTZXRSZXR1cm5BY3Rpb24oc3JjLG5hbWUpICAgICAgOjo9ICIkPG5hbWU+PSQ8c3JjPi48bmFtZT47IgorCisvKiogJHN0YXJ0IGluIHBhcnNlciBydWxlICovCitydWxlUHJvcGVydHlSZWZfc3RhcnQoc2NvcGUsIGF0dHIpIDo6PSAicmV0dXJuX3ZhbHVlLnN0YXJ0IgorCisvKiogJHN0b3AgaW4gcGFyc2VyIHJ1bGUgKi8KK3J1bGVQcm9wZXJ0eVJlZl9zdG9wKHNjb3BlLCBhdHRyKSA6Oj0gInJldHVybl92YWx1ZS5zdG9wIgorCisvKiogJHRyZWUgaW4gcGFyc2VyIHJ1bGUgKi8KK3J1bGVQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLCBhdHRyKSA6Oj0gInJldHVybl92YWx1ZS50cmVlIgorCisvKiogJHRleHQgaW4gcGFyc2VyIHJ1bGUgKi8KK3J1bGVQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLCBhdHRyKSA6Oj0gIkBpbnB1dC50b19zKCByZXR1cm5fdmFsdWUuc3RhcnQsIEBpbnB1dC5sb29rKCAtMSApICkiCisKKy8qKiAkdGVtcGxhdGUgaW4gcGFyc2VyIHJ1bGUgKi8KK3J1bGVQcm9wZXJ0eVJlZl9zdChzY29wZSwgYXR0cikgOjo9ICJyZXR1cm5fdmFsdWUudGVtcGxhdGUiCisKK3J1bGVTZXRQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLCBhdHRyLCBleHByKSA6Oj0gInJldHVybl92YWx1ZS50cmVlID0gPGV4cHI+IgorCitydWxlU2V0UHJvcGVydHlSZWZfc3Qoc2NvcGUsIGF0dHIsIGV4cHIpIDo6PSAicmV0dXJuX3ZhbHVlLnRlbXBsYXRlID0gPGV4cHI+IgorCisvKiogSG93IHRvIGV4ZWN1dGUgYW4gYWN0aW9uICovCitleGVjQWN0aW9uKGFjdGlvbikgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KKyMgc3ludGFjdGljIHByZWRpY2F0ZSBhY3Rpb24gZ2F0ZSB0ZXN0CitpZiA8YWN0aW9ucy4oYWN0aW9uU2NvcGUpLnN5bnByZWRnYXRlPgorICAjIC0tPiBhY3Rpb24KKyAgPGFjdGlvbj4KKyAgIyBcPC0tIGFjdGlvbgorZW5kCis8ZWxzZT4KKyMgLS0+IGFjdGlvbgorPGFjdGlvbj4KKyMgXDwtLSBhY3Rpb24KKzxlbmRpZj4KKz4+CisKK2NvZGVGaWxlRXh0ZW5zaW9uKCkgOjo9ICIucmIiCisKK3RydWUoKSAgOjo9ICJ0cnVlIgorZmFsc2UoKSA6Oj0gImZhbHNlIgorCithY3Rpb24obmFtZSwgY29kZSkgOjo9IDw8Cis8aWYoY29kZSk+CisjIC0gLSAtIC0gQDxuYW1lPiBhY3Rpb24gLSAtIC0gLQorPGNvZGU+PFxuPgorPGVuZGlmPgorPj4KKworYXV0b2xvYWREZWxlZ2F0ZXMoKSA6Oj0gPDwKKzxpZihncmFtbWFyLmRpcmVjdERlbGVnYXRlcyk+Cis8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6e2l0IHwgYXV0b2xvYWQgOjxpdC5uYW1lPiwgIjxpdC5yZWNvZ25pemVyTmFtZT4iPFxuPn0+Cis8ZW5kaWY+Cis+PgorCitkZWxlZ2F0ZUxleGVyUnVsZShydWxlRGVzY3JpcHRvcikgOjo9IDw8CisjIGRlbGVnYXRlZCBsZXhlciBydWxlIDxydWxlRGVzY3JpcHRvci5uYW1lOyBmb3JtYXQ9ImxleGVyUnVsZSI+ICg8cnVsZURlc2NyaXB0b3IubmFtZT4gaW4gdGhlIGdyYW1tYXIpCitkZWYgPHJ1bGVEZXNjcmlwdG9yLm5hbWU7IGZvcm1hdD0ibGV4ZXJSdWxlIj48aWYocnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUpPiggPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+ICk8ZW5kaWY+CisgIDxtZXRob2RDYWxsKGRlbD1ydWxlRGVzY3JpcHRvci5ncmFtbWFyLCBuPXs8cnVsZURlc2NyaXB0b3IubmFtZTsgZm9ybWF0PSJsZXhlclJ1bGUiPn0sIGFyZ3M9cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGUuYXR0cmlidXRlcyk+CitlbmQKKz4+CisKK3Jvb3RDbGFzc05hbWUoKSA6Oj0gPDwKKzxpZihncmFtbWFyLmdyYW1tYXJJc1Jvb3QpPjxncmFtbWFyLm5hbWU+PGVsc2U+PGdyYW1tYXIuY29tcG9zaXRlLnJvb3RHcmFtbWFyLm5hbWU+PGVuZGlmPjo6PGlmKFRSRUVfUEFSU0VSKT5UcmVlUGFyc2VyPGVsc2VpZihQQVJTRVIpPlBhcnNlcjxlbHNlPkxleGVyPGVuZGlmPgorPj4KKworZ3JhbW1hckNsYXNzTmFtZSgpIDo6PSA8PAorPGdyYW0ubmFtZT46OjxpZihUUkVFX1BBUlNFUik+VHJlZVBhcnNlcjxlbHNlaWYoUEFSU0VSKT5QYXJzZXI8ZWxzZT5MZXhlcjxlbmRpZj4KKz4+CisKK25ld0RlbGVnYXRlKGdyYW0pIDo6PSA8PAorPGdyYW0ubmFtZT4ubmV3KCA8dHJ1bmMoZ3JhbS5kZWxlZ2F0b3JzKTp7cHw8cDpkZWxlZ2F0ZU5hbWUoKT4sIH0+CisgIHNlbGYsIEBpbnB1dCwgOnN0YXRlID0+IEBzdGF0ZTxAZGVsZWdhdGVPcHRpb25zKCk+CispCis+PgorCitwbGFjZUFjdGlvbihzY29wZSwgbmFtZSkgOjo9IDw8Cis8aWYoYWN0aW9ucy4oc2NvcGUpLihuYW1lKSk+CisjIC0gLSAtIC0gLSAtIGJlZ2luIGFjdGlvbiBAPHNjb3BlPjo6PG5hbWU+IC0gLSAtIC0gLSAtCis8aWYoZmlsZU5hbWUpPiMgPGZpbGVOYW1lPjxcbj48ZW5kaWY+Cis8YWN0aW9ucy4oc2NvcGUpLihuYW1lKT4KKyMgLSAtIC0gLSAtIC0gZW5kIGFjdGlvbiBAPHNjb3BlPjo6PG5hbWU+IC0gLSAtIC0gLSAtIC08XG4+Cis8ZW5kaWY+Cis+PgorCitydW50aW1lTGlicmFyeVZlcnNpb24oKSA6Oj0gIjEuOC4xIgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9SdWJ5L1NULnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9TVC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlMzY2YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvUnVieS9TVC5zdGcKQEAgLTAsMCArMSwxMjMgQEAKK0BwYXJzZXJCb2R5Lm1peGlucygpIDo6PSA8PAorPEBzdXBlci5taXhpbnMoKT4KKzxpZihyZXdyaXRlTW9kZSk+CitpbmNsdWRlIEFOVExSMzo6VGVtcGxhdGU6OlJld3JpdGVCdWlsZGVyCis8ZWxzZT4KK2luY2x1ZGUgQU5UTFIzOjpUZW1wbGF0ZTo6QnVpbGRlcgorPGVuZGlmPgorPj4KKworZ2F0ZWRBY3Rpb24oIGJsb2NrICkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmIDxhY3Rpb25zLihhY3Rpb25TY29wZSkuc3lucHJlZGdhdGU+CisgIDxibG9jaz4KK2VuZAorPGVsc2U+Cis8YmxvY2s+Cis8ZW5kaWY+Cis+PgorCisvKiogeCs9cnVsZSB3aGVuIG91dHB1dD10ZW1wbGF0ZSAqLworcnVsZVJlZkFuZExpc3RMYWJlbChydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKKzxydWxlUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09ezxsYWJlbDsgZm9ybWF0PSJsYWJlbCI+LnRlbXBsYXRlfSwgLi4uKT4KKz4+CisKK3Jld3JpdGVUZW1wbGF0ZShhbHRzKSA6Oj0gPDwKKzxnYXRlZEFjdGlvbih7Cis8Zmlyc3QoYWx0cyk6cmV3cml0ZVRlbXBsYXRlQWx0Rmlyc3QoKTsgYW5jaG9yPgorPHJlc3QoYWx0cyk6e2F8IGVsczxyZXdyaXRlVGVtcGxhdGVBbHRSZXN0KGEpPn07IGFuY2hvciwgc2VwYXJhdG9yPSJcblxuIj4KKzxpZihyZXdyaXRlTW9kZSk+PHJlcGxhY2VUZXh0SW5MaW5lKCk+PGVuZGlmPgorfSk+Cis+PgorCityZXdyaXRlVGVtcGxhdGVBbHRGaXJzdChhKSA6Oj0gPDwKKzxpZihhLnByZWQpPgoraWYgPGEucHJlZD4KKyAgIyA8YS5kZXNjcmlwdGlvbj4KKyAgcmV0dXJuX3ZhbHVlLnRlbXBsYXRlID0gPGEuYWx0PgorPGVsc2U+CisjIDxhLmRlc2NyaXB0aW9uPgorcmV0dXJuX3ZhbHVlLnRlbXBsYXRlID0gPGEuYWx0PgorPGVuZGlmPgorPj4KKworcmV3cml0ZVRlbXBsYXRlQWx0UmVzdChhKSA6Oj0gPDwKKzxpZihhLnByZWQpPgoraWYgPGEucHJlZD4KKyAgIyA8YS5kZXNjcmlwdGlvbj4KKyAgcmV0dXJuX3ZhbHVlLnRlbXBsYXRlID0gPGEuYWx0PgorPGVsc2U+CitlIDwhIGxpdHRsZSBoYWNrIHRvIGdldCBpZiAuLiBlbHNpZiAuLiBlbHNlIGJsb2NrIHJpZ2h0ICE+CisgICMgPGEuZGVzY3JpcHRpb24+CisgIHJldHVybl92YWx1ZS50ZW1wbGF0ZSA9IDxhLmFsdD4KK2VuZAorPGVuZGlmPgorPj4KKworcmVwbGFjZVRleHRJbkxpbmUoKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CitAaW5wdXQudG9rZW5fc3RyZWFtLnJlcGxhY2UoCisgIEBpbnB1dC5hZGFwdG9yLnRva2VuX3N0YXJ0X2luZGV4KCByZXR1cm5fdmFsdWUuc3RhcnQgKSwKKyAgQGlucHV0LmFkYXB0b3IudG9rZW5fc3RvcF9pbmRleCggcmV0dXJuX3ZhbHVlLnN0YXJ0ICksCisgIHJldHVybl92YWx1ZS50ZW1wbGF0ZQorKQorPGVsc2U+CitAaW5wdXQucmVwbGFjZSgKKyAgcmV0dXJuX3ZhbHVlLnN0YXJ0LmluZGV4LAorICBAaW5wdXQubG9vayggLTEgKS5pbmRleCwKKyAgcmV0dXJuX3ZhbHVlLnRlbXBsYXRlCispCis8ZW5kaWY+Cis+PgorCityZXdyaXRlRW1wdHlUZW1wbGF0ZShhbHRzKSA6Oj0gPDwKK25pbAorPj4KKworLyoqIEludm9rZSBhIHRlbXBsYXRlIHdpdGggYSBzZXQgb2YgYXR0cmlidXRlIG5hbWUvdmFsdWUgcGFpcnMuCisgKiAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgcnVsZSdzIHRlbXBsYXRlICphZnRlciogaGF2aW5nIHNldAorICogIHRoZSBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhlIHJ1bGUncyB0ZW1wbGF0ZSBtaWdodCBiZSB1c2VkIGFzCisgKiAgYW4gYXR0cmlidXRlIHRvIGJ1aWxkIGEgYmlnZ2VyIHRlbXBsYXRlOyB5b3UgZ2V0IGEgc2VsZi1lbWJlZGRlZAorICogIHRlbXBsYXRlLgorICovCityZXdyaXRlRXh0ZXJuYWxUZW1wbGF0ZShuYW1lLGFyZ3MpIDo6PSA8PAorZmV0Y2hfdGVtcGxhdGUoICI8bmFtZT4iIDxpZihhcmdzKT4sCisgIDxhcmd1bWVudE1hcChhcmdzKT4KKzxlbmRpZj4pCis+PgorCisvKiogZXhwciBpcyBhIHN0cmluZyBleHByZXNzaW9uIHRoYXQgc2F5cyB3aGF0IHRlbXBsYXRlIHRvIGxvYWQgKi8KK3Jld3JpdGVJbmRpcmVjdFRlbXBsYXRlKGV4cHIsYXJncykgOjo9IDw8CitmZXRjaF90ZW1wbGF0ZSggPGV4cHI+PGlmKGFyZ3MpPiwgPGFyZ3VtZW50TWFwKGFyZ3MpPjxlbmRpZj4gKQorPj4KKworLyoqIEludm9rZSBhbiBpbmxpbmUgdGVtcGxhdGUgd2l0aCBhIHNldCBvZiBhdHRyaWJ1dGUgbmFtZS92YWx1ZSBwYWlycyAqLworcmV3cml0ZUlubGluZVRlbXBsYXRlKGFyZ3MsIHRlbXBsYXRlKSA6Oj0gPDwKK2NyZWF0ZV90ZW1wbGF0ZSggIjx0ZW1wbGF0ZT4iPGlmKGFyZ3MpPiwgPGFyZ3VtZW50TWFwKGFyZ3MpPjxlbmRpZj4gKQorPj4KKworLyoqIHBsYWluIC0+IHtmb299IGFjdGlvbiAqLworcmV3cml0ZUFjdGlvbihhY3Rpb24pIDo6PSA8PAorPGFjdGlvbj4KKz4+CisKKy8qKiBBbiBhY3Rpb24gaGFzICVzdC5hdHRyTmFtZT1leHByOyBvciAle3N0fS5hdHRyTmFtZT1leHByOyAqLworYWN0aW9uU2V0QXR0cmlidXRlKHN0LGF0dHJOYW1lLGV4cHIpIDo6PSA8PAorKCA8c3Q+IClbIDo8YXR0ck5hbWU+IF0gPSA8ZXhwcj4KKz4+CisKKy8qKiBUcmFuc2xhdGUgJXtzdHJpbmdFeHByfSAqLworYWN0aW9uU3RyaW5nQ29uc3RydWN0b3Ioc3RyaW5nRXhwcikgOjo9IDw8CitjcmVhdGVfdGVtcGxhdGUoIDxzdHJpbmdFeHByPiApCis+PgorCisvKgorcnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsIGF0dHIpIDo6PSA8PAorQGlucHV0LnRvX3MocmV0dXJuX3ZhbHVlLnN0YXJ0LCBAaW5wdXQubG9vaygtMSkpCis+PgorKi8KKworYXJndW1lbnRNYXAoYXJncykgOjo9IDw8Cis8YXJnczp7YXw6PGEubmFtZT4gPT4gPGEudmFsdWU+fTsgc2VwYXJhdG9yPSIsXG4iPgorPj4KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvU2NhbGEvU2NhbGEuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci9jb2RlZ2VuL3RlbXBsYXRlcy9TY2FsYS9TY2FsYS5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzZjkyZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvY29kZWdlbi90ZW1wbGF0ZXMvU2NhbGEvU2NhbGEuc3RnCkBAIC0wLDAgKzEsMTM4NSBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDEwIE1hdHRoZXcgTGxveWQKKyBodHRwOi8vbGlua2VkaW4uY29tL2luL21hdHRoZXdsCisKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KK3NjYWxhVHlwZUluaXRNYXAgOjo9IFsKKwkiSW50IjoiMCIsCisJIkxvbmciOiIwIiwKKwkiRmxvYXQiOiIwLjBmIiwKKwkiRG91YmxlIjoiMC4wIiwKKwkiQm9vbGVhbiI6ImZhbHNlIiwKKwkiQnl0ZSI6IjAiLAorCSJTaG9ydCI6IjAiLAorCSJDaGFyIjoiMCIsCisJZGVmYXVsdDoibnVsbCIgLy8gYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBhdG9taWMgdHlwZQorXQorCisvKiogVGhlIG92ZXJhbGwgZmlsZSBzdHJ1Y3R1cmUgb2YgYSByZWNvZ25pemVyOyBzdG9yZXMgbWV0aG9kcyBmb3IgcnVsZXMKKyAqICBhbmQgY3ljbGljIERGQXMgcGx1cyBzdXBwb3J0IGNvZGUuCisgKi8KK291dHB1dEZpbGUoTEVYRVIsUEFSU0VSLFRSRUVfUEFSU0VSLCBhY3Rpb25TY29wZSwgYWN0aW9ucywKKyAgICAgICAgICAgZG9jQ29tbWVudCwgcmVjb2duaXplciwKKyAgICAgICAgICAgbmFtZSwgdG9rZW5zLCB0b2tlbk5hbWVzLCBydWxlcywgY3ljbGljREZBcywKKwkgICBiaXRzZXRzLCBidWlsZFRlbXBsYXRlLCBidWlsZEFTVCwgcmV3cml0ZU1vZGUsIHByb2ZpbGUsCisJICAgYmFja3RyYWNraW5nLCBzeW5wcmVkcywgbWVtb2l6ZSwgbnVtUnVsZXMsCisJICAgZmlsZU5hbWUsIEFOVExSVmVyc2lvbiwgZ2VuZXJhdGVkVGltZXN0YW1wLCB0cmFjZSwKKwkgICBzY29wZXMsIHN1cGVyQ2xhc3MsIGxpdGVyYWxzKSA6Oj0KKzw8CisvLyAkQU5UTFIgPEFOVExSVmVyc2lvbj4gPGZpbGVOYW1lPiA8Z2VuZXJhdGVkVGltZXN0YW1wPgorPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5oZWFkZXI+CisKKzxAaW1wb3J0cz4KK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5fCis8aWYoVFJFRV9QQVJTRVIpPgoraW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuXworPGVuZGlmPgorPEBlbmQ+CisKKzxkb2NDb21tZW50PgorPHJlY29nbml6ZXI+Cis+PgorCitsZXhlcihncmFtbWFyLCBuYW1lLCB0b2tlbnMsIHNjb3BlcywgcnVsZXMsIG51bVJ1bGVzLCBmaWx0ZXJNb2RlLCBsYWJlbFR5cGU9IkNvbW1vblRva2VuIiwKKyAgICAgIHN1cGVyQ2xhc3M9IkxleGVyIikgOjo9IDw8CitvYmplY3QgPGdyYW1tYXIucmVjb2duaXplck5hbWU+IHsKKyAgICA8dG9rZW5zOntpdCB8IHZhbCA8aXQubmFtZT4gPSA8aXQudHlwZT59OyBzZXBhcmF0b3I9IlxuIj4KKworICAgIDxjeWNsaWNERkFzOmN5Y2xpY0RGQSgpPiA8ISBkdW1wIHRhYmxlcyBmb3IgYWxsIERGQSAhPgorfQorCitjbGFzcyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4oaW5wdXQ6IENoYXJTdHJlYW0sIHN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT59PjogUmVjb2duaXplclNoYXJlZFN0YXRlKSBleHRlbmRzIDxAc3VwZXJDbGFzc05hbWU+PHN1cGVyQ2xhc3M+PEBlbmQ+KGlucHV0LCBzdGF0ZTxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT4pIHsKKyAgICBpbXBvcnQgPGdyYW1tYXIucmVjb2duaXplck5hbWU+Ll8KKyAgICA8YWN0aW9ucy5sZXhlci5tZW1iZXJzPgorCisgICAgLy8gZGVsZWdhdGVzCisgICAgPGdyYW1tYXIuZGVsZWdhdGVzOgorICAgICAgICAge2d8PGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn07IHNlcGFyYXRvcj0iXG4iPgorICAgIC8vIGRlbGVnYXRvcnMKKyAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOgorICAgICAgICAge2d8PGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn07IHNlcGFyYXRvcj0iXG4iPgorICAgIDxsYXN0KGdyYW1tYXIuZGVsZWdhdG9ycyk6e2d8cHVibGljIDxnLnJlY29nbml6ZXJOYW1lPiBnUGFyZW50O30+CisKKyAgICA8c2NvcGVzOntpdCB8IDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKCk+PGVuZGlmPn0+CisKKyAgICBkZWYgdGhpcyhpbnB1dDxncmFtbWFyLmRlbGVnYXRvcnM6e2d8LCA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fT46IENoYXJTdHJlYW0pID0KKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KQorCis8aWYobWVtb2l6ZSk+Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KKyAgICAgICAgc3RhdGUucnVsZU1lbW8gPSBuZXcgQXJyYXlbamF2YS51dGlsLk1hcFtfLF9dXSg8bnVtUnVsZXM+KzEpPFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKyAgICAgICAgPGdyYW1tYXIuZGlyZWN0RGVsZWdhdGVzOgorICAgICAgICAge2d8PGc6ZGVsZWdhdGVOYW1lKCk+ID0gbmV3IDxnLnJlY29nbml6ZXJOYW1lPihpbnB1dCwgc3RhdGU8dHJ1bmMoZy5kZWxlZ2F0b3JzKTp7cHwsIDxwOmRlbGVnYXRlTmFtZSgpPn0+LCB0aGlzKX07IHNlcGFyYXRvcj0iXG4iPgorICAgICAgICA8Z3JhbW1hci5kZWxlZ2F0b3JzOgorICAgICAgICAge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50ID0gPGc6ZGVsZWdhdGVOYW1lKCk+fT4KKworICAgIG92ZXJyaWRlIGRlZiBnZXRHcmFtbWFyRmlsZU5hbWUgPSAiPGZpbGVOYW1lPiIKKworPGlmKGZpbHRlck1vZGUpPgorICAgIDxmaWx0ZXJpbmdOZXh0VG9rZW4oKT4KKzxlbmRpZj4KKyAgICA8cnVsZXM7IHNlcGFyYXRvcj0iXG5cbiI+CisKKyAgICA8c3lucHJlZHM6e3AgfCA8bGV4ZXJTeW5wcmVkKHApPn0+CisgICAgPGN5Y2xpY0RGQXM6e2RmYSB8IHByaXZhdGUgdmFsIGRmYTxkZmEuZGVjaXNpb25OdW1iZXI+ID0gbmV3IDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPi5ERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPih0aGlzKX07IHNlcGFyYXRvcj0iXG4iPgorfQorPj4KKworLyoqIEEgb3ZlcnJpZGUgb2YgTGV4ZXIubmV4dFRva2VuKCkgdGhhdCBiYWNrdHJhY2tzIG92ZXIgbVRva2VucygpIGxvb2tpbmcKKyAqICBmb3IgbWF0Y2hlcy4gIE5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQgdXBvbiBlcnJvcjsganVzdCByZXdpbmQsIGNvbnN1bWUKKyAqICBhIHRva2VuIGFuZCB0aGVuIHRyeSBhZ2Fpbi4gIGJhY2t0cmFja2luZyBuZWVkcyB0byBiZSBzZXQgYXMgd2VsbC4KKyAqICBNYWtlIHJ1bGUgbWVtb2l6YXRpb24gaGFwcGVuIG9ubHkgYXQgbGV2ZWxzIGFib3ZlIDEgYXMgd2Ugc3RhcnQgbVRva2VucworICogIGF0IGJhY2t0cmFja2luZz09MS4KKyAqLworZmlsdGVyaW5nTmV4dFRva2VuKCkgOjo9IDw8CitvdmVycmlkZSBkZWYgbmV4dFRva2VuKCk6IFRva2VuID0geworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PUNoYXJTdHJlYW0uRU9GICkgeworICAgICAgICAgICAgdmFyIGVvZjogVG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4oKENoYXJTdHJlYW0paW5wdXQsVG9rZW4uRU9GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbmRleCgpLGlucHV0LmluZGV4KCkpCisgICAgICAgICAgICBlb2Yuc2V0TGluZShnZXRMaW5lKCkpCisgICAgICAgICAgICBlb2Yuc2V0Q2hhclBvc2l0aW9uSW5MaW5lKGdldENoYXJQb3NpdGlvbkluTGluZSgpKQorICAgICAgICAgICAgcmV0dXJuIGVvZgorICAgICAgICB9CisgICAgICAgIHN0YXRlLnRva2VuID0gbnVsbAorCXN0YXRlLmNoYW5uZWwgPSBUb2tlbi5ERUZBVUxUX0NIQU5ORUwKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IGlucHV0LmluZGV4KCkKKyAgICAgICAgc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LmdldENoYXJQb3NpdGlvbkluTGluZSgpCisgICAgICAgIHN0YXRlLnRva2VuU3RhcnRMaW5lID0gaW5wdXQuZ2V0TGluZSgpCisJc3RhdGUudGV4dCA9IG51bGwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbCBtID0gaW5wdXQubWFyaygpCisgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2tpbmc9MSA8ISBtZWFucyB3ZSB3b24ndCB0aHJvdyBzbG93IGV4Y2VwdGlvbiAhPgorICAgICAgICAgICAgc3RhdGUuZmFpbGVkPWZhbHNlCisgICAgICAgICAgICBtVG9rZW5zKCkKKyAgICAgICAgICAgIHN0YXRlLmJhY2t0cmFja2luZz0wCisgICAgICAgICAgICA8ISBtVG9rZW5zIGJhY2t0cmFja3Mgd2l0aCBzeW5wcmVkIGF0IGJhY2t0cmFja2luZz09MgorICAgICAgICAgICAgICAgYW5kIHdlIHNldCB0aGUgc3lucHJlZGdhdGUgdG8gYWxsb3cgYWN0aW9ucyBhdCBsZXZlbCAxLiAhPgorICAgICAgICAgICAgaWYgKCBzdGF0ZS5mYWlsZWQgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQucmV3aW5kKG0pCisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpIDwhIGFkdmFuY2Ugb25lIGNoYXIgYW5kIHRyeSBhZ2FpbiAhPgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZW1pdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggeworICAgICAgICAgICAgY2FzZSByZTogUmVjb2duaXRpb25FeGNlcHRpb24gPT4KKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gaW4gYmFja3RyYWNraW5nIG1vZGUsIGJ1dC4uLgorICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpCisgICAgICAgICAgICByZWNvdmVyKHJlKQorICAgICAgICB9CisgICAgfQorfQorCitvdmVycmlkZSBkZWYgbWVtb2l6ZShpbnB1dDogSW50U3RyZWFtLAorCQlydWxlSW5kZXg6IEludCwKKwkJcnVsZVN0YXJ0SW5kZXg6IEludCkgPSB7CitpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4xICkgc3VwZXIubWVtb2l6ZShpbnB1dCwgcnVsZUluZGV4LCBydWxlU3RhcnRJbmRleCkKK30KKworb3ZlcnJpZGUgZGVmIGFscmVhZHlQYXJzZWRSdWxlKGlucHV0OiBJbnRTdHJlYW0sIHJ1bGVJbmRleDogSW50KTpCb29sZWFuIHsKK2lmICggc3RhdGUuYmFja3RyYWNraW5nPjEgKSByZXR1cm4gc3VwZXIuYWxyZWFkeVBhcnNlZFJ1bGUoaW5wdXQsIHJ1bGVJbmRleCkKK3JldHVybiBmYWxzZQorfQorPj4KKworYWN0aW9uR2F0ZSgpIDo6PSAic3RhdGUuYmFja3RyYWNraW5nPT0wIgorCitmaWx0ZXJpbmdBY3Rpb25HYXRlKCkgOjo9ICJzdGF0ZS5iYWNrdHJhY2tpbmc9PTEiCisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgYSBwYXJzZXIgKi8KK2dlbmVyaWNQYXJzZXIoZ3JhbW1hciwgbmFtZSwgc2NvcGVzLCB0b2tlbnMsIHRva2VuTmFtZXMsIHJ1bGVzLCBudW1SdWxlcywKKyAgICAgICAgICAgICAgYml0c2V0cywgaW5wdXRTdHJlYW1UeXBlLCBzdXBlckNsYXNzLAorICAgICAgICAgICAgICBsYWJlbFR5cGUsIG1lbWJlcnMsIHJld3JpdGVFbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgZmlsdGVyTW9kZSwgQVNUTGFiZWxUeXBlPSJPYmplY3QiKSA6Oj0gPDwKK29iamVjdCA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4geworPGlmKGdyYW1tYXIuZ3JhbW1hcklzUm9vdCk+CisgICAgdmFsIHRva2VuTmFtZXMgPSBBcnJheSgKKyAgICAgICAgIlw8aW52YWxpZD4iLCAiXDxFT1I+IiwgIlw8RE9XTj4iLCAiXDxVUD4iLCA8dG9rZW5OYW1lczsgc2VwYXJhdG9yPSIsICI+CisgICAgKTxcbj4KKzxlbmRpZj4KKworICAgIDx0b2tlbnM6e2l0IHwgdmFsIDxpdC5uYW1lPiA9IDxpdC50eXBlPn07IHNlcGFyYXRvcj0iXG4iPgorCisgICAgPGN5Y2xpY0RGQXM6Y3ljbGljREZBKCk+IDwhIGR1bXAgdGFibGVzIGZvciBhbGwgREZBICE+CisKKyAgICA8Yml0c2V0czp7aXQgfCA8Yml0c2V0KG5hbWU9e0ZPTExPV188aXQubmFtZT5faW5fPGl0LmluTmFtZT48aXQudG9rZW5JbmRleD59LAorICAgICAgICAgICAgICAgICAgICB3b3JkczY0PWl0LmJpdHMpPn0+Cit9CisKK2NsYXNzIDxncmFtbWFyLnJlY29nbml6ZXJOYW1lPihpbnB1dDogPGlucHV0U3RyZWFtVHlwZT4sIHN0YXRlPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT59PjogUmVjb2duaXplclNoYXJlZFN0YXRlKSBleHRlbmRzIDxAc3VwZXJDbGFzc05hbWU+PHN1cGVyQ2xhc3M+PEBlbmQ+KGlucHV0LCBzdGF0ZSkgeworICAgIGltcG9ydCA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uXworICAgIC8vIGRlbGVnYXRlcworICAgIDxncmFtbWFyLmRlbGVnYXRlczoKKyAgICAgICAgIHtnfHB1YmxpYyA8Zy5yZWNvZ25pemVyTmFtZT4gPGc6ZGVsZWdhdGVOYW1lKCk+fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgLy8gZGVsZWdhdG9ycworICAgIDxncmFtbWFyLmRlbGVnYXRvcnM6CisgICAgICAgICB7Z3xwdWJsaWMgPGcucmVjb2duaXplck5hbWU+IDxnOmRlbGVnYXRlTmFtZSgpPn07IHNlcGFyYXRvcj0iXG4iPgorICAgIDxsYXN0KGdyYW1tYXIuZGVsZWdhdG9ycyk6e2d8cHVibGljIDxnLnJlY29nbml6ZXJOYW1lPiBnUGFyZW50O30+CisKKyAgICA8c2NvcGVzOntpdCB8IDxpZihpdC5pc0R5bmFtaWNHbG9iYWxTY29wZSk+PGdsb2JhbEF0dHJpYnV0ZVNjb3BlKCk+PGVuZGlmPn0+CisKKyAgICA8QG1lbWJlcnM+CisgICAgPCEgV0FSTklORy4gYnVnIGluIFNUOiB0aGlzIGlzIGN1dC1uLXBhc3RlIGludG8gRGJnLnN0ZyAhPgorICAgIGRlZiB0aGlzKGlucHV0PGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnLnJlY29nbml6ZXJOYW1lPiA8ZzpkZWxlZ2F0ZU5hbWUoKT59PjogPGlucHV0U3RyZWFtVHlwZT4pID0KKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpPGdyYW1tYXIuZGVsZWdhdG9yczp7Z3wsIDxnOmRlbGVnYXRlTmFtZSgpPn0+KQorCisgICAgICAgIDxwYXJzZXJDdG9yQm9keSgpPgorICAgICAgICA8Z3JhbW1hci5kaXJlY3REZWxlZ2F0ZXM6CisgICAgICAgICB7Z3w8ZzpkZWxlZ2F0ZU5hbWUoKT4gPSBuZXcgPGcucmVjb2duaXplck5hbWU+KGlucHV0LCBzdGF0ZTx0cnVuYyhnLmRlbGVnYXRvcnMpOntwfCwgPHA6ZGVsZWdhdGVOYW1lKCk+fT4sIHRoaXMpfTsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIDxncmFtbWFyLmluZGlyZWN0RGVsZWdhdGVzOntnIHwgPGc6ZGVsZWdhdGVOYW1lKCk+ID0gPGcuZGVsZWdhdG9yOmRlbGVnYXRlTmFtZSgpPi48ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3I9IlxuIj4KKyAgICAgICAgPGxhc3QoZ3JhbW1hci5kZWxlZ2F0b3JzKTp7Z3xnUGFyZW50ID0gPGc6ZGVsZWdhdGVOYW1lKCk+fT4KKyAgICA8QGVuZD4KKworICAgIG92ZXJyaWRlIGRlZiBnZXRUb2tlbk5hbWVzOiBBcnJheVtTdHJpbmddID0gdG9rZW5OYW1lcworICAgIG92ZXJyaWRlIGRlZiBnZXRHcmFtbWFyRmlsZU5hbWUgPSAiPGZpbGVOYW1lPiIKKworICAgIDxtZW1iZXJzPgorCisgICAgPHJ1bGVzOyBzZXBhcmF0b3I9IlxuXG4iPgorCis8ISBnZW5lcmF0ZSBydWxlL21ldGhvZCBkZWZpbml0aW9ucyBmb3IgaW1wb3J0ZWQgcnVsZXMgc28gdGhleQorICAgYXBwZWFyIHRvIGJlIGRlZmluZWQgaW4gdGhpcyByZWNvZ25pemVyLiAhPgorICAgIC8vIERlbGVnYXRlZCBydWxlcworPGdyYW1tYXIuZGVsZWdhdGVkUnVsZXM6e3J1bGVEZXNjcmlwdG9yfAorICAgIEB0aHJvd3MoY2xhc3NPZltSZWNvZ25pdGlvbkV4Y2VwdGlvbl0pCisgICAgZGVmIDxydWxlRGVzY3JpcHRvci5uYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pOiA8cmV0dXJuVHlwZSgpPiA9IFx7IDxpZihydWxlRGVzY3JpcHRvci5oYXNSZXR1cm5WYWx1ZSk+cmV0dXJuIDxlbmRpZj48cnVsZURlc2NyaXB0b3IuZ3JhbW1hcjpkZWxlZ2F0ZU5hbWUoKT4uPHJ1bGVEZXNjcmlwdG9yLm5hbWU+KDxydWxlRGVzY3JpcHRvci5wYXJhbWV0ZXJTY29wZS5hdHRyaWJ1dGVzOnthfDxhLm5hbWU+fTsgc2VwYXJhdG9yPSIsICI+KSBcfX07IHNlcGFyYXRvcj0iXG4iPgorCisgICAgPHN5bnByZWRzOntwIHwgPHN5bnByZWQocCk+fT4KKworICAgIDxjeWNsaWNERkFzOntkZmEgfCBwcml2YXRlIHZhbCBkZmE8ZGZhLmRlY2lzaW9uTnVtYmVyPiA9IG5ldyA8Z3JhbW1hci5yZWNvZ25pemVyTmFtZT4uREZBPGRmYS5kZWNpc2lvbk51bWJlcj4odGhpcyl9OyBzZXBhcmF0b3I9IlxuIj4KK30KKz4+CisKK3BhcnNlckN0b3JCb2R5KCkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+Cis8aWYoZ3JhbW1hci5ncmFtbWFySXNSb290KT4KK3RoaXMuc3RhdGUucnVsZU1lbW8gPSBuZXcgQXJyYXlbamF2YS51dGlsLk1hcFtfLF9dXSg8bGVuZ3RoKGdyYW1tYXIuYWxsSW1wb3J0ZWRSdWxlcyk+KzEpPFxuPiA8ISBpbmRleCBmcm9tIDEuLm4gIT4KKzxlbmRpZj4KKzxlbmRpZj4KKzxncmFtbWFyLmRlbGVnYXRvcnM6Cisge2d8dGhpcy48ZzpkZWxlZ2F0ZU5hbWUoKT4gPSA8ZzpkZWxlZ2F0ZU5hbWUoKT59OyBzZXBhcmF0b3I9IlxuIj4KKz4+CisKK3BhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgcnVsZXMsIG51bVJ1bGVzLCBiaXRzZXRzLAorICAgICAgIEFTVExhYmVsVHlwZT0iT2JqZWN0Iiwgc3VwZXJDbGFzcz0iUGFyc2VyIiwgbGFiZWxUeXBlPSJUb2tlbiIsCisgICAgICAgbWVtYmVycz17PGFjdGlvbnMucGFyc2VyLm1lbWJlcnM+fSkgOjo9IDw8Cis8Z2VuZXJpY1BhcnNlcihpbnB1dFN0cmVhbVR5cGU9IlRva2VuU3RyZWFtIiwgcmV3cml0ZUVsZW1lbnRUeXBlPSJUb2tlbiIsIC4uLik+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGEgdHJlZSBwYXJzZXI7IHNhbWUgYXMgcGFyc2VyIGV4Y2VwdCB0aGUgaW5wdXQKKyAqICBzdHJlYW0gaXMgYSBkaWZmZXJlbnQgdHlwZS4KKyAqLwordHJlZVBhcnNlcihncmFtbWFyLCBuYW1lLCBzY29wZXMsIHRva2VucywgdG9rZW5OYW1lcywgZ2xvYmFsQWN0aW9uLCBydWxlcywKKyAgICAgICAgICAgbnVtUnVsZXMsIGJpdHNldHMsIGZpbHRlck1vZGUsIGxhYmVsVHlwZT17PEFTVExhYmVsVHlwZT59LCBBU1RMYWJlbFR5cGU9Ik9iamVjdCIsCisgICAgICAgICAgIHN1cGVyQ2xhc3M9ezxpZihmaWx0ZXJNb2RlKT48aWYoYnVpbGRBU1QpPlRyZWVSZXdyaXRlcjxlbHNlPlRyZWVGaWx0ZXI8ZW5kaWY+PGVsc2U+VHJlZVBhcnNlcjxlbmRpZj59LAorICAgICAgICAgICBtZW1iZXJzPXs8YWN0aW9ucy50cmVlcGFyc2VyLm1lbWJlcnM+fQorICAgICAgICAgICApIDo6PSA8PAorPGdlbmVyaWNQYXJzZXIoaW5wdXRTdHJlYW1UeXBlPSJUcmVlTm9kZVN0cmVhbSIsIHJld3JpdGVFbGVtZW50VHlwZT0iTm9kZSIsIC4uLik+Cis+PgorCisvKiogQSBzaW1wbGVyIHZlcnNpb24gb2YgYSBydWxlIHRlbXBsYXRlIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIGltYWdpbmFyeQorICogIHJ1bGVzIGNyZWF0ZWQgZm9yIHN5bnRhY3RpYyBwcmVkaWNhdGVzLiAgQXMgdGhleSBuZXZlciBoYXZlIHJldHVybiB2YWx1ZXMKKyAqICBub3IgcGFyYW1ldGVycyBldGMuLi4sIGp1c3QgZ2l2ZSBzaW1wbGVzdCBwb3NzaWJsZSBtZXRob2QuICBEb24ndCBkbworICogIGFueSBvZiB0aGUgbm9ybWFsIG1lbW9pemF0aW9uIHN0dWZmIGluIGhlcmUgZWl0aGVyOyBpdCdzIGEgd2FzdGUuCisgKiAgQXMgcHJlZGljYXRlcyBjYW5ub3QgYmUgaW5saW5lZCBpbnRvIHRoZSBpbnZva2luZyBydWxlLCB0aGV5IG5lZWQgdG8KKyAqICBiZSBpbiBhIHJ1bGUgYnkgdGhlbXNlbHZlcy4KKyAqLworc3lucHJlZFJ1bGUocnVsZU5hbWUsIHJ1bGVEZXNjcmlwdG9yLCBibG9jaywgZGVzY3JpcHRpb24sIG5ha2VkQmxvY2spIDo6PQorPDwKKy8vICRBTlRMUiBzdGFydCA8cnVsZU5hbWU+CitAdGhyb3dzKGNsYXNzT2ZbUmVjb2duaXRpb25FeGNlcHRpb25dKQorZGVmIDxydWxlTmFtZT5fZnJhZ21lbnQoPHJ1bGVEZXNjcmlwdG9yLnBhcmFtZXRlclNjb3BlOnBhcmFtZXRlclNjb3BlKCk+KTogVW5pdCA9IHsKKyAgICA8cnVsZUxhYmVsRGVmcygpPgorPGlmKHRyYWNlKT4KKyAgICB0cmFjZUluKCI8cnVsZU5hbWU+X2ZyYWdtZW50IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4PikKKyAgICB0cnkgeworICAgICAgICA8YmxvY2s+CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgICB0cmFjZU91dCgiPHJ1bGVOYW1lPl9mcmFnbWVudCIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pOworICAgIH0KKzxlbHNlPgorICAgIDxibG9jaz4KKzxlbmRpZj4KK30KKy8vICRBTlRMUiBlbmQgPHJ1bGVOYW1lPgorPj4KKworc3lucHJlZChuYW1lKSA6Oj0gPDwKK2ZpbmFsIGRlZiA8bmFtZT4oKTogQm9vbGVhbiA9IHsKKyAgICBzdGF0ZS5iYWNrdHJhY2tpbmcrPTEKKyAgICA8QHN0YXJ0KCk+CisgICAgdmFsIHN0YXJ0ID0gaW5wdXQubWFyaygpCisgICAgdHJ5IHsKKyAgICAgICAgPG5hbWU+X2ZyYWdtZW50KCkgLy8gY2FuIG5ldmVyIHRocm93IGV4Y2VwdGlvbgorICAgIH0gY2F0Y2ggeworICAgICAgICBjYXNlIHJlOiBSZWNvZ25pdGlvbkV4Y2VwdGlvbiA9PgorICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImltcG9zc2libGU6ICIrcmUpCisgICAgfQorICAgIHZhbCBzdWNjZXNzID0gIXN0YXRlLmZhaWxlZAorICAgIGlucHV0LnJld2luZChzdGFydCkKKyAgICA8QHN0b3AoKT4KKyAgICBzdGF0ZS5iYWNrdHJhY2tpbmctPTEKKyAgICBzdGF0ZS5mYWlsZWQ9ZmFsc2UKKyAgICBzdWNjZXNzCit9PFxuPgorPj4KKworbGV4ZXJTeW5wcmVkKG5hbWUpIDo6PSA8PAorPHN5bnByZWQobmFtZSk+Cis+PgorCitydWxlTWVtb2l6YXRpb24obmFtZSkgOjo9IDw8Cis8aWYobWVtb2l6ZSk+CitpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICYmIGFscmVhZHlQYXJzZWRSdWxlKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KSApIHsgcmV0dXJuIDxydWxlUmV0dXJuVmFsdWUoKT4gfQorPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byB0ZXN0IGZvciBmYWlsdXJlIGFuZCByZXR1cm4gZnJvbSBydWxlICovCitjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCkgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT5pZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPjxlbmRpZj4KKz4+CisKKy8qKiBUaGlzIHJ1bGUgaGFzIGZhaWxlZCwgZXhpdCBpbmRpY2F0aW5nIGZhaWx1cmUgZHVyaW5nIGJhY2t0cmFjayAqLworcnVsZUJhY2t0cmFja0ZhaWx1cmUoKSA6Oj0gPDwKKzxpZihiYWNrdHJhY2tpbmcpPmlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gPHJ1bGVSZXR1cm5WYWx1ZSgpPn08ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGdlbmVyYXRlIGNvZGUgZm9yIGEgcnVsZS4gIFRoaXMgaW5jbHVkZXMgYW55IHJldHVybiB0eXBlCisgKiAgZGF0YSBhZ2dyZWdhdGVzIHJlcXVpcmVkIGZvciBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgorICovCitydWxlKHJ1bGVOYW1lLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLGVtcHR5UnVsZSxkZXNjcmlwdGlvbixleGNlcHRpb25zLGZpbmFsbHksbWVtb2l6ZSkgOjo9IDw8Cis8cnVsZUF0dHJpYnV0ZVNjb3BlKHNjb3BlPXJ1bGVEZXNjcmlwdG9yLnJ1bGVTY29wZSk+Cis8cmV0dXJuU2NvcGUoc2NvcGU9cnVsZURlc2NyaXB0b3IucmV0dXJuU2NvcGUpPgorCisvLyAkQU5UTFIgc3RhcnQgIjxydWxlTmFtZT4iCisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK0B0aHJvd3MoY2xhc3NPZltSZWNvZ25pdGlvbkV4Y2VwdGlvbl0pCitmaW5hbCBkZWYgPHJ1bGVOYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pOiA8cmV0dXJuVHlwZSgpPiA9IHsKKyAgICA8aWYodHJhY2UpPnRyYWNlSW4oIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTxlbmRpZj4KKyAgICA8cnVsZVNjb3BlU2V0VXAoKT4KKyAgICA8cnVsZURlY2xhcmF0aW9ucygpPgorICAgIDxydWxlTGFiZWxEZWZzKCk+CisgICAgPHJ1bGVEZXNjcmlwdG9yLmFjdGlvbnMuaW5pdD4KKyAgICA8QHByZWFtYmxlKCk+CisgICAgdHJ5IHsKKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPGJsb2NrPgorICAgICAgICA8cnVsZUNsZWFuVXAoKT4KKyAgICAgICAgPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWN0aW9uKCk+CisgICAgfQorPGlmKGV4Y2VwdGlvbnMpPgorICAgIDxleGNlcHRpb25zOntlfDxjYXRjaChkZWNsPWUuZGVjbCxhY3Rpb249ZS5hY3Rpb24pPjxcbj59PgorPGVsc2U+Cis8aWYoIWVtcHR5UnVsZSk+Cis8aWYoYWN0aW9ucy4oYWN0aW9uU2NvcGUpLnJ1bGVjYXRjaCk+CisgICAgPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5ydWxlY2F0Y2g+Cis8ZWxzZT4KKyAgICBjYXRjaCB7CisgICAgICAgIGNhc2UgcmU6IFJlY29nbml0aW9uRXhjZXB0aW9uID0+CisgICAgICAgIHJlcG9ydEVycm9yKHJlKQorICAgICAgICByZWNvdmVyKGlucHV0LHJlKQorCTxAc2V0RXJyb3JSZXR1cm5WYWx1ZSgpPgorICAgIH08XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis8ZW5kaWY+CisgICAgZmluYWxseSB7CisgICAgICAgIDxpZih0cmFjZSk+dHJhY2VPdXQoIjxydWxlTmFtZT4iLCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+KTs8ZW5kaWY+CisgICAgICAgIDxtZW1vaXplKCk+CisgICAgICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgICAgIDxmaW5hbGx5PgorICAgIH0KKyAgICA8QHBvc3RhbWJsZSgpPgorICAgIHJldHVybiA8cnVsZVJldHVyblZhbHVlKCk+Cit9CisvLyAkQU5UTFIgZW5kICI8cnVsZU5hbWU+IgorPj4KKworY2F0Y2goZGVjbCxhY3Rpb24pIDo6PSA8PAorY2F0Y2ggKDxlLmRlY2w+KSB7CisgICAgPGUuYWN0aW9uPgorfQorPj4KKworcnVsZURlY2xhcmF0aW9ucygpIDo6PSA8PAorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3ZhbCByZXR2YWwgPSBuZXcgPHJldHVyblR5cGUoKT4oKQorcmV0dmFsLnN0YXJ0ID0gaW5wdXQuTFQoMSk8XG4+Cis8ZWxzZT4KKzxydWxlRGVzY3JpcHRvci5yZXR1cm5TY29wZS5hdHRyaWJ1dGVzOnsgYSB8Cit2YXIgPGEubmFtZT46IDxhLnR5cGU+ID0gPGlmKGEuaW5pdFZhbHVlKT48YS5pbml0VmFsdWU+PGVsc2U+PGluaXRWYWx1ZShhLnR5cGUpPjxlbmRpZj4KK30+Cis8ZW5kaWY+Cis8aWYobWVtb2l6ZSk+Cit2YWwgPHJ1bGVEZXNjcmlwdG9yLm5hbWU+X1N0YXJ0SW5kZXggPSBpbnB1dC5pbmRleCgpCis8ZW5kaWY+Cis+PgorCitydWxlU2NvcGVTZXRVcCgpIDo6PSA8PAorPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7aXQgfCA8aXQ+X3N0YWNrLnB1c2gobmV3IDxpdD5fc2NvcGUoKSl9OyBzZXBhcmF0b3I9IlxuIj4KKzxydWxlRGVzY3JpcHRvci5ydWxlU2NvcGU6e2l0IHwgPGl0Lm5hbWU+X3N0YWNrLnB1c2gobmV3IDxpdC5uYW1lPl9zY29wZSgpKX07IHNlcGFyYXRvcj0iXG4iPgorPj4KKworcnVsZVNjb3BlQ2xlYW5VcCgpIDo6PSA8PAorPHJ1bGVEZXNjcmlwdG9yLnVzZVNjb3Blczp7aXQgfCA8aXQ+X3N0YWNrLnBvcCgpfTsgc2VwYXJhdG9yPSJcbiI+Cis8cnVsZURlc2NyaXB0b3IucnVsZVNjb3BlOntpdCB8IDxpdC5uYW1lPl9zdGFjay5wb3AoKX07IHNlcGFyYXRvcj0iXG4iPgorPj4KKworCitydWxlTGFiZWxEZWZzKCkgOjo9IDw8Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3Iud2lsZGNhcmRUcmVlTGFiZWxzLHJ1bGVEZXNjcmlwdG9yLndpbGRjYXJkVHJlZUxpc3RMYWJlbHNdCisgICAgOntpdCB8IHZhciA8aXQubGFiZWwudGV4dD46IDxsYWJlbFR5cGU+ID0gbnVsbH07IHNlcGFyYXRvcj0iXG4iCis+Cis8W3J1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci5ydWxlTGlzdExhYmVscyxydWxlRGVzY3JpcHRvci53aWxkY2FyZFRyZWVMaXN0TGFiZWxzXQorICAgIDp7aXQgfCB2YXIgbGlzdF88aXQubGFiZWwudGV4dD46IGphdmEudXRpbC5MaXN0PW51bGx9OyBzZXBhcmF0b3I9IlxuIgorPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMYWJlbHM6cnVsZUxhYmVsRGVmKCk7IHNlcGFyYXRvcj0iXG4iPgorPHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzOntsbHx2YXIgPGxsLmxhYmVsLnRleHQ+OiBSdWxlUmV0dXJuU2NvcGUgPSBudWxsfTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorCitsZXhlclJ1bGVMYWJlbERlZnMoKSA6Oj0gPDwKKzxbcnVsZURlc2NyaXB0b3IudG9rZW5MYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnRva2VuTGlzdExhYmVscywKKyAgcnVsZURlc2NyaXB0b3IucnVsZUxhYmVsc10KKyAgICA6e2l0IHwgdmFyIDxpdC5sYWJlbC50ZXh0PjogPGxhYmVsVHlwZT49bnVsbH07IHNlcGFyYXRvcj0iXG4iCis+Cis8cnVsZURlc2NyaXB0b3IuY2hhckxhYmVsczp7aXQgfCBpbnQgPGl0LmxhYmVsLnRleHQ+O307IHNlcGFyYXRvcj0iXG4iPgorPFtydWxlRGVzY3JpcHRvci50b2tlbkxpc3RMYWJlbHMsCisgIHJ1bGVEZXNjcmlwdG9yLnJ1bGVMaXN0TGFiZWxzXQorICAgIDp7aXQgfCB2YXIgbGlzdF88aXQubGFiZWwudGV4dD46IGphdmEudXRpbC5MaXN0PW51bGx9OyBzZXBhcmF0b3I9IlxuIgorPgorPj4KKworcnVsZVJldHVyblZhbHVlKCkgOjo9IDw8Cis8aWYoIXJ1bGVEZXNjcmlwdG9yLmlzU3luUHJlZCk+Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzUmV0dXJuVmFsdWUpPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVybk5hbWU+Cis8ZWxzZT4KK3JldHZhbAorPGVuZGlmPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworcnVsZUNsZWFuVXAoKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+Cis8aWYoIVRSRUVfUEFSU0VSKT4KK3JldHZhbC5zdG9wID0gaW5wdXQuTFQoLTEpPFxuPgorPGVuZGlmPgorPGVuZGlmPgorPj4KKworbWVtb2l6ZSgpIDo6PSA8PAorPGlmKG1lbW9pemUpPgorPGlmKGJhY2t0cmFja2luZyk+CitpZiAoIHN0YXRlLmJhY2t0cmFja2luZz4wICkgeyBtZW1vaXplKGlucHV0LCA8cnVsZURlc2NyaXB0b3IuaW5kZXg+LCA8cnVsZURlc2NyaXB0b3IubmFtZT5fU3RhcnRJbmRleCkgfQorPGVuZGlmPgorPGVuZGlmPgorPj4KKworLyoqIEhvdyB0byBnZW5lcmF0ZSBhIHJ1bGUgaW4gdGhlIGxleGVyOyBuYWtlZCBibG9ja3MgYXJlIHVzZWQgZm9yCisgKiAgZnJhZ21lbnQgcnVsZXMuCisgKi8KK2xleGVyUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLHJ1bGVEZXNjcmlwdG9yLGJsb2NrLG1lbW9pemUpIDo6PSA8PAorLy8gJEFOVExSIHN0YXJ0ICI8cnVsZU5hbWU+IgorQHRocm93cyhjbGFzc09mW1JlY29nbml0aW9uRXhjZXB0aW9uXSkKK2ZpbmFsIGRlZiBtPHJ1bGVOYW1lPig8cnVsZURlc2NyaXB0b3IucGFyYW1ldGVyU2NvcGU6cGFyYW1ldGVyU2NvcGUoKT4pOiBVbml0ID0geworICAgIDxpZih0cmFjZSk+dHJhY2VJbigiPHJ1bGVOYW1lPiIsIDxydWxlRGVzY3JpcHRvci5pbmRleD4pPGVuZGlmPgorICAgIDxydWxlU2NvcGVTZXRVcCgpPgorICAgIDxydWxlRGVjbGFyYXRpb25zKCk+CisgICAgdHJ5IHsKKzxpZihuYWtlZEJsb2NrKT4KKyAgICAgICAgPHJ1bGVNZW1vaXphdGlvbihuYW1lPXJ1bGVOYW1lKT4KKyAgICAgICAgPGxleGVyUnVsZUxhYmVsRGVmcygpPgorICAgICAgICA8cnVsZURlc2NyaXB0b3IuYWN0aW9ucy5pbml0PgorICAgICAgICB0cnkgPGJsb2NrPjxcbj4KKzxlbHNlPgorICAgICAgICB2YXIgX3R5cGUgPSA8cnVsZU5hbWU+CisgICAgICAgIHZhciBfY2hhbm5lbCA9IEJhc2VSZWNvZ25pemVyLkRFRkFVTFRfVE9LRU5fQ0hBTk5FTAorICAgICAgICA8cnVsZU1lbW9pemF0aW9uKG5hbWU9cnVsZU5hbWUpPgorICAgICAgICA8bGV4ZXJSdWxlTGFiZWxEZWZzKCk+CisgICAgICAgIDxydWxlRGVzY3JpcHRvci5hY3Rpb25zLmluaXQ+CisgICAgICAgIHRyeSA8YmxvY2s+CisgICAgICAgIDxydWxlQ2xlYW5VcCgpPgorICAgICAgICBzdGF0ZS5gdHlwZWAgPSBfdHlwZQorICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWwKKyAgICAgICAgPChydWxlRGVzY3JpcHRvci5hY3Rpb25zLmFmdGVyKTpleGVjQWN0aW9uKCk+Cis8ZW5kaWY+CisgICAgfQorICAgIGZpbmFsbHkgeworICAgICAgICA8aWYodHJhY2UpPnRyYWNlT3V0KCI8cnVsZU5hbWU+IiwgPHJ1bGVEZXNjcmlwdG9yLmluZGV4Pik8ZW5kaWY+CisgICAgICAgIDxydWxlU2NvcGVDbGVhblVwKCk+CisgICAgICAgIDxtZW1vaXplKCk+CisgICAgfQorfQorLy8gJEFOVExSIGVuZCAiPHJ1bGVOYW1lPiIKKz4+CisKKy8qKiBIb3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBsZXhlciBncmFtbWFyIHJ1bGUKKyAqICB0aGF0IGNob29zZXMgYmV0d2VlbiBsZXhlciBydWxlcy4KKyAqLwordG9rZW5zUnVsZShydWxlTmFtZSxuYWtlZEJsb2NrLGFyZ3MsYmxvY2sscnVsZURlc2NyaXB0b3IpIDo6PSA8PAorQHRocm93cyhjbGFzc09mW1JlY29nbml0aW9uRXhjZXB0aW9uXSkKK2RlZiBtVG9rZW5zKCk6IFVuaXQgPSB7CisgICAgPGJsb2NrPjxcbj4KK30KKz4+CisKKy8vIFMgVSBCIFIgVSBMIEUgUworCisvKiogQSAoLi4uKSBzdWJydWxlIHdpdGggbXVsdGlwbGUgYWx0ZXJuYXRpdmVzICovCitibG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPG1heEFsdD4KKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+Cis8QHByZWJyYW5jaCgpPgorYWx0PGRlY2lzaW9uTnVtYmVyPiBtYXRjaCB7CisgICAgPGFsdHM6e2EgfCA8YWx0U3dpdGNoQ2FzZShpLGEpPn0+CisgICAgY2FzZSBfID0+Cit9Cis8QHBvc3RicmFuY2goKT4KKz4+CisKKy8qKiBBIHJ1bGUgYmxvY2sgd2l0aCBtdWx0aXBsZSBhbHRlcm5hdGl2ZXMgKi8KK3J1bGVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+ID0gPG1heEFsdD4KKzxkZWNscz4KKzxAcHJlZGVjaXNpb24oKT4KKzxkZWNpc2lvbj4KKzxAcG9zdGRlY2lzaW9uKCk+CithbHQ8ZGVjaXNpb25OdW1iZXI+IG1hdGNoIHsKKyAgICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KKyAgICBjYXNlIF8gPT4KK30KKz4+CisKK3J1bGVCbG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgc3BlY2lhbCBjYXNlIG9mIGEgKC4uLikgc3VicnVsZSB3aXRoIGEgc2luZ2xlIGFsdGVybmF0aXZlICovCitibG9ja1NpbmdsZUFsdChhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KKzxkZWNscz4KKzxAcHJlYWx0KCk+Cis8YWx0cz4KKzxAcG9zdGFsdCgpPgorPj4KKworLyoqIEEgKC4uKSsgYmxvY2sgd2l0aCAxIG9yIG1vcmUgYWx0ZXJuYXRpdmVzICovCitwb3NpdGl2ZUNsb3N1cmVCbG9jayhhbHRzLGRlY2xzLGRlY2lzaW9uLGVuY2xvc2luZ0Jsb2NrTGV2ZWwsYmxvY2tMZXZlbCxkZWNpc2lvbk51bWJlcixtYXhLLG1heEFsdCxkZXNjcmlwdGlvbikgOjo9IDw8CisvLyA8ZmlsZU5hbWU+OjxkZXNjcmlwdGlvbj4KK3ZhciBjbnQ8ZGVjaXNpb25OdW1iZXI+OiBJbnQgPSAwCis8ZGVjbHM+Cis8QHByZWxvb3AoKT4KK3ZhciBsb29wPGRlY2lzaW9uTnVtYmVyPl9xdWl0ZmxhZyA9IGZhbHNlCit3aGlsZSAoIWxvb3A8ZGVjaXNpb25OdW1iZXI+X3F1aXRmbGFnKSB7CisgICAgdmFyIGFsdDxkZWNpc2lvbk51bWJlcj46SW50ID0gPG1heEFsdD4KKyAgICA8QHByZWRlY2lzaW9uKCk+CisgICAgPGRlY2lzaW9uPgorICAgIDxAcG9zdGRlY2lzaW9uKCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPiBtYXRjaCB7CisgICAgICAgIDxhbHRzOnthIHwgPGFsdFN3aXRjaENhc2UoaSxhKT59PgorCWNhc2UgXyA9PgorCSAgICBpZiAoIGNudDxkZWNpc2lvbk51bWJlcj4gPj0gMSApIGxvb3A8ZGVjaXNpb25OdW1iZXI+X3F1aXRmbGFnID0gdHJ1ZQorCSAgICBlbHNlIHsKKwkgICAgPHJ1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgICAgICAgICB2YWwgZWVlID0gbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbig8ZGVjaXNpb25OdW1iZXI+LCBpbnB1dCkKKyAgICAgICAgICAgIDxAZWFybHlFeGl0RXhjZXB0aW9uKCk+CisgICAgICAgICAgICB0aHJvdyBlZWUKKyAgICAgIH0KKyAgICB9CisgICAgY250PGRlY2lzaW9uTnVtYmVyPis9MQorfQorPEBwb3N0bG9vcCgpPgorPj4KKworcG9zaXRpdmVDbG9zdXJlQmxvY2tTaW5nbGVBbHQgOjo9IHBvc2l0aXZlQ2xvc3VyZUJsb2NrCisKKy8qKiBBICguLikqIGJsb2NrIHdpdGggMSBvciBtb3JlIGFsdGVybmF0aXZlcyAqLworY2xvc3VyZUJsb2NrKGFsdHMsZGVjbHMsZGVjaXNpb24sZW5jbG9zaW5nQmxvY2tMZXZlbCxibG9ja0xldmVsLGRlY2lzaW9uTnVtYmVyLG1heEssbWF4QWx0LGRlc2NyaXB0aW9uKSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgorPGRlY2xzPgorPEBwcmVsb29wKCk+Cit2YXIgbG9vcDxkZWNpc2lvbk51bWJlcj5fcXVpdGZsYWcgPSBmYWxzZQord2hpbGUgKCFsb29wPGRlY2lzaW9uTnVtYmVyPl9xdWl0ZmxhZykgeworICAgIHZhciBhbHQ8ZGVjaXNpb25OdW1iZXI+OkludCA9IDxtYXhBbHQ+CisgICAgPEBwcmVkZWNpc2lvbigpPgorICAgIDxkZWNpc2lvbj4KKyAgICA8QHBvc3RkZWNpc2lvbigpPgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj4gbWF0Y2ggeworICAgICAgICA8YWx0czp7YSB8IDxhbHRTd2l0Y2hDYXNlKGksYSk+fT4KKwljYXNlIF8gPT4gbG9vcDxkZWNpc2lvbk51bWJlcj5fcXVpdGZsYWcgPSB0cnVlCisgICAgfQorfQorPEBwb3N0bG9vcCgpPgorPj4KKworY2xvc3VyZUJsb2NrU2luZ2xlQWx0IDo6PSBjbG9zdXJlQmxvY2sKKworLyoqIE9wdGlvbmFsIGJsb2NrcyAoeCk/IGFyZSB0cmFuc2xhdGVkIHRvICh4fCkgYnkgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbgorICogIHNvIHdlIGNhbiBqdXN0IHVzZSB0aGUgbm9ybWFsIGJsb2NrIHRlbXBsYXRlCisgKi8KK29wdGlvbmFsQmxvY2sgOjo9IGJsb2NrCisKK29wdGlvbmFsQmxvY2tTaW5nbGVBbHQgOjo9IGJsb2NrCisKKy8qKiBBIGNhc2UgaW4gYSBzd2l0Y2ggdGhhdCBqdW1wcyB0byBhbiBhbHRlcm5hdGl2ZSBnaXZlbiB0aGUgYWx0ZXJuYXRpdmUKKyAqICBudW1iZXIuICBBIERGQSBwcmVkaWN0cyB0aGUgYWx0ZXJuYXRpdmUgYW5kIHRoZW4gYSBzaW1wbGUgc3dpdGNoCisgKiAgZG9lcyB0aGUganVtcCB0byB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IG1hdGNoZXMgdGhhdCBhbHRlcm5hdGl2ZS4KKyAqLworYWx0U3dpdGNoQ2FzZShhbHROdW0sIGFsdCkgOjo9IDw8CitjYXNlIDxhbHROdW0+ID0+CisgICAgPEBwcmVhbHQoKT4KKyAgICA8YWx0PgorPj4KKworLyoqIEFuIGFsdGVybmF0aXZlIGlzIGp1c3QgYSBsaXN0IG9mIGVsZW1lbnRzOyBhdCBvdXRlcm1vc3QgbGV2ZWwgKi8KK2FsdChlbGVtZW50cyxhbHROdW0sZGVzY3JpcHRpb24sYXV0b0FTVCxvdXRlckFsdCx0cmVlTGV2ZWwscmV3KSA6Oj0gPDwKKy8vIDxmaWxlTmFtZT46PGRlc2NyaXB0aW9uPgoreworPEBkZWNsYXJhdGlvbnMoKT4KKzxlbGVtZW50czplbGVtZW50KCk+Cis8cmV3PgorPEBjbGVhbnVwKCk+Cit9Cis+PgorCisvKiogV2hhdCB0byBlbWl0IHdoZW4gdGhlcmUgaXMgbm8gcmV3cml0ZS4gIEZvciBhdXRvIGJ1aWxkCisgKiAgbW9kZSwgZG9lcyBub3RoaW5nLgorICovCitub1Jld3JpdGUocmV3cml0ZUJsb2NrTGV2ZWwsIHRyZWVMZXZlbCkgOjo9ICIiCisKKy8vIEUgTCBFIE0gRSBOIFQgUworCisvKiogRHVtcCB0aGUgZWxlbWVudHMgb25lIHBlciBsaW5lICovCitlbGVtZW50KGUpIDo6PSA8PAorPEBwcmVtYXRjaCgpPgorPGUuZWw+PFxuPgorPj4KKworLyoqIG1hdGNoIGEgdG9rZW4gb3B0aW9uYWxseSB3aXRoIGEgbGFiZWwgaW4gZnJvbnQgKi8KK3Rva2VuUmVmKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT48bGFiZWw+PTxlbmRpZj5gbWF0Y2hgKGlucHV0LDx0b2tlbj4sRk9MTE9XXzx0b2tlbj5faW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KTxpZihsYWJlbCk+LmFzSW5zdGFuY2VPZls8bGFiZWxUeXBlPl08ZW5kaWY+Cis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIGlkcys9SUQgKi8KK3Rva2VuUmVmQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHRva2VuUmVmKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKK2xpc3RMYWJlbChsYWJlbCxlbGVtKSA6Oj0gPDwKK2lmIChsaXN0XzxsYWJlbD49PW51bGwpIGxpc3RfPGxhYmVsPj1uZXcgamF2YS51dGlsLkFycmF5TGlzdCgpCitsaXN0XzxsYWJlbD4uYWRkKDxlbGVtPik8XG4+Cis+PgorCisvKiogbWF0Y2ggYSBjaGFyYWN0ZXIgKi8KK2NoYXJSZWYoY2hhcixsYWJlbCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpPFxuPgorPGVuZGlmPgorYG1hdGNoYCg8Y2hhcj4pCis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIG1hdGNoIGEgY2hhcmFjdGVyIHJhbmdlICovCitjaGFyUmFuZ2VSZWYoYSxiLGxhYmVsKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8bGFiZWw+ID0gaW5wdXQuTEEoMSk8XG4+Cis8ZW5kaWY+CittYXRjaFJhbmdlKDxhPiw8Yj4pOyA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPj4KKworLyoqIEZvciBub3csIHNldHMgYXJlIGludGVydmFsIHRlc3RzIGFuZCBtdXN0IGJlIHRlc3RlZCBpbmxpbmUgKi8KK21hdGNoU2V0KHMsbGFiZWwsZWxlbWVudEluZGV4LHRlcm1pbmFsT3B0aW9ucyxwb3N0bWF0Y2hDb2RlPSIiKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cis8aWYoTEVYRVIpPgorPGxhYmVsPj0gaW5wdXQuTEEoMSk8XG4+Cis8ZWxzZT4KKzxsYWJlbD49aW5wdXQuTFQoMSkuYXNJbnN0YW5jZU9mWzxsYWJlbFR5cGU+XTxcbj4KKzxlbmRpZj4KKzxlbmRpZj4KK2lmICggPHM+ICkgeworICAgIGlucHV0LmNvbnN1bWUoKQorICAgIDxwb3N0bWF0Y2hDb2RlPgorPGlmKCFMRVhFUik+CisgICAgc3RhdGUuZXJyb3JSZWNvdmVyeT1mYWxzZTxcbj4KKzxlbmRpZj4KKyAgICA8aWYoYmFja3RyYWNraW5nKT5zdGF0ZS5mYWlsZWQ9ZmFsc2U8ZW5kaWY+Cit9CitlbHNlIHsKKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICB2YWwgbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCkKKyAgICA8QG1pc21hdGNoZWRTZXRFeGNlcHRpb24oKT4KKzxpZihMRVhFUik+CisgICAgcmVjb3Zlcihtc2UpCisgICAgdGhyb3cgbXNlCis8ZWxzZT4KKyAgICB0aHJvdyBtc2UKKyAgICA8ISB1c2UgZm9sbG93aW5nIGNvZGUgdG8gbWFrZSBpdCByZWNvdmVyIGlubGluZTsgcmVtb3ZlIHRocm93IG1zZTsKKyAgICByZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoaW5wdXQsbXNlLEZPTExPV19zZXRfaW5fPHJ1bGVOYW1lPjxlbGVtZW50SW5kZXg+KQorICAgICE+Cis8ZW5kaWY+Cit9PFxuPgorPj4KKworbWF0Y2hSdWxlQmxvY2tTZXQgOjo9IG1hdGNoU2V0CisKK21hdGNoU2V0QW5kTGlzdExhYmVsKHMsbGFiZWwsZWxlbWVudEluZGV4LHBvc3RtYXRjaENvZGUpIDo6PSA8PAorPG1hdGNoU2V0KC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCBhIHN0cmluZyBsaXRlcmFsICovCitsZXhlclN0cmluZ1JlZihzdHJpbmcsbGFiZWwsZWxlbWVudEluZGV4PSIwIikgOjo9IDw8Cis8aWYobGFiZWwpPgordmFsIDxsYWJlbD5TdGFydCA9IGdldENoYXJJbmRleCgpCitgbWF0Y2hgKDxzdHJpbmc+KQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK3ZhbCA8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4gPSBnZXRMaW5lKCkKK3ZhbCA8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4gPSBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKQorPGxhYmVsPiA9IG5ldyA8bGFiZWxUeXBlPihpbnB1dCwgVG9rZW4uSU5WQUxJRF9UT0tFTl9UWVBFLCBUb2tlbi5ERUZBVUxUX0NIQU5ORUwsIDxsYWJlbD5TdGFydCwgZ2V0Q2hhckluZGV4KCktMSkKKzxsYWJlbD4uc2V0TGluZSg8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4pCis8bGFiZWw+LnNldENoYXJQb3NpdGlvbkluTGluZSg8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4pCis8ZWxzZT4KK2BtYXRjaGAoPHN0cmluZz4pCis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPjxcbj4KKzxlbmRpZj4KKz4+CisKK3dpbGRjYXJkKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPGlmKGxhYmVsKT4KKzxsYWJlbD49aW5wdXQuTFQoMSkuYXNJbnN0YW5jZU9mWzxsYWJlbFR5cGU+XTxcbj4KKzxlbmRpZj4KK21hdGNoQW55KGlucHV0KQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKK3dpbGRjYXJkQW5kTGlzdExhYmVsKHRva2VuLGxhYmVsLGVsZW1lbnRJbmRleCx0ZXJtaW5hbE9wdGlvbnMpIDo6PSA8PAorPHdpbGRjYXJkKC4uLik+Cis8bGlzdExhYmVsKGVsZW09bGFiZWwsLi4uKT4KKz4+CisKKy8qKiBNYXRjaCAuIHdpbGRjYXJkIGluIGxleGVyICovCit3aWxkY2FyZENoYXIobGFiZWwsIGVsZW1lbnRJbmRleCkgOjo9IDw8Cis8aWYobGFiZWwpPgorPGxhYmVsPiA9IGlucHV0LkxBKDEpPFxuPgorPGVuZGlmPgorbWF0Y2hBbnkoKQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKz4+CisKK3dpbGRjYXJkQ2hhckxpc3RMYWJlbChsYWJlbCwgZWxlbWVudEluZGV4KSA6Oj0gPDwKKzx3aWxkY2FyZENoYXIoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIE1hdGNoIGEgcnVsZSByZWZlcmVuY2UgYnkgaW52b2tpbmcgaXQgcG9zc2libHkgd2l0aCBhcmd1bWVudHMKKyAqICBhbmQgYSByZXR1cm4gdmFsdWUgb3IgdmFsdWVzLiAgVGhlICdydWxlJyBhcmd1bWVudCB3YXMgdGhlCisgKiAgdGFyZ2V0IHJ1bGUgbmFtZSwgYnV0IG5vdyBpcyB0eXBlIFJ1bGUsIHdob3NlIHRvU3RyaW5nIGlzCisgKiAgc2FtZTogdGhlIHJ1bGUgbmFtZS4gIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlCisgKiAgZGVzY3JpcHRvciBzdHVmZi4KKyAqLworcnVsZVJlZihydWxlLGxhYmVsLGVsZW1lbnRJbmRleCxhcmdzLHNjb3BlKSA6Oj0gPDwKK3B1c2hGb2xsb3coRk9MTE9XXzxydWxlLm5hbWU+X2luXzxydWxlTmFtZT48ZWxlbWVudEluZGV4PikKKzxpZihsYWJlbCk+PGxhYmVsPj08ZW5kaWY+PGlmKHNjb3BlKT48c2NvcGU6ZGVsZWdhdGVOYW1lKCk+LjxlbmRpZj48cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KTxcbj4KK3N0YXRlLl9mc3AtPTEKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis+PgorCisvKiogaWRzKz1yICovCitydWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsZWxlbWVudEluZGV4LGFyZ3Msc2NvcGUpIDo6PSA8PAorPHJ1bGVSZWYoLi4uKT4KKzxsaXN0TGFiZWwoZWxlbT1sYWJlbCwuLi4pPgorPj4KKworLyoqIEEgbGV4ZXIgcnVsZSByZWZlcmVuY2UuCisgKgorICogIFRoZSAncnVsZScgYXJndW1lbnQgd2FzIHRoZSB0YXJnZXQgcnVsZSBuYW1lLCBidXQgbm93CisgKiAgaXMgdHlwZSBSdWxlLCB3aG9zZSB0b1N0cmluZyBpcyBzYW1lOiB0aGUgcnVsZSBuYW1lLgorICogIE5vdyB0aG91Z2ggeW91IGNhbiBhY2Nlc3MgZnVsbCBydWxlIGRlc2NyaXB0b3Igc3R1ZmYuCisgKi8KK2xleGVyUnVsZVJlZihydWxlLGxhYmVsLGFyZ3MsZWxlbWVudEluZGV4LHNjb3BlKSA6Oj0gPDwKKzxpZihsYWJlbCk+Cit2YWwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4gPSBnZXRDaGFySW5kZXgoKQordmFsIDxsYWJlbD5TdGFydExpbmU8ZWxlbWVudEluZGV4PiA9IGdldExpbmUoKQordmFsIDxsYWJlbD5TdGFydENoYXJQb3M8ZWxlbWVudEluZGV4PiA9IGdldENoYXJQb3NpdGlvbkluTGluZSgpCis8aWYoc2NvcGUpPjxzY29wZTpkZWxlZ2F0ZU5hbWUoKT4uPGVuZGlmPm08cnVsZS5uYW1lPig8YXJnczsgc2VwYXJhdG9yPSIsICI+KQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxsYWJlbD4gPSBuZXcgPGxhYmVsVHlwZT4oaW5wdXQsIFRva2VuLklOVkFMSURfVE9LRU5fVFlQRSwgVG9rZW4uREVGQVVMVF9DSEFOTkVMLCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiwgZ2V0Q2hhckluZGV4KCktMSkKKzxsYWJlbD4uc2V0TGluZSg8bGFiZWw+U3RhcnRMaW5lPGVsZW1lbnRJbmRleD4pCis8bGFiZWw+LnNldENoYXJQb3NpdGlvbkluTGluZSg8bGFiZWw+U3RhcnRDaGFyUG9zPGVsZW1lbnRJbmRleD4pCis8ZWxzZT4KKzxpZihzY29wZSk+PHNjb3BlOmRlbGVnYXRlTmFtZSgpPi48ZW5kaWY+bTxydWxlLm5hbWU+KDxhcmdzOyBzZXBhcmF0b3I9IiwgIj4pCis8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorPGVuZGlmPgorPj4KKworLyoqIGkrPUlOVCBpbiBsZXhlciAqLworbGV4ZXJSdWxlUmVmQW5kTGlzdExhYmVsKHJ1bGUsbGFiZWwsYXJncyxlbGVtZW50SW5kZXgsc2NvcGUpIDo6PSA8PAorPGxleGVyUnVsZVJlZiguLi4pPgorPGxpc3RMYWJlbChlbGVtPWxhYmVsLC4uLik+Cis+PgorCisvKiogRU9GIGluIHRoZSBsZXhlciAqLworbGV4ZXJNYXRjaEVPRihsYWJlbCxlbGVtZW50SW5kZXgpIDo6PSA8PAorPGlmKGxhYmVsKT4KK3ZhbCA8bGFiZWw+U3RhcnQ8ZWxlbWVudEluZGV4PiA9IGdldENoYXJJbmRleCgpCit2YWwgPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+ID0gZ2V0TGluZSgpCit2YWwgPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+ID0gZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkKK2BtYXRjaGAoRU9GKQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KK3ZhbCA8bGFiZWw+ID0gbmV3IDxsYWJlbFR5cGU+KGlucHV0LCBFT0YsIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwgPGxhYmVsPlN0YXJ0PGVsZW1lbnRJbmRleD4sIGdldENoYXJJbmRleCgpLTEpCis8bGFiZWw+LnNldExpbmUoPGxhYmVsPlN0YXJ0TGluZTxlbGVtZW50SW5kZXg+KQorPGxhYmVsPi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoPGxhYmVsPlN0YXJ0Q2hhclBvczxlbGVtZW50SW5kZXg+KQorPGVsc2U+CitgbWF0Y2hgKEVPRikKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvLyB1c2VkIGZvciBsZWZ0LXJlY3Vyc2l2ZSBydWxlcworcmVjUnVsZURlZkFyZygpICAgICAgICAgICAgICAgICAgICAgICA6Oj0gImludCA8cmVjUnVsZUFyZygpPiIKK3JlY1J1bGVBcmcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgOjo9ICJfcCIKK3JlY1J1bGVBbHRQcmVkaWNhdGUocnVsZU5hbWUsb3BQcmVjKSAgOjo9ICI8cmVjUnVsZUFyZygpPiBcPD0gPG9wUHJlYz4iCityZWNSdWxlU2V0UmVzdWx0QWN0aW9uKCkgICAgICAgICAgICAgIDo6PSAicm9vdF8wPSQ8cnVsZU5hbWU+X3ByaW1hcnkudHJlZTsiCityZWNSdWxlU2V0UmV0dXJuQWN0aW9uKHNyYyxuYW1lKSAgICAgIDo6PSAiJDxuYW1lPj0kPHNyYz4uPG5hbWU+OyIKKworLyoqIG1hdGNoIF4ocm9vdCBjaGlsZHJlbikgaW4gdHJlZSBwYXJzZXIgKi8KK3RyZWUocm9vdCwgYWN0aW9uc0FmdGVyUm9vdCwgY2hpbGRyZW4sIG51bGxhYmxlQ2hpbGRMaXN0LAorICAgICBlbmNsb3NpbmdUcmVlTGV2ZWwsIHRyZWVMZXZlbCkgOjo9IDw8Cis8cm9vdDplbGVtZW50KCk+Cis8YWN0aW9uc0FmdGVyUm9vdDplbGVtZW50KCk+Cis8aWYobnVsbGFibGVDaGlsZExpc3QpPgoraWYgKCBpbnB1dC5MQSgxKT09VG9rZW4uRE9XTiApIHsKKyAgICBgbWF0Y2hgKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKQorICAgIDxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+CisgICAgPGNoaWxkcmVuOmVsZW1lbnQoKT4KKyAgICBgbWF0Y2hgKGlucHV0LCBUb2tlbi5VUCwgbnVsbCkKKyAgICA8Y2hlY2tSdWxlQmFja3RyYWNrRmFpbHVyZSgpPgorfQorPGVsc2U+CitgbWF0Y2hgKGlucHV0LCBUb2tlbi5ET1dOLCBudWxsKQorPGNoZWNrUnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKzxjaGlsZHJlbjplbGVtZW50KCk+CitgbWF0Y2hgKGlucHV0LCBUb2tlbi5VUCwgbnVsbCkKKzxjaGVja1J1bGVCYWNrdHJhY2tGYWlsdXJlKCk+Cis8ZW5kaWY+Cis+PgorCisvKiogRXZlcnkgcHJlZGljYXRlIGlzIHVzZWQgYXMgYSB2YWxpZGF0aW5nIHByZWRpY2F0ZSAoZXZlbiB3aGVuIGl0IGlzCisgKiAgYWxzbyBob2lzdGVkIGludG8gYSBwcmVkaWN0aW9uIGV4cHJlc3Npb24pLgorICovCit2YWxpZGF0ZVNlbWFudGljUHJlZGljYXRlKHByZWQsZGVzY3JpcHRpb24pIDo6PSA8PAoraWYgKCAhKDxldmFsUHJlZGljYXRlKC4uLik+KSApIHsKKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAiPHJ1bGVOYW1lPiIsICI8ZGVzY3JpcHRpb24+IikKK30KKz4+CisKKy8vIEYgaSB4IGUgZCAgRCBGIEEgIChpZi10aGVuLWVsc2UpCisKK2RmYVN0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3ZhbCBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LkxBKDxrPik8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+CitlbHNlIHsKKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+Cis8ZWxzZT4KKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICB2YWwgbnZhZSA9IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiPGRlc2NyaXB0aW9uPiIsIDxkZWNpc2lvbk51bWJlcj4sIDxzdGF0ZU51bWJlcj4sIGlucHV0KTxcbj4KKyAgICA8QG5vVmlhYmxlQWx0RXhjZXB0aW9uKCk+CisgICAgdGhyb3cgbnZhZTxcbj4KKzxlbmRpZj4KK30KKz4+CisKKy8qKiBTYW1lIGFzIGEgbm9ybWFsIERGQSBzdGF0ZSBleGNlcHQgdGhhdCB3ZSBkb24ndCBleGFtaW5lIGxvb2thaGVhZAorICogIGZvciB0aGUgYnlwYXNzIGFsdGVybmF0aXZlLiAgSXQgZGVsYXlzIGVycm9yIGRldGVjdGlvbiBidXQgdGhpcworICogIGlzIGZhc3Rlciwgc21hbGxlciwgYW5kIG1vcmUgd2hhdCBwZW9wbGUgZXhwZWN0LiAgRm9yIChYKT8gcGVvcGxlCisgKiAgZXhwZWN0ICJpZiAoIExBKDEpPT1YICkgbWF0Y2goWCk7IiBhbmQgdGhhdCdzIGl0LgorICovCitkZmFPcHRpb25hbEJsb2NrU3RhdGUoayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAordmFsIExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID0gaW5wdXQuTEEoPGs+KTxcbj4KKzxlZGdlczsgc2VwYXJhdG9yPSJcbmVsc2UgIj4KKz4+CisKKy8qKiBBIERGQSBzdGF0ZSB0aGF0IGlzIGFjdHVhbGx5IHRoZSBsb29wYmFjayBkZWNpc2lvbiBvZiBhIGNsb3N1cmUKKyAqICBsb29wLiAgSWYgZW5kLW9mLXRva2VuIChFT1QpIHByZWRpY3RzIGFueSBvZiB0aGUgdGFyZ2V0cyB0aGVuIGl0CisgKiAgc2hvdWxkIGFjdCBsaWtlIGEgZGVmYXVsdCBjbGF1c2UgKGkuZS4sIG5vIGVycm9yIGNhbiBiZSBnZW5lcmF0ZWQpLgorICogIFRoaXMgaXMgdXNlZCBvbmx5IGluIHRoZSBsZXhlciBzbyB0aGF0IGZvciAoJ2EnKSogb24gdGhlIGVuZCBvZiBhIHJ1bGUKKyAqICBhbnl0aGluZyBvdGhlciB0aGFuICdhJyBwcmVkaWN0cyBleGl0aW5nLgorICovCitkZmFMb29wYmFja1N0YXRlKGssZWRnZXMsZW90UHJlZGljdHNBbHQsZGVzY3JpcHRpb24sc3RhdGVOdW1iZXIsc2VtUHJlZFN0YXRlKSA6Oj0gPDwKK3ZhbCBMQTxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPiA9IGlucHV0LkxBKDxrPik8XG4+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+PFxuPgorPGlmKGVvdFByZWRpY3RzQWx0KT4KKzxpZighZWRnZXMpPgorYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+IDwhIGlmIG5vIGVkZ2VzLCBkb24ndCBnZW4gRUxTRSAhPgorPGVsc2U+CitlbHNlIHsKKyAgICBhbHQ8ZGVjaXNpb25OdW1iZXI+PTxlb3RQcmVkaWN0c0FsdD4KK308XG4+Cis8ZW5kaWY+Cis8ZW5kaWY+Cis+PgorCisvKiogQW4gYWNjZXB0IHN0YXRlIGluZGljYXRlcyBhIHVuaXF1ZSBhbHRlcm5hdGl2ZSBoYXMgYmVlbiBwcmVkaWN0ZWQgKi8KK2RmYUFjY2VwdFN0YXRlKGFsdCkgOjo9ICJhbHQ8ZGVjaXNpb25OdW1iZXI+PTxhbHQ+IgorCisvKiogQSBzaW1wbGUgZWRnZSB3aXRoIGFuIGV4cHJlc3Npb24uICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBzYXRpc2ZpZWQsCisgKiAgZW50ZXIgdG8gdGhlIHRhcmdldCBzdGF0ZS4gIFRvIGhhbmRsZSBnYXRlZCBwcm9kdWN0aW9ucywgd2UgbWF5CisgKiAgaGF2ZSB0byBldmFsdWF0ZSBzb21lIHByZWRpY2F0ZXMgZm9yIHRoaXMgZWRnZS4KKyAqLworZGZhRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7CisgICAgPHRhcmdldFN0YXRlPgorfQorPj4KKworLy8gRiBpIHggZSBkICBEIEYgQSAgKHN3aXRjaCBjYXNlKQorCisvKiogQSBERkEgc3RhdGUgd2hlcmUgYSBTV0lUQ0ggbWF5IGJlIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGdlbmVyYXRvcgorICogIGRlY2lkZXMgaWYgdGhpcyBpcyBwb3NzaWJsZTogQ29kZUdlbmVyYXRvci5jYW5HZW5lcmF0ZVN3aXRjaCgpLgorICovCitkZmFTdGF0ZVN3aXRjaChrLGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitpbnB1dC5MQSg8az4pIG1hdGNoIHsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+CitjYXNlIF8gPT4KKzxpZihlb3RQcmVkaWN0c0FsdCk+CisgICAgYWx0PGRlY2lzaW9uTnVtYmVyPj08ZW90UHJlZGljdHNBbHQ+Cis8ZWxzZT4KKyAgICA8cnVsZUJhY2t0cmFja0ZhaWx1cmUoKT4KKyAgICB2YWwgbnZhZSA9IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiPGRlc2NyaXB0aW9uPiIsIDxkZWNpc2lvbk51bWJlcj4sIDxzdGF0ZU51bWJlcj4sIGlucHV0KTxcbj4KKyAgICA8QG5vVmlhYmxlQWx0RXhjZXB0aW9uKCk+CisgICAgdGhyb3cgbnZhZTxcbj4KKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFPcHRpb25hbEJsb2NrU3RhdGVTd2l0Y2goayxlZGdlcyxlb3RQcmVkaWN0c0FsdCxkZXNjcmlwdGlvbixzdGF0ZU51bWJlcixzZW1QcmVkU3RhdGUpIDo6PSA8PAoraW5wdXQuTEEoPGs+KSBtYXRjaCB7CisgICAgPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KKyAgICBjYXNlIF8gPT4KK308XG4+Cis+PgorCitkZmFMb29wYmFja1N0YXRlU3dpdGNoKGssIGVkZ2VzLGVvdFByZWRpY3RzQWx0LGRlc2NyaXB0aW9uLHN0YXRlTnVtYmVyLHNlbVByZWRTdGF0ZSkgOjo9IDw8CitpbnB1dC5MQSg8az4pIG1hdGNoIHsKKzxlZGdlczsgc2VwYXJhdG9yPSJcbiI+PFxuPgorY2FzZSBfID0+Cis8aWYoZW90UHJlZGljdHNBbHQpPgorICAgIGFsdDxkZWNpc2lvbk51bWJlcj49PGVvdFByZWRpY3RzQWx0PjsKKzxlbmRpZj4KK308XG4+Cis+PgorCitkZmFFZGdlU3dpdGNoKGxhYmVscywgdGFyZ2V0U3RhdGUpIDo6PSA8PAorY2FzZSA8bGFiZWxzOntpdCB8IDxpdD59OyBzZXBhcmF0b3I9IiB8ICI+ID0+CisgICAgeworICAgIDx0YXJnZXRTdGF0ZT4KKyAgICB9Cis+PgorCisvLyBDIHkgYyBsIGkgYyAgRCBGIEEKKworLyoqIFRoZSBjb2RlIHRvIGluaXRpYXRlIGV4ZWN1dGlvbiBvZiBhIGN5Y2xpYyBERkE7IHRoaXMgaXMgdXNlZAorICogIGluIHRoZSBydWxlIHRvIHByZWRpY3QgYW4gYWx0IGp1c3QgbGlrZSB0aGUgZml4ZWQgREZBIGNhc2UuCisgKiAgVGhlIDxuYW1lPiBhdHRyaWJ1dGUgaXMgaW5oZXJpdGVkIHZpYSB0aGUgcGFyc2VyLCBsZXhlciwgLi4uCisgKi8KK2RmYURlY2lzaW9uKGRlY2lzaW9uTnVtYmVyLGRlc2NyaXB0aW9uKSA6Oj0gPDwKK2FsdDxkZWNpc2lvbk51bWJlcj4gPSBkZmE8ZGVjaXNpb25OdW1iZXI+LnByZWRpY3QoaW5wdXQpCis+PgorCisvKiBEdW1wIERGQSB0YWJsZXMgYXMgcnVuLWxlbmd0aC1lbmNvZGVkIFN0cmluZ3Mgb2Ygb2N0YWwgdmFsdWVzLgorICogQ2FuJ3QgdXNlIGhleCBhcyBjb21waWxlciB0cmFuc2xhdGVzIHRoZW0gYmVmb3JlIGNvbXBpbGF0aW9uLgorICogVGhlc2Ugc3RyaW5ncyBhcmUgc3BsaXQgaW50byBtdWx0aXBsZSwgY29uY2F0ZW5hdGVkIHN0cmluZ3MuCisgKiBKYXZhIHB1dHMgdGhlbSBiYWNrIHRvZ2V0aGVyIGF0IGNvbXBpbGUgdGltZSB0aGFua2Z1bGx5LgorICogSmF2YSBjYW5ub3QgaGFuZGxlIGxhcmdlIHN0YXRpYyBhcnJheXMsIHNvIHdlJ3JlIHN0dWNrIHdpdGggdGhpcworICogZW5jb2RlL2RlY29kZSBhcHByb2FjaC4gIFNlZSBhbmFseXNpcyBhbmQgcnVudGltZSBERkEgZm9yCisgKiB0aGUgZW5jb2RpbmcgbWV0aG9kcy4KKyAqLworY3ljbGljREZBKGRmYSkgOjo9IDw8Cit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90UyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRFT1Q7IHdyYXA9IlwiK1xuICAgIFwiIj4iCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW9mUyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRFT0Y7IHdyYXA9IlwiK1xuICAgIFwiIj4iCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluUyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRNaW47IHdyYXA9IlwiK1xuICAgIFwiIj4iCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4UyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRNYXg7IHdyYXA9IlwiK1xuICAgIFwiIj4iCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0UyA9CisgICAgIjxkZmEuamF2YUNvbXByZXNzZWRBY2NlcHQ7IHdyYXA9IlwiK1xuICAgIFwiIj4iCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fc3BlY2lhbFMgPQorICAgICI8ZGZhLmphdmFDb21wcmVzc2VkU3BlY2lhbDsgd3JhcD0iXCIrXG4gICAgXCIiPn0+IgordmFsIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TOiBBcnJheVtTdHJpbmddID0gQXJyYXkoCisgICAgICAgIDxkZmEuamF2YUNvbXByZXNzZWRUcmFuc2l0aW9uOntzfCI8czsgd3JhcD0iXCIrXG5cIiI+In07IHNlcGFyYXRvcj0iLFxuIj4KKykKKwordmFsIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvdDogQXJyYXlbU2hvcnRdID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fZW90UykKK3ZhbCBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9lb2Y6IEFycmF5W1Nob3J0XSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZlMpCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWluOiBBcnJheVtDaGFyXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21pblMpCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fbWF4OiBBcnJheVtDaGFyXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heFMpCit2YWwgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fYWNjZXB0OiBBcnJheVtTaG9ydF0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9hY2NlcHRTKQordmFsIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWw6IEFycmF5W1Nob3J0XSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3NwZWNpYWxTKQordmFsIERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb24gPSBuZXcgQXJyYXlbQXJyYXlbU2hvcnRdXShERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl90cmFuc2l0aW9uUy5sZW5ndGgpCisKK2ZvciAoaSBcPC0gREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbi5pbmRpY2VzKSB7CisgICAgREZBPGRmYS5kZWNpc2lvbk51bWJlcj5fdHJhbnNpdGlvbihpKSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb25TKGkpKQorfQorCitjbGFzcyBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPiBleHRlbmRzIERGQSB7CisKKyAgICBkZWYgdGhpcyhyZWNvZ25pemVyOiBCYXNlUmVjb2duaXplcikgPSB7CisgICAgICAgIHRoaXMoKQorICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyCisgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSA8ZGZhLmRlY2lzaW9uTnVtYmVyPgorICAgICAgICB0aGlzLmVvdCA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvdAorICAgICAgICB0aGlzLmVvZiA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2VvZgorICAgICAgICB0aGlzLm1pbiA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21pbgorICAgICAgICB0aGlzLm1heCA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X21heAorICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X2FjY2VwdAorICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkE8ZGZhLmRlY2lzaW9uTnVtYmVyPl9zcGVjaWFsCisgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTxkZmEuZGVjaXNpb25OdW1iZXI+X3RyYW5zaXRpb24KKyAgICB9CisgICAgb3ZlcnJpZGUgZGVmIGdldERlc2NyaXB0aW9uID0gIjxkZmEuZGVzY3JpcHRpb24+IgorICAgIDxAZXJyb3JNZXRob2QoKT4KKzxpZihkZmEuc3BlY2lhbFN0YXRlU1RzKT4KKyAgICBAdGhyb3dzKGNsYXNzT2ZbTm9WaWFibGVBbHRFeGNlcHRpb25dKQorICAgIG92ZXJyaWRlIGRlZiBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKHM6IEludCwgX2lucHV0OiBJbnRTdHJlYW0pOkludCA9IHsKKyAgICAgICAgPGlmKExFWEVSKT4KKyAgICAgICAgdmFsIGlucHV0ID0gX2lucHV0CisgICAgICAgIDxlbmRpZj4KKyAgICAgICAgPGlmKFBBUlNFUik+CisgICAgICAgIHZhbCBpbnB1dCA9IF9pbnB1dC5hc0luc3RhbmNlT2ZbVG9rZW5TdHJlYW1dCisgICAgICAgIDxlbmRpZj4KKyAgICAgICAgPGlmKFRSRUVfUEFSU0VSKT4KKyAgICAgICAgdmFsIGlucHV0ID0gX2lucHV0LmFzSW5zdGFuY2VPZltUcmVlTm9kZVN0cmVhbV0KKyAgICAgICAgPGVuZGlmPgorICAgIAl2YWwgX3MgPSBzCisgICAgICAgIHMgbWF0Y2ggeworICAgICAgICA8ZGZhLnNwZWNpYWxTdGF0ZVNUczp7c3RhdGUgfAorICAgICAgICBjYXNlIDxpMD4gPT4gPCEgY29tcHJlc3NlZCBzcGVjaWFsIHN0YXRlIG51bWJlcnMgMC4ubi0xICE+CisgICAgICAgICAgICA8c3RhdGU+fTsgc2VwYXJhdG9yPSJcbiI+CisgICAgICAgIGNhc2UgXyA9PgorICAgICAgICB9Cis8aWYoYmFja3RyYWNraW5nKT4KKyAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiAtMX08XG4+Cis8ZW5kaWY+CisgICAgICAgIHZhbCBudmFlID0gbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDxkZmEuZGVjaXNpb25OdW1iZXI+LCBfcywgaW5wdXQpCisgICAgICAgIGVycm9yKG52YWUpCisgICAgICAgIHRocm93IG52YWUKKyAgICB9PFxuPgorPGVuZGlmPgorfTxcbj4KKz4+CisKKy8qKiBBIHN0YXRlIGluIGEgY3ljbGljIERGQTsgaXQncyBhIHNwZWNpYWwgc3RhdGUgYW5kIHBhcnQgb2YgYSBiaWcgc3dpdGNoIG9uCisgKiAgc3RhdGUuCisgKi8KK2N5Y2xpY0RGQVN0YXRlKGRlY2lzaW9uTnVtYmVyLHN0YXRlTnVtYmVyLGVkZ2VzLG5lZWRFcnJvckNsYXVzZSxzZW1QcmVkU3RhdGUpIDo6PSA8PAordmFsIExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+OiBJbnQgPSBpbnB1dC5MQSgxKTxcbj4KKzxpZihzZW1QcmVkU3RhdGUpPiA8ISBnZXQgbmV4dCBsb29rYWhlYWQgc3ltYm9sIHRvIHRlc3QgZWRnZXMsIHRoZW4gcmV3aW5kICE+Cit2YWwgaW5kZXg8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj46IEludCA9IGlucHV0LmluZGV4KCkKK2lucHV0LnJld2luZCgpPFxuPgorPGVuZGlmPgorcyA9IC0xCis8ZWRnZXM7IHNlcGFyYXRvcj0iXG5lbHNlICI+Cis8aWYoc2VtUHJlZFN0YXRlKT4gPCEgcmV0dXJuIGlucHV0IGN1cnNvciB0byBzdGF0ZSBiZWZvcmUgd2UgcmV3b3VuZCAhPgoraW5wdXQuc2VlayhpbmRleDxkZWNpc2lvbk51bWJlcj5fPHN0YXRlTnVtYmVyPik8XG4+Cis8ZW5kaWY+CitpZiAoIHM+PTAgKSByZXR1cm4gcworPj4KKworLyoqIEp1c3QgbGlrZSBhIGZpeGVkIERGQSBlZGdlLCB0ZXN0IHRoZSBsb29rYWhlYWQgYW5kIGluZGljYXRlIHdoYXQKKyAqICBzdGF0ZSB0byBqdW1wIHRvIG5leHQgaWYgc3VjY2Vzc2Z1bC4KKyAqLworY3ljbGljREZBRWRnZShsYWJlbEV4cHIsIHRhcmdldFN0YXRlTnVtYmVyLCBlZGdlTnVtYmVyLCBwcmVkaWNhdGVzKSA6Oj0gPDwKK2lmICggKDxsYWJlbEV4cHI+KSA8aWYocHJlZGljYXRlcyk+JiYgKDxwcmVkaWNhdGVzPik8ZW5kaWY+KSB7cyA9IDx0YXJnZXRTdGF0ZU51bWJlcj59PFxuPgorPj4KKworLyoqIEFuIGVkZ2UgcG9pbnRpbmcgYXQgZW5kLW9mLXRva2VuOyBlc3NlbnRpYWxseSBtYXRjaGVzIGFueSBjaGFyOworICogIGFsd2F5cyBqdW1wIHRvIHRoZSB0YXJnZXQuCisgKi8KK2VvdERGQUVkZ2UodGFyZ2V0U3RhdGVOdW1iZXIsZWRnZU51bWJlciwgcHJlZGljYXRlcykgOjo9IDw8CitzID0gPHRhcmdldFN0YXRlTnVtYmVyPjxcbj4KKz4+CisKKworLy8gRCBGIEEgIEUgWCBQIFIgRSBTIFMgSSBPIE4gUworCithbmRQcmVkaWNhdGVzKGxlZnQscmlnaHQpIDo6PSAiKDxsZWZ0PiYmPHJpZ2h0PikiCisKK29yUHJlZGljYXRlcyhvcGVyYW5kcykgOjo9ICIoPGZpcnN0KG9wZXJhbmRzKT48cmVzdChvcGVyYW5kcyk6e28gfCB8fDxvPn0+KSIKKworbm90UHJlZGljYXRlKHByZWQpIDo6PSAiISg8ZXZhbFByZWRpY2F0ZShwcmVkLFwiXCIpPikiCisKK2V2YWxQcmVkaWNhdGUocHJlZCxkZXNjcmlwdGlvbikgOjo9ICIoPHByZWQ+KSIKKworZXZhbFN5blByZWRpY2F0ZShwcmVkLGRlc2NyaXB0aW9uKSA6Oj0gIjxwcmVkPigpIgorCitsb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj49PTxhdG9tPiIKKworLyoqIFNvbWV0aW1lcyBhIGxvb2thaGVhZCB0ZXN0IGNhbm5vdCBhc3N1bWUgdGhhdCBMQShrKSBpcyBpbiBhIHRlbXAgdmFyaWFibGUKKyAqICBzb21ld2hlcmUuICBNdXN0IGFzayBmb3IgdGhlIGxvb2thaGVhZCBkaXJlY3RseS4KKyAqLworaXNvbGF0ZWRMb29rYWhlYWRUZXN0KGF0b20sayxhdG9tQXNJbnQpIDo6PSAiaW5wdXQuTEEoPGs+KT09PGF0b20+IgorCitsb29rYWhlYWRSYW5nZVRlc3QobG93ZXIsdXBwZXIsayxyYW5nZU51bWJlcixsb3dlckFzSW50LHVwcGVyQXNJbnQpIDo6PSA8PAorKExBPGRlY2lzaW9uTnVtYmVyPl88c3RhdGVOdW1iZXI+ID49IDxsb3dlcj4gJiYgTEE8ZGVjaXNpb25OdW1iZXI+XzxzdGF0ZU51bWJlcj4gXDw9IDx1cHBlcj4pCis+PgorCitpc29sYXRlZExvb2thaGVhZFJhbmdlVGVzdChsb3dlcix1cHBlcixrLHJhbmdlTnVtYmVyLGxvd2VyQXNJbnQsdXBwZXJBc0ludCkgOjo9ICIoaW5wdXQuTEEoPGs+KSA+PTxsb3dlcj4gJiYgaW5wdXQuTEEoPGs+KSBcPD0gPHVwcGVyPikiCisKK3NldFRlc3QocmFuZ2VzKSA6Oj0gIjxyYW5nZXM7IHNlcGFyYXRvcj1cInx8XCI+IgorCisvLyBBIFQgVCBSIEkgQiBVIFQgRSBTCisKK2dsb2JhbEF0dHJpYnV0ZVNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihzY29wZS5hdHRyaWJ1dGVzKT4KK2NsYXNzIDxzY29wZS5uYW1lPl9zY29wZSB7CisgICAgPHNjb3BlLmF0dHJpYnV0ZXM6e2l0IHwgdmFyIDxpdC5uYW1lPjogPGl0LnR5cGU+ID0gX307IHNlcGFyYXRvcj0iXG4iPgorfQordmFsIDxzY29wZS5uYW1lPl9zdGFjayA9IG5ldyBjb2xsZWN0aW9uLm11dGFibGUuU3RhY2tbPHNjb3BlLm5hbWU+X3Njb3BlXTxcbj4KKzxlbmRpZj4KKz4+CisKK3J1bGVBdHRyaWJ1dGVTY29wZShzY29wZSkgOjo9IDw8Cis8aWYoc2NvcGUuYXR0cmlidXRlcyk+CitjbGFzcyA8c2NvcGUubmFtZT5fc2NvcGUgeworICAgIDxzY29wZS5hdHRyaWJ1dGVzOntpdCB8IHZhciA8aXQubmFtZT46IDxpdC50eXBlPiA9IF99OyBzZXBhcmF0b3I9IlxuIj4KK30KK3ZhbCA8c2NvcGUubmFtZT5fc3RhY2sgPSBuZXcgY29sbGVjdGlvbi5tdXRhYmxlLlN0YWNrWzxzY29wZS5uYW1lPl9zY29wZV08XG4+Cis8ZW5kaWY+Cis+PgorCityZXR1cm5TdHJ1Y3ROYW1lKHIpIDo6PSAiPHIubmFtZT5fcmV0dXJuIgorCityZXR1cm5UeXBlKCkgOjo9IDw8Cis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorPHJ1bGVEZXNjcmlwdG9yOnJldHVyblN0cnVjdE5hbWUoKT4KKzxlbHNlPgorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxydWxlRGVzY3JpcHRvci5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK1VuaXQKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKKy8qKiBHZW5lcmF0ZSB0aGUgSmF2YSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBvciBtdWx0aXBsZSByZXR1cm4KKyAqICB2YWx1ZXMuCisgKi8KK3J1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGUpIDo6PSA8PAorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KKzxyZWZlcmVuY2VkUnVsZS5uYW1lPl9yZXR1cm4KKzxlbHNlPgorPGlmKHJlZmVyZW5jZWRSdWxlLmhhc1NpbmdsZVJldHVyblZhbHVlKT4KKzxyZWZlcmVuY2VkUnVsZS5zaW5nbGVWYWx1ZVJldHVyblR5cGU+Cis8ZWxzZT4KK1VuaXQKKzxlbmRpZj4KKzxlbmRpZj4KKz4+CisKK2RlbGVnYXRlTmFtZShkKSA6Oj0gPDwKKzxpZihkLmxhYmVsKT48ZC5sYWJlbD48ZWxzZT5nPGQubmFtZT48ZW5kaWY+Cis+PgorCisvKiogVXNpbmcgYSB0eXBlIHRvIGluaXQgdmFsdWUgbWFwLCB0cnkgdG8gaW5pdCBhIHR5cGU7IGlmIG5vdCBpbiB0YWJsZQorICogIG11c3QgYmUgYW4gb2JqZWN0LCBkZWZhdWx0IHZhbHVlIGlzICJudWxsIi4KKyAqLworaW5pdFZhbHVlKHR5cGVOYW1lKSA6Oj0gPDwKKzxzY2FsYVR5cGVJbml0TWFwLih0eXBlTmFtZSk+Cis+PgorCisvKiogRGVmaW5lIGEgcnVsZSBsYWJlbCBpbmNsdWRpbmcgZGVmYXVsdCB2YWx1ZSAqLworcnVsZUxhYmVsRGVmKGxhYmVsKSA6Oj0gPDwKK3ZhciA8bGFiZWwubGFiZWwudGV4dD46IDxydWxlTGFiZWxUeXBlKHJlZmVyZW5jZWRSdWxlPWxhYmVsLnJlZmVyZW5jZWRSdWxlKT4gPSA8aW5pdFZhbHVlKHR5cGVOYW1lPXJ1bGVMYWJlbFR5cGUocmVmZXJlbmNlZFJ1bGU9bGFiZWwucmVmZXJlbmNlZFJ1bGUpKT48XG4+Cis+PgorCisvKiogRGVmaW5lIGEgcmV0dXJuIHN0cnVjdCBmb3IgYSBydWxlIGlmIHRoZSBjb2RlIG5lZWRzIHRvIGFjY2VzcyBpdHMKKyAqICBzdGFydC9zdG9wIHRva2VucywgdHJlZSBzdHVmZiwgYXR0cmlidXRlcywgLi4uICBMZWF2ZSBhIGhvbGUgZm9yCisgKiAgc3ViZ3JvdXBzIHRvIHN0aWNrIGluIG1lbWJlcnMuCisgKiAgVE9ETyhtYXR0aGV3bGxveWQpOiBtYWtlIHRoaXMgc3RhdGljCisgKi8KK3JldHVyblNjb3BlKHNjb3BlKSA6Oj0gPDwKKzxpZihydWxlRGVzY3JpcHRvci5oYXNNdWx0aXBsZVJldHVyblZhbHVlcyk+CitmaW5hbCBjbGFzcyA8cnVsZURlc2NyaXB0b3I6cmV0dXJuU3RydWN0TmFtZSgpPiBleHRlbmRzIDxpZihUUkVFX1BBUlNFUik+VHJlZTxlbHNlPlBhcnNlcjxlbmRpZj5SdWxlUmV0dXJuU2NvcGUgeworICAgIDxzY29wZS5hdHRyaWJ1dGVzOntpdCB8IHZhciA8aXQubmFtZT46IDxpdC50eXBlPiA9IF99OyBzZXBhcmF0b3I9IlxuIj4KKyAgICA8QHJ1bGVSZXR1cm5NZW1iZXJzKCk+Cit9Cis8ZW5kaWY+Cis+PgorCitwYXJhbWV0ZXJTY29wZShzY29wZSkgOjo9IDw8Cis8c2NvcGUuYXR0cmlidXRlczp7aXQgfCA8aXQubmFtZT46IDxpdC50eXBlPn07IHNlcGFyYXRvcj0iLCAiPgorPj4KKworcGFyYW1ldGVyQXR0cmlidXRlUmVmKGF0dHIpIDo6PSAiPGF0dHIubmFtZT4iCitwYXJhbWV0ZXJTZXRBdHRyaWJ1dGVSZWYoYXR0cixleHByKSA6Oj0gIjxhdHRyLm5hbWU+ID08ZXhwcj4iCisKK3Njb3BlQXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsaW5kZXgsbmVnSW5kZXgpIDo6PSA8JQorPGlmKG5lZ0luZGV4KT4KKzxzY29wZT5fc3RhY2soPHNjb3BlPl9zdGFjay5zaXplLTxuZWdJbmRleD4tMSkuPGF0dHIubmFtZT4KKzxlbHNlPgorPGlmKGluZGV4KT4KKzxzY29wZT5fc3RhY2soPGluZGV4PikuPGF0dHIubmFtZT4KKzxlbHNlPgorPHNjb3BlPl9zdGFjay50b3AuPGF0dHIubmFtZT4KKzxlbmRpZj4KKzxlbmRpZj4KKyU+CisKK3Njb3BlU2V0QXR0cmlidXRlUmVmKHNjb3BlLGF0dHIsZXhwcixpbmRleCxuZWdJbmRleCkgOjo9IDwlCis8aWYobmVnSW5kZXgpPgorPHNjb3BlPl9zdGFjayg8c2NvcGU+X3N0YWNrLnNpemUtPG5lZ0luZGV4Pi0xKS48YXR0ci5uYW1lPiA9IDxleHByPgorPGVsc2U+Cis8aWYoaW5kZXgpPgorPHNjb3BlPl9zdGFjayg8aW5kZXg+KS48YXR0ci5uYW1lPiA9IDxleHByPgorPGVsc2U+Cis8c2NvcGU+X3N0YWNrLnRvcC48YXR0ci5uYW1lPiA9IDxleHByPgorPGVuZGlmPgorPGVuZGlmPgorJT4KKworLyoqICR4IGlzIGVpdGhlciBnbG9iYWwgc2NvcGUgb3IgeCBpcyBydWxlIHdpdGggZHluYW1pYyBzY29wZTsgcmVmZXJzCisgKiAgdG8gc3RhY2sgaXRzZWxmIG5vdCB0b3Agb2Ygc3RhY2suICBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJlZGljYXRlcworICogIGxpa2UgeyRmdW5jdGlvbi5zaXplKCk+MCAmJiAkZnVuY3Rpb246Om5hbWUuZXF1YWxzKCJmb28iKX0/CisgKi8KK2lzb2xhdGVkRHluYW1pY1Njb3BlUmVmKHNjb3BlKSA6Oj0gIjxzY29wZT5fc3RhY2siCisKKy8qKiByZWZlcmVuY2UgYW4gYXR0cmlidXRlIG9mIHJ1bGU7IG1pZ2h0IG9ubHkgaGF2ZSBzaW5nbGUgcmV0dXJuIHZhbHVlICovCitydWxlTGFiZWxSZWYocmVmZXJlbmNlZFJ1bGUsc2NvcGUsYXR0cikgOjo9IDwlCis8aWYocmVmZXJlbmNlZFJ1bGUuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LjxhdHRyLm5hbWU+IGVsc2UgPGluaXRWYWx1ZShhdHRyLnR5cGUpPikKKzxlbHNlPgorPHNjb3BlPgorPGVuZGlmPgorJT4KKworcmV0dXJuQXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIpIDo6PSA8JQorPGlmKHJ1bGVEZXNjcmlwdG9yLmhhc011bHRpcGxlUmV0dXJuVmFsdWVzKT4KK3JldHZhbC48YXR0ci5uYW1lPgorPGVsc2U+Cis8YXR0ci5uYW1lPgorPGVuZGlmPgorJT4KKworcmV0dXJuU2V0QXR0cmlidXRlUmVmKHJ1bGVEZXNjcmlwdG9yLGF0dHIsZXhwcikgOjo9IDwlCis8aWYocnVsZURlc2NyaXB0b3IuaGFzTXVsdGlwbGVSZXR1cm5WYWx1ZXMpPgorcmV0dmFsLjxhdHRyLm5hbWU+ID08ZXhwcj4KKzxlbHNlPgorPGF0dHIubmFtZT4gPTxleHByPgorPGVuZGlmPgorJT4KKworLyoqIEhvdyB0byB0cmFuc2xhdGUgJHRva2VuTGFiZWwgKi8KK3Rva2VuTGFiZWxSZWYobGFiZWwpIDo6PSAiPGxhYmVsPiIKKworLyoqIGlkcys9SUQgeyRpZHN9IG9yIGUrPWV4cHIgeyRlfSAqLworbGlzdExhYmVsUmVmKGxhYmVsKSA6Oj0gImxpc3RfPGxhYmVsPiIKKworCisvLyBub3Qgc3VyZSB0aGUgbmV4dCBhcmUgdGhlIHJpZ2h0IGFwcHJvYWNoCisKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl90ZXh0KHNjb3BlLGF0dHIpIDo6PSAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LmdldFRleHQoKSBlbHNlIG51bGwpIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uZ2V0VHlwZSgpIGVsc2UgMCkiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfbGluZShzY29wZSxhdHRyKSA6Oj0gIihpZiAoPHNjb3BlPiE9bnVsbCkgPHNjb3BlPi5nZXRMaW5lKCkgZWxzZSAwKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9wb3Moc2NvcGUsYXR0cikgOjo9ICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkgZWxzZSAwKSIKK3Rva2VuTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PSAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LmdldENoYW5uZWwoKSBlbHNlIDApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PSAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LmdldFRva2VuSW5kZXgoKSBlbHNlIDApIgordG9rZW5MYWJlbFByb3BlcnR5UmVmX3RyZWUoc2NvcGUsYXR0cikgOjo9ICI8c2NvcGU+X3RyZWUiCit0b2tlbkxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PSAiKGlmICg8c2NvcGU+IT1udWxsKSBJbnRlZ2VyLnZhbHVlT2YoPHNjb3BlPi5nZXRUZXh0KCkpIGVsc2UgMCkiCisKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LnN0YXJ0LmFzSW5zdGFuY2VPZls8bGFiZWxUeXBlPl0gZWxzZSBudWxsKSIKK3J1bGVMYWJlbFByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uc3RvcC5hc0luc3RhbmNlT2ZbPGxhYmVsVHlwZT5dIGVsc2UgbnVsbCkiCitydWxlTGFiZWxQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LnRyZWUuYXNJbnN0YW5jZU9mWzxBU1RMYWJlbFR5cGU+XSBlbHNlIG51bGwpIgorcnVsZUxhYmVsUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gPDwKKzxpZihUUkVFX1BBUlNFUik+CisoaWYgKDxzY29wZT4hPW51bGwpIChpbnB1dC5nZXRUb2tlblN0cmVhbSgpLnRvU3RyaW5nKAorICBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFRva2VuU3RhcnRJbmRleCg8c2NvcGU+LnN0YXJ0KSwKKyAgaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0b3BJbmRleCg8c2NvcGU+LnN0YXJ0KSkpIGVsc2UgbnVsbCkKKzxlbHNlPgorKGlmICg8c2NvcGU+IT1udWxsKSBpbnB1dC50b1N0cmluZyg8c2NvcGU+LnN0YXJ0LDxzY29wZT4uc3RvcCkgZWxzZSBudWxsKQorPGVuZGlmPgorPj4KKworcnVsZUxhYmVsUHJvcGVydHlSZWZfc3Qoc2NvcGUsYXR0cikgOjo9ICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uc3QgZWxzZSBudWxsKSIKKworLyoqIElzb2xhdGVkICRSVUxFIHJlZiBvayBpbiBsZXhlciBhcyBpdCdzIGEgVG9rZW4gKi8KK2xleGVyUnVsZUxhYmVsKGxhYmVsKSA6Oj0gIjxsYWJlbD4iCisKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfdHlwZShzY29wZSxhdHRyKSA6Oj0KKyAgICAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LmdldFR5cGUoKSBlbHNlIDApIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9saW5lKHNjb3BlLGF0dHIpIDo6PQorICAgICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uZ2V0TGluZSgpIGVsc2UgMCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0KKyAgICAiKGlmICg8c2NvcGU+IT1udWxsKSA8c2NvcGU+LmdldENoYXJQb3NpdGlvbkluTGluZSgpIGVsc2UgLTEpIgorbGV4ZXJSdWxlTGFiZWxQcm9wZXJ0eVJlZl9jaGFubmVsKHNjb3BlLGF0dHIpIDo6PQorICAgICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uZ2V0Q2hhbm5lbCgpIGVsc2UgMCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX2luZGV4KHNjb3BlLGF0dHIpIDo6PQorICAgICIoaWYgKDxzY29wZT4hPW51bGwpIDxzY29wZT4uZ2V0VG9rZW5JbmRleCgpIGVsc2UgMCkiCitsZXhlclJ1bGVMYWJlbFByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9CisgICAgIihpZiAoPHNjb3BlPiE9bnVsbCkgPHNjb3BlPi5nZXRUZXh0KCkgZWxzZSBudWxsKSIKK2xleGVyUnVsZUxhYmVsUHJvcGVydHlSZWZfaW50KHNjb3BlLGF0dHIpIDo6PQorICAgICIoaWYgKDxzY29wZT4hPW51bGwpIEludGVnZXIudmFsdWVPZig8c2NvcGU+LmdldFRleHQoKSkgZWxzZSAwKSIKKworLy8gU29tZWJvZHkgbWF5IHJlZiAkdGVtcGxhdGUgb3IgJHRyZWUgb3IgJHN0b3Agd2l0aGluIGEgcnVsZToKK3J1bGVQcm9wZXJ0eVJlZl9zdGFydChzY29wZSxhdHRyKSA6Oj0gIihyZXR2YWwuc3RhcnQuYXNJbnN0YW5jZU9mWzxsYWJlbFR5cGU+XSkiCitydWxlUHJvcGVydHlSZWZfc3RvcChzY29wZSxhdHRyKSA6Oj0gIihyZXR2YWwuc3RvcC5hc0luc3RhbmNlT2ZbPGxhYmVsVHlwZT5dKSIKK3J1bGVQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIpIDo6PSAiKHJldHZhbC50cmVlLmFzSW5zdGFuY2VPZls8QVNUTGFiZWxUeXBlPl0pIgorcnVsZVByb3BlcnR5UmVmX3RleHQoc2NvcGUsYXR0cikgOjo9IDw8Cis8aWYoVFJFRV9QQVJTRVIpPgoraW5wdXQuZ2V0VG9rZW5TdHJlYW0oKS50b1N0cmluZygKKyAgaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0YXJ0SW5kZXgocmV0dmFsLnN0YXJ0KSwKKyAgaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0b3BJbmRleChyZXR2YWwuc3RhcnQpKQorPGVsc2U+CitpbnB1dC50b1N0cmluZyhyZXR2YWwuc3RhcnQsaW5wdXQuTFQoLTEpKQorPGVuZGlmPgorPj4KK3J1bGVQcm9wZXJ0eVJlZl9zdChzY29wZSxhdHRyKSA6Oj0gInJldHZhbC5zdCIKKworbGV4ZXJSdWxlUHJvcGVydHlSZWZfdGV4dChzY29wZSxhdHRyKSA6Oj0gImdldFRleHQoKSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3R5cGUoc2NvcGUsYXR0cikgOjo9ICJfdHlwZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2xpbmUoc2NvcGUsYXR0cikgOjo9ICJzdGF0ZS50b2tlblN0YXJ0TGluZSIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3BvcyhzY29wZSxhdHRyKSA6Oj0gInN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbmRleChzY29wZSxhdHRyKSA6Oj0gIi0xIiAvLyB1bmRlZmluZWQgdG9rZW4gaW5kZXggaW4gbGV4ZXIKK2xleGVyUnVsZVByb3BlcnR5UmVmX2NoYW5uZWwoc2NvcGUsYXR0cikgOjo9ICJfY2hhbm5lbCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0YXJ0KHNjb3BlLGF0dHIpIDo6PSAic3RhdGUudG9rZW5TdGFydENoYXJJbmRleCIKK2xleGVyUnVsZVByb3BlcnR5UmVmX3N0b3Aoc2NvcGUsYXR0cikgOjo9ICIoZ2V0Q2hhckluZGV4KCktMSkiCitsZXhlclJ1bGVQcm9wZXJ0eVJlZl9pbnQoc2NvcGUsYXR0cikgOjo9ICJJbnRlZ2VyLnZhbHVlT2YoPHNjb3BlPi5nZXRUZXh0KCkpIgorCisvLyBzZXR0aW5nICRzdCBhbmQgJHRyZWUgaXMgYWxsb3dlZCBpbiBsb2NhbCBydWxlLiBldmVyeXRoaW5nIGVsc2UKKy8vIGlzIGZsYWdnZWQgYXMgZXJyb3IKK3J1bGVTZXRQcm9wZXJ0eVJlZl90cmVlKHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwudHJlZSA9PGV4cHI+IgorcnVsZVNldFByb3BlcnR5UmVmX3N0KHNjb3BlLGF0dHIsZXhwcikgOjo9ICJyZXR2YWwuc3QgPTxleHByPiIKKworLyoqIEhvdyB0byBleGVjdXRlIGFuIGFjdGlvbiAob25seSB3aGVuIG5vdCBiYWNrdHJhY2tpbmcpICovCitleGVjQWN0aW9uKGFjdGlvbikgOjo9IDw8Cis8aWYoYmFja3RyYWNraW5nKT4KK2lmICggPGFjdGlvbnMuKGFjdGlvblNjb3BlKS5zeW5wcmVkZ2F0ZT4gKSB7CisgIDxhY3Rpb24+Cit9Cis8ZWxzZT4KKzxhY3Rpb24+Cis8ZW5kaWY+Cis+PgorCisvKiogSG93IHRvIGFsd2F5cyBleGVjdXRlIGFuIGFjdGlvbiBldmVuIHdoZW4gYmFja3RyYWNraW5nICovCitleGVjRm9yY2VkQWN0aW9uKGFjdGlvbikgOjo9ICI8YWN0aW9uPiIKKworLy8gTSBJIFMgQyAocHJvcGVydGllcywgZXRjLi4uKQorCitiaXRzZXQobmFtZSwgd29yZHM2NCkgOjo9IDw8Cit2YWwgPG5hbWU+ID0gbmV3IEJpdFNldChBcnJheVtMb25nXSg8d29yZHM2NDp7aXQgfCA8aXQ+TH07c2VwYXJhdG9yPSIsIj4pKTxcbj4KKz4+CisKK2NvZGVGaWxlRXh0ZW5zaW9uKCkgOjo9ICIuc2NhbGEiCisKK3RydWVfdmFsdWUoKSA6Oj0gInRydWUiCitmYWxzZV92YWx1ZSgpIDo6PSAiZmFsc2UiCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RlcGVuZC5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RlcGVuZC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5MzA1NAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZGVwZW5kLnN0ZwpAQCAtMCwwICsxLDEyIEBACisvKiogdGVtcGxhdGVzIHVzZWQgdG8gZ2VuZXJhdGUgbWFrZS1jb21wYXRpYmxlIGRlcGVuZGVuY2llcyAqLworZ3JvdXAgZGVwZW5kOworCisvKiogR2VuZXJhdGUgImYgOiB4LCB5LCB6IiBkZXBlbmRlbmNpZXMgZm9yIGlucHV0CisgKiAgZGVwZW5kZW5jaWVzIGFuZCBnZW5lcmF0ZWQgZmlsZXMuIGluIGFuZCBvdXQKKyAqICBhcmUgRmlsZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gc2F5CisgKiAgPGYuY2Fub25pY2FsUGF0aD4KKyAqLworZGVwZW5kZW5jaWVzKGdyYW1tYXJGaWxlTmFtZSxpbixvdXQpIDo6PSA8PAorPGlmKGluKT48Z3JhbW1hckZpbGVOYW1lPjogPGluOyBzZXBhcmF0b3I9IiwgIj48ZW5kaWY+Cis8b3V0OntmIHwgPGY+IDogPGdyYW1tYXJGaWxlTmFtZT59OyBzZXBhcmF0b3I9IlxuIj4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9hY3Rpb24tZWRnZS5zdCBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2FjdGlvbi1lZGdlLnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjhlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9hY3Rpb24tZWRnZS5zdApAQCAtMCwwICsxIEBACis8c3JjPiAtPiA8dGFyZ2V0PiBbZm9udHNpemU9MTEsIGZvbnRuYW1lPSJDb3VyaWVyIiwgYXJyb3dzaXplPS43LCBsYWJlbCA9ICI8bGFiZWw+IjxpZihhcnJvd2hlYWQpPiwgYXJyb3doZWFkID0gPGFycm93aGVhZD48ZW5kaWY+XTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2RlY2lzaW9uLXJhbmsuc3QgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9kZWNpc2lvbi1yYW5rLnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTQyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9kZWNpc2lvbi1yYW5rLnN0CkBAIC0wLDAgKzEgQEAKK3tyYW5rPXNhbWU7IHJhbmtkaXI9VEI7IDxzdGF0ZXM7IHNlcGFyYXRvcj0iOyAiPn0KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2RmYS5zdCBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2RmYS5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjgxZTcwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvZGZhLnN0CkBAIC0wLDAgKzEsNyBAQAorZGlncmFwaCBORkEgeworPGlmKHJhbmtkaXIpPnJhbmtkaXI9PHJhbmtkaXI+OzxlbmRpZj4KKzxkZWNpc2lvblJhbmtzOyBzZXBhcmF0b3I9IlxuIj4KKzxzdGF0ZXM7IHNlcGFyYXRvcj0iXG4iPgorPGVkZ2VzOyBzZXBhcmF0b3I9IlxuIj4KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvZG90LnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2RvdC5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5ODFkYwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2RvdC5zdGcKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udmVyc2lvbiB0byBDIzoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW0gSGFyd2VsbCwgVHVubmVsIFZpc2lvbiBMYWJvcmF0b3JpZXMsIExMQy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitkZmEoZGVjaXNpb25SYW5rcyxzdGF0ZXMsZWRnZXMscmFua2RpcixzdGFydFN0YXRlLHVzZUJveCkgOjo9IDw8CitkaWdyYXBoIE5GQSB7Cis8aWYocmFua2Rpcik+cmFua2Rpcj08cmFua2Rpcj47PGVuZGlmPgorPGRlY2lzaW9uUmFua3M7IHNlcGFyYXRvcj0iXG4iPgorPHN0YXRlczsgc2VwYXJhdG9yPSJcbiI+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorfQorPj4KKworbmZhKGRlY2lzaW9uUmFua3Msc3RhdGVzLGVkZ2VzLHJhbmtkaXIsc3RhcnRTdGF0ZSkgOjo9IDw8CitkaWdyYXBoIE5GQSB7CityYW5rZGlyPUxSOworPGRlY2lzaW9uUmFua3M7IHNlcGFyYXRvcj0iXG4iPgorPHN0YXRlczsgc2VwYXJhdG9yPSJcbiI+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorfQorPj4KKworZGVjaXNpb25fcmFuayhzdGF0ZXMpIDo6PSA8PAore3Jhbms9c2FtZTsgcmFua2Rpcj1UQjsgPHN0YXRlczsgc2VwYXJhdG9yPSI7ICI+fQorPj4KKworZWRnZShzcmMsdGFyZ2V0LGxhYmVsLGFycm93aGVhZCkgOjo9IDw8Cis8c3JjPiAtPiA8dGFyZ2V0PiBbZm9udHNpemU9MTEsIGZvbnRuYW1lPSJDb3VyaWVyIiwgYXJyb3dzaXplPS43LCBsYWJlbCA9ICI8bGFiZWw+IjxpZihhcnJvd2hlYWQpPiwgYXJyb3doZWFkID0gPGFycm93aGVhZD48ZW5kaWY+XTsKKz4+CisKK2FjdGlvbl9lZGdlKHNyYyx0YXJnZXQsbGFiZWwsYXJyb3doZWFkKSA6Oj0gPDwKKzxzcmM+IC0+IDx0YXJnZXQ+IFtmb250c2l6ZT0xMSwgZm9udG5hbWU9IkNvdXJpZXIiLCBhcnJvd3NpemU9LjcsIGxhYmVsID0gIjxsYWJlbD4iPGlmKGFycm93aGVhZCk+LCBhcnJvd2hlYWQgPSA8YXJyb3doZWFkPjxlbmRpZj5dOworPj4KKworZXBzaWxvbl9lZGdlKHNyYyx0YXJnZXQsbGFiZWwsYXJyb3doZWFkKSA6Oj0gPDwKKzxzcmM+IC0+IDx0YXJnZXQ+IFtmb250bmFtZT0iVGltZXMtSXRhbGljIiwgbGFiZWwgPSAiZSJdOworPj4KKworc3RhdGUobmFtZSx1c2VCb3gpIDo6PSA8PAorbm9kZSBbZm9udHNpemU9MTEsIHNoYXBlID0gPGlmKHVzZUJveCk+Ym94PGVsc2U+Y2lyY2xlLCBmaXhlZHNpemU9dHJ1ZSwgd2lkdGg9LjQ8ZW5kaWY+XTsgPG5hbWU+Cis+PgorCitzdG9wc3RhdGUobmFtZSx1c2VCb3gpIDo6PSA8PAorbm9kZSBbZm9udHNpemU9MTEsIHNoYXBlID0gPGlmKHVzZUJveCk+cG9seWdvbixzaWRlcz00LHBlcmlwaGVyaWVzPTI8ZWxzZT5kb3VibGVjaXJjbGUsIGZpeGVkc2l6ZT10cnVlLCB3aWR0aD0uNjxlbmRpZj5dOyA8bmFtZT4KKz4+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9lZGdlLnN0IGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvZWRnZS5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI4ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvZWRnZS5zdApAQCAtMCwwICsxIEBACis8c3JjPiAtPiA8dGFyZ2V0PiBbZm9udHNpemU9MTEsIGZvbnRuYW1lPSJDb3VyaWVyIiwgYXJyb3dzaXplPS43LCBsYWJlbCA9ICI8bGFiZWw+IjxpZihhcnJvd2hlYWQpPiwgYXJyb3doZWFkID0gPGFycm93aGVhZD48ZW5kaWY+XTsKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2Vwc2lsb24tZWRnZS5zdCBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L2Vwc2lsb24tZWRnZS5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ5YjJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvZXBzaWxvbi1lZGdlLnN0CkBAIC0wLDAgKzEgQEAKKzxzcmM+IC0+IDx0YXJnZXQ+IFtmb250bmFtZT0iVGltZXMtSXRhbGljIiwgbGFiZWwgPSAiZSJdOwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvbmZhLnN0IGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3QvbmZhLnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGNlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9uZmEuc3QKQEAgLTAsMCArMSw2IEBACitkaWdyYXBoIE5GQSB7CityYW5rZGlyPUxSOworPGRlY2lzaW9uUmFua3M7IHNlcGFyYXRvcj0iXG4iPgorPHN0YXRlczsgc2VwYXJhdG9yPSJcbiI+Cis8ZWRnZXM7IHNlcGFyYXRvcj0iXG4iPgorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3Qvc3RhdGUuc3QgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9zdGF0ZS5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhlM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9kb3Qvc3RhdGUuc3QKQEAgLTAsMCArMSBAQAorbm9kZSBbZm9udHNpemU9MTEsIHNoYXBlID0gPGlmKHVzZUJveCk+Ym94PGVsc2U+Y2lyY2xlLCBmaXhlZHNpemU9dHJ1ZSwgd2lkdGg9LjQ8ZW5kaWY+XTsgPG5hbWU+CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9zdG9wc3RhdGUuc3QgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL2RvdC9zdG9wc3RhdGUuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyZDQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvZG90L3N0b3BzdGF0ZS5zdApAQCAtMCwwICsxIEBACitub2RlIFtmb250c2l6ZT0xMSwgc2hhcGUgPSA8aWYodXNlQm94KT5wb2x5Z29uLHNpZGVzPTQscGVyaXBoZXJpZXM9MjxlbHNlPmRvdWJsZWNpcmNsZSwgZml4ZWRzaXplPXRydWUsIHdpZHRoPS42PGVuZGlmPl07IDxuYW1lPgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9mb3JtYXRzL2FudGxyLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvZm9ybWF0cy9hbnRsci5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiNDYxMgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvZm9ybWF0cy9hbnRsci5zdGcKQEAgLTAsMCArMSw0MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA2IEtheSBSb2Vwa2UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKy8qCisgTmV3IHN0eWxlIG1lc3NhZ2VzLiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFjdHVhbCBsYXlvdXQgb2YgdGhlIG1lc3NhZ2VzIGVtaXR0ZWQgYnkgQU5UTFIuCisgVGhlIHRleHQgaXRzZWxmIGlzIGNvbWluZyBvdXQgb2YgdGhlIGxhbmd1YWdlcy8qc3RnIGZpbGVzLCBhY2NvcmRpbmcgdG8gdGhlIGNob3NlbiBsb2NhbGUuCisgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGZvcm1hdCBBTlRMUiB1c2VzLgorKi8KKworZ3JvdXAgYW50bHI7CisKK2xvY2F0aW9uKGZpbGUsIGxpbmUsIGNvbHVtbikgOjo9ICI8ZmlsZT46PGxpbmU+Ojxjb2x1bW4+OiIKKworbWVzc2FnZShpZCwgdGV4dCkgOjo9ICIoPGlkPikgPHRleHQ+IgorCityZXBvcnQobG9jYXRpb24sIG1lc3NhZ2UsIHR5cGUpIDo6PSAiPHR5cGU+KDxtZXNzYWdlLmlkPik6IDxsb2NhdGlvbj4gPG1lc3NhZ2UudGV4dD4iCisKK3dhbnRzU2luZ2xlTGluZU1lc3NhZ2UoKSA6Oj0gImZhbHNlIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvZm9ybWF0cy9nbnUuc3RnIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9mb3JtYXRzL2dudS5zdGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmNzI2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvZm9ybWF0cy9nbnUuc3RnCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgW1RoZSAiQlNEIGxpY2Vuc2UiXQorIENvcHlyaWdodCAoYykgMjAwNiBLYXkgUm9lcGtlCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKgorIE5ldyBzdHlsZSBtZXNzYWdlcy4gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhY3R1YWwgbGF5b3V0IG9mIHRoZSBtZXNzYWdlcyBlbWl0dGVkIGJ5IEFOVExSLgorIFRoZSB0ZXh0IGl0c2VsZiBpcyBjb21pbmcgb3V0IG9mIHRoZSBsYW5ndWFnZXMvKnN0ZyBmaWxlcywgYWNjb3JkaW5nIHRvIHRoZSBjaG9zZW4gbG9jYWxlLgorIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZm9ybWF0IHRoYXQgbWltaWNrcyBHQ0Mgb3V0cHV0LgorKi8KKworZ3JvdXAgZ251OworCitsb2NhdGlvbihmaWxlLCBsaW5lLCBjb2x1bW4pIDo6PSAiPGZpbGU+OjxsaW5lPjoiCisKK21lc3NhZ2UoaWQsIHRleHQpIDo6PSAiPHRleHQ+ICg8aWQ+KSIKKworcmVwb3J0KGxvY2F0aW9uLCBtZXNzYWdlLCB0eXBlKSA6Oj0gIjxsb2NhdGlvbj4gPHR5cGU+OiA8bWVzc2FnZT4iCisKK3dhbnRzU2luZ2xlTGluZU1lc3NhZ2UoKSA6Oj0gInRydWUiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9mb3JtYXRzL3ZzMjAwNS5zdGcgYi9hbnRsci0zLjQvdG9vbC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FudGxyL3Rvb2wvdGVtcGxhdGVzL21lc3NhZ2VzL2Zvcm1hdHMvdnMyMDA1LnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk0ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9mb3JtYXRzL3ZzMjAwNS5zdGcKQEAgLTAsMCArMSw0MiBAQAorLyoKKyBbVGhlICJCU0QgbGljZW5zZSJdCisgQ29weXJpZ2h0IChjKSAyMDA2IEtheSBSb2Vwa2UKKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgYXJlIG1ldDoKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKy8qCisgTmV3IHN0eWxlIG1lc3NhZ2VzLiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGFjdHVhbCBsYXlvdXQgb2YgdGhlIG1lc3NhZ2VzIGVtaXR0ZWQgYnkgQU5UTFIuCisgVGhlIHRleHQgaXRzZWxmIGlzIGNvbWluZyBvdXQgb2YgdGhlIGxhbmd1YWdlcy8qc3RnIGZpbGVzLCBhY2NvcmRpbmcgdG8gdGhlIGNob3NlbiBsb2NhbGUuCisgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGZvcm1hdCBBTlRMUiB1c2VzLgorKi8KKworZ3JvdXAgYW50bHI7CisKK2xvY2F0aW9uKGZpbGUsIGxpbmUsIGNvbHVtbikgOjo9ICI8ZmlsZT4oPGxpbmU+LDxjb2x1bW4+KSIKKworbWVzc2FnZShpZCwgdGV4dCkgOjo9ICJlcnJvciA8aWQ+IDogPHRleHQ+IgorCityZXBvcnQobG9jYXRpb24sIG1lc3NhZ2UsIHR5cGUpIDo6PSAiPGxvY2F0aW9uPiA6IDx0eXBlPiA8bWVzc2FnZS5pZD4gOiA8bWVzc2FnZS50ZXh0PiIKKword2FudHNTaW5nbGVMaW5lTWVzc2FnZSgpIDo6PSAidHJ1ZSIKZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvbGFuZ3VhZ2VzL2VuLnN0ZyBiL2FudGxyLTMuNC90b29sL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYW50bHIvdG9vbC90ZW1wbGF0ZXMvbWVzc2FnZXMvbGFuZ3VhZ2VzL2VuLnN0ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI3ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL21haW4vcmVzb3VyY2VzL29yZy9hbnRsci90b29sL3RlbXBsYXRlcy9tZXNzYWdlcy9sYW5ndWFnZXMvZW4uc3RnCkBAIC0wLDAgKzEsMjk3IEBACisvKgorIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisvKgorIE5ldyBzdHlsZSBtZXNzYWdlcy4gVGhpcyBmaWxlIG9ubHkgY29udGFpbnMgdGhlIG1lc3NhZ2VzIGluIEVuZ2xpc2gsIGJ1dCBubworIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGZpbGUsIGxpbmUsIG9yIGNvbHVtbiBpdCBvY2N1cnJlZCBpbi4KKyBUaGUgbG9jYXRpb24gYW5kIG1lc3NhZ2UgaWRzIGFyZSB0YWtlbiBvdXQgb2YgdGhlIGZvcm1hdHMgZGlyZWN0b3J5LgorCQkJCQkJCQkJCQkJCQlLYXkgUm9lcGtlCisqLworZ3JvdXAgZW5fVVM7CisKKy8vIFRPT0wgRVJST1JTCisvLyBmaWxlIGVycm9ycworQ0FOTk9UX1dSSVRFX0ZJTEUoYXJnLGV4Y2VwdGlvbixzdGFja1RyYWNlKSA6Oj0gPDwKK2Nhbm5vdCB3cml0ZSBmaWxlIDxhcmc+OiA8ZXhjZXB0aW9uPgorPHN0YWNrVHJhY2U7IHNlcGFyYXRvcj0iXG4iPgorPj4KK0NBTk5PVF9DTE9TRV9GSUxFKGFyZyxleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9ICJjYW5ub3QgY2xvc2UgZmlsZSA8YXJnPjogPGV4Y2VwdGlvbj4iCitDQU5OT1RfRklORF9UT0tFTlNfRklMRShhcmcpIDo6PSAiY2Fubm90IGZpbmQgdG9rZW5zIGZpbGUgPGFyZz4iCitFUlJPUl9SRUFESU5HX1RPS0VOU19GSUxFKGFyZyxleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9IDw8Citwcm9ibGVtIHJlYWRpbmcgdG9rZW4gdm9jYWJ1bGFyeSBmaWxlIDxhcmc+OiA8ZXhjZXB0aW9uPgorPHN0YWNrVHJhY2U7IHNlcGFyYXRvcj0iXG4iPgorPj4KK0RJUl9OT1RfRk9VTkQoYXJnLGV4Y2VwdGlvbixzdGFja1RyYWNlKSA6Oj0gImRpcmVjdG9yeSBub3QgZm91bmQ6IDxhcmc+IgorT1VUUFVUX0RJUl9JU19GSUxFKGFyZyxleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9ICJvdXRwdXQgZGlyZWN0b3J5IGlzIGEgZmlsZTogPGFyZz4iCitDQU5OT1RfT1BFTl9GSUxFKGFyZyxleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9ICJjYW5ub3QgZmluZCBvciBvcGVuIGZpbGU6IDxhcmc+PGlmKGV4Y2VwdGlvbik+OyByZWFzb246IDxleGNlcHRpb24+PGVuZGlmPiIKK0NJUkNVTEFSX0RFUEVOREVOQ1koKSA6Oj0gInlvdXIgZ3JhbW1hcnMgY29udGFpbiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYW5kIGNhbm5vdCBiZSBzb3J0ZWQgaW50byBhIHZhbGlkIGJ1aWxkIG9yZGVyLiIKKworSU5URVJOQUxfRVJST1IoYXJnLGFyZzIsZXhjZXB0aW9uLHN0YWNrVHJhY2UpIDo6PSA8PAoraW50ZXJuYWwgZXJyb3I6IDxhcmc+IDxhcmcyPjxpZihleGNlcHRpb24pPjogPGV4Y2VwdGlvbj48ZW5kaWY+Cis8c3RhY2tUcmFjZTsgc2VwYXJhdG9yPSJcbiI+Cis+PgorSU5URVJOQUxfV0FSTklORyhhcmcpIDo6PSAiaW50ZXJuYWwgd2FybmluZzogPGFyZz4iCitFUlJPUl9DUkVBVElOR19BUlRJRklDSUFMX1JVTEUoYXJnLGV4Y2VwdGlvbixzdGFja1RyYWNlKSA6Oj0gPDwKK3Byb2JsZW1zIGNyZWF0aW5nIGxleGVyIHJ1bGUgbGlzdGluZyBhbGwgdG9rZW5zOiA8ZXhjZXB0aW9uPgorPHN0YWNrVHJhY2U7IHNlcGFyYXRvcj0iXG4iPgorPj4KK1RPS0VOU19GSUxFX1NZTlRBWF9FUlJPUihhcmcsYXJnMikgOjo9CisJInByb2JsZW1zIHBhcnNpbmcgdG9rZW4gdm9jYWJ1bGFyeSBmaWxlIDxhcmc+IG9uIGxpbmUgPGFyZzI+IgorQ0FOTk9UX0dFTl9ET1RfRklMRShhcmcsZXhjZXB0aW9uLHN0YWNrVHJhY2UpIDo6PQorCSJjYW5ub3Qgd3JpdGUgREZBIERPVCBmaWxlIDxhcmc+OiA8ZXhjZXB0aW9uPiIKK0JBRF9BQ1RJT05fQVNUX1NUUlVDVFVSRShleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9CisJImJhZCBpbnRlcm5hbCB0cmVlIHN0cnVjdHVyZSBmb3IgYWN0aW9uICc8YXJnPic6IDxleGNlcHRpb24+IgorQkFEX0FTVF9TVFJVQ1RVUkUoYXJnLGV4Y2VwdGlvbixzdGFja1RyYWNlKSA6Oj0gPDwKK2JhZCBpbnRlcm5hbCB0cmVlIHN0cnVjdHVyZSAnPGFyZz4nOiA8ZXhjZXB0aW9uPgorPHN0YWNrVHJhY2U7IHNlcGFyYXRvcj0iXG4iPgorPj4KK0ZJTEVfQU5EX0dSQU1NQVJfTkFNRV9ESUZGRVIoYXJnLGFyZzIpIDo6PQorICAiZmlsZSA8YXJnMj4gY29udGFpbnMgZ3JhbW1hciA8YXJnPjsgbmFtZXMgbXVzdCBiZSBpZGVudGljYWwiCitGSUxFTkFNRV9FWFRFTlNJT05fRVJST1IoYXJnKSA6Oj0KKyAgImZpbGUgPGFyZz4gbXVzdCBlbmQgaW4gYSBmaWxlIGV4dGVuc2lvbiwgbm9ybWFsbHkgLmciCisKKy8vIGNvZGUgZ2VuIGVycm9ycworTUlTU0lOR19DT0RFX0dFTl9URU1QTEFURVMoYXJnKSA6Oj0KKwkiY2Fubm90IGZpbmQgY29kZSBnZW5lcmF0aW9uIHRlbXBsYXRlcyA8YXJnPi5zdGciCitNSVNTSU5HX0NZQ0xJQ19ERkFfQ09ERV9HRU5fVEVNUExBVEVTKCkgOjo9CisJImNhbm5vdCBmaW5kIGNvZGUgZ2VuZXJhdGlvbiBjeWNsaWMgREZBIHRlbXBsYXRlcyBmb3IgbGFuZ3VhZ2UgPGFyZz4iCitDT0RFX0dFTl9URU1QTEFURVNfSU5DT01QTEVURShhcmcpIDo6PQorCSJhdCBsZWFzdCBvbmUgY29kZSBnZW5lcmF0aW9uIHRlbXBsYXRlIG1pc3NpbmcgZm9yIGxhbmd1YWdlIDxhcmc+IgorQ0FOTk9UX0NSRUFURV9UQVJHRVRfR0VORVJBVE9SKGFyZyxleGNlcHRpb24sc3RhY2tUcmFjZSkgOjo9CisJImNhbm5vdCBjcmVhdGUgdGFyZ2V0IDxhcmc+IGNvZGUgZ2VuZXJhdG9yOiA8ZXhjZXB0aW9uPiIKK0NBTk5PVF9DT01QVVRFX1NBTVBMRV9JTlBVVF9TRVEoKSA6Oj0KKwkiY2Fubm90IGdlbmVyYXRlIGEgc2FtcGxlIGlucHV0IHNlcXVlbmNlIGZyb20gbG9va2FoZWFkIERGQSIKKworLy8gZ3JhbW1hciBpbnRlcnByZXRhdGlvbiBlcnJvcnMKKy8qCitOT19WSUFCTEVfREZBX0FMVChhcmcsYXJnMikgOjo9CisJIm5vIHZpYWJsZSB0cmFuc2l0aW9uIGZyb20gc3RhdGUgPGFyZz4gb24gPGFyZzI+IHdoaWxlIGludGVycHJldGluZyBERkEiCisqLworCisvLyBHUkFNTUFSIEVSUk9SUworU1lOVEFYX0VSUk9SKGFyZykgOjo9ICJzeW50YXggZXJyb3I6IDxhcmc+IgorUlVMRV9SRURFRklOSVRJT04oYXJnKSA6Oj0KKwkicnVsZSA8YXJnPiByZWRlZmluaXRpb24iCitMRVhFUl9SVUxFU19OT1RfQUxMT1dFRChhcmcpIDo6PQorCSJsZXhlciBydWxlIDxhcmc+IG5vdCBhbGxvd2VkIGluIHBhcnNlciIKK1BBUlNFUl9SVUxFU19OT1RfQUxMT1dFRChhcmcpIDo6PQorCSJwYXJzZXIgcnVsZSA8YXJnPiBub3QgYWxsb3dlZCBpbiBsZXhlciIKK0NBTk5PVF9GSU5EX0FUVFJJQlVURV9OQU1FX0lOX0RFQ0woYXJnKSA6Oj0KKwkiY2Fubm90IGZpbmQgYW4gYXR0cmlidXRlIG5hbWUgaW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIgorTk9fVE9LRU5fREVGSU5JVElPTihhcmcpIDo6PQorCSJubyBsZXhlciBydWxlIGNvcnJlc3BvbmRpbmcgdG8gdG9rZW46IDxhcmc+IgorVU5ERUZJTkVEX1JVTEVfUkVGKGFyZykgOjo9CisJInJlZmVyZW5jZSB0byB1bmRlZmluZWQgcnVsZTogPGFyZz4iCitMSVRFUkFMX05PVF9BU1NPQ0lBVEVEX1dJVEhfTEVYRVJfUlVMRShhcmcpIDo6PQorCSJsaXRlcmFsIGhhcyBubyBhc3NvY2lhdGVkIGxleGVyIHJ1bGU6IDxhcmc+IgorQ0FOTk9UX0FMSUFTX1RPS0VOU19JTl9MRVhFUihhcmcpIDo6PQorCSJsaXRlcmFscyBhcmUgaWxsZWdhbCBpbiBsZXhlciB0b2tlbnN7fSBzZWN0aW9uOiA8YXJnPiIKK0FUVFJJQlVURV9SRUZfTk9UX0lOX1JVTEUoYXJnLGFyZzIpIDo6PQorCSJyZWZlcmVuY2UgdG8gYXR0cmlidXRlIG91dHNpZGUgb2YgYSBydWxlOiA8YXJnPjxpZihhcmcyKT4uPGFyZzI+PGVuZGlmPiIKK1VOS05PV05fQVRUUklCVVRFX0lOX1NDT1BFKGFyZyxhcmcyKSA6Oj0KKwkidW5rbm93biBhdHRyaWJ1dGUgZm9yIDxhcmc+OiA8YXJnMj4iCitVTktOT1dOX1JVTEVfQVRUUklCVVRFKGFyZyxhcmcyKSA6Oj0KKwkidW5rbm93biBhdHRyaWJ1dGUgZm9yIHJ1bGUgPGFyZz46IDxhcmcyPiIKK1VOS05PV05fU0lNUExFX0FUVFJJQlVURShhcmcsYXJnczIpIDo6PQorCSJhdHRyaWJ1dGUgaXMgbm90IGEgdG9rZW4sIHBhcmFtZXRlciwgb3IgcmV0dXJuIHZhbHVlOiA8YXJnPiIKK0lTT0xBVEVEX1JVTEVfU0NPUEUoYXJnKSA6Oj0KKwkibWlzc2luZyBhdHRyaWJ1dGUgYWNjZXNzIG9uIHJ1bGUgc2NvcGU6IDxhcmc+IgorSU5WQUxJRF9SVUxFX1BBUkFNRVRFUl9SRUYoYXJnLGFyZzIpIDo6PQorCSJjYW5ub3QgYWNjZXNzIHJ1bGUgPGFyZz4ncyBwYXJhbWV0ZXI6IDxhcmcyPiIKK0lOVkFMSURfUlVMRV9TQ09QRV9BVFRSSUJVVEVfUkVGKGFyZyxhcmcyKSA6Oj0KKwkiY2Fubm90IGFjY2VzcyBydWxlIDxhcmc+J3MgZHluYW1pY2FsbHktc2NvcGVkIGF0dHJpYnV0ZTogPGFyZzI+IgorU1lNQk9MX0NPTkZMSUNUU19XSVRIX0dMT0JBTF9TQ09QRShhcmcpIDo6PQorCSJzeW1ib2wgPGFyZz4gY29uZmxpY3RzIHdpdGggZ2xvYmFsIGR5bmFtaWMgc2NvcGUgd2l0aCBzYW1lIG5hbWUiCitXUklURV9UT19SRUFET05MWV9BVFRSKGFyZyxhcmcyLGFyZzMpIDo6PQorCSJjYW5ub3Qgd3JpdGUgdG8gcmVhZCBvbmx5IGF0dHJpYnV0ZTogJDxhcmc+PGlmKGFyZzIpPi48YXJnMj48ZW5kaWY+IgorTEFCRUxfQ09ORkxJQ1RTX1dJVEhfUlVMRShhcmcpIDo6PQorCSJsYWJlbCA8YXJnPiBjb25mbGljdHMgd2l0aCBydWxlIHdpdGggc2FtZSBuYW1lIgorTEFCRUxfQ09ORkxJQ1RTX1dJVEhfVE9LRU4oYXJnKSA6Oj0KKwkibGFiZWwgPGFyZz4gY29uZmxpY3RzIHdpdGggdG9rZW4gd2l0aCBzYW1lIG5hbWUiCitMQUJFTF9DT05GTElDVFNfV0lUSF9SVUxFX1NDT1BFX0FUVFJJQlVURShhcmcsYXJnMikgOjo9CisJImxhYmVsIDxhcmc+IGNvbmZsaWN0cyB3aXRoIHJ1bGUgPGFyZzI+J3MgZHluYW1pY2FsbHktc2NvcGVkIGF0dHJpYnV0ZSB3aXRoIHNhbWUgbmFtZSIKK0xBQkVMX0NPTkZMSUNUU19XSVRIX1JVTEVfQVJHX1JFVFZBTChhcmcsYXJnMikgOjo9CisJImxhYmVsIDxhcmc+IGNvbmZsaWN0cyB3aXRoIHJ1bGUgPGFyZzI+J3MgcmV0dXJuIHZhbHVlIG9yIHBhcmFtZXRlciB3aXRoIHNhbWUgbmFtZSIKK0FUVFJJQlVURV9DT05GTElDVFNfV0lUSF9SVUxFKGFyZyxhcmcyKSA6Oj0KKwkicnVsZSA8YXJnMj4ncyBkeW5hbWljYWxseS1zY29wZWQgYXR0cmlidXRlIDxhcmc+IGNvbmZsaWN0cyB3aXRoIHRoZSBydWxlIG5hbWUiCitBVFRSSUJVVEVfQ09ORkxJQ1RTX1dJVEhfUlVMRV9BUkdfUkVUVkFMKGFyZyxhcmcyKSA6Oj0KKwkicnVsZSA8YXJnMj4ncyBkeW5hbWljYWxseS1zY29wZWQgYXR0cmlidXRlIDxhcmc+IGNvbmZsaWN0cyB3aXRoPGFyZzI+J3MgcmV0dXJuIHZhbHVlIG9yIHBhcmFtZXRlciB3aXRoIHNhbWUgbmFtZSIKK0xBQkVMX1RZUEVfQ09ORkxJQ1QoYXJnLGFyZzIpIDo6PQorCSJsYWJlbCA8YXJnPiB0eXBlIG1pc21hdGNoIHdpdGggcHJldmlvdXMgZGVmaW5pdGlvbjogPGFyZzI+IgorQVJHX1JFVFZBTF9DT05GTElDVChhcmcsYXJnMikgOjo9CisJInJ1bGUgPGFyZzI+J3MgYXJndW1lbnQgPGFyZz4gY29uZmxpY3RzIGEgcmV0dXJuIHZhbHVlIHdpdGggc2FtZSBuYW1lIgorTk9OVU5JUVVFX1JFRihhcmcpIDo6PQorCSI8YXJnPiBpcyBhIG5vbi11bmlxdWUgcmVmZXJlbmNlIgorRk9SV0FSRF9FTEVNRU5UX1JFRihhcmcpIDo6PQorCSJpbGxlZ2FsIGZvcndhcmQgcmVmZXJlbmNlOiA8YXJnPiIKK01JU1NJTkdfUlVMRV9BUkdTKGFyZykgOjo9CisJIm1pc3NpbmcgcGFyYW1ldGVyKHMpIG9uIHJ1bGUgcmVmZXJlbmNlOiA8YXJnPiIKK1JVTEVfSEFTX05PX0FSR1MoYXJnKSA6Oj0KKwkicnVsZSA8YXJnPiBoYXMgbm8gZGVmaW5lZCBwYXJhbWV0ZXJzIgorQVJHU19PTl9UT0tFTl9SRUYoYXJnKSA6Oj0KKwkidG9rZW4gcmVmZXJlbmNlIDxhcmc+IG1heSBub3QgaGF2ZSBwYXJhbWV0ZXJzIgorSUxMRUdBTF9PUFRJT04oYXJnKSA6Oj0KKwkiaWxsZWdhbCBvcHRpb24gPGFyZz4iCitMSVNUX0xBQkVMX0lOVkFMSURfVU5MRVNTX1JFVFZBTF9TVFJVQ1QoYXJnKSA6Oj0KKwkicnVsZSAnKz0nIGxpc3QgbGFiZWxzIGFyZSBub3QgYWxsb3dlZCB3L28gb3V0cHV0IG9wdGlvbjogPGFyZz4iCitVTkRFRklORURfVE9LRU5fUkVGX0lOX1JFV1JJVEUoYXJnKSA6Oj0KKyAgInJlZmVyZW5jZSB0byB1bmRlZmluZWQgdG9rZW4gaW4gcmV3cml0ZSBydWxlOiA8YXJnPiIKK1JFV1JJVEVfRUxFTUVOVF9OT1RfUFJFU0VOVF9PTl9MSFMoYXJnKSA6Oj0KKyAgInJlZmVyZW5jZSB0byByZXdyaXRlIGVsZW1lbnQgPGFyZz4gd2l0aG91dCByZWZlcmVuY2Ugb24gbGVmdCBvZiAtPiIKK1VOREVGSU5FRF9MQUJFTF9SRUZfSU5fUkVXUklURShhcmcpIDo6PQorICAicmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBsYWJlbCBpbiByZXdyaXRlIHJ1bGU6ICQ8YXJnPiIKK05PX0dSQU1NQVJfU1RBUlRfUlVMRSAoYXJnKSA6Oj0KKyAgImdyYW1tYXIgPGFyZz46IG5vIHN0YXJ0IHJ1bGUgKG5vIHJ1bGUgY2FuIG9idmlvdXNseSBiZSBmb2xsb3dlZCBieSBFT0YpIgorRU1QVFlfQ09NUExFTUVOVChhcmcpIDo6PSA8PAorPGlmKGFyZyk+CitzZXQgY29tcGxlbWVudCB+PGFyZz4gaXMgZW1wdHkKKzxlbHNlPgorc2V0IGNvbXBsZW1lbnQgaXMgZW1wdHkKKzxlbmRpZj4KKz4+CitVTktOT1dOX0RZTkFNSUNfU0NPUEUoYXJnKSA6Oj0KKyAgInVua25vd24gZHluYW1pYyBzY29wZTogPGFyZz4iCitVTktOT1dOX0RZTkFNSUNfU0NPUEVfQVRUUklCVVRFKGFyZyxhcmcyKSA6Oj0KKyAgInVua25vd24gZHluYW1pY2FsbHktc2NvcGVkIGF0dHJpYnV0ZSBmb3Igc2NvcGUgPGFyZz46IDxhcmcyPiIKK1JVTEVfUkVGX0FNQklHX1dJVEhfUlVMRV9JTl9BTFQoYXJnKSA6Oj0KKyAgInJlZmVyZW5jZSAkPGFyZz4gaXMgYW1iaWd1b3VzOyBydWxlIDxhcmc+IGlzIGVuY2xvc2luZyBydWxlIGFuZCByZWZlcmVuY2VkIGluIHRoZSBwcm9kdWN0aW9uIChhc3N1bWluZyBlbmNsb3NpbmcgcnVsZSkiCitJU09MQVRFRF9SVUxFX0FUVFJJQlVURShhcmcpIDo6PQorICAicmVmZXJlbmNlIHRvIGxvY2FsbHktZGVmaW5lZCBydWxlIHNjb3BlIGF0dHJpYnV0ZSB3aXRob3V0IHJ1bGUgbmFtZTogPGFyZz4iCitJTlZBTElEX0FDVElPTl9TQ09QRShhcmcsYXJnMikgOjo9CisgICJ1bmtub3duIG9yIGludmFsaWQgYWN0aW9uIHNjb3BlIGZvciA8YXJnMj4gZ3JhbW1hcjogPGFyZz4iCitBQ1RJT05fUkVERUZJTklUSU9OKGFyZykgOjo9CisgICJyZWRlZmluaXRpb24gb2YgPGFyZz4gYWN0aW9uIgorRE9VQkxFX1FVT1RFU19JTExFR0FMKGFyZykgOjo9CisgICJzdHJpbmcgbGl0ZXJhbHMgbXVzdCB1c2Ugc2luZ2xlIHF1b3RlcyAoc3VjaCBhcyBcJ2JlZ2luXCcpOiA8YXJnPiIKK0lOVkFMSURfVEVNUExBVEVfQUNUSU9OKGFyZykgOjo9CisgICJpbnZhbGlkIFN0cmluZ1RlbXBsYXRlICUgc2hvcnRoYW5kIHN5bnRheDogJzxhcmc+JyIKK01JU1NJTkdfQVRUUklCVVRFX05BTUUoKSA6Oj0KKyAgIm1pc3NpbmcgYXR0cmlidXRlIG5hbWUgb24gJCByZWZlcmVuY2UiCitBUkdfSU5JVF9WQUxVRVNfSUxMRUdBTChhcmcpIDo6PQorICAicnVsZSBwYXJhbWV0ZXJzIG1heSBub3QgaGF2ZSBpbml0IHZhbHVlczogPGFyZz4iCitSRVdSSVRFX09SX09QX1dJVEhfTk9fT1VUUFVUX09QVElPTihhcmcpIDo6PQorICAiPGlmKGFyZyk+cnVsZSA8YXJnPiB1c2VzIDxlbmRpZj5yZXdyaXRlIHN5bnRheCBvciBvcGVyYXRvciB3aXRoIG5vIG91dHB1dCBvcHRpb247IHNldHRpbmcgb3V0cHV0PUFTVCIKK0FTVF9PUF9XSVRIX05PTl9BU1RfT1VUUFVUX09QVElPTihhcmcpIDo6PQorICAiQVNUIG9wZXJhdG9yIHdpdGggbm9uLUFTVCBvdXRwdXQgb3B0aW9uOiA8YXJnPiIKK05PX1JVTEVTKGFyZykgOjo9ICJncmFtbWFyIGZpbGUgPGFyZz4gaGFzIG5vIHJ1bGVzIgorTUlTU0lOR19BU1RfVFlQRV9JTl9UUkVFX0dSQU1NQVIoYXJnKSA6Oj0KKyAgInRyZWUgZ3JhbW1hciA8YXJnPiBoYXMgbm8gQVNUTGFiZWxUeXBlIG9wdGlvbiIKK1JFV1JJVEVfRk9SX01VTFRJX0VMRU1FTlRfQUxUKGFyZykgOjo9CisgICJ3aXRoIHJld3JpdGU9dHJ1ZSwgYWx0IDxhcmc+IG5vdCBzaW1wbGUgbm9kZSBvciBvYnZpb3VzIHRyZWUgZWxlbWVudDsgdGV4dCBhdHRyaWJ1dGUgZm9yIHJ1bGUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCIKK1JVTEVfSU5WQUxJRF9TRVQoYXJnKSA6Oj0KKyAgIkNhbm5vdCBjb21wbGVtZW50IHJ1bGUgPGFyZz47IG5vdCBhIHNpbXBsZSBzZXQgb3IgZWxlbWVudCIKK0hFVEVST19JTExFR0FMX0lOX1JFV1JJVEVfQUxUKGFyZykgOjo9CisgICJhbHRzIHdpdGggcmV3cml0ZXMgY2FuJ3QgdXNlIGhldGVyb2dlbmVvdXMgdHlwZXMgbGVmdCBvZiAtPiIKK05PX1NVQ0hfR1JBTU1BUl9TQ09QRShhcmcsYXJnMikgOjo9CisgICJyZWZlcmVuY2UgdG8gdW5kZWZpbmVkIGdyYW1tYXIgaW4gcnVsZSByZWZlcmVuY2U6IDxhcmc+LjxhcmcyPiIKK05PX1NVQ0hfUlVMRV9JTl9TQ09QRShhcmcsYXJnMikgOjo9CisgICJydWxlIDxhcmcyPiBpcyBub3QgZGVmaW5lZCBpbiBncmFtbWFyIDxhcmc+IgorVE9LRU5fQUxJQVNfQ09ORkxJQ1QoYXJnLGFyZzIpIDo6PQorICAiY2Fubm90IGFsaWFzIDxhcmc+OyBzdHJpbmcgYWxyZWFkeSBhc3NpZ25lZCB0byA8YXJnMj4iCitUT0tFTl9BTElBU19SRUFTU0lHTk1FTlQoYXJnLGFyZzIpIDo6PQorICAiY2Fubm90IGFsaWFzIDxhcmc+OyB0b2tlbiBuYW1lIGFscmVhZHkgYXNzaWduZWQgdG8gPGFyZzI+IgorVE9LRU5fVk9DQUJfSU5fREVMRUdBVEUoYXJnLGFyZzIpIDo6PQorICAidG9rZW5Wb2NhYiBvcHRpb24gaWdub3JlZCBpbiBpbXBvcnRlZCBncmFtbWFyIDxhcmc+IgorSU5WQUxJRF9JTVBPUlQoYXJnLGFyZzIpIDo6PQorICAiPGFyZy5ncmFtbWFyVHlwZVN0cmluZz4gZ3JhbW1hciA8YXJnLm5hbWU+IGNhbm5vdCBpbXBvcnQgPGFyZzIuZ3JhbW1hclR5cGVTdHJpbmc+IGdyYW1tYXIgPGFyZzIubmFtZT4iCitJTVBPUlRFRF9UT0tFTlNfUlVMRV9FTVBUWShhcmcsYXJnMikgOjo9CisgICJubyBsZXhlciBydWxlcyBjb250cmlidXRlZCB0byA8YXJnPiBmcm9tIGltcG9ydGVkIGdyYW1tYXIgPGFyZzI+IgorSU1QT1JUX05BTUVfQ0xBU0goYXJnLGFyZzIpIDo6PQorICAiY29tYmluZWQgZ3JhbW1hciA8YXJnLm5hbWU+IGFuZCBpbXBvcnRlZCA8YXJnMi5ncmFtbWFyVHlwZVN0cmluZz4gZ3JhbW1hciA8YXJnMi5uYW1lPiBib3RoIGdlbmVyYXRlIDxhcmcyLnJlY29nbml6ZXJOYW1lPjsgaW1wb3J0IGlnbm9yZWQiCitBU1RfT1BfSU5fQUxUX1dJVEhfUkVXUklURShhcmcsYXJnMikgOjo9CisgICJydWxlIDxhcmc+IGFsdCA8YXJnMj4gdXNlcyByZXdyaXRlIHN5bnRheCBhbmQgYWxzbyBhbiBBU1Qgb3BlcmF0b3IiCitXSUxEQ0FSRF9BU19ST09UKGFyZykgOjo9ICJXaWxkY2FyZCBpbnZhbGlkIGFzIHJvb3Q7IHdpbGRjYXJkIGNhbiBpdHNlbGYgYmUgYSB0cmVlIgorQ09ORkxJQ1RJTkdfT1BUSU9OX0lOX1RSRUVfRklMVEVSKGFyZyxhcmcyKSA6Oj0gIm9wdGlvbiA8YXJnPj08YXJnMj4gY29uZmxpY3RzIHdpdGggdHJlZSBncmFtbWFyIGZpbHRlciBtb2RlIgorSUxMRUdBTF9PUFRJT05fVkFMVUUoYXJnLCBhcmcyKSA6Oj0gInZhbHVlICc8YXJnMj4nIGludmFsaWQgZm9yIG9wdGlvbiA8YXJnPiIKK0FMTF9PUFNfTkVFRF9TQU1FX0FTU09DKGFyZykgOjo9ICJhbGwgb3BlcmF0b3JzIG9mIGFsdCA8YWx0PiBvZiBsZWZ0LXJlY3Vyc2l2ZSBydWxlIG11c3QgaGF2ZSBzYW1lIGFzc29jaWF0aXZpdHkiCisKKy8vIEdSQU1NQVIgV0FSTklOR1MKKworR1JBTU1BUl9OT05ERVRFUk1JTklTTShpbnB1dCxjb25mbGljdGluZ0FsdHMscGF0aHMsZGlzYWJsZWQsaGFzUHJlZGljYXRlQmxvY2tlZEJ5QWN0aW9uKSA6Oj0KKzw8Cis8aWYocGF0aHMpPgorRGVjaXNpb24gY2FuIG1hdGNoIGlucHV0IHN1Y2ggYXMgIjxpbnB1dD4iIHVzaW5nIG11bHRpcGxlIGFsdGVybmF0aXZlczoKKzxwYXRoczp7IGl0IHwgIGFsdCA8aXQuYWx0PiB2aWEgTkZBIHBhdGggPGl0LnN0YXRlczsgc2VwYXJhdG9yPSIsIj48XG4+fT4KKzxlbHNlPgorRGVjaXNpb24gY2FuIG1hdGNoIGlucHV0IHN1Y2ggYXMgIjxpbnB1dD4iIHVzaW5nIG11bHRpcGxlIGFsdGVybmF0aXZlczogPGNvbmZsaWN0aW5nQWx0czsgc2VwYXJhdG9yPSIsICI+Cis8ZW5kaWY+Cis8aWYoZGlzYWJsZWQpPjxcbj5BcyBhIHJlc3VsdCwgYWx0ZXJuYXRpdmUocykgPGRpc2FibGVkOyBzZXBhcmF0b3I9IiwiPiB3ZXJlIGRpc2FibGVkIGZvciB0aGF0IGlucHV0PGVuZGlmPjxpZihoYXNQcmVkaWNhdGVCbG9ja2VkQnlBY3Rpb24pPjxcbj5TZW1hbnRpYyBwcmVkaWNhdGVzIHdlcmUgcHJlc2VudCBidXQgd2VyZSBoaWRkZW4gYnkgYWN0aW9ucy48ZW5kaWY+Cis+PgorCitEQU5HTElOR19TVEFURShkYW5nbGluZ0FsdHMsaW5wdXQpIDo6PSA8PAordGhlIGRlY2lzaW9uIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFsdGVybmF0aXZlKHMpIDxkYW5nbGluZ0FsdHM7IHNlcGFyYXRvcj0iLCI+IGZvciBpbnB1dCBzdWNoIGFzICI8aW5wdXQ+IgorPj4KKworVU5SRUFDSEFCTEVfQUxUUyhhbHRzKSA6Oj0gPDwKK1RoZSBmb2xsb3dpbmcgYWx0ZXJuYXRpdmVzIGNhbiBuZXZlciBiZSBtYXRjaGVkOiA8YWx0czsgc2VwYXJhdG9yPSIsIj48XG4+Cis+PgorCitJTlNVRkZJQ0lFTlRfUFJFRElDQVRFUyh1cG9uLGFsdFRvTG9jYXRpb25zLGhhc1ByZWRpY2F0ZUJsb2NrZWRCeUFjdGlvbikgOjo9IDw8CitJbnB1dCBzdWNoIGFzICI8dXBvbj4iIGlzIGluc3VmZmljaWVudGx5IGNvdmVyZWQgd2l0aCBwcmVkaWNhdGVzIGF0IGxvY2F0aW9uczogPGFsdFRvTG9jYXRpb25zLmtleXM6e2FsdHxhbHQgPGFsdD46IDxhbHRUb0xvY2F0aW9ucy4oYWx0KTp7bG9jfCBsaW5lIDxsb2MubGluZT46PGxvYy5jb2x1bW4+IGF0IDxsb2MudGV4dD59OyBzZXBhcmF0b3I9IiwgIj59OyBzZXBhcmF0b3I9IiwgIj48aWYoaGFzUHJlZGljYXRlQmxvY2tlZEJ5QWN0aW9uKT48XG4+U2VtYW50aWMgcHJlZGljYXRlcyB3ZXJlIHByZXNlbnQgYnV0IHdlcmUgaGlkZGVuIGJ5IGFjdGlvbnMuPGVuZGlmPgorPj4KKworRFVQTElDQVRFX1NFVF9FTlRSWShhcmcpIDo6PQorCSJkdXBsaWNhdGUgdG9rZW4gdHlwZSA8YXJnPiB3aGVuIGNvbGxhcHNpbmcgc3VicnVsZSBpbnRvIHNldCIKKworQU5BTFlTSVNfQUJPUlRFRChlbmNsb3NpbmdSdWxlKSA6Oj0gPDwKK0FOVExSIGNvdWxkIG5vdCBhbmFseXplIHRoaXMgZGVjaXNpb24gaW4gcnVsZSA8ZW5jbG9zaW5nUnVsZT47IG9mdGVuIHRoaXMgaXMgYmVjYXVzZSBvZiByZWN1cnNpdmUgcnVsZSByZWZlcmVuY2VzIHZpc2libGUgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIGFsdGVybmF0aXZlcy4gIEFOVExSIHdpbGwgcmUtYW5hbHl6ZSB0aGUgZGVjaXNpb24gd2l0aCBhIGZpeGVkIGxvb2thaGVhZCBvZiBrPTEuICBDb25zaWRlciB1c2luZyAib3B0aW9ucyB7az0xO30iIGZvciB0aGF0IGRlY2lzaW9uIGFuZCBwb3NzaWJseSBhZGRpbmcgYSBzeW50YWN0aWMgcHJlZGljYXRlLgorPj4KKworUkVDVVJTSU9OX09WRVJMT1coYWx0LGlucHV0LHRhcmdldFJ1bGVzLGNhbGxTaXRlU3RhdGVzKSA6Oj0gPDwKK0FsdGVybmF0aXZlIDxhbHQ+OiBhZnRlciBtYXRjaGluZyBpbnB1dCBzdWNoIGFzIDxpbnB1dD4gZGVjaXNpb24gY2Fubm90IHByZWRpY3Qgd2hhdCBjb21lcyBuZXh0IGR1ZSB0byByZWN1cnNpb24gb3ZlcmZsb3cgPHRhcmdldFJ1bGVzLGNhbGxTaXRlU3RhdGVzOnt0LGN8dG8gPHQ+IGZyb20gPGM6e3N8PHMuZW5jbG9zaW5nUnVsZS5uYW1lPn07c2VwYXJhdG9yPSIsICI+fTsgc2VwYXJhdG9yPSIgYW5kICI+Cis+PgorCitMRUZUX1JFQ1VSU0lPTih0YXJnZXRSdWxlcyxhbHQsY2FsbFNpdGVTdGF0ZXMpIDo6PSA8PAorQWx0ZXJuYXRpdmUgPGFsdD4gZGlzY292ZXJzIGluZmluaXRlIGxlZnQtcmVjdXJzaW9uIDx0YXJnZXRSdWxlcyxjYWxsU2l0ZVN0YXRlczp7dCxjfHRvIDx0PiBmcm9tIDxjOntzfDxzLmVuY2xvc2luZ1J1bGU+fTtzZXBhcmF0b3I9IiwgIj59OyBzZXBhcmF0b3I9IiBhbmQgIj4KKz4+CisKK1VOUkVBQ0hBQkxFX1RPS0VOUyh0b2tlbnMpIDo6PSA8PAorVGhlIGZvbGxvd2luZyB0b2tlbiBkZWZpbml0aW9ucyBjYW4gbmV2ZXIgYmUgbWF0Y2hlZCBiZWNhdXNlIHByaW9yIHRva2VucyBtYXRjaCB0aGUgc2FtZSBpbnB1dDogPHRva2Vuczsgc2VwYXJhdG9yPSIsIj4KKz4+CisKK1RPS0VOX05PTkRFVEVSTUlOSVNNKGlucHV0LGNvbmZsaWN0aW5nVG9rZW5zLHBhdGhzLGRpc2FibGVkLGhhc1ByZWRpY2F0ZUJsb2NrZWRCeUFjdGlvbikgOjo9Cis8PAorPGlmKHBhdGhzKT4KK0RlY2lzaW9uIGNhbiBtYXRjaCBpbnB1dCBzdWNoIGFzICI8aW5wdXQ+IiB1c2luZyBtdWx0aXBsZSBhbHRlcm5hdGl2ZXM6Cis8cGF0aHM6eyBpdCB8IGFsdCA8aXQuYWx0PiB2aWEgTkZBIHBhdGggPGl0LnN0YXRlczsgc2VwYXJhdG9yPSIsIj48XG4+fT4KKzxlbHNlPgorTXVsdGlwbGUgdG9rZW4gcnVsZXMgY2FuIG1hdGNoIGlucHV0IHN1Y2ggYXMgIjxpbnB1dD4iOiA8Y29uZmxpY3RpbmdUb2tlbnM7IHNlcGFyYXRvcj0iLCAiPjxcbj4KKzxlbmRpZj4KKzxpZihkaXNhYmxlZCk+PFxuPkFzIGEgcmVzdWx0LCB0b2tlbihzKSA8ZGlzYWJsZWQ7IHNlcGFyYXRvcj0iLCI+IHdlcmUgZGlzYWJsZWQgZm9yIHRoYXQgaW5wdXQ8ZW5kaWY+PGlmKGhhc1ByZWRpY2F0ZUJsb2NrZWRCeUFjdGlvbik+PFxuPlNlbWFudGljIHByZWRpY2F0ZXMgd2VyZSBwcmVzZW50IGJ1dCB3ZXJlIGhpZGRlbiBieSBhY3Rpb25zLjxlbmRpZj4KKz4+CisKK0xFRlRfUkVDVVJTSU9OX0NZQ0xFUyhsaXN0T2ZDeWNsZXMpIDo6PSA8PAorVGhlIGZvbGxvd2luZyBzZXRzIG9mIHJ1bGVzIGFyZSBtdXR1YWxseSBsZWZ0LXJlY3Vyc2l2ZSA8bGlzdE9mQ3ljbGVzOntjfCBbPGM6e3J8PHIubmFtZT59OyBzZXBhcmF0b3I9IiwgIj5dfTsgc2VwYXJhdG9yPSIgYW5kICI+Cis+PgorCitOT05SRUdVTEFSX0RFQ0lTSU9OKHJ1bGVOYW1lLGFsdHMpIDo6PSA8PAorW2ZhdGFsXSBydWxlIDxydWxlTmFtZT4gaGFzIG5vbi1MTCgqKSBkZWNpc2lvbiBkdWUgdG8gcmVjdXJzaXZlIHJ1bGUgaW52b2NhdGlvbnMgcmVhY2hhYmxlIGZyb20gYWx0cyA8YWx0czsgc2VwYXJhdG9yPSIsIj4uICBSZXNvbHZlIGJ5IGxlZnQtZmFjdG9yaW5nIG9yIHVzaW5nIHN5bnRhY3RpYyBwcmVkaWNhdGVzIG9yIHVzaW5nIGJhY2t0cmFjaz10cnVlIG9wdGlvbi4KKz4+CisKKy8qIGwxMG4gZm9yIG1lc3NhZ2UgbGV2ZWxzICovCit3YXJuaW5nKCkgOjo9ICJ3YXJuaW5nIgorZXJyb3IoKSA6Oj0gImVycm9yIgpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9CYXNlVGVzdC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9CYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTA1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L0Jhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw5MDQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuU291cmNlOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1RHcm91cDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5BTlRMUkVycm9yTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlOworaW1wb3J0IG9yZy5hbnRsci50b29sLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworaW1wb3J0IGphdmF4LnRvb2xzLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVGVzdCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmV3bGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGppa2VzID0gbnVsbDsvLyIvdXNyL2Jpbi9qaWtlcyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGF0aFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsKKworICAgLyoqCisgICAgKiBXaGVuIHJ1bm5uaW5nIGZyb20gTWF2ZW4sIHRoZSBqdW5pdCB0ZXN0cyBhcmUgcnVuIHZpYSB0aGUgc3VyZWZpcmUgcGx1Z2luLiBJdCBzZXRzIHRoZQorICAgICogY2xhc3NwYXRoIGZvciB0aGUgdGVzdCBlbnZpcm9ubWVudCBpbnRvIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkuIFdlIG5lZWQgdG8gcGljayB0aGlzIHVwCisgICAgKiBmb3IgdGhlIGp1bml0IHRlc3RzIHRoYXQgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIGFuZCB0cnkgdG8gcnVuIGNvZGUuCisgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVJFRklSRV9DTEFTU1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN1cmVmaXJlLnRlc3QuY2xhc3MucGF0aCIsICIiKTsKKworICAgIC8qKgorICAgICAqIEJ1aWxkIHVwIHRoZSBmdWxsIGNsYXNzcGF0aCB3ZSBuZWVkLCBpbmNsdWRpbmcgdGhlIHN1cmVmaXJlIHBhdGggKGlmIHByZXNlbnQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSArIChTVVJFRklSRV9DTEFTU1BBVEguZXF1YWxzKCIiKSA/ICIiIDogcGF0aFNlcCArIFNVUkVGSVJFX0NMQVNTUEFUSCk7CisKKwlwdWJsaWMgU3RyaW5nIHRtcGRpciA9IG51bGw7CisKKyAgICAvKiogcmVzZXQgZHVyaW5nIHNldFVwIGFuZCBzZXQgdG8gdHJ1ZSBpZiB3ZSBmaW5kIGEgcHJvYmxlbSAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGxhc3RUZXN0RmFpbGVkID0gZmFsc2U7CisKKwkvKiogSWYgZXJyb3IgZHVyaW5nIHBhcnNlciBleGVjdXRpb24sIHN0b3JlIHN0ZGVyciBoZXJlOyBjYW4ndCByZXR1cm4KKyAgICAgKiAgc3Rkb3V0IGFuZCBzdGRlcnIuICBUaGlzIGRvZXNuJ3QgdHJhcCBlcnJvcnMgZnJvbSBydW5uaW5nIGFudGxyLgorICAgICAqLworCXByb3RlY3RlZCBTdHJpbmcgc3RkZXJyRHVyaW5nUGFyc2U7CisKKyAgICBAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbGFzdFRlc3RGYWlsZWQgPSBmYWxzZTsgLy8gaG9wZSBmb3IgdGhlIGJlc3QsIGJ1dCBzZXQgdG8gdHJ1ZSBpbiBhc3NlcnRzIHRoYXQgZmFpbAorICAgICAgICAvLyBuZXcgb3V0cHV0IGRpciBmb3IgZWFjaCB0ZXN0CisgICAgICAgIHRtcGRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwKKwkJCQkJCSAgImFudGxyLSIrZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIi0iKworCQkJCQkJICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIEVycm9yTWFuYWdlci5yZXNldEVycm9yU3RhdGUoKTsKKyAgICAgICAgU1RHcm91cC5kZWZhdWx0R3JvdXAgPSBuZXcgU1RHcm91cCgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJlbW92ZSB0bXBkaXIgaWYgbm8gZXJyb3IuCisgICAgICAgIGlmICggIWxhc3RUZXN0RmFpbGVkICkgZXJhc2VUZW1wRGlyKCk7CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVG9vbCBuZXdUb29sKFN0cmluZ1tdIGFyZ3MpIHsKKwkJVG9vbCB0b29sID0gbmV3IFRvb2woYXJncyk7CisJCXRvb2wuc2V0T3V0cHV0RGlyZWN0b3J5KHRtcGRpcik7CisJCXJldHVybiB0b29sOworCX0KKworCXByb3RlY3RlZCBUb29sIG5ld1Rvb2woKSB7CisJCVRvb2wgdG9vbCA9IG5ldyBUb29sKCk7CisJCXRvb2wuc2V0T3V0cHV0RGlyZWN0b3J5KHRtcGRpcik7CisJCXJldHVybiB0b29sOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNvbXBpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisJCVN0cmluZyBjbGFzc3BhdGhPcHRpb24gPSAiLWNsYXNzcGF0aCI7CisKKwkJU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbXSB7CisJCQkJCSJqYXZhYyIsICItZCIsIHRtcGRpciwKKwkJCQkJY2xhc3NwYXRoT3B0aW9uLCB0bXBkaXIrcGF0aFNlcCtDTEFTU1BBVEgsCisJCQkJCXRtcGRpcisiLyIrZmlsZU5hbWUKKwkJfTsKKwkJU3RyaW5nIGNtZExpbmUgPSAiamF2YWMiICsiIC1kICIrdG1wZGlyKyIgIitjbGFzc3BhdGhPcHRpb24rIiAiK3RtcGRpcitwYXRoU2VwK0NMQVNTUEFUSCsiICIrZmlsZU5hbWU7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb21waWxlOiAiK2NtZExpbmUpOworCisKKwkJRmlsZSBmID0gbmV3IEZpbGUodG1wZGlyLCBmaWxlTmFtZSk7CisJCUphdmFDb21waWxlciBjb21waWxlciA9IFRvb2xQcm92aWRlci5nZXRTeXN0ZW1KYXZhQ29tcGlsZXIoKTsKKworCQlTdGFuZGFyZEphdmFGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9CisJCQljb21waWxlci5nZXRTdGFuZGFyZEZpbGVNYW5hZ2VyKG51bGwsIG51bGwsIG51bGwpOworCisJCUl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhRmlsZU9iamVjdD4gY29tcGlsYXRpb25Vbml0cyA9CisJCQlmaWxlTWFuYWdlci5nZXRKYXZhRmlsZU9iamVjdHNGcm9tRmlsZXMoQXJyYXlzLmFzTGlzdChmKSk7CisKKwkJSXRlcmFibGU8U3RyaW5nPiBjb21waWxlT3B0aW9ucyA9CisJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXXsiLWQiLCB0bXBkaXIsICItY3AiLCB0bXBkaXIrcGF0aFNlcCtDTEFTU1BBVEh9ICk7CisKKwkJSmF2YUNvbXBpbGVyLkNvbXBpbGF0aW9uVGFzayB0YXNrID0KKwkJCWNvbXBpbGVyLmdldFRhc2sobnVsbCwgZmlsZU1hbmFnZXIsIG51bGwsIGNvbXBpbGVPcHRpb25zLCBudWxsLAorCQkJCQkJCSBjb21waWxhdGlvblVuaXRzKTsKKwkJYm9vbGVhbiBvayA9IHRhc2suY2FsbCgpOworCisJCXRyeSB7CisJCQlmaWxlTWFuYWdlci5jbG9zZSgpOworCQl9CisJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCWlvZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCX0KKwkJcmV0dXJuIG9rOworCX0KKworCS8qKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgaXMgb2ssIG5vIGVycm9ycyAqLworCXByb3RlY3RlZCBib29sZWFuIGFudGxyKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgU3RyaW5nIGdyYW1tYXJTdHIsIGJvb2xlYW4gZGVidWcpIHsKKwkJYm9vbGVhbiBhbGxJc1dlbGwgPSB0cnVlOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCBmaWxlTmFtZSwgZ3JhbW1hclN0cik7CisJCXRyeSB7CisJCQlmaW5hbCBMaXN0IG9wdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlpZiAoIGRlYnVnICkgeworCQkJCW9wdGlvbnMuYWRkKCItZGVidWciKTsKKwkJCX0KKwkJCW9wdGlvbnMuYWRkKCItbyIpOworCQkJb3B0aW9ucy5hZGQodG1wZGlyKTsKKwkJCW9wdGlvbnMuYWRkKCItbGliIik7CisJCQlvcHRpb25zLmFkZCh0bXBkaXIpOworCQkJb3B0aW9ucy5hZGQobmV3IEZpbGUodG1wZGlyLGdyYW1tYXJGaWxlTmFtZSkudG9TdHJpbmcoKSk7CisJCQlmaW5hbCBTdHJpbmdbXSBvcHRpb25zQSA9IG5ldyBTdHJpbmdbb3B0aW9ucy5zaXplKCldOworCQkJb3B0aW9ucy50b0FycmF5KG9wdGlvbnNBKTsKKwkJCS8qCisJCQlmaW5hbCBFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQkJKi8KKwkJCVRvb2wgYW50bHIgPSBuZXdUb29sKG9wdGlvbnNBKTsKKwkJCWFudGxyLnByb2Nlc3MoKTsKKwkJCUFOVExSRXJyb3JMaXN0ZW5lciBsaXN0ZW5lciA9IEVycm9yTWFuYWdlci5nZXRFcnJvckxpc3RlbmVyKCk7CisJCQlpZiAoIGxpc3RlbmVyIGluc3RhbmNlb2YgRXJyb3JRdWV1ZSApIHsKKwkJCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IChFcnJvclF1ZXVlKWxpc3RlbmVyOworCQkJCWlmICggZXF1ZXVlLmVycm9ycy5zaXplKCk+MCApIHsKKwkJCQkJYWxsSXNXZWxsID0gZmFsc2U7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiYW50bHIgcmVwb3J0cyBlcnJvcnMgZnJvbSAiK29wdGlvbnMpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVxdWV1ZS5lcnJvcnMuc2l6ZSgpOyBpKyspIHsKKwkJCQkJCU1lc3NhZ2UgbXNnID0gKE1lc3NhZ2UpIGVxdWV1ZS5lcnJvcnMuZ2V0KGkpOworCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIhISFcbmdyYW1tYXI6Iik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihncmFtbWFyU3RyKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMiKTsKKyAgICAgICAgICAgICAgICB9CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlhbGxJc1dlbGwgPSBmYWxzZTsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigicHJvYmxlbXMgYnVpbGRpbmcgZ3JhbW1hcjogIitlKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCQl9CisJCXJldHVybiBhbGxJc1dlbGw7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBleGVjTGV4ZXIoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwKKwkJCQkJCQkgICBTdHJpbmcgZ3JhbW1hclN0ciwKKwkJCQkJCQkgICBTdHJpbmcgbGV4ZXJOYW1lLAorCQkJCQkJCSAgIFN0cmluZyBpbnB1dCwKKwkJCQkJCQkgICBib29sZWFuIGRlYnVnKQorCXsKKwkJcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoZ3JhbW1hckZpbGVOYW1lLAorCQkJCQkJCQkJICBncmFtbWFyU3RyLAorCQkJCQkJCQkJICBudWxsLAorCQkJCQkJCQkJICBsZXhlck5hbWUsCisJCQkJCQkJCQkgIGRlYnVnKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgImlucHV0IiwgaW5wdXQpOworCQlyZXR1cm4gcmF3RXhlY1JlY29nbml6ZXIobnVsbCwKKwkJCQkJCQkJIG51bGwsCisJCQkJCQkJCSBsZXhlck5hbWUsCisJCQkJCQkJCSBudWxsLAorCQkJCQkJCQkgbnVsbCwKKwkJCQkJCQkJIGZhbHNlLAorCQkJCQkJCQkgZmFsc2UsCisJCQkJCQkJCSBmYWxzZSwKKwkJCQkJCQkJIGRlYnVnKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGV4ZWNQYXJzZXIoU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwKKwkJCQkJCQkJU3RyaW5nIGdyYW1tYXJTdHIsCisJCQkJCQkJCVN0cmluZyBwYXJzZXJOYW1lLAorCQkJCQkJCQlTdHJpbmcgbGV4ZXJOYW1lLAorCQkJCQkJCQlTdHJpbmcgc3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJU3RyaW5nIGlucHV0LCBib29sZWFuIGRlYnVnKQorCXsKKwkJcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoZ3JhbW1hckZpbGVOYW1lLAorCQkJCQkJCQkJICBncmFtbWFyU3RyLAorCQkJCQkJCQkJICBwYXJzZXJOYW1lLAorCQkJCQkJCQkJICBsZXhlck5hbWUsCisJCQkJCQkJCQkgIGRlYnVnKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgImlucHV0IiwgaW5wdXQpOworCQlib29sZWFuIHBhcnNlckJ1aWxkc1RyZWVzID0KKwkJCWdyYW1tYXJTdHIuaW5kZXhPZigib3V0cHV0PUFTVCIpPj0wIHx8CisJCQlncmFtbWFyU3RyLmluZGV4T2YoIm91dHB1dCA9IEFTVCIpPj0wOworCQlib29sZWFuIHBhcnNlckJ1aWxkc1RlbXBsYXRlID0KKwkJCWdyYW1tYXJTdHIuaW5kZXhPZigib3V0cHV0PXRlbXBsYXRlIik+PTAgfHwKKwkJCWdyYW1tYXJTdHIuaW5kZXhPZigib3V0cHV0ID0gdGVtcGxhdGUiKT49MDsKKwkJcmV0dXJuIHJhd0V4ZWNSZWNvZ25pemVyKHBhcnNlck5hbWUsCisJCQkJCQkJCSBudWxsLAorCQkJCQkJCQkgbGV4ZXJOYW1lLAorCQkJCQkJCQkgc3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJIG51bGwsCisJCQkJCQkJCSBwYXJzZXJCdWlsZHNUcmVlcywKKwkJCQkJCQkJIHBhcnNlckJ1aWxkc1RlbXBsYXRlLAorCQkJCQkJCQkgZmFsc2UsCisJCQkJCQkJCSBkZWJ1Zyk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBleGVjVHJlZVBhcnNlcihTdHJpbmcgcGFyc2VyR3JhbW1hckZpbGVOYW1lLAorCQkJCQkJCQkJU3RyaW5nIHBhcnNlckdyYW1tYXJTdHIsCisJCQkJCQkJCQlTdHJpbmcgcGFyc2VyTmFtZSwKKwkJCQkJCQkJCVN0cmluZyB0cmVlUGFyc2VyR3JhbW1hckZpbGVOYW1lLAorCQkJCQkJCQkJU3RyaW5nIHRyZWVQYXJzZXJHcmFtbWFyU3RyLAorCQkJCQkJCQkJU3RyaW5nIHRyZWVQYXJzZXJOYW1lLAorCQkJCQkJCQkJU3RyaW5nIGxleGVyTmFtZSwKKwkJCQkJCQkJCVN0cmluZyBwYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkJU3RyaW5nIHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkJU3RyaW5nIGlucHV0KQorCXsKKwkJcmV0dXJuIGV4ZWNUcmVlUGFyc2VyKHBhcnNlckdyYW1tYXJGaWxlTmFtZSwKKwkJCQkJCQkgIHBhcnNlckdyYW1tYXJTdHIsCisJCQkJCQkJICBwYXJzZXJOYW1lLAorCQkJCQkJCSAgdHJlZVBhcnNlckdyYW1tYXJGaWxlTmFtZSwKKwkJCQkJCQkgIHRyZWVQYXJzZXJHcmFtbWFyU3RyLAorCQkJCQkJCSAgdHJlZVBhcnNlck5hbWUsCisJCQkJCQkJICBsZXhlck5hbWUsCisJCQkJCQkJICBwYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCSAgdHJlZVBhcnNlclN0YXJ0UnVsZU5hbWUsCisJCQkJCQkJICBpbnB1dCwKKwkJCQkJCQkgIGZhbHNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGV4ZWNUcmVlUGFyc2VyKFN0cmluZyBwYXJzZXJHcmFtbWFyRmlsZU5hbWUsCisJCQkJCQkJCQlTdHJpbmcgcGFyc2VyR3JhbW1hclN0ciwKKwkJCQkJCQkJCVN0cmluZyBwYXJzZXJOYW1lLAorCQkJCQkJCQkJU3RyaW5nIHRyZWVQYXJzZXJHcmFtbWFyRmlsZU5hbWUsCisJCQkJCQkJCQlTdHJpbmcgdHJlZVBhcnNlckdyYW1tYXJTdHIsCisJCQkJCQkJCQlTdHJpbmcgdHJlZVBhcnNlck5hbWUsCisJCQkJCQkJCQlTdHJpbmcgbGV4ZXJOYW1lLAorCQkJCQkJCQkJU3RyaW5nIHBhcnNlclN0YXJ0UnVsZU5hbWUsCisJCQkJCQkJCQlTdHJpbmcgdHJlZVBhcnNlclN0YXJ0UnVsZU5hbWUsCisJCQkJCQkJCQlTdHJpbmcgaW5wdXQsCisJCQkJCQkJCQlib29sZWFuIGRlYnVnKQorCXsKKwkJLy8gYnVpbGQgdGhlIHBhcnNlcgorCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcihwYXJzZXJHcmFtbWFyRmlsZU5hbWUsCisJCQkJCQkJCQkgIHBhcnNlckdyYW1tYXJTdHIsCisJCQkJCQkJCQkgIHBhcnNlck5hbWUsCisJCQkJCQkJCQkgIGxleGVyTmFtZSwKKwkJCQkJCQkJCSAgZGVidWcpOworCisJCS8vIGJ1aWxkIHRoZSB0cmVlIHBhcnNlcgorCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcih0cmVlUGFyc2VyR3JhbW1hckZpbGVOYW1lLAorCQkJCQkJCQkJICB0cmVlUGFyc2VyR3JhbW1hclN0ciwKKwkJCQkJCQkJCSAgdHJlZVBhcnNlck5hbWUsCisJCQkJCQkJCQkgIGxleGVyTmFtZSwKKwkJCQkJCQkJCSAgZGVidWcpOworCisJCXdyaXRlRmlsZSh0bXBkaXIsICJpbnB1dCIsIGlucHV0KTsKKworCQlib29sZWFuIHBhcnNlckJ1aWxkc1RyZWVzID0KKwkJCXBhcnNlckdyYW1tYXJTdHIuaW5kZXhPZigib3V0cHV0PUFTVCIpPj0wIHx8CisJCQlwYXJzZXJHcmFtbWFyU3RyLmluZGV4T2YoIm91dHB1dCA9IEFTVCIpPj0wOworCQlib29sZWFuIHRyZWVQYXJzZXJCdWlsZHNUcmVlcyA9CisJCQl0cmVlUGFyc2VyR3JhbW1hclN0ci5pbmRleE9mKCJvdXRwdXQ9QVNUIik+PTAgfHwKKwkJCXRyZWVQYXJzZXJHcmFtbWFyU3RyLmluZGV4T2YoIm91dHB1dCA9IEFTVCIpPj0wOworCQlib29sZWFuIHBhcnNlckJ1aWxkc1RlbXBsYXRlID0KKwkJCXBhcnNlckdyYW1tYXJTdHIuaW5kZXhPZigib3V0cHV0PXRlbXBsYXRlIik+PTAgfHwKKwkJCXBhcnNlckdyYW1tYXJTdHIuaW5kZXhPZigib3V0cHV0ID0gdGVtcGxhdGUiKT49MDsKKworCQlyZXR1cm4gcmF3RXhlY1JlY29nbml6ZXIocGFyc2VyTmFtZSwKKwkJCQkJCQkJIHRyZWVQYXJzZXJOYW1lLAorCQkJCQkJCQkgbGV4ZXJOYW1lLAorCQkJCQkJCQkgcGFyc2VyU3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJIHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkgcGFyc2VyQnVpbGRzVHJlZXMsCisJCQkJCQkJCSBwYXJzZXJCdWlsZHNUZW1wbGF0ZSwKKwkJCQkJCQkJIHRyZWVQYXJzZXJCdWlsZHNUcmVlcywKKwkJCQkJCQkJIGRlYnVnKTsKKwl9CisKKwkvKiogUmV0dXJuIHRydWUgaWYgYWxsIGlzIHdlbGwgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcihTdHJpbmcgZ3JhbW1hckZpbGVOYW1lLAorCQkJCQkJCQkJCQkJCVN0cmluZyBncmFtbWFyU3RyLAorCQkJCQkJCQkJCQkJCVN0cmluZyBwYXJzZXJOYW1lLAorCQkJCQkJCQkJCQkJCVN0cmluZyBsZXhlck5hbWUsCisJCQkJCQkJCQkJCQkJYm9vbGVhbiBkZWJ1ZykKKwl7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKGdyYW1tYXJTdHIpOworCQlib29sZWFuIGFsbElzV2VsbCA9CisJCQlhbnRscihncmFtbWFyRmlsZU5hbWUsIGdyYW1tYXJGaWxlTmFtZSwgZ3JhbW1hclN0ciwgZGVidWcpOworCQlpZiAoIGxleGVyTmFtZSE9bnVsbCApIHsKKwkJCWJvb2xlYW4gb2s7CisJCQlpZiAoIHBhcnNlck5hbWUhPW51bGwgKSB7CisJCQkJb2sgPSBjb21waWxlKHBhcnNlck5hbWUrIi5qYXZhIik7CisJCQkJaWYgKCAhb2sgKSB7IGFsbElzV2VsbCA9IGZhbHNlOyB9CisJCQl9CisJCQlvayA9IGNvbXBpbGUobGV4ZXJOYW1lKyIuamF2YSIpOworCQkJaWYgKCAhb2sgKSB7IGFsbElzV2VsbCA9IGZhbHNlOyB9CisJCX0KKwkJZWxzZSB7CisJCQlib29sZWFuIG9rID0gY29tcGlsZShwYXJzZXJOYW1lKyIuamF2YSIpOworCQkJaWYgKCAhb2sgKSB7IGFsbElzV2VsbCA9IGZhbHNlOyB9CisJCX0KKwkJcmV0dXJuIGFsbElzV2VsbDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHJhd0V4ZWNSZWNvZ25pemVyKFN0cmluZyBwYXJzZXJOYW1lLAorCQkJCQkJCQkJICAgU3RyaW5nIHRyZWVQYXJzZXJOYW1lLAorCQkJCQkJCQkJICAgU3RyaW5nIGxleGVyTmFtZSwKKwkJCQkJCQkJCSAgIFN0cmluZyBwYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkJICAgU3RyaW5nIHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkJICAgYm9vbGVhbiBwYXJzZXJCdWlsZHNUcmVlcywKKwkJCQkJCQkJCSAgIGJvb2xlYW4gcGFyc2VyQnVpbGRzVGVtcGxhdGUsCisJCQkJCQkJCQkgICBib29sZWFuIHRyZWVQYXJzZXJCdWlsZHNUcmVlcywKKwkJCQkJCQkJCSAgIGJvb2xlYW4gZGVidWcpCisJeworICAgICAgICB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlID0gbnVsbDsKKwkJd3JpdGVSZWNvZ25pemVyQW5kQ29tcGlsZShwYXJzZXJOYW1lLCB0cmVlUGFyc2VyTmFtZSwgbGV4ZXJOYW1lLCBwYXJzZXJTdGFydFJ1bGVOYW1lLCB0cmVlUGFyc2VyU3RhcnRSdWxlTmFtZSwgcGFyc2VyQnVpbGRzVHJlZXMsIHBhcnNlckJ1aWxkc1RlbXBsYXRlLCB0cmVlUGFyc2VyQnVpbGRzVHJlZXMsIGRlYnVnKTsKKworCQlyZXR1cm4gZXhlY1JlY29nbml6ZXIoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGV4ZWNSZWNvZ25pemVyKCkgeworCQl0cnkgeworCQkJU3RyaW5nIGlucHV0RmlsZSA9IG5ldyBGaWxlKHRtcGRpciwgImlucHV0IikuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tdIHsKKwkJCQkiamF2YSIsICItY2xhc3NwYXRoIiwgdG1wZGlyK3BhdGhTZXArQ0xBU1NQQVRILAorCQkJCSJUZXN0IiwgaW5wdXRGaWxlCisJCQl9OworCQkJLy9TdHJpbmcgY21kTGluZSA9ICJqYXZhIC1jbGFzc3BhdGggIitDTEFTU1BBVEgrcGF0aFNlcCt0bXBkaXIrIiBUZXN0ICIgKyBuZXcgRmlsZSh0bXBkaXIsICJpbnB1dCIpLmdldEFic29sdXRlUGF0aCgpOworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4ZWNQYXJzZXI6ICIrY21kTGluZSk7CisJCQlQcm9jZXNzIHByb2Nlc3MgPQorCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoYXJncywgbnVsbCwgbmV3IEZpbGUodG1wZGlyKSk7CisJCQlTdHJlYW1WYWN1dW0gc3Rkb3V0VmFjdXVtID0gbmV3IFN0cmVhbVZhY3V1bShwcm9jZXNzLmdldElucHV0U3RyZWFtKCksIGlucHV0RmlsZSk7CisJCQlTdHJlYW1WYWN1dW0gc3RkZXJyVmFjdXVtID0gbmV3IFN0cmVhbVZhY3V1bShwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksIGlucHV0RmlsZSk7CisJCQlzdGRvdXRWYWN1dW0uc3RhcnQoKTsKKwkJCXN0ZGVyclZhY3V1bS5zdGFydCgpOworCQkJcHJvY2Vzcy53YWl0Rm9yKCk7CisJCQlzdGRvdXRWYWN1dW0uam9pbigpOworCQkJc3RkZXJyVmFjdXVtLmpvaW4oKTsKKwkJCVN0cmluZyBvdXRwdXQgPSBudWxsOworCQkJb3V0cHV0ID0gc3Rkb3V0VmFjdXVtLnRvU3RyaW5nKCk7CisJCQlpZiAoIHN0ZGVyclZhY3V1bS50b1N0cmluZygpLmxlbmd0aCgpPjAgKSB7CisJCQkJdGhpcy5zdGRlcnJEdXJpbmdQYXJzZSA9IHN0ZGVyclZhY3V1bS50b1N0cmluZygpOworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiZXhlYyBzdGRlcnJWYWN1dW06ICIrIHN0ZGVyclZhY3V1bSk7CisJCQl9CisJCQlyZXR1cm4gb3V0cHV0OworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJjYW4ndCBleGVjIHJlY29nbml6ZXIiKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlUmVjb2duaXplckFuZENvbXBpbGUoU3RyaW5nIHBhcnNlck5hbWUsIFN0cmluZyB0cmVlUGFyc2VyTmFtZSwgU3RyaW5nIGxleGVyTmFtZSwgU3RyaW5nIHBhcnNlclN0YXJ0UnVsZU5hbWUsIFN0cmluZyB0cmVlUGFyc2VyU3RhcnRSdWxlTmFtZSwgYm9vbGVhbiBwYXJzZXJCdWlsZHNUcmVlcywgYm9vbGVhbiBwYXJzZXJCdWlsZHNUZW1wbGF0ZSwgYm9vbGVhbiB0cmVlUGFyc2VyQnVpbGRzVHJlZXMsIGJvb2xlYW4gZGVidWcpIHsKKwkJaWYgKCB0cmVlUGFyc2VyQnVpbGRzVHJlZXMgJiYgcGFyc2VyQnVpbGRzVHJlZXMgKSB7CisJCQl3cml0ZVRyZWVBbmRUcmVlVGVzdEZpbGUocGFyc2VyTmFtZSwKKwkJCQkJCQkJCSB0cmVlUGFyc2VyTmFtZSwKKwkJCQkJCQkJCSBsZXhlck5hbWUsCisJCQkJCQkJCQkgcGFyc2VyU3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJCSB0cmVlUGFyc2VyU3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJCSBkZWJ1Zyk7CisJCX0KKwkJZWxzZSBpZiAoIHBhcnNlckJ1aWxkc1RyZWVzICkgeworCQkJd3JpdGVUcmVlVGVzdEZpbGUocGFyc2VyTmFtZSwKKwkJCQkJCQkgIHRyZWVQYXJzZXJOYW1lLAorCQkJCQkJCSAgbGV4ZXJOYW1lLAorCQkJCQkJCSAgcGFyc2VyU3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkgIHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCSAgZGVidWcpOworCQl9CisJCWVsc2UgaWYgKCBwYXJzZXJCdWlsZHNUZW1wbGF0ZSApIHsKKwkJCXdyaXRlVGVtcGxhdGVUZXN0RmlsZShwYXJzZXJOYW1lLAorCQkJCQkJCQkgIGxleGVyTmFtZSwKKwkJCQkJCQkJICBwYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkgIGRlYnVnKTsKKwkJfQorCQllbHNlIGlmICggcGFyc2VyTmFtZT09bnVsbCApIHsKKwkJCXdyaXRlTGV4ZXJUZXN0RmlsZShsZXhlck5hbWUsIGRlYnVnKTsKKwkJfQorCQllbHNlIHsKKwkJCXdyaXRlVGVzdEZpbGUocGFyc2VyTmFtZSwKKwkJCQkJCSAgbGV4ZXJOYW1lLAorCQkJCQkJICBwYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJICBkZWJ1Zyk7CisJCX0KKworCQljb21waWxlKCJUZXN0LmphdmEiKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihFcnJvclF1ZXVlIGVxdWV1ZSwKKwkJCQkJCQkJCQkJICBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCS8qCisJCQkJU3lzdGVtLm91dC5wcmludGxuKGVxdWV1ZS5pbmZvcyk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKGVxdWV1ZS53YXJuaW5ncyk7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKGVxdWV1ZS5lcnJvcnMpOworCQkJCWFzc2VydFRydWUoIm51bWJlciBvZiBlcnJvcnMgbWlzbWF0Y2giLCBuLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJCQkJCQkgICAqLworCQlNZXNzYWdlIGZvdW5kTXNnID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcXVldWUuZXJyb3JzLnNpemUoKTsgaSsrKSB7CisJCQlNZXNzYWdlIG0gPSAoTWVzc2FnZSllcXVldWUuZXJyb3JzLmdldChpKTsKKwkJCWlmIChtLm1zZ0lEPT1leHBlY3RlZE1lc3NhZ2UubXNnSUQgKSB7CisJCQkJZm91bmRNc2cgPSBtOworCQkJfQorCQl9CisJCWFzc2VydE5vdE51bGwoIm5vIGVycm9yOyAiK2V4cGVjdGVkTWVzc2FnZS5tc2dJRCsiIGV4cGVjdGVkIiwgZm91bmRNc2cpOworCQlhc3NlcnRUcnVlKCJlcnJvciBpcyBub3QgYSBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSIsCisJCQkJICAgZm91bmRNc2cgaW5zdGFuY2VvZiBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZE1lc3NhZ2UuYXJnLCBmb3VuZE1zZy5hcmcpOworCQlpZiAoIGVxdWV1ZS5zaXplKCkhPTEgKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZXF1ZXVlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrR3JhbW1hclNlbWFudGljc1dhcm5pbmcoRXJyb3JRdWV1ZSBlcXVldWUsCisJCQkJCQkJCQkJCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UpCisJCXRocm93cyBFeGNlcHRpb24KKwl7CisJCU1lc3NhZ2UgZm91bmRNc2cgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVxdWV1ZS53YXJuaW5ncy5zaXplKCk7IGkrKykgeworCQkJTWVzc2FnZSBtID0gKE1lc3NhZ2UpZXF1ZXVlLndhcm5pbmdzLmdldChpKTsKKwkJCWlmIChtLm1zZ0lEPT1leHBlY3RlZE1lc3NhZ2UubXNnSUQgKSB7CisJCQkJZm91bmRNc2cgPSBtOworCQkJfQorCQl9CisJCWFzc2VydE5vdE51bGwoIm5vIGVycm9yOyAiK2V4cGVjdGVkTWVzc2FnZS5tc2dJRCsiIGV4cGVjdGVkIiwgZm91bmRNc2cpOworCQlhc3NlcnRUcnVlKCJlcnJvciBpcyBub3QgYSBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSIsCisJCQkJICAgZm91bmRNc2cgaW5zdGFuY2VvZiBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZE1lc3NhZ2UuYXJnLCBmb3VuZE1zZy5hcmcpOworCX0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrRXJyb3IoRXJyb3JRdWV1ZSBlcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVycm9ycz0iK2VxdWV1ZSk7CisgICAgICAgIE1lc3NhZ2UgZm91bmRNc2cgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVxdWV1ZS5lcnJvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKG0ubXNnSUQ9PWV4cGVjdGVkTWVzc2FnZS5tc2dJRCApIHsKKyAgICAgICAgICAgICAgICBmb3VuZE1zZyA9IG07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgibm8gZXJyb3I7ICIrZXhwZWN0ZWRNZXNzYWdlLm1zZ0lEKyIgZXhwZWN0ZWQiLCBlcXVldWUuZXJyb3JzLnNpemUoKT4wKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidG9vIG1hbnkgZXJyb3JzOyAiK2VxdWV1ZS5lcnJvcnMsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpPD0xKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiY291bGRuJ3QgZmluZCBleHBlY3RlZCBlcnJvcjogIitleHBlY3RlZE1lc3NhZ2UubXNnSUQsIGZvdW5kTXNnKTsKKyAgICAgICAgLyoKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZXJyb3IgaXMgbm90IGEgR3JhbW1hclNlbWFudGljc01lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgIGZvdW5kTXNnIGluc3RhbmNlb2YgR3JhbW1hclNlbWFudGljc01lc3NhZ2UpOworICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS5hcmcsIGZvdW5kTXNnLmFyZyk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE1lc3NhZ2UuYXJnMiwgZm91bmRNc2cuYXJnMik7CisgICAgICAgIEVycm9yTWFuYWdlci5yZXNldEVycm9yU3RhdGUoKTsgLy8gd2FjayBlcnJvcnMgZm9yIG5leHQgdGVzdAorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWFtVmFjdXVtIGltcGxlbWVudHMgUnVubmFibGUgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlCdWZmZXJlZFJlYWRlciBpbjsKKwkJVGhyZWFkIHN1Y2tlcjsKKwkJU3RyaW5nIGlucHV0RmlsZTsKKwkJcHVibGljIFN0cmVhbVZhY3V1bShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGlucHV0RmlsZSkgeworCQkJdGhpcy5pbiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSApOworCQkJdGhpcy5pbnB1dEZpbGUgPSBpbnB1dEZpbGU7CisJCX0KKwkJcHVibGljIHZvaWQgc3RhcnQoKSB7CisJCQlzdWNrZXIgPSBuZXcgVGhyZWFkKHRoaXMpOworCQkJc3Vja2VyLnN0YXJ0KCk7CisJCX0KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgbGluZSA9IGluLnJlYWRMaW5lKCk7CisJCQkJd2hpbGUgKGxpbmUhPW51bGwpIHsKKwkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aChpbnB1dEZpbGUpKQorCQkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKGlucHV0RmlsZS5sZW5ndGgoKSsxKTsKKwkJCQkJYnVmLmFwcGVuZChsaW5lKTsKKwkJCQkJYnVmLmFwcGVuZCgnXG4nKTsKKwkJCQkJbGluZSA9IGluLnJlYWRMaW5lKCk7CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiY2FuJ3QgcmVhZCBvdXRwdXQgZnJvbSBwcm9jZXNzIik7CisJCQl9CisJCX0KKwkJLyoqIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoICovCisJCXB1YmxpYyB2b2lkIGpvaW4oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQkJc3Vja2VyLmpvaW4oKTsKKwkJfQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCQl9CisJfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXJpbmdUb2tlblN0cmVhbSBleHRlbmRzIENvbW1vblRva2VuU3RyZWFtIHsKKyAgICAgICAgcHVibGljIEZpbHRlcmluZ1Rva2VuU3RyZWFtKFRva2VuU291cmNlIHNyYykgeyBzdXBlcihzcmMpOyB9CisgICAgICAgIFNldDxJbnRlZ2VyPiBoaWRlID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3luYyhpbnQgaSkgeworICAgICAgICAgICAgc3VwZXIuc3luYyhpKTsKKyAgICAgICAgICAgIGlmICggaGlkZS5jb250YWlucyhnZXQoaSkuZ2V0VHlwZSgpKSApIGdldChpKS5zZXRDaGFubmVsKFRva2VuLkhJRERFTl9DSEFOTkVMKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlblR5cGVDaGFubmVsKGludCB0dHlwZSwgaW50IGNoYW5uZWwpIHsKKyAgICAgICAgICAgIGhpZGUuYWRkKHR0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworCXByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBjb250ZW50KSB7CisJCXRyeSB7CisJCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKKwkJCUZpbGVXcml0ZXIgdyA9IG5ldyBGaWxlV3JpdGVyKGYpOworCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIodyk7CisJCQlidy53cml0ZShjb250ZW50KTsKKwkJCWJ3LmNsb3NlKCk7CisJCQl3LmNsb3NlKCk7CisJCX0KKwkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJjYW4ndCB3cml0ZSBmaWxlIik7CisJCQlpb2UucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbWtkaXIoU3RyaW5nIGRpcikgeworCQlGaWxlIGYgPSBuZXcgRmlsZShkaXIpOworCQlmLm1rZGlycygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHdyaXRlVGVzdEZpbGUoU3RyaW5nIHBhcnNlck5hbWUsCisJCQkJCQkJCSBTdHJpbmcgbGV4ZXJOYW1lLAorCQkJCQkJCQkgU3RyaW5nIHBhcnNlclN0YXJ0UnVsZU5hbWUsCisJCQkJCQkJCSBib29sZWFuIGRlYnVnKQorCXsKKwkJU1Qgb3V0cHV0RmlsZVNUID0gbmV3IFNUKAorCQkJImltcG9ydCBvcmcuYW50bHIucnVudGltZS4qO1xuIiArCisJCQkiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjtcbiIgKworCQkJImltcG9ydCBvcmcuYW50bHIucnVudGltZS5kZWJ1Zy4qO1xuIiArCisJCQkiXG4iICsKKwkJCSJjbGFzcyBQcm9maWxlcjIgZXh0ZW5kcyBQcm9maWxlciB7XG4iICsKKwkJCSIgICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgeyA7IH1cbiIgKworCQkJIn1cbiIrCisJCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArCisJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24ge1xuIiArCisJCQkiICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzWzBdKTtcbiIgKworCQkJIiAgICAgICAgPGxleGVyTmFtZT4gbGV4ID0gbmV3IDxsZXhlck5hbWU+KGlucHV0KTtcbiIgKworCQkJIiAgICAgICAgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleCk7XG4iICsKKwkJCSIgICAgICAgIDxjcmVhdGVQYXJzZXI+XG4iKworCQkJIiAgICAgICAgcGFyc2VyLjxwYXJzZXJTdGFydFJ1bGVOYW1lPigpO1xuIiArCisJCQkiICAgIH1cbiIgKworCQkJIn0iCisJCQkpOworCQlTVCBjcmVhdGVQYXJzZXJTVCA9CisJCQluZXcgU1QoCisJCQkiICAgICAgICBQcm9maWxlcjIgcHJvZmlsZXIgPSBuZXcgUHJvZmlsZXIyKCk7XG4iKworCQkJIiAgICAgICAgPHBhcnNlck5hbWU+IHBhcnNlciA9IG5ldyA8cGFyc2VyTmFtZT4odG9rZW5zLHByb2ZpbGVyKTtcbiIgKworCQkJIiAgICAgICAgcHJvZmlsZXIuc2V0UGFyc2VyKHBhcnNlcik7XG4iKTsKKwkJaWYgKCAhZGVidWcgKSB7CisJCQljcmVhdGVQYXJzZXJTVCA9CisJCQkJbmV3IFNUKAorCQkJCSIgICAgICAgIDxwYXJzZXJOYW1lPiBwYXJzZXIgPSBuZXcgPHBhcnNlck5hbWU+KHRva2Vucyk7XG4iKTsKKwkJfQorCQlvdXRwdXRGaWxlU1QuYWRkKCJjcmVhdGVQYXJzZXIiLCBjcmVhdGVQYXJzZXJTVCk7CisJCW91dHB1dEZpbGVTVC5hZGQoInBhcnNlck5hbWUiLCBwYXJzZXJOYW1lKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgibGV4ZXJOYW1lIiwgbGV4ZXJOYW1lKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgicGFyc2VyU3RhcnRSdWxlTmFtZSIsIHBhcnNlclN0YXJ0UnVsZU5hbWUpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiVGVzdC5qYXZhIiwgb3V0cHV0RmlsZVNULnJlbmRlcigpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZUxleGVyVGVzdEZpbGUoU3RyaW5nIGxleGVyTmFtZSwgYm9vbGVhbiBkZWJ1ZykgeworCQlTVCBvdXRwdXRGaWxlU1QgPSBuZXcgU1QoCisJCQkiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7XG4iICsKKwkJCSJpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS4qO1xuIiArCisJCQkiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLmRlYnVnLio7XG4iICsKKwkJCSJcbiIgKworCQkJImNsYXNzIFByb2ZpbGVyMiBleHRlbmRzIFByb2ZpbGVyIHtcbiIgKworCQkJIiAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7IDsgfVxuIiArCisJCQkifVxuIisKKwkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsKKwkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsKKwkJCSIgICAgICAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGFyZ3NbMF0pO1xuIiArCisJCQkiICAgICAgICA8bGV4ZXJOYW1lPiBsZXggPSBuZXcgPGxleGVyTmFtZT4oaW5wdXQpO1xuIiArCisJCQkiICAgICAgICBDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTtcbiIgKworCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRva2Vucyk7XG4iICsKKwkJCSIgICAgfVxuIiArCisJCQkifSIKKwkJCSk7CisJCW91dHB1dEZpbGVTVC5hZGQoImxleGVyTmFtZSIsIGxleGVyTmFtZSk7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJUZXN0LmphdmEiLCBvdXRwdXRGaWxlU1QucmVuZGVyKCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHdyaXRlVHJlZVRlc3RGaWxlKFN0cmluZyBwYXJzZXJOYW1lLAorCQkJCQkJCQkJIFN0cmluZyB0cmVlUGFyc2VyTmFtZSwKKwkJCQkJCQkJCSBTdHJpbmcgbGV4ZXJOYW1lLAorCQkJCQkJCQkJIFN0cmluZyBwYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkJIFN0cmluZyB0cmVlUGFyc2VyU3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJCSBib29sZWFuIGRlYnVnKQorCXsKKwkJU1Qgb3V0cHV0RmlsZVNUID0gbmV3IFNUKAorCQkJImltcG9ydCBvcmcuYW50bHIucnVudGltZS4qO1xuIiArCisJCQkiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjtcbiIgKworCQkJImltcG9ydCBvcmcuYW50bHIucnVudGltZS5kZWJ1Zy4qO1xuIiArCisJCQkiXG4iICsKKwkJCSJjbGFzcyBQcm9maWxlcjIgZXh0ZW5kcyBQcm9maWxlciB7XG4iICsKKwkJCSIgICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgeyA7IH1cbiIgKworCQkJIn1cbiIrCisJCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArCisJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24ge1xuIiArCisJCQkiICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzWzBdKTtcbiIgKworCQkJIiAgICAgICAgPGxleGVyTmFtZT4gbGV4ID0gbmV3IDxsZXhlck5hbWU+KGlucHV0KTtcbiIgKworCQkJIiAgICAgICAgVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4KTtcbiIgKworCQkJIiAgICAgICAgPGNyZWF0ZVBhcnNlcj5cbiIrCisJCQkiICAgICAgICA8cGFyc2VyTmFtZT4uPHBhcnNlclN0YXJ0UnVsZU5hbWU+X3JldHVybiByID0gcGFyc2VyLjxwYXJzZXJTdGFydFJ1bGVOYW1lPigpO1xuIiArCisJCQkiICAgICAgICA8aWYoIXRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lKT5cbiIgKworCQkJIiAgICAgICAgaWYgKCByLnRyZWUhPW51bGwgKSB7XG4iICsKKwkJCSIgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKChUcmVlKXIudHJlZSkudG9TdHJpbmdUcmVlKCkpO1xuIiArCisJCQkiICAgICAgICAgICAgKChDb21tb25UcmVlKXIudHJlZSkuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTtcbiIgKworCQkJIgkJIH1cbiIgKworCQkJIiAgICAgICAgPGVsc2U+XG4iICsKKwkJCSIgICAgICAgIENvbW1vblRyZWVOb2RlU3RyZWFtIG5vZGVzID0gbmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKChUcmVlKXIudHJlZSk7XG4iICsKKwkJCSIgICAgICAgIG5vZGVzLnNldFRva2VuU3RyZWFtKHRva2Vucyk7XG4iICsKKwkJCSIgICAgICAgIDx0cmVlUGFyc2VyTmFtZT4gd2Fsa2VyID0gbmV3IDx0cmVlUGFyc2VyTmFtZT4obm9kZXMpO1xuIiArCisJCQkiICAgICAgICB3YWxrZXIuPHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lPigpO1xuIiArCisJCQkiICAgICAgICA8ZW5kaWY+XG4iICsKKwkJCSIgICAgfVxuIiArCisJCQkifSIKKwkJCSk7CisJCVNUIGNyZWF0ZVBhcnNlclNUID0KKwkJCW5ldyBTVCgKKwkJCSIgICAgICAgIFByb2ZpbGVyMiBwcm9maWxlciA9IG5ldyBQcm9maWxlcjIoKTtcbiIrCisJCQkiICAgICAgICA8cGFyc2VyTmFtZT4gcGFyc2VyID0gbmV3IDxwYXJzZXJOYW1lPih0b2tlbnMscHJvZmlsZXIpO1xuIiArCisJCQkiICAgICAgICBwcm9maWxlci5zZXRQYXJzZXIocGFyc2VyKTtcbiIpOworCQlpZiAoICFkZWJ1ZyApIHsKKwkJCWNyZWF0ZVBhcnNlclNUID0KKwkJCQluZXcgU1QoCisJCQkJIiAgICAgICAgPHBhcnNlck5hbWU+IHBhcnNlciA9IG5ldyA8cGFyc2VyTmFtZT4odG9rZW5zKTtcbiIpOworCQl9CisJCW91dHB1dEZpbGVTVC5hZGQoImNyZWF0ZVBhcnNlciIsIGNyZWF0ZVBhcnNlclNUKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgicGFyc2VyTmFtZSIsIHBhcnNlck5hbWUpOworCQlvdXRwdXRGaWxlU1QuYWRkKCJ0cmVlUGFyc2VyTmFtZSIsIHRyZWVQYXJzZXJOYW1lKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgibGV4ZXJOYW1lIiwgbGV4ZXJOYW1lKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgicGFyc2VyU3RhcnRSdWxlTmFtZSIsIHBhcnNlclN0YXJ0UnVsZU5hbWUpOworCQlvdXRwdXRGaWxlU1QuYWRkKCJ0cmVlUGFyc2VyU3RhcnRSdWxlTmFtZSIsIHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlRlc3QuamF2YSIsIG91dHB1dEZpbGVTVC5yZW5kZXIoKSk7CisJfQorCisJLyoqIFBhcnNlciBjcmVhdGVzIHRyZWVzIGFuZCBzbyBkb2VzIHRoZSB0cmVlIHBhcnNlciAqLworCXByb3RlY3RlZCB2b2lkIHdyaXRlVHJlZUFuZFRyZWVUZXN0RmlsZShTdHJpbmcgcGFyc2VyTmFtZSwKKwkJCQkJCQkJCQkJU3RyaW5nIHRyZWVQYXJzZXJOYW1lLAorCQkJCQkJCQkJCQlTdHJpbmcgbGV4ZXJOYW1lLAorCQkJCQkJCQkJCQlTdHJpbmcgcGFyc2VyU3RhcnRSdWxlTmFtZSwKKwkJCQkJCQkJCQkJU3RyaW5nIHRyZWVQYXJzZXJTdGFydFJ1bGVOYW1lLAorCQkJCQkJCQkJCQlib29sZWFuIGRlYnVnKQorCXsKKwkJU1Qgb3V0cHV0RmlsZVNUID0gbmV3IFNUKAorCQkJImltcG9ydCBvcmcuYW50bHIucnVudGltZS4qO1xuIiArCisJCQkiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjtcbiIgKworCQkJImltcG9ydCBvcmcuYW50bHIucnVudGltZS5kZWJ1Zy4qO1xuIiArCisJCQkiXG4iICsKKwkJCSJjbGFzcyBQcm9maWxlcjIgZXh0ZW5kcyBQcm9maWxlciB7XG4iICsKKwkJCSIgICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgeyA7IH1cbiIgKworCQkJIn1cbiIrCisJCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArCisJCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24ge1xuIiArCisJCQkiICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSRmlsZVN0cmVhbShhcmdzWzBdKTtcbiIgKworCQkJIiAgICAgICAgPGxleGVyTmFtZT4gbGV4ID0gbmV3IDxsZXhlck5hbWU+KGlucHV0KTtcbiIgKworCQkJIiAgICAgICAgVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4KTtcbiIgKworCQkJIiAgICAgICAgPGNyZWF0ZVBhcnNlcj5cbiIrCisJCQkiICAgICAgICA8cGFyc2VyTmFtZT4uPHBhcnNlclN0YXJ0UnVsZU5hbWU+X3JldHVybiByID0gcGFyc2VyLjxwYXJzZXJTdGFydFJ1bGVOYW1lPigpO1xuIiArCisJCQkiICAgICAgICAoKENvbW1vblRyZWUpci50cmVlKS5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpO1xuIiArCisJCQkiICAgICAgICBDb21tb25UcmVlTm9kZVN0cmVhbSBub2RlcyA9IG5ldyBDb21tb25UcmVlTm9kZVN0cmVhbSgoVHJlZSlyLnRyZWUpO1xuIiArCisJCQkiICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpO1xuIiArCisJCQkiICAgICAgICA8dHJlZVBhcnNlck5hbWU+IHdhbGtlciA9IG5ldyA8dHJlZVBhcnNlck5hbWU+KG5vZGVzKTtcbiIgKworCQkJIiAgICAgICAgPHRyZWVQYXJzZXJOYW1lPi48dHJlZVBhcnNlclN0YXJ0UnVsZU5hbWU+X3JldHVybiByMiA9IHdhbGtlci48dHJlZVBhcnNlclN0YXJ0UnVsZU5hbWU+KCk7XG4iICsKKwkJCSIJCSBDb21tb25UcmVlIHJ0ID0gKChDb21tb25UcmVlKXIyLnRyZWUpO1xuIiArCisJCQkiCQkgaWYgKCBydCE9bnVsbCApIFN5c3RlbS5vdXQucHJpbnRsbigoKENvbW1vblRyZWUpcjIudHJlZSkudG9TdHJpbmdUcmVlKCkpO1xuIiArCisJCQkiICAgIH1cbiIgKworCQkJIn0iCisJCQkpOworCQlTVCBjcmVhdGVQYXJzZXJTVCA9CisJCQluZXcgU1QoCisJCQkiICAgICAgICBQcm9maWxlcjIgcHJvZmlsZXIgPSBuZXcgUHJvZmlsZXIyKCk7XG4iKworCQkJIiAgICAgICAgPHBhcnNlck5hbWU+IHBhcnNlciA9IG5ldyA8cGFyc2VyTmFtZT4odG9rZW5zLHByb2ZpbGVyKTtcbiIgKworCQkJIiAgICAgICAgcHJvZmlsZXIuc2V0UGFyc2VyKHBhcnNlcik7XG4iKTsKKwkJaWYgKCAhZGVidWcgKSB7CisJCQljcmVhdGVQYXJzZXJTVCA9CisJCQkJbmV3IFNUKAorCQkJCSIgICAgICAgIDxwYXJzZXJOYW1lPiBwYXJzZXIgPSBuZXcgPHBhcnNlck5hbWU+KHRva2Vucyk7XG4iKTsKKwkJfQorCQlvdXRwdXRGaWxlU1QuYWRkKCJjcmVhdGVQYXJzZXIiLCBjcmVhdGVQYXJzZXJTVCk7CisJCW91dHB1dEZpbGVTVC5hZGQoInBhcnNlck5hbWUiLCBwYXJzZXJOYW1lKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgidHJlZVBhcnNlck5hbWUiLCB0cmVlUGFyc2VyTmFtZSk7CisJCW91dHB1dEZpbGVTVC5hZGQoImxleGVyTmFtZSIsIGxleGVyTmFtZSk7CisJCW91dHB1dEZpbGVTVC5hZGQoInBhcnNlclN0YXJ0UnVsZU5hbWUiLCBwYXJzZXJTdGFydFJ1bGVOYW1lKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgidHJlZVBhcnNlclN0YXJ0UnVsZU5hbWUiLCB0cmVlUGFyc2VyU3RhcnRSdWxlTmFtZSk7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJUZXN0LmphdmEiLCBvdXRwdXRGaWxlU1QucmVuZGVyKCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHdyaXRlVGVtcGxhdGVUZXN0RmlsZShTdHJpbmcgcGFyc2VyTmFtZSwKKwkJCQkJCQkJCQkgU3RyaW5nIGxleGVyTmFtZSwKKwkJCQkJCQkJCQkgU3RyaW5nIHBhcnNlclN0YXJ0UnVsZU5hbWUsCisJCQkJCQkJCQkJIGJvb2xlYW4gZGVidWcpCisJeworCQlTVCBvdXRwdXRGaWxlU1QgPSBuZXcgU1QoCisJCQkiaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7XG4iICsKKwkJCSJpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLio7XG4iICsKKwkJCSJpbXBvcnQgb3JnLmFudGxyLnN0cmluZ3RlbXBsYXRlLmxhbmd1YWdlLio7XG4iICsKKwkJCSJpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuZGVidWcuKjtcbiIgKworCQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsKKwkJCSJcbiIgKworCQkJImNsYXNzIFByb2ZpbGVyMiBleHRlbmRzIFByb2ZpbGVyIHtcbiIgKworCQkJIiAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7IDsgfVxuIiArCisJCQkifVxuIisKKwkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsKKwkJCSIgICAgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZXMgPSBcImdyb3VwIFQ7IGZvbyh4LHkpIDo6PSBcXFwiXFw8eD4gXFw8eT5cXFwiXCI7XG4iICsKKwkJCSIgICAgc3RhdGljIFN0cmluZ1RlbXBsYXRlR3JvdXAgZ3JvdXAgPSIrCisJCQkiICAgIAkJbmV3IFN0cmluZ1RlbXBsYXRlR3JvdXAobmV3IFN0cmluZ1JlYWRlcih0ZW1wbGF0ZXMpLCIgKworCQkJIgkJCQkJQW5nbGVCcmFja2V0VGVtcGxhdGVMZXhlci5jbGFzcyk7IisKKwkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7XG4iICsKKwkJCSIgICAgICAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJGaWxlU3RyZWFtKGFyZ3NbMF0pO1xuIiArCisJCQkiICAgICAgICA8bGV4ZXJOYW1lPiBsZXggPSBuZXcgPGxleGVyTmFtZT4oaW5wdXQpO1xuIiArCisJCQkiICAgICAgICBDb21tb25Ub2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4KTtcbiIgKworCQkJIiAgICAgICAgPGNyZWF0ZVBhcnNlcj5cbiIrCisJCQkiCQkgcGFyc2VyLnNldFRlbXBsYXRlTGliKGdyb3VwKTtcbiIrCisJCQkiICAgICAgICA8cGFyc2VyTmFtZT4uPHBhcnNlclN0YXJ0UnVsZU5hbWU+X3JldHVybiByID0gcGFyc2VyLjxwYXJzZXJTdGFydFJ1bGVOYW1lPigpO1xuIiArCisJCQkiICAgICAgICBpZiAoIHIuc3QhPW51bGwgKVxuIiArCisJCQkiICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChyLnN0LnRvU3RyaW5nKCkpO1xuIiArCisJCQkiCSAJIGVsc2VcbiIgKworCQkJIiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoXCJcIik7XG4iICsKKwkJCSIgICAgfVxuIiArCisJCQkifSIKKwkJCSk7CisJCVNUIGNyZWF0ZVBhcnNlclNUID0KKwkJCW5ldyBTVCgKKwkJCSIgICAgICAgIFByb2ZpbGVyMiBwcm9maWxlciA9IG5ldyBQcm9maWxlcjIoKTtcbiIrCisJCQkiICAgICAgICA8cGFyc2VyTmFtZT4gcGFyc2VyID0gbmV3IDxwYXJzZXJOYW1lPih0b2tlbnMscHJvZmlsZXIpO1xuIiArCisJCQkiICAgICAgICBwcm9maWxlci5zZXRQYXJzZXIocGFyc2VyKTtcbiIpOworCQlpZiAoICFkZWJ1ZyApIHsKKwkJCWNyZWF0ZVBhcnNlclNUID0KKwkJCQluZXcgU1QoCisJCQkJIiAgICAgICAgPHBhcnNlck5hbWU+IHBhcnNlciA9IG5ldyA8cGFyc2VyTmFtZT4odG9rZW5zKTtcbiIpOworCQl9CisJCW91dHB1dEZpbGVTVC5hZGQoImNyZWF0ZVBhcnNlciIsIGNyZWF0ZVBhcnNlclNUKTsKKwkJb3V0cHV0RmlsZVNULmFkZCgicGFyc2VyTmFtZSIsIHBhcnNlck5hbWUpOworCQlvdXRwdXRGaWxlU1QuYWRkKCJsZXhlck5hbWUiLCBsZXhlck5hbWUpOworCQlvdXRwdXRGaWxlU1QuYWRkKCJwYXJzZXJTdGFydFJ1bGVOYW1lIiwgcGFyc2VyU3RhcnRSdWxlTmFtZSk7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJUZXN0LmphdmEiLCBvdXRwdXRGaWxlU1QucmVuZGVyKCkpOworCX0KKworICAgIHByb3RlY3RlZCB2b2lkIGVyYXNlRmlsZXMoZmluYWwgU3RyaW5nIGZpbGVzRW5kaW5nV2l0aCkgeworICAgICAgICBGaWxlIHRtcGRpckYgPSBuZXcgRmlsZSh0bXBkaXIpOworICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHRtcGRpckYubGlzdCgpOworICAgICAgICBmb3IoaW50IGkgPSAwOyBmaWxlcyE9bnVsbCAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICggZmlsZXNbaV0uZW5kc1dpdGgoZmlsZXNFbmRpbmdXaXRoKSApIHsKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSh0bXBkaXIrIi8iK2ZpbGVzW2ldKS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGVyYXNlRmlsZXMoKSB7CisgICAgICAgIEZpbGUgdG1wZGlyRiA9IG5ldyBGaWxlKHRtcGRpcik7CisgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gdG1wZGlyRi5saXN0KCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGZpbGVzIT1udWxsICYmIGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbmV3IEZpbGUodG1wZGlyKyIvIitmaWxlc1tpXSkuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBlcmFzZVRlbXBEaXIoKSB7CisgICAgICAgIEZpbGUgdG1wZGlyRiA9IG5ldyBGaWxlKHRtcGRpcik7CisgICAgICAgIGlmICggdG1wZGlyRi5leGlzdHMoKSApIHsKKyAgICAgICAgICAgIGVyYXNlRmlsZXMoKTsKKyAgICAgICAgICAgIHRtcGRpckYuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZpcnN0TGluZU9mRXhjZXB0aW9uKCkgeworCQlpZiAoIHRoaXMuc3RkZXJyRHVyaW5nUGFyc2UgPT1udWxsICkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nW10gbGluZXMgPSB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlLnNwbGl0KCJcbiIpOworCQlTdHJpbmcgcHJlZml4PSJFeGNlcHRpb24gaW4gdGhyZWFkIFwibWFpblwiICI7CisJCXJldHVybiBsaW5lc1swXS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpLGxpbmVzWzBdLmxlbmd0aCgpKTsKKwl9CisKKwlwdWJsaWMgTGlzdCByZWFsRWxlbWVudHMoTGlzdCBlbGVtZW50cykgeworCQlMaXN0IG4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSBMYWJlbC5OVU1fRkFVWF9MQUJFTFMrTGFiZWwuTUlOX1RPS0VOX1RZUEUgLSAxOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKKwkJCU9iamVjdCBvID0gKE9iamVjdCkgZWxlbWVudHMuZ2V0KGkpOworCQkJaWYgKCBvIT1udWxsICkgeworCQkJCW4uYWRkKG8pOworCQkJfQorCQl9CisJCXJldHVybiBuOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVhbEVsZW1lbnRzKE1hcDxTdHJpbmcsIEludGVnZXI+IGVsZW1lbnRzKSB7CisJCUxpc3QgbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdG9rZW5JRCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmICggZWxlbWVudHMuZ2V0KHRva2VuSUQpID49IExhYmVsLk1JTl9UT0tFTl9UWVBFICkgeworCQkJCW4uYWRkKHRva2VuSUQrIj0iK2VsZW1lbnRzLmdldCh0b2tlbklEKSk7CisJCQl9CisJCX0KKwkJQ29sbGVjdGlvbnMuc29ydChuKTsKKwkJcmV0dXJuIG47CisJfQorCisgICAgcHVibGljIFN0cmluZyBzb3J0TGluZXNJblN0cmluZyhTdHJpbmcgcykgeworICAgICAgICBTdHJpbmcgbGluZXNbXSA9IHMuc3BsaXQoIlxuIik7CisgICAgICAgIEFycmF5cy5zb3J0KGxpbmVzKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpbmVzTCA9IEFycmF5cy5hc0xpc3QobGluZXMpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKFN0cmluZyBsIDogbGluZXNMKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGwpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBsb29raW5nIGF0IGEgcmVzdWx0IHNldCB0aGF0IGNvbnNpc3RzIG9mIGEgTWFwL0hhc2hUYWJsZQorICAgICAqIHdlIGNhbm5vdCByZWx5IG9uIHRoZSBvdXRwdXQgb3JkZXIsIGFzIHRoZSBoYXNoaW5nIGFsZ29yaXRobSBvciBvdGhlciBhc3BlY3RzCisgICAgICogb2YgdGhlIGltcGxlbWVudGF0aW9uIG1heSBiZSBkaWZmZXJlbnQgb24gZGlmZmVybnQgSkRLcyBvciBwbGF0Zm9ybXMuIEhlbmNlCisgICAgICogd2UgdGFrZSB0aGUgTWFwLCBjb252ZXJ0IHRoZSBrZXlzIHRvIGEgTGlzdCwgc29ydCB0aGVtIGFuZCBTdHJpbmdpZnkgdGhlIE1hcCwgd2hpY2ggaXMgYQorICAgICAqIGJpdCBvZiBhIGhhY2ssIGJ1dCBndWFyYW50ZWVzIHRoYXQgd2UgZ2V0IHRoZSBzYW1lIG9yZGVyIG9uIGFsbCBzeXN0ZW1zLiBXZSBhc3N1bWUgdGhhdAorICAgICAqIHRoZSBrZXlzIGFyZSBzdHJpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIG0gVGhlIE1hcCB0aGF0IGNvbnRhaW5zIGtleXMgd2Ugd2lzaCB0byByZXR1cm4gaW4gc29ydGVkIG9yZGVyCisgICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYWxsIHRoZSBrZXlzIGluIHNvcnRlZCBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNvcnRNYXBUb1N0cmluZyhNYXAgbSkgeworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFwIHRvU3RyaW5nIGxvb2tzIGxpa2U6ICIgKyBtLnRvU3RyaW5nKCkpOworICAgICAgICAvLyBQYXNzIGluIGNyYXAsIGFuZCBnZXQgbm90aGluZyBiYWNrCisgICAgICAgIC8vCisgICAgICAgIGlmICAobSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQgdGhlIGtleXMgaW4gdGhlIE1hcAorICAgICAgICAvLworICAgICAgICBUcmVlTWFwIG5zZXQgPSBuZXcgVHJlZU1hcChtKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyZWUgbWFwIGxvb2tzIGxpa2U6ICIgKyBuc2V0LnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gbnNldC50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlIHRvIHRyYWNrIGVycm9ycworCisgICAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtc2csIE9iamVjdCBhLCBPYmplY3QgYikgeyB0cnkge0Fzc2VydC5hc3NlcnRFcXVhbHMobXNnLGEsYik7fSBjYXRjaCAoRXJyb3IgZSkge2xhc3RUZXN0RmFpbGVkPXRydWU7IHRocm93IGU7fSB9CisgICAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKE9iamVjdCBhLCBPYmplY3QgYikgeyB0cnkge0Fzc2VydC5hc3NlcnRFcXVhbHMoYSxiKTt9IGNhdGNoIChFcnJvciBlKSB7bGFzdFRlc3RGYWlsZWQ9dHJ1ZTsgdGhyb3cgZTt9IH0KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1zZywgbG9uZyBhLCBsb25nIGIpIHsgdHJ5IHtBc3NlcnQuYXNzZXJ0RXF1YWxzKG1zZyxhLGIpO30gY2F0Y2ggKEVycm9yIGUpIHtsYXN0VGVzdEZhaWxlZD10cnVlOyB0aHJvdyBlO30gfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhsb25nIGEsIGxvbmcgYikgeyB0cnkge0Fzc2VydC5hc3NlcnRFcXVhbHMoYSxiKTt9IGNhdGNoIChFcnJvciBlKSB7bGFzdFRlc3RGYWlsZWQ9dHJ1ZTsgdGhyb3cgZTt9IH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydFRydWUoU3RyaW5nIG1zZywgYm9vbGVhbiBiKSB7IHRyeSB7QXNzZXJ0LmFzc2VydFRydWUobXNnLGIpO30gY2F0Y2ggKEVycm9yIGUpIHtsYXN0VGVzdEZhaWxlZD10cnVlOyB0aHJvdyBlO30gfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydFRydWUoYm9vbGVhbiBiKSB7IHRyeSB7QXNzZXJ0LmFzc2VydFRydWUoYik7fSBjYXRjaCAoRXJyb3IgZSkge2xhc3RUZXN0RmFpbGVkPXRydWU7IHRocm93IGU7fSB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRGYWxzZShTdHJpbmcgbXNnLCBib29sZWFuIGIpIHsgdHJ5IHtBc3NlcnQuYXNzZXJ0RmFsc2UobXNnLGIpO30gY2F0Y2ggKEVycm9yIGUpIHtsYXN0VGVzdEZhaWxlZD10cnVlOyB0aHJvdyBlO30gfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydEZhbHNlKGJvb2xlYW4gYikgeyB0cnkge0Fzc2VydC5hc3NlcnRGYWxzZShiKTt9IGNhdGNoIChFcnJvciBlKSB7bGFzdFRlc3RGYWlsZWQ9dHJ1ZTsgdGhyb3cgZTt9IH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoU3RyaW5nIG1zZywgT2JqZWN0IHApIHsgdHJ5IHtBc3NlcnQuYXNzZXJ0Tm90TnVsbChtc2csIHApO30gY2F0Y2ggKEVycm9yIGUpIHtsYXN0VGVzdEZhaWxlZD10cnVlOyB0aHJvdyBlO30gfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoT2JqZWN0IHApIHsgdHJ5IHtBc3NlcnQuYXNzZXJ0Tm90TnVsbChwKTt9IGNhdGNoIChFcnJvciBlKSB7bGFzdFRlc3RGYWlsZWQ9dHJ1ZTsgdGhyb3cgZTt9IH0KKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE51bGwoU3RyaW5nIG1zZywgT2JqZWN0IHApIHsgdHJ5IHtBc3NlcnQuYXNzZXJ0TnVsbChtc2csIHApO30gY2F0Y2ggKEVycm9yIGUpIHtsYXN0VGVzdEZhaWxlZD10cnVlOyB0aHJvdyBlO30gfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydE51bGwoT2JqZWN0IHApIHsgdHJ5IHtBc3NlcnQuYXNzZXJ0TnVsbChwKTt9IGNhdGNoIChFcnJvciBlKSB7bGFzdFRlc3RGYWlsZWQ9dHJ1ZTsgdGhyb3cgZTt9IH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvRGVidWdUZXN0QXV0b0FTVC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9EZWJ1Z1Rlc3RBdXRvQVNULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlNDgwMAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvRGVidWdUZXN0QXV0b0FTVC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworcHVibGljIGNsYXNzIERlYnVnVGVzdEF1dG9BU1QgZXh0ZW5kcyBUZXN0QXV0b0FTVCB7CisJcHVibGljIERlYnVnVGVzdEF1dG9BU1QoKSB7ZGVidWc9dHJ1ZTt9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L0RlYnVnVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L0RlYnVnVGVzdENvbXBvc2l0ZUdyYW1tYXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0N2QwZgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvRGVidWdUZXN0Q29tcG9zaXRlR3JhbW1hcnMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK3B1YmxpYyBjbGFzcyBEZWJ1Z1Rlc3RDb21wb3NpdGVHcmFtbWFycyBleHRlbmRzIFRlc3RDb21wb3NpdGVHcmFtbWFycyB7CisJcHVibGljIERlYnVnVGVzdENvbXBvc2l0ZUdyYW1tYXJzKCkge2RlYnVnPXRydWU7fQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9EZWJ1Z1Rlc3RSZXdyaXRlQVNULmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L0RlYnVnVGVzdFJld3JpdGVBU1QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDA1ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9EZWJ1Z1Rlc3RSZXdyaXRlQVNULmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitwdWJsaWMgY2xhc3MgRGVidWdUZXN0UmV3cml0ZUFTVCBleHRlbmRzIFRlc3RSZXdyaXRlQVNUIHsKKwlwdWJsaWMgRGVidWdUZXN0UmV3cml0ZUFTVCgpIHtkZWJ1Zz10cnVlO30KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9FcnJvclF1ZXVlLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L0Vycm9yUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGM3YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9FcnJvclF1ZXVlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLnRvb2wuQU5UTFJFcnJvckxpc3RlbmVyOworaW1wb3J0IG9yZy5hbnRsci50b29sLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuVG9vbE1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEVycm9yUXVldWUgaW1wbGVtZW50cyBBTlRMUkVycm9yTGlzdGVuZXIgeworCUxpc3QgaW5mb3MgPSBuZXcgTGlua2VkTGlzdCgpOworCUxpc3QgZXJyb3JzID0gbmV3IExpbmtlZExpc3QoKTsKKwlMaXN0IHdhcm5pbmdzID0gbmV3IExpbmtlZExpc3QoKTsKKworCXB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1zZykgeworCQlpbmZvcy5hZGQobXNnKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlcnJvcihNZXNzYWdlIG1zZykgeworCQllcnJvcnMuYWRkKG1zZyk7CisJfQorCisJcHVibGljIHZvaWQgd2FybmluZyhNZXNzYWdlIG1zZykgeworCQl3YXJuaW5ncy5hZGQobXNnKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlcnJvcihUb29sTWVzc2FnZSBtc2cpIHsKKwkJZXJyb3JzLmFkZChtc2cpOworCX0KKworCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJcmV0dXJuIGluZm9zLnNpemUoKSArIGVycm9ycy5zaXplKCkgKyB3YXJuaW5ncy5zaXplKCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJpbmZvczogIitpbmZvcysKKwkJCSJlcnJvcnM6ICIrZXJyb3JzKworCQkJIndhcm5pbmdzOiAiK3dhcm5pbmdzOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0QVNUQ29uc3RydWN0aW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RBU1RDb25zdHJ1Y3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRmMTJhCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0QVNUQ29uc3RydWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0QVNUQ29uc3RydWN0aW9uIGV4dGVuZHMgQmFzZVRlc3QgeworCisgICAgLyoqIFB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQgYnkgVGVzdFJpZyAqLworICAgIHB1YmxpYyBUZXN0QVNUQ29uc3RydWN0aW9uKCkgeworICAgIH0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCQkiYSA6IEE7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCBBIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkJImEgOiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCBlcHNpbG9uIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROYWtlUnVsZVBsdXNJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJsZXhlciBncmFtbWFyIFA7XG4iKworCQkJCSJBIDogQis7XG4iICsKKwkJCQkiQiA6ICdhJzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgQSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgrIChCTE9DSyAoQUxUIEIgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJBIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkJImEgOiAoYikrO1xuIiArCisJCQkJImIgOiBCOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIocnVsZSBhIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKCsgKEJMT0NLIChBTFQgYiA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5ha2VkUnVsZVBsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJCSJhIDogYis7XG4iICsKKwkJCQkiYiA6IEI7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKyAoQkxPQ0sgKEFMVCBiIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZU9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCQkiYSA6IChiKT87XG4iICsKKwkJCQkiYiA6IEI7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoPyAoQkxPQ0sgKEFMVCBiIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TmFrZWRSdWxlT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJCSJhIDogYj87XG4iICsKKwkJCQkiYiA6IEI7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoPyAoQkxPQ0sgKEFMVCBiIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZVN0YXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJCSJhIDogKGIpKjtcbiIgKworCQkJCSJiIDogQjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgqIChCTE9DSyAoQUxUIGIgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROYWtlZFJ1bGVTdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCQkiYSA6IGIqO1xuIiArCisJCQkJImIgOiBCOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIocnVsZSBhIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKCogKEJMT0NLIChBTFQgYiA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENoYXJTdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogJ2EnKjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgqIChCTE9DSyAoQUxUICdhJyA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENoYXJTdGFySW5MZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCQkiQiA6ICdiJyo7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIEIgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKiAoQkxPQ0sgKEFMVCAnYicgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJCIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogJ3doaWxlJyo7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKiAoQkxPQ0sgKEFMVCAnd2hpbGUnIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU3RhckluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImxleGVyIGdyYW1tYXIgUDtcbiIrCisJCQkJIkIgOiAnd2hpbGUnKjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgQiBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgqIChCTE9DSyAoQUxUICd3aGlsZScgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJCIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDaGFyUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciBQO1xuIisKKwkJCQkiYSA6ICdhJys7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKyAoQkxPQ0sgKEFMVCAnYScgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDaGFyUGx1c0luTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImxleGVyIGdyYW1tYXIgUDtcbiIrCisJCQkJIkIgOiAnYicrOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIocnVsZSBCIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKCsgKEJMT0NLIChBTFQgJ2InIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiQiIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2hhck9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogJ2EnPzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICg/IChCTE9DSyAoQUxUICdhJyA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENoYXJPcHRpb25hbEluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImxleGVyIGdyYW1tYXIgUDtcbiIrCisJCQkJIkIgOiAnYic/OyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIocnVsZSBCIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKD8gKEJMT0NLIChBTFQgJ2InIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiQiIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2hhclJhbmdlUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCQkiSUQgOiAnYScuLid6Jys7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIElEIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKCsgKEJMT0NLIChBTFQgKC4uICdhJyAneicpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiSUQiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogeD1JRDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICg9IHggSUQpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMYWJlbE9mT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgUDtcbiIrCisJCQkJImEgOiB4PUlEPzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICg/IChCTE9DSyAoQUxUICg9IHggSUQpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxPZkNsb3N1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgUDtcbiIrCisJCQkJImEgOiB4PUlEKjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgqIChCTE9DSyAoQUxUICg9IHggSUQpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogeD1iO1xuIiArCisJCQkJImIgOiBJRDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIocnVsZSBhIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKD0geCBiKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2V0TGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgUDtcbiIrCisJCQkJImEgOiB4PShBfEIpO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoPSB4IChCTE9DSyAoQUxUIEEgPGVuZC1vZi1hbHQ+KSAoQUxUIEIgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RTZXRMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciBQO1xuIisKKwkJCQkiYSA6IHg9fihBfEIpO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoPSB4ICh+IChCTE9DSyAoQUxUIEEgPGVuZC1vZi1hbHQ+KSAoQUxUIEIgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0TGlzdExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogeCs9fihBfEIpO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKz0geCAofiAoQkxPQ0sgKEFMVCBBIDxlbmQtb2YtYWx0PikgKEFMVCBCIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdFNldExpc3RMYWJlbEluTG9vcCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciBQO1xuIisKKwkJCQkiYSA6IHgrPX4oQXxCKSs7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgrIChCTE9DSyAoQUxUICgrPSB4ICh+IChCTE9DSyAoQUxUIEEgPGVuZC1vZi1hbHQ+KSAoQUxUIEIgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVMYWJlbE9mUG9zaXRpdmVDbG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogeD1iKztcbiIgKworCQkJCSJiIDogSUQ7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICgrIChCTE9DSyAoQUxUICg9IHggYikgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMaXN0TGFiZWxPZkNsb3N1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgUDtcbiIrCisJCQkJImEgOiB4Kz1JRCo7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKiAoQkxPQ0sgKEFMVCAoKz0geCBJRCkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pIDxlbmQtb2YtcnVsZT4pIjsKKwkJU3RyaW5nIGZvdW5kID0gZy5nZXRSdWxlKCJhIikudHJlZS50b1N0cmluZ1RyZWUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMaXN0TGFiZWxPZkNsb3N1cmUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iKworCQkJCSJhIDogeCs9J2ludCcqOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIocnVsZSBhIEFSRyBSRVQgc2NvcGUgKEJMT0NLIChBTFQgKCogKEJMT0NLIChBTFQgKCs9IHggJ2ludCcpIDxlbmQtb2YtYWx0PikgPGVuZC1vZi1ibG9jaz4pKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgiYSIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxpc3RMYWJlbE9mUG9zaXRpdmVDbG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIFA7XG4iICsKKwkJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iKworCQkJCSJhIDogeCs9Yis7XG4iICsKKwkJCQkiYiA6IElEO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIihydWxlIGEgQVJHIFJFVCBzY29wZSAoQkxPQ0sgKEFMVCAoKyAoQkxPQ0sgKEFMVCAoKz0geCBiKSA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSkgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikiOworCQlTdHJpbmcgZm91bmQgPSBnLmdldFJ1bGUoImEiKS50cmVlLnRvU3RyaW5nVHJlZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJvb3RUb2tlbkluU3Rhckxvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgRXhwcjtcbiIgKworCQkJCSJvcHRpb25zIHsgb3V0cHV0PUFTVDsgYmFja3RyYWNrPXRydWU7IH1cbiIgKworCQkJCSJhIDogKCcqJ14pKiA7XG4iKTsgIC8vIGJ1ZzogdGhlIHN5bnByZWQgaGFkIG5vdGhpbmcgaW4gaXQKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgc3lucHJlZDFfRXhwciBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUICcqJyA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgic3lucHJlZDFfRXhwciIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uSW5TdGFyTG9vcCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciBFeHByO1xuIiArCisJCQkJIm9wdGlvbnMgeyBiYWNrdHJhY2s9dHJ1ZTsgfVxuIiArCisJCQkJImEgOiAoe2Jsb3J0fSAneCcpKiA7XG4iKTsgIC8vIGJ1ZzogdGhlIHN5bnByZWQgaGFkIG5vdGhpbmcgaW4gaXQKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKHJ1bGUgc3lucHJlZDFfRXhwciBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUIGJsb3J0ICd4JyA8ZW5kLW9mLWFsdD4pIDxlbmQtb2YtYmxvY2s+KSA8ZW5kLW9mLXJ1bGU+KSI7CisJCVN0cmluZyBmb3VuZCA9IGcuZ2V0UnVsZSgic3lucHJlZDFfRXhwciIpLnRyZWUudG9TdHJpbmdUcmVlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEF0dHJpYnV0ZXMuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEF0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZmZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0QXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsMzExOCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3JhbW1hci52My5BTlRMUlBhcnNlcjsKK2ltcG9ydCBvcmcuYW50bHIuZ3JhbW1hci52My5BY3Rpb25UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1RHcm91cDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIENoZWNrIHRoZSAkeCwgJHgueSBhdHRyaWJ1dGVzLiAgRm9yIGNoZWNraW5nIHRoZSBhY3R1YWwKKyAqICB0cmFuc2xhdGlvbiwgYXNzdW1lIHRoZSBKYXZhIHRhcmdldC4gIFRoaXMgaXMgc3RpbGwgYSBncmVhdCB0ZXN0CisgKiAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhlICR4Lnkgc3R1ZmYgcmVnYXJkbGVzcyBvZiB0aGUgdGFyZ2V0LgorICovCitwdWJsaWMgY2xhc3MgVGVzdEF0dHJpYnV0ZXMgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKwkvKiogUHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlZCBieSBUZXN0UmlnICovCisJcHVibGljIFRlc3RBdHRyaWJ1dGVzKCkgeworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkTGVzc1RoYW5JbkFjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlTdHJpbmcgYWN0aW9uID0gImk8MzsgJzx4bWx0YWc+JyI7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlTVEdyb3VwIHRlbXBsYXRlcyA9CisJCQluZXcgU1RHcm91cCgpOworCQlTVCBhY3Rpb25TVCA9IG5ldyBTVCh0ZW1wbGF0ZXMsICI8YWN0aW9uPiIpOworCQlhY3Rpb25TVC5hZGQoImFjdGlvbiIsIHJhd1RyYW5zbGF0aW9uKTsKKwkJU3RyaW5nIGZvdW5kID0gYWN0aW9uU1QucmVuZGVyKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZCRJbkFjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gImludCBcXCRuOyBcIlxcJGluIHN0cmluZ1xcJFwiIjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpbnQgJG47IFwiJGluIHN0cmluZyRcIiI7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJAbWVtYmVycyB7IithY3Rpb24rIn1cbiIrCisJCQkJImFbVXNlciB1LCBpbnQgaV1cbiIgKworCQkJCSIgICAgICAgIDogeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICAgICAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiYSIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDApOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBcmd1bWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkaTsgJGkueDsgJHU7ICR1LngiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImk7IGkueDsgdTsgdS54IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhW1VzZXIgdSwgaW50IGldXG4iICsKKwkJCQkiICAgICAgICA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgICAgICAgOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxpY2F0ZWRBcmdQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAieCwgKCphKS5mb28oMjEsMzMpLCAzLjIrMSwgJ1xcbicsICIrCisJCQkiXCJhLG9vXFxuaWNrXCIsIHtibCwgXCJmZGtqXCJlY2t9IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ4LCAoKmEpLmZvbygyMSwzMyksIDMuMisxLCAnXFxuJywgXCJhLG9vXFxuaWNrXCIsIHtibCwgXCJmZGtqXCJlY2t9IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisKKwkJLy8gbm93IGNoZWNrIGluIGFjdHVhbCBncmFtbWFyLgorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYVtVc2VyIHUsIGludCBpXVxuIiArCisJCQkJIiAgICAgICAgOiBBIGFbIithY3Rpb24rIl0gQlxuIiArCisJCQkJIiAgICAgICAgOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJhd1RyYW5zbGF0aW9uKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCcmFja2V0QXJnUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisKKwkJLy8gbm93IGNoZWNrIGluIGFjdHVhbCBncmFtbWFyLgorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYVtTdHJpbmdbXFxdIGljaywgaW50IGldXG4iICsKKwkJCQkiICAgICAgICA6IEEgXG4iKworCQkJCSIgICAgICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlSdWxlIHIgPSBnLmdldFJ1bGUoImEiKTsKKwkJQXR0cmlidXRlU2NvcGUgcGFyYW1ldGVycyA9IHIucGFyYW1ldGVyU2NvcGU7CisJCUxpc3Q8QXR0cmlidXRlPiBhdHRycyA9IHBhcmFtZXRlcnMuZ2V0QXR0cmlidXRlcygpOworCQlhc3NlcnRFcXVhbHMoImF0dHJpYnV0ZSBtaXNtYXRjaCIsIlN0cmluZ1tdIGljayIsYXR0cnMuZ2V0KDApLmRlY2wudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygicGFyYW1ldGVyIG5hbWUgbWlzbWF0Y2giLCJpY2siLGF0dHJzLmdldCgwKS5uYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJkZWNsYXJhdG9yIG1pc21hdGNoIiwgIlN0cmluZ1tdIiwgYXR0cnMuZ2V0KDApLnR5cGUpOworCisJCWFzc2VydEVxdWFscygiYXR0cmlidXRlIG1pc21hdGNoIiwiaW50IGkiLGF0dHJzLmdldCgxKS5kZWNsLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoInBhcmFtZXRlciBuYW1lIG1pc21hdGNoIiwiaSIsYXR0cnMuZ2V0KDEpLm5hbWUpOworCQlhc3NlcnRFcXVhbHMoImRlY2xhcmF0b3IgbWlzbWF0Y2giLCAiaW50IiwgYXR0cnMuZ2V0KDEpLnR5cGUpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN0cmluZ0FyZ1BhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIzNCwgJ3snLCBcIml0J3M8XCIsICdcIicsIFwiXFxcIlwiLCAxOSI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiMzQsICd7JywgXCJpdCdzPFwiLCAnXCInLCBcIlxcXCJcIiwgMTkiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQkvLyBub3cgY2hlY2sgaW4gYWN0dWFsIGdyYW1tYXIuCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhW1VzZXIgdSwgaW50IGldXG4iICsKKwkJCQkiICAgICAgICA6IEEgYVsiK2FjdGlvbisiXSBCXG4iICsKKwkJCQkiICAgICAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0JdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmF3VHJhbnNsYXRpb24pOworCisJCUxpc3Q8U3RyaW5nPiBleHBlY3RBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgeworCQkJe2FkZCgiMzQiKTt9CisJCQl7YWRkKCIneyciKTt9CisJCQl7YWRkKCJcIml0J3M8XCIiKTt9CisJCQl7YWRkKCInXCInIik7fQorCQkJe2FkZCgiXCJcXFwiXCIiKTt9IC8vIHRoYXQncyAiXCIiCisJCQl7YWRkKCIxOSIpO30KKwkJfTsKKwkJTGlzdDxTdHJpbmc+IGFjdHVhbEFyZ3MgPSBDb2RlR2VuZXJhdG9yLmdldExpc3RPZkFyZ3VtZW50c0Zyb21BY3Rpb24oYWN0aW9uLCAnLCcpOworCQlhc3NlcnRFcXVhbHMoImFyZ3MgbWlzbWF0Y2giLCBleHBlY3RBcmdzLCBhY3R1YWxBcmdzKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDb21wbGljYXRlZFNpbmdsZUFyZ1BhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIoKmEpLmZvbygyMSwzMyxcIixcIikiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIigqYSkuZm9vKDIxLDMzLFwiLFwiKSI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisJCS8vIG5vdyBjaGVjayBpbiBhY3R1YWwgZ3JhbW1hci4KKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImFbVXNlciB1LCBpbnQgaV1cbiIgKworCQkJCSIgICAgICAgIDogQSBhWyIrYWN0aW9uKyJdIEJcbiIgKworCQkJCSIgICAgICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgcmF3VHJhbnNsYXRpb24gPQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByYXdUcmFuc2xhdGlvbik7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXJnV2l0aExUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiMzQ8NTAiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIjM0PDUwIjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisKKwkJLy8gbm93IGNoZWNrIGluIGFjdHVhbCBncmFtbWFyLgorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYVtib29sZWFuIGJdXG4iICsKKwkJCQkiICAgICAgICA6IEEgYVsiK2FjdGlvbisiXSBCXG4iICsKKwkJCQkiICAgICAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0KKwkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJhd1RyYW5zbGF0aW9uKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljc0FzQXJndW1lbnREZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGZvby5nZXQoXCJpY2tcIik7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJmb28uZ2V0KFwiaWNrXCIpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIrCisJCQkJImFbSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBmb29dXG4iICsKKwkJCQkiICAgICAgICA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgICAgICAgOyI7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGdyYW1tYXIpOworCQlSdWxlIHJhID0gZy5nZXRSdWxlKCJhIik7CisJCUxpc3Q8QXR0cmlidXRlPiBhdHRycyA9IHJhLnBhcmFtZXRlclNjb3BlLmdldEF0dHJpYnV0ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGUgbWlzbWF0Y2giLCJIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGZvbyIsYXR0cnMuZ2V0KDApLmRlY2wudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygicGFyYW1ldGVyIG5hbWUgbWlzbWF0Y2giLCJmb28iLGF0dHJzLmdldCgwKS5uYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJkZWNsYXJhdG9yIG1pc21hdGNoIiwgIkhhc2hNYXA8U3RyaW5nLFN0cmluZz4iLCBhdHRycy5nZXQoMCkudHlwZSk7CisKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzQXNBcmd1bWVudERlZmluaXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGZvby5nZXQoXCJpY2tcIik7IHg9MzsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImZvby5nZXQoXCJpY2tcIik7IHg9MzsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJInBhcnNlciBncmFtbWFyIFQ7XG4iKworCQkJCSJhW0hhc2hNYXA8U3RyaW5nLFN0cmluZz4gZm9vLCBpbnQgeCwgTGlzdDxTdHJpbmc+IGR1aF1cbiIgKworCQkJCSIgICAgICAgIDogeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICAgICAgICA7IjsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCVJ1bGUgcmEgPSBnLmdldFJ1bGUoImEiKTsKKwkJTGlzdDxBdHRyaWJ1dGU+IGF0dHJzID0gcmEucGFyYW1ldGVyU2NvcGUuZ2V0QXR0cmlidXRlcygpOworCisJCWFzc2VydEVxdWFscygiYXR0cmlidXRlIG1pc21hdGNoIiwiSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBmb28iLGF0dHJzLmdldCgwKS5kZWNsLnRvU3RyaW5nKCkudHJpbSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJwYXJhbWV0ZXIgbmFtZSBtaXNtYXRjaCIsImZvbyIsYXR0cnMuZ2V0KDApLm5hbWUpOworCQlhc3NlcnRFcXVhbHMoImRlY2xhcmF0b3IgbWlzbWF0Y2giLCAiSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiIsIGF0dHJzLmdldCgwKS50eXBlKTsKKworCQlhc3NlcnRFcXVhbHMoImF0dHJpYnV0ZSBtaXNtYXRjaCIsImludCB4IixhdHRycy5nZXQoMSkuZGVjbC50b1N0cmluZygpLnRyaW0oKSk7CisJCWFzc2VydEVxdWFscygicGFyYW1ldGVyIG5hbWUgbWlzbWF0Y2giLCJ4IixhdHRycy5nZXQoMSkubmFtZSk7CisJCWFzc2VydEVxdWFscygiZGVjbGFyYXRvciBtaXNtYXRjaCIsICJpbnQiLCBhdHRycy5nZXQoMSkudHlwZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGUgbWlzbWF0Y2giLCJMaXN0PFN0cmluZz4gZHVoIixhdHRycy5nZXQoMikuZGVjbC50b1N0cmluZygpLnRyaW0oKSk7CisJCWFzc2VydEVxdWFscygicGFyYW1ldGVyIG5hbWUgbWlzbWF0Y2giLCJkdWgiLGF0dHJzLmdldCgyKS5uYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJkZWNsYXJhdG9yIG1pc21hdGNoIiwgIkxpc3Q8U3RyaW5nPiIsIGF0dHJzLmdldCgyKS50eXBlKTsKKworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3NBc1JldHVyblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJInBhcnNlciBncmFtbWFyIFQ7XG4iKworCQkJCSJhIHJldHVybnMgW0hhc2hNYXA8U3RyaW5nLFN0cmluZz4gZm9vXSA6IDtcbiI7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGdyYW1tYXIpOworCQlSdWxlIHJhID0gZy5nZXRSdWxlKCJhIik7CisJCUxpc3Q8QXR0cmlidXRlPiBhdHRycyA9IHJhLnJldHVyblNjb3BlLmdldEF0dHJpYnV0ZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGUgbWlzbWF0Y2giLCJIYXNoTWFwPFN0cmluZyxTdHJpbmc+IGZvbyIsYXR0cnMuZ2V0KDApLmRlY2wudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygicGFyYW1ldGVyIG5hbWUgbWlzbWF0Y2giLCJmb28iLGF0dHJzLmdldCgwKS5uYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJkZWNsYXJhdG9yIG1pc21hdGNoIiwgIkhhc2hNYXA8U3RyaW5nLFN0cmluZz4iLCBhdHRycy5nZXQoMCkudHlwZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxpY2F0ZWRBcmdQYXJzaW5nV2l0aFRyYW5zbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAieCwgJEEudGV4dCtcIjMyNDJcIiwgKCokQSkuZm9vKDIxLDMzKSwgMy4yKzEsICdcXG4nLCAiKworCQkJIlwiYSxvb1xcbmlja1wiLCB7YmwsIFwiZmRralwiZWNrfSI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieCwgKEExIT1udWxsP0ExLmdldFRleHQoKTpudWxsKStcIjMyNDJcIiwgKCpBMSkuZm9vKDIxLDMzKSwgMy4yKzEsICdcXG4nLCBcImEsb29cXG5pY2tcIiwge2JsLCBcImZka2pcImVja30iOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQkvLyBub3cgY2hlY2sgaW4gYWN0dWFsIGdyYW1tYXIuCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhW1VzZXIgdSwgaW50IGldXG4iICsKKwkJCQkiICAgICAgICA6IEEgYVsiK2FjdGlvbisiXSBCXG4iICsKKwkJCQkiICAgICAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCS8qKiAkeC5zdGFydCByZWZzIGFyZSBjaGVja2VkIGR1cmluZyB0cmFuc2xhdGlvbiBub3QgYmVmb3JlIHNvIEFOVExSIG1pc3NlcworCSB0aGUgZmFjdCB0aGF0IHJ1bGUgciBoYXMgcmVmcyB0byBwcmVkZWZpbmVkIGF0dHJpYnV0ZXMgaWYgdGhlIHJlZiBpcyBhZnRlcgorCSB0aGUgZGVmIG9mIHRoZSBtZXRob2Qgb3Igc2VsZi1yZWZlcmVudGlhbC4gIEFjdHVhbGx5IHdvdWxkIGJlIG9rIGlmIEkgZGlkbid0CisJIGNvbnZlcnQgYWN0aW9ucyB0byBzdHJpbmdzOyBrZWVwIGFzIHRlbXBsYXRlcy4KKwkgSnVuZSA5LCAyMDA2OiBtYWRlIGFjdGlvbiB0cmFuc2xhdGlvbiBsZWF2ZSB0ZW1wbGF0ZXMgbm90IHN0cmluZ3MKKwkgKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVmVG9SZXR1cm5WYWx1ZUJlZm9yZVJlZlRvUHJlZGVmaW5lZEF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkeC5mb28iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIih4IT1udWxsP3guZm9vOjApIjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogeD1iIHsiK2FjdGlvbisifSA7XG4iICsKKwkJCQkiYiByZXR1cm5zIFtpbnQgZm9vXSA6IEIgeyRiLnN0YXJ0fSA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxhYmVsQmVmb3JlUmVmVG9QcmVkZWZpbmVkQXR0cigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBcyBvZiBNYXIgMjAwNywgSSdtIHJlbW92aW5nIHVudXNlZCBsYWJlbHMuICBVbmZvcnR1bmF0ZWx5LAorCQkvLyB0aGUgYWN0aW9uIGlzIG5vdCBzZWVuIHVudGlsIGNvZGUgZ2VuLiAgQ2FuJ3Qgc2VlICR4LnRleHQKKwkJLy8gYmVmb3JlIHN0cmlwcGluZyB1bnVzZWQgbGFiZWxzLiAgV2UgcmVhbGx5IG5lZWQgdG8gdHJhbnNsYXRlCisJCS8vIGFjdGlvbnMgZmlyc3Qgc28gY29kZSBnZW4gbG9naWMgY2FuIHVzZSBpbmZvLgorCQlTdHJpbmcgYWN0aW9uID0gIiR4LnRleHQiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIih4IT1udWxsP2lucHV0LnRvU3RyaW5nKHguc3RhcnQseC5zdG9wKTpudWxsKSI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6IHg9YiB7IyMjIithY3Rpb24rIiEhIX0gO1xuIiArCisJCQkJImIgOiBCIDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBjb2RlZ2VuIHBoYXNlIHNldHMgc29tZSB2YXJzIHdlIG5lZWQKKwkJU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworCQlTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKwkJU3RyaW5nIGZvdW5kID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCIjIyMiKSszLGNvZGUuaW5kZXhPZigiISEhIikpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEludmFsaWRBcmd1bWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkeCI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYVtVc2VyIHUsIGludCBpXVxuIiArCisJCQkJIiAgICAgICAgOiB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgICAgICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1VOS05PV05fU0lNUExFX0FUVFJJQlVURTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIngiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJldHVyblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHguaSI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieCI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIHJldHVybnMgW2ludCBpXVxuIiArCisJCQkJIiAgICAgICAgOiAnYSdcbiIgKworCQkJCSIgICAgICAgIDtcbiIgKworCQkJCSJiIDogeD1hIHsiK2FjdGlvbisifSA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJiIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9CXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBY3Rpb25Ob3RNb3ZlZFRvU3luUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRiID0gdHJ1ZTsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInJldHZhbC5iID0gdHJ1ZTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKyAvLyBwdXNoIGIgaW50byByZXR2YWwgc3RydWN0CisJCQkiYSByZXR1cm5zIFtib29sZWFuIGJdXG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iICsKKwkJCSIgICA6ICdhJyB7IithY3Rpb24rIn1cbiIgKworCQkJIiAgIHwgJ2EnXG4iICsKKwkJCSIgICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJhIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9CXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXR1cm5WYWx1ZVdpdGhOdW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkeC5pMSI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieCI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIHJldHVybnMgW2ludCBpMV1cbiIgKworCQkJCSIgICAgICAgIDogJ2EnXG4iICsKKwkJCQkiICAgICAgICA7XG4iICsKKwkJCQkiYiA6IHg9YSB7IithY3Rpb24rIn0gO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiYiIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGk7ICRpLng7ICR1OyAkdS54IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJyZXR2YWwuaTsgcmV0dmFsLmkueDsgcmV0dmFsLnU7IHJldHZhbC51LngiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgcmV0dXJucyBbVXNlciB1LCBpbnQgaV1cbiIgKworCQkJCSIgICAgICAgIDogeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICAgICAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJLyogcmVncmVzc2lvbiB0ZXN0IGZvciBBTlRMUi00NiAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXR1cm5XaXRoTXVsdGlwbGVSdWxlUmVmcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uMSA9ICIkb2JqID0gJHJ1bGUyLm9iajsiOworCQlTdHJpbmcgYWN0aW9uMiA9ICIkb2JqID0gJHJ1bGUzLm9iajsiOworCQlTdHJpbmcgZXhwZWN0aW5nMSA9ICJvYmogPSBydWxlMjE7IjsKKwkJU3RyaW5nIGV4cGVjdGluZzIgPSAib2JqID0gcnVsZTMyOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCQkicnVsZTEgcmV0dXJucyBbIE9iamVjdCBvYmogXVxuIiArCisJCQkJIjoJcnVsZTIgeyAiK2FjdGlvbjErIiB9XG4iICsKKwkJCQkifAlydWxlMyB7ICIrYWN0aW9uMisiIH1cbiIgKworCQkJCSI7XG4iKworCQkJCSJydWxlMiByZXR1cm5zIFsgT2JqZWN0IG9iaiBdXG4iKworCQkJCSI6CWZvbz0nZm9vJyB7ICRvYmogPSAkZm9vLnRleHQ7IH1cbiIrCisJCQkJIjtcbiIrCisJCQkJInJ1bGUzIHJldHVybnMgWyBPYmplY3Qgb2JqIF1cbiIrCisJCQkJIjoJYmFyPSdiYXInIHsgJG9iaiA9ICRiYXIudGV4dDsgfVxuIisKKwkJCQkiOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCWludCBpID0gMDsKKwkJU3RyaW5nIGFjdGlvbiA9IGFjdGlvbjE7CisJCVN0cmluZyBleHBlY3RpbmcgPSBleHBlY3RpbmcxOworCQlkbyB7CisJCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsInJ1bGUxIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksaSsxKTsKKwkJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJCQlhY3Rpb24gPSBhY3Rpb24yOworCQkJZXhwZWN0aW5nID0gZXhwZWN0aW5nMjsKKwkJfSB3aGlsZSAoaSsrIDwgMSk7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEludmFsaWRSZXR1cm5WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkeCI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYSByZXR1cm5zIFtVc2VyIHUsIGludCBpXVxuIiArCisJCQkJIiAgICAgICAgOiB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgICAgICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTktOT1dOX1NJTVBMRV9BVFRSSUJVVEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJ4IjsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkxhYmVscygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRpZDsgJGY7ICRpZC50ZXh0OyAkaWQuZ2V0VGV4dCgpOyAkaWQuZG9yayAiICsKKwkJCSIkaWQudHlwZTsgJGlkLmxpbmU7ICRpZC5wb3M7ICIgKworCQkJIiRpZC5jaGFubmVsOyAkaWQuaW5kZXg7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpZDsgZjsgKGlkIT1udWxsP2lkLmdldFRleHQoKTpudWxsKTsgaWQuZ2V0VGV4dCgpOyBpZC5kb3JrIChpZCE9bnVsbD9pZC5nZXRUeXBlKCk6MCk7IChpZCE9bnVsbD9pZC5nZXRMaW5lKCk6MCk7IChpZCE9bnVsbD9pZC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTowKTsgKGlkIT1udWxsP2lkLmdldENoYW5uZWwoKTowKTsgKGlkIT1udWxsP2lkLmdldFRva2VuSW5kZXgoKTowKTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZD1JRCBmPUZMT0FUIHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlTGFiZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHIueDsgJHIuc3RhcnQ7XG4gJHIuc3RvcDtcbiAkci50cmVlOyAkYS54OyAkYS5zdG9wOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKHIhPW51bGw/ci54OjApOyAociE9bnVsbD8oKFRva2VuKXIuc3RhcnQpOm51bGwpOyIgKyBuZXdsaW5lICsKKwkJCSIgICAgICAgICAgICAgKHIhPW51bGw/KChUb2tlbilyLnN0b3ApOm51bGwpOyIgKyBuZXdsaW5lICsKKwkJCSIgICAgICAgICAgICAgKHIhPW51bGw/KChPYmplY3Qpci50cmVlKTpudWxsKTsgKHIhPW51bGw/ci54OjApOyAociE9bnVsbD8oKFRva2VuKXIuc3RvcCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhIHJldHVybnMgW2ludCB4XVxuIiArCisJCQkJIiAgOlxuIiArCisJCQkJIiAgO1xuIisKKwkJCQkiYiA6IHI9YSB7IyMjIithY3Rpb24rIiEhIX1cbiIgKworCQkJCSIgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGNvZGVnZW4gcGhhc2Ugc2V0cyBzb21lIHZhcnMgd2UgbmVlZAorCQlTVCBjb2RlU1QgPSBnZW5lcmF0b3IuZ2V0UmVjb2duaXplclNUKCk7CisJCVN0cmluZyBjb2RlID0gY29kZVNULnJlbmRlcigpOworCQlTdHJpbmcgZm91bmQgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoIiMjIyIpKzMsY29kZS5pbmRleE9mKCIhISEiKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VSdWxlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBBIGEgeyRhLnRleHR9IHwgQiA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCS8vIGVycm9yKDEzMik6IDxzdHJpbmc+OjI6OTogcmVmZXJlbmNlICRhIGlzIGFtYmlndW91czsgcnVsZSBhIGlzIGVuY2xvc2luZyBydWxlIGFuZCByZWZlcmVuY2VkIGluIHRoZSBwcm9kdWN0aW9uCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAxLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVMYWJlbHNXaXRoU3BlY2lhbFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHIueDsgJHIuc3RhcnQ7ICRyLnN0b3A7ICRyLnRyZWU7ICRhLng7ICRhLnN0b3A7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIociE9bnVsbD9yLng6MCk7IChyIT1udWxsPygoTVlUT0tFTilyLnN0YXJ0KTpudWxsKTsgKHIhPW51bGw/KChNWVRPS0VOKXIuc3RvcCk6bnVsbCk7IChyIT1udWxsPygoT2JqZWN0KXIudHJlZSk6bnVsbCk7IChyIT1udWxsP3IueDowKTsgKHIhPW51bGw/KChNWVRPS0VOKXIuc3RvcCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJvcHRpb25zIHtUb2tlbkxhYmVsVHlwZT1NWVRPS0VOO31cbiIrCisJCQkJImEgcmV0dXJucyBbaW50IHhdXG4iICsKKwkJCQkiICA6XG4iICsKKwkJCQkiICA7XG4iKworCQkJCSJiIDogcj1hIHsjIyMiK2FjdGlvbisiISEhfVxuIiArCisJCQkJIiAgOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gY29kZWdlbiBwaGFzZSBzZXRzIHNvbWUgdmFycyB3ZSBuZWVkCisKKwkJU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworCQlTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKwkJU3RyaW5nIGZvdW5kID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCIjIyMiKSszLGNvZGUuaW5kZXhPZigiISEhIikpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Rm9yd2FyZFJlZlJ1bGVMYWJlbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkci54OyAkci5zdGFydDsgJHIuc3RvcDsgJHIudHJlZTsgJGEueDsgJGEudHJlZTsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihyIT1udWxsP3IueDowKTsgKHIhPW51bGw/KChUb2tlbilyLnN0YXJ0KTpudWxsKTsgKHIhPW51bGw/KChUb2tlbilyLnN0b3ApOm51bGwpOyAociE9bnVsbD8oKE9iamVjdClyLnRyZWUpOm51bGwpOyAociE9bnVsbD9yLng6MCk7IChyIT1udWxsPygoT2JqZWN0KXIudHJlZSk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJiIDogcj1hIHsjIyMiK2FjdGlvbisiISEhfVxuIiArCisJCQkJIiAgO1xuIiArCisJCQkJImEgcmV0dXJucyBbaW50IHhdXG4iICsKKwkJCQkiICA6IDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gY29kZWdlbiBwaGFzZSBzZXRzIHNvbWUgdmFycyB3ZSBuZWVkCisKKwkJU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworCQlTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKwkJU3RyaW5nIGZvdW5kID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCIjIyMiKSszLGNvZGUuaW5kZXhPZigiISEhIikpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFJ1bGVMYWJlbEFjY2Vzc2VzUGFyYW1ldGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHIueiI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYVtpbnQgel0gcmV0dXJucyBbaW50IHhdXG4iICsKKwkJCQkiICA6XG4iICsKKwkJCQkiICA7XG4iKworCQkJCSJiIDogcj1hWzNdIHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsICJiIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfSU5WQUxJRF9SVUxFX1BBUkFNRVRFUl9SRUY7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJhIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJ6IjsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEludmFsaWRSdWxlTGFiZWxBY2Nlc3Nlc1Njb3BlQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHIubiI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYVxuIiArCisJCQkJInNjb3BlIHsgaW50IG47IH1cbiIgKworCQkJCSIgIDpcbiIgKworCQkJCSIgIDtcbiIrCisJCQkJImIgOiByPWFbM10geyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwgImIiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0lOVkFMSURfUlVMRV9TQ09QRV9BVFRSSUJVVEVfUkVGOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiYSI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAibiI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUnVsZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRyLmJsb3J0IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9IGFjdGlvbjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhW2ludCB6XSByZXR1cm5zIFtpbnQgeF1cbiIgKworCQkJCSIgIDpcbiIgKworCQkJCSIgIDtcbiIrCisJCQkJImIgOiByPWFbM10geyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwgImIiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1VOS05PV05fUlVMRV9BVFRSSUJVVEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJhIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJibG9ydCI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUnVsZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRyIjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9IGFjdGlvbjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhW2ludCB6XSByZXR1cm5zIFtpbnQgeF1cbiIgKworCQkJCSIgIDpcbiIgKworCQkJCSIgIDtcbiIrCisJCQkJImIgOiByPWFbM10geyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwgImIiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgcmF3VHJhbnNsYXRpb24gPQorCQkJdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfSVNPTEFURURfUlVMRV9TQ09QRTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gInIiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gbnVsbDsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdVbmxhYmVsZWRSdWxlQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGEiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gYWN0aW9uOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgcmV0dXJucyBbaW50IHhdOlxuIiArCisJCQkJIiAgO1xuIisKKwkJCQkiYiA6IGEgeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwgImIiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgcmF3VHJhbnNsYXRpb24gPQorCQkJdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfSVNPTEFURURfUlVMRV9TQ09QRTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImEiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vbkR5bmFtaWNBdHRyaWJ1dGVPdXRzaWRlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gInB1YmxpYyB2b2lkIGZvbygpIHsgJHg7IH0iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gYWN0aW9uOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJIkBtZW1iZXJzIHsnK2FjdGlvbisnfVxuIiArCisJCQkJImEgOiA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJbnVsbCwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwwKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfQVRUUklCVVRFX1JFRl9OT1RfSU5fUlVMRTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIngiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vbkR5bmFtaWNBdHRyaWJ1dGVPdXRzaWRlUnVsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICJwdWJsaWMgdm9pZCBmb28oKSB7ICR4Lnk7IH0iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gYWN0aW9uOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJIkBtZW1iZXJzIHsnK2FjdGlvbisnfVxuIiArCisJCQkJImEgOiA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJbnVsbCwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwwKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19BVFRSSUJVVEVfUkVGX05PVF9JTl9SVUxFOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAieCI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAieSI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCS8vIEQgWSBOIEEgTSBJIEMgQSBMIEwgWSAgUyBDIE8gUCBFIEQgIEEgVCBUIFIgSSBCIFUgVCBFIFMKKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCYXNpY0dsb2JhbFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJFN5bWJvbHM6Om5hbWVzLmFkZCgkaWQudGV4dCk7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoKFN5bWJvbHNfc2NvcGUpU3ltYm9sc19zdGFjay5wZWVrKCkpLm5hbWVzLmFkZCgoaWQhPW51bGw/aWQuZ2V0VGV4dCgpOm51bGwpKTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkic2NvcGUgU3ltYm9scyB7XG4iICsKKwkJCQkiICBpbnQgbjtcbiIgKworCQkJCSIgIExpc3QgbmFtZXM7XG4iICsKKwkJCQkifVxuIiArCisJCQkJImEgc2NvcGUgU3ltYm9sczsgOiAoaWQ9SUQgJzsnIHsiK2FjdGlvbisifSApK1xuIiArCisJCQkJIiAgO1xuIiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFVua25vd25HbG9iYWxTY29wZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRTeW1ib2xzOjpuYW1lcy5hZGQoJGlkLnRleHQpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIHNjb3BlIFN5bWJvbHM7IDogKGlkPUlEICc7JyB7IithY3Rpb24rIn0gKStcbiIgKworCQkJCSIgIDtcbiIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDIsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfVU5LTk9XTl9EWU5BTUlDX1NDT1BFOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiU3ltYm9scyI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhlZEdsb2JhbFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJFN5bWJvbHNbLTFdOjpuYW1lcy5hZGQoJGlkLnRleHQpOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIigoU3ltYm9sc19zY29wZSlTeW1ib2xzX3N0YWNrLmVsZW1lbnRBdChTeW1ib2xzX3N0YWNrLnNpemUoKS0xLTEpKS5uYW1lcy5hZGQoKGlkIT1udWxsP2lkLmdldFRleHQoKTpudWxsKSk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJInNjb3BlIFN5bWJvbHMge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkiICBMaXN0IG5hbWVzO1xuIiArCisJCQkJIn1cbiIgKworCQkJCSJhIHNjb3BlIFN5bWJvbHM7IDogKGlkPUlEICc7JyB7IithY3Rpb24rIn0gKStcbiIgKworCQkJCSIgIDtcbiIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3QwSW5kZXhlZEdsb2JhbFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJFN5bWJvbHNbMF06Om5hbWVzLmFkZCgkaWQudGV4dCk7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKChTeW1ib2xzX3Njb3BlKVN5bWJvbHNfc3RhY2suZWxlbWVudEF0KDApKS5uYW1lcy5hZGQoKGlkIT1udWxsP2lkLmdldFRleHQoKTpudWxsKSk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJInNjb3BlIFN5bWJvbHMge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkiICBMaXN0IG5hbWVzO1xuIiArCisJCQkJIn1cbiIgKworCQkJCSJhIHNjb3BlIFN5bWJvbHM7IDogKGlkPUlEICc7JyB7IithY3Rpb24rIn0gKStcbiIgKworCQkJCSIgIDtcbiIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZUluZGV4ZWRHbG9iYWxTY29wZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRTeW1ib2xzWzNdOjpuYW1lcy5hZGQoJGlkLnRleHQpOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIigoU3ltYm9sc19zY29wZSlTeW1ib2xzX3N0YWNrLmVsZW1lbnRBdCgzKSkubmFtZXMuYWRkKChpZCE9bnVsbD9pZC5nZXRUZXh0KCk6bnVsbCkpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJzY29wZSBTeW1ib2xzIHtcbiIgKworCQkJCSIgIGludCBuO1xuIiArCisJCQkJIiAgTGlzdCBuYW1lcztcbiIgKworCQkJCSJ9XG4iICsKKwkJCQkiYSBzY29wZSBTeW1ib2xzOyA6IChpZD1JRCAnOycgeyIrYWN0aW9uKyJ9ICkrXG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2NvcGVBbmRBdHRyaWJ1dGVXaXRoVW5kZXJzY29yZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRmb29fYmFyOjphX2I7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoKGZvb19iYXJfc2NvcGUpZm9vX2Jhcl9zdGFjay5wZWVrKCkpLmFfYjsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkic2NvcGUgZm9vX2JhciB7XG4iICsKKwkJCQkiICBpbnQgYV9iO1xuIiArCisJCQkJIn1cbiIgKworCQkJCSJhIHNjb3BlIGZvb19iYXI7IDogKElEIHsiK2FjdGlvbisifSApK1xuIiArCisJCQkJIiAgO1xuIiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNoYXJlZEdsb2JhbFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJFN5bWJvbHM6Ong7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoKFN5bWJvbHNfc2NvcGUpU3ltYm9sc19zdGFjay5wZWVrKCkpLng7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJInNjb3BlIFN5bWJvbHMge1xuIiArCisJCQkJIiAgU3RyaW5nIHg7XG4iICsKKwkJCQkifVxuIiArCisJCQkJImFcbiIrCisJCQkJInNjb3BlIHsgaW50IHk7IH1cbiIrCisJCQkJInNjb3BlIFN5bWJvbHM7XG4iICsKKwkJCQkiIDogYiB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgO1xuIiArCisJCQkJImIgOiBJRCB7JFN5bWJvbHM6Ong9JElELnRleHR9IDtcbiIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxTY29wZU91dHNpZGVSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAicHVibGljIHZvaWQgZm9vKCkgeyRTeW1ib2xzOjpuYW1lcy5hZGQoJ2ZvbycpO30iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInB1YmxpYyB2b2lkIGZvbygpIHsoKFN5bWJvbHNfc2NvcGUpU3ltYm9sc19zdGFjay5wZWVrKCkpLm5hbWVzLmFkZCgnZm9vJyk7fSI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJzY29wZSBTeW1ib2xzIHtcbiIgKworCQkJCSIgIGludCBuO1xuIiArCisJCQkJIiAgTGlzdCBuYW1lcztcbiIgKworCQkJCSJ9XG4iICsKKwkJCQkiQG1lbWJlcnMgeycrYWN0aW9uKyd9XG4iICsKKwkJCQkiYSA6IFxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVTY29wZU91dHNpZGVSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAicHVibGljIHZvaWQgZm9vKCkgeyRhOjpuYW1lO30iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInB1YmxpYyB2b2lkIGZvbygpIHsoKGFfc2NvcGUpYV9zdGFjay5wZWVrKCkpLm5hbWU7fSI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJAbWVtYmVycyB7IithY3Rpb24rIn1cbiIgKworCQkJCSJhXG4iICsKKwkJCQkic2NvcGUgeyBTdHJpbmcgbmFtZTsgfVxuIiArCisJCQkJIiAgOiB7Zm9vKCk7fVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJbnVsbCwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwwKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCYXNpY1J1bGVTY29wZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRhOjpuOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKChhX3Njb3BlKWFfc3RhY2sucGVlaygpKS5uOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkifSA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFVucXVhbGlmaWVkUnVsZVNjb3BlQWNjZXNzSW5zaWRlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRuOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkifSA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfSVNPTEFURURfUlVMRV9BVFRSSUJVVEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJuIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsCisJCQkJZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdElzb2xhdGVkRHluYW1pY1J1bGVTY29wZVJlZigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRhOyI7IC8vIHJlZmVycyB0byBzdGFjayBub3QgdG9wIG9mIHN0YWNrCisJCVN0cmluZyBleHBlY3RpbmcgPSAiYV9zdGFjazsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYVxuIiArCisJCQkJInNjb3BlIHtcbiIgKworCQkJCSIgIGludCBuO1xuIiArCisJCQkJIn0gOiBiIDtcbiIgKworCQkJCSJiIDogeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsICJiIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdER5bmFtaWNSdWxlU2NvcGVSZWZJblN1YnJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYTo6bjsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIigoYV9zY29wZSlhX3N0YWNrLnBlZWsoKSkubjsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYVxuIiArCisJCQkJInNjb3BlIHtcbiIgKworCQkJCSIgIGZsb2F0IG47XG4iICsKKwkJCQkifSA6IGIgO1xuIiArCisJCQkJImIgOiB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgIDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwgImIiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SXNvbGF0ZWRHbG9iYWxTY29wZVJlZigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRTeW1ib2xzOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiU3ltYm9sc19zdGFjazsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkic2NvcGUgU3ltYm9scyB7XG4iICsKKwkJCQkiICBTdHJpbmcgeDtcbiIgKworCQkJCSJ9XG4iICsKKwkJCQkiYVxuIisKKwkJCQkic2NvcGUgeyBpbnQgeTsgfVxuIisKKwkJCQkic2NvcGUgU3ltYm9scztcbiIgKworCQkJCSIgOiBiIHsiK2FjdGlvbisifVxuIiArCisJCQkJIiA7XG4iICsKKwkJCQkiYiA6IElEIHskU3ltYm9sczo6eD0kSUQudGV4dH0gO1xuIiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVTY29wZUZyb21Bbm90aGVyUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRhOjpuOyI7IC8vIG11c3QgYmUgcXVhbGlmaWVkCisJCVN0cmluZyBleHBlY3RpbmcgPSAiKChhX3Njb3BlKWFfc3RhY2sucGVlaygpKS5uOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgYm9vbGVhbiBuO1xuIiArCisJCQkJIn0gOiBiXG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiYiA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCAiYiIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGdWxseVF1YWxpZmllZFJlZlRvQ3VycmVudFJ1bGVQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYS5pOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiaTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYVtpbnQgaV06IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGdWxseVF1YWxpZmllZFJlZlRvQ3VycmVudFJ1bGVSZXRWYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYS5pOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAicmV0dmFsLmk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgcmV0dXJucyBbaW50IGksIGludCBqXTogeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2V0RnVsbHlRdWFsaWZpZWRSZWZUb0N1cnJlbnRSdWxlUmV0VmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGEuaSA9IDE7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJyZXR2YWwuaSA9IDE7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgcmV0dXJucyBbaW50IGksIGludCBqXTogeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SXNvbGF0ZWRSZWZUb0N1cnJlbnRSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGE7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6ICdhJyB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgIDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0lTT0xBVEVEX1JVTEVfU0NPUEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJhIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsCisJCQkJZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdElzb2xhdGVkUmVmVG9SdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHg7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiB4PWIgeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiYiA6ICdiJyA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19JU09MQVRFRF9SVUxFX1NDT1BFOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAieCI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwkvKiAgSSB0aGluayB0aGVzZSBoYXZlIHRvIGJlIGVycm9ycyAkYS54IG1ha2VzIG5vIHNlbnNlLgorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RGdWxseVF1YWxpZmllZFJlZlRvTGFiZWxJbkN1cnJlbnRSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlTdHJpbmcgYWN0aW9uID0gIiRhLng7IjsKKwkJCVN0cmluZyBleHBlY3RpbmcgPSAieDsiOworCisJCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJCSJhIDogeD0nYScgeyIrYWN0aW9uKyJ9XG4iICsKKwkJCQkJIiAgO1xuIik7CisJCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJCQkJCQkJCQkJCQkJICAgbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0KKwkJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQkJU1RHcm91cCB0ZW1wbGF0ZXMgPQorCQkJCW5ldyBTVEdyb3VwKCk7CisJCQlTVCBhY3Rpb25TVCA9IG5ldyBTVCh0ZW1wbGF0ZXMsIHJhd1RyYW5zbGF0aW9uKTsKKwkJCVN0cmluZyBmb3VuZCA9IGFjdGlvblNULnJlbmRlcigpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCQl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RnVsbHlRdWFsaWZpZWRSZWZUb0xpc3RMYWJlbEluQ3VycmVudFJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYS54OyI7IC8vIG11c3QgYmUgcXVhbGlmaWVkCisJCVN0cmluZyBleHBlY3RpbmcgPSAibGlzdF94OyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogeCs9J2EnIHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCQkJCQkJCQkJCQkJICAgbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RnVsbHlRdWFsaWZpZWRSZWZUb1RlbXBsYXRlQXR0cmlidXRlSW5DdXJyZW50UnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRhLnN0OyI7IC8vIGNhbiBiZSBxdWFsaWZpZWQKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJyZXR2YWwuc3Q7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIrCisJCQkJImEgOiAoQS0+eyRBLnRleHR9KSB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgIDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlUmVmV2hlblJ1bGVIYXNTY29wZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRiLnN0YXJ0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKGIxIT1udWxsPygoVG9rZW4pYjEuc3RhcnQpOm51bGwpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCQkiYSA6IGIgeyMjIyIrYWN0aW9uKyIhISF9IDtcbiIgKworCQkJCSJiXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkifSA6ICdiJyBcbiIgKworCQkJCSIgIDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisKKwkJU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworCQlTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKwkJU3RyaW5nIGZvdW5kID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCIjIyMiKSszLGNvZGUuaW5kZXhPZigiISEhIikpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1Njb3BlUmVmT2tFdmVuVGhvdWdoUnVsZVJlZkV4aXN0cygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRiOjpuOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKChiX3Njb3BlKWJfc3RhY2sucGVlaygpKS5uOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCQkicyA6IGIgO1xuIisKKwkJCQkiYlxuIiArCisJCQkJInNjb3BlIHtcbiIgKworCQkJCSIgIGludCBuO1xuIiArCisJCQkJIn0gOiAnKCcgYiAnKScgeyIrYWN0aW9uKyJ9XG4iICsgLy8gcmVmZXJzIHRvIGN1cnJlbnQgaW52b2NhdGlvbidzIG4KKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsICJiIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWZUb1RlbXBsYXRlQXR0cmlidXRlRm9yQ3VycmVudFJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkc3Q9bnVsbDsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInJldHZhbC5zdCA9bnVsbDsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIgKworCQkJCSJvcHRpb25zIHtvdXRwdXQ9dGVtcGxhdGU7fVxuIisKKwkJCQkiYSA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWZUb1RleHRBdHRyaWJ1dGVGb3JDdXJyZW50UnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiR0ZXh0IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpbnB1dC50b1N0cmluZyhyZXR2YWwuc3RhcnQsaW5wdXQuTFQoLTEpKSI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIiArCisJCQkJIm9wdGlvbnMge291dHB1dD10ZW1wbGF0ZTt9XG4iKworCQkJCSJhIDogeyMjIyIrYWN0aW9uKyIhISF9XG4iICsKKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGNvZGVnZW4gcGhhc2Ugc2V0cyBzb21lIHZhcnMgd2UgbmVlZAorCQlTVCBjb2RlU1QgPSBnZW5lcmF0b3IuZ2V0UmVjb2duaXplclNUKCk7CisJCVN0cmluZyBjb2RlID0gY29kZVNULnJlbmRlcigpOworCQlTdHJpbmcgZm91bmQgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoIiMjIyIpKzMsY29kZS5pbmRleE9mKCIhISEiKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWZUb1N0YXJ0QXR0cmlidXRlRm9yQ3VycmVudFJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkc3RhcnQ7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoKFRva2VuKXJldHZhbC5zdGFydCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCQkiYSA6IHsjIyMiK2FjdGlvbisiISEhfVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLCJhIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworCQlTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKwkJU3RyaW5nIGZvdW5kID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCIjIyMiKSszLGNvZGUuaW5kZXhPZigiISEhIikpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5MYWJlbEZyb21NdWx0aXBsZUFsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkSUQudGV4dDsiOyAvLyBtdXN0IGJlIHF1YWxpZmllZAorCQlTdHJpbmcgYWN0aW9uMiA9ICIkSU5ULnRleHQ7IjsgLy8gbXVzdCBiZSBxdWFsaWZpZWQKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoSUQxIT1udWxsP0lEMS5nZXRUZXh0KCk6bnVsbCk7IjsKKwkJU3RyaW5nIGV4cGVjdGluZzIgPSAiKElOVDIhPW51bGw/SU5UMi5nZXRUZXh0KCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBJRCB7IithY3Rpb24rIn1cbiIgKworCQkJCSIgIHwgSU5UIHsiK2FjdGlvbjIrIn1cbiIgKworCQkJCSIgIDtcbiIgKworCQkJCSJJRCA6ICdhJztcbiIgKworCQkJCSJJTlQgOiAnMCc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJCXRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbjIpLDIpOworCQlmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcyLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxhYmVsRnJvbU11bHRpcGxlQWx0cygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRiLnRleHQ7IjsgLy8gbXVzdCBiZSBxdWFsaWZpZWQKKwkJU3RyaW5nIGFjdGlvbjIgPSAiJGMudGV4dDsiOyAvLyBtdXN0IGJlIHF1YWxpZmllZAorCQlTdHJpbmcgZXhwZWN0aW5nID0gIihiMSE9bnVsbD9pbnB1dC50b1N0cmluZyhiMS5zdGFydCxiMS5zdG9wKTpudWxsKTsiOworCQlTdHJpbmcgZXhwZWN0aW5nMiA9ICIoYzIhPW51bGw/aW5wdXQudG9TdHJpbmcoYzIuc3RhcnQsYzIuc3RvcCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBiIHsjIyMiK2FjdGlvbisiISEhfVxuIiArCisJCQkJIiAgfCBjIHteXl4iK2FjdGlvbjIrIiYmJn1cbiIgKworCQkJCSIgIDtcbiIgKworCQkJCSJiIDogJ2EnO1xuIiArCisJCQkJImMgOiAnMCc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGNvZGVnZW4gcGhhc2Ugc2V0cyBzb21lIHZhcnMgd2UgbmVlZAorCQlTVCBjb2RlU1QgPSBnZW5lcmF0b3IuZ2V0UmVjb2duaXplclNUKCk7CisJCVN0cmluZyBjb2RlID0gY29kZVNULnJlbmRlcigpOworCQlTdHJpbmcgZm91bmQgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoIiMjIyIpKzMsY29kZS5pbmRleE9mKCIhISEiKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwkJZm91bmQgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoIl5eXiIpKzMsY29kZS5pbmRleE9mKCImJiYiKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcyLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkR5bmFtaWNBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYTo6eCI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBhY3Rpb247CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkifSA6IHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiYSIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTktOT1dOX0RZTkFNSUNfU0NPUEVfQVRUUklCVVRFOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiYSI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAieCI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RVbmtub3duR2xvYmFsRHluYW1pY0F0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRTeW1ib2xzOjp4IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9IGFjdGlvbjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJInNjb3BlIFN5bWJvbHMge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkifVxuIiArCisJCQkJImEgOiB7JythY3Rpb24rJ31cbiIgKworCQkJCSIgIDtcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJImEiLAorCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfVU5LTk9XTl9EWU5BTUlDX1NDT1BFX0FUVFJJQlVURTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIlN5bWJvbHMiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gIngiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VW5xdWFsaWZpZWRSdWxlU2NvcGVBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkbjsiOyAvLyBtdXN0IGJlIHF1YWxpZmllZAorCQlTdHJpbmcgZXhwZWN0aW5nID0gIiRuOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgaW50IG47XG4iICsKKwkJCQkifSA6IGJcbiIgKworCQkJCSIgIDtcbiIgKworCQkJCSJiIDogeycrYWN0aW9uKyd9XG4iICsKKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiYiIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTktOT1dOX1NJTVBMRV9BVFRSSUJVVEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJuIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlQW5kVG9rZW5MYWJlbFR5cGVNaXNtYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZD0nZm9vJyBpZD1iXG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiYiA6IDtcbiIpOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfVFlQRV9DT05GTElDVDsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImlkIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJydWxlIT10b2tlbiI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMaXN0QW5kVG9rZW5MYWJlbFR5cGVNaXNtYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZHMrPSdhJyBpZHM9J2InXG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiYiA6IDtcbiIpOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfVFlQRV9DT05GTElDVDsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImlkcyI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAidG9rZW4hPXRva2VuLWxpc3QiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGlzdEFuZFJ1bGVMYWJlbFR5cGVNaXNtYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIrCisJCQkJImEgOiBicys9YiBicz1iXG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiYiA6ICdiJztcbiIpOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfVFlQRV9DT05GTElDVDsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImJzIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJydWxlIT1ydWxlLWxpc3QiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXJnUmV0dXJuVmFsdWVNaXNtYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImFbaW50IGldIHJldHVybnMgW2ludCB4LCBpbnQgaV1cbiIgKworCQkJCSIgIDogXG4iICsKKwkJCQkiICA7XG4iICsKKwkJCQkiYiA6IDtcbiIpOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfQVJHX1JFVFZBTF9DT05GTElDVDsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImkiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gImEiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUGx1c0VxdWFsTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkaWRzLnNpemUoKTsiOyAvLyBtdXN0IGJlIHF1YWxpZmllZAorCQlTdHJpbmcgZXhwZWN0aW5nID0gImxpc3RfaWRzLnNpemUoKTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZHMrPUlEICggQ09NTUEgaWRzKz1JRCB7IithY3Rpb24rIn0pKiA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJhIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQbHVzRXF1YWxTdHJpbmdMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRpZHMuc2l6ZSgpOyI7IC8vIG11c3QgYmUgcXVhbGlmaWVkCisJCVN0cmluZyBleHBlY3RpbmcgPSAibGlzdF9pZHMuc2l6ZSgpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogaWRzKz0naWYnICggJywnIGlkcys9SUQgeyIrYWN0aW9uKyJ9KSogOyIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJImEiLAorCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBsdXNFcXVhbFNldExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGlkcy5zaXplKCk7IjsgLy8gbXVzdCBiZSBxdWFsaWZpZWQKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJsaXN0X2lkcy5zaXplKCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZHMrPSgnYSd8J2InKSAoICcsJyBpZHMrPUlEIHsiK2FjdGlvbisifSkqIDsiICsKKwkJCQkiSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJhIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQbHVzRXF1YWxXaWxkY2FyZExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGlkcy5zaXplKCk7IjsgLy8gbXVzdCBiZSBxdWFsaWZpZWQKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJsaXN0X2lkcy5zaXplKCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZHMrPS4gKCAnLCcgaWRzKz1JRCB7IithY3Rpb24rIn0pKiA7IiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJImEiLAorCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUb2tlbkxhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJElEOyAkSUQudGV4dDsgJElELmdldFRleHQoKSI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiSUQxOyAoSUQxIT1udWxsP0lEMS5nZXRUZXh0KCk6bnVsbCk7IElEMS5nZXRUZXh0KCkiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6IElEIHsiK2FjdGlvbisifSA7IiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiYSIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFJ1bGVMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRyLnN0YXJ0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKHIxIT1udWxsPygoVG9rZW4pcjEuc3RhcnQpOm51bGwpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogciB7IyMjIithY3Rpb24rIiEhIX0gOyIgKworCQkJCSJyIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCVNUIGNvZGVTVCA9IGdlbmVyYXRvci5nZXRSZWNvZ25pemVyU1QoKTsKKwkJU3RyaW5nIGNvZGUgPSBjb2RlU1QucmVuZGVyKCk7CisJCVN0cmluZyBmb3VuZCA9IGNvZGUuc3Vic3RyaW5nKGNvZGUuaW5kZXhPZigiIyMjIikrMyxjb2RlLmluZGV4T2YoIiEhISIpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJldXNlRXhpc3RpbmdMYWJlbFdpdGhJbXBsaWNpdFJ1bGVMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRyLnN0YXJ0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKHghPW51bGw/KChUb2tlbil4LnN0YXJ0KTpudWxsKTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6IHg9ciB7IyMjIithY3Rpb24rIiEhIX0gOyIgKworCQkJCSJyIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCVNUIGNvZGVTVCA9IGdlbmVyYXRvci5nZXRSZWNvZ25pemVyU1QoKTsKKwkJU3RyaW5nIGNvZGUgPSBjb2RlU1QucmVuZGVyKCk7CisJCVN0cmluZyBmb3VuZCA9IGNvZGUuc3Vic3RyaW5nKGNvZGUuaW5kZXhPZigiIyMjIikrMyxjb2RlLmluZGV4T2YoIiEhISIpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJldXNlRXhpc3RpbmdMaXN0TGFiZWxXaXRoSW1wbGljaXRSdWxlTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkci5zdGFydDsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIih4IT1udWxsPygoVG9rZW4peC5zdGFydCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkJImEgOiB4Kz1yIHsjIyMiK2FjdGlvbisiISEhfSA7IiArCisJCQkJInIgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworCQlTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKwkJU3RyaW5nIGZvdW5kID0gY29kZS5zdWJzdHJpbmcoY29kZS5pbmRleE9mKCIjIyMiKSszLGNvZGUuaW5kZXhPZigiISEhIikpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV1c2VFeGlzdGluZ0xhYmVsV2l0aEltcGxpY2l0VG9rZW5MYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRJRC50ZXh0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKHghPW51bGw/eC5nZXRUZXh0KCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiB4PUlEIHsiK2FjdGlvbisifSA7IiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXVzZUV4aXN0aW5nTGlzdExhYmVsV2l0aEltcGxpY2l0VG9rZW5MYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRJRC50ZXh0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKHghPW51bGw/eC5nZXRUZXh0KCk6bnVsbCk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiB4Kz1JRCB7IithY3Rpb24rIn0gOyIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsImEiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxhYmVsV2l0aG91dE91dHB1dE9wdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgVDtcbiIrCisJCQkJInMgOiB4Kz1hIDsiICsKKwkJCQkiYSA6ICdhJztcbiIrCisJCQkJImIgOiAnYic7XG4iKworCQkJCSJXUyA6ICcgJ3wnXG4nO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MSVNUX0xBQkVMX0lOVkFMSURfVU5MRVNTX1JFVFZBTF9TVFJVQ1Q7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJ4IjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlTGFiZWxPblR3b0RpZmZlcmVudFJ1bGVzQVNUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iKworCQkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIrCisJCQkJInMgOiB4Kz1hIHgrPWIge1N5c3RlbS5vdXQucHJpbnRsbigkeCk7fSA7IiArCisJCQkJImEgOiAnYSc7XG4iKworCQkJCSJiIDogJ2InO1xuIisKKwkJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO307XG4iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIlthLCBiXVxuYSBiXG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJInMiLCAiYSBiIiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVMYWJlbE9uVHdvRGlmZmVyZW50UnVsZXNUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIisKKwkJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIrCisJCQkJInMgOiB4Kz1hIHgrPWIge1N5c3RlbS5vdXQucHJpbnRsbigkeCk7fSA7IiArCisJCQkJImEgOiAnYScgLT4geyV7XCJoaVwifX0gO1xuIisKKwkJCQkiYiA6ICdiJyAtPiB7JXtcIm1vbVwifX0gO1xuIisKKwkJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO307XG4iOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIltoaSwgbW9tXVxuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCSJzIiwgImEgYiIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQXJncygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiByIDsiICsKKwkJCQkicltpbnQgaV0gOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX01JU1NJTkdfUlVMRV9BUkdTOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiciI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXJnc1doZW5Ob25lRGVmaW5lZCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiByWzMyLDM0XSA7IiArCisJCQkJInIgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1JVTEVfSEFTX05PX0FSR1M7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJyIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXR1cm5Jbml0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogciA7XG4iICsKKwkJCQkiciByZXR1cm5zIFtpbnQgeD0wXSA6ICdhJyB7JHggPSA0O30gO1xuIik7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisKKwkJUnVsZSByID0gZy5nZXRSdWxlKCJyIik7CisJCUF0dHJpYnV0ZVNjb3BlIHJldFNjb3BlID0gci5yZXR1cm5TY29wZTsKKwkJTGlzdCBwYXJhbWV0ZXJzID0gcmV0U2NvcGUuZ2V0QXR0cmlidXRlcygpOworCQlhc3NlcnROb3ROdWxsKCJtaXNzaW5nIHJldHVybiBhY3Rpb24iLCBwYXJhbWV0ZXJzKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHBhcmFtZXRlcnMuc2l6ZSgpKTsKKwkJU3RyaW5nIGZvdW5kID0gcGFyYW1ldGVycy5nZXQoMCkudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpbnQgeD0wIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVJldHVybkluaXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiByIDtcbiIgKworCQkJCSJyIHJldHVybnMgW2ludCB4PTAsIGludCB5LCBTdHJpbmcgcz1uZXcgU3RyaW5nKFwiZm9vXCIpXSA6ICdhJyB7JHggPSA0O30gO1xuIik7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisKKwkJUnVsZSByID0gZy5nZXRSdWxlKCJyIik7CisJCUF0dHJpYnV0ZVNjb3BlIHJldFNjb3BlID0gci5yZXR1cm5TY29wZTsKKwkJTGlzdCBwYXJhbWV0ZXJzID0gcmV0U2NvcGUuZ2V0QXR0cmlidXRlcygpOworCQlhc3NlcnROb3ROdWxsKCJtaXNzaW5nIHJldHVybiBhY3Rpb24iLCBwYXJhbWV0ZXJzKTsKKwkJYXNzZXJ0RXF1YWxzKDMsIHBhcmFtZXRlcnMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJpbnQgeD0wIiwgcGFyYW1ldGVycy5nZXQoMCkudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygiaW50IHkiLCBwYXJhbWV0ZXJzLmdldCgxKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJTdHJpbmcgcz1uZXcgU3RyaW5nKFwiZm9vXCIpIiwgcGFyYW1ldGVycy5nZXQoMikudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENTdHlsZVJldHVybkluaXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiByIDtcbiIgKworCQkJCSJyIHJldHVybnMgW2ludCAoKngpKCk9TlVMTF0gOiAnYScgO1xuIik7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisKKwkJUnVsZSByID0gZy5nZXRSdWxlKCJyIik7CisJCUF0dHJpYnV0ZVNjb3BlIHJldFNjb3BlID0gci5yZXR1cm5TY29wZTsKKwkJTGlzdCBwYXJhbWV0ZXJzID0gcmV0U2NvcGUuZ2V0QXR0cmlidXRlcygpOworCQlhc3NlcnROb3ROdWxsKCJtaXNzaW5nIHJldHVybiBhY3Rpb24iLCBwYXJhbWV0ZXJzKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHBhcmFtZXRlcnMuc2l6ZSgpKTsKKwkJU3RyaW5nIGZvdW5kID0gcGFyYW1ldGVycy5nZXQoMCkudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpbnQgKCopKCkgeD1OVUxMIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBcmdzV2l0aEluaXRWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogclszMiwzNF0gOyIgKworCQkJCSJyW2ludCB4LCBpbnQgeT0zXSA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfQVJHX0lOSVRfVkFMVUVTX0lMTEVHQUw7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJ5IjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBcmdzT25Ub2tlbigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBJRFszMiwzNF0gOyIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfQVJHU19PTl9UT0tFTl9SRUY7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJRCI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXJnc09uVG9rZW5JbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6ICd6JyBJRFszMiwzNF0gOyIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfUlVMRV9IQVNfTk9fQVJHUzsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIklEIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMYWJlbE9uUnVsZVJlZkluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkaS50ZXh0IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoaSE9bnVsbD9pLmdldFRleHQoKTpudWxsKSI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6ICd6JyBpPUlEIHsiK2FjdGlvbisifTsiICsKKwkJCQkiZnJhZ21lbnQgSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJSIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWZUb1J1bGVSZWZJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJElELnRleHQiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihJRDEhPW51bGw/SUQxLmdldFRleHQoKTpudWxsKSI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6ICd6JyBJRCB7IithY3Rpb24rIn07IiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiUiIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVmVG9SdWxlUmVmSW5MZXhlck5vQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJElEIjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJJRDEiOworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkJIlIgOiAneicgSUQgeyIrYWN0aW9uKyJ9OyIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJIlIiLAorCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENoYXJMYWJlbEluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJCSJSIDogeD0neicgO1xuIik7CisKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENoYXJMaXN0TGFiZWxJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6IHgrPSd6JyA7XG4iKTsKKworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkQ2hhckxhYmVsSW5MZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkJIlIgOiB4PS4gO1xuIik7CisKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZENoYXJMaXN0TGFiZWxJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6IHgrPS4gO1xuIik7CisKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQXJnc0luTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJCSJBIDogUiA7IiArCisJCQkJIlJbaW50IGldIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19NSVNTSU5HX1JVTEVfQVJHUzsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIlIiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gbnVsbDsKKwkJLy8gZ2V0dGluZyBhIHNlY29uZCBlcnJvciBAMToxMiwgcHJvYmFibHkgZnJvbSBuZXh0VG9rZW4KKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyUnVsZVByb3BlcnR5UmVmcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiR0ZXh0ICR0eXBlICRsaW5lICRwb3MgJGNoYW5uZWwgJGluZGV4ICRzdGFydCAkc3RvcCI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiZ2V0VGV4dCgpIF90eXBlIHN0YXRlLnRva2VuU3RhcnRMaW5lIHN0YXRlLnRva2VuU3RhcnRDaGFyUG9zaXRpb25JbkxpbmUgX2NoYW5uZWwgLTEgc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCAoZ2V0Q2hhckluZGV4KCktMSkiOworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkJIlIgOiAncicgeyIrYWN0aW9uKyJ9O1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0KKwkJCW5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCQkiUiIsCisJCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJMYWJlbFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYSAkYi50ZXh0ICRjICRkLnRleHQiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImEgKGIhPW51bGw/Yi5nZXRUZXh0KCk6bnVsbCkgYyAoZCE9bnVsbD9kLmdldFRleHQoKTpudWxsKSI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6IGE9J2MnIGI9J2hpJyBjPS4gZD1EVUggeyIrYWN0aW9uKyJ9O1xuIiArCisJCQkJIkRVSCA6ICdkJyA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJSIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nTGV4ZXJSdWxlUHJvcGVydHlSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJHRleHQgJHR5cGU9MSAkbGluZT0xICRwb3M9MSAkY2hhbm5lbD0xICRpbmRleCI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiZ2V0VGV4dCgpIF90eXBlPTEgc3RhdGUudG9rZW5TdGFydExpbmU9MSBzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lPTEgX2NoYW5uZWw9MSAtMSI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiUiA6ICdyJyB7IithY3Rpb24rIn07XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJSIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBcmdzT25Ub2tlbkluTGV4ZXJSdWxlT2ZDb21iaW5lZCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBSO1xuIiArCisJCQkJIlIgOiAneicgSURbMzJdIDtcbiIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCisJCVN0cmluZyBsZXhlckdyYW1tYXJTdHIgPSBnLmdldExleGVyR3JhbW1hcigpOworCQlTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKGxleGVyR3JhbW1hclN0cik7CisJCUdyYW1tYXIgbGV4ZXJHcmFtbWFyID0gbmV3IEdyYW1tYXIoKTsKKwkJbGV4ZXJHcmFtbWFyLnNldEZpbGVOYW1lKCI8aW50ZXJuYWxseS1nZW5lcmF0ZWQtbGV4ZXI+Iik7CisJCWxleGVyR3JhbW1hci5pbXBvcnRUb2tlblZvY2FidWxhcnkoZyk7CisJCWxleGVyR3JhbW1hci5wYXJzZUFuZEJ1aWxkQVNUKHNyKTsKKwkJbGV4ZXJHcmFtbWFyLmRlZmluZUdyYW1tYXJTeW1ib2xzKCk7CisJCWxleGVyR3JhbW1hci5jaGVja05hbWVTcGFjZUFuZEFjdGlvbnMoKTsKKwkJc3IuY2xvc2UoKTsKKworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBsZXhlckdyYW1tYXIsICJKYXZhIik7CisJCWxleGVyR3JhbW1hci5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1JVTEVfSEFTX05PX0FSR1M7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJRCI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGxleGVyR3JhbW1hciwgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQXJnc09uVG9rZW5JbkxleGVyUnVsZU9mQ29tYmluZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogUjtcbiIgKworCQkJCSJSIDogJ3onIElEIDtcbiIgKworCQkJCSJJRFtpbnQgaV0gOiAnYSc7XG4iKTsKKworCQlTdHJpbmcgbGV4ZXJHcmFtbWFyU3RyID0gZy5nZXRMZXhlckdyYW1tYXIoKTsKKwkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihsZXhlckdyYW1tYXJTdHIpOworCQlHcmFtbWFyIGxleGVyR3JhbW1hciA9IG5ldyBHcmFtbWFyKCk7CisJCWxleGVyR3JhbW1hci5zZXRGaWxlTmFtZSgiPGludGVybmFsbHktZ2VuZXJhdGVkLWxleGVyPiIpOworCQlsZXhlckdyYW1tYXIuaW1wb3J0VG9rZW5Wb2NhYnVsYXJ5KGcpOworCQlsZXhlckdyYW1tYXIucGFyc2VBbmRCdWlsZEFTVChzcik7CisJCWxleGVyR3JhbW1hci5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworCQlsZXhlckdyYW1tYXIuY2hlY2tOYW1lU3BhY2VBbmRBY3Rpb25zKCk7CisJCXNyLmNsb3NlKCk7CisKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgbGV4ZXJHcmFtbWFyLCAiSmF2YSIpOworCQlsZXhlckdyYW1tYXIuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19NSVNTSU5HX1JVTEVfQVJHUzsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIklEIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9IG51bGw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgbGV4ZXJHcmFtbWFyLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJLy8gVCBSIEUgRSBTCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5MYWJlbFRyZWVQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRpZC50cmVlOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiaWRfdHJlZTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6IGlkPUlEIHsiK2FjdGlvbisifSA7XG4iICsKKwkJCQkiSUQgOiAnYSc7XG4iKTsKKworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCSJhIiwKKwkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuUmVmVHJlZVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJElELnRyZWU7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJJRDFfdHJlZTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6IElEIHsiK2FjdGlvbisifSA7IiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwiYSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyBmb3VuZCA9IHRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzVG9rZW5SZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkSUQ7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6IElEIElEIHsiK2FjdGlvbisifTsiICsKKwkJCQkiSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX05PTlVOSVFVRV9SRUY7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJRCI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzVG9rZW5SZWZXaXRoUHJvcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRJRC50ZXh0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiIjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBJRCBJRCB7IithY3Rpb24rIn07IiArCisJCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19OT05VTklRVUVfUkVGOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiSUQiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVSZWZXaXRoRHluYW1pY1Njb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJGZpZWxkOjp4ID0gJGZpZWxkLnN0OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKChmaWVsZF9zY29wZSlmaWVsZF9zdGFjay5wZWVrKCkpLnggPSByZXR2YWwuc3Q7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgYTtcbiIgKworCQkJCSJmaWVsZFxuIiArCisJCQkJInNjb3BlIHsgU1QgeDsgfVxuIiArCisJCQkJIiAgICA6ICAgJ3knIHsiK2FjdGlvbisifVxuIiArCisJCQkJIiAgICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkiZmllbGQiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXNzaWduVG9Pd25SdWxlbmFtZUF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkcnVsZS50cmVlID0gbnVsbDsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInJldHZhbC50cmVlID0gbnVsbDsiOworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgYTtcbiIgKworCQkJCSJydWxlXG4iICsKKwkJCQkiICAgIDogJ3knIHsiICsgYWN0aW9uICsifVxuIiArCisJCQkJIiAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJInJ1bGUiLAorCQkJbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgZm91bmQgPSB0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXNzaWduVG9Pd25QYXJhbUF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkcnVsZS5pID0gNDI7ICRpID0gMjM7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpID0gNDI7IGkgPSAyMzsiOworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgYTtcbiIgKworCQkJCSJydWxlW2ludCBpXVxuIiArCisJCQkJIiAgICA6ICd5JyB7IiArIGFjdGlvbiArIn1cbiIgKworCQkJCSIgICAgOyIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCSJydWxlIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdElsbGVnYWxBc3NpZ25Ub093blJ1bGVuYW1lQXR0cigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRydWxlLnN0b3AgPSAwOyI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciBhO1xuIiArCisJCQkJInJ1bGVcbiIgKworCQkJCSIgICAgOiAneScgeyIgKyBhY3Rpb24gKyJ9XG4iICsKKwkJCQkiICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkicnVsZSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19XUklURV9UT19SRUFET05MWV9BVFRSOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAicnVsZSI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAic3RvcCI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXNzaWduVG9Mb2NhbEF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkdHJlZSA9IG51bGw7ICRzdCA9IG51bGw7ICRzdGFydCA9IDA7ICRzdG9wID0gMDsgJHRleHQgPSAwOyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAicmV0dmFsLnRyZWUgPSBudWxsOyByZXR2YWwuc3QgPSBudWxsOyAgICI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciBhO1xuIiArCisJCQkJInJ1bGVcbiIgKworCQkJCSIgICAgOiAneScgeyIgKyBhY3Rpb24gKyJ9XG4iICsKKwkJCQkiICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkicnVsZSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19XUklURV9UT19SRUFET05MWV9BVFRSOworCQlBcnJheUxpc3QgZXhwZWN0ZWRFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KDMpOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsICJzdGFydCIsICIiKTsKKwkJZXhwZWN0ZWRFcnJvcnMuYWRkKGV4cGVjdGVkTWVzc2FnZSk7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZTIgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsICJzdG9wIiwgIiIpOworCQlleHBlY3RlZEVycm9ycy5hZGQoZXhwZWN0ZWRNZXNzYWdlMik7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZTMgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsICJ0ZXh0IiwgIiIpOworCQlleHBlY3RlZEVycm9ycy5hZGQoZXhwZWN0ZWRNZXNzYWdlMyk7CisJCWNoZWNrRXJyb3JzKGVxdWV1ZSwgZXhwZWN0ZWRFcnJvcnMpOworCisJCVNUR3JvdXAgdGVtcGxhdGVzID0KKwkJCW5ldyBTVEdyb3VwKCk7CisJCVNUIGFjdGlvblNUID0gbmV3IFNUKHRlbXBsYXRlcywgcmF3VHJhbnNsYXRpb24pOworCQlTdHJpbmcgZm91bmQgPSBhY3Rpb25TVC5yZW5kZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXNzaWduUnVsZVJlZkF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkb3RoZXIudHJlZSA9IG51bGw7IjsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIGE7XG4iICsKKwkJCQkib3B0aW9ucyB7IG91dHB1dCA9IEFTVDt9IiArCisJCQkJIm90aGVycnVsZVxuIiArCisJCQkJIiAgICA6ICd5JyA7IiArCisJCQkJInJ1bGVcbiIgKworCQkJCSIgICAgOiBvdGhlcj1vdGhlcnJ1bGUgeyIgKyBhY3Rpb24gKyJ9XG4iICsKKwkJCQkiICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkicnVsZSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19XUklURV9UT19SRUFET05MWV9BVFRSOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAib3RoZXIiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gInRyZWUiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFzc2lnblRva2VuUmVmQXR0cigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiRJRC50ZXh0ID0gXCJ0ZXN0XCI7IjsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIGE7XG4iICsKKwkJCQkiSURcbiIgKworCQkJCSIgICAgOiAneScgOyIgKworCQkJCSJydWxlXG4iICsKKwkJCQkiICAgIDogSUQgeyIgKyBhY3Rpb24gKyJ9XG4iICsKKwkJCQkiICAgIDsiKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkicnVsZSIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19XUklURV9UT19SRUFET05MWV9BVFRSOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiSUQiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gInRleHQiOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXNzaWduVG9UcmVlTm9kZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiR0cmVlLnNjb3BlID0gbG9jYWxTY29wZTsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIigoT2JqZWN0KXJldHZhbC50cmVlKS5zY29wZSA9IGxvY2FsU2NvcGU7IjsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIGE7XG4iICsKKwkJCQkib3B0aW9ucyB7IG91dHB1dD1BU1Q7IH0iICsKKwkJCQkicnVsZVxuIiArCisJCQkJIkBpbml0IHtcbiIgKworCQkJCSIgICBTY29wZSBsb2NhbFNjb3BlPW51bGw7XG4iICsKKwkJCQkifVxuIiArCisJCQkJIkBhZnRlciB7XG4iICsKKwkJCQkiICAgIyMjJHRyZWUuc2NvcGUgPSBsb2NhbFNjb3BlOyEhIVxuIiArCisJCQkJIn1cbiIgKworCQkJCSIgICA6ICdhJyAtPiBeKCdhJylcbiIgKworCQkJCSI7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGNvZGVnZW4gcGhhc2Ugc2V0cyBzb21lIHZhcnMgd2UgbmVlZAorCQlTVCBjb2RlU1QgPSBnZW5lcmF0b3IuZ2V0UmVjb2duaXplclNUKCk7CisJCVN0cmluZyBjb2RlID0gY29kZVNULnJlbmRlcigpOworCQlTdHJpbmcgZm91bmQgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoIiMjIyIpKzMsY29kZS5pbmRleE9mKCIhISEiKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REb05vdFRyYW5zbGF0ZUF0dHJpYnV0ZUNvbXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkYS5saW5lID09ICRiLmxpbmUiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIT1udWxsP2EuZ2V0TGluZSgpOjApID09IChiIT1udWxsP2IuZ2V0TGluZSgpOjApIjsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIGE7XG4iICsKKwkJCQkiUlVMRTpcbiIgKworCQkJCSIgICAgIGE9SUQgYj1JRCB7IiArIGFjdGlvbiArICJ9IiArCisJCQkJIiAgICA7XG4iICsKKwkJCQkiSUQgOiAnaWQnOyIKKwkJKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBBY3Rpb25UcmFuc2xhdG9yKGdlbmVyYXRvciwKKwkJCSJSVUxFIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REb05vdFRyYW5zbGF0ZVNjb3BlQXR0cmlidXRlQ29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gImlmICgkcnVsZTo6Zm9vID09IFwiZm9vXCIgfHwgMSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJvdWNoXCIpOyB9IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpZiAoKChydWxlX3Njb3BlKXJ1bGVfc3RhY2sucGVlaygpKS5mb28gPT0gXCJmb29cIiB8fCAxKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIm91Y2hcIik7IH0iOworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgYTtcbiIgKworCQkJCSJydWxlXG4iICsKKwkJCQkic2NvcGUge1xuIiArCisJCQkJIiAgIFN0cmluZyBmb287IiArCisJCQkJIn0gOlxuIiArCisJCQkJIiAgICAgdHdvSURzIiArCisJCQkJIiAgICA7XG4iICsKKwkJCQkidHdvSURzOlxuIiArCisJCQkJIiAgICBJRCBJRCB7IiArIGFjdGlvbiArICJ9XG4iICsKKwkJCQkiICAgIDtcbiIgKworCQkJCSJJRCA6ICdpZCc7IgorCQkpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJInR3b0lEcyIsCisJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQkvLyBjaGVjayB0aGF0IHdlIGRpZG4ndCB1c2Ugc2NvcGVTZXRBdHRyaWJ1dGVSZWYgaW50IHRyYW5zbGF0aW9uIQorCQlib29sZWFuIGZvdW5kU2NvcGVTZXRBdHRyaWJ1dGVSZWYgPSBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2xhdG9yLmNodW5rcy5zaXplKCk7IGkrKykgeworCQkJT2JqZWN0IGNodW5rID0gdHJhbnNsYXRvci5jaHVua3MuZ2V0KGkpOworCQkJaWYgKGNodW5rIGluc3RhbmNlb2YgU1QpIHsKKwkJCQlpZiAoKChTVCljaHVuaykuZ2V0TmFtZSgpLmVxdWFscygiL3Njb3BlU2V0QXR0cmlidXRlUmVmIikpIHsKKwkJCQkJZm91bmRTY29wZVNldEF0dHJpYnV0ZVJlZiA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCWFzc2VydEZhbHNlKCJhY3Rpb24gdHJhbnNsYXRvciB1c2VkIHNjb3BlU2V0QXR0cmlidXRlUmVmIHRlbXBsYXRlIGluIGNvbXBhcmlzb24hIiwgZm91bmRTY29wZVNldEF0dHJpYnV0ZVJlZik7CisJCVNUR3JvdXAgdGVtcGxhdGVzID0KKwkJCW5ldyBTVEdyb3VwKCk7CisJCVNUIGFjdGlvblNUID0gbmV3IFNUKHRlbXBsYXRlcywgcmF3VHJhbnNsYXRpb24pOworCQlTdHJpbmcgZm91bmQgPSBhY3Rpb25TVC5yZW5kZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUcmVlUnVsZVN0b3BBdHRyaWJ1dGVJc0ludmFsaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIkci54OyAkci5zdGFydDsgJHIuc3RvcCI7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKHIhPW51bGw/ci54OjApOyAociE9bnVsbD8oKENvbW1vblRyZWUpci5zdGFydCk6bnVsbCk7ICRyLnN0b3AiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkidHJlZSBncmFtbWFyIHQ7XG4iICsKKwkJCQkib3B0aW9ucyB7QVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIisKKwkJCQkiYSByZXR1cm5zIFtpbnQgeF1cbiIgKworCQkJCSIgIDpcbiIgKworCQkJCSIgIDtcbiIrCisJCQkJImIgOiByPWEgeyMjIyIrYWN0aW9uKyIhISF9XG4iICsKKwkJCQkiICA7Iik7CisJCVN5c3RlbS5vdXQucHJpbnRsbihnLnRvU3RyaW5nKCkpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gY29kZWdlbiBwaGFzZSBzZXRzIHNvbWUgdmFycyB3ZSBuZWVkCisJCVNUIGNvZGVTVCA9IGdlbmVyYXRvci5nZXRSZWNvZ25pemVyU1QoKTsKKwkJU3RyaW5nIGNvZGUgPSBjb2RlU1QucmVuZGVyKCk7CisJCVN0cmluZyBmb3VuZCA9IGNvZGUuc3Vic3RyaW5nKGNvZGUuaW5kZXhPZigiIyMjIikrMyxjb2RlLmluZGV4T2YoIiEhISIpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTktOT1dOX1JVTEVfQVRUUklCVVRFOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiYSI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAic3RvcCI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiZXF1ZXVlOiIrZXF1ZXVlKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlZlRvVGV4dEF0dHJpYnV0ZUZvckN1cnJlbnRUcmVlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiR0ZXh0IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpbnB1dC5nZXRUb2tlblN0cmVhbSgpLnRvU3RyaW5nKCIgKworCQkJImlucHV0LmdldFRyZWVBZGFwdG9yKCkuZ2V0VG9rZW5TdGFydEluZGV4KHJldHZhbC5zdGFydCksIiArCisJCQkiaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUb2tlblN0b3BJbmRleChyZXR2YWwuc3RhcnQpKSI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJ0cmVlIGdyYW1tYXIgdDtcbiIgKworCQkJCSJvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKwkJCQkiYSA6IHsjIyMiK2FjdGlvbisiISEhfVxuIiArCisJCQkJIiAgO1xuIik7CisKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGNvZGVnZW4gcGhhc2Ugc2V0cyBzb21lIHZhcnMgd2UgbmVlZAorCQlTVCBjb2RlU1QgPSBnZW5lcmF0b3IuZ2V0UmVjb2duaXplclNUKCk7CisJCVN0cmluZyBjb2RlID0gY29kZVNULnJlbmRlcigpOworCQlTdHJpbmcgZm91bmQgPSBjb2RlLnN1YnN0cmluZyhjb2RlLmluZGV4T2YoIiMjIyIpKzMsY29kZS5pbmRleE9mKCIhISEiKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUeXBlT2ZHdWFyZGVkQXR0cmlidXRlUmVmSXNDb3JyZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiaW50IHggPSAkYjo6bjsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImludCB4ID0gKChiX3Njb3BlKWJfc3RhY2sucGVlaygpKS5uOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCQkicyA6IGIgO1xuIisKKwkJCQkiYlxuIiArCisJCQkJInNjb3BlIHtcbiIgKworCQkJCSIgIGludCBuO1xuIiArCisJCQkJIn0gOiAnKCcgYiAnKScgeyIrYWN0aW9uKyJ9XG4iICsgLy8gcmVmZXJzIHRvIGN1cnJlbnQgaW52b2NhdGlvbidzIG4KKwkJCQkiICA7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsICJiIiwKKwkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIGZvdW5kID0gdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJLy8gUyBVIFAgUCBPIFIgVAorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tFcnJvcihFcnJvclF1ZXVlIGVxdWV1ZSwKKwkJCQkJCQkgIEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLyoKKwkJU3lzdGVtLm91dC5wcmludGxuKGVxdWV1ZS5pbmZvcyk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihlcXVldWUud2FybmluZ3MpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oZXF1ZXVlLmVycm9ycyk7CisJCSovCisJCU1lc3NhZ2UgZm91bmRNc2cgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVxdWV1ZS5lcnJvcnMuc2l6ZSgpOyBpKyspIHsKKwkJCU1lc3NhZ2UgbSA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KGkpOworCQkJaWYgKG0ubXNnSUQ9PWV4cGVjdGVkTWVzc2FnZS5tc2dJRCApIHsKKwkJCQlmb3VuZE1zZyA9IG07CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZSgibm8gZXJyb3I7ICIrZXhwZWN0ZWRNZXNzYWdlLm1zZ0lEKyIgZXhwZWN0ZWQiLCBlcXVldWUuZXJyb3JzLnNpemUoKSA+IDApOworCQlhc3NlcnROb3ROdWxsKCJjb3VsZG4ndCBmaW5kIGV4cGVjdGVkIGVycm9yOiAiK2V4cGVjdGVkTWVzc2FnZS5tc2dJRCsiIGluICIrZXF1ZXVlLCBmb3VuZE1zZyk7CisJCWFzc2VydFRydWUoImVycm9yIGlzIG5vdCBhIEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIiwKKwkJCWZvdW5kTXNnIGluc3RhbmNlb2YgR3JhbW1hclNlbWFudGljc01lc3NhZ2UpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXNzYWdlLmFyZywgZm91bmRNc2cuYXJnKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS5hcmcyLCBmb3VuZE1zZy5hcmcyKTsKKwl9CisKKwkvKiogQWxsb3cgY2hlY2tpbmcgZm9yIG11bHRpcGxlIGVycm9ycyBpbiBvbmUgdGVzdCAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrRXJyb3JzKEVycm9yUXVldWUgZXF1ZXVlLAorCQkJCQkJCSAgIEFycmF5TGlzdCBleHBlY3RlZE1lc3NhZ2VzKQorCQl0aHJvd3MgRXhjZXB0aW9uCisJeworCQlBcnJheUxpc3QgbWVzc2FnZUV4cGVjdGVkID0gbmV3IEFycmF5TGlzdChlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXF1ZXVlLmVycm9ycy5zaXplKCk7IGkrKykgeworCQkJTWVzc2FnZSBtID0gKE1lc3NhZ2UpZXF1ZXVlLmVycm9ycy5nZXQoaSk7CisJCQlib29sZWFuIGZvdW5kTXNnID0gZmFsc2U7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkTWVzc2FnZXMuc2l6ZSgpOyBqKyspIHsKKwkJCQlNZXNzYWdlIGVtID0gKE1lc3NhZ2UpZXhwZWN0ZWRNZXNzYWdlcy5nZXQoaik7CisJCQkJaWYgKG0ubXNnSUQ9PWVtLm1zZ0lEICYmIG0uYXJnLmVxdWFscyhlbS5hcmcpICYmIG0uYXJnMi5lcXVhbHMoZW0uYXJnMikpIHsKKwkJCQkJZm91bmRNc2cgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWlmIChmb3VuZE1zZykgeworCQkJCW1lc3NhZ2VFeHBlY3RlZC5hZGQoaSwgQm9vbGVhbi5UUlVFKTsKKwkJCX0gZWxzZQorCQkJCW1lc3NhZ2VFeHBlY3RlZC5hZGQoaSwgQm9vbGVhbi5GQUxTRSk7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcXVldWUuZXJyb3JzLnNpemUoKTsgaSsrKSB7CisJCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIGVycm9yOiIgKyBlcXVldWUuZXJyb3JzLmdldChpKSwgKChCb29sZWFuKW1lc3NhZ2VFeHBlY3RlZC5nZXQoaSkpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEF1dG9BU1QuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEF1dG9BU1QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM3ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0QXV0b0FTVC5qYXZhCkBAIC0wLDAgKzEsODIyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdEF1dG9BU1QgZXh0ZW5kcyBCYXNlVGVzdCB7CisJcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkxpc3RJblNpbmdsZUFsdEJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IChJRCBJTlQpIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSb290QXRPdXRlckxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEXiBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYmMgMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKGFiYyAzNClcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUm9vdEF0T3V0ZXJMZXZlbFJldmVyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElOVCBJRF4gO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICIzNCBhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKGFiYyAzNClcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QmFuZygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UISBJRCEgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IGRhZyA0NTMyIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYyA0NTMyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsVGhlblJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6ICggSUQgSU5UICk/IElEXiA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImEgMSBiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihiIGEgMSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZFN0cmluZ1Jvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IHY9J3ZvaWQnXiBJRCAnOycgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJ2b2lkIGZvbzsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKHZvaWQgZm9vIDspXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB2PSd2b2lkJ14gLiAnOycgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJ2b2lkIGZvbzsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKHZvaWQgZm9vIDspXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkUm9vdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogdj0ndm9pZCcgLl4gJzsnIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAidm9pZCBmb287IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihmb28gdm9pZCA7KVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZFJvb3RXaXRoTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IHY9J3ZvaWQnIHg9Ll4gJzsnIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAidm9pZCBmb287IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihmb28gdm9pZCA7KVxuIiwgZm91bmQpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZFJvb3RXaXRoTGlzdExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBncmFtbWFyID0KKyAgICAgICAgICAgICJncmFtbWFyIFQ7XG4iICsKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworICAgICAgICAgICAgImEgOiB2PSd2b2lkJyB4PS5eICc7JyA7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwgInZvaWQgZm9vOyIsIGRlYnVnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoZm9vIHZvaWQgOylcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRCYW5nV2l0aExpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogdj0ndm9pZCcgeD0uISAnOycgO1xuIiArCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIsICJ2b2lkIGZvbzsiLCBkZWJ1Zyk7CisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCA7XG4iLCBmb3VuZCk7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJvb3RSb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRF4gSU5UXiBJRCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImEgMzQgYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoMzQgYSBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSb290Um9vdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVF4gSUReIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSAzNCBjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihjICgzNCBhKSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Um9vdFRoZW5Sb290SW5Mb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRF4gKElOVCAnKideIElEKSsgO1xuIiArCisJCQkiSUQgIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSAzNCAqIGIgOSAqIGMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKCogKCogKGEgMzQpIGIgOSkgYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkU3VicnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogJ3ZvaWQnICgoezt9SUR8SU5UKSBJRCB8ICdudWxsJyApICc7JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgInZvaWQgYSBiOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2b2lkIGEgYiA7XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEludm9rZVJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSAgOiB0eXBlIElEIDtcbiIgKworCQkJInR5cGUgOiB7O30naW50JyB8ICdmbG9hdCcgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJpbnQgYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJpbnQgYVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbnZva2VSdWxlQXNSb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgIDogdHlwZV4gSUQgO1xuIiArCisJCQkidHlwZSA6IHs7fSdpbnQnIHwgJ2Zsb2F0JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImludCBhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihpbnQgYSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlUnVsZUFzUm9vdFdpdGhMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhICA6IHg9dHlwZV4gSUQgO1xuIiArCisJCQkidHlwZSA6IHs7fSdpbnQnIHwgJ2Zsb2F0JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImludCBhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihpbnQgYSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlUnVsZUFzUm9vdFdpdGhMaXN0TGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSAgOiB4Kz10eXBlXiBJRCA7XG4iICsKKwkJCSJ0eXBlIDogezt9J2ludCcgfCAnZmxvYXQnIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiaW50IGEiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKGludCBhKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlUm9vdEluTG9vcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgKCcrJ14gSUQpKiA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImErYitjK2QiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKCsgKCsgKCsgYSBiKSBjKSBkKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlSW52b2NhdGlvblJ1bGVSb290SW5Mb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCAob3BeIElEKSogO1xuIiArCisJCQkib3AgOiB7O30nKycgfCAnLScgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhK2IrYy1kIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigtICgrICgrIGEgYikgYykgZClcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VGFpbFJlY3Vyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogYXRvbSAoJ2V4cCdeIGEpPyA7XG4iICsKKwkJCSJhdG9tIDogSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgInMiLCAiMyBleHAgNCBleHAgNSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoZXhwIDMgKGV4cCA0IDUpKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEfElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2V0Um9vdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogKCcrJyB8ICctJyleIElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiK2FiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoKyBhYmMpXG4iLCBmb3VuZCk7CisJfQorCisJQElnbm9yZQorICAgIC8vIFRPRE86IEZBSUxTIHVudGlsIEkgcmVidWlsZCB0aGUgYW50bHIuZyBpbiB2MworICAgIC8vCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJvb3RXaXRoTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB4PSgnKycgfCAnLScpXiBJRCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIithYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKCsgYWJjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXRBc1J1bGVSb290SW5Mb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCAoKCcrJ3wnLScpXiBJRCkqIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYStiLWMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKC0gKCsgYSBiKSBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IH5JRCAnKycgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiMzQrMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNCArIDJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0V2l0aExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB4PX5JRCAnKycgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiMzQrMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNCArIDJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0V2l0aExpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogeD1+SUQgJysnIElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIjM0KzIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMzQgKyAyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdFNldFJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IH4nKydeIElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIjM0IDU1IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigzNCA1NSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0Um9vdFdpdGhMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogficrJ14gSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiMzQgNTUiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKDM0IDU1KVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RTZXRSb290V2l0aExpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogficrJ14gSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiMzQgNTUiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKDM0IDU1KVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RTZXRSdWxlUm9vdEluTG9vcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSU5UICh+SU5UXiBJTlQpKiA7XG4iICsKKwkJCSJibG9ydCA6ICcrJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIjMrNCs1IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigrICgrIDMgNCkgNSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5MYWJlbFJldXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNoZWNrIGZvciBjb21waWxhdGlvbiBwcm9ibGVtIGR1ZSB0byBtdWx0aXBsZSBkZWZpbmVzCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBpZD1JRCBpZD1JRCB7U3lzdGVtLm91dC5wcmludChcIjJuZCBpZD1cIiskaWQudGV4dCsnOycpO30gO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMm5kIGlkPWI7YSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuTGFiZWxSZXVzZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY2hlY2sgZm9yIGNvbXBpbGF0aW9uIHByb2JsZW0gZHVlIHRvIG11bHRpcGxlIGRlZmluZXMKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IGlkPUlEIGlkPUlEXiB7U3lzdGVtLm91dC5wcmludChcIjJuZCBpZD1cIiskaWQudGV4dCsnOycpO30gO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMm5kIGlkPWI7KGIgYSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5MaXN0TGFiZWxSZXVzZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbSBkdWUgdG8gbXVsdGlwbGUgZGVmaW5lcworCQkvLyBtYWtlIHN1cmUgaWRzIGhhcyBib3RoIElEIHRva2VucworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogaWRzKz1JRCBpZHMrPUlEIHtTeXN0ZW0ub3V0LnByaW50KFwiaWQgbGlzdD1cIiskaWRzKyc7Jyk7fSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImEgYiIsIGRlYnVnKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpZCBsaXN0PVtbQDAsMDowPSdhJyw8ND4sMTowXSwgW0AyLDI6Mj0nYicsPDQ+LDE6Ml1dO2EgYlxuIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkxpc3RMYWJlbFJldXNlMigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbSBkdWUgdG8gbXVsdGlwbGUgZGVmaW5lcworCQkvLyBtYWtlIHN1cmUgaWRzIGhhcyBib3RoIElEIHRva2VucworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogaWRzKz1JRF4gaWRzKz1JRCB7U3lzdGVtLm91dC5wcmludChcImlkIGxpc3Q9XCIrJGlkcysnOycpO30gO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiaWQgbGlzdD1bW0AwLDA6MD0nYScsPDQ+LDE6MF0sIFtAMiwyOjI9J2InLDw0PiwxOjJdXTsoYSBiKVxuIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkxpc3RMYWJlbFJ1bGVSb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBpZCs9SUReIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuTGlzdExhYmVsQmFuZygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogaWQrPUlEISA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImEiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlTGlzdExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB4Kz1iIHgrPWIgeyIgKworCQkJIlRyZWUgdD0oVHJlZSkkeC5nZXQoMSk7IiArCisJCQkiU3lzdGVtLm91dC5wcmludChcIjJuZCB4PVwiK3QudG9TdHJpbmdUcmVlKCkrJzsnKTt9IDtcbiIgKworCQkJImIgOiBJRDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSBiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIjJuZCB4PWI7YSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVMaXN0TGFiZWxSdWxlUm9vdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogKCB4Kz1iXiApKyB7IiArCisJCQkiU3lzdGVtLm91dC5wcmludChcIng9XCIrKChDb21tb25UcmVlKSR4LmdldCgxKSkudG9TdHJpbmdUcmVlKCkrJzsnKTt9IDtcbiIgKworCQkJImIgOiBJRDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSBiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIng9KGIgYSk7KGIgYSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxpc3RMYWJlbEJhbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IHgrPWIhIHgrPWIgeyIgKworCQkJIlN5c3RlbS5vdXQucHJpbnQoXCIxc3QgeD1cIisoKENvbW1vblRyZWUpJHguZ2V0KDApKS50b1N0cmluZ1RyZWUoKSsnOycpO30gO1xuIiArCisJCQkiYiA6IElEO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMXN0IHg9YTtiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbXBsaWNhdGVkTWVsYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjaGVjayBmb3IgY29tcGlsYXRpb24gcHJvYmxlbQorCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogQSBiPUIgYj1CIGMrPUMgYys9QyBEIHtTdHJpbmcgcyA9ICRELnRleHQ7fSA7XG4iICsKKwkJCSJBIDogJ2EnIDtcbiIgKworCQkJIkIgOiAnYicgO1xuIiArCisJCQkiQyA6ICdjJyA7XG4iICsKKwkJCSJEIDogJ2QnIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSBiIGIgYyBjIGQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBiIGIgYyBjIGRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVmFsdWVXaXRoQVNUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIGIge1N5c3RlbS5vdXQucHJpbnRsbigkYi5pKTt9IDtcbiIgKworCQkJImIgcmV0dXJucyBbaW50IGldIDogSU5UIHskaT1JbnRlZ2VyLnBhcnNlSW50KCRJTlQudGV4dCk7fSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNFxuYWJjIDM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldExvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMgeyBvdXRwdXQ9QVNUOyB9XG4iICsKKwkJCSJyIDogKElOVHxJRCkrIDsgXG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onICsgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScgKztcbiIgKworCQkJIldTOiAoJyAnIHwgJ1xcbicgfCAnXFx0JykrIHskY2hhbm5lbCA9IEhJRERFTjt9O1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiciIsICJhYmMgMzQgZCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMgMzQgZFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFeHRyYVRva2VuSW5TaW1wbGVEZWNsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiZGVjbCA6IHR5cGVeIElEICc9JyEgSU5UICc7JyEgO1xuIiArCisJCQkidHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJkZWNsIiwgImludCAzNCB4PTE7IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgJzM0JyBleHBlY3RpbmcgSURcbiIsIHRoaXMuc3RkZXJyRHVyaW5nUGFyc2UpOworCQlhc3NlcnRFcXVhbHMoIihpbnQgeCAxKVxuIiwgZm91bmQpOyAvLyB0cmVlIGdldHMgY29ycmVjdCB4IGFuZCAxIHRva2VucworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nSURJblNpbXBsZURlY2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0VYUFI7fVxuIiArCisJCQkiZGVjbCA6IHR5cGVeIElEICc9JyEgSU5UICc7JyEgO1xuIiArCisJCQkidHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJkZWNsIiwgImludCA9MTsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjQgbWlzc2luZyBJRCBhdCAnPSdcbiIsIHRoaXMuc3RkZXJyRHVyaW5nUGFyc2UpOworCQlhc3NlcnRFcXVhbHMoIihpbnQgPG1pc3NpbmcgSUQ+IDEpXG4iLCBmb3VuZCk7IC8vIHRyZWUgZ2V0cyBpbnZlbnRlZCBJRCB0b2tlbgorCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nU2V0SW5TaW1wbGVEZWNsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtFWFBSO31cbiIgKworCQkJImRlY2wgOiB0eXBlXiBJRCAnPSchIElOVCAnOychIDtcbiIgKworCQkJInR5cGUgOiAnaW50JyB8ICdmbG9hdCcgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkJCQkJICAiZGVjbCIsICJ4PTE7IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImxpbmUgMTowIG1pc21hdGNoZWQgaW5wdXQgJ3gnIGV4cGVjdGluZyBzZXQgbnVsbFxuIiwgdGhpcy5zdGRlcnJEdXJpbmdQYXJzZSk7CisJCWFzc2VydEVxdWFscygiKDxlcnJvcjogeD4geCAxKVxuIiwgZm91bmQpOyAvLyB0cmVlIGdldHMgaW52ZW50ZWQgSUQgdG9rZW4KKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1Rva2VuR2l2ZXNFcnJvck5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIDtcbiIgKyAvLyBmb2xsb3cgaXMgRU9GCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjMgbWlzc2luZyBJTlQgYXQgJzxFT0Y+J1xuIiwgdGhpcy5zdGRlcnJEdXJpbmdQYXJzZSk7CisJCWFzc2VydEVxdWFscygiYWJjIDxtaXNzaW5nIElOVD5cbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1Rva2VuR2l2ZXNFcnJvck5vZGVJbkludm9rZWRSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IGIgO1xuIiArCisJCQkiYiA6IElEIElOVCA7XG4iICsgLy8gZm9sbG93IHNob3VsZCBzZWUgRU9GCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjMgbWlzbWF0Y2hlZCBpbnB1dCAnPEVPRj4nIGV4cGVjdGluZyBJTlRcbiIsIHRoaXMuc3RkZXJyRHVyaW5nUGFyc2UpOworCQlhc3NlcnRFcXVhbHMoIjxtaXNtYXRjaGVkIHRva2VuOiBbQDEsMzozPSc8RU9GPicsPC0xPiwxOjNdLCByZXN5bmM9YWJjPlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFeHRyYVRva2VuR2l2ZXNFcnJvck5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiBjIDtcbiIgKworCQkJImIgOiBJRCA7XG4iICsKKwkJCSJjIDogSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIGljayAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJsaW5lIDE6NCBleHRyYW5lb3VzIGlucHV0ICdpY2snIGV4cGVjdGluZyBJTlRcbiIsIHRoaXMuc3RkZXJyRHVyaW5nUGFyc2UpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlyc3RUb2tlbkdpdmVzRXJyb3JOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIjM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImxpbmUgMTowIG1pc3NpbmcgSUQgYXQgJzM0J1xuIiwgdGhpcy5zdGRlcnJEdXJpbmdQYXJzZSk7CisJCWFzc2VydEVxdWFscygiPG1pc3NpbmcgSUQ+IDM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaXJzdFRva2VuR2l2ZXNFcnJvck5vZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IGIgYyA7XG4iICsKKwkJCSJiIDogSUQgO1xuIiArCisJCQkiYyA6IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIjM0IiwgZGVidWcpOworCQkvLyBmaW5kcyBhbiBlcnJvciBhdCB0aGUgZmlyc3QgdG9rZW4sIDM0LCBhbmQgcmUtc3luY3MuCisJCS8vIHJlLXN5bmNocm9uaXppbmcgZG9lcyBub3QgY29uc3VtZSBhIHRva2VuIGJlY2F1c2UgMzQgZm9sbG93cworCQkvLyByZWYgdG8gcnVsZSBiIChzdGFydCBvZiBjKS4gSXQgdGhlbiBtYXRjaGVzIDM0IGluIGMuCisJCWFzc2VydEVxdWFscygibGluZSAxOjAgbWlzc2luZyBJRCBhdCAnMzQnXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCI8bWlzc2luZyBJRD4gMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBiIHwgYyA7XG4iICsKKwkJCSJiIDogSUQgO1xuIiArCisJCQkiYyA6IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJTIDogJyonIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJCQkJCSAgImEiLCAiKiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJsaW5lIDE6MCBubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgJyonXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCI8dW5leHBlY3RlZDogW0AwLDA6MD0nKicsPDY+LDE6MF0sIHJlc3luYz0qPlxuIiwgZm91bmQpOworCX0KKworCisJLy8gUyBVIFAgUCBPIFIgVAorCisJcHVibGljIHZvaWQgX3Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6ICA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLCAiYSIsICJhYmMgMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiXG4iLCBmb3VuZCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RCdWZmZXJlZFRyZWVOb2RlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0YTczNwotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0uamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLkJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW07CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVOb2RlU3RyZWFtOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0gZXh0ZW5kcyBUZXN0VHJlZU5vZGVTdHJlYW0geworICAgIC8vIGluaGVyaXRzIHRlc3RzOyB0aGVzZSBtZXRob2RzIG1ha2UgaXQgdXNlIGEgbmV3IGJ1ZmZlcgorCisJcHVibGljIFRyZWVOb2RlU3RyZWFtIG5ld1N0cmVhbShPYmplY3QgdCkgeworCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkVHJlZU5vZGVTdHJlYW0odCk7CisJfQorCisgICAgcHVibGljIFN0cmluZyB0b1Rva2VuVHlwZVN0cmluZyhUcmVlTm9kZVN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuICgoQnVmZmVyZWRUcmVlTm9kZVN0cmVhbSlzdHJlYW0pLnRvVG9rZW5UeXBlU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFNlZWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAgICAgICAvLyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgICAgICAgIC8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisgICAgICAgIFRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisgICAgICAgIFRyZWUgcjEgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSk7CisgICAgICAgIHIwLmFkZENoaWxkKHIxKTsKKyAgICAgICAgcjEuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKyAgICAgICAgVHJlZSByMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDYpKTsKKyAgICAgICAgcjIuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKyAgICAgICAgcjEuYWRkQ2hpbGQocjIpOworICAgICAgICByMC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA0KSkpOworICAgICAgICByMC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSkpOworCisgICAgICAgIFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ld1N0cmVhbShyMCk7CisgICAgICAgIHN0cmVhbS5jb25zdW1lKCk7IC8vIGNvbnN1bWUgMTAxCisgICAgICAgIHN0cmVhbS5jb25zdW1lKCk7IC8vIGNvbnN1bWUgRE4KKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDIKKyAgICAgICAgc3RyZWFtLnNlZWsoNyk7ICAgLy8gc2VlayB0byAxMDcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwNywgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDcKKyAgICAgICAgc3RyZWFtLmNvbnN1bWUoKTsgLy8gY29uc3VtZSBVUAorICAgICAgICBzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIFVQCisgICAgICAgIGFzc2VydEVxdWFscygxMDQsICgoVHJlZSlzdHJlYW0uTFQoMSkpLmdldFR5cGUoKSk7CisgICAgfSAgICAKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdENoYXJERkFDb252ZXJzaW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RDaGFyREZBQ29udmVyc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTExMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RDaGFyREZBQ29udmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuREZBOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkFPcHRpbWl6ZXI7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0Q2hhckRGQUNvbnZlcnNpb24gZXh0ZW5kcyBCYXNlVGVzdCB7CisKKwkvKiogUHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlZCBieSBUZXN0UmlnICovCisJcHVibGljIFRlc3RDaGFyREZBQ29udmVyc2lvbigpIHsKKwl9CisKKwkvLyBSIEEgTiBHIEUgUyAgJiAgUyBFIFQgUworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJhbmdlVmVyc3VzQ2hhcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYScuLid6JyAnQCcgfCAnaycgJyQnIDsiKTsKKwkJZy5jcmVhdGVMb29rYWhlYWRERkFzKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nayctPi5zMVxuIiArCisJCQkiLnMwLXsnYScuLidqJywgJ2wnLi4neid9LT46czI9PjFcbiIgKworCQkJIi5zMS0nJCctPjpzMz0+MlxuIiArCisJCQkiLnMxLSdAJy0+OnMyPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJhbmdlV2l0aERpc2pvaW50U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJy4uJ3onICdAJ1xuIiArCisJCQkiICB8ICgnayd8JzknfCdwJykgJyQnXG4iICsKKwkJCSIgIDtcbiIpOworCQlnLmNyZWF0ZUxvb2thaGVhZERGQXMoKTsKKwkJLy8gbXVzdCBicmVhayB1cCBhLi56IGludG8geydhJy4uJ2onLCAnbCcuLidvJywgJ3EnLi4neid9CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nOSctPjpzMz0+MlxuIiArCisJCQkiLnMwLXsnYScuLidqJywgJ2wnLi4nbycsICdxJy4uJ3onfS0+OnMyPT4xXG4iICsKKwkJCSIuczAteydrJywgJ3AnfS0+LnMxXG4iICsKKwkJCSIuczEtJyQnLT46czM9PjJcbiIgKworCQkJIi5zMS0nQCctPjpzMj0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REaXNqb2ludFNldENvbGxpZGluZ1dpdGhUd29SYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogKCdhJy4uJ3onfCcwJy4uJzknKSAnQCdcbiIgKworCQkJIiAgfCAoJ2snfCc5J3wncCcpICckJ1xuIiArCisJCQkiICA7XG4iKTsKKwkJZy5jcmVhdGVMb29rYWhlYWRERkFzKGZhbHNlKTsKKwkJLy8gbXVzdCBicmVhayB1cCBhLi56IGludG8geydhJy4uJ2onLCAnbCcuLidvJywgJ3EnLi4neid9IGFuZCAwLi45CisJCS8vIGludG8gMC4uOAorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAteycwJy4uJzgnLCAnYScuLidqJywgJ2wnLi4nbycsICdxJy4uJ3onfS0+OnMyPT4xXG4iICsKKwkJCSIuczAteyc5JywgJ2snLCAncCd9LT4uczFcbiIgKworCQkJIi5zMS0nJCctPjpzMz0+MlxuIiArCisJCQkiLnMxLSdAJy0+OnMyPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERpc2pvaW50U2V0Q29sbGlkaW5nV2l0aFR3b1Jhbmdlc0NoYXJzRmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogKCdrJ3wnOSd8J3AnKSAnJCdcbiIgKworCQkJIiAgfCAoJ2EnLi4neid8JzAnLi4nOScpICdAJ1xuIiArCisJCQkiICA7XG4iKTsKKwkJLy8gbXVzdCBicmVhayB1cCBhLi56IGludG8geydhJy4uJ2onLCAnbCcuLidvJywgJ3EnLi4neid9IGFuZCAwLi45CisJCS8vIGludG8gMC4uOAorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAteycwJy4uJzgnLCAnYScuLidqJywgJ2wnLi4nbycsICdxJy4uJ3onfS0+OnMzPT4yXG4iICsKKwkJCSIuczAteyc5JywgJ2snLCAncCd9LT4uczFcbiIgKworCQkJIi5zMS0nJCctPjpzMj0+MVxuIiArCisJCQkiLnMxLSdAJy0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERpc2pvaW50U2V0Q29sbGlkaW5nV2l0aFR3b1Jhbmdlc0FzU2VwYXJhdGVBbHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJy4uJ3onICdAJ1xuIiArCisJCQkiICB8ICdrJyAnJCdcbiIgKworCQkJIiAgfCAnOScgJyQnXG4iICsKKwkJCSIgIHwgJ3AnICckJ1xuIiArCisJCQkiICB8ICcwJy4uJzknICdAJ1xuIiArCisJCQkiICA7XG4iKTsKKwkJLy8gbXVzdCBicmVhayB1cCBhLi56IGludG8geydhJy4uJ2onLCAnbCcuLidvJywgJ3EnLi4neid9IGFuZCAwLi45CisJCS8vIGludG8gMC4uOAorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJzAnLi4nOCctPjpzOD0+NVxuIiArCisJCQkiLnMwLSc5Jy0+LnM2XG4iICsKKwkJCSIuczAtJ2snLT4uczFcbiIgKworCQkJIi5zMC0ncCctPi5zNFxuIiArCisJCQkiLnMwLXsnYScuLidqJywgJ2wnLi4nbycsICdxJy4uJ3onfS0+OnMyPT4xXG4iICsKKwkJCSIuczEtJyQnLT46czM9PjJcbiIgKworCQkJIi5zMS0nQCctPjpzMj0+MVxuIiArCisJCQkiLnM0LSckJy0+OnM1PT40XG4iICsKKwkJCSIuczQtJ0AnLT46czI9PjFcbiIgKworCQkJIi5zNi0nJCctPjpzNz0+M1xuIiArCisJCQkiLnM2LSdAJy0+OnM4PT41XG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEtleXdvcmRWZXJzdXNJRCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIklGIDogJ2lmJyA7XG4iICsgLy8gY2hvb3NlIHRoaXMgb3ZlciBJRAorCQkJIklEIDogKCdhJy4uJ3onKSsgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nYScuLid6Jy0+OnMyPT4xXG4iICsKKwkJCSIuczAtPEVPVD4tPjpzMT0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCQlleHBlY3RpbmcgPQorCQkJIi5zMC0naSctPi5zMVxuIiArCisJCQkiLnMwLXsnYScuLidoJywgJ2onLi4neid9LT46czQ9PjJcbiIgKworCQkJIi5zMS0nZictPi5zMlxuIiArCisJCQkiLnMxLTxFT1Q+LT46czQ9PjJcbiIgKworCQkJIi5zMi0nYScuLid6Jy0+OnM0PT4yXG4iICsKKwkJCSIuczItPEVPVD4tPjpzMz0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAyLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJZGVudGljYWxSdWxlcygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYScgO1xuIiArCisJCQkiQiA6ICdhJyA7XG4iKTsgLy8gY2FuJ3QgcmVhY2ggdGhpcworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ2EnLT4uczFcbiIgKworCQkJIi5zMS08RU9UPi0+OnMyPT4xXG4iOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbmV3IGludFtdIHsyfSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBleHBlY3RlZCBwcm9ibGVtcyIsCisJCQkJICAgIDEsIGVxdWV1ZS5zaXplKCkpOworCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KDApOworCQlhc3NlcnRUcnVlKCJ3YXJuaW5nIG11c3QgYmUgYW4gdW5yZWFjaGFibGUgYWx0IiwKKwkJCQkgICAgbXNnIGluc3RhbmNlb2YgR3JhbW1hclVucmVhY2hhYmxlQWx0c01lc3NhZ2UpOworCQlHcmFtbWFyVW5yZWFjaGFibGVBbHRzTWVzc2FnZSB1ID0gKEdyYW1tYXJVbnJlYWNoYWJsZUFsdHNNZXNzYWdlKW1zZzsKKwkJYXNzZXJ0RXF1YWxzKCJbMl0iLCB1LmFsdHMudG9TdHJpbmcoKSk7CisKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QWRqYWNlbnROb3RDaGFyTG9vcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogKH4ncicpKyA7XG4iICsKKwkJCSJCIDogKH4ncycpKyA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSdyJy0+OnMzPT4yXG4iICsKKwkJCSIuczAtJ3MnLT46czI9PjFcbiIgKworCQkJIi5zMC17J1xcdTAwMDAnLi4ncScsICd0Jy4uJ1xcdUZGRkYnfS0+LnMxXG4iICsKKwkJCSIuczEtJ3InLT46czM9PjJcbiIgKworCQkJIi5zMS08RU9UPi0+OnMyPT4xXG4iICsKKwkJCSIuczEteydcXHUwMDAwJy4uJ3EnLCAndCcuLidcXHVGRkZGJ30tPi5zMVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAzLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb25BZGphY2VudE5vdENoYXJMb29wcygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAofidyJykrIDtcbiIgKworCQkJIkIgOiAofid0JykrIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ3InLT46czM9PjJcbiIgKworCQkJIi5zMC0ndCctPjpzMj0+MVxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLidxJywgJ3MnLCAndScuLidcXHVGRkZGJ30tPi5zMVxuIiArCisJCQkiLnMxLSdyJy0+OnMzPT4yXG4iICsKKwkJCSIuczEtPEVPVD4tPjpzMj0+MVxuIiArCisJCQkiLnMxLXsnXFx1MDAwMCcuLidxJywgJ3MnLCAndScuLidcXHVGRkZGJ30tPi5zMVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAzLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMb29wc1dpdGhPcHRpbWl6ZWRPdXRFeGl0QnJhbmNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ3gnKiB+J3gnKyA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSd4Jy0+OnMxPT4xXG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ3cnLCAneScuLidcXHVGRkZGJ30tPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCisJCS8vIFRoZSBvcHRpbWl6ZXIgeWFua3Mgb3V0IGFsbCBleGl0IGJyYW5jaGVzIGZyb20gRUJORiBibG9ja3MKKwkJLy8gVGhpcyBpcyBvayBiZWNhdXNlIHdlJ3ZlIGFscmVhZHkgdmVyaWZpZWQgdGhlcmUgYXJlIG5vIHByb2JsZW1zCisJCS8vIHdpdGggdGhlIGVudGVyL2V4aXQgZGVjaXNpb24KKwkJREZBT3B0aW1pemVyIG9wdGltaXplciA9IG5ldyBERkFPcHRpbWl6ZXIoZyk7CisJCW9wdGltaXplci5vcHRpbWl6ZSgpOworCQlGQVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBGQVNlcmlhbGl6ZXIoZyk7CisJCURGQSBkZmEgPSBnLmdldExvb2thaGVhZERGQSgxKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGRmYS5zdGFydFN0YXRlKTsKKwkJZXhwZWN0aW5nID0gIi5zMC0neCctPjpzMT0+MVxuIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwkvLyBOIE8gTiBHIFIgRSBFIEQgWQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vbkdyZWVkeSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkNNVCA6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4gKSogJyovJyA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nKictPi5zMVxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLicpJywgJysnLi4nXFx1RkZGRid9LT46czM9PjFcbiIgKworCQkJIi5zMS0nLyctPjpzMj0+MlxuIiArCisJCQkiLnMxLXsnXFx1MDAwMCcuLicuJywgJzAnLi4nXFx1RkZGRid9LT46czM9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9uR3JlZWR5V2lsZGNhcmRTdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiU0xDTVQgOiAnLy8nICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqICdcbicgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ1xcbictPjpzMT0+MlxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLidcXHQnLCAnXFx1MDAwQicuLidcXHVGRkZGJ30tPjpzMj0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb25HcmVlZHlCeURlZmF1bHRXaWxkY2FyZFN0YXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJTTENNVCA6ICcvLycgLiogJ1xuJyA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nXFxuJy0+OnMxPT4yXG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ1xcdCcsICdcXHUwMDBCJy4uJ1xcdUZGRkYnfS0+OnMyPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vbkdyZWVkeVdpbGRjYXJkUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBzYW1lIERGQSBhcyBub25ncmVlZHkgLiogYnV0IGNvZGUgZ2VuIGNoZWNrcyBudW1iZXIgb2YKKwkJLy8gaXRlcmF0aW9ucyBhdCBydW50aW1lCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiU0xDTVQgOiAnLy8nICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkrICdcbicgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ1xcbictPjpzMT0+MlxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLidcXHQnLCAnXFx1MDAwQicuLidcXHVGRkZGJ30tPjpzMj0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb25HcmVlZHlCeURlZmF1bHRXaWxkY2FyZFBsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJTTENNVCA6ICcvLycgLisgJ1xuJyA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nXFxuJy0+OnMxPT4yXG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ1xcdCcsICdcXHUwMDBCJy4uJ1xcdUZGRkYnfS0+OnMyPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vbkdyZWVkeUJ5RGVmYXVsdFdpbGRjYXJkUGx1c1dpdGhQYXJlbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJTTENNVCA6ICcvLycgKC4pKyAnXG4nIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSdcXG4nLT46czE9PjJcbiIgKworCQkJIi5zMC17J1xcdTAwMDAnLi4nXFx0JywgJ1xcdTAwMEInLi4nXFx1RkZGRid9LT46czI9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9uV2lsZGNhcmROb25HcmVlZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJEVUggOiAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306J3gnfCd5JykqICd4eScgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ3gnLT4uczFcbiIgKworCQkJIi5zMC0neSctPjpzND0+MlxuIiArCisJCQkiLnMxLSd4Jy0+OnMzPT4xXG4iICsKKwkJCSIuczEtJ3knLT46czI9PjNcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9uV2lsZGNhcmRFT1RNYWtlc0l0V29ya1dpdGhvdXROb25HcmVlZHlPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJEVUggOiAoJ3gnfCd5JykqICd4eScgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ3gnLT4uczFcbiIgKworCQkJIi5zMC0neSctPjpzND0+MVxuIiArCisJCQkiLnMxLSd4Jy0+OnM0PT4xXG4iICsKKwkJCSIuczEtJ3knLT4uczJcbiIgKworCQkJIi5zMi0neCcuLid5Jy0+OnM0PT4xXG4iICsKKwkJCSIuczItPEVPVD4tPjpzMz0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBbHRDb25mbGljdHNXaXRoTG9vcFRoZW5FeGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFwiIHByZWRpY3RzIGFsdCAxLCBidXQgd2lsZGNhcmQgdGhlbiAiIGNhbiBwcmVkaWN0IGV4aXQgYWxzbworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIlNUUklORyA6ICdcIicgKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OiAnXFxcXFwiJyB8IC4pKiAnXCInIDtcbiIKKwkJKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSdcIictPjpzMT0+M1xuIiArCisJCQkJIi5zMC0nXFxcXCctPi5zMlxuIiArCisJCQkJIi5zMC17J1xcdTAwMDAnLi4nIScsICcjJy4uJ1snLCAnXScuLidcXHVGRkZGJ30tPjpzND0+MlxuIiArCisJCQkJIi5zMi0nXCInLT46czM9PjFcbiIgKworCQkJCSIuczIteydcXHUwMDAwJy4uJyEnLCAnIycuLidcXHVGRkZGJ30tPjpzND0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb25HcmVlZHlMb29wVGhhdE5ldmVyTG9vcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJEVUggOiAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306J3gnKSsgOyIpOyAvLyBsb29wIG5ldmVyIG1hdGNoZWQKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiOnMwPT4yXG4iOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbmV3IGludFtdIHsxfSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBleHBlY3RlZCBwcm9ibGVtcyIsCisJCQkJICAgIDEsIGVxdWV1ZS5zaXplKCkpOworCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KDApOworCQlhc3NlcnRUcnVlKCJ3YXJuaW5nIG11c3QgYmUgYW4gdW5yZWFjaGFibGUgYWx0IiwKKwkJCQkgICBtc2cgaW5zdGFuY2VvZiBHcmFtbWFyVW5yZWFjaGFibGVBbHRzTWVzc2FnZSk7CisJCUdyYW1tYXJVbnJlYWNoYWJsZUFsdHNNZXNzYWdlIHUgPSAoR3JhbW1hclVucmVhY2hhYmxlQWx0c01lc3NhZ2UpbXNnOworCQlhc3NlcnRFcXVhbHMoIlsxXSIsIHUuYWx0cy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHRoaXMgaXMgY29vbCBiZWNhdXNlIHRoZSAzcmQgYWx0IGluY2x1ZGVzICEoYWxsIG90aGVyIHBvc3NpYmlsaXRpZXMpCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgZHVoO1xuIiArCisJCQkiU1VCVEVNUExBVEVcbiIgKworCQkJIiAgICAgICAgOiAgICAgICAneydcbiIgKworCQkJIiAgICAgICAgICAgICAgICAoIFNVQlRFTVBMQVRFXG4iICsKKwkJCSIgICAgICAgICAgICAgICAgfCBFU0NcbiIgKworCQkJIiAgICAgICAgICAgICAgICB8IH4oJ30nfCdcXFxcJ3wneycpXG4iICsKKwkJCSIgICAgICAgICAgICAgICAgKSpcbiIgKworCQkJIiAgICAgICAgICAgICAgICAnfSdcbiIgKworCQkJIiAgICAgICAgO1xuIiArCisJCQkiZnJhZ21lbnRcbiIgKworCQkJIkVTQyAgICAgOiAgICAgICAnXFxcXCcgLiA7Iik7CisJCWcuY3JlYXRlTG9va2FoZWFkREZBcygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ1xcXFwnLT46czI9PjJcbiIgKworCQkJIi5zMC0neyctPjpzMT0+MVxuIiArCisJCQkiLnMwLSd9Jy0+OnM0PT40XG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ1snLCAnXScuLid6JywgJ3wnLCAnficuLidcXHVGRkZGJ30tPjpzMz0+M1xuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHRoaXMgaXMgYWxzbyBjb29sIGJlY2F1c2UgaXQgcmVzb2x2ZXMgXFwgdG8gYmUgRVNDIGFsdDsgaXQncyBqdXN0CisJCS8vIGxlc3MgZWZmaWNpZW50IG9mIGEgREZBCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgZHVoO1xuIiArCisJCQkiU1VCVEVNUExBVEVcbiIgKworCQkJIiAgICAgICAgOiAgICAgICAneydcbiIgKworCQkJIiAgICAgICAgICAgICAgICAoIFNVQlRFTVBMQVRFXG4iICsKKwkJCSIgICAgICAgICAgICAgICAgfCBFU0NcbiIgKworCQkJIiAgICAgICAgICAgICAgICB8IH4oJ30nfCd7JylcbiIgKworCQkJIiAgICAgICAgICAgICAgICApKlxuIiArCisJCQkiICAgICAgICAgICAgICAgICd9J1xuIiArCisJCQkiICAgICAgICA7XG4iICsKKwkJCSJmcmFnbWVudFxuIiArCisJCQkiRVNDICAgICA6ICAgICAgICdcXFxcJyAuIDsiKTsKKwkJZy5jcmVhdGVMb29rYWhlYWRERkFzKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nXFxcXCctPi5zM1xuIiArCisJCQkiLnMwLSd7Jy0+OnMyPT4xXG4iICsKKwkJCSIuczAtJ30nLT46czE9PjRcbiIgKworCQkJIi5zMC17J1xcdTAwMDAnLi4nWycsICddJy4uJ3onLCAnfCcsICd+Jy4uJ1xcdUZGRkYnfS0+OnM1PT4zXG4iICsKKwkJCSIuczMtJ1xcXFwnLT46czg9PjJcbiIgKworCQkJIi5zMy0neyctPjpzNz0+MlxuIiArCisJCQkiLnMzLSd9Jy0+LnM0XG4iICsKKwkJCSIuczMteydcXHUwMDAwJy4uJ1snLCAnXScuLid6JywgJ3wnLCAnficuLidcXHVGRkZGJ30tPjpzNj0+MlxuIiArCisJCQkiLnM0LSdcXHUwMDAwJy4uJ1xcdUZGRkYnLT46czY9PjJcbiIgKworCQkJIi5zNC08RU9UPi0+OnM1PT4zXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdEZyYWdtZW50SW5MZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIFQ7XG4iKworCQkJIkEgOiAnYScgfCB+QiB7O30gO1xuIiArCisJCQkiZnJhZ21lbnQgQiA6ICdhJyA7XG4iKTsKKwkJZy5jcmVhdGVMb29rYWhlYWRERkFzKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nYSctPjpzMT0+MVxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLidgJywgJ2InLi4nXFx1RkZGRid9LT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0RnJhZ21lbnRJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgVDtcbiIrCisJCQkiQSA6IEIgfCB+QiB7O30gO1xuIiArCisJCQkiZnJhZ21lbnQgQiA6ICdhJ3wnYicgO1xuIik7CisJCWcuY3JlYXRlTG9va2FoZWFkREZBcygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ2EnLi4nYictPjpzMT0+MVxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLidgJywgJ2MnLi4nXFx1RkZGRid9LT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90VG9rZW5JbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgVDtcbiIrCisJCQkiQSA6ICd4JyAoJ2EnIHwgfkIgezt9KSA7XG4iICsKKwkJCSJCIDogJ2EnIDtcbiIpOworCQlnLmNyZWF0ZUxvb2thaGVhZERGQXMoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSdhJy0+OnMxPT4xXG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ2AnLCAnYicuLidcXHVGRkZGJ30tPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RDb21wbGljYXRlZFNldFJ1bGVJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgVDtcbiIrCisJCQkiQSA6IEIgfCB+QiB7O30gO1xuIiArCisJCQkiZnJhZ21lbnQgQiA6ICdhJ3wnYid8J2MnLi4nZSd8QyA7XG4iICsKKwkJCSJmcmFnbWVudCBDIDogJ2YnIDtcbiIpOyAvLyBoYXMgdG8gc2VlbiBmcm9tIEIgdG8gQworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ2EnLi4nZictPjpzMT0+MVxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLidgJywgJ2cnLi4nXFx1RkZGRid9LT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0V2l0aFJ1bGVJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgVDtcbiIrCisJCQkiVCA6IH4oJ2EnIHwgQikgfCAnYSc7XG4iICsKKwkJCSJmcmFnbWVudFxuIiArCisJCQkiQiA6ICdiJyA7XG4iICsKKwkJCSJDIDogfid4J3s7fSA7Iik7IC8vIGZvcmNlIFRva2VucyB0byBub3QgY29sbGFwc2UgVHxDCisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nYictPjpzMz0+MlxuIiArCisJCQkiLnMwLSd4Jy0+OnMyPT4xXG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ2EnLCAnYycuLid3JywgJ3knLi4nXFx1RkZGRid9LT4uczFcbiIgKworCQkJIi5zMS08RU9UPi0+OnMyPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldENhbGxzUnVsZVdpdGhOb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBBO1xuIiArCisJCQkiVCA6IH4neCcgO1xuIiArCisJCQkiUyA6ICd4JyAoVCB8ICd4JykgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0neCctPjpzMj0+MlxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLid3JywgJ3knLi4nXFx1RkZGRid9LT46czE9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3luUHJlZEluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBUO1xuIisKKwkJCSJMVDogICc8JyAnICcqXG4iICsKKwkJCSIgIHwgICgnPCcgSURFTlQpID0+ICc8JyBJREVOVCAnPidcbiIgKyAvLyB0aGlzIHdhcyBjYXVzaW5nIHN5bnRheCBlcnJvcgorCQkJIiAgO1xuIiArCisJCQkiSURFTlQ6ICAgICdhJys7XG4iKTsKKwkJLy8gYmFzaWNhbGx5LCBUb2tlbnMgcnVsZSBzaG91bGQgbm90IGRvIHNldCBjb21wcmVzc2lvbiB0ZXN0CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nPCctPjpzMT0+MVxuIiArCisJCQkiLnMwLSdhJy0+OnMyPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDQsIGV4cGVjdGluZywgbnVsbCk7IC8vIDQgaXMgVG9rZW5zIHJ1bGUKKwl9CisKKwkvLyBTIFUgUCBQIE8gUiBUCisKKwlwdWJsaWMgdm9pZCBfdGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciBUO1xuIisKKwkJCSJhIDogQSB8IEI7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrRGVjaXNpb24oR3JhbW1hciBnLAorCQkJCQkJCQkgaW50IGRlY2lzaW9uLAorCQkJCQkJCQkgU3RyaW5nIGV4cGVjdGluZywKKwkJCQkJCQkJIGludFtdIGV4cGVjdGluZ1VucmVhY2hhYmxlQWx0cykKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKworCQkvLyBtaW1pYyBhY3Rpb25zIG9mIG9yZy5hbnRsci5Ub29sIGZpcnN0IHRpbWUgZm9yIGdyYW1tYXIgZworCQlpZiAoIGcuZ2V0Q29kZUdlbmVyYXRvcigpPT1udWxsICkgeworCQkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihudWxsLCBnLCAiSmF2YSIpOworCQkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCQlnLmJ1aWxkTkZBKCk7CisJCQlnLmNyZWF0ZUxvb2thaGVhZERGQXMoZmFsc2UpOworCQl9CisKKwkJREZBIGRmYSA9IGcuZ2V0TG9va2FoZWFkREZBKGRlY2lzaW9uKTsKKwkJYXNzZXJ0Tm90TnVsbCgidW5rbm93biBkZWNpc2lvbiAjIitkZWNpc2lvbiwgZGZhKTsKKwkJRkFTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRkFTZXJpYWxpemVyKGcpOworCQlTdHJpbmcgcmVzdWx0ID0gc2VyaWFsaXplci5zZXJpYWxpemUoZGZhLnN0YXJ0U3RhdGUpOworCQkvL1N5c3RlbS5vdXQucHJpbnQocmVzdWx0KTsKKwkJTGlzdCBub25EZXRBbHRzID0gZGZhLmdldFVucmVhY2hhYmxlQWx0cygpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWx0cyB3L28gcHJlZGljdCBzdGF0ZT0iK25vbkRldEFsdHMpOworCisJCS8vIGZpcnN0IG1ha2Ugc3VyZSBub25kZXRlcm1pbmlzdGljIGFsdHMgYXJlIGFzIGV4cGVjdGVkCisJCWlmICggZXhwZWN0aW5nVW5yZWFjaGFibGVBbHRzPT1udWxsICkgeworCQkJaWYgKCBub25EZXRBbHRzIT1udWxsICYmIG5vbkRldEFsdHMuc2l6ZSgpIT0wICkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbigibm9uZGV0ZXJtaW5pc3RpYyBhbHRzIChzaG91bGQgYmUgZW1wdHkpOiAiK25vbkRldEFsdHMpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKCJ1bnJlYWNoYWJsZSBhbHRzIG1pc21hdGNoIiwgMCwgbm9uRGV0QWx0cyE9bnVsbD9ub25EZXRBbHRzLnNpemUoKTowKTsKKwkJfQorCQllbHNlIHsKKwkJCWZvciAoaW50IGk9MDsgaTxleHBlY3RpbmdVbnJlYWNoYWJsZUFsdHMubGVuZ3RoOyBpKyspIHsKKwkJCQlhc3NlcnRUcnVlKCJ1bnJlYWNoYWJsZSBhbHRzIG1pc21hdGNoIiwKKwkJCQkJCSAgIG5vbkRldEFsdHMhPW51bGw/bm9uRGV0QWx0cy5jb250YWlucyhuZXcgSW50ZWdlcihleHBlY3RpbmdVbnJlYWNoYWJsZUFsdHNbaV0pKTpmYWxzZSk7CisJCQl9CisJCX0KKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdENvbW1vblRva2VuU3RyZWFtLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RDb21tb25Ub2tlblN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjFmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RDb21tb25Ub2tlblN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5JbnRlcnByZXRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqIFRoaXMgYWN0dWFsbHkgdGVzdHMgbmV3ICgxMi80LzA5KSBidWZmZXJlZCBidXQgb24tZGVtYW5kIGZldGNoaW5nIHN0cmVhbSAqLworcHVibGljIGNsYXNzIFRlc3RDb21tb25Ub2tlblN0cmVhbSBleHRlbmRzIEJhc2VUZXN0IHsKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Rmlyc3RUb2tlbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKyAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiU0VNSSA6ICc7JztcbiIgKworICAgICAgICAgICAgIkFTU0lHTiA6ICc9JztcbiIgKworICAgICAgICAgICAgIlBMVVMgOiAnKyc7XG4iICsKKyAgICAgICAgICAgICJNVUxUIDogJyonO1xuIiArCisgICAgICAgICAgICAiV1MgOiAnICcrO1xuIik7CisgICAgICAgIC8vIFRva2VuczogMDEyMzQ1Njc4OTAxMjM0NTY3CisgICAgICAgIC8vIElucHV0OiAgeCA9IDMgKiAwICsgMiAqIDA7CisgICAgICAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oInggPSAzICogMCArIDIgKiAwOyIpOworICAgICAgICBJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworICAgICAgICBCdWZmZXJlZFRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBCdWZmZXJlZFRva2VuU3RyZWFtKGxleEVuZ2luZSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRva2Vucy5MVCgxKS5nZXRUZXh0KCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAieCI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdDJuZFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgImxleGVyIGdyYW1tYXIgdDtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6Jys7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJTRU1JIDogJzsnO1xuIiArCisgICAgICAgICAgICAiQVNTSUdOIDogJz0nO1xuIiArCisgICAgICAgICAgICAiUExVUyA6ICcrJztcbiIgKworICAgICAgICAgICAgIk1VTFQgOiAnKic7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICcgJys7XG4iKTsKKyAgICAgICAgLy8gVG9rZW5zOiAwMTIzNDU2Nzg5MDEyMzQ1NjcKKyAgICAgICAgLy8gSW5wdXQ6ICB4ID0gMyAqIDAgKyAyICogMDsKKyAgICAgICAgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgieCA9IDMgKiAwICsgMiAqIDA7Iik7CisgICAgICAgIEludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisgICAgICAgIEJ1ZmZlcmVkVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IEJ1ZmZlcmVkVG9rZW5TdHJlYW0obGV4RW5naW5lKTsKKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLkxUKDIpLmdldFRleHQoKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICIgIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciB0O1xuIisKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKztcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIlNFTUkgOiAnOyc7XG4iICsKKyAgICAgICAgICAgICJBU1NJR04gOiAnPSc7XG4iICsKKyAgICAgICAgICAgICJQTFVTIDogJysnO1xuIiArCisgICAgICAgICAgICAiTVVMVCA6ICcqJztcbiIgKworICAgICAgICAgICAgIldTIDogJyAnKztcbiIpOworICAgICAgICAvLyBUb2tlbnM6IDAxMjM0NTY3ODkwMTIzNDU2NworICAgICAgICAvLyBJbnB1dDogIHggPSAzICogMCArIDIgKiAwOworICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJ4ID0gMyAqIDAgKyAyICogMDsiKTsKKyAgICAgICAgSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKyAgICAgICAgQnVmZmVyZWRUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQnVmZmVyZWRUb2tlblN0cmVhbShsZXhFbmdpbmUpOworCisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgVG9rZW4gdCA9IHRva2Vucy5MVChpKTsKKyAgICAgICAgd2hpbGUgKCB0LmdldFR5cGUoKSE9VG9rZW4uRU9GICkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgdCA9IHRva2Vucy5MVChpKTsKKyAgICAgICAgfQorICAgICAgICB0b2tlbnMuTFQoaSsrKTsgLy8gcHVzaCBpdCBwYXN0IGVuZAorICAgICAgICB0b2tlbnMuTFQoaSsrKTsKKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAieCA9IDMgKiAwICsgMiAqIDA7IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVCdWZmZXJBZnRlckNvbnN1bWluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKyAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiU0VNSSA6ICc7JztcbiIgKworICAgICAgICAgICAgIkFTU0lHTiA6ICc9JztcbiIgKworICAgICAgICAgICAgIlBMVVMgOiAnKyc7XG4iICsKKyAgICAgICAgICAgICJNVUxUIDogJyonO1xuIiArCisgICAgICAgICAgICAiV1MgOiAnICcrO1xuIik7CisgICAgICAgIC8vIFRva2VuczogMDEyMzQ1Njc4OTAxMjM0NTY3CisgICAgICAgIC8vIElucHV0OiAgeCA9IDMgKiAwICsgMiAqIDA7CisgICAgICAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oInggPSAzICogMCArIDIgKiAwOyIpOworICAgICAgICBJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworICAgICAgICBCdWZmZXJlZFRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBCdWZmZXJlZFRva2VuU3RyZWFtKGxleEVuZ2luZSk7CisKKyAgICAgICAgVG9rZW4gdCA9IHRva2Vucy5MVCgxKTsKKyAgICAgICAgd2hpbGUgKCB0LmdldFR5cGUoKSE9VG9rZW4uRU9GICkgeworICAgICAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsKKyAgICAgICAgICAgIHQgPSB0b2tlbnMuTFQoMSk7CisgICAgICAgIH0KKyAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsKKyAgICAgICAgdG9rZW5zLkxUKDEpOyAvLyBwdXNoIGl0IHBhc3QgZW5kCisgICAgICAgIHRva2Vucy5jb25zdW1lKCk7CisgICAgICAgIHRva2Vucy5MVCgxKTsKKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAieCA9IDMgKiAwICsgMiAqIDA7IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TG9va2JhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciB0O1xuIisKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKztcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIlNFTUkgOiAnOyc7XG4iICsKKyAgICAgICAgICAgICJBU1NJR04gOiAnPSc7XG4iICsKKyAgICAgICAgICAgICJQTFVTIDogJysnO1xuIiArCisgICAgICAgICAgICAiTVVMVCA6ICcqJztcbiIgKworICAgICAgICAgICAgIldTIDogJyAnKztcbiIpOworICAgICAgICAvLyBUb2tlbnM6IDAxMjM0NTY3ODkwMTIzNDU2NworICAgICAgICAvLyBJbnB1dDogIHggPSAzICogMCArIDIgKiAwOworICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJ4ID0gMyAqIDAgKyAyICogMDsiKTsKKyAgICAgICAgSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKyAgICAgICAgQnVmZmVyZWRUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQnVmZmVyZWRUb2tlblN0cmVhbShsZXhFbmdpbmUpOworCisgICAgICAgIHRva2Vucy5jb25zdW1lKCk7IC8vIGdldCB4IGludG8gYnVmZmVyCisgICAgICAgIFRva2VuIHQgPSB0b2tlbnMuTFQoLTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIngiLCB0LmdldFRleHQoKSk7CisKKyAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsKKyAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsgLy8gY29uc3VtZSAnPScKKyAgICAgICAgdCA9IHRva2Vucy5MVCgtMyk7CisgICAgICAgIGFzc2VydEVxdWFscygieCIsIHQuZ2V0VGV4dCgpKTsKKyAgICAgICAgdCA9IHRva2Vucy5MVCgtMik7CisgICAgICAgIGFzc2VydEVxdWFscygiICIsIHQuZ2V0VGV4dCgpKTsKKyAgICAgICAgdCA9IHRva2Vucy5MVCgtMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPSIsIHQuZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0T2ZmQ2hhbm5lbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUb2tlblNvdXJjZSBsZXhlciA9IC8vIHNpbXVsYXRlIGlucHV0ICIgeCA9MzQgIDtcbiIKKyAgICAgICAgICAgIG5ldyBUb2tlblNvdXJjZSgpIHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgVG9rZW5bXSB0b2tlbnMgPSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tb25Ub2tlbigxLCIgIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tb25Ub2tlbigxLCJ4IiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tb25Ub2tlbigxLCIgIiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tb25Ub2tlbigxLCI9IiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tb25Ub2tlbigxLCIzNCIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbW9uVG9rZW4oMSwiICIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbW9uVG9rZW4oMSwiICIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbW9uVG9rZW4oMSwiOyIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbW9uVG9rZW4oMSwiXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1vblRva2VuKFRva2VuLkVPRiwiIikKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zWzBdLnNldENoYW5uZWwoTGV4ZXIuSElEREVOKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zWzJdLnNldENoYW5uZWwoTGV4ZXIuSElEREVOKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zWzVdLnNldENoYW5uZWwoTGV4ZXIuSElEREVOKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zWzZdLnNldENoYW5uZWwoTGV4ZXIuSElEREVOKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zWzhdLnNldENoYW5uZWwoTGV4ZXIuSElEREVOKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIFRva2VuIG5leHRUb2tlbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vuc1tpKytdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKSB7IHJldHVybiAidGVzdCI7IH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgQ29tbW9uVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIngiLCB0b2tlbnMuTFQoMSkuZ2V0VGV4dCgpKTsgLy8gbXVzdCBza2lwIGZpcnN0IG9mZiBjaGFubmVsIHRva2VuCisgICAgICAgIHRva2Vucy5jb25zdW1lKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiPSIsIHRva2Vucy5MVCgxKS5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIngiLCB0b2tlbnMuTFQoLTEpLmdldFRleHQoKSk7CisKKyAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzNCIsIHRva2Vucy5MVCgxKS5nZXRUZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIj0iLCB0b2tlbnMuTFQoLTEpLmdldFRleHQoKSk7CisKKyAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7IiwgdG9rZW5zLkxUKDEpLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMzQiLCB0b2tlbnMuTFQoLTEpLmdldFRleHQoKSk7CisKKyAgICAgICAgdG9rZW5zLmNvbnN1bWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRva2VuLkVPRiwgdG9rZW5zLkxBKDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7IiwgdG9rZW5zLkxUKC0xKS5nZXRUZXh0KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMzQiLCB0b2tlbnMuTFQoLTIpLmdldFRleHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPSIsIHRva2Vucy5MVCgtMykuZ2V0VGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdG9rZW5zLkxUKC00KS5nZXRUZXh0KCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RDb21wb3NpdGVHcmFtbWFycy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0Q29tcG9zaXRlR3JhbW1hcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjEzYmZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0Q29tcG9zaXRlR3JhbW1hcnMuamF2YQpAQCAtMCwwICsxLDk3MyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIFRlc3RDb21wb3NpdGVHcmFtbWFycyBleHRlbmRzIEJhc2VUZXN0IHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkU3RpbGxXb3JrcygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiYSA6IEIgLiBDIDtcbiI7IC8vIG5vdCBxdWFsaWZpZWQgSUQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlbGVnYXRvckludm9rZXNEZWxlZ2F0ZVJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHNsYXZlID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiYSA6IEIge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuYVwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTO1xuIiArCisJCQkicyA6IGEgO1xuIiArCisJCQkiQiA6ICdiJyA7IiArIC8vIGRlZmluZXMgQiBmcm9tIGluaGVyaXRlZCB0b2tlbiBzcGFjZQorCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJNLmciLCBtYXN0ZXIsICJNUGFyc2VyIiwgIk1MZXhlciIsCisJCQkJCQkJCSAgInMiLCAiYiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJTLmFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9ySW52b2tlc0RlbGVnYXRlUnVsZVdpdGhBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIG11c3QgZ2VuZXJhdGUgc29tZXRoaW5nIGxpa2U6CisJCS8vIHB1YmxpYyBpbnQgYShpbnQgeCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsgcmV0dXJuIGdTLmEoeCk7IH0KKwkJLy8gaW4gTS4KKwkJU3RyaW5nIHNsYXZlID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiYVtpbnQgeF0gcmV0dXJucyBbaW50IHldIDogQiB7U3lzdGVtLm91dC5wcmludChcIlMuYVwiKTsgJHk9MTAwMDt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTO1xuIiArCisJCQkicyA6IGxhYmVsPWFbM10ge1N5c3RlbS5vdXQucHJpbnRsbigkbGFiZWwueSk7fSA7XG4iICsKKwkJCSJCIDogJ2InIDsiICsgLy8gZGVmaW5lcyBCIGZyb20gaW5oZXJpdGVkIHRva2VuIHNwYWNlCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCAiTUxleGVyIiwKKwkJCQkJCQkJICAicyIsICJiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIlMuYTEwMDBcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9ySW52b2tlc0RlbGVnYXRlUnVsZVdpdGhSZXR1cm5TdHJ1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gbXVzdCBnZW5lcmF0ZSBzb21ldGhpbmcgbGlrZToKKwkJLy8gcHVibGljIGludCBhKGludCB4KSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geyByZXR1cm4gZ1MuYSh4KTsgfQorCQkvLyBpbiBNLgorCQlTdHJpbmcgc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsKKwkJCSJhIDogQiB7U3lzdGVtLm91dC5wcmludChcIlMuYVwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTO1xuIiArCisJCQkicyA6IGEge1N5c3RlbS5vdXQucHJpbnRsbigkYS50ZXh0KTt9IDtcbiIgKworCQkJIkIgOiAnYicgOyIgKyAvLyBkZWZpbmVzIEIgZnJvbSBpbmhlcml0ZWQgdG9rZW4gc3BhY2UKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorCQkJCQkJCQkgICJzIiwgImIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiUy5hYlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWxlZ2F0b3JBY2Nlc3Nlc0RlbGVnYXRlTWVtYmVycygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsKKwkJCSJAbWVtYmVycyB7XG4iICsKKwkJCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJmb29cIik7fVxuIiArCisJCQkifVxuIiArCisJCQkiYSA6IEIgO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCQkvLyB1c2VzIG5vIHJ1bGVzIGZyb20gdGhlIGltcG9ydAorCQkJImltcG9ydCBTO1xuIiArCisJCQkicyA6ICdiJyB7Z1MuZm9vKCk7fSA7XG4iICsgLy8gZ1MgaXMgaW1wb3J0IHBvaW50ZXIKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorCQkJCQkJCQkgICJzIiwgImIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiZm9vXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlbGVnYXRvckludm9rZXNGaXJzdFZlcnNpb25PZkRlbGVnYXRlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsKKwkJCSJhIDogYiB7U3lzdGVtLm91dC5wcmludGxuKFwiUy5hXCIpO30gO1xuIiArCisJCQkiYiA6IEIgO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisJCVN0cmluZyBzbGF2ZTIgPQorCQkJInBhcnNlciBncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogQiB7U3lzdGVtLm91dC5wcmludGxuKFwiVC5hXCIpO30gO1xuIjsgLy8gaGlkZGVuIGJ5IFMuYQorCQl3cml0ZUZpbGUodG1wZGlyLCAiVC5nIiwgc2xhdmUyKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFMsVDtcbiIgKworCQkJInMgOiBhIDtcbiIgKworCQkJIkIgOiAnYicgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCAiTUxleGVyIiwKKwkJCQkJCQkJICAicyIsICJiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIlMuYVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWxlZ2F0ZXNTZWVTYW1lVG9rZW5UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKyAvLyBBLCBCLCBDIHRva2VuIHR5cGUgb3JkZXIKKwkJCSJ0b2tlbnMgeyBBOyBCOyBDOyB9XG4iICsKKwkJCSJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIHNsYXZlMiA9CisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworCQkJInRva2VucyB7IEM7IEI7IEE7IH1cbiIgKyAvLyByZXZlcnNlIG9yZGVyCisJCQkieSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlQueVwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZTIpOworCQkvLyBUaGUgbGV4ZXIgd2lsbCBjcmVhdGUgcnVsZXMgdG8gbWF0Y2ggbGV0dGVycyBhLCBiLCBjLgorCQkvLyBUaGUgYXNzb2NpYXRlZCB0b2tlbiB0eXBlcyBBLCBCLCBDIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZQorCQkvLyBhbmQgYWxsIGltcG9ydCdkIHBhcnNlcnMuICBTaW5jZSBBTlRMUiByZWdlbmVyYXRlcyBhbGwgaW1wb3J0cworCQkvLyBmb3IgdXNlIHdpdGggdGhlIGRlbGVnYXRvciBNLCBpdCBjYW4gZ2VuZXJhdGUgdGhlIHNhbWUgdG9rZW4gdHlwZQorCQkvLyBtYXBwaW5nIGluIGVhY2ggcGFyc2VyOgorCQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDPTY7CisJCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRj0tMTsKKwkJLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQj01OworCQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUz03OworCQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBPTQ7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFMsVDtcbiIgKworCQkJInMgOiB4IHkgO1xuIiArIC8vIG1hdGNoZXMgQUEsIHdoaWNoIHNob3VsZCBiZSAiYWEiCisJCQkiQiA6ICdiJyA7XG4iICsgLy8gYW5vdGhlciBvcmRlcjogQiwgQSwgQworCQkJIkEgOiAnYScgO1xuIiArCisJCQkiQyA6ICdjJyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorCQkJCQkJCQkgICJzIiwgImFhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIlMueFxuIiArCisJCQkJCSAiVC55XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlbGVnYXRlc1NlZVNhbWVUb2tlblR5cGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIHNsYXZlID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBTO1xuIiArIC8vIEEsIEIsIEMgdG9rZW4gdHlwZSBvcmRlcgorCQkJInRva2VucyB7IEE7IEI7IEM7IH1cbiIgKworCQkJInggOiBBIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLnhcIik7fSA7XG4iOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCQlTdHJpbmcgc2xhdmUyID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBUO1xuIiArCisJCQkidG9rZW5zIHsgQzsgQjsgQTsgfVxuIiArIC8vIHJldmVyc2Ugb3JkZXIKKwkJCSJ5IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiVC55XCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlQuZyIsIHNsYXZlMik7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFMsVDtcbiIgKworCQkJInMgOiB4IHkgO1xuIiArIC8vIG1hdGNoZXMgQUEsIHdoaWNoIHNob3VsZCBiZSAiYWEiCisJCQkiQiA6ICdiJyA7XG4iICsgLy8gYW5vdGhlciBvcmRlcjogQiwgQSwgQworCQkJIkEgOiAnYScgO1xuIiArCisJCQkiQyA6ICdjJyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKwkJQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisJCWNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKwkJZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisJCWcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltBPTQsIEI9NSwgQz02LCBXUz03XSI7CisJCVN0cmluZyBleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSAie30iOworCQlTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW0EsIEIsIEMsIFdTXSI7CisKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCwKKwkJCQkJIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCwgZy5jb21wb3NpdGUuc3RyaW5nTGl0ZXJhbFRvVHlwZU1hcC50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0LAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWRJbXBvcnRzQ29tYmluZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gZm9yIG5vdywgd2UgZG9uJ3QgYWxsb3cgY29tYmluZWQgdG8gaW1wb3J0IGNvbWJpbmVkCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIHNsYXZlID0KKwkJCSJncmFtbWFyIFM7XG4iICsgLy8gQSwgQiwgQyB0b2tlbiB0eXBlIG9yZGVyCisJCQkidG9rZW5zIHsgQTsgQjsgQzsgfVxuIiArCisJCQkieCA6ICd4JyBJTlQge1N5c3RlbS5vdXQucHJpbnRsbihcIlMueFwiKTt9IDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTO1xuIiArCisJCQkicyA6IHggSU5UIDtcbiI7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJNLmciLCBtYXN0ZXIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisJCUNvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvTS5nIixjb21wb3NpdGUpOworCQljb21wb3NpdGUuc2V0RGVsZWdhdGlvblJvb3QoZyk7CisJCWcucGFyc2VBbmRCdWlsZEFTVCgpOworCQlnLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDEsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwkJU3RyaW5nIGV4cGVjdGVkRXJyb3IgPSAiZXJyb3IoMTYxKTogIit0bXBkaXIudG9TdHJpbmcoKS5yZXBsYWNlRmlyc3QoIlxcLVswLTldKyIsIiIpKyIvTS5nOjI6ODogY29tYmluZWQgZ3JhbW1hciBNIGNhbm5vdCBpbXBvcnQgY29tYmluZWQgZ3JhbW1hciBTIjsKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIGV4cGVjdGVkRXJyb3IsIGVxdWV1ZS5lcnJvcnMuZ2V0KDApLnRvU3RyaW5nKCkucmVwbGFjZUZpcnN0KCJcXC1bMC05XSsiLCIiKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNhbWVTdHJpbmdUd29OYW1lcygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKworCQkJInRva2VucyB7IEE9J2EnOyB9XG4iICsKKwkJCSJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIHNsYXZlMiA9CisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworCQkJInRva2VucyB7IFg9J2EnOyB9XG4iICsKKwkJCSJ5IDogWCB7U3lzdGVtLm91dC5wcmludGxuKFwiVC55XCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlQuZyIsIHNsYXZlMik7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFMsVDtcbiIgKworCQkJInMgOiB4IHkgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJNLmciLCBtYXN0ZXIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisJCUNvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvTS5nIixjb21wb3NpdGUpOworCQljb21wb3NpdGUuc2V0RGVsZWdhdGlvblJvb3QoZyk7CisJCWcucGFyc2VBbmRCdWlsZEFTVCgpOworCQlnLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisKKwkJU3RyaW5nIGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCA9ICJbQT00LCBXUz01LCBYPTZdIjsKKwkJU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7J2EnPTR9IjsKKwkJU3RyaW5nIGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0ID0gIltBLCBXUywgWF0iOworCisJCWFzc2VydEVxdWFscyhleHBlY3RlZFRva2VuSURUb1R5cGVNYXAsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcCkudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXAudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCwKKwkJCQkJIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QpLnRvU3RyaW5nKCkpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJYPSdhJyI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAiQSI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19UT0tFTl9BTElBU19DT05GTElDVDsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAxLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkRXJyb3IgPQorCQkJImVycm9yKDE1OCk6IFQuZzoyOjEwOiBjYW5ub3QgYWxpYXMgWD0nYSc7IHN0cmluZyBhbHJlYWR5IGFzc2lnbmVkIHRvIEEiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFcnJvciwgZXF1ZXVlLmVycm9ycy5nZXQoMCkudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNhbWVOYW1lVHdvU3RyaW5ncygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKworCQkJInRva2VucyB7IEE9J2EnOyB9XG4iICsKKwkJCSJ4IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiUy54XCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIHNsYXZlMiA9CisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworCQkJInRva2VucyB7IEE9J3gnOyB9XG4iICsKKwkJCSJ5IDogQSB7U3lzdGVtLm91dC5wcmludGxuKFwiVC55XCIpO30gO1xuIjsKKwkJCisJCXdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZTIpOworCisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTLFQ7XG4iICsKKwkJCSJzIDogeCB5IDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworCQl3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKwkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKwkJZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCisJCVN0cmluZyBleHBlY3RlZFRva2VuSURUb1R5cGVNYXAgPSAiW0E9NCwgVF9fNj02LCBXUz01XSI7CisJCVN0cmluZyBleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSAieydhJz00LCAneCc9Nn0iOworCQlTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW0EsIFdTLCBUX182XSI7CisKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCwKKwkJCQkJIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCwgc29ydE1hcFRvU3RyaW5nKGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXApKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0LAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIkE9J3gnIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICInYSciOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfVE9LRU5fQUxJQVNfUkVBU1NJR05NRU5UOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDEsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRFcnJvciA9CisJCQkiZXJyb3IoMTU5KTogVC5nOjI6MTA6IGNhbm5vdCBhbGlhcyBBPSd4JzsgdG9rZW4gbmFtZSBhbHJlYWR5IGFzc2lnbmVkIHRvICdhJyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZEVycm9yLCBlcXVldWUuZXJyb3JzLmdldCgwKS50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0ZWRUb2tlblZvY2FiSWdub3JlZFdpdGhXYXJuaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIHNsYXZlID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisJCQkib3B0aW9ucyB7dG9rZW5Wb2NhYj13aGF0ZXZlcjt9XG4iICsKKwkJCSJ0b2tlbnMgeyBBPSdhJzsgfVxuIiArCisJCQkieCA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlMueFwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJzIDogeCA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKwkJQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisJCWNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKwkJZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisJCWcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiUyI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19UT0tFTl9WT0NBQl9JTl9ERUxFR0FURTsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc1dhcm5pbmcoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAxLCBlcXVldWUud2FybmluZ3Muc2l6ZSgpKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRFcnJvciA9CisJCQkid2FybmluZygxNjApOiBTLmc6MjoxMDogdG9rZW5Wb2NhYiBvcHRpb24gaWdub3JlZCBpbiBpbXBvcnRlZCBncmFtbWFyIFMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFcnJvciwgZXF1ZXVlLndhcm5pbmdzLmdldCgwKS50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0ZWRUb2tlblZvY2FiV29ya3NJblJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlTdHJpbmcgc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsKKwkJCSJ0b2tlbnMgeyBBPSdhJzsgfVxuIiArCisJCQkieCA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlMueFwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisKKwkJU3RyaW5nIHRva2VucyA9CisJCQkiQT05OVxuIjsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlRlc3QudG9rZW5zIiwgdG9rZW5zKTsKKworCQlTdHJpbmcgbWFzdGVyID0KKwkJCSJncmFtbWFyIE07XG4iICsKKwkJCSJvcHRpb25zIHt0b2tlblZvY2FiPVRlc3Q7fVxuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJzIDogeCA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKwkJQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisJCWNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKwkJZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisJCWcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltBPTk5LCBXUz0xMDFdIjsKKwkJU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7J2EnPTEwMH0iOworCQlTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW0EsICdhJywgV1NdIjsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnRva2VuSURUb1R5cGVNYXApLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0KS50b1N0cmluZygpKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTeW50YXhFcnJvcnNJbkltcG9ydHNOb3RUaHJvd25PdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlTdHJpbmcgc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsKKwkJCSJvcHRpb25zIHt0b2tlXG4iOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTO1xuIiArCisJCQkicyA6IHggO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJNLmciLCBtYXN0ZXIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisJCUNvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvTS5nIixjb21wb3NpdGUpOworCQljb21wb3NpdGUuc2V0RGVsZWdhdGlvblJvb3QoZyk7CisJCWcucGFyc2VBbmRCdWlsZEFTVCgpOworCQlnLmNvbXBvc2l0ZS5hc3NpZ25Ub2tlblR5cGVzKCk7CisKKwkJLy8gd2hvbGUgYnVuY2ggb2YgZXJyb3JzIGZyb20gYmFkIFMuZyBmaWxlCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCA1LCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5bnRheEVycm9yc0luSW1wb3J0c05vdFRocm93bk91dDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlTdHJpbmcgc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsKKwkJCSI6IEEge1N5c3RlbS5vdXQucHJpbnRsbihcIlMueFwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJzIDogeCA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKwkJQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisJCWNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKwkJZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisJCWcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworCQkvLyB3aG9sZSBidW5jaCBvZiBlcnJvcnMgZnJvbSBiYWQgUy5nIGZpbGUKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDMsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdG9yUnVsZU92ZXJyaWRlc0RlbGVnYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKworCQkJImEgOiBiIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLmFcIik7fSA7XG4iICsKKwkJCSJiIDogQiA7XG4iIDsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJiIDogJ2InfCdjJyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiUy5hXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlbGVnYXRvclJ1bGVPdmVycmlkZXNMb29rYWhlYWRJbkRlbGVnYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgSmF2YURlY2w7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgO1xuIiArCisJCQkiZGVjbCA6IHR5cGUgSUQgJzsnXG4iICsKKwkJCSIgICAgIHwgdHlwZSBJRCBpbml0ICc7JyB7U3lzdGVtLm91dC5wcmludGxuKFwiSmF2YURlY2w6IFwiKyRkZWNsLnRleHQpO31cbiIgKworCQkJIiAgICAgO1xuIiArCisJCQkiaW5pdCA6ICc9JyBJTlQgO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJKYXZhRGVjbC5nIiwgc2xhdmUpOworCQlTdHJpbmcgbWFzdGVyID0KKwkJCSJncmFtbWFyIEphdmE7XG4iICsKKwkJCSJpbXBvcnQgSmF2YURlY2w7XG4iICsKKwkJCSJwcm9nIDogZGVjbCA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDtcbiIgKworCQkJIlxuIiArCisJCQkiSUQgIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJLy8gZm9yIGZsb2F0IHRvIHdvcmsgaW4gZGVjbCwgdHlwZSBtdXN0IGJlIG92ZXJyaWRkZW4KKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiSmF2YS5nIiwgbWFzdGVyLCAiSmF2YVBhcnNlciIsICJKYXZhTGV4ZXIiLAorCQkJCQkJCQkgICJwcm9nIiwgImZsb2F0IHggPSAzOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJKYXZhRGVjbDogZmxvYXR4PTM7XG4iLCBmb3VuZCk7CisJfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdERlbGVnYXRvclJ1bGVPdmVycmlkZXNEZWxlZ2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNsYXZlID0KKyAgICAgICAgICAgICJwYXJzZXIgZ3JhbW1hciBTO1xuIiArCisgICAgICAgICAgICAiYSA6IGIge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuYVwiKTt9IDtcbiIgKworICAgICAgICAgICAgImIgOiBCIDtcbiIgOworICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCisgICAgICAgIFN0cmluZyBzbGF2ZTIgPQorICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIFQ7XG4iICsKKyAgICAgICAgICAgICJ0b2tlbnMgeyBBPSd4JzsgfVxuIiArCisgICAgICAgICAgICAiYiA6IEIge1N5c3RlbS5vdXQucHJpbnRsbihcIlQuYlwiKTt9IDtcbiI7CisgICAgICAgIHdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZTIpOworCisgICAgICAgIFN0cmluZyBtYXN0ZXIgPQorICAgICAgICAgICAgImdyYW1tYXIgTTtcbiIgKworICAgICAgICAgICAgImltcG9ydCBTLCBUO1xuIiArCisgICAgICAgICAgICAiYiA6ICdiJ3wnYycge1N5c3RlbS5vdXQucHJpbnRsbihcIk0uYlwiKTt9fEJ8QSA7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwgImMiLCBkZWJ1Zyk7CisgICAgICAgIGFzc2VydEVxdWFscygiTS5iXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICJTLmFcbiIsIGZvdW5kKTsKKyAgICB9CisKKwkvLyBMRVhFUiBJTkhFUklUQU5DRQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyRGVsZWdhdG9ySW52b2tlc0RlbGVnYXRlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgc2xhdmUgPQorCQkJImxleGVyIGdyYW1tYXIgUztcbiIgKworCQkJIkEgOiAnYScge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuQVwiKTt9IDtcbiIgKworCQkJIkMgOiAnYycgO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkibGV4ZXIgZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJCIDogJ2InIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjTGV4ZXIoIk0uZyIsIG1hc3RlciwgIk0iLCAiYWJjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIlMuQVxuYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyRGVsZWdhdG9yUnVsZU92ZXJyaWRlc0RlbGVnYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkibGV4ZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiQSA6ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwiUy5BXCIpO30gO1xuIiArCisJCQkiQiA6ICdiJyB7U3lzdGVtLm91dC5wcmludGxuKFwiUy5CXCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkibGV4ZXIgZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJBIDogJ2EnIEIge1N5c3RlbS5vdXQucHJpbnRsbihcIk0uQVwiKTt9IDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjTGV4ZXIoIk0uZyIsIG1hc3RlciwgIk0iLCAiYWIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiUy5CXG4iICsKKwkJCQkJICJNLkFcbiIgKworCQkJCQkgImFiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyRGVsZWdhdG9yUnVsZU92ZXJyaWRlc0RlbGVnYXRlTGVhdmluZ05vUnVsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTS5Ub2tlbnMgaGFzIG5vdGhpbmcgdG8gcHJlZGljdCB0b2tlbnMgZnJvbSBTLiAgU2hvdWxkCisJCS8vIG5vdCBpbmNsdWRlIFMuVG9rZW5zIGFsdCBpbiB0aGlzIGNhc2U/CisJCVN0cmluZyBzbGF2ZSA9CisJCQkibGV4ZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiQSA6ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwiUy5BXCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkibGV4ZXIgZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJBIDogJ2EnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJNLkFcIik7fSA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIi9NLmciLCBtYXN0ZXIpOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKwkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKwkJY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKwkJY29tcG9zaXRlLmRlZmluZUdyYW1tYXJTeW1ib2xzKCk7CisJCWNvbXBvc2l0ZS5jcmVhdGVORkFzKCk7CisJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisKKwkJLy8gcHJlZGljdCBvbmx5IGFsdHMgZnJvbSBNIG5vdCBTCisJCVN0cmluZyBleHBlY3RpbmdERkEgPQorCQkJIi5zMC0nYSctPi5zMVxuIiArCisJCQkiLnMwLXsnXFxuJywgJyAnfS0+OnMzPT4yXG4iICsKKwkJCSIuczEtPEVPVD4tPjpzMj0+MVxuIjsKKwkJb3JnLmFudGxyLmFuYWx5c2lzLkRGQSBkZmEgPSBnLmdldExvb2thaGVhZERGQSgxKTsKKwkJRkFTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRkFTZXJpYWxpemVyKGcpOworCQlTdHJpbmcgcmVzdWx0ID0gc2VyaWFsaXplci5zZXJpYWxpemUoZGZhLnN0YXJ0U3RhdGUpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nREZBLCByZXN1bHQpOworCisJCS8vIG11c3Qgbm90IGJlIGEgInVucmVhY2hhYmxlIGFsdDogVG9rZW5zIiBlcnJvcgorCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkSW1wb3J0TWVjaGFuaXNtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE0uVG9rZW5zIGhhcyBub3RoaW5nIHRvIHByZWRpY3QgdG9rZW5zIGZyb20gUy4gIFNob3VsZAorCQkvLyBub3QgaW5jbHVkZSBTLlRva2VucyBhbHQgaW4gdGhpcyBjYXNlPworCQlTdHJpbmcgc2xhdmUgPQorCQkJImxleGVyIGdyYW1tYXIgUztcbiIgKworCQkJIkEgOiAnYScge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuQVwiKTt9IDtcbiI7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisJCVN0cmluZyBtYXN0ZXIgPQorCQkJInRyZWUgZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJhIDogQSA7IjsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIi9NLmciLCBtYXN0ZXIpOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKwkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMSwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLndhcm5pbmdzLnNpemUoKSk7CisKKwkJU3RyaW5nIGV4cGVjdGVkRXJyb3IgPQorCQkJImVycm9yKDE2MSk6ICIrdG1wZGlyLnRvU3RyaW5nKCkucmVwbGFjZUZpcnN0KCJcXC1bMC05XSsiLCIiKSsiL00uZzoyOjg6IHRyZWUgZ3JhbW1hciBNIGNhbm5vdCBpbXBvcnQgbGV4ZXIgZ3JhbW1hciBTIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXJyb3IsIGVxdWV1ZS5lcnJvcnMuZ2V0KDApLnRvU3RyaW5nKCkucmVwbGFjZUZpcnN0KCJcXC1bMC05XSsiLCIiKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5bnRhY3RpY1ByZWRpY2F0ZVJ1bGVzQXJlTm90SW5oZXJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGlmIHRoaXMgY29tcGlsZXMsIGl0IG1lYW5zIHRoYXQgc3lucHJlZDFfUyBpcyBkZWZpbmVkIGluIFMuamF2YQorCQkvLyBidXQgbm90IE1QYXJzZXIuamF2YS4gIE1QYXJzZXIgaGFzIGl0cyBvd24gc3lucHJlZDFfTSB3aGljaCBtdXN0CisJCS8vIGJlIHNlcGFyYXRlIHRvIGNvbXBpbGUuCisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKworCQkJImEgOiAnYScge1N5c3RlbS5vdXQucHJpbnRsbihcIlMuYTFcIik7fVxuIiArCisJCQkiICB8ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwiUy5hMlwiKTt9XG4iICsKKwkJCSIgIDtcbiIgKworCQkJImIgOiAneCcgfCAneScgezt9IDtcbiI7IC8vIHByZWRzIGdlbmVyYXRlZCBidXQgbm90IG5lZWQgaW4gREZBIGhlcmUKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkib3B0aW9ucyB7YmFja3RyYWNrPXRydWU7fVxuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJzdGFydCA6IGEgYiA7XG4iICsKKwkJCSJub25zZW5zZSA6ICdxJyB8ICdxJyB7O30gOyIgKyAvLyBmb3JjZXMgZGVmIG9mIHByZWRzIGhlcmUgaW4gTQorCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJNLmciLCBtYXN0ZXIsICJNUGFyc2VyIiwgIk1MZXhlciIsCisJCQkJCQkJCSAgInN0YXJ0IiwgImF4IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIlMuYTFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZFZTSURHaXZlc05vV2FybmluZygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkibGV4ZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiQSA6ICdhYmMnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLkFcIik7fSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCQlTdHJpbmcgbWFzdGVyID0KKwkJCSJncmFtbWFyIE07XG4iICsKKwkJCSJpbXBvcnQgUztcbiIgKworCQkJImEgOiBBIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJNLmFcIik7fSA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsICJNTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyIsIGRlYnVnKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgd2FybmluZ3M6ICIrZXF1ZXVlLCAwLCBlcXVldWUud2FybmluZ3Muc2l6ZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoIlMuQVxuTS5hXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFdhcm5pbmdGb3JVbmRlZmluZWRUb2tlbigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkibGV4ZXIgZ3JhbW1hciBTO1xuIiArCisJCQkiQSA6ICdhYmMnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJTLkFcIik7fSA7XG4iOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiUy5nIiwgc2xhdmUpOworCQlTdHJpbmcgbWFzdGVyID0KKwkJCSJncmFtbWFyIE07XG4iICsKKwkJCSJpbXBvcnQgUztcbiIgKworCQkJImEgOiBBQkMgQSB7U3lzdGVtLm91dC5wcmludGxuKFwiTS5hXCIpO30gO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIiA7CisJCS8vIEEgaXMgZGVmaW5lZCBpbiBTIGJ1dCBNIHNob3VsZCBzdGlsbCBzZWUgaXQgYW5kIG5vdCBnaXZlIHdhcm5pbmcuCisJCS8vIG9ubHkgcHJvYmxlbSBpcyBBQkMuCisKKwkJcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCAiTUxleGVyIiwgZGVidWcpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCB3YXJuaW5nczogIitlcXVldWUsIDEsIGVxdWV1ZS53YXJuaW5ncy5zaXplKCkpOworCisJCVN0cmluZyBleHBlY3RlZEVycm9yID0KKwkJCSJ3YXJuaW5nKDEwNSk6ICIrdG1wZGlyLnRvU3RyaW5nKCkucmVwbGFjZUZpcnN0KCJcXC1bMC05XSsiLCIiKStGaWxlLnNlcGFyYXRvcisiTS5nOjM6NTogbm8gbGV4ZXIgcnVsZSBjb3JyZXNwb25kaW5nIHRvIHRva2VuOiBBQkMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFcnJvciwgZXF1ZXVlLndhcm5pbmdzLmdldCgwKS50b1N0cmluZygpLnJlcGxhY2VGaXJzdCgiXFwtWzAtOV0rIiwiIikpOworCX0KKworCS8qKiBNYWtlIHN1cmUgdGhhdCBNIGNhbiBpbXBvcnQgUyB0aGF0IGltcG9ydHMgVC4gKi8KKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0M0xldmVsSW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIHNsYXZlID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IFQgO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJULmciLCBzbGF2ZSk7CisJCVN0cmluZyBzbGF2ZTIgPQorCQkJInBhcnNlciBncmFtbWFyIFM7XG4iICsgLy8gQSwgQiwgQyB0b2tlbiB0eXBlIG9yZGVyCisJCQkiaW1wb3J0IFQ7XG4iICsKKwkJCSJhIDogUyA7XG4iIDsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlMik7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJhIDogTSA7XG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIk0uZyIsIG1hc3Rlcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKG5ldyBTdHJpbmdbXSB7Ii1saWIiLCB0bXBkaXJ9KTsKKwkJQ29tcG9zaXRlR3JhbW1hciBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlR3JhbW1hcigpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRscix0bXBkaXIrIi9NLmciLGNvbXBvc2l0ZSk7CisJCWNvbXBvc2l0ZS5zZXREZWxlZ2F0aW9uUm9vdChnKTsKKwkJZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisJCWcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKwkJZy5jb21wb3NpdGUuZGVmaW5lR3JhbW1hclN5bWJvbHMoKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltNPTQsIFM9NSwgVD02XSI7CisJCVN0cmluZyBleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAgPSAie30iOworCQlTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW00sIFMsIFRdIjsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnRva2VuSURUb1R5cGVNYXApLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0KS50b1N0cmluZygpKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCisJCWJvb2xlYW4gb2sgPQorCQkJcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoIk0uZyIsIG1hc3RlciwgIk1QYXJzZXIiLCBudWxsLCBmYWxzZSk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIG9rKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QmlnVHJlZU9mSW1wb3J0cygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworCQkJInggOiBUIDtcbiIgOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiVC5nIiwgc2xhdmUpOworCQlzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKworCQkJImltcG9ydCBUO1xuIiArCisJCQkieSA6IFMgO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZSk7CisKKwkJc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIEM7XG4iICsKKwkJCSJpIDogQyA7XG4iIDsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIkMuZyIsIHNsYXZlKTsKKwkJc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIEI7XG4iICsKKwkJCSJqIDogQiA7XG4iIDsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIkIuZyIsIHNsYXZlKTsKKwkJc2xhdmUgPQorCQkJInBhcnNlciBncmFtbWFyIEE7XG4iICsKKwkJCSJpbXBvcnQgQixDO1xuIiArCisJCQkiayA6IEEgO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJBLmciLCBzbGF2ZSk7CisKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFMsQTtcbiIgKworCQkJImEgOiBNIDtcbiIgOworCQl3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKwkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKwkJZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCQlnLmNvbXBvc2l0ZS5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworCisJCVN0cmluZyBleHBlY3RlZFRva2VuSURUb1R5cGVNYXAgPSAiW0E9NCwgQj01LCBDPTYsIE09NywgUz04LCBUPTldIjsKKwkJU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7fSI7CisJCVN0cmluZyBleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCA9ICJbQSwgQiwgQywgTSwgUywgVF0iOworCisJCWFzc2VydEVxdWFscyhleHBlY3RlZFRva2VuSURUb1R5cGVNYXAsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcCkudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXAudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCwKKwkJCQkJIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QpLnRvU3RyaW5nKCkpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisKKwkJYm9vbGVhbiBvayA9CisJCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcigiTS5nIiwgbWFzdGVyLCAiTVBhcnNlciIsIG51bGwsIGZhbHNlKTsKKwkJYm9vbGVhbiBleHBlY3RpbmcgPSB0cnVlOyAvLyBzaG91bGQgYmUgb2sKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgb2spOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlc1Zpc2libGVUaHJvdWdoTXVsdGlsZXZlbEltcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworCQkJInggOiBUIDtcbiIgOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiVC5nIiwgc2xhdmUpOworCQlTdHJpbmcgc2xhdmUyID0KKwkJCSJwYXJzZXIgZ3JhbW1hciBTO1xuIiArIC8vIEEsIEIsIEMgdG9rZW4gdHlwZSBvcmRlcgorCQkJImltcG9ydCBUO1xuIiArCisJCQkiYSA6IFMgO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJTLmciLCBzbGF2ZTIpOworCisJCVN0cmluZyBtYXN0ZXIgPQorCQkJImdyYW1tYXIgTTtcbiIgKworCQkJImltcG9ydCBTO1xuIiArCisJCQkiYSA6IE0geCA7XG4iIDsgLy8geCBNVVNUIEJFIFZJU0lCTEUgVE8gTQorCQl3cml0ZUZpbGUodG1wZGlyLCAiTS5nIiwgbWFzdGVyKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL00uZyIsY29tcG9zaXRlKTsKKwkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKwkJZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCQlnLmNvbXBvc2l0ZS5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworCisJCVN0cmluZyBleHBlY3RlZFRva2VuSURUb1R5cGVNYXAgPSAiW009NCwgUz01LCBUPTZdIjsKKwkJU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7fSI7CisJCVN0cmluZyBleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCA9ICJbTSwgUywgVF0iOworCisJCWFzc2VydEVxdWFscyhleHBlY3RlZFRva2VuSURUb1R5cGVNYXAsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudG9rZW5JRFRvVHlwZU1hcCkudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZ0xpdGVyYWxUb1R5cGVNYXAsIGcuY29tcG9zaXRlLnN0cmluZ0xpdGVyYWxUb1R5cGVNYXAudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCwKKwkJCQkJIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50eXBlVG9Ub2tlbkxpc3QpLnRvU3RyaW5nKCkpOworCisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbXBvc2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBXYXNuJ3QgY29tcGlsaW5nLiBodHRwOi8vd3d3LmFudGxyLm9yZy9qaXJhL2Jyb3dzZS9BTlRMUi00MzgKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlTdHJpbmcgZ3N0ciA9CisJCQkibGV4ZXIgZ3JhbW1hciBMO1xuIiArCisJCQkiVDE6ICcxJztcbiIgKworCQkJIlQyOiAnMic7XG4iICsKKwkJCSJUMzogJzMnO1xuIiArCisJCQkiVDQ6ICc0JztcbiIgOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiTC5nIiwgZ3N0cik7CisJCWdzdHIgPQorCQkJInBhcnNlciBncmFtbWFyIEcxO1xuIiArCisJCQkiczogYSB8IGI7XG4iICsKKwkJCSJhOiBUMTtcbiIgKworCQkJImI6IFQyO1xuIiA7CisJCW1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJHMS5nIiwgZ3N0cik7CisKKwkJZ3N0ciA9CisJCQkicGFyc2VyIGdyYW1tYXIgRzI7XG4iICsKKwkJCSJpbXBvcnQgRzE7XG4iICsKKwkJCSJhOiBUMztcbiIgOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiRzIuZyIsIGdzdHIpOworCQlTdHJpbmcgRzNzdHIgPQorCQkJImdyYW1tYXIgRzM7XG4iICsKKwkJCSJpbXBvcnQgRzI7XG4iICsKKwkJCSJiOiBUNDtcbiIgOworCQlta2Rpcih0bXBkaXIpOworCQl3cml0ZUZpbGUodG1wZGlyLCAiRzMuZyIsIEczc3RyKTsKKworCQlUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisJCUNvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvRzMuZyIsY29tcG9zaXRlKTsKKwkJY29tcG9zaXRlLnNldERlbGVnYXRpb25Sb290KGcpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKwkJZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCQlnLmNvbXBvc2l0ZS5kZWZpbmVHcmFtbWFyU3ltYm9scygpOworCisJCVN0cmluZyBleHBlY3RlZFRva2VuSURUb1R5cGVNYXAgPSAiW1QxPTQsIFQyPTUsIFQzPTYsIFQ0PTddIjsKKwkJU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7fSI7CisJCVN0cmluZyBleHBlY3RlZFR5cGVUb1Rva2VuTGlzdCA9ICJbVDEsIFQyLCBUMywgVDRdIjsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnRva2VuSURUb1R5cGVNYXApLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0KS50b1N0cmluZygpKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCisJCWJvb2xlYW4gb2sgPQorCQkJcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoIkczLmciLCBHM3N0ciwgIkczUGFyc2VyIiwgbnVsbCwgZmFsc2UpOworCQlib29sZWFuIGV4cGVjdGluZyA9IHRydWU7IC8vIHNob3VsZCBiZSBvaworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBvayk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEhlYWRlcnNQcm9wb2dhdGVkQ29ycmVjdGx5VG9JbXBvcnRlZEdyYW1tYXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBzbGF2ZSA9CisJCQkicGFyc2VyIGdyYW1tYXIgUztcbiIgKworCQkJImEgOiBCIHtTeXN0ZW0ub3V0LnByaW50KFwiUy5hXCIpO30gO1xuIjsKKwkJbWtkaXIodG1wZGlyKTsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIlMuZyIsIHNsYXZlKTsKKwkJU3RyaW5nIG1hc3RlciA9CisJCQkiZ3JhbW1hciBNO1xuIiArCisJCQkiaW1wb3J0IFM7XG4iICsKKwkJCSJAaGVhZGVye3BhY2thZ2UgbXlwYWNrYWdlO31cbiIgKworCQkJIkBsZXhlcjo6aGVhZGVye3BhY2thZ2UgbXlwYWNrYWdlO31cbiIgKworCQkJInMgOiBhIDtcbiIgKworCQkJIkIgOiAnYicgOyIgKyAvLyBkZWZpbmVzIEIgZnJvbSBpbmhlcml0ZWQgdG9rZW4gc3BhY2UKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iIDsKKwkJYm9vbGVhbiBvayA9IGFudGxyKCJNLmciLCAiTS5nIiwgbWFzdGVyLCBkZWJ1Zyk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIG9rKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RERkFDb252ZXJzaW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RERkFDb252ZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3YjMyOAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdERGQUNvbnZlcnNpb24uamF2YQpAQCAtMCwwICsxLDE3ODcgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkE7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkRlY2lzaW9uUHJvYmU7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIubWlzYy5CaXRTZXQ7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitwdWJsaWMgY2xhc3MgVGVzdERGQUNvbnZlcnNpb24gZXh0ZW5kcyBCYXNlVGVzdCB7CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogQSBDIHwgQjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMT0+MVxuIiArCisJCQkiLnMwLUItPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBQl9vcl9BQygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogQSBCIHwgQSBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEtQi0+OnMyPT4xXG4iICsKKwkJCSIuczEtQy0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFCX29yX0FDX2syKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtrPTI7fVxuIisKKwkJCSJhIDogQSBCIHwgQSBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEtQi0+OnMyPT4xXG4iICsKKwkJCSIuczEtQy0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFCX29yX0FDX2sxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtrPTE7fVxuIisKKwkJCSJhIDogQSBCIHwgQSBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBuZXcgaW50W10gezJ9OworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDJ9OworCQlTdHJpbmcgYW1iaWdJbnB1dCA9ICJBIiA7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG5ldyBpbnRbXSB7Mn07CisJCWludCBudW1XYXJuaW5ncyA9IDI7IC8vIGFtYmlnIHVwb24gQQorCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RzZWxmUmVjdXJzZU5vbkRldCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogQSBhIFggfCBBIGEgWTsiKTsKKwkJTGlzdCBhbHRzV2l0aFJlY3Vyc2lvbiA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsxLDJ9KTsKKwkJYXNzZXJ0Tm9uTExTdGFyKGcsIGFsdHNXaXRoUmVjdXJzaW9uKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaW9uT3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkicyA6IGEgWSB8IEEgQSBBIEEgQSBYIDtcbiIgKyAvLyBmb3JjZSByZWN1cnNpb24gcGFzdCBtPTQKKwkJCSJhIDogQSBhIHwgUTsiKTsKKwkJTGlzdCBleHBlY3RlZFRhcmdldFJ1bGVzID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyJhIn0pOworCQlpbnQgZXhwZWN0ZWRBbHQgPSAxOworCQlhc3NlcnRSZWN1cnNpb25PdmVyZmxvdyhnLCBleHBlY3RlZFRhcmdldFJ1bGVzLCBleHBlY3RlZEFsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2lvbk92ZXJmbG93MigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYSBZIHwgQSsgWCA7XG4iICsgLy8gZm9yY2UgcmVjdXJzaW9uIHBhc3QgbT00CisJCQkiYSA6IEEgYSB8IFE7Iik7CisJCUxpc3QgZXhwZWN0ZWRUYXJnZXRSdWxlcyA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsiYSJ9KTsKKwkJaW50IGV4cGVjdGVkQWx0ID0gMTsKKwkJYXNzZXJ0UmVjdXJzaW9uT3ZlcmZsb3coZywgZXhwZWN0ZWRUYXJnZXRSdWxlcywgZXhwZWN0ZWRBbHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpb25PdmVyZmxvd1dpdGhQcmVkT2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gb3ZlcmZsb3dzIHdpdGggaz0qLCBidXQgcmVzb2x2ZXMgd2l0aCBwcmVkCisJCS8vIG5vIHdhcm5pbmdzL2Vycm9ycworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogKGEgWSk9PiBhIFkgfCBBIEEgQSBBIEEgWCA7XG4iICsgLy8gZm9yY2UgcmVjdXJzaW9uIHBhc3QgbT00CisJCQkiYSA6IEEgYSB8IFE7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworCQkJIi5zMC1RJiZ7c3lucHJlZDFfdH0/LT46czExPT4xXG4iICsKKwkJCSIuczEtQS0+LnMyXG4iICsKKwkJCSIuczEtUSYme3N5bnByZWQxX3R9Py0+OnMxMD0+MVxuIiArCisJCQkiLnMyLUEtPi5zM1xuIiArCisJCQkiLnMyLVEmJntzeW5wcmVkMV90fT8tPjpzOT0+MVxuIiArCisJCQkiLnMzLUEtPi5zNFxuIiArCisJCQkiLnMzLVEmJntzeW5wcmVkMV90fT8tPjpzOD0+MVxuIiArCisJCQkiLnM0LUEtPi5zNVxuIiArCisJCQkiLnM0LVEmJntzeW5wcmVkMV90fT8tPjpzNj0+MVxuIiArCisJCQkiLnM1LXtzeW5wcmVkMV90fT8tPjpzNj0+MVxuIiArCisJCQkiLnM1LXt0cnVlfT8tPjpzNz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaW9uT3ZlcmZsb3dXaXRoUHJlZE9rMigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBtdXN0IHByZWRpY3QgWiB3L28gcHJlZGljYXRlCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiAoYSBZKT0+IGEgWSB8IEEgQSBBIEEgQSBYIHwgWjtcbiIgKyAvLyBmb3JjZSByZWN1cnNpb24gcGFzdCBtPTQKKwkJCSJhIDogQSBhIHwgUTsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMwLVEmJntzeW5wcmVkMV90fT8tPjpzMTE9PjFcbiIgKworCQkJIi5zMC1aLT46czEyPT4zXG4iICsKKwkJCSIuczEtQS0+LnMyXG4iICsKKwkJCSIuczEtUSYme3N5bnByZWQxX3R9Py0+OnMxMD0+MVxuIiArCisJCQkiLnMyLUEtPi5zM1xuIiArCisJCQkiLnMyLVEmJntzeW5wcmVkMV90fT8tPjpzOT0+MVxuIiArCisJCQkiLnMzLUEtPi5zNFxuIiArCisJCQkiLnMzLVEmJntzeW5wcmVkMV90fT8tPjpzOD0+MVxuIiArCisJCQkiLnM0LUEtPi5zNVxuIiArCisJCQkiLnM0LVEmJntzeW5wcmVkMV90fT8tPjpzNj0+MVxuIiArCisJCQkiLnM1LXtzeW5wcmVkMV90fT8tPjpzNj0+MVxuIiArCisJCQkiLnM1LXt0cnVlfT8tPjpzNz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U2VlUGFzdFJlY3Vyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJ4ICAgOiB5IFhcbiIgKworCQkJIiAgICB8IHkgWVxuIiArCisJCQkiICAgIDtcbiIgKworCQkJInkgICA6IEwgeSBSXG4iICsKKwkJCSIgICAgfCBCXG4iICsKKwkJCSIgICAgOyIpOworCQlMaXN0IGFsdHNXaXRoUmVjdXJzaW9uID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10gezEsMn0pOworCQlhc3NlcnROb25MTFN0YXIoZywgYWx0c1dpdGhSZWN1cnNpb24pOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTeW5QcmVkUmVzb2x2ZXNSZWN1cnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkieCAgIDogKHkgWCk9PiB5IFhcbiIgKworCQkJIiAgICB8IHkgWVxuIiArCisJCQkiICAgIDtcbiIgKworCQkJInkgICA6IEwgeSBSXG4iICsKKwkJCSIgICAgfCBCXG4iICsKKwkJCSIgICAgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQi0+LnM0XG4iICsKKwkJCSIuczAtTC0+LnMxXG4iICsKKwkJCSIuczEte3N5bnByZWQxX3R9Py0+OnMyPT4xXG4iICsKKwkJCSIuczEte3RydWV9Py0+OnMzPT4yXG4iICsKKwkJCSIuczQte3N5bnByZWQxX3R9Py0+OnMyPT4xXG4iICsKKwkJCSIuczQte3RydWV9Py0+OnMzPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAwOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTeW5QcmVkTWlzc2luZ0luTWlkZGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInggICA6IChBKT0+IFhcbiIgKworCQkJIiAgICB8IFhcbiIgKyAgLy8gYXNzdW1lIG1pc3Npbmcgc3lucHJlZCBpcyB0cnVlIGFsc28KKwkJCSIJIHwgKEMpPT4gWCIgKworCQkJIiAgICA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLVgtPi5zMVxuIiArCisJCQkiLnMxLXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtzeW5wcmVkMl90fT8tPjpzND0+M1xuIiArCisJCQkiLnMxLXt0cnVlfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0JhY2t0cmFja0FuZFByZWRNaXNzaW5nSW5NaWRkbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkieCAgIDogKEEpPT4gWFxuIiArCisJCQkiICAgIHwgWFxuIiArICAvLyBhc3N1bWUgbWlzc2luZyBzeW5wcmVkIGlzIHRydWUgYWxzbworCQkJIgkgfCAoQyk9PiBYIiArCisJCQkiICAgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtWC0+LnMxXG4iICsKKwkJCSIuczEte3N5bnByZWQxX3R9Py0+OnMyPT4xXG4iICsgIC8vIGdlbiBjb2RlIHNob3VsZCBoYXZlIHRoaXMgYXMgKEEpPT4KKwkJCSIuczEte3N5bnByZWQyX3R9Py0+OnMzPT4yXG4iICsgLy8gZ2VuIGNvZGUgc2hvdWxkIGhhdmUgdGhpcyBhcyAoWCk9PgorCQkJIi5zMS17c3lucHJlZDNfdH0/LT46czQ9PjNcbiI7IC8vIGdlbiBjb2RlIHNob3VsZCBoYXZlIHRoaXMgYXMgKEMpPT4KKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2VtUHJlZFJlc29sdmVzUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInggICA6IHtwfT8geSBYXG4iICsKKwkJCSIgICAgfCB5IFlcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJ5ICAgOiBMIHkgUlxuIiArCisJCQkiICAgIHwgQlxuIiArCisJCQkiICAgIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUItPi5zNFxuIiArCisJCQkiLnMwLUwtPi5zMVxuIiArCisJCQkiLnMxLXtwfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXt0cnVlfT8tPjpzMz0+MlxuIiArCisJCQkiLnM0LXtwfT8tPjpzMj0+MVxuIiArCisJCQkiLnM0LXt0cnVlfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2VtUHJlZFJlc29sdmVzUmVjdXJzaW9uMigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJ4XG4iICsKKwkJCSJvcHRpb25zIHtrPTE7fVxuIiArCisJCQkiICAgOiB7cH0/IHkgWFxuIiArCisJCQkiICAgIHwgeSBZXG4iICsKKwkJCSIgICAgO1xuIiArCisJCQkieSAgIDogTCB5IFJcbiIgKworCQkJIiAgICB8IEJcbiIgKworCQkJIiAgICA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1CLT4uczRcbiIgKworCQkJIi5zMC1MLT4uczFcbiIgKworCQkJIi5zMS17cH0/LT46czI9PjFcbiIgKworCQkJIi5zMS17dHJ1ZX0/LT46czM9PjJcbiIgKworCQkJIi5zNC17cH0/LT46czI9PjFcbiIgKworCQkJIi5zNC17dHJ1ZX0/LT46czM9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBudWxsOworCQlTdHJpbmcgYW1iaWdJbnB1dCA9IG51bGw7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDA7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNlbVByZWRSZXNvbHZlc1JlY3Vyc2lvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkieFxuIiArCisJCQkib3B0aW9ucyB7az0yO31cbiIgKyAvLyBqdXN0IG1ha2VzIGJpZ2dlciBERkEKKwkJCSIgICA6IHtwfT8geSBYXG4iICsKKwkJCSIgICAgfCB5IFlcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJ5ICAgOiBMIHkgUlxuIiArCisJCQkiICAgIHwgQlxuIiArCisJCQkiICAgIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUItPi5zNlxuIiArCisJCQkiLnMwLUwtPi5zMVxuIiArCisJCQkiLnMxLUItPi5zNVxuIiArCisJCQkiLnMxLUwtPi5zMlxuIiArCisJCQkiLnMyLXtwfT8tPjpzMz0+MVxuIiArCisJCQkiLnMyLXt0cnVlfT8tPjpzND0+MlxuIiArCisJCQkiLnM1LXtwfT8tPjpzMz0+MVxuIiArCisJCQkiLnM1LXt0cnVlfT8tPjpzND0+MlxuIiArCisJCQkiLnM2LVgtPjpzMz0+MVxuIiArCisJCQkiLnM2LVktPjpzND0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3luUHJlZFJlc29sdmVzUmVjdXJzaW9uMigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBrPSogZmFpbHMgYW5kIGl0IHJldHJpZXMvc3VjY2VlZHMgd2l0aCBrPTEgc2lsZW50bHkKKwkJLy8gYmVjYXVzZSBvZiBwcmVkaWNhdGUKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkic3RhdGVtZW50XG4iICsKKwkJCSIgICAgOiAgICAgKHJlZmVyZW5jZSBBU1NJR04pPT4gcmVmZXJlbmNlIEFTU0lHTiBleHByXG4iICsKKwkJCSIgICAgfCAgICAgZXhwclxuIiArCisJCQkiICAgIDtcbiIgKworCQkJImV4cHI6ICAgICByZWZlcmVuY2VcbiIgKworCQkJIiAgICB8ICAgICBJTlRcbiIgKworCQkJIiAgICB8ICAgICBGTE9BVFxuIiArCisJCQkiICAgIDtcbiIgKworCQkJInJlZmVyZW5jZVxuIiArCisJCQkiICAgIDogICAgIElEIEwgYXJndW1lbnRfbGlzdCBSXG4iICsKKwkJCSIgICAgO1xuIiArCisJCQkiYXJndW1lbnRfbGlzdFxuIiArCisJCQkiICAgIDogICAgIGV4cHIgQ09NTUEgZXhwclxuIiArCisJCQkiICAgIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUlELT4uczFcbiIgKworCQkJIi5zMC17RkxPQVQsIElOVH0tPjpzMz0+MlxuIiArCisJCQkiLnMxLXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXt0cnVlfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3luUHJlZFJlc29sdmVzUmVjdXJzaW9uMygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBObyBlcnJvcnMgd2l0aCBrPTE7IGRvbid0IHRyeSBrPSogZmlyc3QKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkic3RhdGVtZW50XG4iICsKKwkJCSJvcHRpb25zIHtrPTE7fVxuIiArCisJCQkiICAgIDogICAgIChyZWZlcmVuY2UgQVNTSUdOKT0+IHJlZmVyZW5jZSBBU1NJR04gZXhwclxuIiArCisJCQkiICAgIHwgICAgIGV4cHJcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJleHByOiAgICAgcmVmZXJlbmNlXG4iICsKKwkJCSIgICAgfCAgICAgSU5UXG4iICsKKwkJCSIgICAgfCAgICAgRkxPQVRcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJyZWZlcmVuY2VcbiIgKworCQkJIiAgICA6ICAgICBJRCBMIGFyZ3VtZW50X2xpc3QgUlxuIiArCisJCQkiICAgIDtcbiIgKworCQkJImFyZ3VtZW50X2xpc3RcbiIgKworCQkJIiAgICA6ICAgICBleHByIENPTU1BIGV4cHJcbiIgKworCQkJIiAgICA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1JRC0+LnMxXG4iICsKKwkJCSIuczAte0ZMT0FULCBJTlR9LT46czM9PjJcbiIgKworCQkJIi5zMS17c3lucHJlZDFfdH0/LT46czI9PjFcbiIgKworCQkJIi5zMS17dHJ1ZX0/LT46czM9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBudWxsOworCQlTdHJpbmcgYW1iaWdJbnB1dCA9IG51bGw7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDA7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5blByZWRSZXNvbHZlc1JlY3Vyc2lvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gTm8gZXJyb3JzIHdpdGggaz0yOyBkb24ndCB0cnkgaz0qIGZpcnN0CisJCS8vIFNob3VsZCBiZSBvayBsaWtlIGs9MSAnZXhjZXB0IGJpZ2dlciBERkEKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkic3RhdGVtZW50XG4iICsKKwkJCSJvcHRpb25zIHtrPTI7fVxuIiArCisJCQkiICAgIDogICAgIChyZWZlcmVuY2UgQVNTSUdOKT0+IHJlZmVyZW5jZSBBU1NJR04gZXhwclxuIiArCisJCQkiICAgIHwgICAgIGV4cHJcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJleHByOiAgICAgcmVmZXJlbmNlXG4iICsKKwkJCSIgICAgfCAgICAgSU5UXG4iICsKKwkJCSIgICAgfCAgICAgRkxPQVRcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJyZWZlcmVuY2VcbiIgKworCQkJIiAgICA6ICAgICBJRCBMIGFyZ3VtZW50X2xpc3QgUlxuIiArCisJCQkiICAgIDtcbiIgKworCQkJImFyZ3VtZW50X2xpc3RcbiIgKworCQkJIiAgICA6ICAgICBleHByIENPTU1BIGV4cHJcbiIgKworCQkJIiAgICA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1JRC0+LnMxXG4iICsKKwkJCSIuczAte0ZMT0FULCBJTlR9LT46czQ9PjJcbiIgKworCQkJIi5zMS1MLT4uczJcbiIgKworCQkJIi5zMi17c3lucHJlZDFfdH0/LT46czM9PjFcbiIgKworCQkJIi5zMi17dHJ1ZX0/LT46czQ9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBudWxsOworCQlTdHJpbmcgYW1iaWdJbnB1dCA9IG51bGw7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDA7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5blByZWRSZXNvbHZlc1JlY3Vyc2lvbkluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogICAgIChCICc7Jyk9PiBCICc7J1xuIiArCisJCQkiICB8ICAgICBCICcuJ1xuIiArCisJCQkiICA7XG4iICsKKwkJCSJmcmFnbWVudFxuIiArCisJCQkiQiA6ICAgICAnKCcgQiAnKSdcbiIgKworCQkJIiAgfCAgICAgJ3gnXG4iICsKKwkJCSIgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJygnLT4uczFcbiIgKworCQkJIi5zMC0neCctPi5zNFxuIiArCisJCQkiLnMxLXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXt0cnVlfT8tPjpzMz0+MlxuIiArCisJCQkiLnM0LXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArCisJCQkiLnM0LXt0cnVlfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0JhY2t0cmFja1Jlc29sdmVzUmVjdXJzaW9uSW5MZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkiQSA6ICAgICBCICc7J1xuIiArCisJCQkiICB8ICAgICBCICcuJ1xuIiArCisJCQkiICA7XG4iICsKKwkJCSJmcmFnbWVudFxuIiArCisJCQkiQiA6ICAgICAnKCcgQiAnKSdcbiIgKworCQkJIiAgfCAgICAgJ3gnXG4iICsKKwkJCSIgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJygnLT4uczFcbiIgKworCQkJIi5zMC0neCctPi5zNFxuIiArCisJCQkiLnMxLXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXt0cnVlfT8tPjpzMz0+MlxuIiArCisJCQkiLnM0LXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArCisJCQkiLnM0LXt0cnVlfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0JhY2t0cmFja1Jlc29sdmVzUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJInggICA6IHkgWFxuIiArCisJCQkiICAgIHwgeSBZXG4iICsKKwkJCSIgICAgO1xuIiArCisJCQkieSAgIDogTCB5IFJcbiIgKworCQkJIiAgICB8IEJcbiIgKworCQkJIiAgICA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1CLT4uczRcbiIgKworCQkJIi5zMC1MLT4uczFcbiIgKworCQkJIi5zMS17c3lucHJlZDFfdH0/LT46czI9PjFcbiIgKworCQkJIi5zMS17dHJ1ZX0/LT46czM9PjJcbiIgKworCQkJIi5zNC17c3lucHJlZDFfdH0/LT46czI9PjFcbiIgKworCQkJIi5zNC17dHJ1ZX0/LT46czM9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBudWxsOworCQlTdHJpbmcgYW1iaWdJbnB1dCA9IG51bGw7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDA7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdHNlbGZSZWN1cnNlTm9uRGV0MigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogUCBhIFAgfCBQOyIpOworCQkvLyBub25kZXRlcm1pbmlzdGljIGZyb20gbGVmdCBlZGdlCisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1QLT4uczFcbiIgKworCQkJIi5zMS1FT0YtPjpzMz0+MlxuIisKKwkJCSIuczEtUC0+OnMyPT4xXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDJ9OworCQlTdHJpbmcgYW1iaWdJbnB1dCA9ICJQIFAiOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAxOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlY3Vyc2lvbkxvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkicyA6IGEgO1xuIiArCisJCQkiYSA6IGIgWCA7XG4iKworCQkJImIgOiBhIEIgO1xuIik7CisKKwkJRGVjaXNpb25Qcm9iZS52ZXJib3NlPXRydWU7IC8vIG1ha2Ugc3VyZSB3ZSBnZXQgYWxsIGVycm9yIGluZm8KKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisJCVNldDxSdWxlPiBsZWZ0UmVjdXJzaXZlID0gZy5nZXRMZWZ0UmVjdXJzaXZlUnVsZXMoKTsKKwkJU2V0IGV4cGVjdGVkUnVsZXMgPQorCQkJbmV3IEhhc2hTZXQoKSB7e2FkZCgiYSIpOyBhZGQoImIiKTt9fTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUnVsZXMsIHJ1bGVOYW1lcyhsZWZ0UmVjdXJzaXZlKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwkJTWVzc2FnZSBtc2cgPSAoTWVzc2FnZSllcXVldWUuZXJyb3JzLmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZSgiZXhwZWN0aW5nIGxlZnQgcmVjdXJzaW9uIGN5Y2xlczsgZm91bmQgIittc2cuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisJCQkJICAgIG1zZyBpbnN0YW5jZW9mIExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlKTsKKwkJTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UgY3ljbGVzTXNnID0gKExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlKW1zZzsKKworCQkvLyBjeWNsZSBvZiBbYSwgYl0KKwkJQ29sbGVjdGlvbiByZXN1bHQgPSBjeWNsZXNNc2cuY3ljbGVzOworCQlTZXQgZXhwZWN0aW5nID0gbmV3IEhhc2hTZXQoKSB7e2FkZCgiYSIpOyBhZGQoImIiKTt9fTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcnVsZU5hbWVzMihyZXN1bHQpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZWN1cnNpb25Mb29wMigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogaSBiIFggO1xuIisgLy8gc2hvdWxkIHNlZSB0aHJvdWdoIGkKKwkJCSJiIDogYSBCIDtcbiIgKworCQkJImkgOiA7XG4iKTsKKworCQlEZWNpc2lvblByb2JlLnZlcmJvc2U9dHJ1ZTsgLy8gbWFrZSBzdXJlIHdlIGdldCBhbGwgZXJyb3IgaW5mbworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisKKwkJU2V0IGxlZnRSZWN1cnNpdmUgPSBnLmdldExlZnRSZWN1cnNpdmVSdWxlcygpOworCQlTZXQgZXhwZWN0ZWRSdWxlcyA9CisJCQluZXcgSGFzaFNldCgpIHt7YWRkKCJhIik7IGFkZCgiYiIpO319OworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSdWxlcywgcnVsZU5hbWVzKGxlZnRSZWN1cnNpdmUpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KDApOworCQlhc3NlcnRUcnVlKCJleHBlY3RpbmcgbGVmdCByZWN1cnNpb24gY3ljbGVzOyBmb3VuZCAiK21zZy5nZXRDbGFzcygpLmdldE5hbWUoKSwKKwkJCQkgICAgbXNnIGluc3RhbmNlb2YgTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UpOworCQlMZWZ0UmVjdXJzaW9uQ3ljbGVzTWVzc2FnZSBjeWNsZXNNc2cgPSAoTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UpbXNnOworCisJCS8vIGN5Y2xlIG9mIFthLCBiXQorCQlDb2xsZWN0aW9uIHJlc3VsdCA9IGN5Y2xlc01zZy5jeWNsZXM7CisJCVNldCBleHBlY3RpbmcgPSBuZXcgSGFzaFNldCgpIHt7YWRkKCJhIik7IGFkZCgiYiIpO319OworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBydWxlTmFtZXMyKHJlc3VsdCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlY3Vyc2lvbkxvb3AzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiBhIDtcbiIgKworCQkJImEgOiBpIGIgWCA7XG4iKyAvLyBzaG91bGQgc2VlIHRocm91Z2ggaQorCQkJImIgOiBhIEIgO1xuIiArCisJCQkiaSA6IDtcbiIgKworCQkJImQgOiBlIDtcbiIgKworCQkJImUgOiBkIDtcbiIpOworCisJCURlY2lzaW9uUHJvYmUudmVyYm9zZT10cnVlOyAvLyBtYWtlIHN1cmUgd2UgZ2V0IGFsbCBlcnJvciBpbmZvCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQlTZXQgbGVmdFJlY3Vyc2l2ZSA9IGcuZ2V0TGVmdFJlY3Vyc2l2ZVJ1bGVzKCk7CisJCVNldCBleHBlY3RlZFJ1bGVzID0KKwkJCW5ldyBIYXNoU2V0KCkge3thZGQoImEiKTsgYWRkKCJiIik7IGFkZCgiZSIpOyBhZGQoImQiKTt9fTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUnVsZXMsIHJ1bGVOYW1lcyhsZWZ0UmVjdXJzaXZlKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwkJTWVzc2FnZSBtc2cgPSAoTWVzc2FnZSllcXVldWUuZXJyb3JzLmdldCgwKTsKKwkJYXNzZXJ0VHJ1ZSgiZXhwZWN0aW5nIGxlZnQgcmVjdXJzaW9uIGN5Y2xlczsgZm91bmQgIittc2cuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisJCQkJICAgIG1zZyBpbnN0YW5jZW9mIExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlKTsKKwkJTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UgY3ljbGVzTXNnID0gKExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlKW1zZzsKKworCQkvLyBjeWNsZSBvZiBbYSwgYl0KKwkJQ29sbGVjdGlvbiByZXN1bHQgPSBjeWNsZXNNc2cuY3ljbGVzOworCQlTZXQgZXhwZWN0aW5nID0gbmV3IEhhc2hTZXQoKSB7e2FkZCgiYSIpOyBhZGQoImIiKTsgYWRkKCJkIik7IGFkZCgiZSIpO319OworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBydWxlTmFtZXMyKHJlc3VsdCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RpZlRoZW5FbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiBJRiBzIChFIHMpPyB8IEI7XG4iICsKKwkJCSJzbGlzdDogcyBTRU1JIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUUtPjpzMT0+MVxuIiArCisJCQkiLnMwLVNFTUktPjpzMj0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG5ldyBpbnRbXSB7MSwyfTsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSAiRSI7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDE7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJCWV4cGVjdGluZyA9CisJCQkiLnMwLUItPjpzMj0+MlxuIiArCisJCQkiLnMwLUlGLT46czE9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMiwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0aWZUaGVuRWxzZUNoZWNrc1N0YWNrU3VmZml4Q29uZmxpY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gaWYgeW91IGRvbid0IGNoZWNrIHN0YWNrIHNvb24gZW5vdWdoLCB0aGlzIGZpbmRzIEUgQiBub3QganVzdCBFCisJCS8vIGFzIGFtYmlnIGlucHV0CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInNsaXN0OiBzIFNFTUkgO1xuIisKKwkJCSJzIDogSUYgcyBlbCB8IEI7XG4iICsKKwkJCSJlbDogKEUgcyk/IDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtRS0+OnMxPT4xXG4iICsKKwkJCSIuczAtU0VNSS0+OnMyPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDJ9OworCQlTdHJpbmcgYW1iaWdJbnB1dCA9ICJFIjsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMTsKKwkJY2hlY2tEZWNpc2lvbihnLCAyLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtQi0+OnMyPT4yXG4iICsKKwkJCSIuczAtSUYtPjpzMT0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZVJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IGIgQVxuIiArCisJCQkiICB8IGIgQlxuIiArCisJCQkiICB8IENcbiIgKworCQkJIiAgO1xuIiArCisJCQkiYiA6IFhcbiIgKworCQkJIiAgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1DLT46czQ9PjNcbiIgKworICAgICAgICAgICAgIi5zMC1YLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS1BLT46czI9PjFcbiIgKworICAgICAgICAgICAgIi5zMS1CLT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVJbnZva2VSdWxlTGVmdEVkZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IGIgWFxuIiArCisJCQkiICB8IGIgWVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJiIDogYyBCXG4iICsKKwkJCSIgIHwgY1xuIiArCisJCQkiICA7XG4iICsKKwkJCSJjIDogQyA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUMtPi5zMVxuIiArCisJCQkiLnMxLUItPi5zMlxuIiArCisJCQkiLnMxLVgtPjpzMz0+MVxuIiArCisJCQkiLnMxLVktPjpzND0+MlxuIiArCisJCQkiLnMyLVgtPjpzMz0+MVxuIiArCisJCQkiLnMyLVktPjpzND0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCQlleHBlY3RpbmcgPQorCQkJIi5zMC1DLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS1CLT46czI9PjFcbiIgKworICAgICAgICAgICAgIi5zMS1YLi5ZLT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMiwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0aW1tZWRpYXRlVGFpbFJlY3Vyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogQSBhIHwgQSBCOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEtQS0+OnMzPT4xXG4iICsKKwkJCSIuczEtQi0+OnMyPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QVN0YXJfaW1tZWRpYXRlVGFpbFJlY3Vyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogQSBhIHwgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iICsKKwkJCSIuczAtRU9GLT46czI9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7IC8vIHdpdGhvdXQKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9TdGFydFJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogQSBhIHwgWDsiKTsgLy8gc2luZ2xlIHJ1bGUgJ2EnIHJlZmVycyB0byBpdHNlbGY7IG5vIHN0YXJ0IHJ1bGUKKworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWVxdWV1ZS53YXJuaW5ncy5nZXQoMCk7CisJCWFzc2VydFRydWUoImV4cGVjdGluZyBubyBzdGFydCBydWxlczsgZm91bmQgIittc2cuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisJCQkJICAgbXNnIGluc3RhbmNlb2YgR3JhbW1hclNlbWFudGljc01lc3NhZ2UpOworCX0KKworCUBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFTdGFyX2ltbWVkaWF0ZVRhaWxSZWN1cnNpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiBhIDtcbiIgKworCQkJImEgOiBBIGEgfCBBIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisgICAgICAgICAgICAiLnMxLUEtPjpzMj0+MVxuIiArCisgICAgICAgICAgICAiLnMxLUVPRi0+OnMzPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAwOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RpbW1lZGlhdGVMZWZ0UmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiBhIDtcbiIgKworCQkJImEgOiBhIEEgfCBCOyIpOworCQlTZXQgbGVmdFJlY3Vyc2l2ZSA9IGcuZ2V0TGVmdFJlY3Vyc2l2ZVJ1bGVzKCk7CisJCVNldCBleHBlY3RlZFJ1bGVzID0gbmV3IEhhc2hTZXQoKSB7e2FkZCgiYSIpO319OworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSdWxlcywgcnVsZU5hbWVzKGxlZnRSZWN1cnNpdmUpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RMZWZ0UmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiBhIDtcbiIgKworCQkJImEgOiBiIHwgQSA7XG4iICsKKwkJCSJiIDogYyA7XG4iICsKKwkJCSJjIDogYSB8IEMgO1xuIik7CisJCVNldCBsZWZ0UmVjdXJzaXZlID0gZy5nZXRMZWZ0UmVjdXJzaXZlUnVsZXMoKTsKKwkJU2V0IGV4cGVjdGVkUnVsZXMgPSBuZXcgSGFzaFNldCgpIHt7YWRkKCJhIik7IGFkZCgiYiIpOyBhZGQoImMiKTt9fTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUnVsZXMsIHJ1bGVOYW1lcyhsZWZ0UmVjdXJzaXZlKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExlZnRSZWN1cnNpb25Jbk11bHRpcGxlQ3ljbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJzIDogYSB4IDtcbiIgKworCQkJCSJhIDogYiB8IEEgO1xuIiArCisJCQkJImIgOiBjIDtcbiIgKworCQkJCSJjIDogYSB8IEMgO1xuIiArCisJCQkJInggOiB5IHwgWCA7XG4iICsKKwkJCQkieSA6IHggO1xuIik7CisJCVNldCBsZWZ0UmVjdXJzaXZlID0gZy5nZXRMZWZ0UmVjdXJzaXZlUnVsZXMoKTsKKwkJU2V0IGV4cGVjdGVkUnVsZXMgPQorCQkJbmV3IEhhc2hTZXQoKSB7e2FkZCgiYSIpOyBhZGQoImIiKTsgYWRkKCJjIik7IGFkZCgieCIpOyBhZGQoInkiKTt9fTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUnVsZXMsIHJ1bGVOYW1lcyhsZWZ0UmVjdXJzaXZlKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEN5Y2xlSW5zaWRlUnVsZURvZXNOb3RGb3JjZUluZmluaXRlUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInMgOiBhIDtcbiIgKworCQkJImEgOiAoQXwpKyBCO1xuIik7CisJCS8vIGJlZm9yZSBJIGFkZGVkIGEgdmlzaXRlZFN0YXRlcyB0aGluZywgaXQgd2FzIHBvc3NpYmxlIHRvIGxvb3AKKwkJLy8gZm9yZXZlciBpbnNpZGUgb2YgYSBydWxlIGlmIHRoZXJlIHdhcyBhbiBlcHNpbG9uIGxvb3AuCisJCVNldCBsZWZ0UmVjdXJzaXZlID0gZy5nZXRMZWZ0UmVjdXJzaXZlUnVsZXMoKTsKKwkJU2V0IGV4cGVjdGVkUnVsZXMgPSBuZXcgSGFzaFNldCgpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSdWxlcywgbGVmdFJlY3Vyc2l2ZSk7CisJfQorCisJLy8gTCBPIE8gUCBTCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QVN0YXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6ICggQSApKiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT46czE9PjFcbiIgKworCQkJIi5zMC1FT0YtPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBb3JCb3JDU3RhcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogKCBBIHwgQiB8IEMgKSogOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS4uQy0+OnMxPT4xXG4iICsKKwkJCSIuczAtRU9GLT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QVBsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6ICggQSApKyA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT46czE9PjFcbiIgKworCQkJIi5zMC1FT0YtPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOyAvLyBsb29wYmFjayBkZWNpc2lvbgorCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBUGx1c05vbkdyZWVkeVdoZW5EZXRlcm1pbmlzdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAob3B0aW9ucyB7Z3JlZWR5PWZhbHNlO306QSkrIDtcbiIpOworCQkvLyBzaG91bGQgbG9vayB0aGUgc2FtZSBhcyBBKyBzaW5jZSBubyBhbWJpZ3VpdHkKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMT0+MVxuIiArCisJCQkiLnMwLUVPRi0+OnMyPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFQbHVzTm9uR3JlZWR5V2hlbk5vbkRldGVybWluaXN0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IChvcHRpb25zIHtncmVlZHk9ZmFsc2U7fTpBKSsgQSsgO1xuIik7CisJCS8vIHNob3VsZCBsb29rIHRoZSBzYW1lIGFzIEErIHNpbmNlIG5vIGFtYmlndWl0eQorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4yXG4iOyAvLyBhbHdheXMgY2hvb3NlcyB0byBleGl0CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG5ldyBpbnRbXSB7MX07CisJCWludFtdIG5vbkRldEFsdHMgPSBuZXcgaW50W10gezEsMn07CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gIkEiOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAyOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBUGx1c0dyZWVkeVdoZW5Ob25EZXRlcm1pbmlzdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpBKSsgQSsgO1xuIik7CisJCS8vIHNob3VsZCBsb29rIHRoZSBzYW1lIGFzIEErIHNpbmNlIG5vIGFtYmlndWl0eQorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iOyAvLyBhbHdheXMgY2hvb3NlcyB0byBlbnRlciBsb29wIHVwb24gQQorCQkvLyB0dXJucyBvZmYgMSBvZiB3YXJuaW5ncy4gQSBjYW4gbmV2ZXIgZXhpdCBsb29wIG5vdworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBuZXcgaW50W10gezJ9OworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAxOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBb3JCb3JDUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogKCBBIHwgQiB8IEMgKSsgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS4uQy0+OnMxPT4xXG4iICsKKwkJCSIuczAtRU9GLT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QU9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAoIEEgKT8gQiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT46czE9PjFcbiIgKworCQkJIi5zMC1CLT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsgLy8gbG9vcGJhY2sgZGVjaXNpb24KKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QW9yQm9yQ09wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAoIEEgfCBCIHwgQyApPyBaIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEuLkMtPjpzMT0+MVxuIiArCisJCQkiLnMwLVotPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOyAvLyBsb29wYmFjayBkZWNpc2lvbgorCX0KKworCS8vIEEgUiBCIEkgVCBSIEEgUiBZICBMIE8gTyBLIEEgSCBFIEEgRAorCisJQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QVN0YXJCT3JBU3RhckMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IChBKSogQiB8IChBKSogQzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMT0+MVxuIiArCisJCQkiLnMwLUItPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOyAvLyBsb29wYmFjaworCQlleHBlY3RpbmcgPQorCQkJIi5zMC1BLT46czE9PjFcbiIgKworCQkJIi5zMC1DLT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMiwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsgLy8gbG9vcGJhY2sKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKyAgICAgICAgICAgICIuczAtQi0+OnMyPT4xXG4iICsKKyAgICAgICAgICAgICIuczAtQy0+OnMzPT4yXG4iICsKKyAgICAgICAgICAgICIuczEtQS0+LnMxXG4iICsKKyAgICAgICAgICAgICIuczEtQi0+OnMyPT4xXG4iICsKKyAgICAgICAgICAgICIuczEtQy0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDMsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7IC8vIHJ1bGUgYmxvY2sKKwl9CisKKwlAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBU3RhckJPckFQbHVzQygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogKEEpKiBCIHwgKEEpKyBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iICsKKwkJCSIuczAtQi0+OnMyPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7IC8vIGxvb3BiYWNrCisJCWV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMT0+MVxuIiArCisJCQkiLnMwLUMtPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAyLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOyAvLyBsb29wYmFjaworCQlleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMC1CLT46czI9PjFcbiIgKworICAgICAgICAgICAgIi5zMS1BLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS1CLT46czI9PjFcbiIgKworICAgICAgICAgICAgIi5zMS1DLT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMywgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsgLy8gcnVsZSBibG9jaworCX0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QU9yQlBsdXNPckFQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAoQXxCKSogWCB8IChBKSsgWTsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEuLkItPjpzMT0+MVxuIiArCisJCQkiLnMwLVgtPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOyAvLyBsb29wYmFjayAoQXxCKSoKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iICsKKwkJCSIuczAtWS0+OnMyPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDIsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7IC8vIGxvb3BiYWNrIChBKSsKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKyAgICAgICAgICAgICIuczAtQi4uWC0+OnMyPT4xXG4iICsKKyAgICAgICAgICAgICIuczEtQS0+LnMxXG4iICsKKyAgICAgICAgICAgICIuczEtQi4uWC0+OnMyPT4xXG4iICsKKyAgICAgICAgICAgICIuczEtWS0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDMsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7IC8vIHJ1bGUKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TG9vcGJhY2tBbmRFeGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAoQXxCKSsgQjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMz0+MVxuIiArCisJCQkiLnMwLUItPi5zMVxuIiArCisJCQkiLnMxLUEuLkItPjpzMz0+MVxuIiArCisJCQkiLnMxLUVPRi0+OnMyPT4yXG4iOyAvLyBzZWVzIEF8QiBhcyBhIHNldAorCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsQWx0QW5kQnlwYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiAoQXxCKT8gQjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMj0+MVxuIiArCisJCQkiLnMwLUItPi5zMVxuIiArCisJCQkiLnMxLUItPjpzMj0+MVxuIiArCisJCQkiLnMxLUVPRi0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJLy8gUiBFIFMgTyBMIFYgRSAgUyBZIE4gIEMgTyBOIEYgTCBJIEMgVCBTCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUxMMUJ5Q2hvb3NpbmdGaXJzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogQSBDIHwgQSBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEtQy0+OnMyPT4xXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBuZXcgaW50W10gezJ9OworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDJ9OworCQlTdHJpbmcgYW1iaWdJbnB1dCA9ICJBIEMiOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAyOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlTEwyQnlDaG9vc2luZ0ZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiBBIEIgfCBBIEI7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworCQkJIi5zMS1CLT46czI9PjFcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG5ldyBpbnRbXSB7Mn07CisJCWludFtdIG5vbkRldEFsdHMgPSBuZXcgaW50W10gezEsMn07CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gIkEgQiI7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlc29sdmVMTDJNaXhBbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IEEgQiB8IEEgQyB8IEEgQiB8IFo7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworCQkJIi5zMC1aLT46czQ9PjRcbiIgKworCQkJIi5zMS1CLT46czI9PjFcbiIgKworCQkJIi5zMS1DLT46czM9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG5ldyBpbnRbXSB7M307CisJCWludFtdIG5vbkRldEFsdHMgPSBuZXcgaW50W10gezEsM307CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gIkEgQiI7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0SUZUaGVuRWxzZVN0eWxlQW1iaWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdGhlIChjKSsgbG9vcGJhY2sgaXMgYW1iaWcgYmVjYXVzZSBpdCBjb3VsZCBtYXRjaCAiQ0FTRSIKKwkJLy8gYnkgZW50ZXJpbmcgdGhlIGxvb3Agb3IgYnkgZmFsbGluZyBvdXQgYW5kIGlnbm9yaW5nIChzKSoKKwkJLy8gYmFjayBmYWxsaW5nIGJhY2sgaW50byAoY2cpKiBsb29wIHdoaWNoIHN0YXRzIG92ZXIgYW5kCisJCS8vIGNhbGxzIGNnIGFnYWluLiAgRWl0aGVyIGNob2ljZSBhbGxvd3MgaXQgdG8gZ2V0IGJhY2sgdG8KKwkJLy8gdGhlIHNhbWUgbm9kZS4gIFRoZSBzb2Z0d2FyZSBjYXRjaGVzIGl0IGFzOgorCQkvLyAiYXZvaWQgaW5maW5pdGUgY2xvc3VyZSBjb21wdXRhdGlvbiBlbWFuYXRpbmcgZnJvbSBhbHQgMQorCQkvLyBvZiAoKToyN3wyfFs4ICRdIiB3aGVyZSBzdGF0ZSAyNyBpcyB0aGUgZmlyc3QgYWx0IG9mIChjKSsKKwkJLy8gYW5kIDggaXMgdGhlIGZpcnN0IGFsdCBvZiB0aGUgKGNnKSogbG9vcC4KKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIgKworCQkJInMgOiBzdGF0IDtcbiIgKworCQkJInN0YXQgOiBMQ1VSTFkgKCBjZyApKiBSQ1VSTFkgfCBFIFNFTUkgIDtcbiIgKworCQkJImNnIDogKGMpKyAoc3RhdCkqIDtcbiIgKworCQkJImMgOiBDQVNFIEUgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1DQVNFLT46czI9PjFcbiIgKworCQkJIi5zMC1FLi5SQ1VSTFktPjpzMT0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG5ldyBpbnRbXSB7MSwyfTsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSAiQ0FTRSI7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDE7CisJCWNoZWNrRGVjaXNpb24oZywgMywgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJLy8gUyBFIFQgUworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbXBsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IH4oQSB8IEIgfCBDKSB8IEMgezt9IDtcbiIgKworCQkJImIgOiBYIFkgWiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1DLT46czI9PjJcbiIgKworCQkJIi5zMC1YLi5aLT46czE9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxlbWVudFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiB+QyB8IEMgezt9IDtcbiIgKworCQkJImIgOiBYIFkgWiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1DLT46czI9PjJcbiIgKworCQkJIi5zMC1YLi5aLT46czE9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxlbWVudENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogfid4JyB8ICd4JyB7O30gO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0neCctPjpzMj0+MlxuIiArCisJCQkiLnMwLXsnXFx1MDAwMCcuLid3JywgJ3knLi4nXFx1RkZGRid9LT46czE9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxlbWVudENoYXJTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogfignICd8J1x0J3wneCd8J3knKSB8ICd4JztcbiIgKyAvLyBjb2xsYXBzZSBpbnRvIHNpbmdsZSBzZXQKKwkJCSJCIDogJ3knIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSd5Jy0+OnMyPT4yXG4iICsKKwkJCSIuczAteydcXHUwMDAwJy4uJ1xcYicsICdcXG4nLi4nXFx1MDAxRicsICchJy4uJ3gnLCAneicuLidcXHVGRkZGJ30tPjpzMT0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb1NldENvbGxhcHNlV2l0aEFjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IChBIHwgQiB7Zm9vfSkgfCBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iICsKKwkJCSIuczAtQi0+OnMyPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVBbHRzU2V0Q29sbGFwc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IEEgfCBCIHwgQyA7IgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gLy8gc3RpbGwgbG9va3MgbGlrZSBibG9jaworCQkJIihncmFtbWFyIHQgKHJ1bGUgYSBBUkcgUkVUIHNjb3BlIChCTE9DSyAoQUxUIEEgPGVuZC1vZi1hbHQ+KSAoQUxUIEIgPGVuZC1vZi1hbHQ+KSAoQUxUIEMgPGVuZC1vZi1hbHQ+KSA8ZW5kLW9mLWJsb2NrPikgPGVuZC1vZi1ydWxlPikpIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZy5nZXRHcmFtbWFyVHJlZSgpLnRvU3RyaW5nVHJlZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5zUnVsZUFsdHNEb05vdENvbGxhcHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJzsiICsKKwkJCSJCIDogJ2InO1xuIgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ2EnLT46czE9PjFcbiIgKworCQkJIi5zMC0nYictPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNlcXVlbmNlQ29sbGlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJhIDogKEF7O318QilcbiIgKworCQkJIiAgfCAoQXs7fXxCKVxuIiArCisJCQkiICB8IEFcbiIgKworCQkJIiAgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iICsKKwkJCSIuczAtQi0+OnMyPT4xXG4iOyAvLyBub3Qgb3B0aW1pemVkIGJlY2F1c2Ugc3RhdGVzIGFyZSBub25kZXQKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbmV3IGludFtdIHsyLDN9OworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDIsM307CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gIkEiOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAzOworCQljaGVja0RlY2lzaW9uKGcsIDMsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCQkvKiBUaGVyZSBhcmUgMiBub25kZXQgZXJyb3JzLCBidXQgdGhlIGNoZWNrRGVjaXNpb24gb25seSBjaGVja3MgZmlyc3Qgb25lIDooCisJCVRoZSAiQiIgY29uZmxpY3RpbmcgaW5wdXQgaXMgbm90IGNoZWNrZWQgZXhjZXB0IGJ5IHZpcnR1ZSBvZiB0aGUKKwkJcmVzdWx0IERGQS4KKzxzdHJpbmc+OjI6NTogRGVjaXNpb24gY2FuIG1hdGNoIGlucHV0IHN1Y2ggYXMgIkEiIHVzaW5nIG11bHRpcGxlIGFsdGVybmF0aXZlczoKK2FsdCAxIHZpYSBORkEgcGF0aCA3LDIsMworYWx0IDIgdmlhIE5GQSBwYXRoIDE0LDksMTAKK2FsdCAzIHZpYSBORkEgcGF0aCAxNiwxNworQXMgYSByZXN1bHQsIGFsdGVybmF0aXZlKHMpIDIsMyB3ZXJlIGRpc2FibGVkIGZvciB0aGF0IGlucHV0LAorPHN0cmluZz46Mjo1OiBEZWNpc2lvbiBjYW4gbWF0Y2ggaW5wdXQgc3VjaCBhcyAiQiIgdXNpbmcgbXVsdGlwbGUgYWx0ZXJuYXRpdmVzOgorYWx0IDEgdmlhIE5GQSBwYXRoIDcsOCw0LDUKK2FsdCAyIHZpYSBORkEgcGF0aCAxNCwxNSwxMSwxMgorQXMgYSByZXN1bHQsIGFsdGVybmF0aXZlKHMpIDIgd2VyZSBkaXNhYmxlZCBmb3IgdGhhdCBpbnB1dAorPHN0cmluZz46Mjo1OiBUaGUgZm9sbG93aW5nIGFsdGVybmF0aXZlcyBhcmUgdW5yZWFjaGFibGU6IDIsMworKi8KKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBbHRzU2FtZVNlcXVlbmNlQ29sbGlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJhIDogdHlwZSBJRCBcbiIgKworCQkJIiAgfCB0eXBlIElEXG4iICsKKwkJCSIgIHwgdHlwZSBJRFxuIiArCisJCQkiICB8IHR5cGUgSURcbiIgKworCQkJIiAgO1xuIiArCisJCQkiXG4iICsKKwkJCSJ0eXBlIDogSSB8IEY7Iik7CisJCS8vIG5vbmRldGVybWluaXN0aWMgZnJvbSBsZWZ0IGVkZ2U7IG5vIHN0b3Agc3RhdGUKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUYuLkktPi5zMVxuIiArCisJCQkiLnMxLUlELT46czI9PjFcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG5ldyBpbnRbXSB7MiwzLDR9OworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDIsMyw0fTsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSAiRi4uSSBJRCI7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZvbGxvd1JldHVybnNUb0xvb3BSZWVudGVyaW5nU2FtZVJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gRDA3IGNhbiBiZSBtYXRjaGVkIGluIHRoZSAoLi4uKT8gb3IgZmFsbCBvdXQgb2YgZXNjIGJhY2sgaW50byAoLi4pKgorCQkvLyBsb29wIGluIHNsLiAgTm90ZSB0aGF0IEQwNyBpcyBtYXRjaGVkIGJ5IH4oUnxTTEFTSCkuICBObyBnb29kCisJCS8vIHdheSB0byB3cml0ZSB0aGF0IGdyYW1tYXIgSSBndWVzcworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzbCA6IEwgKCBlc2MgfCB+KFJ8U0xBU0gpICkqIFIgO1xuIiArCisJCQkiXG4iICsKKwkJCSJlc2MgOiBTTEFTSCAoIE4gfCBEMDMgKEQwNyk/ICkgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtRDAzLi5OLT46czI9PjJcbiIgKworCQkJIi5zMC1SLT46czM9PjNcbiIgKworCQkJIi5zMC1TTEFTSC0+OnMxPT4xXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbmV3IGludFtdIHsxLDJ9OworCQlTdHJpbmcgYW1iaWdJbnB1dCA9ICJEMDciOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAxOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkNhbGxzQW5vdGhlck9uTGVmdEVkZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJGICAgOiAgIEkgJy4nXG4iICsKKwkJCSIgICAgO1xuIiArCisJCQkiSSAgIDogICAnMCdcbiIgKworCQkJIiAgICA7XG4iCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nMCctPi5zMVxuIiArCisJCQkiLnMxLScuJy0+OnMzPT4xXG4iICsKKwkJCSIuczEtPEVPVD4tPjpzMj0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNlbGZSZWN1cnNpb25BbWJpZ0FsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYW1iaWd1b3VzIGdyYW1tYXIgZm9yICJMIElEIFIiIChhbHRzIDEsMiBvZiBhKQorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJzIDogYTtcbiIgKworCQkJImEgICA6ICAgTCBJRCBSXG4iICsKKwkJCSIgICAgfCAgIEwgYSBSXG4iICsgLy8gZGlzYWJsZWQgZm9yIEwgSUQgUgorCQkJIiAgICB8ICAgYlxuIiArCisJCQkiICAgIDtcbiIgKworCQkJIlxuIiArCisJCQkiYiAgIDogICBJRFxuIiArCisJCQkiICAgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtSUQtPjpzNT0+M1xuIiArCisJCQkiLnMwLUwtPi5zMVxuIiArCisJCQkiLnMxLUlELT4uczJcbiIgKworCQkJIi5zMS1MLT46czQ9PjJcbiIgKworCQkJIi5zMi1SLT46czM9PjFcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBuZXcgaW50W10gezEsMn07CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gIkwgSUQgUiI7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDE7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVjdXJzaW9uQW1iaWdBbHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFtYmlndW91cyBncmFtbWFyIGZvciAiTCBJRCBSIiAoYWx0cyAxLDIgb2YgYSkKKwkJLy8gVGhpcyB3YXMgZGVyaXZlZCBmcm9tIHRoZSBqYXZhIGdyYW1tYXIgMTIvNC8yMDA0IHdoZW4gaXQKKwkJLy8gd2FzIG5vdCBoYW5kbGluZyBhIHVuYXJ5RXhwcmVzc2lvbiBwcm9wZXJseS4gIEkgdHJhY2VkIGl0CisJCS8vIHRvIGluY29ycmVjdCBjbG9zdXJlLWJ1c3kgY29uZGl0aW9uLiAgSXQgdGhvdWdodCB0aGF0IHRoZSB0cmFjZQorCQkvLyBvZiBhLT5iLT5hLT5iIGFnYWluIGZvciAiTCBJRCIgd2FzIGFuIGluZmluaXRlIGxvb3AsIGJ1dCBhY3R1YWxseQorCQkvLyB0aGUgcmVwZWF0IGNhbGwgdG8gYiBvbmx5IGhhcHBlbnMgKmFmdGVyKiBhbiBMIGhhcyBiZWVuIG1hdGNoZWQuCisJCS8vIEkgYWRkZWQgYSBjaGVjayB0byBzZWUgd2hhdCB0aGUgaW5pdGlhbCBzdGFjayBsb29rcyBsaWtlIGFuZCBpdAorCQkvLyBzZWVtcyB0byB3b3JrIG5vdy4KKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkicyAgIDogICBhIDtcbiIgKworCQkJImEgICA6ICAgTCBJRCBSXG4iICsKKwkJCSIgICAgfCAgIGJcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJcbiIgKworCQkJImIgICA6ICAgSURcbiIgKworCQkJIiAgICB8ICAgTCBhIFJcbiIgKworCQkJIiAgICA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1JRC0+OnM0PT4yXG4iICsKKwkJCSIuczAtTC0+LnMxXG4iICsKKwkJCSIuczEtSUQtPi5zMlxuIiArCisJCQkiLnMxLUwtPjpzND0+MlxuIiArCisJCQkiLnMyLVItPjpzMz0+MVxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG5ldyBpbnRbXSB7MSwyfTsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSAiTCBJRCBSIjsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMTsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VGFpbFJlY3Vyc2lvbkludm9rZWRGcm9tQXJiaXRyYXJ5TG9va2FoZWFkRGVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IGIgWFxuIiArCisJCQkiICB8IGIgWVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJcbiIgKworCQkJImIgOiBBXG4iICsKKwkJCSIgIHwgQSBiXG4iICsKKwkJCSIgIDtcbiIpOworCQlMaXN0IGFsdHNXaXRoUmVjdXJzaW9uID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10gezEsMn0pOworCQlhc3NlcnROb25MTFN0YXIoZywgYWx0c1dpdGhSZWN1cnNpb24pOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZFN0YXJLMUFuZE5vbkdyZWVkeUJ5RGVmYXVsdEluUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIG5vIGVycm9yIGJlY2F1c2UgLiogYXNzdW1lcyBpdCBzaG91bGQgZmluaXNoIHdoZW4gaXQgc2VlcyBSCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJzIDogQSBibG9jayBFT0YgO1xuIiArCisJCQkiYmxvY2sgOiBMIC4qIFIgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS4uTC0+OnMyPT4xXG4iICsKKwkJCSIuczAtUi0+OnMxPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAwOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZFBsdXNLMUFuZE5vbkdyZWVkeUJ5RGVmYXVsdEluUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iICsKKwkJCSJzIDogQSBibG9jayBFT0YgO1xuIiArCisJCQkiYmxvY2sgOiBMIC4rIFIgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS4uTC0+OnMyPT4xXG4iICsKKwkJCSIuczAtUi0+OnMxPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAwOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHYXRlZFN5blByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkieCAgIDogKFgpPT4gWFxuIiArCisJCQkiICAgIHwgWVxuIiArCisJCQkiICAgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtWCYme3N5bnByZWQxX3R9Py0+OnMxPT4xXG4iICsgLy8gZG9lcyBub3QgaG9pc3Q7IGl0IGdhdGVzIGVkZ2VzCisJCQkiLnMwLVktPjpzMj0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKworCQlTZXQ8U3RyaW5nPiBwcmVkcyA9IGcuc3luUHJlZE5hbWVzVXNlZEluREZBOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFByZWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpIHt7YWRkKCJzeW5wcmVkMV90Iik7fX07CisJCWFzc2VydEVxdWFscygicHJlZGljYXRlIG5hbWVzIG5vdCByZWNvcmRlZCBwcm9wZXJseSBpbiBncmFtbWFyIiwgZXhwZWN0ZWRQcmVkcywgcHJlZHMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RIb2lzdGVkR2F0ZWRTeW5QcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInggICA6IChYKT0+IFhcbiIgKworCQkJIiAgICB8IFhcbiIgKworCQkJIiAgICA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLVgtPi5zMVxuIiArCisJCQkiLnMxLXtzeW5wcmVkMV90fT8tPjpzMj0+MVxuIiArIC8vIGhvaXN0cyBpbnRvIGRlY2lzaW9uCisJCQkiLnMxLXt0cnVlfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKworCQlTZXQ8U3RyaW5nPiBwcmVkcyA9IGcuc3luUHJlZE5hbWVzVXNlZEluREZBOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFByZWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpIHt7YWRkKCJzeW5wcmVkMV90Iik7fX07CisJCWFzc2VydEVxdWFscygicHJlZGljYXRlIG5hbWVzIG5vdCByZWNvcmRlZCBwcm9wZXJseSBpbiBncmFtbWFyIiwgZXhwZWN0ZWRQcmVkcywgcHJlZHMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RIb2lzdGVkR2F0ZWRTeW5QcmVkMigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJ4ICAgOiAoWCk9PiAoWHxZKVxuIiArCisJCQkiICAgIHwgWFxuIiArCisJCQkiICAgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtWC0+LnMxXG4iICsKKwkJCSIuczAtWSYme3N5bnByZWQxX3R9Py0+OnMyPT4xXG4iICsKKwkJCSIuczEte3N5bnByZWQxX3R9Py0+OnMyPT4xXG4iICsKKwkJCSIuczEte3RydWV9Py0+OnMzPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAwOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworCisJCVNldDxTdHJpbmc+IHByZWRzID0gZy5zeW5QcmVkTmFtZXNVc2VkSW5ERkE7CisJCVNldDxTdHJpbmc+IGV4cGVjdGVkUHJlZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCkge3thZGQoInN5bnByZWQxX3QiKTt9fTsKKwkJYXNzZXJ0RXF1YWxzKCJwcmVkaWNhdGUgbmFtZXMgbm90IHJlY29yZGVkIHByb3Blcmx5IGluIGdyYW1tYXIiLCBleHBlY3RlZFByZWRzLCBwcmVkcyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEdyZWVkeUdldHNOb0Vycm9yRm9yQW1iaWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkicyA6IElGIHMgKG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiBFIHMpPyB8IEI7XG4iICsKKwkJCSJzbGlzdDogcyBTRU1JIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUUtPjpzMT0+MVxuIiArCisJCQkiLnMwLVNFTUktPjpzMj0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtQi0+OnMyPT4yXG4iICsKKwkJCSIuczAtSUYtPjpzMT0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAyLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHcmVlZHlOb25MTFN0YXJTdGlsbEdldHNFcnJvcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJ4ICAgOiAoIG9wdGlvbnMge2dyZWVkeT10cnVlO31cbiIgKworCQkJIgkgICA6IHkgWFxuIiArCisJCQkiICAgICAgfCB5IFlcbiIgKworCQkJIgkgICApXG4iICsKKwkJCSIgICAgO1xuIiArCisJCQkieSAgIDogTCB5IFJcbiIgKworCQkJIiAgICB8IEJcbiIgKworCQkJIiAgICA7Iik7CisJCUxpc3QgYWx0c1dpdGhSZWN1cnNpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7MSwyfSk7CisJCWFzc2VydE5vbkxMU3RhcihnLCBhbHRzV2l0aFJlY3Vyc2lvbik7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEdyZWVkeVJlY092ZXJmbG93U3RpbGxHZXRzRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkicyA6IChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDogYSBZIHwgQSBBIEEgQSBBIFgpIDtcbiIgKyAvLyBmb3JjZSByZWN1cnNpb24gcGFzdCBtPTQKKwkJCSJhIDogQSBhIHwgUTsiKTsKKwkJTGlzdCBleHBlY3RlZFRhcmdldFJ1bGVzID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyJhIn0pOworCQlpbnQgZXhwZWN0ZWRBbHQgPSAxOworCQlhc3NlcnRSZWN1cnNpb25PdmVyZmxvdyhnLCBleHBlY3RlZFRhcmdldFJ1bGVzLCBleHBlY3RlZEFsdCk7CisJfQorCisKKwkvLyBDaGVjayBzdGF0ZSB0YWJsZSBjcmVhdGlvbgorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEN5Y2xpY1RhYmxlQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IEErIFggfCBBKyBZIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMT0+MVxuIiArCisJCQkiLnMwLUItPjpzMj0+MlxuIjsKKwl9CisKKworCS8vIFMgVSBQIFAgTyBSIFQKKworCXB1YmxpYyB2b2lkIF90ZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogQSB8IEI7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDApOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFzc2VydE5vbkxMU3RhcihHcmFtbWFyIGcsIExpc3QgZXhwZWN0ZWRCYWRBbHRzKSB7CisJCURlY2lzaW9uUHJvYmUudmVyYm9zZT10cnVlOyAvLyBtYWtlIHN1cmUgd2UgZ2V0IGFsbCBlcnJvciBpbmZvCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQkvLyBtaW1pYyBhY3Rpb25zIG9mIG9yZy5hbnRsci5Ub29sIGZpcnN0IHRpbWUgZm9yIGdyYW1tYXIgZworCQlpZiAoIGcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKT09MCApIHsKKwkJCWcuYnVpbGRORkEoKTsKKwkJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisJCX0KKwkJTm9uUmVndWxhckRlY2lzaW9uTWVzc2FnZSBtc2cgPSBnZXROb25SZWd1bGFyRGVjaXNpb25NZXNzYWdlKGVxdWV1ZS5lcnJvcnMpOworCQlhc3NlcnRUcnVlKCJleHBlY3RlZCBmYXRhbCBub24tTEwoKikgbXNnIiwgbXNnIT1udWxsKTsKKwkJTGlzdDxJbnRlZ2VyPiBhbHRzID0gbmV3IEFycmF5TGlzdCgpOworCQlhbHRzLmFkZEFsbChtc2cuYWx0c1dpdGhSZWN1cnNpb24pOworCQlDb2xsZWN0aW9ucy5zb3J0KGFsdHMpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCYWRBbHRzLGFsdHMpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFzc2VydFJlY3Vyc2lvbk92ZXJmbG93KEdyYW1tYXIgZywKKwkJCQkJCQkJCQkgICBMaXN0IGV4cGVjdGVkVGFyZ2V0UnVsZXMsCisJCQkJCQkJCQkJICAgaW50IGV4cGVjdGVkQWx0KSB7CisJCURlY2lzaW9uUHJvYmUudmVyYm9zZT10cnVlOyAvLyBtYWtlIHN1cmUgd2UgZ2V0IGFsbCBlcnJvciBpbmZvCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQkvLyBtaW1pYyBhY3Rpb25zIG9mIG9yZy5hbnRsci5Ub29sIGZpcnN0IHRpbWUgZm9yIGdyYW1tYXIgZworCQlpZiAoIGcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKT09MCApIHsKKwkJCWcuYnVpbGRORkEoKTsKKwkJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisJCX0KKwkJUmVjdXJzaW9uT3ZlcmZsb3dNZXNzYWdlIG1zZyA9IGdldFJlY3Vyc2lvbk92ZXJmbG93TWVzc2FnZShlcXVldWUuZXJyb3JzKTsKKwkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBleHBlY3RlZCByZWN1cnNpb24gb3ZlcmZsb3cgbXNnIittc2csIG1zZyE9bnVsbCk7CisJCWFzc2VydEVxdWFscygidGFyZ2V0IHJ1bGVzIG1pc21hdGNoIiwKKwkJCQkJIGV4cGVjdGVkVGFyZ2V0UnVsZXMudG9TdHJpbmcoKSwgbXNnLnRhcmdldFJ1bGVzLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoIm1pc21hdGNoZWQgYWx0IiwgZXhwZWN0ZWRBbHQsIG1zZy5hbHQpOworCX0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkSW5UcmVlR3JhbW1hcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgdDtcbiIgKworICAgICAgICAgICAgImEgOiBBIEIgfCBBIC4gO1xuIik7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPQorICAgICAgICAgICAgIi5zMC1BLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS1BLT46czM9PjJcbiIgKworICAgICAgICAgICAgIi5zMS1CLT46czI9PjFcbiI7CisgICAgICAgIGludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisgICAgICAgIGludFtdIG5vbkRldEFsdHMgPSBuZXcgaW50W10gezEsMn07CisgICAgICAgIFN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKyAgICAgICAgaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKyAgICAgICAgaW50IG51bVdhcm5pbmdzID0gMTsKKyAgICAgICAgY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKyAgICAgICAgICAgICAgICAgICAgICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZEluVHJlZUdyYW1tYXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciB0O1xuIiArCisgICAgICAgICAgICAiYSA6IF4oQSBYIFkpIHwgXihBIC4gLikgO1xuIik7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPQorICAgICAgICAgICAgIi5zMC1BLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS1ET1dOLT4uczJcbiIgKworICAgICAgICAgICAgIi5zMi1YLT4uczNcbiIgKworICAgICAgICAgICAgIi5zMi17QSwgWX0tPjpzNj0+MlxuIiArCisgICAgICAgICAgICAiLnMzLVktPi5zNFxuIiArCisgICAgICAgICAgICAiLnMzLXtET1dOLCBBLi5YfS0+OnM2PT4yXG4iICsKKyAgICAgICAgICAgICIuczQtRE9XTi0+OnM2PT4yXG4iICsKKyAgICAgICAgICAgICIuczQtVVAtPjpzNT0+MVxuIjsKKyAgICAgICAgaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKyAgICAgICAgaW50W10gbm9uRGV0QWx0cyA9IG5ldyBpbnRbXSB7MSwyfTsKKyAgICAgICAgU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworICAgICAgICBpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworICAgICAgICBpbnQgbnVtV2FybmluZ3MgPSAxOworICAgICAgICBjaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorICAgICAgICAgICAgICAgICAgICAgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrRGVjaXNpb24oR3JhbW1hciBnLAorCQkJCQkJCQkgaW50IGRlY2lzaW9uLAorCQkJCQkJCQkgU3RyaW5nIGV4cGVjdGluZywKKwkJCQkJCQkJIGludFtdIGV4cGVjdGluZ1VucmVhY2hhYmxlQWx0cywKKwkJCQkJCQkJIGludFtdIGV4cGVjdGluZ05vbkRldEFsdHMsCisJCQkJCQkJCSBTdHJpbmcgZXhwZWN0aW5nQW1iaWdJbnB1dCwKKwkJCQkJCQkJIGludFtdIGV4cGVjdGluZ0RhbmdsaW5nQWx0cywKKwkJCQkJCQkJIGludCBleHBlY3RpbmdOdW1XYXJuaW5ncykKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRGVjaXNpb25Qcm9iZS52ZXJib3NlPXRydWU7IC8vIG1ha2Ugc3VyZSB3ZSBnZXQgYWxsIGVycm9yIGluZm8KKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisJCS8vIG1pbWljIGFjdGlvbnMgb2Ygb3JnLmFudGxyLlRvb2wgZmlyc3QgdGltZSBmb3IgZ3JhbW1hciBnCisJCWlmICggZy5nZXROdW1iZXJPZkRlY2lzaW9ucygpPT0wICkgeworCQkJZy5idWlsZE5GQSgpOworCQkJZy5jcmVhdGVMb29rYWhlYWRERkFzKGZhbHNlKTsKKwkJfQorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKG5ld1Rvb2woKSwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisKKwkJaWYgKCBlcXVldWUuc2l6ZSgpIT1leHBlY3RpbmdOdW1XYXJuaW5ncyApIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZ3MgaXNzdWVkOiAiK2VxdWV1ZSk7CisJCX0KKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGV4cGVjdGVkIHByb2JsZW1zIiwKKwkJCQkgICBleHBlY3RpbmdOdW1XYXJuaW5ncywgZXF1ZXVlLnNpemUoKSk7CisKKwkJREZBIGRmYSA9IGcuZ2V0TG9va2FoZWFkREZBKGRlY2lzaW9uKTsKKwkJYXNzZXJ0Tm90TnVsbCgibm8gREZBIGZvciBkZWNpc2lvbiAiK2RlY2lzaW9uLCBkZmEpOworCQlGQVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBGQVNlcmlhbGl6ZXIoZyk7CisJCVN0cmluZyByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZmEuc3RhcnRTdGF0ZSk7CisKKwkJTGlzdCB1bnJlYWNoYWJsZUFsdHMgPSBkZmEuZ2V0VW5yZWFjaGFibGVBbHRzKCk7CisKKwkJLy8gbWFrZSBzdXJlIHVucmVhY2hhYmxlIGFsdHMgYXJlIGFzIGV4cGVjdGVkCisJCWlmICggZXhwZWN0aW5nVW5yZWFjaGFibGVBbHRzIT1udWxsICkgeworCQkJQml0U2V0IHMgPSBuZXcgQml0U2V0KCk7CisJCQlzLmFkZEFsbChleHBlY3RpbmdVbnJlYWNoYWJsZUFsdHMpOworCQkJQml0U2V0IHMyID0gbmV3IEJpdFNldCgpOworCQkJczIuYWRkQWxsKHVucmVhY2hhYmxlQWx0cyk7CisJCQlhc3NlcnRFcXVhbHMoInVucmVhY2hhYmxlIGFsdHMgbWlzbWF0Y2giLCBzLCBzMik7CisJCX0KKwkJZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMoIm51bWJlciBvZiB1bnJlYWNoYWJsZSBhbHRzIiwgMCwKKwkJCQkJCSB1bnJlYWNoYWJsZUFsdHMhPW51bGw/dW5yZWFjaGFibGVBbHRzLnNpemUoKTowKTsKKwkJfQorCisJCS8vIGNoZWNrIGNvbmZsaWN0aW5nIGlucHV0CisJCWlmICggZXhwZWN0aW5nQW1iaWdJbnB1dCE9bnVsbCApIHsKKwkJCS8vIGZpcnN0LCBmaW5kIG5vbmRldCBtZXNzYWdlCisJCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWVxdWV1ZS53YXJuaW5ncy5nZXQoMCk7CisJCQlhc3NlcnRUcnVlKCJleHBlY3Rpbmcgbm9uZGV0ZXJtaW5pc207IGZvdW5kICIrbXNnLmdldENsYXNzKCkuZ2V0TmFtZSgpLAorCQkJCQkgICAgbXNnIGluc3RhbmNlb2YgR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSk7CisJCQlHcmFtbWFyTm9uRGV0ZXJtaW5pc21NZXNzYWdlIG5vbmRldE1zZyA9CisJCQkJZ2V0Tm9uRGV0ZXJtaW5pc21NZXNzYWdlKGVxdWV1ZS53YXJuaW5ncyk7CisJCQlMaXN0IGxhYmVscyA9CisJCQkJbm9uZGV0TXNnLnByb2JlLmdldFNhbXBsZU5vbkRldGVybWluaXN0aWNJbnB1dFNlcXVlbmNlKG5vbmRldE1zZy5wcm9ibGVtU3RhdGUpOworCQkJU3RyaW5nIGlucHV0ID0gbm9uZGV0TXNnLnByb2JlLmdldElucHV0U2VxdWVuY2VEaXNwbGF5KGxhYmVscyk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nQW1iaWdJbnB1dCwgaW5wdXQpOworCQl9CisKKwkJLy8gY2hlY2sgbm9uZGV0IGFsdHMKKwkJaWYgKCBleHBlY3RpbmdOb25EZXRBbHRzIT1udWxsICkgeworCQkJUmVjdXJzaW9uT3ZlcmZsb3dNZXNzYWdlIHJlY01zZyA9IG51bGw7CisJCQlHcmFtbWFyTm9uRGV0ZXJtaW5pc21NZXNzYWdlIG5vbmRldE1zZyA9CisJCQkJZ2V0Tm9uRGV0ZXJtaW5pc21NZXNzYWdlKGVxdWV1ZS53YXJuaW5ncyk7CisJCQlMaXN0IG5vbkRldEFsdHMgPSBudWxsOworCQkJaWYgKCBub25kZXRNc2chPW51bGwgKSB7CisJCQkJbm9uRGV0QWx0cyA9CisJCQkJCW5vbmRldE1zZy5wcm9iZS5nZXROb25EZXRlcm1pbmlzdGljQWx0c0ZvclN0YXRlKG5vbmRldE1zZy5wcm9ibGVtU3RhdGUpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcmVjTXNnID0gZ2V0UmVjdXJzaW9uT3ZlcmZsb3dNZXNzYWdlKGVxdWV1ZS53YXJuaW5ncyk7CisJCQkJaWYgKCByZWNNc2chPW51bGwgKSB7CisJCQkJCS8vbm9uRGV0QWx0cyA9IG5ldyBBcnJheUxpc3QocmVjTXNnLmFsdHMpOworCQkJCX0KKwkJCX0KKwkJCS8vIGNvbXBhcmUgbm9uRGV0QWx0cyB3aXRoIGV4cGVjdGluZ05vbkRldEFsdHMKKwkJCUJpdFNldCBzID0gbmV3IEJpdFNldCgpOworCQkJcy5hZGRBbGwoZXhwZWN0aW5nTm9uRGV0QWx0cyk7CisJCQlCaXRTZXQgczIgPSBuZXcgQml0U2V0KCk7CisJCQlzMi5hZGRBbGwobm9uRGV0QWx0cyk7CisJCQlhc3NlcnRFcXVhbHMoIm5vbmRldCBhbHRzIG1pc21hdGNoIiwgcywgczIpOworCQkJYXNzZXJ0VHJ1ZSgiZm91bmQgbm8gbm9uZGV0IGFsdHM7IGV4cGVjdGluZzogIisKKwkJCQkJICAgIHN0cihleHBlY3RpbmdOb25EZXRBbHRzKSwKKwkJCQkJICAgIG5vbmRldE1zZyE9bnVsbHx8cmVjTXNnIT1udWxsKTsKKwkJfQorCQllbHNlIHsKKwkJCS8vIG5vdCBleHBlY3RpbmcgYW55IG5vbmRldCBhbHRzLCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vbmUKKwkJCUdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2Ugbm9uZGV0TXNnID0KKwkJCQlnZXROb25EZXRlcm1pbmlzbU1lc3NhZ2UoZXF1ZXVlLndhcm5pbmdzKTsKKwkJCWFzc2VydE51bGwoImZvdW5kIG5vbmRldCBhbHRzLCBidXQgZXhwZWN0aW5nIG5vbmUiLCBub25kZXRNc2cpOworCQl9CisKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlwcm90ZWN0ZWQgR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSBnZXROb25EZXRlcm1pbmlzbU1lc3NhZ2UoTGlzdCB3YXJuaW5ncykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHdhcm5pbmdzLnNpemUoKTsgaSsrKSB7CisJCQlNZXNzYWdlIG0gPSAoTWVzc2FnZSkgd2FybmluZ3MuZ2V0KGkpOworCQkJaWYgKCBtIGluc3RhbmNlb2YgR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSApIHsKKwkJCQlyZXR1cm4gKEdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2UpbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgTm9uUmVndWxhckRlY2lzaW9uTWVzc2FnZSBnZXROb25SZWd1bGFyRGVjaXNpb25NZXNzYWdlKExpc3QgZXJyb3JzKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXJyb3JzLnNpemUoKTsgaSsrKSB7CisJCQlNZXNzYWdlIG0gPSAoTWVzc2FnZSkgZXJyb3JzLmdldChpKTsKKwkJCWlmICggbSBpbnN0YW5jZW9mIE5vblJlZ3VsYXJEZWNpc2lvbk1lc3NhZ2UgKSB7CisJCQkJcmV0dXJuIChOb25SZWd1bGFyRGVjaXNpb25NZXNzYWdlKW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIFJlY3Vyc2lvbk92ZXJmbG93TWVzc2FnZSBnZXRSZWN1cnNpb25PdmVyZmxvd01lc3NhZ2UoTGlzdCB3YXJuaW5ncykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHdhcm5pbmdzLnNpemUoKTsgaSsrKSB7CisJCQlNZXNzYWdlIG0gPSAoTWVzc2FnZSkgd2FybmluZ3MuZ2V0KGkpOworCQkJaWYgKCBtIGluc3RhbmNlb2YgUmVjdXJzaW9uT3ZlcmZsb3dNZXNzYWdlICkgeworCQkJCXJldHVybiAoUmVjdXJzaW9uT3ZlcmZsb3dNZXNzYWdlKW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlIGdldExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlKExpc3Qgd2FybmluZ3MpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB3YXJuaW5ncy5zaXplKCk7IGkrKykgeworCQkJTWVzc2FnZSBtID0gKE1lc3NhZ2UpIHdhcm5pbmdzLmdldChpKTsKKwkJCWlmICggbSBpbnN0YW5jZW9mIExlZnRSZWN1cnNpb25DeWNsZXNNZXNzYWdlICkgeworCQkJCXJldHVybiAoTGVmdFJlY3Vyc2lvbkN5Y2xlc01lc3NhZ2UpbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgR3JhbW1hckRhbmdsaW5nU3RhdGVNZXNzYWdlIGdldERhbmdsaW5nU3RhdGVNZXNzYWdlKExpc3Qgd2FybmluZ3MpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB3YXJuaW5ncy5zaXplKCk7IGkrKykgeworCQkJTWVzc2FnZSBtID0gKE1lc3NhZ2UpIHdhcm5pbmdzLmdldChpKTsKKwkJCWlmICggbSBpbnN0YW5jZW9mIEdyYW1tYXJEYW5nbGluZ1N0YXRlTWVzc2FnZSApIHsKKwkJCQlyZXR1cm4gKEdyYW1tYXJEYW5nbGluZ1N0YXRlTWVzc2FnZSltOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgc3RyKGludFtdIGVsZW1lbnRzKSB7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICggaT4wICkgeworCQkJCWJ1Zi5hcHBlbmQoIiwgIik7CisJCQl9CisJCQlpbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOworCQkJYnVmLmFwcGVuZChlbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHJvdGVjdGVkIFNldDxTdHJpbmc+IHJ1bGVOYW1lcyhTZXQ8UnVsZT4gcnVsZXMpIHsKKwkJU2V0PFN0cmluZz4geCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKwkJZm9yIChSdWxlIHIgOiBydWxlcykgeworCQkJeC5hZGQoci5uYW1lKTsKKwkJfQorCQlyZXR1cm4geDsKKwl9CisKKwlwcm90ZWN0ZWQgU2V0PFN0cmluZz4gcnVsZU5hbWVzMihDb2xsZWN0aW9uPEhhc2hTZXQ+IHJ1bGVzKSB7CisJCVNldDxTdHJpbmc+IHggPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCWZvciAoSGFzaFNldCBzIDogcnVsZXMpIHsKKwkJCXguYWRkQWxsKHJ1bGVOYW1lcyhzKSk7CisJCX0KKwkJcmV0dXJuIHg7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0REZBTWF0Y2hpbmcuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdERGQU1hdGNoaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmYjJmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdERGQU1hdGNoaW5nLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5ERkE7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLk5GQTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdERGQU1hdGNoaW5nIGV4dGVuZHMgQmFzZVRlc3QgeworCisgICAgLyoqIFB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQgYnkgVGVzdFJpZyAqLworICAgIHB1YmxpYyBUZXN0REZBTWF0Y2hpbmcoKSB7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZUFsdENoYXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgICAgICJBIDogezt9J2EnIHwgJ2InIHwgJ2MnOyIpOworCQlnLmJ1aWxkTkZBKCk7CisJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisgICAgICAgIERGQSBkZmEgPSBnLmdldExvb2thaGVhZERGQSgxKTsKKyAgICAgICAgY2hlY2tQcmVkaWN0aW9uKGRmYSwiYSIsMSk7CisgICAgICAgIGNoZWNrUHJlZGljdGlvbihkZmEsImIiLDIpOworICAgICAgICBjaGVja1ByZWRpY3Rpb24oZGZhLCJjIiwzKTsKKyAgICAgICAgY2hlY2tQcmVkaWN0aW9uKGRmYSwiZCIsIE5GQS5JTlZBTElEX0FMVF9OVU1CRVIpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgICAgICJBIDogezt9J2EnLi4neicgfCAnOycgfCAnMCcuLic5JyA7Iik7CisJCWcuYnVpbGRORkEoKTsKKyAgICAgICAgZy5jcmVhdGVMb29rYWhlYWRERkFzKGZhbHNlKTsKKyAgICAgICAgREZBIGRmYSA9IGcuZ2V0TG9va2FoZWFkREZBKDEpOworICAgICAgICBjaGVja1ByZWRpY3Rpb24oZGZhLCJhIiwxKTsKKyAgICAgICAgY2hlY2tQcmVkaWN0aW9uKGRmYSwicSIsMSk7CisgICAgICAgIGNoZWNrUHJlZGljdGlvbihkZmEsInoiLDEpOworICAgICAgICBjaGVja1ByZWRpY3Rpb24oZGZhLCI7IiwyKTsKKyAgICAgICAgY2hlY2tQcmVkaWN0aW9uKGRmYSwiOSIsMyk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbml0ZUNvbW1vbkxlZnRQcmVmaXhlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKyAgICAgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciB0O1xuIisKKyAgICAgICAgICAgICAgICAiQSA6ICdhJyAnYicgfCAnYScgJ2MnIHwgJ2QnICdlJyA7Iik7CisJCWcuYnVpbGRORkEoKTsKKyAgICAgICAgZy5jcmVhdGVMb29rYWhlYWRERkFzKGZhbHNlKTsKKyAgICAgICAgREZBIGRmYSA9IGcuZ2V0TG9va2FoZWFkREZBKDEpOworICAgICAgICBjaGVja1ByZWRpY3Rpb24oZGZhLCJhYiIsMSk7CisgICAgICAgIGNoZWNrUHJlZGljdGlvbihkZmEsImFjIiwyKTsKKyAgICAgICAgY2hlY2tQcmVkaWN0aW9uKGRmYSwiZGUiLDMpOworICAgICAgICBjaGVja1ByZWRpY3Rpb24oZGZhLCJxIiwgTkZBLklOVkFMSURfQUxUX05VTUJFUik7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZUxvb3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgICAgICJBIDogKERJR0lUKSsgJy4nIERJR0lUIHwgKERJR0lUKSsgO1xuIiArCisgICAgICAgICAgICAgICAgImZyYWdtZW50IERJR0lUIDogJzAnLi4nOScgO1xuIik7CisJCWcuYnVpbGRORkEoKTsKKyAgICAgICAgZy5jcmVhdGVMb29rYWhlYWRERkFzKGZhbHNlKTsKKyAgICAgICAgREZBIGRmYSA9IGcuZ2V0TG9va2FoZWFkREZBKDMpOworICAgICAgICBjaGVja1ByZWRpY3Rpb24oZGZhLCIzMiIsMik7CisgICAgICAgIGNoZWNrUHJlZGljdGlvbihkZmEsIjk5OS4yIiwxKTsKKyAgICAgICAgY2hlY2tQcmVkaWN0aW9uKGRmYSwiLjIiLCBORkEuSU5WQUxJRF9BTFRfTlVNQkVSKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1ByZWRpY3Rpb24oREZBIGRmYSwgU3RyaW5nIGlucHV0LCBpbnQgZXhwZWN0ZWQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEFOVExSU3RyaW5nU3RyZWFtIHN0cmVhbSA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbShpbnB1dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZmEucHJlZGljdChzdHJlYW0pLCBleHBlY3RlZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RGYXN0UXVldWUuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEZhc3RRdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2M3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RGYXN0UXVldWUuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUubWlzYy5GYXN0UXVldWU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFRlc3RGYXN0UXVldWUgeworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RRdWV1ZU5vUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZhc3RRdWV1ZTxTdHJpbmc+IHEgPSBuZXcgRmFzdFF1ZXVlPFN0cmluZz4oKTsKKyAgICAgICAgcS5hZGQoImEiKTsKKyAgICAgICAgcS5hZGQoImIiKTsKKyAgICAgICAgcS5hZGQoImMiKTsKKyAgICAgICAgcS5hZGQoImQiKTsKKyAgICAgICAgcS5hZGQoImUiKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJhIGIgYyBkIGUiOworICAgICAgICBTdHJpbmcgZm91bmQgPSBxLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UXVldWVUaGVuUmVtb3ZlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZhc3RRdWV1ZTxTdHJpbmc+IHEgPSBuZXcgRmFzdFF1ZXVlPFN0cmluZz4oKTsKKyAgICAgICAgcS5hZGQoImEiKTsKKyAgICAgICAgcS5hZGQoImIiKTsKKyAgICAgICAgcS5hZGQoImMiKTsKKyAgICAgICAgcS5hZGQoImQiKTsKKyAgICAgICAgcS5hZGQoImUiKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKCBxLnNpemUoKT4wICkgeworICAgICAgICAgICAgU3RyaW5nIG8gPSBxLnJlbW92ZSgpOworICAgICAgICAgICAgYnVmLmFwcGVuZChvKTsKKyAgICAgICAgICAgIGlmICggcS5zaXplKCk+MCApIGJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoInF1ZXVlIHNob3VsZCBiZSBlbXB0eSIsIDAsIHEuc2l6ZSgpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJhIGIgYyBkIGUiOworICAgICAgICBTdHJpbmcgZm91bmQgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RRdWV1ZVRoZW5SZW1vdmVPbmVCeU9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBGYXN0UXVldWU8U3RyaW5nPiBxID0gbmV3IEZhc3RRdWV1ZTxTdHJpbmc+KCk7CisgICAgICAgIHEuYWRkKCJhIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocS5yZW1vdmUoKSk7CisgICAgICAgIHEuYWRkKCJiIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocS5yZW1vdmUoKSk7CisgICAgICAgIHEuYWRkKCJjIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocS5yZW1vdmUoKSk7CisgICAgICAgIHEuYWRkKCJkIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocS5yZW1vdmUoKSk7CisgICAgICAgIHEuYWRkKCJlIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocS5yZW1vdmUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicXVldWUgc2hvdWxkIGJlIGVtcHR5IiwgMCwgcS5zaXplKCkpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gImFiY2RlIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKyAgICB9CisKKyAgICAvLyBFIHIgciBvIHIgcworCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEdldEZyb21FbXB0eVF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZhc3RRdWV1ZTxTdHJpbmc+IHEgPSBuZXcgRmFzdFF1ZXVlPFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIHRyeSB7IHEucmVtb3ZlKCk7IH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbnNlZSkgeworICAgICAgICAgICAgbXNnID0gbnNlZS5nZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJxdWV1ZSBpbmRleCAwID4gbGFzdCBpbmRleCAtMSI7CisgICAgICAgIFN0cmluZyBmb3VuZCA9IG1zZzsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHZXRGcm9tRW1wdHlRdWV1ZUFmdGVyU29tZUFkZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmFzdFF1ZXVlPFN0cmluZz4gcSA9IG5ldyBGYXN0UXVldWU8U3RyaW5nPigpOworICAgICAgICBxLmFkZCgiYSIpOworICAgICAgICBxLmFkZCgiYiIpOworICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICBxLnJlbW92ZSgpOworICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgdHJ5IHsgcS5yZW1vdmUoKTsgfQorICAgICAgICBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuc2VlKSB7CisgICAgICAgICAgICBtc2cgPSBuc2VlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gInF1ZXVlIGluZGV4IDAgPiBsYXN0IGluZGV4IC0xIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gbXNnOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEdldEZyb21FbXB0eVF1ZXVlQWZ0ZXJDbGVhcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGYXN0UXVldWU8U3RyaW5nPiBxID0gbmV3IEZhc3RRdWV1ZTxTdHJpbmc+KCk7CisgICAgICAgIHEuYWRkKCJhIik7CisgICAgICAgIHEuYWRkKCJiIik7CisgICAgICAgIHEuY2xlYXIoKTsKKyAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7CisgICAgICAgIHRyeSB7IHEucmVtb3ZlKCk7IH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbnNlZSkgeworICAgICAgICAgICAgbXNnID0gbnNlZS5nZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJxdWV1ZSBpbmRleCAwID4gbGFzdCBpbmRleCAtMSI7CisgICAgICAgIFN0cmluZyBmb3VuZCA9IG1zZzsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEhldGVyb0FTVC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0SGV0ZXJvQVNULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ODQyMQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEhldGVyb0FTVC5qYXZhCkBAIC0wLDAgKzEsNTQ0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqIFRlc3QgaGV0ZXJvIHRyZWVzIGluIHBhcnNlcnMgYW5kIHRyZWUgcGFyc2VycyAqLworcHVibGljIGNsYXNzIFRlc3RIZXRlcm9BU1QgZXh0ZW5kcyBCYXNlVGVzdCB7CisJcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworCS8vIFBBUlNFUlMgLS0gQVVUTyBBU1QKKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJAbWVtYmVycyB7c3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFYoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxWPlwiO31cbiIgKworICAgICAgICAgICAgIn1cbiIgKworICAgICAgICAgICAgIn1cbiIrCisgICAgICAgICAgICAiYSA6IElEPFY+IDtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKyAgICAgICAgICAgICAgICAgICAgImEiLCAiYSIsIGRlYnVnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPFY+XG4iLCBmb3VuZCk7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuQ29tbW9uVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQ8Q29tbW9uVHJlZT4gO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFcbiIsIGZvdW5kKTsKKwl9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5XaXRoUXVhbGlmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJAbWVtYmVycyB7c3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFYoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxWPlwiO31cbiIgKworICAgICAgICAgICAgIn1cbiIgKworICAgICAgICAgICAgIn1cbiIrCisgICAgICAgICAgICAiYSA6IElEPFRQYXJzZXIuVj4gO1xuIisgLy8gVFBhcnNlci5WIGlzIHF1YWxpZmllZCBuYW1lCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKyAgICAgICAgICAgICAgICAgICAgImEiLCAiYSIsIGRlYnVnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhPFY+XG4iLCBmb3VuZCk7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5hbWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJAbWVtYmVycyB7c3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworCQkJIiAgcHVibGljIFYoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKworCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxWPlwiO31cbiIgKworCQkJIn1cbiIgKworCQkJIn1cbiIrCisJCQkiYSA6IElEPG5vZGU9Vj4gO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImE8Vj5cbiIsIGZvdW5kKTsKKwl9CisKKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbldpdGhMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJAbWVtYmVycyB7c3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworCQkJIiAgcHVibGljIFYoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKworCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxWPlwiO31cbiIgKworCQkJIn1cbiIgKworCQkJIn1cbiIrCisJCQkiYSA6IHg9SUQ8Vj4gO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImE8Vj5cbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5XaXRoTGlzdExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJIkBtZW1iZXJzIHtzdGF0aWMgY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVihUb2tlbiB0KSB7IHRva2VuPXQ7fVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpK1wiPFY+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogeCs9SUQ8Vj4gO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImE8Vj5cbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5Sb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJIkBtZW1iZXJzIHtzdGF0aWMgY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVihUb2tlbiB0KSB7IHRva2VuPXQ7fVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpK1wiPFY+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQ8Vj5eIDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhPFY+XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuUm9vdFdpdGhMaXN0TGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiQG1lbWJlcnMge3N0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKFRva2VuIHQpIHsgdG9rZW49dDt9XG4iICsKKwkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vj5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJ9XG4iKworCQkJImEgOiB4Kz1JRDxWPl4gO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImE8Vj5cbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJIkBtZW1iZXJzIHtzdGF0aWMgY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVihUb2tlbiB0KSB7IHRva2VuPXQ7fVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpK1wiPFY+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogJ2JlZ2luJzxWPiA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImJlZ2luIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImJlZ2luPFY+XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN0cmluZ1Jvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiQG1lbWJlcnMge3N0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKFRva2VuIHQpIHsgdG9rZW49dDt9XG4iICsKKwkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vj5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJ9XG4iKworCQkJImEgOiAnYmVnaW4nPFY+XiA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImJlZ2luIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImJlZ2luPFY+XG4iLCBmb3VuZCk7CisJfQorCisJLy8gUEFSU0VSUyAtLSBSRVdSSVRFIEFTVAorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVUb2tlbigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJAbWVtYmVycyB7c3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworCQkJIiAgcHVibGljIFYoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKworCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxWPlwiO31cbiIgKworCQkJIn1cbiIgKworCQkJIn1cbiIrCisJCQkiYSA6IElEIC0+IElEPFY+IDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhPFY+XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVUb2tlbldpdGhBcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFyZyB0byBJRDxWPls0MiwxOSwzMF0gbWVhbnMgeW91J3JlIGNvbnN0cnVjdGluZyBub2RlIG5vdCBhc3NvY2lhdGVkIHdpdGggSUQKKwkJLy8gc28gbXVzdCBwYXNzIGluIHRva2VuIG1hbnVhbGx5CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJIkBtZW1iZXJzIHtcbiIgKworCQkJInN0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBpbnQgeCx5LHo7XG4iKworCQkJIiAgcHVibGljIFYoaW50IHR0eXBlLCBpbnQgeCwgaW50IHksIGludCB6KSB7IHRoaXMueD14OyB0aGlzLnk9eTsgdGhpcy56PXo7IHRva2VuPW5ldyBDb21tb25Ub2tlbih0dHlwZSxcIlwiKTsgfVxuIiArCisJCQkiICBwdWJsaWMgVihpbnQgdHR5cGUsIFRva2VuIHQsIGludCB4KSB7IHRva2VuPXQ7IHRoaXMueD14O31cbiIgKworCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICh0b2tlbiE9bnVsbD90b2tlbi5nZXRUZXh0KCk6XCJcIikrXCI8Vj47XCIreCt5K3o7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQgLT4gSUQ8Vj5bNDIsMTksMzBdIElEPFY+WyRJRCw5OV0gO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIjxWPjs0MjE5MzAgYTxWPjs5OTAwXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVUb2tlblJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiQG1lbWJlcnMge3N0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKFRva2VuIHQpIHsgdG9rZW49dDt9XG4iICsKKwkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vj5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJ9XG4iKworCQkJImEgOiBJRCBJTlQgLT4gXihJRDxWPiBJTlQpIDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEgMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoYTxWPiAyKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJIkBtZW1iZXJzIHtzdGF0aWMgY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVihUb2tlbiB0KSB7IHRva2VuPXQ7fVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpK1wiPFY+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogJ2JlZ2luJyAtPiAnYmVnaW4nPFY+IDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYmVnaW4iLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYmVnaW48Vj5cbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZVN0cmluZ1Jvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiQG1lbWJlcnMge3N0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKFRva2VuIHQpIHsgdG9rZW49dDt9XG4iICsKKwkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vj5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJ9XG4iKworCQkJImEgOiAnYmVnaW4nIElOVCAtPiBeKCdiZWdpbic8Vj4gSU5UKSA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJiZWdpbiAyIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihiZWdpbjxWPiAyKVxuIiwgZm91bmQpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlUnVsZVJlc3VsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAidG9rZW5zIHtMSVNUO31cbiIgKworICAgICAgICAgICAgIkBtZW1iZXJzIHtcbiIgKworICAgICAgICAgICAgInN0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKyAgICAgICAgICAgICIgIHB1YmxpYyBWKFRva2VuIHQpIHsgdG9rZW49dDt9XG4iICsKKyAgICAgICAgICAgICIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vj5cIjt9XG4iICsKKyAgICAgICAgICAgICJ9XG4iICsKKyAgICAgICAgICAgICJzdGF0aWMgY2xhc3MgVyBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisgICAgICAgICAgICAiICBwdWJsaWMgVyhpbnQgdG9rZW5UeXBlLCBTdHJpbmcgdHh0KSB7IHN1cGVyKG5ldyBDb21tb25Ub2tlbih0b2tlblR5cGUsdHh0KSk7IH1cbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFcoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxXPlwiO31cbiIgKworICAgICAgICAgICAgIn1cbiIgKworICAgICAgICAgICAgIn1cbiIrCisgICAgICAgICAgICAiYSA6IGlkICgnLCcgaWQpKiAtPiBeKExJU1Q8Vz5bXCJMSVNUXCJdIGlkKyk7XG4iICsKKyAgICAgICAgICAgICJpZCA6IElEIC0+IElEPFY+O1xuIisKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorICAgICAgICAgICAgICAgICAgICAiYSIsICJhLGIsYyIsIGRlYnVnKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoTElTVDxXPiBhPFY+IGI8Vj4gYzxWPilcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29weVNlbWFudGljc1dpdGhIZXRlcm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiQG1lbWJlcnMge1xuIiArCisgICAgICAgICAgICAic3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworICAgICAgICAgICAgIiAgcHVibGljIFYoVG9rZW4gdCkgeyB0b2tlbj10O31cbiIgKyAgLy8gZm9yICdpbnQnPFY+CisgICAgICAgICAgICAiICBwdWJsaWMgVihWIG5vZGUpIHsgc3VwZXIobm9kZSk7IH1cblxuIiArIC8vIGZvciBkdXBOb2RlCisgICAgICAgICAgICAiICBwdWJsaWMgVHJlZSBkdXBOb2RlKCkgeyByZXR1cm4gbmV3IFYodGhpcyk7IH1cbiIgKyAvLyBmb3IgZHVwJ2luZyB0eXBlCisgICAgICAgICAgICAiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpK1wiPFY+XCI7fVxuIiArCisgICAgICAgICAgICAifVxuIiArCisgICAgICAgICAgICAifVxuIiArCisgICAgICAgICAgICAiYSA6IHR5cGUgSUQgKCcsJyBJRCkqICc7JyAtPiBeKHR5cGUgSUQpKztcbiIgKworICAgICAgICAgICAgInR5cGUgOiAnaW50JzxWPiA7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorICAgICAgICAgICAgICAgICAgICAiYSIsICJpbnQgYSwgYiwgYzsiLCBkZWJ1Zyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKGludDxWPiBhKSAoaW50PFY+IGIpIChpbnQ8Vj4gYylcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICAvLyBUUkVFIFBBUlNFUlMgLS0gUkVXUklURSBBU1QKKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUcmVlUGFyc2VyUmV3cml0ZUZsYXRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQ7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJIkBtZW1iZXJzIHtcbiIgKworCQkJInN0YXRpYyBjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKE9iamVjdCB0KSB7IHN1cGVyKChDb21tb25UcmVlKXQpOyB9XG4iICsKKwkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vj5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJzdGF0aWMgY2xhc3MgVyBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVyhPYmplY3QgdCkgeyBzdXBlcigoQ29tbW9uVHJlZSl0KTsgfVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW4uZ2V0VGV4dCgpK1wiPFc+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQgSU5UIC0+IElOVDxWPiBJRDxXPlxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIjM0PFY+IGFiYzxXPlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUcmVlUGFyc2VyUmV3cml0ZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiQG1lbWJlcnMge1xuIiArCisJCQkic3RhdGljIGNsYXNzIFYgZXh0ZW5kcyBDb21tb25UcmVlIHtcbiIgKworCQkJIiAgcHVibGljIFYoT2JqZWN0IHQpIHsgc3VwZXIoKENvbW1vblRyZWUpdCk7IH1cbiIgKworCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuLmdldFRleHQoKStcIjxWPlwiO31cbiIgKworCQkJIn1cbiIgKworCQkJInN0YXRpYyBjbGFzcyBXIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBXKE9iamVjdCB0KSB7IHN1cGVyKChDb21tb25UcmVlKXQpOyB9XG4iICsKKwkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0b2tlbi5nZXRUZXh0KCkrXCI8Vz5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJ9XG4iKworCQkJImEgOiBJRCBJTlQgLT4gXihJTlQ8Vj4gSUQ8Vz4pXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCSAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiKDM0PFY+IGFiYzxXPilcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkidG9rZW5zIHsgUk9PVDsgfVxuIiArCisJCQkiQG1lbWJlcnMge1xuIiArCisJCQkiY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVihpbnQgdG9rZW5UeXBlKSB7IHN1cGVyKG5ldyBDb21tb25Ub2tlbih0b2tlblR5cGUpKTsgfVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW5OYW1lc1t0b2tlbi5nZXRUeXBlKCldK1wiPFY+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQgLT4gUk9PVDxWPiBJRFxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyIpOworCQlhc3NlcnRFcXVhbHMoIlJPT1Q8Vj4gYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRyZWVQYXJzZXJSZXdyaXRlSW1hZ2luYXJ5V2l0aEFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkidG9rZW5zIHsgUk9PVDsgfVxuIiArCisJCQkiQG1lbWJlcnMge1xuIiArCisJCQkiY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgaW50IHg7XG4iICsKKwkJCSIgIHB1YmxpYyBWKGludCB0b2tlblR5cGUsIGludCB4KSB7IHN1cGVyKG5ldyBDb21tb25Ub2tlbih0b2tlblR5cGUpKTsgdGhpcy54PXg7fVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW5OYW1lc1t0b2tlbi5nZXRUeXBlKCldK1wiPFY+O1wiK3g7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQgLT4gUk9PVDxWPls0Ml0gSURcbiIgKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhYmMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJST09UPFY+OzQyIGFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUcmVlUGFyc2VyUmV3cml0ZUltYWdpbmFyeVJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkidG9rZW5zIHsgUk9PVDsgfVxuIiArCisJCQkiQG1lbWJlcnMge1xuIiArCisJCQkiY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUge1xuIiArCisJCQkiICBwdWJsaWMgVihpbnQgdG9rZW5UeXBlKSB7IHN1cGVyKG5ldyBDb21tb25Ub2tlbih0b2tlblR5cGUpKTsgfVxuIiArCisJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdG9rZW5OYW1lc1t0b2tlbi5nZXRUeXBlKCldK1wiPFY+XCI7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQgLT4gXihST09UPFY+IElEKVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyIpOworCQlhc3NlcnRFcXVhbHMoIihST09UPFY+IGFiYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VHJlZVBhcnNlclJld3JpdGVJbWFnaW5hcnlGcm9tUmVhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJ0b2tlbnMgeyBST09UOyB9XG4iICsKKwkJCSJAbWVtYmVycyB7XG4iICsKKwkJCSJjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKGludCB0b2tlblR5cGUpIHsgc3VwZXIobmV3IENvbW1vblRva2VuKHRva2VuVHlwZSkpOyB9XG4iICsKKwkJCSIgIHB1YmxpYyBWKGludCB0b2tlblR5cGUsIE9iamVjdCB0cmVlKSB7IHN1cGVyKChDb21tb25UcmVlKXRyZWUpOyB0b2tlbi5zZXRUeXBlKHRva2VuVHlwZSk7IH1cbiIgKworCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHRva2VuTmFtZXNbdG9rZW4uZ2V0VHlwZSgpXStcIjxWPkBcIit0b2tlbi5nZXRMaW5lKCk7fVxuIiArCisJCQkifVxuIiArCisJCQkifVxuIisKKwkJCSJhIDogSUQgLT4gUk9PVDxWPlskSURdXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCSAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIik7CisJCWFzc2VydEVxdWFscygiUk9PVDxWPkAxXG4iLCBmb3VuZCk7IC8vIGF0IGxpbmUgMTsgc2hvd3MgY29weSBvZiBJRCdzIHN0dWZmCisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRyZWVQYXJzZXJBdXRvSGV0ZXJvQVNUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCAnOycgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJ0b2tlbnMgeyBST09UOyB9XG4iICsKKwkJCSJAbWVtYmVycyB7XG4iICsKKwkJCSJjbGFzcyBWIGV4dGVuZHMgQ29tbW9uVHJlZSB7XG4iICsKKwkJCSIgIHB1YmxpYyBWKENvbW1vblRyZWUgdCkgeyBzdXBlcih0KTsgfVxuIiArIC8vIE5FRURTIFNQRUNJQUwgQ1RPUgorCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkrXCI8Vj5cIjt9XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJ9XG4iKworCQkJImEgOiBJRDxWPiAnOyc8Vj5cbiIgKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhYmM7Iik7CisJCWFzc2VydEVxdWFscygiYWJjPFY+IDs8Vj5cbiIsIGZvdW5kKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEludGVycHJldGVkTGV4aW5nLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RJbnRlcnByZXRlZExleGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGUxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RJbnRlcnByZXRlZExleGluZy5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuSW50ZXJwcmV0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0SW50ZXJwcmV0ZWRMZXhpbmcgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKwkvKgorCXN0YXRpYyBjbGFzcyBUcmFjZXIgaW1wbGVtZW50cyBBTlRMUkRlYnVnSW50ZXJmYWNlIHsKKwkJR3JhbW1hciBnOworCQlwdWJsaWMgRGVidWdBY3Rpb25zKEdyYW1tYXIgZykgeworCQkJdGhpcy5nID0gZzsKKwkJfQorCQlwdWJsaWMgdm9pZCBlbnRlclJ1bGUoU3RyaW5nIHJ1bGVOYW1lKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImVudGVyUnVsZSgiK3J1bGVOYW1lKyIpIik7CisJCX0KKworCQlwdWJsaWMgdm9pZCBleGl0UnVsZShTdHJpbmcgcnVsZU5hbWUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFJ1bGUoIitydWxlTmFtZSsiKSIpOworCQl9CisKKwkJcHVibGljIHZvaWQgbWF0Y2hFbGVtZW50KGludCB0eXBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoRWxlbWVudCgiK2cuZ2V0VG9rZW5OYW1lKHR5cGUpKyIpIik7CisJCX0KKworCQlwdWJsaWMgdm9pZCBtaXNtYXRjaGVkRWxlbWVudChNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOworCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBtaXNtYXRjaGVkU2V0KE1pc21hdGNoZWRTZXRFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOworCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBub1ZpYWJsZUFsdChOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKwkJfQorCX0KKyAgICAqLworCisgICAgLyoqIFB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQgYnkgVGVzdFJpZyAqLworICAgIHB1YmxpYyBUZXN0SW50ZXJwcmV0ZWRMZXhpbmcoKSB7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZUFsdENoYXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgICAgICJBIDogJ2EnIHwgJ2InIHwgJ2MnOyIpOworCQlmaW5hbCBpbnQgQXR5cGUgPSBnLmdldFRva2VuVHlwZSgiQSIpOworICAgICAgICBJbnRlcnByZXRlciBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhIikpOworICAgICAgICBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJiIikpOworCQlUb2tlbiByZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgQXR5cGUpOworICAgICAgICBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJjIikpOworCQlyZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgQXR5cGUpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVSdWxlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgICAgICJsZXhlciBncmFtbWFyIHQ7XG4iKworICAgICAgICAgICAgICAgICJBIDogJ2EnIEIgJ2MnIDtcbiIgKworICAgICAgICAgICAgICAgICJCIDogJ2InIDtcbiIpOworCQlmaW5hbCBpbnQgQXR5cGUgPSBnLmdldFRva2VuVHlwZSgiQSIpOworCQlJbnRlcnByZXRlciBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmMiKSk7IC8vIHNob3VsZCBpZ25vcmUgdGhlIHgKKwkJVG9rZW4gcmVzdWx0ID0gZW5naW5lLnNjYW4oIkEiKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUeXBlKCksIEF0eXBlKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTG9vcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKyAgICAgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciB0O1xuIisKKyAgICAgICAgICAgICAgICAiSU5UIDogKERJR0lUKSsgO1xuIisKKwkJCQkiZnJhZ21lbnQgRElHSVQgOiAnMCcuLic5JztcbiIpOworCQlmaW5hbCBpbnQgSU5UdHlwZSA9IGcuZ2V0VG9rZW5UeXBlKCJJTlQiKTsKKwkJSW50ZXJwcmV0ZXIgZW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiMTJ4IikpOyAvLyBzaG91bGQgaWdub3JlIHRoZSB4CisJCVRva2VuIHJlc3VsdCA9IGVuZ2luZS5zY2FuKCJJTlQiKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUeXBlKCksIElOVHR5cGUpOworCQllbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCIxMjM0IikpOworCQlyZXN1bHQgPSBlbmdpbmUuc2NhbigiSU5UIik7CisJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VHlwZSgpLCBJTlR0eXBlKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TXVsdEFsdExvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisgICAgICAgICAgICAgICAgImxleGVyIGdyYW1tYXIgdDtcbiIrCisgICAgICAgICAgICAgICAgIkEgOiAoJzAnLi4nOSd8J2EnfCdiJykrIDtcbiIpOworCQlmaW5hbCBpbnQgQXR5cGUgPSBnLmdldFRva2VuVHlwZSgiQSIpOworCQlJbnRlcnByZXRlciBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhIikpOworCQlUb2tlbiByZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworICAgICAgICBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhIikpOworCQlyZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgQXR5cGUpOworCQllbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCIxMjM0IikpOworCQlyZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgQXR5cGUpOworICAgICAgICBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYWEiKSk7CisJCXJlc3VsdCA9IGVuZ2luZS5zY2FuKCJBIik7CisJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VHlwZSgpLCBBdHlwZSk7CisgICAgICAgIGVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFhYWE5IikpOworCQlyZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgQXR5cGUpOworICAgICAgICBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJiIikpOworCQlyZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgQXR5cGUpOworICAgICAgICBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJiYWEiKSk7CisJCXJlc3VsdCA9IGVuZ2luZS5zY2FuKCJBIik7CisJCWFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VHlwZSgpLCBBdHlwZSk7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZUxvb3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJCSJBIDogKCcwJy4uJzknKSsgJy4nICgnMCcuLic5JykqIHwgKCcwJy4uJzknKSsgO1xuIik7CisJCWZpbmFsIGludCBBdHlwZSA9IGcuZ2V0VG9rZW5UeXBlKCJBIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oIjEyMzQuNSIpOworCQlJbnRlcnByZXRlciBlbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlbiByZXN1bHQgPSBlbmdpbmUuc2NhbigiQSIpOworCQlhc3NlcnRFcXVhbHMoQXR5cGUsIHJlc3VsdC5nZXRUeXBlKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbnNSdWxlcygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIHBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgcDtcbiIrCisJCQkiYSA6IChJTlR8RkxPQVR8V1MpKztcbiIpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigpOworCQlnLmltcG9ydFRva2VuVm9jYWJ1bGFyeShwZyk7CisJCWcuc2V0RmlsZU5hbWUoIjxzdHJpbmc+Iik7CisJCWcuc2V0R3JhbW1hckNvbnRlbnQoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJJTlQgOiAoRElHSVQpKyA7XG4iKworCQkJIkZMT0FUIDogKERJR0lUKSsgJy4nIChESUdJVCkqIDtcbiIrCisJCQkiZnJhZ21lbnQgRElHSVQgOiAnMCcuLic5JztcbiIgKworCQkJIldTIDogKCcgJykrIHtjaGFubmVsPTk5O307XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiMTIzIDEzOS41MiIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCisJCUNvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbShsZXhFbmdpbmUpOworICAgICAgICB0b2tlbnMuTFQoNSk7IC8vIG1ha2Ugc3VyZSBpdCBncmFicyBhbGwgdG9rZW5zCisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIxMjMgMTM5LjUyIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEludGVycHJldGVkUGFyc2luZy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0SW50ZXJwcmV0ZWRQYXJzaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3NTEzOQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdEludGVycHJldGVkUGFyc2luZy5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuUGFyc2VUcmVlOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuSW50ZXJwcmV0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0SW50ZXJwcmV0ZWRQYXJzaW5nIGV4dGVuZHMgQmFzZVRlc3QgeworICAgIC8qKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkIGJ5IFRlc3RSaWcgKi8KKyAgICBwdWJsaWMgVGVzdEludGVycHJldGVkUGFyc2luZygpIHsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhbW1hciBwZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgInBhcnNlciBncmFtbWFyIHA7XG4iKworICAgICAgICAgICAgInByb2cgOiBXSElMRSBJRCBMQ1VSTFkgKGFzc2lnbikqIFJDVVJMWSBFT0Y7XG4iICsKKyAgICAgICAgICAgICJhc3NpZ24gOiBJRCBBU1NJR04gZXhwciBTRU1JIDtcbiIgKworCQkJImV4cHIgOiBJTlQgfCBGTE9BVCB8IElEIDtcbiIpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigpOworCQlnLmltcG9ydFRva2VuVm9jYWJ1bGFyeShwZyk7CisJCWcuc2V0RmlsZU5hbWUoR3JhbW1hci5JR05PUkVfU1RSSU5HX0lOX0dSQU1NQVJfRklMRV9OQU1FICsic3RyaW5nIik7CisJCWcuc2V0R3JhbW1hckNvbnRlbnQoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJXSElMRSA6ICd3aGlsZSc7XG4iKworCQkJIkxDVVJMWSA6ICd7JztcbiIrCisJCQkiUkNVUkxZIDogJ30nO1xuIisKKwkJCSJBU1NJR04gOiAnPSc7XG4iKworCQkJIlNFTUkgOiAnOyc7XG4iKworCQkJIklEIDogKCdhJy4uJ3onKSsgO1xuIisKKwkJCSJJTlQgOiAoRElHSVQpKyA7XG4iKworCQkJIkZMT0FUIDogKERJR0lUKSsgJy4nIChESUdJVCkqIDtcbiIrCisJCQkiZnJhZ21lbnQgRElHSVQgOiAnMCcuLic5JztcbiIgKworCQkJIldTIDogKCcgJykrIDtcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJ3aGlsZSB4IHsgaT0xOyB5PTMuNDI7IHo9eTsgfSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCisJCUZpbHRlcmluZ1Rva2VuU3RyZWFtIHRva2VucyA9IG5ldyBGaWx0ZXJpbmdUb2tlblN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuc2V0VG9rZW5UeXBlQ2hhbm5lbChnLmdldFRva2VuVHlwZSgiV1MiKSwgOTkpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidG9rZW5zPSIrdG9rZW5zLnRvU3RyaW5nKCkpOworCQlJbnRlcnByZXRlciBwYXJzZUVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihwZywgdG9rZW5zKTsKKwkJUGFyc2VUcmVlIHQgPSBwYXJzZUVuZ2luZS5wYXJzZSgicHJvZyIpOworCQlTdHJpbmcgcmVzdWx0ID0gdC50b1N0cmluZ1RyZWUoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKDxncmFtbWFyIHA+IChwcm9nIHdoaWxlIHggeyAoYXNzaWduIGkgPSAoZXhwciAxKSA7KSAoYXNzaWduIHkgPSAoZXhwciAzLjQyKSA7KSAoYXNzaWduIHogPSAoZXhwciB5KSA7KSB9IDxFT0Y+KSkiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNtYXRjaGVkVG9rZW5FcnJvcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIHBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgcDtcbiIrCisJCQkicHJvZyA6IFdISUxFIElEIExDVVJMWSAoYXNzaWduKSogUkNVUkxZO1xuIiArCisJCQkiYXNzaWduIDogSUQgQVNTSUdOIGV4cHIgU0VNSSA7XG4iICsKKwkJCSJleHByIDogSU5UIHwgRkxPQVQgfCBJRCA7XG4iKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoKTsKKwkJZy5zZXRGaWxlTmFtZShHcmFtbWFyLklHTk9SRV9TVFJJTkdfSU5fR1JBTU1BUl9GSUxFX05BTUUgKyJzdHJpbmciKTsKKwkJZy5pbXBvcnRUb2tlblZvY2FidWxhcnkocGcpOworCQlnLnNldEdyYW1tYXJDb250ZW50KAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiV0hJTEUgOiAnd2hpbGUnO1xuIisKKwkJCSJMQ1VSTFkgOiAneyc7XG4iKworCQkJIlJDVVJMWSA6ICd9JztcbiIrCisJCQkiQVNTSUdOIDogJz0nO1xuIisKKwkJCSJTRU1JIDogJzsnO1xuIisKKwkJCSJJRCA6ICgnYScuLid6JykrIDtcbiIrCisJCQkiSU5UIDogKERJR0lUKSsgO1xuIisKKwkJCSJGTE9BVCA6IChESUdJVCkrICcuJyAoRElHSVQpKiA7XG4iKworCQkJImZyYWdtZW50IERJR0lUIDogJzAnLi4nOSc7XG4iICsKKwkJCSJXUyA6ICgnICcpKyA7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgid2hpbGUgeCB7IGk9MSB5PTMuNDI7IHo9eTsgfSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCisJCUZpbHRlcmluZ1Rva2VuU3RyZWFtIHRva2VucyA9IG5ldyBGaWx0ZXJpbmdUb2tlblN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuc2V0VG9rZW5UeXBlQ2hhbm5lbChnLmdldFRva2VuVHlwZSgiV1MiKSwgOTkpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidG9rZW5zPSIrdG9rZW5zLnRvU3RyaW5nKCkpOworCQlJbnRlcnByZXRlciBwYXJzZUVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihwZywgdG9rZW5zKTsKKwkJUGFyc2VUcmVlIHQgPSBwYXJzZUVuZ2luZS5wYXJzZSgicHJvZyIpOworCQlTdHJpbmcgcmVzdWx0ID0gdC50b1N0cmluZ1RyZWUoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiKDxncmFtbWFyIHA+IChwcm9nIHdoaWxlIHggeyAoYXNzaWduIGkgPSAoZXhwciAxKSBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oNiE9MTApKSkpIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWlzbWF0Y2hlZFNldEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgcGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBwO1xuIisKKwkJCSJwcm9nIDogV0hJTEUgSUQgTENVUkxZIChhc3NpZ24pKiBSQ1VSTFk7XG4iICsKKwkJCSJhc3NpZ24gOiBJRCBBU1NJR04gZXhwciBTRU1JIDtcbiIgKworCQkJImV4cHIgOiBJTlQgfCBGTE9BVCB8IElEIDtcbiIpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigpOworCQlnLmltcG9ydFRva2VuVm9jYWJ1bGFyeShwZyk7CisJCWcuc2V0RmlsZU5hbWUoIjxzdHJpbmc+Iik7CisJCWcuc2V0R3JhbW1hckNvbnRlbnQoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJXSElMRSA6ICd3aGlsZSc7XG4iKworCQkJIkxDVVJMWSA6ICd7JztcbiIrCisJCQkiUkNVUkxZIDogJ30nO1xuIisKKwkJCSJBU1NJR04gOiAnPSc7XG4iKworCQkJIlNFTUkgOiAnOyc7XG4iKworCQkJIklEIDogKCdhJy4uJ3onKSsgO1xuIisKKwkJCSJJTlQgOiAoRElHSVQpKyA7XG4iKworCQkJIkZMT0FUIDogKERJR0lUKSsgJy4nIChESUdJVCkqIDtcbiIrCisJCQkiZnJhZ21lbnQgRElHSVQgOiAnMCcuLic5JztcbiIgKworCQkJIldTIDogKCcgJykrIDtcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJ3aGlsZSB4IHsgaT07IHk9My40Mjsgej15OyB9Iik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisKKwkJRmlsdGVyaW5nVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IEZpbHRlcmluZ1Rva2VuU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5zZXRUb2tlblR5cGVDaGFubmVsKGcuZ2V0VG9rZW5UeXBlKCJXUyIpLCA5OSk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbnM9Iit0b2tlbnMudG9TdHJpbmcoKSk7CisJCUludGVycHJldGVyIHBhcnNlRW5naW5lID0gbmV3IEludGVycHJldGVyKHBnLCB0b2tlbnMpOworCQlQYXJzZVRyZWUgdCA9IHBhcnNlRW5naW5lLnBhcnNlKCJwcm9nIik7CisJCVN0cmluZyByZXN1bHQgPSB0LnRvU3RyaW5nVHJlZSgpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIoPGdyYW1tYXIgcD4gKHByb2cgd2hpbGUgeCB7IChhc3NpZ24gaSA9IChleHByIE1pc21hdGNoZWRTZXRFeGNlcHRpb24oMTAhPXs1LDYsN30pKSkpKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vVmlhYmxlQWx0RXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBwZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHA7XG4iKworCQkJInByb2cgOiBXSElMRSBJRCBMQ1VSTFkgKGFzc2lnbikqIFJDVVJMWTtcbiIgKworCQkJImFzc2lnbiA6IElEIEFTU0lHTiBleHByIFNFTUkgO1xuIiArCisJCQkiZXhwciA6IHs7fUlOVCB8IEZMT0FUIHwgSUQgO1xuIik7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKCk7CisJCWcuaW1wb3J0VG9rZW5Wb2NhYnVsYXJ5KHBnKTsKKwkJZy5zZXRGaWxlTmFtZSgiPHN0cmluZz4iKTsKKwkJZy5zZXRHcmFtbWFyQ29udGVudCgKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIldISUxFIDogJ3doaWxlJztcbiIrCisJCQkiTENVUkxZIDogJ3snO1xuIisKKwkJCSJSQ1VSTFkgOiAnfSc7XG4iKworCQkJIkFTU0lHTiA6ICc9JztcbiIrCisJCQkiU0VNSSA6ICc7JztcbiIrCisJCQkiSUQgOiAoJ2EnLi4neicpKyA7XG4iKworCQkJIklOVCA6IChESUdJVCkrIDtcbiIrCisJCQkiRkxPQVQgOiAoRElHSVQpKyAnLicgKERJR0lUKSogO1xuIisKKwkJCSJmcmFnbWVudCBESUdJVCA6ICcwJy4uJzknO1xuIiArCisJCQkiV1MgOiAoJyAnKSsgO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oIndoaWxlIHggeyBpPTsgeT0zLjQyOyB6PXk7IH0iKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKworCQlGaWx0ZXJpbmdUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgRmlsdGVyaW5nVG9rZW5TdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLnNldFRva2VuVHlwZUNoYW5uZWwoZy5nZXRUb2tlblR5cGUoIldTIiksIDk5KTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInRva2Vucz0iK3Rva2Vucy50b1N0cmluZygpKTsKKwkJSW50ZXJwcmV0ZXIgcGFyc2VFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIocGcsIHRva2Vucyk7CisJCVBhcnNlVHJlZSB0ID0gcGFyc2VFbmdpbmUucGFyc2UoInByb2ciKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHQudG9TdHJpbmdUcmVlKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIig8Z3JhbW1hciBwPiAocHJvZyB3aGlsZSB4IHsgKGFzc2lnbiBpID0gKGV4cHIgTm9WaWFibGVBbHRFeGNlcHRpb24oMTBAWzQ6MTogZXhwciA6ICggSU5UIHwgRkxPQVQgfCBJRCApO10pKSkpKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RJbnRlcnZhbFNldC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0SW50ZXJ2YWxTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNjMzdmCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0SW50ZXJ2YWxTZXQuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5taXNjLkludGVydmFsU2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCitwdWJsaWMgY2xhc3MgVGVzdEludGVydmFsU2V0IGV4dGVuZHMgQmFzZVRlc3QgeworCisgICAgLyoqIFB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQgYnkgVGVzdFJpZyAqLworICAgIHB1YmxpYyBUZXN0SW50ZXJ2YWxTZXQoKSB7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDk5KTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICI5OSI7CisgICAgICAgIGFzc2VydEVxdWFscyhzLnRvU3RyaW5nKCksIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdElzb2xhdGVkRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IG5ldyBJbnRlcnZhbFNldCgpOworICAgICAgICBzLmFkZCgxKTsKKyAgICAgICAgcy5hZGQoJ3onKTsKKyAgICAgICAgcy5hZGQoJ1x1RkZGMCcpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gInsxLCAxMjIsIDY1NTIwfSI7CisgICAgICAgIGFzc2VydEVxdWFscyhzLnRvU3RyaW5nKCksIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdE1peGVkUmFuZ2VzQW5kRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IG5ldyBJbnRlcnZhbFNldCgpOworICAgICAgICBzLmFkZCgxKTsKKyAgICAgICAgcy5hZGQoJ2EnLCd6Jyk7CisgICAgICAgIHMuYWRkKCcwJywnOScpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gInsxLCA0OC4uNTcsIDk3Li4xMjJ9IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMudG9TdHJpbmcoKSwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVydmFsU2V0IHMgPSBJbnRlcnZhbFNldC5vZigxMCwyMCk7CisgICAgICAgIEludGVydmFsU2V0IHMyID0gSW50ZXJ2YWxTZXQub2YoMTMsMTUpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIjEzLi4xNSI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAocy5hbmQoczIpKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSYW5nZUFuZElzb2xhdGVkRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoJ2EnLCd6Jyk7CisgICAgICAgIEludGVydmFsU2V0IHMyID0gSW50ZXJ2YWxTZXQub2YoJ2QnKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICIxMDAiOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKHMuYW5kKHMyKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbnRlcnNlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKCdhJywneicpOworCQlJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKCcwJywnOScpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInt9IjsKKwkJU3RyaW5nIHJlc3VsdCA9IChzLmFuZChzMikpLnRvU3RyaW5nKCk7CisJCWFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEVtcHR5SW50ZXJzZWN0aW9uU2luZ2xlRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKCdhJyk7CisJCUludGVydmFsU2V0IHMyID0gSW50ZXJ2YWxTZXQub2YoJ2QnKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ7fSI7CisJCVN0cmluZyByZXN1bHQgPSAocy5hbmQoczIpKS50b1N0cmluZygpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVydmFsU2V0IHZvY2FidWxhcnkgPSBJbnRlcnZhbFNldC5vZigxLDEwMDApOworICAgICAgICB2b2NhYnVsYXJ5LmFkZCgyMDAwLDMwMDApOworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoNTAsNTApOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gInsxLi40OSwgNTEuLjEwMDAsIDIwMDAuLjMwMDB9IjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChzLmNvbXBsZW1lbnQodm9jYWJ1bGFyeSkpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdFNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlcnZhbFNldCB2b2NhYnVsYXJ5ID0gSW50ZXJ2YWxTZXQub2YoMSwxMDAwKTsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDUwLDYwKTsKKwkJcy5hZGQoNSk7CisJCXMuYWRkKDI1MCwzMDApOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInsxLi40LCA2Li40OSwgNjEuLjI0OSwgMzAxLi4xMDAwfSI7CisJCVN0cmluZyByZXN1bHQgPSAocy5jb21wbGVtZW50KHZvY2FidWxhcnkpKS50b1N0cmluZygpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RFcXVhbFNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlcnZhbFNldCB2b2NhYnVsYXJ5ID0gSW50ZXJ2YWxTZXQub2YoMSwxMDAwKTsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEsMTAwMCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAie30iOworCQlTdHJpbmcgcmVzdWx0ID0gKHMuY29tcGxlbWVudCh2b2NhYnVsYXJ5KSkudG9TdHJpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2V0RWRnZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW50ZXJ2YWxTZXQgdm9jYWJ1bGFyeSA9IEludGVydmFsU2V0Lm9mKDEsMik7CisJCUludGVydmFsU2V0IHMgPSBJbnRlcnZhbFNldC5vZigxKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIyIjsKKwkJU3RyaW5nIHJlc3VsdCA9IChzLmNvbXBsZW1lbnQodm9jYWJ1bGFyeSkpLnRvU3RyaW5nKCk7CisJCWFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisJfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdFNldEZyYWdtZW50ZWRWb2NhYnVsYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVydmFsU2V0IHZvY2FidWxhcnkgPSBJbnRlcnZhbFNldC5vZigxLDI1NSk7CisgICAgICAgIHZvY2FidWxhcnkuYWRkKDEwMDAsMjAwMCk7CisgICAgICAgIHZvY2FidWxhcnkuYWRkKDk5OTkpOworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoNTAsNjApOworICAgICAgICBzLmFkZCgzKTsKKyAgICAgICAgcy5hZGQoMjUwLDMwMCk7CisgICAgICAgIHMuYWRkKDEwMDAwKTsgLy8gdGhpcyBpcyBvdXRzaWRlIHJhbmdlIG9mIHZvY2FiIGFuZCBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gInsxLi4yLCA0Li40OSwgNjEuLjI0OSwgMTAwMC4uMjAwMCwgOTk5OX0iOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKHMuY29tcGxlbWVudCh2b2NhYnVsYXJ5KSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3RPZkNvbXBsZXRlbHlDb250YWluZWRSYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMTAsMjApOworICAgICAgICBJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDEyLDE1KTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJ7MTAuLjExLCAxNi4uMjB9IjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChzLnN1YnRyYWN0KHMyKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3RPZk92ZXJsYXBwaW5nUmFuZ2VGcm9tTGVmdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMTAsMjApOworICAgICAgICBJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDUsMTEpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIjEyLi4yMCI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAocy5zdWJ0cmFjdChzMikpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisKKyAgICAgICAgSW50ZXJ2YWxTZXQgczMgPSBJbnRlcnZhbFNldC5vZig1LDEwKTsKKyAgICAgICAgZXhwZWN0aW5nID0gIjExLi4yMCI7CisgICAgICAgIHJlc3VsdCA9IChzLnN1YnRyYWN0KHMzKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3RPZk92ZXJsYXBwaW5nUmFuZ2VGcm9tUmlnaHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgSW50ZXJ2YWxTZXQgczIgPSBJbnRlcnZhbFNldC5vZigxNSwyNSk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiMTAuLjE0IjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChzLnN1YnRyYWN0KHMyKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKworICAgICAgICBJbnRlcnZhbFNldCBzMyA9IEludGVydmFsU2V0Lm9mKDIwLDI1KTsKKyAgICAgICAgZXhwZWN0aW5nID0gIjEwLi4xOSI7CisgICAgICAgIHJlc3VsdCA9IChzLnN1YnRyYWN0KHMzKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3RPZkNvbXBsZXRlbHlDb3ZlcmVkUmFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgSW50ZXJ2YWxTZXQgczIgPSBJbnRlcnZhbFNldC5vZigxLDI1KTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJ7fSI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAocy5zdWJ0cmFjdChzMikpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFN1YnRyYWN0T2ZSYW5nZVNwYW5uaW5nTXVsdGlwbGVSYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgcy5hZGQoMzAsNDApOworICAgICAgICBzLmFkZCg1MCw2MCk7IC8vIHMgaGFzIDMgcmFuZ2VzIG5vdzogMTAuLjIwLCAzMC4uNDAsIDUwLi42MAorICAgICAgICBJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDUsNTUpOyAvLyBjb3ZlcnMgb25lIGFuZCB0b3VjaGVzIDJuZCByYW5nZQorICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIjU2Li42MCI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAocy5zdWJ0cmFjdChzMikpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisKKyAgICAgICAgSW50ZXJ2YWxTZXQgczMgPSBJbnRlcnZhbFNldC5vZigxNSw1NSk7IC8vIHRvdWNoZXMgYm90aAorICAgICAgICBleHBlY3RpbmcgPSAiezEwLi4xNCwgNTYuLjYwfSI7CisgICAgICAgIHJlc3VsdCA9IChzLnN1YnRyYWN0KHMzKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKwkvKiogVGhlIGZvbGxvd2luZyB3YXMgYnJva2VuOgorCSAJezAuLjExMywgMTE1Li42NTUzNH0tezAuLjExNSwgMTE3Li42NTUzNH09MTE2Li42NTUzNAorCSAqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdE9mV2Fja3lSYW5nZSgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMCwxMTMpOworCQlzLmFkZCgxMTUsMjAwKTsKKwkJSW50ZXJ2YWxTZXQgczIgPSBJbnRlcnZhbFNldC5vZigwLDExNSk7CisJCXMyLmFkZCgxMTcsMjAwKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIxMTYiOworCQlTdHJpbmcgcmVzdWx0ID0gKHMuc3VidHJhY3QoczIpKS50b1N0cmluZygpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgSW50ZXJ2YWxTZXQgczIgPSBJbnRlcnZhbFNldC5vZigxMCwyMCk7CisgICAgICAgIEJvb2xlYW4gZXhwZWN0aW5nID0gbmV3IEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIEJvb2xlYW4gcmVzdWx0ID0gbmV3IEJvb2xlYW4ocy5lcXVhbHMoczIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKworICAgICAgICBJbnRlcnZhbFNldCBzMyA9IEludGVydmFsU2V0Lm9mKDE1LDU1KTsKKyAgICAgICAgZXhwZWN0aW5nID0gbmV3IEJvb2xlYW4oZmFsc2UpOworICAgICAgICByZXN1bHQgPSBuZXcgQm9vbGVhbihzLmVxdWFscyhzMykpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgcy5hZGQoMik7CisgICAgICAgIHMuYWRkKDQ5OSw1MDEpOworICAgICAgICBJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgczIuYWRkKDIpOworICAgICAgICBzMi5hZGQoNDk5LDUwMSk7CisgICAgICAgIEJvb2xlYW4gZXhwZWN0aW5nID0gbmV3IEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIEJvb2xlYW4gcmVzdWx0ID0gbmV3IEJvb2xlYW4ocy5lcXVhbHMoczIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKworICAgICAgICBJbnRlcnZhbFNldCBzMyA9IEludGVydmFsU2V0Lm9mKDEwLDIwKTsKKyAgICAgICAgczMuYWRkKDIpOworICAgICAgICBleHBlY3RpbmcgPSBuZXcgQm9vbGVhbihmYWxzZSk7CisgICAgICAgIHJlc3VsdCA9IG5ldyBCb29sZWFuKHMuZXF1YWxzKHMzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRNaW51c0Rpc2pvaW50U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVydmFsU2V0IHMgPSBJbnRlcnZhbFNldC5vZigxNSwxNSk7CisgICAgICAgIEludGVydmFsU2V0IHMyID0gSW50ZXJ2YWxTZXQub2YoMSw1KTsKKyAgICAgICAgczIuYWRkKDEwLDIwKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJ7fSI7IC8vIDE1IC0gezEuLjUsIDEwLi4yMH0gPSB7fQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcy5zdWJ0cmFjdChzMikudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWVtYmVyc2hpcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMTUsMTUpOworICAgICAgICBzLmFkZCg1MCw2MCk7CisgICAgICAgIGFzc2VydFRydWUoIXMubWVtYmVyKDApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcy5tZW1iZXIoMjApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcy5tZW1iZXIoMTAwKSk7CisgICAgICAgIGFzc2VydFRydWUocy5tZW1iZXIoMTUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLm1lbWJlcig1NSkpOworICAgICAgICBhc3NlcnRUcnVlKHMubWVtYmVyKDUwKSk7CisgICAgICAgIGFzc2VydFRydWUocy5tZW1iZXIoNjApKTsKKyAgICB9CisKKyAgICAvLyB7MiwxNSwxOH0gJiAxMC4uMjAKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJzZWN0aW9uV2l0aFR3b0NvbnRhaW5lZEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVydmFsU2V0IHMgPSBJbnRlcnZhbFNldC5vZigxMCwyMCk7CisgICAgICAgIEludGVydmFsU2V0IHMyID0gSW50ZXJ2YWxTZXQub2YoMiwyKTsKKyAgICAgICAgczIuYWRkKDE1KTsKKyAgICAgICAgczIuYWRkKDE4KTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJ7MTUsIDE4fSI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAocy5hbmQoczIpKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbnRlcnNlY3Rpb25XaXRoVHdvQ29udGFpbmVkRWxlbWVudHNSZXZlcnNlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMTAsMjApOworICAgICAgICBJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDIsMik7CisgICAgICAgIHMyLmFkZCgxNSk7CisgICAgICAgIHMyLmFkZCgxOCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiezE1LCAxOH0iOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKHMyLmFuZChzKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMTAwLDEwMCk7CisgICAgICAgIHMuYWRkKDEwMSwxMDEpOworICAgICAgICBJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDEwMCwxMDIpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIjEwMiI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAocy5jb21wbGVtZW50KHMyKSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxlbWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEwMCwxMDEpOworCQlJbnRlcnZhbFNldCBzMiA9IEludGVydmFsU2V0Lm9mKDEwMCwxMDIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIjEwMiI7CisJCVN0cmluZyByZXN1bHQgPSAocy5jb21wbGVtZW50KHMyKSkudG9TdHJpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxlbWVudDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDEsOTYpOworCQlzLmFkZCg5OSxMYWJlbC5NQVhfQ0hBUl9WQUxVRSk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiOTcuLjk4IjsKKwkJU3RyaW5nIHJlc3VsdCA9IChzLmNvbXBsZW1lbnQoMSxMYWJlbC5NQVhfQ0hBUl9WQUxVRSkpLnRvU3RyaW5nKCk7CisJCWFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisJfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdE1lcmdlT2ZSYW5nZXNBbmRTaW5nbGVWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gezAuLjQxLCA0MiwgNDMuLjY1NTM0fQorICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMCw0MSk7CisgICAgICAgIHMuYWRkKDQyKTsKKyAgICAgICAgcy5hZGQoNDMsNjU1MzQpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIjAuLjY1NTM0IjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VPZlJhbmdlc0FuZFNpbmdsZVZhbHVlc1JldmVyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDQzLDY1NTM0KTsKKyAgICAgICAgcy5hZGQoNDIpOworICAgICAgICBzLmFkZCgwLDQxKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICIwLi42NTUzNCI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdE1lcmdlV2hlcmVBZGRpdGlvbk1lcmdlc1R3b0V4aXN0aW5nSW50ZXJ2YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIDQyLCAxMCwgezAuLjksIDExLi40MSwgNDMuLjY1NTM0fQorICAgICAgICBJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoNDIpOworICAgICAgICBzLmFkZCgxMCk7CisgICAgICAgIHMuYWRkKDAsOSk7CisgICAgICAgIHMuYWRkKDQzLDY1NTM0KTsKKyAgICAgICAgcy5hZGQoMTEsNDEpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIjAuLjY1NTM0IjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKyAgICB9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoRG91YmxlT3ZlcmxhcCgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMSwxMCk7CisJCXMuYWRkKDIwLDMwKTsKKwkJcy5hZGQoNSwyNSk7IC8vIG92ZXJsYXBzIHR3byEKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIxLi4zMCI7CisJCVN0cmluZyByZXN1bHQgPSBzLnRvU3RyaW5nKCk7CisJCWFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW50ZXJ2YWxTZXQgcyA9IEludGVydmFsU2V0Lm9mKDIwLDMwKTsKKwkJcy5hZGQoNTAsNTUpOworCQlzLmFkZCg1LDE5KTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIzMiI7CisJCVN0cmluZyByZXN1bHQgPSBTdHJpbmcudmFsdWVPZihzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRvTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMjAsMjUpOworCQlzLmFkZCg1MCw1NSk7CisJCXMuYWRkKDUsNSk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiWzUsIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTVdIjsKKwkJTGlzdCBmb28gPSBuZXcgQXJyYXlMaXN0KCk7CisJCVN0cmluZyByZXN1bHQgPSBTdHJpbmcudmFsdWVPZihzLnRvTGlzdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0aW5nKTsKKwl9CisKKwkvKiogVGhlIGZvbGxvd2luZyB3YXMgYnJva2VuOgorCSAgICB7J1x1MDAwMCcuLidzJywgJ3UnLi4nXHVGRkZFJ30gJiB7J1x1MDAwMCcuLidxJywgJ3MnLi4nXHVGRkZFJ309CisJICAgIHsnXHUwMDAwJy4uJ3EnLCAncyd9ISEhISBicm9rZW4uLi4KKwkgCSdxJyBpcyAxMTMgYXNjaWkKKwkgCSd1JyBpcyAxMTcKKwkqLworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RSSW50ZXJzZWN0aW9uTm90VCgpIHRocm93cyBFeGNlcHRpb24geworCQlJbnRlcnZhbFNldCBzID0gSW50ZXJ2YWxTZXQub2YoMCwncycpOworCQlzLmFkZCgndScsMjAwKTsKKwkJSW50ZXJ2YWxTZXQgczIgPSBJbnRlcnZhbFNldC5vZigwLCdxJyk7CisJCXMyLmFkZCgncycsMjAwKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ7MC4uMTEzLCAxMTUsIDExNy4uMjAwfSI7CisJCVN0cmluZyByZXN1bHQgPSAocy5hbmQoczIpKS50b1N0cmluZygpOworCQlhc3NlcnRFcXVhbHMocmVzdWx0LCBleHBlY3RpbmcpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0SmF2YUNvZGVHZW5lcmF0aW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RKYXZhQ29kZUdlbmVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThhNmQwCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0SmF2YUNvZGVHZW5lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKiogR2VuZXJhbCBjb2RlIGdlbmVyYXRpb24gdGVzdGluZzsgY29tcGlsYXRpb24gYW5kL29yIGV4ZWN1dGlvbi4KKyAqICBUaGVzZSB0ZXN0cyBhcmUgbW9yZSBhYm91dCBhdm9pZGluZyBkdXBsaWNhdGUgdmFyIGRlZmluaXRpb25zCisgKiAgZXRjLi4uIHRoYW4gdGVzdGluZyBhIHBhcnRpY3VsYXIgQU5UTFIgZmVhdHVyZS4KKyAqLworcHVibGljIGNsYXNzIFRlc3RKYXZhQ29kZUdlbmVyYXRpb24gZXh0ZW5kcyBCYXNlVGVzdCB7CisJQFRlc3QgcHVibGljIHZvaWQgdGVzdER1cFZhckRlZkZvclBpbmNoZWRTdGF0ZSgpIHsKKwkJLy8gc28tPnMyIGFuZCBzMC0+czMtPnMxIHBpbmNoZXMgYmFjayB0byBzMQorCQkvLyBMQTNfMSwgczEgc3RhdGUgZm9yIERGQSAzLCB3YXMgZGVmaW5lZCB0d2ljZSBpbiBzaW1pbGFyIHNjb3BlCisJCS8vIGp1c3Qgd3JhcHBlZCBpbiBjdXJsaWVzIGFuZCBpdCdzIGNvb2wuCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogKHwgQSB8IEIpIFggWVxuIiArCisJCQkiICB8ICh8IEEgfCBCKSBYIFpcbiIgKworCQkJIiAgO1xuIiA7CisJCWJvb2xlYW4gZm91bmQgPQorCQkJcmF3R2VuZXJhdGVBbmRCdWlsZFJlY29nbml6ZXIoCisJCQkJIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgbnVsbCwgZmFsc2UpOworCQlib29sZWFuIGV4cGVjdGluZyA9IHRydWU7IC8vIHNob3VsZCBiZSBvaworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhYmVsZWROb3RTZXRzSW5MZXhlcigpIHsKKwkJLy8gZCBtdXN0IGJlIGFuIGludAorCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkibGV4ZXIgZ3JhbW1hciBUO1xuIiArCisJCQkiQSA6IGQ9figneCd8J3knKSBlPScwJy4uJzknXG4iICsKKwkJCSIgIDsgXG4iIDsKKwkJYm9vbGVhbiBmb3VuZCA9CisJCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcigKKwkJCQkiVC5nIiwgZ3JhbW1hciwgbnVsbCwgIlQiLCBmYWxzZSk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZFNldHNJbkxleGVyKCkgeworCQkvLyBkIG11c3QgYmUgYW4gaW50CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogQSA7XG4iICsKKwkJCSJBIDogZD0oJ3gnfCd5Jykge1N5c3RlbS5vdXQucHJpbnRsbigoY2hhcikkZCk7fVxuIiArCisJCQkiICA7IFxuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAieCIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhYmVsZWRSYW5nZUluTGV4ZXIoKSB7CisJCS8vIGQgbXVzdCBiZSBhbiBpbnQKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiBBO1xuIiArCisJCQkiQSA6IGQ9J2EnLi4neicge1N5c3RlbS5vdXQucHJpbnRsbigoY2hhcikkZCk7fSBcbiIgKworCQkJIiAgOyBcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIngiLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygieFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkV2lsZGNhcmRJbkxleGVyKCkgeworCQkvLyBkIG11c3QgYmUgYW4gaW50CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogQTtcbiIgKworCQkJIkEgOiBkPS4ge1N5c3RlbS5vdXQucHJpbnRsbigoY2hhcikkZCk7fVxuIiArCisJCQkiICA7IFxuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAieCIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5bnByZWRXaXRoUGx1c0xvb3AoKSB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7IFxuIiArCisJCQkiYSA6ICgoJ3gnKyk9PiAneCcrKT87XG4iOworCQlib29sZWFuIGZvdW5kID0KKwkJCXJhd0dlbmVyYXRlQW5kQnVpbGRSZWNvZ25pemVyKAorCQkJCSJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLCBmYWxzZSk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVFc2NhcGUoKSB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJsZXhlciBncmFtbWFyIFQ7IFxuIiArCisJCQkiQSA6ICdcXFxcXCInO1xuIiArICAgICAgICAgIC8vIHRoaXMgaXMgQSA6ICdcXCInLCB3aGljaCBzaG91bGQgZ2l2ZSAiXFxcIiIgYXQgSmF2YSBsZXZlbDsKKyAgICAgICAgICAgICJCIDogJ1xcXCInO1xuIiArICAgICAgICAgICAgLy8gdGhpcyBpcyBCOiAnXCInLCB3aGljaCBzaG9kbCBnaXZlICJcIiIgYXQgSmF2YSBsZXZlbDsKKyAgICAgICAgICAgICJDIDogJ1xcJ1xcJyc7XG4iICsgICAgICAgICAgLy8gdGhpcyBpcyBDOiAnXCdcJycsIHdoaWNoIHNob3VkbCBnaXZlICInJyIgYXQgSmF2YSBsZXZlbAorICAgICAgICAgICAgIkQgOiAnXFxrJztcbiI7ICAgICAgICAgICAgICAvLyB0aGlzIGlzIEQ6ICdcaycsIHdoaWNoIHNob3VkbCBnaXZlIGp1c3QgImsiIGF0IEphdmEgbGV2ZWw7CisKKwkJYm9vbGVhbiBmb3VuZCA9CisJCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcigKKwkJCQkiVC5nIiwgZ3JhbW1hciwgbnVsbCwgIlQiLCBmYWxzZSk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QmxhbmtSdWxlR2V0c05vRXhjZXB0aW9uKCkgeworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IHN5bmMgKElEIHN5bmMpKiA7XG4iICsKKwkJCSJzeW5jIDogO1xuIiArCisJCQkiSUQgOiAnYScuLid6Jys7XG4iOworCQlib29sZWFuIGZvdW5kID0KKwkJCXJhd0dlbmVyYXRlQW5kQnVpbGRSZWNvZ25pemVyKAorCQkJCSJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLCBmYWxzZSk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RMZWZ0UmVjdXJzaW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RMZWZ0UmVjdXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxYjY2YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdExlZnRSZWN1cnNpb24uamF2YQpAQCAtMCwwICsxLDM4MiBAQAorcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKiogKi8KK3B1YmxpYyBjbGFzcyBUZXN0TGVmdFJlY3Vyc2lvbiBleHRlbmRzIEJhc2VUZXN0IHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkicyA6IGEge1N5c3RlbS5vdXQucHJpbnRsbigkYS50ZXh0KTt9IDtcbiIgKworCQkJImEgOiBhIElEXG4iICsKKwkJCSIgIHwgSUQiICsKKwkJCSIgIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgInMiLCAiYSBiIGMiLCBkZWJ1Zyk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYWJjXG4iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNlbVByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJInMgOiBhIHtTeXN0ZW0ub3V0LnByaW50bG4oJGEudGV4dCk7fSA7XG4iICsKKwkJCSJhIDogYSB7dHJ1ZX0/IElEXG4iICsKKwkJCSIgIHwgSUQiICsKKwkJCSIgIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgInMiLCAiYSBiIGMiLCBkZWJ1Zyk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYWJjXG4iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRlcm5hcnlFeHByKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImUgOiBlICcqJ14gZSIgKworCQkJIiAgfCBlICcrJ14gZSIgKworCQkJIiAgfCBlICc/Jzxhc3NvYz1yaWdodD5eIGUgJzonISBlIiArCisJCQkiICB8IGUgJz0nPGFzc29jPXJpZ2h0Pl4gZSIgKworCQkJIiAgfCBJRCIgKworCQkJIiAgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIjsKKwkJU3RyaW5nW10gdGVzdHMgPSB7CisJCQkiYSIsCQkJImEiLAorCQkJImErYiIsCQkJIigrIGEgYikiLAorCQkJImEqYiIsCQkJIigqIGEgYikiLAorCQkJImE/YjpjIiwJCSIoPyBhIGIgYykiLAorCQkJImE9Yj1jIiwJCSIoPSBhICg9IGIgYykpIiwKKwkJCSJhP2IrYzpkIiwJCSIoPyBhICgrIGIgYykgZCkiLAorCQkJImE/Yj1jOmQiLAkJIig/IGEgKD0gYiBjKSBkKSIsCisJCQkiYT8gYj9jOmQgOiBlIiwJIig/IGEgKD8gYiBjIGQpIGUpIiwKKwkJCSJhP2I6IGM/ZDplIiwJIig/IGEgYiAoPyBjIGQgZSkpIiwKKwkJfTsKKwkJcnVuVGVzdHMoZ3JhbW1hciwgdGVzdHMsICJlIik7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlY2xhcmF0aW9uc1VzaW5nQVNUT3BlcmF0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImRlY2xhcmF0b3JcbiIgKworCQkJIiAgICAgICAgOiBkZWNsYXJhdG9yICdbJ14gZSAnXSchXG4iICsKKwkJCSIgICAgICAgIHwgZGVjbGFyYXRvciAnWydeICddJyFcbiIgKworCQkJIiAgICAgICAgfCBkZWNsYXJhdG9yICcoJ14gJyknIVxuIiArCisJCQkiICAgICAgICB8ICcqJ14gZGVjbGFyYXRvclxuIiArIC8vIGJpbmRzIGxlc3MgdGlnaHQgdGhhbiBzdWZmaXhlcworCQkJIiAgICAgICAgfCAnKCchIGRlY2xhcmF0b3IgJyknIVxuIiArCisJCQkiICAgICAgICB8IElEXG4iICsKKwkJCSIgICAgICAgIDtcbiIgKworCQkJImUgOiBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiI7CisJCVN0cmluZ1tdIHRlc3RzID0geworCQkJImEiLAkJImEiLAorCQkJIiphIiwJCSIoKiBhKSIsCisJCQkiKiphIiwJCSIoKiAoKiBhKSkiLAorCQkJImFbM10iLAkJIihbIGEgMykiLAorCQkJImJbXSIsCQkiKFsgYikiLAorCQkJIihhKSIsCQkiYSIsCisJCQkiYVtdKCkiLAkiKCggKFsgYSkpIiwKKwkJCSJhW11bXSIsCSIoWyAoWyBhKSkiLAorCQkJIiphW10iLAkJIigqIChbIGEpKSIsCisJCQkiKCphKVtdIiwJIihbICgqIGEpKSIsCisJCX07CisJCXJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZGVjbGFyYXRvciIpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbnNVc2luZ1Jld3JpdGVPcGVyYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiZGVjbGFyYXRvclxuIiArCisJCQkiICAgICAgICA6IGRlY2xhcmF0b3IgJ1snIGUgJ10nIC0+IF4oJ1snIGRlY2xhcmF0b3IgZSlcbiIgKworCQkJIiAgICAgICAgfCBkZWNsYXJhdG9yICdbJyAnXScgLT4gXignWycgZGVjbGFyYXRvcilcbiIgKworCQkJIiAgICAgICAgfCBkZWNsYXJhdG9yICcoJyAnKScgLT4gXignKCcgZGVjbGFyYXRvcilcbiIgKworCQkJIiAgICAgICAgfCAnKicgZGVjbGFyYXRvciAtPiBeKCcqJyBkZWNsYXJhdG9yKSBcbiIgKyAvLyBiaW5kcyBsZXNzIHRpZ2h0IHRoYW4gc3VmZml4ZXMKKwkJCSIgICAgICAgIHwgJygnIGRlY2xhcmF0b3IgJyknIC0+IGRlY2xhcmF0b3JcbiIgKworCQkJIiAgICAgICAgfCBJRCAtPiBJRFxuIiArCisJCQkiICAgICAgICA7XG4iICsKKwkJCSJlIDogSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHtza2lwKCk7fSA7XG4iOworCQlTdHJpbmdbXSB0ZXN0cyA9IHsKKwkJCSJhIiwJCSJhIiwKKwkJCSIqYSIsCQkiKCogYSkiLAorCQkJIioqYSIsCQkiKCogKCogYSkpIiwKKwkJCSJhWzNdIiwJCSIoWyBhIDMpIiwKKwkJCSJiW10iLAkJIihbIGIpIiwKKwkJCSIoYSkiLAkJImEiLAorCQkJImFbXSgpIiwJIigoIChbIGEpKSIsCisJCQkiYVtdW10iLAkiKFsgKFsgYSkpIiwKKwkJCSIqYVtdIiwJCSIoKiAoWyBhKSkiLAorCQkJIigqYSlbXSIsCSIoWyAoKiBhKSkiLAorCQl9OworCQlydW5UZXN0cyhncmFtbWFyLCB0ZXN0cywgImRlY2xhcmF0b3IiKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RXhwcmVzc2lvbnNVc2luZ0FTVE9wZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJlIDogZSAnLideIElEXG4iICsKKwkJCSIgIHwgZSAnLideICd0aGlzJ1xuIiArCisJCQkiICB8ICctJ14gZVxuIiArCisJCQkiICB8IGUgJyonXiBlXG4iICsKKwkJCSIgIHwgZSAoJysnXnwnLSdeKSBlXG4iICsKKwkJCSIgIHwgSU5UXG4iICsKKwkJCSIgIHwgSURcbiIgKworCQkJIiAgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiI7CisJCVN0cmluZ1tdIHRlc3RzID0geworCQkJImEiLAkJImEiLAorCQkJIjEiLAkJIjEiLAorCQkJImErMSIsCQkiKCsgYSAxKSIsCisJCQkiYSoxIiwJCSIoKiBhIDEpIiwKKwkJCSJhLmIiLAkJIiguIGEgYikiLAorCQkJImEudGhpcyIsCSIoLiBhIHRoaXMpIiwKKwkJCSJhLWIrYyIsCSIoKyAoLSBhIGIpIGMpIiwKKwkJCSJhK2IqYyIsCSIoKyBhICgqIGIgYykpIiwKKwkJCSJhLmIrMSIsCSIoKyAoLiBhIGIpIDEpIiwKKwkJCSItYSIsCQkiKC0gYSkiLAorCQkJIi1hK2IiLAkJIigrICgtIGEpIGIpIiwKKwkJCSItYS5iIiwJCSIoLSAoLiBhIGIpKSIsCisJCX07CisJCXJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZSIpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uc1VzaW5nUmV3cml0ZU9wZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJlIDogZSAnLicgSUQgCQkJCS0+IF4oJy4nIGUgSUQpXG4iICsKKwkJCSIgIHwgZSAnLicgJ3RoaXMnIAkJCS0+IF4oJy4nIGUgJ3RoaXMnKVxuIiArCisJCQkiICB8ICctJyBlIAkJCQkJLT4gXignLScgZSlcbiIgKworCQkJIiAgfCBlICcqJyBiPWUgCQkJCS0+IF4oJyonIGUgJGIpXG4iICsKKwkJCSIgIHwgZSAob3A9JysnfG9wPSctJykgYj1lCS0+IF4oJG9wIGUgJGIpXG4iICsKKwkJCSIgIHwgSU5UIAkJCQkJLT4gSU5UXG4iICsKKwkJCSIgIHwgSUQgCQkJCQktPiBJRFxuIiArCisJCQkiICA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIjsKKwkJU3RyaW5nW10gdGVzdHMgPSB7CisJCQkiYSIsCQkiYSIsCisJCQkiMSIsCQkiMSIsCisJCQkiYSsxIiwJCSIoKyBhIDEpIiwKKwkJCSJhKjEiLAkJIigqIGEgMSkiLAorCQkJImEuYiIsCQkiKC4gYSBiKSIsCisJCQkiYS50aGlzIiwJIiguIGEgdGhpcykiLAorCQkJImErYipjIiwJIigrIGEgKCogYiBjKSkiLAorCQkJImEuYisxIiwJIigrICguIGEgYikgMSkiLAorCQkJIi1hIiwJCSIoLSBhKSIsCisJCQkiLWErYiIsCQkiKCsgKC0gYSkgYikiLAorCQkJIi1hLmIiLAkJIigtICguIGEgYikpIiwKKwkJfTsKKwkJcnVuVGVzdHMoZ3JhbW1hciwgdGVzdHMsICJlIik7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25Bc3NvY2lhdGl2aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImVcbiIgKworCQkJIiAgOiBlICcuJ14gSURcbiIgKworCQkJIiAgfCAnLSdeIGVcbiIgKworCQkJIiAgfCBlICdeJzxhc3NvYz1yaWdodD5eIGVcbiIgKworCQkJIiAgfCBlICcqJ14gZVxuIiArCisJCQkiICB8IGUgKCcrJ158Jy0nXikgZVxuIiArCisJCQkiICB8IGUgKCc9Jzxhc3NvYz1yaWdodD5eIHwnKz0nPGFzc29jPXJpZ2h0Pl4pIGVcbiIgKworCQkJIiAgfCBJTlRcbiIgKworCQkJIiAgfCBJRFxuIiArCisJCQkiICA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIjsKKwkJU3RyaW5nW10gdGVzdHMgPSB7CisJCQkiYSIsCQkiYSIsCisJCQkiMSIsCQkiMSIsCisJCQkiYSsxIiwJCSIoKyBhIDEpIiwKKwkJCSJhKjEiLAkJIigqIGEgMSkiLAorCQkJImEuYiIsCQkiKC4gYSBiKSIsCisJCQkiYS1iK2MiLAkiKCsgKC0gYSBiKSBjKSIsCisKKwkJCSJhK2IqYyIsCSIoKyBhICgqIGIgYykpIiwKKwkJCSJhLmIrMSIsCSIoKyAoLiBhIGIpIDEpIiwKKwkJCSItYSIsCQkiKC0gYSkiLAorCQkJIi1hK2IiLAkJIigrICgtIGEpIGIpIiwKKwkJCSItYS5iIiwJCSIoLSAoLiBhIGIpKSIsCisJCQkiYV5iXmMiLAkiKF4gYSAoXiBiIGMpKSIsCisJCQkiYT1iPWMiLAkiKD0gYSAoPSBiIGMpKSIsCisJCQkiYT1iPWMrZC5lIiwiKD0gYSAoPSBiICgrIGMgKC4gZCBlKSkpKSIsCisJCX07CisJCXJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAiZSIpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RKYXZhRXhwcmVzc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gR2VuZXJhdGVzIGFib3V0IDdrIGluIGJ5dGVjb2RlcyBmb3IgZ2VuZXJhdGVkIGVfIHJ1bGU7CisJCS8vIFdlbGwgd2l0aGluIHRoZSA2NGsgbWV0aG9kIGxpbWl0LiBlX3ByaW1hcnkgY29tcGlsZXMKKwkJLy8gdG8gYWJvdXQgMmsgaW4gYnl0ZWNvZGVzLgorCQkvLyB0aGlzIGlzIHNpbXBsaWZpZWQgZnJvbSByZWFsIGphdmEKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiZXhwcmVzc2lvbkxpc3RcbiIgKworCQkJIiAgICA6ICAgZSAoJywnISBlKSpcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJlICAgOiAgICcoJyEgZSAnKSchXG4iICsKKwkJCSIgICAgfCAgICd0aGlzJyBcbiIgKworCQkJIiAgICB8ICAgJ3N1cGVyJ1xuIiArCisJCQkiICAgIHwgICBJTlRcbiIgKworCQkJIiAgICB8ICAgSURcbiIgKworCQkJIiAgICB8ICAgdHlwZSAnLideICdjbGFzcydcbiIgKworCQkJIiAgICB8ICAgZSAnLideIElEXG4iICsKKwkJCSIgICAgfCAgIGUgJy4nXiAndGhpcydcbiIgKworCQkJIiAgICB8ICAgZSAnLideICdzdXBlcicgJygnXiBleHByZXNzaW9uTGlzdD8gJyknIVxuIiArCisJCQkiICAgIHwgICBlICcuJ14gJ25ldydeIElEICcoJyEgZXhwcmVzc2lvbkxpc3Q/ICcpJyFcbiIgKworCQkJIgkgfAkgJ25ldydeIHR5cGUgKCAnKCcgZXhwcmVzc2lvbkxpc3Q/ICcpJyEgfCAob3B0aW9ucyB7az0xO306J1snIGUgJ10nISkrKVxuIiArIC8vIHVnbHk7IHNpbXBsaWZpZWQKKwkJCSIgICAgfCAgIGUgJ1snXiBlICddJyFcbiIgKworCQkJIiAgICB8ICAgJygnXiB0eXBlICcpJyEgZVxuIiArCisJCQkiICAgIHwgICBlICgnKysnXiB8ICctLSdeKVxuIiArCisJCQkiICAgIHwgICBlICcoJ14gZXhwcmVzc2lvbkxpc3Q/ICcpJyFcbiIgKworCQkJIiAgICB8ICAgKCcrJ158Jy0nXnwnKysnXnwnLS0nXikgZVxuIiArCisJCQkiICAgIHwgICAoJ34nXnwnISdeKSBlXG4iICsKKwkJCSIgICAgfCAgIGUgKCcqJ158Jy8nXnwnJSdeKSBlXG4iICsKKwkJCSIgICAgfCAgIGUgKCcrJ158Jy0nXikgZVxuIiArCisJCQkiICAgIHwgICBlICgnPCdeICc8JyB8ICc+J14gJz4nICc+JyB8ICc+J14gJz4nKSBlXG4iICsKKwkJCSIgICAgfCAgIGUgKCc8PSdeIHwgJz49J14gfCAnPideIHwgJzwnXikgZVxuIiArCisJCQkiICAgIHwgICBlICdpbnN0YW5jZW9mJ14gZVxuIiArCisJCQkiICAgIHwgICBlICgnPT0nXiB8ICchPSdeKSBlXG4iICsKKwkJCSIgICAgfCAgIGUgJyYnXiBlXG4iICsKKwkJCSIgICAgfCAgIGUgJ14nPGFzc29jPXJpZ2h0Pl4gZVxuIiArCisJCQkiICAgIHwgICBlICd8J14gZVxuIiArCisJCQkiICAgIHwgICBlICcmJideIGVcbiIgKworCQkJIiAgICB8ICAgZSAnfHwnXiBlXG4iICsKKwkJCSIgICAgfCAgIGUgJz8nIGUgJzonIGVcbiIgKworCQkJIiAgICB8ICAgZSAoJz0nPGFzc29jPXJpZ2h0Pl5cbiIgKworCQkJIiAgICAgICAgICB8Jys9Jzxhc3NvYz1yaWdodD5eXG4iICsKKwkJCSIgICAgICAgICAgfCctPSc8YXNzb2M9cmlnaHQ+XlxuIiArCisJCQkiICAgICAgICAgIHwnKj0nPGFzc29jPXJpZ2h0Pl5cbiIgKworCQkJIiAgICAgICAgICB8Jy89Jzxhc3NvYz1yaWdodD5eXG4iICsKKwkJCSIgICAgICAgICAgfCcmPSc8YXNzb2M9cmlnaHQ+XlxuIiArCisJCQkiICAgICAgICAgIHwnfD0nPGFzc29jPXJpZ2h0Pl5cbiIgKworCQkJIiAgICAgICAgICB8J149Jzxhc3NvYz1yaWdodD5eXG4iICsKKwkJCSIgICAgICAgICAgfCc+Pj0nPGFzc29jPXJpZ2h0Pl5cbiIgKworCQkJIiAgICAgICAgICB8Jz4+Pj0nPGFzc29jPXJpZ2h0Pl5cbiIgKworCQkJIiAgICAgICAgICB8Jzw8PSc8YXNzb2M9cmlnaHQ+XlxuIiArCisJCQkiICAgICAgICAgIHwnJT0nPGFzc29jPXJpZ2h0Pl4pIGVcbiIgKworCQkJIiAgICA7XG4iICsKKwkJCSJ0eXBlOiBJRCBcbiIgKworCQkJIiAgICB8IElEICdbJ14gJ10nIVxuIiArCisJCQkiICAgIHwgJ2ludCdcbiIgKworCQkJIgkgfCAnaW50JyAnWydeICddJyEgXG4iICsKKwkJCSIgICAgO1xuIiArCisJCQkiSUQgOiAoJ2EnLi4neid8J0EnLi4nWid8J18nfCckJykrO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiI7CisJCVN0cmluZ1tdIHRlc3RzID0geworCQkJImEiLAkJImEiLAorCQkJIjEiLAkJIjEiLAorCQkJImErMSIsCQkiKCsgYSAxKSIsCisJCQkiYSoxIiwJCSIoKiBhIDEpIiwKKwkJCSJhLmIiLAkJIiguIGEgYikiLAorCQkJImEtYitjIiwJIigrICgtIGEgYikgYykiLAorCisJCQkiYStiKmMiLAkiKCsgYSAoKiBiIGMpKSIsCisJCQkiYS5iKzEiLAkiKCsgKC4gYSBiKSAxKSIsCisJCQkiLWEiLAkJIigtIGEpIiwKKwkJCSItYStiIiwJCSIoKyAoLSBhKSBiKSIsCisJCQkiLWEuYiIsCQkiKC0gKC4gYSBiKSkiLAorCQkJImFeYl5jIiwJIiheIGEgKF4gYiBjKSkiLAorCQkJImE9Yj1jIiwJIig9IGEgKD0gYiBjKSkiLAorCQkJImE9Yj1jK2QuZSIsIig9IGEgKD0gYiAoKyBjICguIGQgZSkpKSkiLAorCQkJImF8YiZjIiwJIih8IGEgKCYgYiBjKSkiLAorCQkJIihhfGIpJmMiLAkiKCYgKHwgYSBiKSBjKSIsCisJCQkiYSA+IGIiLAkiKD4gYSBiKSIsCisJCQkiYSA+PiBiIiwJIig+IGEgYikiLCAgLy8gdGV4dCBpcyBmcm9tIG9uZSB0b2tlbgorCQkJImEgPCBiIiwJIig8IGEgYikiLAorCisJCQkiKFQpeCIsCQkJCQkJCSIoKCBUIHgpIiwKKwkJCSJuZXcgQSgpLmIiLAkJCQkJIiguIChuZXcgQSAoKSBiKSIsCisJCQkiKFQpdC5mKCkiLAkJCQkJCSIoKCAoKCBUICguIHQgZikpKSIsCisJCQkiYS5mKHgpPT1ULmMiLAkJCQkJIig9PSAoKCAoLiBhIGYpIHgpICguIFQgYykpIiwKKwkJCSJhLmYoKS5nKHgsMSkiLAkJCQkJIigoICguICgoICguIGEgZikpIGcpIHggMSkiLAorCQkJIm5ldyBUWygobi0xKSAqIHgpICsgMV0iLAkJIihuZXcgVCBbICgrICgqICgtIG4gMSkgeCkgMSkpIiwKKwkJfTsKKwkJcnVuVGVzdHMoZ3JhbW1hciwgdGVzdHMsICJlIik7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJldHVyblZhbHVlQW5kQWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkicyA6IGUge1N5c3RlbS5vdXQucHJpbnRsbigkZS52KTt9IDtcbiIgKworCQkJImUgcmV0dXJucyBbaW50IHYsIExpc3Q8U3RyaW5nPiBpZ25vcmVkXVxuIiArCisJCQkiICA6IGUgJyonIGI9ZSB7JHYgKj0gJGIudjt9XG4iICsKKwkJCSIgIHwgZSAnKycgYj1lIHskdiArPSAkYi52O31cbiIgKworCQkJIiAgfCBJTlQgeyR2ID0gJElOVC5pbnQ7fVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7c2tpcCgpO30gO1xuIjsKKwkJU3RyaW5nW10gdGVzdHMgPSB7CisJCQkiNCIsCQkJIjQiLAorCQkJIjErMiIsCQkJIjMiLAorCQl9OworCQlydW5UZXN0cyhncmFtbWFyLCB0ZXN0cywgInMiKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVmFsdWVBbmRBY3Rpb25zQW5kQVNUcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJzIDogZSB7U3lzdGVtLm91dC5wcmludChcInY9XCIrJGUuditcIiwgXCIpO30gO1xuIiArCisJCQkiZSByZXR1cm5zIFtpbnQgdiwgTGlzdDxTdHJpbmc+IGlnbm9yZWRdXG4iICsKKwkJCSIgIDogZSAnKideIGI9ZSB7JHYgKj0gJGIudjt9XG4iICsKKwkJCSIgIHwgZSAnKydeIGI9ZSB7JHYgKz0gJGIudjt9XG4iICsKKwkJCSIgIHwgSU5UIHskdiA9ICRJTlQuaW50O31cbiIgKworCQkJIiAgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykge3NraXAoKTt9IDtcbiI7CisJCVN0cmluZ1tdIHRlc3RzID0geworCQkJIjQiLAkJCSJ2PTQsIDQiLAorCQkJIjErMiIsCQkJInY9MywgKCsgMSAyKSIsCisJCX07CisJCXJ1blRlc3RzKGdyYW1tYXIsIHRlc3RzLCAicyIpOworCX0KKworCXB1YmxpYyB2b2lkIHJ1blRlc3RzKFN0cmluZyBncmFtbWFyLCBTdHJpbmdbXSB0ZXN0cywgU3RyaW5nIHN0YXJ0UnVsZSkgeworCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwgZGVidWcpOworCQlib29sZWFuIHBhcnNlckJ1aWxkc1RyZWVzID0KKwkJCWdyYW1tYXIuaW5kZXhPZigib3V0cHV0PUFTVCIpPj0wIHx8CisJCQlncmFtbWFyLmluZGV4T2YoIm91dHB1dCA9IEFTVCIpPj0wOworCQl3cml0ZVJlY29nbml6ZXJBbmRDb21waWxlKCJUUGFyc2VyIiwKKwkJCQkJCQkJCQkgbnVsbCwKKwkJCQkJCQkJCQkgIlRMZXhlciIsCisJCQkJCQkJCQkJIHN0YXJ0UnVsZSwKKwkJCQkJCQkJCQkgbnVsbCwKKwkJCQkJCQkJCQkgcGFyc2VyQnVpbGRzVHJlZXMsCisJCQkJCQkJCQkJIGZhbHNlLAorCQkJCQkJCQkJCSBmYWxzZSwKKwkJCQkJCQkJCQkgZGVidWcpOworCisJCWZvciAoaW50IGk9MDsgaTx0ZXN0cy5sZW5ndGg7IGkrPTIpIHsKKwkJCVN0cmluZyB0ZXN0ID0gdGVzdHNbaV07CisJCQlTdHJpbmcgZXhwZWN0aW5nID0gdGVzdHNbaSsxXSsiXG4iOworCQkJd3JpdGVGaWxlKHRtcGRpciwgImlucHV0IiwgdGVzdCk7CisJCQlTdHJpbmcgZm91bmQgPSBleGVjUmVjb2duaXplcigpOworCQkJU3lzdGVtLm91dC5wcmludCh0ZXN0KyIgLT4gIitmb3VuZCk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdExleGVyLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RMZXhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjY1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RMZXhlci5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIuVG9vbDsKK2ltcG9ydCBvcmcuYW50bHIuY29kZWdlbi5Db2RlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5zdHJpbmd0ZW1wbGF0ZS52NC5TVDsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdExleGVyIGV4dGVuZHMgQmFzZVRlc3QgeworCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKwkvKiogUHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlZCBieSBUZXN0UmlnICovCisJcHVibGljIFRlc3RMZXhlcigpIHsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB0aGlzIG11c3QgcmV0dXJuIEEgbm90IEkgdG8gdGhlIHBhcnNlcjsgY2FsbGluZyBhIG5vbmZyYWdtZW50IHJ1bGUKKwkJLy8gZnJvbSBhIG5vbmZyYWdtZW50IHJ1bGUgZG9lcyBub3Qgc2V0IHRoZSBvdmVyYWxsIHRva2VuLgorCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogQSB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiIrCisJCQkiQSA6ICdcXFxcJyAndCcge3NldFRleHQoXCJcdFwiKTt9IDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsiOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJQLmciLCBncmFtbWFyLCAiUFBhcnNlciIsICJQTGV4ZXIiLAorCQkJCSAgICAiYSIsICJcXHQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiXHRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVmVG9SdWxlRG9lc05vdFNldFRva2VuTm9yRW1pdEFub3RoZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdGhpcyBtdXN0IHJldHVybiBBIG5vdCBJIHRvIHRoZSBwYXJzZXI7IGNhbGxpbmcgYSBub25mcmFnbWVudCBydWxlCisJCS8vIGZyb20gYSBub25mcmFnbWVudCBydWxlIGRvZXMgbm90IHNldCB0aGUgb3ZlcmFsbCB0b2tlbi4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEEgRU9GIHtTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQpO30gO1xuIisKKwkJCSJBIDogJy0nIEkgO1xuIiArCisJCQkiSSA6ICcwJy4uJzknKyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsiOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJQLmciLCBncmFtbWFyLCAiUFBhcnNlciIsICJQTGV4ZXIiLAorCQkJCSAgICAiYSIsICItMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiLTM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlZlRvUnVsZURvZXNOb3RTZXRDaGFubmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHRoaXMgbXVzdCBzZXQgY2hhbm5lbCBvZiBBIHRvIEhJRERFTi4gICRjaGFubmVsIGlzIGxvY2FsIHRvIHJ1bGUKKwkJLy8gbGlrZSAkdHlwZS4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEEgRU9GIHtTeXN0ZW0ub3V0LnByaW50bG4oJEEudGV4dCtcIiwgY2hhbm5lbD1cIiskQS5jaGFubmVsKTt9IDtcbiIrCisJCQkiQSA6ICctJyBXUyBJIDtcbiIgKworCQkJIkkgOiAnMCcuLic5JysgO1xuIisKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7IjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiUC5nIiwgZ3JhbW1hciwgIlBQYXJzZXIiLCAiUExleGVyIiwKKwkJCQkgICAgImEiLCAiLSAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCItIDM0LCBjaGFubmVsPTBcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2VDYW5TZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFA7XG4iKworCQkJInRva2VucyB7WDt9XG4iICsKKwkJCSJhIDogWCBFT0Yge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iKworCQkJIkEgOiAnLScgSSB7JHR5cGUgPSBYO30gO1xuIiArCisJCQkiSSA6ICcwJy4uJzknKyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsiOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJQLmciLCBncmFtbWFyLCAiUFBhcnNlciIsICJQTGV4ZXIiLAorCQkJCSAgICAiYSIsICItMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiLTM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlZlRvRnJhZ21lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdGhpcyBtdXN0IHJldHVybiBBIG5vdCBJIHRvIHRoZSBwYXJzZXI7IGNhbGxpbmcgYSBub25mcmFnbWVudCBydWxlCisJCS8vIGZyb20gYSBub25mcmFnbWVudCBydWxlIGRvZXMgbm90IHNldCB0aGUgb3ZlcmFsbCB0b2tlbi4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iKworCQkJIkEgOiAnLScgSSA7XG4iICsKKwkJCSJmcmFnbWVudCBJIDogJzAnLi4nOScrIDtcbiIrCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOyI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlAuZyIsIGdyYW1tYXIsICJQUGFyc2VyIiwgIlBMZXhlciIsCisJCQkJICAgICJhIiwgIi0zNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCItMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVSZWZUb0ZyYWdtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHRoaXMgbXVzdCByZXR1cm4gQSBub3QgSSB0byB0aGUgcGFyc2VyOyBjYWxsaW5nIGEgbm9uZnJhZ21lbnQgcnVsZQorCQkvLyBmcm9tIGEgbm9uZnJhZ21lbnQgcnVsZSBkb2VzIG5vdCBzZXQgdGhlIG92ZXJhbGwgdG9rZW4uCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFA7XG4iKworCQkJImEgOiBBIEVPRiB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiIrCisJCQkiQSA6IEkgJy4nIEkgO1xuIiArCisJCQkiZnJhZ21lbnQgSSA6ICcwJy4uJzknKyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsiOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJQLmciLCBncmFtbWFyLCAiUFBhcnNlciIsICJQTGV4ZXIiLAorCQkJCSAgICAiYSIsICIzLjE0MTU5IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIjMuMTQxNTlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxJblN1YnJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY2FuIHdlIHNlZSB2IG91dHNpZGU/CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFA7XG4iKworCQkJImEgOiBBIEVPRiA7XG4iKworCQkJIkEgOiAnaGknIFdTICh2PUkpPyB7JGNoYW5uZWw9MDsgU3lzdGVtLm91dC5wcmludGxuKCR2LnRleHQpO30gO1xuIiArCisJCQkiZnJhZ21lbnQgSSA6ICcwJy4uJzknKyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsiOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJQLmciLCBncmFtbWFyLCAiUFBhcnNlciIsICJQTGV4ZXIiLAorCQkJCSAgICAiYSIsICJoaSAzNDIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMzQyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlZlRvVG9rZW5JbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFA7XG4iKworCQkJImEgOiBBIEVPRiA7XG4iKworCQkJIkEgOiBJIHtTeXN0ZW0ub3V0LnByaW50bG4oJEkudGV4dCk7fSA7XG4iICsKKwkJCSJmcmFnbWVudCBJIDogJzAnLi4nOScrIDtcbiIrCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gOyI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlAuZyIsIGdyYW1tYXIsICJQUGFyc2VyIiwgIlBMZXhlciIsCisJCQkJICAgICJhIiwgIjM0MiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNDJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGlzdExhYmVsSW5MZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogQSA7XG4iKworCQkJIkEgOiBpKz1JKyB7Zm9yIChPYmplY3QgdCA6ICRpKSBTeXN0ZW0ub3V0LnByaW50KFwiIFwiKygoVG9rZW4pdCkuZ2V0VGV4dCgpKTt9IDtcbiIgKworCQkJImZyYWdtZW50IEkgOiAnMCcuLic5JysgO1xuIisKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7IjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiUC5nIiwgZ3JhbW1hciwgIlBQYXJzZXIiLCAiUExleGVyIiwKKwkJCQkgICAgImEiLCAiMzMgMjk3IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIiAzMyAyOTdcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RHVwTGlzdFJlZkluTGV4ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEEgO1xuIisKKwkJCSJBIDogaSs9SSBXUyBpKz1JIHskY2hhbm5lbD0wOyBmb3IgKE9iamVjdCB0IDogJGkpIFN5c3RlbS5vdXQucHJpbnQoXCIgXCIrKChUb2tlbil0KS5nZXRUZXh0KCkpO30gO1xuIiArCisJCQkiZnJhZ21lbnQgSSA6ICcwJy4uJzknKyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDsiOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJQLmciLCBncmFtbWFyLCAiUFBhcnNlciIsICJQTGV4ZXIiLAorCQkJCSAgICAiYSIsICIzMyAyOTciLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiIDMzIDI5N1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDaGFyTGFiZWxJbkxleGVyKCkgeworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEIgO1xuIiArCisJCQkiQiA6IHg9J2EnIHtTeXN0ZW0ub3V0LnByaW50bG4oKGNoYXIpJHgpO30gO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkTGFiZWxJbkxleGVyKCkgeworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkibGV4ZXIgZ3JhbW1hciBUO1xuIiArCisJCQkiQiA6IHg9J2EnIHg9J2InIDtcbiIgOworCQlib29sZWFuIGZvdW5kID0KKwkJCXJhd0dlbmVyYXRlQW5kQnVpbGRSZWNvZ25pemVyKAorCQkJCSJULmciLCBncmFtbWFyLCBudWxsLCAiVCIsIGZhbHNlKTsKKwkJYm9vbGVhbiBleHBlY3RpbmcgPSB0cnVlOyAvLyBzaG91bGQgYmUgb2sKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZFJ1bGVMYWJlbEluTGV4ZXIoKSB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJsZXhlciBncmFtbWFyIFQ7XG4iICsKKwkJCSJCIDogeD1BIHg9QSA7XG4iICsKKwkJCSJmcmFnbWVudCBBIDogJ2EnIDtcbiIgOworCQlib29sZWFuIGZvdW5kID0KKwkJCXJhd0dlbmVyYXRlQW5kQnVpbGRSZWNvZ25pemVyKAorCQkJCSJULmciLCBncmFtbWFyLCBudWxsLCAiVCIsIGZhbHNlKTsKKwkJYm9vbGVhbiBleHBlY3RpbmcgPSB0cnVlOyAvLyBzaG91bGQgYmUgb2sKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJc29sYXRlZEVPVEVkZ2UoKSB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJsZXhlciBncmFtbWFyIFQ7XG4iICsKKwkJCSJRVU9URURfQ09OVEVOVCBcbiIgKworCQkJIiAgICAgICAgOiAncScgKH4ncScpKiAoKCd4JyAncScpICkqICdxJyA7IFxuIjsKKwkJYm9vbGVhbiBmb3VuZCA9CisJCQlyYXdHZW5lcmF0ZUFuZEJ1aWxkUmVjb2duaXplcigKKwkJCQkiVC5nIiwgZ3JhbW1hciwgbnVsbCwgIlQiLCBmYWxzZSk7CisJCWJvb2xlYW4gZXhwZWN0aW5nID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIG9rCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEVzY2FwZWRMaXRlcmFscygpIHsKKwkJLyogR3JhbW1hcjoKKwkJCUEgOiAnXCInIDsgIHNob3VsZCBtYXRjaCBhIHNpbmdsZSBkb3VibGUtcXVvdGU6ICIKKwkJCUIgOiAnXFxcIicgOyBzaG91bGQgbWF0Y2ggaW5wdXQgXCIKKwkJKi8KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImxleGVyIGdyYW1tYXIgVDtcbiIgKworCQkJIkEgOiAnXFxcIicgO1xuIiArCisJCQkiQiA6ICdcXFxcXFxcIicgO1xuIiA7IC8vICdcXFwiJworCQlib29sZWFuIGZvdW5kID0KKwkJCXJhd0dlbmVyYXRlQW5kQnVpbGRSZWNvZ25pemVyKAorCQkJCSJULmciLCBncmFtbWFyLCBudWxsLCAiVCIsIGZhbHNlKTsKKwkJYm9vbGVhbiBleHBlY3RpbmcgPSB0cnVlOyAvLyBzaG91bGQgYmUgb2sKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROZXdsaW5lTGl0ZXJhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisgICAgICAgICAgICAibGV4ZXIgZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAiQSA6ICdcXG5cXG4nIDtcbiIgIC8vIEFOVExSIHNlZXMgJ1xuXG4nCisgICAgICAgICk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAibWF0Y2goXCJcXG5cXG5cIikiOworCisgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisgICAgICAgIGFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisgICAgICAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisgICAgICAgIGcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworICAgICAgICBnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBjb2RlZ2VuIHBoYXNlIHNldHMgc29tZSB2YXJzIHdlIG5lZWQKKyAgICAgICAgU1QgY29kZVNUID0gZ2VuZXJhdG9yLmdldFJlY29nbml6ZXJTVCgpOworICAgICAgICBTdHJpbmcgY29kZSA9IGNvZGVTVC5yZW5kZXIoKTsKKyAgICAgICAgaW50IG0gPSBjb2RlLmluZGV4T2YoIm1hdGNoKFwiIik7CisgICAgICAgIFN0cmluZyBmb3VuZCA9IGNvZGUuc3Vic3RyaW5nKG0sbStleHBlY3RpbmcubGVuZ3RoKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RNZXNzYWdlcy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0TWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0TWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIuVG9vbDsKK2ltcG9ydCBvcmcuYW50bHIuY29kZWdlbi5Db2RlR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFOVExSUGFyc2VyOworaW1wb3J0IG9yZy5hbnRsci5ncmFtbWFyLnYzLkFjdGlvblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW47CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hclNlbWFudGljc01lc3NhZ2U7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0TWVzc2FnZXMgZXh0ZW5kcyBCYXNlVGVzdCB7CisKKwkvKiogUHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlZCBieSBUZXN0UmlnICovCisJcHVibGljIFRlc3RNZXNzYWdlcygpIHsKKwl9CisKKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlU3RyaW5naWZpY2F0aW9uSXNDb25zaXN0ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJG90aGVyLnRyZWUgPSBudWxsOyI7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciBhO1xuIiArCisJCQkib3B0aW9ucyB7IG91dHB1dCA9IEFTVDt9IiArCisJCQkib3RoZXJydWxlXG4iICsKKwkJCSIgICAgOiAneScgOyIgKworCQkJInJ1bGVcbiIgKworCQkJIiAgICA6IG90aGVyPW90aGVycnVsZSB7IiArIGFjdGlvbiArIn1cbiIgKworCQkJIiAgICA7Iik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCQkJCQkJCQkJCQkJCQkicnVsZSIsCisJCQkJCQkJCQkJCQkJCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0KKwkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1dSSVRFX1RPX1JFQURPTkxZX0FUVFI7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJvdGhlciI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAidHJlZSI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCVN0cmluZyBleHBlY3RlZE1lc3NhZ2VTdHJpbmcgPSBleHBlY3RlZE1lc3NhZ2UudG9TdHJpbmcoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZVN0cmluZywgZXhwZWN0ZWRNZXNzYWdlLnRvU3RyaW5nKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdE5GQUNvbnN0cnVjdGlvbi5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0TkZBQ29uc3RydWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmNzc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdE5GQUNvbnN0cnVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTIwNCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLlN0YXRlOworaW1wb3J0IG9yZy5hbnRsci50b29sLkZBU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE5GQUNvbnN0cnVjdGlvbiBleHRlbmRzIEJhc2VUZXN0IHsKKworCS8qKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkIGJ5IFRlc3RSaWcgKi8KKwlwdWJsaWMgVGVzdE5GQUNvbnN0cnVjdGlvbigpIHsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogQTsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItQS0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBQigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogQSBCIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItQS0+LnMzXG4iICsKKwkJCSIuczMtQi0+LnM0XG4iICsKKwkJCSIuczQtPjpzNVxuIiArCisJCQkiOnM1LUVPRi0+LnM2XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBb3JCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBBIHwgQiB7O30gOyIpOworCQkvKiBleHBlY3RpbmcgKDApLS1FcC0tPigxKS0tRXAtLT4oMiktLUEtLT4oMyktLUVwLS0+KDQpLS1FcC0tPig1LGVuZCkKKwkJCQkJCQkJCQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkJCQkJCQkJCSAgICg2KS0tRXAtLT4oNyktLUItLT4oOCktLS0tLS0tLXwKKwkJCQkgKi8KKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEtPi5zN1xuIiArCisJCQkiLnMxMC0+LnM0XG4iICsKKwkJCSIuczItQS0+LnMzXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LT46czVcbiIgKworCQkJIi5zNy0+LnM4XG4iICsKKwkJCSIuczgtQi0+LnM5XG4iICsKKwkJCSIuczkte30tPi5zMTBcbiIgKworCQkJIjpzNS1FT0YtPi5zNlxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VPclJhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgUDtcbiIrCisJCQkiQSA6ICgnYScuLidjJyAnaCcgfCAncScgJ2onLi4nbCcpIDsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxMC0ncSctPi5zMTFcbiIgKworCQkJIi5zMTEtJ2onLi4nbCctPi5zMTJcbiIgKworCQkJIi5zMTItPi5zNlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMi0+LnM5XG4iICsKKwkJCSIuczMtJ2EnLi4nYyctPi5zNFxuIiArCisJCQkiLnM0LSdoJy0+LnM1XG4iICsKKwkJCSIuczUtPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIi5zOS0+LnMxMFxuIiArCisJCQkiOnM3LTxFT1Q+LT4uczhcbiI7CisJCWNoZWNrUnVsZShnLCAiQSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgUDtcbiIrCisJCQkiQSA6ICdhJy4uJ2MnIDsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLSdhJy4uJ2MnLT4uczNcbiIgKworCQkJIi5zMy0+OnM0XG4iICsKKwkJCSI6czQtPEVPVD4tPi5zNVxuIjsKKwkJY2hlY2tSdWxlKGcsICJBIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2hhclNldEluUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEF8J2InIDsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLUEuLidiJy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBQm9yQ0QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEEgQiB8IEMgRDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEtPi5zOFxuIiArCisJCQkiLnMxMC1ELT4uczExXG4iICsKKwkJCSIuczExLT4uczVcbiIgKworCQkJIi5zMi1BLT4uczNcbiIgKworCQkJIi5zMy1CLT4uczRcbiIgKworCQkJIi5zNC0+LnM1XG4iICsKKwkJCSIuczUtPjpzNlxuIiArCisJCQkiLnM4LT4uczlcbiIgKworCQkJIi5zOS1DLT4uczEwXG4iICsKKwkJCSI6czYtRU9GLT4uczdcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdGJBKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBiIEEgO1xuIisKKwkJCSJiIDogQiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQtPi5zNVxuIiArCisJCQkiLnM1LUItPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIi5zOC1BLT4uczlcbiIgKworCQkJIi5zOS0+OnMxMFxuIiArCisJCQkiOnMxMC1FT0YtPi5zMTFcbiIgKworCQkJIjpzNy0+LnM4XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RiQV9iQygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogYiBBIDtcbiIrCisJCQkiYiA6IEIgO1xuIisKKwkJCSJjIDogYiBDOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTItPi5zMTNcbiIgKworCQkJIi5zMTMtQy0+LnMxNFxuIiArCisJCQkiLnMxNC0+OnMxNVxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQtPi5zNVxuIiArCisJCQkiLnM1LUItPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIi5zOC1BLT4uczlcbiIgKworCQkJIi5zOS0+OnMxMFxuIiArCisJCQkiOnMxMC1FT0YtPi5zMTFcbiIgKworCQkJIjpzMTUtRU9GLT4uczE2XG4iICsKKwkJCSI6czctPi5zMTJcbiIgKworCQkJIjpzNy0+LnM4XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBb3JFcHNpbG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBBIHwgOyIpOworCQkvKiBleHBlY3RpbmcgKDApLS1FcC0tPigxKS0tRXAtLT4oMiktLUEtLT4oMyktLUVwLS0+KDQpLS1FcC0tPig1LGVuZCkKKwkJCQkJCQkJCQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkJCQkJCQkJCSAgICg2KS0tRXAtLT4oNyktLUVwLS0+KDgpLS0tLS0tLXwKKwkJCQkgKi8KKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEtPi5zN1xuIiArCisJCQkiLnMyLUEtPi5zM1xuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC0+OnM1XG4iICsKKwkJCSIuczctPi5zOFxuIiArCisJCQkiLnM4LT4uczlcbiIgKworCQkJIi5zOS0+LnM0XG4iICsKKwkJCSI6czUtRU9GLT4uczZcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogKEEpPzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMyLT4uczhcbiIgKworCQkJIi5zMy1BLT4uczRcbiIgKworCQkJIi5zNC0+LnM1XG4iICsKKwkJCSIuczUtPjpzNlxuIiArCisJCQkiLnM4LT4uczVcbiIgKworCQkJIjpzNi1FT0YtPi5zN1xuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TmFrZWRBb3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IEE/OyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi0+LnMzXG4iICsKKwkJCSIuczItPi5zOFxuIiArCisJCQkiLnMzLUEtPi5zNFxuIiArCisJCQkiLnM0LT4uczVcbiIgKworCQkJIi5zNS0+OnM2XG4iICsKKwkJCSIuczgtPi5zNVxuIiArCisJCQkiOnM2LUVPRi0+LnM3XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBb3JCdGhlbkMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IChBIHwgQikgQzsiKTsKKwkJLyogZXhwZWN0aW5nCisKKwkJCQkoMCktLUVwLS0+KDEpLS1FcC0tPigyKS0tQS0tPigzKS0tRXAtLT4oNCktLUVwLS0+KDUpLS1DLS0+KDYpLS1FcC0tPig3LGVuZCkKKwkJCQkJCSAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCQkJCQkJICAoOCktLUVwLS0+KDkpLS1CLS0+KDEwKS0tLS0tLS18CisJCQkJICovCisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFwbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiAoQSkrOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi0+LnMzXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LUEtPi5zNVxuIiArCisJCQkiLnM1LT4uczNcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPjpzN1xuIiArCisJCQkiOnM3LUVPRi0+LnM4XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROYWtlZEFwbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBBKzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC1BLT4uczVcbiIgKworCQkJIi5zNS0+LnMzXG4iICsKKwkJCSIuczUtPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIjpzNy1FT0YtPi5zOFxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXBsdXNOb25HcmVlZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogKG9wdGlvbnMge2dyZWVkeT1mYWxzZTt9OicwJy4uJzknKSsgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQtJzAnLi4nOSctPi5zNVxuIiArCisJCQkiLnM1LT4uczNcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPjpzN1xuIiArCisJCQkiOnM3LTxFT1Q+LT4uczhcbiI7CisJCWNoZWNrUnVsZShnLCAiQSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFvckJwbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiAoQSB8IEJ7YWN0aW9ufSkrIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEwLT4uczExXG4iICsKKwkJCSIuczExLUItPi5zMTJcbiIgKworCQkJIi5zMTIte30tPi5zMTNcbiIgKworCQkJIi5zMTMtPi5zNlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnMxMFxuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC1BLT4uczVcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPi5zM1xuIiArCisJCQkiLnM2LT4uczdcbiIgKworCQkJIi5zNy0+OnM4XG4iICsKKwkJCSI6czgtRU9GLT4uczlcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFvckJvckVtcHR5UGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogKEEgfCBCIHwgKSsgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTAtPi5zMTFcbiIgKworCQkJIi5zMTAtPi5zMTNcbiIgKworCQkJIi5zMTEtQi0+LnMxMlxuIiArCisJCQkiLnMxMi0+LnM2XG4iICsKKwkJCSIuczEzLT4uczE0XG4iICsKKwkJCSIuczE0LT4uczE1XG4iICsKKwkJCSIuczE1LT4uczZcbiIgKworCQkJIi5zMi0+LnMzXG4iICsKKwkJCSIuczMtPi5zMTBcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQtQS0+LnM1XG4iICsKKwkJCSIuczUtPi5zNlxuIiArCisJCQkiLnM2LT4uczNcbiIgKworCQkJIi5zNi0+LnM3XG4iICsKKwkJCSIuczctPjpzOFxuIiArCisJCQkiOnM4LUVPRi0+LnM5XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBU3RhcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogKEEpKjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMyLT4uczlcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQtQS0+LnM1XG4iICsKKwkJCSIuczUtPi5zM1xuIiArCisJCQkiLnM1LT4uczZcbiIgKworCQkJIi5zNi0+OnM3XG4iICsKKwkJCSIuczktPi5zNlxuIiArCisJCQkiOnM3LUVPRi0+LnM4XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRBc3RhcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogKEEqKSo7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxMC0+OnMxMVxuIiArCisJCQkiLnMxMy0+LnM4XG4iICsKKwkJCSIuczE0LT4uczEwXG4iICsKKwkJCSIuczItPi5zMTRcbiIgKworCQkJIi5zMi0+LnMzXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LT4uczEzXG4iICsKKwkJCSIuczQtPi5zNVxuIiArCisJCQkiLnM1LT4uczZcbiIgKworCQkJIi5zNi1BLT4uczdcbiIgKworCQkJIi5zNy0+LnM1XG4iICsKKwkJCSIuczctPi5zOFxuIiArCisJCQkiLnM4LT4uczlcbiIgKworCQkJIi5zOS0+LnMxMFxuIiArCisJCQkiLnM5LT4uczNcbiIgKworCQkJIjpzMTEtRU9GLT4uczEyXG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQbHVzTmVzdGVkSW5TdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiAoQSspKjsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEwLT46czExXG4iICsKKwkJCSIuczEzLT4uczEwXG4iICsKKwkJCSIuczItPi5zMTNcbiIgKworCQkJIi5zMi0+LnMzXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LT4uczVcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtQS0+LnM3XG4iICsKKwkJCSIuczctPi5zNVxuIiArCisJCQkiLnM3LT4uczhcbiIgKworCQkJIi5zOC0+LnM5XG4iICsKKwkJCSIuczktPi5zMTBcbiIgKworCQkJIi5zOS0+LnMzXG4iICsKKwkJCSI6czExLUVPRi0+LnMxMlxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3Rhck5lc3RlZEluUGx1cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogKEEqKSs7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxMC0+OnMxMVxuIiArCisJCQkiLnMxMy0+LnM4XG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC0+LnMxM1xuIiArCisJCQkiLnM0LT4uczVcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtQS0+LnM3XG4iICsKKwkJCSIuczctPi5zNVxuIiArCisJCQkiLnM3LT4uczhcbiIgKworCQkJIi5zOC0+LnM5XG4iICsKKwkJCSIuczktPi5zMTBcbiIgKworCQkJIi5zOS0+LnMzXG4iICsKKwkJCSI6czExLUVPRi0+LnMxMlxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TmFrZWRBc3RhcigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogQSo7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMi0+LnM5XG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LUEtPi5zNVxuIiArCisJCQkiLnM1LT4uczNcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPjpzN1xuIiArCisJCQkiLnM5LT4uczZcbiIgKworCQkJIjpzNy1FT0YtPi5zOFxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QW9yQnN0YXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IChBIHwgQnthY3Rpb259KSogOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTAtPi5zMTFcbiIgKworCQkJIi5zMTEtQi0+LnMxMlxuIiArCisJCQkiLnMxMi17fS0+LnMxM1xuIiArCisJCQkiLnMxMy0+LnM2XG4iICsKKwkJCSIuczE0LT4uczdcbiIgKworCQkJIi5zMi0+LnMxNFxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnMxMFxuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC1BLT4uczVcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPi5zM1xuIiArCisJCQkiLnM2LT4uczdcbiIgKworCQkJIi5zNy0+OnM4XG4iICsKKwkJCSI6czgtRU9GLT4uczlcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFvckJPcHRpb25hbFN1YnJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6ICggQSB8IEIgKT8gOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi0+LnMzXG4iICsKKwkJCSIuczItPi5zOFxuIiArCisJCQkiLnMzLUEuLkItPi5zNFxuIiArCisJCQkiLnM0LT4uczVcbiIgKworCQkJIi5zNS0+OnM2XG4iICsKKwkJCSIuczgtPi5zNVxuIiArCisJCQkiOnM2LUVPRi0+LnM3XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkaWNhdGVkQW9yQigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDoge3AxfT8gQSB8IHtwMn0/IEIgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMS0+LnM4XG4iICsKKwkJCSIuczEwLUItPi5zMTFcbiIgKworCQkJIi5zMTEtPi5zNVxuIiArCisJCQkiLnMyLXtwMX0/LT4uczNcbiIgKworCQkJIi5zMy1BLT4uczRcbiIgKworCQkJIi5zNC0+LnM1XG4iICsKKwkJCSIuczUtPjpzNlxuIiArCisJCQkiLnM4LT4uczlcbiIgKworCQkJIi5zOS17cDJ9Py0+LnMxMFxuIiArCisJCQkiOnM2LUVPRi0+LnM3XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVByZWRpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IHtwMX0/IHtwMWF9PyBBIHwge3AyfT8gQiB8IHtwM30gYjtcbiIgKworCQkJImIgOiB7cDR9PyBCIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEtPi5zOVxuIiArCisJCQkiLnMxMC17cDJ9Py0+LnMxMVxuIiArCisJCQkiLnMxMS1CLT4uczEyXG4iICsKKwkJCSIuczEyLT4uczZcbiIgKworCQkJIi5zMTMtPi5zMTRcbiIgKworCQkJIi5zMTQte30tPi5zMTVcbiIgKworCQkJIi5zMTUtPi5zMTZcbiIgKworCQkJIi5zMTYtPi5zMTdcbiIgKworCQkJIi5zMTctPi5zMThcbiIgKworCQkJIi5zMTgte3A0fT8tPi5zMTlcbiIgKworCQkJIi5zMTktQi0+LnMyMFxuIiArCisJCQkiLnMyLXtwMX0/LT4uczNcbiIgKworCQkJIi5zMjAtPjpzMjFcbiIgKworCQkJIi5zMjItPi5zNlxuIiArCisJCQkiLnMzLXtwMWF9Py0+LnM0XG4iICsKKwkJCSIuczQtQS0+LnM1XG4iICsKKwkJCSIuczUtPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIi5zOS0+LnMxMFxuIiArCisJCQkiLnM5LT4uczEzXG4iICsKKwkJCSI6czIxLT4uczIyXG4iICsKKwkJCSI6czctRU9GLT4uczhcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6ICggQSB8IEIgKSsgO1xuIiArCisJCQkiYiA6ICggQSB8IEJ7O30gKSsgO1xuIiArCisJCQkiYyA6IChBfEIpIChBfEIpIDtcbiIgKworCQkJImQgOiAoIEEgfCBCICkqIDtcbiIgKworCQkJImUgOiAoIEEgfCBCICk/IDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC1BLi5CLT4uczVcbiIgKworCQkJIi5zNS0+LnMzXG4iICsKKwkJCSIuczUtPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIjpzNy1FT0YtPi5zOFxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTAtPi5zMTFcbiIgKworCQkJIi5zMTEtQi0+LnMxMlxuIiArCisJCQkiLnMxMi17fS0+LnMxM1xuIiArCisJCQkiLnMxMy0+LnM2XG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczEwXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LUEtPi5zNVxuIiArCisJCQkiLnM1LT4uczZcbiIgKworCQkJIi5zNi0+LnMzXG4iICsKKwkJCSIuczYtPi5zN1xuIiArCisJCQkiLnM3LT46czhcbiIgKworCQkJIjpzOC1FT0YtPi5zOVxuIjsKKwkJY2hlY2tSdWxlKGcsICJiIiwgZXhwZWN0aW5nKTsKKwkJZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi1BLi5CLT4uczNcbiIgKworCQkJIi5zMy1BLi5CLT4uczRcbiIgKworCQkJIi5zNC0+OnM1XG4iICsKKwkJCSI6czUtRU9GLT4uczZcbiI7CisJCWNoZWNrUnVsZShnLCAiYyIsIGV4cGVjdGluZyk7CisJCWV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMyLT4uczlcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQtQS4uQi0+LnM1XG4iICsKKwkJCSIuczUtPi5zM1xuIiArCisJCQkiLnM1LT4uczZcbiIgKworCQkJIi5zNi0+OnM3XG4iICsKKwkJCSIuczktPi5zNlxuIiArCisJCQkiOnM3LUVPRi0+LnM4XG4iOworCQljaGVja1J1bGUoZywgImQiLCBleHBlY3RpbmcpOworCQlleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMi0+LnM4XG4iICsKKwkJCSIuczMtQS4uQi0+LnM0XG4iICsKKwkJCSIuczQtPi5zNVxuIiArCisJCQkiLnM1LT46czZcbiIgKworCQkJIi5zOC0+LnM1XG4iICsKKwkJCSI6czYtRU9GLT4uczdcbiI7CisJCWNoZWNrUnVsZShnLCAiZSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdFNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJ0b2tlbnMgeyBBOyBCOyBDOyB9XG4iKworCQkJImEgOiB+QSA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItQi4uQy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjg6IHBhcnNlciBncmFtbWFyIFA7XG4iICsKKwkJCSJhIDogfiBBIDsiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nR3JhbW1hclN0ciwgZy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90U2luZ2xldG9uQmxvY2tTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkidG9rZW5zIHsgQTsgQjsgQzsgfVxuIisKKwkJCSJhIDogfihBKSA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItQi4uQy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjg6IHBhcnNlciBncmFtbWFyIFA7XG4iICsKKwkJCSJhIDogfiAoIEEgKSA7IjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZ0dyYW1tYXJTdHIsIGcudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdENoYXJTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJBIDogficzJyA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczIteydcXHUwMDAwJy4uJzInLCAnNCcuLidcXHVGRkZGJ30tPi5zM1xuIiArCisJCQkiLnMzLT46czRcbiIgKworCQkJIjpzNC08RU9UPi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgIkEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjc6IGxleGVyIGdyYW1tYXIgUDtcbiIgKworCQkJIkEgOiB+ICczJyA7XG4iKworCQkJIlRva2VucyA6IEEgOyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmdHcmFtbWFyU3RyLCBnLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RCbG9ja1NldCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIFA7XG4iKworCQkJIkEgOiB+KCczJ3wnYicpIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi17J1xcdTAwMDAnLi4nMicsICc0Jy4uJ2EnLCAnYycuLidcXHVGRkZGJ30tPi5zM1xuIiArCisJCQkiLnMzLT46czRcbiIgKworCQkJIjpzNC08RU9UPi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgIkEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjc6IGxleGVyIGdyYW1tYXIgUDtcbiIgKworCQkJIkEgOiB+ICggJzMnIHwgJ2InICkgO1xuIiArCisJCQkiVG9rZW5zIDogQSA7IjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZ0dyYW1tYXJTdHIsIGcudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdFNldExvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJBIDogfignMycpKiA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMyLT4uczlcbiIgKworCQkJIi5zMy0+LnM0XG4iICsKKwkJCSIuczQteydcXHUwMDAwJy4uJzInLCAnNCcuLidcXHVGRkZGJ30tPi5zNVxuIiArCisJCQkiLnM1LT4uczNcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPjpzN1xuIiArCisJCQkiLnM5LT4uczZcbiIgKworCQkJIjpzNy08RU9UPi0+LnM4XG4iOworCQljaGVja1J1bGUoZywgIkEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjc6IGxleGVyIGdyYW1tYXIgUDtcbiIgKworCQkJIkEgOiAofiAoICczJyApICkqIDtcbiIgKworCQkJIlRva2VucyA6IEEgOyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmdHcmFtbWFyU3RyLCBnLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RCbG9ja1NldExvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJBIDogfignMyd8J2InKSogO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMi0+LnM5XG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LXsnXFx1MDAwMCcuLicyJywgJzQnLi4nYScsICdjJy4uJ1xcdUZGRkYnfS0+LnM1XG4iICsKKwkJCSIuczUtPi5zM1xuIiArCisJCQkiLnM1LT4uczZcbiIgKworCQkJIi5zNi0+OnM3XG4iICsKKwkJCSIuczktPi5zNlxuIiArCisJCQkiOnM3LTxFT1Q+LT4uczhcbiI7CisJCWNoZWNrUnVsZShnLCAiQSIsIGV4cGVjdGluZyk7CisKKwkJU3RyaW5nIGV4cGVjdGluZ0dyYW1tYXJTdHIgPQorCQkJIjE6NzogbGV4ZXIgZ3JhbW1hciBQO1xuIiArCisJCQkiQSA6ICh+ICggJzMnIHwgJ2InICkgKSogO1xuIiArCisJCQkiVG9rZW5zIDogQSA7IjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZ0dyYW1tYXJTdHIsIGcudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldHNJbkNvbWJpbmVkR3JhbW1hclNlbnRUb0xleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIG5vdCBzdXJlIHRoaXMgYmVsb25ncyBpbiB0aGlzIHRlc3Qgc3VpdGUsIGJ1dCB3aGF0ZXZlci4KKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ3snIH4oJ30nKSogJ30nO1xuIik7CisJCVN0cmluZyByZXN1bHQgPSBnLmdldExleGVyR3JhbW1hcigpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSJsZXhlciBncmFtbWFyIHQ7IiArbmV3bGluZSArCisJCQkiLy8gJEFOVExSIHNyYyBcIjxzdHJpbmc+XCIgMiIrbmV3bGluZSsKKwkJCSJBIDogJ3snIH4oJ30nKSogJ30nOyI7CisJCWFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhYmVsZWROb3RTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkidG9rZW5zIHsgQTsgQjsgQzsgfVxuIisKKwkJCSJhIDogdD1+QSA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItQi4uQy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjg6IHBhcnNlciBncmFtbWFyIFA7XG4iICsKKwkJCSJhIDogdD1+IEEgOyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmdHcmFtbWFyU3RyLCBnLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkTm90Q2hhclNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIFA7XG4iKworCQkJIkEgOiB0PX4nMycgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLXsnXFx1MDAwMCcuLicyJywgJzQnLi4nXFx1RkZGRid9LT4uczNcbiIgKworCQkJIi5zMy0+OnM0XG4iICsKKwkJCSI6czQtPEVPVD4tPi5zNVxuIjsKKwkJY2hlY2tSdWxlKGcsICJBIiwgZXhwZWN0aW5nKTsKKworCQlTdHJpbmcgZXhwZWN0aW5nR3JhbW1hclN0ciA9CisJCQkiMTo3OiBsZXhlciBncmFtbWFyIFA7XG4iICsKKwkJCSJBIDogdD1+ICczJyA7XG4iKworCQkJIlRva2VucyA6IEEgOyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmdHcmFtbWFyU3RyLCBnLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkTm90QmxvY2tTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJBIDogdD1+KCczJ3wnYicpIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi17J1xcdTAwMDAnLi4nMicsICc0Jy4uJ2EnLCAnYycuLidcXHVGRkZGJ30tPi5zM1xuIiArCisJCQkiLnMzLT46czRcbiIgKworCQkJIjpzNC08RU9UPi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgIkEiLCBleHBlY3RpbmcpOworCisJCVN0cmluZyBleHBlY3RpbmdHcmFtbWFyU3RyID0KKwkJCSIxOjc6IGxleGVyIGdyYW1tYXIgUDtcbiIgKworCQkJIkEgOiB0PX4gKCAnMycgfCAnYicgKSA7XG4iICsKKwkJCSJUb2tlbnMgOiBBIDsiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nR3JhbW1hclN0ciwgZy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZENoYXJMaXRlcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgUDtcbiIrCisJCQkiYSA6ICdcXG4nOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi0nXFxuJy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkU3RyaW5nTGl0ZXJhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIFA7XG4iKworCQkJImEgOiAnYVxcbmJcXHUwMDMwY1xcJyc7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLSdhXFxuYlxcdTAwMzBjXFwnJy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCS8vIEFVVE8gQkFDS1RSQUNLSU5HIFNUVUZGCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0JhY2t0cmFja2luZ19SdWxlQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkib3B0aW9ucyB7YmFja3RyYWNrPXRydWU7fVxuIisKKwkJCSJhIDogJ2Enezt9fCdiJzsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxLT4uczlcbiIgKworCQkJIi5zMTAtJ2InLT4uczExXG4iICsKKwkJCSIuczExLT4uczZcbiIgKworCQkJIi5zMi17c3lucHJlZDFfdH0/LT4uczNcbiIgKworCQkJIi5zMy0nYSctPi5zNFxuIiArCisJCQkiLnM0LXt9LT4uczVcbiIgKworCQkJIi5zNS0+LnM2XG4iICsKKwkJCSIuczYtPjpzN1xuIiArCisJCQkiLnM5LT4uczEwXG4iICsKKwkJCSI6czctRU9GLT4uczhcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9CYWNrdHJhY2tpbmdfUnVsZVNldEJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkiYSA6ICdhJ3wnYic7IgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi0nYScuLidiJy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvQmFja3RyYWNraW5nX1NpbXBsZUJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkiYSA6ICgnYSd7O318J2InKSA7IgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTAtPi5zMTFcbiIgKworCQkJIi5zMTEtJ2InLT4uczEyXG4iICsKKwkJCSIuczEyLT4uczdcbiIgKworCQkJIi5zMi0+LnMxMFxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy17c3lucHJlZDFfdH0/LT4uczRcbiIgKworCQkJIi5zNC0nYSctPi5zNVxuIiArCisJCQkiLnM1LXt9LT4uczZcbiIgKworCQkJIi5zNi0+LnM3XG4iICsKKwkJCSIuczctPjpzOFxuIiArCisJCQkiOnM4LUVPRi0+LnM5XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvQmFja3RyYWNraW5nX1NldEJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkiYSA6ICgnYSd8J2InKSA7IgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMi0nYScuLidiJy0+LnMzXG4iICsKKwkJCSIuczMtPjpzNFxuIiArCisJCQkiOnM0LUVPRi0+LnM1XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvQmFja3RyYWNraW5nX1N0YXJCbG9jaygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJImEgOiAoJ2Enezt9fCdiJykqIDsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxMi0+LnMxM1xuIiArCisJCQkiLnMxMy17c3lucHJlZDJfdH0/LT4uczE0XG4iICsKKwkJCSIuczE0LSdiJy0+LnMxNVxuIiArCisJCQkiLnMxNS0+LnM4XG4iICsKKwkJCSIuczE2LT4uczlcbiIgKworCQkJIi5zMi0+LnMxNlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnMxMlxuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC17c3lucHJlZDFfdH0/LT4uczVcbiIgKworCQkJIi5zNS0nYSctPi5zNlxuIiArCisJCQkiLnM2LXt9LT4uczdcbiIgKworCQkJIi5zNy0+LnM4XG4iICsKKwkJCSIuczgtPi5zM1xuIiArCisJCQkiLnM4LT4uczlcbiIgKworCQkJIi5zOS0+OnMxMFxuIiArCisJCQkiOnMxMC1FT0YtPi5zMTFcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9CYWNrdHJhY2tpbmdfU3RhclNldEJsb2NrX0lnbm9yZXNQcmVkcygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJImEgOiAoJ2EnfCdiJykqIDsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMi0+LnM5XG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LSdhJy4uJ2InLT4uczVcbiIgKworCQkJIi5zNS0+LnMzXG4iICsKKwkJCSIuczUtPi5zNlxuIiArCisJCQkiLnM2LT46czdcbiIgKworCQkJIi5zOS0+LnM2XG4iICsKKwkJCSI6czctRU9GLT4uczhcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9CYWNrdHJhY2tpbmdfU3RhclNldEJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkiYSA6ICgnYSd8J2Inezt9KSogOyIKKwkJKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczExLT4uczEyXG4iICsKKwkJCSIuczEyLXtzeW5wcmVkMl90fT8tPi5zMTNcbiIgKworCQkJIi5zMTMtJ2InLT4uczE0XG4iICsKKwkJCSIuczE0LXt9LT4uczE1XG4iICsKKwkJCSIuczE1LT4uczdcbiIgKworCQkJIi5zMTYtPi5zOFxuIiArCisJCQkiLnMyLT4uczE2XG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczExXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LXtzeW5wcmVkMV90fT8tPi5zNVxuIiArCisJCQkiLnM1LSdhJy0+LnM2XG4iICsKKwkJCSIuczYtPi5zN1xuIiArCisJCQkiLnM3LT4uczNcbiIgKworCQkJIi5zNy0+LnM4XG4iICsKKwkJCSIuczgtPjpzOVxuIiArCisJCQkiOnM5LUVPRi0+LnMxMFxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0JhY2t0cmFja2luZ19TdGFyQmxvY2sxQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge2JhY2t0cmFjaz10cnVlO31cbiIrCisJCQkiYSA6ICgnYScpKiA7IgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTAtPi5zN1xuIiArCisJCQkiLnMyLT4uczEwXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC17c3lucHJlZDFfdH0/LT4uczVcbiIgKworCQkJIi5zNS0nYSctPi5zNlxuIiArCisJCQkiLnM2LT4uczNcbiIgKworCQkJIi5zNi0+LnM3XG4iICsKKwkJCSIuczctPjpzOFxuIiArCisJCQkiOnM4LUVPRi0+LnM5XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvQmFja3RyYWNraW5nX1BsdXNCbG9jaygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJImEgOiAoJ2Enezt9fCdiJykrIDsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxMi0+LnMxM1xuIiArCisJCQkiLnMxMy17c3lucHJlZDJfdH0/LT4uczE0XG4iICsKKwkJCSIuczE0LSdiJy0+LnMxNVxuIiArCisJCQkiLnMxNS0+LnM4XG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczEyXG4iICsKKwkJCSIuczMtPi5zNFxuIiArCisJCQkiLnM0LXtzeW5wcmVkMV90fT8tPi5zNVxuIiArCisJCQkiLnM1LSdhJy0+LnM2XG4iICsKKwkJCSIuczYte30tPi5zN1xuIiArCisJCQkiLnM3LT4uczhcbiIgKworCQkJIi5zOC0+LnMzXG4iICsKKwkJCSIuczgtPi5zOVxuIiArCisJCQkiLnM5LT46czEwXG4iICsKKwkJCSI6czEwLUVPRi0+LnMxMVxuIjsKKwkJY2hlY2tSdWxlKGcsICJhIiwgZXhwZWN0aW5nKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0JhY2t0cmFja2luZ19QbHVzU2V0QmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkib3B0aW9ucyB7YmFja3RyYWNrPXRydWU7fVxuIisKKwkJCSJhIDogKCdhJ3wnYid7O30pKyA7IgorCQkpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtPi5zMVxuIiArCisJCQkiLnMxLT4uczJcbiIgKworCQkJIi5zMTEtPi5zMTJcbiIgKworCQkJIi5zMTIte3N5bnByZWQyX3R9Py0+LnMxM1xuIiArCisJCQkiLnMxMy0nYictPi5zMTRcbiIgKworCQkJIi5zMTQte30tPi5zMTVcbiIgKworCQkJIi5zMTUtPi5zN1xuIiArCisJCQkiLnMyLT4uczNcbiIgKworCQkJIi5zMy0+LnMxMVxuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC17c3lucHJlZDFfdH0/LT4uczVcbiIgKworCQkJIi5zNS0nYSctPi5zNlxuIiArCisJCQkiLnM2LT4uczdcbiIgKworCQkJIi5zNy0+LnMzXG4iICsKKwkJCSIuczctPi5zOFxuIiArCisJCQkiLnM4LT46czlcbiIgKworCQkJIjpzOS1FT0YtPi5zMTBcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9CYWNrdHJhY2tpbmdfUGx1c0Jsb2NrMUFsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJImEgOiAoJ2EnKSsgOyIKKwkJKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLT4uczRcbiIgKworCQkJIi5zNC17c3lucHJlZDFfdH0/LT4uczVcbiIgKworCQkJIi5zNS0nYSctPi5zNlxuIiArCisJCQkiLnM2LT4uczNcbiIgKworCQkJIi5zNi0+LnM3XG4iICsKKwkJCSIuczctPjpzOFxuIiArCisJCQkiOnM4LUVPRi0+LnM5XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvQmFja3RyYWNraW5nX09wdGlvbmFsQmxvY2syQWx0cygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJImEgOiAoJ2Enezt9fCdiJyk/OyIKKwkJKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczEwLT4uczExXG4iICsKKwkJCSIuczEwLT4uczE0XG4iICsKKwkJCSIuczExLXtzeW5wcmVkMl90fT8tPi5zMTJcbiIgKworCQkJIi5zMTItJ2InLT4uczEzXG4iICsKKwkJCSIuczEzLT4uczdcbiIgKworCQkJIi5zMTQtPi5zN1xuIiArCisJCQkiLnMyLT4uczEwXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMzLXtzeW5wcmVkMV90fT8tPi5zNFxuIiArCisJCQkiLnM0LSdhJy0+LnM1XG4iICsKKwkJCSIuczUte30tPi5zNlxuIiArCisJCQkiLnM2LT4uczdcbiIgKworCQkJIi5zNy0+OnM4XG4iICsKKwkJCSI6czgtRU9GLT4uczlcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9CYWNrdHJhY2tpbmdfT3B0aW9uYWxCbG9jazFBbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkib3B0aW9ucyB7YmFja3RyYWNrPXRydWU7fVxuIisKKwkJCSJhIDogKCdhJyk/OyIKKwkJKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLT4uczFcbiIgKworCQkJIi5zMS0+LnMyXG4iICsKKwkJCSIuczItPi5zM1xuIiArCisJCQkiLnMyLT4uczlcbiIgKworCQkJIi5zMy17c3lucHJlZDFfdH0/LT4uczRcbiIgKworCQkJIi5zNC0nYSctPi5zNVxuIiArCisJCQkiLnM1LT4uczZcbiIgKworCQkJIi5zNi0+OnM3XG4iICsKKwkJCSIuczktPi5zNlxuIiArCisJCQkiOnM3LUVPRi0+LnM4XG4iOworCQljaGVja1J1bGUoZywgImEiLCBleHBlY3RpbmcpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvQmFja3RyYWNraW5nX0V4aXN0aW5nUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtiYWNrdHJhY2s9dHJ1ZTt9XG4iKworCQkJImEgOiAoJ2EnKT0+ICdhJyB8ICdiJzsiCisJCSk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0+LnMxXG4iICsKKwkJCSIuczEtPi5zMlxuIiArCisJCQkiLnMxLT4uczhcbiIgKworCQkJIi5zMTAtPi5zNVxuIiArCisJCQkiLnMyLXtzeW5wcmVkMV90fT8tPi5zM1xuIiArCisJCQkiLnMzLSdhJy0+LnM0XG4iICsKKwkJCSIuczQtPi5zNVxuIiArCisJCQkiLnM1LT46czZcbiIgKworCQkJIi5zOC0+LnM5XG4iICsKKwkJCSIuczktJ2InLT4uczEwXG4iICsKKwkJCSI6czYtRU9GLT4uczdcbiI7CisJCWNoZWNrUnVsZShnLCAiYSIsIGV4cGVjdGluZyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrUnVsZShHcmFtbWFyIGcsIFN0cmluZyBydWxlLCBTdHJpbmcgZXhwZWN0aW5nKQorCXsKKwkJZy5idWlsZE5GQSgpOworCQlTdGF0ZSBzdGFydFN0YXRlID0gZy5nZXRSdWxlU3RhcnRTdGF0ZShydWxlKTsKKwkJRkFTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRkFTZXJpYWxpemVyKGcpOworCQlTdHJpbmcgcmVzdWx0ID0gc2VyaWFsaXplci5zZXJpYWxpemUoc3RhcnRTdGF0ZSk7CisKKwkJLy9TeXN0ZW0ub3V0LnByaW50KHJlc3VsdCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RSZXdyaXRlQVNULmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RSZXdyaXRlQVNULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYzM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFJld3JpdGVBU1QuamF2YQpAQCAtMCwwICsxLDE0NTkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hclNlbWFudGljc01lc3NhZ2U7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RSZXdyaXRlQVNUIGV4dGVuZHMgQmFzZVRlc3QgeworCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIC0+IElEO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYWJjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVUb2tlblRvTmV3Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgLT4gSURbXCJ4XCJdO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYWJjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoInhcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVG9rZW5Ub05ld05vZGVSb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCAtPiBeKElEW1wieFwiXSBJTlQpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYWJjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIih4IElOVClcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVG9rZW5Ub05ld05vZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFsbG93IGNyZWF0aW9uIG9mIG5ldyBub2RlcyB3L28gYXJncy4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCAtPiBJRFsgXTtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlRULmciLCBncmFtbWFyLCAiVFRQYXJzZXIiLCAiVFRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJJRFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDaGFyTGl0ZXJhbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogJ2MnIC0+ICdjJztcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiAnaWNrJyAtPiAnaWNrJztcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImljayIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJpY2tcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiAtPiBiO1xuIiArCisJCQkiYiA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVvcmRlclRva2VucygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IElOVCBJRDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNCBhYmNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVvcmRlclRva2VuQW5kUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiBJTlQgLT4gSU5UIGI7XG4iICsKKwkJCSJiIDogSUQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIjM0IGFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlblRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiBeKElOVCBJRCk7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYmMgMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKDM0IGFiYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5UcmVlQWZ0ZXJPdGhlclN0dWZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiAndm9pZCcgSUQgSU5UIC0+ICd2b2lkJyBeKElOVCBJRCk7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJ2b2lkIGFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ2b2lkICgzNCBhYmMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5lc3RlZFRva2VuVHJlZVdpdGhPdXRlckxvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdmVyaWZ5IHRoYXQgSUQgYW5kIElOVCBib3RoIGl0ZXJhdGUgb3ZlciBvdXRlciBpbmRleCB2YXJpYWJsZQorCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0RVSDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIElEIElOVCAtPiBeKCBEVUggSUQgXiggRFVIIElOVCkgKSsgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSAxIGIgMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoRFVIIGEgKERVSCAxKSkgKERVSCBiIChEVUggMikpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsU2luZ2xlVG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIC0+IElEPyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENsb3N1cmVTaW5nbGVUb2tlbigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSUQgLT4gSUQqIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEgYiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UG9zaXRpdmVDbG9zdXJlU2luZ2xlVG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElEIC0+IElEKyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsU2luZ2xlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiAtPiBiPztcbiIgKworCQkJImIgOiBJRCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENsb3N1cmVTaW5nbGVSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBiIGIgLT4gYio7XG4iICsKKwkJCSJiIDogSUQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSBiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImEgYlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlT2ZMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogeCs9YiB4Kz1iIC0+ICR4KjtcbiIgKworCQkJImIgOiBJRCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsTGFiZWxOb0xpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogKHg9SUQpPyAtPiAkeD87XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UG9zaXRpdmVDbG9zdXJlU2luZ2xlUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiBiIC0+IGIrO1xuIiArCisJCQkiYiA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEgYiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUHJlZGljYXRlVCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgLT4ge3RydWV9PyBJRCAtPiA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZVByZWRpY2F0ZUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIC0+IHtmYWxzZX0/IElEIC0+IDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUHJlZGljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4ge2ZhbHNlfT8gSURcbiIgKworCQkJIiAgICAgICAgICAgLT4ge3RydWV9PyBJTlRcbiIgKworCQkJIiAgICAgICAgICAgLT4gXG4iICsKKwkJCSIgIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEgMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUHJlZGljYXRlVHJlZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiB7ZmFsc2V9PyBeKElEIElOVClcbiIgKworCQkJIiAgICAgICAgICAgLT4ge3RydWV9PyBeKElOVCBJRClcbiIgKworCQkJIiAgICAgICAgICAgLT4gSURcbiIgKworCQkJIiAgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSAyIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigyIGEpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IG9wIElOVCAtPiBeKG9wIElOVCk7XG4iICsKKwkJCSJvcCA6ICcrJ3wnLScgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiLTM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigtIDM0KVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUcmVlMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogb3AgSU5UIC0+IF4oSU5UIG9wKTtcbiIgKworCQkJIm9wIDogJysnfCctJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICIrIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigzNCArKVxuIiwgZm91bmQpOworCX0KKworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5lc3RlZFRyZWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiAndmFyJyAoSUQgJzonIHR5cGUgJzsnKSsgLT4gXigndmFyJyBeKCc6JyBJRCB0eXBlKSspIDtcbiIgKworCQkJInR5cGUgOiAnaW50JyB8ICdmbG9hdCcgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAidmFyIGE6aW50OyBiOmZsb2F0OyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIodmFyICg6IGEgaW50KSAoOiBiIGZsb2F0KSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1hZ2luYXJ5VG9rZW5Db3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7VkFSO31cbiIgKworCQkJImEgOiBJRCAoJywnIElEKSotPiBeKFZBUiBJRCkrIDtcbiIgKworCQkJInR5cGUgOiAnaW50JyB8ICdmbG9hdCcgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSxiLGMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKFZBUiBhKSAoVkFSIGIpIChWQVIgYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5VbnJlZmVyZW5jZWRPbkxlZnRCdXREZWZpbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7VkFSO31cbiIgKworCQkJImEgOiBiIC0+IElEIDtcbiIgKworCQkJImIgOiBJRCA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiSURcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1hZ2luYXJ5VG9rZW5Db3B5U2V0VGV4dCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge1ZBUjt9XG4iICsKKwkJCSJhIDogSUQgKCcsJyBJRCkqLT4gXihWQVJbXCJ2YXJcIl0gSUQpKyA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEsYixjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIih2YXIgYSkgKHZhciBiKSAodmFyIGMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEltYWdpbmFyeVRva2VuTm9Db3B5RnJvbVRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7QkxPQ0s7fVxuIiArCisJCQkiYSA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjXSBJRCspIDtcbiIgKworCQkJInR5cGUgOiAnaW50JyB8ICdmbG9hdCcgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAie2EgYiBjfSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoeyBhIGIgYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW1hZ2luYXJ5VG9rZW5Ob0NvcHlGcm9tVG9rZW5TZXRUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7QkxPQ0s7fVxuIiArCisJCQkiYSA6IGxjPSd7JyBJRCsgJ30nIC0+IF4oQkxPQ0tbJGxjLFwiYmxvY2tcIl0gSUQrKSA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgInthIGIgY30iLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKGJsb2NrIGEgYiBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXhlZFJld3JpdGVBbmRBdXRvQVNUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7QkxPQ0s7fVxuIiArCisJCQkiYSA6IGIgYl4gO1xuIiArIC8vIDJuZCBiIG1hdGNoZXMgb25seSBhbiBJTlQ7IGNhbiBtYWtlIGl0IHJvb3QKKwkJCSJiIDogSUQgSU5UIC0+IElOVCBJRFxuIiArCisJCQkiICB8IElOVFxuIiArCisJCQkiICA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIDEgMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoMiAxIGEpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN1YnJ1bGVXaXRoUmV3cml0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiBiIGIgO1xuIiArCisJCQkiYiA6IChJRCBJTlQgLT4gSU5UIElEIHwgSU5UIElOVCAtPiBJTlQrIClcbiIgKworCQkJIiAgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSAxIDIgMyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIxIGEgMiAzXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN1YnJ1bGVXaXRoUmV3cml0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtUWVBFO31cbiIgKworCQkJImEgOiBiIGIgO1xuIiArCisJCQkiYiA6ICdpbnQnXG4iICsKKwkJCSIgICAgKCBJRCAtPiBeKFRZUEUgJ2ludCcgSUQpXG4iICsKKwkJCSIgICAgfCBJRCAnPScgSU5UIC0+IF4oVFlQRSAnaW50JyBJRCBJTlQpXG4iICsKKwkJCSIgICAgKVxuIiArCisJCQkiICAgICc7J1xuIiArCisJCQkiICA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJpbnQgYTsgaW50IGI9MzsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKFRZUEUgaW50IGEpIChUWVBFIGludCBiIDMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5lc3RlZFJld3JpdGVTaHV0c09mZkF1dG9BU1QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogYiBiIDtcbiIgKworCQkJImIgOiBJRCAoIElEIChsYXN0PUlEIC0+ICRsYXN0KSsgKSAnOydcbiIgKyAvLyBnZXQgbGFzdCBJRAorCQkJIiAgfCBJTlRcbiIgKyAvLyBzaG91bGQgc3RpbGwgZ2V0IGF1dG8gQVNUIGNvbnN0cnVjdGlvbgorCQkJIiAgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSBiIGMgZDsgNDIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiZCA0MlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlQWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYXRvbSAtPiBeKHthZGFwdG9yLmNyZWF0ZShJTlQsXCI5XCIpfSBhdG9tKSA7XG4iICsKKwkJCSJhdG9tIDogSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgIjMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKDkgMylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZUFjdGlvbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBhdG9tIC0+IHthZGFwdG9yLmNyZWF0ZShJTlQsXCI5XCIpfSBhdG9tIDtcbiIgKworCQkJImF0b20gOiBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiMyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCI5IDNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVmVG9PbGRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiAoYXRvbSAtPiBhdG9tKSAob3A9JysnIHI9YXRvbSAtPiBeKCRvcCAkYSAkcikgKSogO1xuIiArCisJCQkiYXRvbSA6IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICIzKzQrNSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoKyAoKyAzIDQpIDUpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiBhdG9tIC0+IF4oYXRvbSBhdG9tKSA7XG4iICsgLy8gTk9UIENZQ0xFISAoZHVwIGF0b20pCisJCQkiYXRvbSA6IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICIzIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIigzIDMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvcHlTZW1hbnRpY3NGb3JSdWxlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY29weSB0eXBlIGFzIGEgcm9vdCBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB0eXBlIElEICgnLCcgSUQpKiAnOycgLT4gXih0eXBlIElEKSsgO1xuIiArCisJCQkidHlwZSA6ICdpbnQnIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImludCBhLGIsYzsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiKGludCBhKSAoaW50IGIpIChpbnQgYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29weVNlbWFudGljc0ZvclJ1bGVzMygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjb3B5IHR5cGUgKmFuZCogbW9kaWZpZXIgZXZlbiB0aG91Z2ggaXQncyBvcHRpb25hbAorCQkvLyBmb3IgZWFjaCBpbnZvY2F0aW9uIG9mICguLi4pKyBpbiByZXdyaXRlCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBtb2RpZmllcj8gdHlwZSBJRCAoJywnIElEKSogJzsnIC0+IF4odHlwZSBtb2RpZmllcj8gSUQpKyA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgO1xuIiArCisJCQkibW9kaWZpZXIgOiAncHVibGljJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJwdWJsaWMgaW50IGEsYixjOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDb3B5U2VtYW50aWNzRm9yUnVsZXMzRG91YmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNvcHkgdHlwZSAqYW5kKiBtb2RpZmllciBldmVuIHRob3VnaCBpdCdzIG9wdGlvbmFsCisJCS8vIGZvciBlYWNoIGludm9jYXRpb24gb2YgKC4uLikrIGluIHJld3JpdGUKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IG1vZGlmaWVyPyB0eXBlIElEICgnLCcgSUQpKiAnOycgLT4gXih0eXBlIG1vZGlmaWVyPyBJRCkrIF4odHlwZSBtb2RpZmllcj8gSUQpKyA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgO1xuIiArCisJCQkibW9kaWZpZXIgOiAncHVibGljJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJwdWJsaWMgaW50IGEsYixjOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKSAoaW50IHB1YmxpYyBhKSAoaW50IHB1YmxpYyBiKSAoaW50IHB1YmxpYyBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDb3B5U2VtYW50aWNzRm9yUnVsZXM0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNvcHkgdHlwZSAqYW5kKiBtb2RpZmllciBldmVuIHRob3VnaCBpdCdzIG9wdGlvbmFsCisJCS8vIGZvciBlYWNoIGludm9jYXRpb24gb2YgKC4uLikrIGluIHJld3JpdGUKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtNT0Q7fVxuIiArCisJCQkiYSA6IG1vZGlmaWVyPyB0eXBlIElEICgnLCcgSUQpKiAnOycgLT4gXih0eXBlIF4oTU9EIG1vZGlmaWVyKT8gSUQpKyA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgO1xuIiArCisJCQkibW9kaWZpZXIgOiAncHVibGljJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJwdWJsaWMgaW50IGEsYixjOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoaW50IChNT0QgcHVibGljKSBhKSAoaW50IChNT0QgcHVibGljKSBiKSAoaW50IChNT0QgcHVibGljKSBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDb3B5U2VtYW50aWNzTGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtNT0Q7fVxuIiArCisJCQkiYSA6IElEICgnLCcgSUQpKiAnOycgLT4gSUQrIElEKyA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEsYixjOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGIgYyBhIGIgY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDb3B5UnVsZUxhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7QkxPQ0s7fVxuIiArCisJCQkiYSA6IHg9YiAtPiAkeCAkeDtcbiIrCisJCQkiYiA6IElEIDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29weVJ1bGVMYWJlbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogeD1iIC0+IF4oJHggJHgpO1xuIisKKwkJCSJiIDogSUQgO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihhIGEpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFF1ZXVlaW5nT2ZUb2tlbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6ICdpbnQnIElEICgnLCcgSUQpKiAnOycgLT4gXignaW50JyBJRCspIDtcbiIgKworCQkJIm9wIDogJysnfCctJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJpbnQgYSxiLGM7IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihpbnQgYSBiIGMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvcHlPZlRva2VucygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogJ2ludCcgSUQgJzsnIC0+ICdpbnQnIElEICdpbnQnIElEIDtcbiIgKworCQkJIm9wIDogJysnfCctJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJpbnQgYTsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiaW50IGEgaW50IGFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5Db3B5SW5Mb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiAnaW50JyBJRCAoJywnIElEKSogJzsnIC0+IF4oJ2ludCcgSUQpKyA7XG4iICsKKwkJCSJvcCA6ICcrJ3wnLScgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiaW50IGEsYixjOyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIoaW50IGEpIChpbnQgYikgKGludCBjKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkNvcHlJbkxvb3BBZ2FpbnN0VHdvT3RoZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIG11c3Qgc21lYXIgJ2ludCcgY29waWVzIGFjcm9zcyBhcyByb290IG9mIG11bHRpcGxlIHRyZWVzCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiAnaW50JyBJRCAnOicgSU5UICgnLCcgSUQgJzonIElOVCkqICc7JyAtPiBeKCdpbnQnIElEIElOVCkrIDtcbiIgKworCQkJIm9wIDogJysnfCctJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJpbnQgYToxLGI6MixjOjM7IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIihpbnQgYSAxKSAoaW50IGIgMikgKGludCBjIDMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExpc3RSZWZkT25lQXRBVGltZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQrIC0+IElEIElEIElEIDtcbiIgKyAvLyB3b3JrcyBpZiAzIGlucHV0IElEcworCQkJIm9wIDogJysnfCctJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIgYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGIgY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTcGxpdExpc3RXaXRoTGFiZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7VkFSO31cbiIrCisJCQkiYSA6IGZpcnN0PUlEIG90aGVycys9SUQqIC0+ICRmaXJzdCBWQVIgJG90aGVycysgO1xuIiArCisJCQkib3AgOiAnKyd8Jy0nIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEgYiBjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImEgVkFSIGIgY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDb21wbGljYXRlZE1lbGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogQSBBIGI9QiBCIGI9QiBjKz1DIEMgYys9QyBEIHtTdHJpbmcgcz0kRC50ZXh0O30gLT4gQSsgQisgQysgRCA7XG4iICsKKwkJCSJ0eXBlIDogJ2ludCcgfCAnZmxvYXQnIDtcbiIgKworCQkJIkEgOiAnYScgO1xuIiArCisJCQkiQiA6ICdiJyA7XG4iICsKKwkJCSJDIDogJ2MnIDtcbiIgKworCQkJIkQgOiAnZCcgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSBhIGIgYiBiIGMgYyBjIGQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBhIGIgYiBiIGMgYyBjIGRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7QkxPQ0s7fVxuIiArCisJCQkiYSA6IHg9YiAtPiAkeDtcbiIrCisJCQkiYiA6IElEIDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c1J1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIGEgLT4gYSB8IElOVCA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXZWlyZFJ1bGVSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgYSAtPiAkYSB8IElOVCA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVDogJzAnLi4nOScrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCS8vICRhIGlzIGFtYmlnOyBpcyBpdCBwcmV2aW91cyByb290IG9yIHJlZiB0byBhIHJlZiBpbiBhbHQ/CisJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAxLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CQkKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZUxpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiB4Kz1iIHgrPWIgLT4gJHgrO1xuIisKKwkJCSJiIDogSUQgO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVMaXN0TGFiZWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7QkxPQ0s7fVxuIiArCisJCQkiYSA6IHgrPWIgeCs9YiAtPiAkeCAkeCo7XG4iKworCQkJImIgOiBJRCA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEgYiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogeD1iICh5PWIpPyAtPiAkeCAkeT87XG4iKworCQkJImIgOiBJRCA7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImEiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogeD1JRCAoeT1iKT8gLT4gJHggJHk/O1xuIisKKwkJCSJiIDogSUQgO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiB4PUlEICh5PWIpPyAtPiAoJHggJHkpPztcbiIrCisJCQkiYiA6IElEIDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSBiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImEgYlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogeCs9SUQgKHk9Yik/IC0+ICgkeCAkeSk/O1xuIisKKwkJCSJiIDogSUQgO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYSBiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsNSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiBJRCAtPiBJRD8gO1xuIisgLy8gbWF0Y2ggYW4gSUQgdG8gb3B0aW9uYWwgSUQKKwkJCSJiIDogSUQgO1xuIisKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXJiaXRyYXJ5RXhwclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtCTE9DSzt9XG4iICsKKwkJCSJhIDogeCs9YiB4Kz1iIC0+IHtuZXcgQ29tbW9uVHJlZSgpfTtcbiIrCisJCQkiYiA6IElEIDtcbiIrCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiYSBiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHsgb3V0cHV0ID0gQVNUOyB9IFxuIiArCisJCQkiYTogKElOVHxJRCkrIC0+IElOVCsgSUQrIDtcbiIgKworCQkJIklOVDogJzAnLi4nOScrO1xuIiArCisJCQkiSUQgOiAnYScuLid6Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICIyIGEgMzQgZGUiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMiAzNCBhIGRlXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMgeyBvdXRwdXQgPSBBU1Q7IH0gXG4iICsKKwkJCSJhOiAoSU5UfElEKSAtPiBJTlQ/IElEPyA7XG4iICsKKwkJCSJJTlQ6ICcwJy4uJzknKztcbiIgKworCQkJIklEIDogJ2EnLi4neicrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgImEiLCAiMiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIyXG4iLCBmb3VuZCk7CisJfQorCisJQElnbm9yZSAKKyAgICAvLyBUT0RPOiBGQUlMUy4gVGhlIHNob3VsZCBwcm9iYWJseSBnZW5lcmF0ZSBhIHdhcm5pbmcgZnJvbSBhbnRscgorICAgIC8vIFNlZSBodHRwOi8vd3d3LmFudGxyLm9yZzo4ODg4L2Jyb3dzZS9BTlRMUi0xNjIKKyAgICAvLworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRXaXRoTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHsgb3V0cHV0ID0gQVNUOyB9IFxuIiArCisJCQkiYSA6IHg9KElOVHxJRCkgLT4gJHggO1xuIiArCisJCQkiSU5UOiAnMCcuLic5Jys7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgIjIiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiMlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlQWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7IFxuIiArCisJCQkib3B0aW9ucyB7IG91dHB1dCA9IEFTVDsgfVxuIiArCisJCQkidG9rZW5zIHsgRkxPQVQ7IH1cbiIgKworCQkJInJcbiIgKworCQkJIiAgICA6IElOVCAtPiB7bmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKEZMT0FULCRJTlQudGV4dCtcIi4wXCIpKX0gXG4iICsKKwkJCSIgICAgOyBcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKzsgXG4iICsKKwkJCSJXUzogKCcgJyB8ICdcXG4nIHwgJ1xcdCcpKyB7JGNoYW5uZWwgPSBISURERU47fTsgXG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiciIsICIyNSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIyNS4wXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsU3VicnVsZVdpdGhvdXRSZWFsRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY29weSB0eXBlICphbmQqIG1vZGlmaWVyIGV2ZW4gdGhvdWdoIGl0J3Mgb3B0aW9uYWwKKwkJLy8gZm9yIGVhY2ggaW52b2NhdGlvbiBvZiAoLi4uKSsgaW4gcmV3cml0ZQorCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9IFxuIiArCisJCQkidG9rZW5zIHtQQVJNUzt9IFxuIiArCisJCQkiXG4iICsKKwkJCSJtb2R1bG8gXG4iICsKKwkJCSIgOiAnbW9kdWxvJyBJRCAoJygnIHBhcm1zKyAnKScpPyAtPiBeKCdtb2R1bG8nIElEIF4oUEFSTVMgcGFybXMrKT8pIFxuIiArCisJCQkiIDsgXG4iICsKKwkJCSJwYXJtcyA6ICcjJ3xJRDsgXG4iICsKKwkJCSJJRCA6ICgnYScuLid6JyB8ICdBJy4uJ1onKSs7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAibW9kdWxvIiwgIm1vZHVsbyBhYmMgKHggeSAjKSIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIobW9kdWxvIGFiYyAoUEFSTVMgeCB5ICMpKVxuIiwgZm91bmQpOworCX0KKworCS8vIEMgQSBSIEQgSSBOIEEgTCBJIFQgWSAgSSBTIFMgVSBFIFMKKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDYXJkaW5hbGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge0JMT0NLO31cbiIgKworCQkJImEgOiBJRCBJRCBJTlQgSU5UIElOVCAtPiAoSUQgSU5UKSs7XG4iKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKzsgXG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhIGIgMyA0IDUiLCBkZWJ1Zyk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIm9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uOiB0b2tlbiBJRCI7CisJCVN0cmluZyBmb3VuZCA9IGdldEZpcnN0TGluZU9mRXhjZXB0aW9uKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2FyZGluYWxpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCsgLT4gSUQgSUQgSUQgO1xuIiArIC8vIG9ubHkgMiBpbnB1dCBJRHMKKwkJCSJvcCA6ICcrJ3wnLScgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAiYSIsICJhIGIiLCBkZWJ1Zyk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIm9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUNhcmRpbmFsaXR5RXhjZXB0aW9uOiB0b2tlbiBJRCI7CisJCVN0cmluZyBmb3VuZCA9IGdldEZpcnN0TGluZU9mRXhjZXB0aW9uKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2FyZGluYWxpdHkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRD8gSU5UIC0+IElEIElOVCA7XG4iICsKKwkJCSJvcCA6ICcrJ3wnLScgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAiYSIsICIzIiwgZGVidWcpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSJvcmcuYW50bHIucnVudGltZS50cmVlLlJld3JpdGVFbXB0eVN0cmVhbUV4Y2VwdGlvbjogdG9rZW4gSUQiOworCQlTdHJpbmcgZm91bmQgPSBnZXRGaXJzdExpbmVPZkV4Y2VwdGlvbigpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExvb3BDYXJkaW5hbGl0eSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQ/IElOVCAtPiBJRCsgSU5UIDtcbiIgKworCQkJIm9wIDogJysnfCctJyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICJhIiwgIjMiLCBkZWJ1Zyk7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIm9yZy5hbnRsci5ydW50aW1lLnRyZWUuUmV3cml0ZUVhcmx5RXhpdEV4Y2VwdGlvbiI7CisJCVN0cmluZyBmb3VuZCA9IGdldEZpcnN0TGluZU9mRXhjZXB0aW9uKCk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIGM9LiAtPiAkYztcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNFxuIiwgZm91bmQpOworCX0KKworCS8vIEUgUiBSIE8gUiBTCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJTlQgLT4gdWdoIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTkRFRklORURfUlVMRV9SRUY7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJ1Z2giOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gbnVsbDsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0S25vd25SdWxlQnV0Tm90SW5MSFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJTlQgLT4gYiA7XG4iICsKKwkJCSJiIDogJ2InIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19SRVdSSVRFX0VMRU1FTlRfTk9UX1BSRVNFTlRfT05fTEhTOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiYiI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RVbmtub3duVG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJTlQgLT4gSUNLIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTkRFRklORURfVE9LRU5fUkVGX0lOX1JFV1JJVEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJQ0siOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gbnVsbDsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKworCQljaGVja0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkxhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSU5UIC0+ICRmb28gO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihncmFtbWFyKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1VOREVGSU5FRF9MQUJFTF9SRUZfSU5fUkVXUklURTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImZvbyI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RVbmtub3duQ2hhckxpdGVyYWxUb2tlbigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElOVCAtPiAnYScgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihncmFtbWFyKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1VOREVGSU5FRF9UT0tFTl9SRUZfSU5fUkVXUklURTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIidhJyI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RVbmtub3duU3RyaW5nTGl0ZXJhbFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSU5UIC0+ICdmb28nIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoZ3JhbW1hcik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCWFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19VTkRFRklORURfVE9LRU5fUkVGX0lOX1JFV1JJVEU7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICInZm9vJyI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSBudWxsOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFeHRyYVRva2VuSW5TaW1wbGVEZWNsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtFWFBSO31cbiIgKworCQkJImRlY2wgOiB0eXBlIElEICc9JyBJTlQgJzsnIC0+IF4oRVhQUiB0eXBlIElEIElOVCkgO1xuIiArCisJCQkidHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJkZWNsIiwgImludCAzNCB4PTE7IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImxpbmUgMTo0IGV4dHJhbmVvdXMgaW5wdXQgJzM0JyBleHBlY3RpbmcgSURcbiIsIHRoaXMuc3RkZXJyRHVyaW5nUGFyc2UpOworCQlhc3NlcnRFcXVhbHMoIihFWFBSIGludCB4IDEpXG4iLCBmb3VuZCk7IC8vIHRyZWUgZ2V0cyBjb3JyZWN0IHggYW5kIDEgdG9rZW5zCisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdJREluU2ltcGxlRGVjbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJInRva2VucyB7RVhQUjt9XG4iICsKKwkJCSJkZWNsIDogdHlwZSBJRCAnPScgSU5UICc7JyAtPiBeKEVYUFIgdHlwZSBJRCBJTlQpIDtcbiIgKworCQkJInR5cGUgOiAnaW50JyB8ICdmbG9hdCcgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkJCQkJICAiZGVjbCIsICJpbnQgPTE7IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImxpbmUgMTo0IG1pc3NpbmcgSUQgYXQgJz0nXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCIoRVhQUiBpbnQgPG1pc3NpbmcgSUQ+IDEpXG4iLCBmb3VuZCk7IC8vIHRyZWUgZ2V0cyBpbnZlbnRlZCBJRCB0b2tlbgorCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nU2V0SW5TaW1wbGVEZWNsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkidG9rZW5zIHtFWFBSO31cbiIgKworCQkJImRlY2wgOiB0eXBlIElEICc9JyBJTlQgJzsnIC0+IF4oRVhQUiB0eXBlIElEIElOVCkgO1xuIiArCisJCQkidHlwZSA6ICdpbnQnIHwgJ2Zsb2F0JyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJkZWNsIiwgIng9MTsiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjAgbWlzbWF0Y2hlZCBpbnB1dCAneCcgZXhwZWN0aW5nIHNldCBudWxsXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCIoRVhQUiA8ZXJyb3I6IHg+IHggMSlcbiIsIGZvdW5kKTsgLy8gdHJlZSBnZXRzIGludmVudGVkIElEIHRva2VuCisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdUb2tlbkdpdmVzRXJyb3JOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiBJRCBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYmMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjMgbWlzc2luZyBJTlQgYXQgJzxFT0Y+J1xuIiwgdGhpcy5zdGRlcnJEdXJpbmdQYXJzZSk7CisJCS8vIGRvZXNuJ3QgZG8gaW4tbGluZSByZWNvdmVyeSBmb3Igc2V0cyAoeWV0PykKKwkJYXNzZXJ0RXF1YWxzKCJhYmMgPG1pc3NpbmcgSU5UPlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFeHRyYVRva2VuR2l2ZXNFcnJvck5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiBjIC0+IGIgYztcbiIgKworCQkJImIgOiBJRCAtPiBJRCA7XG4iICsKKwkJCSJjIDogSU5UIC0+IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyBpY2sgMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjQgZXh0cmFuZW91cyBpbnB1dCAnaWNrJyBleHBlY3RpbmcgSU5UXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMgMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gSUQgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJCQkJCSAgImEiLCAiMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygibGluZSAxOjAgbWlzc2luZyBJRCBhdCAnMzQnXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCI8bWlzc2luZyBJRD4gMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpcnN0VG9rZW5HaXZlc0Vycm9yTm9kZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogYiBjIC0+IGIgYztcbiIgKworCQkJImIgOiBJRCAtPiBJRCA7XG4iICsKKwkJCSJjIDogSU5UIC0+IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIjM0IiwgZGVidWcpOworCQkvLyBmaW5kcyBhbiBlcnJvciBhdCB0aGUgZmlyc3QgdG9rZW4sIDM0LCBhbmQgcmUtc3luY3MuCisJCS8vIHJlLXN5bmNocm9uaXppbmcgZG9lcyBub3QgY29uc3VtZSBhIHRva2VuIGJlY2F1c2UgMzQgZm9sbG93cworCQkvLyByZWYgdG8gcnVsZSBiIChzdGFydCBvZiBjKS4gSXQgdGhlbiBtYXRjaGVzIDM0IGluIGMuCisJCWFzc2VydEVxdWFscygibGluZSAxOjAgbWlzc2luZyBJRCBhdCAnMzQnXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCI8bWlzc2luZyBJRD4gMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9WaWFibGVBbHRHaXZlc0Vycm9yTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBiIC0+IGIgfCBjIC0+IGM7XG4iICsKKwkJCSJiIDogSUQgLT4gSUQgO1xuIiArCisJCQkiYyA6IElOVCAtPiBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiUyA6ICcqJyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIioiLCBkZWJ1Zyk7CisJCS8vIGZpbmRzIGFuIGVycm9yIGF0IHRoZSBmaXJzdCB0b2tlbiwgMzQsIGFuZCByZS1zeW5jcy4KKwkJLy8gcmUtc3luY2hyb25pemluZyBkb2VzIG5vdCBjb25zdW1lIGEgdG9rZW4gYmVjYXVzZSAzNCBmb2xsb3dzCisJCS8vIHJlZiB0byBydWxlIGIgKHN0YXJ0IG9mIGMpLiBJdCB0aGVuIG1hdGNoZXMgMzQgaW4gYy4KKwkJYXNzZXJ0RXF1YWxzKCJsaW5lIDE6MCBubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgJyonXG4iLCB0aGlzLnN0ZGVyckR1cmluZ1BhcnNlKTsKKwkJYXNzZXJ0RXF1YWxzKCI8dW5leHBlY3RlZDogW0AwLDA6MD0nKicsPDY+LDE6MF0sIHJlc3luYz0qPlxuIiwgZm91bmQpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0UmV3cml0ZVRlbXBsYXRlcy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0UmV3cml0ZVRlbXBsYXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzg5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RSZXdyaXRlVGVtcGxhdGVzLmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RSZXdyaXRlVGVtcGxhdGVzIGV4dGVuZHMgQmFzZVRlc3QgeworCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9dGVtcGxhdGU7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4ge25ldyBTdHJpbmdUZW1wbGF0ZSgkSUQudGV4dCl9IDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZExpdGVyYWxDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4geyV7JElELnRleHR9fSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5saW5lVGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD10ZW1wbGF0ZTt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IHRlbXBsYXRlKHg9eyRJRH0seT17JElOVH0pIDw8eDo8eC50ZXh0PiwgeTo8eS50ZXh0Pjs+PiA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4OmFiYywgeTozNDtcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TmFtZWRUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB0aGUgc3VwcG9ydCBjb2RlIGFkZHMgdGVtcGxhdGUgZ3JvdXAgaW4gaXQncyBvdXRwdXQgVGVzdC5qYXZhCisJCS8vIHRoYXQgZGVmaW5lcyB0ZW1wbGF0ZSBmb28uCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9dGVtcGxhdGU7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiBmb28oeD17JElELnRleHR9LHk9eyRJTlQudGV4dH0pIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFRlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHRoZSBzdXBwb3J0IGNvZGUgYWRkcyB0ZW1wbGF0ZSBncm91cCBpbiBpdCdzIG91dHB1dCBUZXN0LmphdmEKKwkJLy8gdGhhdCBkZWZpbmVzIHRlbXBsYXRlIGZvby4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD10ZW1wbGF0ZTt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+ICh7XCJmb29cIn0pKHg9eyRJRC50ZXh0fSx5PXskSU5ULnRleHR9KSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYyAzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMgMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5saW5lVGVtcGxhdGVJbnZva2luZ0xpYigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gdGVtcGxhdGUoeD17JElELnRleHR9LHk9eyRJTlQudGV4dH0pIFwiPGZvbyguLi4pPlwiIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkaWNhdGVkQWx0cygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyB0aGUgc3VwcG9ydCBjb2RlIGFkZHMgdGVtcGxhdGUgZ3JvdXAgaW4gaXQncyBvdXRwdXQgVGVzdC5qYXZhCisJCS8vIHRoYXQgZGVmaW5lcyB0ZW1wbGF0ZSBmb28uCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9dGVtcGxhdGU7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiB7ZmFsc2V9PyBmb28oeD17JElELnRleHR9LHk9eyRJTlQudGV4dH0pXG4iICsKKwkJCSIgICAgICAgICAgIC0+IGZvbyh4PXtcImhpXCJ9LCB5PXskSUQudGV4dH0pXG4iICsKKwkJCSIgIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImhpIGFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUZW1wbGF0ZVJldHVybigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIgKworCQkJImEgOiBiIHtTeXN0ZW0ub3V0LnByaW50bG4oJGIuc3QpO30gO1xuIiArCisJCQkiYiA6IElEIElOVCAtPiBmb28oeD17JElELnRleHR9LHk9eyRJTlQudGV4dH0pIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXR1cm5WYWx1ZVdpdGhUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIgKworCQkJImEgOiBiIHtTeXN0ZW0ub3V0LnByaW50bG4oJGIuaSk7fSA7XG4iICsKKwkJCSJiIHJldHVybnMgW2ludCBpXSA6IElEIElOVCB7JGk9ODt9IDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJjIDM0IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoIjhcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VGVtcGxhdGVSZWZUb0R5bmFtaWNBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9dGVtcGxhdGU7fVxuIiArCisJCQkiYSBzY29wZSB7U3RyaW5nIGlkO30gOiBJRCB7JGE6OmlkPSRJRC50ZXh0O30gYlxuIiArCisJCQkiCXtTeXN0ZW0ub3V0LnByaW50bG4oJGIuc3QudG9TdHJpbmcoKSk7fVxuIiArCisJCQkiICAgO1xuIiArCisJCQkiYiA6IElOVCAtPiBmb28oeD17JGE6OmlkfSkgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYmMgMzQiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYWJjIFxuIiwgZm91bmQpOworCX0KKworCS8vIHRlc3RzIGZvciByZXdyaXRpbmcgdGVtcGxhdGVzIGluIHRyZWUgcGFyc2VycworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge0FTVExhYmVsVHlwZT1Db21tb25UcmVlOyBvdXRwdXQ9dGVtcGxhdGU7fVxuIiArCisJCQkicyA6IGEge1N5c3RlbS5vdXQucHJpbnRsbigkYS5zdCk7fSA7XG4iICsKKwkJCSJhIDogSUQgLT4gdGVtcGxhdGUoeD17JElELnRleHR9KSA8PHw8eD58Pj4gO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ8YWJjfFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVOb2RlUmV3cml0ZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge0FTVExhYmVsVHlwZT1Db21tb25UcmVlOyBvdXRwdXQ9dGVtcGxhdGU7IHJld3JpdGU9dHJ1ZTt9XG4iICsKKwkJCSJzIDogYSB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0LmdldFRva2VuU3RyZWFtKCkudG9TdHJpbmcoMCwwKSk7fSA7XG4iICsKKwkJCSJhIDogSUQgLT4gdGVtcGxhdGUoeD17JElELnRleHR9KSA8PHw8eD58Pj4gO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJ8YWJjfFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlUnVsZUFuZFJld3JpdGVNb2RlT25TaW1wbGVFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7QVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IG91dHB1dD10ZW1wbGF0ZTsgcmV3cml0ZT10cnVlO31cbiIgKworCQkJImE6IF4oQSBCKSAtPiB7aWNrfVxuIiArCisJCQkiIHwgeSs9SU5UIC0+IHtpY2t9XG4iICsKKwkJCSIgfCB4PUlEIC0+IHtpY2t9XG4iICsKKwkJCSIgfCBCTE9SVCAtPiB7aWNrfVxuIiArCisJCQkiIDtcbiIKKwkJKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS53YXJuaW5ncy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlUnVsZUFuZFJld3JpdGVNb2RlSWdub3JlQWN0aW9uc1ByZWRpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge0FTVExhYmVsVHlwZT1Db21tb25UcmVlOyBvdXRwdXQ9dGVtcGxhdGU7IHJld3JpdGU9dHJ1ZTt9XG4iICsKKwkJCSJhOiB7YWN0aW9ufSB7YWN0aW9uMn0geD1BIC0+IHtpY2t9XG4iICsKKwkJCSIgfCB7cHJlZDF9PyB5Kz1CIC0+IHtpY2t9XG4iICsKKwkJCSIgfCBDIHthY3Rpb259IC0+IHtpY2t9XG4iICsKKwkJCSIgfCB7cHJlZDJ9Pz0+IHorPUQgLT4ge2lja31cbiIgKworCQkJIiB8IChFKT0+IF4oRiBHKSAtPiB7aWNrfVxuIiArCisJCQkiIDtcbiIKKwkJKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS53YXJuaW5ncy5zaXplKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlUnVsZUFuZFJld3JpdGVNb2RlTm90U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgb3V0cHV0PXRlbXBsYXRlOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkiYSAgOiBJRCsgLT4ge2lja31cbiIgKworCQkJIiAgIHwgSU5UIElOVCAtPiB7aWNrfVxuIiArCisJCQkiICAgO1xuIgorCQkpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlhbnRsci5zZXRPdXRwdXREaXJlY3RvcnkobnVsbCk7IC8vIHdyaXRlIHRvIC9kZXYvbnVsbAorCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLndhcm5pbmdzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVSdWxlQW5kUmV3cml0ZU1vZGVSZWZSdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgb3V0cHV0PXRlbXBsYXRlOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkiYSAgOiBiKyAtPiB7aWNrfVxuIiArCisJCQkiICAgfCBiIGIgQSAtPiB7aWNrfVxuIiArCisJCQkiICAgO1xuIiArCisJCQkiYiAgOiBCIDtcbiIKKwkJKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJYW50bHIuc2V0T3V0cHV0RGlyZWN0b3J5KG51bGwpOyAvLyB3cml0ZSB0byAvZGV2L251bGwKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS53YXJuaW5ncy5zaXplKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U2VtYW50aWNQcmVkaWNhdGVFdmFsdWF0aW9uLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RTZW1hbnRpY1ByZWRpY2F0ZUV2YWx1YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY4ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U2VtYW50aWNQcmVkaWNhdGVFdmFsdWF0aW9uLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdFNlbWFudGljUHJlZGljYXRlRXZhbHVhdGlvbiBleHRlbmRzIEJhc2VUZXN0IHsKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ3ljbGljREZBV2l0aFByZWRpY2F0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287XG4iICsKKwkJCSJhIDoge2ZhbHNlfT8gJ3gnKiAneScge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDFcIik7fVxuIiArCisJCQkiICB8IHt0cnVlfT8gICd4JyogJ3knIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJhbHQyXCIpO31cbiIgKworCQkJIiAgO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgInh4eHkiLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiYWx0MlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDeWNsaWNERkFXaXRoSW5zdGFuY2VWYXJQcmVkaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkiQG1lbWJlcnMge2Jvb2xlYW4gdj10cnVlO31cbiIgKworCQkJImEgOiB7ZmFsc2V9PyAneCcqICd5JyB7U3lzdGVtLm91dC5wcmludGxuKFwiYWx0MVwiKTt9XG4iICsKKwkJCSIgIHwge3Z9PyAgICAgJ3gnKiAneScge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDJcIik7fVxuIiArCisJCQkiICA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkgICAgImEiLCAieHh4eSIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJhbHQyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFByZWRpY2F0ZVZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkiQG1lbWJlcnMge1xuIiArCisJCQkicHVibGljIHZvaWQgcmVwb3J0RXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZSkge1xuIiArCisJCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbihcImVycm9yOiBcIitlLnRvU3RyaW5nKCkpO1xuIiArCisJCQkifVxuIiArCisJCQkifVxuIiArCisJCQkiXG4iICsKKwkJCSJhIDoge2ZhbHNlfT8gJ3gnXG4iICsKKwkJCSIgIDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCSAgICAiYSIsICJ4IiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImVycm9yOiBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oYSx7ZmFsc2V9PylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJQcmVkcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287IiArCisJCQkiQGxleGVyOjptZW1iZXJzIHtib29sZWFuIHA9ZmFsc2U7fVxuIiArCisJCQkiYSA6IChBfEIpKyA7XG4iICsKKwkJCSJBIDoge3B9PyAnYScgIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJ0b2tlbiAxXCIpO30gO1xuIiArCisJCQkiQiA6IHshcH0/ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwidG9rZW4gMlwiKTt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgImEiLCBmYWxzZSk7CisJCS8vICJhIiBpcyBhbWJpZzsgY2FuIG1hdGNoIGJvdGggQSwgQi4gIFByZWQgc2F5cyBtYXRjaCAyCisJCWFzc2VydEVxdWFscygidG9rZW4gMlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclByZWRzMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287IiArCisJCQkiQGxleGVyOjptZW1iZXJzIHtib29sZWFuIHA9dHJ1ZTt9XG4iICsKKwkJCSJhIDogKEF8QikrIDtcbiIgKworCQkJIkEgOiB7cH0/ICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwidG9rZW4gMVwiKTt9IDtcbiIgKworCQkJIkIgOiAoJ2EnfCdiJykrIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJ0b2tlbiAyXCIpO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkgICAgImEiLCAiYSIsIGZhbHNlKTsKKwkJLy8gImEiIGlzIGFtYmlnOyBjYW4gbWF0Y2ggYm90aCBBLCBCLiAgUHJlZCBzYXlzIG1hdGNoIDEKKwkJYXNzZXJ0RXF1YWxzKCJ0b2tlbiAxXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyUHJlZEluRXhpdEJyYW5jaCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBwIHNheXMgaXQncyBvayB0byBleGl0OyBpdCBoYXMgcHJlY2VuZGVuY2Ugb3ZlciB0aGUgIXAgbG9vcGJhY2sgYnJhbmNoCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbzsiICsKKwkJCSJAbGV4ZXI6Om1lbWJlcnMge2Jvb2xlYW4gcD10cnVlO31cbiIgKworCQkJImEgOiAoQXxCKSsgO1xuIiArCisJCQkiQSA6ICgnYScge1N5c3RlbS5vdXQucHJpbnQoXCIxXCIpO30pKlxuIiArCisJCQkiICAgIHtwfT9cbiIgKworCQkJIiAgICAoJ2EnIHtTeXN0ZW0ub3V0LnByaW50KFwiMlwiKTt9KSogO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkgICAgImEiLCAiYWFhIiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoIjIyMlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclByZWRJbkV4aXRCcmFuY2gyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIGZvbzsiICsKKwkJCSJAbGV4ZXI6Om1lbWJlcnMge2Jvb2xlYW4gcD10cnVlO31cbiIgKworCQkJImEgOiAoQXxCKSsgO1xuIiArCisJCQkiQSA6ICh7cH0/ICdhJyB7U3lzdGVtLm91dC5wcmludChcIjFcIik7fSkqXG4iICsKKwkJCSIgICAgKCdhJyB7U3lzdGVtLm91dC5wcmludChcIjJcIik7fSkqIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgImFhYSIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCIxMTFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJQcmVkSW5FeGl0QnJhbmNoMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287IiArCisJCQkiQGxleGVyOjptZW1iZXJzIHtib29sZWFuIHA9dHJ1ZTt9XG4iICsKKwkJCSJhIDogKEF8QikrIDtcbiIgKworCQkJIkEgOiAoe3B9PyAnYScge1N5c3RlbS5vdXQucHJpbnQoXCIxXCIpO30gfCApXG4iICsKKwkJCSIgICAgKCdhJyB7U3lzdGVtLm91dC5wcmludChcIjJcIik7fSkqIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgImFhYSIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCIxMjJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJQcmVkSW5FeGl0QnJhbmNoNCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287IiArCisJCQkiYSA6IChBfEIpKyA7XG4iICsKKwkJCSJBIEBpbml0IHtpbnQgbj0wO30gOiAoe248Mn0/ICdhJyB7U3lzdGVtLm91dC5wcmludChuKyspO30pK1xuIiArCisJCQkiICAgICgnYScge1N5c3RlbS5vdXQucHJpbnQoXCJ4XCIpO30pKiA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYWFhYSIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCIwMXh4eFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclByZWRzSW5DeWNsaWNERkEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vOyIgKworCQkJIkBsZXhlcjo6bWVtYmVycyB7Ym9vbGVhbiBwPWZhbHNlO31cbiIgKworCQkJImEgOiAoQXxCKSsgO1xuIiArCisJCQkiQSA6IHtwfT8gKCdhJykrICd4JyAge1N5c3RlbS5vdXQucHJpbnRsbihcInRva2VuIDFcIik7fSA7XG4iICsKKwkJCSJCIDogICAgICAoJ2EnKSsgJ3gnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJ0b2tlbiAyXCIpO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiZm9vLmciLCBncmFtbWFyLCAiZm9vUGFyc2VyIiwgImZvb0xleGVyIiwKKwkJCQkgICAgImEiLCAiYWF4IiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoInRva2VuIDJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJQcmVkc0luQ3ljbGljREZBMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287IiArCisJCQkiQGxleGVyOjptZW1iZXJzIHtib29sZWFuIHA9ZmFsc2U7fVxuIiArCisJCQkiYSA6IChBfEIpKyA7XG4iICsKKwkJCSJBIDoge3B9PyAoJ2EnKSsgJ3gnICgneScpPyB7U3lzdGVtLm91dC5wcmludGxuKFwidG9rZW4gMVwiKTt9IDtcbiIgKworCQkJIkIgOiAgICAgICgnYScpKyAneCcge1N5c3RlbS5vdXQucHJpbnRsbihcInRva2VuIDJcIik7fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYXgiLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygidG9rZW4gMlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHYXRlZFByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vOyIgKworCQkJImEgOiAoQXxCKSsgO1xuIiArCisJCQkiQSA6IHt0cnVlfT89PiAnYScge1N5c3RlbS5vdXQucHJpbnRsbihcInRva2VuIDFcIik7fSA7XG4iICsKKwkJCSJCIDoge2ZhbHNlfT89PignYSd8J2InKSsge1N5c3RlbS5vdXQucHJpbnRsbihcInRva2VuIDJcIik7fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJmb28uZyIsIGdyYW1tYXIsICJmb29QYXJzZXIiLCAiZm9vTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYSIsIGZhbHNlKTsKKwkJLy8gImEiIGlzIGFtYmlnOyBjYW4gbWF0Y2ggYm90aCBBLCBCLiAgUHJlZCBzYXlzIG1hdGNoIEEgdHdpY2UKKwkJYXNzZXJ0RXF1YWxzKCJ0b2tlbiAxXG50b2tlbiAxXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEdhdGVkUHJlZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkiQGxleGVyOjptZW1iZXJzIHtib29sZWFuIHNpZz1mYWxzZTt9XG4iKworCQkJImEgOiAoQXxCKSsgO1xuIiArCisJCQkiQSA6ICdhJyB7U3lzdGVtLm91dC5wcmludChcIkFcIik7IHNpZz10cnVlO30gO1xuIiArCisJCQkiQiA6ICdiJyA7XG4iICsKKwkJCSJDIDoge3NpZ30/PT4gKCdhJ3wnYicpIHtTeXN0ZW0ub3V0LnByaW50KFwiQ1wiKTt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgImFhIiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoIkFDXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFByZWRXaXRoQWN0aW9uVHJhbnNsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkiYSA6IGJbMl0gO1xuIiArCisJCQkiYltpbnQgaV1cbiIgKworCQkJIiAgOiB7JGk9PTF9PyAgICdhJyB7U3lzdGVtLm91dC5wcmludGxuKFwiYWx0IDFcIik7fVxuIiArCisJCQkiICB8IHskYi5pPT0yfT8gJ2EnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJhbHQgMlwiKTt9XG4iICsKKwkJCSIgIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgImFhIiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImFsdCAyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFByZWRpY2F0ZXNPbkVPVFRhcmdldCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBmb287IFxuIiArCisJCQkiQGxleGVyOjptZW1iZXJzIHtib29sZWFuIHA9dHJ1ZSwgcT1mYWxzZTt9IiArCisJCQkiYSA6IEIgO1xuIiArCisJCQkiQTogJzwvJzsgXG4iICsKKwkJCSJCOiB7cH0/ICc8IScge1N5c3RlbS5vdXQucHJpbnRsbihcIkJcIik7fTtcbiIgKworCQkJIkM6IHtxfT8gJzwnIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJDXCIpO307IFxuIiArCisJCQkiRDogJzwnO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoImZvby5nIiwgZ3JhbW1hciwgImZvb1BhcnNlciIsICJmb29MZXhlciIsCisJCQkJICAgICJhIiwgIjwhIiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoIkJcbiIsIGZvdW5kKTsKKwl9CisKKworCS8vIFMgVSBQIFAgTyBSIFQKKworCXB1YmxpYyB2b2lkIF90ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiAgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7Y2hhbm5lbD05OTt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoInQuZyIsIGdyYW1tYXIsICJUIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFiYyAzNCIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJcbiIsIGZvdW5kKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFNlbWFudGljUHJlZGljYXRlcy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U2VtYW50aWNQcmVkaWNhdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyZDc3YgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFNlbWFudGljUHJlZGljYXRlcy5qYXZhCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIuYW5hbHlzaXMuREZBOworaW1wb3J0IG9yZy5hbnRsci5hbmFseXNpcy5EZWNpc2lvblByb2JlOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFudGxyLm1pc2MuQml0U2V0OworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5hbnRsci50b29sLio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2VtYW50aWNQcmVkaWNhdGVzIGV4dGVuZHMgQmFzZVRlc3QgeworCisJLyoqIFB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQgYnkgVGVzdFJpZyAqLworCXB1YmxpYyBUZXN0U2VtYW50aWNQcmVkaWNhdGVzKCkgeworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkc0J1dFN5bnRheFJlc29sdmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiB7cDF9PyBBIHwge3AyfT8gQiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT46czE9PjFcbiIgKworCQkJIi5zMC1CLT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExMXzFfUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDoge3AxfT8gQSB8IHtwMn0/IEEgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEte3AxfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtwMn0/LT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExMXzFfUHJlZF9mb3JjZWRfa18xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHNob3VsZCBzdG9wIGp1c3QgbGlrZSBiZWZvcmUgdy9vIGsgc2V0LgorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIG9wdGlvbnMge2s9MTt9IDoge3AxfT8gQSB8IHtwMn0/IEEgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEte3AxfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtwMn0/LT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExMXzJfUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDoge3AxfT8gQSBCIHwge3AyfT8gQSBCIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMxLUItPi5zMlxuIiArCisJCQkiLnMyLXtwMX0/LT46czM9PjFcbiIgKworCQkJIi5zMi17cDJ9Py0+OnM0PT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkaWNhdGVkTG9vcCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogKCB7cDF9PyBBIHwge3AyfT8gQSApKzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgYmFjaworCQkJIi5zMC1BLT4uczJcbiIgKworCQkJIi5zMC1FT0YtPjpzMT0+M1xuIiArCisJCQkiLnMyLXtwMX0/LT46czM9PjFcbiIgKworCQkJIi5zMi17cDJ9Py0+OnM0PT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkaWNhdGVkVG9TdGF5SW5Mb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiAoIHtwMX0/IEEgKSsgKEEpKzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMxLXtwMX0/LT46czI9PjFcbiIgKworCQkJIi5zMS17dHJ1ZX0/LT46czM9PjJcbiI7ICAgICAgIC8vIGxvb3AgYmFjaworICAgICAgICBjaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBbmRQcmVkaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiB7cDF9PyB7cDFhfT8gQSB8IHtwMn0/IEEgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEteyhwMSYmcDFhKX0/LT46czI9PjFcbiIgKworCQkJIi5zMS17cDJ9Py0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yUHJlZGljYXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogYiB8IHtwMn0/IEEgO1xuIiArCisJCQkiYiA6IHtwMX0/IEEgfCB7cDFhfT8gQSA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS17KHAxYXx8cDEpfT8tPjpzMj0+MVxuIiArCisgICAgICAgICAgICAiLnMxLXtwMn0/LT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdElnbm9yZXNIb2lzdGluZ0RlcHRoR3JlYXRlclRoYW5aZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBBIHtwMX0/IHwgQSB7cDJ9PzsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPjpzMT0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG5ldyBpbnRbXSB7Mn0sCisJCQkJCSAgbmV3IGludFtdIHsxLDJ9LCAiQSIsIG51bGwsIG51bGwsIDIsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SWdub3Jlc1ByZWRzSGlkZGVuQnlBY3Rpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiB7YTF9IHtwMX0/IEEgfCB7YTJ9IHtwMn0/IEEgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbmV3IGludFtdIHsyfSwKKwkJCQkJICBuZXcgaW50W10gezEsMn0sICJBIiwgbnVsbCwgbnVsbCwgMiwgdHJ1ZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdElnbm9yZXNQcmVkc0hpZGRlbkJ5QWN0aW9uc09uZUFsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDoge3AxfT8gQSB8IHthMn0ge3AyfT8gQSA7Iik7IC8vIG9rIHNpbmNlIDEgcHJlZCB2aXNpYmxlCisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworCQkJIi5zMS17cDF9Py0+OnMyPT4xXG4iICsKKwkJCSIuczEte3RydWV9Py0+OnMzPT4yXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwKKwkJCQkJICBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCB0cnVlKTsKKwl9CisKKwkvKgorCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBsZXRlU2VtYW50aWNIb2lzdGVkQ29udGV4dGsyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IGIgfCBBIEI7XG4iICsKKwkJCSJiIDoge3AxfT8gQSBCIHwgQSBCIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMxLUItPjpzMj0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG5ldyBpbnRbXSB7Mn0sCisJCQkJCSAgbmV3IGludFtdIHsxLDJ9LCAiQSBCIiwgbmV3IGludFtdIHsxfSwgbnVsbCwgMyk7CisJfQkKKwkgKi8KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RIb2lzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IGIgfCBjIDtcbiIgKworCQkJImIgOiB7cDF9PyBBIDtcbiIgKworCQkJImMgOiB7cDJ9PyBBIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEte3AxfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtwMn0/LT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEhvaXN0Q29ycmVjdENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IGIgfCB7cDJ9PyBJRCA7XG4iICsKKwkJCSJiIDoge3AxfT8gSUQgfCBJTlQgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPSAgLy8gb25seSB0ZXN0cyBhZnRlciBJRCwgbm90IElOVCA6KQorCQkJIi5zMC1JRC0+LnMxXG4iICsKKwkJCSIuczAtSU5ULT46czI9PjFcbiIgKworCQkJIi5zMS17cDF9Py0+OnMyPT4xXG4iICsKKwkJCSIuczEte3AyfT8tPjpzMz0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFByZWROYWtlZEFsdElzTGFzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDogYiB8IElEIDtcbiIgKworCQkJImIgOiB7cDF9PyBJRCB8IElOVCA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUlELT4uczFcbiIgKworCQkJIi5zMC1JTlQtPjpzMj0+MVxuIiArCisJCQkiLnMxLXtwMX0/LT46czI9PjFcbiIgKworCQkJIi5zMS17dHJ1ZX0/LT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlZmF1bHRQcmVkTmFrZWRBbHROb3RMYXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBJRCB8IGIgO1xuIiArCisJCQkiYiA6IHtwMX0/IElEIHwgSU5UIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtSUQtPi5zMVxuIiArCisJCQkiLnMwLUlOVC0+OnMzPT4yXG4iICsKKwkJCSIuczEteyEocDEpfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtwMX0/LT46czM9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExlZnRSZWN1cnNpdmVQcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIE5vIGFuYWx5c2lzIHBvc3NpYmxlLiBidXQgcHJvYmFibHkgZ29vZCB0byBmYWlsLiAgTm90IHN1cmUgd2UgcmVhbGx5IHdhbnQKKwkJLy8gbGVmdC1yZWN1cnNpb24gZXZlbiBpZiBndWFyZGVkIHdpdGggcHJlZC4KKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkicyA6IGEgO1xuIiArCisJCQkiYSA6IHtwMX0/IGEgfCBJRCA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUlELT4uczFcbiIgKworCQkJIi5zMS17cDF9Py0+OnMyPT4xXG4iICsKKwkJCSIuczEte3RydWV9Py0+OnMzPT4yXG4iOworCisJCURlY2lzaW9uUHJvYmUudmVyYm9zZT10cnVlOyAvLyBtYWtlIHN1cmUgd2UgZ2V0IGFsbCBlcnJvciBpbmZvCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihuZXdUb29sKCksIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlpZiAoIGcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKT09MCApIHsKKwkJCWcuYnVpbGRORkEoKTsKKwkJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisJCX0KKworCQlERkEgZGZhID0gZy5nZXRMb29rYWhlYWRERkEoMSk7CisJCWFzc2VydEVxdWFscyhudWxsLCBkZmEpOyAvLyBjYW4ndCBhbmFseXplLgorCisJCS8qCisJCVN0cmluZyByZXN1bHQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShkZmEuc3RhcnRTdGF0ZSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJCSovCisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBleHBlY3RlZCBwcm9ibGVtcyIsIDEsIGVxdWV1ZS5zaXplKCkpOworCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KDApOworCQlhc3NlcnRUcnVlKCJ3YXJuaW5nIG11c3QgYmUgYSBsZWZ0IHJlY3Vyc2lvbiBtc2ciLAorCQkJCSAgICBtc2cgaW5zdGFuY2VvZiBMZWZ0UmVjdXJzaW9uQ3ljbGVzTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdElnbm9yZVByZWRGcm9tTEwyQWx0TGFzdEFsdElzRGVmYXVsdFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IHtwMX0/IEEgQiB8IEEgQyB8IHtwMn0/IEEgfCB7cDN9PyBBIHwgQSA7XG4iKTsKKwkJLy8gdHdvIHNpdHVhdGlvbnMgb2Ygbm90ZToKKwkJLy8gMS4gQSBCIHN5bnRheCBpcyBlbm91Z2ggdG8gcHJlZGljdCB0aGF0IGFsdCwgc28gcDEgaXMgbm90IHVzZWQKKwkJLy8gICAgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhbHRzIDIuLjUKKwkJLy8gMi4gQWx0cyAzLCA0LCA1IGFyZSBub25kZXRlcm1pbmlzdGljIHdpdGggdXBvbiBBLiAgcDIsIHAzIGFuZCB0aGUKKwkJLy8gICAgY29tcGxlbWVudCBvZiBwMnx8cDMgaXMgc3VmZmljaWVudCB0byByZXNvbHZlIHRoZSBjb25mbGljdC4gRG8KKwkJLy8gICAgbm90IGluY2x1ZGUgYWx0IDEncyBwMSBwcmVkIGluIHRoZSAiY29tcGxlbWVudCBvZiBvdGhlciBhbHRzIgorCQkvLyAgICBiZWNhdXNlIGl0IGlzIG5vdCBjb25zaWRlcmVkIG5vbmRldGVybWluaXN0aWMgd2l0aCBhbHRzIDMuLjUKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMxLUItPjpzMj0+MVxuIiArCisJCQkiLnMxLUMtPjpzMz0+MlxuIiArCisJCQkiLnMxLXtwMn0/LT46czQ9PjNcbiIgKworCQkJIi5zMS17cDN9Py0+OnM1PT40XG4iICsKKwkJCSIuczEte3RydWV9Py0+OnM2PT41XG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVQcmVkRnJvbUxMMkFsdFByZWRVbmlvbk5lZWRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJhIDoge3AxfT8gQSBCIHwgQSBDIHwge3AyfT8gQSB8IEEgfCB7cDN9PyBBIDtcbiIpOworCQkvLyB0d28gc2l0dWF0aW9ucyBvZiBub3RlOgorCQkvLyAxLiBBIEIgc3ludGF4IGlzIGVub3VnaCB0byBwcmVkaWN0IHRoYXQgYWx0LCBzbyBwMSBpcyBub3QgdXNlZAorCQkvLyAgICB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGFsdHMgMi4uNQorCQkvLyAyLiBBbHRzIDMsIDQsIDUgYXJlIG5vbmRldGVybWluaXN0aWMgd2l0aCB1cG9uIEEuICBwMiwgcDMgYW5kIHRoZQorCQkvLyAgICBjb21wbGVtZW50IG9mIHAyfHxwMyBpcyBzdWZmaWNpZW50IHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LiBEbworCQkvLyAgICBub3QgaW5jbHVkZSBhbHQgMSdzIHAxIHByZWQgaW4gdGhlICJjb21wbGVtZW50IG9mIG90aGVyIGFsdHMiCisJCS8vICAgIGJlY2F1c2UgaXQgaXMgbm90IGNvbnNpZGVyZWQgbm9uZGV0ZXJtaW5pc3RpYyB3aXRoIGFsdHMgMy4uNQorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczEtQi0+OnMyPT4xXG4iICsKKwkJCSIuczEtQy0+OnMzPT4yXG4iICsKKwkJCSIuczEteyEoKHAzfHxwMikpfT8tPjpzNT0+NFxuIiArCisJCQkiLnMxLXtwMn0/LT46czQ9PjNcbiIgKworCQkJIi5zMS17cDN9Py0+OnM2PT41XG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkR2V0czJTeW1ib2xTeW50YWN0aWNDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIFA7XG4iKworCQkJImEgOiBiIHwgQSBCIHwgQyA7XG4iICsKKwkJCSJiIDoge3AxfT8gQSBCIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczAtQy0+OnM1PT4zXG4iICsKKwkJCSIuczEtQi0+LnMyXG4iICsKKwkJCSIuczIte3AxfT8tPjpzMz0+MVxuIiArCisJCQkiLnMyLXt0cnVlfT8tPjpzND0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc0xvbmdlc3RUaGVuVGVzdFByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgUDtcbiIrCisJCQkiYSA6IGIgfCBjIDtcbiIgKworCQkJImIgOiB7cH0/IEEgO1xuIiArCisJCQkiYyA6IHtxfT8gKEF8QikrIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMwLUItPjpzMz0+MlxuIiArCisJCQkiLnMxLXtwfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtxfT8tPjpzMz0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UHJlZHNVc2VkQWZ0ZXJSZWN1cnNpb25PdmVyZmxvdygpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhbmFseXNpcyBtdXN0IGJhaWwgb3V0IGR1ZSB0byBub24tTEwoKikgbmF0dXJlIChvdmYpCisJCS8vIHJldHJpZXMgd2l0aCBrPTEgKGJ1dCB3aXRoIExMKCopIGFsZ29yaXRobSBub3Qgb3B0aW1pemVkIHZlcnNpb24KKwkJLy8gYXMgaXQgaGFzIHByZWRzKQorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJzIDoge3AxfT8gZSAnLicgfCB7cDJ9PyBlICc6JyA7XG4iICsKKwkJCSJlIDogJygnIGUgJyknIHwgSU5UIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJygnLT4uczFcbiIgKworCQkJIi5zMC1JTlQtPi5zNFxuIiArCisJCQkiLnMxLXtwMX0/LT46czI9PjFcbiIgKworCQkJIi5zMS17cDJ9Py0+OnMzPT4yXG4iICsKKwkJCSIuczQte3AxfT8tPjpzMj0+MVxuIiArCisJCQkiLnM0LXtwMn0/LT46czM9PjJcbiI7CisJCURlY2lzaW9uUHJvYmUudmVyYm9zZT10cnVlOyAvLyBtYWtlIHN1cmUgd2UgZ2V0IGFsbCBlcnJvciBpbmZvCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihuZXdUb29sKCksIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlpZiAoIGcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKT09MCApIHsKKwkJCWcuYnVpbGRORkEoKTsKKwkJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisJCX0KKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGV4cGVjdGVkIHByb2JsZW1zIiwgMCwgZXF1ZXVlLnNpemUoKSk7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFByZWRzVXNlZEFmdGVySzJGYWlsc05vUmVjdXJzaW9uT3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gYW5hbHlzaXMgbXVzdCBiYWlsIG91dCBkdWUgdG8gbm9uLUxMKCopIG5hdHVyZSAob3ZmKQorCQkvLyByZXRyaWVzIHdpdGggaz0xIChidXQgd2l0aCBMTCgqKSBhbGdvcml0aG0gbm90IG9wdGltaXplZCB2ZXJzaW9uCisJCS8vIGFzIGl0IGhhcyBwcmVkcykKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciBQO1xuIiArCisJCQkib3B0aW9ucyB7az0yO31cbiIrCisJCQkicyA6IHtwMX0/IGUgJy4nIHwge3AyfT8gZSAnOicgO1xuIiArCisJCQkiZSA6ICcoJyBlICcpJyB8IElOVCA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLScoJy0+LnMxXG4iICsKKwkJCSIuczAtSU5ULT4uczZcbiIgKworCQkJIi5zMS0nKCctPi5zMlxuIiArCisJCQkiLnMxLUlOVC0+LnM1XG4iICsKKwkJCSIuczIte3AxfT8tPjpzMz0+MVxuIiArCisJCQkiLnMyLXtwMn0/LT46czQ9PjJcbiIgKworCQkJIi5zNS17cDF9Py0+OnMzPT4xXG4iICsKKwkJCSIuczUte3AyfT8tPjpzND0+MlxuIiArCisJCQkiLnM2LScuJy0+OnMzPT4xXG4iICsKKwkJCSIuczYtJzonLT46czQ9PjJcbiI7CisJCURlY2lzaW9uUHJvYmUudmVyYm9zZT10cnVlOyAvLyBtYWtlIHN1cmUgd2UgZ2V0IGFsbCBlcnJvciBpbmZvCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihuZXdUb29sKCksIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlpZiAoIGcuZ2V0TnVtYmVyT2ZEZWNpc2lvbnMoKT09MCApIHsKKwkJCWcuYnVpbGRORkEoKTsKKwkJCWcuY3JlYXRlTG9va2FoZWFkREZBcyhmYWxzZSk7CisJCX0KKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGV4cGVjdGVkIHByb2JsZW1zIiwgMCwgZXF1ZXVlLnNpemUoKSk7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyTWF0Y2hlc0xvbmdlc3RUaGVuVGVzdFByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJCIDoge3B9PyAnYScgO1xuIiArCisJCQkiQyA6IHtxfT8gKCdhJ3wnYicpKyA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0nYSctPi5zMVxuIiArCisJCQkiLnMwLSdiJy0+OnM0PT4yXG4iICsKKwkJCSIuczEtJ2EnLi4nYictPjpzND0+MlxuIiArCisJCQkiLnMxLTxFT1Q+LT4uczJcbiIgKworCQkJIi5zMi17cH0/LT46czM9PjFcbiIgKworCQkJIi5zMi17cX0/LT46czQ9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMiwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyTWF0Y2hlc0xvbmdlc3RNaW51c1ByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJCIDogJ2EnIDtcbiIgKworCQkJIkMgOiAoJ2EnfCdiJykrIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSdhJy0+LnMxXG4iICsKKwkJCSIuczAtJ2InLT46czM9PjJcbiIgKworCQkJIi5zMS0nYScuLidiJy0+OnMzPT4yXG4iICsKKwkJCSIuczEtPEVPVD4tPjpzMj0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAyLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHYXRlZFByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gZ2F0ZWQgcHJlZHMgYXJlIHByZXNlbnQgb24gYWxsIGFyY3MgaW4gcHJlZGljdG9yCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgUDtcbiIrCisJCQkiQiA6IHtwfT8gPT4gJ2EnIDtcbiIgKworCQkJIkMgOiB7cX0/ID0+ICgnYSd8J2InKSsgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ2EnJiZ7KHF8fHApfT8tPi5zMVxuIiArCisgICAgICAgICAgICAiLnMwLSdiJyYme3F9Py0+OnM0PT4yXG4iICsKKyAgICAgICAgICAgICIuczEtJ2EnLi4nYicmJntxfT8tPjpzND0+MlxuIiArCisgICAgICAgICAgICAiLnMxLTxFT1Q+JiZ7KHF8fHApfT8tPi5zMlxuIiArCisgICAgICAgICAgICAiLnMyLXtwfT8tPjpzMz0+MVxuIiArCisgICAgICAgICAgICAiLnMyLXtxfT8tPjpzND0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAyLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0R2F0ZWRQcmVkSG9pc3RzQW5kQ2FuQmVJblN0b3BTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBJIGZvdW5kIGEgYnVnIHdoZXJlIG1lcmdpbmcgc3RvcCBzdGF0ZXMgbWFkZSB1cyB0aHJvdyBhd2F5CisJCS8vIGEgc3RvcCBzdGF0ZSB3aXRoIGEgZ2F0ZWQgcHJlZCEKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB1O1xuIiArCisJCQkiYSA6IGIrIDtcbiIgKworCQkJImIgOiAneCcgfCB7cH0/PT4gJ3knIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSd4Jy0+OnMyPT4xXG4iICsKKwkJCSIuczAtJ3knJiZ7cH0/LT46czM9PjFcbiIgKworCQkJIi5zMC1FT0YtPjpzMT0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwlAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHYXRlZFByZWRJbkN5Y2xpY0RGQSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIFA7XG4iKworCQkJIkEgOiB7cH0/PT4gKCdhJykrICd4JyA7XG4iICsKKwkJCSJCIDoge3F9Pz0+ICgnYSd8J2InKSsgJ3gnIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLSdhJyYmeyhxfHxwKX0/LT4uczFcbiIgKworICAgICAgICAgICAgIi5zMC0nYicmJntxfT8tPjpzNT0+MlxuIiArCisgICAgICAgICAgICAiLnMxLSdhJyYmeyhxfHxwKX0/LT4uczFcbiIgKworICAgICAgICAgICAgIi5zMS0nYicmJntxfT8tPjpzNT0+MlxuIiArCisgICAgICAgICAgICAiLnMxLSd4JyYmeyhxfHxwKX0/LT4uczJcbiIgKworICAgICAgICAgICAgIi5zMi08RU9UPiYmeyhxfHxwKX0/LT4uczNcbiIgKworICAgICAgICAgICAgIi5zMy17cH0/LT46czQ9PjFcbiIgKworICAgICAgICAgICAgIi5zMy17cX0/LT46czU9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMywgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEdhdGVkUHJlZE5vdEFjdHVhbGx5VXNlZE9uRWRnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciBQO1xuIisKKwkJCSJBIDogKCdhJyB8IHtwfT89PiAnYScpXG4iICsKKwkJCSIgIHwgJ2EnICdiJ1xuIiArCisJCQkiICA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcxID0KKwkJCSIuczAtJ2EnLT4uczFcbiIgKworCQkJIi5zMS17IShwKX0/LT46czI9PjFcbiIgKyAgCS8vIFVzZWQgdG8gZGlzYW1iaWcgc3VicnVsZQorCQkJIi5zMS17cH0/LT46czM9PjJcbiI7CisJCS8vIHJ1bGUgQSBkZWNpc2lvbiBjYW4ndCB0ZXN0IHAgZnJvbSBzMC0+MSBiZWNhdXNlICdhJyBpcyB2YWxpZAorCQkvLyBmb3IgYWx0MSAqYW5kKiBhbHQyIHcvbyBwLiAgQ2FuJ3QgdGVzdCBwIGZyb20gczEgdG8gczMgYmVjYXVzZQorCQkvLyB3ZSBtaWdodCBoYXZlIHBhc3NlZCB0aGUgZmlyc3QgYWx0IG9mIHN1YnJ1bGUuICBUaGUgc2FtZSBzdGF0ZQorCQkvLyBpcyBsaXN0ZWQgaW4gczIgaW4gMiBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnM6IG9uZSB3aXRoIGFuZCBvbmUKKwkJLy8gdy9vIHAuICBDYW4ndCB0ZXN0IHRoZXJlZm9yZS4gIHB8fHRydWUgPT0gdHJ1ZS4KKwkJU3RyaW5nIGV4cGVjdGluZzIgPQorCQkJIi5zMC0nYSctPi5zMVxuIiArCisJCQkiLnMxLSdiJy0+OnMyPT4yXG4iICsKKwkJCSIuczEtPEVPVD4tPjpzMz0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcxLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJCWNoZWNrRGVjaXNpb24oZywgMiwgZXhwZWN0aW5nMiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RHYXRlZFByZWREb2VzTm90Rm9yY2VBbGxUb0JlR2F0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB3O1xuIiArCisJCQkiYSA6IGIgfCBjIDtcbiIgKworCQkJImIgOiB7cH0/IEIgO1xuIiArCisJCQkiYyA6IHtxfT89PiBkIDtcbiIgKworCQkJImQgOiB7cn0/IEMgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1CLT46czE9PjFcbiIgKworCQkJIi5zMC1DJiZ7cX0/LT46czI9PjJcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAwLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEdhdGVkUHJlZERvZXNOb3RGb3JjZUFsbFRvQmVHYXRlZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB3O1xuIiArCisJCQkiYSA6IGIgfCBjIDtcbiIgKworCQkJImIgOiB7cH0/IEIgO1xuIiArCisJCQkiYyA6IHtxfT89PiBkIDtcbiIgKworCQkJImQgOiB7cn0/PT4gQ1xuIiArCisJCQkiICB8IEJcbiIgKworCQkJIiAgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1CLT4uczFcbiIgKworCQkJIi5zMC1DJiZ7KHEmJnIpfT8tPjpzMz0+MlxuIiArCisJCQkiLnMxLXtwfT8tPjpzMj0+MVxuIiArCisJCQkiLnMxLXtxfT8tPjpzMz0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0T1JHYXRlZFByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB3O1xuIiArCisJCQkiYSA6IGIgfCBjIDtcbiIgKworCQkJImIgOiB7cH0/IEIgO1xuIiArCisJCQkiYyA6IHtxfT89PiBkIDtcbiIgKworCQkJImQgOiB7cn0/PT4gQ1xuIiArCisJCQkiICB8IHtzfT89PiBCXG4iICsKKwkJCSIgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQi0+LnMxXG4iICsKKwkJCSIuczAtQyYmeyhxJiZyKX0/LT46czM9PjJcbiIgKworCQkJIi5zMS17KHEmJnMpfT8tPjpzMz0+MlxuIiArCisJCQkiLnMxLXtwfT8tPjpzMj0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwkvKiogVGhlIGZvbGxvd2luZyBncmFtbWFyIHNob3VsZCB5aWVsZCBhbiBlcnJvciB0aGF0IHJ1bGUgJ2EnIGhhcworCSAqICBpbnN1ZmZpY2llbnQgc2VtYW50aWMgaW5mbyBwdWxsZWQgZnJvbSAnYicuCisJICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluY29tcGxldGVTZW1hbnRpY0hvaXN0ZWRDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IGIgfCBCO1xuIiArCisJCQkiYiA6IHtwMX0/IEIgfCBCIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUItPjpzMT0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG5ldyBpbnRbXSB7Mn0sCisJCQkJCSAgbmV3IGludFtdIHsxLDJ9LCAiQiIsIG5ldyBpbnRbXSB7MX0sIG51bGwsIDMsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wbGV0ZVNlbWFudGljSG9pc3RlZENvbnRleHRrMigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiBiIHwgQSBCO1xuIiArCisJCQkiYiA6IHtwMX0/IEEgQiB8IEEgQiA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT4uczFcbiIgKworCQkJIi5zMS1CLT46czI9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBuZXcgaW50W10gezJ9LAorCQkJCQkgIG5ldyBpbnRbXSB7MSwyfSwgIkEgQiIsIG5ldyBpbnRbXSB7MX0sIG51bGwsIDMsIGZhbHNlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5jb21wbGV0ZVNlbWFudGljSG9pc3RlZENvbnRleHRJbkZPTExPVygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJIm9wdGlvbnMge2s9MTt9XG4iICsgLy8gbGltaXQgdG8gaz0xIGJlY2F1c2UgaXQncyBMTCgyKTsgZm9yY2UgcHJlZCBob2lzdAorCQkJImEgOiBBPyA7XG4iICsgLy8gbmVlZCBGT0xMT1cKKwkJCSJiIDogWCBhIHtwMX0/IEEgfCBZIGEgQSA7Iik7IC8vIG9ubHkgb25lIEEgaXMgY292ZXJlZAorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+OnMxPT4xXG4iOyAvLyBzMC1FT0YtPnMyIGJyYW5jaCBwcnVuZWQgZHVyaW5nIG9wdGltaXphdGlvbgorCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbmV3IGludFtdIHsyfSwKKwkJCQkJICBuZXcgaW50W10gezEsMn0sICJBIiwgbmV3IGludFtdIHsyfSwgbnVsbCwgMywgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBsZXRlU2VtYW50aWNIb2lzdGVkQ29udGV4dEluRk9MTE9XazIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogKEEgQik/IDtcbiIgKyAvLyBuZWVkIEZPTExPVworCQkJImIgOiBYIGEge3AxfT8gQSBCIHwgWSBhIEEgQiB8IFogYSA7Iik7IC8vIG9ubHkgZmlyc3QgYWx0IGlzIGNvdmVyZWQKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUEtPi5zMVxuIiArCisJCQkiLnMwLUVPRi0+OnMzPT4yXG4iICsKKwkJCSIuczEtQi0+OnMyPT4xXG4iOworCQljaGVja0RlY2lzaW9uKGcsIDEsIGV4cGVjdGluZywgbnVsbCwKKwkJCQkJICBuZXcgaW50W10gezEsMn0sICJBIEIiLCBuZXcgaW50W10gezJ9LCBudWxsLCAyLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluY29tcGxldGVTZW1hbnRpY0hvaXN0ZWRDb250ZXh0SW5GT0xMT1dEdWVUb0hpZGRlblByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhIDogKEEgQik/IDtcbiIgKyAvLyBuZWVkIEZPTExPVworCQkJImIgOiBYIGEge3AxfT8gQSBCIHwgWSBhIHthMX0ge3AyfT8gQSBCIHwgWiBhIDsiKTsgLy8gb25seSBmaXJzdCBhbHQgaXMgY292ZXJlZAorCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtQS0+LnMxXG4iICsKKwkJCSIuczAtRU9GLT46czM9PjJcbiIgKworCQkJIi5zMS1CLT46czI9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBudWxsLAorCQkJCQkgIG5ldyBpbnRbXSB7MSwyfSwgIkEgQiIsIG5ldyBpbnRbXSB7Mn0sIG51bGwsIDIsIHRydWUpOworCX0KKworCS8qKiBUaGUgZm9sbG93aW5nIGdyYW1tYXIgc2hvdWxkIHlpZWxkIGFuIGVycm9yIHRoYXQgcnVsZSAnYScgaGFzCisJICogIGluc3VmZmljaWVudCBzZW1hbnRpYyBpbmZvIHB1bGxlZCBmcm9tICdiJy4gIFRoaXMgaXMgdGhlIHNhbWUKKwkgKiAgYXMgdGhlIHByZXZpb3VzIGNhc2UgZXhjZXB0IHRoYXQgdGhlIEQgcHJldmVudHMgdGhlIEIgcGF0aCBmcm9tCisJICogICJwaW5jaGluZyIgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBORkEgc3RhdGUuCisJICoKKwkgKiAgVGhpcyB0ZXN0IGFsc28gZGVtb25zdHJhdGVzIHRoYXQganVzdCBiZWNhdXNlIEIgRCBjb3VsZCBwcmVkaWN0CisJICogIGFsdCAxIGluIHJ1bGUgJ2EnLCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBjb250aW51ZSBORkEtPkRGQQorCSAqICBjb252ZXJzaW9uIHRvIGluY2x1ZGUgYW4gZWRnZSBmb3IgRC4gIEFsdCAxIGlzIHRoZSBvbmx5IHBvc3NpYmxlCisJICogIHByZWRpY3Rpb24gYmVjYXVzZSB3ZSByZXNvbHZlIHRoZSBhbWJpZ3VpdHkgYnkgY2hvb3NpbmcgYWx0IDEuCisJICovCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluY29tcGxldGVTZW1hbnRpY0hvaXN0ZWRDb250ZXh0MigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiBiIHwgQjtcbiIgKworCQkJImIgOiB7cDF9PyBCIHwgQiBEIDsiKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLUItPjpzMT0+MVxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG5ldyBpbnRbXSB7Mn0sCisJCQkJCSAgbmV3IGludFtdIHsxLDJ9LCAiQiIsIG5ldyBpbnRbXSB7MX0sCisJCQkJCSAgbnVsbCwgMywgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb29GZXdTZW1hbnRpY1ByZWRpY2F0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IHtwMX0/IEEgfCBBIHwgQSA7Iik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC1BLT46czE9PjFcbiI7CisJCWNoZWNrRGVjaXNpb24oZywgMSwgZXhwZWN0aW5nLCBuZXcgaW50W10gezIsM30sCisJCQkJCSAgbmV3IGludFtdIHsxLDIsM30sICJBIiwKKwkJCQkJICBudWxsLCBudWxsLCAyLCBmYWxzZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFByZWRXaXRoSzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiXHRsZXhlciBncmFtbWFyIFRMZXhlcjtcbiIgKworCQkJIkFcbiIgKworCQkJIm9wdGlvbnMge1xuIiArCisJCQkiICBrPTE7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSIgIDoge3AxfT8gKCd4JykrICcuJ1xuIiArCisJCQkiICB8IHtwMn0/ICgneCcpKyAnLidcbiIgKworCQkJIiAgO1xuIik7CisJCVN0cmluZyBleHBlY3RpbmcgPQorCQkJIi5zMC0neCctPi5zMVxuIiArCisJCQkiLnMxLXtwMX0/LT46czI9PjFcbiIgKworCQkJIi5zMS17cDJ9Py0+OnMzPT4yXG4iOworCQlpbnRbXSB1bnJlYWNoYWJsZUFsdHMgPSBudWxsOworCQlpbnRbXSBub25EZXRBbHRzID0gbnVsbDsKKwkJU3RyaW5nIGFtYmlnSW5wdXQgPSBudWxsOworCQlpbnRbXSBpbnN1ZmZpY2llbnRQcmVkQWx0cyA9IG51bGw7CisJCWludFtdIGRhbmdsaW5nQWx0cyA9IG51bGw7CisJCWludCBudW1XYXJuaW5ncyA9IDA7CisJCWNoZWNrRGVjaXNpb24oZywgMywgZXhwZWN0aW5nLCB1bnJlYWNoYWJsZUFsdHMsCisJCQkJCSAgbm9uRGV0QWx0cywgYW1iaWdJbnB1dCwgaW5zdWZmaWNpZW50UHJlZEFsdHMsCisJCQkJCSAgZGFuZ2xpbmdBbHRzLCBudW1XYXJuaW5ncywgZmFsc2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQcmVkV2l0aEFyYml0cmFyeUxvb2thaGVhZCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJcdGxleGVyIGdyYW1tYXIgVExleGVyO1xuIiArCisJCQkiQSA6IHtwMX0/ICgneCcpKyAnLidcbiIgKworCQkJIiAgfCB7cDJ9PyAoJ3gnKSsgJy4nXG4iICsKKwkJCSIgIDtcbiIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtJ3gnLT4uczFcbiIgKworCQkJIi5zMS0nLictPi5zMlxuIiArCisJCQkiLnMxLSd4Jy0+LnMxXG4iICsKKwkJCSIuczIte3AxfT8tPjpzMz0+MVxuIiArCisJCQkiLnMyLXtwMn0/LT46czQ9PjJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBudWxsOworCQlTdHJpbmcgYW1iaWdJbnB1dCA9IG51bGw7CisJCWludFtdIGluc3VmZmljaWVudFByZWRBbHRzID0gbnVsbDsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMDsKKwkJY2hlY2tEZWNpc2lvbihnLCAzLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBpbnN1ZmZpY2llbnRQcmVkQWx0cywKKwkJCQkJICBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzLCBmYWxzZSk7CisJfQorCisJQFRlc3QKKyAgICAvKiogRm9yIGEgREZBIHN0YXRlIHdpdGggbG90cyBvZiBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUKKwkgKiAgcHJlZGljYXRlLCBkb24ndCBqdXN0IE9SIHRoZW0gYWxsIHRvZ2V0aGVyIGFzIGl0J3MgYSB3YXN0ZSB0bworCSAqICB0ZXN0IGF8fGF8fGJ8fGF8fGEgZXRjLi4uICBBTlRMUiBtYWtlcyBhIHVuaXF1ZSBzZXQgYW5kIFRIRU4KKwkgKiAgT1IncyB0aGVtIHRvZ2V0aGVyLgorCSAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlxdWVQcmVkaWNhdGVPUigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB2O1xuIiArCisJCQkiXG4iICsKKwkJCSJhIDoge2F9PyBiXG4iICsKKwkJCSIgIHwge2J9PyBiXG4iICsKKwkJCSIgIDtcbiIgKworCQkJIlxuIiArCisJCQkiYiA6IHtjfT8gKFgpKyA7XG4iICsKKwkJCSJcbiIgKworCQkJImMgOiBhXG4iICsKKwkJCSIgIHwgYlxuIiArCisJCQkiICA7XG4iKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiLnMwLVgtPi5zMVxuIiArCisgICAgICAgICAgICAiLnMxLXsoKGEmJmMpfHwoYiYmYykpfT8tPjpzMj0+MVxuIiArCisgICAgICAgICAgICAiLnMxLXtjfT8tPjpzMz0+MlxuIjsKKwkJaW50W10gdW5yZWFjaGFibGVBbHRzID0gbnVsbDsKKwkJaW50W10gbm9uRGV0QWx0cyA9IG51bGw7CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gbnVsbDsKKwkJaW50W10gaW5zdWZmaWNpZW50UHJlZEFsdHMgPSBudWxsOworCQlpbnRbXSBkYW5nbGluZ0FsdHMgPSBudWxsOworCQlpbnQgbnVtV2FybmluZ3MgPSAwOworCQljaGVja0RlY2lzaW9uKGcsIDMsIGV4cGVjdGluZywgdW5yZWFjaGFibGVBbHRzLAorCQkJCQkgIG5vbkRldEFsdHMsIGFtYmlnSW5wdXQsIGluc3VmZmljaWVudFByZWRBbHRzLAorCQkJCQkgIGRhbmdsaW5nQWx0cywgbnVtV2FybmluZ3MsIGZhbHNlKTsKKwl9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW1hbnRpY0NvbnRleHRQcmV2ZW50c0Vhcmx5VGVybWluYXRpb25PZkNsb3N1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgVDtcbiIgKworCQkJImEgOiBsb29wIFNFTUkgfCBJRCBTRU1JXG4iICsKKwkJCSIgIDtcbiIgKworCQkJImxvb3BcbiIgKworCQkJIiAgICA6IHt3aGlsZX0/IElEXG4iICsKKwkJCSIgICAgfCB7ZG99PyBJRFxuIiArCisJCQkiICAgIHwge2Zvcn0/IElEXG4iICsKKwkJCSIgICAgOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSIuczAtSUQtPi5zMVxuIiArCisgICAgICAgICAgICAiLnMxLVNFTUktPi5zMlxuIiArCisgICAgICAgICAgICAiLnMyLXsoZm9yfHxkb3x8d2hpbGUpfT8tPjpzMz0+MVxuIiArCisgICAgICAgICAgICAiLnMyLXt0cnVlfT8tPjpzND0+MlxuIjsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIDAsIGZhbHNlKTsKKwl9CisKKwkvLyBTIFUgUCBQIE8gUiBUCisKKwlwdWJsaWMgdm9pZCBfdGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYSA6IEEgfCBCOyIpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSJcbiI7CisJCWludFtdIHVucmVhY2hhYmxlQWx0cyA9IG51bGw7CisJCWludFtdIG5vbkRldEFsdHMgPSBuZXcgaW50W10gezEsMn07CisJCVN0cmluZyBhbWJpZ0lucHV0ID0gIkwgSUQgUiI7CisJCWludFtdIGluc3VmZmljaWVudFByZWRBbHRzID0gbmV3IGludFtdIHsxfTsKKwkJaW50W10gZGFuZ2xpbmdBbHRzID0gbnVsbDsKKwkJaW50IG51bVdhcm5pbmdzID0gMTsKKwkJY2hlY2tEZWNpc2lvbihnLCAxLCBleHBlY3RpbmcsIHVucmVhY2hhYmxlQWx0cywKKwkJCQkJICBub25EZXRBbHRzLCBhbWJpZ0lucHV0LCBpbnN1ZmZpY2llbnRQcmVkQWx0cywKKwkJCQkJICBkYW5nbGluZ0FsdHMsIG51bVdhcm5pbmdzLCBmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tEZWNpc2lvbihHcmFtbWFyIGcsCisJCQkJCQkJCSBpbnQgZGVjaXNpb24sCisJCQkJCQkJCSBTdHJpbmcgZXhwZWN0aW5nLAorCQkJCQkJCQkgaW50W10gZXhwZWN0aW5nVW5yZWFjaGFibGVBbHRzLAorCQkJCQkJCQkgaW50W10gZXhwZWN0aW5nTm9uRGV0QWx0cywKKwkJCQkJCQkJIFN0cmluZyBleHBlY3RpbmdBbWJpZ0lucHV0LAorCQkJCQkJCQkgaW50W10gZXhwZWN0aW5nSW5zdWZmaWNpZW50UHJlZEFsdHMsCisJCQkJCQkJCSBpbnRbXSBleHBlY3RpbmdEYW5nbGluZ0FsdHMsCisJCQkJCQkJCSBpbnQgZXhwZWN0aW5nTnVtV2FybmluZ3MsCisJCQkJCQkJCSBib29sZWFuIGhhc1ByZWRIaWRkZW5CeUFjdGlvbikKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJRGVjaXNpb25Qcm9iZS52ZXJib3NlPXRydWU7IC8vIG1ha2Ugc3VyZSB3ZSBnZXQgYWxsIGVycm9yIGluZm8KKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKG5ld1Rvb2woKSwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCS8vIG1pbWljIGFjdGlvbnMgb2Ygb3JnLmFudGxyLlRvb2wgZmlyc3QgdGltZSBmb3IgZ3JhbW1hciBnCisJCWlmICggZy5nZXROdW1iZXJPZkRlY2lzaW9ucygpPT0wICkgeworCQkJZy5idWlsZE5GQSgpOworCQkJZy5jcmVhdGVMb29rYWhlYWRERkFzKGZhbHNlKTsKKwkJfQorCisJCWlmICggZXF1ZXVlLnNpemUoKSE9ZXhwZWN0aW5nTnVtV2FybmluZ3MgKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIldhcm5pbmdzIGlzc3VlZDogIitlcXVldWUpOworCQl9CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBleHBlY3RlZCBwcm9ibGVtcyIsCisJCQkJICAgZXhwZWN0aW5nTnVtV2FybmluZ3MsIGVxdWV1ZS5zaXplKCkpOworCisJCURGQSBkZmEgPSBnLmdldExvb2thaGVhZERGQShkZWNpc2lvbik7CisJCUZBU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEZBU2VyaWFsaXplcihnKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKGRmYS5zdGFydFN0YXRlKTsKKwkJLy9TeXN0ZW0ub3V0LnByaW50KHJlc3VsdCk7CisJCUxpc3QgdW5yZWFjaGFibGVBbHRzID0gZGZhLmdldFVucmVhY2hhYmxlQWx0cygpOworCisJCS8vIG1ha2Ugc3VyZSB1bnJlYWNoYWJsZSBhbHRzIGFyZSBhcyBleHBlY3RlZAorCQlpZiAoIGV4cGVjdGluZ1VucmVhY2hhYmxlQWx0cyE9bnVsbCApIHsKKwkJCUJpdFNldCBzID0gbmV3IEJpdFNldCgpOworCQkJcy5hZGRBbGwoZXhwZWN0aW5nVW5yZWFjaGFibGVBbHRzKTsKKwkJCUJpdFNldCBzMiA9IG5ldyBCaXRTZXQoKTsKKwkJCXMyLmFkZEFsbCh1bnJlYWNoYWJsZUFsdHMpOworCQkJYXNzZXJ0RXF1YWxzKCJ1bnJlYWNoYWJsZSBhbHRzIG1pc21hdGNoIiwgcywgczIpOworCQl9CisJCWVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKCJ1bnJlYWNoYWJsZSBhbHRzIG1pc21hdGNoIiwgMCwKKwkJCQkJCSB1bnJlYWNoYWJsZUFsdHMhPW51bGw/dW5yZWFjaGFibGVBbHRzLnNpemUoKTowKTsKKwkJfQorCisJCS8vIGNoZWNrIGNvbmZsaWN0aW5nIGlucHV0CisJCWlmICggZXhwZWN0aW5nQW1iaWdJbnB1dCE9bnVsbCApIHsKKwkJCS8vIGZpcnN0LCBmaW5kIG5vbmRldCBtZXNzYWdlCisJCQlNZXNzYWdlIG1zZyA9IGdldE5vbkRldGVybWluaXNtTWVzc2FnZShlcXVldWUud2FybmluZ3MpOworCQkJYXNzZXJ0Tm90TnVsbCgibm8gbm9uZGV0ZXJtaW5pc20gd2FybmluZz8iLCBtc2cpOworCQkJYXNzZXJ0VHJ1ZSgiZXhwZWN0aW5nIG5vbmRldGVybWluaXNtOyBmb3VuZCAiK21zZy5nZXRDbGFzcygpLmdldE5hbWUoKSwKKwkJCW1zZyBpbnN0YW5jZW9mIEdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2UpOworCQkJR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSBub25kZXRNc2cgPQorCQkJCWdldE5vbkRldGVybWluaXNtTWVzc2FnZShlcXVldWUud2FybmluZ3MpOworCQkJTGlzdCBsYWJlbHMgPQorCQkJCW5vbmRldE1zZy5wcm9iZS5nZXRTYW1wbGVOb25EZXRlcm1pbmlzdGljSW5wdXRTZXF1ZW5jZShub25kZXRNc2cucHJvYmxlbVN0YXRlKTsKKwkJCVN0cmluZyBpbnB1dCA9IG5vbmRldE1zZy5wcm9iZS5nZXRJbnB1dFNlcXVlbmNlRGlzcGxheShsYWJlbHMpOworCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZ0FtYmlnSW5wdXQsIGlucHV0KTsKKwkJfQorCisJCS8vIGNoZWNrIG5vbmRldCBhbHRzCisJCWlmICggZXhwZWN0aW5nTm9uRGV0QWx0cyE9bnVsbCApIHsKKwkJCUdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2Ugbm9uZGV0TXNnID0KKwkJCQlnZXROb25EZXRlcm1pbmlzbU1lc3NhZ2UoZXF1ZXVlLndhcm5pbmdzKTsKKwkJCWFzc2VydE5vdE51bGwoImZvdW5kIG5vIG5vbmRldCBhbHRzOyBleHBlY3Rpbmc6ICIrCisJCQkJCQkJCQkJc3RyKGV4cGVjdGluZ05vbkRldEFsdHMpLCBub25kZXRNc2cpOworCQkJTGlzdCBub25EZXRBbHRzID0KKwkJCQlub25kZXRNc2cucHJvYmUuZ2V0Tm9uRGV0ZXJtaW5pc3RpY0FsdHNGb3JTdGF0ZShub25kZXRNc2cucHJvYmxlbVN0YXRlKTsKKwkJCS8vIGNvbXBhcmUgbm9uRGV0QWx0cyB3aXRoIGV4cGVjdGluZ05vbkRldEFsdHMKKwkJCUJpdFNldCBzID0gbmV3IEJpdFNldCgpOworCQkJcy5hZGRBbGwoZXhwZWN0aW5nTm9uRGV0QWx0cyk7CisJCQlCaXRTZXQgczIgPSBuZXcgQml0U2V0KCk7CisJCQlzMi5hZGRBbGwobm9uRGV0QWx0cyk7CisJCQlhc3NlcnRFcXVhbHMoIm5vbmRldCBhbHRzIG1pc21hdGNoIiwgcywgczIpOworCQkJYXNzZXJ0RXF1YWxzKCJtaXNtYXRjaCBiZXR3ZWVuIGV4cGVjdGVkIGhhc1ByZWRIaWRkZW5CeUFjdGlvbiIsIGhhc1ByZWRIaWRkZW5CeUFjdGlvbiwKKwkJCQkJCSBub25kZXRNc2cucHJvYmxlbVN0YXRlLmRmYS5oYXNQcmVkaWNhdGVCbG9ja2VkQnlBY3Rpb24pOworCQl9CisJCWVsc2UgeworCQkJLy8gbm90IGV4cGVjdGluZyBhbnkgbm9uZGV0IGFsdHMsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZQorCQkJR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSBub25kZXRNc2cgPQorCQkJCWdldE5vbkRldGVybWluaXNtTWVzc2FnZShlcXVldWUud2FybmluZ3MpOworCQkJYXNzZXJ0TnVsbCgiZm91bmQgbm9uZGV0IGFsdHMsIGJ1dCBleHBlY3Rpbmcgbm9uZSIsIG5vbmRldE1zZyk7CisJCX0KKworCQlpZiAoIGV4cGVjdGluZ0luc3VmZmljaWVudFByZWRBbHRzIT1udWxsICkgeworCQkJR3JhbW1hckluc3VmZmljaWVudFByZWRpY2F0ZXNNZXNzYWdlIGluc3VmZlByZWRNc2cgPQorCQkJCWdldEdyYW1tYXJJbnN1ZmZpY2llbnRQcmVkaWNhdGVzTWVzc2FnZShlcXVldWUud2FybmluZ3MpOworCQkJYXNzZXJ0Tm90TnVsbCgiZm91bmQgbm8gR3JhbW1hckluc3VmZmljaWVudFByZWRpY2F0ZXNNZXNzYWdlIGFsdHM7IGV4cGVjdGluZzogIisKKwkJCQkJCQkJCQlzdHIoZXhwZWN0aW5nTm9uRGV0QWx0cyksIGluc3VmZlByZWRNc2cpOworCQkJTWFwPEludGVnZXIsIFNldDxUb2tlbj4+IGxvY2F0aW9ucyA9IGluc3VmZlByZWRNc2cuYWx0VG9Mb2NhdGlvbnM7CisJCQlTZXQgYWN0dWFsQWx0cyA9IGxvY2F0aW9ucy5rZXlTZXQoKTsKKwkJCUJpdFNldCBzID0gbmV3IEJpdFNldCgpOworCQkJcy5hZGRBbGwoZXhwZWN0aW5nSW5zdWZmaWNpZW50UHJlZEFsdHMpOworCQkJQml0U2V0IHMyID0gbmV3IEJpdFNldCgpOworCQkJczIuYWRkQWxsKGFjdHVhbEFsdHMpOworCQkJYXNzZXJ0RXF1YWxzKCJtaXNtYXRjaCBiZXR3ZWVuIGluc3VmZmljaWVudGx5IGNvdmVyZWQgYWx0cyIsIHMsIHMyKTsKKwkJCWFzc2VydEVxdWFscygibWlzbWF0Y2ggYmV0d2VlbiBleHBlY3RlZCBoYXNQcmVkSGlkZGVuQnlBY3Rpb24iLCBoYXNQcmVkSGlkZGVuQnlBY3Rpb24sCisJCQkJCQkgaW5zdWZmUHJlZE1zZy5wcm9ibGVtU3RhdGUuZGZhLmhhc1ByZWRpY2F0ZUJsb2NrZWRCeUFjdGlvbik7CisJCX0KKwkJZWxzZSB7CisJCQkvLyBub3QgZXhwZWN0aW5nIGFueSBub25kZXQgYWx0cywgbWFrZSBzdXJlIHRoZXJlIGFyZSBub25lCisJCQlHcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2Ugbm9uZGV0TXNnID0KKwkJCQlnZXRHcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2UoZXF1ZXVlLndhcm5pbmdzKTsKKwkJCWlmICggbm9uZGV0TXNnIT1udWxsICkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlcXVldWUud2FybmluZ3MpOworCQkJfQorCQkJYXNzZXJ0TnVsbCgiZm91bmQgaW5zdWZmaWNpZW50bHkgY292ZXJlZCBhbHRzLCBidXQgZXhwZWN0aW5nIG5vbmUiLCBub25kZXRNc2cpOworCQl9CisKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlwcm90ZWN0ZWQgR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSBnZXROb25EZXRlcm1pbmlzbU1lc3NhZ2UoTGlzdCB3YXJuaW5ncykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHdhcm5pbmdzLnNpemUoKTsgaSsrKSB7CisJCQlNZXNzYWdlIG0gPSAoTWVzc2FnZSkgd2FybmluZ3MuZ2V0KGkpOworCQkJaWYgKCBtIGluc3RhbmNlb2YgR3JhbW1hck5vbkRldGVybWluaXNtTWVzc2FnZSApIHsKKwkJCQlyZXR1cm4gKEdyYW1tYXJOb25EZXRlcm1pbmlzbU1lc3NhZ2UpbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgR3JhbW1hckluc3VmZmljaWVudFByZWRpY2F0ZXNNZXNzYWdlIGdldEdyYW1tYXJJbnN1ZmZpY2llbnRQcmVkaWNhdGVzTWVzc2FnZShMaXN0IHdhcm5pbmdzKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgd2FybmluZ3Muc2l6ZSgpOyBpKyspIHsKKwkJCU1lc3NhZ2UgbSA9IChNZXNzYWdlKSB3YXJuaW5ncy5nZXQoaSk7CisJCQlpZiAoIG0gaW5zdGFuY2VvZiBHcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2UgKSB7CisJCQkJcmV0dXJuIChHcmFtbWFySW5zdWZmaWNpZW50UHJlZGljYXRlc01lc3NhZ2UpbTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIHN0cihpbnRbXSBlbGVtZW50cykgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoIGk+MCApIHsKKwkJCQlidWYuYXBwZW5kKCIsICIpOworCQkJfQorCQkJaW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKKwkJCWJ1Zi5hcHBlbmQoZWxlbWVudCk7CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFNldHMuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFNldHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjIxYmQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U2V0cy5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqIFRlc3QgdGhlIHNldCBzdHVmZiBpbiBsZXhlciBhbmQgcGFyc2VyICovCitwdWJsaWMgY2xhc3MgVGVzdFNldHMgZXh0ZW5kcyBCYXNlVGVzdCB7CisJcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworCS8qKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkIGJ5IFRlc3RSaWcgKi8KKwlwdWJsaWMgVGVzdFNldHMoKSB7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNlcURvZXNOb3RCZWNvbWVTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdGhpcyBtdXN0IHJldHVybiBBIG5vdCBJIHRvIHRoZSBwYXJzZXI7IGNhbGxpbmcgYSBub25mcmFnbWVudCBydWxlCisJCS8vIGZyb20gYSBub25mcmFnbWVudCBydWxlIGRvZXMgbm90IHNldCB0aGUgb3ZlcmFsbCB0b2tlbi4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgUDtcbiIgKworCQkJImEgOiBDIHtTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQpO30gO1xuIiArCisJCQkiZnJhZ21lbnQgQSA6ICcxJyB8ICcyJztcbiIgKworCQkJImZyYWdtZW50IEIgOiAnMycgJzQnO1xuIiArCisJCQkiQyA6IEEgfCBCO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiUC5nIiwgZ3JhbW1hciwgIlBQYXJzZXIiLCAiUExleGVyIiwKKwkJCQkJCQkJICAiYSIsICIzNCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCIzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiB0PSgneCd8J3knKSB7U3lzdGVtLm91dC5wcmludGxuKCR0LnRleHQpO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJ4IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoInhcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyTm90U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogdD1+KCd4J3wneScpICd6JyB7U3lzdGVtLm91dC5wcmludGxuKCR0LnRleHQpO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJ6eiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlck5vdFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogfid4JyAneicge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgInp6IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoInp6XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlck5vdFRva2VuV2l0aExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogdD1+J3gnICd6JyB7U3lzdGVtLm91dC5wcmludGxuKCR0LnRleHQpO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJ6eiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ6XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVBc1NldCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSBAYWZ0ZXIge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA6ICdhJyB8ICdiJyB8J2MnIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYiIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJiXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVBc1NldEFTVCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogJ2EnIHwgJ2InIHwnYycgO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJiIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImJcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90Q2hhcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbigkQS50ZXh0KTt9IDtcbiIgKworCQkJIkEgOiB+J2InIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAieCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsU2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEE/ICdjJyB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiIgKworCQkJIkEgOiAnYicgO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbExleGVyU2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iICsKKwkJCSJBIDogJ2InPyAnYycgO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTdGFyTGV4ZXJTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogQSB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiIgKworCQkJIkEgOiAnYicqICdjJyA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImJiYmJjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImJiYmJjXG4iLCBmb3VuZCk7CisJCWZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UGx1c0xleGVyU2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iICsKKwkJCSJBIDogJ2InKyAnYycgO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJiYmJiYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJiYmJiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbFNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6ICgnYSd8J2InKT8gJ2MnIHtTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQpO30gO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTdGFyU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogKCdhJ3wnYicpKiAnYycge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYWFjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYWFjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBsdXNTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiAoJ2EnfCdiJykrICdjJyB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJhYWMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYWJhYWNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJPcHRpb25hbFNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbihpbnB1dCk7fSA7XG4iICsKKwkJCSJBIDogKCdhJ3wnYicpPyAnYycgO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhYyIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJhY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclN0YXJTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiBBIHtTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQpO30gO1xuIiArCisJCQkiQSA6ICgnYSd8J2InKSogJ2MnIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAiYWJhYWMiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygiYWJhYWNcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJQbHVzU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogQSB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiIgKworCQkJIkEgOiAoJ2EnfCdiJykrICdjJyA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgImFiYWFjIiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoImFiYWFjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdENoYXJTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiBBIHtTeXN0ZW0ub3V0LnByaW50bG4oJEEudGV4dCk7fSA7XG4iICsKKwkJCSJBIDogfignYid8J2MnKSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIngiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygieFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RDaGFyU2V0V2l0aExhYmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIFRoaXMgZG9lc24ndCB3b3JrIGluIGxleGVyIHlldC4KKwkJLy8gR2VuZXJhdGVzOiBoPWlucHV0LkxBKDEpOyBidXQgaCBpcyBkZWZpbmVkIGFzIGEgVG9rZW4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiBBIHtTeXN0ZW0ub3V0LnByaW50bG4oJEEudGV4dCk7fSA7XG4iICsKKwkJCSJBIDogaD1+KCdiJ3wnYycpIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAieCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdENoYXJTZXRXaXRoUnVsZVJlZigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbigkQS50ZXh0KTt9IDtcbiIgKworCQkJIkEgOiB+KCdhJ3xCKSA7XG4iICsKKwkJCSJCIDogJ2InIDtcbiI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAieCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vdENoYXJTZXRXaXRoUnVsZVJlZjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJImEgOiBBIHtTeXN0ZW0ub3V0LnByaW50bG4oJEEudGV4dCk7fSA7XG4iICsKKwkJCSJBIDogfignYSd8QikgO1xuIiArCisJCQkiQiA6ICdiJ3wnYycgO1xuIjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJ4IiwgZGVidWcpOworCQlhc3NlcnRFcXVhbHMoInhcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm90Q2hhclNldFdpdGhSdWxlUmVmMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IEEge1N5c3RlbS5vdXQucHJpbnRsbigkQS50ZXh0KTt9IDtcbiIgKworCQkJIkEgOiAoJ2EnfEIpIDtcbiIgKworCQkJImZyYWdtZW50XG4iICsKKwkJCSJCIDogfignYSd8J2MnKSA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCQkJCQkgICJhIiwgIngiLCBkZWJ1Zyk7CisJCWFzc2VydEVxdWFscygieFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb3RDaGFyU2V0V2l0aFJ1bGVSZWY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogQSB7U3lzdGVtLm91dC5wcmludGxuKCRBLnRleHQpO30gO1xuIiArCisJCQkiQSA6ICgnYSd8QikgO1xuIiArCisJCQkiZnJhZ21lbnRcbiIgKworCQkJIkIgOiB+KCdhJ3xDKSA7XG4iICsKKwkJCSJmcmFnbWVudFxuIiArCisJCQkiQyA6ICdjJ3wnZCcgO1xuICI7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJCQkJCSAgImEiLCAieCIsIGRlYnVnKTsKKwkJYXNzZXJ0RXF1YWxzKCJ4XG4iLCBmb3VuZCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RTeW1ib2xEZWZpbml0aW9ucy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U3ltYm9sRGVmaW5pdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y4N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U3ltYm9sRGVmaW5pdGlvbnMuamF2YQpAQCAtMCwwICsxLDkxMyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmFuYWx5c2lzLkxhYmVsOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUOworaW1wb3J0IG9yZy5hbnRsci50b29sLio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIFRlc3RTeW1ib2xEZWZpbml0aW9ucyBleHRlbmRzIEJhc2VUZXN0IHsKKworCS8qKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkIGJ5IFRlc3RSaWcgKi8KKwlwdWJsaWMgVGVzdFN5bWJvbERlZmluaXRpb25zKCkgeworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJTaW1wbGVUb2tlbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogQSB8IEI7XG4iICsKKwkJCQkiYiA6IEMgOyIpOworCQlTdHJpbmcgcnVsZXMgPSAiYSwgYiI7CisJCVN0cmluZyB0b2tlbk5hbWVzID0gIkEsIEIsIEMiOworCQljaGVja1N5bWJvbHMoZywgcnVsZXMsIHRva2VuTmFtZXMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJUb2tlbnNTZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIiArCisJCQkJInRva2VucyB7XG4iICsKKwkJCQkiICBDO1xuIiArCisJCQkJIiAgRDsiICsKKwkJCQkifVxuIisKKwkJCQkiYSA6IEEgfCBCO1xuIiArCisJCQkJImIgOiBDIDsiKTsKKwkJU3RyaW5nIHJ1bGVzID0gImEsIGIiOworCQlTdHJpbmcgdG9rZW5OYW1lcyA9ICJBLCBCLCBDLCBEIjsKKwkJY2hlY2tTeW1ib2xzKGcsIHJ1bGVzLCB0b2tlbk5hbWVzKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJUb2tlbnNTZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJsZXhlciBncmFtbWFyIHQ7XG4iICsKKwkJCQkidG9rZW5zIHtcbiIgKworCQkJCSIgIEM7XG4iICsKKwkJCQkiICBEOyIgKworCQkJCSJ9XG4iKworCQkJCSJBIDogJ2EnO1xuIiArCisJCQkJIkMgOiAnYycgOyIpOworCQlTdHJpbmcgcnVsZXMgPSAiQSwgQywgVG9rZW5zIjsKKwkJU3RyaW5nIHRva2VuTmFtZXMgPSAiQSwgQywgRCI7CisJCWNoZWNrU3ltYm9scyhnLCBydWxlcywgdG9rZW5OYW1lcyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2Vuc1NlY3Rpb25XaXRoQXNzaWdubWVudFNlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIgKworCQkJCSJ0b2tlbnMge1xuIiArCisJCQkJIiAgQz0nYyc7XG4iICsKKwkJCQkiICBEOyIgKworCQkJCSJ9XG4iKworCQkJCSJhIDogQSB8IEI7XG4iICsKKwkJCQkiYiA6IEMgOyIpOworCQlTdHJpbmcgcnVsZXMgPSAiYSwgYiI7CisJCVN0cmluZyB0b2tlbk5hbWVzID0gIkEsIEIsIEMsIEQsICdjJyI7CisJCWNoZWNrU3ltYm9scyhnLCBydWxlcywgdG9rZW5OYW1lcyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbWJpbmVkR3JhbW1hckxpdGVyYWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIHQ7XG4iKworCQkJCSJhIDogJ2JlZ2luJyBiICdlbmQnO1xuIiArCisJCQkJImIgOiBDICc7JyA7XG4iICsKKwkJCQkiSUQgOiAnYScgO1xuIiArCisJCQkJIkZPTyA6ICdmb28nIDtcbiIgKyAgLy8gImZvbyIgaXMgbm90IGEgdG9rZW4gbmFtZQorCQkJCSJDIDogJ2MnIDtcbiIpOyAgICAgICAgLy8gbm9yIGlzICdjJworCQlTdHJpbmcgcnVsZXMgPSAiYSwgYiI7CisJCVN0cmluZyB0b2tlbk5hbWVzID0gIkMsIEZPTywgSUQsICdiZWdpbicsICdlbmQnLCAnOyciOworCQljaGVja1N5bWJvbHMoZywgcnVsZXMsIHRva2VuTmFtZXMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsSW5QYXJzZXJBbmRMZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyAneCcgaXMgdG9rZW4gYW5kIGNoYXIgaW4gbGV4ZXIgcnVsZQorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkJImEgOiAneCcgRSA7IFxuIiArCisJCQkJIkU6ICd4JyAnMCcgO1xuIik7ICAgICAgICAvLyBub3IgaXMgJ2MnCisJCVN0cmluZyBsaXRlcmFscyA9ICJbJ3gnXSI7CisJCVN0cmluZyBmb3VuZExpdGVyYWxzID0gZy5nZXRTdHJpbmdMaXRlcmFscygpLnRvU3RyaW5nKCk7CisJCWFzc2VydEVxdWFscyhsaXRlcmFscywgZm91bmRMaXRlcmFscyk7CisKKwkJU3RyaW5nIGltcGxpY2l0TGV4ZXIgPQorCQkJImxleGVyIGdyYW1tYXIgdDsiICsgbmV3bGluZSArCisJCQkiVF9fNSA6ICd4JyA7IiArIG5ld2xpbmUgKworCQkJIiIgKyBuZXdsaW5lICsKKwkJCSIvLyAkQU5UTFIgc3JjIFwiPHN0cmluZz5cIiAzIiArIG5ld2xpbmUgKworCQkJIkU6ICd4JyAnMCcgOyI7CisJCWFzc2VydEVxdWFscyhpbXBsaWNpdExleGVyLCBnLmdldExleGVyR3JhbW1hcigpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWRHcmFtbWFyV2l0aFJlZlRvTGl0ZXJhbEJ1dE5vVG9rZW5JRFJlZigpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6ICdhJyA7XG4iICsKKwkJCQkiQSA6ICdhJyA7XG4iKTsKKwkJU3RyaW5nIHJ1bGVzID0gImEiOworCQlTdHJpbmcgdG9rZW5OYW1lcyA9ICJBLCAnYSciOworCQljaGVja1N5bWJvbHMoZywgcnVsZXMsIHRva2VuTmFtZXMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXREb2VzTm90TWlzc1Rva2VuQWxpYXNlcygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6ICdhJ3wnYicgO1xuIiArCisJCQkJIkEgOiAnYScgO1xuIiArCisJCQkJIkIgOiAnYicgO1xuIik7CisJCVN0cmluZyBydWxlcyA9ICJhIjsKKwkJU3RyaW5nIHRva2VuTmFtZXMgPSAiQSwgJ2EnLCBCLCAnYiciOworCQljaGVja1N5bWJvbHMoZywgcnVsZXMsIHRva2VuTmFtZXMpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQbHVzRXF1YWxMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBpZHMrPUlEICggQ09NTUEgaWRzKz1JRCApKiA7XG4iKTsKKwkJU3RyaW5nIHJ1bGUgPSAiYSI7CisJCVN0cmluZyB0b2tlbkxhYmVscyA9ICJpZHMiOworCQlTdHJpbmcgcnVsZUxhYmVscyA9IG51bGw7CisJCWNoZWNrUGx1c0VxdWFsc0xhYmVscyhnLCBydWxlLCB0b2tlbkxhYmVscywgcnVsZUxhYmVscyk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE1peGVkUGx1c0VxdWFsTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkJImEgOiBpZCs9SUQgKCAnLCcgZSs9ZXhwciApKiA7XG4iICsKKwkJCQkiZXhwciA6ICdlJztcbiIgKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlTdHJpbmcgcnVsZSA9ICJhIjsKKwkJU3RyaW5nIHRva2VuTGFiZWxzID0gImlkIjsKKwkJU3RyaW5nIHJ1bGVMYWJlbHMgPSAiZSI7CisJCWNoZWNrUGx1c0VxdWFsc0xhYmVscyhnLCBydWxlLCB0b2tlbkxhYmVscywgcnVsZUxhYmVscyk7CisJfQorCisJLy8gVCBFIFMgVCAgTCBJIFQgRSBSIEEgTCAgRSBTIEMgQSBQIEUgUworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlckNoYXJMaXRlcmFsV2l0aEVzY2FwZSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6ICdcXG4nO1xuIik7CisJCVNldCBsaXRlcmFscyA9IGcuZ2V0U3RyaW5nTGl0ZXJhbHMoKTsKKwkJLy8gbXVzdCBzdG9yZSBsaXRlcmFscyBob3cgdGhleSBhcHBlYXIgaW4gdGhlIGFudGxyIGdyYW1tYXIKKwkJYXNzZXJ0RXF1YWxzKCInXFxuJyIsIGxpdGVyYWxzLnRvQXJyYXkoKVswXSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuSW5Ub2tlbnNTZWN0aW9uQW5kVG9rZW5SdWxlRGVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHRoaXMgbXVzdCByZXR1cm4gQSBub3QgSSB0byB0aGUgcGFyc2VyOyBjYWxsaW5nIGEgbm9uZnJhZ21lbnQgcnVsZQorCQkvLyBmcm9tIGEgbm9uZnJhZ21lbnQgcnVsZSBkb2VzIG5vdCBzZXQgdGhlIG92ZXJhbGwgdG9rZW4uCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFA7XG4iICsKKwkJCSJ0b2tlbnMgeyBCPSd9JzsgfVxuIisKKwkJCSJhIDogQSBCIHtTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQpO30gO1xuIisKKwkJCSJBIDogJ2EnIDtcbiIgKworCQkJIkIgOiAnfScgO1xuIisKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7IjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiUC5nIiwgZ3JhbW1hciwgIlBQYXJzZXIiLCAiUExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhfSIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJhfVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkluVG9rZW5zU2VjdGlvbkFuZFRva2VuUnVsZURlZjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gdGhpcyBtdXN0IHJldHVybiBBIG5vdCBJIHRvIHRoZSBwYXJzZXI7IGNhbGxpbmcgYSBub25mcmFnbWVudCBydWxlCisJCS8vIGZyb20gYSBub25mcmFnbWVudCBydWxlIGRvZXMgbm90IHNldCB0aGUgb3ZlcmFsbCB0b2tlbi4KKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgUDtcbiIgKworCQkJInRva2VucyB7IEI9J30nOyB9XG4iKworCQkJImEgOiBBICd9JyB7U3lzdGVtLm91dC5wcmludGxuKGlucHV0KTt9IDtcbiIrCisJCQkiQSA6ICdhJyA7XG4iICsKKwkJCSJCIDogJ30nIHsvKiAqL30gO1xuIisKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7IjsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiUC5nIiwgZ3JhbW1hciwgIlBQYXJzZXIiLCAiUExleGVyIiwKKwkJCQkJCQkJICAiYSIsICJhfSIsIGZhbHNlKTsKKwkJYXNzZXJ0RXF1YWxzKCJhfVxuIiwgZm91bmQpOworCX0KKworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlZlRvUnVsZVdpdGhOb1JldHVyblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKworCQlTdHJpbmcgZ3JhbW1hclN0ciA9CisJCQkiZ3JhbW1hciBQO1xuIiArCisJCQkiYSA6IHg9YiA7XG4iICsKKwkJCSJiIDogQiA7XG4iICsKKwkJCSJCIDogJ2InIDtcbiI7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGdyYW1tYXJTdHIpOworCisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlTVCByZWNvZ1NUID0gZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsKKwkJU3RyaW5nIGNvZGUgPSByZWNvZ1NULnJlbmRlcigpOworCQlhc3NlcnRUcnVlKCJub3QgZXhwZWN0aW5nIGxhYmVsIiwgY29kZS5pbmRleE9mKCJ4PWIoKTsiKTwwKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCS8vIFQgRSBTIFQgIEUgUiBSIE8gUiBTCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyU3RyaW5nTGl0ZXJhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiAnYmVnaW4nIGIgO1xuIiArCisJCQkJImIgOiBDIDsiKTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIidiZWdpbiciOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTElURVJBTF9OT1RfQVNTT0NJQVRFRF9XSVRIX0xFWEVSX1JVTEU7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlckNoYXJMaXRlcmFscygpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCQkiYSA6ICcoJyBiIDtcbiIgKworCQkJCSJiIDogQyA7Iik7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICInKCciOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTElURVJBTF9OT1RfQVNTT0NJQVRFRF9XSVRIX0xFWEVSX1JVTEU7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEVtcHR5Tm90Q2hhcigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJncmFtbWFyIGZvbztcbiIgKworCQkJCSJhIDogKH4neCcpKyA7XG4iKTsKKwkJZy5idWlsZE5GQSgpOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiJ3gnIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0VNUFRZX0NPTVBMRU1FTlQ7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEVtcHR5Tm90VG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciBmb287XG4iICsKKwkJCQkiYSA6ICh+QSkrIDtcbiIpOworCQlnLmJ1aWxkTkZBKCk7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJBIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0VNUFRZX0NPTVBMRU1FTlQ7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEVtcHR5Tm90U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgZm9vO1xuIiArCisJCQkJImEgOiAofihBfEIpKSsgO1xuIik7CisJCWcuYnVpbGRORkEoKTsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gbnVsbDsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0VNUFRZX0NPTVBMRU1FTlQ7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpdGVyYWxJblBhcnNlclRva2Vuc1NlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIgKworCQkJCSJ0b2tlbnMge1xuIiArCisJCQkJIiAgQj0nYmVnaW4nO1xuIiArCisJCQkJIn1cbiIrCisJCQkJImEgOiBBIEI7XG4iICsKKwkJCQkiYiA6IEMgOyIpOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiJ2JlZ2luJyI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MSVRFUkFMX05PVF9BU1NPQ0lBVEVEX1dJVEhfTEVYRVJfUlVMRTsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2hhckxpdGVyYWxJblBhcnNlclRva2Vuc1NlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIgKworCQkJCSJ0b2tlbnMge1xuIiArCisJCQkJIiAgQj0nKCc7XG4iICsKKwkJCQkifVxuIisKKwkJCQkiYSA6IEEgQjtcbiIgKworCQkJCSJiIDogQyA7Iik7CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICInKCciOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTElURVJBTF9OT1RfQVNTT0NJQVRFRF9XSVRIX0xFWEVSX1JVTEU7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENoYXJMaXRlcmFsSW5MZXhlclRva2Vuc1NlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIiArCisJCQkJInRva2VucyB7XG4iICsKKwkJCQkiICBCPScoJztcbiIgKworCQkJCSJ9XG4iKworCQkJCSJJRCA6ICdhJztcbiIpOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiJygnIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0NBTk5PVF9BTElBU19UT0tFTlNfSU5fTEVYRVI7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVSZWRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiBBIHwgQjtcbiIgKworCQkJCSJhIDogQyA7Iik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImEiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfUlVMRV9SRURFRklOSVRJT047CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyUnVsZVJlZGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJCSJJRCA6ICdhJyA7XG4iICsKKwkJCQkiSUQgOiAnZCcgOyIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJRCI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19SVUxFX1JFREVGSU5JVElPTjsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWRSdWxlUmVkZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJInggOiBJRCA7XG4iICsKKwkJCQkiSUQgOiAnYScgO1xuIiArCisJCQkJInggOiBJRCBJRCA7Iik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIngiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfUlVMRV9SRURFRklOSVRJT047CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFVuZGVmaW5lZFRva2VuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJInggOiBJRCA7Iik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIklEIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX05PX1RPS0VOX0RFRklOSVRJT047CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NXYXJuaW5nKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VW5kZWZpbmVkVG9rZW5Pa0luUGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJCSJ4IDogSUQgOyIpOworCQlhc3NlcnRFcXVhbHMoInNob3VsZCBub3QgYmUgYW4gZXJyb3IiLCAwLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFVuZGVmaW5lZFJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkiZ3JhbW1hciB0O1xuIisKKwkJCQkieCA6IHIgOyIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJyIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1VOREVGSU5FRF9SVUxFX1JFRjsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGV4ZXJSdWxlSW5QYXJzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkJIlggOiA7Iik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIlgiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEVYRVJfUlVMRVNfTk9UX0FMTE9XRUQ7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlclJ1bGVJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiA7Iik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImEiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfUEFSU0VSX1JVTEVTX05PVF9BTExPV0VEOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlU2NvcGVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkic2NvcGUgYSB7XG4iICsKKwkJCSIgIGludCBuO1xuIiArCisJCQkifVxuIiArCisJCQkiYSA6IFxuIiArCisJCQkiICA7XG4iKTsKKworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiYSI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19TWU1CT0xfQ09ORkxJQ1RTX1dJVEhfR0xPQkFMX1NDT1BFOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlblJ1bGVTY29wZUNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIisKKwkJCSJzY29wZSBJRCB7XG4iICsKKwkJCSIgIGludCBuO1xuIiArCisJCQkifVxuIiArCisJCQkiSUQgOiAnYSdcbiIgKworCQkJIiAgO1xuIik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIklEIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1NZTUJPTF9DT05GTElDVFNfV0lUSF9HTE9CQUxfU0NPUEU7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuU2NvcGVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIrCisJCQkidG9rZW5zIHsgSUQ7IH1cbiIrCisJCQkic2NvcGUgSUQge1xuIiArCisJCQkiICBpbnQgbjtcbiIgKworCQkJIn1cbiIgKworCQkJImEgOiBcbiIgKworCQkJIiAgO1xuIik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIklEIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1NZTUJPTF9DT05GTElDVFNfV0lUSF9HTE9CQUxfU0NPUEU7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuUnVsZVNjb3BlQ29uZmxpY3RJbkxleGVyR3JhbW1hcigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkic2NvcGUgSUQge1xuIiArCisJCQkiICBpbnQgbjtcbiIgKworCQkJIn1cbiIgKworCQkJIklEIDogJ2EnXG4iICsKKwkJCSIgIDtcbiIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJRCI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19TWU1CT0xfQ09ORkxJQ1RTX1dJVEhfR0xPQkFMX1NDT1BFOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUb2tlbkxhYmVsU2NvcGVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJInNjb3BlIHMge1xuIiArCisJCQkiICBpbnQgbjtcbiIgKworCQkJIn1cbiIgKworCQkJImEgOiBzPUlEIFxuIiArCisJCQkiICA7XG4iKTsKKworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAicyI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19TWU1CT0xfQ09ORkxJQ1RTX1dJVEhfR0xPQkFMX1NDT1BFOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlTGFiZWxTY29wZUNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkic2NvcGUgcyB7XG4iICsKKwkJCSIgIGludCBuO1xuIiArCisJCQkifVxuIiArCisJCQkiYSA6IHM9YiBcbiIgKworCQkJIiAgO1xuIiArCisJCQkiYiA6IDtcbiIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJzIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1NZTUJPTF9DT05GTElDVFNfV0lUSF9HTE9CQUxfU0NPUEU7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhYmVsQW5kUnVsZU5hbWVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiBjPWIgXG4iICsKKwkJCSIgIDtcbiIgKworCQkJImIgOiA7XG4iICsKKwkJCSJjIDogO1xuIik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImMiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfQ09ORkxJQ1RTX1dJVEhfUlVMRTsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxBbmRUb2tlbk5hbWVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgOiBJRD1iIFxuIiArCisJCQkiICA7XG4iICsKKwkJCSJiIDogSUQgO1xuIiArCisJCQkiYyA6IDtcbiIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJJRCI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MQUJFTF9DT05GTElDVFNfV0lUSF9UT0tFTjsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxBbmRBcmdDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImFbaW50IGldIHJldHVybnMgW2ludCB4XTogaT1JRCBcbiIgKworCQkJIiAgO1xuIik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImkiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfTEFCRUxfQ09ORkxJQ1RTX1dJVEhfUlVMRV9BUkdfUkVUVkFMOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMYWJlbEFuZFBhcmFtZXRlckNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkicGFyc2VyIGdyYW1tYXIgdDtcbiIrCisJCQkiYVtpbnQgaV0gcmV0dXJucyBbaW50IHhdOiB4PUlEIFxuIiArCisJCQkiICA7XG4iKTsKKworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAieCI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MQUJFTF9DT05GTElDVFNfV0lUSF9SVUxFX0FSR19SRVRWQUw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExhYmVsUnVsZVNjb3BlQ29uZmxpY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJwYXJzZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJhXG4iICsKKwkJCSJzY29wZSB7IiArCisJCQkiICBpbnQgbjsiICsKKwkJCSJ9XG4iICsKKwkJCSIgIDogbj1JRFxuIiArCisJCQkiICA7XG4iKTsKKworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAibiI7CisJCU9iamVjdCBleHBlY3RlZEFyZzIgPSAiYSI7CisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19MQUJFTF9DT05GTElDVFNfV0lUSF9SVUxFX1NDT1BFX0FUVFJJQlVURTsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRBcmcyKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSdWxlU2NvcGVBcmdDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImFbaW50IG5dXG4iICsKKwkJCSJzY29wZSB7IiArCisJCQkiICBpbnQgbjsiICsKKwkJCSJ9XG4iICsKKwkJCSIgIDogXG4iICsKKwkJCSIgIDtcbiIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJuIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJhIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0FUVFJJQlVURV9DT05GTElDVFNfV0lUSF9SVUxFX0FSR19SRVRWQUw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZVNjb3BlUmV0dXJuVmFsdWVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImEgcmV0dXJucyBbaW50IG5dXG4iICsKKwkJCSJzY29wZSB7IiArCisJCQkiICBpbnQgbjsiICsKKwkJCSJ9XG4iICsKKwkJCSIgIDogXG4iICsKKwkJCSIgIDtcbiIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJuIjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnMiA9ICJhIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0FUVFJJQlVURV9DT05GTElDVFNfV0lUSF9SVUxFX0FSR19SRVRWQUw7CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcsIGV4cGVjdGVkQXJnMik7CisJCWNoZWNrR3JhbW1hclNlbWFudGljc0Vycm9yKGVxdWV1ZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UnVsZVNjb3BlUnVsZU5hbWVDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7IC8vIHVuaXF1ZSBsaXN0ZW5lciBwZXIgdGhyZWFkCisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJInBhcnNlciBncmFtbWFyIHQ7XG4iKworCQkJImFcbiIgKworCQkJInNjb3BlIHsiICsKKwkJCSIgIGludCBhOyIgKworCQkJIn1cbiIgKworCQkJIiAgOiBcbiIgKworCQkJIiAgO1xuIik7CisKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gImEiOworCQlPYmplY3QgZXhwZWN0ZWRBcmcyID0gbnVsbDsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0FUVFJJQlVURV9DT05GTElDVFNfV0lUSF9SVUxFOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnLCBleHBlY3RlZEFyZzIpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEJhZEdyYW1tYXJPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOyAvLyB1bmlxdWUgbGlzdGVuZXIgcGVyIHRocmVhZAorCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcihhbnRsciwKKwkJCQkJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJCQkJCSJvcHRpb25zIHtmb289MzsgbGFuZ3VhZ2U9SmF2YTt9XG4iICsKKwkJCQkJCQkJImEgOiAnYSc7XG4iKTsKKworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAiZm9vIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0lMTEVHQUxfT1BUSU9OOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCYWRSdWxlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImFcbiIrCisJCQkJIm9wdGlvbnMge2s9MzsgdG9rZW5Wb2NhYj1ibG9ydDt9XG4iICsKKwkJCQkiICA6ICdhJztcbiIpOworCisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICJ0b2tlblZvY2FiIjsKKwkJaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX0lMTEVHQUxfT1BUSU9OOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tHcmFtbWFyU2VtYW50aWNzRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCYWRTdWJSdWxlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsgLy8gdW5pcXVlIGxpc3RlbmVyIHBlciB0aHJlYWQKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkJImdyYW1tYXIgdDtcbiIrCisJCQkJImEgOiAoIG9wdGlvbnMge2s9MzsgbGFuZ3VhZ2U9SmF2YTt9XG4iICsKKwkJCQkiICAgIDogJ2EnXG4iICsKKwkJCQkiICAgIHwgJ2InXG4iICsKKwkJCQkiICAgIClcbiIgKworCQkJCSIgIDtcbiIpOworCQlPYmplY3QgZXhwZWN0ZWRBcmcgPSAibGFuZ3VhZ2UiOworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfSUxMRUdBTF9PUFRJT047CisJCUdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSA9CisJCQluZXcgR3JhbW1hclNlbWFudGljc01lc3NhZ2UoZXhwZWN0ZWRNc2dJRCwgZywgbnVsbCwgZXhwZWN0ZWRBcmcpOworCQljaGVja0dyYW1tYXJTZW1hbnRpY3NFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRva2VuVm9jYWJTdHJpbmdVc2VkSW5MZXhlcigpIHRocm93cyBFeGNlcHRpb24geworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCVN0cmluZyB0b2tlbnMgPQorCQkJIic7Jz00XG4iOworICAgICAgICBta2Rpcih0bXBkaXIpOworICAgICAgICB3cml0ZUZpbGUodG1wZGlyLCAiVC50b2tlbnMiLCB0b2tlbnMpOworCisJCVN0cmluZyBpbXBvcnRlciA9CisJCQkibGV4ZXIgZ3JhbW1hciBCOyBcbiIgKworCQkJIm9wdGlvbnNcdHt0b2tlblZvY2FiPVQ7fSBcbiIgKworCQkJIlNFTUk6JzsnIDsgXG4iIDsKKwkJd3JpdGVGaWxlKHRtcGRpciwgIkIuZyIsIGltcG9ydGVyKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2wobmV3IFN0cmluZ1tdIHsiLWxpYiIsIHRtcGRpcn0pOworCQlDb21wb3NpdGVHcmFtbWFyIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVHcmFtbWFyKCk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKGFudGxyLHRtcGRpcisiL0IuZyIsY29tcG9zaXRlKTsKKwkJZy5wYXJzZUFuZEJ1aWxkQVNUKCk7CisJCWcuY29tcG9zaXRlLmFzc2lnblRva2VuVHlwZXMoKTsKKworCQlTdHJpbmcgZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwID0gIltTRU1JPTRdIjsKKwkJU3RyaW5nIGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCA9ICJ7JzsnPTR9IjsKKwkJU3RyaW5nIGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0ID0gIltTRU1JXSI7CisKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9rZW5JRFRvVHlwZU1hcCwKKwkJCQkJIHJlYWxFbGVtZW50cyhnLmNvbXBvc2l0ZS50b2tlbklEVG9UeXBlTWFwKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nTGl0ZXJhbFRvVHlwZU1hcCwgZy5jb21wb3NpdGUuc3RyaW5nTGl0ZXJhbFRvVHlwZU1hcC50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZVRvVG9rZW5MaXN0LAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnR5cGVUb1Rva2VuTGlzdCkudG9TdHJpbmcoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGVycm9yczogIitlcXVldWUsIDAsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5Wb2NhYlN0cmluZ1VzZWRJbkNvbWJpbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJU3RyaW5nIHRva2VucyA9CisJCQkiJzsnPTRcbiI7CisgICAgICAgIG1rZGlyKHRtcGRpcik7CisJCXdyaXRlRmlsZSh0bXBkaXIsICJULnRva2VucyIsIHRva2Vucyk7CisKKwkJU3RyaW5nIGltcG9ydGVyID0KKwkJCSJncmFtbWFyIEI7IFxuIiArCisJCQkib3B0aW9uc1x0e3Rva2VuVm9jYWI9VDt9IFxuIiArCisJCQkiU0VNSTonOycgOyBcbiIgOworCQl3cml0ZUZpbGUodG1wZGlyLCAiQi5nIiwgaW1wb3J0ZXIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbChuZXcgU3RyaW5nW10geyItbGliIiwgdG1wZGlyfSk7CisJCUNvbXBvc2l0ZUdyYW1tYXIgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUdyYW1tYXIoKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoYW50bHIsdG1wZGlyKyIvQi5nIixjb21wb3NpdGUpOworCQlnLnBhcnNlQW5kQnVpbGRBU1QoKTsKKwkJZy5jb21wb3NpdGUuYXNzaWduVG9rZW5UeXBlcygpOworCisJCVN0cmluZyBleHBlY3RlZFRva2VuSURUb1R5cGVNYXAgPSAiW1NFTUk9NF0iOworCQlTdHJpbmcgZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwID0gInsnOyc9NH0iOworCQlTdHJpbmcgZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QgPSAiW1NFTUldIjsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb2tlbklEVG9UeXBlTWFwLAorCQkJCQkgcmVhbEVsZW1lbnRzKGcuY29tcG9zaXRlLnRva2VuSURUb1R5cGVNYXApLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmdMaXRlcmFsVG9UeXBlTWFwLCBnLmNvbXBvc2l0ZS5zdHJpbmdMaXRlcmFsVG9UeXBlTWFwLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlVG9Ub2tlbkxpc3QsCisJCQkJCSByZWFsRWxlbWVudHMoZy5jb21wb3NpdGUudHlwZVRvVG9rZW5MaXN0KS50b1N0cmluZygpKTsKKworCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgMCwgZXF1ZXVlLmVycm9ycy5zaXplKCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrUGx1c0VxdWFsc0xhYmVscyhHcmFtbWFyIGcsCisJCQkJCQkJCQkJIFN0cmluZyBydWxlTmFtZSwKKwkJCQkJCQkJCQkgU3RyaW5nIHRva2VuTGFiZWxzU3RyLAorCQkJCQkJCQkJCSBTdHJpbmcgcnVsZUxhYmVsc1N0cikKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLy8gbWFrZSBzdXJlIGV4cGVjdGVkICs9IGxhYmVscyBhcmUgdGhlcmUKKwkJUnVsZSByID0gZy5nZXRSdWxlKHJ1bGVOYW1lKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0b2tlbkxhYmVsc1N0ciwgIiwgIik7CisJCVNldCB0b2tlbkxhYmVscyA9IG51bGw7CisJCXdoaWxlICggc3QuaGFzTW9yZVRva2VucygpICkgeworCQkJaWYgKCB0b2tlbkxhYmVscz09bnVsbCApIHsKKwkJCQl0b2tlbkxhYmVscyA9IG5ldyBIYXNoU2V0KCk7CisJCQl9CisJCQlTdHJpbmcgbGFiZWxOYW1lID0gc3QubmV4dFRva2VuKCk7CisJCQl0b2tlbkxhYmVscy5hZGQobGFiZWxOYW1lKTsKKwkJfQorCQlTZXQgcnVsZUxhYmVscyA9IG51bGw7CisJCWlmICggcnVsZUxhYmVsc1N0ciE9bnVsbCApIHsKKwkJCXN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihydWxlTGFiZWxzU3RyLCAiLCAiKTsKKwkJCXJ1bGVMYWJlbHMgPSBuZXcgSGFzaFNldCgpOworCQkJd2hpbGUgKCBzdC5oYXNNb3JlVG9rZW5zKCkgKSB7CisJCQkJU3RyaW5nIGxhYmVsTmFtZSA9IHN0Lm5leHRUb2tlbigpOworCQkJCXJ1bGVMYWJlbHMuYWRkKGxhYmVsTmFtZSk7CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZSgidG9rZW4gKz0gbGFiZWxzIG1pc21hdGNoOyAiK3Rva2VuTGFiZWxzKyIhPSIrci50b2tlbkxpc3RMYWJlbHMsCisJCQkJICAgKHRva2VuTGFiZWxzIT1udWxsICYmIHIudG9rZW5MaXN0TGFiZWxzIT1udWxsKSB8fAorCQkJCSAgICh0b2tlbkxhYmVscz09bnVsbCAmJiByLnRva2VuTGlzdExhYmVscz09bnVsbCkpOworCQlhc3NlcnRUcnVlKCJydWxlICs9IGxhYmVscyBtaXNtYXRjaDsgIitydWxlTGFiZWxzKyIhPSIrci5ydWxlTGlzdExhYmVscywKKwkJCQkgICAocnVsZUxhYmVscyE9bnVsbCAmJiByLnJ1bGVMaXN0TGFiZWxzIT1udWxsKSB8fAorCQkJCSAgIChydWxlTGFiZWxzPT1udWxsICYmIHIucnVsZUxpc3RMYWJlbHM9PW51bGwpKTsKKwkJaWYgKCB0b2tlbkxhYmVscyE9bnVsbCApIHsKKwkJCWFzc2VydEVxdWFscyh0b2tlbkxhYmVscywgci50b2tlbkxpc3RMYWJlbHMua2V5U2V0KCkpOworCQl9CisJCWlmICggcnVsZUxhYmVscyE9bnVsbCApIHsKKwkJCWFzc2VydEVxdWFscyhydWxlTGFiZWxzLCByLnJ1bGVMaXN0TGFiZWxzLmtleVNldCgpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrU3ltYm9scyhHcmFtbWFyIGcsCisJCQkJCQkJCVN0cmluZyBydWxlc1N0ciwKKwkJCQkJCQkJU3RyaW5nIHRva2Vuc1N0cikKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJU2V0IHRva2VucyA9IGcuZ2V0VG9rZW5EaXNwbGF5TmFtZXMoKTsKKworCQkvLyBtYWtlIHN1cmUgZXhwZWN0ZWQgdG9rZW5zIGFyZSB0aGVyZQorCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRva2Vuc1N0ciwgIiwgIik7CisJCXdoaWxlICggc3QuaGFzTW9yZVRva2VucygpICkgeworCQkJU3RyaW5nIHRva2VuTmFtZSA9IHN0Lm5leHRUb2tlbigpOworCQkJYXNzZXJ0VHJ1ZSgidG9rZW4gIit0b2tlbk5hbWUrIiBleHBlY3RlZCIsCisJCQkJCSAgIGcuZ2V0VG9rZW5UeXBlKHRva2VuTmFtZSkhPUxhYmVsLklOVkFMSUQpOworCQkJdG9rZW5zLnJlbW92ZSh0b2tlbk5hbWUpOworCQl9CisJCS8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm90IGFueSBvdGhlcnMgKG90aGVyIHRoYW4gPEVPRj4gZXRjLi4uKQorCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b2tlbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgdG9rZW5OYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIHRva2VuIG5hbWUgIit0b2tlbk5hbWUsCisJCQkJCSAgIGcuZ2V0VG9rZW5UeXBlKHRva2VuTmFtZSk8TGFiZWwuTUlOX1RPS0VOX1RZUEUpOworCQl9CisKKwkJLy8gbWFrZSBzdXJlIGFsbCBleHBlY3RlZCBydWxlcyBhcmUgdGhlcmUKKwkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJ1bGVzU3RyLCAiLCAiKTsKKwkJaW50IG4gPSAwOworCQl3aGlsZSAoIHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKKwkJCVN0cmluZyBydWxlTmFtZSA9IHN0Lm5leHRUb2tlbigpOworCQkJYXNzZXJ0Tm90TnVsbCgicnVsZSAiK3J1bGVOYW1lKyIgZXhwZWN0ZWQiLCBnLmdldFJ1bGUocnVsZU5hbWUpKTsKKwkJCW4rKzsKKwkJfQorCQlDb2xsZWN0aW9uIHJ1bGVzID0gZy5nZXRSdWxlcygpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicnVsZXM9IitydWxlcyk7CisJCS8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gZXh0cmEgcnVsZXMKKwkJYXNzZXJ0RXF1YWxzKCJudW1iZXIgb2YgcnVsZXMgbWlzbWF0Y2g7IGV4cGVjdGluZyAiK24rIjsgZm91bmQgIitydWxlcy5zaXplKCksIG4sIHJ1bGVzLnNpemUoKSk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFN5bnRhY3RpY1ByZWRpY2F0ZUV2YWx1YXRpb24uamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFN5bnRhY3RpY1ByZWRpY2F0ZUV2YWx1YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDgwNzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0U3ludGFjdGljUHJlZGljYXRlRXZhbHVhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RTeW50YWN0aWNQcmVkaWNhdGVFdmFsdWF0aW9uIGV4dGVuZHMgQmFzZVRlc3QgeworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUd29QcmVkc1dpdGhOYWtlZEFsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkicyA6IChhICc7JykrIDtcbiIgKworCQkJImFcbiIgKworCQkJIm9wdGlvbnMge1xuIiArCisJCQkiICBrPTE7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSIgIDogKGIgJy4nKT0+IGIgJy4nIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJhbHQgMVwiKTt9XG4iICsKKwkJCSIgIHwgKGIpPT4gYiB7U3lzdGVtLm91dC5wcmludGxuKFwiYWx0IDJcIik7fVxuIiArCisJCQkiICB8IGMgICAgICAge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdCAzXCIpO31cbiIgKworCQkJIiAgO1xuIiArCisJCQkiYlxuIiArCisJCQkiQGluaXQge1N5c3RlbS5vdXQucHJpbnRsbihcImVudGVyIGJcIik7fVxuIiArCisJCQkiICAgOiAnKCcgJ3gnICcpJyA7XG4iICsKKwkJCSJjXG4iICsKKwkJCSJAaW5pdCB7U3lzdGVtLm91dC5wcmludGxuKFwiZW50ZXIgY1wiKTt9XG4iICsKKwkJCSIgICA6ICcoJyBjICcpJyB8ICd4JyA7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpKyB7JGNoYW5uZWw9SElEREVOO31cbiIgKworCQkJIiAgIDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICIoeCkgOyIsIGZhbHNlKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9CisJCQkiZW50ZXIgYlxuIiArCisJCQkiZW50ZXIgYlxuIiArCisJCQkiZW50ZXIgYlxuIiArCisJCQkiYWx0IDJcbiI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkgICAgImEiLCAiKHgpLiA7IiwgZmFsc2UpOworCQlleHBlY3RpbmcgPQorCQkJImVudGVyIGJcbiIgKworCQkJImVudGVyIGJcbiIgKworCQkJImFsdCAxXG4iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJICAgICJhIiwgIigoeCkpIDsiLCBmYWxzZSk7CisJCWV4cGVjdGluZyA9CisJCQkiZW50ZXIgYlxuIiArCisJCQkiZW50ZXIgYlxuIiArCisJCQkiZW50ZXIgY1xuIiArCisJCQkiZW50ZXIgY1xuIiArCisJCQkiZW50ZXIgY1xuIiArCisJCQkiYWx0IDNcbiI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VHdvUHJlZHNXaXRoTmFrZWRBbHROb3RMYXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJzIDogKGEgJzsnKSsgO1xuIiArCisJCQkiYVxuIiArCisJCQkib3B0aW9ucyB7XG4iICsKKwkJCSIgIGs9MTtcbiIgKworCQkJIn1cbiIgKworCQkJIiAgOiAoYiAnLicpPT4gYiAnLicge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdCAxXCIpO31cbiIgKworCQkJIiAgfCBjICAgICAgIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJhbHQgMlwiKTt9XG4iICsKKwkJCSIgIHwgKGIpPT4gYiB7U3lzdGVtLm91dC5wcmludGxuKFwiYWx0IDNcIik7fVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJiXG4iICsKKwkJCSJAaW5pdCB7U3lzdGVtLm91dC5wcmludGxuKFwiZW50ZXIgYlwiKTt9XG4iICsKKwkJCSIgICA6ICcoJyAneCcgJyknIDtcbiIgKworCQkJImNcbiIgKworCQkJIkBpbml0IHtTeXN0ZW0ub3V0LnByaW50bG4oXCJlbnRlciBjXCIpO31cbiIgKworCQkJIiAgIDogJygnIGMgJyknIHwgJ3gnIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykrIHskY2hhbm5lbD1ISURERU47fVxuIiArCisJCQkiICAgO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgIih4KSA7IiwgZmFsc2UpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSJlbnRlciBiXG4iICsKKwkJCSJlbnRlciBjXG4iICsKKwkJCSJlbnRlciBjXG4iICsKKwkJCSJhbHQgMlxuIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCSAgICAiYSIsICIoeCkuIDsiLCBmYWxzZSk7CisJCWV4cGVjdGluZyA9CisJCQkiZW50ZXIgYlxuIiArCisJCQkiZW50ZXIgYlxuIiArCisJCQkiYWx0IDFcbiI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkgICAgImEiLCAiKCh4KSkgOyIsIGZhbHNlKTsKKwkJZXhwZWN0aW5nID0KKwkJCSJlbnRlciBiXG4iICsKKwkJCSJlbnRlciBjXG4iICsKKwkJCSJlbnRlciBjXG4iICsKKwkJCSJlbnRlciBjXG4iICsKKwkJCSJhbHQgMlxuIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclByZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJInMgOiBBIDtcbiIgKworCQkJIkEgb3B0aW9ucyB7az0xO31cbiIgKyAvLyBmb3JjZSBiYWNrdHJhY2tpbmcKKwkJCSIgIDogKEIgJy4nKT0+QiAnLicge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDFcIik7fVxuIiArCisJCQkiICB8IEIge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDJcIik7fSIgKworCQkJIiAgO1xuIiArCisJCQkiZnJhZ21lbnRcbiIgKworCQkJIkIgOiAneCcrIDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAicyIsICJ4eHgiLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJhbHQyXG4iLCBmb3VuZCk7CisKKwkJZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJICAgICJzIiwgInh4eC4iLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJhbHQxXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExleGVyV2l0aFByZWRMb25nZXJUaGFuQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJzIDogQSA7XG4iICsKKwkJCSJBIG9wdGlvbnMge2s9MTt9XG4iICsgLy8gZm9yY2UgYmFja3RyYWNraW5nCisJCQkiICA6IChCICcuJyk9PkIge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDFcIik7fVxuIiArCisJCQkiICB8IEIge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDJcIik7fSIgKworCQkJIiAgO1xuIiArCisJCQkiRCA6ICcuJyB7U3lzdGVtLm91dC5wcmludGxuKFwiRFwiKTt9IDtcbiIgKworCQkJImZyYWdtZW50XG4iICsKKwkJCSJCIDogJ3gnKyA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgInMiLCAieHh4IiwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiYWx0MlxuIiwgZm91bmQpOworCisJCWZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCSAgICAicyIsICJ4eHguIiwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiYWx0MVxuRFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclByZWRDeWNsaWNQcmVkaWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJzIDogQSA7XG4iICsKKwkJCSJBIDogKEIpPT4oQnwneScrKSB7U3lzdGVtLm91dC5wcmludGxuKFwiYWx0MVwiKTt9XG4iICsKKwkJCSIgIHwgQiB7U3lzdGVtLm91dC5wcmludGxuKFwiYWx0MlwiKTt9XG4iICsKKwkJCSIgIHwgJ3knKyAnOyciICsKKwkJCSIgIDtcbiIgKworCQkJImZyYWdtZW50XG4iICsKKwkJCSJCIDogJ3gnKyA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgInMiLCAieHh4IiwgZmFsc2UpOworCisJCWFzc2VydEVxdWFscygiYWx0MVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZXhlclByZWRDeWNsaWNQcmVkaWN0aW9uMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkicyA6IEEgO1xuIiArCisJCQkiQSA6IChCICcuJyk9PihCfCd5JyspIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJhbHQxXCIpO31cbiIgKworCQkJIiAgfCBCIHtTeXN0ZW0ub3V0LnByaW50bG4oXCJhbHQyXCIpO31cbiIgKworCQkJIiAgfCAneScrICc7JyIgKworCQkJIiAgO1xuIiArCisJCQkiZnJhZ21lbnRcbiIgKworCQkJIkIgOiAneCcrIDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAicyIsICJ4eHgiLCBmYWxzZSk7CisJCWFzc2VydEVxdWFscygiYWx0MlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVOZXN0ZWRQcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJzIDogKGV4cHIgJzsnKSsgO1xuIiArCisJCQkiZXhwclxuIiArCisJCQkib3B0aW9ucyB7XG4iICsKKwkJCSIgIGs9MTtcbiIgKworCQkJIn1cbiIgKworCQkJIkBpbml0IHtTeXN0ZW0ub3V0LnByaW50bG4oXCJlbnRlciBleHByIFwiK2lucHV0LkxUKDEpLmdldFRleHQoKSk7fVxuIiArCisJCQkiICA6IChhdG9tICd4JykgPT4gYXRvbSAneCdcbiIgKworCQkJIiAgfCBhdG9tXG4iICsKKwkJCSI7XG4iICsKKwkJCSJhdG9tXG4iICsKKwkJCSJAaW5pdCB7U3lzdGVtLm91dC5wcmludGxuKFwiZW50ZXIgYXRvbSBcIitpbnB1dC5MVCgxKS5nZXRUZXh0KCkpO31cbiIgKworCQkJIiAgIDogJygnIGV4cHIgJyknXG4iICsKKwkJCSIgICB8IElOVFxuIiArCisJCQkiICAgO1xuIiArCisJCQkiSU5UOiAnMCcuLic5JysgO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSsgeyRjaGFubmVsPUhJRERFTjt9XG4iICsKKwkJCSIgICA7XG4iIDsKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1BhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVExleGVyIiwKKwkJCQkgICAgInMiLCAiKDM0KXg7IiwgZmFsc2UpOworCQlTdHJpbmcgZXhwZWN0aW5nID0KKwkJCSJlbnRlciBleHByIChcbiIgKworCQkJImVudGVyIGF0b20gKFxuIiArCisJCQkiZW50ZXIgZXhwciAzNFxuIiArCisJCQkiZW50ZXIgYXRvbSAzNFxuIiArCisJCQkiZW50ZXIgYXRvbSAzNFxuIiArCisJCQkiZW50ZXIgYXRvbSAoXG4iICsKKwkJCSJlbnRlciBleHByIDM0XG4iICsKKwkJCSJlbnRlciBhdG9tIDM0XG4iICsKKwkJCSJlbnRlciBhdG9tIDM0XG4iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRyaXBsZU5lc3RlZFByZWRJbkxleGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJzIDogKC4pKyB7U3lzdGVtLm91dC5wcmludGxuKFwiZG9uZVwiKTt9IDtcbiIgKworCQkJIkVYUFJcbiIgKworCQkJIm9wdGlvbnMge1xuIiArCisJCQkiICBrPTE7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJAaW5pdCB7U3lzdGVtLm91dC5wcmludGxuKFwiZW50ZXIgZXhwciBcIisoY2hhcilpbnB1dC5MVCgxKSk7fVxuIiArCisJCQkiICA6IChBVE9NICd4JykgPT4gQVRPTSAneCcge1N5c3RlbS5vdXQucHJpbnRsbihcIkFUT00geFwiKTt9XG4iICsKKwkJCSIgIHwgQVRPTSB7U3lzdGVtLm91dC5wcmludGxuKFwiQVRPTSBcIiskQVRPTS50ZXh0KTt9XG4iICsKKwkJCSI7XG4iICsKKwkJCSJmcmFnbWVudCBBVE9NXG4iICsKKwkJCSJAaW5pdCB7U3lzdGVtLm91dC5wcmludGxuKFwiZW50ZXIgYXRvbSBcIisoY2hhcilpbnB1dC5MVCgxKSk7fVxuIiArCisJCQkiICAgOiAnKCcgRVhQUiAnKSdcbiIgKworCQkJIiAgIHwgSU5UXG4iICsKKwkJCSIgICA7XG4iICsKKwkJCSJmcmFnbWVudCBJTlQ6ICcwJy4uJzknKyA7XG4iICsKKwkJCSJmcmFnbWVudCBXUyA6ICgnICd8J1xcbicpKyBcbiIgKworCQkJIiAgIDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAicyIsICIoKDM0KXgpeCIsIGZhbHNlKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9IC8vIGhhcyBubyBtZW1vaXphdGlvbgorCQkJImVudGVyIGV4cHIgKFxuIiArCisJCQkiZW50ZXIgYXRvbSAoXG4iICsKKwkJCSJlbnRlciBleHByIChcbiIgKworCQkJImVudGVyIGF0b20gKFxuIiArCisJCQkiZW50ZXIgZXhwciAzXG4iICsKKwkJCSJlbnRlciBhdG9tIDNcbiIgKworCQkJImVudGVyIGF0b20gM1xuIiArCisJCQkiZW50ZXIgYXRvbSAoXG4iICsKKwkJCSJlbnRlciBleHByIDNcbiIgKworCQkJImVudGVyIGF0b20gM1xuIiArCisJCQkiZW50ZXIgYXRvbSAzXG4iICsKKwkJCSJlbnRlciBhdG9tIChcbiIgKworCQkJImVudGVyIGV4cHIgKFxuIiArCisJCQkiZW50ZXIgYXRvbSAoXG4iICsKKwkJCSJlbnRlciBleHByIDNcbiIgKworCQkJImVudGVyIGF0b20gM1xuIiArCisJCQkiZW50ZXIgYXRvbSAzXG4iICsKKwkJCSJlbnRlciBhdG9tIChcbiIgKworCQkJImVudGVyIGV4cHIgM1xuIiArCisJCQkiZW50ZXIgYXRvbSAzXG4iICsKKwkJCSJlbnRlciBhdG9tIDNcbiIgKworCQkJIkFUT00gMzRcbiIgKworCQkJIkFUT00geFxuIiArCisJCQkiQVRPTSB4XG4iICsKKwkJCSJkb25lXG4iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRyZWVQYXJzZXJXaXRoU3luUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UKyAoUEVSSU9EfFNFTUkpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiU0VNSSA6ICc7JyA7XG4iKworCQkJIlBFUklPRCA6ICcuJyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iICsKKwkJCSJvcHRpb25zIHtrPTE7IGJhY2t0cmFjaz10cnVlOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBJRCBJTlQrIFBFUklPRCB7U3lzdGVtLm91dC5wcmludChcImFsdCAxXCIpO30iKworCQkJIiAgfCBJRCBJTlQrIFNFTUkgICB7U3lzdGVtLm91dC5wcmludChcImFsdCAyXCIpO31cbiIgKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhIDEgMiAzOyIpOworCQlhc3NlcnRFcXVhbHMoImFsdCAyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFRyZWVQYXJzZXJXaXRoTmVzdGVkU3luUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UKyAoUEVSSU9EfFNFTUkpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiU0VNSSA6ICc7JyA7XG4iKworCQkJIlBFUklPRCA6ICcuJyA7XG4iKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJLy8gYmFja3RyYWNrcyBpbiBhIGFuZCBiIGR1ZSB0byBrPTEKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iICsKKwkJCSJvcHRpb25zIHtrPTE7IGJhY2t0cmFjaz10cnVlOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBJRCBiIHtTeXN0ZW0ub3V0LnByaW50KFwiIGE6YWx0IDFcIik7fSIrCisJCQkiICB8IElEIElOVCsgU0VNSSAgIHtTeXN0ZW0ub3V0LnByaW50KFwiIGE6YWx0IDJcIik7fVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJiIDogSU5UIFBFUklPRCAge1N5c3RlbS5vdXQucHJpbnQoXCJiOmFsdCAxXCIpO30iICsgLy8gY2hvb3NlIHRoaXMgYWx0IGZvciBqdXN0IG9uZSBJTlQKKwkJCSIgIHwgSU5UKyBQRVJJT0Qge1N5c3RlbS5vdXQucHJpbnQoXCJiOmFsdCAyXCIpO30iICsKKwkJCSIgIDsiOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImEgMSAyIDMuIik7CisJCWFzc2VydEVxdWFscygiYjphbHQgMiBhOmFsdCAxXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5blByZWRXaXRoT3V0cHV0VGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gcmVhbGx5IGp1c3Qgc2VlaW5nIGlmIGl0IHdpbGwgY29tcGlsZQorCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PXRlbXBsYXRlO31cbiIgKworCQkJImFcbiIgKworCQkJIm9wdGlvbnMge1xuIiArCisJCQkiICBrPTE7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSIgIDogKCd4JysgJ3knKT0+ICd4JysgJ3knIC0+IHRlbXBsYXRlKGE9eyR0ZXh0fSkgPDwxOjxhPjs+PlxuIiArCisJCQkiICB8ICd4JysgJ3onIC0+IHRlbXBsYXRlKGE9eyR0ZXh0fSkgPDwyOjxhPjs+PlxuIisKKwkJCSIgIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykrIHskY2hhbm5lbD1ISURERU47fVxuIiArCisJCQkiICAgO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgInh4eHkiLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCIxOnh4eHk7XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFN5blByZWRXaXRoT3V0cHV0QVNUKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIHJlYWxseSBqdXN0IHNlZWluZyBpZiBpdCB3aWxsIGNvbXBpbGUKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYVxuIiArCisJCQkib3B0aW9ucyB7XG4iICsKKwkJCSIgIGs9MTtcbiIgKworCQkJIn1cbiIgKworCQkJIiAgOiAoJ3gnKyAneScpPT4gJ3gnKyAneSdcbiIgKworCQkJIiAgfCAneCcrICd6J1xuIisKKwkJCSIgIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykrIHskY2hhbm5lbD1ISURERU47fVxuIiArCisJCQkiICAgO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgInh4eHkiLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJ4IHggeCB5XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsQmxvY2tXaXRoU3luUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkJIlxuIiArCisJCQkJImEgOiAoIChiKT0+IGIge1N5c3RlbS5vdXQucHJpbnRsbihcImJcIik7fSk/IGIgO1xuIiArCisJCQkJImIgOiAneCcgO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgInh4IiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoImJcbiIsIGZvdW5kKTsKKwkJZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJ4IiwgZmFsc2UpOworCQlhc3NlcnRFcXVhbHMoIiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3luUHJlZEsyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGFsbCBtYW51YWxseSBzcGVjaWZpZWQgc3luIHByZWRpY2F0ZXMgYXJlIGdhdGVkIChpLmUuLCBmb3JjZWQKKwkJLy8gdG8gZXhlY3V0ZSkuCisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCQkiXG4iICsKKwkJCQkiYSA6IChiKT0+IGIge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDFcIik7fSB8ICdhJyAnYycgO1xuIiArCisJCQkJImIgOiAnYScgJ2InIDtcbiIgOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLAorCQkJCSAgICAiYSIsICJhYiIsIGZhbHNlKTsKKworCQlhc3NlcnRFcXVhbHMoImFsdDFcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3luUHJlZEtTdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCQkiXG4iICsKKwkJCQkiYSA6IChiKT0+IGIge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdDFcIik7fSB8ICdhJysgJ2MnIDtcbiIgKworCQkJCSJiIDogJ2EnKyAnYicgO1xuIiA7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsCisJCQkJICAgICJhIiwgImFhYWIiLCBmYWxzZSk7CisKKwkJYXNzZXJ0RXF1YWxzKCJhbHQxXG4iLCBmb3VuZCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RTeW50YXhFcnJvcnMuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFN5bnRheEVycm9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWQ5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RTeW50YXhFcnJvcnMuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBUZXJlbmNlIFBhcnIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKiB0ZXN0IHJ1bnRpbWUgcGFyc2UgZXJyb3JzICovCitwdWJsaWMgY2xhc3MgVGVzdFN5bnRheEVycm9ycyBleHRlbmRzIEJhc2VUZXN0IHsKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TEwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJhIDogJ2EnICdiJyIgKworCQkJIiAgfCAnYScgJ2MnIiArCisJCQkiO1xuIiArCisJCQkicSA6ICdlJyA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLCAiYSIsICJhZSIsIGZhbHNlKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJsaW5lIDE6MSBubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgJ2UnXG4iOworCQlTdHJpbmcgcmVzdWx0ID0gc3RkZXJyRHVyaW5nUGFyc2U7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExMMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6ICdhJyAnYicqICdjJyIgKworCQkJIiAgfCAnYScgJ2InICdkJyIgKworCQkJIiAgO1xuIiArCisJCQkicSA6ICdlJyA7XG4iOworCQlTeXN0ZW0ub3V0LnByaW50bG4oZ3JhbW1hcik7CisJCVN0cmluZyBmb3VuZCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsICJhIiwgImFiZSIsIGZhbHNlKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJsaW5lIDE6MiBubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgaW5wdXQgJ2UnXG4iOworCQlTdHJpbmcgcmVzdWx0ID0gc3RkZXJyRHVyaW5nUGFyc2U7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExMU3RhcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6ICdhJysgJ2InIiArCisJCQkiICB8ICdhJysgJ2MnIiArCisJCQkiO1xuIiArCisJCQkicSA6ICdlJyA7XG4iOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLCAiYSIsICJhYWFlIiwgZmFsc2UpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImxpbmUgMTozIG5vIHZpYWJsZSBhbHRlcm5hdGl2ZSBhdCBpbnB1dCAnZSdcbiI7CisJCVN0cmluZyByZXN1bHQgPSBzdGRlcnJEdXJpbmdQYXJzZTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3luUHJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkiYSA6IChlICcuJyk9PiBlICcuJyIgKworCQkJIiAgfCAoZSAnOycpPT4gZSAnOyciICsKKwkJCSIgIHwgJ3onIiArCisJCQkiICA7XG4iICsKKwkJCSJlIDogJygnIGUgJyknIiArCisJCQkiICB8ICdpJyIgKworCQkJIiAgO1xuIjsKKwkJU3lzdGVtLm91dC5wcmludGxuKGdyYW1tYXIpOworCQlTdHJpbmcgZm91bmQgPSBleGVjUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUTGV4ZXIiLCAiYSIsICIoKGkpKXoiLCBmYWxzZSk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAibGluZSAxOjAgbm8gdmlhYmxlIGFsdGVybmF0aXZlIGF0IGlucHV0ICcoJ1xuIjsKKwkJU3RyaW5nIHJlc3VsdCA9IHN0ZGVyckR1cmluZ1BhcnNlOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMTDFFcnJvckluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJInN0YXJ0IDogYW5pbWFsIChBTkQgYWNDbGFzcyk/IHNlcnZpY2UgRU9GO1xuIiArCisJCQkiYW5pbWFsIDogKERPRyB8IENBVCApO1xuIiArCisJCQkic2VydmljZSA6IChIQVJEV0FSRSB8IFNPRlRXQVJFKSA7XG4iICsKKwkJCSJBTkQgOiAnYW5kJztcbiIgKworCQkJIkRPRyA6ICdkb2cnO1xuIiArCisJCQkiQ0FUIDogJ2NhdCc7XG4iICsKKwkJCSJIQVJEV0FSRTogJ2hhcmR3YXJlJztcbiIgKworCQkJIlNPRlRXQVJFOiAnc29mdHdhcmUnO1xuIiArCisJCQkiV1MgOiAnICcge3NraXAoKTt9IDsiICsKKwkJCSJhY0NsYXNzXG4iICsKKwkJCSJAaW5pdFxuIiArCisJCQkieyBTeXN0ZW0ub3V0LnByaW50bG4oY29tcHV0ZUNvbnRleHRTZW5zaXRpdmVSdWxlRk9MTE9XKCkudG9TdHJpbmcodG9rZW5OYW1lcykpOyB9XG4iICsKKwkJCSIgIDogO1xuIjsKKwkJU3RyaW5nIHJlc3VsdCA9IGV4ZWNQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRMZXhlciIsICJzdGFydCIsICJkb2cgYW5kIHNvZnR3YXJlIiwgZmFsc2UpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIntIQVJEV0FSRSxTT0ZUV0FSRX1cbiI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VGVtcGxhdGVzLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUZW1wbGF0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI2MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VGVtcGxhdGVzLmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5Ub29sOworaW1wb3J0IG9yZy5hbnRsci5jb2RlZ2VuLkNvZGVHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQU5UTFJQYXJzZXI7CitpbXBvcnQgb3JnLmFudGxyLmdyYW1tYXIudjMuQWN0aW9uVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5Db21tb25Ub2tlbjsKK2ltcG9ydCBvcmcuc3RyaW5ndGVtcGxhdGUudjQuU1Q7CitpbXBvcnQgb3JnLnN0cmluZ3RlbXBsYXRlLnY0LlNUR3JvdXA7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuRXJyb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkdyYW1tYXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hclNlbWFudGljc01lc3NhZ2U7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuTWVzc2FnZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqIFRlc3QgdGVtcGxhdGVzIGluIGFjdGlvbnM7ICUuLi4gc2hvcnRoYW5kcyAqLworcHVibGljIGNsYXNzIFRlc3RUZW1wbGF0ZXMgZXh0ZW5kcyBCYXNlVGVzdCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCisJQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcGxhdGVDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gInggPSAlZm9vKG5hbWU9eyRJRC50ZXh0fSk7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ4ID0gdGVtcGxhdGVMaWIuZ2V0SW5zdGFuY2VPZihcImZvb1wiLCIgKworCQkJIm5ldyBTVEF0dHJNYXAoKS5wdXQoXCJuYW1lXCIsIChJRDEhPW51bGw/SUQxLmdldFRleHQoKTpudWxsKSkpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtcbiIgKworCQkJIiAgICBvdXRwdXQ9dGVtcGxhdGU7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJcbiIgKworCQkJImEgOiBJRCB7IithY3Rpb24rIn1cbiIgKworCQkJIiAgO1xuIiArCisJCQkiXG4iICsKKwkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJCQkJCQkJImEiLAorCQkJCQkJCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0KKwkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCVNUR3JvdXAgdGVtcGxhdGVzID0KKwkJCW5ldyBTVEdyb3VwKCk7CisJCVNUIGFjdGlvblNUID0gbmV3IFNUKHRlbXBsYXRlcywgcmF3VHJhbnNsYXRpb24pOworCQlTdHJpbmcgZm91bmQgPSBhY3Rpb25TVC5yZW5kZXIoKTsKKworCQlhc3NlcnROb0Vycm9ycyhlcXVldWUpOworCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZW1wbGF0ZUNvbnN0cnVjdG9yTm9BcmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAieCA9ICVmb28oKTsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInggPSB0ZW1wbGF0ZUxpYi5nZXRJbnN0YW5jZU9mKFwiZm9vXCIpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtcbiIgKworCQkJIiAgICBvdXRwdXQ9dGVtcGxhdGU7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJcbiIgKworCQkJImEgOiBJRCB7IithY3Rpb24rIn1cbiIgKworCQkJIiAgO1xuIiArCisJCQkiXG4iICsKKwkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJCQkJCQkJImEiLAorCQkJCQkJCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0KKwkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCVNUR3JvdXAgdGVtcGxhdGVzID0KKwkJCW5ldyBTVEdyb3VwKCk7CisJCVNUIGFjdGlvblNUID0gbmV3IFNUKHRlbXBsYXRlcywgcmF3VHJhbnNsYXRpb24pOworCQlTdHJpbmcgZm91bmQgPSBhY3Rpb25TVC5yZW5kZXIoKTsKKworCQlhc3NlcnROb0Vycm9ycyhlcXVldWUpOworCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFRlbXBsYXRlQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICJ4ID0gJSh7XCJmb29cIn0pKG5hbWU9eyRJRC50ZXh0fSk7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ4ID0gdGVtcGxhdGVMaWIuZ2V0SW5zdGFuY2VPZihcImZvb1wiLCIgKworCQkJIm5ldyBTVEF0dHJNYXAoKS5wdXQoXCJuYW1lXCIsIChJRDEhPW51bGw/SUQxLmdldFRleHQoKTpudWxsKSkpOyI7CisKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtcbiIgKworCQkJIiAgICBvdXRwdXQ9dGVtcGxhdGU7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJcbiIgKworCQkJImEgOiBJRCB7IithY3Rpb24rIn1cbiIgKworCQkJIiAgO1xuIiArCisJCQkiXG4iICsKKwkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisJCUFjdGlvblRyYW5zbGF0b3IgdHJhbnNsYXRvciA9CisJCQluZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJCQkJCQkJImEiLAorCQkJCQkJCQkJCW5ldyBDb21tb25Ub2tlbihBTlRMUlBhcnNlci5BQ1RJT04sYWN0aW9uKSwxKTsKKwkJU3RyaW5nIHJhd1RyYW5zbGF0aW9uID0KKwkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7CisJCVNUR3JvdXAgdGVtcGxhdGVzID0KKwkJCW5ldyBTVEdyb3VwKCk7CisJCVNUIGFjdGlvblNUID0gbmV3IFNUKHRlbXBsYXRlcywgcmF3VHJhbnNsYXRpb24pOworCQlTdHJpbmcgZm91bmQgPSBhY3Rpb25TVC5yZW5kZXIoKTsKKworCQlhc3NlcnROb0Vycm9ycyhlcXVldWUpOworCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICJ4ID0gJXskSUQudGV4dH07IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ4ID0gbmV3IFN0cmluZ1RlbXBsYXRlKHRlbXBsYXRlTGliLChJRDEhPW51bGw/SUQxLmdldFRleHQoKTpudWxsKSk7IjsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge1xuIiArCisJCQkiICAgIG91dHB1dD10ZW1wbGF0ZTtcbiIgKworCQkJIn1cbiIgKworCQkJIlxuIiArCisJCQkiYSA6IElEIHsiK2FjdGlvbisifVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJcbiIgKworCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKwkJQWN0aW9uVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCQkJCQkJCQkJCQkJCQkgImEiLAorCQkJCQkJCQkJCQkJCQkJCQkgbmV3IENvbW1vblRva2VuKEFOVExSUGFyc2VyLkFDVElPTixhY3Rpb24pLDEpOworCQlTdHJpbmcgcmF3VHJhbnNsYXRpb24gPQorCQkJdHJhbnNsYXRvci50cmFuc2xhdGUoKTsKKwkJU1RHcm91cCB0ZW1wbGF0ZXMgPQorCQkJbmV3IFNUR3JvdXAoKTsKKwkJU1QgYWN0aW9uU1QgPSBuZXcgU1QodGVtcGxhdGVzLCByYXdUcmFuc2xhdGlvbik7CisJCVN0cmluZyBmb3VuZCA9IGFjdGlvblNULnJlbmRlcigpOworCisJCWFzc2VydE5vRXJyb3JzKGVxdWV1ZSk7CisKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXRBdHRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJXgueSA9IHo7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoeCkuc2V0QXR0cmlidXRlKFwieVwiLCB6KTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkib3B0aW9ucyB7XG4iICsKKwkJCSIgICAgb3V0cHV0PXRlbXBsYXRlO1xuIiArCisJCQkifVxuIiArCisJCQkiXG4iICsKKwkJCSJhIDogSUQgeyIrYWN0aW9uKyJ9XG4iICsKKwkJCSIgIDtcbiIgKworCQkJIlxuIiArCisJCQkiSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPQorCQkJbmV3IEFjdGlvblRyYW5zbGF0b3IoZ2VuZXJhdG9yLAorCQkJCQkJCQkJCSJhIiwKKwkJCQkJCQkJCQluZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlTVEdyb3VwIHRlbXBsYXRlcyA9CisJCQluZXcgU1RHcm91cCgpOworCQlTVCBhY3Rpb25TVCA9IG5ldyBTVCh0ZW1wbGF0ZXMsIHJhd1RyYW5zbGF0aW9uKTsKKwkJU3RyaW5nIGZvdW5kID0gYWN0aW9uU1QucmVuZGVyKCk7CisKKwkJYXNzZXJ0Tm9FcnJvcnMoZXF1ZXVlKTsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldEF0dHJPZkV4cHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGFjdGlvbiA9ICIle2ZvbygkSUQudGV4dCkuZ2V0U1QoKX0ueSA9IHo7IjsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoZm9vKChJRDEhPW51bGw/SUQxLmdldFRleHQoKTpudWxsKSkuZ2V0U1QoKSkuc2V0QXR0cmlidXRlKFwieVwiLCB6KTsiOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkib3B0aW9ucyB7XG4iICsKKwkJCSIgICAgb3V0cHV0PXRlbXBsYXRlO1xuIiArCisJCQkifVxuIiArCisJCQkiXG4iICsKKwkJCSJhIDogSUQgeyIrYWN0aW9uKyJ9XG4iICsKKwkJCSIgIDtcbiIgKworCQkJIlxuIiArCisJCQkiSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCQlBY3Rpb25UcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgQWN0aW9uVHJhbnNsYXRvcihnZW5lcmF0b3IsCisJCQkJCQkJCQkJCQkJCQkJCSAiYSIsCisJCQkJCQkJCQkJCQkJCQkJCSBuZXcgQ29tbW9uVG9rZW4oQU5UTFJQYXJzZXIuQUNUSU9OLGFjdGlvbiksMSk7CisJCVN0cmluZyByYXdUcmFuc2xhdGlvbiA9CisJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOworCQlTVEdyb3VwIHRlbXBsYXRlcyA9CisJCQluZXcgU1RHcm91cCgpOworCQlTVCBhY3Rpb25TVCA9IG5ldyBTVCh0ZW1wbGF0ZXMsIHJhd1RyYW5zbGF0aW9uKTsKKwkJU3RyaW5nIGZvdW5kID0gYWN0aW9uU1QucmVuZGVyKCk7CisKKwkJYXNzZXJ0Tm9FcnJvcnMoZXF1ZXVlKTsKKworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldEF0dHJPZkV4cHJJbk1lbWJlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworCQlFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJncmFtbWFyIHQ7XG4iICsKKwkJCSJvcHRpb25zIHtcbiIgKworCQkJIiAgICBvdXRwdXQ9dGVtcGxhdGU7XG4iICsKKwkJCSJ9XG4iICsKKwkJCSJAbWVtYmVycyB7XG4iICsKKwkJCSIlY29kZS5pbnN0ciA9IG87IiArIC8vIG11c3Qgbm90IGdldCBudWxsIHB0ciEKKwkJCSJ9XG4iICsKKwkJCSJhIDogSURcbiIgKworCQkJIiAgO1xuIiArCisJCQkiXG4iICsKKwkJCSJJRCA6ICdhJztcbiIpOworCQlUb29sIGFudGxyID0gbmV3VG9vbCgpOworCQlDb2RlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb2RlR2VuZXJhdG9yKGFudGxyLCBnLCAiSmF2YSIpOworCQlnLnNldENvZGVHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKKwkJZ2VuZXJhdG9yLmdlblJlY29nbml6ZXIoKTsgLy8gZm9yY2VzIGxvYWQgb2YgdGVtcGxhdGVzCisKKwkJYXNzZXJ0Tm9FcnJvcnMoZXF1ZXVlKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90SGF2ZVNwYWNlQmVmb3JlRG90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBhY3Rpb24gPSAiJXggLnkgPSB6OyI7CisJCVN0cmluZyBleHBlY3RpbmcgPSBudWxsOworCisJCUVycm9yUXVldWUgZXF1ZXVlID0gbmV3IEVycm9yUXVldWUoKTsKKwkJRXJyb3JNYW5hZ2VyLnNldEVycm9yTGlzdGVuZXIoZXF1ZXVlKTsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkiZ3JhbW1hciB0O1xuIiArCisJCQkib3B0aW9ucyB7XG4iICsKKwkJCSIgICAgb3V0cHV0PXRlbXBsYXRlO1xuIiArCisJCQkifVxuIiArCisJCQkiXG4iICsKKwkJCSJhIDogSUQgeyIrYWN0aW9uKyJ9XG4iICsKKwkJCSIgIDtcbiIgKworCQkJIlxuIiArCisJCQkiSUQgOiAnYSc7XG4iKTsKKwkJVG9vbCBhbnRsciA9IG5ld1Rvb2woKTsKKwkJQ29kZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgQ29kZUdlbmVyYXRvcihhbnRsciwgZywgIkphdmEiKTsKKwkJZy5zZXRDb2RlR2VuZXJhdG9yKGdlbmVyYXRvcik7CisJCWdlbmVyYXRvci5nZW5SZWNvZ25pemVyKCk7IC8vIGZvcmNlcyBsb2FkIG9mIHRlbXBsYXRlcworCisJCWludCBleHBlY3RlZE1zZ0lEID0gRXJyb3JNYW5hZ2VyLk1TR19JTlZBTElEX1RFTVBMQVRFX0FDVElPTjsKKwkJT2JqZWN0IGV4cGVjdGVkQXJnID0gIiV4IjsKKwkJR3JhbW1hclNlbWFudGljc01lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKwkJCW5ldyBHcmFtbWFyU2VtYW50aWNzTWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZyk7CisJCWNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RIYXZlU3BhY2VBZnRlckRvdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYWN0aW9uID0gIiV4LiB5ID0gejsiOworCQlTdHJpbmcgZXhwZWN0aW5nID0gbnVsbDsKKworCQlFcnJvclF1ZXVlIGVxdWV1ZSA9IG5ldyBFcnJvclF1ZXVlKCk7CisJCUVycm9yTWFuYWdlci5zZXRFcnJvckxpc3RlbmVyKGVxdWV1ZSk7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImdyYW1tYXIgdDtcbiIgKworCQkJIm9wdGlvbnMge1xuIiArCisJCQkiICAgIG91dHB1dD10ZW1wbGF0ZTtcbiIgKworCQkJIn1cbiIgKworCQkJIlxuIiArCisJCQkiYSA6IElEIHsiK2FjdGlvbisifVxuIiArCisJCQkiICA7XG4iICsKKwkJCSJcbiIgKworCQkJIklEIDogJ2EnO1xuIik7CisJCVRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisJCUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisJCWcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworCQlnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOyAvLyBmb3JjZXMgbG9hZCBvZiB0ZW1wbGF0ZXMKKworCQlpbnQgZXhwZWN0ZWRNc2dJRCA9IEVycm9yTWFuYWdlci5NU0dfSU5WQUxJRF9URU1QTEFURV9BQ1RJT047CisJCU9iamVjdCBleHBlY3RlZEFyZyA9ICIleC4iOworCQlHcmFtbWFyU2VtYW50aWNzTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPQorCQkJbmV3IEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlKGV4cGVjdGVkTXNnSUQsIGcsIG51bGwsIGV4cGVjdGVkQXJnKTsKKwkJY2hlY2tFcnJvcihlcXVldWUsIGV4cGVjdGVkTWVzc2FnZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY2hlY2tFcnJvcihFcnJvclF1ZXVlIGVxdWV1ZSwKKwkJCQkJCQkgIEdyYW1tYXJTZW1hbnRpY3NNZXNzYWdlIGV4cGVjdGVkTWVzc2FnZSkKKwkJdGhyb3dzIEV4Y2VwdGlvbgorCXsKKwkJLyoKKwkJU3lzdGVtLm91dC5wcmludGxuKGVxdWV1ZS5pbmZvcyk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihlcXVldWUud2FybmluZ3MpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oZXF1ZXVlLmVycm9ycyk7CisJCSovCisJCU1lc3NhZ2UgZm91bmRNc2cgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVxdWV1ZS5lcnJvcnMuc2l6ZSgpOyBpKyspIHsKKwkJCU1lc3NhZ2UgbSA9IChNZXNzYWdlKWVxdWV1ZS5lcnJvcnMuZ2V0KGkpOworCQkJaWYgKG0ubXNnSUQ9PWV4cGVjdGVkTWVzc2FnZS5tc2dJRCApIHsKKwkJCQlmb3VuZE1zZyA9IG07CisJCQl9CisJCX0KKwkJYXNzZXJ0VHJ1ZSgibm8gZXJyb3I7ICIrZXhwZWN0ZWRNZXNzYWdlLm1zZ0lEKyIgZXhwZWN0ZWQiLCBlcXVldWUuZXJyb3JzLnNpemUoKT4wKTsKKwkJYXNzZXJ0VHJ1ZSgidG9vIG1hbnkgZXJyb3JzOyAiK2VxdWV1ZS5lcnJvcnMsIGVxdWV1ZS5lcnJvcnMuc2l6ZSgpPD0xKTsKKwkJYXNzZXJ0VHJ1ZSgiY291bGRuJ3QgZmluZCBleHBlY3RlZCBlcnJvcjogIitleHBlY3RlZE1lc3NhZ2UubXNnSUQsIGZvdW5kTXNnIT1udWxsKTsKKwkJYXNzZXJ0VHJ1ZSgiZXJyb3IgaXMgbm90IGEgR3JhbW1hclNlbWFudGljc01lc3NhZ2UiLAorCQkJCSAgIGZvdW5kTXNnIGluc3RhbmNlb2YgR3JhbW1hclNlbWFudGljc01lc3NhZ2UpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXNzYWdlLmFyZywgZm91bmRNc2cuYXJnKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS5hcmcyLCBmb3VuZE1zZy5hcmcyKTsKKwl9CisKKwkvLyBTIFUgUCBQIE8gUiBUCisJcHJpdmF0ZSB2b2lkIGFzc2VydE5vRXJyb3JzKEVycm9yUXVldWUgZXF1ZXVlKSB7CisJCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgZXJyb3JzOiAiK2VxdWV1ZSwgZXF1ZXVlLmVycm9ycy5zaXplKCk9PTApOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRva2VuUmV3cml0ZVN0cmVhbS5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VG9rZW5SZXdyaXRlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4NjRlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRva2VuUmV3cml0ZVN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsODA4IEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5BTlRMUlN0cmluZ1N0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5DaGFyU3RyZWFtOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuUmV3cml0ZVN0cmVhbTsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyOworaW1wb3J0IG9yZy5hbnRsci50b29sLkludGVycHJldGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdFRva2VuUmV3cml0ZVN0cmVhbSBleHRlbmRzIEJhc2VUZXN0IHsKKworICAgIC8qKiBQdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VkIGJ5IFRlc3RSaWcgKi8KKyAgICBwdWJsaWMgVGVzdFRva2VuUmV3cml0ZVN0cmVhbSgpIHsKKyAgICB9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0QmVmb3JlSW5kZXgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICIwIik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIwYWJjIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0QWZ0ZXJMYXN0SW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5pbnNlcnRBZnRlcigyLCAieCIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYWJjeCI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdDJJbnNlcnRCZWZvcmVBZnRlck1pZGRsZUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICJ4Iik7CisJCXRva2Vucy5pbnNlcnRBZnRlcigxLCAieCIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYXhieGMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSW5kZXgwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgwLCAieCIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieGJjIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUxhc3RJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmMiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKwkJdG9rZW5zLnJlcGxhY2UoMiwgIngiKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImFieCI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNaWRkbGVJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmMiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKwkJdG9rZW5zLnJlcGxhY2UoMSwgIngiKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImF4YyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nU3RhcnRTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgImxleGVyIGdyYW1tYXIgdDtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6Jys7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJTRU1JIDogJzsnO1xuIiArCisgICAgICAgICAgICAiTVVMIDogJyonO1xuIiArCisgICAgICAgICAgICAiQVNTSUdOIDogJz0nO1xuIiArCisgICAgICAgICAgICAiV1MgOiAnICcrO1xuIik7CisgICAgICAgIC8vIFRva2VuczogMDEyMzQ1Njc4OQorICAgICAgICAvLyBJbnB1dDogIHggPSAzICogMDsKKyAgICAgICAgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgieCA9IDMgKiAwOyIpOworICAgICAgICBJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworICAgICAgICBUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworICAgICAgICB0b2tlbnMuZmlsbCgpOworICAgICAgICB0b2tlbnMucmVwbGFjZSg0LCA4LCAiMCIpOyAvLyByZXBsYWNlIDMgKiAwIHdpdGggMAorCisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9PcmlnaW5hbFN0cmluZygpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gInggPSAzICogMDsiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworICAgICAgICBleHBlY3RpbmcgPSAieCA9IDA7IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoMCw5KTsKKyAgICAgICAgZXhwZWN0aW5nID0gInggPSAwOyI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDQsOCk7CisgICAgICAgIGV4cGVjdGluZyA9ICIwIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdTdGFydFN0b3AyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorICAgICAgICAgICAgImxleGVyIGdyYW1tYXIgdDtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6Jys7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJTRU1JIDogJzsnO1xuIiArCisgICAgICAgICAgICAiQVNTSUdOIDogJz0nO1xuIiArCisgICAgICAgICAgICAiUExVUyA6ICcrJztcbiIgKworICAgICAgICAgICAgIk1VTFQgOiAnKic7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICcgJys7XG4iKTsKKyAgICAgICAgLy8gVG9rZW5zOiAwMTIzNDU2Nzg5MDEyMzQ1NjcKKyAgICAgICAgLy8gSW5wdXQ6ICB4ID0gMyAqIDAgKyAyICogMDsKKyAgICAgICAgQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgieCA9IDMgKiAwICsgMiAqIDA7Iik7CisgICAgICAgIEludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisgICAgICAgIFRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisgICAgICAgIHRva2Vucy5maWxsKCk7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b09yaWdpbmFsU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAieCA9IDMgKiAwICsgMiAqIDA7IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKworICAgICAgICB0b2tlbnMucmVwbGFjZSg0LCA4LCAiMCIpOyAvLyByZXBsYWNlIDMgKiAwIHdpdGggMAorICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKyAgICAgICAgZXhwZWN0aW5nID0gInggPSAwICsgMiAqIDA7IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoMCwxNyk7CisgICAgICAgIGV4cGVjdGluZyA9ICJ4ID0gMCArIDIgKiAwOyI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDQsOCk7CisgICAgICAgIGV4cGVjdGluZyA9ICIwIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoMCw4KTsKKyAgICAgICAgZXhwZWN0aW5nID0gInggPSAwIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoMTIsMTYpOworICAgICAgICBleHBlY3RpbmcgPSAiMiAqIDAiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCisgICAgICAgIHRva2Vucy5pbnNlcnRBZnRlcigxNywgIi8vIGNvbW1lbnQiKTsKKyAgICAgICAgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKDEyLDE4KTsKKyAgICAgICAgZXhwZWN0aW5nID0gIjIgKiAwOy8vIGNvbW1lbnQiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCisgICAgICAgIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygwLDgpOyAvLyB0cnkgYWdhaW4gYWZ0ZXIgaW5zZXJ0IGF0IGVuZAorICAgICAgICBleHBlY3RpbmcgPSAieCA9IDAiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworICAgIH0KKworCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdDJSZXBsYWNlTWlkZGxlSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5yZXBsYWNlKDEsICJ4Iik7CisJCXRva2Vucy5yZXBsYWNlKDEsICJ5Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJheWMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3QyUmVwbGFjZU1pZGRsZUluZGV4MUluc2VydEJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmMiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKyAgICAgICAgdG9rZW5zLmluc2VydEJlZm9yZSgwLCAiXyIpOworICAgICAgICB0b2tlbnMucmVwbGFjZSgxLCAieCIpOworCQl0b2tlbnMucmVwbGFjZSgxLCAieSIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiX2F5YyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUaGVuRGVsZXRlTWlkZGxlSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5yZXBsYWNlKDEsICJ4Iik7CisJCXRva2Vucy5kZWxldGUoMSk7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJhYyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluc2VydEluUHJpb3JSZXBsYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgwLCAyLCAieCIpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICIwIik7CisJCUV4Y2VwdGlvbiBleGMgPSBudWxsOworCQl0cnkgeworCQkJdG9rZW5zLnRvU3RyaW5nKCk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKwkJCWV4YyA9IGlhZTsKKwkJfQorCQlTdHJpbmcgZXhwZWN0aW5nID0gImluc2VydCBvcCA8SW5zZXJ0QmVmb3JlT3BAW0AxLDE6MT0nYicsPDU+LDE6MV06XCIwXCI+IHdpdGhpbiBib3VuZGFyaWVzIG9mIHByZXZpb3VzIDxSZXBsYWNlT3BAW0AwLDA6MD0nYScsPDQ+LDE6MF0uLltAMiwyOjI9J2MnLDw2PiwxOjJdOlwieFwiPiI7CisJCWFzc2VydE5vdE51bGwoZXhjKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZXhjLmdldE1lc3NhZ2UoKSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluc2VydFRoZW5SZXBsYWNlU2FtZUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICIwIik7CisJCXRva2Vucy5yZXBsYWNlKDAsICJ4Iik7IC8vIHN1cGVyY2VkZXMgaW5zZXJ0IGF0IDAKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIjB4YmMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3QySW5zZXJ0TWlkZGxlSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMSwgIngiKTsKKwkJdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieSIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYXl4YmMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3QySW5zZXJ0VGhlblJlcGxhY2VJbmRleDAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMCwgIngiKTsKKwkJdG9rZW5zLmluc2VydEJlZm9yZSgwLCAieSIpOworCQl0b2tlbnMucmVwbGFjZSgwLCAieiIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieXh6YmMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlVGhlbkluc2VydEJlZm9yZUxhc3RJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmMiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKwkJdG9rZW5zLnJlcGxhY2UoMiwgIngiKTsKKwkJdG9rZW5zLmluc2VydEJlZm9yZSgyLCAieSIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYWJ5eCI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEluc2VydFRoZW5SZXBsYWNlTGFzdEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDIsICJ5Iik7CisJCXRva2Vucy5yZXBsYWNlKDIsICJ4Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJhYnl4IjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVRoZW5JbnNlcnRBZnRlckxhc3RJbmRleCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmMiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKwkJdG9rZW5zLnJlcGxhY2UoMiwgIngiKTsKKwkJdG9rZW5zLmluc2VydEFmdGVyKDIsICJ5Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJhYnh5IjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVJhbmdlVGhlbkluc2VydEF0TGVmdEVkZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjY2NiYSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgyLCA0LCAieCIpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDIsICJ5Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJhYnl4YmEiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUmFuZ2VUaGVuSW5zZXJ0QXRSaWdodEVkZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjY2NiYSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgyLCA0LCAieCIpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDQsICJ5Iik7IC8vIG5vIGVmZmVjdDsgd2l0aGluIHJhbmdlIG9mIGEgcmVwbGFjZQorCQlFeGNlcHRpb24gZXhjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXRva2Vucy50b1N0cmluZygpOworCQl9CisJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisJCQlleGMgPSBpYWU7CisJCX0KKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJpbnNlcnQgb3AgPEluc2VydEJlZm9yZU9wQFtANCw0OjQ9J2MnLDw2PiwxOjRdOlwieVwiPiB3aXRoaW4gYm91bmRhcmllcyBvZiBwcmV2aW91cyA8UmVwbGFjZU9wQFtAMiwyOjI9J2MnLDw2PiwxOjJdLi5bQDQsNDo0PSdjJyw8Nj4sMTo0XTpcInhcIj4iOworCQlhc3NlcnROb3ROdWxsKGV4Yyk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGV4Yy5nZXRNZXNzYWdlKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUmFuZ2VUaGVuSW5zZXJ0QWZ0ZXJSaWdodEVkZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjY2NiYSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgyLCA0LCAieCIpOworCQl0b2tlbnMuaW5zZXJ0QWZ0ZXIoNCwgInkiKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImFieHliYSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjY2NiYSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgwLCA2LCAieCIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieCI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VTdWJzZXRUaGVuRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjY2NiYSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgyLCA0LCAieHl6Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoMCw2KTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJhYnh5emJhIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVRoZW5SZXBsYWNlU3VwZXJzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjY2NiYSIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgyLCA0LCAieHl6Iik7CisJCXRva2Vucy5yZXBsYWNlKDMsIDUsICJmb28iKTsgLy8gb3ZlcmxhcHMsIGVycm9yCisJCUV4Y2VwdGlvbiBleGMgPSBudWxsOworCQl0cnkgeworCQkJdG9rZW5zLnRvU3RyaW5nKCk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKwkJCWV4YyA9IGlhZTsKKwkJfQorCQlTdHJpbmcgZXhwZWN0aW5nID0gInJlcGxhY2Ugb3AgYm91bmRhcmllcyBvZiA8UmVwbGFjZU9wQFtAMywzOjM9J2MnLDw2PiwxOjNdLi5bQDUsNTo1PSdiJyw8NT4sMTo1XTpcImZvb1wiPiBvdmVybGFwIHdpdGggcHJldmlvdXMgPFJlcGxhY2VPcEBbQDIsMjoyPSdjJyw8Nj4sMToyXS4uW0A0LDQ6ND0nYycsPDY+LDE6NF06XCJ4eXpcIj4iOworCQlhc3NlcnROb3ROdWxsKGV4Yyk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGV4Yy5nZXRNZXNzYWdlKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlVGhlblJlcGxhY2VMb3dlckluZGV4ZWRTdXBlcnNldCgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmNjY2JhIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5yZXBsYWNlKDIsIDQsICJ4eXoiKTsKKwkJdG9rZW5zLnJlcGxhY2UoMSwgMywgImZvbyIpOyAvLyBvdmVybGFwLCBlcnJvcgorCQlFeGNlcHRpb24gZXhjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXRva2Vucy50b1N0cmluZygpOworCQl9CisJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisJCQlleGMgPSBpYWU7CisJCX0KKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJyZXBsYWNlIG9wIGJvdW5kYXJpZXMgb2YgPFJlcGxhY2VPcEBbQDEsMToxPSdiJyw8NT4sMToxXS4uW0AzLDM6Mz0nYycsPDY+LDE6M106XCJmb29cIj4gb3ZlcmxhcCB3aXRoIHByZXZpb3VzIDxSZXBsYWNlT3BAW0AyLDI6Mj0nYycsPDY+LDE6Ml0uLltANCw0OjQ9J2MnLDw2PiwxOjRdOlwieHl6XCI+IjsKKwkJYXNzZXJ0Tm90TnVsbChleGMpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBleGMuZ2V0TWVzc2FnZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVNpbmdsZU1pZGRsZVRoZW5PdmVybGFwcGluZ1N1cGVyc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiY2JhIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5yZXBsYWNlKDIsIDIsICJ4eXoiKTsKKwkJdG9rZW5zLnJlcGxhY2UoMCwgMywgImZvbyIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiZm9vYSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJLy8gSnVuZSAyLCAyMDA4IEkgcmV3cm90ZSBjb3JlIG9mIHJld3JpdGUgZW5naW5lOyBqdXN0IGFkZGluZyBsb3RzIG1vcmUgdGVzdHMgaGVyZQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbWJpbmVJbnNlcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICJ4Iik7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMCwgInkiKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gInl4YWJjIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZTNJbnNlcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICJ4Iik7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMCwgInkiKTsKKwkJdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieiIpOworCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAieWF6eGJjIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZUluc2VydE9uTGVmdFdpdGhSZXBsYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgwLCAyLCAiZm9vIik7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMCwgInoiKTsgLy8gY29tYmluZSB3aXRoIGxlZnQgZWRnZSBvZiByZXdyaXRlCisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ6Zm9vIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZUluc2VydE9uTGVmdFdpdGhEZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5kZWxldGUoMCwgMik7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMCwgInoiKTsgLy8gY29tYmluZSB3aXRoIGxlZnQgZWRnZSBvZiByZXdyaXRlCisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ6IjsgLy8gbWFrZSBzdXJlIGNvbWJvIGlzIG5vdCB6bnVsbAorCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REaXNqb2ludEluc2VydHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMSwgIngiKTsKKwkJdG9rZW5zLmluc2VydEJlZm9yZSgyLCAieSIpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDAsICJ6Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ6YXhieWMiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RPdmVybGFwcGluZ1JlcGxhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgxLCAyLCAiZm9vIik7CisJCXRva2Vucy5yZXBsYWNlKDAsIDMsICJiYXIiKTsgLy8gd2lwZXMgcHJpb3IgbmVzdGVkIHJlcGxhY2UKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImJhciI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE92ZXJsYXBwaW5nUmVwbGFjZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgwLCAzLCAiYmFyIik7CisJCXRva2Vucy5yZXBsYWNlKDEsIDIsICJmb28iKTsgLy8gY2Fubm90IHNwbGl0IGVhcmxpZXIgcmVwbGFjZQorCQlFeGNlcHRpb24gZXhjID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXRva2Vucy50b1N0cmluZygpOworCQl9CisJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisJCQlleGMgPSBpYWU7CisJCX0KKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJyZXBsYWNlIG9wIGJvdW5kYXJpZXMgb2YgPFJlcGxhY2VPcEBbQDEsMToxPSdiJyw8NT4sMToxXS4uW0AyLDI6Mj0nYycsPDY+LDE6Ml06XCJmb29cIj4gb3ZlcmxhcCB3aXRoIHByZXZpb3VzIDxSZXBsYWNlT3BAW0AwLDA6MD0nYScsPDQ+LDE6MF0uLltAMywzOjM9J2MnLDw2PiwxOjNdOlwiYmFyXCI+IjsKKwkJYXNzZXJ0Tm90TnVsbChleGMpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBleGMuZ2V0TWVzc2FnZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmxhcHBpbmdSZXBsYWNlMygpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmNjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5yZXBsYWNlKDEsIDIsICJmb28iKTsKKwkJdG9rZW5zLnJlcGxhY2UoMCwgMiwgImJhciIpOyAvLyB3aXBlcyBwcmlvciBuZXN0ZWQgcmVwbGFjZQorCQlTdHJpbmcgcmVzdWx0ID0gdG9rZW5zLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiYmFyYyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE92ZXJsYXBwaW5nUmVwbGFjZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMucmVwbGFjZSgxLCAyLCAiZm9vIik7CisJCXRva2Vucy5yZXBsYWNlKDEsIDMsICJiYXIiKTsgLy8gd2lwZXMgcHJpb3IgbmVzdGVkIHJlcGxhY2UKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImFiYXIiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REcm9wSWRlbnRpY2FsUmVwbGFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQlHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcigKKwkJCSJsZXhlciBncmFtbWFyIHQ7XG4iKworCQkJIkEgOiAnYSc7XG4iICsKKwkJCSJCIDogJ2InO1xuIiArCisJCQkiQyA6ICdjJztcbiIpOworCQlDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKCJhYmNjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5yZXBsYWNlKDEsIDIsICJmb28iKTsKKwkJdG9rZW5zLnJlcGxhY2UoMSwgMiwgImZvbyIpOyAvLyBkcm9wIHByZXZpb3VzLCBpZGVudGljYWwKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImFmb29jIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RHJvcFByZXZDb3ZlcmVkSW5zZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiYyIpOworCQlJbnRlcnByZXRlciBsZXhFbmdpbmUgPSBuZXcgSW50ZXJwcmV0ZXIoZywgaW5wdXQpOworCQlUb2tlblJld3JpdGVTdHJlYW0gdG9rZW5zID0gbmV3IFRva2VuUmV3cml0ZVN0cmVhbShsZXhFbmdpbmUpOworCQl0b2tlbnMuZmlsbCgpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICJmb28iKTsKKwkJdG9rZW5zLnJlcGxhY2UoMSwgMiwgImZvbyIpOyAvLyBraWxsIHByZXYgaW5zZXJ0CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJhZm9vZm9vIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TGVhdmVBbG9uZURpc2pvaW50SW5zZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiY2MiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKwkJdG9rZW5zLmluc2VydEJlZm9yZSgxLCAieCIpOworCQl0b2tlbnMucmVwbGFjZSgyLCAzLCAiZm9vIik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJheGJmb28iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMZWF2ZUFsb25lRGlzam9pbnRJbnNlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdyYW1tYXIgZyA9IG5ldyBHcmFtbWFyKAorCQkJImxleGVyIGdyYW1tYXIgdDtcbiIrCisJCQkiQSA6ICdhJztcbiIgKworCQkJIkIgOiAnYic7XG4iICsKKwkJCSJDIDogJ2MnO1xuIik7CisJCUNoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oImFiY2MiKTsKKwkJSW50ZXJwcmV0ZXIgbGV4RW5naW5lID0gbmV3IEludGVycHJldGVyKGcsIGlucHV0KTsKKwkJVG9rZW5SZXdyaXRlU3RyZWFtIHRva2VucyA9IG5ldyBUb2tlblJld3JpdGVTdHJlYW0obGV4RW5naW5lKTsKKwkJdG9rZW5zLmZpbGwoKTsKKwkJdG9rZW5zLnJlcGxhY2UoMiwgMywgImZvbyIpOworCQl0b2tlbnMuaW5zZXJ0QmVmb3JlKDEsICJ4Iik7CisJCVN0cmluZyByZXN1bHQgPSB0b2tlbnMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJheGJmb28iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRCZWZvcmVUb2tlblRoZW5EZWxldGVUaGF0VG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3JhbW1hciBnID0gbmV3IEdyYW1tYXIoCisJCQkibGV4ZXIgZ3JhbW1hciB0O1xuIisKKwkJCSJBIDogJ2EnO1xuIiArCisJCQkiQiA6ICdiJztcbiIgKworCQkJIkMgOiAnYyc7XG4iKTsKKwkJQ2hhclN0cmVhbSBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSgiYWJjIik7CisJCUludGVycHJldGVyIGxleEVuZ2luZSA9IG5ldyBJbnRlcnByZXRlcihnLCBpbnB1dCk7CisJCVRva2VuUmV3cml0ZVN0cmVhbSB0b2tlbnMgPSBuZXcgVG9rZW5SZXdyaXRlU3RyZWFtKGxleEVuZ2luZSk7CisJCXRva2Vucy5maWxsKCk7CisJCXRva2Vucy5pbnNlcnRCZWZvcmUoMiwgInkiKTsKKwkJdG9rZW5zLmRlbGV0ZSgyKTsKKwkJU3RyaW5nIHJlc3VsdCA9IHRva2Vucy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImFieSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUb3BvbG9naWNhbFNvcnQuamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRvcG9sb2dpY2FsU29ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmZiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUb3BvbG9naWNhbFNvcnQuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLm1pc2MuR3JhcGg7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIFRlc3QgdG9wbyBzb3J0IGluIEdyYXBoTm9kZS4gKi8KK3B1YmxpYyBjbGFzcyBUZXN0VG9wb2xvZ2ljYWxTb3J0IGV4dGVuZHMgQmFzZVRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhaXJseUxhcmdlR3JhcGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhcGggZyA9IG5ldyBHcmFwaCgpOworICAgICAgICBnLmFkZEVkZ2UoIkMiLCAiRiIpOworICAgICAgICBnLmFkZEVkZ2UoIkMiLCAiRyIpOworICAgICAgICBnLmFkZEVkZ2UoIkMiLCAiQSIpOworICAgICAgICBnLmFkZEVkZ2UoIkMiLCAiQiIpOworICAgICAgICBnLmFkZEVkZ2UoIkEiLCAiRCIpOworICAgICAgICBnLmFkZEVkZ2UoIkEiLCAiRSIpOworICAgICAgICBnLmFkZEVkZ2UoIkIiLCAiRSIpOworICAgICAgICBnLmFkZEVkZ2UoIkQiLCAiRSIpOworICAgICAgICBnLmFkZEVkZ2UoIkQiLCAiRiIpOworICAgICAgICBnLmFkZEVkZ2UoIkYiLCAiSCIpOworICAgICAgICBnLmFkZEVkZ2UoIkUiLCAiRiIpOworCisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiW0gsIEYsIEUsIEQsIEcsIEEsIEIsIENdIjsKKyAgICAgICAgTGlzdCBub2RlcyA9IGcuc29ydCgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbm9kZXMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDeWNsaWNHcmFwaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcmFwaCBnID0gbmV3IEdyYXBoKCk7CisgICAgICAgIGcuYWRkRWRnZSgiQSIsICJCIik7CisgICAgICAgIGcuYWRkRWRnZSgiQiIsICJDIik7CisgICAgICAgIGcuYWRkRWRnZSgiQyIsICJBIik7CisgICAgICAgIGcuYWRkRWRnZSgiQyIsICJEIik7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJbRCwgQywgQiwgQV0iOworICAgICAgICBMaXN0IG5vZGVzID0gZy5zb3J0KCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBub2Rlcy50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkRWRnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3JhcGggZyA9IG5ldyBHcmFwaCgpOworICAgICAgICBnLmFkZEVkZ2UoIkEiLCAiQiIpOworICAgICAgICBnLmFkZEVkZ2UoIkIiLCAiQyIpOworICAgICAgICBnLmFkZEVkZ2UoIkEiLCAiQiIpOyAvLyBkdXAKKyAgICAgICAgZy5hZGRFZGdlKCJDIiwgIkQiKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIltELCBDLCBCLCBBXSI7CisgICAgICAgIExpc3Qgbm9kZXMgPSBnLnNvcnQoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5vZGVzLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVG9rZW5EZXBlbmRlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYXBoIGcgPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgZy5hZGRFZGdlKCJKYXZhLmciLCAiTXlKYXZhLnRva2VucyIpOyAvLyBKYXZhIGZlZWRzIG9mZiBtYW51YWwgdG9rZW4gZmlsZQorICAgICAgICBnLmFkZEVkZ2UoIkphdmEudG9rZW5zIiwgIkphdmEuZyIpOyAgICAgICAgCisgICAgICAgIGcuYWRkRWRnZSgiRGVmLmciLCAiSmF2YS50b2tlbnMiKTsgICAgLy8gd2Fsa2VycyBmZWVkIG9mZiBnZW5lcmF0ZWQgdG9rZW5zCisgICAgICAgIGcuYWRkRWRnZSgiUmVmLmciLCAiSmF2YS50b2tlbnMiKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIltNeUphdmEudG9rZW5zLCBKYXZhLmcsIEphdmEudG9rZW5zLCBSZWYuZywgRGVmLmddIjsKKyAgICAgICAgTGlzdCBub2RlcyA9IGcuc29ydCgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbm9kZXMudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJMZXhlckNvbWJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyYXBoIGcgPSBuZXcgR3JhcGgoKTsKKyAgICAgICAgZy5hZGRFZGdlKCJKYXZhTGV4ZXIudG9rZW5zIiwgIkphdmFMZXhlci5nIik7CisgICAgICAgIGcuYWRkRWRnZSgiSmF2YVBhcnNlci5nIiwgIkphdmFMZXhlci50b2tlbnMiKTsKKyAgICAgICAgZy5hZGRFZGdlKCJEZWYuZyIsICJKYXZhTGV4ZXIudG9rZW5zIik7CisgICAgICAgIGcuYWRkRWRnZSgiUmVmLmciLCAiSmF2YUxleGVyLnRva2VucyIpOworCisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiW0phdmFMZXhlci5nLCBKYXZhTGV4ZXIudG9rZW5zLCBKYXZhUGFyc2VyLmcsIFJlZi5nLCBEZWYuZ10iOworICAgICAgICBMaXN0IG5vZGVzID0gZy5zb3J0KCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBub2Rlcy50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCByZXN1bHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVHcmFtbWFyUmV3cml0ZUFTVC5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VHJlZUdyYW1tYXJSZXdyaXRlQVNULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4ZTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVHcmFtbWFyUmV3cml0ZUFTVC5qYXZhCkBAIC0wLDAgKzEsMTEyMSBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLlRvb2w7CitpbXBvcnQgb3JnLmFudGxyLmNvZGVnZW4uQ29kZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5FcnJvck1hbmFnZXI7CitpbXBvcnQgb3JnLmFudGxyLnRvb2wuR3JhbW1hcjsKK2ltcG9ydCBvcmcuYW50bHIudG9vbC5HcmFtbWFyU3ludGF4TWVzc2FnZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKiogVHJlZSByZXdyaXRlcyBpbiB0cmVlIHBhcnNlcnMgYXJlIGJhc2ljYWxseSBpZGVudGljYWwgdG8gcmV3cml0ZXMKKyAqICBpbiBhIG5vcm1hbCBncmFtbWFyIGV4Y2VwdCB0aGF0IHRoZSBhdG9taWMgZWxlbWVudCBpcyBhIG5vZGUgbm90CisgKiAgYSBUb2tlbi4gIFRlc3RzIGhlcmUgZW5zdXJlIGR1cGxpY2F0aW9uIG9mIG5vZGVzIG9jY3VycyBwcm9wZXJseQorICogIGFuZCBiYXNpYyBmdW5jdGlvbmFsaXR5LgorICovCitwdWJsaWMgY2xhc3MgVGVzdFRyZWVHcmFtbWFyUmV3cml0ZUFTVCBleHRlbmRzIEJhc2VUZXN0IHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZsYXRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQ7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gSU5UIElEXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiMzQgYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbXBsZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiBeKElEIElOVCk7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBeKElEIElOVCkgLT4gXihJTlQgSUQpXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiKDM0IGFiYylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9uSW1hZ2luYXJ5V2l0aEN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElOVCA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBJTlQgLT4gSU5UW1wiOTlcIl1cbiIgKyAvLyBtYWtlIG5ldyBJTlQgbm9kZQorCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICIzNCIpOworCQlhc3NlcnRFcXVhbHMoIjk5XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbWJpbmVkUmV3cml0ZUFuZEF1dG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiBeKElEIElOVCkgfCBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXihJRCBJTlQpIC0+IF4oSU5UIElEKSB8IElOVFxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIigzNCBhYmMpXG4iLCBmb3VuZCk7CisKKwkJZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgIjM0Iik7CisJCWFzc2VydEVxdWFscygiMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXZvaWREdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IElEIC0+IF4oSUQgSUQpXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIik7CisJCWFzc2VydEVxdWFscygiKGFiYyBhYmMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEKyBJTlQrIC0+ICheKElEIElOVCkpKyA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiAoXihJRCBJTlQpKSsgLT4gSU5UKyBJRCtcbiIgKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhIGIgYyAzIDQgNSIpOworCQlhc3NlcnRFcXVhbHMoIjMgNCA1IGEgYiBjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9EdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IElEIFxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyIpOworCQlhc3NlcnRFcXVhbHMoImFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvRHVwUnVsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IGIgYyA7XG4iICsKKwkJCSJiIDogSUQgO1xuIiArCisJCQkiYyA6IElOVCA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImEgMSIpOworCQlhc3NlcnRFcXVhbHMoImEgMVxuIiwgZm91bmQpOworCX0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvV2lsZGNhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCA7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisgICAgICAgIFN0cmluZyB0cmVlR3JhbW1hciA9CisgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworICAgICAgICAgICAgImEgOiBJRCAuIFxuIiArCisgICAgICAgICAgICAiICA7XG4iOworCisgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb1dpbGRjYXJkQXNSb290RXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXJyb3JRdWV1ZSBlcXVldWUgPSBuZXcgRXJyb3JRdWV1ZSgpOworICAgICAgICBFcnJvck1hbmFnZXIuc2V0RXJyb3JMaXN0ZW5lcihlcXVldWUpOworCisgICAgICAgIFN0cmluZyB0cmVlR3JhbW1hciA9CisgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworICAgICAgICAgICAgImEgOiBeKC4gSU5UKSBcbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICBHcmFtbWFyIGcgPSBuZXcgR3JhbW1hcih0cmVlR3JhbW1hcik7CisgICAgICAgIFRvb2wgYW50bHIgPSBuZXdUb29sKCk7CisgICAgICAgIGFudGxyLnNldE91dHB1dERpcmVjdG9yeShudWxsKTsgLy8gd3JpdGUgdG8gL2Rldi9udWxsCisgICAgICAgIENvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IENvZGVHZW5lcmF0b3IoYW50bHIsIGcsICJKYXZhIik7CisgICAgICAgIGcuc2V0Q29kZUdlbmVyYXRvcihnZW5lcmF0b3IpOworICAgICAgICBnZW5lcmF0b3IuZ2VuUmVjb2duaXplcigpOworCisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBlcnJvcnM6ICIrZXF1ZXVlLCAxLCBlcXVldWUuZXJyb3JzLnNpemUoKSk7CisKKyAgICAgICAgaW50IGV4cGVjdGVkTXNnSUQgPSBFcnJvck1hbmFnZXIuTVNHX1dJTERDQVJEX0FTX1JPT1Q7CisgICAgICAgIE9iamVjdCBleHBlY3RlZEFyZyA9IG51bGw7CisgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGV4cGVjdGVkRXhjID0gbnVsbDsKKyAgICAgICAgR3JhbW1hclN5bnRheE1lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0KKyAgICAgICAgICAgIG5ldyBHcmFtbWFyU3ludGF4TWVzc2FnZShleHBlY3RlZE1zZ0lELCBnLCBudWxsLCBleHBlY3RlZEFyZywgZXhwZWN0ZWRFeGMpOworCisgICAgICAgIGNoZWNrRXJyb3IoZXF1ZXVlLCBleHBlY3RlZE1lc3NhZ2UpOyAgICAgICAgCisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9XaWxkY2FyZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCAtPiBeKElEIElOVCk7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisgICAgICAgIFN0cmluZyB0cmVlR3JhbW1hciA9CisgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworICAgICAgICAgICAgImEgOiBeKElEIC4pIFxuIiArCisgICAgICAgICAgICAiICA7XG4iOworCisgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIihhYmMgMzQpXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9XaWxkY2FyZFdpdGhMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIDtcbiIgKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrIDtcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7XG4iKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIGM9LiBcbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMgMzRcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b1dpbGRjYXJkV2l0aExpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIDtcbiIgKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrIDtcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7XG4iKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIGMrPS4gXG4iICsKKyAgICAgICAgICAgICIgIDtcbiI7CisKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIDM0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjIDM0XG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9EdXBNdWx0aXBsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSUQgSU5UO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogSUQgSUQgSU5UXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSBiIDMiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhIGIgM1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvRHVwVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IF4oSUQgSU5UKVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImEgMyIpOworCQlhc3NlcnRFcXVhbHMoIihhIDMpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9EdXBUcmVlMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIElOVCAtPiBeKElEIElOVCBJTlQpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXihJRCBiIGIpXG4iICsKKwkJCSIgIDtcbiIgKworCQkJImIgOiBJTlQgOyI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSAzIDQiKTsKKwkJYXNzZXJ0RXF1YWxzKCIoYSAzIDQpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEF1dG9EdXBUcmVlV2l0aExhYmVscygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IF4oeD1JRCB5PUlOVClcbiIgKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhIDMiKTsKKwkJYXNzZXJ0RXF1YWxzKCIoYSAzKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvRHVwVHJlZVdpdGhMaXN0TGFiZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gXihJRCBJTlQpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXih4Kz1JRCB5Kz1JTlQpXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSAzIik7CisJCWFzc2VydEVxdWFscygiKGEgMylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0R1cFRyZWVXaXRoUnVsZVJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVCAtPiBeKElEIElOVCk7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBeKGIgSU5UKSA7XG4iICsKKwkJCSJiIDogSUQgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhIDMiKTsKKwkJYXNzZXJ0RXF1YWxzKCIoYSAzKVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBdXRvRHVwVHJlZVdpdGhSdWxlUm9vdEFuZExhYmVscygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IF4oeD1iIElOVCkgO1xuIiArCisJCQkiYiA6IElEIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSAzIik7CisJCWFzc2VydEVxdWFscygiKGEgMylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0R1cFRyZWVXaXRoUnVsZVJvb3RBbmRMaXN0TGFiZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gXihJRCBJTlQpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXih4Kz1iIHkrPWMpIDtcbiIgKworCQkJImIgOiBJRCA7XG4iICsKKwkJCSJjIDogSU5UIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSAzIik7CisJCWFzc2VydEVxdWFscygiKGEgMylcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0R1cE5lc3RlZFRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IHg9SUQgeT1JRCBJTlQgLT4gXigkeCBeKCR5IElOVCkpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXihJRCBeKElEIElOVCkpXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSBiIDMiKTsKKwkJYXNzZXJ0RXF1YWxzKCIoYSAoYiAzKSlcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QXV0b0R1cFRyZWVXaXRoU3VicnVsZUluc2lkZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJ0b2tlbnMge09QO31cbiIgKworCQkJImEgOiAoeD1JRHx4PUlOVCkgLT4gXihPUCAkeCkgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXihPUCAoYnxjKSkgO1xuIiArCisJCQkiYiA6IElEIDtcbiIgKworCQkJImMgOiBJTlQgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhIik7CisJCWFzc2VydEVxdWFscygiKE9QIGEpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogSUQgLT4gXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIik7CisJCWFzc2VydEVxdWFscygiIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXRNYXRjaE5vUmV3cml0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisJCQkiYSA6IGIgSU5UXG4iICsKKwkJCSIgIDtcbiIgKworCQkJImIgOiBJRCB8IElOVCA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbE1hdGNoTm9SZXdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogKElEfElOVCk/IElOVCA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoImFiYyAzNFxuIiwgZm91bmQpOworCX0KKworCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldE1hdGNoTm9SZXdyaXRlTGV2ZWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB4PUlEIElOVCAtPiBeKCR4IElOVCk7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworCQkJImEgOiBeKElEIChJRCB8IElOVCkgKSA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIihhYmMgMzQpXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNldE1hdGNoTm9SZXdyaXRlTGV2ZWwyUm9vdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogeD1JRCBJTlQgLT4gXigkeCBJTlQpO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXigoSUQgfCBJTlQpIElOVCkgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhYmMgMzQiKTsKKwkJYXNzZXJ0RXF1YWxzKCIoYWJjIDM0KVxuIiwgZm91bmQpOworCX0KKworCisJLy8gUkVXUklURSBNT0RFCisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU1vZGVDb21iaW5lZFJld3JpdGVBbmRBdXRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gXihJRCBJTlQpIHwgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9XG4iICsKKwkJCSJhIDogXihJRCBJTlQpIC0+IF4oSURbXCJpY2tcIl0gSU5UKVxuIiArCisJCQkiICB8IElOVFxuIiArIC8vIGxlYXZlcyBpdCBhbG9uZSwgcmV0dXJuaW5nICRhLnN0YXJ0CisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIihpY2sgMzQpXG4iLCBmb3VuZCk7CisKKwkJZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgIjM0Iik7CisJCWFzc2VydEVxdWFscygiMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU1vZGVGbGF0VHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IElEIElOVCB8IElOVCA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkicyA6IElEIGEgO1xuIiArCisJCQkiYSA6IElOVCAtPiBJTlRbXCIxXCJdXG4iKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMgMzQiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMgMVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlTW9kZUNoYWluUnVsZUZsYXRUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQgLT4gSUQgSU5UIHwgSU5UIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9XG4iICsKKwkJCSJzIDogYSA7XG4iICsKKwkJCSJhIDogYiA7XG4iICsKKwkJCSJiIDogSUQgSU5UIC0+IElOVCBJRFxuIisKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiMzQgYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkicyA6IGEgO1xuIiArCisJCQkiYSA6IGIgO1xuIiArIC8vIGEudHJlZSBtdXN0IGJlY29tZSBiLnRyZWUKKwkJCSJiIDogXihJRCBJTlQpIC0+IElOVFxuIisKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkidG9rZW5zIHsgWDsgfVxuIiArCisJCQkicyA6IGEqIGIgO1xuIiArIC8vIG9ubHkgYiBjb250cmlidXRlcyB0byB0cmVlLCBidXQgaXQncyBhZnRlciBhKjsgcy50cmVlID0gYi50cmVlCisJCQkiYSA6IFggO1xuIiArCisJCQkiYiA6IF4oSUQgSU5UKSAtPiBJTlRcbiIrCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkJCQkJCSAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIjM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6ICdib28nIElEIElOVCAtPiAnYm9vJyBeKElEIElOVCkgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO31cbiIgKworCQkJInRva2VucyB7IFg7IH1cbiIgKworCQkJInMgOiAnYm9vJyBhKiBiIDtcbiIgKyAvLyBkb24ndCByZXNldCBzLnRyZWUgdG8gYi50cmVlIGR1ZSB0byAnYm9vJworCQkJImEgOiBYIDtcbiIgKworCQkJImIgOiBeKElEIElOVCkgLT4gSU5UXG4iKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJib28gYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiYm9vIDM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVNb2RlQ2hhaW5SdWxlVHJlZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6ICdib28nIElEIElOVCAtPiBeKCdib28nIF4oSUQgSU5UKSkgO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIrCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO31cbiIgKworCQkJInRva2VucyB7IFg7IH1cbiIgKworCQkJInMgOiBeKCdib28nIGEqIGIpIDtcbiIgKyAvLyBkb24ndCByZXNldCBzLnRyZWUgdG8gYi50cmVlIGR1ZSB0byAnYm9vJworCQkJImEgOiBYIDtcbiIgKworCQkJImIgOiBeKElEIElOVCkgLT4gSU5UXG4iKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJib28gYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiKGJvbyAzNClcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU1vZGVDaGFpblJ1bGVUcmVlNSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogJ2JvbycgSUQgSU5UIC0+IF4oJ2JvbycgXihJRCBJTlQpKSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkidG9rZW5zIHsgWDsgfVxuIiArCisJCQkicyA6IF4oYSBiKSA7XG4iICsgLy8gcy50cmVlIGlzIGEudHJlZQorCQkJImEgOiAnYm9vJyA7XG4iICsKKwkJCSJiIDogXihJRCBJTlQpIC0+IElOVFxuIisKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYm9vIGFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIihib28gMzQpXG4iLCBmb3VuZCk7CisJfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVPZlJ1bGVSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCAtPiBJRCBJTlQgfCBJTlQgO1xuIiArCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDtcbiIrCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO31cbiIgKworICAgICAgICAgICAgInMgOiBhIC0+IGEgO1xuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCAtPiBJRCBJTlQgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMgMzRcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU9mUnVsZVJlZlJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCBJTlQgLT4gXihJTlQgXihJRCBJTlQpKTtcbiIgKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrIDtcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7XG4iKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9XG4iICsKKyAgICAgICAgICAgICJzIDogXihhIF4oSUQgSU5UKSkgLT4gYSA7XG4iICsKKyAgICAgICAgICAgICJhIDogSU5UIDtcbiI7CisKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYWJjIDEyIDM0Iik7CisgICAgICAgIC8vIGVtaXRzIHdob2xlIHRyZWUgd2hlbiB5b3UgcmVmIHRoZSByb290IHNpbmNlIEkgY2FuJ3Qga25vdyB3aGV0aGVyCisgICAgICAgIC8vIHlvdSB3YW50IHRoZSBjaGlsZHJlbiBvciBub3QuICBZb3UgbWlnaHQgYmUgcmV0dXJuaW5nIGEgd2hvbGUgbmV3CisgICAgICAgIC8vIHRyZWUuICBIbW0uLi5zdGlsbCBzZWVtcyB3ZWlyZC4gIG9oIHdlbGwuCisgICAgICAgIGFzc2VydEVxdWFscygiKDEyIChhYmMgMzQpKVxuIiwgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlT2ZSdWxlUmVmUm9vdExhYmVsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCBJTlQgLT4gXihJTlQgXihJRCBJTlQpKTtcbiIgKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrIDtcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7XG4iKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7IHJld3JpdGU9dHJ1ZTt9XG4iICsKKyAgICAgICAgICAgICJzIDogXihsYWJlbD1hIF4oSUQgSU5UKSkgLT4gYSA7XG4iICsKKyAgICAgICAgICAgICJhIDogSU5UIDtcbiI7CisKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYWJjIDEyIDM0Iik7CisgICAgICAgIC8vIGVtaXRzIHdob2xlIHRyZWUgd2hlbiB5b3UgcmVmIHRoZSByb290IHNpbmNlIEkgY2FuJ3Qga25vdyB3aGV0aGVyCisgICAgICAgIC8vIHlvdSB3YW50IHRoZSBjaGlsZHJlbiBvciBub3QuICBZb3UgbWlnaHQgYmUgcmV0dXJuaW5nIGEgd2hvbGUgbmV3CisgICAgICAgIC8vIHRyZWUuICBIbW0uLi5zdGlsbCBzZWVtcyB3ZWlyZC4gIG9oIHdlbGwuCisgICAgICAgIGFzc2VydEVxdWFscygiKDEyIChhYmMgMzQpKVxuIiwgZm91bmQpOworICAgIH0KKworICAgIEBJZ25vcmUKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU9mUnVsZVJlZlJvb3RMaXN0TGFiZWxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIElOVCAtPiBeKElOVCBeKElEIElOVCkpO1xuIiArCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDtcbiIrCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO31cbiIgKworICAgICAgICAgICAgInMgOiBeKGxhYmVsKz1hIF4oSUQgSU5UKSkgLT4gYSA7XG4iICsKKyAgICAgICAgICAgICJhIDogSU5UIDtcbiI7CisKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYWJjIDEyIDM0Iik7CisgICAgICAgIC8vIGVtaXRzIHdob2xlIHRyZWUgd2hlbiB5b3UgcmVmIHRoZSByb290IHNpbmNlIEkgY2FuJ3Qga25vdyB3aGV0aGVyCisgICAgICAgIC8vIHlvdSB3YW50IHRoZSBjaGlsZHJlbiBvciBub3QuICBZb3UgbWlnaHQgYmUgcmV0dXJuaW5nIGEgd2hvbGUgbmV3CisgICAgICAgIC8vIHRyZWUuICBIbW0uLi5zdGlsbCBzZWVtcyB3ZWlyZC4gIG9oIHdlbGwuCisgICAgICAgIGFzc2VydEVxdWFscygiKDEyIChhYmMgMzQpKVxuIiwgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXdyaXRlT2ZSdWxlUmVmQ2hpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEIElOVCAtPiBeKElEIF4oSU5UIElOVCkpO1xuIiArCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDtcbiIrCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO31cbiIgKworICAgICAgICAgICAgInMgOiBeKElEIGEpIC0+IGEgO1xuIiArCisgICAgICAgICAgICAiYSA6IF4oSU5UIElOVCkgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoMzQgMzQpXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVPZlJ1bGVSZWZMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIC0+IF4oSUQgXihJTlQgSU5UKSk7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisgICAgICAgIFN0cmluZyB0cmVlR3JhbW1hciA9CisgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisgICAgICAgICAgICAicyA6IF4oSUQgbGFiZWw9YSkgLT4gYSA7XG4iICsKKyAgICAgICAgICAgICJhIDogXihJTlQgSU5UKSA7XG4iOworCisgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIigzNCAzNClcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZU9mUnVsZVJlZkxpc3RMYWJlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIC0+IF4oSUQgXihJTlQgSU5UKSk7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisgICAgICAgIFN0cmluZyB0cmVlR3JhbW1hciA9CisgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisgICAgICAgICAgICAicyA6IF4oSUQgbGFiZWwrPWEpIC0+IGEgO1xuIiArCisgICAgICAgICAgICAiYSA6IF4oSU5UIElOVCkgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMgMzQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoMzQgMzQpXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFJld3JpdGVNb2RlV2l0aFByZWRpY2F0ZWRSZXdyaXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSURbXCJyb290XCJdIF4oSUQgSU5UKSkgfCBJTlQgLT4gXihJRFtcInJvb3RcIl0gSU5UKSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQO1xuIisKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UOyByZXdyaXRlPXRydWU7fVxuIiArCisJCQkicyA6IF4oSUQgYSkge1N5c3RlbS5vdXQucHJpbnRsbihcImFsdGVyZWQgdHJlZT1cIiskcy5zdGFydC50b1N0cmluZ1RyZWUoKSk7fTtcbiIgKworCQkJImEgOiBeKElEIElOVCkgLT4ge3RydWV9PyBeKElEW1wiaWNrXCJdIElOVClcbiIgKworCQkJIiAgICAgICAgICAgICAgLT4gSU5UXG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCQkJCQkJICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgInMiLCAiYWJjIDM0Iik7CisJCWFzc2VydEVxdWFscygiYWx0ZXJlZCB0cmVlPShyb290IChpY2sgMzQpKVxuIiArCisJCQkJCSAiKHJvb3QgKGljayAzNCkpXG4iLCBmb3VuZCk7CisJfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkU2luZ2xlTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIC0+IF4oSURbXCJyb290XCJdIElOVCk7XG4iKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrIDtcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7XG4iKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisgICAgICAgICAgICAicyA6IF4oSUQgYz0uKSAtPiAkY1xuIiArCisgICAgICAgICAgICAiICA7XG4iOworCisgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM0XG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkVW5sYWJlbGVkU2luZ2xlTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDtcbiIrCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKyAgICAgICAgICAgICJzIDogXihJRCAuKSAtPiBJRFxuIiArCisgICAgICAgICAgICAiICA7XG4iOworCisgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAzNCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiY1xuIiwgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZEdyYWJzU3VidHJlZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgeD1JTlQgeT1JTlQgej1JTlQgLT4gXihJRFtcInJvb3RcIl0gXigkeCAkeSAkeikpO1xuIisKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisgICAgICAgIFN0cmluZyB0cmVlR3JhbW1hciA9CisgICAgICAgICAgICAidHJlZSBncmFtbWFyIFRQO1xuIisKKyAgICAgICAgICAgICJvcHRpb25zIHtvdXRwdXQ9QVNUOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTsgdG9rZW5Wb2NhYj1UO31cbiIgKworICAgICAgICAgICAgInMgOiBeKElEIGM9LikgLT4gJGNcbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICJhYmMgMSAyIDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoMSAyIDMpXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkR3JhYnNTdWJ0cmVlMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgeD1JTlQgeT1JTlQgej1JTlQgLT4gSUQgXigkeCAkeSAkeik7XG4iKworICAgICAgICAgICAgIklEIDogJ2EnLi4neicrIDtcbiIgKworICAgICAgICAgICAgIklOVCA6ICcwJy4uJzknKztcbiIgKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7XG4iKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7IEFTVExhYmVsVHlwZT1Db21tb25UcmVlOyB0b2tlblZvY2FiPVQ7fVxuIiArCisgICAgICAgICAgICAicyA6IElEIGM9LiAtPiAkY1xuIiArCisgICAgICAgICAgICAiICA7XG4iOworCisgICAgICAgIFN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAxIDIgMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIigxIDIgMylcbiIsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRMaXN0TGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElOVCBJTlQgSU5UIDtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDtcbiIrCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKyAgICAgICAgICAgICJzIDogKGMrPS4pKyAtPiAkYytcbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICIxIDIgMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEgMiAzXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkTGlzdExhYmVsMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisgICAgICAgICAgICAiYSAgOiB4PUlOVCB5PUlOVCB6PUlOVCAtPiBeKCR4IF4oJHkgJHopIF4oJHkgJHopKTtcbiIrCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDtcbiIrCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDsgcmV3cml0ZT10cnVlO31cbiIgKworICAgICAgICAgICAgInMgOiBeKElOVCAoYys9LikrKSAtPiAkYytcbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAicyIsICIxIDIgMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIigyIDMpICgyIDMpXG4iLCBmb3VuZCk7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJ1bGVSZXN1bHRBc1Jvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEICc9JyBJTlQgLT4gXignPScgSUQgSU5UKTtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIkNPTE9OIDogJzonIDtcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7XG4iKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7IHJld3JpdGU9dHJ1ZTsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7IHRva2VuVm9jYWI9VDt9XG4iICsKKwkJCSJhIDogXihlcSBlMT1JRCBlMj0uKSAtPiBeKGVxICRlMiAkZTEpIDtcbiIgKworCQkJImVxIDogJz0nIHwgJzonIHs7fSA7XG4iOyAgLy8gYnVnIGluIHNldCBtYXRjaCwgZG9lc24ndCBhZGQgdG8gdHJlZSEhIGJvb2guIGZvcmNlIG5vbnNldC4KKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJCQkJCQkgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhYmMgPSAzNCIpOworCQlhc3NlcnRFcXVhbHMoIig9IDM0IGFiYylcbiIsIGZvdW5kKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVJdGVyYXRvci5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VHJlZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiZmIyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0VHJlZUl0ZXJhdG9yIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgIjxpbnZhbGlkPiIsICI8RU9SPiIsICI8RE9XTj4iLCAiPFVQPiIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIgorICAgIH07CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9kZSgpIHsKKyAgICAgICAgVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworICAgICAgICBUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisgICAgICAgIENvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIkEiKTsKKyAgICAgICAgVHJlZUl0ZXJhdG9yIGl0ID0gbmV3IFRyZWVJdGVyYXRvcih0KTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IHRvU3RyaW5nKGl0KTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJBIEVPRiI7CisgICAgICAgIFN0cmluZyBmb3VuZCA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdEZsYXRBQigpIHsKKyAgICAgICAgVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworICAgICAgICBUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisgICAgICAgIENvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihuaWwgQSBCKSIpOworICAgICAgICBUcmVlSXRlcmF0b3IgaXQgPSBuZXcgVHJlZUl0ZXJhdG9yKHQpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gdG9TdHJpbmcoaXQpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIm5pbCBET1dOIEEgQiBVUCBFT0YiOworICAgICAgICBTdHJpbmcgZm91bmQgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBQigpIHsKKyAgICAgICAgVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworICAgICAgICBUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisgICAgICAgIENvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIpIik7CisgICAgICAgIFRyZWVJdGVyYXRvciBpdCA9IG5ldyBUcmVlSXRlcmF0b3IodCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSB0b1N0cmluZyhpdCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiQSBET1dOIEIgVVAgRU9GIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QUJDKCkgeworICAgICAgICBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisgICAgICAgIFRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKyAgICAgICAgQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiBDKSIpOworICAgICAgICBUcmVlSXRlcmF0b3IgaXQgPSBuZXcgVHJlZUl0ZXJhdG9yKHQpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gdG9TdHJpbmcoaXQpOworICAgICAgICBTdHJpbmcgZXhwZWN0aW5nID0gIkEgRE9XTiBCIEMgVVAgRU9GIjsKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VmVydGljYWxMaXN0KCkgeworICAgICAgICBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisgICAgICAgIFRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKyAgICAgICAgQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgKEIgQykpIik7CisgICAgICAgIFRyZWVJdGVyYXRvciBpdCA9IG5ldyBUcmVlSXRlcmF0b3IodCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSB0b1N0cmluZyhpdCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiQSBET1dOIEIgRE9XTiBDIFVQIFVQIEVPRiI7CisgICAgICAgIFN0cmluZyBmb3VuZCA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdENvbXBsZXgoKSB7CisgICAgICAgIFRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKyAgICAgICAgVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworICAgICAgICBDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSAoQiAoQyBEIEUpIEYpIEcpIik7CisgICAgICAgIFRyZWVJdGVyYXRvciBpdCA9IG5ldyBUcmVlSXRlcmF0b3IodCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSB0b1N0cmluZyhpdCk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiQSBET1dOIEIgRE9XTiBDIERPV04gRCBFIFVQIEYgVVAgRyBVUCBFT0YiOworICAgICAgICBTdHJpbmcgZm91bmQgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXNldCgpIHsKKyAgICAgICAgVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworICAgICAgICBUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisgICAgICAgIENvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIChCIChDIEQgRSkgRikgRykiKTsKKyAgICAgICAgVHJlZUl0ZXJhdG9yIGl0ID0gbmV3IFRyZWVJdGVyYXRvcih0KTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IHRvU3RyaW5nKGl0KTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJBIERPV04gQiBET1dOIEMgRE9XTiBEIEUgVVAgRiBVUCBHIFVQIEVPRiI7CisgICAgICAgIFN0cmluZyBmb3VuZCA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKyAgICAgICAgaXQucmVzZXQoKTsKKyAgICAgICAgYnVmID0gdG9TdHJpbmcoaXQpOworICAgICAgICBleHBlY3RpbmcgPSAiQSBET1dOIEIgRE9XTiBDIERPV04gRCBFIFVQIEYgVVAgRyBVUCBFT0YiOworICAgICAgICBmb3VuZCA9IGJ1Zi50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdCdWZmZXIgdG9TdHJpbmcoVHJlZUl0ZXJhdG9yIGl0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICggaXQuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgQ29tbW9uVHJlZSBuID0gKENvbW1vblRyZWUpaXQubmV4dCgpOworICAgICAgICAgICAgYnVmLmFwcGVuZChuKTsKKyAgICAgICAgICAgIGlmICggaXQuaGFzTmV4dCgpICkgYnVmLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VHJlZU5vZGVTdHJlYW0uamF2YSBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVOb2RlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ZmMzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVOb2RlU3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBbVGhlICJCU0QgbGljZW5zZSJdCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqICBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuYW50bHIudGVzdDsKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNvbW1vblRva2VuOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuKjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqIFRlc3QgdGhlIHRyZWUgbm9kZSBzdHJlYW0uICovCitwdWJsaWMgY2xhc3MgVGVzdFRyZWVOb2RlU3RyZWFtIGV4dGVuZHMgQmFzZVRlc3QgeworCisJLyoqIEJ1aWxkIG5ldyBzdHJlYW07IGxldCdzIHVzIG92ZXJyaWRlIHRvIHRlc3Qgb3RoZXIgc3RyZWFtcy4gKi8KKwlwdWJsaWMgVHJlZU5vZGVTdHJlYW0gbmV3U3RyZWFtKE9iamVjdCB0KSB7CisJCXJldHVybiBuZXcgQ29tbW9uVHJlZU5vZGVTdHJlYW0odCk7CisJfQorCisgICAgcHVibGljIFN0cmluZyB0b1Rva2VuVHlwZVN0cmluZyhUcmVlTm9kZVN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuICgoQ29tbW9uVHJlZU5vZGVTdHJlYW0pc3RyZWFtKS50b1Rva2VuVHlwZVN0cmluZygpOworICAgIH0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKworCQlUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXdTdHJlYW0odCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiIDEwMSI7CisJCVN0cmluZyBmb3VuZCA9IHRvTm9kZXNPbmx5U3RyaW5nKHN0cmVhbSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlleHBlY3RpbmcgPSAiIDEwMSI7CisJCWZvdW5kID0gdG9Ub2tlblR5cGVTdHJpbmcoc3RyZWFtKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Q0Tm9kZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gXigxMDEgXigxMDIgMTAzKSAxMDQpCisJCVRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSkpOworCQl0LmdldENoaWxkKDApLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKworCQlUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXdTdHJlYW0odCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiIDEwMSAxMDIgMTAzIDEwNCI7CisJCVN0cmluZyBmb3VuZCA9IHRvTm9kZXNPbmx5U3RyaW5nKHN0cmVhbSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlleHBlY3RpbmcgPSAiIDEwMSAyIDEwMiAyIDEwMyAzIDEwNCAzIjsKKwkJZm91bmQgPSB0b1Rva2VuVHlwZVN0cmluZyhzdHJlYW0pOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZSByb290ID0gbmV3IENvbW1vblRyZWUoKFRva2VuKW51bGwpOworCisJCVRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSkpOworCQl0LmdldENoaWxkKDApLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKworCQlUcmVlIHUgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSk7CisKKwkJcm9vdC5hZGRDaGlsZCh0KTsKKwkJcm9vdC5hZGRDaGlsZCh1KTsKKworCQlUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXdTdHJlYW0ocm9vdCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiIDEwMSAxMDIgMTAzIDEwNCAxMDUiOworCQlTdHJpbmcgZm91bmQgPSB0b05vZGVzT25seVN0cmluZyhzdHJlYW0pOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJZXhwZWN0aW5nID0gIiAxMDEgMiAxMDIgMiAxMDMgMyAxMDQgMyAxMDUiOworCQlmb3VuZCA9IHRvVG9rZW5UeXBlU3RyaW5nKHN0cmVhbSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmxhdExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZSByb290ID0gbmV3IENvbW1vblRyZWUoKFRva2VuKW51bGwpOworCisJCXJvb3QuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpKTsKKwkJcm9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSkpOworCQlyb290LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3U3RyZWFtKHJvb3QpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIiAxMDEgMTAyIDEwMyI7CisJCVN0cmluZyBmb3VuZCA9IHRvTm9kZXNPbmx5U3RyaW5nKHN0cmVhbSk7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKworCQlleHBlY3RpbmcgPSAiIDEwMSAxMDIgMTAzIjsKKwkJZm91bmQgPSB0b1Rva2VuVHlwZVN0cmluZyhzdHJlYW0pOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExpc3RXaXRoT25lTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlIHJvb3QgPSBuZXcgQ29tbW9uVHJlZSgoVG9rZW4pbnVsbCk7CisKKwkJcm9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSkpOworCisJCVRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ld1N0cmVhbShyb290KTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIgMTAxIjsKKwkJU3RyaW5nIGZvdW5kID0gdG9Ob2Rlc09ubHlTdHJpbmcoc3RyZWFtKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCisJCWV4cGVjdGluZyA9ICIgMTAxIjsKKwkJZm91bmQgPSB0b1Rva2VuVHlwZVN0cmluZyhzdHJlYW0pOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEFvdmVyQigpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKworCQlUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXdTdHJlYW0odCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiIDEwMSAxMDIiOworCQlTdHJpbmcgZm91bmQgPSB0b05vZGVzT25seVN0cmluZyhzdHJlYW0pOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisKKwkJZXhwZWN0aW5nID0gIiAxMDEgMiAxMDIgMyI7CisJCWZvdW5kID0gdG9Ub2tlblR5cGVTdHJpbmcoc3RyZWFtKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMVCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBeKDEwMSBeKDEwMiAxMDMpIDEwNCkKKwkJVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCXQuZ2V0Q2hpbGQoMCkuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA0KSkpOworCisJCVRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ld1N0cmVhbSh0KTsKKwkJYXNzZXJ0RXF1YWxzKDEwMSwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRva2VuLkRPV04sICgoVHJlZSlzdHJlYW0uTFQoMikpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygxMDIsICgoVHJlZSlzdHJlYW0uTFQoMykpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhUb2tlbi5ET1dOLCAoKFRyZWUpc3RyZWFtLkxUKDQpKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoMTAzLCAoKFRyZWUpc3RyZWFtLkxUKDUpKS5nZXRUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoVG9rZW4uVVAsICgoVHJlZSlzdHJlYW0uTFQoNikpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscygxMDQsICgoVHJlZSlzdHJlYW0uTFQoNykpLmdldFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyhUb2tlbi5VUCwgKChUcmVlKXN0cmVhbS5MVCg4KSkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRva2VuLkVPRiwgKChUcmVlKXN0cmVhbS5MVCg5KSkuZ2V0VHlwZSgpKTsKKwkJLy8gY2hlY2sgd2F5IGFoZWFkCisJCWFzc2VydEVxdWFscyhUb2tlbi5FT0YsICgoVHJlZSlzdHJlYW0uTFQoMTAwKSkuZ2V0VHlwZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWFya1Jld2luZEVudGlyZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisJCS8vIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKwkJLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVVAgVVAgMTA0IDEwNSBVUCBFT0YKKwkJVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJVHJlZSByMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKTsKKwkJcjAuYWRkQ2hpbGQocjEpOworCQlyMS5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCQlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQlyMi5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA3KSkpOworCQlyMS5hZGRDaGlsZChyMik7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKSk7CisKKwkJVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3U3RyZWFtKHIwKTsKKwkJaW50IG0gPSBzdHJlYW0ubWFyaygpOyAvLyBNQVJLCisJCWZvciAoaW50IGs9MTsgazw9MTM7IGsrKykgeyAvLyBjb25zdW1lIHRpbCBlbmQKKwkJCXN0cmVhbS5MVCgxKTsKKwkJCXN0cmVhbS5jb25zdW1lKCk7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKFRva2VuLkVPRiwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJc3RyZWFtLnJld2luZChtKTsgICAgICAvLyBSRVdJTkQKKworCQkvLyBjb25zdW1lIHRpbCBlbmQgYWdhaW4gOikKKwkJZm9yIChpbnQgaz0xOyBrPD0xMzsgaysrKSB7IC8vIGNvbnN1bWUgdGlsIGVuZAorCQkJc3RyZWFtLkxUKDEpOworCQkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJfQorCQlhc3NlcnRFcXVhbHMoVG9rZW4uRU9GLCAoKFRyZWUpc3RyZWFtLkxUKDEpKS5nZXRUeXBlKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RNYXJrUmV3aW5kSW5NaWRkbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorCQkvLyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisJCS8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisJCVRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCVRyZWUgcjEgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSk7CisJCXIwLmFkZENoaWxkKHIxKTsKKwkJcjEuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKwkJVHJlZSByMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDYpKTsKKwkJcjIuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKwkJcjEuYWRkQ2hpbGQocjIpOworCQlyMC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA0KSkpOworCQlyMC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSkpOworCisJCVRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ld1N0cmVhbShyMCk7CisJCWZvciAoaW50IGs9MTsgazw9NzsgaysrKSB7IC8vIGNvbnN1bWUgdGlsIG1pZGRsZQorCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJCXN0cmVhbS5jb25zdW1lKCk7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKDEwNywgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJc3RyZWFtLm1hcmsoKTsgLy8gTUFSSworCQlzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIDEwNworCQlzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIFVQCisJCXN0cmVhbS5jb25zdW1lKCk7IC8vIGNvbnN1bWUgVVAKKwkJc3RyZWFtLmNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDQKKwkJc3RyZWFtLnJld2luZCgpOyAvLyBSRVdJTkQKKyAgICAgICAgc3RyZWFtLm1hcmsoKTsgICAvLyBrZWVwIHNhdmluZyBub2RlcyB0aG91Z2gKKworCQlhc3NlcnRFcXVhbHMoMTA3LCAoKFRyZWUpc3RyZWFtLkxUKDEpKS5nZXRUeXBlKCkpOworCQlzdHJlYW0uY29uc3VtZSgpOworCQlhc3NlcnRFcXVhbHMoVG9rZW4uVVAsICgoVHJlZSlzdHJlYW0uTFQoMSkpLmdldFR5cGUoKSk7CisJCXN0cmVhbS5jb25zdW1lKCk7CisJCWFzc2VydEVxdWFscyhUb2tlbi5VUCwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJYXNzZXJ0RXF1YWxzKDEwNCwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJLy8gbm93IHdlJ3JlIHBhc3QgcmV3aW5kIHBvc2l0aW9uCisJCWFzc2VydEVxdWFscygxMDUsICgoVHJlZSlzdHJlYW0uTFQoMSkpLmdldFR5cGUoKSk7CisJCXN0cmVhbS5jb25zdW1lKCk7CisJCWFzc2VydEVxdWFscyhUb2tlbi5VUCwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJYXNzZXJ0RXF1YWxzKFRva2VuLkVPRiwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKFRva2VuLlVQLCAoKFRyZWUpc3RyZWFtLkxUKC0xKSkuZ2V0VHlwZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0TWFya1Jld2luZE5lc3RlZCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBeKDEwMSBeKDEwMiAxMDMgXigxMDYgMTA3KSApIDEwNCAxMDUpCisJCS8vIHN0cmVhbSBoYXMgNyByZWFsICsgNiBuYXYgbm9kZXMKKwkJLy8gU2VxdWVuY2Ugb2YgdHlwZXM6IDEwMSBETiAxMDIgRE4gMTAzIDEwNiBETiAxMDcgVVAgVVAgMTA0IDEwNSBVUCBFT0YKKwkJVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJVHJlZSByMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKTsKKwkJcjAuYWRkQ2hpbGQocjEpOworCQlyMS5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCQlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQlyMi5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA3KSkpOworCQlyMS5hZGRDaGlsZChyMik7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKSk7CisKKwkJVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3U3RyZWFtKHIwKTsKKwkJaW50IG0gPSBzdHJlYW0ubWFyaygpOyAvLyBNQVJLIGF0IHN0YXJ0CisJCXN0cmVhbS5jb25zdW1lKCk7IC8vIGNvbnN1bWUgMTAxCisJCXN0cmVhbS5jb25zdW1lKCk7IC8vIGNvbnN1bWUgRE4KKwkJaW50IG0yID0gc3RyZWFtLm1hcmsoKTsgLy8gTUFSSyBvbiAxMDIKKwkJc3RyZWFtLmNvbnN1bWUoKTsgLy8gY29uc3VtZSAxMDIKKwkJc3RyZWFtLmNvbnN1bWUoKTsgLy8gY29uc3VtZSBETgorCQlzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIDEwMworCQlzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIDEwNgorCQlzdHJlYW0ucmV3aW5kKG0yKTsgICAgICAvLyBSRVdJTkQgdG8gMTAyCisJCWFzc2VydEVxdWFscygxMDIsICgoVHJlZSlzdHJlYW0uTFQoMSkpLmdldFR5cGUoKSk7CisJCXN0cmVhbS5jb25zdW1lKCk7CisJCWFzc2VydEVxdWFscyhUb2tlbi5ET1dOLCAoKFRyZWUpc3RyZWFtLkxUKDEpKS5nZXRUeXBlKCkpOworCQlzdHJlYW0uY29uc3VtZSgpOworCQkvLyBzdG9wIGF0IDEwMyBhbmQgcmV3aW5kIHRvIHN0YXJ0CisJCXN0cmVhbS5yZXdpbmQobSk7IC8vIFJFV0lORCB0byAxMDEKKwkJYXNzZXJ0RXF1YWxzKDEwMSwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwkJc3RyZWFtLmNvbnN1bWUoKTsKKwkJYXNzZXJ0RXF1YWxzKFRva2VuLkRPV04sICgoVHJlZSlzdHJlYW0uTFQoMSkpLmdldFR5cGUoKSk7CisJCXN0cmVhbS5jb25zdW1lKCk7CisJCWFzc2VydEVxdWFscygxMDIsICgoVHJlZSlzdHJlYW0uTFQoMSkpLmdldFR5cGUoKSk7CisJCXN0cmVhbS5jb25zdW1lKCk7CisJCWFzc2VydEVxdWFscyhUb2tlbi5ET1dOLCAoKFRyZWUpc3RyZWFtLkxUKDEpKS5nZXRUeXBlKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTZWVrRnJvbVN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKwkJLy8gc3RyZWFtIGhhcyA3IHJlYWwgKyA2IG5hdiBub2RlcworCQkvLyBTZXF1ZW5jZSBvZiB0eXBlczogMTAxIEROIDEwMiBETiAxMDMgMTA2IEROIDEwNyBVUCBVUCAxMDQgMTA1IFVQIEVPRgorCQlUcmVlIHIwID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMSkpOworCQlUcmVlIHIxID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpOworCQlyMC5hZGRDaGlsZChyMSk7CisJCXIxLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCVRyZWUgcjIgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA2KSk7CisJCXIyLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDcpKSk7CisJCXIxLmFkZENoaWxkKHIyKTsKKwkJcjAuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNCkpKTsKKwkJcjAuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNSkpKTsKKworCQlUcmVlTm9kZVN0cmVhbSBzdHJlYW0gPSBuZXdTdHJlYW0ocjApOworCQlzdHJlYW0uc2Vlayg3KTsgICAvLyBzZWVrIHRvIDEwNworCQlhc3NlcnRFcXVhbHMoMTA3LCAoKFRyZWUpc3RyZWFtLkxUKDEpKS5nZXRUeXBlKCkpOworCQlzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIDEwNworCQlzdHJlYW0uY29uc3VtZSgpOyAvLyBjb25zdW1lIFVQCisJCXN0cmVhbS5jb25zdW1lKCk7IC8vIGNvbnN1bWUgVVAKKwkJYXNzZXJ0RXF1YWxzKDEwNCwgKChUcmVlKXN0cmVhbS5MVCgxKSkuZ2V0VHlwZSgpKTsKKwl9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gXigxMDEgXigxMDIgMTAzIF4oMTA2IDEwNykgKSAxMDQgMTA1KQorICAgICAgICAvLyBzdHJlYW0gaGFzIDcgcmVhbCArIDYgbmF2IG5vZGVzCisgICAgICAgIC8vIFNlcXVlbmNlIG9mIHR5cGVzOiAxMDEgRE4gMTAyIEROIDEwMyAxMDYgRE4gMTA3IFVQIFVQIDEwNCAxMDUgVVAgRU9GCisgICAgICAgIFRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisgICAgICAgIFRyZWUgcjEgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSk7CisgICAgICAgIHIwLmFkZENoaWxkKHIxKTsKKyAgICAgICAgcjEuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKyAgICAgICAgVHJlZSByMiA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDYpKTsKKyAgICAgICAgcjIuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNykpKTsKKyAgICAgICAgcjEuYWRkQ2hpbGQocjIpOworICAgICAgICByMC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA0KSkpOworICAgICAgICByMC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA1KSkpOworCisgICAgICAgIFRyZWVOb2RlU3RyZWFtIHN0cmVhbSA9IG5ld1N0cmVhbShyMCk7CisgICAgICAgIFN0cmluZyB2ID0gdG9Ob2Rlc09ubHlTdHJpbmcoc3RyZWFtKTsgLy8gc2NhbiBhbGwKKyAgICAgICAgc3RyZWFtLnJlc2V0KCk7CisgICAgICAgIFN0cmluZyB2MiA9IHRvTm9kZXNPbmx5U3RyaW5nKHN0cmVhbSk7IC8vIHNjYW4gYWxsCisgICAgICAgIGFzc2VydEVxdWFscyh2LCB2Mik7CisgICAgfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdERlZXBUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIF4oMTAgMTAwIDEwMSBeKDIwIF4oMzAgNDAgKDUwICg2MCA3MCkpKSkgKDgwIDkwKSkpCisJCS8vIHN0cmVhbSBoYXMgOCByZWFsICsgMTAgbmF2IG5vZGVzCisJCWludCBuID0gOTsKKwkJQ29tbW9uVHJlZVtdIG5vZGVzID0gbmV3IENvbW1vblRyZWVbbl07CisJCWZvciAoaW50IGk9MDsgaTwgbjsgaSsrKSB7CisJCQlub2Rlc1tpXSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigoaSsxKSoxMCkpOworCQl9CisJCVRyZWUgZyA9IG5vZGVzWzBdOworCQlUcmVlIHJ1bGVzID0gbm9kZXNbMV07CisJCVRyZWUgcnVsZTEgPSBub2Rlc1syXTsKKwkJVHJlZSBpZCA9IG5vZGVzWzNdOworCQlUcmVlIGJsb2NrID0gbm9kZXNbNF07CisJCVRyZWUgYWx0ID0gbm9kZXNbNV07CisJCVRyZWUgcyA9IG5vZGVzWzZdOworCQlUcmVlIHJ1bGUyID0gbm9kZXNbN107CisJCVRyZWUgaWQyID0gbm9kZXNbOF07CisJCWcuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMCkpKTsKKwkJZy5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSkpOworCQlnLmFkZENoaWxkKHJ1bGVzKTsKKwkJcnVsZXMuYWRkQ2hpbGQocnVsZTEpOworCQlydWxlMS5hZGRDaGlsZChpZCk7CisJCXJ1bGUxLmFkZENoaWxkKGJsb2NrKTsKKwkJYmxvY2suYWRkQ2hpbGQoYWx0KTsKKwkJYWx0LmFkZENoaWxkKHMpOworCQlydWxlcy5hZGRDaGlsZChydWxlMik7CisJCXJ1bGUyLmFkZENoaWxkKGlkMik7CisKKwkJVHJlZU5vZGVTdHJlYW0gc3RyZWFtID0gbmV3U3RyZWFtKGcpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIiAxMCAyIDEwMCAxMDEgMjAgMiAzMCAyIDQwIDUwIDIgNjAgMiA3MCAzIDMgMyA4MCAyIDkwIDMgMyAzIjsKKwkJU3RyaW5nIGZvdW5kID0gdG9Ub2tlblR5cGVTdHJpbmcoc3RyZWFtKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9Ob2Rlc09ubHlTdHJpbmcoVHJlZU5vZGVTdHJlYW0gbm9kZXMpIHsKKyAgICAgICAgVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5vZGVzLmdldFRyZWVBZGFwdG9yKCk7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE9iamVjdCBvID0gbm9kZXMuTFQoMSk7CisgICAgICAgIGludCB0eXBlID0gYWRhcHRvci5nZXRUeXBlKG8pOworICAgICAgICB3aGlsZSAoIG8hPW51bGwgJiYgdHlwZSE9VG9rZW4uRU9GICkgeworCQkJaWYgKCAhKHR5cGU9PVRva2VuLkRPV058fHR5cGU9PVRva2VuLlVQKSApIHsKKwkJCQlidWYuYXBwZW5kKCIgIik7CisJCQkJYnVmLmFwcGVuZCh0eXBlKTsKKwkJCX0KKyAgICAgICAgICAgIG5vZGVzLmNvbnN1bWUoKTsKKyAgICAgICAgICAgIG8gPSBub2Rlcy5MVCgxKTsKKyAgICAgICAgICAgIHR5cGUgPSBhZGFwdG9yLmdldFR5cGUobyk7CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVQYXJzaW5nLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUcmVlUGFyc2luZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjRkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUcmVlUGFyc2luZy5qYXZhCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogW1RoZSAiQlNEIGxpY2Vuc2UiXQorICogIENvcHlyaWdodCAoYykgMjAxMCBUZXJlbmNlIFBhcnIKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiAgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiAgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmFudGxyLnRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RUcmVlUGFyc2luZyBleHRlbmRzIEJhc2VUZXN0IHsKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmxhdExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IElEIElOVDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7IG9wdGlvbnMge0FTVExhYmVsVHlwZT1Db21tb25UcmVlO31cbiIgKworCQkJImEgOiBJRCBJTlRcbiIgKworCQkJIiAgICB7U3lzdGVtLm91dC5wcmludGxuKCRJRCtcIiwgXCIrJElOVCk7fVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoImFiYywgMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UIC0+IF4oSUQgSU5UKTtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKwkJU3RyaW5nIHRyZWVHcmFtbWFyID0KKwkJCSJ0cmVlIGdyYW1tYXIgVFA7IG9wdGlvbnMge0FTVExhYmVsVHlwZT1Db21tb25UcmVlO31cbiIgKworCQkJImEgOiBeKElEIElOVClcbiIgKworCQkJIiAgICB7U3lzdGVtLm91dC5wcmludGxuKCRJRCtcIiwgXCIrJElOVCk7fVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoImFiYywgMzRcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RmxhdFZzVHJlZURlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBiIGMgO1xuIiArCisJCQkiYiA6IElEIElOVCAtPiBeKElEIElOVCk7XG4iICsKKwkJCSJjIDogSUQgSU5UO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDsgb3B0aW9ucyB7QVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisJCQkiYSA6IGIgYiA7XG4iICsKKwkJCSJiIDogSUQgSU5UICAgIHtTeXN0ZW0ub3V0LnByaW50KCRJRCtcIiBcIiskSU5UKTt9XG4iICsKKwkJCSIgIHwgXihJRCBJTlQpIHtTeXN0ZW0ub3V0LnByaW50KFwiXihcIiskSUQrXCIgXCIrJElOVCsnKScpO31cbiIgKworCQkJIiAgO1xuIjsKKworCQlTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisJCQkJICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhIDEgYiAyIik7CisJCWFzc2VydEVxdWFscygiXihhIDEpYiAyXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZsYXRWc1RyZWVEZWNpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IGIgYyA7XG4iICsKKwkJCSJiIDogSUQgSU5UKyAtPiBeKElEIElOVCspO1xuIiArCisJCQkiYyA6IElEIElOVCs7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQOyBvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKwkJCSJhIDogYiBiIDtcbiIgKworCQkJImIgOiBJRCBJTlQrICAgIHtTeXN0ZW0ub3V0LnByaW50KCRJRCtcIiBcIiskSU5UKTt9XG4iICsKKwkJCSIgIHwgXih4PUlEICh5PUlOVCkrKSB7U3lzdGVtLm91dC5wcmludChcIl4oXCIrJHgrJyAnKyR5KycpJyk7fVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwKKwkJCQkgICAgImEgMSAyIDMgYiA0IDUiKTsKKwkJYXNzZXJ0RXF1YWxzKCJeKGEgMyliIDVcbiIsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Q3ljbGljREZBTG9va2FoZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQrIFBFUklPRDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIlNFTUkgOiAnOycgO1xuIisKKwkJCSJQRVJJT0QgOiAnLicgO1xuIisKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQOyBvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKwkJCSJhIDogSUQgSU5UKyBQRVJJT0Qge1N5c3RlbS5vdXQucHJpbnQoXCJhbHQgMVwiKTt9IisKKwkJCSIgIHwgSUQgSU5UKyBTRU1JICAge1N5c3RlbS5vdXQucHJpbnQoXCJhbHQgMlwiKTt9XG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCSAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSAxIDIgMy4iKTsKKwkJYXNzZXJ0RXF1YWxzKCJhbHQgMVxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RUZW1wbGF0ZU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UO1xuIiArCisJCQkiSUQgOiAnYScuLid6JysgO1xuIiArCisJCQkiSU5UIDogJzAnLi4nOScrO1xuIiArCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD10ZW1wbGF0ZTsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisJCQkicyA6IGEge1N5c3RlbS5vdXQucHJpbnRsbigkYS5zdCk7fTtcbiIgKworCQkJImEgOiBJRCBJTlQgLT4ge25ldyBTdHJpbmdUZW1wbGF0ZSgkSU5ULnRleHQpfVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJzIiwgImFiYyAzNCIpOworCQlhc3NlcnRFcXVhbHMoIjM0XG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE51bGxhYmxlQ2hpbGRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiBJRCBJTlQ/IC0+IF4oSUQgSU5UPyk7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQOyBvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKwkJCSJhIDogXihJRCBJTlQ/KVxuIiArCisJCQkiICAgIHtTeXN0ZW0ub3V0LnByaW50bG4oJElEKTt9XG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCSAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIik7CisJCWFzc2VydEVxdWFscygiYWJjXG4iLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE51bGxhYmxlQ2hpbGRMaXN0MigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZ3JhbW1hciA9CisJCQkiZ3JhbW1hciBUO1xuIiArCisJCQkib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKwkJCSJhIDogSUQgSU5UPyBTRU1JIC0+IF4oSUQgSU5UPykgU0VNSSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJTRU1JIDogJzsnIDtcbiIrCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDsgb3B0aW9ucyB7QVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisJCQkiYSA6IF4oSUQgSU5UPykgU0VNSVxuIiArCisJCQkiICAgIHtTeXN0ZW0ub3V0LnByaW50bG4oJElEKTt9XG4iICsKKwkJCSIgIDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCSAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjOyIpOworCQlhc3NlcnRFcXVhbHMoImFiY1xuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROdWxsYWJsZUNoaWxkTGlzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGdyYW1tYXIgPQorCQkJImdyYW1tYXIgVDtcbiIgKworCQkJIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisJCQkiYSA6IHg9SUQgSU5UPyAoeT1JRCk/IFNFTUkgLT4gXigkeCBJTlQ/ICR5PykgU0VNSSA7XG4iICsKKwkJCSJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKwkJCSJJTlQgOiAnMCcuLic5Jys7XG4iICsKKwkJCSJTRU1JIDogJzsnIDtcbiIrCisJCQkiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworCQlTdHJpbmcgdHJlZUdyYW1tYXIgPQorCQkJInRyZWUgZ3JhbW1hciBUUDsgb3B0aW9ucyB7QVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisJCQkiYSA6IF4oSUQgSU5UPyBiKSBTRU1JXG4iICsKKwkJCSIgICAge1N5c3RlbS5vdXQucHJpbnRsbigkSUQrXCIsIFwiKyRiLnRleHQpO31cbiIgKworCQkJIiAgO1xuIisKKwkJCSJiIDogSUQ/IDtcbiI7CisKKwkJU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorCQkJCSAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYWJjIGRlZjsiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMsIGRlZlxuIiwgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RBY3Rpb25zQWZ0ZXJSb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBncmFtbWFyID0KKwkJCSJncmFtbWFyIFQ7XG4iICsKKwkJCSJvcHRpb25zIHtvdXRwdXQ9QVNUO31cbiIgKworCQkJImEgOiB4PUlEIElOVD8gU0VNSSAtPiBeKCR4IElOVD8pIDtcbiIgKworCQkJIklEIDogJ2EnLi4neicrIDtcbiIgKworCQkJIklOVCA6ICcwJy4uJzknKztcbiIgKworCQkJIlNFTUkgOiAnOycgO1xuIisKKwkJCSJXUyA6ICgnICd8J1xcbicpIHskY2hhbm5lbD1ISURERU47fSA7XG4iOworCisJCVN0cmluZyB0cmVlR3JhbW1hciA9CisJCQkidHJlZSBncmFtbWFyIFRQOyBvcHRpb25zIHtBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKwkJCSJhIEBpbml0IHtpbnQgeD0wO30gOiBeKElEIHt4PTE7fSB7eD0yO30gSU5UPylcbiIgKworCQkJIiAgICB7U3lzdGVtLm91dC5wcmludGxuKCRJRCtcIiwgXCIreCk7fVxuIiArCisJCQkiICA7XG4iOworCisJCVN0cmluZyBmb3VuZCA9IGV4ZWNUcmVlUGFyc2VyKCJULmciLCBncmFtbWFyLCAiVFBhcnNlciIsICJUUC5nIiwKKwkJCQkgICAgdHJlZUdyYW1tYXIsICJUUCIsICJUTGV4ZXIiLCAiYSIsICJhIiwgImFiYzsiKTsKKwkJYXNzZXJ0RXF1YWxzKCJhYmMsIDJcbiIsIGZvdW5kKTsKKwl9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRMb29rYWhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEICcrJ14gSU5UO1xuIiArCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiU0VNSSA6ICc7JyA7XG4iKworICAgICAgICAgICAgIlBFUklPRCA6ICcuJyA7XG4iKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7IG9wdGlvbnMge3Rva2VuVm9jYWI9VDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisgICAgICAgICAgICAiYSA6IF4oJysnIC4gSU5UKSB7U3lzdGVtLm91dC5wcmludChcImFsdCAxXCIpO30iKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhICsgMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFsdCAxXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkTG9va2FoZWFkMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgJysnXiBJTlQ7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJTRU1JIDogJzsnIDtcbiIrCisgICAgICAgICAgICAiUEVSSU9EIDogJy4nIDtcbiIrCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDsgb3B0aW9ucyB7dG9rZW5Wb2NhYj1UOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKyAgICAgICAgICAgICJhIDogXignKycgLiBJTlQpIHtTeXN0ZW0ub3V0LnByaW50KFwiYWx0IDFcIik7fSIrCisgICAgICAgICAgICAiICB8IF4oJysnIC4gLikgICB7U3lzdGVtLm91dC5wcmludChcImFsdCAyXCIpO31cbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICAvLyBBTUJJRyB1cG9uICcrJyBET1dOIElOVCBVUCBldGMuLiBidXQgc28gd2hhdC4KKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhICsgMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFsdCAxXG4iLCBmb3VuZCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkTG9va2FoZWFkMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZ3JhbW1hciA9CisgICAgICAgICAgICAiZ3JhbW1hciBUO1xuIiArCisgICAgICAgICAgICAib3B0aW9ucyB7b3V0cHV0PUFTVDt9XG4iICsKKyAgICAgICAgICAgICJhIDogSUQgJysnXiBJTlQ7XG4iICsKKyAgICAgICAgICAgICJJRCA6ICdhJy4uJ3onKyA7XG4iICsKKyAgICAgICAgICAgICJJTlQgOiAnMCcuLic5Jys7XG4iICsKKyAgICAgICAgICAgICJTRU1JIDogJzsnIDtcbiIrCisgICAgICAgICAgICAiUEVSSU9EIDogJy4nIDtcbiIrCisgICAgICAgICAgICAiV1MgOiAoJyAnfCdcXG4nKSB7JGNoYW5uZWw9SElEREVOO30gO1xuIjsKKworICAgICAgICBTdHJpbmcgdHJlZUdyYW1tYXIgPQorICAgICAgICAgICAgInRyZWUgZ3JhbW1hciBUUDsgb3B0aW9ucyB7dG9rZW5Wb2NhYj1UOyBBU1RMYWJlbFR5cGU9Q29tbW9uVHJlZTt9XG4iICsKKyAgICAgICAgICAgICJhIDogXignKycgSUQgSU5UKSB7U3lzdGVtLm91dC5wcmludChcImFsdCAxXCIpO30iKworICAgICAgICAgICAgIiAgfCBeKCcrJyAuIC4pICAge1N5c3RlbS5vdXQucHJpbnQoXCJhbHQgMlwiKTt9XG4iICsKKyAgICAgICAgICAgICIgIDtcbiI7CisKKyAgICAgICAgLy8gQU1CSUcgdXBvbiAnKycgRE9XTiBJTlQgVVAgZXRjLi4gYnV0IHNvIHdoYXQuCisKKyAgICAgICAgU3RyaW5nIGZvdW5kID0gZXhlY1RyZWVQYXJzZXIoIlQuZyIsIGdyYW1tYXIsICJUUGFyc2VyIiwgIlRQLmciLAorICAgICAgICAgICAgICAgICAgICB0cmVlR3JhbW1hciwgIlRQIiwgIlRMZXhlciIsICJhIiwgImEiLCAiYSArIDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbHQgMVxuIiwgZm91bmQpOworICAgIH0KKworICAgIEBUZXN0IHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZFBsdXNMb29rYWhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGdyYW1tYXIgPQorICAgICAgICAgICAgImdyYW1tYXIgVDtcbiIgKworICAgICAgICAgICAgIm9wdGlvbnMge291dHB1dD1BU1Q7fVxuIiArCisgICAgICAgICAgICAiYSA6IElEICcrJ14gSU5UO1xuIiArCisgICAgICAgICAgICAiSUQgOiAnYScuLid6JysgO1xuIiArCisgICAgICAgICAgICAiSU5UIDogJzAnLi4nOScrO1xuIiArCisgICAgICAgICAgICAiU0VNSSA6ICc7JyA7XG4iKworICAgICAgICAgICAgIlBFUklPRCA6ICcuJyA7XG4iKworICAgICAgICAgICAgIldTIDogKCcgJ3wnXFxuJykgeyRjaGFubmVsPUhJRERFTjt9IDtcbiI7CisKKyAgICAgICAgU3RyaW5nIHRyZWVHcmFtbWFyID0KKyAgICAgICAgICAgICJ0cmVlIGdyYW1tYXIgVFA7IG9wdGlvbnMge3Rva2VuVm9jYWI9VDsgQVNUTGFiZWxUeXBlPUNvbW1vblRyZWU7fVxuIiArCisgICAgICAgICAgICAiYSA6IF4oJysnIElOVCBJTlQgKSB7U3lzdGVtLm91dC5wcmludChcImFsdCAxXCIpO30iKworICAgICAgICAgICAgIiAgfCBeKCcrJyAuKykgICB7U3lzdGVtLm91dC5wcmludChcImFsdCAyXCIpO31cbiIgKworICAgICAgICAgICAgIiAgO1xuIjsKKworICAgICAgICAvLyBBTUJJRyB1cG9uICcrJyBET1dOIElOVCBVUCBldGMuLiBidXQgc28gd2hhdC4KKworICAgICAgICBTdHJpbmcgZm91bmQgPSBleGVjVHJlZVBhcnNlcigiVC5nIiwgZ3JhbW1hciwgIlRQYXJzZXIiLCAiVFAuZyIsCisgICAgICAgICAgICAgICAgICAgIHRyZWVHcmFtbWFyLCAiVFAiLCAiVExleGVyIiwgImEiLCAiYSIsICJhICsgMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFsdCAyXG4iLCBmb3VuZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUcmVlV2l6YXJkLmphdmEgYi9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUcmVlV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyYmQxYgotLS0gL2Rldi9udWxsCisrKyBiL2FudGxyLTMuNC90b29sL3NyYy90ZXN0L2phdmEvb3JnL2FudGxyL3Rlc3QvVGVzdFRyZWVXaXphcmQuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZUFkYXB0b3I7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlQWRhcHRvcjsKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWVXaXphcmQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworcHVibGljIGNsYXNzIFRlc3RUcmVlV2l6YXJkIGV4dGVuZHMgQmFzZVRlc3QgeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gdG9rZW5zID0KKwkJbmV3IFN0cmluZ1tdIHsiIiwgIiIsICIiLCAiIiwgIiIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiSUQiLCAiVkFSIn07CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTm9kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIklEIik7CisJCVN0cmluZyBmb3VuZCA9IHQudG9TdHJpbmdUcmVlKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiSUQiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFNpbmdsZU5vZGVXaXRoQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiSURbZm9vXSIpOworCQlTdHJpbmcgZm91bmQgPSB0LnRvU3RyaW5nVHJlZSgpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gImZvbyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTm9kZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSkiKTsKKwkJU3RyaW5nIGZvdW5kID0gdC50b1N0cmluZ1RyZWUoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJBIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMZXZlbFRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCIEMgRCkiKTsKKwkJU3RyaW5nIGZvdW5kID0gdC50b1N0cmluZ1RyZWUoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoQSBCIEMgRCkiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExpc3RUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKG5pbCBBIEIgQykiKTsKKwkJU3RyaW5nIGZvdW5kID0gdC50b1N0cmluZ1RyZWUoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJBIEIgQyI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZExpc3RUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiQSBCIEMiKTsKKwkJYXNzZXJ0VHJ1ZSh0PT1udWxsKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlTGV2ZWxUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgKEIgQykgKEIgRCkgRSkiKTsKKwkJU3RyaW5nIGZvdW5kID0gdC50b1N0cmluZ1RyZWUoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoQSAoQiBDKSAoQiBEKSBFKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTm9kZUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiSUQiKTsKKwkJTWFwIG0gPSB3aXouaW5kZXgodCk7CisJCVN0cmluZyBmb3VuZCA9IG0udG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJ7MTA9W0lEXX0iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdE5vUmVwZWF0c0luZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiBDIEQpIik7CisJCU1hcCBtID0gd2l6LmluZGV4KHQpOworCQlTdHJpbmcgZm91bmQgPSBzb3J0TWFwVG9TdHJpbmcobSk7CisgICAgICAgIFN0cmluZyBleHBlY3RpbmcgPSAiezU9W0FdLCA2PVtCXSwgNz1bQ10sIDg9W0RdfSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0c0luZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpOworCQlNYXAgbSA9IHdpei5pbmRleCh0KTsKKwkJU3RyaW5nIGZvdW5kID0gIHNvcnRNYXBUb1N0cmluZyhtKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGluZyA9ICJ7NT1bQSwgQV0sIDY9W0IsIEIsIEJdLCA3PVtDXSwgOD1bRCwgRF19IjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3ROb1JlcGVhdHNWaXNpdCgpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgQyBEKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgd2l6LmdldFRva2VuVHlwZSgiQiIpLCBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworCQkJcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQpIHsKKwkJCQllbGVtZW50cy5hZGQodCk7CisJCQl9CisJCX0pOworCQlTdHJpbmcgZm91bmQgPSBlbGVtZW50cy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIltCXSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0Tm9SZXBlYXRzVmlzaXQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgd2l6LmdldFRva2VuVHlwZSgiQyIpLAorCQkJCQkgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworCQkJCQkJCXB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisJCQkJCQkJCWVsZW1lbnRzLmFkZCh0KTsKKwkJCQkJCQl9CisJCQkJCSAgIH0pOworCQlTdHJpbmcgZm91bmQgPSBlbGVtZW50cy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIltDXSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0c1Zpc2l0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgd2l6LmdldFRva2VuVHlwZSgiQiIpLAorCQkJCQkgICBuZXcgVHJlZVdpemFyZC5WaXNpdG9yKCkgeworCQkJCQkJCXB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0KSB7CisJCQkJCQkJCWVsZW1lbnRzLmFkZCh0KTsKKwkJCQkJCQl9CisJCQkJCSAgIH0pOworCQlTdHJpbmcgZm91bmQgPSBlbGVtZW50cy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIltCLCBCLCBCXSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0c1Zpc2l0MigpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgKEEgQyBCKSBCIEQgRCkiKTsKKwkJZmluYWwgTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJd2l6LnZpc2l0KHQsIHdpei5nZXRUb2tlblR5cGUoIkEiKSwKKwkJCQkJICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKwkJCQkJCQlwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCkgeworCQkJCQkJCQllbGVtZW50cy5hZGQodCk7CisJCQkJCQkJfQorCQkJCQkgICB9KTsKKwkJU3RyaW5nIGZvdW5kID0gZWxlbWVudHMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJbQSwgQV0iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGVhdHNWaXNpdFdpdGhDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiAoQSBDIEIpIEIgRCBEKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgd2l6LmdldFRva2VuVHlwZSgiQiIpLAorCQkgICBuZXcgVHJlZVdpemFyZC5Db250ZXh0VmlzaXRvcigpIHsKKwkJCSAgIHB1YmxpYyB2b2lkIHZpc2l0KE9iamVjdCB0LCBPYmplY3QgcGFyZW50LCBpbnQgY2hpbGRJbmRleCwgTWFwIGxhYmVscykgeworCQkJCSAgIGVsZW1lbnRzLmFkZChhZGFwdG9yLmdldFRleHQodCkrIkAiKworCQkJCQkJCQkocGFyZW50IT1udWxsP2FkYXB0b3IuZ2V0VGV4dChwYXJlbnQpOiJuaWwiKSsKKwkJCQkJCQkJIlsiK2NoaWxkSW5kZXgrIl0iKTsKKwkJCSAgIH0KKwkJICAgfSk7CisJCVN0cmluZyBmb3VuZCA9IGVsZW1lbnRzLnRvU3RyaW5nKCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiW0JAQVswXSwgQkBBWzFdLCBCQEFbMl1dIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRzVmlzaXRXaXRoTnVsbFBhcmVudEFuZENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCIChBIEMgQikgQiBEIEQpIik7CisJCWZpbmFsIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXdpei52aXNpdCh0LCB3aXouZ2V0VG9rZW5UeXBlKCJBIiksCisJCSAgIG5ldyBUcmVlV2l6YXJkLkNvbnRleHRWaXNpdG9yKCkgeworCQkJICAgcHVibGljIHZvaWQgdmlzaXQoT2JqZWN0IHQsIE9iamVjdCBwYXJlbnQsIGludCBjaGlsZEluZGV4LCBNYXAgbGFiZWxzKSB7CisJCQkJICAgZWxlbWVudHMuYWRkKGFkYXB0b3IuZ2V0VGV4dCh0KSsiQCIrCisJCQkJCQkJCShwYXJlbnQhPW51bGw/YWRhcHRvci5nZXRUZXh0KHBhcmVudCk6Im5pbCIpKworCQkJCQkJCQkiWyIrY2hpbGRJbmRleCsiXSIpOworCQkJICAgfQorCQkgICB9KTsKKwkJU3RyaW5nIGZvdW5kID0gZWxlbWVudHMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJbQUBuaWxbMF0sIEFAQVsxXV0iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFZpc2l0UGF0dGVybigpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgQyAoQSBCKSBEKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgIihBIEIpIiwKKwkJCQkJICAgbmV3IFRyZWVXaXphcmQuVmlzaXRvcigpIHsKKwkJCQkJCQlwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCkgeworCQkJCQkJCQllbGVtZW50cy5hZGQodCk7CisJCQkJCQkJfQorCQkJCQkgICB9KTsKKwkJU3RyaW5nIGZvdW5kID0gZWxlbWVudHMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJbQV0iOyAvLyBzaG91bGRuJ3QgbWF0Y2ggb3ZlcmFsbCByb290LCBqdXN0IChBIEIpCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VmlzaXRQYXR0ZXJuTXVsdGlwbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCIEMgKEEgQikgKEQgKEEgQikpKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgIihBIEIpIiwKKwkJCQkJICAgbmV3IFRyZWVXaXphcmQuQ29udGV4dFZpc2l0b3IoKSB7CisJCQkJCQkgICBwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCwgT2JqZWN0IHBhcmVudCwgaW50IGNoaWxkSW5kZXgsIE1hcCBsYWJlbHMpIHsKKwkJCQkJCQkgICBlbGVtZW50cy5hZGQoYWRhcHRvci5nZXRUZXh0KHQpKyJAIisKKwkJCQkJCQkJCQkJKHBhcmVudCE9bnVsbD9hZGFwdG9yLmdldFRleHQocGFyZW50KToibmlsIikrCisJCQkJCQkJCQkJCSJbIitjaGlsZEluZGV4KyJdIik7CisJCQkJCQkgICB9CisJCQkJCSAgIH0pOworCQlTdHJpbmcgZm91bmQgPSBlbGVtZW50cy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIltBQEFbMl0sIEFARFswXV0iOyAvLyBzaG91bGRuJ3QgbWF0Y2ggb3ZlcmFsbCByb290LCBqdXN0IChBIEIpCisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIGZvdW5kKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VmlzaXRQYXR0ZXJuTXVsdGlwbGVXaXRoTGFiZWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiBDIChBW2Zvb10gQltiYXJdKSAoRCAoQVtiaWddIEJbZG9nXSkpKSIpOworCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aXoudmlzaXQodCwgIiglYTpBICViOkIpIiwKKwkJCQkJICAgbmV3IFRyZWVXaXphcmQuQ29udGV4dFZpc2l0b3IoKSB7CisJCQkJCQkgICBwdWJsaWMgdm9pZCB2aXNpdChPYmplY3QgdCwgT2JqZWN0IHBhcmVudCwgaW50IGNoaWxkSW5kZXgsIE1hcCBsYWJlbHMpIHsKKwkJCQkJCQkgICBlbGVtZW50cy5hZGQoYWRhcHRvci5nZXRUZXh0KHQpKyJAIisKKwkJCQkJCQkJCQkJKHBhcmVudCE9bnVsbD9hZGFwdG9yLmdldFRleHQocGFyZW50KToibmlsIikrCisJCQkJCQkJCQkJCSJbIitjaGlsZEluZGV4KyJdIitsYWJlbHMuZ2V0KCJhIikrIiYiK2xhYmVscy5nZXQoImIiKSk7CisJCQkJCQkgICB9CisJCQkJCSAgIH0pOworCQlTdHJpbmcgZm91bmQgPSBlbGVtZW50cy50b1N0cmluZygpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIltmb29AQVsyXWZvbyZiYXIsIGJpZ0BEWzBdYmlnJmRvZ10iOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCBmb3VuZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiBDKSIpOworCQlib29sZWFuIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoQSBCIEMpIik7CisJCWFzc2VydFRydWUodmFsaWQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZVNpbmdsZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCJBIik7CisJCWJvb2xlYW4gdmFsaWQgPSB3aXoucGFyc2UodCwgIkEiKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlRmxhdFRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIobmlsIEEgQiBDKSIpOworCQlib29sZWFuIHZhbGlkID0gd2l6LnBhcnNlKHQsICIobmlsIEEgQiBDKSIpOworCQlhc3NlcnRUcnVlKHZhbGlkKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCIEMpIik7CisJCWJvb2xlYW4gdmFsaWQgPSB3aXoucGFyc2UodCwgIihBIC4gLikiKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFBhcnNlV2l0aFRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCW2Zvb10gQ1tiYXJdKSIpOworCQkvLyBDIHBhdHRlcm4gaGFzIG5vIHRleHQgYXJnIHNvIGRlc3BpdGUgW2Jhcl0gaW4gdCwgbm8gbmVlZAorCQkvLyB0byBtYXRjaCB0ZXh0LS1jaGVjayBzdHJ1Y3R1cmUgb25seS4KKwkJYm9vbGVhbiB2YWxpZCA9IHdpei5wYXJzZSh0LCAiKEEgQltmb29dIEMpIik7CisJCWFzc2VydFRydWUodmFsaWQpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZVdpdGhUZXh0MigpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEJbVF9fMzJdIChDIChEIEVbYV0pKSkiKTsKKwkJLy8gQyBwYXR0ZXJuIGhhcyBubyB0ZXh0IGFyZyBzbyBkZXNwaXRlIFtiYXJdIGluIHQsIG5vIG5lZWQKKwkJLy8gdG8gbWF0Y2ggdGV4dC0tY2hlY2sgc3RydWN0dXJlIG9ubHkuCisJCWJvb2xlYW4gdmFsaWQgPSB3aXoucGFyc2UodCwgIihBIEJbZm9vXSBDKSIpOworCQlhc3NlcnRFcXVhbHMoIihBIFRfXzMyIChDIChEIGEpKSkiLCB0LnRvU3RyaW5nVHJlZSgpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VXaXRoVGV4dEZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiBDKSIpOworCQlib29sZWFuIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoQVtmb29dIEIgQykiKTsKKwkJYXNzZXJ0VHJ1ZSghdmFsaWQpOyAvLyBmYWlscworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZUxhYmVscygpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgQykiKTsKKwkJTWFwIGxhYmVscyA9IG5ldyBIYXNoTWFwKCk7CisJCWJvb2xlYW4gdmFsaWQgPSB3aXoucGFyc2UodCwgIiglYTpBICViOkIgJWM6QykiLCBsYWJlbHMpOworCQlhc3NlcnRUcnVlKHZhbGlkKTsKKwkJYXNzZXJ0RXF1YWxzKCJBIiwgbGFiZWxzLmdldCgiYSIpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoIkIiLCBsYWJlbHMuZ2V0KCJiIikudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygiQyIsIGxhYmVscy5nZXQoImMiKS50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VXaXRoV2lsZGNhcmRMYWJlbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCIEMpIik7CisJCU1hcCBsYWJlbHMgPSBuZXcgSGFzaE1hcCgpOworCQlib29sZWFuIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoQSAlYjouICVjOi4pIiwgbGFiZWxzKTsKKwkJYXNzZXJ0VHJ1ZSh2YWxpZCk7CisJCWFzc2VydEVxdWFscygiQiIsIGxhYmVscy5nZXQoImIiKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDIiwgbGFiZWxzLmdldCgiYyIpLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZUxhYmVsc0FuZFRlc3RUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQltmb29dIEMpIik7CisJCU1hcCBsYWJlbHMgPSBuZXcgSGFzaE1hcCgpOworCQlib29sZWFuIHZhbGlkID0gd2l6LnBhcnNlKHQsICIoJWE6QSAlYjpCW2Zvb10gJWM6QykiLCBsYWJlbHMpOworCQlhc3NlcnRUcnVlKHZhbGlkKTsKKwkJYXNzZXJ0RXF1YWxzKCJBIiwgbGFiZWxzLmdldCgiYSIpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoImZvbyIsIGxhYmVscy5nZXQoImIiKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDIiwgbGFiZWxzLmdldCgiYyIpLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RQYXJzZUxhYmVsc0luTmVzdGVkVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdCA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIChCIEMpIChEIEUpKSIpOworCQlNYXAgbGFiZWxzID0gbmV3IEhhc2hNYXAoKTsKKwkJYm9vbGVhbiB2YWxpZCA9IHdpei5wYXJzZSh0LCAiKCVhOkEgKCViOkIgJWM6QykgKCVkOkQgJWU6RSkgKSIsIGxhYmVscyk7CisJCWFzc2VydFRydWUodmFsaWQpOworCQlhc3NlcnRFcXVhbHMoIkEiLCBsYWJlbHMuZ2V0KCJhIikudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygiQiIsIGxhYmVscy5nZXQoImIiKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJDIiwgbGFiZWxzLmdldCgiYyIpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoIkQiLCBsYWJlbHMuZ2V0KCJkIikudG9TdHJpbmcoKSk7CisJCWFzc2VydEVxdWFscygiRSIsIGxhYmVscy5nZXQoImUiKS50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0MSA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgQykiKTsKKwkJQ29tbW9uVHJlZSB0MiA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgQykiKTsKKwkJYm9vbGVhbiBzYW1lID0gVHJlZVdpemFyZC5lcXVhbHModDEsIHQyLCBhZGFwdG9yKTsKKwkJYXNzZXJ0VHJ1ZShzYW1lKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzV2l0aFRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVHJlZVdpemFyZCB3aXogPSBuZXcgVHJlZVdpemFyZChhZGFwdG9yLCB0b2tlbnMpOworCQlDb21tb25UcmVlIHQxID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQltmb29dIEMpIik7CisJCUNvbW1vblRyZWUgdDIgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCW2Zvb10gQykiKTsKKwkJYm9vbGVhbiBzYW1lID0gVHJlZVdpemFyZC5lcXVhbHModDEsIHQyLCBhZGFwdG9yKTsKKwkJYXNzZXJ0VHJ1ZShzYW1lKTsKKwl9CisJCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEVxdWFsc1dpdGhNaXNtYXRjaGVkVGV4dCgpIHRocm93cyBFeGNlcHRpb24geworCQlUcmVlV2l6YXJkIHdpeiA9IG5ldyBUcmVlV2l6YXJkKGFkYXB0b3IsIHRva2Vucyk7CisJCUNvbW1vblRyZWUgdDEgPSAoQ29tbW9uVHJlZSl3aXouY3JlYXRlKCIoQSBCW2Zvb10gQykiKTsKKwkJQ29tbW9uVHJlZSB0MiA9IChDb21tb25UcmVlKXdpei5jcmVhdGUoIihBIEIgQykiKTsKKwkJYm9vbGVhbiBzYW1lID0gVHJlZVdpemFyZC5lcXVhbHModDEsIHQyLCBhZGFwdG9yKTsKKwkJYXNzZXJ0VHJ1ZSghc2FtZSk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEZpbmRQYXR0ZXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXaXphcmQgd2l6ID0gbmV3IFRyZWVXaXphcmQoYWRhcHRvciwgdG9rZW5zKTsKKwkJQ29tbW9uVHJlZSB0ID0gKENvbW1vblRyZWUpd2l6LmNyZWF0ZSgiKEEgQiBDIChBW2Zvb10gQltiYXJdKSAoRCAoQVtiaWddIEJbZG9nXSkpKSIpOworCQlmaW5hbCBMaXN0IHN1YnRyZWVzID0gd2l6LmZpbmQodCwgIihBIEIpIik7CisJCUxpc3QgZWxlbWVudHMgPSBzdWJ0cmVlczsKKwkJU3RyaW5nIGZvdW5kID0gZWxlbWVudHMudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICJbZm9vLCBiaWddIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgZm91bmQpOworCX0KKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnRsci0zLjQvdG9vbC9zcmMvdGVzdC9qYXZhL29yZy9hbnRsci90ZXN0L1Rlc3RUcmVlcy5qYXZhIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VHJlZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNlNDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50bHItMy40L3Rvb2wvc3JjL3Rlc3QvamF2YS9vcmcvYW50bHIvdGVzdC9UZXN0VHJlZXMuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIFtUaGUgIkJTRCBsaWNlbnNlIl0KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgVGVyZW5jZSBQYXJyCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5hbnRsci50ZXN0OworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW47CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZUFkYXB0b3I7CitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZUFkYXB0b3I7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0VHJlZXMgZXh0ZW5kcyBCYXNlVGVzdCB7CisJVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKwlzdGF0aWMgY2xhc3MgViBleHRlbmRzIENvbW1vblRyZWUgeworCQlwdWJsaWMgaW50IHg7CisJCXB1YmxpYyBWKFRva2VuIHQpIHsgdGhpcy50b2tlbiA9IHQ7fQorCQlwdWJsaWMgVihpbnQgdHR5cGUsIGludCB4KSB7IHRoaXMueD14OyB0b2tlbj1uZXcgQ29tbW9uVG9rZW4odHR5cGUpOyB9CisJCXB1YmxpYyBWKGludCB0dHlwZSwgVG9rZW4gdCwgaW50IHgpIHsgdG9rZW49dDsgdGhpcy54PXg7fQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gKHRva2VuIT1udWxsP3Rva2VuLmdldFRleHQoKToiIikrIjxWPiI7fQorCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJYXNzZXJ0TnVsbCh0LnBhcmVudCk7CisJCWFzc2VydEVxdWFscygtMSwgdC5jaGlsZEluZGV4KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0VHdvQ2hpbGRyZW5PZk5pbFJvb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbW9uVHJlZSByb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLm5pbCgpOworCQlDb21tb25UcmVlIHQgPSBuZXcgVigxMDEsIDIpOworCQlDb21tb25UcmVlIHUgPSBuZXcgVihuZXcgQ29tbW9uVG9rZW4oMTAyLCIxMDIiKSk7CisJCWFkYXB0b3IuYWRkQ2hpbGQocm9vdF8wLCB0KTsKKwkJYWRhcHRvci5hZGRDaGlsZChyb290XzAsIHUpOworCQlhc3NlcnROdWxsKHJvb3RfMC5wYXJlbnQpOworCQlhc3NlcnRFcXVhbHMoLTEsIHJvb3RfMC5jaGlsZEluZGV4KTsKKwkJYXNzZXJ0RXF1YWxzKDAsIHQuY2hpbGRJbmRleCk7CisJCWFzc2VydEVxdWFscygxLCB1LmNoaWxkSW5kZXgpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3Q0Tm9kZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gXigxMDEgXigxMDIgMTAzKSAxMDQpCisJCUNvbW1vblRyZWUgcjAgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCXIwLmdldENoaWxkKDApLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisKKwkJYXNzZXJ0TnVsbChyMC5wYXJlbnQpOworCQlhc3NlcnRFcXVhbHMoLTEsIHIwLmNoaWxkSW5kZXgpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIF4obmlsIDEwMSAxMDIgMTAzKQorCQlDb21tb25UcmVlIHIwID0gbmV3IENvbW1vblRyZWUoKFRva2VuKW51bGwpOworCQlDb21tb25UcmVlIGMwLCBjMSwgYzI7CisJCXIwLmFkZENoaWxkKGMwPW5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCXIwLmFkZENoaWxkKGMxPW5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCXIwLmFkZENoaWxkKGMyPW5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJYXNzZXJ0TnVsbChyMC5wYXJlbnQpOworCQlhc3NlcnRFcXVhbHMoLTEsIHIwLmNoaWxkSW5kZXgpOworCQlhc3NlcnRFcXVhbHMocjAsIGMwLnBhcmVudCk7CisJCWFzc2VydEVxdWFscygwLCBjMC5jaGlsZEluZGV4KTsKKwkJYXNzZXJ0RXF1YWxzKHIwLCBjMS5wYXJlbnQpOworCQlhc3NlcnRFcXVhbHMoMSwgYzEuY2hpbGRJbmRleCk7CQkKKwkJYXNzZXJ0RXF1YWxzKHIwLCBjMi5wYXJlbnQpOworCQlhc3NlcnRFcXVhbHMoMiwgYzIuY2hpbGRJbmRleCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdExpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIEFkZCBjaGlsZCBeKG5pbCAxMDEgMTAyIDEwMykgdG8gcm9vdCA1CisJCS8vIHNob3VsZCBwdWxsIDEwMSAxMDIgMTAzIGRpcmVjdGx5IHRvIGJlY29tZSA1J3MgY2hpbGQgbGlzdAorCQlDb21tb25UcmVlIHJvb3QgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpOworCisJCS8vIGNoaWxkIHRyZWUKKwkJQ29tbW9uVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKChUb2tlbiludWxsKTsKKwkJQ29tbW9uVHJlZSBjMCwgYzEsIGMyOworCQlyMC5hZGRDaGlsZChjMD1uZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSkpOworCQlyMC5hZGRDaGlsZChjMT1uZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSkpOworCQlyMC5hZGRDaGlsZChjMj1uZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCisJCXJvb3QuYWRkQ2hpbGQocjApOworCisJCWFzc2VydE51bGwocm9vdC5wYXJlbnQpOworCQlhc3NlcnRFcXVhbHMoLTEsIHJvb3QuY2hpbGRJbmRleCk7CisJCS8vIGNoZWNrIGNoaWxkcmVuIG9mIHJvb3QgYWxsIHBvaW50IGF0IHJvb3QKKwkJYXNzZXJ0RXF1YWxzKHJvb3QsIGMwLnBhcmVudCk7CisJCWFzc2VydEVxdWFscygwLCBjMC5jaGlsZEluZGV4KTsKKwkJYXNzZXJ0RXF1YWxzKHJvb3QsIGMwLnBhcmVudCk7CisJCWFzc2VydEVxdWFscygxLCBjMS5jaGlsZEluZGV4KTsKKwkJYXNzZXJ0RXF1YWxzKHJvb3QsIGMwLnBhcmVudCk7CisJCWFzc2VydEVxdWFscygyLCBjMi5jaGlsZEluZGV4KTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdFRvRXhpc3RDaGlsZHJlbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGQgY2hpbGQgXihuaWwgMTAxIDEwMiAxMDMpIHRvIHJvb3QgXig1IDYpCisJCS8vIHNob3VsZCBhZGQgMTAxIDEwMiAxMDMgdG8gZW5kIG9mIDUncyBjaGlsZCBsaXN0CisJCUNvbW1vblRyZWUgcm9vdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig1KSk7CisJCXJvb3QuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDYpKSk7CisKKwkJLy8gY2hpbGQgdHJlZQorCQlDb21tb25UcmVlIHIwID0gbmV3IENvbW1vblRyZWUoKFRva2VuKW51bGwpOworCQlDb21tb25UcmVlIGMwLCBjMSwgYzI7CisJCXIwLmFkZENoaWxkKGMwPW5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCXIwLmFkZENoaWxkKGMxPW5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCXIwLmFkZENoaWxkKGMyPW5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJcm9vdC5hZGRDaGlsZChyMCk7CisKKwkJYXNzZXJ0TnVsbChyb290LnBhcmVudCk7CisJCWFzc2VydEVxdWFscygtMSwgcm9vdC5jaGlsZEluZGV4KTsKKwkJLy8gY2hlY2sgY2hpbGRyZW4gb2Ygcm9vdCBhbGwgcG9pbnQgYXQgcm9vdAorCQlhc3NlcnRFcXVhbHMocm9vdCwgYzAucGFyZW50KTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGMwLmNoaWxkSW5kZXgpOworCQlhc3NlcnRFcXVhbHMocm9vdCwgYzAucGFyZW50KTsKKwkJYXNzZXJ0RXF1YWxzKDIsIGMxLmNoaWxkSW5kZXgpOworCQlhc3NlcnRFcXVhbHMocm9vdCwgYzAucGFyZW50KTsKKwkJYXNzZXJ0RXF1YWxzKDMsIGMyLmNoaWxkSW5kZXgpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3REdXBUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIF4oMTAxIF4oMTAyIDEwMyBeKDEwNiAxMDcpICkgMTA0IDEwNSkKKwkJQ29tbW9uVHJlZSByMCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJQ29tbW9uVHJlZSByMSA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKTsKKwkJcjAuYWRkQ2hpbGQocjEpOworCQlyMS5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCQlUcmVlIHIyID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwNikpOworCQlyMi5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTA3KSkpOworCQlyMS5hZGRDaGlsZChyMik7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDQpKSk7CisJCXIwLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDUpKSk7CisKKwkJQ29tbW9uVHJlZSBkdXAgPSAoQ29tbW9uVHJlZSkobmV3IENvbW1vblRyZWVBZGFwdG9yKCkpLmR1cFRyZWUocjApOworCisJCWFzc2VydE51bGwoZHVwLnBhcmVudCk7CisJCWFzc2VydEVxdWFscygtMSwgZHVwLmNoaWxkSW5kZXgpOworCQlkdXAuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QmVjb21lUm9vdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyA1IGJlY29tZXMgbmV3IHJvb3Qgb2YgXihuaWwgMTAxIDEwMiAxMDMpCisJCUNvbW1vblRyZWUgbmV3Um9vdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig1KSk7CisKKwkJQ29tbW9uVHJlZSBvbGRSb290ID0gbmV3IENvbW1vblRyZWUoKFRva2VuKW51bGwpOworCQlvbGRSb290LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKSk7CisJCW9sZFJvb3QuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKwkJb2xkUm9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCisJCVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJYWRhcHRvci5iZWNvbWVSb290KG5ld1Jvb3QsIG9sZFJvb3QpOworCQluZXdSb290LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEJlY29tZVJvb3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIDUgYmVjb21lcyBuZXcgcm9vdCBvZiBeKDEwMSAxMDIgMTAzKQorCQlDb21tb25UcmVlIG5ld1Jvb3QgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpOworCisJCUNvbW1vblRyZWUgb2xkUm9vdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDEpKTsKKwkJb2xkUm9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAyKSkpOworCQlvbGRSb290LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDMpKSk7CisKKwkJVHJlZUFkYXB0b3IgYWRhcHRvciA9IG5ldyBDb21tb25UcmVlQWRhcHRvcigpOworCQlhZGFwdG9yLmJlY29tZVJvb3QobmV3Um9vdCwgb2xkUm9vdCk7CisJCW5ld1Jvb3Quc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0QmVjb21lUm9vdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gXihuaWwgNSkgYmVjb21lcyBuZXcgcm9vdCBvZiBeKG5pbCAxMDEgMTAyIDEwMykKKwkJQ29tbW9uVHJlZSBuZXdSb290ID0gbmV3IENvbW1vblRyZWUoKFRva2VuKW51bGwpOworCQluZXdSb290LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig1KSkpOworCisJCUNvbW1vblRyZWUgb2xkUm9vdCA9IG5ldyBDb21tb25UcmVlKChUb2tlbiludWxsKTsKKwkJb2xkUm9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSkpOworCQlvbGRSb290LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbigxMDIpKSk7CisJCW9sZFJvb3QuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMykpKTsKKworCQlUcmVlQWRhcHRvciBhZGFwdG9yID0gbmV3IENvbW1vblRyZWVBZGFwdG9yKCk7CisJCWFkYXB0b3IuYmVjb21lUm9vdChuZXdSb290LCBvbGRSb290KTsKKwkJbmV3Um9vdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RCZWNvbWVSb290NSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBeKG5pbCA1KSBiZWNvbWVzIG5ldyByb290IG9mIF4oMTAxIDEwMiAxMDMpCisJCUNvbW1vblRyZWUgbmV3Um9vdCA9IG5ldyBDb21tb25UcmVlKChUb2tlbiludWxsKTsKKwkJbmV3Um9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpKTsKKworCQlDb21tb25UcmVlIG9sZFJvb3QgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCW9sZFJvb3QuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDEwMikpKTsKKwkJb2xkUm9vdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAzKSkpOworCisJCVRyZWVBZGFwdG9yIGFkYXB0b3IgPSBuZXcgQ29tbW9uVHJlZUFkYXB0b3IoKTsKKwkJYWRhcHRvci5iZWNvbWVSb290KG5ld1Jvb3QsIG9sZFJvb3QpOworCQluZXdSb290LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdEJlY29tZVJvb3Q2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGVtdWxhdGVzIGNvbnN0cnVjdGlvbiBvZiBeKDUgNikKKwkJQ29tbW9uVHJlZSByb290XzAgPSAoQ29tbW9uVHJlZSlhZGFwdG9yLm5pbCgpOworCQlDb21tb25UcmVlIHJvb3RfMSA9IChDb21tb25UcmVlKWFkYXB0b3IubmlsKCk7CisJCXJvb3RfMSA9IChDb21tb25UcmVlKWFkYXB0b3IuYmVjb21lUm9vdChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpLCByb290XzEpOworCisJCWFkYXB0b3IuYWRkQ2hpbGQocm9vdF8xLCBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNikpKTsKKworCQlhZGFwdG9yLmFkZENoaWxkKHJvb3RfMCwgcm9vdF8xKTsKKworCQlyb290XzAuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwl9CisKKwkvLyBUZXN0IHJlcGxhY2VDaGlsZHJlbgorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VXaXRoTm9DaGlsZHJlbigpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oMTAxKSk7CisJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oNSkpOworCQlib29sZWFuIGVycm9yID0gZmFsc2U7CisJCXRyeSB7CisJCQl0LnJlcGxhY2VDaGlsZHJlbigwLCAwLCBuZXdDaGlsZCk7CisJCX0KKwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQorCQlhc3NlcnRUcnVlKGVycm9yKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpdGhPbmVDaGlsZHJlbigpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBhc3N1bWUgdG9rZW4gdHlwZSA5OSBhbmQgdXNlIHRleHQKKwkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCJhIikpOworCQlDb21tb25UcmVlIGMwID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYiIpKTsKKwkJdC5hZGRDaGlsZChjMCk7CisKKwkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSk7CisJCXQucmVwbGFjZUNoaWxkcmVuKDAsIDAsIG5ld0NoaWxkKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoYSBjKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpOworCQl0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJbk1pZGRsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOyAvLyBpbmRleCAxCisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieCIpKTsKKwkJdC5yZXBsYWNlQ2hpbGRyZW4oMSwgMSwgbmV3Q2hpbGQpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIGIgeCBkKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpOworCQl0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBdExlZnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYSIpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJiIikpKTsgLy8gaW5kZXggMAorCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImQiKSkpOworCisJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksIngiKSk7CisJCXQucmVwbGFjZUNoaWxkcmVuKDAsIDAsIG5ld0NoaWxkKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoYSB4IGMgZCkiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCB0LnRvU3RyaW5nVHJlZSgpKTsKKwkJdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQXRSaWdodCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImQiKSkpOyAvLyBpbmRleCAyCisKKwkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieCIpKTsKKwkJdC5yZXBsYWNlQ2hpbGRyZW4oMiwgMiwgbmV3Q2hpbGQpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIGIgYyB4KSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpOworCQl0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VPbmVXaXRoVHdvQXRMZWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYiIpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYyIpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJQ29tbW9uVHJlZSBuZXdDaGlsZHJlbiA9IChDb21tb25UcmVlKWFkYXB0b3IubmlsKCk7CisJCW5ld0NoaWxkcmVuLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieCIpKSk7CisJCW5ld0NoaWxkcmVuLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieSIpKSk7CisKKwkJdC5yZXBsYWNlQ2hpbGRyZW4oMCwgMCwgbmV3Q2hpbGRyZW4pOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIHggeSBjIGQpIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSk7CisJCXQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU9uZVdpdGhUd29BdFJpZ2h0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYiIpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYyIpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJQ29tbW9uVHJlZSBuZXdDaGlsZHJlbiA9IChDb21tb25UcmVlKWFkYXB0b3IubmlsKCk7CisJCW5ld0NoaWxkcmVuLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieCIpKSk7CisJCW5ld0NoaWxkcmVuLmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieSIpKSk7CisKKwkJdC5yZXBsYWNlQ2hpbGRyZW4oMiwgMiwgbmV3Q2hpbGRyZW4pOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIGIgYyB4IHkpIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSk7CisJCXQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU9uZVdpdGhUd29Jbk1pZGRsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImQiKSkpOworCisJCUNvbW1vblRyZWUgbmV3Q2hpbGRyZW4gPSAoQ29tbW9uVHJlZSlhZGFwdG9yLm5pbCgpOworCQluZXdDaGlsZHJlbi5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksIngiKSkpOworCQluZXdDaGlsZHJlbi5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksInkiKSkpOworCisJCXQucmVwbGFjZUNoaWxkcmVuKDEsIDEsIG5ld0NoaWxkcmVuKTsKKwkJU3RyaW5nIGV4cGVjdGluZyA9ICIoYSBiIHggeSBkKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpOworCQl0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUd29XaXRoT25lQXRMZWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1vblRyZWUgdCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImEiKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYiIpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYyIpKSk7CisJCXQuYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiZCIpKSk7CisKKwkJQ29tbW9uVHJlZSBuZXdDaGlsZCA9IG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwieCIpKTsKKworCQl0LnJlcGxhY2VDaGlsZHJlbigwLCAxLCBuZXdDaGlsZCk7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKGEgeCBkKSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpOworCQl0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorCisJQFRlc3QgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUd29XaXRoT25lQXRSaWdodCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImQiKSkpOworCisJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksIngiKSk7CisKKwkJdC5yZXBsYWNlQ2hpbGRyZW4oMSwgMiwgbmV3Q2hpbGQpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIGIgeCkiOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0aW5nLCB0LnRvU3RyaW5nVHJlZSgpKTsKKwkJdC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcygpOworCX0KKworCUBUZXN0IHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsV2l0aE9uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21tb25UcmVlIHQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJhIikpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImIiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImMiKSkpOworCQl0LmFkZENoaWxkKG5ldyBDb21tb25UcmVlKG5ldyBDb21tb25Ub2tlbig5OSwgImQiKSkpOworCisJCUNvbW1vblRyZWUgbmV3Q2hpbGQgPSBuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksIngiKSk7CisKKwkJdC5yZXBsYWNlQ2hpbGRyZW4oMCwgMiwgbmV3Q2hpbGQpOworCQlTdHJpbmcgZXhwZWN0aW5nID0gIihhIHgpIjsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGluZywgdC50b1N0cmluZ1RyZWUoKSk7CisJCXQuc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoKTsKKwl9CisKKwlAVGVzdCBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbFdpdGhUd28oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbW9uVHJlZSB0ID0gbmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCAiYSIpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJiIikpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJjIikpKTsKKwkJdC5hZGRDaGlsZChuZXcgQ29tbW9uVHJlZShuZXcgQ29tbW9uVG9rZW4oOTksICJkIikpKTsKKworCQlDb21tb25UcmVlIG5ld0NoaWxkcmVuID0gKENvbW1vblRyZWUpYWRhcHRvci5uaWwoKTsKKwkJbmV3Q2hpbGRyZW4uYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCJ4IikpKTsKKwkJbmV3Q2hpbGRyZW4uYWRkQ2hpbGQobmV3IENvbW1vblRyZWUobmV3IENvbW1vblRva2VuKDk5LCJ5IikpKTsKKworCQl0LnJlcGxhY2VDaGlsZHJlbigwLCAyLCBuZXdDaGlsZHJlbik7CisJCVN0cmluZyBleHBlY3RpbmcgPSAiKGEgeCB5KSI7CisJCWFzc2VydEVxdWFscyhleHBlY3RpbmcsIHQudG9TdHJpbmdUcmVlKCkpOworCQl0LnNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0NvbW1vblRva2VuLmphdmEgYi9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjAxZTFmNC4uMDAwMDAwMAotLS0gYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotIFtUaGUgIkJTRCBsaWNlbnNlIl0KLSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBvcmcuYW50bHIucnVudGltZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uVG9rZW4gaW1wbGVtZW50cyBUb2tlbiwgU2VyaWFsaXphYmxlIHsKLQlwcm90ZWN0ZWQgaW50IHR5cGU7Ci0JcHJvdGVjdGVkIGludCBsaW5lOwotCXByb3RlY3RlZCBpbnQgY2hhclBvc2l0aW9uSW5MaW5lID0gLTE7IC8vIHNldCB0byBpbnZhbGlkIHBvc2l0aW9uCi0JcHJvdGVjdGVkIGludCBjaGFubmVsPURFRkFVTFRfQ0hBTk5FTDsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IENoYXJTdHJlYW0gaW5wdXQ7Ci0KLQkvKiogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdGV4dCBvbmNlIGluIGEgd2hpbGUuICBJZgotCSAqICB0aGlzIGlzIG5vbi1udWxsLCB0aGVuIGdldFRleHQgc2hvdWxkIHJldHVybiB0aGlzLiAgTm90ZSB0aGF0Ci0JICogIHN0YXJ0L3N0b3AgYXJlIG5vdCBhZmZlY3RlZCBieSBjaGFuZ2luZyB0aGlzLgotCSAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7Ci0KLQkvKiogV2hhdCB0b2tlbiBudW1iZXIgaXMgdGhpcyBmcm9tIDAuLm4tMSB0b2tlbnM7IDwgMCBpbXBsaWVzIGludmFsaWQgaW5kZXggKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gLTE7Ci0KLQkvKiogVGhlIGNoYXIgcG9zaXRpb24gaW50byB0aGUgaW5wdXQgYnVmZmVyIHdoZXJlIHRoaXMgdG9rZW4gc3RhcnRzICovCi0JcHJvdGVjdGVkIGludCBzdGFydDsKLQotCS8qKiBUaGUgY2hhciBwb3NpdGlvbiBpbnRvIHRoZSBpbnB1dCBidWZmZXIgd2hlcmUgdGhpcyB0b2tlbiBzdG9wcyAqLwotCXByb3RlY3RlZCBpbnQgc3RvcDsKLQotCXB1YmxpYyBDb21tb25Ub2tlbihpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBDb21tb25Ub2tlbihDaGFyU3RyZWFtIGlucHV0LCBpbnQgdHlwZSwgaW50IGNoYW5uZWwsIGludCBzdGFydCwgaW50IHN0b3ApIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmNoYW5uZWwgPSBjaGFubmVsOwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCXRoaXMuc3RvcCA9IHN0b3A7Ci0JfQotCi0JcHVibGljIENvbW1vblRva2VuKGludCB0eXBlLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmNoYW5uZWwgPSBERUZBVUxUX0NIQU5ORUw7Ci0JCXRoaXMudGV4dCA9IHRleHQ7Ci0JfQotCi0JcHVibGljIENvbW1vblRva2VuKFRva2VuIG9sZFRva2VuKSB7Ci0JCXRleHQgPSBvbGRUb2tlbi5nZXRUZXh0KCk7Ci0JCXR5cGUgPSBvbGRUb2tlbi5nZXRUeXBlKCk7Ci0JCWxpbmUgPSBvbGRUb2tlbi5nZXRMaW5lKCk7Ci0JCWluZGV4ID0gb2xkVG9rZW4uZ2V0VG9rZW5JbmRleCgpOwotCQljaGFyUG9zaXRpb25JbkxpbmUgPSBvbGRUb2tlbi5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKLQkJY2hhbm5lbCA9IG9sZFRva2VuLmdldENoYW5uZWwoKTsKLSAgICAgICAgaW5wdXQgPSBvbGRUb2tlbi5nZXRJbnB1dFN0cmVhbSgpOwotCQlpZiAoIG9sZFRva2VuIGluc3RhbmNlb2YgQ29tbW9uVG9rZW4gKSB7Ci0JCQlzdGFydCA9ICgoQ29tbW9uVG9rZW4pb2xkVG9rZW4pLnN0YXJ0OwotCQkJc3RvcCA9ICgoQ29tbW9uVG9rZW4pb2xkVG9rZW4pLnN0b3A7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKLQkJdGhpcy5saW5lID0gbGluZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmICggdGV4dCE9bnVsbCApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWlmICggaW5wdXQ9PW51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotICAgICAgICBpZiAoIHN0YXJ0PGlucHV0LnNpemUoKSAmJiBzdG9wPGlucHV0LnNpemUoKSApIHsKLQkJICAgIHRleHQgPSBpbnB1dC5zdWJzdHJpbmcoc3RhcnQsc3RvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0ZXh0ID0gIjxFT0Y+IjsKLSAgICAgICAgfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKiogT3ZlcnJpZGUgdGhlIHRleHQgZm9yIHRoaXMgdG9rZW4uICBnZXRUZXh0KCkgd2lsbCByZXR1cm4gdGhpcyB0ZXh0Ci0JICogIHJhdGhlciB0aGFuIHB1bGxpbmcgZnJvbSB0aGUgYnVmZmVyLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbWVhbgotCSAqICB0aGF0IHN0YXJ0L3N0b3AgaW5kZXhlcyBhcmUgbm90IHZhbGlkLiAgSXQgbWVhbnMgdGhhdCB0aGF0IGlucHV0Ci0JICogIHdhcyBjb252ZXJ0ZWQgdG8gYSBuZXcgc3RyaW5nIGluIHRoZSB0b2tlbiBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKSB7Ci0JCXJldHVybiBjaGFyUG9zaXRpb25JbkxpbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhclBvc2l0aW9uSW5MaW5lKGludCBjaGFyUG9zaXRpb25JbkxpbmUpIHsKLQkJdGhpcy5jaGFyUG9zaXRpb25JbkxpbmUgPSBjaGFyUG9zaXRpb25JbkxpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFubmVsKCkgewotCQlyZXR1cm4gY2hhbm5lbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFubmVsKGludCBjaGFubmVsKSB7Ci0JCXRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0SW5kZXgoaW50IHN0YXJ0KSB7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0b3BJbmRleCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RvcEluZGV4KGludCBzdG9wKSB7Ci0JCXRoaXMuc3RvcCA9IHN0b3A7Ci0JfQotCi0JcHVibGljIGludCBnZXRUb2tlbkluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9rZW5JbmRleChpbnQgaW5kZXgpIHsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBDaGFyU3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oQ2hhclN0cmVhbSBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNoYW5uZWxTdHIgPSAiIjsKLQkJaWYgKCBjaGFubmVsPjAgKSB7Ci0JCQljaGFubmVsU3RyPSIsY2hhbm5lbD0iK2NoYW5uZWw7Ci0JCX0KLQkJU3RyaW5nIHR4dCA9IGdldFRleHQoKTsKLQkJaWYgKCB0eHQhPW51bGwgKSB7Ci0JCQl0eHQgPSB0eHQucmVwbGFjZUFsbCgiXG4iLCJcXFxcbiIpOwotCQkJdHh0ID0gdHh0LnJlcGxhY2VBbGwoIlxyIiwiXFxcXHIiKTsKLQkJCXR4dCA9IHR4dC5yZXBsYWNlQWxsKCJcdCIsIlxcXFx0Iik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0eHQgPSAiPG5vIHRleHQ+IjsKLQkJfQotCQlyZXR1cm4gIltAIitnZXRUb2tlbkluZGV4KCkrIiwiK3N0YXJ0KyI6IitzdG9wKyI9JyIrdHh0KyInLDwiK3R5cGUrIj4iK2NoYW5uZWxTdHIrIiwiK2xpbmUrIjoiK2dldENoYXJQb3NpdGlvbkluTGluZSgpKyJdIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvQ29tbW9uVG9rZW5TdHJlYW0uamF2YSBiL3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODEzNWE2Li4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9Db21tb25Ub2tlblN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gW1RoZSAiQlNEIGxpY2Vuc2UiXQotIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWU7Ci0KLS8qKiBUaGUgbW9zdCBjb21tb24gc3RyZWFtIG9mIHRva2VucyB3aGVyZSBldmVyeSB0b2tlbiBpcyBidWZmZXJlZCB1cAotICogIGFuZCB0b2tlbnMgYXJlIGZpbHRlcmVkIGZvciBhIGNlcnRhaW4gY2hhbm5lbCAodGhlIHBhcnNlciB3aWxsIG9ubHkKLSAqICBzZWUgdGhlc2UgdG9rZW5zKS4KLSAqCi0gKiAgRXZlbiB0aG91Z2ggaXQgYnVmZmVycyBhbGwgb2YgdGhlIHRva2VucywgdGhpcyB0b2tlbiBzdHJlYW0gcHVsbHMgdG9rZW5zCi0gKiAgZnJvbSB0aGUgdG9rZW5zIHNvdXJjZSBvbiBkZW1hbmQuIEluIG90aGVyIHdvcmRzLCB1bnRpbCB5b3UgYXNrIGZvciBhCi0gKiAgdG9rZW4gdXNpbmcgY29uc3VtZSgpLCBMVCgpLCBldGMuIHRoZSBzdHJlYW0gZG9lcyBub3QgcHVsbCBmcm9tIHRoZSBsZXhlci4KLSAqCi0gKiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgc3RyZWFtIGFuZCBCdWZmZXJlZFRva2VuU3RyZWFtIHN1cGVyY2xhc3MKLSAqICBpcyB0aGF0IHRoaXMgc3RyZWFtIGtub3dzIGhvdyB0byBpZ25vcmUgb2ZmIGNoYW5uZWwgdG9rZW5zLiBUaGVyZSBtYXkgYmUKLSAqICBhIHBlcmZvcm1hbmNlIGFkdmFudGFnZSB0byB1c2luZyB0aGUgc3VwZXJjbGFzcyBpZiB5b3UgZG9uJ3QgcGFzcwotICogIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGV0Yy4gdG8gdGhlIHBhcnNlciBvbiBhIGhpZGRlbiBjaGFubmVsIChpLmUuLAotICogIHlvdSBzZXQgJGNoYW5uZWwgaW5zdGVhZCBvZiBjYWxsaW5nIHNraXAoKSBpbiBsZXhlciBydWxlcy4pCi0gKgotICogIEBzZWUgb3JnLmFudGxyLnJ1bnRpbWUuVW5idWZmZXJlZFRva2VuU3RyZWFtCi0gKiAgQHNlZSBvcmcuYW50bHIucnVudGltZS5CdWZmZXJlZFRva2VuU3RyZWFtCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25Ub2tlblN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkVG9rZW5TdHJlYW0gewotICAgIC8qKiBTa2lwIHRva2VucyBvbiBhbnkgY2hhbm5lbCBidXQgdGhpcyBvbmU7IHRoaXMgaXMgaG93IHdlIHNraXAgd2hpdGVzcGFjZS4uLiAqLwotICAgIHByb3RlY3RlZCBpbnQgY2hhbm5lbCA9IFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKLQotICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbSgpIHsgOyB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uVG9rZW5TdHJlYW0oVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpIHsKLSAgICAgICAgc3VwZXIodG9rZW5Tb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25Ub2tlblN0cmVhbShUb2tlblNvdXJjZSB0b2tlblNvdXJjZSwgaW50IGNoYW5uZWwpIHsKLSAgICAgICAgdGhpcyh0b2tlblNvdXJjZSk7Ci0gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0gICAgfQotCi0gICAgLyoqIEFsd2F5cyBsZWF2ZSBwIG9uIGFuIG9uLWNoYW5uZWwgdG9rZW4uICovCi0gICAgcHVibGljIHZvaWQgY29uc3VtZSgpIHsKLSAgICAgICAgaWYgKCBwID09IC0xICkgc2V0dXAoKTsKLSAgICAgICAgcCsrOwotICAgICAgICBzeW5jKHApOwotICAgICAgICB3aGlsZSAoIHRva2Vucy5nZXQocCkuZ2V0Q2hhbm5lbCgpIT1jaGFubmVsICkgewotICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgc3luYyhwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBUb2tlbiBMQihpbnQgaykgewotICAgICAgICBpZiAoIGs9PTAgfHwgKHAtayk8MCApIHJldHVybiBudWxsOwotCi0gICAgICAgIGludCBpID0gcDsKLSAgICAgICAgaW50IG4gPSAxOwotICAgICAgICAvLyBmaW5kIGsgZ29vZCB0b2tlbnMgbG9va2luZyBiYWNrd2FyZHMKLSAgICAgICAgd2hpbGUgKCBuPD1rICkgewotICAgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKLSAgICAgICAgICAgIGkgPSBza2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoaS0xKTsKLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGk8MCApIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gdG9rZW5zLmdldChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVG9rZW4gTFQoaW50IGspIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudGVyIExUKCIraysiKSIpOwotICAgICAgICBpZiAoIHAgPT0gLTEgKSBzZXR1cCgpOwotICAgICAgICBpZiAoIGsgPT0gMCApIHJldHVybiBudWxsOwotICAgICAgICBpZiAoIGsgPCAwICkgcmV0dXJuIExCKC1rKTsKLSAgICAgICAgaW50IGkgPSBwOwotICAgICAgICBpbnQgbiA9IDE7IC8vIHdlIGtub3cgdG9rZW5zW3BdIGlzIGEgZ29vZCBvbmUKLSAgICAgICAgLy8gZmluZCBrIGdvb2QgdG9rZW5zCi0gICAgICAgIHdoaWxlICggbjxrICkgewotICAgICAgICAgICAgLy8gc2tpcCBvZmYtY2hhbm5lbCB0b2tlbnMKLSAgICAgICAgICAgIGkgPSBza2lwT2ZmVG9rZW5DaGFubmVscyhpKzEpOwotICAgICAgICAgICAgbisrOwotICAgICAgICB9Ci0JCWlmICggaT5yYW5nZSApIHJhbmdlID0gaTsJCQotICAgICAgICByZXR1cm4gdG9rZW5zLmdldChpKTsKLSAgICB9Ci0KLSAgICAvKiogR2l2ZW4gYSBzdGFydGluZyBpbmRleCwgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb24tY2hhbm5lbAotICAgICAqICB0b2tlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHNraXBPZmZUb2tlbkNoYW5uZWxzKGludCBpKSB7Ci0gICAgICAgIHN5bmMoaSk7Ci0gICAgICAgIHdoaWxlICggdG9rZW5zLmdldChpKS5nZXRDaGFubmVsKCkhPWNoYW5uZWwgKSB7IC8vIGFsc28gc3RvcHMgYXQgRU9GIChpdCdzIG9uY2hhbm5lbCkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIHN5bmMoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBza2lwT2ZmVG9rZW5DaGFubmVsc1JldmVyc2UoaW50IGkpIHsKLSAgICAgICAgd2hpbGUgKCBpPj0wICYmICgoVG9rZW4pdG9rZW5zLmdldChpKSkuZ2V0Q2hhbm5lbCgpIT1jaGFubmVsICkgewotICAgICAgICAgICAgaS0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKCkgewotICAgICAgICBwID0gMDsKLSAgICAgICAgc3luYygwKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoIHRva2Vucy5nZXQoaSkuZ2V0Q2hhbm5lbCgpIT1jaGFubmVsICkgewotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgc3luYyhpKTsKLSAgICAgICAgfQotICAgICAgICBwID0gaTsKLSAgICB9Ci0KLQkvKiogQ291bnQgRU9GIGp1c3Qgb25jZS4gKi8KLQlwdWJsaWMgaW50IGdldE51bWJlck9mT25DaGFubmVsVG9rZW5zKCkgewotCQlpbnQgbiA9IDA7Ci0JCWZpbGwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyBpKyspIHsKLQkJCVRva2VuIHQgPSB0b2tlbnMuZ2V0KGkpOwotCQkJaWYgKCB0LmdldENoYW5uZWwoKT09Y2hhbm5lbCApIG4rKzsKLQkJCWlmICggdC5nZXRUeXBlKCk9PVRva2VuLkVPRiApIGJyZWFrOwotCQl9Ci0JCXJldHVybiBuOwotCX0KLQotICAgIC8qKiBSZXNldCB0aGlzIHRva2VuIHN0cmVhbSBieSBzZXR0aW5nIGl0cyB0b2tlbiBzb3VyY2UuICovCi0gICAgcHVibGljIHZvaWQgc2V0VG9rZW5Tb3VyY2UoVG9rZW5Tb3VyY2UgdG9rZW5Tb3VyY2UpIHsKLSAgICAgICAgc3VwZXIuc2V0VG9rZW5Tb3VyY2UodG9rZW5Tb3VyY2UpOwotICAgICAgICBjaGFubmVsID0gVG9rZW4uREVGQVVMVF9DSEFOTkVMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9MZXhlci5qYXZhIGIvc3JjL29yZy9hbnRsci9ydW50aW1lL0xleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwMzdiY2YuLjAwMDAwMDAKLS0tIGEvc3JjL29yZy9hbnRsci9ydW50aW1lL0xleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSBbVGhlICJCU0QgbGljZW5zZSJdCi0gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgVGVyZW5jZSBQYXJyCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWU7Ci0KLS8qKiBBIGxleGVyIGlzIHJlY29nbml6ZXIgdGhhdCBkcmF3cyBpbnB1dCBzeW1ib2xzIGZyb20gYSBjaGFyYWN0ZXIgc3RyZWFtLgotICogIGxleGVyIGdyYW1tYXJzIHJlc3VsdCBpbiBhIHN1YmNsYXNzIG9mIHRoaXMgb2JqZWN0LiBBIExleGVyIG9iamVjdAotICogIHVzZXMgc2ltcGxpZmllZCBtYXRjaCgpIGFuZCBlcnJvciByZWNvdmVyeSBtZWNoYW5pc21zIGluIHRoZSBpbnRlcmVzdAotICogIG9mIHNwZWVkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGV4ZXIgZXh0ZW5kcyBCYXNlUmVjb2duaXplciBpbXBsZW1lbnRzIFRva2VuU291cmNlIHsKLQkvKiogV2hlcmUgaXMgdGhlIGxleGVyIGRyYXdpbmcgY2hhcmFjdGVycyBmcm9tPyAqLwotCXByb3RlY3RlZCBDaGFyU3RyZWFtIGlucHV0OwotCi0JcHVibGljIExleGVyKCkgewotCX0KLQotCXB1YmxpYyBMZXhlcihDaGFyU3RyZWFtIGlucHV0KSB7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7Ci0JCXN1cGVyKHN0YXRlKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOyAvLyByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKLQkJLy8gd2FjayBMZXhlciBzdGF0ZSB2YXJpYWJsZXMKLQkJaWYgKCBpbnB1dCE9bnVsbCApIHsKLQkJCWlucHV0LnNlZWsoMCk7IC8vIHJld2luZCB0aGUgaW5wdXQKLQkJfQotCQlpZiAoIHN0YXRlPT1udWxsICkgewotCQkJcmV0dXJuOyAvLyBubyBzaGFyZWQgc3RhdGUgd29yayB0byBkbwotCQl9Ci0JCXN0YXRlLnRva2VuID0gbnVsbDsKLQkJc3RhdGUudHlwZSA9IFRva2VuLklOVkFMSURfVE9LRU5fVFlQRTsKLQkJc3RhdGUuY2hhbm5lbCA9IFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKLQkJc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCA9IC0xOwotCQlzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lID0gLTE7Ci0JCXN0YXRlLnRva2VuU3RhcnRMaW5lID0gLTE7Ci0JCXN0YXRlLnRleHQgPSBudWxsOwotCX0KLQotCS8qKiBSZXR1cm4gYSB0b2tlbiBmcm9tIHRoaXMgc291cmNlOyBpLmUuLCBtYXRjaCBhIHRva2VuIG9uIHRoZSBjaGFyCi0JICogIHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgVG9rZW4gbmV4dFRva2VuKCkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJc3RhdGUudG9rZW4gPSBudWxsOwotCQkJc3RhdGUuY2hhbm5lbCA9IFRva2VuLkRFRkFVTFRfQ0hBTk5FTDsKLQkJCXN0YXRlLnRva2VuU3RhcnRDaGFySW5kZXggPSBpbnB1dC5pbmRleCgpOwotCQkJc3RhdGUudG9rZW5TdGFydENoYXJQb3NpdGlvbkluTGluZSA9IGlucHV0LmdldENoYXJQb3NpdGlvbkluTGluZSgpOwotCQkJc3RhdGUudG9rZW5TdGFydExpbmUgPSBpbnB1dC5nZXRMaW5lKCk7Ci0JCQlzdGF0ZS50ZXh0ID0gbnVsbDsKLQkJCWlmICggaW5wdXQuTEEoMSk9PUNoYXJTdHJlYW0uRU9GICkgewotICAgICAgICAgICAgICAgIFRva2VuIGVvZiA9IG5ldyBDb21tb25Ub2tlbigoQ2hhclN0cmVhbSlpbnB1dCxUb2tlbi5FT0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLkRFRkFVTFRfQ0hBTk5FTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5kZXgoKSxpbnB1dC5pbmRleCgpKTsKLSAgICAgICAgICAgICAgICBlb2Yuc2V0TGluZShnZXRMaW5lKCkpOwotICAgICAgICAgICAgICAgIGVvZi5zZXRDaGFyUG9zaXRpb25JbkxpbmUoZ2V0Q2hhclBvc2l0aW9uSW5MaW5lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBlb2Y7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCW1Ub2tlbnMoKTsKLQkJCQlpZiAoIHN0YXRlLnRva2VuPT1udWxsICkgewotCQkJCQllbWl0KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCBzdGF0ZS50b2tlbj09VG9rZW4uU0tJUF9UT0tFTiApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXJldHVybiBzdGF0ZS50b2tlbjsKLQkJCX0KLQkJCWNhdGNoIChOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmEpIHsKLQkJCQlyZXBvcnRFcnJvcihudmEpOwotCQkJCXJlY292ZXIobnZhKTsgLy8gdGhyb3cgb3V0IGN1cnJlbnQgY2hhciBhbmQgdHJ5IGFnYWluCi0JCQl9Ci0JCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKLQkJCQlyZXBvcnRFcnJvcihyZSk7Ci0JCQkJLy8gbWF0Y2goKSByb3V0aW5lIGhhcyBhbHJlYWR5IGNhbGxlZCByZWNvdmVyKCkKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBJbnN0cnVjdCB0aGUgbGV4ZXIgdG8gc2tpcCBjcmVhdGluZyBhIHRva2VuIGZvciBjdXJyZW50IGxleGVyIHJ1bGUKLQkgKiAgYW5kIGxvb2sgZm9yIGFub3RoZXIgdG9rZW4uICBuZXh0VG9rZW4oKSBrbm93cyB0byBrZWVwIGxvb2tpbmcgd2hlbgotCSAqICBhIGxleGVyIHJ1bGUgZmluaXNoZXMgd2l0aCB0b2tlbiBzZXQgdG8gU0tJUF9UT0tFTi4gIFJlY2FsbCB0aGF0Ci0JICogIGlmIHRva2VuPT1udWxsIGF0IGVuZCBvZiBhbnkgdG9rZW4gcnVsZSwgaXQgY3JlYXRlcyBvbmUgZm9yIHlvdQotCSAqICBhbmQgZW1pdHMgaXQuCi0JICovCi0JcHVibGljIHZvaWQgc2tpcCgpIHsKLQkJc3RhdGUudG9rZW4gPSBUb2tlbi5TS0lQX1RPS0VOOwotCX0KLQotCS8qKiBUaGlzIGlzIHRoZSBsZXhlciBlbnRyeSBwb2ludCB0aGF0IHNldHMgaW5zdGFuY2UgdmFyICd0b2tlbicgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtVG9rZW5zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uOwotCi0JLyoqIFNldCB0aGUgY2hhciBzdHJlYW0gYW5kIHJlc2V0IHRoZSBsZXhlciAqLwotCXB1YmxpYyB2b2lkIHNldENoYXJTdHJlYW0oQ2hhclN0cmVhbSBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gbnVsbDsKLQkJcmVzZXQoKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyBDaGFyU3RyZWFtIGdldENoYXJTdHJlYW0oKSB7Ci0JCXJldHVybiB0aGlzLmlucHV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIGlucHV0LmdldFNvdXJjZU5hbWUoKTsKLQl9Ci0KLQkvKiogQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgZW1pdHMgcGVyIG5leHRUb2tlbiBpbnZvY2F0aW9uCi0JICogIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuICBTdWJjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kCi0JICogIG5leHRUb2tlbiAodG8gcHVzaCB0b2tlbnMgaW50byBhIGxpc3QgYW5kIHB1bGwgZnJvbSB0aGF0IGxpc3QgcmF0aGVyCi0JICogIHRoYW4gYSBzaW5nbGUgdmFyaWFibGUgYXMgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbWl0KFRva2VuIHRva2VuKSB7Ci0JCXN0YXRlLnRva2VuID0gdG9rZW47Ci0JfQotCi0JLyoqIFRoZSBzdGFuZGFyZCBtZXRob2QgY2FsbGVkIHRvIGF1dG9tYXRpY2FsbHkgZW1pdCBhIHRva2VuIGF0IHRoZQotCSAqICBvdXRlcm1vc3QgbGV4aWNhbCBydWxlLiAgVGhlIHRva2VuIG9iamVjdCBzaG91bGQgcG9pbnQgaW50byB0aGUKLQkgKiAgY2hhciBidWZmZXIgc3RhcnQuLnN0b3AuICBJZiB0aGVyZSBpcyBhIHRleHQgb3ZlcnJpZGUgaW4gJ3RleHQnLAotCSAqICB1c2UgdGhhdCB0byBzZXQgdGhlIHRva2VuJ3MgdGV4dC4gIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGVtaXQKLQkgKiAgY3VzdG9tIFRva2VuIG9iamVjdHMuCi0JICoKLQkgKiAgSWYgeW91IGFyZSBidWlsZGluZyB0cmVlcywgdGhlbiB5b3Ugc2hvdWxkIGFsc28gb3ZlcnJpZGUKLQkgKiAgUGFyc2VyIG9yIFRyZWVQYXJzZXIuZ2V0TWlzc2luZ1N5bWJvbCgpLgotCSAqLwotCXB1YmxpYyBUb2tlbiBlbWl0KCkgewotCQlUb2tlbiB0ID0gbmV3IENvbW1vblRva2VuKGlucHV0LCBzdGF0ZS50eXBlLCBzdGF0ZS5jaGFubmVsLCBzdGF0ZS50b2tlblN0YXJ0Q2hhckluZGV4LCBnZXRDaGFySW5kZXgoKS0xKTsKLQkJdC5zZXRMaW5lKHN0YXRlLnRva2VuU3RhcnRMaW5lKTsKLQkJdC5zZXRUZXh0KHN0YXRlLnRleHQpOwotCQl0LnNldENoYXJQb3NpdGlvbkluTGluZShzdGF0ZS50b2tlblN0YXJ0Q2hhclBvc2l0aW9uSW5MaW5lKTsKLQkJZW1pdCh0KTsKLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbWF0Y2goU3RyaW5nIHMpIHRocm93cyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICggaTxzLmxlbmd0aCgpICkgewotCQkJaWYgKCBpbnB1dC5MQSgxKSE9cy5jaGFyQXQoaSkgKSB7Ci0JCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKLQkJCQkJc3RhdGUuZmFpbGVkID0gdHJ1ZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gbXRlID0KLQkJCQkJbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbihzLmNoYXJBdChpKSwgaW5wdXQpOwotCQkJCXJlY292ZXIobXRlKTsKLQkJCQl0aHJvdyBtdGU7Ci0JCQl9Ci0JCQlpKys7Ci0JCQlpbnB1dC5jb25zdW1lKCk7Ci0JCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1hdGNoQW55KCkgewotCQlpbnB1dC5jb25zdW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWF0Y2goaW50IGMpIHRocm93cyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24gewotCQlpZiAoIGlucHV0LkxBKDEpIT1jICkgewotCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKLQkJCQlzdGF0ZS5mYWlsZWQgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPQotCQkJCW5ldyBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24oYywgaW5wdXQpOwotCQkJcmVjb3ZlcihtdGUpOyAgLy8gZG9uJ3QgcmVhbGx5IHJlY292ZXI7IGp1c3QgY29uc3VtZSBpbiBsZXhlcgotCQkJdGhyb3cgbXRlOwotCQl9Ci0JCWlucHV0LmNvbnN1bWUoKTsKLQkJc3RhdGUuZmFpbGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbWF0Y2hSYW5nZShpbnQgYSwgaW50IGIpCi0JCXRocm93cyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24KLQl7Ci0JCWlmICggaW5wdXQuTEEoMSk8YSB8fCBpbnB1dC5MQSgxKT5iICkgewotCQkJaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc+MCApIHsKLQkJCQlzdGF0ZS5mYWlsZWQgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCU1pc21hdGNoZWRSYW5nZUV4Y2VwdGlvbiBtcmUgPQotCQkJCW5ldyBNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24oYSxiLGlucHV0KTsKLQkJCXJlY292ZXIobXJlKTsKLQkJCXRocm93IG1yZTsKLQkJfQotCQlpbnB1dC5jb25zdW1lKCk7Ci0JCXN0YXRlLmZhaWxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIGlucHV0LmdldExpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoYXJQb3NpdGlvbkluTGluZSgpIHsKLQkJcmV0dXJuIGlucHV0LmdldENoYXJQb3NpdGlvbkluTGluZSgpOwotCX0KLQotCS8qKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgb2YgbG9va2FoZWFkPyAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhckluZGV4KCkgewotCQlyZXR1cm4gaW5wdXQuaW5kZXgoKTsKLQl9Ci0KLQkvKiogUmV0dXJuIHRoZSB0ZXh0IG1hdGNoZWQgc28gZmFyIGZvciB0aGUgY3VycmVudCB0b2tlbiBvciBhbnkKLQkgKiAgdGV4dCBvdmVycmlkZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmICggc3RhdGUudGV4dCE9bnVsbCApIHsKLQkJCXJldHVybiBzdGF0ZS50ZXh0OwotCQl9Ci0JCXJldHVybiBpbnB1dC5zdWJzdHJpbmcoc3RhdGUudG9rZW5TdGFydENoYXJJbmRleCxnZXRDaGFySW5kZXgoKS0xKTsKLQl9Ci0KLQkvKiogU2V0IHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgdG9rZW47IGl0IHdpcGVzIGFueSBwcmV2aW91cwotCSAqICBjaGFuZ2VzIHRvIHRoZSB0ZXh0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc3RhdGUudGV4dCA9IHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgewotCQkvKiogVE9ETzogbm90IHRob3VnaHQgYWJvdXQgcmVjb3ZlcnkgaW4gbGV4ZXIgeWV0LgotCQkgKgotCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IHJlcG9ydGVkIGFuIGVycm9yIGFuZCBoYXZlIG5vdCBtYXRjaGVkIGEgdG9rZW4KLQkJLy8geWV0IHN1Y2Nlc3NmdWxseSwgZG9uJ3QgcmVwb3J0IGFueSBlcnJvcnMuCi0JCWlmICggZXJyb3JSZWNvdmVyeSApIHsKLQkJCS8vU3lzdGVtLmVyci5wcmludCgiW1NQVVJJT1VTXSAiKTsKLQkJCXJldHVybjsKLQkJfQotCQllcnJvclJlY292ZXJ5ID0gdHJ1ZTsKLQkJICovCi0KLQkJZGlzcGxheVJlY29nbml0aW9uRXJyb3IodGhpcy5nZXRUb2tlbk5hbWVzKCksIGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKFJlY29nbml0aW9uRXhjZXB0aW9uIGUsIFN0cmluZ1tdIHRva2VuTmFtZXMpIHsKLQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCWlmICggZSBpbnN0YW5jZW9mIE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiApIHsKLQkJCU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBtdGUgPSAoTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKWU7Ci0JCQltc2cgPSAibWlzbWF0Y2hlZCBjaGFyYWN0ZXIgIitnZXRDaGFyRXJyb3JEaXNwbGF5KGUuYykrIiBleHBlY3RpbmcgIitnZXRDaGFyRXJyb3JEaXNwbGF5KG10ZS5leHBlY3RpbmcpOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTm9WaWFibGVBbHRFeGNlcHRpb24gKSB7Ci0JCQlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0gKE5vVmlhYmxlQWx0RXhjZXB0aW9uKWU7Ci0JCQkvLyBmb3IgZGV2ZWxvcG1lbnQsIGNhbiBhZGQgImRlY2lzaW9uPTw8IitudmFlLmdyYW1tYXJEZWNpc2lvbkRlc2NyaXB0aW9uKyI+PiIKLQkJCS8vIGFuZCAiKGRlY2lzaW9uPSIrbnZhZS5kZWNpc2lvbk51bWJlcisiKSBhbmQKLQkJCS8vICJzdGF0ZSAiK252YWUuc3RhdGVOdW1iZXIKLQkJCW1zZyA9ICJubyB2aWFibGUgYWx0ZXJuYXRpdmUgYXQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgRWFybHlFeGl0RXhjZXB0aW9uICkgewotCQkJRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9IChFYXJseUV4aXRFeGNlcHRpb24pZTsKLQkJCS8vIGZvciBkZXZlbG9wbWVudCwgY2FuIGFkZCAiKGRlY2lzaW9uPSIrZWVlLmRlY2lzaW9uTnVtYmVyKyIpIgotCQkJbXNnID0gInJlcXVpcmVkICguLi4pKyBsb29wIGRpZCBub3QgbWF0Y2ggYW55dGhpbmcgYXQgY2hhcmFjdGVyICIrZ2V0Q2hhckVycm9yRGlzcGxheShlLmMpOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTWlzbWF0Y2hlZE5vdFNldEV4Y2VwdGlvbiApIHsKLQkJCU1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24gbXNlID0gKE1pc21hdGNoZWROb3RTZXRFeGNlcHRpb24pZTsKLQkJCW1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK2dldENoYXJFcnJvckRpc3BsYXkoZS5jKSsiIGV4cGVjdGluZyBzZXQgIittc2UuZXhwZWN0aW5nOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiApIHsKLQkJCU1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gKE1pc21hdGNoZWRTZXRFeGNlcHRpb24pZTsKLQkJCW1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK2dldENoYXJFcnJvckRpc3BsYXkoZS5jKSsiIGV4cGVjdGluZyBzZXQgIittc2UuZXhwZWN0aW5nOwotCQl9Ci0JCWVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uICkgewotCQkJTWlzbWF0Y2hlZFJhbmdlRXhjZXB0aW9uIG1yZSA9IChNaXNtYXRjaGVkUmFuZ2VFeGNlcHRpb24pZTsKLQkJCW1zZyA9ICJtaXNtYXRjaGVkIGNoYXJhY3RlciAiK2dldENoYXJFcnJvckRpc3BsYXkoZS5jKSsiIGV4cGVjdGluZyBzZXQgIisKLQkJCQkgIGdldENoYXJFcnJvckRpc3BsYXkobXJlLmEpKyIuLiIrZ2V0Q2hhckVycm9yRGlzcGxheShtcmUuYik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltc2cgPSBzdXBlci5nZXRFcnJvck1lc3NhZ2UoZSwgdG9rZW5OYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJFcnJvckRpc3BsYXkoaW50IGMpIHsKLQkJU3RyaW5nIHMgPSBTdHJpbmcudmFsdWVPZigoY2hhciljKTsKLQkJc3dpdGNoICggYyApIHsKLQkJCWNhc2UgVG9rZW4uRU9GIDoKLQkJCQlzID0gIjxFT0Y+IjsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJyA6Ci0JCQkJcyA9ICJcXG4iOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHQnIDoKLQkJCQlzID0gIlxcdCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccicgOgotCQkJCXMgPSAiXFxyIjsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gIiciK3MrIiciOwotCX0KLQotCS8qKiBMZXhlcnMgY2FuIG5vcm1hbGx5IG1hdGNoIGFueSBjaGFyIGluIGl0J3Mgdm9jYWJ1bGFyeSBhZnRlciBtYXRjaGluZwotCSAqICBhIHRva2VuLCBzbyBkbyB0aGUgZWFzeSB0aGluZyBhbmQganVzdCBraWxsIGEgY2hhcmFjdGVyIGFuZCBob3BlCi0JICogIGl0IGFsbCB3b3JrcyBvdXQuICBZb3UgY2FuIGluc3RlYWQgdXNlIHRoZSBydWxlIGludm9jYXRpb24gc3RhY2sKLQkgKiAgdG8gZG8gc29waGlzdGljYXRlZCBlcnJvciByZWNvdmVyeSBpZiB5b3UgYXJlIGluIGEgZnJhZ21lbnQgcnVsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvdmVyKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb25zdW1pbmcgY2hhciAiKyhjaGFyKWlucHV0LkxBKDEpKyIgZHVyaW5nIHJlY292ZXJ5Iik7Ci0JCS8vcmUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCWlucHV0LmNvbnN1bWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmFjZUluKFN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgIHsKLQkJU3RyaW5nIGlucHV0U3ltYm9sID0gKChjaGFyKWlucHV0LkxUKDEpKSsiIGxpbmU9IitnZXRMaW5lKCkrIjoiK2dldENoYXJQb3NpdGlvbkluTGluZSgpOwotCQlzdXBlci50cmFjZUluKHJ1bGVOYW1lLCBydWxlSW5kZXgsIGlucHV0U3ltYm9sKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmFjZU91dChTdHJpbmcgcnVsZU5hbWUsIGludCBydWxlSW5kZXgpICB7Ci0JCVN0cmluZyBpbnB1dFN5bWJvbCA9ICgoY2hhcilpbnB1dC5MVCgxKSkrIiBsaW5lPSIrZ2V0TGluZSgpKyI6IitnZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKLQkJc3VwZXIudHJhY2VPdXQocnVsZU5hbWUsIHJ1bGVJbmRleCwgaW5wdXRTeW1ib2wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9QYXJzZXIuamF2YSBiL3NyYy9vcmcvYW50bHIvcnVudGltZS9QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWNmOTM3YS4uMDAwMDAwMAotLS0gYS9zcmMvb3JnL2FudGxyL3J1bnRpbWUvUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotIFtUaGUgIkJTRCBsaWNlbnNlIl0KLSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBvcmcuYW50bHIucnVudGltZTsKLQotLyoqIEEgcGFyc2VyIGZvciBUb2tlblN0cmVhbXMuICAicGFyc2VyIGdyYW1tYXJzIiByZXN1bHQgaW4gYSBzdWJjbGFzcwotICogIG9mIHRoaXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZXIgZXh0ZW5kcyBCYXNlUmVjb2duaXplciB7Ci0JcHVibGljIFRva2VuU3RyZWFtIGlucHV0OwotCi0JcHVibGljIFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCkgewotCQlzdXBlcigpOyAvLyBoaWdobGlnaHQgdGhhdCB3ZSBnbyB0byBzdXBlciB0byBzZXQgc3RhdGUgb2JqZWN0Ci0JCXNldFRva2VuU3RyZWFtKGlucHV0KTsKLSAgICB9Ci0KLQlwdWJsaWMgUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKLQkJc3VwZXIoc3RhdGUpOyAvLyBzaGFyZSB0aGUgc3RhdGUgb2JqZWN0IHdpdGggYW5vdGhlciBwYXJzZXIKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlzdXBlci5yZXNldCgpOyAvLyByZXNldCBhbGwgcmVjb2duaXplciBzdGF0ZSB2YXJpYWJsZXMKLQkJaWYgKCBpbnB1dCE9bnVsbCApIHsKLQkJCWlucHV0LnNlZWsoMCk7IC8vIHJld2luZCB0aGUgaW5wdXQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q3VycmVudElucHV0U3ltYm9sKEludFN0cmVhbSBpbnB1dCkgewotCQlyZXR1cm4gKChUb2tlblN0cmVhbSlpbnB1dCkuTFQoMSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRNaXNzaW5nU3ltYm9sKEludFN0cmVhbSBpbnB1dCwKLQkJCQkJCQkJCSAgUmVjb2duaXRpb25FeGNlcHRpb24gZSwKLQkJCQkJCQkJCSAgaW50IGV4cGVjdGVkVG9rZW5UeXBlLAotCQkJCQkJCQkJICBCaXRTZXQgZm9sbG93KQotCXsKLQkJU3RyaW5nIHRva2VuVGV4dCA9IG51bGw7Ci0JCWlmICggZXhwZWN0ZWRUb2tlblR5cGU9PVRva2VuLkVPRiApIHRva2VuVGV4dCA9ICI8bWlzc2luZyBFT0Y+IjsKLQkJZWxzZSB0b2tlblRleHQgPSAiPG1pc3NpbmcgIitnZXRUb2tlbk5hbWVzKClbZXhwZWN0ZWRUb2tlblR5cGVdKyI+IjsKLQkJQ29tbW9uVG9rZW4gdCA9IG5ldyBDb21tb25Ub2tlbihleHBlY3RlZFRva2VuVHlwZSwgdG9rZW5UZXh0KTsKLQkJVG9rZW4gY3VycmVudCA9ICgoVG9rZW5TdHJlYW0paW5wdXQpLkxUKDEpOwotCQlpZiAoIGN1cnJlbnQuZ2V0VHlwZSgpID09IFRva2VuLkVPRiApIHsKLQkJCWN1cnJlbnQgPSAoKFRva2VuU3RyZWFtKWlucHV0KS5MVCgtMSk7Ci0JCX0KLQkJdC5saW5lID0gY3VycmVudC5nZXRMaW5lKCk7Ci0JCXQuY2hhclBvc2l0aW9uSW5MaW5lID0gY3VycmVudC5nZXRDaGFyUG9zaXRpb25JbkxpbmUoKTsKLQkJdC5jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOwotCQlyZXR1cm4gdDsKLQl9Ci0KLQkvKiogU2V0IHRoZSB0b2tlbiBzdHJlYW0gYW5kIHJlc2V0IHRoZSBwYXJzZXIgKi8KLQlwdWJsaWMgdm9pZCBzZXRUb2tlblN0cmVhbShUb2tlblN0cmVhbSBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gbnVsbDsKLQkJcmVzZXQoKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotICAgIHB1YmxpYyBUb2tlblN0cmVhbSBnZXRUb2tlblN0cmVhbSgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIGlucHV0LmdldFNvdXJjZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmFjZUluKFN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgIHsKLQkJc3VwZXIudHJhY2VJbihydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSAgewotCQlzdXBlci50cmFjZU91dChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5qYXZhIGIvc3JjL29yZy9hbnRsci9ydW50aW1lL1BhcnNlclJ1bGVSZXR1cm5TY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MjM3ZTRlLi4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYW50bHIvcnVudGltZS9QYXJzZXJSdWxlUmV0dXJuU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gW1RoZSAiQlNEIGxpY2Vuc2UiXQotIENvcHlyaWdodCAoYykgMjAwNS0yMDA5IFRlcmVuY2UgUGFycgotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSBhcmUgbWV0OgotIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi1wYWNrYWdlIG9yZy5hbnRsci5ydW50aW1lOwotCi0vKiogUnVsZXMgdGhhdCByZXR1cm4gbW9yZSB0aGFuIGEgc2luZ2xlIHZhbHVlIG11c3QgcmV0dXJuIGFuIG9iamVjdAotICogIGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZXMuICBCZXNpZGVzIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4KLSAqICBSdWxlTGFiZWxTY29wZS5wcmVkZWZpbmVkUnVsZVByb3BlcnRpZXNTY29wZSB0aGVyZSBtYXkgYmUgdXNlci1kZWZpbmVkCi0gKiAgcmV0dXJuIHZhbHVlcy4gIFRoaXMgY2xhc3Mgc2ltcGx5IGRlZmluZXMgdGhlIG1pbmltdW0gcHJvcGVydGllcyB0aGF0Ci0gKiAgYXJlIGFsd2F5cyBkZWZpbmVkIGFuZCBtZXRob2RzIHRvIGFjY2VzcyB0aGUgb3RoZXJzIHRoYXQgbWlnaHQgYmUKLSAqICBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIG91dHB1dCBvcHRpb24gc3VjaCBhcyB0ZW1wbGF0ZSBhbmQgdHJlZS4KLSAqCi0gKiAgTm90ZSB0ZXh0IGlzIG5vdCBhbiBhY3R1YWwgcHJvcGVydHkgb2YgdGhlIHJldHVybiB2YWx1ZSwgaXQgaXMgY29tcHV0ZWQKLSAqICBmcm9tIHN0YXJ0IGFuZCBzdG9wIHVzaW5nIHRoZSBpbnB1dCBzdHJlYW0ncyB0b1N0cmluZygpIG1ldGhvZC4gIEkKLSAqICBjb3VsZCBhZGQgYSBjdG9yIHRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gcGFzcyBpbiBhbmQgc3RvcmUgdGhlIGlucHV0Ci0gKiAgc3RyZWFtLCBidXQgSSdtIG5vdCBzdXJlIHdlIHdhbnQgdG8gZG8gdGhhdC4gIEl0IHdvdWxkIHNlZW0gdG8gYmUgdW5kZWZpbmVkCi0gKiAgdG8gZ2V0IHRoZSAudGV4dCBwcm9wZXJ0eSBhbnl3YXkgaWYgdGhlIHJ1bGUgbWF0Y2hlcyB0b2tlbnMgZnJvbSBtdWx0aXBsZQotICogIGlucHV0IHN0cmVhbXMuCi0gKgotICogIEkgZG8gbm90IHVzZSBnZXR0ZXJzIGZvciBmaWVsZHMgb2Ygb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHNpbXBseSB0bwotICogIGdyb3VwIHZhbHVlcyBzdWNoIGFzIHRoaXMgYWdncmVnYXRlLiAgVGhlIGdldHRlcnMvc2V0dGVycyBhcmUgdGhlcmUgdG8KLSAqICBzYXRpc2Z5IHRoZSBzdXBlcmNsYXNzIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlclJ1bGVSZXR1cm5TY29wZSBleHRlbmRzIFJ1bGVSZXR1cm5TY29wZSB7Ci0JcHVibGljIFRva2VuIHN0YXJ0LCBzdG9wOwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7IHJldHVybiBzdGFydDsgfQotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsgcmV0dXJuIHN0b3A7IH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmphdmEgYi9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9CYXNlVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmZmZGIzLi4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0Jhc2VUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoKLSBbVGhlICJCU0QgbGljZW5zZSJdCi0gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgVGVyZW5jZSBQYXJyCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBBIGdlbmVyaWMgdHJlZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG5vIHBheWxvYWQuICBZb3UgbXVzdCBzdWJjbGFzcyB0bwotICogIGFjdHVhbGx5IGhhdmUgYW55IHVzZXIgZGF0YS4gIEFOVExSIHYzIHVzZXMgYSBsaXN0IG9mIGNoaWxkcmVuIGFwcHJvYWNoCi0gKiAgaW5zdGVhZCBvZiB0aGUgY2hpbGQtc2libGluZyBhcHByb2FjaCBpbiB2Mi4gIEEgZmxhdCB0cmVlIChhIGxpc3QpIGlzCi0gKiAgYW4gZW1wdHkgbm9kZSB3aG9zZSBjaGlsZHJlbiByZXByZXNlbnQgdGhlIGxpc3QuICBBbiBlbXB0eSwgYnV0Ci0gKiAgbm9uLW51bGwgbm9kZSBpcyBjYWxsZWQgIm5pbCIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHJlZSBpbXBsZW1lbnRzIFRyZWUgewotCXByb3RlY3RlZCBMaXN0IGNoaWxkcmVuOwotCi0JcHVibGljIEJhc2VUcmVlKCkgewotCX0KLQotCS8qKiBDcmVhdGUgYSBuZXcgbm9kZSBmcm9tIGFuIGV4aXN0aW5nIG5vZGUgZG9lcyBub3RoaW5nIGZvciBCYXNlVHJlZQotCSAqICBhcyB0aGVyZSBhcmUgbm8gZmllbGRzIG90aGVyIHRoYW4gdGhlIGNoaWxkcmVuIGxpc3QsIHdoaWNoIGNhbm5vdAotCSAqICBiZSBjb3BpZWQgYXMgdGhlIGNoaWxkcmVuIGFyZSBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoaXMgbm9kZS4gCi0JICovCi0JcHVibGljIEJhc2VUcmVlKFRyZWUgbm9kZSkgewotCX0KLQotCXB1YmxpYyBUcmVlIGdldENoaWxkKGludCBpKSB7Ci0JCWlmICggY2hpbGRyZW49PW51bGwgfHwgaT49Y2hpbGRyZW4uc2l6ZSgpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUcmVlKWNoaWxkcmVuLmdldChpKTsKLQl9Ci0KLQkvKiogR2V0IHRoZSBjaGlsZHJlbiBpbnRlcm5hbCBMaXN0OyBub3RlIHRoYXQgaWYgeW91IGRpcmVjdGx5IG1lc3Mgd2l0aAotCSAqICB0aGUgbGlzdCwgZG8gc28gYXQgeW91ciBvd24gcmlzay4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBUcmVlIGdldEZpcnN0Q2hpbGRXaXRoVHlwZShpbnQgdHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgY2hpbGRyZW4hPW51bGwgJiYgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlUcmVlIHQgPSAoVHJlZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKCB0LmdldFR5cGUoKT09dHlwZSApIHsKLQkJCQlyZXR1cm4gdDsKLQkJCX0KLQkJfQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgewotCQlpZiAoIGNoaWxkcmVuPT1udWxsICkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKLQl9Ci0KLQkvKiogQWRkIHQgYXMgY2hpbGQgb2YgdGhpcyBub2RlLgotCSAqCi0JICogIFdhcm5pbmc6IGlmIHQgaGFzIG5vIGNoaWxkcmVuLCBidXQgY2hpbGQgZG9lcwotCSAqICBhbmQgY2hpbGQgaXNOaWwgdGhlbiB0aGlzIHJvdXRpbmUgbW92ZXMgY2hpbGRyZW4gdG8gdCB2aWEKLQkgKiAgdC5jaGlsZHJlbiA9IGNoaWxkLmNoaWxkcmVuOyBpLmUuLCB3aXRob3V0IGNvcHlpbmcgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRyZWUgdCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkIGNoaWxkICIrdC50b1N0cmluZ1RyZWUoKSsiICIrdGhpcy50b1N0cmluZ1RyZWUoKSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJleGlzdGluZyBjaGlsZHJlbjogIitjaGlsZHJlbik7Ci0JCWlmICggdD09bnVsbCApIHsKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZyB1cG9uIGFkZENoaWxkKG51bGwpCi0JCX0KLQkJQmFzZVRyZWUgY2hpbGRUcmVlID0gKEJhc2VUcmVlKXQ7Ci0JCWlmICggY2hpbGRUcmVlLmlzTmlsKCkgKSB7IC8vIHQgaXMgYW4gZW1wdHkgbm9kZSBwb3NzaWJseSB3aXRoIGNoaWxkcmVuCi0JCQlpZiAoIHRoaXMuY2hpbGRyZW4hPW51bGwgJiYgdGhpcy5jaGlsZHJlbiA9PSBjaGlsZFRyZWUuY2hpbGRyZW4gKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImF0dGVtcHQgdG8gYWRkIGNoaWxkIGxpc3QgdG8gaXRzZWxmIik7Ci0JCQl9Ci0JCQkvLyBqdXN0IGFkZCBhbGwgb2YgY2hpbGRUcmVlJ3MgY2hpbGRyZW4gdG8gdGhpcwotCQkJaWYgKCBjaGlsZFRyZWUuY2hpbGRyZW4hPW51bGwgKSB7Ci0JCQkJaWYgKCB0aGlzLmNoaWxkcmVuIT1udWxsICkgeyAvLyBtdXN0IGNvcHksIHRoaXMgaGFzIGNoaWxkcmVuIGFscmVhZHkKLQkJCQkJaW50IG4gPSBjaGlsZFRyZWUuY2hpbGRyZW4uc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCQkJVHJlZSBjID0gKFRyZWUpY2hpbGRUcmVlLmNoaWxkcmVuLmdldChpKTsKLQkJCQkJCXRoaXMuY2hpbGRyZW4uYWRkKGMpOwotCQkJCQkJLy8gaGFuZGxlIGRvdWJsZS1saW5rIHN0dWZmIGZvciBlYWNoIGNoaWxkIG9mIG5pbCByb290Ci0JCQkJCQljLnNldFBhcmVudCh0aGlzKTsKLQkJCQkJCWMuc2V0Q2hpbGRJbmRleChjaGlsZHJlbi5zaXplKCktMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vIGNoaWxkcmVuIGZvciB0aGlzIGJ1dCB0IGhhcyBjaGlsZHJlbjsganVzdCBzZXQgcG9pbnRlcgotCQkJCQkvLyBjYWxsIGdlbmVyYWwgZnJlc2hlbmVyIHJvdXRpbmUKLQkJCQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkVHJlZS5jaGlsZHJlbjsKLQkJCQkJdGhpcy5mcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBjaGlsZCBpcyBub3QgbmlsIChkb24ndCBjYXJlIGFib3V0IGNoaWxkcmVuKQotCQkJaWYgKCBjaGlsZHJlbj09bnVsbCApIHsKLQkJCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuTGlzdCgpOyAvLyBjcmVhdGUgY2hpbGRyZW4gbGlzdCBvbiBkZW1hbmQKLQkJCX0KLQkJCWNoaWxkcmVuLmFkZCh0KTsKLQkJCWNoaWxkVHJlZS5zZXRQYXJlbnQodGhpcyk7Ci0JCQljaGlsZFRyZWUuc2V0Q2hpbGRJbmRleChjaGlsZHJlbi5zaXplKCktMSk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJub3cgY2hpbGRyZW4gYXJlOiAiK2NoaWxkcmVuKTsKLQl9Ci0KLQkvKiogQWRkIGFsbCBlbGVtZW50cyBvZiBraWRzIGxpc3QgYXMgY2hpbGRyZW4gb2YgdGhpcyBub2RlICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRyZW4oTGlzdCBraWRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2lkcy5zaXplKCk7IGkrKykgewotCQkJVHJlZSB0ID0gKFRyZWUpIGtpZHMuZ2V0KGkpOwotCQkJYWRkQ2hpbGQodCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZChpbnQgaSwgVHJlZSB0KSB7Ci0JCWlmICggdD09bnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIHQuaXNOaWwoKSApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHNldCBzaW5nbGUgY2hpbGQgdG8gYSBsaXN0Iik7Ci0JCX0KLQkJaWYgKCBjaGlsZHJlbj09bnVsbCApIHsKLQkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW5MaXN0KCk7Ci0JCX0KLQkJY2hpbGRyZW4uc2V0KGksIHQpOwotCQl0LnNldFBhcmVudCh0aGlzKTsKLQkJdC5zZXRDaGlsZEluZGV4KGkpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGRlbGV0ZUNoaWxkKGludCBpKSB7Ci0JCWlmICggY2hpbGRyZW49PW51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUcmVlIGtpbGxlZCA9IChUcmVlKWNoaWxkcmVuLnJlbW92ZShpKTsKLQkJLy8gd2FsayByZXN0IGFuZCBkZWNyZW1lbnQgdGhlaXIgY2hpbGQgaW5kZXhlcwotCQl0aGlzLmZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoaSk7Ci0JCXJldHVybiBraWxsZWQ7Ci0JfQotCi0JLyoqIERlbGV0ZSBjaGlsZHJlbiBmcm9tIHN0YXJ0IHRvIHN0b3AgYW5kIHJlcGxhY2Ugd2l0aCB0IGV2ZW4gaWYgdCBpcwotCSAqICBhIGxpc3QgKG5pbC1yb290IHRyZWUpLiAgbnVtIG9mIGNoaWxkcmVuIGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZS4KLQkgKiAgRm9yIGh1Z2UgY2hpbGQgbGlzdHMsIGluc2VydGluZyBjaGlsZHJlbiBjYW4gZm9yY2Ugd2Fsa2luZyByZXN0IG9mCi0JICogIGNoaWxkcmVuIHRvIHNldCB0aGVpciBjaGlsZGluZGV4OyBjb3VsZCBiZSBzbG93LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VDaGlsZHJlbihpbnQgc3RhcnRDaGlsZEluZGV4LCBpbnQgc3RvcENoaWxkSW5kZXgsIE9iamVjdCB0KSB7Ci0JCS8qCi0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVwbGFjZUNoaWxkcmVuICIrc3RhcnRDaGlsZEluZGV4KyIsICIrc3RvcENoaWxkSW5kZXgrCi0JCQkJCQkgICAiIHdpdGggIisoKEJhc2VUcmVlKXQpLnRvU3RyaW5nVHJlZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbj0iK3RvU3RyaW5nVHJlZSgpKTsKLQkJKi8KLQkJaWYgKCBjaGlsZHJlbj09bnVsbCApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4ZXMgaW52YWxpZDsgbm8gY2hpbGRyZW4gaW4gbGlzdCIpOwotCQl9Ci0JCWludCByZXBsYWNpbmdIb3dNYW55ID0gc3RvcENoaWxkSW5kZXggLSBzdGFydENoaWxkSW5kZXggKyAxOwotCQlpbnQgcmVwbGFjaW5nV2l0aEhvd01hbnk7Ci0JCUJhc2VUcmVlIG5ld1RyZWUgPSAoQmFzZVRyZWUpdDsKLQkJTGlzdCBuZXdDaGlsZHJlbiA9IG51bGw7Ci0JCS8vIG5vcm1hbGl6ZSB0byBhIGxpc3Qgb2YgY2hpbGRyZW4gdG8gYWRkOiBuZXdDaGlsZHJlbgotCQlpZiAoIG5ld1RyZWUuaXNOaWwoKSApIHsKLQkJCW5ld0NoaWxkcmVuID0gbmV3VHJlZS5jaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCW5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCW5ld0NoaWxkcmVuLmFkZChuZXdUcmVlKTsKLQkJfQotCQlyZXBsYWNpbmdXaXRoSG93TWFueSA9IG5ld0NoaWxkcmVuLnNpemUoKTsKLQkJaW50IG51bU5ld0NoaWxkcmVuID0gbmV3Q2hpbGRyZW4uc2l6ZSgpOwotCQlpbnQgZGVsdGEgPSByZXBsYWNpbmdIb3dNYW55IC0gcmVwbGFjaW5nV2l0aEhvd01hbnk7Ci0JCS8vIGlmIHNhbWUgbnVtYmVyIG9mIG5vZGVzLCBkbyBkaXJlY3QgcmVwbGFjZQotCQlpZiAoIGRlbHRhID09IDAgKSB7Ci0JCQlpbnQgaiA9IDA7IC8vIGluZGV4IGludG8gbmV3IGNoaWxkcmVuCi0JCQlmb3IgKGludCBpPXN0YXJ0Q2hpbGRJbmRleDsgaTw9c3RvcENoaWxkSW5kZXg7IGkrKykgewotCQkJCUJhc2VUcmVlIGNoaWxkID0gKEJhc2VUcmVlKW5ld0NoaWxkcmVuLmdldChqKTsKLQkJCQljaGlsZHJlbi5zZXQoaSwgY2hpbGQpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZC5zZXRDaGlsZEluZGV4KGkpOwotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLQkJfQotCQllbHNlIGlmICggZGVsdGEgPiAwICkgeyAvLyBmZXdlciBuZXcgbm9kZXMgdGhhbiB0aGVyZSB3ZXJlCi0JCQkvLyBzZXQgY2hpbGRyZW4gYW5kIHRoZW4gZGVsZXRlIGV4dHJhCi0JCQlmb3IgKGludCBqPTA7IGo8bnVtTmV3Q2hpbGRyZW47IGorKykgewotCQkJCWNoaWxkcmVuLnNldChzdGFydENoaWxkSW5kZXgraiwgbmV3Q2hpbGRyZW4uZ2V0KGopKTsKLQkJCX0KLQkJCWludCBpbmRleFRvRGVsZXRlID0gc3RhcnRDaGlsZEluZGV4K251bU5ld0NoaWxkcmVuOwotCQkJZm9yIChpbnQgYz1pbmRleFRvRGVsZXRlOyBjPD1zdG9wQ2hpbGRJbmRleDsgYysrKSB7Ci0JCQkJLy8gZGVsZXRlIHNhbWUgaW5kZXgsIHNoaWZ0aW5nIGV2ZXJ5Ym9keSBkb3duIGVhY2ggdGltZQotCQkJCWNoaWxkcmVuLnJlbW92ZShpbmRleFRvRGVsZXRlKTsKLQkJCX0KLQkJCWZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoc3RhcnRDaGlsZEluZGV4KTsKLQkJfQotCQllbHNlIHsgLy8gbW9yZSBuZXcgbm9kZXMgdGhhbiB3ZXJlIHRoZXJlIGJlZm9yZQotCQkJLy8gZmlsbCBpbiBhcyBtYW55IGNoaWxkcmVuIGFzIHdlIGNhbiAocmVwbGFjaW5nSG93TWFueSkgdy9vIG1vdmluZyBkYXRhCi0JCQlmb3IgKGludCBqPTA7IGo8cmVwbGFjaW5nSG93TWFueTsgaisrKSB7Ci0JCQkJY2hpbGRyZW4uc2V0KHN0YXJ0Q2hpbGRJbmRleCtqLCBuZXdDaGlsZHJlbi5nZXQoaikpOwotCQkJfQotCQkJaW50IG51bVRvSW5zZXJ0ID0gcmVwbGFjaW5nV2l0aEhvd01hbnktcmVwbGFjaW5nSG93TWFueTsKLQkJCWZvciAoaW50IGo9cmVwbGFjaW5nSG93TWFueTsgajxyZXBsYWNpbmdXaXRoSG93TWFueTsgaisrKSB7Ci0JCQkJY2hpbGRyZW4uYWRkKHN0YXJ0Q2hpbGRJbmRleCtqLCBuZXdDaGlsZHJlbi5nZXQoaikpOwotCQkJfQotCQkJZnJlc2hlblBhcmVudEFuZENoaWxkSW5kZXhlcyhzdGFydENoaWxkSW5kZXgpOwotCQl9Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJvdXQ9Iit0b1N0cmluZ1RyZWUoKSk7Ci0JfQotCi0JLyoqIE92ZXJyaWRlIGluIGEgc3ViY2xhc3MgdG8gY2hhbmdlIHRoZSBpbXBsIG9mIGNoaWxkcmVuIGxpc3QgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVDaGlsZHJlbkxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOaWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogU2V0IHRoZSBwYXJlbnQgYW5kIGNoaWxkIGluZGV4IHZhbHVlcyBmb3IgYWxsIGNoaWxkIG9mIHQgKi8KLQlwdWJsaWMgdm9pZCBmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkgewotCQlmcmVzaGVuUGFyZW50QW5kQ2hpbGRJbmRleGVzKDApOwotCX0KLQotCXB1YmxpYyB2b2lkIGZyZXNoZW5QYXJlbnRBbmRDaGlsZEluZGV4ZXMoaW50IG9mZnNldCkgewotCQlpbnQgbiA9IGdldENoaWxkQ291bnQoKTsKLQkJZm9yIChpbnQgYyA9IG9mZnNldDsgYyA8IG47IGMrKykgewotCQkJVHJlZSBjaGlsZCA9IChUcmVlKWdldENoaWxkKGMpOwotCQkJY2hpbGQuc2V0Q2hpbGRJbmRleChjKTsKLQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhbml0eUNoZWNrUGFyZW50QW5kQ2hpbGRJbmRleGVzKCkgewotCQlzYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyhudWxsLCAtMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2FuaXR5Q2hlY2tQYXJlbnRBbmRDaGlsZEluZGV4ZXMoVHJlZSBwYXJlbnQsIGludCBpKSB7Ci0JCWlmICggcGFyZW50IT10aGlzLmdldFBhcmVudCgpICkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFyZW50cyBkb24ndCBtYXRjaDsgZXhwZWN0ZWQgIitwYXJlbnQrIiBmb3VuZCAiK3RoaXMuZ2V0UGFyZW50KCkpOwotCQl9Ci0JCWlmICggaSE9dGhpcy5nZXRDaGlsZEluZGV4KCkgKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjaGlsZCBpbmRleGVzIGRvbid0IG1hdGNoOyBleHBlY3RlZCAiK2krIiBmb3VuZCAiK3RoaXMuZ2V0Q2hpbGRJbmRleCgpKTsKLQkJfQotCQlpbnQgbiA9IHRoaXMuZ2V0Q2hpbGRDb3VudCgpOwotCQlmb3IgKGludCBjID0gMDsgYyA8IG47IGMrKykgewotCQkJQ29tbW9uVHJlZSBjaGlsZCA9IChDb21tb25UcmVlKXRoaXMuZ2V0Q2hpbGQoYyk7Ci0JCQljaGlsZC5zYW5pdHlDaGVja1BhcmVudEFuZENoaWxkSW5kZXhlcyh0aGlzLCBjKTsKLQkJfQotCX0KLQotCS8qKiBCYXNlVHJlZSBkb2Vzbid0IHRyYWNrIGNoaWxkIGluZGV4ZXMuICovCi0JcHVibGljIGludCBnZXRDaGlsZEluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2hpbGRJbmRleChpbnQgaW5kZXgpIHsKLQl9Ci0KLQkvKiogQmFzZVRyZWUgZG9lc24ndCB0cmFjayBwYXJlbnQgcG9pbnRlcnMuICovCi0JcHVibGljIFRyZWUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVHJlZSB0KSB7Ci0JfQotCi0gICAgLyoqIFdhbGsgdXB3YXJkcyBsb29raW5nIGZvciBhbmNlc3RvciB3aXRoIHRoaXMgdG9rZW4gdHlwZS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBbmNlc3RvcihpbnQgdHR5cGUpIHsgcmV0dXJuIGdldEFuY2VzdG9yKHR0eXBlKSE9bnVsbDsgfQotCi0gICAgLyoqIFdhbGsgdXB3YXJkcyBhbmQgZ2V0IGZpcnN0IGFuY2VzdG9yIHdpdGggdGhpcyB0b2tlbiB0eXBlLiAqLwotICAgIHB1YmxpYyBUcmVlIGdldEFuY2VzdG9yKGludCB0dHlwZSkgewotICAgICAgICBUcmVlIHQgPSB0aGlzOwotICAgICAgICB0ID0gdC5nZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKCB0IT1udWxsICkgewotICAgICAgICAgICAgaWYgKCB0LmdldFR5cGUoKT09dHR5cGUgKSByZXR1cm4gdDsKLSAgICAgICAgICAgIHQgPSB0LmdldFBhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBhbmNlc3RvcnMgb2YgdGhpcyBub2RlLiAgVGhlIGZpcnN0IG5vZGUgb2YKLSAgICAgKiAgbGlzdCBpcyB0aGUgcm9vdCBhbmQgdGhlIGxhc3QgaXMgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0QW5jZXN0b3JzKCkgewotICAgICAgICBpZiAoIGdldFBhcmVudCgpPT1udWxsICkgcmV0dXJuIG51bGw7Ci0gICAgICAgIExpc3QgYW5jZXN0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBUcmVlIHQgPSB0aGlzOwotICAgICAgICB0ID0gdC5nZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKCB0IT1udWxsICkgewotICAgICAgICAgICAgYW5jZXN0b3JzLmFkZCgwLCB0KTsgLy8gaW5zZXJ0IGF0IHN0YXJ0Ci0gICAgICAgICAgICB0ID0gdC5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5jZXN0b3JzOwotICAgIH0KLQotICAgIC8qKiBQcmludCBvdXQgYSB3aG9sZSB0cmVlIG5vdCBqdXN0IGEgbm9kZSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdUcmVlKCkgewotCQlpZiAoIGNoaWxkcmVuPT1udWxsIHx8IGNoaWxkcmVuLnNpemUoKT09MCApIHsKLQkJCXJldHVybiB0aGlzLnRvU3RyaW5nKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKCAhaXNOaWwoKSApIHsKLQkJCWJ1Zi5hcHBlbmQoIigiKTsKLQkJCWJ1Zi5hcHBlbmQodGhpcy50b1N0cmluZygpKTsKLQkJCWJ1Zi5hcHBlbmQoJyAnKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgY2hpbGRyZW4hPW51bGwgJiYgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlUcmVlIHQgPSAoVHJlZSljaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoIGk+MCApIHsKLQkJCQlidWYuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0JCQlidWYuYXBwZW5kKHQudG9TdHJpbmdUcmVlKCkpOwotCQl9Ci0JCWlmICggIWlzTmlsKCkgKSB7Ci0JCQlidWYuYXBwZW5kKCIpIik7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGludCBnZXRDaGFyUG9zaXRpb25JbkxpbmUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKiBPdmVycmlkZSB0byBzYXkgaG93IGEgbm9kZSAobm90IGEgdHJlZSkgc2hvdWxkIGxvb2sgYXMgdGV4dCAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmphdmEgYi9zcmMvb3JnL2FudGxyL3J1bnRpbWUvdHJlZS9Db21tb25UcmVlTm9kZVN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNWRiYmRkLi4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL0NvbW1vblRyZWVOb2RlU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSBbVGhlICJCU0QgbGljZW5zZSJdCi0gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgVGVyZW5jZSBQYXJyCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIGFyZSBtZXQ6Ci0gMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgotIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFudGxyLnJ1bnRpbWUudHJlZTsKLQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlRva2VuU3RyZWFtOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLm1pc2MuTG9va2FoZWFkU3RyZWFtOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLm1pc2MuSW50QXJyYXk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIENvbW1vblRyZWVOb2RlU3RyZWFtIGV4dGVuZHMgTG9va2FoZWFkU3RyZWFtPE9iamVjdD4gaW1wbGVtZW50cyBUcmVlTm9kZVN0cmVhbSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfQ0FMTF9TVEFDS19TSVpFID0gMTA7Ci0KLQkvKiogUHVsbCBub2RlcyBmcm9tIHdoaWNoIHRyZWU/ICovCi0JcHJvdGVjdGVkIE9iamVjdCByb290OwotCi0JLyoqIElmIHRoaXMgdHJlZSAocm9vdCkgd2FzIGNyZWF0ZWQgZnJvbSBhIHRva2VuIHN0cmVhbSwgdHJhY2sgaXQuICovCi0JcHJvdGVjdGVkIFRva2VuU3RyZWFtIHRva2VuczsKLQotCS8qKiBXaGF0IHRyZWUgYWRhcHRvciB3YXMgdXNlZCB0byBidWlsZCB0aGVzZSB0cmVlcyAqLwotCVRyZWVBZGFwdG9yIGFkYXB0b3I7Ci0KLSAgICAvKiogVGhlIHRyZWUgaXRlcmF0b3Igd2UgdXNpbmcgKi8KLSAgICBwcm90ZWN0ZWQgVHJlZUl0ZXJhdG9yIGl0OwotCi0gICAgLyoqIFN0YWNrIG9mIGluZGV4ZXMgdXNlZCBmb3IgcHVzaC9wb3AgY2FsbHMgKi8KLSAgICBwcm90ZWN0ZWQgSW50QXJyYXkgY2FsbHM7ICAgIAotCi0gICAgLyoqIFRyZWUgKG5pbCBBIEIgQykgdHJlZXMgbGlrZSBmbGF0IEEgQiBDIHN0cmVhbXMgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOaWxSb290ID0gZmFsc2U7Ci0KLSAgICAvKiogVHJhY2tzIHRyZWUgZGVwdGguICBMZXZlbD0wIG1lYW5zIHdlJ3JlIGF0IHJvb3Qgbm9kZSBsZXZlbC4gKi8KLSAgICBwcm90ZWN0ZWQgaW50IGxldmVsID0gMDsKLQotCXB1YmxpYyBDb21tb25UcmVlTm9kZVN0cmVhbShPYmplY3QgdHJlZSkgewotCQl0aGlzKG5ldyBDb21tb25UcmVlQWRhcHRvcigpLCB0cmVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uVHJlZU5vZGVTdHJlYW0oVHJlZUFkYXB0b3IgYWRhcHRvciwgT2JqZWN0IHRyZWUpIHsKLQkJdGhpcy5yb290ID0gdHJlZTsKLQkJdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsKLSAgICAgICAgaXQgPSBuZXcgVHJlZUl0ZXJhdG9yKGFkYXB0b3Iscm9vdCk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIHN1cGVyLnJlc2V0KCk7Ci0gICAgICAgIGl0LnJlc2V0KCk7Ci0gICAgICAgIGhhc05pbFJvb3QgPSBmYWxzZTsKLSAgICAgICAgbGV2ZWwgPSAwOwotICAgICAgICBpZiAoIGNhbGxzICE9IG51bGwgKSBjYWxscy5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICAvKiogUHVsbCBlbGVtZW50cyBmcm9tIHRyZWUgaXRlcmF0b3IuICBUcmFjayB0cmVlIGxldmVsIDAuLm1heF9sZXZlbC4KLSAgICAgKiAgSWYgbmlsIHJvb3RlZCB0cmVlLCBkb24ndCBnaXZlIGluaXRpYWwgbmlsIGFuZCBET1dOIG5vciBmaW5hbCBVUC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICBPYmplY3QgdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInB1bGxlZCAiK2FkYXB0b3IuZ2V0VHlwZSh0KSk7Ci0gICAgICAgIGlmICggdCA9PSBpdC51cCApIHsKLSAgICAgICAgICAgIGxldmVsLS07Ci0gICAgICAgICAgICBpZiAoIGxldmVsPT0wICYmIGhhc05pbFJvb3QgKSByZXR1cm4gaXQubmV4dCgpOyAvLyBkb24ndCBnaXZlIGxhc3QgVVA7IGdldCBFT0YKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggdCA9PSBpdC5kb3duICkgbGV2ZWwrKzsKLSAgICAgICAgaWYgKCBsZXZlbD09MCAmJiBhZGFwdG9yLmlzTmlsKHQpICkgeyAvLyBpZiBuaWwgcm9vdCwgc2NhcmYgbmlsLCBET1dOCi0gICAgICAgICAgICBoYXNOaWxSb290ID0gdHJ1ZTsKLSAgICAgICAgICAgIHQgPSBpdC5uZXh0KCk7IC8vIHQgaXMgbm93IERPV04sIHNvIGdldCBmaXJzdCByZWFsIG5vZGUgbmV4dAotICAgICAgICAgICAgbGV2ZWwrKzsKLSAgICAgICAgICAgIHQgPSBpdC5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFT0YoT2JqZWN0IG8pIHsgcmV0dXJuIGFkYXB0b3IuZ2V0VHlwZShvKSA9PSBUb2tlbi5FT0Y7IH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hdmlnYXRpb25Ob2Rlcyhib29sZWFuIHVuaXF1ZU5hdmlnYXRpb25Ob2RlcykgeyB9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRyZWVTb3VyY2UoKSB7CXJldHVybiByb290OyB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKSB7IHJldHVybiBnZXRUb2tlblN0cmVhbSgpLmdldFNvdXJjZU5hbWUoKTsgfQotCi0JcHVibGljIFRva2VuU3RyZWFtIGdldFRva2VuU3RyZWFtKCkgeyByZXR1cm4gdG9rZW5zOyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb2tlblN0cmVhbShUb2tlblN0cmVhbSB0b2tlbnMpIHsgdGhpcy50b2tlbnMgPSB0b2tlbnM7IH0KLQotCXB1YmxpYyBUcmVlQWRhcHRvciBnZXRUcmVlQWRhcHRvcigpIHsgcmV0dXJuIGFkYXB0b3I7IH0KLQotCXB1YmxpYyB2b2lkIHNldFRyZWVBZGFwdG9yKFRyZWVBZGFwdG9yIGFkYXB0b3IpIHsgdGhpcy5hZGFwdG9yID0gYWRhcHRvcjsgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoaW50IGkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJBYnNvbHV0ZSBub2RlIGluZGV4ZXMgYXJlIG1lYW5pbmdsZXNzIGluIGFuIHVuYnVmZmVyZWQgc3RyZWFtIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBMQShpbnQgaSkgeyByZXR1cm4gYWRhcHRvci5nZXRUeXBlKExUKGkpKTsgfQotCi0gICAgLyoqIE1ha2Ugc3RyZWFtIGp1bXAgdG8gYSBuZXcgbG9jYXRpb24sIHNhdmluZyBvbGQgbG9jYXRpb24uCi0gICAgICogIFN3aXRjaCBiYWNrIHdpdGggcG9wKCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVzaChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKCBjYWxscz09bnVsbCApIHsKLSAgICAgICAgICAgIGNhbGxzID0gbmV3IEludEFycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FsbHMucHVzaChwKTsgLy8gc2F2ZSBjdXJyZW50IGluZGV4Ci0gICAgICAgIHNlZWsoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKiBTZWVrIGJhY2sgdG8gcHJldmlvdXMgaW5kZXggc2F2ZWQgZHVyaW5nIGxhc3QgcHVzaCgpIGNhbGwuCi0gICAgICogIFJldHVybiB0b3Agb2Ygc3RhY2sgKHJldHVybiBpbmRleCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBwb3AoKSB7Ci0gICAgICAgIGludCByZXQgPSBjYWxscy5wb3AoKTsKLSAgICAgICAgc2VlayhyZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0gICAgCi0KLQkvLyBUUkVFIFJFV1JJVEUgSU5URVJGQUNFCi0KLQlwdWJsaWMgdm9pZCByZXBsYWNlQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCwgaW50IHN0YXJ0Q2hpbGRJbmRleCwgaW50IHN0b3BDaGlsZEluZGV4LCBPYmplY3QgdCkgewotCQlpZiAoIHBhcmVudCE9bnVsbCApIHsKLQkJCWFkYXB0b3IucmVwbGFjZUNoaWxkcmVuKHBhcmVudCwgc3RhcnRDaGlsZEluZGV4LCBzdG9wQ2hpbGRJbmRleCwgdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBzdGFydCwgT2JqZWN0IHN0b3ApIHsKLSAgICAgICAgLy8gd2UnbGwgaGF2ZSB0byB3YWxrIGZyb20gc3RhcnQgdG8gc3RvcCBpbiB0cmVlOyB3ZSdyZSBub3Qga2VlcGluZwotICAgICAgICAvLyBhIGNvbXBsZXRlIG5vZGUgc3RyZWFtIGJ1ZmZlcgotICAgICAgICByZXR1cm4gIm4vYSI7Ci0JfQotCi0gICAgLyoqIEZvciBkZWJ1Z2dpbmc7IGRlc3RydWN0aXZlOiBtb3ZlcyB0cmVlIGl0ZXJhdG9yIHRvIGVuZC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvVG9rZW5UeXBlU3RyaW5nKCkgewotICAgICAgICByZXNldCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBPYmplY3QgbyA9IExUKDEpOwotICAgICAgICBpbnQgdHlwZSA9IGFkYXB0b3IuZ2V0VHlwZShvKTsKLSAgICAgICAgd2hpbGUgKCB0eXBlIT1Ub2tlbi5FT0YgKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHR5cGUpOwotICAgICAgICAgICAgY29uc3VtZSgpOwotICAgICAgICAgICAgbyA9IExUKDEpOwotICAgICAgICAgICAgdHlwZSA9IGFkYXB0b3IuZ2V0VHlwZShvKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5qYXZhIGIvc3JjL29yZy9hbnRsci9ydW50aW1lL3RyZWUvVHJlZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTY4YmM5Li4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYW50bHIvcnVudGltZS90cmVlL1RyZWVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotIFtUaGUgIkJTRCBsaWNlbnNlIl0KLSBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOSBUZXJlbmNlIFBhcnIKLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gYXJlIG1ldDoKLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBvcmcuYW50bHIucnVudGltZS50cmVlOwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi0vKiogQSBwYXJzZXIgZm9yIGEgc3RyZWFtIG9mIHRyZWUgbm9kZXMuICAidHJlZSBncmFtbWFycyIgcmVzdWx0IGluIGEgc3ViY2xhc3MKLSAqICBvZiB0aGlzLiAgQWxsIHRoZSBlcnJvciByZXBvcnRpbmcgYW5kIHJlY292ZXJ5IGlzIHNoYXJlZCB3aXRoIFBhcnNlciB2aWEKLSAqICB0aGUgQmFzZVJlY29nbml6ZXIgc3VwZXJjbGFzcy4KLSovCi1wdWJsaWMgY2xhc3MgVHJlZVBhcnNlciBleHRlbmRzIEJhc2VSZWNvZ25pemVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOID0gVG9rZW4uRE9XTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUCA9IFRva2VuLlVQOwotCi0gICAgLy8gcHJlY29tcGlsZWQgcmVnZXggdXNlZCBieSBpbkNvbnRleHQKLSAgICBzdGF0aWMgU3RyaW5nIGRvdGRvdCA9ICIuKlteLl1cXC5cXC5bXi5dLioiOwotICAgIHN0YXRpYyBTdHJpbmcgZG91YmxlRXRjID0gIi4qXFwuXFwuXFwuXFxzK1xcLlxcLlxcLi4qIjsKLSAgICBzdGF0aWMgUGF0dGVybiBkb3Rkb3RQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKGRvdGRvdCk7Ci0gICAgc3RhdGljIFBhdHRlcm4gZG91YmxlRXRjUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShkb3VibGVFdGMpOwotCi0JcHJvdGVjdGVkIFRyZWVOb2RlU3RyZWFtIGlucHV0OwotCi0JcHVibGljIFRyZWVQYXJzZXIoVHJlZU5vZGVTdHJlYW0gaW5wdXQpIHsKLQkJc3VwZXIoKTsgLy8gaGlnaGxpZ2h0IHRoYXQgd2UgZ28gdG8gc3VwZXIgdG8gc2V0IHN0YXRlIG9iamVjdAotCQlzZXRUcmVlTm9kZVN0cmVhbShpbnB1dCk7Ci0JfQotCi0JcHVibGljIFRyZWVQYXJzZXIoVHJlZU5vZGVTdHJlYW0gaW5wdXQsIFJlY29nbml6ZXJTaGFyZWRTdGF0ZSBzdGF0ZSkgewotCQlzdXBlcihzdGF0ZSk7IC8vIHNoYXJlIHRoZSBzdGF0ZSBvYmplY3Qgd2l0aCBhbm90aGVyIHBhcnNlcgotCQlzZXRUcmVlTm9kZVN0cmVhbShpbnB1dCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXN1cGVyLnJlc2V0KCk7IC8vIHJlc2V0IGFsbCByZWNvZ25pemVyIHN0YXRlIHZhcmlhYmxlcwotCQlpZiAoIGlucHV0IT1udWxsICkgewotCQkJaW5wdXQuc2VlaygwKTsgLy8gcmV3aW5kIHRoZSBpbnB1dAotCQl9Ci0JfQotCi0JLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtICovCi0JcHVibGljIHZvaWQgc2V0VHJlZU5vZGVTdHJlYW0oVHJlZU5vZGVTdHJlYW0gaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyBUcmVlTm9kZVN0cmVhbSBnZXRUcmVlTm9kZVN0cmVhbSgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKLQkJcmV0dXJuIGlucHV0LmdldFNvdXJjZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEN1cnJlbnRJbnB1dFN5bWJvbChJbnRTdHJlYW0gaW5wdXQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVTdHJlYW0paW5wdXQpLkxUKDEpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0TWlzc2luZ1N5bWJvbChJbnRTdHJlYW0gaW5wdXQsCi0JCQkJCQkJCQkgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsCi0JCQkJCQkJCQkgIGludCBleHBlY3RlZFRva2VuVHlwZSwKLQkJCQkJCQkJCSAgQml0U2V0IGZvbGxvdykKLQl7Ci0JCVN0cmluZyB0b2tlblRleHQgPQotCQkJIjxtaXNzaW5nICIrZ2V0VG9rZW5OYW1lcygpW2V4cGVjdGVkVG9rZW5UeXBlXSsiPiI7Ci0gICAgICAgIFRyZWVBZGFwdG9yIGFkYXB0b3IgPSAoKFRyZWVOb2RlU3RyZWFtKWUuaW5wdXQpLmdldFRyZWVBZGFwdG9yKCk7Ci0gICAgICAgIHJldHVybiBhZGFwdG9yLmNyZWF0ZShuZXcgQ29tbW9uVG9rZW4oZXhwZWN0ZWRUb2tlblR5cGUsIHRva2VuVGV4dCkpOwotCX0KLQotICAgIC8qKiBNYXRjaCAnLicgaW4gdHJlZSBwYXJzZXIgaGFzIHNwZWNpYWwgbWVhbmluZy4gIFNraXAgbm9kZSBvcgotCSAqICBlbnRpcmUgdHJlZSBpZiBub2RlIGhhcyBjaGlsZHJlbi4gIElmIGNoaWxkcmVuLCBzY2FuIHVudGlsCi0JICogIGNvcnJlc3BvbmRpbmcgVVAgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXRjaEFueShJbnRTdHJlYW0gaWdub3JlKSB7IC8vIGlnbm9yZSBzdHJlYW0sIGNvcHkgb2YgaW5wdXQKLQkJc3RhdGUuZXJyb3JSZWNvdmVyeSA9IGZhbHNlOwotCQlzdGF0ZS5mYWlsZWQgPSBmYWxzZTsKLQkJT2JqZWN0IGxvb2sgPSBpbnB1dC5MVCgxKTsKLQkJaWYgKCBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldENoaWxkQ291bnQobG9vayk9PTAgKSB7Ci0JCQlpbnB1dC5jb25zdW1lKCk7IC8vIG5vdCBzdWJ0cmVlLCBjb25zdW1lIDEgbm9kZSBhbmQgcmV0dXJuCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gY3VycmVudCBub2RlIGlzIGEgc3VidHJlZSwgc2tpcCB0byBjb3JyZXNwb25kaW5nIFVQLgotCQkvLyBtdXN0IGNvdW50IG5lc3RpbmcgbGV2ZWwgdG8gZ2V0IHJpZ2h0IFVQCi0JCWludCBsZXZlbD0wOwotCQlpbnQgdG9rZW5UeXBlID0gaW5wdXQuZ2V0VHJlZUFkYXB0b3IoKS5nZXRUeXBlKGxvb2spOwotCQl3aGlsZSAoIHRva2VuVHlwZSE9VG9rZW4uRU9GICYmICEodG9rZW5UeXBlPT1VUCAmJiBsZXZlbD09MCkgKSB7Ci0JCQlpbnB1dC5jb25zdW1lKCk7Ci0JCQlsb29rID0gaW5wdXQuTFQoMSk7Ci0JCQl0b2tlblR5cGUgPSBpbnB1dC5nZXRUcmVlQWRhcHRvcigpLmdldFR5cGUobG9vayk7Ci0JCQlpZiAoIHRva2VuVHlwZSA9PSBET1dOICkgewotCQkJCWxldmVsKys7Ci0JCQl9Ci0JCQllbHNlIGlmICggdG9rZW5UeXBlID09IFVQICkgewotCQkJCWxldmVsLS07Ci0JCQl9Ci0JCX0KLQkJaW5wdXQuY29uc3VtZSgpOyAvLyBjb25zdW1lIFVQCi0JfQotCi0gICAgLyoqIFdlIGhhdmUgRE9XTi9VUCBub2RlcyBpbiB0aGUgc3RyZWFtIHRoYXQgaGF2ZSBubyBsaW5lIGluZm87IG92ZXJyaWRlLgotCSAqICBwbHVzIHdlIHdhbnQgdG8gYWx0ZXIgdGhlIGV4Y2VwdGlvbiB0eXBlLiAgRG9uJ3QgdHJ5IHRvIHJlY292ZXIKLQkgKiAgZnJvbSB0cmVlIHBhcnNlciBlcnJvcnMgaW5saW5lLi4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCByZWNvdmVyRnJvbU1pc21hdGNoZWRUb2tlbihJbnRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRTZXQgZm9sbG93KQotICAgICAgICB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBNaXNtYXRjaGVkVHJlZU5vZGVFeGNlcHRpb24odHR5cGUsIChUcmVlTm9kZVN0cmVhbSlpbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqIFByZWZpeCBlcnJvciBtZXNzYWdlIHdpdGggdGhlIGdyYW1tYXIgbmFtZSBiZWNhdXNlIG1lc3NhZ2UgaXMKLQkgKiAgYWx3YXlzIGludGVuZGVkIGZvciB0aGUgcHJvZ3JhbW1lciBiZWNhdXNlIHRoZSBwYXJzZXIgYnVpbHQKLQkgKiAgdGhlIGlucHV0IHRyZWUgbm90IHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JIZWFkZXIoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgewotCQlyZXR1cm4gZ2V0R3JhbW1hckZpbGVOYW1lKCkrIjogbm9kZSBmcm9tICIrCi0JCQkgICAoZS5hcHByb3hpbWF0ZUxpbmVJbmZvPyJhZnRlciAiOiIiKSsibGluZSAiK2UubGluZSsiOiIrZS5jaGFyUG9zaXRpb25JbkxpbmU7Ci0JfQotCi0JLyoqIFRyZWUgcGFyc2VycyBwYXJzZSBub2RlcyB0aGV5IHVzdWFsbHkgaGF2ZSBhIHRva2VuIG9iamVjdCBhcwotCSAqICBwYXlsb2FkLiBTZXQgdGhlIGV4Y2VwdGlvbiB0b2tlbiBhbmQgZG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoUmVjb2duaXRpb25FeGNlcHRpb24gZSwgU3RyaW5nW10gdG9rZW5OYW1lcykgewotCQlpZiAoIHRoaXMgaW5zdGFuY2VvZiBUcmVlUGFyc2VyICkgewotCQkJVHJlZUFkYXB0b3IgYWRhcHRvciA9ICgoVHJlZU5vZGVTdHJlYW0pZS5pbnB1dCkuZ2V0VHJlZUFkYXB0b3IoKTsKLQkJCWUudG9rZW4gPSBhZGFwdG9yLmdldFRva2VuKGUubm9kZSk7Ci0JCQlpZiAoIGUudG9rZW49PW51bGwgKSB7IC8vIGNvdWxkIGJlIGFuIFVQL0RPV04gbm9kZQotCQkJCWUudG9rZW4gPSBuZXcgQ29tbW9uVG9rZW4oYWRhcHRvci5nZXRUeXBlKGUubm9kZSksCi0JCQkJCQkJCQkJICBhZGFwdG9yLmdldFRleHQoZS5ub2RlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZShlLCB0b2tlbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmFjZUluKFN0cmluZyBydWxlTmFtZSwgaW50IHJ1bGVJbmRleCkgIHsKLQkJc3VwZXIudHJhY2VJbihydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJhY2VPdXQoU3RyaW5nIHJ1bGVOYW1lLCBpbnQgcnVsZUluZGV4KSAgewotCQlzdXBlci50cmFjZU91dChydWxlTmFtZSwgcnVsZUluZGV4LCBpbnB1dC5MVCgxKSk7Ci0JfQotfQo=